ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXVzYiBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXVzYgppbmRleCA3NzcyOTI4Li5kZWI2YjQ4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJ1cy11c2IKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1idXMtdXNiCkBAIC0xNDQsMyArMTQ0LDE2IEBACiAKIAkJV3JpdGUgYSAxIHRvIGZvcmNlIHRoZSBkZXZpY2UgdG8gZGlzY29ubmVjdAogCQkoZXF1aXZhbGVudCB0byB1bnBsdWdnaW5nIGEgd2lyZWQgVVNCIGRldmljZSkuCisKK1doYXQ6CQkvc3lzL2J1cy91c2IvZHJpdmVycy8uLi4vcmVtb3ZlX2lkCitEYXRlOgkJTm92ZW1iZXIgMjAwOQorQ29udGFjdDoJQ0hFTkcgUmVucXVhbiA8cnFjaGVuZ0BzbXUuZWR1LnNnPgorRGVzY3JpcHRpb246CisJCVdyaXRpbmcgYSBkZXZpY2UgSUQgdG8gdGhpcyBmaWxlIHdpbGwgcmVtb3ZlIGFuIElECisJCXRoYXQgd2FzIGR5bmFtaWNhbGx5IGFkZGVkIHZpYSB0aGUgbmV3X2lkIHN5c2ZzIGVudHJ5LgorCQlUaGUgZm9ybWF0IGZvciB0aGUgZGV2aWNlIElEIGlzOgorCQlpZFZlbmRvciBpZFByb2R1Y3QuCUFmdGVyIHN1Y2Nlc3NmdWxseQorCQlyZW1vdmluZyBhbiBJRCwgdGhlIGRyaXZlciB3aWxsIG5vIGxvbmdlciBzdXBwb3J0IHRoZQorCQlkZXZpY2UuICBUaGlzIGlzIHVzZWZ1bCB0byBlbnN1cmUgYXV0byBwcm9iaW5nIHdvbid0CisJCW1hdGNoIHRoZSBkcml2ZXIgdG8gdGhlIGRldmljZS4gIEZvciBleGFtcGxlOgorCQkjIGVjaG8gIjA0NmQgYzMxNSIgPiAvc3lzL2J1cy91c2IvZHJpdmVycy9mb28vcmVtb3ZlX2lkCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLXV3Yl9yYy13dXNiaGMgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLXV3Yl9yYy13dXNiaGMKaW5kZXggNGU4MTA2Zi4uMjViMWU3NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy11d2JfcmMtd3VzYmhjCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtdXdiX3JjLXd1c2JoYwpAQCAtMjMsMyArMjMsMTYgQEAKICAgICAgICAgICAgICAgICBTaW5jZSB0aGlzIHJlbGF0ZXMgdG8gc2VjdXJpdHkgKHNwZWNpZmljYWxseSwgdGhlCiAgICAgICAgICAgICAgICAgbGlmZXRpbWUgb2YgUFRLcyBhbmQgR1RLcykgaXQgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkCiAgICAgICAgICAgICAgICAgZnJvbSB0aGUgZGVmYXVsdC4KKworV2hhdDogICAgICAgICAgIC9zeXMvY2xhc3MvdXdiX3JjL3V3Yk4vd3VzYmhjL3d1c2JfcGh5X3JhdGUKK0RhdGU6ICAgICAgICAgICBBdWd1c3QgMjAwOQorS2VybmVsVmVyc2lvbjogIDIuNi4zMgorQ29udGFjdDogICAgICAgIERhdmlkIFZyYWJlbCA8ZGF2aWQudnJhYmVsQGNzci5jb20+CitEZXNjcmlwdGlvbjoKKyAgICAgICAgICAgICAgICBUaGUgbWF4aW11bSBQSFkgcmF0ZSB0byB1c2UgZm9yIGFsbCBjb25uZWN0ZWQgZGV2aWNlcy4KKyAgICAgICAgICAgICAgICBUaGlzIGlzIG9ubHkgb2YgbGltaXRlZCB1c2UgZm9yIHRlc3RpbmcgYW5kCisgICAgICAgICAgICAgICAgZGV2ZWxvcG1lbnQgYXMgdGhlIGhhcmR3YXJlJ3MgYXV0b21hdGljIHJhdGUKKyAgICAgICAgICAgICAgICBhZGFwdGF0aW9uIGlzIGJldHRlciB0aGVuIHRoaXMgc2ltcGxlIGNvbnRyb2wuCisKKyAgICAgICAgICAgICAgICBSZWZlciB0byBbRUNNQS0zNjhdIHNlY3Rpb24gMTAuMy4xLjEgZm9yIHRoZSB2YWx1ZSB0bworICAgICAgICAgICAgICAgIHVzZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZGV2aWNlcy1zeXN0ZW0tY3B1IGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLXN5c3RlbS1jcHUKaW5kZXggYTcwM2I5ZS4uMmFhZTA2ZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLXN5c3RlbS1jcHUKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLXN5c3RlbS1jcHUKQEAgLTYyLDYgKzYyLDIxIEBACiAJCVNlZSBEb2N1bWVudGF0aW9uL2NwdXRvcG9sb2d5LnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KIAogCitXaGF0OgkJL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvcHJvYmUKKwkJL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvcmVsZWFzZQorRGF0ZToJCU5vdmVtYmVyIDIwMDkKK0NvbnRhY3Q6CUxpbnV4IGtlcm5lbCBtYWlsaW5nIGxpc3QgPGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmc+CitEZXNjcmlwdGlvbjoJRHluYW1pYyBhZGRpdGlvbiBhbmQgcmVtb3ZhbCBvZiBDUFUncy4gIFRoaXMgaXMgbm90IGhvdHBsdWcKKwkJcmVtb3ZhbCwgdGhpcyBpcyBtZWFudCBjb21wbGV0ZSByZW1vdmFsL2FkZGl0aW9uIG9mIHRoZSBDUFUKKwkJZnJvbSB0aGUgc3lzdGVtLgorCisJCXByb2JlOiB3cml0ZXMgdG8gdGhpcyBmaWxlIHdpbGwgZHluYW1pY2FsbHkgYWRkIGEgQ1BVIHRvIHRoZQorCQlzeXN0ZW0uICBJbmZvcm1hdGlvbiB3cml0dGVuIHRvIHRoZSBmaWxlIHRvIGFkZCBDUFUncyBpcworCQlhcmNoaXRlY3R1cmUgc3BlY2lmaWMuCisKKwkJcmVsZWFzZTogd3JpdGVzIHRvIHRoaXMgZmlsZSBkeW5hbWljYWxseSByZW1vdmUgYSBDUFUgZnJvbQorCQl0aGUgc3lzdGVtLiAgSW5mb3JtYXRpb24gd3JpdHRlbnRvIHRoZSBmaWxlIHRvIHJlbW92ZSBDUFUncworCQlpcyBhcmNoaXRlY3R1cmUgc3BlY2lmaWMuCiAKIFdoYXQ6CQkvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUjL25vZGUKIERhdGU6CQlPY3RvYmVyIDIwMDkKQEAgLTEzNiw2ICsxNTEsMjQgQEAKIAkJU2VlIGZpbGVzIGluIERvY3VtZW50YXRpb24vY3B1aWRsZS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAKIAorV2hhdDoJCS9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdSMvY3B1ZnJlcS8qCitEYXRlOgkJcHJlLWdpdCBoaXN0b3J5CitDb250YWN0OgljcHVmcmVxQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CURpc2NvdmVyIGFuZCBjaGFuZ2UgY2xvY2sgc3BlZWQgb2YgQ1BVcworCisJCUNsb2NrIHNjYWxpbmcgYWxsb3dzIHlvdSB0byBjaGFuZ2UgdGhlIGNsb2NrIHNwZWVkIG9mIHRoZQorCQlDUFVzIG9uIHRoZSBmbHkuIFRoaXMgaXMgYSBuaWNlIG1ldGhvZCB0byBzYXZlIGJhdHRlcnkKKwkJcG93ZXIsIGJlY2F1c2UgdGhlIGxvd2VyIHRoZSBjbG9jayBzcGVlZCwgdGhlIGxlc3MgcG93ZXIKKwkJdGhlIENQVSBjb25zdW1lcy4KKworCQlUaGVyZSBhcmUgbWFueSBrbm9icyB0byB0d2VhayBpbiB0aGlzIGRpcmVjdG9yeS4KKworCQlTZWUgZmlsZXMgaW4gRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKwkJSW4gcGFydGljdWxhciwgcmVhZCBEb2N1bWVudGF0aW9uL2NwdS1mcmVxL3VzZXItZ3VpZGUudHh0CisJCXRvIGxlYXJuIGhvdyB0byBjb250cm9sIHRoZSBrbm9icy4KKworCiBXaGF0OiAgICAgIC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdSovY2FjaGUvaW5kZXgqL2NhY2hlX2Rpc2FibGVfWAogRGF0ZTogICAgICBBdWd1c3QgMjAwOAogS2VybmVsVmVyc2lvbjoJMi42LjI3CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWtlcm5lbC1zbGFiIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1rZXJuZWwtc2xhYgppbmRleCA2ZGNmNzVlLi44YjA5M2Y4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWtlcm5lbC1zbGFiCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMta2VybmVsLXNsYWIKQEAgLTQ1LDggKzQ1LDkgQEAKIENvbnRhY3Q6CVBla2thIEVuYmVyZyA8cGVuYmVyZ0Bjcy5oZWxzaW5raS5maT4sCiAJCUNocmlzdG9waCBMYW1ldGVyIDxjbEBsaW51eC1mb3VuZGF0aW9uLm9yZz4KIERlc2NyaXB0aW9uOgotCQlUaGUgYWxsb2NfZmFzdHBhdGggZmlsZSBpcyByZWFkLW9ubHkgYW5kIHNwZWNpZmllcyBob3cgbWFueQotCQlvYmplY3RzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgdXNpbmcgdGhlIGZhc3QgcGF0aC4KKwkJVGhlIGFsbG9jX2Zhc3RwYXRoIGZpbGUgc2hvd3MgaG93IG1hbnkgb2JqZWN0cyBoYXZlIGJlZW4KKwkJYWxsb2NhdGVkIHVzaW5nIHRoZSBmYXN0IHBhdGguICBJdCBjYW4gYmUgd3JpdHRlbiB0byBjbGVhciB0aGUKKwkJY3VycmVudCBjb3VudC4KIAkJQXZhaWxhYmxlIHdoZW4gQ09ORklHX1NMVUJfU1RBVFMgaXMgZW5hYmxlZC4KIAogV2hhdDoJCS9zeXMva2VybmVsL3NsYWIvY2FjaGUvYWxsb2NfZnJvbV9wYXJ0aWFsCkBAIC01NSw5ICs1NiwxMCBAQAogQ29udGFjdDoJUGVra2EgRW5iZXJnIDxwZW5iZXJnQGNzLmhlbHNpbmtpLmZpPiwKIAkJQ2hyaXN0b3BoIExhbWV0ZXIgPGNsQGxpbnV4LWZvdW5kYXRpb24ub3JnPgogRGVzY3JpcHRpb246Ci0JCVRoZSBhbGxvY19mcm9tX3BhcnRpYWwgZmlsZSBpcyByZWFkLW9ubHkgYW5kIHNwZWNpZmllcyBob3cKLQkJbWFueSB0aW1lcyBhIGNwdSBzbGFiIGhhcyBiZWVuIGZ1bGwgYW5kIGl0IGhhcyBiZWVuIHJlZmlsbGVkCi0JCWJ5IHVzaW5nIGEgc2xhYiBmcm9tIHRoZSBsaXN0IG9mIHBhcnRpYWxseSB1c2VkIHNsYWJzLgorCQlUaGUgYWxsb2NfZnJvbV9wYXJ0aWFsIGZpbGUgc2hvd3MgaG93IG1hbnkgdGltZXMgYSBjcHUgc2xhYiBoYXMKKwkJYmVlbiBmdWxsIGFuZCBpdCBoYXMgYmVlbiByZWZpbGxlZCBieSB1c2luZyBhIHNsYWIgZnJvbSB0aGUgbGlzdAorCQlvZiBwYXJ0aWFsbHkgdXNlZCBzbGFicy4gIEl0IGNhbiBiZSB3cml0dGVuIHRvIGNsZWFyIHRoZSBjdXJyZW50CisJCWNvdW50LgogCQlBdmFpbGFibGUgd2hlbiBDT05GSUdfU0xVQl9TVEFUUyBpcyBlbmFibGVkLgogCiBXaGF0OgkJL3N5cy9rZXJuZWwvc2xhYi9jYWNoZS9hbGxvY19yZWZpbGwKQEAgLTY2LDkgKzY4LDkgQEAKIENvbnRhY3Q6CVBla2thIEVuYmVyZyA8cGVuYmVyZ0Bjcy5oZWxzaW5raS5maT4sCiAJCUNocmlzdG9waCBMYW1ldGVyIDxjbEBsaW51eC1mb3VuZGF0aW9uLm9yZz4KIERlc2NyaXB0aW9uOgotCQlUaGUgYWxsb2NfcmVmaWxsIGZpbGUgaXMgcmVhZC1vbmx5IGFuZCBzcGVjaWZpZXMgaG93IG1hbnkKLQkJdGltZXMgdGhlIHBlci1jcHUgZnJlZWxpc3Qgd2FzIGVtcHR5IGJ1dCB0aGVyZSB3ZXJlIG9iamVjdHMKLQkJYXZhaWxhYmxlIGFzIHRoZSByZXN1bHQgb2YgcmVtb3RlIGNwdSBmcmVlcy4KKwkJVGhlIGFsbG9jX3JlZmlsbCBmaWxlIHNob3dzIGhvdyBtYW55IHRpbWVzIHRoZSBwZXItY3B1IGZyZWVsaXN0CisJCXdhcyBlbXB0eSBidXQgdGhlcmUgd2VyZSBvYmplY3RzIGF2YWlsYWJsZSBhcyB0aGUgcmVzdWx0IG9mCisJCXJlbW90ZSBjcHUgZnJlZXMuICBJdCBjYW4gYmUgd3JpdHRlbiB0byBjbGVhciB0aGUgY3VycmVudCBjb3VudC4KIAkJQXZhaWxhYmxlIHdoZW4gQ09ORklHX1NMVUJfU1RBVFMgaXMgZW5hYmxlZC4KIAogV2hhdDoJCS9zeXMva2VybmVsL3NsYWIvY2FjaGUvYWxsb2Nfc2xhYgpAQCAtNzcsOCArNzksOSBAQAogQ29udGFjdDoJUGVra2EgRW5iZXJnIDxwZW5iZXJnQGNzLmhlbHNpbmtpLmZpPiwKIAkJQ2hyaXN0b3BoIExhbWV0ZXIgPGNsQGxpbnV4LWZvdW5kYXRpb24ub3JnPgogRGVzY3JpcHRpb246Ci0JCVRoZSBhbGxvY19zbGFiIGZpbGUgaXMgcmVhZC1vbmx5IGFuZCBzcGVjaWZpZXMgaG93IG1hbnkgdGltZXMKLQkJYSBuZXcgc2xhYiBoYWQgdG8gYmUgYWxsb2NhdGVkIGZyb20gdGhlIHBhZ2UgYWxsb2NhdG9yLgorCQlUaGUgYWxsb2Nfc2xhYiBmaWxlIGlzIHNob3dzIGhvdyBtYW55IHRpbWVzIGEgbmV3IHNsYWIgaGFkIHRvCisJCWJlIGFsbG9jYXRlZCBmcm9tIHRoZSBwYWdlIGFsbG9jYXRvci4gIEl0IGNhbiBiZSB3cml0dGVuIHRvCisJCWNsZWFyIHRoZSBjdXJyZW50IGNvdW50LgogCQlBdmFpbGFibGUgd2hlbiBDT05GSUdfU0xVQl9TVEFUUyBpcyBlbmFibGVkLgogCiBXaGF0OgkJL3N5cy9rZXJuZWwvc2xhYi9jYWNoZS9hbGxvY19zbG93cGF0aApAQCAtODcsOSArOTAsMTAgQEAKIENvbnRhY3Q6CVBla2thIEVuYmVyZyA8cGVuYmVyZ0Bjcy5oZWxzaW5raS5maT4sCiAJCUNocmlzdG9waCBMYW1ldGVyIDxjbEBsaW51eC1mb3VuZGF0aW9uLm9yZz4KIERlc2NyaXB0aW9uOgotCQlUaGUgYWxsb2Nfc2xvd3BhdGggZmlsZSBpcyByZWFkLW9ubHkgYW5kIHNwZWNpZmllcyBob3cgbWFueQotCQlvYmplY3RzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgdXNpbmcgdGhlIHNsb3cgcGF0aCBiZWNhdXNlIG9mIGEKLQkJcmVmaWxsIG9yIGFsbG9jYXRpb24gZnJvbSBhIHBhcnRpYWwgb3IgbmV3IHNsYWIuCisJCVRoZSBhbGxvY19zbG93cGF0aCBmaWxlIHNob3dzIGhvdyBtYW55IG9iamVjdHMgaGF2ZSBiZWVuCisJCWFsbG9jYXRlZCB1c2luZyB0aGUgc2xvdyBwYXRoIGJlY2F1c2Ugb2YgYSByZWZpbGwgb3IKKwkJYWxsb2NhdGlvbiBmcm9tIGEgcGFydGlhbCBvciBuZXcgc2xhYi4gIEl0IGNhbiBiZSB3cml0dGVuIHRvCisJCWNsZWFyIHRoZSBjdXJyZW50IGNvdW50LgogCQlBdmFpbGFibGUgd2hlbiBDT05GSUdfU0xVQl9TVEFUUyBpcyBlbmFibGVkLgogCiBXaGF0OgkJL3N5cy9rZXJuZWwvc2xhYi9jYWNoZS9jYWNoZV9kbWEKQEAgLTExNywxMCArMTIxLDExIEBACiBDb250YWN0OglQZWtrYSBFbmJlcmcgPHBlbmJlcmdAY3MuaGVsc2lua2kuZmk+LAogCQlDaHJpc3RvcGggTGFtZXRlciA8Y2xAbGludXgtZm91bmRhdGlvbi5vcmc+CiBEZXNjcmlwdGlvbjoKLQkJVGhlIGZpbGUgY3B1c2xhYl9mbHVzaCBpcyByZWFkLW9ubHkgYW5kIHNwZWNpZmllcyBob3cgbWFueQotCQl0aW1lcyBhIGNhY2hlJ3MgY3B1IHNsYWJzIGhhdmUgYmVlbiBmbHVzaGVkIGFzIHRoZSByZXN1bHQgb2YKLQkJZGVzdHJveWluZyBvciBzaHJpbmtpbmcgYSBjYWNoZSwgYSBjcHUgZ29pbmcgb2ZmbGluZSwgb3IgYXMKLQkJdGhlIHJlc3VsdCBvZiBmb3JjaW5nIGFuIGFsbG9jYXRpb24gZnJvbSBhIGNlcnRhaW4gbm9kZS4KKwkJVGhlIGZpbGUgY3B1c2xhYl9mbHVzaCBzaG93cyBob3cgbWFueSB0aW1lcyBhIGNhY2hlJ3MgY3B1IHNsYWJzCisJCWhhdmUgYmVlbiBmbHVzaGVkIGFzIHRoZSByZXN1bHQgb2YgZGVzdHJveWluZyBvciBzaHJpbmtpbmcgYQorCQljYWNoZSwgYSBjcHUgZ29pbmcgb2ZmbGluZSwgb3IgYXMgdGhlIHJlc3VsdCBvZiBmb3JjaW5nIGFuCisJCWFsbG9jYXRpb24gZnJvbSBhIGNlcnRhaW4gbm9kZS4gIEl0IGNhbiBiZSB3cml0dGVuIHRvIGNsZWFyIHRoZQorCQljdXJyZW50IGNvdW50LgogCQlBdmFpbGFibGUgd2hlbiBDT05GSUdfU0xVQl9TVEFUUyBpcyBlbmFibGVkLgogCiBXaGF0OgkJL3N5cy9rZXJuZWwvc2xhYi9jYWNoZS9jdG9yCkBAIC0xMzksOCArMTQ0LDggQEAKIENvbnRhY3Q6CVBla2thIEVuYmVyZyA8cGVuYmVyZ0Bjcy5oZWxzaW5raS5maT4sCiAJCUNocmlzdG9waCBMYW1ldGVyIDxjbEBsaW51eC1mb3VuZGF0aW9uLm9yZz4KIERlc2NyaXB0aW9uOgotCQlUaGUgZmlsZSBkZWFjdGl2YXRlX2VtcHR5IGlzIHJlYWQtb25seSBhbmQgc3BlY2lmaWVzIGhvdyBtYW55Ci0JCXRpbWVzIGFuIGVtcHR5IGNwdSBzbGFiIHdhcyBkZWFjdGl2YXRlZC4KKwkJVGhlIGRlYWN0aXZhdGVfZW1wdHkgZmlsZSBzaG93cyBob3cgbWFueSB0aW1lcyBhbiBlbXB0eSBjcHUgc2xhYgorCQl3YXMgZGVhY3RpdmF0ZWQuICBJdCBjYW4gYmUgd3JpdHRlbiB0byBjbGVhciB0aGUgY3VycmVudCBjb3VudC4KIAkJQXZhaWxhYmxlIHdoZW4gQ09ORklHX1NMVUJfU1RBVFMgaXMgZW5hYmxlZC4KIAogV2hhdDoJCS9zeXMva2VybmVsL3NsYWIvY2FjaGUvZGVhY3RpdmF0ZV9mdWxsCkBAIC0xNDksOCArMTU0LDggQEAKIENvbnRhY3Q6CVBla2thIEVuYmVyZyA8cGVuYmVyZ0Bjcy5oZWxzaW5raS5maT4sCiAJCUNocmlzdG9waCBMYW1ldGVyIDxjbEBsaW51eC1mb3VuZGF0aW9uLm9yZz4KIERlc2NyaXB0aW9uOgotCQlUaGUgZmlsZSBkZWFjdGl2YXRlX2Z1bGwgaXMgcmVhZC1vbmx5IGFuZCBzcGVjaWZpZXMgaG93IG1hbnkKLQkJdGltZXMgYSBmdWxsIGNwdSBzbGFiIHdhcyBkZWFjdGl2YXRlZC4KKwkJVGhlIGRlYWN0aXZhdGVfZnVsbCBmaWxlIHNob3dzIGhvdyBtYW55IHRpbWVzIGEgZnVsbCBjcHUgc2xhYgorCQl3YXMgZGVhY3RpdmF0ZWQuICBJdCBjYW4gYmUgd3JpdHRlbiB0byBjbGVhciB0aGUgY3VycmVudCBjb3VudC4KIAkJQXZhaWxhYmxlIHdoZW4gQ09ORklHX1NMVUJfU1RBVFMgaXMgZW5hYmxlZC4KIAogV2hhdDoJCS9zeXMva2VybmVsL3NsYWIvY2FjaGUvZGVhY3RpdmF0ZV9yZW1vdGVfZnJlZXMKQEAgLTE1OSw5ICsxNjQsOSBAQAogQ29udGFjdDoJUGVra2EgRW5iZXJnIDxwZW5iZXJnQGNzLmhlbHNpbmtpLmZpPiwKIAkJQ2hyaXN0b3BoIExhbWV0ZXIgPGNsQGxpbnV4LWZvdW5kYXRpb24ub3JnPgogRGVzY3JpcHRpb246Ci0JCVRoZSBmaWxlIGRlYWN0aXZhdGVfcmVtb3RlX2ZyZWVzIGlzIHJlYWQtb25seSBhbmQgc3BlY2lmaWVzIGhvdwotCQltYW55IHRpbWVzIGEgY3B1IHNsYWIgaGFzIGJlZW4gZGVhY3RpdmF0ZWQgYW5kIGNvbnRhaW5lZCBmcmVlCi0JCW9iamVjdHMgdGhhdCB3ZXJlIGZyZWVkIHJlbW90ZWx5LgorCQlUaGUgZGVhY3RpdmF0ZV9yZW1vdGVfZnJlZXMgZmlsZSBzaG93cyBob3cgbWFueSB0aW1lcyBhIGNwdSBzbGFiCisJCWhhcyBiZWVuIGRlYWN0aXZhdGVkIGFuZCBjb250YWluZWQgZnJlZSBvYmplY3RzIHRoYXQgd2VyZSBmcmVlZAorCQlyZW1vdGVseS4gIEl0IGNhbiBiZSB3cml0dGVuIHRvIGNsZWFyIHRoZSBjdXJyZW50IGNvdW50LgogCQlBdmFpbGFibGUgd2hlbiBDT05GSUdfU0xVQl9TVEFUUyBpcyBlbmFibGVkLgogCiBXaGF0OgkJL3N5cy9rZXJuZWwvc2xhYi9jYWNoZS9kZWFjdGl2YXRlX3RvX2hlYWQKQEAgLTE3MCw5ICsxNzUsOSBAQAogQ29udGFjdDoJUGVra2EgRW5iZXJnIDxwZW5iZXJnQGNzLmhlbHNpbmtpLmZpPiwKIAkJQ2hyaXN0b3BoIExhbWV0ZXIgPGNsQGxpbnV4LWZvdW5kYXRpb24ub3JnPgogRGVzY3JpcHRpb246Ci0JCVRoZSBmaWxlIGRlYWN0aXZhdGVfdG9faGVhZCBpcyByZWFkLW9ubHkgYW5kIHNwZWNpZmllcyBob3cKLQkJbWFueSB0aW1lcyBhIHBhcnRpYWwgY3B1IHNsYWIgd2FzIGRlYWN0aXZhdGVkIGFuZCBhZGRlZCB0byB0aGUKLQkJaGVhZCBvZiBpdHMgbm9kZSdzIHBhcnRpYWwgbGlzdC4KKwkJVGhlIGRlYWN0aXZhdGVfdG9faGVhZCBmaWxlIHNob3dzIGhvdyBtYW55IHRpbWVzIGEgcGFydGlhbCBjcHUKKwkJc2xhYiB3YXMgZGVhY3RpdmF0ZWQgYW5kIGFkZGVkIHRvIHRoZSBoZWFkIG9mIGl0cyBub2RlJ3MgcGFydGlhbAorCQlsaXN0LiAgSXQgY2FuIGJlIHdyaXR0ZW4gdG8gY2xlYXIgdGhlIGN1cnJlbnQgY291bnQuCiAJCUF2YWlsYWJsZSB3aGVuIENPTkZJR19TTFVCX1NUQVRTIGlzIGVuYWJsZWQuCiAKIFdoYXQ6CQkvc3lzL2tlcm5lbC9zbGFiL2NhY2hlL2RlYWN0aXZhdGVfdG9fdGFpbApAQCAtMTgxLDkgKzE4Niw5IEBACiBDb250YWN0OglQZWtrYSBFbmJlcmcgPHBlbmJlcmdAY3MuaGVsc2lua2kuZmk+LAogCQlDaHJpc3RvcGggTGFtZXRlciA8Y2xAbGludXgtZm91bmRhdGlvbi5vcmc+CiBEZXNjcmlwdGlvbjoKLQkJVGhlIGZpbGUgZGVhY3RpdmF0ZV90b190YWlsIGlzIHJlYWQtb25seSBhbmQgc3BlY2lmaWVzIGhvdwotCQltYW55IHRpbWVzIGEgcGFydGlhbCBjcHUgc2xhYiB3YXMgZGVhY3RpdmF0ZWQgYW5kIGFkZGVkIHRvIHRoZQotCQl0YWlsIG9mIGl0cyBub2RlJ3MgcGFydGlhbCBsaXN0LgorCQlUaGUgZGVhY3RpdmF0ZV90b190YWlsIGZpbGUgc2hvd3MgaG93IG1hbnkgdGltZXMgYSBwYXJ0aWFsIGNwdQorCQlzbGFiIHdhcyBkZWFjdGl2YXRlZCBhbmQgYWRkZWQgdG8gdGhlIHRhaWwgb2YgaXRzIG5vZGUncyBwYXJ0aWFsCisJCWxpc3QuICBJdCBjYW4gYmUgd3JpdHRlbiB0byBjbGVhciB0aGUgY3VycmVudCBjb3VudC4KIAkJQXZhaWxhYmxlIHdoZW4gQ09ORklHX1NMVUJfU1RBVFMgaXMgZW5hYmxlZC4KIAogV2hhdDoJCS9zeXMva2VybmVsL3NsYWIvY2FjaGUvZGVzdHJveV9ieV9yY3UKQEAgLTIwMSw5ICsyMDYsOSBAQAogQ29udGFjdDoJUGVra2EgRW5iZXJnIDxwZW5iZXJnQGNzLmhlbHNpbmtpLmZpPiwKIAkJQ2hyaXN0b3BoIExhbWV0ZXIgPGNsQGxpbnV4LWZvdW5kYXRpb24ub3JnPgogRGVzY3JpcHRpb246Ci0JCVRoZSBmaWxlIGZyZWVfYWRkX3BhcnRpYWwgaXMgcmVhZC1vbmx5IGFuZCBzcGVjaWZpZXMgaG93IG1hbnkKLQkJdGltZXMgYW4gb2JqZWN0IGhhcyBiZWVuIGZyZWVkIGluIGEgZnVsbCBzbGFiIHNvIHRoYXQgaXQgaGFkIHRvCi0JCWFkZGVkIHRvIGl0cyBub2RlJ3MgcGFydGlhbCBsaXN0LgorCQlUaGUgZnJlZV9hZGRfcGFydGlhbCBmaWxlIHNob3dzIGhvdyBtYW55IHRpbWVzIGFuIG9iamVjdCBoYXMKKwkJYmVlbiBmcmVlZCBpbiBhIGZ1bGwgc2xhYiBzbyB0aGF0IGl0IGhhZCB0byBhZGRlZCB0byBpdHMgbm9kZSdzCisJCXBhcnRpYWwgbGlzdC4gIEl0IGNhbiBiZSB3cml0dGVuIHRvIGNsZWFyIHRoZSBjdXJyZW50IGNvdW50LgogCQlBdmFpbGFibGUgd2hlbiBDT05GSUdfU0xVQl9TVEFUUyBpcyBlbmFibGVkLgogCiBXaGF0OgkJL3N5cy9rZXJuZWwvc2xhYi9jYWNoZS9mcmVlX2NhbGxzCkBAIC0yMjIsOSArMjI3LDkgQEAKIENvbnRhY3Q6CVBla2thIEVuYmVyZyA8cGVuYmVyZ0Bjcy5oZWxzaW5raS5maT4sCiAJCUNocmlzdG9waCBMYW1ldGVyIDxjbEBsaW51eC1mb3VuZGF0aW9uLm9yZz4KIERlc2NyaXB0aW9uOgotCQlUaGUgZnJlZV9mYXN0cGF0aCBmaWxlIGlzIHJlYWQtb25seSBhbmQgc3BlY2lmaWVzIGhvdyBtYW55Ci0JCW9iamVjdHMgaGF2ZSBiZWVuIGZyZWVkIHVzaW5nIHRoZSBmYXN0IHBhdGggYmVjYXVzZSBpdCB3YXMgYW4KLQkJb2JqZWN0IGZyb20gdGhlIGNwdSBzbGFiLgorCQlUaGUgZnJlZV9mYXN0cGF0aCBmaWxlIHNob3dzIGhvdyBtYW55IG9iamVjdHMgaGF2ZSBiZWVuIGZyZWVkCisJCXVzaW5nIHRoZSBmYXN0IHBhdGggYmVjYXVzZSBpdCB3YXMgYW4gb2JqZWN0IGZyb20gdGhlIGNwdSBzbGFiLgorCQlJdCBjYW4gYmUgd3JpdHRlbiB0byBjbGVhciB0aGUgY3VycmVudCBjb3VudC4KIAkJQXZhaWxhYmxlIHdoZW4gQ09ORklHX1NMVUJfU1RBVFMgaXMgZW5hYmxlZC4KIAogV2hhdDoJCS9zeXMva2VybmVsL3NsYWIvY2FjaGUvZnJlZV9mcm96ZW4KQEAgLTIzMyw5ICsyMzgsOSBAQAogQ29udGFjdDoJUGVra2EgRW5iZXJnIDxwZW5iZXJnQGNzLmhlbHNpbmtpLmZpPiwKIAkJQ2hyaXN0b3BoIExhbWV0ZXIgPGNsQGxpbnV4LWZvdW5kYXRpb24ub3JnPgogRGVzY3JpcHRpb246Ci0JCVRoZSBmcmVlX2Zyb3plbiBmaWxlIGlzIHJlYWQtb25seSBhbmQgc3BlY2lmaWVzIGhvdyBtYW55Ci0JCW9iamVjdHMgaGF2ZSBiZWVuIGZyZWVkIHRvIGEgZnJvemVuIHNsYWIgKGkuZS4gYSByZW1vdGUgY3B1Ci0JCXNsYWIpLgorCQlUaGUgZnJlZV9mcm96ZW4gZmlsZSBzaG93cyBob3cgbWFueSBvYmplY3RzIGhhdmUgYmVlbiBmcmVlZCB0bworCQlhIGZyb3plbiBzbGFiIChpLmUuIGEgcmVtb3RlIGNwdSBzbGFiKS4gIEl0IGNhbiBiZSB3cml0dGVuIHRvCisJCWNsZWFyIHRoZSBjdXJyZW50IGNvdW50LgogCQlBdmFpbGFibGUgd2hlbiBDT05GSUdfU0xVQl9TVEFUUyBpcyBlbmFibGVkLgogCiBXaGF0OgkJL3N5cy9rZXJuZWwvc2xhYi9jYWNoZS9mcmVlX3JlbW92ZV9wYXJ0aWFsCkBAIC0yNDQsOSArMjQ5LDEwIEBACiBDb250YWN0OglQZWtrYSBFbmJlcmcgPHBlbmJlcmdAY3MuaGVsc2lua2kuZmk+LAogCQlDaHJpc3RvcGggTGFtZXRlciA8Y2xAbGludXgtZm91bmRhdGlvbi5vcmc+CiBEZXNjcmlwdGlvbjoKLQkJVGhlIGZpbGUgZnJlZV9yZW1vdmVfcGFydGlhbCBpcyByZWFkLW9ubHkgYW5kIHNwZWNpZmllcyBob3cKLQkJbWFueSB0aW1lcyBhbiBvYmplY3QgaGFzIGJlZW4gZnJlZWQgdG8gYSBub3ctZW1wdHkgc2xhYiBzbwotCQl0aGF0IGl0IGhhZCB0byBiZSByZW1vdmVkIGZyb20gaXRzIG5vZGUncyBwYXJ0aWFsIGxpc3QuCisJCVRoZSBmcmVlX3JlbW92ZV9wYXJ0aWFsIGZpbGUgc2hvd3MgaG93IG1hbnkgdGltZXMgYW4gb2JqZWN0IGhhcworCQliZWVuIGZyZWVkIHRvIGEgbm93LWVtcHR5IHNsYWIgc28gdGhhdCBpdCBoYWQgdG8gYmUgcmVtb3ZlZCBmcm9tCisJCWl0cyBub2RlJ3MgcGFydGlhbCBsaXN0LiAgSXQgY2FuIGJlIHdyaXR0ZW4gdG8gY2xlYXIgdGhlIGN1cnJlbnQKKwkJY291bnQuCiAJCUF2YWlsYWJsZSB3aGVuIENPTkZJR19TTFVCX1NUQVRTIGlzIGVuYWJsZWQuCiAKIFdoYXQ6CQkvc3lzL2tlcm5lbC9zbGFiL2NhY2hlL2ZyZWVfc2xhYgpAQCAtMjU1LDggKzI2MSw5IEBACiBDb250YWN0OglQZWtrYSBFbmJlcmcgPHBlbmJlcmdAY3MuaGVsc2lua2kuZmk+LAogCQlDaHJpc3RvcGggTGFtZXRlciA8Y2xAbGludXgtZm91bmRhdGlvbi5vcmc+CiBEZXNjcmlwdGlvbjoKLQkJVGhlIGZyZWVfc2xhYiBmaWxlIGlzIHJlYWQtb25seSBhbmQgc3BlY2lmaWVzIGhvdyBtYW55IHRpbWVzIGFuCi0JCWVtcHR5IHNsYWIgaGFzIGJlZW4gZnJlZWQgYmFjayB0byB0aGUgcGFnZSBhbGxvY2F0b3IuCisJCVRoZSBmcmVlX3NsYWIgZmlsZSBzaG93cyBob3cgbWFueSB0aW1lcyBhbiBlbXB0eSBzbGFiIGhhcyBiZWVuCisJCWZyZWVkIGJhY2sgdG8gdGhlIHBhZ2UgYWxsb2NhdG9yLiAgSXQgY2FuIGJlIHdyaXR0ZW4gdG8gY2xlYXIKKwkJdGhlIGN1cnJlbnQgY291bnQuCiAJCUF2YWlsYWJsZSB3aGVuIENPTkZJR19TTFVCX1NUQVRTIGlzIGVuYWJsZWQuCiAKIFdoYXQ6CQkvc3lzL2tlcm5lbC9zbGFiL2NhY2hlL2ZyZWVfc2xvd3BhdGgKQEAgLTI2NSw5ICsyNzIsOSBAQAogQ29udGFjdDoJUGVra2EgRW5iZXJnIDxwZW5iZXJnQGNzLmhlbHNpbmtpLmZpPiwKIAkJQ2hyaXN0b3BoIExhbWV0ZXIgPGNsQGxpbnV4LWZvdW5kYXRpb24ub3JnPgogRGVzY3JpcHRpb246Ci0JCVRoZSBmcmVlX3Nsb3dwYXRoIGZpbGUgaXMgcmVhZC1vbmx5IGFuZCBzcGVjaWZpZXMgaG93IG1hbnkKLQkJb2JqZWN0cyBoYXZlIGJlZW4gZnJlZWQgdXNpbmcgdGhlIHNsb3cgcGF0aCAoaS5lLiB0byBhIGZ1bGwgb3IKLQkJcGFydGlhbCBzbGFiKS4KKwkJVGhlIGZyZWVfc2xvd3BhdGggZmlsZSBzaG93cyBob3cgbWFueSBvYmplY3RzIGhhdmUgYmVlbiBmcmVlZAorCQl1c2luZyB0aGUgc2xvdyBwYXRoIChpLmUuIHRvIGEgZnVsbCBvciBwYXJ0aWFsIHNsYWIpLiAgSXQgY2FuCisJCWJlIHdyaXR0ZW4gdG8gY2xlYXIgdGhlIGN1cnJlbnQgY291bnQuCiAJCUF2YWlsYWJsZSB3aGVuIENPTkZJR19TTFVCX1NUQVRTIGlzIGVuYWJsZWQuCiAKIFdoYXQ6CQkvc3lzL2tlcm5lbC9zbGFiL2NhY2hlL2h3Y2FjaGVfYWxpZ24KQEAgLTM0NiwxMCArMzUzLDEwIEBACiBDb250YWN0OglQZWtrYSBFbmJlcmcgPHBlbmJlcmdAY3MuaGVsc2lua2kuZmk+LAogCQlDaHJpc3RvcGggTGFtZXRlciA8Y2xAbGludXgtZm91bmRhdGlvbi5vcmc+CiBEZXNjcmlwdGlvbjoKLQkJVGhlIGZpbGUgb3JkZXJfZmFsbGJhY2sgaXMgcmVhZC1vbmx5IGFuZCBzcGVjaWZpZXMgaG93IG1hbnkKLQkJdGltZXMgYW4gYWxsb2NhdGlvbiBvZiBhIG5ldyBzbGFiIGhhcyBub3QgYmVlbiBwb3NzaWJsZSBhdCB0aGUKLQkJY2FjaGUncyBvcmRlciBhbmQgaW5zdGVhZCBmYWxsZW4gYmFjayB0byBpdHMgbWluaW11bSBwb3NzaWJsZQotCQlvcmRlci4KKwkJVGhlIG9yZGVyX2ZhbGxiYWNrIGZpbGUgc2hvd3MgaG93IG1hbnkgdGltZXMgYW4gYWxsb2NhdGlvbiBvZiBhCisJCW5ldyBzbGFiIGhhcyBub3QgYmVlbiBwb3NzaWJsZSBhdCB0aGUgY2FjaGUncyBvcmRlciBhbmQgaW5zdGVhZAorCQlmYWxsZW4gYmFjayB0byBpdHMgbWluaW11bSBwb3NzaWJsZSBvcmRlci4gIEl0IGNhbiBiZSB3cml0dGVuIHRvCisJCWNsZWFyIHRoZSBjdXJyZW50IGNvdW50LgogCQlBdmFpbGFibGUgd2hlbiBDT05GSUdfU0xVQl9TVEFUUyBpcyBlbmFibGVkLgogCiBXaGF0OgkJL3N5cy9rZXJuZWwvc2xhYi9jYWNoZS9wYXJ0aWFsCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2NwdS1kcml2ZXJzLnR4dCBiL0RvY3VtZW50YXRpb24vY3B1LWZyZXEvY3B1LWRyaXZlcnMudHh0CmluZGV4IDc1YTU4ZDEuLjZjMzBlOTMwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2NwdS1kcml2ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2NwdS1kcml2ZXJzLnR4dApAQCAtOTIsOSArOTIsOSBAQAogCQkJCShpbiBrSHopIHdoaWNoIGlzIHN1cHBvcnRlZCBieSAKIAkJCQl0aGlzIENQVQogcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSAgIHRoZSB0aW1lIGl0IHRha2VzIG9uIHRoaXMgQ1BVIHRvCi0JCQkJc3dpdGNoIGJldHdlZW4gdHdvIGZyZXF1ZW5jaWVzIChpZgotCQkJCWFwcHJvcHJpYXRlLCBlbHNlIHNwZWNpZnkKLQkJCQlDUFVGUkVRX0VURVJOQUwpCisJCQkJc3dpdGNoIGJldHdlZW4gdHdvIGZyZXF1ZW5jaWVzIGluCisJCQkJbmFub3NlY29uZHMgKGlmIGFwcHJvcHJpYXRlLCBlbHNlCisJCQkJc3BlY2lmeSBDUFVGUkVRX0VURVJOQUwpCiAKIHBvbGljeS0+Y3VyCQkJVGhlIGN1cnJlbnQgb3BlcmF0aW5nIGZyZXF1ZW5jeSBvZgogCQkJCXRoaXMgQ1BVIChpZiBhcHByb3ByaWF0ZSkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY3B1LWZyZXEvdXNlci1ndWlkZS50eHQgYi9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL3VzZXItZ3VpZGUudHh0CmluZGV4IDJhNWI4NTAuLjA0ZjZiMzIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY3B1LWZyZXEvdXNlci1ndWlkZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS91c2VyLWd1aWRlLnR4dApAQCAtMjAzLDYgKzIwMywxNyBAQAogCQkJCXRoZSBmcmVxdWVuY3kgdGhlIGtlcm5lbCB0aGlua3MgdGhlIENQVSBydW5zCiAJCQkJYXQuCiAKK2Jpb3NfbGltaXQgOgkJCUlmIHRoZSBCSU9TIHRlbGxzIHRoZSBPUyB0byBsaW1pdCBhIENQVSB0bworCQkJCWxvd2VyIGZyZXF1ZW5jaWVzLCB0aGUgdXNlciBjYW4gcmVhZCBvdXQgdGhlCisJCQkJbWF4aW11bSBhdmFpbGFibGUgZnJlcXVlbmN5IGZyb20gdGhpcyBmaWxlLgorCQkJCVRoaXMgdHlwaWNhbGx5IGNhbiBoYXBwZW4gdGhyb3VnaCAob2Z0ZW4gbm90CisJCQkJaW50ZW5kZWQpIEJJT1Mgc2V0dGluZ3MsIHJlc3RyaWN0aW9ucworCQkJCXRyaWdnZXJlZCB0aHJvdWdoIGEgc2VydmljZSBwcm9jZXNzb3Igb3Igb3RoZXIKKwkJCQlCSU9TL0hXIGJhc2VkIGltcGxlbWVudGF0aW9ucy4KKwkJCQlUaGlzIGRvZXMgbm90IGNvdmVyIHRoZXJtYWwgQUNQSSBsaW1pdGF0aW9ucworCQkJCXdoaWNoIGNhbiBiZSBkZXRlY3RlZCB0aHJvdWdoIHRoZSBnZW5lcmljCisJCQkJdGhlcm1hbCBkcml2ZXIuCisKIElmIHlvdSBoYXZlIHNlbGVjdGVkIHRoZSAidXNlcnNwYWNlIiBnb3Zlcm5vciB3aGljaCBhbGxvd3MgeW91IHRvCiBzZXQgdGhlIENQVSBvcGVyYXRpbmcgZnJlcXVlbmN5IHRvIGEgc3BlY2lmaWMgdmFsdWUsIHlvdSBjYW4gcmVhZCBvdXQKIHRoZSBjdXJyZW50IGZyZXF1ZW5jeSBpbgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jcHUtaG90cGx1Zy50eHQgYi9Eb2N1bWVudGF0aW9uL2NwdS1ob3RwbHVnLnR4dAppbmRleCA5ZDYyMGMxLi40ZDRhNjQ0YiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jcHUtaG90cGx1Zy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jcHUtaG90cGx1Zy50eHQKQEAgLTQ5LDYgKzQ5LDEyIEBACiBhZGRpdGlvbmFsX2NwdXM9biAoKikJVXNlIHRoaXMgdG8gbGltaXQgaG90cGx1Z2dhYmxlIGNwdXMuIFRoaXMgb3B0aW9uIHNldHMKICAgCQkJY3B1X3Bvc3NpYmxlX21hcCA9IGNwdV9wcmVzZW50X21hcCArIGFkZGl0aW9uYWxfY3B1cwogCitjZWRlX29mZmxpbmU9eyJvZmYiLCJvbiJ9ICBVc2UgdGhpcyBvcHRpb24gdG8gZGlzYWJsZS9lbmFibGUgcHV0dGluZyBvZmZsaW5lZAorCQkgICAgICAgICAgICBwcm9jZXNzb3JzIHRvIGFuIGV4dGVuZGVkIEhfQ0VERSBzdGF0ZSBvbgorCQkJICAgIHN1cHBvcnRlZCBwc2VyaWVzIHBsYXRmb3Jtcy4KKwkJCSAgICBJZiBub3RoaW5nIGlzIHNwZWNpZmllZCwKKwkJCSAgICBjZWRlX29mZmxpbmUgaXMgc2V0IHRvICJvbiIuCisKICgqKSBPcHRpb24gdmFsaWQgb25seSBmb3IgZm9sbG93aW5nIGFyY2hpdGVjdHVyZXMKIC0gaWE2NAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2V4dDMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQzLnR4dAppbmRleCAwNWQ1Y2YxLi44NjdjNWI1MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2V4dDMudHh0CkBAIC0zMiw4ICszMiw4IEBACiAJCQlpZGVudGlmaWVkIHRocm91Z2ggaXRzIG5ldyBtYWpvci9taW5vciBudW1iZXJzIGVuY29kZWQKIAkJCWluIGRldm51bS4KIAotbm9sb2FkCQkJRG9uJ3QgbG9hZCB0aGUgam91cm5hbCBvbiBtb3VudGluZy4gTm90ZSB0aGF0IHRoaXMgZm9yY2VzCi0JCQltb3VudCBvZiBpbmNvbnNpc3RlbnQgZmlsZXN5c3RlbSwgd2hpY2ggY2FuIGxlYWQgdG8KK25vcmVjb3ZlcnkJCURvbid0IGxvYWQgdGhlIGpvdXJuYWwgb24gbW91bnRpbmcuIE5vdGUgdGhhdCB0aGlzIGZvcmNlcworbm9sb2FkCQkJbW91bnQgb2YgaW5jb25zaXN0ZW50IGZpbGVzeXN0ZW0sIHdoaWNoIGNhbiBsZWFkIHRvCiAJCQl2YXJpb3VzIHByb2JsZW1zLgogCiBkYXRhPWpvdXJuYWwJCUFsbCBkYXRhIGFyZSBjb21taXR0ZWQgaW50byB0aGUgam91cm5hbCBwcmlvciB0byBiZWluZwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9uaWxmczIudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9uaWxmczIudHh0CmluZGV4IDAxNTM5ZjQuLjQ5NDlmY2EgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbmlsZnMyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL25pbGZzMi50eHQKQEAgLTQ5LDggKzQ5LDcgQEAKIE5JTEZTMiBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIG1vdW50IG9wdGlvbnM6CiAoKikgPT0gZGVmYXVsdAogCi1iYXJyaWVyPW9uKCopCQlUaGlzIGVuYWJsZXMvZGlzYWJsZXMgYmFycmllcnMuIGJhcnJpZXI9b2ZmIGRpc2FibGVzCi0JCQlpdCwgYmFycmllcj1vbiBlbmFibGVzIGl0Lgorbm9iYXJyaWVyCQlEaXNhYmxlcyBiYXJyaWVycy4KIGVycm9ycz1jb250aW51ZSgqKQlLZWVwIGdvaW5nIG9uIGEgZmlsZXN5c3RlbSBlcnJvci4KIGVycm9ycz1yZW1vdW50LXJvCVJlbW91bnQgdGhlIGZpbGVzeXN0ZW0gcmVhZC1vbmx5IG9uIGFuIGVycm9yLgogZXJyb3JzPXBhbmljCQlQYW5pYyBhbmQgaGFsdCB0aGUgbWFjaGluZSBpZiBhbiBlcnJvciBvY2N1cnMuCkBAIC03MSw2ICs3MCwxMCBAQAogCQkJYmxvY2tzLiAgVGhhdCBtZWFucywgaXQgaXMgZ3VhcmFudGVlZCB0aGF0IG5vCiAJCQlvdmVydGFraW5nIG9mIGV2ZW50cyBvY2N1cnMgaW4gdGhlIHJlY292ZXJlZCBmaWxlCiAJCQlzeXN0ZW0gYWZ0ZXIgYSBjcmFzaC4KK25vcmVjb3ZlcnkJCURpc2FibGUgcmVjb3Zlcnkgb2YgdGhlIGZpbGVzeXN0ZW0gb24gbW91bnQuCisJCQlUaGlzIGRpc2FibGVzIGV2ZXJ5IHdyaXRlIGFjY2VzcyBvbiB0aGUgZGV2aWNlIGZvcgorCQkJcmVhZC1vbmx5IG1vdW50cyBvciBzbmFwc2hvdHMuICBUaGlzIG9wdGlvbiB3aWxsIGZhaWwKKwkJCWZvciByL3cgbW91bnRzIG9uIGFuIHVuY2xlYW4gdm9sdW1lLgogCiBOSUxGUzIgdXNhZ2UKID09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZnMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZnMudHh0CmluZGV4IDYyM2YwOTQuLjNkZTJmMzIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Zmcy50eHQKQEAgLTQ3Miw3ICs0NzIsNyBAQAogd3JpdGluZyBvdXQgdGhlIHdob2xlIGFkZHJlc3Nfc3BhY2UuCiAKIFRoZSBXcml0ZWJhY2sgdGFnIGlzIHVzZWQgYnkgZmlsZW1hcCp3YWl0KiBhbmQgc3luY19wYWdlKiBmdW5jdGlvbnMsCi12aWEgd2FpdF9vbl9wYWdlX3dyaXRlYmFja19yYW5nZSwgdG8gd2FpdCBmb3IgYWxsIHdyaXRlYmFjayB0bwordmlhIGZpbGVtYXBfZmRhdGF3YWl0X3JhbmdlLCB0byB3YWl0IGZvciBhbGwgd3JpdGViYWNrIHRvCiBjb21wbGV0ZS4gIFdoaWxlIHdhaXRpbmcgLT5zeW5jX3BhZ2UgKGlmIGRlZmluZWQpIHdpbGwgYmUgY2FsbGVkIG9uCiBlYWNoIHBhZ2UgdGhhdCBpcyBmb3VuZCB0byByZXF1aXJlIHdyaXRlYmFjay4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pc2RuL1JFQURNRS5naWdhc2V0IGIvRG9jdW1lbnRhdGlvbi9pc2RuL1JFQURNRS5naWdhc2V0CmluZGV4IDBmYzk4MzEuLjc5NDk0MWYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaXNkbi9SRUFETUUuZ2lnYXNldAorKysgYi9Eb2N1bWVudGF0aW9uL2lzZG4vUkVBRE1FLmdpZ2FzZXQKQEAgLTY4LDIyICs2OCwzOCBAQAogICAgICBmb3IgdHJvdWJsZXNob290aW5nIG9yIHRvIHBhc3MgbW9kdWxlIHBhcmFtZXRlcnMuCiAKICAgICAgVGhlIG1vZHVsZSBzZXJfZ2lnYXNldCBwcm92aWRlcyBhIHNlcmlhbCBsaW5lIGRpc2NpcGxpbmUgTl9HSUdBU0VUX00xMDEKLSAgICAgd2hpY2ggZHJpdmVzIHRoZSBkZXZpY2UgdGhyb3VnaCB0aGUgcmVndWxhciBzZXJpYWwgbGluZSBkcml2ZXIuIEl0IG11c3QKLSAgICAgYmUgYXR0YWNoZWQgdG8gdGhlIHNlcmlhbCBsaW5lIHRvIHdoaWNoIHRoZSBNMTAxIGlzIGNvbm5lY3RlZCB3aXRoIHRoZQotICAgICBsZGF0dGFjaCg4KSBjb21tYW5kIChyZXF1aXJlcyB1dGlsLWxpbnV4LW5nIHJlbGVhc2UgMi4xNCBvciBsYXRlciksIGZvcgotICAgICBleGFtcGxlOgotCSBsZGF0dGFjaCBHSUdBU0VUX00xMDEgL2Rldi90dHlTMQorICAgICB3aGljaCB1c2VzIHRoZSByZWd1bGFyIHNlcmlhbCBwb3J0IGRyaXZlciB0byBhY2Nlc3MgdGhlIGRldmljZSwgYW5kIG11c3QKKyAgICAgdGhlcmVmb3JlIGJlIGF0dGFjaGVkIHRvIHRoZSBzZXJpYWwgZGV2aWNlIHRvIHdoaWNoIHRoZSBNMTAxIGlzIGNvbm5lY3RlZC4KKyAgICAgVGhlIGxkYXR0YWNoKDgpIGNvbW1hbmQgKGluY2x1ZGVkIGluIHV0aWwtbGludXgtbmcgcmVsZWFzZSAyLjE0IG9yIGxhdGVyKQorICAgICBjYW4gYmUgdXNlZCBmb3IgdGhhdCBwdXJwb3NlLCBmb3IgZXhhbXBsZToKKwlsZGF0dGFjaCBHSUdBU0VUX00xMDEgL2Rldi90dHlTMQogICAgICBUaGlzIHdpbGwgb3BlbiB0aGUgZGV2aWNlIGZpbGUsIGF0dGFjaCB0aGUgbGluZSBkaXNjaXBsaW5lIHRvIGl0LCBhbmQKICAgICAgdGhlbiBzbGVlcCBpbiB0aGUgYmFja2dyb3VuZCwga2VlcGluZyB0aGUgZGV2aWNlIG9wZW4gc28gdGhhdCB0aGUgbGluZQogICAgICBkaXNjaXBsaW5lIHJlbWFpbnMgYWN0aXZlLiBUbyBkZWFjdGl2YXRlIGl0LCBraWxsIHRoZSBkYWVtb24sIGZvciBleGFtcGxlCiAgICAgIHdpdGgKLQkga2lsbGFsbCBsZGF0dGFjaAorCWtpbGxhbGwgbGRhdHRhY2gKICAgICAgYmVmb3JlIGRpc2Nvbm5lY3RpbmcgdGhlIGRldmljZS4gVG8gaGF2ZSB0aGlzIGhhcHBlbiBhdXRvbWF0aWNhbGx5IGF0CiAgICAgIHN5c3RlbSBzdGFydHVwL3NodXRkb3duIG9uIGFuIExTQiBjb21wYXRpYmxlIHN5c3RlbSwgY3JlYXRlIGFuZCBhY3RpdmF0ZQogICAgICBhbiBhcHByb3ByaWF0ZSBMU0Igc3RhcnR1cCBzY3JpcHQgL2V0Yy9pbml0LmQvZ2lnYXNldC4gKFRoZSBpbml0IG5hbWUKICAgICAgJ2dpZ2FzZXQnIGlzIG9mZmljaWFsbHkgYXNzaWduZWQgdG8gdGhpcyBwcm9qZWN0IGJ5IExBTkFOQS4pCiAgICAgIEFsdGVybmF0aXZlbHksIGp1c3QgYWRkIHRoZSAnbGRhdHRhY2gnIGNvbW1hbmQgbGluZSB0byAvZXRjL3JjLmxvY2FsLgogCisgICAgIFRoZSBtb2R1bGVzIGFjY2VwdCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisKKwlNb2R1bGUJIAlQYXJhbWV0ZXIgIE1lYW5pbmcKKworCWdpZ2FzZXQJIAlkZWJ1ZwkgICBkZWJ1ZyBsZXZlbCAoc2VlIHNlY3Rpb24gMy4yLikKKworCQkJc3RhcnRtb2RlICBpbml0aWFsIG9wZXJhdGlvbiBtb2RlIChzZWUgc2VjdGlvbiAyLjUuKToKKwliYXNfZ2lnYXNldCApCQkgICAxPUlTRE40bGludXgvQ0FQSSAoZGVmYXVsdCksIDA9VW5pbW9kZW0KKwlzZXJfZ2lnYXNldCApCisJdXNiX2dpZ2FzZXQgKQljaWRtb2RlICAgIGluaXRpYWwgQ2FsbC1JRCBtb2RlIHNldHRpbmcgKHNlZSBzZWN0aW9uCisJCQkJICAgMi41Lik6IDE9b24gKGRlZmF1bHQpLCAwPW9mZgorCisgICAgIERlcGVuZGluZyBvbiB5b3VyIGRpc3RyaWJ1dGlvbiB5b3UgbWF5IHdhbnQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgbW9kdWxlCisgICAgIGNvbmZpZ3VyYXRpb24gZmlsZSAvZXRjL21vZHByb2JlLmQvZ2lnYXNldCBmb3IgdGhlc2UsIG9yIGFkZCB0aGVtIHRvIGEKKyAgICAgY3VzdG9tIGZpbGUgbGlrZSAvZXRjL21vZHByb2JlLmNvbmYubG9jYWwuCisKIDIuMi4gRGV2aWNlIG5vZGVzIGZvciB1c2VyIHNwYWNlIHByb2dyYW1zCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBUaGUgZGV2aWNlIGNhbiBiZSBhY2Nlc3NlZCBmcm9tIHVzZXIgc3BhY2UgKGVnLiBieSB0aGUgdXNlciBzcGFjZSB0b29scwpAQCAtOTMsMTEgKzEwOSw0OCBAQAogICAgICAtIC9kZXYvdHR5R1UwIGZvciBNMTA1IChVU0IgZGF0YSBib3hlcykKICAgICAgLSAvZGV2L3R0eUdCMCBmb3IgdGhlIGJhc2UgZHJpdmVyIChkaXJlY3QgVVNCIGNvbm5lY3Rpb24pCiAKLSAgICAgWW91IGNhbiBhbHNvIHNlbGVjdCBhICJkZWZhdWx0IGRldmljZSIgd2hpY2ggaXMgdXNlZCBieSB0aGUgZnJvbnRlbmRzIHdoZW4KKyAgICAgSWYgeW91IGNvbm5lY3QgbW9yZSB0aGFuIG9uZSBkZXZpY2Ugb2YgYSB0eXBlLCB0aGV5IHdpbGwgZ2V0IGNvbnNlY3V0aXZlCisgICAgIGRldmljZSBub2RlcywgZWcuIC9kZXYvdHR5R1UxIGZvciBhIHNlY29uZCBNMTA1LgorCisgICAgIFlvdSBjYW4gYWxzbyBzZXQgYSAiZGVmYXVsdCBkZXZpY2UiIGZvciB0aGUgdXNlciBzcGFjZSB0b29scyB0byB1c2Ugd2hlbgogICAgICBubyBkZXZpY2Ugbm9kZSBpcyBnaXZlbiBhcyBwYXJhbWV0ZXIsIGJ5IGNyZWF0aW5nIGEgc3ltbGluayAvZGV2L3R0eUcgdG8KICAgICAgb25lIG9mIHRoZW0sIGVnLjoKIAotICAgICAgICBsbiAtcyAvZGV2L3R0eUdCMCAvZGV2L3R0eUcKKwlsbiAtcyAvZGV2L3R0eUdCMCAvZGV2L3R0eUcKKworICAgICBUaGUgZGV2aWNlcyBhY2NlcHQgdGhlIGZvbGxvd2luZyBkZXZpY2Ugc3BlY2lmaWMgaW9jdGwgY2FsbHMKKyAgICAgKGRlZmluZWQgaW4gZ2lnYXNldF9kZXYuaCk6CisKKyAgICAgaW9jdGwoaW50IGZkLCBHSUdBU0VUX1JFRElSLCBpbnQgKmNtZCk7CisgICAgIElmIGNtZD09MSwgdGhlIGRldmljZSBpcyBzZXQgdG8gYmUgY29udHJvbGxlZCBleGNsdXNpdmVseSB0aHJvdWdoIHRoZQorICAgICBjaGFyYWN0ZXIgZGV2aWNlIG5vZGU7IGFjY2VzcyBmcm9tIHRoZSBJU0ROIHN1YnN5c3RlbSBpcyBibG9ja2VkLgorICAgICBJZiBjbWQ9PTAsIHRoZSBkZXZpY2UgaXMgc2V0IHRvIGJlIHVzZWQgZnJvbSB0aGUgSVNETiBzdWJzeXN0ZW0gYW5kIGRvZXMKKyAgICAgbm90IGNvbW11bmljYXRlIHRocm91Z2ggdGhlIGNoYXJhY3RlciBkZXZpY2Ugbm9kZS4KKworICAgICBpb2N0bChpbnQgZmQsIEdJR0FTRVRfQ09ORklHLCBpbnQgKmNtZCk7CisgICAgIChzZXJfZ2lnYXNldCBhbmQgdXNiX2dpZ2FzZXQgb25seSkKKyAgICAgSWYgY21kPT0xLCB0aGUgZGV2aWNlIGlzIHNldCB0byBhZGFwdGVyIGNvbmZpZ3VyYXRpb24gbW9kZSB3aGVyZSBjb21tYW5kcworICAgICBhcmUgaW50ZXJwcmV0ZWQgYnkgdGhlIE0xMHggREVDVCBhZGFwdGVyIGl0c2VsZiBpbnN0ZWFkIG9mIGJlaW5nCisgICAgIGZvcndhcmRlZCB0byB0aGUgYmFzZSBzdGF0aW9uLiBJbiB0aGlzIG1vZGUsIHRoZSBkZXZpY2UgYWNjZXB0cyB0aGUKKyAgICAgY29tbWFuZHMgZGVzY3JpYmVkIGluIFNpZW1lbnMgZG9jdW1lbnQgIkFULUtvbW1hbmRvIEFsaWdubWVudCBNMTB4IERhdGEiCisgICAgIGZvciBzZXR0aW5nIHRoZSBvcGVyYXRpb24gbW9kZSwgYXNzb2NpYXRpbmcgd2l0aCBhIGJhc2Ugc3RhdGlvbiBhbmQKKyAgICAgcXVlcnlpbmcgcGFyYW1ldGVycyBsaWtlIGZpZWxkIHN0cmVuZ2ggYW5kIHNpZ25hbCBxdWFsaXR5LgorICAgICBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gaW9jdGwgY29tbWFuZCBmb3IgbGVhdmluZyBhZGFwdGVyIGNvbmZpZ3VyYXRpb24KKyAgICAgbW9kZSBhbmQgcmV0dXJuaW5nIHRvIHJlZ3VsYXIgb3BlcmF0aW9uLiBJbiBvcmRlciB0byBsZWF2ZSBhZGFwdGVyCisgICAgIGNvbmZpZ3VyYXRpb24gbW9kZSwgd3JpdGUgdGhlIGNvbW1hbmQgQVRPIHRvIHRoZSBkZXZpY2UuCisKKyAgICAgaW9jdGwoaW50IGZkLCBHSUdBU0VUX0JSS0NIQVJTLCB1bnNpZ25lZCBjaGFyIGJya2NoYXJzWzZdKTsKKyAgICAgKHVzYl9naWdhc2V0IG9ubHkpCisgICAgIFNldCB0aGUgYnJlYWsgY2hhcmFjdGVycyBvbiBhbiBNMTA1J3MgaW50ZXJuYWwgc2VyaWFsIGFkYXB0ZXIgdG8gdGhlIHNpeAorICAgICBieXRlcyBzdG9yZWQgaW4gYnJrY2hhcnNbXS4gVW51c2VkIGJ5dGVzIHNob3VsZCBiZSBzZXQgdG8gemVyby4KKworICAgICBpb2N0bChpbnQgZmQsIEdJR0FTRVRfVkVSU0lPTiwgdW5zaWduZWQgdmVyc2lvbls0XSk7CisgICAgIFJldHJpZXZlIHZlcnNpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUgZHJpdmVyLiB2ZXJzaW9uWzBdIG11c3QgYmUgc2V0IHRvCisgICAgIG9uZSBvZjoKKyAgICAgLSBHSUdWRVJfRFJJVkVSOiByZXRyaWV2ZSBkcml2ZXIgdmVyc2lvbgorICAgICAtIEdJR1ZFUl9DT01QQVQ6IHJldHJpZXZlIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHZlcnNpb24KKyAgICAgLSBHSUdWRVJfRldCQVNFOiByZXRyaWV2ZSB0aGUgZmlybXdhcmUgdmVyc2lvbiBvZiB0aGUgYmFzZQorICAgICBVcG9uIHJldHVybiwgdmVyc2lvbltdIGlzIGZpbGxlZCB3aXRoIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiBpbmZvcm1hdGlvbi4KIAogMi4zLiBJU0RONGxpbnV4CiAgICAgIC0tLS0tLS0tLS0KQEAgLTExMywxNSArMTY2LDI0IEBACiAgICAgICAgICBDb25uZWN0aW9uIFN0YXRlOiAwLCBSZXNwb25zZTogLTEKICAgICAgICAgIGdpZ2FzZXRfcHJvY2Vzc19yZXNwb25zZTogcmVzcF9jb2RlIC0xIGluIENvblN0YXRlIDAgIQogICAgICAgICAgVGltZW91dCBvY2N1cnJlZAotICAgICB5b3UgbWlnaHQgbmVlZCB0byB1c2UgdW5pbW9kZW0gbW9kZS4gKHNlZSBzZWN0aW9uIDIuNS4pCisgICAgIHlvdSBwcm9iYWJseSBuZWVkIHRvIHVzZSB1bmltb2RlbSBtb2RlLiAoc2VlIHNlY3Rpb24gMi41LikKIAogMi40LiBDQVBJCiAgICAgIC0tLS0KICAgICAgSWYgdGhlIGRyaXZlciBpcyBjb21waWxlZCB3aXRoIENBUEkgc3VwcG9ydCAoa2VybmVsIGNvbmZpZ3VyYXRpb24gb3B0aW9uCiAgICAgIEdJR0FTRVRfQ0FQSSwgZXhwZXJpbWVudGFsKSBpdCBjYW4gYWxzbyBiZSB1c2VkIHdpdGggQ0FQSSAyLjAga2VybmVsIGFuZAotICAgICB1c2VyIHNwYWNlIGFwcGxpY2F0aW9ucy4gIElTRE40TGludXggaXMgc3VwcG9ydGVkIGluIHRoaXMgY29uZmlndXJhdGlvbgorICAgICB1c2VyIHNwYWNlIGFwcGxpY2F0aW9ucy4gRm9yIHVzZXIgc3BhY2UgYWNjZXNzLCB0aGUgbW9kdWxlIGNhcGkua28gbXVzdAorICAgICBiZSBsb2FkZWQuIFRoZSBjYXBpaW5pdCBjb21tYW5kIChpbmNsdWRlZCBpbiB0aGUgY2FwaTRrLXV0aWxzIHBhY2thZ2UpCisgICAgIGRvZXMgdGhpcyBmb3IgeW91LgorCisgICAgIFRoZSBDQVBJIHZhcmlhbnQgb2YgdGhlIGRyaXZlciBzdXBwb3J0cyBsZWdhY3kgSVNETjRMaW51eCBhcHBsaWNhdGlvbnMKICAgICAgdmlhIHRoZSBjYXBpZHJ2IGNvbXBhdGliaWxpdHkgZHJpdmVyLiBUaGUga2VybmVsIG1vZHVsZSBjYXBpZHJ2LmtvIG11c3QKLSAgICAgYmUgbG9hZGVkIGV4cGxpY2l0bHkgKCJtb2Rwcm9iZSBjYXBpZHJ2IikgaWYgbmVlZGVkLgorICAgICBiZSBsb2FkZWQgZXhwbGljaXRseSB3aXRoIHRoZSBjb21tYW5kCisgICAgICAgIG1vZHByb2JlIGNhcGlkcnYKKyAgICAgaWYgbmVlZGVkLCBhbmQgY2Fubm90IGJlIHVubG9hZGVkIGFnYWluIHdpdGhvdXQgdW5sb2FkaW5nIHRoZSBkcml2ZXIKKyAgICAgZmlyc3QuIChUaGVzZSBhcmUgbGltaXRhdGlvbnMgb2YgY2FwaWRydi4pCisKKyAgICAgVGhlIG5vdGUgYWJvdXQgdW5pbW9kZW0gbW9kZSBpbiB0aGUgcHJlY2VkaW5nIHNlY3Rpb24gYXBwbGllcyBoZXJlLCB0b28uCiAKIDIuNS4gVW5pbW9kZW0gbW9kZQogICAgICAtLS0tLS0tLS0tLS0tCkBAIC0xMzQsOSArMTk2LDE0IEBACiAgICAgIFlvdSBjYW4gc3dpdGNoIGJhY2sgdXNpbmcKICAgICAgICAgIGdpZ2Fjb250ciAtLW1vZGUgaXNkbgogCi0gICAgIFlvdSBjYW4gYWxzbyBsb2FkIHRoZSBkcml2ZXIgdXNpbmcgZS5nLgotICAgICAgICAgbW9kcHJvYmUgdXNiX2dpZ2FzZXQgc3RhcnRtb2RlPTAKLSAgICAgdG8gcHJldmVudCB0aGUgZHJpdmVyIGZyb20gc3RhcnRpbmcgaW4gImlzZG40bGludXggbW9kZSIuCisgICAgIFlvdSBjYW4gYWxzbyBwdXQgdGhlIGRyaXZlciBkaXJlY3RseSBpbnRvIFVuaW1vZGVtIG1vZGUgd2hlbiBpdCdzIGxvYWRlZCwKKyAgICAgYnkgcGFzc2luZyB0aGUgbW9kdWxlIHBhcmFtZXRlciBzdGFydG1vZGU9MCB0byB0aGUgaGFyZHdhcmUgc3BlY2lmaWMKKyAgICAgbW9kdWxlLCBlLmcuCisJbW9kcHJvYmUgdXNiX2dpZ2FzZXQgc3RhcnRtb2RlPTAKKyAgICAgb3IgYnkgYWRkaW5nIGEgbGluZSBsaWtlCisJb3B0aW9ucyB1c2JfZ2lnYXNldCBzdGFydG1vZGU9MAorICAgICB0byBhbiBhcHByb3ByaWF0ZSBtb2R1bGUgY29uZmlndXJhdGlvbiBmaWxlLCBsaWtlIC9ldGMvbW9kcHJvYmUuZC9naWdhc2V0CisgICAgIG9yIC9ldGMvbW9kcHJvYmUuY29uZi5sb2NhbC4KIAogICAgICBJbiB0aGlzIG1vZGUgdGhlIGRldmljZSB3b3JrcyBsaWtlIGEgbW9kZW0gY29ubmVjdGVkIHRvIGEgc2VyaWFsIHBvcnQKICAgICAgKHRoZSAvZGV2L3R0eUdVMCwgLi4uIG1lbnRpb25lZCBhYm92ZSkgd2hpY2ggdW5kZXJzdGFuZHMgdGhlIGNvbW1hbmRzCkBAIC0xNjQsOSArMjMxLDggQEAKIAogICAgICAgICBvcHRpb25zIHBwcF9hc3luYyBmbGFnX3RpbWU9MAogCi0gICAgIHRvIC9ldGMvbW9kcHJvYmUuY29uZi4gSWYgeW91ciBkaXN0cmlidXRpb24gaGFzIHNvbWUgbG9jYWwgbW9kdWxlCi0gICAgIGNvbmZpZ3VyYXRpb24gZmlsZSBsaWtlIC9ldGMvbW9kcHJvYmUuY29uZi5sb2NhbCwKLSAgICAgdXNpbmcgdGhhdCBzaG91bGQgYmUgcHJlZmVycmVkLgorICAgICB0byBhbiBhcHByb3ByaWF0ZSBtb2R1bGUgY29uZmlndXJhdGlvbiBmaWxlLCBsaWtlIC9ldGMvbW9kcHJvYmUuZC9naWdhc2V0CisgICAgIG9yIC9ldGMvbW9kcHJvYmUuY29uZi5sb2NhbC4KIAogMi42LiBDYWxsLUlEIChDSUQpIG1vZGUKICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xODksMTIgKzI1NSwxMyBAQAogICAgICAgIHNldHRpbmdzIChDSUQgbW9kZSkuCiAgICAgIC0gSWYgeW91IGhhdmUgc2V2ZXJhbCBERUNUIGRhdGEgZGV2aWNlcyAoTTEweCkgd2hpY2ggeW91IHdhbnQgdG8gdXNlCiAgICAgICAgaW4gdHVybiwgc2VsZWN0IFVuaW1vZGVtIG1vZGUgYnkgcGFzc2luZyB0aGUgcGFyYW1ldGVyICJjaWRtb2RlPTAiIHRvCi0gICAgICAgdGhlIGRyaXZlciAoIm1vZHByb2JlIHVzYl9naWdhc2V0IGNpZG1vZGU9MCIgb3IgbW9kcHJvYmUuY29uZikuCisgICAgICAgdGhlIGFwcHJvcHJpYXRlIGRyaXZlciBtb2R1bGUgKHNlcl9naWdhc2V0IG9yIHVzYl9naWdhc2V0KS4KIAogICAgICBJZiB5b3Ugd2FudCBib3RoIG9mIHRoZXNlIGF0IG9uY2UsIHlvdSBhcmUgb3V0IG9mIGx1Y2suCiAKLSAgICAgWW91IGNhbiBhbHNvIHVzZSAvc3lzL2NsYXNzL3R0eS90dHlHeHkvY2lkbW9kZSBmb3IgY2hhbmdpbmcgdGhlIENJRCBtb2RlCi0gICAgIHNldHRpbmcgKHR0eUd4eSBpcyB0dHlHVTAgb3IgdHR5R0IwKS4KKyAgICAgWW91IGNhbiBhbHNvIHVzZSB0aGUgdHR5IGNsYXNzIHBhcmFtZXRlciAiY2lkbW9kZSIgb2YgdGhlIGRldmljZSB0bworICAgICBjaGFuZ2UgaXRzIENJRCBtb2RlIHdoaWxlIHRoZSBkcml2ZXIgaXMgbG9hZGVkLCBlZy4KKyAgICAgICAgZWNobyAwID4gL3N5cy9jbGFzcy90dHkvdHR5R1UwL2NpZG1vZGUKIAogMi43LiBVbnJlZ2lzdGVyZWQgV2lyZWxlc3MgRGV2aWNlcyAoTTEwMS9NMTA1KQogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjA4LDcgKzI3NSw3IEBACiAgICAgIGRyaXZlci4gSW4gdGhhdCBzaXR1YXRpb24sIGEgcmVzdHJpY3RlZCBzZXQgb2YgZnVuY3Rpb25zIGlzIGF2YWlsYWJsZQogICAgICB3aGljaCBpbmNsdWRlcywgaW4gcGFydGljdWxhciwgdGhvc2UgbmVjZXNzYXJ5IGZvciByZWdpc3RlcmluZyB0aGUgZGV2aWNlCiAgICAgIHRvIGEgYmFzZSBvciBmb3Igc3dpdGNoaW5nIGl0IGJldHdlZW4gRml4ZWQgUGFydCBhbmQgUG9ydGFibGUgUGFydAotICAgICBtb2Rlcy4KKyAgICAgbW9kZXMuIFNlZSB0aGUgZ2lnYWNvbnRyKDgpIG1hbnBhZ2UgZm9yIGRldGFpbHMuCiAKIDMuICAgVHJvdWJsZXNob290aW5nCiAgICAgIC0tLS0tLS0tLS0tLS0tLQpAQCAtMjIyLDkgKzI4OSw3IEBACiAKICAgICAgICAgICAgb3B0aW9ucyBpc2RuIGRpYWx0aW1lb3V0PTE1CiAKLSAgICAgICAgdG8gL2V0Yy9tb2Rwcm9iZS5jb25mLiBJZiB5b3VyIGRpc3RyaWJ1dGlvbiBoYXMgc29tZSBsb2NhbCBtb2R1bGUKLSAgICAgICAgY29uZmlndXJhdGlvbiBmaWxlIGxpa2UgL2V0Yy9tb2Rwcm9iZS5jb25mLmxvY2FsLAotICAgICAgICB1c2luZyB0aGF0IHNob3VsZCBiZSBwcmVmZXJyZWQuCisgICAgICAgIHRvIC9ldGMvbW9kcHJvYmUuZC9naWdhc2V0LCAvZXRjL21vZHByb2JlLmNvbmYubG9jYWwgb3IgYSBzaW1pbGFyIGZpbGUuCiAKICAgICAgUHJvYmxlbToKICAgICAgICAgWW91ciBpc2RuIHNjcmlwdCBhYm9ydHMgd2l0aCBhIG1lc3NhZ2UgYWJvdXQgaXNkbmxvZy4KQEAgLTI2NCw3ICszMjksOCBAQAogICAgICBUaGUgaW5pdGlhbCB2YWx1ZSBjYW4gYmUgc2V0IHVzaW5nIHRoZSBkZWJ1ZyBwYXJhbWV0ZXIgd2hlbiBsb2FkaW5nIHRoZQogICAgICBtb2R1bGUgImdpZ2FzZXQiLCBlLmcuIGJ5IGFkZGluZyBhIGxpbmUKICAgICAgICAgb3B0aW9ucyBnaWdhc2V0IGRlYnVnPTAKLSAgICAgdG8gL2V0Yy9tb2Rwcm9iZS5jb25mLCAuLi4KKyAgICAgdG8geW91ciBtb2R1bGUgY29uZmlndXJhdGlvbiBmaWxlLCBlZy4gL2V0Yy9tb2Rwcm9iZS5kL2dpZ2FzZXQgb3IKKyAgICAgL2V0Yy9tb2Rwcm9iZS5jb25mLmxvY2FsLgogCiAgICAgIEdlbmVyYXRlZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kCiAgICAgIC0gYXMgb3V0cHV0IG9mIHRoZSBjb21tYW5kCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CmluZGV4IDc3N2RjOGEuLmFiOTVkM2EgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CkBAIC0xNzg3LDYgKzE3ODcsMTEgQEAKIAkJCXdhaXRpbmcgZm9yIHRoZSBBQ0ssIHNvIGlmIHRoaXMgaXMgc2V0IHRvbyBoaWdoCiAJCQlpbnRlcnJ1cHRzICptYXkqIGJlIGxvc3QhCiAKKwlvbWFwX211eD0JW09NQVBdIE92ZXJyaWRlIGJvb3Rsb2FkZXIgcGluIG11bHRpcGxleGluZy4KKwkJCUZvcm1hdDogPG11eF9tb2RlMC5tb2RlX25hbWU9dmFsdWU+Li4uCisJCQlGb3IgZXhhbXBsZSwgdG8gb3ZlcnJpZGUgSTJDIGJ1czI6CisJCQlvbWFwX211eD1pMmMyX3NjbC5pMmMyX3NjbD0weDEwMCxpMmMyX3NkYS5pMmMyX3NkYT0weDEwMAorCiAJb3BsMz0JCVtIVyxPU1NdCiAJCQlGb3JtYXQ6IDxpbz4KIApAQCAtMjY2Myw2ICsyNjY4LDggQEAKIAkJCXRvIGEgY29tbW9uIHVzYi1zdG9yYWdlIHF1aXJrIGZsYWcgYXMgZm9sbG93czoKIAkJCQlhID0gU0FORV9TRU5TRSAoY29sbGVjdCBtb3JlIHRoYW4gMTggYnl0ZXMKIAkJCQkJb2Ygc2Vuc2UgZGF0YSk7CisJCQkJYiA9IEJBRF9TRU5TRSAoZG9uJ3QgY29sbGVjdCBtb3JlIHRoYW4gMTgKKwkJCQkJYnl0ZXMgb2Ygc2Vuc2UgZGF0YSk7CiAJCQkJYyA9IEZJWF9DQVBBQ0lUWSAoZGVjcmVhc2UgdGhlIHJlcG9ydGVkCiAJCQkJCWRldmljZSBjYXBhY2l0eSBieSBvbmUgc2VjdG9yKTsKIAkJCQloID0gQ0FQQUNJVFlfSEVVUklTVElDUyAoZGVjcmVhc2UgdGhlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2xvY2tzdGF0LnR4dCBiL0RvY3VtZW50YXRpb24vbG9ja3N0YXQudHh0CmluZGV4IDljYjkxMzguLjY1ZjRjNzkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbG9ja3N0YXQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbG9ja3N0YXQudHh0CkBAIC02Miw4ICs2MiwyMCBAQAogSXQgYWxzbyB0cmFja3MgNCBjb250ZW50aW9uIHBvaW50cyBwZXIgY2xhc3MuIEEgY29udGVudGlvbiBwb2ludCBpcyBhIGNhbGwgc2l0ZQogdGhhdCBoYWQgdG8gd2FpdCBvbiBsb2NrIGFjcXVpc2l0aW9uLgogCisgLSBDT05GSUdVUkFUSU9OCisKK0xvY2sgc3RhdGlzdGljcyBhcmUgZW5hYmxlZCB2aWEgQ09ORklHX0xPQ0tfU1RBVFMuCisKICAtIFVTQUdFCiAKK0VuYWJsZSBjb2xsZWN0aW9uIG9mIHN0YXRpc3RpY3M6CisKKyMgZWNobyAxID4vcHJvYy9zeXMva2VybmVsL2xvY2tfc3RhdAorCitEaXNhYmxlIGNvbGxlY3Rpb24gb2Ygc3RhdGlzdGljczoKKworIyBlY2hvIDAgPi9wcm9jL3N5cy9rZXJuZWwvbG9ja19zdGF0CisKIExvb2sgYXQgdGhlIGN1cnJlbnQgbG9jayBzdGF0aXN0aWNzOgogCiAoIGxpbmUgbnVtYmVycyBub3QgcGFydCBvZiBhY3R1YWwgb3V0cHV0LCBkb25lIGZvciBjbGFyaXR5IGluIHRoZSBleHBsYW5hdGlvbgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tZC50eHQgYi9Eb2N1bWVudGF0aW9uL21kLnR4dAppbmRleCA0ZWRkMzllLi4xODhmNDc2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL21kLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL21kLnR4dApAQCAtMjMzLDkgKzIzMyw5IEBACiAKICAgcmVzeW5jX3N0YXJ0CiAgICAgIFRoZSBwb2ludCBhdCB3aGljaCByZXN5bmMgc2hvdWxkIHN0YXJ0LiAgSWYgbm8gcmVzeW5jIGlzIG5lZWRlZCwKLSAgICAgdGhpcyB3aWxsIGJlIGEgdmVyeSBsYXJnZSBudW1iZXIuICBBdCBhcnJheSBjcmVhdGlvbiBpdCB3aWxsCi0gICAgIGRlZmF1bHQgdG8gMCwgdGhvdWdoIHN0YXJ0aW5nIHRoZSBhcnJheSBhcyAnY2xlYW4nIHdpbGwKLSAgICAgc2V0IGl0IG11Y2ggbGFyZ2VyLgorICAgICB0aGlzIHdpbGwgYmUgYSB2ZXJ5IGxhcmdlIG51bWJlciAob3IgJ25vbmUnIHNpbmNlIDIuNi4zMC1yYzEpLiAgQXQKKyAgICAgYXJyYXkgY3JlYXRpb24gaXQgd2lsbCBkZWZhdWx0IHRvIDAsIHRob3VnaCBzdGFydGluZyB0aGUgYXJyYXkgYXMKKyAgICAgJ2NsZWFuJyB3aWxsIHNldCBpdCBtdWNoIGxhcmdlci4KIAogICAgbmV3X2RldgogICAgICBUaGlzIGZpbGUgY2FuIGJlIHdyaXR0ZW4gYnV0IG5vdCByZWFkLiAgVGhlIHZhbHVlIHdyaXR0ZW4gc2hvdWxkCkBAIC0yOTYsNiArMjk2LDUxIEBACiAgICAgIGFjdGl2ZS1pZGxlCiAgICAgICAgICBsaWtlIGFjdGl2ZSwgYnV0IG5vIHdyaXRlcyBoYXZlIGJlZW4gc2VlbiBmb3IgYSB3aGlsZSAoc2FmZV9tb2RlX2RlbGF5KS4KIAorICBiaXRtYXAvbG9jYXRpb24KKyAgICAgVGhpcyBpbmRpY2F0ZXMgd2hlcmUgdGhlIHdyaXRlLWludGVudCBiaXRtYXAgZm9yIHRoZSBhcnJheSBpcworICAgICBzdG9yZWQuCisgICAgIEl0IGNhbiBiZSBvbmUgb2YgIm5vbmUiLCAiZmlsZSIgb3IgIlsrLV1OIi4KKyAgICAgImZpbGUiIG1heSBsYXRlciBiZSBleHRlbmRlZCB0byAiZmlsZTovZmlsZS9uYW1lIgorICAgICAiWystXU4iIG1lYW5zIHRoYXQgbWFueSBzZWN0b3JzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBtZXRhZGF0YS4KKyAgICAgICBUaGlzIGlzIHJlcGxpY2F0ZWQgb24gYWxsIGRldmljZXMuICBGb3IgYXJyYXlzIHdpdGggZXh0ZXJuYWxseQorICAgICAgIG1hbmFnZWQgbWV0YWRhdGEsIHRoZSBvZmZzZXQgaXMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICAgICAgIGRldmljZS4KKyAgYml0bWFwL2NodW5rc2l6ZQorICAgICBUaGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBjaHVuayB3aGljaCB3aWxsIGJlIHJlcHJlc2VudGVkIGJ5IGEKKyAgICAgc2luZ2xlIGJpdC4gIEZvciBSQUlENDU2LCBpdCBpcyBhIHBvcnRpb24gb2YgYW4gaW5kaXZpZHVhbAorICAgICBkZXZpY2UuIEZvciBSQUlEMTAsIGl0IGlzIGEgcG9ydGlvbiBvZiB0aGUgYXJyYXkuICBGb3IgUkFJRDEsIGl0CisgICAgIGlzIGJvdGggKHRoZXkgY29tZSB0byB0aGUgc2FtZSB0aGluZykuCisgIGJpdG1hcC90aW1lX2Jhc2UKKyAgICAgVGhlIHRpbWUsIGluIHNlY29uZHMsIGJldHdlZW4gbG9va2luZyBmb3IgYml0cyBpbiB0aGUgYml0bWFwIHRvCisgICAgIGJlIGNsZWFyZWQuIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCBhIGJpdCB3aWxsIGJlIGNsZWFyZWQKKyAgICAgYmV0d2VlbiAyIGFuZCAzIHRpbWVzICJ0aW1lX2Jhc2UiIGFmdGVyIGFsbCB0aGUgY292ZXJlZCBibG9ja3MKKyAgICAgYXJlIGtub3duIHRvIGJlIGluLXN5bmMuCisgIGJpdG1hcC9iYWNrbG9nCisgICAgIFdoZW4gd3JpdGUtbW9zdGx5IGRldmljZXMgYXJlIGFjdGl2ZSBpbiBhIFJBSUQxLCB3cml0ZSByZXF1ZXN0cworICAgICB0byB0aG9zZSBkZXZpY2VzIHByb2NlZWQgaW4gdGhlIGJhY2tncm91bmQgLSB0aGUgZmlsZXN5c3RlbSAob3IKKyAgICAgb3RoZXIgdXNlciBvZiB0aGUgZGV2aWNlKSBkb2VzIG5vdCBoYXZlIHRvIHdhaXQgZm9yIHRoZW0uCisgICAgICdiYWNrbG9nJyBzZXRzIGEgbGltaXQgb24gdGhlIG51bWJlciBvZiBjb25jdXJyZW50IGJhY2tncm91bmQKKyAgICAgd3JpdGVzLiAgSWYgdGhlcmUgYXJlIG1vcmUgdGhhbiB0aGlzLCBuZXcgd3JpdGVzIHdpbGwgYnkKKyAgICAgc3luY2hyb25vdXMuCisgIGJpdG1hcC9tZXRhZGF0YQorICAgICBUaGlzIGNhbiBiZSBlaXRoZXIgJ2ludGVybmFsJyBvciAnZXh0ZXJuYWwnLgorICAgICAnaW50ZXJuYWwnIGlzIHRoZSBkZWZhdWx0IGFuZCBtZWFucyB0aGUgbWV0YWRhdGEgZm9yIHRoZSBiaXRtYXAKKyAgICAgaXMgc3RvcmVkIGluIHRoZSBmaXJzdCAyNTYgYnl0ZXMgb2YgdGhlIGFsbG9jYXRlZCBzcGFjZSBhbmQgaXMKKyAgICAgbWFuYWdlZCBieSB0aGUgbWQgbW9kdWxlLgorICAgICAnZXh0ZXJuYWwnIG1lYW5zIHRoYXQgYml0bWFwIG1ldGFkYXRhIGlzIG1hbmFnZWQgZXh0ZXJuYWxseSB0bworICAgICB0aGUga2VybmVsIChpLmUuIGJ5IHNvbWUgdXNlcnNwYWNlIHByb2dyYW0pCisgIGJpdG1hcC9jYW5fY2xlYXIKKyAgICAgVGhpcyBpcyBlaXRoZXIgJ3RydWUnIG9yICdmYWxzZScuICBJZiAndHJ1ZScsIHRoZW4gYml0cyBpbiB0aGUKKyAgICAgYml0bWFwIHdpbGwgYmUgY2xlYXJlZCB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIGJsb2NrcyBhcmUgdGhvdWdodAorICAgICB0byBiZSBpbi1zeW5jLiAgSWYgJ2ZhbHNlJywgYml0cyB3aWxsIG5ldmVyIGJlIGNsZWFyZWQuCisgICAgIFRoaXMgaXMgYXV0b21hdGljYWxseSBzZXQgdG8gJ2ZhbHNlJyBpZiBhIHdyaXRlIGhhcHBlbnMgb24gYQorICAgICBkZWdyYWRlZCBhcnJheSwgb3IgaWYgdGhlIGFycmF5IGJlY29tZXMgZGVncmFkZWQgZHVyaW5nIGEgd3JpdGUuCisgICAgIFdoZW4gbWV0YWRhdGEgaXMgbWFuYWdlZCBleHRlcm5hbGx5LCBpdCBzaG91bGQgYmUgc2V0IHRvIHRydWUKKyAgICAgb25jZSB0aGUgYXJyYXkgYmVjb21lcyBub24tZGVncmFkZWQsIGFuZCB0aGlzIGZhY3QgaGFzIGJlZW4KKyAgICAgcmVjb3JkZWQgaW4gdGhlIG1ldGFkYXRhLgorICAgICAKKyAgICAgCisgICAgIAogCiBBcyBjb21wb25lbnQgZGV2aWNlcyBhcmUgYWRkZWQgdG8gYW4gbWQgYXJyYXksIHRoZXkgYXBwZWFyIGluIHRoZSAnbWQnCiBkaXJlY3RvcnkgYXMgbmV3IGRpcmVjdG9yaWVzIG5hbWVkCkBAIC0zMzQsOCArMzc5LDkgQEAKIAlXcml0aW5nICJ3cml0ZW1vc3RseSIgc2V0cyB0aGUgd3JpdGVtb3N0bHkgZmxhZy4KIAlXcml0aW5nICItd3JpdGVtb3N0bHkiIGNsZWFycyB0aGUgd3JpdGVtb3N0bHkgZmxhZy4KIAlXcml0aW5nICJibG9ja2VkIiBzZXRzIHRoZSAiYmxvY2tlZCIgZmxhZy4KLQlXcml0aW5nICItYmxvY2tlZCIgY2xlYXIgdGhlICJibG9ja2VkIiBmbGFnIGFuZCBhbGxvd3Mgd3JpdGVzCisJV3JpdGluZyAiLWJsb2NrZWQiIGNsZWFycyB0aGUgImJsb2NrZWQiIGZsYWcgYW5kIGFsbG93cyB3cml0ZXMKIAkJdG8gY29tcGxldGUuCisJV3JpdGluZyAiaW5fc3luYyIgc2V0cyB0aGUgaW5fc3luYyBmbGFnLgogCiAJVGhpcyBmaWxlIHJlc3BvbmRzIHRvIHNlbGVjdC9wb2xsLiBBbnkgY2hhbmdlIHRvICdmYXVsdHknCiAJb3IgJ2Jsb2NrZWQnIGNhdXNlcyBhbiBldmVudC4KQEAgLTM3Miw2ICs0MTgsMjQgQEAKICAgICAgICAgYXJyYXkuICBJZiBhIHZhbHVlIGxlc3MgdGhhbiB0aGUgY3VycmVudCBjb21wb25lbnRfc2l6ZSBpcwogICAgICAgICB3cml0dGVuLCBpdCB3aWxsIGJlIHJlamVjdGVkLgogCisgICAgICByZWNvdmVyeV9zdGFydAorCisgICAgICAgIFdoZW4gdGhlIGRldmljZSBpcyBub3QgJ2luX3N5bmMnLCB0aGlzIHJlY29yZHMgdGhlIG51bWJlciBvZgorCXNlY3RvcnMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGRldmljZSB3aGljaCBhcmUga25vd24gdG8gYmUKKwljb3JyZWN0LiAgVGhpcyBpcyBub3JtYWxseSB6ZXJvLCBidXQgZHVyaW5nIGEgcmVjb3ZlcnkKKwlvcGVyYXRpb24gaXMgd2lsbCBzdGVhZGlseSBpbmNyZWFzZSwgYW5kIGlmIHRoZSByZWNvdmVyeSBpcworCWludGVycnVwdGVkLCByZXN0b3JpbmcgdGhpcyB2YWx1ZSBjYW4gY2F1c2UgcmVjb3ZlcnkgdG8KKwlhdm9pZCByZXBlYXRpbmcgdGhlIGVhcmxpZXIgYmxvY2tzLiAgV2l0aCB2MS54IG1ldGFkYXRhLCB0aGlzCisJdmFsdWUgaXMgc2F2ZWQgYW5kIHJlc3RvcmVkIGF1dG9tYXRpY2FsbHkuCisKKwlUaGlzIGNhbiBiZSBzZXQgd2hlbmV2ZXIgdGhlIGRldmljZSBpcyBub3QgYW4gYWN0aXZlIG1lbWJlciBvZgorCXRoZSBhcnJheSwgZWl0aGVyIGJlZm9yZSB0aGUgYXJyYXkgaXMgYWN0aXZhdGVkLCBvciBiZWZvcmUKKwl0aGUgJ3Nsb3QnIGlzIHNldC4KKworCVNldHRpbmcgdGhpcyB0byAnbm9uZScgaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nICdpbl9zeW5jJy4KKwlTZXR0aW5nIHRvIGFueSBvdGhlciB2YWx1ZSBhbHNvIGNsZWFycyB0aGUgJ2luX3N5bmMnIGZsYWcuCisJCisKIAogQW4gYWN0aXZlIG1kIGRldmljZSB3aWxsIGFsc28gY29udGFpbiBhbmQgZW50cnkgZm9yIGVhY2ggYWN0aXZlIGRldmljZQogaW4gdGhlIGFycmF5LiAgVGhlc2UgYXJlIG5hbWVkCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvZHRzLWJpbmRpbmdzL2ZzbC9ib2FyZC50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvZHRzLWJpbmRpbmdzL2ZzbC9ib2FyZC50eHQKaW5kZXggZThiNWJjMi4uMzllOTQxNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2R0cy1iaW5kaW5ncy9mc2wvYm9hcmQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9kdHMtYmluZGluZ3MvZnNsL2JvYXJkLnR4dApAQCAtMjAsMTIgKzIwLDE2IEBACiAtIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgImZzbCxmcGdhLXBpeGlzIi4KIC0gcmVnIDogc2hvdWxkIGNvbnRhaW4gdGhlIGFkZHJlc3MgYW5kIHRoZSBsZW5ndGggb2YgdGhlIEZQUEdBIHJlZ2lzdGVyCiAgIHNldC4KKy0gaW50ZXJydXB0LXBhcmVudDogc2hvdWxkIHNwZWNpZnkgcGhhbmRsZSBmb3IgdGhlIGludGVycnVwdCBjb250cm9sbGVyLgorLSBpbnRlcnJ1cHRzIDogc2hvdWxkIHNwZWNpZnkgZXZlbnQgKHdha2V1cCkgSVJRLgogCiBFeGFtcGxlIChNUEM4NjEwSFBDRCk6CiAKIAlib2FyZC1jb250cm9sQGU4MDAwMDAwIHsKIAkJY29tcGF0aWJsZSA9ICJmc2wsZnBnYS1waXhpcyI7CiAJCXJlZyA9IDwweGU4MDAwMDAwIDMyPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCWludGVycnVwdHMgPSA8OCA4PjsKIAl9OwogCiAqIEZyZWVzY2FsZSBCQ1NSIEdQSU8gYmFua3MKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9kdHMtYmluZGluZ3MvZnNsL21wYzUyMDAudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2R0cy1iaW5kaW5ncy9mc2wvbXBjNTIwMC50eHQKaW5kZXggY2FiYzc4MC4uNWM2NjAyZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2R0cy1iaW5kaW5ncy9mc2wvbXBjNTIwMC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2R0cy1iaW5kaW5ncy9mc2wvbXBjNTIwMC50eHQKQEAgLTEwMyw3ICsxMDMsMjIgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogT24gdGhlIG1wYzUyMDAgYW5kIDUyMDBiLCBHUFQwIGhhcyBhIHdhdGNoZG9nIHRpbWVyIGZ1bmN0aW9uLiAgSWYgdGhlIGJvYXJkCiBkZXNpZ24gc3VwcG9ydHMgdGhlIGludGVybmFsIHdkdCwgdGhlbiB0aGUgZGV2aWNlIG5vZGUgZm9yIEdQVDAgc2hvdWxkCi1pbmNsdWRlIHRoZSBlbXB0eSBwcm9wZXJ0eSAnZnNsLGhhcy13ZHQnLgoraW5jbHVkZSB0aGUgZW1wdHkgcHJvcGVydHkgJ2ZzbCxoYXMtd2R0Jy4gIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGFjdGl2YXRlCit0aGUgd2F0Y2hkb2cuICBUaGUgdGltZXIgd2lsbCBmdW5jdGlvbiBhcyBhIEdQVCBpZiB0aGUgdGltZXIgYXBpIGlzIHVzZWQsIGFuZAoraXQgd2lsbCBmdW5jdGlvbiBhcyB3YXRjaGRvZyBpZiB0aGUgd2F0Y2hkb2cgZGV2aWNlIGlzIHVzZWQuICBUaGUgd2F0Y2hkb2cKK21vZGUgaGFzIHByaW9yaXR5IG92ZXIgdGhlIGdwdCBtb2RlLCBpLmUuIGlmIHRoZSB3YXRjaGRvZyBpcyBhY3RpdmF0ZWQsIGFueQorZ3B0IGFwaSBjYWxsIHRvIHRoaXMgdGltZXIgd2lsbCBmYWlsIHdpdGggLUVCVVNZLgorCitJZiB5b3UgYWRkIHRoZSBwcm9wZXJ0eQorCWZzbCx3ZHQtb24tYm9vdCA9IDxuPjsKK0dQVDAgd2lsbCBiZSBtYXJrZWQgYXMgaW4tdXNlIHdhdGNoZG9nLCBpLmUuIGJsb2NraW5nIGV2ZXJ5IGdwdCBhY2Nlc3MgdG8gaXQuCitJZiBuPjAsIHRoZSB3YXRjaGRvZyBpcyBzdGFydGVkIHdpdGggYSB0aW1lb3V0IG9mIG4gc2Vjb25kcy4gIElmIG49MCwgdGhlCitjb25maWd1cmF0aW9uIG9mIHRoZSB3YXRjaGRvZyBpcyBub3QgdG91Y2hlZC4gIFRoaXMgaXMgdXNlZnVsIGluIHR3byBjYXNlczoKKy0ganVzdCBtYXJrIEdQVDAgYXMgd2F0Y2hkb2csIGJsb2NraW5nIGdwdCBhY2Nlc3NlcywgYW5kIGNvbmZpZ3VyZSBpdCBsYXRlcjsKKy0gZG8gbm90IHRvdWNoIGEgY29uZmlndXJhdGlvbiBhc3NpZ25lZCBieSB0aGUgYm9vdCBsb2FkZXIgd2hpY2ggc3VwZXJ2aXNlcworICB0aGUgYm9vdCBwcm9jZXNzIGl0c2VsZi4KKworVGhlIHdhdGNoZG9nIHdpbGwgcmVzcGVjdCB0aGUgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUIG9wdGlvbi4KIAogQW4gbXBjNTIwMC1ncHQgY2FuIGJlIHVzZWQgYXMgYSBzaW5nbGUgbGluZSBHUElPIGNvbnRyb2xsZXIuICBUbyBkbyBzbywKIGFkZCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgdG8gdGhlIGdwdCBub2RlOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2R0cy1iaW5kaW5ncy94aWxpbngudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2R0cy1iaW5kaW5ncy94aWxpbngudHh0CmluZGV4IDgwMzM5ZmUuLmVhNjgwNDYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9kdHMtYmluZGluZ3MveGlsaW54LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvZHRzLWJpbmRpbmdzL3hpbGlueC50eHQKQEAgLTI5Miw0ICsyOTIsMTUgQEAKICAgICAgICAtIHJlZy1vZmZzZXQgOiBBIHZhbHVlIG9mIDMgaXMgcmVxdWlyZWQKICAgICAgICAtIHJlZy1zaGlmdCA6IEEgdmFsdWUgb2YgMiBpcyByZXF1aXJlZAogCisgICAgICB2aWkpIFhpbGlueCBVU0IgSG9zdCBjb250cm9sbGVyCisKKyAgICAgIFRoZSBYaWxpbnggVVNCIGhvc3QgY29udHJvbGxlciBpcyBFSENJIGNvbXBhdGlibGUgYnV0IHdpdGggYSBkaWZmZXJlbnQKKyAgICAgIGJhc2UgYWRkcmVzcyBmb3IgdGhlIEVIQ0kgcmVnaXN0ZXJzLCBhbmQgaXQgaXMgYWx3YXlzIGEgYmlnLWVuZGlhbgorICAgICAgVVNCIEhvc3QgY29udHJvbGxlci4gVGhlIGhhcmR3YXJlIGNhbiBiZSBjb25maWd1cmVkIGFzIGhpZ2ggc3BlZWQgb25seSwKKyAgICAgIG9yIGhpZ2ggc3BlZWQvZnVsbCBzcGVlZCBoeWJyaWQuCisKKyAgICAgIFJlcXVpcmVkIHByb3BlcnRpZXM6CisgICAgICAtIHhsbngsc3VwcG9ydC11c2ItZnM6IEEgdmFsdWUgMCBtZWFucyB0aGUgY29yZSBpcyBidWlsdCBhcyBoaWdoIHNwZWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkuIEEgdmFsdWUgMSBtZWFucyB0aGUgY29yZSBhbHNvIHN1cHBvcnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGwgc3BlZWQgZGV2aWNlcy4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zZXJpYWwvaGF5ZXMtZXNwLnR4dCBiL0RvY3VtZW50YXRpb24vc2VyaWFsL2hheWVzLWVzcC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5YjVkNTguLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9zZXJpYWwvaGF5ZXMtZXNwLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi1IQVlFUyBFU1AgRFJJVkVSIFZFUlNJT04gMi4xCi0KLUEgYmlnIHRoYW5rcyB0byB0aGUgcGVvcGxlIGF0IEhheWVzLCBlc3BlY2lhbGx5IEFsYW4gQWRhbXNvbi4gIFRoZWlyIHN1cHBvcnQKLWhhcyBlbmFibGVkIG1lIHRvIHByb3ZpZGUgZW5oYW5jZW1lbnRzIHRvIHRoZSBkcml2ZXIuCi0KLVBsZWFzZSByZXBvcnQgeW91ciBleHBlcmllbmNlcyB3aXRoIHRoaXMgZHJpdmVyIHRvIG1lIChhcm9iaW5zb0BueXgubmV0KS4gIEkKLWFtIGxvb2tpbmcgZm9yIGJvdGggcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIGZlZWRiYWNrLgotCi0qKiogSU1QT1JUQU5UIENIQU5HRVMgRk9SIDIuMSAqKioKLVN1cHBvcnQgZm9yIFBJTyBtb2RlLiAgRml2ZSBzaXR1YXRpb25zIHdpbGwgY2F1c2UgUElPIG1vZGUgdG8gYmUgdXNlZDoKLTEpIEEgbXVsdGlwb3J0IGNhcmQgaXMgZGV0ZWN0ZWQuICBQSU8gbW9kZSB3aWxsIGFsd2F5cyBiZSB1c2VkLiAgKDggcG9ydCBjYXJkcwotZG8gbm90IHN1cHBvcnQgRE1BKS4KLTIpIFRoZSBETUEgY2hhbm5lbCBpcyBzZXQgdG8gYW4gaW52YWxpZCB2YWx1ZSAoYW55dGhpbmcgb3RoZXIgdGhhbiAxIG9yIDMpLgotMykgVGhlIERNQSBidWZmZXIvY2hhbm5lbCBjb3VsZCBub3QgYmUgYWxsb2NhdGVkLiAgVGhlIHBvcnQgd2lsbCByZXZlcnQgdG8gUElPCi1tb2RlIHVudGlsIGl0IGlzIHJlb3BlbmVkLgotNCkgTGVzcyB0aGFuIGEgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBuZWVkIHRvIGJlIHRyYW5zZmVycmVkIHRvL2Zyb20gdGhlCi1GSUZPcy4gIFBJTyBtb2RlIHdpbGwgYmUgdXNlZCBmb3IgdGhhdCB0cmFuc2ZlciBvbmx5LgotNSkgQSBwb3J0IG5lZWRzIHRvIGRvIGEgRE1BIHRyYW5zZmVyIGFuZCBhbm90aGVyIHBvcnQgaXMgYWxyZWFkeSB1c2luZyB0aGUKLURNQSBjaGFubmVsLiAgUElPIG1vZGUgd2lsbCBiZSB1c2VkIGZvciB0aGF0IHRyYW5zZmVyIG9ubHkuCi0KLVNpbmNlIHRoZSBIYXllcyBFU1Agc2VlbXMgdG8gY29uZmxpY3Qgd2l0aCBvdGhlciBjYXJkcyAobm90YWJseSBzb3VuZCBjYXJkcykKLXdoZW4gdXNpbmcgRE1BLCBETUEgaXMgdHVybmVkIG9mZiBieSBkZWZhdWx0LiAgVG8gdXNlIERNQSwgaXQgbXVzdCBiZSB0dXJuZWQKLW9uIGV4cGxpY2l0bHksIGVpdGhlciB3aXRoIHRoZSAiZG1hPSIgb3B0aW9uIGRlc2NyaWJlZCBiZWxvdyBvciB3aXRoCi1zZXRzZXJpYWwuICBBIG11bHRpcG9ydCBjYXJkIGNhbiBiZSBmb3JjZWQgaW50byBETUEgbW9kZSBieSB1c2luZyBzZXRzZXJpYWw7Ci1ob3dldmVyLCBtb3N0IG11bHRpcG9ydCBjYXJkcyBkb24ndCBzdXBwb3J0IERNQS4KLQotVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHNldHNlcmlhbCBhbGxvd3MgdGhlIGVuaGFuY2VkIGNvbmZpZ3VyYXRpb24gb2YgdGhlIEVTUAotY2FyZCB0byBiZSB2aWV3ZWQgYW5kIG1vZGlmaWVkLgotKioqCi0KLVRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgZmlsZXMgbmVlZGVkIHRvIGNvbXBpbGUgYSBtb2R1bGUgdG8gc3VwcG9ydCB0aGUgSGF5ZXMKLUVTUCBjYXJkLiAgVGhlIGRyaXZlcnMgYXJlIGJhc2ljYWxseSBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHNlcmlhbCBkcml2ZXJzLgotCi1GZWF0dXJlczoKLQotLSBVc2VzIHRoZSBlbmhhbmNlZCBtb2RlIG9mIHRoZSBFU1AgY2FyZCwgYWxsb3dpbmcgYSB3aWRlciByYW5nZSBvZgotICBpbnRlcnJ1cHRzIGFuZCBmZWF0dXJlcyB0aGFuIGNvbXBhdGliaWxpdHkgbW9kZQotLSBVc2VzIERNQSBhbmQgMTYgYml0IFBJTyBtb2RlIHRvIHRyYW5zZmVyIGRhdGEgdG8gYW5kIGZyb20gdGhlIEVTUCdzIEZJRk9zLAotICByZWR1Y2luZyBDUFUgbG9hZAotLSBTdXBwb3J0cyBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgcG9ydHMKLQotCi1JZiB0aGUgZHJpdmVyIGlzIGNvbXBpbGVkIGFzIGEgbW9kdWxlLCB0aGUgSVJRcyB0byB1c2UgY2FuIGJlIHNwZWNpZmllZCBieQotdXNpbmcgdGhlIGlycT0gb3B0aW9uLiAgVGhlIGZvcm1hdCBpczoKLQotaXJxPVsweDEwMF0sWzB4MTQwXSxbMHgxODBdLFsweDIwMF0sWzB4MjQwXSxbMHgyODBdLFsweDMwMF0sWzB4MzgwXQotCi1UaGUgYWRkcmVzcyBpbiBicmFja2V0cyBpcyB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBjYXJkLiAgVGhlIElSUSBvZgotbm9uZXhpc3RlbnQgY2FyZHMgY2FuIGJlIHNldCB0byAwLiAgSWYgYW4gSVJRIG9mIGEgY2FyZCB0aGF0IGRvZXMgZXhpc3QgaXMgc2V0Ci10byAwLCB0aGUgZHJpdmVyIHdpbGwgYXR0ZW1wdCB0byBndWVzcyBhdCB0aGUgY29ycmVjdCBJUlEuICBGb3IgZXhhbXBsZSwgdG8gc2V0Ci10aGUgSVJRIG9mIHRoZSBjYXJkIGF0IGFkZHJlc3MgMHgzMDAgdG8gMTIsIHRoZSBpbnNtb2QgY29tbWFuZCB3b3VsZCBiZToKLQotaW5zbW9kIGVzcCBpcnE9MCwwLDAsMCwwLDAsMTIsMAotCi1UaGUgY3VzdG9tIGRpdmlzb3IgY2FuIGJlIHNldCBieSB1c2luZyB0aGUgZGl2aXNvcj0gb3B0aW9uLiAgVGhlIGZvcm1hdCBpcyB0aGUKLXNhbWUgYXMgZm9yIHRoZSBpcnE9IG9wdGlvbi4gIEVhY2ggZGl2aXNvciB2YWx1ZSBpcyBhIHNlcmllcyBvZiBoZXggZGlnaXRzLAotd2l0aCBlYWNoIGRpZ2l0IHJlcHJlc2VudGluZyB0aGUgZGl2aXNvciB0byB1c2UgZm9yIGEgY29ycmVzcG9uZGluZyBwb3J0LiAgVGhlCi1kaXZpc29yIHZhbHVlIGlzIGNvbnN0cnVjdGVkIFJJR0hUIFRPIExFRlQuICBTcGVjaWZ5aW5nIGEgbm9uemVybyBkaXZpc29yIHZhbHVlCi13aWxsIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSBzcGRfY3VzdCBmbGFnLiAgVG8gY2FsY3VsYXRlIHRoZSBkaXZpc29yIHRvIHVzZSBmb3IKLWEgY2VydGFpbiBiYXVkIHJhdGUsIGRpdmlkZSB0aGUgcG9ydCdzIGJhc2UgYmF1ZCAoZ2VuZXJhbGx5IDkyMTYwMCkgYnkgdGhlCi1kZXNpcmVkIHJhdGUuICBGb3IgZXhhbXBsZSwgdG8gc2V0IHRoZSBkaXZpc29yIG9mIHRoZSBwcmltYXJ5IHBvcnQgYXQgMHgzMDAgdG8KLTQgYW5kIHRoZSBkaXZpc29yIG9mIHRoZSBzZWNvbmRhcnkgcG9ydCBhdCAweDMwOCB0byA4LCB0aGUgaW5zbW9kIGNvbW1hbmQgd291bGQKLWJlOgotCi1pbnNtb2QgZXNwIGRpdmlzb3I9MCwwLDAsMCwwLDAsMHg4NCwwCi0KLVRoZSBkbWE9IG9wdGlvbiBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIERNQSBjaGFubmVsLiAgVGhlIGNoYW5uZWwgY2FuIGJlIGVpdGhlcgotMSBvciAzLiAgU3BlY2lmeWluZyBhbnkgb3RoZXIgdmFsdWUgd2lsbCBmb3JjZSB0aGUgZHJpdmVyIHRvIHVzZSBQSU8gbW9kZS4KLUZvciBleGFtcGxlLCB0byBzZXQgdGhlIERNQSBjaGFubmVsIHRvIDMsIHRoZSBpbnNtb2QgY29tbWFuZCB3b3VsZCBiZToKLQotaW5zbW9kIGVzcCBkbWE9MwotCi1UaGUgcnhfdHJpZ2dlcj0gYW5kIHR4X3RyaWdnZXI9IG9wdGlvbnMgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBGSUZPIHRyaWdnZXIKLWxldmVscy4gIFRoZXkgc3BlY2lmeSB3aGVuIHRoZSBFU1AgY2FyZCBzaG91bGQgc2VuZCBhbiBpbnRlcnJ1cHQuICBMYXJnZXIKLXZhbHVlcyB3aWxsIGRlY3JlYXNlIHRoZSBudW1iZXIgb2YgaW50ZXJydXB0czsgaG93ZXZlciwgYSB2YWx1ZSB0b28gaGlnaCBtYXkKLXJlc3VsdCBpbiBkYXRhIGxvc3MuICBWYWxpZCB2YWx1ZXMgYXJlIDEgdGhyb3VnaCAxMDIzLCB3aXRoIDc2OCBiZWluZyB0aGUKLWRlZmF1bHQuICBGb3IgZXhhbXBsZSwgdG8gc2V0IHRoZSByZWNlaXZlIHRyaWdnZXIgbGV2ZWwgdG8gNTEyIGJ5dGVzIGFuZCB0aGUKLXRyYW5zbWl0IHRyaWdnZXIgbGV2ZWwgdG8gNzAwIGJ5dGVzLCB0aGUgaW5zbW9kIGNvbW1hbmQgd291bGQgYmU6Ci0KLWluc21vZCBlc3AgcnhfdHJpZ2dlcj01MTIgdHhfdHJpZ2dlcj03MDAKLQotVGhlIGZsb3dfb2ZmPSBhbmQgZmxvd19vbj0gb3B0aW9ucyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGhhcmR3YXJlIGZsb3cgb2ZmLwotZmxvdyBvbiBsZXZlbHMuICBUaGUgZmxvdyBvbiBsZXZlbCBtdXN0IGJlIGxvd2VyIHRoYW4gdGhlIGZsb3cgb2ZmIGxldmVsLCBhbmQKLXRoZSBmbG93IG9mZiBsZXZlbCBzaG91bGQgYmUgaGlnaGVyIHRoYW4gcnhfdHJpZ2dlci4gIFZhbGlkIHZhbHVlcyBhcmUgMQotdGhyb3VnaCAxMDIzLCB3aXRoIDEwMTYgYmVpbmcgdGhlIGRlZmF1bHQgZmxvdyBvZmYgbGV2ZWwgYW5kIDk0NCBiZWluZyB0aGUKLWRlZmF1bHQgZmxvdyBvbiBsZXZlbC4gIEZvciBleGFtcGxlLCB0byBzZXQgdGhlIGZsb3cgb2ZmIGxldmVsIHRvIDEwMDAgYnl0ZXMKLWFuZCB0aGUgZmxvdyBvbiBsZXZlbCB0byA5MzUgYnl0ZXMsIHRoZSBpbnNtb2QgY29tbWFuZCB3b3VsZCBiZToKLQotaW5zbW9kIGVzcCBmbG93X29mZj0xMDAwIGZsb3dfb249OTM1Ci0KLVRoZSByeF90aW1lb3V0PSBvcHRpb24gY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSByZWNlaXZlIHRpbWVvdXQgdmFsdWUuICBUaGlzCi12YWx1ZSBpbmRpY2F0ZXMgaG93IGxvbmcgYWZ0ZXIgcmVjZWl2aW5nIHRoZSBsYXN0IGNoYXJhY3RlciB0aGF0IHRoZSBFU1AgY2FyZAotc2hvdWxkIHdhaXQgYmVmb3JlIHNpZ25hbGxpbmcgYW4gaW50ZXJydXB0LiAgVmFsaWQgdmFsdWVzIGFyZSAwIHRob3VnaCAyNTUsCi13aXRoIDEyOCBiZWluZyB0aGUgZGVmYXVsdC4gIEEgdmFsdWUgdG9vIGhpZ2ggd2lsbCBpbmNyZWFzZSBsYXRlbmN5LCBhbmQgYQotdmFsdWUgdG9vIGxvdyB3aWxsIGNhdXNlIHVubmVjZXNzYXJ5IGludGVycnVwdHMuICBGb3IgZXhhbXBsZSwgdG8gc2V0IHRoZQotcmVjZWl2ZSB0aW1lb3V0IHRvIDI1NSwgdGhlIGluc21vZCBjb21tYW5kIHdvdWxkIGJlOgotCi1pbnNtb2QgZXNwIHJ4X3RpbWVvdXQ9MjU1Ci0KLVRoZSBwaW9fdGhyZXNob2xkPSBvcHRpb24gc2V0cyB0aGUgdGhyZXNob2xkIChpbiBudW1iZXIgb2YgY2hhcmFjdGVycykgZm9yCi11c2luZyBQSU8gbW9kZSBpbnN0ZWFkIG9mIERNQSBtb2RlLiAgRm9yIGV4YW1wbGUsIGlmIHRoaXMgdmFsdWUgaXMgMzIsCi10cmFuc2ZlcnMgb2YgMzIgYnl0ZXMgb3IgbGVzcyB3aWxsIGFsd2F5cyB1c2UgUElPIG1vZGUuCi0KLWluc21vZCBlc3AgcGlvX3RocmVzaG9sZD0zMgotCi1NdWx0aXBsZSBvcHRpb25zIGNhbiBiZSBsaXN0ZWQgb24gdGhlIGluc21vZCBjb21tYW5kIGxpbmUgYnkgc2VwYXJhdGluZyBlYWNoCi1vcHRpb24gd2l0aCBhIHNwYWNlLiAgRm9yIGV4YW1wbGU6Ci0KLWluc21vZCBlc3AgZG1hPTMgdHJpZ2dlcj01MTIKLQotVGhlIGVzcCBtb2R1bGUgY2FuIGJlIGF1dG9tYXRpY2FsbHkgbG9hZGVkIHdoZW4gbmVlZGVkLiAgVG8gY2F1c2UgdGhpcyB0bwotaGFwcGVuLCBhZGQgdGhlIGZvbGxvd2luZyBsaW5lcyB0byAvZXRjL21vZHByb2JlLmNvbmYgKHJlcGxhY2luZyB0aGUgbGFzdCBsaW5lCi13aXRoIG9wdGlvbnMgZm9yIHlvdXIgY29uZmlndXJhdGlvbik6Ci0KLWFsaWFzIGNoYXItbWFqb3ItNTcgZXNwCi1hbGlhcyBjaGFyLW1ham9yLTU4IGVzcAotb3B0aW9ucyBlc3AgaXJxPTAsMCwwLDAsMCwwLDMsMCBkaXZpc29yPTAsMCwwLDAsMCwwLDB4NCwwCi0KLVlvdSBtYXkgYWxzbyBuZWVkIHRvIHJ1biAnZGVwbW9kIC1hJy4KLQotRGV2aWNlcyBtdXN0IGJlIGNyZWF0ZWQgbWFudWFsbHkuICBUbyBjcmVhdGUgdGhlIGRldmljZXMsIG5vdGUgdGhlIG91dHB1dCBmcm9tCi10aGUgbW9kdWxlIGFmdGVyIGl0IGlzIGluc2VydGVkLiAgVGhlIG91dHB1dCB3aWxsIGFwcGVhciBpbiB0aGUgbG9jYXRpb24gd2hlcmUKLWtlcm5lbCBtZXNzYWdlcyB1c3VhbGx5IGFwcGVhciAodXN1YWxseSAvdmFyL2FkbS9tZXNzYWdlcykuICBDcmVhdGUgdHdvIGRldmljZXMKLWZvciBlYWNoICd0dHknIG1lbnRpb25lZCwgb25lIHdpdGggbWFqb3Igb2YgNTcgYW5kIHRoZSBvdGhlciB3aXRoIG1ham9yIG9mIDU4LgotVGhlIG1pbm9yIG51bWJlciBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIHR0eSBudW1iZXIgcmVwb3J0ZWQuICBUaGUgY29tbWFuZHMKLXdvdWxkIGJlIChyZXBsYWNlID8gd2l0aCB0aGUgdHR5IG51bWJlcik6Ci0KLW1rbm9kIC9kZXYvdHR5UD8gYyA1NyA/Ci1ta25vZCAvZGV2L2N1cD8gYyA1OCA/Ci0KLUZvciBleGFtcGxlLCBpZiB0aGUgZm9sbG93aW5nIGxpbmUgYXBwZWFyczoKLQotT2N0IDI0IDE4OjE3OjIzIHRlY2hubyBrZXJuZWw6IHR0eVA4IGF0IDB4MDE0MCAoaXJxID0gMykgaXMgYW4gRVNQIHByaW1hcnkgcG9ydAotCi0uLi50d28gZGV2aWNlcyBzaG91bGQgYmUgY3JlYXRlZDoKLQotbWtub2QgL2Rldi90dHlQOCBjIDU3IDgKLW1rbm9kIC9kZXYvY3VwOCBjIDU4IDgKLQotWW91IG1heSBuZWVkIHRvIHNldCB0aGUgcGVybWlzc2lvbnMgb24gdGhlIGRldmljZXM6Ci0KLWNobW9kIDY2NiAvZGV2L3R0eVAqCi1jaG1vZCA2NjYgL2Rldi9jdXAqCi0KLVRoZSBFU1AgbW9kdWxlIGFuZCB0aGUgc2VyaWFsIG1vZHVsZSBzaG91bGQgbm90IGNvbmZsaWN0ICh0aGV5IGNhbiBiZSB1c2VkIGF0Ci10aGUgc2FtZSB0aW1lKS4gIEFmdGVyIHRoZSBFU1AgbW9kdWxlIGhhcyBiZWVuIGxvYWRlZCB0aGUgcG9ydHMgb24gdGhlIEVTUCBjYXJkCi13aWxsIG5vIGxvbmdlciBiZSBhY2Nlc3NpYmxlIGJ5IHRoZSBzZXJpYWwgZHJpdmVyLgotCi1JZiBJL08gZXJyb3JzIGFyZSBleHBlcmllbmNlZCB3aGVuIGFjY2Vzc2luZyB0aGUgcG9ydCwgY2hlY2sgZm9yIElSUSBhbmQgRE1BCi1jb25mbGljdHMgKCdjYXQgL3Byb2MvaW50ZXJydXB0cycgYW5kICdjYXQgL3Byb2MvZG1hJyBmb3IgYSBsaXN0IG9mIElSUXMgYW5kCi1ETUFzIGN1cnJlbnRseSBpbiB1c2UpLgotCi1FbmpveSEKLUFuZHJldyBKLiBSb2JpbnNvbiA8YXJvYmluc29Abnl4Lm5ldD4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2VyaWFsL3R0eS50eHQgYi9Eb2N1bWVudGF0aW9uL3NlcmlhbC90dHkudHh0CmluZGV4IDhlNjVjNDQuLjVlNTM0OWEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2VyaWFsL3R0eS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zZXJpYWwvdHR5LnR4dApAQCAtNDIsNyArNDIsOCBAQAogb3BlbigpCQktCUNhbGxlZCB3aGVuIHRoZSBsaW5lIGRpc2NpcGxpbmUgaXMgYXR0YWNoZWQgdG8KIAkJCXRoZSB0ZXJtaW5hbC4gTm8gb3RoZXIgY2FsbCBpbnRvIHRoZSBsaW5lCiAJCQlkaXNjaXBsaW5lIGZvciB0aGlzIHR0eSB3aWxsIG9jY3VyIHVudGlsIGl0Ci0JCQljb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LiBDYW4gc2xlZXAuCisJCQljb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LiBSZXR1cm5pbmcgYW4gZXJyb3Igd2lsbAorCQkJcHJldmVudCB0aGUgbGRpc2MgZnJvbSBiZWluZyBhdHRhY2hlZC4gQ2FuIHNsZWVwLgogCiBjbG9zZSgpCQktCVRoaXMgaXMgY2FsbGVkIG9uIGEgdGVybWluYWwgd2hlbiB0aGUgbGluZQogCQkJZGlzY2lwbGluZSBpcyBiZWluZyB1bnBsdWdnZWQuIEF0IHRoZSBwb2ludCBvZgpAQCAtNTIsNyArNTMsNyBAQAogaGFuZ3VwKCkJLQlDYWxsZWQgd2hlbiB0aGUgdHR5IGxpbmUgaXMgaHVuZyB1cC4KIAkJCVRoZSBsaW5lIGRpc2NpcGxpbmUgc2hvdWxkIGNlYXNlIEkvTyB0byB0aGUgdHR5LgogCQkJTm8gZnVydGhlciBjYWxscyBpbnRvIHRoZSBsZGlzYyBjb2RlIHdpbGwgb2NjdXIuCi0JCQlDYW4gc2xlZXAuCisJCQlUaGUgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQuIENhbiBzbGVlcC4KIAogd3JpdGUoKQkJLQlBIHByb2Nlc3MgaXMgd3JpdGluZyBkYXRhIHRocm91Z2ggdGhlIGxpbmUKIAkJCWRpc2NpcGxpbmUuICBNdWx0aXBsZSB3cml0ZSBjYWxscyBhcmUgc2VyaWFsaXplZApAQCAtODMsNiArODQsMTAgQEAKIAkJCXRoYXQgbWlnaHQgYmUgZm9yIHRoZSBsZGlzYy4gTXVsdGlwbGUgaW9jdGwgY2FsbHMKIAkJCW1heSBvY2N1ciBpbiBwYXJhbGxlbC4gTWF5IHNsZWVwLiAKIAorY29tcGF0X2lvY3RsKCkJLQlDYWxsZWQgd2hlbiBhIDMyIGJpdCBpb2N0bCBpcyBoYW5kZWQgdG8gdGhlIHR0eSBsYXllcgorCQkJdGhhdCBtaWdodCBiZSBmb3IgdGhlIGxkaXNjLiBNdWx0aXBsZSBpb2N0bCBjYWxscworCQkJbWF5IG9jY3VyIGluIHBhcmFsbGVsLiBNYXkgc2xlZXAuCisKIERyaXZlciBTaWRlIEludGVyZmFjZXM6CiAKIHJlY2VpdmVfYnVmKCkJLQlIYW5kIGJ1ZmZlcnMgb2YgYnl0ZXMgZnJvbSB0aGUgZHJpdmVyIHRvIHRoZSBsZGlzYwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zcGlubG9ja3MudHh0IGIvRG9jdW1lbnRhdGlvbi9zcGlubG9ja3MudHh0CmluZGV4IDYxOTY5OWQuLjE3OGM4MzEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3BpbmxvY2tzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NwaW5sb2Nrcy50eHQKQEAgLTEsNzMgKzEsOCBAQAotU1BJTl9MT0NLX1VOTE9DS0VEIGFuZCBSV19MT0NLX1VOTE9DS0VEIGRlZmVhdCBsb2NrZGVwIHN0YXRlIHRyYWNraW5nIGFuZAotYXJlIGhlbmNlIGRlcHJlY2F0ZWQuCitMZXNzb24gMTogU3BpbiBsb2NrcwogCi1QbGVhc2UgdXNlIERFRklORV9TUElOTE9DSygpL0RFRklORV9SV0xPQ0soKSBvcgotX19TUElOX0xPQ0tfVU5MT0NLRUQoKS9fX1JXX0xPQ0tfVU5MT0NLRUQoKSBhcyBhcHByb3ByaWF0ZSBmb3Igc3RhdGljCi1pbml0aWFsaXphdGlvbi4KK1RoZSBtb3N0IGJhc2ljIHByaW1pdGl2ZSBmb3IgbG9ja2luZyBpcyBzcGlubG9jay4KIAotTW9zdCBvZiB0aGUgdGltZSwgeW91IGNhbiBzaW1wbHkgdHVybjoKLQotCXN0YXRpYyBzcGlubG9ja190IHh4eF9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOwotCi1pbnRvOgotCi0Jc3RhdGljIERFRklORV9TUElOTE9DSyh4eHhfbG9jayk7Ci0KLVN0YXRpYyBzdHJ1Y3R1cmUgbWVtYmVyIHZhcmlhYmxlcyBnbyBmcm9tOgotCi0Jc3RydWN0IGZvbyBiYXIgewotCQkubG9jawk9CVNQSU5fTE9DS19VTkxPQ0tFRDsKLQl9OwotCi10bzoKLQotCXN0cnVjdCBmb28gYmFyIHsKLQkJLmxvY2sJPQlfX1NQSU5fTE9DS19VTkxPQ0tFRChiYXIubG9jayk7Ci0JfTsKLQotRGVjbGFyYXRpb24gb2Ygc3RhdGljIHJ3X2xvY2tzIHVuZGVyZ28gYSBzaW1pbGFyIHRyYW5zZm9ybWF0aW9uLgotCi1EeW5hbWljIGluaXRpYWxpemF0aW9uLCB3aGVuIG5lY2Vzc2FyeSwgbWF5IGJlIHBlcmZvcm1lZCBhcwotZGVtb25zdHJhdGVkIGJlbG93LgotCi0gICBzcGlubG9ja190IHh4eF9sb2NrOwotICAgcndsb2NrX3QgeHh4X3J3X2xvY2s7Ci0KLSAgIHN0YXRpYyBpbnQgX19pbml0IHh4eF9pbml0KHZvaWQpCi0gICB7Ci0gICAJc3Bpbl9sb2NrX2luaXQoJnh4eF9sb2NrKTsKLQlyd2xvY2tfaW5pdCgmeHh4X3J3X2xvY2spOwotCS4uLgotICAgfQotCi0gICBtb2R1bGVfaW5pdCh4eHhfaW5pdCk7Ci0KLVRoZSBmb2xsb3dpbmcgZGlzY3Vzc2lvbiBpcyBzdGlsbCB2YWxpZCwgaG93ZXZlciwgd2l0aCB0aGUgZHluYW1pYwotaW5pdGlhbGl6YXRpb24gb2Ygc3BpbmxvY2tzIG9yIHdpdGggREVGSU5FX1NQSU5MT0NLLCBldGMuLCB1c2VkCi1pbnN0ZWFkIG9mIFNQSU5fTE9DS19VTkxPQ0tFRC4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotT24gRnJpLCAyIEphbiAxOTk4LCBEb3VnIExlZGZvcmQgd3JvdGU6Ci0+IAotPiBJJ20gd29ya2luZyBvbiBtYWtpbmcgdGhlIGFpYzd4eHggZHJpdmVyIG1vcmUgU01QIGZyaWVuZGx5IChhcyB3ZWxsIGFzCi0+IGltcG9ydGluZyB0aGUgbGF0ZXN0IEZyZWVCU0Qgc2VxdWVuY2VyIGNvZGUgdG8gaGF2ZSA3ODk1IHN1cHBvcnQpIGFuZCB3YW50ZWQKLT4gdG8gZ2V0IHNvbWUgaW5mbyBmcm9tIHlvdS4gIFRoZSBnb2FsIGhlcmUgaXMgdG8gbWFrZSB0aGUgdmFyaW91cyByb3V0aW5lcwotPiBTTVAgc2FmZSBhcyB3ZWxsIGFzIFVQIHNhZmUgZHVyaW5nIGludGVycnVwdHMgYW5kIG90aGVyIG1hbmlwdWxhdGluZwotPiByb3V0aW5lcy4gIFNvIGZhciwgSSd2ZSBhZGRlZCBhIHNwaW5fbG9jayB2YXJpYWJsZSB0byB0aGluZ3MgbGlrZSBteSBxdWV1ZQotPiBzdHJ1Y3RzLiAgTm93LCBmcm9tIHdoYXQgSSByZWNhbGwsIHRoZXJlIGFyZSBzb21lIHNwaW4gbG9jayBmdW5jdGlvbnMgSSBjYW4KLT4gdXNlIHRvIGxvY2sgdGhlc2Ugc3BpbiBsb2NrcyBmcm9tIG90aGVyIHVzZSBhcyBvcHBvc2VkIHRvIGEgKG5hc3R5KQotPiBzYXZlX2ZsYWdzKCk7IGNsaSgpOyBzdHVmZjsgcmVzdG9yZV9mbGFncygpOyBjb25zdHJ1Y3QuICBXaGVyZSBkbyBJIGZpbmQKLT4gdGhlc2Ugcm91dGluZXMgYW5kIGdvIGFib3V0IG1ha2luZyB1c2Ugb2YgdGhlbT8gIERvIHRoZXkgb25seSBsb2NrIG9uIGEKLT4gcGVyLXByb2Nlc3NvciBiYXNpcyBvciBjYW4gdGhleSBhbHNvIGxvY2sgc2F5IGFuIGludGVycnVwdCByb3V0aW5lIGZyb20KLT4gbXVja2luZyB3aXRoIGEgcXVldWUgaWYgdGhlIHF1ZXVlIHJvdXRpbmUgd2FzIG1hbmlwdWxhdGluZyBpdCB3aGVuIHRoZQotPiBpbnRlcnJ1cHQgb2NjdXJyZWQsIG9yIHNob3VsZCBJIHN0aWxsIHVzZSBhIGNsaSgpOyBiYXNlZCBjb25zdHJ1Y3Qgb24gdGhhdAotPiBvbmU/Ci0KLVNlZSA8YXNtL3NwaW5sb2NrLmg+LiBUaGUgYmFzaWMgdmVyc2lvbiBpczoKLQotICAgc3BpbmxvY2tfdCB4eHhfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKLQorc3RhdGljIERFRklORV9TUElOTE9DSyh4eHhfbG9jayk7CiAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC03NSwxMyArMTAsMTEgQEAKIAkuLi4gY3JpdGljYWwgc2VjdGlvbiBoZXJlIC4uCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHh4X2xvY2ssIGZsYWdzKTsKIAotYW5kIHRoZSBhYm92ZSBpcyBhbHdheXMgc2FmZS4gSXQgd2lsbCBkaXNhYmxlIGludGVycnVwdHMgX2xvY2FsbHlfLCBidXQgdGhlCitUaGUgYWJvdmUgaXMgYWx3YXlzIHNhZmUuIEl0IHdpbGwgZGlzYWJsZSBpbnRlcnJ1cHRzIF9sb2NhbGx5XywgYnV0IHRoZQogc3BpbmxvY2sgaXRzZWxmIHdpbGwgZ3VhcmFudGVlIHRoZSBnbG9iYWwgbG9jaywgc28gaXQgd2lsbCBndWFyYW50ZWUgdGhhdAogdGhlcmUgaXMgb25seSBvbmUgdGhyZWFkLW9mLWNvbnRyb2wgd2l0aGluIHRoZSByZWdpb24ocykgcHJvdGVjdGVkIGJ5IHRoYXQKLWxvY2suIAotCi1Ob3RlIHRoYXQgaXQgd29ya3Mgd2VsbCBldmVuIHVuZGVyIFVQIC0gdGhlIGFib3ZlIHNlcXVlbmNlIHVuZGVyIFVQCi1lc3NlbnRpYWxseSBpcyBqdXN0IHRoZSBzYW1lIGFzIGRvaW5nIGEKK2xvY2suIFRoaXMgd29ya3Mgd2VsbCBldmVuIHVuZGVyIFVQLiBUaGUgYWJvdmUgc2VxdWVuY2UgdW5kZXIgVVAKK2Vzc2VudGlhbGx5IGlzIGp1c3QgdGhlIHNhbWUgYXMgZG9pbmcKIAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTkxLDE1ICsyNCwxMyBAQAogCiBzbyB0aGUgY29kZSBkb2VzIF9ub3RfIG5lZWQgdG8gd29ycnkgYWJvdXQgVVAgdnMgU01QIGlzc3VlczogdGhlIHNwaW5sb2Nrcwogd29yayBjb3JyZWN0bHkgdW5kZXIgYm90aCAoYW5kIHNwaW5sb2NrcyBhcmUgYWN0dWFsbHkgbW9yZSBlZmZpY2llbnQgb24KLWFyY2hpdGVjdHVyZXMgdGhhdCBhbGxvdyBkb2luZyB0aGUgInNhdmVfZmxhZ3MgKyBjbGkiIGluIG9uZSBnbyBiZWNhdXNlIEkKLWRvbid0IGV4cG9ydCB0aGF0IGludGVyZmFjZSBub3JtYWxseSkuCithcmNoaXRlY3R1cmVzIHRoYXQgYWxsb3cgZG9pbmcgdGhlICJzYXZlX2ZsYWdzICsgY2xpIiBpbiBvbmUgb3BlcmF0aW9uKS4KIAotTk9URSBOT1RFIE5PVEUhIFRoZSByZWFzb24gdGhlIHNwaW5sb2NrIGlzIHNvIG11Y2ggZmFzdGVyIHRoYW4gYSBnbG9iYWwKLWludGVycnVwdCBsb2NrIHVuZGVyIFNNUCBpcyBleGFjdGx5IGJlY2F1c2UgaXQgZGlzYWJsZXMgaW50ZXJydXB0cyBvbmx5IG9uCi10aGUgbG9jYWwgQ1BVLiBUaGUgc3Bpbi1sb2NrIGlzIHNhZmUgb25seSB3aGVuIHlvdSBfYWxzb18gdXNlIHRoZSBsb2NrCi1pdHNlbGYgdG8gZG8gbG9ja2luZyBhY3Jvc3MgQ1BVJ3MsIHdoaWNoIGltcGxpZXMgdGhhdCBFVkVSWVRISU5HIHRoYXQKLXRvdWNoZXMgYSBzaGFyZWQgdmFyaWFibGUgaGFzIHRvIGFncmVlIGFib3V0IHRoZSBzcGlubG9jayB0aGV5IHdhbnQgdG8KLXVzZS4KKyAgIE5PVEUhIEltcGxpY2F0aW9ucyBvZiBzcGluX2xvY2tzIGZvciBtZW1vcnkgYXJlIGZ1cnRoZXIgZGVzY3JpYmVkIGluOgorCisgICAgIERvY3VtZW50YXRpb24vbWVtb3J5LWJhcnJpZXJzLnR4dAorICAgICAgICg1KSBMT0NLIG9wZXJhdGlvbnMuCisgICAgICAgKDYpIFVOTE9DSyBvcGVyYXRpb25zLgogCiBUaGUgYWJvdmUgaXMgdXN1YWxseSBwcmV0dHkgc2ltcGxlICh5b3UgdXN1YWxseSBuZWVkIGFuZCB3YW50IG9ubHkgb25lCiBzcGlubG9jayBmb3IgbW9zdCB0aGluZ3MgLSB1c2luZyBtb3JlIHRoYW4gb25lIHNwaW5sb2NrIGNhbiBtYWtlIHRoaW5ncyBhCkBAIC0xMjAsMjAgKzUxLDI0IEBACiB0aGVuIHRoZXkgYXJlIE5PVCBtdXR1YWxseSBleGNsdXNpdmUsIGFuZCB0aGUgY3JpdGljYWwgcmVnaW9ucyBjYW4gaGFwcGVuCiBhdCB0aGUgc2FtZSB0aW1lIG9uIHR3byBkaWZmZXJlbnQgQ1BVJ3MuIFRoYXQncyBmaW5lIHBlciBzZSwgYnV0IHRoZQogY3JpdGljYWwgcmVnaW9ucyBoYWQgYmV0dGVyIGJlIGNyaXRpY2FsIGZvciBkaWZmZXJlbnQgdGhpbmdzIChpZSB0aGV5Ci1jYW4ndCBzdG9tcCBvbiBlYWNoIG90aGVyKS4gCitjYW4ndCBzdG9tcCBvbiBlYWNoIG90aGVyKS4KIAogVGhlIGFib3ZlIGlzIGEgcHJvYmxlbSBtYWlubHkgaWYgeW91IGVuZCB1cCBtaXhpbmcgY29kZSAtIGZvciBleGFtcGxlIHRoZQogcm91dGluZXMgaW4gbGxfcndfYmxvY2soKSB0ZW5kIHRvIHVzZSBjbGkvc3RpIHRvIHByb3RlY3QgdGhlIGF0b21pY2l0eSBvZgogdGhlaXIgYWN0aW9ucywgYW5kIGlmIGEgZHJpdmVyIHVzZXMgc3BpbmxvY2tzIGluc3RlYWQgdGhlbiB5b3Ugc2hvdWxkCi10aGluayBhYm91dCBpc3N1ZXMgbGlrZSB0aGUgYWJvdmUuLgordGhpbmsgYWJvdXQgaXNzdWVzIGxpa2UgdGhlIGFib3ZlLgogCiBUaGlzIGlzIHJlYWxseSB0aGUgb25seSByZWFsbHkgaGFyZCBwYXJ0IGFib3V0IHNwaW5sb2Nrczogb25jZSB5b3Ugc3RhcnQKIHVzaW5nIHNwaW5sb2NrcyB0aGV5IHRlbmQgdG8gZXhwYW5kIHRvIGFyZWFzIHlvdSBtaWdodCBub3QgaGF2ZSBub3RpY2VkCiBiZWZvcmUsIGJlY2F1c2UgeW91IGhhdmUgdG8gbWFrZSBzdXJlIHRoZSBzcGlubG9ja3MgY29ycmVjdGx5IHByb3RlY3QgdGhlCiBzaGFyZWQgZGF0YSBzdHJ1Y3R1cmVzIF9ldmVyeXdoZXJlXyB0aGV5IGFyZSB1c2VkLiBUaGUgc3BpbmxvY2tzIGFyZSBtb3N0Ci1lYXNpbHkgYWRkZWQgdG8gcGxhY2VzIHRoYXQgYXJlIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQgb2Ygb3RoZXIgY29kZSAoaWUKLWludGVybmFsIGRyaXZlciBkYXRhIHN0cnVjdHVyZXMgdGhhdCBub2JvZHkgZWxzZSBldmVyIHRvdWNoZXMsIGZvcgotZXhhbXBsZSkuIAorZWFzaWx5IGFkZGVkIHRvIHBsYWNlcyB0aGF0IGFyZSBjb21wbGV0ZWx5IGluZGVwZW5kZW50IG9mIG90aGVyIGNvZGUgKGZvcgorZXhhbXBsZSwgaW50ZXJuYWwgZHJpdmVyIGRhdGEgc3RydWN0dXJlcyB0aGF0IG5vYm9keSBlbHNlIGV2ZXIgdG91Y2hlcykuCisKKyAgIE5PVEUhIFRoZSBzcGluLWxvY2sgaXMgc2FmZSBvbmx5IHdoZW4geW91IF9hbHNvXyB1c2UgdGhlIGxvY2sgaXRzZWxmCisgICB0byBkbyBsb2NraW5nIGFjcm9zcyBDUFUncywgd2hpY2ggaW1wbGllcyB0aGF0IEVWRVJZVEhJTkcgdGhhdAorICAgdG91Y2hlcyBhIHNoYXJlZCB2YXJpYWJsZSBoYXMgdG8gYWdyZWUgYWJvdXQgdGhlIHNwaW5sb2NrIHRoZXkgd2FudAorICAgdG8gdXNlLgogCiAtLS0tCiAKQEAgLTE0MSwxNCArNzYsMTggQEAKIAogSWYgeW91ciBkYXRhIGFjY2Vzc2VzIGhhdmUgYSB2ZXJ5IG5hdHVyYWwgcGF0dGVybiB3aGVyZSB5b3UgdXN1YWxseSB0ZW5kCiB0byBtb3N0bHkgcmVhZCBmcm9tIHRoZSBzaGFyZWQgdmFyaWFibGVzLCB0aGUgcmVhZGVyLXdyaXRlciBsb2NrcwotKHJ3X2xvY2spIHZlcnNpb25zIG9mIHRoZSBzcGlubG9ja3MgYXJlIG9mdGVuIG5pY2VyLiBUaGV5IGFsbG93IG11bHRpcGxlCisocndfbG9jaykgdmVyc2lvbnMgb2YgdGhlIHNwaW5sb2NrcyBhcmUgc29tZXRpbWVzIHVzZWZ1bC4gVGhleSBhbGxvdyBtdWx0aXBsZQogcmVhZGVycyB0byBiZSBpbiB0aGUgc2FtZSBjcml0aWNhbCByZWdpb24gYXQgb25jZSwgYnV0IGlmIHNvbWVib2R5IHdhbnRzCi10byBjaGFuZ2UgdGhlIHZhcmlhYmxlcyBpdCBoYXMgdG8gZ2V0IGFuIGV4Y2x1c2l2ZSB3cml0ZSBsb2NrLiBUaGUKLXJvdXRpbmVzIGxvb2sgdGhlIHNhbWUgYXMgYWJvdmU6Cit0byBjaGFuZ2UgdGhlIHZhcmlhYmxlcyBpdCBoYXMgdG8gZ2V0IGFuIGV4Y2x1c2l2ZSB3cml0ZSBsb2NrLgorCisgICBOT1RFISByZWFkZXItd3JpdGVyIGxvY2tzIHJlcXVpcmUgbW9yZSBhdG9taWMgbWVtb3J5IG9wZXJhdGlvbnMgdGhhbgorICAgc2ltcGxlIHNwaW5sb2Nrcy4gIFVubGVzcyB0aGUgcmVhZGVyIGNyaXRpY2FsIHNlY3Rpb24gaXMgbG9uZywgeW91CisgICBhcmUgYmV0dGVyIG9mZiBqdXN0IHVzaW5nIHNwaW5sb2Nrcy4KKworVGhlIHJvdXRpbmVzIGxvb2sgdGhlIHNhbWUgYXMgYWJvdmU6CiAKICAgIHJ3bG9ja190IHh4eF9sb2NrID0gUldfTE9DS19VTkxPQ0tFRDsKIAotCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXJlYWRfbG9ja19pcnFzYXZlKCZ4eHhfbG9jaywgZmxhZ3MpOwpAQCAtMTU5LDE4ICs5OCwyMSBAQAogCS4uIHJlYWQgYW5kIHdyaXRlIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIGluZm8gLi4uCiAJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJnh4eF9sb2NrLCBmbGFncyk7CiAKLVRoZSBhYm92ZSBraW5kIG9mIGxvY2sgaXMgdXNlZnVsIGZvciBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBsaWtlIGxpbmtlZAotbGlzdHMgZXRjLCBlc3BlY2lhbGx5IHdoZW4geW91IGtub3cgdGhhdCBtb3N0IG9mIHRoZSB3b3JrIGlzIHRvIGp1c3QKLXRyYXZlcnNlIHRoZSBsaXN0IHNlYXJjaGluZyBmb3IgZW50cmllcyB3aXRob3V0IGNoYW5naW5nIHRoZSBsaXN0IGl0c2VsZiwKLWZvciBleGFtcGxlLiBUaGVuIHlvdSBjYW4gdXNlIHRoZSByZWFkIGxvY2sgZm9yIHRoYXQga2luZCBvZiBsaXN0Ci10cmF2ZXJzYWwsIHdoaWNoIGFsbG93cyBtYW55IGNvbmN1cnJlbnQgcmVhZGVycy4gQW55dGhpbmcgdGhhdCBfY2hhbmdlc18KLXRoZSBsaXN0IHdpbGwgaGF2ZSB0byBnZXQgdGhlIHdyaXRlIGxvY2suIAorVGhlIGFib3ZlIGtpbmQgb2YgbG9jayBtYXkgYmUgdXNlZnVsIGZvciBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBsaWtlCitsaW5rZWQgbGlzdHMsIGVzcGVjaWFsbHkgc2VhcmNoaW5nIGZvciBlbnRyaWVzIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGxpc3QKK2l0c2VsZi4gIFRoZSByZWFkIGxvY2sgYWxsb3dzIG1hbnkgY29uY3VycmVudCByZWFkZXJzLiAgQW55dGhpbmcgdGhhdAorX2NoYW5nZXNfIHRoZSBsaXN0IHdpbGwgaGF2ZSB0byBnZXQgdGhlIHdyaXRlIGxvY2suCiAKLU5vdGU6IHlvdSBjYW5ub3QgInVwZ3JhZGUiIGEgcmVhZC1sb2NrIHRvIGEgd3JpdGUtbG9jaywgc28gaWYgeW91IGF0IF9hbnlfCisgICBOT1RFISBSQ1UgaXMgYmV0dGVyIGZvciBsaXN0IHRyYXZlcnNhbCwgYnV0IHJlcXVpcmVzIGNhcmVmdWwKKyAgIGF0dGVudGlvbiB0byBkZXNpZ24gZGV0YWlsIChzZWUgRG9jdW1lbnRhdGlvbi9SQ1UvbGlzdFJDVS50eHQpLgorCitBbHNvLCB5b3UgY2Fubm90ICJ1cGdyYWRlIiBhIHJlYWQtbG9jayB0byBhIHdyaXRlLWxvY2ssIHNvIGlmIHlvdSBhdCBfYW55XwogdGltZSBuZWVkIHRvIGRvIGFueSBjaGFuZ2VzIChldmVuIGlmIHlvdSBkb24ndCBkbyBpdCBldmVyeSB0aW1lKSwgeW91IGhhdmUKLXRvIGdldCB0aGUgd3JpdGUtbG9jayBhdCB0aGUgdmVyeSBiZWdpbm5pbmcuIEkgY291bGQgZmFpcmx5IGVhc2lseSBhZGQgYQotcHJpbWl0aXZlIHRvIGNyZWF0ZSBhICJ1cGdyYWRlYWJsZSIgcmVhZC1sb2NrLCBidXQgaXQgaGFzbid0IGJlZW4gYW4gaXNzdWUKLXlldC4gVGVsbCBtZSBpZiB5b3UnZCB3YW50IG9uZS4gCit0byBnZXQgdGhlIHdyaXRlLWxvY2sgYXQgdGhlIHZlcnkgYmVnaW5uaW5nLgorCisgICBOT1RFISBXZSBhcmUgd29ya2luZyBoYXJkIHRvIHJlbW92ZSByZWFkZXItd3JpdGVyIHNwaW5sb2NrcyBpbiBtb3N0CisgICBjYXNlcywgc28gcGxlYXNlIGRvbid0IGFkZCBhIG5ldyBvbmUgd2l0aG91dCBjb25zZW5zdXMuICAoSW5zdGVhZCwgc2VlCisgICBEb2N1bWVudGF0aW9uL1JDVS9yY3UudHh0IGZvciBjb21wbGV0ZSBpbmZvcm1hdGlvbi4pCiAKIC0tLS0KIApAQCAtMjMzLDQgKzE3NSw0NiBAQAogCiAJCUxpbnVzCiAKKy0tLS0KIAorUmVmZXJlbmNlIGluZm9ybWF0aW9uOgorCitGb3IgZHluYW1pYyBpbml0aWFsaXphdGlvbiwgdXNlIHNwaW5fbG9ja19pbml0KCkgb3Igcndsb2NrX2luaXQoKSBhcworYXBwcm9wcmlhdGU6CisKKyAgIHNwaW5sb2NrX3QgeHh4X2xvY2s7CisgICByd2xvY2tfdCB4eHhfcndfbG9jazsKKworICAgc3RhdGljIGludCBfX2luaXQgeHh4X2luaXQodm9pZCkKKyAgIHsKKwlzcGluX2xvY2tfaW5pdCgmeHh4X2xvY2spOworCXJ3bG9ja19pbml0KCZ4eHhfcndfbG9jayk7CisJLi4uCisgICB9CisKKyAgIG1vZHVsZV9pbml0KHh4eF9pbml0KTsKKworRm9yIHN0YXRpYyBpbml0aWFsaXphdGlvbiwgdXNlIERFRklORV9TUElOTE9DSygpIC8gREVGSU5FX1JXTE9DSygpIG9yCitfX1NQSU5fTE9DS19VTkxPQ0tFRCgpIC8gX19SV19MT0NLX1VOTE9DS0VEKCkgYXMgYXBwcm9wcmlhdGUuCisKK1NQSU5fTE9DS19VTkxPQ0tFRCBhbmQgUldfTE9DS19VTkxPQ0tFRCBhcmUgZGVwcmVjYXRlZC4gIFRoZXNlIGludGVyZmVyZQord2l0aCBsb2NrZGVwIHN0YXRlIHRyYWNraW5nLgorCitNb3N0IG9mIHRoZSB0aW1lLCB5b3UgY2FuIHNpbXBseSB0dXJuOgorCXN0YXRpYyBzcGlubG9ja190IHh4eF9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworaW50bzoKKwlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHh4eF9sb2NrKTsKKworU3RhdGljIHN0cnVjdHVyZSBtZW1iZXIgdmFyaWFibGVzIGdvIGZyb206CisKKwlzdHJ1Y3QgZm9vIGJhciB7CisJCS5sb2NrCT0JU1BJTl9MT0NLX1VOTE9DS0VEOworCX07CisKK3RvOgorCisJc3RydWN0IGZvbyBiYXIgeworCQkubG9jawk9CV9fU1BJTl9MT0NLX1VOTE9DS0VEKGJhci5sb2NrKTsKKwl9OworCitEZWNsYXJhdGlvbiBvZiBzdGF0aWMgcndfbG9ja3MgdW5kZXJnbyBhIHNpbWlsYXIgdHJhbnNmb3JtYXRpb24uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3VzYi9wb3dlci1tYW5hZ2VtZW50LnR4dCBiL0RvY3VtZW50YXRpb24vdXNiL3Bvd2VyLW1hbmFnZW1lbnQudHh0CmluZGV4IGFkNjQyNjEuLmM3YzFkYzIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdXNiL3Bvd2VyLW1hbmFnZW1lbnQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdXNiL3Bvd2VyLW1hbmFnZW1lbnQudHh0CkBAIC0yLDcgKzIsNyBAQAogCiAJCSBBbGFuIFN0ZXJuIDxzdGVybkByb3dsYW5kLmhhcnZhcmQuZWR1PgogCi0JCQkgICAgT2N0b2JlciA1LCAyMDA3CisJCQkgICAgTm92ZW1iZXIgMTAsIDIwMDkKIAogCiAKQEAgLTEyMyw5ICsxMjMsOSBAQAogCiAJcG93ZXIvbGV2ZWwKIAotCQlUaGlzIGZpbGUgY29udGFpbnMgb25lIG9mIHRocmVlIHdvcmRzOiAib24iLCAiYXV0byIsCi0JCW9yICJzdXNwZW5kIi4gIFlvdSBjYW4gd3JpdGUgdGhvc2Ugd29yZHMgdG8gdGhlIGZpbGUKLQkJdG8gY2hhbmdlIHRoZSBkZXZpY2UncyBzZXR0aW5nLgorCQlUaGlzIGZpbGUgY29udGFpbnMgb25lIG9mIHR3byB3b3JkczogIm9uIiBvciAiYXV0byIuCisJCVlvdSBjYW4gd3JpdGUgdGhvc2Ugd29yZHMgdG8gdGhlIGZpbGUgdG8gY2hhbmdlIHRoZQorCQlkZXZpY2UncyBzZXR0aW5nLgogCiAJCSJvbiIgbWVhbnMgdGhhdCB0aGUgZGV2aWNlIHNob3VsZCBiZSByZXN1bWVkIGFuZAogCQlhdXRvc3VzcGVuZCBpcyBub3QgYWxsb3dlZC4gIChPZiBjb3Vyc2UsIHN5c3RlbQpAQCAtMTM0LDEwICsxMzQsMTAgQEAKIAkJImF1dG8iIGlzIHRoZSBub3JtYWwgc3RhdGUgaW4gd2hpY2ggdGhlIGtlcm5lbCBpcwogCQlhbGxvd2VkIHRvIGF1dG9zdXNwZW5kIGFuZCBhdXRvcmVzdW1lIHRoZSBkZXZpY2UuCiAKLQkJInN1c3BlbmQiIG1lYW5zIHRoYXQgdGhlIGRldmljZSBzaG91bGQgcmVtYWluCi0JCXN1c3BlbmRlZCwgYW5kIGF1dG9yZXN1bWUgaXMgbm90IGFsbG93ZWQuICAoQnV0IHJlbW90ZQotCQl3YWtldXAgbWF5IHN0aWxsIGJlIGFsbG93ZWQsIHNpbmNlIGl0IGlzIGNvbnRyb2xsZWQKLQkJc2VwYXJhdGVseSBieSB0aGUgcG93ZXIvd2FrZXVwIGF0dHJpYnV0ZS4pCisJCShJbiBrZXJuZWxzIHVwIHRvIDIuNi4zMiwgeW91IGNvdWxkIGFsc28gc3BlY2lmeQorCQkic3VzcGVuZCIsIG1lYW5pbmcgdGhhdCB0aGUgZGV2aWNlIHNob3VsZCByZW1haW4KKwkJc3VzcGVuZGVkIGFuZCBhdXRvcmVzdW1lIHdhcyBub3QgYWxsb3dlZC4gIFRoaXMKKwkJc2V0dGluZyBpcyBubyBsb25nZXIgc3VwcG9ydGVkLikKIAogCXBvd2VyL2F1dG9zdXNwZW5kCiAKQEAgLTMxMywxMyArMzEzLDE0IEBACiB0aGF0IGl0IHN1cHBvcnRzIGF1dG9zdXNwZW5kIGJ5IHNldHRpbmcgdGhlIC5zdXBwb3J0c19hdXRvc3VzcGVuZCBmbGFnCiBpbiBpdHMgdXNiX2RyaXZlciBzdHJ1Y3R1cmUuICBJdCBpcyB0aGVuIHJlc3BvbnNpYmxlIGZvciBpbmZvcm1pbmcgdGhlCiBVU0IgY29yZSB3aGVuZXZlciBvbmUgb2YgaXRzIGludGVyZmFjZXMgYmVjb21lcyBidXN5IG9yIGlkbGUuICBUaGUKLWRyaXZlciBkb2VzIHNvIGJ5IGNhbGxpbmcgdGhlc2UgZml2ZSBmdW5jdGlvbnM6Citkcml2ZXIgZG9lcyBzbyBieSBjYWxsaW5nIHRoZXNlIHNpeCBmdW5jdGlvbnM6CiAKIAlpbnQgIHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiAJdm9pZCB1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2Uoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwotCWludCAgdXNiX2F1dG9wbV9zZXRfaW50ZXJmYWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKIAlpbnQgIHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZV9hc3luYyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiAJdm9pZCB1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2VfYXN5bmMoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOworCXZvaWQgdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlX25vX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CisJdm9pZCB1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2Vfbm9fc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiAKIFRoZSBmdW5jdGlvbnMgd29yayBieSBtYWludGFpbmluZyBhIGNvdW50ZXIgaW4gdGhlIHVzYl9pbnRlcmZhY2UKIHN0cnVjdHVyZS4gIFdoZW4gaW50Zi0+cG1fdXNhZ2VfY291bnQgaXMgPiAwIHRoZW4gdGhlIGludGVyZmFjZSBpcwpAQCAtMzMxLDExICszMzIsMTMgQEAKIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlIGl0c2VsZiByYXRoZXIgdGhhbiBhbnkgb2YgaXRzIGludGVyZmFjZXMuCiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBieSB0aGUgVVNCIGNvcmUuKQogCi1UaGUgZHJpdmVyIG93bnMgaW50Zi0+cG1fdXNhZ2VfY291bnQ7IGl0IGNhbiBtb2RpZnkgdGhlIHZhbHVlIGhvd2V2ZXIKLWFuZCB3aGVuZXZlciBpdCBsaWtlcy4gIEEgbmljZSBhc3BlY3Qgb2YgdGhlIG5vbi1hc3luYyB1c2JfYXV0b3BtXyoKLXJvdXRpbmVzIGlzIHRoYXQgdGhlIGNoYW5nZXMgdGhleSBtYWtlIGFyZSBwcm90ZWN0ZWQgYnkgdGhlIHVzYl9kZXZpY2UKLXN0cnVjdHVyZSdzIFBNIG11dGV4ICh1ZGV2LT5wbV9tdXRleCk7IGhvd2V2ZXIgZHJpdmVycyBtYXkgY2hhbmdlCi1wbV91c2FnZV9jb3VudCB3aXRob3V0IGhvbGRpbmcgdGhlIG11dGV4LiAgRHJpdmVycyB1c2luZyB0aGUgYXN5bmMKK0RyaXZlcnMgbXVzdCBub3QgbW9kaWZ5IGludGYtPnBtX3VzYWdlX2NvdW50IGRpcmVjdGx5OyBpdHMgdmFsdWUKK3Nob3VsZCBiZSBjaGFuZ2VkIG9ubHkgYmUgdXNpbmcgdGhlIGZ1bmN0aW9ucyBsaXN0ZWQgYWJvdmUuICBEcml2ZXJzCithcmUgcmVzcG9uc2libGUgZm9yIGluc3VyaW5nIHRoYXQgdGhlIG92ZXJhbGwgY2hhbmdlIHRvIHBtX3VzYWdlX2NvdW50CitkdXJpbmcgdGhlaXIgbGlmZXRpbWUgYmFsYW5jZXMgb3V0IHRvIDAgKGl0IG1heSBiZSBuZWNlc3NhcnkgZm9yIHRoZQorZGlzY29ubmVjdCBtZXRob2QgdG8gY2FsbCB1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UoKSBvbmUgb3IgbW9yZSB0aW1lcwordG8gZnVsZmlsbCB0aGlzIHJlcXVpcmVtZW50KS4gIFRoZSBmaXJzdCB0d28gcm91dGluZXMgdXNlIHRoZSBQTSBtdXRleAoraW4gc3RydWN0IHVzYl9kZXZpY2UgZm9yIG11dHVhbCBleGNsdXNpb247IGRyaXZlcnMgdXNpbmcgdGhlIGFzeW5jCiByb3V0aW5lcyBhcmUgcmVzcG9uc2libGUgZm9yIHRoZWlyIG93biBzeW5jaHJvbml6YXRpb24gYW5kIG11dHVhbAogZXhjbHVzaW9uLgogCkBAIC0zNDcsMTEgKzM1MCw2IEBACiAJYXR0ZW1wdHMgYW4gYXV0b3N1c3BlbmQgaWYgdGhlIG5ldyB2YWx1ZSBpcyA8PSAwIGFuZCB0aGUKIAlkZXZpY2UgaXNuJ3Qgc3VzcGVuZGVkLgogCi0JdXNiX2F1dG9wbV9zZXRfaW50ZXJmYWNlKCkgbGVhdmVzIHBtX3VzYWdlX2NvdW50IGFsb25lLgotCUl0IGF0dGVtcHRzIGFuIGF1dG9yZXN1bWUgaWYgdGhlIHZhbHVlIGlzID4gMCBhbmQgdGhlIGRldmljZQotCWlzIHN1c3BlbmRlZCwgYW5kIGl0IGF0dGVtcHRzIGFuIGF1dG9zdXNwZW5kIGlmIHRoZSB2YWx1ZSBpcwotCTw9IDAgYW5kIHRoZSBkZXZpY2UgaXNuJ3Qgc3VzcGVuZGVkLgotCiAJdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlX2FzeW5jKCkgYW5kCiAJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlX2FzeW5jKCkgZG8gYWxtb3N0IHRoZSBzYW1lIHRoaW5ncyBhcwogCXRoZWlyIG5vbi1hc3luYyBjb3VudGVycGFydHMuICBUaGUgZGlmZmVyZW5jZXMgYXJlOiB0aGV5IGRvCkBAIC0zNjAsMTMgKzM1OCwxMSBAQAogCXN1Y2ggYXMgYW4gVVJCJ3MgY29tcGxldGlvbiBoYW5kbGVyLCBidXQgd2hlbiB0aGV5IHJldHVybiB0aGUKIAlkZXZpY2Ugd2lsbCBub3QgZ2VuZXJhbGx5IG5vdCB5ZXQgYmUgaW4gdGhlIGRlc2lyZWQgc3RhdGUuCiAKLVRoZXJlIGFsc28gYXJlIGEgY291cGxlIG9mIHV0aWxpdHkgcm91dGluZXMgZHJpdmVycyBjYW4gdXNlOgotCi0JdXNiX2F1dG9wbV9lbmFibGUoKSBzZXRzIHBtX3VzYWdlX2NudCB0byAwIGFuZCB0aGVuIGNhbGxzCi0JdXNiX2F1dG9wbV9zZXRfaW50ZXJmYWNlKCksIHdoaWNoIHdpbGwgYXR0ZW1wdCBhbiBhdXRvc3VzcGVuZC4KLQotCXVzYl9hdXRvcG1fZGlzYWJsZSgpIHNldHMgcG1fdXNhZ2VfY250IHRvIDEgYW5kIHRoZW4gY2FsbHMKLQl1c2JfYXV0b3BtX3NldF9pbnRlcmZhY2UoKSwgd2hpY2ggd2lsbCBhdHRlbXB0IGFuIGF1dG9yZXN1bWUuCisJdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlX25vX3Jlc3VtZSgpIGFuZAorCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZV9ub19zdXNwZW5kKCkgbWVyZWx5IGluY3JlbWVudCBvcgorCWRlY3JlbWVudCB0aGUgcG1fdXNhZ2VfY291bnQgdmFsdWU7IHRoZXkgZG8gbm90IGF0dGVtcHQgdG8KKwljYXJyeSBvdXQgYW4gYXV0b3Jlc3VtZSBvciBhbiBhdXRvc3VzcGVuZC4gIEhlbmNlIHRoZXkgY2FuIGJlCisJY2FsbGVkIGluIGFuIGF0b21pYyBjb250ZXh0LgogCiBUaGUgY29udmVudGlvbmFsIHVzYWdlIHBhdHRlcm4gaXMgdGhhdCBhIGRyaXZlciBjYWxscwogdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKCkgaW4gaXRzIG9wZW4gcm91dGluZSBhbmQKQEAgLTQwMCwxMSArMzk2LDExIEBACiBOb3JtYWxseSBhIGRyaXZlciB3b3VsZCBzZXQgdGhpcyBmbGFnIGluIGl0cyBwcm9iZSBtZXRob2QsIGF0IHdoaWNoCiB0aW1lIHRoZSBkZXZpY2UgaXMgZ3VhcmFudGVlZCBub3QgdG8gYmUgYXV0b3N1c3BlbmRlZC4pCiAKLVRoZSB1c2JfYXV0b3BtXyogcm91dGluZXMgaGF2ZSB0byBydW4gaW4gYSBzbGVlcGFibGUgcHJvY2VzcyBjb250ZXh0OwotdGhleSBtdXN0IG5vdCBiZSBjYWxsZWQgZnJvbSBhbiBpbnRlcnJ1cHQgaGFuZGxlciBvciB3aGlsZSBob2xkaW5nIGEKLXNwaW5sb2NrLiAgSW4gZmFjdCwgdGhlIGVudGlyZSBhdXRvc3VzcGVuZCBtZWNoYW5pc20gaXMgbm90IHdlbGwgZ2VhcmVkCi10b3dhcmQgaW50ZXJydXB0LWRyaXZlbiBvcGVyYXRpb24uICBIb3dldmVyIHRoZXJlIGlzIG9uZSB0aGluZyBhCi1kcml2ZXIgY2FuIGRvIGluIGFuIGludGVycnVwdCBoYW5kbGVyOgorVGhlIHN5bmNocm9ub3VzIHVzYl9hdXRvcG1fKiByb3V0aW5lcyBoYXZlIHRvIHJ1biBpbiBhIHNsZWVwYWJsZQorcHJvY2VzcyBjb250ZXh0OyB0aGV5IG11c3Qgbm90IGJlIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdCBoYW5kbGVyIG9yCit3aGlsZSBob2xkaW5nIGEgc3BpbmxvY2suICBJbiBmYWN0LCB0aGUgZW50aXJlIGF1dG9zdXNwZW5kIG1lY2hhbmlzbQoraXMgbm90IHdlbGwgZ2VhcmVkIHRvd2FyZCBpbnRlcnJ1cHQtZHJpdmVuIG9wZXJhdGlvbi4gIEhvd2V2ZXIgdGhlcmUKK2lzIG9uZSB0aGluZyBhIGRyaXZlciBjYW4gZG8gaW4gYW4gaW50ZXJydXB0IGhhbmRsZXI6CiAKIAl1c2JfbWFya19sYXN0X2J1c3koc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpOwogCkBAIC00MjMsMTUgKzQxOSwxNiBAQAogCiBFeHRlcm5hbCBzdXNwZW5kIGNhbGxzIHNob3VsZCBuZXZlciBiZSBhbGxvd2VkIHRvIGZhaWwgaW4gdGhpcyB3YXksCiBvbmx5IGF1dG9zdXNwZW5kIGNhbGxzLiAgVGhlIGRyaXZlciBjYW4gdGVsbCB0aGVtIGFwYXJ0IGJ5IGNoZWNraW5nCi11ZGV2LT5hdXRvX3BtOyB0aGlzIGZsYWcgd2lsbCBiZSBzZXQgdG8gMSBmb3IgaW50ZXJuYWwgUE0gZXZlbnRzCi0oYXV0b3N1c3BlbmQgb3IgYXV0b3Jlc3VtZSkgYW5kIDAgZm9yIGV4dGVybmFsIFBNIGV2ZW50cy4KK3RoZSBQTV9FVkVOVF9BVVRPIGJpdCBpbiB0aGUgbWVzc2FnZS5ldmVudCBhcmd1bWVudCB0byB0aGUgc3VzcGVuZAorbWV0aG9kOyB0aGlzIGJpdCB3aWxsIGJlIHNldCBmb3IgaW50ZXJuYWwgUE0gZXZlbnRzIChhdXRvc3VzcGVuZCkgYW5kCitjbGVhciBmb3IgZXh0ZXJuYWwgUE0gZXZlbnRzLgogCiBNYW55IG9mIHRoZSBpbmdyZWRpZW50cyBpbiB0aGUgYXV0b3N1c3BlbmQgZnJhbWV3b3JrIGFyZSBvcmllbnRlZAogdG93YXJkcyBpbnRlcmZhY2VzOiBUaGUgdXNiX2ludGVyZmFjZSBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlCiBwbV91c2FnZV9jbnQgZmllbGQsIGFuZCB0aGUgdXNiX2F1dG9wbV8qIHJvdXRpbmVzIHRha2UgYW4gaW50ZXJmYWNlCiBwb2ludGVyIGFzIHRoZWlyIGFyZ3VtZW50LiAgQnV0IHNvbWV3aGF0IGNvbmZ1c2luZ2x5LCBhIGZldyBvZiB0aGUKLXBpZWNlcyAodXNiX21hcmtfbGFzdF9idXN5KCkgYW5kIHVkZXYtPmF1dG9fcG0pIHVzZSB0aGUgdXNiX2RldmljZQotc3RydWN0dXJlIGluc3RlYWQuICBEcml2ZXJzIG5lZWQgdG8ga2VlcCB0aGlzIHN0cmFpZ2h0OyB0aGV5IGNhbiBjYWxsCitwaWVjZXMgKGkuZS4sIHVzYl9tYXJrX2xhc3RfYnVzeSgpKSB1c2UgdGhlIHVzYl9kZXZpY2Ugc3RydWN0dXJlCitpbnN0ZWFkLiAgRHJpdmVycyBuZWVkIHRvIGtlZXAgdGhpcyBzdHJhaWdodDsgdGhleSBjYW4gY2FsbAogaW50ZXJmYWNlX3RvX3VzYmRldigpIHRvIGZpbmQgdGhlIGRldmljZSBzdHJ1Y3R1cmUgZm9yIGEgZ2l2ZW4KIGludGVyZmFjZS4KIApkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCA5OGQ1Y2ExLi4xZjIxYzM0IDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtODAxLDYgKzgwMSwxOSBAQAogVzoJaHR0cDovL3dpa2kub3Blbm1va28ub3JnL3dpa2kvTmVvX0ZyZWVSdW5uZXIKIFM6CVN1cHBvcnRlZAogCitBUk0vUVVBTENPTU0gTVNNIE1BQ0hJTkUgU1VQUE9SVAorTToJRGF2aWQgQnJvd24gPGRhdmlkYkBjb2RlYXVyb3JhLm9yZz4KK006CURhbmllbCBXYWxrZXIgPGR3YWxrZXJAY29kZWF1cm9yYS5vcmc+CitNOglCcnlhbiBIdW50c21hbiA8YnJ5YW5oQGNvZGVhdXJvcmEub3JnPgorRjoJYXJjaC9hcm0vbWFjaC1tc20vCitGOglkcml2ZXJzL3ZpZGVvL21zbS8KK0Y6CWRyaXZlcnMvbW1jL2hvc3QvbXNtX3NkY2MuYworRjoJZHJpdmVycy9tbWMvaG9zdC9tc21fc2RjYy5oCitGOglkcml2ZXJzL3NlcmlhbC9tc21fc2VyaWFsLmgKK0Y6CWRyaXZlcnMvc2VyaWFsL21zbV9zZXJpYWwuYworVDoJZ2l0IGdpdDovL2NvZGVhdXJvcmEub3JnL3F1aWMva2VybmVsL2R3YWxrZXIvbGludXgtbXNtLmdpdAorUzoJTWFpbnRhaW5lZAorCiBBUk0vVE9TQSBNQUNISU5FIFNVUFBPUlQKIE06CURtaXRyeSBFcmVtaW4tU29sZW5pa292IDxkYmFyeXNoa292QGdtYWlsLmNvbT4KIE06CURpcmsgT3BmZXIgPGRpcmtAb3BmZXItb25saW5lLmRlPgpAQCAtMzI0Nyw2ICszMjYwLDcgQEAKIE06CVBhdWwgTWFja2VycmFzIDxwYXVsdXNAYXUuaWJtLmNvbT4KIFc6CWh0dHA6Ly93d3cuaWJtLmNvbS9saW51eC9sdGMvcHJvamVjdHMvcHBjCiBTOglTdXBwb3J0ZWQKK0Y6CWFyY2gvcG93ZXJwYy9ib290L3JzNjAwMC5oCiAKIExJTlVYIEZPUiBQT1dFUlBDICgzMi1CSVQgQU5EIDY0LUJJVCkKIE06CUJlbmphbWluIEhlcnJlbnNjaG1pZHQgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4KQEAgLTMyNTUsMTggKzMyNjksMjQgQEAKIEw6CWxpbnV4cHBjLWRldkBvemxhYnMub3JnCiBUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2JlbmgvcG93ZXJwYy5naXQKIFM6CVN1cHBvcnRlZAorRjoJRG9jdW1lbnRhdGlvbi9wb3dlcnBjLworRjoJYXJjaC9wb3dlcnBjLwogCiBMSU5VWCBGT1IgUE9XRVIgTUFDSU5UT1NICiBNOglCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+CiBXOglodHRwOi8vd3d3LnBlbmd1aW5wcGMub3JnLwogTDoJbGludXhwcGMtZGV2QG96bGFicy5vcmcKIFM6CU1haW50YWluZWQKK0Y6CWFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvCitGOglkcml2ZXJzL21hY2ludG9zaC8KIAogTElOVVggRk9SIFBPV0VSUEMgRU1CRURERUQgTVBDNVhYWAogTToJR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgogTDoJbGludXhwcGMtZGV2QG96bGFicy5vcmcKIFQ6CWdpdCBnaXQ6Ly9naXQuc2VjcmV0bGFiLmNhL2dpdC9saW51eC0yLjYuZ2l0CiBTOglNYWludGFpbmVkCitGOglhcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvCitGOglhcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvCiAKIExJTlVYIEZPUiBQT1dFUlBDIEVNQkVEREVEIFBQQzRYWAogTToJSm9zaCBCb3llciA8andib3llckBsaW51eC52bmV0LmlibS5jb20+CkBAIC0zMjc1LDYgKzMyOTUsOCBAQAogTDoJbGludXhwcGMtZGV2QG96bGFicy5vcmcKIFQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvandib3llci9wb3dlcnBjLTR4eC5naXQKIFM6CU1haW50YWluZWQKK0Y6CWFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDB4LworRjoJYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgvCiAKIExJTlVYIEZPUiBQT1dFUlBDIEVNQkVEREVEIFhJTElOWCBWSVJURVgKIE06CUdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KQEAgLTMyODIsNiArMzMwNCw4IEBACiBMOglsaW51eHBwYy1kZXZAb3psYWJzLm9yZwogVDoJZ2l0IGdpdDovL2dpdC5zZWNyZXRsYWIuY2EvZ2l0L2xpbnV4LTIuNi5naXQKIFM6CU1haW50YWluZWQKK0Y6CWFyY2gvcG93ZXJwYy8qLyp2aXJ0ZXgqCitGOglhcmNoL3Bvd2VycGMvKi8qLyp2aXJ0ZXgqCiAKIExJTlVYIEZPUiBQT1dFUlBDIEVNQkVEREVEIFBQQzhYWAogTToJVml0YWx5IEJvcmR1ZyA8dml0YkBrZXJuZWwuY3Jhc2hpbmcub3JnPgpAQCAtMzI5NSwxMiArMzMxOSwxNiBAQAogVzoJaHR0cDovL3d3dy5wZW5ndWlucHBjLm9yZy8KIEw6CWxpbnV4cHBjLWRldkBvemxhYnMub3JnCiBTOglNYWludGFpbmVkCitGOglhcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvCiAKIExJTlVYIEZPUiBQT1dFUlBDIFBBIFNFTUkgUFdSRklDSUVOVAogTToJT2xvZiBKb2hhbnNzb24gPG9sb2ZAbGl4b20ubmV0PgogVzoJaHR0cDovL3d3dy5wYXNlbWkuY29tLwogTDoJbGludXhwcGMtZGV2QG96bGFicy5vcmcKIFM6CVN1cHBvcnRlZAorRjoJYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvCitGOglkcml2ZXJzLyovKnBhc2VtaSoKK0Y6CWRyaXZlcnMvKi8qLypwYXNlbWkqCiAKIExJTlVYIFNFQ1VSSVRZIE1PRFVMRSAoTFNNKSBGUkFNRVdPUksKIE06CUNocmlzIFdyaWdodCA8Y2hyaXN3QHNvdXMtc29sLm9yZz4KQEAgLTUwNTIsNiArNTA4MCw3IEBACiAKIFNQSSBTVUJTWVNURU0KIE06CURhdmlkIEJyb3duZWxsIDxkYnJvd25lbGxAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorTToJR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgogTDoJc3BpLWRldmVsLWdlbmVyYWxAbGlzdHMuc291cmNlZm9yZ2UubmV0CiBTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uL3NwaS8KQEAgLTU0MjYsMTAgKzU0NTUsOSBAQAogRjoJZHJpdmVycy9ibG9jay91Yi5jCiAKIFVTQiBDREMgRVRIRVJORVQgRFJJVkVSCi1NOglHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorTToJT2xpdmVyIE5ldWt1bSA8b2xpdmVyQG5ldWt1bS5uYW1lPgogTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAotVzoJaHR0cDovL3d3dy5rcm9haC5jb20vbGludXgtdXNiLwogRjoJZHJpdmVycy9uZXQvdXNiL2NkY18qLmMKIEY6CWluY2x1ZGUvbGludXgvdXNiL2NkYy5oCiAKQEAgLTU2ODAsOSArNTcwOCwxMSBAQAogRjoJZHJpdmVycy9uZXQvd2lyZWxlc3Mvcm5kaXNfd2xhbi5jCiAKIFVTQiBYSENJIERSSVZFUgotTToJU2FyYWggU2hhcnAgPHNhcmFoLmEuc2hhcnBAaW50ZWwuY29tPgorTToJU2FyYWggU2hhcnAgPHNhcmFoLmEuc2hhcnBAbGludXguaW50ZWwuY29tPgogTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwogUzoJU3VwcG9ydGVkCitGOglkcml2ZXJzL3VzYi9ob3N0L3hoY2kqCitGOglkcml2ZXJzL3VzYi9ob3N0L3BjaS1xdWlya3MqCiAKIFVTQiBaQzAzMDEgRFJJVkVSCiBNOglMdWNhIFJpc29saWEgPGx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQ+CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL2ZjbnRsLmggYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL2ZjbnRsLmgKaW5kZXggMjVkYTAwMS4uMjFiMTExNyAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9mY250bC5oCisrKyBiL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vZmNudGwuaApAQCAtMSw4ICsxLDYgQEAKICNpZm5kZWYgX0FMUEhBX0ZDTlRMX0gKICNkZWZpbmUgX0FMUEhBX0ZDTlRMX0gKIAotLyogb3Blbi9mY250bCAtIE9fU1lOQyBpcyBvbmx5IGltcGxlbWVudGVkIG9uIGJsb2NrcyBkZXZpY2VzIGFuZCBvbiBmaWxlcwotICAgbG9jYXRlZCBvbiBhbiBleHQyIGZpbGUgc3lzdGVtICovCiAjZGVmaW5lIE9fQ1JFQVQJCSAwMTAwMAkvKiBub3QgZmNudGwgKi8KICNkZWZpbmUgT19UUlVOQwkJIDAyMDAwCS8qIG5vdCBmY250bCAqLwogI2RlZmluZSBPX0VYQ0wJCSAwNDAwMAkvKiBub3QgZmNudGwgKi8KQEAgLTEwLDEzICs4LDI4IEBACiAKICNkZWZpbmUgT19OT05CTE9DSwkgMDAwMDQKICNkZWZpbmUgT19BUFBFTkQJIDAwMDEwCi0jZGVmaW5lIE9fU1lOQwkJMDQwMDAwCisjZGVmaW5lIE9fRFNZTkMJCTA0MDAwMAkvKiB1c2VkIHRvIGJlIE9fU1lOQywgc2VlIGJlbG93ICovCiAjZGVmaW5lIE9fRElSRUNUT1JZCTAxMDAwMDAJLyogbXVzdCBiZSBhIGRpcmVjdG9yeSAqLwogI2RlZmluZSBPX05PRk9MTE9XCTAyMDAwMDAgLyogZG9uJ3QgZm9sbG93IGxpbmtzICovCiAjZGVmaW5lIE9fTEFSR0VGSUxFCTA0MDAwMDAgLyogd2lsbCBiZSBzZXQgYnkgdGhlIGtlcm5lbCBvbiBldmVyeSBvcGVuICovCiAjZGVmaW5lIE9fRElSRUNUCTAyMDAwMDAwIC8qIGRpcmVjdCBkaXNrIGFjY2VzcyAtIHNob3VsZCBjaGVjayB3aXRoIE9TRi8xICovCiAjZGVmaW5lIE9fTk9BVElNRQkwNDAwMDAwMAogI2RlZmluZSBPX0NMT0VYRUMJMDEwMDAwMDAwIC8qIHNldCBjbG9zZV9vbl9leGVjICovCisvKgorICogQmVmb3JlIExpbnV4IDIuNi4zMiBvbmx5IE9fRFNZTkMgc2VtYW50aWNzIHdlcmUgaW1wbGVtZW50ZWQsIGJ1dCB1c2luZworICogdGhlIE9fU1lOQyBmbGFnLiAgV2UgY29udGludWUgdG8gdXNlIHRoZSBleGlzdGluZyBudW1lcmljYWwgdmFsdWUKKyAqIGZvciBPX0RTWU5DIHNlbWFudGljcyBub3csIGJ1dCB1c2luZyB0aGUgY29ycmVjdCBzeW1ib2xpYyBuYW1lIGZvciBpdC4KKyAqIFRoaXMgbmV3IHZhbHVlIGlzIHVzZWQgdG8gcmVxdWVzdCB0cnVlIFBvc2l4IE9fU1lOQyBzZW1hbnRpY3MuICBJdCBpcworICogZGVmaW5lZCBpbiB0aGlzIHN0cmFuZ2Ugd2F5IHRvIG1ha2Ugc3VyZSBhcHBsaWNhdGlvbnMgY29tcGlsZWQgYWdhaW5zdAorICogbmV3IGhlYWRlcnMgZ2V0IGF0IGxlYXN0IE9fRFNZTkMgc2VtYW50aWNzIG9uIG9sZGVyIGtlcm5lbHMuCisgKgorICogVGhpcyBoYXMgdGhlIG5pY2Ugc2lkZS1lZmZlY3QgdGhhdCB3ZSBjYW4gc2ltcGx5IHRlc3QgZm9yIE9fRFNZTkMKKyAqIHdoZXJldmVyIHdlIGRvIG5vdCBjYXJlIGlmIE9fRFNZTkMgb3IgT19TWU5DIGlzIHVzZWQuCisgKgorICogTm90ZTogX19PX1NZTkMgbXVzdCBuZXZlciBiZSB1c2VkIGRpcmVjdGx5LgorICovCisjZGVmaW5lIF9fT19TWU5DCTAyMDAwMDAwMAorI2RlZmluZSBPX1NZTkMJCShfX09fU1lOQ3xPX0RTWU5DKQogCiAjZGVmaW5lIEZfR0VUTEsJCTcKICNkZWZpbmUgRl9TRVRMSwkJOApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvb3NmX3N5cy5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvb3NmX3N5cy5jCmluZGV4IDlhMzMzNGEuLjYyNjE5ZjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL29zZl9zeXMuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9vc2Zfc3lzLmMKQEAgLTE3OCwyNSArMTc4LDE4IEBACiAJCXVuc2lnbmVkIGxvbmcsIHByb3QsIHVuc2lnbmVkIGxvbmcsIGZsYWdzLCB1bnNpZ25lZCBsb25nLCBmZCwKIAkJdW5zaWduZWQgbG9uZywgb2ZmKQogewotCXN0cnVjdCBmaWxlICpmaWxlID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIHJldCA9IC1FQkFERjsKKwl1bnNpZ25lZCBsb25nIHJldCA9IC1FSU5WQUw7CiAKICNpZiAwCiAJaWYgKGZsYWdzICYgKF9NQVBfSEFTU0VNQVBIT1JFIHwgX01BUF9JTkhFUklUIHwgX01BUF9VTkFMSUdORUQpKQogCQlwcmludGsoIiVzOiB1bmltcGxlbWVudGVkIE9TRiBtbWFwIGZsYWdzICUwNGx4XG4iLCAKIAkJCWN1cnJlbnQtPmNvbW0sIGZsYWdzKTsKICNlbmRpZgotCWlmICghKGZsYWdzICYgTUFQX0FOT05ZTU9VUykpIHsKLQkJZmlsZSA9IGZnZXQoZmQpOwotCQlpZiAoIWZpbGUpCi0JCQlnb3RvIG91dDsKLQl9Ci0JZmxhZ3MgJj0gfihNQVBfRVhFQ1VUQUJMRSB8IE1BUF9ERU5ZV1JJVEUpOwotCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JcmV0ID0gZG9fbW1hcChmaWxlLCBhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBvZmYpOwotCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCWlmIChmaWxlKQotCQlmcHV0KGZpbGUpOworCWlmICgob2ZmICsgUEFHRV9BTElHTihsZW4pKSA8IG9mZikKKwkJZ290byBvdXQ7CisJaWYgKG9mZiAmIH5QQUdFX01BU0spCisJCWdvdG8gb3V0OworCXJldCA9IHN5c19tbWFwX3Bnb2ZmKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBvZmYgPj4gUEFHRV9TSElGVCk7CiAgb3V0OgogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9LY29uZmlnIGIvYXJjaC9hcm0vS2NvbmZpZwppbmRleCBjZjhhOTlmLi4yMzNhMjIyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL0tjb25maWcKQEAgLTYwMyw2ICs2MDMsNyBAQAogCXNlbGVjdCBBUkNIX1NQQVJTRU1FTV9FTkFCTEUKIAlzZWxlY3QgQVJDSF9NVERfWElQCiAJc2VsZWN0IEFSQ0hfSEFTX0NQVUZSRVEKKwlzZWxlY3QgQ1BVX0ZSRVEKIAlzZWxlY3QgR0VORVJJQ19HUElPCiAJc2VsZWN0IEdFTkVSSUNfVElNRQogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCkBAIC0xMzU5LDEzICsxMzYwLDkgQEAKIAogY29uZmlnIENQVV9GUkVRX1NBMTEwMAogCWJvb2wKLQlkZXBlbmRzIG9uIENQVV9GUkVRICYmIChTQTExMDBfSDMxMDAgfHwgU0ExMTAwX0gzNjAwIHx8IFNBMTEwMF9MQVJUIHx8IFNBMTEwMF9QTEVCIHx8IFNBMTEwMF9CQURHRTQgfHwgU0ExMTAwX0hBQ0tLSVQpCi0JZGVmYXVsdCB5CiAKIGNvbmZpZyBDUFVfRlJFUV9TQTExMTAKIAlib29sCi0JZGVwZW5kcyBvbiBDUFVfRlJFUSAmJiAoU0ExMTAwX0FTU0FCRVQgfHwgU0ExMTAwX0NFUkYgfHwgU0ExMTAwX1BUX1NZU1RFTTMpCi0JZGVmYXVsdCB5CiAKIGNvbmZpZyBDUFVfRlJFUV9JTlRFR1JBVE9SCiAJdHJpc3RhdGUgIkNQVWZyZXEgZHJpdmVyIGZvciBBUk0gSW50ZWdyYXRvciBDUFVzIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vS2NvbmZpZy5kZWJ1ZyBiL2FyY2gvYXJtL0tjb25maWcuZGVidWcKaW5kZXggZmY1NGMyMy4uNWNiOTMyNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vS2NvbmZpZy5kZWJ1ZworKysgYi9hcmNoL2FybS9LY29uZmlnLmRlYnVnCkBAIC03MSw2ICs3MSwxNCBAQAogCSAgaW4gdGhlIGtlcm5lbC4gIFRoaXMgaXMgaGVscGZ1bCBpZiB5b3UgYXJlIGRlYnVnZ2luZyBjb2RlIHRoYXQKIAkgIGV4ZWN1dGVzIGJlZm9yZSB0aGUgY29uc29sZSBpcyBpbml0aWFsaXplZC4KIAorY29uZmlnIEVBUkxZX1BSSU5USworCWJvb2wgIkVhcmx5IHByaW50ayIKKwlkZXBlbmRzIG9uIERFQlVHX0xMCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBoYXZlIGFuIGVhcmx5IGNvbnNvbGUgdXNpbmcgdGhlCisJICBrZXJuZWwgbG93LWxldmVsIGRlYnVnZ2luZyBmdW5jdGlvbnMuIEFkZCBlYXJseXByaW50ayB0byB5b3VyCisJICBrZXJuZWwgcGFyYW1ldGVycyB0byBlbmFibGUgdGhpcyBjb25zb2xlLgorCiBjb25maWcgREVCVUdfSUNFRENDCiAJYm9vbCAiS2VybmVsIGxvdy1sZXZlbCBkZWJ1Z2dpbmcgdmlhIEVtYmVkZGVkSUNFIERDQyBjaGFubmVsIgogCWRlcGVuZHMgb24gREVCVUdfTEwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvaHRjaGVyYWxkX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaHRjaGVyYWxkX2RlZmNvbmZpZwppbmRleCAzMzgyNjc2Li4xYjM5NjkxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2h0Y2hlcmFsZF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9odGNoZXJhbGRfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMyLXJjNgotIyBTYXQgTm92IDE0IDEwOjU2OjAxIDIwMDkKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMi1yYzgKKyMgU2F0IERlYyAgNSAxMjoxNjoyNCAyMDA5CiAjCiBDT05GSUdfQVJNPXkKIENPTkZJR19TWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTj15CkBAIC0xOTgsNyArMTk4LDkgQEAKICMgT01BUCBGZWF0dXJlIFNlbGVjdGlvbnMKICMKICMgQ09ORklHX09NQVBfUkVTRVRfQ0xPQ0tTIGlzIG5vdCBzZXQKLSMgQ09ORklHX09NQVBfTVVYIGlzIG5vdCBzZXQKK0NPTkZJR19PTUFQX01VWD15CisjIENPTkZJR19PTUFQX01VWF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfT01BUF9NVVhfV0FSTklOR1M9eQogQ09ORklHX09NQVBfTUNCU1A9eQogIyBDT05GSUdfT01BUF9NQk9YX0ZXSyBpcyBub3Qgc2V0CiBDT05GSUdfT01BUF9NUFVfVElNRVI9eQpAQCAtMjA3LDYgKzIwOSw3IEBACiAjIENPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQyIGlzIG5vdCBzZXQKICMgQ09ORklHX09NQVBfTExfREVCVUdfVUFSVDMgaXMgbm90IHNldAogIyBDT05GSUdfT01BUF9MTF9ERUJVR19OT05FIGlzIG5vdCBzZXQKK0NPTkZJR19PTUFQX1NFUklBTF9XQUtFPXkKICMgQ09ORklHX09NQVBfUE1fTk9ORSBpcyBub3Qgc2V0CiBDT05GSUdfT01BUF9QTV9OT09QPXkKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9vbWFwM190b3VjaGJvb2tfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9vbWFwM190b3VjaGJvb2tfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjODUxNWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL29tYXAzX3RvdWNoYm9va19kZWZjb25maWcKQEAgLTAsMCArMSwyNDMxIEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzItcmM4CisjIEZyaSBEZWMgIDQgMTY6MDI6MTcgMjAwOQorIworQ09ORklHX0FSTT15CitDT05GSUdfU1lTX1NVUFBPUlRTX0FQTV9FTVVMQVRJT049eQorQ09ORklHX0dFTkVSSUNfR1BJTz15CitDT05GSUdfR0VORVJJQ19USU1FPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQorQ09ORklHX0hBVkVfTEFURU5DWVRPUF9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQorQ09ORklHX0hBUkRJUlFTX1NXX1JFU0VORD15CitDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0FSQ0hfSEFTX0NQVUZSRVE9eQorQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CitDT05GSUdfT1BST0ZJTEVfQVJNVjc9eQorQ09ORklHX1ZFQ1RPUlNfQkFTRT0weGZmZmYwMDAwCitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorQ09ORklHX0NPTlNUUlVDVE9SUz15CisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfTE9DS19LRVJORUw9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CitDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKK0NPTkZJR19UQVNLU1RBVFM9eQorQ09ORklHX1RBU0tfREVMQVlfQUNDVD15CitDT05GSUdfVEFTS19YQUNDVD15CitDT05GSUdfVEFTS19JT19BQ0NPVU5USU5HPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKworIworIyBSQ1UgU3Vic3lzdGVtCisjCitDT05GSUdfVFJFRV9SQ1U9eQorIyBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX1JDVV9GQU5PVVQ9MzIKKyMgQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1QgaXMgbm90IHNldAorIyBDT05GSUdfVFJFRV9SQ1VfVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX0lLQ09ORklHPXkKK0NPTkZJR19JS0NPTkZJR19QUk9DPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE1CitDT05GSUdfR1JPVVBfU0NIRUQ9eQorQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQ9eQorIyBDT05GSUdfUlRfR1JPVVBfU0NIRUQgaXMgbm90IHNldAorQ09ORklHX1VTRVJfU0NIRUQ9eQorIyBDT05GSUdfQ0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMiBpcyBub3Qgc2V0CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorQ09ORklHX1JEX0daSVA9eQorIyBDT05GSUdfUkRfQlpJUDIgaXMgbm90IHNldAorIyBDT05GSUdfUkRfTFpNQSBpcyBub3Qgc2V0CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NZU0NUTD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19VSUQxNj15CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKKyMgQ09ORklHX0VMRl9DT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQorQ09ORklHX0VWRU5URkQ9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19BSU89eQorCisjCisjIEtlcm5lbCBQZXJmb3JtYW5jZSBFdmVudHMgQW5kIENvdW50ZXJzCisjCitDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CitDT05GSUdfU0xBQj15CisjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorQ09ORklHX1BST0ZJTElORz15CitDT05GSUdfVFJBQ0VQT0lOVFM9eQorQ09ORklHX09QUk9GSUxFPXkKK0NPTkZJR19IQVZFX09QUk9GSUxFPXkKKyMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfS1BST0JFUz15CitDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKK0NPTkZJR19IQVZFX0NMSz15CisKKyMKKyMgR0NPVi1iYXNlZCBrZXJuZWwgcHJvZmlsaW5nCisjCisjIENPTkZJR19HQ09WX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfU0xPV19XT1JLPXkKK0NPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKK0NPTkZJR19TTEFCSU5GTz15CitDT05GSUdfUlRfTVVURVhFUz15CitDT05GSUdfQkFTRV9TTUFMTD0wCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQ9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQ9eQorQ09ORklHX01PRFZFUlNJT05TPXkKK0NPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEw9eQorQ09ORklHX0JMT0NLPXkKK0NPTkZJR19MQkRBRj15CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0NGUT15CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iY2ZxIgorQ09ORklHX0ZSRUVaRVI9eQorCisjCisjIFN5c3RlbSBUeXBlCisjCitDT05GSUdfTU1VPXkKKyMgQ09ORklHX0FSQ0hfQUFFQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUkVBTFZJRVcgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9BVDkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9HRU1JTkkgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRVA5M1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01YQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NUTVAzWFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTkVUWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTk9NQURJSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDEzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzMlggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzM1ggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfS0lSS1dPT0QgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MT0tJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTVY3OFhYMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09SSU9ONVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NTVAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9LUzg2OTUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9OUzlYWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9XOTBYOTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUE5YNDAwOCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01TTSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0M2NFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzVQQzFYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1UzMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9EQVZJTkNJIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX09NQVA9eQorIyBDT05GSUdfQVJDSF9CQ01SSU5HIGlzIG5vdCBzZXQKKworIworIyBUSSBPTUFQIEltcGxlbWVudGF0aW9ucworIworQ09ORklHX0FSQ0hfT01BUF9PVEc9eQorIyBDT05GSUdfQVJDSF9PTUFQMSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAyIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX09NQVAzPXkKKyMgQ09ORklHX0FSQ0hfT01BUDQgaXMgbm90IHNldAorCisjCisjIE9NQVAgRmVhdHVyZSBTZWxlY3Rpb25zCisjCisjIENPTkZJR19PTUFQX0RFQlVHX1BPV0VSRE9NQUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NQVBfREVCVUdfQ0xPQ0tET01BSU4gaXMgbm90IHNldAorQ09ORklHX09NQVBfUkVTRVRfQ0xPQ0tTPXkKKyMgQ09ORklHX09NQVBfTVVYIGlzIG5vdCBzZXQKK0NPTkZJR19PTUFQX01DQlNQPXkKKyMgQ09ORklHX09NQVBfTUJPWF9GV0sgaXMgbm90IHNldAorIyBDT05GSUdfT01BUF9NUFVfVElNRVIgaXMgbm90IHNldAorQ09ORklHX09NQVBfMzJLX1RJTUVSPXkKK0NPTkZJR19PTUFQXzMyS19USU1FUl9IWj0xMjgKK0NPTkZJR19PTUFQX0RNX1RJTUVSPXkKKyMgQ09ORklHX09NQVBfTExfREVCVUdfVUFSVDEgaXMgbm90IHNldAorIyBDT05GSUdfT01BUF9MTF9ERUJVR19VQVJUMiBpcyBub3Qgc2V0CitDT05GSUdfT01BUF9MTF9ERUJVR19VQVJUMz15CisjIENPTkZJR19PTUFQX0xMX0RFQlVHX05PTkUgaXMgbm90IHNldAorIyBDT05GSUdfT01BUF9QTV9OT05FIGlzIG5vdCBzZXQKK0NPTkZJR19PTUFQX1BNX05PT1A9eQorQ09ORklHX0FSQ0hfT01BUDM0WFg9eQorQ09ORklHX0FSQ0hfT01BUDM0MzA9eQorCisjCisjIE9NQVAgQm9hcmQgVHlwZQorIworIyBDT05GSUdfTUFDSF9PTUFQM19CRUFHTEUgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9PTUFQX0xEUCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX09WRVJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfT01BUDNFVk0gaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9PTUFQMzUxN0VWTSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX09NQVAzX1BBTkRPUkEgaXMgbm90IHNldAorQ09ORklHX01BQ0hfT01BUDNfVE9VQ0hCT09LPXkKKyMgQ09ORklHX01BQ0hfT01BUF8zNDMwU0RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfTk9LSUFfUlg1MSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX09NQVBfWk9PTTIgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9PTUFQX1pPT00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfQ01fVDM1IGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfSUdFUDAwMjAgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9PTUFQXzM2MzBTRFAgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfMzJ2Nks9eQorQ09ORklHX0NQVV9WNz15CitDT05GSUdfQ1BVXzMydjc9eQorQ09ORklHX0NQVV9BQlJUX0VWNz15CitDT05GSUdfQ1BVX1BBQlJUX1Y3PXkKK0NPTkZJR19DUFVfQ0FDSEVfVjc9eQorQ09ORklHX0NQVV9DQUNIRV9WSVBUPXkKK0NPTkZJR19DUFVfQ09QWV9WNj15CitDT05GSUdfQ1BVX1RMQl9WNz15CitDT05GSUdfQ1BVX0hBU19BU0lEPXkKK0NPTkZJR19DUFVfQ1AxNT15CitDT05GSUdfQ1BVX0NQMTVfTU1VPXkKKworIworIyBQcm9jZXNzb3IgRmVhdHVyZXMKKyMKK0NPTkZJR19BUk1fVEhVTUI9eQorQ09ORklHX0FSTV9USFVNQkVFPXkKKyMgQ09ORklHX0NQVV9JQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0JQUkVESUNUX0RJU0FCTEUgaXMgbm90IHNldAorQ09ORklHX0hBU19UTFNfUkVHPXkKK0NPTkZJR19BUk1fTDFfQ0FDSEVfU0hJRlQ9NgorIyBDT05GSUdfQVJNX0VSUkFUQV80MzA5NzMgaXMgbm90IHNldAorIyBDT05GSUdfQVJNX0VSUkFUQV80NTg2OTMgaXMgbm90IHNldAorIyBDT05GSUdfQVJNX0VSUkFUQV80NjAwNzUgaXMgbm90IHNldAorQ09ORklHX0NPTU1PTl9DTEtERVY9eQorCisjCisjIEJ1cyBzdXBwb3J0CisjCisjIENPTkZJR19QQ0lfU1lTQ0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBGZWF0dXJlcworIworQ09ORklHX1RJQ0tfT05FU0hPVD15CitDT05GSUdfTk9fSFo9eQorQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CitDT05GSUdfVk1TUExJVF8zRz15CisjIENPTkZJR19WTVNQTElUXzJHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZNU1BMSVRfMUcgaXMgbm90IHNldAorQ09ORklHX1BBR0VfT0ZGU0VUPTB4QzAwMDAwMDAKKyMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CitDT05GSUdfUFJFRU1QVD15CitDT05GSUdfSFo9MTI4CisjIENPTkZJR19USFVNQjJfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19BRUFCST15CisjIENPTkZJR19PQUJJX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0VMRUNUX01FTU9SWV9NT0RFTCBpcyBub3Qgc2V0CisjIENPTkZJR19ISUdITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKK0NPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKKyMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTAKK0NPTkZJR19WSVJUX1RPX0JVUz15CitDT05GSUdfSEFWRV9NTE9DSz15CitDT05GSUdfSEFWRV9NTE9DS0VEX1BBR0VfQklUPXkKKyMgQ09ORklHX0tTTSBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTQwOTYKK0NPTkZJR19MRURTPXkKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisjIENPTkZJR19VQUNDRVNTX1dJVEhfTUVNQ1BZIGlzIG5vdCBzZXQKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9IiBkZWJ1ZyAiCisjIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19LRVhFQz15CitDT05GSUdfQVRBR1NfUFJPQz15CisKKyMKKyMgQ1BVIFBvd2VyIE1hbmFnZW1lbnQKKyMKKyMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9JRExFIGlzIG5vdCBzZXQKKworIworIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KKyMKKworIworIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKKyMKK0NPTkZJR19WRlA9eQorQ09ORklHX1ZGUHYzPXkKK0NPTkZJR19ORU9OPXkKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKK0NPTkZJR19IQVZFX0FPVVQ9eQorQ09ORklHX0JJTkZNVF9BT1VUPW0KK0NPTkZJR19CSU5GTVRfTUlTQz15CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCitDT05GSUdfUE09eQorQ09ORklHX1BNX0RFQlVHPXkKKyMgQ09ORklHX1BNX1ZFUkJPU0UgaXMgbm90IHNldAorQ09ORklHX0NBTl9QTV9UUkFDRT15CitDT05GSUdfUE1fU0xFRVA9eQorQ09ORklHX1NVU1BFTkQ9eQorIyBDT05GSUdfUE1fVEVTVF9TVVNQRU5EIGlzIG5vdCBzZXQKK0NPTkZJR19TVVNQRU5EX0ZSRUVaRVI9eQorIyBDT05GSUdfQVBNX0VNVUxBVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19QTV9SVU5USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1NVU1BFTkRfUE9TU0lCTEU9eQorQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19QQUNLRVRfTU1BUD15CitDT05GSUdfVU5JWD15CitDT05GSUdfWEZSTT15CisjIENPTkZJR19YRlJNX1VTRVIgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fTUlHUkFURSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NUQVRJU1RJQ1MgaXMgbm90IHNldAorQ09ORklHX1hGUk1fSVBDT01QPW0KK0NPTkZJR19ORVRfS0VZPXkKKyMgQ09ORklHX05FVF9LRVlfTUlHUkFURSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CisjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKK0NPTkZJR19JUF9QTlBfUkFSUD15CitDT05GSUdfTkVUX0lQSVA9bQorQ09ORklHX05FVF9JUEdSRT1tCisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX0FIPW0KK0NPTkZJR19JTkVUX0VTUD1tCitDT05GSUdfSU5FVF9JUENPTVA9bQorQ09ORklHX0lORVRfWEZSTV9UVU5ORUw9bQorQ09ORklHX0lORVRfVFVOTkVMPW0KK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CitDT05GSUdfSU5FVF9MUk89eQorQ09ORklHX0lORVRfRElBRz1tCitDT05GSUdfSU5FVF9UQ1BfRElBRz1tCitDT05GSUdfVENQX0NPTkdfQURWQU5DRUQ9eQorQ09ORklHX1RDUF9DT05HX0JJQz1tCitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX1RDUF9DT05HX1dFU1RXT09EPW0KK0NPTkZJR19UQ1BfQ09OR19IVENQPW0KK0NPTkZJR19UQ1BfQ09OR19IU1RDUD1tCitDT05GSUdfVENQX0NPTkdfSFlCTEE9bQorQ09ORklHX1RDUF9DT05HX1ZFR0FTPW0KK0NPTkZJR19UQ1BfQ09OR19TQ0FMQUJMRT1tCitDT05GSUdfVENQX0NPTkdfTFA9bQorQ09ORklHX1RDUF9DT05HX1ZFTk89bQorQ09ORklHX1RDUF9DT05HX1lFQUg9bQorQ09ORklHX1RDUF9DT05HX0lMTElOT0lTPW0KKyMgQ09ORklHX0RFRkFVTFRfQklDIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0NVQklDPXkKKyMgQ09ORklHX0RFRkFVTFRfSFRDUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX1ZFR0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfV0VTVFdPT0QgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9SRU5PIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKKyMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAorQ09ORklHX0lQVjY9bQorIyBDT05GSUdfSVBWNl9QUklWQUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjZfUk9VVEVSX1BSRUYgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNl9PUFRJTUlTVElDX0RBRCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVDZfQUg9bQorQ09ORklHX0lORVQ2X0VTUD1tCitDT05GSUdfSU5FVDZfSVBDT01QPW0KK0NPTkZJR19JUFY2X01JUDY9bQorQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMPW0KK0NPTkZJR19JTkVUNl9UVU5ORUw9bQorQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UUkFOU1BPUlQ9bQorQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UVU5ORUw9bQorQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9CRUVUPW0KK0NPTkZJR19JTkVUNl9YRlJNX01PREVfUk9VVEVPUFRJTUlaQVRJT049bQorQ09ORklHX0lQVjZfU0lUPW0KK0NPTkZJR19JUFY2X05ESVNDX05PREVUWVBFPXkKK0NPTkZJR19JUFY2X1RVTk5FTD1tCitDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVM9eQorQ09ORklHX0lQVjZfU1VCVFJFRVM9eQorQ09ORklHX0lQVjZfTVJPVVRFPXkKKyMgQ09ORklHX0lQVjZfUElNU01fVjIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVI9eQorIyBDT05GSUdfTkVURklMVEVSX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVJfQURWQU5DRUQ9eQorQ09ORklHX0JSSURHRV9ORVRGSUxURVI9eQorCisjCisjIENvcmUgTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19ORVRGSUxURVJfTkVUTElOSz1tCitDT05GSUdfTkVURklMVEVSX05FVExJTktfUVVFVUU9bQorQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LX0xPRz1tCitDT05GSUdfTkZfQ09OTlRSQUNLPW0KK0NPTkZJR19ORl9DVF9BQ0NUPXkKK0NPTkZJR19ORl9DT05OVFJBQ0tfTUFSSz15CitDT05GSUdfTkZfQ09OTlRSQUNLX0VWRU5UUz15CitDT05GSUdfTkZfQ1RfUFJPVE9fRENDUD1tCitDT05GSUdfTkZfQ1RfUFJPVE9fR1JFPW0KK0NPTkZJR19ORl9DVF9QUk9UT19TQ1RQPW0KK0NPTkZJR19ORl9DVF9QUk9UT19VRFBMSVRFPW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfQU1BTkRBPW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfRlRQPW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfSDMyMz1tCitDT05GSUdfTkZfQ09OTlRSQUNLX0lSQz1tCitDT05GSUdfTkZfQ09OTlRSQUNLX05FVEJJT1NfTlM9bQorQ09ORklHX05GX0NPTk5UUkFDS19QUFRQPW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfU0FORT1tCitDT05GSUdfTkZfQ09OTlRSQUNLX1NJUD1tCitDT05GSUdfTkZfQ09OTlRSQUNLX1RGVFA9bQorQ09ORklHX05GX0NUX05FVExJTks9bQorIyBDT05GSUdfTkVURklMVEVSX1RQUk9YWSBpcyBub3Qgc2V0CitDT05GSUdfTkVURklMVEVSX1hUQUJMRVM9bQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0xBU1NJRlk9bQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ09OTk1BUks9bQorIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9EU0NQIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0hMPW0KKyMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTEVEIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX01BUks9bQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTkZMT0c9bQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTkZRVUVVRT1tCisjIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05PVFJBQ0sgaXMgbm90IHNldAorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfUkFURUVTVD1tCisjIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RDUE1TUz1tCisjIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RDUE9QVFNUUklQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DTFVTVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09NTUVOVD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5CWVRFUz1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5MSU1JVD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5NQVJLPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTlRSQUNLPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRENDUD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0RTQ1A9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9FU1A9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IQVNITElNSVQ9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IRUxQRVI9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9ITD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0lQUkFOR0U9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MRU5HVEg9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MSU1JVD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BQz1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BUks9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NVUxUSVBPUlQ9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9PV05FUj1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BPTElDWT1tCisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUEhZU0RFViBpcyBub3Qgc2V0CitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BLVFRZUEU9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9RVU9UQT1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JBVEVFU1Q9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUFMTT1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JFQ0VOVD1tCisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkVDRU5UX1BST0NfQ09NUEFUIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU0NUUD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUQVRFPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RBVElTVElDPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RSSU5HPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVENQTVNTPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVElNRT1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1UzMj1tCisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfT1NGIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9WUz1tCitDT05GSUdfSVBfVlNfSVBWNj15CitDT05GSUdfSVBfVlNfREVCVUc9eQorQ09ORklHX0lQX1ZTX1RBQl9CSVRTPTEyCisKKyMKKyMgSVBWUyB0cmFuc3BvcnQgcHJvdG9jb2wgbG9hZCBiYWxhbmNpbmcgc3VwcG9ydAorIworQ09ORklHX0lQX1ZTX1BST1RPX1RDUD15CitDT05GSUdfSVBfVlNfUFJPVE9fVURQPXkKK0NPTkZJR19JUF9WU19QUk9UT19BSF9FU1A9eQorQ09ORklHX0lQX1ZTX1BST1RPX0VTUD15CitDT05GSUdfSVBfVlNfUFJPVE9fQUg9eQorCisjCisjIElQVlMgc2NoZWR1bGVyCisjCitDT05GSUdfSVBfVlNfUlI9bQorQ09ORklHX0lQX1ZTX1dSUj1tCitDT05GSUdfSVBfVlNfTEM9bQorQ09ORklHX0lQX1ZTX1dMQz1tCitDT05GSUdfSVBfVlNfTEJMQz1tCitDT05GSUdfSVBfVlNfTEJMQ1I9bQorQ09ORklHX0lQX1ZTX0RIPW0KK0NPTkZJR19JUF9WU19TSD1tCitDT05GSUdfSVBfVlNfU0VEPW0KK0NPTkZJR19JUF9WU19OUT1tCisKKyMKKyMgSVBWUyBhcHBsaWNhdGlvbiBoZWxwZXIKKyMKK0NPTkZJR19JUF9WU19GVFA9bQorCisjCisjIElQOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgorIworQ09ORklHX05GX0RFRlJBR19JUFY0PW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfSVBWND1tCitDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUPXkKK0NPTkZJR19JUF9ORl9RVUVVRT1tCitDT05GSUdfSVBfTkZfSVBUQUJMRVM9bQorQ09ORklHX0lQX05GX01BVENIX0FERFJUWVBFPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9BSD1tCitDT05GSUdfSVBfTkZfTUFUQ0hfRUNOPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9UVEw9bQorQ09ORklHX0lQX05GX0ZJTFRFUj1tCitDT05GSUdfSVBfTkZfVEFSR0VUX1JFSkVDVD1tCitDT05GSUdfSVBfTkZfVEFSR0VUX0xPRz1tCitDT05GSUdfSVBfTkZfVEFSR0VUX1VMT0c9bQorQ09ORklHX05GX05BVD1tCitDT05GSUdfTkZfTkFUX05FRURFRD15CitDT05GSUdfSVBfTkZfVEFSR0VUX01BU1FVRVJBREU9bQorQ09ORklHX0lQX05GX1RBUkdFVF9ORVRNQVA9bQorQ09ORklHX0lQX05GX1RBUkdFVF9SRURJUkVDVD1tCitDT05GSUdfTkZfTkFUX1NOTVBfQkFTSUM9bQorQ09ORklHX05GX05BVF9QUk9UT19EQ0NQPW0KK0NPTkZJR19ORl9OQVRfUFJPVE9fR1JFPW0KK0NPTkZJR19ORl9OQVRfUFJPVE9fVURQTElURT1tCitDT05GSUdfTkZfTkFUX1BST1RPX1NDVFA9bQorQ09ORklHX05GX05BVF9GVFA9bQorQ09ORklHX05GX05BVF9JUkM9bQorQ09ORklHX05GX05BVF9URlRQPW0KK0NPTkZJR19ORl9OQVRfQU1BTkRBPW0KK0NPTkZJR19ORl9OQVRfUFBUUD1tCitDT05GSUdfTkZfTkFUX0gzMjM9bQorQ09ORklHX05GX05BVF9TSVA9bQorQ09ORklHX0lQX05GX01BTkdMRT1tCitDT05GSUdfSVBfTkZfVEFSR0VUX0NMVVNURVJJUD1tCitDT05GSUdfSVBfTkZfVEFSR0VUX0VDTj1tCitDT05GSUdfSVBfTkZfVEFSR0VUX1RUTD1tCitDT05GSUdfSVBfTkZfUkFXPW0KK0NPTkZJR19JUF9ORl9BUlBUQUJMRVM9bQorQ09ORklHX0lQX05GX0FSUEZJTFRFUj1tCitDT05GSUdfSVBfTkZfQVJQX01BTkdMRT1tCisKKyMKKyMgSVB2NjogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19ORl9DT05OVFJBQ0tfSVBWNj1tCitDT05GSUdfSVA2X05GX1FVRVVFPW0KK0NPTkZJR19JUDZfTkZfSVBUQUJMRVM9bQorQ09ORklHX0lQNl9ORl9NQVRDSF9BSD1tCitDT05GSUdfSVA2X05GX01BVENIX0VVSTY0PW0KK0NPTkZJR19JUDZfTkZfTUFUQ0hfRlJBRz1tCitDT05GSUdfSVA2X05GX01BVENIX09QVFM9bQorQ09ORklHX0lQNl9ORl9NQVRDSF9ITD1tCitDT05GSUdfSVA2X05GX01BVENIX0lQVjZIRUFERVI9bQorQ09ORklHX0lQNl9ORl9NQVRDSF9NSD1tCitDT05GSUdfSVA2X05GX01BVENIX1JUPW0KK0NPTkZJR19JUDZfTkZfVEFSR0VUX0hMPW0KK0NPTkZJR19JUDZfTkZfVEFSR0VUX0xPRz1tCitDT05GSUdfSVA2X05GX0ZJTFRFUj1tCitDT05GSUdfSVA2X05GX1RBUkdFVF9SRUpFQ1Q9bQorQ09ORklHX0lQNl9ORl9NQU5HTEU9bQorQ09ORklHX0lQNl9ORl9SQVc9bQorIyBDT05GSUdfQlJJREdFX05GX0VCVEFCTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9EQ0NQPW0KK0NPTkZJR19JTkVUX0RDQ1BfRElBRz1tCisKKyMKKyMgRENDUCBDQ0lEcyBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9EQ0NQX0NDSUQyX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9EQ0NQX0NDSUQzPXkKKyMgQ09ORklHX0lQX0RDQ1BfQ0NJRDNfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0lQX0RDQ1BfQ0NJRDNfUlRPPTEwMAorQ09ORklHX0lQX0RDQ1BfVEZSQ19MSUI9eQorCisjCisjIERDQ1AgS2VybmVsIEhhY2tpbmcKKyMKKyMgQ09ORklHX0lQX0RDQ1BfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0lQX1NDVFA9bQorIyBDT05GSUdfU0NUUF9EQkdfTVNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDVFBfREJHX09CSkNOVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1RQX0hNQUNfTk9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1RQX0hNQUNfU0hBMSBpcyBub3Qgc2V0CitDT05GSUdfU0NUUF9ITUFDX01ENT15CisjIENPTkZJR19SRFMgaXMgbm90IHNldAorQ09ORklHX1RJUEM9bQorIyBDT05GSUdfVElQQ19BRFZBTkNFRCBpcyBub3Qgc2V0CisjIENPTkZJR19USVBDX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19BVE09bQorQ09ORklHX0FUTV9DTElQPW0KKyMgQ09ORklHX0FUTV9DTElQX05PX0lDTVAgaXMgbm90IHNldAorQ09ORklHX0FUTV9MQU5FPW0KK0NPTkZJR19BVE1fTVBPQT1tCitDT05GSUdfQVRNX0JSMjY4ND1tCisjIENPTkZJR19BVE1fQlIyNjg0X0lQRklMVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19TVFA9bQorQ09ORklHX0dBUlA9bQorQ09ORklHX0JSSURHRT1tCisjIENPTkZJR19ORVRfRFNBIGlzIG5vdCBzZXQKK0NPTkZJR19WTEFOXzgwMjFRPW0KK0NPTkZJR19WTEFOXzgwMjFRX0dWUlA9eQorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19MTEM9bQorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19XQU5fUk9VVEVSPW0KKyMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTU0IGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfU0NIRUQ9eQorCisjCisjIFF1ZXVlaW5nL1NjaGVkdWxpbmcKKyMKK0NPTkZJR19ORVRfU0NIX0NCUT1tCitDT05GSUdfTkVUX1NDSF9IVEI9bQorQ09ORklHX05FVF9TQ0hfSEZTQz1tCitDT05GSUdfTkVUX1NDSF9BVE09bQorQ09ORklHX05FVF9TQ0hfUFJJTz1tCitDT05GSUdfTkVUX1NDSF9NVUxUSVE9bQorQ09ORklHX05FVF9TQ0hfUkVEPW0KK0NPTkZJR19ORVRfU0NIX1NGUT1tCitDT05GSUdfTkVUX1NDSF9URVFMPW0KK0NPTkZJR19ORVRfU0NIX1RCRj1tCitDT05GSUdfTkVUX1NDSF9HUkVEPW0KK0NPTkZJR19ORVRfU0NIX0RTTUFSSz1tCitDT05GSUdfTkVUX1NDSF9ORVRFTT1tCitDT05GSUdfTkVUX1NDSF9EUlI9bQorCisjCisjIENsYXNzaWZpY2F0aW9uCisjCitDT05GSUdfTkVUX0NMUz15CitDT05GSUdfTkVUX0NMU19CQVNJQz1tCitDT05GSUdfTkVUX0NMU19UQ0lOREVYPW0KK0NPTkZJR19ORVRfQ0xTX1JPVVRFND1tCitDT05GSUdfTkVUX0NMU19ST1VURT15CitDT05GSUdfTkVUX0NMU19GVz1tCitDT05GSUdfTkVUX0NMU19VMzI9bQorQ09ORklHX0NMU19VMzJfUEVSRj15CitDT05GSUdfQ0xTX1UzMl9NQVJLPXkKK0NPTkZJR19ORVRfQ0xTX1JTVlA9bQorQ09ORklHX05FVF9DTFNfUlNWUDY9bQorQ09ORklHX05FVF9DTFNfRkxPVz1tCisjIENPTkZJR19ORVRfRU1BVENIIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9DTFNfQUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfQ0xTX0lORD15CitDT05GSUdfTkVUX1NDSF9GSUZPPXkKKyMgQ09ORklHX0RDQiBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9EUk9QX01PTklUT1IgaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfQ0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorQ09ORklHX0JUPXkKK0NPTkZJR19CVF9MMkNBUD15CitDT05GSUdfQlRfU0NPPXkKK0NPTkZJR19CVF9SRkNPTU09eQorQ09ORklHX0JUX1JGQ09NTV9UVFk9eQorQ09ORklHX0JUX0JORVA9eQorQ09ORklHX0JUX0JORVBfTUNfRklMVEVSPXkKK0NPTkZJR19CVF9CTkVQX1BST1RPX0ZJTFRFUj15CitDT05GSUdfQlRfSElEUD15CisKKyMKKyMgQmx1ZXRvb3RoIGRldmljZSBkcml2ZXJzCisjCitDT05GSUdfQlRfSENJQlRVU0I9eQorQ09ORklHX0JUX0hDSUJUU0RJTz15CitDT05GSUdfQlRfSENJVUFSVD15CitDT05GSUdfQlRfSENJVUFSVF9IND15CitDT05GSUdfQlRfSENJVUFSVF9CQ1NQPXkKK0NPTkZJR19CVF9IQ0lVQVJUX0xMPXkKK0NPTkZJR19CVF9IQ0lCQ00yMDNYPXkKK0NPTkZJR19CVF9IQ0lCUEExMFg9eQorQ09ORklHX0JUX0hDSUJGVVNCPXkKKyMgQ09ORklHX0JUX0hDSVZIQ0kgaXMgbm90IHNldAorIyBDT05GSUdfQlRfTVJWTCBpcyBub3Qgc2V0CitDT05GSUdfQUZfUlhSUEM9bQorIyBDT05GSUdfQUZfUlhSUENfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfUlhLQUQgaXMgbm90IHNldAorQ09ORklHX0ZJQl9SVUxFUz15CitDT05GSUdfV0lSRUxFU1M9eQorQ09ORklHX0NGRzgwMjExPW0KKyMgQ09ORklHX05MODAyMTFfVEVTVE1PREUgaXMgbm90IHNldAorIyBDT05GSUdfQ0ZHODAyMTFfREVWRUxPUEVSX1dBUk5JTkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NGRzgwMjExX1JFR19ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfQ0ZHODAyMTFfREVGQVVMVF9QUz15CitDT05GSUdfQ0ZHODAyMTFfREVGQVVMVF9QU19WQUxVRT0xCisjIENPTkZJR19DRkc4MDIxMV9ERUJVR0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZIGlzIG5vdCBzZXQKK0NPTkZJR19XSVJFTEVTU19FWFQ9eQorQ09ORklHX1dJUkVMRVNTX0VYVF9TWVNGUz15CitDT05GSUdfTElCODAyMTE9eQorIyBDT05GSUdfTElCODAyMTFfREVCVUcgaXMgbm90IHNldAorQ09ORklHX01BQzgwMjExPW0KK0NPTkZJR19NQUM4MDIxMV9SQ19QSUQ9eQorIyBDT05GSUdfTUFDODAyMTFfUkNfTUlOU1RSRUwgaXMgbm90IHNldAorQ09ORklHX01BQzgwMjExX1JDX0RFRkFVTFRfUElEPXkKKyMgQ09ORklHX01BQzgwMjExX1JDX0RFRkFVTFRfTUlOU1RSRUwgaXMgbm90IHNldAorQ09ORklHX01BQzgwMjExX1JDX0RFRkFVTFQ9InBpZCIKKyMgQ09ORklHX01BQzgwMjExX01FU0ggaXMgbm90IHNldAorIyBDT05GSUdfTUFDODAyMTFfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQzgwMjExX0RFQlVHX01FTlUgaXMgbm90IHNldAorQ09ORklHX1dJTUFYPW0KK0NPTkZJR19XSU1BWF9ERUJVR19MRVZFTD04CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCisjIENPTkZJR19ERVZUTVBGUyBpcyBub3Qgc2V0CitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CitDT05GSUdfRldfTE9BREVSPXkKK0NPTkZJR19GSVJNV0FSRV9JTl9LRVJORUw9eQorQ09ORklHX0VYVFJBX0ZJUk1XQVJFPSIiCisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfVEVTVFMgaXMgbm90IHNldAorQ09ORklHX01URF9DT05DQVQ9eQorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BRlNfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMS0RFVlM9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NTRkRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PT1BTIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworIyBDT05GSUdfTVREX0NGSSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX0RBVEFGTEFTSCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTTI1UDgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9TU1QyNUwgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTkFORD15CisjIENPTkZJR19NVERfTkFORF9WRVJJRllfV1JJVEUgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkRfRUNDX1NNQyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9NVVNFVU1fSURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EX0dQSU8gaXMgbm90IHNldAorQ09ORklHX01URF9OQU5EX09NQVAyPXkKK0NPTkZJR19NVERfTkFORF9PTUFQX1BSRUZFVENIPXkKKyMgQ09ORklHX01URF9OQU5EX09NQVBfUFJFRkVUQ0hfRE1BIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTkFORF9JRFM9eQorIyBDT05GSUdfTVREX05BTkRfRElTS09OQ0hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9OQU5EU0lNIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTkFORF9QTEFURk9STT15CisjIENPTkZJR19NVERfQUxBVURBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKworIworIyBMUEREUiBmbGFzaCBtZW1vcnkgZHJpdmVycworIworIyBDT05GSUdfTVREX0xQRERSIGlzIG5vdCBzZXQKKworIworIyBVQkkgLSBVbnNvcnRlZCBibG9jayBpbWFnZXMKKyMKK0NPTkZJR19NVERfVUJJPXkKK0NPTkZJR19NVERfVUJJX1dMX1RIUkVTSE9MRD00MDk2CitDT05GSUdfTVREX1VCSV9CRUJfUkVTRVJWRT0xCisjIENPTkZJR19NVERfVUJJX0dMVUVCSSBpcyBub3Qgc2V0CisKKyMKKyMgVUJJIGRlYnVnZ2luZyBvcHRpb25zCisjCisjIENPTkZJR19NVERfVUJJX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVY9eQorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUD1tCisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VCIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTE2Mzg0CisjIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0CitDT05GSUdfQ0RST01fUEtUQ0RWRD1tCitDT05GSUdfQ0RST01fUEtUQ0RWRF9CVUZGRVJTPTgKKyMgQ09ORklHX0NEUk9NX1BLVENEVkRfV0NBQ0hFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19NR19ESVNLIGlzIG5vdCBzZXQKK0NPTkZJR19NSVNDX0RFVklDRVM9eQorIyBDT05GSUdfSUNTOTMyUzQwMSBpcyBub3Qgc2V0CisjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldAorIyBDT05GSUdfSVNMMjkwMDMgaXMgbm90IHNldAorIyBDT05GSUdfQzJQT1JUIGlzIG5vdCBzZXQKKworIworIyBFRVBST00gc3VwcG9ydAorIworIyBDT05GSUdfRUVQUk9NX0FUMjQgaXMgbm90IHNldAorIyBDT05GSUdfRUVQUk9NX0FUMjUgaXMgbm90IHNldAorIyBDT05GSUdfRUVQUk9NX0xFR0FDWSBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBST01fTUFYNjg3NSBpcyBub3Qgc2V0CitDT05GSUdfRUVQUk9NXzkzQ1g2PXkKK0NPTkZJR19IQVZFX0lERT15CisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19SQUlEX0FUVFJTPW0KK0NPTkZJR19TQ1NJPXkKK0NPTkZJR19TQ1NJX0RNQT15CisjIENPTkZJR19TQ1NJX1RHVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorQ09ORklHX1NDU0lfUFJPQ19GUz15CisKKyMKKyMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKKyMKK0NPTkZJR19CTEtfREVWX1NEPXkKKyMgQ09ORklHX0NIUl9ERVZfU1QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1NSPXkKK0NPTkZJR19CTEtfREVWX1NSX1ZFTkRPUj15CitDT05GSUdfQ0hSX0RFVl9TRz15CitDT05GSUdfQ0hSX0RFVl9TQ0g9bQorQ09ORklHX1NDU0lfTVVMVElfTFVOPXkKKyMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NDQU5fQVNZTkMgaXMgbm90IHNldAorQ09ORklHX1NDU0lfV0FJVF9TQ0FOPW0KKworIworIyBTQ1NJIFRyYW5zcG9ydHMKKyMKKyMgQ09ORklHX1NDU0lfU1BJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRkNfQVRUUlMgaXMgbm90IHNldAorQ09ORklHX1NDU0lfSVNDU0lfQVRUUlM9bQorIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1JQX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX0xPV0xFVkVMPXkKK0NPTkZJR19JU0NTSV9UQ1A9bQorIyBDT05GSUdfTElCRkMgaXMgbm90IHNldAorIyBDT05GSUdfTElCRkNPRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9PU0RfSU5JVElBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CitDT05GSUdfTUQ9eQorQ09ORklHX0JMS19ERVZfTUQ9bQorQ09ORklHX01EX0xJTkVBUj1tCitDT05GSUdfTURfUkFJRDA9bQorQ09ORklHX01EX1JBSUQxPW0KK0NPTkZJR19NRF9SQUlEMTA9bQorQ09ORklHX01EX1JBSUQ0NTY9bQorQ09ORklHX01EX1JBSUQ2X1BRPW0KKyMgQ09ORklHX0FTWU5DX1JBSUQ2X1RFU1QgaXMgbm90IHNldAorQ09ORklHX01EX01VTFRJUEFUSD1tCitDT05GSUdfTURfRkFVTFRZPW0KK0NPTkZJR19CTEtfREVWX0RNPW0KKyMgQ09ORklHX0RNX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19ETV9DUllQVD1tCitDT05GSUdfRE1fU05BUFNIT1Q9bQorQ09ORklHX0RNX01JUlJPUj1tCisjIENPTkZJR19ETV9MT0dfVVNFUlNQQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19ETV9aRVJPPW0KK0NPTkZJR19ETV9NVUxUSVBBVEg9bQorIyBDT05GSUdfRE1fTVVMVElQQVRIX1FMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNX01VTFRJUEFUSF9TVCBpcyBub3Qgc2V0CitDT05GSUdfRE1fREVMQVk9bQorIyBDT05GSUdfRE1fVUVWRU5UIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKK0NPTkZJR19EVU1NWT1tCitDT05GSUdfQk9ORElORz1tCitDT05GSUdfTUFDVkxBTj1tCitDT05GSUdfRVFVQUxJWkVSPW0KK0NPTkZJR19UVU49bQorQ09ORklHX1ZFVEg9bQorIyBDT05GSUdfTkVUX0VUSEVSTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0CitDT05GSUdfV0xBTj15CisjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKK0NPTkZJR19XTEFOXzgwMjExPXkKKyMgQ09ORklHX0xJQkVSVEFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQkVSVEFTX1RISU5GSVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUNzZDNTBYX1VTQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfWkQxMjAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9ORVRfUk5ESVNfV0xBTiBpcyBub3Qgc2V0CisjIENPTkZJR19SVEw4MTg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQzgwMjExX0hXU0lNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1A1NF9DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRIX0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19IT1NUQVAgaXMgbm90IHNldAorIyBDT05GSUdfQjQzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0M0xFR0FDWSBpcyBub3Qgc2V0CisjIENPTkZJR19aRDEyMTFSVyBpcyBub3Qgc2V0CisjIENPTkZJR19SVDJYMDAgaXMgbm90IHNldAorIyBDT05GSUdfV0wxMlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lXTSBpcyBub3Qgc2V0CisKKyMKKyMgV2lNQVggV2lyZWxlc3MgQnJvYWRiYW5kIGRldmljZXMKKyMKKyMgQ09ORklHX1dJTUFYX0kyNDAwTV9VU0IgaXMgbm90IHNldAorIyBDT05GSUdfV0lNQVhfSTI0MDBNX1NESU8gaXMgbm90IHNldAorCisjCisjIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCisjCisjIENPTkZJR19VU0JfQ0FUQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTV9EUklWRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19QUFA9bQorQ09ORklHX1BQUF9NVUxUSUxJTks9eQorQ09ORklHX1BQUF9GSUxURVI9eQorQ09ORklHX1BQUF9BU1lOQz1tCitDT05GSUdfUFBQX1NZTkNfVFRZPW0KK0NPTkZJR19QUFBfREVGTEFURT1tCitDT05GSUdfUFBQX0JTRENPTVA9bQorQ09ORklHX1BQUF9NUFBFPW0KK0NPTkZJR19QUFBPRT1tCisjIENPTkZJR19QUFBPQVRNIGlzIG5vdCBzZXQKK0NPTkZJR19QUFBPTDJUUD1tCisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKK0NPTkZJR19TTEhDPW0KK0NPTkZJR19ORVRDT05TT0xFPW0KK0NPTkZJR19ORVRDT05TT0xFX0RZTkFNSUM9eQorQ09ORklHX05FVFBPTEw9eQorQ09ORklHX05FVFBPTExfVFJBUD15CitDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUj15CisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKK0NPTkZJR19JTlBVVF9GRl9NRU1MRVNTPXkKKyMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfRVZERVY9eQorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCitDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfQURQNTU4OCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9BVEtCRCBpcyBub3Qgc2V0CisjIENPTkZJR19RVDIxNjAgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAorQ09ORklHX0tFWUJPQVJEX0dQSU89eQorIyBDT05GSUdfS0VZQk9BUkRfTUFUUklYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0xNODMyMyBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9NQVg3MzU5IGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9PUEVOQ09SRVMgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfU1RPV0FXQVkgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1RXTDQwMzAgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFPXkKK0NPTkZJR19NT1VTRV9QUzI9eQorQ09ORklHX01PVVNFX1BTMl9BTFBTPXkKK0NPTkZJR19NT1VTRV9QUzJfTE9HSVBTMlBQPXkKK0NPTkZJR19NT1VTRV9QUzJfU1lOQVBUSUNTPXkKK0NPTkZJR19NT1VTRV9QUzJfVFJBQ0tQT0lOVD15CisjIENPTkZJR19NT1VTRV9QUzJfRUxBTlRFQ0ggaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfUFMyX1NFTlRFTElDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1BTMl9UT1VDSEtJVCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9TRVJJQUwgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfQVBQTEVUT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9CQ001OTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1ZTWFhYQUEgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9TWU5BUFRJQ1NfSTJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU49eQorQ09ORklHX1RPVUNIU0NSRUVOX0FEUzc4NDY9eQorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9JMkMgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzkgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fRUVUSSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9GVUpJVFNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0dVTlpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0VMTyBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9XQUNPTV9XODAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9NQ1M1MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX01UT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9JTkVYSU8gaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fTUs3MTIgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fUEVOTU9VTlQgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVE9VQ0hSSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFdJTiBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9VU0JfQ09NUE9TSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNISVQyMTMgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVFNDMjAwNyBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9XOTBYOTAwIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NSVNDPXkKKyMgQ09ORklHX0lOUFVUX0FUSV9SRU1PVEUgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfQVRJX1JFTU9URTIgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfS0VZU1BBTl9SRU1PVEUgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfUE9XRVJNQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1lFQUxJTksgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfQ00xMDkgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX1RXTDQwMzBfUFdSQlVUVE9OPXkKK0NPTkZJR19JTlBVVF9VSU5QVVQ9eQorIyBDT05GSUdfSU5QVVRfR1BJT19ST1RBUllfRU5DT0RFUiBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCitDT05GSUdfU0VSSU89eQorQ09ORklHX1NFUklPX1NFUlBPUlQ9eQorQ09ORklHX1NFUklPX0xJQlBTMj15CisjIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKK0NPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkc9eQorQ09ORklHX0RFVktNRU09eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz0zMgorQ09ORklHX1NFUklBTF84MjUwX1JVTlRJTUVfVUFSVFM9NAorQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKK0NPTkZJR19TRVJJQUxfODI1MF9NQU5ZX1BPUlRTPXkKK0NPTkZJR19TRVJJQUxfODI1MF9TSEFSRV9JUlE9eQorQ09ORklHX1NFUklBTF84MjUwX0RFVEVDVF9JUlE9eQorQ09ORklHX1NFUklBTF84MjUwX1JTQT15CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfU0VSSUFMX01BWDMxMDAgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CisjIENPTkZJR19ERVZQVFNfTVVMVElQTEVfSU5TVEFOQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CitDT05GSUdfSFdfUkFORE9NPXkKKyMgQ09ORklHX0hXX1JBTkRPTV9USU1FUklPTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQk9BUkRJTkZPPXkKK0NPTkZJR19JMkNfQ09NUEFUPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj15CitDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKKworIworIyBJMkMgc3lzdGVtIGJ1cyBkcml2ZXJzIChtb3N0bHkgZW1iZWRkZWQgLyBzeXN0ZW0tb24tY2hpcCkKKyMKKyMgQ09ORklHX0kyQ19ERVNJR05XQVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19HUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAorQ09ORklHX0kyQ19PTUFQPXkKKyMgQ09ORklHX0kyQ19TSU1URUMgaXMgbm90IHNldAorCisjCisjIEV4dGVybmFsIEkyQy9TTUJ1cyBhZGFwdGVyIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19UQU9TX0VWTSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVElOWV9VU0IgaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQy9TTUJ1cyBidXMgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorQ09ORklHX1NQST15CisjIENPTkZJR19TUElfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1NQSV9NQVNURVI9eQorCisjCisjIFNQSSBNYXN0ZXIgQ29udHJvbGxlciBEcml2ZXJzCisjCisjIENPTkZJR19TUElfQklUQkFORyBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfR1BJTyBpcyBub3Qgc2V0CitDT05GSUdfU1BJX09NQVAyNFhYPXkKKworIworIyBTUEkgUHJvdG9jb2wgTWFzdGVycworIworQ09ORklHX1NQSV9TUElERVY9eQorIyBDT05GSUdfU1BJX1RMRTYyWDAgaXMgbm90IHNldAorCisjCisjIFBQUyBzdXBwb3J0CisjCisjIENPTkZJR19QUFMgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfUkVRVUlSRV9HUElPTElCPXkKK0NPTkZJR19HUElPTElCPXkKKyMgQ09ORklHX0RFQlVHX0dQSU8gaXMgbm90IHNldAorQ09ORklHX0dQSU9fU1lTRlM9eQorCisjCisjIE1lbW9yeSBtYXBwZWQgR1BJTyBleHBhbmRlcnM6CisjCisKKyMKKyMgSTJDIEdQSU8gZXhwYW5kZXJzOgorIworIyBDT05GSUdfR1BJT19NQVg3MzJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dQSU9fUENBOTUzWCBpcyBub3Qgc2V0CisjIENPTkZJR19HUElPX1BDRjg1N1ggaXMgbm90IHNldAorQ09ORklHX0dQSU9fVFdMNDAzMD15CisKKyMKKyMgUENJIEdQSU8gZXhwYW5kZXJzOgorIworCisjCisjIFNQSSBHUElPIGV4cGFuZGVyczoKKyMKKyMgQ09ORklHX0dQSU9fTUFYNzMwMSBpcyBub3Qgc2V0CisjIENPTkZJR19HUElPX01DUDIzUzA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0dQSU9fTUMzMzg4MCBpcyBub3Qgc2V0CisKKyMKKyMgQUM5NyBHUElPIGV4cGFuZGVyczoKKyMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKK0NPTkZJR19QT1dFUl9TVVBQTFk9eQorIyBDT05GSUdfUE9XRVJfU1VQUExZX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BEQV9QT1dFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CQVRURVJZX0RTMjc2MCBpcyBub3Qgc2V0CisjIENPTkZJR19CQVRURVJZX0RTMjc4MiBpcyBub3Qgc2V0CitDT05GSUdfQkFUVEVSWV9CUTI3eDAwPXkKKyMgQ09ORklHX0JBVFRFUllfTUFYMTcwNDAgaXMgbm90IHNldAorQ09ORklHX0hXTU9OPXkKKyMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBOYXRpdmUgZHJpdmVycworIworIyBDT05GSUdfU0VOU09SU19BRDc0MTQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRDc0MTggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRENYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNOTI0MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEVDc0NjIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFQ3NDcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURUNzQ3MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEVDc0NzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GNzE4ODJGRyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0Y3NTM3NVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HNzYwQSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTE4U00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUyMFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNjMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xUQzQyMTUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MVEM0MjQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05NTI0MSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDExMTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjY1MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3NDI3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NIVDE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRE1FMTczNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTE5MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFM3ODI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVEhNQzUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVE1QNDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVE1QNDIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVlQxMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc5MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3OTJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzkzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4Nk5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MSVMzX1NQSSBpcyBub3Qgc2V0CitDT05GSUdfVEhFUk1BTD15CitDT05GSUdfVEhFUk1BTF9IV01PTj15CitDT05GSUdfV0FUQ0hET0c9eQorQ09ORklHX1dBVENIRE9HX05PV0FZT1VUPXkKKworIworIyBXYXRjaGRvZyBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfU09GVF9XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfT01BUF9XQVRDSERPRz15CisjIENPTkZJR19UV0w0MDMwX1dBVENIRE9HIGlzIG5vdCBzZXQKKworIworIyBVU0ItYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1VTQlBDV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX1NTQl9QT1NTSUJMRT15CisKKyMKKyMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCisjCisjIENPTkZJR19TU0IgaXMgbm90IHNldAorCisjCisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfSFRDX0VHUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfVFBTNjUwMTAgaXMgbm90IHNldAorQ09ORklHX1RXTDQwMzBfQ09SRT15CisjIENPTkZJR19UV0w0MDMwX1BPV0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RXTDQwMzBfQ09ERUMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1Q3TDY2WEIgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RDNjM4N1hCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UQzYzOTNYQiBpcyBub3Qgc2V0CisjIENPTkZJR19QTUlDX0RBOTAzWCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzMVggaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1BDRjUwNjMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9NQzEzNzgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FCMzEwMF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VaWF9QQ0FQIGlzIG5vdCBzZXQKK0NPTkZJR19SRUdVTEFUT1I9eQorIyBDT05GSUdfUkVHVUxBVE9SX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9GSVhFRF9WT0xUQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9WSVJUVUFMX0NPTlNVTUVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9VU0VSU1BBQ0VfQ09OU1VNRVIgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX0JRMjQwMjIgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX01BWDE1ODYgaXMgbm90IHNldAorQ09ORklHX1JFR1VMQVRPUl9UV0w0MDMwPXkKKyMgQ09ORklHX1JFR1VMQVRPUl9MUDM5NzEgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SX1RQUzY1MDIzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUl9UUFM2NTA3WCBpcyBub3Qgc2V0CisjIENPTkZJR19NRURJQV9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTCBpcyBub3Qgc2V0CitDT05GSUdfRkI9eQorIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9EREMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQk9PVF9WRVNBX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0NGQl9DT1BZQVJFQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9DRkJfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0NGQl9SRVZfUElYRUxTX0lOX0JZVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0ZPUkVJR05fRU5ESUFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NWR0FMSUIgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQkFDS0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAorCisjCisjIEZyYW1lIGJ1ZmZlciBoYXJkd2FyZSBkcml2ZXJzCisjCisjIENPTkZJR19GQl9TMUQxM1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01FVFJPTk9NRSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NQjg2MlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JST0FEU0hFRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX0JBQ0tMSUdIVF9DTEFTU19ERVZJQ0U9eQorQ09ORklHX0JBQ0tMSUdIVF9HRU5FUklDPXkKKworIworIyBEaXNwbGF5IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfRElTUExBWV9TVVBQT1JUPXkKKworIworIyBEaXNwbGF5IGhhcmR3YXJlIGRyaXZlcnMKKyMKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKK0NPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKKyMgQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEVfREVURUNUX1BSSU1BUlkgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEVfUk9UQVRJT049eQorIyBDT05GSUdfRk9OVFMgaXMgbm90IHNldAorQ09ORklHX0ZPTlRfOHg4PXkKK0NPTkZJR19GT05UXzh4MTY9eQorQ09ORklHX0xPR089eQorQ09ORklHX0xPR09fTElOVVhfTU9OTz15CitDT05GSUdfTE9HT19MSU5VWF9WR0ExNj15CitDT05GSUdfTE9HT19MSU5VWF9DTFVUMjI0PXkKK0NPTkZJR19TT1VORD15CitDT05GSUdfU09VTkRfT1NTX0NPUkU9eQorQ09ORklHX1NPVU5EX09TU19DT1JFX1BSRUNMQUlNPXkKK0NPTkZJR19TTkQ9eQorQ09ORklHX1NORF9USU1FUj15CitDT05GSUdfU05EX1BDTT15CitDT05GSUdfU05EX0hXREVQPXkKK0NPTkZJR19TTkRfUkFXTUlEST15CitDT05GSUdfU05EX0pBQ0s9eQorQ09ORklHX1NORF9TRVFVRU5DRVI9bQorIyBDT05GSUdfU05EX1NFUV9EVU1NWSBpcyBub3Qgc2V0CitDT05GSUdfU05EX09TU0VNVUw9eQorQ09ORklHX1NORF9NSVhFUl9PU1M9eQorQ09ORklHX1NORF9QQ01fT1NTPXkKK0NPTkZJR19TTkRfUENNX09TU19QTFVHSU5TPXkKK0NPTkZJR19TTkRfU0VRVUVOQ0VSX09TUz15CitDT05GSUdfU05EX0hSVElNRVI9bQorQ09ORklHX1NORF9TRVFfSFJUSU1FUl9ERUZBVUxUPXkKKyMgQ09ORklHX1NORF9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CitDT05GSUdfU05EX1NVUFBPUlRfT0xEX0FQST15CitDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTPXkKKyMgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1NORF9SQVdNSURJX1NFUT1tCisjIENPTkZJR19TTkRfT1BMM19MSUJfU0VRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9PUEw0X0xJQl9TRVEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1NCQVdFX1NFUSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRU1VMTBLMV9TRVEgaXMgbm90IHNldAorQ09ORklHX1NORF9EUklWRVJTPXkKKyMgQ09ORklHX1NORF9EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfVklSTUlESSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTVRQQVYgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1NFUklBTF9VMTY1NTAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01QVTQwMSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVJNIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfU1BJPXkKK0NPTkZJR19TTkRfVVNCPXkKK0NPTkZJR19TTkRfVVNCX0FVRElPPXkKK0NPTkZJR19TTkRfVVNCX0NBSUFRPW0KK0NPTkZJR19TTkRfVVNCX0NBSUFRX0lOUFVUPXkKK0NPTkZJR19TTkRfU09DPXkKK0NPTkZJR19TTkRfT01BUF9TT0M9eQorQ09ORklHX1NORF9TT0NfSTJDX0FORF9TUEk9eQorIyBDT05GSUdfU05EX1NPQ19BTExfQ09ERUNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKK0NPTkZJR19ISURfU1VQUE9SVD15CitDT05GSUdfSElEPXkKKyMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIElucHV0IERldmljZXMKKyMKK0NPTkZJR19VU0JfSElEPXkKKyMgQ09ORklHX0hJRF9QSUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0hJRERFViBpcyBub3Qgc2V0CisKKyMKKyMgU3BlY2lhbCBISUQgZHJpdmVycworIworIyBDT05GSUdfSElEX0E0VEVDSCBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfQVBQTEUgaXMgbm90IHNldAorIyBDT05GSUdfSElEX0JFTEtJTiBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfQ0hFUlJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9DSElDT05ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9DWVBSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9EUkFHT05SSVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9FWktFWSBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfS1lFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9HWVJBVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfVFdJTkhBTiBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfS0VOU0lOR1RPTiBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfTE9HSVRFQ0ggaXMgbm90IHNldAorIyBDT05GSUdfSElEX01JQ1JPU09GVCBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfTU9OVEVSRVkgaXMgbm90IHNldAorIyBDT05GSUdfSElEX05UUklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9QQU5USEVSTE9SRCBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfUEVUQUxZTlggaXMgbm90IHNldAorIyBDT05GSUdfSElEX1NBTVNVTkcgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1NPTlkgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1NVTlBMVVMgaXMgbm90IHNldAorIyBDT05GSUdfSElEX0dSRUVOQVNJQSBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfU01BUlRKT1lQTFVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9UT1BTRUVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9USFJVU1RNQVNURVIgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1dBQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9aRVJPUExVUyBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1NVUFBPUlQ9eQorQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19FSENJIGlzIG5vdCBzZXQKK0NPTkZJR19VU0I9eQorIyBDT05GSUdfVVNCX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BTk5PVU5DRV9ORVdfREVWSUNFUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVU0Igb3B0aW9ucworIworQ09ORklHX1VTQl9ERVZJQ0VGUz15CitDT05GSUdfVVNCX0RFVklDRV9DTEFTUz15CisjIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAorQ09ORklHX1VTQl9TVVNQRU5EPXkKK0NPTkZJR19VU0JfT1RHPXkKKyMgQ09ORklHX1VTQl9PVEdfV0hJVEVMSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEdfQkxBQ0tMSVNUX0hVQiBpcyBub3Qgc2V0CitDT05GSUdfVVNCX01PTj15CisjIENPTkZJR19VU0JfV1VTQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV1VTQl9DQkFGIGlzIG5vdCBzZXQKKworIworIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9DNjdYMDBfSENEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfT1hVMjEwSFBfSENEPXkKKyMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNQMTc2MF9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTUDEzNjJfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PSENJX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SOEE2NjU5N19IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0hXQV9IQ0QgaXMgbm90IHNldAorQ09ORklHX1VTQl9NVVNCX0hEUkM9eQorQ09ORklHX1VTQl9NVVNCX1NPQz15CisKKyMKKyMgT01BUCAzNDN4IGhpZ2ggc3BlZWQgVVNCIHN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9NVVNCX0hPU1QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01VU0JfUEVSSVBIRVJBTCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX01VU0JfT1RHPXkKK0NPTkZJR19VU0JfR0FER0VUX01VU0JfSERSQz15CitDT05GSUdfVVNCX01VU0JfSERSQ19IQ0Q9eQorIyBDT05GSUdfTVVTQl9QSU9fT05MWSBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0lOVkVOVFJBX0RNQT15CisjIENPTkZJR19VU0JfVElfQ1BQSV9ETUEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01VU0JfREVCVUcgaXMgbm90IHNldAorCisjCisjIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycworIworQ09ORklHX1VTQl9BQ009bQorQ09ORklHX1VTQl9QUklOVEVSPW0KK0NPTkZJR19VU0JfV0RNPW0KK0NPTkZJR19VU0JfVE1DPW0KKworIworIyBOT1RFOiBVU0JfU1RPUkFHRSBkZXBlbmRzIG9uIFNDU0kgYnV0IEJMS19ERVZfU0QgbWF5CisjCisKKyMKKyMgYWxzbyBiZSBuZWVkZWQ7IHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm8KKyMKK0NPTkZJR19VU0JfU1RPUkFHRT15CisjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSVNEMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1VTQkFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFIwOSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSNTUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSlVNUFNIT1QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfQUxBVURBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX09ORVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0tBUk1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0NZUFJFU1NfQVRBQ0IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xJQlVTVUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW1hZ2luZyBkZXZpY2VzCisjCisjIENPTkZJR19VU0JfTURDODAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NSUNST1RFSyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHBvcnQgZHJpdmVycworIworQ09ORklHX1VTQl9TRVJJQUw9bQorQ09ORklHX1VTQl9FWlVTQj15CitDT05GSUdfVVNCX1NFUklBTF9HRU5FUklDPXkKK0NPTkZJR19VU0JfU0VSSUFMX0FJUkNBQkxFPW0KK0NPTkZJR19VU0JfU0VSSUFMX0FSSzMxMTY9bQorQ09ORklHX1VTQl9TRVJJQUxfQkVMS0lOPW0KK0NPTkZJR19VU0JfU0VSSUFMX0NIMzQxPW0KK0NPTkZJR19VU0JfU0VSSUFMX1dISVRFSEVBVD1tCitDT05GSUdfVVNCX1NFUklBTF9ESUdJX0FDQ0VMRVBPUlQ9bQorIyBDT05GSUdfVVNCX1NFUklBTF9DUDIxMFggaXMgbm90IHNldAorQ09ORklHX1VTQl9TRVJJQUxfQ1lQUkVTU19NOD1tCitDT05GSUdfVVNCX1NFUklBTF9FTVBFRz1tCitDT05GSUdfVVNCX1NFUklBTF9GVERJX1NJTz1tCitDT05GSUdfVVNCX1NFUklBTF9GVU5TT0ZUPW0KK0NPTkZJR19VU0JfU0VSSUFMX1ZJU09SPW0KK0NPTkZJR19VU0JfU0VSSUFMX0lQQVE9bQorQ09ORklHX1VTQl9TRVJJQUxfSVI9bQorQ09ORklHX1VTQl9TRVJJQUxfRURHRVBPUlQ9bQorQ09ORklHX1VTQl9TRVJJQUxfRURHRVBPUlRfVEk9bQorQ09ORklHX1VTQl9TRVJJQUxfR0FSTUlOPW0KK0NPTkZJR19VU0JfU0VSSUFMX0lQVz1tCitDT05GSUdfVVNCX1NFUklBTF9JVVU9bQorQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9QREE9bQorQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTj1tCitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX01QUj15CitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTI4PXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMjhYPXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBMjhYQT15CitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTI4WEI9eQorQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0ExOT15CitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTE4WD15CitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTE5Vz15CitDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1VTQTE5UVc9eQorQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9VU0ExOVFJPXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBNDlXPXkKK0NPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fVVNBNDlXTEM9eQorQ09ORklHX1VTQl9TRVJJQUxfS0xTST1tCitDT05GSUdfVVNCX1NFUklBTF9LT0JJTF9TQ1Q9bQorQ09ORklHX1VTQl9TRVJJQUxfTUNUX1UyMzI9bQorQ09ORklHX1VTQl9TRVJJQUxfTU9TNzcyMD1tCitDT05GSUdfVVNCX1NFUklBTF9NT1M3ODQwPW0KK0NPTkZJR19VU0JfU0VSSUFMX01PVE9ST0xBPW0KK0NPTkZJR19VU0JfU0VSSUFMX05BVk1BTj1tCitDT05GSUdfVVNCX1NFUklBTF9QTDIzMDM9bQorQ09ORklHX1VTQl9TRVJJQUxfT1RJNjg1OD1tCisjIENPTkZJR19VU0JfU0VSSUFMX1FVQUxDT01NIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfU0VSSUFMX1NQQ1A4WDU9bQorQ09ORklHX1VTQl9TRVJJQUxfSFA0WD1tCitDT05GSUdfVVNCX1NFUklBTF9TQUZFPW0KKyMgQ09ORklHX1VTQl9TRVJJQUxfU0FGRV9QQURERUQgaXMgbm90IHNldAorQ09ORklHX1VTQl9TRVJJQUxfU0lFTUVOU19NUEk9bQorQ09ORklHX1VTQl9TRVJJQUxfU0lFUlJBV0lSRUxFU1M9bQorIyBDT05GSUdfVVNCX1NFUklBTF9TWU1CT0wgaXMgbm90IHNldAorQ09ORklHX1VTQl9TRVJJQUxfVEk9bQorQ09ORklHX1VTQl9TRVJJQUxfQ1lCRVJKQUNLPW0KK0NPTkZJR19VU0JfU0VSSUFMX1hJUkNPTT1tCitDT05GSUdfVVNCX1NFUklBTF9PUFRJT049bQorQ09ORklHX1VTQl9TRVJJQUxfT01OSU5FVD1tCitDT05GSUdfVVNCX1NFUklBTF9PUFRJQ09OPW0KK0NPTkZJR19VU0JfU0VSSUFMX0RFQlVHPW0KKworIworIyBVU0IgTWlzY2VsbGFuZW91cyBkcml2ZXJzCisjCitDT05GSUdfVVNCX0VNSTYyPW0KK0NPTkZJR19VU0JfRU1JMjY9bQorIyBDT05GSUdfVVNCX0FEVVRVWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VWU0VHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9CRVJSWV9DSEFSR0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1lQUkVTU19DWTdDNjMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZVEhFUk0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lETU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0ZURElfRUxBTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVBQTEVESVNQTEFZIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfU0lTVVNCVkdBPW0KK0NPTkZJR19VU0JfU0lTVVNCVkdBX0NPTj15CisjIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JT1dBUlJJT1IgaXMgbm90IHNldAorQ09ORklHX1VTQl9URVNUPW0KKyMgQ09ORklHX1VTQl9JU0lHSFRGVyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVlNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVE0gaXMgbm90IHNldAorQ09ORklHX1VTQl9HQURHRVQ9bQorIyBDT05GSUdfVVNCX0dBREdFVF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0RFQlVHX0ZJTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfR0FER0VUX0RFQlVHX0ZTPXkKK0NPTkZJR19VU0JfR0FER0VUX1ZCVVNfRFJBVz0yCitDT05GSUdfVVNCX0dBREdFVF9TRUxFQ1RFRD15CisjIENPTkZJR19VU0JfR0FER0VUX0FUOTEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9BVE1FTF9VU0JBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfRlNMX1VTQjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX1BYQTI1WCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX1I4QTY2NTk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfUFhBMjdYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfUzNDX0hTT1RHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfSU1YIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX002NjU5MiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0FNRDU1MzZVREMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9GU0xfUUUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9DSTEzWFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfTkVUMjI4MCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0dPS1UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9MQU5HV0VMTCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0RVTU1ZX0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0dBREdFVF9EVUFMU1BFRUQ9eQorQ09ORklHX1VTQl9aRVJPPW0KK0NPTkZJR19VU0JfWkVST19ITlBURVNUPXkKKyMgQ09ORklHX1VTQl9BVURJTyBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0VUSD1tCitDT05GSUdfVVNCX0VUSF9STkRJUz15CisjIENPTkZJR19VU0JfRVRIX0VFTSBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0dBREdFVEZTPW0KK0NPTkZJR19VU0JfRklMRV9TVE9SQUdFPW0KKyMgQ09ORklHX1VTQl9GSUxFX1NUT1JBR0VfVEVTVCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0dfU0VSSUFMPW0KK0NPTkZJR19VU0JfTUlESV9HQURHRVQ9bQorQ09ORklHX1VTQl9HX1BSSU5URVI9bQorQ09ORklHX1VTQl9DRENfQ09NUE9TSVRFPW0KKworIworIyBPVEcgYW5kIHJlbGF0ZWQgaW5mcmFzdHJ1Y3R1cmUKKyMKK0NPTkZJR19VU0JfT1RHX1VUSUxTPXkKK0NPTkZJR19VU0JfR1BJT19WQlVTPXkKKyMgQ09ORklHX0lTUDEzMDFfT01BUCBpcyBub3Qgc2V0CitDT05GSUdfVFdMNDAzMF9VU0I9eQorIyBDT05GSUdfTk9QX1VTQl9YQ0VJViBpcyBub3Qgc2V0CitDT05GSUdfTU1DPXkKKyMgQ09ORklHX01NQ19ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfTU1DX1VOU0FGRV9SRVNVTUU9eQorCisjCisjIE1NQy9TRC9TRElPIENhcmQgRHJpdmVycworIworQ09ORklHX01NQ19CTE9DSz15CitDT05GSUdfTU1DX0JMT0NLX0JPVU5DRT15CitDT05GSUdfU0RJT19VQVJUPXkKKyMgQ09ORklHX01NQ19URVNUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QvU0RJTyBIb3N0IENvbnRyb2xsZXIgRHJpdmVycworIworIyBDT05GSUdfTU1DX1NESENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQ19PTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19NTUNfT01BUF9IUz15CisjIENPTkZJR19NTUNfQVQ5MSBpcyBub3Qgc2V0CisjIENPTkZJR19NTUNfQVRNRUxNQ0kgaXMgbm90IHNldAorQ09ORklHX01NQ19TUEk9bQorIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAorQ09ORklHX05FV19MRURTPXkKK0NPTkZJR19MRURTX0NMQVNTPXkKKworIworIyBMRUQgZHJpdmVycworIworIyBDT05GSUdfTEVEU19QQ0E5NTMyIGlzIG5vdCBzZXQKK0NPTkZJR19MRURTX0dQSU89eQorQ09ORklHX0xFRFNfR1BJT19QTEFURk9STT15CisjIENPTkZJR19MRURTX0xQMzk0NCBpcyBub3Qgc2V0CisjIENPTkZJR19MRURTX1BDQTk1NVggaXMgbm90IHNldAorIyBDT05GSUdfTEVEU19EQUMxMjRTMDg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xFRFNfQkQyODAyIGlzIG5vdCBzZXQKKworIworIyBMRUQgVHJpZ2dlcnMKKyMKK0NPTkZJR19MRURTX1RSSUdHRVJTPXkKK0NPTkZJR19MRURTX1RSSUdHRVJfVElNRVI9bQorQ09ORklHX0xFRFNfVFJJR0dFUl9IRUFSVEJFQVQ9eQorQ09ORklHX0xFRFNfVFJJR0dFUl9CQUNLTElHSFQ9bQorIyBDT05GSUdfTEVEU19UUklHR0VSX0dQSU8gaXMgbm90IHNldAorQ09ORklHX0xFRFNfVFJJR0dFUl9ERUZBVUxUX09OPW0KKworIworIyBpcHRhYmxlcyB0cmlnZ2VyIGlzIHVuZGVyIE5ldGZpbHRlciBjb25maWcgKExFRCB0YXJnZXQpCisjCisjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19SVENfTElCPXkKK0NPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19IQ1RPU1lTPXkKK0NPTkZJR19SVENfSENUT1NZU19ERVZJQ0U9InJ0YzAiCisjIENPTkZJR19SVENfREVCVUcgaXMgbm90IHNldAorCisjCisjIFJUQyBpbnRlcmZhY2VzCisjCitDT05GSUdfUlRDX0lOVEZfU1lTRlM9eQorQ09ORklHX1JUQ19JTlRGX1BST0M9eQorQ09ORklHX1JUQ19JTlRGX0RFVj15CisjIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5vdCBzZXQKKworIworIyBJMkMgUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzA3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNjcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JTNUMzNzIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9JU0wxMjA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfWDEyMDUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUENGODU4MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000MVQ4MCBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0RSVl9UV0w0MDMwPXkKKyMgQ09ORklHX1JUQ19EUlZfUzM1MzkwQSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0ZNMzEzMCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JYODU4MSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JYODAyNSBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX000MVQ5NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTMwNSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTM5MCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX01BWDY5MDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SOTcwMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JTNUMzNDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzMyMzQgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9QQ0YyMTIzIGlzIG5vdCBzZXQKKworIworIyBQbGF0Zm9ybSBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9DTU9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxMjg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTUzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUMzUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUNTkgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9CUTQ4MDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CisKKyMKKyMgb24tQ1BVIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVWERJU1BMQVkgaXMgbm90IHNldAorQ09ORklHX1VJTz1tCitDT05GSUdfVUlPX1BEUlY9bQorQ09ORklHX1VJT19QRFJWX0dFTklSUT1tCisjIENPTkZJR19VSU9fU01YIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VJT19TRVJDT1MzIGlzIG5vdCBzZXQKKworIworIyBUSSBWTFlOUQorIworQ09ORklHX1NUQUdJTkc9eQorIyBDT05GSUdfU1RBR0lOR19FWENMVURFX0JVSUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JUF9DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfVzM1VU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSSVNNMl9VU0IgaXMgbm90IHNldAorIyBDT05GSUdfRUNITyBpcyBub3Qgc2V0CisjIENPTkZJR19PVFVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTUVESSBpcyBub3Qgc2V0CisjIENPTkZJR19BU1VTX09MRUQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlNSU8gaXMgbm90IHNldAorIyBDT05GSUdfVFJBTlpQT1JUIGlzIG5vdCBzZXQKKworIworIyBBbmRyb2lkCisjCisKKyMKKyMgUXVhbGNvbW0gTVNNIENhbWVyYSBBbmQgVmlkZW8KKyMKKworIworIyBDYW1lcmEgU2Vuc29yIFNlbGVjdGlvbgorIworIyBDT05GSUdfSU5QVVRfR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19EU1QgaXMgbm90IHNldAorIyBDT05GSUdfUE9ITUVMRlMgaXMgbm90IHNldAorIyBDT05GSUdfUExBTjlBVVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJTkU2X1VTQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1FVQVRFQ0gyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfUVVBVEVDSF9VU0IyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZUNjY1NiBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9VREwgaXMgbm90IHNldAorCisjCisjIFJBUiBSZWdpc3RlciBEcml2ZXIKKyMKKyMgQ09ORklHX1JBUl9SRUdJU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JSU8gaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CitDT05GSUdfRVhUM19GUz15CisjIENPTkZJR19FWFQzX0RFRkFVTFRTX1RPX09SREVSRUQgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfRVhUNF9GUz1tCitDT05GSUdfRVhUNF9GU19YQVRUUj15CisjIENPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0X0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0pCRD15CisjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0pCRDI9bQorIyBDT05GSUdfSkJEMl9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfRlNfTUJDQUNIRT1tCitDT05GSUdfUkVJU0VSRlNfRlM9bQorIyBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX1JFSVNFUkZTX1BST0NfSU5GTz15CitDT05GSUdfUkVJU0VSRlNfRlNfWEFUVFI9eQorIyBDT05GSUdfUkVJU0VSRlNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19KRlNfRlM9bQorIyBDT05GSUdfSkZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19TVEFUSVNUSUNTIGlzIG5vdCBzZXQKK0NPTkZJR19GU19QT1NJWF9BQ0w9eQorQ09ORklHX1hGU19GUz1tCisjIENPTkZJR19YRlNfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfUlQgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19GSUxFX0xPQ0tJTkc9eQorQ09ORklHX0ZTTk9USUZZPXkKK0NPTkZJR19ETk9USUZZPXkKK0NPTkZJR19JTk9USUZZPXkKK0NPTkZJR19JTk9USUZZX1VTRVI9eQorQ09ORklHX1FVT1RBPXkKKyMgQ09ORklHX1FVT1RBX05FVExJTktfSU5URVJGQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19QUklOVF9RVU9UQV9XQVJOSU5HPXkKK0NPTkZJR19RVU9UQV9UUkVFPXkKKyMgQ09ORklHX1FGTVRfVjEgaXMgbm90IHNldAorQ09ORklHX1FGTVRfVjI9eQorQ09ORklHX1FVT1RBQ1RMPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CitDT05GSUdfQVVUT0ZTNF9GUz1tCitDT05GSUdfRlVTRV9GUz15CisjIENPTkZJR19DVVNFIGlzIG5vdCBzZXQKKworIworIyBDYWNoZXMKKyMKKyMgQ09ORklHX0ZTQ0FDSEUgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19JU085NjYwX0ZTPW0KK0NPTkZJR19KT0xJRVQ9eQorQ09ORklHX1pJU09GUz15CitDT05GSUdfVURGX0ZTPW0KK0NPTkZJR19VREZfTkxTPXkKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPXkKK0NPTkZJR19NU0RPU19GUz15CitDT05GSUdfVkZBVF9GUz15CitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3CitDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCitDT05GSUdfTlRGU19GUz1tCisjIENPTkZJR19OVEZTX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19OVEZTX1JXPXkKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19DT05GSUdGU19GUz1tCitDT05GSUdfTUlTQ19GSUxFU1lTVEVNUz15CisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUNSWVBUX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfRlM9eQorQ09ORklHX0pGRlMyX0ZTX0RFQlVHPTAKK0NPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUj15CisjIENPTkZJR19KRkZTMl9GU19XQlVGX1ZFUklGWSBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfU1VNTUFSWT15CitDT05GSUdfSkZGUzJfRlNfWEFUVFI9eQorQ09ORklHX0pGRlMyX0ZTX1BPU0lYX0FDTD15CitDT05GSUdfSkZGUzJfRlNfU0VDVVJJVFk9eQorQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlM9eQorQ09ORklHX0pGRlMyX1pMSUI9eQorQ09ORklHX0pGRlMyX0xaTz15CitDT05GSUdfSkZGUzJfUlRJTUU9eQorQ09ORklHX0pGRlMyX1JVQklOPXkKKyMgQ09ORklHX0pGRlMyX0NNT0RFX05PTkUgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ01PREVfUFJJT1JJVFkgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ01PREVfU0laRSBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfQ01PREVfRkFWT1VSTFpPPXkKK0NPTkZJR19VQklGU19GUz15CitDT05GSUdfVUJJRlNfRlNfWEFUVFI9eQorQ09ORklHX1VCSUZTX0ZTX0FEVkFOQ0VEX0NPTVBSPXkKK0NPTkZJR19VQklGU19GU19MWk89eQorQ09ORklHX1VCSUZTX0ZTX1pMSUI9eQorIyBDT05GSUdfVUJJRlNfRlNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKK0NPTkZJR19TUVVBU0hGUz15CisjIENPTkZJR19TUVVBU0hGU19FTUJFRERFRCBpcyBub3Qgc2V0CitDT05GSUdfU1FVQVNIRlNfRlJBR01FTlRfQ0FDSEVfU0laRT0zCisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQorQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAorQ09ORklHX05GU19WND15CisjIENPTkZJR19ORlNfVjRfMSBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX05GU0Q9bQorQ09ORklHX05GU0RfVjJfQUNMPXkKK0NPTkZJR19ORlNEX1YzPXkKK0NPTkZJR19ORlNEX1YzX0FDTD15CitDT05GSUdfTkZTRF9WND15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19FWFBPUlRGUz1tCitDT05GSUdfTkZTX0FDTF9TVVBQT1JUPW0KK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorQ09ORklHX1NVTlJQQ19HU1M9eQorQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT15CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CitDT05GSUdfQ0lGUz1tCitDT05GSUdfQ0lGU19TVEFUUz15CitDT05GSUdfQ0lGU19TVEFUUzI9eQorIyBDT05GSUdfQ0lGU19XRUFLX1BXX0hBU0ggaXMgbm90IHNldAorIyBDT05GSUdfQ0lGU19VUENBTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTX0RFQlVHMiBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTX0RGU19VUENBTEwgaXMgbm90IHNldAorQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMPXkKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCitDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKKyMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKK0NPTkZJR19CU0RfRElTS0xBQkVMPXkKK0NPTkZJR19NSU5JWF9TVUJQQVJUSVRJT049eQorQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTj15CitDT05GSUdfVU5JWFdBUkVfRElTS0xBQkVMPXkKKyMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfS0FSTUFfUEFSVElUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19FRklfUEFSVElUSU9OPXkKKyMgQ09ORklHX1NZU1Y2OF9QQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX05MUz15CitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKK0NPTkZJR19OTFNfQ09ERVBBR0VfNDM3PXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfNzM3PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfNzc1PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODUwPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODUyPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODU1PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODU3PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODYwPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODYxPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODYyPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODYzPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODY0PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODY1PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODY2PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODY5PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfOTM2PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfOTUwPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfOTMyPW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfOTQ5PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODc0PW0KK0NPTkZJR19OTFNfSVNPODg1OV84PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfMTI1MD1tCitDT05GSUdfTkxTX0NPREVQQUdFXzEyNTE9bQorQ09ORklHX05MU19BU0NJST1tCitDT05GSUdfTkxTX0lTTzg4NTlfMT1tCitDT05GSUdfTkxTX0lTTzg4NTlfMj1tCitDT05GSUdfTkxTX0lTTzg4NTlfMz1tCitDT05GSUdfTkxTX0lTTzg4NTlfND1tCitDT05GSUdfTkxTX0lTTzg4NTlfNT1tCitDT05GSUdfTkxTX0lTTzg4NTlfNj1tCitDT05GSUdfTkxTX0lTTzg4NTlfNz1tCitDT05GSUdfTkxTX0lTTzg4NTlfOT1tCitDT05GSUdfTkxTX0lTTzg4NTlfMTM9bQorQ09ORklHX05MU19JU084ODU5XzE0PW0KK0NPTkZJR19OTFNfSVNPODg1OV8xNT1tCitDT05GSUdfTkxTX0tPSThfUj1tCitDT05GSUdfTkxTX0tPSThfVT1tCitDT05GSUdfTkxTX1VURjg9eQorIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworQ09ORklHX1BSSU5US19USU1FPXkKK0NPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKK0NPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CitDT05GSUdfTUFHSUNfU1lTUlE9eQorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0ZTPXkKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUMgaXMgbm90IHNldAorQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDX1ZBTFVFPTAKK0NPTkZJR19ERVRFQ1RfSFVOR19UQVNLPXkKKyMgQ09ORklHX0JPT1RQQVJBTV9IVU5HX1RBU0tfUEFOSUMgaXMgbm90IHNldAorQ09ORklHX0JPT1RQQVJBTV9IVU5HX1RBU0tfUEFOSUNfVkFMVUU9MAorQ09ORklHX1NDSEVEX0RFQlVHPXkKK0NPTkZJR19TQ0hFRFNUQVRTPXkKK0NPTkZJR19USU1FUl9TVEFUUz15CisjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS01FTUxFQUsgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1BSRUVNUFQ9eQorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX01VVEVYRVM9eQorIyBDT05GSUdfREVCVUdfTE9DS19BTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9WRV9MT0NLSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQ0tfU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorQ09ORklHX1NUQUNLVFJBQ0U9eQorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NRU1PUllfSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX05PVElGSUVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19DUkVERU5USUFMUyBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UX1BSSU5US19ERUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GT1JDRV9XRUFLX1BFUl9DUFUgaXMgbm90IHNldAorIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAorIyBDT05GSUdfUEFHRV9QT0lTT05JTkcgaXMgbm90IHNldAorQ09ORklHX05PUF9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKK0NPTkZJR19SSU5HX0JVRkZFUj15CitDT05GSUdfRVZFTlRfVFJBQ0lORz15CitDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSPXkKK0NPTkZJR19SSU5HX0JVRkZFUl9BTExPV19TV0FQPXkKK0NPTkZJR19UUkFDSU5HPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQorQ09ORklHX0ZUUkFDRT15CisjIENPTkZJR19GVU5DVElPTl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVJRU09GRl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQUJMRV9ERUZBVUxUX1RSQUNFUlMgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAorQ09ORklHX0JSQU5DSF9QUk9GSUxFX05PTkU9eQorIyBDT05GSUdfUFJPRklMRV9BTk5PVEFURURfQlJBTkNIRVMgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMRV9BTExfQlJBTkNIRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tNRU1UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19XT1JLUVVFVUVfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfUklOR19CVUZGRVJfQkVOQ0hNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RZTkFNSUNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUkNIX0tHREI9eQorIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CitDT05GSUdfQVJNX1VOV0lORD15CisjIENPTkZJR19ERUJVR19VU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0VSUk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MTCBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworQ09ORklHX0tFWVM9eQorIyBDT05GSUdfS0VZU19ERUJVR19QUk9DX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlGUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CitDT05GSUdfWE9SX0JMT0NLUz1tCitDT05GSUdfQVNZTkNfQ09SRT1tCitDT05GSUdfQVNZTkNfTUVNQ1BZPW0KK0NPTkZJR19BU1lOQ19YT1I9bQorQ09ORklHX0FTWU5DX1BRPW0KK0NPTkZJR19BU1lOQ19SQUlENl9SRUNPVj1tCitDT05GSUdfQ1JZUFRPPXkKKworIworIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKKyMKK0NPTkZJR19DUllQVE9fRklQUz15CitDT05GSUdfQ1JZUFRPX0FMR0FQST15CitDT05GSUdfQ1JZUFRPX0FMR0FQSTI9eQorQ09ORklHX0NSWVBUT19BRUFEPW0KK0NPTkZJR19DUllQVE9fQUVBRDI9eQorQ09ORklHX0NSWVBUT19CTEtDSVBIRVI9eQorQ09ORklHX0NSWVBUT19CTEtDSVBIRVIyPXkKK0NPTkZJR19DUllQVE9fSEFTSD15CitDT05GSUdfQ1JZUFRPX0hBU0gyPXkKK0NPTkZJR19DUllQVE9fUk5HPW0KK0NPTkZJR19DUllQVE9fUk5HMj15CitDT05GSUdfQ1JZUFRPX1BDT01QPXkKK0NPTkZJR19DUllQVE9fTUFOQUdFUj15CitDT05GSUdfQ1JZUFRPX01BTkFHRVIyPXkKK0NPTkZJR19DUllQVE9fR0YxMjhNVUw9bQorQ09ORklHX0NSWVBUT19OVUxMPW0KK0NPTkZJR19DUllQVE9fV09SS1FVRVVFPXkKK0NPTkZJR19DUllQVE9fQ1JZUFREPW0KK0NPTkZJR19DUllQVE9fQVVUSEVOQz1tCitDT05GSUdfQ1JZUFRPX1RFU1Q9bQorCisjCisjIEF1dGhlbnRpY2F0ZWQgRW5jcnlwdGlvbiB3aXRoIEFzc29jaWF0ZWQgRGF0YQorIworQ09ORklHX0NSWVBUT19DQ009bQorQ09ORklHX0NSWVBUT19HQ009bQorQ09ORklHX0NSWVBUT19TRVFJVj1tCisKKyMKKyMgQmxvY2sgbW9kZXMKKyMKK0NPTkZJR19DUllQVE9fQ0JDPXkKK0NPTkZJR19DUllQVE9fQ1RSPW0KK0NPTkZJR19DUllQVE9fQ1RTPW0KK0NPTkZJR19DUllQVE9fRUNCPXkKK0NPTkZJR19DUllQVE9fTFJXPW0KK0NPTkZJR19DUllQVE9fUENCQz1tCitDT05GSUdfQ1JZUFRPX1hUUz1tCisKKyMKKyMgSGFzaCBtb2RlcworIworQ09ORklHX0NSWVBUT19ITUFDPW0KK0NPTkZJR19DUllQVE9fWENCQz1tCisjIENPTkZJR19DUllQVE9fVk1BQyBpcyBub3Qgc2V0CisKKyMKKyMgRGlnZXN0CisjCitDT05GSUdfQ1JZUFRPX0NSQzMyQz15CitDT05GSUdfQ1JZUFRPX0dIQVNIPW0KK0NPTkZJR19DUllQVE9fTUQ0PW0KK0NPTkZJR19DUllQVE9fTUQ1PXkKK0NPTkZJR19DUllQVE9fTUlDSEFFTF9NSUM9eQorQ09ORklHX0NSWVBUT19STUQxMjg9bQorQ09ORklHX0NSWVBUT19STUQxNjA9bQorQ09ORklHX0NSWVBUT19STUQyNTY9bQorQ09ORklHX0NSWVBUT19STUQzMjA9bQorQ09ORklHX0NSWVBUT19TSEExPW0KK0NPTkZJR19DUllQVE9fU0hBMjU2PW0KK0NPTkZJR19DUllQVE9fU0hBNTEyPW0KK0NPTkZJR19DUllQVE9fVEdSMTkyPW0KK0NPTkZJR19DUllQVE9fV1A1MTI9bQorCisjCisjIENpcGhlcnMKKyMKK0NPTkZJR19DUllQVE9fQUVTPXkKK0NPTkZJR19DUllQVE9fQU5VQklTPW0KK0NPTkZJR19DUllQVE9fQVJDND15CitDT05GSUdfQ1JZUFRPX0JMT1dGSVNIPW0KK0NPTkZJR19DUllQVE9fQ0FNRUxMSUE9bQorQ09ORklHX0NSWVBUT19DQVNUNT1tCitDT05GSUdfQ1JZUFRPX0NBU1Q2PW0KK0NPTkZJR19DUllQVE9fREVTPXkKK0NPTkZJR19DUllQVE9fRkNSWVBUPW0KK0NPTkZJR19DUllQVE9fS0hBWkFEPW0KK0NPTkZJR19DUllQVE9fU0FMU0EyMD1tCitDT05GSUdfQ1JZUFRPX1NFRUQ9bQorQ09ORklHX0NSWVBUT19TRVJQRU5UPW0KK0NPTkZJR19DUllQVE9fVEVBPW0KK0NPTkZJR19DUllQVE9fVFdPRklTSD1tCitDT05GSUdfQ1JZUFRPX1RXT0ZJU0hfQ09NTU9OPW0KKworIworIyBDb21wcmVzc2lvbgorIworQ09ORklHX0NSWVBUT19ERUZMQVRFPXkKKyMgQ09ORklHX0NSWVBUT19aTElCIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fTFpPPXkKKworIworIyBSYW5kb20gTnVtYmVyIEdlbmVyYXRpb24KKyMKK0NPTkZJR19DUllQVE9fQU5TSV9DUFJORz1tCitDT05GSUdfQ1JZUFRPX0hXPXkKK0NPTkZJR19CSU5BUllfUFJJTlRGPXkKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCitDT05GSUdfQklUUkVWRVJTRT15CitDT05GSUdfR0VORVJJQ19GSU5EX0xBU1RfQklUPXkKK0NPTkZJR19DUkNfQ0NJVFQ9eQorQ09ORklHX0NSQzE2PXkKK0NPTkZJR19DUkNfVDEwRElGPXkKK0NPTkZJR19DUkNfSVRVX1Q9eQorQ09ORklHX0NSQzMyPXkKK0NPTkZJR19DUkM3PXkKK0NPTkZJR19MSUJDUkMzMkM9eQorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfWkxJQl9ERUZMQVRFPXkKK0NPTkZJR19MWk9fQ09NUFJFU1M9eQorQ09ORklHX0xaT19ERUNPTVBSRVNTPXkKK0NPTkZJR19ERUNPTVBSRVNTX0daSVA9eQorQ09ORklHX1RFWFRTRUFSQ0g9eQorQ09ORklHX1RFWFRTRUFSQ0hfS01QPW0KK0NPTkZJR19URVhUU0VBUkNIX0JNPW0KK0NPTkZJR19URVhUU0VBUkNIX0ZTTT1tCitDT05GSUdfSEFTX0lPTUVNPXkKK0NPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKK0NPTkZJR19OTEFUVFI9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9vbWFwXzQ0MzBzZHBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9vbWFwXzQ0MzBzZHBfZGVmY29uZmlnCmluZGV4IGE0NjRjYTMuLjIzMTkxMTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3Mvb21hcF80NDMwc2RwX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL29tYXBfNDQzMHNkcF9kZWZjb25maWcKQEAgLTEsMjYgKzEsMjkgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMC1yYzcKLSMgVHVlIEp1biAgOSAxMjozNjoyMyAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzIKKyMgU3VuIERlYyAgNiAyMzozNzo0NSAyMDA5CiAjCiBDT05GSUdfQVJNPXkKIENPTkZJR19TWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTj15CiBDT05GSUdfR0VORVJJQ19HUElPPXkKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQotQ09ORklHX01NVT15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1Q9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CiBDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKIENPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKIENPTkZJR19IQVJESVJRU19TV19SRVNFTkQ9eQogQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19HRU5FUklDX0xPQ0tCUkVBSz15CiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfQVJDSF9IQVNfQ1BVRlJFUT15CiBDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKIENPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKIENPTkZJR19WRUNUT1JTX0JBU0U9MHhmZmZmMDAwMAogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKK0NPTkZJR19DT05TVFJVQ1RPUlM9eQogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTM5LDExICs0MiwxMiBAQAogIwogIyBSQ1UgU3Vic3lzdGVtCiAjCi1DT05GSUdfQ0xBU1NJQ19SQ1U9eQotIyBDT05GSUdfVFJFRV9SQ1UgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorQ09ORklHX1RSRUVfUkNVPXkKKyMgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFRfUkNVX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfR1JPVVBfU0NIRUQ9eQpAQCAtNTIsOCArNTYsNyBAQAogQ09ORklHX1VTRVJfU0NIRUQ9eQogIyBDT05GSUdfQ0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAotIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRD15IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eSBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKICMgQ09ORklHX05BTUVTUEFDRVMgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKQEAgLTcwLDcgKzczLDYgQEAKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQpAQCAtODMsNiArODUsMTAgQEAKIENPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15CiBDT05GSUdfQUlPPXkKKworIworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycworIwogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKIENPTkZJR19TTFVCX0RFQlVHPXkKIENPTkZJR19DT01QQVRfQlJLPXkKQEAgLTkwLDEzICs5NiwxNiBAQAogQ09ORklHX1NMVUI9eQogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9PUFJPRklMRT15CiAjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0tQUk9CRVM9eQogQ09ORklHX0hBVkVfS1JFVFBST0JFUz15CiBDT05GSUdfVVNFX0dFTkVSSUNfU01QX0hFTFBFUlM9eQogQ09ORklHX0hBVkVfQ0xLPXkKKworIworIyBHQ09WLWJhc2VkIGtlcm5lbCBwcm9maWxpbmcKKyMKICMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQpAQCAtMTEwLDcgKzExOSw3IEBACiBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMPXkKIENPTkZJR19TVE9QX01BQ0hJTkU9eQogQ09ORklHX0JMT0NLPXkKLSMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CitDT05GSUdfTEJEQUY9eQogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xMzEsNiArMTQwLDcgQEAKICMKICMgU3lzdGVtIFR5cGUKICMKK0NPTkZJR19NTVU9eQogIyBDT05GSUdfQVJDSF9BQUVDMjAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9SRUFMVklFVyBpcyBub3Qgc2V0CkBAIC0xNDIsOCArMTUyLDEwIEBACiAjIENPTkZJR19BUkNIX0VQOTNYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9NWEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TVE1QM1hYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX05FVFggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX05PTUFESUsgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JT1AxM1hYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU9QMzJYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU9QMzNYIGlzIG5vdCBzZXQKQEAgLTE2NiwxMCArMTc4LDEzIEBACiAjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TM0M2NFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzVQQzFYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1UzMDAgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9EQVZJTkNJIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX09NQVA9eQorIyBDT05GSUdfQVJDSF9CQ01SSU5HIGlzIG5vdCBzZXQKIAogIwogIyBUSSBPTUFQIEltcGxlbWVudGF0aW9ucwpAQCAtMTkwLDkgKzIwNSwxMiBAQAogQ09ORklHX09NQVBfMzJLX1RJTUVSPXkKIENPTkZJR19PTUFQXzMyS19USU1FUl9IWj0xMjgKIENPTkZJR19PTUFQX0RNX1RJTUVSPXkKLUNPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQxPXkKKyMgQ09ORklHX09NQVBfTExfREVCVUdfVUFSVDEgaXMgbm90IHNldAogIyBDT05GSUdfT01BUF9MTF9ERUJVR19VQVJUMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQzIGlzIG5vdCBzZXQKK0NPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQzPXkKKyMgQ09ORklHX09NQVBfTExfREVCVUdfTk9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19PTUFQX1BNX05PTkUgaXMgbm90IHNldAorQ09ORklHX09NQVBfUE1fTk9PUD15CiAKICMKICMgT01BUCBCb2FyZCBUeXBlCkBAIC0yMDcsNyArMjI1LDcgQEAKIENPTkZJR19DUFVfVjc9eQogQ09ORklHX0NQVV8zMnY3PXkKIENPTkZJR19DUFVfQUJSVF9FVjc9eQotQ09ORklHX0NQVV9QQUJSVF9JRkFSPXkKK0NPTkZJR19DUFVfUEFCUlRfVjc9eQogQ09ORklHX0NQVV9DQUNIRV9WNz15CiBDT05GSUdfQ1BVX0NBQ0hFX1ZJUFQ9eQogQ09ORklHX0NQVV9DT1BZX1Y2PXkKQEAgLTIyMiw5ICsyNDAsMTAgQEAKICMgQ09ORklHX0FSTV9USFVNQiBpcyBub3Qgc2V0CiAjIENPTkZJR19BUk1fVEhVTUJFRSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAotQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRT15CisjIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX0JQUkVESUNUX0RJU0FCTEUgaXMgbm90IHNldAogQ09ORklHX0hBU19UTFNfUkVHPXkKK0NPTkZJR19BUk1fTDFfQ0FDSEVfU0hJRlQ9NQogIyBDT05GSUdfQVJNX0VSUkFUQV80MzA5NzMgaXMgbm90IHNldAogIyBDT05GSUdfQVJNX0VSUkFUQV80NTg2OTMgaXMgbm90IHNldAogIyBDT05GSUdfQVJNX0VSUkFUQV80NjAwNzUgaXMgbm90IHNldApAQCAtMjQ1LDE4ICsyNjQsMjAgQEAKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKIENPTkZJR19TTVA9eQogQ09ORklHX0hBVkVfQVJNX1NDVT15Ci1DT05GSUdfSEFWRV9BUk1fVFdEPXkKIENPTkZJR19WTVNQTElUXzNHPXkKICMgQ09ORklHX1ZNU1BMSVRfMkcgaXMgbm90IHNldAogIyBDT05GSUdfVk1TUExJVF8xRyBpcyBub3Qgc2V0CiBDT05GSUdfUEFHRV9PRkZTRVQ9MHhDMDAwMDAwMAogQ09ORklHX05SX0NQVVM9MgogIyBDT05GSUdfSE9UUExVR19DUFUgaXMgbm90IHNldAotQ09ORklHX0xPQ0FMX1RJTUVSUz15Ci0jIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQ0FMX1RJTUVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUX05PTkUgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAorQ09ORklHX1BSRUVNUFQ9eQogQ09ORklHX0haPTEyOAorIyBDT05GSUdfVEhVTUIyX0tFUk5FTCBpcyBub3Qgc2V0CiBDT05GSUdfQUVBQkk9eQotIyBDT05GSUdfT0FCSV9DT01QQVQgaXMgbm90IHNldAorQ09ORklHX09BQklfQ09NUEFUPXkKICMgQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0RFRkFVTFQgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJR0hNRU0gaXMgbm90IHNldApAQCAtMjcxLDEwICsyOTIsMTMgQEAKICMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKIENPTkZJR19aT05FX0RNQV9GTEFHPTAKIENPTkZJR19WSVJUX1RPX0JVUz15Ci0jIENPTkZJR19VTkVWSUNUQUJMRV9MUlUgaXMgbm90IHNldAogQ09ORklHX0hBVkVfTUxPQ0s9eQorQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVD15CisjIENPTkZJR19LU00gaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfTU1BUF9NSU5fQUREUj00MDk2CiAjIENPTkZJR19MRURTIGlzIG5vdCBzZXQKIENPTkZJR19BTElHTk1FTlRfVFJBUD15CisjIENPTkZJR19VQUNDRVNTX1dJVEhfTUVNQ1BZIGlzIG5vdCBzZXQKIAogIwogIyBCb290IG9wdGlvbnMKQEAgLTI5OCw5ICszMjIsMTEgQEAKICMKICMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCiAjCisjIENPTkZJR19GUEVfTldGUEUgaXMgbm90IHNldAorIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAogQ09ORklHX1ZGUD15CiBDT05GSUdfVkZQdjM9eQotIyBDT05GSUdfTkVPTiBpcyBub3Qgc2V0CitDT05GSUdfTkVPTj15CiAKICMKICMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCkBAIC0zMjUsNiArMzUxLDcgQEAKICMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwogIwogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKKyMgQ09ORklHX0RFVlRNUEZTIGlzIG5vdCBzZXQKIENPTkZJR19TVEFOREFMT05FPXkKIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CkBAIC0zNDIsNiArMzY5LDcgQEAKIENPTkZJR19CTEtfREVWX1JBTV9TSVpFPTE2Mzg0CiAjIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01HX0RJU0sgaXMgbm90IHNldAogIyBDT05GSUdfTUlTQ19ERVZJQ0VTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0lERT15CiAjIENPTkZJR19JREUgaXMgbm90IHNldApAQCAtMzU1LDYgKzM4Myw3IEBACiAjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAogIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKICMgQ09ORklHX01EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKIAogIwogIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydApAQCAtNDI3LDYgKzQ1NiwxMSBAQAogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkMgaXMgbm90IHNldAogIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKworIworIyBQUFMgc3VwcG9ydAorIworIyBDT05GSUdfUFBTIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX1JFUVVJUkVfR1BJT0xJQj15CiBDT05GSUdfR1BJT0xJQj15CiAjIENPTkZJR19ERUJVR19HUElPIGlzIG5vdCBzZXQKQEAgLTQ0NywxMSArNDgxLDE0IEBACiAjCiAjIFNQSSBHUElPIGV4cGFuZGVyczoKICMKKworIworIyBBQzk3IEdQSU8gZXhwYW5kZXJzOgorIwogIyBDT05GSUdfVzEgaXMgbm90IHNldAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAotIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CiBDT05GSUdfU1NCX1BPU1NJQkxFPXkKIApAQCAtNDcyLDIxICs1MDksOCBAQAogIyBDT05GSUdfTUZEX1Q3TDY2WEIgaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1RDNjM4N1hCIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9UQzYzOTNYQiBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGltZWRpYSBkZXZpY2VzCi0jCi0KLSMKLSMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKLSMKLSMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGltZWRpYSBkcml2ZXJzCi0jCi1DT05GSUdfREFCPXkKKyMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19NRURJQV9TVVBQT1JUIGlzIG5vdCBzZXQKIAogIwogIyBHcmFwaGljcyBzdXBwb3J0CkBAIC01MTEsMTQgKzUzNSwxNyBAQAogIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAogIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKICMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAogIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CiBDT05GSUdfUlRDX0xJQj15CiAjIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAogIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVhESVNQTEFZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19VSU8gaXMgbm90IHNldAorCisjCisjIFRJIFZMWU5RCisjCiAjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKIAogIwpAQCAtNTM1LDkgKzU2MiwxMiBAQAogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0Ci1DT05GSUdfRklMRV9MT0NLSU5HPXkKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CitDT05GSUdfRklMRV9MT0NLSU5HPXkKK0NPTkZJR19GU05PVElGWT15CiBDT05GSUdfRE5PVElGWT15CiBDT05GSUdfSU5PVElGWT15CiBDT05GSUdfSU5PVElGWV9VU0VSPXkKQEAgLTYwMSw3ICs2MzEsNiBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIAogIwogIyBQYXJ0aXRpb24gVHlwZXMKQEAgLTY3MywyMyArNzAyLDI0IEBACiAjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiBDT05GSUdfTUFHSUNfU1lTUlE9eQorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfS0VSTkVMPXkKICMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKLUNPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15Ci0jIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0Ci1DT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAorIyBDT05GSUdfREVURUNUX1NPRlRMT0NLVVAgaXMgbm90IHNldAogQ09ORklHX0RFVEVDVF9IVU5HX1RBU0s9eQogIyBDT05GSUdfQk9PVFBBUkFNX0hVTkdfVEFTS19QQU5JQyBpcyBub3Qgc2V0CiBDT05GSUdfQk9PVFBBUkFNX0hVTkdfVEFTS19QQU5JQ19WQUxVRT0wCi1DT05GSUdfU0NIRURfREVCVUc9eQorIyBDT05GSUdfU0NIRURfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMVUJfREVCVUdfT04gaXMgbm90IHNldAogIyBDT05GSUdfU0xVQl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LTUVNTEVBSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19QUkVFTVBUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAogIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKQEAgLTcwOCwzMSArNzM4LDIyIEBACiAjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX05PVElGSUVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19DUkVERU5USUFMUyBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfUE9JTlRFUj15CiAjIENPTkZJR19CT09UX1BSSU5US19ERUxBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAogIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GT1JDRV9XRUFLX1BFUl9DUFUgaXMgbm90IHNldAogIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBR0VfUE9JU09OSU5HIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CiBDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKLQotIwotIyBUcmFjZXJzCi0jCi0jIENPTkZJR19GVU5DVElPTl9UUkFDRVIgaXMgbm90IHNldAotIyBDT05GSUdfSVJRU09GRl9UUkFDRVIgaXMgbm90IHNldAotIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FVkVOVF9UUkFDRVIgaXMgbm90IHNldAotIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAotIyBDT05GSUdfVFJBQ0VfQlJBTkNIX1BST0ZJTElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVEFDS19UUkFDRVIgaXMgbm90IHNldAotIyBDT05GSUdfS01FTVRSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dPUktRVUVVRV9UUkFDRVIgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19GVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfQlJBTkNIX1BST0ZJTEVfTk9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxFX0FOTk9UQVRFRF9CUkFOQ0hFUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxFX0FMTF9CUkFOQ0hFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKQEAgLTc1NCw3ICs3NzUsNiBAQAogIwogIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKICMKLSMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fQUxHQVBJPXkKIENPTkZJR19DUllQVE9fQUxHQVBJMj15CiBDT05GSUdfQ1JZUFRPX0FFQUQyPXkKQEAgLTc5NiwxMSArODE2LDEzIEBACiAjCiAjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVk1BQyBpcyBub3Qgc2V0CiAKICMKICMgRGlnZXN0CiAjCiBDT05GSUdfQ1JZUFRPX0NSQzMyQz15CisjIENPTkZJR19DUllQVE9fR0hBU0ggaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX01ENT15CiAjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9vbWFwX3pvb20yX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3Mvb21hcF96b29tMl9kZWZjb25maWcKaW5kZXggZWVmOTM2Mi4uNGIwMGE0MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9vbWFwX3pvb20yX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL29tYXBfem9vbTJfZGVmY29uZmlnCkBAIC02MTAsNyArNjEwLDggQEAKICMKICMgSW5wdXQgRGV2aWNlIERyaXZlcnMKICMKLSMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9LRVlCT0FSRD15CitDT05GSUdfS0VZQk9BUkRfVFdMNDAzMD15CiAjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9vbWFwX3pvb20zX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3Mvb21hcF96b29tM19kZWZjb25maWcKaW5kZXggZjBlN2QwZi4uMGQ3ZTM3YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9vbWFwX3pvb20zX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL29tYXBfem9vbTNfZGVmY29uZmlnCkBAIC02MjksNyArNjI5LDggQEAKICMKICMgSW5wdXQgRGV2aWNlIERyaXZlcnMKICMKLSMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9LRVlCT0FSRD15CitDT05GSUdfS0VZQk9BUkRfVFdMNDAzMD15CiAjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy96ZXVzX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvemV1c19kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIzYjExZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvemV1c19kZWZjb25maWcKQEAgLTAsMCArMSwyMDMyIEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzIKKyMgVHVlIERlYyAgOCAyMDoyNzowNSAyMDA5CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19TWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTj15CitDT05GSUdfR0VORVJJQ19HUElPPXkKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CitDT05GSUdfSEFWRV9MQVRFTkNZVE9QX1NVUFBPUlQ9eQorQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CitDT05GSUdfSEFSRElSUVNfU1dfUkVTRU5EPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfQVJDSF9IQVNfQ1BVRlJFUT15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfQVJDSF9NVERfWElQPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQorQ09ORklHX1ZFQ1RPUlNfQkFTRT0weGZmZmYwMDAwCitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorQ09ORklHX0NPTlNUUlVDVE9SUz15CisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CisKKyMKKyMgUkNVIFN1YnN5c3RlbQorIworIyBDT05GSUdfVFJFRV9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CitDT05GSUdfVElOWV9SQ1U9eQorIyBDT05GSUdfVFJFRV9SQ1VfVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTMKKyMgQ09ORklHX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMiBpcyBub3Qgc2V0CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CitDT05GSUdfTkFNRVNQQUNFUz15CisjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAorIyBDT05GSUdfSVBDX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRVJfTlMgaXMgbm90IHNldAorIyBDT05GSUdfUElEX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NZU0NUTD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQorIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19TWVNDVExfU1lTQ0FMTD15CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQUlPPXkKKworIworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycworIworQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTFVCX0RFQlVHPXkKK0NPTkZJR19DT01QQVRfQlJLPXkKKyMgQ09ORklHX1NMQUIgaXMgbm90IHNldAorQ09ORklHX1NMVUI9eQorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9LUFJPQkVTPXkKK0NPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQorQ09ORklHX0hBVkVfQ0xLPXkKKworIworIyBHQ09WLWJhc2VkIGtlcm5lbCBwcm9maWxpbmcKKyMKKyMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CitDT05GSUdfU0xBQklORk89eQorQ09ORklHX1JUX01VVEVYRVM9eQorQ09ORklHX0JBU0VfU01BTEw9MAorQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0JMT0NLPXkKK0NPTkZJR19MQkRBRj15CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CisjIENPTkZJR19JT1NDSEVEX0NGUSBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9ERUFETElORT15CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iZGVhZGxpbmUiCisjIENPTkZJR19JTkxJTkVfU1BJTl9UUllMT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9TUElOX1RSWUxPQ0tfQkggaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1NQSU5fTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfU1BJTl9MT0NLX0JIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9TUElOX0xPQ0tfSVJRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9TUElOX0xPQ0tfSVJRU0FWRSBpcyBub3Qgc2V0CitDT05GSUdfSU5MSU5FX1NQSU5fVU5MT0NLPXkKKyMgQ09ORklHX0lOTElORV9TUElOX1VOTE9DS19CSCBpcyBub3Qgc2V0CitDT05GSUdfSU5MSU5FX1NQSU5fVU5MT0NLX0lSUT15CisjIENPTkZJR19JTkxJTkVfU1BJTl9VTkxPQ0tfSVJRUkVTVE9SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfUkVBRF9UUllMT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9SRUFEX0xPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1JFQURfTE9DS19CSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfUkVBRF9MT0NLX0lSUSBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfUkVBRF9MT0NLX0lSUVNBVkUgaXMgbm90IHNldAorQ09ORklHX0lOTElORV9SRUFEX1VOTE9DSz15CisjIENPTkZJR19JTkxJTkVfUkVBRF9VTkxPQ0tfQkggaXMgbm90IHNldAorQ09ORklHX0lOTElORV9SRUFEX1VOTE9DS19JUlE9eQorIyBDT05GSUdfSU5MSU5FX1JFQURfVU5MT0NLX0lSUVJFU1RPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1dSSVRFX1RSWUxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1dSSVRFX0xPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1dSSVRFX0xPQ0tfQkggaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1dSSVRFX0xPQ0tfSVJRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9XUklURV9MT0NLX0lSUVNBVkUgaXMgbm90IHNldAorQ09ORklHX0lOTElORV9XUklURV9VTkxPQ0s9eQorIyBDT05GSUdfSU5MSU5FX1dSSVRFX1VOTE9DS19CSCBpcyBub3Qgc2V0CitDT05GSUdfSU5MSU5FX1dSSVRFX1VOTE9DS19JUlE9eQorIyBDT05GSUdfSU5MSU5FX1dSSVRFX1VOTE9DS19JUlFSRVNUT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01VVEVYX1NQSU5fT05fT1dORVIgaXMgbm90IHNldAorQ09ORklHX0ZSRUVaRVI9eQorCisjCisjIFN5c3RlbSBUeXBlCisjCitDT05GSUdfTU1VPXkKKyMgQ09ORklHX0FSQ0hfQUFFQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUkVBTFZJRVcgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9BVDkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9HRU1JTkkgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRVA5M1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01YQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NUTVAzWFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTkVUWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTk9NQURJSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDEzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzMlggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzM1ggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRE9WRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0tJUktXT09EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTE9LSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01WNzhYWDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PUklPTjVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTU1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfS1M4Njk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTlM5WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVzkwWDkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BOWDQwMDggaXMgbm90IHNldAorQ09ORklHX0FSQ0hfUFhBPXkKKyMgQ09ORklHX0FSQ0hfTVNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0ExMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzY0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TNVBDMVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVTMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0RBVklOQ0kgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQkNNUklORyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1U4NTAwIGlzIG5vdCBzZXQKKworIworIyBJbnRlbCBQWEEyeHgvUFhBM3h4IEltcGxlbWVudGF0aW9ucworIworCisjCisjIEludGVsL01hcnZlbGwgRGV2IFBsYXRmb3JtcyAoc29ydGVkIGJ5IGhhcmR3YXJlIHJlbGVhc2UgdGltZSkKKyMKKyMgQ09ORklHX0FSQ0hfTFVCQk9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX01BSU5TVE9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX1pZTE9OSVRFMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfWllMT05JVEUzMjAgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9MSVRUTEVUT04gaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9UQVZPUkVWQiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX1NBQVIgaXMgbm90IHNldAorCisjCisjIFRoaXJkIFBhcnR5IERldiBQbGF0Zm9ybXMgKHNvcnRlZCBieSB2ZW5kb3IgbmFtZSkKKyMKKyMgQ09ORklHX0FSQ0hfUFhBX0lEUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZJUEVSIGlzIG5vdCBzZXQKK0NPTkZJR19NQUNIX0FSQ09NX1pFVVM9eQorIyBDT05GSUdfTUFDSF9CQUxMT09OMyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0NTQjcyNiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0FSTUNPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9FTV9YMjcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfRVhFREEgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9DTV9YMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfR1VNU1RJWCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0lOVEVMTU9URTIgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9TVEFSR0FURTIgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9YQ0VQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSSVpFUFNfUFhBIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNPTV9QQ01DSUE9eQorIyBDT05GSUdfTUFDSF9MT0dJQ1BEX1BYQTI3MCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX1BDTTAyNyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0NPTElCUkkgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9DT0xJQlJJMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfQ09MSUJSSTMyMCBpcyBub3Qgc2V0CisKKyMKKyMgRW5kLXVzZXIgUHJvZHVjdHMgKHNvcnRlZCBieSB2ZW5kb3IgbmFtZSkKKyMKKyMgQ09ORklHX01BQ0hfSDQ3MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9INTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0hJTUFMQVlBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfTUFHSUNJQU4gaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9NSU9BNzAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BYQV9FWlggaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9NUDkwMEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEFfUEFMTSBpcyBub3Qgc2V0CisjIENPTkZJR19QWEFfU0hBUlBTTCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQV9FU0VSSUVTIGlzIG5vdCBzZXQKK0NPTkZJR19QWEEyN3g9eQorQ09ORklHX1BYQV9TU1A9eQorQ09ORklHX1BYQV9IQVZFX0JPQVJEX0lSUVM9eQorQ09ORklHX1BYQV9IQVZFX0lTQV9JUlFTPXkKK0NPTkZJR19QTEFUX1BYQT15CisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorQ09ORklHX0NQVV9YU0NBTEU9eQorQ09ORklHX0NQVV8zMnY1PXkKK0NPTkZJR19DUFVfQUJSVF9FVjVUPXkKK0NPTkZJR19DUFVfUEFCUlRfTEVHQUNZPXkKK0NPTkZJR19DUFVfQ0FDSEVfVklWVD15CitDT05GSUdfQ1BVX1RMQl9WNFdCST15CitDT05GSUdfQ1BVX0NQMTU9eQorQ09ORklHX0NQVV9DUDE1X01NVT15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCitDT05GSUdfQVJNX1RIVU1CPXkKKyMgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfQVJNX0wxX0NBQ0hFX1NISUZUPTUKK0NPTkZJR19JV01NWFQ9eQorQ09ORklHX1hTQ0FMRV9QTVU9eQorQ09ORklHX0NPTU1PTl9DTEtERVY9eQorCisjCisjIEJ1cyBzdXBwb3J0CisjCitDT05GSUdfSVNBPXkKKyMgQ09ORklHX1BDSV9TWVNDQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKK0NPTkZJR19QQ0NBUkQ9bQorQ09ORklHX1BDTUNJQT1tCitDT05GSUdfUENNQ0lBX0xPQURfQ0lTPXkKK0NPTkZJR19QQ01DSUFfSU9DVEw9eQorCisjCisjIFBDLWNhcmQgYnJpZGdlcworIworIyBDT05GSUdfSTgyMzY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDSUMgaXMgbm90IHNldAorQ09ORklHX1BDTUNJQV9TT0NfQ09NTU9OPW0KK0NPTkZJR19QQ01DSUFfUFhBMlhYPW0KKyMgQ09ORklHX1BDTUNJQV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfUENNQ0lBX1BST0JFPXkKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKK0NPTkZJR19USUNLX09ORVNIT1Q9eQorIyBDT05GSUdfTk9fSFogaXMgbm90IHNldAorIyBDT05GSUdfSElHSF9SRVNfVElNRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKK0NPTkZJR19WTVNQTElUXzNHPXkKKyMgQ09ORklHX1ZNU1BMSVRfMkcgaXMgbm90IHNldAorIyBDT05GSUdfVk1TUExJVF8xRyBpcyBub3Qgc2V0CitDT05GSUdfUEFHRV9PRkZTRVQ9MHhDMDAwMDAwMAorQ09ORklHX1BSRUVNUFRfTk9ORT15CisjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19IWj0xMDAKK0NPTkZJR19BRUFCST15CitDT05GSUdfT0FCSV9DT01QQVQ9eQorIyBDT05GSUdfQVJDSF9TUEFSU0VNRU1fREVGQVVMVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUwgaXMgbm90IHNldAorIyBDT05GSUdfSElHSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00MDk2CisjIENPTkZJR19QSFlTX0FERFJfVF82NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0wCitDT05GSUdfVklSVF9UT19CVVM9eQorQ09ORklHX0hBVkVfTUxPQ0s9eQorQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVD15CisjIENPTkZJR19LU00gaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfTU1BUF9NSU5fQUREUj00MDk2CitDT05GSUdfQUxJR05NRU5UX1RSQVA9eQorIyBDT05GSUdfVUFDQ0VTU19XSVRIX01FTUNQWSBpcyBub3Qgc2V0CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCitDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKK0NPTkZJR19DTURMSU5FPSJyb290PTMxOjAyIHJvb3Rmc3R5cGU9amZmczIgcm8gY29uc29sZT10dHlTMCwxMTUyMDAiCisjIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKKworIworIyBDUFUgUG93ZXIgTWFuYWdlbWVudAorIworQ09ORklHX0NQVV9GUkVRPXkKK0NPTkZJR19DUFVfRlJFUV9UQUJMRT15CisjIENPTkZJR19DUFVfRlJFUV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfU1RBVD15CisjIENPTkZJR19DUFVfRlJFUV9TVEFUX0RFVEFJTFMgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1BFUkZPUk1BTkNFPXkKKyMgQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1BPV0VSU0FWRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9VU0VSU1BBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfT05ERU1BTkQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfQ09OU0VSVkFUSVZFIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9HT1ZfUEVSRk9STUFOQ0U9eQorQ09ORklHX0NQVV9GUkVRX0dPVl9QT1dFUlNBVkU9bQorQ09ORklHX0NQVV9GUkVRX0dPVl9VU0VSU1BBQ0U9bQorQ09ORklHX0NQVV9GUkVRX0dPVl9PTkRFTUFORD1tCitDT05GSUdfQ1BVX0ZSRVFfR09WX0NPTlNFUlZBVElWRT1tCisjIENPTkZJR19DUFVfSURMRSBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKKyMgQ09ORklHX0ZQRV9OV0ZQRV9YUCBpcyBub3Qgc2V0CisjIENPTkZJR19GUEVfRkFTVEZQRSBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19DT1JFX0RVTVBfREVGQVVMVF9FTEZfSEVBREVSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BT1VUPXkKKyMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKK0NPTkZJR19QTT15CisjIENPTkZJR19QTV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfUE1fU0xFRVA9eQorQ09ORklHX1NVU1BFTkQ9eQorQ09ORklHX1NVU1BFTkRfRlJFRVpFUj15CitDT05GSUdfQVBNX0VNVUxBVElPTj15CisjIENPTkZJR19QTV9SVU5USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1NVU1BFTkRfUE9TU0lCTEU9eQorQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNPXkKKyMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKKyMgQ09ORklHX0lQX1BOUF9CT09UUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CitDT05GSUdfU1lOX0NPT0tJRVM9eQorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CisjIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9ESUFHPXkKK0NPTkZJR19JTkVUX1RDUF9ESUFHPXkKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19DVUJJQz15CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfUkRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRFNBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTU0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19EQ0IgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19DQU4gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CitDT05GSUdfQlQ9bQorQ09ORklHX0JUX0wyQ0FQPW0KKyMgQ09ORklHX0JUX1NDTyBpcyBub3Qgc2V0CitDT05GSUdfQlRfUkZDT01NPW0KK0NPTkZJR19CVF9SRkNPTU1fVFRZPXkKK0NPTkZJR19CVF9CTkVQPW0KKyMgQ09ORklHX0JUX0JORVBfTUNfRklMVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUX0JORVBfUFJPVE9fRklMVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUX0hJRFAgaXMgbm90IHNldAorCisjCisjIEJsdWV0b290aCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfQlRfSENJQlRVU0IgaXMgbm90IHNldAorIyBDT05GSUdfQlRfSENJQlRTRElPIGlzIG5vdCBzZXQKK0NPTkZJR19CVF9IQ0lVQVJUPW0KK0NPTkZJR19CVF9IQ0lVQVJUX0g0PXkKK0NPTkZJR19CVF9IQ0lVQVJUX0JDU1A9eQorIyBDT05GSUdfQlRfSENJVUFSVF9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19CVF9IQ0lCQ00yMDNYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUX0hDSUJQQTEwWCBpcyBub3Qgc2V0CisjIENPTkZJR19CVF9IQ0lCRlVTQiBpcyBub3Qgc2V0CisjIENPTkZJR19CVF9IQ0lEVEwxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUX0hDSUJUM0MgaXMgbm90IHNldAorIyBDT05GSUdfQlRfSENJQkxVRUNBUkQgaXMgbm90IHNldAorIyBDT05GSUdfQlRfSENJQlRVQVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUX0hDSVZIQ0kgaXMgbm90IHNldAorIyBDT05GSUdfQlRfTVJWTCBpcyBub3Qgc2V0CisjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1M9eQorQ09ORklHX1dJUkVMRVNTX0VYVD15CitDT05GSUdfV0VYVF9DT1JFPXkKK0NPTkZJR19XRVhUX1BST0M9eQorQ09ORklHX1dFWFRfU1BZPXkKK0NPTkZJR19XRVhUX1BSSVY9eQorQ09ORklHX0NGRzgwMjExPW0KKyMgQ09ORklHX05MODAyMTFfVEVTVE1PREUgaXMgbm90IHNldAorIyBDT05GSUdfQ0ZHODAyMTFfREVWRUxPUEVSX1dBUk5JTkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NGRzgwMjExX1JFR19ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfQ0ZHODAyMTFfREVGQVVMVF9QUz15CisjIENPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWSBpcyBub3Qgc2V0CitDT05GSUdfQ0ZHODAyMTFfV0VYVD15CitDT05GSUdfV0lSRUxFU1NfRVhUX1NZU0ZTPXkKK0NPTkZJR19MSUI4MDIxMT1tCisjIENPTkZJR19MSUI4MDIxMV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfTUFDODAyMTE9bQorQ09ORklHX01BQzgwMjExX1JDX01JTlNUUkVMPXkKKyMgQ09ORklHX01BQzgwMjExX1JDX0RFRkFVTFRfUElEIGlzIG5vdCBzZXQKK0NPTkZJR19NQUM4MDIxMV9SQ19ERUZBVUxUX01JTlNUUkVMPXkKK0NPTkZJR19NQUM4MDIxMV9SQ19ERUZBVUxUPSJtaW5zdHJlbCIKKyMgQ09ORklHX01BQzgwMjExX01FU0ggaXMgbm90IHNldAorIyBDT05GSUdfTUFDODAyMTFfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUM4MDIxMV9ERUJVR19NRU5VIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJTUFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKKyMgQ09ORklHX0RFVlRNUEZTIGlzIG5vdCBzZXQKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKK0NPTkZJR19GV19MT0FERVI9eQorQ09ORklHX0ZJUk1XQVJFX0lOX0tFUk5FTD15CitDT05GSUdfRVhUUkFfRklSTVdBUkU9IiIKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CitDT05GSUdfTVREX1JFREJPT1RfUEFSVFM9eQorQ09ORklHX01URF9SRURCT09UX0RJUkVDVE9SWV9CTE9DSz0tMQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFNfVU5BTExPQ0FURUQgaXMgbm90IHNldAorQ09ORklHX01URF9SRURCT09UX1BBUlRTX1JFQURPTkxZPXkKKyMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BRlNfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj1tCitDT05GSUdfTVREX0JMS0RFVlM9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NTRkRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PT1BTIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorQ09ORklHX01URF9KRURFQ1BST0JFPXkKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKK0NPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TPXkKK0NPTkZJR19NVERfQ0ZJX05PU1dBUD15CisjIENPTkZJR19NVERfQ0ZJX0JFX0JZVEVfU1dBUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0xFX0JZVEVfU1dBUCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9HRU9NRVRSWT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorIyBDT05GSUdfTVREX0NGSV9JMiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorIyBDT05GSUdfTVREX09UUCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CitDT05GSUdfTVREX0NGSV9BTURTVEQ9eQorIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9eQorQ09ORklHX01URF9SQU09eQorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9YSVAgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKK0NPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUz15CitDT05GSUdfTVREX1BIWVNNQVA9eQorIyBDT05GSUdfTVREX1BIWVNNQVBfQ09NUEFUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUFhBMlhYPXkKKyMgQ09ORklHX01URF9BUk1fSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfSU1QQTcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0dQSU9fQUREUiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfREFUQUZMQVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NMjVQODAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NTVDI1TCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAorCisjCisjIExQRERSIGZsYXNoIG1lbW9yeSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfTFBERFIgaXMgbm90IHNldAorCisjCisjIFVCSSAtIFVuc29ydGVkIGJsb2NrIGltYWdlcworIworIyBDT05GSUdfTVREX1VCSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BOUCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVj15CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD1tCisjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAorCisjCisjIERSQkQgZGlzYWJsZWQgYmVjYXVzZSBQUk9DX0ZTLCBJTkVUIG9yIENPTk5FQ1RPUiBub3Qgc2VsZWN0ZWQKKyMKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVUIgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorIyBDT05GSUdfTUdfRElTSyBpcyBub3Qgc2V0CitDT05GSUdfTUlTQ19ERVZJQ0VTPXkKKyMgQ09ORklHX0lDUzkzMlM0MDEgaXMgbm90IHNldAorIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lTTDI5MDAzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RTMTY4MiBpcyBub3Qgc2V0CisjIENPTkZJR19DMlBPUlQgaXMgbm90IHNldAorCisjCisjIEVFUFJPTSBzdXBwb3J0CisjCitDT05GSUdfRUVQUk9NX0FUMjQ9bQorIyBDT05GSUdfRUVQUk9NX0FUMjUgaXMgbm90IHNldAorIyBDT05GSUdfRUVQUk9NX0xFR0FDWSBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBST01fTUFYNjg3NSBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAorIyBDT05GSUdfSVdNQzMyMDBUT1AgaXMgbm90IHNldAorQ09ORklHX0hBVkVfSURFPXkKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTST1tCitDT05GSUdfU0NTSV9ETUE9eQorIyBDT05GSUdfU0NTSV9UR1QgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUFJPQ19GUyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKKyMKK0NPTkZJR19CTEtfREVWX1NEPW0KKyMgQ09ORklHX0NIUl9ERVZfU1QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TRyBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1dBSVRfU0NBTj1tCisKKyMKKyMgU0NTSSBUcmFuc3BvcnRzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1JQX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX0xPV0xFVkVMPXkKKyMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FIQTE1MlggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FEVkFOU1lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU4yMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQkZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQkZDT0UgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EVEMzMjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRlVUVVJFX0RPTUFJTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0dFTkVSSUNfTkNSNTM4MCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0dFTkVSSUNfTkNSNTM4MF9NTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTkNSNTNDNDA2QSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1BBUzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDX0ZBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NZTTUzQzQxNiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1QxMjggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xPV0xFVkVMX1BDTUNJQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfT1NEX0lOSVRJQVRPUiBpcyBub3Qgc2V0CitDT05GSUdfQVRBPW0KKyMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CitDT05GSUdfQVRBX1ZFUkJPU0VfRVJST1I9eQorIyBDT05GSUdfU0FUQV9QTVAgaXMgbm90IHNldAorQ09ORklHX0FUQV9TRkY9eQorIyBDT05GSUdfU0FUQV9NViBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0xFR0FDWSBpcyBub3Qgc2V0CitDT05GSUdfUEFUQV9QQ01DSUE9bQorIyBDT05GSUdfUEFUQV9RREkgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9XSU5CT05EX1ZMQiBpcyBub3Qgc2V0CisjIENPTkZJR19NRCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisjIENPTkZJR19WRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19QSFlMSUIgaXMgbm90IHNldAorQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKKyMgQ09ORklHX0FYODg3OTYgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl8zQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfU01DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0CitDT05GSUdfRE05MDAwPXkKK0NPTkZJR19ETTkwMDBfREVCVUdMRVZFTD00CisjIENPTkZJR19ETTkwMDBfRk9SQ0VfU0lNUExFX1BIWV9QT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQzI4SjYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VUSE9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQzkxMVggaXMgbm90IHNldAorIyBDT05GSUdfU01TQzkxMVggaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9SQUNBTCBpcyBub3Qgc2V0CisjIENPTkZJR19ETkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUMTcwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVBDQSBpcyBub3Qgc2V0CisjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVNBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19aTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTk9fRkxPV19DVFJMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ0xSX0lDSU5UU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NPTU1PTl9FUlIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfQ1M4OXgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tTODg0MiBpcyBub3Qgc2V0CisjIENPTkZJR19LUzg4NTEgaXMgbm90IHNldAorIyBDT05GSUdfS1M4ODUxX01MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAorIyBDT05GSUdfVFIgaXMgbm90IHNldAorQ09ORklHX1dMQU49eQorIyBDT05GSUdfUENNQ0lBX1JBWUNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQkVSVEFTX1RISU5GSVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTUVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUNzZDNTBYX1VTQiBpcyBub3Qgc2V0CisjIENPTkZJR19BSVJPX0NTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQV9XTDM1MDEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1pEMTIwMSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTkVUX1JORElTX1dMQU4gaXMgbm90IHNldAorIyBDT05GSUdfUlRMODE4NyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUM4MDIxMV9IV1NJTSBpcyBub3Qgc2V0CisjIENPTkZJR19BVEhfQ09NTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0MyBpcyBub3Qgc2V0CisjIENPTkZJR19CNDNMRUdBQ1kgaXMgbm90IHNldAorIyBDT05GSUdfSE9TVEFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lXTSBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJFUlRBUyBpcyBub3Qgc2V0CitDT05GSUdfSEVSTUVTPW0KK0NPTkZJR19IRVJNRVNfQ0FDSEVfRldfT05fSU5JVD15CitDT05GSUdfUENNQ0lBX0hFUk1FUz1tCisjIENPTkZJR19QQ01DSUFfU1BFQ1RSVU0gaXMgbm90IHNldAorIyBDT05GSUdfUDU0X0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfUlQyWDAwPW0KKyMgQ09ORklHX1JUMjUwMFVTQiBpcyBub3Qgc2V0CitDT05GSUdfUlQ3M1VTQj1tCisjIENPTkZJR19SVDI4MDBVU0IgaXMgbm90IHNldAorQ09ORklHX1JUMlgwMF9MSUJfVVNCPW0KK0NPTkZJR19SVDJYMDBfTElCPW0KK0NPTkZJR19SVDJYMDBfTElCX0ZJUk1XQVJFPXkKK0NPTkZJR19SVDJYMDBfTElCX0NSWVBUTz15CitDT05GSUdfUlQyWDAwX0xJQl9MRURTPXkKKyMgQ09ORklHX1JUMlgwMF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19XTDEyWFggaXMgbm90IHNldAorIyBDT05GSUdfWkQxMjExUlcgaXMgbm90IHNldAorCisjCisjIEVuYWJsZSBXaU1BWCAoTmV0d29ya2luZyBvcHRpb25zKSB0byBzZWUgdGhlIFdpTUFYIGRyaXZlcnMKKyMKKworIworIyBVU0IgTmV0d29yayBBZGFwdGVycworIworIyBDT05GSUdfVVNCX0NBVEMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tBV0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEVHQVNVUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUlRMODE1MCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVVNCTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfUENNQ0lBPXkKKyMgQ09ORklHX1BDTUNJQV8zQzU4OSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ01DSUFfM0M1NzQgaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBX0ZNVkoxOFggaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBX1BDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQV9OTUNMQU4gaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBX1NNQzkxQzkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQV9YSVJDMlBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQV9BWE5FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU4gaXMgbm90IHNldAorQ09ORklHX1BQUD1tCisjIENPTkZJR19QUFBfTVVMVElMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUF9GSUxURVIgaXMgbm90IHNldAorQ09ORklHX1BQUF9BU1lOQz1tCisjIENPTkZJR19QUFBfU1lOQ19UVFkgaXMgbm90IHNldAorQ09ORklHX1BQUF9ERUZMQVRFPW0KK0NPTkZJR19QUFBfQlNEQ09NUD1tCisjIENPTkZJR19QUFBfTVBQRSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFBPRSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFBPTDJUUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKK0NPTkZJR19TTEhDPW0KKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9QT0xMREVWIGlzIG5vdCBzZXQKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorIyBDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVggaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfRVZERVY9bQorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOPXkKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0FEUzc4NDYgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9JMkMgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzkgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fRUVUSSBpcyBub3Qgc2V0CitDT05GSUdfVE9VQ0hTQ1JFRU5fRlVKSVRTVT1tCisjIENPTkZJR19UT1VDSFNDUkVFTl9HVU5aRSBpcyBub3Qgc2V0CitDT05GSUdfVE9VQ0hTQ1JFRU5fRUxPPW0KKyMgQ09ORklHX1RPVUNIU0NSRUVOX1dBQ09NX1c4MDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX01DUzUwMDAgaXMgbm90IHNldAorQ09ORklHX1RPVUNIU0NSRUVOX01UT1VDSD1tCitDT05GSUdfVE9VQ0hTQ1JFRU5fSU5FWElPPW0KKyMgQ09ORklHX1RPVUNIU0NSRUVOX01LNzEyIGlzIG5vdCBzZXQKK0NPTkZJR19UT1VDSFNDUkVFTl9IVENQRU49bQorQ09ORklHX1RPVUNIU0NSRUVOX1BFTk1PVU5UPW0KK0NPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFJJR0hUPW0KK0NPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFdJTj1tCisjIENPTkZJR19UT1VDSFNDUkVFTl9XTTk3WFggaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVVNCX0NPTVBPU0lURSBpcyBub3Qgc2V0CitDT05GSUdfVE9VQ0hTQ1JFRU5fVE9VQ0hJVDIxMz1tCisjIENPTkZJR19UT1VDSFNDUkVFTl9UU0MyMDA3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1c5MFg5MDAgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01JU0M9eQorIyBDT05GSUdfSU5QVVRfQVRJX1JFTU9URSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9BVElfUkVNT1RFMiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9LRVlTUEFOX1JFTU9URSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9QT1dFUk1BVEUgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfWUVBTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9DTTEwOSBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfVUlOUFVUPW0KKyMgQ09ORklHX0lOUFVUX0dQSU9fUk9UQVJZX0VOQ09ERVIgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworQ09ORklHX1NFUklPPXkKK0NPTkZJR19TRVJJT19TRVJQT1JUPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZLTUVNPXkKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfODI1MF9DUyBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9NworQ09ORklHX1NFUklBTF84MjUwX1JVTlRJTUVfVUFSVFM9NworIyBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1NFUklBTF9NQVgzMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9QWEEgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CisjIENPTkZJR19ERVZQVFNfTVVMVElQTEVfSU5TVEFOQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CitDT05GSUdfSFdfUkFORE9NPW0KKyMgQ09ORklHX0hXX1JBTkRPTV9USU1FUklPTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorCisjCisjIFBDTUNJQSBjaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfU1lOQ0xJTktfQ1MgaXMgbm90IHNldAorIyBDT05GSUdfQ0FSRE1BTl80MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBUkRNQU5fNDA0MCBpcyBub3Qgc2V0CisjIENPTkZJR19JUFdJUkVMRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CitDT05GSUdfREVWUE9SVD15CitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQk9BUkRJTkZPPXkKK0NPTkZJR19JMkNfQ09NUEFUPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj15CisjIENPTkZJR19JMkNfSEVMUEVSX0FVVE8gaXMgbm90IHNldAorCisjCisjIEkyQyBBbGdvcml0aG1zCisjCitDT05GSUdfSTJDX0FMR09CSVQ9eQorIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0EgaXMgbm90IHNldAorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworCisjCisjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQorIworIyBDT05GSUdfSTJDX0RFU0lHTldBUkUgaXMgbm90IHNldAorQ09ORklHX0kyQ19HUElPPXkKKyMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAorQ09ORklHX0kyQ19QWEE9eQorIyBDT05GSUdfSTJDX1BYQV9TTEFWRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKKworIworIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1RJTllfVVNCIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMvU01CdXMgYnVzIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19FTEVLVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQ0FfSVNBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQ0FfUExBVEZPUk0gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAorIworIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorQ09ORklHX1NQST15CisjIENPTkZJR19TUElfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1NQSV9NQVNURVI9eQorCisjCisjIFNQSSBNYXN0ZXIgQ29udHJvbGxlciBEcml2ZXJzCisjCisjIENPTkZJR19TUElfQklUQkFORyBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfR1BJTyBpcyBub3Qgc2V0CitDT05GSUdfU1BJX1BYQTJYWD15CisKKyMKKyMgU1BJIFByb3RvY29sIE1hc3RlcnMKKyMKKyMgQ09ORklHX1NQSV9TUElERVYgaXMgbm90IHNldAorIyBDT05GSUdfU1BJX1RMRTYyWDAgaXMgbm90IHNldAorCisjCisjIFBQUyBzdXBwb3J0CisjCisjIENPTkZJR19QUFMgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfUkVRVUlSRV9HUElPTElCPXkKK0NPTkZJR19HUElPTElCPXkKKyMgQ09ORklHX0RFQlVHX0dQSU8gaXMgbm90IHNldAorQ09ORklHX0dQSU9fU1lTRlM9eQorCisjCisjIE1lbW9yeSBtYXBwZWQgR1BJTyBleHBhbmRlcnM6CisjCisKKyMKKyMgSTJDIEdQSU8gZXhwYW5kZXJzOgorIworIyBDT05GSUdfR1BJT19NQVg3MzJYIGlzIG5vdCBzZXQKK0NPTkZJR19HUElPX1BDQTk1M1g9eQorIyBDT05GSUdfR1BJT19QQ0Y4NTdYIGlzIG5vdCBzZXQKKworIworIyBQQ0kgR1BJTyBleHBhbmRlcnM6CisjCisKKyMKKyMgU1BJIEdQSU8gZXhwYW5kZXJzOgorIworIyBDT05GSUdfR1BJT19NQVg3MzAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dQSU9fTUNQMjNTMDggaXMgbm90IHNldAorIyBDT05GSUdfR1BJT19NQzMzODgwIGlzIG5vdCBzZXQKKworIworIyBBQzk3IEdQSU8gZXhwYW5kZXJzOgorIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKK0NPTkZJR19IV01PTj15CisjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFTlNPUlNfQUQ3NDE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQUQ3NDE4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURDWFggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTkyNDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFQ3NDYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURUNzQ3MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEVDc0NzMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFQ3NDc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVRYUDEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRjcxODgyRkcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GNzUzNzVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRzc2MEEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03MCBpcyBub3Qgc2V0CitDT05GSUdfU0VOU09SU19MTTc1PW0KKyMgQ09ORklHX1NFTlNPUlNfTE03NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTFRDNDIxNSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xUQzQyNDUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTk1MjQxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYMTExMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVg2NjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODc0MjcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU0hUMTUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19ETUUxNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEUzc4MjggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19USE1DNTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19UTVA0MDEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19UTVA0MjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzkxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc5MkQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3OTMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODNMNzg2TkcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xJUzNfU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAorQ09ORklHX1dBVENIRE9HPXkKKyMgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfU09GVF9XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQTExMDBfV0FUQ0hET0cgaXMgbm90IHNldAorCisjCisjIElTQS1iYXNlZCBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfUENXQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19NSVhDT01XRCBpcyBub3Qgc2V0CisjIENPTkZJR19XRFQgaXMgbm90IHNldAorCisjCisjIFVTQi1iYXNlZCBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfVVNCUENXQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfU1NCX1BPU1NJQkxFPXkKKworIworIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKKyMKKyMgQ09ORklHX1NTQiBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9BU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfRUdQSU8gaXMgbm90IHNldAorIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19VQ0IxNDAwX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfVFBTNjUwMTAgaXMgbm90IHNldAorIyBDT05GSUdfVFdMNDAzMF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UN0w2NlhCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UQzYzODdYQiBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVEM2MzkzWEIgaXMgbm90IHNldAorIyBDT05GSUdfUE1JQ19EQTkwM1ggaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004MzFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9QQ0Y1MDYzMyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfTUMxMzc4MyBpcyBub3Qgc2V0CisjIENPTkZJR19BQjMxMDBfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19FWlhfUENBUCBpcyBub3Qgc2V0CisjIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfTUVESUFfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0wgaXMgbm90IHNldAorQ09ORklHX0ZCPXkKKyMgQ09ORklHX0ZJUk1XQVJFX0VESUQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfRERDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JPT1RfVkVTQV9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9DRkJfRklMTFJFQ1Q9bQorQ09ORklHX0ZCX0NGQl9DT1BZQVJFQT1tCitDT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVD1tCisjIENPTkZJR19GQl9DRkJfUkVWX1BJWEVMU19JTl9CWVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GSUxMUkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfQ09QWUFSRUEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0lNQUdFQkxJVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9GT1JFSUdOX0VORElBTiBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfRk9QUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKKworIworIyBGcmFtZSBidWZmZXIgaGFyZHdhcmUgZHJpdmVycworIworIyBDT05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNldAorQ09ORklHX0ZCX1BYQT1tCisjIENPTkZJR19GQl9QWEFfT1ZFUkxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9QWEFfU01BUlRQQU5FTCBpcyBub3Qgc2V0CitDT05GSUdfRkJfUFhBX1BBUkFNRVRFUlM9eQorIyBDT05GSUdfRkJfTUJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1cxMDAgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NRVRST05PTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTUI4NjJYWCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9CUk9BRFNIRUVUIGlzIG5vdCBzZXQKK0NPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQ9eQorQ09ORklHX0xDRF9DTEFTU19ERVZJQ0U9bQorIyBDT05GSUdfTENEX0xNUzI4M0dGMDUgaXMgbm90IHNldAorIyBDT05GSUdfTENEX0xUVjM1MFFWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xDRF9JTEk5MzIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xDRF9URE8yNE0gaXMgbm90IHNldAorIyBDT05GSUdfTENEX1ZHRzI0MzJBNCBpcyBub3Qgc2V0CisjIENPTkZJR19MQ0RfUExBVEZPUk0gaXMgbm90IHNldAorQ09ORklHX0JBQ0tMSUdIVF9DTEFTU19ERVZJQ0U9bQorQ09ORklHX0JBQ0tMSUdIVF9HRU5FUklDPW0KKworIworIyBEaXNwbGF5IGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ESVNQTEFZX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTURBX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEU9bQorIyBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRV9ERVRFQ1RfUFJJTUFSWSBpcyBub3Qgc2V0CisjIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFX1JPVEFUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPTlRTIGlzIG5vdCBzZXQKK0NPTkZJR19GT05UXzh4OD15CitDT05GSUdfRk9OVF84eDE2PXkKK0NPTkZJR19MT0dPPXkKK0NPTkZJR19MT0dPX0xJTlVYX01PTk89eQorQ09ORklHX0xPR09fTElOVVhfVkdBMTY9eQorQ09ORklHX0xPR09fTElOVVhfQ0xVVDIyND15CitDT05GSUdfU09VTkQ9bQorQ09ORklHX1NPVU5EX09TU19DT1JFPXkKK0NPTkZJR19TT1VORF9PU1NfQ09SRV9QUkVDTEFJTT15CitDT05GSUdfU05EPW0KK0NPTkZJR19TTkRfVElNRVI9bQorQ09ORklHX1NORF9QQ009bQorQ09ORklHX1NORF9KQUNLPXkKKyMgQ09ORklHX1NORF9TRVFVRU5DRVIgaXMgbm90IHNldAorQ09ORklHX1NORF9PU1NFTVVMPXkKK0NPTkZJR19TTkRfTUlYRVJfT1NTPW0KK0NPTkZJR19TTkRfUENNX09TUz1tCitDT05GSUdfU05EX1BDTV9PU1NfUExVR0lOUz15CisjIENPTkZJR19TTkRfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1NVUFBPUlRfT0xEX0FQSSBpcyBub3Qgc2V0CitDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTPXkKKyMgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1NORF9WTUFTVEVSPXkKKyMgQ09ORklHX1NORF9SQVdNSURJX1NFUSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfT1BMM19MSUJfU0VRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9PUEw0X0xJQl9TRVEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1NCQVdFX1NFUSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRU1VMTBLMV9TRVEgaXMgbm90IHNldAorQ09ORklHX1NORF9BQzk3X0NPREVDPW0KK0NPTkZJR19TTkRfRFJJVkVSUz15CisjIENPTkZJR19TTkRfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01UUEFWIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TRVJJQUxfVTE2NTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NUFU0MDEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FDOTdfUE9XRVJfU0FWRSBpcyBub3Qgc2V0CitDT05GSUdfU05EX0FSTT15CitDT05GSUdfU05EX1BYQTJYWF9QQ009bQorQ09ORklHX1NORF9QWEEyWFhfTElCPW0KK0NPTkZJR19TTkRfUFhBMlhYX0xJQl9BQzk3PXkKK0NPTkZJR19TTkRfUFhBMlhYX0FDOTc9bQorIyBDT05GSUdfU05EX1NQSSBpcyBub3Qgc2V0CitDT05GSUdfU05EX1VTQj15CisjIENPTkZJR19TTkRfVVNCX0FVRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9VU0JfQ0FJQVEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1BDTUNJQSBpcyBub3Qgc2V0CitDT05GSUdfU05EX1NPQz1tCitDT05GSUdfU05EX1BYQTJYWF9TT0M9bQorQ09ORklHX1NORF9TT0NfSTJDX0FORF9TUEk9bQorIyBDT05GSUdfU05EX1NPQ19BTExfQ09ERUNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKK0NPTkZJR19BQzk3X0JVUz1tCisjIENPTkZJR19ISURfU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1NVUFBPUlQ9eQorQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19FSENJIGlzIG5vdCBzZXQKK0NPTkZJR19VU0I9bQorIyBDT05GSUdfVVNCX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BTk5PVU5DRV9ORVdfREVWSUNFUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVU0Igb3B0aW9ucworIworQ09ORklHX1VTQl9ERVZJQ0VGUz15CitDT05GSUdfVVNCX0RFVklDRV9DTEFTUz15CisjIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAorQ09ORklHX1VTQl9TVVNQRU5EPXkKKyMgQ09ORklHX1VTQl9PVEcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV1VTQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV1VTQl9DQkFGIGlzIG5vdCBzZXQKKworIworIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9DNjdYMDBfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PWFUyMTBIUF9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxNzYwX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNQMTM2Ml9IQ0QgaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0hDRD1tCisjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX0RFU0MgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTl9NTUlPIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfT0hDSV9MSVRUTEVfRU5ESUFOPXkKKyMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1I4QTY2NTk3X0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSFdBX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTVVTQl9IRFJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfTVVTQl9IRFJDIGlzIG5vdCBzZXQKKworIworIyBVU0IgRGV2aWNlIENsYXNzIGRyaXZlcnMKKyMKK0NPTkZJR19VU0JfQUNNPW0KKyMgQ09ORklHX1VTQl9QUklOVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9XRE0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RNQyBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZGVwZW5kcyBvbiBTQ1NJIGJ1dCBCTEtfREVWX1NEIG1heQorIworCisjCisjIGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvCisjCitDT05GSUdfVVNCX1NUT1JBR0U9bQorIyBDT05GSUdfVVNCX1NUT1JBR0VfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfREFUQUZBQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9GUkVFQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0lTRDIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9VU0JBVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSMDkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0FMQVVEQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9PTkVUT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9LQVJNQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9DWVBSRVNTX0FUQUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MSUJVU1VBTCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEltYWdpbmcgZGV2aWNlcworIworIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAorCisjCisjIFVTQiBwb3J0IGRyaXZlcnMKKyMKK0NPTkZJR19VU0JfU0VSSUFMPW0KKyMgQ09ORklHX1VTQl9FWlVTQiBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1NFUklBTF9HRU5FUklDPXkKKyMgQ09ORklHX1VTQl9TRVJJQUxfQUlSQ0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9BUkszMTE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQkVMS0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQ0gzNDEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9XSElURUhFQVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9ESUdJX0FDQ0VMRVBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9DUDIxMFggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9DWVBSRVNTX004IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfRU1QRUcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9GVERJX1NJTyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0ZVTlNPRlQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9WSVNPUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0lQQVEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9JUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0VER0VQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfRURHRVBPUlRfVEkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9HQVJNSU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9JUFcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9JVVUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1BEQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9LTFNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfS09CSUxfU0NUIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfU0VSSUFMX01DVF9VMjMyPW0KKyMgQ09ORklHX1VTQl9TRVJJQUxfTU9TNzcyMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX01PUzc4NDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9NT1RPUk9MQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX05BVk1BTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1BMMjMwMyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX09USTY4NTggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9RVUFMQ09NTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1NQQ1A4WDUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9IUDRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfU0FGRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1NJRU1FTlNfTVBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfU0lFUlJBV0lSRUxFU1MgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9TWU1CT0wgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9USSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0NZQkVSSkFDSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1hJUkNPTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX09QVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX09NTklORVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9PUFRJQ09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfREVCVUcgaXMgbm90IHNldAorCisjCisjIFVTQiBNaXNjZWxsYW5lb3VzIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9FTUk2MiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FEVVRVWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VWU0VHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9CRVJSWV9DSEFSR0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1lQUkVTU19DWTdDNjMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZVEhFUk0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lETU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0ZURElfRUxBTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVBQTEVESVNQTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lPV0FSUklPUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNJR0hURlcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1ZTVCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0dBREdFVD1tCisjIENPTkZJR19VU0JfR0FER0VUX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfREVCVUdfRklMRVMgaXMgbm90IHNldAorQ09ORklHX1VTQl9HQURHRVRfVkJVU19EUkFXPTIKK0NPTkZJR19VU0JfR0FER0VUX1NFTEVDVEVEPXkKKyMgQ09ORklHX1VTQl9HQURHRVRfQVQ5MSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0FUTUVMX1VTQkEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9GU0xfVVNCMiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfUFhBMjVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfUjhBNjY1OTcgaXMgbm90IHNldAorQ09ORklHX1VTQl9HQURHRVRfUFhBMjdYPXkKK0NPTkZJR19VU0JfUFhBMjdYPW0KKyMgQ09ORklHX1VTQl9HQURHRVRfUzNDX0hTT1RHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfSU1YIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX002NjU5MiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0FNRDU1MzZVREMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9GU0xfUUUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9DSTEzWFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfTkVUMjI4MCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0dPS1UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9MQU5HV0VMTCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0RVTU1ZX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0RVQUxTUEVFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfWkVSTyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVVESU8gaXMgbm90IHNldAorQ09ORklHX1VTQl9FVEg9bQorQ09ORklHX1VTQl9FVEhfUk5ESVM9eQorIyBDT05GSUdfVVNCX0VUSF9FRU0gaXMgbm90IHNldAorQ09ORklHX1VTQl9HQURHRVRGUz1tCitDT05GSUdfVVNCX0ZJTEVfU1RPUkFHRT1tCisjIENPTkZJR19VU0JfRklMRV9TVE9SQUdFX1RFU1QgaXMgbm90IHNldAorQ09ORklHX1VTQl9HX1NFUklBTD1tCisjIENPTkZJR19VU0JfTUlESV9HQURHRVQgaXMgbm90IHNldAorQ09ORklHX1VTQl9HX1BSSU5URVI9bQorIyBDT05GSUdfVVNCX0NEQ19DT01QT1NJVEUgaXMgbm90IHNldAorCisjCisjIE9URyBhbmQgcmVsYXRlZCBpbmZyYXN0cnVjdHVyZQorIworQ09ORklHX1VTQl9PVEdfVVRJTFM9eQorIyBDT05GSUdfVVNCX0dQSU9fVkJVUyBpcyBub3Qgc2V0CisjIENPTkZJR19OT1BfVVNCX1hDRUlWIGlzIG5vdCBzZXQKK0NPTkZJR19NTUM9eQorIyBDT05GSUdfTU1DX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQ19VTlNBRkVfUkVTVU1FIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QvU0RJTyBDYXJkIERyaXZlcnMKKyMKK0NPTkZJR19NTUNfQkxPQ0s9eQorIyBDT05GSUdfTU1DX0JMT0NLX0JPVU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19TRElPX1VBUlQgaXMgbm90IHNldAorIyBDT05GSUdfTU1DX1RFU1QgaXMgbm90IHNldAorCisjCisjIE1NQy9TRC9TRElPIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCisjCitDT05GSUdfTU1DX1BYQT15CisjIENPTkZJR19NTUNfU0RIQ0kgaXMgbm90IHNldAorIyBDT05GSUdfTU1DX0FUOTEgaXMgbm90IHNldAorIyBDT05GSUdfTU1DX0FUTUVMTUNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQ19TUEkgaXMgbm90IHNldAorIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAorQ09ORklHX05FV19MRURTPXkKK0NPTkZJR19MRURTX0NMQVNTPW0KKworIworIyBMRUQgZHJpdmVycworIworIyBDT05GSUdfTEVEU19QQ0E5NTMyIGlzIG5vdCBzZXQKK0NPTkZJR19MRURTX0dQSU89bQorQ09ORklHX0xFRFNfR1BJT19QTEFURk9STT15CisjIENPTkZJR19MRURTX0xQMzk0NCBpcyBub3Qgc2V0CisjIENPTkZJR19MRURTX1BDQTk1NVggaXMgbm90IHNldAorIyBDT05GSUdfTEVEU19EQUMxMjRTMDg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xFRFNfQkQyODAyIGlzIG5vdCBzZXQKKworIworIyBMRUQgVHJpZ2dlcnMKKyMKK0NPTkZJR19MRURTX1RSSUdHRVJTPXkKK0NPTkZJR19MRURTX1RSSUdHRVJfVElNRVI9bQorQ09ORklHX0xFRFNfVFJJR0dFUl9IRUFSVEJFQVQ9bQorQ09ORklHX0xFRFNfVFJJR0dFUl9CQUNLTElHSFQ9bQorQ09ORklHX0xFRFNfVFJJR0dFUl9HUElPPW0KK0NPTkZJR19MRURTX1RSSUdHRVJfREVGQVVMVF9PTj1tCisKKyMKKyMgaXB0YWJsZXMgdHJpZ2dlciBpcyB1bmRlciBOZXRmaWx0ZXIgY29uZmlnIChMRUQgdGFyZ2V0KQorIworIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0xJQj15CitDT05GSUdfUlRDX0NMQVNTPW0KKworIworIyBSVEMgaW50ZXJmYWNlcworIworQ09ORklHX1JUQ19JTlRGX1NZU0ZTPXkKK0NPTkZJR19SVENfSU5URl9QUk9DPXkKK0NPTkZJR19SVENfSU5URl9ERVY9eQorIyBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTMwNyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTM3NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTY3MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX01BWDY5MDAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SUzVDMzcyIGlzIG5vdCBzZXQKK0NPTkZJR19SVENfRFJWX0lTTDEyMDg9bQorIyBDT05GSUdfUlRDX0RSVl9YMTIwNSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1BDRjg1NjMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQxVDgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUzM1MzkwQSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0ZNMzEzMCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JYODU4MSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JYODAyNSBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX000MVQ5NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTMwNSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTM5MCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX01BWDY5MDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SOTcwMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JTNUMzNDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzMyMzQgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9QQ0YyMTIzIGlzIG5vdCBzZXQKKworIworIyBQbGF0Zm9ybSBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9DTU9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxMjg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTUzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUMzUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUNTkgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NU002MjQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfQlE0ODAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlA1QzAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAorCisjCisjIG9uLUNQVSBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9TQTExMDAgaXMgbm90IHNldAorQ09ORklHX1JUQ19EUlZfUFhBPW0KKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAorIyBDT05GSUdfQVVYRElTUExBWSBpcyBub3Qgc2V0CisjIENPTkZJR19VSU8gaXMgbm90IHNldAorCisjCisjIFRJIFZMWU5RCisjCisjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorIyBDT05GSUdfRVhUM19ERUZBVUxUU19UT19PUkRFUkVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNF9GUyBpcyBub3Qgc2V0CitDT05GSUdfSkJEPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19GSUxFX0xPQ0tJTkc9eQorQ09ORklHX0ZTTk9USUZZPXkKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDYWNoZXMKKyMKKyMgQ09ORklHX0ZTQ0FDSEUgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPW0KKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19WRkFUX0ZTPW0KK0NPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT00MzcKK0NPTkZJR19GQVRfREVGQVVMVF9JT0NIQVJTRVQ9Imlzbzg4NTktMSIKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1BST0NfU1lTQ1RMPXkKK0NPTkZJR19QUk9DX1BBR0VfTU9OSVRPUj15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAorQ09ORklHX01JU0NfRklMRVNZU1RFTVM9eQorIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfRlM9eQorQ09ORklHX0pGRlMyX0ZTX0RFQlVHPTAKK0NPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUj15CisjIENPTkZJR19KRkZTMl9GU19XQlVGX1ZFUklGWSBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9TVU1NQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1pMSUI9eQorIyBDT05GSUdfSkZGUzJfTFpPIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9SVElNRT15CisjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1FVQVNIRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX05GU0Q9bQorQ09ORklHX05GU0RfVjM9eQorIyBDT05GSUdfTkZTRF9WM19BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfTkZTRF9WNCBpcyBub3Qgc2V0CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19FWFBPUlRGUz1tCitDT05GSUdfTkZTX0NPTU1PTj15CitDT05GSUdfU1VOUlBDPXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCitDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKKyMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKyMgQ09ORklHX0JTRF9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LQVJNQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWNjhfUEFSVElUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19OTFM9bQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz1tCisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorQ09ORklHX05MU19DT0RFUEFHRV84NTA9bQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0lTTzg4NTlfMT1tCisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfSVNPODg1OV8xNT1tCisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorQ09ORklHX05MU19VVEY4PW0KKyMgQ09ORklHX0RMTSBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKK0NPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CitDT05GSUdfTUFHSUNfU1lTUlE9eQorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAorQ09ORklHX0RFVEVDVF9IVU5HX1RBU0s9eQorIyBDT05GSUdfQk9PVFBBUkFNX0hVTkdfVEFTS19QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX0hVTkdfVEFTS19QQU5JQ19WQUxVRT0wCitDT05GSUdfU0NIRURfREVCVUc9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMVUJfREVCVUdfT04gaXMgbm90IHNldAorIyBDT05GSUdfU0xVQl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LTUVNTEVBSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfTVVURVhFUz15CisjIENPTkZJR19ERUJVR19MT0NLX0FMTE9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST1ZFX0xPQ0tJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTE9DS19TVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQ9eQorIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19OT1RJRklFUlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQ1JFREVOVElBTFMgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLVFJBQ0VfU0VMRl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0JMT0NLX0VYVF9ERVZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0ZPUkNFX1dFQUtfUEVSX0NQVSBpcyBub3Qgc2V0CisjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAorIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQorIyBDT05GSUdfUEFHRV9QT0lTT05JTkcgaXMgbm90IHNldAorQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQorQ09ORklHX0ZUUkFDRT15CisjIENPTkZJR19GVU5DVElPTl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVJRU09GRl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQUJMRV9ERUZBVUxUX1RSQUNFUlMgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAorQ09ORklHX0JSQU5DSF9QUk9GSUxFX05PTkU9eQorIyBDT05GSUdfUFJPRklMRV9BTk5PVEFURURfQlJBTkNIRVMgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMRV9BTExfQlJBTkNIRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tNRU1UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19XT1JLUVVFVUVfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUkNIX0tHREI9eQorIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CitDT05GSUdfQVJNX1VOV0lORD15CisjIENPTkZJR19ERUJVR19VU0VSIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19FUlJPUlM9eQorIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTEwgaXMgbm90IHNldAorIyBDT05GSUdfT0NfRVRNIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9TRUNVUklUWV9TRUxJTlVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfU0VDVVJJVFlfU01BQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9TRUNVUklUWV9UT01PWU8gaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfU0VDVVJJVFlfREFDPXkKK0NPTkZJR19ERUZBVUxUX1NFQ1VSSVRZPSIiCitDT05GSUdfQ1JZUFRPPXkKKworIworIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKKyMKK0NPTkZJR19DUllQVE9fQUxHQVBJPW0KK0NPTkZJR19DUllQVE9fQUxHQVBJMj1tCitDT05GSUdfQ1JZUFRPX0FFQUQyPW0KK0NPTkZJR19DUllQVE9fQkxLQ0lQSEVSPW0KK0NPTkZJR19DUllQVE9fQkxLQ0lQSEVSMj1tCitDT05GSUdfQ1JZUFRPX0hBU0g9bQorQ09ORklHX0NSWVBUT19IQVNIMj1tCitDT05GSUdfQ1JZUFRPX1JORzI9bQorQ09ORklHX0NSWVBUT19QQ09NUD1tCitDT05GSUdfQ1JZUFRPX01BTkFHRVI9bQorQ09ORklHX0NSWVBUT19NQU5BR0VSMj1tCisjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19XT1JLUVVFVUU9bQorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVVUSEVOQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQXNzb2NpYXRlZCBEYXRhCisjCisjIENPTkZJR19DUllQVE9fQ0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUUlWIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0NCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFMgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19FQ0I9bQorIyBDT05GSUdfQ1JZUFRPX0xSVyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWFRTIGlzIG5vdCBzZXQKKworIworIyBIYXNoIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVk1BQyBpcyBub3Qgc2V0CisKKyMKKyMgRGlnZXN0CisjCisjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HSEFTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQz1tCisjIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxNjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisKKyMKKyMgQ2lwaGVycworIworQ09ORklHX0NSWVBUT19BRVM9bQorIyBDT05GSUdfQ1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0FSQzQ9bQorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TQUxTQTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRUVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAorCisjCisjIENvbXByZXNzaW9uCisjCisjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWkxJQiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKKworIworIyBSYW5kb20gTnVtYmVyIEdlbmVyYXRpb24KKyMKKyMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fSFc9eQorIyBDT05GSUdfQklOQVJZX1BSSU5URiBpcyBub3Qgc2V0CisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworQ09ORklHX0JJVFJFVkVSU0U9eQorQ09ORklHX0dFTkVSSUNfRklORF9MQVNUX0JJVD15CitDT05GSUdfQ1JDX0NDSVRUPW0KK0NPTkZJR19DUkMxNj1tCitDT05GSUdfQ1JDX1QxMERJRj1tCitDT05GSUdfQ1JDX0lUVV9UPW0KK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQorQ09ORklHX0hBU19JT01FTT15CitDT05GSUdfSEFTX0lPUE9SVD15CitDT05GSUdfSEFTX0RNQT15CitDT05GSUdfTkxBVFRSPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21tYW4uaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21tYW4uaAppbmRleCA4ZWViZjg5Li40MWY5OWM1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tbWFuLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbW1hbi5oCkBAIC0xICsxLDQgQEAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tbWFuLmg+CisKKyNkZWZpbmUgYXJjaF9tbWFwX2NoZWNrKGFkZHIsIGxlbiwgZmxhZ3MpIFwKKwkoKChmbGFncykgJiBNQVBfRklYRUQgJiYgKGFkZHIpIDwgRklSU1RfVVNFUl9BRERSRVNTKSA/IC1FSU5WQUwgOiAwKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL01ha2VmaWxlIGIvYXJjaC9hcm0va2VybmVsL01ha2VmaWxlCmluZGV4IGU3Y2NmN2UuLmRkMDBmNzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9rZXJuZWwvTWFrZWZpbGUKQEAgLTU0LDUgKzU0LDYgQEAKIAogaGVhZC15CQkJOj0gaGVhZCQoTU1VRVhUKS5vCiBvYmotJChDT05GSUdfREVCVUdfTEwpCSs9IGRlYnVnLm8KK29iai0kKENPTkZJR19FQVJMWV9QUklOVEspCSs9IGVhcmx5X3ByaW50ay5vCiAKIGV4dHJhLXkgOj0gJChoZWFkLXkpIGluaXRfdGFzay5vIHZtbGludXgubGRzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvY2FsbHMuUyBiL2FyY2gvYXJtL2tlcm5lbC9jYWxscy5TCmluZGV4IGY1OGMxMTUuLjkzMTRhMmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9jYWxscy5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9jYWxscy5TCkBAIC0xNzIsNyArMTcyLDcgQEAKIC8qIDE2MCAqLwlDQUxMKHN5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWluKQogCQlDQUxMKHN5c19zY2hlZF9ycl9nZXRfaW50ZXJ2YWwpCiAJCUNBTEwoc3lzX25hbm9zbGVlcCkKLQkJQ0FMTChzeXNfYXJtX21yZW1hcCkKKwkJQ0FMTChzeXNfbXJlbWFwKQogCQlDQUxMKHN5c19zZXRyZXN1aWQxNikKIC8qIDE2NSAqLwlDQUxMKHN5c19nZXRyZXN1aWQxNikKIAkJQ0FMTChzeXNfbmlfc3lzY2FsbCkJCS8qIHZtODYgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9lYXJseV9wcmludGsuYyBiL2FyY2gvYXJtL2tlcm5lbC9lYXJseV9wcmludGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWFhMmIyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0va2VybmVsL2Vhcmx5X3ByaW50ay5jCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0va2VybmVsL2Vhcmx5X3ByaW50ay5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOSBTYXNjaGEgSGF1ZXIgPHMuaGF1ZXJAcGVuZ3V0cm9uaXguZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworZXh0ZXJuIHZvaWQgcHJpbnRjaChpbnQpOworCitzdGF0aWMgdm9pZCBlYXJseV93cml0ZShjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBuKQoreworCXdoaWxlIChuLS0gPiAwKSB7CisJCWlmICgqcyA9PSAnXG4nKQorCQkJcHJpbnRjaCgnXHInKTsKKwkJcHJpbnRjaCgqcyk7CisJCXMrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVhcmx5X2NvbnNvbGVfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvbiwgY29uc3QgY2hhciAqcywgdW5zaWduZWQgbikKK3sKKwllYXJseV93cml0ZShzLCBuKTsKK30KKworc3RhdGljIHN0cnVjdCBjb25zb2xlIGVhcmx5X2NvbnNvbGUgPSB7CisJLm5hbWUgPQkJImVhcmx5Y29uIiwKKwkud3JpdGUgPQllYXJseV9jb25zb2xlX3dyaXRlLAorCS5mbGFncyA9CUNPTl9QUklOVEJVRkZFUiB8IENPTl9CT09ULAorCS5pbmRleCA9CS0xLAorfTsKKworYXNtbGlua2FnZSB2b2lkIGVhcmx5X3ByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwljaGFyIGJ1Zls1MTJdOworCWludCBuOworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgZm10KTsKKwluID0gdnNjbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFwKTsKKwllYXJseV93cml0ZShidWYsIG4pOworCXZhX2VuZChhcCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX2Vhcmx5X3ByaW50ayhjaGFyICpidWYpCit7CisJcmVnaXN0ZXJfY29uc29sZSgmZWFybHlfY29uc29sZSk7CisJcmV0dXJuIDA7Cit9CisKK2Vhcmx5X3BhcmFtKCJlYXJseXByaW50ayIsIHNldHVwX2Vhcmx5X3ByaW50ayk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZW50cnktY29tbW9uLlMgYi9hcmNoL2FybS9rZXJuZWwvZW50cnktY29tbW9uLlMKaW5kZXggZjBmZTk1Yi4uMmMxZGI3NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2VudHJ5LWNvbW1vbi5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1jb21tb24uUwpAQCAtNDE2LDEyICs0MTYsMTIgQEAKIAkJdHN0CXI1LCAjUEdPRkZfTUFTSwogCQltb3ZlcQlyNSwgcjUsIGxzciAjUEFHRV9TSElGVCAtIDEyCiAJCXN0cmVxCXI1LCBbc3AsICM0XQotCQliZXEJZG9fbW1hcDIKKwkJYmVxCXN5c19tbWFwX3Bnb2ZmCiAJCW1vdglyMCwgIy1FSU5WQUwKIAkJbW92CXBjLCBscgogI2Vsc2UKIAkJc3RyCXI1LCBbc3AsICM0XQotCQliCWRvX21tYXAyCisJCWIJc3lzX21tYXBfcGdvZmYKICNlbmRpZgogRU5EUFJPQyhzeXNfbW1hcDIpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zbXBfdHdkLmMgYi9hcmNoL2FybS9rZXJuZWwvc21wX3R3ZC5jCmluZGV4IGE3M2EzNGQuLmVhMDJhN2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zbXBfdHdkLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3NtcF90d2QuYwpAQCAtMTYwLDYgKzE2MCw3IEBACiAKIAkvKiBNYWtlIHN1cmUgb3VyIGxvY2FsIGludGVycnVwdCBjb250cm9sbGVyIGhhcyB0aGlzIGVuYWJsZWQgKi8KIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaXJxX3RvX2Rlc2MoY2xrLT5pcnEpLT5zdGF0dXMgfD0gSVJRX05PUFJPQkU7CiAJZ2V0X2lycV9jaGlwKGNsay0+aXJxKS0+dW5tYXNrKGNsay0+aXJxKTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zeXNfYXJtLmMgYi9hcmNoL2FybS9rZXJuZWwvc3lzX2FybS5jCmluZGV4IDc4ZWNhYWMuLmFlNDAyN2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zeXNfYXJtLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3N5c19hcm0uYwpAQCAtMjgsNDEgKzI4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pcGMuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIGRvX21yZW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgb2xkX2xlbiwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIG5ld19sZW4sIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyBuZXdfYWRkcik7Ci0KLS8qIGNvbW1vbiBjb2RlIGZvciBvbGQgYW5kIG5ldyBtbWFwcyAqLwotaW5saW5lIGxvbmcgZG9fbW1hcDIoCi0JdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQl1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCi0JdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZikKLXsKLQlpbnQgZXJyb3IgPSAtRUlOVkFMOwotCXN0cnVjdCBmaWxlICogZmlsZSA9IE5VTEw7Ci0KLQlmbGFncyAmPSB+KE1BUF9FWEVDVVRBQkxFIHwgTUFQX0RFTllXUklURSk7Ci0KLQlpZiAoZmxhZ3MgJiBNQVBfRklYRUQgJiYgYWRkciA8IEZJUlNUX1VTRVJfQUREUkVTUykKLQkJZ290byBvdXQ7Ci0KLQllcnJvciA9IC1FQkFERjsKLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGZkKTsKLQkJaWYgKCFmaWxlKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOwotCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCi0JaWYgKGZpbGUpCi0JCWZwdXQoZmlsZSk7Ci1vdXQ6Ci0JcmV0dXJuIGVycm9yOwotfQotCiBzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0IHsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CiAJdW5zaWduZWQgbG9uZyBsZW47CkBAIC04NCwyOSArNDksMTEgQEAKIAlpZiAoYS5vZmZzZXQgJiB+UEFHRV9NQVNLKQogCQlnb3RvIG91dDsKIAotCWVycm9yID0gZG9fbW1hcDIoYS5hZGRyLCBhLmxlbiwgYS5wcm90LCBhLmZsYWdzLCBhLmZkLCBhLm9mZnNldCA+PiBQQUdFX1NISUZUKTsKKwllcnJvciA9IHN5c19tbWFwX3Bnb2ZmKGEuYWRkciwgYS5sZW4sIGEucHJvdCwgYS5mbGFncywgYS5mZCwgYS5vZmZzZXQgPj4gUEFHRV9TSElGVCk7CiBvdXQ6CiAJcmV0dXJuIGVycm9yOwogfQogCi1hc21saW5rYWdlIHVuc2lnbmVkIGxvbmcKLXN5c19hcm1fbXJlbWFwKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBvbGRfbGVuLAotCSAgICAgICB1bnNpZ25lZCBsb25nIG5ld19sZW4sIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCi0JICAgICAgIHVuc2lnbmVkIGxvbmcgbmV3X2FkZHIpCi17Ci0JdW5zaWduZWQgbG9uZyByZXQgPSAtRUlOVkFMOwotCi0JaWYgKGZsYWdzICYgTVJFTUFQX0ZJWEVEICYmIG5ld19hZGRyIDwgRklSU1RfVVNFUl9BRERSRVNTKQotCQlnb3RvIG91dDsKLQotCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JcmV0ID0gZG9fbXJlbWFwKGFkZHIsIG9sZF9sZW4sIG5ld19sZW4sIGZsYWdzLCBuZXdfYWRkcik7Ci0JdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0KLW91dDoKLQlyZXR1cm4gcmV0OwotfQotCiAvKgogICogUGVyZm9ybSB0aGUgc2VsZWN0KG5kLCBpbiwgb3V0LCBleCwgdHYpIGFuZCBtbWFwKCkgc3lzdGVtCiAgKiBjYWxscy4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggZTUyMmIyMC4uZjcwZDUyYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTMwLDYgKzMwLDggQEAKIAogI2RlZmluZSBfX3ZpcnRfdG9fYnVzKHgpCSgoeCkgLSBQQUdFX09GRlNFVCkKICNkZWZpbmUgX19idXNfdG9fdmlydCh4KQkoKHgpICsgUEFHRV9PRkZTRVQpCisjZGVmaW5lIF9fcGZuX3RvX2J1cyh4KQkJKF9fcGZuX3RvX3BoeXMoeCkgLSBQSFlTX09GRlNFVCkKKyNkZWZpbmUgX19idXNfdG9fcGZuKHgpCQlfX3BoeXNfdG9fcGZuKCh4KSArIFBIWVNfT0ZGU0VUKQogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NvbW1vbi5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NvbW1vbi5jCmluZGV4IGI5N2Y1MjkuLjQxZmViYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jb21tb24uYworKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY29tbW9uLmMKQEAgLTIwMSw2ICsyMDEsMTEgQEAKIAogI2lmZGVmIENPTkZJR19GT09UQlJJREdFX0FERElOCiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBmYl9idXNfc2RyYW1fb2Zmc2V0KHZvaWQpCit7CisJcmV0dXJuICpDU1JfUENJU0RSQU1CQVNFICYgMHhmZmZmZmZmMDsKK30KKwogLyoKICAqIFRoZXNlIHR3byBmdW5jdGlvbnMgY29udmVydCB2aXJ0dWFsIGFkZHJlc3NlcyB0byBQQ0kgYWRkcmVzc2VzIGFuZCBQQ0kKICAqIGFkZHJlc3NlcyB0byB2aXJ0dWFsIGFkZHJlc3Nlcy4gIE5vdGUgdGhhdCBpdCBpcyBvbmx5IGxlZ2FsIHRvIHVzZSB0aGVzZQpAQCAtMjEwLDE0ICsyMTUsMTMgQEAKIHsKIAlXQVJOX09OKHJlcyA8IFBBR0VfT0ZGU0VUIHx8IHJlcyA+PSAodW5zaWduZWQgbG9uZyloaWdoX21lbW9yeSk7CiAKLQlyZXR1cm4gKHJlcyAtIFBBR0VfT0ZGU0VUKSArICgqQ1NSX1BDSVNEUkFNQkFTRSAmIDB4ZmZmZmZmZjApOworCXJldHVybiByZXMgKyAoZmJfYnVzX3NkcmFtX29mZnNldCgpIC0gUEFHRV9PRkZTRVQpOwogfQogRVhQT1JUX1NZTUJPTChfX3ZpcnRfdG9fYnVzKTsKIAogdW5zaWduZWQgbG9uZyBfX2J1c190b192aXJ0KHVuc2lnbmVkIGxvbmcgcmVzKQogewotCXJlcyAtPSAoKkNTUl9QQ0lTRFJBTUJBU0UgJiAweGZmZmZmZmYwKTsKLQlyZXMgKz0gUEFHRV9PRkZTRVQ7CisJcmVzID0gcmVzIC0gKGZiX2J1c19zZHJhbV9vZmZzZXQoKSAtIFBBR0VfT0ZGU0VUKTsKIAogCVdBUk5fT04ocmVzIDwgUEFHRV9PRkZTRVQgfHwgcmVzID49ICh1bnNpZ25lZCBsb25nKWhpZ2hfbWVtb3J5KTsKIApAQCAtMjI1LDQgKzIyOSwxNiBAQAogfQogRVhQT1JUX1NZTUJPTChfX2J1c190b192aXJ0KTsKIAordW5zaWduZWQgbG9uZyBfX3Bmbl90b19idXModW5zaWduZWQgbG9uZyBwZm4pCit7CisJcmV0dXJuIF9fcGZuX3RvX3BoeXMocGZuKSArIChmYl9idXNfc2RyYW1fb2Zmc2V0KCkgLSBQSFlTX09GRlNFVCkpOworfQorRVhQT1JUX1NZTUJPTChfX3Bmbl90b19idXMpOworCit1bnNpZ25lZCBsb25nIF9fYnVzX3RvX3Bmbih1bnNpZ25lZCBsb25nIGJ1cykKK3sKKwlyZXR1cm4gX19waHlzX3RvX3BmbihidXMgLSAoZmJfYnVzX3NkcmFtX29mZnNldCgpIC0gUEhZU19PRkZTRVQpKTsKK30KK0VYUE9SVF9TWU1CT0woX19idXNfdG9fcGZuKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAppbmRleCBjYjE2ZTU5Li44ZDY0ZjQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTI5LDYgKzI5LDggQEAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiBleHRlcm4gdW5zaWduZWQgbG9uZyBfX3ZpcnRfdG9fYnVzKHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19idXNfdG9fdmlydCh1bnNpZ25lZCBsb25nKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIF9fcGZuX3RvX2J1cyh1bnNpZ25lZCBsb25nKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIF9fYnVzX3RvX3Bmbih1bnNpZ25lZCBsb25nKTsKICNlbmRpZgogI2RlZmluZSBfX3ZpcnRfdG9fYnVzCV9fdmlydF90b19idXMKICNkZWZpbmUgX19idXNfdG9fdmlydAlfX2J1c190b192aXJ0CkBAIC0zNiwxNCArMzgsMTUgQEAKICNlbGlmIGRlZmluZWQoQ09ORklHX0ZPT1RCUklER0VfSE9TVCkKIAogLyoKLSAqIFRoZSBmb290YnJpZGdlIGlzIHByb2dyYW1tZWQgdG8gZXhwb3NlIHRoZSBzeXN0ZW0gUkFNIGF0IHRoZSBjb3JyZXNwb25kaW5nCi0gKiBhZGRyZXNzLiAgU28sIGlmIFBBR0VfT0ZGU0VUIGlzIDB4YzAwMDAwMDAsIFJBTSBhcHBlYXJzIGF0IDB4ZTAwMDAwMDAuCi0gKiBJZiAweDgwMDAwMDAwLCB0aGVuIGl0cyBleHBvc2VkIGF0IDB4YTAwMDAwMDAgb24gdGhlIGJ1cy4gZXRjLgotICogVGhlIG9ubHkgcmVxdWlyZW1lbnQgaXMgdGhhdCB0aGUgUkFNIGlzbid0IHBsYWNlZCBhdCBidXMgYWRkcmVzcyAwIHdoaWNoCisgKiBUaGUgZm9vdGJyaWRnZSBpcyBwcm9ncmFtbWVkIHRvIGV4cG9zZSB0aGUgc3lzdGVtIFJBTSBhdCAweGUwMDAwMDAwLgorICogVGhlIHJlcXVpcmVtZW50IGlzIHRoYXQgdGhlIFJBTSBpc24ndCBwbGFjZWQgYXQgYnVzIGFkZHJlc3MgMCwgd2hpY2gKICAqIHdvdWxkIGNsYXNoIHdpdGggVkdBIGNhcmRzLgogICovCi0jZGVmaW5lIF9fdmlydF90b19idXMoeCkJKCh4KSAtIDB4ZTAwMDAwMDApCi0jZGVmaW5lIF9fYnVzX3RvX3ZpcnQoeCkJKCh4KSArIDB4ZTAwMDAwMDApCisjZGVmaW5lIEJVU19PRkZTRVQJCTB4ZTAwMDAwMDAKKyNkZWZpbmUgX192aXJ0X3RvX2J1cyh4KQkoKHgpICsgKEJVU19PRkZTRVQgLSBQQUdFX09GRlNFVCkpCisjZGVmaW5lIF9fYnVzX3RvX3ZpcnQoeCkJKCh4KSAtIChCVVNfT0ZGU0VUIC0gUEFHRV9PRkZTRVQpKQorI2RlZmluZSBfX3Bmbl90b19idXMoeCkJCShfX3Bmbl90b19waHlzKHgpICsgKEJVU19PRkZTRVQgLSBQSFlTX09GRlNFVCkpCisjZGVmaW5lIF9fYnVzX3RvX3Bmbih4KQkJX19waHlzX3RvX3BmbigoeCkgLSAoQlVTX09GRlNFVCAtIFBIWVNfT0ZGU0VUKSkKIAogI2Vsc2UKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggNDg5MTgyOC4uOTkxZjI0ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC0yOCw2ICsyOCw3IEBACiAjZGVmaW5lIEJVU19PRkZTRVQJVUwoMHg4MDAwMDAwMCkKICNkZWZpbmUgX192aXJ0X3RvX2J1cyh4KQkoKHgpIC0gUEFHRV9PRkZTRVQgKyBCVVNfT0ZGU0VUKQogI2RlZmluZSBfX2J1c190b192aXJ0KHgpCSgoeCkgLSBCVVNfT0ZGU0VUICsgUEFHRV9PRkZTRVQpCi0jZGVmaW5lIF9fcGZuX3RvX2J1cyh4KQkJKCgoeCkgPDwgUEFHRV9TSElGVCkgKyBCVVNfT0ZGU0VUKQorI2RlZmluZSBfX3Bmbl90b19idXMoeCkJCShfX3Bmbl90b19waHlzKHgpICsgKEJVU19PRkZTRVQgLSBQSFlTX09GRlNFVCkpCisjZGVmaW5lIF9fYnVzX3RvX3Bmbih4KQkJX19waHlzX3RvX3BmbigoeCkgLSAoQlVTX09GRlNFVCAtIFBIWVNfT0ZGU0VUKSkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAppbmRleCBhZWU3ZWI4Li45OGUzNDcxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTE3LDExICsxNywxNSBAQAogCiAjaW5jbHVkZSA8bWFjaC9peHAyMDAwLXJlZ3MuaD4KIAotI2RlZmluZSBfX3ZpcnRfdG9fYnVzKHYpIFwKLQkoKChfX3ZpcnRfdG9fcGh5cyh2KSAtIDB4MCkgKyAoKklYUDIwMDBfUENJX1NEUkFNX0JBUiAmIDB4ZmZmZmZmZjApKSkKKyNkZWZpbmUgSVhQMjAwMF9QQ0lfU0RSQU1fT0ZGU0VUCSgqSVhQMjAwMF9QQ0lfU0RSQU1fQkFSICYgMHhmZmZmZmZmMCkKIAotI2RlZmluZSBfX2J1c190b192aXJ0KGIpIFwKLQlfX3BoeXNfdG9fdmlydCgoKChiIC0gKCpJWFAyMDAwX1BDSV9TRFJBTV9CQVIgJiAweGZmZmZmZmYwKSkgKyAweDApKSkKKyNkZWZpbmUgX19waHlzX3RvX2J1cyh4KQkoKHgpICsgKElYUDIwMDBfUENJX1NEUkFNX09GRlNFVCAtIFBIWVNfT0ZGU0VUKSkKKyNkZWZpbmUgX19idXNfdG9fcGh5cyh4KQkoKHgpIC0gKElYUDIwMDBfUENJX1NEUkFNX09GRlNFVCAtIFBIWVNfT0ZGU0VUKSkKKworI2RlZmluZSBfX3ZpcnRfdG9fYnVzKHYpCV9fcGh5c190b19idXMoX192aXJ0X3RvX3BoeXModikpCisjZGVmaW5lIF9fYnVzX3RvX3ZpcnQoYikJX19waHlzX3RvX3ZpcnQoX19idXNfdG9fcGh5cyhiKSkKKyNkZWZpbmUgX19wZm5fdG9fYnVzKHApCQlfX3BoeXNfdG9fYnVzKF9fcGZuX3RvX3BoeXMocCkpCisjZGVmaW5lIF9fYnVzX3RvX3BmbihiKQkJX19waHlzX3RvX3BmbihfX2J1c190b19waHlzKGIpKQogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyM3h4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggZmRkMTM4Ny4uOTRhM2E4NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyM3h4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9tYWNoLWl4cDIzeHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC0xOSwxNiArMTksMTUgQEAKICAqLwogI2RlZmluZSBQSFlTX09GRlNFVAkJKDB4MDAwMDAwMDApCiAKLSNkZWZpbmUgX192aXJ0X3RvX2J1cyh2KQkJCQkJCVwKLQkoeyB1bnNpZ25lZCBpbnQgcmV0OwkJCQkJCVwKLQlyZXQgPSAoKF9fdmlydF90b19waHlzKHYpIC0gMHgwMDAwMDAwMCkgKwkJCVwKLQkgKCooKHZvbGF0aWxlIGludCAqKUlYUDIzWFhfUENJX1NEUkFNX0JBUikgJiAweGZmZmZmZmYwKSk7IAlcCi0JcmV0OyB9KQorI2RlZmluZSBJWFAyM1hYX1BDSV9TRFJBTV9PRkZTRVQgKCooKHZvbGF0aWxlIGludCAqKUlYUDIzWFhfUENJX1NEUkFNX0JBUikgJiAweGZmZmZmZmYwKSkKIAotI2RlZmluZSBfX2J1c190b192aXJ0KGIpCQkJCQkJXAotCSh7IHVuc2lnbmVkIGludCBkYXRhOwkJCQkJCVwKLQlkYXRhID0gKigodm9sYXRpbGUgaW50ICopSVhQMjNYWF9QQ0lfU0RSQU1fQkFSKTsJCVwKLQkgX19waHlzX3RvX3ZpcnQoKCgoYiAtIChkYXRhICYgMHhmZmZmZmZmMCkpICsgMHgwMDAwMDAwMCkpKTsgfSkKKyNkZWZpbmUgX19waHlzX3RvX2J1cyh4KQkoKHgpICsgKElYUDIzWFhfUENJX1NEUkFNX09GRlNFVCAtIFBIWVNfT0ZGU0VUKSkKKyNkZWZpbmUgX19idXNfdG9fcGh5cyh4KQkoKHgpIC0gKElYUDIzWFhfUENJX1NEUkFNX09GRlNFVCAtIFBIWVNfT0ZGU0VUKSkKKworI2RlZmluZSBfX3ZpcnRfdG9fYnVzKHYpCV9fcGh5c190b19idXMoX192aXJ0X3RvX3BoeXModikpCisjZGVmaW5lIF9fYnVzX3RvX3ZpcnQoYikJX19waHlzX3RvX3ZpcnQoX19idXNfdG9fcGh5cyhiKSkKKyNkZWZpbmUgX19wZm5fdG9fYnVzKHApCQlfX3BoeXNfdG9fYnVzKF9fcGZuX3RvX3BoeXMocCkpCisjZGVmaW5lIF9fYnVzX3RvX3BmbihiKQkJX19waHlzX3RvX3BmbihfX2J1c190b19waHlzKGIpKQogCiAjZGVmaW5lIGFyY2hfaXNfY29oZXJlbnQoKQkxCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L0tjb25maWcgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9LY29uZmlnCmluZGV4IDI2NGY0ZDUuLjllNTA3MGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvS2NvbmZpZwpAQCAtMTc5LDIxICsxNzksMjEgQEAKIAloZWxwCiAgICAgICAgICAgSVhQNHh4IHByb3ZpZGVzIHR3byBtZXRob2RzIG9mIGFjY2Vzc2luZyBQQ0kgbWVtb3J5IHNwYWNlOgogCi0gICAgICAgICAgMSkgQSBkaXJlY3QgbWFwcGVkIHdpbmRvdyBmcm9tIDB4NDgwMDAwMDAgdG8gMHg0YmZmZmZmZiAoNjRNQikuCisgICAgICAgICAgMSkgQSBkaXJlY3QgbWFwcGVkIHdpbmRvdyBmcm9tIDB4NDgwMDAwMDAgdG8gMHg0QkZGRkZGRiAoNjRNQikuCiAgICAgICAgICAgICAgVG8gYWNjZXNzIFBDSSB2aWEgdGhpcyBzcGFjZSwgd2Ugc2ltcGx5IGlvcmVtYXAoKSB0aGUgQkFSCiAgICAgICAgICAgICAgaW50byB0aGUga2VybmVsIGFuZCB3ZSBjYW4gdXNlIHRoZSBzdGFuZGFyZCByZWFkW2J3bF0vd3JpdGVbYndsXQogICAgICAgICAgICAgIG1hY3Jvcy4gVGhpcyBpcyB0aGUgcHJlZmVycmVkIG1ldGhvZCBkdWUgdG8gc3BlZWQgYnV0IGl0Ci0gICAgICAgICAgICAgbGltaXRzIHRoZSBzeXN0ZW0gdG8ganVzdCA2NE1CIG9mIFBDSSBtZW1vcnkuIFRoaXMgY2FuIGJlIAorICAgICAgICAgICAgIGxpbWl0cyB0aGUgc3lzdGVtIHRvIGp1c3QgNjRNQiBvZiBQQ0kgbWVtb3J5LiBUaGlzIGNhbiBiZQogICAgICAgICAgICAgIHByb2JsZW1hdGljIGlmIHVzaW5nIHZpZGVvIGNhcmRzIGFuZCBvdGhlciBtZW1vcnktaGVhdnkgZGV2aWNlcy4KLSAgICAgICAgICAKLSAgICAgICAgICAyKSBJZiA+IDY0TUIgb2YgbWVtb3J5IHNwYWNlIGlzIHJlcXVpcmVkLCB0aGUgSVhQNHh4IGNhbiBiZSAKLQkgICAgIGNvbmZpZ3VyZWQgdG8gdXNlIGluZGlyZWN0IHJlZ2lzdGVycyB0byBhY2Nlc3MgUENJIFRoaXMgYWxsb3dzIAotCSAgICAgZm9yIHVwIHRvIDEyOE1CICgweDQ4MDAwMDAwIHRvIDB4NGZmZmZmZmYpIG9mIG1lbW9yeSBvbiB0aGUgYnVzLiAKLQkgICAgIFRoZSBkaXNhZHZhbnRhZ2Ugb2YgdGhpcyBpcyB0aGF0IGV2ZXJ5IFBDSSBhY2Nlc3MgcmVxdWlyZXMgCi0JICAgICB0aHJlZSBsb2NhbCByZWdpc3RlciBhY2Nlc3NlcyBwbHVzIGEgc3BpbmxvY2ssIGJ1dCBpbiBzb21lIAotCSAgICAgY2FzZXMgdGhlIHBlcmZvcm1hbmNlIGhpdCBpcyBhY2NlcHRhYmxlLiBJbiBhZGRpdGlvbiwgeW91IGNhbm5vdCAKLQkgICAgIG1tYXAoKSBQQ0kgZGV2aWNlcyBpbiB0aGlzIGNhc2UgZHVlIHRvIHRoZSBpbmRpcmVjdCBuYXR1cmUKLQkgICAgIG9mIHRoZSBQQ0kgd2luZG93LgorCisJICAyKSBJZiA+IDY0TUIgb2YgbWVtb3J5IHNwYWNlIGlzIHJlcXVpcmVkLCB0aGUgSVhQNHh4IGNhbiBiZQorCSAgICAgY29uZmlndXJlZCB0byB1c2UgaW5kaXJlY3QgcmVnaXN0ZXJzIHRvIGFjY2VzcyB0aGUgd2hvbGUgUENJCisJICAgICBtZW1vcnkgc3BhY2UuIFRoaXMgY3VycmVudGx5IGFsbG93cyBmb3IgdXAgdG8gMSBHQiAoMHgxMDAwMDAwMAorCSAgICAgdG8gMHg0RkZGRkZGRikgb2YgbWVtb3J5IG9uIHRoZSBidXMuIFRoZSBkaXNhZHZhbnRhZ2Ugb2YgdGhpcworCSAgICAgaXMgdGhhdCBldmVyeSBQQ0kgYWNjZXNzIHJlcXVpcmVzIHRocmVlIGxvY2FsIHJlZ2lzdGVyIGFjY2Vzc2VzCisJICAgICBwbHVzIGEgc3BpbmxvY2ssIGJ1dCBpbiBzb21lIGNhc2VzIHRoZSBwZXJmb3JtYW5jZSBoaXQgaXMKKwkgICAgIGFjY2VwdGFibGUuIEluIGFkZGl0aW9uLCB5b3UgY2Fubm90IG1tYXAoKSBQQ0kgZGV2aWNlcyBpbiB0aGlzCisJICAgICBjYXNlIGR1ZSB0byB0aGUgaW5kaXJlY3QgbmF0dXJlIG9mIHRoZSBQQ0kgd2luZG93LgogCiAJICBCeSBkZWZhdWx0LCB0aGUgZGlyZWN0IG1ldGhvZCBpcyB1c2VkLiBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91CiAJICBuZWVkIHRvIHVzZSB0aGUgaW5kaXJlY3QgbWV0aG9kIGluc3RlYWQuIElmIHlvdSBkb24ndCBrbm93CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9hdmlsYS1wY2kuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2F2aWxhLXBjaS5jCmluZGV4IDA4ZDY1ZGMuLjg0NWUxYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2F2aWxhLXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2F2aWxhLXBjaS5jCkBAIC0yMiw0MCArMjIsNDUgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLQogI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAorI2RlZmluZSBBVklMQV9NQVhfREVWCTQKKyNkZWZpbmUgTE9GVF9NQVhfREVWCTYKKyNkZWZpbmUgSVJRX0xJTkVTCTQKKworLyogUENJIGNvbnRyb2xsZXIgR1BJTyB0byBJUlEgcGluIG1hcHBpbmdzICovCisjZGVmaW5lIElOVEEJCTExCisjZGVmaW5lIElOVEIJCTEwCisjZGVmaW5lIElOVEMJCTkKKyNkZWZpbmUgSU5URAkJOAorCiB2b2lkIF9faW5pdCBhdmlsYV9wY2lfcHJlaW5pdCh2b2lkKQogewotCXNldF9pcnFfdHlwZShJUlFfQVZJTEFfUENJX0lOVEEsIElSUV9UWVBFX0xFVkVMX0xPVyk7Ci0Jc2V0X2lycV90eXBlKElSUV9BVklMQV9QQ0lfSU5UQiwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKLQlzZXRfaXJxX3R5cGUoSVJRX0FWSUxBX1BDSV9JTlRDLCBJUlFfVFlQRV9MRVZFTF9MT1cpOwotCXNldF9pcnFfdHlwZShJUlFfQVZJTEFfUENJX0lOVEQsIElSUV9UWVBFX0xFVkVMX0xPVyk7Ci0KKwlzZXRfaXJxX3R5cGUoSVhQNFhYX0dQSU9fSVJRKElOVEEpLCBJUlFfVFlQRV9MRVZFTF9MT1cpOworCXNldF9pcnFfdHlwZShJWFA0WFhfR1BJT19JUlEoSU5UQiksIElSUV9UWVBFX0xFVkVMX0xPVyk7CisJc2V0X2lycV90eXBlKElYUDRYWF9HUElPX0lSUShJTlRDKSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKKwlzZXRfaXJxX3R5cGUoSVhQNFhYX0dQSU9fSVJRKElOVEQpLCBJUlFfVFlQRV9MRVZFTF9MT1cpOwogCWl4cDR4eF9wY2lfcHJlaW5pdCgpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBhdmlsYV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKLQlzdGF0aWMgaW50IHBjaV9pcnFfdGFibGVbQVZJTEFfUENJX0lSUV9MSU5FU10gPSB7Ci0JCUlSUV9BVklMQV9QQ0lfSU5UQSwKLQkJSVJRX0FWSUxBX1BDSV9JTlRCLAotCQlJUlFfQVZJTEFfUENJX0lOVEMsCi0JCUlSUV9BVklMQV9QQ0lfSU5URAorCXN0YXRpYyBpbnQgcGNpX2lycV90YWJsZVtJUlFfTElORVNdID0geworCQlJWFA0WFhfR1BJT19JUlEoSU5UQSksCisJCUlYUDRYWF9HUElPX0lSUShJTlRCKSwKKwkJSVhQNFhYX0dQSU9fSVJRKElOVEMpLAorCQlJWFA0WFhfR1BJT19JUlEoSU5URCkKIAl9OwogCi0JaW50IGlycSA9IC0xOwotCiAJaWYgKHNsb3QgPj0gMSAmJgotCXNsb3QgPD0gKG1hY2hpbmVfaXNfbG9mdCgpID8gTE9GVF9QQ0lfTUFYX0RFViA6IEFWSUxBX1BDSV9NQVhfREVWKSAmJgotCQlwaW4gPj0gMSAmJiBwaW4gPD0gQVZJTEFfUENJX0lSUV9MSU5FUykgewotCQlpcnEgPSBwY2lfaXJxX3RhYmxlWyhzbG90ICsgcGluIC0gMikgJSA0XTsKLQl9CisJICAgIHNsb3QgPD0gKG1hY2hpbmVfaXNfbG9mdCgpID8gTE9GVF9NQVhfREVWIDogQVZJTEFfTUFYX0RFVikgJiYKKwkgICAgcGluID49IDEgJiYgcGluIDw9IElSUV9MSU5FUykKKwkJcmV0dXJuIHBjaV9pcnFfdGFibGVbKHNsb3QgKyBwaW4gLSAyKSAlIDRdOwogCi0JcmV0dXJuIGlycTsKKwlyZXR1cm4gLTE7CiB9CiAKIHN0cnVjdCBod19wY2kgYXZpbGFfcGNpIF9faW5pdGRhdGEgPSB7CkBAIC03NSw0ICs4MCwzIEBACiB9CiAKIHN1YnN5c19pbml0Y2FsbChhdmlsYV9wY2lfaW5pdCk7Ci0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2F2aWxhLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9hdmlsYS1zZXR1cC5jCmluZGV4IDc5Nzk5NWMuLjZlNTU4YTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2F2aWxhLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvYXZpbGEtc2V0dXAuYwpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy1ncGlvLmg+Ci0KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+CkBAIC0yOSw2ICsyOCw5IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CiAKKyNkZWZpbmUgQVZJTEFfU0RBX1BJTgk3CisjZGVmaW5lIEFWSUxBX1NDTF9QSU4JNgorCiBzdGF0aWMgc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgYXZpbGFfZmxhc2hfZGF0YSA9IHsKIAkubWFwX25hbWUJPSAiY2ZpX3Byb2JlIiwKIAkud2lkdGgJCT0gMiwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi1wY2kuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi1wY2kuYwppbmRleCA3MGFmY2ZlLi5jNGEwMTU5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24tcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLXBjaS5jCkBAIC00ODEsMTEgKzQ4MSw3IEBACiAKIAlyZXNbMV0ubmFtZSA9ICJQQ0kgTWVtb3J5IFNwYWNlIjsKIAlyZXNbMV0uc3RhcnQgPSBQQ0lCSU9TX01JTl9NRU07Ci0jaWZuZGVmIENPTkZJR19JWFA0WFhfSU5ESVJFQ1RfUENJCi0JcmVzWzFdLmVuZCA9IDB4NGJmZmZmZmY7Ci0jZWxzZQotCXJlc1sxXS5lbmQgPSAweDRmZmZmZmZmOwotI2VuZGlmCisJcmVzWzFdLmVuZCA9IFBDSUJJT1NfTUFYX01FTTsKIAlyZXNbMV0uZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKIAogCXJlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwgJnJlc1swXSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jCmluZGV4IGNmZDUyZmIuLjNiYmY0MGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jCkBAIC0xMTcsNyArMTE3LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woZ3Bpb190b19pcnEpOwogCi1pbnQgaXJxX3RvX2dwaW8oaW50IGlycSkKK2ludCBpcnFfdG9fZ3Bpbyh1bnNpZ25lZCBpbnQgaXJxKQogewogCWludCBncGlvID0gKGlycSA8IDMyKSA/IGlycTJncGlvW2lycV0gOiAtRUlOVkFMOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb3lvdGUtcGNpLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb3lvdGUtcGNpLmMKaW5kZXggZWZkZGYwMS4uYjk3OGVhOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY295b3RlLXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NveW90ZS1wY2kuYwpAQCAtMTgsMjcgKzE4LDMxIEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgotCiAjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CiAKKyNkZWZpbmUgU0xPVDBfREVWSUQJMTQKKyNkZWZpbmUgU0xPVDFfREVWSUQJMTUKKworLyogUENJIGNvbnRyb2xsZXIgR1BJTyB0byBJUlEgcGluIG1hcHBpbmdzICovCisjZGVmaW5lIFNMT1QwX0lOVEEJNgorI2RlZmluZSBTTE9UMV9JTlRBCTExCisKIHZvaWQgX19pbml0IGNveW90ZV9wY2lfcHJlaW5pdCh2b2lkKQogewotCXNldF9pcnFfdHlwZShJUlFfQ09ZT1RFX1BDSV9TTE9UMCwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKLQlzZXRfaXJxX3R5cGUoSVJRX0NPWU9URV9QQ0lfU0xPVDEsIElSUV9UWVBFX0xFVkVMX0xPVyk7Ci0KKwlzZXRfaXJxX3R5cGUoSVhQNFhYX0dQSU9fSVJRKFNMT1QwX0lOVEEpLCBJUlFfVFlQRV9MRVZFTF9MT1cpOworCXNldF9pcnFfdHlwZShJWFA0WFhfR1BJT19JUlEoU0xPVDFfSU5UQSksIElSUV9UWVBFX0xFVkVMX0xPVyk7CiAJaXhwNHh4X3BjaV9wcmVpbml0KCk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGNveW90ZV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKLQlpZiAoc2xvdCA9PSBDT1lPVEVfUENJX1NMT1QwX0RFVklEKQotCQlyZXR1cm4gSVJRX0NPWU9URV9QQ0lfU0xPVDA7Ci0JZWxzZSBpZiAoc2xvdCA9PSBDT1lPVEVfUENJX1NMT1QxX0RFVklEKQotCQlyZXR1cm4gSVJRX0NPWU9URV9QQ0lfU0xPVDE7CisJaWYgKHNsb3QgPT0gU0xPVDBfREVWSUQpCisJCXJldHVybiBJWFA0WFhfR1BJT19JUlEoU0xPVDBfSU5UQSk7CisJZWxzZSBpZiAoc2xvdCA9PSBTTE9UMV9ERVZJRCkKKwkJcmV0dXJuIElYUDRYWF9HUElPX0lSUShTTE9UMV9JTlRBKTsKIAllbHNlIHJldHVybiAtMTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY295b3RlLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb3lvdGUtc2V0dXAuYwppbmRleCBhYWIxOTU0Li4yNWJmNWFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb3lvdGUtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb3lvdGUtc2V0dXAuYwpAQCAtMjUsNiArMjUsMTUgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KIAorI2RlZmluZSBDT1lPVEVfSURFX0JBU0VfUEhZUwlJWFA0WFhfRVhQX0JVU19CQVNFKDMpCisjZGVmaW5lIENPWU9URV9JREVfQkFTRV9WSVJUCTB4RkZGRTEwMDAKKyNkZWZpbmUgQ09ZT1RFX0lERV9SRUdJT05fU0laRQkweDEwMDAKKworI2RlZmluZSBDT1lPVEVfSURFX0RBVEFfUE9SVAkweEZGRkUxMEUwCisjZGVmaW5lIENPWU9URV9JREVfQ1RSTF9QT1JUCTB4RkZGRTEwRkMKKyNkZWZpbmUgQ09ZT1RFX0lERV9FUlJPUl9QT1JUCTB4RkZGRTEwRTIKKyNkZWZpbmUgSVJRX0NPWU9URV9JREUJCUlSUV9JWFA0WFhfR1BJTzUKKwogc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIGNveW90ZV9mbGFzaF9kYXRhID0gewogCS5tYXBfbmFtZQk9ICJjZmlfcHJvYmUiLAogCS53aWR0aAkJPSAyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZHNtZzYwMC1wY2kuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2RzbWc2MDAtcGNpLmMKaW5kZXggOTI2ZDE1Zi4uZmE3MGZlZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZHNtZzYwMC1wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9kc21nNjAwLXBjaS5jCkBAIC0xOSwzOSArMTksNDUgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0KICNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCisjZGVmaW5lIE1BWF9ERVYJCTQKKyNkZWZpbmUgSVJRX0xJTkVTCTMKKworLyogUENJIGNvbnRyb2xsZXIgR1BJTyB0byBJUlEgcGluIG1hcHBpbmdzICovCisjZGVmaW5lIElOVEEJCTExCisjZGVmaW5lIElOVEIJCTEwCisjZGVmaW5lIElOVEMJCTkKKyNkZWZpbmUgSU5URAkJOAorI2RlZmluZSBJTlRFCQk3CisjZGVmaW5lIElOVEYJCTYKKwogdm9pZCBfX2luaXQgZHNtZzYwMF9wY2lfcHJlaW5pdCh2b2lkKQogewotCXNldF9pcnFfdHlwZShJUlFfRFNNRzYwMF9QQ0lfSU5UQSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKLQlzZXRfaXJxX3R5cGUoSVJRX0RTTUc2MDBfUENJX0lOVEIsIElSUV9UWVBFX0xFVkVMX0xPVyk7Ci0Jc2V0X2lycV90eXBlKElSUV9EU01HNjAwX1BDSV9JTlRDLCBJUlFfVFlQRV9MRVZFTF9MT1cpOwotCXNldF9pcnFfdHlwZShJUlFfRFNNRzYwMF9QQ0lfSU5URCwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKLQlzZXRfaXJxX3R5cGUoSVJRX0RTTUc2MDBfUENJX0lOVEUsIElSUV9UWVBFX0xFVkVMX0xPVyk7Ci0Jc2V0X2lycV90eXBlKElSUV9EU01HNjAwX1BDSV9JTlRGLCBJUlFfVFlQRV9MRVZFTF9MT1cpOwotCisJc2V0X2lycV90eXBlKElYUDRYWF9HUElPX0lSUShJTlRBKSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKKwlzZXRfaXJxX3R5cGUoSVhQNFhYX0dQSU9fSVJRKElOVEIpLCBJUlFfVFlQRV9MRVZFTF9MT1cpOworCXNldF9pcnFfdHlwZShJWFA0WFhfR1BJT19JUlEoSU5UQyksIElSUV9UWVBFX0xFVkVMX0xPVyk7CisJc2V0X2lycV90eXBlKElYUDRYWF9HUElPX0lSUShJTlREKSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKKwlzZXRfaXJxX3R5cGUoSVhQNFhYX0dQSU9fSVJRKElOVEUpLCBJUlFfVFlQRV9MRVZFTF9MT1cpOworCXNldF9pcnFfdHlwZShJWFA0WFhfR1BJT19JUlEoSU5URiksIElSUV9UWVBFX0xFVkVMX0xPVyk7CiAJaXhwNHh4X3BjaV9wcmVpbml0KCk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGRzbWc2MDBfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7Ci0Jc3RhdGljIGludCBwY2lfaXJxX3RhYmxlW0RTTUc2MDBfUENJX01BWF9ERVZdW0RTTUc2MDBfUENJX0lSUV9MSU5FU10gPQotCXsKLQkJeyBJUlFfRFNNRzYwMF9QQ0lfSU5URSwgLTEsIC0xIH0sCi0JCXsgSVJRX0RTTUc2MDBfUENJX0lOVEEsIC0xLCAtMSB9LAotCQl7IElSUV9EU01HNjAwX1BDSV9JTlRCLCBJUlFfRFNNRzYwMF9QQ0lfSU5UQywgSVJRX0RTTUc2MDBfUENJX0lOVEQgfSwKLQkJeyBJUlFfRFNNRzYwMF9QQ0lfSU5URiwgLTEsIC0xIH0sCisJc3RhdGljIGludCBwY2lfaXJxX3RhYmxlW01BWF9ERVZdW0lSUV9MSU5FU10gPSB7CisJCXsgSVhQNFhYX0dQSU9fSVJRKElOVEUpLCAtMSwgLTEgfSwKKwkJeyBJWFA0WFhfR1BJT19JUlEoSU5UQSksIC0xLCAtMSB9LAorCQl7IElYUDRYWF9HUElPX0lSUShJTlRCKSwgSVhQNFhYX0dQSU9fSVJRKElOVEMpLAorCQkgIElYUDRYWF9HUElPX0lSUShJTlREKSB9LAorCQl7IElYUDRYWF9HUElPX0lSUShJTlRGKSwgLTEsIC0xIH0sCiAJfTsKIAotCWludCBpcnEgPSAtMTsKKwlpZiAoc2xvdCA+PSAxICYmIHNsb3QgPD0gTUFYX0RFViAmJiBwaW4gPj0gMSAmJiBwaW4gPD0gSVJRX0xJTkVTKQorCQlyZXR1cm4gcGNpX2lycV90YWJsZVtzbG90IC0gMV1bcGluIC0gMV07CiAKLQlpZiAoc2xvdCA+PSAxICYmIHNsb3QgPD0gRFNNRzYwMF9QQ0lfTUFYX0RFViAmJgotCQlwaW4gPj0gMSAmJiBwaW4gPD0gRFNNRzYwMF9QQ0lfSVJRX0xJTkVTKQotCQlpcnEgPSBwY2lfaXJxX3RhYmxlW3Nsb3QtMV1bcGluLTFdOwotCi0JcmV0dXJuIGlycTsKKwlyZXR1cm4gLTE7CiB9CiAKIHN0cnVjdCBod19wY2kgX19pbml0ZGF0YSBkc21nNjAwX3BjaSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2RzbWc2MDAtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2RzbWc2MDAtc2V0dXAuYwppbmRleCBhNTFiZmE2Li43YzFmYTU0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9kc21nNjAwLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZHNtZzYwMC1zZXR1cC5jCkBAIC0zMyw2ICszMywyMyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KICNpbmNsdWRlIDxhc20vZ3Bpby5oPgogCisjZGVmaW5lIERTTUc2MDBfU0RBX1BJTgkJNQorI2RlZmluZSBEU01HNjAwX1NDTF9QSU4JCTQKKworLyogRFNNLUc2MDAgVGltZXIgU2V0dGluZyAqLworI2RlZmluZSBEU01HNjAwX0ZSRVEJCTY2MDAwMDAwCisKKy8qIEJ1dHRvbnMgKi8KKyNkZWZpbmUgRFNNRzYwMF9QQl9HUElPCQkxNQkvKiBwb3dlciBidXR0b24gKi8KKyNkZWZpbmUgRFNNRzYwMF9SQl9HUElPCQkzCS8qIHJlc2V0IGJ1dHRvbiAqLworCisvKiBQb3dlciBjb250cm9sICovCisjZGVmaW5lIERTTUc2MDBfUE9fR1BJTwkJMgkvKiBwb3dlciBvZmYgKi8KKworLyogTEVEcyAqLworI2RlZmluZSBEU01HNjAwX0xFRF9QV1JfR1BJTwkwCisjZGVmaW5lIERTTUc2MDBfTEVEX1dMQU5fR1BJTwkxNAorCiBzdGF0aWMgc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgZHNtZzYwMF9mbGFzaF9kYXRhID0gewogCS5tYXBfbmFtZQkJPSAiY2ZpX3Byb2JlIiwKIAkud2lkdGgJCQk9IDIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9mc2ctcGNpLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9mc2ctcGNpLmMKaW5kZXggY2ExMmE5Yy4uNWE4MTBjOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZnNnLXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2ZzZy1wY2kuYwpAQCAtMTksMzMgKzE5LDM4IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotCiAjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAorI2RlZmluZSBNQVhfREVWCQkzCisjZGVmaW5lIElSUV9MSU5FUwkzCisKKy8qIFBDSSBjb250cm9sbGVyIEdQSU8gdG8gSVJRIHBpbiBtYXBwaW5ncyAqLworI2RlZmluZSBJTlRBCTYKKyNkZWZpbmUgSU5UQgk3CisjZGVmaW5lIElOVEMJNQorCiB2b2lkIF9faW5pdCBmc2dfcGNpX3ByZWluaXQodm9pZCkKIHsKLQlzZXRfaXJxX3R5cGUoSVJRX0ZTR19QQ0lfSU5UQSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKLQlzZXRfaXJxX3R5cGUoSVJRX0ZTR19QQ0lfSU5UQiwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKLQlzZXRfaXJxX3R5cGUoSVJRX0ZTR19QQ0lfSU5UQywgSVJRX1RZUEVfTEVWRUxfTE9XKTsKLQorCXNldF9pcnFfdHlwZShJWFA0WFhfR1BJT19JUlEoSU5UQSksIElSUV9UWVBFX0xFVkVMX0xPVyk7CisJc2V0X2lycV90eXBlKElYUDRYWF9HUElPX0lSUShJTlRCKSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKKwlzZXRfaXJxX3R5cGUoSVhQNFhYX0dQSU9fSVJRKElOVEMpLCBJUlFfVFlQRV9MRVZFTF9MT1cpOwogCWl4cDR4eF9wY2lfcHJlaW5pdCgpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBmc2dfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7Ci0Jc3RhdGljIGludCBwY2lfaXJxX3RhYmxlW0ZTR19QQ0lfSVJRX0xJTkVTXSA9IHsKLQkJSVJRX0ZTR19QQ0lfSU5UQywKLQkJSVJRX0ZTR19QQ0lfSU5UQiwKLQkJSVJRX0ZTR19QQ0lfSU5UQSwKKwlzdGF0aWMgaW50IHBjaV9pcnFfdGFibGVbSVJRX0xJTkVTXSA9IHsKKwkJSVhQNFhYX0dQSU9fSVJRKElOVEMpLAorCQlJWFA0WFhfR1BJT19JUlEoSU5UQiksCisJCUlYUDRYWF9HUElPX0lSUShJTlRBKSwKIAl9OwogCiAJaW50IGlycSA9IC0xOwotCXNsb3QgPSBzbG90IC0gMTE7CisJc2xvdCAtPSAxMTsKIAotCWlmIChzbG90ID49IDEgJiYgc2xvdCA8PSBGU0dfUENJX01BWF9ERVYgJiYKLQkgICAgcGluID49IDEgJiYgcGluIDw9IEZTR19QQ0lfSVJRX0xJTkVTKQotCQlpcnEgPSBwY2lfaXJxX3RhYmxlWyhzbG90IC0gMSldOworCWlmIChzbG90ID49IDEgJiYgc2xvdCA8PSBNQVhfREVWICYmIHBpbiA+PSAxICYmIHBpbiA8PSBJUlFfTElORVMpCisJCWlycSA9IHBjaV9pcnFfdGFibGVbc2xvdCAtIDFdOwogCXByaW50ayhLRVJOX0lORk8gIiVzOiBNYXBwZWQgc2xvdCAlZCBwaW4gJWQgdG8gSVJRICVkXG4iLAogCSAgICAgICBfX2Z1bmNfXywgc2xvdCwgcGluLCBpcnEpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9mc2ctc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2ZzZy1zZXR1cC5jCmluZGV4IDVhZGQyMmYuLmU3ZjRiZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2ZzZy1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2ZzZy1zZXR1cC5jCkBAIC0yNCwxMiArMjQsMTggQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgogI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAKKyNkZWZpbmUgRlNHX1NEQV9QSU4JCTEyCisjZGVmaW5lIEZTR19TQ0xfUElOCQkxMworCisjZGVmaW5lIEZTR19TQl9HUElPCQk0CS8qIHN5bmMgYnV0dG9uICovCisjZGVmaW5lIEZTR19SQl9HUElPCQk5CS8qIHJlc2V0IGJ1dHRvbiAqLworI2RlZmluZSBGU0dfVUJfR1BJTwkJMTAJLyogdXNiIGJ1dHRvbiAqLworCiBzdGF0aWMgc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgZnNnX2ZsYXNoX2RhdGEgPSB7CiAJLm1hcF9uYW1lCQk9ICJjZmlfcHJvYmUiLAogCS53aWR0aAkJCT0gMiwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2dvcmFtb19tbHIuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2dvcmFtb19tbHIuYwppbmRleCBhNzMzYjhmLi4xYzI4MDQ4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9nb3JhbW9fbWxyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ29yYW1vX21sci5jCkBAIC0xNywyOSArMTcsMjggQEAKICNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgogCi0jZGVmaW5lIHhncGlvX2lycShuKQkJKElSUV9JWFA0WFhfR1BJTyAjIyBuKQotI2RlZmluZSBncGlvX2lycShuKQkJeGdwaW9faXJxKG4pCi0KICNkZWZpbmUgU0xPVF9FVEhBCQkweDBCCS8qIElEU0VMID0gQUQyMSAqLwogI2RlZmluZSBTTE9UX0VUSEIJCTB4MEMJLyogSURTRUwgPSBBRDIwICovCiAjZGVmaW5lIFNMT1RfTVBDSQkJMHgwRAkvKiBJRFNFTCA9IEFEMTkgKi8KICNkZWZpbmUgU0xPVF9ORUMJCTB4MEUJLyogSURTRUwgPSBBRDE4ICovCiAKLSNkZWZpbmUgSVJRX0VUSEEJCUlSUV9JWFA0WFhfR1BJTzQKLSNkZWZpbmUgSVJRX0VUSEIJCUlSUV9JWFA0WFhfR1BJTzUKLSNkZWZpbmUgSVJRX05FQwkJCUlSUV9JWFA0WFhfR1BJTzMKLSNkZWZpbmUgSVJRX01QQ0kJCUlSUV9JWFA0WFhfR1BJTzEyCi0KIC8qIEdQSU8gbGluZXMgKi8KICNkZWZpbmUgR1BJT19TQ0wJCTAKICNkZWZpbmUgR1BJT19TREEJCTEKICNkZWZpbmUgR1BJT19TVFIJCTIKKyNkZWZpbmUgR1BJT19JUlFfTkVDCQkzCisjZGVmaW5lIEdQSU9fSVJRX0VUSEEJCTQKKyNkZWZpbmUgR1BJT19JUlFfRVRIQgkJNQogI2RlZmluZSBHUElPX0hTUzBfRENEX04JCTYKICNkZWZpbmUgR1BJT19IU1MxX0RDRF9OCQk3CisjZGVmaW5lIEdQSU9fVUFSVDBfRENECQk4CisjZGVmaW5lIEdQSU9fVUFSVDFfRENECQk5CiAjZGVmaW5lIEdQSU9fSFNTMF9DVFNfTgkJMTAKICNkZWZpbmUgR1BJT19IU1MxX0NUU19OCQkxMQorI2RlZmluZSBHUElPX0lSUV9NUENJCQkxMgogI2RlZmluZSBHUElPX0hTUzFfUlRTX04JCTEzCiAjZGVmaW5lIEdQSU9fSFNTMF9SVFNfTgkJMTQKKy8qIEdQSU8xNSBpcyBub3QgY29ubmVjdGVkICovCiAKIC8qIENvbnRyb2wgb3V0cHV0cyBmcm9tIDc0SEM0MDk0ICovCiAjZGVmaW5lIENPTlRST0xfSFNTMF9DTEtfSU5UCTAKQEAgLTE1Miw3ICsxNTEsNyBAQAogCiBzdGF0aWMgaXJxcmV0dXJuX3QgaHNzX2RjZF9pcnEoaW50IGlycSwgdm9pZCAqcGRldikKIHsKLQlpbnQgaSwgcG9ydCA9IChpcnEgPT0gZ3Bpb19pcnEoR1BJT19IU1MxX0RDRF9OKSk7CisJaW50IGksIHBvcnQgPSAoaXJxID09IElYUDRYWF9HUElPX0lSUShHUElPX0hTUzFfRENEX04pKTsKIAlncGlvX2xpbmVfZ2V0KHBvcnQgPyBHUElPX0hTUzFfRENEX04gOiBHUElPX0hTUzBfRENEX04sICZpKTsKIAlzZXRfY2Fycmllcl9jYl90YWJbcG9ydF0ocGRldiwgIWkpOwogCXJldHVybiBJUlFfSEFORExFRDsKQEAgLTE2NSw5ICsxNjQsOSBAQAogCWludCBpLCBpcnE7CiAKIAlpZiAoIXBvcnQpCi0JCWlycSA9IGdwaW9faXJxKEdQSU9fSFNTMF9EQ0RfTik7CisJCWlycSA9IElYUDRYWF9HUElPX0lSUShHUElPX0hTUzBfRENEX04pOwogCWVsc2UKLQkJaXJxID0gZ3Bpb19pcnEoR1BJT19IU1MxX0RDRF9OKTsKKwkJaXJxID0gSVhQNFhYX0dQSU9fSVJRKEdQSU9fSFNTMV9EQ0RfTik7CiAKIAlncGlvX2xpbmVfZ2V0KHBvcnQgPyBHUElPX0hTUzFfRENEX04gOiBHUElPX0hTUzBfRENEX04sICZpKTsKIAlzZXRfY2Fycmllcl9jYihwZGV2LCAhaSk7CkBAIC0xODgsOCArMTg3LDggQEAKIAogc3RhdGljIHZvaWQgaHNzX2Nsb3NlKGludCBwb3J0LCB2b2lkICpwZGV2KQogewotCWZyZWVfaXJxKHBvcnQgPyBncGlvX2lycShHUElPX0hTUzFfRENEX04pIDogZ3Bpb19pcnEoR1BJT19IU1MwX0RDRF9OKSwKLQkJIHBkZXYpOworCWZyZWVfaXJxKHBvcnQgPyBJWFA0WFhfR1BJT19JUlEoR1BJT19IU1MxX0RDRF9OKSA6CisJCSBJWFA0WFhfR1BJT19JUlEoR1BJT19IU1MwX0RDRF9OKSwgcGRldik7CiAJc2V0X2NhcnJpZXJfY2JfdGFiWyEhcG9ydF0gPSBOVUxMOyAvKiBjYXRjaCBidWdzICovCiAKIAlzZXRfY29udHJvbChwb3J0ID8gQ09OVFJPTF9IU1MxX0RUUl9OIDogQ09OVFJPTF9IU1MwX0RUUl9OLCAxKTsKQEAgLTQyMSw4ICs0MjAsOCBAQAogCWdwaW9fbGluZV9jb25maWcoR1BJT19IU1MxX1JUU19OLCBJWFA0WFhfR1BJT19PVVQpOwogCWdwaW9fbGluZV9jb25maWcoR1BJT19IU1MwX0RDRF9OLCBJWFA0WFhfR1BJT19JTik7CiAJZ3Bpb19saW5lX2NvbmZpZyhHUElPX0hTUzFfRENEX04sIElYUDRYWF9HUElPX0lOKTsKLQlzZXRfaXJxX3R5cGUoZ3Bpb19pcnEoR1BJT19IU1MwX0RDRF9OKSwgSVJRX1RZUEVfRURHRV9CT1RIKTsKLQlzZXRfaXJxX3R5cGUoZ3Bpb19pcnEoR1BJT19IU1MxX0RDRF9OKSwgSVJRX1RZUEVfRURHRV9CT1RIKTsKKwlzZXRfaXJxX3R5cGUoSVhQNFhYX0dQSU9fSVJRKEdQSU9fSFNTMF9EQ0RfTiksIElSUV9UWVBFX0VER0VfQk9USCk7CisJc2V0X2lycV90eXBlKElYUDRYWF9HUElPX0lSUShHUElPX0hTUzFfRENEX04pLCBJUlFfVFlQRV9FREdFX0JPVEgpOwogCiAJc2V0X2NvbnRyb2woQ09OVFJPTF9IU1MwX0RUUl9OLCAxKTsKIAlzZXRfY29udHJvbChDT05UUk9MX0hTUzFfRFRSX04sIDEpOwpAQCAtNDQyLDEwICs0NDEsMTAgQEAKICNpZmRlZiBDT05GSUdfUENJCiBzdGF0aWMgdm9pZCBfX2luaXQgZ21scl9wY2lfcHJlaW5pdCh2b2lkKQogewotCXNldF9pcnFfdHlwZShJUlFfRVRIQSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKLQlzZXRfaXJxX3R5cGUoSVJRX0VUSEIsIElSUV9UWVBFX0xFVkVMX0xPVyk7Ci0Jc2V0X2lycV90eXBlKElSUV9ORUMsIElSUV9UWVBFX0xFVkVMX0xPVyk7Ci0Jc2V0X2lycV90eXBlKElSUV9NUENJLCBJUlFfVFlQRV9MRVZFTF9MT1cpOworCXNldF9pcnFfdHlwZShJWFA0WFhfR1BJT19JUlEoR1BJT19JUlFfRVRIQSksIElSUV9UWVBFX0xFVkVMX0xPVyk7CisJc2V0X2lycV90eXBlKElYUDRYWF9HUElPX0lSUShHUElPX0lSUV9FVEhCKSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKKwlzZXRfaXJxX3R5cGUoSVhQNFhYX0dQSU9fSVJRKEdQSU9fSVJRX05FQyksIElSUV9UWVBFX0xFVkVMX0xPVyk7CisJc2V0X2lycV90eXBlKElYUDRYWF9HUElPX0lSUShHUElPX0lSUV9NUENJKSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKIAlpeHA0eHhfcGNpX3ByZWluaXQoKTsKIH0KIApAQCAtNDY2LDEwICs0NjUsMTAgQEAKIHN0YXRpYyBpbnQgX19pbml0IGdtbHJfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3dpdGNoKHNsb3QpIHsKLQljYXNlIFNMT1RfRVRIQToJcmV0dXJuIElSUV9FVEhBOwotCWNhc2UgU0xPVF9FVEhCOglyZXR1cm4gSVJRX0VUSEI7Ci0JY2FzZSBTTE9UX05FQzoJcmV0dXJuIElSUV9ORUM7Ci0JZGVmYXVsdDoJcmV0dXJuIElSUV9NUENJOworCWNhc2UgU0xPVF9FVEhBOglyZXR1cm4gSVhQNFhYX0dQSU9fSVJRKEdQSU9fSVJRX0VUSEEpOworCWNhc2UgU0xPVF9FVEhCOglyZXR1cm4gSVhQNFhYX0dQSU9fSVJRKEdQSU9fSVJRX0VUSEIpOworCWNhc2UgU0xPVF9ORUM6CXJldHVybiBJWFA0WFhfR1BJT19JUlEoR1BJT19JUlFfTkVDKTsKKwlkZWZhdWx0OglyZXR1cm4gSVhQNFhYX0dQSU9fSVJRKEdQSU9fSVJRX01QQ0kpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ3R3eDU3MTUtcGNpLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9ndHd4NTcxNS1wY2kuYwppbmRleCA3YjhhMmMzLi4yNWQyYzMzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9ndHd4NTcxNS1wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9ndHd4NTcxNS1wY2kuYwpAQCAtMjYsMTQgKzI2LDE2IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL2d0d3g1NzE1Lmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CiAKKyNkZWZpbmUgU0xPVDBfREVWSUQJMAorI2RlZmluZSBTTE9UMV9ERVZJRAkxCisjZGVmaW5lIElOVEEJCTEwIC8qIHNsb3QgMSBoYXMgSU5UQSBhbmQgSU5UQiBjcm9zc2VkICovCisjZGVmaW5lIElOVEIJCTExCisKIC8qCi0gKiBUaGUgZXhhY3QgR1BJTyBwaW5zIGFuZCBJUlFzIGFyZSBkZWZpbmVkIGluIGFyY2gtaXhwNHh4L2d0d3g1NzE1LmgKICAqIFNsb3QgMCBpc24ndCBhY3R1YWxseSBwb3B1bGF0ZWQgd2l0aCBhIGNhcmQgY29ubmVjdG9yIGJ1dAogICogd2UgaW5pdGlhbGl6ZSBpdCBhbnl3YXkgaW4gY2FzZSBhIGZ1dHVyZSB2ZXJzaW9uIGhhcyB0aGUKICAqIHNsb3QgcG9wdWxhdGVkIG9yIHNvbWVvbmUgd2l0aCBnb29kIHNvbGRlcmluZyBza2lsbHMgaGFzCkBAIC00MSwzMiArNDMsMjYgQEAKICAqLwogdm9pZCBfX2luaXQgZ3R3eDU3MTVfcGNpX3ByZWluaXQodm9pZCkKIHsKLQlzZXRfaXJxX3R5cGUoR1RXWDU3MTVfUENJX1NMT1QwX0lOVEFfSVJRLCBJUlFfVFlQRV9MRVZFTF9MT1cpOwotCXNldF9pcnFfdHlwZShHVFdYNTcxNV9QQ0lfU0xPVDBfSU5UQl9JUlEsIElSUV9UWVBFX0xFVkVMX0xPVyk7Ci0Jc2V0X2lycV90eXBlKEdUV1g1NzE1X1BDSV9TTE9UMV9JTlRBX0lSUSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKLQlzZXRfaXJxX3R5cGUoR1RXWDU3MTVfUENJX1NMT1QxX0lOVEJfSVJRLCBJUlFfVFlQRV9MRVZFTF9MT1cpOwotCisJc2V0X2lycV90eXBlKElYUDRYWF9HUElPX0lSUShJTlRBKSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKKwlzZXRfaXJxX3R5cGUoSVhQNFhYX0dQSU9fSVJRKElOVEIpLCBJUlFfVFlQRV9MRVZFTF9MT1cpOwogCWl4cDR4eF9wY2lfcHJlaW5pdCgpOwogfQogCiAKIHN0YXRpYyBpbnQgX19pbml0IGd0d3g1NzE1X21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewotCWludCByYzsKLQlzdGF0aWMgaW50IGd0d3g1NzE1X2lycW1hcAotCQkJW0dUV1g1NzE1X1BDSV9TTE9UX0NPVU5UXQotCQkJW0dUV1g1NzE1X1BDSV9JTlRfUElOX0NPVU5UXSA9IHsKLQl7R1RXWDU3MTVfUENJX1NMT1QwX0lOVEFfSVJRLCBHVFdYNTcxNV9QQ0lfU0xPVDBfSU5UQl9JUlF9LAotCXtHVFdYNTcxNV9QQ0lfU0xPVDFfSU5UQV9JUlEsIEdUV1g1NzE1X1BDSV9TTE9UMV9JTlRCX0lSUX0sCi19OworCWludCByYyA9IC0xOwogCi0JaWYgKHNsb3QgPj0gR1RXWDU3MTVfUENJX1NMT1RfQ09VTlQgfHwKLQkJCXBpbiA+PSBHVFdYNTcxNV9QQ0lfSU5UX1BJTl9DT1VOVCkgcmMgPSAtMTsKLQllbHNlCi0JCXJjID0gZ3R3eDU3MTVfaXJxbWFwW3Nsb3RdW3Bpbi0xXTsKKwlpZiAoKHNsb3QgPT0gU0xPVDBfREVWSUQgJiYgcGluID09IDEpIHx8CisJICAgIChzbG90ID09IFNMT1QxX0RFVklEICYmIHBpbiA9PSAyKSkKKwkJcmMgPSBJWFA0WFhfR1BJT19JUlEoSU5UQSk7CisJZWxzZSBpZiAoKHNsb3QgPT0gU0xPVDBfREVWSUQgJiYgcGluID09IDIpIHx8CisJCSAoc2xvdCA9PSBTTE9UMV9ERVZJRCAmJiBwaW4gPT0gMSkpCisJCXJjID0gSVhQNFhYX0dQSU9fSVJRKElOVEIpOwogCi0JcHJpbnRrKCIlczogTWFwcGVkIHNsb3QgJWQgcGluICVkIHRvIElSUSAlZFxuIiwgX19mdW5jX18sIHNsb3QsIHBpbiwgcmMpOwotCXJldHVybihyYyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1hcHBlZCBzbG90ICVkIHBpbiAlZCB0byBJUlEgJWRcbiIsCisJICAgICAgIF9fZnVuY19fLCBzbG90LCBwaW4sIHJjKTsKKwlyZXR1cm4gcmM7CiB9CiAKIHN0cnVjdCBod19wY2kgZ3R3eDU3MTVfcGNpIF9faW5pdGRhdGEgPSB7CkBAIC04MSw5ICs3Nyw3IEBACiBpbnQgX19pbml0IGd0d3g1NzE1X3BjaV9pbml0KHZvaWQpCiB7CiAJaWYgKG1hY2hpbmVfaXNfZ3R3eDU3MTUoKSkKLQl7CiAJCXBjaV9jb21tb25faW5pdCgmZ3R3eDU3MTVfcGNpKTsKLQl9CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2d0d3g1NzE1LXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9ndHd4NTcxNS1zZXR1cC5jCmluZGV4IDI1YzIxZDYuLjBiYzcxODUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2d0d3g1NzE1LXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ3R3eDU3MTUtc2V0dXAuYwpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotCiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL21lbW9yeS5oPgpAQCAtMzcsNyArMzYsMzQgQEAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgotI2luY2x1ZGUgPG1hY2gvZ3R3eDU3MTUuaD4KKworLyogR1BJTyA1LDYsNyBhbmQgMTIgYXJlIGhhcmQgd2lyZWQgdG8gdGhlIEtlbmRpbiBLUzg5OTVNIFN3aXRjaAorICAgYW5kIG9wZXJhdGUgYXMgYW4gU1BJIHR5cGUgaW50ZXJmYWNlLiAgVGhlIGRldGFpbHMgb2YgdGhlIGludGVyZmFjZQorICAgYXJlIGF2YWlsYWJsZSBvbiBLZW5kaW4vTWljcmVsJ3Mgd2ViIHNpdGUuICovCisKKyNkZWZpbmUgR1RXWDU3MTVfS1NTUElfU0VMRUNUCTUKKyNkZWZpbmUgR1RXWDU3MTVfS1NTUElfVFhECTYKKyNkZWZpbmUgR1RXWDU3MTVfS1NTUElfQ0xPQ0sJNworI2RlZmluZSBHVFdYNTcxNV9LU1NQSV9SWEQJMTIKKworLyogVGhlICJyZXNldCIgYnV0dG9uIGlzIHdpcmVkIHRvIEdQSU8gMy4KKyAgIFRoZSBHUElPIGlzIGJyb3VnaHQgImxvdyIgd2hlbiB0aGUgYnV0dG9uIGlzIHB1c2hlZC4gKi8KKworI2RlZmluZSBHVFdYNTcxNV9CVVRUT05fR1BJTwkzCisKKy8qIEJvYXJkIExhYmVsICAgICAgRnJvbnQgTGFiZWwKKyAgIExFRDEgICAgICAgICAgICAgUG93ZXIKKyAgIExFRDIgICAgICAgICAgICAgV2lyZWxlc3MtRworICAgTEVEMyAgICAgICAgICAgICBub3QgcG9wdWxhdGVkIGJ1dCBjb3VsZCBiZQorICAgTEVENCAgICAgICAgICAgICBJbnRlcm5ldAorICAgTEVENSAtIExFRDggICAgICBDb250cm9sbGVkIGJ5IEtTODk5NU0gU3dpdGNoCisgICBMRUQ5ICAgICAgICAgICAgIERNWiAqLworCisjZGVmaW5lIEdUV1g1NzE1X0xFRDFfR1BJTwkyCisjZGVmaW5lIEdUV1g1NzE1X0xFRDJfR1BJTwk5CisjZGVmaW5lIEdUV1g1NzE1X0xFRDNfR1BJTwk4CisjZGVmaW5lIEdUV1g1NzE1X0xFRDRfR1BJTwkxCisjZGVmaW5lIEdUV1g1NzE1X0xFRDlfR1BJTwk0CiAKIC8qCiAgKiBYc2NhbGUgVUFSVCByZWdpc3RlcnMgYXJlIDMyIGJpdHMgd2lkZSB3aXRoIG9ubHkgdGhlIGxlYXN0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvYXZpbGEuaCBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9hdmlsYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjQwY2I2Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9hdmlsYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9hdmlsYS5oCi0gKgotICogR2F0ZXdvcmtzIEF2aWxhIHBsYXRmb3JtIHNwZWNpZmljIGRlZmluaXRpb25zCi0gKgotICogQXV0aG9yOiBNaWNoYWVsLUx1a2UgSm9uZXMgPG1sajI4QGNhbS5hYy51az4KLSAqCi0gKiBCYXNlZCBvbiBpeGRwNDI1LmgKLSAqIEF1dGhvcjogRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBwbGV4aXR5Lm5ldD4KLSAqCi0gKiBDb3B5cmlnaHQgMjAwNCAoYykgTW9udGFWaXN0YSwgU29mdHdhcmUsIEluYy4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKLSAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfSEFSRFdBUkVfSF9fCi0jZXJyb3IgIkRvIG5vdCBpbmNsdWRlIHRoaXMgZGlyZWN0bHksIGluc3RlYWQgI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4iCi0jZW5kaWYKLQotI2RlZmluZQlBVklMQV9TREFfUElOCQk3Ci0jZGVmaW5lCUFWSUxBX1NDTF9QSU4JCTYKLQotLyoKLSAqIEFWSUxBIFBDSSBJUlFzCi0gKi8KLSNkZWZpbmUgQVZJTEFfUENJX01BWF9ERVYJNAotI2RlZmluZSBMT0ZUX1BDSV9NQVhfREVWICAgIDYKLSNkZWZpbmUgQVZJTEFfUENJX0lSUV9MSU5FUwk0Ci0KLQotLyogUENJIGNvbnRyb2xsZXIgR1BJTyB0byBJUlEgcGluIG1hcHBpbmdzICovCi0jZGVmaW5lIEFWSUxBX1BDSV9JTlRBX1BJTgkxMQotI2RlZmluZSBBVklMQV9QQ0lfSU5UQl9QSU4JMTAKLSNkZWZpbmUgQVZJTEFfUENJX0lOVENfUElOCTkKLSNkZWZpbmUgQVZJTEFfUENJX0lOVERfUElOCTgKLQotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvY295b3RlLmggYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvY295b3RlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxN2FjNmQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL2NveW90ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9jb3lvdGUuaAotICoKLSAqIEFESSBFbmdpbmVlcmluZyBwbGF0Zm9ybSBzcGVjaWZpYyBkZWZpbml0aW9ucwotICoKLSAqIEF1dGhvcjogRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBwbGV4aXR5Lm5ldD4KLSAqCi0gKiBDb3B5cmlnaHQgMjAwNCAoYykgTW9udGFWaXN0YSwgU29mdHdhcmUsIEluYy4gCi0gKiAKLSAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgCi0gKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgCi0gKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX0hBUkRXQVJFX0hfXwotI2Vycm9yICJEbyBub3QgaW5jbHVkZSB0aGlzIGRpcmVjdGx5LCBpbnN0ZWFkICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+IgotI2VuZGlmCi0KLS8qIFBDSSBjb250cm9sbGVyIEdQSU8gdG8gSVJRIHBpbiBtYXBwaW5ncyAqLwotI2RlZmluZQlDT1lPVEVfUENJX1NMT1QwX1BJTgk2Ci0jZGVmaW5lCUNPWU9URV9QQ0lfU0xPVDFfUElOCTExCi0KLSNkZWZpbmUJQ09ZT1RFX1BDSV9TTE9UMF9ERVZJRAkxNAotI2RlZmluZQlDT1lPVEVfUENJX1NMT1QxX0RFVklECTE1Ci0KLSNkZWZpbmUJQ09ZT1RFX0lERV9CQVNFX1BIWVMJSVhQNFhYX0VYUF9CVVNfQkFTRSgzKQotI2RlZmluZQlDT1lPVEVfSURFX0JBU0VfVklSVAkweEZGRkUxMDAwCi0jZGVmaW5lCUNPWU9URV9JREVfUkVHSU9OX1NJWkUJMHgxMDAwCi0KLSNkZWZpbmUJQ09ZT1RFX0lERV9EQVRBX1BPUlQJMHhGRkZFMTBFMAotI2RlZmluZQlDT1lPVEVfSURFX0NUUkxfUE9SVAkweEZGRkUxMEZDCi0jZGVmaW5lCUNPWU9URV9JREVfRVJST1JfUE9SVAkweEZGRkUxMEUyCi0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9kc21nNjAwLmggYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvZHNtZzYwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzA4N2EzLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9kc21nNjAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogRFNNLUc2MDAgcGxhdGZvcm0gc3BlY2lmaWMgZGVmaW5pdGlvbnMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVG93ZXIgVGVjaG5vbG9naWVzCi0gKiBBdXRob3I6IEFsZXNzYW5kcm8gWnVtbW8gPGEuenVtbW9AdG93ZXJ0ZWNoLml0PgotICoKLSAqIGJhc2VkIG9uIGl4ZHA0MjUuaDoKLSAqCUNvcHlyaWdodCAyMDA0IChDKSBNb250YVZpc3RhLCBTb2Z0d2FyZSwgSW5jLgotICoKLSAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQotICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9IQVJEV0FSRV9IX18KLSNlcnJvciAiRG8gbm90IGluY2x1ZGUgdGhpcyBkaXJlY3RseSwgaW5zdGVhZCAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPiIKLSNlbmRpZgotCi0jZGVmaW5lIERTTUc2MDBfU0RBX1BJTgkJNQotI2RlZmluZSBEU01HNjAwX1NDTF9QSU4JCTQKLQotLyoKLSAqIERTTUc2MDAgUENJIElSUXMKLSAqLwotI2RlZmluZSBEU01HNjAwX1BDSV9NQVhfREVWCTQKLSNkZWZpbmUgRFNNRzYwMF9QQ0lfSVJRX0xJTkVTCTMKLQotCi0vKiBQQ0kgY29udHJvbGxlciBHUElPIHRvIElSUSBwaW4gbWFwcGluZ3MgKi8KLSNkZWZpbmUgRFNNRzYwMF9QQ0lfSU5UQV9QSU4JMTEKLSNkZWZpbmUgRFNNRzYwMF9QQ0lfSU5UQl9QSU4JMTAKLSNkZWZpbmUgRFNNRzYwMF9QQ0lfSU5UQ19QSU4JOQotI2RlZmluZSBEU01HNjAwX1BDSV9JTlREX1BJTgk4Ci0jZGVmaW5lIERTTUc2MDBfUENJX0lOVEVfUElOCTcKLSNkZWZpbmUgRFNNRzYwMF9QQ0lfSU5URl9QSU4JNgotCi0vKiBEU00tRzYwMCBUaW1lciBTZXR0aW5nICovCi0jZGVmaW5lIERTTUc2MDBfRlJFUSA2NjAwMDAwMAotCi0vKiBCdXR0b25zICovCi0KLSNkZWZpbmUgRFNNRzYwMF9QQl9HUElPCQkxNQkvKiBwb3dlciBidXR0b24gKi8KLSNkZWZpbmUgRFNNRzYwMF9SQl9HUElPCQkzCS8qIHJlc2V0IGJ1dHRvbiAqLwotCi0vKiBQb3dlciBjb250cm9sICovCi0KLSNkZWZpbmUgRFNNRzYwMF9QT19HUElPCQkyCS8qIHBvd2VyIG9mZiAqLwotCi0vKiBMRURzICovCi0KLSNkZWZpbmUgRFNNRzYwMF9MRURfUFdSX0dQSU8JMAotI2RlZmluZSBEU01HNjAwX0xFRF9XTEFOX0dQSU8JMTQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9mc2cuaCBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9mc2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYwMmI3ZS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvZnNnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL2ZzZy5oCi0gKgotICogRnJlZWNvbSBGU0ctMyBwbGF0Zm9ybSBzcGVjaWZpYyBkZWZpbml0aW9ucwotICoKLSAqIEF1dGhvcjogUm9kIFdoaXRieSA8cm9kQHdoaXRieS5pZC5hdT4KLSAqIEF1dGhvcjogVG9tYXN6IENobWllbGV3c2tpIDxtYW5nb29Ad3BrZy5vcmc+Ci0gKiBNYWludGFpbmVyczogaHR0cDovL3d3dy5uc2x1Mi1saW51eC5vcmcKLSAqCi0gKiBCYXNlZCBvbiBjb3lvdGUuaCBieQotICogQ29weXJpZ2h0IDIwMDQgKGMpIE1vbnRhVmlzdGEsIFNvZnR3YXJlLCBJbmMuCi0gKgotICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55Ci0gKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX0hBUkRXQVJFX0hfXwotI2Vycm9yICJEbyBub3QgaW5jbHVkZSB0aGlzIGRpcmVjdGx5LCBpbnN0ZWFkICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+IgotI2VuZGlmCi0KLSNkZWZpbmUgRlNHX1NEQV9QSU4JCTEyCi0jZGVmaW5lIEZTR19TQ0xfUElOCQkxMwotCi0vKgotICogRlNHIFBDSSBJUlFzCi0gKi8KLSNkZWZpbmUgRlNHX1BDSV9NQVhfREVWCQkzCi0jZGVmaW5lIEZTR19QQ0lfSVJRX0xJTkVTCTMKLQotCi0vKiBQQ0kgY29udHJvbGxlciBHUElPIHRvIElSUSBwaW4gbWFwcGluZ3MgKi8KLSNkZWZpbmUgRlNHX1BDSV9JTlRBX1BJTgk2Ci0jZGVmaW5lIEZTR19QQ0lfSU5UQl9QSU4JNwotI2RlZmluZSBGU0dfUENJX0lOVENfUElOCTUKLQotLyogQnV0dG9ucyAqLwotCi0jZGVmaW5lIEZTR19TQl9HUElPCQk0CS8qIHN5bmMgYnV0dG9uICovCi0jZGVmaW5lIEZTR19SQl9HUElPCQk5CS8qIHJlc2V0IGJ1dHRvbiAqLwotI2RlZmluZSBGU0dfVUJfR1BJTwkJMTAJLyogdXNiIGJ1dHRvbiAqLwotCi0vKiBMRURzICovCi0KLSNkZWZpbmUgRlNHX0xFRF9XTEFOX0JJVAkwCi0jZGVmaW5lIEZTR19MRURfV0FOX0JJVAkJMQotI2RlZmluZSBGU0dfTEVEX1NBVEFfQklUCTIKLSNkZWZpbmUgRlNHX0xFRF9VU0JfQklUCQk0Ci0jZGVmaW5lIEZTR19MRURfUklOR19CSVQJNQotI2RlZmluZSBGU0dfTEVEX1NZTkNfQklUCTcKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IGNkNWFlYzIuLmE1Zjg3ZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtNzAsNyArNzAsNyBAQAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4JCQkvKiBjYW5zbGVlcCB3cmFwcGVycyAqLwogCiBleHRlcm4gaW50IGdwaW9fdG9faXJxKGludCBncGlvKTsKLWV4dGVybiBpbnQgaXJxX3RvX2dwaW8oaW50IGdwaW8pOworZXh0ZXJuIGludCBpcnFfdG9fZ3Bpbyh1bnNpZ25lZCBpbnQgaXJxKTsKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9ndHd4NTcxNS5oIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL2d0d3g1NzE1LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNWUyMDEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL2d0d3g1NzE1LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9ndHd4NTcxNS5oCi0gKgotICogR2VtdGVrIEdUV1g1NzE1IEdhdGV3YXkgKExpbmtzeXMgV1JWNTRHKQotICoKLSAqIENvcHlyaWdodCAyMDA0IChjKSBHZW9yZ2UgVC4gSm9zZXBoCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi0gKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX0hBUkRXQVJFX0hfXwotI2Vycm9yICJEbyBub3QgaW5jbHVkZSB0aGlzIGRpcmVjdGx5LCBpbnN0ZWFkICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+IgotI2VuZGlmCi0jaW5jbHVkZSAiaXJxcy5oIgotCi0jZGVmaW5lIEdUV1g1NzE1X0dQSU8wCTAKLSNkZWZpbmUgR1RXWDU3MTVfR1BJTzEJMQotI2RlZmluZSBHVFdYNTcxNV9HUElPMgkyCi0jZGVmaW5lIEdUV1g1NzE1X0dQSU8zCTMKLSNkZWZpbmUgR1RXWDU3MTVfR1BJTzQJNAotI2RlZmluZSBHVFdYNTcxNV9HUElPNQk1Ci0jZGVmaW5lIEdUV1g1NzE1X0dQSU82CTYKLSNkZWZpbmUgR1RXWDU3MTVfR1BJTzcJNwotI2RlZmluZSBHVFdYNTcxNV9HUElPOAk4Ci0jZGVmaW5lIEdUV1g1NzE1X0dQSU85CTkKLSNkZWZpbmUgR1RXWDU3MTVfR1BJTzEwCTEwCi0jZGVmaW5lIEdUV1g1NzE1X0dQSU8xMQkxMQotI2RlZmluZSBHVFdYNTcxNV9HUElPMTIJMTIKLSNkZWZpbmUgR1RXWDU3MTVfR1BJTzEzCTEzCi0jZGVmaW5lIEdUV1g1NzE1X0dQSU8xNAkxNAotCi0jZGVmaW5lIEdUV1g1NzE1X0dQSU8wX0lSUQkJCUlSUV9JWFA0WFhfR1BJTzAKLSNkZWZpbmUgR1RXWDU3MTVfR1BJTzFfSVJRCQkJSVJRX0lYUDRYWF9HUElPMQotI2RlZmluZSBHVFdYNTcxNV9HUElPMl9JUlEJCQlJUlFfSVhQNFhYX0dQSU8yCi0jZGVmaW5lIEdUV1g1NzE1X0dQSU8zX0lSUQkJCUlSUV9JWFA0WFhfR1BJTzMKLSNkZWZpbmUgR1RXWDU3MTVfR1BJTzRfSVJRCQkJSVJRX0lYUDRYWF9HUElPNAotI2RlZmluZSBHVFdYNTcxNV9HUElPNV9JUlEJCQlJUlFfSVhQNFhYX0dQSU81Ci0jZGVmaW5lIEdUV1g1NzE1X0dQSU82X0lSUQkJCUlSUV9JWFA0WFhfR1BJTzYKLSNkZWZpbmUgR1RXWDU3MTVfR1BJTzdfSVJRCQkJSVJRX0lYUDRYWF9HUElPNwotI2RlZmluZSBHVFdYNTcxNV9HUElPOF9JUlEJCQlJUlFfSVhQNFhYX0dQSU84Ci0jZGVmaW5lIEdUV1g1NzE1X0dQSU85X0lSUQkJCUlSUV9JWFA0WFhfR1BJTzkKLSNkZWZpbmUgR1RXWDU3MTVfR1BJTzEwX0lSUQkJSVJRX0lYUDRYWF9HUElPMTAKLSNkZWZpbmUgR1RXWDU3MTVfR1BJTzExX0lSUQkJSVJRX0lYUDRYWF9HUElPMTEKLSNkZWZpbmUgR1RXWDU3MTVfR1BJTzEyX0lSUQkJSVJRX0lYUDRYWF9HUElPMTIKLSNkZWZpbmUgR1RXWDU3MTVfR1BJTzEzX0lSUQkJSVJRX0lYUDRYWF9TV19JTlQxCi0jZGVmaW5lIEdUV1g1NzE1X0dQSU8xNF9JUlEJCUlSUV9JWFA0WFhfU1dfSU5UMgotCi0vKiBQQ0kgY29udHJvbGxlciBHUElPIHRvIElSUSBwaW4gbWFwcGluZ3MKLQotCQkJSU5UQQlJTlRCCi1TTE9UIDAJMTAJCTExCi1TTE9UIDEJMTEJCTEwCi0KLSovCi0KLSNkZWZpbmUJR1RXWDU3MTVfUENJX1NMT1QwX0RFVklECTAKLSNkZWZpbmUJR1RXWDU3MTVfUENJX1NMT1QwX0lOVEFfR1BJTwlHVFdYNTcxNV9HUElPMTAKLSNkZWZpbmUJR1RXWDU3MTVfUENJX1NMT1QwX0lOVEJfR1BJTwlHVFdYNTcxNV9HUElPMTEKLSNkZWZpbmUJR1RXWDU3MTVfUENJX1NMT1QwX0lOVEFfSVJRCUdUV1g1NzE1X0dQSU8xMF9JUlEKLSNkZWZpbmUJR1RXWDU3MTVfUENJX1NMT1QwX0lOVEJfSVJRCUdUV1g1NzE1X0dQSU8xMV9JUlEKLQotI2RlZmluZQlHVFdYNTcxNV9QQ0lfU0xPVDFfREVWSUQJMQotI2RlZmluZQlHVFdYNTcxNV9QQ0lfU0xPVDFfSU5UQV9HUElPCUdUV1g1NzE1X0dQSU8xMQotI2RlZmluZQlHVFdYNTcxNV9QQ0lfU0xPVDFfSU5UQl9HUElPCUdUV1g1NzE1X0dQSU8xMAotI2RlZmluZQlHVFdYNTcxNV9QQ0lfU0xPVDFfSU5UQV9JUlEJR1RXWDU3MTVfR1BJTzExX0lSUQotI2RlZmluZQlHVFdYNTcxNV9QQ0lfU0xPVDFfSU5UQl9JUlEJR1RXWDU3MTVfR1BJTzEwX0lSUQotCi0jZGVmaW5lIEdUV1g1NzE1X1BDSV9TTE9UX0NPVU5UCQkJMgotI2RlZmluZSBHVFdYNTcxNV9QQ0lfSU5UX1BJTl9DT1VOVAkJMgotCi0vKgotICogR1BJTyA1LDYsNyBhbmQxMiBhcmUgaGFyZCB3aXJlZCB0byB0aGUgS2VuZGluIEtTODk5NU0gU3dpdGNoCi0gKiBhbmQgb3BlcmF0ZSBhcyBhbiBTUEkgdHlwZSBpbnRlcmZhY2UuICBUaGUgZGV0YWlscyBvZiB0aGUgaW50ZXJmYWNlCi0gKiBhcmUgYXZhaWxhYmxlIG9uIEtlbmRpbi9NaWNyZWwncyB3ZWIgc2l0ZS4KLSAqLwotCi0jZGVmaW5lIEdUV1g1NzE1X0tTU1BJX1NFTEVDVAlHVFdYNTcxNV9HUElPNQotI2RlZmluZSBHVFdYNTcxNV9LU1NQSV9UWEQJCUdUV1g1NzE1X0dQSU82Ci0jZGVmaW5lIEdUV1g1NzE1X0tTU1BJX0NMT0NLCUdUV1g1NzE1X0dQSU83Ci0jZGVmaW5lIEdUV1g1NzE1X0tTU1BJX1JYRAkJR1RXWDU3MTVfR1BJTzEyCi0KLS8qCi0gKiBUaGUgInJlc2V0IiBidXR0b24gaXMgd2lyZWQgdG8gR1BJTyAzLgotICogVGhlIEdQSU8gaXMgYnJvdWdodCAibG93IiB3aGVuIHRoZSBidXR0b24gaXMgcHVzaGVkLgotICovCi0KLSNkZWZpbmUgR1RXWDU3MTVfQlVUVE9OX0dQSU8JR1RXWDU3MTVfR1BJTzMKLSNkZWZpbmUgR1RXWDU3MTVfQlVUVE9OX0lSUQlHVFdYNTcxNV9HUElPM19JUlEKLQotLyoKLSAqICBCb2FyZCBMYWJlbCAgICAgIEZyb250IExhYmVsCi0gKiAgTEVEMSAgICAgICAgICAgICBQb3dlcgotICogIExFRDIgICAgICAgICAgICAgV2lyZWxlc3MtRwotICogIExFRDMgICAgICAgICAgICAgbm90IHBvcHVsYXRlZCBidXQgY291bGQgYmUKLSAqICBMRUQ0ICAgICAgICAgICAgIEludGVybmV0Ci0gKiAgTEVENSAtIExFRDggICAgICBDb250cm9sbGVkIGJ5IEtTODk5NU0gU3dpdGNoCi0gKiAgTEVEOSAgICAgICAgICAgICBETVoKLSAqLwotCi0jZGVmaW5lIEdUV1g1NzE1X0xFRDFfR1BJTwkJR1RXWDU3MTVfR1BJTzIKLSNkZWZpbmUgR1RXWDU3MTVfTEVEMl9HUElPCQlHVFdYNTcxNV9HUElPOQotI2RlZmluZSBHVFdYNTcxNV9MRUQzX0dQSU8JCUdUV1g1NzE1X0dQSU84Ci0jZGVmaW5lIEdUV1g1NzE1X0xFRDRfR1BJTwkJR1RXWDU3MTVfR1BJTzEKLSNkZWZpbmUgR1RXWDU3MTVfTEVEOV9HUElPCQlHVFdYNTcxNV9HUElPNApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmggYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAppbmRleCBmNThhNDNhLi5mOWQxYzQzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAorKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaApAQCAtMTgsNyArMTgsMTMgQEAKICNkZWZpbmUgX19BU01fQVJDSF9IQVJEV0FSRV9IX18KIAogI2RlZmluZSBQQ0lCSU9TX01JTl9JTwkJMHgwMDAwMTAwMAotI2RlZmluZSBQQ0lCSU9TX01JTl9NRU0JCShjcHVfaXNfaXhwNDN4KCkgPyAweDQwMDAwMDAwIDogMHg0ODAwMDAwMCkKKyNpZmRlZiBDT05GSUdfSVhQNFhYX0lORElSRUNUX1BDSQorI2RlZmluZSBQQ0lCSU9TX01JTl9NRU0JCTB4MTAwMDAwMDAgLyogMSBHQiBvZiBpbmRpcmVjdCBQQ0kgTU1JTyBzcGFjZSAqLworI2RlZmluZSBQQ0lCSU9TX01BWF9NRU0JCTB4NEZGRkZGRkYKKyNlbHNlCisjZGVmaW5lIFBDSUJJT1NfTUlOX01FTQkJMHg0ODAwMDAwMCAvKiA2NCBNQiBvZiBQQ0kgTU1JTyBzcGFjZSAqLworI2RlZmluZSBQQ0lCSU9TX01BWF9NRU0JCTB4NEJGRkZGRkYKKyNlbmRpZgogCiAvKgogICogV2Ugb3ZlcnJpZGUgdGhlIHN0YW5kYXJkIGRtYS1tYXNrIHJvdXRpbmVzIGZvciBib3VuY2luZy4KQEAgLTM3LDE0ICs0Myw0IEBACiAvKiBQbGF0Zm9ybSBoZWxwZXIgZnVuY3Rpb25zIGFuZCBkZWZpbml0aW9ucyAqLwogI2luY2x1ZGUgInBsYXRmb3JtLmgiCiAKLS8qIFBsYXRmb3JtIHNwZWNpZmljIGRldGFpbHMgKi8KLSNpbmNsdWRlICJpeGRwNDI1LmgiCi0jaW5jbHVkZSAiYXZpbGEuaCIKLSNpbmNsdWRlICJjb3lvdGUuaCIKLSNpbmNsdWRlICJwcnBtYzExMDAuaCIKLSNpbmNsdWRlICJuc2x1Mi5oIgotI2luY2x1ZGUgIm5hczEwMGQuaCIKLSNpbmNsdWRlICJkc21nNjAwLmgiCi0jaW5jbHVkZSAiZnNnLmgiCi0KICNlbmRpZiAgLyogX0FTTV9BUkNIX0hBUkRXQVJFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9pby5oIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL2lvLmgKaW5kZXggOGE5NDdkNC4uNmVhN2UyZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL2lvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL2lvLmgKQEAgLTI2LDIyICsyNiwyMCBAQAogLyoKICAqIElYUDR4eCBwcm92aWRlcyB0d28gbWV0aG9kcyBvZiBhY2Nlc3NpbmcgUENJIG1lbW9yeSBzcGFjZToKICAqCi0gKiAxKSBBIGRpcmVjdCBtYXBwZWQgd2luZG93IGZyb20gMHg0ODAwMDAwMCB0byAweDRiZmZmZmZmICg2NE1CKS4KKyAqIDEpIEEgZGlyZWN0IG1hcHBlZCB3aW5kb3cgZnJvbSAweDQ4MDAwMDAwIHRvIDB4NEJGRkZGRkYgKDY0TUIpLgogICogICAgVG8gYWNjZXNzIFBDSSB2aWEgdGhpcyBzcGFjZSwgd2Ugc2ltcGx5IGlvcmVtYXAoKSB0aGUgQkFSCiAgKiAgICBpbnRvIHRoZSBrZXJuZWwgYW5kIHdlIGNhbiB1c2UgdGhlIHN0YW5kYXJkIHJlYWRbYndsXS93cml0ZVtid2xdCiAgKiAgICBtYWNyb3MuIFRoaXMgaXMgdGhlIHByZWZmZXJlZCBtZXRob2QgZHVlIHRvIHNwZWVkIGJ1dCBpdAotICogICAgbGltaXRzIHRoZSBzeXN0ZW0gdG8ganVzdCA2NE1CIG9mIFBDSSBtZW1vcnkuIFRoaXMgY2FuIGJlIAotICogICAgcHJvYmxhbWF0aWMgaWYgdXNpbmcgdmlkZW8gY2FyZHMgYW5kIG90aGVyIG1lbW9yeS1oZWF2eQotICogICAgdGFyZ2V0cy4KKyAqICAgIGxpbWl0cyB0aGUgc3lzdGVtIHRvIGp1c3QgNjRNQiBvZiBQQ0kgbWVtb3J5LiBUaGlzIGNhbiBiZQorICogICAgcHJvYmxlbWF0aWMgaWYgdXNpbmcgdmlkZW8gY2FyZHMgYW5kIG90aGVyIG1lbW9yeS1oZWF2eSB0YXJnZXRzLgogICoKLSAqIDIpIElmID4gNjRNQiBvZiBtZW1vcnkgc3BhY2UgaXMgcmVxdWlyZWQsIHRoZSBJWFA0eHggY2FuIGJlIGNvbmZpZ3VyZWQKLSAqICAgIHRvIHVzZSBpbmRpcmVjdCByZWdpc3RlcnMgdG8gYWNjZXNzIFBDSSAoYXMgd2UgZG8gYmVsb3cgZm9yIEkvTwotICogICAgdHJhbnNhY3Rpb25zKS4gVGhpcyBhbGxvd3MgZm9yIHVwIHRvIDEyOE1CICgweDQ4MDAwMDAwIHRvIDB4NGZmZmZmZmYpCi0gKiAgICBvZiBtZW1vcnkgb24gdGhlIGJ1cy4gVGhlIGRpc2FkdmFudGFnZSBvZiB0aGlzIGlzIHRoYXQgZXZlcnkgCi0gKiAgICBQQ0kgYWNjZXNzIHJlcXVpcmVzIHRocmVlIGxvY2FsIHJlZ2lzdGVyIGFjY2Vzc2VzIHBsdXMgYSBzcGlubG9jaywKLSAqICAgIGJ1dCBpbiBzb21lIGNhc2VzIHRoZSBwZXJmb3JtYW5jZSBoaXQgaXMgYWNjZXB0YWJsZS4gSW4gYWRkaXRpb24sCi0gKiAgICB5b3UgY2Fubm90IG1tYXAoKSBQQ0kgZGV2aWNlcyBpbiB0aGlzIGNhc2UuCi0gKgorICogMikgSWYgPiA2NE1CIG9mIG1lbW9yeSBzcGFjZSBpcyByZXF1aXJlZCwgdGhlIElYUDR4eCBjYW4gdXNlIGluZGlyZWN0CisgKiAgICByZWdpc3RlcnMgdG8gYWNjZXNzIHRoZSB3aG9sZSA0IEdCIG9mIFBDSSBtZW1vcnkgc3BhY2UgKGFzIHdlIGRvIGJlbG93CisgKiAgICBmb3IgSS9PIHRyYW5zYWN0aW9ucykuIFRoaXMgYWxsb3dzIGN1cnJlbnRseSBmb3IgdXAgdG8gMSBHQiAoMHgxMDAwMDAwMAorICogICAgdG8gMHg0RkZGRkZGRikgb2YgbWVtb3J5IG9uIHRoZSBidXMuIFRoZSBkaXNhZHZhbnRhZ2Ugb2YgdGhpcyBpcyB0aGF0CisgKiAgICBldmVyeSBQQ0kgYWNjZXNzIHJlcXVpcmVzIHRocmVlIGxvY2FsIHJlZ2lzdGVyIGFjY2Vzc2VzIHBsdXMgYSBzcGlubG9jaywKKyAqICAgIGJ1dCBpbiBzb21lIGNhc2VzIHRoZSBwZXJmb3JtYW5jZSBoaXQgaXMgYWNjZXB0YWJsZS4gSW4gYWRkaXRpb24sIHlvdQorICogICAgY2Fubm90IG1tYXAoKSBQQ0kgZGV2aWNlcyBpbiB0aGlzIGNhc2UuCiAgKi8KICNpZm5kZWYJQ09ORklHX0lYUDRYWF9JTkRJUkVDVF9QQ0kKIApAQCAtNTUsNDggKzUzLDUyIEBACiAgKiBhY2Nlc3MgcmVnaXN0ZXJzLiBJZiBzb21ldGhpbmcgb3V0c2lkZSBvZiBQQ0kgaXMgaW9yZW1hcCdkLCB3ZQogICogZmFsbGJhY2sgdG8gdGhlIGRlZmF1bHQuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICoKLV9faXhwNHh4X2lvcmVtYXAodW5zaWduZWQgbG9uZyBhZGRyLCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IG10eXBlKQorCitzdGF0aWMgaW5saW5lIGludCBpc19wY2lfbWVtb3J5KHUzMiBhZGRyKQogewotCWlmKChhZGRyIDwgUENJQklPU19NSU5fTUVNKSB8fCAoYWRkciA+IDB4NGZmZmZmZmYpKQorCXJldHVybiAoYWRkciA+PSBQQ0lCSU9TX01JTl9NRU0pICYmIChhZGRyIDw9IDB4NEZGRkZGRkYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqIF9faW5kaXJlY3RfaW9yZW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHNpemVfdCBzaXplLAorCQkJCQkJdW5zaWduZWQgaW50IG10eXBlKQoreworCWlmICghaXNfcGNpX21lbW9yeShhZGRyKSkKIAkJcmV0dXJuIF9fYXJtX2lvcmVtYXAoYWRkciwgc2l6ZSwgbXR5cGUpOwogCiAJcmV0dXJuICh2b2lkIF9faW9tZW0gKilhZGRyOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9faXhwNHh4X2lvdW5tYXAodm9pZCBfX2lvbWVtICphZGRyKQorc3RhdGljIGlubGluZSB2b2lkIF9faW5kaXJlY3RfaW91bm1hcCh2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JaWYgKChfX2ZvcmNlIHUzMilhZGRyID49IFZNQUxMT0NfU1RBUlQpCisJaWYgKCFpc19wY2lfbWVtb3J5KChfX2ZvcmNlIHUzMilhZGRyKSkKIAkJX19pb3VubWFwKGFkZHIpOwogfQogCi0jZGVmaW5lIF9fYXJjaF9pb3JlbWFwKGEsIHMsIGYpCQlfX2l4cDR4eF9pb3JlbWFwKGEsIHMsIGYpCi0jZGVmaW5lCV9fYXJjaF9pb3VubWFwKGEpCQlfX2l4cDR4eF9pb3VubWFwKGEpCisjZGVmaW5lIF9fYXJjaF9pb3JlbWFwKGEsIHMsIGYpCQlfX2luZGlyZWN0X2lvcmVtYXAoYSwgcywgZikKKyNkZWZpbmUgX19hcmNoX2lvdW5tYXAoYSkJCV9faW5kaXJlY3RfaW91bm1hcChhKQogCi0jZGVmaW5lCXdyaXRlYih2LCBwKQkJCV9faXhwNHh4X3dyaXRlYih2LCBwKQotI2RlZmluZQl3cml0ZXcodiwgcCkJCQlfX2l4cDR4eF93cml0ZXcodiwgcCkKLSNkZWZpbmUJd3JpdGVsKHYsIHApCQkJX19peHA0eHhfd3JpdGVsKHYsIHApCisjZGVmaW5lIHdyaXRlYih2LCBwKQkJCV9faW5kaXJlY3Rfd3JpdGViKHYsIHApCisjZGVmaW5lIHdyaXRldyh2LCBwKQkJCV9faW5kaXJlY3Rfd3JpdGV3KHYsIHApCisjZGVmaW5lIHdyaXRlbCh2LCBwKQkJCV9faW5kaXJlY3Rfd3JpdGVsKHYsIHApCiAKLSNkZWZpbmUJd3JpdGVzYihwLCB2LCBsKQkJX19peHA0eHhfd3JpdGVzYihwLCB2LCBsKQotI2RlZmluZQl3cml0ZXN3KHAsIHYsIGwpCQlfX2l4cDR4eF93cml0ZXN3KHAsIHYsIGwpCi0jZGVmaW5lCXdyaXRlc2wocCwgdiwgbCkJCV9faXhwNHh4X3dyaXRlc2wocCwgdiwgbCkKLQkKLSNkZWZpbmUJcmVhZGIocCkJCQlfX2l4cDR4eF9yZWFkYihwKQotI2RlZmluZQlyZWFkdyhwKQkJCV9faXhwNHh4X3JlYWR3KHApCi0jZGVmaW5lCXJlYWRsKHApCQkJX19peHA0eHhfcmVhZGwocCkKLQkKLSNkZWZpbmUJcmVhZHNiKHAsIHYsIGwpCQkJX19peHA0eHhfcmVhZHNiKHAsIHYsIGwpCi0jZGVmaW5lCXJlYWRzdyhwLCB2LCBsKQkJCV9faXhwNHh4X3JlYWRzdyhwLCB2LCBsKQotI2RlZmluZQlyZWFkc2wocCwgdiwgbCkJCQlfX2l4cDR4eF9yZWFkc2wocCwgdiwgbCkKKyNkZWZpbmUgd3JpdGVzYihwLCB2LCBsKQkJX19pbmRpcmVjdF93cml0ZXNiKHAsIHYsIGwpCisjZGVmaW5lIHdyaXRlc3cocCwgdiwgbCkJCV9faW5kaXJlY3Rfd3JpdGVzdyhwLCB2LCBsKQorI2RlZmluZSB3cml0ZXNsKHAsIHYsIGwpCQlfX2luZGlyZWN0X3dyaXRlc2wocCwgdiwgbCkKIAotc3RhdGljIGlubGluZSB2b2lkIAotX19peHA0eHhfd3JpdGViKHU4IHZhbHVlLCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnApCisjZGVmaW5lIHJlYWRiKHApCQkJX19pbmRpcmVjdF9yZWFkYihwKQorI2RlZmluZSByZWFkdyhwKQkJCV9faW5kaXJlY3RfcmVhZHcocCkKKyNkZWZpbmUgcmVhZGwocCkJCQlfX2luZGlyZWN0X3JlYWRsKHApCisKKyNkZWZpbmUgcmVhZHNiKHAsIHYsIGwpCQkJX19pbmRpcmVjdF9yZWFkc2IocCwgdiwgbCkKKyNkZWZpbmUgcmVhZHN3KHAsIHYsIGwpCQkJX19pbmRpcmVjdF9yZWFkc3cocCwgdiwgbCkKKyNkZWZpbmUgcmVhZHNsKHAsIHYsIGwpCQkJX19pbmRpcmVjdF9yZWFkc2wocCwgdiwgbCkKKworc3RhdGljIGlubGluZSB2b2lkIF9faW5kaXJlY3Rfd3JpdGViKHU4IHZhbHVlLCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnApCiB7CiAJdTMyIGFkZHIgPSAodTMyKXA7CiAJdTMyIG4sIGJ5dGVfZW5hYmxlcywgZGF0YTsKIAotCWlmIChhZGRyID49IFZNQUxMT0NfU1RBUlQpIHsKKwlpZiAoIWlzX3BjaV9tZW1vcnkoYWRkcikpIHsKIAkJX19yYXdfd3JpdGViKHZhbHVlLCBhZGRyKTsKIAkJcmV0dXJuOwogCX0KQEAgLTEwNywyMCArMTA5LDE5IEBACiAJaXhwNHh4X3BjaV93cml0ZShhZGRyLCBieXRlX2VuYWJsZXMgfCBOUF9DTURfTUVNV1JJVEUsIGRhdGEpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9faXhwNHh4X3dyaXRlc2Iodm9sYXRpbGUgdm9pZCBfX2lvbWVtICpidXNfYWRkciwgY29uc3QgdTggKnZhZGRyLCBpbnQgY291bnQpCitzdGF0aWMgaW5saW5lIHZvaWQgX19pbmRpcmVjdF93cml0ZXNiKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYnVzX2FkZHIsCisJCQkJICAgICAgY29uc3QgdTggKnZhZGRyLCBpbnQgY291bnQpCiB7CiAJd2hpbGUgKGNvdW50LS0pCiAJCXdyaXRlYigqdmFkZHIrKywgYnVzX2FkZHIpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgCi1fX2l4cDR4eF93cml0ZXcodTE2IHZhbHVlLCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnApCitzdGF0aWMgaW5saW5lIHZvaWQgX19pbmRpcmVjdF93cml0ZXcodTE2IHZhbHVlLCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnApCiB7CiAJdTMyIGFkZHIgPSAodTMyKXA7CiAJdTMyIG4sIGJ5dGVfZW5hYmxlcywgZGF0YTsKIAotCWlmIChhZGRyID49IFZNQUxMT0NfU1RBUlQpIHsKKwlpZiAoIWlzX3BjaV9tZW1vcnkoYWRkcikpIHsKIAkJX19yYXdfd3JpdGV3KHZhbHVlLCBhZGRyKTsKIAkJcmV0dXJuOwogCX0KQEAgLTEzMSwxOCArMTMyLDE4IEBACiAJaXhwNHh4X3BjaV93cml0ZShhZGRyLCBieXRlX2VuYWJsZXMgfCBOUF9DTURfTUVNV1JJVEUsIGRhdGEpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9faXhwNHh4X3dyaXRlc3codm9sYXRpbGUgdm9pZCBfX2lvbWVtICpidXNfYWRkciwgY29uc3QgdTE2ICp2YWRkciwgaW50IGNvdW50KQorc3RhdGljIGlubGluZSB2b2lkIF9faW5kaXJlY3Rfd3JpdGVzdyh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmJ1c19hZGRyLAorCQkJCSAgICAgIGNvbnN0IHUxNiAqdmFkZHIsIGludCBjb3VudCkKIHsKIAl3aGlsZSAoY291bnQtLSkKIAkJd3JpdGV3KCp2YWRkcisrLCBidXNfYWRkcik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAKLV9faXhwNHh4X3dyaXRlbCh1MzIgdmFsdWUsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqcCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2luZGlyZWN0X3dyaXRlbCh1MzIgdmFsdWUsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqcCkKIHsKIAl1MzIgYWRkciA9IChfX2ZvcmNlIHUzMilwOwotCWlmIChhZGRyID49IFZNQUxMT0NfU1RBUlQpIHsKKworCWlmICghaXNfcGNpX21lbW9yeShhZGRyKSkgewogCQlfX3Jhd193cml0ZWwodmFsdWUsIHApOwogCQlyZXR1cm47CiAJfQpAQCAtMTUwLDIwICsxNTEsMTkgQEAKIAlpeHA0eHhfcGNpX3dyaXRlKGFkZHIsIE5QX0NNRF9NRU1XUklURSwgdmFsdWUpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9faXhwNHh4X3dyaXRlc2wodm9sYXRpbGUgdm9pZCBfX2lvbWVtICpidXNfYWRkciwgY29uc3QgdTMyICp2YWRkciwgaW50IGNvdW50KQorc3RhdGljIGlubGluZSB2b2lkIF9faW5kaXJlY3Rfd3JpdGVzbCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmJ1c19hZGRyLAorCQkJCSAgICAgIGNvbnN0IHUzMiAqdmFkZHIsIGludCBjb3VudCkKIHsKIAl3aGlsZSAoY291bnQtLSkKIAkJd3JpdGVsKCp2YWRkcisrLCBidXNfYWRkcik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciAKLV9faXhwNHh4X3JlYWRiKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqcCkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBfX2luZGlyZWN0X3JlYWRiKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqcCkKIHsKIAl1MzIgYWRkciA9ICh1MzIpcDsKIAl1MzIgbiwgYnl0ZV9lbmFibGVzLCBkYXRhOwogCi0JaWYgKGFkZHIgPj0gVk1BTExPQ19TVEFSVCkKKwlpZiAoIWlzX3BjaV9tZW1vcnkoYWRkcikpCiAJCXJldHVybiBfX3Jhd19yZWFkYihhZGRyKTsKIAogCW4gPSBhZGRyICUgNDsKQEAgLTE3NCwyMCArMTc0LDE5IEBACiAJcmV0dXJuIGRhdGEgPj4gKDgqbik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotX19peHA0eHhfcmVhZHNiKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYnVzX2FkZHIsIHU4ICp2YWRkciwgdTMyIGNvdW50KQorc3RhdGljIGlubGluZSB2b2lkIF9faW5kaXJlY3RfcmVhZHNiKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYnVzX2FkZHIsCisJCQkJICAgICB1OCAqdmFkZHIsIHUzMiBjb3VudCkKIHsKIAl3aGlsZSAoY291bnQtLSkKIAkJKnZhZGRyKysgPSByZWFkYihidXNfYWRkcik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgCi1fX2l4cDR4eF9yZWFkdyhjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnApCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IF9faW5kaXJlY3RfcmVhZHcoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpwKQogewogCXUzMiBhZGRyID0gKHUzMilwOwogCXUzMiBuLCBieXRlX2VuYWJsZXMsIGRhdGE7CiAKLQlpZiAoYWRkciA+PSBWTUFMTE9DX1NUQVJUKQorCWlmICghaXNfcGNpX21lbW9yeShhZGRyKSkKIAkJcmV0dXJuIF9fcmF3X3JlYWR3KGFkZHIpOwogCiAJbiA9IGFkZHIgJSA0OwpAQCAtMTk4LDIwICsxOTcsMTkgQEAKIAlyZXR1cm4gZGF0YT4+KDgqbik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAKLV9faXhwNHh4X3JlYWRzdyhjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmJ1c19hZGRyLCB1MTYgKnZhZGRyLCB1MzIgY291bnQpCitzdGF0aWMgaW5saW5lIHZvaWQgX19pbmRpcmVjdF9yZWFkc3coY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpidXNfYWRkciwKKwkJCQkgICAgIHUxNiAqdmFkZHIsIHUzMiBjb3VudCkKIHsKIAl3aGlsZSAoY291bnQtLSkKIAkJKnZhZGRyKysgPSByZWFkdyhidXNfYWRkcik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyAKLV9faXhwNHh4X3JlYWRsKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqcCkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2luZGlyZWN0X3JlYWRsKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqcCkKIHsKIAl1MzIgYWRkciA9IChfX2ZvcmNlIHUzMilwOwogCXUzMiBkYXRhOwogCi0JaWYgKGFkZHIgPj0gVk1BTExPQ19TVEFSVCkKKwlpZiAoIWlzX3BjaV9tZW1vcnkoYWRkcikpCiAJCXJldHVybiBfX3Jhd19yZWFkbChwKTsKIAogCWlmIChpeHA0eHhfcGNpX3JlYWQoYWRkciwgTlBfQ01EX01FTVJFQUQsICZkYXRhKSkKQEAgLTIyMCw4ICsyMTgsOCBAQAogCXJldHVybiBkYXRhOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgCi1fX2l4cDR4eF9yZWFkc2woY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpidXNfYWRkciwgdTMyICp2YWRkciwgdTMyIGNvdW50KQorc3RhdGljIGlubGluZSB2b2lkIF9faW5kaXJlY3RfcmVhZHNsKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYnVzX2FkZHIsCisJCQkJICAgICB1MzIgKnZhZGRyLCB1MzIgY291bnQpCiB7CiAJd2hpbGUgKGNvdW50LS0pCiAJCSp2YWRkcisrID0gcmVhZGwoYnVzX2FkZHIpOwpAQCAtMjM1LDcgKzIzMyw3IEBACiAjZGVmaW5lIG1lbWNweV9mcm9taW8oYSxjLGwpCQlfbWVtY3B5X2Zyb21pbygoYSksKGMpLChsKSkKICNkZWZpbmUgbWVtY3B5X3RvaW8oYyxhLGwpCQlfbWVtY3B5X3RvaW8oKGMpLChhKSwobCkpCiAKLSNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19JWFA0WFhfSU5ESVJFQ1RfUENJICovCiAKICNpZm5kZWYgQ09ORklHX1BDSQogCkBAIC0yNTAsMjUgKzI0OCw4IEBACiAgKiB0cmFuc2FjdGlvbi4gIFRoaXMgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0CiAgKiBJL08gZnVuY3Rpb25zLgogICovCi0jZGVmaW5lCW91dGIocCwgdikJCQlfX2l4cDR4eF9vdXRiKHAsIHYpCi0jZGVmaW5lCW91dHcocCwgdikJCQlfX2l4cDR4eF9vdXR3KHAsIHYpCi0jZGVmaW5lCW91dGwocCwgdikJCQlfX2l4cDR4eF9vdXRsKHAsIHYpCi0JCi0jZGVmaW5lCW91dHNiKHAsIHYsIGwpCQkJX19peHA0eHhfb3V0c2IocCwgdiwgbCkKLSNkZWZpbmUJb3V0c3cocCwgdiwgbCkJCQlfX2l4cDR4eF9vdXRzdyhwLCB2LCBsKQotI2RlZmluZQlvdXRzbChwLCB2LCBsKQkJCV9faXhwNHh4X291dHNsKHAsIHYsIGwpCiAKLSNkZWZpbmUJaW5iKHApCQkJCV9faXhwNHh4X2luYihwKQotI2RlZmluZQlpbncocCkJCQkJX19peHA0eHhfaW53KHApCi0jZGVmaW5lCWlubChwKQkJCQlfX2l4cDR4eF9pbmwocCkKLQotI2RlZmluZQlpbnNiKHAsIHYsIGwpCQkJX19peHA0eHhfaW5zYihwLCB2LCBsKQotI2RlZmluZQlpbnN3KHAsIHYsIGwpCQkJX19peHA0eHhfaW5zdyhwLCB2LCBsKQotI2RlZmluZQlpbnNsKHAsIHYsIGwpCQkJX19peHA0eHhfaW5zbChwLCB2LCBsKQotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCAKLV9faXhwNHh4X291dGIodTggdmFsdWUsIHUzMiBhZGRyKQorc3RhdGljIGlubGluZSB2b2lkIG91dGIodTggdmFsdWUsIHUzMiBhZGRyKQogewogCXUzMiBuLCBieXRlX2VuYWJsZXMsIGRhdGE7CiAJbiA9IGFkZHIgJSA0OwpAQCAtMjc3LDE1ICsyNTgsMTMgQEAKIAlpeHA0eHhfcGNpX3dyaXRlKGFkZHIsIGJ5dGVfZW5hYmxlcyB8IE5QX0NNRF9JT1dSSVRFLCBkYXRhKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIAotX19peHA0eHhfb3V0c2IodTMyIGlvX2FkZHIsIGNvbnN0IHU4ICp2YWRkciwgdTMyIGNvdW50KQorc3RhdGljIGlubGluZSB2b2lkIG91dHNiKHUzMiBpb19hZGRyLCBjb25zdCB1OCAqdmFkZHIsIHUzMiBjb3VudCkKIHsKIAl3aGlsZSAoY291bnQtLSkKIAkJb3V0YigqdmFkZHIrKywgaW9fYWRkcik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAKLV9faXhwNHh4X291dHcodTE2IHZhbHVlLCB1MzIgYWRkcikKK3N0YXRpYyBpbmxpbmUgdm9pZCBvdXR3KHUxNiB2YWx1ZSwgdTMyIGFkZHIpCiB7CiAJdTMyIG4sIGJ5dGVfZW5hYmxlcywgZGF0YTsKIAluID0gYWRkciAlIDQ7CkBAIC0yOTQsMjggKzI3MywyNCBAQAogCWl4cDR4eF9wY2lfd3JpdGUoYWRkciwgYnl0ZV9lbmFibGVzIHwgTlBfQ01EX0lPV1JJVEUsIGRhdGEpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgCi1fX2l4cDR4eF9vdXRzdyh1MzIgaW9fYWRkciwgY29uc3QgdTE2ICp2YWRkciwgdTMyIGNvdW50KQorc3RhdGljIGlubGluZSB2b2lkIG91dHN3KHUzMiBpb19hZGRyLCBjb25zdCB1MTYgKnZhZGRyLCB1MzIgY291bnQpCiB7CiAJd2hpbGUgKGNvdW50LS0pCiAJCW91dHcoY3B1X3RvX2xlMTYoKnZhZGRyKyspLCBpb19hZGRyKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIAotX19peHA0eHhfb3V0bCh1MzIgdmFsdWUsIHUzMiBhZGRyKQorc3RhdGljIGlubGluZSB2b2lkIG91dGwodTMyIHZhbHVlLCB1MzIgYWRkcikKIHsKIAlpeHA0eHhfcGNpX3dyaXRlKGFkZHIsIE5QX0NNRF9JT1dSSVRFLCB2YWx1ZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAKLV9faXhwNHh4X291dHNsKHUzMiBpb19hZGRyLCBjb25zdCB1MzIgKnZhZGRyLCB1MzIgY291bnQpCitzdGF0aWMgaW5saW5lIHZvaWQgb3V0c2wodTMyIGlvX2FkZHIsIGNvbnN0IHUzMiAqdmFkZHIsIHUzMiBjb3VudCkKIHsKIAl3aGlsZSAoY291bnQtLSkKLQkJb3V0bCgqdmFkZHIrKywgaW9fYWRkcik7CisJCW91dGwoY3B1X3RvX2xlMzIoKnZhZGRyKyspLCBpb19hZGRyKTsKIH0KIAotc3RhdGljIGlubGluZSB1OCAKLV9faXhwNHh4X2luYih1MzIgYWRkcikKK3N0YXRpYyBpbmxpbmUgdTggaW5iKHUzMiBhZGRyKQogewogCXUzMiBuLCBieXRlX2VuYWJsZXMsIGRhdGE7CiAJbiA9IGFkZHIgJSA0OwpAQCAtMzI2LDE1ICszMDEsMTMgQEAKIAlyZXR1cm4gZGF0YSA+PiAoOCpuKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIAotX19peHA0eHhfaW5zYih1MzIgaW9fYWRkciwgdTggKnZhZGRyLCB1MzIgY291bnQpCitzdGF0aWMgaW5saW5lIHZvaWQgaW5zYih1MzIgaW9fYWRkciwgdTggKnZhZGRyLCB1MzIgY291bnQpCiB7CiAJd2hpbGUgKGNvdW50LS0pCiAJCSp2YWRkcisrID0gaW5iKGlvX2FkZHIpOwogfQogCi1zdGF0aWMgaW5saW5lIHUxNiAKLV9faXhwNHh4X2ludyh1MzIgYWRkcikKK3N0YXRpYyBpbmxpbmUgdTE2IGludyh1MzIgYWRkcikKIHsKIAl1MzIgbiwgYnl0ZV9lbmFibGVzLCBkYXRhOwogCW4gPSBhZGRyICUgNDsKQEAgLTM0NSwxNSArMzE4LDEzIEBACiAJcmV0dXJuIGRhdGE+Pig4Km4pOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgCi1fX2l4cDR4eF9pbnN3KHUzMiBpb19hZGRyLCB1MTYgKnZhZGRyLCB1MzIgY291bnQpCitzdGF0aWMgaW5saW5lIHZvaWQgaW5zdyh1MzIgaW9fYWRkciwgdTE2ICp2YWRkciwgdTMyIGNvdW50KQogewogCXdoaWxlIChjb3VudC0tKQogCQkqdmFkZHIrKyA9IGxlMTZfdG9fY3B1KGludyhpb19hZGRyKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyIAotX19peHA0eHhfaW5sKHUzMiBhZGRyKQorc3RhdGljIGlubGluZSB1MzIgaW5sKHUzMiBhZGRyKQogewogCXUzMiBkYXRhOwogCWlmIChpeHA0eHhfcGNpX3JlYWQoYWRkciwgTlBfQ01EX0lPUkVBRCwgJmRhdGEpKQpAQCAtMzYyLDExICszMzMsMTAgQEAKIAlyZXR1cm4gZGF0YTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIAotX19peHA0eHhfaW5zbCh1MzIgaW9fYWRkciwgdTMyICp2YWRkciwgdTMyIGNvdW50KQorc3RhdGljIGlubGluZSB2b2lkIGluc2wodTMyIGlvX2FkZHIsIHUzMiAqdmFkZHIsIHUzMiBjb3VudCkKIHsKIAl3aGlsZSAoY291bnQtLSkKLQkJKnZhZGRyKysgPSBpbmwoaW9fYWRkcik7CisJCSp2YWRkcisrID0gbGUzMl90b19jcHUoaW5sKGlvX2FkZHIpKTsKIH0KIAogI2RlZmluZSBQSU9fT0ZGU0VUICAgICAgMHgxMDAwMFVMCkBAIC0zNzQsMTk0ICszNDQsMTgzIEBACiAKICNkZWZpbmUJX19pc19pb19hZGRyZXNzKHApCSgoKHVuc2lnbmVkIGxvbmcpcCA+PSBQSU9fT0ZGU0VUKSAmJiBcCiAJCQkJCSgodW5zaWduZWQgbG9uZylwIDw9IChQSU9fTUFTSyArIFBJT19PRkZTRVQpKSkKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1fX2l4cDR4eF9pb3JlYWQ4KGNvbnN0IHZvaWQgX19pb21lbSAqYWRkcikKKworI2RlZmluZQlpb3JlYWQ4KHApCQkJaW9yZWFkOChwKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaW9yZWFkOChjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIpCiB7CiAJdW5zaWduZWQgbG9uZyBwb3J0ID0gKHVuc2lnbmVkIGxvbmcgX19mb3JjZSlhZGRyOwogCWlmIChfX2lzX2lvX2FkZHJlc3MocG9ydCkpCi0JCXJldHVybgkodW5zaWduZWQgaW50KV9faXhwNHh4X2luYihwb3J0ICYgUElPX01BU0spOworCQlyZXR1cm4gKHVuc2lnbmVkIGludClpbmIocG9ydCAmIFBJT19NQVNLKTsKIAllbHNlCiAjaWZuZGVmIENPTkZJR19JWFA0WFhfSU5ESVJFQ1RfUENJCiAJCXJldHVybiAodW5zaWduZWQgaW50KV9fcmF3X3JlYWRiKHBvcnQpOwogI2Vsc2UKLQkJcmV0dXJuICh1bnNpZ25lZCBpbnQpX19peHA0eHhfcmVhZGIoYWRkcik7CisJCXJldHVybiAodW5zaWduZWQgaW50KV9faW5kaXJlY3RfcmVhZGIoYWRkcik7CiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCi1fX2l4cDR4eF9pb3JlYWQ4X3JlcChjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIsIHZvaWQgKnZhZGRyLCB1MzIgY291bnQpCisjZGVmaW5lCWlvcmVhZDhfcmVwKHAsIHYsIGMpCQlpb3JlYWQ4X3JlcChwLCB2LCBjKQorc3RhdGljIGlubGluZSB2b2lkIGlvcmVhZDhfcmVwKGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqdmFkZHIsIHUzMiBjb3VudCkKIHsKIAl1bnNpZ25lZCBsb25nIHBvcnQgPSAodW5zaWduZWQgbG9uZyBfX2ZvcmNlKWFkZHI7CiAJaWYgKF9faXNfaW9fYWRkcmVzcyhwb3J0KSkKLQkJX19peHA0eHhfaW5zYihwb3J0ICYgUElPX01BU0ssIHZhZGRyLCBjb3VudCk7CisJCWluc2IocG9ydCAmIFBJT19NQVNLLCB2YWRkciwgY291bnQpOwogCWVsc2UKICNpZm5kZWYJQ09ORklHX0lYUDRYWF9JTkRJUkVDVF9QQ0kKIAkJX19yYXdfcmVhZHNiKGFkZHIsIHZhZGRyLCBjb3VudCk7CiAjZWxzZQotCQlfX2l4cDR4eF9yZWFkc2IoYWRkciwgdmFkZHIsIGNvdW50KTsKKwkJX19pbmRpcmVjdF9yZWFkc2IoYWRkciwgdmFkZHIsIGNvdW50KTsKICNlbmRpZgogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAotX19peHA0eHhfaW9yZWFkMTYoY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyKQorI2RlZmluZQlpb3JlYWQxNihwKQkJCWlvcmVhZDE2KHApCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpb3JlYWQxNihjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIpCiB7CiAJdW5zaWduZWQgbG9uZyBwb3J0ID0gKHVuc2lnbmVkIGxvbmcgX19mb3JjZSlhZGRyOwogCWlmIChfX2lzX2lvX2FkZHJlc3MocG9ydCkpCi0JCXJldHVybgkodW5zaWduZWQgaW50KV9faXhwNHh4X2ludyhwb3J0ICYgUElPX01BU0spOworCQlyZXR1cm4JKHVuc2lnbmVkIGludClpbncocG9ydCAmIFBJT19NQVNLKTsKIAllbHNlCiAjaWZuZGVmIENPTkZJR19JWFA0WFhfSU5ESVJFQ1RfUENJCiAJCXJldHVybiBsZTE2X3RvX2NwdShfX3Jhd19yZWFkdygodTMyKXBvcnQpKTsKICNlbHNlCi0JCXJldHVybiAodW5zaWduZWQgaW50KV9faXhwNHh4X3JlYWR3KGFkZHIpOworCQlyZXR1cm4gKHVuc2lnbmVkIGludClfX2luZGlyZWN0X3JlYWR3KGFkZHIpOwogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotX19peHA0eHhfaW9yZWFkMTZfcmVwKGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqdmFkZHIsIHUzMiBjb3VudCkKKyNkZWZpbmUJaW9yZWFkMTZfcmVwKHAsIHYsIGMpCQlpb3JlYWQxNl9yZXAocCwgdiwgYykKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb3JlYWQxNl9yZXAoY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICp2YWRkciwKKwkJCQl1MzIgY291bnQpCiB7CiAJdW5zaWduZWQgbG9uZyBwb3J0ID0gKHVuc2lnbmVkIGxvbmcgX19mb3JjZSlhZGRyOwogCWlmIChfX2lzX2lvX2FkZHJlc3MocG9ydCkpCi0JCV9faXhwNHh4X2luc3cocG9ydCAmIFBJT19NQVNLLCB2YWRkciwgY291bnQpOworCQlpbnN3KHBvcnQgJiBQSU9fTUFTSywgdmFkZHIsIGNvdW50KTsKIAllbHNlCiAjaWZuZGVmCUNPTkZJR19JWFA0WFhfSU5ESVJFQ1RfUENJCiAJCV9fcmF3X3JlYWRzdyhhZGRyLCB2YWRkciwgY291bnQpOwogI2Vsc2UKLQkJX19peHA0eHhfcmVhZHN3KGFkZHIsIHZhZGRyLCBjb3VudCk7CisJCV9faW5kaXJlY3RfcmVhZHN3KGFkZHIsIHZhZGRyLCBjb3VudCk7CiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKLV9faXhwNHh4X2lvcmVhZDMyKGNvbnN0IHZvaWQgX19pb21lbSAqYWRkcikKKyNkZWZpbmUJaW9yZWFkMzIocCkJCQlpb3JlYWQzMihwKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaW9yZWFkMzIoY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyKQogewogCXVuc2lnbmVkIGxvbmcgcG9ydCA9ICh1bnNpZ25lZCBsb25nIF9fZm9yY2UpYWRkcjsKIAlpZiAoX19pc19pb19hZGRyZXNzKHBvcnQpKQotCQlyZXR1cm4JKHVuc2lnbmVkIGludClfX2l4cDR4eF9pbmwocG9ydCAmIFBJT19NQVNLKTsKKwkJcmV0dXJuCSh1bnNpZ25lZCBpbnQpaW5sKHBvcnQgJiBQSU9fTUFTSyk7CiAJZWxzZSB7CiAjaWZuZGVmIENPTkZJR19JWFA0WFhfSU5ESVJFQ1RfUENJCiAJCXJldHVybiBsZTMyX3RvX2NwdSgoX19mb3JjZSBfX2xlMzIpX19yYXdfcmVhZGwoYWRkcikpOwogI2Vsc2UKLQkJcmV0dXJuICh1bnNpZ25lZCBpbnQpX19peHA0eHhfcmVhZGwoYWRkcik7CisJCXJldHVybiAodW5zaWduZWQgaW50KV9faW5kaXJlY3RfcmVhZGwoYWRkcik7CiAjZW5kaWYKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotX19peHA0eHhfaW9yZWFkMzJfcmVwKGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqdmFkZHIsIHUzMiBjb3VudCkKKyNkZWZpbmUJaW9yZWFkMzJfcmVwKHAsIHYsIGMpCQlpb3JlYWQzMl9yZXAocCwgdiwgYykKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb3JlYWQzMl9yZXAoY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICp2YWRkciwKKwkJCQl1MzIgY291bnQpCiB7CiAJdW5zaWduZWQgbG9uZyBwb3J0ID0gKHVuc2lnbmVkIGxvbmcgX19mb3JjZSlhZGRyOwogCWlmIChfX2lzX2lvX2FkZHJlc3MocG9ydCkpCi0JCV9faXhwNHh4X2luc2wocG9ydCAmIFBJT19NQVNLLCB2YWRkciwgY291bnQpOworCQlpbnNsKHBvcnQgJiBQSU9fTUFTSywgdmFkZHIsIGNvdW50KTsKIAllbHNlCiAjaWZuZGVmCUNPTkZJR19JWFA0WFhfSU5ESVJFQ1RfUENJCiAJCV9fcmF3X3JlYWRzbChhZGRyLCB2YWRkciwgY291bnQpOwogI2Vsc2UKLQkJX19peHA0eHhfcmVhZHNsKGFkZHIsIHZhZGRyLCBjb3VudCk7CisJCV9faW5kaXJlY3RfcmVhZHNsKGFkZHIsIHZhZGRyLCBjb3VudCk7CiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCi1fX2l4cDR4eF9pb3dyaXRlOCh1OCB2YWx1ZSwgdm9pZCBfX2lvbWVtICphZGRyKQorI2RlZmluZQlpb3dyaXRlOCh2LCBwKQkJCWlvd3JpdGU4KHYsIHApCitzdGF0aWMgaW5saW5lIHZvaWQgaW93cml0ZTgodTggdmFsdWUsIHZvaWQgX19pb21lbSAqYWRkcikKIHsKIAl1bnNpZ25lZCBsb25nIHBvcnQgPSAodW5zaWduZWQgbG9uZyBfX2ZvcmNlKWFkZHI7CiAJaWYgKF9faXNfaW9fYWRkcmVzcyhwb3J0KSkKLQkJX19peHA0eHhfb3V0Yih2YWx1ZSwgcG9ydCAmIFBJT19NQVNLKTsKKwkJb3V0Yih2YWx1ZSwgcG9ydCAmIFBJT19NQVNLKTsKIAllbHNlCiAjaWZuZGVmIENPTkZJR19JWFA0WFhfSU5ESVJFQ1RfUENJCiAJCV9fcmF3X3dyaXRlYih2YWx1ZSwgcG9ydCk7CiAjZWxzZQotCQlfX2l4cDR4eF93cml0ZWIodmFsdWUsIGFkZHIpOworCQlfX2luZGlyZWN0X3dyaXRlYih2YWx1ZSwgYWRkcik7CiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCi1fX2l4cDR4eF9pb3dyaXRlOF9yZXAodm9pZCBfX2lvbWVtICphZGRyLCBjb25zdCB2b2lkICp2YWRkciwgdTMyIGNvdW50KQorI2RlZmluZQlpb3dyaXRlOF9yZXAocCwgdiwgYykJCWlvd3JpdGU4X3JlcChwLCB2LCBjKQorc3RhdGljIGlubGluZSB2b2lkIGlvd3JpdGU4X3JlcCh2b2lkIF9faW9tZW0gKmFkZHIsIGNvbnN0IHZvaWQgKnZhZGRyLAorCQkJCXUzMiBjb3VudCkKIHsKIAl1bnNpZ25lZCBsb25nIHBvcnQgPSAodW5zaWduZWQgbG9uZyBfX2ZvcmNlKWFkZHI7CiAJaWYgKF9faXNfaW9fYWRkcmVzcyhwb3J0KSkKLQkJX19peHA0eHhfb3V0c2IocG9ydCAmIFBJT19NQVNLLCB2YWRkciwgY291bnQpOworCQlvdXRzYihwb3J0ICYgUElPX01BU0ssIHZhZGRyLCBjb3VudCk7CiAJZWxzZQogI2lmbmRlZiBDT05GSUdfSVhQNFhYX0lORElSRUNUX1BDSQogCQlfX3Jhd193cml0ZXNiKGFkZHIsIHZhZGRyLCBjb3VudCk7CiAjZWxzZQotCQlfX2l4cDR4eF93cml0ZXNiKGFkZHIsIHZhZGRyLCBjb3VudCk7CisJCV9faW5kaXJlY3Rfd3JpdGVzYihhZGRyLCB2YWRkciwgY291bnQpOwogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotX19peHA0eHhfaW93cml0ZTE2KHUxNiB2YWx1ZSwgdm9pZCBfX2lvbWVtICphZGRyKQorI2RlZmluZQlpb3dyaXRlMTYodiwgcCkJCQlpb3dyaXRlMTYodiwgcCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb3dyaXRlMTYodTE2IHZhbHVlLCB2b2lkIF9faW9tZW0gKmFkZHIpCiB7CiAJdW5zaWduZWQgbG9uZyBwb3J0ID0gKHVuc2lnbmVkIGxvbmcgX19mb3JjZSlhZGRyOwogCWlmIChfX2lzX2lvX2FkZHJlc3MocG9ydCkpCi0JCV9faXhwNHh4X291dHcodmFsdWUsIHBvcnQgJiBQSU9fTUFTSyk7CisJCW91dHcodmFsdWUsIHBvcnQgJiBQSU9fTUFTSyk7CiAJZWxzZQogI2lmbmRlZiBDT05GSUdfSVhQNFhYX0lORElSRUNUX1BDSQogCQlfX3Jhd193cml0ZXcoY3B1X3RvX2xlMTYodmFsdWUpLCBhZGRyKTsKICNlbHNlCi0JCV9faXhwNHh4X3dyaXRldyh2YWx1ZSwgYWRkcik7CisJCV9faW5kaXJlY3Rfd3JpdGV3KHZhbHVlLCBhZGRyKTsKICNlbmRpZgogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9faXhwNHh4X2lvd3JpdGUxNl9yZXAodm9pZCBfX2lvbWVtICphZGRyLCBjb25zdCB2b2lkICp2YWRkciwgdTMyIGNvdW50KQorI2RlZmluZQlpb3dyaXRlMTZfcmVwKHAsIHYsIGMpCQlpb3dyaXRlMTZfcmVwKHAsIHYsIGMpCitzdGF0aWMgaW5saW5lIHZvaWQgaW93cml0ZTE2X3JlcCh2b2lkIF9faW9tZW0gKmFkZHIsIGNvbnN0IHZvaWQgKnZhZGRyLAorCQkJCSB1MzIgY291bnQpCiB7CiAJdW5zaWduZWQgbG9uZyBwb3J0ID0gKHVuc2lnbmVkIGxvbmcgX19mb3JjZSlhZGRyOwogCWlmIChfX2lzX2lvX2FkZHJlc3MocG9ydCkpCi0JCV9faXhwNHh4X291dHN3KHBvcnQgJiBQSU9fTUFTSywgdmFkZHIsIGNvdW50KTsKKwkJb3V0c3cocG9ydCAmIFBJT19NQVNLLCB2YWRkciwgY291bnQpOwogCWVsc2UKICNpZm5kZWYgQ09ORklHX0lYUDRYWF9JTkRJUkVDVF9QQ0kKIAkJX19yYXdfd3JpdGVzdyhhZGRyLCB2YWRkciwgY291bnQpOwogI2Vsc2UKLQkJX19peHA0eHhfd3JpdGVzdyhhZGRyLCB2YWRkciwgY291bnQpOworCQlfX2luZGlyZWN0X3dyaXRlc3coYWRkciwgdmFkZHIsIGNvdW50KTsKICNlbmRpZgogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9faXhwNHh4X2lvd3JpdGUzMih1MzIgdmFsdWUsIHZvaWQgX19pb21lbSAqYWRkcikKKyNkZWZpbmUJaW93cml0ZTMyKHYsIHApCQkJaW93cml0ZTMyKHYsIHApCitzdGF0aWMgaW5saW5lIHZvaWQgaW93cml0ZTMyKHUzMiB2YWx1ZSwgdm9pZCBfX2lvbWVtICphZGRyKQogewogCXVuc2lnbmVkIGxvbmcgcG9ydCA9ICh1bnNpZ25lZCBsb25nIF9fZm9yY2UpYWRkcjsKIAlpZiAoX19pc19pb19hZGRyZXNzKHBvcnQpKQotCQlfX2l4cDR4eF9vdXRsKHZhbHVlLCBwb3J0ICYgUElPX01BU0spOworCQlvdXRsKHZhbHVlLCBwb3J0ICYgUElPX01BU0spOwogCWVsc2UKICNpZm5kZWYgQ09ORklHX0lYUDRYWF9JTkRJUkVDVF9QQ0kKIAkJX19yYXdfd3JpdGVsKCh1MzIgX19mb3JjZSljcHVfdG9fbGUzMih2YWx1ZSksIGFkZHIpOwogI2Vsc2UKLQkJX19peHA0eHhfd3JpdGVsKHZhbHVlLCBhZGRyKTsKKwkJX19pbmRpcmVjdF93cml0ZWwodmFsdWUsIGFkZHIpOwogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotX19peHA0eHhfaW93cml0ZTMyX3JlcCh2b2lkIF9faW9tZW0gKmFkZHIsIGNvbnN0IHZvaWQgKnZhZGRyLCB1MzIgY291bnQpCisjZGVmaW5lCWlvd3JpdGUzMl9yZXAocCwgdiwgYykJCWlvd3JpdGUzMl9yZXAocCwgdiwgYykKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb3dyaXRlMzJfcmVwKHZvaWQgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqdmFkZHIsCisJCQkJIHUzMiBjb3VudCkKIHsKIAl1bnNpZ25lZCBsb25nIHBvcnQgPSAodW5zaWduZWQgbG9uZyBfX2ZvcmNlKWFkZHI7CiAJaWYgKF9faXNfaW9fYWRkcmVzcyhwb3J0KSkKLQkJX19peHA0eHhfb3V0c2wocG9ydCAmIFBJT19NQVNLLCB2YWRkciwgY291bnQpOworCQlvdXRzbChwb3J0ICYgUElPX01BU0ssIHZhZGRyLCBjb3VudCk7CiAJZWxzZQogI2lmbmRlZiBDT05GSUdfSVhQNFhYX0lORElSRUNUX1BDSQogCQlfX3Jhd193cml0ZXNsKGFkZHIsIHZhZGRyLCBjb3VudCk7CiAjZWxzZQotCQlfX2l4cDR4eF93cml0ZXNsKGFkZHIsIHZhZGRyLCBjb3VudCk7CisJCV9faW5kaXJlY3Rfd3JpdGVzbChhZGRyLCB2YWRkciwgY291bnQpOwogI2VuZGlmCiB9CiAKLSNkZWZpbmUJaW9yZWFkOChwKQkJCV9faXhwNHh4X2lvcmVhZDgocCkKLSNkZWZpbmUJaW9yZWFkMTYocCkJCQlfX2l4cDR4eF9pb3JlYWQxNihwKQotI2RlZmluZQlpb3JlYWQzMihwKQkJCV9faXhwNHh4X2lvcmVhZDMyKHApCi0KLSNkZWZpbmUJaW9yZWFkOF9yZXAocCwgdiwgYykJCV9faXhwNHh4X2lvcmVhZDhfcmVwKHAsIHYsIGMpCi0jZGVmaW5lCWlvcmVhZDE2X3JlcChwLCB2LCBjKQkJX19peHA0eHhfaW9yZWFkMTZfcmVwKHAsIHYsIGMpCi0jZGVmaW5lCWlvcmVhZDMyX3JlcChwLCB2LCBjKQkJX19peHA0eHhfaW9yZWFkMzJfcmVwKHAsIHYsIGMpCi0KLSNkZWZpbmUJaW93cml0ZTgodixwKQkJCV9faXhwNHh4X2lvd3JpdGU4KHYscCkKLSNkZWZpbmUJaW93cml0ZTE2KHYscCkJCQlfX2l4cDR4eF9pb3dyaXRlMTYodixwKQotI2RlZmluZQlpb3dyaXRlMzIodixwKQkJCV9faXhwNHh4X2lvd3JpdGUzMih2LHApCi0KLSNkZWZpbmUJaW93cml0ZThfcmVwKHAsIHYsIGMpCQlfX2l4cDR4eF9pb3dyaXRlOF9yZXAocCwgdiwgYykKLSNkZWZpbmUJaW93cml0ZTE2X3JlcChwLCB2LCBjKQkJX19peHA0eHhfaW93cml0ZTE2X3JlcChwLCB2LCBjKQotI2RlZmluZQlpb3dyaXRlMzJfcmVwKHAsIHYsIGMpCQlfX2l4cDR4eF9pb3dyaXRlMzJfcmVwKHAsIHYsIGMpCi0KICNkZWZpbmUJaW9wb3J0X21hcChwb3J0LCBucikJCSgodm9pZCBfX2lvbWVtKikocG9ydCArIFBJT19PRkZTRVQpKQogI2RlZmluZQlpb3BvcnRfdW5tYXAoYWRkcikKLSNlbmRpZgkvLyAhQ09ORklHX1BDSQorI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KIAotI2VuZGlmCS8vICBfX0FTTV9BUk1fQVJDSF9JT19ICi0KKyNlbmRpZiAvKiBfX0FTTV9BUk1fQVJDSF9JT19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvaXJxcy5oIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL2lycXMuaAppbmRleCBmNGQ3NGRlLi43ZTZkNGNjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvaXJxcy5oCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9pcnFzLmgKQEAgLTE1LDcgKzE1LDYgQEAKICNpZm5kZWYgX0FSQ0hfSVhQNFhYX0lSUVNfSF8KICNkZWZpbmUgX0FSQ0hfSVhQNFhYX0lSUVNfSF8KIAotCiAjZGVmaW5lIElSUV9JWFA0WFhfTlBFQQkJMAogI2RlZmluZSBJUlFfSVhQNFhYX05QRUIJCTEKICNkZWZpbmUgSVJRX0lYUDRYWF9OUEVDCQkyCkBAIC01OSw2ICs1OCw5IEBACiAjZGVmaW5lIElSUV9JWFA0WFhfTUNVX0VDQwk2MQogI2RlZmluZSBJUlFfSVhQNFhYX0VYUF9QRQk2MgogCisjZGVmaW5lIF9JWFA0WFhfR1BJT19JUlEobikJKElSUV9JWFA0WFhfR1BJTyAjIyBuKQorI2RlZmluZSBJWFA0WFhfR1BJT19JUlEobikJX0lYUDRYWF9HUElPX0lSUShuKQorCiAvKgogICogT25seSBmaXJzdCAzMiBzb3VyY2VzIGFyZSB2YWxpZCBpZiBydW5uaW5nIG9uIElYUDQyeCBzeXN0ZW1zCiAgKi8KQEAgLTcwLDY5ICs3Miw0IEBACiAKICNkZWZpbmUJWFNDQUxFX1BNVV9JUlEJCShJUlFfSVhQNFhYX1hTQ0FMRV9QTVUpCiAKLS8qCi0gKiBJWERQNDI1IGJvYXJkIElSUXMKLSAqLwotI2RlZmluZQlJUlFfSVhEUDQyNV9QQ0lfSU5UQQlJUlFfSVhQNFhYX0dQSU8xMQotI2RlZmluZQlJUlFfSVhEUDQyNV9QQ0lfSU5UQglJUlFfSVhQNFhYX0dQSU8xMAotI2RlZmluZQlJUlFfSVhEUDQyNV9QQ0lfSU5UQwlJUlFfSVhQNFhYX0dQSU85Ci0jZGVmaW5lCUlSUV9JWERQNDI1X1BDSV9JTlRECUlSUV9JWFA0WFhfR1BJTzgKLQotLyoKLSAqIEdhdGV3b3JrcyBBdmlsYSBib2FyZCBJUlFzCi0gKi8KLSNkZWZpbmUJSVJRX0FWSUxBX1BDSV9JTlRBCUlSUV9JWFA0WFhfR1BJTzExCi0jZGVmaW5lCUlSUV9BVklMQV9QQ0lfSU5UQglJUlFfSVhQNFhYX0dQSU8xMAotI2RlZmluZQlJUlFfQVZJTEFfUENJX0lOVEMJSVJRX0lYUDRYWF9HUElPOQotI2RlZmluZQlJUlFfQVZJTEFfUENJX0lOVEQJSVJRX0lYUDRYWF9HUElPOAotCi0KLS8qCi0gKiBQclBNQzExMDAgQm9hcmQgSVJRcwotICovCi0jZGVmaW5lCUlSUV9QUlBNQzExMDBfUENJX0lOVEEJSVJRX0lYUDRYWF9HUElPMTEKLSNkZWZpbmUJSVJRX1BSUE1DMTEwMF9QQ0lfSU5UQglJUlFfSVhQNFhYX0dQSU8xMAotI2RlZmluZQlJUlFfUFJQTUMxMTAwX1BDSV9JTlRDCUlSUV9JWFA0WFhfR1BJTzkKLSNkZWZpbmUJSVJRX1BSUE1DMTEwMF9QQ0lfSU5URAlJUlFfSVhQNFhYX0dQSU84Ci0KLS8qCi0gKiBBREkgQ295b3RlIEJvYXJkIElSUXMKLSAqLwotI2RlZmluZQlJUlFfQ09ZT1RFX1BDSV9TTE9UMAlJUlFfSVhQNFhYX0dQSU82Ci0jZGVmaW5lCUlSUV9DT1lPVEVfUENJX1NMT1QxCUlSUV9JWFA0WFhfR1BJTzExCi0jZGVmaW5lCUlSUV9DT1lPVEVfSURFCQlJUlFfSVhQNFhYX0dQSU81Ci0KLS8qCi0gKiBOU0xVMiBib2FyZCBJUlFzCi0gKi8KLSNkZWZpbmUgICAgICAgIElSUV9OU0xVMl9QQ0lfSU5UQSAgICAgIElSUV9JWFA0WFhfR1BJTzExCi0jZGVmaW5lICAgICAgICBJUlFfTlNMVTJfUENJX0lOVEIgICAgICBJUlFfSVhQNFhYX0dQSU8xMAotI2RlZmluZSAgICAgICAgSVJRX05TTFUyX1BDSV9JTlRDICAgICAgSVJRX0lYUDRYWF9HUElPOQotCi0vKgotICogTkFTMTAwRCBib2FyZCBJUlFzCi0gKi8KLSNkZWZpbmUgICAgICAgIElSUV9OQVMxMDBEX1BDSV9JTlRBICAgIElSUV9JWFA0WFhfR1BJTzExCi0jZGVmaW5lICAgICAgICBJUlFfTkFTMTAwRF9QQ0lfSU5UQiAgICBJUlFfSVhQNFhYX0dQSU8xMAotI2RlZmluZSAgICAgICAgSVJRX05BUzEwMERfUENJX0lOVEMgICAgSVJRX0lYUDRYWF9HUElPOQotI2RlZmluZSAgICAgICAgSVJRX05BUzEwMERfUENJX0lOVEQgICAgSVJRX0lYUDRYWF9HUElPOAotI2RlZmluZSAgICAgICAgSVJRX05BUzEwMERfUENJX0lOVEUgICAgSVJRX0lYUDRYWF9HUElPNwotCi0vKgotICogRC1MaW5rIERTTS1HNjAwIFJldkEgYm9hcmQgSVJRcwotICovCi0jZGVmaW5lICAgICAgICBJUlFfRFNNRzYwMF9QQ0lfSU5UQSAgICBJUlFfSVhQNFhYX0dQSU8xMQotI2RlZmluZSAgICAgICAgSVJRX0RTTUc2MDBfUENJX0lOVEIgICAgSVJRX0lYUDRYWF9HUElPMTAKLSNkZWZpbmUgICAgICAgIElSUV9EU01HNjAwX1BDSV9JTlRDICAgIElSUV9JWFA0WFhfR1BJTzkKLSNkZWZpbmUgICAgICAgIElSUV9EU01HNjAwX1BDSV9JTlREICAgIElSUV9JWFA0WFhfR1BJTzgKLSNkZWZpbmUgICAgICAgIElSUV9EU01HNjAwX1BDSV9JTlRFICAgIElSUV9JWFA0WFhfR1BJTzcKLSNkZWZpbmUgICAgICAgIElSUV9EU01HNjAwX1BDSV9JTlRGICAgIElSUV9JWFA0WFhfR1BJTzYKLQotLyoKLSAqIEZyZWVjb20gRlNHLTMgQm9hcmQgSVJRcwotICovCi0jZGVmaW5lICAgICAgICBJUlFfRlNHX1BDSV9JTlRBICAgICAgICBJUlFfSVhQNFhYX0dQSU82Ci0jZGVmaW5lICAgICAgICBJUlFfRlNHX1BDSV9JTlRCICAgICAgICBJUlFfSVhQNFhYX0dQSU83Ci0jZGVmaW5lICAgICAgICBJUlFfRlNHX1BDSV9JTlRDICAgICAgICBJUlFfSVhQNFhYX0dQSU81Ci0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL2l4ZHA0MjUuaCBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9peGRwNDI1LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYWZlNjUuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL2l4ZHA0MjUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvaXhkcDQyNS5oCi0gKgotICogSVhEUDQyNSBwbGF0Zm9ybSBzcGVjaWZpYyBkZWZpbml0aW9ucwotICoKLSAqIEF1dGhvcjogRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBwbGV4aXR5Lm5ldD4KLSAqCi0gKiBDb3B5cmlnaHQgMjAwNCAoYykgTW9udGFWaXN0YSwgU29mdHdhcmUsIEluYy4gCi0gKiAKLSAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgCi0gKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgCi0gKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX0hBUkRXQVJFX0hfXwotI2Vycm9yICJEbyBub3QgaW5jbHVkZSB0aGlzIGRpcmVjdGx5LCBpbnN0ZWFkICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+IgotI2VuZGlmCi0KLSNkZWZpbmUJSVhEUDQyNV9TREFfUElOCQk3Ci0jZGVmaW5lCUlYRFA0MjVfU0NMX1BJTgkJNgotCi0vKgotICogSVhEUDQyNSBQQ0kgSVJRcwotICovCi0jZGVmaW5lIElYRFA0MjVfUENJX01BWF9ERVYJNAotI2RlZmluZSBJWERQNDI1X1BDSV9JUlFfTElORVMJNAotCi0KLS8qIFBDSSBjb250cm9sbGVyIEdQSU8gdG8gSVJRIHBpbiBtYXBwaW5ncyAqLwotI2RlZmluZSBJWERQNDI1X1BDSV9JTlRBX1BJTgkxMQotI2RlZmluZSBJWERQNDI1X1BDSV9JTlRCX1BJTgkxMAotI2RlZmluZQlJWERQNDI1X1BDSV9JTlRDX1BJTgk5Ci0jZGVmaW5lCUlYRFA0MjVfUENJX0lOVERfUElOCTgKLQotLyogTkFORCBGbGFzaCBwaW5zICovCi0jZGVmaW5lCUlYRFA0MjVfTkFORF9OQ0VfUElOCTEyCi0KLSNkZWZpbmUJSVhEUDQyNV9OQU5EX0NNRF9CWVRFCTB4MDEKLSNkZWZpbmUJSVhEUDQyNV9OQU5EX0FERFJfQllURQkweDAyCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvbmFzMTAwZC5oIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL25hczEwMGQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc3MWQ2Mi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvbmFzMTAwZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9uYXMxMDBkLmgKLSAqCi0gKiBOQVMxMDBEIHBsYXRmb3JtIHNwZWNpZmljIGRlZmluaXRpb25zCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFRvd2VyIFRlY2hub2xvZ2llcwotICoKLSAqIEF1dGhvcjogQWxlc3NhbmRybyBadW1tbyA8YS56dW1tb0B0b3dlcnRlY2guaXQ+Ci0gKgotICogYmFzZWQgb24gaXhkcDQyNS5oOgotICoJQ29weXJpZ2h0IDIwMDQgKGMpIE1vbnRhVmlzdGEsIFNvZnR3YXJlLCBJbmMuCi0gKgotICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKLSAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfSEFSRFdBUkVfSF9fCi0jZXJyb3IgIkRvIG5vdCBpbmNsdWRlIHRoaXMgZGlyZWN0bHksIGluc3RlYWQgI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4iCi0jZW5kaWYKLQotI2RlZmluZSBOQVMxMDBEX1NEQV9QSU4JCTUKLSNkZWZpbmUgTkFTMTAwRF9TQ0xfUElOCQk2Ci0KLS8qCi0gKiBOQVMxMDBEIFBDSSBJUlFzCi0gKi8KLSNkZWZpbmUgTkFTMTAwRF9QQ0lfTUFYX0RFVgkzCi0jZGVmaW5lIE5BUzEwMERfUENJX0lSUV9MSU5FUwkzCi0KLQotLyogUENJIGNvbnRyb2xsZXIgR1BJTyB0byBJUlEgcGluIG1hcHBpbmdzICovCi0jZGVmaW5lIE5BUzEwMERfUENJX0lOVEFfUElOCTExCi0jZGVmaW5lIE5BUzEwMERfUENJX0lOVEJfUElOCTEwCi0jZGVmaW5lIE5BUzEwMERfUENJX0lOVENfUElOCTkKLSNkZWZpbmUgTkFTMTAwRF9QQ0lfSU5URF9QSU4JOAotI2RlZmluZSBOQVMxMDBEX1BDSV9JTlRFX1BJTgk3Ci0KLS8qIEJ1dHRvbnMgKi8KLQotI2RlZmluZSBOQVMxMDBEX1BCX0dQSU8gICAgICAgICAxNCAgIC8qIHBvd2VyIGJ1dHRvbiAqLwotI2RlZmluZSBOQVMxMDBEX1JCX0dQSU8gICAgICAgICA0ICAgIC8qIHJlc2V0IGJ1dHRvbiAqLwotCi0vKiBQb3dlciBjb250cm9sICovCi0KLSNkZWZpbmUgTkFTMTAwRF9QT19HUElPICAgICAgICAgMTIgICAvKiBwb3dlciBvZmYgKi8KLQotLyogTEVEcyAqLwotCi0jZGVmaW5lIE5BUzEwMERfTEVEX1dMQU5fR1BJTwkwCi0jZGVmaW5lIE5BUzEwMERfTEVEX0RJU0tfR1BJTwkzCi0jZGVmaW5lIE5BUzEwMERfTEVEX1BXUl9HUElPCTE1CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvbnBlLmggYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvbnBlLmgKaW5kZXggMzdkMDUxMS4uZTMyMGRiMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL25wZS5oCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9ucGUuaApAQCAtMzMsNyArMzMsNyBAQAogaW50IG5wZV9yZWN2X21lc3NhZ2Uoc3RydWN0IG5wZSAqbnBlLCB2b2lkICptc2csIGNvbnN0IGNoYXIgKndoYXQpOwogaW50IG5wZV9zZW5kX3JlY3ZfbWVzc2FnZShzdHJ1Y3QgbnBlICpucGUsIHZvaWQgKm1zZywgY29uc3QgY2hhciAqd2hhdCk7CiBpbnQgbnBlX2xvYWRfZmlybXdhcmUoc3RydWN0IG5wZSAqbnBlLCBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZGV2aWNlICpkZXYpOwotc3RydWN0IG5wZSAqbnBlX3JlcXVlc3QoaW50IGlkKTsKK3N0cnVjdCBucGUgKm5wZV9yZXF1ZXN0KHVuc2lnbmVkIGlkKTsKIHZvaWQgbnBlX3JlbGVhc2Uoc3RydWN0IG5wZSAqbnBlKTsKIAogI2VuZGlmIC8qIF9fSVhQNFhYX05QRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvbnNsdTIuaCBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9uc2x1Mi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWQwMGFkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9uc2x1Mi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9uc2x1Mi5oCi0gKgotICogTlNMVTIgcGxhdGZvcm0gc3BlY2lmaWMgZGVmaW5pdGlvbnMKLSAqCi0gKiBBdXRob3I6IE1hcmsgUmFrZXMgPG1yYWtlcyBBVCBtYWMuY29tPgotICogTWFpbnRhaW5lcnM6IGh0dHA6Ly93d3cubnNsdTItbGludXgub3JnCi0gKgotICogYmFzZWQgb24gaXhkcDQyNS5oOgotICoJQ29weXJpZ2h0IDIwMDQgKGMpIE1vbnRhVmlzdGEsIFNvZnR3YXJlLCBJbmMuCi0gKgotICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKLSAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfSEFSRFdBUkVfSF9fCi0jZXJyb3IgIkRvIG5vdCBpbmNsdWRlIHRoaXMgZGlyZWN0bHksIGluc3RlYWQgI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4iCi0jZW5kaWYKLQotI2RlZmluZSBOU0xVMl9TREFfUElOCQk3Ci0jZGVmaW5lIE5TTFUyX1NDTF9QSU4JCTYKLQotLyoKLSAqIE5TTFUyIFBDSSBJUlFzCi0gKi8KLSNkZWZpbmUgTlNMVTJfUENJX01BWF9ERVYJMwotI2RlZmluZSBOU0xVMl9QQ0lfSVJRX0xJTkVTCTMKLQotCi0vKiBQQ0kgY29udHJvbGxlciBHUElPIHRvIElSUSBwaW4gbWFwcGluZ3MgKi8KLSNkZWZpbmUgTlNMVTJfUENJX0lOVEFfUElOCTExCi0jZGVmaW5lIE5TTFUyX1BDSV9JTlRCX1BJTgkxMAotI2RlZmluZSBOU0xVMl9QQ0lfSU5UQ19QSU4JOQotI2RlZmluZSBOU0xVMl9QQ0lfSU5URF9QSU4JOAotCi0vKiBOU0xVMiBUaW1lciAqLwotI2RlZmluZSBOU0xVMl9GUkVRIDY2MDAwMDAwCi0KLS8qIEJ1dHRvbnMgKi8KLQotI2RlZmluZSBOU0xVMl9QQl9HUElPCQk1CS8qIHBvd2VyIGJ1dHRvbiAqLwotI2RlZmluZSBOU0xVMl9QT19HUElPCQk4CS8qIHBvd2VyIG9mZiAqLwotI2RlZmluZSBOU0xVMl9SQl9HUElPCQkxMgkvKiByZXNldCBidXR0b24gKi8KLQotLyogQnV6emVyICovCi0KLSNkZWZpbmUgTlNMVTJfR1BJT19CVVpaCQk0Ci0KLS8qIExFRHMgKi8KLQotI2RlZmluZSBOU0xVMl9MRURfUkVEX0dQSU8JMAotI2RlZmluZSBOU0xVMl9MRURfR1JOX0dQSU8JMQotI2RlZmluZSBOU0xVMl9MRURfRElTSzFfR1BJTwkzCi0jZGVmaW5lIE5TTFUyX0xFRF9ESVNLMl9HUElPCTIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9wcnBtYzExMDAuaCBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9wcnBtYzExMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcyNzRhMi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvcHJwbWMxMTAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL3BycG1jMTEwMC5oCi0gKgotICogTW90b3JvbGxhIFByUE1DMTEwMCBwbGF0Zm9ybSBzcGVjaWZpYyBkZWZpbml0aW9ucwotICoKLSAqIEF1dGhvcjogRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBwbGV4aXR5Lm5ldD4KLSAqCi0gKiBDb3B5cmlnaHQgMjAwNCAoYykgTW9udGFWaXN0YSwgU29mdHdhcmUsIEluYy4gCi0gKiAKLSAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgCi0gKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgCi0gKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX0hBUkRXQVJFX0hfXwotI2Vycm9yICJEbyBub3QgaW5jbHVkZSB0aGlzIGRpcmVjdGx5LCBpbnN0ZWFkICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+IgotI2VuZGlmCi0KLSNkZWZpbmUJUFJQTUMxMTAwX0ZMQVNIX0JBU0UJSVhQNFhYX0VYUF9CVVNfQ1MwX0JBU0VfUEhZUwotI2RlZmluZQlQUlBNQzExMDBfRkxBU0hfU0laRQlJWFA0WFhfRVhQX0JVU19DU1hfUkVHSU9OX1NJWkUKLQotI2RlZmluZQlQUlBNQzExMDBfUENJX01JTl9ERVZJRAkxMAotI2RlZmluZQlQUlBNQzExMDBfUENJX01BWF9ERVZJRAkxNgotI2RlZmluZQlQUlBNQzExMDBfUENJX0lSUV9MSU5FUwk0Ci0KLQotLyogUENJIGNvbnRyb2xsZXIgR1BJTyB0byBJUlEgcGluIG1hcHBpbmdzICovCi0jZGVmaW5lIFBSUE1DMTEwMF9QQ0lfSU5UQV9QSU4JMTEKLSNkZWZpbmUgUFJQTUMxMTAwX1BDSV9JTlRCX1BJTgkxMAotI2RlZmluZQlQUlBNQzExMDBfUENJX0lOVENfUElOCTkKLSNkZWZpbmUJUFJQTUMxMTAwX1BDSV9JTlREX1BJTgk4Ci0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL3RpbWV4LmggYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvdGltZXguaAppbmRleCA4OWNlM2VlLi4yYzNmOTNjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvdGltZXguaAorKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvdGltZXguaApAQCAtMTAsNiArMTAsNiBAQAogICogNjYuNjYuLi4gTUh6LiBXZSBkbyBhIGNvbnZ1bHRlZCBjYWxjdWxhdGlvbiBvZiBDTE9DS19USUNLX1JBVEUgYi9jIHRoZQogICogdGltZXIgcmVnaXN0ZXIgaWdub3JlcyB0aGUgYm90dG9tIDIgYml0cyBvZiB0aGUgTEFUQ0ggdmFsdWUuCiAgKi8KLSNkZWZpbmUgRlJFUSA2NjY2NjY2NgorI2RlZmluZSBGUkVRIDY2NjY2MDAwCiAjZGVmaW5lIENMT0NLX1RJQ0tfUkFURSAoKChGUkVRIC8gSFogJiB+SVhQNFhYX09TVF9SRUxPQURfTUFTSykgKyAxKSAqIEhaKQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwNDI1LXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcDQyNS1wY2kuYwppbmRleCA2NGMyOWFhLi4xYmExNjVhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwNDI1LXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtcGNpLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcDQyNS1wY2kuYyAKKyAqIGFyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtcGNpLmMKICAqCiAgKiBJWERQNDI1IGJvYXJkLWxldmVsIFBDSSBpbml0aWFsaXphdGlvbgogICoKQEAgLTE5LDM5ICsxOSw0MyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotCiAjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCisjZGVmaW5lIE1BWF9ERVYJCTQKKyNkZWZpbmUgSVJRX0xJTkVTCTQKKworLyogUENJIGNvbnRyb2xsZXIgR1BJTyB0byBJUlEgcGluIG1hcHBpbmdzICovCisjZGVmaW5lIElOVEEJCTExCisjZGVmaW5lIElOVEIJCTEwCisjZGVmaW5lIElOVEMJCTkKKyNkZWZpbmUgSU5URAkJOAorCisKIHZvaWQgX19pbml0IGl4ZHA0MjVfcGNpX3ByZWluaXQodm9pZCkKIHsKLQlzZXRfaXJxX3R5cGUoSVJRX0lYRFA0MjVfUENJX0lOVEEsIElSUV9UWVBFX0xFVkVMX0xPVyk7Ci0Jc2V0X2lycV90eXBlKElSUV9JWERQNDI1X1BDSV9JTlRCLCBJUlFfVFlQRV9MRVZFTF9MT1cpOwotCXNldF9pcnFfdHlwZShJUlFfSVhEUDQyNV9QQ0lfSU5UQywgSVJRX1RZUEVfTEVWRUxfTE9XKTsKLQlzZXRfaXJxX3R5cGUoSVJRX0lYRFA0MjVfUENJX0lOVEQsIElSUV9UWVBFX0xFVkVMX0xPVyk7Ci0KKwlzZXRfaXJxX3R5cGUoSVhQNFhYX0dQSU9fSVJRKElOVEEpLCBJUlFfVFlQRV9MRVZFTF9MT1cpOworCXNldF9pcnFfdHlwZShJWFA0WFhfR1BJT19JUlEoSU5UQiksIElSUV9UWVBFX0xFVkVMX0xPVyk7CisJc2V0X2lycV90eXBlKElYUDRYWF9HUElPX0lSUShJTlRDKSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKKwlzZXRfaXJxX3R5cGUoSVhQNFhYX0dQSU9fSVJRKElOVEQpLCBJUlFfVFlQRV9MRVZFTF9MT1cpOwogCWl4cDR4eF9wY2lfcHJlaW5pdCgpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBpeGRwNDI1X21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewotCXN0YXRpYyBpbnQgcGNpX2lycV90YWJsZVtJWERQNDI1X1BDSV9JUlFfTElORVNdID0gewotCQlJUlFfSVhEUDQyNV9QQ0lfSU5UQSwKLQkJSVJRX0lYRFA0MjVfUENJX0lOVEIsCi0JCUlSUV9JWERQNDI1X1BDSV9JTlRDLAotCQlJUlFfSVhEUDQyNV9QQ0lfSU5URAorCXN0YXRpYyBpbnQgcGNpX2lycV90YWJsZVtJUlFfTElORVNdID0geworCQlJWFA0WFhfR1BJT19JUlEoSU5UQSksCisJCUlYUDRYWF9HUElPX0lSUShJTlRCKSwKKwkJSVhQNFhYX0dQSU9fSVJRKElOVEMpLAorCQlJWFA0WFhfR1BJT19JUlEoSU5URCkKIAl9OwogCi0JaW50IGlycSA9IC0xOworCWlmIChzbG90ID49IDEgJiYgc2xvdCA8PSBNQVhfREVWICYmIHBpbiA+PSAxICYmIHBpbiA8PSBJUlFfTElORVMpCisJCXJldHVybiBwY2lfaXJxX3RhYmxlWyhzbG90ICsgcGluIC0gMikgJSA0XTsKIAotCWlmIChzbG90ID49IDEgJiYgc2xvdCA8PSBJWERQNDI1X1BDSV9NQVhfREVWICYmIAotCQlwaW4gPj0gMSAmJiBwaW4gPD0gSVhEUDQyNV9QQ0lfSVJRX0xJTkVTKSB7Ci0JCWlycSA9IHBjaV9pcnFfdGFibGVbKHNsb3QgKyBwaW4gLSAyKSAlIDRdOwotCX0KLQotCXJldHVybiBpcnE7CisJcmV0dXJuIC0xOwogfQogCiBzdHJ1Y3QgaHdfcGNpIGl4ZHA0MjVfcGNpIF9faW5pdGRhdGEgPSB7CkBAIC03Miw0ICs3NiwzIEBACiB9CiAKIHN1YnN5c19pbml0Y2FsbChpeGRwNDI1X3BjaV9pbml0KTsKLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcDQyNS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcDQyNS1zZXR1cC5jCmluZGV4IGY0YTBjMWIuLmJiYjc2ODkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwNDI1LXNldHVwLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcDQyNS1zZXR1cC5jCiAgKgotICogSVhEUDQyNS9JWENEUDExMDAgYm9hcmQtc2V0dXAgCisgKiBJWERQNDI1L0lYQ0RQMTEwMCBib2FyZC1zZXR1cAogICoKICAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA1IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KICAqCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+CkBAIC0zMSw2ICszMCwxNSBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgogCisjZGVmaW5lIElYRFA0MjVfU0RBX1BJTgkJNworI2RlZmluZSBJWERQNDI1X1NDTF9QSU4JCTYKKworLyogTkFORCBGbGFzaCBwaW5zICovCisjZGVmaW5lIElYRFA0MjVfTkFORF9OQ0VfUElOCTEyCisKKyNkZWZpbmUgSVhEUDQyNV9OQU5EX0NNRF9CWVRFCTB4MDEKKyNkZWZpbmUgSVhEUDQyNV9OQU5EX0FERFJfQllURQkweDAyCisKIHN0YXRpYyBzdHJ1Y3QgZmxhc2hfcGxhdGZvcm1fZGF0YSBpeGRwNDI1X2ZsYXNoX2RhdGEgPSB7CiAJLm1hcF9uYW1lCT0gImNmaV9wcm9iZSIsCiAJLndpZHRoCQk9IDIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9peHA0eHhfbnBlLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9peHA0eHhfbnBlLmMKaW5kZXggNDdhYzY5Yy4uZThiYjI1NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhwNHh4X25wZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4cDR4eF9ucGUuYwpAQCAtNjY1LDcgKzY2NSw3IEBACiB9CiAKIAotc3RydWN0IG5wZSAqbnBlX3JlcXVlc3QoaW50IGlkKQorc3RydWN0IG5wZSAqbnBlX3JlcXVlc3QodW5zaWduZWQgaWQpCiB7CiAJaWYgKGlkIDwgTlBFX0NPVU5UKQogCQlpZiAobnBlX3RhYltpZF0udmFsaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9uYXMxMDBkLXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbmFzMTAwZC1wY2kuYwppbmRleCAxMDg4NDI2Li5kMGNlYTM0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9uYXMxMDBkLXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L25hczEwMGQtcGNpLmMKQEAgLTE4LDM3ICsxOCw0MiBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLQogI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKKyNkZWZpbmUgTUFYX0RFVgkJMworI2RlZmluZSBJUlFfTElORVMJMworCisvKiBQQ0kgY29udHJvbGxlciBHUElPIHRvIElSUSBwaW4gbWFwcGluZ3MgKi8KKyNkZWZpbmUgSU5UQQkJMTEKKyNkZWZpbmUgSU5UQgkJMTAKKyNkZWZpbmUgSU5UQwkJOQorI2RlZmluZSBJTlRECQk4CisjZGVmaW5lIElOVEUJCTcKKwogdm9pZCBfX2luaXQgbmFzMTAwZF9wY2lfcHJlaW5pdCh2b2lkKQogewotCXNldF9pcnFfdHlwZShJUlFfTkFTMTAwRF9QQ0lfSU5UQSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKLQlzZXRfaXJxX3R5cGUoSVJRX05BUzEwMERfUENJX0lOVEIsIElSUV9UWVBFX0xFVkVMX0xPVyk7Ci0Jc2V0X2lycV90eXBlKElSUV9OQVMxMDBEX1BDSV9JTlRDLCBJUlFfVFlQRV9MRVZFTF9MT1cpOwotCXNldF9pcnFfdHlwZShJUlFfTkFTMTAwRF9QQ0lfSU5URCwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKLQlzZXRfaXJxX3R5cGUoSVJRX05BUzEwMERfUENJX0lOVEUsIElSUV9UWVBFX0xFVkVMX0xPVyk7Ci0KKwlzZXRfaXJxX3R5cGUoSVhQNFhYX0dQSU9fSVJRKElOVEEpLCBJUlFfVFlQRV9MRVZFTF9MT1cpOworCXNldF9pcnFfdHlwZShJWFA0WFhfR1BJT19JUlEoSU5UQiksIElSUV9UWVBFX0xFVkVMX0xPVyk7CisJc2V0X2lycV90eXBlKElYUDRYWF9HUElPX0lSUShJTlRDKSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKKwlzZXRfaXJxX3R5cGUoSVhQNFhYX0dQSU9fSVJRKElOVEQpLCBJUlFfVFlQRV9MRVZFTF9MT1cpOworCXNldF9pcnFfdHlwZShJWFA0WFhfR1BJT19JUlEoSU5URSksIElSUV9UWVBFX0xFVkVMX0xPVyk7CiAJaXhwNHh4X3BjaV9wcmVpbml0KCk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IG5hczEwMGRfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7Ci0Jc3RhdGljIGludCBwY2lfaXJxX3RhYmxlW05BUzEwMERfUENJX01BWF9ERVZdW05BUzEwMERfUENJX0lSUV9MSU5FU10gPQotCXsKLQkJeyBJUlFfTkFTMTAwRF9QQ0lfSU5UQSwgLTEsIC0xIH0sCi0JCXsgSVJRX05BUzEwMERfUENJX0lOVEIsIC0xLCAtMSB9LAotCQl7IElSUV9OQVMxMDBEX1BDSV9JTlRDLCBJUlFfTkFTMTAwRF9QQ0lfSU5URCwgSVJRX05BUzEwMERfUENJX0lOVEUgfSwKKwlzdGF0aWMgaW50IHBjaV9pcnFfdGFibGVbTUFYX0RFVl1bSVJRX0xJTkVTXSA9IHsKKwkJeyBJWFA0WFhfR1BJT19JUlEoSU5UQSksIC0xLCAtMSB9LAorCQl7IElYUDRYWF9HUElPX0lSUShJTlRCKSwgLTEsIC0xIH0sCisJCXsgSVhQNFhYX0dQSU9fSVJRKElOVEMpLCBJWFA0WFhfR1BJT19JUlEoSU5URCksCisJCSAgSVhQNFhYX0dQSU9fSVJRKElOVEUpIH0sCiAJfTsKIAotCWludCBpcnEgPSAtMTsKKwlpZiAoc2xvdCA+PSAxICYmIHNsb3QgPD0gTUFYX0RFViAmJiBwaW4gPj0gMSAmJiBwaW4gPD0gSVJRX0xJTkVTKQorCQlyZXR1cm4gcGNpX2lycV90YWJsZVtzbG90IC0gMV1bcGluIC0gMV07CiAKLQlpZiAoc2xvdCA+PSAxICYmIHNsb3QgPD0gTkFTMTAwRF9QQ0lfTUFYX0RFViAmJgotCQlwaW4gPj0gMSAmJiBwaW4gPD0gTkFTMTAwRF9QQ0lfSVJRX0xJTkVTKQotCQlpcnEgPSBwY2lfaXJxX3RhYmxlW3Nsb3QtMV1bcGluLTFdOwotCi0JcmV0dXJuIGlycTsKKwlyZXR1cm4gLTE7CiB9CiAKIHN0cnVjdCBod19wY2kgX19pbml0ZGF0YSBuYXMxMDBkX3BjaSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L25hczEwMGQtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L25hczEwMGQtc2V0dXAuYwppbmRleCA5MjFjOTQ3Li5lM2VlODgwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9uYXMxMDBkLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbmFzMTAwZC1zZXR1cC5jCkBAIC0yOSwxMiArMjksMjYgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgogI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAKKyNkZWZpbmUgTkFTMTAwRF9TREFfUElOCQk1CisjZGVmaW5lIE5BUzEwMERfU0NMX1BJTgkJNgorCisvKiBCdXR0b25zICovCisjZGVmaW5lIE5BUzEwMERfUEJfR1BJTyAgICAgICAgIDE0ICAgLyogcG93ZXIgYnV0dG9uICovCisjZGVmaW5lIE5BUzEwMERfUkJfR1BJTyAgICAgICAgIDQgICAgLyogcmVzZXQgYnV0dG9uICovCisKKy8qIFBvd2VyIGNvbnRyb2wgKi8KKyNkZWZpbmUgTkFTMTAwRF9QT19HUElPICAgICAgICAgMTIgICAvKiBwb3dlciBvZmYgKi8KKworLyogTEVEcyAqLworI2RlZmluZSBOQVMxMDBEX0xFRF9XTEFOX0dQSU8JMAorI2RlZmluZSBOQVMxMDBEX0xFRF9ESVNLX0dQSU8JMworI2RlZmluZSBOQVMxMDBEX0xFRF9QV1JfR1BJTwkxNQorCiBzdGF0aWMgc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgbmFzMTAwZF9mbGFzaF9kYXRhID0gewogCS5tYXBfbmFtZQkJPSAiY2ZpX3Byb2JlIiwKIAkud2lkdGgJCQk9IDIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9uc2x1Mi1wY2kuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L25zbHUyLXBjaS5jCmluZGV4IDQ0MjliODQuLjFlYjVhOTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L25zbHUyLXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L25zbHUyLXBjaS5jCkBAIC0xOCwzNSArMTgsMzggQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0KICNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCisjZGVmaW5lIE1BWF9ERVYJCTMKKyNkZWZpbmUgSVJRX0xJTkVTCTMKKworLyogUENJIGNvbnRyb2xsZXIgR1BJTyB0byBJUlEgcGluIG1hcHBpbmdzICovCisjZGVmaW5lIElOVEEJCTExCisjZGVmaW5lIElOVEIJCTEwCisjZGVmaW5lIElOVEMJCTkKKyNkZWZpbmUgSU5URAkJOAorCiB2b2lkIF9faW5pdCBuc2x1Ml9wY2lfcHJlaW5pdCh2b2lkKQogewotCXNldF9pcnFfdHlwZShJUlFfTlNMVTJfUENJX0lOVEEsIElSUV9UWVBFX0xFVkVMX0xPVyk7Ci0Jc2V0X2lycV90eXBlKElSUV9OU0xVMl9QQ0lfSU5UQiwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKLQlzZXRfaXJxX3R5cGUoSVJRX05TTFUyX1BDSV9JTlRDLCBJUlFfVFlQRV9MRVZFTF9MT1cpOwotCisJc2V0X2lycV90eXBlKElYUDRYWF9HUElPX0lSUShJTlRBKSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKKwlzZXRfaXJxX3R5cGUoSVhQNFhYX0dQSU9fSVJRKElOVEIpLCBJUlFfVFlQRV9MRVZFTF9MT1cpOworCXNldF9pcnFfdHlwZShJWFA0WFhfR1BJT19JUlEoSU5UQyksIElSUV9UWVBFX0xFVkVMX0xPVyk7CiAJaXhwNHh4X3BjaV9wcmVpbml0KCk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IG5zbHUyX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewotCXN0YXRpYyBpbnQgcGNpX2lycV90YWJsZVtOU0xVMl9QQ0lfSVJRX0xJTkVTXSA9IHsKLQkJSVJRX05TTFUyX1BDSV9JTlRBLAotCQlJUlFfTlNMVTJfUENJX0lOVEIsCi0JCUlSUV9OU0xVMl9QQ0lfSU5UQywKKwlzdGF0aWMgaW50IHBjaV9pcnFfdGFibGVbSVJRX0xJTkVTXSA9IHsKKwkJSVhQNFhYX0dQSU9fSVJRKElOVEEpLAorCQlJWFA0WFhfR1BJT19JUlEoSU5UQiksCisJCUlYUDRYWF9HUElPX0lSUShJTlRDKSwKIAl9OwogCi0JaW50IGlycSA9IC0xOworCWlmIChzbG90ID49IDEgJiYgc2xvdCA8PSBNQVhfREVWICYmIHBpbiA+PSAxICYmIHBpbiA8PSBJUlFfTElORVMpCisJCXJldHVybiBwY2lfaXJxX3RhYmxlWyhzbG90ICsgcGluIC0gMikgJSBJUlFfTElORVNdOwogCi0JaWYgKHNsb3QgPj0gMSAmJiBzbG90IDw9IE5TTFUyX1BDSV9NQVhfREVWICYmCi0JCXBpbiA+PSAxICYmIHBpbiA8PSBOU0xVMl9QQ0lfSVJRX0xJTkVTKSB7Ci0JCQlpcnEgPSBwY2lfaXJxX3RhYmxlWyhzbG90ICsgcGluIC0gMikgJSBOU0xVMl9QQ0lfSVJRX0xJTkVTXTsKLQl9Ci0KLQlyZXR1cm4gaXJxOworCXJldHVybiAtMTsKIH0KIAogc3RydWN0IGh3X3BjaSBfX2luaXRkYXRhIG5zbHUyX3BjaSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L25zbHUyLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9uc2x1Mi1zZXR1cC5jCmluZGV4IGZmNmEwOGQuLmMxNGUwMDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L25zbHUyLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbnNsdTItc2V0dXAuYwpAQCAtMjYsMTMgKzI2LDMyIEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWdwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgotCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CiAjaW5jbHVkZSA8YXNtL2dwaW8uaD4KIAorI2RlZmluZSBOU0xVMl9TREFfUElOCQk3CisjZGVmaW5lIE5TTFUyX1NDTF9QSU4JCTYKKworLyogTlNMVTIgVGltZXIgKi8KKyNkZWZpbmUgTlNMVTJfRlJFUSA2NjAwMDAwMAorCisvKiBCdXR0b25zICovCisjZGVmaW5lIE5TTFUyX1BCX0dQSU8JCTUJLyogcG93ZXIgYnV0dG9uICovCisjZGVmaW5lIE5TTFUyX1BPX0dQSU8JCTgJLyogcG93ZXIgb2ZmICovCisjZGVmaW5lIE5TTFUyX1JCX0dQSU8JCTEyCS8qIHJlc2V0IGJ1dHRvbiAqLworCisvKiBCdXp6ZXIgKi8KKyNkZWZpbmUgTlNMVTJfR1BJT19CVVpaCQk0CisKKy8qIExFRHMgKi8KKyNkZWZpbmUgTlNMVTJfTEVEX1JFRF9HUElPCTAKKyNkZWZpbmUgTlNMVTJfTEVEX0dSTl9HUElPCTEKKyNkZWZpbmUgTlNMVTJfTEVEX0RJU0sxX0dQSU8JMworI2RlZmluZSBOU0xVMl9MRURfRElTSzJfR1BJTwkyCisKIHN0YXRpYyBzdHJ1Y3QgZmxhc2hfcGxhdGZvcm1fZGF0YSBuc2x1Ml9mbGFzaF9kYXRhID0gewogCS5tYXBfbmFtZQkJPSAiY2ZpX3Byb2JlIiwKIAkud2lkdGgJCQk9IDIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvY2xvY2tzLmMgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvY2xvY2tzLmMKaW5kZXggNjE4MmY1NC4uZmNhZjg3NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2Nsb2Nrcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9jbG9ja3MuYwpAQCAtNyw4ICs3LDYgQEAKICAqICB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgogICovCi0KLSNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvY2xvY2tzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CkBAIC0zMSwxMiArMjksNiBAQAogI2RlZmluZSBIQ0xLRElWKGMpCSgoKGMpID4+ICAwKSAmIDB4MDIpCiAjZGVmaW5lIFBDTEtESVYoYykJKCgoYykgPj4gMTYpICYgMHgwMykKIAotdW5zaWduZWQgaW50IGNwdWZyZXFfZ2V0ICh1bnNpZ25lZCBpbnQgY3B1KSAvKiBpbiBrSHogKi8KLXsKLQlyZXR1cm4gZmNsa2ZyZXFfZ2V0ICgpLzEwMDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGNwdWZyZXFfZ2V0KTsKLQogdW5zaWduZWQgaW50IGZjbGtmcmVxX2dldCAodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgY2xrc2V0ID0gQ1NDX0NMS1NFVDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLW1zbS9LY29uZmlnCmluZGV4IGQxNDBhYmMuLmY3ODAwODYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vS2NvbmZpZwpAQCAtMyw2ICszLDMwIEBACiBjb21tZW50ICJNU00gQm9hcmQgVHlwZSIKIAlkZXBlbmRzIG9uIEFSQ0hfTVNNCiAKK2NvbmZpZyBNU01fREVCVUdfVUFSVAorCWludAorCWRlZmF1bHQgMSBpZiBNU01fREVCVUdfVUFSVDEKKwlkZWZhdWx0IDIgaWYgTVNNX0RFQlVHX1VBUlQyCisJZGVmYXVsdCAzIGlmIE1TTV9ERUJVR19VQVJUMworCitjaG9pY2UKKwlwcm9tcHQgIkRlYnVnIFVBUlQiCisKKwlkZWZhdWx0IE1TTV9ERUJVR19VQVJUX05PTkUKKworCWNvbmZpZyBNU01fREVCVUdfVUFSVF9OT05FCisJCWJvb2wgIk5vbmUiCisKKwljb25maWcgTVNNX0RFQlVHX1VBUlQxCisJCWJvb2wgIlVBUlQxIgorCisJY29uZmlnIE1TTV9ERUJVR19VQVJUMgorCQlib29sICJVQVJUMiIKKworCWNvbmZpZyBNU01fREVCVUdfVUFSVDMKKwkJYm9vbCAiVUFSVDMiCitlbmRjaG9pY2UKKwogY29uZmlnIE1BQ0hfSEFMSUJVVAogCWRlcGVuZHMgb24gQVJDSF9NU00KIAlkZWZhdWx0IHkKQEAgLTEwLDQgKzM0LDEwIEBACiAJaGVscAogCSAgU3VwcG9ydCBmb3IgdGhlIFF1YWxjb21tIFNVUkY3MjAxQSBldmFsIGJvYXJkLgogCitjb25maWcgTUFDSF9UUk9VVAorCWRlZmF1bHQgeQorCWJvb2wgIkhUQyBEcmVhbSAoYWthIHRyb3V0KSIKKwloZWxwCisJICBTdXBwb3J0IGZvciB0aGUgSFRDIERyZWFtLCBULU1vYmlsZSBHMSwgQW5kcm9pZCBBRFAxIGRldmljZXMuCisKIGVuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtbXNtL01ha2VmaWxlCmluZGV4IDFhYTQ3MDAuLjkxZTZmNWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL01ha2VmaWxlCkBAIC02LDMgKzYsNCBAQAogCiBvYmotJChDT05GSUdfTUFDSF9IQUxJQlVUKSArPSBib2FyZC1oYWxpYnV0Lm8KIAorb2JqLSQoQ09ORklHX01BQ0hfVFJPVVQpICs9IGJvYXJkLWRyZWFtLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLWRyZWFtLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1kcmVhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYWZhODUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1kcmVhbS5jCkBAIC0wLDAgKzEsOTMgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLWRyZWFtLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlLCBJbmMuCisgKiBBdXRob3I6IEJyaWFuIFN3ZXRsYW5kIDxzd2V0bGFuZEBnb29nbGUuY29tPgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKworI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9tc21faW9tYXAuaD4KKworI2luY2x1ZGUgImRldmljZXMuaCIKKyNpbmNsdWRlICJib2FyZC1kcmVhbS5oIgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJm1zbV9kZXZpY2VfdWFydDMsCisJJm1zbV9kZXZpY2Vfc21kLAorCSZtc21fZGV2aWNlX25hbmQsCisJJm1zbV9kZXZpY2VfaHN1c2IsCisJJm1zbV9kZXZpY2VfaTJjLAorfTsKKworZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgbXNtX3RpbWVyOworCitzdGF0aWMgdm9pZCBfX2luaXQgdHJvdXRfaW5pdF9pcnEodm9pZCkKK3sKKwltc21faW5pdF9pcnEoKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHRyb3V0X2ZpeHVwKHN0cnVjdCBtYWNoaW5lX2Rlc2MgKmRlc2MsIHN0cnVjdCB0YWcgKnRhZ3MsCisJCQkJY2hhciAqKmNtZGxpbmUsIHN0cnVjdCBtZW1pbmZvICptaSkKK3sKKwltaS0+bnJfYmFua3MgPSAxOworCW1pLT5iYW5rWzBdLnN0YXJ0ID0gUEhZU19PRkZTRVQ7CisJbWktPmJhbmtbMF0ubm9kZSA9IFBIWVNfVE9fTklEKFBIWVNfT0ZGU0VUKTsKKwltaS0+YmFua1swXS5zaXplID0gKDEwMSoxMDI0KjEwMjQpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgdHJvdXRfaW5pdCh2b2lkKQoreworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOworfQorCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHRyb3V0X2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworCXsKKwkJLnZpcnR1YWwgPSBUUk9VVF9DUExEX0JBU0UsCisJCS5wZm4gICAgID0gX19waHlzX3RvX3BmbihUUk9VVF9DUExEX1NUQVJUKSwKKwkJLmxlbmd0aCAgPSBUUk9VVF9DUExEX1NJWkUsCisJCS50eXBlICAgID0gTVRfREVWSUNFX05PTlNIQVJFRAorCX0KK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCB0cm91dF9tYXBfaW8odm9pZCkKK3sKKwltc21fbWFwX2NvbW1vbl9pbygpOworCWlvdGFibGVfaW5pdCh0cm91dF9pb19kZXNjLCBBUlJBWV9TSVpFKHRyb3V0X2lvX2Rlc2MpKTsKKworI2lmZGVmIENPTkZJR19NU01fREVCVUdfVUFSVDMKKwkvKiByb3V0ZSBVQVJUMyB0byB0aGUgIkgyVyIgZXh0ZW5kZWQgdXNiIGNvbm5lY3RvciAqLworCXdyaXRlYigweDgwLCBUUk9VVF9DUExEX0JBU0UgKyAweDAwKTsKKyNlbmRpZgorCisJbXNtX2Nsb2NrX2luaXQoKTsKK30KKworTUFDSElORV9TVEFSVChUUk9VVCwgIkhUQyBEcmVhbSIpCisJLnBoeXNfaW8JPSBNU01fREVCVUdfVUFSVF9QSFlTLAorCS5pb19wZ19vZmZzdAk9ICgoTVNNX0RFQlVHX1VBUlRfQkFTRSkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4MTAwMDAxMDAsCisJLmZpeHVwCQk9IHRyb3V0X2ZpeHVwLAorCS5tYXBfaW8JCT0gdHJvdXRfbWFwX2lvLAorCS5pbml0X2lycQk9IHRyb3V0X2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSB0cm91dF9pbml0LAorCS50aW1lcgkJPSAmbXNtX3RpbWVyLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLWRyZWFtLmggYi9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1kcmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMzQ1YTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1kcmVhbS5oCkBAIC0wLDAgKzEsNSBAQAorCisjZGVmaW5lIFRST1VUX0NQTERfQkFTRSAgIDB4RTgxMDAwMDAKKyNkZWZpbmUgVFJPVVRfQ1BMRF9TVEFSVCAgMHg5ODAwMDAwMAorI2RlZmluZSBUUk9VVF9DUExEX1NJWkUgICBTWl80SworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IDFkYjNjOTcuLmQ0ODc0N2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xNCwxNSArMTQsMTggQEAKICAqCiAgKi8KIAorCisKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9tc21faW9tYXAuaD4KIAorI2lmZGVmIENPTkZJR19NU01fREVCVUdfVUFSVAogCS5tYWNybwlhZGRydWFydCxyeAogCUAgc2VlIGlmIHRoZSBNTVUgaXMgZW5hYmxlZCBhbmQgc2VsZWN0IGFwcHJvcHJpYXRlIGJhc2UgYWRkcmVzcwogCW1yYwlwMTUsIDAsIFxyeCwgYzEsIGMwCiAJdHN0CVxyeCwgIzEKLQlsZHJlcQlccngsID1NU01fVUFSVDFfUEhZUwotCW1vdm5lCVxyeCwgIzAKKwlsZHJlcQlccngsID1NU01fREVCVUdfVUFSVF9QSFlTCisJbGRybmUJXHJ4LCA9TVNNX0RFQlVHX1VBUlRfQkFTRQogCS5lbmRtCiAKIAkubWFjcm8Jc2VuZHVhcnQscmQscngKQEAgLTMyLDEzICszNSwyMCBAQAogCiAJLm1hY3JvCXdhaXR1YXJ0LHJkLHJ4CiAJQCB3YWl0IGZvciBUWF9SRUFEWQotCXRlcQlccngsICMwCi0JYm5lCTJmCi0xOglsZHIJXHJkLCBbXHJ4LCAjMHgwOF0KKzEwMDE6CWxkcglccmQsIFtccngsICMweDA4XQogCXRzdAlccmQsICMweDA0Ci0JYmVxCTFiCi0yOgorCWJlcQkxMDAxYgogCS5lbmRtCisjZWxzZQorCS5tYWNybwlhZGRydWFydCxyeAorCS5lbmRtCisKKwkubWFjcm8Jc2VuZHVhcnQscmQscngKKwkuZW5kbQorCisJLm1hY3JvCXdhaXR1YXJ0LHJkLHJ4CisJLmVuZG0KKyNlbmRpZgogCiAJLm1hY3JvCWJ1c3l1YXJ0LHJkLHJ4CiAJLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tbWMuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tbWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWNmMjU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21tYy5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiAgYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC9tbWMuaAorICovCisjaWZuZGVmIEFTTUFSTV9NQUNIX01NQ19ICisjZGVmaW5lIEFTTUFSTV9NQUNIX01NQ19ICisKKyNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9jYXJkLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL3NkaW9fZnVuYy5oPgorCitzdHJ1Y3QgZW1iZWRkZWRfc2Rpb19kYXRhIHsKKwlzdHJ1Y3Qgc2Rpb19jaXMgY2lzOworCXN0cnVjdCBzZGlvX2NjY3IgY2NjcjsKKwlzdHJ1Y3Qgc2Rpb19lbWJlZGRlZF9mdW5jICpmdW5jczsKKwlpbnQgbnVtX2Z1bmNzOworfTsKKworc3RydWN0IG1tY19wbGF0Zm9ybV9kYXRhIHsKKwl1bnNpZ25lZCBpbnQgb2NyX21hc2s7CQkJLyogYXZhaWxhYmxlIHZvbHRhZ2VzICovCisJdTMyICgqdHJhbnNsYXRlX3ZkZCkoc3RydWN0IGRldmljZSAqLCB1bnNpZ25lZCBpbnQpOworCXVuc2lnbmVkIGludCAoKnN0YXR1cykoc3RydWN0IGRldmljZSAqKTsKKwlzdHJ1Y3QgZW1iZWRkZWRfc2Rpb19kYXRhICplbWJlZGRlZF9zZGlvOworCWludCAoKnJlZ2lzdGVyX3N0YXR1c19ub3RpZnkpKHZvaWQgKCpjYWxsYmFjaykoaW50IGNhcmRfcHJlc2VudCwgdm9pZCAqZGV2X2lkKSwgdm9pZCAqZGV2X2lkKTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9pb21hcC5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9pb21hcC5oCmluZGV4IDJmN2I0YzguLjlkYWUxYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tc21faW9tYXAuaAorKysgYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbXNtX2lvbWFwLmgKQEAgLTg0LDYgKzg0LDE4IEBACiAjZGVmaW5lIE1TTV9VQVJUM19QSFlTICAgICAgICAweEE5QzAwMDAwCiAjZGVmaW5lIE1TTV9VQVJUM19TSVpFICAgICAgICBTWl80SwogCisjaWZkZWYgQ09ORklHX01TTV9ERUJVR19VQVJUCisjZGVmaW5lIE1TTV9ERUJVR19VQVJUX0JBU0UgICAweEUxMDAwMDAwCisjaWYgQ09ORklHX01TTV9ERUJVR19VQVJUID09IDEKKyNkZWZpbmUgTVNNX0RFQlVHX1VBUlRfUEhZUyAgIE1TTV9VQVJUMV9QSFlTCisjZWxpZiBDT05GSUdfTVNNX0RFQlVHX1VBUlQgPT0gMgorI2RlZmluZSBNU01fREVCVUdfVUFSVF9QSFlTICAgTVNNX1VBUlQyX1BIWVMKKyNlbGlmIENPTkZJR19NU01fREVCVUdfVUFSVCA9PSAzCisjZGVmaW5lIE1TTV9ERUJVR19VQVJUX1BIWVMgICBNU01fVUFSVDNfUEhZUworI2VuZGlmCisjZGVmaW5lIE1TTV9ERUJVR19VQVJUX1NJWkUgICBTWl80SworI2VuZGlmCisKICNkZWZpbmUgTVNNX1NEQzFfUEhZUyAgICAgICAgIDB4QTA0MDAwMDAKICNkZWZpbmUgTVNNX1NEQzFfU0laRSAgICAgICAgIFNaXzRLCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCmluZGV4IDAyNmU4OTUuLmQ5NDI5MmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaApAQCAtMTYsOSArMTYsMTYgQEAKICNpZm5kZWYgX19BU01fQVJDSF9NU01fVU5DT01QUkVTU19ICiAKICNpbmNsdWRlICJoYXJkd2FyZS5oIgorI2luY2x1ZGUgImxpbnV4L2lvLmgiCisjaW5jbHVkZSAibWFjaC9tc21faW9tYXAuaCIKIAogc3RhdGljIHZvaWQgcHV0YyhpbnQgYykKIHsKKyNpZiBkZWZpbmVkKE1TTV9ERUJVR19VQVJUX1BIWVMpCisJdW5zaWduZWQgYmFzZSA9IE1TTV9ERUJVR19VQVJUX1BIWVM7CisJd2hpbGUgKCEocmVhZGwoYmFzZSArIDB4MDgpICYgMHgwNCkpIDsKKwl3cml0ZWwoYywgYmFzZSArIDB4MGMpOworI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW8uYyBiL2FyY2gvYXJtL21hY2gtbXNtL2lvLmMKaW5kZXggNmU3NjkyZi4uMWM1ZTdkYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW8uYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS9pby5jCkBAIC00Miw2ICs0Miw5IEBACiAJTVNNX0RFVklDRShHUElPMSksCiAJTVNNX0RFVklDRShHUElPMiksCiAJTVNNX0RFVklDRShDTEtfQ1RMKSwKKyNpZmRlZiBDT05GSUdfTVNNX0RFQlVHX1VBUlQKKwlNU01fREVWSUNFKERFQlVHX1VBUlQpLAorI2VuZGlmCiAJewogCQkudmlydHVhbCA9ICAodW5zaWduZWQgbG9uZykgTVNNX1NIQVJFRF9SQU1fQkFTRSwKIAkJLnBmbiA9ICAgICAgX19waHlzX3RvX3BmbihNU01fU0hBUkVEX1JBTV9QSFlTKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLW9tYXAxL01ha2VmaWxlCmluZGV4IDg3ZTUzOWEuLjljZTE3ZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9NYWtlZmlsZQpAQCAtMyw3ICszLDggQEAKICMKIAogIyBDb21tb24gc3VwcG9ydAotb2JqLXkgOj0gaW8ubyBpZC5vIHNyYW0ubyBjbG9jay5vIGlycS5vIG11eC5vIHNlcmlhbC5vIGRldmljZXMubworb2JqLXkgOj0gaW8ubyBpZC5vIHNyYW0ubyBpcnEubyBtdXgubyBzZXJpYWwubyBkZXZpY2VzLm8KK29iai15ICs9IGNsb2NrLm8gY2xvY2tfZGF0YS5vIG9wcF9kYXRhLm8KIAogb2JqLSQoQ09ORklHX09NQVBfTUNCU1ApICs9IG1jYnNwLm8KIApAQCAtMTcsNiArMTgsOSBAQAogb2JqLSQoQ09ORklHX09NQVBfTUJPWF9GV0spCSs9IG1haWxib3hfbWFjaC5vCiBtYWlsYm94X21hY2gtb2JqcwkJOj0gbWFpbGJveC5vCiAKK2kyYy1vbWFwLSQoQ09ORklHX0kyQ19PTUFQKQkJOj0gaTJjLm8KK29iai15CQkJCQkrPSAkKGkyYy1vbWFwLW0pICQoaTJjLW9tYXAteSkKKwogbGVkLXkgOj0gbGVkcy5vCiAKICMgU3BlY2lmaWMgYm9hcmQgc3VwcG9ydApAQCAtNDgsMyArNTIsNyBAQAogbGVkLSQoQ09ORklHX01BQ0hfT01BUF9QRVJTRVVTMikJKz0gbGVkcy1oMnAyLWRlYnVnLm8KIGxlZC0kKENPTkZJR19NQUNIX09NQVBfT1NLKQkJKz0gbGVkcy1vc2subwogb2JqLSQoQ09ORklHX0xFRFMpCQkJKz0gJChsZWQteSkKKworaWZuZXEgKCQoQ09ORklHX0ZCX09NQVApLCkKK29iai15ICs9IGxjZF9kbWEubworZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtZnNhbXBsZS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1mc2FtcGxlLmMKaW5kZXggZjRiNzJjMS4uN2U3MGMzYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1mc2FtcGxlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1mc2FtcGxlLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbWM5MXguaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgpAQCAtMzAsNyArMzEsNiBAQAogI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPHBsYXQvbXV4Lmg+CiAjaW5jbHVkZSA8cGxhdC9mcGdhLmg+Ci0jaW5jbHVkZSA8cGxhdC9uYW5kLmg+CiAjaW5jbHVkZSA8cGxhdC9rZXlwYWQuaD4KICNpbmNsdWRlIDxwbGF0L2NvbW1vbi5oPgogI2luY2x1ZGUgPHBsYXQvYm9hcmQuaD4KQEAgLTEwMCw2ICsxMDAsMTIgQEAKIAkwCiB9OwogCitzdGF0aWMgc3RydWN0IHNtYzkxeF9wbGF0ZGF0YSBzbWM5MXhfaW5mbyA9IHsKKwkuZmxhZ3MJPSBTTUM5MVhfVVNFXzE2QklUIHwgU01DOTFYX05PV0FJVCwKKwkubGVkYQk9IFJQQ19MRURfMTAwXzEwLAorCS5sZWRiCT0gUlBDX0xFRF9UWF9SWCwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc21jOTF4X3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKIAkJLnN0YXJ0CT0gSDJQMl9EQkdfRlBHQV9FVEhSX1NUQVJULAkvKiBQaHlzaWNhbCAqLwpAQCAtMTY3LDggKzE3Myw0MCBAQAogCS5yZXNvdXJjZQk9ICZub3JfcmVzb3VyY2UsCiB9OwogCi1zdGF0aWMgc3RydWN0IG9tYXBfbmFuZF9wbGF0Zm9ybV9kYXRhIG5hbmRfZGF0YSA9IHsKLQkub3B0aW9ucwk9IE5BTkRfU0FNU1VOR19MUF9PUFRJT05TLAorc3RhdGljIHZvaWQgbmFuZF9jbWRfY3RsKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgY21kLAl1bnNpZ25lZCBpbnQgY3RybCkKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCXVuc2lnbmVkIGxvbmcgbWFzazsKKworCWlmIChjbWQgPT0gTkFORF9DTURfTk9ORSkKKwkJcmV0dXJuOworCisJbWFzayA9IChjdHJsICYgTkFORF9DTEUpID8gMHgwMiA6IDA7CisJaWYgKGN0cmwgJiBOQU5EX0FMRSkKKwkJbWFzayB8PSAweDA0OworCXdyaXRlYihjbWQsICh1bnNpZ25lZCBsb25nKXRoaXMtPklPX0FERFJfVyB8IG1hc2spOworfQorCisjZGVmaW5lIEZTQU1QTEVfTkFORF9SQl9HUElPX1BJTgk2MgorCitzdGF0aWMgaW50IG5hbmRfZGV2X3JlYWR5KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXJldHVybiBncGlvX2dldF92YWx1ZShGU0FNUExFX05BTkRfUkJfR1BJT19QSU4pOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqcGFydF9wcm9iZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCB9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX25hbmRfZGF0YSBuYW5kX2RhdGEgPSB7CisJLmNoaXAJPSB7CisJCS5ucl9jaGlwcwkJPSAxLAorCQkuY2hpcF9vZmZzZXQJCT0gMCwKKwkJLm9wdGlvbnMJCT0gTkFORF9TQU1TVU5HX0xQX09QVElPTlMsCisJCS5wYXJ0X3Byb2JlX3R5cGVzCT0gcGFydF9wcm9iZXMsCisJfSwKKwkuY3RybAk9IHsKKwkJLmNtZF9jdHJsCT0gbmFuZF9jbWRfY3RsLAorCQkuZGV2X3JlYWR5CT0gbmFuZF9kZXZfcmVhZHksCisJfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbmFuZF9yZXNvdXJjZSA9IHsKQEAgLTE3OCw3ICsyMTYsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbmFuZF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gIm9tYXBuYW5kIiwKKwkubmFtZQkJPSAiZ2VuX25hbmQiLAogCS5pZAkJPSAwLAogCS5kZXYJCT0gewogCQkucGxhdGZvcm1fZGF0YQk9ICZuYW5kX2RhdGEsCkBAIC0xOTAsNiArMjI4LDkgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNtYzkxeF9kZXZpY2UgPSB7CiAJLm5hbWUJCT0gInNtYzkxeCIsCiAJLmlkCQk9IDAsCisJLmRldgk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmc21jOTF4X2luZm8sCisJfSwKIAkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoc21jOTF4X3Jlc291cmNlcyksCiAJLnJlc291cmNlCT0gc21jOTF4X3Jlc291cmNlcywKIH07CkBAIC0yMzMsMTMgKzI3NCw2IEBACiAJJmxjZF9kZXZpY2UsCiB9OwogCi0jZGVmaW5lIFAyX05BTkRfUkJfR1BJT19QSU4JNjIKLQotc3RhdGljIGludCBuYW5kX2Rldl9yZWFkeShzdHJ1Y3Qgb21hcF9uYW5kX3BsYXRmb3JtX2RhdGEgKmRhdGEpCi17Ci0JcmV0dXJuIGdwaW9fZ2V0X3ZhbHVlKFAyX05BTkRfUkJfR1BJT19QSU4pOwotfQotCiBzdGF0aWMgc3RydWN0IG9tYXBfbGNkX2NvbmZpZyBmc2FtcGxlX2xjZF9jb25maWcgX19pbml0ZGF0YSA9IHsKIAkuY3RybF9uYW1lCT0gImludGVybmFsIiwKIH07CkBAIC0yNTAsOSArMjg0LDkgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IG9tYXBfZnNhbXBsZV9pbml0KHZvaWQpCiB7Ci0JaWYgKGdwaW9fcmVxdWVzdChQMl9OQU5EX1JCX0dQSU9fUElOLCAiTkFORCByZWFkeSIpIDwgMCkKKwlpZiAoZ3Bpb19yZXF1ZXN0KEZTQU1QTEVfTkFORF9SQl9HUElPX1BJTiwgIk5BTkQgcmVhZHkiKSA8IDApCiAJCUJVRygpOwotCW5hbmRfZGF0YS5kZXZfcmVhZHkgPSBuYW5kX2Rldl9yZWFkeTsKKwlncGlvX2RpcmVjdGlvbl9pbnB1dChGU0FNUExFX05BTkRfUkJfR1BJT19QSU4pOwogCiAJb21hcF9jZmdfcmVnKEwzXzE2MTBfRkxBU0hfQ1MyQl9PRSk7CiAJb21hcF9jZmdfcmVnKE04XzE2MTBfRkxBU0hfQ1MyQl9XRSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgyLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgyLmMKaW5kZXggODliYThlYy4uZmE3Y2VjZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDIuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMvdHBzNjUwMTAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbWM5MXguaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vZ3Bpby5oPgpAQCAtNDAsNyArNDEsNiBAQAogI2luY2x1ZGUgPHBsYXQvbXV4Lmg+CiAjaW5jbHVkZSA8cGxhdC9kbWEuaD4KICNpbmNsdWRlIDxwbGF0L3RjLmg+Ci0jaW5jbHVkZSA8cGxhdC9uYW5kLmg+CiAjaW5jbHVkZSA8cGxhdC9pcmRhLmg+CiAjaW5jbHVkZSA8cGxhdC91c2IuaD4KICNpbmNsdWRlIDxwbGF0L2tleXBhZC5oPgpAQCAtMTc5LDExICsxNzksNDMgQEAKIAl9LAogfTsKIAotLyogZGlwIHN3aXRjaGVzIGNvbnRyb2wgTkFORCBjaGlwIGFjY2VzczogIDggYml0LCAxNiBiaXQsIG9yIG5laXRoZXIgKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9uYW5kX3BsYXRmb3JtX2RhdGEgaDJfbmFuZF9kYXRhID0gewotCS5vcHRpb25zCT0gTkFORF9TQU1TVU5HX0xQX09QVElPTlMsCi0JLnBhcnRzCQk9IGgyX25hbmRfcGFydGl0aW9ucywKLQkubnJfcGFydHMJPSBBUlJBWV9TSVpFKGgyX25hbmRfcGFydGl0aW9ucyksCitzdGF0aWMgdm9pZCBoMl9uYW5kX2NtZF9jdGwoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBjbWQsIHVuc2lnbmVkIGludCBjdHJsKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisJdW5zaWduZWQgbG9uZyBtYXNrOworCisJaWYgKGNtZCA9PSBOQU5EX0NNRF9OT05FKQorCQlyZXR1cm47CisKKwltYXNrID0gKGN0cmwgJiBOQU5EX0NMRSkgPyAweDAyIDogMDsKKwlpZiAoY3RybCAmIE5BTkRfQUxFKQorCQltYXNrIHw9IDB4MDQ7CisJd3JpdGViKGNtZCwgKHVuc2lnbmVkIGxvbmcpdGhpcy0+SU9fQUREUl9XIHwgbWFzayk7Cit9CisKKyNkZWZpbmUgSDJfTkFORF9SQl9HUElPX1BJTgk2MgorCitzdGF0aWMgaW50IGgyX25hbmRfZGV2X3JlYWR5KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXJldHVybiBncGlvX2dldF92YWx1ZShIMl9OQU5EX1JCX0dQSU9fUElOKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmgyX3BhcnRfcHJvYmVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKKworc3RydWN0IHBsYXRmb3JtX25hbmRfZGF0YSBoMl9uYW5kX3BsYXRkYXRhID0geworCS5jaGlwCT0geworCQkubnJfY2hpcHMJCT0gMSwKKwkJLmNoaXBfb2Zmc2V0CQk9IDAsCisJCS5ucl9wYXJ0aXRpb25zCQk9IEFSUkFZX1NJWkUoaDJfbmFuZF9wYXJ0aXRpb25zKSwKKwkJLnBhcnRpdGlvbnMJCT0gaDJfbmFuZF9wYXJ0aXRpb25zLAorCQkub3B0aW9ucwkJPSBOQU5EX1NBTVNVTkdfTFBfT1BUSU9OUywKKwkJLnBhcnRfcHJvYmVfdHlwZXMJPSBoMl9wYXJ0X3Byb2JlcywKKwl9LAorCS5jdHJsCT0geworCQkuY21kX2N0cmwJPSBoMl9uYW5kX2NtZF9jdGwsCisJCS5kZXZfcmVhZHkJPSBoMl9uYW5kX2Rldl9yZWFkeSwKKworCX0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGgyX25hbmRfcmVzb3VyY2UgPSB7CkBAIC0xOTEsMTUgKzIyMywyMSBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaDJfbmFuZF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gIm9tYXBuYW5kIiwKKwkubmFtZQkJPSAiZ2VuX25hbmQiLAogCS5pZAkJPSAwLAogCS5kZXYJCT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZoMl9uYW5kX2RhdGEsCisJCS5wbGF0Zm9ybV9kYXRhCT0gJmgyX25hbmRfcGxhdGRhdGEsCiAJfSwKIAkubnVtX3Jlc291cmNlcwk9IDEsCiAJLnJlc291cmNlCT0gJmgyX25hbmRfcmVzb3VyY2UsCiB9OwogCitzdGF0aWMgc3RydWN0IHNtYzkxeF9wbGF0ZGF0YSBoMl9zbWM5MXhfaW5mbyA9IHsKKwkuZmxhZ3MJPSBTTUM5MVhfVVNFXzE2QklUIHwgU01DOTFYX05PV0FJVCwKKwkubGVkYQk9IFJQQ19MRURfMTAwXzEwLAorCS5sZWRiCT0gUlBDX0xFRF9UWF9SWCwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaDJfc21jOTF4X3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKIAkJLnN0YXJ0CT0gT01BUDE2MTBfRVRIUl9TVEFSVCwJCS8qIFBoeXNpY2FsICovCkBAIC0yMTYsNiArMjU0LDkgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGgyX3NtYzkxeF9kZXZpY2UgPSB7CiAJLm5hbWUJCT0gInNtYzkxeCIsCiAJLmlkCQk9IDAsCisJLmRldgk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmaDJfc21jOTF4X2luZm8sCisJfSwKIAkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoaDJfc21jOTF4X3Jlc291cmNlcyksCiAJLnJlc291cmNlCT0gaDJfc21jOTF4X3Jlc291cmNlcywKIH07CkBAIC0zNjgsOCArNDA5LDYgQEAKIAl7IE9NQVBfVEFHX0xDRCwJCSZoMl9sY2RfY29uZmlnIH0sCiB9OwogCi0jZGVmaW5lIEgyX05BTkRfUkJfR1BJT19QSU4JNjIKLQogc3RhdGljIHZvaWQgX19pbml0IGgyX2luaXQodm9pZCkKIHsKIAkvKiBIZXJlIHdlIGFzc3VtZSB0aGUgTk9SIGJvb3QgY29uZmlnOiAgTk9SIG9uIENTMyAocG9zc2libHkgc3dhcHBlZApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy5jCmluZGV4IGY1Y2MwYTcuLjZhN2Y5YzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgzLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMvdHBzNjUwMTAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbWM5MXguaD4KIAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CkBAIC00Miw3ICs0Myw2IEBACiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8cGxhdC9tdXguaD4KICNpbmNsdWRlIDxwbGF0L3RjLmg+Ci0jaW5jbHVkZSA8cGxhdC9uYW5kLmg+CiAjaW5jbHVkZSA8cGxhdC91c2IuaD4KICNpbmNsdWRlIDxwbGF0L2tleXBhZC5oPgogI2luY2x1ZGUgPHBsYXQvZG1hLmg+CkBAIC0xODEsMTEgKzE4MSw0MyBAQAogCX0sCiB9OwogCi0vKiBkaXAgc3dpdGNoZXMgY29udHJvbCBOQU5EIGNoaXAgYWNjZXNzOiAgOCBiaXQsIDE2IGJpdCwgb3IgbmVpdGhlciAqLwotc3RhdGljIHN0cnVjdCBvbWFwX25hbmRfcGxhdGZvcm1fZGF0YSBuYW5kX2RhdGEgPSB7Ci0JLm9wdGlvbnMJPSBOQU5EX1NBTVNVTkdfTFBfT1BUSU9OUywKLQkucGFydHMJCT0gbmFuZF9wYXJ0aXRpb25zLAotCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUobmFuZF9wYXJ0aXRpb25zKSwKK3N0YXRpYyB2b2lkIG5hbmRfY21kX2N0bChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IGNtZCwgdW5zaWduZWQgaW50IGN0cmwpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisKKwlpZiAoY21kID09IE5BTkRfQ01EX05PTkUpCisJCXJldHVybjsKKworCW1hc2sgPSAoY3RybCAmIE5BTkRfQ0xFKSA/IDB4MDIgOiAwOworCWlmIChjdHJsICYgTkFORF9BTEUpCisJCW1hc2sgfD0gMHgwNDsKKwl3cml0ZWIoY21kLCAodW5zaWduZWQgbG9uZyl0aGlzLT5JT19BRERSX1cgfCBtYXNrKTsKK30KKworI2RlZmluZSBIM19OQU5EX1JCX0dQSU9fUElOCTEwCisKK3N0YXRpYyBpbnQgbmFuZF9kZXZfcmVhZHkoc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJcmV0dXJuIGdwaW9fZ2V0X3ZhbHVlKEgzX05BTkRfUkJfR1BJT19QSU4pOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqcGFydF9wcm9iZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCB9OworCitzdHJ1Y3QgcGxhdGZvcm1fbmFuZF9kYXRhIG5hbmRfcGxhdGRhdGEgPSB7CisJLmNoaXAJPSB7CisJCS5ucl9jaGlwcwkJPSAxLAorCQkuY2hpcF9vZmZzZXQJCT0gMCwKKwkJLm5yX3BhcnRpdGlvbnMJCT0gQVJSQVlfU0laRShuYW5kX3BhcnRpdGlvbnMpLAorCQkucGFydGl0aW9ucwkJPSBuYW5kX3BhcnRpdGlvbnMsCisJCS5vcHRpb25zCQk9IE5BTkRfU0FNU1VOR19MUF9PUFRJT05TLAorCQkucGFydF9wcm9iZV90eXBlcwk9IHBhcnRfcHJvYmVzLAorCX0sCisJLmN0cmwJPSB7CisJCS5jbWRfY3RybAk9IG5hbmRfY21kX2N0bCwKKwkJLmRldl9yZWFkeQk9IG5hbmRfZGV2X3JlYWR5LAorCisJfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbmFuZF9yZXNvdXJjZSA9IHsKQEAgLTE5MywxNSArMjI1LDIxIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBuYW5kX2RldmljZSA9IHsKLQkubmFtZQkJPSAib21hcG5hbmQiLAorCS5uYW1lCQk9ICJnZW5fbmFuZCIsCiAJLmlkCQk9IDAsCiAJLmRldgkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJm5hbmRfZGF0YSwKKwkJLnBsYXRmb3JtX2RhdGEJPSAmbmFuZF9wbGF0ZGF0YSwKIAl9LAogCS5udW1fcmVzb3VyY2VzCT0gMSwKIAkucmVzb3VyY2UJPSAmbmFuZF9yZXNvdXJjZSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc21jOTF4X3BsYXRkYXRhIHNtYzkxeF9pbmZvID0geworCS5mbGFncwk9IFNNQzkxWF9VU0VfMTZCSVQgfCBTTUM5MVhfTk9XQUlULAorCS5sZWRhCT0gUlBDX0xFRF8xMDBfMTAsCisJLmxlZGIJPSBSUENfTEVEX1RYX1JYLAorfTsKKwogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzbWM5MXhfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewogCQkuc3RhcnQJPSBPTUFQMTcxMF9FVEhSX1NUQVJULAkJLyogUGh5c2ljYWwgKi8KQEAgLTIxOCw2ICsyNTYsOSBAQAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc21jOTF4X2RldmljZSA9IHsKIAkubmFtZQkJPSAic21jOTF4IiwKIAkuaWQJCT0gMCwKKwkuZGV2CT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZzbWM5MXhfaW5mbywKKwl9LAogCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzbWM5MXhfcmVzb3VyY2VzKSwKIAkucmVzb3VyY2UJPSBzbWM5MXhfcmVzb3VyY2VzLAogfTsKQEAgLTMzMiwxMyArMzczLDYgQEAKIAl9LAogfTsKIAotI2RlZmluZSBIM19OQU5EX1JCX0dQSU9fUElOCTEwCi0KLXN0YXRpYyBpbnQgbmFuZF9kZXZfcmVhZHkoc3RydWN0IG9tYXBfbmFuZF9wbGF0Zm9ybV9kYXRhICpkYXRhKQotewotCXJldHVybiBncGlvX2dldF92YWx1ZShIM19OQU5EX1JCX0dQSU9fUElOKTsKLX0KLQogc3RhdGljIHZvaWQgX19pbml0IGgzX2luaXQodm9pZCkKIHsKIAkvKiBIZXJlIHdlIGFzc3VtZSB0aGUgTk9SIGJvb3QgY29uZmlnOiAgTk9SIG9uIENTMyAocG9zc2libHkgc3dhcHBlZApAQCAtMzU2LDcgKzM5MCw3IEBACiAJbmFuZF9yZXNvdXJjZS5lbmQgKz0gU1pfNEsgLSAxOwogCWlmIChncGlvX3JlcXVlc3QoSDNfTkFORF9SQl9HUElPX1BJTiwgIk5BTkQgcmVhZHkiKSA8IDApCiAJCUJVRygpOwotCW5hbmRfZGF0YS5kZXZfcmVhZHkgPSBuYW5kX2Rldl9yZWFkeTsKKwlncGlvX2RpcmVjdGlvbl9pbnB1dChIM19OQU5EX1JCX0dQSU9fUElOKTsKIAogCS8qIEdQSU8xMCBGdW5jX01VWF9DVFJMIHJlZyBiaXQgMjk6MjcsIENvbmZpZ3VyZSBWMiB0byBtb2RlMSBhcyBHUElPICovCiAJLyogR1BJTzEwIHB1bGx1cC9kb3duIHJlZ2lzdGVyLCBFbmFibGUgcHVsbHVwIG9uIEdQSU8xMCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1odGNoZXJhbGQuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaHRjaGVyYWxkLmMKaW5kZXggNWYyOGE1Yy4uZTM2NjM5ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1odGNoZXJhbGQuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWh0Y2hlcmFsZC5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8cGxhdC9jb21tb24uaD4KICNpbmNsdWRlIDxwbGF0L2JvYXJkLmg+CiAjaW5jbHVkZSA8cGxhdC9rZXlwYWQuaD4KKyNpbmNsdWRlIDxwbGF0L3VzYi5oPgogCiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAKQEAgLTE0MCw2ICsxNDEsMTUgQEAKIAkucmVzb3VyY2UJPSBrcF9yZXNvdXJjZXMsCiB9OwogCisvKiBVU0IgRGV2aWNlICovCitzdGF0aWMgc3RydWN0IG9tYXBfdXNiX2NvbmZpZyBodGNoZXJhbGRfdXNiX2NvbmZpZyBfX2luaXRkYXRhID0geworCS5vdGcgPSAwLAorCS5yZWdpc3Rlcl9ob3N0ID0gMCwKKwkucmVnaXN0ZXJfZGV2ICA9IDEsCisJLmhtY19tb2RlID0gNCwKKwkucGluc1swXSA9IDIsCit9OworCiAvKiBMQ0QgRGV2aWNlIHJlc291cmNlcyAqLwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbGNkX2RldmljZSA9IHsKIAkubmFtZSAgICAgICAgICAgPSAibGNkX2h0Y2hlcmFsZCIsCkBAIC0yMTQsNiArMjI0LDU3IEBACiAJfQogfQogCisjZGVmaW5lIEhUQ0hFUkFMRF9HUElPX1VTQl9FTjEgMzMKKyNkZWZpbmUgSFRDSEVSQUxEX0dQSU9fVVNCX0VOMiA3MworI2RlZmluZSBIVENIRVJBTERfR1BJT19VU0JfRE0gIDM1CisjZGVmaW5lIEhUQ0hFUkFMRF9HUElPX1VTQl9EUCAgMzYKKworc3RhdGljIHZvaWQgX19pbml0IGh0Y2hlcmFsZF91c2JfZW5hYmxlKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHRyaWVzID0gMjA7CisJdW5zaWduZWQgaW50IHZhbHVlID0gMDsKKworCS8qIFJlcXVlc3QgdGhlIEdQSU9zIHdlIG5lZWQgdG8gY29udHJvbCBoZXJlICovCisJaWYgKGdwaW9fcmVxdWVzdChIVENIRVJBTERfR1BJT19VU0JfRU4xLCAiaGVyYWxkX3VzYiIpIDwgMCkKKwkJZ290byBlcnIxOworCisJaWYgKGdwaW9fcmVxdWVzdChIVENIRVJBTERfR1BJT19VU0JfRU4yLCAiaGVyYWxkX3VzYiIpIDwgMCkKKwkJZ290byBlcnIyOworCisJaWYgKGdwaW9fcmVxdWVzdChIVENIRVJBTERfR1BJT19VU0JfRE0sICJoZXJhbGRfdXNiIikgPCAwKQorCQlnb3RvIGVycjM7CisKKwlpZiAoZ3Bpb19yZXF1ZXN0KEhUQ0hFUkFMRF9HUElPX1VTQl9EUCwgImhlcmFsZF91c2IiKSA8IDApCisJCWdvdG8gZXJyNDsKKworCS8qIGZvcmNlIFVTQl9FTiBHUElPIHRvIDAgKi8KKwlkbyB7CisJCS8qIG91dHB1dCBsb3cgKi8KKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEhUQ0hFUkFMRF9HUElPX1VTQl9FTjEsIDApOworCX0gd2hpbGUgKCh2YWx1ZSA9IGdwaW9fZ2V0X3ZhbHVlKEhUQ0hFUkFMRF9HUElPX1VTQl9FTjEpKSA9PSAxICYmCisJCQktLXRyaWVzKTsKKworCWlmICh2YWx1ZSA9PSAxKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJVbmFibGUgdG8gcmVzZXQgVVNCLCB0cnlpbmcgdG8gY29udGludWVcbiIpOworCisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEhUQ0hFUkFMRF9HUElPX1VTQl9FTjIsIDApOyAvKiBvdXRwdXQgbG93ICovCisJZ3Bpb19kaXJlY3Rpb25faW5wdXQoSFRDSEVSQUxEX0dQSU9fVVNCX0RNKTsgLyogaW5wdXQgKi8KKwlncGlvX2RpcmVjdGlvbl9pbnB1dChIVENIRVJBTERfR1BJT19VU0JfRFApOyAvKiBpbnB1dCAqLworCisJZ290byBkb25lOworCitlcnI0OgorCWdwaW9fZnJlZShIVENIRVJBTERfR1BJT19VU0JfRE0pOworZXJyMzoKKwlncGlvX2ZyZWUoSFRDSEVSQUxEX0dQSU9fVVNCX0VOMik7CitlcnIyOgorCWdwaW9fZnJlZShIVENIRVJBTERfR1BJT19VU0JfRU4xKTsKK2VycjE6CisJcHJpbnRrKEtFUk5fRVJSICJVbmFibGVkIHRvIHJlcXVlc3QgR1BJTyBmb3IgVVNCXG4iKTsKK2RvbmU6CisJcHJpbnRrKEtFUk5fSU5GTyAiVVNCIHNldHVwIGNvbXBsZXRlLlxuIik7Cit9CisKIHN0YXRpYyB2b2lkIF9faW5pdCBodGNoZXJhbGRfaW5pdCh2b2lkKQogewogCXByaW50ayhLRVJOX0lORk8gIkhUQyBIZXJhbGQgaW5pdC5cbiIpOwpAQCAtMjI1LDYgKzI4Niw5IEBACiAJcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7CiAKIAlodGNoZXJhbGRfZGlzYWJsZV93YXRjaGRvZygpOworCisJaHRjaGVyYWxkX3VzYl9lbmFibGUoKTsKKwlvbWFwX3VzYl9pbml0KCZodGNoZXJhbGRfdXNiX2NvbmZpZyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBodGNoZXJhbGRfaW5pdF9pcnEodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaW5ub3ZhdG9yLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWlubm92YXRvci5jCmluZGV4IGNmMGZkYjkuLjIxMzNiMDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaW5ub3ZhdG9yLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1pbm5vdmF0b3IuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvc21jOTF4Lmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KQEAgLTE0Miw2ICsxNDMsMTEgQEAKIAkucmVzb3VyY2UJPSBpbm5vdmF0b3Jfa3BfcmVzb3VyY2VzLAogfTsKIAorc3RhdGljIHN0cnVjdCBzbWM5MXhfcGxhdGRhdGEgaW5ub3ZhdG9yX3NtYzkxeF9pbmZvID0geworCS5mbGFncwk9IFNNQzkxWF9VU0VfMTZCSVQgfCBTTUM5MVhfTk9XQUlULAorCS5sZWRhCT0gUlBDX0xFRF8xMDBfMTAsCisJLmxlZGIJPSBSUENfTEVEX1RYX1JYLAorfTsKIAogI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNVhYCiAKQEAgLTE3NSw2ICsxODEsOSBAQAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW5ub3ZhdG9yMTUxMF9zbWM5MXhfZGV2aWNlID0gewogCS5uYW1lCQk9ICJzbWM5MXgiLAogCS5pZAkJPSAwLAorCS5kZXYJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmlubm92YXRvcl9zbWM5MXhfaW5mbywKKwl9LAogCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShpbm5vdmF0b3IxNTEwX3NtYzkxeF9yZXNvdXJjZXMpLAogCS5yZXNvdXJjZQk9IGlubm92YXRvcjE1MTBfc21jOTF4X3Jlc291cmNlcywKIH07CkBAIC0yNDEsNiArMjUwLDkgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlubm92YXRvcjE2MTBfc21jOTF4X2RldmljZSA9IHsKIAkubmFtZQkJPSAic21jOTF4IiwKIAkuaWQJCT0gMCwKKwkuZGV2CT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZpbm5vdmF0b3Jfc21jOTF4X2luZm8sCisJfSwKIAkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoaW5ub3ZhdG9yMTYxMF9zbWM5MXhfcmVzb3VyY2VzKSwKIAkucmVzb3VyY2UJPSBpbm5vdmF0b3IxNjEwX3NtYzkxeF9yZXNvdXJjZXMsCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1vc2suYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtb3NrLmMKaW5kZXggNTBjOTJjMS4uY2NlYTRmNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1vc2suYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW9zay5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvbGVkcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtYzkxeC5oPgogCiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CkBAIC0xMTUsNiArMTE2LDEyIEBACiAJLnJlc291cmNlCT0gJm9za19mbGFzaF9yZXNvdXJjZSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc21jOTF4X3BsYXRkYXRhIG9zazU5MTJfc21jOTF4X2luZm8gPSB7CisJLmZsYWdzCT0gU01DOTFYX1VTRV8xNkJJVCB8IFNNQzkxWF9OT1dBSVQsCisJLmxlZGEJPSBSUENfTEVEXzEwMF8xMCwKKwkubGVkYgk9IFJQQ19MRURfVFhfUlgsCit9OworCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIG9zazU5MTJfc21jOTF4X3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKIAkJLnN0YXJ0CT0gT01BUF9PU0tfRVRIUl9TVEFSVCwJCS8qIFBoeXNpY2FsICovCkBAIC0xMzEsNiArMTM4LDkgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9zazU5MTJfc21jOTF4X2RldmljZSA9IHsKIAkubmFtZQkJPSAic21jOTF4IiwKIAkuaWQJCT0gLTEsCisJLmRldgk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmb3NrNTkxMl9zbWM5MXhfaW5mbywKKwl9LAogCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShvc2s1OTEyX3NtYzkxeF9yZXNvdXJjZXMpLAogCS5yZXNvdXJjZQk9IG9zazU5MTJfc21jOTF4X3Jlc291cmNlcywKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBlcnNldXMyLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBlcnNldXMyLmMKaW5kZXggY2E3ZGYxZS4uMTM4N2E0ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wZXJzZXVzMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGVyc2V1czIuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtYzkxeC5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CkBAIC0zMCw3ICszMSw2IEBACiAjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9tdXguaD4KICNpbmNsdWRlIDxwbGF0L2ZwZ2EuaD4KLSNpbmNsdWRlIDxwbGF0L25hbmQuaD4KICNpbmNsdWRlIDxwbGF0L2tleXBhZC5oPgogI2luY2x1ZGUgPHBsYXQvY29tbW9uLmg+CiAjaW5jbHVkZSA8cGxhdC9ib2FyZC5oPgpAQCAtNjcsNiArNjcsMTIgQEAKIAkwCiB9OwogCitzdGF0aWMgc3RydWN0IHNtYzkxeF9wbGF0ZGF0YSBzbWM5MXhfaW5mbyA9IHsKKwkuZmxhZ3MJPSBTTUM5MVhfVVNFXzE2QklUIHwgU01DOTFYX05PV0FJVCwKKwkubGVkYQk9IFJQQ19MRURfMTAwXzEwLAorCS5sZWRiCT0gUlBDX0xFRF9UWF9SWCwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc21jOTF4X3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKIAkJLnN0YXJ0CT0gSDJQMl9EQkdfRlBHQV9FVEhSX1NUQVJULAkvKiBQaHlzaWNhbCAqLwpAQCAtMTM0LDggKzE0MCw0MCBAQAogCS5yZXNvdXJjZQk9ICZub3JfcmVzb3VyY2UsCiB9OwogCi1zdGF0aWMgc3RydWN0IG9tYXBfbmFuZF9wbGF0Zm9ybV9kYXRhIG5hbmRfZGF0YSA9IHsKLQkub3B0aW9ucwk9IE5BTkRfU0FNU1VOR19MUF9PUFRJT05TLAorc3RhdGljIHZvaWQgbmFuZF9jbWRfY3RsKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgY21kLAl1bnNpZ25lZCBpbnQgY3RybCkKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCXVuc2lnbmVkIGxvbmcgbWFzazsKKworCWlmIChjbWQgPT0gTkFORF9DTURfTk9ORSkKKwkJcmV0dXJuOworCisJbWFzayA9IChjdHJsICYgTkFORF9DTEUpID8gMHgwMiA6IDA7CisJaWYgKGN0cmwgJiBOQU5EX0FMRSkKKwkJbWFzayB8PSAweDA0OworCXdyaXRlYihjbWQsICh1bnNpZ25lZCBsb25nKXRoaXMtPklPX0FERFJfVyB8IG1hc2spOworfQorCisjZGVmaW5lIFAyX05BTkRfUkJfR1BJT19QSU4JNjIKKworc3RhdGljIGludCBuYW5kX2Rldl9yZWFkeShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlyZXR1cm4gZ3Bpb19nZXRfdmFsdWUoUDJfTkFORF9SQl9HUElPX1BJTik7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3Byb2Jlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMIH07CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fbmFuZF9kYXRhIG5hbmRfZGF0YSA9IHsKKwkuY2hpcAk9IHsKKwkJLm5yX2NoaXBzCQk9IDEsCisJCS5jaGlwX29mZnNldAkJPSAwLAorCQkub3B0aW9ucwkJPSBOQU5EX1NBTVNVTkdfTFBfT1BUSU9OUywKKwkJLnBhcnRfcHJvYmVfdHlwZXMJPSBwYXJ0X3Byb2JlcywKKwl9LAorCS5jdHJsCT0geworCQkuY21kX2N0cmwJPSBuYW5kX2NtZF9jdGwsCisJCS5kZXZfcmVhZHkJPSBuYW5kX2Rldl9yZWFkeSwKKwl9LAogfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBuYW5kX3Jlc291cmNlID0gewpAQCAtMTQ1LDcgKzE4Myw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBuYW5kX2RldmljZSA9IHsKLQkubmFtZQkJPSAib21hcG5hbmQiLAorCS5uYW1lCQk9ICJnZW5fbmFuZCIsCiAJLmlkCQk9IDAsCiAJLmRldgkJPSB7CiAJCS5wbGF0Zm9ybV9kYXRhCT0gJm5hbmRfZGF0YSwKQEAgLTE1Nyw2ICsxOTUsOSBAQAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc21jOTF4X2RldmljZSA9IHsKIAkubmFtZQkJPSAic21jOTF4IiwKIAkuaWQJCT0gMCwKKwkuZGV2CT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZzbWM5MXhfaW5mbywKKwl9LAogCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzbWM5MXhfcmVzb3VyY2VzKSwKIAkucmVzb3VyY2UJPSBzbWM5MXhfcmVzb3VyY2VzLAogfTsKQEAgLTIwMSwxMyArMjQyLDYgQEAKIAkmbGNkX2RldmljZSwKIH07CiAKLSNkZWZpbmUgUDJfTkFORF9SQl9HUElPX1BJTgk2MgotCi1zdGF0aWMgaW50IG5hbmRfZGV2X3JlYWR5KHN0cnVjdCBvbWFwX25hbmRfcGxhdGZvcm1fZGF0YSAqZGF0YSkKLXsKLQlyZXR1cm4gZ3Bpb19nZXRfdmFsdWUoUDJfTkFORF9SQl9HUElPX1BJTik7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9sY2RfY29uZmlnIHBlcnNldXMyX2xjZF9jb25maWcgX19pbml0ZGF0YSA9IHsKIAkuY3RybF9uYW1lCT0gImludGVybmFsIiwKIH07CkBAIC0yMjAsNyArMjU0LDcgQEAKIHsKIAlpZiAoZ3Bpb19yZXF1ZXN0KFAyX05BTkRfUkJfR1BJT19QSU4sICJOQU5EIHJlYWR5IikgPCAwKQogCQlCVUcoKTsKLQluYW5kX2RhdGEuZGV2X3JlYWR5ID0gbmFuZF9kZXZfcmVhZHk7CisJZ3Bpb19kaXJlY3Rpb25faW5wdXQoUDJfTkFORF9SQl9HUElPX1BJTik7CiAKIAlvbWFwX2NmZ19yZWcoTDNfMTYxMF9GTEFTSF9DUzJCX09FKTsKIAlvbWFwX2NmZ19yZWcoTThfMTYxMF9GTEFTSF9DUzJCX1dFKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtdm9pY2VibHVlLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXZvaWNlYmx1ZS5jCmluZGV4IDM1Yzc1YzEuLjE2OTE4MzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtdm9pY2VibHVlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC12b2ljZWJsdWUuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtYzkxeC5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CkBAIC0xMDYsNiArMTA3LDEyIEBACiAJLnJlc291cmNlCT0gJnZvaWNlYmx1ZV9mbGFzaF9yZXNvdXJjZSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc21jOTF4X3BsYXRkYXRhIHZvaWNlYmx1ZV9zbWM5MXhfaW5mbyA9IHsKKwkuZmxhZ3MJPSBTTUM5MVhfVVNFXzE2QklUIHwgU01DOTFYX05PV0FJVCwKKwkubGVkYQk9IFJQQ19MRURfMTAwXzEwLAorCS5sZWRiCT0gUlBDX0xFRF9UWF9SWCwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugdm9pY2VibHVlX3NtYzkxeF9yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7CiAJCS5zdGFydAk9IE9NQVBfQ1MyX1BIWVMgKyAweDMwMCwKQEAgLTEyMiw2ICsxMjksOSBAQAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugdm9pY2VibHVlX3NtYzkxeF9kZXZpY2UgPSB7CiAJLm5hbWUJCT0gInNtYzkxeCIsCiAJLmlkCQk9IDAsCisJLmRldgk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdm9pY2VibHVlX3NtYzkxeF9pbmZvLAorCX0sCiAJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHZvaWNlYmx1ZV9zbWM5MXhfcmVzb3VyY2VzKSwKIAkucmVzb3VyY2UJPSB2b2ljZWJsdWVfc21jOTF4X3Jlc291cmNlcywKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2Nsb2NrLmMKaW5kZXggNDJjYmUyMC4uMmJhOWFiOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9jbG9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvY2xvY2suYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwMS9jbG9jay5jCiAgKgotICogIENvcHlyaWdodCAoQykgMjAwNCAtIDIwMDUgTm9raWEgY29ycG9yYXRpb24KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgLSAyMDA1LCAyMDA5IE5va2lhIGNvcnBvcmF0aW9uCiAgKiAgV3JpdHRlbiBieSBUdXVra2EgVGlra2FuZW4gPHR1dWtrYS50aWtrYW5lbkBlbGVrdHJvYml0LmNvbT4KICAqCiAgKiAgTW9kaWZpZWQgdG8gdXNlIG9tYXAgc2hhcmVkIGNsb2NrIGZyYW1ld29yayBieQpAQCAtMjYsMTIgKzI2LDE3IEBACiAjaW5jbHVkZSA8cGxhdC91c2IuaD4KICNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CiAjaW5jbHVkZSA8cGxhdC9zcmFtLmg+Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrb3BzIGNsa29wc19nZW5lcmljOwotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtvcHMgY2xrb3BzX3VhcnQ7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa29wcyBjbGtvcHNfZHNwY2s7CisjaW5jbHVkZSA8cGxhdC9jbGtkZXZfb21hcC5oPgogCiAjaW5jbHVkZSAiY2xvY2suaCIKKyNpbmNsdWRlICJvcHAuaCIKKworX191MzIgYXJtX2lkbGVjdDFfbWFzazsKK3N0cnVjdCBjbGsgKmFwaV9ja19wLCAqY2tfZHBsbDFfcCwgKmNrX3JlZl9wOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE9tYXAxIHNwZWNpZmljIGNsb2NrIGZ1bmN0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljIGludCBjbGtfb21hcDFfZHVtbXlfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKIHsKQEAgLTQyLDEzNCArNDcsMjQgQEAKIHsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtvcHMgY2xrb3BzX2R1bW15ID0gewotCS5lbmFibGUgPSBjbGtfb21hcDFfZHVtbXlfZW5hYmxlLAotCS5kaXNhYmxlID0gY2xrX29tYXAxX2R1bW15X2Rpc2FibGUsCitjb25zdCBzdHJ1Y3QgY2xrb3BzIGNsa29wc19kdW1teSA9IHsKKwkuZW5hYmxlCQk9IGNsa19vbWFwMV9kdW1teV9lbmFibGUsCisJLmRpc2FibGUJPSBjbGtfb21hcDFfZHVtbXlfZGlzYWJsZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrIGR1bW15X2NrID0gewotCS5uYW1lCT0gImR1bW15IiwKLQkub3BzCT0gJmNsa29wc19kdW1teSwKLQkuZmxhZ3MJPSBSQVRFX0ZJWEVELAotfTsKLQotc3RydWN0IG9tYXBfY2xrIHsKLQl1MzIJCWNwdTsKLQlzdHJ1Y3QgY2xrX2xvb2t1cCBsazsKLX07Ci0KLSNkZWZpbmUgQ0xLKGRldiwgY29uLCBjaywgY3ApIAkJXAotCXsJCQkJXAotCQkgLmNwdSA9IGNwLAkJXAotCQkubGsgPSB7CQkJXAotCQkJLmRldl9pZCA9IGRldiwJXAotCQkJLmNvbl9pZCA9IGNvbiwJXAotCQkJLmNsayA9IGNrLAlcCi0JCX0sCQkJXAotCX0KLQotI2RlZmluZSBDS18zMTAJKDEgPDwgMCkKLSNkZWZpbmUgQ0tfN1hYCSgxIDw8IDEpCi0jZGVmaW5lIENLXzE1MTAJKDEgPDwgMikKLSNkZWZpbmUgQ0tfMTZYWAkoMSA8PCAzKQotCi1zdGF0aWMgc3RydWN0IG9tYXBfY2xrIG9tYXBfY2xrc1tdID0gewotCS8qIG5vbi1VTFBEIGNsb2NrcyAqLwotCUNMSyhOVUxMLAkiY2tfcmVmIiwJJmNrX3JlZiwJQ0tfMTZYWCB8IENLXzE1MTAgfCBDS18zMTAgfCBDS183WFgpLAotCUNMSyhOVUxMLAkiY2tfZHBsbDEiLAkmY2tfZHBsbDEsCUNLXzE2WFggfCBDS18xNTEwIHwgQ0tfMzEwKSwKLQkvKiBDS19HRU4xIGNsb2NrcyAqLwotCUNMSyhOVUxMLAkiY2tfZHBsbDFvdXQiLAkmY2tfZHBsbDFvdXQuY2xrLCBDS18xNlhYKSwKLQlDTEsoTlVMTCwJImNrX3Nvc3NpIiwJJnNvc3NpX2NrLAlDS18xNlhYKSwKLQlDTEsoTlVMTCwJImFybV9jayIsCSZhcm1fY2ssCUNLXzE2WFggfCBDS18xNTEwIHwgQ0tfMzEwKSwKLQlDTEsoTlVMTCwJImFybXBlcl9jayIsCSZhcm1wZXJfY2suY2xrLAlDS18xNlhYIHwgQ0tfMTUxMCB8IENLXzMxMCksCi0JQ0xLKE5VTEwsCSJhcm1fZ3Bpb19jayIsCSZhcm1fZ3Bpb19jaywJQ0tfMTUxMCB8IENLXzMxMCksCi0JQ0xLKE5VTEwsCSJhcm14b3JfY2siLAkmYXJteG9yX2NrLmNsaywJQ0tfMTZYWCB8IENLXzE1MTAgfCBDS18zMTAgfCBDS183WFgpLAotCUNMSyhOVUxMLAkiYXJtdGltX2NrIiwJJmFybXRpbV9jay5jbGssCUNLXzE2WFggfCBDS18xNTEwIHwgQ0tfMzEwKSwKLQlDTEsoIm9tYXBfd2R0IiwJImZjayIsCQkmYXJtd2R0X2NrLmNsaywJQ0tfMTZYWCB8IENLXzE1MTAgfCBDS18zMTApLAotCUNMSygib21hcF93ZHQiLAkiaWNrIiwJCSZhcm1wZXJfY2suY2xrLAlDS18xNlhYKSwKLQlDTEsoIm9tYXBfd2R0IiwgImljayIsCQkmZHVtbXlfY2ssCUNLXzE1MTAgfCBDS18zMTApLAotCUNMSyhOVUxMLAkiYXJtaW50aF9jayIsCSZhcm1pbnRoX2NrMTUxMCwgQ0tfMTUxMCB8IENLXzMxMCksCi0JQ0xLKE5VTEwsCSJhcm1pbnRoX2NrIiwJJmFybWludGhfY2sxNnh4LCBDS18xNlhYKSwKLQkvKiBDS19HRU4yIGNsb2NrcyAqLwotCUNMSyhOVUxMLAkiZHNwX2NrIiwJJmRzcF9jaywJQ0tfMTZYWCB8IENLXzE1MTAgfCBDS18zMTApLAotCUNMSyhOVUxMLAkiZHNwbW11X2NrIiwJJmRzcG1tdV9jaywJQ0tfMTZYWCB8IENLXzE1MTAgfCBDS18zMTApLAotCUNMSyhOVUxMLAkiZHNwcGVyX2NrIiwJJmRzcHBlcl9jaywJQ0tfMTZYWCB8IENLXzE1MTAgfCBDS18zMTApLAotCUNMSyhOVUxMLAkiZHNweG9yX2NrIiwJJmRzcHhvcl9jaywJQ0tfMTZYWCB8IENLXzE1MTAgfCBDS18zMTApLAotCUNMSyhOVUxMLAkiZHNwdGltX2NrIiwJJmRzcHRpbV9jaywJQ0tfMTZYWCB8IENLXzE1MTAgfCBDS18zMTApLAotCS8qIENLX0dFTjMgY2xvY2tzICovCi0JQ0xLKE5VTEwsCSJ0Y19jayIsCSZ0Y19jay5jbGssCUNLXzE2WFggfCBDS18xNTEwIHwgQ0tfMzEwIHwgQ0tfN1hYKSwKLQlDTEsoTlVMTCwJInRpcGJfY2siLAkmdGlwYl9jaywJQ0tfMTUxMCB8IENLXzMxMCksCi0JQ0xLKE5VTEwsCSJsM19vY3BpX2NrIiwJJmwzX29jcGlfY2ssCUNLXzE2WFggfCBDS183WFgpLAotCUNMSyhOVUxMLAkidGMxX2NrIiwJJnRjMV9jaywJQ0tfMTZYWCksCi0JQ0xLKE5VTEwsCSJ0YzJfY2siLAkmdGMyX2NrLAlDS18xNlhYKSwKLQlDTEsoTlVMTCwJImRtYV9jayIsCSZkbWFfY2ssCUNLXzE2WFggfCBDS18xNTEwIHwgQ0tfMzEwKSwKLQlDTEsoTlVMTCwJImRtYV9sY2RmcmVlX2NrIiwgJmRtYV9sY2RmcmVlX2NrLCBDS18xNlhYKSwKLQlDTEsoTlVMTCwJImFwaV9jayIsCSZhcGlfY2suY2xrLAlDS18xNlhYIHwgQ0tfMTUxMCB8IENLXzMxMCksCi0JQ0xLKE5VTEwsCSJsYl9jayIsCSZsYl9jay5jbGssCUNLXzE1MTAgfCBDS18zMTApLAotCUNMSyhOVUxMLAkicmhlYTFfY2siLAkmcmhlYTFfY2ssCUNLXzE2WFgpLAotCUNMSyhOVUxMLAkicmhlYTJfY2siLAkmcmhlYTJfY2ssCUNLXzE2WFgpLAotCUNMSyhOVUxMLAkibGNkX2NrIiwJJmxjZF9ja18xNnh4LAlDS18xNlhYIHwgQ0tfN1hYKSwKLQlDTEsoTlVMTCwJImxjZF9jayIsCSZsY2RfY2tfMTUxMC5jbGssIENLXzE1MTAgfCBDS18zMTApLAotCS8qIFVMUEQgY2xvY2tzICovCi0JQ0xLKE5VTEwsCSJ1YXJ0MV9jayIsCSZ1YXJ0MV8xNTEwLAlDS18xNTEwIHwgQ0tfMzEwKSwKLQlDTEsoTlVMTCwJInVhcnQxX2NrIiwJJnVhcnQxXzE2eHguY2xrLCBDS18xNlhYKSwKLQlDTEsoTlVMTCwJInVhcnQyX2NrIiwJJnVhcnQyX2NrLAlDS18xNlhYIHwgQ0tfMTUxMCB8IENLXzMxMCksCi0JQ0xLKE5VTEwsCSJ1YXJ0M19jayIsCSZ1YXJ0M18xNTEwLAlDS18xNTEwIHwgQ0tfMzEwKSwKLQlDTEsoTlVMTCwJInVhcnQzX2NrIiwJJnVhcnQzXzE2eHguY2xrLCBDS18xNlhYKSwKLQlDTEsoTlVMTCwJInVzYl9jbGtvIiwJJnVzYl9jbGtvLAlDS18xNlhYIHwgQ0tfMTUxMCB8IENLXzMxMCksCi0JQ0xLKE5VTEwsCSJ1c2JfaGhjX2NrIiwJJnVzYl9oaGNfY2sxNTEwLCBDS18xNTEwIHwgQ0tfMzEwKSwKLQlDTEsoTlVMTCwJInVzYl9oaGNfY2siLAkmdXNiX2hoY19jazE2eHgsIENLXzE2WFgpLAotCUNMSyhOVUxMLAkidXNiX2RjX2NrIiwJJnVzYl9kY19jaywJQ0tfMTZYWCksCi0JQ0xLKE5VTEwsCSJ1c2JfZGNfY2siLAkmdXNiX2RjX2NrN3h4LAlDS183WFgpLAotCUNMSyhOVUxMLAkibWNsayIsCQkmbWNsa18xNTEwLAlDS18xNTEwIHwgQ0tfMzEwKSwKLQlDTEsoTlVMTCwJIm1jbGsiLAkJJm1jbGtfMTZ4eCwJQ0tfMTZYWCksCi0JQ0xLKE5VTEwsCSJiY2xrIiwJCSZiY2xrXzE1MTAsCUNLXzE1MTAgfCBDS18zMTApLAotCUNMSyhOVUxMLAkiYmNsayIsCQkmYmNsa18xNnh4LAlDS18xNlhYKSwKLQlDTEsoIm1tY2ktb21hcC4wIiwgImZjayIsCSZtbWMxX2NrLAlDS18xNlhYIHwgQ0tfMTUxMCB8IENLXzMxMCksCi0JQ0xLKCJtbWNpLW9tYXAuMCIsICJmY2siLAkmbW1jM19jaywJQ0tfN1hYKSwKLQlDTEsoIm1tY2ktb21hcC4wIiwgImljayIsCSZhcm1wZXJfY2suY2xrLAlDS18xNlhYIHwgQ0tfMTUxMCB8IENLXzMxMCB8IENLXzdYWCksCi0JQ0xLKCJtbWNpLW9tYXAuMSIsICJmY2siLAkmbW1jMl9jaywJQ0tfMTZYWCksCi0JQ0xLKCJtbWNpLW9tYXAuMSIsICJpY2siLAkmYXJtcGVyX2NrLmNsaywJQ0tfMTZYWCksCi0JLyogVmlydHVhbCBjbG9ja3MgKi8KLQlDTEsoTlVMTCwJIm1wdSIsCQkmdmlydHVhbF9ja19tcHUsIENLXzE2WFggfCBDS18xNTEwIHwgQ0tfMzEwKSwKLQlDTEsoImkyY19vbWFwLjEiLCAiZmNrIiwJJmkyY19mY2ssCUNLXzE2WFggfCBDS18xNTEwIHwgQ0tfMzEwKSwKLQlDTEsoImkyY19vbWFwLjEiLCAiaWNrIiwJJmkyY19pY2ssCUNLXzE2WFgpLAotCUNMSygiaTJjX29tYXAuMSIsICJpY2siLAkmZHVtbXlfY2ssCUNLXzE1MTAgfCBDS18zMTApLAotCUNMSygib21hcF91d2lyZSIsICJmY2siLAkmYXJteG9yX2NrLmNsaywJQ0tfMTZYWCB8IENLXzE1MTAgfCBDS18zMTApLAotCUNMSygib21hcC1tY2JzcC4xIiwgImljayIsCSZkc3BwZXJfY2ssCUNLXzE2WFgpLAotCUNMSygib21hcC1tY2JzcC4xIiwgImljayIsCSZkdW1teV9jaywJQ0tfMTUxMCB8IENLXzMxMCksCi0JQ0xLKCJvbWFwLW1jYnNwLjIiLCAiaWNrIiwJJmFybXBlcl9jay5jbGssCUNLXzE2WFgpLAotCUNMSygib21hcC1tY2JzcC4yIiwgImljayIsCSZkdW1teV9jaywJQ0tfMTUxMCB8IENLXzMxMCksCi0JQ0xLKCJvbWFwLW1jYnNwLjMiLCAiaWNrIiwJJmRzcHBlcl9jaywJQ0tfMTZYWCksCi0JQ0xLKCJvbWFwLW1jYnNwLjMiLCAiaWNrIiwJJmR1bW15X2NrLAlDS18xNTEwIHwgQ0tfMzEwKSwKLQlDTEsoIm9tYXAtbWNic3AuMSIsICJmY2siLAkmZHNweG9yX2NrLAlDS18xNlhYIHwgQ0tfMTUxMCB8IENLXzMxMCksCi0JQ0xLKCJvbWFwLW1jYnNwLjIiLCAiZmNrIiwJJmFybXBlcl9jay5jbGssCUNLXzE2WFggfCBDS18xNTEwIHwgQ0tfMzEwKSwKLQlDTEsoIm9tYXAtbWNic3AuMyIsICJmY2siLAkmZHNweG9yX2NrLAlDS18xNlhYIHwgQ0tfMTUxMCB8IENLXzMxMCksCi19OwotCi1zdGF0aWMgaW50IG9tYXAxX2Nsa19lbmFibGVfZ2VuZXJpYyhzdHJ1Y3QgY2xrICogY2xrKTsKLXN0YXRpYyBpbnQgb21hcDFfY2xrX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspOwotc3RhdGljIHZvaWQgb21hcDFfY2xrX2Rpc2FibGVfZ2VuZXJpYyhzdHJ1Y3QgY2xrICogY2xrKTsKLXN0YXRpYyB2b2lkIG9tYXAxX2Nsa19kaXNhYmxlKHN0cnVjdCBjbGsgKmNsayk7Ci0KLV9fdTMyIGFybV9pZGxlY3QxX21hc2s7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogT21hcDEgc3BlY2lmaWMgY2xvY2sgZnVuY3Rpb25zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBvbWFwMV93YXRjaGRvZ19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQorLyogWFhYIGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgZml4ZWRfZGl2aXNvcl9yZWNhbGMgKi8KK3Vuc2lnbmVkIGxvbmcgb21hcDFfd2F0Y2hkb2dfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGUgLyAxNDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgb21hcDFfdWFydF9yZWNhbGMoc3RydWN0IGNsayAqY2xrKQordW5zaWduZWQgbG9uZyBvbWFwMV91YXJ0X3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCiB7CiAJdW5zaWduZWQgaW50IHZhbCA9IF9fcmF3X3JlYWRsKGNsay0+ZW5hYmxlX3JlZyk7CiAJcmV0dXJuIHZhbCAmIGNsay0+ZW5hYmxlX2JpdCA/IDQ4MDAwMDAwIDogMTIwMDAwMDA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG9tYXAxX3Nvc3NpX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit1bnNpZ25lZCBsb25nIG9tYXAxX3Nvc3NpX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCiB7CiAJdTMyIGRpdiA9IG9tYXBfcmVhZGwoTU9EX0NPTkZfQ1RSTF8xKTsKIApAQCAtMTc5LDY0ICs3NCw2IEBACiAJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlIC8gZGl2OwogfQogCi1zdGF0aWMgaW50IG9tYXAxX2Nsa19lbmFibGVfZHNwX2RvbWFpbihzdHJ1Y3QgY2xrICpjbGspCi17Ci0JaW50IHJldHZhbDsKLQotCXJldHZhbCA9IG9tYXAxX2Nsa19lbmFibGUoJmFwaV9jay5jbGspOwotCWlmICghcmV0dmFsKSB7Ci0JCXJldHZhbCA9IG9tYXAxX2Nsa19lbmFibGVfZ2VuZXJpYyhjbGspOwotCQlvbWFwMV9jbGtfZGlzYWJsZSgmYXBpX2NrLmNsayk7Ci0JfQotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIHZvaWQgb21hcDFfY2xrX2Rpc2FibGVfZHNwX2RvbWFpbihzdHJ1Y3QgY2xrICpjbGspCi17Ci0JaWYgKG9tYXAxX2Nsa19lbmFibGUoJmFwaV9jay5jbGspID09IDApIHsKLQkJb21hcDFfY2xrX2Rpc2FibGVfZ2VuZXJpYyhjbGspOwotCQlvbWFwMV9jbGtfZGlzYWJsZSgmYXBpX2NrLmNsayk7Ci0JfQotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa29wcyBjbGtvcHNfZHNwY2sgPSB7Ci0JLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZV9kc3BfZG9tYWluLAotCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlX2RzcF9kb21haW4sCi19OwotCi1zdGF0aWMgaW50IG9tYXAxX2Nsa19lbmFibGVfdWFydF9mdW5jdGlvbmFsKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCB1YXJ0X2NsayAqdWNsazsKLQotCXJldCA9IG9tYXAxX2Nsa19lbmFibGVfZ2VuZXJpYyhjbGspOwotCWlmIChyZXQgPT0gMCkgewotCQkvKiBTZXQgc21hcnQgaWRsZSBhY2tub3dsZWRnZW1lbnQgbW9kZSAqLwotCQl1Y2xrID0gKHN0cnVjdCB1YXJ0X2NsayAqKWNsazsKLQkJb21hcF93cml0ZWIoKG9tYXBfcmVhZGIodWNsay0+c3lzY19hZGRyKSAmIH4weDEwKSB8IDgsCi0JCQkgICAgdWNsay0+c3lzY19hZGRyKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBvbWFwMV9jbGtfZGlzYWJsZV91YXJ0X2Z1bmN0aW9uYWwoc3RydWN0IGNsayAqY2xrKQotewotCXN0cnVjdCB1YXJ0X2NsayAqdWNsazsKLQotCS8qIFNldCBmb3JjZSBpZGxlIGFja25vd2xlZGdlbWVudCBtb2RlICovCi0JdWNsayA9IChzdHJ1Y3QgdWFydF9jbGsgKiljbGs7Ci0Jb21hcF93cml0ZWIoKG9tYXBfcmVhZGIodWNsay0+c3lzY19hZGRyKSAmIH4weDE4KSwgdWNsay0+c3lzY19hZGRyKTsKLQotCW9tYXAxX2Nsa19kaXNhYmxlX2dlbmVyaWMoY2xrKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtvcHMgY2xrb3BzX3VhcnQgPSB7Ci0JLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZV91YXJ0X2Z1bmN0aW9uYWwsCi0JLmRpc2FibGUJPSAmb21hcDFfY2xrX2Rpc2FibGVfdWFydF9mdW5jdGlvbmFsLAotfTsKLQogc3RhdGljIHZvaWQgb21hcDFfY2xrX2FsbG93X2lkbGUoc3RydWN0IGNsayAqY2xrKQogewogCXN0cnVjdCBhcm1faWRsZWN0MV9jbGsgKiBpY2xrID0gKHN0cnVjdCBhcm1faWRsZWN0MV9jbGsgKiljbGs7CkBAIC0zNDQsNyArMTgxLDcgQEAKIAlyZXR1cm4gZHNvcl9leHA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG9tYXAxX2NrY3RsX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit1bnNpZ25lZCBsb25nIG9tYXAxX2NrY3RsX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCiB7CiAJLyogQ2FsY3VsYXRlIGRpdmlzb3IgZW5jb2RlZCBhcyAyLWJpdCBleHBvbmVudCAqLwogCWludCBkc29yID0gMSA8PCAoMyAmIChvbWFwX3JlYWR3KEFSTV9DS0NUTCkgPj4gY2xrLT5yYXRlX29mZnNldCkpOwpAQCAtMzUyLDcgKzE4OSw3IEBACiAJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlIC8gZHNvcjsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgb21hcDFfY2tjdGxfcmVjYWxjX2RzcF9kb21haW4oc3RydWN0IGNsayAqY2xrKQordW5zaWduZWQgbG9uZyBvbWFwMV9ja2N0bF9yZWNhbGNfZHNwX2RvbWFpbihzdHJ1Y3QgY2xrICpjbGspCiB7CiAJaW50IGRzb3I7CiAKQEAgLTM2MywyOCArMjAwLDI5IEBACiAJICogTm90ZSB0aGF0IERTUF9DS0NUTCB2aXJ0IGFkZHIgPSBwaHlzIGFkZHIsIHNvCiAJICogd2UgbXVzdCB1c2UgX19yYXdfcmVhZHcoKSBpbnN0ZWFkIG9mIG9tYXBfcmVhZHcoKS4KIAkgKi8KLQlvbWFwMV9jbGtfZW5hYmxlKCZhcGlfY2suY2xrKTsKKwlvbWFwMV9jbGtfZW5hYmxlKGFwaV9ja19wKTsKIAlkc29yID0gMSA8PCAoMyAmIChfX3Jhd19yZWFkdyhEU1BfQ0tDVEwpID4+IGNsay0+cmF0ZV9vZmZzZXQpKTsKLQlvbWFwMV9jbGtfZGlzYWJsZSgmYXBpX2NrLmNsayk7CisJb21hcDFfY2xrX2Rpc2FibGUoYXBpX2NrX3ApOwogCiAJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlIC8gZHNvcjsKIH0KIAogLyogTVBVIHZpcnR1YWwgY2xvY2sgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IG9tYXAxX3NlbGVjdF90YWJsZV9yYXRlKHN0cnVjdCBjbGsgKiBjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK2ludCBvbWFwMV9zZWxlY3RfdGFibGVfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKIHsKIAkvKiBGaW5kIHRoZSBoaWdoZXN0IHN1cHBvcnRlZCBmcmVxdWVuY3kgPD0gcmF0ZSBhbmQgc3dpdGNoIHRvIGl0ICovCiAJc3RydWN0IG1wdV9yYXRlICogcHRyOworCXVuc2lnbmVkIGxvbmcgZHBsbDFfcmF0ZSwgcmVmX3JhdGU7CiAKLQlpZiAoY2xrICE9ICZ2aXJ0dWFsX2NrX21wdSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJZHBsbDFfcmF0ZSA9IGNsa19nZXRfcmF0ZShja19kcGxsMV9wKTsKKwlyZWZfcmF0ZSA9IGNsa19nZXRfcmF0ZShja19yZWZfcCk7CiAKLQlmb3IgKHB0ciA9IHJhdGVfdGFibGU7IHB0ci0+cmF0ZTsgcHRyKyspIHsKLQkJaWYgKHB0ci0+eHRhbCAhPSBja19yZWYucmF0ZSkKKwlmb3IgKHB0ciA9IG9tYXAxX3JhdGVfdGFibGU7IHB0ci0+cmF0ZTsgcHRyKyspIHsKKwkJaWYgKHB0ci0+eHRhbCAhPSByZWZfcmF0ZSkKIAkJCWNvbnRpbnVlOwogCiAJCS8qIERQTEwxIGNhbm5vdCBiZSByZXByb2dyYW1tZWQgd2l0aG91dCByaXNraW5nIHN5c3RlbSBjcmFzaCAqLwotCQlpZiAobGlrZWx5KGNrX2RwbGwxLnJhdGUhPTApICYmIHB0ci0+cGxsX3JhdGUgIT0gY2tfZHBsbDEucmF0ZSkKKwkJaWYgKGxpa2VseShkcGxsMV9yYXRlICE9IDApICYmIHB0ci0+cGxsX3JhdGUgIT0gZHBsbDFfcmF0ZSkKIAkJCWNvbnRpbnVlOwogCiAJCS8qIENhbiBjaGVjayBvbmx5IGFmdGVyIHh0YWwgZnJlcXVlbmN5IGNoZWNrICovCkBAIC00MDUsMTEgKzI0MywxMyBAQAogCWVsc2UKIAkJb21hcF9zcmFtX3JlcHJvZ3JhbV9jbG9jayhwdHItPmRwbGxjdGxfdmFsLCBwdHItPmNrY3RsX3ZhbCk7CiAKLQlja19kcGxsMS5yYXRlID0gcHRyLT5wbGxfcmF0ZTsKKwkvKiBYWFggRG8gd2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUgdHJlZSBiZWxvdyBEUExMMSBhdCB0aGlzIHBvaW50PyAqLworCWNrX2RwbGwxX3AtPnJhdGUgPSBwdHItPnBsbF9yYXRlOworCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb21hcDFfY2xrX3NldF9yYXRlX2RzcF9kb21haW4oc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCitpbnQgb21hcDFfY2xrX3NldF9yYXRlX2RzcF9kb21haW4oc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCiB7CiAJaW50IGRzb3JfZXhwOwogCXUxNiByZWd2YWw7CkBAIC00MjksNyArMjY5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGxvbmcgb21hcDFfY2xrX3JvdW5kX3JhdGVfY2tjdGxfYXJtKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQorbG9uZyBvbWFwMV9jbGtfcm91bmRfcmF0ZV9ja2N0bF9hcm0oc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCiB7CiAJaW50IGRzb3JfZXhwID0gY2FsY19kc29yX2V4cChjbGssIHJhdGUpOwogCWlmIChkc29yX2V4cCA8IDApCkBAIC00MzksNyArMjc5LDcgQEAKIAlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGUgLyAoMSA8PCBkc29yX2V4cCk7CiB9CiAKLXN0YXRpYyBpbnQgb21hcDFfY2xrX3NldF9yYXRlX2NrY3RsX2FybShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK2ludCBvbWFwMV9jbGtfc2V0X3JhdGVfY2tjdGxfYXJtKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQogewogCWludCBkc29yX2V4cDsKIAl1MTYgcmVndmFsOwpAQCAtNDU5LDE5ICsyOTksMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGxvbmcgb21hcDFfcm91bmRfdG9fdGFibGVfcmF0ZShzdHJ1Y3QgY2xrICogY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCitsb25nIG9tYXAxX3JvdW5kX3RvX3RhYmxlX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCiB7CiAJLyogRmluZCB0aGUgaGlnaGVzdCBzdXBwb3J0ZWQgZnJlcXVlbmN5IDw9IHJhdGUgKi8KIAlzdHJ1Y3QgbXB1X3JhdGUgKiBwdHI7Ci0JbG9uZyAgaGlnaGVzdF9yYXRlOworCWxvbmcgaGlnaGVzdF9yYXRlOworCXVuc2lnbmVkIGxvbmcgcmVmX3JhdGU7CiAKLQlpZiAoY2xrICE9ICZ2aXJ0dWFsX2NrX21wdSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJcmVmX3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2tfcmVmX3ApOwogCiAJaGlnaGVzdF9yYXRlID0gLUVJTlZBTDsKIAotCWZvciAocHRyID0gcmF0ZV90YWJsZTsgcHRyLT5yYXRlOyBwdHIrKykgewotCQlpZiAocHRyLT54dGFsICE9IGNrX3JlZi5yYXRlKQorCWZvciAocHRyID0gb21hcDFfcmF0ZV90YWJsZTsgcHRyLT5yYXRlOyBwdHIrKykgeworCQlpZiAocHRyLT54dGFsICE9IHJlZl9yYXRlKQogCQkJY29udGludWU7CiAKIAkJaGlnaGVzdF9yYXRlID0gcHRyLT5yYXRlOwpAQCAtNTA2LDggKzM0Niw4IEBACiAJcmV0dXJuIGRzb3I7CiB9CiAKLS8qIE9ubHkgbmVlZGVkIG9uIDE1MTAgKi8KLXN0YXRpYyBpbnQgb21hcDFfc2V0X3VhcnRfcmF0ZShzdHJ1Y3QgY2xrICogY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCisvKiBYWFggT25seSBuZWVkZWQgb24gMTUxMCAqLworaW50IG9tYXAxX3NldF91YXJ0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCiB7CiAJdW5zaWduZWQgaW50IHZhbDsKIApAQCAtNTI1LDcgKzM2NSw3IEBACiB9CiAKIC8qIEV4dGVybmFsIGNsb2NrIChNQ0xLICYgQkNMSykgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IG9tYXAxX3NldF9leHRfY2xrX3JhdGUoc3RydWN0IGNsayAqIGNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoraW50IG9tYXAxX3NldF9leHRfY2xrX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCiB7CiAJdW5zaWduZWQgZHNvcjsKIAlfX3UxNiByYXRpb19iaXRzOwpAQCAtNTQzLDcgKzM4Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb21hcDFfc2V0X3Nvc3NpX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCitpbnQgb21hcDFfc2V0X3Nvc3NpX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCiB7CiAJdTMyIGw7CiAJaW50IGRpdjsKQEAgLTU2NiwxMiArNDA2LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBsb25nIG9tYXAxX3JvdW5kX2V4dF9jbGtfcmF0ZShzdHJ1Y3QgY2xrICogY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCitsb25nIG9tYXAxX3JvdW5kX2V4dF9jbGtfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKIHsKIAlyZXR1cm4gOTYwMDAwMDAgLyBjYWxjX2V4dF9kc29yKHJhdGUpOwogfQogCi1zdGF0aWMgdm9pZCBvbWFwMV9pbml0X2V4dF9jbGsoc3RydWN0IGNsayAqIGNsaykKK3ZvaWQgb21hcDFfaW5pdF9leHRfY2xrKHN0cnVjdCBjbGsgKmNsaykKIHsKIAl1bnNpZ25lZCBkc29yOwogCV9fdTE2IHJhdGlvX2JpdHM7CkBAIC01ODksNyArNDI5LDcgQEAKIAljbGstPiByYXRlID0gOTYwMDAwMDAgLyBkc29yOwogfQogCi1zdGF0aWMgaW50IG9tYXAxX2Nsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQoraW50IG9tYXAxX2Nsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQogewogCWludCByZXQgPSAwOwogCkBAIC02MTcsNyArNDU3LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBvbWFwMV9jbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCit2b2lkIG9tYXAxX2Nsa19kaXNhYmxlKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlpZiAoY2xrLT51c2Vjb3VudCA+IDAgJiYgISgtLWNsay0+dXNlY291bnQpKSB7CiAJCWNsay0+b3BzLT5kaXNhYmxlKGNsayk7CkBAIC02NzIsMTIgKzUxMiw3MCBAQAogCX0KIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtvcHMgY2xrb3BzX2dlbmVyaWMgPSB7Ci0JLmVuYWJsZQkJPSAmb21hcDFfY2xrX2VuYWJsZV9nZW5lcmljLAotCS5kaXNhYmxlCT0gJm9tYXAxX2Nsa19kaXNhYmxlX2dlbmVyaWMsCitjb25zdCBzdHJ1Y3QgY2xrb3BzIGNsa29wc19nZW5lcmljID0geworCS5lbmFibGUJCT0gb21hcDFfY2xrX2VuYWJsZV9nZW5lcmljLAorCS5kaXNhYmxlCT0gb21hcDFfY2xrX2Rpc2FibGVfZ2VuZXJpYywKIH07CiAKLXN0YXRpYyBsb25nIG9tYXAxX2Nsa19yb3VuZF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQorc3RhdGljIGludCBvbWFwMV9jbGtfZW5hYmxlX2RzcF9kb21haW4oc3RydWN0IGNsayAqY2xrKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBvbWFwMV9jbGtfZW5hYmxlKGFwaV9ja19wKTsKKwlpZiAoIXJldHZhbCkgeworCQlyZXR2YWwgPSBvbWFwMV9jbGtfZW5hYmxlX2dlbmVyaWMoY2xrKTsKKwkJb21hcDFfY2xrX2Rpc2FibGUoYXBpX2NrX3ApOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXAxX2Nsa19kaXNhYmxlX2RzcF9kb21haW4oc3RydWN0IGNsayAqY2xrKQoreworCWlmIChvbWFwMV9jbGtfZW5hYmxlKGFwaV9ja19wKSA9PSAwKSB7CisJCW9tYXAxX2Nsa19kaXNhYmxlX2dlbmVyaWMoY2xrKTsKKwkJb21hcDFfY2xrX2Rpc2FibGUoYXBpX2NrX3ApOworCX0KK30KKworY29uc3Qgc3RydWN0IGNsa29wcyBjbGtvcHNfZHNwY2sgPSB7CisJLmVuYWJsZQkJPSBvbWFwMV9jbGtfZW5hYmxlX2RzcF9kb21haW4sCisJLmRpc2FibGUJPSBvbWFwMV9jbGtfZGlzYWJsZV9kc3BfZG9tYWluLAorfTsKKworc3RhdGljIGludCBvbWFwMV9jbGtfZW5hYmxlX3VhcnRfZnVuY3Rpb25hbChzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgdWFydF9jbGsgKnVjbGs7CisKKwlyZXQgPSBvbWFwMV9jbGtfZW5hYmxlX2dlbmVyaWMoY2xrKTsKKwlpZiAocmV0ID09IDApIHsKKwkJLyogU2V0IHNtYXJ0IGlkbGUgYWNrbm93bGVkZ2VtZW50IG1vZGUgKi8KKwkJdWNsayA9IChzdHJ1Y3QgdWFydF9jbGsgKiljbGs7CisJCW9tYXBfd3JpdGViKChvbWFwX3JlYWRiKHVjbGstPnN5c2NfYWRkcikgJiB+MHgxMCkgfCA4LAorCQkJICAgIHVjbGstPnN5c2NfYWRkcik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgb21hcDFfY2xrX2Rpc2FibGVfdWFydF9mdW5jdGlvbmFsKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlzdHJ1Y3QgdWFydF9jbGsgKnVjbGs7CisKKwkvKiBTZXQgZm9yY2UgaWRsZSBhY2tub3dsZWRnZW1lbnQgbW9kZSAqLworCXVjbGsgPSAoc3RydWN0IHVhcnRfY2xrICopY2xrOworCW9tYXBfd3JpdGViKChvbWFwX3JlYWRiKHVjbGstPnN5c2NfYWRkcikgJiB+MHgxOCksIHVjbGstPnN5c2NfYWRkcik7CisKKwlvbWFwMV9jbGtfZGlzYWJsZV9nZW5lcmljKGNsayk7Cit9CisKK2NvbnN0IHN0cnVjdCBjbGtvcHMgY2xrb3BzX3VhcnQgPSB7CisJLmVuYWJsZQkJPSBvbWFwMV9jbGtfZW5hYmxlX3VhcnRfZnVuY3Rpb25hbCwKKwkuZGlzYWJsZQk9IG9tYXAxX2Nsa19kaXNhYmxlX3VhcnRfZnVuY3Rpb25hbCwKK307CisKK2xvbmcgb21hcDFfY2xrX3JvdW5kX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCiB7CiAJaWYgKGNsay0+ZmxhZ3MgJiBSQVRFX0ZJWEVEKQogCQlyZXR1cm4gY2xrLT5yYXRlOwpAQCAtNjg4LDcgKzU4Niw3IEBACiAJcmV0dXJuIGNsay0+cmF0ZTsKIH0KIAotc3RhdGljIGludCBvbWFwMV9jbGtfc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCitpbnQgb21hcDFfY2xrX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQogewogCWludCAgcmV0ID0gLUVJTlZBTDsKIApAQCAtNzAzLDcgKzYwMSw3IEBACiAKICNpZmRlZiBDT05GSUdfT01BUF9SRVNFVF9DTE9DS1MKIAotc3RhdGljIHZvaWQgX19pbml0IG9tYXAxX2Nsa19kaXNhYmxlX3VudXNlZChzdHJ1Y3QgY2xrICpjbGspCit2b2lkIF9faW5pdCBvbWFwMV9jbGtfZGlzYWJsZV91bnVzZWQoc3RydWN0IGNsayAqY2xrKQogewogCV9fdTMyIHJlZ3ZhbDMyOwogCkBAIC03MjQsMTg0ICs2MjIsOSBAQAogCWlmICgocmVndmFsMzIgJiAoMSA8PCBjbGstPmVuYWJsZV9iaXQpKSA9PSAwKQogCQlyZXR1cm47CiAKLQkvKiBGSVhNRTogVGhpcyBjbG9jayBzZWVtcyB0byBiZSBuZWNlc3NhcnkgYnV0IG5vLW9uZQotCSAqIGhhcyBhc2tlZCBmb3IgaXRzIGFjdGl2YXRpb24uICovCi0JaWYgKGNsayA9PSAmdGMyX2NrCQkvKiBGSVg6IHBtLmMgKFNSQU0pLCBDQ1AsIENhbWVyYSAqLwotCSAgICB8fCBjbGsgPT0gJmNrX2RwbGwxb3V0LmNsawkvKiBGSVg6IFNvU1NJLCBTU1IgKi8KLQkgICAgfHwgY2xrID09ICZhcm1fZ3Bpb19jawkvKiBGSVg6IEdQSU8gY29kZSBmb3IgMTUxMCAqLwotCQkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRklYTUU6IENsb2NrIFwiJXNcIiBzZWVtcyB1bnVzZWRcbiIsCi0JCSAgICAgICBjbGstPm5hbWUpOwotCQlyZXR1cm47Ci0JfQotCiAJcHJpbnRrKEtFUk5fSU5GTyAiRGlzYWJsaW5nIHVudXNlZCBjbG9jayBcIiVzXCIuLi4gIiwgY2xrLT5uYW1lKTsKIAljbGstPm9wcy0+ZGlzYWJsZShjbGspOwogCXByaW50aygiIGRvbmVcbiIpOwogfQogCi0jZWxzZQotI2RlZmluZSBvbWFwMV9jbGtfZGlzYWJsZV91bnVzZWQJTlVMTAogI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3QgY2xrX2Z1bmN0aW9ucyBvbWFwMV9jbGtfZnVuY3Rpb25zID0gewotCS5jbGtfZW5hYmxlCQk9IG9tYXAxX2Nsa19lbmFibGUsCi0JLmNsa19kaXNhYmxlCQk9IG9tYXAxX2Nsa19kaXNhYmxlLAotCS5jbGtfcm91bmRfcmF0ZQkJPSBvbWFwMV9jbGtfcm91bmRfcmF0ZSwKLQkuY2xrX3NldF9yYXRlCQk9IG9tYXAxX2Nsa19zZXRfcmF0ZSwKLQkuY2xrX2Rpc2FibGVfdW51c2VkCT0gb21hcDFfY2xrX2Rpc2FibGVfdW51c2VkLAotfTsKLQotaW50IF9faW5pdCBvbWFwMV9jbGtfaW5pdCh2b2lkKQotewotCXN0cnVjdCBvbWFwX2NsayAqYzsKLQljb25zdCBzdHJ1Y3Qgb21hcF9jbG9ja19jb25maWcgKmluZm87Ci0JaW50IGNyeXN0YWxfdHlwZSA9IDA7IC8qIERlZmF1bHQgMTIgTUh6ICovCi0JdTMyIHJlZywgY3B1X21hc2s7Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfTEwKLQkvKiBSZXNldHMgc29tZSBjbG9ja3MgdGhhdCBtYXkgYmUgbGVmdCBvbiBmcm9tIGJvb3Rsb2FkZXIsCi0JICogYnV0IGxlYXZlcyBzZXJpYWwgY2xvY2tzIG9uLgotIAkgKi8KLQlvbWFwX3dyaXRlbCgweDMgPDwgMjksIE1PRF9DT05GX0NUUkxfMCk7Ci0jZW5kaWYKLQotCS8qIFVTQl9SRVFfRU4gd2lsbCBiZSBkaXNhYmxlZCBsYXRlciBpZiBuZWNlc3NhcnkgKHVzYl9kY19jaykgKi8KLQlyZWcgPSBvbWFwX3JlYWR3KFNPRlRfUkVRX1JFRykgJiAoMSA8PCA0KTsKLQlvbWFwX3dyaXRldyhyZWcsIFNPRlRfUkVRX1JFRyk7Ci0JaWYgKCFjcHVfaXNfb21hcDE1eHgoKSkKLQkJb21hcF93cml0ZXcoMCwgU09GVF9SRVFfUkVHMik7Ci0KLQljbGtfaW5pdCgmb21hcDFfY2xrX2Z1bmN0aW9ucyk7Ci0KLQkvKiBCeSBkZWZhdWx0IGFsbCBpZGxlY3QxIGNsb2NrcyBhcmUgYWxsb3dlZCB0byBpZGxlICovCi0JYXJtX2lkbGVjdDFfbWFzayA9IH4wOwotCi0JZm9yIChjID0gb21hcF9jbGtzOyBjIDwgb21hcF9jbGtzICsgQVJSQVlfU0laRShvbWFwX2Nsa3MpOyBjKyspCi0JCWNsa19wcmVpbml0KGMtPmxrLmNsayk7Ci0KLQljcHVfbWFzayA9IDA7Ci0JaWYgKGNwdV9pc19vbWFwMTZ4eCgpKQotCQljcHVfbWFzayB8PSBDS18xNlhYOwotCWlmIChjcHVfaXNfb21hcDE1MTAoKSkKLQkJY3B1X21hc2sgfD0gQ0tfMTUxMDsKLQlpZiAoY3B1X2lzX29tYXA3eHgoKSkKLQkJY3B1X21hc2sgfD0gQ0tfN1hYOwotCWlmIChjcHVfaXNfb21hcDMxMCgpKQotCQljcHVfbWFzayB8PSBDS18zMTA7Ci0KLQlmb3IgKGMgPSBvbWFwX2Nsa3M7IGMgPCBvbWFwX2Nsa3MgKyBBUlJBWV9TSVpFKG9tYXBfY2xrcyk7IGMrKykKLQkJaWYgKGMtPmNwdSAmIGNwdV9tYXNrKSB7Ci0JCQljbGtkZXZfYWRkKCZjLT5sayk7Ci0JCQljbGtfcmVnaXN0ZXIoYy0+bGsuY2xrKTsKLQkJfQotCi0JaW5mbyA9IG9tYXBfZ2V0X2NvbmZpZyhPTUFQX1RBR19DTE9DSywgc3RydWN0IG9tYXBfY2xvY2tfY29uZmlnKTsKLQlpZiAoaW5mbyAhPSBOVUxMKSB7Ci0JCWlmICghY3B1X2lzX29tYXAxNXh4KCkpCi0JCQljcnlzdGFsX3R5cGUgPSBpbmZvLT5zeXN0ZW1fY2xvY2tfdHlwZTsKLQl9Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVA3MzApIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDg1MCkKLQlja19yZWYucmF0ZSA9IDEzMDAwMDAwOwotI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKLQlpZiAoY3J5c3RhbF90eXBlID09IDIpCi0JCWNrX3JlZi5yYXRlID0gMTkyMDAwMDA7Ci0jZW5kaWYKLQotCXByaW50aygiQ2xvY2tzOiBBUk1fU1lTU1Q6IDB4JTA0eCBEUExMX0NUTDogMHglMDR4IEFSTV9DS0NUTDogMHglMDR4XG4iLAotCSAgICAgICBvbWFwX3JlYWR3KEFSTV9TWVNTVCksIG9tYXBfcmVhZHcoRFBMTF9DVEwpLAotCSAgICAgICBvbWFwX3JlYWR3KEFSTV9DS0NUTCkpOwotCi0JLyogV2Ugd2FudCB0byBiZSBpbiBzeW5jcm9ub3VzIHNjYWxhYmxlIG1vZGUgKi8KLQlvbWFwX3dyaXRldygweDEwMDAsIEFSTV9TWVNTVCk7Ci0KLSNpZmRlZiBDT05GSUdfT01BUF9DTE9DS1NfU0VUX0JZX0JPT1RMT0FERVIKLQkvKiBVc2UgdmFsdWVzIHNldCBieSBib290bG9hZGVyLiBEZXRlcm1pbmUgUExMIHJhdGUgYW5kIHJlY2FsY3VsYXRlCi0JICogZGVwZW5kZW50IGNsb2NrcyBhcyBpZiBrZXJuZWwgaGFkIGNoYW5nZWQgUExMIG9yIGRpdmlzb3JzLgotCSAqLwotCXsKLQkJdW5zaWduZWQgcGxsX2N0bF92YWwgPSBvbWFwX3JlYWR3KERQTExfQ1RMKTsKLQotCQlja19kcGxsMS5yYXRlID0gY2tfcmVmLnJhdGU7IC8qIEJhc2UgeHRhbCByYXRlICovCi0JCWlmIChwbGxfY3RsX3ZhbCAmIDB4MTApIHsKLQkJCS8qIFBMTCBlbmFibGVkLCBhcHBseSBtdWx0aXBsaWVyIGFuZCBkaXZpc29yICovCi0JCQlpZiAocGxsX2N0bF92YWwgJiAweGY4MCkKLQkJCQlja19kcGxsMS5yYXRlICo9IChwbGxfY3RsX3ZhbCAmIDB4ZjgwKSA+PiA3OwotCQkJY2tfZHBsbDEucmF0ZSAvPSAoKHBsbF9jdGxfdmFsICYgMHg2MCkgPj4gNSkgKyAxOwotCQl9IGVsc2UgewotCQkJLyogUExMIGRpc2FibGVkLCBhcHBseSBieXBhc3MgZGl2aXNvciAqLwotCQkJc3dpdGNoIChwbGxfY3RsX3ZhbCAmIDB4YykgewotCQkJY2FzZSAwOgotCQkJCWJyZWFrOwotCQkJY2FzZSAweDQ6Ci0JCQkJY2tfZHBsbDEucmF0ZSAvPSAyOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlja19kcGxsMS5yYXRlIC89IDQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0jZWxzZQotCS8qIEZpbmQgdGhlIGhpZ2hlc3Qgc3VwcG9ydGVkIGZyZXF1ZW5jeSBhbmQgZW5hYmxlIGl0ICovCi0JaWYgKG9tYXAxX3NlbGVjdF90YWJsZV9yYXRlKCZ2aXJ0dWFsX2NrX21wdSwgfjApKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU3lzdGVtIGZyZXF1ZW5jaWVzIG5vdCBzZXQuIENoZWNrIHlvdXIgY29uZmlnLlxuIik7Ci0JCS8qIEd1ZXNzIHNhbmUgdmFsdWVzICg2ME1IeikgKi8KLQkJb21hcF93cml0ZXcoMHgyMjkwLCBEUExMX0NUTCk7Ci0JCW9tYXBfd3JpdGV3KGNwdV9pc19vbWFwN3h4KCkgPyAweDMwMDUgOiAweDEwMDUsIEFSTV9DS0NUTCk7Ci0JCWNrX2RwbGwxLnJhdGUgPSA2MDAwMDAwMDsKLQl9Ci0jZW5kaWYKLQlwcm9wYWdhdGVfcmF0ZSgmY2tfZHBsbDEpOwotCS8qIENhY2hlIHJhdGVzIGZvciBjbG9ja3MgY29ubmVjdGVkIHRvIGNrX3JlZiAobm90IGRwbGwxKSAqLwotCXByb3BhZ2F0ZV9yYXRlKCZja19yZWYpOwotCXByaW50ayhLRVJOX0lORk8gIkNsb2NraW5nIHJhdGUgKHh0YWwvRFBMTDEvTVBVKTogIgotCQkiJWxkLiUwMWxkLyVsZC4lMDFsZC8lbGQuJTAxbGQgTUh6XG4iLAotCSAgICAgICBja19yZWYucmF0ZSAvIDEwMDAwMDAsIChja19yZWYucmF0ZSAvIDEwMDAwMCkgJSAxMCwKLQkgICAgICAgY2tfZHBsbDEucmF0ZSAvIDEwMDAwMDAsIChja19kcGxsMS5yYXRlIC8gMTAwMDAwKSAlIDEwLAotCSAgICAgICBhcm1fY2sucmF0ZSAvIDEwMDAwMDAsIChhcm1fY2sucmF0ZSAvIDEwMDAwMCkgJSAxMCk7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19NQUNIX09NQVBfUEVSU0VVUzIpIHx8IGRlZmluZWQoQ09ORklHX01BQ0hfT01BUF9GU0FNUExFKQotCS8qIFNlbGVjdCBzbGljZXIgb3V0cHV0IGFzIE9NQVAgaW5wdXQgY2xvY2sgKi8KLQlvbWFwX3dyaXRldyhvbWFwX3JlYWR3KE9NQVA3WFhfUENDX1VQTERfQ1RSTCkgJiB+MHgxLCBPTUFQN1hYX1BDQ19VUExEX0NUUkwpOwotI2VuZGlmCi0KLQkvKiBBbXN0cmFkIERlbHRhIHdhbnRzIEJDTEsgaGlnaCB3aGVuIGluYWN0aXZlICovCi0JaWYgKG1hY2hpbmVfaXNfYW1zX2RlbHRhKCkpCi0JCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoVUxQRF9DTE9DS19DVFJMKSB8Ci0JCQkJKDEgPDwgU0RXX01DTEtfSU5WX0JJVCksCi0JCQkJVUxQRF9DTE9DS19DVFJMKTsKLQotCS8qIFR1cm4gb2ZmIERTUCBhbmQgQVJNX1RJTVhPLiBNYWtlIHN1cmUgQVJNX0lOVEhDSyBpcyBub3QgZGl2aWRlZCAqLwotCS8qIChvbiA3MzAsIGJpdCAxMyBtdXN0IG5vdCBiZSBjbGVhcmVkKSAqLwotCWlmIChjcHVfaXNfb21hcDd4eCgpKQotCQlvbWFwX3dyaXRldyhvbWFwX3JlYWR3KEFSTV9DS0NUTCkgJiAweDJmZmYsIEFSTV9DS0NUTCk7Ci0JZWxzZQotCQlvbWFwX3dyaXRldyhvbWFwX3JlYWR3KEFSTV9DS0NUTCkgJiAweDBmZmYsIEFSTV9DS0NUTCk7Ci0KLQkvKiBQdXQgRFNQL01QVUkgaW50byByZXNldCB1bnRpbCBuZWVkZWQgKi8KLQlvbWFwX3dyaXRldygwLCBBUk1fUlNUQ1QxKTsKLQlvbWFwX3dyaXRldygxLCBBUk1fUlNUQ1QyKTsKLQlvbWFwX3dyaXRldygweDQwMCwgQVJNX0lETEVDVDEpOwotCi0JLyoKLQkgKiBBY2NvcmRpbmcgdG8gT01BUDU5MTAgRXJyYXR1bSBTWVNfRE1BXzEsIGJpdCBETUFDS19SRVEgKGJpdCA4KQotCSAqIG9mIHRoZSBBUk1fSURMRUNUMiByZWdpc3RlciBtdXN0IGJlIHNldCB0byB6ZXJvLiBUaGUgcG93ZXItb24KLQkgKiBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgYml0IGlzIG9uZS4KLQkgKi8KLQlvbWFwX3dyaXRldygweDAwMDAsIEFSTV9JRExFQ1QyKTsJLyogVHVybiBMQ0QgY2xvY2sgb2ZmIGFsc28gKi8KLQotCS8qCi0JICogT25seSBlbmFibGUgdGhvc2UgY2xvY2tzIHdlIHdpbGwgbmVlZCwgbGV0IHRoZSBkcml2ZXJzCi0JICogZW5hYmxlIG90aGVyIGNsb2NrcyBhcyBuZWNlc3NhcnkKLQkgKi8KLQljbGtfZW5hYmxlKCZhcm1wZXJfY2suY2xrKTsKLQljbGtfZW5hYmxlKCZhcm14b3JfY2suY2xrKTsKLQljbGtfZW5hYmxlKCZhcm10aW1fY2suY2xrKTsgLyogVGhpcyBzaG91bGQgYmUgZG9uZSBieSB0aW1lciBjb2RlICovCi0KLQlpZiAoY3B1X2lzX29tYXAxNXh4KCkpCi0JCWNsa19lbmFibGUoJmFybV9ncGlvX2NrKTsKLQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9jbG9jay5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9jbG9jay5oCmluZGV4IDI5ZmZhOTcuLmE0MTkwYWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvY2xvY2suaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2Nsb2NrLmgKQEAgLTEsNyArMSw3IEBACiAvKgogICogIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDEvY2xvY2suaAogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDQgLSAyMDA1IE5va2lhIGNvcnBvcmF0aW9uCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IC0gMjAwNSwgMjAwOSBOb2tpYSBjb3Jwb3JhdGlvbgogICogIFdyaXR0ZW4gYnkgVHV1a2thIFRpa2thbmVuIDx0dXVra2EudGlra2FuZW5AZWxla3Ryb2JpdC5jb20+CiAgKiAgQmFzZWQgb24gY2xvY2tzLmggYnkgVG9ueSBMaW5kZ3JlbiwgR29yZG9uIE1jTnV0dCBhbmQgUmlkZ2VSdW4sIEluYwogICoKQEAgLTEzLDMwICsxMywzNiBAQAogI2lmbmRlZiBfX0FSQ0hfQVJNX01BQ0hfT01BUDFfQ0xPQ0tfSAogI2RlZmluZSBfX0FSQ0hfQVJNX01BQ0hfT01BUDFfQ0xPQ0tfSAogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBvbWFwMV9ja2N0bF9yZWNhbGMoc3RydWN0IGNsayAqY2xrKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG9tYXAxX3dhdGNoZG9nX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspOwotc3RhdGljIGludCBvbWFwMV9zZXRfc29zc2lfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBvbWFwMV9zb3NzaV9yZWNhbGMoc3RydWN0IGNsayAqY2xrKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG9tYXAxX2NrY3RsX3JlY2FsY19kc3BfZG9tYWluKHN0cnVjdCBjbGsgKmNsayk7Ci1zdGF0aWMgaW50IG9tYXAxX2Nsa19zZXRfcmF0ZV9kc3BfZG9tYWluKHN0cnVjdCBjbGsgKiBjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7Ci1zdGF0aWMgaW50IG9tYXAxX3NldF91YXJ0X3JhdGUoc3RydWN0IGNsayAqIGNsaywgdW5zaWduZWQgbG9uZyByYXRlKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG9tYXAxX3VhcnRfcmVjYWxjKHN0cnVjdCBjbGsgKmNsayk7Ci1zdGF0aWMgaW50IG9tYXAxX3NldF9leHRfY2xrX3JhdGUoc3RydWN0IGNsayAqIGNsaywgdW5zaWduZWQgbG9uZyByYXRlKTsKLXN0YXRpYyBsb25nIG9tYXAxX3JvdW5kX2V4dF9jbGtfcmF0ZShzdHJ1Y3QgY2xrICogY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOwotc3RhdGljIHZvaWQgb21hcDFfaW5pdF9leHRfY2xrKHN0cnVjdCBjbGsgKiBjbGspOwotc3RhdGljIGludCBvbWFwMV9zZWxlY3RfdGFibGVfcmF0ZShzdHJ1Y3QgY2xrICogY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOwotc3RhdGljIGxvbmcgb21hcDFfcm91bmRfdG9fdGFibGVfcmF0ZShzdHJ1Y3QgY2xrICogY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogCi1zdGF0aWMgaW50IG9tYXAxX2Nsa19zZXRfcmF0ZV9ja2N0bF9hcm0oc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOwotc3RhdGljIGxvbmcgb21hcDFfY2xrX3JvdW5kX3JhdGVfY2tjdGxfYXJtKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKTsKKyNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CiAKLXN0cnVjdCBtcHVfcmF0ZSB7Ci0JdW5zaWduZWQgbG9uZwkJcmF0ZTsKLQl1bnNpZ25lZCBsb25nCQl4dGFsOwotCXVuc2lnbmVkIGxvbmcJCXBsbF9yYXRlOwotCV9fdTE2CQkJY2tjdGxfdmFsOwotCV9fdTE2CQkJZHBsbGN0bF92YWw7Ci19OworZXh0ZXJuIGludCBfX2luaXQgb21hcDFfY2xrX2luaXQodm9pZCk7CitleHRlcm4gaW50IG9tYXAxX2Nsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKTsKK2V4dGVybiB2b2lkIG9tYXAxX2Nsa19kaXNhYmxlKHN0cnVjdCBjbGsgKmNsayk7CitleHRlcm4gbG9uZyBvbWFwMV9jbGtfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7CitleHRlcm4gaW50IG9tYXAxX2Nsa19zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBvbWFwMV9ja2N0bF9yZWNhbGMoc3RydWN0IGNsayAqY2xrKTsKK2V4dGVybiBpbnQgb21hcDFfc2V0X3Nvc3NpX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgb21hcDFfc29zc2lfcmVjYWxjKHN0cnVjdCBjbGsgKmNsayk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBvbWFwMV9ja2N0bF9yZWNhbGNfZHNwX2RvbWFpbihzdHJ1Y3QgY2xrICpjbGspOworZXh0ZXJuIGludCBvbWFwMV9jbGtfc2V0X3JhdGVfZHNwX2RvbWFpbihzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7CitleHRlcm4gaW50IG9tYXAxX3NldF91YXJ0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgb21hcDFfdWFydF9yZWNhbGMoc3RydWN0IGNsayAqY2xrKTsKK2V4dGVybiBpbnQgb21hcDFfc2V0X2V4dF9jbGtfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7CitleHRlcm4gbG9uZyBvbWFwMV9yb3VuZF9leHRfY2xrX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOworZXh0ZXJuIHZvaWQgb21hcDFfaW5pdF9leHRfY2xrKHN0cnVjdCBjbGsgKmNsayk7CitleHRlcm4gaW50IG9tYXAxX3NlbGVjdF90YWJsZV9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKTsKK2V4dGVybiBsb25nIG9tYXAxX3JvdW5kX3RvX3RhYmxlX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOworZXh0ZXJuIGludCBvbWFwMV9jbGtfc2V0X3JhdGVfY2tjdGxfYXJtKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKTsKK2V4dGVybiBsb25nIG9tYXAxX2Nsa19yb3VuZF9yYXRlX2NrY3RsX2FybShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBvbWFwMV93YXRjaGRvZ19yZWNhbGMoc3RydWN0IGNsayAqY2xrKTsKKworI2lmZGVmIENPTkZJR19PTUFQX1JFU0VUX0NMT0NLUworZXh0ZXJuIHZvaWQgX19pbml0IG9tYXAxX2Nsa19kaXNhYmxlX3VudXNlZChzdHJ1Y3QgY2xrICpjbGspOworI2Vsc2UKKyNkZWZpbmUgb21hcDFfY2xrX2Rpc2FibGVfdW51c2VkCU5VTEwKKyNlbmRpZgogCiBzdHJ1Y3QgdWFydF9jbGsgewogCXN0cnVjdCBjbGsJY2xrOwpAQCAtOTYsNTk2ICsxMDIsMTIgQEAKICNkZWZpbmUgU09GVF9SRVFfUkVHCQkweGZmZmUwODM0CiAjZGVmaW5lIFNPRlRfUkVRX1JFRzIJCTB4ZmZmZTA4ODAKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBPbWFwMSBNUFUgcmF0ZSB0YWJsZQotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBzdHJ1Y3QgbXB1X3JhdGUgcmF0ZV90YWJsZVtdID0gewotCS8qIE1QVSBNSHosIHh0YWwgTUh6LCBkcGxsMSBNSHosIENLQ1RMLCBEUExMX0NUTAotCSAqIE5PVEU6IENvbW1lbnQgb3JkZXIgaGVyZSBpcyBkaWZmZXJlbnQgZnJvbSBiaXRzIGluIENLQ1RMIHZhbHVlOgotCSAqIGFybWRpdiwgZHNwZGl2LCBkc3BtbXUsIHRjZGl2LCBwZXJkaXYsIGxjZGRpdgotCSAqLwotI2lmIGRlZmluZWQoQ09ORklHX09NQVBfQVJNXzIxNk1IWikKLQl7IDIxNjAwMDAwMCwgMTIwMDAwMDAsIDIxNjAwMDAwMCwgMHgwNTBkLCAweDI5MTAgfSwgLyogMS8xLzIvMi8yLzggKi8KLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX09NQVBfQVJNXzE5NU1IWikKLQl7IDE5NTAwMDAwMCwgMTMwMDAwMDAsIDE5NTAwMDAwMCwgMHgwNTBlLCAweDI3OTAgfSwgLyogMS8xLzIvMi80LzggKi8KLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX09NQVBfQVJNXzE5Mk1IWikKLQl7IDE5MjAwMDAwMCwgMTkyMDAwMDAsIDE5MjAwMDAwMCwgMHgwNTBmLCAweDI1MTAgfSwgLyogMS8xLzIvMi84LzggKi8KLQl7IDE5MjAwMDAwMCwgMTIwMDAwMDAsIDE5MjAwMDAwMCwgMHgwNTBmLCAweDI4MTAgfSwgLyogMS8xLzIvMi84LzggKi8KLQl7ICA5NjAwMDAwMCwgMTIwMDAwMDAsIDE5MjAwMDAwMCwgMHgwNTVmLCAweDI4MTAgfSwgLyogMi8yLzIvMi84LzggKi8KLQl7ICA0ODAwMDAwMCwgMTIwMDAwMDAsIDE5MjAwMDAwMCwgMHgwYmFmLCAweDI4MTAgfSwgLyogNC80LzQvOC84LzggKi8KLQl7ICAyNDAwMDAwMCwgMTIwMDAwMDAsIDE5MjAwMDAwMCwgMHgwZmZmLCAweDI4MTAgfSwgLyogOC84LzgvOC84LzggKi8KLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX09NQVBfQVJNXzE4Mk1IWikKLQl7IDE4MjAwMDAwMCwgMTMwMDAwMDAsIDE4MjAwMDAwMCwgMHgwNTBlLCAweDI3MTAgfSwgLyogMS8xLzIvMi80LzggKi8KLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX09NQVBfQVJNXzE2OE1IWikKLQl7IDE2ODAwMDAwMCwgMTIwMDAwMDAsIDE2ODAwMDAwMCwgMHgwMTBmLCAweDI3MTAgfSwgLyogMS8xLzEvMi84LzggKi8KLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX09NQVBfQVJNXzE1ME1IWikKLQl7IDE1MDAwMDAwMCwgMTIwMDAwMDAsIDE1MDAwMDAwMCwgMHgwMTBhLCAweDJjYjAgfSwgLyogMS8xLzEvMi80LzQgKi8KLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX09NQVBfQVJNXzEyME1IWikKLQl7IDEyMDAwMDAwMCwgMTIwMDAwMDAsIDEyMDAwMDAwMCwgMHgwMTBhLCAweDI1MTAgfSwgLyogMS8xLzEvMi80LzQgKi8KLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX09NQVBfQVJNXzk2TUhaKQotCXsgIDk2MDAwMDAwLCAxMjAwMDAwMCwgIDk2MDAwMDAwLCAweDAwMDUsIDB4MjQxMCB9LCAvKiAxLzEvMS8xLzIvMiAqLwotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfT01BUF9BUk1fNjBNSFopCi0JeyAgNjAwMDAwMDAsIDEyMDAwMDAwLCAgNjAwMDAwMDAsIDB4MDAwNSwgMHgyMjkwIH0sIC8qIDEvMS8xLzEvMi8yICovCi0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19PTUFQX0FSTV8zME1IWikKLQl7ICAzMDAwMDAwMCwgMTIwMDAwMDAsICA2MDAwMDAwMCwgMHgwNTU1LCAweDIyOTAgfSwgLyogMi8yLzIvMi8yLzIgKi8KLSNlbmRpZgotCXsgMCwgMCwgMCwgMCwgMCB9LAotfTsKK2V4dGVybiBfX3UzMiBhcm1faWRsZWN0MV9tYXNrOworZXh0ZXJuIHN0cnVjdCBjbGsgKmFwaV9ja19wLCAqY2tfZHBsbDFfcCwgKmNrX3JlZl9wOwogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIE9tYXAxIGNsb2NrcwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHN0cnVjdCBjbGsgY2tfcmVmID0gewotCS5uYW1lCQk9ICJja19yZWYiLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5yYXRlCQk9IDEyMDAwMDAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgY2tfZHBsbDEgPSB7Ci0JLm5hbWUJCT0gImNrX2RwbGwxIiwKLQkub3BzCQk9ICZjbGtvcHNfbnVsbCwKLQkucGFyZW50CQk9ICZja19yZWYsCi19OwotCi1zdGF0aWMgc3RydWN0IGFybV9pZGxlY3QxX2NsayBja19kcGxsMW91dCA9IHsKLQkuY2xrID0gewotCQkubmFtZQkJPSAiY2tfZHBsbDFvdXQiLAotCQkub3BzCQk9ICZjbGtvcHNfZ2VuZXJpYywKLQkJLnBhcmVudAkJPSAmY2tfZHBsbDEsCi0JCS5mbGFncwkJPSBDTE9DS19JRExFX0NPTlRST0wgfCBFTkFCTEVfUkVHXzMyQklULAotCQkuZW5hYmxlX3JlZwk9IE9NQVAxX0lPX0FERFJFU1MoQVJNX0lETEVDVDIpLAotCQkuZW5hYmxlX2JpdAk9IEVOX0NLT1VUX0FSTSwKLQkJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLQl9LAotCS5pZGxlY3Rfc2hpZnQJPSAxMiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHNvc3NpX2NrID0gewotCS5uYW1lCQk9ICJja19zb3NzaSIsCi0JLm9wcwkJPSAmY2xrb3BzX2dlbmVyaWMsCi0JLnBhcmVudAkJPSAmY2tfZHBsbDFvdXQuY2xrLAotCS5mbGFncwkJPSBDTE9DS19OT19JRExFX1BBUkVOVCB8IEVOQUJMRV9SRUdfMzJCSVQsCi0JLmVuYWJsZV9yZWcJPSBPTUFQMV9JT19BRERSRVNTKE1PRF9DT05GX0NUUkxfMSksCi0JLmVuYWJsZV9iaXQJPSAxNiwKLQkucmVjYWxjCQk9ICZvbWFwMV9zb3NzaV9yZWNhbGMsCi0JLnNldF9yYXRlCT0gJm9tYXAxX3NldF9zb3NzaV9yYXRlLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgYXJtX2NrID0gewotCS5uYW1lCQk9ICJhcm1fY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJmNrX2RwbGwxLAotCS5yYXRlX29mZnNldAk9IENLQ1RMX0FSTURJVl9PRkZTRVQsCi0JLnJlY2FsYwkJPSAmb21hcDFfY2tjdGxfcmVjYWxjLAotCS5yb3VuZF9yYXRlCT0gb21hcDFfY2xrX3JvdW5kX3JhdGVfY2tjdGxfYXJtLAotCS5zZXRfcmF0ZQk9IG9tYXAxX2Nsa19zZXRfcmF0ZV9ja2N0bF9hcm0sCi19OwotCi1zdGF0aWMgc3RydWN0IGFybV9pZGxlY3QxX2NsayBhcm1wZXJfY2sgPSB7Ci0JLmNsayA9IHsKLQkJLm5hbWUJCT0gImFybXBlcl9jayIsCi0JCS5vcHMJCT0gJmNsa29wc19nZW5lcmljLAotCQkucGFyZW50CQk9ICZja19kcGxsMSwKLQkJLmZsYWdzCQk9IENMT0NLX0lETEVfQ09OVFJPTCwKLQkJLmVuYWJsZV9yZWcJPSBPTUFQMV9JT19BRERSRVNTKEFSTV9JRExFQ1QyKSwKLQkJLmVuYWJsZV9iaXQJPSBFTl9QRVJDSywKLQkJLnJhdGVfb2Zmc2V0CT0gQ0tDVExfUEVSRElWX09GRlNFVCwKLQkJLnJlY2FsYwkJPSAmb21hcDFfY2tjdGxfcmVjYWxjLAotCQkucm91bmRfcmF0ZQk9IG9tYXAxX2Nsa19yb3VuZF9yYXRlX2NrY3RsX2FybSwKLQkJLnNldF9yYXRlCT0gb21hcDFfY2xrX3NldF9yYXRlX2NrY3RsX2FybSwKLQl9LAotCS5pZGxlY3Rfc2hpZnQJPSAyLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgYXJtX2dwaW9fY2sgPSB7Ci0JLm5hbWUJCT0gImFybV9ncGlvX2NrIiwKLQkub3BzCQk9ICZjbGtvcHNfZ2VuZXJpYywKLQkucGFyZW50CQk9ICZja19kcGxsMSwKLQkuZW5hYmxlX3JlZwk9IE9NQVAxX0lPX0FERFJFU1MoQVJNX0lETEVDVDIpLAotCS5lbmFibGVfYml0CT0gRU5fR1BJT0NLLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGFybV9pZGxlY3QxX2NsayBhcm14b3JfY2sgPSB7Ci0JLmNsayA9IHsKLQkJLm5hbWUJCT0gImFybXhvcl9jayIsCi0JCS5vcHMJCT0gJmNsa29wc19nZW5lcmljLAotCQkucGFyZW50CQk9ICZja19yZWYsCi0JCS5mbGFncwkJPSBDTE9DS19JRExFX0NPTlRST0wsCi0JCS5lbmFibGVfcmVnCT0gT01BUDFfSU9fQUREUkVTUyhBUk1fSURMRUNUMiksCi0JCS5lbmFibGVfYml0CT0gRU5fWE9SUENLLAotCQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotCX0sCi0JLmlkbGVjdF9zaGlmdAk9IDEsCi19OwotCi1zdGF0aWMgc3RydWN0IGFybV9pZGxlY3QxX2NsayBhcm10aW1fY2sgPSB7Ci0JLmNsayA9IHsKLQkJLm5hbWUJCT0gImFybXRpbV9jayIsCi0JCS5vcHMJCT0gJmNsa29wc19nZW5lcmljLAotCQkucGFyZW50CQk9ICZja19yZWYsCi0JCS5mbGFncwkJPSBDTE9DS19JRExFX0NPTlRST0wsCi0JCS5lbmFibGVfcmVnCT0gT01BUDFfSU9fQUREUkVTUyhBUk1fSURMRUNUMiksCi0JCS5lbmFibGVfYml0CT0gRU5fVElNQ0ssCi0JCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi0JfSwKLQkuaWRsZWN0X3NoaWZ0CT0gOSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXJtX2lkbGVjdDFfY2xrIGFybXdkdF9jayA9IHsKLQkuY2xrID0gewotCQkubmFtZQkJPSAiYXJtd2R0X2NrIiwKLQkJLm9wcwkJPSAmY2xrb3BzX2dlbmVyaWMsCi0JCS5wYXJlbnQJCT0gJmNrX3JlZiwKLQkJLmZsYWdzCQk9IENMT0NLX0lETEVfQ09OVFJPTCwKLQkJLmVuYWJsZV9yZWcJPSBPTUFQMV9JT19BRERSRVNTKEFSTV9JRExFQ1QyKSwKLQkJLmVuYWJsZV9iaXQJPSBFTl9XRFRDSywKLQkJLnJlY2FsYwkJPSAmb21hcDFfd2F0Y2hkb2dfcmVjYWxjLAotCX0sCi0JLmlkbGVjdF9zaGlmdAk9IDAsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBhcm1pbnRoX2NrMTZ4eCA9IHsKLQkubmFtZQkJPSAiYXJtaW50aF9jayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmYXJtX2NrLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi0JLyogTm90ZTogT24gMTZ4eCB0aGUgZnJlcXVlbmN5IGNhbiBiZSBkaXZpZGVkIGJ5IDIgYnkgcHJvZ3JhbW1pbmcKLQkgKiBBUk1fQ0tDVEw6QVJNX0lOVEhDS19TRUwoMTQpIHRvIDEKLQkgKgotCSAqIDE1MTAgdmVyc2lvbiBpcyBpbiBUQyBjbG9ja3MuCi0JICovCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBkc3BfY2sgPSB7Ci0JLm5hbWUJCT0gImRzcF9jayIsCi0JLm9wcwkJPSAmY2xrb3BzX2dlbmVyaWMsCi0JLnBhcmVudAkJPSAmY2tfZHBsbDEsCi0JLmVuYWJsZV9yZWcJPSBPTUFQMV9JT19BRERSRVNTKEFSTV9DS0NUTCksCi0JLmVuYWJsZV9iaXQJPSBFTl9EU1BDSywKLQkucmF0ZV9vZmZzZXQJPSBDS0NUTF9EU1BESVZfT0ZGU0VULAotCS5yZWNhbGMJCT0gJm9tYXAxX2NrY3RsX3JlY2FsYywKLQkucm91bmRfcmF0ZQk9IG9tYXAxX2Nsa19yb3VuZF9yYXRlX2NrY3RsX2FybSwKLQkuc2V0X3JhdGUJPSBvbWFwMV9jbGtfc2V0X3JhdGVfY2tjdGxfYXJtLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZHNwbW11X2NrID0gewotCS5uYW1lCQk9ICJkc3BtbXVfY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJmNrX2RwbGwxLAotCS5yYXRlX29mZnNldAk9IENLQ1RMX0RTUE1NVURJVl9PRkZTRVQsCi0JLnJlY2FsYwkJPSAmb21hcDFfY2tjdGxfcmVjYWxjLAotCS5yb3VuZF9yYXRlCT0gb21hcDFfY2xrX3JvdW5kX3JhdGVfY2tjdGxfYXJtLAotCS5zZXRfcmF0ZQk9IG9tYXAxX2Nsa19zZXRfcmF0ZV9ja2N0bF9hcm0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBkc3BwZXJfY2sgPSB7Ci0JLm5hbWUJCT0gImRzcHBlcl9jayIsCi0JLm9wcwkJPSAmY2xrb3BzX2RzcGNrLAotCS5wYXJlbnQJCT0gJmNrX2RwbGwxLAotCS5lbmFibGVfcmVnCT0gRFNQX0lETEVDVDIsCi0JLmVuYWJsZV9iaXQJPSBFTl9QRVJDSywKLQkucmF0ZV9vZmZzZXQJPSBDS0NUTF9QRVJESVZfT0ZGU0VULAotCS5yZWNhbGMJCT0gJm9tYXAxX2NrY3RsX3JlY2FsY19kc3BfZG9tYWluLAotCS5yb3VuZF9yYXRlCT0gb21hcDFfY2xrX3JvdW5kX3JhdGVfY2tjdGxfYXJtLAotCS5zZXRfcmF0ZQk9ICZvbWFwMV9jbGtfc2V0X3JhdGVfZHNwX2RvbWFpbiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGRzcHhvcl9jayA9IHsKLQkubmFtZQkJPSAiZHNweG9yX2NrIiwKLQkub3BzCQk9ICZjbGtvcHNfZHNwY2ssCi0JLnBhcmVudAkJPSAmY2tfcmVmLAotCS5lbmFibGVfcmVnCT0gRFNQX0lETEVDVDIsCi0JLmVuYWJsZV9iaXQJPSBFTl9YT1JQQ0ssCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGRzcHRpbV9jayA9IHsKLQkubmFtZQkJPSAiZHNwdGltX2NrIiwKLQkub3BzCQk9ICZjbGtvcHNfZHNwY2ssCi0JLnBhcmVudAkJPSAmY2tfcmVmLAotCS5lbmFibGVfcmVnCT0gRFNQX0lETEVDVDIsCi0JLmVuYWJsZV9iaXQJPSBFTl9EU1BUSU1DSywKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotLyogVGllIEFSTV9JRExFQ1QxOklETElGX0FSTSB0byB0aGlzIGxvZ2ljYWwgY2xvY2sgc3RydWN0dXJlICovCi1zdGF0aWMgc3RydWN0IGFybV9pZGxlY3QxX2NsayB0Y19jayA9IHsKLQkuY2xrID0gewotCQkubmFtZQkJPSAidGNfY2siLAotCQkub3BzCQk9ICZjbGtvcHNfbnVsbCwKLQkJLnBhcmVudAkJPSAmY2tfZHBsbDEsCi0JCS5mbGFncwkJPSBDTE9DS19JRExFX0NPTlRST0wsCi0JCS5yYXRlX29mZnNldAk9IENLQ1RMX1RDRElWX09GRlNFVCwKLQkJLnJlY2FsYwkJPSAmb21hcDFfY2tjdGxfcmVjYWxjLAotCQkucm91bmRfcmF0ZQk9IG9tYXAxX2Nsa19yb3VuZF9yYXRlX2NrY3RsX2FybSwKLQkJLnNldF9yYXRlCT0gb21hcDFfY2xrX3NldF9yYXRlX2NrY3RsX2FybSwKLQl9LAotCS5pZGxlY3Rfc2hpZnQJPSA2LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgYXJtaW50aF9jazE1MTAgPSB7Ci0JLm5hbWUJCT0gImFybWludGhfY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJnRjX2NrLmNsaywKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotCS8qIE5vdGU6IE9uIDE1MTAgdGhlIGZyZXF1ZW5jeSBmb2xsb3dzIFRDX0NLCi0JICoKLQkgKiAxNnh4IHZlcnNpb24gaXMgaW4gTVBVIGNsb2Nrcy4KLQkgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHRpcGJfY2sgPSB7Ci0JLyogTm8taWRsZSBjb250cm9sbGVkIGJ5ICJ0Y19jayIgKi8KLQkubmFtZQkJPSAidGlwYl9jayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmdGNfY2suY2xrLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBsM19vY3BpX2NrID0gewotCS8qIE5vLWlkbGUgY29udHJvbGxlZCBieSAidGNfY2siICovCi0JLm5hbWUJCT0gImwzX29jcGlfY2siLAotCS5vcHMJCT0gJmNsa29wc19nZW5lcmljLAotCS5wYXJlbnQJCT0gJnRjX2NrLmNsaywKLQkuZW5hYmxlX3JlZwk9IE9NQVAxX0lPX0FERFJFU1MoQVJNX0lETEVDVDMpLAotCS5lbmFibGVfYml0CT0gRU5fT0NQSV9DSywKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgdGMxX2NrID0gewotCS5uYW1lCQk9ICJ0YzFfY2siLAotCS5vcHMJCT0gJmNsa29wc19nZW5lcmljLAotCS5wYXJlbnQJCT0gJnRjX2NrLmNsaywKLQkuZW5hYmxlX3JlZwk9IE9NQVAxX0lPX0FERFJFU1MoQVJNX0lETEVDVDMpLAotCS5lbmFibGVfYml0CT0gRU5fVEMxX0NLLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayB0YzJfY2sgPSB7Ci0JLm5hbWUJCT0gInRjMl9jayIsCi0JLm9wcwkJPSAmY2xrb3BzX2dlbmVyaWMsCi0JLnBhcmVudAkJPSAmdGNfY2suY2xrLAotCS5lbmFibGVfcmVnCT0gT01BUDFfSU9fQUREUkVTUyhBUk1fSURMRUNUMyksCi0JLmVuYWJsZV9iaXQJPSBFTl9UQzJfQ0ssCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGRtYV9jayA9IHsKLQkvKiBOby1pZGxlIGNvbnRyb2xsZWQgYnkgInRjX2NrIiAqLwotCS5uYW1lCQk9ICJkbWFfY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJnRjX2NrLmNsaywKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZG1hX2xjZGZyZWVfY2sgPSB7Ci0JLm5hbWUJCT0gImRtYV9sY2RmcmVlX2NrIiwKLQkub3BzCQk9ICZjbGtvcHNfbnVsbCwKLQkucGFyZW50CQk9ICZ0Y19jay5jbGssCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXJtX2lkbGVjdDFfY2xrIGFwaV9jayA9IHsKLQkuY2xrID0gewotCQkubmFtZQkJPSAiYXBpX2NrIiwKLQkJLm9wcwkJPSAmY2xrb3BzX2dlbmVyaWMsCi0JCS5wYXJlbnQJCT0gJnRjX2NrLmNsaywKLQkJLmZsYWdzCQk9IENMT0NLX0lETEVfQ09OVFJPTCwKLQkJLmVuYWJsZV9yZWcJPSBPTUFQMV9JT19BRERSRVNTKEFSTV9JRExFQ1QyKSwKLQkJLmVuYWJsZV9iaXQJPSBFTl9BUElDSywKLQkJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLQl9LAotCS5pZGxlY3Rfc2hpZnQJPSA4LAotfTsKLQotc3RhdGljIHN0cnVjdCBhcm1faWRsZWN0MV9jbGsgbGJfY2sgPSB7Ci0JLmNsayA9IHsKLQkJLm5hbWUJCT0gImxiX2NrIiwKLQkJLm9wcwkJPSAmY2xrb3BzX2dlbmVyaWMsCi0JCS5wYXJlbnQJCT0gJnRjX2NrLmNsaywKLQkJLmZsYWdzCQk9IENMT0NLX0lETEVfQ09OVFJPTCwKLQkJLmVuYWJsZV9yZWcJPSBPTUFQMV9JT19BRERSRVNTKEFSTV9JRExFQ1QyKSwKLQkJLmVuYWJsZV9iaXQJPSBFTl9MQkNLLAotCQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotCX0sCi0JLmlkbGVjdF9zaGlmdAk9IDQsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayByaGVhMV9jayA9IHsKLQkubmFtZQkJPSAicmhlYTFfY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJnRjX2NrLmNsaywKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgcmhlYTJfY2sgPSB7Ci0JLm5hbWUJCT0gInJoZWEyX2NrIiwKLQkub3BzCQk9ICZjbGtvcHNfbnVsbCwKLQkucGFyZW50CQk9ICZ0Y19jay5jbGssCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGxjZF9ja18xNnh4ID0gewotCS5uYW1lCQk9ICJsY2RfY2siLAotCS5vcHMJCT0gJmNsa29wc19nZW5lcmljLAotCS5wYXJlbnQJCT0gJmNrX2RwbGwxLAotCS5lbmFibGVfcmVnCT0gT01BUDFfSU9fQUREUkVTUyhBUk1fSURMRUNUMiksCi0JLmVuYWJsZV9iaXQJPSBFTl9MQ0RDSywKLQkucmF0ZV9vZmZzZXQJPSBDS0NUTF9MQ0RESVZfT0ZGU0VULAotCS5yZWNhbGMJCT0gJm9tYXAxX2NrY3RsX3JlY2FsYywKLQkucm91bmRfcmF0ZQk9IG9tYXAxX2Nsa19yb3VuZF9yYXRlX2NrY3RsX2FybSwKLQkuc2V0X3JhdGUJPSBvbWFwMV9jbGtfc2V0X3JhdGVfY2tjdGxfYXJtLAotfTsKLQotc3RhdGljIHN0cnVjdCBhcm1faWRsZWN0MV9jbGsgbGNkX2NrXzE1MTAgPSB7Ci0JLmNsayA9IHsKLQkJLm5hbWUJCT0gImxjZF9jayIsCi0JCS5vcHMJCT0gJmNsa29wc19nZW5lcmljLAotCQkucGFyZW50CQk9ICZja19kcGxsMSwKLQkJLmZsYWdzCQk9IENMT0NLX0lETEVfQ09OVFJPTCwKLQkJLmVuYWJsZV9yZWcJPSBPTUFQMV9JT19BRERSRVNTKEFSTV9JRExFQ1QyKSwKLQkJLmVuYWJsZV9iaXQJPSBFTl9MQ0RDSywKLQkJLnJhdGVfb2Zmc2V0CT0gQ0tDVExfTENERElWX09GRlNFVCwKLQkJLnJlY2FsYwkJPSAmb21hcDFfY2tjdGxfcmVjYWxjLAotCQkucm91bmRfcmF0ZQk9IG9tYXAxX2Nsa19yb3VuZF9yYXRlX2NrY3RsX2FybSwKLQkJLnNldF9yYXRlCT0gb21hcDFfY2xrX3NldF9yYXRlX2NrY3RsX2FybSwKLQl9LAotCS5pZGxlY3Rfc2hpZnQJPSAzLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgdWFydDFfMTUxMCA9IHsKLQkubmFtZQkJPSAidWFydDFfY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHJlYWwgcGFyZW50ICovCi0JLnBhcmVudAkJPSAmYXJtcGVyX2NrLmNsaywKLQkucmF0ZQkJPSAxMjAwMDAwMCwKLQkuZmxhZ3MJCT0gRU5BQkxFX1JFR18zMkJJVCB8IENMT0NLX05PX0lETEVfUEFSRU5ULAotCS5lbmFibGVfcmVnCT0gT01BUDFfSU9fQUREUkVTUyhNT0RfQ09ORl9DVFJMXzApLAotCS5lbmFibGVfYml0CT0gMjksCS8qIENob29zZXMgYmV0d2VlbiAxMk1IeiBhbmQgNDhNSHogKi8KLQkuc2V0X3JhdGUJPSAmb21hcDFfc2V0X3VhcnRfcmF0ZSwKLQkucmVjYWxjCQk9ICZvbWFwMV91YXJ0X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdWFydF9jbGsgdWFydDFfMTZ4eCA9IHsKLQkuY2xrCT0gewotCQkubmFtZQkJPSAidWFydDFfY2siLAotCQkub3BzCQk9ICZjbGtvcHNfdWFydCwKLQkJLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcmVhbCBwYXJlbnQgKi8KLQkJLnBhcmVudAkJPSAmYXJtcGVyX2NrLmNsaywKLQkJLnJhdGUJCT0gNDgwMDAwMDAsCi0JCS5mbGFncwkJPSBSQVRFX0ZJWEVEIHwgRU5BQkxFX1JFR18zMkJJVCB8Ci0JCQkJICBDTE9DS19OT19JRExFX1BBUkVOVCwKLQkJLmVuYWJsZV9yZWcJPSBPTUFQMV9JT19BRERSRVNTKE1PRF9DT05GX0NUUkxfMCksCi0JCS5lbmFibGVfYml0CT0gMjksCi0JfSwKLQkuc3lzY19hZGRyCT0gMHhmZmZiMDA1NCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHVhcnQyX2NrID0gewotCS5uYW1lCQk9ICJ1YXJ0Ml9jayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcmVhbCBwYXJlbnQgKi8KLQkucGFyZW50CQk9ICZhcm1wZXJfY2suY2xrLAotCS5yYXRlCQk9IDEyMDAwMDAwLAotCS5mbGFncwkJPSBFTkFCTEVfUkVHXzMyQklUIHwgQ0xPQ0tfTk9fSURMRV9QQVJFTlQsCi0JLmVuYWJsZV9yZWcJPSBPTUFQMV9JT19BRERSRVNTKE1PRF9DT05GX0NUUkxfMCksCi0JLmVuYWJsZV9iaXQJPSAzMCwJLyogQ2hvb3NlcyBiZXR3ZWVuIDEyTUh6IGFuZCA0OE1IeiAqLwotCS5zZXRfcmF0ZQk9ICZvbWFwMV9zZXRfdWFydF9yYXRlLAotCS5yZWNhbGMJCT0gJm9tYXAxX3VhcnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgdWFydDNfMTUxMCA9IHsKLQkubmFtZQkJPSAidWFydDNfY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHJlYWwgcGFyZW50ICovCi0JLnBhcmVudAkJPSAmYXJtcGVyX2NrLmNsaywKLQkucmF0ZQkJPSAxMjAwMDAwMCwKLQkuZmxhZ3MJCT0gRU5BQkxFX1JFR18zMkJJVCB8IENMT0NLX05PX0lETEVfUEFSRU5ULAotCS5lbmFibGVfcmVnCT0gT01BUDFfSU9fQUREUkVTUyhNT0RfQ09ORl9DVFJMXzApLAotCS5lbmFibGVfYml0CT0gMzEsCS8qIENob29zZXMgYmV0d2VlbiAxMk1IeiBhbmQgNDhNSHogKi8KLQkuc2V0X3JhdGUJPSAmb21hcDFfc2V0X3VhcnRfcmF0ZSwKLQkucmVjYWxjCQk9ICZvbWFwMV91YXJ0X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdWFydF9jbGsgdWFydDNfMTZ4eCA9IHsKLQkuY2xrCT0gewotCQkubmFtZQkJPSAidWFydDNfY2siLAotCQkub3BzCQk9ICZjbGtvcHNfdWFydCwKLQkJLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcmVhbCBwYXJlbnQgKi8KLQkJLnBhcmVudAkJPSAmYXJtcGVyX2NrLmNsaywKLQkJLnJhdGUJCT0gNDgwMDAwMDAsCi0JCS5mbGFncwkJPSBSQVRFX0ZJWEVEIHwgRU5BQkxFX1JFR18zMkJJVCB8Ci0JCQkJICBDTE9DS19OT19JRExFX1BBUkVOVCwKLQkJLmVuYWJsZV9yZWcJPSBPTUFQMV9JT19BRERSRVNTKE1PRF9DT05GX0NUUkxfMCksCi0JCS5lbmFibGVfYml0CT0gMzEsCi0JfSwKLQkuc3lzY19hZGRyCT0gMHhmZmZiOTg1NCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHVzYl9jbGtvID0gewkvKiA2IE1IeiBvdXRwdXQgb24gVzRfVVNCX0NMS08gKi8KLQkubmFtZQkJPSAidXNiX2Nsa28iLAotCS5vcHMJCT0gJmNsa29wc19nZW5lcmljLAotCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudCAqLwotCS5yYXRlCQk9IDYwMDAwMDAsCi0JLmZsYWdzCQk9IFJBVEVfRklYRUQgfCBFTkFCTEVfUkVHXzMyQklULAotCS5lbmFibGVfcmVnCT0gT01BUDFfSU9fQUREUkVTUyhVTFBEX0NMT0NLX0NUUkwpLAotCS5lbmFibGVfYml0CT0gVVNCX01DTEtfRU5fQklULAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgdXNiX2hoY19jazE1MTAgPSB7Ci0JLm5hbWUJCT0gInVzYl9oaGNfY2siLAotCS5vcHMJCT0gJmNsa29wc19nZW5lcmljLAotCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudCAqLwotCS5yYXRlCQk9IDQ4MDAwMDAwLCAvKiBBY3R1YWxseSAyIGNsb2NrcywgMTJNSHogYW5kIDQ4TUh6ICovCi0JLmZsYWdzCQk9IFJBVEVfRklYRUQgfCBFTkFCTEVfUkVHXzMyQklULAotCS5lbmFibGVfcmVnCT0gT01BUDFfSU9fQUREUkVTUyhNT0RfQ09ORl9DVFJMXzApLAotCS5lbmFibGVfYml0CT0gVVNCX0hPU1RfSEhDX1VIT1NUX0VOLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgdXNiX2hoY19jazE2eHggPSB7Ci0JLm5hbWUJCT0gInVzYl9oaGNfY2siLAotCS5vcHMJCT0gJmNsa29wc19nZW5lcmljLAotCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudCAqLwotCS5yYXRlCQk9IDQ4MDAwMDAwLAotCS8qIE9UR19TWVNDT05fMi5PVEdfUEFERU4gPT0gMCAobm90IDE1MTAtY29tcGF0aWJsZSkgKi8KLQkuZmxhZ3MJCT0gUkFURV9GSVhFRCB8IEVOQUJMRV9SRUdfMzJCSVQsCi0JLmVuYWJsZV9yZWcJPSBPTUFQMV9JT19BRERSRVNTKE9UR19CQVNFICsgMHgwOCksIC8qIE9UR19TWVNDT05fMiAqLwotCS5lbmFibGVfYml0CT0gOCAvKiBVSE9TVF9FTiAqLywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHVzYl9kY19jayA9IHsKLQkubmFtZQkJPSAidXNiX2RjX2NrIiwKLQkub3BzCQk9ICZjbGtvcHNfZ2VuZXJpYywKLQkvKiBEaXJlY3QgZnJvbSBVTFBELCBubyBwYXJlbnQgKi8KLQkucmF0ZQkJPSA0ODAwMDAwMCwKLQkuZmxhZ3MJCT0gUkFURV9GSVhFRCwKLQkuZW5hYmxlX3JlZwk9IE9NQVAxX0lPX0FERFJFU1MoU09GVF9SRVFfUkVHKSwKLQkuZW5hYmxlX2JpdAk9IDQsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayB1c2JfZGNfY2s3eHggPSB7Ci0JLm5hbWUJCT0gInVzYl9kY19jayIsCi0JLm9wcwkJPSAmY2xrb3BzX2dlbmVyaWMsCi0JLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcGFyZW50ICovCi0JLnJhdGUJCT0gNDgwMDAwMDAsCi0JLmZsYWdzCQk9IFJBVEVfRklYRUQsCi0JLmVuYWJsZV9yZWcJPSBPTUFQMV9JT19BRERSRVNTKFNPRlRfUkVRX1JFRyksCi0JLmVuYWJsZV9iaXQJPSA4LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbWNsa18xNTEwID0gewotCS5uYW1lCQk9ICJtY2xrIiwKLQkub3BzCQk9ICZjbGtvcHNfZ2VuZXJpYywKLQkvKiBEaXJlY3QgZnJvbSBVTFBELCBubyBwYXJlbnQuIE1heSBiZSBlbmFibGVkIGJ5IGV4dCBoYXJkd2FyZS4gKi8KLQkucmF0ZQkJPSAxMjAwMDAwMCwKLQkuZmxhZ3MJCT0gUkFURV9GSVhFRCwKLQkuZW5hYmxlX3JlZwk9IE9NQVAxX0lPX0FERFJFU1MoU09GVF9SRVFfUkVHKSwKLQkuZW5hYmxlX2JpdAk9IDYsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBtY2xrXzE2eHggPSB7Ci0JLm5hbWUJCT0gIm1jbGsiLAotCS5vcHMJCT0gJmNsa29wc19nZW5lcmljLAotCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudC4gTWF5IGJlIGVuYWJsZWQgYnkgZXh0IGhhcmR3YXJlLiAqLwotCS5lbmFibGVfcmVnCT0gT01BUDFfSU9fQUREUkVTUyhDT01fQ0xLX0RJVl9DVFJMX1NFTCksCi0JLmVuYWJsZV9iaXQJPSBDT01fVUxQRF9QTExfQ0xLX1JFUSwKLQkuc2V0X3JhdGUJPSAmb21hcDFfc2V0X2V4dF9jbGtfcmF0ZSwKLQkucm91bmRfcmF0ZQk9ICZvbWFwMV9yb3VuZF9leHRfY2xrX3JhdGUsCi0JLmluaXQJCT0gJm9tYXAxX2luaXRfZXh0X2NsaywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGJjbGtfMTUxMCA9IHsKLQkubmFtZQkJPSAiYmNsayIsCi0JLm9wcwkJPSAmY2xrb3BzX2dlbmVyaWMsCi0JLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcGFyZW50LiBNYXkgYmUgZW5hYmxlZCBieSBleHQgaGFyZHdhcmUuICovCi0JLnJhdGUJCT0gMTIwMDAwMDAsCi0JLmZsYWdzCQk9IFJBVEVfRklYRUQsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBiY2xrXzE2eHggPSB7Ci0JLm5hbWUJCT0gImJjbGsiLAotCS5vcHMJCT0gJmNsa29wc19nZW5lcmljLAotCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudC4gTWF5IGJlIGVuYWJsZWQgYnkgZXh0IGhhcmR3YXJlLiAqLwotCS5lbmFibGVfcmVnCT0gT01BUDFfSU9fQUREUkVTUyhTV0RfQ0xLX0RJVl9DVFJMX1NFTCksCi0JLmVuYWJsZV9iaXQJPSBTV0RfVUxQRF9QTExfQ0xLX1JFUSwKLQkuc2V0X3JhdGUJPSAmb21hcDFfc2V0X2V4dF9jbGtfcmF0ZSwKLQkucm91bmRfcmF0ZQk9ICZvbWFwMV9yb3VuZF9leHRfY2xrX3JhdGUsCi0JLmluaXQJCT0gJm9tYXAxX2luaXRfZXh0X2NsaywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1tYzFfY2sgPSB7Ci0JLm5hbWUJCT0gIm1tY19jayIsCi0JLm9wcwkJPSAmY2xrb3BzX2dlbmVyaWMsCi0JLyogRnVuY3Rpb25hbCBjbG9jayBpcyBkaXJlY3QgZnJvbSBVTFBELCBpbnRlcmZhY2UgY2xvY2sgaXMgQVJNUEVSICovCi0JLnBhcmVudAkJPSAmYXJtcGVyX2NrLmNsaywKLQkucmF0ZQkJPSA0ODAwMDAwMCwKLQkuZmxhZ3MJCT0gUkFURV9GSVhFRCB8IEVOQUJMRV9SRUdfMzJCSVQgfCBDTE9DS19OT19JRExFX1BBUkVOVCwKLQkuZW5hYmxlX3JlZwk9IE9NQVAxX0lPX0FERFJFU1MoTU9EX0NPTkZfQ1RSTF8wKSwKLQkuZW5hYmxlX2JpdAk9IDIzLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbW1jMl9jayA9IHsKLQkubmFtZQkJPSAibW1jX2NrIiwKLQkuaWQJCT0gMSwKLQkub3BzCQk9ICZjbGtvcHNfZ2VuZXJpYywKLQkvKiBGdW5jdGlvbmFsIGNsb2NrIGlzIGRpcmVjdCBmcm9tIFVMUEQsIGludGVyZmFjZSBjbG9jayBpcyBBUk1QRVIgKi8KLQkucGFyZW50CQk9ICZhcm1wZXJfY2suY2xrLAotCS5yYXRlCQk9IDQ4MDAwMDAwLAotCS5mbGFncwkJPSBSQVRFX0ZJWEVEIHwgRU5BQkxFX1JFR18zMkJJVCB8IENMT0NLX05PX0lETEVfUEFSRU5ULAotCS5lbmFibGVfcmVnCT0gT01BUDFfSU9fQUREUkVTUyhNT0RfQ09ORl9DVFJMXzApLAotCS5lbmFibGVfYml0CT0gMjAsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBtbWMzX2NrID0gewotCS5uYW1lCQk9ICJtbWNfY2siLAotCS5pZAkJPSAyLAotCS5vcHMJCT0gJmNsa29wc19nZW5lcmljLAotCS8qIEZ1bmN0aW9uYWwgY2xvY2sgaXMgZGlyZWN0IGZyb20gVUxQRCwgaW50ZXJmYWNlIGNsb2NrIGlzIEFSTVBFUiAqLwotCS5wYXJlbnQJCT0gJmFybXBlcl9jay5jbGssCi0JLnJhdGUJCT0gNDgwMDAwMDAsCi0JLmZsYWdzCQk9IFJBVEVfRklYRUQgfCBFTkFCTEVfUkVHXzMyQklUIHwgQ0xPQ0tfTk9fSURMRV9QQVJFTlQsCi0JLmVuYWJsZV9yZWcJPSBPTUFQMV9JT19BRERSRVNTKFNPRlRfUkVRX1JFRyksCi0JLmVuYWJsZV9iaXQJPSAxMiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHZpcnR1YWxfY2tfbXB1ID0gewotCS5uYW1lCQk9ICJtcHUiLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJmFybV9jaywgLyogSXMgc21hcnRlciBhbGlhcyBmb3IgKi8KLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotCS5zZXRfcmF0ZQk9ICZvbWFwMV9zZWxlY3RfdGFibGVfcmF0ZSwKLQkucm91bmRfcmF0ZQk9ICZvbWFwMV9yb3VuZF90b190YWJsZV9yYXRlLAotfTsKLQotLyogdmlydHVhbCBmdW5jdGlvbmFsIGNsb2NrIGRvbWFpbiBmb3IgSTJDLiBKdXN0IGZvciBtYWtpbmcgc3VyZSB0aGF0IEFSTVhPUl9DSwotcmVtYWlucyBhY3RpdmUgZHVyaW5nIE1QVSBpZGxlIHdoZW5ldmVyIHRoaXMgaXMgZW5hYmxlZCAqLwotc3RhdGljIHN0cnVjdCBjbGsgaTJjX2ZjayA9IHsKLQkubmFtZQkJPSAiaTJjX2ZjayIsCi0JLmlkCQk9IDEsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLmZsYWdzCQk9IENMT0NLX05PX0lETEVfUEFSRU5ULAotCS5wYXJlbnQJCT0gJmFybXhvcl9jay5jbGssCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGkyY19pY2sgPSB7Ci0JLm5hbWUJCT0gImkyY19pY2siLAotCS5pZAkJPSAxLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5mbGFncwkJPSBDTE9DS19OT19JRExFX1BBUkVOVCwKLQkucGFyZW50CQk9ICZhcm1wZXJfY2suY2xrLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OworZXh0ZXJuIGNvbnN0IHN0cnVjdCBjbGtvcHMgY2xrb3BzX2RzcGNrOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBjbGtvcHMgY2xrb3BzX2R1bW15OworZXh0ZXJuIGNvbnN0IHN0cnVjdCBjbGtvcHMgY2xrb3BzX3VhcnQ7CitleHRlcm4gY29uc3Qgc3RydWN0IGNsa29wcyBjbGtvcHNfZ2VuZXJpYzsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2Nsb2NrX2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvY2xvY2tfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiOTk1YTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2Nsb2NrX2RhdGEuYwpAQCAtMCwwICsxLDg0MyBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAxL2Nsb2NrX2RhdGEuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgLSAyMDA1LCAyMDA5IE5va2lhIGNvcnBvcmF0aW9uCisgKiAgV3JpdHRlbiBieSBUdXVra2EgVGlra2FuZW4gPHR1dWtrYS50aWtrYW5lbkBlbGVrdHJvYml0LmNvbT4KKyAqICBCYXNlZCBvbiBjbG9ja3MuaCBieSBUb255IExpbmRncmVuLCBHb3Jkb24gTWNOdXR0IGFuZCBSaWRnZVJ1biwgSW5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+ICAvKiBmb3IgbWFjaGluZV9pc18qICovCisKKyNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L2Nsa2Rldl9vbWFwLmg+CisjaW5jbHVkZSA8cGxhdC91c2IuaD4gICAvKiBmb3IgT1RHX0JBU0UgKi8KKworI2luY2x1ZGUgImNsb2NrLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBPbWFwMSBjbG9ja3MKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFhYWCBpcyB0aGlzIG5lY2Vzc2FyeT8gKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIGR1bW15X2NrID0geworCS5uYW1lCT0gImR1bW15IiwKKwkub3BzCT0gJmNsa29wc19kdW1teSwKKwkuZmxhZ3MJPSBSQVRFX0ZJWEVELAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgY2tfcmVmID0geworCS5uYW1lCQk9ICJja19yZWYiLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yYXRlCQk9IDEyMDAwMDAwLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgY2tfZHBsbDEgPSB7CisJLm5hbWUJCT0gImNrX2RwbGwxIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucGFyZW50CQk9ICZja19yZWYsCit9OworCisvKgorICogRklYTUU6IFRoaXMgY2xvY2sgc2VlbXMgdG8gYmUgbmVjZXNzYXJ5IGJ1dCBuby1vbmUgaGFzIGFza2VkIGZvciBpdHMKKyAqIGFjdGl2YXRpb24uICBbIEZJWDogU29TU0ksIFNTUiBdCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYXJtX2lkbGVjdDFfY2xrIGNrX2RwbGwxb3V0ID0geworCS5jbGsgPSB7CisJCS5uYW1lCQk9ICJja19kcGxsMW91dCIsCisJCS5vcHMJCT0gJmNsa29wc19nZW5lcmljLAorCQkucGFyZW50CQk9ICZja19kcGxsMSwKKwkJLmZsYWdzCQk9IENMT0NLX0lETEVfQ09OVFJPTCB8IEVOQUJMRV9SRUdfMzJCSVQgfAorCQkJCSAgRU5BQkxFX09OX0lOSVQsCisJCS5lbmFibGVfcmVnCT0gT01BUDFfSU9fQUREUkVTUyhBUk1fSURMRUNUMiksCisJCS5lbmFibGVfYml0CT0gRU5fQ0tPVVRfQVJNLAorCQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorCX0sCisJLmlkbGVjdF9zaGlmdAk9IDEyLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgc29zc2lfY2sgPSB7CisJLm5hbWUJCT0gImNrX3Nvc3NpIiwKKwkub3BzCQk9ICZjbGtvcHNfZ2VuZXJpYywKKwkucGFyZW50CQk9ICZja19kcGxsMW91dC5jbGssCisJLmZsYWdzCQk9IENMT0NLX05PX0lETEVfUEFSRU5UIHwgRU5BQkxFX1JFR18zMkJJVCwKKwkuZW5hYmxlX3JlZwk9IE9NQVAxX0lPX0FERFJFU1MoTU9EX0NPTkZfQ1RSTF8xKSwKKwkuZW5hYmxlX2JpdAk9IDE2LAorCS5yZWNhbGMJCT0gJm9tYXAxX3Nvc3NpX3JlY2FsYywKKwkuc2V0X3JhdGUJPSAmb21hcDFfc2V0X3Nvc3NpX3JhdGUsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBhcm1fY2sgPSB7CisJLm5hbWUJCT0gImFybV9jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmY2tfZHBsbDEsCisJLnJhdGVfb2Zmc2V0CT0gQ0tDVExfQVJNRElWX09GRlNFVCwKKwkucmVjYWxjCQk9ICZvbWFwMV9ja2N0bF9yZWNhbGMsCisJLnJvdW5kX3JhdGUJPSBvbWFwMV9jbGtfcm91bmRfcmF0ZV9ja2N0bF9hcm0sCisJLnNldF9yYXRlCT0gb21hcDFfY2xrX3NldF9yYXRlX2NrY3RsX2FybSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXJtX2lkbGVjdDFfY2xrIGFybXBlcl9jayA9IHsKKwkuY2xrID0geworCQkubmFtZQkJPSAiYXJtcGVyX2NrIiwKKwkJLm9wcwkJPSAmY2xrb3BzX2dlbmVyaWMsCisJCS5wYXJlbnQJCT0gJmNrX2RwbGwxLAorCQkuZmxhZ3MJCT0gQ0xPQ0tfSURMRV9DT05UUk9MLAorCQkuZW5hYmxlX3JlZwk9IE9NQVAxX0lPX0FERFJFU1MoQVJNX0lETEVDVDIpLAorCQkuZW5hYmxlX2JpdAk9IEVOX1BFUkNLLAorCQkucmF0ZV9vZmZzZXQJPSBDS0NUTF9QRVJESVZfT0ZGU0VULAorCQkucmVjYWxjCQk9ICZvbWFwMV9ja2N0bF9yZWNhbGMsCisJCS5yb3VuZF9yYXRlCT0gb21hcDFfY2xrX3JvdW5kX3JhdGVfY2tjdGxfYXJtLAorCQkuc2V0X3JhdGUJPSBvbWFwMV9jbGtfc2V0X3JhdGVfY2tjdGxfYXJtLAorCX0sCisJLmlkbGVjdF9zaGlmdAk9IDIsCit9OworCisvKgorICogRklYTUU6IFRoaXMgY2xvY2sgc2VlbXMgdG8gYmUgbmVjZXNzYXJ5IGJ1dCBuby1vbmUgaGFzIGFza2VkIGZvciBpdHMKKyAqIGFjdGl2YXRpb24uICBbIEdQSU8gY29kZSBmb3IgMTUxMCBdCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIGFybV9ncGlvX2NrID0geworCS5uYW1lCQk9ICJhcm1fZ3Bpb19jayIsCisJLm9wcwkJPSAmY2xrb3BzX2dlbmVyaWMsCisJLnBhcmVudAkJPSAmY2tfZHBsbDEsCisJLmZsYWdzCQk9IEVOQUJMRV9PTl9JTklULAorCS5lbmFibGVfcmVnCT0gT01BUDFfSU9fQUREUkVTUyhBUk1fSURMRUNUMiksCisJLmVuYWJsZV9iaXQJPSBFTl9HUElPQ0ssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXJtX2lkbGVjdDFfY2xrIGFybXhvcl9jayA9IHsKKwkuY2xrID0geworCQkubmFtZQkJPSAiYXJteG9yX2NrIiwKKwkJLm9wcwkJPSAmY2xrb3BzX2dlbmVyaWMsCisJCS5wYXJlbnQJCT0gJmNrX3JlZiwKKwkJLmZsYWdzCQk9IENMT0NLX0lETEVfQ09OVFJPTCwKKwkJLmVuYWJsZV9yZWcJPSBPTUFQMV9JT19BRERSRVNTKEFSTV9JRExFQ1QyKSwKKwkJLmVuYWJsZV9iaXQJPSBFTl9YT1JQQ0ssCisJCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCisJfSwKKwkuaWRsZWN0X3NoaWZ0CT0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXJtX2lkbGVjdDFfY2xrIGFybXRpbV9jayA9IHsKKwkuY2xrID0geworCQkubmFtZQkJPSAiYXJtdGltX2NrIiwKKwkJLm9wcwkJPSAmY2xrb3BzX2dlbmVyaWMsCisJCS5wYXJlbnQJCT0gJmNrX3JlZiwKKwkJLmZsYWdzCQk9IENMT0NLX0lETEVfQ09OVFJPTCwKKwkJLmVuYWJsZV9yZWcJPSBPTUFQMV9JT19BRERSRVNTKEFSTV9JRExFQ1QyKSwKKwkJLmVuYWJsZV9iaXQJPSBFTl9USU1DSywKKwkJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKKwl9LAorCS5pZGxlY3Rfc2hpZnQJPSA5LAorfTsKKworc3RhdGljIHN0cnVjdCBhcm1faWRsZWN0MV9jbGsgYXJtd2R0X2NrID0geworCS5jbGsgPSB7CisJCS5uYW1lCQk9ICJhcm13ZHRfY2siLAorCQkub3BzCQk9ICZjbGtvcHNfZ2VuZXJpYywKKwkJLnBhcmVudAkJPSAmY2tfcmVmLAorCQkuZmxhZ3MJCT0gQ0xPQ0tfSURMRV9DT05UUk9MLAorCQkuZW5hYmxlX3JlZwk9IE9NQVAxX0lPX0FERFJFU1MoQVJNX0lETEVDVDIpLAorCQkuZW5hYmxlX2JpdAk9IEVOX1dEVENLLAorCQkucmVjYWxjCQk9ICZvbWFwMV93YXRjaGRvZ19yZWNhbGMsCisJfSwKKwkuaWRsZWN0X3NoaWZ0CT0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGFybWludGhfY2sxNnh4ID0geworCS5uYW1lCQk9ICJhcm1pbnRoX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucGFyZW50CQk9ICZhcm1fY2ssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKKwkvKiBOb3RlOiBPbiAxNnh4IHRoZSBmcmVxdWVuY3kgY2FuIGJlIGRpdmlkZWQgYnkgMiBieSBwcm9ncmFtbWluZworCSAqIEFSTV9DS0NUTDpBUk1fSU5USENLX1NFTCgxNCkgdG8gMQorCSAqCisJICogMTUxMCB2ZXJzaW9uIGlzIGluIFRDIGNsb2Nrcy4KKwkgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGRzcF9jayA9IHsKKwkubmFtZQkJPSAiZHNwX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfZ2VuZXJpYywKKwkucGFyZW50CQk9ICZja19kcGxsMSwKKwkuZW5hYmxlX3JlZwk9IE9NQVAxX0lPX0FERFJFU1MoQVJNX0NLQ1RMKSwKKwkuZW5hYmxlX2JpdAk9IEVOX0RTUENLLAorCS5yYXRlX29mZnNldAk9IENLQ1RMX0RTUERJVl9PRkZTRVQsCisJLnJlY2FsYwkJPSAmb21hcDFfY2tjdGxfcmVjYWxjLAorCS5yb3VuZF9yYXRlCT0gb21hcDFfY2xrX3JvdW5kX3JhdGVfY2tjdGxfYXJtLAorCS5zZXRfcmF0ZQk9IG9tYXAxX2Nsa19zZXRfcmF0ZV9ja2N0bF9hcm0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkc3BtbXVfY2sgPSB7CisJLm5hbWUJCT0gImRzcG1tdV9jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmY2tfZHBsbDEsCisJLnJhdGVfb2Zmc2V0CT0gQ0tDVExfRFNQTU1VRElWX09GRlNFVCwKKwkucmVjYWxjCQk9ICZvbWFwMV9ja2N0bF9yZWNhbGMsCisJLnJvdW5kX3JhdGUJPSBvbWFwMV9jbGtfcm91bmRfcmF0ZV9ja2N0bF9hcm0sCisJLnNldF9yYXRlCT0gb21hcDFfY2xrX3NldF9yYXRlX2NrY3RsX2FybSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGRzcHBlcl9jayA9IHsKKwkubmFtZQkJPSAiZHNwcGVyX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfZHNwY2ssCisJLnBhcmVudAkJPSAmY2tfZHBsbDEsCisJLmVuYWJsZV9yZWcJPSBEU1BfSURMRUNUMiwKKwkuZW5hYmxlX2JpdAk9IEVOX1BFUkNLLAorCS5yYXRlX29mZnNldAk9IENLQ1RMX1BFUkRJVl9PRkZTRVQsCisJLnJlY2FsYwkJPSAmb21hcDFfY2tjdGxfcmVjYWxjX2RzcF9kb21haW4sCisJLnJvdW5kX3JhdGUJPSBvbWFwMV9jbGtfcm91bmRfcmF0ZV9ja2N0bF9hcm0sCisJLnNldF9yYXRlCT0gJm9tYXAxX2Nsa19zZXRfcmF0ZV9kc3BfZG9tYWluLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZHNweG9yX2NrID0geworCS5uYW1lCQk9ICJkc3B4b3JfY2siLAorCS5vcHMJCT0gJmNsa29wc19kc3BjaywKKwkucGFyZW50CQk9ICZja19yZWYsCisJLmVuYWJsZV9yZWcJPSBEU1BfSURMRUNUMiwKKwkuZW5hYmxlX2JpdAk9IEVOX1hPUlBDSywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZHNwdGltX2NrID0geworCS5uYW1lCQk9ICJkc3B0aW1fY2siLAorCS5vcHMJCT0gJmNsa29wc19kc3BjaywKKwkucGFyZW50CQk9ICZja19yZWYsCisJLmVuYWJsZV9yZWcJPSBEU1BfSURMRUNUMiwKKwkuZW5hYmxlX2JpdAk9IEVOX0RTUFRJTUNLLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCisvKiBUaWUgQVJNX0lETEVDVDE6SURMSUZfQVJNIHRvIHRoaXMgbG9naWNhbCBjbG9jayBzdHJ1Y3R1cmUgKi8KK3N0YXRpYyBzdHJ1Y3QgYXJtX2lkbGVjdDFfY2xrIHRjX2NrID0geworCS5jbGsgPSB7CisJCS5uYW1lCQk9ICJ0Y19jayIsCisJCS5vcHMJCT0gJmNsa29wc19udWxsLAorCQkucGFyZW50CQk9ICZja19kcGxsMSwKKwkJLmZsYWdzCQk9IENMT0NLX0lETEVfQ09OVFJPTCwKKwkJLnJhdGVfb2Zmc2V0CT0gQ0tDVExfVENESVZfT0ZGU0VULAorCQkucmVjYWxjCQk9ICZvbWFwMV9ja2N0bF9yZWNhbGMsCisJCS5yb3VuZF9yYXRlCT0gb21hcDFfY2xrX3JvdW5kX3JhdGVfY2tjdGxfYXJtLAorCQkuc2V0X3JhdGUJPSBvbWFwMV9jbGtfc2V0X3JhdGVfY2tjdGxfYXJtLAorCX0sCisJLmlkbGVjdF9zaGlmdAk9IDYsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBhcm1pbnRoX2NrMTUxMCA9IHsKKwkubmFtZQkJPSAiYXJtaW50aF9jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmdGNfY2suY2xrLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCisJLyogTm90ZTogT24gMTUxMCB0aGUgZnJlcXVlbmN5IGZvbGxvd3MgVENfQ0sKKwkgKgorCSAqIDE2eHggdmVyc2lvbiBpcyBpbiBNUFUgY2xvY2tzLgorCSAqLworfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdGlwYl9jayA9IHsKKwkvKiBOby1pZGxlIGNvbnRyb2xsZWQgYnkgInRjX2NrIiAqLworCS5uYW1lCQk9ICJ0aXBiX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucGFyZW50CQk9ICZ0Y19jay5jbGssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGwzX29jcGlfY2sgPSB7CisJLyogTm8taWRsZSBjb250cm9sbGVkIGJ5ICJ0Y19jayIgKi8KKwkubmFtZQkJPSAibDNfb2NwaV9jayIsCisJLm9wcwkJPSAmY2xrb3BzX2dlbmVyaWMsCisJLnBhcmVudAkJPSAmdGNfY2suY2xrLAorCS5lbmFibGVfcmVnCT0gT01BUDFfSU9fQUREUkVTUyhBUk1fSURMRUNUMyksCisJLmVuYWJsZV9iaXQJPSBFTl9PQ1BJX0NLLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB0YzFfY2sgPSB7CisJLm5hbWUJCT0gInRjMV9jayIsCisJLm9wcwkJPSAmY2xrb3BzX2dlbmVyaWMsCisJLnBhcmVudAkJPSAmdGNfY2suY2xrLAorCS5lbmFibGVfcmVnCT0gT01BUDFfSU9fQUREUkVTUyhBUk1fSURMRUNUMyksCisJLmVuYWJsZV9iaXQJPSBFTl9UQzFfQ0ssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKKy8qCisgKiBGSVhNRTogVGhpcyBjbG9jayBzZWVtcyB0byBiZSBuZWNlc3NhcnkgYnV0IG5vLW9uZSBoYXMgYXNrZWQgZm9yIGl0cworICogYWN0aXZhdGlvbi4gIFsgcG0uYyAoU1JBTSksIENDUCwgQ2FtZXJhIF0KKyAqLworc3RhdGljIHN0cnVjdCBjbGsgdGMyX2NrID0geworCS5uYW1lCQk9ICJ0YzJfY2siLAorCS5vcHMJCT0gJmNsa29wc19nZW5lcmljLAorCS5wYXJlbnQJCT0gJnRjX2NrLmNsaywKKwkuZmxhZ3MJCT0gRU5BQkxFX09OX0lOSVQsCisJLmVuYWJsZV9yZWcJPSBPTUFQMV9JT19BRERSRVNTKEFSTV9JRExFQ1QzKSwKKwkuZW5hYmxlX2JpdAk9IEVOX1RDMl9DSywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZG1hX2NrID0geworCS8qIE5vLWlkbGUgY29udHJvbGxlZCBieSAidGNfY2siICovCisJLm5hbWUJCT0gImRtYV9jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmdGNfY2suY2xrLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkbWFfbGNkZnJlZV9jayA9IHsKKwkubmFtZQkJPSAiZG1hX2xjZGZyZWVfY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5wYXJlbnQJCT0gJnRjX2NrLmNsaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBhcm1faWRsZWN0MV9jbGsgYXBpX2NrID0geworCS5jbGsgPSB7CisJCS5uYW1lCQk9ICJhcGlfY2siLAorCQkub3BzCQk9ICZjbGtvcHNfZ2VuZXJpYywKKwkJLnBhcmVudAkJPSAmdGNfY2suY2xrLAorCQkuZmxhZ3MJCT0gQ0xPQ0tfSURMRV9DT05UUk9MLAorCQkuZW5hYmxlX3JlZwk9IE9NQVAxX0lPX0FERFJFU1MoQVJNX0lETEVDVDIpLAorCQkuZW5hYmxlX2JpdAk9IEVOX0FQSUNLLAorCQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorCX0sCisJLmlkbGVjdF9zaGlmdAk9IDgsCit9OworCitzdGF0aWMgc3RydWN0IGFybV9pZGxlY3QxX2NsayBsYl9jayA9IHsKKwkuY2xrID0geworCQkubmFtZQkJPSAibGJfY2siLAorCQkub3BzCQk9ICZjbGtvcHNfZ2VuZXJpYywKKwkJLnBhcmVudAkJPSAmdGNfY2suY2xrLAorCQkuZmxhZ3MJCT0gQ0xPQ0tfSURMRV9DT05UUk9MLAorCQkuZW5hYmxlX3JlZwk9IE9NQVAxX0lPX0FERFJFU1MoQVJNX0lETEVDVDIpLAorCQkuZW5hYmxlX2JpdAk9IEVOX0xCQ0ssCisJCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCisJfSwKKwkuaWRsZWN0X3NoaWZ0CT0gNCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHJoZWExX2NrID0geworCS5uYW1lCQk9ICJyaGVhMV9jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmdGNfY2suY2xrLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayByaGVhMl9jayA9IHsKKwkubmFtZQkJPSAicmhlYTJfY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5wYXJlbnQJCT0gJnRjX2NrLmNsaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbGNkX2NrXzE2eHggPSB7CisJLm5hbWUJCT0gImxjZF9jayIsCisJLm9wcwkJPSAmY2xrb3BzX2dlbmVyaWMsCisJLnBhcmVudAkJPSAmY2tfZHBsbDEsCisJLmVuYWJsZV9yZWcJPSBPTUFQMV9JT19BRERSRVNTKEFSTV9JRExFQ1QyKSwKKwkuZW5hYmxlX2JpdAk9IEVOX0xDRENLLAorCS5yYXRlX29mZnNldAk9IENLQ1RMX0xDRERJVl9PRkZTRVQsCisJLnJlY2FsYwkJPSAmb21hcDFfY2tjdGxfcmVjYWxjLAorCS5yb3VuZF9yYXRlCT0gb21hcDFfY2xrX3JvdW5kX3JhdGVfY2tjdGxfYXJtLAorCS5zZXRfcmF0ZQk9IG9tYXAxX2Nsa19zZXRfcmF0ZV9ja2N0bF9hcm0sCit9OworCitzdGF0aWMgc3RydWN0IGFybV9pZGxlY3QxX2NsayBsY2RfY2tfMTUxMCA9IHsKKwkuY2xrID0geworCQkubmFtZQkJPSAibGNkX2NrIiwKKwkJLm9wcwkJPSAmY2xrb3BzX2dlbmVyaWMsCisJCS5wYXJlbnQJCT0gJmNrX2RwbGwxLAorCQkuZmxhZ3MJCT0gQ0xPQ0tfSURMRV9DT05UUk9MLAorCQkuZW5hYmxlX3JlZwk9IE9NQVAxX0lPX0FERFJFU1MoQVJNX0lETEVDVDIpLAorCQkuZW5hYmxlX2JpdAk9IEVOX0xDRENLLAorCQkucmF0ZV9vZmZzZXQJPSBDS0NUTF9MQ0RESVZfT0ZGU0VULAorCQkucmVjYWxjCQk9ICZvbWFwMV9ja2N0bF9yZWNhbGMsCisJCS5yb3VuZF9yYXRlCT0gb21hcDFfY2xrX3JvdW5kX3JhdGVfY2tjdGxfYXJtLAorCQkuc2V0X3JhdGUJPSBvbWFwMV9jbGtfc2V0X3JhdGVfY2tjdGxfYXJtLAorCX0sCisJLmlkbGVjdF9zaGlmdAk9IDMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB1YXJ0MV8xNTEwID0geworCS5uYW1lCQk9ICJ1YXJ0MV9jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcmVhbCBwYXJlbnQgKi8KKwkucGFyZW50CQk9ICZhcm1wZXJfY2suY2xrLAorCS5yYXRlCQk9IDEyMDAwMDAwLAorCS5mbGFncwkJPSBFTkFCTEVfUkVHXzMyQklUIHwgQ0xPQ0tfTk9fSURMRV9QQVJFTlQsCisJLmVuYWJsZV9yZWcJPSBPTUFQMV9JT19BRERSRVNTKE1PRF9DT05GX0NUUkxfMCksCisJLmVuYWJsZV9iaXQJPSAyOSwJLyogQ2hvb3NlcyBiZXR3ZWVuIDEyTUh6IGFuZCA0OE1IeiAqLworCS5zZXRfcmF0ZQk9ICZvbWFwMV9zZXRfdWFydF9yYXRlLAorCS5yZWNhbGMJCT0gJm9tYXAxX3VhcnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCB1YXJ0X2NsayB1YXJ0MV8xNnh4ID0geworCS5jbGsJPSB7CisJCS5uYW1lCQk9ICJ1YXJ0MV9jayIsCisJCS5vcHMJCT0gJmNsa29wc191YXJ0LAorCQkvKiBEaXJlY3QgZnJvbSBVTFBELCBubyByZWFsIHBhcmVudCAqLworCQkucGFyZW50CQk9ICZhcm1wZXJfY2suY2xrLAorCQkucmF0ZQkJPSA0ODAwMDAwMCwKKwkJLmZsYWdzCQk9IFJBVEVfRklYRUQgfCBFTkFCTEVfUkVHXzMyQklUIHwKKwkJCQkgIENMT0NLX05PX0lETEVfUEFSRU5ULAorCQkuZW5hYmxlX3JlZwk9IE9NQVAxX0lPX0FERFJFU1MoTU9EX0NPTkZfQ1RSTF8wKSwKKwkJLmVuYWJsZV9iaXQJPSAyOSwKKwl9LAorCS5zeXNjX2FkZHIJPSAweGZmZmIwMDU0LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdWFydDJfY2sgPSB7CisJLm5hbWUJCT0gInVhcnQyX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkvKiBEaXJlY3QgZnJvbSBVTFBELCBubyByZWFsIHBhcmVudCAqLworCS5wYXJlbnQJCT0gJmFybXBlcl9jay5jbGssCisJLnJhdGUJCT0gMTIwMDAwMDAsCisJLmZsYWdzCQk9IEVOQUJMRV9SRUdfMzJCSVQgfCBDTE9DS19OT19JRExFX1BBUkVOVCwKKwkuZW5hYmxlX3JlZwk9IE9NQVAxX0lPX0FERFJFU1MoTU9EX0NPTkZfQ1RSTF8wKSwKKwkuZW5hYmxlX2JpdAk9IDMwLAkvKiBDaG9vc2VzIGJldHdlZW4gMTJNSHogYW5kIDQ4TUh6ICovCisJLnNldF9yYXRlCT0gJm9tYXAxX3NldF91YXJ0X3JhdGUsCisJLnJlY2FsYwkJPSAmb21hcDFfdWFydF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB1YXJ0M18xNTEwID0geworCS5uYW1lCQk9ICJ1YXJ0M19jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcmVhbCBwYXJlbnQgKi8KKwkucGFyZW50CQk9ICZhcm1wZXJfY2suY2xrLAorCS5yYXRlCQk9IDEyMDAwMDAwLAorCS5mbGFncwkJPSBFTkFCTEVfUkVHXzMyQklUIHwgQ0xPQ0tfTk9fSURMRV9QQVJFTlQsCisJLmVuYWJsZV9yZWcJPSBPTUFQMV9JT19BRERSRVNTKE1PRF9DT05GX0NUUkxfMCksCisJLmVuYWJsZV9iaXQJPSAzMSwJLyogQ2hvb3NlcyBiZXR3ZWVuIDEyTUh6IGFuZCA0OE1IeiAqLworCS5zZXRfcmF0ZQk9ICZvbWFwMV9zZXRfdWFydF9yYXRlLAorCS5yZWNhbGMJCT0gJm9tYXAxX3VhcnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCB1YXJ0X2NsayB1YXJ0M18xNnh4ID0geworCS5jbGsJPSB7CisJCS5uYW1lCQk9ICJ1YXJ0M19jayIsCisJCS5vcHMJCT0gJmNsa29wc191YXJ0LAorCQkvKiBEaXJlY3QgZnJvbSBVTFBELCBubyByZWFsIHBhcmVudCAqLworCQkucGFyZW50CQk9ICZhcm1wZXJfY2suY2xrLAorCQkucmF0ZQkJPSA0ODAwMDAwMCwKKwkJLmZsYWdzCQk9IFJBVEVfRklYRUQgfCBFTkFCTEVfUkVHXzMyQklUIHwKKwkJCQkgIENMT0NLX05PX0lETEVfUEFSRU5ULAorCQkuZW5hYmxlX3JlZwk9IE9NQVAxX0lPX0FERFJFU1MoTU9EX0NPTkZfQ1RSTF8wKSwKKwkJLmVuYWJsZV9iaXQJPSAzMSwKKwl9LAorCS5zeXNjX2FkZHIJPSAweGZmZmI5ODU0LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdXNiX2Nsa28gPSB7CS8qIDYgTUh6IG91dHB1dCBvbiBXNF9VU0JfQ0xLTyAqLworCS5uYW1lCQk9ICJ1c2JfY2xrbyIsCisJLm9wcwkJPSAmY2xrb3BzX2dlbmVyaWMsCisJLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcGFyZW50ICovCisJLnJhdGUJCT0gNjAwMDAwMCwKKwkuZmxhZ3MJCT0gUkFURV9GSVhFRCB8IEVOQUJMRV9SRUdfMzJCSVQsCisJLmVuYWJsZV9yZWcJPSBPTUFQMV9JT19BRERSRVNTKFVMUERfQ0xPQ0tfQ1RSTCksCisJLmVuYWJsZV9iaXQJPSBVU0JfTUNMS19FTl9CSVQsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB1c2JfaGhjX2NrMTUxMCA9IHsKKwkubmFtZQkJPSAidXNiX2hoY19jayIsCisJLm9wcwkJPSAmY2xrb3BzX2dlbmVyaWMsCisJLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcGFyZW50ICovCisJLnJhdGUJCT0gNDgwMDAwMDAsIC8qIEFjdHVhbGx5IDIgY2xvY2tzLCAxMk1IeiBhbmQgNDhNSHogKi8KKwkuZmxhZ3MJCT0gUkFURV9GSVhFRCB8IEVOQUJMRV9SRUdfMzJCSVQsCisJLmVuYWJsZV9yZWcJPSBPTUFQMV9JT19BRERSRVNTKE1PRF9DT05GX0NUUkxfMCksCisJLmVuYWJsZV9iaXQJPSBVU0JfSE9TVF9ISENfVUhPU1RfRU4sCit9OworCitzdGF0aWMgc3RydWN0IGNsayB1c2JfaGhjX2NrMTZ4eCA9IHsKKwkubmFtZQkJPSAidXNiX2hoY19jayIsCisJLm9wcwkJPSAmY2xrb3BzX2dlbmVyaWMsCisJLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcGFyZW50ICovCisJLnJhdGUJCT0gNDgwMDAwMDAsCisJLyogT1RHX1NZU0NPTl8yLk9UR19QQURFTiA9PSAwIChub3QgMTUxMC1jb21wYXRpYmxlKSAqLworCS5mbGFncwkJPSBSQVRFX0ZJWEVEIHwgRU5BQkxFX1JFR18zMkJJVCwKKwkuZW5hYmxlX3JlZwk9IE9NQVAxX0lPX0FERFJFU1MoT1RHX0JBU0UgKyAweDA4KSwgLyogT1RHX1NZU0NPTl8yICovCisJLmVuYWJsZV9iaXQJPSA4IC8qIFVIT1NUX0VOICovLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdXNiX2RjX2NrID0geworCS5uYW1lCQk9ICJ1c2JfZGNfY2siLAorCS5vcHMJCT0gJmNsa29wc19nZW5lcmljLAorCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudCAqLworCS5yYXRlCQk9IDQ4MDAwMDAwLAorCS5mbGFncwkJPSBSQVRFX0ZJWEVELAorCS5lbmFibGVfcmVnCT0gT01BUDFfSU9fQUREUkVTUyhTT0ZUX1JFUV9SRUcpLAorCS5lbmFibGVfYml0CT0gNCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVzYl9kY19jazd4eCA9IHsKKwkubmFtZQkJPSAidXNiX2RjX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfZ2VuZXJpYywKKwkvKiBEaXJlY3QgZnJvbSBVTFBELCBubyBwYXJlbnQgKi8KKwkucmF0ZQkJPSA0ODAwMDAwMCwKKwkuZmxhZ3MJCT0gUkFURV9GSVhFRCwKKwkuZW5hYmxlX3JlZwk9IE9NQVAxX0lPX0FERFJFU1MoU09GVF9SRVFfUkVHKSwKKwkuZW5hYmxlX2JpdAk9IDgsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBtY2xrXzE1MTAgPSB7CisJLm5hbWUJCT0gIm1jbGsiLAorCS5vcHMJCT0gJmNsa29wc19nZW5lcmljLAorCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudC4gTWF5IGJlIGVuYWJsZWQgYnkgZXh0IGhhcmR3YXJlLiAqLworCS5yYXRlCQk9IDEyMDAwMDAwLAorCS5mbGFncwkJPSBSQVRFX0ZJWEVELAorCS5lbmFibGVfcmVnCT0gT01BUDFfSU9fQUREUkVTUyhTT0ZUX1JFUV9SRUcpLAorCS5lbmFibGVfYml0CT0gNiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1jbGtfMTZ4eCA9IHsKKwkubmFtZQkJPSAibWNsayIsCisJLm9wcwkJPSAmY2xrb3BzX2dlbmVyaWMsCisJLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcGFyZW50LiBNYXkgYmUgZW5hYmxlZCBieSBleHQgaGFyZHdhcmUuICovCisJLmVuYWJsZV9yZWcJPSBPTUFQMV9JT19BRERSRVNTKENPTV9DTEtfRElWX0NUUkxfU0VMKSwKKwkuZW5hYmxlX2JpdAk9IENPTV9VTFBEX1BMTF9DTEtfUkVRLAorCS5zZXRfcmF0ZQk9ICZvbWFwMV9zZXRfZXh0X2Nsa19yYXRlLAorCS5yb3VuZF9yYXRlCT0gJm9tYXAxX3JvdW5kX2V4dF9jbGtfcmF0ZSwKKwkuaW5pdAkJPSAmb21hcDFfaW5pdF9leHRfY2xrLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgYmNsa18xNTEwID0geworCS5uYW1lCQk9ICJiY2xrIiwKKwkub3BzCQk9ICZjbGtvcHNfZ2VuZXJpYywKKwkvKiBEaXJlY3QgZnJvbSBVTFBELCBubyBwYXJlbnQuIE1heSBiZSBlbmFibGVkIGJ5IGV4dCBoYXJkd2FyZS4gKi8KKwkucmF0ZQkJPSAxMjAwMDAwMCwKKwkuZmxhZ3MJCT0gUkFURV9GSVhFRCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGJjbGtfMTZ4eCA9IHsKKwkubmFtZQkJPSAiYmNsayIsCisJLm9wcwkJPSAmY2xrb3BzX2dlbmVyaWMsCisJLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcGFyZW50LiBNYXkgYmUgZW5hYmxlZCBieSBleHQgaGFyZHdhcmUuICovCisJLmVuYWJsZV9yZWcJPSBPTUFQMV9JT19BRERSRVNTKFNXRF9DTEtfRElWX0NUUkxfU0VMKSwKKwkuZW5hYmxlX2JpdAk9IFNXRF9VTFBEX1BMTF9DTEtfUkVRLAorCS5zZXRfcmF0ZQk9ICZvbWFwMV9zZXRfZXh0X2Nsa19yYXRlLAorCS5yb3VuZF9yYXRlCT0gJm9tYXAxX3JvdW5kX2V4dF9jbGtfcmF0ZSwKKwkuaW5pdAkJPSAmb21hcDFfaW5pdF9leHRfY2xrLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbW1jMV9jayA9IHsKKwkubmFtZQkJPSAibW1jX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfZ2VuZXJpYywKKwkvKiBGdW5jdGlvbmFsIGNsb2NrIGlzIGRpcmVjdCBmcm9tIFVMUEQsIGludGVyZmFjZSBjbG9jayBpcyBBUk1QRVIgKi8KKwkucGFyZW50CQk9ICZhcm1wZXJfY2suY2xrLAorCS5yYXRlCQk9IDQ4MDAwMDAwLAorCS5mbGFncwkJPSBSQVRFX0ZJWEVEIHwgRU5BQkxFX1JFR18zMkJJVCB8IENMT0NLX05PX0lETEVfUEFSRU5ULAorCS5lbmFibGVfcmVnCT0gT01BUDFfSU9fQUREUkVTUyhNT0RfQ09ORl9DVFJMXzApLAorCS5lbmFibGVfYml0CT0gMjMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBtbWMyX2NrID0geworCS5uYW1lCQk9ICJtbWNfY2siLAorCS5pZAkJPSAxLAorCS5vcHMJCT0gJmNsa29wc19nZW5lcmljLAorCS8qIEZ1bmN0aW9uYWwgY2xvY2sgaXMgZGlyZWN0IGZyb20gVUxQRCwgaW50ZXJmYWNlIGNsb2NrIGlzIEFSTVBFUiAqLworCS5wYXJlbnQJCT0gJmFybXBlcl9jay5jbGssCisJLnJhdGUJCT0gNDgwMDAwMDAsCisJLmZsYWdzCQk9IFJBVEVfRklYRUQgfCBFTkFCTEVfUkVHXzMyQklUIHwgQ0xPQ0tfTk9fSURMRV9QQVJFTlQsCisJLmVuYWJsZV9yZWcJPSBPTUFQMV9JT19BRERSRVNTKE1PRF9DT05GX0NUUkxfMCksCisJLmVuYWJsZV9iaXQJPSAyMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1tYzNfY2sgPSB7CisJLm5hbWUJCT0gIm1tY19jayIsCisJLmlkCQk9IDIsCisJLm9wcwkJPSAmY2xrb3BzX2dlbmVyaWMsCisJLyogRnVuY3Rpb25hbCBjbG9jayBpcyBkaXJlY3QgZnJvbSBVTFBELCBpbnRlcmZhY2UgY2xvY2sgaXMgQVJNUEVSICovCisJLnBhcmVudAkJPSAmYXJtcGVyX2NrLmNsaywKKwkucmF0ZQkJPSA0ODAwMDAwMCwKKwkuZmxhZ3MJCT0gUkFURV9GSVhFRCB8IEVOQUJMRV9SRUdfMzJCSVQgfCBDTE9DS19OT19JRExFX1BBUkVOVCwKKwkuZW5hYmxlX3JlZwk9IE9NQVAxX0lPX0FERFJFU1MoU09GVF9SRVFfUkVHKSwKKwkuZW5hYmxlX2JpdAk9IDEyLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdmlydHVhbF9ja19tcHUgPSB7CisJLm5hbWUJCT0gIm1wdSIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmYXJtX2NrLCAvKiBJcyBzbWFydGVyIGFsaWFzIGZvciAqLworCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCisJLnNldF9yYXRlCT0gJm9tYXAxX3NlbGVjdF90YWJsZV9yYXRlLAorCS5yb3VuZF9yYXRlCT0gJm9tYXAxX3JvdW5kX3RvX3RhYmxlX3JhdGUsCit9OworCisvKiB2aXJ0dWFsIGZ1bmN0aW9uYWwgY2xvY2sgZG9tYWluIGZvciBJMkMuIEp1c3QgZm9yIG1ha2luZyBzdXJlIHRoYXQgQVJNWE9SX0NLCityZW1haW5zIGFjdGl2ZSBkdXJpbmcgTVBVIGlkbGUgd2hlbmV2ZXIgdGhpcyBpcyBlbmFibGVkICovCitzdGF0aWMgc3RydWN0IGNsayBpMmNfZmNrID0geworCS5uYW1lCQk9ICJpMmNfZmNrIiwKKwkuaWQJCT0gMSwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkuZmxhZ3MJCT0gQ0xPQ0tfTk9fSURMRV9QQVJFTlQsCisJLnBhcmVudAkJPSAmYXJteG9yX2NrLmNsaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgaTJjX2ljayA9IHsKKwkubmFtZQkJPSAiaTJjX2ljayIsCisJLmlkCQk9IDEsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLmZsYWdzCQk9IENMT0NLX05PX0lETEVfUEFSRU5ULAorCS5wYXJlbnQJCT0gJmFybXBlcl9jay5jbGssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKKy8qCisgKiBjbGtkZXYgaW50ZWdyYXRpb24KKyAqLworCitzdGF0aWMgc3RydWN0IG9tYXBfY2xrIG9tYXBfY2xrc1tdID0geworCS8qIG5vbi1VTFBEIGNsb2NrcyAqLworCUNMSyhOVUxMLAkiY2tfcmVmIiwJJmNrX3JlZiwJQ0tfMTZYWCB8IENLXzE1MTAgfCBDS18zMTAgfCBDS183WFgpLAorCUNMSyhOVUxMLAkiY2tfZHBsbDEiLAkmY2tfZHBsbDEsCUNLXzE2WFggfCBDS18xNTEwIHwgQ0tfMzEwKSwKKwkvKiBDS19HRU4xIGNsb2NrcyAqLworCUNMSyhOVUxMLAkiY2tfZHBsbDFvdXQiLAkmY2tfZHBsbDFvdXQuY2xrLCBDS18xNlhYKSwKKwlDTEsoTlVMTCwJImNrX3Nvc3NpIiwJJnNvc3NpX2NrLAlDS18xNlhYKSwKKwlDTEsoTlVMTCwJImFybV9jayIsCSZhcm1fY2ssCUNLXzE2WFggfCBDS18xNTEwIHwgQ0tfMzEwKSwKKwlDTEsoTlVMTCwJImFybXBlcl9jayIsCSZhcm1wZXJfY2suY2xrLAlDS18xNlhYIHwgQ0tfMTUxMCB8IENLXzMxMCksCisJQ0xLKE5VTEwsCSJhcm1fZ3Bpb19jayIsCSZhcm1fZ3Bpb19jaywJQ0tfMTUxMCB8IENLXzMxMCksCisJQ0xLKE5VTEwsCSJhcm14b3JfY2siLAkmYXJteG9yX2NrLmNsaywJQ0tfMTZYWCB8IENLXzE1MTAgfCBDS18zMTAgfCBDS183WFgpLAorCUNMSyhOVUxMLAkiYXJtdGltX2NrIiwJJmFybXRpbV9jay5jbGssCUNLXzE2WFggfCBDS18xNTEwIHwgQ0tfMzEwKSwKKwlDTEsoIm9tYXBfd2R0IiwJImZjayIsCQkmYXJtd2R0X2NrLmNsaywJQ0tfMTZYWCB8IENLXzE1MTAgfCBDS18zMTApLAorCUNMSygib21hcF93ZHQiLAkiaWNrIiwJCSZhcm1wZXJfY2suY2xrLAlDS18xNlhYKSwKKwlDTEsoIm9tYXBfd2R0IiwgImljayIsCQkmZHVtbXlfY2ssCUNLXzE1MTAgfCBDS18zMTApLAorCUNMSyhOVUxMLAkiYXJtaW50aF9jayIsCSZhcm1pbnRoX2NrMTUxMCwgQ0tfMTUxMCB8IENLXzMxMCksCisJQ0xLKE5VTEwsCSJhcm1pbnRoX2NrIiwJJmFybWludGhfY2sxNnh4LCBDS18xNlhYKSwKKwkvKiBDS19HRU4yIGNsb2NrcyAqLworCUNMSyhOVUxMLAkiZHNwX2NrIiwJJmRzcF9jaywJQ0tfMTZYWCB8IENLXzE1MTAgfCBDS18zMTApLAorCUNMSyhOVUxMLAkiZHNwbW11X2NrIiwJJmRzcG1tdV9jaywJQ0tfMTZYWCB8IENLXzE1MTAgfCBDS18zMTApLAorCUNMSyhOVUxMLAkiZHNwcGVyX2NrIiwJJmRzcHBlcl9jaywJQ0tfMTZYWCB8IENLXzE1MTAgfCBDS18zMTApLAorCUNMSyhOVUxMLAkiZHNweG9yX2NrIiwJJmRzcHhvcl9jaywJQ0tfMTZYWCB8IENLXzE1MTAgfCBDS18zMTApLAorCUNMSyhOVUxMLAkiZHNwdGltX2NrIiwJJmRzcHRpbV9jaywJQ0tfMTZYWCB8IENLXzE1MTAgfCBDS18zMTApLAorCS8qIENLX0dFTjMgY2xvY2tzICovCisJQ0xLKE5VTEwsCSJ0Y19jayIsCSZ0Y19jay5jbGssCUNLXzE2WFggfCBDS18xNTEwIHwgQ0tfMzEwIHwgQ0tfN1hYKSwKKwlDTEsoTlVMTCwJInRpcGJfY2siLAkmdGlwYl9jaywJQ0tfMTUxMCB8IENLXzMxMCksCisJQ0xLKE5VTEwsCSJsM19vY3BpX2NrIiwJJmwzX29jcGlfY2ssCUNLXzE2WFggfCBDS183WFgpLAorCUNMSyhOVUxMLAkidGMxX2NrIiwJJnRjMV9jaywJQ0tfMTZYWCksCisJQ0xLKE5VTEwsCSJ0YzJfY2siLAkmdGMyX2NrLAlDS18xNlhYKSwKKwlDTEsoTlVMTCwJImRtYV9jayIsCSZkbWFfY2ssCUNLXzE2WFggfCBDS18xNTEwIHwgQ0tfMzEwKSwKKwlDTEsoTlVMTCwJImRtYV9sY2RmcmVlX2NrIiwgJmRtYV9sY2RmcmVlX2NrLCBDS18xNlhYKSwKKwlDTEsoTlVMTCwJImFwaV9jayIsCSZhcGlfY2suY2xrLAlDS18xNlhYIHwgQ0tfMTUxMCB8IENLXzMxMCksCisJQ0xLKE5VTEwsCSJsYl9jayIsCSZsYl9jay5jbGssCUNLXzE1MTAgfCBDS18zMTApLAorCUNMSyhOVUxMLAkicmhlYTFfY2siLAkmcmhlYTFfY2ssCUNLXzE2WFgpLAorCUNMSyhOVUxMLAkicmhlYTJfY2siLAkmcmhlYTJfY2ssCUNLXzE2WFgpLAorCUNMSyhOVUxMLAkibGNkX2NrIiwJJmxjZF9ja18xNnh4LAlDS18xNlhYIHwgQ0tfN1hYKSwKKwlDTEsoTlVMTCwJImxjZF9jayIsCSZsY2RfY2tfMTUxMC5jbGssIENLXzE1MTAgfCBDS18zMTApLAorCS8qIFVMUEQgY2xvY2tzICovCisJQ0xLKE5VTEwsCSJ1YXJ0MV9jayIsCSZ1YXJ0MV8xNTEwLAlDS18xNTEwIHwgQ0tfMzEwKSwKKwlDTEsoTlVMTCwJInVhcnQxX2NrIiwJJnVhcnQxXzE2eHguY2xrLCBDS18xNlhYKSwKKwlDTEsoTlVMTCwJInVhcnQyX2NrIiwJJnVhcnQyX2NrLAlDS18xNlhYIHwgQ0tfMTUxMCB8IENLXzMxMCksCisJQ0xLKE5VTEwsCSJ1YXJ0M19jayIsCSZ1YXJ0M18xNTEwLAlDS18xNTEwIHwgQ0tfMzEwKSwKKwlDTEsoTlVMTCwJInVhcnQzX2NrIiwJJnVhcnQzXzE2eHguY2xrLCBDS18xNlhYKSwKKwlDTEsoTlVMTCwJInVzYl9jbGtvIiwJJnVzYl9jbGtvLAlDS18xNlhYIHwgQ0tfMTUxMCB8IENLXzMxMCksCisJQ0xLKE5VTEwsCSJ1c2JfaGhjX2NrIiwJJnVzYl9oaGNfY2sxNTEwLCBDS18xNTEwIHwgQ0tfMzEwKSwKKwlDTEsoTlVMTCwJInVzYl9oaGNfY2siLAkmdXNiX2hoY19jazE2eHgsIENLXzE2WFgpLAorCUNMSyhOVUxMLAkidXNiX2RjX2NrIiwJJnVzYl9kY19jaywJQ0tfMTZYWCksCisJQ0xLKE5VTEwsCSJ1c2JfZGNfY2siLAkmdXNiX2RjX2NrN3h4LAlDS183WFgpLAorCUNMSyhOVUxMLAkibWNsayIsCQkmbWNsa18xNTEwLAlDS18xNTEwIHwgQ0tfMzEwKSwKKwlDTEsoTlVMTCwJIm1jbGsiLAkJJm1jbGtfMTZ4eCwJQ0tfMTZYWCksCisJQ0xLKE5VTEwsCSJiY2xrIiwJCSZiY2xrXzE1MTAsCUNLXzE1MTAgfCBDS18zMTApLAorCUNMSyhOVUxMLAkiYmNsayIsCQkmYmNsa18xNnh4LAlDS18xNlhYKSwKKwlDTEsoIm1tY2ktb21hcC4wIiwgImZjayIsCSZtbWMxX2NrLAlDS18xNlhYIHwgQ0tfMTUxMCB8IENLXzMxMCksCisJQ0xLKCJtbWNpLW9tYXAuMCIsICJmY2siLAkmbW1jM19jaywJQ0tfN1hYKSwKKwlDTEsoIm1tY2ktb21hcC4wIiwgImljayIsCSZhcm1wZXJfY2suY2xrLAlDS18xNlhYIHwgQ0tfMTUxMCB8IENLXzMxMCB8IENLXzdYWCksCisJQ0xLKCJtbWNpLW9tYXAuMSIsICJmY2siLAkmbW1jMl9jaywJQ0tfMTZYWCksCisJQ0xLKCJtbWNpLW9tYXAuMSIsICJpY2siLAkmYXJtcGVyX2NrLmNsaywJQ0tfMTZYWCksCisJLyogVmlydHVhbCBjbG9ja3MgKi8KKwlDTEsoTlVMTCwJIm1wdSIsCQkmdmlydHVhbF9ja19tcHUsIENLXzE2WFggfCBDS18xNTEwIHwgQ0tfMzEwKSwKKwlDTEsoImkyY19vbWFwLjEiLCAiZmNrIiwJJmkyY19mY2ssCUNLXzE2WFggfCBDS18xNTEwIHwgQ0tfMzEwIHwgQ0tfN1hYKSwKKwlDTEsoImkyY19vbWFwLjEiLCAiaWNrIiwJJmkyY19pY2ssCUNLXzE2WFgpLAorCUNMSygiaTJjX29tYXAuMSIsICJpY2siLAkmZHVtbXlfY2ssCUNLXzE1MTAgfCBDS18zMTAgfCBDS183WFgpLAorCUNMSygib21hcF91d2lyZSIsICJmY2siLAkmYXJteG9yX2NrLmNsaywJQ0tfMTZYWCB8IENLXzE1MTAgfCBDS18zMTApLAorCUNMSygib21hcC1tY2JzcC4xIiwgImljayIsCSZkc3BwZXJfY2ssCUNLXzE2WFgpLAorCUNMSygib21hcC1tY2JzcC4xIiwgImljayIsCSZkdW1teV9jaywJQ0tfMTUxMCB8IENLXzMxMCksCisJQ0xLKCJvbWFwLW1jYnNwLjIiLCAiaWNrIiwJJmFybXBlcl9jay5jbGssCUNLXzE2WFgpLAorCUNMSygib21hcC1tY2JzcC4yIiwgImljayIsCSZkdW1teV9jaywJQ0tfMTUxMCB8IENLXzMxMCksCisJQ0xLKCJvbWFwLW1jYnNwLjMiLCAiaWNrIiwJJmRzcHBlcl9jaywJQ0tfMTZYWCksCisJQ0xLKCJvbWFwLW1jYnNwLjMiLCAiaWNrIiwJJmR1bW15X2NrLAlDS18xNTEwIHwgQ0tfMzEwKSwKKwlDTEsoIm9tYXAtbWNic3AuMSIsICJmY2siLAkmZHNweG9yX2NrLAlDS18xNlhYIHwgQ0tfMTUxMCB8IENLXzMxMCksCisJQ0xLKCJvbWFwLW1jYnNwLjIiLCAiZmNrIiwJJmFybXBlcl9jay5jbGssCUNLXzE2WFggfCBDS18xNTEwIHwgQ0tfMzEwKSwKKwlDTEsoIm9tYXAtbWNic3AuMyIsICJmY2siLAkmZHNweG9yX2NrLAlDS18xNlhYIHwgQ0tfMTUxMCB8IENLXzMxMCksCit9OworCisvKgorICogaW5pdAorICovCisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2Z1bmN0aW9ucyBvbWFwMV9jbGtfZnVuY3Rpb25zIF9faW5pdGRhdGEgPSB7CisJLmNsa19lbmFibGUJCT0gb21hcDFfY2xrX2VuYWJsZSwKKwkuY2xrX2Rpc2FibGUJCT0gb21hcDFfY2xrX2Rpc2FibGUsCisJLmNsa19yb3VuZF9yYXRlCQk9IG9tYXAxX2Nsa19yb3VuZF9yYXRlLAorCS5jbGtfc2V0X3JhdGUJCT0gb21hcDFfY2xrX3NldF9yYXRlLAorCS5jbGtfZGlzYWJsZV91bnVzZWQJPSBvbWFwMV9jbGtfZGlzYWJsZV91bnVzZWQsCit9OworCitpbnQgX19pbml0IG9tYXAxX2Nsa19pbml0KHZvaWQpCit7CisJc3RydWN0IG9tYXBfY2xrICpjOworCWNvbnN0IHN0cnVjdCBvbWFwX2Nsb2NrX2NvbmZpZyAqaW5mbzsKKwlpbnQgY3J5c3RhbF90eXBlID0gMDsgLyogRGVmYXVsdCAxMiBNSHogKi8KKwl1MzIgcmVnLCBjcHVfbWFzazsKKworI2lmZGVmIENPTkZJR19ERUJVR19MTAorCS8qCisJICogUmVzZXRzIHNvbWUgY2xvY2tzIHRoYXQgbWF5IGJlIGxlZnQgb24gZnJvbSBib290bG9hZGVyLAorCSAqIGJ1dCBsZWF2ZXMgc2VyaWFsIGNsb2NrcyBvbi4KKwkgKi8KKwlvbWFwX3dyaXRlbCgweDMgPDwgMjksIE1PRF9DT05GX0NUUkxfMCk7CisjZW5kaWYKKworCS8qIFVTQl9SRVFfRU4gd2lsbCBiZSBkaXNhYmxlZCBsYXRlciBpZiBuZWNlc3NhcnkgKHVzYl9kY19jaykgKi8KKwlyZWcgPSBvbWFwX3JlYWR3KFNPRlRfUkVRX1JFRykgJiAoMSA8PCA0KTsKKwlvbWFwX3dyaXRldyhyZWcsIFNPRlRfUkVRX1JFRyk7CisJaWYgKCFjcHVfaXNfb21hcDE1eHgoKSkKKwkJb21hcF93cml0ZXcoMCwgU09GVF9SRVFfUkVHMik7CisKKwljbGtfaW5pdCgmb21hcDFfY2xrX2Z1bmN0aW9ucyk7CisKKwkvKiBCeSBkZWZhdWx0IGFsbCBpZGxlY3QxIGNsb2NrcyBhcmUgYWxsb3dlZCB0byBpZGxlICovCisJYXJtX2lkbGVjdDFfbWFzayA9IH4wOworCisJZm9yIChjID0gb21hcF9jbGtzOyBjIDwgb21hcF9jbGtzICsgQVJSQVlfU0laRShvbWFwX2Nsa3MpOyBjKyspCisJCWNsa19wcmVpbml0KGMtPmxrLmNsayk7CisKKwljcHVfbWFzayA9IDA7CisJaWYgKGNwdV9pc19vbWFwMTZ4eCgpKQorCQljcHVfbWFzayB8PSBDS18xNlhYOworCWlmIChjcHVfaXNfb21hcDE1MTAoKSkKKwkJY3B1X21hc2sgfD0gQ0tfMTUxMDsKKwlpZiAoY3B1X2lzX29tYXA3eHgoKSkKKwkJY3B1X21hc2sgfD0gQ0tfN1hYOworCWlmIChjcHVfaXNfb21hcDMxMCgpKQorCQljcHVfbWFzayB8PSBDS18zMTA7CisKKwlmb3IgKGMgPSBvbWFwX2Nsa3M7IGMgPCBvbWFwX2Nsa3MgKyBBUlJBWV9TSVpFKG9tYXBfY2xrcyk7IGMrKykKKwkJaWYgKGMtPmNwdSAmIGNwdV9tYXNrKSB7CisJCQljbGtkZXZfYWRkKCZjLT5sayk7CisJCQljbGtfcmVnaXN0ZXIoYy0+bGsuY2xrKTsKKwkJfQorCisJLyogUG9pbnRlcnMgdG8gdGhlc2UgY2xvY2tzIGFyZSBuZWVkZWQgYnkgY29kZSBpbiBjbG9jay5jICovCisJYXBpX2NrX3AgPSBjbGtfZ2V0KE5VTEwsICJhcGlfY2siKTsKKwlja19kcGxsMV9wID0gY2xrX2dldChOVUxMLCAiY2tfZHBsbDEiKTsKKwlja19yZWZfcCA9IGNsa19nZXQoTlVMTCwgImNrX3JlZiIpOworCisJaW5mbyA9IG9tYXBfZ2V0X2NvbmZpZyhPTUFQX1RBR19DTE9DSywgc3RydWN0IG9tYXBfY2xvY2tfY29uZmlnKTsKKwlpZiAoaW5mbyAhPSBOVUxMKSB7CisJCWlmICghY3B1X2lzX29tYXAxNXh4KCkpCisJCQljcnlzdGFsX3R5cGUgPSBpbmZvLT5zeXN0ZW1fY2xvY2tfdHlwZTsKKwl9CisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVA3MzApIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDg1MCkKKwlja19yZWYucmF0ZSA9IDEzMDAwMDAwOworI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKKwlpZiAoY3J5c3RhbF90eXBlID09IDIpCisJCWNrX3JlZi5yYXRlID0gMTkyMDAwMDA7CisjZW5kaWYKKworCXByX2luZm8oIkNsb2NrczogQVJNX1NZU1NUOiAweCUwNHggRFBMTF9DVEw6IDB4JTA0eCBBUk1fQ0tDVEw6ICIKKwkJIjB4JTA0eFxuIiwgb21hcF9yZWFkdyhBUk1fU1lTU1QpLCBvbWFwX3JlYWR3KERQTExfQ1RMKSwKKwkJb21hcF9yZWFkdyhBUk1fQ0tDVEwpKTsKKworCS8qIFdlIHdhbnQgdG8gYmUgaW4gc3luY3Jvbm91cyBzY2FsYWJsZSBtb2RlICovCisJb21hcF93cml0ZXcoMHgxMDAwLCBBUk1fU1lTU1QpOworCisjaWZkZWYgQ09ORklHX09NQVBfQ0xPQ0tTX1NFVF9CWV9CT09UTE9BREVSCisJLyogVXNlIHZhbHVlcyBzZXQgYnkgYm9vdGxvYWRlci4gRGV0ZXJtaW5lIFBMTCByYXRlIGFuZCByZWNhbGN1bGF0ZQorCSAqIGRlcGVuZGVudCBjbG9ja3MgYXMgaWYga2VybmVsIGhhZCBjaGFuZ2VkIFBMTCBvciBkaXZpc29ycy4KKwkgKi8KKwl7CisJCXVuc2lnbmVkIHBsbF9jdGxfdmFsID0gb21hcF9yZWFkdyhEUExMX0NUTCk7CisKKwkJY2tfZHBsbDEucmF0ZSA9IGNrX3JlZi5yYXRlOyAvKiBCYXNlIHh0YWwgcmF0ZSAqLworCQlpZiAocGxsX2N0bF92YWwgJiAweDEwKSB7CisJCQkvKiBQTEwgZW5hYmxlZCwgYXBwbHkgbXVsdGlwbGllciBhbmQgZGl2aXNvciAqLworCQkJaWYgKHBsbF9jdGxfdmFsICYgMHhmODApCisJCQkJY2tfZHBsbDEucmF0ZSAqPSAocGxsX2N0bF92YWwgJiAweGY4MCkgPj4gNzsKKwkJCWNrX2RwbGwxLnJhdGUgLz0gKChwbGxfY3RsX3ZhbCAmIDB4NjApID4+IDUpICsgMTsKKwkJfSBlbHNlIHsKKwkJCS8qIFBMTCBkaXNhYmxlZCwgYXBwbHkgYnlwYXNzIGRpdmlzb3IgKi8KKwkJCXN3aXRjaCAocGxsX2N0bF92YWwgJiAweGMpIHsKKwkJCWNhc2UgMDoKKwkJCQlicmVhazsKKwkJCWNhc2UgMHg0OgorCQkJCWNrX2RwbGwxLnJhdGUgLz0gMjsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJY2tfZHBsbDEucmF0ZSAvPSA0OworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorI2Vsc2UKKwkvKiBGaW5kIHRoZSBoaWdoZXN0IHN1cHBvcnRlZCBmcmVxdWVuY3kgYW5kIGVuYWJsZSBpdCAqLworCWlmIChvbWFwMV9zZWxlY3RfdGFibGVfcmF0ZSgmdmlydHVhbF9ja19tcHUsIH4wKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlN5c3RlbSBmcmVxdWVuY2llcyBub3Qgc2V0LiBDaGVjayB5b3VyIGNvbmZpZy5cbiIpOworCQkvKiBHdWVzcyBzYW5lIHZhbHVlcyAoNjBNSHopICovCisJCW9tYXBfd3JpdGV3KDB4MjI5MCwgRFBMTF9DVEwpOworCQlvbWFwX3dyaXRldyhjcHVfaXNfb21hcDd4eCgpID8gMHgzMDA1IDogMHgxMDA1LCBBUk1fQ0tDVEwpOworCQlja19kcGxsMS5yYXRlID0gNjAwMDAwMDA7CisJfQorI2VuZGlmCisJcHJvcGFnYXRlX3JhdGUoJmNrX2RwbGwxKTsKKwkvKiBDYWNoZSByYXRlcyBmb3IgY2xvY2tzIGNvbm5lY3RlZCB0byBja19yZWYgKG5vdCBkcGxsMSkgKi8KKwlwcm9wYWdhdGVfcmF0ZSgmY2tfcmVmKTsKKwlwcmludGsoS0VSTl9JTkZPICJDbG9ja2luZyByYXRlICh4dGFsL0RQTEwxL01QVSk6ICIKKwkJIiVsZC4lMDFsZC8lbGQuJTAxbGQvJWxkLiUwMWxkIE1IelxuIiwKKwkgICAgICAgY2tfcmVmLnJhdGUgLyAxMDAwMDAwLCAoY2tfcmVmLnJhdGUgLyAxMDAwMDApICUgMTAsCisJICAgICAgIGNrX2RwbGwxLnJhdGUgLyAxMDAwMDAwLCAoY2tfZHBsbDEucmF0ZSAvIDEwMDAwMCkgJSAxMCwKKwkgICAgICAgYXJtX2NrLnJhdGUgLyAxMDAwMDAwLCAoYXJtX2NrLnJhdGUgLyAxMDAwMDApICUgMTApOworCisjaWYgZGVmaW5lZChDT05GSUdfTUFDSF9PTUFQX1BFUlNFVVMyKSB8fCBkZWZpbmVkKENPTkZJR19NQUNIX09NQVBfRlNBTVBMRSkKKwkvKiBTZWxlY3Qgc2xpY2VyIG91dHB1dCBhcyBPTUFQIGlucHV0IGNsb2NrICovCisJb21hcF93cml0ZXcob21hcF9yZWFkdyhPTUFQN1hYX1BDQ19VUExEX0NUUkwpICYgfjB4MSwgT01BUDdYWF9QQ0NfVVBMRF9DVFJMKTsKKyNlbmRpZgorCisJLyogQW1zdHJhZCBEZWx0YSB3YW50cyBCQ0xLIGhpZ2ggd2hlbiBpbmFjdGl2ZSAqLworCWlmIChtYWNoaW5lX2lzX2Ftc19kZWx0YSgpKQorCQlvbWFwX3dyaXRlbChvbWFwX3JlYWRsKFVMUERfQ0xPQ0tfQ1RSTCkgfAorCQkJCSgxIDw8IFNEV19NQ0xLX0lOVl9CSVQpLAorCQkJCVVMUERfQ0xPQ0tfQ1RSTCk7CisKKwkvKiBUdXJuIG9mZiBEU1AgYW5kIEFSTV9USU1YTy4gTWFrZSBzdXJlIEFSTV9JTlRIQ0sgaXMgbm90IGRpdmlkZWQgKi8KKwkvKiAob24gNzMwLCBiaXQgMTMgbXVzdCBub3QgYmUgY2xlYXJlZCkgKi8KKwlpZiAoY3B1X2lzX29tYXA3eHgoKSkKKwkJb21hcF93cml0ZXcob21hcF9yZWFkdyhBUk1fQ0tDVEwpICYgMHgyZmZmLCBBUk1fQ0tDVEwpOworCWVsc2UKKwkJb21hcF93cml0ZXcob21hcF9yZWFkdyhBUk1fQ0tDVEwpICYgMHgwZmZmLCBBUk1fQ0tDVEwpOworCisJLyogUHV0IERTUC9NUFVJIGludG8gcmVzZXQgdW50aWwgbmVlZGVkICovCisJb21hcF93cml0ZXcoMCwgQVJNX1JTVENUMSk7CisJb21hcF93cml0ZXcoMSwgQVJNX1JTVENUMik7CisJb21hcF93cml0ZXcoMHg0MDAsIEFSTV9JRExFQ1QxKTsKKworCS8qCisJICogQWNjb3JkaW5nIHRvIE9NQVA1OTEwIEVycmF0dW0gU1lTX0RNQV8xLCBiaXQgRE1BQ0tfUkVRIChiaXQgOCkKKwkgKiBvZiB0aGUgQVJNX0lETEVDVDIgcmVnaXN0ZXIgbXVzdCBiZSBzZXQgdG8gemVyby4gVGhlIHBvd2VyLW9uCisJICogZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIGJpdCBpcyBvbmUuCisJICovCisJb21hcF93cml0ZXcoMHgwMDAwLCBBUk1fSURMRUNUMik7CS8qIFR1cm4gTENEIGNsb2NrIG9mZiBhbHNvICovCisKKwkvKgorCSAqIE9ubHkgZW5hYmxlIHRob3NlIGNsb2NrcyB3ZSB3aWxsIG5lZWQsIGxldCB0aGUgZHJpdmVycworCSAqIGVuYWJsZSBvdGhlciBjbG9ja3MgYXMgbmVjZXNzYXJ5CisJICovCisJY2xrX2VuYWJsZSgmYXJtcGVyX2NrLmNsayk7CisJY2xrX2VuYWJsZSgmYXJteG9yX2NrLmNsayk7CisJY2xrX2VuYWJsZSgmYXJtdGltX2NrLmNsayk7IC8qIFRoaXMgc2hvdWxkIGJlIGRvbmUgYnkgdGltZXIgY29kZSAqLworCisJaWYgKGNwdV9pc19vbWFwMTV4eCgpKQorCQljbGtfZW5hYmxlKCZhcm1fZ3Bpb19jayk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvaTJjLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2kyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZjQ3MzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2kyYy5jCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBIZWxwZXIgbW9kdWxlIGZvciBib2FyZCBzcGVjaWZpYyBJMkMgYnVzIHJlZ2lzdHJhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxwbGF0L2kyYy5oPgorI2luY2x1ZGUgPHBsYXQvbXV4Lmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKworaW50IF9faW5pdCBvbWFwX3JlZ2lzdGVyX2kyY19idXMoaW50IGJ1c19pZCwgdTMyIGNsa3JhdGUsCisJCQkgIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBjb25zdCAqaW5mbywKKwkJCSAgdW5zaWduZWQgbGVuKQoreworCWlmIChjcHVfaXNfb21hcDd4eCgpKSB7CisJCW9tYXBfY2ZnX3JlZyhJMkNfN1hYX1NEQSk7CisJCW9tYXBfY2ZnX3JlZyhJMkNfN1hYX1NDTCk7CisJfSBlbHNlIHsKKwkJb21hcF9jZmdfcmVnKEkyQ19TREEpOworCQlvbWFwX2NmZ19yZWcoSTJDX1NDTCk7CisJfQorCisJcmV0dXJuIG9tYXBfcGxhdF9yZWdpc3Rlcl9pMmNfYnVzKGJ1c19pZCwgY2xrcmF0ZSwgaW5mbywgbGVuKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvaW5jbHVkZS9tYWNoL2xjZF9kbWEuaCBiL2FyY2gvYXJtL21hY2gtb21hcDEvaW5jbHVkZS9tYWNoL2xjZF9kbWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2E0NTdiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9pbmNsdWRlL21hY2gvbGNkX2RtYS5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiAgYXJjaC9hcm0vbWFjaC1vbWFwMS9pbmNsdWRlL21hY2gvbGNkX2RtYS5oCisgKgorICogRXh0cmFjdGVkIGZyb20gYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9kbWEuaAorICogIENvcHlyaWdodCAoQykgMjAwMyBOb2tpYSBDb3Jwb3JhdGlvbgorICogIEF1dGhvcjogSnVoYSBZcmrDtmzDpCA8anVoYS55cmpvbGFAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZiBfX01BQ0hfT01BUDFfTENEX0RNQV9IX18KKyNkZWZpbmUgX19NQUNIX09NQVAxX0xDRF9ETUFfSF9fCisKKy8qIEhhcmR3YXJlIHJlZ2lzdGVycyBmb3IgTENEIERNQSAqLworI2RlZmluZSBPTUFQMTUxMF9ETUFfTENEX0JBU0UJCSgweGZmZmVkYjAwKQorI2RlZmluZSBPTUFQMTUxMF9ETUFfTENEX0NUUkwJCShPTUFQMTUxMF9ETUFfTENEX0JBU0UgKyAweDAwKQorI2RlZmluZSBPTUFQMTUxMF9ETUFfTENEX1RPUF9GMV9MCShPTUFQMTUxMF9ETUFfTENEX0JBU0UgKyAweDAyKQorI2RlZmluZSBPTUFQMTUxMF9ETUFfTENEX1RPUF9GMV9VCShPTUFQMTUxMF9ETUFfTENEX0JBU0UgKyAweDA0KQorI2RlZmluZSBPTUFQMTUxMF9ETUFfTENEX0JPVF9GMV9MCShPTUFQMTUxMF9ETUFfTENEX0JBU0UgKyAweDA2KQorI2RlZmluZSBPTUFQMTUxMF9ETUFfTENEX0JPVF9GMV9VCShPTUFQMTUxMF9ETUFfTENEX0JBU0UgKyAweDA4KQorCisjZGVmaW5lIE9NQVAxNjEwX0RNQV9MQ0RfQkFTRQkJKDB4ZmZmZWUzMDApCisjZGVmaW5lIE9NQVAxNjEwX0RNQV9MQ0RfQ1NEUAkJKE9NQVAxNjEwX0RNQV9MQ0RfQkFTRSArIDB4YzApCisjZGVmaW5lIE9NQVAxNjEwX0RNQV9MQ0RfQ0NSCQkoT01BUDE2MTBfRE1BX0xDRF9CQVNFICsgMHhjMikKKyNkZWZpbmUgT01BUDE2MTBfRE1BX0xDRF9DVFJMCQkoT01BUDE2MTBfRE1BX0xDRF9CQVNFICsgMHhjNCkKKyNkZWZpbmUgT01BUDE2MTBfRE1BX0xDRF9UT1BfQjFfTAkoT01BUDE2MTBfRE1BX0xDRF9CQVNFICsgMHhjOCkKKyNkZWZpbmUgT01BUDE2MTBfRE1BX0xDRF9UT1BfQjFfVQkoT01BUDE2MTBfRE1BX0xDRF9CQVNFICsgMHhjYSkKKyNkZWZpbmUgT01BUDE2MTBfRE1BX0xDRF9CT1RfQjFfTAkoT01BUDE2MTBfRE1BX0xDRF9CQVNFICsgMHhjYykKKyNkZWZpbmUgT01BUDE2MTBfRE1BX0xDRF9CT1RfQjFfVQkoT01BUDE2MTBfRE1BX0xDRF9CQVNFICsgMHhjZSkKKyNkZWZpbmUgT01BUDE2MTBfRE1BX0xDRF9UT1BfQjJfTAkoT01BUDE2MTBfRE1BX0xDRF9CQVNFICsgMHhkMCkKKyNkZWZpbmUgT01BUDE2MTBfRE1BX0xDRF9UT1BfQjJfVQkoT01BUDE2MTBfRE1BX0xDRF9CQVNFICsgMHhkMikKKyNkZWZpbmUgT01BUDE2MTBfRE1BX0xDRF9CT1RfQjJfTAkoT01BUDE2MTBfRE1BX0xDRF9CQVNFICsgMHhkNCkKKyNkZWZpbmUgT01BUDE2MTBfRE1BX0xDRF9CT1RfQjJfVQkoT01BUDE2MTBfRE1BX0xDRF9CQVNFICsgMHhkNikKKyNkZWZpbmUgT01BUDE2MTBfRE1BX0xDRF9TUkNfRUlfQjEJKE9NQVAxNjEwX0RNQV9MQ0RfQkFTRSArIDB4ZDgpCisjZGVmaW5lIE9NQVAxNjEwX0RNQV9MQ0RfU1JDX0ZJX0IxX0wJKE9NQVAxNjEwX0RNQV9MQ0RfQkFTRSArIDB4ZGEpCisjZGVmaW5lIE9NQVAxNjEwX0RNQV9MQ0RfU1JDX0VOX0IxCShPTUFQMTYxMF9ETUFfTENEX0JBU0UgKyAweGUwKQorI2RlZmluZSBPTUFQMTYxMF9ETUFfTENEX1NSQ19GTl9CMQkoT01BUDE2MTBfRE1BX0xDRF9CQVNFICsgMHhlNCkKKyNkZWZpbmUgT01BUDE2MTBfRE1BX0xDRF9MQ0hfQ1RSTAkoT01BUDE2MTBfRE1BX0xDRF9CQVNFICsgMHhlYSkKKyNkZWZpbmUgT01BUDE2MTBfRE1BX0xDRF9TUkNfRklfQjFfVQkoT01BUDE2MTBfRE1BX0xDRF9CQVNFICsgMHhmNCkKKworLyogTENEIERNQSBibG9jayBudW1iZXJzICovCitlbnVtIHsKKwlPTUFQX0xDRF9ETUFfQjFfVE9QLAorCU9NQVBfTENEX0RNQV9CMV9CT1RUT00sCisJT01BUF9MQ0RfRE1BX0IyX1RPUCwKKwlPTUFQX0xDRF9ETUFfQjJfQk9UVE9NCit9OworCisvKiBMQ0QgRE1BIGZ1bmN0aW9ucyAqLworZXh0ZXJuIGludCBvbWFwX3JlcXVlc3RfbGNkX2RtYSh2b2lkICgqY2FsbGJhY2spKHUxNiBzdGF0dXMsIHZvaWQgKmRhdGEpLAorCQkJCXZvaWQgKmRhdGEpOworZXh0ZXJuIHZvaWQgb21hcF9mcmVlX2xjZF9kbWEodm9pZCk7CitleHRlcm4gdm9pZCBvbWFwX3NldHVwX2xjZF9kbWEodm9pZCk7CitleHRlcm4gdm9pZCBvbWFwX2VuYWJsZV9sY2RfZG1hKHZvaWQpOworZXh0ZXJuIHZvaWQgb21hcF9zdG9wX2xjZF9kbWEodm9pZCk7CitleHRlcm4gdm9pZCBvbWFwX3NldF9sY2RfZG1hX2V4dF9jb250cm9sbGVyKGludCBleHRlcm5hbCk7CitleHRlcm4gdm9pZCBvbWFwX3NldF9sY2RfZG1hX3NpbmdsZV90cmFuc2ZlcihpbnQgc2luZ2xlKTsKK2V4dGVybiB2b2lkIG9tYXBfc2V0X2xjZF9kbWFfYjEodW5zaWduZWQgbG9uZyBhZGRyLCB1MTYgZmJfeHJlcywgdTE2IGZiX3lyZXMsCisJCQkJaW50IGRhdGFfdHlwZSk7CitleHRlcm4gdm9pZCBvbWFwX3NldF9sY2RfZG1hX2IxX3JvdGF0aW9uKGludCByb3RhdGUpOworZXh0ZXJuIHZvaWQgb21hcF9zZXRfbGNkX2RtYV9iMV92eHJlcyh1bnNpZ25lZCBsb25nIHZ4cmVzKTsKK2V4dGVybiB2b2lkIG9tYXBfc2V0X2xjZF9kbWFfYjFfbWlycm9yKGludCBtaXJyb3IpOworZXh0ZXJuIHZvaWQgb21hcF9zZXRfbGNkX2RtYV9iMV9zY2FsZSh1bnNpZ25lZCBpbnQgeHNjYWxlLCB1bnNpZ25lZCBpbnQgeXNjYWxlKTsKKworZXh0ZXJuIGludCBvbWFwX2xjZF9kbWFfcnVubmluZyh2b2lkKTsKKworI2VuZGlmIC8qIF9fTUFDSF9PTUFQMV9MQ0RfRE1BX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9pbmNsdWRlL21hY2gvbGNkYy5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9pbmNsdWRlL21hY2gvbGNkYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YmQ3MDMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2luY2x1ZGUvbWFjaC9sY2RjLmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtb21hcDEvaW5jbHVkZS9tYWNoL2xjZGMuaAorICoKKyAqIEV4dHJhY3RlZCBmcm9tIGRyaXZlcnMvdmlkZW8vb21hcC9sY2RjLmMKKyAqIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpZm5kZWYgX19NQUNIX0xDRENfSF9fCisjZGVmaW5lIF9fTUFDSF9MQ0RDX0hfXworCisjZGVmaW5lIE9NQVBfTENEQ19CQVNFCQkJMHhmZmZlYzAwMAorI2RlZmluZSBPTUFQX0xDRENfU0laRQkJCTI1NgorI2RlZmluZSBPTUFQX0xDRENfSVJRCQkJSU5UX0xDRF9DVFJMCisKKyNkZWZpbmUgT01BUF9MQ0RDX0NPTlRST0wJCShPTUFQX0xDRENfQkFTRSArIDB4MDApCisjZGVmaW5lIE9NQVBfTENEQ19USU1JTkcwCQkoT01BUF9MQ0RDX0JBU0UgKyAweDA0KQorI2RlZmluZSBPTUFQX0xDRENfVElNSU5HMQkJKE9NQVBfTENEQ19CQVNFICsgMHgwOCkKKyNkZWZpbmUgT01BUF9MQ0RDX1RJTUlORzIJCShPTUFQX0xDRENfQkFTRSArIDB4MGMpCisjZGVmaW5lIE9NQVBfTENEQ19TVEFUVVMJCShPTUFQX0xDRENfQkFTRSArIDB4MTApCisjZGVmaW5lIE9NQVBfTENEQ19TVUJQQU5FTAkJKE9NQVBfTENEQ19CQVNFICsgMHgxNCkKKyNkZWZpbmUgT01BUF9MQ0RDX0xJTkVfSU5UCQkoT01BUF9MQ0RDX0JBU0UgKyAweDE4KQorI2RlZmluZSBPTUFQX0xDRENfRElTUExBWV9TVEFUVVMJKE9NQVBfTENEQ19CQVNFICsgMHgxYykKKworI2RlZmluZSBPTUFQX0xDRENfU1RBVF9ET05FCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQX0xDRENfU1RBVF9WU1lOQwkJKDEgPDwgMSkKKyNkZWZpbmUgT01BUF9MQ0RDX1NUQVRfU1lOQ19MT1NUCSgxIDw8IDIpCisjZGVmaW5lIE9NQVBfTENEQ19TVEFUX0FCQwkJKDEgPDwgMykKKyNkZWZpbmUgT01BUF9MQ0RDX1NUQVRfTElORV9JTlQJCSgxIDw8IDQpCisjZGVmaW5lIE9NQVBfTENEQ19TVEFUX0ZVRgkJKDEgPDwgNSkKKyNkZWZpbmUgT01BUF9MQ0RDX1NUQVRfTE9BREVEX1BBTEVUVEUJKDEgPDwgNikKKworI2RlZmluZSBPTUFQX0xDRENfQ1RSTF9MQ0RfRU4JCSgxIDw8IDApCisjZGVmaW5lIE9NQVBfTENEQ19DVFJMX0xDRF9URlQJCSgxIDw8IDcpCisjZGVmaW5lIE9NQVBfTENEQ19DVFJMX0xJTkVfSVJRX0NMUl9TRUwJKDEgPDwgMTApCisKKyNkZWZpbmUgT01BUF9MQ0RDX0lSUV9WU1lOQwkJKDEgPDwgMikKKyNkZWZpbmUgT01BUF9MQ0RDX0lSUV9ET05FCQkoMSA8PCAzKQorI2RlZmluZSBPTUFQX0xDRENfSVJRX0xPQURFRF9QQUxFVFRFCSgxIDw8IDQpCisjZGVmaW5lIE9NQVBfTENEQ19JUlFfTElORV9OSVJRCQkoMSA8PCA1KQorI2RlZmluZSBPTUFQX0xDRENfSVJRX0xJTkUJCSgxIDw8IDYpCisjZGVmaW5lIE9NQVBfTENEQ19JUlFfTUFTSwkJKCgoMSA8PCA1KSAtIDEpIDw8IDIpCisKKyNlbmRpZiAvKiBfX01BQ0hfTENEQ19IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvaW8uYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvaW8uYwppbmRleCAyYTZkNjhhLi5kOWI4ZDgyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2lvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9pby5jCkBAIC0xOCw3ICsxOCw4IEBACiAjaW5jbHVkZSA8cGxhdC9tdXguaD4KICNpbmNsdWRlIDxwbGF0L3RjLmg+CiAKLWV4dGVybiBpbnQgb21hcDFfY2xrX2luaXQodm9pZCk7CisjaW5jbHVkZSAiY2xvY2suaCIKKwogZXh0ZXJuIHZvaWQgb21hcF9jaGVja19yZXZpc2lvbih2b2lkKTsKIGV4dGVybiB2b2lkIG9tYXBfc3JhbV9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgb21hcGZiX3Jlc2VydmVfc2RyYW0odm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2xjZF9kbWEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbGNkX2RtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZTExYWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2xjZF9kbWEuYwpAQCAtMCwwICsxLDQ0OCBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDEvbGNkX2RtYS5jCisgKgorICogRXh0cmFjdGVkIGZyb20gYXJjaC9hcm0vcGxhdC1vbWFwL2RtYS5jCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgLSAyMDA4IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IEp1aGEgWXJqw7Zsw6QgPGp1aGEueXJqb2xhQG5va2lhLmNvbT4KKyAqIERNQSBjaGFubmVsIGxpbmtpbmcgZm9yIDE2MTAgYnkgU2FtdWVsIE9ydGl6IDxzYW11ZWwub3J0aXpAbm9raWEuY29tPgorICogR3JhcGhpY3MgRE1BIGFuZCBMQ0QgRE1BIGdyYXBoaWNzIHRyYW5mb3JtYXRpb25zCisgKiBieSBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+CisgKiBPTUFQMi8zIHN1cHBvcnQgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqIE1lcmdlZCB0byBzdXBwb3J0IGJvdGggT01BUDEgYW5kIE9NQVAyIGJ5IFRvbnkgTGluZGdyZW4gPHRvbnlAYXRvbWlkZS5jb20+CisgKiBTb21lIGZ1bmN0aW9ucyBiYXNlZCBvbiBlYXJsaWVyIGRtYS1vbWFwLmMgQ29weXJpZ2h0IChDKSAyMDAxIFJpZGdlUnVuLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRleGFzIEluc3RydW1lbnRzCisgKiBBZGRlZCBPTUFQNCBzdXBwb3J0IC0gU2FudG9zaCBTaGlsaW1rYXIgPHNhbnRvc2guc2hpbGlta2FyQHRpLmNvbT4KKyAqCisgKiBTdXBwb3J0IGZ1bmN0aW9ucyBmb3IgdGhlIE9NQVAgaW50ZXJuYWwgRE1BIGNoYW5uZWxzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9sY2RjLmg+CisjaW5jbHVkZSA8cGxhdC9kbWEuaD4KKworaW50IG9tYXBfbGNkX2RtYV9ydW5uaW5nKHZvaWQpCit7CisJLyoKKwkgKiBPbiBPTUFQMTUxMCwgaW50ZXJuYWwgTENEIGNvbnRyb2xsZXIgd2lsbCBzdGFydCB0aGUgdHJhbnNmZXIKKwkgKiB3aGVuIGl0IGdldHMgZW5hYmxlZCwgc28gYXNzdW1lIERNQSBydW5uaW5nIGlmIExDRCBlbmFibGVkLgorCSAqLworCWlmIChjcHVfaXNfb21hcDE1MTAoKSkKKwkJaWYgKG9tYXBfcmVhZHcoT01BUF9MQ0RDX0NPTlRST0wpICYgT01BUF9MQ0RDX0NUUkxfTENEX0VOKQorCQkJcmV0dXJuIDE7CisKKwkvKiBDaGVjayBpZiBMQ0QgRE1BIGlzIHJ1bm5pbmcgKi8KKwlpZiAoY3B1X2lzX29tYXAxNnh4KCkpCisJCWlmIChvbWFwX3JlYWR3KE9NQVAxNjEwX0RNQV9MQ0RfQ0NSKSAmIE9NQVBfRE1BX0NDUl9FTikKKwkJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGNkX2RtYV9pbmZvIHsKKwlzcGlubG9ja190IGxvY2s7CisJaW50IHJlc2VydmVkOworCXZvaWQgKCpjYWxsYmFjaykodTE2IHN0YXR1cywgdm9pZCAqZGF0YSk7CisJdm9pZCAqY2JfZGF0YTsKKworCWludCBhY3RpdmU7CisJdW5zaWduZWQgbG9uZyBhZGRyLCBzaXplOworCWludCByb3RhdGUsIGRhdGFfdHlwZSwgeHJlcywgeXJlczsKKwlpbnQgdnhyZXM7CisJaW50IG1pcnJvcjsKKwlpbnQgeHNjYWxlLCB5c2NhbGU7CisJaW50IGV4dF9jdHJsOworCWludCBzcmNfcG9ydDsKKwlpbnQgc2luZ2xlX3RyYW5zZmVyOworfSBsY2RfZG1hOworCit2b2lkIG9tYXBfc2V0X2xjZF9kbWFfYjEodW5zaWduZWQgbG9uZyBhZGRyLCB1MTYgZmJfeHJlcywgdTE2IGZiX3lyZXMsCisJCQkgaW50IGRhdGFfdHlwZSkKK3sKKwlsY2RfZG1hLmFkZHIgPSBhZGRyOworCWxjZF9kbWEuZGF0YV90eXBlID0gZGF0YV90eXBlOworCWxjZF9kbWEueHJlcyA9IGZiX3hyZXM7CisJbGNkX2RtYS55cmVzID0gZmJfeXJlczsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9zZXRfbGNkX2RtYV9iMSk7CisKK3ZvaWQgb21hcF9zZXRfbGNkX2RtYV9zcmNfcG9ydChpbnQgcG9ydCkKK3sKKwlsY2RfZG1hLnNyY19wb3J0ID0gcG9ydDsKK30KKwordm9pZCBvbWFwX3NldF9sY2RfZG1hX2V4dF9jb250cm9sbGVyKGludCBleHRlcm5hbCkKK3sKKwlsY2RfZG1hLmV4dF9jdHJsID0gZXh0ZXJuYWw7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2xjZF9kbWFfZXh0X2NvbnRyb2xsZXIpOworCit2b2lkIG9tYXBfc2V0X2xjZF9kbWFfc2luZ2xlX3RyYW5zZmVyKGludCBzaW5nbGUpCit7CisJbGNkX2RtYS5zaW5nbGVfdHJhbnNmZXIgPSBzaW5nbGU7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2xjZF9kbWFfc2luZ2xlX3RyYW5zZmVyKTsKKwordm9pZCBvbWFwX3NldF9sY2RfZG1hX2IxX3JvdGF0aW9uKGludCByb3RhdGUpCit7CisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRE1BIHJvdGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gMTUxMCBtb2RlXG4iKTsKKwkJQlVHKCk7CisJCXJldHVybjsKKwl9CisJbGNkX2RtYS5yb3RhdGUgPSByb3RhdGU7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2xjZF9kbWFfYjFfcm90YXRpb24pOworCit2b2lkIG9tYXBfc2V0X2xjZF9kbWFfYjFfbWlycm9yKGludCBtaXJyb3IpCit7CisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRE1BIG1pcnJvciBpcyBub3Qgc3VwcG9ydGVkIGluIDE1MTAgbW9kZVxuIik7CisJCUJVRygpOworCX0KKwlsY2RfZG1hLm1pcnJvciA9IG1pcnJvcjsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9zZXRfbGNkX2RtYV9iMV9taXJyb3IpOworCit2b2lkIG9tYXBfc2V0X2xjZF9kbWFfYjFfdnhyZXModW5zaWduZWQgbG9uZyB2eHJlcykKK3sKKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJETUEgdmlydHVhbCByZXN1bG90aW9uIGlzIG5vdCBzdXBwb3J0ZWQgIgorCQkJCSJpbiAxNTEwIG1vZGVcbiIpOworCQlCVUcoKTsKKwl9CisJbGNkX2RtYS52eHJlcyA9IHZ4cmVzOworfQorRVhQT1JUX1NZTUJPTChvbWFwX3NldF9sY2RfZG1hX2IxX3Z4cmVzKTsKKwordm9pZCBvbWFwX3NldF9sY2RfZG1hX2IxX3NjYWxlKHVuc2lnbmVkIGludCB4c2NhbGUsIHVuc2lnbmVkIGludCB5c2NhbGUpCit7CisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRE1BIHNjYWxlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gMTUxMCBtb2RlXG4iKTsKKwkJQlVHKCk7CisJfQorCWxjZF9kbWEueHNjYWxlID0geHNjYWxlOworCWxjZF9kbWEueXNjYWxlID0geXNjYWxlOworfQorRVhQT1JUX1NZTUJPTChvbWFwX3NldF9sY2RfZG1hX2IxX3NjYWxlKTsKKworc3RhdGljIHZvaWQgc2V0X2IxX3JlZ3Modm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRvcCwgYm90dG9tOworCWludCBlczsKKwl1MTYgdzsKKwl1bnNpZ25lZCBsb25nIGVuLCBmbjsKKwlsb25nIGVpLCBmaTsKKwl1bnNpZ25lZCBsb25nIHZ4cmVzOworCXVuc2lnbmVkIGludCB4c2NhbGUsIHlzY2FsZTsKKworCXN3aXRjaCAobGNkX2RtYS5kYXRhX3R5cGUpIHsKKwljYXNlIE9NQVBfRE1BX0RBVEFfVFlQRV9TODoKKwkJZXMgPSAxOworCQlicmVhazsKKwljYXNlIE9NQVBfRE1BX0RBVEFfVFlQRV9TMTY6CisJCWVzID0gMjsKKwkJYnJlYWs7CisJY2FzZSBPTUFQX0RNQV9EQVRBX1RZUEVfUzMyOgorCQllcyA9IDQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm47CisJfQorCisJdnhyZXMgPSBsY2RfZG1hLnZ4cmVzID8gbGNkX2RtYS52eHJlcyA6IGxjZF9kbWEueHJlczsKKwl4c2NhbGUgPSBsY2RfZG1hLnhzY2FsZSA/IGxjZF9kbWEueHNjYWxlIDogMTsKKwl5c2NhbGUgPSBsY2RfZG1hLnlzY2FsZSA/IGxjZF9kbWEueXNjYWxlIDogMTsKKwlCVUdfT04odnhyZXMgPCBsY2RfZG1hLnhyZXMpOworCisjZGVmaW5lIFBJWEFERFIoeCwgeSkgKGxjZF9kbWEuYWRkciArCQkJCQlcCisJCSgoeSkgKiB2eHJlcyAqIHlzY2FsZSArICh4KSAqIHhzY2FsZSkgKiBlcykKKyNkZWZpbmUgUElYU1RFUChzeCwgc3ksIGR4LCBkeSkgKFBJWEFERFIoZHgsIGR5KSAtIFBJWEFERFIoc3gsIHN5KSAtIGVzICsgMSkKKworCXN3aXRjaCAobGNkX2RtYS5yb3RhdGUpIHsKKwljYXNlIDA6CisJCWlmICghbGNkX2RtYS5taXJyb3IpIHsKKwkJCXRvcCA9IFBJWEFERFIoMCwgMCk7CisJCQlib3R0b20gPSBQSVhBRERSKGxjZF9kbWEueHJlcyAtIDEsIGxjZF9kbWEueXJlcyAtIDEpOworCQkJLyogMTUxMCBETUEgcmVxdWlyZXMgdGhlIGJvdHRvbSBhZGRyZXNzIHRvIGJlIDIgbW9yZQorCQkJICogdGhhbiB0aGUgYWN0dWFsIGxhc3QgbWVtb3J5IGFjY2VzcyBsb2NhdGlvbi4gKi8KKwkJCWlmIChjcHVfaXNfb21hcDE1MTAoKSAmJgorCQkJCWxjZF9kbWEuZGF0YV90eXBlID09IE9NQVBfRE1BX0RBVEFfVFlQRV9TMzIpCisJCQkJCWJvdHRvbSArPSAyOworCQkJZWkgPSBQSVhTVEVQKDAsIDAsIDEsIDApOworCQkJZmkgPSBQSVhTVEVQKGxjZF9kbWEueHJlcyAtIDEsIDAsIDAsIDEpOworCQl9IGVsc2UgeworCQkJdG9wID0gUElYQUREUihsY2RfZG1hLnhyZXMgLSAxLCAwKTsKKwkJCWJvdHRvbSA9IFBJWEFERFIoMCwgbGNkX2RtYS55cmVzIC0gMSk7CisJCQllaSA9IFBJWFNURVAoMSwgMCwgMCwgMCk7CisJCQlmaSA9IFBJWFNURVAoMCwgMCwgbGNkX2RtYS54cmVzIC0gMSwgMSk7CisJCX0KKwkJZW4gPSBsY2RfZG1hLnhyZXM7CisJCWZuID0gbGNkX2RtYS55cmVzOworCQlicmVhazsKKwljYXNlIDkwOgorCQlpZiAoIWxjZF9kbWEubWlycm9yKSB7CisJCQl0b3AgPSBQSVhBRERSKDAsIGxjZF9kbWEueXJlcyAtIDEpOworCQkJYm90dG9tID0gUElYQUREUihsY2RfZG1hLnhyZXMgLSAxLCAwKTsKKwkJCWVpID0gUElYU1RFUCgwLCAxLCAwLCAwKTsKKwkJCWZpID0gUElYU1RFUCgwLCAwLCAxLCBsY2RfZG1hLnlyZXMgLSAxKTsKKwkJfSBlbHNlIHsKKwkJCXRvcCA9IFBJWEFERFIobGNkX2RtYS54cmVzIC0gMSwgbGNkX2RtYS55cmVzIC0gMSk7CisJCQlib3R0b20gPSBQSVhBRERSKDAsIDApOworCQkJZWkgPSBQSVhTVEVQKDAsIDEsIDAsIDApOworCQkJZmkgPSBQSVhTVEVQKDEsIDAsIDAsIGxjZF9kbWEueXJlcyAtIDEpOworCQl9CisJCWVuID0gbGNkX2RtYS55cmVzOworCQlmbiA9IGxjZF9kbWEueHJlczsKKwkJYnJlYWs7CisJY2FzZSAxODA6CisJCWlmICghbGNkX2RtYS5taXJyb3IpIHsKKwkJCXRvcCA9IFBJWEFERFIobGNkX2RtYS54cmVzIC0gMSwgbGNkX2RtYS55cmVzIC0gMSk7CisJCQlib3R0b20gPSBQSVhBRERSKDAsIDApOworCQkJZWkgPSBQSVhTVEVQKDEsIDAsIDAsIDApOworCQkJZmkgPSBQSVhTVEVQKDAsIDEsIGxjZF9kbWEueHJlcyAtIDEsIDApOworCQl9IGVsc2UgeworCQkJdG9wID0gUElYQUREUigwLCBsY2RfZG1hLnlyZXMgLSAxKTsKKwkJCWJvdHRvbSA9IFBJWEFERFIobGNkX2RtYS54cmVzIC0gMSwgMCk7CisJCQllaSA9IFBJWFNURVAoMCwgMCwgMSwgMCk7CisJCQlmaSA9IFBJWFNURVAobGNkX2RtYS54cmVzIC0gMSwgMSwgMCwgMCk7CisJCX0KKwkJZW4gPSBsY2RfZG1hLnhyZXM7CisJCWZuID0gbGNkX2RtYS55cmVzOworCQlicmVhazsKKwljYXNlIDI3MDoKKwkJaWYgKCFsY2RfZG1hLm1pcnJvcikgeworCQkJdG9wID0gUElYQUREUihsY2RfZG1hLnhyZXMgLSAxLCAwKTsKKwkJCWJvdHRvbSA9IFBJWEFERFIoMCwgbGNkX2RtYS55cmVzIC0gMSk7CisJCQllaSA9IFBJWFNURVAoMCwgMCwgMCwgMSk7CisJCQlmaSA9IFBJWFNURVAoMSwgbGNkX2RtYS55cmVzIC0gMSwgMCwgMCk7CisJCX0gZWxzZSB7CisJCQl0b3AgPSBQSVhBRERSKDAsIDApOworCQkJYm90dG9tID0gUElYQUREUihsY2RfZG1hLnhyZXMgLSAxLCBsY2RfZG1hLnlyZXMgLSAxKTsKKwkJCWVpID0gUElYU1RFUCgwLCAwLCAwLCAxKTsKKwkJCWZpID0gUElYU1RFUCgwLCBsY2RfZG1hLnlyZXMgLSAxLCAxLCAwKTsKKwkJfQorCQllbiA9IGxjZF9kbWEueXJlczsKKwkJZm4gPSBsY2RfZG1hLnhyZXM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm47CS8qIFN1cHByZXNzIHdhcm5pbmcgYWJvdXQgdW5pbml0aWFsaXplZCB2YXJzICovCisJfQorCisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCW9tYXBfd3JpdGV3KHRvcCA+PiAxNiwgT01BUDE1MTBfRE1BX0xDRF9UT1BfRjFfVSk7CisJCW9tYXBfd3JpdGV3KHRvcCwgT01BUDE1MTBfRE1BX0xDRF9UT1BfRjFfTCk7CisJCW9tYXBfd3JpdGV3KGJvdHRvbSA+PiAxNiwgT01BUDE1MTBfRE1BX0xDRF9CT1RfRjFfVSk7CisJCW9tYXBfd3JpdGV3KGJvdHRvbSwgT01BUDE1MTBfRE1BX0xDRF9CT1RfRjFfTCk7CisKKwkJcmV0dXJuOworCX0KKworCS8qIDE2MTAgcmVncyAqLworCW9tYXBfd3JpdGV3KHRvcCA+PiAxNiwgT01BUDE2MTBfRE1BX0xDRF9UT1BfQjFfVSk7CisJb21hcF93cml0ZXcodG9wLCBPTUFQMTYxMF9ETUFfTENEX1RPUF9CMV9MKTsKKwlvbWFwX3dyaXRldyhib3R0b20gPj4gMTYsIE9NQVAxNjEwX0RNQV9MQ0RfQk9UX0IxX1UpOworCW9tYXBfd3JpdGV3KGJvdHRvbSwgT01BUDE2MTBfRE1BX0xDRF9CT1RfQjFfTCk7CisKKwlvbWFwX3dyaXRldyhlbiwgT01BUDE2MTBfRE1BX0xDRF9TUkNfRU5fQjEpOworCW9tYXBfd3JpdGV3KGZuLCBPTUFQMTYxMF9ETUFfTENEX1NSQ19GTl9CMSk7CisKKwl3ID0gb21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NTRFApOworCXcgJj0gfjB4MDM7CisJdyB8PSBsY2RfZG1hLmRhdGFfdHlwZTsKKwlvbWFwX3dyaXRldyh3LCBPTUFQMTYxMF9ETUFfTENEX0NTRFApOworCisJdyA9IG9tYXBfcmVhZHcoT01BUDE2MTBfRE1BX0xDRF9DVFJMKTsKKwkvKiBBbHdheXMgc2V0IHRoZSBzb3VyY2UgcG9ydCBhcyBTRFJBTSBmb3Igbm93Ki8KKwl3ICY9IH4oMHgwMyA8PCA2KTsKKwlpZiAobGNkX2RtYS5jYWxsYmFjayAhPSBOVUxMKQorCQl3IHw9IDEgPDwgMTsJCS8qIEJsb2NrIGludGVycnVwdCBlbmFibGUgKi8KKwllbHNlCisJCXcgJj0gfigxIDw8IDEpOworCW9tYXBfd3JpdGV3KHcsIE9NQVAxNjEwX0RNQV9MQ0RfQ1RSTCk7CisKKwlpZiAoIShsY2RfZG1hLnJvdGF0ZSB8fCBsY2RfZG1hLm1pcnJvciB8fAorCSAgICAgIGxjZF9kbWEudnhyZXMgfHwgbGNkX2RtYS54c2NhbGUgfHwgbGNkX2RtYS55c2NhbGUpKQorCQlyZXR1cm47CisKKwl3ID0gb21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NDUik7CisJLyogU2V0IHRoZSBkb3VibGUtaW5kZXhlZCBhZGRyZXNzaW5nIG1vZGUgKi8KKwl3IHw9ICgweDAzIDw8IDEyKTsKKwlvbWFwX3dyaXRldyh3LCBPTUFQMTYxMF9ETUFfTENEX0NDUik7CisKKwlvbWFwX3dyaXRldyhlaSwgT01BUDE2MTBfRE1BX0xDRF9TUkNfRUlfQjEpOworCW9tYXBfd3JpdGV3KGZpID4+IDE2LCBPTUFQMTYxMF9ETUFfTENEX1NSQ19GSV9CMV9VKTsKKwlvbWFwX3dyaXRldyhmaSwgT01BUDE2MTBfRE1BX0xDRF9TUkNfRklfQjFfTCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBsY2RfZG1hX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwl1MTYgdzsKKworCXcgPSBvbWFwX3JlYWR3KE9NQVAxNjEwX0RNQV9MQ0RfQ1RSTCk7CisJaWYgKHVubGlrZWx5KCEodyAmICgxIDw8IDMpKSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiU3B1cmlvdXMgTENEIERNQSBJUlFcbiIpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCS8qIEFjayB0aGUgSVJRICovCisJdyB8PSAoMSA8PCAzKTsKKwlvbWFwX3dyaXRldyh3LCBPTUFQMTYxMF9ETUFfTENEX0NUUkwpOworCWxjZF9kbWEuYWN0aXZlID0gMDsKKwlpZiAobGNkX2RtYS5jYWxsYmFjayAhPSBOVUxMKQorCQlsY2RfZG1hLmNhbGxiYWNrKHcsIGxjZF9kbWEuY2JfZGF0YSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK2ludCBvbWFwX3JlcXVlc3RfbGNkX2RtYSh2b2lkICgqY2FsbGJhY2spKHUxNiBzdGF0dXMsIHZvaWQgKmRhdGEpLAorCQkJIHZvaWQgKmRhdGEpCit7CisJc3Bpbl9sb2NrX2lycSgmbGNkX2RtYS5sb2NrKTsKKwlpZiAobGNkX2RtYS5yZXNlcnZlZCkgeworCQlzcGluX3VubG9ja19pcnEoJmxjZF9kbWEubG9jayk7CisJCXByaW50ayhLRVJOX0VSUiAiTENEIERNQSBjaGFubmVsIGFscmVhZHkgcmVzZXJ2ZWRcbiIpOworCQlCVUcoKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJbGNkX2RtYS5yZXNlcnZlZCA9IDE7CisJc3Bpbl91bmxvY2tfaXJxKCZsY2RfZG1hLmxvY2spOworCWxjZF9kbWEuY2FsbGJhY2sgPSBjYWxsYmFjazsKKwlsY2RfZG1hLmNiX2RhdGEgPSBkYXRhOworCWxjZF9kbWEuYWN0aXZlID0gMDsKKwlsY2RfZG1hLnNpbmdsZV90cmFuc2ZlciA9IDA7CisJbGNkX2RtYS5yb3RhdGUgPSAwOworCWxjZF9kbWEudnhyZXMgPSAwOworCWxjZF9kbWEubWlycm9yID0gMDsKKwlsY2RfZG1hLnhzY2FsZSA9IDA7CisJbGNkX2RtYS55c2NhbGUgPSAwOworCWxjZF9kbWEuZXh0X2N0cmwgPSAwOworCWxjZF9kbWEuc3JjX3BvcnQgPSAwOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfcmVxdWVzdF9sY2RfZG1hKTsKKwordm9pZCBvbWFwX2ZyZWVfbGNkX2RtYSh2b2lkKQoreworCXNwaW5fbG9jaygmbGNkX2RtYS5sb2NrKTsKKwlpZiAoIWxjZF9kbWEucmVzZXJ2ZWQpIHsKKwkJc3Bpbl91bmxvY2soJmxjZF9kbWEubG9jayk7CisJCXByaW50ayhLRVJOX0VSUiAiTENEIERNQSBpcyBub3QgcmVzZXJ2ZWRcbiIpOworCQlCVUcoKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIWNwdV9pc19vbWFwMTUxMCgpKQorCQlvbWFwX3dyaXRldyhvbWFwX3JlYWR3KE9NQVAxNjEwX0RNQV9MQ0RfQ0NSKSAmIH4xLAorCQkJICAgIE9NQVAxNjEwX0RNQV9MQ0RfQ0NSKTsKKwlsY2RfZG1hLnJlc2VydmVkID0gMDsKKwlzcGluX3VubG9jaygmbGNkX2RtYS5sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9mcmVlX2xjZF9kbWEpOworCit2b2lkIG9tYXBfZW5hYmxlX2xjZF9kbWEodm9pZCkKK3sKKwl1MTYgdzsKKworCS8qCisJICogU2V0IHRoZSBFbmFibGUgYml0IG9ubHkgaWYgYW4gZXh0ZXJuYWwgY29udHJvbGxlciBpcworCSAqIGNvbm5lY3RlZC4gT3RoZXJ3aXNlIHRoZSBPTUFQIGludGVybmFsIGNvbnRyb2xsZXIgd2lsbAorCSAqIHN0YXJ0IHRoZSB0cmFuc2ZlciB3aGVuIGl0IGdldHMgZW5hYmxlZC4KKwkgKi8KKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkgfHwgIWxjZF9kbWEuZXh0X2N0cmwpCisJCXJldHVybjsKKworCXcgPSBvbWFwX3JlYWR3KE9NQVAxNjEwX0RNQV9MQ0RfQ1RSTCk7CisJdyB8PSAxIDw8IDg7CisJb21hcF93cml0ZXcodywgT01BUDE2MTBfRE1BX0xDRF9DVFJMKTsKKworCWxjZF9kbWEuYWN0aXZlID0gMTsKKworCXcgPSBvbWFwX3JlYWR3KE9NQVAxNjEwX0RNQV9MQ0RfQ0NSKTsKKwl3IHw9IDEgPDwgNzsKKwlvbWFwX3dyaXRldyh3LCBPTUFQMTYxMF9ETUFfTENEX0NDUik7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfZW5hYmxlX2xjZF9kbWEpOworCit2b2lkIG9tYXBfc2V0dXBfbGNkX2RtYSh2b2lkKQoreworCUJVR19PTihsY2RfZG1hLmFjdGl2ZSk7CisJaWYgKCFjcHVfaXNfb21hcDE1MTAoKSkgeworCQkvKiBTZXQgc29tZSByZWFzb25hYmxlIGRlZmF1bHRzICovCisJCW9tYXBfd3JpdGV3KDB4NTQ0MCwgT01BUDE2MTBfRE1BX0xDRF9DQ1IpOworCQlvbWFwX3dyaXRldygweDkxMDIsIE9NQVAxNjEwX0RNQV9MQ0RfQ1NEUCk7CisJCW9tYXBfd3JpdGV3KDB4MDAwNCwgT01BUDE2MTBfRE1BX0xDRF9MQ0hfQ1RSTCk7CisJfQorCXNldF9iMV9yZWdzKCk7CisJaWYgKCFjcHVfaXNfb21hcDE1MTAoKSkgeworCQl1MTYgdzsKKworCQl3ID0gb21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NDUik7CisJCS8qCisJCSAqIElmIERNQSB3YXMgYWxyZWFkeSBhY3RpdmUgc2V0IHRoZSBlbmRfcHJvZyBiaXQgdG8gaGF2ZQorCQkgKiB0aGUgcHJvZ3JhbW1lZCByZWdpc3RlciBzZXQgbG9hZGVkIGludG8gdGhlIGFjdGl2ZQorCQkgKiByZWdpc3RlciBzZXQuCisJCSAqLworCQl3IHw9IDEgPDwgMTE7CQkvKiBFbmRfcHJvZyAqLworCQlpZiAoIWxjZF9kbWEuc2luZ2xlX3RyYW5zZmVyKQorCQkJdyB8PSAoMyA8PCA4KTsJLyogQXV0b19pbml0LCByZXBlYXQgKi8KKwkJb21hcF93cml0ZXcodywgT01BUDE2MTBfRE1BX0xDRF9DQ1IpOworCX0KK30KK0VYUE9SVF9TWU1CT0wob21hcF9zZXR1cF9sY2RfZG1hKTsKKwordm9pZCBvbWFwX3N0b3BfbGNkX2RtYSh2b2lkKQoreworCXUxNiB3OworCisJbGNkX2RtYS5hY3RpdmUgPSAwOworCWlmIChjcHVfaXNfb21hcDE1MTAoKSB8fCAhbGNkX2RtYS5leHRfY3RybCkKKwkJcmV0dXJuOworCisJdyA9IG9tYXBfcmVhZHcoT01BUDE2MTBfRE1BX0xDRF9DQ1IpOworCXcgJj0gfigxIDw8IDcpOworCW9tYXBfd3JpdGV3KHcsIE9NQVAxNjEwX0RNQV9MQ0RfQ0NSKTsKKworCXcgPSBvbWFwX3JlYWR3KE9NQVAxNjEwX0RNQV9MQ0RfQ1RSTCk7CisJdyAmPSB+KDEgPDwgOCk7CisJb21hcF93cml0ZXcodywgT01BUDE2MTBfRE1BX0xDRF9DVFJMKTsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9zdG9wX2xjZF9kbWEpOworCitzdGF0aWMgaW50IF9faW5pdCBvbWFwX2luaXRfbGNkX2RtYSh2b2lkKQoreworCWludCByOworCisJaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7CisJCXUxNiB3OworCisJCS8qIHRoaXMgd291bGQgcHJldmVudCBPTUFQIHNsZWVwICovCisJCXcgPSBvbWFwX3JlYWR3KE9NQVAxNjEwX0RNQV9MQ0RfQ1RSTCk7CisJCXcgJj0gfigxIDw8IDgpOworCQlvbWFwX3dyaXRldyh3LCBPTUFQMTYxMF9ETUFfTENEX0NUUkwpOworCX0KKworCXNwaW5fbG9ja19pbml0KCZsY2RfZG1hLmxvY2spOworCisJciA9IHJlcXVlc3RfaXJxKElOVF9ETUFfTENELCBsY2RfZG1hX2lycV9oYW5kbGVyLCAwLAorCQkJIkxDRCBETUEiLCBOVUxMKTsKKwlpZiAociAhPSAwKQorCQlwcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byByZXF1ZXN0IElSUSBmb3IgTENEIERNQSAiCisJCQkgICAgICAgIihlcnJvciAlZClcbiIsIHIpOworCisJcmV0dXJuIHI7Cit9CisKK2FyY2hfaW5pdGNhbGwob21hcF9pbml0X2xjZF9kbWEpOworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL211eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9tdXguYwppbmRleCA3ODUzNzFlLi4wNzIxMmNjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL211eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbXV4LmMKQEAgLTUwLDEyICs1MCwxOCBAQAogCiBNVVhfQ0ZHXzdYWCgiQUExN183WFhfVVNCX0RNIiwgICAgIDIsICAgMjEsICAgIDAsICAgMjAsICAgMCwgMCkKIE1VWF9DRkdfN1hYKCJXMTZfN1hYX1VTQl9QVV9FTiIsICAgMiwgICAyNSwgICAgMCwgICAyNCwgICAwLCAwKQotTVVYX0NGR183WFgoIlcxN183WFhfVVNCX1ZCVVNJIiwgICAyLCAgIDI5LCAgICAwLCAgIDI4LCAgIDAsIDApCitNVVhfQ0ZHXzdYWCgiVzE3XzdYWF9VU0JfVkJVU0kiLCAgIDIsICAgMjksICAgIDYsICAgMjgsICAgMSwgMCkKK01VWF9DRkdfN1hYKCJXMThfN1hYX1VTQl9ETUNLX09VVCIsMywgICAgMywgICAgMSwgICAgMiwgICAwLCAwKQorTVVYX0NGR183WFgoIlcxOV83WFhfVVNCX0RDUlNUIiwgICAzLCAgICA3LCAgICAxLCAgICA2LCAgIDAsIDApCiAKIC8qIE1NQyBQaW5zICovCiBNVVhfQ0ZHXzdYWCgiTU1DXzdYWF9DTUQiLCAgICAgICAgIDIsICAgIDksICAgIDAsICAgIDgsICAgMSwgMCkKIE1VWF9DRkdfN1hYKCJNTUNfN1hYX0NMSyIsICAgICAgICAgMiwgICAxMywgICAgMCwgICAxMiwgICAxLCAwKQogTVVYX0NGR183WFgoIk1NQ183WFhfREFUMCIsICAgICAgICAyLCAgIDE3LCAgICAwLCAgIDE2LCAgIDEsIDApCisKKy8qIEkyQyBpbnRlcmZhY2UgKi8KK01VWF9DRkdfN1hYKCJJMkNfN1hYX1NDTCIsICAgICAgICAgNSwgICAgMSwgICAgMCwgICAgMCwgICAxLCAwKQorTVVYX0NGR183WFgoIkkyQ183WFhfU0RBIiwgICAgICAgICA1LCAgICA1LCAgICAwLCAgICAwLCAgIDEsIDApCiB9OwogI2RlZmluZSBPTUFQN1hYX1BJTlNfU1oJCUFSUkFZX1NJWkUob21hcDd4eF9waW5zKQogI2Vsc2UKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvb3BwLmggYi9hcmNoL2FybS9tYWNoLW9tYXAxL29wcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MDc0ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL29wcC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwMS9vcHAuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgLSAyMDA1IE5va2lhIGNvcnBvcmF0aW9uCisgKiAgV3JpdHRlbiBieSBUdXVra2EgVGlra2FuZW4gPHR1dWtrYS50aWtrYW5lbkBlbGVrdHJvYml0LmNvbT4KKyAqICBCYXNlZCBvbiBjbG9ja3MuaCBieSBUb255IExpbmRncmVuLCBHb3Jkb24gTWNOdXR0IGFuZCBSaWRnZVJ1biwgSW5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fQVJDSF9BUk1fTUFDSF9PTUFQMV9PUFBfSAorI2RlZmluZSBfX0FSQ0hfQVJNX01BQ0hfT01BUDFfT1BQX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBtcHVfcmF0ZSB7CisJdW5zaWduZWQgbG9uZwkJcmF0ZTsKKwl1bnNpZ25lZCBsb25nCQl4dGFsOworCXVuc2lnbmVkIGxvbmcJCXBsbF9yYXRlOworCV9fdTE2CQkJY2tjdGxfdmFsOworCV9fdTE2CQkJZHBsbGN0bF92YWw7Cit9OworCitleHRlcm4gc3RydWN0IG1wdV9yYXRlIG9tYXAxX3JhdGVfdGFibGVbXTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL29wcF9kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL29wcF9kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVhNTQ2NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvb3BwX2RhdGEuYwpAQCAtMCwwICsxLDU5IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDEvb3BwX2RhdGEuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgLSAyMDA1IE5va2lhIGNvcnBvcmF0aW9uCisgKiAgV3JpdHRlbiBieSBUdXVra2EgVGlra2FuZW4gPHR1dWtrYS50aWtrYW5lbkBlbGVrdHJvYml0LmNvbT4KKyAqICBCYXNlZCBvbiBjbG9ja3MuaCBieSBUb255IExpbmRncmVuLCBHb3Jkb24gTWNOdXR0IGFuZCBSaWRnZVJ1biwgSW5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSAib3BwLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogT21hcDEgTVBVIHJhdGUgdGFibGUKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdHJ1Y3QgbXB1X3JhdGUgb21hcDFfcmF0ZV90YWJsZVtdID0geworCS8qIE1QVSBNSHosIHh0YWwgTUh6LCBkcGxsMSBNSHosIENLQ1RMLCBEUExMX0NUTAorCSAqIE5PVEU6IENvbW1lbnQgb3JkZXIgaGVyZSBpcyBkaWZmZXJlbnQgZnJvbSBiaXRzIGluIENLQ1RMIHZhbHVlOgorCSAqIGFybWRpdiwgZHNwZGl2LCBkc3BtbXUsIHRjZGl2LCBwZXJkaXYsIGxjZGRpdgorCSAqLworI2lmIGRlZmluZWQoQ09ORklHX09NQVBfQVJNXzIxNk1IWikKKwl7IDIxNjAwMDAwMCwgMTIwMDAwMDAsIDIxNjAwMDAwMCwgMHgwNTBkLCAweDI5MTAgfSwgLyogMS8xLzIvMi8yLzggKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX09NQVBfQVJNXzE5NU1IWikKKwl7IDE5NTAwMDAwMCwgMTMwMDAwMDAsIDE5NTAwMDAwMCwgMHgwNTBlLCAweDI3OTAgfSwgLyogMS8xLzIvMi80LzggKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX09NQVBfQVJNXzE5Mk1IWikKKwl7IDE5MjAwMDAwMCwgMTkyMDAwMDAsIDE5MjAwMDAwMCwgMHgwNTBmLCAweDI1MTAgfSwgLyogMS8xLzIvMi84LzggKi8KKwl7IDE5MjAwMDAwMCwgMTIwMDAwMDAsIDE5MjAwMDAwMCwgMHgwNTBmLCAweDI4MTAgfSwgLyogMS8xLzIvMi84LzggKi8KKwl7ICA5NjAwMDAwMCwgMTIwMDAwMDAsIDE5MjAwMDAwMCwgMHgwNTVmLCAweDI4MTAgfSwgLyogMi8yLzIvMi84LzggKi8KKwl7ICA0ODAwMDAwMCwgMTIwMDAwMDAsIDE5MjAwMDAwMCwgMHgwYmFmLCAweDI4MTAgfSwgLyogNC80LzQvOC84LzggKi8KKwl7ICAyNDAwMDAwMCwgMTIwMDAwMDAsIDE5MjAwMDAwMCwgMHgwZmZmLCAweDI4MTAgfSwgLyogOC84LzgvOC84LzggKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX09NQVBfQVJNXzE4Mk1IWikKKwl7IDE4MjAwMDAwMCwgMTMwMDAwMDAsIDE4MjAwMDAwMCwgMHgwNTBlLCAweDI3MTAgfSwgLyogMS8xLzIvMi80LzggKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX09NQVBfQVJNXzE2OE1IWikKKwl7IDE2ODAwMDAwMCwgMTIwMDAwMDAsIDE2ODAwMDAwMCwgMHgwMTBmLCAweDI3MTAgfSwgLyogMS8xLzEvMi84LzggKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX09NQVBfQVJNXzE1ME1IWikKKwl7IDE1MDAwMDAwMCwgMTIwMDAwMDAsIDE1MDAwMDAwMCwgMHgwMTBhLCAweDJjYjAgfSwgLyogMS8xLzEvMi80LzQgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX09NQVBfQVJNXzEyME1IWikKKwl7IDEyMDAwMDAwMCwgMTIwMDAwMDAsIDEyMDAwMDAwMCwgMHgwMTBhLCAweDI1MTAgfSwgLyogMS8xLzEvMi80LzQgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX09NQVBfQVJNXzk2TUhaKQorCXsgIDk2MDAwMDAwLCAxMjAwMDAwMCwgIDk2MDAwMDAwLCAweDAwMDUsIDB4MjQxMCB9LCAvKiAxLzEvMS8xLzIvMiAqLworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfT01BUF9BUk1fNjBNSFopCisJeyAgNjAwMDAwMDAsIDEyMDAwMDAwLCAgNjAwMDAwMDAsIDB4MDAwNSwgMHgyMjkwIH0sIC8qIDEvMS8xLzEvMi8yICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQX0FSTV8zME1IWikKKwl7ICAzMDAwMDAwMCwgMTIwMDAwMDAsICA2MDAwMDAwMCwgMHgwNTU1LCAweDIyOTAgfSwgLyogMi8yLzIvMi8yLzIgKi8KKyNlbmRpZgorCXsgMCwgMCwgMCwgMCwgMCB9LAorfTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9LY29uZmlnCmluZGV4IDczMDlhYWIuLjc2YzExZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL0tjb25maWcKQEAgLTI0LDYgKzI0LDE4IEBACiAJZGVwZW5kcyBvbiBBUkNIX09NQVAzICYmIEFSQ0hfT01BUDM0WFgKIAlzZWxlY3QgQVJDSF9PTUFQX09URwogCitjb25maWcgT01BUF9QQUNLQUdFX0NCQworICAgICAgIGJvb2wKKworY29uZmlnIE9NQVBfUEFDS0FHRV9DQkIKKyAgICAgICBib29sCisKK2NvbmZpZyBPTUFQX1BBQ0tBR0VfQ1VTCisgICAgICAgYm9vbAorCitjb25maWcgT01BUF9QQUNLQUdFX0NCUAorICAgICAgIGJvb2wKKwogY29tbWVudCAiT01BUCBCb2FyZCBUeXBlIgogCWRlcGVuZHMgb24gQVJDSF9PTUFQMiB8fCBBUkNIX09NQVAzIHx8IEFSQ0hfT01BUDQKIApAQCAtNTIsMTQgKzY0LDE3IEBACiBjb25maWcgTUFDSF9PTUFQM19CRUFHTEUKIAlib29sICJPTUFQMyBCRUFHTEUgYm9hcmQiCiAJZGVwZW5kcyBvbiBBUkNIX09NQVAzICYmIEFSQ0hfT01BUDM0WFgKKwlzZWxlY3QgT01BUF9QQUNLQUdFX0NCQgogCiBjb25maWcgTUFDSF9PTUFQX0xEUAogCWJvb2wgIk9NQVAzIExEUCBib2FyZCIKIAlkZXBlbmRzIG9uIEFSQ0hfT01BUDMgJiYgQVJDSF9PTUFQMzRYWAorCXNlbGVjdCBPTUFQX1BBQ0tBR0VfQ0JCCiAKIGNvbmZpZyBNQUNIX09WRVJPCiAJYm9vbCAiR3Vtc3RpeCBPdmVybyBib2FyZCIKIAlkZXBlbmRzIG9uIEFSQ0hfT01BUDMgJiYgQVJDSF9PTUFQMzRYWAorCXNlbGVjdCBPTUFQX1BBQ0tBR0VfQ0JCCiAKIGNvbmZpZyBNQUNIX09NQVAzRVZNCiAJYm9vbCAiT01BUCAzNTMwIEVWTSBib2FyZCIKQEAgLTY4LDE0ICs4MywyMiBAQAogY29uZmlnIE1BQ0hfT01BUDM1MTdFVk0KIAlib29sICJPTUFQMzUxNy8gQU0zNTE3IEVWTSBib2FyZCIKIAlkZXBlbmRzIG9uIEFSQ0hfT01BUDMgJiYgQVJDSF9PTUFQMzRYWAorCXNlbGVjdCBPTUFQX1BBQ0tBR0VfQ0JCCiAKIGNvbmZpZyBNQUNIX09NQVAzX1BBTkRPUkEKIAlib29sICJPTUFQMyBQYW5kb3JhIgogCWRlcGVuZHMgb24gQVJDSF9PTUFQMyAmJiBBUkNIX09NQVAzNFhYCisJc2VsZWN0IE9NQVBfUEFDS0FHRV9DQkIKKworY29uZmlnIE1BQ0hfT01BUDNfVE9VQ0hCT09LCisJYm9vbCAiT01BUDMgVG91Y2ggQm9vayIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDMgJiYgQVJDSF9PTUFQMzRYWAorCXNlbGVjdCBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCiAKIGNvbmZpZyBNQUNIX09NQVBfMzQzMFNEUAogCWJvb2wgIk9NQVAgMzQzMCBTRFAgYm9hcmQiCiAJZGVwZW5kcyBvbiBBUkNIX09NQVAzICYmIEFSQ0hfT01BUDM0WFgKKwlzZWxlY3QgT01BUF9QQUNLQUdFX0NCQgogCiBjb25maWcgTUFDSF9OT0tJQV9OODAwCiAgICAgICAgYm9vbApAQCAtOTYsMjYgKzExOSwzMyBAQAogY29uZmlnIE1BQ0hfTk9LSUFfUlg1MQogCWJvb2wgIk5va2lhIFJYLTUxIGJvYXJkIgogCWRlcGVuZHMgb24gQVJDSF9PTUFQMyAmJiBBUkNIX09NQVAzNFhYCisJc2VsZWN0IE9NQVBfUEFDS0FHRV9DQkIKIAogY29uZmlnIE1BQ0hfT01BUF9aT09NMgogCWJvb2wgIk9NQVAzIFpvb20yIGJvYXJkIgogCWRlcGVuZHMgb24gQVJDSF9PTUFQMyAmJiBBUkNIX09NQVAzNFhYCisJc2VsZWN0IE9NQVBfUEFDS0FHRV9DQkIKIAogY29uZmlnIE1BQ0hfT01BUF9aT09NMwogCWJvb2wgIk9NQVAzNjMwIFpvb20zIGJvYXJkIgogCWRlcGVuZHMgb24gQVJDSF9PTUFQMyAmJiBBUkNIX09NQVAzNFhYCisJc2VsZWN0IE9NQVBfUEFDS0FHRV9DQlAKIAogY29uZmlnIE1BQ0hfQ01fVDM1CiAJYm9vbCAiQ29tcHVMYWIgQ00tVDM1IG1vZHVsZSIKIAlkZXBlbmRzIG9uIEFSQ0hfT01BUDMgJiYgQVJDSF9PTUFQMzRYWAorCXNlbGVjdCBPTUFQX1BBQ0tBR0VfQ1VTCisJc2VsZWN0IE9NQVBfTVVYCiAKIGNvbmZpZyBNQUNIX0lHRVAwMDIwCiAJYm9vbCAiSUdFUDAwMjAiCiAJZGVwZW5kcyBvbiBBUkNIX09NQVAzICYmIEFSQ0hfT01BUDM0WFgKKwlzZWxlY3QgT01BUF9QQUNLQUdFX0NCQgogCiBjb25maWcgTUFDSF9PTUFQXzM2MzBTRFAKIAlib29sICJPTUFQMzYzMCBTRFAgYm9hcmQiCiAJZGVwZW5kcyBvbiBBUkNIX09NQVAzICYmIEFSQ0hfT01BUDM0WFgKKwlzZWxlY3QgT01BUF9QQUNLQUdFX0NCUAogCiBjb25maWcgTUFDSF9PTUFQXzQ0MzBTRFAKIAlib29sICJPTUFQIDQ0MzAgU0RQIGJvYXJkIgpAQCAtMTI4LDMgKzE1OCwxNSBAQAogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIGRlYnVnZ2luZyBoYXJkd2FyZSBvZiBvbWFwMwogCitjb25maWcgT01BUDNfU0RSQ19BQ19USU1JTkcKKwlib29sICJFbmFibGUgU0RSQyBBQyB0aW1pbmcgcmVnaXN0ZXIgY2hhbmdlcyIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDMgJiYgQVJDSF9PTUFQMzRYWAorCWRlZmF1bHQgbgorCWhlbHAKKwkgIElmIHlvdSBrbm93IHRoYXQgbm9uZSBvZiB5b3VyIHN5c3RlbSBpbml0aWF0b3JzIHdpbGwgYXR0ZW1wdCB0bworCSAgYWNjZXNzIFNEUkFNIGR1cmluZyBDT1JFIERWRlMsIHNlbGVjdCBZIGhlcmUuICBUaGlzIHNob3VsZCBib29zdAorCSAgU0RSQU0gcGVyZm9ybWFuY2UgYXQgbG93ZXIgQ09SRSBPUFBzLiAgVGhlcmUgYXJlIHJlbGF0aXZlbHkgZmV3CisJICB1c2VycyB3aG8gd2lsbCB3aXNoIHRvIHNheSB5ZXMgYXQgdGhpcyBwb2ludCAtIGFsbW9zdCBldmVyeW9uZSB3aWxsCisJICB3aXNoIHRvIHNheSBuby4gIFNlbGVjdGluZyB5ZXMgd2l0aG91dCB1bmRlcnN0YW5kaW5nIHdoYXQgaXMKKwkgIGdvaW5nIG9uIGNvdWxkIHJlc3VsdCBpbiBzeXN0ZW0gY3Jhc2hlczsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtb21hcDIvTWFrZWZpbGUKaW5kZXggMzI1NDhhNC4uYjMyNjc4YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL01ha2VmaWxlCkBAIC02LDExICs2LDE0IEBACiBvYmoteSA6PSBpZC5vIGlvLm8gY29udHJvbC5vIG11eC5vIGRldmljZXMubyBzZXJpYWwubyBncG1jLm8gdGltZXItZ3AubwogCiBvbWFwLTItMy1jb21tb24JCQkJPSBpcnEubyBzZHJjLm8gb21hcF9od21vZC5vCitvbWFwLTMtNC1jb21tb24JCQkJPSBkcGxsLm8KIHByY20tY29tbW9uCQkJCT0gcHJjbS5vIHBvd2VyZG9tYWluLm8KLWNsb2NrLWNvbW1vbgkJCQk9IGNsb2NrLm8gY2xvY2tkb21haW4ubworY2xvY2stY29tbW9uCQkJCT0gY2xvY2subyBjbG9ja19jb21tb25fZGF0YS5vIGNsb2NrZG9tYWluLm8KIAogb2JqLSQoQ09ORklHX0FSQ0hfT01BUDIpICs9ICQob21hcC0yLTMtY29tbW9uKSAkKHByY20tY29tbW9uKSAkKGNsb2NrLWNvbW1vbikKLW9iai0kKENPTkZJR19BUkNIX09NQVAzKSArPSAkKG9tYXAtMi0zLWNvbW1vbikgJChwcmNtLWNvbW1vbikgJChjbG9jay1jb21tb24pCitvYmotJChDT05GSUdfQVJDSF9PTUFQMykgKz0gJChvbWFwLTItMy1jb21tb24pICQocHJjbS1jb21tb24pICQoY2xvY2stY29tbW9uKSBcCisJCQkgICAgJChvbWFwLTMtNC1jb21tb24pCitvYmotJChDT05GSUdfQVJDSF9PTUFQNCkgKz0gJChvbWFwLTMtNC1jb21tb24pIHByY20ubyBjbG9jay5vCiAKIG9iai0kKENPTkZJR19PTUFQX01DQlNQKSArPSBtY2JzcC5vCiAKQEAgLTIzLDYgKzI2LDkgQEAKIG9iai0kKENPTkZJR19BUkNIX09NQVAyNDMwKQkJKz0gc3JhbTI0M3gubwogb2JqLSQoQ09ORklHX0FSQ0hfT01BUDMpCQkrPSBzcmFtMzR4eC5vCiAKKyMgUGluIG11bHRpcGxleGluZworb2JqLSQoQ09ORklHX0FSQ0hfT01BUDMpCQkrPSBtdXgzNHh4Lm8KKwogIyBTTVMvU0RSQwogb2JqLSQoQ09ORklHX0FSQ0hfT01BUDIpCQkrPSBzZHJjMnh4eC5vCiAjIG9iai0kKENPTkZJR19BUkNIX09NQVAzKQkJKz0gc2RyYzN4eHgubwpAQCAtNDEsOCArNDcsMTEgQEAKIG9iai0kKENPTkZJR19BUkNIX09NQVA0KQkJKz0gY200eHh4Lm8KIAogIyBDbG9jayBmcmFtZXdvcmsKLW9iai0kKENPTkZJR19BUkNIX09NQVAyKQkJKz0gY2xvY2syNHh4Lm8KLW9iai0kKENPTkZJR19BUkNIX09NQVAzKQkJKz0gY2xvY2szNHh4Lm8KK29iai0kKENPTkZJR19BUkNIX09NQVAyKQkJKz0gY2xvY2syeHh4Lm8gY2xvY2syeHh4X2RhdGEubworb2JqLSQoQ09ORklHX0FSQ0hfT01BUDI0MjApCQkrPSBvcHAyNDIwX2RhdGEubworb2JqLSQoQ09ORklHX0FSQ0hfT01BUDMpCQkrPSBjbG9jazM0eHgubyBjbG9jazM0eHhfZGF0YS5vCitvYmotJChDT05GSUdfQVJDSF9PTUFQMjQzMCkJCSs9IG9wcDI0MzBfZGF0YS5vCitvYmotJChDT05GSUdfQVJDSF9PTUFQNCkJCSs9IGNsb2NrNDR4eC5vIGNsb2NrNDR4eF9kYXRhLm8KIAogIyBFTVUgcGVyaXBoZXJhbHMKIG9iai0kKENPTkZJR19PTUFQM19FTVUpCQkrPSBlbXUubwpAQCAtNTUsNiArNjQsOSBAQAogCiBvYmotJChDT05GSUdfT01BUF9JT01NVSkJCSs9ICQoaW9tbXUteSkKIAoraTJjLW9tYXAtJChDT05GSUdfSTJDX09NQVApCQk6PSBpMmMubworb2JqLXkJCQkJCSs9ICQoaTJjLW9tYXAtbSkgJChpMmMtb21hcC15KQorCiAjIFNwZWNpZmljIGJvYXJkIHN1cHBvcnQKIG9iai0kKENPTkZJR19NQUNIX09NQVBfR0VORVJJQykJCSs9IGJvYXJkLWdlbmVyaWMubwogb2JqLSQoQ09ORklHX01BQ0hfT01BUF9INCkJCSs9IGJvYXJkLWg0Lm8KQEAgLTkzLDcgKzEwNSw4IEBACiAJCQkJCSAgIG1tYy10d2w0MDMwLm8KIG9iai0kKENPTkZJR19NQUNIX0lHRVAwMDIwKQkJKz0gYm9hcmQtaWdlcDAwMjAubyBcCiAJCQkJCSAgIG1tYy10d2w0MDMwLm8KLQorb2JqLSQoQ09ORklHX01BQ0hfT01BUDNfVE9VQ0hCT09LKQkrPSBib2FyZC1vbWFwM3RvdWNoYm9vay5vIFwKKwkJCQkJICAgbW1jLXR3bDQwMzAubwogb2JqLSQoQ09ORklHX01BQ0hfT01BUF80NDMwU0RQKQkJKz0gYm9hcmQtNDQzMHNkcC5vCiAKIG9iai0kKENPTkZJR19NQUNIX09NQVAzNTE3RVZNKSAgICAgKz0gYm9hcmQtYW0zNTE3ZXZtLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMjQzMHNkcC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0yNDMwc2RwLmMKaW5kZXggZGI5Mzc0Yi4uZTUwODkwNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0yNDMwc2RwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0yNDMwc2RwLmMKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy90d2w0MDMwLmg+CisjaW5jbHVkZSA8bGludXgvaTJjL3R3bC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTM0MzBzZHAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMzQzMHNkcC5jCmluZGV4IDViZGE5ZmQuLmM5MGIwZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMzQzMHNkcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMzQzMHNkcC5jCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5wdXQvbWF0cml4X2tleXBhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvYWRzNzg0Ni5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy90d2w0MDMwLmg+CisjaW5jbHVkZSA8bGludXgvaTJjL3R3bC5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CkBAIC0zMSw3ICszMSw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAKICNpbmNsdWRlIDxwbGF0L21jc3BpLmg+Ci0jaW5jbHVkZSA8cGxhdC9tdXguaD4KICNpbmNsdWRlIDxwbGF0L2JvYXJkLmg+CiAjaW5jbHVkZSA8cGxhdC91c2IuaD4KICNpbmNsdWRlIDxwbGF0L2NvbW1vbi5oPgpAQCAtNDIsNiArNDEsNyBAQAogI2luY2x1ZGUgPHBsYXQvY29udHJvbC5oPgogI2luY2x1ZGUgPHBsYXQvZ3BtYy1zbWM5MXguaD4KIAorI2luY2x1ZGUgIm11eC5oIgogI2luY2x1ZGUgInNkcmFtLXFpbW9uZGEtaHliMThtNTEyMTYwYWYtNi5oIgogI2luY2x1ZGUgIm1tYy10d2w0MDMwLmgiCiAKQEAgLTYyNSw3ICs2MjUsOSBAQAogCiBzdGF0aWMgdm9pZCBlbmFibGVfYm9hcmRfd2FrZXVwX3NvdXJjZSh2b2lkKQogewotCW9tYXBfY2ZnX3JlZyhBRjI2XzM0WFhfU1lTX05JUlEpOyAvKiBUMiBpbnRlcnJ1cHQgbGluZSAoa2V5cGFkKSAqLworCS8qIFQyIGludGVycnVwdCBsaW5lIChrZXlwYWQpICovCisJb21hcF9tdXhfaW5pdF9zaWduYWwoInN5c19uaXJxIiwKKwkJT01BUF9XQUtFVVBfRU4gfCBPTUFQX1BJTl9JTlBVVF9QVUxMVVApOwogfQogCiBzdGF0aWMgc3RydWN0IGVoY2lfaGNkX29tYXBfcGxhdGZvcm1fZGF0YSBlaGNpX3BkYXRhIF9faW5pdGNvbnN0ID0gewpAQCAtNjQwLDggKzY0MiwxNyBAQAogCS5yZXNldF9ncGlvX3BvcnRbMl0gID0gLUVJTlZBTAogfTsKIAorI2lmZGVmIENPTkZJR19PTUFQX01VWAorc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX211eCBib2FyZF9tdXhbXSBfX2luaXRkYXRhID0geworCXsgLnJlZ19vZmZzZXQgPSBPTUFQX01VWF9URVJNSU5BVE9SIH0sCit9OworI2Vsc2UKKyNkZWZpbmUgYm9hcmRfbXV4CU5VTEwKKyNlbmRpZgorCiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcF8zNDMwc2RwX2luaXQodm9pZCkKIHsKKwlvbWFwM19tdXhfaW5pdChib2FyZF9tdXgsIE9NQVBfUEFDS0FHRV9DQkIpOwogCW9tYXAzNDMwX2kyY19pbml0KCk7CiAJcGxhdGZvcm1fYWRkX2RldmljZXMoc2RwMzQzMF9kZXZpY2VzLCBBUlJBWV9TSVpFKHNkcDM0MzBfZGV2aWNlcykpOwogCWlmIChvbWFwX3JldigpID4gT01BUDM0MzBfUkVWX0VTMV8wKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0zNjMwc2RwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTM2MzBzZHAuYwppbmRleCAzNDhiNzBiLi43MzkwNTk2IDEwMDc1NQotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTM2MzBzZHAuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTM2MzBzZHAuYwpAQCAtMjMsNiArMjMsNyBAQAogCiAjaW5jbHVkZSA8bWFjaC9ib2FyZC16b29tLmg+CiAKKyNpbmNsdWRlICJtdXguaCIKICNpbmNsdWRlICJzZHJhbS1oeW5peC1oOG1ieDAwdTBtZXItMGVtLmgiCiAKICNpZiBkZWZpbmVkKENPTkZJR19TTUM5MVgpIHx8IGRlZmluZWQoQ09ORklHX1NNQzkxWF9NT0RVTEUpCkBAIC00OCw3ICs0OSw5IEBACiAKIHN0YXRpYyB2b2lkIGVuYWJsZV9ib2FyZF93YWtldXBfc291cmNlKHZvaWQpCiB7Ci0Jb21hcF9jZmdfcmVnKEFGMjZfMzRYWF9TWVNfTklSUSk7IC8qIFQyIGludGVycnVwdCBsaW5lIChrZXlwYWQpICovCisJLyogVDIgaW50ZXJydXB0IGxpbmUgKGtleXBhZCkgKi8KKwlvbWFwX211eF9pbml0X3NpZ25hbCgic3lzX25pcnEiLAorCQlPTUFQX1dBS0VVUF9FTiB8IE9NQVBfUElOX0lOUFVUX1BVTExVUCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZWhjaV9oY2Rfb21hcF9wbGF0Zm9ybV9kYXRhIGVoY2lfcGRhdGEgX19pbml0Y29uc3QgPSB7CkBAIC04Miw4ICs4NSwxNyBAQAogCW9tYXBfZ3Bpb19pbml0KCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfT01BUF9NVVgKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9tdXggYm9hcmRfbXV4W10gX19pbml0ZGF0YSA9IHsKKwl7IC5yZWdfb2Zmc2V0ID0gT01BUF9NVVhfVEVSTUlOQVRPUiB9LAorfTsKKyNlbHNlCisjZGVmaW5lIGJvYXJkX211eAlOVUxMCisjZW5kaWYKKwogc3RhdGljIHZvaWQgX19pbml0IG9tYXBfc2RwX2luaXQodm9pZCkKIHsKKwlvbWFwM19tdXhfaW5pdChib2FyZF9tdXgsIE9NQVBfUEFDS0FHRV9DQlApOwogCXpvb21fcGVyaXBoZXJhbHNfaW5pdCgpOwogCWJvYXJkX3NtYzkxeF9pbml0KCk7CiAJZW5hYmxlX2JvYXJkX3dha2V1cF9zb3VyY2UoKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYW0zNTE3ZXZtLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWFtMzUxN2V2bS5jCmluZGV4IDQxNWExM2QuLmI0ZTZlY2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYW0zNTE3ZXZtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1hbTM1MTdldm0uYwpAQCAtMzAsNiArMzAsOCBAQAogI2luY2x1ZGUgPHBsYXQvY29tbW9uLmg+CiAjaW5jbHVkZSA8cGxhdC91c2IuaD4KIAorI2luY2x1ZGUgIm11eC5oIgorCiAvKgogICogQm9hcmQgaW5pdGlhbGl6YXRpb24KICAqLwpAQCAtNjAsOCArNjIsMTcgQEAKIAkucmVzZXRfZ3Bpb19wb3J0WzJdICA9IC1FSU5WQUwKIH07CiAKKyNpZmRlZiBDT05GSUdfT01BUF9NVVgKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9tdXggYm9hcmRfbXV4W10gX19pbml0ZGF0YSA9IHsKKwl7IC5yZWdfb2Zmc2V0ID0gT01BUF9NVVhfVEVSTUlOQVRPUiB9LAorfTsKKyNlbHNlCisjZGVmaW5lIGJvYXJkX211eAlOVUxMCisjZW5kaWYKKwogc3RhdGljIHZvaWQgX19pbml0IGFtMzUxN19ldm1faW5pdCh2b2lkKQogeworCW9tYXAzX211eF9pbml0KGJvYXJkX211eCwgT01BUF9QQUNLQUdFX0NCQik7CiAJcGxhdGZvcm1fYWRkX2RldmljZXMoYW0zNTE3X2V2bV9kZXZpY2VzLAogCQkJCUFSUkFZX1NJWkUoYW0zNTE3X2V2bV9kZXZpY2VzKSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYXBvbGxvbi5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1hcG9sbG9uLmMKaW5kZXggOGEyY2U3Ny4uZmJiZDY4ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1hcG9sbG9uLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1hcG9sbG9uLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvc21jOTF4Lmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KQEAgLTEyMCw2ICsxMjEsMTIgQEAKIAlhcG9sbG9uX2ZsYXNoX3Jlc291cmNlWzBdLmVuZCAgID0gYmFzZSArIFNaXzEyOEsgLSAxOwogfQogCitzdGF0aWMgc3RydWN0IHNtYzkxeF9wbGF0ZGF0YSBhcHBvbG9uX3NtYzkxeF9pbmZvID0geworCS5mbGFncwk9IFNNQzkxWF9VU0VfMTZCSVQgfCBTTUM5MVhfTk9XQUlULAorCS5sZWRhCT0gUlBDX0xFRF8xMDBfMTAsCisJLmxlZGIJPSBSUENfTEVEX1RYX1JYLAorfTsKKwogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhcG9sbG9uX3NtYzkxeF9yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7CiAJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKQEAgLTEzNCw2ICsxNDEsOSBAQAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXBvbGxvbl9zbWM5MXhfZGV2aWNlID0gewogCS5uYW1lCQk9ICJzbWM5MXgiLAogCS5pZAkJPSAtMSwKKwkuZGV2CT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZhcHBvbG9uX3NtYzkxeF9pbmZvLAorCX0sCiAJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGFwb2xsb25fc21jOTF4X3Jlc291cmNlcyksCiAJLnJlc291cmNlCT0gYXBvbGxvbl9zbWM5MXhfcmVzb3VyY2VzLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtY20tdDM1LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWNtLXQzNS5jCmluZGV4IDIyYzQ1MjkuLjE1OTFhYWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtY20tdDM1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1jbS10MzUuYwpAQCAtMzgsMTMgKzM4LDEzIEBACiAKICNpbmNsdWRlIDxwbGF0L2JvYXJkLmg+CiAjaW5jbHVkZSA8cGxhdC9jb21tb24uaD4KLSNpbmNsdWRlIDxwbGF0L211eC5oPgogI2luY2x1ZGUgPHBsYXQvbmFuZC5oPgogI2luY2x1ZGUgPHBsYXQvZ3BtYy5oPgogI2luY2x1ZGUgPHBsYXQvdXNiLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAKKyNpbmNsdWRlICJtdXguaCIKICNpbmNsdWRlICJzZHJhbS1taWNyb24tbXQ0NmgzMm0zMmxmLTYuaCIKICNpbmNsdWRlICJtbWMtdHdsNDAzMC5oIgogCkBAIC00ODIsOCArNDgyLDEwMiBAQAogCW9tYXAyX21hcF9jb21tb25faW8oKTsKIH0KIAorc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX211eCBib2FyZF9tdXhbXSBfX2luaXRkYXRhID0geworCS8qIG5DUyBhbmQgSVJRIGZvciBDTS1UMzUgZXRoZXJuZXQgKi8KKwlPTUFQM19NVVgoR1BNQ19OQ1M1LCBPTUFQX01VWF9NT0RFMCksCisJT01BUDNfTVVYKFVBUlQzX0NUU19SQ1RYLCBPTUFQX01VWF9NT0RFNCB8IE9NQVBfUElOX0lOUFVUX1BVTExVUCksCisKKwkvKiBuQ1MgYW5kIElSUSBmb3IgU0ItVDM1IGV0aGVybmV0ICovCisJT01BUDNfTVVYKEdQTUNfTkNTNCwgT01BUF9NVVhfTU9ERTApLAorCU9NQVAzX01VWChHUE1DX1dBSVQzLCBPTUFQX01VWF9NT0RFNCB8IE9NQVBfUElOX0lOUFVUX1BVTExVUCksCisKKwkvKiBQRU5ET1dOIEdQSU8gKi8KKwlPTUFQM19NVVgoR1BNQ19OQ1M2LCBPTUFQX01VWF9NT0RFNCB8IE9NQVBfUElOX0lOUFVUKSwKKworCS8qIG1VU0IgKi8KKwlPTUFQM19NVVgoSFNVU0IwX0NMSywgT01BUF9NVVhfTU9ERTAgfCBPTUFQX1BJTl9JTlBVVCksCisJT01BUDNfTVVYKEhTVVNCMF9TVFAsIE9NQVBfTVVYX01PREUwIHwgT01BUF9QSU5fT1VUUFVUKSwKKwlPTUFQM19NVVgoSFNVU0IwX0RJUiwgT01BUF9NVVhfTU9ERTAgfCBPTUFQX1BJTl9JTlBVVCksCisJT01BUDNfTVVYKEhTVVNCMF9OWFQsIE9NQVBfTVVYX01PREUwIHwgT01BUF9QSU5fSU5QVVQpLAorCU9NQVAzX01VWChIU1VTQjBfREFUQTAsIE9NQVBfTVVYX01PREUwIHwgT01BUF9QSU5fSU5QVVQpLAorCU9NQVAzX01VWChIU1VTQjBfREFUQTEsIE9NQVBfTVVYX01PREUwIHwgT01BUF9QSU5fSU5QVVQpLAorCU9NQVAzX01VWChIU1VTQjBfREFUQTIsIE9NQVBfTVVYX01PREUwIHwgT01BUF9QSU5fSU5QVVQpLAorCU9NQVAzX01VWChIU1VTQjBfREFUQTMsIE9NQVBfTVVYX01PREUwIHwgT01BUF9QSU5fSU5QVVQpLAorCU9NQVAzX01VWChIU1VTQjBfREFUQTQsIE9NQVBfTVVYX01PREUwIHwgT01BUF9QSU5fSU5QVVQpLAorCU9NQVAzX01VWChIU1VTQjBfREFUQTUsIE9NQVBfTVVYX01PREUwIHwgT01BUF9QSU5fSU5QVVQpLAorCU9NQVAzX01VWChIU1VTQjBfREFUQTYsIE9NQVBfTVVYX01PREUwIHwgT01BUF9QSU5fSU5QVVQpLAorCU9NQVAzX01VWChIU1VTQjBfREFUQTcsIE9NQVBfTVVYX01PREUwIHwgT01BUF9QSU5fSU5QVVQpLAorCisJLyogTU1DIDIgKi8KKwlPTUFQM19NVVgoU0RNTUMyX0RBVDQsIE9NQVBfTVVYX01PREUxIHwgT01BUF9QSU5fT1VUUFVUKSwKKwlPTUFQM19NVVgoU0RNTUMyX0RBVDUsIE9NQVBfTVVYX01PREUxIHwgT01BUF9QSU5fT1VUUFVUKSwKKwlPTUFQM19NVVgoU0RNTUMyX0RBVDYsIE9NQVBfTVVYX01PREUxIHwgT01BUF9QSU5fT1VUUFVUKSwKKwlPTUFQM19NVVgoU0RNTUMyX0RBVDcsIE9NQVBfTVVYX01PREUxIHwgT01BUF9QSU5fSU5QVVQpLAorCisJLyogTWNTUEkgMSAqLworCU9NQVAzX01VWChNQ1NQSTFfQ0xLLCBPTUFQX01VWF9NT0RFMCB8IE9NQVBfUElOX0lOUFVUKSwKKwlPTUFQM19NVVgoTUNTUEkxX1NJTU8sIE9NQVBfTVVYX01PREUwIHwgT01BUF9QSU5fSU5QVVQpLAorCU9NQVAzX01VWChNQ1NQSTFfU09NSSwgT01BUF9NVVhfTU9ERTAgfCBPTUFQX1BJTl9JTlBVVCksCisJT01BUDNfTVVYKE1DU1BJMV9DUzAsIE9NQVBfTVVYX01PREUwIHwgT01BUF9QSU5fSU5QVVRfUFVMTERPV04pLAorCisJLyogTWNTUEkgNCAqLworCU9NQVAzX01VWChNQ0JTUDFfQ0xLUiwgT01BUF9NVVhfTU9ERTEgfCBPTUFQX1BJTl9JTlBVVCksCisJT01BUDNfTVVYKE1DQlNQMV9EWCwgT01BUF9NVVhfTU9ERTEgfCBPTUFQX1BJTl9JTlBVVCksCisJT01BUDNfTVVYKE1DQlNQMV9EUiwgT01BUF9NVVhfTU9ERTEgfCBPTUFQX1BJTl9JTlBVVCksCisJT01BUDNfTVVYKE1DQlNQMV9GU1gsIE9NQVBfTVVYX01PREUxIHwgT01BUF9QSU5fSU5QVVRfUFVMTFVQKSwKKworCS8qIE1jQlNQIDIgKi8KKwlPTUFQM19NVVgoTUNCU1AyX0ZTWCwgT01BUF9NVVhfTU9ERTAgfCBPTUFQX1BJTl9JTlBVVCksCisJT01BUDNfTVVYKE1DQlNQMl9DTEtYLCBPTUFQX01VWF9NT0RFMCB8IE9NQVBfUElOX0lOUFVUKSwKKwlPTUFQM19NVVgoTUNCU1AyX0RSLCBPTUFQX01VWF9NT0RFMCB8IE9NQVBfUElOX0lOUFVUKSwKKwlPTUFQM19NVVgoTUNCU1AyX0RYLCBPTUFQX01VWF9NT0RFMCB8IE9NQVBfUElOX09VVFBVVCksCisKKwkvKiBzZXJpYWwgcG9ydHMgKi8KKwlPTUFQM19NVVgoTUNCU1AzX0NMS1gsIE9NQVBfTVVYX01PREUxIHwgT01BUF9QSU5fT1VUUFVUKSwKKwlPTUFQM19NVVgoTUNCU1AzX0ZTWCwgT01BUF9NVVhfTU9ERTEgfCBPTUFQX1BJTl9JTlBVVCksCisJT01BUDNfTVVYKFVBUlQxX1RYLCBPTUFQX01VWF9NT0RFMCB8IE9NQVBfUElOX09VVFBVVCksCisJT01BUDNfTVVYKFVBUlQxX1JYLCBPTUFQX01VWF9NT0RFMCB8IE9NQVBfUElOX0lOUFVUKSwKKworCS8qIERTUyAqLworCU9NQVAzX01VWChEU1NfUENMSywgT01BUF9NVVhfTU9ERTAgfCBPTUFQX1BJTl9PVVRQVVQpLAorCU9NQVAzX01VWChEU1NfSFNZTkMsIE9NQVBfTVVYX01PREUwIHwgT01BUF9QSU5fT1VUUFVUKSwKKwlPTUFQM19NVVgoRFNTX1ZTWU5DLCBPTUFQX01VWF9NT0RFMCB8IE9NQVBfUElOX09VVFBVVCksCisJT01BUDNfTVVYKERTU19BQ0JJQVMsIE9NQVBfTVVYX01PREUwIHwgT01BUF9QSU5fT1VUUFVUKSwKKwlPTUFQM19NVVgoRFNTX0RBVEEwLCBPTUFQX01VWF9NT0RFMCB8IE9NQVBfUElOX09VVFBVVCksCisJT01BUDNfTVVYKERTU19EQVRBMSwgT01BUF9NVVhfTU9ERTAgfCBPTUFQX1BJTl9PVVRQVVQpLAorCU9NQVAzX01VWChEU1NfREFUQTIsIE9NQVBfTVVYX01PREUwIHwgT01BUF9QSU5fT1VUUFVUKSwKKwlPTUFQM19NVVgoRFNTX0RBVEEzLCBPTUFQX01VWF9NT0RFMCB8IE9NQVBfUElOX09VVFBVVCksCisJT01BUDNfTVVYKERTU19EQVRBNCwgT01BUF9NVVhfTU9ERTAgfCBPTUFQX1BJTl9PVVRQVVQpLAorCU9NQVAzX01VWChEU1NfREFUQTUsIE9NQVBfTVVYX01PREUwIHwgT01BUF9QSU5fT1VUUFVUKSwKKwlPTUFQM19NVVgoRFNTX0RBVEE2LCBPTUFQX01VWF9NT0RFMCB8IE9NQVBfUElOX09VVFBVVCksCisJT01BUDNfTVVYKERTU19EQVRBNywgT01BUF9NVVhfTU9ERTAgfCBPTUFQX1BJTl9PVVRQVVQpLAorCU9NQVAzX01VWChEU1NfREFUQTgsIE9NQVBfTVVYX01PREUwIHwgT01BUF9QSU5fT1VUUFVUKSwKKwlPTUFQM19NVVgoRFNTX0RBVEE5LCBPTUFQX01VWF9NT0RFMCB8IE9NQVBfUElOX09VVFBVVCksCisJT01BUDNfTVVYKERTU19EQVRBMTAsIE9NQVBfTVVYX01PREUwIHwgT01BUF9QSU5fT1VUUFVUKSwKKwlPTUFQM19NVVgoRFNTX0RBVEExMSwgT01BUF9NVVhfTU9ERTAgfCBPTUFQX1BJTl9PVVRQVVQpLAorCU9NQVAzX01VWChEU1NfREFUQTEyLCBPTUFQX01VWF9NT0RFMCB8IE9NQVBfUElOX09VVFBVVCksCisJT01BUDNfTVVYKERTU19EQVRBMTMsIE9NQVBfTVVYX01PREUwIHwgT01BUF9QSU5fT1VUUFVUKSwKKwlPTUFQM19NVVgoRFNTX0RBVEExNCwgT01BUF9NVVhfTU9ERTAgfCBPTUFQX1BJTl9PVVRQVVQpLAorCU9NQVAzX01VWChEU1NfREFUQTE1LCBPTUFQX01VWF9NT0RFMCB8IE9NQVBfUElOX09VVFBVVCksCisJT01BUDNfTVVYKERTU19EQVRBMTYsIE9NQVBfTVVYX01PREUwIHwgT01BUF9QSU5fT1VUUFVUKSwKKwlPTUFQM19NVVgoRFNTX0RBVEExNywgT01BUF9NVVhfTU9ERTAgfCBPTUFQX1BJTl9PVVRQVVQpLAorCU9NQVAzX01VWChEU1NfREFUQTE4LCBPTUFQX01VWF9NT0RFMCB8IE9NQVBfUElOX09VVFBVVCksCisJT01BUDNfTVVYKERTU19EQVRBMTksIE9NQVBfTVVYX01PREUwIHwgT01BUF9QSU5fT1VUUFVUKSwKKwlPTUFQM19NVVgoRFNTX0RBVEEyMCwgT01BUF9NVVhfTU9ERTAgfCBPTUFQX1BJTl9PVVRQVVQpLAorCU9NQVAzX01VWChEU1NfREFUQTIxLCBPTUFQX01VWF9NT0RFMCB8IE9NQVBfUElOX09VVFBVVCksCisJT01BUDNfTVVYKERTU19EQVRBMjIsIE9NQVBfTVVYX01PREUwIHwgT01BUF9QSU5fT1VUUFVUKSwKKwlPTUFQM19NVVgoRFNTX0RBVEEyMywgT01BUF9NVVhfTU9ERTAgfCBPTUFQX1BJTl9PVVRQVVQpLAorCisJLyogVFBTIElSUSAqLworCU9NQVAzX01VWChTWVNfTklSUSwgT01BUF9NVVhfTU9ERTAgfCBPTUFQX1dBS0VVUF9FTiB8IFwKKwkJICBPTUFQX1BJTl9JTlBVVF9QVUxMVVApLAorCisJeyAucmVnX29mZnNldCA9IE9NQVBfTVVYX1RFUk1JTkFUT1IgfSwKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBjbV90MzVfaW5pdCh2b2lkKQogeworCW9tYXAzX211eF9pbml0KGJvYXJkX211eCwgT01BUF9QQUNLQUdFX0NVUyk7CiAJb21hcF9zZXJpYWxfaW5pdCgpOwogCWNtX3QzNV9pbml0X2kyYygpOwogCWNtX3QzNV9pbml0X25hbmQoKTsKQEAgLTQ5Miw4ICs1ODYsNiBAQAogCWNtX3QzNV9pbml0X2xlZCgpOwogCiAJdXNiX211c2JfaW5pdCgpOwotCi0Jb21hcF9jZmdfcmVnKEFGMjZfMzRYWF9TWVNfTklSUSk7CiB9CiAKIE1BQ0hJTkVfU1RBUlQoQ01fVDM1LCAiQ29tcHVsYWIgQ00tVDM1IikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtaWdlcDAwMjAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtaWdlcDAwMjAuYwppbmRleCBmYTYyZTgwLi40NDIzOWUzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWlnZXAwMDIwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1pZ2VwMDAyMC5jCkBAIC0yNyw5ICsyNyw5IEBACiAjaW5jbHVkZSA8cGxhdC9ib2FyZC5oPgogI2luY2x1ZGUgPHBsYXQvY29tbW9uLmg+CiAjaW5jbHVkZSA8cGxhdC9ncG1jLmg+Ci0jaW5jbHVkZSA8cGxhdC9tdXguaD4KICNpbmNsdWRlIDxwbGF0L3VzYi5oPgogCisjaW5jbHVkZSAibXV4LmgiCiAjaW5jbHVkZSAibW1jLXR3bDQwMzAuaCIKIAogI2RlZmluZSBJR0VQMl9TTVNDOTExWF9DUyAgICAgICA1CkBAIC0yMDMsOCArMjAzLDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfT01BUF9NVVgKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9tdXggYm9hcmRfbXV4W10gX19pbml0ZGF0YSA9IHsKKwl7IC5yZWdfb2Zmc2V0ID0gT01BUF9NVVhfVEVSTUlOQVRPUiB9LAorfTsKKyNlbHNlCisjZGVmaW5lIGJvYXJkX211eAlOVUxMCisjZW5kaWYKKwogc3RhdGljIHZvaWQgX19pbml0IGlnZXAyX2luaXQodm9pZCkKIHsKKwlvbWFwM19tdXhfaW5pdChib2FyZF9tdXgsIE9NQVBfUEFDS0FHRV9DQkIpOwogCWlnZXAyX2kyY19pbml0KCk7CiAJb21hcF9zZXJpYWxfaW5pdCgpOwogCXVzYl9tdXNiX2luaXQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtbGRwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWxkcC5jCmluZGV4IGMwNjIyMzguLjk5NWQ0YTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtbGRwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1sZHAuYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvYWRzNzg0Ni5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjL3R3bDQwMzAuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvdHdsLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbXNjOTExeC5oPgogCkBAIC00Myw2ICs0Myw3IEBACiAjaW5jbHVkZSA8cGxhdC9jb250cm9sLmg+CiAjaW5jbHVkZSA8cGxhdC91c2IuaD4KIAorI2luY2x1ZGUgIm11eC5oIgogI2luY2x1ZGUgIm1tYy10d2w0MDMwLmgiCiAKICNkZWZpbmUgTERQX1NNU0M5MTFYX0NTCQkxCkBAIC0zNzQsOCArMzc1LDE3IEBACiAJJmxkcF9ncGlvX2tleXNfZGV2aWNlLAogfTsKIAorI2lmZGVmIENPTkZJR19PTUFQX01VWAorc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX211eCBib2FyZF9tdXhbXSBfX2luaXRkYXRhID0geworCXsgLnJlZ19vZmZzZXQgPSBPTUFQX01VWF9URVJNSU5BVE9SIH0sCit9OworI2Vsc2UKKyNkZWZpbmUgYm9hcmRfbXV4CU5VTEwKKyNlbmRpZgorCiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9sZHBfaW5pdCh2b2lkKQogeworCW9tYXAzX211eF9pbml0KGJvYXJkX211eCwgT01BUF9QQUNLQUdFX0NCQik7CiAJb21hcF9pMmNfaW5pdCgpOwogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGxkcF9kZXZpY2VzLCBBUlJBWV9TSVpFKGxkcF9kZXZpY2VzKSk7CiAJdHNfZ3BpbyA9IDU0OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM2JlYWdsZS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM2JlYWdsZS5jCmluZGV4IDQxNDgwYmQuLjIzMWNiNGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNiZWFnbGUuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzYmVhZ2xlLmMKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgogCiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMvdHdsNDAzMC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy90d2wuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgpAQCAtNDEsMTAgKzQxLDEwIEBACiAjaW5jbHVkZSA8cGxhdC9jb21tb24uaD4KICNpbmNsdWRlIDxwbGF0L2dwbWMuaD4KICNpbmNsdWRlIDxwbGF0L25hbmQuaD4KLSNpbmNsdWRlIDxwbGF0L211eC5oPgogI2luY2x1ZGUgPHBsYXQvdXNiLmg+CiAjaW5jbHVkZSA8cGxhdC90aW1lci1ncC5oPgogCisjaW5jbHVkZSAibXV4LmgiCiAjaW5jbHVkZSAibW1jLXR3bDQwMzAuaCIKIAogI2RlZmluZSBHUE1DX0NTMF9CQVNFICAweDYwCkBAIC0xNDAsMTAgKzE0MCwxMCBAQAogCQl1bnNpZ25lZCBncGlvLCB1bnNpZ25lZCBuZ3BpbykKIHsKIAlpZiAoc3lzdGVtX3JldiA+PSAweDIwICYmIHN5c3RlbV9yZXYgPD0gMHgzNDMwMTAwMCkgewotCQlvbWFwX2NmZ19yZWcoQUc5XzM0WFhfR1BJTzIzKTsKKwkJb21hcF9tdXhfaW5pdF9ncGlvKDIzLCBPTUFQX1BJTl9JTlBVVCk7CiAJCW1tY1swXS5ncGlvX3dwID0gMjM7CiAJfSBlbHNlIHsKLQkJb21hcF9jZmdfcmVnKEFIOF8zNFhYX0dQSU8yOSk7CisJCW9tYXBfbXV4X2luaXRfZ3BpbygyOSwgT01BUF9QSU5fSU5QVVQpOwogCX0KIAkvKiBncGlvICsgMCBpcyAibW1jMF9jZCIgKGlucHV0L0lSUSkgKi8KIAltbWNbMF0uZ3Bpb19jZCA9IGdwaW8gKyAwOwpAQCAtNDIyLDE0ICs0MjIsMjMgQEAKIAkucmVzZXRfZ3Bpb19wb3J0WzJdICA9IC1FSU5WQUwKIH07CiAKKyNpZmRlZiBDT05GSUdfT01BUF9NVVgKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9tdXggYm9hcmRfbXV4W10gX19pbml0ZGF0YSA9IHsKKwl7IC5yZWdfb2Zmc2V0ID0gT01BUF9NVVhfVEVSTUlOQVRPUiB9LAorfTsKKyNlbHNlCisjZGVmaW5lIGJvYXJkX211eAlOVUxMCisjZW5kaWYKKwogc3RhdGljIHZvaWQgX19pbml0IG9tYXAzX2JlYWdsZV9pbml0KHZvaWQpCiB7CisJb21hcDNfbXV4X2luaXQoYm9hcmRfbXV4LCBPTUFQX1BBQ0tBR0VfQ0JCKTsKIAlvbWFwM19iZWFnbGVfaTJjX2luaXQoKTsKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhvbWFwM19iZWFnbGVfZGV2aWNlcywKIAkJCUFSUkFZX1NJWkUob21hcDNfYmVhZ2xlX2RldmljZXMpKTsKIAlvbWFwX3NlcmlhbF9pbml0KCk7CiAKLQlvbWFwX2NmZ19yZWcoSjI1XzM0WFhfR1BJTzE3MCk7CisJb21hcF9tdXhfaW5pdF9ncGlvKDE3MCwgT01BUF9QSU5fSU5QVVQpOwogCWdwaW9fcmVxdWVzdCgxNzAsICJEVklfblBEIik7CiAJLyogUkVWSVNJVCBsZWF2ZSBEVkkgcG93ZXJlZCBkb3duIHVudGlsIGl0J3MgbmVlZGVkIC4uLiAqLwogCWdwaW9fZGlyZWN0aW9uX291dHB1dCgxNzAsIHRydWUpOwpAQCAtNDM5LDggKzQ0OCw4IEBACiAJb21hcDNiZWFnbGVfZmxhc2hfaW5pdCgpOwogCiAJLyogRW5zdXJlIFNEUkMgcGlucyBhcmUgbXV4J2QgZm9yIHNlbGYtcmVmcmVzaCAqLwotCW9tYXBfY2ZnX3JlZyhIMTZfMzRYWF9TRFJDX0NLRTApOwotCW9tYXBfY2ZnX3JlZyhIMTdfMzRYWF9TRFJDX0NLRTEpOworCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJzZHJjX2NrZTAiLCBPTUFQX1BJTl9PVVRQVVQpOworCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJzZHJjX2NrZTEiLCBPTUFQX1BJTl9PVVRQVVQpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcDNfYmVhZ2xlX21hcF9pbyh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM2V2bS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM2V2bS5jCmluZGV4IDVlZmMyZTkuLjE4OTEzZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNldm0uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzZXZtLmMKQEAgLTM4LDExICszOCwxMSBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCiAjaW5jbHVkZSA8cGxhdC9ib2FyZC5oPgotI2luY2x1ZGUgPHBsYXQvbXV4Lmg+CiAjaW5jbHVkZSA8cGxhdC91c2IuaD4KICNpbmNsdWRlIDxwbGF0L2NvbW1vbi5oPgogI2luY2x1ZGUgPHBsYXQvbWNzcGkuaD4KIAorI2luY2x1ZGUgIm11eC5oIgogI2luY2x1ZGUgInNkcmFtLW1pY3Jvbi1tdDQ2aDMybTMybGYtNi5oIgogI2luY2x1ZGUgIm1tYy10d2w0MDMwLmgiCiAKQEAgLTIyMyw3ICsyMjMsNyBAQAogCQl1bnNpZ25lZCBncGlvLCB1bnNpZ25lZCBuZ3BpbykKIHsKIAkvKiBncGlvICsgMCBpcyAibW1jMF9jZCIgKGlucHV0L0lSUSkgKi8KLQlvbWFwX2NmZ19yZWcoTDhfMzRYWF9HUElPNjMpOworCW9tYXBfbXV4X2luaXRfZ3Bpbyg2MywgT01BUF9QSU5fSU5QVVQpOwogCW1tY1swXS5ncGlvX2NkID0gZ3BpbyArIDA7CiAJdHdsNDAzMF9tbWNfaW5pdChtbWMpOwogCkBAIC00MjIsOSArNDIyLDE4IEBACiAJLnJlc2V0X2dwaW9fcG9ydFsyXSAgPSAtRUlOVkFMCiB9OwogCisjaWZkZWYgQ09ORklHX09NQVBfTVVYCitzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfbXV4IGJvYXJkX211eFtdIF9faW5pdGRhdGEgPSB7CisJeyAucmVnX29mZnNldCA9IE9NQVBfTVVYX1RFUk1JTkFUT1IgfSwKK307CisjZWxzZQorI2RlZmluZSBib2FyZF9tdXgJTlVMTAorI2VuZGlmCisKIHN0YXRpYyB2b2lkIF9faW5pdCBvbWFwM19ldm1faW5pdCh2b2lkKQogewogCW9tYXAzX2V2bV9nZXRfcmV2aXNpb24oKTsKKwlvbWFwM19tdXhfaW5pdChib2FyZF9tdXgsIE9NQVBfUEFDS0FHRV9DQkIpOwogCiAJb21hcDNfZXZtX2kyY19pbml0KCk7CiAKQEAgLTQ0MCwyNCArNDQ5LDI0IEBACiAjZW5kaWYKIAlpZiAoZ2V0X29tYXAzX2V2bV9yZXYoKSA+PSBPTUFQM0VWTV9CT0FSRF9HRU5fMikgewogCQkvKiBlbmFibGUgRUhDSSBWQlVTIHVzaW5nIEdQSU8yMiAqLwotCQlvbWFwX2NmZ19yZWcoQUY5XzM0WFhfR1BJTzIyKTsKKwkJb21hcF9tdXhfaW5pdF9ncGlvKDIyLCBPTUFQX1BJTl9JTlBVVF9QVUxMVVApOwogCQlncGlvX3JlcXVlc3QoT01BUDNfRVZNX0VIQ0lfVkJVUywgImVuYWJsZSBFSENJIFZCVVMiKTsKIAkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KE9NQVAzX0VWTV9FSENJX1ZCVVMsIDApOwogCQlncGlvX3NldF92YWx1ZShPTUFQM19FVk1fRUhDSV9WQlVTLCAxKTsKIAogCQkvKiBTZWxlY3QgRUhDSSBwb3J0IG9uIG1haW4gYm9hcmQgKi8KLQkJb21hcF9jZmdfcmVnKFUzXzM0WFhfR1BJTzYxKTsKKwkJb21hcF9tdXhfaW5pdF9ncGlvKDYxLCBPTUFQX1BJTl9JTlBVVF9QVUxMVVApOwogCQlncGlvX3JlcXVlc3QoT01BUDNfRVZNX0VIQ0lfU0VMRUNULCAic2VsZWN0IEVIQ0kgcG9ydCIpOwogCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoT01BUDNfRVZNX0VIQ0lfU0VMRUNULCAwKTsKIAkJZ3Bpb19zZXRfdmFsdWUoT01BUDNfRVZNX0VIQ0lfU0VMRUNULCAwKTsKIAogCQkvKiBzZXR1cCBFSENJIHBoeSByZXNldCBjb25maWcgKi8KLQkJb21hcF9jZmdfcmVnKEFIMTRfMzRYWF9HUElPMjEpOworCQlvbWFwX211eF9pbml0X2dwaW8oMjEsIE9NQVBfUElOX0lOUFVUX1BVTExVUCk7CiAJCWVoY2lfcGRhdGEucmVzZXRfZ3Bpb19wb3J0WzFdID0gMjE7CiAKIAl9IGVsc2UgewogCQkvKiBzZXR1cCBFSENJIHBoeSByZXNldCBvbiBNREMgKi8KLQkJb21hcF9jZmdfcmVnKEFGNF8zNFhYX0dQSU8xMzVfT1VUKTsKKwkJb21hcF9tdXhfaW5pdF9ncGlvKDEzNSwgT01BUF9QSU5fT1VUUFVUKTsKIAkJZWhjaV9wZGF0YS5yZXNldF9ncGlvX3BvcnRbMV0gPSAxMzU7CiAJfQogCXVzYl9tdXNiX2luaXQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNwYW5kb3JhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzcGFuZG9yYS5jCmluZGV4IDJkYjViYTUuLmVmMTdjZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNwYW5kb3JhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3BhbmRvcmEuYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvYWRzNzg0Ni5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjL3R3bDQwMzAuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvdHdsLmg+CiAjaW5jbHVkZSA8bGludXgvbGVkcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQvbWF0cml4X2tleXBhZC5oPgpAQCAtNDAsOCArNDAsOCBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxwbGF0L21jc3BpLmg+CiAjaW5jbHVkZSA8cGxhdC91c2IuaD4KLSNpbmNsdWRlIDxwbGF0L211eC5oPgogCisjaW5jbHVkZSAibXV4LmgiCiAjaW5jbHVkZSAic2RyYW0tbWljcm9uLW10NDZoMzJtMzJsZi02LmgiCiAjaW5jbHVkZSAibW1jLXR3bDQwMzAuaCIKIApAQCAtOTgsMTAgKzk4LDEwIEBACiAJR1BJT19CVVRUT05fTE9XKDEwMywJS0VZX0RPV04sCSJkb3duIiksCiAJR1BJT19CVVRUT05fTE9XKDk2LAlLRVlfTEVGVCwJImxlZnQiKSwKIAlHUElPX0JVVFRPTl9MT1coOTgsCUtFWV9SSUdIVCwJInJpZ2h0IiksCi0JR1BJT19CVVRUT05fTE9XKDExMSwJQlROX0EsCQkiYSIpLAotCUdQSU9fQlVUVE9OX0xPVygxMDYsCUJUTl9CLAkJImIiKSwKLQlHUElPX0JVVFRPTl9MT1coMTA5LAlCVE5fWCwJCSJ4IiksCi0JR1BJT19CVVRUT05fTE9XKDEwMSwJQlROX1ksCQkieSIpLAorCUdQSU9fQlVUVE9OX0xPVygxMDksCUtFWV9LUDEsCSJnYW1lIDEiKSwKKwlHUElPX0JVVFRPTl9MT1coMTExLAlLRVlfS1AyLAkiZ2FtZSAyIiksCisJR1BJT19CVVRUT05fTE9XKDEwNiwJS0VZX0tQMywJImdhbWUgMyIpLAorCUdQSU9fQlVUVE9OX0xPVygxMDEsCUtFWV9LUDQsCSJnYW1lIDQiKSwKIAlHUElPX0JVVFRPTl9MT1coMTAyLAlCVE5fVEwsCQkibCIpLAogCUdQSU9fQlVUVE9OX0xPVyg5NywJQlROX1RMMiwJImwyIiksCiAJR1BJT19CVVRUT05fTE9XKDEwNSwJQlROX1RSLAkJInIiKSwKQEAgLTMxNSw3ICszMTUsNyBAQAogCW9tYXBfcmVnaXN0ZXJfaTJjX2J1cygxLCAyNjAwLCBvbWFwM3BhbmRvcmFfaTJjX2JvYXJkaW5mbywKIAkJCUFSUkFZX1NJWkUob21hcDNwYW5kb3JhX2kyY19ib2FyZGluZm8pKTsKIAkvKiBpMmMyIHBpbnMgYXJlIG5vdCBjb25uZWN0ZWQgKi8KLQlvbWFwX3JlZ2lzdGVyX2kyY19idXMoMywgNDAwLCBOVUxMLCAwKTsKKwlvbWFwX3JlZ2lzdGVyX2kyY19idXMoMywgMTAwLCBOVUxMLCAwKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzY4LDIzICszNjgsOCBAQAogCX0KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXAzcGFuZG9yYV9sY2RfZGV2aWNlID0gewotCS5uYW1lCQk9ICJwYW5kb3JhX2xjZCIsCi0JLmlkCQk9IC0xLAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2xjZF9jb25maWcgb21hcDNwYW5kb3JhX2xjZF9jb25maWcgX19pbml0ZGF0YSA9IHsKLQkuY3RybF9uYW1lCT0gImludGVybmFsIiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsIG9tYXAzcGFuZG9yYV9jb25maWdbXSBfX2luaXRkYXRhID0gewotCXsgT01BUF9UQUdfTENELAkJJm9tYXAzcGFuZG9yYV9sY2RfY29uZmlnIH0sCi19OwotCiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcDNwYW5kb3JhX2luaXRfaXJxKHZvaWQpCiB7Ci0Jb21hcF9ib2FyZF9jb25maWcgPSBvbWFwM3BhbmRvcmFfY29uZmlnOwotCW9tYXBfYm9hcmRfY29uZmlnX3NpemUgPSBBUlJBWV9TSVpFKG9tYXAzcGFuZG9yYV9jb25maWcpOwogCW9tYXAyX2luaXRfY29tbW9uX2h3KG10NDZoMzJtMzJsZjZfc2RyY19wYXJhbXMsCiAJCQkgICAgIG10NDZoMzJtMzJsZjZfc2RyY19wYXJhbXMpOwogCW9tYXBfaW5pdF9pcnEoKTsKQEAgLTM5Miw3ICszNzcsNiBAQAogfQogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb21hcDNwYW5kb3JhX2RldmljZXNbXSBfX2luaXRkYXRhID0gewotCSZvbWFwM3BhbmRvcmFfbGNkX2RldmljZSwKIAkmcGFuZG9yYV9sZWRzX2dwaW8sCiAJJnBhbmRvcmFfa2V5c19ncGlvLAogfTsKQEAgLTQwOSw4ICszOTMsMTcgQEAKIAkucmVzZXRfZ3Bpb19wb3J0WzJdICA9IC1FSU5WQUwKIH07CiAKKyNpZmRlZiBDT05GSUdfT01BUF9NVVgKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9tdXggYm9hcmRfbXV4W10gX19pbml0ZGF0YSA9IHsKKwl7IC5yZWdfb2Zmc2V0ID0gT01BUF9NVVhfVEVSTUlOQVRPUiB9LAorfTsKKyNlbHNlCisjZGVmaW5lIGJvYXJkX211eAlOVUxMCisjZW5kaWYKKwogc3RhdGljIHZvaWQgX19pbml0IG9tYXAzcGFuZG9yYV9pbml0KHZvaWQpCiB7CisJb21hcDNfbXV4X2luaXQoYm9hcmRfbXV4LCBPTUFQX1BBQ0tBR0VfQ0JCKTsKIAlvbWFwM3BhbmRvcmFfaTJjX2luaXQoKTsKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhvbWFwM3BhbmRvcmFfZGV2aWNlcywKIAkJCUFSUkFZX1NJWkUob21hcDNwYW5kb3JhX2RldmljZXMpKTsKQEAgLTQyMyw4ICs0MTYsOCBAQAogCXVzYl9tdXNiX2luaXQoKTsKIAogCS8qIEVuc3VyZSBTRFJDIHBpbnMgYXJlIG11eCdkIGZvciBzZWxmLXJlZnJlc2ggKi8KLQlvbWFwX2NmZ19yZWcoSDE2XzM0WFhfU0RSQ19DS0UwKTsKLQlvbWFwX2NmZ19yZWcoSDE3XzM0WFhfU0RSQ19DS0UxKTsKKwlvbWFwX211eF9pbml0X3NpZ25hbCgic2RyY19ja2UwIiwgT01BUF9QSU5fT1VUUFVUKTsKKwlvbWFwX211eF9pbml0X3NpZ25hbCgic2RyY19ja2UxIiwgT01BUF9QSU5fT1VUUFVUKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG9tYXAzcGFuZG9yYV9tYXBfaW8odm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDN0b3VjaGJvb2suYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDN0b3VjaGJvb2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWU1ZWJiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3RvdWNoYm9vay5jCkBAIC0wLDAgKzEsNTcyIEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3RvdWNoYm9vay5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEFsd2F5cyBJbm5vdmF0aW5nCisgKgorICogTW9kaWZpZWQgZnJvbSBtYWNoLW9tYXAyL2JvYXJkLW9tYXAzYmVhZ2xlYm9hcmQuYworICoKKyAqIEluaXRpYWwgY29kZTogR3LDqWdvaXJlIEdlbnRpbCwgVGltIFlhbWluCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpb19rZXlzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgorCisjaW5jbHVkZSA8cGxhdC9tY3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaS9hZHM3ODQ2Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy90d2w0MDMwLmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KKworI2luY2x1ZGUgPHBsYXQvYm9hcmQuaD4KKyNpbmNsdWRlIDxwbGF0L2NvbW1vbi5oPgorI2luY2x1ZGUgPHBsYXQvZ3BtYy5oPgorI2luY2x1ZGUgPHBsYXQvbmFuZC5oPgorI2luY2x1ZGUgPHBsYXQvdXNiLmg+CisjaW5jbHVkZSA8cGxhdC90aW1lci1ncC5oPgorCisjaW5jbHVkZSAibXV4LmgiCisjaW5jbHVkZSAibW1jLXR3bDQwMzAuaCIKKworI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorCisjZGVmaW5lIEdQTUNfQ1MwX0JBU0UgIDB4NjAKKyNkZWZpbmUgR1BNQ19DU19TSVpFICAgMHgzMAorCisjZGVmaW5lIE5BTkRfQkxPQ0tfU0laRQkJU1pfMTI4SworCisjZGVmaW5lIE9NQVAzX0FDX0dQSU8JCTEzNgorI2RlZmluZSBPTUFQM19UU19HUElPCQkxNjIKKyNkZWZpbmUgVEJfQkxfUFdNX1RJTUVSCQk5CisjZGVmaW5lIFRCX0tJTExfUE9XRVJfR1BJTwkxNjgKKwordW5zaWduZWQgbG9uZyB0b3VjaGJvb2tfcmV2aXNpb247CisKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBvbWFwM3RvdWNoYm9va19uYW5kX3BhcnRpdGlvbnNbXSA9IHsKKwkvKiBBbGwgdGhlIHBhcnRpdGlvbiBzaXplcyBhcmUgbGlzdGVkIGluIHRlcm1zIG9mIE5BTkQgYmxvY2sgc2l6ZSAqLworCXsKKwkJLm5hbWUJCT0gIlgtTG9hZGVyIiwKKwkJLm9mZnNldAkJPSAwLAorCQkuc2l6ZQkJPSA0ICogTkFORF9CTE9DS19TSVpFLAorCQkubWFza19mbGFncwk9IE1URF9XUklURUFCTEUsCS8qIGZvcmNlIHJlYWQtb25seSAqLworCX0sCisJeworCQkubmFtZQkJPSAiVS1Cb290IiwKKwkJLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCS8qIE9mZnNldCA9IDB4ODAwMDAgKi8KKwkJLnNpemUJCT0gMTUgKiBOQU5EX0JMT0NLX1NJWkUsCisJCS5tYXNrX2ZsYWdzCT0gTVREX1dSSVRFQUJMRSwJLyogZm9yY2UgcmVhZC1vbmx5ICovCisJfSwKKwl7CisJCS5uYW1lCQk9ICJVLUJvb3QgRW52IiwKKwkJLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCS8qIE9mZnNldCA9IDB4MjYwMDAwICovCisJCS5zaXplCQk9IDEgKiBOQU5EX0JMT0NLX1NJWkUsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJLZXJuZWwiLAorCQkub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwJLyogT2Zmc2V0ID0gMHgyODAwMDAgKi8KKwkJLnNpemUJCT0gMzIgKiBOQU5EX0JMT0NLX1NJWkUsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJGaWxlIFN5c3RlbSIsCisJCS5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAkvKiBPZmZzZXQgPSAweDY4MDAwMCAqLworCQkuc2l6ZQkJPSBNVERQQVJUX1NJWl9GVUxMLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG9tYXBfbmFuZF9wbGF0Zm9ybV9kYXRhIG9tYXAzdG91Y2hib29rX25hbmRfZGF0YSA9IHsKKwkub3B0aW9ucwk9IE5BTkRfQlVTV0lEVEhfMTYsCisJLnBhcnRzCQk9IG9tYXAzdG91Y2hib29rX25hbmRfcGFydGl0aW9ucywKKwkubnJfcGFydHMJPSBBUlJBWV9TSVpFKG9tYXAzdG91Y2hib29rX25hbmRfcGFydGl0aW9ucyksCisJLmRtYV9jaGFubmVsCT0gLTEsCQkvKiBkaXNhYmxlIERNQSBpbiBPTUFQIE5BTkQgZHJpdmVyICovCisJLm5hbmRfc2V0dXAJPSBOVUxMLAorCS5kZXZfcmVhZHkJPSBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBvbWFwM3RvdWNoYm9va19uYW5kX3Jlc291cmNlID0geworCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXAzdG91Y2hib29rX25hbmRfZGV2aWNlID0geworCS5uYW1lCQk9ICJvbWFwMi1uYW5kIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJm9tYXAzdG91Y2hib29rX25hbmRfZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gMSwKKwkucmVzb3VyY2UJPSAmb21hcDN0b3VjaGJvb2tfbmFuZF9yZXNvdXJjZSwKK307CisKKyNpbmNsdWRlICJzZHJhbS1taWNyb24tbXQ0NmgzMm0zMmxmLTYuaCIKKworc3RhdGljIHN0cnVjdCB0d2w0MDMwX2hzbW1jX2luZm8gbW1jW10gPSB7CisJeworCQkubW1jCQk9IDEsCisJCS53aXJlcwkJPSA4LAorCQkuZ3Bpb193cAk9IDI5LAorCX0sCisJe30JLyogVGVybWluYXRvciAqLworfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcDNfdG91Y2hib29rX2xjZF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gIm9tYXAzdG91Y2hib29rX2xjZCIsCisJLmlkCQk9IC0xLAorfTsKKworc3RhdGljIHN0cnVjdCBvbWFwX2xjZF9jb25maWcgb21hcDNfdG91Y2hib29rX2xjZF9jb25maWcgX19pbml0ZGF0YSA9IHsKKwkuY3RybF9uYW1lCT0gImludGVybmFsIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB0b3VjaGJvb2tfdm1tYzFfc3VwcGx5ID0geworCS5zdXBwbHkJCQk9ICJ2bW1jIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB0b3VjaGJvb2tfdnNpbV9zdXBwbHkgPSB7CisJLnN1cHBseQkJCT0gInZtbWNfYXV4IiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWQgZ3Bpb19sZWRzW107CisKK3N0YXRpYyBpbnQgdG91Y2hib29rX3R3bF9ncGlvX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdW5zaWduZWQgZ3BpbywgdW5zaWduZWQgbmdwaW8pCit7CisJaWYgKHN5c3RlbV9yZXYgPj0gMHgyMCAmJiBzeXN0ZW1fcmV2IDw9IDB4MzQzMDEwMDApIHsKKwkJb21hcF9tdXhfaW5pdF9ncGlvKDIzLCBPTUFQX1BJTl9JTlBVVCk7CisJCW1tY1swXS5ncGlvX3dwID0gMjM7CisJfSBlbHNlIHsKKwkJb21hcF9tdXhfaW5pdF9ncGlvKDI5LCBPTUFQX1BJTl9JTlBVVCk7CisJfQorCS8qIGdwaW8gKyAwIGlzICJtbWMwX2NkIiAoaW5wdXQvSVJRKSAqLworCW1tY1swXS5ncGlvX2NkID0gZ3BpbyArIDA7CisJdHdsNDAzMF9tbWNfaW5pdChtbWMpOworCisJLyogbGluayByZWd1bGF0b3JzIHRvIE1NQyBhZGFwdGVycyAqLworCXRvdWNoYm9va192bW1jMV9zdXBwbHkuZGV2ID0gbW1jWzBdLmRldjsKKwl0b3VjaGJvb2tfdnNpbV9zdXBwbHkuZGV2ID0gbW1jWzBdLmRldjsKKworCS8qIFJFVklTSVQ6IG5lZWQgZWhjaS1vbWFwIGhvb2tzIGZvciBleHRlcm5hbCBWQlVTCisJICogcG93ZXIgc3dpdGNoIGFuZCBvdmVyY3VycmVudCBkZXRlY3QKKwkgKi8KKworCWdwaW9fcmVxdWVzdChncGlvICsgMSwgIkVIQ0lfbk9DIik7CisJZ3Bpb19kaXJlY3Rpb25faW5wdXQoZ3BpbyArIDEpOworCisJLyogVFdMNDAzMF9HUElPX01BWCArIDAgPT0gbGVkQSwgRUhDSSBuRU5fVVNCX1BXUiAob3V0LCBhY3RpdmUgbG93KSAqLworCWdwaW9fcmVxdWVzdChncGlvICsgVFdMNDAzMF9HUElPX01BWCwgIm5FTl9VU0JfUFdSIik7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW8gKyBUV0w0MDMwX0dQSU9fTUFYLCAwKTsKKworCS8qIFRXTDQwMzBfR1BJT19NQVggKyAxID09IGxlZEIsIFBNVV9TVEFUIChvdXQsIGFjdGl2ZSBsb3cgTEVEKSAqLworCWdwaW9fbGVkc1syXS5ncGlvID0gZ3BpbyArIFRXTDQwMzBfR1BJT19NQVggKyAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9ncGlvX3BsYXRmb3JtX2RhdGEgdG91Y2hib29rX2dwaW9fZGF0YSA9IHsKKwkuZ3Bpb19iYXNlCT0gT01BUF9NQVhfR1BJT19MSU5FUywKKwkuaXJxX2Jhc2UJPSBUV0w0MDMwX0dQSU9fSVJRX0JBU0UsCisJLmlycV9lbmQJPSBUV0w0MDMwX0dQSU9fSVJRX0VORCwKKwkudXNlX2xlZHMJPSB0cnVlLAorCS5wdWxsdXBzCT0gQklUKDEpLAorCS5wdWxsZG93bnMJPSBCSVQoMikgfCBCSVQoNikgfCBCSVQoNykgfCBCSVQoOCkgfCBCSVQoMTMpCisJCQkJfCBCSVQoMTUpIHwgQklUKDE2KSB8IEJJVCgxNyksCisJLnNldHVwCQk9IHRvdWNoYm9va190d2xfZ3Bpb19zZXR1cCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB0b3VjaGJvb2tfdmRhY19zdXBwbHkgPSB7CisJLnN1cHBseQkJPSAidmRhYyIsCisJLmRldgkJPSAmb21hcDNfdG91Y2hib29rX2xjZF9kZXZpY2UuZGV2LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHRvdWNoYm9va192ZHZpX3N1cHBseSA9IHsKKwkuc3VwcGx5CQk9ICJ2ZHZpIiwKKwkuZGV2CQk9ICZvbWFwM190b3VjaGJvb2tfbGNkX2RldmljZS5kZXYsCit9OworCisvKiBWTU1DMSBmb3IgTU1DMSBwaW5zIENNRCwgQ0xLLCBEQVQwLi5EQVQzICgyMCBtQSwgcGx1cyBjYXJkID09IG1heCAyMjAgbUEpICovCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgdG91Y2hib29rX3ZtbWMxID0geworCS5jb25zdHJhaW50cyA9IHsKKwkJLm1pbl91VgkJCT0gMTg1MDAwMCwKKwkJLm1heF91VgkJCT0gMzE1MDAwMCwKKwkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKKwkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAorCQkudmFsaWRfb3BzX21hc2sJCT0gUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFCisJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9NT0RFCisJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSAmdG91Y2hib29rX3ZtbWMxX3N1cHBseSwKK307CisKKy8qIFZTSU0gZm9yIE1NQzEgcGlucyBEQVQ0Li5EQVQ3ICgyIG1BLCBwbHVzIGNhcmQgPT0gbWF4IDUwIG1BKSAqLworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIHRvdWNoYm9va192c2ltID0geworCS5jb25zdHJhaW50cyA9IHsKKwkJLm1pbl91VgkJCT0gMTgwMDAwMCwKKwkJLm1heF91VgkJCT0gMzAwMDAwMCwKKwkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKKwkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAorCQkudmFsaWRfb3BzX21hc2sJCT0gUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFCisJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9NT0RFCisJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSAmdG91Y2hib29rX3ZzaW1fc3VwcGx5LAorfTsKKworLyogVkRBQyBmb3IgRFNTIGRyaXZpbmcgUy1WaWRlbyAoOCBtQSB1bmxvYWRlZCwgbWF4IDY1IG1BKSAqLworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIHRvdWNoYm9va192ZGFjID0geworCS5jb25zdHJhaW50cyA9IHsKKwkJLm1pbl91VgkJCT0gMTgwMDAwMCwKKwkJLm1heF91VgkJCT0gMTgwMDAwMCwKKwkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKKwkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAorCQkudmFsaWRfb3BzX21hc2sJCT0gUkVHVUxBVE9SX0NIQU5HRV9NT0RFCisJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSAmdG91Y2hib29rX3ZkYWNfc3VwcGx5LAorfTsKKworLyogVlBMTDIgZm9yIGRpZ2l0YWwgdmlkZW8gb3V0cHV0cyAqLworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIHRvdWNoYm9va192cGxsMiA9IHsKKwkuY29uc3RyYWludHMgPSB7CisJCS5uYW1lCQkJPSAiVkRWSSIsCisJCS5taW5fdVYJCQk9IDE4MDAwMDAsCisJCS5tYXhfdVYJCQk9IDE4MDAwMDAsCisJCS52YWxpZF9tb2Rlc19tYXNrCT0gUkVHVUxBVE9SX01PREVfTk9STUFMCisJCQkJCXwgUkVHVUxBVE9SX01PREVfU1RBTkRCWSwKKwkJLnZhbGlkX29wc19tYXNrCQk9IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQorCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IDEsCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gJnRvdWNoYm9va192ZHZpX3N1cHBseSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHdsNDAzMF91c2JfZGF0YSB0b3VjaGJvb2tfdXNiX2RhdGEgPSB7CisJLnVzYl9tb2RlCT0gVDJfVVNCX01PREVfVUxQSSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9jb2RlY19hdWRpb19kYXRhIHRvdWNoYm9va19hdWRpb19kYXRhID0geworCS5hdWRpb19tY2xrID0gMjYwMDAwMDAsCit9OworCitzdGF0aWMgc3RydWN0IHR3bDQwMzBfY29kZWNfZGF0YSB0b3VjaGJvb2tfY29kZWNfZGF0YSA9IHsKKwkuYXVkaW9fbWNsayA9IDI2MDAwMDAwLAorCS5hdWRpbyA9ICZ0b3VjaGJvb2tfYXVkaW9fZGF0YSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9wbGF0Zm9ybV9kYXRhIHRvdWNoYm9va190d2xkYXRhID0geworCS5pcnFfYmFzZQk9IFRXTDQwMzBfSVJRX0JBU0UsCisJLmlycV9lbmQJPSBUV0w0MDMwX0lSUV9FTkQsCisKKwkvKiBwbGF0Zm9ybV9kYXRhIGZvciBjaGlsZHJlbiBnb2VzIGhlcmUgKi8KKwkudXNiCQk9ICZ0b3VjaGJvb2tfdXNiX2RhdGEsCisJLmdwaW8JCT0gJnRvdWNoYm9va19ncGlvX2RhdGEsCisJLmNvZGVjCQk9ICZ0b3VjaGJvb2tfY29kZWNfZGF0YSwKKwkudm1tYzEJCT0gJnRvdWNoYm9va192bW1jMSwKKwkudnNpbQkJPSAmdG91Y2hib29rX3ZzaW0sCisJLnZkYWMJCT0gJnRvdWNoYm9va192ZGFjLAorCS52cGxsMgkJPSAmdG91Y2hib29rX3ZwbGwyLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIHRvdWNoYm9va19pMmNfYm9hcmRpbmZvW10gPSB7CisJeworCQlJMkNfQk9BUkRfSU5GTygidHdsNDAzMCIsIDB4NDgpLAorCQkuZmxhZ3MgPSBJMkNfQ0xJRU5UX1dBS0UsCisJCS5pcnEgPSBJTlRfMzRYWF9TWVNfTklSUSwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmdG91Y2hib29rX3R3bGRhdGEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSB0b3VjaEJvb2tfaTJjX2JvYXJkaW5mb1tdID0geworCXsKKwkJSTJDX0JPQVJEX0lORk8oImJxMjcyMDAiLCAweDU1KSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgb21hcDNfdG91Y2hib29rX2kyY19pbml0KHZvaWQpCit7CisJLyogU3RhbmRhcmQgVG91Y2hCb29rIGJ1cyAqLworCW9tYXBfcmVnaXN0ZXJfaTJjX2J1cygxLCAyNjAwLCB0b3VjaGJvb2tfaTJjX2JvYXJkaW5mbywKKwkJCUFSUkFZX1NJWkUodG91Y2hib29rX2kyY19ib2FyZGluZm8pKTsKKworCS8qIEFkZGl0aW9uYWwgVG91Y2hCb29rIGJ1cyAqLworCW9tYXBfcmVnaXN0ZXJfaTJjX2J1cygzLCAxMDAsIHRvdWNoQm9va19pMmNfYm9hcmRpbmZvLAorCQkJQVJSQVlfU0laRSh0b3VjaEJvb2tfaTJjX2JvYXJkaW5mbykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwM19hZHM3ODQ2X2luaXQodm9pZCkKK3sKKwlpZiAoZ3Bpb19yZXF1ZXN0KE9NQVAzX1RTX0dQSU8sICJhZHM3ODQ2X3Blbl9kb3duIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVxdWVzdCBHUElPICVkIGZvciAiCisJCQkJImFkczc4NDYgcGVuIGRvd24gSVJRXG4iLCBPTUFQM19UU19HUElPKTsKKwkJcmV0dXJuOworCX0KKworCWdwaW9fZGlyZWN0aW9uX2lucHV0KE9NQVAzX1RTX0dQSU8pOworCW9tYXBfc2V0X2dwaW9fZGVib3VuY2UoT01BUDNfVFNfR1BJTywgMSk7CisJb21hcF9zZXRfZ3Bpb19kZWJvdW5jZV90aW1lKE9NQVAzX1RTX0dQSU8sIDB4YSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWRzNzg0Nl9wbGF0Zm9ybV9kYXRhIGFkczc4NDZfY29uZmlnID0geworCS54X21pbgkJCT0gMTAwLAorCS55X21pbgkJCT0gMjY1LAorCS54X21heAkJCT0gMzk1MCwKKwkueV9tYXgJCQk9IDM3NTAsCisJLnhfcGxhdGVfb2htcwkJPSA0MCwKKwkucHJlc3N1cmVfbWF4CQk9IDI1NSwKKwkuZGVib3VuY2VfbWF4CQk9IDEwLAorCS5kZWJvdW5jZV90b2wJCT0gNSwKKwkuZGVib3VuY2VfcmVwCQk9IDEsCisJLmdwaW9fcGVuZG93bgkJPSBPTUFQM19UU19HUElPLAorCS5rZWVwX3ZyZWZfb24JCT0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcDJfbWNzcGlfZGV2aWNlX2NvbmZpZyBhZHM3ODQ2X21jc3BpX2NvbmZpZyA9IHsKKwkudHVyYm9fbW9kZQk9IDAsCisJLnNpbmdsZV9jaGFubmVsCT0gMSwJLyogMDogc2xhdmUsIDE6IG1hc3RlciAqLworfTsKKworc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBvbWFwM19hZHM3ODQ2X3NwaV9ib2FyZF9pbmZvW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCS5tb2RhbGlhcwkJPSAiYWRzNzg0NiIsCisJCS5idXNfbnVtCQk9IDQsCisJCS5jaGlwX3NlbGVjdAkJPSAwLAorCQkubWF4X3NwZWVkX2h6CQk9IDE1MDAwMDAsCisJCS5jb250cm9sbGVyX2RhdGEJPSAmYWRzNzg0Nl9tY3NwaV9jb25maWcsCisJCS5pcnEJCQk9IE9NQVBfR1BJT19JUlEoT01BUDNfVFNfR1BJTyksCisJCS5wbGF0Zm9ybV9kYXRhCQk9ICZhZHM3ODQ2X2NvbmZpZywKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fbGVkIGdwaW9fbGVkc1tdID0geworCXsKKwkJLm5hbWUJCQk9ICJ0b3VjaGJvb2s6OnVzcjAiLAorCQkuZGVmYXVsdF90cmlnZ2VyCT0gImhlYXJ0YmVhdCIsCisJCS5ncGlvCQkJPSAxNTAsCisJfSwKKwl7CisJCS5uYW1lCQkJPSAidG91Y2hib29rOjp1c3IxIiwKKwkJLmRlZmF1bHRfdHJpZ2dlcgk9ICJtbWMwIiwKKwkJLmdwaW8JCQk9IDE0OSwKKwl9LAorCXsKKwkJLm5hbWUJCQk9ICJ0b3VjaGJvb2s6OnBtdV9zdGF0IiwKKwkJLmdwaW8JCQk9IC1FSU5WQUwsCS8qIGdldHMgcmVwbGFjZWQgKi8KKwkJLmFjdGl2ZV9sb3cJCT0gdHJ1ZSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2xlZF9wbGF0Zm9ybV9kYXRhIGdwaW9fbGVkX2luZm8gPSB7CisJLmxlZHMJCT0gZ3Bpb19sZWRzLAorCS5udW1fbGVkcwk9IEFSUkFZX1NJWkUoZ3Bpb19sZWRzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGxlZHNfZ3BpbyA9IHsKKwkubmFtZQk9ICJsZWRzLWdwaW8iLAorCS5pZAk9IC0xLAorCS5kZXYJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmdwaW9fbGVkX2luZm8sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbiBncGlvX2J1dHRvbnNbXSA9IHsKKwl7CisJCS5jb2RlCQkJPSBCVE5fRVhUUkEsCisJCS5ncGlvCQkJPSA3LAorCQkuZGVzYwkJCT0gInVzZXIiLAorCQkud2FrZXVwCQkJPSAxLAorCX0sCisJeworCQkuY29kZQkJCT0gS0VZX1BPV0VSLAorCQkuZ3BpbwkJCT0gMTgzLAorCQkuZGVzYwkJCT0gInBvd2VyIiwKKwkJLndha2V1cAkJCT0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2tleXNfcGxhdGZvcm1fZGF0YSBncGlvX2tleV9pbmZvID0geworCS5idXR0b25zCT0gZ3Bpb19idXR0b25zLAorCS5uYnV0dG9ucwk9IEFSUkFZX1NJWkUoZ3Bpb19idXR0b25zKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGtleXNfZ3BpbyA9IHsKKwkubmFtZQk9ICJncGlvLWtleXMiLAorCS5pZAk9IC0xLAorCS5kZXYJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmdwaW9fa2V5X2luZm8sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsIG9tYXAzX3RvdWNoYm9va19jb25maWdbXSBfX2luaXRkYXRhID0geworCXsgT01BUF9UQUdfTENELAkJJm9tYXAzX3RvdWNoYm9va19sY2RfY29uZmlnIH0sCit9OworCisjaWZkZWYgQ09ORklHX09NQVBfTVVYCitzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfbXV4IGJvYXJkX211eFtdIF9faW5pdGRhdGEgPSB7CisJeyAucmVnX29mZnNldCA9IE9NQVBfTVVYX1RFUk1JTkFUT1IgfSwKK307CisjZWxzZQorI2RlZmluZSBib2FyZF9tdXgJTlVMTAorI2VuZGlmCisKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwM190b3VjaGJvb2tfaW5pdF9pcnEodm9pZCkKK3sKKwlvbWFwM19tdXhfaW5pdChib2FyZF9tdXgsIE9NQVBfUEFDS0FHRV9DQkIpOworCW9tYXBfYm9hcmRfY29uZmlnID0gb21hcDNfdG91Y2hib29rX2NvbmZpZzsKKwlvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gQVJSQVlfU0laRShvbWFwM190b3VjaGJvb2tfY29uZmlnKTsKKwlvbWFwMl9pbml0X2NvbW1vbl9odyhtdDQ2aDMybTMybGY2X3NkcmNfcGFyYW1zLAorCQkJICAgICBtdDQ2aDMybTMybGY2X3NkcmNfcGFyYW1zKTsKKwlvbWFwX2luaXRfaXJxKCk7CisjaWZkZWYgQ09ORklHX09NQVBfMzJLX1RJTUVSCisJb21hcDJfZ3BfY2xvY2tldmVudF9zZXRfZ3B0aW1lcigxMik7CisjZW5kaWYKKwlvbWFwX2dwaW9faW5pdCgpOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb21hcDNfdG91Y2hib29rX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZvbWFwM190b3VjaGJvb2tfbGNkX2RldmljZSwKKwkmbGVkc19ncGlvLAorCSZrZXlzX2dwaW8sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgb21hcDN0b3VjaGJvb2tfZmxhc2hfaW5pdCh2b2lkKQoreworCXU4IGNzID0gMDsKKwl1OCBuYW5kY3MgPSBHUE1DX0NTX05VTSArIDE7CisKKwl1MzIgZ3BtY19iYXNlX2FkZCA9IE9NQVAzNFhYX0dQTUNfVklSVDsKKworCS8qIGZpbmQgb3V0IHRoZSBjaGlwLXNlbGVjdCBvbiB3aGljaCBOQU5EIGV4aXN0cyAqLworCXdoaWxlIChjcyA8IEdQTUNfQ1NfTlVNKSB7CisJCXUzMiByZXQgPSAwOworCQlyZXQgPSBncG1jX2NzX3JlYWRfcmVnKGNzLCBHUE1DX0NTX0NPTkZJRzEpOworCisJCWlmICgocmV0ICYgMHhDMDApID09IDB4ODAwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBOQU5EIG9uIENTJWRcbiIsIGNzKTsKKwkJCWlmIChuYW5kY3MgPiBHUE1DX0NTX05VTSkKKwkJCQluYW5kY3MgPSBjczsKKwkJfQorCQljcysrOworCX0KKworCWlmIChuYW5kY3MgPiBHUE1DX0NTX05VTSkgeworCQlwcmludGsoS0VSTl9JTkZPICJOQU5EOiBVbmFibGUgdG8gZmluZCBjb25maWd1cmF0aW9uICIKKwkJCQkgImluIEdQTUNcbiAiKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChuYW5kY3MgPCBHUE1DX0NTX05VTSkgeworCQlvbWFwM3RvdWNoYm9va19uYW5kX2RhdGEuY3MgPSBuYW5kY3M7CisJCW9tYXAzdG91Y2hib29rX25hbmRfZGF0YS5ncG1jX2NzX2Jhc2VhZGRyID0gKHZvaWQgKikKKwkJCShncG1jX2Jhc2VfYWRkICsgR1BNQ19DUzBfQkFTRSArIG5hbmRjcyAqIEdQTUNfQ1NfU0laRSk7CisJCW9tYXAzdG91Y2hib29rX25hbmRfZGF0YS5ncG1jX2Jhc2VhZGRyID0KKwkJCQkJCSh2b2lkICopIChncG1jX2Jhc2VfYWRkKTsKKworCQlwcmludGsoS0VSTl9JTkZPICJSZWdpc3RlcmluZyBOQU5EIG9uIENTJWRcbiIsIG5hbmRjcyk7CisJCWlmIChwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm9tYXAzdG91Y2hib29rX25hbmRfZGV2aWNlKSA8IDApCisJCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byByZWdpc3RlciBOQU5EIGRldmljZVxuIik7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGVoY2lfaGNkX29tYXBfcGxhdGZvcm1fZGF0YSBlaGNpX3BkYXRhIF9faW5pdGNvbnN0ID0geworCisJLnBvcnRfbW9kZVswXSA9IEVIQ0lfSENEX09NQVBfTU9ERV9QSFksCisJLnBvcnRfbW9kZVsxXSA9IEVIQ0lfSENEX09NQVBfTU9ERV9QSFksCisJLnBvcnRfbW9kZVsyXSA9IEVIQ0lfSENEX09NQVBfTU9ERV9VTktOT1dOLAorCisJLnBoeV9yZXNldCAgPSB0cnVlLAorCS5yZXNldF9ncGlvX3BvcnRbMF0gID0gLUVJTlZBTCwKKwkucmVzZXRfZ3Bpb19wb3J0WzFdICA9IDE0NywKKwkucmVzZXRfZ3Bpb19wb3J0WzJdICA9IC1FSU5WQUwKK307CisKK3N0YXRpYyB2b2lkIG9tYXAzX3RvdWNoYm9va19wb3dlcm9mZih2b2lkKQoreworCWludCByOworCisJciA9IGdwaW9fcmVxdWVzdChUQl9LSUxMX1BPV0VSX0dQSU8sICJEVkkgcmVzZXQiKTsKKwlpZiAociA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gZ2V0IGtpbGwgcG93ZXIgR1BJT1xuIik7CisJCXJldHVybjsKKwl9CisKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoVEJfS0lMTF9QT1dFUl9HUElPLCAwKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGVhcmx5X3RvdWNoYm9va19yZXZpc2lvbihjaGFyICoqcCkKK3sKKwlpZiAoISpwKQorCQlyZXR1cm47CisKKwlzdHJpY3Rfc3RydG91bCgqcCwgMTAsICZ0b3VjaGJvb2tfcmV2aXNpb24pOworfQorX19lYXJseV9wYXJhbSgidGJyPSIsIGVhcmx5X3RvdWNoYm9va19yZXZpc2lvbik7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwM190b3VjaGJvb2tfaW5pdCh2b2lkKQoreworCXBtX3Bvd2VyX29mZiA9IG9tYXAzX3RvdWNoYm9va19wb3dlcm9mZjsKKworCW9tYXAzX3RvdWNoYm9va19pMmNfaW5pdCgpOworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKG9tYXAzX3RvdWNoYm9va19kZXZpY2VzLAorCQkJQVJSQVlfU0laRShvbWFwM190b3VjaGJvb2tfZGV2aWNlcykpOworCW9tYXBfc2VyaWFsX2luaXQoKTsKKworCW9tYXBfbXV4X2luaXRfZ3BpbygxNzAsIE9NQVBfUElOX0lOUFVUKTsKKwlncGlvX3JlcXVlc3QoMTc2LCAiRFZJX25QRCIpOworCS8qIFJFVklTSVQgbGVhdmUgRFZJIHBvd2VyZWQgZG93biB1bnRpbCBpdCdzIG5lZWRlZCAuLi4gKi8KKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoMTc2LCB0cnVlKTsKKworCS8qIFRvdWNoc2NyZWVuIGFuZCBhY2NlbGVyb21ldGVyICovCisJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8ob21hcDNfYWRzNzg0Nl9zcGlfYm9hcmRfaW5mbywKKwkJCQlBUlJBWV9TSVpFKG9tYXAzX2Fkczc4NDZfc3BpX2JvYXJkX2luZm8pKTsKKwlvbWFwM19hZHM3ODQ2X2luaXQoKTsKKwl1c2JfbXVzYl9pbml0KCk7CisJdXNiX2VoY2lfaW5pdCgmZWhjaV9wZGF0YSk7CisJb21hcDN0b3VjaGJvb2tfZmxhc2hfaW5pdCgpOworCisJLyogRW5zdXJlIFNEUkMgcGlucyBhcmUgbXV4J2QgZm9yIHNlbGYtcmVmcmVzaCAqLworCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJzZHJjX2NrZTAiLCBPTUFQX1BJTl9PVVRQVVQpOworCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJzZHJjX2NrZTEiLCBPTUFQX1BJTl9PVVRQVVQpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgb21hcDNfdG91Y2hib29rX21hcF9pbyh2b2lkKQoreworCW9tYXAyX3NldF9nbG9iYWxzXzM0M3goKTsKKwlvbWFwMl9tYXBfY29tbW9uX2lvKCk7Cit9CisKK01BQ0hJTkVfU1RBUlQoVE9VQ0hCT09LLCAiT01BUDMgdG91Y2hib29rIEJvYXJkIikKKwkvKiBNYWludGFpbmVyOiBHcmVnb2lyZSBHZW50aWwgLSBodHRwOi8vd3d3LmFsd2F5c2lubm92YXRpbmcuY29tICovCisJLnBoeXNfaW8JPSAweDQ4MDAwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhkODAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLm1hcF9pbwkJPSBvbWFwM190b3VjaGJvb2tfbWFwX2lvLAorCS5pbml0X2lycQk9IG9tYXAzX3RvdWNoYm9va19pbml0X2lycSwKKwkuaW5pdF9tYWNoaW5lCT0gb21hcDNfdG91Y2hib29rX2luaXQsCisJLnRpbWVyCQk9ICZvbWFwX3RpbWVyLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb3Zlcm8uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb3Zlcm8uYwppbmRleCA1MmRmZDUxLi5kMTkyZGQ5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW92ZXJvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vdmVyby5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMvdHdsNDAzMC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy90d2wuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgogCiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgpAQCAtNDQsOSArNDQsOSBAQAogI2luY2x1ZGUgPHBsYXQvZ3BtYy5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxwbGF0L25hbmQuaD4KLSNpbmNsdWRlIDxwbGF0L211eC5oPgogI2luY2x1ZGUgPHBsYXQvdXNiLmg+CiAKKyNpbmNsdWRlICJtdXguaCIKICNpbmNsdWRlICJzZHJhbS1taWNyb24tbXQ0NmgzMm0zMmxmLTYuaCIKICNpbmNsdWRlICJtbWMtdHdsNDAzMC5oIgogCkBAIC00MDUsOSArNDA1LDE3IEBACiAJLnJlc2V0X2dwaW9fcG9ydFsyXSAgPSAtRUlOVkFMCiB9OwogCisjaWZkZWYgQ09ORklHX09NQVBfTVVYCitzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfbXV4IGJvYXJkX211eFtdIF9faW5pdGRhdGEgPSB7CisJeyAucmVnX29mZnNldCA9IE9NQVBfTVVYX1RFUk1JTkFUT1IgfSwKK307CisjZWxzZQorI2RlZmluZSBib2FyZF9tdXgJTlVMTAorI2VuZGlmCiAKIHN0YXRpYyB2b2lkIF9faW5pdCBvdmVyb19pbml0KHZvaWQpCiB7CisJb21hcDNfbXV4X2luaXQoYm9hcmRfbXV4LCBPTUFQX1BBQ0tBR0VfQ0JCKTsKIAlvdmVyb19pMmNfaW5pdCgpOwogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKG92ZXJvX2RldmljZXMsIEFSUkFZX1NJWkUob3Zlcm9fZGV2aWNlcykpOwogCW9tYXBfc2VyaWFsX2luaXQoKTsKQEAgLTQxOCw4ICs0MjYsOCBAQAogCW92ZXJvX2luaXRfc21zYzkxMXgoKTsKIAogCS8qIEVuc3VyZSBTRFJDIHBpbnMgYXJlIG11eCdkIGZvciBzZWxmLXJlZnJlc2ggKi8KLQlvbWFwX2NmZ19yZWcoSDE2XzM0WFhfU0RSQ19DS0UwKTsKLQlvbWFwX2NmZ19yZWcoSDE3XzM0WFhfU0RSQ19DS0UxKTsKKwlvbWFwX211eF9pbml0X3NpZ25hbCgic2RyY19ja2UwIiwgT01BUF9QSU5fT1VUUFVUKTsKKwlvbWFwX211eF9pbml0X3NpZ25hbCgic2RyY19ja2UxIiwgT01BUF9QSU5fT1VUUFVUKTsKIAogCWlmICgoZ3Bpb19yZXF1ZXN0KE9WRVJPX0dQSU9fVzJXX05SRVNFVCwKIAkJCSAgIk9WRVJPX0dQSU9fVzJXX05SRVNFVCIpID09IDApICYmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEtcGVyaXBoZXJhbHMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS1wZXJpcGhlcmFscy5jCmluZGV4IDE1Y2U2NTEuLjE3ZjNjOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS1wZXJpcGhlcmFscy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS1wZXJpcGhlcmFscy5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8cGxhdC9vbmVuYW5kLmg+CiAjaW5jbHVkZSA8cGxhdC9ncG1jLXNtYzkxeC5oPgogCisjaW5jbHVkZSAibXV4LmgiCiAjaW5jbHVkZSAibW1jLXR3bDQwMzAuaCIKIAogI2RlZmluZSBTWVNURU1fUkVWX0JfVVNFU19WQVVYMwkweDE2OTkKQEAgLTU5LDcgKzYwLDcgQEAKIAkJLmJ1c19udW0JCT0gNCwKIAkJLmNoaXBfc2VsZWN0CQk9IDAsCiAJCS5tYXhfc3BlZWRfaHogICAJPSA0ODAwMDAwMCwKLQkJLm1vZGUgICAgICAgICAgICAgICAgICAgPSBTUElfTU9ERV8yLAorCQkubW9kZSAgICAgICAgICAgICAgICAgICA9IFNQSV9NT0RFXzMsCiAJCS5jb250cm9sbGVyX2RhdGEJPSAmd2wxMjUxX21jc3BpX2NvbmZpZywKIAkJLnBsYXRmb3JtX2RhdGEJCT0gJndsMTI1MV9wZGF0YSwKIAl9LApAQCAtNDAxLDE1ICs0MDIsOSBAQAogCiBzdGF0aWMgc3RydWN0IHR3bDQwMzBfaW5zIHNsZWVwX29uX3NlcVtdIF9faW5pdGRhdGEgPSB7CiAvKgotICogVHVybiBvZmYgVkREMSBhbmQgVkREMi4KKyAqIFR1cm4gb2ZmIGV2ZXJ5dGhpbmcKICAqLwotCXtNU0dfU0lOR1VMQVIoREVWX0dSUF9QMSwgMHhmLCBSRVNfU1RBVEVfT0ZGKSwgNH0sCi0Je01TR19TSU5HVUxBUihERVZfR1JQX1AxLCAweDEwLCBSRVNfU1RBVEVfT0ZGKSwgMn0sCi0vKgotICogQW5kIGFsc28gdHVybiBvZmYgdGhlIE9NQVAzIFBMTHMgYW5kIHRoZSBzeXNjbGsgb3V0cHV0LgotICovCi0Je01TR19TSU5HVUxBUihERVZfR1JQX1AxLCAweDcsIFJFU19TVEFURV9PRkYpLCAzfSwKLQl7TVNHX1NJTkdVTEFSKERFVl9HUlBfUDEsIDB4MTcsIFJFU19TVEFURV9PRkYpLCAzfSwKKwl7TVNHX0JST0FEQ0FTVChERVZfR1JQX05VTEwsIFJFU19HUlBfQUxMLCAxLCAwLCBSRVNfU1RBVEVfU0xFRVApLCAyfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9zY3JpcHQgc2xlZXBfb25fc2NyaXB0IF9faW5pdGRhdGEgPSB7CkBAIC00MjAsMTQgKzQxNSw5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9pbnMgd2FrZXVwX3NlcVtdIF9faW5pdGRhdGEgPSB7CiAvKgotICogUmVlbmFibGUgdGhlIE9NQVAzIFBMTHMuCi0gKiBXYWtldXAgVkREMSBhbmQgVkREMi4KLSAqIFJlZW5hYmxlIHN5c2NsayBvdXRwdXQuCisgKiBSZWVuYWJsZSBldmVyeXRoaW5nCiAgKi8KLQl7TVNHX1NJTkdVTEFSKERFVl9HUlBfUDEsIDB4NywgUkVTX1NUQVRFX0FDVElWRSksIDB4MzB9LAotCXtNU0dfU0lOR1VMQVIoREVWX0dSUF9QMSwgMHhmLCBSRVNfU1RBVEVfQUNUSVZFKSwgMHgzMH0sCi0Je01TR19TSU5HVUxBUihERVZfR1JQX1AxLCAweDEwLCBSRVNfU1RBVEVfQUNUSVZFKSwgMHgzN30sCi0Je01TR19TSU5HVUxBUihERVZfR1JQX1AxLCAweDE5LCBSRVNfU1RBVEVfQUNUSVZFKSwgM30sCisJe01TR19CUk9BRENBU1QoREVWX0dSUF9OVUxMLCBSRVNfR1JQX0FMTCwgMSwgMCwgUkVTX1NUQVRFX0FDVElWRSksIDJ9LAogfTsKIAogc3RhdGljIHN0cnVjdCB0d2w0MDMwX3NjcmlwdCB3YWtldXBfc2NyaXB0IF9faW5pdGRhdGEgPSB7CkBAIC00MzgsMTAgKzQyOCw5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9pbnMgd2FrZXVwX3AzX3NlcVtdIF9faW5pdGRhdGEgPSB7CiAvKgotICogV2FrZXVwIFZERDEgKGR1bW15IHRvIGJlIGFibGUgdG8gaW5zZXJ0IGEgZGVsYXkpCi0gKiBFbmFibGUgQ0xLRU4KKyAqIFJlZW5hYmxlIGV2ZXJ5dGhpbmcKICAqLwotCXtNU0dfU0lOR1VMQVIoREVWX0dSUF9QMSwgMHgxNywgUkVTX1NUQVRFX0FDVElWRSksIDN9LAorCXtNU0dfQlJPQURDQVNUKERFVl9HUlBfTlVMTCwgUkVTX0dSUF9BTEwsIDEsIDAsIFJFU19TVEFURV9BQ1RJVkUpLCAyfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9zY3JpcHQgd2FrZXVwX3AzX3NjcmlwdCBfX2luaXRkYXRhID0gewpAQCAtNDYyLDEyICs0NTEsMTEgQEAKIAl7TVNHX1NJTkdVTEFSKERFVl9HUlBfTlVMTCwgUkVTX1JFU0VULCBSRVNfU1RBVEVfT0ZGKSwgMn0sCiAJe01TR19CUk9BRENBU1QoREVWX0dSUF9OVUxMLCBSRVNfR1JQX0FMTCwgMCwgMSwgUkVTX1NUQVRFX0FDVElWRSksCiAJCTB4MTN9LAotCXtNU0dfQlJPQURDQVNUKERFVl9HUlBfTlVMTCwgUkVTX0dSUF9QUCwgMCwgMiwgUkVTX1NUQVRFX1dSU1QpLCAweDEzfSwKIAl7TVNHX0JST0FEQ0FTVChERVZfR1JQX05VTEwsIFJFU19HUlBfUFAsIDAsIDMsIFJFU19TVEFURV9PRkYpLCAweDEzfSwKIAl7TVNHX1NJTkdVTEFSKERFVl9HUlBfTlVMTCwgUkVTX1ZERDEsIFJFU19TVEFURV9XUlNUKSwgMHgxM30sCiAJe01TR19TSU5HVUxBUihERVZfR1JQX05VTEwsIFJFU19WREQyLCBSRVNfU1RBVEVfV1JTVCksIDB4MTN9LAogCXtNU0dfU0lOR1VMQVIoREVWX0dSUF9OVUxMLCBSRVNfVlBMTDEsIFJFU19TVEFURV9XUlNUKSwgMHgzNX0sCi0Je01TR19TSU5HVUxBUihERVZfR1JQX1AxLCBSRVNfSEZDTEtPVVQsIFJFU19TVEFURV9BQ1RJVkUpLCAyfSwKKwl7TVNHX1NJTkdVTEFSKERFVl9HUlBfUDMsIFJFU19IRkNMS09VVCwgUkVTX1NUQVRFX0FDVElWRSksIDJ9LAogCXtNU0dfU0lOR1VMQVIoREVWX0dSUF9OVUxMLCBSRVNfUkVTRVQsIFJFU19TVEFURV9BQ1RJVkUpLCAyfSwKIH07CiAKQEAgLTQ4OSwyMiArNDc3LDgxIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHR3bDQwMzBfcmVzY29uZmlnIHR3bDQwMzBfcmNvbmZpZ1tdIF9faW5pdGRhdGEgPSB7Ci0JeyAucmVzb3VyY2UgPSBSRVNfVklOVEFOQTEsIC5kZXZncm91cCA9IC0xLCAudHlwZSA9IC0xLCAudHlwZTIgPSAxIH0sCi0JeyAucmVzb3VyY2UgPSBSRVNfVklOVEFOQTIsIC5kZXZncm91cCA9IC0xLCAudHlwZSA9IC0xLCAudHlwZTIgPSAxIH0sCi0JeyAucmVzb3VyY2UgPSBSRVNfVklOVERJRywgLmRldmdyb3VwID0gLTEsIC50eXBlID0gLTEsIC50eXBlMiA9IDEgfSwKLQl7IC5yZXNvdXJjZSA9IFJFU19WTU1DMSwgLmRldmdyb3VwID0gLTEsIC50eXBlID0gLTEsIC50eXBlMiA9IDN9LAotCXsgLnJlc291cmNlID0gUkVTX1ZNTUMyLCAuZGV2Z3JvdXAgPSBERVZfR1JQX05VTEwsIC50eXBlID0gLTEsCi0JICAudHlwZTIgPSAzfSwKLQl7IC5yZXNvdXJjZSA9IFJFU19WQVVYMSwgLmRldmdyb3VwID0gLTEsIC50eXBlID0gLTEsIC50eXBlMiA9IDN9LAotCXsgLnJlc291cmNlID0gUkVTX1ZBVVgyLCAuZGV2Z3JvdXAgPSAtMSwgLnR5cGUgPSAtMSwgLnR5cGUyID0gM30sCi0JeyAucmVzb3VyY2UgPSBSRVNfVkFVWDMsIC5kZXZncm91cCA9IC0xLCAudHlwZSA9IC0xLCAudHlwZTIgPSAzfSwKLQl7IC5yZXNvdXJjZSA9IFJFU19WQVVYNCwgLmRldmdyb3VwID0gLTEsIC50eXBlID0gLTEsIC50eXBlMiA9IDN9LAotCXsgLnJlc291cmNlID0gUkVTX1ZQTEwyLCAuZGV2Z3JvdXAgPSAtMSwgLnR5cGUgPSAtMSwgLnR5cGUyID0gM30sCi0JeyAucmVzb3VyY2UgPSBSRVNfVkRBQywgLmRldmdyb3VwID0gLTEsIC50eXBlID0gLTEsIC50eXBlMiA9IDN9LAotCXsgLnJlc291cmNlID0gUkVTX1ZTSU0sIC5kZXZncm91cCA9IERFVl9HUlBfTlVMTCwgLnR5cGUgPSAtMSwKLQkgIC50eXBlMiA9IDN9LAotCXsgLnJlc291cmNlID0gUkVTX0NMS0VOLCAuZGV2Z3JvdXAgPSBERVZfR1JQX1AzLCAudHlwZSA9IC0xLAotCQkudHlwZTIgPSAxIH0sCisJeyAucmVzb3VyY2UgPSBSRVNfVkREMSwgLmRldmdyb3VwID0gLTEsCisJICAudHlwZSA9IDEsIC50eXBlMiA9IC0xLCAucmVtYXBfb2ZmID0gUkVTX1NUQVRFX09GRiwKKwkgIC5yZW1hcF9zbGVlcCA9IFJFU19TVEFURV9PRkYKKwl9LAorCXsgLnJlc291cmNlID0gUkVTX1ZERDIsIC5kZXZncm91cCA9IC0xLAorCSAgLnR5cGUgPSAxLCAudHlwZTIgPSAtMSwgLnJlbWFwX29mZiA9IFJFU19TVEFURV9PRkYsCisJICAucmVtYXBfc2xlZXAgPSBSRVNfU1RBVEVfT0ZGCisJfSwKKwl7IC5yZXNvdXJjZSA9IFJFU19WUExMMSwgLmRldmdyb3VwID0gLTEsCisJICAudHlwZSA9IDEsIC50eXBlMiA9IC0xLCAucmVtYXBfb2ZmID0gUkVTX1NUQVRFX09GRiwKKwkgIC5yZW1hcF9zbGVlcCA9IFJFU19TVEFURV9PRkYKKwl9LAorCXsgLnJlc291cmNlID0gUkVTX1ZQTEwyLCAuZGV2Z3JvdXAgPSAtMSwKKwkgIC50eXBlID0gLTEsIC50eXBlMiA9IDMsIC5yZW1hcF9vZmYgPSAtMSwgLnJlbWFwX3NsZWVwID0gLTEKKwl9LAorCXsgLnJlc291cmNlID0gUkVTX1ZBVVgxLCAuZGV2Z3JvdXAgPSAtMSwKKwkgIC50eXBlID0gLTEsIC50eXBlMiA9IDMsIC5yZW1hcF9vZmYgPSAtMSwgLnJlbWFwX3NsZWVwID0gLTEKKwl9LAorCXsgLnJlc291cmNlID0gUkVTX1ZBVVgyLCAuZGV2Z3JvdXAgPSAtMSwKKwkgIC50eXBlID0gLTEsIC50eXBlMiA9IDMsIC5yZW1hcF9vZmYgPSAtMSwgLnJlbWFwX3NsZWVwID0gLTEKKwl9LAorCXsgLnJlc291cmNlID0gUkVTX1ZBVVgzLCAuZGV2Z3JvdXAgPSAtMSwKKwkgIC50eXBlID0gLTEsIC50eXBlMiA9IDMsIC5yZW1hcF9vZmYgPSAtMSwgLnJlbWFwX3NsZWVwID0gLTEKKwl9LAorCXsgLnJlc291cmNlID0gUkVTX1ZBVVg0LCAuZGV2Z3JvdXAgPSAtMSwKKwkgIC50eXBlID0gLTEsIC50eXBlMiA9IDMsIC5yZW1hcF9vZmYgPSAtMSwgLnJlbWFwX3NsZWVwID0gLTEKKwl9LAorCXsgLnJlc291cmNlID0gUkVTX1ZNTUMxLCAuZGV2Z3JvdXAgPSAtMSwKKwkgIC50eXBlID0gLTEsIC50eXBlMiA9IDMsIC5yZW1hcF9vZmYgPSAtMSwgLnJlbWFwX3NsZWVwID0gLTEKKwl9LAorCXsgLnJlc291cmNlID0gUkVTX1ZNTUMyLCAuZGV2Z3JvdXAgPSAtMSwKKwkgIC50eXBlID0gLTEsIC50eXBlMiA9IDMsIC5yZW1hcF9vZmYgPSAtMSwgLnJlbWFwX3NsZWVwID0gLTEKKwl9LAorCXsgLnJlc291cmNlID0gUkVTX1ZEQUMsIC5kZXZncm91cCA9IC0xLAorCSAgLnR5cGUgPSAtMSwgLnR5cGUyID0gMywgLnJlbWFwX29mZiA9IC0xLCAucmVtYXBfc2xlZXAgPSAtMQorCX0sCisJeyAucmVzb3VyY2UgPSBSRVNfVlNJTSwgLmRldmdyb3VwID0gLTEsCisJICAudHlwZSA9IC0xLCAudHlwZTIgPSAzLCAucmVtYXBfb2ZmID0gLTEsIC5yZW1hcF9zbGVlcCA9IC0xCisJfSwKKwl7IC5yZXNvdXJjZSA9IFJFU19WSU5UQU5BMSwgLmRldmdyb3VwID0gREVWX0dSUF9QMSB8IERFVl9HUlBfUDMsCisJICAudHlwZSA9IC0xLCAudHlwZTIgPSAtMSwgLnJlbWFwX29mZiA9IC0xLCAucmVtYXBfc2xlZXAgPSAtMQorCX0sCisJeyAucmVzb3VyY2UgPSBSRVNfVklOVEFOQTIsIC5kZXZncm91cCA9IERFVl9HUlBfUDEgfCBERVZfR1JQX1AzLAorCSAgLnR5cGUgPSAxLCAudHlwZTIgPSAtMSwgLnJlbWFwX29mZiA9IC0xLCAucmVtYXBfc2xlZXAgPSAtMQorCX0sCisJeyAucmVzb3VyY2UgPSBSRVNfVklOVERJRywgLmRldmdyb3VwID0gREVWX0dSUF9QMSB8IERFVl9HUlBfUDMsCisJICAudHlwZSA9IC0xLCAudHlwZTIgPSAtMSwgLnJlbWFwX29mZiA9IC0xLCAucmVtYXBfc2xlZXAgPSAtMQorCX0sCisJeyAucmVzb3VyY2UgPSBSRVNfVklPLCAuZGV2Z3JvdXAgPSBERVZfR1JQX1AzLAorCSAgLnR5cGUgPSAxLCAudHlwZTIgPSAtMSwgLnJlbWFwX29mZiA9IC0xLCAucmVtYXBfc2xlZXAgPSAtMQorCX0sCisJeyAucmVzb3VyY2UgPSBSRVNfQ0xLRU4sIC5kZXZncm91cCA9IERFVl9HUlBfUDEgfCBERVZfR1JQX1AzLAorCSAgLnR5cGUgPSAxLCAudHlwZTIgPSAtMSAsIC5yZW1hcF9vZmYgPSAtMSwgLnJlbWFwX3NsZWVwID0gLTEKKwl9LAorCXsgLnJlc291cmNlID0gUkVTX1JFR0VOLCAuZGV2Z3JvdXAgPSBERVZfR1JQX1AxIHwgREVWX0dSUF9QMywKKwkgIC50eXBlID0gMSwgLnR5cGUyID0gLTEsIC5yZW1hcF9vZmYgPSAtMSwgLnJlbWFwX3NsZWVwID0gLTEKKwl9LAorCXsgLnJlc291cmNlID0gUkVTX05SRVNfUFdST04sIC5kZXZncm91cCA9IERFVl9HUlBfUDEgfCBERVZfR1JQX1AzLAorCSAgLnR5cGUgPSAxLCAudHlwZTIgPSAtMSwgLnJlbWFwX29mZiA9IC0xLCAucmVtYXBfc2xlZXAgPSAtMQorCX0sCisJeyAucmVzb3VyY2UgPSBSRVNfU1lTRU4sIC5kZXZncm91cCA9IERFVl9HUlBfUDEgfCBERVZfR1JQX1AzLAorCSAgLnR5cGUgPSAxLCAudHlwZTIgPSAtMSwgLnJlbWFwX29mZiA9IC0xLCAucmVtYXBfc2xlZXAgPSAtMQorCX0sCisJeyAucmVzb3VyY2UgPSBSRVNfSEZDTEtPVVQsIC5kZXZncm91cCA9IERFVl9HUlBfUDMsCisJICAudHlwZSA9IDEsIC50eXBlMiA9IC0xLCAucmVtYXBfb2ZmID0gLTEsIC5yZW1hcF9zbGVlcCA9IC0xCisJfSwKKwl7IC5yZXNvdXJjZSA9IFJFU18zMktDTEtPVVQsIC5kZXZncm91cCA9IC0xLAorCSAgLnR5cGUgPSAxLCAudHlwZTIgPSAtMSwgLnJlbWFwX29mZiA9IC0xLCAucmVtYXBfc2xlZXAgPSAtMQorCX0sCisJeyAucmVzb3VyY2UgPSBSRVNfUkVTRVQsIC5kZXZncm91cCA9IC0xLAorCSAgLnR5cGUgPSAxLCAudHlwZTIgPSAtMSwgLnJlbWFwX29mZiA9IC0xLCAucmVtYXBfc2xlZXAgPSAtMQorCX0sCisJeyAucmVzb3VyY2UgPSBSRVNfTWFpbl9SZWYsIC5kZXZncm91cCA9IC0xLAorCSAgLnR5cGUgPSAxLCAudHlwZTIgPSAtMSwgLnJlbWFwX29mZiA9IC0xLCAucmVtYXBfc2xlZXAgPSAtMQorCX0sCiAJeyAwLCAwfSwKIH07CiAKQEAgLTYzMCw5ICs2NzcsOSBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgYm9hcmRfc21jOTF4X2luaXQodm9pZCkKIHsKLQlvbWFwX2NmZ19yZWcoVThfMzRYWF9HUElPNTRfRE9XTik7Ci0Jb21hcF9jZmdfcmVnKEcyNV8zNFhYX0dQSU84Nl9PVVQpOwotCW9tYXBfY2ZnX3JlZyhIMTlfMzRYWF9HUElPMTY0X09VVCk7CisJb21hcF9tdXhfaW5pdF9ncGlvKDU0LCBPTUFQX1BJTl9JTlBVVF9QVUxMRE9XTik7CisJb21hcF9tdXhfaW5pdF9ncGlvKDg2LCBPTUFQX1BJTl9PVVRQVVQpOworCW9tYXBfbXV4X2luaXRfZ3BpbygxNjQsIE9NQVBfUElOX09VVFBVVCk7CiAKIAlncG1jX3NtYzkxeF9pbml0KCZib2FyZF9zbWM5MXhfZGF0YSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS5jCmluZGV4IDFiYjFkZTIuLjY3YmIzNDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS5jCkBAIC0yMywxMyArMjMsMTQgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAogI2luY2x1ZGUgPHBsYXQvbWNzcGkuaD4KLSNpbmNsdWRlIDxwbGF0L211eC5oPgogI2luY2x1ZGUgPHBsYXQvYm9hcmQuaD4KICNpbmNsdWRlIDxwbGF0L2NvbW1vbi5oPgogI2luY2x1ZGUgPHBsYXQvZG1hLmg+CiAjaW5jbHVkZSA8cGxhdC9ncG1jLmg+CiAjaW5jbHVkZSA8cGxhdC91c2IuaD4KIAorI2luY2x1ZGUgIm11eC5oIgorCiBzdHJ1Y3Qgb21hcF9zZHJjX3BhcmFtcyAqcng1MV9nZXRfc2RyYW1fdGltaW5ncyh2b2lkKTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2xjZF9jb25maWcgcng1MV9sY2RfY29uZmlnID0gewpAQCAtNjksMTUgKzcwLDI0IEBACiAKIGV4dGVybiB2b2lkIF9faW5pdCByeDUxX3BlcmlwaGVyYWxzX2luaXQodm9pZCk7CiAKKyNpZmRlZiBDT05GSUdfT01BUF9NVVgKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9tdXggYm9hcmRfbXV4W10gX19pbml0ZGF0YSA9IHsKKwl7IC5yZWdfb2Zmc2V0ID0gT01BUF9NVVhfVEVSTUlOQVRPUiB9LAorfTsKKyNlbHNlCisjZGVmaW5lIGJvYXJkX211eAlOVUxMCisjZW5kaWYKKwogc3RhdGljIHZvaWQgX19pbml0IHJ4NTFfaW5pdCh2b2lkKQogeworCW9tYXAzX211eF9pbml0KGJvYXJkX211eCwgT01BUF9QQUNLQUdFX0NCQik7CiAJb21hcF9zZXJpYWxfaW5pdCgpOwogCXVzYl9tdXNiX2luaXQoKTsKIAlyeDUxX3BlcmlwaGVyYWxzX2luaXQoKTsKIAogCS8qIEVuc3VyZSBTRFJDIHBpbnMgYXJlIG11eCdkIGZvciBzZWxmLXJlZnJlc2ggKi8KLQlvbWFwX2NmZ19yZWcoSDE2XzM0WFhfU0RSQ19DS0UwKTsKLQlvbWFwX2NmZ19yZWcoSDE3XzM0WFhfU0RSQ19DS0UxKTsKKwlvbWFwX211eF9pbml0X3NpZ25hbCgic2RyY19ja2UwIiwgT01BUF9QSU5fT1VUUFVUKTsKKwlvbWFwX211eF9pbml0X3NpZ25hbCgic2RyY19ja2UxIiwgT01BUF9QSU5fT1VUUFVUKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IHJ4NTFfbWFwX2lvKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXpvb20tcGVyaXBoZXJhbHMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtem9vbS1wZXJpcGhlcmFscy5jCmluZGV4IGYxNGJhYTMuLjI1ODc5NGQgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtem9vbS1wZXJpcGhlcmFscy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtem9vbS1wZXJpcGhlcmFscy5jCkBAIC0xNTIsMTQgKzE1MiwyMCBAQAogCiBzdGF0aWMgc3RydWN0IHR3bDQwMzBfaHNtbWNfaW5mbyBtbWNbXSBfX2luaXRkYXRhID0gewogCXsKKwkJLm5hbWUJCT0gImV4dGVybmFsIiwKIAkJLm1tYwkJPSAxLAogCQkud2lyZXMJCT0gNCwKIAkJLmdwaW9fd3AJPSAtRUlOVkFMLAorCQkucG93ZXJfc2F2aW5nCT0gdHJ1ZSwKIAl9LAogCXsKKwkJLm5hbWUJCT0gImludGVybmFsIiwKIAkJLm1tYwkJPSAyLAotCQkud2lyZXMJCT0gNCwKKwkJLndpcmVzCQk9IDgsCisJCS5ncGlvX2NkCT0gLUVJTlZBTCwKIAkJLmdwaW9fd3AJPSAtRUlOVkFMLAorCQkubm9ucmVtb3ZhYmxlCT0gdHJ1ZSwKKwkJLnBvd2VyX3NhdmluZwk9IHRydWUsCiAJfSwKIAl7fSAgICAgIC8qIFRlcm1pbmF0b3IgKi8KIH07CkBAIC0xNjcsMTEgKzE3Myw4IEBACiBzdGF0aWMgaW50IHpvb21fdHdsX2dwaW9fc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAogCQl1bnNpZ25lZCBncGlvLCB1bnNpZ25lZCBuZ3BpbykKIHsKLQkvKiBncGlvICsgMCBpcyAibW1jMF9jZCIgKGlucHV0L0lSUSksCi0JICogZ3BpbyArIDEgaXMgIm1tYzFfY2QiIChpbnB1dC9JUlEpCi0JICovCisJLyogZ3BpbyArIDAgaXMgIm1tYzBfY2QiIChpbnB1dC9JUlEpICovCiAJbW1jWzBdLmdwaW9fY2QgPSBncGlvICsgMDsKLQltbWNbMV0uZ3Bpb19jZCA9IGdwaW8gKyAxOwogCXR3bDQwMzBfbW1jX2luaXQobW1jKTsKIAogCS8qIGxpbmsgcmVndWxhdG9ycyB0byBNTUMgYWRhcHRlcnMgLi4uIHdlICJrbm93IiB0aGUKQEAgLTIzNiw2ICsyMzksNyBAQAogCS5ncGlvCQk9ICZ6b29tX2dwaW9fZGF0YSwKIAkua2V5cGFkCQk9ICZ6b29tX2twX3R3bDQwMzBfZGF0YSwKIAkuY29kZWMJCT0gJnpvb21fY29kZWNfZGF0YSwKKwkudm1tYzEgICAgICAgICAgPSAmem9vbV92bW1jMSwKIAkudm1tYzIgICAgICAgICAgPSAmem9vbV92bW1jMiwKIAkudnNpbSAgICAgICAgICAgPSAmem9vbV92c2ltLAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXpvb20yLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXpvb20yLmMKaW5kZXggZDk0ZDA0Ny4uYmI4N2NmNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC16b29tMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtem9vbTIuYwpAQCAtMjMsNiArMjMsNyBAQAogCiAjaW5jbHVkZSA8bWFjaC9ib2FyZC16b29tLmg+CiAKKyNpbmNsdWRlICJtdXguaCIKICNpbmNsdWRlICJzZHJhbS1taWNyb24tbXQ0NmgzMm0zMmxmLTYuaCIKIAogc3RhdGljIHZvaWQgX19pbml0IG9tYXBfem9vbTJfaW5pdF9pcnEodm9pZCkKQEAgLTY4LDggKzY5LDE3IEBACiAKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX09NQVBfTVVYCitzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfbXV4IGJvYXJkX211eFtdIF9faW5pdGRhdGEgPSB7CisJeyAucmVnX29mZnNldCA9IE9NQVBfTVVYX1RFUk1JTkFUT1IgfSwKK307CisjZWxzZQorI2RlZmluZSBib2FyZF9tdXgJTlVMTAorI2VuZGlmCisKIHN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX3pvb20yX2luaXQodm9pZCkKIHsKKwlvbWFwM19tdXhfaW5pdChib2FyZF9tdXgsIE9NQVBfUEFDS0FHRV9DQkIpOwogCXpvb21fcGVyaXBoZXJhbHNfaW5pdCgpOwogCXpvb21fZGVidWdib2FyZF9pbml0KCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXpvb20zLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXpvb20zLmMKaW5kZXggOGQ5NjVhNi4uYTlmZTkxOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC16b29tMy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtem9vbTMuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPHBsYXQvY29tbW9uLmg+CiAjaW5jbHVkZSA8cGxhdC9ib2FyZC5oPgogCisjaW5jbHVkZSAibXV4LmgiCiAjaW5jbHVkZSAic2RyYW0taHluaXgtaDhtYngwMHUwbWVyLTBlbS5oIgogCiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcF96b29tX21hcF9pbyh2b2lkKQpAQCAtNDIsOCArNDMsMTcgQEAKIAlvbWFwX2dwaW9faW5pdCgpOwogfQogCisjaWZkZWYgQ09ORklHX09NQVBfTVVYCitzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfbXV4IGJvYXJkX211eFtdIF9faW5pdGRhdGEgPSB7CisJeyAucmVnX29mZnNldCA9IE9NQVBfTVVYX1RFUk1JTkFUT1IgfSwKK307CisjZWxzZQorI2RlZmluZSBib2FyZF9tdXgJTlVMTAorI2VuZGlmCisKIHN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX3pvb21faW5pdCh2b2lkKQogeworCW9tYXAzX211eF9pbml0KGJvYXJkX211eCwgT01BUF9QQUNLQUdFX0NCUCk7CiAJem9vbV9wZXJpcGhlcmFsc19pbml0KCk7CiAJem9vbV9kZWJ1Z2JvYXJkX2luaXQoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2suYwppbmRleCA0NzE2MjA2Li43NTljNzJhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jay5jCkBAIC03MCw5ICs3MCw0MSBAQAogdTggY3B1X21hc2s7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogT01BUDIvMyBzcGVjaWZpYyBjbG9jayBmdW5jdGlvbnMKKyAqIE9NQVAyLzMvNCBzcGVjaWZpYyBjbG9jayBmdW5jdGlvbnMKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKK3ZvaWQgb21hcDJfaW5pdF9kcGxsX3BhcmVudChzdHJ1Y3QgY2xrICpjbGspCit7CisJdTMyIHY7CisJc3RydWN0IGRwbGxfZGF0YSAqZGQ7CisKKwlkZCA9IGNsay0+ZHBsbF9kYXRhOworCWlmICghZGQpCisJCXJldHVybjsKKworCS8qIFJldHVybiBieXBhc3MgcmF0ZSBpZiBEUExMIGlzIGJ5cGFzc2VkICovCisJdiA9IF9fcmF3X3JlYWRsKGRkLT5jb250cm9sX3JlZyk7CisJdiAmPSBkZC0+ZW5hYmxlX21hc2s7CisJdiA+Pj0gX19mZnMoZGQtPmVuYWJsZV9tYXNrKTsKKworCS8qIFJlcGFyZW50IGluIGNhc2UgdGhlIGRwbGwgaXMgaW4gYnlwYXNzICovCisJaWYgKGNwdV9pc19vbWFwMjR4eCgpKSB7CisJCWlmICh2ID09IE9NQVAyWFhYX0VOX0RQTExfTFBCWVBBU1MgfHwKKwkJICAgIHYgPT0gT01BUDJYWFhfRU5fRFBMTF9GUkJZUEFTUykKKwkJCWNsa19yZXBhcmVudChjbGssIGRkLT5jbGtfYnlwYXNzKTsKKwl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMzR4eCgpKSB7CisJCWlmICh2ID09IE9NQVAzWFhYX0VOX0RQTExfTFBCWVBBU1MgfHwKKwkJICAgIHYgPT0gT01BUDNYWFhfRU5fRFBMTF9GUkJZUEFTUykKKwkJCWNsa19yZXBhcmVudChjbGssIGRkLT5jbGtfYnlwYXNzKTsKKwl9IGVsc2UgaWYgKGNwdV9pc19vbWFwNDR4eCgpKSB7CisJCWlmICh2ID09IE9NQVA0WFhYX0VOX0RQTExfTFBCWVBBU1MgfHwKKwkJICAgIHYgPT0gT01BUDRYWFhfRU5fRFBMTF9GUkJZUEFTUyB8fAorCQkgICAgdiA9PSBPTUFQNFhYWF9FTl9EUExMX01OQllQQVNTKQorCQkJY2xrX3JlcGFyZW50KGNsaywgZGQtPmNsa19ieXBhc3MpOworCX0KKwlyZXR1cm47Cit9CisKIC8qKgogICogX29tYXAyeHh4X2Nsa19jb21taXQgLSBjb21taXQgY2xvY2sgcGFyZW50L3JhdGUgY2hhbmdlcyBpbiBoYXJkd2FyZQogICogQGNsazogc3RydWN0IGNsayAqCkBAIC0xNDksNiArMTgxLDcgQEAKICAqIGNsb2NrZG9tYWluIHBvaW50ZXIsIGFuZCBzYXZlIGl0IGludG8gdGhlIHN0cnVjdCBjbGsuICBJbnRlbmRlZCB0byBiZQogICogY2FsbGVkIGR1cmluZyBjbGtfcmVnaXN0ZXIoKS4gIE5vIHJldHVybiB2YWx1ZS4KICAqLworI2lmbmRlZiBDT05GSUdfQVJDSF9PTUFQNCAvKiBGSVhNRTogUmVtb3ZlIHRoaXMgb25jZSBjbGtkbSBmL3cgaXMgaW4gcGxhY2UgKi8KIHZvaWQgb21hcDJfaW5pdF9jbGtfY2xrZG0oc3RydWN0IGNsayAqY2xrKQogewogCXN0cnVjdCBjbG9ja2RvbWFpbiAqY2xrZG07CkBAIC0xNjYsNiArMTk5LDcgQEAKIAkJCSAiY2xrZG0gJXNcbiIsIGNsay0+bmFtZSwgY2xrLT5jbGtkbV9uYW1lKTsKIAl9CiB9CisjZW5kaWYKIAogLyoqCiAgKiBvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQgLSBzZXQgYSBjbGtzZWwgY2xrJ3MgcGFyZW50IGZpZWxkIGZyb20gdGhlIGhhcmR3YXJlCkBAIC0yNDcsNiArMjgxLDExIEBACiAJCWlmICh2ID09IE9NQVAzWFhYX0VOX0RQTExfTFBCWVBBU1MgfHwKIAkJICAgIHYgPT0gT01BUDNYWFhfRU5fRFBMTF9GUkJZUEFTUykKIAkJCXJldHVybiBkZC0+Y2xrX2J5cGFzcy0+cmF0ZTsKKwl9IGVsc2UgaWYgKGNwdV9pc19vbWFwNDR4eCgpKSB7CisJCWlmICh2ID09IE9NQVA0WFhYX0VOX0RQTExfTFBCWVBBU1MgfHwKKwkJICAgIHYgPT0gT01BUDRYWFhfRU5fRFBMTF9GUkJZUEFTUyB8fAorCQkgICAgdiA9PSBPTUFQNFhYWF9FTl9EUExMX01OQllQQVNTKQorCQkJcmV0dXJuIGRkLT5jbGtfYnlwYXNzLT5yYXRlOwogCX0KIAogCXYgPSBfX3Jhd19yZWFkbChkZC0+bXVsdF9kaXYxX3JlZyk7CkBAIC00MzcsOCArNDc2LDEwIEBACiAJCV9vbWFwMl9jbGtfZGlzYWJsZShjbGspOwogCQlpZiAoY2xrLT5wYXJlbnQpCiAJCQlvbWFwMl9jbGtfZGlzYWJsZShjbGstPnBhcmVudCk7CisjaWZuZGVmIENPTkZJR19BUkNIX09NQVA0IC8qIEZJWE1FOiBSZW1vdmUgdGhpcyBvbmNlIGNsa2RtIGYvdyBpcyBpbiBwbGFjZSAqLwogCQlpZiAoY2xrLT5jbGtkbSkKIAkJCW9tYXAyX2Nsa2RtX2Nsa19kaXNhYmxlKGNsay0+Y2xrZG0sIGNsayk7CisjZW5kaWYKIAogCX0KIH0KQEAgLTQ0OCw4ICs0ODksMTAgQEAKIAlpbnQgcmV0ID0gMDsKIAogCWlmIChjbGstPnVzZWNvdW50KysgPT0gMCkgeworI2lmbmRlZiBDT05GSUdfQVJDSF9PTUFQNCAvKiBGSVhNRTogUmVtb3ZlIHRoaXMgb25jZSBjbGtkbSBmL3cgaXMgaW4gcGxhY2UgKi8KIAkJaWYgKGNsay0+Y2xrZG0pCiAJCQlvbWFwMl9jbGtkbV9jbGtfZW5hYmxlKGNsay0+Y2xrZG0sIGNsayk7CisjZW5kaWYKIAogCQlpZiAoY2xrLT5wYXJlbnQpIHsKIAkJCXJldCA9IG9tYXAyX2Nsa19lbmFibGUoY2xrLT5wYXJlbnQpOwpAQCAtNDY4LDggKzUxMSwxMCBAQAogCXJldHVybiByZXQ7CiAKIGVycjoKKyNpZm5kZWYgQ09ORklHX0FSQ0hfT01BUDQgLyogRklYTUU6IFJlbW92ZSB0aGlzIG9uY2UgY2xrZG0gZi93IGlzIGluIHBsYWNlICovCiAJaWYgKGNsay0+Y2xrZG0pCiAJCW9tYXAyX2Nsa2RtX2Nsa19kaXNhYmxlKGNsay0+Y2xrZG0sIGNsayk7CisjZW5kaWYKIAljbGstPnVzZWNvdW50LS07CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2suaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2suaAppbmRleCA0M2I2YmVkLi45M2M0OGRmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jay5oCkBAIC0xLDggKzEsOCBAQAogLyoKICAqICBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrLmgKICAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDggVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KLSAqICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbgorICogIENvcHlyaWdodCAoQykgMjAwNS0yMDA5IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDkgTm9raWEgQ29ycG9yYXRpb24KICAqCiAgKiAgQ29udGFjdHM6CiAgKiAgUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgpAQCAtMzYsNiArMzYsMTcgQEAKICNkZWZpbmUgT01BUDNYWFhfRU5fRFBMTF9GUkJZUEFTUwkJMHg2CiAjZGVmaW5lIE9NQVAzWFhYX0VOX0RQTExfTE9DS0VECQkJMHg3CiAKKy8qIE9NQVA0eHh4IENNX0NMS01PREVfRFBMTCouRU5fKl9EUExMIGJpdHMgLSBmb3Igb21hcDJfZ2V0X2RwbGxfcmF0ZSgpICovCisjZGVmaW5lIE9NQVA0WFhYX0VOX0RQTExfTU5CWVBBU1MJCTB4NAorI2RlZmluZSBPTUFQNFhYWF9FTl9EUExMX0xQQllQQVNTCQkweDUKKyNkZWZpbmUgT01BUDRYWFhfRU5fRFBMTF9GUkJZUEFTUwkJMHg2CisjZGVmaW5lIE9NQVA0WFhYX0VOX0RQTExfTE9DS0VECQkJMHg3CisKKy8qIENNX0NMS0VOX1BMTCouRU4qIGJpdCB2YWx1ZXMgLSBub3QgYWxsIGFyZSBhdmFpbGFibGUgZm9yIGV2ZXJ5IERQTEwgKi8KKyNkZWZpbmUgRFBMTF9MT1dfUE9XRVJfU1RPUAkweDEKKyNkZWZpbmUgRFBMTF9MT1dfUE9XRVJfQllQQVNTCTB4NQorI2RlZmluZSBEUExMX0xPQ0tFRAkJMHg3CisKIGludCBvbWFwMl9jbGtfaW5pdCh2b2lkKTsKIGludCBvbWFwMl9jbGtfZW5hYmxlKHN0cnVjdCBjbGsgKmNsayk7CiB2b2lkIG9tYXAyX2Nsa19kaXNhYmxlKHN0cnVjdCBjbGsgKmNsayk7CkBAIC00NCw2ICs1NSwxNCBAQAogaW50IG9tYXAyX2Nsa19zZXRfcGFyZW50KHN0cnVjdCBjbGsgKmNsaywgc3RydWN0IGNsayAqbmV3X3BhcmVudCk7CiBpbnQgb21hcDJfZHBsbF9zZXRfcmF0ZV90b2xlcmFuY2Uoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBpbnQgdG9sZXJhbmNlKTsKIGxvbmcgb21hcDJfZHBsbF9yb3VuZF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyB0YXJnZXRfcmF0ZSk7Cit1bnNpZ25lZCBsb25nIG9tYXAzX2RwbGxfcmVjYWxjKHN0cnVjdCBjbGsgKmNsayk7Cit1bnNpZ25lZCBsb25nIG9tYXAzX2Nsa291dHgyX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspOwordm9pZCBvbWFwM19kcGxsX2FsbG93X2lkbGUoc3RydWN0IGNsayAqY2xrKTsKK3ZvaWQgb21hcDNfZHBsbF9kZW55X2lkbGUoc3RydWN0IGNsayAqY2xrKTsKK3UzMiBvbWFwM19kcGxsX2F1dG9pZGxlX3JlYWQoc3RydWN0IGNsayAqY2xrKTsKK2ludCBvbWFwM19ub25jb3JlX2RwbGxfc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOworaW50IG9tYXAzX25vbmNvcmVfZHBsbF9lbmFibGUoc3RydWN0IGNsayAqY2xrKTsKK3ZvaWQgb21hcDNfbm9uY29yZV9kcGxsX2Rpc2FibGUoc3RydWN0IGNsayAqY2xrKTsKIAogI2lmZGVmIENPTkZJR19PTUFQX1JFU0VUX0NMT0NLUwogdm9pZCBvbWFwMl9jbGtfZGlzYWJsZV91bnVzZWQoc3RydWN0IGNsayAqY2xrKTsKQEAgLTYzLDYgKzgyLDcgQEAKIGxvbmcgb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHRhcmdldF9yYXRlKTsKIGludCBvbWFwMl9jbGtzZWxfc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOwogdTMyIG9tYXAyX2dldF9kcGxsX3JhdGUoc3RydWN0IGNsayAqY2xrKTsKK3ZvaWQgb21hcDJfaW5pdF9kcGxsX3BhcmVudChzdHJ1Y3QgY2xrICpjbGspOwogaW50IG9tYXAyX3dhaXRfY2xvY2tfcmVhZHkodm9pZCBfX2lvbWVtICpyZWcsIHUzMiBjdmFsLCBjb25zdCBjaGFyICpuYW1lKTsKIHZvaWQgb21hcDJfY2xrX3ByZXBhcmVfZm9yX3JlYm9vdCh2b2lkKTsKIGludCBvbWFwMl9kZmx0X2Nsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKTsKQEAgLTcyLDI5ICs5MiwxNyBAQAogdm9pZCBvbWFwMl9jbGtfZGZsdF9maW5kX2lkbGVzdChzdHJ1Y3QgY2xrICpjbGssIHZvaWQgX19pb21lbSAqKmlkbGVzdF9yZWcsCiAJCQkJdTggKmlkbGVzdF9iaXQpOwogCitleHRlcm4gdTggY3B1X21hc2s7CisKIGV4dGVybiBjb25zdCBzdHJ1Y3QgY2xrb3BzIGNsa29wc19vbWFwMl9kZmx0X3dhaXQ7CiBleHRlcm4gY29uc3Qgc3RydWN0IGNsa29wcyBjbGtvcHNfb21hcDJfZGZsdDsKIAotZXh0ZXJuIHU4IGNwdV9tYXNrOworZXh0ZXJuIHN0cnVjdCBjbGtfZnVuY3Rpb25zIG9tYXAyX2Nsa19mdW5jdGlvbnM7CitleHRlcm4gc3RydWN0IGNsayAqdmNsaywgKnNjbGs7CiAKLS8qIGNsa3NlbF9yYXRlIGRhdGEgY29tbW9uIHRvIDI0eHgvMzQzeCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBncHRfMzJrX3JhdGVzW10gPSB7Ci0JIHsgLmRpdiA9IDEsIC52YWwgPSAwLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfCBSQVRFX0lOXzM0M1ggfCBERUZBVUxUX1JBVEUgfSwKLQkgeyAuZGl2ID0gMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGdwdF9zeXNfcmF0ZXNbXSA9IHsKLQkgeyAuZGl2ID0gMSwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB8IFJBVEVfSU5fMzQzWCB8IERFRkFVTFRfUkFURSB9LAotCSB7IC5kaXYgPSAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgZ2Z4X2wzX3JhdGVzW10gPSB7Ci0JeyAuZGl2ID0gMSwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB8IFJBVEVfSU5fMzQzWCB9LAotCXsgLmRpdiA9IDIsIC52YWwgPSAyLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfCBSQVRFX0lOXzM0M1ggfCBERUZBVUxUX1JBVEUgfSwKLQl7IC5kaXYgPSAzLCAudmFsID0gMywgLmZsYWdzID0gUkFURV9JTl8yNDNYIHwgUkFURV9JTl8zNDNYIH0sCi0JeyAuZGl2ID0gNCwgLnZhbCA9IDQsIC5mbGFncyA9IFJBVEVfSU5fMjQzWCB8IFJBVEVfSU5fMzQzWCB9LAotCXsgLmRpdiA9IDAgfQotfTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgZ3B0XzMya19yYXRlc1tdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBncHRfc3lzX3JhdGVzW107CitleHRlcm4gY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGdmeF9sM19yYXRlc1tdOwogCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazI0eHguYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2syNHh4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NWI0NzguLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazI0eHguYworKysgL2Rldi9udWxsCkBAIC0xLDgwNSArMCwwIEBACi0vKgotICogIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2suYwotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgotICogIENvcHlyaWdodCAoQykgMjAwNC0yMDA4IE5va2lhIENvcnBvcmF0aW9uCi0gKgotICogIENvbnRhY3RzOgotICogIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KLSAqICBQYXVsIFdhbG1zbGV5Ci0gKgotICogIEJhc2VkIG9uIGVhcmxpZXIgd29yayBieSBUdXVra2EgVGlra2FuZW4sIFRvbnkgTGluZGdyZW4sCi0gKiAgR29yZG9uIE1jTnV0dCBhbmQgUmlkZ2VSdW4sIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0jdW5kZWYgREVCVUcKLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+Ci0jaW5jbHVkZSA8cGxhdC9zcmFtLmg+Ci0jaW5jbHVkZSA8cGxhdC9wcmNtLmg+Ci0jaW5jbHVkZSA8YXNtL2RpdjY0Lmg+Ci0jaW5jbHVkZSA8YXNtL2Nsa2Rldi5oPgotCi0jaW5jbHVkZSA8cGxhdC9zZHJjLmg+Ci0jaW5jbHVkZSAiY2xvY2suaCIKLSNpbmNsdWRlICJwcm0uaCIKLSNpbmNsdWRlICJwcm0tcmVnYml0cy0yNHh4LmgiCi0jaW5jbHVkZSAiY20uaCIKLSNpbmNsdWRlICJjbS1yZWdiaXRzLTI0eHguaCIKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtvcHMgY2xrb3BzX29zY2NrOwotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtvcHMgY2xrb3BzX2ZpeGVkOwotCi1zdGF0aWMgdm9pZCBvbWFwMjQzMF9jbGtfaTJjaHNfZmluZF9pZGxlc3Qoc3RydWN0IGNsayAqY2xrLAotCQkJCQkgICB2b2lkIF9faW9tZW0gKippZGxlc3RfcmVnLAotCQkJCQkgICB1OCAqaWRsZXN0X2JpdCk7Ci0KLS8qIDI0MzAgSTJDSFMgaGFzIG5vbi1zdGFuZGFyZCBJRExFU1QgcmVnaXN0ZXIgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrb3BzIGNsa29wc19vbWFwMjQzMF9pMmNoc193YWl0ID0gewotCS5lbmFibGUJCT0gb21hcDJfZGZsdF9jbGtfZW5hYmxlLAotCS5kaXNhYmxlCT0gb21hcDJfZGZsdF9jbGtfZGlzYWJsZSwKLQkuZmluZF9pZGxlc3QJPSBvbWFwMjQzMF9jbGtfaTJjaHNfZmluZF9pZGxlc3QsCi0JLmZpbmRfY29tcGFuaW9uID0gb21hcDJfY2xrX2RmbHRfZmluZF9jb21wYW5pb24sCi19OwotCi0jaW5jbHVkZSAiY2xvY2syNHh4LmgiCi0KLXN0cnVjdCBvbWFwX2NsayB7Ci0JdTMyCQljcHU7Ci0Jc3RydWN0IGNsa19sb29rdXAgbGs7Ci19OwotCi0jZGVmaW5lIENMSyhkZXYsIGNvbiwgY2ssIGNwKSAJCVwKLQl7CQkJCVwKLQkJIC5jcHUgPSBjcCwJCVwKLQkJLmxrID0gewkJCVwKLQkJCS5kZXZfaWQgPSBkZXYsCVwKLQkJCS5jb25faWQgPSBjb24sCVwKLQkJCS5jbGsgPSBjaywJXAotCQl9LAkJCVwKLQl9Ci0KLSNkZWZpbmUgQ0tfMjQzWAkJCVJBVEVfSU5fMjQzWAotI2RlZmluZSBDS18yNDJYCQkJUkFURV9JTl8yNDJYCi0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9jbGsgb21hcDI0eHhfY2xrc1tdID0gewotCS8qIGV4dGVybmFsIHJvb3Qgc291cmNlcyAqLwotCUNMSyhOVUxMLAkiZnVuY18zMmtfY2siLAkmZnVuY18zMmtfY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQlDTEsoTlVMTCwJInNlY3VyZV8zMmtfY2siLCAmc2VjdXJlXzMya19jaywgQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkib3NjX2NrIiwJJm9zY19jaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkic3lzX2NrIiwJJnN5c19jaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkiYWx0X2NrIiwJJmFsdF9jaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCS8qIGludGVybmFsIGFuYWxvZyBzb3VyY2VzICovCi0JQ0xLKE5VTEwsCSJkcGxsX2NrIiwJJmRwbGxfY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQlDTEsoTlVMTCwJImFwbGw5Nl9jayIsCSZhcGxsOTZfY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQlDTEsoTlVMTCwJImFwbGw1NF9jayIsCSZhcGxsNTRfY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQkvKiBpbnRlcm5hbCBwcmNtIHJvb3Qgc291cmNlcyAqLwotCUNMSyhOVUxMLAkiZnVuY181NG1fY2siLAkmZnVuY181NG1fY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQlDTEsoTlVMTCwJImNvcmVfY2siLAkmY29yZV9jaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkiZnVuY185Nm1fY2siLAkmZnVuY185Nm1fY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQlDTEsoTlVMTCwJImZ1bmNfNDhtX2NrIiwJJmZ1bmNfNDhtX2NrLAlDS18yNDNYIHwgQ0tfMjQyWCksCi0JQ0xLKE5VTEwsCSJmdW5jXzEybV9jayIsCSZmdW5jXzEybV9jaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkiY2tfd2R0MV9vc2MiLAkmd2R0MV9vc2NfY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQlDTEsoTlVMTCwJInN5c19jbGtvdXRfc3JjIiwgJnN5c19jbGtvdXRfc3JjLCBDS18yNDNYIHwgQ0tfMjQyWCksCi0JQ0xLKE5VTEwsCSJzeXNfY2xrb3V0IiwJJnN5c19jbGtvdXQsCUNLXzI0M1ggfCBDS18yNDJYKSwKLQlDTEsoTlVMTCwJInN5c19jbGtvdXQyX3NyYyIsICZzeXNfY2xrb3V0Ml9zcmMsIENLXzI0MlgpLAotCUNMSyhOVUxMLAkic3lzX2Nsa291dDIiLAkmc3lzX2Nsa291dDIsCUNLXzI0MlgpLAotCUNMSyhOVUxMLAkiZW11bF9jayIsCSZlbXVsX2NrLAlDS18yNDJYKSwKLQkvKiBtcHUgZG9tYWluIGNsb2NrcyAqLwotCUNMSyhOVUxMLAkibXB1X2NrIiwJJm1wdV9jaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCS8qIGRzcCBkb21haW4gY2xvY2tzICovCi0JQ0xLKE5VTEwsCSJkc3BfZmNrIiwJJmRzcF9mY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQlDTEsoTlVMTCwJImRzcF9pcmF0ZV9pY2siLCAmZHNwX2lyYXRlX2ljaywgQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkiZHNwX2ljayIsCSZkc3BfaWNrLAlDS18yNDJYKSwKLQlDTEsoTlVMTCwJIml2YTJfMV9pY2siLAkmaXZhMl8xX2ljaywJQ0tfMjQzWCksCi0JQ0xLKE5VTEwsCSJpdmExX2lmY2siLAkmaXZhMV9pZmNrLAlDS18yNDJYKSwKLQlDTEsoTlVMTCwJIml2YTFfbXB1X2ludF9pZmNrIiwgJml2YTFfbXB1X2ludF9pZmNrLCBDS18yNDJYKSwKLQkvKiBHRlggZG9tYWluIGNsb2NrcyAqLwotCUNMSyhOVUxMLAkiZ2Z4XzNkX2ZjayIsCSZnZnhfM2RfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCi0JQ0xLKE5VTEwsCSJnZnhfMmRfZmNrIiwJJmdmeF8yZF9mY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQlDTEsoTlVMTCwJImdmeF9pY2siLAkmZ2Z4X2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCS8qIE1vZGVtIGRvbWFpbiBjbG9ja3MgKi8KLQlDTEsoTlVMTCwJIm1kbV9pY2siLAkmbWRtX2ljaywJQ0tfMjQzWCksCi0JQ0xLKE5VTEwsCSJtZG1fb3NjX2NrIiwJJm1kbV9vc2NfY2ssCUNLXzI0M1gpLAotCS8qIERTUyBkb21haW4gY2xvY2tzICovCi0JQ0xLKCJvbWFwZHNzIiwJImljayIsCQkmZHNzX2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSygib21hcGRzcyIsCSJkc3MxX2ZjayIsCSZkc3MxX2ZjaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSygib21hcGRzcyIsCSJkc3MyX2ZjayIsCSZkc3MyX2ZjaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSygib21hcGRzcyIsCSJ0dl9mY2siLAkmZHNzXzU0bV9mY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQkvKiBMMyBkb21haW4gY2xvY2tzICovCi0JQ0xLKE5VTEwsCSJjb3JlX2wzX2NrIiwJJmNvcmVfbDNfY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQlDTEsoTlVMTCwJInNzaV9mY2siLAkmc3NpX3Nzcl9zc3RfZmNrLCBDS18yNDNYIHwgQ0tfMjQyWCksCi0JQ0xLKE5VTEwsCSJ1c2JfbDRfaWNrIiwJJnVzYl9sNF9pY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQkvKiBMNCBkb21haW4gY2xvY2tzICovCi0JQ0xLKE5VTEwsCSJsNF9jayIsCSZsNF9jaywJCUNLXzI0M1ggfCBDS18yNDJYKSwKLQlDTEsoTlVMTCwJInNzaV9sNF9pY2siLAkmc3NpX2w0X2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCS8qIHZpcnR1YWwgbWV0YS1ncm91cCBjbG9jayAqLwotCUNMSyhOVUxMLAkidmlydF9wcmNtX3NldCIsICZ2aXJ0X3ByY21fc2V0LCBDS18yNDNYIHwgQ0tfMjQyWCksCi0JLyogZ2VuZXJhbCBsNCBpbnRlcmZhY2UgY2ssIG11bHRpLXBhcmVudCBmdW5jdGlvbmFsIGNsayAqLwotCUNMSyhOVUxMLAkiZ3B0MV9pY2siLAkmZ3B0MV9pY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQlDTEsoTlVMTCwJImdwdDFfZmNrIiwJJmdwdDFfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCi0JQ0xLKE5VTEwsCSJncHQyX2ljayIsCSZncHQyX2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkiZ3B0Ml9mY2siLAkmZ3B0Ml9mY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQlDTEsoTlVMTCwJImdwdDNfaWNrIiwJJmdwdDNfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCi0JQ0xLKE5VTEwsCSJncHQzX2ZjayIsCSZncHQzX2ZjaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkiZ3B0NF9pY2siLAkmZ3B0NF9pY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQlDTEsoTlVMTCwJImdwdDRfZmNrIiwJJmdwdDRfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCi0JQ0xLKE5VTEwsCSJncHQ1X2ljayIsCSZncHQ1X2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkiZ3B0NV9mY2siLAkmZ3B0NV9mY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQlDTEsoTlVMTCwJImdwdDZfaWNrIiwJJmdwdDZfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCi0JQ0xLKE5VTEwsCSJncHQ2X2ZjayIsCSZncHQ2X2ZjaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkiZ3B0N19pY2siLAkmZ3B0N19pY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQlDTEsoTlVMTCwJImdwdDdfZmNrIiwJJmdwdDdfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCi0JQ0xLKE5VTEwsCSJncHQ4X2ljayIsCSZncHQ4X2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkiZ3B0OF9mY2siLAkmZ3B0OF9mY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQlDTEsoTlVMTCwJImdwdDlfaWNrIiwJJmdwdDlfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCi0JQ0xLKE5VTEwsCSJncHQ5X2ZjayIsCSZncHQ5X2ZjaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkiZ3B0MTBfaWNrIiwJJmdwdDEwX2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkiZ3B0MTBfZmNrIiwJJmdwdDEwX2ZjaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkiZ3B0MTFfaWNrIiwJJmdwdDExX2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkiZ3B0MTFfZmNrIiwJJmdwdDExX2ZjaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkiZ3B0MTJfaWNrIiwJJmdwdDEyX2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkiZ3B0MTJfZmNrIiwJJmdwdDEyX2ZjaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSygib21hcC1tY2JzcC4xIiwgImljayIsCSZtY2JzcDFfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCi0JQ0xLKCJvbWFwLW1jYnNwLjEiLCAiZmNrIiwJJm1jYnNwMV9mY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQlDTEsoIm9tYXAtbWNic3AuMiIsICJpY2siLAkmbWNic3AyX2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSygib21hcC1tY2JzcC4yIiwgImZjayIsCSZtY2JzcDJfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCi0JQ0xLKCJvbWFwLW1jYnNwLjMiLCAiaWNrIiwJJm1jYnNwM19pY2ssCUNLXzI0M1gpLAotCUNMSygib21hcC1tY2JzcC4zIiwgImZjayIsCSZtY2JzcDNfZmNrLAlDS18yNDNYKSwKLQlDTEsoIm9tYXAtbWNic3AuNCIsICJpY2siLAkmbWNic3A0X2ljaywJQ0tfMjQzWCksCi0JQ0xLKCJvbWFwLW1jYnNwLjQiLCAiZmNrIiwJJm1jYnNwNF9mY2ssCUNLXzI0M1gpLAotCUNMSygib21hcC1tY2JzcC41IiwgImljayIsCSZtY2JzcDVfaWNrLAlDS18yNDNYKSwKLQlDTEsoIm9tYXAtbWNic3AuNSIsICJmY2siLAkmbWNic3A1X2ZjaywJQ0tfMjQzWCksCi0JQ0xLKCJvbWFwMl9tY3NwaS4xIiwgImljayIsCSZtY3NwaTFfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCi0JQ0xLKCJvbWFwMl9tY3NwaS4xIiwgImZjayIsCSZtY3NwaTFfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCi0JQ0xLKCJvbWFwMl9tY3NwaS4yIiwgImljayIsCSZtY3NwaTJfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCi0JQ0xLKCJvbWFwMl9tY3NwaS4yIiwgImZjayIsCSZtY3NwaTJfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCi0JQ0xLKCJvbWFwMl9tY3NwaS4zIiwgImljayIsCSZtY3NwaTNfaWNrLAlDS18yNDNYKSwKLQlDTEsoIm9tYXAyX21jc3BpLjMiLCAiZmNrIiwJJm1jc3BpM19mY2ssCUNLXzI0M1gpLAotCUNMSyhOVUxMLAkidWFydDFfaWNrIiwJJnVhcnQxX2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkidWFydDFfZmNrIiwJJnVhcnQxX2ZjaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkidWFydDJfaWNrIiwJJnVhcnQyX2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkidWFydDJfZmNrIiwJJnVhcnQyX2ZjaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkidWFydDNfaWNrIiwJJnVhcnQzX2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkidWFydDNfZmNrIiwJJnVhcnQzX2ZjaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkiZ3Bpb3NfaWNrIiwJJmdwaW9zX2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkiZ3Bpb3NfZmNrIiwJJmdwaW9zX2ZjaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSygib21hcF93ZHQiLAkiaWNrIiwJCSZtcHVfd2R0X2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSygib21hcF93ZHQiLAkiZmNrIiwJCSZtcHVfd2R0X2ZjaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkic3luY18zMmtfaWNrIiwJJnN5bmNfMzJrX2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkid2R0MV9pY2siLAkmd2R0MV9pY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQlDTEsoTlVMTCwJIm9tYXBjdHJsX2ljayIsCSZvbWFwY3RybF9pY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQlDTEsoTlVMTCwJImljcl9pY2siLAkmaWNyX2ljaywJQ0tfMjQzWCksCi0JQ0xLKCJvbWFwMjR4eGNhbSIsICJmY2siLAkmY2FtX2ZjaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSygib21hcDI0eHhjYW0iLCAiaWNrIiwJJmNhbV9pY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQlDTEsoTlVMTCwJIm1haWxib3hlc19pY2siLCAmbWFpbGJveGVzX2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkid2R0NF9pY2siLAkmd2R0NF9pY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQlDTEsoTlVMTCwJIndkdDRfZmNrIiwJJndkdDRfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCi0JQ0xLKE5VTEwsCSJ3ZHQzX2ljayIsCSZ3ZHQzX2ljaywJQ0tfMjQyWCksCi0JQ0xLKE5VTEwsCSJ3ZHQzX2ZjayIsCSZ3ZHQzX2ZjaywJQ0tfMjQyWCksCi0JQ0xLKE5VTEwsCSJtc3Byb19pY2siLAkmbXNwcm9faWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCi0JQ0xLKE5VTEwsCSJtc3Byb19mY2siLAkmbXNwcm9fZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCi0JQ0xLKCJtbWNpLW9tYXAuMCIsICJpY2siLAkmbW1jX2ljaywJQ0tfMjQyWCksCi0JQ0xLKCJtbWNpLW9tYXAuMCIsICJmY2siLAkmbW1jX2ZjaywJQ0tfMjQyWCksCi0JQ0xLKE5VTEwsCSJmYWNfaWNrIiwJJmZhY19pY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQlDTEsoTlVMTCwJImZhY19mY2siLAkmZmFjX2ZjaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkiZWFjX2ljayIsCSZlYWNfaWNrLAlDS18yNDJYKSwKLQlDTEsoTlVMTCwJImVhY19mY2siLAkmZWFjX2ZjaywJQ0tfMjQyWCksCi0JQ0xLKCJvbWFwX2hkcS4wIiwgImljayIsCSZoZHFfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCi0JQ0xLKCJvbWFwX2hkcS4xIiwgImZjayIsCSZoZHFfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCi0JQ0xLKCJpMmNfb21hcC4xIiwgImljayIsCSZpMmMxX2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSygiaTJjX29tYXAuMSIsICJmY2siLAkmaTJjMV9mY2ssCUNLXzI0MlgpLAotCUNMSygiaTJjX29tYXAuMSIsICJmY2siLAkmaTJjaHMxX2ZjaywJQ0tfMjQzWCksCi0JQ0xLKCJpMmNfb21hcC4yIiwgImljayIsCSZpMmMyX2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSygiaTJjX29tYXAuMiIsICJmY2siLAkmaTJjMl9mY2ssCUNLXzI0MlgpLAotCUNMSygiaTJjX29tYXAuMiIsICJmY2siLAkmaTJjaHMyX2ZjaywJQ0tfMjQzWCksCi0JQ0xLKE5VTEwsCSJncG1jX2ZjayIsCSZncG1jX2ZjaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkic2RtYV9mY2siLAkmc2RtYV9mY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQlDTEsoTlVMTCwJInNkbWFfaWNrIiwJJnNkbWFfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCi0JQ0xLKE5VTEwsCSJ2bHlucV9pY2siLAkmdmx5bnFfaWNrLAlDS18yNDJYKSwKLQlDTEsoTlVMTCwJInZseW5xX2ZjayIsCSZ2bHlucV9mY2ssCUNLXzI0MlgpLAotCUNMSyhOVUxMLAkic2RyY19pY2siLAkmc2RyY19pY2ssCUNLXzI0M1gpLAotCUNMSyhOVUxMLAkiZGVzX2ljayIsCSZkZXNfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCi0JQ0xLKE5VTEwsCSJzaGFfaWNrIiwJJnNoYV9pY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQlDTEsoIm9tYXBfcm5nIiwJImljayIsCQkmcm5nX2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSyhOVUxMLAkiYWVzX2ljayIsCSZhZXNfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCi0JQ0xLKE5VTEwsCSJwa2FfaWNrIiwJJnBrYV9pY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKLQlDTEsoTlVMTCwJInVzYl9mY2siLAkmdXNiX2ZjaywJQ0tfMjQzWCB8IENLXzI0MlgpLAotCUNMSygibXVzYl9oZHJjIiwJImljayIsCSZ1c2Joc19pY2ssCUNLXzI0M1gpLAotCUNMSygibW1jaS1vbWFwLWhzLjAiLCAiaWNrIiwJJm1tY2hzMV9pY2ssCUNLXzI0M1gpLAotCUNMSygibW1jaS1vbWFwLWhzLjAiLCAiZmNrIiwJJm1tY2hzMV9mY2ssCUNLXzI0M1gpLAotCUNMSygibW1jaS1vbWFwLWhzLjEiLCAiaWNrIiwJJm1tY2hzMl9pY2ssCUNLXzI0M1gpLAotCUNMSygibW1jaS1vbWFwLWhzLjEiLCAiZmNrIiwJJm1tY2hzMl9mY2ssCUNLXzI0M1gpLAotCUNMSyhOVUxMLAkiZ3BpbzVfaWNrIiwJJmdwaW81X2ljaywJQ0tfMjQzWCksCi0JQ0xLKE5VTEwsCSJncGlvNV9mY2siLAkmZ3BpbzVfZmNrLAlDS18yNDNYKSwKLQlDTEsoTlVMTCwJIm1kbV9pbnRjX2ljayIsCSZtZG1faW50Y19pY2ssCUNLXzI0M1gpLAotCUNMSygibW1jaS1vbWFwLWhzLjAiLCAibW1jaHNkYl9mY2siLAkmbW1jaHNkYjFfZmNrLAlDS18yNDNYKSwKLQlDTEsoIm1tY2ktb21hcC1ocy4xIiwgIm1tY2hzZGJfZmNrIiwgCSZtbWNoc2RiMl9mY2ssCUNLXzI0M1gpLAotfTsKLQotLyogQ01fQ0xLRU5fUExMLkVOX3s1NCw5Nn1NX1BMTCBvcHRpb25zICgyNFhYKSAqLwotI2RlZmluZSBFTl9BUExMX1NUT1BQRUQJCQkwCi0jZGVmaW5lIEVOX0FQTExfTE9DS0VECQkJMwotCi0vKiBDTV9DTEtTRUwxX1BMTC5BUExMU19DTEtJTiBvcHRpb25zICgyNFhYKSAqLwotI2RlZmluZSBBUExMU19DTEtJTl8xOV8yTUhaCQkwCi0jZGVmaW5lIEFQTExTX0NMS0lOXzEzTUhaCQkyCi0jZGVmaW5lIEFQTExTX0NMS0lOXzEyTUhaCQkzCi0KLS8qICNkZWZpbmUgRE9XTl9WQVJJQUJMRV9EUExMIDEgKi8JCS8qIEV4cGVyaW1lbnRhbCAqLwotCi1zdGF0aWMgc3RydWN0IHByY21fY29uZmlnICpjdXJyX3ByY21fc2V0Owotc3RhdGljIHN0cnVjdCBjbGsgKnZjbGs7Ci1zdGF0aWMgc3RydWN0IGNsayAqc2NsazsKLQotc3RhdGljIHZvaWQgX19pb21lbSAqcHJjbV9jbGtzcmNfY3RybDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBPbWFwMjR4eCBzcGVjaWZpYyBjbG9jayBmdW5jdGlvbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKgotICogb21hcDI0MzBfY2xrX2kyY2hzX2ZpbmRfaWRsZXN0IC0gcmV0dXJuIENNX0lETEVTVCBpbmZvIGZvciAyNDMwIEkyQ0hTCi0gKiBAY2xrOiBzdHJ1Y3QgY2xrICogYmVpbmcgZW5hYmxlZAotICogQGlkbGVzdF9yZWc6IHZvaWQgX19pb21lbSAqKiB0byBzdG9yZSBDTV9JRExFU1QgcmVnIGFkZHJlc3MgaW50bwotICogQGlkbGVzdF9iaXQ6IHBvaW50ZXIgdG8gYSB1OCB0byBzdG9yZSB0aGUgQ01fSURMRVNUIGJpdCBzaGlmdCBpbnRvCi0gKgotICogT01BUDI0MzAgSTJDSFMgQ01fSURMRVNUIGJpdHMgYXJlIGluIENNX0lETEVTVDFfQ09SRSwgYnV0IHRoZQotICogQ01fKkNMS0VOIGJpdHMgYXJlIGluIENNX3tJLEZ9Q0xLRU4yX0NPUkUuICBUaGlzIGN1c3RvbSBmdW5jdGlvbgotICogcGFzc2VzIGJhY2sgdGhlIGNvcnJlY3QgQ01fSURMRVNUIHJlZ2lzdGVyIGFkZHJlc3MgZm9yIEkyQ0hTCi0gKiBtb2R1bGVzLiAgTm8gcmV0dXJuIHZhbHVlLgotICovCi1zdGF0aWMgdm9pZCBvbWFwMjQzMF9jbGtfaTJjaHNfZmluZF9pZGxlc3Qoc3RydWN0IGNsayAqY2xrLAotCQkJCQkgICB2b2lkIF9faW9tZW0gKippZGxlc3RfcmVnLAotCQkJCQkgICB1OCAqaWRsZXN0X2JpdCkKLXsKLQkqaWRsZXN0X3JlZyA9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSURMRVNUKTsKLQkqaWRsZXN0X2JpdCA9IGNsay0+ZW5hYmxlX2JpdDsKLX0KLQotCi0vKioKLSAqIG9tYXAyeHh4X2Nsa19nZXRfY29yZV9yYXRlIC0gcmV0dXJuIHRoZSBDT1JFX0NMSyByYXRlCi0gKiBAY2xrOiBwb2ludGVyIHRvIHRoZSBjb21iaW5lZCBkcGxsX2NrICsgY29yZV9jayAoY3VycmVudGx5ICJkcGxsX2NrIikKLSAqCi0gKiBSZXR1cm5zIHRoZSBDT1JFX0NMSyByYXRlLiAgQ09SRV9DTEsgY2FuIGhhdmUgb25lIG9mIHRocmVlIHJhdGUKLSAqIHNvdXJjZXMgb24gT01BUDJ4eHg6IHRoZSBEUExMIENMS09VVCByYXRlLCBEUExMIENMS09VVFgyLCBvciAzMktIegotICogKHRoZSBsYXR0ZXIgaXMgdW51c3VhbCkuICBUaGlzIGN1cnJlbnRseSBzaG91bGQgYmUgY2FsbGVkIHdpdGgKLSAqIHN0cnVjdCBjbGsgKmRwbGxfY2ssIHdoaWNoIGlzIGEgY29tcG9zaXRlIGNsb2NrIG9mIGRwbGxfY2sgYW5kCi0gKiBjb3JlX2NrLgotICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBvbWFwMnh4eF9jbGtfZ2V0X2NvcmVfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCi17Ci0JbG9uZyBsb25nIGNvcmVfY2xrOwotCXUzMiB2OwotCi0JY29yZV9jbGsgPSBvbWFwMl9nZXRfZHBsbF9yYXRlKGNsayk7Ci0KLQl2ID0gY21fcmVhZF9tb2RfcmVnKFBMTF9NT0QsIENNX0NMS1NFTDIpOwotCXYgJj0gT01BUDI0WFhfQ09SRV9DTEtfU1JDX01BU0s7Ci0KLQlpZiAodiA9PSBDT1JFX0NMS19TUkNfMzJLKQotCQljb3JlX2NsayA9IDMyNzY4OwotCWVsc2UKLQkJY29yZV9jbGsgKj0gdjsKLQotCXJldHVybiBjb3JlX2NsazsKLX0KLQotc3RhdGljIGludCBvbWFwMl9lbmFibGVfb3NjX2NrKHN0cnVjdCBjbGsgKmNsaykKLXsKLQl1MzIgcGNjOwotCi0JcGNjID0gX19yYXdfcmVhZGwocHJjbV9jbGtzcmNfY3RybCk7Ci0KLQlfX3Jhd193cml0ZWwocGNjICYgfk9NQVBfQVVUT0VYVENMS01PREVfTUFTSywgcHJjbV9jbGtzcmNfY3RybCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgb21hcDJfZGlzYWJsZV9vc2NfY2soc3RydWN0IGNsayAqY2xrKQotewotCXUzMiBwY2M7Ci0KLQlwY2MgPSBfX3Jhd19yZWFkbChwcmNtX2Nsa3NyY19jdHJsKTsKLQotCV9fcmF3X3dyaXRlbChwY2MgfCBPTUFQX0FVVE9FWFRDTEtNT0RFX01BU0ssIHByY21fY2xrc3JjX2N0cmwpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa29wcyBjbGtvcHNfb3NjY2sgPSB7Ci0JLmVuYWJsZQkJPSAmb21hcDJfZW5hYmxlX29zY19jaywKLQkuZGlzYWJsZQk9ICZvbWFwMl9kaXNhYmxlX29zY19jaywKLX07Ci0KLSNpZmRlZiBPTERfQ0sKLS8qIFJlY2FsY3VsYXRlIFNZU1RfQ0xLICovCi1zdGF0aWMgdm9pZCBvbWFwMl9zeXNfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICogY2xrKQotewotCXUzMiBkaXYgPSBQUkNNX0NMS1NSQ19DVFJMOwotCWRpdiAmPSAoMSA8PCA3KSB8ICgxIDw8IDYpOwkvKiBUZXN0IGlmIGV4dCBjbGsgZGl2aWRlZCBieSAxIG9yIDIgKi8KLQlkaXYgPj49IGNsay0+cmF0ZV9vZmZzZXQ7Ci0JY2xrLT5yYXRlID0gKGNsay0+cGFyZW50LT5yYXRlIC8gZGl2KTsKLQlwcm9wYWdhdGVfcmF0ZShjbGspOwotfQotI2VuZGlmCS8qIE9MRF9DSyAqLwotCi0vKiBFbmFibGUgYW4gQVBMTCBpZiBvZmYgKi8KLXN0YXRpYyBpbnQgb21hcDJfY2xrX2ZpeGVkX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspCi17Ci0JdTMyIGN2YWwsIGFwbGxfbWFzazsKLQotCWFwbGxfbWFzayA9IEVOX0FQTExfTE9DS0VEIDw8IGNsay0+ZW5hYmxlX2JpdDsKLQotCWN2YWwgPSBjbV9yZWFkX21vZF9yZWcoUExMX01PRCwgQ01fQ0xLRU4pOwotCi0JaWYgKChjdmFsICYgYXBsbF9tYXNrKSA9PSBhcGxsX21hc2spCi0JCXJldHVybiAwOyAgIC8qIGFwbGwgYWxyZWFkeSBlbmFibGVkICovCi0KLQljdmFsICY9IH5hcGxsX21hc2s7Ci0JY3ZhbCB8PSBhcGxsX21hc2s7Ci0JY21fd3JpdGVfbW9kX3JlZyhjdmFsLCBQTExfTU9ELCBDTV9DTEtFTik7Ci0KLQlpZiAoY2xrID09ICZhcGxsOTZfY2spCi0JCWN2YWwgPSBPTUFQMjRYWF9TVF85Nk1fQVBMTDsKLQllbHNlIGlmIChjbGsgPT0gJmFwbGw1NF9jaykKLQkJY3ZhbCA9IE9NQVAyNFhYX1NUXzU0TV9BUExMOwotCi0Jb21hcDJfY21fd2FpdF9pZGxlc3QoT01BUF9DTV9SRUdBRERSKFBMTF9NT0QsIENNX0lETEVTVCksIGN2YWwsCi0JCQkgICAgIGNsay0+bmFtZSk7Ci0KLQkvKgotCSAqIFJFVklTSVQ6IFNob3VsZCB3ZSByZXR1cm4gYW4gZXJyb3IgY29kZSBpZiBvbWFwMl93YWl0X2Nsb2NrX3JlYWR5KCkKLQkgKiBmYWlscz8KLQkgKi8KLQlyZXR1cm4gMDsKLX0KLQotLyogU3RvcCBBUExMICovCi1zdGF0aWMgdm9pZCBvbWFwMl9jbGtfZml4ZWRfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCi17Ci0JdTMyIGN2YWw7Ci0KLQljdmFsID0gY21fcmVhZF9tb2RfcmVnKFBMTF9NT0QsIENNX0NMS0VOKTsKLQljdmFsICY9IH4oRU5fQVBMTF9MT0NLRUQgPDwgY2xrLT5lbmFibGVfYml0KTsKLQljbV93cml0ZV9tb2RfcmVnKGN2YWwsIFBMTF9NT0QsIENNX0NMS0VOKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtvcHMgY2xrb3BzX2ZpeGVkID0gewotCS5lbmFibGUJCT0gJm9tYXAyX2Nsa19maXhlZF9lbmFibGUsCi0JLmRpc2FibGUJPSAmb21hcDJfY2xrX2ZpeGVkX2Rpc2FibGUsCi19OwotCi0vKgotICogVXNlcyB0aGUgY3VycmVudCBwcmNtIHNldCB0byB0ZWxsIGlmIGEgcmF0ZSBpcyB2YWxpZC4KLSAqIFlvdSBjYW4gZ28gc2xvd2VyLCBidXQgbm90IGZhc3RlciB3aXRoaW4gYSBnaXZlbiByYXRlIHNldC4KLSAqLwotc3RhdGljIGxvbmcgb21hcDJfZHBsbGNvcmVfcm91bmRfcmF0ZSh1bnNpZ25lZCBsb25nIHRhcmdldF9yYXRlKQotewotCXUzMiBoaWdoLCBsb3csIGNvcmVfY2xrX3NyYzsKLQotCWNvcmVfY2xrX3NyYyA9IGNtX3JlYWRfbW9kX3JlZyhQTExfTU9ELCBDTV9DTEtTRUwyKTsKLQljb3JlX2Nsa19zcmMgJj0gT01BUDI0WFhfQ09SRV9DTEtfU1JDX01BU0s7Ci0KLQlpZiAoY29yZV9jbGtfc3JjID09IENPUkVfQ0xLX1NSQ19EUExMKSB7CS8qIERQTEwgY2xvY2tvdXQgKi8KLQkJaGlnaCA9IGN1cnJfcHJjbV9zZXQtPmRwbGxfc3BlZWQgKiAyOwotCQlsb3cgPSBjdXJyX3ByY21fc2V0LT5kcGxsX3NwZWVkOwotCX0gZWxzZSB7CQkJCS8qIERQTEwgY2xvY2tvdXQgeCAyICovCi0JCWhpZ2ggPSBjdXJyX3ByY21fc2V0LT5kcGxsX3NwZWVkOwotCQlsb3cgPSBjdXJyX3ByY21fc2V0LT5kcGxsX3NwZWVkIC8gMjsKLQl9Ci0KLSNpZmRlZiBET1dOX1ZBUklBQkxFX0RQTEwKLQlpZiAodGFyZ2V0X3JhdGUgPiBoaWdoKQotCQlyZXR1cm4gaGlnaDsKLQllbHNlCi0JCXJldHVybiB0YXJnZXRfcmF0ZTsKLSNlbHNlCi0JaWYgKHRhcmdldF9yYXRlID4gbG93KQotCQlyZXR1cm4gaGlnaDsKLQllbHNlCi0JCXJldHVybiBsb3c7Ci0jZW5kaWYKLQotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBvbWFwMl9kcGxsY29yZV9yZWNhbGMoc3RydWN0IGNsayAqY2xrKQotewotCXJldHVybiBvbWFwMnh4eF9jbGtfZ2V0X2NvcmVfcmF0ZShjbGspOwotfQotCi1zdGF0aWMgaW50IG9tYXAyX3JlcHJvZ3JhbV9kcGxsY29yZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKLXsKLQl1MzIgY3VyX3JhdGUsIGxvdywgbXVsdCwgZGl2LCB2YWxpZF9yYXRlLCBkb25lX3JhdGU7Ci0JdTMyIGJ5cGFzcyA9IDA7Ci0Jc3RydWN0IHByY21fY29uZmlnIHRtcHNldDsKLQljb25zdCBzdHJ1Y3QgZHBsbF9kYXRhICpkZDsKLQotCWN1cl9yYXRlID0gb21hcDJ4eHhfY2xrX2dldF9jb3JlX3JhdGUoJmRwbGxfY2spOwotCW11bHQgPSBjbV9yZWFkX21vZF9yZWcoUExMX01PRCwgQ01fQ0xLU0VMMik7Ci0JbXVsdCAmPSBPTUFQMjRYWF9DT1JFX0NMS19TUkNfTUFTSzsKLQotCWlmICgocmF0ZSA9PSAoY3VyX3JhdGUgLyAyKSkgJiYgKG11bHQgPT0gMikpIHsKLQkJb21hcDJ4eHhfc2RyY19yZXByb2dyYW0oQ09SRV9DTEtfU1JDX0RQTEwsIDEpOwotCX0gZWxzZSBpZiAoKHJhdGUgPT0gKGN1cl9yYXRlICogMikpICYmIChtdWx0ID09IDEpKSB7Ci0JCW9tYXAyeHh4X3NkcmNfcmVwcm9ncmFtKENPUkVfQ0xLX1NSQ19EUExMX1gyLCAxKTsKLQl9IGVsc2UgaWYgKHJhdGUgIT0gY3VyX3JhdGUpIHsKLQkJdmFsaWRfcmF0ZSA9IG9tYXAyX2RwbGxjb3JlX3JvdW5kX3JhdGUocmF0ZSk7Ci0JCWlmICh2YWxpZF9yYXRlICE9IHJhdGUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAobXVsdCA9PSAxKQotCQkJbG93ID0gY3Vycl9wcmNtX3NldC0+ZHBsbF9zcGVlZDsKLQkJZWxzZQotCQkJbG93ID0gY3Vycl9wcmNtX3NldC0+ZHBsbF9zcGVlZCAvIDI7Ci0KLQkJZGQgPSBjbGstPmRwbGxfZGF0YTsKLQkJaWYgKCFkZCkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCXRtcHNldC5jbV9jbGtzZWwxX3BsbCA9IF9fcmF3X3JlYWRsKGRkLT5tdWx0X2RpdjFfcmVnKTsKLQkJdG1wc2V0LmNtX2Nsa3NlbDFfcGxsICY9IH4oZGQtPm11bHRfbWFzayB8Ci0JCQkJCSAgIGRkLT5kaXYxX21hc2spOwotCQlkaXYgPSAoKGN1cnJfcHJjbV9zZXQtPnh0YWxfc3BlZWQgLyAxMDAwMDAwKSAtIDEpOwotCQl0bXBzZXQuY21fY2xrc2VsMl9wbGwgPSBjbV9yZWFkX21vZF9yZWcoUExMX01PRCwgQ01fQ0xLU0VMMik7Ci0JCXRtcHNldC5jbV9jbGtzZWwyX3BsbCAmPSB+T01BUDI0WFhfQ09SRV9DTEtfU1JDX01BU0s7Ci0JCWlmIChyYXRlID4gbG93KSB7Ci0JCQl0bXBzZXQuY21fY2xrc2VsMl9wbGwgfD0gQ09SRV9DTEtfU1JDX0RQTExfWDI7Ci0JCQltdWx0ID0gKChyYXRlIC8gMikgLyAxMDAwMDAwKTsKLQkJCWRvbmVfcmF0ZSA9IENPUkVfQ0xLX1NSQ19EUExMX1gyOwotCQl9IGVsc2UgewotCQkJdG1wc2V0LmNtX2Nsa3NlbDJfcGxsIHw9IENPUkVfQ0xLX1NSQ19EUExMOwotCQkJbXVsdCA9IChyYXRlIC8gMTAwMDAwMCk7Ci0JCQlkb25lX3JhdGUgPSBDT1JFX0NMS19TUkNfRFBMTDsKLQkJfQotCQl0bXBzZXQuY21fY2xrc2VsMV9wbGwgfD0gKGRpdiA8PCBfX2ZmcyhkZC0+bXVsdF9tYXNrKSk7Ci0JCXRtcHNldC5jbV9jbGtzZWwxX3BsbCB8PSAobXVsdCA8PCBfX2ZmcyhkZC0+ZGl2MV9tYXNrKSk7Ci0KLQkJLyogV29yc3QgY2FzZSAqLwotCQl0bXBzZXQuYmFzZV9zZHJjX3JmciA9IFNEUkNfUkZSX0NUUkxfQllQQVNTOwotCi0JCWlmIChyYXRlID09IGN1cnJfcHJjbV9zZXQtPnh0YWxfc3BlZWQpCS8qIElmIGFza2luZyBmb3IgMS0xICovCi0JCQlieXBhc3MgPSAxOwotCi0JCS8qIEZvciBvbWFwMnh4eF9zZHJjX2luaXRfcGFyYW1zKCkgKi8KLQkJb21hcDJ4eHhfc2RyY19yZXByb2dyYW0oQ09SRV9DTEtfU1JDX0RQTExfWDIsIDEpOwotCi0JCS8qIEZvcmNlIGRsbCBsb2NrIG1vZGUgKi8KLQkJb21hcDJfc2V0X3ByY20odG1wc2V0LmNtX2Nsa3NlbDFfcGxsLCB0bXBzZXQuYmFzZV9zZHJjX3JmciwKLQkJCSAgICAgICBieXBhc3MpOwotCi0JCS8qIEVycmF0YTogcmV0IGRsbCBlbnRyeSBzdGF0ZSAqLwotCQlvbWFwMnh4eF9zZHJjX2luaXRfcGFyYW1zKG9tYXAyeHh4X3NkcmNfZGxsX2lzX3VubG9ja2VkKCkpOwotCQlvbWFwMnh4eF9zZHJjX3JlcHJvZ3JhbShkb25lX3JhdGUsIDApOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIG9tYXAyX3RhYmxlX21wdV9yZWNhbGMgLSBqdXN0IHJldHVybiB0aGUgTVBVIHNwZWVkCi0gKiBAY2xrOiB2aXJ0X3ByY21fc2V0IHN0cnVjdCBjbGsKLSAqCi0gKiBTZXQgdmlydF9wcmNtX3NldCdzIHJhdGUgdG8gdGhlIG1wdV9zcGVlZCBmaWVsZCBvZiB0aGUgY3VycmVudCBQUkNNIHNldC4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgb21hcDJfdGFibGVfbXB1X3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCi17Ci0JcmV0dXJuIGN1cnJfcHJjbV9zZXQtPm1wdV9zcGVlZDsKLX0KLQotLyoKLSAqIExvb2sgZm9yIGEgcmF0ZSBlcXVhbCBvciBsZXNzIHRoYW4gdGhlIHRhcmdldCByYXRlIGdpdmVuIGEgY29uZmlndXJhdGlvbiBzZXQuCi0gKgotICogV2hhdCdzIG5vdCBlbnRpcmVseSBjbGVhciBpcyAid2hpY2giIGZpZWxkIHJlcHJlc2VudHMgdGhlIGtleSBmaWVsZC4KLSAqIFNvbWUgbWlnaHQgYXJndWUgTDMtRERSLCBvdGhlcnMgQVJNLCBvdGhlcnMgSVZBLiBUaGlzIGNvZGUgaXMgc2ltcGxlIGFuZAotICoganVzdCB1c2VzIHRoZSBBUk0gcmF0ZXMuCi0gKi8KLXN0YXRpYyBsb25nIG9tYXAyX3JvdW5kX3RvX3RhYmxlX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCi17Ci0Jc3RydWN0IHByY21fY29uZmlnICpwdHI7Ci0JbG9uZyBoaWdoZXN0X3JhdGU7Ci0KLQlpZiAoY2xrICE9ICZ2aXJ0X3ByY21fc2V0KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWhpZ2hlc3RfcmF0ZSA9IC1FSU5WQUw7Ci0KLQlmb3IgKHB0ciA9IHJhdGVfdGFibGU7IHB0ci0+bXB1X3NwZWVkOyBwdHIrKykgewotCQlpZiAoIShwdHItPmZsYWdzICYgY3B1X21hc2spKQotCQkJY29udGludWU7Ci0JCWlmIChwdHItPnh0YWxfc3BlZWQgIT0gc3lzX2NrLnJhdGUpCi0JCQljb250aW51ZTsKLQotCQloaWdoZXN0X3JhdGUgPSBwdHItPm1wdV9zcGVlZDsKLQotCQkvKiBDYW4gY2hlY2sgb25seSBhZnRlciB4dGFsIGZyZXF1ZW5jeSBjaGVjayAqLwotCQlpZiAocHRyLT5tcHVfc3BlZWQgPD0gcmF0ZSkKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gaGlnaGVzdF9yYXRlOwotfQotCi0vKiBTZXRzIGJhc2ljIGNsb2NrcyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHJhdGUgKi8KLXN0YXRpYyBpbnQgb21hcDJfc2VsZWN0X3RhYmxlX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCi17Ci0JdTMyIGN1cl9yYXRlLCBkb25lX3JhdGUsIGJ5cGFzcyA9IDAsIHRtcDsKLQlzdHJ1Y3QgcHJjbV9jb25maWcgKnByY207Ci0JdW5zaWduZWQgbG9uZyBmb3VuZF9zcGVlZCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChjbGsgIT0gJnZpcnRfcHJjbV9zZXQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZm9yIChwcmNtID0gcmF0ZV90YWJsZTsgcHJjbS0+bXB1X3NwZWVkOyBwcmNtKyspIHsKLQkJaWYgKCEocHJjbS0+ZmxhZ3MgJiBjcHVfbWFzaykpCi0JCQljb250aW51ZTsKLQotCQlpZiAocHJjbS0+eHRhbF9zcGVlZCAhPSBzeXNfY2sucmF0ZSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChwcmNtLT5tcHVfc3BlZWQgPD0gcmF0ZSkgewotCQkJZm91bmRfc3BlZWQgPSBwcmNtLT5tcHVfc3BlZWQ7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmICghZm91bmRfc3BlZWQpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiQ291bGQgbm90IHNldCBNUFUgcmF0ZSB0byAlbHVNSHpcbiIsCi0JCSAgICAgICByYXRlIC8gMTAwMDAwMCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWN1cnJfcHJjbV9zZXQgPSBwcmNtOwotCWN1cl9yYXRlID0gb21hcDJ4eHhfY2xrX2dldF9jb3JlX3JhdGUoJmRwbGxfY2spOwotCi0JaWYgKHByY20tPmRwbGxfc3BlZWQgPT0gY3VyX3JhdGUgLyAyKSB7Ci0JCW9tYXAyeHh4X3NkcmNfcmVwcm9ncmFtKENPUkVfQ0xLX1NSQ19EUExMLCAxKTsKLQl9IGVsc2UgaWYgKHByY20tPmRwbGxfc3BlZWQgPT0gY3VyX3JhdGUgKiAyKSB7Ci0JCW9tYXAyeHh4X3NkcmNfcmVwcm9ncmFtKENPUkVfQ0xLX1NSQ19EUExMX1gyLCAxKTsKLQl9IGVsc2UgaWYgKHByY20tPmRwbGxfc3BlZWQgIT0gY3VyX3JhdGUpIHsKLQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JCWlmIChwcmNtLT5kcGxsX3NwZWVkID09IHByY20tPnh0YWxfc3BlZWQpCi0JCQlieXBhc3MgPSAxOwotCi0JCWlmICgocHJjbS0+Y21fY2xrc2VsMl9wbGwgJiBPTUFQMjRYWF9DT1JFX0NMS19TUkNfTUFTSykgPT0KLQkJICAgIENPUkVfQ0xLX1NSQ19EUExMX1gyKQotCQkJZG9uZV9yYXRlID0gQ09SRV9DTEtfU1JDX0RQTExfWDI7Ci0JCWVsc2UKLQkJCWRvbmVfcmF0ZSA9IENPUkVfQ0xLX1NSQ19EUExMOwotCi0JCS8qIE1QVSBkaXZpZGVyICovCi0JCWNtX3dyaXRlX21vZF9yZWcocHJjbS0+Y21fY2xrc2VsX21wdSwgTVBVX01PRCwgQ01fQ0xLU0VMKTsKLQotCQkvKiBkc3AgKyBpdmExIGRpdigyNDIwKSwgaXZhMi4xKDI0MzApICovCi0JCWNtX3dyaXRlX21vZF9yZWcocHJjbS0+Y21fY2xrc2VsX2RzcCwKLQkJCQkgT01BUDI0WFhfRFNQX01PRCwgQ01fQ0xLU0VMKTsKLQotCQljbV93cml0ZV9tb2RfcmVnKHByY20tPmNtX2Nsa3NlbF9nZngsIEdGWF9NT0QsIENNX0NMS1NFTCk7Ci0KLQkJLyogTWFqb3Igc3Vic3lzdGVtIGRpdmlkZXJzICovCi0JCXRtcCA9IGNtX3JlYWRfbW9kX3JlZyhDT1JFX01PRCwgQ01fQ0xLU0VMMSkgJiBPTUFQMjRYWF9DTEtTRUxfRFNTMl9NQVNLOwotCQljbV93cml0ZV9tb2RfcmVnKHByY20tPmNtX2Nsa3NlbDFfY29yZSB8IHRtcCwgQ09SRV9NT0QsCi0JCQkJIENNX0NMS1NFTDEpOwotCi0JCWlmIChjcHVfaXNfb21hcDI0MzAoKSkKLQkJCWNtX3dyaXRlX21vZF9yZWcocHJjbS0+Y21fY2xrc2VsX21kbSwKLQkJCQkJIE9NQVAyNDMwX01ETV9NT0QsIENNX0NMS1NFTCk7Ci0KLQkJLyogeDIgdG8gZW50ZXIgb21hcDJ4eHhfc2RyY19pbml0X3BhcmFtcygpICovCi0JCW9tYXAyeHh4X3NkcmNfcmVwcm9ncmFtKENPUkVfQ0xLX1NSQ19EUExMX1gyLCAxKTsKLQotCQlvbWFwMl9zZXRfcHJjbShwcmNtLT5jbV9jbGtzZWwxX3BsbCwgcHJjbS0+YmFzZV9zZHJjX3JmciwKLQkJCSAgICAgICBieXBhc3MpOwotCi0JCW9tYXAyeHh4X3NkcmNfaW5pdF9wYXJhbXMob21hcDJ4eHhfc2RyY19kbGxfaXNfdW5sb2NrZWQoKSk7Ci0JCW9tYXAyeHh4X3NkcmNfcmVwcm9ncmFtKGRvbmVfcmF0ZSwgMCk7Ci0KLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX0NQVV9GUkVRCi0vKgotICogV2FsayBQUkNNIHJhdGUgdGFibGUgYW5kIGZpbGxvdXQgY3B1ZnJlcSBmcmVxX3RhYmxlCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgZnJlcV90YWJsZVtBUlJBWV9TSVpFKHJhdGVfdGFibGUpXTsKLQotdm9pZCBvbWFwMl9jbGtfaW5pdF9jcHVmcmVxX3RhYmxlKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqKnRhYmxlKQotewotCXN0cnVjdCBwcmNtX2NvbmZpZyAqcHJjbTsKLQlpbnQgaSA9IDA7Ci0KLQlmb3IgKHByY20gPSByYXRlX3RhYmxlOyBwcmNtLT5tcHVfc3BlZWQ7IHByY20rKykgewotCQlpZiAoIShwcmNtLT5mbGFncyAmIGNwdV9tYXNrKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAocHJjbS0+eHRhbF9zcGVlZCAhPSBzeXNfY2sucmF0ZSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIGRvbid0IHB1dCBieXBhc3MgcmF0ZXMgaW4gdGFibGUgKi8KLQkJaWYgKHByY20tPmRwbGxfc3BlZWQgPT0gcHJjbS0+eHRhbF9zcGVlZCkKLQkJCWNvbnRpbnVlOwotCi0JCWZyZXFfdGFibGVbaV0uaW5kZXggPSBpOwotCQlmcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeSA9IHByY20tPm1wdV9zcGVlZCAvIDEwMDA7Ci0JCWkrKzsKLQl9Ci0KLQlpZiAoaSA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBmcmVxdWVuY3kgIgotCQkgICAgICAgInRhYmxlXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlmcmVxX3RhYmxlW2ldLmluZGV4ID0gaTsKLQlmcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EOwotCi0JKnRhYmxlID0gJmZyZXFfdGFibGVbMF07Ci19Ci0jZW5kaWYKLQotc3RhdGljIHN0cnVjdCBjbGtfZnVuY3Rpb25zIG9tYXAyX2Nsa19mdW5jdGlvbnMgPSB7Ci0JLmNsa19lbmFibGUJCT0gb21hcDJfY2xrX2VuYWJsZSwKLQkuY2xrX2Rpc2FibGUJCT0gb21hcDJfY2xrX2Rpc2FibGUsCi0JLmNsa19yb3VuZF9yYXRlCQk9IG9tYXAyX2Nsa19yb3VuZF9yYXRlLAotCS5jbGtfc2V0X3JhdGUJCT0gb21hcDJfY2xrX3NldF9yYXRlLAotCS5jbGtfc2V0X3BhcmVudAkJPSBvbWFwMl9jbGtfc2V0X3BhcmVudCwKLQkuY2xrX2Rpc2FibGVfdW51c2VkCT0gb21hcDJfY2xrX2Rpc2FibGVfdW51c2VkLAotI2lmZGVmCUNPTkZJR19DUFVfRlJFUQotCS5jbGtfaW5pdF9jcHVmcmVxX3RhYmxlCT0gb21hcDJfY2xrX2luaXRfY3B1ZnJlcV90YWJsZSwKLSNlbmRpZgotfTsKLQotc3RhdGljIHUzMiBvbWFwMl9nZXRfYXBsbF9jbGtpbih2b2lkKQotewotCXUzMiBhcGxscywgc3JhdGUgPSAwOwotCi0JYXBsbHMgPSBjbV9yZWFkX21vZF9yZWcoUExMX01PRCwgQ01fQ0xLU0VMMSk7Ci0JYXBsbHMgJj0gT01BUDI0WFhfQVBMTFNfQ0xLSU5fTUFTSzsKLQlhcGxscyA+Pj0gT01BUDI0WFhfQVBMTFNfQ0xLSU5fU0hJRlQ7Ci0KLQlpZiAoYXBsbHMgPT0gQVBMTFNfQ0xLSU5fMTlfMk1IWikKLQkJc3JhdGUgPSAxOTIwMDAwMDsKLQllbHNlIGlmIChhcGxscyA9PSBBUExMU19DTEtJTl8xM01IWikKLQkJc3JhdGUgPSAxMzAwMDAwMDsKLQllbHNlIGlmIChhcGxscyA9PSBBUExMU19DTEtJTl8xMk1IWikKLQkJc3JhdGUgPSAxMjAwMDAwMDsKLQotCXJldHVybiBzcmF0ZTsKLX0KLQotc3RhdGljIHUzMiBvbWFwMl9nZXRfc3lzY2xrZGl2KHZvaWQpCi17Ci0JdTMyIGRpdjsKLQotCWRpdiA9IF9fcmF3X3JlYWRsKHByY21fY2xrc3JjX2N0cmwpOwotCWRpdiAmPSBPTUFQX1NZU0NMS0RJVl9NQVNLOwotCWRpdiA+Pj0gT01BUF9TWVNDTEtESVZfU0hJRlQ7Ci0KLQlyZXR1cm4gZGl2OwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBvbWFwMl9vc2NfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCi17Ci0JcmV0dXJuIG9tYXAyX2dldF9hcGxsX2Nsa2luKCkgKiBvbWFwMl9nZXRfc3lzY2xrZGl2KCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG9tYXAyX3N5c19jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGUgLyBvbWFwMl9nZXRfc3lzY2xrZGl2KCk7Ci19Ci0KLS8qCi0gKiBTZXQgY2xvY2tzIGZvciBieXBhc3MgbW9kZSBmb3IgcmVib290IHRvIHdvcmsuCi0gKi8KLXZvaWQgb21hcDJfY2xrX3ByZXBhcmVfZm9yX3JlYm9vdCh2b2lkKQotewotCXUzMiByYXRlOwotCi0JaWYgKHZjbGsgPT0gTlVMTCB8fCBzY2xrID09IE5VTEwpCi0JCXJldHVybjsKLQotCXJhdGUgPSBjbGtfZ2V0X3JhdGUoc2Nsayk7Ci0JY2xrX3NldF9yYXRlKHZjbGssIHJhdGUpOwotfQotCi0vKgotICogU3dpdGNoIHRoZSBNUFUgcmF0ZSBpZiBzcGVjaWZpZWQgb24gY21kbGluZS4KLSAqIFdlIGNhbm5vdCBkbyB0aGlzIGVhcmx5IHVudGlsIGNtZGxpbmUgaXMgcGFyc2VkLgotICovCi1zdGF0aWMgaW50IF9faW5pdCBvbWFwMl9jbGtfYXJjaF9pbml0KHZvaWQpCi17Ci0JaWYgKCFtcHVyYXRlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChjbGtfc2V0X3JhdGUoJnZpcnRfcHJjbV9zZXQsIG1wdXJhdGUpKQotCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBmaW5kIG1hdGNoaW5nIE1QVSByYXRlXG4iKTsKLQotCXJlY2FsY3VsYXRlX3Jvb3RfY2xvY2tzKCk7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJTd2l0Y2hlZCB0byBuZXcgY2xvY2tpbmcgcmF0ZSAoQ3J5c3RhbC9EUExML01QVSk6ICIKLQkgICAgICAgIiVsZC4lMDFsZC8lbGQvJWxkIE1IelxuIiwKLQkgICAgICAgKHN5c19jay5yYXRlIC8gMTAwMDAwMCksIChzeXNfY2sucmF0ZSAvIDEwMDAwMCkgJSAxMCwKLQkgICAgICAgKGRwbGxfY2sucmF0ZSAvIDEwMDAwMDApLCAobXB1X2NrLnJhdGUgLyAxMDAwMDAwKSkgOwotCi0JcmV0dXJuIDA7Ci19Ci1hcmNoX2luaXRjYWxsKG9tYXAyX2Nsa19hcmNoX2luaXQpOwotCi1pbnQgX19pbml0IG9tYXAyX2Nsa19pbml0KHZvaWQpCi17Ci0Jc3RydWN0IHByY21fY29uZmlnICpwcmNtOwotCXN0cnVjdCBvbWFwX2NsayAqYzsKLQl1MzIgY2xrcmF0ZTsKLQotCWlmIChjcHVfaXNfb21hcDI0MngoKSkgewotCQlwcmNtX2Nsa3NyY19jdHJsID0gT01BUDI0MjBfUFJDTV9DTEtTUkNfQ1RSTDsKLQkJY3B1X21hc2sgPSBSQVRFX0lOXzI0Mlg7Ci0JfSBlbHNlIGlmIChjcHVfaXNfb21hcDI0MzAoKSkgewotCQlwcmNtX2Nsa3NyY19jdHJsID0gT01BUDI0MzBfUFJDTV9DTEtTUkNfQ1RSTDsKLQkJY3B1X21hc2sgPSBSQVRFX0lOXzI0M1g7Ci0JfQotCi0JY2xrX2luaXQoJm9tYXAyX2Nsa19mdW5jdGlvbnMpOwotCi0JZm9yIChjID0gb21hcDI0eHhfY2xrczsgYyA8IG9tYXAyNHh4X2Nsa3MgKyBBUlJBWV9TSVpFKG9tYXAyNHh4X2Nsa3MpOyBjKyspCi0JCWNsa19wcmVpbml0KGMtPmxrLmNsayk7Ci0KLQlvc2NfY2sucmF0ZSA9IG9tYXAyX29zY19jbGtfcmVjYWxjKCZvc2NfY2spOwotCXByb3BhZ2F0ZV9yYXRlKCZvc2NfY2spOwotCXN5c19jay5yYXRlID0gb21hcDJfc3lzX2Nsa19yZWNhbGMoJnN5c19jayk7Ci0JcHJvcGFnYXRlX3JhdGUoJnN5c19jayk7Ci0KLQlmb3IgKGMgPSBvbWFwMjR4eF9jbGtzOyBjIDwgb21hcDI0eHhfY2xrcyArIEFSUkFZX1NJWkUob21hcDI0eHhfY2xrcyk7IGMrKykKLQkJaWYgKGMtPmNwdSAmIGNwdV9tYXNrKSB7Ci0JCQljbGtkZXZfYWRkKCZjLT5sayk7Ci0JCQljbGtfcmVnaXN0ZXIoYy0+bGsuY2xrKTsKLQkJCW9tYXAyX2luaXRfY2xrX2Nsa2RtKGMtPmxrLmNsayk7Ci0JCX0KLQotCS8qIENoZWNrIHRoZSBNUFUgcmF0ZSBzZXQgYnkgYm9vdGxvYWRlciAqLwotCWNsa3JhdGUgPSBvbWFwMnh4eF9jbGtfZ2V0X2NvcmVfcmF0ZSgmZHBsbF9jayk7Ci0JZm9yIChwcmNtID0gcmF0ZV90YWJsZTsgcHJjbS0+bXB1X3NwZWVkOyBwcmNtKyspIHsKLQkJaWYgKCEocHJjbS0+ZmxhZ3MgJiBjcHVfbWFzaykpCi0JCQljb250aW51ZTsKLQkJaWYgKHByY20tPnh0YWxfc3BlZWQgIT0gc3lzX2NrLnJhdGUpCi0JCQljb250aW51ZTsKLQkJaWYgKHByY20tPmRwbGxfc3BlZWQgPD0gY2xrcmF0ZSkKLQkJCSBicmVhazsKLQl9Ci0JY3Vycl9wcmNtX3NldCA9IHByY207Ci0KLQlyZWNhbGN1bGF0ZV9yb290X2Nsb2NrcygpOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiQ2xvY2tpbmcgcmF0ZSAoQ3J5c3RhbC9EUExML01QVSk6ICIKLQkgICAgICAgIiVsZC4lMDFsZC8lbGQvJWxkIE1IelxuIiwKLQkgICAgICAgKHN5c19jay5yYXRlIC8gMTAwMDAwMCksIChzeXNfY2sucmF0ZSAvIDEwMDAwMCkgJSAxMCwKLQkgICAgICAgKGRwbGxfY2sucmF0ZSAvIDEwMDAwMDApLCAobXB1X2NrLnJhdGUgLyAxMDAwMDAwKSkgOwotCi0JLyoKLQkgKiBPbmx5IGVuYWJsZSB0aG9zZSBjbG9ja3Mgd2Ugd2lsbCBuZWVkLCBsZXQgdGhlIGRyaXZlcnMKLQkgKiBlbmFibGUgb3RoZXIgY2xvY2tzIGFzIG5lY2Vzc2FyeQotCSAqLwotCWNsa19lbmFibGVfaW5pdF9jbG9ja3MoKTsKLQotCS8qIEF2b2lkIHNsZWVwaW5nIHNsZWVwaW5nIGR1cmluZyBvbWFwMl9jbGtfcHJlcGFyZV9mb3JfcmVib290KCkgKi8KLQl2Y2xrID0gY2xrX2dldChOVUxMLCAidmlydF9wcmNtX3NldCIpOwotCXNjbGsgPSBjbGtfZ2V0KE5VTEwsICJzeXNfY2siKTsKLQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazI0eHguaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2syNHh4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxOWNmN2EuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazI0eHguaAorKysgL2Rldi9udWxsCkBAIC0xLDI2NTcgKzAsMCBAQAotLyoKLSAqICBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMjR4eC5oCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwNS0yMDA4IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDggTm9raWEgQ29ycG9yYXRpb24KLSAqCi0gKiAgQ29udGFjdHM6Ci0gKiAgUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgotICogIFBhdWwgV2FsbXNsZXkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpZm5kZWYgX19BUkNIX0FSTV9NQUNIX09NQVAyX0NMT0NLMjRYWF9ICi0jZGVmaW5lIF9fQVJDSF9BUk1fTUFDSF9PTUFQMl9DTE9DSzI0WFhfSAotCi0jaW5jbHVkZSAiY2xvY2suaCIKLQotI2luY2x1ZGUgInBybS5oIgotI2luY2x1ZGUgImNtLmgiCi0jaW5jbHVkZSAicHJtLXJlZ2JpdHMtMjR4eC5oIgotI2luY2x1ZGUgImNtLXJlZ2JpdHMtMjR4eC5oIgotI2luY2x1ZGUgInNkcmMuaCIKLQotLyogUkVWSVNJVDogVGhlc2Ugc2hvdWxkIGJlIHNldCBkeW5hbWljYWxseSBmb3IgQ09ORklHX01VTFRJX09NQVAyICovCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0MjAKLSNkZWZpbmUgT01BUF9DTV9SRUdBRERSCQkJT01BUDI0MjBfQ01fUkVHQUREUgotI2RlZmluZSBPTUFQMjRYWF9QUkNNX0NMS09VVF9DVFJMCU9NQVAyNDIwX1BSQ01fQ0xLT1VUX0NUUkwKLSNkZWZpbmUgT01BUDI0WFhfUFJDTV9DTEtFTVVMX0NUUkwJT01BUDI0MjBfUFJDTV9DTEtFTVVMX0NUUkwKLSNlbHNlCi0jZGVmaW5lIE9NQVBfQ01fUkVHQUREUgkJCU9NQVAyNDMwX0NNX1JFR0FERFIKLSNkZWZpbmUgT01BUDI0WFhfUFJDTV9DTEtPVVRfQ1RSTAlPTUFQMjQzMF9QUkNNX0NMS09VVF9DVFJMCi0jZGVmaW5lIE9NQVAyNFhYX1BSQ01fQ0xLRU1VTF9DVFJMCU9NQVAyNDMwX1BSQ01fQ0xLRU1VTF9DVFJMCi0jZW5kaWYKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgb21hcDJfdGFibGVfbXB1X3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspOwotc3RhdGljIGludCBvbWFwMl9zZWxlY3RfdGFibGVfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7Ci1zdGF0aWMgbG9uZyBvbWFwMl9yb3VuZF90b190YWJsZV9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG9tYXAyX3N5c19jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsayk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBvbWFwMl9vc2NfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgb21hcDJfc3lzX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG9tYXAyX2RwbGxjb3JlX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspOwotc3RhdGljIGludCBvbWFwMl9yZXByb2dyYW1fZHBsbGNvcmUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOwotCi0vKiBLZXkgZGl2aWRlcnMgd2hpY2ggbWFrZSB1cCBhIFBSQ00gc2V0LiBSYXRpbydzIGZvciBhIFBSQ00gYXJlIG1hbmRhdGVkLgotICogeHRhbF9zcGVlZCwgZHBsbF9zcGVlZCwgbXB1X3NwZWVkLCBDTV9DTEtTRUxfTVBVLENNX0NMS1NFTF9EU1AKLSAqIENNX0NMS1NFTF9HRlgsIENNX0NMS1NFTDFfQ09SRSwgQ01fQ0xLU0VMMV9QTEwgQ01fQ0xLU0VMMl9QTEwsIENNX0NMS1NFTF9NRE0KLSAqLwotc3RydWN0IHByY21fY29uZmlnIHsKLQl1bnNpZ25lZCBsb25nIHh0YWxfc3BlZWQ7CS8qIGNyeXN0YWwgcmF0ZSAqLwotCXVuc2lnbmVkIGxvbmcgZHBsbF9zcGVlZDsJLyogZHBsbDogb3V0Knh0YWwqTS8oTi0xKXRhYmxlX3JlY2FsYyAqLwotCXVuc2lnbmVkIGxvbmcgbXB1X3NwZWVkOwkvKiBzcGVlZCBvZiBNUFUgKi8KLQl1bnNpZ25lZCBsb25nIGNtX2Nsa3NlbF9tcHU7CS8qIG1wdSBkaXZpZGVyICovCi0JdW5zaWduZWQgbG9uZyBjbV9jbGtzZWxfZHNwOwkvKiBkc3AraXZhMSBkaXYoMjQyMCksIGl2YTIuMSgyNDMwKSAqLwotCXVuc2lnbmVkIGxvbmcgY21fY2xrc2VsX2dmeDsJLyogZ2Z4IGRpdmlkZXJzICovCi0JdW5zaWduZWQgbG9uZyBjbV9jbGtzZWwxX2NvcmU7CS8qIG1ham9yIHN1YnN5c3RlbSBkaXZpZGVycyAqLwotCXVuc2lnbmVkIGxvbmcgY21fY2xrc2VsMV9wbGw7CS8qIG0sbiAqLwotCXVuc2lnbmVkIGxvbmcgY21fY2xrc2VsMl9wbGw7CS8qIGRwbGx4MSBvciB4MiBvdXQgKi8KLQl1bnNpZ25lZCBsb25nIGNtX2Nsa3NlbF9tZG07CS8qIG1vZGVtIGRpdmlkZXJzIDI0MzAgb25seSAqLwotCXVuc2lnbmVkIGxvbmcgYmFzZV9zZHJjX3JmcjsJLyogYmFzZSByZWZyZXNoIHRpbWluZyBmb3IgYSBzZXQgKi8KLQl1bnNpZ25lZCBjaGFyIGZsYWdzOwotfTsKLQotLyoKLSAqIFRoZSBPTUFQMiBwcm9jZXNzb3IgY2FuIGJlIHJ1biBhdCBzZXZlcmFsIGRpc2NyZXRlICdQUkNNIGNvbmZpZ3VyYXRpb25zJy4KLSAqIFRoZXNlIGNvbmZpZ3VyYXRpb25zIGFyZSBjaGFyYWN0ZXJpemVkIGJ5IHZvbHRhZ2UgYW5kIHNwZWVkIGZvciBjbG9ja3MuCi0gKiBUaGUgZGV2aWNlIGlzIG9ubHkgdmFsaWRhdGVkIGZvciBjZXJ0YWluIGNvbWJpbmF0aW9ucy4gT25lIHdheSB0byBleHByZXNzCi0gKiB0aGVzZSBjb21iaW5hdGlvbnMgaXMgdmlhIHRoZSAncmF0aW8ncycgd2hpY2ggdGhlIGNsb2NrcyBvcGVyYXRlIHdpdGgKLSAqIHJlc3BlY3QgdG8gZWFjaCBvdGhlci4gVGhlc2UgcmF0aW8gc2V0cyBhcmUgZm9yIGEgZ2l2ZW4gdm9sdGFnZS9EUExMCi0gKiBzZXR0aW5nLiBBbGwgY29uZmlndXJhdGlvbnMgY2FuIGJlIGRlc2NyaWJlZCBieSBhIERQTEwgc2V0dGluZyBhbmQgYSByYXRpbwotICogVGhlcmUgYXJlIDMgcmF0aW8gc2V0cyBmb3IgdGhlIDI0MzAgYW5kIFggcmF0aW8gc2V0cyBmb3IgMjQyMC4KLSAqCi0gKiAyNDMwIGRpZmZlcnMgZnJvbSAyNDIwIGluIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgcGhhc2Ugc3luY2hyb25pemVycyB1c2VkLgotICogVGhleSBib3RoIGhhdmUgYSBzbGlnaHRseSBkaWZmZXJlbnQgY2xvY2sgZG9tYWluIHNldHVwLiAyNDIwKGl2YTEsZHNwKSB2cwotICogMjQzMCAoaXZhMi4xLCBOT2RzcCwgbWRtKQotICovCi0KLS8qIENvcmUgZmllbGRzIGZvciBjbV9jbGtzZWwsIG5vdCByYXRpbyBnb3Zlcm5lZCAqLwotI2RlZmluZSBSWF9DTEtTRUxfRFNTMQkJCSgweDEwIDw8IDgpCi0jZGVmaW5lIFJYX0NMS1NFTF9EU1MyCQkJKDB4MCA8PCAxMykKLSNkZWZpbmUgUlhfQ0xLU0VMX1NTSQkJCSgweDUgPDwgMjApCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogVm9sdGFnZS9EUExMIHJhdGlvcwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogMjQzMCBSYXRpbydzLCAyNDMwLVJhdGlvIENvbmZpZyAxICovCi0jZGVmaW5lIFIxX0NMS1NFTF9MMwkJCSg0IDw8IDApCi0jZGVmaW5lIFIxX0NMS1NFTF9MNAkJCSgyIDw8IDUpCi0jZGVmaW5lIFIxX0NMS1NFTF9VU0IJCQkoNCA8PCAyNSkKLSNkZWZpbmUgUjFfQ01fQ0xLU0VMMV9DT1JFX1ZBTAkJUjFfQ0xLU0VMX1VTQiB8IFJYX0NMS1NFTF9TU0kgfCBcCi0JCQkJCVJYX0NMS1NFTF9EU1MyIHwgUlhfQ0xLU0VMX0RTUzEgfCBcCi0JCQkJCVIxX0NMS1NFTF9MNCB8IFIxX0NMS1NFTF9MMwotI2RlZmluZSBSMV9DTEtTRUxfTVBVCQkJKDIgPDwgMCkKLSNkZWZpbmUgUjFfQ01fQ0xLU0VMX01QVV9WQUwJCVIxX0NMS1NFTF9NUFUKLSNkZWZpbmUgUjFfQ0xLU0VMX0RTUAkJCSgyIDw8IDApCi0jZGVmaW5lIFIxX0NMS1NFTF9EU1BfSUYJCSgyIDw8IDUpCi0jZGVmaW5lIFIxX0NNX0NMS1NFTF9EU1BfVkFMCQlSMV9DTEtTRUxfRFNQIHwgUjFfQ0xLU0VMX0RTUF9JRgotI2RlZmluZSBSMV9DTEtTRUxfR0ZYCQkJKDIgPDwgMCkKLSNkZWZpbmUgUjFfQ01fQ0xLU0VMX0dGWF9WQUwJCVIxX0NMS1NFTF9HRlgKLSNkZWZpbmUgUjFfQ0xLU0VMX01ETQkJCSg0IDw8IDApCi0jZGVmaW5lIFIxX0NNX0NMS1NFTF9NRE1fVkFMCQlSMV9DTEtTRUxfTURNCi0KLS8qIDI0MzAtUmF0aW8gQ29uZmlnIDIgKi8KLSNkZWZpbmUgUjJfQ0xLU0VMX0wzCQkJKDYgPDwgMCkKLSNkZWZpbmUgUjJfQ0xLU0VMX0w0CQkJKDIgPDwgNSkKLSNkZWZpbmUgUjJfQ0xLU0VMX1VTQgkJCSgyIDw8IDI1KQotI2RlZmluZSBSMl9DTV9DTEtTRUwxX0NPUkVfVkFMCQlSMl9DTEtTRUxfVVNCIHwgUlhfQ0xLU0VMX1NTSSB8IFwKLQkJCQkJUlhfQ0xLU0VMX0RTUzIgfCBSWF9DTEtTRUxfRFNTMSB8IFwKLQkJCQkJUjJfQ0xLU0VMX0w0IHwgUjJfQ0xLU0VMX0wzCi0jZGVmaW5lIFIyX0NMS1NFTF9NUFUJCQkoMiA8PCAwKQotI2RlZmluZSBSMl9DTV9DTEtTRUxfTVBVX1ZBTAkJUjJfQ0xLU0VMX01QVQotI2RlZmluZSBSMl9DTEtTRUxfRFNQCQkJKDIgPDwgMCkKLSNkZWZpbmUgUjJfQ0xLU0VMX0RTUF9JRgkJKDMgPDwgNSkKLSNkZWZpbmUgUjJfQ01fQ0xLU0VMX0RTUF9WQUwJCVIyX0NMS1NFTF9EU1AgfCBSMl9DTEtTRUxfRFNQX0lGCi0jZGVmaW5lIFIyX0NMS1NFTF9HRlgJCQkoMiA8PCAwKQotI2RlZmluZSBSMl9DTV9DTEtTRUxfR0ZYX1ZBTAkJUjJfQ0xLU0VMX0dGWAotI2RlZmluZSBSMl9DTEtTRUxfTURNCQkJKDYgPDwgMCkKLSNkZWZpbmUgUjJfQ01fQ0xLU0VMX01ETV9WQUwJCVIyX0NMS1NFTF9NRE0KLQotLyogMjQzMC1SYXRpbyBCb290bSAoQllQQVNTKSAqLwotI2RlZmluZSBSQl9DTEtTRUxfTDMJCQkoMSA8PCAwKQotI2RlZmluZSBSQl9DTEtTRUxfTDQJCQkoMSA8PCA1KQotI2RlZmluZSBSQl9DTEtTRUxfVVNCCQkJKDEgPDwgMjUpCi0jZGVmaW5lIFJCX0NNX0NMS1NFTDFfQ09SRV9WQUwJCVJCX0NMS1NFTF9VU0IgfCBSWF9DTEtTRUxfU1NJIHwgXAotCQkJCQlSWF9DTEtTRUxfRFNTMiB8IFJYX0NMS1NFTF9EU1MxIHwgXAotCQkJCQlSQl9DTEtTRUxfTDQgfCBSQl9DTEtTRUxfTDMKLSNkZWZpbmUgUkJfQ0xLU0VMX01QVQkJCSgxIDw8IDApCi0jZGVmaW5lIFJCX0NNX0NMS1NFTF9NUFVfVkFMCQlSQl9DTEtTRUxfTVBVCi0jZGVmaW5lIFJCX0NMS1NFTF9EU1AJCQkoMSA8PCAwKQotI2RlZmluZSBSQl9DTEtTRUxfRFNQX0lGCQkoMSA8PCA1KQotI2RlZmluZSBSQl9DTV9DTEtTRUxfRFNQX1ZBTAkJUkJfQ0xLU0VMX0RTUCB8IFJCX0NMS1NFTF9EU1BfSUYKLSNkZWZpbmUgUkJfQ0xLU0VMX0dGWAkJCSgxIDw8IDApCi0jZGVmaW5lIFJCX0NNX0NMS1NFTF9HRlhfVkFMCQlSQl9DTEtTRUxfR0ZYCi0jZGVmaW5lIFJCX0NMS1NFTF9NRE0JCQkoMSA8PCAwKQotI2RlZmluZSBSQl9DTV9DTEtTRUxfTURNX1ZBTAkJUkJfQ0xLU0VMX01ETQotCi0vKiAyNDIwIFJhdGlvIEVxdWl2YWxlbnRzICovCi0jZGVmaW5lIFJYWF9DTEtTRUxfVkxZTlEJCSgweDEyIDw8IDE1KQotI2RlZmluZSBSWFhfQ0xLU0VMX1NTSQkJCSgweDggPDwgMjApCi0KLS8qIDI0MjAtUFJDTSBJSUkgNTMyTUh6IGNvcmUgKi8KLSNkZWZpbmUgUklJSV9DTEtTRUxfTDMJCQkoNCA8PCAwKQkvKiAxMzNNSHogKi8KLSNkZWZpbmUgUklJSV9DTEtTRUxfTDQJCQkoMiA8PCA1KQkvKiA2Ni41TUh6ICovCi0jZGVmaW5lIFJJSUlfQ0xLU0VMX1VTQgkJCSg0IDw8IDI1KQkvKiAzMy4yNU1IeiAqLwotI2RlZmluZSBSSUlJX0NNX0NMS1NFTDFfQ09SRV9WQUwJUklJSV9DTEtTRUxfVVNCIHwgUlhYX0NMS1NFTF9TU0kgfCBcCi0JCQkJCVJYWF9DTEtTRUxfVkxZTlEgfCBSWF9DTEtTRUxfRFNTMiB8IFwKLQkJCQkJUlhfQ0xLU0VMX0RTUzEgfCBSSUlJX0NMS1NFTF9MNCB8IFwKLQkJCQkJUklJSV9DTEtTRUxfTDMKLSNkZWZpbmUgUklJSV9DTEtTRUxfTVBVCQkJKDIgPDwgMCkJLyogMjY2TUh6ICovCi0jZGVmaW5lIFJJSUlfQ01fQ0xLU0VMX01QVV9WQUwJCVJJSUlfQ0xLU0VMX01QVQotI2RlZmluZSBSSUlJX0NMS1NFTF9EU1AJCQkoMyA8PCAwKQkvKiBjNXggLSAxNzcuM01IeiAqLwotI2RlZmluZSBSSUlJX0NMS1NFTF9EU1BfSUYJCSgyIDw8IDUpCS8qIGM1eCAtIDg4LjY3TUh6ICovCi0jZGVmaW5lIFJJSUlfU1lOQ19EU1AJCQkoMSA8PCA3KQkvKiBFbmFibGUgc3luYyAqLwotI2RlZmluZSBSSUlJX0NMS1NFTF9JVkEJCQkoNiA8PCA4KQkvKiBpdmExIC0gODguNjdNSHogKi8KLSNkZWZpbmUgUklJSV9TWU5DX0lWQQkJCSgxIDw8IDEzKQkvKiBFbmFibGUgc3luYyAqLwotI2RlZmluZSBSSUlJX0NNX0NMS1NFTF9EU1BfVkFMCQlSSUlJX1NZTkNfSVZBIHwgUklJSV9DTEtTRUxfSVZBIHwgXAotCQkJCQlSSUlJX1NZTkNfRFNQIHwgUklJSV9DTEtTRUxfRFNQX0lGIHwgXAotCQkJCQlSSUlJX0NMS1NFTF9EU1AKLSNkZWZpbmUgUklJSV9DTEtTRUxfR0ZYCQkJKDIgPDwgMCkJLyogNjYuNU1IeiAqLwotI2RlZmluZSBSSUlJX0NNX0NMS1NFTF9HRlhfVkFMCQlSSUlJX0NMS1NFTF9HRlgKLQotLyogMjQyMC1QUkNNIElJIDYwME1IeiBjb3JlICovCi0jZGVmaW5lIFJJSV9DTEtTRUxfTDMJCQkoNiA8PCAwKQkvKiAxMDBNSHogKi8KLSNkZWZpbmUgUklJX0NMS1NFTF9MNAkJCSgyIDw8IDUpCS8qIDUwTUh6ICovCi0jZGVmaW5lIFJJSV9DTEtTRUxfVVNCCQkJKDIgPDwgMjUpCS8qIDUwTUh6ICovCi0jZGVmaW5lIFJJSV9DTV9DTEtTRUwxX0NPUkVfVkFMCQlSSUlfQ0xLU0VMX1VTQiB8IFwKLQkJCQkJUlhYX0NMS1NFTF9TU0kgfCBSWFhfQ0xLU0VMX1ZMWU5RIHwgXAotCQkJCQlSWF9DTEtTRUxfRFNTMiB8IFJYX0NMS1NFTF9EU1MxIHwgXAotCQkJCQlSSUlfQ0xLU0VMX0w0IHwgUklJX0NMS1NFTF9MMwotI2RlZmluZSBSSUlfQ0xLU0VMX01QVQkJCSgyIDw8IDApCS8qIDMwME1IeiAqLwotI2RlZmluZSBSSUlfQ01fQ0xLU0VMX01QVV9WQUwJCVJJSV9DTEtTRUxfTVBVCi0jZGVmaW5lIFJJSV9DTEtTRUxfRFNQCQkJKDMgPDwgMCkJLyogYzV4IC0gMjAwTUh6ICovCi0jZGVmaW5lIFJJSV9DTEtTRUxfRFNQX0lGCQkoMiA8PCA1KQkvKiBjNXggLSAxMDBNSHogKi8KLSNkZWZpbmUgUklJX1NZTkNfRFNQCQkJKDAgPDwgNykJLyogQnlwYXNzIHN5bmMgKi8KLSNkZWZpbmUgUklJX0NMS1NFTF9JVkEJCQkoMyA8PCA4KQkvKiBpdmExIC0gMjAwTUh6ICovCi0jZGVmaW5lIFJJSV9TWU5DX0lWQQkJCSgwIDw8IDEzKQkvKiBCeXBhc3Mgc3luYyAqLwotI2RlZmluZSBSSUlfQ01fQ0xLU0VMX0RTUF9WQUwJCVJJSV9TWU5DX0lWQSB8IFJJSV9DTEtTRUxfSVZBIHwgXAotCQkJCQlSSUlfU1lOQ19EU1AgfCBSSUlfQ0xLU0VMX0RTUF9JRiB8IFwKLQkJCQkJUklJX0NMS1NFTF9EU1AKLSNkZWZpbmUgUklJX0NMS1NFTF9HRlgJCQkoMiA8PCAwKQkvKiA1ME1IeiAqLwotI2RlZmluZSBSSUlfQ01fQ0xLU0VMX0dGWF9WQUwJCVJJSV9DTEtTRUxfR0ZYCi0KLS8qIDI0MjAtUFJDTSBJIDY2ME1IeiBjb3JlICovCi0jZGVmaW5lIFJJX0NMS1NFTF9MMwkJCSg0IDw8IDApCS8qIDE2NU1IeiAqLwotI2RlZmluZSBSSV9DTEtTRUxfTDQJCQkoMiA8PCA1KQkvKiA4Mi41TUh6ICovCi0jZGVmaW5lIFJJX0NMS1NFTF9VU0IJCQkoNCA8PCAyNSkJLyogNDEuMjVNSHogKi8KLSNkZWZpbmUgUklfQ01fQ0xLU0VMMV9DT1JFX1ZBTAkJUklfQ0xLU0VMX1VTQiB8IFwKLQkJCQkJUlhYX0NMS1NFTF9TU0kgfCBSWFhfQ0xLU0VMX1ZMWU5RIHwgXAotCQkJCQlSWF9DTEtTRUxfRFNTMiB8IFJYX0NMS1NFTF9EU1MxIHwgXAotCQkJCQlSSV9DTEtTRUxfTDQgfCBSSV9DTEtTRUxfTDMKLSNkZWZpbmUgUklfQ0xLU0VMX01QVQkJCSgyIDw8IDApCS8qIDMzME1IeiAqLwotI2RlZmluZSBSSV9DTV9DTEtTRUxfTVBVX1ZBTAkJUklfQ0xLU0VMX01QVQotI2RlZmluZSBSSV9DTEtTRUxfRFNQCQkJKDMgPDwgMCkJLyogYzV4IC0gMjIwTUh6ICovCi0jZGVmaW5lIFJJX0NMS1NFTF9EU1BfSUYJCSgyIDw8IDUpCS8qIGM1eCAtIDExME1IeiAqLwotI2RlZmluZSBSSV9TWU5DX0RTUAkJCSgxIDw8IDcpCS8qIEFjdGl2YXRlIHN5bmMgKi8KLSNkZWZpbmUgUklfQ0xLU0VMX0lWQQkJCSg0IDw8IDgpCS8qIGl2YTEgLSAxNjVNSHogKi8KLSNkZWZpbmUgUklfU1lOQ19JVkEJCQkoMCA8PCAxMykJLyogQnlwYXNzIHN5bmMgKi8KLSNkZWZpbmUgUklfQ01fQ0xLU0VMX0RTUF9WQUwJCVJJX1NZTkNfSVZBIHwgUklfQ0xLU0VMX0lWQSB8IFwKLQkJCQkJUklfU1lOQ19EU1AgfCBSSV9DTEtTRUxfRFNQX0lGIHwgXAotCQkJCQlSSV9DTEtTRUxfRFNQCi0jZGVmaW5lIFJJX0NMS1NFTF9HRlgJCQkoMSA8PCAwKQkvKiAxNjVNSHogKi8KLSNkZWZpbmUgUklfQ01fQ0xLU0VMX0dGWF9WQUwJCVJJX0NMS1NFTF9HRlgKLQotLyogMjQyMC1QUkNNIFZJSSAoYm9vdCkgKi8KLSNkZWZpbmUgUlZJSV9DTEtTRUxfTDMJCQkoMSA8PCAwKQotI2RlZmluZSBSVklJX0NMS1NFTF9MNAkJCSgxIDw8IDUpCi0jZGVmaW5lIFJWSUlfQ0xLU0VMX0RTUzEJCSgxIDw8IDgpCi0jZGVmaW5lIFJWSUlfQ0xLU0VMX0RTUzIJCSgwIDw8IDEzKQotI2RlZmluZSBSVklJX0NMS1NFTF9WTFlOUQkJKDEgPDwgMTUpCi0jZGVmaW5lIFJWSUlfQ0xLU0VMX1NTSQkJCSgxIDw8IDIwKQotI2RlZmluZSBSVklJX0NMS1NFTF9VU0IJCQkoMSA8PCAyNSkKLQotI2RlZmluZSBSVklJX0NNX0NMS1NFTDFfQ09SRV9WQUwJUlZJSV9DTEtTRUxfVVNCIHwgUlZJSV9DTEtTRUxfU1NJIHwgXAotCQkJCQlSVklJX0NMS1NFTF9WTFlOUSB8IFJWSUlfQ0xLU0VMX0RTUzIgfCBcCi0JCQkJCVJWSUlfQ0xLU0VMX0RTUzEgfCBSVklJX0NMS1NFTF9MNCB8IFJWSUlfQ0xLU0VMX0wzCi0KLSNkZWZpbmUgUlZJSV9DTEtTRUxfTVBVCQkJKDEgPDwgMCkgLyogYWxsIGRpdmlkZSBieSAxICovCi0jZGVmaW5lIFJWSUlfQ01fQ0xLU0VMX01QVV9WQUwJCVJWSUlfQ0xLU0VMX01QVQotCi0jZGVmaW5lIFJWSUlfQ0xLU0VMX0RTUAkJCSgxIDw8IDApCi0jZGVmaW5lIFJWSUlfQ0xLU0VMX0RTUF9JRgkJKDEgPDwgNSkKLSNkZWZpbmUgUlZJSV9TWU5DX0RTUAkJCSgwIDw8IDcpCi0jZGVmaW5lIFJWSUlfQ0xLU0VMX0lWQQkJCSgxIDw8IDgpCi0jZGVmaW5lIFJWSUlfU1lOQ19JVkEJCQkoMCA8PCAxMykKLSNkZWZpbmUgUlZJSV9DTV9DTEtTRUxfRFNQX1ZBTAkJUlZJSV9TWU5DX0lWQSB8IFJWSUlfQ0xLU0VMX0lWQSB8IFJWSUlfU1lOQ19EU1AgfCBcCi0JCQkJCVJWSUlfQ0xLU0VMX0RTUF9JRiB8IFJWSUlfQ0xLU0VMX0RTUAotCi0jZGVmaW5lIFJWSUlfQ0xLU0VMX0dGWAkJCSgxIDw8IDApCi0jZGVmaW5lIFJWSUlfQ01fQ0xLU0VMX0dGWF9WQUwJCVJWSUlfQ0xLU0VMX0dGWAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDI0MzAgVGFyZ2V0IG1vZGVzOiBBbG9uZyB3aXRoIGVhY2ggY29uZmlndXJhdGlvbiB0aGUgQ1BVIGhhcyBzZXZlcmFsCi0gKiBtb2RlcyB3aGljaCBnb2VzIGFsb25nIHdpdGggdGhlbS4gTW9kZXMgbWFpbmx5IGFyZSB0aGUgYWRkaXRpb24gb2YKLSAqIGRlc2NyaWJlIERQTEwgY29tYmluYXRpb25zIHRvIGdvIGFsb25nIHdpdGggYSByYXRpby4KLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEhhcmR3YXJlIGdvdmVybmVkICovCi0jZGVmaW5lIE1YXzQ4TV9TUkMJCQkoMCA8PCAzKQotI2RlZmluZSBNWF81NE1fU1JDCQkJKDAgPDwgNSkKLSNkZWZpbmUgTVhfQVBMTFNfQ0xJS0lOXzEyCQkoMyA8PCAyMykKLSNkZWZpbmUgTVhfQVBMTFNfQ0xJS0lOXzEzCQkoMiA8PCAyMykKLSNkZWZpbmUgTVhfQVBMTFNfQ0xJS0lOXzE5XzIJCSgwIDw8IDIzKQotCi0vKgotICogMjQzMCAtIHN0YW5kYWxvbmUsIDIqcmVmKk0vKG4rMSksIE0vTiBpcyBmb3IgZXhhY3RuZXNzIG5vdCByZWxvY2sgc3BlZWQKLSAqICM1YQkocmF0aW8xKSBiYXNlcG9ydC10YXJnZXQsIHRhcmdldCBEUExMID0gMjY2KjIgPSA1MzJNSHoKLSAqLwotI2RlZmluZSBNNUFfRFBMTF9NVUxUXzEyCQkoMTMzIDw8IDEyKQotI2RlZmluZSBNNUFfRFBMTF9ESVZfMTIJCQkoNSA8PCA4KQotI2RlZmluZSBNNUFfQ01fQ0xLU0VMMV9QTExfMTJfVkFMCU1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgXAotCQkJCQlNNUFfRFBMTF9ESVZfMTIgfCBNNUFfRFBMTF9NVUxUXzEyIHwgXAotCQkJCQlNWF9BUExMU19DTElLSU5fMTIKLSNkZWZpbmUgTTVBX0RQTExfTVVMVF8xMwkJKDYxIDw8IDEyKQotI2RlZmluZSBNNUFfRFBMTF9ESVZfMTMJCQkoMiA8PCA4KQotI2RlZmluZSBNNUFfQ01fQ0xLU0VMMV9QTExfMTNfVkFMCU1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgXAotCQkJCQlNNUFfRFBMTF9ESVZfMTMgfCBNNUFfRFBMTF9NVUxUXzEzIHwgXAotCQkJCQlNWF9BUExMU19DTElLSU5fMTMKLSNkZWZpbmUgTTVBX0RQTExfTVVMVF8xOQkJKDU1IDw8IDEyKQotI2RlZmluZSBNNUFfRFBMTF9ESVZfMTkJCQkoMyA8PCA4KQotI2RlZmluZSBNNUFfQ01fQ0xLU0VMMV9QTExfMTlfVkFMCU1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgXAotCQkJCQlNNUFfRFBMTF9ESVZfMTkgfCBNNUFfRFBMTF9NVUxUXzE5IHwgXAotCQkJCQlNWF9BUExMU19DTElLSU5fMTlfMgotLyogIzViCShyYXRpbzEpIHRhcmdldCBEUExMID0gMjAwKjIgPSA0MDBNSHogKi8KLSNkZWZpbmUgTTVCX0RQTExfTVVMVF8xMgkJKDUwIDw8IDEyKQotI2RlZmluZSBNNUJfRFBMTF9ESVZfMTIJCQkoMiA8PCA4KQotI2RlZmluZSBNNUJfQ01fQ0xLU0VMMV9QTExfMTJfVkFMCU1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgXAotCQkJCQlNNUJfRFBMTF9ESVZfMTIgfCBNNUJfRFBMTF9NVUxUXzEyIHwgXAotCQkJCQlNWF9BUExMU19DTElLSU5fMTIKLSNkZWZpbmUgTTVCX0RQTExfTVVMVF8xMwkJKDIwMCA8PCAxMikKLSNkZWZpbmUgTTVCX0RQTExfRElWXzEzCQkJKDEyIDw8IDgpCi0KLSNkZWZpbmUgTTVCX0NNX0NMS1NFTDFfUExMXzEzX1ZBTAlNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IFwKLQkJCQkJTTVCX0RQTExfRElWXzEzIHwgTTVCX0RQTExfTVVMVF8xMyB8IFwKLQkJCQkJTVhfQVBMTFNfQ0xJS0lOXzEzCi0jZGVmaW5lIE01Ql9EUExMX01VTFRfMTkJCSgxMjUgPDwgMTIpCi0jZGVmaW5lIE01Ql9EUExMX0RJVl8xOQkJCSgzMSA8PCA4KQotI2RlZmluZSBNNUJfQ01fQ0xLU0VMMV9QTExfMTlfVkFMCU1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgXAotCQkJCQlNNUJfRFBMTF9ESVZfMTkgfCBNNUJfRFBMTF9NVUxUXzE5IHwgXAotCQkJCQlNWF9BUExMU19DTElLSU5fMTlfMgotLyoKLSAqICM0CShyYXRpbzIpLCBEUExMID0gMzk5KjIgPSA3OThNSHosIEwzPTEzM01IegotICovCi0jZGVmaW5lIE00X0RQTExfTVVMVF8xMgkJCSgxMzMgPDwgMTIpCi0jZGVmaW5lIE00X0RQTExfRElWXzEyCQkJKDMgPDwgOCkKLSNkZWZpbmUgTTRfQ01fQ0xLU0VMMV9QTExfMTJfVkFMCU1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgXAotCQkJCQlNNF9EUExMX0RJVl8xMiB8IE00X0RQTExfTVVMVF8xMiB8IFwKLQkJCQkJTVhfQVBMTFNfQ0xJS0lOXzEyCi0KLSNkZWZpbmUgTTRfRFBMTF9NVUxUXzEzCQkJKDM5OSA8PCAxMikKLSNkZWZpbmUgTTRfRFBMTF9ESVZfMTMJCQkoMTIgPDwgOCkKLSNkZWZpbmUgTTRfQ01fQ0xLU0VMMV9QTExfMTNfVkFMCU1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgXAotCQkJCQlNNF9EUExMX0RJVl8xMyB8IE00X0RQTExfTVVMVF8xMyB8IFwKLQkJCQkJTVhfQVBMTFNfQ0xJS0lOXzEzCi0KLSNkZWZpbmUgTTRfRFBMTF9NVUxUXzE5CQkJKDE0NSA8PCAxMikKLSNkZWZpbmUgTTRfRFBMTF9ESVZfMTkJCQkoNiA8PCA4KQotI2RlZmluZSBNNF9DTV9DTEtTRUwxX1BMTF8xOV9WQUwJTVhfNDhNX1NSQyB8IE1YXzU0TV9TUkMgfCBcCi0JCQkJCU00X0RQTExfRElWXzE5IHwgTTRfRFBMTF9NVUxUXzE5IHwgXAotCQkJCQlNWF9BUExMU19DTElLSU5fMTlfMgotCi0vKgotICogIzMJKHJhdGlvMikgYmFzZXBvcnQtdGFyZ2V0LCB0YXJnZXQgRFBMTCA9IDMzMCoyID0gNjYwTUh6Ci0gKi8KLSNkZWZpbmUgTTNfRFBMTF9NVUxUXzEyCQkJKDU1IDw8IDEyKQotI2RlZmluZSBNM19EUExMX0RJVl8xMgkJCSgxIDw8IDgpCi0jZGVmaW5lIE0zX0NNX0NMS1NFTDFfUExMXzEyX1ZBTAlNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IFwKLQkJCQkJTTNfRFBMTF9ESVZfMTIgfCBNM19EUExMX01VTFRfMTIgfCBcCi0JCQkJCU1YX0FQTExTX0NMSUtJTl8xMgotI2RlZmluZSBNM19EUExMX01VTFRfMTMJCQkoNzYgPDwgMTIpCi0jZGVmaW5lIE0zX0RQTExfRElWXzEzCQkJKDIgPDwgOCkKLSNkZWZpbmUgTTNfQ01fQ0xLU0VMMV9QTExfMTNfVkFMCU1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgXAotCQkJCQlNM19EUExMX0RJVl8xMyB8IE0zX0RQTExfTVVMVF8xMyB8IFwKLQkJCQkJTVhfQVBMTFNfQ0xJS0lOXzEzCi0jZGVmaW5lIE0zX0RQTExfTVVMVF8xOQkJCSgxNyA8PCAxMikKLSNkZWZpbmUgTTNfRFBMTF9ESVZfMTkJCQkoMCA8PCA4KQotI2RlZmluZSBNM19DTV9DTEtTRUwxX1BMTF8xOV9WQUwJTVhfNDhNX1NSQyB8IE1YXzU0TV9TUkMgfCBcCi0JCQkJCU0zX0RQTExfRElWXzE5IHwgTTNfRFBMTF9NVUxUXzE5IHwgXAotCQkJCQlNWF9BUExMU19DTElLSU5fMTlfMgotCi0vKgotICogIzIgICAocmF0aW8xKSBEUExMID0gMzMwKjIgPSA2NjBNSHosIEwzPTE2NU1IegotICovCi0jZGVmaW5lIE0yX0RQTExfTVVMVF8xMgkJICAgICAgICAoNTUgPDwgMTIpCi0jZGVmaW5lIE0yX0RQTExfRElWXzEyCQkgICAgICAgICgxIDw8IDgpCi0jZGVmaW5lIE0yX0NNX0NMS1NFTDFfUExMXzEyX1ZBTAlNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IFwKLQkJCQkJTTJfRFBMTF9ESVZfMTIgfCBNMl9EUExMX01VTFRfMTIgfCBcCi0JCQkJCU1YX0FQTExTX0NMSUtJTl8xMgotCi0vKiBTcGVlZCBjaGFuZ2VzIC0gVXNlZCA2NTguN01IeiBpbnN0ZWFkIG9mIDY2ME1IeiBmb3IgTFAtUmVmcmVzaCBNPTc2IE49MiwKLSAqIHJlbG9jayB0aW1lIGlzc3VlICovCi0vKiBDb3JlIGZyZXF1ZW5jeSBjaGFuZ2VkIGZyb20gMzMwLzE2NSB0byAzMjkvMTY0IE1IeiovCi0jZGVmaW5lIE0yX0RQTExfTVVMVF8xMwkJICAgICAgICAoNzYgPDwgMTIpCi0jZGVmaW5lIE0yX0RQTExfRElWXzEzCQkgICAgICAgICgyIDw8IDgpCi0jZGVmaW5lIE0yX0NNX0NMS1NFTDFfUExMXzEzX1ZBTAlNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IFwKLQkJCQkJTTJfRFBMTF9ESVZfMTMgfCBNMl9EUExMX01VTFRfMTMgfCBcCi0JCQkJCU1YX0FQTExTX0NMSUtJTl8xMwotCi0jZGVmaW5lIE0yX0RQTExfTVVMVF8xOQkJICAgICAgICAoMTcgPDwgMTIpCi0jZGVmaW5lIE0yX0RQTExfRElWXzE5CQkgICAgICAgICgwIDw8IDgpCi0jZGVmaW5lIE0yX0NNX0NMS1NFTDFfUExMXzE5X1ZBTAlNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IFwKLQkJCQkJTTJfRFBMTF9ESVZfMTkgfCBNMl9EUExMX01VTFRfMTkgfCBcCi0JCQkJCU1YX0FQTExTX0NMSUtJTl8xOV8yCi0KLS8qIGJvb3QgKGJvb3QpICovCi0jZGVmaW5lIE1CX0RQTExfTVVMVAkJCSgxIDw8IDEyKQotI2RlZmluZSBNQl9EUExMX0RJVgkJCSgwIDw8IDgpCi0jZGVmaW5lIE1CX0NNX0NMS1NFTDFfUExMXzEyX1ZBTAlNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IE1CX0RQTExfRElWIHxcCi0JCQkJCU1CX0RQTExfTVVMVCB8IE1YX0FQTExTX0NMSUtJTl8xMgotCi0jZGVmaW5lIE1CX0NNX0NMS1NFTDFfUExMXzEzX1ZBTAlNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IE1CX0RQTExfRElWIHxcCi0JCQkJCU1CX0RQTExfTVVMVCB8IE1YX0FQTExTX0NMSUtJTl8xMwotCi0jZGVmaW5lIE1CX0NNX0NMS1NFTDFfUExMXzE5X1ZBTAlNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IE1CX0RQTExfRElWIHxcCi0JCQkJCU1CX0RQTExfTVVMVCB8IE1YX0FQTExTX0NMSUtJTl8xOQotCi0vKgotICogMjQzMCAtIGNoYXNzaXMgKHNlZG5hKQotICogMTY1IChyYXRpbzEpIHNhbWUgYXMgYWJvdmUgIzIKLSAqIDE1MCAocmF0aW8xKQotICogMTMzIChyYXRpbzIpIHNhbWUgYXMgYWJvdmUgIzQKLSAqIDExMCAocmF0aW8yKSBzYW1lIGFzIGFib3ZlICMzCi0gKiAxMDQgKHJhdGlvMikKLSAqIGJvb3QgKGJvb3QpCi0gKi8KLQotLyogUFJDTSBJIHRhcmdldCBEUExMID0gMiozMzBNSHogPSA2NjBNSHogKi8KLSNkZWZpbmUgTUlfRFBMTF9NVUxUXzEyCQkJKDU1IDw8IDEyKQotI2RlZmluZSBNSV9EUExMX0RJVl8xMgkJCSgxIDw8IDgpCi0jZGVmaW5lIE1JX0NNX0NMS1NFTDFfUExMXzEyX1ZBTAlNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IFwKLQkJCQkJTUlfRFBMTF9ESVZfMTIgfCBNSV9EUExMX01VTFRfMTIgfCBcCi0JCQkJCU1YX0FQTExTX0NMSUtJTl8xMgotCi0vKgotICogMjQyMCBFcXVpdmFsZW50IC0gbW9kZSByZWdpc3RlcnMKLSAqIFBSQ00gSUkgLCB0YXJnZXQgRFBMTCA9IDIqMzAwTUh6ID0gNjAwTUh6Ci0gKi8KLSNkZWZpbmUgTUlJX0RQTExfTVVMVF8xMgkJKDUwIDw8IDEyKQotI2RlZmluZSBNSUlfRFBMTF9ESVZfMTIJCQkoMSA8PCA4KQotI2RlZmluZSBNSUlfQ01fQ0xLU0VMMV9QTExfMTJfVkFMCU1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgXAotCQkJCQlNSUlfRFBMTF9ESVZfMTIgfCBNSUlfRFBMTF9NVUxUXzEyIHwgXAotCQkJCQlNWF9BUExMU19DTElLSU5fMTIKLSNkZWZpbmUgTUlJX0RQTExfTVVMVF8xMwkJKDMwMCA8PCAxMikKLSNkZWZpbmUgTUlJX0RQTExfRElWXzEzCQkJKDEyIDw8IDgpCi0jZGVmaW5lIE1JSV9DTV9DTEtTRUwxX1BMTF8xM19WQUwJTVhfNDhNX1NSQyB8IE1YXzU0TV9TUkMgfCBcCi0JCQkJCU1JSV9EUExMX0RJVl8xMyB8IE1JSV9EUExMX01VTFRfMTMgfCBcCi0JCQkJCU1YX0FQTExTX0NMSUtJTl8xMwotCi0vKiBQUkNNIElJSSB0YXJnZXQgRFBMTCA9IDIqMjY2ID0gNTMyTUh6Ki8KLSNkZWZpbmUgTUlJSV9EUExMX01VTFRfMTIJCSgxMzMgPDwgMTIpCi0jZGVmaW5lIE1JSUlfRFBMTF9ESVZfMTIJCSg1IDw8IDgpCi0jZGVmaW5lIE1JSUlfQ01fQ0xLU0VMMV9QTExfMTJfVkFMCU1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgXAotCQkJCQlNSUlJX0RQTExfRElWXzEyIHwgTUlJSV9EUExMX01VTFRfMTIgfCBcCi0JCQkJCU1YX0FQTExTX0NMSUtJTl8xMgotI2RlZmluZSBNSUlJX0RQTExfTVVMVF8xMwkJKDI2NiA8PCAxMikKLSNkZWZpbmUgTUlJSV9EUExMX0RJVl8xMwkJKDEyIDw8IDgpCi0jZGVmaW5lIE1JSUlfQ01fQ0xLU0VMMV9QTExfMTNfVkFMCU1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgXAotCQkJCQlNSUlJX0RQTExfRElWXzEzIHwgTUlJSV9EUExMX01VTFRfMTMgfCBcCi0JCQkJCU1YX0FQTExTX0NMSUtJTl8xMwotCi0vKiBQUkNNIFZJSSAoYm9vdCBieXBhc3MpICovCi0jZGVmaW5lIE1WSUlfQ01fQ0xLU0VMMV9QTExfMTJfVkFMCU1CX0NNX0NMS1NFTDFfUExMXzEyX1ZBTAotI2RlZmluZSBNVklJX0NNX0NMS1NFTDFfUExMXzEzX1ZBTAlNQl9DTV9DTEtTRUwxX1BMTF8xM19WQUwKLQotLyogSGlnaCBhbmQgbG93IG9wZXJhdGlvbiB2YWx1ZSAqLwotI2RlZmluZSBNWF9DTEtTRUwyX1BMTF8yeF9WQUwJCSgyIDw8IDApCi0jZGVmaW5lIE1YX0NMS1NFTDJfUExMXzF4X1ZBTAkJKDEgPDwgMCkKLQotLyogTVBVIHNwZWVkIGRlZmluZXMgKi8KLSNkZWZpbmUgUzEyTQkxMjAwMDAwMAotI2RlZmluZSBTMTNNCTEzMDAwMDAwCi0jZGVmaW5lIFMxOU0JMTkyMDAwMDAKLSNkZWZpbmUgUzI2TQkyNjAwMDAwMAotI2RlZmluZSBTMTAwTQkxMDAwMDAwMDAKLSNkZWZpbmUgUzEzM00JMTMzMDAwMDAwCi0jZGVmaW5lIFMxNTBNCTE1MDAwMDAwMAotI2RlZmluZSBTMTY0TQkxNjQwMDAwMDAKLSNkZWZpbmUgUzE2NU0JMTY1MDAwMDAwCi0jZGVmaW5lIFMxOTlNCTE5OTAwMDAwMAotI2RlZmluZSBTMjAwTQkyMDAwMDAwMDAKLSNkZWZpbmUgUzI2Nk0JMjY2MDAwMDAwCi0jZGVmaW5lIFMzMDBNCTMwMDAwMDAwMAotI2RlZmluZSBTMzI5TQkzMjkwMDAwMDAKLSNkZWZpbmUgUzMzME0JMzMwMDAwMDAwCi0jZGVmaW5lIFMzOTlNCTM5OTAwMDAwMAotI2RlZmluZSBTNDAwTQk0MDAwMDAwMDAKLSNkZWZpbmUgUzUzMk0JNTMyMDAwMDAwCi0jZGVmaW5lIFM2MDBNCTYwMDAwMDAwMAotI2RlZmluZSBTNjU4TQk2NTgwMDAwMDAKLSNkZWZpbmUgUzY2ME0JNjYwMDAwMDAwCi0jZGVmaW5lIFM3OThNCTc5ODAwMDAwMAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEtleSBkaXZpZGVycyB3aGljaCBtYWtlIHVwIGEgUFJDTSBzZXQuIFJhdGlvJ3MgZm9yIGEgUFJDTSBhcmUgbWFuZGF0ZWQuCi0gKiB4dGFsX3NwZWVkLCBkcGxsX3NwZWVkLCBtcHVfc3BlZWQsIENNX0NMS1NFTF9NUFUsCi0gKiBDTV9DTEtTRUxfRFNQLCBDTV9DTEtTRUxfR0ZYLCBDTV9DTEtTRUwxX0NPUkUsIENNX0NMS1NFTDFfUExMLAotICogQ01fQ0xLU0VMMl9QTEwsIENNX0NMS1NFTF9NRE0KLSAqCi0gKiBGaWxsaW5nIGluIHRhYmxlIGJhc2VkIG9uIEg0IGJvYXJkcyBhbmQgMjQzMC1TRFBzIHZhcmlhbnRzIGF2YWlsYWJsZS4KLSAqIFRoZXJlIGFyZSBxdWl0ZSBhIGZldyBtb3JlIHJhdGVzIGNvbWJpbmF0aW9ucyB3aGljaCBjb3VsZCBiZSBkZWZpbmVkLgotICoKLSAqIFdoZW4gbXVsdGlwbGUgdmFsdWVzIGFyZSBkZWZpbmVkIHRoZSBzdGFydCB1cCB3aWxsIHRyeSBhbmQgY2hvb3NlIHRoZQotICogZmFzdGVzdCBvbmUuIElmIGEgJ2Zhc3QnIHZhbHVlIGlzIGRlZmluZWQsIHRoZW4gYXV0b21hdGljYWxseSwgdGhlIC8yCi0gKiBvbmUgc2hvdWxkIGJlIGluY2x1ZGVkIGFzIGl0IGNhbiBiZSB1c2VkLglHZW5lcmFsbHkgaGF2aW5nIG1vcmUgdGhhdAotICogb25lIGZhc3Qgc2V0IGRvZXMgbm90IG1ha2Ugc2Vuc2UsIGFzIHN0YXRpYyB0aW1pbmdzIG5lZWQgdG8gYmUgY2hhbmdlZAotICogdG8gY2hhbmdlIHRoZSBzZXQuCSBUaGUgZXhjZXB0aW9uIGlzIHRoZSBieXBhc3Mgc2V0dGluZyB3aGljaCBpcwotICogYXZhaWxibGUgZm9yIGxvdyBwb3dlciBieXBhc3MuCi0gKgotICogTm90ZTogVGhpcyB0YWJsZSBuZWVkcyB0byBiZSBzb3J0ZWQsIGZhc3Rlc3QgdG8gc2xvd2VzdC4KLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgc3RydWN0IHByY21fY29uZmlnIHJhdGVfdGFibGVbXSA9IHsKLQkvKiBQUkNNIEkgLSBGQVNUICovCi0Je1MxMk0sIFM2NjBNLCBTMzMwTSwgUklfQ01fQ0xLU0VMX01QVV9WQUwsCQkvKiAzMzBNSHogQVJNICovCi0JCVJJX0NNX0NMS1NFTF9EU1BfVkFMLCBSSV9DTV9DTEtTRUxfR0ZYX1ZBTCwKLQkJUklfQ01fQ0xLU0VMMV9DT1JFX1ZBTCwgTUlfQ01fQ0xLU0VMMV9QTExfMTJfVkFMLAotCQlNWF9DTEtTRUwyX1BMTF8yeF9WQUwsIDAsIFNEUkNfUkZSX0NUUkxfMTY1TUh6LAotCQlSQVRFX0lOXzI0Mlh9LAotCi0JLyogUFJDTSBJSSAtIEZBU1QgKi8KLQl7UzEyTSwgUzYwME0sIFMzMDBNLCBSSUlfQ01fQ0xLU0VMX01QVV9WQUwsCQkvKiAzMDBNSHogQVJNICovCi0JCVJJSV9DTV9DTEtTRUxfRFNQX1ZBTCwgUklJX0NNX0NMS1NFTF9HRlhfVkFMLAotCQlSSUlfQ01fQ0xLU0VMMV9DT1JFX1ZBTCwgTUlJX0NNX0NMS1NFTDFfUExMXzEyX1ZBTCwKLQkJTVhfQ0xLU0VMMl9QTExfMnhfVkFMLCAwLCBTRFJDX1JGUl9DVFJMXzEwME1IeiwKLQkJUkFURV9JTl8yNDJYfSwKLQotCXtTMTNNLCBTNjAwTSwgUzMwME0sIFJJSV9DTV9DTEtTRUxfTVBVX1ZBTCwJCS8qIDMwME1IeiBBUk0gKi8KLQkJUklJX0NNX0NMS1NFTF9EU1BfVkFMLCBSSUlfQ01fQ0xLU0VMX0dGWF9WQUwsCi0JCVJJSV9DTV9DTEtTRUwxX0NPUkVfVkFMLCBNSUlfQ01fQ0xLU0VMMV9QTExfMTNfVkFMLAotCQlNWF9DTEtTRUwyX1BMTF8yeF9WQUwsIDAsIFNEUkNfUkZSX0NUUkxfMTAwTUh6LAotCQlSQVRFX0lOXzI0Mlh9LAotCi0JLyogUFJDTSBJSUkgLSBGQVNUICovCi0Je1MxMk0sIFM1MzJNLCBTMjY2TSwgUklJSV9DTV9DTEtTRUxfTVBVX1ZBTCwJCS8qIDI2Nk1IeiBBUk0gKi8KLQkJUklJSV9DTV9DTEtTRUxfRFNQX1ZBTCwgUklJSV9DTV9DTEtTRUxfR0ZYX1ZBTCwKLQkJUklJSV9DTV9DTEtTRUwxX0NPUkVfVkFMLCBNSUlJX0NNX0NMS1NFTDFfUExMXzEyX1ZBTCwKLQkJTVhfQ0xLU0VMMl9QTExfMnhfVkFMLCAwLCBTRFJDX1JGUl9DVFJMXzEzM01IeiwKLQkJUkFURV9JTl8yNDJYfSwKLQotCXtTMTNNLCBTNTMyTSwgUzI2Nk0sIFJJSUlfQ01fQ0xLU0VMX01QVV9WQUwsCQkvKiAyNjZNSHogQVJNICovCi0JCVJJSUlfQ01fQ0xLU0VMX0RTUF9WQUwsIFJJSUlfQ01fQ0xLU0VMX0dGWF9WQUwsCi0JCVJJSUlfQ01fQ0xLU0VMMV9DT1JFX1ZBTCwgTUlJSV9DTV9DTEtTRUwxX1BMTF8xM19WQUwsCi0JCU1YX0NMS1NFTDJfUExMXzJ4X1ZBTCwgMCwgU0RSQ19SRlJfQ1RSTF8xMzNNSHosCi0JCVJBVEVfSU5fMjQyWH0sCi0KLQkvKiBQUkNNIElJIC0gU0xPVyAqLwotCXtTMTJNLCBTMzAwTSwgUzE1ME0sIFJJSV9DTV9DTEtTRUxfTVBVX1ZBTCwJCS8qIDE1ME1IeiBBUk0gKi8KLQkJUklJX0NNX0NMS1NFTF9EU1BfVkFMLCBSSUlfQ01fQ0xLU0VMX0dGWF9WQUwsCi0JCVJJSV9DTV9DTEtTRUwxX0NPUkVfVkFMLCBNSUlfQ01fQ0xLU0VMMV9QTExfMTJfVkFMLAotCQlNWF9DTEtTRUwyX1BMTF8yeF9WQUwsIDAsIFNEUkNfUkZSX0NUUkxfMTAwTUh6LAotCQlSQVRFX0lOXzI0Mlh9LAotCi0Je1MxM00sIFMzMDBNLCBTMTUwTSwgUklJX0NNX0NMS1NFTF9NUFVfVkFMLAkJLyogMTUwTUh6IEFSTSAqLwotCQlSSUlfQ01fQ0xLU0VMX0RTUF9WQUwsIFJJSV9DTV9DTEtTRUxfR0ZYX1ZBTCwKLQkJUklJX0NNX0NMS1NFTDFfQ09SRV9WQUwsIE1JSV9DTV9DTEtTRUwxX1BMTF8xM19WQUwsCi0JCU1YX0NMS1NFTDJfUExMXzJ4X1ZBTCwgMCwgU0RSQ19SRlJfQ1RSTF8xMDBNSHosCi0JCVJBVEVfSU5fMjQyWH0sCi0KLQkvKiBQUkNNIElJSSAtIFNMT1cgKi8KLQl7UzEyTSwgUzI2Nk0sIFMxMzNNLCBSSUlJX0NNX0NMS1NFTF9NUFVfVkFMLAkJLyogMTMzTUh6IEFSTSAqLwotCQlSSUlJX0NNX0NMS1NFTF9EU1BfVkFMLCBSSUlJX0NNX0NMS1NFTF9HRlhfVkFMLAotCQlSSUlJX0NNX0NMS1NFTDFfQ09SRV9WQUwsIE1JSUlfQ01fQ0xLU0VMMV9QTExfMTJfVkFMLAotCQlNWF9DTEtTRUwyX1BMTF8yeF9WQUwsIDAsIFNEUkNfUkZSX0NUUkxfMTMzTUh6LAotCQlSQVRFX0lOXzI0Mlh9LAotCi0Je1MxM00sIFMyNjZNLCBTMTMzTSwgUklJSV9DTV9DTEtTRUxfTVBVX1ZBTCwJCS8qIDEzM01IeiBBUk0gKi8KLQkJUklJSV9DTV9DTEtTRUxfRFNQX1ZBTCwgUklJSV9DTV9DTEtTRUxfR0ZYX1ZBTCwKLQkJUklJSV9DTV9DTEtTRUwxX0NPUkVfVkFMLCBNSUlJX0NNX0NMS1NFTDFfUExMXzEzX1ZBTCwKLQkJTVhfQ0xLU0VMMl9QTExfMnhfVkFMLCAwLCBTRFJDX1JGUl9DVFJMXzEzM01IeiwKLQkJUkFURV9JTl8yNDJYfSwKLQotCS8qIFBSQ00tVklJIChib290LWJ5cGFzcykgKi8KLQl7UzEyTSwgUzEyTSwgUzEyTSwgUlZJSV9DTV9DTEtTRUxfTVBVX1ZBTCwJCS8qIDEyTUh6IEFSTSovCi0JCVJWSUlfQ01fQ0xLU0VMX0RTUF9WQUwsIFJWSUlfQ01fQ0xLU0VMX0dGWF9WQUwsCi0JCVJWSUlfQ01fQ0xLU0VMMV9DT1JFX1ZBTCwgTVZJSV9DTV9DTEtTRUwxX1BMTF8xMl9WQUwsCi0JCU1YX0NMS1NFTDJfUExMXzJ4X1ZBTCwgMCwgU0RSQ19SRlJfQ1RSTF9CWVBBU1MsCi0JCVJBVEVfSU5fMjQyWH0sCi0KLQkvKiBQUkNNLVZJSSAoYm9vdC1ieXBhc3MpICovCi0Je1MxM00sIFMxM00sIFMxM00sIFJWSUlfQ01fQ0xLU0VMX01QVV9WQUwsCQkvKiAxM01IeiBBUk0gKi8KLQkJUlZJSV9DTV9DTEtTRUxfRFNQX1ZBTCwgUlZJSV9DTV9DTEtTRUxfR0ZYX1ZBTCwKLQkJUlZJSV9DTV9DTEtTRUwxX0NPUkVfVkFMLCBNVklJX0NNX0NMS1NFTDFfUExMXzEzX1ZBTCwKLQkJTVhfQ0xLU0VMMl9QTExfMnhfVkFMLCAwLCBTRFJDX1JGUl9DVFJMX0JZUEFTUywKLQkJUkFURV9JTl8yNDJYfSwKLQotCS8qIFBSQ00gIzQgLSByYXRpbzIgKEVTMi4xKSAtIEZBU1QgKi8KLQl7UzEzTSwgUzc5OE0sIFMzOTlNLCBSMl9DTV9DTEtTRUxfTVBVX1ZBTCwJCS8qIDM5OU1IeiBBUk0gKi8KLQkJUjJfQ01fQ0xLU0VMX0RTUF9WQUwsIFIyX0NNX0NMS1NFTF9HRlhfVkFMLAotCQlSMl9DTV9DTEtTRUwxX0NPUkVfVkFMLCBNNF9DTV9DTEtTRUwxX1BMTF8xM19WQUwsCi0JCU1YX0NMS1NFTDJfUExMXzJ4X1ZBTCwgUjJfQ01fQ0xLU0VMX01ETV9WQUwsCi0JCVNEUkNfUkZSX0NUUkxfMTMzTUh6LAotCQlSQVRFX0lOXzI0M1h9LAotCi0JLyogUFJDTSAjMiAtIHJhdGlvMSAoRVMyKSAtIEZBU1QgKi8KLQl7UzEzTSwgUzY1OE0sIFMzMjlNLCBSMV9DTV9DTEtTRUxfTVBVX1ZBTCwJCS8qIDMzME1IeiBBUk0gKi8KLQkJUjFfQ01fQ0xLU0VMX0RTUF9WQUwsIFIxX0NNX0NMS1NFTF9HRlhfVkFMLAotCQlSMV9DTV9DTEtTRUwxX0NPUkVfVkFMLCBNMl9DTV9DTEtTRUwxX1BMTF8xM19WQUwsCi0JCU1YX0NMS1NFTDJfUExMXzJ4X1ZBTCwgUjFfQ01fQ0xLU0VMX01ETV9WQUwsCi0JCVNEUkNfUkZSX0NUUkxfMTY1TUh6LAotCQlSQVRFX0lOXzI0M1h9LAotCi0JLyogUFJDTSAjNWEgLSByYXRpbzEgLSBGQVNUICovCi0Je1MxM00sIFM1MzJNLCBTMjY2TSwgUjFfQ01fQ0xLU0VMX01QVV9WQUwsCQkvKiAyNjZNSHogQVJNICovCi0JCVIxX0NNX0NMS1NFTF9EU1BfVkFMLCBSMV9DTV9DTEtTRUxfR0ZYX1ZBTCwKLQkJUjFfQ01fQ0xLU0VMMV9DT1JFX1ZBTCwgTTVBX0NNX0NMS1NFTDFfUExMXzEzX1ZBTCwKLQkJTVhfQ0xLU0VMMl9QTExfMnhfVkFMLCBSMV9DTV9DTEtTRUxfTURNX1ZBTCwKLQkJU0RSQ19SRlJfQ1RSTF8xMzNNSHosCi0JCVJBVEVfSU5fMjQzWH0sCi0KLQkvKiBQUkNNICM1YiAtIHJhdGlvMSAtIEZBU1QgKi8KLQl7UzEzTSwgUzQwME0sIFMyMDBNLCBSMV9DTV9DTEtTRUxfTVBVX1ZBTCwJCS8qIDIwME1IeiBBUk0gKi8KLQkJUjFfQ01fQ0xLU0VMX0RTUF9WQUwsIFIxX0NNX0NMS1NFTF9HRlhfVkFMLAotCQlSMV9DTV9DTEtTRUwxX0NPUkVfVkFMLCBNNUJfQ01fQ0xLU0VMMV9QTExfMTNfVkFMLAotCQlNWF9DTEtTRUwyX1BMTF8yeF9WQUwsIFIxX0NNX0NMS1NFTF9NRE1fVkFMLAotCQlTRFJDX1JGUl9DVFJMXzEwME1IeiwKLQkJUkFURV9JTl8yNDNYfSwKLQotCS8qIFBSQ00gIzQgLSByYXRpbzEgKEVTMi4xKSAtIFNMT1cgKi8KLQl7UzEzTSwgUzM5OU0sIFMxOTlNLCBSMl9DTV9DTEtTRUxfTVBVX1ZBTCwJCS8qIDIwME1IeiBBUk0gKi8KLQkJUjJfQ01fQ0xLU0VMX0RTUF9WQUwsIFIyX0NNX0NMS1NFTF9HRlhfVkFMLAotCQlSMl9DTV9DTEtTRUwxX0NPUkVfVkFMLCBNNF9DTV9DTEtTRUwxX1BMTF8xM19WQUwsCi0JCU1YX0NMS1NFTDJfUExMXzF4X1ZBTCwgUjJfQ01fQ0xLU0VMX01ETV9WQUwsCi0JCVNEUkNfUkZSX0NUUkxfMTMzTUh6LAotCQlSQVRFX0lOXzI0M1h9LAotCi0JLyogUFJDTSAjMiAtIHJhdGlvMSAoRVMyKSAtIFNMT1cgKi8KLQl7UzEzTSwgUzMyOU0sIFMxNjRNLCBSMV9DTV9DTEtTRUxfTVBVX1ZBTCwJCS8qIDE2NU1IeiBBUk0gKi8KLQkJUjFfQ01fQ0xLU0VMX0RTUF9WQUwsIFIxX0NNX0NMS1NFTF9HRlhfVkFMLAotCQlSMV9DTV9DTEtTRUwxX0NPUkVfVkFMLCBNMl9DTV9DTEtTRUwxX1BMTF8xM19WQUwsCi0JCU1YX0NMS1NFTDJfUExMXzF4X1ZBTCwgUjFfQ01fQ0xLU0VMX01ETV9WQUwsCi0JCVNEUkNfUkZSX0NUUkxfMTY1TUh6LAotCQlSQVRFX0lOXzI0M1h9LAotCi0JLyogUFJDTSAjNWEgLSByYXRpbzEgLSBTTE9XICovCi0Je1MxM00sIFMyNjZNLCBTMTMzTSwgUjFfQ01fQ0xLU0VMX01QVV9WQUwsCQkvKiAxMzNNSHogQVJNICovCi0JCVIxX0NNX0NMS1NFTF9EU1BfVkFMLCBSMV9DTV9DTEtTRUxfR0ZYX1ZBTCwKLQkJUjFfQ01fQ0xLU0VMMV9DT1JFX1ZBTCwgTTVBX0NNX0NMS1NFTDFfUExMXzEzX1ZBTCwKLQkJTVhfQ0xLU0VMMl9QTExfMXhfVkFMLCBSMV9DTV9DTEtTRUxfTURNX1ZBTCwKLQkJU0RSQ19SRlJfQ1RSTF8xMzNNSHosCi0JCVJBVEVfSU5fMjQzWH0sCi0KLQkvKiBQUkNNICM1YiAtIHJhdGlvMSAtIFNMT1cqLwotCXtTMTNNLCBTMjAwTSwgUzEwME0sIFIxX0NNX0NMS1NFTF9NUFVfVkFMLAkJLyogMTAwTUh6IEFSTSAqLwotCQlSMV9DTV9DTEtTRUxfRFNQX1ZBTCwgUjFfQ01fQ0xLU0VMX0dGWF9WQUwsCi0JCVIxX0NNX0NMS1NFTDFfQ09SRV9WQUwsIE01Ql9DTV9DTEtTRUwxX1BMTF8xM19WQUwsCi0JCU1YX0NMS1NFTDJfUExMXzF4X1ZBTCwgUjFfQ01fQ0xLU0VMX01ETV9WQUwsCi0JCVNEUkNfUkZSX0NUUkxfMTAwTUh6LAotCQlSQVRFX0lOXzI0M1h9LAotCi0JLyogUFJDTS1ib290L2J5cGFzcyAqLwotCXtTMTNNLCBTMTNNLCBTMTNNLCBSQl9DTV9DTEtTRUxfTVBVX1ZBTCwJCS8qIDEzTWh6ICovCi0JCVJCX0NNX0NMS1NFTF9EU1BfVkFMLCBSQl9DTV9DTEtTRUxfR0ZYX1ZBTCwKLQkJUkJfQ01fQ0xLU0VMMV9DT1JFX1ZBTCwgTUJfQ01fQ0xLU0VMMV9QTExfMTNfVkFMLAotCQlNWF9DTEtTRUwyX1BMTF8yeF9WQUwsIFJCX0NNX0NMS1NFTF9NRE1fVkFMLAotCQlTRFJDX1JGUl9DVFJMX0JZUEFTUywKLQkJUkFURV9JTl8yNDNYfSwKLQotCS8qIFBSQ00tYm9vdC9ieXBhc3MgKi8KLQl7UzEyTSwgUzEyTSwgUzEyTSwgUkJfQ01fQ0xLU0VMX01QVV9WQUwsCQkvKiAxMk1oeiAqLwotCQlSQl9DTV9DTEtTRUxfRFNQX1ZBTCwgUkJfQ01fQ0xLU0VMX0dGWF9WQUwsCi0JCVJCX0NNX0NMS1NFTDFfQ09SRV9WQUwsIE1CX0NNX0NMS1NFTDFfUExMXzEyX1ZBTCwKLQkJTVhfQ0xLU0VMMl9QTExfMnhfVkFMLCBSQl9DTV9DTEtTRUxfTURNX1ZBTCwKLQkJU0RSQ19SRlJfQ1RSTF9CWVBBU1MsCi0JCVJBVEVfSU5fMjQzWH0sCi0KLQl7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAotfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyNHh4IGNsb2NrIHRyZWUuCi0gKgotICogTk9URTpJbiBtYW55IGNhc2VzIGhlcmUgd2UgYXJlIGFzc2lnbmluZyBhICdkZWZhdWx0JyBwYXJlbnQuCUluIG1hbnkKLSAqCWNhc2VzIHRoZSBwYXJlbnQgaXMgc2VsZWN0YWJsZS4JVGhlIGdldC9zZXQgcGFyZW50IGNhbGxzIHdpbGwgYWxzbwotICoJc3dpdGNoIHNvdXJjZXMuCi0gKgotICoJTWFueSBzb21lIGNsb2NrcyBzYXkgYWx3YXlzX2VuYWJsZWQsIGJ1dCB0aGV5IGNhbiBiZSBhdXRvIGlkbGVkIGZvcgotICoJcG93ZXIgc2F2aW5ncy4gVGhleSB3aWxsIGFsd2F5cyBiZSBhdmFpbGFibGUgdXBvbiBjbG9jayByZXF1ZXN0LgotICoKLSAqCVNldmVyYWwgc291cmNlcyBhcmUgZ2l2ZW4gaW5pdGlhbCByYXRlcyB3aGljaCBtYXkgYmUgd3JvbmcsIHRoaXMgd2lsbAotICoJYmUgZml4ZWQgdXAgaW4gdGhlIGluaXQgZnVuYy4KLSAqCi0gKglUaGluZ3MgYXJlIGJyb2FkbHkgc2VwYXJhdGVkIGJlbG93IGJ5IGNsb2NrIGRvbWFpbnMuIEl0IGlzCi0gKglub3Rld29ydGh5IHRoYXQgbW9zdCBwZXJpZmVyYWxzIGhhdmUgZGVwZW5kZW5jaWVzIG9uIG11bHRpcGxlIGNsb2NrCi0gKglkb21haW5zLiBNYW55IGdldCB0aGVpciBpbnRlcmZhY2UgY2xvY2tzIGZyb20gdGhlIEw0IGRvbWFpbiwgYnV0IGdldAotICoJZnVuY3Rpb25hbCBjbG9ja3MgZnJvbSBmaXhlZCBzb3VyY2VzIG9yIG90aGVyIGNvcmUgZG9tYWluIGRlcml2ZWQKLSAqCWNsb2Nrcy4KLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEJhc2UgZXh0ZXJuYWwgaW5wdXQgY2xvY2tzICovCi1zdGF0aWMgc3RydWN0IGNsayBmdW5jXzMya19jayA9IHsKLQkubmFtZQkJPSAiZnVuY18zMmtfY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5yYXRlCQk9IDMyMDAwLAotCS5mbGFncwkJPSBSQVRFX0ZJWEVELAotCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgc2VjdXJlXzMya19jayA9IHsKLQkubmFtZQkJPSAic2VjdXJlXzMya19jayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnJhdGUJCT0gMzI3NjgsCi0JLmZsYWdzCQk9IFJBVEVfRklYRUQsCi0JLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCi19OwotCi0vKiBUeXBpY2FsIDEyLzEzTUh6IGluIHN0YW5kYWxvbmUgbW9kZSwgd2lsbCBiZSAyNk1oeiBpbiBjaGFzc2lzIG1vZGUgKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrIG9zY19jayA9IHsJCS8qICgqMTIsICoxMywgMTkuMiwgKjI2LCAzOC40KU1IeiAqLwotCS5uYW1lCQk9ICJvc2NfY2siLAotCS5vcHMJCT0gJmNsa29wc19vc2NjaywKLQkuY2xrZG1fbmFtZQk9ICJ3a3VwX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZvbWFwMl9vc2NfY2xrX3JlY2FsYywKLX07Ci0KLS8qIFdpdGhvdXQgbW9kZW0gbGlrZWx5IDEyTUh6LCB3aXRoIG1vZGVtIGxpa2VseSAxM01IeiAqLwotc3RhdGljIHN0cnVjdCBjbGsgc3lzX2NrID0gewkJLyogKCoxMiwgKjEzLCAxOS4yLCAyNiwgMzguNClNSHogKi8KLQkubmFtZQkJPSAic3lzX2NrIiwJCS8qIH4gcmVmX2NsayBhbHNvICovCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmb3NjX2NrLAotCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAotCS5yZWNhbGMJCT0gJm9tYXAyX3N5c19jbGtfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgYWx0X2NrID0gewkJLyogVHlwaWNhbCA1NE0gb3IgNDhNLCBtYXkgbm90IGV4aXN0ICovCi0JLm5hbWUJCT0gImFsdF9jayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnJhdGUJCT0gNTQwMDAwMDAsCi0JLmZsYWdzCQk9IFJBVEVfRklYRUQsCi0JLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCi19OwotCi0vKgotICogQW5hbG9nIGRvbWFpbiByb290IHNvdXJjZSBjbG9ja3MKLSAqLwotCi0vKiBkcGxsX2NrLCBpcyBicm9rZW4gb3V0IGluIHRvIHNwZWNpYWwgY2FzZXMgdGhyb3VnaCBjbGtzZWwgKi8KLS8qIFJFVklTSVQ6IFJhdGUgY2hhbmdlcyBvbiBkcGxsX2NrIHRyaWdnZXIgYSBmdWxsIHNldCBjaGFuZ2UuCS4uLgotICogZGVhbCB3aXRoIHRoaXMKLSAqLwotCi1zdGF0aWMgc3RydWN0IGRwbGxfZGF0YSBkcGxsX2RkID0gewotCS5tdWx0X2RpdjFfcmVnCQk9IE9NQVBfQ01fUkVHQUREUihQTExfTU9ELCBDTV9DTEtTRUwxKSwKLQkubXVsdF9tYXNrCQk9IE9NQVAyNFhYX0RQTExfTVVMVF9NQVNLLAotCS5kaXYxX21hc2sJCT0gT01BUDI0WFhfRFBMTF9ESVZfTUFTSywKLQkuY2xrX2J5cGFzcwkJPSAmc3lzX2NrLAotCS5jbGtfcmVmCQk9ICZzeXNfY2ssCi0JLmNvbnRyb2xfcmVnCQk9IE9NQVBfQ01fUkVHQUREUihQTExfTU9ELCBDTV9DTEtFTiksCi0JLmVuYWJsZV9tYXNrCQk9IE9NQVAyNFhYX0VOX0RQTExfTUFTSywKLQkubWF4X211bHRpcGxpZXIJCT0gMTAyNCwKLQkubWluX2RpdmlkZXIJCT0gMSwKLQkubWF4X2RpdmlkZXIJCT0gMTYsCi0JLnJhdGVfdG9sZXJhbmNlCQk9IERFRkFVTFRfRFBMTF9SQVRFX1RPTEVSQU5DRQotfTsKLQotLyoKLSAqIFhYWCBDYW5ub3QgYWRkIHJvdW5kX3JhdGUgaGVyZSB5ZXQsIGFzIHRoaXMgaXMgc3RpbGwgYSBjb21wb3NpdGUgY2xvY2ssCi0gKiBub3QganVzdCBhIERQTEwKLSAqLwotc3RhdGljIHN0cnVjdCBjbGsgZHBsbF9jayA9IHsKLQkubmFtZQkJPSAiZHBsbF9jayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmc3lzX2NrLAkJLyogQ2FuIGJlIGZ1bmNfMzJrIGFsc28gKi8KLQkuZHBsbF9kYXRhCT0gJmRwbGxfZGQsCi0JLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmb21hcDJfZHBsbGNvcmVfcmVjYWxjLAotCS5zZXRfcmF0ZQk9ICZvbWFwMl9yZXByb2dyYW1fZHBsbGNvcmUsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBhcGxsOTZfY2sgPSB7Ci0JLm5hbWUJCT0gImFwbGw5Nl9jayIsCi0JLm9wcwkJPSAmY2xrb3BzX2ZpeGVkLAotCS5wYXJlbnQJCT0gJnN5c19jaywKLQkucmF0ZQkJPSA5NjAwMDAwMCwKLQkuZmxhZ3MJCT0gUkFURV9GSVhFRCB8IEVOQUJMRV9PTl9JTklULAotCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKFBMTF9NT0QsIENNX0NMS0VOKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOXzk2TV9QTExfU0hJRlQsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBhcGxsNTRfY2sgPSB7Ci0JLm5hbWUJCT0gImFwbGw1NF9jayIsCi0JLm9wcwkJPSAmY2xrb3BzX2ZpeGVkLAotCS5wYXJlbnQJCT0gJnN5c19jaywKLQkucmF0ZQkJPSA1NDAwMDAwMCwKLQkuZmxhZ3MJCT0gUkFURV9GSVhFRCB8IEVOQUJMRV9PTl9JTklULAotCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKFBMTF9NT0QsIENNX0NMS0VOKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOXzU0TV9QTExfU0hJRlQsCi19OwotCi0vKgotICogUFJDTSBkaWdpdGFsIGJhc2Ugc291cmNlcwotICovCi0KLS8qIGZ1bmNfNTRtX2NrICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgZnVuY181NG1fYXBsbDU0X3JhdGVzW10gPSB7Ci0JeyAuZGl2ID0gMSwgLnZhbCA9IDAsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB8IERFRkFVTFRfUkFURSB9LAotCXsgLmRpdiA9IDAgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgZnVuY181NG1fYWx0X3JhdGVzW10gPSB7Ci0JeyAuZGl2ID0gMSwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB8IERFRkFVTFRfUkFURSB9LAotCXsgLmRpdiA9IDAgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGZ1bmNfNTRtX2Nsa3NlbFtdID0gewotCXsgLnBhcmVudCA9ICZhcGxsNTRfY2ssIC5yYXRlcyA9IGZ1bmNfNTRtX2FwbGw1NF9yYXRlcywgfSwKLQl7IC5wYXJlbnQgPSAmYWx0X2NrLAkucmF0ZXMgPSBmdW5jXzU0bV9hbHRfcmF0ZXMsIH0sCi0JeyAucGFyZW50ID0gTlVMTCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZnVuY181NG1fY2sgPSB7Ci0JLm5hbWUJCT0gImZ1bmNfNTRtX2NrIiwKLQkub3BzCQk9ICZjbGtvcHNfbnVsbCwKLQkucGFyZW50CQk9ICZhcGxsNTRfY2ssCS8qIGNhbiBhbHNvIGJlIGFsdF9jbGsgKi8KLQkuY2xrZG1fbmFtZQk9ICJ3a3VwX2Nsa2RtIiwKLQkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAotCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKFBMTF9NT0QsIENNX0NMS1NFTDEpLAotCS5jbGtzZWxfbWFzawk9IE9NQVAyNFhYXzU0TV9TT1VSQ0UsCi0JLmNsa3NlbAkJPSBmdW5jXzU0bV9jbGtzZWwsCi0JLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGNvcmVfY2sgPSB7Ci0JLm5hbWUJCT0gImNvcmVfY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJmRwbGxfY2ssCQkvKiBjYW4gYWxzbyBiZSAzMmsgKi8KLQkuY2xrZG1fbmFtZQk9ICJ3a3VwX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotLyogZnVuY185Nm1fY2sgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgZnVuY185Nm1fYXBsbDk2X3JhdGVzW10gPSB7Ci0JeyAuZGl2ID0gMSwgLnZhbCA9IDAsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB8IERFRkFVTFRfUkFURSB9LAotCXsgLmRpdiA9IDAgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgZnVuY185Nm1fYWx0X3JhdGVzW10gPSB7Ci0JeyAuZGl2ID0gMSwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fMjQzWCB8IERFRkFVTFRfUkFURSB9LAotCXsgLmRpdiA9IDAgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGZ1bmNfOTZtX2Nsa3NlbFtdID0gewotCXsgLnBhcmVudCA9ICZhcGxsOTZfY2ssCS5yYXRlcyA9IGZ1bmNfOTZtX2FwbGw5Nl9yYXRlcyB9LAotCXsgLnBhcmVudCA9ICZhbHRfY2ssCS5yYXRlcyA9IGZ1bmNfOTZtX2FsdF9yYXRlcyB9LAotCXsgLnBhcmVudCA9IE5VTEwgfQotfTsKLQotLyogVGhlIHBhcmVudCBvZiB0aGlzIGNsb2NrIGlzIG5vdCBzZWxlY3RhYmxlIG9uIDI0MjAuICovCi1zdGF0aWMgc3RydWN0IGNsayBmdW5jXzk2bV9jayA9IHsKLQkubmFtZQkJPSAiZnVuY185Nm1fY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJmFwbGw5Nl9jaywKLQkuY2xrZG1fbmFtZQk9ICJ3a3VwX2Nsa2RtIiwKLQkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAotCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKFBMTF9NT0QsIENNX0NMS1NFTDEpLAotCS5jbGtzZWxfbWFzawk9IE9NQVAyNDMwXzk2TV9TT1VSQ0UsCi0JLmNsa3NlbAkJPSBmdW5jXzk2bV9jbGtzZWwsCi0JLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKLQkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKLQkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlCi19OwotCi0vKiBmdW5jXzQ4bV9jayAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGZ1bmNfNDhtX2FwbGw5Nl9yYXRlc1tdID0gewotCXsgLmRpdiA9IDIsIC52YWwgPSAwLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfCBERUZBVUxUX1JBVEUgfSwKLQl7IC5kaXYgPSAwIH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGZ1bmNfNDhtX2FsdF9yYXRlc1tdID0gewotCXsgLmRpdiA9IDEsIC52YWwgPSAxLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfCBERUZBVUxUX1JBVEUgfSwKLQl7IC5kaXYgPSAwIH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBmdW5jXzQ4bV9jbGtzZWxbXSA9IHsKLQl7IC5wYXJlbnQgPSAmYXBsbDk2X2NrLAkucmF0ZXMgPSBmdW5jXzQ4bV9hcGxsOTZfcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSAmYWx0X2NrLCAucmF0ZXMgPSBmdW5jXzQ4bV9hbHRfcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSBOVUxMIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGZ1bmNfNDhtX2NrID0gewotCS5uYW1lCQk9ICJmdW5jXzQ4bV9jayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmYXBsbDk2X2NrLAkgLyogOTZNIG9yIEFsdCAqLwotCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAotCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCi0JLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQ0xLU0VMMSksCi0JLmNsa3NlbF9tYXNrCT0gT01BUDI0WFhfNDhNX1NPVVJDRSwKLQkuY2xrc2VsCQk9IGZ1bmNfNDhtX2Nsa3NlbCwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9yb3VuZF9yYXRlLAotCS5zZXRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfc2V0X3JhdGUKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGZ1bmNfMTJtX2NrID0gewotCS5uYW1lCQk9ICJmdW5jXzEybV9jayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmZnVuY180OG1fY2ssCi0JLmZpeGVkX2Rpdgk9IDQsCi0JLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmb21hcDJfZml4ZWRfZGl2aXNvcl9yZWNhbGMsCi19OwotCi0vKiBTZWN1cmUgdGltZXIsIG9ubHkgYXZhaWxhYmxlIGluIHNlY3VyZSBtb2RlICovCi1zdGF0aWMgc3RydWN0IGNsayB3ZHQxX29zY19jayA9IHsKLQkubmFtZQkJPSAiY2tfd2R0MV9vc2MiLAotCS5vcHMJCT0gJmNsa29wc19udWxsLCAvKiBSTUs6IG1pc3Npbmc/ICovCi0JLnBhcmVudAkJPSAmb3NjX2NrLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi0vKgotICogVGhlIGNvbW1vbl9jbGtvdXQqIGNsa3NlbF9yYXRlIHN0cnVjdHMgYXJlIGNvbW1vbiB0bwotICogc3lzX2Nsa291dCwgc3lzX2Nsa291dF9zcmMsIHN5c19jbGtvdXQyLCBhbmQgc3lzX2Nsa291dDJfc3JjLgotICogc3lzX2Nsa291dDJfKiBhcmUgMjQyMC1vbmx5LCBzbyB0aGUKLSAqIGNsa3NlbF9yYXRlIGZsYWdzIGZpZWxkcyBhcmUgaW5hY2N1cmF0ZSBmb3IgdGhvc2UgY2xvY2tzLiBUaGlzIGlzCi0gKiBoYXJtbGVzcyBzaW5jZSBhY2Nlc3MgdG8gdGhvc2UgY2xvY2tzIGFyZSBnYXRlZCBieSB0aGUgc3RydWN0IGNsawotICogZmxhZ3MgZmllbGRzLCB3aGljaCBtYXJrIHRoZW0gYXMgMjQyMC1vbmx5LgotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGNvbW1vbl9jbGtvdXRfc3JjX2NvcmVfcmF0ZXNbXSA9IHsKLQl7IC5kaXYgPSAxLCAudmFsID0gMCwgLmZsYWdzID0gUkFURV9JTl8yNFhYIHwgREVGQVVMVF9SQVRFIH0sCi0JeyAuZGl2ID0gMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGNvbW1vbl9jbGtvdXRfc3JjX3N5c19yYXRlc1tdID0gewotCXsgLmRpdiA9IDEsIC52YWwgPSAxLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfCBERUZBVUxUX1JBVEUgfSwKLQl7IC5kaXYgPSAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgY29tbW9uX2Nsa291dF9zcmNfOTZtX3JhdGVzW10gPSB7Ci0JeyAuZGl2ID0gMSwgLnZhbCA9IDIsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB8IERFRkFVTFRfUkFURSB9LAotCXsgLmRpdiA9IDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBjb21tb25fY2xrb3V0X3NyY181NG1fcmF0ZXNbXSA9IHsKLQl7IC5kaXYgPSAxLCAudmFsID0gMywgLmZsYWdzID0gUkFURV9JTl8yNFhYIHwgREVGQVVMVF9SQVRFIH0sCi0JeyAuZGl2ID0gMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBjb21tb25fY2xrb3V0X3NyY19jbGtzZWxbXSA9IHsKLQl7IC5wYXJlbnQgPSAmY29yZV9jaywJICAucmF0ZXMgPSBjb21tb25fY2xrb3V0X3NyY19jb3JlX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gJnN5c19jaywJICAucmF0ZXMgPSBjb21tb25fY2xrb3V0X3NyY19zeXNfcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSAmZnVuY185Nm1fY2ssIC5yYXRlcyA9IGNvbW1vbl9jbGtvdXRfc3JjXzk2bV9yYXRlcyB9LAotCXsgLnBhcmVudCA9ICZmdW5jXzU0bV9jaywgLnJhdGVzID0gY29tbW9uX2Nsa291dF9zcmNfNTRtX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gTlVMTCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGNsayBzeXNfY2xrb3V0X3NyYyA9IHsKLQkubmFtZQkJPSAic3lzX2Nsa291dF9zcmMiLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAotCS5wYXJlbnQJCT0gJmZ1bmNfNTRtX2NrLAotCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUDI0WFhfUFJDTV9DTEtPVVRfQ1RSTCwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0NMS09VVF9FTl9TSElGVCwKLQkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAotCS5jbGtzZWxfcmVnCT0gT01BUDI0WFhfUFJDTV9DTEtPVVRfQ1RSTCwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMjRYWF9DTEtPVVRfU09VUkNFX01BU0ssCi0JLmNsa3NlbAkJPSBjb21tb25fY2xrb3V0X3NyY19jbGtzZWwsCi0JLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKLQkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKLQkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGNvbW1vbl9jbGtvdXRfcmF0ZXNbXSA9IHsKLQl7IC5kaXYgPSAxLCAudmFsID0gMCwgLmZsYWdzID0gUkFURV9JTl8yNFhYIHwgREVGQVVMVF9SQVRFIH0sCi0JeyAuZGl2ID0gMiwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB9LAotCXsgLmRpdiA9IDQsIC52YWwgPSAyLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfSwKLQl7IC5kaXYgPSA4LCAudmFsID0gMywgLmZsYWdzID0gUkFURV9JTl8yNFhYIH0sCi0JeyAuZGl2ID0gMTYsIC52YWwgPSA0LCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfSwKLQl7IC5kaXYgPSAwIH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBzeXNfY2xrb3V0X2Nsa3NlbFtdID0gewotCXsgLnBhcmVudCA9ICZzeXNfY2xrb3V0X3NyYywgLnJhdGVzID0gY29tbW9uX2Nsa291dF9yYXRlcyB9LAotCXsgLnBhcmVudCA9IE5VTEwgfQotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgc3lzX2Nsa291dCA9IHsKLQkubmFtZQkJPSAic3lzX2Nsa291dCIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmc3lzX2Nsa291dF9zcmMsCi0JLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCi0JLmNsa3NlbF9yZWcJPSBPTUFQMjRYWF9QUkNNX0NMS09VVF9DVFJMLAotCS5jbGtzZWxfbWFzawk9IE9NQVAyNFhYX0NMS09VVF9ESVZfTUFTSywKLQkuY2xrc2VsCQk9IHN5c19jbGtvdXRfY2xrc2VsLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi0JLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCi0JLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZQotfTsKLQotLyogSW4gMjQzMCwgbmV3IGluIDI0MjAgRVMyICovCi1zdGF0aWMgc3RydWN0IGNsayBzeXNfY2xrb3V0Ml9zcmMgPSB7Ci0JLm5hbWUJCT0gInN5c19jbGtvdXQyX3NyYyIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCi0JLnBhcmVudAkJPSAmZnVuY181NG1fY2ssCi0JLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCi0JLmVuYWJsZV9yZWcJPSBPTUFQMjRYWF9QUkNNX0NMS09VVF9DVFJMLAotCS5lbmFibGVfYml0CT0gT01BUDI0MjBfQ0xLT1VUMl9FTl9TSElGVCwKLQkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAotCS5jbGtzZWxfcmVnCT0gT01BUDI0WFhfUFJDTV9DTEtPVVRfQ1RSTCwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMjQyMF9DTEtPVVQyX1NPVVJDRV9NQVNLLAotCS5jbGtzZWwJCT0gY29tbW9uX2Nsa291dF9zcmNfY2xrc2VsLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi0JLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCi0JLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgc3lzX2Nsa291dDJfY2xrc2VsW10gPSB7Ci0JeyAucGFyZW50ID0gJnN5c19jbGtvdXQyX3NyYywgLnJhdGVzID0gY29tbW9uX2Nsa291dF9yYXRlcyB9LAotCXsgLnBhcmVudCA9IE5VTEwgfQotfTsKLQotLyogSW4gMjQzMCwgbmV3IGluIDI0MjAgRVMyICovCi1zdGF0aWMgc3RydWN0IGNsayBzeXNfY2xrb3V0MiA9IHsKLQkubmFtZQkJPSAic3lzX2Nsa291dDIiLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJnN5c19jbGtvdXQyX3NyYywKLQkuY2xrZG1fbmFtZQk9ICJ3a3VwX2Nsa2RtIiwKLQkuY2xrc2VsX3JlZwk9IE9NQVAyNFhYX1BSQ01fQ0xLT1VUX0NUUkwsCi0JLmNsa3NlbF9tYXNrCT0gT01BUDI0MjBfQ0xLT1VUMl9ESVZfTUFTSywKLQkuY2xrc2VsCQk9IHN5c19jbGtvdXQyX2Nsa3NlbCwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9yb3VuZF9yYXRlLAotCS5zZXRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfc2V0X3JhdGUKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGVtdWxfY2sgPSB7Ci0JLm5hbWUJCT0gImVtdWxfY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAotCS5wYXJlbnQJCT0gJmZ1bmNfNTRtX2NrLAotCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUDI0WFhfUFJDTV9DTEtFTVVMX0NUUkwsCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTVVMQVRJT05fRU5fU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLQotfTsKLQotLyoKLSAqIE1QVSBjbG9jayBkb21haW4KLSAqCUNsb2NrczoKLSAqCQlNUFVfRkNMSywgTVBVX0lDTEsKLSAqCQlJTlRfTV9GQ0xLLCBJTlRfTV9JX0NMSwotICoKLSAqIC0gSW5kaXZpZHVhbCBjbG9ja3MgYXJlIGhhcmR3YXJlIG1hbmFnZWQuCi0gKiAtIEJhc2UgZGl2aWRlciBjb21lcyBmcm9tOiBDTV9DTEtTRUxfTVBVCi0gKgotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIG1wdV9jb3JlX3JhdGVzW10gPSB7Ci0JeyAuZGl2ID0gMSwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB8IERFRkFVTFRfUkFURSB9LAotCXsgLmRpdiA9IDIsIC52YWwgPSAyLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfSwKLQl7IC5kaXYgPSA0LCAudmFsID0gNCwgLmZsYWdzID0gUkFURV9JTl8yNDJYIH0sCi0JeyAuZGl2ID0gNiwgLnZhbCA9IDYsIC5mbGFncyA9IFJBVEVfSU5fMjQyWCB9LAotCXsgLmRpdiA9IDgsIC52YWwgPSA4LCAuZmxhZ3MgPSBSQVRFX0lOXzI0MlggfSwKLQl7IC5kaXYgPSAwIH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBtcHVfY2xrc2VsW10gPSB7Ci0JeyAucGFyZW50ID0gJmNvcmVfY2ssIC5yYXRlcyA9IG1wdV9jb3JlX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gTlVMTCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGNsayBtcHVfY2sgPSB7CS8qIENvbnRyb2wgY3B1ICovCi0JLm5hbWUJCT0gIm1wdV9jayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmY29yZV9jaywKLQkuZmxhZ3MJCT0gREVMQVlFRF9BUFAgfCBDT05GSUdfUEFSVElDSVBBTlQsCi0JLmNsa2RtX25hbWUJPSAibXB1X2Nsa2RtIiwKLQkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAotCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKE1QVV9NT0QsIENNX0NMS1NFTCksCi0JLmNsa3NlbF9tYXNrCT0gT01BUDI0WFhfQ0xLU0VMX01QVV9NQVNLLAotCS5jbGtzZWwJCT0gbXB1X2Nsa3NlbCwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9yb3VuZF9yYXRlLAotCS5zZXRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfc2V0X3JhdGUKLX07Ci0KLS8qCi0gKiBEU1AgKDI0MzAtSVZBMi4xKSAoMjQyMC1VTUErSVZBMSkgY2xvY2sgZG9tYWluCi0gKiBDbG9ja3M6Ci0gKgkyNDMwOiBJVkEyLjFfRkNMSyAocmVhbGx5IGp1c3QgRFNQX0ZDTEspLCBJVkEyLjFfSUNMSwotICoJMjQyMDogVU1BX0ZDTEssIFVNQV9JQ0xLLCBJVkFfTVBVLCBJVkFfQ09QCi0gKgotICogV29uJ3QgYmUgdG9vIHNwZWNpZmljIGhlcmUuIFRoZSBjb3JlIGNsb2NrIGNvbWVzIGludG8gdGhpcyBibG9jawotICogaXQgaXMgZGl2aWRlZCB0aGVuIHRlZSdlZC4gT25lIGJyYW5jaCBnb2VzIGRpcmVjdGx5IHRvIHh5eiBlbmFibGUKLSAqIGNvbnRyb2xzLiBUaGUgb3RoZXIgYnJhbmNoIGdldHMgZnVydGhlciBkaXZpZGVkIGJ5IDIgdGhlbiBwb3NzaWJseQotICogcm91dGVkIGludG8gYSBzeW5jaHJvbml6ZXIgYW5kIG91dCBvZiBjbG9ja3MgYWJjLgotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGRzcF9mY2tfY29yZV9yYXRlc1tdID0gewotCXsgLmRpdiA9IDEsIC52YWwgPSAxLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfCBERUZBVUxUX1JBVEUgfSwKLQl7IC5kaXYgPSAyLCAudmFsID0gMiwgLmZsYWdzID0gUkFURV9JTl8yNFhYIH0sCi0JeyAuZGl2ID0gMywgLnZhbCA9IDMsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB9LAotCXsgLmRpdiA9IDQsIC52YWwgPSA0LCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfSwKLQl7IC5kaXYgPSA2LCAudmFsID0gNiwgLmZsYWdzID0gUkFURV9JTl8yNDJYIH0sCi0JeyAuZGl2ID0gOCwgLnZhbCA9IDgsIC5mbGFncyA9IFJBVEVfSU5fMjQyWCB9LAotCXsgLmRpdiA9IDEyLCAudmFsID0gMTIsIC5mbGFncyA9IFJBVEVfSU5fMjQyWCB9LAotCXsgLmRpdiA9IDAgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGRzcF9mY2tfY2xrc2VsW10gPSB7Ci0JeyAucGFyZW50ID0gJmNvcmVfY2ssIC5yYXRlcyA9IGRzcF9mY2tfY29yZV9yYXRlcyB9LAotCXsgLnBhcmVudCA9IE5VTEwgfQotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZHNwX2ZjayA9IHsKLQkubmFtZQkJPSAiZHNwX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZjb3JlX2NrLAotCS5mbGFncwkJPSBERUxBWUVEX0FQUCB8IENPTkZJR19QQVJUSUNJUEFOVCwKLQkuY2xrZG1fbmFtZQk9ICJkc3BfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAyNFhYX0RTUF9NT0QsIENNX0ZDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9DTV9GQ0xLRU5fRFNQX0VOX0RTUF9TSElGVCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMjRYWF9EU1BfTU9ELCBDTV9DTEtTRUwpLAotCS5jbGtzZWxfbWFzawk9IE9NQVAyNFhYX0NMS1NFTF9EU1BfTUFTSywKLQkuY2xrc2VsCQk9IGRzcF9mY2tfY2xrc2VsLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi0JLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCi0JLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZQotfTsKLQotLyogRFNQIGludGVyZmFjZSBjbG9jayAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBkc3BfaXJhdGVfaWNrX3JhdGVzW10gPSB7Ci0JeyAuZGl2ID0gMSwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB8IERFRkFVTFRfUkFURSB9LAotCXsgLmRpdiA9IDIsIC52YWwgPSAyLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfSwKLQl7IC5kaXYgPSAzLCAudmFsID0gMywgLmZsYWdzID0gUkFURV9JTl8yNDNYIH0sCi0JeyAuZGl2ID0gMCB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgZHNwX2lyYXRlX2lja19jbGtzZWxbXSA9IHsKLQl7IC5wYXJlbnQgPSAmZHNwX2ZjaywgLnJhdGVzID0gZHNwX2lyYXRlX2lja19yYXRlcyB9LAotCXsgLnBhcmVudCA9IE5VTEwgfQotfTsKLQotLyogVGhpcyBjbG9jayBkb2VzIG5vdCBleGlzdCBhcyBzdWNoIGluIHRoZSBUUk0uICovCi1zdGF0aWMgc3RydWN0IGNsayBkc3BfaXJhdGVfaWNrID0gewotCS5uYW1lCQk9ICJkc3BfaXJhdGVfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfbnVsbCwKLQkucGFyZW50CQk9ICZkc3BfZmNrLAotCS5mbGFncwkJPSBERUxBWUVEX0FQUCB8IENPTkZJR19QQVJUSUNJUEFOVCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMjRYWF9EU1BfTU9ELCBDTV9DTEtTRUwpLAotCS5jbGtzZWxfbWFzawk9IE9NQVAyNFhYX0NMS1NFTF9EU1BfSUZfTUFTSywKLQkuY2xrc2VsCQk9IGRzcF9pcmF0ZV9pY2tfY2xrc2VsLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi0JLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCi0JLnNldF9yYXRlCSAgICAgID0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZQotfTsKLQotLyogMjQyMCBvbmx5ICovCi1zdGF0aWMgc3RydWN0IGNsayBkc3BfaWNrID0gewotCS5uYW1lCQk9ICJkc3BfaWNrIiwJIC8qIGFwcGFyZW50bHkgaXBpIGFuZCBpc3AgKi8KLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmRzcF9pcmF0ZV9pY2ssCi0JLmZsYWdzCQk9IERFTEFZRURfQVBQIHwgQ09ORklHX1BBUlRJQ0lQQU5ULAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAyNFhYX0RTUF9NT0QsIENNX0lDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjQyMF9FTl9EU1BfSVBJX1NISUZULAkgICAgICAvKiBmb3IgaXBpICovCi19OwotCi0vKiAyNDMwIG9ubHkgLSBFTl9EU1AgY29udHJvbHMgYm90aCBkc3AgZmNsayBhbmQgaWNsayBvbiAyNDMwICovCi1zdGF0aWMgc3RydWN0IGNsayBpdmEyXzFfaWNrID0gewotCS5uYW1lCQk9ICJpdmEyXzFfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmRzcF9pcmF0ZV9pY2ssCi0JLmZsYWdzCQk9IERFTEFZRURfQVBQIHwgQ09ORklHX1BBUlRJQ0lQQU5ULAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAyNFhYX0RTUF9NT0QsIENNX0ZDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9DTV9GQ0xLRU5fRFNQX0VOX0RTUF9TSElGVCwKLX07Ci0KLS8qCi0gKiBUaGUgSVZBMSBpcyBhbiBBUk03IGNvcmUgb24gdGhlIDI0MjAgdGhhdCBoYXMgbm90aGluZyB0byBkbyB3aXRoCi0gKiB0aGUgQzU0eCwgYnV0IHdoaWNoIGlzIGNvbnRhaW5lZCBpbiB0aGUgRFNQIHBvd2VyZG9tYWluLiAgRG9lcyBub3QKLSAqIGV4aXN0IG9uIGxhdGVyIE9NQVBzLgotICovCi1zdGF0aWMgc3RydWN0IGNsayBpdmExX2lmY2sgPSB7Ci0JLm5hbWUJCT0gIml2YTFfaWZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZjb3JlX2NrLAotCS5mbGFncwkJPSBDT05GSUdfUEFSVElDSVBBTlQgfCBERUxBWUVEX0FQUCwKLQkuY2xrZG1fbmFtZQk9ICJpdmExX2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMjRYWF9EU1BfTU9ELCBDTV9GQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDI0MjBfRU5fSVZBX0NPUF9TSElGVCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMjRYWF9EU1BfTU9ELCBDTV9DTEtTRUwpLAotCS5jbGtzZWxfbWFzawk9IE9NQVAyNDIwX0NMS1NFTF9JVkFfTUFTSywKLQkuY2xrc2VsCQk9IGRzcF9mY2tfY2xrc2VsLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi0JLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCi0JLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZQotfTsKLQotLyogSVZBMSBtcHUvaW50L2kvZiBjbG9ja3MgYXJlIC8yIG9mIHBhcmVudCAqLwotc3RhdGljIHN0cnVjdCBjbGsgaXZhMV9tcHVfaW50X2lmY2sgPSB7Ci0JLm5hbWUJCT0gIml2YTFfbXB1X2ludF9pZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJml2YTFfaWZjaywKLQkuY2xrZG1fbmFtZQk9ICJpdmExX2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMjRYWF9EU1BfTU9ELCBDTV9GQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDI0MjBfRU5fSVZBX01QVV9TSElGVCwKLQkuZml4ZWRfZGl2CT0gMiwKLQkucmVjYWxjCQk9ICZvbWFwMl9maXhlZF9kaXZpc29yX3JlY2FsYywKLX07Ci0KLS8qCi0gKiBMMyBjbG9jayBkb21haW4KLSAqIEwzIGNsb2NrcyBhcmUgdXNlZCBmb3IgYm90aCBpbnRlcmZhY2UgYW5kIGZ1bmN0aW9uYWwgY2xvY2tzIHRvCi0gKiBtdWx0aXBsZSBlbnRpdGllcy4gU29tZSBvZiB0aGVzZSBjbG9ja3MgYXJlIGNvbXBsZXRlbHkgbWFuYWdlZAotICogYnkgaGFyZHdhcmUsIGFuZCBzb21lIG90aGVycyBhbGxvdyBzb2Z0d2FyZSBjb250cm9sLiBIYXJkd2FyZQotICogbWFuYWdlZCBvbmVzIGdlbmVyYWwgYXJlIGJhc2VkIG9uIGRpcmVjdGx5IENMS19SRVEgc2lnbmFscyBhbmQKLSAqIHZhcmlvdXMgYXV0byBpZGxlIHNldHRpbmdzLiBUaGUgZnVuY3Rpb25hbCBzcGVjIHNldHMgbWFueSBvZiB0aGVzZQotICogYXMgJ3RpZS1oaWdoJyBmb3IgdGhlaXIgZW5hYmxlcy4KLSAqCi0gKiBJLUNMT0NLUzoKLSAqCUwzLUludGVyY29ubmVjdCwgU01TLCBHUE1DLCBTRFJDLCBPQ01fUkFNLCBPQ01fUk9NLCBTRE1BCi0gKglDQU0sIEhTLVVTQi4KLSAqIEYtQ0xPQ0sKLSAqCVNTSS4KLSAqCi0gKiBHUE1DIG1lbW9yaWVzIGFuZCBTRFJDIGhhdmUgdGltaW5nIGFuZCBjbG9jayBzZW5zaXRpdmUgcmVnaXN0ZXJzIHdoaWNoCi0gKiBtYXkgdmVyeSB3ZWxsIG5lZWQgbm90aWZpY2F0aW9uIHdoZW4gdGhlIGNsb2NrIGNoYW5nZXMuIEN1cnJlbnRseSBmb3IgbG93Ci0gKiBvcGVyYXRpbmcgcG9pbnRzLCB0aGVzZSBhcmUgdGFrZW4gY2FyZSBvZiBpbiBzbGVlcC5TLgotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGNvcmVfbDNfY29yZV9yYXRlc1tdID0gewotCXsgLmRpdiA9IDEsIC52YWwgPSAxLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfSwKLQl7IC5kaXYgPSAyLCAudmFsID0gMiwgLmZsYWdzID0gUkFURV9JTl8yNDJYIH0sCi0JeyAuZGl2ID0gNCwgLnZhbCA9IDQsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB8IERFRkFVTFRfUkFURSB9LAotCXsgLmRpdiA9IDYsIC52YWwgPSA2LCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfSwKLQl7IC5kaXYgPSA4LCAudmFsID0gOCwgLmZsYWdzID0gUkFURV9JTl8yNDJYIH0sCi0JeyAuZGl2ID0gMTIsIC52YWwgPSAxMiwgLmZsYWdzID0gUkFURV9JTl8yNDJYIH0sCi0JeyAuZGl2ID0gMTYsIC52YWwgPSAxNiwgLmZsYWdzID0gUkFURV9JTl8yNDJYIH0sCi0JeyAuZGl2ID0gMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBjb3JlX2wzX2Nsa3NlbFtdID0gewotCXsgLnBhcmVudCA9ICZjb3JlX2NrLCAucmF0ZXMgPSBjb3JlX2wzX2NvcmVfcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSBOVUxMIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGNvcmVfbDNfY2sgPSB7CS8qIFVzZWQgZm9yIGljayBhbmQgZmNrLCBpbnRlcmNvbm5lY3QgKi8KLQkubmFtZQkJPSAiY29yZV9sM19jayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmY29yZV9jaywKLQkuZmxhZ3MJCT0gREVMQVlFRF9BUFAgfCBDT05GSUdfUEFSVElDSVBBTlQsCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sM19jbGtkbSIsCi0JLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0NMS1NFTDEpLAotCS5jbGtzZWxfbWFzawk9IE9NQVAyNFhYX0NMS1NFTF9MM19NQVNLLAotCS5jbGtzZWwJCT0gY29yZV9sM19jbGtzZWwsCi0JLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKLQkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKLQkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlCi19OwotCi0vKiB1c2JfbDRfaWNrICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIHVzYl9sNF9pY2tfY29yZV9sM19yYXRlc1tdID0gewotCXsgLmRpdiA9IDEsIC52YWwgPSAxLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfSwKLQl7IC5kaXYgPSAyLCAudmFsID0gMiwgLmZsYWdzID0gUkFURV9JTl8yNFhYIHwgREVGQVVMVF9SQVRFIH0sCi0JeyAuZGl2ID0gNCwgLnZhbCA9IDQsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB9LAotCXsgLmRpdiA9IDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgdXNiX2w0X2lja19jbGtzZWxbXSA9IHsKLQl7IC5wYXJlbnQgPSAmY29yZV9sM19jaywgLnJhdGVzID0gdXNiX2w0X2lja19jb3JlX2wzX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gTlVMTCB9LAotfTsKLQotLyogSXQgaXMgdW5jbGVhciBmcm9tIFRSTSB3aGV0aGVyIHVzYl9sNF9pY2sgaXMgcmVhbGx5IGluIEwzIG9yIEw0IGNsa2RtICovCi1zdGF0aWMgc3RydWN0IGNsayB1c2JfbDRfaWNrID0gewkvKiBGUy1VU0IgaW50ZXJmYWNlIGNsb2NrICovCi0JLm5hbWUJCT0gInVzYl9sNF9pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmY29yZV9sM19jaywKLQkuZmxhZ3MJCT0gREVMQVlFRF9BUFAgfCBDT05GSUdfUEFSVElDSVBBTlQsCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjIpLAotCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fVVNCX1NISUZULAotCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9DTEtTRUwxKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMjRYWF9DTEtTRUxfVVNCX01BU0ssCi0JLmNsa3NlbAkJPSB1c2JfbDRfaWNrX2Nsa3NlbCwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9yb3VuZF9yYXRlLAotCS5zZXRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfc2V0X3JhdGUKLX07Ci0KLS8qCi0gKiBMNCBjbG9jayBtYW5hZ2VtZW50IGRvbWFpbgotICoKLSAqIFRoaXMgZG9tYWluIGNvbnRhaW5zIGxvdHMgb2YgaW50ZXJmYWNlIGNsb2NrcyBmcm9tIHRoZSBMNCBpbnRlcmZhY2UsIHNvbWUKLSAqIGZ1bmN0aW9uYWwgY2xvY2tzLglGaXhlZCBBUExMIGZ1bmN0aW9uYWwgc291cmNlIGNsb2NrcyBhcmUgbWFuYWdlZCBpbgotICogdGhpcyBkb21haW4uCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgbDRfY29yZV9sM19yYXRlc1tdID0gewotCXsgLmRpdiA9IDEsIC52YWwgPSAxLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfCBERUZBVUxUX1JBVEUgfSwKLQl7IC5kaXYgPSAyLCAudmFsID0gMiwgLmZsYWdzID0gUkFURV9JTl8yNFhYIH0sCi0JeyAuZGl2ID0gMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBsNF9jbGtzZWxbXSA9IHsKLQl7IC5wYXJlbnQgPSAmY29yZV9sM19jaywgLnJhdGVzID0gbDRfY29yZV9sM19yYXRlcyB9LAotCXsgLnBhcmVudCA9IE5VTEwgfQotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbDRfY2sgPSB7CQkvKiB1c2VkIGJvdGggYXMgYW4gaWNrIGFuZCBmY2sgKi8KLQkubmFtZQkJPSAibDRfY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJmNvcmVfbDNfY2ssCi0JLmZsYWdzCQk9IERFTEFZRURfQVBQLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9DTEtTRUwxKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMjRYWF9DTEtTRUxfTDRfTUFTSywKLQkuY2xrc2VsCQk9IGw0X2Nsa3NlbCwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9yb3VuZF9yYXRlLAotCS5zZXRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfc2V0X3JhdGUKLX07Ci0KLS8qCi0gKiBTU0kgaXMgaW4gTDMgbWFuYWdlbWVudCBkb21haW4sIGl0cyBkaXJlY3QgcGFyZW50IGlzIGNvcmUgbm90IGwzLAotICogbWFueSBjb3JlIHBvd2VyIGRvbWFpbiBlbnRpdGllcyBhcmUgZ3JvdXBlZCBpbnRvIHRoZSBMMyBjbG9jawotICogZG9tYWluLgotICogU1NJX1NTUl9GQ0xLLCBTU0lfU1NUX0ZDTEssIFNTSV9MNF9JQ0xLCi0gKgotICogc3NyID0gY29yZS8xLzIvMy80LzUsIHNzdCA9IDEvMiBzc3IuCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgc3NpX3Nzcl9zc3RfZmNrX2NvcmVfcmF0ZXNbXSA9IHsKLQl7IC5kaXYgPSAxLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8yNFhYIH0sCi0JeyAuZGl2ID0gMiwgLnZhbCA9IDIsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB8IERFRkFVTFRfUkFURSB9LAotCXsgLmRpdiA9IDMsIC52YWwgPSAzLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfSwKLQl7IC5kaXYgPSA0LCAudmFsID0gNCwgLmZsYWdzID0gUkFURV9JTl8yNFhYIH0sCi0JeyAuZGl2ID0gNSwgLnZhbCA9IDUsIC5mbGFncyA9IFJBVEVfSU5fMjQzWCB9LAotCXsgLmRpdiA9IDYsIC52YWwgPSA2LCAuZmxhZ3MgPSBSQVRFX0lOXzI0MlggfSwKLQl7IC5kaXYgPSA4LCAudmFsID0gOCwgLmZsYWdzID0gUkFURV9JTl8yNDJYIH0sCi0JeyAuZGl2ID0gMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBzc2lfc3NyX3NzdF9mY2tfY2xrc2VsW10gPSB7Ci0JeyAucGFyZW50ID0gJmNvcmVfY2ssIC5yYXRlcyA9IHNzaV9zc3Jfc3N0X2Zja19jb3JlX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gTlVMTCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGNsayBzc2lfc3NyX3NzdF9mY2sgPSB7Ci0JLm5hbWUJCT0gInNzaV9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmY29yZV9jaywKLQkuZmxhZ3MJCT0gREVMQVlFRF9BUFAsCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sM19jbGtkbSIsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIE9NQVAyNFhYX0NNX0ZDTEtFTjIpLAotCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fU1NJX1NISUZULAotCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9DTEtTRUwxKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMjRYWF9DTEtTRUxfU1NJX01BU0ssCi0JLmNsa3NlbAkJPSBzc2lfc3NyX3NzdF9mY2tfY2xrc2VsLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi0JLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCi0JLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZQotfTsKLQotLyoKLSAqIFByZXN1bWFibHkgdGhpcyBpcyB0aGUgc2FtZSBhcyBTU0lfSUNMSy4KLSAqIFRSTSBjb250cmFkaWN0cyBpdHNlbGYgb24gd2hhdCBjbG9ja2RvbWFpbiBTU0lfSUNMSyBpcyBpbgotICovCi1zdGF0aWMgc3RydWN0IGNsayBzc2lfbDRfaWNrID0gewotCS5uYW1lCQk9ICJzc2lfbDRfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmw0X2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4yKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX1NTSV9TSElGVCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotCi0vKgotICogR0ZYIGNsb2NrIGRvbWFpbgotICoJQ2xvY2tzOgotICogR0ZYX0ZDTEssIEdGWF9JQ0xLCi0gKiBHRlhfQ0cxKDJkKSwgR0ZYX0NHMigzZCkKLSAqCi0gKiBHRlhfRkNMSyBydW5zIGZyb20gTDMsIGFuZCBpcyBkaXZpZGVkIGJ5ICgxLDIsMyw0KQotICogVGhlIDJkIGFuZCAzZCBjbG9ja3MgcnVuIGF0IGEgaGFyZHdhcmUgZGV0ZXJtaW5lZAotICogZGl2aWRlZCB2YWx1ZSBvZiBmY2xrLgotICoKLSAqLwotLyogWFhYIFJFVklTSVQ6IEdGWCBjbG9jayBpcyBwYXJ0IG9mIENPTkZJR19QQVJUSUNJUEFOVCwgbm8/IGRvdWJsZWNoZWNrLiAqLwotCi0vKiBUaGlzIGNsa3NlbCBzdHJ1Y3QgaXMgc2hhcmVkIGJldHdlZW4gZ2Z4XzNkX2ZjayBhbmQgZ2Z4XzJkX2ZjayAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgZ2Z4X2Zja19jbGtzZWxbXSA9IHsKLQl7IC5wYXJlbnQgPSAmY29yZV9sM19jaywgLnJhdGVzID0gZ2Z4X2wzX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gTlVMTCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZ2Z4XzNkX2ZjayA9IHsKLQkubmFtZQkJPSAiZ2Z4XzNkX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZjb3JlX2wzX2NrLAotCS5jbGtkbV9uYW1lCT0gImdmeF9jbGtkbSIsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoR0ZYX01PRCwgQ01fRkNMS0VOKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOXzNEX1NISUZULAotCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKEdGWF9NT0QsIENNX0NMS1NFTCksCi0JLmNsa3NlbF9tYXNrCT0gT01BUF9DTEtTRUxfR0ZYX01BU0ssCi0JLmNsa3NlbAkJPSBnZnhfZmNrX2Nsa3NlbCwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9yb3VuZF9yYXRlLAotCS5zZXRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfc2V0X3JhdGUKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGdmeF8yZF9mY2sgPSB7Ci0JLm5hbWUJCT0gImdmeF8yZF9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmY29yZV9sM19jaywKLQkuY2xrZG1fbmFtZQk9ICJnZnhfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKEdGWF9NT0QsIENNX0ZDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl8yRF9TSElGVCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihHRlhfTU9ELCBDTV9DTEtTRUwpLAotCS5jbGtzZWxfbWFzawk9IE9NQVBfQ0xLU0VMX0dGWF9NQVNLLAotCS5jbGtzZWwJCT0gZ2Z4X2Zja19jbGtzZWwsCi0JLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKLQkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKLQkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBnZnhfaWNrID0gewotCS5uYW1lCQk9ICJnZnhfaWNrIiwJCS8qIEZyb20gbDMgKi8KLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmNvcmVfbDNfY2ssCi0JLmNsa2RtX25hbWUJPSAiZ2Z4X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihHRlhfTU9ELCBDTV9JQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUF9FTl9HRlhfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLS8qCi0gKiBNb2RlbSBjbG9jayBkb21haW4gKDI0MzApCi0gKglDTE9DS1M6Ci0gKgkJTURNX09TQ19DTEsKLSAqCQlNRE1fSUNMSwotICogVGhlc2UgY2xvY2tzIGFyZSB1c2FibGUgaW4gY2hhc3NpcyBtb2RlIG9ubHkuCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgbWRtX2lja19jb3JlX3JhdGVzW10gPSB7Ci0JeyAuZGl2ID0gMSwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fMjQzWCB9LAotCXsgLmRpdiA9IDQsIC52YWwgPSA0LCAuZmxhZ3MgPSBSQVRFX0lOXzI0M1ggfCBERUZBVUxUX1JBVEUgfSwKLQl7IC5kaXYgPSA2LCAudmFsID0gNiwgLmZsYWdzID0gUkFURV9JTl8yNDNYIH0sCi0JeyAuZGl2ID0gOSwgLnZhbCA9IDksIC5mbGFncyA9IFJBVEVfSU5fMjQzWCB9LAotCXsgLmRpdiA9IDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgbWRtX2lja19jbGtzZWxbXSA9IHsKLQl7IC5wYXJlbnQgPSAmY29yZV9jaywgLnJhdGVzID0gbWRtX2lja19jb3JlX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gTlVMTCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGNsayBtZG1faWNrID0gewkJLyogdXNlZCBib3RoIGFzIGEgaWNrIGFuZCBmY2sgKi8KLQkubmFtZQkJPSAibWRtX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZjb3JlX2NrLAotCS5mbGFncwkJPSBERUxBWUVEX0FQUCB8IENPTkZJR19QQVJUSUNJUEFOVCwKLQkuY2xrZG1fbmFtZQk9ICJtZG1fY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAyNDMwX01ETV9NT0QsIENNX0lDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjQzMF9DTV9JQ0xLRU5fTURNX0VOX01ETV9TSElGVCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMjQzMF9NRE1fTU9ELCBDTV9DTEtTRUwpLAotCS5jbGtzZWxfbWFzawk9IE9NQVAyNDMwX0NMS1NFTF9NRE1fTUFTSywKLQkuY2xrc2VsCQk9IG1kbV9pY2tfY2xrc2VsLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi0JLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCi0JLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZQotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbWRtX29zY19jayA9IHsKLQkubmFtZQkJPSAibWRtX29zY19jayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZvc2NfY2ssCi0JLmNsa2RtX25hbWUJPSAibWRtX2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMjQzMF9NRE1fTU9ELCBDTV9GQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDI0MzBfRU5fT1NDX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi0vKgotICogRFNTIGNsb2NrIGRvbWFpbgotICogQ0xPQ0tzOgotICogRFNTX0w0X0lDTEssIERTU19MM19JQ0xLLAotICogRFNTX0NMSzEsIERTU19DTEsyLCBEU1NfNTRNSHpfQ0xLCi0gKgotICogRFNTIGlzIGJvdGggaW5pdGlhdG9yIGFuZCB0YXJnZXQuCi0gKi8KLS8qIFhYWCBBZGQgUkFURV9OT1RfVkFMSURBVEVEICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgZHNzMV9mY2tfc3lzX3JhdGVzW10gPSB7Ci0JeyAuZGl2ID0gMSwgLnZhbCA9IDAsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB8IERFRkFVTFRfUkFURSB9LAotCXsgLmRpdiA9IDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBkc3MxX2Zja19jb3JlX3JhdGVzW10gPSB7Ci0JeyAuZGl2ID0gMSwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB9LAotCXsgLmRpdiA9IDIsIC52YWwgPSAyLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfSwKLQl7IC5kaXYgPSAzLCAudmFsID0gMywgLmZsYWdzID0gUkFURV9JTl8yNFhYIH0sCi0JeyAuZGl2ID0gNCwgLnZhbCA9IDQsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB9LAotCXsgLmRpdiA9IDUsIC52YWwgPSA1LCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfSwKLQl7IC5kaXYgPSA2LCAudmFsID0gNiwgLmZsYWdzID0gUkFURV9JTl8yNFhYIH0sCi0JeyAuZGl2ID0gOCwgLnZhbCA9IDgsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB9LAotCXsgLmRpdiA9IDksIC52YWwgPSA5LCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfSwKLQl7IC5kaXYgPSAxMiwgLnZhbCA9IDEyLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfSwKLQl7IC5kaXYgPSAxNiwgLnZhbCA9IDE2LCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfCBERUZBVUxUX1JBVEUgfSwKLQl7IC5kaXYgPSAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGRzczFfZmNrX2Nsa3NlbFtdID0gewotCXsgLnBhcmVudCA9ICZzeXNfY2ssICAucmF0ZXMgPSBkc3MxX2Zja19zeXNfcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSAmY29yZV9jaywgLnJhdGVzID0gZHNzMV9mY2tfY29yZV9yYXRlcyB9LAotCXsgLnBhcmVudCA9IE5VTEwgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGRzc19pY2sgPSB7CQkvKiBFbmFibGVzIGJvdGggTDMsTDQgSUNMSydzICovCi0JLm5hbWUJCT0gImRzc19pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAotCS5wYXJlbnQJCT0gJmw0X2NrLAkvKiByZWFsbHkgYm90aCBsMyBhbmQgbDQgKi8KLQkuY2xrZG1fbmFtZQk9ICJkc3NfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0RTUzFfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGRzczFfZmNrID0gewotCS5uYW1lCQk9ICJkc3MxX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCi0JLnBhcmVudAkJPSAmY29yZV9jaywJCS8qIENvcmUgb3Igc3lzICovCi0JLmZsYWdzCQk9IERFTEFZRURfQVBQLAotCS5jbGtkbV9uYW1lCT0gImRzc19jbGtkbSIsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fRFNTMV9TSElGVCwKLQkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAotCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9DTEtTRUwxKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMjRYWF9DTEtTRUxfRFNTMV9NQVNLLAotCS5jbGtzZWwJCT0gZHNzMV9mY2tfY2xrc2VsLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi0JLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCi0JLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBkc3MyX2Zja19zeXNfcmF0ZXNbXSA9IHsKLQl7IC5kaXYgPSAxLCAudmFsID0gMCwgLmZsYWdzID0gUkFURV9JTl8yNFhYIHwgREVGQVVMVF9SQVRFIH0sCi0JeyAuZGl2ID0gMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGRzczJfZmNrXzQ4bV9yYXRlc1tdID0gewotCXsgLmRpdiA9IDEsIC52YWwgPSAxLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfCBERUZBVUxUX1JBVEUgfSwKLQl7IC5kaXYgPSAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGRzczJfZmNrX2Nsa3NlbFtdID0gewotCXsgLnBhcmVudCA9ICZzeXNfY2ssCSAgLnJhdGVzID0gZHNzMl9mY2tfc3lzX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gJmZ1bmNfNDhtX2NrLCAucmF0ZXMgPSBkc3MyX2Zja180OG1fcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSBOVUxMIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGRzczJfZmNrID0gewkJLyogQWx0IGNsayB1c2VkIGluIHBvd2VyIG1hbmFnZW1lbnQgKi8KLQkubmFtZQkJPSAiZHNzMl9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAotCS5wYXJlbnQJCT0gJnN5c19jaywJCS8qIGZpeGVkIGF0IHN5c19jayBvciA0OE1IeiAqLwotCS5mbGFncwkJPSBERUxBWUVEX0FQUCwKLQkuY2xrZG1fbmFtZQk9ICJkc3NfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0RTUzJfU0hJRlQsCi0JLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fQ0xLU0VMMSksCi0JLmNsa3NlbF9tYXNrCT0gT01BUDI0WFhfQ0xLU0VMX0RTUzJfTUFTSywKLQkuY2xrc2VsCQk9IGRzczJfZmNrX2Nsa3NlbCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZHNzXzU0bV9mY2sgPSB7CS8qIEFsdCBjbGsgdXNlZCBpbiBwb3dlciBtYW5hZ2VtZW50ICovCi0JLm5hbWUJCT0gImRzc181NG1fZmNrIiwJLyogNTRtIHR2IGNsayAqLwotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmZnVuY181NG1fY2ssCi0JLmNsa2RtX25hbWUJPSAiZHNzX2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9UVl9TSElGVCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotLyoKLSAqIENPUkUgcG93ZXIgZG9tYWluIElDTEsgJiBGQ0xLIGRlZmluZXMuCi0gKiBNYW55IG9mIHRoZSB0aGVzZSBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lIHBvc3NpYmxlIHBhcmVudC4gRW50cmllcwotICogaGVyZSB3aWxsIGxpa2VseSBoYXZlIGFuIEw0IGludGVyZmFjZSBwYXJlbnQsIGFuZCBtYXkgaGF2ZSBtdWx0aXBsZQotICogZnVuY3Rpb25hbCBjbG9jayBwYXJlbnRzLgotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGdwdF9hbHRfcmF0ZXNbXSA9IHsKLQl7IC5kaXYgPSAxLCAudmFsID0gMiwgLmZsYWdzID0gUkFURV9JTl8yNFhYIHwgREVGQVVMVF9SQVRFIH0sCi0JeyAuZGl2ID0gMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBvbWFwMjR4eF9ncHRfY2xrc2VsW10gPSB7Ci0JeyAucGFyZW50ID0gJmZ1bmNfMzJrX2NrLCAucmF0ZXMgPSBncHRfMzJrX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gJnN5c19jaywJICAucmF0ZXMgPSBncHRfc3lzX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gJmFsdF9jaywJICAucmF0ZXMgPSBncHRfYWx0X3JhdGVzIH0sCi0JeyAucGFyZW50ID0gTlVMTCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZ3B0MV9pY2sgPSB7Ci0JLm5hbWUJCT0gImdwdDFfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmw0X2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKFdLVVBfTU9ELCBDTV9JQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fR1BUMV9TSElGVCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZ3B0MV9mY2sgPSB7Ci0JLm5hbWUJCT0gImdwdDFfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmZ1bmNfMzJrX2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKFdLVVBfTU9ELCBDTV9GQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fR1BUMV9TSElGVCwKLQkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAotCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKFdLVVBfTU9ELCBDTV9DTEtTRUwxKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMjRYWF9DTEtTRUxfR1BUMV9NQVNLLAotCS5jbGtzZWwJCT0gb21hcDI0eHhfZ3B0X2Nsa3NlbCwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9yb3VuZF9yYXRlLAotCS5zZXRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfc2V0X3JhdGUKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGdwdDJfaWNrID0gewotCS5uYW1lCQk9ICJncHQyX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZsNF9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUFQyX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncHQyX2ZjayA9IHsKLQkubmFtZQkJPSAiZ3B0Ml9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmZnVuY18zMmtfY2ssCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fR1BUMl9TSElGVCwKLQkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAotCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9DTEtTRUwyKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMjRYWF9DTEtTRUxfR1BUMl9NQVNLLAotCS5jbGtzZWwJCT0gb21hcDI0eHhfZ3B0X2Nsa3NlbCwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZ3B0M19pY2sgPSB7Ci0JLm5hbWUJCT0gImdwdDNfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmw0X2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0dQVDNfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGdwdDNfZmNrID0gewotCS5uYW1lCQk9ICJncHQzX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZmdW5jXzMya19jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUFQzX1NISUZULAotCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCi0JLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0NMS1NFTDIpLAotCS5jbGtzZWxfbWFzawk9IE9NQVAyNFhYX0NMS1NFTF9HUFQzX01BU0ssCi0JLmNsa3NlbAkJPSBvbWFwMjR4eF9ncHRfY2xrc2VsLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncHQ0X2ljayA9IHsKLQkubmFtZQkJPSAiZ3B0NF9pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmbDRfY2ssCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fR1BUNF9TSElGVCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZ3B0NF9mY2sgPSB7Ci0JLm5hbWUJCT0gImdwdDRfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmZ1bmNfMzJrX2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0dQVDRfU0hJRlQsCi0JLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fQ0xLU0VMMiksCi0JLmNsa3NlbF9tYXNrCT0gT01BUDI0WFhfQ0xLU0VMX0dQVDRfTUFTSywKLQkuY2xrc2VsCQk9IG9tYXAyNHh4X2dwdF9jbGtzZWwsCi0JLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGdwdDVfaWNrID0gewotCS5uYW1lCQk9ICJncHQ1X2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZsNF9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUFQ1X1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncHQ1X2ZjayA9IHsKLQkubmFtZQkJPSAiZ3B0NV9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmZnVuY18zMmtfY2ssCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fR1BUNV9TSElGVCwKLQkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAotCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9DTEtTRUwyKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMjRYWF9DTEtTRUxfR1BUNV9NQVNLLAotCS5jbGtzZWwJCT0gb21hcDI0eHhfZ3B0X2Nsa3NlbCwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZ3B0Nl9pY2sgPSB7Ci0JLm5hbWUJCT0gImdwdDZfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmw0X2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0dQVDZfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGdwdDZfZmNrID0gewotCS5uYW1lCQk9ICJncHQ2X2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZmdW5jXzMya19jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUFQ2X1NISUZULAotCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCi0JLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0NMS1NFTDIpLAotCS5jbGtzZWxfbWFzawk9IE9NQVAyNFhYX0NMS1NFTF9HUFQ2X01BU0ssCi0JLmNsa3NlbAkJPSBvbWFwMjR4eF9ncHRfY2xrc2VsLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncHQ3X2ljayA9IHsKLQkubmFtZQkJPSAiZ3B0N19pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmbDRfY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fR1BUN19TSElGVCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZ3B0N19mY2sgPSB7Ci0JLm5hbWUJCT0gImdwdDdfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmZ1bmNfMzJrX2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0dQVDdfU0hJRlQsCi0JLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fQ0xLU0VMMiksCi0JLmNsa3NlbF9tYXNrCT0gT01BUDI0WFhfQ0xLU0VMX0dQVDdfTUFTSywKLQkuY2xrc2VsCQk9IG9tYXAyNHh4X2dwdF9jbGtzZWwsCi0JLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGdwdDhfaWNrID0gewotCS5uYW1lCQk9ICJncHQ4X2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZsNF9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUFQ4X1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncHQ4X2ZjayA9IHsKLQkubmFtZQkJPSAiZ3B0OF9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmZnVuY18zMmtfY2ssCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fR1BUOF9TSElGVCwKLQkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAotCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9DTEtTRUwyKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMjRYWF9DTEtTRUxfR1BUOF9NQVNLLAotCS5jbGtzZWwJCT0gb21hcDI0eHhfZ3B0X2Nsa3NlbCwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZ3B0OV9pY2sgPSB7Ci0JLm5hbWUJCT0gImdwdDlfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmw0X2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0dQVDlfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGdwdDlfZmNrID0gewotCS5uYW1lCQk9ICJncHQ5X2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZmdW5jXzMya19jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUFQ5X1NISUZULAotCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCi0JLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0NMS1NFTDIpLAotCS5jbGtzZWxfbWFzawk9IE9NQVAyNFhYX0NMS1NFTF9HUFQ5X01BU0ssCi0JLmNsa3NlbAkJPSBvbWFwMjR4eF9ncHRfY2xrc2VsLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncHQxMF9pY2sgPSB7Ci0JLm5hbWUJCT0gImdwdDEwX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZsNF9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUFQxMF9TSElGVCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZ3B0MTBfZmNrID0gewotCS5uYW1lCQk9ICJncHQxMF9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmZnVuY18zMmtfY2ssCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fR1BUMTBfU0hJRlQsCi0JLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fQ0xLU0VMMiksCi0JLmNsa3NlbF9tYXNrCT0gT01BUDI0WFhfQ0xLU0VMX0dQVDEwX01BU0ssCi0JLmNsa3NlbAkJPSBvbWFwMjR4eF9ncHRfY2xrc2VsLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncHQxMV9pY2sgPSB7Ci0JLm5hbWUJCT0gImdwdDExX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZsNF9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUFQxMV9TSElGVCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZ3B0MTFfZmNrID0gewotCS5uYW1lCQk9ICJncHQxMV9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmZnVuY18zMmtfY2ssCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fR1BUMTFfU0hJRlQsCi0JLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fQ0xLU0VMMiksCi0JLmNsa3NlbF9tYXNrCT0gT01BUDI0WFhfQ0xLU0VMX0dQVDExX01BU0ssCi0JLmNsa3NlbAkJPSBvbWFwMjR4eF9ncHRfY2xrc2VsLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncHQxMl9pY2sgPSB7Ci0JLm5hbWUJCT0gImdwdDEyX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZsNF9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUFQxMl9TSElGVCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZ3B0MTJfZmNrID0gewotCS5uYW1lCQk9ICJncHQxMl9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmc2VjdXJlXzMya19jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUFQxMl9TSElGVCwKLQkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAotCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9DTEtTRUwyKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMjRYWF9DTEtTRUxfR1BUMTJfTUFTSywKLQkuY2xrc2VsCQk9IG9tYXAyNHh4X2dwdF9jbGtzZWwsCi0JLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1jYnNwMV9pY2sgPSB7Ci0JLm5hbWUJCT0gIm1jYnNwX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkuaWQJCT0gMSwKLQkucGFyZW50CQk9ICZsNF9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9NQ0JTUDFfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1jYnNwMV9mY2sgPSB7Ci0JLm5hbWUJCT0gIm1jYnNwX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkuaWQJCT0gMSwKLQkucGFyZW50CQk9ICZmdW5jXzk2bV9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9NQ0JTUDFfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1jYnNwMl9pY2sgPSB7Ci0JLm5hbWUJCT0gIm1jYnNwX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkuaWQJCT0gMiwKLQkucGFyZW50CQk9ICZsNF9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9NQ0JTUDJfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1jYnNwMl9mY2sgPSB7Ci0JLm5hbWUJCT0gIm1jYnNwX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkuaWQJCT0gMiwKLQkucGFyZW50CQk9ICZmdW5jXzk2bV9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9NQ0JTUDJfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1jYnNwM19pY2sgPSB7Ci0JLm5hbWUJCT0gIm1jYnNwX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkuaWQJCT0gMywKLQkucGFyZW50CQk9ICZsNF9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjQzMF9FTl9NQ0JTUDNfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1jYnNwM19mY2sgPSB7Ci0JLm5hbWUJCT0gIm1jYnNwX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkuaWQJCT0gMywKLQkucGFyZW50CQk9ICZmdW5jXzk2bV9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgT01BUDI0WFhfQ01fRkNMS0VOMiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjQzMF9FTl9NQ0JTUDNfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1jYnNwNF9pY2sgPSB7Ci0JLm5hbWUJCT0gIm1jYnNwX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkuaWQJCT0gNCwKLQkucGFyZW50CQk9ICZsNF9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjQzMF9FTl9NQ0JTUDRfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1jYnNwNF9mY2sgPSB7Ci0JLm5hbWUJCT0gIm1jYnNwX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkuaWQJCT0gNCwKLQkucGFyZW50CQk9ICZmdW5jXzk2bV9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgT01BUDI0WFhfQ01fRkNMS0VOMiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjQzMF9FTl9NQ0JTUDRfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1jYnNwNV9pY2sgPSB7Ci0JLm5hbWUJCT0gIm1jYnNwX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkuaWQJCT0gNSwKLQkucGFyZW50CQk9ICZsNF9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjQzMF9FTl9NQ0JTUDVfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1jYnNwNV9mY2sgPSB7Ci0JLm5hbWUJCT0gIm1jYnNwX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkuaWQJCT0gNSwKLQkucGFyZW50CQk9ICZmdW5jXzk2bV9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgT01BUDI0WFhfQ01fRkNMS0VOMiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjQzMF9FTl9NQ0JTUDVfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1jc3BpMV9pY2sgPSB7Ci0JLm5hbWUJCT0gIm1jc3BpX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkuaWQJCT0gMSwKLQkucGFyZW50CQk9ICZsNF9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9NQ1NQSTFfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1jc3BpMV9mY2sgPSB7Ci0JLm5hbWUJCT0gIm1jc3BpX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkuaWQJCT0gMSwKLQkucGFyZW50CQk9ICZmdW5jXzQ4bV9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9NQ1NQSTFfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1jc3BpMl9pY2sgPSB7Ci0JLm5hbWUJCT0gIm1jc3BpX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkuaWQJCT0gMiwKLQkucGFyZW50CQk9ICZsNF9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9NQ1NQSTJfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1jc3BpMl9mY2sgPSB7Ci0JLm5hbWUJCT0gIm1jc3BpX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkuaWQJCT0gMiwKLQkucGFyZW50CQk9ICZmdW5jXzQ4bV9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9NQ1NQSTJfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1jc3BpM19pY2sgPSB7Ci0JLm5hbWUJCT0gIm1jc3BpX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkuaWQJCT0gMywKLQkucGFyZW50CQk9ICZsNF9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjQzMF9FTl9NQ1NQSTNfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1jc3BpM19mY2sgPSB7Ci0JLm5hbWUJCT0gIm1jc3BpX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkuaWQJCT0gMywKLQkucGFyZW50CQk9ICZmdW5jXzQ4bV9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgT01BUDI0WFhfQ01fRkNMS0VOMiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjQzMF9FTl9NQ1NQSTNfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHVhcnQxX2ljayA9IHsKLQkubmFtZQkJPSAidWFydDFfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmw0X2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX1VBUlQxX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayB1YXJ0MV9mY2sgPSB7Ci0JLm5hbWUJCT0gInVhcnQxX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZmdW5jXzQ4bV9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9VQVJUMV9TSElGVCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgdWFydDJfaWNrID0gewotCS5uYW1lCQk9ICJ1YXJ0Ml9pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmbDRfY2ssCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fVUFSVDJfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHVhcnQyX2ZjayA9IHsKLQkubmFtZQkJPSAidWFydDJfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmZ1bmNfNDhtX2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX1VBUlQyX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayB1YXJ0M19pY2sgPSB7Ci0JLm5hbWUJCT0gInVhcnQzX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZsNF9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9VQVJUM19TSElGVCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgdWFydDNfZmNrID0gewotCS5uYW1lCQk9ICJ1YXJ0M19mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmZnVuY180OG1fY2ssCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIE9NQVAyNFhYX0NNX0ZDTEtFTjIpLAotCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fVUFSVDNfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGdwaW9zX2ljayA9IHsKLQkubmFtZQkJPSAiZ3Bpb3NfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmw0X2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKFdLVVBfTU9ELCBDTV9JQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fR1BJT1NfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGdwaW9zX2ZjayA9IHsKLQkubmFtZQkJPSAiZ3Bpb3NfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmZ1bmNfMzJrX2NrLAotCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKFdLVVBfTU9ELCBDTV9GQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fR1BJT1NfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1wdV93ZHRfaWNrID0gewotCS5uYW1lCQk9ICJtcHVfd2R0X2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZsNF9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihXS1VQX01PRCwgQ01fSUNMS0VOKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX01QVV9XRFRfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1wdV93ZHRfZmNrID0gewotCS5uYW1lCQk9ICJtcHVfd2R0X2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZmdW5jXzMya19jaywKLQkuY2xrZG1fbmFtZQk9ICJ3a3VwX2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihXS1VQX01PRCwgQ01fRkNMS0VOKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX01QVV9XRFRfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHN5bmNfMzJrX2ljayA9IHsKLQkubmFtZQkJPSAic3luY18zMmtfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmw0X2NrLAotCS5mbGFncwkJPSBFTkFCTEVfT05fSU5JVCwKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihXS1VQX01PRCwgQ01fSUNMS0VOKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOXzMyS1NZTkNfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHdkdDFfaWNrID0gewotCS5uYW1lCQk9ICJ3ZHQxX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZsNF9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihXS1VQX01PRCwgQ01fSUNMS0VOKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX1dEVDFfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG9tYXBjdHJsX2ljayA9IHsKLQkubmFtZQkJPSAib21hcGN0cmxfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmw0X2NrLAotCS5mbGFncwkJPSBFTkFCTEVfT05fSU5JVCwKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihXS1VQX01PRCwgQ01fSUNMS0VOKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX09NQVBDVFJMX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBpY3JfaWNrID0gewotCS5uYW1lCQk9ICJpY3JfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmw0X2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKFdLVVBfTU9ELCBDTV9JQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDI0MzBfRU5fSUNSX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBjYW1faWNrID0gewotCS5uYW1lCQk9ICJjYW1faWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKLQkucGFyZW50CQk9ICZsNF9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9DQU1fU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLS8qCi0gKiBjYW1fZmNrIGNvbnRyb2xzIGJvdGggQ0FNX01DTEsgYW5kIENBTV9GQ0xLLiAgSXQgc2hvdWxkIHByb2JhYmx5IGJlCi0gKiBzcGxpdCBpbnRvIHR3byBzZXBhcmF0ZSBjbG9ja3MsIHNpbmNlIHRoZSBwYXJlbnQgY2xvY2tzIGFyZSBkaWZmZXJlbnQKLSAqIGFuZCB0aGUgY2xvY2tkb21haW5zIGFyZSBhbHNvIGRpZmZlcmVudC4KLSAqLwotc3RhdGljIHN0cnVjdCBjbGsgY2FtX2ZjayA9IHsKLQkubmFtZQkJPSAiY2FtX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCi0JLnBhcmVudAkJPSAmZnVuY185Nm1fY2ssCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sM19jbGtkbSIsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fQ0FNX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBtYWlsYm94ZXNfaWNrID0gewotCS5uYW1lCQk9ICJtYWlsYm94ZXNfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmw0X2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX01BSUxCT1hFU19TSElGVCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgd2R0NF9pY2sgPSB7Ci0JLm5hbWUJCT0gIndkdDRfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmw0X2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX1dEVDRfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHdkdDRfZmNrID0gewotCS5uYW1lCQk9ICJ3ZHQ0X2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZmdW5jXzMya19jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9XRFQ0X1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayB3ZHQzX2ljayA9IHsKLQkubmFtZQkJPSAid2R0M19pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmbDRfY2ssCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDI0MjBfRU5fV0RUM19TSElGVCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgd2R0M19mY2sgPSB7Ci0JLm5hbWUJCT0gIndkdDNfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmZ1bmNfMzJrX2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNDIwX0VOX1dEVDNfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1zcHJvX2ljayA9IHsKLQkubmFtZQkJPSAibXNwcm9faWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmw0X2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX01TUFJPX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBtc3Byb19mY2sgPSB7Ci0JLm5hbWUJCT0gIm1zcHJvX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZmdW5jXzk2bV9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9NU1BST19TSElGVCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbW1jX2ljayA9IHsKLQkubmFtZQkJPSAibW1jX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZsNF9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjQyMF9FTl9NTUNfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1tY19mY2sgPSB7Ci0JLm5hbWUJCT0gIm1tY19mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmZnVuY185Nm1fY2ssCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDI0MjBfRU5fTU1DX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBmYWNfaWNrID0gewotCS5uYW1lCQk9ICJmYWNfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmw0X2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0ZBQ19TSElGVCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZmFjX2ZjayA9IHsKLQkubmFtZQkJPSAiZmFjX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZmdW5jXzEybV9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9GQUNfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGVhY19pY2sgPSB7Ci0JLm5hbWUJCT0gImVhY19pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmbDRfY2ssCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDI0MjBfRU5fRUFDX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBlYWNfZmNrID0gewotCS5uYW1lCQk9ICJlYWNfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmZ1bmNfOTZtX2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNDIwX0VOX0VBQ19TSElGVCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgaGRxX2ljayA9IHsKLQkubmFtZQkJPSAiaGRxX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZsNF9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9IRFFfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGhkcV9mY2sgPSB7Ci0JLm5hbWUJCT0gImhkcV9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmZnVuY18xMm1fY2ssCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fSERRX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBpMmMyX2ljayA9IHsKLQkubmFtZQkJPSAiaTJjX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkuaWQJCT0gMiwKLQkucGFyZW50CQk9ICZsNF9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjQyMF9FTl9JMkMyX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBpMmMyX2ZjayA9IHsKLQkubmFtZQkJPSAiaTJjX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkuaWQJCT0gMiwKLQkucGFyZW50CQk9ICZmdW5jXzEybV9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjQyMF9FTl9JMkMyX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBpMmNoczJfZmNrID0gewotCS5uYW1lCQk9ICJpMmNfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDI0MzBfaTJjaHNfd2FpdCwKLQkuaWQJCT0gMiwKLQkucGFyZW50CQk9ICZmdW5jXzk2bV9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgT01BUDI0WFhfQ01fRkNMS0VOMiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjQzMF9FTl9JMkNIUzJfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGkyYzFfaWNrID0gewotCS5uYW1lCQk9ICJpMmNfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5pZAkJPSAxLAotCS5wYXJlbnQJCT0gJmw0X2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNDIwX0VOX0kyQzFfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGkyYzFfZmNrID0gewotCS5uYW1lCQk9ICJpMmNfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5pZAkJPSAxLAotCS5wYXJlbnQJCT0gJmZ1bmNfMTJtX2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNDIwX0VOX0kyQzFfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGkyY2hzMV9mY2sgPSB7Ci0JLm5hbWUJCT0gImkyY19mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMjQzMF9pMmNoc193YWl0LAotCS5pZAkJPSAxLAotCS5wYXJlbnQJCT0gJmZ1bmNfOTZtX2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBPTUFQMjRYWF9DTV9GQ0xLRU4yKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNDMwX0VOX0kyQ0hTMV9TSElGVCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZ3BtY19mY2sgPSB7Ci0JLm5hbWUJCT0gImdwbWNfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfbnVsbCwgLyogUk1LOiBtaXNzaW5nPyAqLwotCS5wYXJlbnQJCT0gJmNvcmVfbDNfY2ssCi0JLmZsYWdzCQk9IEVOQUJMRV9PTl9JTklULAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDNfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBzZG1hX2ZjayA9IHsKLQkubmFtZQkJPSAic2RtYV9mY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLCAvKiBSTUs6IG1pc3Npbmc/ICovCi0JLnBhcmVudAkJPSAmY29yZV9sM19jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2wzX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgc2RtYV9pY2sgPSB7Ci0JLm5hbWUJCT0gInNkbWFfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfbnVsbCwgLyogUk1LOiBtaXNzaW5nPyAqLwotCS5wYXJlbnQJCT0gJmw0X2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDNfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayB2bHlucV9pY2sgPSB7Ci0JLm5hbWUJCT0gInZseW5xX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZjb3JlX2wzX2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDNfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNDIwX0VOX1ZMWU5RX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIHZseW5xX2Zja185Nm1fcmF0ZXNbXSA9IHsKLQl7IC5kaXYgPSAxLCAudmFsID0gMCwgLmZsYWdzID0gUkFURV9JTl8yNDJYIHwgREVGQVVMVF9SQVRFIH0sCi0JeyAuZGl2ID0gMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIHZseW5xX2Zja19jb3JlX3JhdGVzW10gPSB7Ci0JeyAuZGl2ID0gMSwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fMjQyWCB9LAotCXsgLmRpdiA9IDIsIC52YWwgPSAyLCAuZmxhZ3MgPSBSQVRFX0lOXzI0MlggfSwKLQl7IC5kaXYgPSAzLCAudmFsID0gMywgLmZsYWdzID0gUkFURV9JTl8yNDJYIH0sCi0JeyAuZGl2ID0gNCwgLnZhbCA9IDQsIC5mbGFncyA9IFJBVEVfSU5fMjQyWCB9LAotCXsgLmRpdiA9IDYsIC52YWwgPSA2LCAuZmxhZ3MgPSBSQVRFX0lOXzI0MlggfSwKLQl7IC5kaXYgPSA4LCAudmFsID0gOCwgLmZsYWdzID0gUkFURV9JTl8yNDJYIH0sCi0JeyAuZGl2ID0gOSwgLnZhbCA9IDksIC5mbGFncyA9IFJBVEVfSU5fMjQyWCB9LAotCXsgLmRpdiA9IDEyLCAudmFsID0gMTIsIC5mbGFncyA9IFJBVEVfSU5fMjQyWCB9LAotCXsgLmRpdiA9IDE2LCAudmFsID0gMTYsIC5mbGFncyA9IFJBVEVfSU5fMjQyWCB8IERFRkFVTFRfUkFURSB9LAotCXsgLmRpdiA9IDE4LCAudmFsID0gMTgsIC5mbGFncyA9IFJBVEVfSU5fMjQyWCB9LAotCXsgLmRpdiA9IDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgdmx5bnFfZmNrX2Nsa3NlbFtdID0gewotCXsgLnBhcmVudCA9ICZmdW5jXzk2bV9jaywgLnJhdGVzID0gdmx5bnFfZmNrXzk2bV9yYXRlcyB9LAotCXsgLnBhcmVudCA9ICZjb3JlX2NrLAkgIC5yYXRlcyA9IHZseW5xX2Zja19jb3JlX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gTlVMTCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGNsayB2bHlucV9mY2sgPSB7Ci0JLm5hbWUJCT0gInZseW5xX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZmdW5jXzk2bV9jaywKLQkuZmxhZ3MJCT0gREVMQVlFRF9BUFAsCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sM19jbGtkbSIsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDI0MjBfRU5fVkxZTlFfU0hJRlQsCi0JLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fQ0xLU0VMMSksCi0JLmNsa3NlbF9tYXNrCT0gT01BUDI0MjBfQ0xLU0VMX1ZMWU5RX01BU0ssCi0JLmNsa3NlbAkJPSB2bHlucV9mY2tfY2xrc2VsLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi0JLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCi0JLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZQotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgc2RyY19pY2sgPSB7Ci0JLm5hbWUJCT0gInNkcmNfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmw0X2NrLAotCS5mbGFncwkJPSBFTkFCTEVfT05fSU5JVCwKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMyksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjQzMF9FTl9TRFJDX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBkZXNfaWNrID0gewotCS5uYW1lCQk9ICJkZXNfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmw0X2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBPTUFQMjRYWF9DTV9JQ0xLRU40KSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0RFU19TSElGVCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgc2hhX2ljayA9IHsKLQkubmFtZQkJPSAic2hhX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZsNF9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgT01BUDI0WFhfQ01fSUNMS0VONCksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9TSEFfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHJuZ19pY2sgPSB7Ci0JLm5hbWUJCT0gInJuZ19pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmbDRfY2ssCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIE9NQVAyNFhYX0NNX0lDTEtFTjQpLAotCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fUk5HX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBhZXNfaWNrID0gewotCS5uYW1lCQk9ICJhZXNfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmw0X2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBPTUFQMjRYWF9DTV9JQ0xLRU40KSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0FFU19TSElGVCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgcGthX2ljayA9IHsKLQkubmFtZQkJPSAicGthX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZsNF9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgT01BUDI0WFhfQ01fSUNMS0VONCksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9QS0FfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHVzYl9mY2sgPSB7Ci0JLm5hbWUJCT0gInVzYl9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmZnVuY180OG1fY2ssCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sM19jbGtkbSIsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIE9NQVAyNFhYX0NNX0ZDTEtFTjIpLAotCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fVVNCX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayB1c2Joc19pY2sgPSB7Ci0JLm5hbWUJCT0gInVzYmhzX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZjb3JlX2wzX2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDNfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4yKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNDMwX0VOX1VTQkhTX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBtbWNoczFfaWNrID0gewotCS5uYW1lCQk9ICJtbWNoc19pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmbDRfY2ssCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjIpLAotCS5lbmFibGVfYml0CT0gT01BUDI0MzBfRU5fTU1DSFMxX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBtbWNoczFfZmNrID0gewotCS5uYW1lCQk9ICJtbWNoc19mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmZnVuY185Nm1fY2ssCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sM19jbGtkbSIsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIE9NQVAyNFhYX0NNX0ZDTEtFTjIpLAotCS5lbmFibGVfYml0CT0gT01BUDI0MzBfRU5fTU1DSFMxX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBtbWNoczJfaWNrID0gewotCS5uYW1lCQk9ICJtbWNoc19pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLmlkCQk9IDEsCi0JLnBhcmVudAkJPSAmbDRfY2ssCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjIpLAotCS5lbmFibGVfYml0CT0gT01BUDI0MzBfRU5fTU1DSFMyX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBtbWNoczJfZmNrID0gewotCS5uYW1lCQk9ICJtbWNoc19mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLmlkCQk9IDEsCi0JLnBhcmVudAkJPSAmZnVuY185Nm1fY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIE9NQVAyNFhYX0NNX0ZDTEtFTjIpLAotCS5lbmFibGVfYml0CT0gT01BUDI0MzBfRU5fTU1DSFMyX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncGlvNV9pY2sgPSB7Ci0JLm5hbWUJCT0gImdwaW81X2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZsNF9jaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMjQzMF9FTl9HUElPNV9TSElGVCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZ3BpbzVfZmNrID0gewotCS5uYW1lCQk9ICJncGlvNV9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmZnVuY18zMmtfY2ssCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIE9NQVAyNFhYX0NNX0ZDTEtFTjIpLAotCS5lbmFibGVfYml0CT0gT01BUDI0MzBfRU5fR1BJTzVfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1kbV9pbnRjX2ljayA9IHsKLQkubmFtZQkJPSAibWRtX2ludGNfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmw0X2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4yKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNDMwX0VOX01ETV9JTlRDX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBtbWNoc2RiMV9mY2sgPSB7Ci0JLm5hbWUJCT0gIm1tY2hzZGJfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmZ1bmNfMzJrX2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBPTUFQMjRYWF9DTV9GQ0xLRU4yKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNDMwX0VOX01NQ0hTREIxX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBtbWNoc2RiMl9mY2sgPSB7Ci0JLm5hbWUJCT0gIm1tY2hzZGJfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5pZAkJPSAxLAotCS5wYXJlbnQJCT0gJmZ1bmNfMzJrX2NrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBPTUFQMjRYWF9DTV9GQ0xLRU4yKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAyNDMwX0VOX01NQ0hTREIyX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi0vKgotICogVGhpcyBjbG9jayBpcyBhIGNvbXBvc2l0ZSBjbG9jayB3aGljaCBkb2VzIGVudGlyZSBzZXQgY2hhbmdlcyB0aGVuCi0gKiBmb3JjZXMgYSByZWJhbGFuY2UuIEl0IGtleXMgb24gdGhlIE1QVSBzcGVlZCwgYnV0IGl0IHJlYWxseSBjb3VsZAotICogYmUgYW55IGtleSBzcGVlZCBwYXJ0IG9mIGEgc2V0IGluIHRoZSByYXRlIHRhYmxlLgotICoKLSAqIHRvIHJlYWxseSBjaGFuZ2UgYSBzZXQsIHlvdSBuZWVkIG1lbW9yeSB0YWJsZSBzZXRzIHdoaWNoIGdldCBjaGFuZ2VkCi0gKiBpbiBzcmFtLCBwcmUtbm90aWZpZXJzICYgcG9zdCBub3RpZmllcnMsIGNoYW5naW5nIHRoZSB0b3Agc2V0LCB3aXRob3V0Ci0gKiBoYXZpbmcgbG93IGxldmVsIGRpc3BsYXkgcmVjYWxjJ3Mgd29uJ3Qgd29yay4uLiB0aGlzIGlzIHdoeSBkcG0gbm90aWZpZXJzCi0gKiB3b3JrLCBpc3IncyBvZmYsIHdhbGsgYSBsaXN0IG9mIGNsb2NrcyBhbHJlYWR5IF9vZmZfIGFuZCBub3QgbWVzc2luZyB3aXRoCi0gKiB0aGUgYnVzLgotICoKLSAqIFRoaXMgY2xvY2sgc2hvdWxkIGhhdmUgbm8gcGFyZW50LiBJdCBlbWJvZGllcyB0aGUgZW50aXJlIHVwcGVyIGxldmVsCi0gKiBhY3RpdmUgc2V0LiBBIHBhcmVudCB3aWxsIG1lc3MgdXAgc29tZSBvZiB0aGUgaW5pdCBhbHNvLgotICovCi1zdGF0aWMgc3RydWN0IGNsayB2aXJ0X3ByY21fc2V0ID0gewotCS5uYW1lCQk9ICJ2aXJ0X3ByY21fc2V0IiwKLQkub3BzCQk9ICZjbGtvcHNfbnVsbCwKLQkuZmxhZ3MJCT0gREVMQVlFRF9BUFAsCi0JLnBhcmVudAkJPSAmbXB1X2NrLAkvKiBJbmRleGVkIGJ5IG1wdSBzcGVlZCwgbm8gcGFyZW50ICovCi0JLnJlY2FsYwkJPSAmb21hcDJfdGFibGVfbXB1X3JlY2FsYywJLyogc2V0cyBhcmUga2V5ZWQgb24gbXB1IHJhdGUgKi8KLQkuc2V0X3JhdGUJPSAmb21hcDJfc2VsZWN0X3RhYmxlX3JhdGUsCi0JLnJvdW5kX3JhdGUJPSAmb21hcDJfcm91bmRfdG9fdGFibGVfcmF0ZSwKLX07Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMnh4eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazJ4eHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGUzZmI3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazJ4eHguYwpAQCAtMCwwICsxLDU4NyBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDggVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqICBDb250YWN0czoKKyAqICBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKiAgUGF1bCBXYWxtc2xleQorICoKKyAqICBCYXNlZCBvbiBlYXJsaWVyIHdvcmsgYnkgVHV1a2thIFRpa2thbmVuLCBUb255IExpbmRncmVuLAorICogIEdvcmRvbiBNY051dHQgYW5kIFJpZGdlUnVuLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI3VuZGVmIERFQlVHCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgorI2luY2x1ZGUgPHBsYXQvc3JhbS5oPgorI2luY2x1ZGUgPHBsYXQvcHJjbS5oPgorI2luY2x1ZGUgPHBsYXQvY2xrZGV2X29tYXAuaD4KKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKyNpbmNsdWRlIDxhc20vY2xrZGV2Lmg+CisKKyNpbmNsdWRlIDxwbGF0L3NkcmMuaD4KKyNpbmNsdWRlICJjbG9jay5oIgorI2luY2x1ZGUgImNsb2NrMnh4eC5oIgorI2luY2x1ZGUgIm9wcDJ4eHguaCIKKyNpbmNsdWRlICJwcm0uaCIKKyNpbmNsdWRlICJwcm0tcmVnYml0cy0yNHh4LmgiCisjaW5jbHVkZSAiY20uaCIKKyNpbmNsdWRlICJjbS1yZWdiaXRzLTI0eHguaCIKKworCisvKiBDTV9DTEtFTl9QTEwuRU5fezU0LDk2fU1fUExMIG9wdGlvbnMgKDI0WFgpICovCisjZGVmaW5lIEVOX0FQTExfU1RPUFBFRAkJCTAKKyNkZWZpbmUgRU5fQVBMTF9MT0NLRUQJCQkzCisKKy8qIENNX0NMS1NFTDFfUExMLkFQTExTX0NMS0lOIG9wdGlvbnMgKDI0WFgpICovCisjZGVmaW5lIEFQTExTX0NMS0lOXzE5XzJNSFoJCTAKKyNkZWZpbmUgQVBMTFNfQ0xLSU5fMTNNSFoJCTIKKyNkZWZpbmUgQVBMTFNfQ0xLSU5fMTJNSFoJCTMKKworLyogI2RlZmluZSBET1dOX1ZBUklBQkxFX0RQTEwgMSAqLwkJLyogRXhwZXJpbWVudGFsICovCisKK2NvbnN0IHN0cnVjdCBwcmNtX2NvbmZpZyAqY3Vycl9wcmNtX3NldDsKK2NvbnN0IHN0cnVjdCBwcmNtX2NvbmZpZyAqcmF0ZV90YWJsZTsKKworc3RydWN0IGNsayAqdmNsaywgKnNjbGssICpkY2xrOworCit2b2lkIF9faW9tZW0gKnByY21fY2xrc3JjX2N0cmw7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogT21hcDI0eHggc3BlY2lmaWMgY2xvY2sgZnVuY3Rpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIG9tYXAyNDMwX2Nsa19pMmNoc19maW5kX2lkbGVzdCAtIHJldHVybiBDTV9JRExFU1QgaW5mbyBmb3IgMjQzMCBJMkNIUworICogQGNsazogc3RydWN0IGNsayAqIGJlaW5nIGVuYWJsZWQKKyAqIEBpZGxlc3RfcmVnOiB2b2lkIF9faW9tZW0gKiogdG8gc3RvcmUgQ01fSURMRVNUIHJlZyBhZGRyZXNzIGludG8KKyAqIEBpZGxlc3RfYml0OiBwb2ludGVyIHRvIGEgdTggdG8gc3RvcmUgdGhlIENNX0lETEVTVCBiaXQgc2hpZnQgaW50bworICoKKyAqIE9NQVAyNDMwIEkyQ0hTIENNX0lETEVTVCBiaXRzIGFyZSBpbiBDTV9JRExFU1QxX0NPUkUsIGJ1dCB0aGUKKyAqIENNXypDTEtFTiBiaXRzIGFyZSBpbiBDTV97SSxGfUNMS0VOMl9DT1JFLiAgVGhpcyBjdXN0b20gZnVuY3Rpb24KKyAqIHBhc3NlcyBiYWNrIHRoZSBjb3JyZWN0IENNX0lETEVTVCByZWdpc3RlciBhZGRyZXNzIGZvciBJMkNIUworICogbW9kdWxlcy4gIE5vIHJldHVybiB2YWx1ZS4KKyAqLworc3RhdGljIHZvaWQgb21hcDI0MzBfY2xrX2kyY2hzX2ZpbmRfaWRsZXN0KHN0cnVjdCBjbGsgKmNsaywKKwkJCQkJICAgdm9pZCBfX2lvbWVtICoqaWRsZXN0X3JlZywKKwkJCQkJICAgdTggKmlkbGVzdF9iaXQpCit7CisJKmlkbGVzdF9yZWcgPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lETEVTVCk7CisJKmlkbGVzdF9iaXQgPSBjbGstPmVuYWJsZV9iaXQ7Cit9CisKKy8qIDI0MzAgSTJDSFMgaGFzIG5vbi1zdGFuZGFyZCBJRExFU1QgcmVnaXN0ZXIgKi8KK2NvbnN0IHN0cnVjdCBjbGtvcHMgY2xrb3BzX29tYXAyNDMwX2kyY2hzX3dhaXQgPSB7CisJLmVuYWJsZQkJPSBvbWFwMl9kZmx0X2Nsa19lbmFibGUsCisJLmRpc2FibGUJPSBvbWFwMl9kZmx0X2Nsa19kaXNhYmxlLAorCS5maW5kX2lkbGVzdAk9IG9tYXAyNDMwX2Nsa19pMmNoc19maW5kX2lkbGVzdCwKKwkuZmluZF9jb21wYW5pb24gPSBvbWFwMl9jbGtfZGZsdF9maW5kX2NvbXBhbmlvbiwKK307CisKKy8qKgorICogb21hcDJ4eHhfY2xrX2dldF9jb3JlX3JhdGUgLSByZXR1cm4gdGhlIENPUkVfQ0xLIHJhdGUKKyAqIEBjbGs6IHBvaW50ZXIgdG8gdGhlIGNvbWJpbmVkIGRwbGxfY2sgKyBjb3JlX2NrIChjdXJyZW50bHkgImRwbGxfY2siKQorICoKKyAqIFJldHVybnMgdGhlIENPUkVfQ0xLIHJhdGUuICBDT1JFX0NMSyBjYW4gaGF2ZSBvbmUgb2YgdGhyZWUgcmF0ZQorICogc291cmNlcyBvbiBPTUFQMnh4eDogdGhlIERQTEwgQ0xLT1VUIHJhdGUsIERQTEwgQ0xLT1VUWDIsIG9yIDMyS0h6CisgKiAodGhlIGxhdHRlciBpcyB1bnVzdWFsKS4gIFRoaXMgY3VycmVudGx5IHNob3VsZCBiZSBjYWxsZWQgd2l0aAorICogc3RydWN0IGNsayAqZHBsbF9jaywgd2hpY2ggaXMgYSBjb21wb3NpdGUgY2xvY2sgb2YgZHBsbF9jayBhbmQKKyAqIGNvcmVfY2suCisgKi8KK3Vuc2lnbmVkIGxvbmcgb21hcDJ4eHhfY2xrX2dldF9jb3JlX3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCWxvbmcgbG9uZyBjb3JlX2NsazsKKwl1MzIgdjsKKworCWNvcmVfY2xrID0gb21hcDJfZ2V0X2RwbGxfcmF0ZShjbGspOworCisJdiA9IGNtX3JlYWRfbW9kX3JlZyhQTExfTU9ELCBDTV9DTEtTRUwyKTsKKwl2ICY9IE9NQVAyNFhYX0NPUkVfQ0xLX1NSQ19NQVNLOworCisJaWYgKHYgPT0gQ09SRV9DTEtfU1JDXzMySykKKwkJY29yZV9jbGsgPSAzMjc2ODsKKwllbHNlCisJCWNvcmVfY2xrICo9IHY7CisKKwlyZXR1cm4gY29yZV9jbGs7Cit9CisKK3N0YXRpYyBpbnQgb21hcDJfZW5hYmxlX29zY19jayhzdHJ1Y3QgY2xrICpjbGspCit7CisJdTMyIHBjYzsKKworCXBjYyA9IF9fcmF3X3JlYWRsKHByY21fY2xrc3JjX2N0cmwpOworCisJX19yYXdfd3JpdGVsKHBjYyAmIH5PTUFQX0FVVE9FWFRDTEtNT0RFX01BU0ssIHByY21fY2xrc3JjX2N0cmwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXAyX2Rpc2FibGVfb3NjX2NrKHN0cnVjdCBjbGsgKmNsaykKK3sKKwl1MzIgcGNjOworCisJcGNjID0gX19yYXdfcmVhZGwocHJjbV9jbGtzcmNfY3RybCk7CisKKwlfX3Jhd193cml0ZWwocGNjIHwgT01BUF9BVVRPRVhUQ0xLTU9ERV9NQVNLLCBwcmNtX2Nsa3NyY19jdHJsKTsKK30KKworY29uc3Qgc3RydWN0IGNsa29wcyBjbGtvcHNfb3NjY2sgPSB7CisJLmVuYWJsZQkJPSBvbWFwMl9lbmFibGVfb3NjX2NrLAorCS5kaXNhYmxlCT0gb21hcDJfZGlzYWJsZV9vc2NfY2ssCit9OworCisjaWZkZWYgT0xEX0NLCisvKiBSZWNhbGN1bGF0ZSBTWVNUX0NMSyAqLworc3RhdGljIHZvaWQgb21hcDJfc3lzX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCXUzMiBkaXYgPSBQUkNNX0NMS1NSQ19DVFJMOworCWRpdiAmPSAoMSA8PCA3KSB8ICgxIDw8IDYpOwkvKiBUZXN0IGlmIGV4dCBjbGsgZGl2aWRlZCBieSAxIG9yIDIgKi8KKwlkaXYgPj49IGNsay0+cmF0ZV9vZmZzZXQ7CisJY2xrLT5yYXRlID0gKGNsay0+cGFyZW50LT5yYXRlIC8gZGl2KTsKKwlwcm9wYWdhdGVfcmF0ZShjbGspOworfQorI2VuZGlmCS8qIE9MRF9DSyAqLworCisvKiBFbmFibGUgYW4gQVBMTCBpZiBvZmYgKi8KK3N0YXRpYyBpbnQgb21hcDJfY2xrX2FwbGxfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaywgdTMyIHN0YXR1c19tYXNrKQoreworCXUzMiBjdmFsLCBhcGxsX21hc2s7CisKKwlhcGxsX21hc2sgPSBFTl9BUExMX0xPQ0tFRCA8PCBjbGstPmVuYWJsZV9iaXQ7CisKKwljdmFsID0gY21fcmVhZF9tb2RfcmVnKFBMTF9NT0QsIENNX0NMS0VOKTsKKworCWlmICgoY3ZhbCAmIGFwbGxfbWFzaykgPT0gYXBsbF9tYXNrKQorCQlyZXR1cm4gMDsgICAvKiBhcGxsIGFscmVhZHkgZW5hYmxlZCAqLworCisJY3ZhbCAmPSB+YXBsbF9tYXNrOworCWN2YWwgfD0gYXBsbF9tYXNrOworCWNtX3dyaXRlX21vZF9yZWcoY3ZhbCwgUExMX01PRCwgQ01fQ0xLRU4pOworCisJb21hcDJfY21fd2FpdF9pZGxlc3QoT01BUF9DTV9SRUdBRERSKFBMTF9NT0QsIENNX0lETEVTVCksIHN0YXR1c19tYXNrLAorCQkJICAgICBjbGstPm5hbWUpOworCisJLyoKKwkgKiBSRVZJU0lUOiBTaG91bGQgd2UgcmV0dXJuIGFuIGVycm9yIGNvZGUgaWYgb21hcDJfd2FpdF9jbG9ja19yZWFkeSgpCisJICogZmFpbHM/CisJICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcDJfY2xrX2FwbGw5Nl9lbmFibGUoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiBvbWFwMl9jbGtfYXBsbF9lbmFibGUoY2xrLCBPTUFQMjRYWF9TVF85Nk1fQVBMTCk7Cit9CisKK3N0YXRpYyBpbnQgb21hcDJfY2xrX2FwbGw1NF9lbmFibGUoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiBvbWFwMl9jbGtfYXBsbF9lbmFibGUoY2xrLCBPTUFQMjRYWF9TVF81NE1fQVBMTCk7Cit9CisKKy8qIFN0b3AgQVBMTCAqLworc3RhdGljIHZvaWQgb21hcDJfY2xrX2FwbGxfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdTMyIGN2YWw7CisKKwljdmFsID0gY21fcmVhZF9tb2RfcmVnKFBMTF9NT0QsIENNX0NMS0VOKTsKKwljdmFsICY9IH4oRU5fQVBMTF9MT0NLRUQgPDwgY2xrLT5lbmFibGVfYml0KTsKKwljbV93cml0ZV9tb2RfcmVnKGN2YWwsIFBMTF9NT0QsIENNX0NMS0VOKTsKK30KKworY29uc3Qgc3RydWN0IGNsa29wcyBjbGtvcHNfYXBsbDk2ID0geworCS5lbmFibGUJCT0gb21hcDJfY2xrX2FwbGw5Nl9lbmFibGUsCisJLmRpc2FibGUJPSBvbWFwMl9jbGtfYXBsbF9kaXNhYmxlLAorfTsKKworY29uc3Qgc3RydWN0IGNsa29wcyBjbGtvcHNfYXBsbDU0ID0geworCS5lbmFibGUJCT0gb21hcDJfY2xrX2FwbGw1NF9lbmFibGUsCisJLmRpc2FibGUJPSBvbWFwMl9jbGtfYXBsbF9kaXNhYmxlLAorfTsKKworLyoKKyAqIFVzZXMgdGhlIGN1cnJlbnQgcHJjbSBzZXQgdG8gdGVsbCBpZiBhIHJhdGUgaXMgdmFsaWQuCisgKiBZb3UgY2FuIGdvIHNsb3dlciwgYnV0IG5vdCBmYXN0ZXIgd2l0aGluIGEgZ2l2ZW4gcmF0ZSBzZXQuCisgKi8KK2xvbmcgb21hcDJfZHBsbGNvcmVfcm91bmRfcmF0ZSh1bnNpZ25lZCBsb25nIHRhcmdldF9yYXRlKQoreworCXUzMiBoaWdoLCBsb3csIGNvcmVfY2xrX3NyYzsKKworCWNvcmVfY2xrX3NyYyA9IGNtX3JlYWRfbW9kX3JlZyhQTExfTU9ELCBDTV9DTEtTRUwyKTsKKwljb3JlX2Nsa19zcmMgJj0gT01BUDI0WFhfQ09SRV9DTEtfU1JDX01BU0s7CisKKwlpZiAoY29yZV9jbGtfc3JjID09IENPUkVfQ0xLX1NSQ19EUExMKSB7CS8qIERQTEwgY2xvY2tvdXQgKi8KKwkJaGlnaCA9IGN1cnJfcHJjbV9zZXQtPmRwbGxfc3BlZWQgKiAyOworCQlsb3cgPSBjdXJyX3ByY21fc2V0LT5kcGxsX3NwZWVkOworCX0gZWxzZSB7CQkJCS8qIERQTEwgY2xvY2tvdXQgeCAyICovCisJCWhpZ2ggPSBjdXJyX3ByY21fc2V0LT5kcGxsX3NwZWVkOworCQlsb3cgPSBjdXJyX3ByY21fc2V0LT5kcGxsX3NwZWVkIC8gMjsKKwl9CisKKyNpZmRlZiBET1dOX1ZBUklBQkxFX0RQTEwKKwlpZiAodGFyZ2V0X3JhdGUgPiBoaWdoKQorCQlyZXR1cm4gaGlnaDsKKwllbHNlCisJCXJldHVybiB0YXJnZXRfcmF0ZTsKKyNlbHNlCisJaWYgKHRhcmdldF9yYXRlID4gbG93KQorCQlyZXR1cm4gaGlnaDsKKwllbHNlCisJCXJldHVybiBsb3c7CisjZW5kaWYKKworfQorCit1bnNpZ25lZCBsb25nIG9tYXAyX2RwbGxjb3JlX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIG9tYXAyeHh4X2Nsa19nZXRfY29yZV9yYXRlKGNsayk7Cit9CisKK2ludCBvbWFwMl9yZXByb2dyYW1fZHBsbGNvcmUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJdTMyIGN1cl9yYXRlLCBsb3csIG11bHQsIGRpdiwgdmFsaWRfcmF0ZSwgZG9uZV9yYXRlOworCXUzMiBieXBhc3MgPSAwOworCXN0cnVjdCBwcmNtX2NvbmZpZyB0bXBzZXQ7CisJY29uc3Qgc3RydWN0IGRwbGxfZGF0YSAqZGQ7CisKKwljdXJfcmF0ZSA9IG9tYXAyeHh4X2Nsa19nZXRfY29yZV9yYXRlKGRjbGspOworCW11bHQgPSBjbV9yZWFkX21vZF9yZWcoUExMX01PRCwgQ01fQ0xLU0VMMik7CisJbXVsdCAmPSBPTUFQMjRYWF9DT1JFX0NMS19TUkNfTUFTSzsKKworCWlmICgocmF0ZSA9PSAoY3VyX3JhdGUgLyAyKSkgJiYgKG11bHQgPT0gMikpIHsKKwkJb21hcDJ4eHhfc2RyY19yZXByb2dyYW0oQ09SRV9DTEtfU1JDX0RQTEwsIDEpOworCX0gZWxzZSBpZiAoKHJhdGUgPT0gKGN1cl9yYXRlICogMikpICYmIChtdWx0ID09IDEpKSB7CisJCW9tYXAyeHh4X3NkcmNfcmVwcm9ncmFtKENPUkVfQ0xLX1NSQ19EUExMX1gyLCAxKTsKKwl9IGVsc2UgaWYgKHJhdGUgIT0gY3VyX3JhdGUpIHsKKwkJdmFsaWRfcmF0ZSA9IG9tYXAyX2RwbGxjb3JlX3JvdW5kX3JhdGUocmF0ZSk7CisJCWlmICh2YWxpZF9yYXRlICE9IHJhdGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAobXVsdCA9PSAxKQorCQkJbG93ID0gY3Vycl9wcmNtX3NldC0+ZHBsbF9zcGVlZDsKKwkJZWxzZQorCQkJbG93ID0gY3Vycl9wcmNtX3NldC0+ZHBsbF9zcGVlZCAvIDI7CisKKwkJZGQgPSBjbGstPmRwbGxfZGF0YTsKKwkJaWYgKCFkZCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXRtcHNldC5jbV9jbGtzZWwxX3BsbCA9IF9fcmF3X3JlYWRsKGRkLT5tdWx0X2RpdjFfcmVnKTsKKwkJdG1wc2V0LmNtX2Nsa3NlbDFfcGxsICY9IH4oZGQtPm11bHRfbWFzayB8CisJCQkJCSAgIGRkLT5kaXYxX21hc2spOworCQlkaXYgPSAoKGN1cnJfcHJjbV9zZXQtPnh0YWxfc3BlZWQgLyAxMDAwMDAwKSAtIDEpOworCQl0bXBzZXQuY21fY2xrc2VsMl9wbGwgPSBjbV9yZWFkX21vZF9yZWcoUExMX01PRCwgQ01fQ0xLU0VMMik7CisJCXRtcHNldC5jbV9jbGtzZWwyX3BsbCAmPSB+T01BUDI0WFhfQ09SRV9DTEtfU1JDX01BU0s7CisJCWlmIChyYXRlID4gbG93KSB7CisJCQl0bXBzZXQuY21fY2xrc2VsMl9wbGwgfD0gQ09SRV9DTEtfU1JDX0RQTExfWDI7CisJCQltdWx0ID0gKChyYXRlIC8gMikgLyAxMDAwMDAwKTsKKwkJCWRvbmVfcmF0ZSA9IENPUkVfQ0xLX1NSQ19EUExMX1gyOworCQl9IGVsc2UgeworCQkJdG1wc2V0LmNtX2Nsa3NlbDJfcGxsIHw9IENPUkVfQ0xLX1NSQ19EUExMOworCQkJbXVsdCA9IChyYXRlIC8gMTAwMDAwMCk7CisJCQlkb25lX3JhdGUgPSBDT1JFX0NMS19TUkNfRFBMTDsKKwkJfQorCQl0bXBzZXQuY21fY2xrc2VsMV9wbGwgfD0gKGRpdiA8PCBfX2ZmcyhkZC0+bXVsdF9tYXNrKSk7CisJCXRtcHNldC5jbV9jbGtzZWwxX3BsbCB8PSAobXVsdCA8PCBfX2ZmcyhkZC0+ZGl2MV9tYXNrKSk7CisKKwkJLyogV29yc3QgY2FzZSAqLworCQl0bXBzZXQuYmFzZV9zZHJjX3JmciA9IFNEUkNfUkZSX0NUUkxfQllQQVNTOworCisJCWlmIChyYXRlID09IGN1cnJfcHJjbV9zZXQtPnh0YWxfc3BlZWQpCS8qIElmIGFza2luZyBmb3IgMS0xICovCisJCQlieXBhc3MgPSAxOworCisJCS8qIEZvciBvbWFwMnh4eF9zZHJjX2luaXRfcGFyYW1zKCkgKi8KKwkJb21hcDJ4eHhfc2RyY19yZXByb2dyYW0oQ09SRV9DTEtfU1JDX0RQTExfWDIsIDEpOworCisJCS8qIEZvcmNlIGRsbCBsb2NrIG1vZGUgKi8KKwkJb21hcDJfc2V0X3ByY20odG1wc2V0LmNtX2Nsa3NlbDFfcGxsLCB0bXBzZXQuYmFzZV9zZHJjX3JmciwKKwkJCSAgICAgICBieXBhc3MpOworCisJCS8qIEVycmF0YTogcmV0IGRsbCBlbnRyeSBzdGF0ZSAqLworCQlvbWFwMnh4eF9zZHJjX2luaXRfcGFyYW1zKG9tYXAyeHh4X3NkcmNfZGxsX2lzX3VubG9ja2VkKCkpOworCQlvbWFwMnh4eF9zZHJjX3JlcHJvZ3JhbShkb25lX3JhdGUsIDApOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIG9tYXAyX3RhYmxlX21wdV9yZWNhbGMgLSBqdXN0IHJldHVybiB0aGUgTVBVIHNwZWVkCisgKiBAY2xrOiB2aXJ0X3ByY21fc2V0IHN0cnVjdCBjbGsKKyAqCisgKiBTZXQgdmlydF9wcmNtX3NldCdzIHJhdGUgdG8gdGhlIG1wdV9zcGVlZCBmaWVsZCBvZiB0aGUgY3VycmVudCBQUkNNIHNldC4KKyAqLwordW5zaWduZWQgbG9uZyBvbWFwMl90YWJsZV9tcHVfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlyZXR1cm4gY3Vycl9wcmNtX3NldC0+bXB1X3NwZWVkOworfQorCisvKgorICogTG9vayBmb3IgYSByYXRlIGVxdWFsIG9yIGxlc3MgdGhhbiB0aGUgdGFyZ2V0IHJhdGUgZ2l2ZW4gYSBjb25maWd1cmF0aW9uIHNldC4KKyAqCisgKiBXaGF0J3Mgbm90IGVudGlyZWx5IGNsZWFyIGlzICJ3aGljaCIgZmllbGQgcmVwcmVzZW50cyB0aGUga2V5IGZpZWxkLgorICogU29tZSBtaWdodCBhcmd1ZSBMMy1ERFIsIG90aGVycyBBUk0sIG90aGVycyBJVkEuIFRoaXMgY29kZSBpcyBzaW1wbGUgYW5kCisgKiBqdXN0IHVzZXMgdGhlIEFSTSByYXRlcy4KKyAqLworbG9uZyBvbWFwMl9yb3VuZF90b190YWJsZV9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCWNvbnN0IHN0cnVjdCBwcmNtX2NvbmZpZyAqcHRyOworCWxvbmcgaGlnaGVzdF9yYXRlOworCWxvbmcgc3lzX2NrX3JhdGU7CisKKwlzeXNfY2tfcmF0ZSA9IGNsa19nZXRfcmF0ZShzY2xrKTsKKworCWhpZ2hlc3RfcmF0ZSA9IC1FSU5WQUw7CisKKwlmb3IgKHB0ciA9IHJhdGVfdGFibGU7IHB0ci0+bXB1X3NwZWVkOyBwdHIrKykgeworCQlpZiAoIShwdHItPmZsYWdzICYgY3B1X21hc2spKQorCQkJY29udGludWU7CisJCWlmIChwdHItPnh0YWxfc3BlZWQgIT0gc3lzX2NrX3JhdGUpCisJCQljb250aW51ZTsKKworCQloaWdoZXN0X3JhdGUgPSBwdHItPm1wdV9zcGVlZDsKKworCQkvKiBDYW4gY2hlY2sgb25seSBhZnRlciB4dGFsIGZyZXF1ZW5jeSBjaGVjayAqLworCQlpZiAocHRyLT5tcHVfc3BlZWQgPD0gcmF0ZSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gaGlnaGVzdF9yYXRlOworfQorCisvKiBTZXRzIGJhc2ljIGNsb2NrcyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHJhdGUgKi8KK2ludCBvbWFwMl9zZWxlY3RfdGFibGVfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1MzIgY3VyX3JhdGUsIGRvbmVfcmF0ZSwgYnlwYXNzID0gMCwgdG1wOworCWNvbnN0IHN0cnVjdCBwcmNtX2NvbmZpZyAqcHJjbTsKKwl1bnNpZ25lZCBsb25nIGZvdW5kX3NwZWVkID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWxvbmcgc3lzX2NrX3JhdGU7CisKKwlzeXNfY2tfcmF0ZSA9IGNsa19nZXRfcmF0ZShzY2xrKTsKKworCWZvciAocHJjbSA9IHJhdGVfdGFibGU7IHByY20tPm1wdV9zcGVlZDsgcHJjbSsrKSB7CisJCWlmICghKHByY20tPmZsYWdzICYgY3B1X21hc2spKQorCQkJY29udGludWU7CisKKwkJaWYgKHByY20tPnh0YWxfc3BlZWQgIT0gc3lzX2NrX3JhdGUpCisJCQljb250aW51ZTsKKworCQlpZiAocHJjbS0+bXB1X3NwZWVkIDw9IHJhdGUpIHsKKwkJCWZvdW5kX3NwZWVkID0gcHJjbS0+bXB1X3NwZWVkOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWZvdW5kX3NwZWVkKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkNvdWxkIG5vdCBzZXQgTVBVIHJhdGUgdG8gJWx1TUh6XG4iLAorCQkgICAgICAgcmF0ZSAvIDEwMDAwMDApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljdXJyX3ByY21fc2V0ID0gcHJjbTsKKwljdXJfcmF0ZSA9IG9tYXAyeHh4X2Nsa19nZXRfY29yZV9yYXRlKGRjbGspOworCisJaWYgKHByY20tPmRwbGxfc3BlZWQgPT0gY3VyX3JhdGUgLyAyKSB7CisJCW9tYXAyeHh4X3NkcmNfcmVwcm9ncmFtKENPUkVfQ0xLX1NSQ19EUExMLCAxKTsKKwl9IGVsc2UgaWYgKHByY20tPmRwbGxfc3BlZWQgPT0gY3VyX3JhdGUgKiAyKSB7CisJCW9tYXAyeHh4X3NkcmNfcmVwcm9ncmFtKENPUkVfQ0xLX1NSQ19EUExMX1gyLCAxKTsKKwl9IGVsc2UgaWYgKHByY20tPmRwbGxfc3BlZWQgIT0gY3VyX3JhdGUpIHsKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJCWlmIChwcmNtLT5kcGxsX3NwZWVkID09IHByY20tPnh0YWxfc3BlZWQpCisJCQlieXBhc3MgPSAxOworCisJCWlmICgocHJjbS0+Y21fY2xrc2VsMl9wbGwgJiBPTUFQMjRYWF9DT1JFX0NMS19TUkNfTUFTSykgPT0KKwkJICAgIENPUkVfQ0xLX1NSQ19EUExMX1gyKQorCQkJZG9uZV9yYXRlID0gQ09SRV9DTEtfU1JDX0RQTExfWDI7CisJCWVsc2UKKwkJCWRvbmVfcmF0ZSA9IENPUkVfQ0xLX1NSQ19EUExMOworCisJCS8qIE1QVSBkaXZpZGVyICovCisJCWNtX3dyaXRlX21vZF9yZWcocHJjbS0+Y21fY2xrc2VsX21wdSwgTVBVX01PRCwgQ01fQ0xLU0VMKTsKKworCQkvKiBkc3AgKyBpdmExIGRpdigyNDIwKSwgaXZhMi4xKDI0MzApICovCisJCWNtX3dyaXRlX21vZF9yZWcocHJjbS0+Y21fY2xrc2VsX2RzcCwKKwkJCQkgT01BUDI0WFhfRFNQX01PRCwgQ01fQ0xLU0VMKTsKKworCQljbV93cml0ZV9tb2RfcmVnKHByY20tPmNtX2Nsa3NlbF9nZngsIEdGWF9NT0QsIENNX0NMS1NFTCk7CisKKwkJLyogTWFqb3Igc3Vic3lzdGVtIGRpdmlkZXJzICovCisJCXRtcCA9IGNtX3JlYWRfbW9kX3JlZyhDT1JFX01PRCwgQ01fQ0xLU0VMMSkgJiBPTUFQMjRYWF9DTEtTRUxfRFNTMl9NQVNLOworCQljbV93cml0ZV9tb2RfcmVnKHByY20tPmNtX2Nsa3NlbDFfY29yZSB8IHRtcCwgQ09SRV9NT0QsCisJCQkJIENNX0NMS1NFTDEpOworCisJCWlmIChjcHVfaXNfb21hcDI0MzAoKSkKKwkJCWNtX3dyaXRlX21vZF9yZWcocHJjbS0+Y21fY2xrc2VsX21kbSwKKwkJCQkJIE9NQVAyNDMwX01ETV9NT0QsIENNX0NMS1NFTCk7CisKKwkJLyogeDIgdG8gZW50ZXIgb21hcDJ4eHhfc2RyY19pbml0X3BhcmFtcygpICovCisJCW9tYXAyeHh4X3NkcmNfcmVwcm9ncmFtKENPUkVfQ0xLX1NSQ19EUExMX1gyLCAxKTsKKworCQlvbWFwMl9zZXRfcHJjbShwcmNtLT5jbV9jbGtzZWwxX3BsbCwgcHJjbS0+YmFzZV9zZHJjX3JmciwKKwkJCSAgICAgICBieXBhc3MpOworCisJCW9tYXAyeHh4X3NkcmNfaW5pdF9wYXJhbXMob21hcDJ4eHhfc2RyY19kbGxfaXNfdW5sb2NrZWQoKSk7CisJCW9tYXAyeHh4X3NkcmNfcmVwcm9ncmFtKGRvbmVfcmF0ZSwgMCk7CisKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0NQVV9GUkVRCisvKgorICogV2FsayBQUkNNIHJhdGUgdGFibGUgYW5kIGZpbGxvdXQgY3B1ZnJlcSBmcmVxX3RhYmxlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgZnJlcV90YWJsZVtBUlJBWV9TSVpFKHJhdGVfdGFibGUpXTsKKwordm9pZCBvbWFwMl9jbGtfaW5pdF9jcHVmcmVxX3RhYmxlKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqKnRhYmxlKQoreworCXN0cnVjdCBwcmNtX2NvbmZpZyAqcHJjbTsKKwlpbnQgaSA9IDA7CisKKwlmb3IgKHByY20gPSByYXRlX3RhYmxlOyBwcmNtLT5tcHVfc3BlZWQ7IHByY20rKykgeworCQlpZiAoIShwcmNtLT5mbGFncyAmIGNwdV9tYXNrKSkKKwkJCWNvbnRpbnVlOworCQlpZiAocHJjbS0+eHRhbF9zcGVlZCAhPSBzeXNfY2sucmF0ZSkKKwkJCWNvbnRpbnVlOworCisJCS8qIGRvbid0IHB1dCBieXBhc3MgcmF0ZXMgaW4gdGFibGUgKi8KKwkJaWYgKHByY20tPmRwbGxfc3BlZWQgPT0gcHJjbS0+eHRhbF9zcGVlZCkKKwkJCWNvbnRpbnVlOworCisJCWZyZXFfdGFibGVbaV0uaW5kZXggPSBpOworCQlmcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeSA9IHByY20tPm1wdV9zcGVlZCAvIDEwMDA7CisJCWkrKzsKKwl9CisKKwlpZiAoaSA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBmcmVxdWVuY3kgIgorCQkgICAgICAgInRhYmxlXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlmcmVxX3RhYmxlW2ldLmluZGV4ID0gaTsKKwlmcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EOworCisJKnRhYmxlID0gJmZyZXFfdGFibGVbMF07Cit9CisjZW5kaWYKKworc3RydWN0IGNsa19mdW5jdGlvbnMgb21hcDJfY2xrX2Z1bmN0aW9ucyA9IHsKKwkuY2xrX2VuYWJsZQkJPSBvbWFwMl9jbGtfZW5hYmxlLAorCS5jbGtfZGlzYWJsZQkJPSBvbWFwMl9jbGtfZGlzYWJsZSwKKwkuY2xrX3JvdW5kX3JhdGUJCT0gb21hcDJfY2xrX3JvdW5kX3JhdGUsCisJLmNsa19zZXRfcmF0ZQkJPSBvbWFwMl9jbGtfc2V0X3JhdGUsCisJLmNsa19zZXRfcGFyZW50CQk9IG9tYXAyX2Nsa19zZXRfcGFyZW50LAorCS5jbGtfZGlzYWJsZV91bnVzZWQJPSBvbWFwMl9jbGtfZGlzYWJsZV91bnVzZWQsCisjaWZkZWYJQ09ORklHX0NQVV9GUkVRCisJLmNsa19pbml0X2NwdWZyZXFfdGFibGUJPSBvbWFwMl9jbGtfaW5pdF9jcHVmcmVxX3RhYmxlLAorI2VuZGlmCit9OworCitzdGF0aWMgdTMyIG9tYXAyX2dldF9hcGxsX2Nsa2luKHZvaWQpCit7CisJdTMyIGFwbGxzLCBzcmF0ZSA9IDA7CisKKwlhcGxscyA9IGNtX3JlYWRfbW9kX3JlZyhQTExfTU9ELCBDTV9DTEtTRUwxKTsKKwlhcGxscyAmPSBPTUFQMjRYWF9BUExMU19DTEtJTl9NQVNLOworCWFwbGxzID4+PSBPTUFQMjRYWF9BUExMU19DTEtJTl9TSElGVDsKKworCWlmIChhcGxscyA9PSBBUExMU19DTEtJTl8xOV8yTUhaKQorCQlzcmF0ZSA9IDE5MjAwMDAwOworCWVsc2UgaWYgKGFwbGxzID09IEFQTExTX0NMS0lOXzEzTUhaKQorCQlzcmF0ZSA9IDEzMDAwMDAwOworCWVsc2UgaWYgKGFwbGxzID09IEFQTExTX0NMS0lOXzEyTUhaKQorCQlzcmF0ZSA9IDEyMDAwMDAwOworCisJcmV0dXJuIHNyYXRlOworfQorCitzdGF0aWMgdTMyIG9tYXAyX2dldF9zeXNjbGtkaXYodm9pZCkKK3sKKwl1MzIgZGl2OworCisJZGl2ID0gX19yYXdfcmVhZGwocHJjbV9jbGtzcmNfY3RybCk7CisJZGl2ICY9IE9NQVBfU1lTQ0xLRElWX01BU0s7CisJZGl2ID4+PSBPTUFQX1NZU0NMS0RJVl9TSElGVDsKKworCXJldHVybiBkaXY7Cit9CisKK3Vuc2lnbmVkIGxvbmcgb21hcDJfb3NjX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiBvbWFwMl9nZXRfYXBsbF9jbGtpbigpICogb21hcDJfZ2V0X3N5c2Nsa2RpdigpOworfQorCit1bnNpZ25lZCBsb25nIG9tYXAyX3N5c19jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGUgLyBvbWFwMl9nZXRfc3lzY2xrZGl2KCk7Cit9CisKKy8qCisgKiBTZXQgY2xvY2tzIGZvciBieXBhc3MgbW9kZSBmb3IgcmVib290IHRvIHdvcmsuCisgKi8KK3ZvaWQgb21hcDJfY2xrX3ByZXBhcmVfZm9yX3JlYm9vdCh2b2lkKQoreworCXUzMiByYXRlOworCisJaWYgKHZjbGsgPT0gTlVMTCB8fCBzY2xrID09IE5VTEwpCisJCXJldHVybjsKKworCXJhdGUgPSBjbGtfZ2V0X3JhdGUoc2Nsayk7CisJY2xrX3NldF9yYXRlKHZjbGssIHJhdGUpOworfQorCisvKgorICogU3dpdGNoIHRoZSBNUFUgcmF0ZSBpZiBzcGVjaWZpZWQgb24gY21kbGluZS4KKyAqIFdlIGNhbm5vdCBkbyB0aGlzIGVhcmx5IHVudGlsIGNtZGxpbmUgaXMgcGFyc2VkLgorICovCitzdGF0aWMgaW50IF9faW5pdCBvbWFwMl9jbGtfYXJjaF9pbml0KHZvaWQpCit7CisJc3RydWN0IGNsayAqdmlydF9wcmNtX3NldCwgKnN5c19jaywgKmRwbGxfY2ssICptcHVfY2s7CisJdW5zaWduZWQgbG9uZyBzeXNfY2tfcmF0ZTsKKworCWlmICghbXB1cmF0ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2aXJ0X3ByY21fc2V0ID0gY2xrX2dldChOVUxMLCAidmlydF9wcmNtX3NldCIpOworCXN5c19jayA9IGNsa19nZXQoTlVMTCwgInN5c19jayIpOworCWRwbGxfY2sgPSBjbGtfZ2V0KE5VTEwsICJkcGxsX2NrIik7CisJbXB1X2NrID0gY2xrX2dldChOVUxMLCAibXB1X2NrIik7CisKKwlpZiAoY2xrX3NldF9yYXRlKHZpcnRfcHJjbV9zZXQsIG1wdXJhdGUpKQorCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBmaW5kIG1hdGNoaW5nIE1QVSByYXRlXG4iKTsKKworCXJlY2FsY3VsYXRlX3Jvb3RfY2xvY2tzKCk7CisKKwlzeXNfY2tfcmF0ZSA9IGNsa19nZXRfcmF0ZShzeXNfY2spOworCisJcHJfaW5mbygiU3dpdGNoZWQgdG8gbmV3IGNsb2NraW5nIHJhdGUgKENyeXN0YWwvRFBMTC9NUFUpOiAiCisJCSIlbGQuJTAxbGQvJWxkLyVsZCBNSHpcbiIsCisJCShzeXNfY2tfcmF0ZSAvIDEwMDAwMDApLCAoc3lzX2NrX3JhdGUgLyAxMDAwMDApICUgMTAsCisJCShjbGtfZ2V0X3JhdGUoZHBsbF9jaykgLyAxMDAwMDAwKSwKKwkJKGNsa19nZXRfcmF0ZShtcHVfY2spIC8gMTAwMDAwMCkpOworCisJcmV0dXJuIDA7Cit9CithcmNoX2luaXRjYWxsKG9tYXAyX2Nsa19hcmNoX2luaXQpOworCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2syeHh4LmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMnh4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNWVmZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMnh4eC5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBPTUFQMiBjbG9jayBmdW5jdGlvbiBwcm90b3R5cGVzIGFuZCBtYWNyb3MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDkgTm9raWEgQ29ycG9yYXRpb24KKyAqLworCisjaWZuZGVmIF9fQVJDSF9BUk1fTUFDSF9PTUFQMl9DTE9DS18yNFhYX0gKKyNkZWZpbmUgX19BUkNIX0FSTV9NQUNIX09NQVAyX0NMT0NLXzI0WFhfSAorCit1bnNpZ25lZCBsb25nIG9tYXAyX3RhYmxlX21wdV9yZWNhbGMoc3RydWN0IGNsayAqY2xrKTsKK2ludCBvbWFwMl9zZWxlY3RfdGFibGVfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7Citsb25nIG9tYXAyX3JvdW5kX3RvX3RhYmxlX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOwordW5zaWduZWQgbG9uZyBvbWFwMl9zeXNfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspOwordW5zaWduZWQgbG9uZyBvbWFwMl9vc2NfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspOwordW5zaWduZWQgbG9uZyBvbWFwMl9zeXNfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspOwordW5zaWduZWQgbG9uZyBvbWFwMl9kcGxsY29yZV9yZWNhbGMoc3RydWN0IGNsayAqY2xrKTsKK2ludCBvbWFwMl9yZXByb2dyYW1fZHBsbGNvcmUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOwordW5zaWduZWQgbG9uZyBvbWFwMnh4eF9jbGtfZ2V0X2NvcmVfcmF0ZShzdHJ1Y3QgY2xrICpjbGspOworCisvKiBSRVZJU0lUOiBUaGVzZSBzaG91bGQgYmUgc2V0IGR5bmFtaWNhbGx5IGZvciBDT05GSUdfTVVMVElfT01BUDIgKi8KKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjQyMAorI2RlZmluZSBPTUFQX0NNX1JFR0FERFIJCQlPTUFQMjQyMF9DTV9SRUdBRERSCisjZGVmaW5lIE9NQVAyNFhYX1BSQ01fQ0xLT1VUX0NUUkwJT01BUDI0MjBfUFJDTV9DTEtPVVRfQ1RSTAorI2RlZmluZSBPTUFQMjRYWF9QUkNNX0NMS0VNVUxfQ1RSTAlPTUFQMjQyMF9QUkNNX0NMS0VNVUxfQ1RSTAorI2Vsc2UKKyNkZWZpbmUgT01BUF9DTV9SRUdBRERSCQkJT01BUDI0MzBfQ01fUkVHQUREUgorI2RlZmluZSBPTUFQMjRYWF9QUkNNX0NMS09VVF9DVFJMCU9NQVAyNDMwX1BSQ01fQ0xLT1VUX0NUUkwKKyNkZWZpbmUgT01BUDI0WFhfUFJDTV9DTEtFTVVMX0NUUkwJT01BUDI0MzBfUFJDTV9DTEtFTVVMX0NUUkwKKyNlbmRpZgorCitleHRlcm4gdm9pZCBfX2lvbWVtICpwcmNtX2Nsa3NyY19jdHJsOworCitleHRlcm4gc3RydWN0IGNsayAqZGNsazsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBjbGtvcHMgY2xrb3BzX29tYXAyNDMwX2kyY2hzX3dhaXQ7CitleHRlcm4gY29uc3Qgc3RydWN0IGNsa29wcyBjbGtvcHNfb3NjY2s7CitleHRlcm4gY29uc3Qgc3RydWN0IGNsa29wcyBjbGtvcHNfYXBsbDk2OworZXh0ZXJuIGNvbnN0IHN0cnVjdCBjbGtvcHMgY2xrb3BzX2FwbGw1NDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMnh4eF9kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMnh4eF9kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdkYzdjZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2syeHh4X2RhdGEuYwpAQCAtMCwwICsxLDIzMDkgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazJ4eHhfZGF0YS5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNS0yMDA5IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDkgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiAgQ29udGFjdHM6CisgKiAgUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICogIFBhdWwgV2FsbXNsZXkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKworI2luY2x1ZGUgPHBsYXQvY2xrZGV2X29tYXAuaD4KKworI2luY2x1ZGUgImNsb2NrLmgiCisjaW5jbHVkZSAiY2xvY2syeHh4LmgiCisjaW5jbHVkZSAib3BwMnh4eC5oIgorI2luY2x1ZGUgInBybS5oIgorI2luY2x1ZGUgImNtLmgiCisjaW5jbHVkZSAicHJtLXJlZ2JpdHMtMjR4eC5oIgorI2luY2x1ZGUgImNtLXJlZ2JpdHMtMjR4eC5oIgorI2luY2x1ZGUgInNkcmMuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAyNHh4IGNsb2NrIHRyZWUuCisgKgorICogTk9URTpJbiBtYW55IGNhc2VzIGhlcmUgd2UgYXJlIGFzc2lnbmluZyBhICdkZWZhdWx0JyBwYXJlbnQuCUluIG1hbnkKKyAqCWNhc2VzIHRoZSBwYXJlbnQgaXMgc2VsZWN0YWJsZS4JVGhlIGdldC9zZXQgcGFyZW50IGNhbGxzIHdpbGwgYWxzbworICoJc3dpdGNoIHNvdXJjZXMuCisgKgorICoJTWFueSBzb21lIGNsb2NrcyBzYXkgYWx3YXlzX2VuYWJsZWQsIGJ1dCB0aGV5IGNhbiBiZSBhdXRvIGlkbGVkIGZvcgorICoJcG93ZXIgc2F2aW5ncy4gVGhleSB3aWxsIGFsd2F5cyBiZSBhdmFpbGFibGUgdXBvbiBjbG9jayByZXF1ZXN0LgorICoKKyAqCVNldmVyYWwgc291cmNlcyBhcmUgZ2l2ZW4gaW5pdGlhbCByYXRlcyB3aGljaCBtYXkgYmUgd3JvbmcsIHRoaXMgd2lsbAorICoJYmUgZml4ZWQgdXAgaW4gdGhlIGluaXQgZnVuYy4KKyAqCisgKglUaGluZ3MgYXJlIGJyb2FkbHkgc2VwYXJhdGVkIGJlbG93IGJ5IGNsb2NrIGRvbWFpbnMuIEl0IGlzCisgKglub3Rld29ydGh5IHRoYXQgbW9zdCBwZXJpZmVyYWxzIGhhdmUgZGVwZW5kZW5jaWVzIG9uIG11bHRpcGxlIGNsb2NrCisgKglkb21haW5zLiBNYW55IGdldCB0aGVpciBpbnRlcmZhY2UgY2xvY2tzIGZyb20gdGhlIEw0IGRvbWFpbiwgYnV0IGdldAorICoJZnVuY3Rpb25hbCBjbG9ja3MgZnJvbSBmaXhlZCBzb3VyY2VzIG9yIG90aGVyIGNvcmUgZG9tYWluIGRlcml2ZWQKKyAqCWNsb2Nrcy4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEJhc2UgZXh0ZXJuYWwgaW5wdXQgY2xvY2tzICovCitzdGF0aWMgc3RydWN0IGNsayBmdW5jXzMya19jayA9IHsKKwkubmFtZQkJPSAiZnVuY18zMmtfY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yYXRlCQk9IDMyMDAwLAorCS5mbGFncwkJPSBSQVRFX0ZJWEVELAorCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgc2VjdXJlXzMya19jayA9IHsKKwkubmFtZQkJPSAic2VjdXJlXzMya19jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJhdGUJCT0gMzI3NjgsCisJLmZsYWdzCQk9IFJBVEVfRklYRUQsCisJLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCit9OworCisvKiBUeXBpY2FsIDEyLzEzTUh6IGluIHN0YW5kYWxvbmUgbW9kZSwgd2lsbCBiZSAyNk1oeiBpbiBjaGFzc2lzIG1vZGUgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIG9zY19jayA9IHsJCS8qICgqMTIsICoxMywgMTkuMiwgKjI2LCAzOC40KU1IeiAqLworCS5uYW1lCQk9ICJvc2NfY2siLAorCS5vcHMJCT0gJmNsa29wc19vc2NjaywKKwkuY2xrZG1fbmFtZQk9ICJ3a3VwX2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZvbWFwMl9vc2NfY2xrX3JlY2FsYywKK307CisKKy8qIFdpdGhvdXQgbW9kZW0gbGlrZWx5IDEyTUh6LCB3aXRoIG1vZGVtIGxpa2VseSAxM01IeiAqLworc3RhdGljIHN0cnVjdCBjbGsgc3lzX2NrID0gewkJLyogKCoxMiwgKjEzLCAxOS4yLCAyNiwgMzguNClNSHogKi8KKwkubmFtZQkJPSAic3lzX2NrIiwJCS8qIH4gcmVmX2NsayBhbHNvICovCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmb3NjX2NrLAorCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAorCS5yZWNhbGMJCT0gJm9tYXAyX3N5c19jbGtfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgYWx0X2NrID0gewkJLyogVHlwaWNhbCA1NE0gb3IgNDhNLCBtYXkgbm90IGV4aXN0ICovCisJLm5hbWUJCT0gImFsdF9jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJhdGUJCT0gNTQwMDAwMDAsCisJLmZsYWdzCQk9IFJBVEVfRklYRUQsCisJLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCit9OworCisvKgorICogQW5hbG9nIGRvbWFpbiByb290IHNvdXJjZSBjbG9ja3MKKyAqLworCisvKiBkcGxsX2NrLCBpcyBicm9rZW4gb3V0IGluIHRvIHNwZWNpYWwgY2FzZXMgdGhyb3VnaCBjbGtzZWwgKi8KKy8qIFJFVklTSVQ6IFJhdGUgY2hhbmdlcyBvbiBkcGxsX2NrIHRyaWdnZXIgYSBmdWxsIHNldCBjaGFuZ2UuCS4uLgorICogZGVhbCB3aXRoIHRoaXMKKyAqLworCitzdGF0aWMgc3RydWN0IGRwbGxfZGF0YSBkcGxsX2RkID0geworCS5tdWx0X2RpdjFfcmVnCQk9IE9NQVBfQ01fUkVHQUREUihQTExfTU9ELCBDTV9DTEtTRUwxKSwKKwkubXVsdF9tYXNrCQk9IE9NQVAyNFhYX0RQTExfTVVMVF9NQVNLLAorCS5kaXYxX21hc2sJCT0gT01BUDI0WFhfRFBMTF9ESVZfTUFTSywKKwkuY2xrX2J5cGFzcwkJPSAmc3lzX2NrLAorCS5jbGtfcmVmCQk9ICZzeXNfY2ssCisJLmNvbnRyb2xfcmVnCQk9IE9NQVBfQ01fUkVHQUREUihQTExfTU9ELCBDTV9DTEtFTiksCisJLmVuYWJsZV9tYXNrCQk9IE9NQVAyNFhYX0VOX0RQTExfTUFTSywKKwkubWF4X211bHRpcGxpZXIJCT0gMTAyNCwKKwkubWluX2RpdmlkZXIJCT0gMSwKKwkubWF4X2RpdmlkZXIJCT0gMTYsCisJLnJhdGVfdG9sZXJhbmNlCQk9IERFRkFVTFRfRFBMTF9SQVRFX1RPTEVSQU5DRQorfTsKKworLyoKKyAqIFhYWCBDYW5ub3QgYWRkIHJvdW5kX3JhdGUgaGVyZSB5ZXQsIGFzIHRoaXMgaXMgc3RpbGwgYSBjb21wb3NpdGUgY2xvY2ssCisgKiBub3QganVzdCBhIERQTEwKKyAqLworc3RhdGljIHN0cnVjdCBjbGsgZHBsbF9jayA9IHsKKwkubmFtZQkJPSAiZHBsbF9jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmc3lzX2NrLAkJLyogQ2FuIGJlIGZ1bmNfMzJrIGFsc28gKi8KKwkuZHBsbF9kYXRhCT0gJmRwbGxfZGQsCisJLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCisJLnJlY2FsYwkJPSAmb21hcDJfZHBsbGNvcmVfcmVjYWxjLAorCS5zZXRfcmF0ZQk9ICZvbWFwMl9yZXByb2dyYW1fZHBsbGNvcmUsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBhcGxsOTZfY2sgPSB7CisJLm5hbWUJCT0gImFwbGw5Nl9jayIsCisJLm9wcwkJPSAmY2xrb3BzX2FwbGw5NiwKKwkucGFyZW50CQk9ICZzeXNfY2ssCisJLnJhdGUJCT0gOTYwMDAwMDAsCisJLmZsYWdzCQk9IFJBVEVfRklYRUQgfCBFTkFCTEVfT05fSU5JVCwKKwkuY2xrZG1fbmFtZQk9ICJ3a3VwX2Nsa2RtIiwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihQTExfTU9ELCBDTV9DTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl85Nk1fUExMX1NISUZULAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgYXBsbDU0X2NrID0geworCS5uYW1lCQk9ICJhcGxsNTRfY2siLAorCS5vcHMJCT0gJmNsa29wc19hcGxsNTQsCisJLnBhcmVudAkJPSAmc3lzX2NrLAorCS5yYXRlCQk9IDU0MDAwMDAwLAorCS5mbGFncwkJPSBSQVRFX0ZJWEVEIHwgRU5BQkxFX09OX0lOSVQsCisJLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fNTRNX1BMTF9TSElGVCwKK307CisKKy8qCisgKiBQUkNNIGRpZ2l0YWwgYmFzZSBzb3VyY2VzCisgKi8KKworLyogZnVuY181NG1fY2sgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBmdW5jXzU0bV9hcGxsNTRfcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gMCwgLmZsYWdzID0gUkFURV9JTl8yNFhYIHwgREVGQVVMVF9SQVRFIH0sCisJeyAuZGl2ID0gMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBmdW5jXzU0bV9hbHRfcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8yNFhYIHwgREVGQVVMVF9SQVRFIH0sCisJeyAuZGl2ID0gMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgZnVuY181NG1fY2xrc2VsW10gPSB7CisJeyAucGFyZW50ID0gJmFwbGw1NF9jaywgLnJhdGVzID0gZnVuY181NG1fYXBsbDU0X3JhdGVzLCB9LAorCXsgLnBhcmVudCA9ICZhbHRfY2ssCS5yYXRlcyA9IGZ1bmNfNTRtX2FsdF9yYXRlcywgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBmdW5jXzU0bV9jayA9IHsKKwkubmFtZQkJPSAiZnVuY181NG1fY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5wYXJlbnQJCT0gJmFwbGw1NF9jaywJLyogY2FuIGFsc28gYmUgYWx0X2NsayAqLworCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQ0xLU0VMMSksCisJLmNsa3NlbF9tYXNrCT0gT01BUDI0WFhfNTRNX1NPVVJDRSwKKwkuY2xrc2VsCQk9IGZ1bmNfNTRtX2Nsa3NlbCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgY29yZV9jayA9IHsKKwkubmFtZQkJPSAiY29yZV9jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmZHBsbF9jaywJCS8qIGNhbiBhbHNvIGJlIDMyayAqLworCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCisvKiBmdW5jXzk2bV9jayAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBmdW5jXzk2bV9hcGxsOTZfcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gMCwgLmZsYWdzID0gUkFURV9JTl8yNFhYIHwgREVGQVVMVF9SQVRFIH0sCisJeyAuZGl2ID0gMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBmdW5jXzk2bV9hbHRfcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8yNDNYIHwgREVGQVVMVF9SQVRFIH0sCisJeyAuZGl2ID0gMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgZnVuY185Nm1fY2xrc2VsW10gPSB7CisJeyAucGFyZW50ID0gJmFwbGw5Nl9jaywJLnJhdGVzID0gZnVuY185Nm1fYXBsbDk2X3JhdGVzIH0sCisJeyAucGFyZW50ID0gJmFsdF9jaywJLnJhdGVzID0gZnVuY185Nm1fYWx0X3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9Cit9OworCisvKiBUaGUgcGFyZW50IG9mIHRoaXMgY2xvY2sgaXMgbm90IHNlbGVjdGFibGUgb24gMjQyMC4gKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIGZ1bmNfOTZtX2NrID0geworCS5uYW1lCQk9ICJmdW5jXzk2bV9jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmYXBsbDk2X2NrLAorCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQ0xLU0VMMSksCisJLmNsa3NlbF9tYXNrCT0gT01BUDI0MzBfOTZNX1NPVVJDRSwKKwkuY2xrc2VsCQk9IGZ1bmNfOTZtX2Nsa3NlbCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9yb3VuZF9yYXRlLAorCS5zZXRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfc2V0X3JhdGUKK307CisKKy8qIGZ1bmNfNDhtX2NrICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgZnVuY180OG1fYXBsbDk2X3JhdGVzW10gPSB7CisJeyAuZGl2ID0gMiwgLnZhbCA9IDAsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB8IERFRkFVTFRfUkFURSB9LAorCXsgLmRpdiA9IDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgZnVuY180OG1fYWx0X3JhdGVzW10gPSB7CisJeyAuZGl2ID0gMSwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB8IERFRkFVTFRfUkFURSB9LAorCXsgLmRpdiA9IDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGZ1bmNfNDhtX2Nsa3NlbFtdID0geworCXsgLnBhcmVudCA9ICZhcGxsOTZfY2ssCS5yYXRlcyA9IGZ1bmNfNDhtX2FwbGw5Nl9yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZhbHRfY2ssIC5yYXRlcyA9IGZ1bmNfNDhtX2FsdF9yYXRlcyB9LAorCXsgLnBhcmVudCA9IE5VTEwgfQorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZnVuY180OG1fY2sgPSB7CisJLm5hbWUJCT0gImZ1bmNfNDhtX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucGFyZW50CQk9ICZhcGxsOTZfY2ssCSAvKiA5Nk0gb3IgQWx0ICovCisJLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihQTExfTU9ELCBDTV9DTEtTRUwxKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMjRYWF80OE1fU09VUkNFLAorCS5jbGtzZWwJCT0gZnVuY180OG1fY2xrc2VsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZQorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZnVuY18xMm1fY2sgPSB7CisJLm5hbWUJCT0gImZ1bmNfMTJtX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucGFyZW50CQk9ICZmdW5jXzQ4bV9jaywKKwkuZml4ZWRfZGl2CT0gNCwKKwkuY2xrZG1fbmFtZQk9ICJ3a3VwX2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZvbWFwMl9maXhlZF9kaXZpc29yX3JlY2FsYywKK307CisKKy8qIFNlY3VyZSB0aW1lciwgb25seSBhdmFpbGFibGUgaW4gc2VjdXJlIG1vZGUgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIHdkdDFfb3NjX2NrID0geworCS5uYW1lCQk9ICJja193ZHQxX29zYyIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsIC8qIFJNSzogbWlzc2luZz8gKi8KKwkucGFyZW50CQk9ICZvc2NfY2ssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKKy8qCisgKiBUaGUgY29tbW9uX2Nsa291dCogY2xrc2VsX3JhdGUgc3RydWN0cyBhcmUgY29tbW9uIHRvCisgKiBzeXNfY2xrb3V0LCBzeXNfY2xrb3V0X3NyYywgc3lzX2Nsa291dDIsIGFuZCBzeXNfY2xrb3V0Ml9zcmMuCisgKiBzeXNfY2xrb3V0Ml8qIGFyZSAyNDIwLW9ubHksIHNvIHRoZQorICogY2xrc2VsX3JhdGUgZmxhZ3MgZmllbGRzIGFyZSBpbmFjY3VyYXRlIGZvciB0aG9zZSBjbG9ja3MuIFRoaXMgaXMKKyAqIGhhcm1sZXNzIHNpbmNlIGFjY2VzcyB0byB0aG9zZSBjbG9ja3MgYXJlIGdhdGVkIGJ5IHRoZSBzdHJ1Y3QgY2xrCisgKiBmbGFncyBmaWVsZHMsIHdoaWNoIG1hcmsgdGhlbSBhcyAyNDIwLW9ubHkuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgY29tbW9uX2Nsa291dF9zcmNfY29yZV9yYXRlc1tdID0geworCXsgLmRpdiA9IDEsIC52YWwgPSAwLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfCBERUZBVUxUX1JBVEUgfSwKKwl7IC5kaXYgPSAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgY29tbW9uX2Nsa291dF9zcmNfc3lzX3JhdGVzW10gPSB7CisJeyAuZGl2ID0gMSwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB8IERFRkFVTFRfUkFURSB9LAorCXsgLmRpdiA9IDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBjb21tb25fY2xrb3V0X3NyY185Nm1fcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gMiwgLmZsYWdzID0gUkFURV9JTl8yNFhYIHwgREVGQVVMVF9SQVRFIH0sCisJeyAuZGl2ID0gMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGNvbW1vbl9jbGtvdXRfc3JjXzU0bV9yYXRlc1tdID0geworCXsgLmRpdiA9IDEsIC52YWwgPSAzLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfCBERUZBVUxUX1JBVEUgfSwKKwl7IC5kaXYgPSAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGNvbW1vbl9jbGtvdXRfc3JjX2Nsa3NlbFtdID0geworCXsgLnBhcmVudCA9ICZjb3JlX2NrLAkgIC5yYXRlcyA9IGNvbW1vbl9jbGtvdXRfc3JjX2NvcmVfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmc3lzX2NrLAkgIC5yYXRlcyA9IGNvbW1vbl9jbGtvdXRfc3JjX3N5c19yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZmdW5jXzk2bV9jaywgLnJhdGVzID0gY29tbW9uX2Nsa291dF9zcmNfOTZtX3JhdGVzIH0sCisJeyAucGFyZW50ID0gJmZ1bmNfNTRtX2NrLCAucmF0ZXMgPSBjb21tb25fY2xrb3V0X3NyY181NG1fcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHN5c19jbGtvdXRfc3JjID0geworCS5uYW1lCQk9ICJzeXNfY2xrb3V0X3NyYyIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLnBhcmVudAkJPSAmZnVuY181NG1fY2ssCisJLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQMjRYWF9QUkNNX0NMS09VVF9DVFJMLAorCS5lbmFibGVfYml0CT0gT01BUDI0WFhfQ0xLT1VUX0VOX1NISUZULAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQMjRYWF9QUkNNX0NMS09VVF9DVFJMLAorCS5jbGtzZWxfbWFzawk9IE9NQVAyNFhYX0NMS09VVF9TT1VSQ0VfTUFTSywKKwkuY2xrc2VsCQk9IGNvbW1vbl9jbGtvdXRfc3JjX2Nsa3NlbCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9yb3VuZF9yYXRlLAorCS5zZXRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfc2V0X3JhdGUKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgY29tbW9uX2Nsa291dF9yYXRlc1tdID0geworCXsgLmRpdiA9IDEsIC52YWwgPSAwLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfCBERUZBVUxUX1JBVEUgfSwKKwl7IC5kaXYgPSAyLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8yNFhYIH0sCisJeyAuZGl2ID0gNCwgLnZhbCA9IDIsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB9LAorCXsgLmRpdiA9IDgsIC52YWwgPSAzLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfSwKKwl7IC5kaXYgPSAxNiwgLnZhbCA9IDQsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB9LAorCXsgLmRpdiA9IDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIHN5c19jbGtvdXRfY2xrc2VsW10gPSB7CisJeyAucGFyZW50ID0gJnN5c19jbGtvdXRfc3JjLCAucmF0ZXMgPSBjb21tb25fY2xrb3V0X3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IGNsayBzeXNfY2xrb3V0ID0geworCS5uYW1lCQk9ICJzeXNfY2xrb3V0IiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucGFyZW50CQk9ICZzeXNfY2xrb3V0X3NyYywKKwkuY2xrZG1fbmFtZQk9ICJ3a3VwX2Nsa2RtIiwKKwkuY2xrc2VsX3JlZwk9IE9NQVAyNFhYX1BSQ01fQ0xLT1VUX0NUUkwsCisJLmNsa3NlbF9tYXNrCT0gT01BUDI0WFhfQ0xLT1VUX0RJVl9NQVNLLAorCS5jbGtzZWwJCT0gc3lzX2Nsa291dF9jbGtzZWwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlCit9OworCisvKiBJbiAyNDMwLCBuZXcgaW4gMjQyMCBFUzIgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIHN5c19jbGtvdXQyX3NyYyA9IHsKKwkubmFtZQkJPSAic3lzX2Nsa291dDJfc3JjIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkucGFyZW50CQk9ICZmdW5jXzU0bV9jaywKKwkuY2xrZG1fbmFtZQk9ICJ3a3VwX2Nsa2RtIiwKKwkuZW5hYmxlX3JlZwk9IE9NQVAyNFhYX1BSQ01fQ0xLT1VUX0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQMjQyMF9DTEtPVVQyX0VOX1NISUZULAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQMjRYWF9QUkNNX0NMS09VVF9DVFJMLAorCS5jbGtzZWxfbWFzawk9IE9NQVAyNDIwX0NMS09VVDJfU09VUkNFX01BU0ssCisJLmNsa3NlbAkJPSBjb21tb25fY2xrb3V0X3NyY19jbGtzZWwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBzeXNfY2xrb3V0Ml9jbGtzZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmc3lzX2Nsa291dDJfc3JjLCAucmF0ZXMgPSBjb21tb25fY2xrb3V0X3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9Cit9OworCisvKiBJbiAyNDMwLCBuZXcgaW4gMjQyMCBFUzIgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIHN5c19jbGtvdXQyID0geworCS5uYW1lCQk9ICJzeXNfY2xrb3V0MiIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmc3lzX2Nsa291dDJfc3JjLAorCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAorCS5jbGtzZWxfcmVnCT0gT01BUDI0WFhfUFJDTV9DTEtPVVRfQ1RSTCwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMjQyMF9DTEtPVVQyX0RJVl9NQVNLLAorCS5jbGtzZWwJCT0gc3lzX2Nsa291dDJfY2xrc2VsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZQorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZW11bF9jayA9IHsKKwkubmFtZQkJPSAiZW11bF9jayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLnBhcmVudAkJPSAmZnVuY181NG1fY2ssCisJLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQMjRYWF9QUkNNX0NMS0VNVUxfQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VNVUxBVElPTl9FTl9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorCit9OworCisvKgorICogTVBVIGNsb2NrIGRvbWFpbgorICoJQ2xvY2tzOgorICoJCU1QVV9GQ0xLLCBNUFVfSUNMSworICoJCUlOVF9NX0ZDTEssIElOVF9NX0lfQ0xLCisgKgorICogLSBJbmRpdmlkdWFsIGNsb2NrcyBhcmUgaGFyZHdhcmUgbWFuYWdlZC4KKyAqIC0gQmFzZSBkaXZpZGVyIGNvbWVzIGZyb206IENNX0NMS1NFTF9NUFUKKyAqCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgbXB1X2NvcmVfcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8yNFhYIHwgREVGQVVMVF9SQVRFIH0sCisJeyAuZGl2ID0gMiwgLnZhbCA9IDIsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB9LAorCXsgLmRpdiA9IDQsIC52YWwgPSA0LCAuZmxhZ3MgPSBSQVRFX0lOXzI0MlggfSwKKwl7IC5kaXYgPSA2LCAudmFsID0gNiwgLmZsYWdzID0gUkFURV9JTl8yNDJYIH0sCisJeyAuZGl2ID0gOCwgLnZhbCA9IDgsIC5mbGFncyA9IFJBVEVfSU5fMjQyWCB9LAorCXsgLmRpdiA9IDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIG1wdV9jbGtzZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmY29yZV9jaywgLnJhdGVzID0gbXB1X2NvcmVfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1wdV9jayA9IHsJLyogQ29udHJvbCBjcHUgKi8KKwkubmFtZQkJPSAibXB1X2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucGFyZW50CQk9ICZjb3JlX2NrLAorCS5mbGFncwkJPSBERUxBWUVEX0FQUCB8IENPTkZJR19QQVJUSUNJUEFOVCwKKwkuY2xrZG1fbmFtZQk9ICJtcHVfY2xrZG0iLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoTVBVX01PRCwgQ01fQ0xLU0VMKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMjRYWF9DTEtTRUxfTVBVX01BU0ssCisJLmNsa3NlbAkJPSBtcHVfY2xrc2VsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZQorfTsKKworLyoKKyAqIERTUCAoMjQzMC1JVkEyLjEpICgyNDIwLVVNQStJVkExKSBjbG9jayBkb21haW4KKyAqIENsb2NrczoKKyAqCTI0MzA6IElWQTIuMV9GQ0xLIChyZWFsbHkganVzdCBEU1BfRkNMSyksIElWQTIuMV9JQ0xLCisgKgkyNDIwOiBVTUFfRkNMSywgVU1BX0lDTEssIElWQV9NUFUsIElWQV9DT1AKKyAqCisgKiBXb24ndCBiZSB0b28gc3BlY2lmaWMgaGVyZS4gVGhlIGNvcmUgY2xvY2sgY29tZXMgaW50byB0aGlzIGJsb2NrCisgKiBpdCBpcyBkaXZpZGVkIHRoZW4gdGVlJ2VkLiBPbmUgYnJhbmNoIGdvZXMgZGlyZWN0bHkgdG8geHl6IGVuYWJsZQorICogY29udHJvbHMuIFRoZSBvdGhlciBicmFuY2ggZ2V0cyBmdXJ0aGVyIGRpdmlkZWQgYnkgMiB0aGVuIHBvc3NpYmx5CisgKiByb3V0ZWQgaW50byBhIHN5bmNocm9uaXplciBhbmQgb3V0IG9mIGNsb2NrcyBhYmMuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgZHNwX2Zja19jb3JlX3JhdGVzW10gPSB7CisJeyAuZGl2ID0gMSwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB8IERFRkFVTFRfUkFURSB9LAorCXsgLmRpdiA9IDIsIC52YWwgPSAyLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfSwKKwl7IC5kaXYgPSAzLCAudmFsID0gMywgLmZsYWdzID0gUkFURV9JTl8yNFhYIH0sCisJeyAuZGl2ID0gNCwgLnZhbCA9IDQsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB9LAorCXsgLmRpdiA9IDYsIC52YWwgPSA2LCAuZmxhZ3MgPSBSQVRFX0lOXzI0MlggfSwKKwl7IC5kaXYgPSA4LCAudmFsID0gOCwgLmZsYWdzID0gUkFURV9JTl8yNDJYIH0sCisJeyAuZGl2ID0gMTIsIC52YWwgPSAxMiwgLmZsYWdzID0gUkFURV9JTl8yNDJYIH0sCisJeyAuZGl2ID0gMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgZHNwX2Zja19jbGtzZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmY29yZV9jaywgLnJhdGVzID0gZHNwX2Zja19jb3JlX3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IGNsayBkc3BfZmNrID0geworCS5uYW1lCQk9ICJkc3BfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmNvcmVfY2ssCisJLmZsYWdzCQk9IERFTEFZRURfQVBQIHwgQ09ORklHX1BBUlRJQ0lQQU5ULAorCS5jbGtkbV9uYW1lCT0gImRzcF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDI0WFhfRFNQX01PRCwgQ01fRkNMS0VOKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0NNX0ZDTEtFTl9EU1BfRU5fRFNQX1NISUZULAorCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAyNFhYX0RTUF9NT0QsIENNX0NMS1NFTCksCisJLmNsa3NlbF9tYXNrCT0gT01BUDI0WFhfQ0xLU0VMX0RTUF9NQVNLLAorCS5jbGtzZWwJCT0gZHNwX2Zja19jbGtzZWwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlCit9OworCisvKiBEU1AgaW50ZXJmYWNlIGNsb2NrICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGRzcF9pcmF0ZV9pY2tfcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8yNFhYIHwgREVGQVVMVF9SQVRFIH0sCisJeyAuZGl2ID0gMiwgLnZhbCA9IDIsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB9LAorCXsgLmRpdiA9IDMsIC52YWwgPSAzLCAuZmxhZ3MgPSBSQVRFX0lOXzI0M1ggfSwKKwl7IC5kaXYgPSAwIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBkc3BfaXJhdGVfaWNrX2Nsa3NlbFtdID0geworCXsgLnBhcmVudCA9ICZkc3BfZmNrLCAucmF0ZXMgPSBkc3BfaXJhdGVfaWNrX3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9Cit9OworCisvKiBUaGlzIGNsb2NrIGRvZXMgbm90IGV4aXN0IGFzIHN1Y2ggaW4gdGhlIFRSTS4gKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIGRzcF9pcmF0ZV9pY2sgPSB7CisJLm5hbWUJCT0gImRzcF9pcmF0ZV9pY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5wYXJlbnQJCT0gJmRzcF9mY2ssCisJLmZsYWdzCQk9IERFTEFZRURfQVBQIHwgQ09ORklHX1BBUlRJQ0lQQU5ULAorCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAyNFhYX0RTUF9NT0QsIENNX0NMS1NFTCksCisJLmNsa3NlbF9tYXNrCT0gT01BUDI0WFhfQ0xLU0VMX0RTUF9JRl9NQVNLLAorCS5jbGtzZWwJCT0gZHNwX2lyYXRlX2lja19jbGtzZWwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJICAgICAgPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlCit9OworCisvKiAyNDIwIG9ubHkgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIGRzcF9pY2sgPSB7CisJLm5hbWUJCT0gImRzcF9pY2siLAkgLyogYXBwYXJlbnRseSBpcGkgYW5kIGlzcCAqLworCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmZHNwX2lyYXRlX2ljaywKKwkuZmxhZ3MJCT0gREVMQVlFRF9BUFAgfCBDT05GSUdfUEFSVElDSVBBTlQsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDI0WFhfRFNQX01PRCwgQ01fSUNMS0VOKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNDIwX0VOX0RTUF9JUElfU0hJRlQsCSAgICAgIC8qIGZvciBpcGkgKi8KK307CisKKy8qIDI0MzAgb25seSAtIEVOX0RTUCBjb250cm9scyBib3RoIGRzcCBmY2xrIGFuZCBpY2xrIG9uIDI0MzAgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIGl2YTJfMV9pY2sgPSB7CisJLm5hbWUJCT0gIml2YTJfMV9pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmZHNwX2lyYXRlX2ljaywKKwkuZmxhZ3MJCT0gREVMQVlFRF9BUFAgfCBDT05GSUdfUEFSVElDSVBBTlQsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDI0WFhfRFNQX01PRCwgQ01fRkNMS0VOKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0NNX0ZDTEtFTl9EU1BfRU5fRFNQX1NISUZULAorfTsKKworLyoKKyAqIFRoZSBJVkExIGlzIGFuIEFSTTcgY29yZSBvbiB0aGUgMjQyMCB0aGF0IGhhcyBub3RoaW5nIHRvIGRvIHdpdGgKKyAqIHRoZSBDNTR4LCBidXQgd2hpY2ggaXMgY29udGFpbmVkIGluIHRoZSBEU1AgcG93ZXJkb21haW4uICBEb2VzIG5vdAorICogZXhpc3Qgb24gbGF0ZXIgT01BUHMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIGl2YTFfaWZjayA9IHsKKwkubmFtZQkJPSAiaXZhMV9pZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmNvcmVfY2ssCisJLmZsYWdzCQk9IENPTkZJR19QQVJUSUNJUEFOVCB8IERFTEFZRURfQVBQLAorCS5jbGtkbV9uYW1lCT0gIml2YTFfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAyNFhYX0RTUF9NT0QsIENNX0ZDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjQyMF9FTl9JVkFfQ09QX1NISUZULAorCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAyNFhYX0RTUF9NT0QsIENNX0NMS1NFTCksCisJLmNsa3NlbF9tYXNrCT0gT01BUDI0MjBfQ0xLU0VMX0lWQV9NQVNLLAorCS5jbGtzZWwJCT0gZHNwX2Zja19jbGtzZWwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlCit9OworCisvKiBJVkExIG1wdS9pbnQvaS9mIGNsb2NrcyBhcmUgLzIgb2YgcGFyZW50ICovCitzdGF0aWMgc3RydWN0IGNsayBpdmExX21wdV9pbnRfaWZjayA9IHsKKwkubmFtZQkJPSAiaXZhMV9tcHVfaW50X2lmY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmaXZhMV9pZmNrLAorCS5jbGtkbV9uYW1lCT0gIml2YTFfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAyNFhYX0RTUF9NT0QsIENNX0ZDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjQyMF9FTl9JVkFfTVBVX1NISUZULAorCS5maXhlZF9kaXYJPSAyLAorCS5yZWNhbGMJCT0gJm9tYXAyX2ZpeGVkX2Rpdmlzb3JfcmVjYWxjLAorfTsKKworLyoKKyAqIEwzIGNsb2NrIGRvbWFpbgorICogTDMgY2xvY2tzIGFyZSB1c2VkIGZvciBib3RoIGludGVyZmFjZSBhbmQgZnVuY3Rpb25hbCBjbG9ja3MgdG8KKyAqIG11bHRpcGxlIGVudGl0aWVzLiBTb21lIG9mIHRoZXNlIGNsb2NrcyBhcmUgY29tcGxldGVseSBtYW5hZ2VkCisgKiBieSBoYXJkd2FyZSwgYW5kIHNvbWUgb3RoZXJzIGFsbG93IHNvZnR3YXJlIGNvbnRyb2wuIEhhcmR3YXJlCisgKiBtYW5hZ2VkIG9uZXMgZ2VuZXJhbCBhcmUgYmFzZWQgb24gZGlyZWN0bHkgQ0xLX1JFUSBzaWduYWxzIGFuZAorICogdmFyaW91cyBhdXRvIGlkbGUgc2V0dGluZ3MuIFRoZSBmdW5jdGlvbmFsIHNwZWMgc2V0cyBtYW55IG9mIHRoZXNlCisgKiBhcyAndGllLWhpZ2gnIGZvciB0aGVpciBlbmFibGVzLgorICoKKyAqIEktQ0xPQ0tTOgorICoJTDMtSW50ZXJjb25uZWN0LCBTTVMsIEdQTUMsIFNEUkMsIE9DTV9SQU0sIE9DTV9ST00sIFNETUEKKyAqCUNBTSwgSFMtVVNCLgorICogRi1DTE9DSworICoJU1NJLgorICoKKyAqIEdQTUMgbWVtb3JpZXMgYW5kIFNEUkMgaGF2ZSB0aW1pbmcgYW5kIGNsb2NrIHNlbnNpdGl2ZSByZWdpc3RlcnMgd2hpY2gKKyAqIG1heSB2ZXJ5IHdlbGwgbmVlZCBub3RpZmljYXRpb24gd2hlbiB0aGUgY2xvY2sgY2hhbmdlcy4gQ3VycmVudGx5IGZvciBsb3cKKyAqIG9wZXJhdGluZyBwb2ludHMsIHRoZXNlIGFyZSB0YWtlbiBjYXJlIG9mIGluIHNsZWVwLlMuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgY29yZV9sM19jb3JlX3JhdGVzW10gPSB7CisJeyAuZGl2ID0gMSwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB9LAorCXsgLmRpdiA9IDIsIC52YWwgPSAyLCAuZmxhZ3MgPSBSQVRFX0lOXzI0MlggfSwKKwl7IC5kaXYgPSA0LCAudmFsID0gNCwgLmZsYWdzID0gUkFURV9JTl8yNFhYIHwgREVGQVVMVF9SQVRFIH0sCisJeyAuZGl2ID0gNiwgLnZhbCA9IDYsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB9LAorCXsgLmRpdiA9IDgsIC52YWwgPSA4LCAuZmxhZ3MgPSBSQVRFX0lOXzI0MlggfSwKKwl7IC5kaXYgPSAxMiwgLnZhbCA9IDEyLCAuZmxhZ3MgPSBSQVRFX0lOXzI0MlggfSwKKwl7IC5kaXYgPSAxNiwgLnZhbCA9IDE2LCAuZmxhZ3MgPSBSQVRFX0lOXzI0MlggfSwKKwl7IC5kaXYgPSAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGNvcmVfbDNfY2xrc2VsW10gPSB7CisJeyAucGFyZW50ID0gJmNvcmVfY2ssIC5yYXRlcyA9IGNvcmVfbDNfY29yZV9yYXRlcyB9LAorCXsgLnBhcmVudCA9IE5VTEwgfQorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgY29yZV9sM19jayA9IHsJLyogVXNlZCBmb3IgaWNrIGFuZCBmY2ssIGludGVyY29ubmVjdCAqLworCS5uYW1lCQk9ICJjb3JlX2wzX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucGFyZW50CQk9ICZjb3JlX2NrLAorCS5mbGFncwkJPSBERUxBWUVEX0FQUCB8IENPTkZJR19QQVJUSUNJUEFOVCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2wzX2Nsa2RtIiwKKwkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fQ0xLU0VMMSksCisJLmNsa3NlbF9tYXNrCT0gT01BUDI0WFhfQ0xLU0VMX0wzX01BU0ssCisJLmNsa3NlbAkJPSBjb3JlX2wzX2Nsa3NlbCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9yb3VuZF9yYXRlLAorCS5zZXRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfc2V0X3JhdGUKK307CisKKy8qIHVzYl9sNF9pY2sgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgdXNiX2w0X2lja19jb3JlX2wzX3JhdGVzW10gPSB7CisJeyAuZGl2ID0gMSwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB9LAorCXsgLmRpdiA9IDIsIC52YWwgPSAyLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfCBERUZBVUxUX1JBVEUgfSwKKwl7IC5kaXYgPSA0LCAudmFsID0gNCwgLmZsYWdzID0gUkFURV9JTl8yNFhYIH0sCisJeyAuZGl2ID0gMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCB1c2JfbDRfaWNrX2Nsa3NlbFtdID0geworCXsgLnBhcmVudCA9ICZjb3JlX2wzX2NrLCAucmF0ZXMgPSB1c2JfbDRfaWNrX2NvcmVfbDNfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCisvKiBJdCBpcyB1bmNsZWFyIGZyb20gVFJNIHdoZXRoZXIgdXNiX2w0X2ljayBpcyByZWFsbHkgaW4gTDMgb3IgTDQgY2xrZG0gKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIHVzYl9sNF9pY2sgPSB7CS8qIEZTLVVTQiBpbnRlcmZhY2UgY2xvY2sgKi8KKwkubmFtZQkJPSAidXNiX2w0X2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZjb3JlX2wzX2NrLAorCS5mbGFncwkJPSBERUxBWUVEX0FQUCB8IENPTkZJR19QQVJUSUNJUEFOVCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9VU0JfU0hJRlQsCisJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0NMS1NFTDEpLAorCS5jbGtzZWxfbWFzawk9IE9NQVAyNFhYX0NMS1NFTF9VU0JfTUFTSywKKwkuY2xrc2VsCQk9IHVzYl9sNF9pY2tfY2xrc2VsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZQorfTsKKworLyoKKyAqIEw0IGNsb2NrIG1hbmFnZW1lbnQgZG9tYWluCisgKgorICogVGhpcyBkb21haW4gY29udGFpbnMgbG90cyBvZiBpbnRlcmZhY2UgY2xvY2tzIGZyb20gdGhlIEw0IGludGVyZmFjZSwgc29tZQorICogZnVuY3Rpb25hbCBjbG9ja3MuCUZpeGVkIEFQTEwgZnVuY3Rpb25hbCBzb3VyY2UgY2xvY2tzIGFyZSBtYW5hZ2VkIGluCisgKiB0aGlzIGRvbWFpbi4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBsNF9jb3JlX2wzX3JhdGVzW10gPSB7CisJeyAuZGl2ID0gMSwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB8IERFRkFVTFRfUkFURSB9LAorCXsgLmRpdiA9IDIsIC52YWwgPSAyLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfSwKKwl7IC5kaXYgPSAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGw0X2Nsa3NlbFtdID0geworCXsgLnBhcmVudCA9ICZjb3JlX2wzX2NrLCAucmF0ZXMgPSBsNF9jb3JlX2wzX3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IGNsayBsNF9jayA9IHsJCS8qIHVzZWQgYm90aCBhcyBhbiBpY2sgYW5kIGZjayAqLworCS5uYW1lCQk9ICJsNF9jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmY29yZV9sM19jaywKKwkuZmxhZ3MJCT0gREVMQVlFRF9BUFAsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0NMS1NFTDEpLAorCS5jbGtzZWxfbWFzawk9IE9NQVAyNFhYX0NMS1NFTF9MNF9NQVNLLAorCS5jbGtzZWwJCT0gbDRfY2xrc2VsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZQorfTsKKworLyoKKyAqIFNTSSBpcyBpbiBMMyBtYW5hZ2VtZW50IGRvbWFpbiwgaXRzIGRpcmVjdCBwYXJlbnQgaXMgY29yZSBub3QgbDMsCisgKiBtYW55IGNvcmUgcG93ZXIgZG9tYWluIGVudGl0aWVzIGFyZSBncm91cGVkIGludG8gdGhlIEwzIGNsb2NrCisgKiBkb21haW4uCisgKiBTU0lfU1NSX0ZDTEssIFNTSV9TU1RfRkNMSywgU1NJX0w0X0lDTEsKKyAqCisgKiBzc3IgPSBjb3JlLzEvMi8zLzQvNSwgc3N0ID0gMS8yIHNzci4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBzc2lfc3NyX3NzdF9mY2tfY29yZV9yYXRlc1tdID0geworCXsgLmRpdiA9IDEsIC52YWwgPSAxLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfSwKKwl7IC5kaXYgPSAyLCAudmFsID0gMiwgLmZsYWdzID0gUkFURV9JTl8yNFhYIHwgREVGQVVMVF9SQVRFIH0sCisJeyAuZGl2ID0gMywgLnZhbCA9IDMsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB9LAorCXsgLmRpdiA9IDQsIC52YWwgPSA0LCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfSwKKwl7IC5kaXYgPSA1LCAudmFsID0gNSwgLmZsYWdzID0gUkFURV9JTl8yNDNYIH0sCisJeyAuZGl2ID0gNiwgLnZhbCA9IDYsIC5mbGFncyA9IFJBVEVfSU5fMjQyWCB9LAorCXsgLmRpdiA9IDgsIC52YWwgPSA4LCAuZmxhZ3MgPSBSQVRFX0lOXzI0MlggfSwKKwl7IC5kaXYgPSAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIHNzaV9zc3Jfc3N0X2Zja19jbGtzZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmY29yZV9jaywgLnJhdGVzID0gc3NpX3Nzcl9zc3RfZmNrX2NvcmVfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNzaV9zc3Jfc3N0X2ZjayA9IHsKKwkubmFtZQkJPSAic3NpX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZjb3JlX2NrLAorCS5mbGFncwkJPSBERUxBWUVEX0FQUCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2wzX2Nsa2RtIiwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgT01BUDI0WFhfQ01fRkNMS0VOMiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9TU0lfU0hJRlQsCisJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0NMS1NFTDEpLAorCS5jbGtzZWxfbWFzawk9IE9NQVAyNFhYX0NMS1NFTF9TU0lfTUFTSywKKwkuY2xrc2VsCQk9IHNzaV9zc3Jfc3N0X2Zja19jbGtzZWwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlCit9OworCisvKgorICogUHJlc3VtYWJseSB0aGlzIGlzIHRoZSBzYW1lIGFzIFNTSV9JQ0xLLgorICogVFJNIGNvbnRyYWRpY3RzIGl0c2VsZiBvbiB3aGF0IGNsb2NrZG9tYWluIFNTSV9JQ0xLIGlzIGluCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIHNzaV9sNF9pY2sgPSB7CisJLm5hbWUJCT0gInNzaV9sNF9pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmbDRfY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjIpLAorCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fU1NJX1NISUZULAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCisKKy8qCisgKiBHRlggY2xvY2sgZG9tYWluCisgKglDbG9ja3M6CisgKiBHRlhfRkNMSywgR0ZYX0lDTEsKKyAqIEdGWF9DRzEoMmQpLCBHRlhfQ0cyKDNkKQorICoKKyAqIEdGWF9GQ0xLIHJ1bnMgZnJvbSBMMywgYW5kIGlzIGRpdmlkZWQgYnkgKDEsMiwzLDQpCisgKiBUaGUgMmQgYW5kIDNkIGNsb2NrcyBydW4gYXQgYSBoYXJkd2FyZSBkZXRlcm1pbmVkCisgKiBkaXZpZGVkIHZhbHVlIG9mIGZjbGsuCisgKgorICovCisvKiBYWFggUkVWSVNJVDogR0ZYIGNsb2NrIGlzIHBhcnQgb2YgQ09ORklHX1BBUlRJQ0lQQU5ULCBubz8gZG91YmxlY2hlY2suICovCisKKy8qIFRoaXMgY2xrc2VsIHN0cnVjdCBpcyBzaGFyZWQgYmV0d2VlbiBnZnhfM2RfZmNrIGFuZCBnZnhfMmRfZmNrICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBnZnhfZmNrX2Nsa3NlbFtdID0geworCXsgLnBhcmVudCA9ICZjb3JlX2wzX2NrLCAucmF0ZXMgPSBnZnhfbDNfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBnZnhfM2RfZmNrID0geworCS5uYW1lCQk9ICJnZnhfM2RfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmNvcmVfbDNfY2ssCisJLmNsa2RtX25hbWUJPSAiZ2Z4X2Nsa2RtIiwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihHRlhfTU9ELCBDTV9GQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fM0RfU0hJRlQsCisJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoR0ZYX01PRCwgQ01fQ0xLU0VMKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQX0NMS1NFTF9HRlhfTUFTSywKKwkuY2xrc2VsCQk9IGdmeF9mY2tfY2xrc2VsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZQorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZ2Z4XzJkX2ZjayA9IHsKKwkubmFtZQkJPSAiZ2Z4XzJkX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZjb3JlX2wzX2NrLAorCS5jbGtkbV9uYW1lCT0gImdmeF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoR0ZYX01PRCwgQ01fRkNMS0VOKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOXzJEX1NISUZULAorCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKEdGWF9NT0QsIENNX0NMS1NFTCksCisJLmNsa3NlbF9tYXNrCT0gT01BUF9DTEtTRUxfR0ZYX01BU0ssCisJLmNsa3NlbAkJPSBnZnhfZmNrX2Nsa3NlbCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9yb3VuZF9yYXRlLAorCS5zZXRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfc2V0X3JhdGUKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGdmeF9pY2sgPSB7CisJLm5hbWUJCT0gImdmeF9pY2siLAkJLyogRnJvbSBsMyAqLworCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmY29yZV9sM19jaywKKwkuY2xrZG1fbmFtZQk9ICJnZnhfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKEdGWF9NT0QsIENNX0lDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQX0VOX0dGWF9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworLyoKKyAqIE1vZGVtIGNsb2NrIGRvbWFpbiAoMjQzMCkKKyAqCUNMT0NLUzoKKyAqCQlNRE1fT1NDX0NMSworICoJCU1ETV9JQ0xLCisgKiBUaGVzZSBjbG9ja3MgYXJlIHVzYWJsZSBpbiBjaGFzc2lzIG1vZGUgb25seS4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBtZG1faWNrX2NvcmVfcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8yNDNYIH0sCisJeyAuZGl2ID0gNCwgLnZhbCA9IDQsIC5mbGFncyA9IFJBVEVfSU5fMjQzWCB8IERFRkFVTFRfUkFURSB9LAorCXsgLmRpdiA9IDYsIC52YWwgPSA2LCAuZmxhZ3MgPSBSQVRFX0lOXzI0M1ggfSwKKwl7IC5kaXYgPSA5LCAudmFsID0gOSwgLmZsYWdzID0gUkFURV9JTl8yNDNYIH0sCisJeyAuZGl2ID0gMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBtZG1faWNrX2Nsa3NlbFtdID0geworCXsgLnBhcmVudCA9ICZjb3JlX2NrLCAucmF0ZXMgPSBtZG1faWNrX2NvcmVfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1kbV9pY2sgPSB7CQkvKiB1c2VkIGJvdGggYXMgYSBpY2sgYW5kIGZjayAqLworCS5uYW1lCQk9ICJtZG1faWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmNvcmVfY2ssCisJLmZsYWdzCQk9IERFTEFZRURfQVBQIHwgQ09ORklHX1BBUlRJQ0lQQU5ULAorCS5jbGtkbV9uYW1lCT0gIm1kbV9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDI0MzBfTURNX01PRCwgQ01fSUNMS0VOKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNDMwX0NNX0lDTEtFTl9NRE1fRU5fTURNX1NISUZULAorCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAyNDMwX01ETV9NT0QsIENNX0NMS1NFTCksCisJLmNsa3NlbF9tYXNrCT0gT01BUDI0MzBfQ0xLU0VMX01ETV9NQVNLLAorCS5jbGtzZWwJCT0gbWRtX2lja19jbGtzZWwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlCit9OworCitzdGF0aWMgc3RydWN0IGNsayBtZG1fb3NjX2NrID0geworCS5uYW1lCQk9ICJtZG1fb3NjX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJm9zY19jaywKKwkuY2xrZG1fbmFtZQk9ICJtZG1fY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAyNDMwX01ETV9NT0QsIENNX0ZDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjQzMF9FTl9PU0NfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKKy8qCisgKiBEU1MgY2xvY2sgZG9tYWluCisgKiBDTE9DS3M6CisgKiBEU1NfTDRfSUNMSywgRFNTX0wzX0lDTEssCisgKiBEU1NfQ0xLMSwgRFNTX0NMSzIsIERTU181NE1Iel9DTEsKKyAqCisgKiBEU1MgaXMgYm90aCBpbml0aWF0b3IgYW5kIHRhcmdldC4KKyAqLworLyogWFhYIEFkZCBSQVRFX05PVF9WQUxJREFURUQgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBkc3MxX2Zja19zeXNfcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gMCwgLmZsYWdzID0gUkFURV9JTl8yNFhYIHwgREVGQVVMVF9SQVRFIH0sCisJeyAuZGl2ID0gMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGRzczFfZmNrX2NvcmVfcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8yNFhYIH0sCisJeyAuZGl2ID0gMiwgLnZhbCA9IDIsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB9LAorCXsgLmRpdiA9IDMsIC52YWwgPSAzLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfSwKKwl7IC5kaXYgPSA0LCAudmFsID0gNCwgLmZsYWdzID0gUkFURV9JTl8yNFhYIH0sCisJeyAuZGl2ID0gNSwgLnZhbCA9IDUsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB9LAorCXsgLmRpdiA9IDYsIC52YWwgPSA2LCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfSwKKwl7IC5kaXYgPSA4LCAudmFsID0gOCwgLmZsYWdzID0gUkFURV9JTl8yNFhYIH0sCisJeyAuZGl2ID0gOSwgLnZhbCA9IDksIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB9LAorCXsgLmRpdiA9IDEyLCAudmFsID0gMTIsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB9LAorCXsgLmRpdiA9IDE2LCAudmFsID0gMTYsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB8IERFRkFVTFRfUkFURSB9LAorCXsgLmRpdiA9IDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgZHNzMV9mY2tfY2xrc2VsW10gPSB7CisJeyAucGFyZW50ID0gJnN5c19jaywgIC5yYXRlcyA9IGRzczFfZmNrX3N5c19yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZjb3JlX2NrLCAucmF0ZXMgPSBkc3MxX2Zja19jb3JlX3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZHNzX2ljayA9IHsJCS8qIEVuYWJsZXMgYm90aCBMMyxMNCBJQ0xLJ3MgKi8KKwkubmFtZQkJPSAiZHNzX2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLnBhcmVudAkJPSAmbDRfY2ssCS8qIHJlYWxseSBib3RoIGwzIGFuZCBsNCAqLworCS5jbGtkbV9uYW1lCT0gImRzc19jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fRFNTMV9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZHNzMV9mY2sgPSB7CisJLm5hbWUJCT0gImRzczFfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkucGFyZW50CQk9ICZjb3JlX2NrLAkJLyogQ29yZSBvciBzeXMgKi8KKwkuZmxhZ3MJCT0gREVMQVlFRF9BUFAsCisJLmNsa2RtX25hbWUJPSAiZHNzX2Nsa2RtIiwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9EU1MxX1NISUZULAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0NMS1NFTDEpLAorCS5jbGtzZWxfbWFzawk9IE9NQVAyNFhYX0NMS1NFTF9EU1MxX01BU0ssCisJLmNsa3NlbAkJPSBkc3MxX2Zja19jbGtzZWwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGRzczJfZmNrX3N5c19yYXRlc1tdID0geworCXsgLmRpdiA9IDEsIC52YWwgPSAwLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfCBERUZBVUxUX1JBVEUgfSwKKwl7IC5kaXYgPSAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgZHNzMl9mY2tfNDhtX3JhdGVzW10gPSB7CisJeyAuZGl2ID0gMSwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB8IERFRkFVTFRfUkFURSB9LAorCXsgLmRpdiA9IDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgZHNzMl9mY2tfY2xrc2VsW10gPSB7CisJeyAucGFyZW50ID0gJnN5c19jaywJICAucmF0ZXMgPSBkc3MyX2Zja19zeXNfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmZnVuY180OG1fY2ssIC5yYXRlcyA9IGRzczJfZmNrXzQ4bV9yYXRlcyB9LAorCXsgLnBhcmVudCA9IE5VTEwgfQorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZHNzMl9mY2sgPSB7CQkvKiBBbHQgY2xrIHVzZWQgaW4gcG93ZXIgbWFuYWdlbWVudCAqLworCS5uYW1lCQk9ICJkc3MyX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLnBhcmVudAkJPSAmc3lzX2NrLAkJLyogZml4ZWQgYXQgc3lzX2NrIG9yIDQ4TUh6ICovCisJLmZsYWdzCQk9IERFTEFZRURfQVBQLAorCS5jbGtkbV9uYW1lCT0gImRzc19jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fRFNTMl9TSElGVCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9DTEtTRUwxKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMjRYWF9DTEtTRUxfRFNTMl9NQVNLLAorCS5jbGtzZWwJCT0gZHNzMl9mY2tfY2xrc2VsLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkc3NfNTRtX2ZjayA9IHsJLyogQWx0IGNsayB1c2VkIGluIHBvd2VyIG1hbmFnZW1lbnQgKi8KKwkubmFtZQkJPSAiZHNzXzU0bV9mY2siLAkvKiA1NG0gdHYgY2xrICovCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZmdW5jXzU0bV9jaywKKwkuY2xrZG1fbmFtZQk9ICJkc3NfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX1RWX1NISUZULAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCisvKgorICogQ09SRSBwb3dlciBkb21haW4gSUNMSyAmIEZDTEsgZGVmaW5lcy4KKyAqIE1hbnkgb2YgdGhlIHRoZXNlIGNhbiBoYXZlIG1vcmUgdGhhbiBvbmUgcG9zc2libGUgcGFyZW50LiBFbnRyaWVzCisgKiBoZXJlIHdpbGwgbGlrZWx5IGhhdmUgYW4gTDQgaW50ZXJmYWNlIHBhcmVudCwgYW5kIG1heSBoYXZlIG11bHRpcGxlCisgKiBmdW5jdGlvbmFsIGNsb2NrIHBhcmVudHMuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgZ3B0X2FsdF9yYXRlc1tdID0geworCXsgLmRpdiA9IDEsIC52YWwgPSAyLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfCBERUZBVUxUX1JBVEUgfSwKKwl7IC5kaXYgPSAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIG9tYXAyNHh4X2dwdF9jbGtzZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmZnVuY18zMmtfY2ssIC5yYXRlcyA9IGdwdF8zMmtfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmc3lzX2NrLAkgIC5yYXRlcyA9IGdwdF9zeXNfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmYWx0X2NrLAkgIC5yYXRlcyA9IGdwdF9hbHRfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncHQxX2ljayA9IHsKKwkubmFtZQkJPSAiZ3B0MV9pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmbDRfY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoV0tVUF9NT0QsIENNX0lDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUFQxX1NISUZULAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncHQxX2ZjayA9IHsKKwkubmFtZQkJPSAiZ3B0MV9mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmZnVuY18zMmtfY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoV0tVUF9NT0QsIENNX0ZDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUFQxX1NISUZULAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoV0tVUF9NT0QsIENNX0NMS1NFTDEpLAorCS5jbGtzZWxfbWFzawk9IE9NQVAyNFhYX0NMS1NFTF9HUFQxX01BU0ssCisJLmNsa3NlbAkJPSBvbWFwMjR4eF9ncHRfY2xrc2VsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZQorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZ3B0Ml9pY2sgPSB7CisJLm5hbWUJCT0gImdwdDJfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmw0X2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0dQVDJfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGdwdDJfZmNrID0geworCS5uYW1lCQk9ICJncHQyX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZmdW5jXzMya19jaywKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUFQyX1NISUZULAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0NMS1NFTDIpLAorCS5jbGtzZWxfbWFzawk9IE9NQVAyNFhYX0NMS1NFTF9HUFQyX01BU0ssCisJLmNsa3NlbAkJPSBvbWFwMjR4eF9ncHRfY2xrc2VsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncHQzX2ljayA9IHsKKwkubmFtZQkJPSAiZ3B0M19pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmbDRfY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fR1BUM19TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZ3B0M19mY2sgPSB7CisJLm5hbWUJCT0gImdwdDNfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmZ1bmNfMzJrX2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0dQVDNfU0hJRlQsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fQ0xLU0VMMiksCisJLmNsa3NlbF9tYXNrCT0gT01BUDI0WFhfQ0xLU0VMX0dQVDNfTUFTSywKKwkuY2xrc2VsCQk9IG9tYXAyNHh4X2dwdF9jbGtzZWwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGdwdDRfaWNrID0geworCS5uYW1lCQk9ICJncHQ0X2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZsNF9jaywKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUFQ0X1NISUZULAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncHQ0X2ZjayA9IHsKKwkubmFtZQkJPSAiZ3B0NF9mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmZnVuY18zMmtfY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fR1BUNF9TSElGVCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9DTEtTRUwyKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMjRYWF9DTEtTRUxfR1BUNF9NQVNLLAorCS5jbGtzZWwJCT0gb21hcDI0eHhfZ3B0X2Nsa3NlbCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZ3B0NV9pY2sgPSB7CisJLm5hbWUJCT0gImdwdDVfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmw0X2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0dQVDVfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGdwdDVfZmNrID0geworCS5uYW1lCQk9ICJncHQ1X2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZmdW5jXzMya19jaywKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUFQ1X1NISUZULAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0NMS1NFTDIpLAorCS5jbGtzZWxfbWFzawk9IE9NQVAyNFhYX0NMS1NFTF9HUFQ1X01BU0ssCisJLmNsa3NlbAkJPSBvbWFwMjR4eF9ncHRfY2xrc2VsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncHQ2X2ljayA9IHsKKwkubmFtZQkJPSAiZ3B0Nl9pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmbDRfY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fR1BUNl9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZ3B0Nl9mY2sgPSB7CisJLm5hbWUJCT0gImdwdDZfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmZ1bmNfMzJrX2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0dQVDZfU0hJRlQsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fQ0xLU0VMMiksCisJLmNsa3NlbF9tYXNrCT0gT01BUDI0WFhfQ0xLU0VMX0dQVDZfTUFTSywKKwkuY2xrc2VsCQk9IG9tYXAyNHh4X2dwdF9jbGtzZWwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGdwdDdfaWNrID0geworCS5uYW1lCQk9ICJncHQ3X2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZsNF9jaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUFQ3X1NISUZULAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncHQ3X2ZjayA9IHsKKwkubmFtZQkJPSAiZ3B0N19mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmZnVuY18zMmtfY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fR1BUN19TSElGVCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9DTEtTRUwyKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMjRYWF9DTEtTRUxfR1BUN19NQVNLLAorCS5jbGtzZWwJCT0gb21hcDI0eHhfZ3B0X2Nsa3NlbCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZ3B0OF9pY2sgPSB7CisJLm5hbWUJCT0gImdwdDhfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmw0X2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0dQVDhfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGdwdDhfZmNrID0geworCS5uYW1lCQk9ICJncHQ4X2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZmdW5jXzMya19jaywKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUFQ4X1NISUZULAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0NMS1NFTDIpLAorCS5jbGtzZWxfbWFzawk9IE9NQVAyNFhYX0NMS1NFTF9HUFQ4X01BU0ssCisJLmNsa3NlbAkJPSBvbWFwMjR4eF9ncHRfY2xrc2VsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncHQ5X2ljayA9IHsKKwkubmFtZQkJPSAiZ3B0OV9pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmbDRfY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fR1BUOV9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZ3B0OV9mY2sgPSB7CisJLm5hbWUJCT0gImdwdDlfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmZ1bmNfMzJrX2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0dQVDlfU0hJRlQsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fQ0xLU0VMMiksCisJLmNsa3NlbF9tYXNrCT0gT01BUDI0WFhfQ0xLU0VMX0dQVDlfTUFTSywKKwkuY2xrc2VsCQk9IG9tYXAyNHh4X2dwdF9jbGtzZWwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGdwdDEwX2ljayA9IHsKKwkubmFtZQkJPSAiZ3B0MTBfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmw0X2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0dQVDEwX1NISUZULAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncHQxMF9mY2sgPSB7CisJLm5hbWUJCT0gImdwdDEwX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZmdW5jXzMya19jaywKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUFQxMF9TSElGVCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9DTEtTRUwyKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMjRYWF9DTEtTRUxfR1BUMTBfTUFTSywKKwkuY2xrc2VsCQk9IG9tYXAyNHh4X2dwdF9jbGtzZWwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGdwdDExX2ljayA9IHsKKwkubmFtZQkJPSAiZ3B0MTFfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmw0X2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0dQVDExX1NISUZULAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncHQxMV9mY2sgPSB7CisJLm5hbWUJCT0gImdwdDExX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZmdW5jXzMya19jaywKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUFQxMV9TSElGVCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9DTEtTRUwyKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMjRYWF9DTEtTRUxfR1BUMTFfTUFTSywKKwkuY2xrc2VsCQk9IG9tYXAyNHh4X2dwdF9jbGtzZWwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGdwdDEyX2ljayA9IHsKKwkubmFtZQkJPSAiZ3B0MTJfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmw0X2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0dQVDEyX1NISUZULAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncHQxMl9mY2sgPSB7CisJLm5hbWUJCT0gImdwdDEyX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZzZWN1cmVfMzJrX2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0dQVDEyX1NISUZULAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0NMS1NFTDIpLAorCS5jbGtzZWxfbWFzawk9IE9NQVAyNFhYX0NMS1NFTF9HUFQxMl9NQVNLLAorCS5jbGtzZWwJCT0gb21hcDI0eHhfZ3B0X2Nsa3NlbCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNic3AxX2ljayA9IHsKKwkubmFtZQkJPSAibWNic3BfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSAxLAorCS5wYXJlbnQJCT0gJmw0X2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX01DQlNQMV9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNic3AxX2ZjayA9IHsKKwkubmFtZQkJPSAibWNic3BfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSAxLAorCS5wYXJlbnQJCT0gJmZ1bmNfOTZtX2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX01DQlNQMV9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNic3AyX2ljayA9IHsKKwkubmFtZQkJPSAibWNic3BfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSAyLAorCS5wYXJlbnQJCT0gJmw0X2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX01DQlNQMl9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNic3AyX2ZjayA9IHsKKwkubmFtZQkJPSAibWNic3BfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSAyLAorCS5wYXJlbnQJCT0gJmZ1bmNfOTZtX2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX01DQlNQMl9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNic3AzX2ljayA9IHsKKwkubmFtZQkJPSAibWNic3BfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSAzLAorCS5wYXJlbnQJCT0gJmw0X2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4yKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNDMwX0VOX01DQlNQM19TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNic3AzX2ZjayA9IHsKKwkubmFtZQkJPSAibWNic3BfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSAzLAorCS5wYXJlbnQJCT0gJmZ1bmNfOTZtX2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBPTUFQMjRYWF9DTV9GQ0xLRU4yKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNDMwX0VOX01DQlNQM19TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNic3A0X2ljayA9IHsKKwkubmFtZQkJPSAibWNic3BfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSA0LAorCS5wYXJlbnQJCT0gJmw0X2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4yKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNDMwX0VOX01DQlNQNF9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNic3A0X2ZjayA9IHsKKwkubmFtZQkJPSAibWNic3BfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSA0LAorCS5wYXJlbnQJCT0gJmZ1bmNfOTZtX2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBPTUFQMjRYWF9DTV9GQ0xLRU4yKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNDMwX0VOX01DQlNQNF9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNic3A1X2ljayA9IHsKKwkubmFtZQkJPSAibWNic3BfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSA1LAorCS5wYXJlbnQJCT0gJmw0X2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4yKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNDMwX0VOX01DQlNQNV9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNic3A1X2ZjayA9IHsKKwkubmFtZQkJPSAibWNic3BfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSA1LAorCS5wYXJlbnQJCT0gJmZ1bmNfOTZtX2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBPTUFQMjRYWF9DTV9GQ0xLRU4yKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNDMwX0VOX01DQlNQNV9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNzcGkxX2ljayA9IHsKKwkubmFtZQkJPSAibWNzcGlfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSAxLAorCS5wYXJlbnQJCT0gJmw0X2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX01DU1BJMV9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNzcGkxX2ZjayA9IHsKKwkubmFtZQkJPSAibWNzcGlfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSAxLAorCS5wYXJlbnQJCT0gJmZ1bmNfNDhtX2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX01DU1BJMV9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNzcGkyX2ljayA9IHsKKwkubmFtZQkJPSAibWNzcGlfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSAyLAorCS5wYXJlbnQJCT0gJmw0X2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX01DU1BJMl9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNzcGkyX2ZjayA9IHsKKwkubmFtZQkJPSAibWNzcGlfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSAyLAorCS5wYXJlbnQJCT0gJmZ1bmNfNDhtX2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX01DU1BJMl9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNzcGkzX2ljayA9IHsKKwkubmFtZQkJPSAibWNzcGlfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSAzLAorCS5wYXJlbnQJCT0gJmw0X2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4yKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNDMwX0VOX01DU1BJM19TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNzcGkzX2ZjayA9IHsKKwkubmFtZQkJPSAibWNzcGlfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSAzLAorCS5wYXJlbnQJCT0gJmZ1bmNfNDhtX2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBPTUFQMjRYWF9DTV9GQ0xLRU4yKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNDMwX0VOX01DU1BJM19TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdWFydDFfaWNrID0geworCS5uYW1lCQk9ICJ1YXJ0MV9pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmbDRfY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fVUFSVDFfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVhcnQxX2ZjayA9IHsKKwkubmFtZQkJPSAidWFydDFfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmZ1bmNfNDhtX2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX1VBUlQxX1NISUZULAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB1YXJ0Ml9pY2sgPSB7CisJLm5hbWUJCT0gInVhcnQyX2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZsNF9jaywKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9VQVJUMl9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdWFydDJfZmNrID0geworCS5uYW1lCQk9ICJ1YXJ0Ml9mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmZnVuY180OG1fY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fVUFSVDJfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVhcnQzX2ljayA9IHsKKwkubmFtZQkJPSAidWFydDNfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmw0X2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4yKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX1VBUlQzX1NISUZULAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB1YXJ0M19mY2sgPSB7CisJLm5hbWUJCT0gInVhcnQzX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZmdW5jXzQ4bV9jaywKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgT01BUDI0WFhfQ01fRkNMS0VOMiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9VQVJUM19TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZ3Bpb3NfaWNrID0geworCS5uYW1lCQk9ICJncGlvc19pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmbDRfY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoV0tVUF9NT0QsIENNX0lDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUElPU19TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZ3Bpb3NfZmNrID0geworCS5uYW1lCQk9ICJncGlvc19mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmZnVuY18zMmtfY2ssCisJLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoV0tVUF9NT0QsIENNX0ZDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9HUElPU19TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbXB1X3dkdF9pY2sgPSB7CisJLm5hbWUJCT0gIm1wdV93ZHRfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmw0X2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKFdLVVBfTU9ELCBDTV9JQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fTVBVX1dEVF9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbXB1X3dkdF9mY2sgPSB7CisJLm5hbWUJCT0gIm1wdV93ZHRfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmZ1bmNfMzJrX2NrLAorCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKFdLVVBfTU9ELCBDTV9GQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fTVBVX1dEVF9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgc3luY18zMmtfaWNrID0geworCS5uYW1lCQk9ICJzeW5jXzMya19pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmbDRfY2ssCisJLmZsYWdzCQk9IEVOQUJMRV9PTl9JTklULAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKFdLVVBfTU9ELCBDTV9JQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fMzJLU1lOQ19TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgd2R0MV9pY2sgPSB7CisJLm5hbWUJCT0gIndkdDFfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmw0X2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKFdLVVBfTU9ELCBDTV9JQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fV0RUMV9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgb21hcGN0cmxfaWNrID0geworCS5uYW1lCQk9ICJvbWFwY3RybF9pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmbDRfY2ssCisJLmZsYWdzCQk9IEVOQUJMRV9PTl9JTklULAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKFdLVVBfTU9ELCBDTV9JQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fT01BUENUUkxfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGljcl9pY2sgPSB7CisJLm5hbWUJCT0gImljcl9pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmbDRfY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoV0tVUF9NT0QsIENNX0lDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjQzMF9FTl9JQ1JfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNhbV9pY2sgPSB7CisJLm5hbWUJCT0gImNhbV9pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5wYXJlbnQJCT0gJmw0X2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0NBTV9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworLyoKKyAqIGNhbV9mY2sgY29udHJvbHMgYm90aCBDQU1fTUNMSyBhbmQgQ0FNX0ZDTEsuICBJdCBzaG91bGQgcHJvYmFibHkgYmUKKyAqIHNwbGl0IGludG8gdHdvIHNlcGFyYXRlIGNsb2Nrcywgc2luY2UgdGhlIHBhcmVudCBjbG9ja3MgYXJlIGRpZmZlcmVudAorICogYW5kIHRoZSBjbG9ja2RvbWFpbnMgYXJlIGFsc28gZGlmZmVyZW50LgorICovCitzdGF0aWMgc3RydWN0IGNsayBjYW1fZmNrID0geworCS5uYW1lCQk9ICJjYW1fZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkucGFyZW50CQk9ICZmdW5jXzk2bV9jaywKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2wzX2Nsa2RtIiwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9DQU1fU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1haWxib3hlc19pY2sgPSB7CisJLm5hbWUJCT0gIm1haWxib3hlc19pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmbDRfY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fTUFJTEJPWEVTX1NISUZULAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB3ZHQ0X2ljayA9IHsKKwkubmFtZQkJPSAid2R0NF9pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmbDRfY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fV0RUNF9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgd2R0NF9mY2sgPSB7CisJLm5hbWUJCT0gIndkdDRfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmZ1bmNfMzJrX2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX1dEVDRfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHdkdDNfaWNrID0geworCS5uYW1lCQk9ICJ3ZHQzX2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZsNF9jaywKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjQyMF9FTl9XRFQzX1NISUZULAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB3ZHQzX2ZjayA9IHsKKwkubmFtZQkJPSAid2R0M19mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmZnVuY18zMmtfY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDI0MjBfRU5fV0RUM19TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbXNwcm9faWNrID0geworCS5uYW1lCQk9ICJtc3Byb19pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmbDRfY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fTVNQUk9fU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1zcHJvX2ZjayA9IHsKKwkubmFtZQkJPSAibXNwcm9fZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmZ1bmNfOTZtX2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX01TUFJPX1NISUZULAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBtbWNfaWNrID0geworCS5uYW1lCQk9ICJtbWNfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmw0X2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNDIwX0VOX01NQ19TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbW1jX2ZjayA9IHsKKwkubmFtZQkJPSAibW1jX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZmdW5jXzk2bV9jaywKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjQyMF9FTl9NTUNfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGZhY19pY2sgPSB7CisJLm5hbWUJCT0gImZhY19pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmbDRfY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fRkFDX1NISUZULAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBmYWNfZmNrID0geworCS5uYW1lCQk9ICJmYWNfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmZ1bmNfMTJtX2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0ZBQ19TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZWFjX2ljayA9IHsKKwkubmFtZQkJPSAiZWFjX2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZsNF9jaywKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjQyMF9FTl9FQUNfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGVhY19mY2sgPSB7CisJLm5hbWUJCT0gImVhY19mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmZnVuY185Nm1fY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDI0MjBfRU5fRUFDX1NISUZULAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBoZHFfaWNrID0geworCS5uYW1lCQk9ICJoZHFfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmw0X2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX0hEUV9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgaGRxX2ZjayA9IHsKKwkubmFtZQkJPSAiaGRxX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZmdW5jXzEybV9jaywKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9IRFFfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGkyYzJfaWNrID0geworCS5uYW1lCQk9ICJpMmNfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSAyLAorCS5wYXJlbnQJCT0gJmw0X2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNDIwX0VOX0kyQzJfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGkyYzJfZmNrID0geworCS5uYW1lCQk9ICJpMmNfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSAyLAorCS5wYXJlbnQJCT0gJmZ1bmNfMTJtX2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNDIwX0VOX0kyQzJfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGkyY2hzMl9mY2sgPSB7CisJLm5hbWUJCT0gImkyY19mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMjQzMF9pMmNoc193YWl0LAorCS5pZAkJPSAyLAorCS5wYXJlbnQJCT0gJmZ1bmNfOTZtX2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBPTUFQMjRYWF9DTV9GQ0xLRU4yKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNDMwX0VOX0kyQ0hTMl9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgaTJjMV9pY2sgPSB7CisJLm5hbWUJCT0gImkyY19pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLmlkCQk9IDEsCisJLnBhcmVudAkJPSAmbDRfY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDI0MjBfRU5fSTJDMV9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgaTJjMV9mY2sgPSB7CisJLm5hbWUJCT0gImkyY19mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLmlkCQk9IDEsCisJLnBhcmVudAkJPSAmZnVuY18xMm1fY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDI0MjBfRU5fSTJDMV9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgaTJjaHMxX2ZjayA9IHsKKwkubmFtZQkJPSAiaTJjX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyNDMwX2kyY2hzX3dhaXQsCisJLmlkCQk9IDEsCisJLnBhcmVudAkJPSAmZnVuY185Nm1fY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIE9NQVAyNFhYX0NNX0ZDTEtFTjIpLAorCS5lbmFibGVfYml0CT0gT01BUDI0MzBfRU5fSTJDSFMxX1NISUZULAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncG1jX2ZjayA9IHsKKwkubmFtZQkJPSAiZ3BtY19mY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLCAvKiBSTUs6IG1pc3Npbmc/ICovCisJLnBhcmVudAkJPSAmY29yZV9sM19jaywKKwkuZmxhZ3MJCT0gRU5BQkxFX09OX0lOSVQsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sM19jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNkbWFfZmNrID0geworCS5uYW1lCQk9ICJzZG1hX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsIC8qIFJNSzogbWlzc2luZz8gKi8KKwkucGFyZW50CQk9ICZjb3JlX2wzX2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDNfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBzZG1hX2ljayA9IHsKKwkubmFtZQkJPSAic2RtYV9pY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLCAvKiBSTUs6IG1pc3Npbmc/ICovCisJLnBhcmVudAkJPSAmbDRfY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sM19jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHZseW5xX2ljayA9IHsKKwkubmFtZQkJPSAidmx5bnFfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmNvcmVfbDNfY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sM19jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDI0MjBfRU5fVkxZTlFfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgdmx5bnFfZmNrXzk2bV9yYXRlc1tdID0geworCXsgLmRpdiA9IDEsIC52YWwgPSAwLCAuZmxhZ3MgPSBSQVRFX0lOXzI0MlggfCBERUZBVUxUX1JBVEUgfSwKKwl7IC5kaXYgPSAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgdmx5bnFfZmNrX2NvcmVfcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8yNDJYIH0sCisJeyAuZGl2ID0gMiwgLnZhbCA9IDIsIC5mbGFncyA9IFJBVEVfSU5fMjQyWCB9LAorCXsgLmRpdiA9IDMsIC52YWwgPSAzLCAuZmxhZ3MgPSBSQVRFX0lOXzI0MlggfSwKKwl7IC5kaXYgPSA0LCAudmFsID0gNCwgLmZsYWdzID0gUkFURV9JTl8yNDJYIH0sCisJeyAuZGl2ID0gNiwgLnZhbCA9IDYsIC5mbGFncyA9IFJBVEVfSU5fMjQyWCB9LAorCXsgLmRpdiA9IDgsIC52YWwgPSA4LCAuZmxhZ3MgPSBSQVRFX0lOXzI0MlggfSwKKwl7IC5kaXYgPSA5LCAudmFsID0gOSwgLmZsYWdzID0gUkFURV9JTl8yNDJYIH0sCisJeyAuZGl2ID0gMTIsIC52YWwgPSAxMiwgLmZsYWdzID0gUkFURV9JTl8yNDJYIH0sCisJeyAuZGl2ID0gMTYsIC52YWwgPSAxNiwgLmZsYWdzID0gUkFURV9JTl8yNDJYIHwgREVGQVVMVF9SQVRFIH0sCisJeyAuZGl2ID0gMTgsIC52YWwgPSAxOCwgLmZsYWdzID0gUkFURV9JTl8yNDJYIH0sCisJeyAuZGl2ID0gMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCB2bHlucV9mY2tfY2xrc2VsW10gPSB7CisJeyAucGFyZW50ID0gJmZ1bmNfOTZtX2NrLCAucmF0ZXMgPSB2bHlucV9mY2tfOTZtX3JhdGVzIH0sCisJeyAucGFyZW50ID0gJmNvcmVfY2ssCSAgLnJhdGVzID0gdmx5bnFfZmNrX2NvcmVfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHZseW5xX2ZjayA9IHsKKwkubmFtZQkJPSAidmx5bnFfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmZ1bmNfOTZtX2NrLAorCS5mbGFncwkJPSBERUxBWUVEX0FQUCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2wzX2Nsa2RtIiwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjQyMF9FTl9WTFlOUV9TSElGVCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9DTEtTRUwxKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMjQyMF9DTEtTRUxfVkxZTlFfTUFTSywKKwkuY2xrc2VsCQk9IHZseW5xX2Zja19jbGtzZWwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlCit9OworCitzdGF0aWMgc3RydWN0IGNsayBzZHJjX2ljayA9IHsKKwkubmFtZQkJPSAic2RyY19pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmbDRfY2ssCisJLmZsYWdzCQk9IEVOQUJMRV9PTl9JTklULAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4zKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNDMwX0VOX1NEUkNfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGRlc19pY2sgPSB7CisJLm5hbWUJCT0gImRlc19pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmbDRfY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIE9NQVAyNFhYX0NNX0lDTEtFTjQpLAorCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fREVTX1NISUZULAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBzaGFfaWNrID0geworCS5uYW1lCQk9ICJzaGFfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmw0X2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBPTUFQMjRYWF9DTV9JQ0xLRU40KSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX1NIQV9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgcm5nX2ljayA9IHsKKwkubmFtZQkJPSAicm5nX2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZsNF9jaywKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgT01BUDI0WFhfQ01fSUNMS0VONCksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9STkdfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGFlc19pY2sgPSB7CisJLm5hbWUJCT0gImFlc19pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmbDRfY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIE9NQVAyNFhYX0NNX0lDTEtFTjQpLAorCS5lbmFibGVfYml0CT0gT01BUDI0WFhfRU5fQUVTX1NISUZULAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBwa2FfaWNrID0geworCS5uYW1lCQk9ICJwa2FfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmw0X2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBPTUFQMjRYWF9DTV9JQ0xLRU40KSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNFhYX0VOX1BLQV9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdXNiX2ZjayA9IHsKKwkubmFtZQkJPSAidXNiX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZmdW5jXzQ4bV9jaywKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2wzX2Nsa2RtIiwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgT01BUDI0WFhfQ01fRkNMS0VOMiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjRYWF9FTl9VU0JfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVzYmhzX2ljayA9IHsKKwkubmFtZQkJPSAidXNiaHNfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmNvcmVfbDNfY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sM19jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjIpLAorCS5lbmFibGVfYml0CT0gT01BUDI0MzBfRU5fVVNCSFNfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1tY2hzMV9pY2sgPSB7CisJLm5hbWUJCT0gIm1tY2hzX2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZsNF9jaywKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjQzMF9FTl9NTUNIUzFfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1tY2hzMV9mY2sgPSB7CisJLm5hbWUJCT0gIm1tY2hzX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZmdW5jXzk2bV9jaywKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2wzX2Nsa2RtIiwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgT01BUDI0WFhfQ01fRkNMS0VOMiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjQzMF9FTl9NTUNIUzFfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1tY2hzMl9pY2sgPSB7CisJLm5hbWUJCT0gIm1tY2hzX2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkuaWQJCT0gMSwKKwkucGFyZW50CQk9ICZsNF9jaywKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjQzMF9FTl9NTUNIUzJfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1tY2hzMl9mY2sgPSB7CisJLm5hbWUJCT0gIm1tY2hzX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkuaWQJCT0gMSwKKwkucGFyZW50CQk9ICZmdW5jXzk2bV9jaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgT01BUDI0WFhfQ01fRkNMS0VOMiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjQzMF9FTl9NTUNIUzJfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGdwaW81X2ljayA9IHsKKwkubmFtZQkJPSAiZ3BpbzVfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmw0X2NrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4yKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAyNDMwX0VOX0dQSU81X1NISUZULAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncGlvNV9mY2sgPSB7CisJLm5hbWUJCT0gImdwaW81X2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZmdW5jXzMya19jaywKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgT01BUDI0WFhfQ01fRkNMS0VOMiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMjQzMF9FTl9HUElPNV9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWRtX2ludGNfaWNrID0geworCS5uYW1lCQk9ICJtZG1faW50Y19pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmbDRfY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjIpLAorCS5lbmFibGVfYml0CT0gT01BUDI0MzBfRU5fTURNX0lOVENfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1tY2hzZGIxX2ZjayA9IHsKKwkubmFtZQkJPSAibW1jaHNkYl9mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmZnVuY18zMmtfY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIE9NQVAyNFhYX0NNX0ZDTEtFTjIpLAorCS5lbmFibGVfYml0CT0gT01BUDI0MzBfRU5fTU1DSFNEQjFfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1tY2hzZGIyX2ZjayA9IHsKKwkubmFtZQkJPSAibW1jaHNkYl9mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLmlkCQk9IDEsCisJLnBhcmVudAkJPSAmZnVuY18zMmtfY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIE9NQVAyNFhYX0NNX0ZDTEtFTjIpLAorCS5lbmFibGVfYml0CT0gT01BUDI0MzBfRU5fTU1DSFNEQjJfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKKy8qCisgKiBUaGlzIGNsb2NrIGlzIGEgY29tcG9zaXRlIGNsb2NrIHdoaWNoIGRvZXMgZW50aXJlIHNldCBjaGFuZ2VzIHRoZW4KKyAqIGZvcmNlcyBhIHJlYmFsYW5jZS4gSXQga2V5cyBvbiB0aGUgTVBVIHNwZWVkLCBidXQgaXQgcmVhbGx5IGNvdWxkCisgKiBiZSBhbnkga2V5IHNwZWVkIHBhcnQgb2YgYSBzZXQgaW4gdGhlIHJhdGUgdGFibGUuCisgKgorICogdG8gcmVhbGx5IGNoYW5nZSBhIHNldCwgeW91IG5lZWQgbWVtb3J5IHRhYmxlIHNldHMgd2hpY2ggZ2V0IGNoYW5nZWQKKyAqIGluIHNyYW0sIHByZS1ub3RpZmllcnMgJiBwb3N0IG5vdGlmaWVycywgY2hhbmdpbmcgdGhlIHRvcCBzZXQsIHdpdGhvdXQKKyAqIGhhdmluZyBsb3cgbGV2ZWwgZGlzcGxheSByZWNhbGMncyB3b24ndCB3b3JrLi4uIHRoaXMgaXMgd2h5IGRwbSBub3RpZmllcnMKKyAqIHdvcmssIGlzcidzIG9mZiwgd2FsayBhIGxpc3Qgb2YgY2xvY2tzIGFscmVhZHkgX29mZl8gYW5kIG5vdCBtZXNzaW5nIHdpdGgKKyAqIHRoZSBidXMuCisgKgorICogVGhpcyBjbG9jayBzaG91bGQgaGF2ZSBubyBwYXJlbnQuIEl0IGVtYm9kaWVzIHRoZSBlbnRpcmUgdXBwZXIgbGV2ZWwKKyAqIGFjdGl2ZSBzZXQuIEEgcGFyZW50IHdpbGwgbWVzcyB1cCBzb21lIG9mIHRoZSBpbml0IGFsc28uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIHZpcnRfcHJjbV9zZXQgPSB7CisJLm5hbWUJCT0gInZpcnRfcHJjbV9zZXQiLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5mbGFncwkJPSBERUxBWUVEX0FQUCwKKwkucGFyZW50CQk9ICZtcHVfY2ssCS8qIEluZGV4ZWQgYnkgbXB1IHNwZWVkLCBubyBwYXJlbnQgKi8KKwkucmVjYWxjCQk9ICZvbWFwMl90YWJsZV9tcHVfcmVjYWxjLAkvKiBzZXRzIGFyZSBrZXllZCBvbiBtcHUgcmF0ZSAqLworCS5zZXRfcmF0ZQk9ICZvbWFwMl9zZWxlY3RfdGFibGVfcmF0ZSwKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9yb3VuZF90b190YWJsZV9yYXRlLAorfTsKKworCisvKgorICogY2xrZGV2IGludGVncmF0aW9uCisgKi8KKworc3RhdGljIHN0cnVjdCBvbWFwX2NsayBvbWFwMjR4eF9jbGtzW10gPSB7CisJLyogZXh0ZXJuYWwgcm9vdCBzb3VyY2VzICovCisJQ0xLKE5VTEwsCSJmdW5jXzMya19jayIsCSZmdW5jXzMya19jaywJQ0tfMjQzWCB8IENLXzI0MlgpLAorCUNMSyhOVUxMLAkic2VjdXJlXzMya19jayIsICZzZWN1cmVfMzJrX2NrLCBDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJvc2NfY2siLAkmb3NjX2NrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJzeXNfY2siLAkmc3lzX2NrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJhbHRfY2siLAkmYWx0X2NrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJLyogaW50ZXJuYWwgYW5hbG9nIHNvdXJjZXMgKi8KKwlDTEsoTlVMTCwJImRwbGxfY2siLAkmZHBsbF9jaywJQ0tfMjQzWCB8IENLXzI0MlgpLAorCUNMSyhOVUxMLAkiYXBsbDk2X2NrIiwJJmFwbGw5Nl9jaywJQ0tfMjQzWCB8IENLXzI0MlgpLAorCUNMSyhOVUxMLAkiYXBsbDU0X2NrIiwJJmFwbGw1NF9jaywJQ0tfMjQzWCB8IENLXzI0MlgpLAorCS8qIGludGVybmFsIHByY20gcm9vdCBzb3VyY2VzICovCisJQ0xLKE5VTEwsCSJmdW5jXzU0bV9jayIsCSZmdW5jXzU0bV9jaywJQ0tfMjQzWCB8IENLXzI0MlgpLAorCUNMSyhOVUxMLAkiY29yZV9jayIsCSZjb3JlX2NrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJmdW5jXzk2bV9jayIsCSZmdW5jXzk2bV9jaywJQ0tfMjQzWCB8IENLXzI0MlgpLAorCUNMSyhOVUxMLAkiZnVuY180OG1fY2siLAkmZnVuY180OG1fY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKKwlDTEsoTlVMTCwJImZ1bmNfMTJtX2NrIiwJJmZ1bmNfMTJtX2NrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJja193ZHQxX29zYyIsCSZ3ZHQxX29zY19jaywJQ0tfMjQzWCB8IENLXzI0MlgpLAorCUNMSyhOVUxMLAkic3lzX2Nsa291dF9zcmMiLCAmc3lzX2Nsa291dF9zcmMsIENLXzI0M1ggfCBDS18yNDJYKSwKKwlDTEsoTlVMTCwJInN5c19jbGtvdXQiLAkmc3lzX2Nsa291dCwJQ0tfMjQzWCB8IENLXzI0MlgpLAorCUNMSyhOVUxMLAkic3lzX2Nsa291dDJfc3JjIiwgJnN5c19jbGtvdXQyX3NyYywgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJzeXNfY2xrb3V0MiIsCSZzeXNfY2xrb3V0MiwJQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJlbXVsX2NrIiwJJmVtdWxfY2ssCUNLXzI0MlgpLAorCS8qIG1wdSBkb21haW4gY2xvY2tzICovCisJQ0xLKE5VTEwsCSJtcHVfY2siLAkmbXB1X2NrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJLyogZHNwIGRvbWFpbiBjbG9ja3MgKi8KKwlDTEsoTlVMTCwJImRzcF9mY2siLAkmZHNwX2ZjaywJQ0tfMjQzWCB8IENLXzI0MlgpLAorCUNMSyhOVUxMLAkiZHNwX2lyYXRlX2ljayIsICZkc3BfaXJhdGVfaWNrLCBDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJkc3BfaWNrIiwJJmRzcF9pY2ssCUNLXzI0MlgpLAorCUNMSyhOVUxMLAkiaXZhMl8xX2ljayIsCSZpdmEyXzFfaWNrLAlDS18yNDNYKSwKKwlDTEsoTlVMTCwJIml2YTFfaWZjayIsCSZpdmExX2lmY2ssCUNLXzI0MlgpLAorCUNMSyhOVUxMLAkiaXZhMV9tcHVfaW50X2lmY2siLCAmaXZhMV9tcHVfaW50X2lmY2ssIENLXzI0MlgpLAorCS8qIEdGWCBkb21haW4gY2xvY2tzICovCisJQ0xLKE5VTEwsCSJnZnhfM2RfZmNrIiwJJmdmeF8zZF9mY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKKwlDTEsoTlVMTCwJImdmeF8yZF9mY2siLAkmZ2Z4XzJkX2ZjaywJQ0tfMjQzWCB8IENLXzI0MlgpLAorCUNMSyhOVUxMLAkiZ2Z4X2ljayIsCSZnZnhfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJLyogTW9kZW0gZG9tYWluIGNsb2NrcyAqLworCUNMSyhOVUxMLAkibWRtX2ljayIsCSZtZG1faWNrLAlDS18yNDNYKSwKKwlDTEsoTlVMTCwJIm1kbV9vc2NfY2siLAkmbWRtX29zY19jaywJQ0tfMjQzWCksCisJLyogRFNTIGRvbWFpbiBjbG9ja3MgKi8KKwlDTEsoIm9tYXBkc3MiLAkiaWNrIiwJCSZkc3NfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKCJvbWFwZHNzIiwJImRzczFfZmNrIiwJJmRzczFfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKCJvbWFwZHNzIiwJImRzczJfZmNrIiwJJmRzczJfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKCJvbWFwZHNzIiwJInR2X2ZjayIsCSZkc3NfNTRtX2ZjaywJQ0tfMjQzWCB8IENLXzI0MlgpLAorCS8qIEwzIGRvbWFpbiBjbG9ja3MgKi8KKwlDTEsoTlVMTCwJImNvcmVfbDNfY2siLAkmY29yZV9sM19jaywJQ0tfMjQzWCB8IENLXzI0MlgpLAorCUNMSyhOVUxMLAkic3NpX2ZjayIsCSZzc2lfc3NyX3NzdF9mY2ssIENLXzI0M1ggfCBDS18yNDJYKSwKKwlDTEsoTlVMTCwJInVzYl9sNF9pY2siLAkmdXNiX2w0X2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAorCS8qIEw0IGRvbWFpbiBjbG9ja3MgKi8KKwlDTEsoTlVMTCwJImw0X2NrIiwJJmw0X2NrLAkJQ0tfMjQzWCB8IENLXzI0MlgpLAorCUNMSyhOVUxMLAkic3NpX2w0X2ljayIsCSZzc2lfbDRfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJLyogdmlydHVhbCBtZXRhLWdyb3VwIGNsb2NrICovCisJQ0xLKE5VTEwsCSJ2aXJ0X3ByY21fc2V0IiwgJnZpcnRfcHJjbV9zZXQsIENLXzI0M1ggfCBDS18yNDJYKSwKKwkvKiBnZW5lcmFsIGw0IGludGVyZmFjZSBjaywgbXVsdGktcGFyZW50IGZ1bmN0aW9uYWwgY2xrICovCisJQ0xLKE5VTEwsCSJncHQxX2ljayIsCSZncHQxX2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAorCUNMSyhOVUxMLAkiZ3B0MV9mY2siLAkmZ3B0MV9mY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKKwlDTEsoTlVMTCwJImdwdDJfaWNrIiwJJmdwdDJfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJncHQyX2ZjayIsCSZncHQyX2ZjaywJQ0tfMjQzWCB8IENLXzI0MlgpLAorCUNMSyhOVUxMLAkiZ3B0M19pY2siLAkmZ3B0M19pY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKKwlDTEsoTlVMTCwJImdwdDNfZmNrIiwJJmdwdDNfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJncHQ0X2ljayIsCSZncHQ0X2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAorCUNMSyhOVUxMLAkiZ3B0NF9mY2siLAkmZ3B0NF9mY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKKwlDTEsoTlVMTCwJImdwdDVfaWNrIiwJJmdwdDVfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJncHQ1X2ZjayIsCSZncHQ1X2ZjaywJQ0tfMjQzWCB8IENLXzI0MlgpLAorCUNMSyhOVUxMLAkiZ3B0Nl9pY2siLAkmZ3B0Nl9pY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKKwlDTEsoTlVMTCwJImdwdDZfZmNrIiwJJmdwdDZfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJncHQ3X2ljayIsCSZncHQ3X2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAorCUNMSyhOVUxMLAkiZ3B0N19mY2siLAkmZ3B0N19mY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKKwlDTEsoTlVMTCwJImdwdDhfaWNrIiwJJmdwdDhfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJncHQ4X2ZjayIsCSZncHQ4X2ZjaywJQ0tfMjQzWCB8IENLXzI0MlgpLAorCUNMSyhOVUxMLAkiZ3B0OV9pY2siLAkmZ3B0OV9pY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKKwlDTEsoTlVMTCwJImdwdDlfZmNrIiwJJmdwdDlfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJncHQxMF9pY2siLAkmZ3B0MTBfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJncHQxMF9mY2siLAkmZ3B0MTBfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJncHQxMV9pY2siLAkmZ3B0MTFfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJncHQxMV9mY2siLAkmZ3B0MTFfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJncHQxMl9pY2siLAkmZ3B0MTJfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJncHQxMl9mY2siLAkmZ3B0MTJfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKCJvbWFwLW1jYnNwLjEiLCAiaWNrIiwJJm1jYnNwMV9pY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKKwlDTEsoIm9tYXAtbWNic3AuMSIsICJmY2siLAkmbWNic3AxX2ZjaywJQ0tfMjQzWCB8IENLXzI0MlgpLAorCUNMSygib21hcC1tY2JzcC4yIiwgImljayIsCSZtY2JzcDJfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKCJvbWFwLW1jYnNwLjIiLCAiZmNrIiwJJm1jYnNwMl9mY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKKwlDTEsoIm9tYXAtbWNic3AuMyIsICJpY2siLAkmbWNic3AzX2ljaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwLW1jYnNwLjMiLCAiZmNrIiwJJm1jYnNwM19mY2ssCUNLXzI0M1gpLAorCUNMSygib21hcC1tY2JzcC40IiwgImljayIsCSZtY2JzcDRfaWNrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXAtbWNic3AuNCIsICJmY2siLAkmbWNic3A0X2ZjaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwLW1jYnNwLjUiLCAiaWNrIiwJJm1jYnNwNV9pY2ssCUNLXzI0M1gpLAorCUNMSygib21hcC1tY2JzcC41IiwgImZjayIsCSZtY2JzcDVfZmNrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXAyX21jc3BpLjEiLCAiaWNrIiwJJm1jc3BpMV9pY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKKwlDTEsoIm9tYXAyX21jc3BpLjEiLCAiZmNrIiwJJm1jc3BpMV9mY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKKwlDTEsoIm9tYXAyX21jc3BpLjIiLCAiaWNrIiwJJm1jc3BpMl9pY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKKwlDTEsoIm9tYXAyX21jc3BpLjIiLCAiZmNrIiwJJm1jc3BpMl9mY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKKwlDTEsoIm9tYXAyX21jc3BpLjMiLCAiaWNrIiwJJm1jc3BpM19pY2ssCUNLXzI0M1gpLAorCUNMSygib21hcDJfbWNzcGkuMyIsICJmY2siLAkmbWNzcGkzX2ZjaywJQ0tfMjQzWCksCisJQ0xLKE5VTEwsCSJ1YXJ0MV9pY2siLAkmdWFydDFfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJ1YXJ0MV9mY2siLAkmdWFydDFfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJ1YXJ0Ml9pY2siLAkmdWFydDJfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJ1YXJ0Ml9mY2siLAkmdWFydDJfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJ1YXJ0M19pY2siLAkmdWFydDNfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJ1YXJ0M19mY2siLAkmdWFydDNfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJncGlvc19pY2siLAkmZ3Bpb3NfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJncGlvc19mY2siLAkmZ3Bpb3NfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKCJvbWFwX3dkdCIsCSJpY2siLAkJJm1wdV93ZHRfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKCJvbWFwX3dkdCIsCSJmY2siLAkJJm1wdV93ZHRfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJzeW5jXzMya19pY2siLAkmc3luY18zMmtfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJ3ZHQxX2ljayIsCSZ3ZHQxX2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAorCUNMSyhOVUxMLAkib21hcGN0cmxfaWNrIiwJJm9tYXBjdHJsX2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAorCUNMSyhOVUxMLAkiaWNyX2ljayIsCSZpY3JfaWNrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXAyNHh4Y2FtIiwgImZjayIsCSZjYW1fZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKCJvbWFwMjR4eGNhbSIsICJpY2siLAkmY2FtX2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAorCUNMSyhOVUxMLAkibWFpbGJveGVzX2ljayIsICZtYWlsYm94ZXNfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJ3ZHQ0X2ljayIsCSZ3ZHQ0X2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAorCUNMSyhOVUxMLAkid2R0NF9mY2siLAkmd2R0NF9mY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKKwlDTEsoTlVMTCwJIndkdDNfaWNrIiwJJndkdDNfaWNrLAlDS18yNDJYKSwKKwlDTEsoTlVMTCwJIndkdDNfZmNrIiwJJndkdDNfZmNrLAlDS18yNDJYKSwKKwlDTEsoTlVMTCwJIm1zcHJvX2ljayIsCSZtc3Byb19pY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKKwlDTEsoTlVMTCwJIm1zcHJvX2ZjayIsCSZtc3Byb19mY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKKwlDTEsoIm1tY2ktb21hcC4wIiwgImljayIsCSZtbWNfaWNrLAlDS18yNDJYKSwKKwlDTEsoIm1tY2ktb21hcC4wIiwgImZjayIsCSZtbWNfZmNrLAlDS18yNDJYKSwKKwlDTEsoTlVMTCwJImZhY19pY2siLAkmZmFjX2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAorCUNMSyhOVUxMLAkiZmFjX2ZjayIsCSZmYWNfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJlYWNfaWNrIiwJJmVhY19pY2ssCUNLXzI0MlgpLAorCUNMSyhOVUxMLAkiZWFjX2ZjayIsCSZlYWNfZmNrLAlDS18yNDJYKSwKKwlDTEsoIm9tYXBfaGRxLjAiLCAiaWNrIiwJJmhkcV9pY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKKwlDTEsoIm9tYXBfaGRxLjEiLCAiZmNrIiwJJmhkcV9mY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKKwlDTEsoImkyY19vbWFwLjEiLCAiaWNrIiwJJmkyYzFfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKCJpMmNfb21hcC4xIiwgImZjayIsCSZpMmMxX2ZjaywJQ0tfMjQyWCksCisJQ0xLKCJpMmNfb21hcC4xIiwgImZjayIsCSZpMmNoczFfZmNrLAlDS18yNDNYKSwKKwlDTEsoImkyY19vbWFwLjIiLCAiaWNrIiwJJmkyYzJfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKCJpMmNfb21hcC4yIiwgImZjayIsCSZpMmMyX2ZjaywJQ0tfMjQyWCksCisJQ0xLKCJpMmNfb21hcC4yIiwgImZjayIsCSZpMmNoczJfZmNrLAlDS18yNDNYKSwKKwlDTEsoTlVMTCwJImdwbWNfZmNrIiwJJmdwbWNfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJzZG1hX2ZjayIsCSZzZG1hX2ZjaywJQ0tfMjQzWCB8IENLXzI0MlgpLAorCUNMSyhOVUxMLAkic2RtYV9pY2siLAkmc2RtYV9pY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKKwlDTEsoTlVMTCwJInZseW5xX2ljayIsCSZ2bHlucV9pY2ssCUNLXzI0MlgpLAorCUNMSyhOVUxMLAkidmx5bnFfZmNrIiwJJnZseW5xX2ZjaywJQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJzZHJjX2ljayIsCSZzZHJjX2ljaywJQ0tfMjQzWCksCisJQ0xLKE5VTEwsCSJkZXNfaWNrIiwJJmRlc19pY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKKwlDTEsoTlVMTCwJInNoYV9pY2siLAkmc2hhX2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAorCUNMSygib21hcF9ybmciLAkiaWNrIiwJCSZybmdfaWNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKE5VTEwsCSJhZXNfaWNrIiwJJmFlc19pY2ssCUNLXzI0M1ggfCBDS18yNDJYKSwKKwlDTEsoTlVMTCwJInBrYV9pY2siLAkmcGthX2ljaywJQ0tfMjQzWCB8IENLXzI0MlgpLAorCUNMSyhOVUxMLAkidXNiX2ZjayIsCSZ1c2JfZmNrLAlDS18yNDNYIHwgQ0tfMjQyWCksCisJQ0xLKCJtdXNiX2hkcmMiLAkiaWNrIiwJJnVzYmhzX2ljaywJQ0tfMjQzWCksCisJQ0xLKCJtbWNpLW9tYXAtaHMuMCIsICJpY2siLAkmbW1jaHMxX2ljaywJQ0tfMjQzWCksCisJQ0xLKCJtbWNpLW9tYXAtaHMuMCIsICJmY2siLAkmbW1jaHMxX2ZjaywJQ0tfMjQzWCksCisJQ0xLKCJtbWNpLW9tYXAtaHMuMSIsICJpY2siLAkmbW1jaHMyX2ljaywJQ0tfMjQzWCksCisJQ0xLKCJtbWNpLW9tYXAtaHMuMSIsICJmY2siLAkmbW1jaHMyX2ZjaywJQ0tfMjQzWCksCisJQ0xLKE5VTEwsCSJncGlvNV9pY2siLAkmZ3BpbzVfaWNrLAlDS18yNDNYKSwKKwlDTEsoTlVMTCwJImdwaW81X2ZjayIsCSZncGlvNV9mY2ssCUNLXzI0M1gpLAorCUNMSyhOVUxMLAkibWRtX2ludGNfaWNrIiwJJm1kbV9pbnRjX2ljaywJQ0tfMjQzWCksCisJQ0xLKCJtbWNpLW9tYXAtaHMuMCIsICJtbWNoc2RiX2ZjayIsCSZtbWNoc2RiMV9mY2ssCUNLXzI0M1gpLAorCUNMSygibW1jaS1vbWFwLWhzLjEiLCAibW1jaHNkYl9mY2siLCAJJm1tY2hzZGIyX2ZjaywJQ0tfMjQzWCksCit9OworCisvKgorICogaW5pdCBjb2RlCisgKi8KKworaW50IF9faW5pdCBvbWFwMl9jbGtfaW5pdCh2b2lkKQoreworCWNvbnN0IHN0cnVjdCBwcmNtX2NvbmZpZyAqcHJjbTsKKwlzdHJ1Y3Qgb21hcF9jbGsgKmM7CisJdTMyIGNsa3JhdGU7CisJdTE2IGNwdV9jbGtmbGc7CisKKwlpZiAoY3B1X2lzX29tYXAyNDJ4KCkpIHsKKwkJcHJjbV9jbGtzcmNfY3RybCA9IE9NQVAyNDIwX1BSQ01fQ0xLU1JDX0NUUkw7CisJCWNwdV9tYXNrID0gUkFURV9JTl8yNDJYOworCQljcHVfY2xrZmxnID0gQ0tfMjQyWDsKKwkJcmF0ZV90YWJsZSA9IG9tYXAyNDIwX3JhdGVfdGFibGU7CisJfSBlbHNlIGlmIChjcHVfaXNfb21hcDI0MzAoKSkgeworCQlwcmNtX2Nsa3NyY19jdHJsID0gT01BUDI0MzBfUFJDTV9DTEtTUkNfQ1RSTDsKKwkJY3B1X21hc2sgPSBSQVRFX0lOXzI0M1g7CisJCWNwdV9jbGtmbGcgPSBDS18yNDNYOworCQlyYXRlX3RhYmxlID0gb21hcDI0MzBfcmF0ZV90YWJsZTsKKwl9CisKKwljbGtfaW5pdCgmb21hcDJfY2xrX2Z1bmN0aW9ucyk7CisKKwlmb3IgKGMgPSBvbWFwMjR4eF9jbGtzOyBjIDwgb21hcDI0eHhfY2xrcyArIEFSUkFZX1NJWkUob21hcDI0eHhfY2xrcyk7IGMrKykKKwkJY2xrX3ByZWluaXQoYy0+bGsuY2xrKTsKKworCW9zY19jay5yYXRlID0gb21hcDJfb3NjX2Nsa19yZWNhbGMoJm9zY19jayk7CisJcHJvcGFnYXRlX3JhdGUoJm9zY19jayk7CisJc3lzX2NrLnJhdGUgPSBvbWFwMl9zeXNfY2xrX3JlY2FsYygmc3lzX2NrKTsKKwlwcm9wYWdhdGVfcmF0ZSgmc3lzX2NrKTsKKworCWZvciAoYyA9IG9tYXAyNHh4X2Nsa3M7IGMgPCBvbWFwMjR4eF9jbGtzICsgQVJSQVlfU0laRShvbWFwMjR4eF9jbGtzKTsgYysrKQorCQlpZiAoYy0+Y3B1ICYgY3B1X2Nsa2ZsZykgeworCQkJY2xrZGV2X2FkZCgmYy0+bGspOworCQkJY2xrX3JlZ2lzdGVyKGMtPmxrLmNsayk7CisJCQlvbWFwMl9pbml0X2Nsa19jbGtkbShjLT5say5jbGspOworCQl9CisKKwkvKiBDaGVjayB0aGUgTVBVIHJhdGUgc2V0IGJ5IGJvb3Rsb2FkZXIgKi8KKwljbGtyYXRlID0gb21hcDJ4eHhfY2xrX2dldF9jb3JlX3JhdGUoJmRwbGxfY2spOworCWZvciAocHJjbSA9IHJhdGVfdGFibGU7IHByY20tPm1wdV9zcGVlZDsgcHJjbSsrKSB7CisJCWlmICghKHByY20tPmZsYWdzICYgY3B1X21hc2spKQorCQkJY29udGludWU7CisJCWlmIChwcmNtLT54dGFsX3NwZWVkICE9IHN5c19jay5yYXRlKQorCQkJY29udGludWU7CisJCWlmIChwcmNtLT5kcGxsX3NwZWVkIDw9IGNsa3JhdGUpCisJCQlicmVhazsKKwl9CisJY3Vycl9wcmNtX3NldCA9IHByY207CisKKwlyZWNhbGN1bGF0ZV9yb290X2Nsb2NrcygpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiQ2xvY2tpbmcgcmF0ZSAoQ3J5c3RhbC9EUExML01QVSk6ICIKKwkgICAgICAgIiVsZC4lMDFsZC8lbGQvJWxkIE1IelxuIiwKKwkgICAgICAgKHN5c19jay5yYXRlIC8gMTAwMDAwMCksIChzeXNfY2sucmF0ZSAvIDEwMDAwMCkgJSAxMCwKKwkgICAgICAgKGRwbGxfY2sucmF0ZSAvIDEwMDAwMDApLCAobXB1X2NrLnJhdGUgLyAxMDAwMDAwKSkgOworCisJLyoKKwkgKiBPbmx5IGVuYWJsZSB0aG9zZSBjbG9ja3Mgd2Ugd2lsbCBuZWVkLCBsZXQgdGhlIGRyaXZlcnMKKwkgKiBlbmFibGUgb3RoZXIgY2xvY2tzIGFzIG5lY2Vzc2FyeQorCSAqLworCWNsa19lbmFibGVfaW5pdF9jbG9ja3MoKTsKKworCS8qIEF2b2lkIHNsZWVwaW5nIHNsZWVwaW5nIGR1cmluZyBvbWFwMl9jbGtfcHJlcGFyZV9mb3JfcmVib290KCkgKi8KKwl2Y2xrID0gY2xrX2dldChOVUxMLCAidmlydF9wcmNtX3NldCIpOworCXNjbGsgPSBjbGtfZ2V0KE5VTEwsICJzeXNfY2siKTsKKwlkY2xrID0gY2xrX2dldChOVUxMLCAiZHBsbF9jayIpOworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2szNHh4LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMzR4eC5jCmluZGV4IGVjYmI1Y2QuLmRlZDMyMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2szNHh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazM0eHguYwpAQCAtMzAsMzE0ICszMCwyMSBAQAogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgogI2luY2x1ZGUgPHBsYXQvc3JhbS5oPgorI2luY2x1ZGUgPHBsYXQvc2RyYy5oPgogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogI2luY2x1ZGUgPGFzbS9jbGtkZXYuaD4KIAogI2luY2x1ZGUgPHBsYXQvc2RyYy5oPgogI2luY2x1ZGUgImNsb2NrLmgiCisjaW5jbHVkZSAiY2xvY2szNHh4LmgiCisjaW5jbHVkZSAic2RyYy5oIgogI2luY2x1ZGUgInBybS5oIgogI2luY2x1ZGUgInBybS1yZWdiaXRzLTM0eHguaCIKICNpbmNsdWRlICJjbS5oIgogI2luY2x1ZGUgImNtLXJlZ2JpdHMtMzR4eC5oIgogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa29wcyBjbGtvcHNfbm9uY29yZV9kcGxsX29wczsKLQotc3RhdGljIHZvaWQgb21hcDM0MzBlczJfY2xrX3NzaV9maW5kX2lkbGVzdChzdHJ1Y3QgY2xrICpjbGssCi0JCQkJCSAgICB2b2lkIF9faW9tZW0gKippZGxlc3RfcmVnLAotCQkJCQkgICAgdTggKmlkbGVzdF9iaXQpOwotc3RhdGljIHZvaWQgb21hcDM0MzBlczJfY2xrX2hzb3RndXNiX2ZpbmRfaWRsZXN0KHN0cnVjdCBjbGsgKmNsaywKLQkJCQkJICAgIHZvaWQgX19pb21lbSAqKmlkbGVzdF9yZWcsCi0JCQkJCSAgICB1OCAqaWRsZXN0X2JpdCk7Ci1zdGF0aWMgdm9pZCBvbWFwMzQzMGVzMl9jbGtfZHNzX3VzYmhvc3RfZmluZF9pZGxlc3Qoc3RydWN0IGNsayAqY2xrLAotCQkJCQkJICAgIHZvaWQgX19pb21lbSAqKmlkbGVzdF9yZWcsCi0JCQkJCQkgICAgdTggKmlkbGVzdF9iaXQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa29wcyBjbGtvcHNfb21hcDM0MzBlczJfc3NpX3dhaXQgPSB7Ci0JLmVuYWJsZQkJPSBvbWFwMl9kZmx0X2Nsa19lbmFibGUsCi0JLmRpc2FibGUJPSBvbWFwMl9kZmx0X2Nsa19kaXNhYmxlLAotCS5maW5kX2lkbGVzdAk9IG9tYXAzNDMwZXMyX2Nsa19zc2lfZmluZF9pZGxlc3QsCi0JLmZpbmRfY29tcGFuaW9uID0gb21hcDJfY2xrX2RmbHRfZmluZF9jb21wYW5pb24sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa29wcyBjbGtvcHNfb21hcDM0MzBlczJfaHNvdGd1c2Jfd2FpdCA9IHsKLQkuZW5hYmxlCQk9IG9tYXAyX2RmbHRfY2xrX2VuYWJsZSwKLQkuZGlzYWJsZQk9IG9tYXAyX2RmbHRfY2xrX2Rpc2FibGUsCi0JLmZpbmRfaWRsZXN0CT0gb21hcDM0MzBlczJfY2xrX2hzb3RndXNiX2ZpbmRfaWRsZXN0LAotCS5maW5kX2NvbXBhbmlvbiA9IG9tYXAyX2Nsa19kZmx0X2ZpbmRfY29tcGFuaW9uLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtvcHMgY2xrb3BzX29tYXAzNDMwZXMyX2Rzc191c2Job3N0X3dhaXQgPSB7Ci0JLmVuYWJsZQkJPSBvbWFwMl9kZmx0X2Nsa19lbmFibGUsCi0JLmRpc2FibGUJPSBvbWFwMl9kZmx0X2Nsa19kaXNhYmxlLAotCS5maW5kX2lkbGVzdAk9IG9tYXAzNDMwZXMyX2Nsa19kc3NfdXNiaG9zdF9maW5kX2lkbGVzdCwKLQkuZmluZF9jb21wYW5pb24gPSBvbWFwMl9jbGtfZGZsdF9maW5kX2NvbXBhbmlvbiwKLX07Ci0KLSNpbmNsdWRlICJjbG9jazM0eHguaCIKLQotc3RydWN0IG9tYXBfY2xrIHsKLQl1MzIJCWNwdTsKLQlzdHJ1Y3QgY2xrX2xvb2t1cCBsazsKLX07Ci0KLSNkZWZpbmUgQ0xLKGRldiwgY29uLCBjaywgY3ApIAkJXAotCXsJCQkJXAotCQkgLmNwdSA9IGNwLAkJXAotCQkubGsgPSB7CQkJXAotCQkJLmRldl9pZCA9IGRldiwJXAotCQkJLmNvbl9pZCA9IGNvbiwJXAotCQkJLmNsayA9IGNrLAlcCi0JCX0sCQkJXAotCX0KLQotI2RlZmluZSBDS18zNDNYCQkoMSA8PCAwKQotI2RlZmluZSBDS18zNDMwRVMxCSgxIDw8IDEpCi0jZGVmaW5lIENLXzM0MzBFUzIJKDEgPDwgMikKLQotc3RhdGljIHN0cnVjdCBvbWFwX2NsayBvbWFwMzR4eF9jbGtzW10gPSB7Ci0JQ0xLKE5VTEwsCSJvbWFwXzMya19mY2siLAkmb21hcF8zMmtfZmNrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJInZpcnRfMTJtX2NrIiwJJnZpcnRfMTJtX2NrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJInZpcnRfMTNtX2NrIiwJJnZpcnRfMTNtX2NrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJInZpcnRfMTZfOG1fY2siLCAmdmlydF8xNl84bV9jaywgQ0tfMzQzMEVTMiksCi0JQ0xLKE5VTEwsCSJ2aXJ0XzE5XzJtX2NrIiwgJnZpcnRfMTlfMm1fY2ssIENLXzM0M1gpLAotCUNMSyhOVUxMLAkidmlydF8yNm1fY2siLAkmdmlydF8yNm1fY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkidmlydF8zOF80bV9jayIsICZ2aXJ0XzM4XzRtX2NrLCBDS18zNDNYKSwKLQlDTEsoTlVMTCwJIm9zY19zeXNfY2siLAkmb3NjX3N5c19jaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJzeXNfY2siLAkmc3lzX2NrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJInN5c19hbHRjbGsiLAkmc3lzX2FsdGNsaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJtY2JzcF9jbGtzIiwJJm1jYnNwX2Nsa3MsCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkic3lzX2Nsa291dDEiLAkmc3lzX2Nsa291dDEsCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkiZHBsbDFfY2siLAkmZHBsbDFfY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkiZHBsbDFfeDJfY2siLAkmZHBsbDFfeDJfY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkiZHBsbDFfeDJtMl9jayIsICZkcGxsMV94Mm0yX2NrLCBDS18zNDNYKSwKLQlDTEsoTlVMTCwJImRwbGwyX2NrIiwJJmRwbGwyX2NrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJImRwbGwyX20yX2NrIiwJJmRwbGwyX20yX2NrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJImRwbGwzX2NrIiwJJmRwbGwzX2NrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJImNvcmVfY2siLAkmY29yZV9jaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJkcGxsM194Ml9jayIsCSZkcGxsM194Ml9jaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJkcGxsM19tMl9jayIsCSZkcGxsM19tMl9jaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJkcGxsM19tMngyX2NrIiwgJmRwbGwzX20yeDJfY2ssIENLXzM0M1gpLAotCUNMSyhOVUxMLAkiZHBsbDNfbTNfY2siLAkmZHBsbDNfbTNfY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkiZHBsbDNfbTN4Ml9jayIsICZkcGxsM19tM3gyX2NrLCBDS18zNDNYKSwKLQlDTEsoImV0YiIsCSJlbXVfY29yZV9hbHdvbl9jayIsICZlbXVfY29yZV9hbHdvbl9jaywgQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJkcGxsNF9jayIsCSZkcGxsNF9jaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJkcGxsNF94Ml9jayIsCSZkcGxsNF94Ml9jaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJvbWFwXzk2bV9hbHdvbl9mY2siLCAmb21hcF85Nm1fYWx3b25fZmNrLCBDS18zNDNYKSwKLQlDTEsoTlVMTCwJIm9tYXBfOTZtX2ZjayIsCSZvbWFwXzk2bV9mY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkiY21fOTZtX2ZjayIsCSZjbV85Nm1fZmNrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJIm9tYXBfNTRtX2ZjayIsCSZvbWFwXzU0bV9mY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkib21hcF80OG1fZmNrIiwJJm9tYXBfNDhtX2ZjaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJvbWFwXzEybV9mY2siLAkmb21hcF8xMm1fZmNrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJImRwbGw0X20yX2NrIiwJJmRwbGw0X20yX2NrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJImRwbGw0X20yeDJfY2siLCAmZHBsbDRfbTJ4Ml9jaywgQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJkcGxsNF9tM19jayIsCSZkcGxsNF9tM19jaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJkcGxsNF9tM3gyX2NrIiwgJmRwbGw0X20zeDJfY2ssIENLXzM0M1gpLAotCUNMSyhOVUxMLAkiZHBsbDRfbTRfY2siLAkmZHBsbDRfbTRfY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkiZHBsbDRfbTR4Ml9jayIsICZkcGxsNF9tNHgyX2NrLCBDS18zNDNYKSwKLQlDTEsoTlVMTCwJImRwbGw0X201X2NrIiwJJmRwbGw0X201X2NrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJImRwbGw0X201eDJfY2siLCAmZHBsbDRfbTV4Ml9jaywgQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJkcGxsNF9tNl9jayIsCSZkcGxsNF9tNl9jaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJkcGxsNF9tNngyX2NrIiwgJmRwbGw0X202eDJfY2ssIENLXzM0M1gpLAotCUNMSygiZXRiIiwJImVtdV9wZXJfYWx3b25fY2siLCAmZW11X3Blcl9hbHdvbl9jaywgQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJkcGxsNV9jayIsCSZkcGxsNV9jaywJQ0tfMzQzMEVTMiksCi0JQ0xLKE5VTEwsCSJkcGxsNV9tMl9jayIsCSZkcGxsNV9tMl9jaywJQ0tfMzQzMEVTMiksCi0JQ0xLKE5VTEwsCSJjbGtvdXQyX3NyY19jayIsICZjbGtvdXQyX3NyY19jaywgQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJzeXNfY2xrb3V0MiIsCSZzeXNfY2xrb3V0MiwJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJjb3JleDJfZmNrIiwJJmNvcmV4Ml9mY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkiZHBsbDFfZmNrIiwJJmRwbGwxX2ZjaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJtcHVfY2siLAkmbXB1X2NrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJImFybV9mY2siLAkmYXJtX2ZjaywJQ0tfMzQzWCksCi0JQ0xLKCJldGIiLAkiZW11X21wdV9hbHdvbl9jayIsICZlbXVfbXB1X2Fsd29uX2NrLCBDS18zNDNYKSwKLQlDTEsoTlVMTCwJImRwbGwyX2ZjayIsCSZkcGxsMl9mY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkiaXZhMl9jayIsCSZpdmEyX2NrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJImwzX2ljayIsCSZsM19pY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkibDRfaWNrIiwJJmw0X2ljaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJybV9pY2siLAkmcm1faWNrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJImdmeF9sM19jayIsCSZnZnhfbDNfY2ssCUNLXzM0MzBFUzEpLAotCUNMSyhOVUxMLAkiZ2Z4X2wzX2ZjayIsCSZnZnhfbDNfZmNrLAlDS18zNDMwRVMxKSwKLQlDTEsoTlVMTCwJImdmeF9sM19pY2siLAkmZ2Z4X2wzX2ljaywJQ0tfMzQzMEVTMSksCi0JQ0xLKE5VTEwsCSJnZnhfY2cxX2NrIiwJJmdmeF9jZzFfY2ssCUNLXzM0MzBFUzEpLAotCUNMSyhOVUxMLAkiZ2Z4X2NnMl9jayIsCSZnZnhfY2cyX2NrLAlDS18zNDMwRVMxKSwKLQlDTEsoTlVMTCwJInNneF9mY2siLAkmc2d4X2ZjaywJQ0tfMzQzMEVTMiksCi0JQ0xLKE5VTEwsCSJzZ3hfaWNrIiwJJnNneF9pY2ssCUNLXzM0MzBFUzIpLAotCUNMSyhOVUxMLAkiZDJkXzI2bV9mY2siLAkmZDJkXzI2bV9mY2ssCUNLXzM0MzBFUzEpLAotCUNMSyhOVUxMLAkibW9kZW1fZmNrIiwJJm1vZGVtX2ZjaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJzYWQyZF9pY2siLAkmc2FkMmRfaWNrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJIm1hZDJkX2ljayIsCSZtYWQyZF9pY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkiZ3B0MTBfZmNrIiwJJmdwdDEwX2ZjaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJncHQxMV9mY2siLAkmZ3B0MTFfZmNrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJImNwZWZ1c2VfZmNrIiwJJmNwZWZ1c2VfZmNrLAlDS18zNDMwRVMyKSwKLQlDTEsoTlVMTCwJInRzX2ZjayIsCSZ0c19mY2ssCUNLXzM0MzBFUzIpLAotCUNMSyhOVUxMLAkidXNidGxsX2ZjayIsCSZ1c2J0bGxfZmNrLAlDS18zNDMwRVMyKSwKLQlDTEsoTlVMTCwJImNvcmVfOTZtX2ZjayIsCSZjb3JlXzk2bV9mY2ssCUNLXzM0M1gpLAotCUNMSygibW1jaS1vbWFwLWhzLjIiLAkiZmNrIiwJJm1tY2hzM19mY2ssCUNLXzM0MzBFUzIpLAotCUNMSygibW1jaS1vbWFwLWhzLjEiLAkiZmNrIiwJJm1tY2hzMl9mY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkibXNwcm9fZmNrIiwJJm1zcHJvX2ZjaywJQ0tfMzQzWCksCi0JQ0xLKCJtbWNpLW9tYXAtaHMuMCIsCSJmY2siLAkmbW1jaHMxX2ZjaywJQ0tfMzQzWCksCi0JQ0xLKCJpMmNfb21hcC4zIiwgImZjayIsCSZpMmMzX2ZjaywJQ0tfMzQzWCksCi0JQ0xLKCJpMmNfb21hcC4yIiwgImZjayIsCSZpMmMyX2ZjaywJQ0tfMzQzWCksCi0JQ0xLKCJpMmNfb21hcC4xIiwgImZjayIsCSZpMmMxX2ZjaywJQ0tfMzQzWCksCi0JQ0xLKCJvbWFwLW1jYnNwLjUiLCAiZmNrIiwJJm1jYnNwNV9mY2ssCUNLXzM0M1gpLAotCUNMSygib21hcC1tY2JzcC4xIiwgImZjayIsCSZtY2JzcDFfZmNrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJImNvcmVfNDhtX2ZjayIsCSZjb3JlXzQ4bV9mY2ssCUNLXzM0M1gpLAotCUNMSygib21hcDJfbWNzcGkuNCIsICJmY2siLAkmbWNzcGk0X2ZjaywJQ0tfMzQzWCksCi0JQ0xLKCJvbWFwMl9tY3NwaS4zIiwgImZjayIsCSZtY3NwaTNfZmNrLAlDS18zNDNYKSwKLQlDTEsoIm9tYXAyX21jc3BpLjIiLCAiZmNrIiwJJm1jc3BpMl9mY2ssCUNLXzM0M1gpLAotCUNMSygib21hcDJfbWNzcGkuMSIsICJmY2siLAkmbWNzcGkxX2ZjaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJ1YXJ0Ml9mY2siLAkmdWFydDJfZmNrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJInVhcnQxX2ZjayIsCSZ1YXJ0MV9mY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkiZnNob3N0dXNiX2ZjayIsICZmc2hvc3R1c2JfZmNrLCBDS18zNDMwRVMxKSwKLQlDTEsoTlVMTCwJImNvcmVfMTJtX2ZjayIsCSZjb3JlXzEybV9mY2ssCUNLXzM0M1gpLAotCUNMSygib21hcF9oZHEuMCIsICJmY2siLAkmaGRxX2ZjaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJzc2lfc3NyX2ZjayIsCSZzc2lfc3NyX2Zja18zNDMwZXMxLAlDS18zNDMwRVMxKSwKLQlDTEsoTlVMTCwJInNzaV9zc3JfZmNrIiwJJnNzaV9zc3JfZmNrXzM0MzBlczIsCUNLXzM0MzBFUzIpLAotCUNMSyhOVUxMLAkic3NpX3NzdF9mY2siLAkmc3NpX3NzdF9mY2tfMzQzMGVzMSwJQ0tfMzQzMEVTMSksCi0JQ0xLKE5VTEwsCSJzc2lfc3N0X2ZjayIsCSZzc2lfc3N0X2Zja18zNDMwZXMyLAlDS18zNDMwRVMyKSwKLQlDTEsoTlVMTCwJImNvcmVfbDNfaWNrIiwJJmNvcmVfbDNfaWNrLAlDS18zNDNYKSwKLQlDTEsoIm11c2JfaGRyYyIsCSJpY2siLAkmaHNvdGd1c2JfaWNrXzM0MzBlczEsCUNLXzM0MzBFUzEpLAotCUNMSygibXVzYl9oZHJjIiwJImljayIsCSZoc290Z3VzYl9pY2tfMzQzMGVzMiwJQ0tfMzQzMEVTMiksCi0JQ0xLKE5VTEwsCSJzZHJjX2ljayIsCSZzZHJjX2ljaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJncG1jX2ZjayIsCSZncG1jX2ZjaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJzZWN1cml0eV9sM19pY2siLCAmc2VjdXJpdHlfbDNfaWNrLCBDS18zNDNYKSwKLQlDTEsoTlVMTCwJInBrYV9pY2siLAkmcGthX2ljaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJjb3JlX2w0X2ljayIsCSZjb3JlX2w0X2ljaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJ1c2J0bGxfaWNrIiwJJnVzYnRsbF9pY2ssCUNLXzM0MzBFUzIpLAotCUNMSygibW1jaS1vbWFwLWhzLjIiLAkiaWNrIiwJJm1tY2hzM19pY2ssCUNLXzM0MzBFUzIpLAotCUNMSyhOVUxMLAkiaWNyX2ljayIsCSZpY3JfaWNrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJImFlczJfaWNrIiwJJmFlczJfaWNrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJInNoYTEyX2ljayIsCSZzaGExMl9pY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkiZGVzMl9pY2siLAkmZGVzMl9pY2ssCUNLXzM0M1gpLAotCUNMSygibW1jaS1vbWFwLWhzLjEiLAkiaWNrIiwJJm1tY2hzMl9pY2ssCUNLXzM0M1gpLAotCUNMSygibW1jaS1vbWFwLWhzLjAiLAkiaWNrIiwJJm1tY2hzMV9pY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkibXNwcm9faWNrIiwJJm1zcHJvX2ljaywJQ0tfMzQzWCksCi0JQ0xLKCJvbWFwX2hkcS4wIiwgImljayIsCSZoZHFfaWNrLAlDS18zNDNYKSwKLQlDTEsoIm9tYXAyX21jc3BpLjQiLCAiaWNrIiwJJm1jc3BpNF9pY2ssCUNLXzM0M1gpLAotCUNMSygib21hcDJfbWNzcGkuMyIsICJpY2siLAkmbWNzcGkzX2ljaywJQ0tfMzQzWCksCi0JQ0xLKCJvbWFwMl9tY3NwaS4yIiwgImljayIsCSZtY3NwaTJfaWNrLAlDS18zNDNYKSwKLQlDTEsoIm9tYXAyX21jc3BpLjEiLCAiaWNrIiwJJm1jc3BpMV9pY2ssCUNLXzM0M1gpLAotCUNMSygiaTJjX29tYXAuMyIsICJpY2siLAkmaTJjM19pY2ssCUNLXzM0M1gpLAotCUNMSygiaTJjX29tYXAuMiIsICJpY2siLAkmaTJjMl9pY2ssCUNLXzM0M1gpLAotCUNMSygiaTJjX29tYXAuMSIsICJpY2siLAkmaTJjMV9pY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkidWFydDJfaWNrIiwJJnVhcnQyX2ljaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJ1YXJ0MV9pY2siLAkmdWFydDFfaWNrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJImdwdDExX2ljayIsCSZncHQxMV9pY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkiZ3B0MTBfaWNrIiwJJmdwdDEwX2ljaywJQ0tfMzQzWCksCi0JQ0xLKCJvbWFwLW1jYnNwLjUiLCAiaWNrIiwJJm1jYnNwNV9pY2ssCUNLXzM0M1gpLAotCUNMSygib21hcC1tY2JzcC4xIiwgImljayIsCSZtY2JzcDFfaWNrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJImZhY19pY2siLAkmZmFjX2ljaywJQ0tfMzQzMEVTMSksCi0JQ0xLKE5VTEwsCSJtYWlsYm94ZXNfaWNrIiwgJm1haWxib3hlc19pY2ssIENLXzM0M1gpLAotCUNMSyhOVUxMLAkib21hcGN0cmxfaWNrIiwJJm9tYXBjdHJsX2ljaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJzc2lfbDRfaWNrIiwJJnNzaV9sNF9pY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkic3NpX2ljayIsCSZzc2lfaWNrXzM0MzBlczEsCUNLXzM0MzBFUzEpLAotCUNMSyhOVUxMLAkic3NpX2ljayIsCSZzc2lfaWNrXzM0MzBlczIsCUNLXzM0MzBFUzIpLAotCUNMSyhOVUxMLAkidXNiX2w0X2ljayIsCSZ1c2JfbDRfaWNrLAlDS18zNDMwRVMxKSwKLQlDTEsoTlVMTCwJInNlY3VyaXR5X2w0X2ljazIiLCAmc2VjdXJpdHlfbDRfaWNrMiwgQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJhZXMxX2ljayIsCSZhZXMxX2ljaywJQ0tfMzQzWCksCi0JQ0xLKCJvbWFwX3JuZyIsCSJpY2siLAkJJnJuZ19pY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkic2hhMTFfaWNrIiwJJnNoYTExX2ljaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJkZXMxX2ljayIsCSZkZXMxX2ljaywJQ0tfMzQzWCksCi0JQ0xLKCJvbWFwZHNzIiwJImRzczFfZmNrIiwJJmRzczFfYWx3b25fZmNrXzM0MzBlczEsIENLXzM0MzBFUzEpLAotCUNMSygib21hcGRzcyIsCSJkc3MxX2ZjayIsCSZkc3MxX2Fsd29uX2Zja18zNDMwZXMyLCBDS18zNDMwRVMyKSwKLQlDTEsoIm9tYXBkc3MiLAkidHZfZmNrIiwJJmRzc190dl9mY2ssCUNLXzM0M1gpLAotCUNMSygib21hcGRzcyIsCSJ2aWRlb19mY2siLAkmZHNzXzk2bV9mY2ssCUNLXzM0M1gpLAotCUNMSygib21hcGRzcyIsCSJkc3MyX2ZjayIsCSZkc3MyX2Fsd29uX2ZjaywgQ0tfMzQzWCksCi0JQ0xLKCJvbWFwZHNzIiwJImljayIsCQkmZHNzX2lja18zNDMwZXMxLAlDS18zNDMwRVMxKSwKLQlDTEsoIm9tYXBkc3MiLAkiaWNrIiwJCSZkc3NfaWNrXzM0MzBlczIsCUNLXzM0MzBFUzIpLAotCUNMSyhOVUxMLAkiY2FtX21jbGsiLAkmY2FtX21jbGssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkiY2FtX2ljayIsCSZjYW1faWNrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJImNzaTJfOTZtX2ZjayIsCSZjc2kyXzk2bV9mY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkidXNiaG9zdF8xMjBtX2ZjayIsICZ1c2Job3N0XzEyMG1fZmNrLCBDS18zNDMwRVMyKSwKLQlDTEsoTlVMTCwJInVzYmhvc3RfNDhtX2ZjayIsICZ1c2Job3N0XzQ4bV9mY2ssIENLXzM0MzBFUzIpLAotCUNMSyhOVUxMLAkidXNiaG9zdF9pY2siLAkmdXNiaG9zdF9pY2ssCUNLXzM0MzBFUzIpLAotCUNMSyhOVUxMLAkidXNpbV9mY2siLAkmdXNpbV9mY2ssCUNLXzM0MzBFUzIpLAotCUNMSyhOVUxMLAkiZ3B0MV9mY2siLAkmZ3B0MV9mY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkid2t1cF8zMmtfZmNrIiwJJndrdXBfMzJrX2ZjaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJncGlvMV9kYmNrIiwJJmdwaW8xX2RiY2ssCUNLXzM0M1gpLAotCUNMSygib21hcF93ZHQiLAkiZmNrIiwJCSZ3ZHQyX2ZjaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJ3a3VwX2w0X2ljayIsCSZ3a3VwX2w0X2ljaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJ1c2ltX2ljayIsCSZ1c2ltX2ljaywJQ0tfMzQzMEVTMiksCi0JQ0xLKCJvbWFwX3dkdCIsCSJpY2siLAkJJndkdDJfaWNrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJIndkdDFfaWNrIiwJJndkdDFfaWNrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJImdwaW8xX2ljayIsCSZncGlvMV9pY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkib21hcF8zMmtzeW5jX2ljayIsICZvbWFwXzMya3N5bmNfaWNrLCBDS18zNDNYKSwKLQlDTEsoTlVMTCwJImdwdDEyX2ljayIsCSZncHQxMl9pY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkiZ3B0MV9pY2siLAkmZ3B0MV9pY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkicGVyXzk2bV9mY2siLAkmcGVyXzk2bV9mY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkicGVyXzQ4bV9mY2siLAkmcGVyXzQ4bV9mY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkidWFydDNfZmNrIiwJJnVhcnQzX2ZjaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJncHQyX2ZjayIsCSZncHQyX2ZjaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJncHQzX2ZjayIsCSZncHQzX2ZjaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJncHQ0X2ZjayIsCSZncHQ0X2ZjaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJncHQ1X2ZjayIsCSZncHQ1X2ZjaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJncHQ2X2ZjayIsCSZncHQ2X2ZjaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJncHQ3X2ZjayIsCSZncHQ3X2ZjaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJncHQ4X2ZjayIsCSZncHQ4X2ZjaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJncHQ5X2ZjayIsCSZncHQ5X2ZjaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJwZXJfMzJrX2Fsd29uX2ZjayIsICZwZXJfMzJrX2Fsd29uX2ZjaywgQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJncGlvNl9kYmNrIiwJJmdwaW82X2RiY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkiZ3BpbzVfZGJjayIsCSZncGlvNV9kYmNrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJImdwaW80X2RiY2siLAkmZ3BpbzRfZGJjaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJncGlvM19kYmNrIiwJJmdwaW8zX2RiY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkiZ3BpbzJfZGJjayIsCSZncGlvMl9kYmNrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJIndkdDNfZmNrIiwJJndkdDNfZmNrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJInBlcl9sNF9pY2siLAkmcGVyX2w0X2ljaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJncGlvNl9pY2siLAkmZ3BpbzZfaWNrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJImdwaW81X2ljayIsCSZncGlvNV9pY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkiZ3BpbzRfaWNrIiwJJmdwaW80X2ljaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJncGlvM19pY2siLAkmZ3BpbzNfaWNrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJImdwaW8yX2ljayIsCSZncGlvMl9pY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkid2R0M19pY2siLAkmd2R0M19pY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkidWFydDNfaWNrIiwJJnVhcnQzX2ljaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJncHQ5X2ljayIsCSZncHQ5X2ljaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJncHQ4X2ljayIsCSZncHQ4X2ljaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJncHQ3X2ljayIsCSZncHQ3X2ljaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJncHQ2X2ljayIsCSZncHQ2X2ljaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJncHQ1X2ljayIsCSZncHQ1X2ljaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJncHQ0X2ljayIsCSZncHQ0X2ljaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJncHQzX2ljayIsCSZncHQzX2ljaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJncHQyX2ljayIsCSZncHQyX2ljaywJQ0tfMzQzWCksCi0JQ0xLKCJvbWFwLW1jYnNwLjIiLCAiaWNrIiwJJm1jYnNwMl9pY2ssCUNLXzM0M1gpLAotCUNMSygib21hcC1tY2JzcC4zIiwgImljayIsCSZtY2JzcDNfaWNrLAlDS18zNDNYKSwKLQlDTEsoIm9tYXAtbWNic3AuNCIsICJpY2siLAkmbWNic3A0X2ljaywJQ0tfMzQzWCksCi0JQ0xLKCJvbWFwLW1jYnNwLjIiLCAiZmNrIiwJJm1jYnNwMl9mY2ssCUNLXzM0M1gpLAotCUNMSygib21hcC1tY2JzcC4zIiwgImZjayIsCSZtY2JzcDNfZmNrLAlDS18zNDNYKSwKLQlDTEsoIm9tYXAtbWNic3AuNCIsICJmY2siLAkmbWNic3A0X2ZjaywJQ0tfMzQzWCksCi0JQ0xLKCJldGIiLAkiZW11X3NyY19jayIsCSZlbXVfc3JjX2NrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJInBjbGtfZmNrIiwJJnBjbGtfZmNrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJInBjbGt4Ml9mY2siLAkmcGNsa3gyX2ZjaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJhdGNsa19mY2siLAkmYXRjbGtfZmNrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJInRyYWNlY2xrX3NyY19mY2siLCAmdHJhY2VjbGtfc3JjX2ZjaywgQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJ0cmFjZWNsa19mY2siLAkmdHJhY2VjbGtfZmNrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJInNyMV9mY2siLAkmc3IxX2ZjaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJzcjJfZmNrIiwJJnNyMl9mY2ssCUNLXzM0M1gpLAotCUNMSyhOVUxMLAkic3JfbDRfaWNrIiwJJnNyX2w0X2ljaywJQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJzZWN1cmVfMzJrX2ZjayIsICZzZWN1cmVfMzJrX2ZjaywgQ0tfMzQzWCksCi0JQ0xLKE5VTEwsCSJncHQxMl9mY2siLAkmZ3B0MTJfZmNrLAlDS18zNDNYKSwKLQlDTEsoTlVMTCwJIndkdDFfZmNrIiwJJndkdDFfZmNrLAlDS18zNDNYKSwKLX07Ci0KLS8qIENNX0FVVE9JRExFX1BMTCouQVVUT18qIGJpdCB2YWx1ZXMgKi8KLSNkZWZpbmUgRFBMTF9BVVRPSURMRV9ESVNBQkxFCQkJMHgwCi0jZGVmaW5lIERQTExfQVVUT0lETEVfTE9XX1BPV0VSX1NUT1AJCTB4MQotCi0jZGVmaW5lIE1BWF9EUExMX1dBSVRfVFJJRVMJCTEwMDAwMDAKLQotI2RlZmluZSBNSU5fU0RSQ19ETExfTE9DS19GUkVRCQk4MzAwMDAwMAotCiAjZGVmaW5lIENZQ0xFU19QRVJfTUhaCQkJMTAwMDAwMAogCi0vKiBTY2FsZSBmYWN0b3IgZm9yIGZpeGVkLXBvaW50IGFyaXRoIGluIG9tYXAzX2NvcmVfZHBsbF9tMl9zZXRfcmF0ZSgpICovCi0jZGVmaW5lIFNEUkNfTVBVUkFURV9TQ0FMRQkJOAotCi0vKiAyXlNEUkNfTVBVUkFURV9CQVNFX1NISUZUOiBNUFUgTUh6IHRoYXQgU0RSQ19NUFVSQVRFX0xPT1BTIGlzIGRlZmluZWQgZm9yICovCi0jZGVmaW5lIFNEUkNfTVBVUkFURV9CQVNFX1NISUZUCQk5Ci0KLS8qCi0gKiBTRFJDX01QVVJBVEVfTE9PUFM6IE51bWJlciBvZiBNUFUgbG9vcHMgdG8gZXhlY3V0ZSBhdAotICogMl5NUFVSQVRFX0JBU0VfU0hJRlQgTUh6IGZvciBTRFJDIHRvIHN0YWJpbGl6ZQotICovCi0jZGVmaW5lIFNEUkNfTVBVUkFURV9MT09QUwkJOTYKLQogLyoKICAqIERQTEw1X0ZSRVFfRk9SX1VTQkhPU1Q6IFVTQkhPU1QgYW5kIFVTQlRMTCBhcmUgdGhlIG9ubHkgY2xvY2tzCiAgKiB0aGF0IGFyZSBzb3VyY2VkIGJ5IERQTEw1LCBhbmQgYm90aCBvZiB0aGVzZSByZXF1aXJlIHRoaXMgY2xvY2sKQEAgLTM0NSw2ICs1Miw5IEBACiAgKi8KICNkZWZpbmUgRFBMTDVfRlJFUV9GT1JfVVNCSE9TVAkJMTIwMDAwMDAwCiAKKy8qIG5lZWRlZCBieSBvbWFwM19jb3JlX2RwbGxfbTJfc2V0X3JhdGUoKSAqLworc3RydWN0IGNsayAqc2RyY19pY2tfcCwgKmFybV9mY2tfcDsKKwogLyoqCiAgKiBvbWFwMzQzMGVzMl9jbGtfc3NpX2ZpbmRfaWRsZXN0IC0gcmV0dXJuIENNX0lETEVTVCBpbmZvIGZvciBTU0kKICAqIEBjbGs6IHN0cnVjdCBjbGsgKiBiZWluZyBlbmFibGVkCkBAIC0zNjYsNiArNzYsMTMgQEAKIAkqaWRsZXN0X2JpdCA9IE9NQVAzNDMwRVMyX1NUX1NTSV9JRExFX1NISUZUOwogfQogCitjb25zdCBzdHJ1Y3QgY2xrb3BzIGNsa29wc19vbWFwMzQzMGVzMl9zc2lfd2FpdCA9IHsKKwkuZW5hYmxlCQk9IG9tYXAyX2RmbHRfY2xrX2VuYWJsZSwKKwkuZGlzYWJsZQk9IG9tYXAyX2RmbHRfY2xrX2Rpc2FibGUsCisJLmZpbmRfaWRsZXN0CT0gb21hcDM0MzBlczJfY2xrX3NzaV9maW5kX2lkbGVzdCwKKwkuZmluZF9jb21wYW5pb24gPSBvbWFwMl9jbGtfZGZsdF9maW5kX2NvbXBhbmlvbiwKK307CisKIC8qKgogICogb21hcDM0MzBlczJfY2xrX2Rzc191c2Job3N0X2ZpbmRfaWRsZXN0IC0gQ01fSURMRVNUIGluZm8gZm9yIERTUywgVVNCSE9TVAogICogQGNsazogc3RydWN0IGNsayAqIGJlaW5nIGVuYWJsZWQKQEAgLTM5MSw2ICsxMDgsMTMgQEAKIAkqaWRsZXN0X2JpdCA9IE9NQVAzNDMwRVMyX1NUX0RTU19JRExFX1NISUZUOwogfQogCitjb25zdCBzdHJ1Y3QgY2xrb3BzIGNsa29wc19vbWFwMzQzMGVzMl9kc3NfdXNiaG9zdF93YWl0ID0geworCS5lbmFibGUJCT0gb21hcDJfZGZsdF9jbGtfZW5hYmxlLAorCS5kaXNhYmxlCT0gb21hcDJfZGZsdF9jbGtfZGlzYWJsZSwKKwkuZmluZF9pZGxlc3QJPSBvbWFwMzQzMGVzMl9jbGtfZHNzX3VzYmhvc3RfZmluZF9pZGxlc3QsCisJLmZpbmRfY29tcGFuaW9uID0gb21hcDJfY2xrX2RmbHRfZmluZF9jb21wYW5pb24sCit9OworCiAvKioKICAqIG9tYXAzNDMwZXMyX2Nsa19oc290Z3VzYl9maW5kX2lkbGVzdCAtIHJldHVybiBDTV9JRExFU1QgaW5mbyBmb3IgSFNPVEdVU0IKICAqIEBjbGs6IHN0cnVjdCBjbGsgKiBiZWluZyBlbmFibGVkCkBAIC00MTIsMzk1ICsxMzYsMTkgQEAKIAkqaWRsZXN0X2JpdCA9IE9NQVAzNDMwRVMyX1NUX0hTT1RHVVNCX0lETEVfU0hJRlQ7CiB9CiAKLS8qKgotICogb21hcDNfZHBsbF9yZWNhbGMgLSByZWNhbGN1bGF0ZSBEUExMIHJhdGUKLSAqIEBjbGs6IERQTEwgc3RydWN0IGNsawotICoKLSAqIFJlY2FsY3VsYXRlIGFuZCBwcm9wYWdhdGUgdGhlIERQTEwgcmF0ZS4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgb21hcDNfZHBsbF9yZWNhbGMoc3RydWN0IGNsayAqY2xrKQotewotCXJldHVybiBvbWFwMl9nZXRfZHBsbF9yYXRlKGNsayk7Ci19Citjb25zdCBzdHJ1Y3QgY2xrb3BzIGNsa29wc19vbWFwMzQzMGVzMl9oc290Z3VzYl93YWl0ID0geworCS5lbmFibGUJCT0gb21hcDJfZGZsdF9jbGtfZW5hYmxlLAorCS5kaXNhYmxlCT0gb21hcDJfZGZsdF9jbGtfZGlzYWJsZSwKKwkuZmluZF9pZGxlc3QJPSBvbWFwMzQzMGVzMl9jbGtfaHNvdGd1c2JfZmluZF9pZGxlc3QsCisJLmZpbmRfY29tcGFuaW9uID0gb21hcDJfY2xrX2RmbHRfZmluZF9jb21wYW5pb24sCit9OwogCi0vKiBfb21hcDNfZHBsbF93cml0ZV9jbGtlbiAtIHdyaXRlIGNsa2VuX2JpdHMgYXJnIHRvIGEgRFBMTCdzIGVuYWJsZSBiaXRzICovCi1zdGF0aWMgdm9pZCBfb21hcDNfZHBsbF93cml0ZV9jbGtlbihzdHJ1Y3QgY2xrICpjbGssIHU4IGNsa2VuX2JpdHMpCi17Ci0JY29uc3Qgc3RydWN0IGRwbGxfZGF0YSAqZGQ7Ci0JdTMyIHY7Citjb25zdCBzdHJ1Y3QgY2xrb3BzIGNsa29wc19ub25jb3JlX2RwbGxfb3BzID0geworCS5lbmFibGUJCT0gb21hcDNfbm9uY29yZV9kcGxsX2VuYWJsZSwKKwkuZGlzYWJsZQk9IG9tYXAzX25vbmNvcmVfZHBsbF9kaXNhYmxlLAorfTsKIAotCWRkID0gY2xrLT5kcGxsX2RhdGE7Ci0KLQl2ID0gX19yYXdfcmVhZGwoZGQtPmNvbnRyb2xfcmVnKTsKLQl2ICY9IH5kZC0+ZW5hYmxlX21hc2s7Ci0JdiB8PSBjbGtlbl9iaXRzIDw8IF9fZmZzKGRkLT5lbmFibGVfbWFzayk7Ci0JX19yYXdfd3JpdGVsKHYsIGRkLT5jb250cm9sX3JlZyk7Ci19Ci0KLS8qIF9vbWFwM193YWl0X2RwbGxfc3RhdHVzOiB3YWl0IGZvciBhIERQTEwgdG8gZW50ZXIgYSBzcGVjaWZpYyBzdGF0ZSAqLwotc3RhdGljIGludCBfb21hcDNfd2FpdF9kcGxsX3N0YXR1cyhzdHJ1Y3QgY2xrICpjbGssIHU4IHN0YXRlKQotewotCWNvbnN0IHN0cnVjdCBkcGxsX2RhdGEgKmRkOwotCWludCBpID0gMDsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQotCWRkID0gY2xrLT5kcGxsX2RhdGE7Ci0KLQlzdGF0ZSA8PD0gX19mZnMoZGQtPmlkbGVzdF9tYXNrKTsKLQotCXdoaWxlICgoKF9fcmF3X3JlYWRsKGRkLT5pZGxlc3RfcmVnKSAmIGRkLT5pZGxlc3RfbWFzaykgIT0gc3RhdGUpICYmCi0JICAgICAgIGkgPCBNQVhfRFBMTF9XQUlUX1RSSUVTKSB7Ci0JCWkrKzsKLQkJdWRlbGF5KDEpOwotCX0KLQotCWlmIChpID09IE1BWF9EUExMX1dBSVRfVFJJRVMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjbG9jazogJXMgZmFpbGVkIHRyYW5zaXRpb24gdG8gJyVzJ1xuIiwKLQkJICAgICAgIGNsay0+bmFtZSwgKHN0YXRlKSA/ICJsb2NrZWQiIDogImJ5cGFzc2VkIik7Ci0JfSBlbHNlIHsKLQkJcHJfZGVidWcoImNsb2NrOiAlcyB0cmFuc2l0aW9uIHRvICclcycgaW4gJWQgbG9vcHNcbiIsCi0JCQkgY2xrLT5uYW1lLCAoc3RhdGUpID8gImxvY2tlZCIgOiAiYnlwYXNzZWQiLCBpKTsKLQotCQlyZXQgPSAwOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIEZyb20gMzQzMCBUUk0gRVMyIDQuNy42LjIgKi8KLXN0YXRpYyB1MTYgX29tYXAzX2RwbGxfY29tcHV0ZV9mcmVxc2VsKHN0cnVjdCBjbGsgKmNsaywgdTggbikKLXsKLQl1bnNpZ25lZCBsb25nIGZpbnQ7Ci0JdTE2IGYgPSAwOwotCi0JZmludCA9IGNsay0+ZHBsbF9kYXRhLT5jbGtfcmVmLT5yYXRlIC8gbjsKLQotCXByX2RlYnVnKCJjbG9jazogZmludCBpcyAlbHVcbiIsIGZpbnQpOwotCi0JaWYgKGZpbnQgPj0gNzUwMDAwICYmIGZpbnQgPD0gMTAwMDAwMCkKLQkJZiA9IDB4MzsKLQllbHNlIGlmIChmaW50ID4gMTAwMDAwMCAmJiBmaW50IDw9IDEyNTAwMDApCi0JCWYgPSAweDQ7Ci0JZWxzZSBpZiAoZmludCA+IDEyNTAwMDAgJiYgZmludCA8PSAxNTAwMDAwKQotCQlmID0gMHg1OwotCWVsc2UgaWYgKGZpbnQgPiAxNTAwMDAwICYmIGZpbnQgPD0gMTc1MDAwMCkKLQkJZiA9IDB4NjsKLQllbHNlIGlmIChmaW50ID4gMTc1MDAwMCAmJiBmaW50IDw9IDIxMDAwMDApCi0JCWYgPSAweDc7Ci0JZWxzZSBpZiAoZmludCA+IDc1MDAwMDAgJiYgZmludCA8PSAxMDAwMDAwMCkKLQkJZiA9IDB4QjsKLQllbHNlIGlmIChmaW50ID4gMTAwMDAwMDAgJiYgZmludCA8PSAxMjUwMDAwMCkKLQkJZiA9IDB4QzsKLQllbHNlIGlmIChmaW50ID4gMTI1MDAwMDAgJiYgZmludCA8PSAxNTAwMDAwMCkKLQkJZiA9IDB4RDsKLQllbHNlIGlmIChmaW50ID4gMTUwMDAwMDAgJiYgZmludCA8PSAxNzUwMDAwMCkKLQkJZiA9IDB4RTsKLQllbHNlIGlmIChmaW50ID4gMTc1MDAwMDAgJiYgZmludCA8PSAyMTAwMDAwMCkKLQkJZiA9IDB4RjsKLQllbHNlCi0JCXByX2RlYnVnKCJjbG9jazogdW5rbm93biBmcmVxc2VsIHNldHRpbmcgZm9yICVkXG4iLCBuKTsKLQotCXJldHVybiBmOwotfQotCi0vKiBOb24tQ09SRSBEUExMIChlLmcuLCBEUExMcyB0aGF0IGRvIG5vdCBjb250cm9sIFNEUkMpIGNsb2NrIGZ1bmN0aW9ucyAqLwotCi0vKgotICogX29tYXAzX25vbmNvcmVfZHBsbF9sb2NrIC0gaW5zdHJ1Y3QgYSBEUExMIHRvIGxvY2sgYW5kIHdhaXQgZm9yIHJlYWRpbmVzcwotICogQGNsazogcG9pbnRlciB0byBhIERQTEwgc3RydWN0IGNsawotICoKLSAqIEluc3RydWN0cyBhIG5vbi1DT1JFIERQTEwgdG8gbG9jay4gIFdhaXRzIGZvciB0aGUgRFBMTCB0byByZXBvcnQKLSAqIHJlYWRpbmVzcyBiZWZvcmUgcmV0dXJuaW5nLiAgV2lsbCBzYXZlIGFuZCByZXN0b3JlIHRoZSBEUExMJ3MKLSAqIGF1dG9pZGxlIHN0YXRlIGFjcm9zcyB0aGUgZW5hYmxlLCBwZXIgdGhlIENEUCBjb2RlLiAgSWYgdGhlIERQTEwKLSAqIGxvY2tlZCBzdWNjZXNzZnVsbHksIHJldHVybiAwOyBpZiB0aGUgRFBMTCBkaWQgbm90IGxvY2sgaW4gdGhlIHRpbWUKLSAqIGFsbG90dGVkLCBvciBEUExMMyB3YXMgcGFzc2VkIGluLCByZXR1cm4gLUVJTlZBTC4KLSAqLwotc3RhdGljIGludCBfb21hcDNfbm9uY29yZV9kcGxsX2xvY2soc3RydWN0IGNsayAqY2xrKQotewotCXU4IGFpOwotCWludCByOwotCi0JaWYgKGNsayA9PSAmZHBsbDNfY2spCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcHJfZGVidWcoImNsb2NrOiBsb2NraW5nIERQTEwgJXNcbiIsIGNsay0+bmFtZSk7Ci0KLQlhaSA9IG9tYXAzX2RwbGxfYXV0b2lkbGVfcmVhZChjbGspOwotCi0Jb21hcDNfZHBsbF9kZW55X2lkbGUoY2xrKTsKLQotCV9vbWFwM19kcGxsX3dyaXRlX2Nsa2VuKGNsaywgRFBMTF9MT0NLRUQpOwotCi0JciA9IF9vbWFwM193YWl0X2RwbGxfc3RhdHVzKGNsaywgMSk7Ci0KLQlpZiAoYWkpCi0JCW9tYXAzX2RwbGxfYWxsb3dfaWRsZShjbGspOwotCi0JcmV0dXJuIHI7Ci19Ci0KLS8qCi0gKiBfb21hcDNfbm9uY29yZV9kcGxsX2J5cGFzcyAtIGluc3RydWN0IGEgRFBMTCB0byBieXBhc3MgYW5kIHdhaXQgZm9yIHJlYWRpbmVzcwotICogQGNsazogcG9pbnRlciB0byBhIERQTEwgc3RydWN0IGNsawotICoKLSAqIEluc3RydWN0cyBhIG5vbi1DT1JFIERQTEwgdG8gZW50ZXIgbG93LXBvd2VyIGJ5cGFzcyBtb2RlLiAgSW4KLSAqIGJ5cGFzcyBtb2RlLCB0aGUgRFBMTCdzIHJhdGUgaXMgc2V0IGVxdWFsIHRvIGl0cyBwYXJlbnQgY2xvY2sncwotICogcmF0ZS4gIFdhaXRzIGZvciB0aGUgRFBMTCB0byByZXBvcnQgcmVhZGluZXNzIGJlZm9yZSByZXR1cm5pbmcuCi0gKiBXaWxsIHNhdmUgYW5kIHJlc3RvcmUgdGhlIERQTEwncyBhdXRvaWRsZSBzdGF0ZSBhY3Jvc3MgdGhlIGVuYWJsZSwKLSAqIHBlciB0aGUgQ0RQIGNvZGUuICBJZiB0aGUgRFBMTCBlbnRlcmVkIGJ5cGFzcyBtb2RlIHN1Y2Nlc3NmdWxseSwKLSAqIHJldHVybiAwOyBpZiB0aGUgRFBMTCBkaWQgbm90IGVudGVyIGJ5cGFzcyBpbiB0aGUgdGltZSBhbGxvdHRlZCwgb3IKLSAqIERQTEwzIHdhcyBwYXNzZWQgaW4sIG9yIHRoZSBEUExMIGRvZXMgbm90IHN1cHBvcnQgbG93LXBvd2VyIGJ5cGFzcywKLSAqIHJldHVybiAtRUlOVkFMLgotICovCi1zdGF0aWMgaW50IF9vbWFwM19ub25jb3JlX2RwbGxfYnlwYXNzKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlpbnQgcjsKLQl1OCBhaTsKLQotCWlmIChjbGsgPT0gJmRwbGwzX2NrKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghKGNsay0+ZHBsbF9kYXRhLT5tb2RlcyAmICgxIDw8IERQTExfTE9XX1BPV0VSX0JZUEFTUykpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXByX2RlYnVnKCJjbG9jazogY29uZmlndXJpbmcgRFBMTCAlcyBmb3IgbG93LXBvd2VyIGJ5cGFzc1xuIiwKLQkJIGNsay0+bmFtZSk7Ci0KLQlhaSA9IG9tYXAzX2RwbGxfYXV0b2lkbGVfcmVhZChjbGspOwotCi0JX29tYXAzX2RwbGxfd3JpdGVfY2xrZW4oY2xrLCBEUExMX0xPV19QT1dFUl9CWVBBU1MpOwotCi0JciA9IF9vbWFwM193YWl0X2RwbGxfc3RhdHVzKGNsaywgMCk7Ci0KLQlpZiAoYWkpCi0JCW9tYXAzX2RwbGxfYWxsb3dfaWRsZShjbGspOwotCWVsc2UKLQkJb21hcDNfZHBsbF9kZW55X2lkbGUoY2xrKTsKLQotCXJldHVybiByOwotfQotCi0vKgotICogX29tYXAzX25vbmNvcmVfZHBsbF9zdG9wIC0gaW5zdHJ1Y3QgYSBEUExMIHRvIHN0b3AKLSAqIEBjbGs6IHBvaW50ZXIgdG8gYSBEUExMIHN0cnVjdCBjbGsKLSAqCi0gKiBJbnN0cnVjdHMgYSBub24tQ09SRSBEUExMIHRvIGVudGVyIGxvdy1wb3dlciBzdG9wLiBXaWxsIHNhdmUgYW5kCi0gKiByZXN0b3JlIHRoZSBEUExMJ3MgYXV0b2lkbGUgc3RhdGUgYWNyb3NzIHRoZSBzdG9wLCBwZXIgdGhlIENEUAotICogY29kZS4gIElmIERQTEwzIHdhcyBwYXNzZWQgaW4sIG9yIHRoZSBEUExMIGRvZXMgbm90IHN1cHBvcnQKLSAqIGxvdy1wb3dlciBzdG9wLCByZXR1cm4gLUVJTlZBTDsgb3RoZXJ3aXNlLCByZXR1cm4gMC4KLSAqLwotc3RhdGljIGludCBfb21hcDNfbm9uY29yZV9kcGxsX3N0b3Aoc3RydWN0IGNsayAqY2xrKQotewotCXU4IGFpOwotCi0JaWYgKGNsayA9PSAmZHBsbDNfY2spCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCEoY2xrLT5kcGxsX2RhdGEtPm1vZGVzICYgKDEgPDwgRFBMTF9MT1dfUE9XRVJfU1RPUCkpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXByX2RlYnVnKCJjbG9jazogc3RvcHBpbmcgRFBMTCAlc1xuIiwgY2xrLT5uYW1lKTsKLQotCWFpID0gb21hcDNfZHBsbF9hdXRvaWRsZV9yZWFkKGNsayk7Ci0KLQlfb21hcDNfZHBsbF93cml0ZV9jbGtlbihjbGssIERQTExfTE9XX1BPV0VSX1NUT1ApOwotCi0JaWYgKGFpKQotCQlvbWFwM19kcGxsX2FsbG93X2lkbGUoY2xrKTsKLQllbHNlCi0JCW9tYXAzX2RwbGxfZGVueV9pZGxlKGNsayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBvbWFwM19ub25jb3JlX2RwbGxfZW5hYmxlIC0gaW5zdHJ1Y3QgYSBEUExMIHRvIGVudGVyIGJ5cGFzcyBvciBsb2NrIG1vZGUKLSAqIEBjbGs6IHBvaW50ZXIgdG8gYSBEUExMIHN0cnVjdCBjbGsKLSAqCi0gKiBJbnN0cnVjdHMgYSBub24tQ09SRSBEUExMIHRvIGVuYWJsZSwgZS5nLiwgdG8gZW50ZXIgYnlwYXNzIG9yIGxvY2suCi0gKiBUaGUgY2hvaWNlIG9mIG1vZGVzIGRlcGVuZHMgb24gdGhlIERQTEwncyBwcm9ncmFtbWVkIHJhdGU6IGlmIGl0IGlzCi0gKiB0aGUgc2FtZSBhcyB0aGUgRFBMTCdzIHBhcmVudCBjbG9jaywgaXQgd2lsbCBlbnRlciBieXBhc3M7Ci0gKiBvdGhlcndpc2UsIGl0IHdpbGwgZW50ZXIgbG9jay4gIFRoaXMgY29kZSB3aWxsIHdhaXQgZm9yIHRoZSBEUExMIHRvCi0gKiBpbmRpY2F0ZSByZWFkaW5lc3MgYmVmb3JlIHJldHVybmluZywgdW5sZXNzIHRoZSBEUExMIHRha2VzIHRvbyBsb25nCi0gKiB0byBlbnRlciB0aGUgdGFyZ2V0IHN0YXRlLiAgSW50ZW5kZWQgdG8gYmUgdXNlZCBhcyB0aGUgc3RydWN0IGNsaydzCi0gKiBlbmFibGUgZnVuY3Rpb24uICBJZiBEUExMMyB3YXMgcGFzc2VkIGluLCBvciB0aGUgRFBMTCBkb2VzIG5vdAotICogc3VwcG9ydCBsb3ctcG93ZXIgc3RvcCwgb3IgaWYgdGhlIERQTEwgdG9vayB0b28gbG9uZyB0byBlbnRlcgotICogYnlwYXNzIG9yIGxvY2ssIHJldHVybiAtRUlOVkFMOyBvdGhlcndpc2UsIHJldHVybiAwLgotICovCi1zdGF0aWMgaW50IG9tYXAzX25vbmNvcmVfZHBsbF9lbmFibGUoc3RydWN0IGNsayAqY2xrKQotewotCWludCByOwotCXN0cnVjdCBkcGxsX2RhdGEgKmRkOwotCi0JaWYgKGNsayA9PSAmZHBsbDNfY2spCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZGQgPSBjbGstPmRwbGxfZGF0YTsKLQlpZiAoIWRkKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChjbGstPnJhdGUgPT0gZGQtPmNsa19ieXBhc3MtPnJhdGUpIHsKLQkJV0FSTl9PTihjbGstPnBhcmVudCAhPSBkZC0+Y2xrX2J5cGFzcyk7Ci0JCXIgPSBfb21hcDNfbm9uY29yZV9kcGxsX2J5cGFzcyhjbGspOwotCX0gZWxzZSB7Ci0JCVdBUk5fT04oY2xrLT5wYXJlbnQgIT0gZGQtPmNsa19yZWYpOwotCQlyID0gX29tYXAzX25vbmNvcmVfZHBsbF9sb2NrKGNsayk7Ci0JfQotCS8qIEZJWE1FOiB0aGlzIGlzIGR1YmlvdXMgLSBpZiBjbGstPnJhdGUgaGFzIGNoYW5nZWQsIHdoYXQgYWJvdXQgcHJvcGFnYXRpbmc/ICovCi0JaWYgKCFyKQotCQljbGstPnJhdGUgPSBvbWFwMl9nZXRfZHBsbF9yYXRlKGNsayk7Ci0KLQlyZXR1cm4gcjsKLX0KLQotLyoqCi0gKiBvbWFwM19ub25jb3JlX2RwbGxfZW5hYmxlIC0gaW5zdHJ1Y3QgYSBEUExMIHRvIGVudGVyIGJ5cGFzcyBvciBsb2NrIG1vZGUKLSAqIEBjbGs6IHBvaW50ZXIgdG8gYSBEUExMIHN0cnVjdCBjbGsKLSAqCi0gKiBJbnN0cnVjdHMgYSBub24tQ09SRSBEUExMIHRvIGVuYWJsZSwgZS5nLiwgdG8gZW50ZXIgYnlwYXNzIG9yIGxvY2suCi0gKiBUaGUgY2hvaWNlIG9mIG1vZGVzIGRlcGVuZHMgb24gdGhlIERQTEwncyBwcm9ncmFtbWVkIHJhdGU6IGlmIGl0IGlzCi0gKiB0aGUgc2FtZSBhcyB0aGUgRFBMTCdzIHBhcmVudCBjbG9jaywgaXQgd2lsbCBlbnRlciBieXBhc3M7Ci0gKiBvdGhlcndpc2UsIGl0IHdpbGwgZW50ZXIgbG9jay4gIFRoaXMgY29kZSB3aWxsIHdhaXQgZm9yIHRoZSBEUExMIHRvCi0gKiBpbmRpY2F0ZSByZWFkaW5lc3MgYmVmb3JlIHJldHVybmluZywgdW5sZXNzIHRoZSBEUExMIHRha2VzIHRvbyBsb25nCi0gKiB0byBlbnRlciB0aGUgdGFyZ2V0IHN0YXRlLiAgSW50ZW5kZWQgdG8gYmUgdXNlZCBhcyB0aGUgc3RydWN0IGNsaydzCi0gKiBlbmFibGUgZnVuY3Rpb24uICBJZiBEUExMMyB3YXMgcGFzc2VkIGluLCBvciB0aGUgRFBMTCBkb2VzIG5vdAotICogc3VwcG9ydCBsb3ctcG93ZXIgc3RvcCwgb3IgaWYgdGhlIERQTEwgdG9vayB0b28gbG9uZyB0byBlbnRlcgotICogYnlwYXNzIG9yIGxvY2ssIHJldHVybiAtRUlOVkFMOyBvdGhlcndpc2UsIHJldHVybiAwLgotICovCi1zdGF0aWMgdm9pZCBvbWFwM19ub25jb3JlX2RwbGxfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCi17Ci0JaWYgKGNsayA9PSAmZHBsbDNfY2spCi0JCXJldHVybjsKLQotCV9vbWFwM19ub25jb3JlX2RwbGxfc3RvcChjbGspOwotfQotCi0KLS8qIE5vbi1DT1JFIERQTEwgcmF0ZSBzZXQgY29kZSAqLwotCi0vKgotICogb21hcDNfbm9uY29yZV9kcGxsX3Byb2dyYW0gLSBzZXQgbm9uLWNvcmUgRFBMTCBNLE4gdmFsdWVzIGRpcmVjdGx5Ci0gKiBAY2xrOiBzdHJ1Y3QgY2xrICogb2YgRFBMTCB0byBzZXQKLSAqIEBtOiBEUExMIG11bHRpcGxpZXIgdG8gc2V0Ci0gKiBAbjogRFBMTCBkaXZpZGVyIHRvIHNldAotICogQGZyZXFzZWw6IEZSRVFTRUwgdmFsdWUgdG8gc2V0Ci0gKgotICogUHJvZ3JhbSB0aGUgRFBMTCB3aXRoIHRoZSBzdXBwbGllZCBNLCBOIHZhbHVlcywgYW5kIHdhaXQgZm9yIHRoZSBEUExMIHRvCi0gKiBsb2NrLi4gIFJldHVybnMgLUVJTlZBTCB1cG9uIGVycm9yLCBvciAwIHVwb24gc3VjY2Vzcy4KLSAqLwotc3RhdGljIGludCBvbWFwM19ub25jb3JlX2RwbGxfcHJvZ3JhbShzdHJ1Y3QgY2xrICpjbGssIHUxNiBtLCB1OCBuLCB1MTYgZnJlcXNlbCkKLXsKLQlzdHJ1Y3QgZHBsbF9kYXRhICpkZCA9IGNsay0+ZHBsbF9kYXRhOwotCXUzMiB2OwotCi0JLyogMzQzMCBFUzIgVFJNOiA0LjcuNi45IERQTEwgUHJvZ3JhbW1pbmcgU2VxdWVuY2UgKi8KLQlfb21hcDNfbm9uY29yZV9kcGxsX2J5cGFzcyhjbGspOwotCi0JLyogU2V0IGppdHRlciBjb3JyZWN0aW9uICovCi0JdiA9IF9fcmF3X3JlYWRsKGRkLT5jb250cm9sX3JlZyk7Ci0JdiAmPSB+ZGQtPmZyZXFzZWxfbWFzazsKLQl2IHw9IGZyZXFzZWwgPDwgX19mZnMoZGQtPmZyZXFzZWxfbWFzayk7Ci0JX19yYXdfd3JpdGVsKHYsIGRkLT5jb250cm9sX3JlZyk7Ci0KLQkvKiBTZXQgRFBMTCBtdWx0aXBsaWVyLCBkaXZpZGVyICovCi0JdiA9IF9fcmF3X3JlYWRsKGRkLT5tdWx0X2RpdjFfcmVnKTsKLQl2ICY9IH4oZGQtPm11bHRfbWFzayB8IGRkLT5kaXYxX21hc2spOwotCXYgfD0gbSA8PCBfX2ZmcyhkZC0+bXVsdF9tYXNrKTsKLQl2IHw9IChuIC0gMSkgPDwgX19mZnMoZGQtPmRpdjFfbWFzayk7Ci0JX19yYXdfd3JpdGVsKHYsIGRkLT5tdWx0X2RpdjFfcmVnKTsKLQotCS8qIFdlIGxldCB0aGUgY2xvY2sgZnJhbWV3b3JrIHNldCB0aGUgb3RoZXIgb3V0cHV0IGRpdmlkZXJzIGxhdGVyICovCi0KLQkvKiBSRVZJU0lUOiBTZXQgcmFtcC11cCBkZWxheT8gKi8KLQotCV9vbWFwM19ub25jb3JlX2RwbGxfbG9jayhjbGspOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogb21hcDNfbm9uY29yZV9kcGxsX3NldF9yYXRlIC0gc2V0IG5vbi1jb3JlIERQTEwgcmF0ZQotICogQGNsazogc3RydWN0IGNsayAqIG9mIERQTEwgdG8gc2V0Ci0gKiBAcmF0ZTogcm91bmRlZCB0YXJnZXQgcmF0ZQotICoKLSAqIFNldCB0aGUgRFBMTCBDTEtPVVQgdG8gdGhlIHRhcmdldCByYXRlLiAgSWYgdGhlIERQTEwgY2FuIGVudGVyCi0gKiBsb3ctcG93ZXIgYnlwYXNzLCBhbmQgdGhlIHRhcmdldCByYXRlIGlzIHRoZSBieXBhc3Mgc291cmNlIGNsb2NrCi0gKiByYXRlLCB0aGVuIGNvbmZpZ3VyZSB0aGUgRFBMTCBmb3IgYnlwYXNzLiAgT3RoZXJ3aXNlLCByb3VuZCB0aGUKLSAqIHRhcmdldCByYXRlIGlmIGl0IGhhc24ndCBiZWVuIGRvbmUgYWxyZWFkeSwgdGhlbiBwcm9ncmFtIGFuZCBsb2NrCi0gKiB0aGUgRFBMTC4gIFJldHVybnMgLUVJTlZBTCB1cG9uIGVycm9yLCBvciAwIHVwb24gc3VjY2Vzcy4KLSAqLwotc3RhdGljIGludCBvbWFwM19ub25jb3JlX2RwbGxfc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCi17Ci0Jc3RydWN0IGNsayAqbmV3X3BhcmVudCA9IE5VTEw7Ci0JdTE2IGZyZXFzZWw7Ci0Jc3RydWN0IGRwbGxfZGF0YSAqZGQ7Ci0JaW50IHJldDsKLQotCWlmICghY2xrIHx8ICFyYXRlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRkID0gY2xrLT5kcGxsX2RhdGE7Ci0JaWYgKCFkZCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAocmF0ZSA9PSBvbWFwMl9nZXRfZHBsbF9yYXRlKGNsaykpCi0JCXJldHVybiAwOwotCi0JLyoKLQkgKiBFbnN1cmUgYm90aCB0aGUgYnlwYXNzIGFuZCByZWYgY2xvY2tzIGFyZSBlbmFibGVkIHByaW9yIHRvCi0JICogZG9pbmcgYW55dGhpbmc7IHdlIG5lZWQgdGhlIGJ5cGFzcyBjbG9jayBydW5uaW5nIHRvIHJlcHJvZ3JhbQotCSAqIHRoZSBEUExMLgotCSAqLwotCW9tYXAyX2Nsa19lbmFibGUoZGQtPmNsa19ieXBhc3MpOwotCW9tYXAyX2Nsa19lbmFibGUoZGQtPmNsa19yZWYpOwotCi0JaWYgKGRkLT5jbGtfYnlwYXNzLT5yYXRlID09IHJhdGUgJiYKLQkgICAgKGNsay0+ZHBsbF9kYXRhLT5tb2RlcyAmICgxIDw8IERQTExfTE9XX1BPV0VSX0JZUEFTUykpKSB7Ci0JCXByX2RlYnVnKCJjbG9jazogJXM6IHNldCByYXRlOiBlbnRlcmluZyBieXBhc3MuXG4iLCBjbGstPm5hbWUpOwotCi0JCXJldCA9IF9vbWFwM19ub25jb3JlX2RwbGxfYnlwYXNzKGNsayk7Ci0JCWlmICghcmV0KQotCQkJbmV3X3BhcmVudCA9IGRkLT5jbGtfYnlwYXNzOwotCX0gZWxzZSB7Ci0JCWlmIChkZC0+bGFzdF9yb3VuZGVkX3JhdGUgIT0gcmF0ZSkKLQkJCW9tYXAyX2RwbGxfcm91bmRfcmF0ZShjbGssIHJhdGUpOwotCi0JCWlmIChkZC0+bGFzdF9yb3VuZGVkX3JhdGUgPT0gMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWZyZXFzZWwgPSBfb21hcDNfZHBsbF9jb21wdXRlX2ZyZXFzZWwoY2xrLCBkZC0+bGFzdF9yb3VuZGVkX24pOwotCQlpZiAoIWZyZXFzZWwpCi0JCQlXQVJOX09OKDEpOwotCi0JCXByX2RlYnVnKCJjbG9jazogJXM6IHNldCByYXRlOiBsb2NraW5nIHJhdGUgdG8gJWx1LlxuIiwKLQkJCSBjbGstPm5hbWUsIHJhdGUpOwotCi0JCXJldCA9IG9tYXAzX25vbmNvcmVfZHBsbF9wcm9ncmFtKGNsaywgZGQtPmxhc3Rfcm91bmRlZF9tLAotCQkJCQkJIGRkLT5sYXN0X3JvdW5kZWRfbiwgZnJlcXNlbCk7Ci0JCWlmICghcmV0KQotCQkJbmV3X3BhcmVudCA9IGRkLT5jbGtfcmVmOwotCX0KLQlpZiAoIXJldCkgewotCQkvKgotCQkgKiBTd2l0Y2ggdGhlIHBhcmVudCBjbG9jayBpbiB0aGUgaGVpcmFyY2h5LCBhbmQgbWFrZSBzdXJlCi0JCSAqIHRoYXQgdGhlIG5ldyBwYXJlbnQncyB1c2Vjb3VudCBpcyBjb3JyZWN0LiAgTm90ZTogd2UKLQkJICogZW5hYmxlIHRoZSBuZXcgcGFyZW50IGJlZm9yZSBkaXNhYmxpbmcgdGhlIG9sZCB0byBhdm9pZAotCQkgKiBhbnkgdW5uZWNlc3NhcnkgaGFyZHdhcmUgZGlzYWJsZS0+ZW5hYmxlIHRyYW5zaXRpb25zLgotCQkgKi8KLQkJaWYgKGNsay0+dXNlY291bnQpIHsKLQkJCW9tYXAyX2Nsa19lbmFibGUobmV3X3BhcmVudCk7Ci0JCQlvbWFwMl9jbGtfZGlzYWJsZShjbGstPnBhcmVudCk7Ci0JCX0KLQkJY2xrX3JlcGFyZW50KGNsaywgbmV3X3BhcmVudCk7Ci0JCWNsay0+cmF0ZSA9IHJhdGU7Ci0JfQotCW9tYXAyX2Nsa19kaXNhYmxlKGRkLT5jbGtfcmVmKTsKLQlvbWFwMl9jbGtfZGlzYWJsZShkZC0+Y2xrX2J5cGFzcyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvbWFwM19kcGxsNF9zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK2ludCBvbWFwM19kcGxsNF9zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKIHsKIAkvKgogCSAqIEFjY29yZGluZyB0byB0aGUgMTItNSBDRFAgY29kZSBmcm9tIFRJLCAiTGltaXRhdGlvbiAyLjUiCkBAIC04MzEsMTIgKzE3OSwxMiBAQAogICogUHJvZ3JhbSB0aGUgRFBMTCBNMiBkaXZpZGVyIHdpdGggdGhlIHJvdW5kZWQgdGFyZ2V0IHJhdGUuICBSZXR1cm5zCiAgKiAtRUlOVkFMIHVwb24gZXJyb3IsIG9yIDAgdXBvbiBzdWNjZXNzLgogICovCi1zdGF0aWMgaW50IG9tYXAzX2NvcmVfZHBsbF9tMl9zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK2ludCBvbWFwM19jb3JlX2RwbGxfbTJfc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCiB7CiAJdTMyIG5ld19kaXYgPSAwOwogCXUzMiB1bmxvY2tfZGxsID0gMDsKIAl1MzIgYzsKLQl1bnNpZ25lZCBsb25nIHZhbGlkcmF0ZSwgc2RyY3JhdGUsIG1wdXJhdGU7CisJdW5zaWduZWQgbG9uZyB2YWxpZHJhdGUsIHNkcmNyYXRlLCBfbXB1cmF0ZTsKIAlzdHJ1Y3Qgb21hcF9zZHJjX3BhcmFtcyAqc2RyY19jczA7CiAJc3RydWN0IG9tYXBfc2RyY19wYXJhbXMgKnNkcmNfY3MxOwogCWludCByZXQ7CkBAIC04NDQsMTQgKzE5MiwxMSBAQAogCWlmICghY2xrIHx8ICFyYXRlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChjbGsgIT0gJmRwbGwzX20yX2NrKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCXZhbGlkcmF0ZSA9IG9tYXAyX2Nsa3NlbF9yb3VuZF9yYXRlX2RpdihjbGssIHJhdGUsICZuZXdfZGl2KTsKIAlpZiAodmFsaWRyYXRlICE9IHJhdGUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jc2RyY3JhdGUgPSBzZHJjX2ljay5yYXRlOworCXNkcmNyYXRlID0gc2RyY19pY2tfcC0+cmF0ZTsKIAlpZiAocmF0ZSA+IGNsay0+cmF0ZSkKIAkJc2RyY3JhdGUgPDw9ICgocmF0ZSAvIGNsay0+cmF0ZSkgPj4gMSk7CiAJZWxzZQpAQCAtODY5LDggKzIxNCw4IEBACiAJLyoKIAkgKiBYWFggVGhpcyBvbmx5IG5lZWRzIHRvIGJlIGRvbmUgd2hlbiB0aGUgQ1BVIGZyZXF1ZW5jeSBjaGFuZ2VzCiAJICovCi0JbXB1cmF0ZSA9IGFybV9mY2sucmF0ZSAvIENZQ0xFU19QRVJfTUhaOwotCWMgPSAobXB1cmF0ZSA8PCBTRFJDX01QVVJBVEVfU0NBTEUpID4+IFNEUkNfTVBVUkFURV9CQVNFX1NISUZUOworCV9tcHVyYXRlID0gYXJtX2Zja19wLT5yYXRlIC8gQ1lDTEVTX1BFUl9NSFo7CisJYyA9IChfbXB1cmF0ZSA8PCBTRFJDX01QVVJBVEVfU0NBTEUpID4+IFNEUkNfTVBVUkFURV9CQVNFX1NISUZUOwogCWMgKz0gMTsgIC8qIGZvciBzYWZldHkgKi8KIAljICo9IFNEUkNfTVBVUkFURV9MT09QUzsKIAljID4+PSBTRFJDX01QVVJBVEVfU0NBTEU7CkBAIC05MDYsMTI5ICsyNTEsNiBAQAogCXJldHVybiAwOwogfQogCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrb3BzIGNsa29wc19ub25jb3JlX2RwbGxfb3BzID0gewotCS5lbmFibGUJCT0gJm9tYXAzX25vbmNvcmVfZHBsbF9lbmFibGUsCi0JLmRpc2FibGUJPSAmb21hcDNfbm9uY29yZV9kcGxsX2Rpc2FibGUsCi19OwotCi0vKiBEUExMIGF1dG9pZGxlIHJlYWQvc2V0IGNvZGUgKi8KLQotCi0vKioKLSAqIG9tYXAzX2RwbGxfYXV0b2lkbGVfcmVhZCAtIHJlYWQgYSBEUExMJ3MgYXV0b2lkbGUgYml0cwotICogQGNsazogc3RydWN0IGNsayAqIG9mIHRoZSBEUExMIHRvIHJlYWQKLSAqCi0gKiBSZXR1cm4gdGhlIERQTEwncyBhdXRvaWRsZSBiaXRzLCBzaGlmdGVkIGRvd24gdG8gYml0IDAuICBSZXR1cm5zCi0gKiAtRUlOVkFMIGlmIHBhc3NlZCBhIG51bGwgcG9pbnRlciBvciBpZiB0aGUgc3RydWN0IGNsayBkb2VzIG5vdAotICogYXBwZWFyIHRvIHJlZmVyIHRvIGEgRFBMTC4KLSAqLwotc3RhdGljIHUzMiBvbWFwM19kcGxsX2F1dG9pZGxlX3JlYWQoc3RydWN0IGNsayAqY2xrKQotewotCWNvbnN0IHN0cnVjdCBkcGxsX2RhdGEgKmRkOwotCXUzMiB2OwotCi0JaWYgKCFjbGsgfHwgIWNsay0+ZHBsbF9kYXRhKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRkID0gY2xrLT5kcGxsX2RhdGE7Ci0KLQl2ID0gX19yYXdfcmVhZGwoZGQtPmF1dG9pZGxlX3JlZyk7Ci0JdiAmPSBkZC0+YXV0b2lkbGVfbWFzazsKLQl2ID4+PSBfX2ZmcyhkZC0+YXV0b2lkbGVfbWFzayk7Ci0KLQlyZXR1cm4gdjsKLX0KLQotLyoqCi0gKiBvbWFwM19kcGxsX2FsbG93X2lkbGUgLSBlbmFibGUgRFBMTCBhdXRvaWRsZSBiaXRzCi0gKiBAY2xrOiBzdHJ1Y3QgY2xrICogb2YgdGhlIERQTEwgdG8gb3BlcmF0ZSBvbgotICoKLSAqIEVuYWJsZSBEUExMIGF1dG9tYXRpYyBpZGxlIGNvbnRyb2wuICBUaGlzIGF1dG9tYXRpYyBpZGxlIG1vZGUKLSAqIHN3aXRjaGluZyB0YWtlcyBlZmZlY3Qgb25seSB3aGVuIHRoZSBEUExMIGlzIGxvY2tlZCwgYXQgbGVhc3Qgb24KLSAqIE9NQVAzNDMwLiAgVGhlIERQTEwgd2lsbCBlbnRlciBsb3ctcG93ZXIgc3RvcCB3aGVuIGl0cyBkb3duc3RyZWFtCi0gKiBjbG9ja3MgYXJlIGdhdGVkLiAgTm8gcmV0dXJuIHZhbHVlLgotICovCi1zdGF0aWMgdm9pZCBvbWFwM19kcGxsX2FsbG93X2lkbGUoc3RydWN0IGNsayAqY2xrKQotewotCWNvbnN0IHN0cnVjdCBkcGxsX2RhdGEgKmRkOwotCXUzMiB2OwotCi0JaWYgKCFjbGsgfHwgIWNsay0+ZHBsbF9kYXRhKQotCQlyZXR1cm47Ci0KLQlkZCA9IGNsay0+ZHBsbF9kYXRhOwotCi0JLyoKLQkgKiBSRVZJU0lUOiBDT1JFIERQTEwgY2FuIG9wdGlvbmFsbHkgZW50ZXIgbG93LXBvd2VyIGJ5cGFzcwotCSAqIGJ5IHdyaXRpbmcgMHg1IGluc3RlYWQgb2YgMHgxLiAgQWRkIHNvbWUgbWVjaGFuaXNtIHRvCi0JICogb3B0aW9uYWxseSBlbnRlciB0aGlzIG1vZGUuCi0JICovCi0JdiA9IF9fcmF3X3JlYWRsKGRkLT5hdXRvaWRsZV9yZWcpOwotCXYgJj0gfmRkLT5hdXRvaWRsZV9tYXNrOwotCXYgfD0gRFBMTF9BVVRPSURMRV9MT1dfUE9XRVJfU1RPUCA8PCBfX2ZmcyhkZC0+YXV0b2lkbGVfbWFzayk7Ci0JX19yYXdfd3JpdGVsKHYsIGRkLT5hdXRvaWRsZV9yZWcpOwotfQotCi0vKioKLSAqIG9tYXAzX2RwbGxfZGVueV9pZGxlIC0gcHJldmVudCBEUExMIGZyb20gYXV0b21hdGljYWxseSBpZGxpbmcKLSAqIEBjbGs6IHN0cnVjdCBjbGsgKiBvZiB0aGUgRFBMTCB0byBvcGVyYXRlIG9uCi0gKgotICogRGlzYWJsZSBEUExMIGF1dG9tYXRpYyBpZGxlIGNvbnRyb2wuICBObyByZXR1cm4gdmFsdWUuCi0gKi8KLXN0YXRpYyB2b2lkIG9tYXAzX2RwbGxfZGVueV9pZGxlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQljb25zdCBzdHJ1Y3QgZHBsbF9kYXRhICpkZDsKLQl1MzIgdjsKLQotCWlmICghY2xrIHx8ICFjbGstPmRwbGxfZGF0YSkKLQkJcmV0dXJuOwotCi0JZGQgPSBjbGstPmRwbGxfZGF0YTsKLQotCXYgPSBfX3Jhd19yZWFkbChkZC0+YXV0b2lkbGVfcmVnKTsKLQl2ICY9IH5kZC0+YXV0b2lkbGVfbWFzazsKLQl2IHw9IERQTExfQVVUT0lETEVfRElTQUJMRSA8PCBfX2ZmcyhkZC0+YXV0b2lkbGVfbWFzayk7Ci0JX19yYXdfd3JpdGVsKHYsIGRkLT5hdXRvaWRsZV9yZWcpOwotfQotCi0vKiBDbG9jayBjb250cm9sIGZvciBEUExMIG91dHB1dHMgKi8KLQotLyoqCi0gKiBvbWFwM19jbGtvdXR4Ml9yZWNhbGMgLSByZWNhbGN1bGF0ZSBEUExMIFgyIG91dHB1dCB2aXJ0dWFsIGNsb2NrIHJhdGUKLSAqIEBjbGs6IERQTEwgb3V0cHV0IHN0cnVjdCBjbGsKLSAqCi0gKiBVc2luZyBwYXJlbnQgY2xvY2sgRFBMTCBkYXRhLCBsb29rIHVwIERQTEwgc3RhdGUuICBJZiBsb2NrZWQsIHNldCBvdXIKLSAqIHJhdGUgdG8gdGhlIGRwbGxfY2xrICogMjsgb3RoZXJ3aXNlLCBqdXN0IHVzZSBkcGxsX2Nsay4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgb21hcDNfY2xrb3V0eDJfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKLXsKLQljb25zdCBzdHJ1Y3QgZHBsbF9kYXRhICpkZDsKLQl1bnNpZ25lZCBsb25nIHJhdGU7Ci0JdTMyIHY7Ci0Jc3RydWN0IGNsayAqcGNsazsKLQotCS8qIFdhbGsgdXAgdGhlIHBhcmVudHMgb2YgY2xrLCBsb29raW5nIGZvciBhIERQTEwgKi8KLQlwY2xrID0gY2xrLT5wYXJlbnQ7Ci0Jd2hpbGUgKHBjbGsgJiYgIXBjbGstPmRwbGxfZGF0YSkKLQkJcGNsayA9IHBjbGstPnBhcmVudDsKLQotCS8qIGNsayBkb2VzIG5vdCBoYXZlIGEgRFBMTCBhcyBhIHBhcmVudD8gKi8KLQlXQVJOX09OKCFwY2xrKTsKLQotCWRkID0gcGNsay0+ZHBsbF9kYXRhOwotCi0JV0FSTl9PTighZGQtPmVuYWJsZV9tYXNrKTsKLQotCXYgPSBfX3Jhd19yZWFkbChkZC0+Y29udHJvbF9yZWcpICYgZGQtPmVuYWJsZV9tYXNrOwotCXYgPj49IF9fZmZzKGRkLT5lbmFibGVfbWFzayk7Ci0JaWYgKHYgIT0gT01BUDNYWFhfRU5fRFBMTF9MT0NLRUQpCi0JCXJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZTsKLQllbHNlCi0JCXJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAqIDI7Ci0JcmV0dXJuIHJhdGU7Ci19Ci0KIC8qIENvbW1vbiBjbG9jayBjb2RlICovCiAKIC8qCkBAIC0xMDM3LDcgKzI1OSw3IEBACiAgKi8KICNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAzKQogCi1zdGF0aWMgc3RydWN0IGNsa19mdW5jdGlvbnMgb21hcDJfY2xrX2Z1bmN0aW9ucyA9IHsKK3N0cnVjdCBjbGtfZnVuY3Rpb25zIG9tYXAyX2Nsa19mdW5jdGlvbnMgPSB7CiAJLmNsa19lbmFibGUJCT0gb21hcDJfY2xrX2VuYWJsZSwKIAkuY2xrX2Rpc2FibGUJCT0gb21hcDJfY2xrX2Rpc2FibGUsCiAJLmNsa19yb3VuZF9yYXRlCQk9IG9tYXAyX2Nsa19yb3VuZF9yYXRlLApAQCAtMTA2Myw3ICsyODUsNyBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyB2b2lkIG9tYXAzX2Nsa19sb2NrX2RwbGw1KHZvaWQpCit2b2lkIG9tYXAzX2Nsa19sb2NrX2RwbGw1KHZvaWQpCiB7CiAJc3RydWN0IGNsayAqZHBsbDVfY2xrOwogCXN0cnVjdCBjbGsgKmRwbGw1X20yX2NsazsKQEAgLTEwOTMsMTkgKzMxNSwzMiBAQAogICovCiBzdGF0aWMgaW50IF9faW5pdCBvbWFwMl9jbGtfYXJjaF9pbml0KHZvaWQpCiB7CisJc3RydWN0IGNsayAqb3NjX3N5c19jaywgKmRwbGwxX2NrLCAqYXJtX2ZjaywgKmNvcmVfY2s7CisJdW5zaWduZWQgbG9uZyBvc2Nfc3lzX3JhdGU7CisKIAlpZiAoIW1wdXJhdGUpCiAJCXJldHVybiAtRUlOVkFMOwogCisJLyogWFhYIHRlc3QgdGhlc2UgZm9yIHN1Y2Nlc3MgKi8KKwlkcGxsMV9jayA9IGNsa19nZXQoTlVMTCwgImRwbGwxX2NrIik7CisJYXJtX2ZjayA9IGNsa19nZXQoTlVMTCwgImFybV9mY2siKTsKKwljb3JlX2NrID0gY2xrX2dldChOVUxMLCAiY29yZV9jayIpOworCW9zY19zeXNfY2sgPSBjbGtfZ2V0KE5VTEwsICJvc2Nfc3lzX2NrIik7CisKIAkvKiBSRVZJU0lUOiBub3QgeWV0IHJlYWR5IGZvciAzNDN4ICovCi0JaWYgKGNsa19zZXRfcmF0ZSgmZHBsbDFfY2ssIG1wdXJhdGUpKQorCWlmIChjbGtfc2V0X3JhdGUoZHBsbDFfY2ssIG1wdXJhdGUpKQogCQlwcmludGsoS0VSTl9FUlIgIioqKiBVbmFibGUgdG8gc2V0IE1QVSByYXRlXG4iKTsKIAogCXJlY2FsY3VsYXRlX3Jvb3RfY2xvY2tzKCk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJTd2l0Y2hlZCB0byBuZXcgY2xvY2tpbmcgcmF0ZSAoQ3J5c3RhbC9Db3JlL01QVSk6ICIKLQkgICAgICAgIiVsZC4lMDFsZC8lbGQvJWxkIE1IelxuIiwKLQkgICAgICAgKG9zY19zeXNfY2sucmF0ZSAvIDEwMDAwMDApLCAoKG9zY19zeXNfY2sucmF0ZSAvIDEwMDAwMCkgJSAxMCksCi0JICAgICAgIChjb3JlX2NrLnJhdGUgLyAxMDAwMDAwKSwgKGFybV9mY2sucmF0ZSAvIDEwMDAwMDApKSA7CisJb3NjX3N5c19yYXRlID0gY2xrX2dldF9yYXRlKG9zY19zeXNfY2spOworCisJcHJfaW5mbygiU3dpdGNoZWQgdG8gbmV3IGNsb2NraW5nIHJhdGUgKENyeXN0YWwvQ29yZS9NUFUpOiAiCisJCSIlbGQuJTAxbGQvJWxkLyVsZCBNSHpcbiIsCisJCShvc2Nfc3lzX3JhdGUgLyAxMDAwMDAwKSwKKwkJKChvc2Nfc3lzX3JhdGUgLyAxMDAwMDApICUgMTApLAorCQkoY2xrX2dldF9yYXRlKGNvcmVfY2spIC8gMTAwMDAwMCksCisJCShjbGtfZ2V0X3JhdGUoYXJtX2ZjaykgLyAxMDAwMDAwKSk7CiAKIAljYWxpYnJhdGVfZGVsYXkoKTsKIApAQCAtMTExMyw4MyArMzQ4LDcgQEAKIH0KIGFyY2hfaW5pdGNhbGwob21hcDJfY2xrX2FyY2hfaW5pdCk7CiAKLWludCBfX2luaXQgb21hcDJfY2xrX2luaXQodm9pZCkKLXsKLQkvKiBzdHJ1Y3QgcHJjbV9jb25maWcgKnByY207ICovCi0Jc3RydWN0IG9tYXBfY2xrICpjOwotCS8qIHUzMiBjbGtyYXRlOyAqLwotCXUzMiBjcHVfY2xrZmxnOwotCi0JaWYgKGNwdV9pc19vbWFwMzR4eCgpKSB7Ci0JCWNwdV9tYXNrID0gUkFURV9JTl8zNDNYOwotCQljcHVfY2xrZmxnID0gQ0tfMzQzWDsKLQotCQkvKgotCQkgKiBVcGRhdGUgdGhpcyBpZiB0aGVyZSBhcmUgZnVydGhlciBjbG9jayBjaGFuZ2VzIGJldHdlZW4gRVMyCi0JCSAqIGFuZCBwcm9kdWN0aW9uIHBhcnRzCi0JCSAqLwotCQlpZiAob21hcF9yZXYoKSA9PSBPTUFQMzQzMF9SRVZfRVMxXzApIHsKLQkJCS8qIE5vIDM0MzBFUzEtb25seSByYXRlcyBleGlzdCwgc28gbm8gUkFURV9JTl8zNDMwRVMxICovCi0JCQljcHVfY2xrZmxnIHw9IENLXzM0MzBFUzE7Ci0JCX0gZWxzZSB7Ci0JCQljcHVfbWFzayB8PSBSQVRFX0lOXzM0MzBFUzI7Ci0JCQljcHVfY2xrZmxnIHw9IENLXzM0MzBFUzI7Ci0JCX0KLQl9Ci0KLQljbGtfaW5pdCgmb21hcDJfY2xrX2Z1bmN0aW9ucyk7Ci0KLQlmb3IgKGMgPSBvbWFwMzR4eF9jbGtzOyBjIDwgb21hcDM0eHhfY2xrcyArIEFSUkFZX1NJWkUob21hcDM0eHhfY2xrcyk7IGMrKykKLQkJY2xrX3ByZWluaXQoYy0+bGsuY2xrKTsKLQotCWZvciAoYyA9IG9tYXAzNHh4X2Nsa3M7IGMgPCBvbWFwMzR4eF9jbGtzICsgQVJSQVlfU0laRShvbWFwMzR4eF9jbGtzKTsgYysrKQotCQlpZiAoYy0+Y3B1ICYgY3B1X2Nsa2ZsZykgewotCQkJY2xrZGV2X2FkZCgmYy0+bGspOwotCQkJY2xrX3JlZ2lzdGVyKGMtPmxrLmNsayk7Ci0JCQlvbWFwMl9pbml0X2Nsa19jbGtkbShjLT5say5jbGspOwotCQl9Ci0KLQkvKiBSRVZJU0lUOiBOb3QgeWV0IHJlYWR5IGZvciBPTUFQMyAqLwotI2lmIDAKLQkvKiBDaGVjayB0aGUgTVBVIHJhdGUgc2V0IGJ5IGJvb3Rsb2FkZXIgKi8KLQljbGtyYXRlID0gb21hcDJfZ2V0X2RwbGxfcmF0ZV8yNHh4KCZkcGxsX2NrKTsKLQlmb3IgKHByY20gPSByYXRlX3RhYmxlOyBwcmNtLT5tcHVfc3BlZWQ7IHByY20rKykgewotCQlpZiAoIShwcmNtLT5mbGFncyAmIGNwdV9tYXNrKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAocHJjbS0+eHRhbF9zcGVlZCAhPSBzeXNfY2sucmF0ZSkKLQkJCWNvbnRpbnVlOwotCQlpZiAocHJjbS0+ZHBsbF9zcGVlZCA8PSBjbGtyYXRlKQotCQkJIGJyZWFrOwotCX0KLQljdXJyX3ByY21fc2V0ID0gcHJjbTsKLSNlbmRpZgotCi0JcmVjYWxjdWxhdGVfcm9vdF9jbG9ja3MoKTsKLQotCXByaW50ayhLRVJOX0lORk8gIkNsb2NraW5nIHJhdGUgKENyeXN0YWwvQ29yZS9NUFUpOiAiCi0JICAgICAgICIlbGQuJTAxbGQvJWxkLyVsZCBNSHpcbiIsCi0JICAgICAgIChvc2Nfc3lzX2NrLnJhdGUgLyAxMDAwMDAwKSwgKG9zY19zeXNfY2sucmF0ZSAvIDEwMDAwMCkgJSAxMCwKLQkgICAgICAgKGNvcmVfY2sucmF0ZSAvIDEwMDAwMDApLCAoYXJtX2Zjay5yYXRlIC8gMTAwMDAwMCkpOwotCi0JLyoKLQkgKiBPbmx5IGVuYWJsZSB0aG9zZSBjbG9ja3Mgd2Ugd2lsbCBuZWVkLCBsZXQgdGhlIGRyaXZlcnMKLQkgKiBlbmFibGUgb3RoZXIgY2xvY2tzIGFzIG5lY2Vzc2FyeQotCSAqLwotCWNsa19lbmFibGVfaW5pdF9jbG9ja3MoKTsKLQotCS8qCi0JICogTG9jayBEUExMNSBhbmQgcHV0IGl0IGluIGF1dG9pZGxlLgotCSAqLwotCWlmIChvbWFwX3JldigpID49IE9NQVAzNDMwX1JFVl9FUzJfMCkKLQkJb21hcDNfY2xrX2xvY2tfZHBsbDUoKTsKLQotCS8qIEF2b2lkIHNsZWVwaW5nIGR1cmluZyBvbWFwMl9jbGtfcHJlcGFyZV9mb3JfcmVib290KCkgKi8KLQkvKiBSRVZJU0lUOiBub3QgeWV0IHJlYWR5IGZvciAzNDN4ICovCi0jaWYgMAotCXZjbGsgPSBjbGtfZ2V0KE5VTEwsICJ2aXJ0X3ByY21fc2V0Iik7Ci0Jc2NsayA9IGNsa19nZXQoTlVMTCwgInN5c19jayIpOwotI2VuZGlmCi0JcmV0dXJuIDA7Ci19CiAKICNlbmRpZgorCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2szNHh4LmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMzR4eC5oCmluZGV4IDhmZTFiY2IuLjlhMmMwN2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2szNHh4LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazM0eHguaApAQCAtMSwyOTkzICsxLDI0IEBACiAvKgotICogT01BUDMgY2xvY2sgZnJhbWV3b3JrCisgKiBPTUFQMyBjbG9jayBmdW5jdGlvbiBwcm90b3R5cGVzIGFuZCBtYWNyb3MKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggTm9raWEgQ29ycG9yYXRpb24KLSAqCi0gKiBXcml0dGVuIGJ5IFBhdWwgV2FsbXNsZXkKLSAqIFdpdGggbWFueSBkZXZpY2UgY2xvY2sgZml4ZXMgYnkgS2V2aW4gSGlsbWFuIGFuZCBKb3VuaSBIw7ZnYW5kZXIKLSAqIERQTEwgYnlwYXNzIGNsb2NrIHN1cHBvcnQgYWRkZWQgYnkgUm9tYW4gVGVyZXNob25rb3YKLSAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgTm9raWEgQ29ycG9yYXRpb24KICAqLwogCi0vKgotICogVmlydHVhbCBjbG9ja3MgYXJlIGludHJvZHVjZWQgYXMgY29udmVuaWVudCB0b29scy4KLSAqIFRoZXkgYXJlIHNvdXJjZXMgZm9yIG90aGVyIGNsb2NrcyBhbmQgbm90IHN1cHBvc2VkCi0gKiB0byBiZSByZXF1ZXN0ZWQgZnJvbSBkcml2ZXJzIGRpcmVjdGx5LgotICovCisjaWZuZGVmIF9fQVJDSF9BUk1fTUFDSF9PTUFQMl9DTE9DS18zNFhYX0gKKyNkZWZpbmUgX19BUkNIX0FSTV9NQUNIX09NQVAyX0NMT0NLXzM0WFhfSAogCi0jaWZuZGVmIF9fQVJDSF9BUk1fTUFDSF9PTUFQMl9DTE9DSzM0WFhfSAotI2RlZmluZSBfX0FSQ0hfQVJNX01BQ0hfT01BUDJfQ0xPQ0szNFhYX0gKK2ludCBvbWFwM19kcGxsNF9zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7CitpbnQgb21hcDNfY29yZV9kcGxsX20yX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKTsKK3ZvaWQgb21hcDNfY2xrX2xvY2tfZHBsbDUodm9pZCk7CiAKLSNpbmNsdWRlIDxwbGF0L2NvbnRyb2wuaD4KK2V4dGVybiBzdHJ1Y3QgY2xrICpzZHJjX2lja19wOworZXh0ZXJuIHN0cnVjdCBjbGsgKmFybV9mY2tfcDsKIAotI2luY2x1ZGUgImNsb2NrLmgiCi0jaW5jbHVkZSAiY20uaCIKLSNpbmNsdWRlICJjbS1yZWdiaXRzLTM0eHguaCIKLSNpbmNsdWRlICJwcm0uaCIKLSNpbmNsdWRlICJwcm0tcmVnYml0cy0zNHh4LmgiCi0KLSNkZWZpbmUgT01BUF9DTV9SRUdBRERSCQlPTUFQMzRYWF9DTV9SRUdBRERSCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG9tYXAzX2RwbGxfcmVjYWxjKHN0cnVjdCBjbGsgKmNsayk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBvbWFwM19jbGtvdXR4Ml9yZWNhbGMoc3RydWN0IGNsayAqY2xrKTsKLXN0YXRpYyB2b2lkIG9tYXAzX2RwbGxfYWxsb3dfaWRsZShzdHJ1Y3QgY2xrICpjbGspOwotc3RhdGljIHZvaWQgb21hcDNfZHBsbF9kZW55X2lkbGUoc3RydWN0IGNsayAqY2xrKTsKLXN0YXRpYyB1MzIgb21hcDNfZHBsbF9hdXRvaWRsZV9yZWFkKHN0cnVjdCBjbGsgKmNsayk7Ci1zdGF0aWMgaW50IG9tYXAzX25vbmNvcmVfZHBsbF9zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7Ci1zdGF0aWMgaW50IG9tYXAzX2RwbGw0X3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKTsKLXN0YXRpYyBpbnQgb21hcDNfY29yZV9kcGxsX20yX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKTsKLQotLyogTWF4aW11bSBEUExMIG11bHRpcGxpZXIsIGRpdmlkZXIgdmFsdWVzIGZvciBPTUFQMyAqLwotI2RlZmluZSBPTUFQM19NQVhfRFBMTF9NVUxUCQkyMDQ4Ci0jZGVmaW5lIE9NQVAzX01BWF9EUExMX0RJVgkJMTI4Ci0KLS8qCi0gKiBEUExMMSBzdXBwbGllcyBjbG9jayB0byB0aGUgTVBVLgotICogRFBMTDIgc3VwcGxpZXMgY2xvY2sgdG8gdGhlIElWQTIuCi0gKiBEUExMMyBzdXBwbGllcyBDT1JFIGRvbWFpbiBjbG9ja3MuCi0gKiBEUExMNCBzdXBwbGllcyBwZXJpcGhlcmFsIGNsb2Nrcy4KLSAqIERQTEw1IHN1cHBsaWVzIG90aGVyIHBlcmlwaGVyYWwgY2xvY2tzIChVU0JIT1NULCBVU0lNKS4KLSAqLwotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgRFBMTCBieXBhc3MgY2xvY2tzICovCi1zdGF0aWMgc3RydWN0IGNsayBkcGxsMV9mY2s7Ci1zdGF0aWMgc3RydWN0IGNsayBkcGxsMl9mY2s7Ci0KLS8qIENNX0NMS0VOX1BMTCouRU4qIGJpdCB2YWx1ZXMgLSBub3QgYWxsIGFyZSBhdmFpbGFibGUgZm9yIGV2ZXJ5IERQTEwgKi8KLSNkZWZpbmUgRFBMTF9MT1dfUE9XRVJfU1RPUAkJMHgxCi0jZGVmaW5lIERQTExfTE9XX1BPV0VSX0JZUEFTUwkJMHg1Ci0jZGVmaW5lIERQTExfTE9DS0VECQkJMHg3Ci0KLS8qIFBSTSBDTE9DS1MgKi8KLQotLyogQWNjb3JkaW5nIHRvIHRpbWVyMzJrLmMsIHRoaXMgaXMgYSAzMjc2OEh6IGNsb2NrLCBub3QgYSAzMjAwMEh6IGNsb2NrLiAqLwotc3RhdGljIHN0cnVjdCBjbGsgb21hcF8zMmtfZmNrID0gewotCS5uYW1lCQk9ICJvbWFwXzMya19mY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5yYXRlCQk9IDMyNzY4LAotCS5mbGFncwkJPSBSQVRFX0ZJWEVELAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgc2VjdXJlXzMya19mY2sgPSB7Ci0JLm5hbWUJCT0gInNlY3VyZV8zMmtfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfbnVsbCwKLQkucmF0ZQkJPSAzMjc2OCwKLQkuZmxhZ3MJCT0gUkFURV9GSVhFRCwKLX07Ci0KLS8qIFZpcnR1YWwgc291cmNlIGNsb2NrcyBmb3Igb3NjX3N5c19jayAqLwotc3RhdGljIHN0cnVjdCBjbGsgdmlydF8xMm1fY2sgPSB7Ci0JLm5hbWUJCT0gInZpcnRfMTJtX2NrIiwKLQkub3BzCQk9ICZjbGtvcHNfbnVsbCwKLQkucmF0ZQkJPSAxMjAwMDAwMCwKLQkuZmxhZ3MJCT0gUkFURV9GSVhFRCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHZpcnRfMTNtX2NrID0gewotCS5uYW1lCQk9ICJ2aXJ0XzEzbV9jayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnJhdGUJCT0gMTMwMDAwMDAsCi0JLmZsYWdzCQk9IFJBVEVfRklYRUQsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayB2aXJ0XzE2XzhtX2NrID0gewotCS5uYW1lCQk9ICJ2aXJ0XzE2XzhtX2NrIiwKLQkub3BzCQk9ICZjbGtvcHNfbnVsbCwKLQkucmF0ZQkJPSAxNjgwMDAwMCwKLQkuZmxhZ3MJCT0gUkFURV9GSVhFRCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHZpcnRfMTlfMm1fY2sgPSB7Ci0JLm5hbWUJCT0gInZpcnRfMTlfMm1fY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5yYXRlCQk9IDE5MjAwMDAwLAotCS5mbGFncwkJPSBSQVRFX0ZJWEVELAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgdmlydF8yNm1fY2sgPSB7Ci0JLm5hbWUJCT0gInZpcnRfMjZtX2NrIiwKLQkub3BzCQk9ICZjbGtvcHNfbnVsbCwKLQkucmF0ZQkJPSAyNjAwMDAwMCwKLQkuZmxhZ3MJCT0gUkFURV9GSVhFRCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHZpcnRfMzhfNG1fY2sgPSB7Ci0JLm5hbWUJCT0gInZpcnRfMzhfNG1fY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5yYXRlCQk9IDM4NDAwMDAwLAotCS5mbGFncwkJPSBSQVRFX0ZJWEVELAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBvc2Nfc3lzXzEybV9yYXRlc1tdID0gewotCXsgLmRpdiA9IDEsIC52YWwgPSAwLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfCBERUZBVUxUX1JBVEUgfSwKLQl7IC5kaXYgPSAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgb3NjX3N5c18xM21fcmF0ZXNbXSA9IHsKLQl7IC5kaXYgPSAxLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8zNDNYIHwgREVGQVVMVF9SQVRFIH0sCi0JeyAuZGl2ID0gMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIG9zY19zeXNfMTZfOG1fcmF0ZXNbXSA9IHsKLQl7IC5kaXYgPSAxLCAudmFsID0gNSwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIHwgREVGQVVMVF9SQVRFIH0sCi0JeyAuZGl2ID0gMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIG9zY19zeXNfMTlfMm1fcmF0ZXNbXSA9IHsKLQl7IC5kaXYgPSAxLCAudmFsID0gMiwgLmZsYWdzID0gUkFURV9JTl8zNDNYIHwgREVGQVVMVF9SQVRFIH0sCi0JeyAuZGl2ID0gMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIG9zY19zeXNfMjZtX3JhdGVzW10gPSB7Ci0JeyAuZGl2ID0gMSwgLnZhbCA9IDMsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB8IERFRkFVTFRfUkFURSB9LAotCXsgLmRpdiA9IDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBvc2Nfc3lzXzM4XzRtX3JhdGVzW10gPSB7Ci0JeyAuZGl2ID0gMSwgLnZhbCA9IDQsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB8IERFRkFVTFRfUkFURSB9LAotCXsgLmRpdiA9IDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgb3NjX3N5c19jbGtzZWxbXSA9IHsKLQl7IC5wYXJlbnQgPSAmdmlydF8xMm1fY2ssICAgLnJhdGVzID0gb3NjX3N5c18xMm1fcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSAmdmlydF8xM21fY2ssICAgLnJhdGVzID0gb3NjX3N5c18xM21fcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSAmdmlydF8xNl84bV9jaywgLnJhdGVzID0gb3NjX3N5c18xNl84bV9yYXRlcyB9LAotCXsgLnBhcmVudCA9ICZ2aXJ0XzE5XzJtX2NrLCAucmF0ZXMgPSBvc2Nfc3lzXzE5XzJtX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gJnZpcnRfMjZtX2NrLCAgIC5yYXRlcyA9IG9zY19zeXNfMjZtX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gJnZpcnRfMzhfNG1fY2ssIC5yYXRlcyA9IG9zY19zeXNfMzhfNG1fcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSBOVUxMIH0sCi19OwotCi0vKiBPc2NpbGxhdG9yIGNsb2NrICovCi0vKiAxMiwgMTMsIDE2LjgsIDE5LjIsIDI2LCBvciAzOC40IE1IeiAqLwotc3RhdGljIHN0cnVjdCBjbGsgb3NjX3N5c19jayA9IHsKLQkubmFtZQkJPSAib3NjX3N5c19jayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKLQkuY2xrc2VsX3JlZwk9IE9NQVAzNDMwX1BSTV9DTEtTRUwsCi0JLmNsa3NlbF9tYXNrCT0gT01BUDM0MzBfU1lTX0NMS0lOX1NFTF9NQVNLLAotCS5jbGtzZWwJCT0gb3NjX3N5c19jbGtzZWwsCi0JLyogUkVWSVNJVDogZGVhbCB3aXRoIGF1dG9leHRjbGttb2RlPyAqLwotCS5mbGFncwkJPSBSQVRFX0ZJWEVELAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGRpdjJfcmF0ZXNbXSA9IHsKLQl7IC5kaXYgPSAxLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8zNDNYIHwgREVGQVVMVF9SQVRFIH0sCi0JeyAuZGl2ID0gMiwgLnZhbCA9IDIsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAotCXsgLmRpdiA9IDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgc3lzX2Nsa3NlbFtdID0gewotCXsgLnBhcmVudCA9ICZvc2Nfc3lzX2NrLCAucmF0ZXMgPSBkaXYyX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gTlVMTCB9Ci19OwotCi0vKiBMYXRlbmN5OiB0aGlzIGNsb2NrIGlzIG9ubHkgZW5hYmxlZCBhZnRlciBQUk1fQ0xLU0VUVVAuU0VUVVBfVElNRSAqLwotLyogRmVlZHMgRFBMTHMgLSBkaXZpZGVkIGZpcnN0IGJ5IFBSTV9DTEtTUkNfQ1RSTC5TWVNDTEtESVY/ICovCi1zdGF0aWMgc3RydWN0IGNsayBzeXNfY2sgPSB7Ci0JLm5hbWUJCT0gInN5c19jayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmb3NjX3N5c19jaywKLQkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAotCS5jbGtzZWxfcmVnCT0gT01BUDM0MzBfUFJNX0NMS1NSQ19DVFJMLAotCS5jbGtzZWxfbWFzawk9IE9NQVBfU1lTQ0xLRElWX01BU0ssCi0JLmNsa3NlbAkJPSBzeXNfY2xrc2VsLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBzeXNfYWx0Y2xrID0gewotCS5uYW1lCQk9ICJzeXNfYWx0Y2xrIiwKLQkub3BzCQk9ICZjbGtvcHNfbnVsbCwKLX07Ci0KLS8qIE9wdGlvbmFsIGV4dGVybmFsIGNsb2NrIGlucHV0IGZvciBzb21lIE1jQlNQcyAqLwotc3RhdGljIHN0cnVjdCBjbGsgbWNic3BfY2xrcyA9IHsKLQkubmFtZQkJPSAibWNic3BfY2xrcyIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi19OwotCi0vKiBQUk0gRVhURVJOQUwgQ0xPQ0sgT1VUUFVUICovCi0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHN5c19jbGtvdXQxID0gewotCS5uYW1lCQk9ICJzeXNfY2xrb3V0MSIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCi0JLnBhcmVudAkJPSAmb3NjX3N5c19jaywKLQkuZW5hYmxlX3JlZwk9IE9NQVAzNDMwX1BSTV9DTEtPVVRfQ1RSTCwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0NMS09VVF9FTl9TSElGVCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotLyogRFBMTFMgKi8KLQotLyogQ00gQ0xPQ0tTICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgZGl2MTZfZHBsbF9yYXRlc1tdID0gewotCXsgLmRpdiA9IDEsIC52YWwgPSAxLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfCBERUZBVUxUX1JBVEUgfSwKLQl7IC5kaXYgPSAyLCAudmFsID0gMiwgLmZsYWdzID0gUkFURV9JTl8zNDNYIH0sCi0JeyAuZGl2ID0gMywgLnZhbCA9IDMsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAotCXsgLmRpdiA9IDQsIC52YWwgPSA0LCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfSwKLQl7IC5kaXYgPSA1LCAudmFsID0gNSwgLmZsYWdzID0gUkFURV9JTl8zNDNYIH0sCi0JeyAuZGl2ID0gNiwgLnZhbCA9IDYsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAotCXsgLmRpdiA9IDcsIC52YWwgPSA3LCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfSwKLQl7IC5kaXYgPSA4LCAudmFsID0gOCwgLmZsYWdzID0gUkFURV9JTl8zNDNYIH0sCi0JeyAuZGl2ID0gOSwgLnZhbCA9IDksIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAotCXsgLmRpdiA9IDEwLCAudmFsID0gMTAsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAotCXsgLmRpdiA9IDExLCAudmFsID0gMTEsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAotCXsgLmRpdiA9IDEyLCAudmFsID0gMTIsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAotCXsgLmRpdiA9IDEzLCAudmFsID0gMTMsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAotCXsgLmRpdiA9IDE0LCAudmFsID0gMTQsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAotCXsgLmRpdiA9IDE1LCAudmFsID0gMTUsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAotCXsgLmRpdiA9IDE2LCAudmFsID0gMTYsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAotCXsgLmRpdiA9IDAgfQotfTsKLQotLyogRFBMTDEgKi8KLS8qIE1QVSBjbG9jayBzb3VyY2UgKi8KLS8qIFR5cGU6IERQTEwgKi8KLXN0YXRpYyBzdHJ1Y3QgZHBsbF9kYXRhIGRwbGwxX2RkID0gewotCS5tdWx0X2RpdjFfcmVnCT0gT01BUF9DTV9SRUdBRERSKE1QVV9NT0QsIE9NQVAzNDMwX0NNX0NMS1NFTDFfUExMKSwKLQkubXVsdF9tYXNrCT0gT01BUDM0MzBfTVBVX0RQTExfTVVMVF9NQVNLLAotCS5kaXYxX21hc2sJPSBPTUFQMzQzMF9NUFVfRFBMTF9ESVZfTUFTSywKLQkuY2xrX2J5cGFzcwk9ICZkcGxsMV9mY2ssCi0JLmNsa19yZWYJPSAmc3lzX2NrLAotCS5mcmVxc2VsX21hc2sJPSBPTUFQMzQzMF9NUFVfRFBMTF9GUkVRU0VMX01BU0ssCi0JLmNvbnRyb2xfcmVnCT0gT01BUF9DTV9SRUdBRERSKE1QVV9NT0QsIE9NQVAzNDMwX0NNX0NMS0VOX1BMTCksCi0JLmVuYWJsZV9tYXNrCT0gT01BUDM0MzBfRU5fTVBVX0RQTExfTUFTSywKLQkubW9kZXMJCT0gKDEgPDwgRFBMTF9MT1dfUE9XRVJfQllQQVNTKSB8ICgxIDw8IERQTExfTE9DS0VEKSwKLQkuYXV0b19yZWNhbF9iaXQJPSBPTUFQMzQzMF9FTl9NUFVfRFBMTF9EUklGVEdVQVJEX1NISUZULAotCS5yZWNhbF9lbl9iaXQJPSBPTUFQMzQzMF9NUFVfRFBMTF9SRUNBTF9FTl9TSElGVCwKLQkucmVjYWxfc3RfYml0CT0gT01BUDM0MzBfTVBVX0RQTExfU1RfU0hJRlQsCi0JLmF1dG9pZGxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihNUFVfTU9ELCBPTUFQMzQzMF9DTV9BVVRPSURMRV9QTEwpLAotCS5hdXRvaWRsZV9tYXNrCT0gT01BUDM0MzBfQVVUT19NUFVfRFBMTF9NQVNLLAotCS5pZGxlc3RfcmVnCT0gT01BUF9DTV9SRUdBRERSKE1QVV9NT0QsIE9NQVAzNDMwX0NNX0lETEVTVF9QTEwpLAotCS5pZGxlc3RfbWFzawk9IE9NQVAzNDMwX1NUX01QVV9DTEtfTUFTSywKLQkubWF4X211bHRpcGxpZXIgPSBPTUFQM19NQVhfRFBMTF9NVUxULAotCS5taW5fZGl2aWRlcgk9IDEsCi0JLm1heF9kaXZpZGVyCT0gT01BUDNfTUFYX0RQTExfRElWLAotCS5yYXRlX3RvbGVyYW5jZSA9IERFRkFVTFRfRFBMTF9SQVRFX1RPTEVSQU5DRQotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZHBsbDFfY2sgPSB7Ci0JLm5hbWUJCT0gImRwbGwxX2NrIiwKLQkub3BzCQk9ICZjbGtvcHNfbnVsbCwKLQkucGFyZW50CQk9ICZzeXNfY2ssCi0JLmRwbGxfZGF0YQk9ICZkcGxsMV9kZCwKLQkucm91bmRfcmF0ZQk9ICZvbWFwMl9kcGxsX3JvdW5kX3JhdGUsCi0JLnNldF9yYXRlCT0gJm9tYXAzX25vbmNvcmVfZHBsbF9zZXRfcmF0ZSwKLQkuY2xrZG1fbmFtZQk9ICJkcGxsMV9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmb21hcDNfZHBsbF9yZWNhbGMsCi19OwotCi0vKgotICogVGhpcyB2aXJ0dWFsIGNsb2NrIHByb3ZpZGVzIHRoZSBDTEtPVVRYMiBvdXRwdXQgZnJvbSB0aGUgRFBMTCBpZiB0aGUKLSAqIERQTEwgaXNuJ3QgYnlwYXNzZWQuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrIGRwbGwxX3gyX2NrID0gewotCS5uYW1lCQk9ICJkcGxsMV94Ml9jayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmZHBsbDFfY2ssCi0JLmNsa2RtX25hbWUJPSAiZHBsbDFfY2xrZG0iLAotCS5yZWNhbGMJCT0gJm9tYXAzX2Nsa291dHgyX3JlY2FsYywKLX07Ci0KLS8qIE9uIERQTEwxLCB1bmxpa2Ugb3RoZXIgRFBMTHMsIHRoZSBkaXZpZGVyIGlzIGRvd25zdHJlYW0gZnJvbSBDTEtPVVRYMiAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgZGl2MTZfZHBsbDFfeDJtMl9jbGtzZWxbXSA9IHsKLQl7IC5wYXJlbnQgPSAmZHBsbDFfeDJfY2ssIC5yYXRlcyA9IGRpdjE2X2RwbGxfcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSBOVUxMIH0KLX07Ci0KLS8qCi0gKiBEb2VzIG5vdCBleGlzdCBpbiB0aGUgVFJNIC0gbmVlZGVkIHRvIHNlcGFyYXRlIHRoZSBNMiBkaXZpZGVyIGZyb20KLSAqIGJ5cGFzcyBzZWxlY3Rpb24gaW4gbXB1X2NrCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrIGRwbGwxX3gybTJfY2sgPSB7Ci0JLm5hbWUJCT0gImRwbGwxX3gybTJfY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJmRwbGwxX3gyX2NrLAotCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCi0JLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoTVBVX01PRCwgT01BUDM0MzBfQ01fQ0xLU0VMMl9QTEwpLAotCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX01QVV9EUExMX0NMS09VVF9ESVZfTUFTSywKLQkuY2xrc2VsCQk9IGRpdjE2X2RwbGwxX3gybTJfY2xrc2VsLAotCS5jbGtkbV9uYW1lCT0gImRwbGwxX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotfTsKLQotLyogRFBMTDIgKi8KLS8qIElWQTIgY2xvY2sgc291cmNlICovCi0vKiBUeXBlOiBEUExMICovCi0KLXN0YXRpYyBzdHJ1Y3QgZHBsbF9kYXRhIGRwbGwyX2RkID0gewotCS5tdWx0X2RpdjFfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX0lWQTJfTU9ELCBPTUFQMzQzMF9DTV9DTEtTRUwxX1BMTCksCi0JLm11bHRfbWFzawk9IE9NQVAzNDMwX0lWQTJfRFBMTF9NVUxUX01BU0ssCi0JLmRpdjFfbWFzawk9IE9NQVAzNDMwX0lWQTJfRFBMTF9ESVZfTUFTSywKLQkuY2xrX2J5cGFzcwk9ICZkcGxsMl9mY2ssCi0JLmNsa19yZWYJPSAmc3lzX2NrLAotCS5mcmVxc2VsX21hc2sJPSBPTUFQMzQzMF9JVkEyX0RQTExfRlJFUVNFTF9NQVNLLAotCS5jb250cm9sX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9JVkEyX01PRCwgT01BUDM0MzBfQ01fQ0xLRU5fUExMKSwKLQkuZW5hYmxlX21hc2sJPSBPTUFQMzQzMF9FTl9JVkEyX0RQTExfTUFTSywKLQkubW9kZXMJCT0gKDEgPDwgRFBMTF9MT1dfUE9XRVJfU1RPUCkgfCAoMSA8PCBEUExMX0xPQ0tFRCkgfAotCQkJCSgxIDw8IERQTExfTE9XX1BPV0VSX0JZUEFTUyksCi0JLmF1dG9fcmVjYWxfYml0CT0gT01BUDM0MzBfRU5fSVZBMl9EUExMX0RSSUZUR1VBUkRfU0hJRlQsCi0JLnJlY2FsX2VuX2JpdAk9IE9NQVAzNDMwX1BSTV9JUlFFTkFCTEVfTVBVX0lWQTJfRFBMTF9SRUNBTF9FTl9TSElGVCwKLQkucmVjYWxfc3RfYml0CT0gT01BUDM0MzBfUFJNX0lSUVNUQVRVU19NUFVfSVZBMl9EUExMX1NUX1NISUZULAotCS5hdXRvaWRsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfSVZBMl9NT0QsIE9NQVAzNDMwX0NNX0FVVE9JRExFX1BMTCksCi0JLmF1dG9pZGxlX21hc2sJPSBPTUFQMzQzMF9BVVRPX0lWQTJfRFBMTF9NQVNLLAotCS5pZGxlc3RfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX0lWQTJfTU9ELCBPTUFQMzQzMF9DTV9JRExFU1RfUExMKSwKLQkuaWRsZXN0X21hc2sJPSBPTUFQMzQzMF9TVF9JVkEyX0NMS19NQVNLLAotCS5tYXhfbXVsdGlwbGllciA9IE9NQVAzX01BWF9EUExMX01VTFQsCi0JLm1pbl9kaXZpZGVyCT0gMSwKLQkubWF4X2RpdmlkZXIJPSBPTUFQM19NQVhfRFBMTF9ESVYsCi0JLnJhdGVfdG9sZXJhbmNlID0gREVGQVVMVF9EUExMX1JBVEVfVE9MRVJBTkNFCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBkcGxsMl9jayA9IHsKLQkubmFtZQkJPSAiZHBsbDJfY2siLAotCS5vcHMJCT0gJmNsa29wc19ub25jb3JlX2RwbGxfb3BzLAotCS5wYXJlbnQJCT0gJnN5c19jaywKLQkuZHBsbF9kYXRhCT0gJmRwbGwyX2RkLAotCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2RwbGxfcm91bmRfcmF0ZSwKLQkuc2V0X3JhdGUJPSAmb21hcDNfbm9uY29yZV9kcGxsX3NldF9yYXRlLAotCS5jbGtkbV9uYW1lCT0gImRwbGwyX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZvbWFwM19kcGxsX3JlY2FsYywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGRpdjE2X2RwbGwyX20yeDJfY2xrc2VsW10gPSB7Ci0JeyAucGFyZW50ID0gJmRwbGwyX2NrLCAucmF0ZXMgPSBkaXYxNl9kcGxsX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gTlVMTCB9Ci19OwotCi0vKgotICogVGhlIFRSTSBpcyBjb25mbGljdGVkIG9uIHdoZXRoZXIgSVZBMiBjbG9jayBjb21lcyBmcm9tIERQTEwyIENMS09VVAotICogb3IgQ0xLT1VUWDIuIENMS09VVCBzZWVtcyBtb3N0IHBsYXVzaWJsZS4KLSAqLwotc3RhdGljIHN0cnVjdCBjbGsgZHBsbDJfbTJfY2sgPSB7Ci0JLm5hbWUJCT0gImRwbGwyX20yX2NrIiwKLQkub3BzCQk9ICZjbGtvcHNfbnVsbCwKLQkucGFyZW50CQk9ICZkcGxsMl9jaywKLQkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAotCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX0lWQTJfTU9ELAotCQkJCQkgIE9NQVAzNDMwX0NNX0NMS1NFTDJfUExMKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9JVkEyX0RQTExfQ0xLT1VUX0RJVl9NQVNLLAotCS5jbGtzZWwJCT0gZGl2MTZfZHBsbDJfbTJ4Ml9jbGtzZWwsCi0JLmNsa2RtX25hbWUJPSAiZHBsbDJfY2xrZG0iLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi19OwotCi0vKgotICogRFBMTDMKLSAqIFNvdXJjZSBjbG9jayBmb3IgYWxsIGludGVyZmFjZXMgYW5kIGZvciBzb21lIGRldmljZSBmY2xrcwotICogUkVWSVNJVDogQWxzbyBzdXBwb3J0cyBmYXN0IHJlbG9jayBieXBhc3MgLSBub3QgaW5jbHVkZWQgYmVsb3cKLSAqLwotc3RhdGljIHN0cnVjdCBkcGxsX2RhdGEgZHBsbDNfZGQgPSB7Ci0JLm11bHRfZGl2MV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQ0xLU0VMMSksCi0JLm11bHRfbWFzawk9IE9NQVAzNDMwX0NPUkVfRFBMTF9NVUxUX01BU0ssCi0JLmRpdjFfbWFzawk9IE9NQVAzNDMwX0NPUkVfRFBMTF9ESVZfTUFTSywKLQkuY2xrX2J5cGFzcwk9ICZzeXNfY2ssCi0JLmNsa19yZWYJPSAmc3lzX2NrLAotCS5mcmVxc2VsX21hc2sJPSBPTUFQMzQzMF9DT1JFX0RQTExfRlJFUVNFTF9NQVNLLAotCS5jb250cm9sX3JlZwk9IE9NQVBfQ01fUkVHQUREUihQTExfTU9ELCBDTV9DTEtFTiksCi0JLmVuYWJsZV9tYXNrCT0gT01BUDM0MzBfRU5fQ09SRV9EUExMX01BU0ssCi0JLmF1dG9fcmVjYWxfYml0CT0gT01BUDM0MzBfRU5fQ09SRV9EUExMX0RSSUZUR1VBUkRfU0hJRlQsCi0JLnJlY2FsX2VuX2JpdAk9IE9NQVAzNDMwX0NPUkVfRFBMTF9SRUNBTF9FTl9TSElGVCwKLQkucmVjYWxfc3RfYml0CT0gT01BUDM0MzBfQ09SRV9EUExMX1NUX1NISUZULAotCS5hdXRvaWRsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQVVUT0lETEUpLAotCS5hdXRvaWRsZV9tYXNrCT0gT01BUDM0MzBfQVVUT19DT1JFX0RQTExfTUFTSywKLQkuaWRsZXN0X3JlZwk9IE9NQVBfQ01fUkVHQUREUihQTExfTU9ELCBDTV9JRExFU1QpLAotCS5pZGxlc3RfbWFzawk9IE9NQVAzNDMwX1NUX0NPUkVfQ0xLX01BU0ssCi0JLm1heF9tdWx0aXBsaWVyID0gT01BUDNfTUFYX0RQTExfTVVMVCwKLQkubWluX2RpdmlkZXIJPSAxLAotCS5tYXhfZGl2aWRlcgk9IE9NQVAzX01BWF9EUExMX0RJViwKLQkucmF0ZV90b2xlcmFuY2UgPSBERUZBVUxUX0RQTExfUkFURV9UT0xFUkFOQ0UKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGRwbGwzX2NrID0gewotCS5uYW1lCQk9ICJkcGxsM19jayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmc3lzX2NrLAotCS5kcGxsX2RhdGEJPSAmZHBsbDNfZGQsCi0JLnJvdW5kX3JhdGUJPSAmb21hcDJfZHBsbF9yb3VuZF9yYXRlLAotCS5jbGtkbV9uYW1lCT0gImRwbGwzX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZvbWFwM19kcGxsX3JlY2FsYywKLX07Ci0KLS8qCi0gKiBUaGlzIHZpcnR1YWwgY2xvY2sgcHJvdmlkZXMgdGhlIENMS09VVFgyIG91dHB1dCBmcm9tIHRoZSBEUExMIGlmIHRoZQotICogRFBMTCBpc24ndCBieXBhc3NlZAotICovCi1zdGF0aWMgc3RydWN0IGNsayBkcGxsM194Ml9jayA9IHsKLQkubmFtZQkJPSAiZHBsbDNfeDJfY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJmRwbGwzX2NrLAotCS5jbGtkbV9uYW1lCT0gImRwbGwzX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZvbWFwM19jbGtvdXR4Ml9yZWNhbGMsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGRpdjMxX2RwbGwzX3JhdGVzW10gPSB7Ci0JeyAuZGl2ID0gMSwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB8IERFRkFVTFRfUkFURSB9LAotCXsgLmRpdiA9IDIsIC52YWwgPSAyLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfSwKLQl7IC5kaXYgPSAzLCAudmFsID0gMywgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCi0JeyAuZGl2ID0gNCwgLnZhbCA9IDQsIC5mbGFncyA9IFJBVEVfSU5fMzQzMEVTMiB9LAotCXsgLmRpdiA9IDUsIC52YWwgPSA1LCAuZmxhZ3MgPSBSQVRFX0lOXzM0MzBFUzIgfSwKLQl7IC5kaXYgPSA2LCAudmFsID0gNiwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCi0JeyAuZGl2ID0gNywgLnZhbCA9IDcsIC5mbGFncyA9IFJBVEVfSU5fMzQzMEVTMiB9LAotCXsgLmRpdiA9IDgsIC52YWwgPSA4LCAuZmxhZ3MgPSBSQVRFX0lOXzM0MzBFUzIgfSwKLQl7IC5kaXYgPSA5LCAudmFsID0gOSwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCi0JeyAuZGl2ID0gMTAsIC52YWwgPSAxMCwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCi0JeyAuZGl2ID0gMTEsIC52YWwgPSAxMSwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCi0JeyAuZGl2ID0gMTIsIC52YWwgPSAxMiwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCi0JeyAuZGl2ID0gMTMsIC52YWwgPSAxMywgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCi0JeyAuZGl2ID0gMTQsIC52YWwgPSAxNCwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCi0JeyAuZGl2ID0gMTUsIC52YWwgPSAxNSwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCi0JeyAuZGl2ID0gMTYsIC52YWwgPSAxNiwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCi0JeyAuZGl2ID0gMTcsIC52YWwgPSAxNywgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCi0JeyAuZGl2ID0gMTgsIC52YWwgPSAxOCwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCi0JeyAuZGl2ID0gMTksIC52YWwgPSAxOSwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCi0JeyAuZGl2ID0gMjAsIC52YWwgPSAyMCwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCi0JeyAuZGl2ID0gMjEsIC52YWwgPSAyMSwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCi0JeyAuZGl2ID0gMjIsIC52YWwgPSAyMiwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCi0JeyAuZGl2ID0gMjMsIC52YWwgPSAyMywgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCi0JeyAuZGl2ID0gMjQsIC52YWwgPSAyNCwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCi0JeyAuZGl2ID0gMjUsIC52YWwgPSAyNSwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCi0JeyAuZGl2ID0gMjYsIC52YWwgPSAyNiwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCi0JeyAuZGl2ID0gMjcsIC52YWwgPSAyNywgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCi0JeyAuZGl2ID0gMjgsIC52YWwgPSAyOCwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCi0JeyAuZGl2ID0gMjksIC52YWwgPSAyOSwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCi0JeyAuZGl2ID0gMzAsIC52YWwgPSAzMCwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCi0JeyAuZGl2ID0gMzEsIC52YWwgPSAzMSwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCi0JeyAuZGl2ID0gMCB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgZGl2MzFfZHBsbDNtMl9jbGtzZWxbXSA9IHsKLQl7IC5wYXJlbnQgPSAmZHBsbDNfY2ssIC5yYXRlcyA9IGRpdjMxX2RwbGwzX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gTlVMTCB9Ci19OwotCi0vKiBEUExMMyBvdXRwdXQgTTIgLSBwcmltYXJ5IGNvbnRyb2wgcG9pbnQgZm9yIENPUkUgc3BlZWQgKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrIGRwbGwzX20yX2NrID0gewotCS5uYW1lCQk9ICJkcGxsM19tMl9jayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmZHBsbDNfY2ssCi0JLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihQTExfTU9ELCBDTV9DTEtTRUwxKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9DT1JFX0RQTExfQ0xLT1VUX0RJVl9NQVNLLAotCS5jbGtzZWwJCT0gZGl2MzFfZHBsbDNtMl9jbGtzZWwsCi0JLmNsa2RtX25hbWUJPSAiZHBsbDNfY2xrZG0iLAotCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9yb3VuZF9yYXRlLAotCS5zZXRfcmF0ZQk9ICZvbWFwM19jb3JlX2RwbGxfbTJfc2V0X3JhdGUsCi0JLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGNvcmVfY2sgPSB7Ci0JLm5hbWUJCT0gImNvcmVfY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJmRwbGwzX20yX2NrLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBkcGxsM19tMngyX2NrID0gewotCS5uYW1lCQk9ICJkcGxsM19tMngyX2NrIiwKLQkub3BzCQk9ICZjbGtvcHNfbnVsbCwKLQkucGFyZW50CQk9ICZkcGxsM19tMl9jaywKLQkuY2xrZG1fbmFtZQk9ICJkcGxsM19jbGtkbSIsCi0JLnJlY2FsYwkJPSAmb21hcDNfY2xrb3V0eDJfcmVjYWxjLAotfTsKLQotLyogVGhlIFBXUkROIGJpdCBpcyBhcHBhcmVudGx5IG9ubHkgYXZhaWxhYmxlIG9uIDM0MzBFUzIgYW5kIGFib3ZlICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBkaXYxNl9kcGxsM19jbGtzZWxbXSA9IHsKLQl7IC5wYXJlbnQgPSAmZHBsbDNfY2ssIC5yYXRlcyA9IGRpdjE2X2RwbGxfcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSBOVUxMIH0KLX07Ci0KLS8qIFRoaXMgdmlydHVhbCBjbG9jayBpcyB0aGUgc291cmNlIGZvciBkcGxsM19tM3gyX2NrICovCi1zdGF0aWMgc3RydWN0IGNsayBkcGxsM19tM19jayA9IHsKLQkubmFtZQkJPSAiZHBsbDNfbTNfY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJmRwbGwzX2NrLAotCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCi0JLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfRU1VX01PRCwgQ01fQ0xLU0VMMSksCi0JLmNsa3NlbF9tYXNrCT0gT01BUDM0MzBfRElWX0RQTEwzX01BU0ssCi0JLmNsa3NlbAkJPSBkaXYxNl9kcGxsM19jbGtzZWwsCi0JLmNsa2RtX25hbWUJPSAiZHBsbDNfY2xrZG0iLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi19OwotCi0vKiBUaGUgUFdSRE4gYml0IGlzIGFwcGFyZW50bHkgb25seSBhdmFpbGFibGUgb24gMzQzMEVTMiBhbmQgYWJvdmUgKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrIGRwbGwzX20zeDJfY2sgPSB7Ci0JLm5hbWUJCT0gImRwbGwzX20zeDJfY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmZHBsbDNfbTNfY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfUFdSRE5fRU1VX0NPUkVfU0hJRlQsCi0JLmZsYWdzCQk9IElOVkVSVF9FTkFCTEUsCi0JLmNsa2RtX25hbWUJPSAiZHBsbDNfY2xrZG0iLAotCS5yZWNhbGMJCT0gJm9tYXAzX2Nsa291dHgyX3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGVtdV9jb3JlX2Fsd29uX2NrID0gewotCS5uYW1lCQk9ICJlbXVfY29yZV9hbHdvbl9jayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmZHBsbDNfbTN4Ml9jaywKLQkuY2xrZG1fbmFtZQk9ICJkcGxsM19jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLS8qIERQTEw0ICovCi0vKiBTdXBwbGllcyA5Nk1IeiwgNTRNaHogVFYgREFDLCBEU1MgZmNsaywgQ0FNIHNlbnNvciBjbG9jaywgZW11bCB0cmFjZSBjbGsgKi8KLS8qIFR5cGU6IERQTEwgKi8KLXN0YXRpYyBzdHJ1Y3QgZHBsbF9kYXRhIGRwbGw0X2RkID0gewotCS5tdWx0X2RpdjFfcmVnCT0gT01BUF9DTV9SRUdBRERSKFBMTF9NT0QsIENNX0NMS1NFTDIpLAotCS5tdWx0X21hc2sJPSBPTUFQMzQzMF9QRVJJUEhfRFBMTF9NVUxUX01BU0ssCi0JLmRpdjFfbWFzawk9IE9NQVAzNDMwX1BFUklQSF9EUExMX0RJVl9NQVNLLAotCS5jbGtfYnlwYXNzCT0gJnN5c19jaywKLQkuY2xrX3JlZgk9ICZzeXNfY2ssCi0JLmZyZXFzZWxfbWFzawk9IE9NQVAzNDMwX1BFUklQSF9EUExMX0ZSRVFTRUxfTUFTSywKLQkuY29udHJvbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQ0xLRU4pLAotCS5lbmFibGVfbWFzawk9IE9NQVAzNDMwX0VOX1BFUklQSF9EUExMX01BU0ssCi0JLm1vZGVzCQk9ICgxIDw8IERQTExfTE9XX1BPV0VSX1NUT1ApIHwgKDEgPDwgRFBMTF9MT0NLRUQpLAotCS5hdXRvX3JlY2FsX2JpdAk9IE9NQVAzNDMwX0VOX1BFUklQSF9EUExMX0RSSUZUR1VBUkRfU0hJRlQsCi0JLnJlY2FsX2VuX2JpdAk9IE9NQVAzNDMwX1BFUklQSF9EUExMX1JFQ0FMX0VOX1NISUZULAotCS5yZWNhbF9zdF9iaXQJPSBPTUFQMzQzMF9QRVJJUEhfRFBMTF9TVF9TSElGVCwKLQkuYXV0b2lkbGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKFBMTF9NT0QsIENNX0FVVE9JRExFKSwKLQkuYXV0b2lkbGVfbWFzawk9IE9NQVAzNDMwX0FVVE9fUEVSSVBIX0RQTExfTUFTSywKLQkuaWRsZXN0X3JlZwk9IE9NQVBfQ01fUkVHQUREUihQTExfTU9ELCBDTV9JRExFU1QpLAotCS5pZGxlc3RfbWFzawk9IE9NQVAzNDMwX1NUX1BFUklQSF9DTEtfTUFTSywKLQkubWF4X211bHRpcGxpZXIgPSBPTUFQM19NQVhfRFBMTF9NVUxULAotCS5taW5fZGl2aWRlcgk9IDEsCi0JLm1heF9kaXZpZGVyCT0gT01BUDNfTUFYX0RQTExfRElWLAotCS5yYXRlX3RvbGVyYW5jZSA9IERFRkFVTFRfRFBMTF9SQVRFX1RPTEVSQU5DRQotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZHBsbDRfY2sgPSB7Ci0JLm5hbWUJCT0gImRwbGw0X2NrIiwKLQkub3BzCQk9ICZjbGtvcHNfbm9uY29yZV9kcGxsX29wcywKLQkucGFyZW50CQk9ICZzeXNfY2ssCi0JLmRwbGxfZGF0YQk9ICZkcGxsNF9kZCwKLQkucm91bmRfcmF0ZQk9ICZvbWFwMl9kcGxsX3JvdW5kX3JhdGUsCi0JLnNldF9yYXRlCT0gJm9tYXAzX2RwbGw0X3NldF9yYXRlLAotCS5jbGtkbV9uYW1lCT0gImRwbGw0X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZvbWFwM19kcGxsX3JlY2FsYywKLX07Ci0KLS8qCi0gKiBUaGlzIHZpcnR1YWwgY2xvY2sgcHJvdmlkZXMgdGhlIENMS09VVFgyIG91dHB1dCBmcm9tIHRoZSBEUExMIGlmIHRoZQotICogRFBMTCBpc24ndCBieXBhc3NlZCAtLQotICogWFhYIGRvZXMgdGhpcyBzZXJ2ZSBhbnkgZG93bnN0cmVhbSBjbG9ja3M/Ci0gKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrIGRwbGw0X3gyX2NrID0gewotCS5uYW1lCQk9ICJkcGxsNF94Ml9jayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmZHBsbDRfY2ssCi0JLmNsa2RtX25hbWUJPSAiZHBsbDRfY2xrZG0iLAotCS5yZWNhbGMJCT0gJm9tYXAzX2Nsa291dHgyX3JlY2FsYywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGRpdjE2X2RwbGw0X2Nsa3NlbFtdID0gewotCXsgLnBhcmVudCA9ICZkcGxsNF9jaywgLnJhdGVzID0gZGl2MTZfZHBsbF9yYXRlcyB9LAotCXsgLnBhcmVudCA9IE5VTEwgfQotfTsKLQotLyogVGhpcyB2aXJ0dWFsIGNsb2NrIGlzIHRoZSBzb3VyY2UgZm9yIGRwbGw0X20yeDJfY2sgKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrIGRwbGw0X20yX2NrID0gewotCS5uYW1lCQk9ICJkcGxsNF9tMl9jayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmZHBsbDRfY2ssCi0JLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihQTExfTU9ELCBPTUFQMzQzMF9DTV9DTEtTRUwzKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9ESVZfOTZNX01BU0ssCi0JLmNsa3NlbAkJPSBkaXYxNl9kcGxsNF9jbGtzZWwsCi0JLmNsa2RtX25hbWUJPSAiZHBsbDRfY2xrZG0iLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi19OwotCi0vKiBUaGUgUFdSRE4gYml0IGlzIGFwcGFyZW50bHkgb25seSBhdmFpbGFibGUgb24gMzQzMEVTMiBhbmQgYWJvdmUgKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrIGRwbGw0X20yeDJfY2sgPSB7Ci0JLm5hbWUJCT0gImRwbGw0X20yeDJfY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmZHBsbDRfbTJfY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfUFdSRE5fOTZNX1NISUZULAotCS5mbGFncwkJPSBJTlZFUlRfRU5BQkxFLAotCS5jbGtkbV9uYW1lCT0gImRwbGw0X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZvbWFwM19jbGtvdXR4Ml9yZWNhbGMsCi19OwotCi0vKgotICogRFBMTDQgZ2VuZXJhdGVzIERQTEw0X00yWDJfQ0xLIHdoaWNoIGlzIHRoZW4gcm91dGVkIGludG8gdGhlIFBSTSBhcwotICogUFJNXzk2TV9BTFdPTl8oRilDTEsuICBUd28gY2xvY2tzIHRoZW4gZW1lcmdlIGZyb20gdGhlIFBSTToKLSAqIDk2TV9BTFdPTl9GQ0xLIChjYWxsZWQgIm9tYXBfOTZtX2Fsd29uX2ZjayIgYmVsb3cpIGFuZAotICogQ01fOTZLXyhGKUNMSy4KLSAqLwotc3RhdGljIHN0cnVjdCBjbGsgb21hcF85Nm1fYWx3b25fZmNrID0gewotCS5uYW1lCQk9ICJvbWFwXzk2bV9hbHdvbl9mY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJmRwbGw0X20yeDJfY2ssCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGNtXzk2bV9mY2sgPSB7Ci0JLm5hbWUJCT0gImNtXzk2bV9mY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJm9tYXBfOTZtX2Fsd29uX2ZjaywKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBvbWFwXzk2bV9kcGxsX3JhdGVzW10gPSB7Ci0JeyAuZGl2ID0gMSwgLnZhbCA9IDAsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB8IERFRkFVTFRfUkFURSB9LAotCXsgLmRpdiA9IDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBvbWFwXzk2bV9zeXNfcmF0ZXNbXSA9IHsKLQl7IC5kaXYgPSAxLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8zNDNYIHwgREVGQVVMVF9SQVRFIH0sCi0JeyAuZGl2ID0gMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBvbWFwXzk2bV9mY2tfY2xrc2VsW10gPSB7Ci0JeyAucGFyZW50ID0gJmNtXzk2bV9mY2ssIC5yYXRlcyA9IG9tYXBfOTZtX2RwbGxfcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSAmc3lzX2NrLAkgLnJhdGVzID0gb21hcF85Nm1fc3lzX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gTlVMTCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGNsayBvbWFwXzk2bV9mY2sgPSB7Ci0JLm5hbWUJCT0gIm9tYXBfOTZtX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmc3lzX2NrLAotCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCi0JLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQ0xLU0VMMSksCi0JLmNsa3NlbF9tYXNrCT0gT01BUDM0MzBfU09VUkNFXzk2TV9NQVNLLAotCS5jbGtzZWwJCT0gb21hcF85Nm1fZmNrX2Nsa3NlbCwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotfTsKLQotLyogVGhpcyB2aXJ0dWFsIGNsb2NrIGlzIHRoZSBzb3VyY2UgZm9yIGRwbGw0X20zeDJfY2sgKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrIGRwbGw0X20zX2NrID0gewotCS5uYW1lCQk9ICJkcGxsNF9tM19jayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmZHBsbDRfY2ssCi0JLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9EU1NfTU9ELCBDTV9DTEtTRUwpLAotCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9UVl9NQVNLLAotCS5jbGtzZWwJCT0gZGl2MTZfZHBsbDRfY2xrc2VsLAotCS5jbGtkbV9uYW1lCT0gImRwbGw0X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotfTsKLQotLyogVGhlIFBXUkROIGJpdCBpcyBhcHBhcmVudGx5IG9ubHkgYXZhaWxhYmxlIG9uIDM0MzBFUzIgYW5kIGFib3ZlICovCi1zdGF0aWMgc3RydWN0IGNsayBkcGxsNF9tM3gyX2NrID0gewotCS5uYW1lCQk9ICJkcGxsNF9tM3gyX2NrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmRwbGw0X20zX2NrLAotCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfUFdSRE5fVFZfU0hJRlQsCi0JLmZsYWdzCQk9IElOVkVSVF9FTkFCTEUsCi0JLmNsa2RtX25hbWUJPSAiZHBsbDRfY2xrZG0iLAotCS5yZWNhbGMJCT0gJm9tYXAzX2Nsa291dHgyX3JlY2FsYywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgb21hcF81NG1fZDRtM3gyX3JhdGVzW10gPSB7Ci0JeyAuZGl2ID0gMSwgLnZhbCA9IDAsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB8IERFRkFVTFRfUkFURSB9LAotCXsgLmRpdiA9IDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBvbWFwXzU0bV9hbHRfcmF0ZXNbXSA9IHsKLQl7IC5kaXYgPSAxLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8zNDNYIHwgREVGQVVMVF9SQVRFIH0sCi0JeyAuZGl2ID0gMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBvbWFwXzU0bV9jbGtzZWxbXSA9IHsKLQl7IC5wYXJlbnQgPSAmZHBsbDRfbTN4Ml9jaywgLnJhdGVzID0gb21hcF81NG1fZDRtM3gyX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gJnN5c19hbHRjbGssICAgIC5yYXRlcyA9IG9tYXBfNTRtX2FsdF9yYXRlcyB9LAotCXsgLnBhcmVudCA9IE5VTEwgfQotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgb21hcF81NG1fZmNrID0gewotCS5uYW1lCQk9ICJvbWFwXzU0bV9mY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCi0JLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQ0xLU0VMMSksCi0JLmNsa3NlbF9tYXNrCT0gT01BUDM0MzBfU09VUkNFXzU0TV9NQVNLLAotCS5jbGtzZWwJCT0gb21hcF81NG1fY2xrc2VsLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIG9tYXBfNDhtX2NtOTZtX3JhdGVzW10gPSB7Ci0JeyAuZGl2ID0gMiwgLnZhbCA9IDAsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB8IERFRkFVTFRfUkFURSB9LAotCXsgLmRpdiA9IDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBvbWFwXzQ4bV9hbHRfcmF0ZXNbXSA9IHsKLQl7IC5kaXYgPSAxLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8zNDNYIHwgREVGQVVMVF9SQVRFIH0sCi0JeyAuZGl2ID0gMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBvbWFwXzQ4bV9jbGtzZWxbXSA9IHsKLQl7IC5wYXJlbnQgPSAmY21fOTZtX2ZjaywgLnJhdGVzID0gb21hcF80OG1fY205Nm1fcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSAmc3lzX2FsdGNsaywgLnJhdGVzID0gb21hcF80OG1fYWx0X3JhdGVzIH0sCi0JeyAucGFyZW50ID0gTlVMTCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGNsayBvbWFwXzQ4bV9mY2sgPSB7Ci0JLm5hbWUJCT0gIm9tYXBfNDhtX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihQTExfTU9ELCBDTV9DTEtTRUwxKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9TT1VSQ0VfNDhNX01BU0ssCi0JLmNsa3NlbAkJPSBvbWFwXzQ4bV9jbGtzZWwsCi0JLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG9tYXBfMTJtX2ZjayA9IHsKLQkubmFtZQkJPSAib21hcF8xMm1fZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfbnVsbCwKLQkucGFyZW50CQk9ICZvbWFwXzQ4bV9mY2ssCi0JLmZpeGVkX2Rpdgk9IDQsCi0JLnJlY2FsYwkJPSAmb21hcDJfZml4ZWRfZGl2aXNvcl9yZWNhbGMsCi19OwotCi0vKiBUaGlzIHZpcnN0dWFsIGNsb2NrIGlzIHRoZSBzb3VyY2UgZm9yIGRwbGw0X200eDJfY2sgKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrIGRwbGw0X200X2NrID0gewotCS5uYW1lCQk9ICJkcGxsNF9tNF9jayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmZHBsbDRfY2ssCi0JLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9EU1NfTU9ELCBDTV9DTEtTRUwpLAotCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9EU1MxX01BU0ssCi0JLmNsa3NlbAkJPSBkaXYxNl9kcGxsNF9jbGtzZWwsCi0JLmNsa2RtX25hbWUJPSAiZHBsbDRfY2xrZG0iLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi0JLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZSwKLQkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKLX07Ci0KLS8qIFRoZSBQV1JETiBiaXQgaXMgYXBwYXJlbnRseSBvbmx5IGF2YWlsYWJsZSBvbiAzNDMwRVMyIGFuZCBhYm92ZSAqLwotc3RhdGljIHN0cnVjdCBjbGsgZHBsbDRfbTR4Ml9jayA9IHsKLQkubmFtZQkJPSAiZHBsbDRfbTR4Ml9jayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZkcGxsNF9tNF9jaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihQTExfTU9ELCBDTV9DTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9QV1JETl9DQU1fU0hJRlQsCi0JLmZsYWdzCQk9IElOVkVSVF9FTkFCTEUsCi0JLmNsa2RtX25hbWUJPSAiZHBsbDRfY2xrZG0iLAotCS5yZWNhbGMJCT0gJm9tYXAzX2Nsa291dHgyX3JlY2FsYywKLX07Ci0KLS8qIFRoaXMgdmlydHVhbCBjbG9jayBpcyB0aGUgc291cmNlIGZvciBkcGxsNF9tNXgyX2NrICovCi1zdGF0aWMgc3RydWN0IGNsayBkcGxsNF9tNV9jayA9IHsKLQkubmFtZQkJPSAiZHBsbDRfbTVfY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJmRwbGw0X2NrLAotCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCi0JLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfQ0FNX01PRCwgQ01fQ0xLU0VMKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9DTEtTRUxfQ0FNX01BU0ssCi0JLmNsa3NlbAkJPSBkaXYxNl9kcGxsNF9jbGtzZWwsCi0JLmNsa2RtX25hbWUJPSAiZHBsbDRfY2xrZG0iLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi19OwotCi0vKiBUaGUgUFdSRE4gYml0IGlzIGFwcGFyZW50bHkgb25seSBhdmFpbGFibGUgb24gMzQzMEVTMiBhbmQgYWJvdmUgKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrIGRwbGw0X201eDJfY2sgPSB7Ci0JLm5hbWUJCT0gImRwbGw0X201eDJfY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmZHBsbDRfbTVfY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfUFdSRE5fQ0FNX1NISUZULAotCS5mbGFncwkJPSBJTlZFUlRfRU5BQkxFLAotCS5jbGtkbV9uYW1lCT0gImRwbGw0X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZvbWFwM19jbGtvdXR4Ml9yZWNhbGMsCi19OwotCi0vKiBUaGlzIHZpcnR1YWwgY2xvY2sgaXMgdGhlIHNvdXJjZSBmb3IgZHBsbDRfbTZ4Ml9jayAqLwotc3RhdGljIHN0cnVjdCBjbGsgZHBsbDRfbTZfY2sgPSB7Ci0JLm5hbWUJCT0gImRwbGw0X202X2NrIiwKLQkub3BzCQk9ICZjbGtvcHNfbnVsbCwKLQkucGFyZW50CQk9ICZkcGxsNF9jaywKLQkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAotCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX0VNVV9NT0QsIENNX0NMS1NFTDEpLAotCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0RJVl9EUExMNF9NQVNLLAotCS5jbGtzZWwJCT0gZGl2MTZfZHBsbDRfY2xrc2VsLAotCS5jbGtkbV9uYW1lCT0gImRwbGw0X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotfTsKLQotLyogVGhlIFBXUkROIGJpdCBpcyBhcHBhcmVudGx5IG9ubHkgYXZhaWxhYmxlIG9uIDM0MzBFUzIgYW5kIGFib3ZlICovCi1zdGF0aWMgc3RydWN0IGNsayBkcGxsNF9tNngyX2NrID0gewotCS5uYW1lCQk9ICJkcGxsNF9tNngyX2NrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmRwbGw0X202X2NrLAotCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfUFdSRE5fRU1VX1BFUklQSF9TSElGVCwKLQkuZmxhZ3MJCT0gSU5WRVJUX0VOQUJMRSwKLQkuY2xrZG1fbmFtZQk9ICJkcGxsNF9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmb21hcDNfY2xrb3V0eDJfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZW11X3Blcl9hbHdvbl9jayA9IHsKLQkubmFtZQkJPSAiZW11X3Blcl9hbHdvbl9jayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmZHBsbDRfbTZ4Ml9jaywKLQkuY2xrZG1fbmFtZQk9ICJkcGxsNF9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLS8qIERQTEw1ICovCi0vKiBTdXBwbGllcyAxMjBNSHogY2xvY2ssIFVTSU0gc291cmNlIGNsb2NrICovCi0vKiBUeXBlOiBEUExMICovCi0vKiAzNDMwRVMyIG9ubHkgKi8KLXN0YXRpYyBzdHJ1Y3QgZHBsbF9kYXRhIGRwbGw1X2RkID0gewotCS5tdWx0X2RpdjFfcmVnCT0gT01BUF9DTV9SRUdBRERSKFBMTF9NT0QsIE9NQVAzNDMwRVMyX0NNX0NMS1NFTDQpLAotCS5tdWx0X21hc2sJPSBPTUFQMzQzMEVTMl9QRVJJUEgyX0RQTExfTVVMVF9NQVNLLAotCS5kaXYxX21hc2sJPSBPTUFQMzQzMEVTMl9QRVJJUEgyX0RQTExfRElWX01BU0ssCi0JLmNsa19ieXBhc3MJPSAmc3lzX2NrLAotCS5jbGtfcmVmCT0gJnN5c19jaywKLQkuZnJlcXNlbF9tYXNrCT0gT01BUDM0MzBFUzJfUEVSSVBIMl9EUExMX0ZSRVFTRUxfTUFTSywKLQkuY29udHJvbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgT01BUDM0MzBFUzJfQ01fQ0xLRU4yKSwKLQkuZW5hYmxlX21hc2sJPSBPTUFQMzQzMEVTMl9FTl9QRVJJUEgyX0RQTExfTUFTSywKLQkubW9kZXMJCT0gKDEgPDwgRFBMTF9MT1dfUE9XRVJfU1RPUCkgfCAoMSA8PCBEUExMX0xPQ0tFRCksCi0JLmF1dG9fcmVjYWxfYml0CT0gT01BUDM0MzBFUzJfRU5fUEVSSVBIMl9EUExMX0RSSUZUR1VBUkRfU0hJRlQsCi0JLnJlY2FsX2VuX2JpdAk9IE9NQVAzNDMwRVMyX1NORF9QRVJJUEhfRFBMTF9SRUNBTF9FTl9TSElGVCwKLQkucmVjYWxfc3RfYml0CT0gT01BUDM0MzBFUzJfU05EX1BFUklQSF9EUExMX1NUX1NISUZULAotCS5hdXRvaWRsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgT01BUDM0MzBFUzJfQ01fQVVUT0lETEUyX1BMTCksCi0JLmF1dG9pZGxlX21hc2sJPSBPTUFQMzQzMEVTMl9BVVRPX1BFUklQSDJfRFBMTF9NQVNLLAotCS5pZGxlc3RfcmVnCT0gT01BUF9DTV9SRUdBRERSKFBMTF9NT0QsIENNX0lETEVTVDIpLAotCS5pZGxlc3RfbWFzawk9IE9NQVAzNDMwRVMyX1NUX1BFUklQSDJfQ0xLX01BU0ssCi0JLm1heF9tdWx0aXBsaWVyID0gT01BUDNfTUFYX0RQTExfTVVMVCwKLQkubWluX2RpdmlkZXIJPSAxLAotCS5tYXhfZGl2aWRlcgk9IE9NQVAzX01BWF9EUExMX0RJViwKLQkucmF0ZV90b2xlcmFuY2UgPSBERUZBVUxUX0RQTExfUkFURV9UT0xFUkFOQ0UKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGRwbGw1X2NrID0gewotCS5uYW1lCQk9ICJkcGxsNV9jayIsCi0JLm9wcwkJPSAmY2xrb3BzX25vbmNvcmVfZHBsbF9vcHMsCi0JLnBhcmVudAkJPSAmc3lzX2NrLAotCS5kcGxsX2RhdGEJPSAmZHBsbDVfZGQsCi0JLnJvdW5kX3JhdGUJPSAmb21hcDJfZHBsbF9yb3VuZF9yYXRlLAotCS5zZXRfcmF0ZQk9ICZvbWFwM19ub25jb3JlX2RwbGxfc2V0X3JhdGUsCi0JLmNsa2RtX25hbWUJPSAiZHBsbDVfY2xrZG0iLAotCS5yZWNhbGMJCT0gJm9tYXAzX2RwbGxfcmVjYWxjLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgZGl2MTZfZHBsbDVfY2xrc2VsW10gPSB7Ci0JeyAucGFyZW50ID0gJmRwbGw1X2NrLCAucmF0ZXMgPSBkaXYxNl9kcGxsX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gTlVMTCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGNsayBkcGxsNV9tMl9jayA9IHsKLQkubmFtZQkJPSAiZHBsbDVfbTJfY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJmRwbGw1X2NrLAotCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCi0JLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgT01BUDM0MzBFUzJfQ01fQ0xLU0VMNSksCi0JLmNsa3NlbF9tYXNrCT0gT01BUDM0MzBFUzJfRElWXzEyME1fTUFTSywKLQkuY2xrc2VsCQk9IGRpdjE2X2RwbGw1X2Nsa3NlbCwKLQkuY2xrZG1fbmFtZQk9ICJkcGxsNV9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKLX07Ci0KLS8qIENNIEVYVEVSTkFMIENMT0NLIE9VVFBVVFMgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBjbGtvdXQyX3NyY19jb3JlX3JhdGVzW10gPSB7Ci0JeyAuZGl2ID0gMSwgLnZhbCA9IDAsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB8IERFRkFVTFRfUkFURSB9LAotCXsgLmRpdiA9IDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBjbGtvdXQyX3NyY19zeXNfcmF0ZXNbXSA9IHsKLQl7IC5kaXYgPSAxLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8zNDNYIHwgREVGQVVMVF9SQVRFIH0sCi0JeyAuZGl2ID0gMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGNsa291dDJfc3JjXzk2bV9yYXRlc1tdID0gewotCXsgLmRpdiA9IDEsIC52YWwgPSAyLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfCBERUZBVUxUX1JBVEUgfSwKLQl7IC5kaXYgPSAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgY2xrb3V0Ml9zcmNfNTRtX3JhdGVzW10gPSB7Ci0JeyAuZGl2ID0gMSwgLnZhbCA9IDMsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB8IERFRkFVTFRfUkFURSB9LAotCXsgLmRpdiA9IDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgY2xrb3V0Ml9zcmNfY2xrc2VsW10gPSB7Ci0JeyAucGFyZW50ID0gJmNvcmVfY2ssCQkucmF0ZXMgPSBjbGtvdXQyX3NyY19jb3JlX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gJnN5c19jaywJCS5yYXRlcyA9IGNsa291dDJfc3JjX3N5c19yYXRlcyB9LAotCXsgLnBhcmVudCA9ICZjbV85Nm1fZmNrLAkucmF0ZXMgPSBjbGtvdXQyX3NyY185Nm1fcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSAmb21hcF81NG1fZmNrLAkucmF0ZXMgPSBjbGtvdXQyX3NyY181NG1fcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSBOVUxMIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGNsa291dDJfc3JjX2NrID0gewotCS5uYW1lCQk9ICJjbGtvdXQyX3NyY19jayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCi0JLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKLQkuZW5hYmxlX3JlZwk9IE9NQVAzNDMwX0NNX0NMS09VVF9DVFJMLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfQ0xLT1VUMl9FTl9TSElGVCwKLQkuY2xrc2VsX3JlZwk9IE9NQVAzNDMwX0NNX0NMS09VVF9DVFJMLAotCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS09VVDJTT1VSQ0VfTUFTSywKLQkuY2xrc2VsCQk9IGNsa291dDJfc3JjX2Nsa3NlbCwKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBzeXNfY2xrb3V0Ml9yYXRlc1tdID0gewotCXsgLmRpdiA9IDEsIC52YWwgPSAwLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfCBERUZBVUxUX1JBVEUgfSwKLQl7IC5kaXYgPSAyLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8zNDNYIH0sCi0JeyAuZGl2ID0gNCwgLnZhbCA9IDIsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAotCXsgLmRpdiA9IDgsIC52YWwgPSAzLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfSwKLQl7IC5kaXYgPSAxNiwgLnZhbCA9IDQsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAotCXsgLmRpdiA9IDAgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIHN5c19jbGtvdXQyX2Nsa3NlbFtdID0gewotCXsgLnBhcmVudCA9ICZjbGtvdXQyX3NyY19jaywgLnJhdGVzID0gc3lzX2Nsa291dDJfcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSBOVUxMIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBzeXNfY2xrb3V0MiA9IHsKLQkubmFtZQkJPSAic3lzX2Nsa291dDIiLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCi0JLmNsa3NlbF9yZWcJPSBPTUFQMzQzMF9DTV9DTEtPVVRfQ1RSTCwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9DTEtPVVQyX0RJVl9NQVNLLAotCS5jbGtzZWwJCT0gc3lzX2Nsa291dDJfY2xrc2VsLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi19OwotCi0vKiBDTSBPVVRQVVQgQ0xPQ0tTICovCi0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGNvcmV4Ml9mY2sgPSB7Ci0JLm5hbWUJCT0gImNvcmV4Ml9mY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJmRwbGwzX20yeDJfY2ssCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLS8qIERQTEwgcG93ZXIgZG9tYWluIGNsb2NrIGNvbnRyb2xzICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgZGl2NF9yYXRlc1tdID0gewotCXsgLmRpdiA9IDEsIC52YWwgPSAxLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfCBERUZBVUxUX1JBVEUgfSwKLQl7IC5kaXYgPSAyLCAudmFsID0gMiwgLmZsYWdzID0gUkFURV9JTl8zNDNYIH0sCi0JeyAuZGl2ID0gNCwgLnZhbCA9IDQsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAotCXsgLmRpdiA9IDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgZGl2NF9jb3JlX2Nsa3NlbFtdID0gewotCXsgLnBhcmVudCA9ICZjb3JlX2NrLCAucmF0ZXMgPSBkaXY0X3JhdGVzIH0sCi0JeyAucGFyZW50ID0gTlVMTCB9Ci19OwotCi0vKgotICogUkVWSVNJVDogQXJlIHRoZXNlIGluIERQTEwgcG93ZXIgZG9tYWluIG9yIENNIHBvd2VyIGRvbWFpbj8gZG9jcwotICogbWF5IGJlIGluY29uc2lzdGVudCBoZXJlPwotICovCi1zdGF0aWMgc3RydWN0IGNsayBkcGxsMV9mY2sgPSB7Ci0JLm5hbWUJCT0gImRwbGwxX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmY29yZV9jaywKLQkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAotCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKE1QVV9NT0QsIE9NQVAzNDMwX0NNX0NMS1NFTDFfUExMKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9NUFVfQ0xLX1NSQ19NQVNLLAotCS5jbGtzZWwJCT0gZGl2NF9jb3JlX2Nsa3NlbCwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbXB1X2NrID0gewotCS5uYW1lCQk9ICJtcHVfY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJmRwbGwxX3gybTJfY2ssCi0JLmNsa2RtX25hbWUJPSAibXB1X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotLyogYXJtX2ZjayBpcyBkaXZpZGVkIGJ5IHR3byB3aGVuIERQTEwxIGxvY2tlZDsgb3RoZXJ3aXNlLCBwYXNzdGhyb3VnaCBtcHVfY2sgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgYXJtX2Zja19yYXRlc1tdID0gewotCXsgLmRpdiA9IDEsIC52YWwgPSAwLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfCBERUZBVUxUX1JBVEUgfSwKLQl7IC5kaXYgPSAyLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8zNDNYIH0sCi0JeyAuZGl2ID0gMCB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgYXJtX2Zja19jbGtzZWxbXSA9IHsKLQl7IC5wYXJlbnQgPSAmbXB1X2NrLCAucmF0ZXMgPSBhcm1fZmNrX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gTlVMTCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGNsayBhcm1fZmNrID0gewotCS5uYW1lCQk9ICJhcm1fZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfbnVsbCwKLQkucGFyZW50CQk9ICZtcHVfY2ssCi0JLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihNUFVfTU9ELCBPTUFQMzQzMF9DTV9JRExFU1RfUExMKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9TVF9NUFVfQ0xLX01BU0ssCi0JLmNsa3NlbAkJPSBhcm1fZmNrX2Nsa3NlbCwKLQkuY2xrZG1fbmFtZQk9ICJtcHVfY2xrZG0iLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi19OwotCi0vKiBYWFggV2hhdCBhYm91dCBuZW9uX2Nsa2RtID8gKi8KLQotLyoKLSAqIFJFVklTSVQ6IFRoaXMgY2xvY2sgaXMgbmV2ZXIgc3BlY2lmaWNhbGx5IGRlZmluZWQgaW4gdGhlIDM0MzAgVFJNLAotICogYWx0aG91Z2ggaXQgaXMgcmVmZXJlbmNlZCAtIHNvIHRoaXMgaXMgYSBndWVzcwotICovCi1zdGF0aWMgc3RydWN0IGNsayBlbXVfbXB1X2Fsd29uX2NrID0gewotCS5uYW1lCQk9ICJlbXVfbXB1X2Fsd29uX2NrIiwKLQkub3BzCQk9ICZjbGtvcHNfbnVsbCwKLQkucGFyZW50CQk9ICZtcHVfY2ssCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGRwbGwyX2ZjayA9IHsKLQkubmFtZQkJPSAiZHBsbDJfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfbnVsbCwKLQkucGFyZW50CQk9ICZjb3JlX2NrLAotCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCi0JLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfSVZBMl9NT0QsIE9NQVAzNDMwX0NNX0NMS1NFTDFfUExMKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9JVkEyX0NMS19TUkNfTUFTSywKLQkuY2xrc2VsCQk9IGRpdjRfY29yZV9jbGtzZWwsCi0JLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGl2YTJfY2sgPSB7Ci0JLm5hbWUJCT0gIml2YTJfY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmZHBsbDJfbTJfY2ssCi0JLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9JVkEyX01PRCwgQ01fRkNMS0VOKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0NNX0ZDTEtFTl9JVkEyX0VOX0lWQTJfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAiaXZhMl9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLS8qIENvbW1vbiBpbnRlcmZhY2UgY2xvY2tzICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGRpdjJfY29yZV9jbGtzZWxbXSA9IHsKLQl7IC5wYXJlbnQgPSAmY29yZV9jaywgLnJhdGVzID0gZGl2Ml9yYXRlcyB9LAotCXsgLnBhcmVudCA9IE5VTEwgfQotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbDNfaWNrID0gewotCS5uYW1lCQk9ICJsM19pY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJmNvcmVfY2ssCi0JLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fQ0xLU0VMKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9DTEtTRUxfTDNfTUFTSywKLQkuY2xrc2VsCQk9IGRpdjJfY29yZV9jbGtzZWwsCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sM19jbGtkbSIsCi0JLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGRpdjJfbDNfY2xrc2VsW10gPSB7Ci0JeyAucGFyZW50ID0gJmwzX2ljaywgLnJhdGVzID0gZGl2Ml9yYXRlcyB9LAotCXsgLnBhcmVudCA9IE5VTEwgfQotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbDRfaWNrID0gewotCS5uYW1lCQk9ICJsNF9pY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJmwzX2ljaywKLQkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAotCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9DTEtTRUwpLAotCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9MNF9NQVNLLAotCS5jbGtzZWwJCT0gZGl2Ml9sM19jbGtzZWwsCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKLQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgZGl2Ml9sNF9jbGtzZWxbXSA9IHsKLQl7IC5wYXJlbnQgPSAmbDRfaWNrLCAucmF0ZXMgPSBkaXYyX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gTlVMTCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGNsayBybV9pY2sgPSB7Ci0JLm5hbWUJCT0gInJtX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmbDRfaWNrLAotCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCi0JLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoV0tVUF9NT0QsIENNX0NMS1NFTCksCi0JLmNsa3NlbF9tYXNrCT0gT01BUDM0MzBfQ0xLU0VMX1JNX01BU0ssCi0JLmNsa3NlbAkJPSBkaXYyX2w0X2Nsa3NlbCwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotfTsKLQotLyogR0ZYIHBvd2VyIGRvbWFpbiAqLwotCi0vKiBHRlggY2xvY2tzIGFyZSBpbiAzNDMwRVMxIG9ubHkuIDM0MzBFUzIgYW5kIGxhdGVyIHVzZXMgdGhlIFNHWCBpbnN0ZWFkICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGdmeF9sM19jbGtzZWxbXSA9IHsKLQl7IC5wYXJlbnQgPSAmbDNfaWNrLCAucmF0ZXMgPSBnZnhfbDNfcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSBOVUxMIH0KLX07Ci0KLS8qIFZpcnR1YWwgcGFyZW50IGNsb2NrIGZvciBnZnhfbDNfaWNrIGFuZCBnZnhfbDNfZmNrICovCi1zdGF0aWMgc3RydWN0IGNsayBnZnhfbDNfY2sgPSB7Ci0JLm5hbWUJCT0gImdmeF9sM19jayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZsM19pY2ssCi0JLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihHRlhfTU9ELCBDTV9JQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUF9FTl9HRlhfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGdmeF9sM19mY2sgPSB7Ci0JLm5hbWUJCT0gImdmeF9sM19mY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJmdmeF9sM19jaywKLQkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAotCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKEdGWF9NT0QsIENNX0NMS1NFTCksCi0JLmNsa3NlbF9tYXNrCT0gT01BUF9DTEtTRUxfR0ZYX01BU0ssCi0JLmNsa3NlbAkJPSBnZnhfbDNfY2xrc2VsLAotCS5jbGtkbV9uYW1lCT0gImdmeF8zNDMwZXMxX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZ2Z4X2wzX2ljayA9IHsKLQkubmFtZQkJPSAiZ2Z4X2wzX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmZ2Z4X2wzX2NrLAotCS5jbGtkbV9uYW1lCT0gImdmeF8zNDMwZXMxX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZ2Z4X2NnMV9jayA9IHsKLQkubmFtZQkJPSAiZ2Z4X2NnMV9jayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZnZnhfbDNfZmNrLCAvKiBSRVZJU0lUOiBjb3JyZWN0PyAqLwotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKEdGWF9NT0QsIENNX0ZDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMEVTMV9FTl8yRF9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJnZnhfMzQzMGVzMV9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGdmeF9jZzJfY2sgPSB7Ci0JLm5hbWUJCT0gImdmeF9jZzJfY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmZ2Z4X2wzX2ZjaywgLyogUkVWSVNJVDogY29ycmVjdD8gKi8KLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihHRlhfTU9ELCBDTV9GQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBFUzFfRU5fM0RfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAiZ2Z4XzM0MzBlczFfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi0vKiBTR1ggcG93ZXIgZG9tYWluIC0gMzQzMEVTMiBvbmx5ICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgc2d4X2NvcmVfcmF0ZXNbXSA9IHsKLQl7IC5kaXYgPSAzLCAudmFsID0gMCwgLmZsYWdzID0gUkFURV9JTl8zNDNYIHwgREVGQVVMVF9SQVRFIH0sCi0JeyAuZGl2ID0gNCwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAotCXsgLmRpdiA9IDYsIC52YWwgPSAyLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfSwKLQl7IC5kaXYgPSAwIH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIHNneF85Nm1fcmF0ZXNbXSA9IHsKLQl7IC5kaXYgPSAxLCAgLnZhbCA9IDMsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB8IERFRkFVTFRfUkFURSB9LAotCXsgLmRpdiA9IDAgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIHNneF9jbGtzZWxbXSA9IHsKLQl7IC5wYXJlbnQgPSAmY29yZV9jaywJIC5yYXRlcyA9IHNneF9jb3JlX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gJmNtXzk2bV9mY2ssIC5yYXRlcyA9IHNneF85Nm1fcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSBOVUxMIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBzZ3hfZmNrID0gewotCS5uYW1lCQk9ICJzZ3hfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBFUzJfU0dYX01PRCwgQ01fRkNMS0VOKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwRVMyX0NNX0ZDTEtFTl9TR1hfRU5fU0dYX1NISUZULAotCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwRVMyX1NHWF9NT0QsIENNX0NMS1NFTCksCi0JLmNsa3NlbF9tYXNrCT0gT01BUDM0MzBFUzJfQ0xLU0VMX1NHWF9NQVNLLAotCS5jbGtzZWwJCT0gc2d4X2Nsa3NlbCwKLQkuY2xrZG1fbmFtZQk9ICJzZ3hfY2xrZG0iLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBzZ3hfaWNrID0gewotCS5uYW1lCQk9ICJzZ3hfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmwzX2ljaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMEVTMl9TR1hfTU9ELCBDTV9JQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBFUzJfQ01fSUNMS0VOX1NHWF9FTl9TR1hfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAic2d4X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotLyogQ09SRSBwb3dlciBkb21haW4gKi8KLQotc3RhdGljIHN0cnVjdCBjbGsgZDJkXzI2bV9mY2sgPSB7Ci0JLm5hbWUJCT0gImQyZF8yNm1fZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJnN5c19jaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMEVTMV9FTl9EMkRfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAiZDJkX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbW9kZW1fZmNrID0gewotCS5uYW1lCQk9ICJtb2RlbV9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmc3lzX2NrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01PREVNX1NISUZULAotCS5jbGtkbV9uYW1lCT0gImQyZF9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHNhZDJkX2ljayA9IHsKLQkubmFtZQkJPSAic2FkMmRfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmwzX2ljaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9TQUQyRF9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJkMmRfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBtYWQyZF9pY2sgPSB7Ci0JLm5hbWUJCT0gIm1hZDJkX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZsM19pY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjMpLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fTUFEMkRfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAiZDJkX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgb21hcDM0M3hfZ3B0X2Nsa3NlbFtdID0gewotCXsgLnBhcmVudCA9ICZvbWFwXzMya19mY2ssIC5yYXRlcyA9IGdwdF8zMmtfcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSAmc3lzX2NrLAkgICAucmF0ZXMgPSBncHRfc3lzX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gTlVMTH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGdwdDEwX2ZjayA9IHsKLQkubmFtZQkJPSAiZ3B0MTBfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJnN5c19jaywKLQkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQVDEwX1NISUZULAotCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9DTEtTRUwpLAotCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9HUFQxMF9NQVNLLAotCS5jbGtzZWwJCT0gb21hcDM0M3hfZ3B0X2Nsa3NlbCwKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZ3B0MTFfZmNrID0gewotCS5uYW1lCQk9ICJncHQxMV9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmc3lzX2NrLAotCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BUMTFfU0hJRlQsCi0JLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0NMS1NFTCksCi0JLmNsa3NlbF9tYXNrCT0gT01BUDM0MzBfQ0xLU0VMX0dQVDExX01BU0ssCi0JLmNsa3NlbAkJPSBvbWFwMzQzeF9ncHRfY2xrc2VsLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBjcGVmdXNlX2ZjayA9IHsKLQkubmFtZQkJPSAiY3BlZnVzZV9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAotCS5wYXJlbnQJCT0gJnN5c19jaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgT01BUDM0MzBFUzJfQ01fRkNMS0VOMyksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMEVTMl9FTl9DUEVGVVNFX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayB0c19mY2sgPSB7Ci0JLm5hbWUJCT0gInRzX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCi0JLnBhcmVudAkJPSAmb21hcF8zMmtfZmNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBPTUFQMzQzMEVTMl9DTV9GQ0xLRU4zKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwRVMyX0VOX1RTX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayB1c2J0bGxfZmNrID0gewotCS5uYW1lCQk9ICJ1c2J0bGxfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKLQkucGFyZW50CQk9ICZkcGxsNV9tMl9jaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgT01BUDM0MzBFUzJfQ01fRkNMS0VOMyksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMEVTMl9FTl9VU0JUTExfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLS8qIENPUkUgOTZNIEZDTEstZGVyaXZlZCBjbG9ja3MgKi8KLQotc3RhdGljIHN0cnVjdCBjbGsgY29yZV85Nm1fZmNrID0gewotCS5uYW1lCQk9ICJjb3JlXzk2bV9mY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJm9tYXBfOTZtX2ZjaywKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbW1jaHMzX2ZjayA9IHsKLQkubmFtZQkJPSAibW1jaHNfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5pZAkJPSAyLAotCS5wYXJlbnQJCT0gJmNvcmVfOTZtX2ZjaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMEVTMl9FTl9NTUMzX1NISUZULAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBtbWNoczJfZmNrID0gewotCS5uYW1lCQk9ICJtbWNoc19mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLmlkCQk9IDEsCi0JLnBhcmVudAkJPSAmY29yZV85Nm1fZmNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01NQzJfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1zcHJvX2ZjayA9IHsKLQkubmFtZQkJPSAibXNwcm9fZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmNvcmVfOTZtX2ZjaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9NU1BST19TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbW1jaHMxX2ZjayA9IHsKLQkubmFtZQkJPSAibW1jaHNfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmNvcmVfOTZtX2ZjaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9NTUMxX1NISUZULAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBpMmMzX2ZjayA9IHsKLQkubmFtZQkJPSAiaTJjX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkuaWQJCT0gMywKLQkucGFyZW50CQk9ICZjb3JlXzk2bV9mY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fSTJDM19TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgaTJjMl9mY2sgPSB7Ci0JLm5hbWUJCT0gImkyY19mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLmlkCQk9IDIsCi0JLnBhcmVudAkJPSAmY29yZV85Nm1fZmNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0kyQzJfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGkyYzFfZmNrID0gewotCS5uYW1lCQk9ICJpMmNfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5pZAkJPSAxLAotCS5wYXJlbnQJCT0gJmNvcmVfOTZtX2ZjaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9JMkMxX1NISUZULAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi0vKgotICogTUNCU1AgMSAmIDUgZ2V0IHRoZWlyIDk2TUh6IGNsb2NrIGZyb20gY29yZV85Nm1fZmNrOwotICogTUNCU1AgMiwgMywgNCBnZXQgdGhlaXIgOTZNSHogY2xvY2sgZnJvbSBwZXJfOTZtX2Zjay4KLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBjb21tb25fbWNic3BfOTZtX3JhdGVzW10gPSB7Ci0JeyAuZGl2ID0gMSwgLnZhbCA9IDAsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB8IERFRkFVTFRfUkFURSB9LAotCXsgLmRpdiA9IDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBjb21tb25fbWNic3BfbWNic3BfcmF0ZXNbXSA9IHsKLQl7IC5kaXYgPSAxLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8zNDNYIHwgREVGQVVMVF9SQVRFIH0sCi0JeyAuZGl2ID0gMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBtY2JzcF8xNV9jbGtzZWxbXSA9IHsKLQl7IC5wYXJlbnQgPSAmY29yZV85Nm1fZmNrLCAucmF0ZXMgPSBjb21tb25fbWNic3BfOTZtX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gJm1jYnNwX2Nsa3MsICAgLnJhdGVzID0gY29tbW9uX21jYnNwX21jYnNwX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gTlVMTCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGNsayBtY2JzcDVfZmNrID0gewotCS5uYW1lCQk9ICJtY2JzcF9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLmlkCQk9IDUsCi0JLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9NQ0JTUDVfU0hJRlQsCi0JLmNsa3NlbF9yZWcJPSBPTUFQMzQzWF9DVFJMX1JFR0FERFIoT01BUDM0M1hfQ09OVFJPTF9ERVZDT05GMSksCi0JLmNsa3NlbF9tYXNrCT0gT01BUDJfTUNCU1A1X0NMS1NfTUFTSywKLQkuY2xrc2VsCQk9IG1jYnNwXzE1X2Nsa3NlbCwKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbWNic3AxX2ZjayA9IHsKLQkubmFtZQkJPSAibWNic3BfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5pZAkJPSAxLAotCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fTUNCU1AxX1NISUZULAotCS5jbGtzZWxfcmVnCT0gT01BUDM0M1hfQ1RSTF9SRUdBRERSKE9NQVAyX0NPTlRST0xfREVWQ09ORjApLAotCS5jbGtzZWxfbWFzawk9IE9NQVAyX01DQlNQMV9DTEtTX01BU0ssCi0JLmNsa3NlbAkJPSBtY2JzcF8xNV9jbGtzZWwsCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKLX07Ci0KLS8qIENPUkVfNDhNX0ZDSy1kZXJpdmVkIGNsb2NrcyAqLwotCi1zdGF0aWMgc3RydWN0IGNsayBjb3JlXzQ4bV9mY2sgPSB7Ci0JLm5hbWUJCT0gImNvcmVfNDhtX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmb21hcF80OG1fZmNrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBtY3NwaTRfZmNrID0gewotCS5uYW1lCQk9ICJtY3NwaV9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLmlkCQk9IDQsCi0JLnBhcmVudAkJPSAmY29yZV80OG1fZmNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01DU1BJNF9TSElGVCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbWNzcGkzX2ZjayA9IHsKLQkubmFtZQkJPSAibWNzcGlfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5pZAkJPSAzLAotCS5wYXJlbnQJCT0gJmNvcmVfNDhtX2ZjaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9NQ1NQSTNfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1jc3BpMl9mY2sgPSB7Ci0JLm5hbWUJCT0gIm1jc3BpX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkuaWQJCT0gMiwKLQkucGFyZW50CQk9ICZjb3JlXzQ4bV9mY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fTUNTUEkyX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBtY3NwaTFfZmNrID0gewotCS5uYW1lCQk9ICJtY3NwaV9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLmlkCQk9IDEsCi0JLnBhcmVudAkJPSAmY29yZV80OG1fZmNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01DU1BJMV9TSElGVCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgdWFydDJfZmNrID0gewotCS5uYW1lCQk9ICJ1YXJ0Ml9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmY29yZV80OG1fZmNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX1VBUlQyX1NISUZULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayB1YXJ0MV9mY2sgPSB7Ci0JLm5hbWUJCT0gInVhcnQxX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZjb3JlXzQ4bV9mY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fVUFSVDFfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGZzaG9zdHVzYl9mY2sgPSB7Ci0JLm5hbWUJCT0gImZzaG9zdHVzYl9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmY29yZV80OG1fZmNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwRVMxX0VOX0ZTSE9TVFVTQl9TSElGVCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotLyogQ09SRV8xMk1fRkNLIGJhc2VkIGNsb2NrcyAqLwotCi1zdGF0aWMgc3RydWN0IGNsayBjb3JlXzEybV9mY2sgPSB7Ci0JLm5hbWUJCT0gImNvcmVfMTJtX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmb21hcF8xMm1fZmNrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBoZHFfZmNrID0gewotCS5uYW1lCQk9ICJoZHFfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmNvcmVfMTJtX2ZjaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9IRFFfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLS8qIERQTEwzLWRlcml2ZWQgY2xvY2sgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBzc2lfc3NyX2NvcmV4Ml9yYXRlc1tdID0gewotCXsgLmRpdiA9IDEsIC52YWwgPSAxLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfCBERUZBVUxUX1JBVEUgfSwKLQl7IC5kaXYgPSAyLCAudmFsID0gMiwgLmZsYWdzID0gUkFURV9JTl8zNDNYIH0sCi0JeyAuZGl2ID0gMywgLnZhbCA9IDMsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAotCXsgLmRpdiA9IDQsIC52YWwgPSA0LCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfSwKLQl7IC5kaXYgPSA2LCAudmFsID0gNiwgLmZsYWdzID0gUkFURV9JTl8zNDNYIH0sCi0JeyAuZGl2ID0gOCwgLnZhbCA9IDgsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAotCXsgLmRpdiA9IDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgc3NpX3Nzcl9jbGtzZWxbXSA9IHsKLQl7IC5wYXJlbnQgPSAmY29yZXgyX2ZjaywgLnJhdGVzID0gc3NpX3Nzcl9jb3JleDJfcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSBOVUxMIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHNzaV9zc3JfZmNrXzM0MzBlczEgPSB7Ci0JLm5hbWUJCT0gInNzaV9zc3JfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKLQkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX1NTSV9TSElGVCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fQ0xLU0VMKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9DTEtTRUxfU1NJX01BU0ssCi0JLmNsa3NlbAkJPSBzc2lfc3NyX2Nsa3NlbCwKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgc3NpX3Nzcl9mY2tfMzQzMGVzMiA9IHsKLQkubmFtZQkJPSAic3NpX3Nzcl9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMzQzMGVzMl9zc2lfd2FpdCwKLQkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX1NTSV9TSElGVCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fQ0xLU0VMKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9DTEtTRUxfU1NJX01BU0ssCi0JLmNsa3NlbAkJPSBzc2lfc3NyX2Nsa3NlbCwKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgc3NpX3NzdF9mY2tfMzQzMGVzMSA9IHsKLQkubmFtZQkJPSAic3NpX3NzdF9mY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJnNzaV9zc3JfZmNrXzM0MzBlczEsCi0JLmZpeGVkX2Rpdgk9IDIsCi0JLnJlY2FsYwkJPSAmb21hcDJfZml4ZWRfZGl2aXNvcl9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBzc2lfc3N0X2Zja18zNDMwZXMyID0gewotCS5uYW1lCQk9ICJzc2lfc3N0X2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmc3NpX3Nzcl9mY2tfMzQzMGVzMiwKLQkuZml4ZWRfZGl2CT0gMiwKLQkucmVjYWxjCQk9ICZvbWFwMl9maXhlZF9kaXZpc29yX3JlY2FsYywKLX07Ci0KLQotCi0vKiBDT1JFX0wzX0lDSyBiYXNlZCBjbG9ja3MgKi8KLQotLyoKLSAqIFhYWCBtdXN0IGFkZCBjbGtfZW5hYmxlL2Nsa19kaXNhYmxlIGZvciB0aGVzZSBpZiBzdGFuZGFyZCBjb2RlIHdvbid0Ci0gKiBoYW5kbGUgaXQKLSAqLwotc3RhdGljIHN0cnVjdCBjbGsgY29yZV9sM19pY2sgPSB7Ci0JLm5hbWUJCT0gImNvcmVfbDNfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfbnVsbCwKLQkucGFyZW50CQk9ICZsM19pY2ssCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sM19jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGhzb3RndXNiX2lja18zNDMwZXMxID0gewotCS5uYW1lCQk9ICJoc290Z3VzYl9pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAotCS5wYXJlbnQJCT0gJmNvcmVfbDNfaWNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0hTT1RHVVNCX1NISUZULAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDNfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBoc290Z3VzYl9pY2tfMzQzMGVzMiA9IHsKLQkubmFtZQkJPSAiaHNvdGd1c2JfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDM0MzBlczJfaHNvdGd1c2Jfd2FpdCwKLQkucGFyZW50CQk9ICZjb3JlX2wzX2ljaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9IU09UR1VTQl9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2wzX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgc2RyY19pY2sgPSB7Ci0JLm5hbWUJCT0gInNkcmNfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmNvcmVfbDNfaWNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX1NEUkNfU0hJRlQsCi0JLmZsYWdzCQk9IEVOQUJMRV9PTl9JTklULAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDNfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncG1jX2ZjayA9IHsKLQkubmFtZQkJPSAiZ3BtY19mY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJmNvcmVfbDNfaWNrLAotCS5mbGFncwkJPSBFTkFCTEVfT05fSU5JVCwgLyogaHVoPyAqLwotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDNfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi0vKiBTRUNVUklUWV9MM19JQ0sgYmFzZWQgY2xvY2tzICovCi0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHNlY3VyaXR5X2wzX2ljayA9IHsKLQkubmFtZQkJPSAic2VjdXJpdHlfbDNfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfbnVsbCwKLQkucGFyZW50CQk9ICZsM19pY2ssCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHBrYV9pY2sgPSB7Ci0JLm5hbWUJCT0gInBrYV9pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmc2VjdXJpdHlfbDNfaWNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4yKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX1BLQV9TSElGVCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotLyogQ09SRV9MNF9JQ0sgYmFzZWQgY2xvY2tzICovCi0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGNvcmVfbDRfaWNrID0gewotCS5uYW1lCQk9ICJjb3JlX2w0X2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmbDRfaWNrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayB1c2J0bGxfaWNrID0gewotCS5uYW1lCQk9ICJ1c2J0bGxfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmNvcmVfbDRfaWNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4zKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwRVMyX0VOX1VTQlRMTF9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbW1jaHMzX2ljayA9IHsKLQkubmFtZQkJPSAibW1jaHNfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5pZAkJPSAyLAotCS5wYXJlbnQJCT0gJmNvcmVfbDRfaWNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwRVMyX0VOX01NQzNfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLS8qIEludGVyc3lzdGVtIENvbW11bmljYXRpb24gUmVnaXN0ZXJzIC0gY2hhc3NpcyBtb2RlIG9ubHkgKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrIGljcl9pY2sgPSB7Ci0JLm5hbWUJCT0gImljcl9pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmY29yZV9sNF9pY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fSUNSX1NISUZULAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBhZXMyX2ljayA9IHsKLQkubmFtZQkJPSAiYWVzMl9pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmY29yZV9sNF9pY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fQUVTMl9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgc2hhMTJfaWNrID0gewotCS5uYW1lCQk9ICJzaGExMl9pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmY29yZV9sNF9pY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fU0hBMTJfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGRlczJfaWNrID0gewotCS5uYW1lCQk9ICJkZXMyX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZjb3JlX2w0X2ljaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9ERVMyX1NISUZULAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBtbWNoczJfaWNrID0gewotCS5uYW1lCQk9ICJtbWNoc19pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLmlkCQk9IDEsCi0JLnBhcmVudAkJPSAmY29yZV9sNF9pY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fTU1DMl9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbW1jaHMxX2ljayA9IHsKLQkubmFtZQkJPSAibW1jaHNfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmNvcmVfbDRfaWNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01NQzFfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1zcHJvX2ljayA9IHsKLQkubmFtZQkJPSAibXNwcm9faWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmNvcmVfbDRfaWNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01TUFJPX1NISUZULAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBoZHFfaWNrID0gewotCS5uYW1lCQk9ICJoZHFfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmNvcmVfbDRfaWNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0hEUV9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbWNzcGk0X2ljayA9IHsKLQkubmFtZQkJPSAibWNzcGlfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5pZAkJPSA0LAotCS5wYXJlbnQJCT0gJmNvcmVfbDRfaWNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01DU1BJNF9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbWNzcGkzX2ljayA9IHsKLQkubmFtZQkJPSAibWNzcGlfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5pZAkJPSAzLAotCS5wYXJlbnQJCT0gJmNvcmVfbDRfaWNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01DU1BJM19TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbWNzcGkyX2ljayA9IHsKLQkubmFtZQkJPSAibWNzcGlfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5pZAkJPSAyLAotCS5wYXJlbnQJCT0gJmNvcmVfbDRfaWNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01DU1BJMl9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbWNzcGkxX2ljayA9IHsKLQkubmFtZQkJPSAibWNzcGlfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5pZAkJPSAxLAotCS5wYXJlbnQJCT0gJmNvcmVfbDRfaWNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01DU1BJMV9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgaTJjM19pY2sgPSB7Ci0JLm5hbWUJCT0gImkyY19pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLmlkCQk9IDMsCi0JLnBhcmVudAkJPSAmY29yZV9sNF9pY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fSTJDM19TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgaTJjMl9pY2sgPSB7Ci0JLm5hbWUJCT0gImkyY19pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLmlkCQk9IDIsCi0JLnBhcmVudAkJPSAmY29yZV9sNF9pY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fSTJDMl9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgaTJjMV9pY2sgPSB7Ci0JLm5hbWUJCT0gImkyY19pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLmlkCQk9IDEsCi0JLnBhcmVudAkJPSAmY29yZV9sNF9pY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fSTJDMV9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgdWFydDJfaWNrID0gewotCS5uYW1lCQk9ICJ1YXJ0Ml9pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmY29yZV9sNF9pY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fVUFSVDJfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHVhcnQxX2ljayA9IHsKLQkubmFtZQkJPSAidWFydDFfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmNvcmVfbDRfaWNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX1VBUlQxX1NISUZULAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncHQxMV9pY2sgPSB7Ci0JLm5hbWUJCT0gImdwdDExX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZjb3JlX2w0X2ljaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUFQxMV9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZ3B0MTBfaWNrID0gewotCS5uYW1lCQk9ICJncHQxMF9pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmY29yZV9sNF9pY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BUMTBfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1jYnNwNV9pY2sgPSB7Ci0JLm5hbWUJCT0gIm1jYnNwX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkuaWQJCT0gNSwKLQkucGFyZW50CQk9ICZjb3JlX2w0X2ljaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9NQ0JTUDVfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1jYnNwMV9pY2sgPSB7Ci0JLm5hbWUJCT0gIm1jYnNwX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkuaWQJCT0gMSwKLQkucGFyZW50CQk9ICZjb3JlX2w0X2ljaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9NQ0JTUDFfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGZhY19pY2sgPSB7Ci0JLm5hbWUJCT0gImZhY19pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmY29yZV9sNF9pY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBFUzFfRU5fRkFDX1NISUZULAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBtYWlsYm94ZXNfaWNrID0gewotCS5uYW1lCQk9ICJtYWlsYm94ZXNfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmNvcmVfbDRfaWNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01BSUxCT1hFU19TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgb21hcGN0cmxfaWNrID0gewotCS5uYW1lCQk9ICJvbWFwY3RybF9pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmY29yZV9sNF9pY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fT01BUENUUkxfU0hJRlQsCi0JLmZsYWdzCQk9IEVOQUJMRV9PTl9JTklULAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi0vKiBTU0lfTDRfSUNLIGJhc2VkIGNsb2NrcyAqLwotCi1zdGF0aWMgc3RydWN0IGNsayBzc2lfbDRfaWNrID0gewotCS5uYW1lCQk9ICJzc2lfbDRfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfbnVsbCwKLQkucGFyZW50CQk9ICZsNF9pY2ssCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHNzaV9pY2tfMzQzMGVzMSA9IHsKLQkubmFtZQkJPSAic3NpX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCi0JLnBhcmVudAkJPSAmc3NpX2w0X2ljaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9TU0lfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHNzaV9pY2tfMzQzMGVzMiA9IHsKLQkubmFtZQkJPSAic3NpX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAzNDMwZXMyX3NzaV93YWl0LAotCS5wYXJlbnQJCT0gJnNzaV9sNF9pY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fU1NJX1NISUZULAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi0vKiBSRVZJU0lUOiBUZWNobmljYWxseSB0aGUgVFJNIGNsYWltcyB0aGF0IHRoaXMgaXMgQ09SRV9DTEsgYmFzZWQsCi0gKiBidXQgbDRfaWNrIG1ha2VzIG1vcmUgc2Vuc2UgdG8gbWUgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgdXNiX2w0X2Nsa3NlbFtdID0gewotCXsgLnBhcmVudCA9ICZsNF9pY2ssIC5yYXRlcyA9IGRpdjJfcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSBOVUxMIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayB1c2JfbDRfaWNrID0gewotCS5uYW1lCQk9ICJ1c2JfbDRfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJmw0X2ljaywKLQkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwRVMxX0VOX0ZTSE9TVFVTQl9TSElGVCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fQ0xLU0VMKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMEVTMV9DTEtTRUxfRlNIT1NUVVNCX01BU0ssCi0JLmNsa3NlbAkJPSB1c2JfbDRfY2xrc2VsLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi19OwotCi0vKiBTRUNVUklUWV9MNF9JQ0syIGJhc2VkIGNsb2NrcyAqLwotCi1zdGF0aWMgc3RydWN0IGNsayBzZWN1cml0eV9sNF9pY2syID0gewotCS5uYW1lCQk9ICJzZWN1cml0eV9sNF9pY2syIiwKLQkub3BzCQk9ICZjbGtvcHNfbnVsbCwKLQkucGFyZW50CQk9ICZsNF9pY2ssCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGFlczFfaWNrID0gewotCS5uYW1lCQk9ICJhZXMxX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZzZWN1cml0eV9sNF9pY2syLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4yKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0FFUzFfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHJuZ19pY2sgPSB7Ci0JLm5hbWUJCT0gInJuZ19pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmc2VjdXJpdHlfbDRfaWNrMiwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9STkdfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHNoYTExX2ljayA9IHsKLQkubmFtZQkJPSAic2hhMTFfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJnNlY3VyaXR5X2w0X2ljazIsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjIpLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fU0hBMTFfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGRlczFfaWNrID0gewotCS5uYW1lCQk9ICJkZXMxX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZzZWN1cml0eV9sNF9pY2syLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4yKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0RFUzFfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLS8qIERTUyAqLwotc3RhdGljIHN0cnVjdCBjbGsgZHNzMV9hbHdvbl9mY2tfMzQzMGVzMSA9IHsKLQkubmFtZQkJPSAiZHNzMV9hbHdvbl9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAotCS5wYXJlbnQJCT0gJmRwbGw0X200eDJfY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfRFNTX01PRCwgQ01fRkNMS0VOKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0RTUzFfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAiZHNzX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZHNzMV9hbHdvbl9mY2tfMzQzMGVzMiA9IHsKLQkubmFtZQkJPSAiZHNzMV9hbHdvbl9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMzQzMGVzMl9kc3NfdXNiaG9zdF93YWl0LAotCS5wYXJlbnQJCT0gJmRwbGw0X200eDJfY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfRFNTX01PRCwgQ01fRkNMS0VOKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0RTUzFfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAiZHNzX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZHNzX3R2X2ZjayA9IHsKLQkubmFtZQkJPSAiZHNzX3R2X2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCi0JLnBhcmVudAkJPSAmb21hcF81NG1fZmNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX0RTU19NT0QsIENNX0ZDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9UVl9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJkc3NfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBkc3NfOTZtX2ZjayA9IHsKLQkubmFtZQkJPSAiZHNzXzk2bV9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAotCS5wYXJlbnQJCT0gJm9tYXBfOTZtX2ZjaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9EU1NfTU9ELCBDTV9GQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fVFZfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAiZHNzX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZHNzMl9hbHdvbl9mY2sgPSB7Ci0JLm5hbWUJCT0gImRzczJfYWx3b25fZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKLQkucGFyZW50CQk9ICZzeXNfY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfRFNTX01PRCwgQ01fRkNMS0VOKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0RTUzJfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAiZHNzX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZHNzX2lja18zNDMwZXMxID0gewotCS8qIEhhbmRsZXMgYm90aCBMMyBhbmQgTDQgY2xvY2tzICovCi0JLm5hbWUJCT0gImRzc19pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAotCS5wYXJlbnQJCT0gJmw0X2ljaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9EU1NfTU9ELCBDTV9JQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfQ01fSUNMS0VOX0RTU19FTl9EU1NfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAiZHNzX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZHNzX2lja18zNDMwZXMyID0gewotCS8qIEhhbmRsZXMgYm90aCBMMyBhbmQgTDQgY2xvY2tzICovCi0JLm5hbWUJCT0gImRzc19pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMzQzMGVzMl9kc3NfdXNiaG9zdF93YWl0LAotCS5wYXJlbnQJCT0gJmw0X2ljaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9EU1NfTU9ELCBDTV9JQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfQ01fSUNMS0VOX0RTU19FTl9EU1NfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAiZHNzX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotLyogQ0FNICovCi0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGNhbV9tY2xrID0gewotCS5uYW1lCQk9ICJjYW1fbWNsayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCi0JLnBhcmVudAkJPSAmZHBsbDRfbTV4Ml9jaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9DQU1fTU9ELCBDTV9GQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fQ0FNX1NISUZULAotCS5jbGtkbV9uYW1lCT0gImNhbV9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGNhbV9pY2sgPSB7Ci0JLyogSGFuZGxlcyBib3RoIEwzIGFuZCBMNCBjbG9ja3MgKi8KLQkubmFtZQkJPSAiY2FtX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCi0JLnBhcmVudAkJPSAmbDRfaWNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX0NBTV9NT0QsIENNX0lDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9DQU1fU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAiY2FtX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgY3NpMl85Nm1fZmNrID0gewotCS5uYW1lCQk9ICJjc2kyXzk2bV9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAotCS5wYXJlbnQJCT0gJmNvcmVfOTZtX2ZjaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9DQU1fTU9ELCBDTV9GQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fQ1NJMl9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJjYW1fY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi0vKiBVU0JIT1NUIC0gMzQzMEVTMiBvbmx5ICovCi0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHVzYmhvc3RfMTIwbV9mY2sgPSB7Ci0JLm5hbWUJCT0gInVzYmhvc3RfMTIwbV9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAotCS5wYXJlbnQJCT0gJmRwbGw1X20yX2NrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwRVMyX1VTQkhPU1RfTU9ELCBDTV9GQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBFUzJfRU5fVVNCSE9TVDJfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAidXNiaG9zdF9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHVzYmhvc3RfNDhtX2ZjayA9IHsKLQkubmFtZQkJPSAidXNiaG9zdF80OG1fZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDM0MzBlczJfZHNzX3VzYmhvc3Rfd2FpdCwKLQkucGFyZW50CQk9ICZvbWFwXzQ4bV9mY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBFUzJfVVNCSE9TVF9NT0QsIENNX0ZDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMEVTMl9FTl9VU0JIT1NUMV9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJ1c2Job3N0X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgdXNiaG9zdF9pY2sgPSB7Ci0JLyogSGFuZGxlcyBib3RoIEwzIGFuZCBMNCBjbG9ja3MgKi8KLQkubmFtZQkJPSAidXNiaG9zdF9pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMzQzMGVzMl9kc3NfdXNiaG9zdF93YWl0LAotCS5wYXJlbnQJCT0gJmw0X2ljaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMEVTMl9VU0JIT1NUX01PRCwgQ01fSUNMS0VOKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwRVMyX0VOX1VTQkhPU1RfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAidXNiaG9zdF9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLS8qIFdLVVAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSB1c2ltXzk2bV9yYXRlc1tdID0gewotCXsgLmRpdiA9IDIsICAudmFsID0gMywgLmZsYWdzID0gUkFURV9JTl8zNDNYIHwgREVGQVVMVF9SQVRFIH0sCi0JeyAuZGl2ID0gNCwgIC52YWwgPSA0LCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfSwKLQl7IC5kaXYgPSA4LCAgLnZhbCA9IDUsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAotCXsgLmRpdiA9IDEwLCAudmFsID0gNiwgLmZsYWdzID0gUkFURV9JTl8zNDNYIH0sCi0JeyAuZGl2ID0gMCB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSB1c2ltXzEyMG1fcmF0ZXNbXSA9IHsKLQl7IC5kaXYgPSA0LCAgLnZhbCA9IDcsCS5mbGFncyA9IFJBVEVfSU5fMzQzWCB8IERFRkFVTFRfUkFURSB9LAotCXsgLmRpdiA9IDgsICAudmFsID0gOCwJLmZsYWdzID0gUkFURV9JTl8zNDNYIH0sCi0JeyAuZGl2ID0gMTYsIC52YWwgPSA5LAkuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfSwKLQl7IC5kaXYgPSAyMCwgLnZhbCA9IDEwLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfSwKLQl7IC5kaXYgPSAwIH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCB1c2ltX2Nsa3NlbFtdID0gewotCXsgLnBhcmVudCA9ICZvbWFwXzk2bV9mY2ssCS5yYXRlcyA9IHVzaW1fOTZtX3JhdGVzIH0sCi0JeyAucGFyZW50ID0gJmRwbGw1X20yX2NrLAkucmF0ZXMgPSB1c2ltXzEyMG1fcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSAmc3lzX2NrLAkJLnJhdGVzID0gZGl2Ml9yYXRlcyB9LAotCXsgLnBhcmVudCA9IE5VTEwgfSwKLX07Ci0KLS8qIDM0MzBFUzIgb25seSAqLwotc3RhdGljIHN0cnVjdCBjbGsgdXNpbV9mY2sgPSB7Ci0JLm5hbWUJCT0gInVzaW1fZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoV0tVUF9NT0QsIENNX0ZDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMEVTMl9FTl9VU0lNT0NQX1NISUZULAotCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKFdLVVBfTU9ELCBDTV9DTEtTRUwpLAotCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwRVMyX0NMS1NFTF9VU0lNT0NQX01BU0ssCi0JLmNsa3NlbAkJPSB1c2ltX2Nsa3NlbCwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotfTsKLQotLyogWFhYIHNob3VsZCBncHQxJ3MgY2xrc2VsIGhhdmUgd2t1cF8zMmtfZmNrIGFzIHRoZSAzMmsgb3B0PyAqLwotc3RhdGljIHN0cnVjdCBjbGsgZ3B0MV9mY2sgPSB7Ci0JLm5hbWUJCT0gImdwdDFfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoV0tVUF9NT0QsIENNX0ZDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUFQxX1NISUZULAotCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKFdLVVBfTU9ELCBDTV9DTEtTRUwpLAotCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9HUFQxX01BU0ssCi0JLmNsa3NlbAkJPSBvbWFwMzQzeF9ncHRfY2xrc2VsLAotCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayB3a3VwXzMya19mY2sgPSB7Ci0JLm5hbWUJCT0gIndrdXBfMzJrX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmb21hcF8zMmtfZmNrLAotCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncGlvMV9kYmNrID0gewotCS5uYW1lCQk9ICJncGlvMV9kYmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKLQkucGFyZW50CQk9ICZ3a3VwXzMya19mY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoV0tVUF9NT0QsIENNX0ZDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUElPMV9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJ3a3VwX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgd2R0Ml9mY2sgPSB7Ci0JLm5hbWUJCT0gIndkdDJfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJndrdXBfMzJrX2ZjaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihXS1VQX01PRCwgQ01fRkNMS0VOKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX1dEVDJfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHdrdXBfbDRfaWNrID0gewotCS5uYW1lCQk9ICJ3a3VwX2w0X2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmc3lzX2NrLAotCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi0vKiAzNDMwRVMyIG9ubHkgKi8KLS8qIE5ldmVyIHNwZWNpZmljYWxseSBuYW1lZCBpbiB0aGUgVFJNLCBzbyB3ZSBoYXZlIHRvIGluZmVyIGEgbGlrZWx5IG5hbWUgKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrIHVzaW1faWNrID0gewotCS5uYW1lCQk9ICJ1c2ltX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZ3a3VwX2w0X2ljaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihXS1VQX01PRCwgQ01fSUNMS0VOKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwRVMyX0VOX1VTSU1PQ1BfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHdkdDJfaWNrID0gewotCS5uYW1lCQk9ICJ3ZHQyX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZ3a3VwX2w0X2ljaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihXS1VQX01PRCwgQ01fSUNMS0VOKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX1dEVDJfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHdkdDFfaWNrID0gewotCS5uYW1lCQk9ICJ3ZHQxX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZ3a3VwX2w0X2ljaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihXS1VQX01PRCwgQ01fSUNMS0VOKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX1dEVDFfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGdwaW8xX2ljayA9IHsKLQkubmFtZQkJPSAiZ3BpbzFfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJndrdXBfbDRfaWNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKFdLVVBfTU9ELCBDTV9JQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BJTzFfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG9tYXBfMzJrc3luY19pY2sgPSB7Ci0JLm5hbWUJCT0gIm9tYXBfMzJrc3luY19pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmd2t1cF9sNF9pY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoV0tVUF9NT0QsIENNX0lDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl8zMktTWU5DX1NISUZULAotCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi0vKiBYWFggVGhpcyBjbG9jayBubyBsb25nZXIgZXhpc3RzIGluIDM0MzAgVFJNIHJldiBGICovCi1zdGF0aWMgc3RydWN0IGNsayBncHQxMl9pY2sgPSB7Ci0JLm5hbWUJCT0gImdwdDEyX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZ3a3VwX2w0X2ljaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihXS1VQX01PRCwgQ01fSUNMS0VOKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQVDEyX1NISUZULAotCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncHQxX2ljayA9IHsKLQkubmFtZQkJPSAiZ3B0MV9pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmd2t1cF9sNF9pY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoV0tVUF9NT0QsIENNX0lDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUFQxX1NISUZULAotCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi0KLQotLyogUEVSIGNsb2NrIGRvbWFpbiAqLwotCi1zdGF0aWMgc3RydWN0IGNsayBwZXJfOTZtX2ZjayA9IHsKLQkubmFtZQkJPSAicGVyXzk2bV9mY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJm9tYXBfOTZtX2Fsd29uX2ZjaywKLQkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBwZXJfNDhtX2ZjayA9IHsKLQkubmFtZQkJPSAicGVyXzQ4bV9mY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJm9tYXBfNDhtX2ZjaywKLQkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayB1YXJ0M19mY2sgPSB7Ci0JLm5hbWUJCT0gInVhcnQzX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZwZXJfNDhtX2ZjaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9GQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fVUFSVDNfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAicGVyX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZ3B0Ml9mY2sgPSB7Ci0JLm5hbWUJCT0gImdwdDJfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fRkNMS0VOKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQVDJfU0hJRlQsCi0JLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fQ0xLU0VMKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9DTEtTRUxfR1BUMl9NQVNLLAotCS5jbGtzZWwJCT0gb21hcDM0M3hfZ3B0X2Nsa3NlbCwKLQkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncHQzX2ZjayA9IHsKLQkubmFtZQkJPSAiZ3B0M19mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9GQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BUM19TSElGVCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9DTEtTRUwpLAotCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9HUFQzX01BU0ssCi0JLmNsa3NlbAkJPSBvbWFwMzQzeF9ncHRfY2xrc2VsLAotCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGdwdDRfZmNrID0gewotCS5uYW1lCQk9ICJncHQ0X2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0ZDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUFQ0X1NISUZULAotCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0NMS1NFTCksCi0JLmNsa3NlbF9tYXNrCT0gT01BUDM0MzBfQ0xLU0VMX0dQVDRfTUFTSywKLQkuY2xrc2VsCQk9IG9tYXAzNDN4X2dwdF9jbGtzZWwsCi0JLmNsa2RtX25hbWUJPSAicGVyX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZ3B0NV9mY2sgPSB7Ci0JLm5hbWUJCT0gImdwdDVfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fRkNMS0VOKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQVDVfU0hJRlQsCi0JLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fQ0xLU0VMKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9DTEtTRUxfR1BUNV9NQVNLLAotCS5jbGtzZWwJCT0gb21hcDM0M3hfZ3B0X2Nsa3NlbCwKLQkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncHQ2X2ZjayA9IHsKLQkubmFtZQkJPSAiZ3B0Nl9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9GQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BUNl9TSElGVCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9DTEtTRUwpLAotCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9HUFQ2X01BU0ssCi0JLmNsa3NlbAkJPSBvbWFwMzQzeF9ncHRfY2xrc2VsLAotCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGdwdDdfZmNrID0gewotCS5uYW1lCQk9ICJncHQ3X2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0ZDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUFQ3X1NISUZULAotCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0NMS1NFTCksCi0JLmNsa3NlbF9tYXNrCT0gT01BUDM0MzBfQ0xLU0VMX0dQVDdfTUFTSywKLQkuY2xrc2VsCQk9IG9tYXAzNDN4X2dwdF9jbGtzZWwsCi0JLmNsa2RtX25hbWUJPSAicGVyX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZ3B0OF9mY2sgPSB7Ci0JLm5hbWUJCT0gImdwdDhfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fRkNMS0VOKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQVDhfU0hJRlQsCi0JLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fQ0xLU0VMKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9DTEtTRUxfR1BUOF9NQVNLLAotCS5jbGtzZWwJCT0gb21hcDM0M3hfZ3B0X2Nsa3NlbCwKLQkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncHQ5X2ZjayA9IHsKLQkubmFtZQkJPSAiZ3B0OV9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9GQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BUOV9TSElGVCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9DTEtTRUwpLAotCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9HUFQ5X01BU0ssCi0JLmNsa3NlbAkJPSBvbWFwMzQzeF9ncHRfY2xrc2VsLAotCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHBlcl8zMmtfYWx3b25fZmNrID0gewotCS5uYW1lCQk9ICJwZXJfMzJrX2Fsd29uX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLnBhcmVudAkJPSAmb21hcF8zMmtfZmNrLAotCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGdwaW82X2RiY2sgPSB7Ci0JLm5hbWUJCT0gImdwaW82X2RiY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAotCS5wYXJlbnQJCT0gJnBlcl8zMmtfYWx3b25fZmNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0ZDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUElPNl9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncGlvNV9kYmNrID0gewotCS5uYW1lCQk9ICJncGlvNV9kYmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKLQkucGFyZW50CQk9ICZwZXJfMzJrX2Fsd29uX2ZjaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9GQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BJTzVfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAicGVyX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgZ3BpbzRfZGJjayA9IHsKLQkubmFtZQkJPSAiZ3BpbzRfZGJjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCi0JLnBhcmVudAkJPSAmcGVyXzMya19hbHdvbl9mY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fRkNMS0VOKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQSU80X1NISUZULAotCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGdwaW8zX2RiY2sgPSB7Ci0JLm5hbWUJCT0gImdwaW8zX2RiY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAotCS5wYXJlbnQJCT0gJnBlcl8zMmtfYWx3b25fZmNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0ZDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUElPM19TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncGlvMl9kYmNrID0gewotCS5uYW1lCQk9ICJncGlvMl9kYmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKLQkucGFyZW50CQk9ICZwZXJfMzJrX2Fsd29uX2ZjaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9GQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BJTzJfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAicGVyX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgd2R0M19mY2sgPSB7Ci0JLm5hbWUJCT0gIndkdDNfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJnBlcl8zMmtfYWx3b25fZmNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0ZDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9XRFQzX1NISUZULAotCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHBlcl9sNF9pY2sgPSB7Ci0JLm5hbWUJCT0gInBlcl9sNF9pY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJmw0X2ljaywKLQkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncGlvNl9pY2sgPSB7Ci0JLm5hbWUJCT0gImdwaW82X2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZwZXJfbDRfaWNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0lDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUElPNl9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncGlvNV9pY2sgPSB7Ci0JLm5hbWUJCT0gImdwaW81X2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZwZXJfbDRfaWNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0lDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUElPNV9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncGlvNF9pY2sgPSB7Ci0JLm5hbWUJCT0gImdwaW80X2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZwZXJfbDRfaWNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0lDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUElPNF9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncGlvM19pY2sgPSB7Ci0JLm5hbWUJCT0gImdwaW8zX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZwZXJfbDRfaWNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0lDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUElPM19TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncGlvMl9pY2sgPSB7Ci0JLm5hbWUJCT0gImdwaW8yX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZwZXJfbDRfaWNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0lDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUElPMl9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayB3ZHQzX2ljayA9IHsKLQkubmFtZQkJPSAid2R0M19pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmcGVyX2w0X2ljaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9JQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fV0RUM19TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayB1YXJ0M19pY2sgPSB7Ci0JLm5hbWUJCT0gInVhcnQzX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZwZXJfbDRfaWNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0lDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9VQVJUM19TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncHQ5X2ljayA9IHsKLQkubmFtZQkJPSAiZ3B0OV9pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmcGVyX2w0X2ljaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9JQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BUOV9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncHQ4X2ljayA9IHsKLQkubmFtZQkJPSAiZ3B0OF9pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmcGVyX2w0X2ljaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9JQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BUOF9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncHQ3X2ljayA9IHsKLQkubmFtZQkJPSAiZ3B0N19pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmcGVyX2w0X2ljaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9JQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BUN19TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncHQ2X2ljayA9IHsKLQkubmFtZQkJPSAiZ3B0Nl9pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmcGVyX2w0X2ljaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9JQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BUNl9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncHQ1X2ljayA9IHsKLQkubmFtZQkJPSAiZ3B0NV9pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmcGVyX2w0X2ljaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9JQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BUNV9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncHQ0X2ljayA9IHsKLQkubmFtZQkJPSAiZ3B0NF9pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmcGVyX2w0X2ljaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9JQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BUNF9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncHQzX2ljayA9IHsKLQkubmFtZQkJPSAiZ3B0M19pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmcGVyX2w0X2ljaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9JQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BUM19TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBncHQyX2ljayA9IHsKLQkubmFtZQkJPSAiZ3B0Ml9pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLnBhcmVudAkJPSAmcGVyX2w0X2ljaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9JQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BUMl9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBtY2JzcDJfaWNrID0gewotCS5uYW1lCQk9ICJtY2JzcF9pY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLmlkCQk9IDIsCi0JLnBhcmVudAkJPSAmcGVyX2w0X2ljaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9JQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fTUNCU1AyX1NISUZULAotCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1jYnNwM19pY2sgPSB7Ci0JLm5hbWUJCT0gIm1jYnNwX2ljayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkuaWQJCT0gMywKLQkucGFyZW50CQk9ICZwZXJfbDRfaWNrLAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0lDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9NQ0JTUDNfU0hJRlQsCi0JLmNsa2RtX25hbWUJPSAicGVyX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbWNic3A0X2ljayA9IHsKLQkubmFtZQkJPSAibWNic3BfaWNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5pZAkJPSA0LAotCS5wYXJlbnQJCT0gJnBlcl9sNF9pY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fSUNMS0VOKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01DQlNQNF9TSElGVCwKLQkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBtY2JzcF8yMzRfY2xrc2VsW10gPSB7Ci0JeyAucGFyZW50ID0gJmNvcmVfOTZtX2ZjaywgLnJhdGVzID0gY29tbW9uX21jYnNwXzk2bV9yYXRlcyB9LAotCXsgLnBhcmVudCA9ICZtY2JzcF9jbGtzLCAgIC5yYXRlcyA9IGNvbW1vbl9tY2JzcF9tY2JzcF9yYXRlcyB9LAotCXsgLnBhcmVudCA9IE5VTEwgfQotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbWNic3AyX2ZjayA9IHsKLQkubmFtZQkJPSAibWNic3BfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5pZAkJPSAyLAotCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fRkNMS0VOKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01DQlNQMl9TSElGVCwKLQkuY2xrc2VsX3JlZwk9IE9NQVAzNDNYX0NUUkxfUkVHQUREUihPTUFQMl9DT05UUk9MX0RFVkNPTkYwKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMl9NQ0JTUDJfQ0xLU19NQVNLLAotCS5jbGtzZWwJCT0gbWNic3BfMjM0X2Nsa3NlbCwKLQkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBtY2JzcDNfZmNrID0gewotCS5uYW1lCQk9ICJtY2JzcF9mY2siLAotCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCi0JLmlkCQk9IDMsCi0JLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9GQ0xLRU4pLAotCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fTUNCU1AzX1NISUZULAotCS5jbGtzZWxfcmVnCT0gT01BUDM0M1hfQ1RSTF9SRUdBRERSKE9NQVAzNDNYX0NPTlRST0xfREVWQ09ORjEpLAotCS5jbGtzZWxfbWFzawk9IE9NQVAyX01DQlNQM19DTEtTX01BU0ssCi0JLmNsa3NlbAkJPSBtY2JzcF8yMzRfY2xrc2VsLAotCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1jYnNwNF9mY2sgPSB7Ci0JLm5hbWUJCT0gIm1jYnNwX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkuaWQJCT0gNCwKLQkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAotCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0ZDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9NQ0JTUDRfU0hJRlQsCi0JLmNsa3NlbF9yZWcJPSBPTUFQMzQzWF9DVFJMX1JFR0FERFIoT01BUDM0M1hfQ09OVFJPTF9ERVZDT05GMSksCi0JLmNsa3NlbF9tYXNrCT0gT01BUDJfTUNCU1A0X0NMS1NfTUFTSywKLQkuY2xrc2VsCQk9IG1jYnNwXzIzNF9jbGtzZWwsCi0JLmNsa2RtX25hbWUJPSAicGVyX2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotfTsKLQotLyogRU1VIGNsb2NrcyAqLwotCi0vKiBNb3JlIGluZm9ybWF0aW9uOiBBUk0gQ29ydGV4LUE4IFRlY2huaWNhbCBSZWZlcmVuY2UgTWFudWFsLCBzZWN0IDEwLjEgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBlbXVfc3JjX3N5c19yYXRlc1tdID0gewotCXsgLmRpdiA9IDEsIC52YWwgPSAwLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfCBERUZBVUxUX1JBVEUgfSwKLQl7IC5kaXYgPSAwIH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGVtdV9zcmNfY29yZV9yYXRlc1tdID0gewotCXsgLmRpdiA9IDEsIC52YWwgPSAxLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfCBERUZBVUxUX1JBVEUgfSwKLQl7IC5kaXYgPSAwIH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGVtdV9zcmNfcGVyX3JhdGVzW10gPSB7Ci0JeyAuZGl2ID0gMSwgLnZhbCA9IDIsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB8IERFRkFVTFRfUkFURSB9LAotCXsgLmRpdiA9IDAgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgZW11X3NyY19tcHVfcmF0ZXNbXSA9IHsKLQl7IC5kaXYgPSAxLCAudmFsID0gMywgLmZsYWdzID0gUkFURV9JTl8zNDNYIHwgREVGQVVMVF9SQVRFIH0sCi0JeyAuZGl2ID0gMCB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgZW11X3NyY19jbGtzZWxbXSA9IHsKLQl7IC5wYXJlbnQgPSAmc3lzX2NrLAkJLnJhdGVzID0gZW11X3NyY19zeXNfcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSAmZW11X2NvcmVfYWx3b25fY2ssIC5yYXRlcyA9IGVtdV9zcmNfY29yZV9yYXRlcyB9LAotCXsgLnBhcmVudCA9ICZlbXVfcGVyX2Fsd29uX2NrLAkucmF0ZXMgPSBlbXVfc3JjX3Blcl9yYXRlcyB9LAotCXsgLnBhcmVudCA9ICZlbXVfbXB1X2Fsd29uX2NrLAkucmF0ZXMgPSBlbXVfc3JjX21wdV9yYXRlcyB9LAotCXsgLnBhcmVudCA9IE5VTEwgfSwKLX07Ci0KLS8qCi0gKiBMaWtlIHRoZSBjbGtvdXRfc3JjIGNsb2NrcywgZW11X3NyY19jbGsgaXMgYSB2aXJ0dWFsIGNsb2NrLCBleGlzdGluZyBvbmx5Ci0gKiB0byBzd2l0Y2ggdGhlIHNvdXJjZSBvZiBzb21lIG9mIHRoZSBFTVUgY2xvY2tzLgotICogWFhYIEFyZSB0aGVyZSBDTEtFTiBiaXRzIGZvciB0aGVzZSBFTVUgY2xrcz8KLSAqLwotc3RhdGljIHN0cnVjdCBjbGsgZW11X3NyY19jayA9IHsKLQkubmFtZQkJPSAiZW11X3NyY19jayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9FTVVfTU9ELCBDTV9DTEtTRUwxKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9NVVhfQ1RSTF9NQVNLLAotCS5jbGtzZWwJCT0gZW11X3NyY19jbGtzZWwsCi0JLmNsa2RtX25hbWUJPSAiZW11X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBwY2xrX2VtdV9yYXRlc1tdID0gewotCXsgLmRpdiA9IDIsIC52YWwgPSAyLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfCBERUZBVUxUX1JBVEUgfSwKLQl7IC5kaXYgPSAzLCAudmFsID0gMywgLmZsYWdzID0gUkFURV9JTl8zNDNYIH0sCi0JeyAuZGl2ID0gNCwgLnZhbCA9IDQsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAotCXsgLmRpdiA9IDYsIC52YWwgPSA2LCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfSwKLQl7IC5kaXYgPSAwIH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBwY2xrX2VtdV9jbGtzZWxbXSA9IHsKLQl7IC5wYXJlbnQgPSAmZW11X3NyY19jaywgLnJhdGVzID0gcGNsa19lbXVfcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSBOVUxMIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBwY2xrX2ZjayA9IHsKLQkubmFtZQkJPSAicGNsa19mY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCi0JLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfRU1VX01PRCwgQ01fQ0xLU0VMMSksCi0JLmNsa3NlbF9tYXNrCT0gT01BUDM0MzBfQ0xLU0VMX1BDTEtfTUFTSywKLQkuY2xrc2VsCQk9IHBjbGtfZW11X2Nsa3NlbCwKLQkuY2xrZG1fbmFtZQk9ICJlbXVfY2xrZG0iLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIHBjbGt4Ml9lbXVfcmF0ZXNbXSA9IHsKLQl7IC5kaXYgPSAxLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8zNDNYIHwgREVGQVVMVF9SQVRFIH0sCi0JeyAuZGl2ID0gMiwgLnZhbCA9IDIsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAotCXsgLmRpdiA9IDMsIC52YWwgPSAzLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfSwKLQl7IC5kaXYgPSAwIH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBwY2xreDJfZW11X2Nsa3NlbFtdID0gewotCXsgLnBhcmVudCA9ICZlbXVfc3JjX2NrLCAucmF0ZXMgPSBwY2xreDJfZW11X3JhdGVzIH0sCi0JeyAucGFyZW50ID0gTlVMTCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgcGNsa3gyX2ZjayA9IHsKLQkubmFtZQkJPSAicGNsa3gyX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9FTVVfTU9ELCBDTV9DTEtTRUwxKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9DTEtTRUxfUENMS1gyX01BU0ssCi0JLmNsa3NlbAkJPSBwY2xreDJfZW11X2Nsa3NlbCwKLQkuY2xrZG1fbmFtZQk9ICJlbXVfY2xrZG0iLAotCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBhdGNsa19lbXVfY2xrc2VsW10gPSB7Ci0JeyAucGFyZW50ID0gJmVtdV9zcmNfY2ssIC5yYXRlcyA9IGRpdjJfcmF0ZXMgfSwKLQl7IC5wYXJlbnQgPSBOVUxMIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBhdGNsa19mY2sgPSB7Ci0JLm5hbWUJCT0gImF0Y2xrX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9FTVVfTU9ELCBDTV9DTEtTRUwxKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9DTEtTRUxfQVRDTEtfTUFTSywKLQkuY2xrc2VsCQk9IGF0Y2xrX2VtdV9jbGtzZWwsCi0JLmNsa2RtX25hbWUJPSAiZW11X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgdHJhY2VjbGtfc3JjX2ZjayA9IHsKLQkubmFtZQkJPSAidHJhY2VjbGtfc3JjX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX251bGwsCi0JLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKLQkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9FTVVfTU9ELCBDTV9DTEtTRUwxKSwKLQkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9UUkFDRV9NVVhfQ1RSTF9NQVNLLAotCS5jbGtzZWwJCT0gZW11X3NyY19jbGtzZWwsCi0JLmNsa2RtX25hbWUJPSAiZW11X2Nsa2RtIiwKLQkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSB0cmFjZWNsa19yYXRlc1tdID0gewotCXsgLmRpdiA9IDEsIC52YWwgPSAxLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfCBERUZBVUxUX1JBVEUgfSwKLQl7IC5kaXYgPSAyLCAudmFsID0gMiwgLmZsYWdzID0gUkFURV9JTl8zNDNYIH0sCi0JeyAuZGl2ID0gNCwgLnZhbCA9IDQsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAotCXsgLmRpdiA9IDAgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIHRyYWNlY2xrX2Nsa3NlbFtdID0gewotCXsgLnBhcmVudCA9ICZ0cmFjZWNsa19zcmNfZmNrLCAucmF0ZXMgPSB0cmFjZWNsa19yYXRlcyB9LAotCXsgLnBhcmVudCA9IE5VTEwgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHRyYWNlY2xrX2ZjayA9IHsKLQkubmFtZQkJPSAidHJhY2VjbGtfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfbnVsbCwKLQkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAotCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX0VNVV9NT0QsIENNX0NMS1NFTDEpLAotCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9UUkFDRUNMS19NQVNLLAotCS5jbGtzZWwJCT0gdHJhY2VjbGtfY2xrc2VsLAotCS5jbGtkbV9uYW1lCT0gImVtdV9jbGtkbSIsCi0JLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKLX07Ci0KLS8qIFNSIGNsb2NrcyAqLwotCi0vKiBTbWFydFJlZmxleCBmY2xrIChWREQxKSAqLwotc3RhdGljIHN0cnVjdCBjbGsgc3IxX2ZjayA9IHsKLQkubmFtZQkJPSAic3IxX2ZjayIsCi0JLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKLQkucGFyZW50CQk9ICZzeXNfY2ssCi0JLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoV0tVUF9NT0QsIENNX0ZDTEtFTiksCi0JLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9TUjFfU0hJRlQsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLS8qIFNtYXJ0UmVmbGV4IGZjbGsgKFZERDIpICovCi1zdGF0aWMgc3RydWN0IGNsayBzcjJfZmNrID0gewotCS5uYW1lCQk9ICJzcjJfZmNrIiwKLQkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAotCS5wYXJlbnQJCT0gJnN5c19jaywKLQkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihXS1VQX01PRCwgQ01fRkNMS0VOKSwKLQkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX1NSMl9TSElGVCwKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgc3JfbDRfaWNrID0gewotCS5uYW1lCQk9ICJzcl9sNF9pY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLCAvKiBSTUs6IG1pc3Npbmc/ICovCi0JLnBhcmVudAkJPSAmbDRfaWNrLAotCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi0vKiBTRUNVUkVfMzJLX0ZDSyBjbG9ja3MgKi8KLQotc3RhdGljIHN0cnVjdCBjbGsgZ3B0MTJfZmNrID0gewotCS5uYW1lCQk9ICJncHQxMl9mY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJnNlY3VyZV8zMmtfZmNrLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayB3ZHQxX2ZjayA9IHsKLQkubmFtZQkJPSAid2R0MV9mY2siLAotCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5wYXJlbnQJCT0gJnNlY3VyZV8zMmtfZmNrLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OworLyogT01BUDM0eHgtc3BlY2lmaWMgY2xrb3BzICovCitleHRlcm4gY29uc3Qgc3RydWN0IGNsa29wcyBjbGtvcHNfb21hcDM0MzBlczJfc3NpX3dhaXQ7CitleHRlcm4gY29uc3Qgc3RydWN0IGNsa29wcyBjbGtvcHNfb21hcDM0MzBlczJfaHNvdGd1c2Jfd2FpdDsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgY2xrb3BzIGNsa29wc19vbWFwMzQzMGVzMl9kc3NfdXNiaG9zdF93YWl0OworZXh0ZXJuIGNvbnN0IHN0cnVjdCBjbGtvcHMgY2xrb3BzX25vbmNvcmVfZHBsbF9vcHM7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazM0eHhfZGF0YS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazM0eHhfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZGNjOWNjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazM0eHhfZGF0YS5jCkBAIC0wLDAgKzEsMzI4OSBAQAorLyoKKyAqIE9NQVAzIGNsb2NrIGRhdGEKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBXcml0dGVuIGJ5IFBhdWwgV2FsbXNsZXkKKyAqIFdpdGggbWFueSBkZXZpY2UgY2xvY2sgZml4ZXMgYnkgS2V2aW4gSGlsbWFuIGFuZCBKb3VuaSBIw7ZnYW5kZXIKKyAqIERQTEwgYnlwYXNzIGNsb2NrIHN1cHBvcnQgYWRkZWQgYnkgUm9tYW4gVGVyZXNob25rb3YKKyAqCisgKi8KKworLyoKKyAqIFZpcnR1YWwgY2xvY2tzIGFyZSBpbnRyb2R1Y2VkIGFzIGNvbnZlbmllbnQgdG9vbHMuCisgKiBUaGV5IGFyZSBzb3VyY2VzIGZvciBvdGhlciBjbG9ja3MgYW5kIG5vdCBzdXBwb3NlZAorICogdG8gYmUgcmVxdWVzdGVkIGZyb20gZHJpdmVycyBkaXJlY3RseS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisKKyNpbmNsdWRlIDxwbGF0L2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxwbGF0L2Nsa2Rldl9vbWFwLmg+CisKKyNpbmNsdWRlICJjbG9jay5oIgorI2luY2x1ZGUgImNsb2NrMzR4eC5oIgorI2luY2x1ZGUgImNtLmgiCisjaW5jbHVkZSAiY20tcmVnYml0cy0zNHh4LmgiCisjaW5jbHVkZSAicHJtLmgiCisjaW5jbHVkZSAicHJtLXJlZ2JpdHMtMzR4eC5oIgorCisvKgorICogY2xvY2tzCisgKi8KKworI2RlZmluZSBPTUFQX0NNX1JFR0FERFIJCU9NQVAzNFhYX0NNX1JFR0FERFIKKworLyogTWF4aW11bSBEUExMIG11bHRpcGxpZXIsIGRpdmlkZXIgdmFsdWVzIGZvciBPTUFQMyAqLworI2RlZmluZSBPTUFQM19NQVhfRFBMTF9NVUxUCQkyMDQ4CisjZGVmaW5lIE9NQVAzX01BWF9EUExMX0RJVgkJMTI4CisKKy8qCisgKiBEUExMMSBzdXBwbGllcyBjbG9jayB0byB0aGUgTVBVLgorICogRFBMTDIgc3VwcGxpZXMgY2xvY2sgdG8gdGhlIElWQTIuCisgKiBEUExMMyBzdXBwbGllcyBDT1JFIGRvbWFpbiBjbG9ja3MuCisgKiBEUExMNCBzdXBwbGllcyBwZXJpcGhlcmFsIGNsb2Nrcy4KKyAqIERQTEw1IHN1cHBsaWVzIG90aGVyIHBlcmlwaGVyYWwgY2xvY2tzIChVU0JIT1NULCBVU0lNKS4KKyAqLworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgRFBMTCBieXBhc3MgY2xvY2tzICovCitzdGF0aWMgc3RydWN0IGNsayBkcGxsMV9mY2s7CitzdGF0aWMgc3RydWN0IGNsayBkcGxsMl9mY2s7CisKKy8qIFBSTSBDTE9DS1MgKi8KKworLyogQWNjb3JkaW5nIHRvIHRpbWVyMzJrLmMsIHRoaXMgaXMgYSAzMjc2OEh6IGNsb2NrLCBub3QgYSAzMjAwMEh6IGNsb2NrLiAqLworc3RhdGljIHN0cnVjdCBjbGsgb21hcF8zMmtfZmNrID0geworCS5uYW1lCQk9ICJvbWFwXzMya19mY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yYXRlCQk9IDMyNzY4LAorCS5mbGFncwkJPSBSQVRFX0ZJWEVELAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgc2VjdXJlXzMya19mY2sgPSB7CisJLm5hbWUJCT0gInNlY3VyZV8zMmtfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucmF0ZQkJPSAzMjc2OCwKKwkuZmxhZ3MJCT0gUkFURV9GSVhFRCwKK307CisKKy8qIFZpcnR1YWwgc291cmNlIGNsb2NrcyBmb3Igb3NjX3N5c19jayAqLworc3RhdGljIHN0cnVjdCBjbGsgdmlydF8xMm1fY2sgPSB7CisJLm5hbWUJCT0gInZpcnRfMTJtX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucmF0ZQkJPSAxMjAwMDAwMCwKKwkuZmxhZ3MJCT0gUkFURV9GSVhFRCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHZpcnRfMTNtX2NrID0geworCS5uYW1lCQk9ICJ2aXJ0XzEzbV9jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJhdGUJCT0gMTMwMDAwMDAsCisJLmZsYWdzCQk9IFJBVEVfRklYRUQsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB2aXJ0XzE2XzhtX2NrID0geworCS5uYW1lCQk9ICJ2aXJ0XzE2XzhtX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucmF0ZQkJPSAxNjgwMDAwMCwKKwkuZmxhZ3MJCT0gUkFURV9GSVhFRCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHZpcnRfMTlfMm1fY2sgPSB7CisJLm5hbWUJCT0gInZpcnRfMTlfMm1fY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yYXRlCQk9IDE5MjAwMDAwLAorCS5mbGFncwkJPSBSQVRFX0ZJWEVELAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdmlydF8yNm1fY2sgPSB7CisJLm5hbWUJCT0gInZpcnRfMjZtX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucmF0ZQkJPSAyNjAwMDAwMCwKKwkuZmxhZ3MJCT0gUkFURV9GSVhFRCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHZpcnRfMzhfNG1fY2sgPSB7CisJLm5hbWUJCT0gInZpcnRfMzhfNG1fY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yYXRlCQk9IDM4NDAwMDAwLAorCS5mbGFncwkJPSBSQVRFX0ZJWEVELAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBvc2Nfc3lzXzEybV9yYXRlc1tdID0geworCXsgLmRpdiA9IDEsIC52YWwgPSAwLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfCBERUZBVUxUX1JBVEUgfSwKKwl7IC5kaXYgPSAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgb3NjX3N5c18xM21fcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8zNDNYIHwgREVGQVVMVF9SQVRFIH0sCisJeyAuZGl2ID0gMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIG9zY19zeXNfMTZfOG1fcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gNSwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIHwgREVGQVVMVF9SQVRFIH0sCisJeyAuZGl2ID0gMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIG9zY19zeXNfMTlfMm1fcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gMiwgLmZsYWdzID0gUkFURV9JTl8zNDNYIHwgREVGQVVMVF9SQVRFIH0sCisJeyAuZGl2ID0gMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIG9zY19zeXNfMjZtX3JhdGVzW10gPSB7CisJeyAuZGl2ID0gMSwgLnZhbCA9IDMsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB8IERFRkFVTFRfUkFURSB9LAorCXsgLmRpdiA9IDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBvc2Nfc3lzXzM4XzRtX3JhdGVzW10gPSB7CisJeyAuZGl2ID0gMSwgLnZhbCA9IDQsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB8IERFRkFVTFRfUkFURSB9LAorCXsgLmRpdiA9IDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgb3NjX3N5c19jbGtzZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmdmlydF8xMm1fY2ssICAgLnJhdGVzID0gb3NjX3N5c18xMm1fcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmdmlydF8xM21fY2ssICAgLnJhdGVzID0gb3NjX3N5c18xM21fcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmdmlydF8xNl84bV9jaywgLnJhdGVzID0gb3NjX3N5c18xNl84bV9yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZ2aXJ0XzE5XzJtX2NrLCAucmF0ZXMgPSBvc2Nfc3lzXzE5XzJtX3JhdGVzIH0sCisJeyAucGFyZW50ID0gJnZpcnRfMjZtX2NrLCAgIC5yYXRlcyA9IG9zY19zeXNfMjZtX3JhdGVzIH0sCisJeyAucGFyZW50ID0gJnZpcnRfMzhfNG1fY2ssIC5yYXRlcyA9IG9zY19zeXNfMzhfNG1fcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCisvKiBPc2NpbGxhdG9yIGNsb2NrICovCisvKiAxMiwgMTMsIDE2LjgsIDE5LjIsIDI2LCBvciAzOC40IE1IeiAqLworc3RhdGljIHN0cnVjdCBjbGsgb3NjX3N5c19jayA9IHsKKwkubmFtZQkJPSAib3NjX3N5c19jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuY2xrc2VsX3JlZwk9IE9NQVAzNDMwX1BSTV9DTEtTRUwsCisJLmNsa3NlbF9tYXNrCT0gT01BUDM0MzBfU1lTX0NMS0lOX1NFTF9NQVNLLAorCS5jbGtzZWwJCT0gb3NjX3N5c19jbGtzZWwsCisJLyogUkVWSVNJVDogZGVhbCB3aXRoIGF1dG9leHRjbGttb2RlPyAqLworCS5mbGFncwkJPSBSQVRFX0ZJWEVELAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGRpdjJfcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8zNDNYIHwgREVGQVVMVF9SQVRFIH0sCisJeyAuZGl2ID0gMiwgLnZhbCA9IDIsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAorCXsgLmRpdiA9IDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgc3lzX2Nsa3NlbFtdID0geworCXsgLnBhcmVudCA9ICZvc2Nfc3lzX2NrLCAucmF0ZXMgPSBkaXYyX3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9Cit9OworCisvKiBMYXRlbmN5OiB0aGlzIGNsb2NrIGlzIG9ubHkgZW5hYmxlZCBhZnRlciBQUk1fQ0xLU0VUVVAuU0VUVVBfVElNRSAqLworLyogRmVlZHMgRFBMTHMgLSBkaXZpZGVkIGZpcnN0IGJ5IFBSTV9DTEtTUkNfQ1RSTC5TWVNDTEtESVY/ICovCitzdGF0aWMgc3RydWN0IGNsayBzeXNfY2sgPSB7CisJLm5hbWUJCT0gInN5c19jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmb3NjX3N5c19jaywKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUDM0MzBfUFJNX0NMS1NSQ19DVFJMLAorCS5jbGtzZWxfbWFzawk9IE9NQVBfU1lTQ0xLRElWX01BU0ssCisJLmNsa3NlbAkJPSBzeXNfY2xrc2VsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBzeXNfYWx0Y2xrID0geworCS5uYW1lCQk9ICJzeXNfYWx0Y2xrIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKK307CisKKy8qIE9wdGlvbmFsIGV4dGVybmFsIGNsb2NrIGlucHV0IGZvciBzb21lIE1jQlNQcyAqLworc3RhdGljIHN0cnVjdCBjbGsgbWNic3BfY2xrcyA9IHsKKwkubmFtZQkJPSAibWNic3BfY2xrcyIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCit9OworCisvKiBQUk0gRVhURVJOQUwgQ0xPQ0sgT1VUUFVUICovCisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHN5c19jbGtvdXQxID0geworCS5uYW1lCQk9ICJzeXNfY2xrb3V0MSIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLnBhcmVudAkJPSAmb3NjX3N5c19jaywKKwkuZW5hYmxlX3JlZwk9IE9NQVAzNDMwX1BSTV9DTEtPVVRfQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0NMS09VVF9FTl9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworLyogRFBMTFMgKi8KKworLyogQ00gQ0xPQ0tTICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgZGl2MTZfZHBsbF9yYXRlc1tdID0geworCXsgLmRpdiA9IDEsIC52YWwgPSAxLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfCBERUZBVUxUX1JBVEUgfSwKKwl7IC5kaXYgPSAyLCAudmFsID0gMiwgLmZsYWdzID0gUkFURV9JTl8zNDNYIH0sCisJeyAuZGl2ID0gMywgLnZhbCA9IDMsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAorCXsgLmRpdiA9IDQsIC52YWwgPSA0LCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfSwKKwl7IC5kaXYgPSA1LCAudmFsID0gNSwgLmZsYWdzID0gUkFURV9JTl8zNDNYIH0sCisJeyAuZGl2ID0gNiwgLnZhbCA9IDYsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAorCXsgLmRpdiA9IDcsIC52YWwgPSA3LCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfSwKKwl7IC5kaXYgPSA4LCAudmFsID0gOCwgLmZsYWdzID0gUkFURV9JTl8zNDNYIH0sCisJeyAuZGl2ID0gOSwgLnZhbCA9IDksIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAorCXsgLmRpdiA9IDEwLCAudmFsID0gMTAsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAorCXsgLmRpdiA9IDExLCAudmFsID0gMTEsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAorCXsgLmRpdiA9IDEyLCAudmFsID0gMTIsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAorCXsgLmRpdiA9IDEzLCAudmFsID0gMTMsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAorCXsgLmRpdiA9IDE0LCAudmFsID0gMTQsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAorCXsgLmRpdiA9IDE1LCAudmFsID0gMTUsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAorCXsgLmRpdiA9IDE2LCAudmFsID0gMTYsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAorCXsgLmRpdiA9IDAgfQorfTsKKworLyogRFBMTDEgKi8KKy8qIE1QVSBjbG9jayBzb3VyY2UgKi8KKy8qIFR5cGU6IERQTEwgKi8KK3N0YXRpYyBzdHJ1Y3QgZHBsbF9kYXRhIGRwbGwxX2RkID0geworCS5tdWx0X2RpdjFfcmVnCT0gT01BUF9DTV9SRUdBRERSKE1QVV9NT0QsIE9NQVAzNDMwX0NNX0NMS1NFTDFfUExMKSwKKwkubXVsdF9tYXNrCT0gT01BUDM0MzBfTVBVX0RQTExfTVVMVF9NQVNLLAorCS5kaXYxX21hc2sJPSBPTUFQMzQzMF9NUFVfRFBMTF9ESVZfTUFTSywKKwkuY2xrX2J5cGFzcwk9ICZkcGxsMV9mY2ssCisJLmNsa19yZWYJPSAmc3lzX2NrLAorCS5mcmVxc2VsX21hc2sJPSBPTUFQMzQzMF9NUFVfRFBMTF9GUkVRU0VMX01BU0ssCisJLmNvbnRyb2xfcmVnCT0gT01BUF9DTV9SRUdBRERSKE1QVV9NT0QsIE9NQVAzNDMwX0NNX0NMS0VOX1BMTCksCisJLmVuYWJsZV9tYXNrCT0gT01BUDM0MzBfRU5fTVBVX0RQTExfTUFTSywKKwkubW9kZXMJCT0gKDEgPDwgRFBMTF9MT1dfUE9XRVJfQllQQVNTKSB8ICgxIDw8IERQTExfTE9DS0VEKSwKKwkuYXV0b19yZWNhbF9iaXQJPSBPTUFQMzQzMF9FTl9NUFVfRFBMTF9EUklGVEdVQVJEX1NISUZULAorCS5yZWNhbF9lbl9iaXQJPSBPTUFQMzQzMF9NUFVfRFBMTF9SRUNBTF9FTl9TSElGVCwKKwkucmVjYWxfc3RfYml0CT0gT01BUDM0MzBfTVBVX0RQTExfU1RfU0hJRlQsCisJLmF1dG9pZGxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihNUFVfTU9ELCBPTUFQMzQzMF9DTV9BVVRPSURMRV9QTEwpLAorCS5hdXRvaWRsZV9tYXNrCT0gT01BUDM0MzBfQVVUT19NUFVfRFBMTF9NQVNLLAorCS5pZGxlc3RfcmVnCT0gT01BUF9DTV9SRUdBRERSKE1QVV9NT0QsIE9NQVAzNDMwX0NNX0lETEVTVF9QTEwpLAorCS5pZGxlc3RfbWFzawk9IE9NQVAzNDMwX1NUX01QVV9DTEtfTUFTSywKKwkubWF4X211bHRpcGxpZXIgPSBPTUFQM19NQVhfRFBMTF9NVUxULAorCS5taW5fZGl2aWRlcgk9IDEsCisJLm1heF9kaXZpZGVyCT0gT01BUDNfTUFYX0RQTExfRElWLAorCS5yYXRlX3RvbGVyYW5jZSA9IERFRkFVTFRfRFBMTF9SQVRFX1RPTEVSQU5DRQorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZHBsbDFfY2sgPSB7CisJLm5hbWUJCT0gImRwbGwxX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucGFyZW50CQk9ICZzeXNfY2ssCisJLmRwbGxfZGF0YQk9ICZkcGxsMV9kZCwKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9kcGxsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gJm9tYXAzX25vbmNvcmVfZHBsbF9zZXRfcmF0ZSwKKwkuY2xrZG1fbmFtZQk9ICJkcGxsMV9jbGtkbSIsCisJLnJlY2FsYwkJPSAmb21hcDNfZHBsbF9yZWNhbGMsCit9OworCisvKgorICogVGhpcyB2aXJ0dWFsIGNsb2NrIHByb3ZpZGVzIHRoZSBDTEtPVVRYMiBvdXRwdXQgZnJvbSB0aGUgRFBMTCBpZiB0aGUKKyAqIERQTEwgaXNuJ3QgYnlwYXNzZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIGRwbGwxX3gyX2NrID0geworCS5uYW1lCQk9ICJkcGxsMV94Ml9jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmZHBsbDFfY2ssCisJLmNsa2RtX25hbWUJPSAiZHBsbDFfY2xrZG0iLAorCS5yZWNhbGMJCT0gJm9tYXAzX2Nsa291dHgyX3JlY2FsYywKK307CisKKy8qIE9uIERQTEwxLCB1bmxpa2Ugb3RoZXIgRFBMTHMsIHRoZSBkaXZpZGVyIGlzIGRvd25zdHJlYW0gZnJvbSBDTEtPVVRYMiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgZGl2MTZfZHBsbDFfeDJtMl9jbGtzZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmZHBsbDFfeDJfY2ssIC5yYXRlcyA9IGRpdjE2X2RwbGxfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0KK307CisKKy8qCisgKiBEb2VzIG5vdCBleGlzdCBpbiB0aGUgVFJNIC0gbmVlZGVkIHRvIHNlcGFyYXRlIHRoZSBNMiBkaXZpZGVyIGZyb20KKyAqIGJ5cGFzcyBzZWxlY3Rpb24gaW4gbXB1X2NrCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIGRwbGwxX3gybTJfY2sgPSB7CisJLm5hbWUJCT0gImRwbGwxX3gybTJfY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5wYXJlbnQJCT0gJmRwbGwxX3gyX2NrLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoTVBVX01PRCwgT01BUDM0MzBfQ01fQ0xLU0VMMl9QTEwpLAorCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX01QVV9EUExMX0NMS09VVF9ESVZfTUFTSywKKwkuY2xrc2VsCQk9IGRpdjE2X2RwbGwxX3gybTJfY2xrc2VsLAorCS5jbGtkbV9uYW1lCT0gImRwbGwxX2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorfTsKKworLyogRFBMTDIgKi8KKy8qIElWQTIgY2xvY2sgc291cmNlICovCisvKiBUeXBlOiBEUExMICovCisKK3N0YXRpYyBzdHJ1Y3QgZHBsbF9kYXRhIGRwbGwyX2RkID0geworCS5tdWx0X2RpdjFfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX0lWQTJfTU9ELCBPTUFQMzQzMF9DTV9DTEtTRUwxX1BMTCksCisJLm11bHRfbWFzawk9IE9NQVAzNDMwX0lWQTJfRFBMTF9NVUxUX01BU0ssCisJLmRpdjFfbWFzawk9IE9NQVAzNDMwX0lWQTJfRFBMTF9ESVZfTUFTSywKKwkuY2xrX2J5cGFzcwk9ICZkcGxsMl9mY2ssCisJLmNsa19yZWYJPSAmc3lzX2NrLAorCS5mcmVxc2VsX21hc2sJPSBPTUFQMzQzMF9JVkEyX0RQTExfRlJFUVNFTF9NQVNLLAorCS5jb250cm9sX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9JVkEyX01PRCwgT01BUDM0MzBfQ01fQ0xLRU5fUExMKSwKKwkuZW5hYmxlX21hc2sJPSBPTUFQMzQzMF9FTl9JVkEyX0RQTExfTUFTSywKKwkubW9kZXMJCT0gKDEgPDwgRFBMTF9MT1dfUE9XRVJfU1RPUCkgfCAoMSA8PCBEUExMX0xPQ0tFRCkgfAorCQkJCSgxIDw8IERQTExfTE9XX1BPV0VSX0JZUEFTUyksCisJLmF1dG9fcmVjYWxfYml0CT0gT01BUDM0MzBfRU5fSVZBMl9EUExMX0RSSUZUR1VBUkRfU0hJRlQsCisJLnJlY2FsX2VuX2JpdAk9IE9NQVAzNDMwX1BSTV9JUlFFTkFCTEVfTVBVX0lWQTJfRFBMTF9SRUNBTF9FTl9TSElGVCwKKwkucmVjYWxfc3RfYml0CT0gT01BUDM0MzBfUFJNX0lSUVNUQVRVU19NUFVfSVZBMl9EUExMX1NUX1NISUZULAorCS5hdXRvaWRsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfSVZBMl9NT0QsIE9NQVAzNDMwX0NNX0FVVE9JRExFX1BMTCksCisJLmF1dG9pZGxlX21hc2sJPSBPTUFQMzQzMF9BVVRPX0lWQTJfRFBMTF9NQVNLLAorCS5pZGxlc3RfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX0lWQTJfTU9ELCBPTUFQMzQzMF9DTV9JRExFU1RfUExMKSwKKwkuaWRsZXN0X21hc2sJPSBPTUFQMzQzMF9TVF9JVkEyX0NMS19NQVNLLAorCS5tYXhfbXVsdGlwbGllciA9IE9NQVAzX01BWF9EUExMX01VTFQsCisJLm1pbl9kaXZpZGVyCT0gMSwKKwkubWF4X2RpdmlkZXIJPSBPTUFQM19NQVhfRFBMTF9ESVYsCisJLnJhdGVfdG9sZXJhbmNlID0gREVGQVVMVF9EUExMX1JBVEVfVE9MRVJBTkNFCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkcGxsMl9jayA9IHsKKwkubmFtZQkJPSAiZHBsbDJfY2siLAorCS5vcHMJCT0gJmNsa29wc19ub25jb3JlX2RwbGxfb3BzLAorCS5wYXJlbnQJCT0gJnN5c19jaywKKwkuZHBsbF9kYXRhCT0gJmRwbGwyX2RkLAorCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2RwbGxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDNfbm9uY29yZV9kcGxsX3NldF9yYXRlLAorCS5jbGtkbV9uYW1lCT0gImRwbGwyX2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZvbWFwM19kcGxsX3JlY2FsYywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGRpdjE2X2RwbGwyX20yeDJfY2xrc2VsW10gPSB7CisJeyAucGFyZW50ID0gJmRwbGwyX2NrLCAucmF0ZXMgPSBkaXYxNl9kcGxsX3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9Cit9OworCisvKgorICogVGhlIFRSTSBpcyBjb25mbGljdGVkIG9uIHdoZXRoZXIgSVZBMiBjbG9jayBjb21lcyBmcm9tIERQTEwyIENMS09VVAorICogb3IgQ0xLT1VUWDIuIENMS09VVCBzZWVtcyBtb3N0IHBsYXVzaWJsZS4KKyAqLworc3RhdGljIHN0cnVjdCBjbGsgZHBsbDJfbTJfY2sgPSB7CisJLm5hbWUJCT0gImRwbGwyX20yX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucGFyZW50CQk9ICZkcGxsMl9jaywKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX0lWQTJfTU9ELAorCQkJCQkgIE9NQVAzNDMwX0NNX0NMS1NFTDJfUExMKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9JVkEyX0RQTExfQ0xLT1VUX0RJVl9NQVNLLAorCS5jbGtzZWwJCT0gZGl2MTZfZHBsbDJfbTJ4Ml9jbGtzZWwsCisJLmNsa2RtX25hbWUJPSAiZHBsbDJfY2xrZG0iLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCit9OworCisvKgorICogRFBMTDMKKyAqIFNvdXJjZSBjbG9jayBmb3IgYWxsIGludGVyZmFjZXMgYW5kIGZvciBzb21lIGRldmljZSBmY2xrcworICogUkVWSVNJVDogQWxzbyBzdXBwb3J0cyBmYXN0IHJlbG9jayBieXBhc3MgLSBub3QgaW5jbHVkZWQgYmVsb3cKKyAqLworc3RhdGljIHN0cnVjdCBkcGxsX2RhdGEgZHBsbDNfZGQgPSB7CisJLm11bHRfZGl2MV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQ0xLU0VMMSksCisJLm11bHRfbWFzawk9IE9NQVAzNDMwX0NPUkVfRFBMTF9NVUxUX01BU0ssCisJLmRpdjFfbWFzawk9IE9NQVAzNDMwX0NPUkVfRFBMTF9ESVZfTUFTSywKKwkuY2xrX2J5cGFzcwk9ICZzeXNfY2ssCisJLmNsa19yZWYJPSAmc3lzX2NrLAorCS5mcmVxc2VsX21hc2sJPSBPTUFQMzQzMF9DT1JFX0RQTExfRlJFUVNFTF9NQVNLLAorCS5jb250cm9sX3JlZwk9IE9NQVBfQ01fUkVHQUREUihQTExfTU9ELCBDTV9DTEtFTiksCisJLmVuYWJsZV9tYXNrCT0gT01BUDM0MzBfRU5fQ09SRV9EUExMX01BU0ssCisJLmF1dG9fcmVjYWxfYml0CT0gT01BUDM0MzBfRU5fQ09SRV9EUExMX0RSSUZUR1VBUkRfU0hJRlQsCisJLnJlY2FsX2VuX2JpdAk9IE9NQVAzNDMwX0NPUkVfRFBMTF9SRUNBTF9FTl9TSElGVCwKKwkucmVjYWxfc3RfYml0CT0gT01BUDM0MzBfQ09SRV9EUExMX1NUX1NISUZULAorCS5hdXRvaWRsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQVVUT0lETEUpLAorCS5hdXRvaWRsZV9tYXNrCT0gT01BUDM0MzBfQVVUT19DT1JFX0RQTExfTUFTSywKKwkuaWRsZXN0X3JlZwk9IE9NQVBfQ01fUkVHQUREUihQTExfTU9ELCBDTV9JRExFU1QpLAorCS5pZGxlc3RfbWFzawk9IE9NQVAzNDMwX1NUX0NPUkVfQ0xLX01BU0ssCisJLm1heF9tdWx0aXBsaWVyID0gT01BUDNfTUFYX0RQTExfTVVMVCwKKwkubWluX2RpdmlkZXIJPSAxLAorCS5tYXhfZGl2aWRlcgk9IE9NQVAzX01BWF9EUExMX0RJViwKKwkucmF0ZV90b2xlcmFuY2UgPSBERUZBVUxUX0RQTExfUkFURV9UT0xFUkFOQ0UKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGRwbGwzX2NrID0geworCS5uYW1lCQk9ICJkcGxsM19jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmc3lzX2NrLAorCS5kcGxsX2RhdGEJPSAmZHBsbDNfZGQsCisJLnJvdW5kX3JhdGUJPSAmb21hcDJfZHBsbF9yb3VuZF9yYXRlLAorCS5jbGtkbV9uYW1lCT0gImRwbGwzX2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZvbWFwM19kcGxsX3JlY2FsYywKK307CisKKy8qCisgKiBUaGlzIHZpcnR1YWwgY2xvY2sgcHJvdmlkZXMgdGhlIENMS09VVFgyIG91dHB1dCBmcm9tIHRoZSBEUExMIGlmIHRoZQorICogRFBMTCBpc24ndCBieXBhc3NlZAorICovCitzdGF0aWMgc3RydWN0IGNsayBkcGxsM194Ml9jayA9IHsKKwkubmFtZQkJPSAiZHBsbDNfeDJfY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5wYXJlbnQJCT0gJmRwbGwzX2NrLAorCS5jbGtkbV9uYW1lCT0gImRwbGwzX2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZvbWFwM19jbGtvdXR4Ml9yZWNhbGMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGRpdjMxX2RwbGwzX3JhdGVzW10gPSB7CisJeyAuZGl2ID0gMSwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB8IERFRkFVTFRfUkFURSB9LAorCXsgLmRpdiA9IDIsIC52YWwgPSAyLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfSwKKwl7IC5kaXYgPSAzLCAudmFsID0gMywgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCisJeyAuZGl2ID0gNCwgLnZhbCA9IDQsIC5mbGFncyA9IFJBVEVfSU5fMzQzMEVTMiB9LAorCXsgLmRpdiA9IDUsIC52YWwgPSA1LCAuZmxhZ3MgPSBSQVRFX0lOXzM0MzBFUzIgfSwKKwl7IC5kaXYgPSA2LCAudmFsID0gNiwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCisJeyAuZGl2ID0gNywgLnZhbCA9IDcsIC5mbGFncyA9IFJBVEVfSU5fMzQzMEVTMiB9LAorCXsgLmRpdiA9IDgsIC52YWwgPSA4LCAuZmxhZ3MgPSBSQVRFX0lOXzM0MzBFUzIgfSwKKwl7IC5kaXYgPSA5LCAudmFsID0gOSwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCisJeyAuZGl2ID0gMTAsIC52YWwgPSAxMCwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCisJeyAuZGl2ID0gMTEsIC52YWwgPSAxMSwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCisJeyAuZGl2ID0gMTIsIC52YWwgPSAxMiwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCisJeyAuZGl2ID0gMTMsIC52YWwgPSAxMywgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCisJeyAuZGl2ID0gMTQsIC52YWwgPSAxNCwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCisJeyAuZGl2ID0gMTUsIC52YWwgPSAxNSwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCisJeyAuZGl2ID0gMTYsIC52YWwgPSAxNiwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCisJeyAuZGl2ID0gMTcsIC52YWwgPSAxNywgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCisJeyAuZGl2ID0gMTgsIC52YWwgPSAxOCwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCisJeyAuZGl2ID0gMTksIC52YWwgPSAxOSwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCisJeyAuZGl2ID0gMjAsIC52YWwgPSAyMCwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCisJeyAuZGl2ID0gMjEsIC52YWwgPSAyMSwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCisJeyAuZGl2ID0gMjIsIC52YWwgPSAyMiwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCisJeyAuZGl2ID0gMjMsIC52YWwgPSAyMywgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCisJeyAuZGl2ID0gMjQsIC52YWwgPSAyNCwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCisJeyAuZGl2ID0gMjUsIC52YWwgPSAyNSwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCisJeyAuZGl2ID0gMjYsIC52YWwgPSAyNiwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCisJeyAuZGl2ID0gMjcsIC52YWwgPSAyNywgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCisJeyAuZGl2ID0gMjgsIC52YWwgPSAyOCwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCisJeyAuZGl2ID0gMjksIC52YWwgPSAyOSwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCisJeyAuZGl2ID0gMzAsIC52YWwgPSAzMCwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCisJeyAuZGl2ID0gMzEsIC52YWwgPSAzMSwgLmZsYWdzID0gUkFURV9JTl8zNDMwRVMyIH0sCisJeyAuZGl2ID0gMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgZGl2MzFfZHBsbDNtMl9jbGtzZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmZHBsbDNfY2ssIC5yYXRlcyA9IGRpdjMxX2RwbGwzX3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9Cit9OworCisvKiBEUExMMyBvdXRwdXQgTTIgLSBwcmltYXJ5IGNvbnRyb2wgcG9pbnQgZm9yIENPUkUgc3BlZWQgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIGRwbGwzX20yX2NrID0geworCS5uYW1lCQk9ICJkcGxsM19tMl9jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmZHBsbDNfY2ssCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihQTExfTU9ELCBDTV9DTEtTRUwxKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9DT1JFX0RQTExfQ0xLT1VUX0RJVl9NQVNLLAorCS5jbGtzZWwJCT0gZGl2MzFfZHBsbDNtMl9jbGtzZWwsCisJLmNsa2RtX25hbWUJPSAiZHBsbDNfY2xrZG0iLAorCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9yb3VuZF9yYXRlLAorCS5zZXRfcmF0ZQk9ICZvbWFwM19jb3JlX2RwbGxfbTJfc2V0X3JhdGUsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNvcmVfY2sgPSB7CisJLm5hbWUJCT0gImNvcmVfY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5wYXJlbnQJCT0gJmRwbGwzX20yX2NrLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkcGxsM19tMngyX2NrID0geworCS5uYW1lCQk9ICJkcGxsM19tMngyX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucGFyZW50CQk9ICZkcGxsM19tMl9jaywKKwkuY2xrZG1fbmFtZQk9ICJkcGxsM19jbGtkbSIsCisJLnJlY2FsYwkJPSAmb21hcDNfY2xrb3V0eDJfcmVjYWxjLAorfTsKKworLyogVGhlIFBXUkROIGJpdCBpcyBhcHBhcmVudGx5IG9ubHkgYXZhaWxhYmxlIG9uIDM0MzBFUzIgYW5kIGFib3ZlICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBkaXYxNl9kcGxsM19jbGtzZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmZHBsbDNfY2ssIC5yYXRlcyA9IGRpdjE2X2RwbGxfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0KK307CisKKy8qIFRoaXMgdmlydHVhbCBjbG9jayBpcyB0aGUgc291cmNlIGZvciBkcGxsM19tM3gyX2NrICovCitzdGF0aWMgc3RydWN0IGNsayBkcGxsM19tM19jayA9IHsKKwkubmFtZQkJPSAiZHBsbDNfbTNfY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5wYXJlbnQJCT0gJmRwbGwzX2NrLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfRU1VX01PRCwgQ01fQ0xLU0VMMSksCisJLmNsa3NlbF9tYXNrCT0gT01BUDM0MzBfRElWX0RQTEwzX01BU0ssCisJLmNsa3NlbAkJPSBkaXYxNl9kcGxsM19jbGtzZWwsCisJLmNsa2RtX25hbWUJPSAiZHBsbDNfY2xrZG0iLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCit9OworCisvKiBUaGUgUFdSRE4gYml0IGlzIGFwcGFyZW50bHkgb25seSBhdmFpbGFibGUgb24gMzQzMEVTMiBhbmQgYWJvdmUgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIGRwbGwzX20zeDJfY2sgPSB7CisJLm5hbWUJCT0gImRwbGwzX20zeDJfY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmZHBsbDNfbTNfY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfUFdSRE5fRU1VX0NPUkVfU0hJRlQsCisJLmZsYWdzCQk9IElOVkVSVF9FTkFCTEUsCisJLmNsa2RtX25hbWUJPSAiZHBsbDNfY2xrZG0iLAorCS5yZWNhbGMJCT0gJm9tYXAzX2Nsa291dHgyX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGVtdV9jb3JlX2Fsd29uX2NrID0geworCS5uYW1lCQk9ICJlbXVfY29yZV9hbHdvbl9jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmZHBsbDNfbTN4Ml9jaywKKwkuY2xrZG1fbmFtZQk9ICJkcGxsM19jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKKy8qIERQTEw0ICovCisvKiBTdXBwbGllcyA5Nk1IeiwgNTRNaHogVFYgREFDLCBEU1MgZmNsaywgQ0FNIHNlbnNvciBjbG9jaywgZW11bCB0cmFjZSBjbGsgKi8KKy8qIFR5cGU6IERQTEwgKi8KK3N0YXRpYyBzdHJ1Y3QgZHBsbF9kYXRhIGRwbGw0X2RkID0geworCS5tdWx0X2RpdjFfcmVnCT0gT01BUF9DTV9SRUdBRERSKFBMTF9NT0QsIENNX0NMS1NFTDIpLAorCS5tdWx0X21hc2sJPSBPTUFQMzQzMF9QRVJJUEhfRFBMTF9NVUxUX01BU0ssCisJLmRpdjFfbWFzawk9IE9NQVAzNDMwX1BFUklQSF9EUExMX0RJVl9NQVNLLAorCS5jbGtfYnlwYXNzCT0gJnN5c19jaywKKwkuY2xrX3JlZgk9ICZzeXNfY2ssCisJLmZyZXFzZWxfbWFzawk9IE9NQVAzNDMwX1BFUklQSF9EUExMX0ZSRVFTRUxfTUFTSywKKwkuY29udHJvbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQ0xLRU4pLAorCS5lbmFibGVfbWFzawk9IE9NQVAzNDMwX0VOX1BFUklQSF9EUExMX01BU0ssCisJLm1vZGVzCQk9ICgxIDw8IERQTExfTE9XX1BPV0VSX1NUT1ApIHwgKDEgPDwgRFBMTF9MT0NLRUQpLAorCS5hdXRvX3JlY2FsX2JpdAk9IE9NQVAzNDMwX0VOX1BFUklQSF9EUExMX0RSSUZUR1VBUkRfU0hJRlQsCisJLnJlY2FsX2VuX2JpdAk9IE9NQVAzNDMwX1BFUklQSF9EUExMX1JFQ0FMX0VOX1NISUZULAorCS5yZWNhbF9zdF9iaXQJPSBPTUFQMzQzMF9QRVJJUEhfRFBMTF9TVF9TSElGVCwKKwkuYXV0b2lkbGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKFBMTF9NT0QsIENNX0FVVE9JRExFKSwKKwkuYXV0b2lkbGVfbWFzawk9IE9NQVAzNDMwX0FVVE9fUEVSSVBIX0RQTExfTUFTSywKKwkuaWRsZXN0X3JlZwk9IE9NQVBfQ01fUkVHQUREUihQTExfTU9ELCBDTV9JRExFU1QpLAorCS5pZGxlc3RfbWFzawk9IE9NQVAzNDMwX1NUX1BFUklQSF9DTEtfTUFTSywKKwkubWF4X211bHRpcGxpZXIgPSBPTUFQM19NQVhfRFBMTF9NVUxULAorCS5taW5fZGl2aWRlcgk9IDEsCisJLm1heF9kaXZpZGVyCT0gT01BUDNfTUFYX0RQTExfRElWLAorCS5yYXRlX3RvbGVyYW5jZSA9IERFRkFVTFRfRFBMTF9SQVRFX1RPTEVSQU5DRQorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZHBsbDRfY2sgPSB7CisJLm5hbWUJCT0gImRwbGw0X2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfbm9uY29yZV9kcGxsX29wcywKKwkucGFyZW50CQk9ICZzeXNfY2ssCisJLmRwbGxfZGF0YQk9ICZkcGxsNF9kZCwKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9kcGxsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gJm9tYXAzX2RwbGw0X3NldF9yYXRlLAorCS5jbGtkbV9uYW1lCT0gImRwbGw0X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZvbWFwM19kcGxsX3JlY2FsYywKK307CisKKy8qCisgKiBUaGlzIHZpcnR1YWwgY2xvY2sgcHJvdmlkZXMgdGhlIENMS09VVFgyIG91dHB1dCBmcm9tIHRoZSBEUExMIGlmIHRoZQorICogRFBMTCBpc24ndCBieXBhc3NlZCAtLQorICogWFhYIGRvZXMgdGhpcyBzZXJ2ZSBhbnkgZG93bnN0cmVhbSBjbG9ja3M/CisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIGRwbGw0X3gyX2NrID0geworCS5uYW1lCQk9ICJkcGxsNF94Ml9jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmZHBsbDRfY2ssCisJLmNsa2RtX25hbWUJPSAiZHBsbDRfY2xrZG0iLAorCS5yZWNhbGMJCT0gJm9tYXAzX2Nsa291dHgyX3JlY2FsYywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGRpdjE2X2RwbGw0X2Nsa3NlbFtdID0geworCXsgLnBhcmVudCA9ICZkcGxsNF9jaywgLnJhdGVzID0gZGl2MTZfZHBsbF9yYXRlcyB9LAorCXsgLnBhcmVudCA9IE5VTEwgfQorfTsKKworLyogVGhpcyB2aXJ0dWFsIGNsb2NrIGlzIHRoZSBzb3VyY2UgZm9yIGRwbGw0X20yeDJfY2sgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIGRwbGw0X20yX2NrID0geworCS5uYW1lCQk9ICJkcGxsNF9tMl9jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmZHBsbDRfY2ssCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihQTExfTU9ELCBPTUFQMzQzMF9DTV9DTEtTRUwzKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9ESVZfOTZNX01BU0ssCisJLmNsa3NlbAkJPSBkaXYxNl9kcGxsNF9jbGtzZWwsCisJLmNsa2RtX25hbWUJPSAiZHBsbDRfY2xrZG0iLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCit9OworCisvKiBUaGUgUFdSRE4gYml0IGlzIGFwcGFyZW50bHkgb25seSBhdmFpbGFibGUgb24gMzQzMEVTMiBhbmQgYWJvdmUgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIGRwbGw0X20yeDJfY2sgPSB7CisJLm5hbWUJCT0gImRwbGw0X20yeDJfY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmZHBsbDRfbTJfY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfUFdSRE5fOTZNX1NISUZULAorCS5mbGFncwkJPSBJTlZFUlRfRU5BQkxFLAorCS5jbGtkbV9uYW1lCT0gImRwbGw0X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZvbWFwM19jbGtvdXR4Ml9yZWNhbGMsCit9OworCisvKgorICogRFBMTDQgZ2VuZXJhdGVzIERQTEw0X00yWDJfQ0xLIHdoaWNoIGlzIHRoZW4gcm91dGVkIGludG8gdGhlIFBSTSBhcworICogUFJNXzk2TV9BTFdPTl8oRilDTEsuICBUd28gY2xvY2tzIHRoZW4gZW1lcmdlIGZyb20gdGhlIFBSTToKKyAqIDk2TV9BTFdPTl9GQ0xLIChjYWxsZWQgIm9tYXBfOTZtX2Fsd29uX2ZjayIgYmVsb3cpIGFuZAorICogQ01fOTZLXyhGKUNMSy4KKyAqLworc3RhdGljIHN0cnVjdCBjbGsgb21hcF85Nm1fYWx3b25fZmNrID0geworCS5uYW1lCQk9ICJvbWFwXzk2bV9hbHdvbl9mY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5wYXJlbnQJCT0gJmRwbGw0X20yeDJfY2ssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNtXzk2bV9mY2sgPSB7CisJLm5hbWUJCT0gImNtXzk2bV9mY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5wYXJlbnQJCT0gJm9tYXBfOTZtX2Fsd29uX2ZjaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBvbWFwXzk2bV9kcGxsX3JhdGVzW10gPSB7CisJeyAuZGl2ID0gMSwgLnZhbCA9IDAsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB8IERFRkFVTFRfUkFURSB9LAorCXsgLmRpdiA9IDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBvbWFwXzk2bV9zeXNfcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8zNDNYIHwgREVGQVVMVF9SQVRFIH0sCisJeyAuZGl2ID0gMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBvbWFwXzk2bV9mY2tfY2xrc2VsW10gPSB7CisJeyAucGFyZW50ID0gJmNtXzk2bV9mY2ssIC5yYXRlcyA9IG9tYXBfOTZtX2RwbGxfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmc3lzX2NrLAkgLnJhdGVzID0gb21hcF85Nm1fc3lzX3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IGNsayBvbWFwXzk2bV9mY2sgPSB7CisJLm5hbWUJCT0gIm9tYXBfOTZtX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmc3lzX2NrLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQ0xLU0VMMSksCisJLmNsa3NlbF9tYXNrCT0gT01BUDM0MzBfU09VUkNFXzk2TV9NQVNLLAorCS5jbGtzZWwJCT0gb21hcF85Nm1fZmNrX2Nsa3NlbCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorfTsKKworLyogVGhpcyB2aXJ0dWFsIGNsb2NrIGlzIHRoZSBzb3VyY2UgZm9yIGRwbGw0X20zeDJfY2sgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIGRwbGw0X20zX2NrID0geworCS5uYW1lCQk9ICJkcGxsNF9tM19jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmZHBsbDRfY2ssCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9EU1NfTU9ELCBDTV9DTEtTRUwpLAorCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9UVl9NQVNLLAorCS5jbGtzZWwJCT0gZGl2MTZfZHBsbDRfY2xrc2VsLAorCS5jbGtkbV9uYW1lCT0gImRwbGw0X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorfTsKKworLyogVGhlIFBXUkROIGJpdCBpcyBhcHBhcmVudGx5IG9ubHkgYXZhaWxhYmxlIG9uIDM0MzBFUzIgYW5kIGFib3ZlICovCitzdGF0aWMgc3RydWN0IGNsayBkcGxsNF9tM3gyX2NrID0geworCS5uYW1lCQk9ICJkcGxsNF9tM3gyX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmRwbGw0X20zX2NrLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfUFdSRE5fVFZfU0hJRlQsCisJLmZsYWdzCQk9IElOVkVSVF9FTkFCTEUsCisJLmNsa2RtX25hbWUJPSAiZHBsbDRfY2xrZG0iLAorCS5yZWNhbGMJCT0gJm9tYXAzX2Nsa291dHgyX3JlY2FsYywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgb21hcF81NG1fZDRtM3gyX3JhdGVzW10gPSB7CisJeyAuZGl2ID0gMSwgLnZhbCA9IDAsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB8IERFRkFVTFRfUkFURSB9LAorCXsgLmRpdiA9IDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBvbWFwXzU0bV9hbHRfcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8zNDNYIHwgREVGQVVMVF9SQVRFIH0sCisJeyAuZGl2ID0gMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBvbWFwXzU0bV9jbGtzZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmZHBsbDRfbTN4Ml9jaywgLnJhdGVzID0gb21hcF81NG1fZDRtM3gyX3JhdGVzIH0sCisJeyAucGFyZW50ID0gJnN5c19hbHRjbGssICAgIC5yYXRlcyA9IG9tYXBfNTRtX2FsdF9yYXRlcyB9LAorCXsgLnBhcmVudCA9IE5VTEwgfQorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgb21hcF81NG1fZmNrID0geworCS5uYW1lCQk9ICJvbWFwXzU0bV9mY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQ0xLU0VMMSksCisJLmNsa3NlbF9tYXNrCT0gT01BUDM0MzBfU09VUkNFXzU0TV9NQVNLLAorCS5jbGtzZWwJCT0gb21hcF81NG1fY2xrc2VsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIG9tYXBfNDhtX2NtOTZtX3JhdGVzW10gPSB7CisJeyAuZGl2ID0gMiwgLnZhbCA9IDAsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB8IERFRkFVTFRfUkFURSB9LAorCXsgLmRpdiA9IDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBvbWFwXzQ4bV9hbHRfcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8zNDNYIHwgREVGQVVMVF9SQVRFIH0sCisJeyAuZGl2ID0gMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBvbWFwXzQ4bV9jbGtzZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmY21fOTZtX2ZjaywgLnJhdGVzID0gb21hcF80OG1fY205Nm1fcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmc3lzX2FsdGNsaywgLnJhdGVzID0gb21hcF80OG1fYWx0X3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IGNsayBvbWFwXzQ4bV9mY2sgPSB7CisJLm5hbWUJCT0gIm9tYXBfNDhtX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihQTExfTU9ELCBDTV9DTEtTRUwxKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9TT1VSQ0VfNDhNX01BU0ssCisJLmNsa3NlbAkJPSBvbWFwXzQ4bV9jbGtzZWwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG9tYXBfMTJtX2ZjayA9IHsKKwkubmFtZQkJPSAib21hcF8xMm1fZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucGFyZW50CQk9ICZvbWFwXzQ4bV9mY2ssCisJLmZpeGVkX2Rpdgk9IDQsCisJLnJlY2FsYwkJPSAmb21hcDJfZml4ZWRfZGl2aXNvcl9yZWNhbGMsCit9OworCisvKiBUaGlzIHZpcnN0dWFsIGNsb2NrIGlzIHRoZSBzb3VyY2UgZm9yIGRwbGw0X200eDJfY2sgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIGRwbGw0X200X2NrID0geworCS5uYW1lCQk9ICJkcGxsNF9tNF9jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmZHBsbDRfY2ssCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9EU1NfTU9ELCBDTV9DTEtTRUwpLAorCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9EU1MxX01BU0ssCisJLmNsa3NlbAkJPSBkaXYxNl9kcGxsNF9jbGtzZWwsCisJLmNsa2RtX25hbWUJPSAiZHBsbDRfY2xrZG0iLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZSwKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKK307CisKKy8qIFRoZSBQV1JETiBiaXQgaXMgYXBwYXJlbnRseSBvbmx5IGF2YWlsYWJsZSBvbiAzNDMwRVMyIGFuZCBhYm92ZSAqLworc3RhdGljIHN0cnVjdCBjbGsgZHBsbDRfbTR4Ml9jayA9IHsKKwkubmFtZQkJPSAiZHBsbDRfbTR4Ml9jayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZkcGxsNF9tNF9jaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihQTExfTU9ELCBDTV9DTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9QV1JETl9DQU1fU0hJRlQsCisJLmZsYWdzCQk9IElOVkVSVF9FTkFCTEUsCisJLmNsa2RtX25hbWUJPSAiZHBsbDRfY2xrZG0iLAorCS5yZWNhbGMJCT0gJm9tYXAzX2Nsa291dHgyX3JlY2FsYywKK307CisKKy8qIFRoaXMgdmlydHVhbCBjbG9jayBpcyB0aGUgc291cmNlIGZvciBkcGxsNF9tNXgyX2NrICovCitzdGF0aWMgc3RydWN0IGNsayBkcGxsNF9tNV9jayA9IHsKKwkubmFtZQkJPSAiZHBsbDRfbTVfY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5wYXJlbnQJCT0gJmRwbGw0X2NrLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfQ0FNX01PRCwgQ01fQ0xLU0VMKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9DTEtTRUxfQ0FNX01BU0ssCisJLmNsa3NlbAkJPSBkaXYxNl9kcGxsNF9jbGtzZWwsCisJLmNsa2RtX25hbWUJPSAiZHBsbDRfY2xrZG0iLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCit9OworCisvKiBUaGUgUFdSRE4gYml0IGlzIGFwcGFyZW50bHkgb25seSBhdmFpbGFibGUgb24gMzQzMEVTMiBhbmQgYWJvdmUgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIGRwbGw0X201eDJfY2sgPSB7CisJLm5hbWUJCT0gImRwbGw0X201eDJfY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmZHBsbDRfbTVfY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfUFdSRE5fQ0FNX1NISUZULAorCS5mbGFncwkJPSBJTlZFUlRfRU5BQkxFLAorCS5jbGtkbV9uYW1lCT0gImRwbGw0X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZvbWFwM19jbGtvdXR4Ml9yZWNhbGMsCit9OworCisvKiBUaGlzIHZpcnR1YWwgY2xvY2sgaXMgdGhlIHNvdXJjZSBmb3IgZHBsbDRfbTZ4Ml9jayAqLworc3RhdGljIHN0cnVjdCBjbGsgZHBsbDRfbTZfY2sgPSB7CisJLm5hbWUJCT0gImRwbGw0X202X2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucGFyZW50CQk9ICZkcGxsNF9jaywKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX0VNVV9NT0QsIENNX0NMS1NFTDEpLAorCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0RJVl9EUExMNF9NQVNLLAorCS5jbGtzZWwJCT0gZGl2MTZfZHBsbDRfY2xrc2VsLAorCS5jbGtkbV9uYW1lCT0gImRwbGw0X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorfTsKKworLyogVGhlIFBXUkROIGJpdCBpcyBhcHBhcmVudGx5IG9ubHkgYXZhaWxhYmxlIG9uIDM0MzBFUzIgYW5kIGFib3ZlICovCitzdGF0aWMgc3RydWN0IGNsayBkcGxsNF9tNngyX2NrID0geworCS5uYW1lCQk9ICJkcGxsNF9tNngyX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmRwbGw0X202X2NrLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgQ01fQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfUFdSRE5fRU1VX1BFUklQSF9TSElGVCwKKwkuZmxhZ3MJCT0gSU5WRVJUX0VOQUJMRSwKKwkuY2xrZG1fbmFtZQk9ICJkcGxsNF9jbGtkbSIsCisJLnJlY2FsYwkJPSAmb21hcDNfY2xrb3V0eDJfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZW11X3Blcl9hbHdvbl9jayA9IHsKKwkubmFtZQkJPSAiZW11X3Blcl9hbHdvbl9jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmZHBsbDRfbTZ4Ml9jaywKKwkuY2xrZG1fbmFtZQk9ICJkcGxsNF9jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKKy8qIERQTEw1ICovCisvKiBTdXBwbGllcyAxMjBNSHogY2xvY2ssIFVTSU0gc291cmNlIGNsb2NrICovCisvKiBUeXBlOiBEUExMICovCisvKiAzNDMwRVMyIG9ubHkgKi8KK3N0YXRpYyBzdHJ1Y3QgZHBsbF9kYXRhIGRwbGw1X2RkID0geworCS5tdWx0X2RpdjFfcmVnCT0gT01BUF9DTV9SRUdBRERSKFBMTF9NT0QsIE9NQVAzNDMwRVMyX0NNX0NMS1NFTDQpLAorCS5tdWx0X21hc2sJPSBPTUFQMzQzMEVTMl9QRVJJUEgyX0RQTExfTVVMVF9NQVNLLAorCS5kaXYxX21hc2sJPSBPTUFQMzQzMEVTMl9QRVJJUEgyX0RQTExfRElWX01BU0ssCisJLmNsa19ieXBhc3MJPSAmc3lzX2NrLAorCS5jbGtfcmVmCT0gJnN5c19jaywKKwkuZnJlcXNlbF9tYXNrCT0gT01BUDM0MzBFUzJfUEVSSVBIMl9EUExMX0ZSRVFTRUxfTUFTSywKKwkuY29udHJvbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgT01BUDM0MzBFUzJfQ01fQ0xLRU4yKSwKKwkuZW5hYmxlX21hc2sJPSBPTUFQMzQzMEVTMl9FTl9QRVJJUEgyX0RQTExfTUFTSywKKwkubW9kZXMJCT0gKDEgPDwgRFBMTF9MT1dfUE9XRVJfU1RPUCkgfCAoMSA8PCBEUExMX0xPQ0tFRCksCisJLmF1dG9fcmVjYWxfYml0CT0gT01BUDM0MzBFUzJfRU5fUEVSSVBIMl9EUExMX0RSSUZUR1VBUkRfU0hJRlQsCisJLnJlY2FsX2VuX2JpdAk9IE9NQVAzNDMwRVMyX1NORF9QRVJJUEhfRFBMTF9SRUNBTF9FTl9TSElGVCwKKwkucmVjYWxfc3RfYml0CT0gT01BUDM0MzBFUzJfU05EX1BFUklQSF9EUExMX1NUX1NISUZULAorCS5hdXRvaWRsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgT01BUDM0MzBFUzJfQ01fQVVUT0lETEUyX1BMTCksCisJLmF1dG9pZGxlX21hc2sJPSBPTUFQMzQzMEVTMl9BVVRPX1BFUklQSDJfRFBMTF9NQVNLLAorCS5pZGxlc3RfcmVnCT0gT01BUF9DTV9SRUdBRERSKFBMTF9NT0QsIENNX0lETEVTVDIpLAorCS5pZGxlc3RfbWFzawk9IE9NQVAzNDMwRVMyX1NUX1BFUklQSDJfQ0xLX01BU0ssCisJLm1heF9tdWx0aXBsaWVyID0gT01BUDNfTUFYX0RQTExfTVVMVCwKKwkubWluX2RpdmlkZXIJPSAxLAorCS5tYXhfZGl2aWRlcgk9IE9NQVAzX01BWF9EUExMX0RJViwKKwkucmF0ZV90b2xlcmFuY2UgPSBERUZBVUxUX0RQTExfUkFURV9UT0xFUkFOQ0UKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGRwbGw1X2NrID0geworCS5uYW1lCQk9ICJkcGxsNV9jayIsCisJLm9wcwkJPSAmY2xrb3BzX25vbmNvcmVfZHBsbF9vcHMsCisJLnBhcmVudAkJPSAmc3lzX2NrLAorCS5kcGxsX2RhdGEJPSAmZHBsbDVfZGQsCisJLnJvdW5kX3JhdGUJPSAmb21hcDJfZHBsbF9yb3VuZF9yYXRlLAorCS5zZXRfcmF0ZQk9ICZvbWFwM19ub25jb3JlX2RwbGxfc2V0X3JhdGUsCisJLmNsa2RtX25hbWUJPSAiZHBsbDVfY2xrZG0iLAorCS5yZWNhbGMJCT0gJm9tYXAzX2RwbGxfcmVjYWxjLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgZGl2MTZfZHBsbDVfY2xrc2VsW10gPSB7CisJeyAucGFyZW50ID0gJmRwbGw1X2NrLCAucmF0ZXMgPSBkaXYxNl9kcGxsX3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IGNsayBkcGxsNV9tMl9jayA9IHsKKwkubmFtZQkJPSAiZHBsbDVfbTJfY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5wYXJlbnQJCT0gJmRwbGw1X2NrLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoUExMX01PRCwgT01BUDM0MzBFUzJfQ01fQ0xLU0VMNSksCisJLmNsa3NlbF9tYXNrCT0gT01BUDM0MzBFUzJfRElWXzEyME1fTUFTSywKKwkuY2xrc2VsCQk9IGRpdjE2X2RwbGw1X2Nsa3NlbCwKKwkuY2xrZG1fbmFtZQk9ICJkcGxsNV9jbGtkbSIsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKK307CisKKy8qIENNIEVYVEVSTkFMIENMT0NLIE9VVFBVVFMgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBjbGtvdXQyX3NyY19jb3JlX3JhdGVzW10gPSB7CisJeyAuZGl2ID0gMSwgLnZhbCA9IDAsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB8IERFRkFVTFRfUkFURSB9LAorCXsgLmRpdiA9IDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBjbGtvdXQyX3NyY19zeXNfcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8zNDNYIHwgREVGQVVMVF9SQVRFIH0sCisJeyAuZGl2ID0gMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGNsa291dDJfc3JjXzk2bV9yYXRlc1tdID0geworCXsgLmRpdiA9IDEsIC52YWwgPSAyLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfCBERUZBVUxUX1JBVEUgfSwKKwl7IC5kaXYgPSAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgY2xrb3V0Ml9zcmNfNTRtX3JhdGVzW10gPSB7CisJeyAuZGl2ID0gMSwgLnZhbCA9IDMsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB8IERFRkFVTFRfUkFURSB9LAorCXsgLmRpdiA9IDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgY2xrb3V0Ml9zcmNfY2xrc2VsW10gPSB7CisJeyAucGFyZW50ID0gJmNvcmVfY2ssCQkucmF0ZXMgPSBjbGtvdXQyX3NyY19jb3JlX3JhdGVzIH0sCisJeyAucGFyZW50ID0gJnN5c19jaywJCS5yYXRlcyA9IGNsa291dDJfc3JjX3N5c19yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZjbV85Nm1fZmNrLAkucmF0ZXMgPSBjbGtvdXQyX3NyY185Nm1fcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmb21hcF81NG1fZmNrLAkucmF0ZXMgPSBjbGtvdXQyX3NyY181NG1fcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa291dDJfc3JjX2NrID0geworCS5uYW1lCQk9ICJjbGtvdXQyX3NyY19jayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuZW5hYmxlX3JlZwk9IE9NQVAzNDMwX0NNX0NMS09VVF9DVFJMLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfQ0xLT1VUMl9FTl9TSElGVCwKKwkuY2xrc2VsX3JlZwk9IE9NQVAzNDMwX0NNX0NMS09VVF9DVFJMLAorCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS09VVDJTT1VSQ0VfTUFTSywKKwkuY2xrc2VsCQk9IGNsa291dDJfc3JjX2Nsa3NlbCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBzeXNfY2xrb3V0Ml9yYXRlc1tdID0geworCXsgLmRpdiA9IDEsIC52YWwgPSAwLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfCBERUZBVUxUX1JBVEUgfSwKKwl7IC5kaXYgPSAyLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8zNDNYIH0sCisJeyAuZGl2ID0gNCwgLnZhbCA9IDIsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAorCXsgLmRpdiA9IDgsIC52YWwgPSAzLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfSwKKwl7IC5kaXYgPSAxNiwgLnZhbCA9IDQsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAorCXsgLmRpdiA9IDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIHN5c19jbGtvdXQyX2Nsa3NlbFtdID0geworCXsgLnBhcmVudCA9ICZjbGtvdXQyX3NyY19jaywgLnJhdGVzID0gc3lzX2Nsa291dDJfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBzeXNfY2xrb3V0MiA9IHsKKwkubmFtZQkJPSAic3lzX2Nsa291dDIiLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQMzQzMF9DTV9DTEtPVVRfQ1RSTCwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9DTEtPVVQyX0RJVl9NQVNLLAorCS5jbGtzZWwJCT0gc3lzX2Nsa291dDJfY2xrc2VsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCit9OworCisvKiBDTSBPVVRQVVQgQ0xPQ0tTICovCisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNvcmV4Ml9mY2sgPSB7CisJLm5hbWUJCT0gImNvcmV4Ml9mY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5wYXJlbnQJCT0gJmRwbGwzX20yeDJfY2ssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKKy8qIERQTEwgcG93ZXIgZG9tYWluIGNsb2NrIGNvbnRyb2xzICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgZGl2NF9yYXRlc1tdID0geworCXsgLmRpdiA9IDEsIC52YWwgPSAxLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfCBERUZBVUxUX1JBVEUgfSwKKwl7IC5kaXYgPSAyLCAudmFsID0gMiwgLmZsYWdzID0gUkFURV9JTl8zNDNYIH0sCisJeyAuZGl2ID0gNCwgLnZhbCA9IDQsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAorCXsgLmRpdiA9IDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgZGl2NF9jb3JlX2Nsa3NlbFtdID0geworCXsgLnBhcmVudCA9ICZjb3JlX2NrLCAucmF0ZXMgPSBkaXY0X3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9Cit9OworCisvKgorICogUkVWSVNJVDogQXJlIHRoZXNlIGluIERQTEwgcG93ZXIgZG9tYWluIG9yIENNIHBvd2VyIGRvbWFpbj8gZG9jcworICogbWF5IGJlIGluY29uc2lzdGVudCBoZXJlPworICovCitzdGF0aWMgc3RydWN0IGNsayBkcGxsMV9mY2sgPSB7CisJLm5hbWUJCT0gImRwbGwxX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmY29yZV9jaywKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKE1QVV9NT0QsIE9NQVAzNDMwX0NNX0NMS1NFTDFfUExMKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9NUFVfQ0xLX1NSQ19NQVNLLAorCS5jbGtzZWwJCT0gZGl2NF9jb3JlX2Nsa3NlbCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbXB1X2NrID0geworCS5uYW1lCQk9ICJtcHVfY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5wYXJlbnQJCT0gJmRwbGwxX3gybTJfY2ssCisJLmNsa2RtX25hbWUJPSAibXB1X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworLyogYXJtX2ZjayBpcyBkaXZpZGVkIGJ5IHR3byB3aGVuIERQTEwxIGxvY2tlZDsgb3RoZXJ3aXNlLCBwYXNzdGhyb3VnaCBtcHVfY2sgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgYXJtX2Zja19yYXRlc1tdID0geworCXsgLmRpdiA9IDEsIC52YWwgPSAwLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfCBERUZBVUxUX1JBVEUgfSwKKwl7IC5kaXYgPSAyLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8zNDNYIH0sCisJeyAuZGl2ID0gMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgYXJtX2Zja19jbGtzZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmbXB1X2NrLCAucmF0ZXMgPSBhcm1fZmNrX3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IGNsayBhcm1fZmNrID0geworCS5uYW1lCQk9ICJhcm1fZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucGFyZW50CQk9ICZtcHVfY2ssCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihNUFVfTU9ELCBPTUFQMzQzMF9DTV9JRExFU1RfUExMKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9TVF9NUFVfQ0xLX01BU0ssCisJLmNsa3NlbAkJPSBhcm1fZmNrX2Nsa3NlbCwKKwkuY2xrZG1fbmFtZQk9ICJtcHVfY2xrZG0iLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCit9OworCisvKiBYWFggV2hhdCBhYm91dCBuZW9uX2Nsa2RtID8gKi8KKworLyoKKyAqIFJFVklTSVQ6IFRoaXMgY2xvY2sgaXMgbmV2ZXIgc3BlY2lmaWNhbGx5IGRlZmluZWQgaW4gdGhlIDM0MzAgVFJNLAorICogYWx0aG91Z2ggaXQgaXMgcmVmZXJlbmNlZCAtIHNvIHRoaXMgaXMgYSBndWVzcworICovCitzdGF0aWMgc3RydWN0IGNsayBlbXVfbXB1X2Fsd29uX2NrID0geworCS5uYW1lCQk9ICJlbXVfbXB1X2Fsd29uX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucGFyZW50CQk9ICZtcHVfY2ssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGRwbGwyX2ZjayA9IHsKKwkubmFtZQkJPSAiZHBsbDJfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucGFyZW50CQk9ICZjb3JlX2NrLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfSVZBMl9NT0QsIE9NQVAzNDMwX0NNX0NMS1NFTDFfUExMKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9JVkEyX0NMS19TUkNfTUFTSywKKwkuY2xrc2VsCQk9IGRpdjRfY29yZV9jbGtzZWwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGl2YTJfY2sgPSB7CisJLm5hbWUJCT0gIml2YTJfY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmZHBsbDJfbTJfY2ssCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9JVkEyX01PRCwgQ01fRkNMS0VOKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0NNX0ZDTEtFTl9JVkEyX0VOX0lWQTJfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAiaXZhMl9jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKKy8qIENvbW1vbiBpbnRlcmZhY2UgY2xvY2tzICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGRpdjJfY29yZV9jbGtzZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmY29yZV9jaywgLnJhdGVzID0gZGl2Ml9yYXRlcyB9LAorCXsgLnBhcmVudCA9IE5VTEwgfQorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbDNfaWNrID0geworCS5uYW1lCQk9ICJsM19pY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5wYXJlbnQJCT0gJmNvcmVfY2ssCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fQ0xLU0VMKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9DTEtTRUxfTDNfTUFTSywKKwkuY2xrc2VsCQk9IGRpdjJfY29yZV9jbGtzZWwsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sM19jbGtkbSIsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGRpdjJfbDNfY2xrc2VsW10gPSB7CisJeyAucGFyZW50ID0gJmwzX2ljaywgLnJhdGVzID0gZGl2Ml9yYXRlcyB9LAorCXsgLnBhcmVudCA9IE5VTEwgfQorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbDRfaWNrID0geworCS5uYW1lCQk9ICJsNF9pY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5wYXJlbnQJCT0gJmwzX2ljaywKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9DTEtTRUwpLAorCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9MNF9NQVNLLAorCS5jbGtzZWwJCT0gZGl2Ml9sM19jbGtzZWwsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgZGl2Ml9sNF9jbGtzZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmbDRfaWNrLCAucmF0ZXMgPSBkaXYyX3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IGNsayBybV9pY2sgPSB7CisJLm5hbWUJCT0gInJtX2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmbDRfaWNrLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoV0tVUF9NT0QsIENNX0NMS1NFTCksCisJLmNsa3NlbF9tYXNrCT0gT01BUDM0MzBfQ0xLU0VMX1JNX01BU0ssCisJLmNsa3NlbAkJPSBkaXYyX2w0X2Nsa3NlbCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorfTsKKworLyogR0ZYIHBvd2VyIGRvbWFpbiAqLworCisvKiBHRlggY2xvY2tzIGFyZSBpbiAzNDMwRVMxIG9ubHkuIDM0MzBFUzIgYW5kIGxhdGVyIHVzZXMgdGhlIFNHWCBpbnN0ZWFkICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGdmeF9sM19jbGtzZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmbDNfaWNrLCAucmF0ZXMgPSBnZnhfbDNfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0KK307CisKKy8qIFZpcnR1YWwgcGFyZW50IGNsb2NrIGZvciBnZnhfbDNfaWNrIGFuZCBnZnhfbDNfZmNrICovCitzdGF0aWMgc3RydWN0IGNsayBnZnhfbDNfY2sgPSB7CisJLm5hbWUJCT0gImdmeF9sM19jayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZsM19pY2ssCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihHRlhfTU9ELCBDTV9JQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUF9FTl9HRlhfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGdmeF9sM19mY2sgPSB7CisJLm5hbWUJCT0gImdmeF9sM19mY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5wYXJlbnQJCT0gJmdmeF9sM19jaywKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKEdGWF9NT0QsIENNX0NMS1NFTCksCisJLmNsa3NlbF9tYXNrCT0gT01BUF9DTEtTRUxfR0ZYX01BU0ssCisJLmNsa3NlbAkJPSBnZnhfbDNfY2xrc2VsLAorCS5jbGtkbV9uYW1lCT0gImdmeF8zNDMwZXMxX2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZ2Z4X2wzX2ljayA9IHsKKwkubmFtZQkJPSAiZ2Z4X2wzX2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmZ2Z4X2wzX2NrLAorCS5jbGtkbV9uYW1lCT0gImdmeF8zNDMwZXMxX2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZ2Z4X2NnMV9jayA9IHsKKwkubmFtZQkJPSAiZ2Z4X2NnMV9jayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZnZnhfbDNfZmNrLCAvKiBSRVZJU0lUOiBjb3JyZWN0PyAqLworCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKEdGWF9NT0QsIENNX0ZDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMEVTMV9FTl8yRF9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJnZnhfMzQzMGVzMV9jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGdmeF9jZzJfY2sgPSB7CisJLm5hbWUJCT0gImdmeF9jZzJfY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmZ2Z4X2wzX2ZjaywgLyogUkVWSVNJVDogY29ycmVjdD8gKi8KKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihHRlhfTU9ELCBDTV9GQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBFUzFfRU5fM0RfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAiZ2Z4XzM0MzBlczFfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCisvKiBTR1ggcG93ZXIgZG9tYWluIC0gMzQzMEVTMiBvbmx5ICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgc2d4X2NvcmVfcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAzLCAudmFsID0gMCwgLmZsYWdzID0gUkFURV9JTl8zNDNYIHwgREVGQVVMVF9SQVRFIH0sCisJeyAuZGl2ID0gNCwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAorCXsgLmRpdiA9IDYsIC52YWwgPSAyLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfSwKKwl7IC5kaXYgPSAwIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIHNneF85Nm1fcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAgLnZhbCA9IDMsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB8IERFRkFVTFRfUkFURSB9LAorCXsgLmRpdiA9IDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIHNneF9jbGtzZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmY29yZV9jaywJIC5yYXRlcyA9IHNneF9jb3JlX3JhdGVzIH0sCisJeyAucGFyZW50ID0gJmNtXzk2bV9mY2ssIC5yYXRlcyA9IHNneF85Nm1fcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBzZ3hfZmNrID0geworCS5uYW1lCQk9ICJzZ3hfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBFUzJfU0dYX01PRCwgQ01fRkNMS0VOKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwRVMyX0NNX0ZDTEtFTl9TR1hfRU5fU0dYX1NISUZULAorCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwRVMyX1NHWF9NT0QsIENNX0NMS1NFTCksCisJLmNsa3NlbF9tYXNrCT0gT01BUDM0MzBFUzJfQ0xLU0VMX1NHWF9NQVNLLAorCS5jbGtzZWwJCT0gc2d4X2Nsa3NlbCwKKwkuY2xrZG1fbmFtZQk9ICJzZ3hfY2xrZG0iLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBzZ3hfaWNrID0geworCS5uYW1lCQk9ICJzZ3hfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmwzX2ljaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMEVTMl9TR1hfTU9ELCBDTV9JQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBFUzJfQ01fSUNMS0VOX1NHWF9FTl9TR1hfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAic2d4X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworLyogQ09SRSBwb3dlciBkb21haW4gKi8KKworc3RhdGljIHN0cnVjdCBjbGsgZDJkXzI2bV9mY2sgPSB7CisJLm5hbWUJCT0gImQyZF8yNm1fZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJnN5c19jaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMEVTMV9FTl9EMkRfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAiZDJkX2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbW9kZW1fZmNrID0geworCS5uYW1lCQk9ICJtb2RlbV9mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmc3lzX2NrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01PREVNX1NISUZULAorCS5jbGtkbV9uYW1lCT0gImQyZF9jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNhZDJkX2ljayA9IHsKKwkubmFtZQkJPSAic2FkMmRfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmwzX2ljaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9TQUQyRF9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJkMmRfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBtYWQyZF9pY2sgPSB7CisJLm5hbWUJCT0gIm1hZDJkX2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZsM19pY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjMpLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fTUFEMkRfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAiZDJkX2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgb21hcDM0M3hfZ3B0X2Nsa3NlbFtdID0geworCXsgLnBhcmVudCA9ICZvbWFwXzMya19mY2ssIC5yYXRlcyA9IGdwdF8zMmtfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmc3lzX2NrLAkgICAucmF0ZXMgPSBncHRfc3lzX3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGdwdDEwX2ZjayA9IHsKKwkubmFtZQkJPSAiZ3B0MTBfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJnN5c19jaywKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQVDEwX1NISUZULAorCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9DTEtTRUwpLAorCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9HUFQxMF9NQVNLLAorCS5jbGtzZWwJCT0gb21hcDM0M3hfZ3B0X2Nsa3NlbCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZ3B0MTFfZmNrID0geworCS5uYW1lCQk9ICJncHQxMV9mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmc3lzX2NrLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BUMTFfU0hJRlQsCisJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0NMS1NFTCksCisJLmNsa3NlbF9tYXNrCT0gT01BUDM0MzBfQ0xLU0VMX0dQVDExX01BU0ssCisJLmNsa3NlbAkJPSBvbWFwMzQzeF9ncHRfY2xrc2VsLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBjcGVmdXNlX2ZjayA9IHsKKwkubmFtZQkJPSAiY3BlZnVzZV9mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5wYXJlbnQJCT0gJnN5c19jaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgT01BUDM0MzBFUzJfQ01fRkNMS0VOMyksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMEVTMl9FTl9DUEVGVVNFX1NISUZULAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB0c19mY2sgPSB7CisJLm5hbWUJCT0gInRzX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLnBhcmVudAkJPSAmb21hcF8zMmtfZmNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBPTUFQMzQzMEVTMl9DTV9GQ0xLRU4zKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwRVMyX0VOX1RTX1NISUZULAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB1c2J0bGxfZmNrID0geworCS5uYW1lCQk9ICJ1c2J0bGxfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkucGFyZW50CQk9ICZkcGxsNV9tMl9jaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgT01BUDM0MzBFUzJfQ01fRkNMS0VOMyksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMEVTMl9FTl9VU0JUTExfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKKy8qIENPUkUgOTZNIEZDTEstZGVyaXZlZCBjbG9ja3MgKi8KKworc3RhdGljIHN0cnVjdCBjbGsgY29yZV85Nm1fZmNrID0geworCS5uYW1lCQk9ICJjb3JlXzk2bV9mY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5wYXJlbnQJCT0gJm9tYXBfOTZtX2ZjaywKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbW1jaHMzX2ZjayA9IHsKKwkubmFtZQkJPSAibW1jaHNfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSAyLAorCS5wYXJlbnQJCT0gJmNvcmVfOTZtX2ZjaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMEVTMl9FTl9NTUMzX1NISUZULAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBtbWNoczJfZmNrID0geworCS5uYW1lCQk9ICJtbWNoc19mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLmlkCQk9IDEsCisJLnBhcmVudAkJPSAmY29yZV85Nm1fZmNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01NQzJfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1zcHJvX2ZjayA9IHsKKwkubmFtZQkJPSAibXNwcm9fZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmNvcmVfOTZtX2ZjaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9NU1BST19TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbW1jaHMxX2ZjayA9IHsKKwkubmFtZQkJPSAibW1jaHNfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmNvcmVfOTZtX2ZjaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9NTUMxX1NISUZULAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBpMmMzX2ZjayA9IHsKKwkubmFtZQkJPSAiaTJjX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkuaWQJCT0gMywKKwkucGFyZW50CQk9ICZjb3JlXzk2bV9mY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fSTJDM19TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgaTJjMl9mY2sgPSB7CisJLm5hbWUJCT0gImkyY19mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLmlkCQk9IDIsCisJLnBhcmVudAkJPSAmY29yZV85Nm1fZmNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0kyQzJfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGkyYzFfZmNrID0geworCS5uYW1lCQk9ICJpMmNfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSAxLAorCS5wYXJlbnQJCT0gJmNvcmVfOTZtX2ZjaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9JMkMxX1NISUZULAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCisvKgorICogTUNCU1AgMSAmIDUgZ2V0IHRoZWlyIDk2TUh6IGNsb2NrIGZyb20gY29yZV85Nm1fZmNrOworICogTUNCU1AgMiwgMywgNCBnZXQgdGhlaXIgOTZNSHogY2xvY2sgZnJvbSBwZXJfOTZtX2Zjay4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBjb21tb25fbWNic3BfOTZtX3JhdGVzW10gPSB7CisJeyAuZGl2ID0gMSwgLnZhbCA9IDAsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB8IERFRkFVTFRfUkFURSB9LAorCXsgLmRpdiA9IDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBjb21tb25fbWNic3BfbWNic3BfcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8zNDNYIHwgREVGQVVMVF9SQVRFIH0sCisJeyAuZGl2ID0gMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBtY2JzcF8xNV9jbGtzZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmY29yZV85Nm1fZmNrLCAucmF0ZXMgPSBjb21tb25fbWNic3BfOTZtX3JhdGVzIH0sCisJeyAucGFyZW50ID0gJm1jYnNwX2Nsa3MsICAgLnJhdGVzID0gY29tbW9uX21jYnNwX21jYnNwX3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IGNsayBtY2JzcDVfZmNrID0geworCS5uYW1lCQk9ICJtY2JzcF9mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLmlkCQk9IDUsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9NQ0JTUDVfU0hJRlQsCisJLmNsa3NlbF9yZWcJPSBPTUFQMzQzWF9DVFJMX1JFR0FERFIoT01BUDM0M1hfQ09OVFJPTF9ERVZDT05GMSksCisJLmNsa3NlbF9tYXNrCT0gT01BUDJfTUNCU1A1X0NMS1NfTUFTSywKKwkuY2xrc2VsCQk9IG1jYnNwXzE1X2Nsa3NlbCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNic3AxX2ZjayA9IHsKKwkubmFtZQkJPSAibWNic3BfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSAxLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fTUNCU1AxX1NISUZULAorCS5jbGtzZWxfcmVnCT0gT01BUDM0M1hfQ1RSTF9SRUdBRERSKE9NQVAyX0NPTlRST0xfREVWQ09ORjApLAorCS5jbGtzZWxfbWFzawk9IE9NQVAyX01DQlNQMV9DTEtTX01BU0ssCisJLmNsa3NlbAkJPSBtY2JzcF8xNV9jbGtzZWwsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKK307CisKKy8qIENPUkVfNDhNX0ZDSy1kZXJpdmVkIGNsb2NrcyAqLworCitzdGF0aWMgc3RydWN0IGNsayBjb3JlXzQ4bV9mY2sgPSB7CisJLm5hbWUJCT0gImNvcmVfNDhtX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmb21hcF80OG1fZmNrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBtY3NwaTRfZmNrID0geworCS5uYW1lCQk9ICJtY3NwaV9mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLmlkCQk9IDQsCisJLnBhcmVudAkJPSAmY29yZV80OG1fZmNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01DU1BJNF9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNzcGkzX2ZjayA9IHsKKwkubmFtZQkJPSAibWNzcGlfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSAzLAorCS5wYXJlbnQJCT0gJmNvcmVfNDhtX2ZjaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9NQ1NQSTNfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1jc3BpMl9mY2sgPSB7CisJLm5hbWUJCT0gIm1jc3BpX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkuaWQJCT0gMiwKKwkucGFyZW50CQk9ICZjb3JlXzQ4bV9mY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fTUNTUEkyX1NISUZULAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBtY3NwaTFfZmNrID0geworCS5uYW1lCQk9ICJtY3NwaV9mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLmlkCQk9IDEsCisJLnBhcmVudAkJPSAmY29yZV80OG1fZmNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01DU1BJMV9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdWFydDJfZmNrID0geworCS5uYW1lCQk9ICJ1YXJ0Ml9mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmY29yZV80OG1fZmNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX1VBUlQyX1NISUZULAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB1YXJ0MV9mY2sgPSB7CisJLm5hbWUJCT0gInVhcnQxX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZjb3JlXzQ4bV9mY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0ZDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fVUFSVDFfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGZzaG9zdHVzYl9mY2sgPSB7CisJLm5hbWUJCT0gImZzaG9zdHVzYl9mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmY29yZV80OG1fZmNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwRVMxX0VOX0ZTSE9TVFVTQl9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworLyogQ09SRV8xMk1fRkNLIGJhc2VkIGNsb2NrcyAqLworCitzdGF0aWMgc3RydWN0IGNsayBjb3JlXzEybV9mY2sgPSB7CisJLm5hbWUJCT0gImNvcmVfMTJtX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmb21hcF8xMm1fZmNrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBoZHFfZmNrID0geworCS5uYW1lCQk9ICJoZHFfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmNvcmVfMTJtX2ZjaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fRkNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9IRFFfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKKy8qIERQTEwzLWRlcml2ZWQgY2xvY2sgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBzc2lfc3NyX2NvcmV4Ml9yYXRlc1tdID0geworCXsgLmRpdiA9IDEsIC52YWwgPSAxLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfCBERUZBVUxUX1JBVEUgfSwKKwl7IC5kaXYgPSAyLCAudmFsID0gMiwgLmZsYWdzID0gUkFURV9JTl8zNDNYIH0sCisJeyAuZGl2ID0gMywgLnZhbCA9IDMsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAorCXsgLmRpdiA9IDQsIC52YWwgPSA0LCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfSwKKwl7IC5kaXYgPSA2LCAudmFsID0gNiwgLmZsYWdzID0gUkFURV9JTl8zNDNYIH0sCisJeyAuZGl2ID0gOCwgLnZhbCA9IDgsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAorCXsgLmRpdiA9IDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgc3NpX3Nzcl9jbGtzZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmY29yZXgyX2ZjaywgLnJhdGVzID0gc3NpX3Nzcl9jb3JleDJfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNzaV9zc3JfZmNrXzM0MzBlczEgPSB7CisJLm5hbWUJCT0gInNzaV9zc3JfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX1NTSV9TSElGVCwKKwkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fQ0xLU0VMKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9DTEtTRUxfU1NJX01BU0ssCisJLmNsa3NlbAkJPSBzc2lfc3NyX2Nsa3NlbCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgc3NpX3Nzcl9mY2tfMzQzMGVzMiA9IHsKKwkubmFtZQkJPSAic3NpX3Nzcl9mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMzQzMGVzMl9zc2lfd2FpdCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9GQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX1NTSV9TSElGVCwKKwkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fQ0xLU0VMKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9DTEtTRUxfU1NJX01BU0ssCisJLmNsa3NlbAkJPSBzc2lfc3NyX2Nsa3NlbCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgc3NpX3NzdF9mY2tfMzQzMGVzMSA9IHsKKwkubmFtZQkJPSAic3NpX3NzdF9mY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5wYXJlbnQJCT0gJnNzaV9zc3JfZmNrXzM0MzBlczEsCisJLmZpeGVkX2Rpdgk9IDIsCisJLnJlY2FsYwkJPSAmb21hcDJfZml4ZWRfZGl2aXNvcl9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBzc2lfc3N0X2Zja18zNDMwZXMyID0geworCS5uYW1lCQk9ICJzc2lfc3N0X2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmc3NpX3Nzcl9mY2tfMzQzMGVzMiwKKwkuZml4ZWRfZGl2CT0gMiwKKwkucmVjYWxjCQk9ICZvbWFwMl9maXhlZF9kaXZpc29yX3JlY2FsYywKK307CisKKworCisvKiBDT1JFX0wzX0lDSyBiYXNlZCBjbG9ja3MgKi8KKworLyoKKyAqIFhYWCBtdXN0IGFkZCBjbGtfZW5hYmxlL2Nsa19kaXNhYmxlIGZvciB0aGVzZSBpZiBzdGFuZGFyZCBjb2RlIHdvbid0CisgKiBoYW5kbGUgaXQKKyAqLworc3RhdGljIHN0cnVjdCBjbGsgY29yZV9sM19pY2sgPSB7CisJLm5hbWUJCT0gImNvcmVfbDNfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucGFyZW50CQk9ICZsM19pY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sM19jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGhzb3RndXNiX2lja18zNDMwZXMxID0geworCS5uYW1lCQk9ICJoc290Z3VzYl9pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5wYXJlbnQJCT0gJmNvcmVfbDNfaWNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0hTT1RHVVNCX1NISUZULAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDNfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBoc290Z3VzYl9pY2tfMzQzMGVzMiA9IHsKKwkubmFtZQkJPSAiaHNvdGd1c2JfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDM0MzBlczJfaHNvdGd1c2Jfd2FpdCwKKwkucGFyZW50CQk9ICZjb3JlX2wzX2ljaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9IU09UR1VTQl9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2wzX2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgc2RyY19pY2sgPSB7CisJLm5hbWUJCT0gInNkcmNfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmNvcmVfbDNfaWNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX1NEUkNfU0hJRlQsCisJLmZsYWdzCQk9IEVOQUJMRV9PTl9JTklULAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDNfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncG1jX2ZjayA9IHsKKwkubmFtZQkJPSAiZ3BtY19mY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5wYXJlbnQJCT0gJmNvcmVfbDNfaWNrLAorCS5mbGFncwkJPSBFTkFCTEVfT05fSU5JVCwgLyogaHVoPyAqLworCS5jbGtkbV9uYW1lCT0gImNvcmVfbDNfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCisvKiBTRUNVUklUWV9MM19JQ0sgYmFzZWQgY2xvY2tzICovCisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNlY3VyaXR5X2wzX2ljayA9IHsKKwkubmFtZQkJPSAic2VjdXJpdHlfbDNfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucGFyZW50CQk9ICZsM19pY2ssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBrYV9pY2sgPSB7CisJLm5hbWUJCT0gInBrYV9pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmc2VjdXJpdHlfbDNfaWNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4yKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX1BLQV9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworLyogQ09SRV9MNF9JQ0sgYmFzZWQgY2xvY2tzICovCisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNvcmVfbDRfaWNrID0geworCS5uYW1lCQk9ICJjb3JlX2w0X2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmbDRfaWNrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB1c2J0bGxfaWNrID0geworCS5uYW1lCQk9ICJ1c2J0bGxfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmNvcmVfbDRfaWNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4zKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwRVMyX0VOX1VTQlRMTF9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbW1jaHMzX2ljayA9IHsKKwkubmFtZQkJPSAibW1jaHNfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSAyLAorCS5wYXJlbnQJCT0gJmNvcmVfbDRfaWNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwRVMyX0VOX01NQzNfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKKy8qIEludGVyc3lzdGVtIENvbW11bmljYXRpb24gUmVnaXN0ZXJzIC0gY2hhc3NpcyBtb2RlIG9ubHkgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIGljcl9pY2sgPSB7CisJLm5hbWUJCT0gImljcl9pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmY29yZV9sNF9pY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fSUNSX1NISUZULAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBhZXMyX2ljayA9IHsKKwkubmFtZQkJPSAiYWVzMl9pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmY29yZV9sNF9pY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fQUVTMl9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgc2hhMTJfaWNrID0geworCS5uYW1lCQk9ICJzaGExMl9pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmY29yZV9sNF9pY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fU0hBMTJfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGRlczJfaWNrID0geworCS5uYW1lCQk9ICJkZXMyX2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZjb3JlX2w0X2ljaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9ERVMyX1NISUZULAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBtbWNoczJfaWNrID0geworCS5uYW1lCQk9ICJtbWNoc19pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLmlkCQk9IDEsCisJLnBhcmVudAkJPSAmY29yZV9sNF9pY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fTU1DMl9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbW1jaHMxX2ljayA9IHsKKwkubmFtZQkJPSAibW1jaHNfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmNvcmVfbDRfaWNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01NQzFfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1zcHJvX2ljayA9IHsKKwkubmFtZQkJPSAibXNwcm9faWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmNvcmVfbDRfaWNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01TUFJPX1NISUZULAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBoZHFfaWNrID0geworCS5uYW1lCQk9ICJoZHFfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmNvcmVfbDRfaWNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0hEUV9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNzcGk0X2ljayA9IHsKKwkubmFtZQkJPSAibWNzcGlfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSA0LAorCS5wYXJlbnQJCT0gJmNvcmVfbDRfaWNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01DU1BJNF9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNzcGkzX2ljayA9IHsKKwkubmFtZQkJPSAibWNzcGlfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSAzLAorCS5wYXJlbnQJCT0gJmNvcmVfbDRfaWNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01DU1BJM19TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNzcGkyX2ljayA9IHsKKwkubmFtZQkJPSAibWNzcGlfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSAyLAorCS5wYXJlbnQJCT0gJmNvcmVfbDRfaWNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01DU1BJMl9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNzcGkxX2ljayA9IHsKKwkubmFtZQkJPSAibWNzcGlfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSAxLAorCS5wYXJlbnQJCT0gJmNvcmVfbDRfaWNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01DU1BJMV9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgaTJjM19pY2sgPSB7CisJLm5hbWUJCT0gImkyY19pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLmlkCQk9IDMsCisJLnBhcmVudAkJPSAmY29yZV9sNF9pY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fSTJDM19TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgaTJjMl9pY2sgPSB7CisJLm5hbWUJCT0gImkyY19pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLmlkCQk9IDIsCisJLnBhcmVudAkJPSAmY29yZV9sNF9pY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fSTJDMl9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgaTJjMV9pY2sgPSB7CisJLm5hbWUJCT0gImkyY19pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLmlkCQk9IDEsCisJLnBhcmVudAkJPSAmY29yZV9sNF9pY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fSTJDMV9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdWFydDJfaWNrID0geworCS5uYW1lCQk9ICJ1YXJ0Ml9pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmY29yZV9sNF9pY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fVUFSVDJfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVhcnQxX2ljayA9IHsKKwkubmFtZQkJPSAidWFydDFfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmNvcmVfbDRfaWNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX1VBUlQxX1NISUZULAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncHQxMV9pY2sgPSB7CisJLm5hbWUJCT0gImdwdDExX2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZjb3JlX2w0X2ljaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUFQxMV9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZ3B0MTBfaWNrID0geworCS5uYW1lCQk9ICJncHQxMF9pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmY29yZV9sNF9pY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BUMTBfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1jYnNwNV9pY2sgPSB7CisJLm5hbWUJCT0gIm1jYnNwX2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkuaWQJCT0gNSwKKwkucGFyZW50CQk9ICZjb3JlX2w0X2ljaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9NQ0JTUDVfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1jYnNwMV9pY2sgPSB7CisJLm5hbWUJCT0gIm1jYnNwX2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkuaWQJCT0gMSwKKwkucGFyZW50CQk9ICZjb3JlX2w0X2ljaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9NQ0JTUDFfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGZhY19pY2sgPSB7CisJLm5hbWUJCT0gImZhY19pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmY29yZV9sNF9pY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBFUzFfRU5fRkFDX1NISUZULAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBtYWlsYm94ZXNfaWNrID0geworCS5uYW1lCQk9ICJtYWlsYm94ZXNfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmNvcmVfbDRfaWNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01BSUxCT1hFU19TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgb21hcGN0cmxfaWNrID0geworCS5uYW1lCQk9ICJvbWFwY3RybF9pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmY29yZV9sNF9pY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fT01BUENUUkxfU0hJRlQsCisJLmZsYWdzCQk9IEVOQUJMRV9PTl9JTklULAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCisvKiBTU0lfTDRfSUNLIGJhc2VkIGNsb2NrcyAqLworCitzdGF0aWMgc3RydWN0IGNsayBzc2lfbDRfaWNrID0geworCS5uYW1lCQk9ICJzc2lfbDRfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucGFyZW50CQk9ICZsNF9pY2ssCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNzaV9pY2tfMzQzMGVzMSA9IHsKKwkubmFtZQkJPSAic3NpX2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLnBhcmVudAkJPSAmc3NpX2w0X2ljaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMSksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9TU0lfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAiY29yZV9sNF9jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNzaV9pY2tfMzQzMGVzMiA9IHsKKwkubmFtZQkJPSAic3NpX2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAzNDMwZXMyX3NzaV93YWl0LAorCS5wYXJlbnQJCT0gJnNzaV9sNF9pY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjEpLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fU1NJX1NISUZULAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCisvKiBSRVZJU0lUOiBUZWNobmljYWxseSB0aGUgVFJNIGNsYWltcyB0aGF0IHRoaXMgaXMgQ09SRV9DTEsgYmFzZWQsCisgKiBidXQgbDRfaWNrIG1ha2VzIG1vcmUgc2Vuc2UgdG8gbWUgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgdXNiX2w0X2Nsa3NlbFtdID0geworCXsgLnBhcmVudCA9ICZsNF9pY2ssIC5yYXRlcyA9IGRpdjJfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayB1c2JfbDRfaWNrID0geworCS5uYW1lCQk9ICJ1c2JfbDRfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJmw0X2ljaywKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4xKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwRVMxX0VOX0ZTSE9TVFVTQl9TSElGVCwKKwkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fQ0xLU0VMKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMEVTMV9DTEtTRUxfRlNIT1NUVVNCX01BU0ssCisJLmNsa3NlbAkJPSB1c2JfbDRfY2xrc2VsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCit9OworCisvKiBTRUNVUklUWV9MNF9JQ0syIGJhc2VkIGNsb2NrcyAqLworCitzdGF0aWMgc3RydWN0IGNsayBzZWN1cml0eV9sNF9pY2syID0geworCS5uYW1lCQk9ICJzZWN1cml0eV9sNF9pY2syIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucGFyZW50CQk9ICZsNF9pY2ssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGFlczFfaWNrID0geworCS5uYW1lCQk9ICJhZXMxX2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZzZWN1cml0eV9sNF9pY2syLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4yKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0FFUzFfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHJuZ19pY2sgPSB7CisJLm5hbWUJCT0gInJuZ19pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmc2VjdXJpdHlfbDRfaWNrMiwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihDT1JFX01PRCwgQ01fSUNMS0VOMiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9STkdfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNoYTExX2ljayA9IHsKKwkubmFtZQkJPSAic2hhMTFfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJnNlY3VyaXR5X2w0X2ljazIsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoQ09SRV9NT0QsIENNX0lDTEtFTjIpLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fU0hBMTFfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGRlczFfaWNrID0geworCS5uYW1lCQk9ICJkZXMxX2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZzZWN1cml0eV9sNF9pY2syLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKENPUkVfTU9ELCBDTV9JQ0xLRU4yKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0RFUzFfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKKy8qIERTUyAqLworc3RhdGljIHN0cnVjdCBjbGsgZHNzMV9hbHdvbl9mY2tfMzQzMGVzMSA9IHsKKwkubmFtZQkJPSAiZHNzMV9hbHdvbl9mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5wYXJlbnQJCT0gJmRwbGw0X200eDJfY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfRFNTX01PRCwgQ01fRkNMS0VOKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0RTUzFfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAiZHNzX2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZHNzMV9hbHdvbl9mY2tfMzQzMGVzMiA9IHsKKwkubmFtZQkJPSAiZHNzMV9hbHdvbl9mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMzQzMGVzMl9kc3NfdXNiaG9zdF93YWl0LAorCS5wYXJlbnQJCT0gJmRwbGw0X200eDJfY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfRFNTX01PRCwgQ01fRkNMS0VOKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0RTUzFfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAiZHNzX2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZHNzX3R2X2ZjayA9IHsKKwkubmFtZQkJPSAiZHNzX3R2X2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLnBhcmVudAkJPSAmb21hcF81NG1fZmNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX0RTU19NT0QsIENNX0ZDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9UVl9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJkc3NfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkc3NfOTZtX2ZjayA9IHsKKwkubmFtZQkJPSAiZHNzXzk2bV9mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5wYXJlbnQJCT0gJm9tYXBfOTZtX2ZjaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9EU1NfTU9ELCBDTV9GQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fVFZfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAiZHNzX2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZHNzMl9hbHdvbl9mY2sgPSB7CisJLm5hbWUJCT0gImRzczJfYWx3b25fZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkucGFyZW50CQk9ICZzeXNfY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfRFNTX01PRCwgQ01fRkNMS0VOKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0RTUzJfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAiZHNzX2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZHNzX2lja18zNDMwZXMxID0geworCS8qIEhhbmRsZXMgYm90aCBMMyBhbmQgTDQgY2xvY2tzICovCisJLm5hbWUJCT0gImRzc19pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5wYXJlbnQJCT0gJmw0X2ljaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9EU1NfTU9ELCBDTV9JQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfQ01fSUNMS0VOX0RTU19FTl9EU1NfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAiZHNzX2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZHNzX2lja18zNDMwZXMyID0geworCS8qIEhhbmRsZXMgYm90aCBMMyBhbmQgTDQgY2xvY2tzICovCisJLm5hbWUJCT0gImRzc19pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMzQzMGVzMl9kc3NfdXNiaG9zdF93YWl0LAorCS5wYXJlbnQJCT0gJmw0X2ljaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9EU1NfTU9ELCBDTV9JQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfQ01fSUNMS0VOX0RTU19FTl9EU1NfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAiZHNzX2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworLyogQ0FNICovCisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNhbV9tY2xrID0geworCS5uYW1lCQk9ICJjYW1fbWNsayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLnBhcmVudAkJPSAmZHBsbDRfbTV4Ml9jaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9DQU1fTU9ELCBDTV9GQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fQ0FNX1NISUZULAorCS5jbGtkbV9uYW1lCT0gImNhbV9jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNhbV9pY2sgPSB7CisJLyogSGFuZGxlcyBib3RoIEwzIGFuZCBMNCBjbG9ja3MgKi8KKwkubmFtZQkJPSAiY2FtX2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLnBhcmVudAkJPSAmbDRfaWNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX0NBTV9NT0QsIENNX0lDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9DQU1fU0hJRlQsCisJLmNsa2RtX25hbWUJPSAiY2FtX2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgY3NpMl85Nm1fZmNrID0geworCS5uYW1lCQk9ICJjc2kyXzk2bV9mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5wYXJlbnQJCT0gJmNvcmVfOTZtX2ZjaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9DQU1fTU9ELCBDTV9GQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fQ1NJMl9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJjYW1fY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCisvKiBVU0JIT1NUIC0gMzQzMEVTMiBvbmx5ICovCisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVzYmhvc3RfMTIwbV9mY2sgPSB7CisJLm5hbWUJCT0gInVzYmhvc3RfMTIwbV9mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5wYXJlbnQJCT0gJmRwbGw1X20yX2NrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwRVMyX1VTQkhPU1RfTU9ELCBDTV9GQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBFUzJfRU5fVVNCSE9TVDJfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAidXNiaG9zdF9jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVzYmhvc3RfNDhtX2ZjayA9IHsKKwkubmFtZQkJPSAidXNiaG9zdF80OG1fZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDM0MzBlczJfZHNzX3VzYmhvc3Rfd2FpdCwKKwkucGFyZW50CQk9ICZvbWFwXzQ4bV9mY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBFUzJfVVNCSE9TVF9NT0QsIENNX0ZDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMEVTMl9FTl9VU0JIT1NUMV9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJ1c2Job3N0X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdXNiaG9zdF9pY2sgPSB7CisJLyogSGFuZGxlcyBib3RoIEwzIGFuZCBMNCBjbG9ja3MgKi8KKwkubmFtZQkJPSAidXNiaG9zdF9pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMzQzMGVzMl9kc3NfdXNiaG9zdF93YWl0LAorCS5wYXJlbnQJCT0gJmw0X2ljaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMEVTMl9VU0JIT1NUX01PRCwgQ01fSUNMS0VOKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwRVMyX0VOX1VTQkhPU1RfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAidXNiaG9zdF9jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKKy8qIFdLVVAgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSB1c2ltXzk2bV9yYXRlc1tdID0geworCXsgLmRpdiA9IDIsICAudmFsID0gMywgLmZsYWdzID0gUkFURV9JTl8zNDNYIHwgREVGQVVMVF9SQVRFIH0sCisJeyAuZGl2ID0gNCwgIC52YWwgPSA0LCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfSwKKwl7IC5kaXYgPSA4LCAgLnZhbCA9IDUsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAorCXsgLmRpdiA9IDEwLCAudmFsID0gNiwgLmZsYWdzID0gUkFURV9JTl8zNDNYIH0sCisJeyAuZGl2ID0gMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSB1c2ltXzEyMG1fcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSA0LCAgLnZhbCA9IDcsCS5mbGFncyA9IFJBVEVfSU5fMzQzWCB8IERFRkFVTFRfUkFURSB9LAorCXsgLmRpdiA9IDgsICAudmFsID0gOCwJLmZsYWdzID0gUkFURV9JTl8zNDNYIH0sCisJeyAuZGl2ID0gMTYsIC52YWwgPSA5LAkuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfSwKKwl7IC5kaXYgPSAyMCwgLnZhbCA9IDEwLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfSwKKwl7IC5kaXYgPSAwIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCB1c2ltX2Nsa3NlbFtdID0geworCXsgLnBhcmVudCA9ICZvbWFwXzk2bV9mY2ssCS5yYXRlcyA9IHVzaW1fOTZtX3JhdGVzIH0sCisJeyAucGFyZW50ID0gJmRwbGw1X20yX2NrLAkucmF0ZXMgPSB1c2ltXzEyMG1fcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmc3lzX2NrLAkJLnJhdGVzID0gZGl2Ml9yYXRlcyB9LAorCXsgLnBhcmVudCA9IE5VTEwgfSwKK307CisKKy8qIDM0MzBFUzIgb25seSAqLworc3RhdGljIHN0cnVjdCBjbGsgdXNpbV9mY2sgPSB7CisJLm5hbWUJCT0gInVzaW1fZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoV0tVUF9NT0QsIENNX0ZDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMEVTMl9FTl9VU0lNT0NQX1NISUZULAorCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKFdLVVBfTU9ELCBDTV9DTEtTRUwpLAorCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwRVMyX0NMS1NFTF9VU0lNT0NQX01BU0ssCisJLmNsa3NlbAkJPSB1c2ltX2Nsa3NlbCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorfTsKKworLyogWFhYIHNob3VsZCBncHQxJ3MgY2xrc2VsIGhhdmUgd2t1cF8zMmtfZmNrIGFzIHRoZSAzMmsgb3B0PyAqLworc3RhdGljIHN0cnVjdCBjbGsgZ3B0MV9mY2sgPSB7CisJLm5hbWUJCT0gImdwdDFfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoV0tVUF9NT0QsIENNX0ZDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUFQxX1NISUZULAorCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKFdLVVBfTU9ELCBDTV9DTEtTRUwpLAorCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9HUFQxX01BU0ssCisJLmNsa3NlbAkJPSBvbWFwMzQzeF9ncHRfY2xrc2VsLAorCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB3a3VwXzMya19mY2sgPSB7CisJLm5hbWUJCT0gIndrdXBfMzJrX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmb21hcF8zMmtfZmNrLAorCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncGlvMV9kYmNrID0geworCS5uYW1lCQk9ICJncGlvMV9kYmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkucGFyZW50CQk9ICZ3a3VwXzMya19mY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoV0tVUF9NT0QsIENNX0ZDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUElPMV9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJ3a3VwX2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgd2R0Ml9mY2sgPSB7CisJLm5hbWUJCT0gIndkdDJfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJndrdXBfMzJrX2ZjaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihXS1VQX01PRCwgQ01fRkNMS0VOKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX1dEVDJfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHdrdXBfbDRfaWNrID0geworCS5uYW1lCQk9ICJ3a3VwX2w0X2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmc3lzX2NrLAorCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCisvKiAzNDMwRVMyIG9ubHkgKi8KKy8qIE5ldmVyIHNwZWNpZmljYWxseSBuYW1lZCBpbiB0aGUgVFJNLCBzbyB3ZSBoYXZlIHRvIGluZmVyIGEgbGlrZWx5IG5hbWUgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIHVzaW1faWNrID0geworCS5uYW1lCQk9ICJ1c2ltX2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZ3a3VwX2w0X2ljaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihXS1VQX01PRCwgQ01fSUNMS0VOKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwRVMyX0VOX1VTSU1PQ1BfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHdkdDJfaWNrID0geworCS5uYW1lCQk9ICJ3ZHQyX2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZ3a3VwX2w0X2ljaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihXS1VQX01PRCwgQ01fSUNMS0VOKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX1dEVDJfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHdkdDFfaWNrID0geworCS5uYW1lCQk9ICJ3ZHQxX2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZ3a3VwX2w0X2ljaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihXS1VQX01PRCwgQ01fSUNMS0VOKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX1dEVDFfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGdwaW8xX2ljayA9IHsKKwkubmFtZQkJPSAiZ3BpbzFfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJndrdXBfbDRfaWNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKFdLVVBfTU9ELCBDTV9JQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BJTzFfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAid2t1cF9jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG9tYXBfMzJrc3luY19pY2sgPSB7CisJLm5hbWUJCT0gIm9tYXBfMzJrc3luY19pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmd2t1cF9sNF9pY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoV0tVUF9NT0QsIENNX0lDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl8zMktTWU5DX1NISUZULAorCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCisvKiBYWFggVGhpcyBjbG9jayBubyBsb25nZXIgZXhpc3RzIGluIDM0MzAgVFJNIHJldiBGICovCitzdGF0aWMgc3RydWN0IGNsayBncHQxMl9pY2sgPSB7CisJLm5hbWUJCT0gImdwdDEyX2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZ3a3VwX2w0X2ljaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihXS1VQX01PRCwgQ01fSUNMS0VOKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQVDEyX1NISUZULAorCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncHQxX2ljayA9IHsKKwkubmFtZQkJPSAiZ3B0MV9pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmd2t1cF9sNF9pY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoV0tVUF9NT0QsIENNX0lDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUFQxX1NISUZULAorCS5jbGtkbV9uYW1lCT0gIndrdXBfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCisKKworLyogUEVSIGNsb2NrIGRvbWFpbiAqLworCitzdGF0aWMgc3RydWN0IGNsayBwZXJfOTZtX2ZjayA9IHsKKwkubmFtZQkJPSAicGVyXzk2bV9mY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5wYXJlbnQJCT0gJm9tYXBfOTZtX2Fsd29uX2ZjaywKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBwZXJfNDhtX2ZjayA9IHsKKwkubmFtZQkJPSAicGVyXzQ4bV9mY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5wYXJlbnQJCT0gJm9tYXBfNDhtX2ZjaywKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB1YXJ0M19mY2sgPSB7CisJLm5hbWUJCT0gInVhcnQzX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZwZXJfNDhtX2ZjaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9GQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fVUFSVDNfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAicGVyX2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZ3B0Ml9mY2sgPSB7CisJLm5hbWUJCT0gImdwdDJfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fRkNMS0VOKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQVDJfU0hJRlQsCisJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fQ0xLU0VMKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9DTEtTRUxfR1BUMl9NQVNLLAorCS5jbGtzZWwJCT0gb21hcDM0M3hfZ3B0X2Nsa3NlbCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncHQzX2ZjayA9IHsKKwkubmFtZQkJPSAiZ3B0M19mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9GQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BUM19TSElGVCwKKwkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9DTEtTRUwpLAorCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9HUFQzX01BU0ssCisJLmNsa3NlbAkJPSBvbWFwMzQzeF9ncHRfY2xrc2VsLAorCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGdwdDRfZmNrID0geworCS5uYW1lCQk9ICJncHQ0X2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0ZDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUFQ0X1NISUZULAorCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0NMS1NFTCksCisJLmNsa3NlbF9tYXNrCT0gT01BUDM0MzBfQ0xLU0VMX0dQVDRfTUFTSywKKwkuY2xrc2VsCQk9IG9tYXAzNDN4X2dwdF9jbGtzZWwsCisJLmNsa2RtX25hbWUJPSAicGVyX2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZ3B0NV9mY2sgPSB7CisJLm5hbWUJCT0gImdwdDVfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fRkNMS0VOKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQVDVfU0hJRlQsCisJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fQ0xLU0VMKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9DTEtTRUxfR1BUNV9NQVNLLAorCS5jbGtzZWwJCT0gb21hcDM0M3hfZ3B0X2Nsa3NlbCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncHQ2X2ZjayA9IHsKKwkubmFtZQkJPSAiZ3B0Nl9mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9GQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BUNl9TSElGVCwKKwkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9DTEtTRUwpLAorCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9HUFQ2X01BU0ssCisJLmNsa3NlbAkJPSBvbWFwMzQzeF9ncHRfY2xrc2VsLAorCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGdwdDdfZmNrID0geworCS5uYW1lCQk9ICJncHQ3X2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0ZDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUFQ3X1NISUZULAorCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0NMS1NFTCksCisJLmNsa3NlbF9tYXNrCT0gT01BUDM0MzBfQ0xLU0VMX0dQVDdfTUFTSywKKwkuY2xrc2VsCQk9IG9tYXAzNDN4X2dwdF9jbGtzZWwsCisJLmNsa2RtX25hbWUJPSAicGVyX2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZ3B0OF9mY2sgPSB7CisJLm5hbWUJCT0gImdwdDhfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fRkNMS0VOKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQVDhfU0hJRlQsCisJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fQ0xLU0VMKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9DTEtTRUxfR1BUOF9NQVNLLAorCS5jbGtzZWwJCT0gb21hcDM0M3hfZ3B0X2Nsa3NlbCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncHQ5X2ZjayA9IHsKKwkubmFtZQkJPSAiZ3B0OV9mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9GQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BUOV9TSElGVCwKKwkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9DTEtTRUwpLAorCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9HUFQ5X01BU0ssCisJLmNsa3NlbAkJPSBvbWFwMzQzeF9ncHRfY2xrc2VsLAorCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBlcl8zMmtfYWx3b25fZmNrID0geworCS5uYW1lCQk9ICJwZXJfMzJrX2Fsd29uX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnBhcmVudAkJPSAmb21hcF8zMmtfZmNrLAorCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGdwaW82X2RiY2sgPSB7CisJLm5hbWUJCT0gImdwaW82X2RiY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5wYXJlbnQJCT0gJnBlcl8zMmtfYWx3b25fZmNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0ZDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUElPNl9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncGlvNV9kYmNrID0geworCS5uYW1lCQk9ICJncGlvNV9kYmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkucGFyZW50CQk9ICZwZXJfMzJrX2Fsd29uX2ZjaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9GQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BJTzVfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAicGVyX2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZ3BpbzRfZGJjayA9IHsKKwkubmFtZQkJPSAiZ3BpbzRfZGJjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLnBhcmVudAkJPSAmcGVyXzMya19hbHdvbl9mY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fRkNMS0VOKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX0dQSU80X1NISUZULAorCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGdwaW8zX2RiY2sgPSB7CisJLm5hbWUJCT0gImdwaW8zX2RiY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5wYXJlbnQJCT0gJnBlcl8zMmtfYWx3b25fZmNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0ZDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUElPM19TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncGlvMl9kYmNrID0geworCS5uYW1lCQk9ICJncGlvMl9kYmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkucGFyZW50CQk9ICZwZXJfMzJrX2Fsd29uX2ZjaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9GQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BJTzJfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAicGVyX2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgd2R0M19mY2sgPSB7CisJLm5hbWUJCT0gIndkdDNfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJnBlcl8zMmtfYWx3b25fZmNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0ZDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9XRFQzX1NISUZULAorCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBlcl9sNF9pY2sgPSB7CisJLm5hbWUJCT0gInBlcl9sNF9pY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5wYXJlbnQJCT0gJmw0X2ljaywKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncGlvNl9pY2sgPSB7CisJLm5hbWUJCT0gImdwaW82X2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZwZXJfbDRfaWNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0lDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUElPNl9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncGlvNV9pY2sgPSB7CisJLm5hbWUJCT0gImdwaW81X2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZwZXJfbDRfaWNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0lDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUElPNV9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncGlvNF9pY2sgPSB7CisJLm5hbWUJCT0gImdwaW80X2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZwZXJfbDRfaWNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0lDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUElPNF9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncGlvM19pY2sgPSB7CisJLm5hbWUJCT0gImdwaW8zX2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZwZXJfbDRfaWNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0lDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUElPM19TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncGlvMl9pY2sgPSB7CisJLm5hbWUJCT0gImdwaW8yX2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZwZXJfbDRfaWNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0lDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9HUElPMl9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB3ZHQzX2ljayA9IHsKKwkubmFtZQkJPSAid2R0M19pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmcGVyX2w0X2ljaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9JQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fV0RUM19TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB1YXJ0M19pY2sgPSB7CisJLm5hbWUJCT0gInVhcnQzX2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZwZXJfbDRfaWNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0lDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9VQVJUM19TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncHQ5X2ljayA9IHsKKwkubmFtZQkJPSAiZ3B0OV9pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmcGVyX2w0X2ljaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9JQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BUOV9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncHQ4X2ljayA9IHsKKwkubmFtZQkJPSAiZ3B0OF9pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmcGVyX2w0X2ljaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9JQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BUOF9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncHQ3X2ljayA9IHsKKwkubmFtZQkJPSAiZ3B0N19pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmcGVyX2w0X2ljaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9JQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BUN19TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncHQ2X2ljayA9IHsKKwkubmFtZQkJPSAiZ3B0Nl9pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmcGVyX2w0X2ljaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9JQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BUNl9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncHQ1X2ljayA9IHsKKwkubmFtZQkJPSAiZ3B0NV9pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmcGVyX2w0X2ljaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9JQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BUNV9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncHQ0X2ljayA9IHsKKwkubmFtZQkJPSAiZ3B0NF9pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmcGVyX2w0X2ljaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9JQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BUNF9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncHQzX2ljayA9IHsKKwkubmFtZQkJPSAiZ3B0M19pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmcGVyX2w0X2ljaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9JQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BUM19TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBncHQyX2ljayA9IHsKKwkubmFtZQkJPSAiZ3B0Ml9pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLnBhcmVudAkJPSAmcGVyX2w0X2ljaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9JQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fR1BUMl9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBtY2JzcDJfaWNrID0geworCS5uYW1lCQk9ICJtY2JzcF9pY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLmlkCQk9IDIsCisJLnBhcmVudAkJPSAmcGVyX2w0X2ljaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9JQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fTUNCU1AyX1NISUZULAorCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1jYnNwM19pY2sgPSB7CisJLm5hbWUJCT0gIm1jYnNwX2ljayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkuaWQJCT0gMywKKwkucGFyZW50CQk9ICZwZXJfbDRfaWNrLAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0lDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9NQ0JTUDNfU0hJRlQsCisJLmNsa2RtX25hbWUJPSAicGVyX2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNic3A0X2ljayA9IHsKKwkubmFtZQkJPSAibWNic3BfaWNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSA0LAorCS5wYXJlbnQJCT0gJnBlcl9sNF9pY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fSUNMS0VOKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01DQlNQNF9TSElGVCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBtY2JzcF8yMzRfY2xrc2VsW10gPSB7CisJeyAucGFyZW50ID0gJmNvcmVfOTZtX2ZjaywgLnJhdGVzID0gY29tbW9uX21jYnNwXzk2bV9yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZtY2JzcF9jbGtzLCAgIC5yYXRlcyA9IGNvbW1vbl9tY2JzcF9tY2JzcF9yYXRlcyB9LAorCXsgLnBhcmVudCA9IE5VTEwgfQorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNic3AyX2ZjayA9IHsKKwkubmFtZQkJPSAibWNic3BfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5pZAkJPSAyLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfUEVSX01PRCwgQ01fRkNMS0VOKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX01DQlNQMl9TSElGVCwKKwkuY2xrc2VsX3JlZwk9IE9NQVAzNDNYX0NUUkxfUkVHQUREUihPTUFQMl9DT05UUk9MX0RFVkNPTkYwKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMl9NQ0JTUDJfQ0xLU19NQVNLLAorCS5jbGtzZWwJCT0gbWNic3BfMjM0X2Nsa3NlbCwKKwkuY2xrZG1fbmFtZQk9ICJwZXJfY2xrZG0iLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBtY2JzcDNfZmNrID0geworCS5uYW1lCQk9ICJtY2JzcF9mY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0X3dhaXQsCisJLmlkCQk9IDMsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9QRVJfTU9ELCBDTV9GQ0xLRU4pLAorCS5lbmFibGVfYml0CT0gT01BUDM0MzBfRU5fTUNCU1AzX1NISUZULAorCS5jbGtzZWxfcmVnCT0gT01BUDM0M1hfQ1RSTF9SRUdBRERSKE9NQVAzNDNYX0NPTlRST0xfREVWQ09ORjEpLAorCS5jbGtzZWxfbWFzawk9IE9NQVAyX01DQlNQM19DTEtTX01BU0ssCisJLmNsa3NlbAkJPSBtY2JzcF8yMzRfY2xrc2VsLAorCS5jbGtkbV9uYW1lCT0gInBlcl9jbGtkbSIsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1jYnNwNF9mY2sgPSB7CisJLm5hbWUJCT0gIm1jYnNwX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkuaWQJCT0gNCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5lbmFibGVfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX1BFUl9NT0QsIENNX0ZDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9NQ0JTUDRfU0hJRlQsCisJLmNsa3NlbF9yZWcJPSBPTUFQMzQzWF9DVFJMX1JFR0FERFIoT01BUDM0M1hfQ09OVFJPTF9ERVZDT05GMSksCisJLmNsa3NlbF9tYXNrCT0gT01BUDJfTUNCU1A0X0NMS1NfTUFTSywKKwkuY2xrc2VsCQk9IG1jYnNwXzIzNF9jbGtzZWwsCisJLmNsa2RtX25hbWUJPSAicGVyX2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorfTsKKworLyogRU1VIGNsb2NrcyAqLworCisvKiBNb3JlIGluZm9ybWF0aW9uOiBBUk0gQ29ydGV4LUE4IFRlY2huaWNhbCBSZWZlcmVuY2UgTWFudWFsLCBzZWN0IDEwLjEgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBlbXVfc3JjX3N5c19yYXRlc1tdID0geworCXsgLmRpdiA9IDEsIC52YWwgPSAwLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfCBERUZBVUxUX1JBVEUgfSwKKwl7IC5kaXYgPSAwIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGVtdV9zcmNfY29yZV9yYXRlc1tdID0geworCXsgLmRpdiA9IDEsIC52YWwgPSAxLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfCBERUZBVUxUX1JBVEUgfSwKKwl7IC5kaXYgPSAwIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGVtdV9zcmNfcGVyX3JhdGVzW10gPSB7CisJeyAuZGl2ID0gMSwgLnZhbCA9IDIsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB8IERFRkFVTFRfUkFURSB9LAorCXsgLmRpdiA9IDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgZW11X3NyY19tcHVfcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gMywgLmZsYWdzID0gUkFURV9JTl8zNDNYIHwgREVGQVVMVF9SQVRFIH0sCisJeyAuZGl2ID0gMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgZW11X3NyY19jbGtzZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmc3lzX2NrLAkJLnJhdGVzID0gZW11X3NyY19zeXNfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmZW11X2NvcmVfYWx3b25fY2ssIC5yYXRlcyA9IGVtdV9zcmNfY29yZV9yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZlbXVfcGVyX2Fsd29uX2NrLAkucmF0ZXMgPSBlbXVfc3JjX3Blcl9yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZlbXVfbXB1X2Fsd29uX2NrLAkucmF0ZXMgPSBlbXVfc3JjX21wdV9yYXRlcyB9LAorCXsgLnBhcmVudCA9IE5VTEwgfSwKK307CisKKy8qCisgKiBMaWtlIHRoZSBjbGtvdXRfc3JjIGNsb2NrcywgZW11X3NyY19jbGsgaXMgYSB2aXJ0dWFsIGNsb2NrLCBleGlzdGluZyBvbmx5CisgKiB0byBzd2l0Y2ggdGhlIHNvdXJjZSBvZiBzb21lIG9mIHRoZSBFTVUgY2xvY2tzLgorICogWFhYIEFyZSB0aGVyZSBDTEtFTiBiaXRzIGZvciB0aGVzZSBFTVUgY2xrcz8KKyAqLworc3RhdGljIHN0cnVjdCBjbGsgZW11X3NyY19jayA9IHsKKwkubmFtZQkJPSAiZW11X3NyY19jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9FTVVfTU9ELCBDTV9DTEtTRUwxKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9NVVhfQ1RSTF9NQVNLLAorCS5jbGtzZWwJCT0gZW11X3NyY19jbGtzZWwsCisJLmNsa2RtX25hbWUJPSAiZW11X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBwY2xrX2VtdV9yYXRlc1tdID0geworCXsgLmRpdiA9IDIsIC52YWwgPSAyLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfCBERUZBVUxUX1JBVEUgfSwKKwl7IC5kaXYgPSAzLCAudmFsID0gMywgLmZsYWdzID0gUkFURV9JTl8zNDNYIH0sCisJeyAuZGl2ID0gNCwgLnZhbCA9IDQsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAorCXsgLmRpdiA9IDYsIC52YWwgPSA2LCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfSwKKwl7IC5kaXYgPSAwIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBwY2xrX2VtdV9jbGtzZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmZW11X3NyY19jaywgLnJhdGVzID0gcGNsa19lbXVfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBwY2xrX2ZjayA9IHsKKwkubmFtZQkJPSAicGNsa19mY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQX0NNX1JFR0FERFIoT01BUDM0MzBfRU1VX01PRCwgQ01fQ0xLU0VMMSksCisJLmNsa3NlbF9tYXNrCT0gT01BUDM0MzBfQ0xLU0VMX1BDTEtfTUFTSywKKwkuY2xrc2VsCQk9IHBjbGtfZW11X2Nsa3NlbCwKKwkuY2xrZG1fbmFtZQk9ICJlbXVfY2xrZG0iLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIHBjbGt4Ml9lbXVfcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl8zNDNYIHwgREVGQVVMVF9SQVRFIH0sCisJeyAuZGl2ID0gMiwgLnZhbCA9IDIsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAorCXsgLmRpdiA9IDMsIC52YWwgPSAzLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfSwKKwl7IC5kaXYgPSAwIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBwY2xreDJfZW11X2Nsa3NlbFtdID0geworCXsgLnBhcmVudCA9ICZlbXVfc3JjX2NrLCAucmF0ZXMgPSBwY2xreDJfZW11X3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgcGNsa3gyX2ZjayA9IHsKKwkubmFtZQkJPSAicGNsa3gyX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9FTVVfTU9ELCBDTV9DTEtTRUwxKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9DTEtTRUxfUENMS1gyX01BU0ssCisJLmNsa3NlbAkJPSBwY2xreDJfZW11X2Nsa3NlbCwKKwkuY2xrZG1fbmFtZQk9ICJlbXVfY2xrZG0iLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBhdGNsa19lbXVfY2xrc2VsW10gPSB7CisJeyAucGFyZW50ID0gJmVtdV9zcmNfY2ssIC5yYXRlcyA9IGRpdjJfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBhdGNsa19mY2sgPSB7CisJLm5hbWUJCT0gImF0Y2xrX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9FTVVfTU9ELCBDTV9DTEtTRUwxKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9DTEtTRUxfQVRDTEtfTUFTSywKKwkuY2xrc2VsCQk9IGF0Y2xrX2VtdV9jbGtzZWwsCisJLmNsa2RtX25hbWUJPSAiZW11X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdHJhY2VjbGtfc3JjX2ZjayA9IHsKKwkubmFtZQkJPSAidHJhY2VjbGtfc3JjX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuY2xrc2VsX3JlZwk9IE9NQVBfQ01fUkVHQUREUihPTUFQMzQzMF9FTVVfTU9ELCBDTV9DTEtTRUwxKSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQMzQzMF9UUkFDRV9NVVhfQ1RSTF9NQVNLLAorCS5jbGtzZWwJCT0gZW11X3NyY19jbGtzZWwsCisJLmNsa2RtX25hbWUJPSAiZW11X2Nsa2RtIiwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSB0cmFjZWNsa19yYXRlc1tdID0geworCXsgLmRpdiA9IDEsIC52YWwgPSAxLCAuZmxhZ3MgPSBSQVRFX0lOXzM0M1ggfCBERUZBVUxUX1JBVEUgfSwKKwl7IC5kaXYgPSAyLCAudmFsID0gMiwgLmZsYWdzID0gUkFURV9JTl8zNDNYIH0sCisJeyAuZGl2ID0gNCwgLnZhbCA9IDQsIC5mbGFncyA9IFJBVEVfSU5fMzQzWCB9LAorCXsgLmRpdiA9IDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIHRyYWNlY2xrX2Nsa3NlbFtdID0geworCXsgLnBhcmVudCA9ICZ0cmFjZWNsa19zcmNfZmNrLCAucmF0ZXMgPSB0cmFjZWNsa19yYXRlcyB9LAorCXsgLnBhcmVudCA9IE5VTEwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHRyYWNlY2xrX2ZjayA9IHsKKwkubmFtZQkJPSAidHJhY2VjbGtfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUF9DTV9SRUdBRERSKE9NQVAzNDMwX0VNVV9NT0QsIENNX0NMS1NFTDEpLAorCS5jbGtzZWxfbWFzawk9IE9NQVAzNDMwX0NMS1NFTF9UUkFDRUNMS19NQVNLLAorCS5jbGtzZWwJCT0gdHJhY2VjbGtfY2xrc2VsLAorCS5jbGtkbV9uYW1lCT0gImVtdV9jbGtkbSIsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKK307CisKKy8qIFNSIGNsb2NrcyAqLworCisvKiBTbWFydFJlZmxleCBmY2xrIChWREQxKSAqLworc3RhdGljIHN0cnVjdCBjbGsgc3IxX2ZjayA9IHsKKwkubmFtZQkJPSAic3IxX2ZjayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHRfd2FpdCwKKwkucGFyZW50CQk9ICZzeXNfY2ssCisJLmVuYWJsZV9yZWcJPSBPTUFQX0NNX1JFR0FERFIoV0tVUF9NT0QsIENNX0ZDTEtFTiksCisJLmVuYWJsZV9iaXQJPSBPTUFQMzQzMF9FTl9TUjFfU0hJRlQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKKy8qIFNtYXJ0UmVmbGV4IGZjbGsgKFZERDIpICovCitzdGF0aWMgc3RydWN0IGNsayBzcjJfZmNrID0geworCS5uYW1lCQk9ICJzcjJfZmNrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdF93YWl0LAorCS5wYXJlbnQJCT0gJnN5c19jaywKKwkuZW5hYmxlX3JlZwk9IE9NQVBfQ01fUkVHQUREUihXS1VQX01PRCwgQ01fRkNMS0VOKSwKKwkuZW5hYmxlX2JpdAk9IE9NQVAzNDMwX0VOX1NSMl9TSElGVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgc3JfbDRfaWNrID0geworCS5uYW1lCQk9ICJzcl9sNF9pY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLCAvKiBSTUs6IG1pc3Npbmc/ICovCisJLnBhcmVudAkJPSAmbDRfaWNrLAorCS5jbGtkbV9uYW1lCT0gImNvcmVfbDRfY2xrZG0iLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCisvKiBTRUNVUkVfMzJLX0ZDSyBjbG9ja3MgKi8KKworc3RhdGljIHN0cnVjdCBjbGsgZ3B0MTJfZmNrID0geworCS5uYW1lCQk9ICJncHQxMl9mY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5wYXJlbnQJCT0gJnNlY3VyZV8zMmtfZmNrLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB3ZHQxX2ZjayA9IHsKKwkubmFtZQkJPSAid2R0MV9mY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5wYXJlbnQJCT0gJnNlY3VyZV8zMmtfZmNrLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCisKKy8qCisgKiBjbGtkZXYKKyAqLworCitzdGF0aWMgc3RydWN0IG9tYXBfY2xrIG9tYXAzNHh4X2Nsa3NbXSA9IHsKKwlDTEsoTlVMTCwJIm9tYXBfMzJrX2ZjayIsCSZvbWFwXzMya19mY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkidmlydF8xMm1fY2siLAkmdmlydF8xMm1fY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkidmlydF8xM21fY2siLAkmdmlydF8xM21fY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkidmlydF8xNl84bV9jayIsICZ2aXJ0XzE2XzhtX2NrLCBDS18zNDMwRVMyKSwKKwlDTEsoTlVMTCwJInZpcnRfMTlfMm1fY2siLCAmdmlydF8xOV8ybV9jaywgQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJ2aXJ0XzI2bV9jayIsCSZ2aXJ0XzI2bV9jaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJ2aXJ0XzM4XzRtX2NrIiwgJnZpcnRfMzhfNG1fY2ssIENLXzM0M1gpLAorCUNMSyhOVUxMLAkib3NjX3N5c19jayIsCSZvc2Nfc3lzX2NrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJInN5c19jayIsCSZzeXNfY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkic3lzX2FsdGNsayIsCSZzeXNfYWx0Y2xrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJIm1jYnNwX2Nsa3MiLAkmbWNic3BfY2xrcywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJzeXNfY2xrb3V0MSIsCSZzeXNfY2xrb3V0MSwJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJkcGxsMV9jayIsCSZkcGxsMV9jaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJkcGxsMV94Ml9jayIsCSZkcGxsMV94Ml9jaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJkcGxsMV94Mm0yX2NrIiwgJmRwbGwxX3gybTJfY2ssIENLXzM0M1gpLAorCUNMSyhOVUxMLAkiZHBsbDJfY2siLAkmZHBsbDJfY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkiZHBsbDJfbTJfY2siLAkmZHBsbDJfbTJfY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkiZHBsbDNfY2siLAkmZHBsbDNfY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkiY29yZV9jayIsCSZjb3JlX2NrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImRwbGwzX3gyX2NrIiwJJmRwbGwzX3gyX2NrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImRwbGwzX20yX2NrIiwJJmRwbGwzX20yX2NrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImRwbGwzX20yeDJfY2siLCAmZHBsbDNfbTJ4Ml9jaywgQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJkcGxsM19tM19jayIsCSZkcGxsM19tM19jaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJkcGxsM19tM3gyX2NrIiwgJmRwbGwzX20zeDJfY2ssIENLXzM0M1gpLAorCUNMSygiZXRiIiwJImVtdV9jb3JlX2Fsd29uX2NrIiwgJmVtdV9jb3JlX2Fsd29uX2NrLCBDS18zNDNYKSwKKwlDTEsoTlVMTCwJImRwbGw0X2NrIiwJJmRwbGw0X2NrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImRwbGw0X3gyX2NrIiwJJmRwbGw0X3gyX2NrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJIm9tYXBfOTZtX2Fsd29uX2ZjayIsICZvbWFwXzk2bV9hbHdvbl9mY2ssIENLXzM0M1gpLAorCUNMSyhOVUxMLAkib21hcF85Nm1fZmNrIiwJJm9tYXBfOTZtX2ZjaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJjbV85Nm1fZmNrIiwJJmNtXzk2bV9mY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkib21hcF81NG1fZmNrIiwJJm9tYXBfNTRtX2ZjaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJvbWFwXzQ4bV9mY2siLAkmb21hcF80OG1fZmNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJIm9tYXBfMTJtX2ZjayIsCSZvbWFwXzEybV9mY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkiZHBsbDRfbTJfY2siLAkmZHBsbDRfbTJfY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkiZHBsbDRfbTJ4Ml9jayIsICZkcGxsNF9tMngyX2NrLCBDS18zNDNYKSwKKwlDTEsoTlVMTCwJImRwbGw0X20zX2NrIiwJJmRwbGw0X20zX2NrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImRwbGw0X20zeDJfY2siLCAmZHBsbDRfbTN4Ml9jaywgQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJkcGxsNF9tNF9jayIsCSZkcGxsNF9tNF9jaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJkcGxsNF9tNHgyX2NrIiwgJmRwbGw0X200eDJfY2ssIENLXzM0M1gpLAorCUNMSyhOVUxMLAkiZHBsbDRfbTVfY2siLAkmZHBsbDRfbTVfY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkiZHBsbDRfbTV4Ml9jayIsICZkcGxsNF9tNXgyX2NrLCBDS18zNDNYKSwKKwlDTEsoTlVMTCwJImRwbGw0X202X2NrIiwJJmRwbGw0X202X2NrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImRwbGw0X202eDJfY2siLCAmZHBsbDRfbTZ4Ml9jaywgQ0tfMzQzWCksCisJQ0xLKCJldGIiLAkiZW11X3Blcl9hbHdvbl9jayIsICZlbXVfcGVyX2Fsd29uX2NrLCBDS18zNDNYKSwKKwlDTEsoTlVMTCwJImRwbGw1X2NrIiwJJmRwbGw1X2NrLAlDS18zNDMwRVMyKSwKKwlDTEsoTlVMTCwJImRwbGw1X20yX2NrIiwJJmRwbGw1X20yX2NrLAlDS18zNDMwRVMyKSwKKwlDTEsoTlVMTCwJImNsa291dDJfc3JjX2NrIiwgJmNsa291dDJfc3JjX2NrLCBDS18zNDNYKSwKKwlDTEsoTlVMTCwJInN5c19jbGtvdXQyIiwJJnN5c19jbGtvdXQyLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImNvcmV4Ml9mY2siLAkmY29yZXgyX2ZjaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJkcGxsMV9mY2siLAkmZHBsbDFfZmNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJIm1wdV9jayIsCSZtcHVfY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkiYXJtX2ZjayIsCSZhcm1fZmNrLAlDS18zNDNYKSwKKwlDTEsoImV0YiIsCSJlbXVfbXB1X2Fsd29uX2NrIiwgJmVtdV9tcHVfYWx3b25fY2ssIENLXzM0M1gpLAorCUNMSyhOVUxMLAkiZHBsbDJfZmNrIiwJJmRwbGwyX2ZjaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJpdmEyX2NrIiwJJml2YTJfY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkibDNfaWNrIiwJJmwzX2ljaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJsNF9pY2siLAkmbDRfaWNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJInJtX2ljayIsCSZybV9pY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkiZ2Z4X2wzX2NrIiwJJmdmeF9sM19jaywJQ0tfMzQzMEVTMSksCisJQ0xLKE5VTEwsCSJnZnhfbDNfZmNrIiwJJmdmeF9sM19mY2ssCUNLXzM0MzBFUzEpLAorCUNMSyhOVUxMLAkiZ2Z4X2wzX2ljayIsCSZnZnhfbDNfaWNrLAlDS18zNDMwRVMxKSwKKwlDTEsoTlVMTCwJImdmeF9jZzFfY2siLAkmZ2Z4X2NnMV9jaywJQ0tfMzQzMEVTMSksCisJQ0xLKE5VTEwsCSJnZnhfY2cyX2NrIiwJJmdmeF9jZzJfY2ssCUNLXzM0MzBFUzEpLAorCUNMSyhOVUxMLAkic2d4X2ZjayIsCSZzZ3hfZmNrLAlDS18zNDMwRVMyKSwKKwlDTEsoTlVMTCwJInNneF9pY2siLAkmc2d4X2ljaywJQ0tfMzQzMEVTMiksCisJQ0xLKE5VTEwsCSJkMmRfMjZtX2ZjayIsCSZkMmRfMjZtX2ZjaywJQ0tfMzQzMEVTMSksCisJQ0xLKE5VTEwsCSJtb2RlbV9mY2siLAkmbW9kZW1fZmNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJInNhZDJkX2ljayIsCSZzYWQyZF9pY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkibWFkMmRfaWNrIiwJJm1hZDJkX2ljaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJncHQxMF9mY2siLAkmZ3B0MTBfZmNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImdwdDExX2ZjayIsCSZncHQxMV9mY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkiY3BlZnVzZV9mY2siLAkmY3BlZnVzZV9mY2ssCUNLXzM0MzBFUzIpLAorCUNMSyhOVUxMLAkidHNfZmNrIiwJJnRzX2ZjaywJQ0tfMzQzMEVTMiksCisJQ0xLKE5VTEwsCSJ1c2J0bGxfZmNrIiwJJnVzYnRsbF9mY2ssCUNLXzM0MzBFUzIpLAorCUNMSyhOVUxMLAkiY29yZV85Nm1fZmNrIiwJJmNvcmVfOTZtX2ZjaywJQ0tfMzQzWCksCisJQ0xLKCJtbWNpLW9tYXAtaHMuMiIsCSJmY2siLAkmbW1jaHMzX2ZjaywJQ0tfMzQzMEVTMiksCisJQ0xLKCJtbWNpLW9tYXAtaHMuMSIsCSJmY2siLAkmbW1jaHMyX2ZjaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJtc3Byb19mY2siLAkmbXNwcm9fZmNrLAlDS18zNDNYKSwKKwlDTEsoIm1tY2ktb21hcC1ocy4wIiwJImZjayIsCSZtbWNoczFfZmNrLAlDS18zNDNYKSwKKwlDTEsoImkyY19vbWFwLjMiLCAiZmNrIiwJJmkyYzNfZmNrLAlDS18zNDNYKSwKKwlDTEsoImkyY19vbWFwLjIiLCAiZmNrIiwJJmkyYzJfZmNrLAlDS18zNDNYKSwKKwlDTEsoImkyY19vbWFwLjEiLCAiZmNrIiwJJmkyYzFfZmNrLAlDS18zNDNYKSwKKwlDTEsoIm9tYXAtbWNic3AuNSIsICJmY2siLAkmbWNic3A1X2ZjaywJQ0tfMzQzWCksCisJQ0xLKCJvbWFwLW1jYnNwLjEiLCAiZmNrIiwJJm1jYnNwMV9mY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkiY29yZV80OG1fZmNrIiwJJmNvcmVfNDhtX2ZjaywJQ0tfMzQzWCksCisJQ0xLKCJvbWFwMl9tY3NwaS40IiwgImZjayIsCSZtY3NwaTRfZmNrLAlDS18zNDNYKSwKKwlDTEsoIm9tYXAyX21jc3BpLjMiLCAiZmNrIiwJJm1jc3BpM19mY2ssCUNLXzM0M1gpLAorCUNMSygib21hcDJfbWNzcGkuMiIsICJmY2siLAkmbWNzcGkyX2ZjaywJQ0tfMzQzWCksCisJQ0xLKCJvbWFwMl9tY3NwaS4xIiwgImZjayIsCSZtY3NwaTFfZmNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJInVhcnQyX2ZjayIsCSZ1YXJ0Ml9mY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkidWFydDFfZmNrIiwJJnVhcnQxX2ZjaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJmc2hvc3R1c2JfZmNrIiwgJmZzaG9zdHVzYl9mY2ssIENLXzM0MzBFUzEpLAorCUNMSyhOVUxMLAkiY29yZV8xMm1fZmNrIiwJJmNvcmVfMTJtX2ZjaywJQ0tfMzQzWCksCisJQ0xLKCJvbWFwX2hkcS4wIiwgImZjayIsCSZoZHFfZmNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJInNzaV9zc3JfZmNrIiwJJnNzaV9zc3JfZmNrXzM0MzBlczEsCUNLXzM0MzBFUzEpLAorCUNMSyhOVUxMLAkic3NpX3Nzcl9mY2siLAkmc3NpX3Nzcl9mY2tfMzQzMGVzMiwJQ0tfMzQzMEVTMiksCisJQ0xLKE5VTEwsCSJzc2lfc3N0X2ZjayIsCSZzc2lfc3N0X2Zja18zNDMwZXMxLAlDS18zNDMwRVMxKSwKKwlDTEsoTlVMTCwJInNzaV9zc3RfZmNrIiwJJnNzaV9zc3RfZmNrXzM0MzBlczIsCUNLXzM0MzBFUzIpLAorCUNMSyhOVUxMLAkiY29yZV9sM19pY2siLAkmY29yZV9sM19pY2ssCUNLXzM0M1gpLAorCUNMSygibXVzYl9oZHJjIiwJImljayIsCSZoc290Z3VzYl9pY2tfMzQzMGVzMSwJQ0tfMzQzMEVTMSksCisJQ0xLKCJtdXNiX2hkcmMiLAkiaWNrIiwJJmhzb3RndXNiX2lja18zNDMwZXMyLAlDS18zNDMwRVMyKSwKKwlDTEsoTlVMTCwJInNkcmNfaWNrIiwJJnNkcmNfaWNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImdwbWNfZmNrIiwJJmdwbWNfZmNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJInNlY3VyaXR5X2wzX2ljayIsICZzZWN1cml0eV9sM19pY2ssIENLXzM0M1gpLAorCUNMSyhOVUxMLAkicGthX2ljayIsCSZwa2FfaWNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImNvcmVfbDRfaWNrIiwJJmNvcmVfbDRfaWNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJInVzYnRsbF9pY2siLAkmdXNidGxsX2ljaywJQ0tfMzQzMEVTMiksCisJQ0xLKCJtbWNpLW9tYXAtaHMuMiIsCSJpY2siLAkmbW1jaHMzX2ljaywJQ0tfMzQzMEVTMiksCisJQ0xLKE5VTEwsCSJpY3JfaWNrIiwJJmljcl9pY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkiYWVzMl9pY2siLAkmYWVzMl9pY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkic2hhMTJfaWNrIiwJJnNoYTEyX2ljaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJkZXMyX2ljayIsCSZkZXMyX2ljaywJQ0tfMzQzWCksCisJQ0xLKCJtbWNpLW9tYXAtaHMuMSIsCSJpY2siLAkmbW1jaHMyX2ljaywJQ0tfMzQzWCksCisJQ0xLKCJtbWNpLW9tYXAtaHMuMCIsCSJpY2siLAkmbW1jaHMxX2ljaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJtc3Byb19pY2siLAkmbXNwcm9faWNrLAlDS18zNDNYKSwKKwlDTEsoIm9tYXBfaGRxLjAiLCAiaWNrIiwJJmhkcV9pY2ssCUNLXzM0M1gpLAorCUNMSygib21hcDJfbWNzcGkuNCIsICJpY2siLAkmbWNzcGk0X2ljaywJQ0tfMzQzWCksCisJQ0xLKCJvbWFwMl9tY3NwaS4zIiwgImljayIsCSZtY3NwaTNfaWNrLAlDS18zNDNYKSwKKwlDTEsoIm9tYXAyX21jc3BpLjIiLCAiaWNrIiwJJm1jc3BpMl9pY2ssCUNLXzM0M1gpLAorCUNMSygib21hcDJfbWNzcGkuMSIsICJpY2siLAkmbWNzcGkxX2ljaywJQ0tfMzQzWCksCisJQ0xLKCJpMmNfb21hcC4zIiwgImljayIsCSZpMmMzX2ljaywJQ0tfMzQzWCksCisJQ0xLKCJpMmNfb21hcC4yIiwgImljayIsCSZpMmMyX2ljaywJQ0tfMzQzWCksCisJQ0xLKCJpMmNfb21hcC4xIiwgImljayIsCSZpMmMxX2ljaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJ1YXJ0Ml9pY2siLAkmdWFydDJfaWNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJInVhcnQxX2ljayIsCSZ1YXJ0MV9pY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkiZ3B0MTFfaWNrIiwJJmdwdDExX2ljaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJncHQxMF9pY2siLAkmZ3B0MTBfaWNrLAlDS18zNDNYKSwKKwlDTEsoIm9tYXAtbWNic3AuNSIsICJpY2siLAkmbWNic3A1X2ljaywJQ0tfMzQzWCksCisJQ0xLKCJvbWFwLW1jYnNwLjEiLCAiaWNrIiwJJm1jYnNwMV9pY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkiZmFjX2ljayIsCSZmYWNfaWNrLAlDS18zNDMwRVMxKSwKKwlDTEsoTlVMTCwJIm1haWxib3hlc19pY2siLCAmbWFpbGJveGVzX2ljaywgQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJvbWFwY3RybF9pY2siLAkmb21hcGN0cmxfaWNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJInNzaV9sNF9pY2siLAkmc3NpX2w0X2ljaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJzc2lfaWNrIiwJJnNzaV9pY2tfMzQzMGVzMSwJQ0tfMzQzMEVTMSksCisJQ0xLKE5VTEwsCSJzc2lfaWNrIiwJJnNzaV9pY2tfMzQzMGVzMiwJQ0tfMzQzMEVTMiksCisJQ0xLKE5VTEwsCSJ1c2JfbDRfaWNrIiwJJnVzYl9sNF9pY2ssCUNLXzM0MzBFUzEpLAorCUNMSyhOVUxMLAkic2VjdXJpdHlfbDRfaWNrMiIsICZzZWN1cml0eV9sNF9pY2syLCBDS18zNDNYKSwKKwlDTEsoTlVMTCwJImFlczFfaWNrIiwJJmFlczFfaWNrLAlDS18zNDNYKSwKKwlDTEsoIm9tYXBfcm5nIiwJImljayIsCQkmcm5nX2ljaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJzaGExMV9pY2siLAkmc2hhMTFfaWNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImRlczFfaWNrIiwJJmRlczFfaWNrLAlDS18zNDNYKSwKKwlDTEsoIm9tYXBkc3MiLAkiZHNzMV9mY2siLAkmZHNzMV9hbHdvbl9mY2tfMzQzMGVzMSwgQ0tfMzQzMEVTMSksCisJQ0xLKCJvbWFwZHNzIiwJImRzczFfZmNrIiwJJmRzczFfYWx3b25fZmNrXzM0MzBlczIsIENLXzM0MzBFUzIpLAorCUNMSygib21hcGRzcyIsCSJ0dl9mY2siLAkmZHNzX3R2X2ZjaywJQ0tfMzQzWCksCisJQ0xLKCJvbWFwZHNzIiwJInZpZGVvX2ZjayIsCSZkc3NfOTZtX2ZjaywJQ0tfMzQzWCksCisJQ0xLKCJvbWFwZHNzIiwJImRzczJfZmNrIiwJJmRzczJfYWx3b25fZmNrLCBDS18zNDNYKSwKKwlDTEsoIm9tYXBkc3MiLAkiaWNrIiwJCSZkc3NfaWNrXzM0MzBlczEsCUNLXzM0MzBFUzEpLAorCUNMSygib21hcGRzcyIsCSJpY2siLAkJJmRzc19pY2tfMzQzMGVzMiwJQ0tfMzQzMEVTMiksCisJQ0xLKE5VTEwsCSJjYW1fbWNsayIsCSZjYW1fbWNsaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJjYW1faWNrIiwJJmNhbV9pY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkiY3NpMl85Nm1fZmNrIiwJJmNzaTJfOTZtX2ZjaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJ1c2Job3N0XzEyMG1fZmNrIiwgJnVzYmhvc3RfMTIwbV9mY2ssIENLXzM0MzBFUzIpLAorCUNMSyhOVUxMLAkidXNiaG9zdF80OG1fZmNrIiwgJnVzYmhvc3RfNDhtX2ZjaywgQ0tfMzQzMEVTMiksCisJQ0xLKE5VTEwsCSJ1c2Job3N0X2ljayIsCSZ1c2Job3N0X2ljaywJQ0tfMzQzMEVTMiksCisJQ0xLKE5VTEwsCSJ1c2ltX2ZjayIsCSZ1c2ltX2ZjaywJQ0tfMzQzMEVTMiksCisJQ0xLKE5VTEwsCSJncHQxX2ZjayIsCSZncHQxX2ZjaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJ3a3VwXzMya19mY2siLAkmd2t1cF8zMmtfZmNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImdwaW8xX2RiY2siLAkmZ3BpbzFfZGJjaywJQ0tfMzQzWCksCisJQ0xLKCJvbWFwX3dkdCIsCSJmY2siLAkJJndkdDJfZmNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJIndrdXBfbDRfaWNrIiwJJndrdXBfbDRfaWNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJInVzaW1faWNrIiwJJnVzaW1faWNrLAlDS18zNDMwRVMyKSwKKwlDTEsoIm9tYXBfd2R0IiwJImljayIsCQkmd2R0Ml9pY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkid2R0MV9pY2siLAkmd2R0MV9pY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkiZ3BpbzFfaWNrIiwJJmdwaW8xX2ljaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJvbWFwXzMya3N5bmNfaWNrIiwgJm9tYXBfMzJrc3luY19pY2ssIENLXzM0M1gpLAorCUNMSyhOVUxMLAkiZ3B0MTJfaWNrIiwJJmdwdDEyX2ljaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJncHQxX2ljayIsCSZncHQxX2ljaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJwZXJfOTZtX2ZjayIsCSZwZXJfOTZtX2ZjaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJwZXJfNDhtX2ZjayIsCSZwZXJfNDhtX2ZjaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJ1YXJ0M19mY2siLAkmdWFydDNfZmNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImdwdDJfZmNrIiwJJmdwdDJfZmNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImdwdDNfZmNrIiwJJmdwdDNfZmNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImdwdDRfZmNrIiwJJmdwdDRfZmNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImdwdDVfZmNrIiwJJmdwdDVfZmNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImdwdDZfZmNrIiwJJmdwdDZfZmNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImdwdDdfZmNrIiwJJmdwdDdfZmNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImdwdDhfZmNrIiwJJmdwdDhfZmNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImdwdDlfZmNrIiwJJmdwdDlfZmNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJInBlcl8zMmtfYWx3b25fZmNrIiwgJnBlcl8zMmtfYWx3b25fZmNrLCBDS18zNDNYKSwKKwlDTEsoTlVMTCwJImdwaW82X2RiY2siLAkmZ3BpbzZfZGJjaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJncGlvNV9kYmNrIiwJJmdwaW81X2RiY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkiZ3BpbzRfZGJjayIsCSZncGlvNF9kYmNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImdwaW8zX2RiY2siLAkmZ3BpbzNfZGJjaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJncGlvMl9kYmNrIiwJJmdwaW8yX2RiY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkid2R0M19mY2siLAkmd2R0M19mY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkicGVyX2w0X2ljayIsCSZwZXJfbDRfaWNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImdwaW82X2ljayIsCSZncGlvNl9pY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkiZ3BpbzVfaWNrIiwJJmdwaW81X2ljaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJncGlvNF9pY2siLAkmZ3BpbzRfaWNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImdwaW8zX2ljayIsCSZncGlvM19pY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkiZ3BpbzJfaWNrIiwJJmdwaW8yX2ljaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJ3ZHQzX2ljayIsCSZ3ZHQzX2ljaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJ1YXJ0M19pY2siLAkmdWFydDNfaWNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImdwdDlfaWNrIiwJJmdwdDlfaWNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImdwdDhfaWNrIiwJJmdwdDhfaWNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImdwdDdfaWNrIiwJJmdwdDdfaWNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImdwdDZfaWNrIiwJJmdwdDZfaWNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImdwdDVfaWNrIiwJJmdwdDVfaWNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImdwdDRfaWNrIiwJJmdwdDRfaWNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImdwdDNfaWNrIiwJJmdwdDNfaWNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImdwdDJfaWNrIiwJJmdwdDJfaWNrLAlDS18zNDNYKSwKKwlDTEsoIm9tYXAtbWNic3AuMiIsICJpY2siLAkmbWNic3AyX2ljaywJQ0tfMzQzWCksCisJQ0xLKCJvbWFwLW1jYnNwLjMiLCAiaWNrIiwJJm1jYnNwM19pY2ssCUNLXzM0M1gpLAorCUNMSygib21hcC1tY2JzcC40IiwgImljayIsCSZtY2JzcDRfaWNrLAlDS18zNDNYKSwKKwlDTEsoIm9tYXAtbWNic3AuMiIsICJmY2siLAkmbWNic3AyX2ZjaywJQ0tfMzQzWCksCisJQ0xLKCJvbWFwLW1jYnNwLjMiLCAiZmNrIiwJJm1jYnNwM19mY2ssCUNLXzM0M1gpLAorCUNMSygib21hcC1tY2JzcC40IiwgImZjayIsCSZtY2JzcDRfZmNrLAlDS18zNDNYKSwKKwlDTEsoImV0YiIsCSJlbXVfc3JjX2NrIiwJJmVtdV9zcmNfY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkicGNsa19mY2siLAkmcGNsa19mY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkicGNsa3gyX2ZjayIsCSZwY2xreDJfZmNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJImF0Y2xrX2ZjayIsCSZhdGNsa19mY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkidHJhY2VjbGtfc3JjX2ZjayIsICZ0cmFjZWNsa19zcmNfZmNrLCBDS18zNDNYKSwKKwlDTEsoTlVMTCwJInRyYWNlY2xrX2ZjayIsCSZ0cmFjZWNsa19mY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkic3IxX2ZjayIsCSZzcjFfZmNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJInNyMl9mY2siLAkmc3IyX2ZjaywJQ0tfMzQzWCksCisJQ0xLKE5VTEwsCSJzcl9sNF9pY2siLAkmc3JfbDRfaWNrLAlDS18zNDNYKSwKKwlDTEsoTlVMTCwJInNlY3VyZV8zMmtfZmNrIiwgJnNlY3VyZV8zMmtfZmNrLCBDS18zNDNYKSwKKwlDTEsoTlVMTCwJImdwdDEyX2ZjayIsCSZncHQxMl9mY2ssCUNLXzM0M1gpLAorCUNMSyhOVUxMLAkid2R0MV9mY2siLAkmd2R0MV9mY2ssCUNLXzM0M1gpLAorfTsKKworCitpbnQgX19pbml0IG9tYXAyX2Nsa19pbml0KHZvaWQpCit7CisJLyogc3RydWN0IHByY21fY29uZmlnICpwcmNtOyAqLworCXN0cnVjdCBvbWFwX2NsayAqYzsKKwkvKiB1MzIgY2xrcmF0ZTsgKi8KKwl1MzIgY3B1X2Nsa2ZsZzsKKworCWlmIChjcHVfaXNfb21hcDM0eHgoKSkgeworCQljcHVfbWFzayA9IFJBVEVfSU5fMzQzWDsKKwkJY3B1X2Nsa2ZsZyA9IENLXzM0M1g7CisKKwkJLyoKKwkJICogVXBkYXRlIHRoaXMgaWYgdGhlcmUgYXJlIGZ1cnRoZXIgY2xvY2sgY2hhbmdlcyBiZXR3ZWVuIEVTMgorCQkgKiBhbmQgcHJvZHVjdGlvbiBwYXJ0cworCQkgKi8KKwkJaWYgKG9tYXBfcmV2KCkgPT0gT01BUDM0MzBfUkVWX0VTMV8wKSB7CisJCQkvKiBObyAzNDMwRVMxLW9ubHkgcmF0ZXMgZXhpc3QsIHNvIG5vIFJBVEVfSU5fMzQzMEVTMSAqLworCQkJY3B1X2Nsa2ZsZyB8PSBDS18zNDMwRVMxOworCQl9IGVsc2UgeworCQkJY3B1X21hc2sgfD0gUkFURV9JTl8zNDMwRVMyOworCQkJY3B1X2Nsa2ZsZyB8PSBDS18zNDMwRVMyOworCQl9CisJfQorCisJY2xrX2luaXQoJm9tYXAyX2Nsa19mdW5jdGlvbnMpOworCisJZm9yIChjID0gb21hcDM0eHhfY2xrczsgYyA8IG9tYXAzNHh4X2Nsa3MgKyBBUlJBWV9TSVpFKG9tYXAzNHh4X2Nsa3MpOyBjKyspCisJCWNsa19wcmVpbml0KGMtPmxrLmNsayk7CisKKwlmb3IgKGMgPSBvbWFwMzR4eF9jbGtzOyBjIDwgb21hcDM0eHhfY2xrcyArIEFSUkFZX1NJWkUob21hcDM0eHhfY2xrcyk7IGMrKykKKwkJaWYgKGMtPmNwdSAmIGNwdV9jbGtmbGcpIHsKKwkJCWNsa2Rldl9hZGQoJmMtPmxrKTsKKwkJCWNsa19yZWdpc3RlcihjLT5say5jbGspOworCQkJb21hcDJfaW5pdF9jbGtfY2xrZG0oYy0+bGsuY2xrKTsKKwkJfQorCisJLyogUkVWSVNJVDogTm90IHlldCByZWFkeSBmb3IgT01BUDMgKi8KKyNpZiAwCisJLyogQ2hlY2sgdGhlIE1QVSByYXRlIHNldCBieSBib290bG9hZGVyICovCisJY2xrcmF0ZSA9IG9tYXAyX2dldF9kcGxsX3JhdGVfMjR4eCgmZHBsbF9jayk7CisJZm9yIChwcmNtID0gcmF0ZV90YWJsZTsgcHJjbS0+bXB1X3NwZWVkOyBwcmNtKyspIHsKKwkJaWYgKCEocHJjbS0+ZmxhZ3MgJiBjcHVfbWFzaykpCisJCQljb250aW51ZTsKKwkJaWYgKHByY20tPnh0YWxfc3BlZWQgIT0gc3lzX2NrLnJhdGUpCisJCQljb250aW51ZTsKKwkJaWYgKHByY20tPmRwbGxfc3BlZWQgPD0gY2xrcmF0ZSkKKwkJCWJyZWFrOworCX0KKwljdXJyX3ByY21fc2V0ID0gcHJjbTsKKyNlbmRpZgorCisJcmVjYWxjdWxhdGVfcm9vdF9jbG9ja3MoKTsKKworCXByaW50ayhLRVJOX0lORk8gIkNsb2NraW5nIHJhdGUgKENyeXN0YWwvQ29yZS9NUFUpOiAiCisJICAgICAgICIlbGQuJTAxbGQvJWxkLyVsZCBNSHpcbiIsCisJICAgICAgIChvc2Nfc3lzX2NrLnJhdGUgLyAxMDAwMDAwKSwgKG9zY19zeXNfY2sucmF0ZSAvIDEwMDAwMCkgJSAxMCwKKwkgICAgICAgKGNvcmVfY2sucmF0ZSAvIDEwMDAwMDApLCAoYXJtX2Zjay5yYXRlIC8gMTAwMDAwMCkpOworCisJLyoKKwkgKiBPbmx5IGVuYWJsZSB0aG9zZSBjbG9ja3Mgd2Ugd2lsbCBuZWVkLCBsZXQgdGhlIGRyaXZlcnMKKwkgKiBlbmFibGUgb3RoZXIgY2xvY2tzIGFzIG5lY2Vzc2FyeQorCSAqLworCWNsa19lbmFibGVfaW5pdF9jbG9ja3MoKTsKKworCS8qCisJICogTG9jayBEUExMNSBhbmQgcHV0IGl0IGluIGF1dG9pZGxlLgorCSAqLworCWlmIChvbWFwX3JldigpID49IE9NQVAzNDMwX1JFVl9FUzJfMCkKKwkJb21hcDNfY2xrX2xvY2tfZHBsbDUoKTsKKworCS8qIEF2b2lkIHNsZWVwaW5nIGR1cmluZyBvbWFwM19jb3JlX2RwbGxfbTJfc2V0X3JhdGUoKSAqLworCXNkcmNfaWNrX3AgPSBjbGtfZ2V0KE5VTEwsICJzZHJjX2ljayIpOworCWFybV9mY2tfcCA9IGNsa19nZXQoTlVMTCwgImFybV9mY2siKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazQ0eHguYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2s0NHh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3MDg2OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2s0NHh4LmMKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIE9NQVA0LXNwZWNpZmljIGNsb2NrIGZyYW1ld29yayBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBSYWplbmRyYSBOYXlhayAocm5heWFrQHRpLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgImNsb2NrLmgiCisKK3N0cnVjdCBjbGtfZnVuY3Rpb25zIG9tYXAyX2Nsa19mdW5jdGlvbnMgPSB7CisJLmNsa19lbmFibGUJCT0gb21hcDJfY2xrX2VuYWJsZSwKKwkuY2xrX2Rpc2FibGUJCT0gb21hcDJfY2xrX2Rpc2FibGUsCisJLmNsa19yb3VuZF9yYXRlCQk9IG9tYXAyX2Nsa19yb3VuZF9yYXRlLAorCS5jbGtfc2V0X3JhdGUJCT0gb21hcDJfY2xrX3NldF9yYXRlLAorCS5jbGtfc2V0X3BhcmVudAkJPSBvbWFwMl9jbGtfc2V0X3BhcmVudCwKKwkuY2xrX2Rpc2FibGVfdW51c2VkCT0gb21hcDJfY2xrX2Rpc2FibGVfdW51c2VkLAorfTsKKworY29uc3Qgc3RydWN0IGNsa29wcyBjbGtvcHNfbm9uY29yZV9kcGxsX29wcyA9IHsKKwkuZW5hYmxlCQk9ICZvbWFwM19ub25jb3JlX2RwbGxfZW5hYmxlLAorCS5kaXNhYmxlCT0gJm9tYXAzX25vbmNvcmVfZHBsbF9kaXNhYmxlLAorfTsKKwordm9pZCBvbWFwMl9jbGtfcHJlcGFyZV9mb3JfcmVib290KHZvaWQpCit7CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazQ0eHguaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2s0NHh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTliOWNlZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2s0NHh4LmgKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIE9NQVA0IGNsb2NrIGZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIG1hY3JvcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICovCisKKyNpZm5kZWYgX19BUkNIX0FSTV9NQUNIX09NQVAyX0NMT0NLXzQ0WFhfSAorI2RlZmluZSBfX0FSQ0hfQVJNX01BQ0hfT01BUDJfQ0xPQ0tfNDRYWF9ICisKKyNkZWZpbmUgT01BUDQ0MzBfTUFYX0RQTExfTVVMVAkyMDQ4CisjZGVmaW5lIE9NQVA0NDMwX01BWF9EUExMX0RJVgkxMjgKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBjbGtvcHMgY2xrb3BzX25vbmNvcmVfZHBsbF9vcHM7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazQ0eHhfZGF0YS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazQ0eHhfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMTBlMjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrNDR4eF9kYXRhLmMKQEAgLTAsMCArMSwyNzY2IEBACisvKgorICogT01BUDQgQ2xvY2sgZGF0YQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uCisgKgorICogUGF1bCBXYWxtc2xleSAocGF1bEBwd3Nhbi5jb20pCisgKiBSYWplbmRyYSBOYXlhayAocm5heWFrQHRpLmNvbSkKKyAqIEJlbm9pdCBDb3Vzc29uIChiLWNvdXNzb25AdGkuY29tKQorICoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmcm9tIHRoZSBPTUFQIGhhcmR3YXJlIGRhdGFiYXNlcy4KKyAqIFdlIHJlc3BlY3RmdWxseSBhc2sgdGhhdCBhbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgYmUgY29vcmRpbmF0ZWQKKyAqIHdpdGggdGhlIHB1YmxpYyBsaW51eC1vbWFwQHZnZXIua2VybmVsLm9yZyBtYWlsaW5nIGxpc3QgYW5kIHRoZQorICogYXV0aG9ycyBhYm92ZSB0byBlbnN1cmUgdGhhdCB0aGUgYXV0b2dlbmVyYXRpb24gc2NyaXB0cyBhcmUga2VwdAorICogdXAtdG8tZGF0ZSB3aXRoIHRoZSBmaWxlIGNvbnRlbnRzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorCisjaW5jbHVkZSA8cGxhdC9jb250cm9sLmg+CisjaW5jbHVkZSA8cGxhdC9jbGtkZXZfb21hcC5oPgorCisjaW5jbHVkZSAiY2xvY2suaCIKKyNpbmNsdWRlICJjbG9jazQ0eHguaCIKKyNpbmNsdWRlICJjbS5oIgorI2luY2x1ZGUgImNtLXJlZ2JpdHMtNDR4eC5oIgorI2luY2x1ZGUgInBybS5oIgorI2luY2x1ZGUgInBybS1yZWdiaXRzLTQ0eHguaCIKKworLyogUm9vdCBjbG9ja3MgKi8KKworc3RhdGljIHN0cnVjdCBjbGsgZXh0YWx0X2Nsa2luX2NrID0geworCS5uYW1lCQk9ICJleHRhbHRfY2xraW5fY2siLAorCS5yYXRlCQk9IDU5MDAwMDAwLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCB8IEFMV0FZU19FTkFCTEVELAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgcGFkX2Nsa3NfY2sgPSB7CisJLm5hbWUJCT0gInBhZF9jbGtzX2NrIiwKKwkucmF0ZQkJPSAxMjAwMDAwMCwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAgfCBBTFdBWVNfRU5BQkxFRCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBhZF9zbGltYnVzX2NvcmVfY2xrc19jayA9IHsKKwkubmFtZQkJPSAicGFkX3NsaW1idXNfY29yZV9jbGtzX2NrIiwKKwkucmF0ZQkJPSAxMjAwMDAwMCwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAgfCBBTFdBWVNfRU5BQkxFRCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNlY3VyZV8zMmtfY2xrX3NyY19jayA9IHsKKwkubmFtZQkJPSAic2VjdXJlXzMya19jbGtfc3JjX2NrIiwKKwkucmF0ZQkJPSAzMjc2OCwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAgfCBBTFdBWVNfRU5BQkxFRCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNsaW1idXNfY2xrID0geworCS5uYW1lCQk9ICJzbGltYnVzX2NsayIsCisJLnJhdGUJCT0gMTIwMDAwMDAsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwIHwgQUxXQVlTX0VOQUJMRUQsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBzeXNfMzJrX2NrID0geworCS5uYW1lCQk9ICJzeXNfMzJrX2NrIiwKKwkucmF0ZQkJPSAzMjc2OCwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAgfCBBTFdBWVNfRU5BQkxFRCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHZpcnRfMTIwMDAwMDBfY2sgPSB7CisJLm5hbWUJCT0gInZpcnRfMTIwMDAwMDBfY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yYXRlCQk9IDEyMDAwMDAwLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdmlydF8xMzAwMDAwMF9jayA9IHsKKwkubmFtZQkJPSAidmlydF8xMzAwMDAwMF9jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJhdGUJCT0gMTMwMDAwMDAsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB2aXJ0XzE2ODAwMDAwX2NrID0geworCS5uYW1lCQk9ICJ2aXJ0XzE2ODAwMDAwX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucmF0ZQkJPSAxNjgwMDAwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHZpcnRfMTkyMDAwMDBfY2sgPSB7CisJLm5hbWUJCT0gInZpcnRfMTkyMDAwMDBfY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yYXRlCQk9IDE5MjAwMDAwLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdmlydF8yNjAwMDAwMF9jayA9IHsKKwkubmFtZQkJPSAidmlydF8yNjAwMDAwMF9jayIsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJhdGUJCT0gMjYwMDAwMDAsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB2aXJ0XzI3MDAwMDAwX2NrID0geworCS5uYW1lCQk9ICJ2aXJ0XzI3MDAwMDAwX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucmF0ZQkJPSAyNzAwMDAwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHZpcnRfMzg0MDAwMDBfY2sgPSB7CisJLm5hbWUJCT0gInZpcnRfMzg0MDAwMDBfY2siLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yYXRlCQk9IDM4NDAwMDAwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBkaXZfMV8wX3JhdGVzW10gPSB7CisJeyAuZGl2ID0gMSwgLnZhbCA9IDAsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgZGl2XzFfMV9yYXRlc1tdID0geworCXsgLmRpdiA9IDEsIC52YWwgPSAxLCAuZmxhZ3MgPSBSQVRFX0lOXzQ0MzAgfSwKKwl7IC5kaXYgPSAwIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGRpdl8xXzJfcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gMiwgLmZsYWdzID0gUkFURV9JTl80NDMwIH0sCisJeyAuZGl2ID0gMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBkaXZfMV8zX3JhdGVzW10gPSB7CisJeyAuZGl2ID0gMSwgLnZhbCA9IDMsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgZGl2XzFfNF9yYXRlc1tdID0geworCXsgLmRpdiA9IDEsIC52YWwgPSA0LCAuZmxhZ3MgPSBSQVRFX0lOXzQ0MzAgfSwKKwl7IC5kaXYgPSAwIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGRpdl8xXzVfcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gNSwgLmZsYWdzID0gUkFURV9JTl80NDMwIH0sCisJeyAuZGl2ID0gMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBkaXZfMV82X3JhdGVzW10gPSB7CisJeyAuZGl2ID0gMSwgLnZhbCA9IDYsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgZGl2XzFfN19yYXRlc1tdID0geworCXsgLmRpdiA9IDEsIC52YWwgPSA3LCAuZmxhZ3MgPSBSQVRFX0lOXzQ0MzAgfSwKKwl7IC5kaXYgPSAwIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBzeXNfY2xraW5fc2VsW10gPSB7CisJeyAucGFyZW50ID0gJnZpcnRfMTIwMDAwMDBfY2ssIC5yYXRlcyA9IGRpdl8xXzFfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmdmlydF8xMzAwMDAwMF9jaywgLnJhdGVzID0gZGl2XzFfMl9yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZ2aXJ0XzE2ODAwMDAwX2NrLCAucmF0ZXMgPSBkaXZfMV8zX3JhdGVzIH0sCisJeyAucGFyZW50ID0gJnZpcnRfMTkyMDAwMDBfY2ssIC5yYXRlcyA9IGRpdl8xXzRfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmdmlydF8yNjAwMDAwMF9jaywgLnJhdGVzID0gZGl2XzFfNV9yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZ2aXJ0XzI3MDAwMDAwX2NrLCAucmF0ZXMgPSBkaXZfMV82X3JhdGVzIH0sCisJeyAucGFyZW50ID0gJnZpcnRfMzg0MDAwMDBfY2ssIC5yYXRlcyA9IGRpdl8xXzdfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBzeXNfY2xraW5fY2sgPSB7CisJLm5hbWUJCT0gInN5c19jbGtpbl9jayIsCisJLnJhdGUJCT0gMzg0MDAwMDAsCisJLmNsa3NlbAkJPSBzeXNfY2xraW5fc2VsLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTV9TWVNfQ0xLU0VMLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX1NZU19DTEtTRUxfTUFTSywKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCB8IEFMV0FZU19FTkFCTEVELAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdXRtaV9waHlfY2xrb3V0X2NrID0geworCS5uYW1lCQk9ICJ1dG1pX3BoeV9jbGtvdXRfY2siLAorCS5yYXRlCQk9IDEyMDAwMDAwLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCB8IEFMV0FZU19FTkFCTEVELAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgeGNsazYwbWhzcDFfY2sgPSB7CisJLm5hbWUJCT0gInhjbGs2MG1oc3AxX2NrIiwKKwkucmF0ZQkJPSAxMjAwMDAwMCwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAgfCBBTFdBWVNfRU5BQkxFRCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHhjbGs2MG1oc3AyX2NrID0geworCS5uYW1lCQk9ICJ4Y2xrNjBtaHNwMl9jayIsCisJLnJhdGUJCT0gMTIwMDAwMDAsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwIHwgQUxXQVlTX0VOQUJMRUQsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB4Y2xrNjBtb3RnX2NrID0geworCS5uYW1lCQk9ICJ4Y2xrNjBtb3RnX2NrIiwKKwkucmF0ZQkJPSA2MDAwMDAwMCwKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAgfCBBTFdBWVNfRU5BQkxFRCwKK307CisKKy8qIE1vZHVsZSBjbG9ja3MgYW5kIERQTEwgb3V0cHV0cyAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGRpdjJfMXRvMl9yYXRlc1tdID0geworCXsgLmRpdiA9IDEsIC52YWwgPSAwLCAuZmxhZ3MgPSBSQVRFX0lOXzQ0MzAgfSwKKwl7IC5kaXYgPSAyLCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl80NDMwIH0sCisJeyAuZGl2ID0gMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgZHBsbF9zeXNfcmVmX2Nsa19kaXZbXSA9IHsKKwl7IC5wYXJlbnQgPSAmc3lzX2Nsa2luX2NrLCAucmF0ZXMgPSBkaXYyXzF0bzJfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkcGxsX3N5c19yZWZfY2xrID0geworCS5uYW1lCQk9ICJkcGxsX3N5c19yZWZfY2xrIiwKKwkucGFyZW50CQk9ICZzeXNfY2xraW5fY2ssCisJLmNsa3NlbAkJPSBkcGxsX3N5c19yZWZfY2xrX2RpdiwKKwkuY2xrc2VsX3JlZwk9IE9NQVA0NDMwX0NNX0RQTExfU1lTX1JFRl9DTEtTRUwsCisJLmNsa3NlbF9tYXNrCT0gT01BUDQ0MzBfQ0xLU0VMXzBfMF9NQVNLLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBhYmVfZHBsbF9yZWZjbGtfbXV4X3NlbFtdID0geworCXsgLnBhcmVudCA9ICZkcGxsX3N5c19yZWZfY2xrLCAucmF0ZXMgPSBkaXZfMV8wX3JhdGVzIH0sCisJeyAucGFyZW50ID0gJnN5c18zMmtfY2ssIC5yYXRlcyA9IGRpdl8xXzFfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBhYmVfZHBsbF9yZWZjbGtfbXV4X2NrID0geworCS5uYW1lCQk9ICJhYmVfZHBsbF9yZWZjbGtfbXV4X2NrIiwKKwkucGFyZW50CQk9ICZkcGxsX3N5c19yZWZfY2xrLAorCS5jbGtzZWwJCT0gYWJlX2RwbGxfcmVmY2xrX211eF9zZWwsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuY2xrc2VsX3JlZwk9IE9NQVA0NDMwX0NNX0FCRV9QTExfUkVGX0NMS1NFTCwKKwkuY2xrc2VsX21hc2sJPSBPTUFQNDQzMF9DTEtTRUxfMF8wX01BU0ssCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCit9OworCisvKiBEUExMX0FCRSAqLworc3RhdGljIHN0cnVjdCBkcGxsX2RhdGEgZHBsbF9hYmVfZGQgPSB7CisJLm11bHRfZGl2MV9yZWcJPSBPTUFQNDQzMF9DTV9DTEtTRUxfRFBMTF9BQkUsCisJLmNsa19ieXBhc3MJPSAmc3lzX2Nsa2luX2NrLAorCS5jbGtfcmVmCT0gJmFiZV9kcGxsX3JlZmNsa19tdXhfY2ssCisJLmNvbnRyb2xfcmVnCT0gT01BUDQ0MzBfQ01fQ0xLTU9ERV9EUExMX0FCRSwKKwkubW9kZXMJCT0gKDEgPDwgRFBMTF9MT1dfUE9XRVJfQllQQVNTKSB8ICgxIDw8IERQTExfTE9DS0VEKSwKKwkuYXV0b2lkbGVfcmVnCT0gT01BUDQ0MzBfQ01fQVVUT0lETEVfRFBMTF9BQkUsCisJLmlkbGVzdF9yZWcJPSBPTUFQNDQzMF9DTV9JRExFU1RfRFBMTF9BQkUsCisJLm11bHRfbWFzawk9IE9NQVA0NDMwX0RQTExfTVVMVF9NQVNLLAorCS5kaXYxX21hc2sJPSBPTUFQNDQzMF9EUExMX0RJVl9NQVNLLAorCS5lbmFibGVfbWFzawk9IE9NQVA0NDMwX0RQTExfRU5fTUFTSywKKwkuYXV0b2lkbGVfbWFzawk9IE9NQVA0NDMwX0FVVE9fRFBMTF9NT0RFX01BU0ssCisJLmlkbGVzdF9tYXNrCT0gT01BUDQ0MzBfU1RfRFBMTF9DTEtfTUFTSywKKwkubWF4X211bHRpcGxpZXIJPSBPTUFQNDQzMF9NQVhfRFBMTF9NVUxULAorCS5tYXhfZGl2aWRlcgk9IE9NQVA0NDMwX01BWF9EUExMX0RJViwKKwkubWluX2RpdmlkZXIJPSAxLAorfTsKKworCitzdGF0aWMgc3RydWN0IGNsayBkcGxsX2FiZV9jayA9IHsKKwkubmFtZQkJPSAiZHBsbF9hYmVfY2siLAorCS5wYXJlbnQJCT0gJmFiZV9kcGxsX3JlZmNsa19tdXhfY2ssCisJLmRwbGxfZGF0YQk9ICZkcGxsX2FiZV9kZCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9kcGxsX3BhcmVudCwKKwkub3BzCQk9ICZjbGtvcHNfbm9uY29yZV9kcGxsX29wcywKKwkucmVjYWxjCQk9ICZvbWFwM19kcGxsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9kcGxsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gJm9tYXAzX25vbmNvcmVfZHBsbF9zZXRfcmF0ZSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkcGxsX2FiZV9tMngyX2NrID0geworCS5uYW1lCQk9ICJkcGxsX2FiZV9tMngyX2NrIiwKKwkucGFyZW50CQk9ICZkcGxsX2FiZV9jaywKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGFiZV8yNG1fZmNsayA9IHsKKwkubmFtZQkJPSAiYWJlXzI0bV9mY2xrIiwKKwkucGFyZW50CQk9ICZkcGxsX2FiZV9tMngyX2NrLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBkaXYzXzF0bzRfcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gMCwgLmZsYWdzID0gUkFURV9JTl80NDMwIH0sCisJeyAuZGl2ID0gMiwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDQsIC52YWwgPSAyLCAuZmxhZ3MgPSBSQVRFX0lOXzQ0MzAgfSwKKwl7IC5kaXYgPSAwIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBhYmVfY2xrX2RpdltdID0geworCXsgLnBhcmVudCA9ICZkcGxsX2FiZV9tMngyX2NrLCAucmF0ZXMgPSBkaXYzXzF0bzRfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBhYmVfY2xrID0geworCS5uYW1lCQk9ICJhYmVfY2xrIiwKKwkucGFyZW50CQk9ICZkcGxsX2FiZV9tMngyX2NrLAorCS5jbGtzZWwJCT0gYWJlX2Nsa19kaXYsCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTV9DTEtTRUxfQUJFLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0NMS1NFTF9PUFBfTUFTSywKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9yb3VuZF9yYXRlLAorCS5zZXRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfc2V0X3JhdGUsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgYWVzc19mY2xrX2RpdltdID0geworCXsgLnBhcmVudCA9ICZhYmVfY2xrLCAucmF0ZXMgPSBkaXYyXzF0bzJfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBhZXNzX2ZjbGsgPSB7CisJLm5hbWUJCT0gImFlc3NfZmNsayIsCisJLnBhcmVudAkJPSAmYWJlX2NsaywKKwkuY2xrc2VsCQk9IGFlc3NfZmNsa19kaXYsCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTTFfQUJFX0FFU1NfQ0xLQ1RSTCwKKwkuY2xrc2VsX21hc2sJPSBPTUFQNDQzMF9DTEtTRUxfQUVTU19GQ0xLX01BU0ssCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgZGl2MzFfMXRvMzFfcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gMCwgLmZsYWdzID0gUkFURV9JTl80NDMwIH0sCisJeyAuZGl2ID0gMiwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDMsIC52YWwgPSAyLCAuZmxhZ3MgPSBSQVRFX0lOXzQ0MzAgfSwKKwl7IC5kaXYgPSA0LCAudmFsID0gMywgLmZsYWdzID0gUkFURV9JTl80NDMwIH0sCisJeyAuZGl2ID0gNSwgLnZhbCA9IDQsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDYsIC52YWwgPSA1LCAuZmxhZ3MgPSBSQVRFX0lOXzQ0MzAgfSwKKwl7IC5kaXYgPSA3LCAudmFsID0gNiwgLmZsYWdzID0gUkFURV9JTl80NDMwIH0sCisJeyAuZGl2ID0gOCwgLnZhbCA9IDcsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDksIC52YWwgPSA4LCAuZmxhZ3MgPSBSQVRFX0lOXzQ0MzAgfSwKKwl7IC5kaXYgPSAxMCwgLnZhbCA9IDksIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDExLCAudmFsID0gMTAsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDEyLCAudmFsID0gMTEsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDEzLCAudmFsID0gMTIsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDE0LCAudmFsID0gMTMsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDE1LCAudmFsID0gMTQsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDE2LCAudmFsID0gMTUsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDE3LCAudmFsID0gMTYsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDE4LCAudmFsID0gMTcsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDE5LCAudmFsID0gMTgsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDIwLCAudmFsID0gMTksIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDIxLCAudmFsID0gMjAsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDIyLCAudmFsID0gMjEsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDIzLCAudmFsID0gMjIsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDI0LCAudmFsID0gMjMsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDI1LCAudmFsID0gMjQsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDI2LCAudmFsID0gMjUsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDI3LCAudmFsID0gMjYsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDI4LCAudmFsID0gMjcsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDI5LCAudmFsID0gMjgsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDMwLCAudmFsID0gMjksIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDMxLCAudmFsID0gMzAsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGRwbGxfYWJlX20zX2RpdltdID0geworCXsgLnBhcmVudCA9ICZkcGxsX2FiZV9jaywgLnJhdGVzID0gZGl2MzFfMXRvMzFfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkcGxsX2FiZV9tM19jayA9IHsKKwkubmFtZQkJPSAiZHBsbF9hYmVfbTNfY2siLAorCS5wYXJlbnQJCT0gJmRwbGxfYWJlX2NrLAorCS5jbGtzZWwJCT0gZHBsbF9hYmVfbTNfZGl2LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ01fRElWX00zX0RQTExfQUJFLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0RQTExfQ0xLT1VUSElGX0RJVl9NQVNLLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBjb3JlX2hzZF9ieXBfY2xrX211eF9zZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmZHBsbF9zeXNfcmVmX2NsaywgLnJhdGVzID0gZGl2XzFfMF9yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZkcGxsX2FiZV9tM19jaywgLnJhdGVzID0gZGl2XzFfMV9yYXRlcyB9LAorCXsgLnBhcmVudCA9IE5VTEwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNvcmVfaHNkX2J5cF9jbGtfbXV4X2NrID0geworCS5uYW1lCQk9ICJjb3JlX2hzZF9ieXBfY2xrX211eF9jayIsCisJLnBhcmVudAkJPSAmZHBsbF9zeXNfcmVmX2NsaywKKwkuY2xrc2VsCQk9IGNvcmVfaHNkX2J5cF9jbGtfbXV4X3NlbCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ01fQ0xLU0VMX0RQTExfQ09SRSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQNDQzMF9EUExMX0JZUF9DTEtTRUxfTUFTSywKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKKy8qIERQTExfQ09SRSAqLworc3RhdGljIHN0cnVjdCBkcGxsX2RhdGEgZHBsbF9jb3JlX2RkID0geworCS5tdWx0X2RpdjFfcmVnCT0gT01BUDQ0MzBfQ01fQ0xLU0VMX0RQTExfQ09SRSwKKwkuY2xrX2J5cGFzcwk9ICZjb3JlX2hzZF9ieXBfY2xrX211eF9jaywKKwkuY2xrX3JlZgk9ICZkcGxsX3N5c19yZWZfY2xrLAorCS5jb250cm9sX3JlZwk9IE9NQVA0NDMwX0NNX0NMS01PREVfRFBMTF9DT1JFLAorCS5tb2RlcwkJPSAoMSA8PCBEUExMX0xPV19QT1dFUl9CWVBBU1MpIHwgKDEgPDwgRFBMTF9MT0NLRUQpLAorCS5hdXRvaWRsZV9yZWcJPSBPTUFQNDQzMF9DTV9BVVRPSURMRV9EUExMX0NPUkUsCisJLmlkbGVzdF9yZWcJPSBPTUFQNDQzMF9DTV9JRExFU1RfRFBMTF9DT1JFLAorCS5tdWx0X21hc2sJPSBPTUFQNDQzMF9EUExMX01VTFRfTUFTSywKKwkuZGl2MV9tYXNrCT0gT01BUDQ0MzBfRFBMTF9ESVZfTUFTSywKKwkuZW5hYmxlX21hc2sJPSBPTUFQNDQzMF9EUExMX0VOX01BU0ssCisJLmF1dG9pZGxlX21hc2sJPSBPTUFQNDQzMF9BVVRPX0RQTExfTU9ERV9NQVNLLAorCS5pZGxlc3RfbWFzawk9IE9NQVA0NDMwX1NUX0RQTExfQ0xLX01BU0ssCisJLm1heF9tdWx0aXBsaWVyCT0gT01BUDQ0MzBfTUFYX0RQTExfTVVMVCwKKwkubWF4X2RpdmlkZXIJPSBPTUFQNDQzMF9NQVhfRFBMTF9ESVYsCisJLm1pbl9kaXZpZGVyCT0gMSwKK307CisKKworc3RhdGljIHN0cnVjdCBjbGsgZHBsbF9jb3JlX2NrID0geworCS5uYW1lCQk9ICJkcGxsX2NvcmVfY2siLAorCS5wYXJlbnQJCT0gJmRwbGxfc3lzX3JlZl9jbGssCisJLmRwbGxfZGF0YQk9ICZkcGxsX2NvcmVfZGQsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfZHBsbF9wYXJlbnQsCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJlY2FsYwkJPSAmb21hcDNfZHBsbF9yZWNhbGMsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgZHBsbF9jb3JlX202X2RpdltdID0geworCXsgLnBhcmVudCA9ICZkcGxsX2NvcmVfY2ssIC5yYXRlcyA9IGRpdjMxXzF0bzMxX3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZHBsbF9jb3JlX202X2NrID0geworCS5uYW1lCQk9ICJkcGxsX2NvcmVfbTZfY2siLAorCS5wYXJlbnQJCT0gJmRwbGxfY29yZV9jaywKKwkuY2xrc2VsCQk9IGRwbGxfY29yZV9tNl9kaXYsCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTV9ESVZfTTZfRFBMTF9DT1JFLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0hTRElWSURFUl9DTEtPVVQzX0RJVl9NQVNLLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBkYmdjbGtfbXV4X3NlbFtdID0geworCXsgLnBhcmVudCA9ICZzeXNfY2xraW5fY2ssIC5yYXRlcyA9IGRpdl8xXzBfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmZHBsbF9jb3JlX202X2NrLCAucmF0ZXMgPSBkaXZfMV8xX3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZGJnY2xrX211eF9jayA9IHsKKwkubmFtZQkJPSAiZGJnY2xrX211eF9jayIsCisJLnBhcmVudAkJPSAmc3lzX2Nsa2luX2NrLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZHBsbF9jb3JlX20yX2NrID0geworCS5uYW1lCQk9ICJkcGxsX2NvcmVfbTJfY2siLAorCS5wYXJlbnQJCT0gJmRwbGxfY29yZV9jaywKKwkuY2xrc2VsCQk9IGRwbGxfY29yZV9tNl9kaXYsCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTV9ESVZfTTJfRFBMTF9DT1JFLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0RQTExfQ0xLT1VUX0RJVl9NQVNLLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkZHJwaHlfY2sgPSB7CisJLm5hbWUJCT0gImRkcnBoeV9jayIsCisJLnBhcmVudAkJPSAmZHBsbF9jb3JlX20yX2NrLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZHBsbF9jb3JlX201X2NrID0geworCS5uYW1lCQk9ICJkcGxsX2NvcmVfbTVfY2siLAorCS5wYXJlbnQJCT0gJmRwbGxfY29yZV9jaywKKwkuY2xrc2VsCQk9IGRwbGxfY29yZV9tNl9kaXYsCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTV9ESVZfTTVfRFBMTF9DT1JFLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0hTRElWSURFUl9DTEtPVVQyX0RJVl9NQVNLLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBkaXZfY29yZV9kaXZbXSA9IHsKKwl7IC5wYXJlbnQgPSAmZHBsbF9jb3JlX201X2NrLCAucmF0ZXMgPSBkaXYyXzF0bzJfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkaXZfY29yZV9jayA9IHsKKwkubmFtZQkJPSAiZGl2X2NvcmVfY2siLAorCS5wYXJlbnQJCT0gJmRwbGxfY29yZV9tNV9jaywKKwkuY2xrc2VsCQk9IGRpdl9jb3JlX2RpdiwKKwkuY2xrc2VsX3JlZwk9IE9NQVA0NDMwX0NNX0NMS1NFTF9DT1JFLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0NMS1NFTF9DT1JFX01BU0ssCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgZGl2NF8xdG84X3JhdGVzW10gPSB7CisJeyAuZGl2ID0gMSwgLnZhbCA9IDAsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDIsIC52YWwgPSAxLCAuZmxhZ3MgPSBSQVRFX0lOXzQ0MzAgfSwKKwl7IC5kaXYgPSA0LCAudmFsID0gMiwgLmZsYWdzID0gUkFURV9JTl80NDMwIH0sCisJeyAuZGl2ID0gOCwgLnZhbCA9IDMsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGRpdl9pdmFfaHNfY2xrX2RpdltdID0geworCXsgLnBhcmVudCA9ICZkcGxsX2NvcmVfbTVfY2ssIC5yYXRlcyA9IGRpdjRfMXRvOF9yYXRlcyB9LAorCXsgLnBhcmVudCA9IE5VTEwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGRpdl9pdmFfaHNfY2xrID0geworCS5uYW1lCQk9ICJkaXZfaXZhX2hzX2NsayIsCisJLnBhcmVudAkJPSAmZHBsbF9jb3JlX201X2NrLAorCS5jbGtzZWwJCT0gZGl2X2l2YV9oc19jbGtfZGl2LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ01fQllQQ0xLX0RQTExfSVZBLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0NMS1NFTF8wXzFfTUFTSywKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9yb3VuZF9yYXRlLAorCS5zZXRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfc2V0X3JhdGUsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZGl2X21wdV9oc19jbGsgPSB7CisJLm5hbWUJCT0gImRpdl9tcHVfaHNfY2xrIiwKKwkucGFyZW50CQk9ICZkcGxsX2NvcmVfbTVfY2ssCisJLmNsa3NlbAkJPSBkaXZfaXZhX2hzX2Nsa19kaXYsCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTV9CWVBDTEtfRFBMTF9NUFUsCisJLmNsa3NlbF9tYXNrCT0gT01BUDQ0MzBfQ0xLU0VMXzBfMV9NQVNLLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkcGxsX2NvcmVfbTRfY2sgPSB7CisJLm5hbWUJCT0gImRwbGxfY29yZV9tNF9jayIsCisJLnBhcmVudAkJPSAmZHBsbF9jb3JlX2NrLAorCS5jbGtzZWwJCT0gZHBsbF9jb3JlX202X2RpdiwKKwkuY2xrc2VsX3JlZwk9IE9NQVA0NDMwX0NNX0RJVl9NNF9EUExMX0NPUkUsCisJLmNsa3NlbF9tYXNrCT0gT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDFfRElWX01BU0ssCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGRsbF9jbGtfZGl2X2NrID0geworCS5uYW1lCQk9ICJkbGxfY2xrX2Rpdl9jayIsCisJLnBhcmVudAkJPSAmZHBsbF9jb3JlX200X2NrLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZHBsbF9hYmVfbTJfY2sgPSB7CisJLm5hbWUJCT0gImRwbGxfYWJlX20yX2NrIiwKKwkucGFyZW50CQk9ICZkcGxsX2FiZV9jaywKKwkuY2xrc2VsCQk9IGRwbGxfYWJlX20zX2RpdiwKKwkuY2xrc2VsX3JlZwk9IE9NQVA0NDMwX0NNX0RJVl9NMl9EUExMX0FCRSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQNDQzMF9EUExMX0NMS09VVF9ESVZfTUFTSywKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9yb3VuZF9yYXRlLAorCS5zZXRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfc2V0X3JhdGUsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZHBsbF9jb3JlX20zX2NrID0geworCS5uYW1lCQk9ICJkcGxsX2NvcmVfbTNfY2siLAorCS5wYXJlbnQJCT0gJmRwbGxfY29yZV9jaywKKwkuY2xrc2VsCQk9IGRwbGxfY29yZV9tNl9kaXYsCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTV9ESVZfTTNfRFBMTF9DT1JFLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0RQTExfQ0xLT1VUSElGX0RJVl9NQVNLLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkcGxsX2NvcmVfbTdfY2sgPSB7CisJLm5hbWUJCT0gImRwbGxfY29yZV9tN19jayIsCisJLnBhcmVudAkJPSAmZHBsbF9jb3JlX2NrLAorCS5jbGtzZWwJCT0gZHBsbF9jb3JlX202X2RpdiwKKwkuY2xrc2VsX3JlZwk9IE9NQVA0NDMwX0NNX0RJVl9NN19EUExMX0NPUkUsCisJLmNsa3NlbF9tYXNrCT0gT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDRfRElWX01BU0ssCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGl2YV9oc2RfYnlwX2Nsa19tdXhfc2VsW10gPSB7CisJeyAucGFyZW50ID0gJmRwbGxfc3lzX3JlZl9jbGssIC5yYXRlcyA9IGRpdl8xXzBfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmZGl2X2l2YV9oc19jbGssIC5yYXRlcyA9IGRpdl8xXzFfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBpdmFfaHNkX2J5cF9jbGtfbXV4X2NrID0geworCS5uYW1lCQk9ICJpdmFfaHNkX2J5cF9jbGtfbXV4X2NrIiwKKwkucGFyZW50CQk9ICZkcGxsX3N5c19yZWZfY2xrLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorfTsKKworLyogRFBMTF9JVkEgKi8KK3N0YXRpYyBzdHJ1Y3QgZHBsbF9kYXRhIGRwbGxfaXZhX2RkID0geworCS5tdWx0X2RpdjFfcmVnCT0gT01BUDQ0MzBfQ01fQ0xLU0VMX0RQTExfSVZBLAorCS5jbGtfYnlwYXNzCT0gJml2YV9oc2RfYnlwX2Nsa19tdXhfY2ssCisJLmNsa19yZWYJPSAmZHBsbF9zeXNfcmVmX2NsaywKKwkuY29udHJvbF9yZWcJPSBPTUFQNDQzMF9DTV9DTEtNT0RFX0RQTExfSVZBLAorCS5tb2RlcwkJPSAoMSA8PCBEUExMX0xPV19QT1dFUl9CWVBBU1MpIHwgKDEgPDwgRFBMTF9MT0NLRUQpLAorCS5hdXRvaWRsZV9yZWcJPSBPTUFQNDQzMF9DTV9BVVRPSURMRV9EUExMX0lWQSwKKwkuaWRsZXN0X3JlZwk9IE9NQVA0NDMwX0NNX0lETEVTVF9EUExMX0lWQSwKKwkubXVsdF9tYXNrCT0gT01BUDQ0MzBfRFBMTF9NVUxUX01BU0ssCisJLmRpdjFfbWFzawk9IE9NQVA0NDMwX0RQTExfRElWX01BU0ssCisJLmVuYWJsZV9tYXNrCT0gT01BUDQ0MzBfRFBMTF9FTl9NQVNLLAorCS5hdXRvaWRsZV9tYXNrCT0gT01BUDQ0MzBfQVVUT19EUExMX01PREVfTUFTSywKKwkuaWRsZXN0X21hc2sJPSBPTUFQNDQzMF9TVF9EUExMX0NMS19NQVNLLAorCS5tYXhfbXVsdGlwbGllcgk9IE9NQVA0NDMwX01BWF9EUExMX01VTFQsCisJLm1heF9kaXZpZGVyCT0gT01BUDQ0MzBfTUFYX0RQTExfRElWLAorCS5taW5fZGl2aWRlcgk9IDEsCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGRwbGxfaXZhX2NrID0geworCS5uYW1lCQk9ICJkcGxsX2l2YV9jayIsCisJLnBhcmVudAkJPSAmZHBsbF9zeXNfcmVmX2NsaywKKwkuZHBsbF9kYXRhCT0gJmRwbGxfaXZhX2RkLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2RwbGxfcGFyZW50LAorCS5vcHMJCT0gJmNsa29wc19ub25jb3JlX2RwbGxfb3BzLAorCS5yZWNhbGMJCT0gJm9tYXAzX2RwbGxfcmVjYWxjLAorCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2RwbGxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDNfbm9uY29yZV9kcGxsX3NldF9yYXRlLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGRwbGxfaXZhX200X2RpdltdID0geworCXsgLnBhcmVudCA9ICZkcGxsX2l2YV9jaywgLnJhdGVzID0gZGl2MzFfMXRvMzFfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkcGxsX2l2YV9tNF9jayA9IHsKKwkubmFtZQkJPSAiZHBsbF9pdmFfbTRfY2siLAorCS5wYXJlbnQJCT0gJmRwbGxfaXZhX2NrLAorCS5jbGtzZWwJCT0gZHBsbF9pdmFfbTRfZGl2LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ01fRElWX000X0RQTExfSVZBLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0hTRElWSURFUl9DTEtPVVQxX0RJVl9NQVNLLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkcGxsX2l2YV9tNV9jayA9IHsKKwkubmFtZQkJPSAiZHBsbF9pdmFfbTVfY2siLAorCS5wYXJlbnQJCT0gJmRwbGxfaXZhX2NrLAorCS5jbGtzZWwJCT0gZHBsbF9pdmFfbTRfZGl2LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ01fRElWX001X0RQTExfSVZBLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0hTRElWSURFUl9DTEtPVVQyX0RJVl9NQVNLLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCit9OworCisvKiBEUExMX01QVSAqLworc3RhdGljIHN0cnVjdCBkcGxsX2RhdGEgZHBsbF9tcHVfZGQgPSB7CisJLm11bHRfZGl2MV9yZWcJPSBPTUFQNDQzMF9DTV9DTEtTRUxfRFBMTF9NUFUsCisJLmNsa19ieXBhc3MJPSAmZGl2X21wdV9oc19jbGssCisJLmNsa19yZWYJPSAmZHBsbF9zeXNfcmVmX2NsaywKKwkuY29udHJvbF9yZWcJPSBPTUFQNDQzMF9DTV9DTEtNT0RFX0RQTExfTVBVLAorCS5tb2RlcwkJPSAoMSA8PCBEUExMX0xPV19QT1dFUl9CWVBBU1MpIHwgKDEgPDwgRFBMTF9MT0NLRUQpLAorCS5hdXRvaWRsZV9yZWcJPSBPTUFQNDQzMF9DTV9BVVRPSURMRV9EUExMX01QVSwKKwkuaWRsZXN0X3JlZwk9IE9NQVA0NDMwX0NNX0lETEVTVF9EUExMX01QVSwKKwkubXVsdF9tYXNrCT0gT01BUDQ0MzBfRFBMTF9NVUxUX01BU0ssCisJLmRpdjFfbWFzawk9IE9NQVA0NDMwX0RQTExfRElWX01BU0ssCisJLmVuYWJsZV9tYXNrCT0gT01BUDQ0MzBfRFBMTF9FTl9NQVNLLAorCS5hdXRvaWRsZV9tYXNrCT0gT01BUDQ0MzBfQVVUT19EUExMX01PREVfTUFTSywKKwkuaWRsZXN0X21hc2sJPSBPTUFQNDQzMF9TVF9EUExMX0NMS19NQVNLLAorCS5tYXhfbXVsdGlwbGllcgk9IE9NQVA0NDMwX01BWF9EUExMX01VTFQsCisJLm1heF9kaXZpZGVyCT0gT01BUDQ0MzBfTUFYX0RQTExfRElWLAorCS5taW5fZGl2aWRlcgk9IDEsCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGRwbGxfbXB1X2NrID0geworCS5uYW1lCQk9ICJkcGxsX21wdV9jayIsCisJLnBhcmVudAkJPSAmZHBsbF9zeXNfcmVmX2NsaywKKwkuZHBsbF9kYXRhCT0gJmRwbGxfbXB1X2RkLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2RwbGxfcGFyZW50LAorCS5vcHMJCT0gJmNsa29wc19ub25jb3JlX2RwbGxfb3BzLAorCS5yZWNhbGMJCT0gJm9tYXAzX2RwbGxfcmVjYWxjLAorCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2RwbGxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDNfbm9uY29yZV9kcGxsX3NldF9yYXRlLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGRwbGxfbXB1X20yX2RpdltdID0geworCXsgLnBhcmVudCA9ICZkcGxsX21wdV9jaywgLnJhdGVzID0gZGl2MzFfMXRvMzFfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkcGxsX21wdV9tMl9jayA9IHsKKwkubmFtZQkJPSAiZHBsbF9tcHVfbTJfY2siLAorCS5wYXJlbnQJCT0gJmRwbGxfbXB1X2NrLAorCS5jbGtzZWwJCT0gZHBsbF9tcHVfbTJfZGl2LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ01fRElWX00yX0RQTExfTVBVLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0RQTExfQ0xLT1VUX0RJVl9NQVNLLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBwZXJfaHNfY2xrX2Rpdl9jayA9IHsKKwkubmFtZQkJPSAicGVyX2hzX2Nsa19kaXZfY2siLAorCS5wYXJlbnQJCT0gJmRwbGxfYWJlX20zX2NrLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgcGVyX2hzZF9ieXBfY2xrX211eF9zZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmZHBsbF9zeXNfcmVmX2NsaywgLnJhdGVzID0gZGl2XzFfMF9yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZwZXJfaHNfY2xrX2Rpdl9jaywgLnJhdGVzID0gZGl2XzFfMV9yYXRlcyB9LAorCXsgLnBhcmVudCA9IE5VTEwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBlcl9oc2RfYnlwX2Nsa19tdXhfY2sgPSB7CisJLm5hbWUJCT0gInBlcl9oc2RfYnlwX2Nsa19tdXhfY2siLAorCS5wYXJlbnQJCT0gJmRwbGxfc3lzX3JlZl9jbGssCisJLmNsa3NlbAkJPSBwZXJfaHNkX2J5cF9jbGtfbXV4X3NlbCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ01fQ0xLU0VMX0RQTExfUEVSLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0RQTExfQllQX0NMS1NFTF9NQVNLLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorfTsKKworLyogRFBMTF9QRVIgKi8KK3N0YXRpYyBzdHJ1Y3QgZHBsbF9kYXRhIGRwbGxfcGVyX2RkID0geworCS5tdWx0X2RpdjFfcmVnCT0gT01BUDQ0MzBfQ01fQ0xLU0VMX0RQTExfUEVSLAorCS5jbGtfYnlwYXNzCT0gJnBlcl9oc2RfYnlwX2Nsa19tdXhfY2ssCisJLmNsa19yZWYJPSAmZHBsbF9zeXNfcmVmX2NsaywKKwkuY29udHJvbF9yZWcJPSBPTUFQNDQzMF9DTV9DTEtNT0RFX0RQTExfUEVSLAorCS5tb2RlcwkJPSAoMSA8PCBEUExMX0xPV19QT1dFUl9CWVBBU1MpIHwgKDEgPDwgRFBMTF9MT0NLRUQpLAorCS5hdXRvaWRsZV9yZWcJPSBPTUFQNDQzMF9DTV9BVVRPSURMRV9EUExMX1BFUiwKKwkuaWRsZXN0X3JlZwk9IE9NQVA0NDMwX0NNX0lETEVTVF9EUExMX1BFUiwKKwkubXVsdF9tYXNrCT0gT01BUDQ0MzBfRFBMTF9NVUxUX01BU0ssCisJLmRpdjFfbWFzawk9IE9NQVA0NDMwX0RQTExfRElWX01BU0ssCisJLmVuYWJsZV9tYXNrCT0gT01BUDQ0MzBfRFBMTF9FTl9NQVNLLAorCS5hdXRvaWRsZV9tYXNrCT0gT01BUDQ0MzBfQVVUT19EUExMX01PREVfTUFTSywKKwkuaWRsZXN0X21hc2sJPSBPTUFQNDQzMF9TVF9EUExMX0NMS19NQVNLLAorCS5tYXhfbXVsdGlwbGllcgk9IE9NQVA0NDMwX01BWF9EUExMX01VTFQsCisJLm1heF9kaXZpZGVyCT0gT01BUDQ0MzBfTUFYX0RQTExfRElWLAorCS5taW5fZGl2aWRlcgk9IDEsCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGRwbGxfcGVyX2NrID0geworCS5uYW1lCQk9ICJkcGxsX3Blcl9jayIsCisJLnBhcmVudAkJPSAmZHBsbF9zeXNfcmVmX2NsaywKKwkuZHBsbF9kYXRhCT0gJmRwbGxfcGVyX2RkLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2RwbGxfcGFyZW50LAorCS5vcHMJCT0gJmNsa29wc19ub25jb3JlX2RwbGxfb3BzLAorCS5yZWNhbGMJCT0gJm9tYXAzX2RwbGxfcmVjYWxjLAorCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2RwbGxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDNfbm9uY29yZV9kcGxsX3NldF9yYXRlLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGRwbGxfcGVyX20yX2RpdltdID0geworCXsgLnBhcmVudCA9ICZkcGxsX3Blcl9jaywgLnJhdGVzID0gZGl2MzFfMXRvMzFfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkcGxsX3Blcl9tMl9jayA9IHsKKwkubmFtZQkJPSAiZHBsbF9wZXJfbTJfY2siLAorCS5wYXJlbnQJCT0gJmRwbGxfcGVyX2NrLAorCS5jbGtzZWwJCT0gZHBsbF9wZXJfbTJfZGl2LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ01fRElWX00yX0RQTExfUEVSLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0RQTExfQ0xLT1VUX0RJVl9NQVNLLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkcGxsX3Blcl9tMngyX2NrID0geworCS5uYW1lCQk9ICJkcGxsX3Blcl9tMngyX2NrIiwKKwkucGFyZW50CQk9ICZkcGxsX3Blcl9jaywKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGRwbGxfcGVyX20zX2NrID0geworCS5uYW1lCQk9ICJkcGxsX3Blcl9tM19jayIsCisJLnBhcmVudAkJPSAmZHBsbF9wZXJfY2ssCisJLmNsa3NlbAkJPSBkcGxsX3Blcl9tMl9kaXYsCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTV9ESVZfTTNfRFBMTF9QRVIsCisJLmNsa3NlbF9tYXNrCT0gT01BUDQ0MzBfRFBMTF9DTEtPVVRISUZfRElWX01BU0ssCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGRwbGxfcGVyX200X2NrID0geworCS5uYW1lCQk9ICJkcGxsX3Blcl9tNF9jayIsCisJLnBhcmVudAkJPSAmZHBsbF9wZXJfY2ssCisJLmNsa3NlbAkJPSBkcGxsX3Blcl9tMl9kaXYsCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTV9ESVZfTTRfRFBMTF9QRVIsCisJLmNsa3NlbF9tYXNrCT0gT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDFfRElWX01BU0ssCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGRwbGxfcGVyX201X2NrID0geworCS5uYW1lCQk9ICJkcGxsX3Blcl9tNV9jayIsCisJLnBhcmVudAkJPSAmZHBsbF9wZXJfY2ssCisJLmNsa3NlbAkJPSBkcGxsX3Blcl9tMl9kaXYsCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTV9ESVZfTTVfRFBMTF9QRVIsCisJLmNsa3NlbF9tYXNrCT0gT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDJfRElWX01BU0ssCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGRwbGxfcGVyX202X2NrID0geworCS5uYW1lCQk9ICJkcGxsX3Blcl9tNl9jayIsCisJLnBhcmVudAkJPSAmZHBsbF9wZXJfY2ssCisJLmNsa3NlbAkJPSBkcGxsX3Blcl9tMl9kaXYsCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTV9ESVZfTTZfRFBMTF9QRVIsCisJLmNsa3NlbF9tYXNrCT0gT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDNfRElWX01BU0ssCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGRwbGxfcGVyX203X2NrID0geworCS5uYW1lCQk9ICJkcGxsX3Blcl9tN19jayIsCisJLnBhcmVudAkJPSAmZHBsbF9wZXJfY2ssCisJLmNsa3NlbAkJPSBkcGxsX3Blcl9tMl9kaXYsCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTV9ESVZfTTdfRFBMTF9QRVIsCisJLmNsa3NlbF9tYXNrCT0gT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDRfRElWX01BU0ssCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKKy8qIERQTExfVU5JUFJPICovCitzdGF0aWMgc3RydWN0IGRwbGxfZGF0YSBkcGxsX3VuaXByb19kZCA9IHsKKwkubXVsdF9kaXYxX3JlZwk9IE9NQVA0NDMwX0NNX0NMS1NFTF9EUExMX1VOSVBSTywKKwkuY2xrX2J5cGFzcwk9ICZkcGxsX3N5c19yZWZfY2xrLAorCS5jbGtfcmVmCT0gJmRwbGxfc3lzX3JlZl9jbGssCisJLmNvbnRyb2xfcmVnCT0gT01BUDQ0MzBfQ01fQ0xLTU9ERV9EUExMX1VOSVBSTywKKwkubW9kZXMJCT0gKDEgPDwgRFBMTF9MT1dfUE9XRVJfQllQQVNTKSB8ICgxIDw8IERQTExfTE9DS0VEKSwKKwkuYXV0b2lkbGVfcmVnCT0gT01BUDQ0MzBfQ01fQVVUT0lETEVfRFBMTF9VTklQUk8sCisJLmlkbGVzdF9yZWcJPSBPTUFQNDQzMF9DTV9JRExFU1RfRFBMTF9VTklQUk8sCisJLm11bHRfbWFzawk9IE9NQVA0NDMwX0RQTExfTVVMVF9NQVNLLAorCS5kaXYxX21hc2sJPSBPTUFQNDQzMF9EUExMX0RJVl9NQVNLLAorCS5lbmFibGVfbWFzawk9IE9NQVA0NDMwX0RQTExfRU5fTUFTSywKKwkuYXV0b2lkbGVfbWFzawk9IE9NQVA0NDMwX0FVVE9fRFBMTF9NT0RFX01BU0ssCisJLmlkbGVzdF9tYXNrCT0gT01BUDQ0MzBfU1RfRFBMTF9DTEtfTUFTSywKKwkubWF4X211bHRpcGxpZXIJPSBPTUFQNDQzMF9NQVhfRFBMTF9NVUxULAorCS5tYXhfZGl2aWRlcgk9IE9NQVA0NDMwX01BWF9EUExMX0RJViwKKwkubWluX2RpdmlkZXIJPSAxLAorfTsKKworCitzdGF0aWMgc3RydWN0IGNsayBkcGxsX3VuaXByb19jayA9IHsKKwkubmFtZQkJPSAiZHBsbF91bmlwcm9fY2siLAorCS5wYXJlbnQJCT0gJmRwbGxfc3lzX3JlZl9jbGssCisJLmRwbGxfZGF0YQk9ICZkcGxsX3VuaXByb19kZCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9kcGxsX3BhcmVudCwKKwkub3BzCQk9ICZjbGtvcHNfbm9uY29yZV9kcGxsX29wcywKKwkucmVjYWxjCQk9ICZvbWFwM19kcGxsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9kcGxsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gJm9tYXAzX25vbmNvcmVfZHBsbF9zZXRfcmF0ZSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBkcGxsX3VuaXByb19tMngyX2RpdltdID0geworCXsgLnBhcmVudCA9ICZkcGxsX3VuaXByb19jaywgLnJhdGVzID0gZGl2MzFfMXRvMzFfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkcGxsX3VuaXByb19tMngyX2NrID0geworCS5uYW1lCQk9ICJkcGxsX3VuaXByb19tMngyX2NrIiwKKwkucGFyZW50CQk9ICZkcGxsX3VuaXByb19jaywKKwkuY2xrc2VsCQk9IGRwbGxfdW5pcHJvX20yeDJfZGl2LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ01fRElWX00yX0RQTExfVU5JUFJPLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0RQTExfQ0xLT1VUX0RJVl9NQVNLLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB1c2JfaHNfY2xrX2Rpdl9jayA9IHsKKwkubmFtZQkJPSAidXNiX2hzX2Nsa19kaXZfY2siLAorCS5wYXJlbnQJCT0gJmRwbGxfYWJlX20zX2NrLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorfTsKKworLyogRFBMTF9VU0IgKi8KK3N0YXRpYyBzdHJ1Y3QgZHBsbF9kYXRhIGRwbGxfdXNiX2RkID0geworCS5tdWx0X2RpdjFfcmVnCT0gT01BUDQ0MzBfQ01fQ0xLU0VMX0RQTExfVVNCLAorCS5jbGtfYnlwYXNzCT0gJnVzYl9oc19jbGtfZGl2X2NrLAorCS5jbGtfcmVmCT0gJmRwbGxfc3lzX3JlZl9jbGssCisJLmNvbnRyb2xfcmVnCT0gT01BUDQ0MzBfQ01fQ0xLTU9ERV9EUExMX1VTQiwKKwkubW9kZXMJCT0gKDEgPDwgRFBMTF9MT1dfUE9XRVJfQllQQVNTKSB8ICgxIDw8IERQTExfTE9DS0VEKSwKKwkuYXV0b2lkbGVfcmVnCT0gT01BUDQ0MzBfQ01fQVVUT0lETEVfRFBMTF9VU0IsCisJLmlkbGVzdF9yZWcJPSBPTUFQNDQzMF9DTV9JRExFU1RfRFBMTF9VU0IsCisJLm11bHRfbWFzawk9IE9NQVA0NDMwX0RQTExfTVVMVF9NQVNLLAorCS5kaXYxX21hc2sJPSBPTUFQNDQzMF9EUExMX0RJVl9NQVNLLAorCS5lbmFibGVfbWFzawk9IE9NQVA0NDMwX0RQTExfRU5fTUFTSywKKwkuYXV0b2lkbGVfbWFzawk9IE9NQVA0NDMwX0FVVE9fRFBMTF9NT0RFX01BU0ssCisJLmlkbGVzdF9tYXNrCT0gT01BUDQ0MzBfU1RfRFBMTF9DTEtfTUFTSywKKwkubWF4X211bHRpcGxpZXIJPSBPTUFQNDQzMF9NQVhfRFBMTF9NVUxULAorCS5tYXhfZGl2aWRlcgk9IE9NQVA0NDMwX01BWF9EUExMX0RJViwKKwkubWluX2RpdmlkZXIJPSAxLAorfTsKKworCitzdGF0aWMgc3RydWN0IGNsayBkcGxsX3VzYl9jayA9IHsKKwkubmFtZQkJPSAiZHBsbF91c2JfY2siLAorCS5wYXJlbnQJCT0gJmRwbGxfc3lzX3JlZl9jbGssCisJLmRwbGxfZGF0YQk9ICZkcGxsX3VzYl9kZCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9kcGxsX3BhcmVudCwKKwkub3BzCQk9ICZjbGtvcHNfbm9uY29yZV9kcGxsX29wcywKKwkucmVjYWxjCQk9ICZvbWFwM19kcGxsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9kcGxsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gJm9tYXAzX25vbmNvcmVfZHBsbF9zZXRfcmF0ZSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkcGxsX3VzYl9jbGtkY29sZG9fY2sgPSB7CisJLm5hbWUJCT0gImRwbGxfdXNiX2Nsa2Rjb2xkb19jayIsCisJLnBhcmVudAkJPSAmZHBsbF91c2JfY2ssCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBkcGxsX3VzYl9tMl9kaXZbXSA9IHsKKwl7IC5wYXJlbnQgPSAmZHBsbF91c2JfY2ssIC5yYXRlcyA9IGRpdjMxXzF0bzMxX3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZHBsbF91c2JfbTJfY2sgPSB7CisJLm5hbWUJCT0gImRwbGxfdXNiX20yX2NrIiwKKwkucGFyZW50CQk9ICZkcGxsX3VzYl9jaywKKwkuY2xrc2VsCQk9IGRwbGxfdXNiX20yX2RpdiwKKwkuY2xrc2VsX3JlZwk9IE9NQVA0NDMwX0NNX0RJVl9NMl9EUExMX1VTQiwKKwkuY2xrc2VsX21hc2sJPSBPTUFQNDQzMF9EUExMX0NMS09VVF9ESVZfMF82X01BU0ssCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGR1Y2F0aV9jbGtfbXV4X3NlbFtdID0geworCXsgLnBhcmVudCA9ICZkaXZfY29yZV9jaywgLnJhdGVzID0gZGl2XzFfMF9yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZkcGxsX3Blcl9tNl9jaywgLnJhdGVzID0gZGl2XzFfMV9yYXRlcyB9LAorCXsgLnBhcmVudCA9IE5VTEwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGR1Y2F0aV9jbGtfbXV4X2NrID0geworCS5uYW1lCQk9ICJkdWNhdGlfY2xrX211eF9jayIsCisJLnBhcmVudAkJPSAmZGl2X2NvcmVfY2ssCisJLmNsa3NlbAkJPSBkdWNhdGlfY2xrX211eF9zZWwsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuY2xrc2VsX3JlZwk9IE9NQVA0NDMwX0NNX0NMS1NFTF9EVUNBVElfSVNTX1JPT1QsCisJLmNsa3NlbF9tYXNrCT0gT01BUDQ0MzBfQ0xLU0VMXzBfMF9NQVNLLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZnVuY18xMm1fZmNsayA9IHsKKwkubmFtZQkJPSAiZnVuY18xMm1fZmNsayIsCisJLnBhcmVudAkJPSAmZHBsbF9wZXJfbTJ4Ml9jaywKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGZ1bmNfMjRtX2NsayA9IHsKKwkubmFtZQkJPSAiZnVuY18yNG1fY2xrIiwKKwkucGFyZW50CQk9ICZkcGxsX3Blcl9tMl9jaywKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGZ1bmNfMjRtY19mY2xrID0geworCS5uYW1lCQk9ICJmdW5jXzI0bWNfZmNsayIsCisJLnBhcmVudAkJPSAmZHBsbF9wZXJfbTJ4Ml9jaywKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgZGl2Ml80dG84X3JhdGVzW10gPSB7CisJeyAuZGl2ID0gNCwgLnZhbCA9IDAsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDgsIC52YWwgPSAxLCAuZmxhZ3MgPSBSQVRFX0lOXzQ0MzAgfSwKKwl7IC5kaXYgPSAwIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBmdW5jXzQ4bV9mY2xrX2RpdltdID0geworCXsgLnBhcmVudCA9ICZkcGxsX3Blcl9tMngyX2NrLCAucmF0ZXMgPSBkaXYyXzR0bzhfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBmdW5jXzQ4bV9mY2xrID0geworCS5uYW1lCQk9ICJmdW5jXzQ4bV9mY2xrIiwKKwkucGFyZW50CQk9ICZkcGxsX3Blcl9tMngyX2NrLAorCS5jbGtzZWwJCT0gZnVuY180OG1fZmNsa19kaXYsCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTV9TQ0FMRV9GQ0xLLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX1NDQUxFX0ZDTEtfTUFTSywKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9yb3VuZF9yYXRlLAorCS5zZXRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfc2V0X3JhdGUsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZnVuY180OG1jX2ZjbGsgPSB7CisJLm5hbWUJCT0gImZ1bmNfNDhtY19mY2xrIiwKKwkucGFyZW50CQk9ICZkcGxsX3Blcl9tMngyX2NrLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBkaXYyXzJ0bzRfcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAyLCAudmFsID0gMCwgLmZsYWdzID0gUkFURV9JTl80NDMwIH0sCisJeyAuZGl2ID0gNCwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGZ1bmNfNjRtX2ZjbGtfZGl2W10gPSB7CisJeyAucGFyZW50ID0gJmRwbGxfcGVyX200X2NrLCAucmF0ZXMgPSBkaXYyXzJ0bzRfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBmdW5jXzY0bV9mY2xrID0geworCS5uYW1lCQk9ICJmdW5jXzY0bV9mY2xrIiwKKwkucGFyZW50CQk9ICZkcGxsX3Blcl9tNF9jaywKKwkuY2xrc2VsCQk9IGZ1bmNfNjRtX2ZjbGtfZGl2LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ01fU0NBTEVfRkNMSywKKwkuY2xrc2VsX21hc2sJPSBPTUFQNDQzMF9TQ0FMRV9GQ0xLX01BU0ssCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGZ1bmNfOTZtX2ZjbGtfZGl2W10gPSB7CisJeyAucGFyZW50ID0gJmRwbGxfcGVyX20yeDJfY2ssIC5yYXRlcyA9IGRpdjJfMnRvNF9yYXRlcyB9LAorCXsgLnBhcmVudCA9IE5VTEwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGZ1bmNfOTZtX2ZjbGsgPSB7CisJLm5hbWUJCT0gImZ1bmNfOTZtX2ZjbGsiLAorCS5wYXJlbnQJCT0gJmRwbGxfcGVyX20yeDJfY2ssCisJLmNsa3NlbAkJPSBmdW5jXzk2bV9mY2xrX2RpdiwKKwkuY2xrc2VsX3JlZwk9IE9NQVA0NDMwX0NNX1NDQUxFX0ZDTEssCisJLmNsa3NlbF9tYXNrCT0gT01BUDQ0MzBfU0NBTEVfRkNMS19NQVNLLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBoc21tYzZfZmNsa19zZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmZnVuY182NG1fZmNsaywgLnJhdGVzID0gZGl2XzFfMF9yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZmdW5jXzk2bV9mY2xrLCAucmF0ZXMgPSBkaXZfMV8xX3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgaHNtbWM2X2ZjbGsgPSB7CisJLm5hbWUJCT0gImhzbW1jNl9mY2xrIiwKKwkucGFyZW50CQk9ICZmdW5jXzY0bV9mY2xrLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBkaXYyXzF0bzhfcmF0ZXNbXSA9IHsKKwl7IC5kaXYgPSAxLCAudmFsID0gMCwgLmZsYWdzID0gUkFURV9JTl80NDMwIH0sCisJeyAuZGl2ID0gOCwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fNDQzMCB9LAorCXsgLmRpdiA9IDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGluaXRfNjBtX2ZjbGtfZGl2W10gPSB7CisJeyAucGFyZW50ID0gJmRwbGxfdXNiX20yX2NrLCAucmF0ZXMgPSBkaXYyXzF0bzhfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBpbml0XzYwbV9mY2xrID0geworCS5uYW1lCQk9ICJpbml0XzYwbV9mY2xrIiwKKwkucGFyZW50CQk9ICZkcGxsX3VzYl9tMl9jaywKKwkuY2xrc2VsCQk9IGluaXRfNjBtX2ZjbGtfZGl2LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ01fQ0xLU0VMX1VTQl82ME1IWiwKKwkuY2xrc2VsX21hc2sJPSBPTUFQNDQzMF9DTEtTRUxfMF8wX01BU0ssCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGwzX2Rpdl9kaXZbXSA9IHsKKwl7IC5wYXJlbnQgPSAmZGl2X2NvcmVfY2ssIC5yYXRlcyA9IGRpdjJfMXRvMl9yYXRlcyB9LAorCXsgLnBhcmVudCA9IE5VTEwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGwzX2Rpdl9jayA9IHsKKwkubmFtZQkJPSAibDNfZGl2X2NrIiwKKwkucGFyZW50CQk9ICZkaXZfY29yZV9jaywKKwkuY2xrc2VsCQk9IGwzX2Rpdl9kaXYsCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTV9DTEtTRUxfQ09SRSwKKwkuY2xrc2VsX21hc2sJPSBPTUFQNDQzMF9DTEtTRUxfTDNfTUFTSywKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9yb3VuZF9yYXRlLAorCS5zZXRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfc2V0X3JhdGUsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgbDRfZGl2X2RpdltdID0geworCXsgLnBhcmVudCA9ICZsM19kaXZfY2ssIC5yYXRlcyA9IGRpdjJfMXRvMl9yYXRlcyB9LAorCXsgLnBhcmVudCA9IE5VTEwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGw0X2Rpdl9jayA9IHsKKwkubmFtZQkJPSAibDRfZGl2X2NrIiwKKwkucGFyZW50CQk9ICZsM19kaXZfY2ssCisJLmNsa3NlbAkJPSBsNF9kaXZfZGl2LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ01fQ0xLU0VMX0NPUkUsCisJLmNsa3NlbF9tYXNrCT0gT01BUDQ0MzBfQ0xLU0VMX0w0X01BU0ssCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGxwX2Nsa19kaXZfY2sgPSB7CisJLm5hbWUJCT0gImxwX2Nsa19kaXZfY2siLAorCS5wYXJlbnQJCT0gJmRwbGxfYWJlX20yeDJfY2ssCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBsNF93a3VwX2Nsa19tdXhfc2VsW10gPSB7CisJeyAucGFyZW50ID0gJnN5c19jbGtpbl9jaywgLnJhdGVzID0gZGl2XzFfMF9yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZscF9jbGtfZGl2X2NrLCAucmF0ZXMgPSBkaXZfMV8xX3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbDRfd2t1cF9jbGtfbXV4X2NrID0geworCS5uYW1lCQk9ICJsNF93a3VwX2Nsa19tdXhfY2siLAorCS5wYXJlbnQJCT0gJnN5c19jbGtpbl9jaywKKwkuY2xrc2VsCQk9IGw0X3drdXBfY2xrX211eF9zZWwsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuY2xrc2VsX3JlZwk9IE9NQVA0NDMwX0NNX0w0X1dLVVBfQ0xLU0VMLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0NMS1NFTF8wXzBfTUFTSywKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIHBlcl9hYmVfbmNfZmNsa19kaXZbXSA9IHsKKwl7IC5wYXJlbnQgPSAmZHBsbF9hYmVfbTJfY2ssIC5yYXRlcyA9IGRpdjJfMXRvMl9yYXRlcyB9LAorCXsgLnBhcmVudCA9IE5VTEwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBlcl9hYmVfbmNfZmNsayA9IHsKKwkubmFtZQkJPSAicGVyX2FiZV9uY19mY2xrIiwKKwkucGFyZW50CQk9ICZkcGxsX2FiZV9tMl9jaywKKwkuY2xrc2VsCQk9IHBlcl9hYmVfbmNfZmNsa19kaXYsCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTV9TQ0FMRV9GQ0xLLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX1NDQUxFX0ZDTEtfTUFTSywKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9yb3VuZF9yYXRlLAorCS5zZXRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfc2V0X3JhdGUsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgbWNhc3AyX2ZjbGtfc2VsW10gPSB7CisJeyAucGFyZW50ID0gJmZ1bmNfOTZtX2ZjbGssIC5yYXRlcyA9IGRpdl8xXzBfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmcGVyX2FiZV9uY19mY2xrLCAucmF0ZXMgPSBkaXZfMV8xX3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNhc3AyX2ZjbGsgPSB7CisJLm5hbWUJCT0gIm1jYXNwMl9mY2xrIiwKKwkucGFyZW50CQk9ICZmdW5jXzk2bV9mY2xrLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNhc3AzX2ZjbGsgPSB7CisJLm5hbWUJCT0gIm1jYXNwM19mY2xrIiwKKwkucGFyZW50CQk9ICZmdW5jXzk2bV9mY2xrLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgb2NwX2FiZV9pY2xrID0geworCS5uYW1lCQk9ICJvY3BfYWJlX2ljbGsiLAorCS5wYXJlbnQJCT0gJmFlc3NfZmNsaywKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBlcl9hYmVfMjRtX2ZjbGsgPSB7CisJLm5hbWUJCT0gInBlcl9hYmVfMjRtX2ZjbGsiLAorCS5wYXJlbnQJCT0gJmRwbGxfYWJlX20yX2NrLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgcG1kX3N0bV9jbG9ja19tdXhfc2VsW10gPSB7CisJeyAucGFyZW50ID0gJnN5c19jbGtpbl9jaywgLnJhdGVzID0gZGl2XzFfMF9yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZkcGxsX2NvcmVfbTZfY2ssIC5yYXRlcyA9IGRpdl8xXzFfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmZHBsbF9wZXJfbTdfY2ssIC5yYXRlcyA9IGRpdl8xXzJfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBwbWRfc3RtX2Nsb2NrX211eF9jayA9IHsKKwkubmFtZQkJPSAicG1kX3N0bV9jbG9ja19tdXhfY2siLAorCS5wYXJlbnQJCT0gJnN5c19jbGtpbl9jaywKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBtZF90cmFjZV9jbGtfbXV4X2NrID0geworCS5uYW1lCQk9ICJwbWRfdHJhY2VfY2xrX211eF9jayIsCisJLnBhcmVudAkJPSAmc3lzX2Nsa2luX2NrLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgc3ljX2Nsa19kaXZfY2sgPSB7CisJLm5hbWUJCT0gInN5Y19jbGtfZGl2X2NrIiwKKwkucGFyZW50CQk9ICZzeXNfY2xraW5fY2ssCisJLmNsa3NlbAkJPSBkcGxsX3N5c19yZWZfY2xrX2RpdiwKKwkuY2xrc2VsX3JlZwk9IE9NQVA0NDMwX0NNX0FCRV9EU1NfU1lTX0NMS1NFTCwKKwkuY2xrc2VsX21hc2sJPSBPTUFQNDQzMF9DTEtTRUxfMF8wX01BU0ssCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKKy8qIExlYWYgY2xvY2tzIGNvbnRyb2xsZWQgYnkgbW9kdWxlcyAqLworCitzdGF0aWMgc3RydWN0IGNsayBhZXMxX2NrID0geworCS5uYW1lCQk9ICJhZXMxX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX0w0U0VDX0FFUzFfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfU1dDVFJMLAorCS5jbGtkbV9uYW1lCT0gImw0X3NlY3VyZV9jbGtkbSIsCisJLnBhcmVudAkJPSAmbDNfZGl2X2NrLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBhZXMyX2NrID0geworCS5uYW1lCQk9ICJhZXMyX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX0w0U0VDX0FFUzJfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfU1dDVFJMLAorCS5jbGtkbV9uYW1lCT0gImw0X3NlY3VyZV9jbGtkbSIsCisJLnBhcmVudAkJPSAmbDNfZGl2X2NrLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBhZXNzX2NrID0geworCS5uYW1lCQk9ICJhZXNzX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNMV9BQkVfQUVTU19DTEtDVFJMLAorCS5lbmFibGVfYml0CT0gT01BUDQ0MzBfTU9EVUxFTU9ERV9TV0NUUkwsCisJLmNsa2RtX25hbWUJPSAiYWJlX2Nsa2RtIiwKKwkucGFyZW50CQk9ICZhZXNzX2ZjbGssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGN1c3RfZWZ1c2VfY2sgPSB7CisJLm5hbWUJCT0gImN1c3RfZWZ1c2VfY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5lbmFibGVfcmVnCT0gT01BUDQ0MzBfQ01fQ0VGVVNFX0NFRlVTRV9DTEtDVFJMLAorCS5lbmFibGVfYml0CT0gT01BUDQ0MzBfTU9EVUxFTU9ERV9TV0NUUkwsCisJLmNsa2RtX25hbWUJPSAibDRfY2VmdXNlX2Nsa2RtIiwKKwkucGFyZW50CQk9ICZzeXNfY2xraW5fY2ssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGRlczNkZXNfY2sgPSB7CisJLm5hbWUJCT0gImRlczNkZXNfY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5lbmFibGVfcmVnCT0gT01BUDQ0MzBfQ01fTDRTRUNfREVTM0RFU19DTEtDVFJMLAorCS5lbmFibGVfYml0CT0gT01BUDQ0MzBfTU9EVUxFTU9ERV9TV0NUUkwsCisJLmNsa2RtX25hbWUJPSAibDRfc2VjdXJlX2Nsa2RtIiwKKwkucGFyZW50CQk9ICZsNF9kaXZfY2ssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGRtaWNfc3luY19tdXhfc2VsW10gPSB7CisJeyAucGFyZW50ID0gJmFiZV8yNG1fZmNsaywgLnJhdGVzID0gZGl2XzFfMF9yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZzeWNfY2xrX2Rpdl9jaywgLnJhdGVzID0gZGl2XzFfMV9yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZmdW5jXzI0bV9jbGssIC5yYXRlcyA9IGRpdl8xXzJfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkbWljX3N5bmNfbXV4X2NrID0geworCS5uYW1lCQk9ICJkbWljX3N5bmNfbXV4X2NrIiwKKwkucGFyZW50CQk9ICZhYmVfMjRtX2ZjbGssCisJLmNsa3NlbAkJPSBkbWljX3N5bmNfbXV4X3NlbCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ00xX0FCRV9ETUlDX0NMS0NUUkwsCisJLmNsa3NlbF9tYXNrCT0gT01BUDQ0MzBfQ0xLU0VMX0lOVEVSTkFMX1NPVVJDRV9NQVNLLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgZnVuY19kbWljX2FiZV9nZmNsa19zZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmZG1pY19zeW5jX211eF9jaywgLnJhdGVzID0gZGl2XzFfMF9yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZwYWRfY2xrc19jaywgLnJhdGVzID0gZGl2XzFfMV9yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZzbGltYnVzX2NsaywgLnJhdGVzID0gZGl2XzFfMl9yYXRlcyB9LAorCXsgLnBhcmVudCA9IE5VTEwgfSwKK307CisKKy8qIE1lcmdlZCBmdW5jX2RtaWNfYWJlX2dmY2xrIGludG8gZG1pY19jayAqLworc3RhdGljIHN0cnVjdCBjbGsgZG1pY19jayA9IHsKKwkubmFtZQkJPSAiZG1pY19jayIsCisJLnBhcmVudAkJPSAmZG1pY19zeW5jX211eF9jaywKKwkuY2xrc2VsCQk9IGZ1bmNfZG1pY19hYmVfZ2ZjbGtfc2VsLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTTFfQUJFX0RNSUNfQ0xLQ1RSTCwKKwkuY2xrc2VsX21hc2sJPSBPTUFQNDQzMF9DTEtTRUxfU09VUkNFX01BU0ssCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCisJLmVuYWJsZV9yZWcJPSBPTUFQNDQzMF9DTTFfQUJFX0RNSUNfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfU1dDVFJMLAorCS5jbGtkbV9uYW1lCT0gImFiZV9jbGtkbSIsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkc3NfY2sgPSB7CisJLm5hbWUJCT0gImRzc19jayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLmVuYWJsZV9yZWcJPSBPTUFQNDQzMF9DTV9EU1NfRFNTX0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX1NXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJsM19kc3NfY2xrZG0iLAorCS5wYXJlbnQJCT0gJmwzX2Rpdl9jaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZHVjYXRpX2NrID0geworCS5uYW1lCQk9ICJkdWNhdGlfY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5lbmFibGVfcmVnCT0gT01BUDQ0MzBfQ01fRFVDQVRJX0RVQ0FUSV9DTEtDVFJMLAorCS5lbmFibGVfYml0CT0gT01BUDQ0MzBfTU9EVUxFTU9ERV9IV0NUUkwsCisJLmNsa2RtX25hbWUJPSAiZHVjYXRpX2Nsa2RtIiwKKwkucGFyZW50CQk9ICZkdWNhdGlfY2xrX211eF9jaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZW1pZjFfY2sgPSB7CisJLm5hbWUJCT0gImVtaWYxX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX01FTUlGX0VNSUZfMV9DTEtDVFJMLAorCS5lbmFibGVfYml0CT0gT01BUDQ0MzBfTU9EVUxFTU9ERV9IV0NUUkwsCisJLmNsa2RtX25hbWUJPSAibDNfZW1pZl9jbGtkbSIsCisJLnBhcmVudAkJPSAmZGRycGh5X2NrLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBlbWlmMl9jayA9IHsKKwkubmFtZQkJPSAiZW1pZjJfY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5lbmFibGVfcmVnCT0gT01BUDQ0MzBfQ01fTUVNSUZfRU1JRl8yX0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX0hXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJsM19lbWlmX2Nsa2RtIiwKKwkucGFyZW50CQk9ICZkZHJwaHlfY2ssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGZkaWZfZmNsa19kaXZbXSA9IHsKKwl7IC5wYXJlbnQgPSAmZHBsbF9wZXJfbTRfY2ssIC5yYXRlcyA9IGRpdjNfMXRvNF9yYXRlcyB9LAorCXsgLnBhcmVudCA9IE5VTEwgfSwKK307CisKKy8qIE1lcmdlZCBmZGlmX2ZjbGsgaW50byBmZGlmX2NrICovCitzdGF0aWMgc3RydWN0IGNsayBmZGlmX2NrID0geworCS5uYW1lCQk9ICJmZGlmX2NrIiwKKwkucGFyZW50CQk9ICZkcGxsX3Blcl9tNF9jaywKKwkuY2xrc2VsCQk9IGZkaWZfZmNsa19kaXYsCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTV9DQU1fRkRJRl9DTEtDVFJMLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0NMS1NFTF9GQ0xLX01BU0ssCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX0NBTV9GRElGX0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX1NXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJpc3NfY2xrZG0iLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgcGVyX3NneF9mY2xrX2RpdltdID0geworCXsgLnBhcmVudCA9ICZkcGxsX3Blcl9tMngyX2NrLCAucmF0ZXMgPSBkaXYzXzF0bzRfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBwZXJfc2d4X2ZjbGsgPSB7CisJLm5hbWUJCT0gInBlcl9zZ3hfZmNsayIsCisJLnBhcmVudAkJPSAmZHBsbF9wZXJfbTJ4Ml9jaywKKwkuY2xrc2VsCQk9IHBlcl9zZ3hfZmNsa19kaXYsCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTV9HRlhfR0ZYX0NMS0NUUkwsCisJLmNsa3NlbF9tYXNrCT0gT01BUDQ0MzBfQ0xLU0VMX1BFUl8xOTJNX01BU0ssCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIHNneF9jbGtfbXV4X3NlbFtdID0geworCXsgLnBhcmVudCA9ICZkcGxsX2NvcmVfbTdfY2ssIC5yYXRlcyA9IGRpdl8xXzBfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmcGVyX3NneF9mY2xrLCAucmF0ZXMgPSBkaXZfMV8xX3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9LAorfTsKKworLyogTWVyZ2VkIHNneF9jbGtfbXV4IGludG8gZ2Z4X2NrICovCitzdGF0aWMgc3RydWN0IGNsayBnZnhfY2sgPSB7CisJLm5hbWUJCT0gImdmeF9jayIsCisJLnBhcmVudAkJPSAmZHBsbF9jb3JlX203X2NrLAorCS5jbGtzZWwJCT0gc2d4X2Nsa19tdXhfc2VsLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTV9HRlhfR0ZYX0NMS0NUUkwsCisJLmNsa3NlbF9tYXNrCT0gT01BUDQ0MzBfQ0xLU0VMX1NHWF9GQ0xLX01BU0ssCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCisJLmVuYWJsZV9yZWcJPSBPTUFQNDQzMF9DTV9HRlhfR0ZYX0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX1NXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJsM19nZnhfY2xrZG0iLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZ3BpbzFfY2sgPSB7CisJLm5hbWUJCT0gImdwaW8xX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX1dLVVBfR1BJTzFfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfSFdDVFJMLAorCS5jbGtkbV9uYW1lCT0gImw0X3drdXBfY2xrZG0iLAorCS5wYXJlbnQJCT0gJmw0X3drdXBfY2xrX211eF9jaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZ3BpbzJfY2sgPSB7CisJLm5hbWUJCT0gImdwaW8yX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX0w0UEVSX0dQSU8yX0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX0hXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJsNF9wZXJfY2xrZG0iLAorCS5wYXJlbnQJCT0gJmw0X2Rpdl9jaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZ3BpbzNfY2sgPSB7CisJLm5hbWUJCT0gImdwaW8zX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX0w0UEVSX0dQSU8zX0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX0hXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJsNF9wZXJfY2xrZG0iLAorCS5wYXJlbnQJCT0gJmw0X2Rpdl9jaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZ3BpbzRfY2sgPSB7CisJLm5hbWUJCT0gImdwaW80X2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX0w0UEVSX0dQSU80X0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX0hXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJsNF9wZXJfY2xrZG0iLAorCS5wYXJlbnQJCT0gJmw0X2Rpdl9jaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZ3BpbzVfY2sgPSB7CisJLm5hbWUJCT0gImdwaW81X2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX0w0UEVSX0dQSU81X0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX0hXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJsNF9wZXJfY2xrZG0iLAorCS5wYXJlbnQJCT0gJmw0X2Rpdl9jaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZ3BpbzZfY2sgPSB7CisJLm5hbWUJCT0gImdwaW82X2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX0w0UEVSX0dQSU82X0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX0hXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJsNF9wZXJfY2xrZG0iLAorCS5wYXJlbnQJCT0gJmw0X2Rpdl9jaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZ3BtY19jayA9IHsKKwkubmFtZQkJPSAiZ3BtY19jayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLmVuYWJsZV9yZWcJPSBPTUFQNDQzMF9DTV9MM18yX0dQTUNfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfSFdDVFJMLAorCS5jbGtkbV9uYW1lCT0gImwzXzJfY2xrZG0iLAorCS5wYXJlbnQJCT0gJmwzX2Rpdl9jaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgZG10MV9jbGtfbXV4X3NlbFtdID0geworCXsgLnBhcmVudCA9ICZzeXNfY2xraW5fY2ssIC5yYXRlcyA9IGRpdl8xXzBfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmc3lzXzMya19jaywgLnJhdGVzID0gZGl2XzFfMV9yYXRlcyB9LAorCXsgLnBhcmVudCA9IE5VTEwgfSwKK307CisKKy8qIE1lcmdlZCBkbXQxX2Nsa19tdXggaW50byBncHRpbWVyMV9jayAqLworc3RhdGljIHN0cnVjdCBjbGsgZ3B0aW1lcjFfY2sgPSB7CisJLm5hbWUJCT0gImdwdGltZXIxX2NrIiwKKwkucGFyZW50CQk9ICZzeXNfY2xraW5fY2ssCisJLmNsa3NlbAkJPSBkbXQxX2Nsa19tdXhfc2VsLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTV9XS1VQX1RJTUVSMV9DTEtDVFJMLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0NMS1NFTF9NQVNLLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorCS5lbmFibGVfcmVnCT0gT01BUDQ0MzBfQ01fV0tVUF9USU1FUjFfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfU1dDVFJMLAorCS5jbGtkbV9uYW1lCT0gImw0X3drdXBfY2xrZG0iLAorfTsKKworLyogTWVyZ2VkIGNtMl9kbTEwX211eCBpbnRvIGdwdGltZXIxMF9jayAqLworc3RhdGljIHN0cnVjdCBjbGsgZ3B0aW1lcjEwX2NrID0geworCS5uYW1lCQk9ICJncHRpbWVyMTBfY2siLAorCS5wYXJlbnQJCT0gJnN5c19jbGtpbl9jaywKKwkuY2xrc2VsCQk9IGRtdDFfY2xrX211eF9zZWwsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuY2xrc2VsX3JlZwk9IE9NQVA0NDMwX0NNX0w0UEVSX0RNVElNRVIxMF9DTEtDVFJMLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0NMS1NFTF9NQVNLLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorCS5lbmFibGVfcmVnCT0gT01BUDQ0MzBfQ01fTDRQRVJfRE1USU1FUjEwX0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX1NXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJsNF9wZXJfY2xrZG0iLAorfTsKKworLyogTWVyZ2VkIGNtMl9kbTExX211eCBpbnRvIGdwdGltZXIxMV9jayAqLworc3RhdGljIHN0cnVjdCBjbGsgZ3B0aW1lcjExX2NrID0geworCS5uYW1lCQk9ICJncHRpbWVyMTFfY2siLAorCS5wYXJlbnQJCT0gJnN5c19jbGtpbl9jaywKKwkuY2xrc2VsCQk9IGRtdDFfY2xrX211eF9zZWwsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuY2xrc2VsX3JlZwk9IE9NQVA0NDMwX0NNX0w0UEVSX0RNVElNRVIxMV9DTEtDVFJMLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0NMS1NFTF9NQVNLLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorCS5lbmFibGVfcmVnCT0gT01BUDQ0MzBfQ01fTDRQRVJfRE1USU1FUjExX0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX1NXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJsNF9wZXJfY2xrZG0iLAorfTsKKworLyogTWVyZ2VkIGNtMl9kbTJfbXV4IGludG8gZ3B0aW1lcjJfY2sgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIGdwdGltZXIyX2NrID0geworCS5uYW1lCQk9ICJncHRpbWVyMl9jayIsCisJLnBhcmVudAkJPSAmc3lzX2Nsa2luX2NrLAorCS5jbGtzZWwJCT0gZG10MV9jbGtfbXV4X3NlbCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ01fTDRQRVJfRE1USU1FUjJfQ0xLQ1RSTCwKKwkuY2xrc2VsX21hc2sJPSBPTUFQNDQzMF9DTEtTRUxfTUFTSywKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX0w0UEVSX0RNVElNRVIyX0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX1NXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJsNF9wZXJfY2xrZG0iLAorfTsKKworLyogTWVyZ2VkIGNtMl9kbTNfbXV4IGludG8gZ3B0aW1lcjNfY2sgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIGdwdGltZXIzX2NrID0geworCS5uYW1lCQk9ICJncHRpbWVyM19jayIsCisJLnBhcmVudAkJPSAmc3lzX2Nsa2luX2NrLAorCS5jbGtzZWwJCT0gZG10MV9jbGtfbXV4X3NlbCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ01fTDRQRVJfRE1USU1FUjNfQ0xLQ1RSTCwKKwkuY2xrc2VsX21hc2sJPSBPTUFQNDQzMF9DTEtTRUxfTUFTSywKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX0w0UEVSX0RNVElNRVIzX0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX1NXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJsNF9wZXJfY2xrZG0iLAorfTsKKworLyogTWVyZ2VkIGNtMl9kbTRfbXV4IGludG8gZ3B0aW1lcjRfY2sgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIGdwdGltZXI0X2NrID0geworCS5uYW1lCQk9ICJncHRpbWVyNF9jayIsCisJLnBhcmVudAkJPSAmc3lzX2Nsa2luX2NrLAorCS5jbGtzZWwJCT0gZG10MV9jbGtfbXV4X3NlbCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ01fTDRQRVJfRE1USU1FUjRfQ0xLQ1RSTCwKKwkuY2xrc2VsX21hc2sJPSBPTUFQNDQzMF9DTEtTRUxfTUFTSywKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX0w0UEVSX0RNVElNRVI0X0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX1NXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJsNF9wZXJfY2xrZG0iLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgdGltZXI1X3N5bmNfbXV4X3NlbFtdID0geworCXsgLnBhcmVudCA9ICZzeWNfY2xrX2Rpdl9jaywgLnJhdGVzID0gZGl2XzFfMF9yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZzeXNfMzJrX2NrLCAucmF0ZXMgPSBkaXZfMV8xX3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9LAorfTsKKworLyogTWVyZ2VkIHRpbWVyNV9zeW5jX211eCBpbnRvIGdwdGltZXI1X2NrICovCitzdGF0aWMgc3RydWN0IGNsayBncHRpbWVyNV9jayA9IHsKKwkubmFtZQkJPSAiZ3B0aW1lcjVfY2siLAorCS5wYXJlbnQJCT0gJnN5Y19jbGtfZGl2X2NrLAorCS5jbGtzZWwJCT0gdGltZXI1X3N5bmNfbXV4X3NlbCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ00xX0FCRV9USU1FUjVfQ0xLQ1RSTCwKKwkuY2xrc2VsX21hc2sJPSBPTUFQNDQzMF9DTEtTRUxfTUFTSywKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNMV9BQkVfVElNRVI1X0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX1NXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJhYmVfY2xrZG0iLAorfTsKKworLyogTWVyZ2VkIHRpbWVyNl9zeW5jX211eCBpbnRvIGdwdGltZXI2X2NrICovCitzdGF0aWMgc3RydWN0IGNsayBncHRpbWVyNl9jayA9IHsKKwkubmFtZQkJPSAiZ3B0aW1lcjZfY2siLAorCS5wYXJlbnQJCT0gJnN5Y19jbGtfZGl2X2NrLAorCS5jbGtzZWwJCT0gdGltZXI1X3N5bmNfbXV4X3NlbCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ00xX0FCRV9USU1FUjZfQ0xLQ1RSTCwKKwkuY2xrc2VsX21hc2sJPSBPTUFQNDQzMF9DTEtTRUxfTUFTSywKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNMV9BQkVfVElNRVI2X0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX1NXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJhYmVfY2xrZG0iLAorfTsKKworLyogTWVyZ2VkIHRpbWVyN19zeW5jX211eCBpbnRvIGdwdGltZXI3X2NrICovCitzdGF0aWMgc3RydWN0IGNsayBncHRpbWVyN19jayA9IHsKKwkubmFtZQkJPSAiZ3B0aW1lcjdfY2siLAorCS5wYXJlbnQJCT0gJnN5Y19jbGtfZGl2X2NrLAorCS5jbGtzZWwJCT0gdGltZXI1X3N5bmNfbXV4X3NlbCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ00xX0FCRV9USU1FUjdfQ0xLQ1RSTCwKKwkuY2xrc2VsX21hc2sJPSBPTUFQNDQzMF9DTEtTRUxfTUFTSywKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNMV9BQkVfVElNRVI3X0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX1NXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJhYmVfY2xrZG0iLAorfTsKKworLyogTWVyZ2VkIHRpbWVyOF9zeW5jX211eCBpbnRvIGdwdGltZXI4X2NrICovCitzdGF0aWMgc3RydWN0IGNsayBncHRpbWVyOF9jayA9IHsKKwkubmFtZQkJPSAiZ3B0aW1lcjhfY2siLAorCS5wYXJlbnQJCT0gJnN5Y19jbGtfZGl2X2NrLAorCS5jbGtzZWwJCT0gdGltZXI1X3N5bmNfbXV4X3NlbCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ00xX0FCRV9USU1FUjhfQ0xLQ1RSTCwKKwkuY2xrc2VsX21hc2sJPSBPTUFQNDQzMF9DTEtTRUxfTUFTSywKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNMV9BQkVfVElNRVI4X0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX1NXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJhYmVfY2xrZG0iLAorfTsKKworLyogTWVyZ2VkIGNtMl9kbTlfbXV4IGludG8gZ3B0aW1lcjlfY2sgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIGdwdGltZXI5X2NrID0geworCS5uYW1lCQk9ICJncHRpbWVyOV9jayIsCisJLnBhcmVudAkJPSAmc3lzX2Nsa2luX2NrLAorCS5jbGtzZWwJCT0gZG10MV9jbGtfbXV4X3NlbCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ01fTDRQRVJfRE1USU1FUjlfQ0xLQ1RSTCwKKwkuY2xrc2VsX21hc2sJPSBPTUFQNDQzMF9DTEtTRUxfTUFTSywKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX0w0UEVSX0RNVElNRVI5X0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX1NXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJsNF9wZXJfY2xrZG0iLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgaGRxMXdfY2sgPSB7CisJLm5hbWUJCT0gImhkcTF3X2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX0w0UEVSX0hEUTFXX0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX1NXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJsNF9wZXJfY2xrZG0iLAorCS5wYXJlbnQJCT0gJmZ1bmNfMTJtX2ZjbGssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKKy8qIE1lcmdlZCBoc2lfZmNsayBpbnRvIGhzaV9jayAqLworc3RhdGljIHN0cnVjdCBjbGsgaHNpX2NrID0geworCS5uYW1lCQk9ICJoc2lfY2siLAorCS5wYXJlbnQJCT0gJmRwbGxfcGVyX20yeDJfY2ssCisJLmNsa3NlbAkJPSBwZXJfc2d4X2ZjbGtfZGl2LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ01fTDNJTklUX0hTSV9DTEtDVFJMLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0NMS1NFTF8yNF8yNV9NQVNLLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCisJLmVuYWJsZV9yZWcJPSBPTUFQNDQzMF9DTV9MM0lOSVRfSFNJX0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX0hXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJsM19pbml0X2Nsa2RtIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGkyYzFfY2sgPSB7CisJLm5hbWUJCT0gImkyYzFfY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5lbmFibGVfcmVnCT0gT01BUDQ0MzBfQ01fTDRQRVJfSTJDMV9DTEtDVFJMLAorCS5lbmFibGVfYml0CT0gT01BUDQ0MzBfTU9EVUxFTU9ERV9TV0NUUkwsCisJLmNsa2RtX25hbWUJPSAibDRfcGVyX2Nsa2RtIiwKKwkucGFyZW50CQk9ICZmdW5jXzk2bV9mY2xrLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBpMmMyX2NrID0geworCS5uYW1lCQk9ICJpMmMyX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX0w0UEVSX0kyQzJfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfU1dDVFJMLAorCS5jbGtkbV9uYW1lCT0gImw0X3Blcl9jbGtkbSIsCisJLnBhcmVudAkJPSAmZnVuY185Nm1fZmNsaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgaTJjM19jayA9IHsKKwkubmFtZQkJPSAiaTJjM19jayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLmVuYWJsZV9yZWcJPSBPTUFQNDQzMF9DTV9MNFBFUl9JMkMzX0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX1NXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJsNF9wZXJfY2xrZG0iLAorCS5wYXJlbnQJCT0gJmZ1bmNfOTZtX2ZjbGssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGkyYzRfY2sgPSB7CisJLm5hbWUJCT0gImkyYzRfY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5lbmFibGVfcmVnCT0gT01BUDQ0MzBfQ01fTDRQRVJfSTJDNF9DTEtDVFJMLAorCS5lbmFibGVfYml0CT0gT01BUDQ0MzBfTU9EVUxFTU9ERV9TV0NUUkwsCisJLmNsa2RtX25hbWUJPSAibDRfcGVyX2Nsa2RtIiwKKwkucGFyZW50CQk9ICZmdW5jXzk2bV9mY2xrLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBpc3NfY2sgPSB7CisJLm5hbWUJCT0gImlzc19jayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLmVuYWJsZV9yZWcJPSBPTUFQNDQzMF9DTV9DQU1fSVNTX0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX1NXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJpc3NfY2xrZG0iLAorCS5wYXJlbnQJCT0gJmR1Y2F0aV9jbGtfbXV4X2NrLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBpdmFoZF9jayA9IHsKKwkubmFtZQkJPSAiaXZhaGRfY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5lbmFibGVfcmVnCT0gT01BUDQ0MzBfQ01fSVZBSERfSVZBSERfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfSFdDVFJMLAorCS5jbGtkbV9uYW1lCT0gIml2YWhkX2Nsa2RtIiwKKwkucGFyZW50CQk9ICZkcGxsX2l2YV9tNV9jaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsga2V5Ym9hcmRfY2sgPSB7CisJLm5hbWUJCT0gImtleWJvYXJkX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX1dLVVBfS0VZQk9BUkRfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfU1dDVFJMLAorCS5jbGtkbV9uYW1lCT0gImw0X3drdXBfY2xrZG0iLAorCS5wYXJlbnQJCT0gJnN5c18zMmtfY2ssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGwzX2luc3RyX2ludGVyY29ubmVjdF9jayA9IHsKKwkubmFtZQkJPSAibDNfaW5zdHJfaW50ZXJjb25uZWN0X2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX0wzSU5TVFJfTDNfSU5TVFJfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfSFdDVFJMLAorCS5jbGtkbV9uYW1lCT0gImwzX2luc3RyX2Nsa2RtIiwKKwkucGFyZW50CQk9ICZsM19kaXZfY2ssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGwzX2ludGVyY29ubmVjdF8zX2NrID0geworCS5uYW1lCQk9ICJsM19pbnRlcmNvbm5lY3RfM19jayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLmVuYWJsZV9yZWcJPSBPTUFQNDQzMF9DTV9MM0lOU1RSX0wzXzNfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfSFdDVFJMLAorCS5jbGtkbV9uYW1lCT0gImwzX2luc3RyX2Nsa2RtIiwKKwkucGFyZW50CQk9ICZsM19kaXZfY2ssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1jYXNwX3N5bmNfbXV4X2NrID0geworCS5uYW1lCQk9ICJtY2FzcF9zeW5jX211eF9jayIsCisJLnBhcmVudAkJPSAmYWJlXzI0bV9mY2xrLAorCS5jbGtzZWwJCT0gZG1pY19zeW5jX211eF9zZWwsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuY2xrc2VsX3JlZwk9IE9NQVA0NDMwX0NNMV9BQkVfTUNBU1BfQ0xLQ1RSTCwKKwkuY2xrc2VsX21hc2sJPSBPTUFQNDQzMF9DTEtTRUxfSU5URVJOQUxfU09VUkNFX01BU0ssCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBmdW5jX21jYXNwX2FiZV9nZmNsa19zZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmbWNhc3Bfc3luY19tdXhfY2ssIC5yYXRlcyA9IGRpdl8xXzBfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmcGFkX2Nsa3NfY2ssIC5yYXRlcyA9IGRpdl8xXzFfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmc2xpbWJ1c19jbGssIC5yYXRlcyA9IGRpdl8xXzJfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCisvKiBNZXJnZWQgZnVuY19tY2FzcF9hYmVfZ2ZjbGsgaW50byBtY2FzcF9jayAqLworc3RhdGljIHN0cnVjdCBjbGsgbWNhc3BfY2sgPSB7CisJLm5hbWUJCT0gIm1jYXNwX2NrIiwKKwkucGFyZW50CQk9ICZtY2FzcF9zeW5jX211eF9jaywKKwkuY2xrc2VsCQk9IGZ1bmNfbWNhc3BfYWJlX2dmY2xrX3NlbCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ00xX0FCRV9NQ0FTUF9DTEtDVFJMLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0NMS1NFTF9TT1VSQ0VfTUFTSywKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNMV9BQkVfTUNBU1BfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfU1dDVFJMLAorCS5jbGtkbV9uYW1lCT0gImFiZV9jbGtkbSIsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBtY2JzcDFfc3luY19tdXhfY2sgPSB7CisJLm5hbWUJCT0gIm1jYnNwMV9zeW5jX211eF9jayIsCisJLnBhcmVudAkJPSAmYWJlXzI0bV9mY2xrLAorCS5jbGtzZWwJCT0gZG1pY19zeW5jX211eF9zZWwsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuY2xrc2VsX3JlZwk9IE9NQVA0NDMwX0NNMV9BQkVfTUNCU1AxX0NMS0NUUkwsCisJLmNsa3NlbF9tYXNrCT0gT01BUDQ0MzBfQ0xLU0VMX0lOVEVSTkFMX1NPVVJDRV9NQVNLLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgZnVuY19tY2JzcDFfZ2ZjbGtfc2VsW10gPSB7CisJeyAucGFyZW50ID0gJm1jYnNwMV9zeW5jX211eF9jaywgLnJhdGVzID0gZGl2XzFfMF9yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZwYWRfY2xrc19jaywgLnJhdGVzID0gZGl2XzFfMV9yYXRlcyB9LAorCXsgLnBhcmVudCA9ICZzbGltYnVzX2NsaywgLnJhdGVzID0gZGl2XzFfMl9yYXRlcyB9LAorCXsgLnBhcmVudCA9IE5VTEwgfSwKK307CisKKy8qIE1lcmdlZCBmdW5jX21jYnNwMV9nZmNsayBpbnRvIG1jYnNwMV9jayAqLworc3RhdGljIHN0cnVjdCBjbGsgbWNic3AxX2NrID0geworCS5uYW1lCQk9ICJtY2JzcDFfY2siLAorCS5wYXJlbnQJCT0gJm1jYnNwMV9zeW5jX211eF9jaywKKwkuY2xrc2VsCQk9IGZ1bmNfbWNic3AxX2dmY2xrX3NlbCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ00xX0FCRV9NQ0JTUDFfQ0xLQ1RSTCwKKwkuY2xrc2VsX21hc2sJPSBPTUFQNDQzMF9DTEtTRUxfU09VUkNFX01BU0ssCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCisJLmVuYWJsZV9yZWcJPSBPTUFQNDQzMF9DTTFfQUJFX01DQlNQMV9DTEtDVFJMLAorCS5lbmFibGVfYml0CT0gT01BUDQ0MzBfTU9EVUxFTU9ERV9TV0NUUkwsCisJLmNsa2RtX25hbWUJPSAiYWJlX2Nsa2RtIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1jYnNwMl9zeW5jX211eF9jayA9IHsKKwkubmFtZQkJPSAibWNic3AyX3N5bmNfbXV4X2NrIiwKKwkucGFyZW50CQk9ICZhYmVfMjRtX2ZjbGssCisJLmNsa3NlbAkJPSBkbWljX3N5bmNfbXV4X3NlbCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ00xX0FCRV9NQ0JTUDJfQ0xLQ1RSTCwKKwkuY2xrc2VsX21hc2sJPSBPTUFQNDQzMF9DTEtTRUxfSU5URVJOQUxfU09VUkNFX01BU0ssCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBmdW5jX21jYnNwMl9nZmNsa19zZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmbWNic3AyX3N5bmNfbXV4X2NrLCAucmF0ZXMgPSBkaXZfMV8wX3JhdGVzIH0sCisJeyAucGFyZW50ID0gJnBhZF9jbGtzX2NrLCAucmF0ZXMgPSBkaXZfMV8xX3JhdGVzIH0sCisJeyAucGFyZW50ID0gJnNsaW1idXNfY2xrLCAucmF0ZXMgPSBkaXZfMV8yX3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9LAorfTsKKworLyogTWVyZ2VkIGZ1bmNfbWNic3AyX2dmY2xrIGludG8gbWNic3AyX2NrICovCitzdGF0aWMgc3RydWN0IGNsayBtY2JzcDJfY2sgPSB7CisJLm5hbWUJCT0gIm1jYnNwMl9jayIsCisJLnBhcmVudAkJPSAmbWNic3AyX3N5bmNfbXV4X2NrLAorCS5jbGtzZWwJCT0gZnVuY19tY2JzcDJfZ2ZjbGtfc2VsLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTTFfQUJFX01DQlNQMl9DTEtDVFJMLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0NMS1NFTF9TT1VSQ0VfTUFTSywKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNMV9BQkVfTUNCU1AyX0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX1NXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJhYmVfY2xrZG0iLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNic3AzX3N5bmNfbXV4X2NrID0geworCS5uYW1lCQk9ICJtY2JzcDNfc3luY19tdXhfY2siLAorCS5wYXJlbnQJCT0gJmFiZV8yNG1fZmNsaywKKwkuY2xrc2VsCQk9IGRtaWNfc3luY19tdXhfc2VsLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTTFfQUJFX01DQlNQM19DTEtDVFJMLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0NMS1NFTF9JTlRFUk5BTF9TT1VSQ0VfTUFTSywKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIGZ1bmNfbWNic3AzX2dmY2xrX3NlbFtdID0geworCXsgLnBhcmVudCA9ICZtY2JzcDNfc3luY19tdXhfY2ssIC5yYXRlcyA9IGRpdl8xXzBfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmcGFkX2Nsa3NfY2ssIC5yYXRlcyA9IGRpdl8xXzFfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmc2xpbWJ1c19jbGssIC5yYXRlcyA9IGRpdl8xXzJfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCisvKiBNZXJnZWQgZnVuY19tY2JzcDNfZ2ZjbGsgaW50byBtY2JzcDNfY2sgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIG1jYnNwM19jayA9IHsKKwkubmFtZQkJPSAibWNic3AzX2NrIiwKKwkucGFyZW50CQk9ICZtY2JzcDNfc3luY19tdXhfY2ssCisJLmNsa3NlbAkJPSBmdW5jX21jYnNwM19nZmNsa19zZWwsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuY2xrc2VsX3JlZwk9IE9NQVA0NDMwX0NNMV9BQkVfTUNCU1AzX0NMS0NUUkwsCisJLmNsa3NlbF9tYXNrCT0gT01BUDQ0MzBfQ0xLU0VMX1NPVVJDRV9NQVNLLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorCS5lbmFibGVfcmVnCT0gT01BUDQ0MzBfQ00xX0FCRV9NQ0JTUDNfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfU1dDVFJMLAorCS5jbGtkbV9uYW1lCT0gImFiZV9jbGtkbSIsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBtY2JzcDRfc3luY19tdXhfY2sgPSB7CisJLm5hbWUJCT0gIm1jYnNwNF9zeW5jX211eF9jayIsCisJLnBhcmVudAkJPSAmZnVuY185Nm1fZmNsaywKKwkuY2xrc2VsCQk9IG1jYXNwMl9mY2xrX3NlbCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ01fTDRQRVJfTUNCU1A0X0NMS0NUUkwsCisJLmNsa3NlbF9tYXNrCT0gT01BUDQ0MzBfQ0xLU0VMX0lOVEVSTkFMX1NPVVJDRV9NQVNLLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgcGVyX21jYnNwNF9nZmNsa19zZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmbWNic3A0X3N5bmNfbXV4X2NrLCAucmF0ZXMgPSBkaXZfMV8wX3JhdGVzIH0sCisJeyAucGFyZW50ID0gJnBhZF9jbGtzX2NrLCAucmF0ZXMgPSBkaXZfMV8xX3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9LAorfTsKKworLyogTWVyZ2VkIHBlcl9tY2JzcDRfZ2ZjbGsgaW50byBtY2JzcDRfY2sgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIG1jYnNwNF9jayA9IHsKKwkubmFtZQkJPSAibWNic3A0X2NrIiwKKwkucGFyZW50CQk9ICZtY2JzcDRfc3luY19tdXhfY2ssCisJLmNsa3NlbAkJPSBwZXJfbWNic3A0X2dmY2xrX3NlbCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ01fTDRQRVJfTUNCU1A0X0NMS0NUUkwsCisJLmNsa3NlbF9tYXNrCT0gT01BUDQ0MzBfQ0xLU0VMX1NPVVJDRV8yNF8yNF9NQVNLLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorCS5lbmFibGVfcmVnCT0gT01BUDQ0MzBfQ01fTDRQRVJfTUNCU1A0X0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX1NXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJsNF9wZXJfY2xrZG0iLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNzcGkxX2NrID0geworCS5uYW1lCQk9ICJtY3NwaTFfY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5lbmFibGVfcmVnCT0gT01BUDQ0MzBfQ01fTDRQRVJfTUNTUEkxX0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX1NXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJsNF9wZXJfY2xrZG0iLAorCS5wYXJlbnQJCT0gJmZ1bmNfNDhtX2ZjbGssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1jc3BpMl9jayA9IHsKKwkubmFtZQkJPSAibWNzcGkyX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX0w0UEVSX01DU1BJMl9DTEtDVFJMLAorCS5lbmFibGVfYml0CT0gT01BUDQ0MzBfTU9EVUxFTU9ERV9TV0NUUkwsCisJLmNsa2RtX25hbWUJPSAibDRfcGVyX2Nsa2RtIiwKKwkucGFyZW50CQk9ICZmdW5jXzQ4bV9mY2xrLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBtY3NwaTNfY2sgPSB7CisJLm5hbWUJCT0gIm1jc3BpM19jayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLmVuYWJsZV9yZWcJPSBPTUFQNDQzMF9DTV9MNFBFUl9NQ1NQSTNfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfU1dDVFJMLAorCS5jbGtkbV9uYW1lCT0gImw0X3Blcl9jbGtkbSIsCisJLnBhcmVudAkJPSAmZnVuY180OG1fZmNsaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbWNzcGk0X2NrID0geworCS5uYW1lCQk9ICJtY3NwaTRfY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5lbmFibGVfcmVnCT0gT01BUDQ0MzBfQ01fTDRQRVJfTUNTUEk0X0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX1NXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJsNF9wZXJfY2xrZG0iLAorCS5wYXJlbnQJCT0gJmZ1bmNfNDhtX2ZjbGssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKKy8qIE1lcmdlZCBoc21tYzFfZmNsayBpbnRvIG1tYzFfY2sgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIG1tYzFfY2sgPSB7CisJLm5hbWUJCT0gIm1tYzFfY2siLAorCS5wYXJlbnQJCT0gJmZ1bmNfNjRtX2ZjbGssCisJLmNsa3NlbAkJPSBoc21tYzZfZmNsa19zZWwsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuY2xrc2VsX3JlZwk9IE9NQVA0NDMwX0NNX0wzSU5JVF9NTUMxX0NMS0NUUkwsCisJLmNsa3NlbF9tYXNrCT0gT01BUDQ0MzBfQ0xLU0VMX01BU0ssCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCisJLmVuYWJsZV9yZWcJPSBPTUFQNDQzMF9DTV9MM0lOSVRfTU1DMV9DTEtDVFJMLAorCS5lbmFibGVfYml0CT0gT01BUDQ0MzBfTU9EVUxFTU9ERV9TV0NUUkwsCisJLmNsa2RtX25hbWUJPSAibDNfaW5pdF9jbGtkbSIsCit9OworCisvKiBNZXJnZWQgaHNtbWMyX2ZjbGsgaW50byBtbWMyX2NrICovCitzdGF0aWMgc3RydWN0IGNsayBtbWMyX2NrID0geworCS5uYW1lCQk9ICJtbWMyX2NrIiwKKwkucGFyZW50CQk9ICZmdW5jXzY0bV9mY2xrLAorCS5jbGtzZWwJCT0gaHNtbWM2X2ZjbGtfc2VsLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTV9MM0lOSVRfTU1DMl9DTEtDVFJMLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0NMS1NFTF9NQVNLLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorCS5lbmFibGVfcmVnCT0gT01BUDQ0MzBfQ01fTDNJTklUX01NQzJfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfU1dDVFJMLAorCS5jbGtkbV9uYW1lCT0gImwzX2luaXRfY2xrZG0iLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbW1jM19jayA9IHsKKwkubmFtZQkJPSAibW1jM19jayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLmVuYWJsZV9yZWcJPSBPTUFQNDQzMF9DTV9MNFBFUl9NTUNTRDNfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfU1dDVFJMLAorCS5jbGtkbV9uYW1lCT0gImw0X3Blcl9jbGtkbSIsCisJLnBhcmVudAkJPSAmZnVuY180OG1fZmNsaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbW1jNF9jayA9IHsKKwkubmFtZQkJPSAibW1jNF9jayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLmVuYWJsZV9yZWcJPSBPTUFQNDQzMF9DTV9MNFBFUl9NTUNTRDRfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfU1dDVFJMLAorCS5jbGtkbV9uYW1lCT0gImw0X3Blcl9jbGtkbSIsCisJLnBhcmVudAkJPSAmZnVuY180OG1fZmNsaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbW1jNV9jayA9IHsKKwkubmFtZQkJPSAibW1jNV9jayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLmVuYWJsZV9yZWcJPSBPTUFQNDQzMF9DTV9MNFBFUl9NTUNTRDVfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfU1dDVFJMLAorCS5jbGtkbV9uYW1lCT0gImw0X3Blcl9jbGtkbSIsCisJLnBhcmVudAkJPSAmZnVuY180OG1fZmNsaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgb2NwX3dwMV9jayA9IHsKKwkubmFtZQkJPSAib2NwX3dwMV9jayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLmVuYWJsZV9yZWcJPSBPTUFQNDQzMF9DTV9MM0lOU1RSX09DUF9XUDFfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfSFdDVFJMLAorCS5jbGtkbV9uYW1lCT0gImwzX2luc3RyX2Nsa2RtIiwKKwkucGFyZW50CQk9ICZsM19kaXZfY2ssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBkbV9jayA9IHsKKwkubmFtZQkJPSAicGRtX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNMV9BQkVfUERNX0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX1NXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJhYmVfY2xrZG0iLAorCS5wYXJlbnQJCT0gJnBhZF9jbGtzX2NrLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBwa2FlaXAyOV9jayA9IHsKKwkubmFtZQkJPSAicGthZWlwMjlfY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5lbmFibGVfcmVnCT0gT01BUDQ0MzBfQ01fTDRTRUNfUEtBRUlQMjlfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfU1dDVFJMLAorCS5jbGtkbV9uYW1lCT0gImw0X3NlY3VyZV9jbGtkbSIsCisJLnBhcmVudAkJPSAmbDRfZGl2X2NrLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBybmdfY2sgPSB7CisJLm5hbWUJCT0gInJuZ19jayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLmVuYWJsZV9yZWcJPSBPTUFQNDQzMF9DTV9MNFNFQ19STkdfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfSFdDVFJMLAorCS5jbGtkbV9uYW1lCT0gImw0X3NlY3VyZV9jbGtkbSIsCisJLnBhcmVudAkJPSAmbDRfZGl2X2NrLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBzaGEybWQ1MV9jayA9IHsKKwkubmFtZQkJPSAic2hhMm1kNTFfY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5lbmFibGVfcmVnCT0gT01BUDQ0MzBfQ01fTDRTRUNfU0hBMk1ENTFfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfU1dDVFJMLAorCS5jbGtkbV9uYW1lCT0gImw0X3NlY3VyZV9jbGtkbSIsCisJLnBhcmVudAkJPSAmbDNfZGl2X2NrLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBzbDJfY2sgPSB7CisJLm5hbWUJCT0gInNsMl9jayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLmVuYWJsZV9yZWcJPSBPTUFQNDQzMF9DTV9JVkFIRF9TTDJfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfSFdDVFJMLAorCS5jbGtkbV9uYW1lCT0gIml2YWhkX2Nsa2RtIiwKKwkucGFyZW50CQk9ICZkcGxsX2l2YV9tNV9jaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgc2xpbWJ1czFfY2sgPSB7CisJLm5hbWUJCT0gInNsaW1idXMxX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNMV9BQkVfU0xJTUJVU19DTEtDVFJMLAorCS5lbmFibGVfYml0CT0gT01BUDQ0MzBfTU9EVUxFTU9ERV9TV0NUUkwsCisJLmNsa2RtX25hbWUJPSAiYWJlX2Nsa2RtIiwKKwkucGFyZW50CQk9ICZvY3BfYWJlX2ljbGssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNsaW1idXMyX2NrID0geworCS5uYW1lCQk9ICJzbGltYnVzMl9jayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLmVuYWJsZV9yZWcJPSBPTUFQNDQzMF9DTV9MNFBFUl9TTElNQlVTMl9DTEtDVFJMLAorCS5lbmFibGVfYml0CT0gT01BUDQ0MzBfTU9EVUxFTU9ERV9TV0NUUkwsCisJLmNsa2RtX25hbWUJPSAibDRfcGVyX2Nsa2RtIiwKKwkucGFyZW50CQk9ICZsNF9kaXZfY2ssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNyX2NvcmVfY2sgPSB7CisJLm5hbWUJCT0gInNyX2NvcmVfY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5lbmFibGVfcmVnCT0gT01BUDQ0MzBfQ01fQUxXT05fU1JfQ09SRV9DTEtDVFJMLAorCS5lbmFibGVfYml0CT0gT01BUDQ0MzBfTU9EVUxFTU9ERV9TV0NUUkwsCisJLmNsa2RtX25hbWUJPSAibDRfYW9fY2xrZG0iLAorCS5wYXJlbnQJCT0gJmw0X3drdXBfY2xrX211eF9jaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgc3JfaXZhX2NrID0geworCS5uYW1lCQk9ICJzcl9pdmFfY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5lbmFibGVfcmVnCT0gT01BUDQ0MzBfQ01fQUxXT05fU1JfSVZBX0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX1NXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJsNF9hb19jbGtkbSIsCisJLnBhcmVudAkJPSAmbDRfd2t1cF9jbGtfbXV4X2NrLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBzcl9tcHVfY2sgPSB7CisJLm5hbWUJCT0gInNyX21wdV9jayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLmVuYWJsZV9yZWcJPSBPTUFQNDQzMF9DTV9BTFdPTl9TUl9NUFVfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfU1dDVFJMLAorCS5jbGtkbV9uYW1lCT0gImw0X2FvX2Nsa2RtIiwKKwkucGFyZW50CQk9ICZsNF93a3VwX2Nsa19tdXhfY2ssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHRlc2xhX2NrID0geworCS5uYW1lCQk9ICJ0ZXNsYV9jayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLmVuYWJsZV9yZWcJPSBPTUFQNDQzMF9DTV9URVNMQV9URVNMQV9DTEtDVFJMLAorCS5lbmFibGVfYml0CT0gT01BUDQ0MzBfTU9EVUxFTU9ERV9IV0NUUkwsCisJLmNsa2RtX25hbWUJPSAidGVzbGFfY2xrZG0iLAorCS5wYXJlbnQJCT0gJmRwbGxfaXZhX200X2NrLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB1YXJ0MV9jayA9IHsKKwkubmFtZQkJPSAidWFydDFfY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5lbmFibGVfcmVnCT0gT01BUDQ0MzBfQ01fTDRQRVJfVUFSVDFfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfU1dDVFJMLAorCS5jbGtkbV9uYW1lCT0gImw0X3Blcl9jbGtkbSIsCisJLnBhcmVudAkJPSAmZnVuY180OG1fZmNsaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdWFydDJfY2sgPSB7CisJLm5hbWUJCT0gInVhcnQyX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX0w0UEVSX1VBUlQyX0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX1NXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJsNF9wZXJfY2xrZG0iLAorCS5wYXJlbnQJCT0gJmZ1bmNfNDhtX2ZjbGssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVhcnQzX2NrID0geworCS5uYW1lCQk9ICJ1YXJ0M19jayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLmVuYWJsZV9yZWcJPSBPTUFQNDQzMF9DTV9MNFBFUl9VQVJUM19DTEtDVFJMLAorCS5lbmFibGVfYml0CT0gT01BUDQ0MzBfTU9EVUxFTU9ERV9TV0NUUkwsCisJLmNsa2RtX25hbWUJPSAibDRfcGVyX2Nsa2RtIiwKKwkucGFyZW50CQk9ICZmdW5jXzQ4bV9mY2xrLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB1YXJ0NF9jayA9IHsKKwkubmFtZQkJPSAidWFydDRfY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5lbmFibGVfcmVnCT0gT01BUDQ0MzBfQ01fTDRQRVJfVUFSVDRfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfU1dDVFJMLAorCS5jbGtkbV9uYW1lCT0gImw0X3Blcl9jbGtkbSIsCisJLnBhcmVudAkJPSAmZnVuY180OG1fZmNsaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdW5pcHJvMV9jayA9IHsKKwkubmFtZQkJPSAidW5pcHJvMV9jayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLmVuYWJsZV9yZWcJPSBPTUFQNDQzMF9DTV9MM0lOSVRfVU5JUFJPMV9DTEtDVFJMLAorCS5lbmFibGVfYml0CT0gT01BUDQ0MzBfTU9EVUxFTU9ERV9TV0NUUkwsCisJLmNsa2RtX25hbWUJPSAibDNfaW5pdF9jbGtkbSIsCisJLnBhcmVudAkJPSAmZnVuY185Nm1fZmNsaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdXNiX2hvc3RfY2sgPSB7CisJLm5hbWUJCT0gInVzYl9ob3N0X2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMLAorCS5lbmFibGVfYml0CT0gT01BUDQ0MzBfTU9EVUxFTU9ERV9TV0NUUkwsCisJLmNsa2RtX25hbWUJPSAibDNfaW5pdF9jbGtkbSIsCisJLnBhcmVudAkJPSAmaW5pdF82MG1fZmNsaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdXNiX2hvc3RfZnNfY2sgPSB7CisJLm5hbWUJCT0gInVzYl9ob3N0X2ZzX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX0wzSU5JVF9VU0JfSE9TVF9GU19DTEtDVFJMLAorCS5lbmFibGVfYml0CT0gT01BUDQ0MzBfTU9EVUxFTU9ERV9TV0NUUkwsCisJLmNsa2RtX25hbWUJPSAibDNfaW5pdF9jbGtkbSIsCisJLnBhcmVudAkJPSAmZnVuY180OG1jX2ZjbGssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVzYl9vdGdfY2sgPSB7CisJLm5hbWUJCT0gInVzYl9vdGdfY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5lbmFibGVfcmVnCT0gT01BUDQ0MzBfQ01fTDNJTklUX1VTQl9PVEdfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfSFdDVFJMLAorCS5jbGtkbV9uYW1lCT0gImwzX2luaXRfY2xrZG0iLAorCS5wYXJlbnQJCT0gJmwzX2Rpdl9jaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdXNiX3RsbF9jayA9IHsKKwkubmFtZQkJPSAidXNiX3RsbF9jayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLmVuYWJsZV9yZWcJPSBPTUFQNDQzMF9DTV9MM0lOSVRfVVNCX1RMTF9DTEtDVFJMLAorCS5lbmFibGVfYml0CT0gT01BUDQ0MzBfTU9EVUxFTU9ERV9IV0NUUkwsCisJLmNsa2RtX25hbWUJPSAibDNfaW5pdF9jbGtkbSIsCisJLnBhcmVudAkJPSAmbDRfZGl2X2NrLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB1c2JwaHlvY3Ayc2NwX2NrID0geworCS5uYW1lCQk9ICJ1c2JwaHlvY3Ayc2NwX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX0wzSU5JVF9VU0JQSFlPQ1AyU0NQX0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX0hXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJsM19pbml0X2Nsa2RtIiwKKwkucGFyZW50CQk9ICZsNF9kaXZfY2ssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVzaW1fY2sgPSB7CisJLm5hbWUJCT0gInVzaW1fY2siLAorCS5vcHMJCT0gJmNsa29wc19vbWFwMl9kZmx0LAorCS5lbmFibGVfcmVnCT0gT01BUDQ0MzBfQ01fV0tVUF9VU0lNX0NMS0NUUkwsCisJLmVuYWJsZV9iaXQJPSBPTUFQNDQzMF9NT0RVTEVNT0RFX1NXQ1RSTCwKKwkuY2xrZG1fbmFtZQk9ICJsNF93a3VwX2Nsa2RtIiwKKwkucGFyZW50CQk9ICZzeXNfMzJrX2NrLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB3ZHQyX2NrID0geworCS5uYW1lCQk9ICJ3ZHQyX2NrIiwKKwkub3BzCQk9ICZjbGtvcHNfb21hcDJfZGZsdCwKKwkuZW5hYmxlX3JlZwk9IE9NQVA0NDMwX0NNX1dLVVBfV0RUMl9DTEtDVFJMLAorCS5lbmFibGVfYml0CT0gT01BUDQ0MzBfTU9EVUxFTU9ERV9TV0NUUkwsCisJLmNsa2RtX25hbWUJPSAibDRfd2t1cF9jbGtkbSIsCisJLnBhcmVudAkJPSAmc3lzXzMya19jaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgd2R0M19jayA9IHsKKwkubmFtZQkJPSAid2R0M19jayIsCisJLm9wcwkJPSAmY2xrb3BzX29tYXAyX2RmbHQsCisJLmVuYWJsZV9yZWcJPSBPTUFQNDQzMF9DTTFfQUJFX1dEVDNfQ0xLQ1RSTCwKKwkuZW5hYmxlX2JpdAk9IE9NQVA0NDMwX01PRFVMRU1PREVfU1dDVFJMLAorCS5jbGtkbV9uYW1lCT0gImFiZV9jbGtkbSIsCisJLnBhcmVudAkJPSAmc3lzXzMya19jaywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworLyogUmVtYWluaW5nIG9wdGlvbmFsIGNsb2NrcyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgb3RnXzYwbV9nZmNsa19zZWxbXSA9IHsKKwl7IC5wYXJlbnQgPSAmdXRtaV9waHlfY2xrb3V0X2NrLCAucmF0ZXMgPSBkaXZfMV8wX3JhdGVzIH0sCisJeyAucGFyZW50ID0gJnhjbGs2MG1vdGdfY2ssIC5yYXRlcyA9IGRpdl8xXzFfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayBvdGdfNjBtX2dmY2xrX2NrID0geworCS5uYW1lCQk9ICJvdGdfNjBtX2dmY2xrX2NrIiwKKwkucGFyZW50CQk9ICZ1dG1pX3BoeV9jbGtvdXRfY2ssCisJLmNsa3NlbAkJPSBvdGdfNjBtX2dmY2xrX3NlbCwKKwkuaW5pdAkJPSAmb21hcDJfaW5pdF9jbGtzZWxfcGFyZW50LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ01fTDNJTklUX1VTQl9PVEdfQ0xLQ1RSTCwKKwkuY2xrc2VsX21hc2sJPSBPTUFQNDQzMF9DTEtTRUxfNjBNX01BU0ssCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCBzdG1fY2xrX2Rpdl9kaXZbXSA9IHsKKwl7IC5wYXJlbnQgPSAmcG1kX3N0bV9jbG9ja19tdXhfY2ssIC5yYXRlcyA9IGRpdjNfMXRvNF9yYXRlcyB9LAorCXsgLnBhcmVudCA9IE5VTEwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHN0bV9jbGtfZGl2X2NrID0geworCS5uYW1lCQk9ICJzdG1fY2xrX2Rpdl9jayIsCisJLnBhcmVudAkJPSAmcG1kX3N0bV9jbG9ja19tdXhfY2ssCisJLmNsa3NlbAkJPSBzdG1fY2xrX2Rpdl9kaXYsCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTV9FTVVfREVCVUdTU19DTEtDVFJMLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0NMS1NFTF9QTURfU1RNX0NMS19NQVNLLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLnJvdW5kX3JhdGUJPSAmb21hcDJfY2xrc2VsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9zZXRfcmF0ZSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCB0cmFjZV9jbGtfZGl2X2RpdltdID0geworCXsgLnBhcmVudCA9ICZwbWRfdHJhY2VfY2xrX211eF9jaywgLnJhdGVzID0gZGl2M18xdG80X3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdHJhY2VfY2xrX2Rpdl9jayA9IHsKKwkubmFtZQkJPSAidHJhY2VfY2xrX2Rpdl9jayIsCisJLnBhcmVudAkJPSAmcG1kX3RyYWNlX2Nsa19tdXhfY2ssCisJLmNsa3NlbAkJPSB0cmFjZV9jbGtfZGl2X2RpdiwKKwkuY2xrc2VsX3JlZwk9IE9NQVA0NDMwX0NNX0VNVV9ERUJVR1NTX0NMS0NUUkwsCisJLmNsa3NlbF9tYXNrCT0gT01BUDQ0MzBfQ0xLU0VMX1BNRF9UUkFDRV9DTEtfTUFTSywKKwkub3BzCQk9ICZjbGtvcHNfbnVsbCwKKwkucmVjYWxjCQk9ICZvbWFwMl9jbGtzZWxfcmVjYWxjLAorCS5yb3VuZF9yYXRlCT0gJm9tYXAyX2Nsa3NlbF9yb3VuZF9yYXRlLAorCS5zZXRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfc2V0X3JhdGUsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBkaXYyXzE0dG8xOF9yYXRlc1tdID0geworCXsgLmRpdiA9IDE0LCAudmFsID0gMCwgLmZsYWdzID0gUkFURV9JTl80NDMwIH0sCisJeyAuZGl2ID0gMTgsIC52YWwgPSAxLCAuZmxhZ3MgPSBSQVRFX0lOXzQ0MzAgfSwKKwl7IC5kaXYgPSAwIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCB1c2ltX2ZjbGtfZGl2W10gPSB7CisJeyAucGFyZW50ID0gJmRwbGxfcGVyX200X2NrLCAucmF0ZXMgPSBkaXYyXzE0dG8xOF9yYXRlcyB9LAorCXsgLnBhcmVudCA9IE5VTEwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVzaW1fZmNsayA9IHsKKwkubmFtZQkJPSAidXNpbV9mY2xrIiwKKwkucGFyZW50CQk9ICZkcGxsX3Blcl9tNF9jaywKKwkuY2xrc2VsCQk9IHVzaW1fZmNsa19kaXYsCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTV9XS1VQX1VTSU1fQ0xLQ1RSTCwKKwkuY2xrc2VsX21hc2sJPSBPTUFQNDQzMF9DTEtTRUxfRElWX01BU0ssCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkucm91bmRfcmF0ZQk9ICZvbWFwMl9jbGtzZWxfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUJPSAmb21hcDJfY2xrc2VsX3NldF9yYXRlLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQNDQzMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrc2VsIHV0bWlfcDFfZ2ZjbGtfc2VsW10gPSB7CisJeyAucGFyZW50ID0gJmluaXRfNjBtX2ZjbGssIC5yYXRlcyA9IGRpdl8xXzBfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSAmeGNsazYwbWhzcDFfY2ssIC5yYXRlcyA9IGRpdl8xXzFfcmF0ZXMgfSwKKwl7IC5wYXJlbnQgPSBOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayB1dG1pX3AxX2dmY2xrX2NrID0geworCS5uYW1lCQk9ICJ1dG1pX3AxX2dmY2xrX2NrIiwKKwkucGFyZW50CQk9ICZpbml0XzYwbV9mY2xrLAorCS5jbGtzZWwJCT0gdXRtaV9wMV9nZmNsa19zZWwsCisJLmluaXQJCT0gJm9tYXAyX2luaXRfY2xrc2VsX3BhcmVudCwKKwkuY2xrc2VsX3JlZwk9IE9NQVA0NDMwX0NNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMLAorCS5jbGtzZWxfbWFzawk9IE9NQVA0NDMwX0NMS1NFTF9VVE1JX1AxX01BU0ssCisJLm9wcwkJPSAmY2xrb3BzX251bGwsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDQ0MzAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbCB1dG1pX3AyX2dmY2xrX3NlbFtdID0geworCXsgLnBhcmVudCA9ICZpbml0XzYwbV9mY2xrLCAucmF0ZXMgPSBkaXZfMV8wX3JhdGVzIH0sCisJeyAucGFyZW50ID0gJnhjbGs2MG1oc3AyX2NrLCAucmF0ZXMgPSBkaXZfMV8xX3JhdGVzIH0sCisJeyAucGFyZW50ID0gTlVMTCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdXRtaV9wMl9nZmNsa19jayA9IHsKKwkubmFtZQkJPSAidXRtaV9wMl9nZmNsa19jayIsCisJLnBhcmVudAkJPSAmaW5pdF82MG1fZmNsaywKKwkuY2xrc2VsCQk9IHV0bWlfcDJfZ2ZjbGtfc2VsLAorCS5pbml0CQk9ICZvbWFwMl9pbml0X2Nsa3NlbF9wYXJlbnQsCisJLmNsa3NlbF9yZWcJPSBPTUFQNDQzMF9DTV9MM0lOSVRfVVNCX0hPU1RfQ0xLQ1RSTCwKKwkuY2xrc2VsX21hc2sJPSBPTUFQNDQzMF9DTEtTRUxfVVRNSV9QMl9NQVNLLAorCS5vcHMJCT0gJmNsa29wc19udWxsLAorCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA0NDMwLAorfTsKKworLyoKKyAqIGNsa2RldgorICovCisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9jbGsgb21hcDQ0eHhfY2xrc1tdID0geworCUNMSyhOVUxMLAkiZXh0YWx0X2Nsa2luX2NrIiwJCSZleHRhbHRfY2xraW5fY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkicGFkX2Nsa3NfY2siLAkJCSZwYWRfY2xrc19jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJwYWRfc2xpbWJ1c19jb3JlX2Nsa3NfY2siLAkmcGFkX3NsaW1idXNfY29yZV9jbGtzX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJInNlY3VyZV8zMmtfY2xrX3NyY19jayIsCSZzZWN1cmVfMzJrX2Nsa19zcmNfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkic2xpbWJ1c19jbGsiLAkJCSZzbGltYnVzX2NsaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJzeXNfMzJrX2NrIiwJCQkmc3lzXzMya19jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJ2aXJ0XzEyMDAwMDAwX2NrIiwJCSZ2aXJ0XzEyMDAwMDAwX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJInZpcnRfMTMwMDAwMDBfY2siLAkJJnZpcnRfMTMwMDAwMDBfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkidmlydF8xNjgwMDAwMF9jayIsCQkmdmlydF8xNjgwMDAwMF9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJ2aXJ0XzE5MjAwMDAwX2NrIiwJCSZ2aXJ0XzE5MjAwMDAwX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJInZpcnRfMjYwMDAwMDBfY2siLAkJJnZpcnRfMjYwMDAwMDBfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkidmlydF8yNzAwMDAwMF9jayIsCQkmdmlydF8yNzAwMDAwMF9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJ2aXJ0XzM4NDAwMDAwX2NrIiwJCSZ2aXJ0XzM4NDAwMDAwX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJInN5c19jbGtpbl9jayIsCQkJJnN5c19jbGtpbl9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJ1dG1pX3BoeV9jbGtvdXRfY2siLAkJJnV0bWlfcGh5X2Nsa291dF9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJ4Y2xrNjBtaHNwMV9jayIsCQkmeGNsazYwbWhzcDFfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkieGNsazYwbWhzcDJfY2siLAkJJnhjbGs2MG1oc3AyX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJInhjbGs2MG1vdGdfY2siLAkJJnhjbGs2MG1vdGdfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiZHBsbF9zeXNfcmVmX2NsayIsCQkmZHBsbF9zeXNfcmVmX2NsaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJhYmVfZHBsbF9yZWZjbGtfbXV4X2NrIiwJJmFiZV9kcGxsX3JlZmNsa19tdXhfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiZHBsbF9hYmVfY2siLAkJCSZkcGxsX2FiZV9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJkcGxsX2FiZV9tMngyX2NrIiwJCSZkcGxsX2FiZV9tMngyX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImFiZV8yNG1fZmNsayIsCQkJJmFiZV8yNG1fZmNsaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJhYmVfY2xrIiwJCQkmYWJlX2NsaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJhZXNzX2ZjbGsiLAkJCSZhZXNzX2ZjbGssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiZHBsbF9hYmVfbTNfY2siLAkJJmRwbGxfYWJlX20zX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImNvcmVfaHNkX2J5cF9jbGtfbXV4X2NrIiwJJmNvcmVfaHNkX2J5cF9jbGtfbXV4X2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImRwbGxfY29yZV9jayIsCQkJJmRwbGxfY29yZV9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJkcGxsX2NvcmVfbTZfY2siLAkJJmRwbGxfY29yZV9tNl9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJkYmdjbGtfbXV4X2NrIiwJCSZkYmdjbGtfbXV4X2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImRwbGxfY29yZV9tMl9jayIsCQkmZHBsbF9jb3JlX20yX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImRkcnBoeV9jayIsCQkJJmRkcnBoeV9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJkcGxsX2NvcmVfbTVfY2siLAkJJmRwbGxfY29yZV9tNV9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJkaXZfY29yZV9jayIsCQkJJmRpdl9jb3JlX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImRpdl9pdmFfaHNfY2xrIiwJCSZkaXZfaXZhX2hzX2NsaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJkaXZfbXB1X2hzX2NsayIsCQkmZGl2X21wdV9oc19jbGssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiZHBsbF9jb3JlX200X2NrIiwJCSZkcGxsX2NvcmVfbTRfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiZGxsX2Nsa19kaXZfY2siLAkJJmRsbF9jbGtfZGl2X2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImRwbGxfYWJlX20yX2NrIiwJCSZkcGxsX2FiZV9tMl9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJkcGxsX2NvcmVfbTNfY2siLAkJJmRwbGxfY29yZV9tM19jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJkcGxsX2NvcmVfbTdfY2siLAkJJmRwbGxfY29yZV9tN19jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJpdmFfaHNkX2J5cF9jbGtfbXV4X2NrIiwJJml2YV9oc2RfYnlwX2Nsa19tdXhfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiZHBsbF9pdmFfY2siLAkJCSZkcGxsX2l2YV9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJkcGxsX2l2YV9tNF9jayIsCQkmZHBsbF9pdmFfbTRfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiZHBsbF9pdmFfbTVfY2siLAkJJmRwbGxfaXZhX201X2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImRwbGxfbXB1X2NrIiwJCQkmZHBsbF9tcHVfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiZHBsbF9tcHVfbTJfY2siLAkJJmRwbGxfbXB1X20yX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJInBlcl9oc19jbGtfZGl2X2NrIiwJCSZwZXJfaHNfY2xrX2Rpdl9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJwZXJfaHNkX2J5cF9jbGtfbXV4X2NrIiwJJnBlcl9oc2RfYnlwX2Nsa19tdXhfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiZHBsbF9wZXJfY2siLAkJCSZkcGxsX3Blcl9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJkcGxsX3Blcl9tMl9jayIsCQkmZHBsbF9wZXJfbTJfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiZHBsbF9wZXJfbTJ4Ml9jayIsCQkmZHBsbF9wZXJfbTJ4Ml9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJkcGxsX3Blcl9tM19jayIsCQkmZHBsbF9wZXJfbTNfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiZHBsbF9wZXJfbTRfY2siLAkJJmRwbGxfcGVyX200X2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImRwbGxfcGVyX201X2NrIiwJCSZkcGxsX3Blcl9tNV9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJkcGxsX3Blcl9tNl9jayIsCQkmZHBsbF9wZXJfbTZfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiZHBsbF9wZXJfbTdfY2siLAkJJmRwbGxfcGVyX203X2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImRwbGxfdW5pcHJvX2NrIiwJCSZkcGxsX3VuaXByb19jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJkcGxsX3VuaXByb19tMngyX2NrIiwJCSZkcGxsX3VuaXByb19tMngyX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJInVzYl9oc19jbGtfZGl2X2NrIiwJCSZ1c2JfaHNfY2xrX2Rpdl9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJkcGxsX3VzYl9jayIsCQkJJmRwbGxfdXNiX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImRwbGxfdXNiX2Nsa2Rjb2xkb19jayIsCSZkcGxsX3VzYl9jbGtkY29sZG9fY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiZHBsbF91c2JfbTJfY2siLAkJJmRwbGxfdXNiX20yX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImR1Y2F0aV9jbGtfbXV4X2NrIiwJCSZkdWNhdGlfY2xrX211eF9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJmdW5jXzEybV9mY2xrIiwJCSZmdW5jXzEybV9mY2xrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImZ1bmNfMjRtX2NsayIsCQkJJmZ1bmNfMjRtX2NsaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJmdW5jXzI0bWNfZmNsayIsCQkmZnVuY18yNG1jX2ZjbGssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiZnVuY180OG1fZmNsayIsCQkmZnVuY180OG1fZmNsaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJmdW5jXzQ4bWNfZmNsayIsCQkmZnVuY180OG1jX2ZjbGssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiZnVuY182NG1fZmNsayIsCQkmZnVuY182NG1fZmNsaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJmdW5jXzk2bV9mY2xrIiwJCSZmdW5jXzk2bV9mY2xrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImhzbW1jNl9mY2xrIiwJCQkmaHNtbWM2X2ZjbGssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiaW5pdF82MG1fZmNsayIsCQkmaW5pdF82MG1fZmNsaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJsM19kaXZfY2siLAkJCSZsM19kaXZfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkibDRfZGl2X2NrIiwJCQkmbDRfZGl2X2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImxwX2Nsa19kaXZfY2siLAkJJmxwX2Nsa19kaXZfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkibDRfd2t1cF9jbGtfbXV4X2NrIiwJCSZsNF93a3VwX2Nsa19tdXhfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkicGVyX2FiZV9uY19mY2xrIiwJCSZwZXJfYWJlX25jX2ZjbGssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkibWNhc3AyX2ZjbGsiLAkJCSZtY2FzcDJfZmNsaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJtY2FzcDNfZmNsayIsCQkJJm1jYXNwM19mY2xrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJIm9jcF9hYmVfaWNsayIsCQkJJm9jcF9hYmVfaWNsaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJwZXJfYWJlXzI0bV9mY2xrIiwJCSZwZXJfYWJlXzI0bV9mY2xrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJInBtZF9zdG1fY2xvY2tfbXV4X2NrIiwJCSZwbWRfc3RtX2Nsb2NrX211eF9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJwbWRfdHJhY2VfY2xrX211eF9jayIsCQkmcG1kX3RyYWNlX2Nsa19tdXhfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkic3ljX2Nsa19kaXZfY2siLAkJJnN5Y19jbGtfZGl2X2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImFlczFfY2siLAkJCSZhZXMxX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImFlczJfY2siLAkJCSZhZXMyX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImFlc3NfY2siLAkJCSZhZXNzX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImN1c3RfZWZ1c2VfY2siLAkJJmN1c3RfZWZ1c2VfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiZGVzM2Rlc19jayIsCQkJJmRlczNkZXNfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiZG1pY19zeW5jX211eF9jayIsCQkmZG1pY19zeW5jX211eF9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJkbWljX2NrIiwJCQkmZG1pY19jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJkc3NfY2siLAkJCSZkc3NfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiZHVjYXRpX2NrIiwJCQkmZHVjYXRpX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImVtaWYxX2NrIiwJCQkmZW1pZjFfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiZW1pZjJfY2siLAkJCSZlbWlmMl9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJmZGlmX2NrIiwJCQkmZmRpZl9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJwZXJfc2d4X2ZjbGsiLAkJCSZwZXJfc2d4X2ZjbGssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiZ2Z4X2NrIiwJCQkmZ2Z4X2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImdwaW8xX2NrIiwJCQkmZ3BpbzFfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiZ3BpbzJfY2siLAkJCSZncGlvMl9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJncGlvM19jayIsCQkJJmdwaW8zX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImdwaW80X2NrIiwJCQkmZ3BpbzRfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiZ3BpbzVfY2siLAkJCSZncGlvNV9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJncGlvNl9jayIsCQkJJmdwaW82X2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImdwbWNfY2siLAkJCSZncG1jX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImdwdGltZXIxX2NrIiwJCQkmZ3B0aW1lcjFfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiZ3B0aW1lcjEwX2NrIiwJCQkmZ3B0aW1lcjEwX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImdwdGltZXIxMV9jayIsCQkJJmdwdGltZXIxMV9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJncHRpbWVyMl9jayIsCQkJJmdwdGltZXIyX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImdwdGltZXIzX2NrIiwJCQkmZ3B0aW1lcjNfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiZ3B0aW1lcjRfY2siLAkJCSZncHRpbWVyNF9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJncHRpbWVyNV9jayIsCQkJJmdwdGltZXI1X2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImdwdGltZXI2X2NrIiwJCQkmZ3B0aW1lcjZfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkiZ3B0aW1lcjdfY2siLAkJCSZncHRpbWVyN19jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJncHRpbWVyOF9jayIsCQkJJmdwdGltZXI4X2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImdwdGltZXI5X2NrIiwJCQkmZ3B0aW1lcjlfY2ssCUNLXzQ0M1gpLAorCUNMSygib21hcDJfaGRxLjAiLAkiaWNrIiwJCQkJJmhkcTF3X2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImhzaV9jayIsCQkJJmhzaV9jaywJQ0tfNDQzWCksCisJQ0xLKCJpMmNfb21hcC4xIiwJImljayIsCQkJCSZpMmMxX2NrLAlDS180NDNYKSwKKwlDTEsoImkyY19vbWFwLjIiLAkiaWNrIiwJCQkJJmkyYzJfY2ssCUNLXzQ0M1gpLAorCUNMSygiaTJjX29tYXAuMyIsCSJpY2siLAkJCQkmaTJjM19jaywJQ0tfNDQzWCksCisJQ0xLKCJpMmNfb21hcC40IiwJImljayIsCQkJCSZpMmM0X2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImlzc19jayIsCQkJJmlzc19jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJpdmFoZF9jayIsCQkJJml2YWhkX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJImtleWJvYXJkX2NrIiwJCQkma2V5Ym9hcmRfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkibDNfaW5zdHJfaW50ZXJjb25uZWN0X2NrIiwJJmwzX2luc3RyX2ludGVyY29ubmVjdF9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJsM19pbnRlcmNvbm5lY3RfM19jayIsCQkmbDNfaW50ZXJjb25uZWN0XzNfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkibWNhc3Bfc3luY19tdXhfY2siLAkJJm1jYXNwX3N5bmNfbXV4X2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJIm1jYXNwX2NrIiwJCQkmbWNhc3BfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkibWNic3AxX3N5bmNfbXV4X2NrIiwJCSZtY2JzcDFfc3luY19tdXhfY2ssCUNLXzQ0M1gpLAorCUNMSygib21hcC1tY2JzcC4xIiwJImZjayIsCQkJCSZtY2JzcDFfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkibWNic3AyX3N5bmNfbXV4X2NrIiwJCSZtY2JzcDJfc3luY19tdXhfY2ssCUNLXzQ0M1gpLAorCUNMSygib21hcC1tY2JzcC4yIiwJImZjayIsCQkJCSZtY2JzcDJfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkibWNic3AzX3N5bmNfbXV4X2NrIiwJCSZtY2JzcDNfc3luY19tdXhfY2ssCUNLXzQ0M1gpLAorCUNMSygib21hcC1tY2JzcC4zIiwJImZjayIsCQkJCSZtY2JzcDNfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkibWNic3A0X3N5bmNfbXV4X2NrIiwJCSZtY2JzcDRfc3luY19tdXhfY2ssCUNLXzQ0M1gpLAorCUNMSygib21hcC1tY2JzcC40IiwJImZjayIsCQkJCSZtY2JzcDRfY2ssCUNLXzQ0M1gpLAorCUNMSygib21hcDJfbWNzcGkuMSIsCSJmY2siLAkJCQkmbWNzcGkxX2NrLAlDS180NDNYKSwKKwlDTEsoIm9tYXAyX21jc3BpLjIiLAkiZmNrIiwJCQkJJm1jc3BpMl9jaywJQ0tfNDQzWCksCisJQ0xLKCJvbWFwMl9tY3NwaS4zIiwJImZjayIsCQkJCSZtY3NwaTNfY2ssCUNLXzQ0M1gpLAorCUNMSygib21hcDJfbWNzcGkuNCIsCSJmY2siLAkJCQkmbWNzcGk0X2NrLAlDS180NDNYKSwKKwlDTEsoIm1tY2ktb21hcC1ocy4wIiwJImZjayIsCQkJCSZtbWMxX2NrLAlDS180NDNYKSwKKwlDTEsoIm1tY2ktb21hcC1ocy4xIiwJImZjayIsCQkJCSZtbWMyX2NrLAlDS180NDNYKSwKKwlDTEsoIm1tY2ktb21hcC1ocy4yIiwJImZjayIsCQkJCSZtbWMzX2NrLAlDS180NDNYKSwKKwlDTEsoIm1tY2ktb21hcC1ocy4zIiwJImZjayIsCQkJCSZtbWM0X2NrLAlDS180NDNYKSwKKwlDTEsoIm1tY2ktb21hcC1ocy40IiwJImZjayIsCQkJCSZtbWM1X2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJIm9jcF93cDFfY2siLAkJCSZvY3Bfd3AxX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJInBkbV9jayIsCQkJJnBkbV9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJwa2FlaXAyOV9jayIsCQkJJnBrYWVpcDI5X2NrLAlDS180NDNYKSwKKwlDTEsoIm9tYXBfcm5nIiwJImljayIsCQkJCSZybmdfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkic2hhMm1kNTFfY2siLAkJCSZzaGEybWQ1MV9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJzbDJfY2siLAkJCSZzbDJfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkic2xpbWJ1czFfY2siLAkJCSZzbGltYnVzMV9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJzbGltYnVzMl9jayIsCQkJJnNsaW1idXMyX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJInNyX2NvcmVfY2siLAkJCSZzcl9jb3JlX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJInNyX2l2YV9jayIsCQkJJnNyX2l2YV9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJzcl9tcHVfY2siLAkJCSZzcl9tcHVfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkidGVzbGFfY2siLAkJCSZ0ZXNsYV9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJ1YXJ0MV9jayIsCQkJJnVhcnQxX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJInVhcnQyX2NrIiwJCQkmdWFydDJfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkidWFydDNfY2siLAkJCSZ1YXJ0M19jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJ1YXJ0NF9jayIsCQkJJnVhcnQ0X2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJInVuaXBybzFfY2siLAkJCSZ1bmlwcm8xX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJInVzYl9ob3N0X2NrIiwJCQkmdXNiX2hvc3RfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkidXNiX2hvc3RfZnNfY2siLAkJJnVzYl9ob3N0X2ZzX2NrLAlDS180NDNYKSwKKwlDTEsoIm11c2JfaGRyYyIsCSJpY2siLAkJCQkmdXNiX290Z19jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJ1c2JfdGxsX2NrIiwJCQkmdXNiX3RsbF9jaywJQ0tfNDQzWCksCisJQ0xLKE5VTEwsCSJ1c2JwaHlvY3Ayc2NwX2NrIiwJCSZ1c2JwaHlvY3Ayc2NwX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJInVzaW1fY2siLAkJCSZ1c2ltX2NrLAlDS180NDNYKSwKKwlDTEsoIm9tYXBfd2R0IiwJImZjayIsCQkJCSZ3ZHQyX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJIndkdDNfY2siLAkJCSZ3ZHQzX2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJIm90Z182MG1fZ2ZjbGtfY2siLAkJJm90Z182MG1fZ2ZjbGtfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkic3RtX2Nsa19kaXZfY2siLAkJJnN0bV9jbGtfZGl2X2NrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJInRyYWNlX2Nsa19kaXZfY2siLAkJJnRyYWNlX2Nsa19kaXZfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkidXNpbV9mY2xrIiwJCQkmdXNpbV9mY2xrLAlDS180NDNYKSwKKwlDTEsoTlVMTCwJInV0bWlfcDFfZ2ZjbGtfY2siLAkJJnV0bWlfcDFfZ2ZjbGtfY2ssCUNLXzQ0M1gpLAorCUNMSyhOVUxMLAkidXRtaV9wMl9nZmNsa19jayIsCQkmdXRtaV9wMl9nZmNsa19jaywJQ0tfNDQzWCksCit9OworCitpbnQgX19pbml0IG9tYXAyX2Nsa19pbml0KHZvaWQpCit7CisJLyogc3RydWN0IHByY21fY29uZmlnICpwcmNtOyAqLworCXN0cnVjdCBvbWFwX2NsayAqYzsKKwkvKiB1MzIgY2xrcmF0ZTsgKi8KKwl1MzIgY3B1X2Nsa2ZsZzsKKworCWlmIChjcHVfaXNfb21hcDQ0eHgoKSkgeworCQljcHVfbWFzayA9IFJBVEVfSU5fNDQzMDsKKwkJY3B1X2Nsa2ZsZyA9IENLXzQ0M1g7CisJfQorCisJY2xrX2luaXQoJm9tYXAyX2Nsa19mdW5jdGlvbnMpOworCisJZm9yIChjID0gb21hcDQ0eHhfY2xrczsgYyA8IG9tYXA0NHh4X2Nsa3MgKyBBUlJBWV9TSVpFKG9tYXA0NHh4X2Nsa3MpOworCQkJCQkJCQkJICBjKyspCisJCWNsa19wcmVpbml0KGMtPmxrLmNsayk7CisKKwlmb3IgKGMgPSBvbWFwNDR4eF9jbGtzOyBjIDwgb21hcDQ0eHhfY2xrcyArIEFSUkFZX1NJWkUob21hcDQ0eHhfY2xrcyk7CisJCQkJCQkJCQkgIGMrKykKKwkJaWYgKGMtPmNwdSAmIGNwdV9jbGtmbGcpIHsKKwkJCWNsa2Rldl9hZGQoJmMtPmxrKTsKKwkJCWNsa19yZWdpc3RlcihjLT5say5jbGspOworCQkJLyogVE9ETworCQkJb21hcDJfaW5pdF9jbGtfY2xrZG0oYy0+bGsuY2xrKTsKKwkJCSovCisJCX0KKworCXJlY2FsY3VsYXRlX3Jvb3RfY2xvY2tzKCk7CisKKwkvKgorCSAqIE9ubHkgZW5hYmxlIHRob3NlIGNsb2NrcyB3ZSB3aWxsIG5lZWQsIGxldCB0aGUgZHJpdmVycworCSAqIGVuYWJsZSBvdGhlciBjbG9ja3MgYXMgbmVjZXNzYXJ5CisJICovCisJY2xrX2VuYWJsZV9pbml0X2Nsb2NrcygpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrX2NvbW1vbl9kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrX2NvbW1vbl9kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY5MDk2YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tfY29tbW9uX2RhdGEuYwpAQCAtMCwwICsxLDM5IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tfY29tbW9uX2RhdGEuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogIENvcHlyaWdodCAoQykgMjAwNC0yMDA5IE5va2lhIENvcnBvcmF0aW9uCisgKgorICogIENvbnRhY3RzOgorICogIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqICBQYXVsIFdhbG1zbGV5CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgY2xvY2sgZGF0YSB0aGF0IGlzIGNvbW1vbiB0byBib3RoIHRoZSBPTUFQMnh4eCBhbmQKKyAqIE9NQVAzeHh4IGNsb2NrIGRlZmluaXRpb24gZmlsZXMuCisgKi8KKworI2luY2x1ZGUgImNsb2NrLmgiCisKKy8qIGNsa3NlbF9yYXRlIGRhdGEgY29tbW9uIHRvIDI0eHgvMzQzeCAqLworY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGdwdF8zMmtfcmF0ZXNbXSA9IHsKKwkgeyAuZGl2ID0gMSwgLnZhbCA9IDAsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB8IFJBVEVfSU5fMzQzWCB8IERFRkFVTFRfUkFURSB9LAorCSB7IC5kaXYgPSAwIH0KK307CisKK2NvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBncHRfc3lzX3JhdGVzW10gPSB7CisJIHsgLmRpdiA9IDEsIC52YWwgPSAxLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfCBSQVRFX0lOXzM0M1ggfCBERUZBVUxUX1JBVEUgfSwKKwkgeyAuZGl2ID0gMCB9Cit9OworCitjb25zdCBzdHJ1Y3QgY2xrc2VsX3JhdGUgZ2Z4X2wzX3JhdGVzW10gPSB7CisJeyAuZGl2ID0gMSwgLnZhbCA9IDEsIC5mbGFncyA9IFJBVEVfSU5fMjRYWCB8IFJBVEVfSU5fMzQzWCB9LAorCXsgLmRpdiA9IDIsIC52YWwgPSAyLCAuZmxhZ3MgPSBSQVRFX0lOXzI0WFggfCBSQVRFX0lOXzM0M1ggfCBERUZBVUxUX1JBVEUgfSwKKwl7IC5kaXYgPSAzLCAudmFsID0gMywgLmZsYWdzID0gUkFURV9JTl8yNDNYIHwgUkFURV9JTl8zNDNYIH0sCisJeyAuZGl2ID0gNCwgLnZhbCA9IDQsIC5mbGFncyA9IFJBVEVfSU5fMjQzWCB8IFJBVEVfSU5fMzQzWCB9LAorCXsgLmRpdiA9IDAgfQorfTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbi5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbi5jCmluZGV4IGZjZDgyMzIuLjFhNDVlZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tkb21haW4uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluLmMKQEAgLTIsNyArMiw3IEBACiAgKiBPTUFQMi8zIGNsb2NrZG9tYWluIGZyYW1ld29yayBmdW5jdGlvbnMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgTm9raWEgQ29ycG9yYXRpb24KICAqCiAgKiBXcml0dGVuIGJ5IFBhdWwgV2FsbXNsZXkgYW5kIEpvdW5pIEjDtmdhbmRlcgogICoKQEAgLTEwLDkgKzEwLDcgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotI2lmZGVmIENPTkZJR19PTUFQX0RFQlVHX0NMT0NLRE9NQUlOCi0jICBkZWZpbmUgREVCVUcKLSNlbmRpZgorI3VuZGVmIERFQlVHCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY20tcmVnYml0cy00NHh4LmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NtLXJlZ2JpdHMtNDR4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNjdmNzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NtLXJlZ2JpdHMtNDR4eC5oCkBAIC0wLDAgKzEsMTQ3NCBAQAorLyoKKyAqIE9NQVA0NHh4IENsb2NrIE1hbmFnZW1lbnQgcmVnaXN0ZXIgYml0cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uCisgKgorICogUGF1bCBXYWxtc2xleSAocGF1bEBwd3Nhbi5jb20pCisgKiBSYWplbmRyYSBOYXlhayAocm5heWFrQHRpLmNvbSkKKyAqIEJlbm9pdCBDb3Vzc29uIChiLWNvdXNzb25AdGkuY29tKQorICoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmcm9tIHRoZSBPTUFQIGhhcmR3YXJlIGRhdGFiYXNlcy4KKyAqIFdlIHJlc3BlY3RmdWxseSBhc2sgdGhhdCBhbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgYmUgY29vcmRpbmF0ZWQKKyAqIHdpdGggdGhlIHB1YmxpYyBsaW51eC1vbWFwQHZnZXIua2VybmVsLm9yZyBtYWlsaW5nIGxpc3QgYW5kIHRoZQorICogYXV0aG9ycyBhYm92ZSB0byBlbnN1cmUgdGhhdCB0aGUgYXV0b2dlbmVyYXRpb24gc2NyaXB0cyBhcmUga2VwdAorICogdXAtdG8tZGF0ZSB3aXRoIHRoZSBmaWxlIGNvbnRlbnRzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0FSQ0hfQVJNX01BQ0hfT01BUDJfQ01fUkVHQklUU180NFhYX0gKKyNkZWZpbmUgX19BUkNIX0FSTV9NQUNIX09NQVAyX0NNX1JFR0JJVFNfNDRYWF9ICisKKyNpbmNsdWRlICJjbS5oIgorCisKKy8qIFVzZWQgYnkgQ01fTDNfMV9EWU5BTUlDREVQLCBDTV9NUFVfRFlOQU1JQ0RFUCwgQ01fVEVTTEFfRFlOQU1JQ0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9BQkVfRFlOREVQX1NISUZUCQkJCSgxIDw8IDMpCisjZGVmaW5lIE9NQVA0NDMwX0FCRV9EWU5ERVBfTUFTSwkJCQlCSVRGSUVMRCgzLCAzKQorCisvKgorICogVXNlZCBieSBDTV9EMkRfU1RBVElDREVQLCBDTV9EVUNBVElfU1RBVElDREVQLCBDTV9TRE1BX1NUQVRJQ0RFUCwKKyAqIENNX0wzSU5JVF9TVEFUSUNERVAsIENNX1NETUFfU1RBVElDREVQX1JFU1RPUkUsIENNX01QVV9TVEFUSUNERVAsCisgKiBDTV9URVNMQV9TVEFUSUNERVAKKyAqLworI2RlZmluZSBPTUFQNDQzMF9BQkVfU1RBVERFUF9TSElGVAkJCQkoMSA8PCAzKQorI2RlZmluZSBPTUFQNDQzMF9BQkVfU1RBVERFUF9NQVNLCQkJCUJJVEZJRUxEKDMsIDMpCisKKy8qIFVzZWQgYnkgQ01fTDRDRkdfRFlOQU1JQ0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9BTFdPTkNPUkVfRFlOREVQX1NISUZUCQkJCSgxIDw8IDE2KQorI2RlZmluZSBPTUFQNDQzMF9BTFdPTkNPUkVfRFlOREVQX01BU0sJCQkJQklURklFTEQoMTYsIDE2KQorCisvKiBVc2VkIGJ5IENNX0RVQ0FUSV9TVEFUSUNERVAsIENNX01QVV9TVEFUSUNERVAsIENNX1RFU0xBX1NUQVRJQ0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9BTFdPTkNPUkVfU1RBVERFUF9TSElGVAkJCSgxIDw8IDE2KQorI2RlZmluZSBPTUFQNDQzMF9BTFdPTkNPUkVfU1RBVERFUF9NQVNLCQkJCUJJVEZJRUxEKDE2LCAxNikKKworLyoKKyAqIFVzZWQgYnkgQ01fQVVUT0lETEVfRFBMTF9QRVIsIENNX0FVVE9JRExFX0RQTExfVU5JUFJPLCBDTV9BVVRPSURMRV9EUExMX1VTQiwKKyAqIENNX0FVVE9JRExFX0RQTExfQ09SRV9SRVNUT1JFLCBDTV9BVVRPSURMRV9EUExMX0FCRSwgQ01fQVVUT0lETEVfRFBMTF9DT1JFLAorICogQ01fQVVUT0lETEVfRFBMTF9ERFJQSFksIENNX0FVVE9JRExFX0RQTExfSVZBLCBDTV9BVVRPSURMRV9EUExMX01QVQorICovCisjZGVmaW5lIE9NQVA0NDMwX0FVVE9fRFBMTF9NT0RFX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX0FVVE9fRFBMTF9NT0RFX01BU0sJCQkJQklURklFTEQoMCwgMikKKworLyogVXNlZCBieSBDTV9MNENGR19EWU5BTUlDREVQICovCisjZGVmaW5lIE9NQVA0NDMwX0NFRlVTRV9EWU5ERVBfU0hJRlQJCQkJKDEgPDwgMTcpCisjZGVmaW5lIE9NQVA0NDMwX0NFRlVTRV9EWU5ERVBfTUFTSwkJCQlCSVRGSUVMRCgxNywgMTcpCisKKy8qIFVzZWQgYnkgQ01fRFVDQVRJX1NUQVRJQ0RFUCwgQ01fTVBVX1NUQVRJQ0RFUCwgQ01fVEVTTEFfU1RBVElDREVQICovCisjZGVmaW5lIE9NQVA0NDMwX0NFRlVTRV9TVEFUREVQX1NISUZUCQkJCSgxIDw8IDE3KQorI2RlZmluZSBPTUFQNDQzMF9DRUZVU0VfU1RBVERFUF9NQVNLCQkJCUJJVEZJRUxEKDE3LCAxNykKKworLyogVXNlZCBieSBDTTFfQUJFX0NMS1NUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9BQkVfMjRNX0dGQ0xLX1NISUZUCQkoMSA8PCAxMykKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfQUJFXzI0TV9HRkNMS19NQVNLCQkJQklURklFTEQoMTMsIDEzKQorCisvKiBVc2VkIGJ5IENNMV9BQkVfQ0xLU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0FCRV9BTFdPTl8zMktfQ0xLX1NISUZUCQkoMSA8PCAxMikKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfQUJFX0FMV09OXzMyS19DTEtfTUFTSwkJQklURklFTEQoMTIsIDEyKQorCisvKiBVc2VkIGJ5IENNX1dLVVBfQ0xLU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0FCRV9MUF9DTEtfU0hJRlQJCQkoMSA8PCA5KQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9BQkVfTFBfQ0xLX01BU0sJCQlCSVRGSUVMRCg5LCA5KQorCisvKiBVc2VkIGJ5IENNMV9BQkVfQ0xLU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0FCRV9TWVNDTEtfU0hJRlQJCQkoMSA8PCAxMSkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfQUJFX1NZU0NMS19NQVNLCQkJQklURklFTEQoMTEsIDExKQorCisvKiBVc2VkIGJ5IENNMV9BQkVfQ0xLU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0FCRV9YMl9DTEtfU0hJRlQJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9BQkVfWDJfQ0xLX01BU0sJCQlCSVRGSUVMRCg4LCA4KQorCisvKiBVc2VkIGJ5IENNX01FTUlGX0NMS1NUQ1RSTCwgQ01fTUVNSUZfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfQVNZTkNfRExMX0NMS19TSElGVAkJKDEgPDwgMTEpCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0FTWU5DX0RMTF9DTEtfTUFTSwkJCUJJVEZJRUxEKDExLCAxMSkKKworLyogVXNlZCBieSBDTV9NRU1JRl9DTEtTVENUUkwsIENNX01FTUlGX0NMS1NUQ1RSTF9SRVNUT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0FTWU5DX1BIWTFfQ0xLX1NISUZUCQkoMSA8PCAxMikKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfQVNZTkNfUEhZMV9DTEtfTUFTSwkJQklURklFTEQoMTIsIDEyKQorCisvKiBVc2VkIGJ5IENNX01FTUlGX0NMS1NUQ1RSTCwgQ01fTUVNSUZfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfQVNZTkNfUEhZMl9DTEtfU0hJRlQJCSgxIDw8IDEzKQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9BU1lOQ19QSFkyX0NMS19NQVNLCQlCSVRGSUVMRCgxMywgMTMpCisKKy8qIFVzZWQgYnkgQ01fQ0FNX0NMS1NUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9DQU1fUEhZX0NUUkxfR0NMS19TSElGVAkJKDEgPDwgOSkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfQ0FNX1BIWV9DVFJMX0dDTEtfTUFTSwkJQklURklFTEQoOSwgOSkKKworLyogVXNlZCBieSBDTV9FTVVfQ0xLU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0NPUkVfRFBMTF9FTVVfQ0xLX1NISUZUCQkoMSA8PCA5KQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9DT1JFX0RQTExfRU1VX0NMS19NQVNLCQlCSVRGSUVMRCg5LCA5KQorCisvKiBVc2VkIGJ5IENNX0NFRlVTRV9DTEtTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfQ1VTVF9FRlVTRV9TWVNfQ0xLX1NISUZUCQkoMSA8PCA5KQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9DVVNUX0VGVVNFX1NZU19DTEtfTUFTSwkJQklURklFTEQoOSwgOSkKKworLyogVXNlZCBieSBDTV9NRU1JRl9DTEtTVENUUkwsIENNX01FTUlGX0NMS1NUQ1RSTF9SRVNUT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0RMTF9DTEtfU0hJRlQJCQkoMSA8PCA5KQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9ETExfQ0xLX01BU0sJCQlCSVRGSUVMRCg5LCA5KQorCisvKiBVc2VkIGJ5IENNX0w0UEVSX0NMS1NUQ1RSTCwgQ01fTDRQRVJfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfRE1UMTBfR0ZDTEtfU0hJRlQJCQkoMSA8PCA5KQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9ETVQxMF9HRkNMS19NQVNLCQkJQklURklFTEQoOSwgOSkKKworLyogVXNlZCBieSBDTV9MNFBFUl9DTEtTVENUUkwsIENNX0w0UEVSX0NMS1NUQ1RSTF9SRVNUT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0RNVDExX0dGQ0xLX1NISUZUCQkJKDEgPDwgMTApCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0RNVDExX0dGQ0xLX01BU0sJCQlCSVRGSUVMRCgxMCwgMTApCisKKy8qIFVzZWQgYnkgQ01fTDRQRVJfQ0xLU1RDVFJMLCBDTV9MNFBFUl9DTEtTVENUUkxfUkVTVE9SRSAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9ETVQyX0dGQ0xLX1NISUZUCQkJKDEgPDwgMTEpCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0RNVDJfR0ZDTEtfTUFTSwkJCUJJVEZJRUxEKDExLCAxMSkKKworLyogVXNlZCBieSBDTV9MNFBFUl9DTEtTVENUUkwsIENNX0w0UEVSX0NMS1NUQ1RSTF9SRVNUT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0RNVDNfR0ZDTEtfU0hJRlQJCQkoMSA8PCAxMikKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfRE1UM19HRkNMS19NQVNLCQkJQklURklFTEQoMTIsIDEyKQorCisvKiBVc2VkIGJ5IENNX0w0UEVSX0NMS1NUQ1RSTCwgQ01fTDRQRVJfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfRE1UNF9HRkNMS19TSElGVAkJCSgxIDw8IDEzKQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9ETVQ0X0dGQ0xLX01BU0sJCQlCSVRGSUVMRCgxMywgMTMpCisKKy8qIFVzZWQgYnkgQ01fTDRQRVJfQ0xLU1RDVFJMLCBDTV9MNFBFUl9DTEtTVENUUkxfUkVTVE9SRSAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9ETVQ5X0dGQ0xLX1NISUZUCQkJKDEgPDwgMTQpCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0RNVDlfR0ZDTEtfTUFTSwkJCUJJVEZJRUxEKDE0LCAxNCkKKworLyogVXNlZCBieSBDTV9EU1NfQ0xLU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0RTU19BTFdPTl9TWVNfQ0xLX1NISUZUCQkoMSA8PCAxMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfRFNTX0FMV09OX1NZU19DTEtfTUFTSwkJQklURklFTEQoMTAsIDEwKQorCisvKiBVc2VkIGJ5IENNX0RTU19DTEtTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfRFNTX0ZDTEtfU0hJRlQJCQkoMSA8PCA5KQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9EU1NfRkNMS19NQVNLCQkJQklURklFTEQoOSwgOSkKKworLyogVXNlZCBieSBDTV9EVUNBVElfQ0xLU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0RVQ0FUSV9HQ0xLX1NISUZUCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfRFVDQVRJX0dDTEtfTUFTSwkJCUJJVEZJRUxEKDgsIDgpCisKKy8qIFVzZWQgYnkgQ01fTDNJTklUX0NMS1NUQ1RSTCwgQ01fTDNJTklUX0NMS1NUQ1RSTF9SRVNUT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0VNQUNfNTBNSFpfQ0xLX1NISUZUCQkoMSA8PCAxMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfRU1BQ181ME1IWl9DTEtfTUFTSwkJQklURklFTEQoMTAsIDEwKQorCisvKiBVc2VkIGJ5IENNX0VNVV9DTEtTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfRU1VX1NZU19DTEtfU0hJRlQJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9FTVVfU1lTX0NMS19NQVNLCQkJQklURklFTEQoOCwgOCkKKworLyogVXNlZCBieSBDTV9DQU1fQ0xLU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0ZESUZfR0ZDTEtfU0hJRlQJCQkoMSA8PCAxMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfRkRJRl9HRkNMS19NQVNLCQkJQklURklFTEQoMTAsIDEwKQorCisvKiBVc2VkIGJ5IENNX0w0UEVSX0NMS1NUQ1RSTCwgQ01fTDRQRVJfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfRlVOQ18xMk1fR0ZDTEtfU0hJRlQJCSgxIDw8IDE1KQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9GVU5DXzEyTV9HRkNMS19NQVNLCQlCSVRGSUVMRCgxNSwgMTUpCisKKy8qIFVzZWQgYnkgQ00xX0FCRV9DTEtTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfRlVOQ18yNE1fR0ZDTEtfU0hJRlQJCSgxIDw8IDEwKQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9GVU5DXzI0TV9HRkNMS19NQVNLCQlCSVRGSUVMRCgxMCwgMTApCisKKy8qIFVzZWQgYnkgQ01fRFNTX0NMS1NUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9IRE1JX1BIWV80OE1IWl9HRkNMS19TSElGVAkJKDEgPDwgMTEpCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0hETUlfUEhZXzQ4TUhaX0dGQ0xLX01BU0sJCUJJVEZJRUxEKDExLCAxMSkKKworLyogVXNlZCBieSBDTV9MM0lOSVRfQ0xLU1RDVFJMLCBDTV9MM0lOSVRfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfSFNJQ19QMV80ODBNX0dGQ0xLX1NISUZUCQkoMSA8PCAyMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfSFNJQ19QMV80ODBNX0dGQ0xLX01BU0sJCUJJVEZJRUxEKDIwLCAyMCkKKworLyogVXNlZCBieSBDTV9MM0lOSVRfQ0xLU1RDVFJMLCBDTV9MM0lOSVRfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfSFNJQ19QMV9HRkNMS19TSElGVAkJKDEgPDwgMjYpCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0hTSUNfUDFfR0ZDTEtfTUFTSwkJCUJJVEZJRUxEKDI2LCAyNikKKworLyogVXNlZCBieSBDTV9MM0lOSVRfQ0xLU1RDVFJMLCBDTV9MM0lOSVRfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfSFNJQ19QMl80ODBNX0dGQ0xLX1NISUZUCQkoMSA8PCAyMSkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfSFNJQ19QMl80ODBNX0dGQ0xLX01BU0sJCUJJVEZJRUxEKDIxLCAyMSkKKworLyogVXNlZCBieSBDTV9MM0lOSVRfQ0xLU1RDVFJMLCBDTV9MM0lOSVRfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfSFNJQ19QMl9HRkNMS19TSElGVAkJKDEgPDwgMjcpCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0hTSUNfUDJfR0ZDTEtfTUFTSwkJCUJJVEZJRUxEKDI3LCAyNykKKworLyogVXNlZCBieSBDTV9MM0lOSVRfQ0xLU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0lOSVRfMzJLX0dGQ0xLX1NISUZUCQkoMSA8PCAzMSkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfSU5JVF8zMktfR0ZDTEtfTUFTSwkJQklURklFTEQoMzEsIDMxKQorCisvKiBVc2VkIGJ5IENNX0wzSU5JVF9DTEtTVENUUkwsIENNX0wzSU5JVF9DTEtTVENUUkxfUkVTVE9SRSAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9JTklUXzQ4TUNfR0ZDTEtfU0hJRlQJCSgxIDw8IDEzKQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9JTklUXzQ4TUNfR0ZDTEtfTUFTSwkJQklURklFTEQoMTMsIDEzKQorCisvKiBVc2VkIGJ5IENNX0wzSU5JVF9DTEtTVENUUkwsIENNX0wzSU5JVF9DTEtTVENUUkxfUkVTVE9SRSAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9JTklUXzQ4TV9HRkNMS19TSElGVAkJKDEgPDwgMTIpCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0lOSVRfNDhNX0dGQ0xLX01BU0sJCUJJVEZJRUxEKDEyLCAxMikKKworLyogVXNlZCBieSBDTV9MM0lOSVRfQ0xLU1RDVFJMLCBDTV9MM0lOSVRfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfSU5JVF82ME1fUDFfR0ZDTEtfU0hJRlQJCSgxIDw8IDI4KQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9JTklUXzYwTV9QMV9HRkNMS19NQVNLCQlCSVRGSUVMRCgyOCwgMjgpCisKKy8qIFVzZWQgYnkgQ01fTDNJTklUX0NMS1NUQ1RSTCwgQ01fTDNJTklUX0NMS1NUQ1RSTF9SRVNUT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0lOSVRfNjBNX1AyX0dGQ0xLX1NISUZUCQkoMSA8PCAyOSkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfSU5JVF82ME1fUDJfR0ZDTEtfTUFTSwkJQklURklFTEQoMjksIDI5KQorCisvKiBVc2VkIGJ5IENNX0wzSU5JVF9DTEtTVENUUkwsIENNX0wzSU5JVF9DTEtTVENUUkxfUkVTVE9SRSAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9JTklUXzk2TV9HRkNMS19TSElGVAkJKDEgPDwgMTEpCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0lOSVRfOTZNX0dGQ0xLX01BU0sJCUJJVEZJRUxEKDExLCAxMSkKKworLyogVXNlZCBieSBDTV9MM0lOSVRfQ0xLU1RDVFJMLCBDTV9MM0lOSVRfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfSU5JVF9IU0lfR0ZDTEtfU0hJRlQJCSgxIDw8IDE2KQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9JTklUX0hTSV9HRkNMS19NQVNLCQlCSVRGSUVMRCgxNiwgMTYpCisKKy8qIFVzZWQgYnkgQ01fTDNJTklUX0NMS1NUQ1RSTCwgQ01fTDNJTklUX0NMS1NUQ1RSTF9SRVNUT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0lOSVRfSFNNTUMxX0dGQ0xLX1NISUZUCQkoMSA8PCAxNykKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfSU5JVF9IU01NQzFfR0ZDTEtfTUFTSwkJQklURklFTEQoMTcsIDE3KQorCisvKiBVc2VkIGJ5IENNX0wzSU5JVF9DTEtTVENUUkwsIENNX0wzSU5JVF9DTEtTVENUUkxfUkVTVE9SRSAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9JTklUX0hTTU1DMl9HRkNMS19TSElGVAkJKDEgPDwgMTgpCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0lOSVRfSFNNTUMyX0dGQ0xLX01BU0sJCUJJVEZJRUxEKDE4LCAxOCkKKworLyogVXNlZCBieSBDTV9MM0lOSVRfQ0xLU1RDVFJMLCBDTV9MM0lOSVRfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfSU5JVF9IU01NQzZfR0ZDTEtfU0hJRlQJCSgxIDw8IDE5KQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9JTklUX0hTTU1DNl9HRkNMS19NQVNLCQlCSVRGSUVMRCgxOSwgMTkpCisKKy8qIFVzZWQgYnkgQ01fQ0FNX0NMS1NUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9JU1NfR0NMS19TSElGVAkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0lTU19HQ0xLX01BU0sJCQlCSVRGSUVMRCg4LCA4KQorCisvKiBVc2VkIGJ5IENNX0lWQUhEX0NMS1NUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9JVkFIRF9ST09UX0NMS19TSElGVAkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfSVZBSERfUk9PVF9DTEtfTUFTSwkJQklURklFTEQoOCwgOCkKKworLyogVXNlZCBieSBDTV9MM0lOSVRfQ0xLU1RDVFJMLCBDTV9MM0lOSVRfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfTDNJTklUX0RQTExfQUxXT05fQ0xLX1NISUZUCSgxIDw8IDE0KQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9MM0lOSVRfRFBMTF9BTFdPTl9DTEtfTUFTSwkJQklURklFTEQoMTQsIDE0KQorCisvKiBVc2VkIGJ5IENNX0wzXzFfQ0xLU1RDVFJMLCBDTV9MM18xX0NMS1NUQ1RSTF9SRVNUT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0wzXzFfR0lDTEtfU0hJRlQJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9MM18xX0dJQ0xLX01BU0sJCQlCSVRGSUVMRCg4LCA4KQorCisvKiBVc2VkIGJ5IENNX0wzXzJfQ0xLU1RDVFJMLCBDTV9MM18yX0NMS1NUQ1RSTF9SRVNUT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0wzXzJfR0lDTEtfU0hJRlQJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9MM18yX0dJQ0xLX01BU0sJCQlCSVRGSUVMRCg4LCA4KQorCisvKiBVc2VkIGJ5IENNX0QyRF9DTEtTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfTDNfRDJEX0dJQ0xLX1NISUZUCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfTDNfRDJEX0dJQ0xLX01BU0sJCQlCSVRGSUVMRCg4LCA4KQorCisvKiBVc2VkIGJ5IENNX1NETUFfQ0xLU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0wzX0RNQV9HSUNMS19TSElGVAkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0wzX0RNQV9HSUNMS19NQVNLCQkJQklURklFTEQoOCwgOCkKKworLyogVXNlZCBieSBDTV9EU1NfQ0xLU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0wzX0RTU19HSUNMS19TSElGVAkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0wzX0RTU19HSUNMS19NQVNLCQkJQklURklFTEQoOCwgOCkKKworLyogVXNlZCBieSBDTV9NRU1JRl9DTEtTVENUUkwsIENNX01FTUlGX0NMS1NUQ1RSTF9SRVNUT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0wzX0VNSUZfR0lDTEtfU0hJRlQJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0wzX0VNSUZfR0lDTEtfTUFTSwkJCUJJVEZJRUxEKDgsIDgpCisKKy8qIFVzZWQgYnkgQ01fR0ZYX0NMS1NUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9MM19HRlhfR0lDTEtfU0hJRlQJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9MM19HRlhfR0lDTEtfTUFTSwkJCUJJVEZJRUxEKDgsIDgpCisKKy8qIFVzZWQgYnkgQ01fTDNJTklUX0NMS1NUQ1RSTCwgQ01fTDNJTklUX0NMS1NUQ1RSTF9SRVNUT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0wzX0lOSVRfR0lDTEtfU0hJRlQJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0wzX0lOSVRfR0lDTEtfTUFTSwkJCUJJVEZJRUxEKDgsIDgpCisKKy8qIFVzZWQgYnkgQ01fTDNJTlNUUl9DTEtTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfTDNfSU5TVFJfR0lDTEtfU0hJRlQJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0wzX0lOU1RSX0dJQ0xLX01BU0sJCUJJVEZJRUxEKDgsIDgpCisKKy8qIFVzZWQgYnkgQ01fTDRTRUNfQ0xLU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0wzX1NFQ1VSRV9HSUNMS19TSElGVAkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfTDNfU0VDVVJFX0dJQ0xLX01BU0sJCUJJVEZJRUxEKDgsIDgpCisKKy8qIFVzZWQgYnkgQ01fQUxXT05fQ0xLU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0w0X0FPX0lDTEtfU0hJRlQJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9MNF9BT19JQ0xLX01BU0sJCQlCSVRGSUVMRCg4LCA4KQorCisvKiBVc2VkIGJ5IENNX0NFRlVTRV9DTEtTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfTDRfQ0VGVVNFX0dJQ0xLX1NISUZUCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9MNF9DRUZVU0VfR0lDTEtfTUFTSwkJQklURklFTEQoOCwgOCkKKworLyogVXNlZCBieSBDTV9MNENGR19DTEtTVENUUkwsIENNX0w0Q0ZHX0NMS1NUQ1RSTF9SRVNUT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0w0X0NGR19HSUNMS19TSElGVAkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0w0X0NGR19HSUNMS19NQVNLCQkJQklURklFTEQoOCwgOCkKKworLyogVXNlZCBieSBDTV9EMkRfQ0xLU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0w0X0QyRF9HSUNMS19TSElGVAkJCSgxIDw8IDkpCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0w0X0QyRF9HSUNMS19NQVNLCQkJQklURklFTEQoOSwgOSkKKworLyogVXNlZCBieSBDTV9MM0lOSVRfQ0xLU1RDVFJMLCBDTV9MM0lOSVRfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfTDRfSU5JVF9HSUNMS19TSElGVAkJKDEgPDwgOSkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfTDRfSU5JVF9HSUNMS19NQVNLCQkJQklURklFTEQoOSwgOSkKKworLyogVXNlZCBieSBDTV9MNFBFUl9DTEtTVENUUkwsIENNX0w0UEVSX0NMS1NUQ1RSTF9SRVNUT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0w0X1BFUl9HSUNMS19TSElGVAkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX0w0X1BFUl9HSUNMS19NQVNLCQkJQklURklFTEQoOCwgOCkKKworLyogVXNlZCBieSBDTV9MNFNFQ19DTEtTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfTDRfU0VDVVJFX0dJQ0xLX1NISUZUCQkoMSA8PCA5KQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9MNF9TRUNVUkVfR0lDTEtfTUFTSwkJQklURklFTEQoOSwgOSkKKworLyogVXNlZCBieSBDTV9XS1VQX0NMS1NUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9MNF9XS1VQX0dJQ0xLX1NISUZUCQkoMSA8PCAxMikKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfTDRfV0tVUF9HSUNMS19NQVNLCQkJQklURklFTEQoMTIsIDEyKQorCisvKiBVc2VkIGJ5IENNX01QVV9DTEtTVENUUkwsIENNX01QVV9DTEtTVENUUkxfUkVTVE9SRSAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9NUFVfRFBMTF9DTEtfU0hJRlQJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9NUFVfRFBMTF9DTEtfTUFTSwkJCUJJVEZJRUxEKDgsIDgpCisKKy8qIFVzZWQgYnkgQ00xX0FCRV9DTEtTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfT0NQX0FCRV9HSUNMS19TSElGVAkJKDEgPDwgOSkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfT0NQX0FCRV9HSUNMS19NQVNLCQkJQklURklFTEQoOSwgOSkKKworLyogVXNlZCBieSBDTV9MNFBFUl9DTEtTVENUUkwsIENNX0w0UEVSX0NMS1NUQ1RSTF9SRVNUT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1BFUl8yNE1DX0dGQ0xLX1NISUZUCQkoMSA8PCAxNikKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfUEVSXzI0TUNfR0ZDTEtfTUFTSwkJQklURklFTEQoMTYsIDE2KQorCisvKiBVc2VkIGJ5IENNX0w0UEVSX0NMS1NUQ1RSTCwgQ01fTDRQRVJfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfUEVSXzMyS19HRkNMS19TSElGVAkJKDEgPDwgMTcpCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1BFUl8zMktfR0ZDTEtfTUFTSwkJCUJJVEZJRUxEKDE3LCAxNykKKworLyogVXNlZCBieSBDTV9MNFBFUl9DTEtTVENUUkwsIENNX0w0UEVSX0NMS1NUQ1RSTF9SRVNUT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1BFUl80OE1fR0ZDTEtfU0hJRlQJCSgxIDw8IDE4KQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9QRVJfNDhNX0dGQ0xLX01BU0sJCQlCSVRGSUVMRCgxOCwgMTgpCisKKy8qIFVzZWQgYnkgQ01fTDRQRVJfQ0xLU1RDVFJMLCBDTV9MNFBFUl9DTEtTVENUUkxfUkVTVE9SRSAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9QRVJfOTZNX0dGQ0xLX1NISUZUCQkoMSA8PCAxOSkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfUEVSXzk2TV9HRkNMS19NQVNLCQkJQklURklFTEQoMTksIDE5KQorCisvKiBVc2VkIGJ5IENNX0w0UEVSX0NMS1NUQ1RSTCwgQ01fTDRQRVJfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfUEVSX0FCRV8yNE1fR0ZDTEtfU0hJRlQJCSgxIDw8IDI1KQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9QRVJfQUJFXzI0TV9HRkNMS19NQVNLCQlCSVRGSUVMRCgyNSwgMjUpCisKKy8qIFVzZWQgYnkgQ01fRU1VX0NMS1NUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9QRVJfRFBMTF9FTVVfQ0xLX1NISUZUCQkoMSA8PCAxMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfUEVSX0RQTExfRU1VX0NMS19NQVNLCQlCSVRGSUVMRCgxMCwgMTApCisKKy8qIFVzZWQgYnkgQ01fTDRQRVJfQ0xLU1RDVFJMLCBDTV9MNFBFUl9DTEtTVENUUkxfUkVTVE9SRSAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9QRVJfTUNBU1AyX0dGQ0xLX1NISUZUCQkoMSA8PCAyMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfUEVSX01DQVNQMl9HRkNMS19NQVNLCQlCSVRGSUVMRCgyMCwgMjApCisKKy8qIFVzZWQgYnkgQ01fTDRQRVJfQ0xLU1RDVFJMLCBDTV9MNFBFUl9DTEtTVENUUkxfUkVTVE9SRSAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9QRVJfTUNBU1AzX0dGQ0xLX1NISUZUCQkoMSA8PCAyMSkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfUEVSX01DQVNQM19HRkNMS19NQVNLCQlCSVRGSUVMRCgyMSwgMjEpCisKKy8qIFVzZWQgYnkgQ01fTDRQRVJfQ0xLU1RDVFJMLCBDTV9MNFBFUl9DTEtTVENUUkxfUkVTVE9SRSAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9QRVJfTUNCU1A0X0dGQ0xLX1NISUZUCQkoMSA8PCAyMikKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfUEVSX01DQlNQNF9HRkNMS19NQVNLCQlCSVRGSUVMRCgyMiwgMjIpCisKKy8qIFVzZWQgYnkgQ01fTDRQRVJfQ0xLU1RDVFJMLCBDTV9MNFBFUl9DTEtTVENUUkxfUkVTVE9SRSAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9QRVJfU1lTX0dGQ0xLX1NISUZUCQkoMSA8PCAyNCkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfUEVSX1NZU19HRkNMS19NQVNLCQkJQklURklFTEQoMjQsIDI0KQorCisvKiBVc2VkIGJ5IENNX01FTUlGX0NMS1NUQ1RSTCwgQ01fTUVNSUZfQ0xLU1RDVFJMX1JFU1RPUkUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfUEhZX1JPT1RfQ0xLX1NISUZUCQkJKDEgPDwgMTApCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1BIWV9ST09UX0NMS19NQVNLCQkJQklURklFTEQoMTAsIDEwKQorCisvKiBVc2VkIGJ5IENNX0dGWF9DTEtTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfU0dYX0dGQ0xLX1NISUZUCQkJKDEgPDwgOSkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfU0dYX0dGQ0xLX01BU0sJCQlCSVRGSUVMRCg5LCA5KQorCisvKiBVc2VkIGJ5IENNX0FMV09OX0NMS1NUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9TUl9DT1JFX1NZU0NMS19TSElGVAkJKDEgPDwgMTEpCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1NSX0NPUkVfU1lTQ0xLX01BU0sJCUJJVEZJRUxEKDExLCAxMSkKKworLyogVXNlZCBieSBDTV9BTFdPTl9DTEtTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfU1JfSVZBX1NZU0NMS19TSElGVAkJKDEgPDwgMTApCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1NSX0lWQV9TWVNDTEtfTUFTSwkJCUJJVEZJRUxEKDEwLCAxMCkKKworLyogVXNlZCBieSBDTV9BTFdPTl9DTEtTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfU1JfTVBVX1NZU0NMS19TSElGVAkJKDEgPDwgOSkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfU1JfTVBVX1NZU0NMS19NQVNLCQkJQklURklFTEQoOSwgOSkKKworLyogVXNlZCBieSBDTV9XS1VQX0NMS1NUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9TWVNfQ0xLX1NISUZUCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfU1lTX0NMS19NQVNLCQkJQklURklFTEQoOCwgOCkKKworLyogVXNlZCBieSBDTV9URVNMQV9DTEtTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfVEVTTEFfUk9PVF9DTEtfU0hJRlQJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1RFU0xBX1JPT1RfQ0xLX01BU0sJCUJJVEZJRUxEKDgsIDgpCisKKy8qIFVzZWQgYnkgQ01fTDNJTklUX0NMS1NUQ1RSTCwgQ01fTDNJTklUX0NMS1NUQ1RSTF9SRVNUT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1RMTF9DSDBfR0ZDTEtfU0hJRlQJCSgxIDw8IDIyKQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9UTExfQ0gwX0dGQ0xLX01BU0sJCQlCSVRGSUVMRCgyMiwgMjIpCisKKy8qIFVzZWQgYnkgQ01fTDNJTklUX0NMS1NUQ1RSTCwgQ01fTDNJTklUX0NMS1NUQ1RSTF9SRVNUT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1RMTF9DSDFfR0ZDTEtfU0hJRlQJCSgxIDw8IDIzKQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9UTExfQ0gxX0dGQ0xLX01BU0sJCQlCSVRGSUVMRCgyMywgMjMpCisKKy8qIFVzZWQgYnkgQ01fTDNJTklUX0NMS1NUQ1RSTCwgQ01fTDNJTklUX0NMS1NUQ1RSTF9SRVNUT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1RMTF9DSDJfR0ZDTEtfU0hJRlQJCSgxIDw8IDI0KQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9UTExfQ0gyX0dGQ0xLX01BU0sJCQlCSVRGSUVMRCgyNCwgMjQpCisKKy8qIFVzZWQgYnkgQ01fTDNJTklUX0NMS1NUQ1RSTCwgQ01fTDNJTklUX0NMS1NUQ1RSTF9SRVNUT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1VTQl9EUExMX0hTX0NMS19TSElGVAkJKDEgPDwgMTUpCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1VTQl9EUExMX0hTX0NMS19NQVNLCQlCSVRGSUVMRCgxNSwgMTUpCisKKy8qIFVzZWQgYnkgQ01fV0tVUF9DTEtTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfVVNJTV9HRkNMS19TSElGVAkJCSgxIDw8IDEwKQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9VU0lNX0dGQ0xLX01BU0sJCQlCSVRGSUVMRCgxMCwgMTApCisKKy8qIFVzZWQgYnkgQ01fTDNJTklUX0NMS1NUQ1RSTCwgQ01fTDNJTklUX0NMS1NUQ1RSTF9SRVNUT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1VUTUlfUDNfR0ZDTEtfU0hJRlQJCSgxIDw8IDMwKQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9VVE1JX1AzX0dGQ0xLX01BU0sJCQlCSVRGSUVMRCgzMCwgMzApCisKKy8qIFVzZWQgYnkgQ01fTDNJTklUX0NMS1NUQ1RSTCwgQ01fTDNJTklUX0NMS1NUQ1RSTF9SRVNUT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1VUTUlfUk9PVF9HRkNMS19TSElGVAkJKDEgPDwgMjUpCisjZGVmaW5lIE9NQVA0NDMwX0NMS0FDVElWSVRZX1VUTUlfUk9PVF9HRkNMS19NQVNLCQlCSVRGSUVMRCgyNSwgMjUpCisKKy8qIFVzZWQgYnkgQ01fV0tVUF9DTEtTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLQUNUSVZJVFlfV0tVUF8zMktfR0ZDTEtfU0hJRlQJCSgxIDw8IDExKQorI2RlZmluZSBPTUFQNDQzMF9DTEtBQ1RJVklUWV9XS1VQXzMyS19HRkNMS19NQVNLCQlCSVRGSUVMRCgxMSwgMTEpCisKKy8qCisgKiBVc2VkIGJ5IENNX1dLVVBfVElNRVIxX0NMS0NUUkwsIENNX0w0UEVSX0RNVElNRVIxMF9DTEtDVFJMLAorICogQ01fTDRQRVJfRE1USU1FUjExX0NMS0NUUkwsIENNX0w0UEVSX0RNVElNRVIyX0NMS0NUUkwsCisgKiBDTV9MNFBFUl9ETVRJTUVSM19DTEtDVFJMLCBDTV9MNFBFUl9ETVRJTUVSNF9DTEtDVFJMLAorICogQ01fTDRQRVJfRE1USU1FUjlfQ0xLQ1RSTCwgQ01fTDRQRVJfTUNBU1AyX0NMS0NUUkwsIENNX0w0UEVSX01DQVNQM19DTEtDVFJMLAorICogQ01fTDNJTklUX01NQzFfQ0xLQ1RSTCwgQ01fTDNJTklUX01NQzJfQ0xLQ1RSTCwgQ01fTDNJTklUX01NQzZfQ0xLQ1RSTCwKKyAqIENNMV9BQkVfVElNRVI1X0NMS0NUUkwsIENNMV9BQkVfVElNRVI2X0NMS0NUUkwsIENNMV9BQkVfVElNRVI3X0NMS0NUUkwsCisgKiBDTTFfQUJFX1RJTUVSOF9DTEtDVFJMCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLU0VMX1NISUZUCQkJCQkoMSA8PCAyNCkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLU0VMX01BU0sJCQkJCUJJVEZJRUxEKDI0LCAyNCkKKworLyoKKyAqIFJlbmFtZWQgZnJvbSBDTEtTRUwgVXNlZCBieSBDTV9BQkVfRFNTX1NZU19DTEtTRUwsIENNX0FCRV9QTExfUkVGX0NMS1NFTCwKKyAqIENNX0RQTExfU1lTX1JFRl9DTEtTRUwsIENNX0w0X1dLVVBfQ0xLU0VMLCBDTV9DTEtTRUxfRFVDQVRJX0lTU19ST09ULAorICogQ01fQ0xLU0VMX1VTQl82ME1IWgorICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS1NFTF8wXzBfU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLU0VMXzBfMF9NQVNLCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFJlbmFtZWQgZnJvbSBDTEtTRUwgVXNlZCBieSBDTV9CWVBDTEtfRFBMTF9JVkEsIENNX0JZUENMS19EUExMX01QVSAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtTRUxfMF8xX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX0NMS1NFTF8wXzFfTUFTSwkJCQlCSVRGSUVMRCgwLCAxKQorCisvKiBSZW5hbWVkIGZyb20gQ0xLU0VMIFVzZWQgYnkgQ01fTDNJTklUX0hTSV9DTEtDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS1NFTF8yNF8yNV9TSElGVAkJCQkoMSA8PCAyNCkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLU0VMXzI0XzI1X01BU0sJCQkJQklURklFTEQoMjQsIDI1KQorCisvKiBVc2VkIGJ5IENNX0wzSU5JVF9VU0JfT1RHX0NMS0NUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLU0VMXzYwTV9TSElGVAkJCQkoMSA8PCAyNCkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLU0VMXzYwTV9NQVNLCQkJCUJJVEZJRUxEKDI0LCAyNCkKKworLyogVXNlZCBieSBDTTFfQUJFX0FFU1NfQ0xLQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtTRUxfQUVTU19GQ0xLX1NISUZUCQkJCSgxIDw8IDI0KQorI2RlZmluZSBPTUFQNDQzMF9DTEtTRUxfQUVTU19GQ0xLX01BU0sJCQkJQklURklFTEQoMjQsIDI0KQorCisvKiBVc2VkIGJ5IENNX0NMS1NFTF9DT1JFX1JFU1RPUkUsIENNX0NMS1NFTF9DT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS1NFTF9DT1JFX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX0NMS1NFTF9DT1JFX01BU0sJCQkJQklURklFTEQoMCwgMCkKKworLyogUmVuYW1lZCBmcm9tIENMS1NFTF9DT1JFIFVzZWQgYnkgQ01fU0hBRE9XX0ZSRVFfQ09ORklHMiAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtTRUxfQ09SRV8xXzFfU0hJRlQJCQkJKDEgPDwgMSkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLU0VMX0NPUkVfMV8xX01BU0sJCQkJQklURklFTEQoMSwgMSkKKworLyogVXNlZCBieSBDTV9XS1VQX1VTSU1fQ0xLQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtTRUxfRElWX1NISUZUCQkJCSgxIDw8IDI0KQorI2RlZmluZSBPTUFQNDQzMF9DTEtTRUxfRElWX01BU0sJCQkJQklURklFTEQoMjQsIDI0KQorCisvKiBVc2VkIGJ5IENNX0NBTV9GRElGX0NMS0NUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLU0VMX0ZDTEtfU0hJRlQJCQkJKDEgPDwgMjQpCisjZGVmaW5lIE9NQVA0NDMwX0NMS1NFTF9GQ0xLX01BU0sJCQkJQklURklFTEQoMjQsIDI1KQorCisvKiBVc2VkIGJ5IENNX0w0UEVSX01DQlNQNF9DTEtDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS1NFTF9JTlRFUk5BTF9TT1VSQ0VfU0hJRlQJCQkoMSA8PCAyNSkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLU0VMX0lOVEVSTkFMX1NPVVJDRV9NQVNLCQkJQklURklFTEQoMjUsIDI1KQorCisvKgorICogUmVuYW1lZCBmcm9tIENMS1NFTF9JTlRFUk5BTF9TT1VSQ0UgVXNlZCBieSBDTTFfQUJFX0RNSUNfQ0xLQ1RSTCwKKyAqIENNMV9BQkVfTUNBU1BfQ0xLQ1RSTCwgQ00xX0FCRV9NQ0JTUDFfQ0xLQ1RSTCwgQ00xX0FCRV9NQ0JTUDJfQ0xLQ1RSTCwKKyAqIENNMV9BQkVfTUNCU1AzX0NMS0NUUkwKKyAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtTRUxfSU5URVJOQUxfU09VUkNFX0NNMV9BQkVfRE1JQ19TSElGVAkoMSA8PCAyNikKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLU0VMX0lOVEVSTkFMX1NPVVJDRV9DTTFfQUJFX0RNSUNfTUFTSwlCSVRGSUVMRCgyNiwgMjcpCisKKy8qIFVzZWQgYnkgQ01fQ0xLU0VMX0NPUkVfUkVTVE9SRSwgQ01fQ0xLU0VMX0NPUkUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLU0VMX0wzX1NISUZUCQkJCSgxIDw8IDQpCisjZGVmaW5lIE9NQVA0NDMwX0NMS1NFTF9MM19NQVNLCQkJCQlCSVRGSUVMRCg0LCA0KQorCisvKiBSZW5hbWVkIGZyb20gQ0xLU0VMX0wzIFVzZWQgYnkgQ01fU0hBRE9XX0ZSRVFfQ09ORklHMiAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtTRUxfTDNfU0hBRE9XX1NISUZUCQkJCSgxIDw8IDIpCisjZGVmaW5lIE9NQVA0NDMwX0NMS1NFTF9MM19TSEFET1dfTUFTSwkJCQlCSVRGSUVMRCgyLCAyKQorCisvKiBVc2VkIGJ5IENNX0NMS1NFTF9DT1JFX1JFU1RPUkUsIENNX0NMS1NFTF9DT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS1NFTF9MNF9TSElGVAkJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9DTEtTRUxfTDRfTUFTSwkJCQkJQklURklFTEQoOCwgOCkKKworLyogVXNlZCBieSBDTV9DTEtTRUxfQUJFICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS1NFTF9PUFBfU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLU0VMX09QUF9NQVNLCQkJCUJJVEZJRUxEKDAsIDEpCisKKy8qIFVzZWQgYnkgQ01fR0ZYX0dGWF9DTEtDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS1NFTF9QRVJfMTkyTV9TSElGVAkJCQkoMSA8PCAyNSkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLU0VMX1BFUl8xOTJNX01BU0sJCQkJQklURklFTEQoMjUsIDI2KQorCisvKiBVc2VkIGJ5IENNX0VNVV9ERUJVR1NTX0NMS0NUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLU0VMX1BNRF9TVE1fQ0xLX1NISUZUCQkJKDEgPDwgMjcpCisjZGVmaW5lIE9NQVA0NDMwX0NMS1NFTF9QTURfU1RNX0NMS19NQVNLCQkJQklURklFTEQoMjcsIDI5KQorCisvKiBVc2VkIGJ5IENNX0VNVV9ERUJVR1NTX0NMS0NUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLU0VMX1BNRF9UUkFDRV9DTEtfU0hJRlQJCQkoMSA8PCAyNCkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLU0VMX1BNRF9UUkFDRV9DTEtfTUFTSwkJCUJJVEZJRUxEKDI0LCAyNikKKworLyogVXNlZCBieSBDTV9HRlhfR0ZYX0NMS0NUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLU0VMX1NHWF9GQ0xLX1NISUZUCQkJCSgxIDw8IDI0KQorI2RlZmluZSBPTUFQNDQzMF9DTEtTRUxfU0dYX0ZDTEtfTUFTSwkJCQlCSVRGSUVMRCgyNCwgMjQpCisKKy8qCisgKiBVc2VkIGJ5IENNMV9BQkVfRE1JQ19DTEtDVFJMLCBDTTFfQUJFX01DQVNQX0NMS0NUUkwsIENNMV9BQkVfTUNCU1AxX0NMS0NUUkwsCisgKiBDTTFfQUJFX01DQlNQMl9DTEtDVFJMLCBDTTFfQUJFX01DQlNQM19DTEtDVFJMCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLU0VMX1NPVVJDRV9TSElGVAkJCQkoMSA8PCAyNCkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLU0VMX1NPVVJDRV9NQVNLCQkJCUJJVEZJRUxEKDI0LCAyNSkKKworLyogUmVuYW1lZCBmcm9tIENMS1NFTF9TT1VSQ0UgVXNlZCBieSBDTV9MNFBFUl9NQ0JTUDRfQ0xLQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtTRUxfU09VUkNFXzI0XzI0X1NISUZUCQkJKDEgPDwgMjQpCisjZGVmaW5lIE9NQVA0NDMwX0NMS1NFTF9TT1VSQ0VfMjRfMjRfTUFTSwkJCUJJVEZJRUxEKDI0LCAyNCkKKworLyogVXNlZCBieSBDTV9MM0lOSVRfVVNCX0hPU1RfQ0xLQ1RSTCwgQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkxfUkVTVE9SRSAqLworI2RlZmluZSBPTUFQNDQzMF9DTEtTRUxfVVRNSV9QMV9TSElGVAkJCQkoMSA8PCAyNCkKKyNkZWZpbmUgT01BUDQ0MzBfQ0xLU0VMX1VUTUlfUDFfTUFTSwkJCQlCSVRGSUVMRCgyNCwgMjQpCisKKy8qIFVzZWQgYnkgQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkwsIENNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMX1JFU1RPUkUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLU0VMX1VUTUlfUDJfU0hJRlQJCQkJKDEgPDwgMjUpCisjZGVmaW5lIE9NQVA0NDMwX0NMS1NFTF9VVE1JX1AyX01BU0sJCQkJQklURklFTEQoMjUsIDI1KQorCisvKgorICogVXNlZCBieSBDTV9XS1VQX0NMS1NUQ1RSTCwgQ01fRU1VX0NMS1NUQ1RSTCwgQ01fRDJEX0NMS1NUQ1RSTCwKKyAqIENNX0RVQ0FUSV9DTEtTVENUUkwsIENNX0wzSU5TVFJfQ0xLU1RDVFJMLCBDTV9MM18xX0NMS1NUQ1RSTCwKKyAqIENNX0wzXzJfQ0xLU1RDVFJMLCBDTV9MNENGR19DTEtTVENUUkwsIENNX01FTUlGX0NMS1NUQ1RSTCwKKyAqIENNX1NETUFfQ0xLU1RDVFJMLCBDTV9HRlhfQ0xLU1RDVFJMLCBDTV9MNFBFUl9DTEtTVENUUkwsIENNX0w0U0VDX0NMS1NUQ1RSTCwKKyAqIENNX0wzSU5JVF9DTEtTVENUUkwsIENNX0NBTV9DTEtTVENUUkwsIENNX0NFRlVTRV9DTEtTVENUUkwsCisgKiBDTV9MM0lOSVRfQ0xLU1RDVFJMX1JFU1RPUkUsIENNX0wzXzFfQ0xLU1RDVFJMX1JFU1RPUkUsCisgKiBDTV9MM18yX0NMS1NUQ1RSTF9SRVNUT1JFLCBDTV9MNENGR19DTEtTVENUUkxfUkVTVE9SRSwKKyAqIENNX0w0UEVSX0NMS1NUQ1RSTF9SRVNUT1JFLCBDTV9NRU1JRl9DTEtTVENUUkxfUkVTVE9SRSwgQ01fQUxXT05fQ0xLU1RDVFJMLAorICogQ01fSVZBSERfQ0xLU1RDVFJMLCBDTV9EU1NfQ0xLU1RDVFJMLCBDTV9NUFVfQ0xLU1RDVFJMLCBDTV9URVNMQV9DTEtTVENUUkwsCisgKiBDTTFfQUJFX0NMS1NUQ1RSTCwgQ01fTVBVX0NMS1NUQ1RSTF9SRVNUT1JFCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0xLVFJDVFJMX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX0NMS1RSQ1RSTF9NQVNLCQkJCQlCSVRGSUVMRCgwLCAxKQorCisvKiBVc2VkIGJ5IENNX0VNVV9PVkVSUklERV9EUExMX0NPUkUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ09SRV9EUExMX0VNVV9ESVZfU0hJRlQJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9DT1JFX0RQTExfRU1VX0RJVl9NQVNLCQkJCUJJVEZJRUxEKDAsIDYpCisKKy8qIFVzZWQgYnkgQ01fRU1VX09WRVJSSURFX0RQTExfQ09SRSAqLworI2RlZmluZSBPTUFQNDQzMF9DT1JFX0RQTExfRU1VX01VTFRfU0hJRlQJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9DT1JFX0RQTExfRU1VX01VTFRfTUFTSwkJCUJJVEZJRUxEKDgsIDE4KQorCisvKiBVc2VkIGJ5IENNX0wzXzJfRFlOQU1JQ0RFUCwgQ01fTDRDRkdfRFlOQU1JQ0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9EMkRfRFlOREVQX1NISUZUCQkJCSgxIDw8IDE4KQorI2RlZmluZSBPTUFQNDQzMF9EMkRfRFlOREVQX01BU0sJCQkJQklURklFTEQoMTgsIDE4KQorCisvKiBVc2VkIGJ5IENNX01QVV9TVEFUSUNERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRDJEX1NUQVRERVBfU0hJRlQJCQkJKDEgPDwgMTgpCisjZGVmaW5lIE9NQVA0NDMwX0QyRF9TVEFUREVQX01BU0sJCQkJQklURklFTEQoMTgsIDE4KQorCisvKgorICogVXNlZCBieSBDTV9TU0NfREVMVEFNU1RFUF9EUExMX1BFUiwgQ01fU1NDX0RFTFRBTVNURVBfRFBMTF9VTklQUk8sCisgKiBDTV9TU0NfREVMVEFNU1RFUF9EUExMX1VTQiwgQ01fU1NDX0RFTFRBTVNURVBfRFBMTF9DT1JFX1JFU1RPUkUsCisgKiBDTV9TU0NfREVMVEFNU1RFUF9EUExMX0FCRSwgQ01fU1NDX0RFTFRBTVNURVBfRFBMTF9DT1JFLAorICogQ01fU1NDX0RFTFRBTVNURVBfRFBMTF9ERFJQSFksIENNX1NTQ19ERUxUQU1TVEVQX0RQTExfSVZBLAorICogQ01fU1NDX0RFTFRBTVNURVBfRFBMTF9NUFUKKyAqLworI2RlZmluZSBPTUFQNDQzMF9ERUxUQU1TVEVQX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX0RFTFRBTVNURVBfTUFTSwkJCQlCSVRGSUVMRCgwLCAxOSkKKworLyogVXNlZCBieSBDTV9TSEFET1dfRlJFUV9DT05GSUcxX1JFU1RPUkUsIENNX1NIQURPV19GUkVRX0NPTkZJRzEgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRExMX09WRVJSSURFX1NISUZUCQkJCSgxIDw8IDIpCisjZGVmaW5lIE9NQVA0NDMwX0RMTF9PVkVSUklERV9NQVNLCQkJCUJJVEZJRUxEKDIsIDIpCisKKy8qIFJlbmFtZWQgZnJvbSBETExfT1ZFUlJJREUgVXNlZCBieSBDTV9ETExfQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9ETExfT1ZFUlJJREVfMF8wX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX0RMTF9PVkVSUklERV8wXzBfTUFTSwkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IENNX1NIQURPV19GUkVRX0NPTkZJRzFfUkVTVE9SRSwgQ01fU0hBRE9XX0ZSRVFfQ09ORklHMSAqLworI2RlZmluZSBPTUFQNDQzMF9ETExfUkVTRVRfU0hJRlQJCQkJKDEgPDwgMykKKyNkZWZpbmUgT01BUDQ0MzBfRExMX1JFU0VUX01BU0sJCQkJCUJJVEZJRUxEKDMsIDMpCisKKy8qCisgKiBVc2VkIGJ5IENNX0NMS1NFTF9EUExMX1BFUiwgQ01fQ0xLU0VMX0RQTExfVU5JUFJPLCBDTV9DTEtTRUxfRFBMTF9VU0IsCisgKiBDTV9DTEtTRUxfRFBMTF9DT1JFX1JFU1RPUkUsIENNX0NMS1NFTF9EUExMX0FCRSwgQ01fQ0xLU0VMX0RQTExfQ09SRSwKKyAqIENNX0NMS1NFTF9EUExMX0REUlBIWSwgQ01fQ0xLU0VMX0RQTExfSVZBLCBDTV9DTEtTRUxfRFBMTF9NUFUKKyAqLworI2RlZmluZSBPTUFQNDQzMF9EUExMX0JZUF9DTEtTRUxfU0hJRlQJCQkJKDEgPDwgMjMpCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfQllQX0NMS1NFTF9NQVNLCQkJCUJJVEZJRUxEKDIzLCAyMykKKworLyogVXNlZCBieSBDTV9DTEtEQ09MRE9fRFBMTF9VU0IgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9DTEtEQ09MRE9fR0FURV9DVFJMX1NISUZUCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9DTEtEQ09MRE9fR0FURV9DVFJMX01BU0sJCQlCSVRGSUVMRCg4LCA4KQorCisvKiBVc2VkIGJ5IENNX0NMS1NFTF9EUExMX0NPUkVfUkVTVE9SRSwgQ01fQ0xLU0VMX0RQTExfQ09SRSAqLworI2RlZmluZSBPTUFQNDQzMF9EUExMX0NMS09VVEhJRl9DTEtTRUxfU0hJRlQJCQkoMSA8PCAyMCkKKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9DTEtPVVRISUZfQ0xLU0VMX01BU0sJCQlCSVRGSUVMRCgyMCwgMjApCisKKy8qCisgKiBVc2VkIGJ5IENNX0RJVl9NM19EUExMX1BFUiwgQ01fRElWX00zX0RQTExfQ09SRV9SRVNUT1JFLCBDTV9ESVZfTTNfRFBMTF9BQkUsCisgKiBDTV9ESVZfTTNfRFBMTF9DT1JFCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9DTEtPVVRISUZfRElWX1NISUZUCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9DTEtPVVRISUZfRElWX01BU0sJCQlCSVRGSUVMRCgwLCA0KQorCisvKgorICogVXNlZCBieSBDTV9ESVZfTTNfRFBMTF9QRVIsIENNX0RJVl9NM19EUExMX0NPUkVfUkVTVE9SRSwgQ01fRElWX00zX0RQTExfQUJFLAorICogQ01fRElWX00zX0RQTExfQ09SRQorICovCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfQ0xLT1VUSElGX0RJVkNIQUNLX1NISUZUCQkJKDEgPDwgNSkKKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9DTEtPVVRISUZfRElWQ0hBQ0tfTUFTSwkJCUJJVEZJRUxEKDUsIDUpCisKKy8qCisgKiBVc2VkIGJ5IENNX0RJVl9NM19EUExMX1BFUiwgQ01fRElWX00zX0RQTExfQ09SRV9SRVNUT1JFLCBDTV9ESVZfTTNfRFBMTF9BQkUsCisgKiBDTV9ESVZfTTNfRFBMTF9DT1JFCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9DTEtPVVRISUZfR0FURV9DVFJMX1NISUZUCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9DTEtPVVRISUZfR0FURV9DVFJMX01BU0sJCQlCSVRGSUVMRCg4LCA4KQorCisvKiBVc2VkIGJ5IENNX0RJVl9NMl9EUExMX1BFUiwgQ01fRElWX00yX0RQTExfVU5JUFJPLCBDTV9ESVZfTTJfRFBMTF9BQkUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9DTEtPVVRYMl9HQVRFX0NUUkxfU0hJRlQJCQkoMSA8PCAxMCkKKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9DTEtPVVRYMl9HQVRFX0NUUkxfTUFTSwkJCUJJVEZJRUxEKDEwLCAxMCkKKworLyoKKyAqIFVzZWQgYnkgQ01fRElWX00yX0RQTExfUEVSLCBDTV9ESVZfTTJfRFBMTF9VTklQUk8sCisgKiBDTV9ESVZfTTJfRFBMTF9DT1JFX1JFU1RPUkUsIENNX0RJVl9NMl9EUExMX0FCRSwgQ01fRElWX00yX0RQTExfQ09SRSwKKyAqIENNX0RJVl9NMl9EUExMX0REUlBIWSwgQ01fRElWX00yX0RQTExfTVBVCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9DTEtPVVRfRElWX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfQ0xLT1VUX0RJVl9NQVNLCQkJCUJJVEZJRUxEKDAsIDQpCisKKy8qIFJlbmFtZWQgZnJvbSBEUExMX0NMS09VVF9ESVYgVXNlZCBieSBDTV9ESVZfTTJfRFBMTF9VU0IgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9DTEtPVVRfRElWXzBfNl9TSElGVAkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfQ0xLT1VUX0RJVl8wXzZfTUFTSwkJCUJJVEZJRUxEKDAsIDYpCisKKy8qCisgKiBVc2VkIGJ5IENNX0RJVl9NMl9EUExMX1BFUiwgQ01fRElWX00yX0RQTExfVU5JUFJPLAorICogQ01fRElWX00yX0RQTExfQ09SRV9SRVNUT1JFLCBDTV9ESVZfTTJfRFBMTF9BQkUsIENNX0RJVl9NMl9EUExMX0NPUkUsCisgKiBDTV9ESVZfTTJfRFBMTF9ERFJQSFksIENNX0RJVl9NMl9EUExMX01QVQorICovCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfQ0xLT1VUX0RJVkNIQUNLX1NISUZUCQkJKDEgPDwgNSkKKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9DTEtPVVRfRElWQ0hBQ0tfTUFTSwkJCUJJVEZJRUxEKDUsIDUpCisKKy8qIFJlbmFtZWQgZnJvbSBEUExMX0NMS09VVF9ESVZDSEFDSyBVc2VkIGJ5IENNX0RJVl9NMl9EUExMX1VTQiAqLworI2RlZmluZSBPTUFQNDQzMF9EUExMX0NMS09VVF9ESVZDSEFDS19NMl9VU0JfU0hJRlQJCSgxIDw8IDcpCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfQ0xLT1VUX0RJVkNIQUNLX00yX1VTQl9NQVNLCQlCSVRGSUVMRCg3LCA3KQorCisvKgorICogVXNlZCBieSBDTV9ESVZfTTJfRFBMTF9QRVIsIENNX0RJVl9NMl9EUExMX1VTQiwgQ01fRElWX00yX0RQTExfQ09SRV9SRVNUT1JFLAorICogQ01fRElWX00yX0RQTExfQUJFLCBDTV9ESVZfTTJfRFBMTF9DT1JFLCBDTV9ESVZfTTJfRFBMTF9ERFJQSFksCisgKiBDTV9ESVZfTTJfRFBMTF9NUFUKKyAqLworI2RlZmluZSBPTUFQNDQzMF9EUExMX0NMS09VVF9HQVRFX0NUUkxfU0hJRlQJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9EUExMX0NMS09VVF9HQVRFX0NUUkxfTUFTSwkJCUJJVEZJRUxEKDgsIDgpCisKKy8qIFVzZWQgYnkgQ01fU0hBRE9XX0ZSRVFfQ09ORklHMV9SRVNUT1JFLCBDTV9TSEFET1dfRlJFUV9DT05GSUcxICovCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfQ09SRV9EUExMX0VOX1NISUZUCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9DT1JFX0RQTExfRU5fTUFTSwkJCQlCSVRGSUVMRCg4LCAxMCkKKworLyogVXNlZCBieSBDTV9TSEFET1dfRlJFUV9DT05GSUcxX1JFU1RPUkUsIENNX1NIQURPV19GUkVRX0NPTkZJRzEgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9DT1JFX00yX0RJVl9TSElGVAkJCQkoMSA8PCAxMSkKKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9DT1JFX00yX0RJVl9NQVNLCQkJCUJJVEZJRUxEKDExLCAxNSkKKworLyogVXNlZCBieSBDTV9TSEFET1dfRlJFUV9DT05GSUcyICovCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfQ09SRV9NNV9ESVZfU0hJRlQJCQkJKDEgPDwgMykKKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9DT1JFX001X0RJVl9NQVNLCQkJCUJJVEZJRUxEKDMsIDcpCisKKy8qIFVzZWQgYnkgQ01fU0hBRE9XX0ZSRVFfQ09ORklHMV9SRVNUT1JFLCBDTV9TSEFET1dfRlJFUV9DT05GSUcxICovCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfQ09SRV9TWVNfUkVGX0NMS1NFTF9TSElGVAkJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfQ09SRV9TWVNfUkVGX0NMS1NFTF9NQVNLCQkJQklURklFTEQoMSwgMSkKKworLyoKKyAqIFVzZWQgYnkgQ01fQ0xLU0VMX0RQTExfUEVSLCBDTV9DTEtTRUxfRFBMTF9VTklQUk8sCisgKiBDTV9DTEtTRUxfRFBMTF9DT1JFX1JFU1RPUkUsIENNX0NMS1NFTF9EUExMX0FCRSwgQ01fQ0xLU0VMX0RQTExfQ09SRSwKKyAqIENNX0NMS1NFTF9EUExMX0REUlBIWSwgQ01fQ0xLU0VMX0RQTExfSVZBLCBDTV9DTEtTRUxfRFBMTF9NUFUKKyAqLworI2RlZmluZSBPTUFQNDQzMF9EUExMX0RJVl9TSElGVAkJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9ESVZfTUFTSwkJCQkJQklURklFTEQoMCwgNikKKworLyogUmVuYW1lZCBmcm9tIERQTExfRElWIFVzZWQgYnkgQ01fQ0xLU0VMX0RQTExfVVNCICovCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfRElWXzBfN19TSElGVAkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9EUExMX0RJVl8wXzdfTUFTSwkJCQlCSVRGSUVMRCgwLCA3KQorCisvKgorICogVXNlZCBieSBDTV9DTEtNT0RFX0RQTExfUEVSLCBDTV9DTEtNT0RFX0RQTExfVVNCLAorICogQ01fQ0xLTU9ERV9EUExMX0NPUkVfUkVTVE9SRSwgQ01fQ0xLTU9ERV9EUExMX0FCRSwgQ01fQ0xLTU9ERV9EUExMX0NPUkUsCisgKiBDTV9DTEtNT0RFX0RQTExfRERSUEhZLCBDTV9DTEtNT0RFX0RQTExfSVZBLCBDTV9DTEtNT0RFX0RQTExfTVBVCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9EUklGVEdVQVJEX0VOX1NISUZUCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9EUklGVEdVQVJEX0VOX01BU0sJCQlCSVRGSUVMRCg4LCA4KQorCisvKiBSZW5hbWVkIGZyb20gRFBMTF9EUklGVEdVQVJEX0VOIFVzZWQgYnkgQ01fQ0xLTU9ERV9EUExMX1VOSVBSTyAqLworI2RlZmluZSBPTUFQNDQzMF9EUExMX0RSSUZUR1VBUkRfRU5fM18zX1NISUZUCQkJKDEgPDwgMykKKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9EUklGVEdVQVJEX0VOXzNfM19NQVNLCQkJQklURklFTEQoMywgMykKKworLyoKKyAqIFVzZWQgYnkgQ01fQ0xLTU9ERV9EUExMX1BFUiwgQ01fQ0xLTU9ERV9EUExMX1VOSVBSTywgQ01fQ0xLTU9ERV9EUExMX1VTQiwKKyAqIENNX0NMS01PREVfRFBMTF9DT1JFX1JFU1RPUkUsIENNX0NMS01PREVfRFBMTF9BQkUsIENNX0NMS01PREVfRFBMTF9DT1JFLAorICogQ01fQ0xLTU9ERV9EUExMX0REUlBIWSwgQ01fQ0xLTU9ERV9EUExMX0lWQSwgQ01fQ0xLTU9ERV9EUExMX01QVQorICovCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfRU5fU0hJRlQJCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfRU5fTUFTSwkJCQkJQklURklFTEQoMCwgMikKKworLyoKKyAqIFVzZWQgYnkgQ01fQ0xLTU9ERV9EUExMX1BFUiwgQ01fQ0xLTU9ERV9EUExMX1VOSVBSTywKKyAqIENNX0NMS01PREVfRFBMTF9DT1JFX1JFU1RPUkUsIENNX0NMS01PREVfRFBMTF9BQkUsIENNX0NMS01PREVfRFBMTF9DT1JFLAorICogQ01fQ0xLTU9ERV9EUExMX0REUlBIWSwgQ01fQ0xLTU9ERV9EUExMX0lWQSwgQ01fQ0xLTU9ERV9EUExMX01QVQorICovCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfTFBNT0RFX0VOX1NISUZUCQkJCSgxIDw8IDEwKQorI2RlZmluZSBPTUFQNDQzMF9EUExMX0xQTU9ERV9FTl9NQVNLCQkJCUJJVEZJRUxEKDEwLCAxMCkKKworLyoKKyAqIFVzZWQgYnkgQ01fQ0xLU0VMX0RQTExfUEVSLCBDTV9DTEtTRUxfRFBMTF9VTklQUk8sCisgKiBDTV9DTEtTRUxfRFBMTF9DT1JFX1JFU1RPUkUsIENNX0NMS1NFTF9EUExMX0FCRSwgQ01fQ0xLU0VMX0RQTExfQ09SRSwKKyAqIENNX0NMS1NFTF9EUExMX0REUlBIWSwgQ01fQ0xLU0VMX0RQTExfSVZBLCBDTV9DTEtTRUxfRFBMTF9NUFUKKyAqLworI2RlZmluZSBPTUFQNDQzMF9EUExMX01VTFRfU0hJRlQJCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9NVUxUX01BU0sJCQkJCUJJVEZJRUxEKDgsIDE4KQorCisvKiBSZW5hbWVkIGZyb20gRFBMTF9NVUxUIFVzZWQgYnkgQ01fQ0xLU0VMX0RQTExfVVNCICovCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfTVVMVF9VU0JfU0hJRlQJCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9NVUxUX1VTQl9NQVNLCQkJCUJJVEZJRUxEKDgsIDE5KQorCisvKgorICogVXNlZCBieSBDTV9DTEtNT0RFX0RQTExfUEVSLCBDTV9DTEtNT0RFX0RQTExfVU5JUFJPLAorICogQ01fQ0xLTU9ERV9EUExMX0NPUkVfUkVTVE9SRSwgQ01fQ0xLTU9ERV9EUExMX0FCRSwgQ01fQ0xLTU9ERV9EUExMX0NPUkUsCisgKiBDTV9DTEtNT0RFX0RQTExfRERSUEhZLCBDTV9DTEtNT0RFX0RQTExfSVZBLCBDTV9DTEtNT0RFX0RQTExfTVBVCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9SRUdNNFhFTl9TSElGVAkJCQkoMSA8PCAxMSkKKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9SRUdNNFhFTl9NQVNLCQkJCUJJVEZJRUxEKDExLCAxMSkKKworLyogVXNlZCBieSBDTV9DTEtTRUxfRFBMTF9VU0IgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9TRF9ESVZfU0hJRlQJCQkJKDEgPDwgMjQpCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfU0RfRElWX01BU0sJCQkJQklURklFTEQoMjQsIDMxKQorCisvKgorICogVXNlZCBieSBDTV9DTEtNT0RFX0RQTExfUEVSLCBDTV9DTEtNT0RFX0RQTExfVU5JUFJPLCBDTV9DTEtNT0RFX0RQTExfVVNCLAorICogQ01fQ0xLTU9ERV9EUExMX0NPUkVfUkVTVE9SRSwgQ01fQ0xLTU9ERV9EUExMX0FCRSwgQ01fQ0xLTU9ERV9EUExMX0NPUkUsCisgKiBDTV9DTEtNT0RFX0RQTExfRERSUEhZLCBDTV9DTEtNT0RFX0RQTExfSVZBLCBDTV9DTEtNT0RFX0RQTExfTVBVCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9TU0NfQUNLX1NISUZUCQkJCSgxIDw8IDEzKQorI2RlZmluZSBPTUFQNDQzMF9EUExMX1NTQ19BQ0tfTUFTSwkJCQlCSVRGSUVMRCgxMywgMTMpCisKKy8qCisgKiBVc2VkIGJ5IENNX0NMS01PREVfRFBMTF9QRVIsIENNX0NMS01PREVfRFBMTF9VTklQUk8sIENNX0NMS01PREVfRFBMTF9VU0IsCisgKiBDTV9DTEtNT0RFX0RQTExfQ09SRV9SRVNUT1JFLCBDTV9DTEtNT0RFX0RQTExfQUJFLCBDTV9DTEtNT0RFX0RQTExfQ09SRSwKKyAqIENNX0NMS01PREVfRFBMTF9ERFJQSFksIENNX0NMS01PREVfRFBMTF9JVkEsIENNX0NMS01PREVfRFBMTF9NUFUKKyAqLworI2RlZmluZSBPTUFQNDQzMF9EUExMX1NTQ19ET1dOU1BSRUFEX1NISUZUCQkJKDEgPDwgMTQpCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfU1NDX0RPV05TUFJFQURfTUFTSwkJCUJJVEZJRUxEKDE0LCAxNCkKKworLyoKKyAqIFVzZWQgYnkgQ01fQ0xLTU9ERV9EUExMX1BFUiwgQ01fQ0xLTU9ERV9EUExMX1VOSVBSTywgQ01fQ0xLTU9ERV9EUExMX1VTQiwKKyAqIENNX0NMS01PREVfRFBMTF9DT1JFX1JFU1RPUkUsIENNX0NMS01PREVfRFBMTF9BQkUsIENNX0NMS01PREVfRFBMTF9DT1JFLAorICogQ01fQ0xLTU9ERV9EUExMX0REUlBIWSwgQ01fQ0xLTU9ERV9EUExMX0lWQSwgQ01fQ0xLTU9ERV9EUExMX01QVQorICovCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfU1NDX0VOX1NISUZUCQkJCSgxIDw8IDEyKQorI2RlZmluZSBPTUFQNDQzMF9EUExMX1NTQ19FTl9NQVNLCQkJCUJJVEZJRUxEKDEyLCAxMikKKworLyogVXNlZCBieSBDTV9MM18yX0RZTkFNSUNERVAsIENNX0w0Q0ZHX0RZTkFNSUNERVAsIENNX0w0UEVSX0RZTkFNSUNERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRFNTX0RZTkRFUF9TSElGVAkJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9EU1NfRFlOREVQX01BU0sJCQkJQklURklFTEQoOCwgOCkKKworLyoKKyAqIFVzZWQgYnkgQ01fRFVDQVRJX1NUQVRJQ0RFUCwgQ01fU0RNQV9TVEFUSUNERVAsIENNX1NETUFfU1RBVElDREVQX1JFU1RPUkUsCisgKiBDTV9NUFVfU1RBVElDREVQCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRFNTX1NUQVRERVBfU0hJRlQJCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfRFNTX1NUQVRERVBfTUFTSwkJCQlCSVRGSUVMRCg4LCA4KQorCisvKiBVc2VkIGJ5IENNX0wzXzJfRFlOQU1JQ0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9EVUNBVElfRFlOREVQX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX0RVQ0FUSV9EWU5ERVBfTUFTSwkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IENNX1NETUFfU1RBVElDREVQLCBDTV9TRE1BX1NUQVRJQ0RFUF9SRVNUT1JFLCBDTV9NUFVfU1RBVElDREVQICovCisjZGVmaW5lIE9NQVA0NDMwX0RVQ0FUSV9TVEFUREVQX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX0RVQ0FUSV9TVEFUREVQX01BU0sJCQkJQklURklFTEQoMCwgMCkKKworLyogVXNlZCBieSBDTV9TSEFET1dfRlJFUV9DT05GSUcxX1JFU1RPUkUsIENNX1NIQURPV19GUkVRX0NPTkZJRzEgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRlJFUV9VUERBVEVfU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfRlJFUV9VUERBVEVfTUFTSwkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IENNX0wzXzJfRFlOQU1JQ0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9HRlhfRFlOREVQX1NISUZUCQkJCSgxIDw8IDEwKQorI2RlZmluZSBPTUFQNDQzMF9HRlhfRFlOREVQX01BU0sJCQkJQklURklFTEQoMTAsIDEwKQorCisvKiBVc2VkIGJ5IENNX0RVQ0FUSV9TVEFUSUNERVAsIENNX01QVV9TVEFUSUNERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfR0ZYX1NUQVRERVBfU0hJRlQJCQkJKDEgPDwgMTApCisjZGVmaW5lIE9NQVA0NDMwX0dGWF9TVEFUREVQX01BU0sJCQkJQklURklFTEQoMTAsIDEwKQorCisvKiBVc2VkIGJ5IENNX1NIQURPV19GUkVRX0NPTkZJRzIgKi8KKyNkZWZpbmUgT01BUDQ0MzBfR1BNQ19GUkVRX1VQREFURV9TSElGVAkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9HUE1DX0ZSRVFfVVBEQVRFX01BU0sJCQkJQklURklFTEQoMCwgMCkKKworLyoKKyAqIFVzZWQgYnkgQ01fRElWX000X0RQTExfUEVSLCBDTV9ESVZfTTRfRFBMTF9DT1JFX1JFU1RPUkUsCisgKiBDTV9ESVZfTTRfRFBMTF9DT1JFLCBDTV9ESVZfTTRfRFBMTF9ERFJQSFksIENNX0RJVl9NNF9EUExMX0lWQQorICovCisjZGVmaW5lIE9NQVA0NDMwX0hTRElWSURFUl9DTEtPVVQxX0RJVl9TSElGVAkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX0hTRElWSURFUl9DTEtPVVQxX0RJVl9NQVNLCQkJQklURklFTEQoMCwgNCkKKworLyoKKyAqIFVzZWQgYnkgQ01fRElWX000X0RQTExfUEVSLCBDTV9ESVZfTTRfRFBMTF9DT1JFX1JFU1RPUkUsCisgKiBDTV9ESVZfTTRfRFBMTF9DT1JFLCBDTV9ESVZfTTRfRFBMTF9ERFJQSFksIENNX0RJVl9NNF9EUExMX0lWQQorICovCisjZGVmaW5lIE9NQVA0NDMwX0hTRElWSURFUl9DTEtPVVQxX0RJVkNIQUNLX1NISUZUCQkoMSA8PCA1KQorI2RlZmluZSBPTUFQNDQzMF9IU0RJVklERVJfQ0xLT1VUMV9ESVZDSEFDS19NQVNLCQlCSVRGSUVMRCg1LCA1KQorCisvKgorICogVXNlZCBieSBDTV9ESVZfTTRfRFBMTF9QRVIsIENNX0RJVl9NNF9EUExMX0NPUkVfUkVTVE9SRSwKKyAqIENNX0RJVl9NNF9EUExMX0NPUkUsIENNX0RJVl9NNF9EUExMX0REUlBIWSwgQ01fRElWX000X0RQTExfSVZBCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDFfR0FURV9DVFJMX1NISUZUCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9IU0RJVklERVJfQ0xLT1VUMV9HQVRFX0NUUkxfTUFTSwkJQklURklFTEQoOCwgOCkKKworLyoKKyAqIFVzZWQgYnkgQ01fRElWX000X0RQTExfUEVSLCBDTV9ESVZfTTRfRFBMTF9DT1JFX1JFU1RPUkUsCisgKiBDTV9ESVZfTTRfRFBMTF9DT1JFLCBDTV9ESVZfTTRfRFBMTF9ERFJQSFksIENNX0RJVl9NNF9EUExMX0lWQQorICovCisjZGVmaW5lIE9NQVA0NDMwX0hTRElWSURFUl9DTEtPVVQxX1BXRE5fU0hJRlQJCQkoMSA8PCAxMikKKyNkZWZpbmUgT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDFfUFdETl9NQVNLCQkJQklURklFTEQoMTIsIDEyKQorCisvKgorICogVXNlZCBieSBDTV9ESVZfTTVfRFBMTF9QRVIsIENNX0RJVl9NNV9EUExMX0NPUkVfUkVTVE9SRSwKKyAqIENNX0RJVl9NNV9EUExMX0NPUkUsIENNX0RJVl9NNV9EUExMX0REUlBIWSwgQ01fRElWX001X0RQTExfSVZBCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDJfRElWX1NISUZUCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDJfRElWX01BU0sJCQlCSVRGSUVMRCgwLCA0KQorCisvKgorICogVXNlZCBieSBDTV9ESVZfTTVfRFBMTF9QRVIsIENNX0RJVl9NNV9EUExMX0NPUkVfUkVTVE9SRSwKKyAqIENNX0RJVl9NNV9EUExMX0NPUkUsIENNX0RJVl9NNV9EUExMX0REUlBIWSwgQ01fRElWX001X0RQTExfSVZBCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDJfRElWQ0hBQ0tfU0hJRlQJCSgxIDw8IDUpCisjZGVmaW5lIE9NQVA0NDMwX0hTRElWSURFUl9DTEtPVVQyX0RJVkNIQUNLX01BU0sJCUJJVEZJRUxEKDUsIDUpCisKKy8qCisgKiBVc2VkIGJ5IENNX0RJVl9NNV9EUExMX1BFUiwgQ01fRElWX001X0RQTExfQ09SRV9SRVNUT1JFLAorICogQ01fRElWX001X0RQTExfQ09SRSwgQ01fRElWX001X0RQTExfRERSUEhZLCBDTV9ESVZfTTVfRFBMTF9JVkEKKyAqLworI2RlZmluZSBPTUFQNDQzMF9IU0RJVklERVJfQ0xLT1VUMl9HQVRFX0NUUkxfU0hJRlQJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX0hTRElWSURFUl9DTEtPVVQyX0dBVEVfQ1RSTF9NQVNLCQlCSVRGSUVMRCg4LCA4KQorCisvKgorICogVXNlZCBieSBDTV9ESVZfTTVfRFBMTF9QRVIsIENNX0RJVl9NNV9EUExMX0NPUkVfUkVTVE9SRSwKKyAqIENNX0RJVl9NNV9EUExMX0NPUkUsIENNX0RJVl9NNV9EUExMX0REUlBIWSwgQ01fRElWX001X0RQTExfSVZBCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDJfUFdETl9TSElGVAkJCSgxIDw8IDEyKQorI2RlZmluZSBPTUFQNDQzMF9IU0RJVklERVJfQ0xLT1VUMl9QV0ROX01BU0sJCQlCSVRGSUVMRCgxMiwgMTIpCisKKy8qCisgKiBVc2VkIGJ5IENNX0RJVl9NNl9EUExMX1BFUiwgQ01fRElWX002X0RQTExfQ09SRV9SRVNUT1JFLAorICogQ01fRElWX002X0RQTExfQ09SRSwgQ01fRElWX002X0RQTExfRERSUEhZCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDNfRElWX1NISUZUCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDNfRElWX01BU0sJCQlCSVRGSUVMRCgwLCA0KQorCisvKgorICogVXNlZCBieSBDTV9ESVZfTTZfRFBMTF9QRVIsIENNX0RJVl9NNl9EUExMX0NPUkVfUkVTVE9SRSwKKyAqIENNX0RJVl9NNl9EUExMX0NPUkUsIENNX0RJVl9NNl9EUExMX0REUlBIWQorICovCisjZGVmaW5lIE9NQVA0NDMwX0hTRElWSURFUl9DTEtPVVQzX0RJVkNIQUNLX1NISUZUCQkoMSA8PCA1KQorI2RlZmluZSBPTUFQNDQzMF9IU0RJVklERVJfQ0xLT1VUM19ESVZDSEFDS19NQVNLCQlCSVRGSUVMRCg1LCA1KQorCisvKgorICogVXNlZCBieSBDTV9ESVZfTTZfRFBMTF9QRVIsIENNX0RJVl9NNl9EUExMX0NPUkVfUkVTVE9SRSwKKyAqIENNX0RJVl9NNl9EUExMX0NPUkUsIENNX0RJVl9NNl9EUExMX0REUlBIWQorICovCisjZGVmaW5lIE9NQVA0NDMwX0hTRElWSURFUl9DTEtPVVQzX0dBVEVfQ1RSTF9TSElGVAkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDNfR0FURV9DVFJMX01BU0sJCUJJVEZJRUxEKDgsIDgpCisKKy8qCisgKiBVc2VkIGJ5IENNX0RJVl9NNl9EUExMX1BFUiwgQ01fRElWX002X0RQTExfQ09SRV9SRVNUT1JFLAorICogQ01fRElWX002X0RQTExfQ09SRSwgQ01fRElWX002X0RQTExfRERSUEhZCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDNfUFdETl9TSElGVAkJCSgxIDw8IDEyKQorI2RlZmluZSBPTUFQNDQzMF9IU0RJVklERVJfQ0xLT1VUM19QV0ROX01BU0sJCQlCSVRGSUVMRCgxMiwgMTIpCisKKy8qCisgKiBVc2VkIGJ5IENNX0RJVl9NN19EUExMX1BFUiwgQ01fRElWX003X0RQTExfQ09SRV9SRVNUT1JFLAorICogQ01fRElWX003X0RQTExfQ09SRQorICovCisjZGVmaW5lIE9NQVA0NDMwX0hTRElWSURFUl9DTEtPVVQ0X0RJVl9TSElGVAkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX0hTRElWSURFUl9DTEtPVVQ0X0RJVl9NQVNLCQkJQklURklFTEQoMCwgNCkKKworLyoKKyAqIFVzZWQgYnkgQ01fRElWX003X0RQTExfUEVSLCBDTV9ESVZfTTdfRFBMTF9DT1JFX1JFU1RPUkUsCisgKiBDTV9ESVZfTTdfRFBMTF9DT1JFCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDRfRElWQ0hBQ0tfU0hJRlQJCSgxIDw8IDUpCisjZGVmaW5lIE9NQVA0NDMwX0hTRElWSURFUl9DTEtPVVQ0X0RJVkNIQUNLX01BU0sJCUJJVEZJRUxEKDUsIDUpCisKKy8qCisgKiBVc2VkIGJ5IENNX0RJVl9NN19EUExMX1BFUiwgQ01fRElWX003X0RQTExfQ09SRV9SRVNUT1JFLAorICogQ01fRElWX003X0RQTExfQ09SRQorICovCisjZGVmaW5lIE9NQVA0NDMwX0hTRElWSURFUl9DTEtPVVQ0X0dBVEVfQ1RSTF9TSElGVAkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDRfR0FURV9DVFJMX01BU0sJCUJJVEZJRUxEKDgsIDgpCisKKy8qCisgKiBVc2VkIGJ5IENNX0RJVl9NN19EUExMX1BFUiwgQ01fRElWX003X0RQTExfQ09SRV9SRVNUT1JFLAorICogQ01fRElWX003X0RQTExfQ09SRQorICovCisjZGVmaW5lIE9NQVA0NDMwX0hTRElWSURFUl9DTEtPVVQ0X1BXRE5fU0hJRlQJCQkoMSA8PCAxMikKKyNkZWZpbmUgT01BUDQ0MzBfSFNESVZJREVSX0NMS09VVDRfUFdETl9NQVNLCQkJQklURklFTEQoMTIsIDEyKQorCisvKgorICogVXNlZCBieSBQUk1fUFJNX1BST0ZJTElOR19DTEtDVFJMLCBDTV9XS1VQX0dQSU8xX0NMS0NUUkwsCisgKiBDTV9XS1VQX0tFWUJPQVJEX0NMS0NUUkwsIENNX1dLVVBfTDRXS1VQX0NMS0NUUkwsIENNX1dLVVBfUlRDX0NMS0NUUkwsCisgKiBDTV9XS1VQX1NBUlJBTV9DTEtDVFJMLCBDTV9XS1VQX1NZTkNUSU1FUl9DTEtDVFJMLCBDTV9XS1VQX1RJTUVSMTJfQ0xLQ1RSTCwKKyAqIENNX1dLVVBfVElNRVIxX0NMS0NUUkwsIENNX1dLVVBfVVNJTV9DTEtDVFJMLCBDTV9XS1VQX1dEVDFfQ0xLQ1RSTCwKKyAqIENNX1dLVVBfV0RUMl9DTEtDVFJMLCBDTV9FTVVfREVCVUdTU19DTEtDVFJMLCBDTV9EMkRfTU9ERU1fSUNSX0NMS0NUUkwsCisgKiBDTV9EMkRfU0FEMkRfQ0xLQ1RSTCwgQ01fRDJEX1NBRDJEX0ZXX0NMS0NUUkwsIENNX0RVQ0FUSV9EVUNBVElfQ0xLQ1RSTCwKKyAqIENNX0wzSU5TVFJfTDNfM19DTEtDVFJMLCBDTV9MM0lOU1RSX0wzX0lOU1RSX0NMS0NUUkwsCisgKiBDTV9MM0lOU1RSX09DUF9XUDFfQ0xLQ1RSTCwgQ01fTDNfMV9MM18xX0NMS0NUUkwsIENNX0wzXzJfR1BNQ19DTEtDVFJMLAorICogQ01fTDNfMl9MM18yX0NMS0NUUkwsIENNX0wzXzJfT0NNQ19SQU1fQ0xLQ1RSTCwgQ01fTDRDRkdfSFdfU0VNX0NMS0NUUkwsCisgKiBDTV9MNENGR19MNF9DRkdfQ0xLQ1RSTCwgQ01fTDRDRkdfTUFJTEJPWF9DTEtDVFJMLCBDTV9MNENGR19TQVJfUk9NX0NMS0NUUkwsCisgKiBDTV9NRU1JRl9ETU1fQ0xLQ1RSTCwgQ01fTUVNSUZfRU1JRl8xX0NMS0NUUkwsIENNX01FTUlGX0VNSUZfMl9DTEtDVFJMLAorICogQ01fTUVNSUZfRU1JRl9GV19DTEtDVFJMLCBDTV9NRU1JRl9FTUlGX0gxX0NMS0NUUkwsCisgKiBDTV9NRU1JRl9FTUlGX0gyX0NMS0NUUkwsIENNX1NETUFfU0RNQV9DTEtDVFJMLCBDTV9HRlhfR0ZYX0NMS0NUUkwsCisgKiBDTV9MNFBFUl9BRENfQ0xLQ1RSTCwgQ01fTDRQRVJfRE1USU1FUjEwX0NMS0NUUkwsCisgKiBDTV9MNFBFUl9ETVRJTUVSMTFfQ0xLQ1RSTCwgQ01fTDRQRVJfRE1USU1FUjJfQ0xLQ1RSTCwKKyAqIENNX0w0UEVSX0RNVElNRVIzX0NMS0NUUkwsIENNX0w0UEVSX0RNVElNRVI0X0NMS0NUUkwsCisgKiBDTV9MNFBFUl9ETVRJTUVSOV9DTEtDVFJMLCBDTV9MNFBFUl9FTE1fQ0xLQ1RSTCwgQ01fTDRQRVJfR1BJTzJfQ0xLQ1RSTCwKKyAqIENNX0w0UEVSX0dQSU8zX0NMS0NUUkwsIENNX0w0UEVSX0dQSU80X0NMS0NUUkwsIENNX0w0UEVSX0dQSU81X0NMS0NUUkwsCisgKiBDTV9MNFBFUl9HUElPNl9DTEtDVFJMLCBDTV9MNFBFUl9IRFExV19DTEtDVFJMLCBDTV9MNFBFUl9IRUNDMV9DTEtDVFJMLAorICogQ01fTDRQRVJfSEVDQzJfQ0xLQ1RSTCwgQ01fTDRQRVJfSTJDMV9DTEtDVFJMLCBDTV9MNFBFUl9JMkMyX0NMS0NUUkwsCisgKiBDTV9MNFBFUl9JMkMzX0NMS0NUUkwsIENNX0w0UEVSX0kyQzRfQ0xLQ1RSTCwgQ01fTDRQRVJfSTJDNV9DTEtDVFJMLAorICogQ01fTDRQRVJfTDRQRVJfQ0xLQ1RSTCwgQ01fTDRQRVJfTUNBU1AyX0NMS0NUUkwsIENNX0w0UEVSX01DQVNQM19DTEtDVFJMLAorICogQ01fTDRQRVJfTUNCU1A0X0NMS0NUUkwsIENNX0w0UEVSX01DU1BJMV9DTEtDVFJMLCBDTV9MNFBFUl9NQ1NQSTJfQ0xLQ1RSTCwKKyAqIENNX0w0UEVSX01DU1BJM19DTEtDVFJMLCBDTV9MNFBFUl9NQ1NQSTRfQ0xLQ1RSTCwgQ01fTDRQRVJfTUdBVEVfQ0xLQ1RSTCwKKyAqIENNX0w0UEVSX01NQ1NEM19DTEtDVFJMLCBDTV9MNFBFUl9NTUNTRDRfQ0xLQ1RSTCwgQ01fTDRQRVJfTU1DU0Q1X0NMS0NUUkwsCisgKiBDTV9MNFBFUl9NU1BST0hHX0NMS0NUUkwsIENNX0w0UEVSX1NMSU1CVVMyX0NMS0NUUkwsIENNX0w0UEVSX1VBUlQxX0NMS0NUUkwsCisgKiBDTV9MNFBFUl9VQVJUMl9DTEtDVFJMLCBDTV9MNFBFUl9VQVJUM19DTEtDVFJMLCBDTV9MNFBFUl9VQVJUNF9DTEtDVFJMLAorICogQ01fTDRTRUNfQUVTMV9DTEtDVFJMLCBDTV9MNFNFQ19BRVMyX0NMS0NUUkwsIENNX0w0U0VDX0NSWVBUT0RNQV9DTEtDVFJMLAorICogQ01fTDRTRUNfREVTM0RFU19DTEtDVFJMLCBDTV9MNFNFQ19QS0FFSVAyOV9DTEtDVFJMLCBDTV9MNFNFQ19STkdfQ0xLQ1RSTCwKKyAqIENNX0w0U0VDX1NIQTJNRDUxX0NMS0NUUkwsIENNX0wzSU5JVF9DQ1BUWF9DTEtDVFJMLCBDTV9MM0lOSVRfRU1BQ19DTEtDVFJMLAorICogQ01fTDNJTklUX0hTSV9DTEtDVFJMLCBDTV9MM0lOSVRfTU1DMV9DTEtDVFJMLCBDTV9MM0lOSVRfTU1DMl9DTEtDVFJMLAorICogQ01fTDNJTklUX01NQzZfQ0xLQ1RSTCwgQ01fTDNJTklUX1AxNTAwX0NMS0NUUkwsIENNX0wzSU5JVF9QQ0lFU1NfQ0xLQ1RSTCwKKyAqIENNX0wzSU5JVF9TQVRBX0NMS0NUUkwsIENNX0wzSU5JVF9UUFBTU19DTEtDVFJMLCBDTV9MM0lOSVRfVU5JUFJPMV9DTEtDVFJMLAorICogQ01fTDNJTklUX1VTQlBIWU9DUDJTQ1BfQ0xLQ1RSTCwgQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkwsCisgKiBDTV9MM0lOSVRfVVNCX0hPU1RfRlNfQ0xLQ1RSTCwgQ01fTDNJTklUX1VTQl9PVEdfQ0xLQ1RSTCwKKyAqIENNX0wzSU5JVF9VU0JfVExMX0NMS0NUUkwsIENNX0wzSU5JVF9YSFBJX0NMS0NUUkwsIENNX0NBTV9GRElGX0NMS0NUUkwsCisgKiBDTV9DQU1fSVNTX0NMS0NUUkwsIENNX0NFRlVTRV9DRUZVU0VfQ0xLQ1RSTCwKKyAqIENNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMX1JFU1RPUkUsIENNX0wzSU5JVF9VU0JfVExMX0NMS0NUUkxfUkVTVE9SRSwKKyAqIENNX0wzSU5TVFJfTDNfM19DTEtDVFJMX1JFU1RPUkUsIENNX0wzSU5TVFJfTDNfSU5TVFJfQ0xLQ1RSTF9SRVNUT1JFLAorICogQ01fTDNJTlNUUl9PQ1BfV1AxX0NMS0NUUkxfUkVTVE9SRSwgQ01fTDRQRVJfR1BJTzJfQ0xLQ1RSTF9SRVNUT1JFLAorICogQ01fTDRQRVJfR1BJTzNfQ0xLQ1RSTF9SRVNUT1JFLCBDTV9MNFBFUl9HUElPNF9DTEtDVFJMX1JFU1RPUkUsCisgKiBDTV9MNFBFUl9HUElPNV9DTEtDVFJMX1JFU1RPUkUsIENNX0w0UEVSX0dQSU82X0NMS0NUUkxfUkVTVE9SRSwKKyAqIENNX0FMV09OX01ETUlOVENfQ0xLQ1RSTCwgQ01fQUxXT05fU1JfQ09SRV9DTEtDVFJMLCBDTV9BTFdPTl9TUl9JVkFfQ0xLQ1RSTCwKKyAqIENNX0FMV09OX1NSX01QVV9DTEtDVFJMLCBDTV9JVkFIRF9JVkFIRF9DTEtDVFJMLCBDTV9JVkFIRF9TTDJfQ0xLQ1RSTCwKKyAqIENNX0RTU19ERUlTU19DTEtDVFJMLCBDTV9EU1NfRFNTX0NMS0NUUkwsIENNX0NNMl9QUk9GSUxJTkdfQ0xLQ1RSTCwKKyAqIENNX01QVV9NUFVfQ0xLQ1RSTCwgQ01fVEVTTEFfVEVTTEFfQ0xLQ1RSTCwgQ00xX0FCRV9BRVNTX0NMS0NUUkwsCisgKiBDTTFfQUJFX0RNSUNfQ0xLQ1RSTCwgQ00xX0FCRV9MNEFCRV9DTEtDVFJMLCBDTTFfQUJFX01DQVNQX0NMS0NUUkwsCisgKiBDTTFfQUJFX01DQlNQMV9DTEtDVFJMLCBDTTFfQUJFX01DQlNQMl9DTEtDVFJMLCBDTTFfQUJFX01DQlNQM19DTEtDVFJMLAorICogQ00xX0FCRV9QRE1fQ0xLQ1RSTCwgQ00xX0FCRV9TTElNQlVTX0NMS0NUUkwsIENNMV9BQkVfVElNRVI1X0NMS0NUUkwsCisgKiBDTTFfQUJFX1RJTUVSNl9DTEtDVFJMLCBDTTFfQUJFX1RJTUVSN19DTEtDVFJMLCBDTTFfQUJFX1RJTUVSOF9DTEtDVFJMLAorICogQ00xX0FCRV9XRFQzX0NMS0NUUkwsIENNX0NNMV9QUk9GSUxJTkdfQ0xLQ1RSTAorICovCisjZGVmaW5lIE9NQVA0NDMwX0lETEVTVF9TSElGVAkJCQkJKDEgPDwgMTYpCisjZGVmaW5lIE9NQVA0NDMwX0lETEVTVF9NQVNLCQkJCQlCSVRGSUVMRCgxNiwgMTcpCisKKy8qIFVzZWQgYnkgQ01fRFVDQVRJX0RZTkFNSUNERVAsIENNX0wzXzJfRFlOQU1JQ0RFUCwgQ01fTDRDRkdfRFlOQU1JQ0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9JU1NfRFlOREVQX1NISUZUCQkJCSgxIDw8IDkpCisjZGVmaW5lIE9NQVA0NDMwX0lTU19EWU5ERVBfTUFTSwkJCQlCSVRGSUVMRCg5LCA5KQorCisvKgorICogVXNlZCBieSBDTV9EVUNBVElfU1RBVElDREVQLCBDTV9TRE1BX1NUQVRJQ0RFUCwgQ01fU0RNQV9TVEFUSUNERVBfUkVTVE9SRSwKKyAqIENNX01QVV9TVEFUSUNERVAsIENNX1RFU0xBX1NUQVRJQ0RFUAorICovCisjZGVmaW5lIE9NQVA0NDMwX0lTU19TVEFUREVQX1NISUZUCQkJCSgxIDw8IDkpCisjZGVmaW5lIE9NQVA0NDMwX0lTU19TVEFUREVQX01BU0sJCQkJQklURklFTEQoOSwgOSkKKworLyogVXNlZCBieSBDTV9MM18yX0RZTkFNSUNERVAsIENNX1RFU0xBX0RZTkFNSUNERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfSVZBSERfRFlOREVQX1NISUZUCQkJCSgxIDw8IDIpCisjZGVmaW5lIE9NQVA0NDMwX0lWQUhEX0RZTkRFUF9NQVNLCQkJCUJJVEZJRUxEKDIsIDIpCisKKy8qCisgKiBVc2VkIGJ5IENNX0QyRF9TVEFUSUNERVAsIENNX0RVQ0FUSV9TVEFUSUNERVAsIENNX1NETUFfU1RBVElDREVQLAorICogQ01fR0ZYX1NUQVRJQ0RFUCwgQ01fTDNJTklUX1NUQVRJQ0RFUCwgQ01fQ0FNX1NUQVRJQ0RFUCwKKyAqIENNX1NETUFfU1RBVElDREVQX1JFU1RPUkUsIENNX0RTU19TVEFUSUNERVAsIENNX01QVV9TVEFUSUNERVAsCisgKiBDTV9URVNMQV9TVEFUSUNERVAKKyAqLworI2RlZmluZSBPTUFQNDQzMF9JVkFIRF9TVEFUREVQX1NISUZUCQkJCSgxIDw8IDIpCisjZGVmaW5lIE9NQVA0NDMwX0lWQUhEX1NUQVRERVBfTUFTSwkJCQlCSVRGSUVMRCgyLCAyKQorCisvKiBVc2VkIGJ5IENNX0wzXzJfRFlOQU1JQ0RFUCwgQ01fTDRDRkdfRFlOQU1JQ0RFUCwgQ01fTDRQRVJfRFlOQU1JQ0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9MM0lOSVRfRFlOREVQX1NISUZUCQkJCSgxIDw8IDcpCisjZGVmaW5lIE9NQVA0NDMwX0wzSU5JVF9EWU5ERVBfTUFTSwkJCQlCSVRGSUVMRCg3LCA3KQorCisvKgorICogVXNlZCBieSBDTV9EMkRfU1RBVElDREVQLCBDTV9EVUNBVElfU1RBVElDREVQLCBDTV9TRE1BX1NUQVRJQ0RFUCwKKyAqIENNX1NETUFfU1RBVElDREVQX1JFU1RPUkUsIENNX01QVV9TVEFUSUNERVAsIENNX1RFU0xBX1NUQVRJQ0RFUAorICovCisjZGVmaW5lIE9NQVA0NDMwX0wzSU5JVF9TVEFUREVQX1NISUZUCQkJCSgxIDw8IDcpCisjZGVmaW5lIE9NQVA0NDMwX0wzSU5JVF9TVEFUREVQX01BU0sJCQkJQklURklFTEQoNywgNykKKworLyoKKyAqIFVzZWQgYnkgQ01fTDNfMl9EWU5BTUlDREVQLCBDTV9MNENGR19EWU5BTUlDREVQLCBDTV9MM0lOSVRfRFlOQU1JQ0RFUCwKKyAqIENNX0RTU19EWU5BTUlDREVQLCBDTV9NUFVfRFlOQU1JQ0RFUCwgQ01fVEVTTEFfRFlOQU1JQ0RFUAorICovCisjZGVmaW5lIE9NQVA0NDMwX0wzXzFfRFlOREVQX1NISUZUCQkJCSgxIDw8IDUpCisjZGVmaW5lIE9NQVA0NDMwX0wzXzFfRFlOREVQX01BU0sJCQkJQklURklFTEQoNSwgNSkKKworLyoKKyAqIFVzZWQgYnkgQ01fRDJEX1NUQVRJQ0RFUCwgQ01fRFVDQVRJX1NUQVRJQ0RFUCwgQ01fU0RNQV9TVEFUSUNERVAsCisgKiBDTV9HRlhfU1RBVElDREVQLCBDTV9MNFNFQ19TVEFUSUNERVAsIENNX0wzSU5JVF9TVEFUSUNERVAsIENNX0NBTV9TVEFUSUNERVAsCisgKiBDTV9TRE1BX1NUQVRJQ0RFUF9SRVNUT1JFLCBDTV9JVkFIRF9TVEFUSUNERVAsIENNX0RTU19TVEFUSUNERVAsCisgKiBDTV9NUFVfU1RBVElDREVQLCBDTV9URVNMQV9TVEFUSUNERVAKKyAqLworI2RlZmluZSBPTUFQNDQzMF9MM18xX1NUQVRERVBfU0hJRlQJCQkJKDEgPDwgNSkKKyNkZWZpbmUgT01BUDQ0MzBfTDNfMV9TVEFUREVQX01BU0sJCQkJQklURklFTEQoNSwgNSkKKworLyoKKyAqIFVzZWQgYnkgQ01fRU1VX0RZTkFNSUNERVAsIENNX0QyRF9EWU5BTUlDREVQLCBDTV9EVUNBVElfRFlOQU1JQ0RFUCwKKyAqIENNX0wzXzFfRFlOQU1JQ0RFUCwgQ01fTDRDRkdfRFlOQU1JQ0RFUCwgQ01fU0RNQV9EWU5BTUlDREVQLAorICogQ01fR0ZYX0RZTkFNSUNERVAsIENNX0w0U0VDX0RZTkFNSUNERVAsIENNX0wzSU5JVF9EWU5BTUlDREVQLAorICogQ01fQ0FNX0RZTkFNSUNERVAsIENNX0lWQUhEX0RZTkFNSUNERVAKKyAqLworI2RlZmluZSBPTUFQNDQzMF9MM18yX0RZTkRFUF9TSElGVAkJCQkoMSA8PCA2KQorI2RlZmluZSBPTUFQNDQzMF9MM18yX0RZTkRFUF9NQVNLCQkJCUJJVEZJRUxEKDYsIDYpCisKKy8qCisgKiBVc2VkIGJ5IENNX0QyRF9TVEFUSUNERVAsIENNX0RVQ0FUSV9TVEFUSUNERVAsIENNX1NETUFfU1RBVElDREVQLAorICogQ01fR0ZYX1NUQVRJQ0RFUCwgQ01fTDRTRUNfU1RBVElDREVQLCBDTV9MM0lOSVRfU1RBVElDREVQLCBDTV9DQU1fU1RBVElDREVQLAorICogQ01fU0RNQV9TVEFUSUNERVBfUkVTVE9SRSwgQ01fSVZBSERfU1RBVElDREVQLCBDTV9EU1NfU1RBVElDREVQLAorICogQ01fTVBVX1NUQVRJQ0RFUCwgQ01fVEVTTEFfU1RBVElDREVQCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfTDNfMl9TVEFUREVQX1NISUZUCQkJCSgxIDw8IDYpCisjZGVmaW5lIE9NQVA0NDMwX0wzXzJfU1RBVERFUF9NQVNLCQkJCUJJVEZJRUxEKDYsIDYpCisKKy8qIFVzZWQgYnkgQ01fTDNfMV9EWU5BTUlDREVQICovCisjZGVmaW5lIE9NQVA0NDMwX0w0Q0ZHX0RZTkRFUF9TSElGVAkJCQkoMSA8PCAxMikKKyNkZWZpbmUgT01BUDQ0MzBfTDRDRkdfRFlOREVQX01BU0sJCQkJQklURklFTEQoMTIsIDEyKQorCisvKgorICogVXNlZCBieSBDTV9EMkRfU1RBVElDREVQLCBDTV9EVUNBVElfU1RBVElDREVQLCBDTV9TRE1BX1NUQVRJQ0RFUCwKKyAqIENNX0wzSU5JVF9TVEFUSUNERVAsIENNX1NETUFfU1RBVElDREVQX1JFU1RPUkUsIENNX01QVV9TVEFUSUNERVAsCisgKiBDTV9URVNMQV9TVEFUSUNERVAKKyAqLworI2RlZmluZSBPTUFQNDQzMF9MNENGR19TVEFUREVQX1NISUZUCQkJCSgxIDw8IDEyKQorI2RlZmluZSBPTUFQNDQzMF9MNENGR19TVEFUREVQX01BU0sJCQkJQklURklFTEQoMTIsIDEyKQorCisvKiBVc2VkIGJ5IENNX0wzXzJfRFlOQU1JQ0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9MNFBFUl9EWU5ERVBfU0hJRlQJCQkJKDEgPDwgMTMpCisjZGVmaW5lIE9NQVA0NDMwX0w0UEVSX0RZTkRFUF9NQVNLCQkJCUJJVEZJRUxEKDEzLCAxMykKKworLyoKKyAqIFVzZWQgYnkgQ01fRDJEX1NUQVRJQ0RFUCwgQ01fRFVDQVRJX1NUQVRJQ0RFUCwgQ01fU0RNQV9TVEFUSUNERVAsCisgKiBDTV9MNFNFQ19TVEFUSUNERVAsIENNX0wzSU5JVF9TVEFUSUNERVAsIENNX1NETUFfU1RBVElDREVQX1JFU1RPUkUsCisgKiBDTV9NUFVfU1RBVElDREVQLCBDTV9URVNMQV9TVEFUSUNERVAKKyAqLworI2RlZmluZSBPTUFQNDQzMF9MNFBFUl9TVEFUREVQX1NISUZUCQkJCSgxIDw8IDEzKQorI2RlZmluZSBPTUFQNDQzMF9MNFBFUl9TVEFUREVQX01BU0sJCQkJQklURklFTEQoMTMsIDEzKQorCisvKiBVc2VkIGJ5IENNX0wzXzJfRFlOQU1JQ0RFUCwgQ01fTDRQRVJfRFlOQU1JQ0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9MNFNFQ19EWU5ERVBfU0hJRlQJCQkJKDEgPDwgMTQpCisjZGVmaW5lIE9NQVA0NDMwX0w0U0VDX0RZTkRFUF9NQVNLCQkJCUJJVEZJRUxEKDE0LCAxNCkKKworLyoKKyAqIFVzZWQgYnkgQ01fRFVDQVRJX1NUQVRJQ0RFUCwgQ01fU0RNQV9TVEFUSUNERVAsIENNX0wzSU5JVF9TVEFUSUNERVAsCisgKiBDTV9TRE1BX1NUQVRJQ0RFUF9SRVNUT1JFLCBDTV9NUFVfU1RBVElDREVQCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfTDRTRUNfU1RBVERFUF9TSElGVAkJCQkoMSA8PCAxNCkKKyNkZWZpbmUgT01BUDQ0MzBfTDRTRUNfU1RBVERFUF9NQVNLCQkJCUJJVEZJRUxEKDE0LCAxNCkKKworLyogVXNlZCBieSBDTV9MNENGR19EWU5BTUlDREVQICovCisjZGVmaW5lIE9NQVA0NDMwX0w0V0tVUF9EWU5ERVBfU0hJRlQJCQkJKDEgPDwgMTUpCisjZGVmaW5lIE9NQVA0NDMwX0w0V0tVUF9EWU5ERVBfTUFTSwkJCQlCSVRGSUVMRCgxNSwgMTUpCisKKy8qCisgKiBVc2VkIGJ5IENNX0RVQ0FUSV9TVEFUSUNERVAsIENNX1NETUFfU1RBVElDREVQLCBDTV9MM0lOSVRfU1RBVElDREVQLAorICogQ01fU0RNQV9TVEFUSUNERVBfUkVTVE9SRSwgQ01fTVBVX1NUQVRJQ0RFUCwgQ01fVEVTTEFfU1RBVElDREVQCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfTDRXS1VQX1NUQVRERVBfU0hJRlQJCQkJKDEgPDwgMTUpCisjZGVmaW5lIE9NQVA0NDMwX0w0V0tVUF9TVEFUREVQX01BU0sJCQkJQklURklFTEQoMTUsIDE1KQorCisvKgorICogVXNlZCBieSBDTV9EMkRfRFlOQU1JQ0RFUCwgQ01fTDNfMV9EWU5BTUlDREVQLCBDTV9MNENGR19EWU5BTUlDREVQLAorICogQ01fTVBVX0RZTkFNSUNERVAKKyAqLworI2RlZmluZSBPTUFQNDQzMF9NRU1JRl9EWU5ERVBfU0hJRlQJCQkJKDEgPDwgNCkKKyNkZWZpbmUgT01BUDQ0MzBfTUVNSUZfRFlOREVQX01BU0sJCQkJQklURklFTEQoNCwgNCkKKworLyoKKyAqIFVzZWQgYnkgQ01fRDJEX1NUQVRJQ0RFUCwgQ01fRFVDQVRJX1NUQVRJQ0RFUCwgQ01fU0RNQV9TVEFUSUNERVAsCisgKiBDTV9HRlhfU1RBVElDREVQLCBDTV9MNFNFQ19TVEFUSUNERVAsIENNX0wzSU5JVF9TVEFUSUNERVAsIENNX0NBTV9TVEFUSUNERVAsCisgKiBDTV9TRE1BX1NUQVRJQ0RFUF9SRVNUT1JFLCBDTV9JVkFIRF9TVEFUSUNERVAsIENNX0RTU19TVEFUSUNERVAsCisgKiBDTV9NUFVfU1RBVElDREVQLCBDTV9URVNMQV9TVEFUSUNERVAKKyAqLworI2RlZmluZSBPTUFQNDQzMF9NRU1JRl9TVEFUREVQX1NISUZUCQkJCSgxIDw8IDQpCisjZGVmaW5lIE9NQVA0NDMwX01FTUlGX1NUQVRERVBfTUFTSwkJCQlCSVRGSUVMRCg0LCA0KQorCisvKgorICogVXNlZCBieSBDTV9TU0NfTU9ERlJFUURJVl9EUExMX1BFUiwgQ01fU1NDX01PREZSRVFESVZfRFBMTF9VTklQUk8sCisgKiBDTV9TU0NfTU9ERlJFUURJVl9EUExMX1VTQiwgQ01fU1NDX01PREZSRVFESVZfRFBMTF9DT1JFX1JFU1RPUkUsCisgKiBDTV9TU0NfTU9ERlJFUURJVl9EUExMX0FCRSwgQ01fU1NDX01PREZSRVFESVZfRFBMTF9DT1JFLAorICogQ01fU1NDX01PREZSRVFESVZfRFBMTF9ERFJQSFksIENNX1NTQ19NT0RGUkVRRElWX0RQTExfSVZBLAorICogQ01fU1NDX01PREZSRVFESVZfRFBMTF9NUFUKKyAqLworI2RlZmluZSBPTUFQNDQzMF9NT0RGUkVRRElWX0VYUE9ORU5UX1NISUZUCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfTU9ERlJFUURJVl9FWFBPTkVOVF9NQVNLCQkJQklURklFTEQoOCwgMTApCisKKy8qCisgKiBVc2VkIGJ5IENNX1NTQ19NT0RGUkVRRElWX0RQTExfUEVSLCBDTV9TU0NfTU9ERlJFUURJVl9EUExMX1VOSVBSTywKKyAqIENNX1NTQ19NT0RGUkVRRElWX0RQTExfVVNCLCBDTV9TU0NfTU9ERlJFUURJVl9EUExMX0NPUkVfUkVTVE9SRSwKKyAqIENNX1NTQ19NT0RGUkVRRElWX0RQTExfQUJFLCBDTV9TU0NfTU9ERlJFUURJVl9EUExMX0NPUkUsCisgKiBDTV9TU0NfTU9ERlJFUURJVl9EUExMX0REUlBIWSwgQ01fU1NDX01PREZSRVFESVZfRFBMTF9JVkEsCisgKiBDTV9TU0NfTU9ERlJFUURJVl9EUExMX01QVQorICovCisjZGVmaW5lIE9NQVA0NDMwX01PREZSRVFESVZfTUFOVElTU0FfU0hJRlQJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9NT0RGUkVRRElWX01BTlRJU1NBX01BU0sJCQlCSVRGSUVMRCgwLCA2KQorCisvKgorICogVXNlZCBieSBQUk1fUFJNX1BST0ZJTElOR19DTEtDVFJMLCBDTV9XS1VQX0dQSU8xX0NMS0NUUkwsCisgKiBDTV9XS1VQX0tFWUJPQVJEX0NMS0NUUkwsIENNX1dLVVBfTDRXS1VQX0NMS0NUUkwsIENNX1dLVVBfUlRDX0NMS0NUUkwsCisgKiBDTV9XS1VQX1NBUlJBTV9DTEtDVFJMLCBDTV9XS1VQX1NZTkNUSU1FUl9DTEtDVFJMLCBDTV9XS1VQX1RJTUVSMTJfQ0xLQ1RSTCwKKyAqIENNX1dLVVBfVElNRVIxX0NMS0NUUkwsIENNX1dLVVBfVVNJTV9DTEtDVFJMLCBDTV9XS1VQX1dEVDFfQ0xLQ1RSTCwKKyAqIENNX1dLVVBfV0RUMl9DTEtDVFJMLCBDTV9FTVVfREVCVUdTU19DTEtDVFJMLCBDTV9EMkRfTU9ERU1fSUNSX0NMS0NUUkwsCisgKiBDTV9EMkRfU0FEMkRfQ0xLQ1RSTCwgQ01fRDJEX1NBRDJEX0ZXX0NMS0NUUkwsIENNX0RVQ0FUSV9EVUNBVElfQ0xLQ1RSTCwKKyAqIENNX0wzSU5TVFJfTDNfM19DTEtDVFJMLCBDTV9MM0lOU1RSX0wzX0lOU1RSX0NMS0NUUkwsCisgKiBDTV9MM0lOU1RSX09DUF9XUDFfQ0xLQ1RSTCwgQ01fTDNfMV9MM18xX0NMS0NUUkwsIENNX0wzXzJfR1BNQ19DTEtDVFJMLAorICogQ01fTDNfMl9MM18yX0NMS0NUUkwsIENNX0wzXzJfT0NNQ19SQU1fQ0xLQ1RSTCwgQ01fTDRDRkdfSFdfU0VNX0NMS0NUUkwsCisgKiBDTV9MNENGR19MNF9DRkdfQ0xLQ1RSTCwgQ01fTDRDRkdfTUFJTEJPWF9DTEtDVFJMLCBDTV9MNENGR19TQVJfUk9NX0NMS0NUUkwsCisgKiBDTV9NRU1JRl9ETU1fQ0xLQ1RSTCwgQ01fTUVNSUZfRU1JRl8xX0NMS0NUUkwsIENNX01FTUlGX0VNSUZfMl9DTEtDVFJMLAorICogQ01fTUVNSUZfRU1JRl9GV19DTEtDVFJMLCBDTV9NRU1JRl9FTUlGX0gxX0NMS0NUUkwsCisgKiBDTV9NRU1JRl9FTUlGX0gyX0NMS0NUUkwsIENNX1NETUFfU0RNQV9DTEtDVFJMLCBDTV9HRlhfR0ZYX0NMS0NUUkwsCisgKiBDTV9MNFBFUl9BRENfQ0xLQ1RSTCwgQ01fTDRQRVJfRE1USU1FUjEwX0NMS0NUUkwsCisgKiBDTV9MNFBFUl9ETVRJTUVSMTFfQ0xLQ1RSTCwgQ01fTDRQRVJfRE1USU1FUjJfQ0xLQ1RSTCwKKyAqIENNX0w0UEVSX0RNVElNRVIzX0NMS0NUUkwsIENNX0w0UEVSX0RNVElNRVI0X0NMS0NUUkwsCisgKiBDTV9MNFBFUl9ETVRJTUVSOV9DTEtDVFJMLCBDTV9MNFBFUl9FTE1fQ0xLQ1RSTCwgQ01fTDRQRVJfR1BJTzJfQ0xLQ1RSTCwKKyAqIENNX0w0UEVSX0dQSU8zX0NMS0NUUkwsIENNX0w0UEVSX0dQSU80X0NMS0NUUkwsIENNX0w0UEVSX0dQSU81X0NMS0NUUkwsCisgKiBDTV9MNFBFUl9HUElPNl9DTEtDVFJMLCBDTV9MNFBFUl9IRFExV19DTEtDVFJMLCBDTV9MNFBFUl9IRUNDMV9DTEtDVFJMLAorICogQ01fTDRQRVJfSEVDQzJfQ0xLQ1RSTCwgQ01fTDRQRVJfSTJDMV9DTEtDVFJMLCBDTV9MNFBFUl9JMkMyX0NMS0NUUkwsCisgKiBDTV9MNFBFUl9JMkMzX0NMS0NUUkwsIENNX0w0UEVSX0kyQzRfQ0xLQ1RSTCwgQ01fTDRQRVJfSTJDNV9DTEtDVFJMLAorICogQ01fTDRQRVJfTDRQRVJfQ0xLQ1RSTCwgQ01fTDRQRVJfTUNBU1AyX0NMS0NUUkwsIENNX0w0UEVSX01DQVNQM19DTEtDVFJMLAorICogQ01fTDRQRVJfTUNCU1A0X0NMS0NUUkwsIENNX0w0UEVSX01DU1BJMV9DTEtDVFJMLCBDTV9MNFBFUl9NQ1NQSTJfQ0xLQ1RSTCwKKyAqIENNX0w0UEVSX01DU1BJM19DTEtDVFJMLCBDTV9MNFBFUl9NQ1NQSTRfQ0xLQ1RSTCwgQ01fTDRQRVJfTUdBVEVfQ0xLQ1RSTCwKKyAqIENNX0w0UEVSX01NQ1NEM19DTEtDVFJMLCBDTV9MNFBFUl9NTUNTRDRfQ0xLQ1RSTCwgQ01fTDRQRVJfTU1DU0Q1X0NMS0NUUkwsCisgKiBDTV9MNFBFUl9NU1BST0hHX0NMS0NUUkwsIENNX0w0UEVSX1NMSU1CVVMyX0NMS0NUUkwsIENNX0w0UEVSX1VBUlQxX0NMS0NUUkwsCisgKiBDTV9MNFBFUl9VQVJUMl9DTEtDVFJMLCBDTV9MNFBFUl9VQVJUM19DTEtDVFJMLCBDTV9MNFBFUl9VQVJUNF9DTEtDVFJMLAorICogQ01fTDRTRUNfQUVTMV9DTEtDVFJMLCBDTV9MNFNFQ19BRVMyX0NMS0NUUkwsIENNX0w0U0VDX0NSWVBUT0RNQV9DTEtDVFJMLAorICogQ01fTDRTRUNfREVTM0RFU19DTEtDVFJMLCBDTV9MNFNFQ19QS0FFSVAyOV9DTEtDVFJMLCBDTV9MNFNFQ19STkdfQ0xLQ1RSTCwKKyAqIENNX0w0U0VDX1NIQTJNRDUxX0NMS0NUUkwsIENNX0wzSU5JVF9DQ1BUWF9DTEtDVFJMLCBDTV9MM0lOSVRfRU1BQ19DTEtDVFJMLAorICogQ01fTDNJTklUX0hTSV9DTEtDVFJMLCBDTV9MM0lOSVRfTU1DMV9DTEtDVFJMLCBDTV9MM0lOSVRfTU1DMl9DTEtDVFJMLAorICogQ01fTDNJTklUX01NQzZfQ0xLQ1RSTCwgQ01fTDNJTklUX1AxNTAwX0NMS0NUUkwsIENNX0wzSU5JVF9QQ0lFU1NfQ0xLQ1RSTCwKKyAqIENNX0wzSU5JVF9TQVRBX0NMS0NUUkwsIENNX0wzSU5JVF9UUFBTU19DTEtDVFJMLCBDTV9MM0lOSVRfVU5JUFJPMV9DTEtDVFJMLAorICogQ01fTDNJTklUX1VTQlBIWU9DUDJTQ1BfQ0xLQ1RSTCwgQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkwsCisgKiBDTV9MM0lOSVRfVVNCX0hPU1RfRlNfQ0xLQ1RSTCwgQ01fTDNJTklUX1VTQl9PVEdfQ0xLQ1RSTCwKKyAqIENNX0wzSU5JVF9VU0JfVExMX0NMS0NUUkwsIENNX0wzSU5JVF9YSFBJX0NMS0NUUkwsIENNX0NBTV9GRElGX0NMS0NUUkwsCisgKiBDTV9DQU1fSVNTX0NMS0NUUkwsIENNX0NFRlVTRV9DRUZVU0VfQ0xLQ1RSTCwKKyAqIENNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMX1JFU1RPUkUsIENNX0wzSU5JVF9VU0JfVExMX0NMS0NUUkxfUkVTVE9SRSwKKyAqIENNX0wzSU5TVFJfTDNfM19DTEtDVFJMX1JFU1RPUkUsIENNX0wzSU5TVFJfTDNfSU5TVFJfQ0xLQ1RSTF9SRVNUT1JFLAorICogQ01fTDNJTlNUUl9PQ1BfV1AxX0NMS0NUUkxfUkVTVE9SRSwgQ01fTDRQRVJfR1BJTzJfQ0xLQ1RSTF9SRVNUT1JFLAorICogQ01fTDRQRVJfR1BJTzNfQ0xLQ1RSTF9SRVNUT1JFLCBDTV9MNFBFUl9HUElPNF9DTEtDVFJMX1JFU1RPUkUsCisgKiBDTV9MNFBFUl9HUElPNV9DTEtDVFJMX1JFU1RPUkUsIENNX0w0UEVSX0dQSU82X0NMS0NUUkxfUkVTVE9SRSwKKyAqIENNX0FMV09OX01ETUlOVENfQ0xLQ1RSTCwgQ01fQUxXT05fU1JfQ09SRV9DTEtDVFJMLCBDTV9BTFdPTl9TUl9JVkFfQ0xLQ1RSTCwKKyAqIENNX0FMV09OX1NSX01QVV9DTEtDVFJMLCBDTV9JVkFIRF9JVkFIRF9DTEtDVFJMLCBDTV9JVkFIRF9TTDJfQ0xLQ1RSTCwKKyAqIENNX0RTU19ERUlTU19DTEtDVFJMLCBDTV9EU1NfRFNTX0NMS0NUUkwsIENNX0NNMl9QUk9GSUxJTkdfQ0xLQ1RSTCwKKyAqIENNX01QVV9NUFVfQ0xLQ1RSTCwgQ01fVEVTTEFfVEVTTEFfQ0xLQ1RSTCwgQ00xX0FCRV9BRVNTX0NMS0NUUkwsCisgKiBDTTFfQUJFX0RNSUNfQ0xLQ1RSTCwgQ00xX0FCRV9MNEFCRV9DTEtDVFJMLCBDTTFfQUJFX01DQVNQX0NMS0NUUkwsCisgKiBDTTFfQUJFX01DQlNQMV9DTEtDVFJMLCBDTTFfQUJFX01DQlNQMl9DTEtDVFJMLCBDTTFfQUJFX01DQlNQM19DTEtDVFJMLAorICogQ00xX0FCRV9QRE1fQ0xLQ1RSTCwgQ00xX0FCRV9TTElNQlVTX0NMS0NUUkwsIENNMV9BQkVfVElNRVI1X0NMS0NUUkwsCisgKiBDTTFfQUJFX1RJTUVSNl9DTEtDVFJMLCBDTTFfQUJFX1RJTUVSN19DTEtDVFJMLCBDTTFfQUJFX1RJTUVSOF9DTEtDVFJMLAorICogQ00xX0FCRV9XRFQzX0NMS0NUUkwsIENNX0NNMV9QUk9GSUxJTkdfQ0xLQ1RSTAorICovCisjZGVmaW5lIE9NQVA0NDMwX01PRFVMRU1PREVfU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfTU9EVUxFTU9ERV9NQVNLCQkJCUJJVEZJRUxEKDAsIDEpCisKKy8qIFVzZWQgYnkgQ01fRFNTX0RTU19DTEtDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl80OE1IWl9DTEtfU0hJRlQJCQkoMSA8PCA5KQorI2RlZmluZSBPTUFQNDQzMF9PUFRGQ0xLRU5fNDhNSFpfQ0xLX01BU0sJCQlCSVRGSUVMRCg5LCA5KQorCisvKiBVc2VkIGJ5IENNX1dLVVBfQkFOREdBUF9DTEtDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9CR0FQXzMyS19TSElGVAkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9CR0FQXzMyS19NQVNLCQkJQklURklFTEQoOCwgOCkKKworLyogVXNlZCBieSBDTV9MM0lOSVRfVVNCUEhZT0NQMlNDUF9DTEtDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9DTEszMktfU0hJRlQJCQkJKDEgPDwgOSkKKyNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX0NMSzMyS19NQVNLCQkJCUJJVEZJRUxEKDksIDkpCisKKy8qIFVzZWQgYnkgQ01fQ0FNX0lTU19DTEtDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9DVFJMQ0xLX1NISUZUCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX0NUUkxDTEtfTUFTSwkJCQlCSVRGSUVMRCg4LCA4KQorCisvKgorICogVXNlZCBieSBDTV9XS1VQX0dQSU8xX0NMS0NUUkwsIENNX0w0UEVSX0dQSU8yX0NMS0NUUkwsCisgKiBDTV9MNFBFUl9HUElPM19DTEtDVFJMLCBDTV9MNFBFUl9HUElPNF9DTEtDVFJMLCBDTV9MNFBFUl9HUElPNV9DTEtDVFJMLAorICogQ01fTDRQRVJfR1BJTzZfQ0xLQ1RSTCwgQ01fTDRQRVJfR1BJTzJfQ0xLQ1RSTF9SRVNUT1JFLAorICogQ01fTDRQRVJfR1BJTzNfQ0xLQ1RSTF9SRVNUT1JFLCBDTV9MNFBFUl9HUElPNF9DTEtDVFJMX1JFU1RPUkUsCisgKiBDTV9MNFBFUl9HUElPNV9DTEtDVFJMX1JFU1RPUkUsIENNX0w0UEVSX0dQSU82X0NMS0NUUkxfUkVTVE9SRQorICovCisjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9EQkNMS19TSElGVAkJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9PUFRGQ0xLRU5fREJDTEtfTUFTSwkJCQlCSVRGSUVMRCg4LCA4KQorCisvKiBVc2VkIGJ5IENNX01FTUlGX0RMTF9DTEtDVFJMLCBDTV9NRU1JRl9ETExfSF9DTEtDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9ETExfQ0xLX1NISUZUCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX0RMTF9DTEtfTUFTSwkJCQlCSVRGSUVMRCg4LCA4KQorCisvKiBVc2VkIGJ5IENNX0RTU19EU1NfQ0xLQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9PUFRGQ0xLRU5fRFNTQ0xLX1NISUZUCQkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9EU1NDTEtfTUFTSwkJCQlCSVRGSUVMRCg4LCA4KQorCisvKiBVc2VkIGJ5IENNMV9BQkVfU0xJTUJVU19DTEtDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9GQ0xLMF9TSElGVAkJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9PUFRGQ0xLRU5fRkNMSzBfTUFTSwkJCQlCSVRGSUVMRCg4LCA4KQorCisvKiBVc2VkIGJ5IENNMV9BQkVfU0xJTUJVU19DTEtDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9GQ0xLMV9TSElGVAkJCQkoMSA8PCA5KQorI2RlZmluZSBPTUFQNDQzMF9PUFRGQ0xLRU5fRkNMSzFfTUFTSwkJCQlCSVRGSUVMRCg5LCA5KQorCisvKiBVc2VkIGJ5IENNMV9BQkVfU0xJTUJVU19DTEtDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9GQ0xLMl9TSElGVAkJCQkoMSA8PCAxMCkKKyNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX0ZDTEsyX01BU0sJCQkJQklURklFTEQoMTAsIDEwKQorCisvKiBVc2VkIGJ5IENNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMLCBDTV9MM0lOSVRfVVNCX0hPU1RfQ0xLQ1RSTF9SRVNUT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9GVU5DNDhNQ0xLX1NISUZUCQkJKDEgPDwgMTUpCisjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9GVU5DNDhNQ0xLX01BU0sJCQlCSVRGSUVMRCgxNSwgMTUpCisKKy8qIFVzZWQgYnkgQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkwsIENNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMX1JFU1RPUkUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX0hTSUM0ODBNX1AxX0NMS19TSElGVAkJKDEgPDwgMTMpCisjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9IU0lDNDgwTV9QMV9DTEtfTUFTSwkJCUJJVEZJRUxEKDEzLCAxMykKKworLyogVXNlZCBieSBDTV9MM0lOSVRfVVNCX0hPU1RfQ0xLQ1RSTCwgQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkxfUkVTVE9SRSAqLworI2RlZmluZSBPTUFQNDQzMF9PUFRGQ0xLRU5fSFNJQzQ4ME1fUDJfQ0xLX1NISUZUCQkoMSA8PCAxNCkKKyNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX0hTSUM0ODBNX1AyX0NMS19NQVNLCQkJQklURklFTEQoMTQsIDE0KQorCisvKiBVc2VkIGJ5IENNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMLCBDTV9MM0lOSVRfVVNCX0hPU1RfQ0xLQ1RSTF9SRVNUT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9IU0lDNjBNX1AxX0NMS19TSElGVAkJCSgxIDw8IDExKQorI2RlZmluZSBPTUFQNDQzMF9PUFRGQ0xLRU5fSFNJQzYwTV9QMV9DTEtfTUFTSwkJCUJJVEZJRUxEKDExLCAxMSkKKworLyogVXNlZCBieSBDTV9MM0lOSVRfVVNCX0hPU1RfQ0xLQ1RSTCwgQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkxfUkVTVE9SRSAqLworI2RlZmluZSBPTUFQNDQzMF9PUFRGQ0xLRU5fSFNJQzYwTV9QMl9DTEtfU0hJRlQJCQkoMSA8PCAxMikKKyNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX0hTSUM2ME1fUDJfQ0xLX01BU0sJCQlCSVRGSUVMRCgxMiwgMTIpCisKKy8qIFVzZWQgYnkgQ01fTDRQRVJfU0xJTUJVUzJfQ0xLQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9PUFRGQ0xLRU5fUEVSMjRNQ19HRkNMS19TSElGVAkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9QRVIyNE1DX0dGQ0xLX01BU0sJCQlCSVRGSUVMRCg4LCA4KQorCisvKiBVc2VkIGJ5IENNX0w0UEVSX1NMSU1CVVMyX0NMS0NUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX1BFUkFCRTI0TV9HRkNMS19TSElGVAkJKDEgPDwgOSkKKyNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX1BFUkFCRTI0TV9HRkNMS19NQVNLCQkJQklURklFTEQoOSwgOSkKKworLyogVXNlZCBieSBDTV9MM0lOSVRfVVNCUEhZT0NQMlNDUF9DTEtDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9QSFlfNDhNX1NISUZUCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX1BIWV80OE1fTUFTSwkJCQlCSVRGSUVMRCg4LCA4KQorCisvKiBVc2VkIGJ5IENNX0w0UEVSX1NMSU1CVVMyX0NMS0NUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX1NMSU1CVVNfQ0xLX1NISUZUCQkJKDEgPDwgMTApCisjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9TTElNQlVTX0NMS19NQVNLCQkJQklURklFTEQoMTAsIDEwKQorCisvKiBSZW5hbWVkIGZyb20gT1BURkNMS0VOX1NMSU1CVVNfQ0xLIFVzZWQgYnkgQ00xX0FCRV9TTElNQlVTX0NMS0NUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX1NMSU1CVVNfQ0xLXzExXzExX1NISUZUCQkoMSA8PCAxMSkKKyNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX1NMSU1CVVNfQ0xLXzExXzExX01BU0sJCUJJVEZJRUxEKDExLCAxMSkKKworLyogVXNlZCBieSBDTV9EU1NfRFNTX0NMS0NUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX1NZU19DTEtfU0hJRlQJCQkoMSA8PCAxMCkKKyNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX1NZU19DTEtfTUFTSwkJCQlCSVRGSUVMRCgxMCwgMTApCisKKy8qIFVzZWQgYnkgQ01fRFNTX0RTU19DTEtDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9UVl9DTEtfU0hJRlQJCQkJKDEgPDwgMTEpCisjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9UVl9DTEtfTUFTSwkJCQlCSVRGSUVMRCgxMSwgMTEpCisKKy8qIFVzZWQgYnkgQ01fTDNJTklUX1VOSVBSTzFfQ0xLQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9PUFRGQ0xLRU5fVFhQSFlDTEtfU0hJRlQJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9PUFRGQ0xLRU5fVFhQSFlDTEtfTUFTSwkJCUJJVEZJRUxEKDgsIDgpCisKKy8qIFVzZWQgYnkgQ01fTDNJTklUX1VTQl9UTExfQ0xLQ1RSTCwgQ01fTDNJTklUX1VTQl9UTExfQ0xLQ1RSTF9SRVNUT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9VU0JfQ0gwX0NMS19TSElGVAkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9VU0JfQ0gwX0NMS19NQVNLCQkJQklURklFTEQoOCwgOCkKKworLyogVXNlZCBieSBDTV9MM0lOSVRfVVNCX1RMTF9DTEtDVFJMLCBDTV9MM0lOSVRfVVNCX1RMTF9DTEtDVFJMX1JFU1RPUkUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX1VTQl9DSDFfQ0xLX1NISUZUCQkJKDEgPDwgOSkKKyNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX1VTQl9DSDFfQ0xLX01BU0sJCQlCSVRGSUVMRCg5LCA5KQorCisvKiBVc2VkIGJ5IENNX0wzSU5JVF9VU0JfVExMX0NMS0NUUkwsIENNX0wzSU5JVF9VU0JfVExMX0NMS0NUUkxfUkVTVE9SRSAqLworI2RlZmluZSBPTUFQNDQzMF9PUFRGQ0xLRU5fVVNCX0NIMl9DTEtfU0hJRlQJCQkoMSA8PCAxMCkKKyNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX1VTQl9DSDJfQ0xLX01BU0sJCQlCSVRGSUVMRCgxMCwgMTApCisKKy8qIFVzZWQgYnkgQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkwsIENNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMX1JFU1RPUkUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX1VUTUlfUDFfQ0xLX1NISUZUCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX1VUTUlfUDFfQ0xLX01BU0sJCQlCSVRGSUVMRCg4LCA4KQorCisvKiBVc2VkIGJ5IENNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMLCBDTV9MM0lOSVRfVVNCX0hPU1RfQ0xLQ1RSTF9SRVNUT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9VVE1JX1AyX0NMS19TSElGVAkJCSgxIDw8IDkpCisjZGVmaW5lIE9NQVA0NDMwX09QVEZDTEtFTl9VVE1JX1AyX0NMS19NQVNLCQkJQklURklFTEQoOSwgOSkKKworLyogVXNlZCBieSBDTV9MM0lOSVRfVVNCX0hPU1RfQ0xLQ1RSTCwgQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkxfUkVTVE9SRSAqLworI2RlZmluZSBPTUFQNDQzMF9PUFRGQ0xLRU5fVVRNSV9QM19DTEtfU0hJRlQJCQkoMSA8PCAxMCkKKyNkZWZpbmUgT01BUDQ0MzBfT1BURkNMS0VOX1VUTUlfUDNfQ0xLX01BU0sJCQlCSVRGSUVMRCgxMCwgMTApCisKKy8qIFVzZWQgYnkgQ01fTDNJTklUX1VTQl9PVEdfQ0xLQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9PUFRGQ0xLRU5fWENMS19TSElGVAkJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9PUFRGQ0xLRU5fWENMS19NQVNLCQkJCUJJVEZJRUxEKDgsIDgpCisKKy8qIFVzZWQgYnkgQ01fRU1VX09WRVJSSURFX0RQTExfUEVSLCBDTV9FTVVfT1ZFUlJJREVfRFBMTF9DT1JFICovCisjZGVmaW5lIE9NQVA0NDMwX09WRVJSSURFX0VOQUJMRV9TSElGVAkJCQkoMSA8PCAxOSkKKyNkZWZpbmUgT01BUDQ0MzBfT1ZFUlJJREVfRU5BQkxFX01BU0sJCQkJQklURklFTEQoMTksIDE5KQorCisvKiBVc2VkIGJ5IENNX0NMS1NFTF9BQkUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUEFEX0NMS1NfR0FURV9TSElGVAkJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9QQURfQ0xLU19HQVRFX01BU0sJCQkJQklURklFTEQoOCwgOCkKKworLyogVXNlZCBieSBDTV9DT1JFX0RWRlNfQ1VSUkVOVCwgQ01fSVZBX0RWRlNfQ1VSUkVOVCAqLworI2RlZmluZSBPTUFQNDQzMF9QRVJGX0NVUlJFTlRfU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfUEVSRl9DVVJSRU5UX01BU0sJCQkJQklURklFTEQoMCwgNykKKworLyoKKyAqIFVzZWQgYnkgQ01fQ09SRV9EVkZTX1BFUkYxLCBDTV9DT1JFX0RWRlNfUEVSRjIsIENNX0NPUkVfRFZGU19QRVJGMywKKyAqIENNX0NPUkVfRFZGU19QRVJGNCwgQ01fSVZBX0RWRlNfUEVSRl9BQkUsIENNX0lWQV9EVkZTX1BFUkZfSVZBSEQsCisgKiBDTV9JVkFfRFZGU19QRVJGX1RFU0xBCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUEVSRl9SRVFfU0hJRlQJCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1BFUkZfUkVRX01BU0sJCQkJCUJJVEZJRUxEKDAsIDcpCisKKy8qIFVzZWQgYnkgQ01fRU1VX09WRVJSSURFX0RQTExfUEVSICovCisjZGVmaW5lIE9NQVA0NDMwX1BFUl9EUExMX0VNVV9ESVZfU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfUEVSX0RQTExfRU1VX0RJVl9NQVNLCQkJCUJJVEZJRUxEKDAsIDYpCisKKy8qIFVzZWQgYnkgQ01fRU1VX09WRVJSSURFX0RQTExfUEVSICovCisjZGVmaW5lIE9NQVA0NDMwX1BFUl9EUExMX0VNVV9NVUxUX1NISUZUCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfUEVSX0RQTExfRU1VX01VTFRfTUFTSwkJCQlCSVRGSUVMRCg4LCAxOCkKKworLyogVXNlZCBieSBDTV9SRVNUT1JFX1NUICovCisjZGVmaW5lIE9NQVA0NDMwX1BIQVNFMV9DT01QTEVURURfU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfUEhBU0UxX0NPTVBMRVRFRF9NQVNLCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgQ01fUkVTVE9SRV9TVCAqLworI2RlZmluZSBPTUFQNDQzMF9QSEFTRTJBX0NPTVBMRVRFRF9TSElGVAkJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVA0NDMwX1BIQVNFMkFfQ09NUExFVEVEX01BU0sJCQkJQklURklFTEQoMSwgMSkKKworLyogVXNlZCBieSBDTV9SRVNUT1JFX1NUICovCisjZGVmaW5lIE9NQVA0NDMwX1BIQVNFMkJfQ09NUExFVEVEX1NISUZUCQkJKDEgPDwgMikKKyNkZWZpbmUgT01BUDQ0MzBfUEhBU0UyQl9DT01QTEVURURfTUFTSwkJCQlCSVRGSUVMRCgyLCAyKQorCisvKiBVc2VkIGJ5IENNX0VNVV9ERUJVR1NTX0NMS0NUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUE1EX1NUTV9NVVhfQ1RSTF9TSElGVAkJCQkoMSA8PCAyMCkKKyNkZWZpbmUgT01BUDQ0MzBfUE1EX1NUTV9NVVhfQ1RSTF9NQVNLCQkJCUJJVEZJRUxEKDIwLCAyMSkKKworLyogVXNlZCBieSBDTV9FTVVfREVCVUdTU19DTEtDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX1BNRF9UUkFDRV9NVVhfQ1RSTF9TSElGVAkJCSgxIDw8IDIyKQorI2RlZmluZSBPTUFQNDQzMF9QTURfVFJBQ0VfTVVYX0NUUkxfTUFTSwkJCUJJVEZJRUxEKDIyLCAyMykKKworLyogVXNlZCBieSBDTV9EWU5fREVQX1BSRVNDQUwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUFJFU0NBTF9TSElGVAkJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfUFJFU0NBTF9NQVNLCQkJCQlCSVRGSUVMRCgwLCA1KQorCisvKiBVc2VkIGJ5IFJFVklTSU9OX0NNMiwgUkVWSVNJT05fQ00xICovCisjZGVmaW5lIE9NQVA0NDMwX1JFVl9TSElGVAkJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfUkVWX01BU0sJCQkJCUJJVEZJRUxEKDAsIDcpCisKKy8qCisgKiBVc2VkIGJ5IENNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMLCBDTV9MM0lOSVRfVVNCX1RMTF9DTEtDVFJMLAorICogQ01fTDNJTklUX1VTQl9IT1NUX0NMS0NUUkxfUkVTVE9SRSwgQ01fTDNJTklUX1VTQl9UTExfQ0xLQ1RSTF9SRVNUT1JFCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfU0FSX01PREVfU0hJRlQJCQkJCSgxIDw8IDQpCisjZGVmaW5lIE9NQVA0NDMwX1NBUl9NT0RFX01BU0sJCQkJCUJJVEZJRUxEKDQsIDQpCisKKy8qIFVzZWQgYnkgQ01fU0NBTEVfRkNMSyAqLworI2RlZmluZSBPTUFQNDQzMF9TQ0FMRV9GQ0xLX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1NDQUxFX0ZDTEtfTUFTSwkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IENNX0w0Q0ZHX0RZTkFNSUNERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfU0RNQV9EWU5ERVBfU0hJRlQJCQkJKDEgPDwgMTEpCisjZGVmaW5lIE9NQVA0NDMwX1NETUFfRFlOREVQX01BU0sJCQkJQklURklFTEQoMTEsIDExKQorCisvKiBVc2VkIGJ5IENNX0RVQ0FUSV9TVEFUSUNERVAsIENNX01QVV9TVEFUSUNERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfU0RNQV9TVEFUREVQX1NISUZUCQkJCSgxIDw8IDExKQorI2RlZmluZSBPTUFQNDQzMF9TRE1BX1NUQVRERVBfTUFTSwkJCQlCSVRGSUVMRCgxMSwgMTEpCisKKy8qIFVzZWQgYnkgQ01fQ0xLU0VMX0FCRSAqLworI2RlZmluZSBPTUFQNDQzMF9TTElNQlVTX0NMS19HQVRFX1NISUZUCQkJCSgxIDw8IDEwKQorI2RlZmluZSBPTUFQNDQzMF9TTElNQlVTX0NMS19HQVRFX01BU0sJCQkJQklURklFTEQoMTAsIDEwKQorCisvKgorICogVXNlZCBieSBDTV9FTVVfREVCVUdTU19DTEtDVFJMLCBDTV9EMkRfU0FEMkRfQ0xLQ1RSTCwKKyAqIENNX0RVQ0FUSV9EVUNBVElfQ0xLQ1RSTCwgQ01fU0RNQV9TRE1BX0NMS0NUUkwsIENNX0dGWF9HRlhfQ0xLQ1RSTCwKKyAqIENNX0w0U0VDX0NSWVBUT0RNQV9DTEtDVFJMLCBDTV9MM0lOSVRfQ0NQVFhfQ0xLQ1RSTCwgQ01fTDNJTklUX0VNQUNfQ0xLQ1RSTCwKKyAqIENNX0wzSU5JVF9IU0lfQ0xLQ1RSTCwgQ01fTDNJTklUX01NQzFfQ0xLQ1RSTCwgQ01fTDNJTklUX01NQzJfQ0xLQ1RSTCwKKyAqIENNX0wzSU5JVF9NTUM2X0NMS0NUUkwsIENNX0wzSU5JVF9QMTUwMF9DTEtDVFJMLCBDTV9MM0lOSVRfUENJRVNTX0NMS0NUUkwsCisgKiBDTV9MM0lOSVRfU0FUQV9DTEtDVFJMLCBDTV9MM0lOSVRfVFBQU1NfQ0xLQ1RSTCwgQ01fTDNJTklUX1VOSVBSTzFfQ0xLQ1RSTCwKKyAqIENNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMLCBDTV9MM0lOSVRfVVNCX0hPU1RfRlNfQ0xLQ1RSTCwKKyAqIENNX0wzSU5JVF9VU0JfT1RHX0NMS0NUUkwsIENNX0wzSU5JVF9YSFBJX0NMS0NUUkwsIENNX0NBTV9GRElGX0NMS0NUUkwsCisgKiBDTV9DQU1fSVNTX0NMS0NUUkwsIENNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMX1JFU1RPUkUsCisgKiBDTV9JVkFIRF9JVkFIRF9DTEtDVFJMLCBDTV9EU1NfREVJU1NfQ0xLQ1RSTCwgQ01fRFNTX0RTU19DTEtDVFJMLAorICogQ01fTVBVX01QVV9DTEtDVFJMLCBDTV9URVNMQV9URVNMQV9DTEtDVFJMLCBDTTFfQUJFX0FFU1NfQ0xLQ1RSTAorICovCisjZGVmaW5lIE9NQVA0NDMwX1NUQllTVF9TSElGVAkJCQkJKDEgPDwgMTgpCisjZGVmaW5lIE9NQVA0NDMwX1NUQllTVF9NQVNLCQkJCQlCSVRGSUVMRCgxOCwgMTgpCisKKy8qCisgKiBVc2VkIGJ5IENNX0lETEVTVF9EUExMX1BFUiwgQ01fSURMRVNUX0RQTExfVU5JUFJPLCBDTV9JRExFU1RfRFBMTF9VU0IsCisgKiBDTV9JRExFU1RfRFBMTF9BQkUsIENNX0lETEVTVF9EUExMX0NPUkUsIENNX0lETEVTVF9EUExMX0REUlBIWSwKKyAqIENNX0lETEVTVF9EUExMX0lWQSwgQ01fSURMRVNUX0RQTExfTVBVCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfU1RfRFBMTF9DTEtfU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfU1RfRFBMTF9DTEtfTUFTSwkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IENNX0NMS0RDT0xET19EUExMX1VTQiAqLworI2RlZmluZSBPTUFQNDQzMF9TVF9EUExMX0NMS0RDT0xET19TSElGVAkJCSgxIDw8IDkpCisjZGVmaW5lIE9NQVA0NDMwX1NUX0RQTExfQ0xLRENPTERPX01BU0sJCQkJQklURklFTEQoOSwgOSkKKworLyoKKyAqIFVzZWQgYnkgQ01fRElWX00yX0RQTExfUEVSLCBDTV9ESVZfTTJfRFBMTF9VU0IsIENNX0RJVl9NMl9EUExMX0NPUkVfUkVTVE9SRSwKKyAqIENNX0RJVl9NMl9EUExMX0FCRSwgQ01fRElWX00yX0RQTExfQ09SRSwgQ01fRElWX00yX0RQTExfRERSUEhZLAorICogQ01fRElWX00yX0RQTExfTVBVCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfU1RfRFBMTF9DTEtPVVRfU0hJRlQJCQkJKDEgPDwgOSkKKyNkZWZpbmUgT01BUDQ0MzBfU1RfRFBMTF9DTEtPVVRfTUFTSwkJCQlCSVRGSUVMRCg5LCA5KQorCisvKgorICogVXNlZCBieSBDTV9ESVZfTTNfRFBMTF9QRVIsIENNX0RJVl9NM19EUExMX0NPUkVfUkVTVE9SRSwgQ01fRElWX00zX0RQTExfQUJFLAorICogQ01fRElWX00zX0RQTExfQ09SRQorICovCisjZGVmaW5lIE9NQVA0NDMwX1NUX0RQTExfQ0xLT1VUSElGX1NISUZUCQkJKDEgPDwgOSkKKyNkZWZpbmUgT01BUDQ0MzBfU1RfRFBMTF9DTEtPVVRISUZfTUFTSwkJCQlCSVRGSUVMRCg5LCA5KQorCisvKiBVc2VkIGJ5IENNX0RJVl9NMl9EUExMX1BFUiwgQ01fRElWX00yX0RQTExfVU5JUFJPLCBDTV9ESVZfTTJfRFBMTF9BQkUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfU1RfRFBMTF9DTEtPVVRYMl9TSElGVAkJCQkoMSA8PCAxMSkKKyNkZWZpbmUgT01BUDQ0MzBfU1RfRFBMTF9DTEtPVVRYMl9NQVNLCQkJCUJJVEZJRUxEKDExLCAxMSkKKworLyoKKyAqIFVzZWQgYnkgQ01fRElWX000X0RQTExfUEVSLCBDTV9ESVZfTTRfRFBMTF9DT1JFX1JFU1RPUkUsCisgKiBDTV9ESVZfTTRfRFBMTF9DT1JFLCBDTV9ESVZfTTRfRFBMTF9ERFJQSFksIENNX0RJVl9NNF9EUExMX0lWQQorICovCisjZGVmaW5lIE9NQVA0NDMwX1NUX0hTRElWSURFUl9DTEtPVVQxX1NISUZUCQkJKDEgPDwgOSkKKyNkZWZpbmUgT01BUDQ0MzBfU1RfSFNESVZJREVSX0NMS09VVDFfTUFTSwkJCUJJVEZJRUxEKDksIDkpCisKKy8qCisgKiBVc2VkIGJ5IENNX0RJVl9NNV9EUExMX1BFUiwgQ01fRElWX001X0RQTExfQ09SRV9SRVNUT1JFLAorICogQ01fRElWX001X0RQTExfQ09SRSwgQ01fRElWX001X0RQTExfRERSUEhZLCBDTV9ESVZfTTVfRFBMTF9JVkEKKyAqLworI2RlZmluZSBPTUFQNDQzMF9TVF9IU0RJVklERVJfQ0xLT1VUMl9TSElGVAkJCSgxIDw8IDkpCisjZGVmaW5lIE9NQVA0NDMwX1NUX0hTRElWSURFUl9DTEtPVVQyX01BU0sJCQlCSVRGSUVMRCg5LCA5KQorCisvKgorICogVXNlZCBieSBDTV9ESVZfTTZfRFBMTF9QRVIsIENNX0RJVl9NNl9EUExMX0NPUkVfUkVTVE9SRSwKKyAqIENNX0RJVl9NNl9EUExMX0NPUkUsIENNX0RJVl9NNl9EUExMX0REUlBIWQorICovCisjZGVmaW5lIE9NQVA0NDMwX1NUX0hTRElWSURFUl9DTEtPVVQzX1NISUZUCQkJKDEgPDwgOSkKKyNkZWZpbmUgT01BUDQ0MzBfU1RfSFNESVZJREVSX0NMS09VVDNfTUFTSwkJCUJJVEZJRUxEKDksIDkpCisKKy8qCisgKiBVc2VkIGJ5IENNX0RJVl9NN19EUExMX1BFUiwgQ01fRElWX003X0RQTExfQ09SRV9SRVNUT1JFLAorICogQ01fRElWX003X0RQTExfQ09SRQorICovCisjZGVmaW5lIE9NQVA0NDMwX1NUX0hTRElWSURFUl9DTEtPVVQ0X1NISUZUCQkJKDEgPDwgOSkKKyNkZWZpbmUgT01BUDQ0MzBfU1RfSFNESVZJREVSX0NMS09VVDRfTUFTSwkJCUJJVEZJRUxEKDksIDkpCisKKy8qIFVzZWQgYnkgQ01fU1lTX0NMS1NFTCAqLworI2RlZmluZSBPTUFQNDQzMF9TWVNfQ0xLU0VMX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1NZU19DTEtTRUxfTUFTSwkJCQlCSVRGSUVMRCgwLCAyKQorCisvKiBVc2VkIGJ5IENNX0w0Q0ZHX0RZTkFNSUNERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVEVTTEFfRFlOREVQX1NISUZUCQkJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVA0NDMwX1RFU0xBX0RZTkRFUF9NQVNLCQkJCUJJVEZJRUxEKDEsIDEpCisKKy8qIFVzZWQgYnkgQ01fRFVDQVRJX1NUQVRJQ0RFUCwgQ01fTVBVX1NUQVRJQ0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9URVNMQV9TVEFUREVQX1NISUZUCQkJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVA0NDMwX1RFU0xBX1NUQVRERVBfTUFTSwkJCQlCSVRGSUVMRCgxLCAxKQorCisvKgorICogVXNlZCBieSBDTV9FTVVfRFlOQU1JQ0RFUCwgQ01fRDJEX0RZTkFNSUNERVAsIENNX0RVQ0FUSV9EWU5BTUlDREVQLAorICogQ01fTDNfMV9EWU5BTUlDREVQLCBDTV9MM18yX0RZTkFNSUNERVAsIENNX0w0Q0ZHX0RZTkFNSUNERVAsCisgKiBDTV9MNFBFUl9EWU5BTUlDREVQLCBDTV9NUFVfRFlOQU1JQ0RFUCwgQ01fVEVTTEFfRFlOQU1JQ0RFUAorICovCisjZGVmaW5lIE9NQVA0NDMwX1dJTkRPV1NJWkVfU0hJRlQJCQkJKDEgPDwgMjQpCisjZGVmaW5lIE9NQVA0NDMwX1dJTkRPV1NJWkVfTUFTSwkJCQlCSVRGSUVMRCgyNCwgMjcpCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY20uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY20uYwppbmRleCA4ZWIyZGFiLi41OGU0YTFjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2NtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbS5jCkBAIC0yMSw2ICsyMSw4IEBACiAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKKyNpbmNsdWRlIDxwbGF0L2NvbW1vbi5oPgorCiAjaW5jbHVkZSAiY20uaCIKICNpbmNsdWRlICJjbS1yZWdiaXRzLTI0eHguaCIKICNpbmNsdWRlICJjbS1yZWdiaXRzLTM0eHguaCIKQEAgLTYxLDkgKzYzLDggQEAKIAltYXNrID0gMSA8PCBpZGxlc3Rfc2hpZnQ7CiAKIAkvKiBYWFggc2hvdWxkIGJlIE9NQVAyIENNICovCi0Jd2hpbGUgKCgoY21fcmVhZF9tb2RfcmVnKHByY21fbW9kLCBjbV9pZGxlc3RfcmVnKSAmIG1hc2spICE9IGVuYSkgJiYKLQkgICAgICAgKGkrKyA8IE1BWF9NT0RVTEVfUkVBRFlfVElNRSkpCi0JCXVkZWxheSgxKTsKKwlvbWFwX3Rlc3RfdGltZW91dCgoKGNtX3JlYWRfbW9kX3JlZyhwcmNtX21vZCwgY21faWRsZXN0X3JlZykgJiBtYXNrKSA9PSBlbmEpLAorCQkJICBNQVhfTU9EVUxFX1JFQURZX1RJTUUsIGkpOwogCiAJcmV0dXJuIChpIDwgTUFYX01PRFVMRV9SRUFEWV9USU1FKSA/IDAgOiAtRUJVU1k7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2NtLmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NtLmgKaW5kZXggYTJmY2ZjYzIuLjkwYTQwODYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvY20uaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NtLmgKQEAgLTQsOCArNCw4IEBACiAvKgogICogT01BUDIvMyBDbG9jayBNYW5hZ2VtZW50IChDTSkgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggTm9raWEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbgogICoKICAqIFdyaXR0ZW4gYnkgUGF1bCBXYWxtc2xleQogICoKQEAgLTIyLDYgKzIyLDEyIEBACiAJCQlPTUFQMl9MNF9JT19BRERSRVNTKE9NQVAyNDMwX0NNX0JBU0UgKyAobW9kdWxlKSArIChyZWcpKQogI2RlZmluZSBPTUFQMzRYWF9DTV9SRUdBRERSKG1vZHVsZSwgcmVnKQkJCQlcCiAJCQlPTUFQMl9MNF9JT19BRERSRVNTKE9NQVAzNDMwX0NNX0JBU0UgKyAobW9kdWxlKSArIChyZWcpKQorI2RlZmluZSBPTUFQNDRYWF9DTTFfUkVHQUREUihtb2R1bGUsIHJlZykJCQkJXAorCQkJT01BUDJfTDRfSU9fQUREUkVTUyhPTUFQNDQzMF9DTTFfQkFTRSArIChtb2R1bGUpICsgKHJlZykpCisjZGVmaW5lIE9NQVA0NFhYX0NNMl9SRUdBRERSKG1vZHVsZSwgcmVnKQkJCQlcCisJCQlPTUFQMl9MNF9JT19BRERSRVNTKE9NQVA0NDMwX0NNMl9CQVNFICsgKG1vZHVsZSkgKyAocmVnKSkKKworI2luY2x1ZGUgImNtNDR4eC5oIgogCiAvKgogICogQXJjaGl0ZWN0dXJlLXNwZWNpZmljIGdsb2JhbCBDTSByZWdpc3RlcnMKQEAgLTg5LDYgKzk1LDExIEBACiAjZGVmaW5lIE9NQVAzNDMwX0NNX0NMS1NFTDJfRU1VCQkJCTB4MDA1MAogI2RlZmluZSBPTUFQMzQzMF9DTV9DTEtTRUwzX0VNVQkJCQkweDAwNTQKIAorLyogQ00yLkNFRlVTRV9DTTIgcmVnaXN0ZXIgb2Zmc2V0cyAqLworCisvKiBPTUFQNCBtb2R1bGVtb2RlIGNvbnRyb2wgKi8KKyNkZWZpbmUgT01BUDQ0MzBfTU9EVUxFTU9ERV9IV0NUUkwJCQkwCisjZGVmaW5lIE9NQVA0NDMwX01PRFVMRU1PREVfU1dDVFJMCQkJMQogCiAvKiBDbG9jayBtYW5hZ2VtZW50IGRvbWFpbiByZWdpc3RlciBnZXQvc2V0ICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY200NHh4LmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NtNDR4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NzViOWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NtNDR4eC5oCkBAIC0wLDAgKzEsMzU4IEBACisvKgorICogT01BUDQ0eHggQ00xICYgQ00yIGluc3RhbmNlIG9mZnNldCBtYWNyb3MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIFBhdWwgV2FsbXNsZXkgKHBhdWxAcHdzYW4uY29tKQorICogUmFqZW5kcmEgTmF5YWsgKHJuYXlha0B0aS5jb20pCisgKiBCZW5vaXQgQ291c3NvbiAoYi1jb3Vzc29uQHRpLmNvbSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSB0aGUgT01BUCBoYXJkd2FyZSBkYXRhYmFzZXMuCisgKiBXZSByZXNwZWN0ZnVsbHkgYXNrIHRoYXQgYW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIGJlIGNvb3JkaW5hdGVkCisgKiB3aXRoIHRoZSBwdWJsaWMgbGludXgtb21hcEB2Z2VyLmtlcm5lbC5vcmcgbWFpbGluZyBsaXN0IGFuZCB0aGUKKyAqIGF1dGhvcnMgYWJvdmUgdG8gZW5zdXJlIHRoYXQgdGhlIGF1dG9nZW5lcmF0aW9uIHNjcmlwdHMgYXJlIGtlcHQKKyAqIHVwLXRvLWRhdGUgd2l0aCB0aGUgZmlsZSBjb250ZW50cy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19BUkNIX0FSTV9NQUNIX09NQVAyX0NNNDRYWF9ICisjZGVmaW5lIF9fQVJDSF9BUk1fTUFDSF9PTUFQMl9DTTQ0WFhfSAorCisKKy8qIENNMSAqLworCisKKy8qIENNMS5PQ1BfU09DS0VUX0NNMSByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE9NQVA0NDMwX1JFVklTSU9OX0NNMQkJCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfT0NQX1NPQ0tFVF9NT0QsIDB4MDAwMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fQ00xX1BST0ZJTElOR19DTEtDVFJMCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfT0NQX1NPQ0tFVF9NT0QsIDB4MDA0MCkKKworLyogQ00xLkNLR0VOX0NNMSByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE9NQVA0NDMwX0NNX0NMS1NFTF9DT1JFCQkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDAwMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fQ0xLU0VMX0FCRQkJCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQ0tHRU5fTU9ELCAweDAwMDgpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0RMTF9DVFJMCQkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDAxMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fQ0xLTU9ERV9EUExMX0NPUkUJCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQ0tHRU5fTU9ELCAweDAwMjApCisjZGVmaW5lIE9NQVA0NDMwX0NNX0lETEVTVF9EUExMX0NPUkUJCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQ0tHRU5fTU9ELCAweDAwMjQpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0FVVE9JRExFX0RQTExfQ09SRQkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDAyOCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fQ0xLU0VMX0RQTExfQ09SRQkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDAyYykKKyNkZWZpbmUgT01BUDQ0MzBfQ01fRElWX00yX0RQTExfQ09SRQkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDAzMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fRElWX00zX0RQTExfQ09SRQkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDAzNCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fRElWX000X0RQTExfQ09SRQkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDAzOCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fRElWX001X0RQTExfQ09SRQkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDAzYykKKyNkZWZpbmUgT01BUDQ0MzBfQ01fRElWX002X0RQTExfQ09SRQkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDA0MCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fRElWX003X0RQTExfQ09SRQkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDA0NCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fU1NDX0RFTFRBTVNURVBfRFBMTF9DT1JFCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQ0tHRU5fTU9ELCAweDAwNDgpCisjZGVmaW5lIE9NQVA0NDMwX0NNX1NTQ19NT0RGUkVRRElWX0RQTExfQ09SRQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0NLR0VOX01PRCwgMHgwMDRjKQorI2RlZmluZSBPTUFQNDQzMF9DTV9FTVVfT1ZFUlJJREVfRFBMTF9DT1JFCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQ0tHRU5fTU9ELCAweDAwNTApCisjZGVmaW5lIE9NQVA0NDMwX0NNX0NMS01PREVfRFBMTF9NUFUJCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQ0tHRU5fTU9ELCAweDAwNjApCisjZGVmaW5lIE9NQVA0NDMwX0NNX0lETEVTVF9EUExMX01QVQkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDA2NCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fQVVUT0lETEVfRFBMTF9NUFUJCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQ0tHRU5fTU9ELCAweDAwNjgpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0NMS1NFTF9EUExMX01QVQkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDA2YykKKyNkZWZpbmUgT01BUDQ0MzBfQ01fRElWX00yX0RQTExfTVBVCQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0NLR0VOX01PRCwgMHgwMDcwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9TU0NfREVMVEFNU1RFUF9EUExMX01QVQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0NLR0VOX01PRCwgMHgwMDg4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9TU0NfTU9ERlJFUURJVl9EUExMX01QVQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0NLR0VOX01PRCwgMHgwMDhjKQorI2RlZmluZSBPTUFQNDQzMF9DTV9CWVBDTEtfRFBMTF9NUFUJCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQ0tHRU5fTU9ELCAweDAwOWMpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0NMS01PREVfRFBMTF9JVkEJCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQ0tHRU5fTU9ELCAweDAwYTApCisjZGVmaW5lIE9NQVA0NDMwX0NNX0lETEVTVF9EUExMX0lWQQkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDBhNCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fQVVUT0lETEVfRFBMTF9JVkEJCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQ0tHRU5fTU9ELCAweDAwYTgpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0NMS1NFTF9EUExMX0lWQQkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDBhYykKKyNkZWZpbmUgT01BUDQ0MzBfQ01fRElWX000X0RQTExfSVZBCQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0NLR0VOX01PRCwgMHgwMGI4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9ESVZfTTVfRFBMTF9JVkEJCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQ0tHRU5fTU9ELCAweDAwYmMpCisjZGVmaW5lIE9NQVA0NDMwX0NNX1NTQ19ERUxUQU1TVEVQX0RQTExfSVZBCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQ0tHRU5fTU9ELCAweDAwYzgpCisjZGVmaW5lIE9NQVA0NDMwX0NNX1NTQ19NT0RGUkVRRElWX0RQTExfSVZBCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQ0tHRU5fTU9ELCAweDAwY2MpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0JZUENMS19EUExMX0lWQQkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDBkYykKKyNkZWZpbmUgT01BUDQ0MzBfQ01fQ0xLTU9ERV9EUExMX0FCRQkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDBlMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fSURMRVNUX0RQTExfQUJFCQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0NLR0VOX01PRCwgMHgwMGU0KQorI2RlZmluZSBPTUFQNDQzMF9DTV9BVVRPSURMRV9EUExMX0FCRQkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDBlOCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fQ0xLU0VMX0RQTExfQUJFCQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0NLR0VOX01PRCwgMHgwMGVjKQorI2RlZmluZSBPTUFQNDQzMF9DTV9ESVZfTTJfRFBMTF9BQkUJCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQ0tHRU5fTU9ELCAweDAwZjApCisjZGVmaW5lIE9NQVA0NDMwX0NNX0RJVl9NM19EUExMX0FCRQkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDBmNCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fU1NDX0RFTFRBTVNURVBfRFBMTF9BQkUJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDEwOCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fU1NDX01PREZSRVFESVZfRFBMTF9BQkUJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDEwYykKKyNkZWZpbmUgT01BUDQ0MzBfQ01fQ0xLTU9ERV9EUExMX0REUlBIWQkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDEyMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fSURMRVNUX0RQTExfRERSUEhZCQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0NLR0VOX01PRCwgMHgwMTI0KQorI2RlZmluZSBPTUFQNDQzMF9DTV9BVVRPSURMRV9EUExMX0REUlBIWQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0NLR0VOX01PRCwgMHgwMTI4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9DTEtTRUxfRFBMTF9ERFJQSFkJCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQ0tHRU5fTU9ELCAweDAxMmMpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0RJVl9NMl9EUExMX0REUlBIWQkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDEzMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fRElWX000X0RQTExfRERSUEhZCQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0NLR0VOX01PRCwgMHgwMTM4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9ESVZfTTVfRFBMTF9ERFJQSFkJCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQ0tHRU5fTU9ELCAweDAxM2MpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0RJVl9NNl9EUExMX0REUlBIWQkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDE0MCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fU1NDX0RFTFRBTVNURVBfRFBMTF9ERFJQSFkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDE0OCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fU1NDX01PREZSRVFESVZfRFBMTF9ERFJQSFkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDE0YykKKyNkZWZpbmUgT01BUDQ0MzBfQ01fU0hBRE9XX0ZSRVFfQ09ORklHMQkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDE2MCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fU0hBRE9XX0ZSRVFfQ09ORklHMgkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDE2NCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fRFlOX0RFUF9QUkVTQ0FMCQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0NLR0VOX01PRCwgMHgwMTcwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9SRVNUT1JFX1NUCQkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QsIDB4MDE4MCkKKworLyogQ00xLk1QVV9DTTEgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBPTUFQNDQzMF9DTV9NUFVfQ0xLU1RDVFJMCQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX01QVV9NT0QsIDB4MDAwMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTVBVX1NUQVRJQ0RFUAkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9NUFVfTU9ELCAweDAwMDQpCisjZGVmaW5lIE9NQVA0NDMwX0NNX01QVV9EWU5BTUlDREVQCQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX01QVV9NT0QsIDB4MDAwOCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTVBVX01QVV9DTEtDVFJMCQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX01QVV9NT0QsIDB4MDAyMCkKKworLyogQ00xLlRFU0xBX0NNMSByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE9NQVA0NDMwX0NNX1RFU0xBX0NMS1NUQ1RSTAkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9URVNMQV9NT0QsIDB4MDAwMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fVEVTTEFfU1RBVElDREVQCQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX1RFU0xBX01PRCwgMHgwMDA0KQorI2RlZmluZSBPTUFQNDQzMF9DTV9URVNMQV9EWU5BTUlDREVQCQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX1RFU0xBX01PRCwgMHgwMDA4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9URVNMQV9URVNMQV9DTEtDVFJMCQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX1RFU0xBX01PRCwgMHgwMDIwKQorCisvKiBDTTEuQUJFX0NNMSByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE9NQVA0NDMwX0NNMV9BQkVfQ0xLU1RDVFJMCQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0FCRV9NT0QsIDB4MDAwMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ00xX0FCRV9MNEFCRV9DTEtDVFJMCQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0FCRV9NT0QsIDB4MDAyMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ00xX0FCRV9BRVNTX0NMS0NUUkwJCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQUJFX01PRCwgMHgwMDI4KQorI2RlZmluZSBPTUFQNDQzMF9DTTFfQUJFX1BETV9DTEtDVFJMCQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0FCRV9NT0QsIDB4MDAzMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ00xX0FCRV9ETUlDX0NMS0NUUkwJCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQUJFX01PRCwgMHgwMDM4KQorI2RlZmluZSBPTUFQNDQzMF9DTTFfQUJFX01DQVNQX0NMS0NUUkwJCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQUJFX01PRCwgMHgwMDQwKQorI2RlZmluZSBPTUFQNDQzMF9DTTFfQUJFX01DQlNQMV9DTEtDVFJMCQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0FCRV9NT0QsIDB4MDA0OCkKKyNkZWZpbmUgT01BUDQ0MzBfQ00xX0FCRV9NQ0JTUDJfQ0xLQ1RSTAkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9BQkVfTU9ELCAweDAwNTApCisjZGVmaW5lIE9NQVA0NDMwX0NNMV9BQkVfTUNCU1AzX0NMS0NUUkwJCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQUJFX01PRCwgMHgwMDU4KQorI2RlZmluZSBPTUFQNDQzMF9DTTFfQUJFX1NMSU1CVVNfQ0xLQ1RSTAkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0FCRV9NT0QsIDB4MDA2MCkKKyNkZWZpbmUgT01BUDQ0MzBfQ00xX0FCRV9USU1FUjVfQ0xLQ1RSTAkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9BQkVfTU9ELCAweDAwNjgpCisjZGVmaW5lIE9NQVA0NDMwX0NNMV9BQkVfVElNRVI2X0NMS0NUUkwJCQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfQUJFX01PRCwgMHgwMDcwKQorI2RlZmluZSBPTUFQNDQzMF9DTTFfQUJFX1RJTUVSN19DTEtDVFJMCQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0FCRV9NT0QsIDB4MDA3OCkKKyNkZWZpbmUgT01BUDQ0MzBfQ00xX0FCRV9USU1FUjhfQ0xLQ1RSTAkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9BQkVfTU9ELCAweDAwODApCisjZGVmaW5lIE9NQVA0NDMwX0NNMV9BQkVfV0RUM19DTEtDVFJMCQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX0FCRV9NT0QsIDB4MDA4OCkKKworLyogQ00xLlJFU1RPUkVfQ00xIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ01fQ0xLU0VMX0NPUkVfUkVTVE9SRQkJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9SRVNUT1JFX01PRCwgMHgwMDAwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9ESVZfTTJfRFBMTF9DT1JFX1JFU1RPUkUJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9SRVNUT1JFX01PRCwgMHgwMDA0KQorI2RlZmluZSBPTUFQNDQzMF9DTV9ESVZfTTNfRFBMTF9DT1JFX1JFU1RPUkUJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9SRVNUT1JFX01PRCwgMHgwMDA4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9ESVZfTTRfRFBMTF9DT1JFX1JFU1RPUkUJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9SRVNUT1JFX01PRCwgMHgwMDBjKQorI2RlZmluZSBPTUFQNDQzMF9DTV9ESVZfTTVfRFBMTF9DT1JFX1JFU1RPUkUJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9SRVNUT1JFX01PRCwgMHgwMDEwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9ESVZfTTZfRFBMTF9DT1JFX1JFU1RPUkUJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9SRVNUT1JFX01PRCwgMHgwMDE0KQorI2RlZmluZSBPTUFQNDQzMF9DTV9ESVZfTTdfRFBMTF9DT1JFX1JFU1RPUkUJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9SRVNUT1JFX01PRCwgMHgwMDE4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9DTEtTRUxfRFBMTF9DT1JFX1JFU1RPUkUJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9SRVNUT1JFX01PRCwgMHgwMDFjKQorI2RlZmluZSBPTUFQNDQzMF9DTV9TU0NfREVMVEFNU1RFUF9EUExMX0NPUkVfUkVTVE9SRQlPTUFQNDRYWF9DTTFfUkVHQUREUihPTUFQNDQzMF9DTTFfUkVTVE9SRV9NT0QsIDB4MDAyMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fU1NDX01PREZSRVFESVZfRFBMTF9DT1JFX1JFU1RPUkUJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX1JFU1RPUkVfTU9ELCAweDAwMjQpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0NMS01PREVfRFBMTF9DT1JFX1JFU1RPUkUJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9SRVNUT1JFX01PRCwgMHgwMDI4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9TSEFET1dfRlJFUV9DT05GSUcxX1JFU1RPUkUJCU9NQVA0NFhYX0NNMV9SRUdBRERSKE9NQVA0NDMwX0NNMV9SRVNUT1JFX01PRCwgMHgwMDJjKQorI2RlZmluZSBPTUFQNDQzMF9DTV9BVVRPSURMRV9EUExMX0NPUkVfUkVTVE9SRQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX1JFU1RPUkVfTU9ELCAweDAwMzApCisjZGVmaW5lIE9NQVA0NDMwX0NNX01QVV9DTEtTVENUUkxfUkVTVE9SRQkJT01BUDQ0WFhfQ00xX1JFR0FERFIoT01BUDQ0MzBfQ00xX1JFU1RPUkVfTU9ELCAweDAwMzQpCisKKy8qIENNMiAqLworCisKKy8qIENNMi5PQ1BfU09DS0VUX0NNMiByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE9NQVA0NDMwX1JFVklTSU9OX0NNMgkJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfT0NQX1NPQ0tFVF9NT0QsIDB4MDAwMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fQ00yX1BST0ZJTElOR19DTEtDVFJMCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfT0NQX1NPQ0tFVF9NT0QsIDB4MDA0MCkKKworLyogQ00yLkNLR0VOX0NNMiByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE9NQVA0NDMwX0NNX0NMS1NFTF9EVUNBVElfSVNTX1JPT1QJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DS0dFTl9NT0QsIDB4MDAwMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fQ0xLU0VMX1VTQl82ME1IWgkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DS0dFTl9NT0QsIDB4MDAwNCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fU0NBTEVfRkNMSwkJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ0tHRU5fTU9ELCAweDAwMDgpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0NPUkVfRFZGU19QRVJGMQkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DS0dFTl9NT0QsIDB4MDAxMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fQ09SRV9EVkZTX1BFUkYyCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NLR0VOX01PRCwgMHgwMDE0KQorI2RlZmluZSBPTUFQNDQzMF9DTV9DT1JFX0RWRlNfUEVSRjMJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ0tHRU5fTU9ELCAweDAwMTgpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0NPUkVfRFZGU19QRVJGNAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DS0dFTl9NT0QsIDB4MDAxYykKKyNkZWZpbmUgT01BUDQ0MzBfQ01fQ09SRV9EVkZTX0NVUlJFTlQJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ0tHRU5fTU9ELCAweDAwMjQpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0lWQV9EVkZTX1BFUkZfVEVTTEEJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ0tHRU5fTU9ELCAweDAwMjgpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0lWQV9EVkZTX1BFUkZfSVZBSEQJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ0tHRU5fTU9ELCAweDAwMmMpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0lWQV9EVkZTX1BFUkZfQUJFCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NLR0VOX01PRCwgMHgwMDMwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9JVkFfRFZGU19DVVJSRU5UCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NLR0VOX01PRCwgMHgwMDM4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9DTEtNT0RFX0RQTExfUEVSCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NLR0VOX01PRCwgMHgwMDQwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9JRExFU1RfRFBMTF9QRVIJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ0tHRU5fTU9ELCAweDAwNDQpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0FVVE9JRExFX0RQTExfUEVSCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NLR0VOX01PRCwgMHgwMDQ4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9DTEtTRUxfRFBMTF9QRVIJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ0tHRU5fTU9ELCAweDAwNGMpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0RJVl9NMl9EUExMX1BFUgkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DS0dFTl9NT0QsIDB4MDA1MCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fRElWX00zX0RQTExfUEVSCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NLR0VOX01PRCwgMHgwMDU0KQorI2RlZmluZSBPTUFQNDQzMF9DTV9ESVZfTTRfRFBMTF9QRVIJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ0tHRU5fTU9ELCAweDAwNTgpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0RJVl9NNV9EUExMX1BFUgkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DS0dFTl9NT0QsIDB4MDA1YykKKyNkZWZpbmUgT01BUDQ0MzBfQ01fRElWX002X0RQTExfUEVSCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NLR0VOX01PRCwgMHgwMDYwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9ESVZfTTdfRFBMTF9QRVIJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ0tHRU5fTU9ELCAweDAwNjQpCisjZGVmaW5lIE9NQVA0NDMwX0NNX1NTQ19ERUxUQU1TVEVQX0RQTExfUEVSCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ0tHRU5fTU9ELCAweDAwNjgpCisjZGVmaW5lIE9NQVA0NDMwX0NNX1NTQ19NT0RGUkVRRElWX0RQTExfUEVSCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ0tHRU5fTU9ELCAweDAwNmMpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0VNVV9PVkVSUklERV9EUExMX1BFUgkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NLR0VOX01PRCwgMHgwMDcwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9DTEtNT0RFX0RQTExfVVNCCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NLR0VOX01PRCwgMHgwMDgwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9JRExFU1RfRFBMTF9VU0IJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ0tHRU5fTU9ELCAweDAwODQpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0FVVE9JRExFX0RQTExfVVNCCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NLR0VOX01PRCwgMHgwMDg4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9DTEtTRUxfRFBMTF9VU0IJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ0tHRU5fTU9ELCAweDAwOGMpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0RJVl9NMl9EUExMX1VTQgkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DS0dFTl9NT0QsIDB4MDA5MCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fU1NDX0RFTFRBTVNURVBfRFBMTF9VU0IJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DS0dFTl9NT0QsIDB4MDBhOCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fU1NDX01PREZSRVFESVZfRFBMTF9VU0IJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DS0dFTl9NT0QsIDB4MDBhYykKKyNkZWZpbmUgT01BUDQ0MzBfQ01fQ0xLRENPTERPX0RQTExfVVNCCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NLR0VOX01PRCwgMHgwMGI0KQorI2RlZmluZSBPTUFQNDQzMF9DTV9DTEtNT0RFX0RQTExfVU5JUFJPCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NLR0VOX01PRCwgMHgwMGMwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9JRExFU1RfRFBMTF9VTklQUk8JCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ0tHRU5fTU9ELCAweDAwYzQpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0FVVE9JRExFX0RQTExfVU5JUFJPCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ0tHRU5fTU9ELCAweDAwYzgpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0NMS1NFTF9EUExMX1VOSVBSTwkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DS0dFTl9NT0QsIDB4MDBjYykKKyNkZWZpbmUgT01BUDQ0MzBfQ01fRElWX00yX0RQTExfVU5JUFJPCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NLR0VOX01PRCwgMHgwMGQwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9TU0NfREVMVEFNU1RFUF9EUExMX1VOSVBSTwkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NLR0VOX01PRCwgMHgwMGU4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9TU0NfTU9ERlJFUURJVl9EUExMX1VOSVBSTwkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NLR0VOX01PRCwgMHgwMGVjKQorCisvKiBDTTIuQUxXQVlTX09OX0NNMiByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE9NQVA0NDMwX0NNX0FMV09OX0NMS1NUQ1RSTAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9BTFdBWVNfT05fTU9ELCAweDAwMDApCisjZGVmaW5lIE9NQVA0NDMwX0NNX0FMV09OX01ETUlOVENfQ0xLQ1RSTAkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0FMV0FZU19PTl9NT0QsIDB4MDAyMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fQUxXT05fU1JfTVBVX0NMS0NUUkwJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9BTFdBWVNfT05fTU9ELCAweDAwMjgpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0FMV09OX1NSX0lWQV9DTEtDVFJMCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQUxXQVlTX09OX01PRCwgMHgwMDMwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9BTFdPTl9TUl9DT1JFX0NMS0NUUkwJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9BTFdBWVNfT05fTU9ELCAweDAwMzgpCisKKy8qIENNMi5DT1JFX0NNMiByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE9NQVA0NDMwX0NNX0wzXzFfQ0xLU1RDVFJMCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NPUkVfTU9ELCAweDAwMDApCisjZGVmaW5lIE9NQVA0NDMwX0NNX0wzXzFfRFlOQU1JQ0RFUAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DT1JFX01PRCwgMHgwMDA4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9MM18xX0wzXzFfQ0xLQ1RSTAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DT1JFX01PRCwgMHgwMDIwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9MM18yX0NMS1NUQ1RSTAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DT1JFX01PRCwgMHgwMTAwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9MM18yX0RZTkFNSUNERVAJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ09SRV9NT0QsIDB4MDEwOCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDNfMl9MM18yX0NMS0NUUkwJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ09SRV9NT0QsIDB4MDEyMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDNfMl9HUE1DX0NMS0NUUkwJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ09SRV9NT0QsIDB4MDEyOCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDNfMl9PQ01DX1JBTV9DTEtDVFJMCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ09SRV9NT0QsIDB4MDEzMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fRFVDQVRJX0NMS1NUQ1RSTAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DT1JFX01PRCwgMHgwMjAwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9EVUNBVElfU1RBVElDREVQCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NPUkVfTU9ELCAweDAyMDQpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0RVQ0FUSV9EWU5BTUlDREVQCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NPUkVfTU9ELCAweDAyMDgpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0RVQ0FUSV9EVUNBVElfQ0xLQ1RSTAkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NPUkVfTU9ELCAweDAyMjApCisjZGVmaW5lIE9NQVA0NDMwX0NNX1NETUFfQ0xLU1RDVFJMCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NPUkVfTU9ELCAweDAzMDApCisjZGVmaW5lIE9NQVA0NDMwX0NNX1NETUFfU1RBVElDREVQCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NPUkVfTU9ELCAweDAzMDQpCisjZGVmaW5lIE9NQVA0NDMwX0NNX1NETUFfRFlOQU1JQ0RFUAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DT1JFX01PRCwgMHgwMzA4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9TRE1BX1NETUFfQ0xLQ1RSTAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DT1JFX01PRCwgMHgwMzIwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9NRU1JRl9DTEtTVENUUkwJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ09SRV9NT0QsIDB4MDQwMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTUVNSUZfRE1NX0NMS0NUUkwJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ09SRV9NT0QsIDB4MDQyMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTUVNSUZfRU1JRl9GV19DTEtDVFJMCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ09SRV9NT0QsIDB4MDQyOCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTUVNSUZfRU1JRl8xX0NMS0NUUkwJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DT1JFX01PRCwgMHgwNDMwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9NRU1JRl9FTUlGXzJfQ0xLQ1RSTAkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NPUkVfTU9ELCAweDA0MzgpCisjZGVmaW5lIE9NQVA0NDMwX0NNX01FTUlGX0RMTF9DTEtDVFJMCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NPUkVfTU9ELCAweDA0NDApCisjZGVmaW5lIE9NQVA0NDMwX0NNX01FTUlGX0VNSUZfSDFfQ0xLQ1RSTAkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NPUkVfTU9ELCAweDA0NTApCisjZGVmaW5lIE9NQVA0NDMwX0NNX01FTUlGX0VNSUZfSDJfQ0xLQ1RSTAkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NPUkVfTU9ELCAweDA0NTgpCisjZGVmaW5lIE9NQVA0NDMwX0NNX01FTUlGX0RMTF9IX0NMS0NUUkwJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ09SRV9NT0QsIDB4MDQ2MCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fRDJEX0NMS1NUQ1RSTAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DT1JFX01PRCwgMHgwNTAwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9EMkRfU1RBVElDREVQCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NPUkVfTU9ELCAweDA1MDQpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0QyRF9EWU5BTUlDREVQCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NPUkVfTU9ELCAweDA1MDgpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0QyRF9TQUQyRF9DTEtDVFJMCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NPUkVfTU9ELCAweDA1MjApCisjZGVmaW5lIE9NQVA0NDMwX0NNX0QyRF9NT0RFTV9JQ1JfQ0xLQ1RSTAkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NPUkVfTU9ELCAweDA1MjgpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0QyRF9TQUQyRF9GV19DTEtDVFJMCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ09SRV9NT0QsIDB4MDUzMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDRDRkdfQ0xLU1RDVFJMCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NPUkVfTU9ELCAweDA2MDApCisjZGVmaW5lIE9NQVA0NDMwX0NNX0w0Q0ZHX0RZTkFNSUNERVAJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ09SRV9NT0QsIDB4MDYwOCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDRDRkdfTDRfQ0ZHX0NMS0NUUkwJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DT1JFX01PRCwgMHgwNjIwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNENGR19IV19TRU1fQ0xLQ1RSTAkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NPUkVfTU9ELCAweDA2MjgpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0w0Q0ZHX01BSUxCT1hfQ0xLQ1RSTAkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NPUkVfTU9ELCAweDA2MzApCisjZGVmaW5lIE9NQVA0NDMwX0NNX0w0Q0ZHX1NBUl9ST01fQ0xLQ1RSTAkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NPUkVfTU9ELCAweDA2MzgpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0wzSU5TVFJfQ0xLU1RDVFJMCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NPUkVfTU9ELCAweDA3MDApCisjZGVmaW5lIE9NQVA0NDMwX0NNX0wzSU5TVFJfTDNfM19DTEtDVFJMCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ09SRV9NT0QsIDB4MDcyMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDNJTlNUUl9MM19JTlNUUl9DTEtDVFJMCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ09SRV9NT0QsIDB4MDcyOCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDNJTlNUUl9PQ1BfV1AxX0NMS0NUUkwJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9DT1JFX01PRCwgMHgwNzQwKQorCisvKiBDTTIuSVZBSERfQ00yIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ01fSVZBSERfQ0xLU1RDVFJMCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0lWQUhEX01PRCwgMHgwMDAwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9JVkFIRF9TVEFUSUNERVAJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfSVZBSERfTU9ELCAweDAwMDQpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0lWQUhEX0RZTkFNSUNERVAJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfSVZBSERfTU9ELCAweDAwMDgpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0lWQUhEX0lWQUhEX0NMS0NUUkwJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfSVZBSERfTU9ELCAweDAwMjApCisjZGVmaW5lIE9NQVA0NDMwX0NNX0lWQUhEX1NMMl9DTEtDVFJMCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0lWQUhEX01PRCwgMHgwMDI4KQorCisvKiBDTTIuQ0FNX0NNMiByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE9NQVA0NDMwX0NNX0NBTV9DTEtTVENUUkwJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ0FNX01PRCwgMHgwMDAwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9DQU1fU1RBVElDREVQCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NBTV9NT0QsIDB4MDAwNCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fQ0FNX0RZTkFNSUNERVAJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ0FNX01PRCwgMHgwMDA4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9DQU1fSVNTX0NMS0NUUkwJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ0FNX01PRCwgMHgwMDIwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9DQU1fRkRJRl9DTEtDVFJMCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NBTV9NT0QsIDB4MDAyOCkKKworLyogQ00yLkRTU19DTTIgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBPTUFQNDQzMF9DTV9EU1NfQ0xLU1RDVFJMCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0RTU19NT0QsIDB4MDAwMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fRFNTX1NUQVRJQ0RFUAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9EU1NfTU9ELCAweDAwMDQpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0RTU19EWU5BTUlDREVQCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0RTU19NT0QsIDB4MDAwOCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fRFNTX0RTU19DTEtDVFJMCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0RTU19NT0QsIDB4MDAyMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fRFNTX0RFSVNTX0NMS0NUUkwJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfRFNTX01PRCwgMHgwMDI4KQorCisvKiBDTTIuR0ZYX0NNMiByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE9NQVA0NDMwX0NNX0dGWF9DTEtTVENUUkwJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfR0ZYX01PRCwgMHgwMDAwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9HRlhfU1RBVElDREVQCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0dGWF9NT0QsIDB4MDAwNCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fR0ZYX0RZTkFNSUNERVAJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfR0ZYX01PRCwgMHgwMDA4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9HRlhfR0ZYX0NMS0NUUkwJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfR0ZYX01PRCwgMHgwMDIwKQorCisvKiBDTTIuTDNJTklUX0NNMiByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE9NQVA0NDMwX0NNX0wzSU5JVF9DTEtTVENUUkwJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfTDNJTklUX01PRCwgMHgwMDAwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9MM0lOSVRfU1RBVElDREVQCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0wzSU5JVF9NT0QsIDB4MDAwNCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDNJTklUX0RZTkFNSUNERVAJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfTDNJTklUX01PRCwgMHgwMDA4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9MM0lOSVRfTU1DMV9DTEtDVFJMCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0wzSU5JVF9NT0QsIDB4MDAyOCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDNJTklUX01NQzJfQ0xLQ1RSTAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9MM0lOSVRfTU9ELCAweDAwMzApCisjZGVmaW5lIE9NQVA0NDMwX0NNX0wzSU5JVF9IU0lfQ0xLQ1RSTAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9MM0lOSVRfTU9ELCAweDAwMzgpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0wzSU5JVF9VTklQUk8xX0NMS0NUUkwJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9MM0lOSVRfTU9ELCAweDAwNDApCisjZGVmaW5lIE9NQVA0NDMwX0NNX0wzSU5JVF9VU0JfSE9TVF9DTEtDVFJMCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfTDNJTklUX01PRCwgMHgwMDU4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9MM0lOSVRfVVNCX09UR19DTEtDVFJMCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfTDNJTklUX01PRCwgMHgwMDYwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9MM0lOSVRfVVNCX1RMTF9DTEtDVFJMCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfTDNJTklUX01PRCwgMHgwMDY4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9MM0lOSVRfUDE1MDBfQ0xLQ1RSTAkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0wzSU5JVF9NT0QsIDB4MDA3OCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDNJTklUX0VNQUNfQ0xLQ1RSTAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9MM0lOSVRfTU9ELCAweDAwODApCisjZGVmaW5lIE9NQVA0NDMwX0NNX0wzSU5JVF9TQVRBX0NMS0NUUkwJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfTDNJTklUX01PRCwgMHgwMDg4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9MM0lOSVRfVFBQU1NfQ0xLQ1RSTAkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0wzSU5JVF9NT0QsIDB4MDA5MCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDNJTklUX1BDSUVTU19DTEtDVFJMCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfTDNJTklUX01PRCwgMHgwMDk4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9MM0lOSVRfQ0NQVFhfQ0xLQ1RSTAkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0wzSU5JVF9NT0QsIDB4MDBhOCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDNJTklUX1hIUElfQ0xLQ1RSTAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9MM0lOSVRfTU9ELCAweDAwYzApCisjZGVmaW5lIE9NQVA0NDMwX0NNX0wzSU5JVF9NTUM2X0NMS0NUUkwJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfTDNJTklUX01PRCwgMHgwMGM4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9MM0lOSVRfVVNCX0hPU1RfRlNfQ0xLQ1RSTAkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0wzSU5JVF9NT0QsIDB4MDBkMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDNJTklUX1VTQlBIWU9DUDJTQ1BfQ0xLQ1RSTAlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfTDNJTklUX01PRCwgMHgwMGUwKQorCisvKiBDTTIuTDRQRVJfQ00yIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDRQRVJfQ0xLU1RDVFJMCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0w0UEVSX01PRCwgMHgwMDAwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9EWU5BTUlDREVQCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0w0UEVSX01PRCwgMHgwMDA4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9BRENfQ0xLQ1RSTAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9MNFBFUl9NT0QsIDB4MDAyMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDRQRVJfRE1USU1FUjEwX0NMS0NUUkwJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9MNFBFUl9NT0QsIDB4MDAyOCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDRQRVJfRE1USU1FUjExX0NMS0NUUkwJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9MNFBFUl9NT0QsIDB4MDAzMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDRQRVJfRE1USU1FUjJfQ0xLQ1RSTAkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0w0UEVSX01PRCwgMHgwMDM4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9ETVRJTUVSM19DTEtDVFJMCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfTDRQRVJfTU9ELCAweDAwNDApCisjZGVmaW5lIE9NQVA0NDMwX0NNX0w0UEVSX0RNVElNRVI0X0NMS0NUUkwJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9MNFBFUl9NT0QsIDB4MDA0OCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDRQRVJfRE1USU1FUjlfQ0xLQ1RSTAkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0w0UEVSX01PRCwgMHgwMDUwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9FTE1fQ0xLQ1RSTAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9MNFBFUl9NT0QsIDB4MDA1OCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDRQRVJfR1BJTzJfQ0xLQ1RSTAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9MNFBFUl9NT0QsIDB4MDA2MCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDRQRVJfR1BJTzNfQ0xLQ1RSTAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9MNFBFUl9NT0QsIDB4MDA2OCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDRQRVJfR1BJTzRfQ0xLQ1RSTAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9MNFBFUl9NT0QsIDB4MDA3MCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDRQRVJfR1BJTzVfQ0xLQ1RSTAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9MNFBFUl9NT0QsIDB4MDA3OCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDRQRVJfR1BJTzZfQ0xLQ1RSTAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9MNFBFUl9NT0QsIDB4MDA4MCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDRQRVJfSERRMVdfQ0xLQ1RSTAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9MNFBFUl9NT0QsIDB4MDA4OCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDRQRVJfSEVDQzFfQ0xLQ1RSTAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9MNFBFUl9NT0QsIDB4MDA5MCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDRQRVJfSEVDQzJfQ0xLQ1RSTAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9MNFBFUl9NT0QsIDB4MDA5OCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDRQRVJfSTJDMV9DTEtDVFJMCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0w0UEVSX01PRCwgMHgwMGEwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9JMkMyX0NMS0NUUkwJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfTDRQRVJfTU9ELCAweDAwYTgpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0w0UEVSX0kyQzNfQ0xLQ1RSTAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9MNFBFUl9NT0QsIDB4MDBiMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDRQRVJfSTJDNF9DTEtDVFJMCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0w0UEVSX01PRCwgMHgwMGI4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9MNFBFUl9DTEtDVFJMCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0w0UEVSX01PRCwgMHgwMGMwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9NQ0FTUDJfQ0xLQ1RSTAkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0w0UEVSX01PRCwgMHgwMGQwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9NQ0FTUDNfQ0xLQ1RSTAkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0w0UEVSX01PRCwgMHgwMGQ4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9NQ0JTUDRfQ0xLQ1RSTAkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0w0UEVSX01PRCwgMHgwMGUwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9NR0FURV9DTEtDVFJMCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0w0UEVSX01PRCwgMHgwMGU4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9NQ1NQSTFfQ0xLQ1RSTAkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0w0UEVSX01PRCwgMHgwMGYwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9NQ1NQSTJfQ0xLQ1RSTAkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0w0UEVSX01PRCwgMHgwMGY4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9NQ1NQSTNfQ0xLQ1RSTAkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0w0UEVSX01PRCwgMHgwMTAwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9NQ1NQSTRfQ0xLQ1RSTAkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0w0UEVSX01PRCwgMHgwMTA4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9NTUNTRDNfQ0xLQ1RSTAkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0w0UEVSX01PRCwgMHgwMTIwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9NTUNTRDRfQ0xLQ1RSTAkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0w0UEVSX01PRCwgMHgwMTI4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9NU1BST0hHX0NMS0NUUkwJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9MNFBFUl9NT0QsIDB4MDEzMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDRQRVJfU0xJTUJVUzJfQ0xLQ1RSTAkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0w0UEVSX01PRCwgMHgwMTM4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9VQVJUMV9DTEtDVFJMCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0w0UEVSX01PRCwgMHgwMTQwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9VQVJUMl9DTEtDVFJMCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0w0UEVSX01PRCwgMHgwMTQ4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9VQVJUM19DTEtDVFJMCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0w0UEVSX01PRCwgMHgwMTUwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9VQVJUNF9DTEtDVFJMCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0w0UEVSX01PRCwgMHgwMTU4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9NTUNTRDVfQ0xLQ1RSTAkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0w0UEVSX01PRCwgMHgwMTYwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9JMkM1X0NMS0NUUkwJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfTDRQRVJfTU9ELCAweDAxNjgpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0w0U0VDX0NMS1NUQ1RSTAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9MNFBFUl9NT0QsIDB4MDE4MCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDRTRUNfU1RBVElDREVQCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0w0UEVSX01PRCwgMHgwMTg0KQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFNFQ19EWU5BTUlDREVQCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0w0UEVSX01PRCwgMHgwMTg4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFNFQ19BRVMxX0NMS0NUUkwJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfTDRQRVJfTU9ELCAweDAxYTApCisjZGVmaW5lIE9NQVA0NDMwX0NNX0w0U0VDX0FFUzJfQ0xLQ1RSTAkJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9MNFBFUl9NT0QsIDB4MDFhOCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDRTRUNfREVTM0RFU19DTEtDVFJMCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfTDRQRVJfTU9ELCAweDAxYjApCisjZGVmaW5lIE9NQVA0NDMwX0NNX0w0U0VDX1BLQUVJUDI5X0NMS0NUUkwJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9MNFBFUl9NT0QsIDB4MDFiOCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDRTRUNfUk5HX0NMS0NUUkwJCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfTDRQRVJfTU9ELCAweDAxYzApCisjZGVmaW5lIE9NQVA0NDMwX0NNX0w0U0VDX1NIQTJNRDUxX0NMS0NUUkwJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9MNFBFUl9NT0QsIDB4MDFjOCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDRTRUNfQ1JZUFRPRE1BX0NMS0NUUkwJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9MNFBFUl9NT0QsIDB4MDFkOCkKKworLyogQ00yLkNFRlVTRV9DTTIgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBPTUFQNDQzMF9DTV9DRUZVU0VfQ0xLU1RDVFJMCQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX0NFRlVTRV9NT0QsIDB4MDAwMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fQ0VGVVNFX0NFRlVTRV9DTEtDVFJMCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfQ0VGVVNFX01PRCwgMHgwMDIwKQorCisvKiBDTTIuUkVTVE9SRV9DTTIgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBPTUFQNDQzMF9DTV9MM18xX0NMS1NUQ1RSTF9SRVNUT1JFCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfUkVTVE9SRV9NT0QsIDB4MDAwMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTDNfMl9DTEtTVENUUkxfUkVTVE9SRQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX1JFU1RPUkVfTU9ELCAweDAwMDQpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0w0Q0ZHX0NMS1NUQ1RSTF9SRVNUT1JFCQlPTUFQNDRYWF9DTTJfUkVHQUREUihPTUFQNDQzMF9DTTJfUkVTVE9SRV9NT0QsIDB4MDAwOCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fTUVNSUZfQ0xLU1RDVFJMX1JFU1RPUkUJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9SRVNUT1JFX01PRCwgMHgwMDBjKQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9DTEtTVENUUkxfUkVTVE9SRQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX1JFU1RPUkVfTU9ELCAweDAwMTApCisjZGVmaW5lIE9NQVA0NDMwX0NNX0wzSU5JVF9DTEtTVENUUkxfUkVTVE9SRQkJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX1JFU1RPUkVfTU9ELCAweDAwMTQpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0wzSU5TVFJfTDNfM19DTEtDVFJMX1JFU1RPUkUJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX1JFU1RPUkVfTU9ELCAweDAwMTgpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0wzSU5TVFJfTDNfSU5TVFJfQ0xLQ1RSTF9SRVNUT1JFCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9SRVNUT1JFX01PRCwgMHgwMDFjKQorI2RlZmluZSBPTUFQNDQzMF9DTV9MM0lOU1RSX09DUF9XUDFfQ0xLQ1RSTF9SRVNUT1JFCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9SRVNUT1JFX01PRCwgMHgwMDIwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9HUElPMl9DTEtDVFJMX1JFU1RPUkUJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9SRVNUT1JFX01PRCwgMHgwMDI0KQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9HUElPM19DTEtDVFJMX1JFU1RPUkUJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9SRVNUT1JFX01PRCwgMHgwMDI4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9HUElPNF9DTEtDVFJMX1JFU1RPUkUJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9SRVNUT1JFX01PRCwgMHgwMDJjKQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9HUElPNV9DTEtDVFJMX1JFU1RPUkUJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9SRVNUT1JFX01PRCwgMHgwMDMwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9MNFBFUl9HUElPNl9DTEtDVFJMX1JFU1RPUkUJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9SRVNUT1JFX01PRCwgMHgwMDM0KQorI2RlZmluZSBPTUFQNDQzMF9DTV9MM0lOSVRfVVNCX0hPU1RfQ0xLQ1RSTF9SRVNUT1JFCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9SRVNUT1JFX01PRCwgMHgwMDM4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9MM0lOSVRfVVNCX1RMTF9DTEtDVFJMX1JFU1RPUkUJT01BUDQ0WFhfQ00yX1JFR0FERFIoT01BUDQ0MzBfQ00yX1JFU1RPUkVfTU9ELCAweDAwM2MpCisjZGVmaW5lIE9NQVA0NDMwX0NNX1NETUFfU1RBVElDREVQX1JFU1RPUkUJCU9NQVA0NFhYX0NNMl9SRUdBRERSKE9NQVA0NDMwX0NNMl9SRVNUT1JFX01PRCwgMHgwMDQwKQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZGV2aWNlcy5jCmluZGV4IDczM2QzZGMuLjE4YWQ5MzE2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2RldmljZXMuYwpAQCAtMjcsNiArMjcsOCBAQAogI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPHBsYXQvbW1jLmg+CiAKKyNpbmNsdWRlICJtdXguaCIKKwogI2lmIGRlZmluZWQoQ09ORklHX1ZJREVPX09NQVAyKSB8fCBkZWZpbmVkKENPTkZJR19WSURFT19PTUFQMl9NT0RVTEUpCiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY2FtX3Jlc291cmNlc1tdID0gewpAQCAtNTk1LDI3ICs1OTcsNDAgQEAKIAogCWlmIChjcHVfaXNfb21hcDM0eHgoKSkgewogCQlpZiAoY29udHJvbGxlcl9uciA9PSAwKSB7Ci0JCQlvbWFwX2NmZ19yZWcoTjI4XzM0MzBfTU1DMV9DTEspOwotCQkJb21hcF9jZmdfcmVnKE0yN18zNDMwX01NQzFfQ01EKTsKLQkJCW9tYXBfY2ZnX3JlZyhOMjdfMzQzMF9NTUMxX0RBVDApOworCQkJb21hcF9tdXhfaW5pdF9zaWduYWwoInNkbW1jMV9jbGsiLAorCQkJCU9NQVBfUElOX0lOUFVUX1BVTExVUCk7CisJCQlvbWFwX211eF9pbml0X3NpZ25hbCgic2RtbWMxX2NtZCIsCisJCQkJT01BUF9QSU5fSU5QVVRfUFVMTFVQKTsKKwkJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJzZG1tYzFfZGF0MCIsCisJCQkJT01BUF9QSU5fSU5QVVRfUFVMTFVQKTsKIAkJCWlmIChtbWNfY29udHJvbGxlci0+c2xvdHNbMF0ud2lyZXMgPT0gNCB8fAogCQkJCW1tY19jb250cm9sbGVyLT5zbG90c1swXS53aXJlcyA9PSA4KSB7Ci0JCQkJb21hcF9jZmdfcmVnKE4yNl8zNDMwX01NQzFfREFUMSk7Ci0JCQkJb21hcF9jZmdfcmVnKE4yNV8zNDMwX01NQzFfREFUMik7Ci0JCQkJb21hcF9jZmdfcmVnKFAyOF8zNDMwX01NQzFfREFUMyk7CisJCQkJb21hcF9tdXhfaW5pdF9zaWduYWwoInNkbW1jMV9kYXQxIiwKKwkJCQkJT01BUF9QSU5fSU5QVVRfUFVMTFVQKTsKKwkJCQlvbWFwX211eF9pbml0X3NpZ25hbCgic2RtbWMxX2RhdDIiLAorCQkJCQlPTUFQX1BJTl9JTlBVVF9QVUxMVVApOworCQkJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJzZG1tYzFfZGF0MyIsCisJCQkJCU9NQVBfUElOX0lOUFVUX1BVTExVUCk7CiAJCQl9CiAJCQlpZiAobW1jX2NvbnRyb2xsZXItPnNsb3RzWzBdLndpcmVzID09IDgpIHsKLQkJCQlvbWFwX2NmZ19yZWcoUDI3XzM0MzBfTU1DMV9EQVQ0KTsKLQkJCQlvbWFwX2NmZ19yZWcoUDI2XzM0MzBfTU1DMV9EQVQ1KTsKLQkJCQlvbWFwX2NmZ19yZWcoUjI3XzM0MzBfTU1DMV9EQVQ2KTsKLQkJCQlvbWFwX2NmZ19yZWcoUjI1XzM0MzBfTU1DMV9EQVQ3KTsKKwkJCQlvbWFwX211eF9pbml0X3NpZ25hbCgic2RtbWMxX2RhdDQiLAorCQkJCQlPTUFQX1BJTl9JTlBVVF9QVUxMVVApOworCQkJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJzZG1tYzFfZGF0NSIsCisJCQkJCU9NQVBfUElOX0lOUFVUX1BVTExVUCk7CisJCQkJb21hcF9tdXhfaW5pdF9zaWduYWwoInNkbW1jMV9kYXQ2IiwKKwkJCQkJT01BUF9QSU5fSU5QVVRfUFVMTFVQKTsKKwkJCQlvbWFwX211eF9pbml0X3NpZ25hbCgic2RtbWMxX2RhdDciLAorCQkJCQlPTUFQX1BJTl9JTlBVVF9QVUxMVVApOwogCQkJfQogCQl9CiAJCWlmIChjb250cm9sbGVyX25yID09IDEpIHsKIAkJCS8qIE1NQzIgKi8KLQkJCW9tYXBfY2ZnX3JlZyhBRTJfMzQzMF9NTUMyX0NMSyk7Ci0JCQlvbWFwX2NmZ19yZWcoQUc1XzM0MzBfTU1DMl9DTUQpOwotCQkJb21hcF9jZmdfcmVnKEFINV8zNDMwX01NQzJfREFUMCk7CisJCQlvbWFwX211eF9pbml0X3NpZ25hbCgic2RtbWMyX2NsayIsCisJCQkJT01BUF9QSU5fSU5QVVRfUFVMTFVQKTsKKwkJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJzZG1tYzJfY21kIiwKKwkJCQlPTUFQX1BJTl9JTlBVVF9QVUxMVVApOworCQkJb21hcF9tdXhfaW5pdF9zaWduYWwoInNkbW1jMl9kYXQwIiwKKwkJCQlPTUFQX1BJTl9JTlBVVF9QVUxMVVApOwogCiAJCQkvKgogCQkJICogRm9yIDggd2lyZSBjb25maWd1cmF0aW9ucywgTGluZXMgREFUNCwgNSwgNiBhbmQgNyBuZWVkIHRvIGJlIG11eGVkCkBAIC02MjMsMTUgKzYzOCwyMiBAQAogCQkJICovCiAJCQlpZiAobW1jX2NvbnRyb2xsZXItPnNsb3RzWzBdLndpcmVzID09IDQgfHwKIAkJCQltbWNfY29udHJvbGxlci0+c2xvdHNbMF0ud2lyZXMgPT0gOCkgewotCQkJCW9tYXBfY2ZnX3JlZyhBSDRfMzQzMF9NTUMyX0RBVDEpOwotCQkJCW9tYXBfY2ZnX3JlZyhBRzRfMzQzMF9NTUMyX0RBVDIpOwotCQkJCW9tYXBfY2ZnX3JlZyhBRjRfMzQzMF9NTUMyX0RBVDMpOworCQkJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJzZG1tYzJfZGF0MSIsCisJCQkJCU9NQVBfUElOX0lOUFVUX1BVTExVUCk7CisJCQkJb21hcF9tdXhfaW5pdF9zaWduYWwoInNkbW1jMl9kYXQyIiwKKwkJCQkJT01BUF9QSU5fSU5QVVRfUFVMTFVQKTsKKwkJCQlvbWFwX211eF9pbml0X3NpZ25hbCgic2RtbWMyX2RhdDMiLAorCQkJCQlPTUFQX1BJTl9JTlBVVF9QVUxMVVApOwogCQkJfQogCQkJaWYgKG1tY19jb250cm9sbGVyLT5zbG90c1swXS53aXJlcyA9PSA4KSB7Ci0JCQkJb21hcF9jZmdfcmVnKEFFNF8zNDMwX01NQzJfREFUNCk7Ci0JCQkJb21hcF9jZmdfcmVnKEFIM18zNDMwX01NQzJfREFUNSk7Ci0JCQkJb21hcF9jZmdfcmVnKEFGM18zNDMwX01NQzJfREFUNik7Ci0JCQkJb21hcF9jZmdfcmVnKEFFM18zNDMwX01NQzJfREFUNyk7CisJCQkJb21hcF9tdXhfaW5pdF9zaWduYWwoInNkbW1jMl9kYXQ0LnNkbW1jMl9kYXQ0IiwKKwkJCQkJT01BUF9QSU5fSU5QVVRfUFVMTFVQKTsKKwkJCQlvbWFwX211eF9pbml0X3NpZ25hbCgic2RtbWMyX2RhdDUuc2RtbWMyX2RhdDUiLAorCQkJCQlPTUFQX1BJTl9JTlBVVF9QVUxMVVApOworCQkJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJzZG1tYzJfZGF0Ni5zZG1tYzJfZGF0NiIsCisJCQkJCU9NQVBfUElOX0lOUFVUX1BVTExVUCk7CisJCQkJb21hcF9tdXhfaW5pdF9zaWduYWwoInNkbW1jMl9kYXQ3LnNkbW1jMl9kYXQ3IiwKKwkJCQkJT01BUF9QSU5fSU5QVVRfUFVMTFVQKTsKIAkJCX0KIAkJfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2RwbGwuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZHBsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MDU1YjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2RwbGwuYwpAQCAtMCwwICsxLDUzOCBAQAorLyoKKyAqIE9NQVAzLzQgLSBzcGVjaWZpYyBEUExMIGNvbnRyb2wgZnVuY3Rpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBXcml0dGVuIGJ5IFBhdWwgV2FsbXNsZXkKKyAqIFRlc3RpbmcgYW5kIGludGVncmF0aW9uIGZpeGVzIGJ5IEpvdW5pIEjDg8K2Z2FuZGVyCisgKgorICogUGFydHMgb2YgdGhpcyBjb2RlIGFyZSBiYXNlZCBvbiBjb2RlIHdyaXR0ZW4gYnkKKyAqIFJpY2hhcmQgV29vZHJ1ZmYsIFRvbnkgTGluZGdyZW4sIFR1dWtrYSBUaWtrYW5lbiwgS2FydGhpayBEYXN1CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CisjaW5jbHVkZSA8cGxhdC9zcmFtLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisjaW5jbHVkZSA8YXNtL2Nsa2Rldi5oPgorCisjaW5jbHVkZSAiY2xvY2suaCIKKyNpbmNsdWRlICJwcm0uaCIKKyNpbmNsdWRlICJwcm0tcmVnYml0cy0zNHh4LmgiCisjaW5jbHVkZSAiY20uaCIKKyNpbmNsdWRlICJjbS1yZWdiaXRzLTM0eHguaCIKKworLyogQ01fQVVUT0lETEVfUExMKi5BVVRPXyogYml0IHZhbHVlcyAqLworI2RlZmluZSBEUExMX0FVVE9JRExFX0RJU0FCTEUJCQkweDAKKyNkZWZpbmUgRFBMTF9BVVRPSURMRV9MT1dfUE9XRVJfU1RPUAkJMHgxCisKKyNkZWZpbmUgTUFYX0RQTExfV0FJVF9UUklFUwkJMTAwMDAwMAorCisKKy8qKgorICogb21hcDNfZHBsbF9yZWNhbGMgLSByZWNhbGN1bGF0ZSBEUExMIHJhdGUKKyAqIEBjbGs6IERQTEwgc3RydWN0IGNsaworICoKKyAqIFJlY2FsY3VsYXRlIGFuZCBwcm9wYWdhdGUgdGhlIERQTEwgcmF0ZS4KKyAqLwordW5zaWduZWQgbG9uZyBvbWFwM19kcGxsX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIG9tYXAyX2dldF9kcGxsX3JhdGUoY2xrKTsKK30KKworLyogX29tYXAzX2RwbGxfd3JpdGVfY2xrZW4gLSB3cml0ZSBjbGtlbl9iaXRzIGFyZyB0byBhIERQTEwncyBlbmFibGUgYml0cyAqLworc3RhdGljIHZvaWQgX29tYXAzX2RwbGxfd3JpdGVfY2xrZW4oc3RydWN0IGNsayAqY2xrLCB1OCBjbGtlbl9iaXRzKQoreworCWNvbnN0IHN0cnVjdCBkcGxsX2RhdGEgKmRkOworCXUzMiB2OworCisJZGQgPSBjbGstPmRwbGxfZGF0YTsKKworCXYgPSBfX3Jhd19yZWFkbChkZC0+Y29udHJvbF9yZWcpOworCXYgJj0gfmRkLT5lbmFibGVfbWFzazsKKwl2IHw9IGNsa2VuX2JpdHMgPDwgX19mZnMoZGQtPmVuYWJsZV9tYXNrKTsKKwlfX3Jhd193cml0ZWwodiwgZGQtPmNvbnRyb2xfcmVnKTsKK30KKworLyogX29tYXAzX3dhaXRfZHBsbF9zdGF0dXM6IHdhaXQgZm9yIGEgRFBMTCB0byBlbnRlciBhIHNwZWNpZmljIHN0YXRlICovCitzdGF0aWMgaW50IF9vbWFwM193YWl0X2RwbGxfc3RhdHVzKHN0cnVjdCBjbGsgKmNsaywgdTggc3RhdGUpCit7CisJY29uc3Qgc3RydWN0IGRwbGxfZGF0YSAqZGQ7CisJaW50IGkgPSAwOworCWludCByZXQgPSAtRUlOVkFMOworCisJZGQgPSBjbGstPmRwbGxfZGF0YTsKKworCXN0YXRlIDw8PSBfX2ZmcyhkZC0+aWRsZXN0X21hc2spOworCisJd2hpbGUgKCgoX19yYXdfcmVhZGwoZGQtPmlkbGVzdF9yZWcpICYgZGQtPmlkbGVzdF9tYXNrKSAhPSBzdGF0ZSkgJiYKKwkgICAgICAgaSA8IE1BWF9EUExMX1dBSVRfVFJJRVMpIHsKKwkJaSsrOworCQl1ZGVsYXkoMSk7CisJfQorCisJaWYgKGkgPT0gTUFYX0RQTExfV0FJVF9UUklFUykgeworCQlwcmludGsoS0VSTl9FUlIgImNsb2NrOiAlcyBmYWlsZWQgdHJhbnNpdGlvbiB0byAnJXMnXG4iLAorCQkgICAgICAgY2xrLT5uYW1lLCAoc3RhdGUpID8gImxvY2tlZCIgOiAiYnlwYXNzZWQiKTsKKwl9IGVsc2UgeworCQlwcl9kZWJ1ZygiY2xvY2s6ICVzIHRyYW5zaXRpb24gdG8gJyVzJyBpbiAlZCBsb29wc1xuIiwKKwkJCSBjbGstPm5hbWUsIChzdGF0ZSkgPyAibG9ja2VkIiA6ICJieXBhc3NlZCIsIGkpOworCisJCXJldCA9IDA7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogRnJvbSAzNDMwIFRSTSBFUzIgNC43LjYuMiAqLworc3RhdGljIHUxNiBfb21hcDNfZHBsbF9jb21wdXRlX2ZyZXFzZWwoc3RydWN0IGNsayAqY2xrLCB1OCBuKQoreworCXVuc2lnbmVkIGxvbmcgZmludDsKKwl1MTYgZiA9IDA7CisKKwlmaW50ID0gY2xrLT5kcGxsX2RhdGEtPmNsa19yZWYtPnJhdGUgLyBuOworCisJcHJfZGVidWcoImNsb2NrOiBmaW50IGlzICVsdVxuIiwgZmludCk7CisKKwlpZiAoZmludCA+PSA3NTAwMDAgJiYgZmludCA8PSAxMDAwMDAwKQorCQlmID0gMHgzOworCWVsc2UgaWYgKGZpbnQgPiAxMDAwMDAwICYmIGZpbnQgPD0gMTI1MDAwMCkKKwkJZiA9IDB4NDsKKwllbHNlIGlmIChmaW50ID4gMTI1MDAwMCAmJiBmaW50IDw9IDE1MDAwMDApCisJCWYgPSAweDU7CisJZWxzZSBpZiAoZmludCA+IDE1MDAwMDAgJiYgZmludCA8PSAxNzUwMDAwKQorCQlmID0gMHg2OworCWVsc2UgaWYgKGZpbnQgPiAxNzUwMDAwICYmIGZpbnQgPD0gMjEwMDAwMCkKKwkJZiA9IDB4NzsKKwllbHNlIGlmIChmaW50ID4gNzUwMDAwMCAmJiBmaW50IDw9IDEwMDAwMDAwKQorCQlmID0gMHhCOworCWVsc2UgaWYgKGZpbnQgPiAxMDAwMDAwMCAmJiBmaW50IDw9IDEyNTAwMDAwKQorCQlmID0gMHhDOworCWVsc2UgaWYgKGZpbnQgPiAxMjUwMDAwMCAmJiBmaW50IDw9IDE1MDAwMDAwKQorCQlmID0gMHhEOworCWVsc2UgaWYgKGZpbnQgPiAxNTAwMDAwMCAmJiBmaW50IDw9IDE3NTAwMDAwKQorCQlmID0gMHhFOworCWVsc2UgaWYgKGZpbnQgPiAxNzUwMDAwMCAmJiBmaW50IDw9IDIxMDAwMDAwKQorCQlmID0gMHhGOworCWVsc2UKKwkJcHJfZGVidWcoImNsb2NrOiB1bmtub3duIGZyZXFzZWwgc2V0dGluZyBmb3IgJWRcbiIsIG4pOworCisJcmV0dXJuIGY7Cit9CisKKy8qIE5vbi1DT1JFIERQTEwgKGUuZy4sIERQTExzIHRoYXQgZG8gbm90IGNvbnRyb2wgU0RSQykgY2xvY2sgZnVuY3Rpb25zICovCisKKy8qCisgKiBfb21hcDNfbm9uY29yZV9kcGxsX2xvY2sgLSBpbnN0cnVjdCBhIERQTEwgdG8gbG9jayBhbmQgd2FpdCBmb3IgcmVhZGluZXNzCisgKiBAY2xrOiBwb2ludGVyIHRvIGEgRFBMTCBzdHJ1Y3QgY2xrCisgKgorICogSW5zdHJ1Y3RzIGEgbm9uLUNPUkUgRFBMTCB0byBsb2NrLiAgV2FpdHMgZm9yIHRoZSBEUExMIHRvIHJlcG9ydAorICogcmVhZGluZXNzIGJlZm9yZSByZXR1cm5pbmcuICBXaWxsIHNhdmUgYW5kIHJlc3RvcmUgdGhlIERQTEwncworICogYXV0b2lkbGUgc3RhdGUgYWNyb3NzIHRoZSBlbmFibGUsIHBlciB0aGUgQ0RQIGNvZGUuICBJZiB0aGUgRFBMTAorICogbG9ja2VkIHN1Y2Nlc3NmdWxseSwgcmV0dXJuIDA7IGlmIHRoZSBEUExMIGRpZCBub3QgbG9jayBpbiB0aGUgdGltZQorICogYWxsb3R0ZWQsIG9yIERQTEwzIHdhcyBwYXNzZWQgaW4sIHJldHVybiAtRUlOVkFMLgorICovCitzdGF0aWMgaW50IF9vbWFwM19ub25jb3JlX2RwbGxfbG9jayhzdHJ1Y3QgY2xrICpjbGspCit7CisJdTggYWk7CisJaW50IHI7CisKKwlwcl9kZWJ1ZygiY2xvY2s6IGxvY2tpbmcgRFBMTCAlc1xuIiwgY2xrLT5uYW1lKTsKKworCWFpID0gb21hcDNfZHBsbF9hdXRvaWRsZV9yZWFkKGNsayk7CisKKwlvbWFwM19kcGxsX2RlbnlfaWRsZShjbGspOworCisJX29tYXAzX2RwbGxfd3JpdGVfY2xrZW4oY2xrLCBEUExMX0xPQ0tFRCk7CisKKwlyID0gX29tYXAzX3dhaXRfZHBsbF9zdGF0dXMoY2xrLCAxKTsKKworCWlmIChhaSkKKwkJb21hcDNfZHBsbF9hbGxvd19pZGxlKGNsayk7CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIF9vbWFwM19ub25jb3JlX2RwbGxfYnlwYXNzIC0gaW5zdHJ1Y3QgYSBEUExMIHRvIGJ5cGFzcyBhbmQgd2FpdCBmb3IgcmVhZGluZXNzCisgKiBAY2xrOiBwb2ludGVyIHRvIGEgRFBMTCBzdHJ1Y3QgY2xrCisgKgorICogSW5zdHJ1Y3RzIGEgbm9uLUNPUkUgRFBMTCB0byBlbnRlciBsb3ctcG93ZXIgYnlwYXNzIG1vZGUuICBJbgorICogYnlwYXNzIG1vZGUsIHRoZSBEUExMJ3MgcmF0ZSBpcyBzZXQgZXF1YWwgdG8gaXRzIHBhcmVudCBjbG9jaydzCisgKiByYXRlLiAgV2FpdHMgZm9yIHRoZSBEUExMIHRvIHJlcG9ydCByZWFkaW5lc3MgYmVmb3JlIHJldHVybmluZy4KKyAqIFdpbGwgc2F2ZSBhbmQgcmVzdG9yZSB0aGUgRFBMTCdzIGF1dG9pZGxlIHN0YXRlIGFjcm9zcyB0aGUgZW5hYmxlLAorICogcGVyIHRoZSBDRFAgY29kZS4gIElmIHRoZSBEUExMIGVudGVyZWQgYnlwYXNzIG1vZGUgc3VjY2Vzc2Z1bGx5LAorICogcmV0dXJuIDA7IGlmIHRoZSBEUExMIGRpZCBub3QgZW50ZXIgYnlwYXNzIGluIHRoZSB0aW1lIGFsbG90dGVkLCBvcgorICogRFBMTDMgd2FzIHBhc3NlZCBpbiwgb3IgdGhlIERQTEwgZG9lcyBub3Qgc3VwcG9ydCBsb3ctcG93ZXIgYnlwYXNzLAorICogcmV0dXJuIC1FSU5WQUwuCisgKi8KK3N0YXRpYyBpbnQgX29tYXAzX25vbmNvcmVfZHBsbF9ieXBhc3Moc3RydWN0IGNsayAqY2xrKQoreworCWludCByOworCXU4IGFpOworCisJaWYgKCEoY2xrLT5kcGxsX2RhdGEtPm1vZGVzICYgKDEgPDwgRFBMTF9MT1dfUE9XRVJfQllQQVNTKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcHJfZGVidWcoImNsb2NrOiBjb25maWd1cmluZyBEUExMICVzIGZvciBsb3ctcG93ZXIgYnlwYXNzXG4iLAorCQkgY2xrLT5uYW1lKTsKKworCWFpID0gb21hcDNfZHBsbF9hdXRvaWRsZV9yZWFkKGNsayk7CisKKwlfb21hcDNfZHBsbF93cml0ZV9jbGtlbihjbGssIERQTExfTE9XX1BPV0VSX0JZUEFTUyk7CisKKwlyID0gX29tYXAzX3dhaXRfZHBsbF9zdGF0dXMoY2xrLCAwKTsKKworCWlmIChhaSkKKwkJb21hcDNfZHBsbF9hbGxvd19pZGxlKGNsayk7CisJZWxzZQorCQlvbWFwM19kcGxsX2RlbnlfaWRsZShjbGspOworCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBfb21hcDNfbm9uY29yZV9kcGxsX3N0b3AgLSBpbnN0cnVjdCBhIERQTEwgdG8gc3RvcAorICogQGNsazogcG9pbnRlciB0byBhIERQTEwgc3RydWN0IGNsaworICoKKyAqIEluc3RydWN0cyBhIG5vbi1DT1JFIERQTEwgdG8gZW50ZXIgbG93LXBvd2VyIHN0b3AuIFdpbGwgc2F2ZSBhbmQKKyAqIHJlc3RvcmUgdGhlIERQTEwncyBhdXRvaWRsZSBzdGF0ZSBhY3Jvc3MgdGhlIHN0b3AsIHBlciB0aGUgQ0RQCisgKiBjb2RlLiAgSWYgRFBMTDMgd2FzIHBhc3NlZCBpbiwgb3IgdGhlIERQTEwgZG9lcyBub3Qgc3VwcG9ydAorICogbG93LXBvd2VyIHN0b3AsIHJldHVybiAtRUlOVkFMOyBvdGhlcndpc2UsIHJldHVybiAwLgorICovCitzdGF0aWMgaW50IF9vbWFwM19ub25jb3JlX2RwbGxfc3RvcChzdHJ1Y3QgY2xrICpjbGspCit7CisJdTggYWk7CisKKwlpZiAoIShjbGstPmRwbGxfZGF0YS0+bW9kZXMgJiAoMSA8PCBEUExMX0xPV19QT1dFUl9TVE9QKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcHJfZGVidWcoImNsb2NrOiBzdG9wcGluZyBEUExMICVzXG4iLCBjbGstPm5hbWUpOworCisJYWkgPSBvbWFwM19kcGxsX2F1dG9pZGxlX3JlYWQoY2xrKTsKKworCV9vbWFwM19kcGxsX3dyaXRlX2Nsa2VuKGNsaywgRFBMTF9MT1dfUE9XRVJfU1RPUCk7CisKKwlpZiAoYWkpCisJCW9tYXAzX2RwbGxfYWxsb3dfaWRsZShjbGspOworCWVsc2UKKwkJb21hcDNfZHBsbF9kZW55X2lkbGUoY2xrKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIG9tYXAzX25vbmNvcmVfZHBsbF9lbmFibGUgLSBpbnN0cnVjdCBhIERQTEwgdG8gZW50ZXIgYnlwYXNzIG9yIGxvY2sgbW9kZQorICogQGNsazogcG9pbnRlciB0byBhIERQTEwgc3RydWN0IGNsaworICoKKyAqIEluc3RydWN0cyBhIG5vbi1DT1JFIERQTEwgdG8gZW5hYmxlLCBlLmcuLCB0byBlbnRlciBieXBhc3Mgb3IgbG9jay4KKyAqIFRoZSBjaG9pY2Ugb2YgbW9kZXMgZGVwZW5kcyBvbiB0aGUgRFBMTCdzIHByb2dyYW1tZWQgcmF0ZTogaWYgaXQgaXMKKyAqIHRoZSBzYW1lIGFzIHRoZSBEUExMJ3MgcGFyZW50IGNsb2NrLCBpdCB3aWxsIGVudGVyIGJ5cGFzczsKKyAqIG90aGVyd2lzZSwgaXQgd2lsbCBlbnRlciBsb2NrLiAgVGhpcyBjb2RlIHdpbGwgd2FpdCBmb3IgdGhlIERQTEwgdG8KKyAqIGluZGljYXRlIHJlYWRpbmVzcyBiZWZvcmUgcmV0dXJuaW5nLCB1bmxlc3MgdGhlIERQTEwgdGFrZXMgdG9vIGxvbmcKKyAqIHRvIGVudGVyIHRoZSB0YXJnZXQgc3RhdGUuICBJbnRlbmRlZCB0byBiZSB1c2VkIGFzIHRoZSBzdHJ1Y3QgY2xrJ3MKKyAqIGVuYWJsZSBmdW5jdGlvbi4gIElmIERQTEwzIHdhcyBwYXNzZWQgaW4sIG9yIHRoZSBEUExMIGRvZXMgbm90CisgKiBzdXBwb3J0IGxvdy1wb3dlciBzdG9wLCBvciBpZiB0aGUgRFBMTCB0b29rIHRvbyBsb25nIHRvIGVudGVyCisgKiBieXBhc3Mgb3IgbG9jaywgcmV0dXJuIC1FSU5WQUw7IG90aGVyd2lzZSwgcmV0dXJuIDAuCisgKi8KK2ludCBvbWFwM19ub25jb3JlX2RwbGxfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgZHBsbF9kYXRhICpkZDsKKworCWRkID0gY2xrLT5kcGxsX2RhdGE7CisJaWYgKCFkZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY2xrLT5yYXRlID09IGRkLT5jbGtfYnlwYXNzLT5yYXRlKSB7CisJCVdBUk5fT04oY2xrLT5wYXJlbnQgIT0gZGQtPmNsa19ieXBhc3MpOworCQlyID0gX29tYXAzX25vbmNvcmVfZHBsbF9ieXBhc3MoY2xrKTsKKwl9IGVsc2UgeworCQlXQVJOX09OKGNsay0+cGFyZW50ICE9IGRkLT5jbGtfcmVmKTsKKwkJciA9IF9vbWFwM19ub25jb3JlX2RwbGxfbG9jayhjbGspOworCX0KKwkvKgorCSAqRklYTUU6IHRoaXMgaXMgZHViaW91cyAtIGlmIGNsay0+cmF0ZSBoYXMgY2hhbmdlZCwgd2hhdCBhYm91dAorCSAqIHByb3BhZ2F0aW5nPworCSAqLworCWlmICghcikKKwkJY2xrLT5yYXRlID0gb21hcDJfZ2V0X2RwbGxfcmF0ZShjbGspOworCisJcmV0dXJuIHI7Cit9CisKKy8qKgorICogb21hcDNfbm9uY29yZV9kcGxsX2Rpc2FibGUgLSBpbnN0cnVjdCBhIERQTEwgdG8gZW50ZXIgbG93LXBvd2VyIHN0b3AKKyAqIEBjbGs6IHBvaW50ZXIgdG8gYSBEUExMIHN0cnVjdCBjbGsKKyAqCisgKiBJbnN0cnVjdHMgYSBub24tQ09SRSBEUExMIHRvIGVudGVyIGxvdy1wb3dlciBzdG9wLiAgVGhpcyBmdW5jdGlvbiBpcworICogaW50ZW5kZWQgZm9yIHVzZSBpbiBzdHJ1Y3QgY2xrb3BzLiAgTm8gcmV0dXJuIHZhbHVlLgorICovCit2b2lkIG9tYXAzX25vbmNvcmVfZHBsbF9kaXNhYmxlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlfb21hcDNfbm9uY29yZV9kcGxsX3N0b3AoY2xrKTsKK30KKworCisvKiBOb24tQ09SRSBEUExMIHJhdGUgc2V0IGNvZGUgKi8KKworLyoKKyAqIG9tYXAzX25vbmNvcmVfZHBsbF9wcm9ncmFtIC0gc2V0IG5vbi1jb3JlIERQTEwgTSxOIHZhbHVlcyBkaXJlY3RseQorICogQGNsazogc3RydWN0IGNsayAqIG9mIERQTEwgdG8gc2V0CisgKiBAbTogRFBMTCBtdWx0aXBsaWVyIHRvIHNldAorICogQG46IERQTEwgZGl2aWRlciB0byBzZXQKKyAqIEBmcmVxc2VsOiBGUkVRU0VMIHZhbHVlIHRvIHNldAorICoKKyAqIFByb2dyYW0gdGhlIERQTEwgd2l0aCB0aGUgc3VwcGxpZWQgTSwgTiB2YWx1ZXMsIGFuZCB3YWl0IGZvciB0aGUgRFBMTCB0bworICogbG9jay4uICBSZXR1cm5zIC1FSU5WQUwgdXBvbiBlcnJvciwgb3IgMCB1cG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBvbWFwM19ub25jb3JlX2RwbGxfcHJvZ3JhbShzdHJ1Y3QgY2xrICpjbGssIHUxNiBtLCB1OCBuLCB1MTYgZnJlcXNlbCkKK3sKKwlzdHJ1Y3QgZHBsbF9kYXRhICpkZCA9IGNsay0+ZHBsbF9kYXRhOworCXUzMiB2OworCisJLyogMzQzMCBFUzIgVFJNOiA0LjcuNi45IERQTEwgUHJvZ3JhbW1pbmcgU2VxdWVuY2UgKi8KKwlfb21hcDNfbm9uY29yZV9kcGxsX2J5cGFzcyhjbGspOworCisJLyogU2V0IGppdHRlciBjb3JyZWN0aW9uICovCisJaWYgKCFjcHVfaXNfb21hcDQ0eHgoKSkgeworCQl2ID0gX19yYXdfcmVhZGwoZGQtPmNvbnRyb2xfcmVnKTsKKwkJdiAmPSB+ZGQtPmZyZXFzZWxfbWFzazsKKwkJdiB8PSBmcmVxc2VsIDw8IF9fZmZzKGRkLT5mcmVxc2VsX21hc2spOworCQlfX3Jhd193cml0ZWwodiwgZGQtPmNvbnRyb2xfcmVnKTsKKwl9CisKKwkvKiBTZXQgRFBMTCBtdWx0aXBsaWVyLCBkaXZpZGVyICovCisJdiA9IF9fcmF3X3JlYWRsKGRkLT5tdWx0X2RpdjFfcmVnKTsKKwl2ICY9IH4oZGQtPm11bHRfbWFzayB8IGRkLT5kaXYxX21hc2spOworCXYgfD0gbSA8PCBfX2ZmcyhkZC0+bXVsdF9tYXNrKTsKKwl2IHw9IChuIC0gMSkgPDwgX19mZnMoZGQtPmRpdjFfbWFzayk7CisJX19yYXdfd3JpdGVsKHYsIGRkLT5tdWx0X2RpdjFfcmVnKTsKKworCS8qIFdlIGxldCB0aGUgY2xvY2sgZnJhbWV3b3JrIHNldCB0aGUgb3RoZXIgb3V0cHV0IGRpdmlkZXJzIGxhdGVyICovCisKKwkvKiBSRVZJU0lUOiBTZXQgcmFtcC11cCBkZWxheT8gKi8KKworCV9vbWFwM19ub25jb3JlX2RwbGxfbG9jayhjbGspOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogb21hcDNfbm9uY29yZV9kcGxsX3NldF9yYXRlIC0gc2V0IG5vbi1jb3JlIERQTEwgcmF0ZQorICogQGNsazogc3RydWN0IGNsayAqIG9mIERQTEwgdG8gc2V0CisgKiBAcmF0ZTogcm91bmRlZCB0YXJnZXQgcmF0ZQorICoKKyAqIFNldCB0aGUgRFBMTCBDTEtPVVQgdG8gdGhlIHRhcmdldCByYXRlLiAgSWYgdGhlIERQTEwgY2FuIGVudGVyCisgKiBsb3ctcG93ZXIgYnlwYXNzLCBhbmQgdGhlIHRhcmdldCByYXRlIGlzIHRoZSBieXBhc3Mgc291cmNlIGNsb2NrCisgKiByYXRlLCB0aGVuIGNvbmZpZ3VyZSB0aGUgRFBMTCBmb3IgYnlwYXNzLiAgT3RoZXJ3aXNlLCByb3VuZCB0aGUKKyAqIHRhcmdldCByYXRlIGlmIGl0IGhhc24ndCBiZWVuIGRvbmUgYWxyZWFkeSwgdGhlbiBwcm9ncmFtIGFuZCBsb2NrCisgKiB0aGUgRFBMTC4gIFJldHVybnMgLUVJTlZBTCB1cG9uIGVycm9yLCBvciAwIHVwb24gc3VjY2Vzcy4KKyAqLworaW50IG9tYXAzX25vbmNvcmVfZHBsbF9zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwlzdHJ1Y3QgY2xrICpuZXdfcGFyZW50ID0gTlVMTDsKKwl1MTYgZnJlcXNlbCA9IDA7CisJc3RydWN0IGRwbGxfZGF0YSAqZGQ7CisJaW50IHJldDsKKworCWlmICghY2xrIHx8ICFyYXRlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRkID0gY2xrLT5kcGxsX2RhdGE7CisJaWYgKCFkZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocmF0ZSA9PSBvbWFwMl9nZXRfZHBsbF9yYXRlKGNsaykpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBFbnN1cmUgYm90aCB0aGUgYnlwYXNzIGFuZCByZWYgY2xvY2tzIGFyZSBlbmFibGVkIHByaW9yIHRvCisJICogZG9pbmcgYW55dGhpbmc7IHdlIG5lZWQgdGhlIGJ5cGFzcyBjbG9jayBydW5uaW5nIHRvIHJlcHJvZ3JhbQorCSAqIHRoZSBEUExMLgorCSAqLworCW9tYXAyX2Nsa19lbmFibGUoZGQtPmNsa19ieXBhc3MpOworCW9tYXAyX2Nsa19lbmFibGUoZGQtPmNsa19yZWYpOworCisJaWYgKGRkLT5jbGtfYnlwYXNzLT5yYXRlID09IHJhdGUgJiYKKwkgICAgKGNsay0+ZHBsbF9kYXRhLT5tb2RlcyAmICgxIDw8IERQTExfTE9XX1BPV0VSX0JZUEFTUykpKSB7CisJCXByX2RlYnVnKCJjbG9jazogJXM6IHNldCByYXRlOiBlbnRlcmluZyBieXBhc3MuXG4iLCBjbGstPm5hbWUpOworCisJCXJldCA9IF9vbWFwM19ub25jb3JlX2RwbGxfYnlwYXNzKGNsayk7CisJCWlmICghcmV0KQorCQkJbmV3X3BhcmVudCA9IGRkLT5jbGtfYnlwYXNzOworCX0gZWxzZSB7CisJCWlmIChkZC0+bGFzdF9yb3VuZGVkX3JhdGUgIT0gcmF0ZSkKKwkJCW9tYXAyX2RwbGxfcm91bmRfcmF0ZShjbGssIHJhdGUpOworCisJCWlmIChkZC0+bGFzdF9yb3VuZGVkX3JhdGUgPT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qIE5vIGZyZXFzZWwgb24gT01BUDQgKi8KKwkJaWYgKCFjcHVfaXNfb21hcDQ0eHgoKSkgeworCQkJZnJlcXNlbCA9IF9vbWFwM19kcGxsX2NvbXB1dGVfZnJlcXNlbChjbGssCisJCQkJCQlkZC0+bGFzdF9yb3VuZGVkX24pOworCQkJaWYgKCFmcmVxc2VsKQorCQkJCVdBUk5fT04oMSk7CisJCX0KKworCQlwcl9kZWJ1ZygiY2xvY2s6ICVzOiBzZXQgcmF0ZTogbG9ja2luZyByYXRlIHRvICVsdS5cbiIsCisJCQkgY2xrLT5uYW1lLCByYXRlKTsKKworCQlyZXQgPSBvbWFwM19ub25jb3JlX2RwbGxfcHJvZ3JhbShjbGssIGRkLT5sYXN0X3JvdW5kZWRfbSwKKwkJCQkJCSBkZC0+bGFzdF9yb3VuZGVkX24sIGZyZXFzZWwpOworCQlpZiAoIXJldCkKKwkJCW5ld19wYXJlbnQgPSBkZC0+Y2xrX3JlZjsKKwl9CisJaWYgKCFyZXQpIHsKKwkJLyoKKwkJICogU3dpdGNoIHRoZSBwYXJlbnQgY2xvY2sgaW4gdGhlIGhlaXJhcmNoeSwgYW5kIG1ha2Ugc3VyZQorCQkgKiB0aGF0IHRoZSBuZXcgcGFyZW50J3MgdXNlY291bnQgaXMgY29ycmVjdC4gIE5vdGU6IHdlCisJCSAqIGVuYWJsZSB0aGUgbmV3IHBhcmVudCBiZWZvcmUgZGlzYWJsaW5nIHRoZSBvbGQgdG8gYXZvaWQKKwkJICogYW55IHVubmVjZXNzYXJ5IGhhcmR3YXJlIGRpc2FibGUtPmVuYWJsZSB0cmFuc2l0aW9ucy4KKwkJICovCisJCWlmIChjbGstPnVzZWNvdW50KSB7CisJCQlvbWFwMl9jbGtfZW5hYmxlKG5ld19wYXJlbnQpOworCQkJb21hcDJfY2xrX2Rpc2FibGUoY2xrLT5wYXJlbnQpOworCQl9CisJCWNsa19yZXBhcmVudChjbGssIG5ld19wYXJlbnQpOworCQljbGstPnJhdGUgPSByYXRlOworCX0KKwlvbWFwMl9jbGtfZGlzYWJsZShkZC0+Y2xrX3JlZik7CisJb21hcDJfY2xrX2Rpc2FibGUoZGQtPmNsa19ieXBhc3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIERQTEwgYXV0b2lkbGUgcmVhZC9zZXQgY29kZSAqLworCisvKioKKyAqIG9tYXAzX2RwbGxfYXV0b2lkbGVfcmVhZCAtIHJlYWQgYSBEUExMJ3MgYXV0b2lkbGUgYml0cworICogQGNsazogc3RydWN0IGNsayAqIG9mIHRoZSBEUExMIHRvIHJlYWQKKyAqCisgKiBSZXR1cm4gdGhlIERQTEwncyBhdXRvaWRsZSBiaXRzLCBzaGlmdGVkIGRvd24gdG8gYml0IDAuICBSZXR1cm5zCisgKiAtRUlOVkFMIGlmIHBhc3NlZCBhIG51bGwgcG9pbnRlciBvciBpZiB0aGUgc3RydWN0IGNsayBkb2VzIG5vdAorICogYXBwZWFyIHRvIHJlZmVyIHRvIGEgRFBMTC4KKyAqLwordTMyIG9tYXAzX2RwbGxfYXV0b2lkbGVfcmVhZChzdHJ1Y3QgY2xrICpjbGspCit7CisJY29uc3Qgc3RydWN0IGRwbGxfZGF0YSAqZGQ7CisJdTMyIHY7CisKKwlpZiAoIWNsayB8fCAhY2xrLT5kcGxsX2RhdGEpCisJCXJldHVybiAtRUlOVkFMOworCisJZGQgPSBjbGstPmRwbGxfZGF0YTsKKworCXYgPSBfX3Jhd19yZWFkbChkZC0+YXV0b2lkbGVfcmVnKTsKKwl2ICY9IGRkLT5hdXRvaWRsZV9tYXNrOworCXYgPj49IF9fZmZzKGRkLT5hdXRvaWRsZV9tYXNrKTsKKworCXJldHVybiB2OworfQorCisvKioKKyAqIG9tYXAzX2RwbGxfYWxsb3dfaWRsZSAtIGVuYWJsZSBEUExMIGF1dG9pZGxlIGJpdHMKKyAqIEBjbGs6IHN0cnVjdCBjbGsgKiBvZiB0aGUgRFBMTCB0byBvcGVyYXRlIG9uCisgKgorICogRW5hYmxlIERQTEwgYXV0b21hdGljIGlkbGUgY29udHJvbC4gIFRoaXMgYXV0b21hdGljIGlkbGUgbW9kZQorICogc3dpdGNoaW5nIHRha2VzIGVmZmVjdCBvbmx5IHdoZW4gdGhlIERQTEwgaXMgbG9ja2VkLCBhdCBsZWFzdCBvbgorICogT01BUDM0MzAuICBUaGUgRFBMTCB3aWxsIGVudGVyIGxvdy1wb3dlciBzdG9wIHdoZW4gaXRzIGRvd25zdHJlYW0KKyAqIGNsb2NrcyBhcmUgZ2F0ZWQuICBObyByZXR1cm4gdmFsdWUuCisgKi8KK3ZvaWQgb21hcDNfZHBsbF9hbGxvd19pZGxlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwljb25zdCBzdHJ1Y3QgZHBsbF9kYXRhICpkZDsKKwl1MzIgdjsKKworCWlmICghY2xrIHx8ICFjbGstPmRwbGxfZGF0YSkKKwkJcmV0dXJuOworCisJZGQgPSBjbGstPmRwbGxfZGF0YTsKKworCS8qCisJICogUkVWSVNJVDogQ09SRSBEUExMIGNhbiBvcHRpb25hbGx5IGVudGVyIGxvdy1wb3dlciBieXBhc3MKKwkgKiBieSB3cml0aW5nIDB4NSBpbnN0ZWFkIG9mIDB4MS4gIEFkZCBzb21lIG1lY2hhbmlzbSB0bworCSAqIG9wdGlvbmFsbHkgZW50ZXIgdGhpcyBtb2RlLgorCSAqLworCXYgPSBfX3Jhd19yZWFkbChkZC0+YXV0b2lkbGVfcmVnKTsKKwl2ICY9IH5kZC0+YXV0b2lkbGVfbWFzazsKKwl2IHw9IERQTExfQVVUT0lETEVfTE9XX1BPV0VSX1NUT1AgPDwgX19mZnMoZGQtPmF1dG9pZGxlX21hc2spOworCV9fcmF3X3dyaXRlbCh2LCBkZC0+YXV0b2lkbGVfcmVnKTsKK30KKworLyoqCisgKiBvbWFwM19kcGxsX2RlbnlfaWRsZSAtIHByZXZlbnQgRFBMTCBmcm9tIGF1dG9tYXRpY2FsbHkgaWRsaW5nCisgKiBAY2xrOiBzdHJ1Y3QgY2xrICogb2YgdGhlIERQTEwgdG8gb3BlcmF0ZSBvbgorICoKKyAqIERpc2FibGUgRFBMTCBhdXRvbWF0aWMgaWRsZSBjb250cm9sLiAgTm8gcmV0dXJuIHZhbHVlLgorICovCit2b2lkIG9tYXAzX2RwbGxfZGVueV9pZGxlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwljb25zdCBzdHJ1Y3QgZHBsbF9kYXRhICpkZDsKKwl1MzIgdjsKKworCWlmICghY2xrIHx8ICFjbGstPmRwbGxfZGF0YSkKKwkJcmV0dXJuOworCisJZGQgPSBjbGstPmRwbGxfZGF0YTsKKworCXYgPSBfX3Jhd19yZWFkbChkZC0+YXV0b2lkbGVfcmVnKTsKKwl2ICY9IH5kZC0+YXV0b2lkbGVfbWFzazsKKwl2IHw9IERQTExfQVVUT0lETEVfRElTQUJMRSA8PCBfX2ZmcyhkZC0+YXV0b2lkbGVfbWFzayk7CisJX19yYXdfd3JpdGVsKHYsIGRkLT5hdXRvaWRsZV9yZWcpOworCit9CisKKy8qIENsb2NrIGNvbnRyb2wgZm9yIERQTEwgb3V0cHV0cyAqLworCisvKioKKyAqIG9tYXAzX2Nsa291dHgyX3JlY2FsYyAtIHJlY2FsY3VsYXRlIERQTEwgWDIgb3V0cHV0IHZpcnR1YWwgY2xvY2sgcmF0ZQorICogQGNsazogRFBMTCBvdXRwdXQgc3RydWN0IGNsaworICoKKyAqIFVzaW5nIHBhcmVudCBjbG9jayBEUExMIGRhdGEsIGxvb2sgdXAgRFBMTCBzdGF0ZS4gIElmIGxvY2tlZCwgc2V0IG91cgorICogcmF0ZSB0byB0aGUgZHBsbF9jbGsgKiAyOyBvdGhlcndpc2UsIGp1c3QgdXNlIGRwbGxfY2xrLgorICovCit1bnNpZ25lZCBsb25nIG9tYXAzX2Nsa291dHgyX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJY29uc3Qgc3RydWN0IGRwbGxfZGF0YSAqZGQ7CisJdW5zaWduZWQgbG9uZyByYXRlOworCXUzMiB2OworCXN0cnVjdCBjbGsgKnBjbGs7CisKKwkvKiBXYWxrIHVwIHRoZSBwYXJlbnRzIG9mIGNsaywgbG9va2luZyBmb3IgYSBEUExMICovCisJcGNsayA9IGNsay0+cGFyZW50OworCXdoaWxlIChwY2xrICYmICFwY2xrLT5kcGxsX2RhdGEpCisJCXBjbGsgPSBwY2xrLT5wYXJlbnQ7CisKKwkvKiBjbGsgZG9lcyBub3QgaGF2ZSBhIERQTEwgYXMgYSBwYXJlbnQ/ICovCisJV0FSTl9PTighcGNsayk7CisKKwlkZCA9IHBjbGstPmRwbGxfZGF0YTsKKworCVdBUk5fT04oIWRkLT5lbmFibGVfbWFzayk7CisKKwl2ID0gX19yYXdfcmVhZGwoZGQtPmNvbnRyb2xfcmVnKSAmIGRkLT5lbmFibGVfbWFzazsKKwl2ID4+PSBfX2ZmcyhkZC0+ZW5hYmxlX21hc2spOworCWlmICh2ICE9IE9NQVAzWFhYX0VOX0RQTExfTE9DS0VEKQorCQlyYXRlID0gY2xrLT5wYXJlbnQtPnJhdGU7CisJZWxzZQorCQlyYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgKiAyOworCXJldHVybiByYXRlOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ncG1jLXNtYzkxeC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ncG1jLXNtYzkxeC5jCmluZGV4IDYwODNlMjEuLjg3N2M2ZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvZ3BtYy1zbWM5MXguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2dwbWMtc21jOTF4LmMKQEAgLTMzLDE3ICszMywxOSBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzbWM5MXhfcGxhdGRhdGEgZ3BtY19zbWM5MXhfaW5mbyA9IHsKLQkuZmxhZ3MgID0gU01DOTFYX1VTRV8xNkJJVCB8IFNNQzkxWF9OT1dBSVQgfCBTTUM5MVhfSU9fU0hJRlRfMCwKKwkuZmxhZ3MJPSBTTUM5MVhfVVNFXzE2QklUIHwgU01DOTFYX05PV0FJVCB8IFNNQzkxWF9JT19TSElGVF8wLAorCS5sZWRhCT0gUlBDX0xFRF8xMDBfMTAsCisJLmxlZGIJPSBSUENfTEVEX1RYX1JYLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZ3BtY19zbWM5MXhfZGV2aWNlID0gewogCS5uYW1lCQk9ICJzbWM5MXgiLAogCS5pZAkJPSAtMSwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoZ3BtY19zbWM5MXhfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPSBncG1jX3NtYzkxeF9yZXNvdXJjZXMsCiAJLmRldgkJPSB7CiAJCS5wbGF0Zm9ybV9kYXRhID0gJmdwbWNfc21jOTF4X2luZm8sCiAJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoZ3BtY19zbWM5MXhfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBncG1jX3NtYzkxeF9yZXNvdXJjZXMsCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ncG1jLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2dwbWMuYwppbmRleCBlODZmNWNhLi5iZDhjYjU5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2dwbWMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2dwbWMuYwpAQCAtNTE3LDcgKzUxNyw3IEBACiAJCWNrID0gImdwbWNfZmNrIjsKIAkJbCA9IE9NQVAzNFhYX0dQTUNfQkFTRTsKIAl9IGVsc2UgaWYgKGNwdV9pc19vbWFwNDR4eCgpKSB7Ci0JCWNrID0gImdwbWNfZmNrIjsKKwkJY2sgPSAiZ3BtY19jayI7CiAJCWwgPSBPTUFQNDRYWF9HUE1DX0JBU0U7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2kyYy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODljYThjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pMmMuYwpAQCAtMCwwICsxLDU2IEBACisvKgorICogSGVscGVyIG1vZHVsZSBmb3IgYm9hcmQgc3BlY2lmaWMgSTJDIGJ1cyByZWdpc3RyYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTm9raWEgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L2kyYy5oPgorI2luY2x1ZGUgPHBsYXQvbXV4Lmg+CisKKyNpbmNsdWRlICJtdXguaCIKKworaW50IF9faW5pdCBvbWFwX3JlZ2lzdGVyX2kyY19idXMoaW50IGJ1c19pZCwgdTMyIGNsa3JhdGUsCisJCQkgIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBjb25zdCAqaW5mbywKKwkJCSAgdW5zaWduZWQgbGVuKQoreworCWlmIChjcHVfaXNfb21hcDI0eHgoKSkgeworCQljb25zdCBpbnQgb21hcDI0eHhfcGluc1tdWzJdID0geworCQkJeyBNMTlfMjRYWF9JMkMxX1NDTCwgTDE1XzI0WFhfSTJDMV9TREEgfSwKKwkJCXsgSjE1XzI0WFhfSTJDMl9TQ0wsIEgxOV8yNFhYX0kyQzJfU0RBIH0sCisJCX07CisJCWludCBzY2wsIHNkYTsKKworCQlzY2wgPSBvbWFwMjR4eF9waW5zW2J1c19pZCAtIDFdWzBdOworCQlzZGEgPSBvbWFwMjR4eF9waW5zW2J1c19pZCAtIDFdWzFdOworCQlvbWFwX2NmZ19yZWcoc2RhKTsKKwkJb21hcF9jZmdfcmVnKHNjbCk7CisJfQorCisJLyogRmlyc3QgSTJDIGJ1cyBpcyBub3QgbXV4YWJsZSAqLworCWlmIChjcHVfaXNfb21hcDM0eHgoKSAmJiBidXNfaWQgPiAxKSB7CisJCWNoYXIgbXV4X25hbWVbc2l6ZW9mKCJpMmMyX3NjbC5pMmMyX3NjbCIpXTsKKworCQlzcHJpbnRmKG11eF9uYW1lLCAiaTJjJWlfc2NsLmkyYyVpX3NjbCIsIGJ1c19pZCwgYnVzX2lkKTsKKwkJb21hcF9tdXhfaW5pdF9zaWduYWwobXV4X25hbWUsIE9NQVBfUElOX0lOUFVUKTsKKwkJc3ByaW50ZihtdXhfbmFtZSwgImkyYyVpX3NkYS5pMmMlaV9zZGEiLCBidXNfaWQsIGJ1c19pZCk7CisJCW9tYXBfbXV4X2luaXRfc2lnbmFsKG11eF9uYW1lLCBPTUFQX1BJTl9JTlBVVCk7CisJfQorCisJcmV0dXJuIG9tYXBfcGxhdF9yZWdpc3Rlcl9pMmNfYnVzKGJ1c19pZCwgY2xrcmF0ZSwgaW5mbywgbGVuKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvaWQuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvaWQuYwppbmRleCBmNDhhNGIyLi5hMDkxYjUzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2lkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pZC5jCkBAIC0yNDYsNiArMjQ2LDMxIEBACiAJfQogfQogCit2b2lkIF9faW5pdCBvbWFwNF9jaGVja19yZXZpc2lvbih2b2lkKQoreworCXUzMiBpZGNvZGU7CisJdTE2IGhhd2tleWU7CisJdTggcmV2OworCWNoYXIgKnJldl9uYW1lID0gIkVTMS4wIjsKKworCS8qCisJICogVGhlIElDIHJldiBkZXRlY3Rpb24gaXMgZG9uZSB3aXRoIGhhd2tleWUgYW5kIHJldi4KKwkgKiBOb3RlIHRoYXQgcmV2IGRvZXMgbm90IG1hcCBkaXJlY3RseSB0byBkZWZpbmVkIHByb2Nlc3NvcgorCSAqIHJldmlzaW9uIG51bWJlcnMgYXMgRVMxLjAgdXNlcyB2YWx1ZSAwLgorCSAqLworCWlkY29kZSA9IHJlYWRfdGFwX3JlZyhPTUFQX1RBUF9JRENPREUpOworCWhhd2tleWUgPSAoaWRjb2RlID4+IDEyKSAmIDB4ZmZmZjsKKwlyZXYgPSAoaWRjb2RlID4+IDI4KSAmIDB4ZmY7CisKKwlpZiAoKGhhd2tleWUgPT0gMHhiODUyKSAmJiAocmV2ID09IDB4MCkpIHsKKwkJb21hcF9yZXZpc2lvbiA9IE9NQVA0NDMwX1JFVl9FUzFfMDsKKwkJcHJfaW5mbygiT01BUCUwNHggJXNcbiIsIG9tYXBfcmV2KCkgPj4gMTYsIHJldl9uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCXByX2VycigiVW5rbm93biBPTUFQNCBDUFUgaWRcbiIpOworfQorCiAjZGVmaW5lIE9NQVAzX1NIT1dfRkVBVFVSRShmZWF0KQkJXAogCWlmIChvbWFwM19oYXNfICMjZmVhdCgpKQkJXAogCQlwcmludGsoI2ZlYXQiICIpOwpAQCAtMjc3LDEwICszMDIsMTAgQEAKIAl9IGVsc2UgaWYgKG9tYXAzX2hhc19pdmEoKSAmJiBvbWFwM19oYXNfc2d4KCkpIHsKIAkJLyogT01BUDM0MzAsIE9NQVAzNTI1LCBPTUFQMzUxNSwgT01BUDM1MDMgZGV2aWNlcyAqLwogCQlzdHJjcHkoY3B1X25hbWUsICJPTUFQMzQzMC8zNTMwIik7Ci0JfSBlbHNlIGlmIChvbWFwM19oYXNfc2d4KCkpIHsKKwl9IGVsc2UgaWYgKG9tYXAzX2hhc19pdmEoKSkgewogCQlvbWFwX3JldmlzaW9uID0gT01BUDM1MjVfUkVWKHJldik7CiAJCXN0cmNweShjcHVfbmFtZSwgIk9NQVAzNTI1Iik7Ci0JfSBlbHNlIGlmIChvbWFwM19oYXNfaXZhKCkpIHsKKwl9IGVsc2UgaWYgKG9tYXAzX2hhc19zZ3goKSkgewogCQlvbWFwX3JldmlzaW9uID0gT01BUDM1MTVfUkVWKHJldik7CiAJCXN0cmNweShjcHVfbmFtZSwgIk9NQVAzNTE1Iik7CiAJfSBlbHNlIHsKQEAgLTMzNiw3ICszNjEsNyBAQAogCQlvbWFwM19jaGVja19mZWF0dXJlcygpOwogCQlvbWFwM19jcHVpbmZvKCk7CiAJfSBlbHNlIGlmIChjcHVfaXNfb21hcDQ0eHgoKSkgewotCQlwcmludGsoS0VSTl9JTkZPICJGSVhNRTogQ1BVIHJldmlzaW9uID0gT01BUDQ0MzBcbiIpOworCQlvbWFwNF9jaGVja19yZXZpc2lvbigpOwogCQlyZXR1cm47CiAJfSBlbHNlIHsKIAkJcHJfZXJyKCJPTUFQIHJldmlzaW9uIHVua25vd24sIHBsZWFzZSBmaXghXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvaW8uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvaW8uYwppbmRleCA2YTRkOGU0Li5hODc0OWU4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2lvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pby5jCkBAIC0zMyw5ICszMyw5IEBACiAjaW5jbHVkZSA8cGxhdC9zZHJjLmg+CiAjaW5jbHVkZSA8cGxhdC9ncG1jLmg+CiAjaW5jbHVkZSA8cGxhdC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxwbGF0L211eC5oPgogI2luY2x1ZGUgPHBsYXQvdnJhbS5oPgogCi0jaWZuZGVmIENPTkZJR19BUkNIX09NQVA0CS8qIEZJWE1FOiBSZW1vdmUgdGhpcyBvbmNlIGNsa2RldiBpcyByZWFkeSAqLwogI2luY2x1ZGUgImNsb2NrLmgiCiAKICNpbmNsdWRlIDxwbGF0L29tYXAtcG0uaD4KQEAgLTQ0LDcgKzQ0LDYgQEAKIAogI2luY2x1ZGUgPHBsYXQvY2xvY2tkb21haW4uaD4KICNpbmNsdWRlICJjbG9ja2RvbWFpbnMuaCIKLSNlbmRpZgogI2luY2x1ZGUgPHBsYXQvb21hcF9od21vZC5oPgogI2luY2x1ZGUgIm9tYXBfaHdtb2RfMjQyMC5oIgogI2luY2x1ZGUgIm9tYXBfaHdtb2RfMjQzMC5oIgpAQCAtMzIxLDggKzMyMCw4IEBACiAJb21hcF9wbV9pZl9lYXJseV9pbml0KG1wdV9vcHBzLCBkc3Bfb3BwcywgbDNfb3Bwcyk7CiAJcHdyZG1faW5pdChwb3dlcmRvbWFpbnNfb21hcCk7CiAJY2xrZG1faW5pdChjbG9ja2RvbWFpbnNfb21hcCwgY2xrZG1fcHdyZG1fYXV0b2RlcHMpOwotCW9tYXAyX2Nsa19pbml0KCk7CiAjZW5kaWYKKwlvbWFwMl9jbGtfaW5pdCgpOwogCW9tYXBfc2VyaWFsX2Vhcmx5X2luaXQoKTsKICNpZm5kZWYgQ09ORklHX0FSQ0hfT01BUDQKIAlvbWFwX2h3bW9kX2xhdGVfaW5pdCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9tdXguYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvbXV4LmMKaW5kZXggYzE4YTk0ZS4uZTA3MWIzZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9tdXguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL211eC5jCkBAIC0yNywxOSArMjcsNTIgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAogI2luY2x1ZGUgPHBsYXQvY29udHJvbC5oPgogI2luY2x1ZGUgPHBsYXQvbXV4Lmg+CiAKLSNpZmRlZiBDT05GSUdfT01BUF9NVVgKKyNpbmNsdWRlICJtdXguaCIKKworI2RlZmluZSBPTUFQX01VWF9CQVNFX09GRlNFVAkJMHgzMAkvKiBPZmZzZXQgZnJvbSBDVFJMX0JBU0UgKi8KKyNkZWZpbmUgT01BUF9NVVhfQkFTRV9TWgkJMHg1Y2EKKworc3RydWN0IG9tYXBfbXV4X2VudHJ5IHsKKwlzdHJ1Y3Qgb21hcF9tdXgJCW11eDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7Cit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtdXhfcGh5czsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKm11eF9iYXNlOworCitzdGF0aWMgaW5saW5lIHUxNiBvbWFwX211eF9yZWFkKHUxNiByZWcpCit7CisJaWYgKGNwdV9pc19vbWFwMjR4eCgpKQorCQlyZXR1cm4gX19yYXdfcmVhZGIobXV4X2Jhc2UgKyByZWcpOworCWVsc2UKKwkJcmV0dXJuIF9fcmF3X3JlYWR3KG11eF9iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG9tYXBfbXV4X3dyaXRlKHUxNiB2YWwsIHUxNiByZWcpCit7CisJaWYgKGNwdV9pc19vbWFwMjR4eCgpKQorCQlfX3Jhd193cml0ZWIodmFsLCBtdXhfYmFzZSArIHJlZyk7CisJZWxzZQorCQlfX3Jhd193cml0ZXcodmFsLCBtdXhfYmFzZSArIHJlZyk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyNFhYKSAmJiBkZWZpbmVkKENPTkZJR19PTUFQX01VWCkKIAogc3RhdGljIHN0cnVjdCBvbWFwX211eF9jZmcgYXJjaF9tdXhfY2ZnOwogCiAvKiBOT1RFOiBTZWUgbXV4LmggZm9yIHRoZSBlbnVtZXJhdGlvbiAqLwogCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKIHN0YXRpYyBzdHJ1Y3QgcGluX2NvbmZpZyBfX2luaXRkYXRhX29yX21vZHVsZSBvbWFwMjR4eF9waW5zW10gPSB7CiAvKgogICoJZGVzY3JpcHRpb24JCQltdXgJbXV4CXB1bGwJcHVsbAlkZWJ1ZwpAQCAtMjQ5LDM0MiArMjgyLDE0IEBACiAKICNkZWZpbmUgT01BUDI0WFhfUElOU19TWglBUlJBWV9TSVpFKG9tYXAyNHh4X3BpbnMpCiAKLSNlbHNlCi0jZGVmaW5lIG9tYXAyNHh4X3BpbnMJCU5VTEwKLSNkZWZpbmUgT01BUDI0WFhfUElOU19TWgkwCi0jZW5kaWYJLyogQ09ORklHX0FSQ0hfT01BUDI0WFggKi8KLQotI2lmZGVmIENPTkZJR19BUkNIX09NQVAzNFhYCi1zdGF0aWMgc3RydWN0IHBpbl9jb25maWcgX19pbml0ZGF0YV9vcl9tb2R1bGUgb21hcDM0eHhfcGluc1tdID0gewotLyoKLSAqCQlOYW1lLCByZWctb2Zmc2V0LAotICoJCW11eC1tb2RlIHwgW2FjdGl2ZS1tb2RlIHwgb2ZmLW1vZGVdCi0gKi8KLQotLyogMzR4eCBJMkMgKi8KLU1VWF9DRkdfMzRYWCgiSzIxXzM0WFhfSTJDMV9TQ0wiLCAweDFiYSwKLQkJT01BUDM0WFhfTVVYX01PREUwIHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExVUCkKLU1VWF9DRkdfMzRYWCgiSjIxXzM0WFhfSTJDMV9TREEiLCAweDFiYywKLQkJT01BUDM0WFhfTVVYX01PREUwIHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExVUCkKLU1VWF9DRkdfMzRYWCgiQUYxNV8zNFhYX0kyQzJfU0NMIiwgMHgxYmUsCi0JCU9NQVAzNFhYX01VWF9NT0RFMCB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMVVApCi1NVVhfQ0ZHXzM0WFgoIkFFMTVfMzRYWF9JMkMyX1NEQSIsIDB4MWMwLAotCQlPTUFQMzRYWF9NVVhfTU9ERTAgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTFVQKQotTVVYX0NGR18zNFhYKCJBRjE0XzM0WFhfSTJDM19TQ0wiLCAweDFjMiwKLQkJT01BUDM0WFhfTVVYX01PREUwIHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExVUCkKLU1VWF9DRkdfMzRYWCgiQUcxNF8zNFhYX0kyQzNfU0RBIiwgMHgxYzQsCi0JCU9NQVAzNFhYX01VWF9NT0RFMCB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMVVApCi1NVVhfQ0ZHXzM0WFgoIkFEMjZfMzRYWF9JMkM0X1NDTCIsIDB4YTAwLAotCQlPTUFQMzRYWF9NVVhfTU9ERTAgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTFVQKQotTVVYX0NGR18zNFhYKCJBRTI2XzM0WFhfSTJDNF9TREEiLCAweGEwMiwKLQkJT01BUDM0WFhfTVVYX01PREUwIHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExVUCkKLQotLyogUEhZIC0gSFNVU0I6IDEyLXBpbiBVTFBJIFBIWTogUG9ydCAxKi8KLU1VWF9DRkdfMzRYWCgiWThfMzQzMF9VU0IxSFNfUEhZX0NMSyIsIDB4NWRhLAotCQlPTUFQMzRYWF9NVVhfTU9ERTMgfCBPTUFQMzRYWF9QSU5fT1VUUFVUKQotTVVYX0NGR18zNFhYKCJZOV8zNDMwX1VTQjFIU19QSFlfU1RQIiwgMHg1ZDgsCi0JCU9NQVAzNFhYX01VWF9NT0RFMyB8IE9NQVAzNFhYX1BJTl9PVVRQVVQpCi1NVVhfQ0ZHXzM0WFgoIkFBMTRfMzQzMF9VU0IxSFNfUEhZX0RJUiIsIDB4NWVjLAotCQlPTUFQMzRYWF9NVVhfTU9ERTMgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCi1NVVhfQ0ZHXzM0WFgoIkFBMTFfMzQzMF9VU0IxSFNfUEhZX05YVCIsIDB4NWVlLAotCQlPTUFQMzRYWF9NVVhfTU9ERTMgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCi1NVVhfQ0ZHXzM0WFgoIlcxM18zNDMwX1VTQjFIU19QSFlfRDAiLCAweDVkYywKLQkJT01BUDM0WFhfTVVYX01PREUzIHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQotTVVYX0NGR18zNFhYKCJXMTJfMzQzMF9VU0IxSFNfUEhZX0QxIiwgMHg1ZGUsCi0JCU9NQVAzNFhYX01VWF9NT0RFMyB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKLU1VWF9DRkdfMzRYWCgiVzExXzM0MzBfVVNCMUhTX1BIWV9EMiIsIDB4NWUwLAotCQlPTUFQMzRYWF9NVVhfTU9ERTMgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCi1NVVhfQ0ZHXzM0WFgoIlkxMV8zNDMwX1VTQjFIU19QSFlfRDMiLCAweDVlYSwKLQkJT01BUDM0WFhfTVVYX01PREUzIHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQotTVVYX0NGR18zNFhYKCJXOV8zNDMwX1VTQjFIU19QSFlfRDQiLCAweDVlNCwKLQkJT01BUDM0WFhfTVVYX01PREUzIHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQotTVVYX0NGR18zNFhYKCJZMTJfMzQzMF9VU0IxSFNfUEhZX0Q1IiwgMHg1ZTYsCi0JCU9NQVAzNFhYX01VWF9NT0RFMyB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKLU1VWF9DRkdfMzRYWCgiVzhfMzQzMF9VU0IxSFNfUEhZX0Q2IiwgMHg1ZTgsCi0JCU9NQVAzNFhYX01VWF9NT0RFMyB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKLU1VWF9DRkdfMzRYWCgiWTEzXzM0MzBfVVNCMUhTX1BIWV9ENyIsIDB4NWUyLAotCQlPTUFQMzRYWF9NVVhfTU9ERTMgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCi0KLS8qIFBIWSAtIEhTVVNCOiAxMi1waW4gVUxQSSBQSFk6IFBvcnQgMiovCi1NVVhfQ0ZHXzM0WFgoIkFBOF8zNDMwX1VTQjJIU19QSFlfQ0xLIiwgMHg1ZjAsCi0JCU9NQVAzNFhYX01VWF9NT0RFMyB8IE9NQVAzNFhYX1BJTl9PVVRQVVQpCi1NVVhfQ0ZHXzM0WFgoIkFBMTBfMzQzMF9VU0IySFNfUEhZX1NUUCIsIDB4NWYyLAotCQlPTUFQMzRYWF9NVVhfTU9ERTMgfCBPTUFQMzRYWF9QSU5fT1VUUFVUKQotTVVYX0NGR18zNFhYKCJBQTlfMzQzMF9VU0IySFNfUEhZX0RJUiIsIDB4NWY0LAotCQlPTUFQMzRYWF9NVVhfTU9ERTMgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCi1NVVhfQ0ZHXzM0WFgoIkFCMTFfMzQzMF9VU0IySFNfUEhZX05YVCIsIDB4NWY2LAotCQlPTUFQMzRYWF9NVVhfTU9ERTMgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCi1NVVhfQ0ZHXzM0WFgoIkFCMTBfMzQzMF9VU0IySFNfUEhZX0QwIiwgMHg1ZjgsCi0JCU9NQVAzNFhYX01VWF9NT0RFMyB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKLU1VWF9DRkdfMzRYWCgiQUI5XzM0MzBfVVNCMkhTX1BIWV9EMSIsIDB4NWZhLAotCQlPTUFQMzRYWF9NVVhfTU9ERTMgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCi1NVVhfQ0ZHXzM0WFgoIlczXzM0MzBfVVNCMkhTX1BIWV9EMiIsIDB4MWQ0LAotCQlPTUFQMzRYWF9NVVhfTU9ERTMgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCi1NVVhfQ0ZHXzM0WFgoIlQ0XzM0MzBfVVNCMkhTX1BIWV9EMyIsIDB4MWRlLAotCQlPTUFQMzRYWF9NVVhfTU9ERTMgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCi1NVVhfQ0ZHXzM0WFgoIlQzXzM0MzBfVVNCMkhTX1BIWV9ENCIsIDB4MWQ4LAotCQlPTUFQMzRYWF9NVVhfTU9ERTMgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCi1NVVhfQ0ZHXzM0WFgoIlIzXzM0MzBfVVNCMkhTX1BIWV9ENSIsIDB4MWRhLAotCQlPTUFQMzRYWF9NVVhfTU9ERTMgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCi1NVVhfQ0ZHXzM0WFgoIlI0XzM0MzBfVVNCMkhTX1BIWV9ENiIsIDB4MWRjLAotCQlPTUFQMzRYWF9NVVhfTU9ERTMgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCi1NVVhfQ0ZHXzM0WFgoIlQyXzM0MzBfVVNCMkhTX1BIWV9ENyIsIDB4MWQ2LAotCQlPTUFQMzRYWF9NVVhfTU9ERTMgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCi0KLS8qIFRMTCAtIEhTVVNCOiAxMi1waW4gVExMIFBvcnQgMSovCi1NVVhfQ0ZHXzM0WFgoIlk4XzM0MzBfVVNCMUhTX1RMTF9DTEsiLCAweDVkYSwKLQkJT01BUDM0WFhfTVVYX01PREU2IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQotTVVYX0NGR18zNFhYKCJZOV8zNDMwX1VTQjFIU19UTExfU1RQIiwgMHg1ZDgsCi0JCU9NQVAzNFhYX01VWF9NT0RFNiB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMVVApCi1NVVhfQ0ZHXzM0WFgoIkFBMTRfMzQzMF9VU0IxSFNfVExMX0RJUiIsIDB4NWVjLAotCQlPTUFQMzRYWF9NVVhfTU9ERTYgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCi1NVVhfQ0ZHXzM0WFgoIkFBMTFfMzQzMF9VU0IxSFNfVExMX05YVCIsIDB4NWVlLAotCQlPTUFQMzRYWF9NVVhfTU9ERTYgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCi1NVVhfQ0ZHXzM0WFgoIlcxM18zNDMwX1VTQjFIU19UTExfRDAiLCAweDVkYywKLQkJT01BUDM0WFhfTVVYX01PREU2IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQotTVVYX0NGR18zNFhYKCJXMTJfMzQzMF9VU0IxSFNfVExMX0QxIiwgMHg1ZGUsCi0JCU9NQVAzNFhYX01VWF9NT0RFNiB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKLU1VWF9DRkdfMzRYWCgiVzExXzM0MzBfVVNCMUhTX1RMTF9EMiIsIDB4NWUwLAotCQlPTUFQMzRYWF9NVVhfTU9ERTYgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCi1NVVhfQ0ZHXzM0WFgoIlkxMV8zNDMwX1VTQjFIU19UTExfRDMiLCAweDVlYSwKLQkJT01BUDM0WFhfTVVYX01PREU2IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQotTVVYX0NGR18zNFhYKCJXOV8zNDMwX1VTQjFIU19UTExfRDQiLCAweDVlNCwKLQkJT01BUDM0WFhfTVVYX01PREU2IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQotTVVYX0NGR18zNFhYKCJZMTJfMzQzMF9VU0IxSFNfVExMX0Q1IiwgMHg1ZTYsCi0JCU9NQVAzNFhYX01VWF9NT0RFNiB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKLU1VWF9DRkdfMzRYWCgiVzhfMzQzMF9VU0IxSFNfVExMX0Q2IiwgMHg1ZTgsCi0JCU9NQVAzNFhYX01VWF9NT0RFNiB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKLU1VWF9DRkdfMzRYWCgiWTEzXzM0MzBfVVNCMUhTX1RMTF9ENyIsIDB4NWUyLAotCQlPTUFQMzRYWF9NVVhfTU9ERTYgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCi0KLS8qIFRMTCAtIEhTVVNCOiAxMi1waW4gVExMIFBvcnQgMiovCi1NVVhfQ0ZHXzM0WFgoIkFBOF8zNDMwX1VTQjJIU19UTExfQ0xLIiwgMHg1ZjAsCi0JCU9NQVAzNFhYX01VWF9NT0RFNiB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKLU1VWF9DRkdfMzRYWCgiQUExMF8zNDMwX1VTQjJIU19UTExfU1RQIiwgMHg1ZjIsCi0JCU9NQVAzNFhYX01VWF9NT0RFNiB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMVVApCi1NVVhfQ0ZHXzM0WFgoIkFBOV8zNDMwX1VTQjJIU19UTExfRElSIiwgMHg1ZjQsCi0JCU9NQVAzNFhYX01VWF9NT0RFNiB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKLU1VWF9DRkdfMzRYWCgiQUIxMV8zNDMwX1VTQjJIU19UTExfTlhUIiwgMHg1ZjYsCi0JCU9NQVAzNFhYX01VWF9NT0RFNiB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKLU1VWF9DRkdfMzRYWCgiQUIxMF8zNDMwX1VTQjJIU19UTExfRDAiLCAweDVmOCwKLQkJT01BUDM0WFhfTVVYX01PREU2IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQotTVVYX0NGR18zNFhYKCJBQjlfMzQzMF9VU0IySFNfVExMX0QxIiwgMHg1ZmEsCi0JCU9NQVAzNFhYX01VWF9NT0RFNiB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKLU1VWF9DRkdfMzRYWCgiVzNfMzQzMF9VU0IySFNfVExMX0QyIiwgMHgxZDQsCi0JCU9NQVAzNFhYX01VWF9NT0RFMiB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKLU1VWF9DRkdfMzRYWCgiVDRfMzQzMF9VU0IySFNfVExMX0QzIiwgMHgxZGUsCi0JCU9NQVAzNFhYX01VWF9NT0RFMiB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKLU1VWF9DRkdfMzRYWCgiVDNfMzQzMF9VU0IySFNfVExMX0Q0IiwgMHgxZDgsCi0JCU9NQVAzNFhYX01VWF9NT0RFMiB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKLU1VWF9DRkdfMzRYWCgiUjNfMzQzMF9VU0IySFNfVExMX0Q1IiwgMHgxZGEsCi0JCU9NQVAzNFhYX01VWF9NT0RFMiB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKLU1VWF9DRkdfMzRYWCgiUjRfMzQzMF9VU0IySFNfVExMX0Q2IiwgMHgxZGMsCi0JCU9NQVAzNFhYX01VWF9NT0RFMiB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKLU1VWF9DRkdfMzRYWCgiVDJfMzQzMF9VU0IySFNfVExMX0Q3IiwgMHgxZDYsCi0JCU9NQVAzNFhYX01VWF9NT0RFMiB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKLQotLyogVExMIC0gSFNVU0I6IDEyLXBpbiBUTEwgUG9ydCAzKi8KLU1VWF9DRkdfMzRYWCgiQUE2XzM0MzBfVVNCM0hTX1RMTF9DTEsiLCAweDE4MCwKLQkJT01BUDM0WFhfTVVYX01PREU1IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQotTVVYX0NGR18zNFhYKCJBQjNfMzQzMF9VU0IzSFNfVExMX1NUUCIsIDB4MTY2LAotCQlPTUFQMzRYWF9NVVhfTU9ERTUgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTFVQKQotTVVYX0NGR18zNFhYKCJBQTNfMzQzMF9VU0IzSFNfVExMX0RJUiIsIDB4MTY4LAotCQlPTUFQMzRYWF9NVVhfTU9ERTUgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCi1NVVhfQ0ZHXzM0WFgoIlkzXzM0MzBfVVNCM0hTX1RMTF9OWFQiLCAweDE2YSwKLQkJT01BUDM0WFhfTVVYX01PREU1IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQotTVVYX0NGR18zNFhYKCJBQTVfMzQzMF9VU0IzSFNfVExMX0QwIiwgMHgxODYsCi0JCU9NQVAzNFhYX01VWF9NT0RFNSB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKLU1VWF9DRkdfMzRYWCgiWTRfMzQzMF9VU0IzSFNfVExMX0QxIiwgMHgxODQsCi0JCU9NQVAzNFhYX01VWF9NT0RFNSB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKLU1VWF9DRkdfMzRYWCgiWTVfMzQzMF9VU0IzSFNfVExMX0QyIiwgMHgxODgsCi0JCU9NQVAzNFhYX01VWF9NT0RFNSB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKLU1VWF9DRkdfMzRYWCgiVzVfMzQzMF9VU0IzSFNfVExMX0QzIiwgMHgxOGEsCi0JCU9NQVAzNFhYX01VWF9NT0RFNSB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKLU1VWF9DRkdfMzRYWCgiQUIxMl8zNDMwX1VTQjNIU19UTExfRDQiLCAweDE2YywKLQkJT01BUDM0WFhfTVVYX01PREU1IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQotTVVYX0NGR18zNFhYKCJBQjEzXzM0MzBfVVNCM0hTX1RMTF9ENSIsIDB4MTZlLAotCQlPTUFQMzRYWF9NVVhfTU9ERTUgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCi1NVVhfQ0ZHXzM0WFgoIkFBMTNfMzQzMF9VU0IzSFNfVExMX0Q2IiwgMHgxNzAsCi0JCU9NQVAzNFhYX01VWF9NT0RFNSB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKLU1VWF9DRkdfMzRYWCgiQUExMl8zNDMwX1VTQjNIU19UTExfRDciLCAweDE3MiwKLQkJT01BUDM0WFhfTVVYX01PREU1IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQotCi0vKiBQSFkgRlNVU0I6IEZTIFNlcmlhbCBmb3IgUG9ydCAxIChtdWx0aXBsZSBQSFkgbW9kZXMgc3VwcG9ydGVkKSAqLwotTVVYX0NGR18zNFhYKCJBRjEwXzM0MzBfVVNCMUZTX1BIWV9NTTFfUlhEUCIsIDB4NWQ4LAotCQlPTUFQMzRYWF9NVVhfTU9ERTUgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCi1NVVhfQ0ZHXzM0WFgoIkFHOV8zNDMwX1VTQjFGU19QSFlfTU0xX1JYRE0iLCAweDVlZSwKLQkJT01BUDM0WFhfTVVYX01PREU1IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQotTVVYX0NGR18zNFhYKCJXMTNfMzQzMF9VU0IxRlNfUEhZX01NMV9SWFJDViIsIDB4NWRjLAotCQlPTUFQMzRYWF9NVVhfTU9ERTUgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCi1NVVhfQ0ZHXzM0WFgoIlcxMl8zNDMwX1VTQjFGU19QSFlfTU0xX1RYU0UwIiwgMHg1ZGUsCi0JCU9NQVAzNFhYX01VWF9NT0RFNSB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKLU1VWF9DRkdfMzRYWCgiVzExXzM0MzBfVVNCMUZTX1BIWV9NTTFfVFhEQVQiLCAweDVlMCwKLQkJT01BUDM0WFhfTVVYX01PREU1IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQotTVVYX0NGR18zNFhYKCJZMTFfMzQzMF9VU0IxRlNfUEhZX01NMV9UWEVOX04iLCAweDVlYSwKLQkJT01BUDM0WFhfTVVYX01PREU1IHwgT01BUDM0WFhfUElOX09VVFBVVCkKLQotLyogUEhZIEZTVVNCOiBGUyBTZXJpYWwgZm9yIFBvcnQgMiAobXVsdGlwbGUgUEhZIG1vZGVzIHN1cHBvcnRlZCkgKi8KLU1VWF9DRkdfMzRYWCgiQUY3XzM0MzBfVVNCMkZTX1BIWV9NTTJfUlhEUCIsIDB4NWYyLAotCQlPTUFQMzRYWF9NVVhfTU9ERTUgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCi1NVVhfQ0ZHXzM0WFgoIkFIN18zNDMwX1VTQjJGU19QSFlfTU0yX1JYRE0iLCAweDVmNiwKLQkJT01BUDM0WFhfTVVYX01PREU1IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQotTVVYX0NGR18zNFhYKCJBQjEwXzM0MzBfVVNCMkZTX1BIWV9NTTJfUlhSQ1YiLCAweDVmOCwKLQkJT01BUDM0WFhfTVVYX01PREU1IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQotTVVYX0NGR18zNFhYKCJBQjlfMzQzMF9VU0IyRlNfUEhZX01NMl9UWFNFMCIsIDB4NWZhLAotCQlPTUFQMzRYWF9NVVhfTU9ERTUgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCi1NVVhfQ0ZHXzM0WFgoIlczXzM0MzBfVVNCMkZTX1BIWV9NTTJfVFhEQVQiLCAweDFkNCwKLQkJT01BUDM0WFhfTVVYX01PREU1IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQotTVVYX0NGR18zNFhYKCJUNF8zNDMwX1VTQjJGU19QSFlfTU0yX1RYRU5fTiIsIDB4MWRlLAotCQlPTUFQMzRYWF9NVVhfTU9ERTUgfCBPTUFQMzRYWF9QSU5fT1VUUFVUKQotCi0vKiBQSFkgRlNVU0I6IEZTIFNlcmlhbCBmb3IgUG9ydCAzIChtdWx0aXBsZSBQSFkgbW9kZXMgc3VwcG9ydGVkKSAqLwotTVVYX0NGR18zNFhYKCJBSDNfMzQzMF9VU0IzRlNfUEhZX01NM19SWERQIiwgMHgxNjYsCi0JCU9NQVAzNFhYX01VWF9NT0RFNiB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKLU1VWF9DRkdfMzRYWCgiQUUzXzM0MzBfVVNCM0ZTX1BIWV9NTTNfUlhETSIsIDB4MTZhLAotCQlPTUFQMzRYWF9NVVhfTU9ERTYgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCi1NVVhfQ0ZHXzM0WFgoIkFEMV8zNDMwX1VTQjNGU19QSFlfTU0zX1JYUkNWIiwgMHgxODYsCi0JCU9NQVAzNFhYX01VWF9NT0RFNiB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKLU1VWF9DRkdfMzRYWCgiQUUxXzM0MzBfVVNCM0ZTX1BIWV9NTTNfVFhTRTAiLCAweDE4NCwKLQkJT01BUDM0WFhfTVVYX01PREU2IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExET1dOKQotTVVYX0NGR18zNFhYKCJBRDJfMzQzMF9VU0IzRlNfUEhZX01NM19UWERBVCIsIDB4MTg4LAotCQlPTUFQMzRYWF9NVVhfTU9ERTYgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04pCi1NVVhfQ0ZHXzM0WFgoIkFDMV8zNDMwX1VTQjNGU19QSFlfTU0zX1RYRU5fTiIsIDB4MThhLAotCQlPTUFQMzRYWF9NVVhfTU9ERTYgfCBPTUFQMzRYWF9QSU5fT1VUUFVUKQotCi0KLS8qIDM0WFggR1BJTyAtIGJpZGlyZWN0aW9uYWwsIHVubGVzcyB0aGUgbmFtZSBoYXMgYW4gIl9PVVQiIHN1ZmZpeC4KLSAqIChBbHdheXMgc3BlY2lmeSBQSU5fSU5QVVQsIGV4Y2VwdCBmb3IgbmFtZXMgc3VmZml4ZWQgYnkgIl9PVVQiLikKLSAqIE5vIGludGVybmFsIHB1bGx1cC9wdWxsZG93biB3aXRob3V0ICJfVVAiIG9yICJfRE9XTiIgc3VmZml4LgotICovCi1NVVhfQ0ZHXzM0WFgoIkFGMjZfMzRYWF9HUElPMCIsIDB4MWUwLAotCQlPTUFQMzRYWF9NVVhfTU9ERTQgfCBPTUFQMzRYWF9QSU5fSU5QVVQpCi1NVVhfQ0ZHXzM0WFgoIkFGMjJfMzRYWF9HUElPOSIsIDB4YTE4LAotCQlPTUFQMzRYWF9NVVhfTU9ERTQgfCBPTUFQMzRYWF9QSU5fSU5QVVQpCi1NVVhfQ0ZHXzM0WFgoIkFHOV8zNFhYX0dQSU8yMyIsIDB4NWVlLAotCQlPTUFQMzRYWF9NVVhfTU9ERTQgfCBPTUFQMzRYWF9QSU5fSU5QVVQpCi1NVVhfQ0ZHXzM0WFgoIkFIOF8zNFhYX0dQSU8yOSIsIDB4NWZhLAotCQlPTUFQMzRYWF9NVVhfTU9ERTQgfCBPTUFQMzRYWF9QSU5fSU5QVVQpCi1NVVhfQ0ZHXzM0WFgoIlU4XzM0WFhfR1BJTzU0X09VVCIsIDB4MGI0LAotCQlPTUFQMzRYWF9NVVhfTU9ERTQgfCBPTUFQMzRYWF9QSU5fT1VUUFVUKQotTVVYX0NGR18zNFhYKCJVOF8zNFhYX0dQSU81NF9ET1dOIiwgMHgwYjQsCi0JCU9NQVAzNFhYX01VWF9NT0RFNCB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMRE9XTikKLU1VWF9DRkdfMzRYWCgiTDhfMzRYWF9HUElPNjMiLCAweDBjZSwKLQkJT01BUDM0WFhfTVVYX01PREU0IHwgT01BUDM0WFhfUElOX0lOUFVUKQotTVVYX0NGR18zNFhYKCJHMjVfMzRYWF9HUElPODZfT1VUIiwgMHgwZmMsCi0JCU9NQVAzNFhYX01VWF9NT0RFNCB8IE9NQVAzNFhYX1BJTl9PVVRQVVQpCi1NVVhfQ0ZHXzM0WFgoIkFHNF8zNFhYX0dQSU8xMzRfT1VUIiwgMHgxNjAsCi0JCU9NQVAzNFhYX01VWF9NT0RFNCB8IE9NQVAzNFhYX1BJTl9PVVRQVVQpCi1NVVhfQ0ZHXzM0WFgoIkFGNF8zNFhYX0dQSU8xMzVfT1VUIiwgMHgxNjIsCi0JCU9NQVAzNFhYX01VWF9NT0RFNCB8IE9NQVAzNFhYX1BJTl9PVVRQVVQpCi1NVVhfQ0ZHXzM0WFgoIkFFNF8zNFhYX0dQSU8xMzZfT1VUIiwgMHgxNjQsCi0JCU9NQVAzNFhYX01VWF9NT0RFNCB8IE9NQVAzNFhYX1BJTl9PVVRQVVQpCi1NVVhfQ0ZHXzM0WFgoIkFGNl8zNFhYX0dQSU8xNDBfVVAiLCAweDE2YywKLQkJT01BUDM0WFhfTVVYX01PREU0IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExVUCkKLU1VWF9DRkdfMzRYWCgiQUU2XzM0WFhfR1BJTzE0MSIsIDB4MTZlLAotCQlPTUFQMzRYWF9NVVhfTU9ERTQgfCBPTUFQMzRYWF9QSU5fSU5QVVQpCi1NVVhfQ0ZHXzM0WFgoIkFGNV8zNFhYX0dQSU8xNDIiLCAweDE3MCwKLQkJT01BUDM0WFhfTVVYX01PREU0IHwgT01BUDM0WFhfUElOX0lOUFVUKQotTVVYX0NGR18zNFhYKCJBRTVfMzRYWF9HUElPMTQzIiwgMHgxNzIsCi0JCU9NQVAzNFhYX01VWF9NT0RFNCB8IE9NQVAzNFhYX1BJTl9JTlBVVCkKLU1VWF9DRkdfMzRYWCgiSDE5XzM0WFhfR1BJTzE2NF9PVVQiLCAweDE5YywKLQkJT01BUDM0WFhfTVVYX01PREU0IHwgT01BUDM0WFhfUElOX09VVFBVVCkKLU1VWF9DRkdfMzRYWCgiSjI1XzM0WFhfR1BJTzE3MCIsIDB4MWM2LAotCQlPTUFQMzRYWF9NVVhfTU9ERTQgfCBPTUFQMzRYWF9QSU5fSU5QVVQpCi0KLS8qIE9NQVAzIFNEUkMgQ0tFIHNpZ25hbHMgdG8gU0RSL0REUiByYW0gY2hpcHMgKi8KLU1VWF9DRkdfMzRYWCgiSDE2XzM0WFhfU0RSQ19DS0UwIiwgMHgyNjIsCi0JCU9NQVAzNFhYX01VWF9NT0RFMCB8IE9NQVAzNFhYX1BJTl9PVVRQVVQpCi1NVVhfQ0ZHXzM0WFgoIkgxN18zNFhYX1NEUkNfQ0tFMSIsIDB4MjY0LAotCQlPTUFQMzRYWF9NVVhfTU9ERTAgfCBPTUFQMzRYWF9QSU5fT1VUUFVUKQotCi0vKiBNTUMxICovCi1NVVhfQ0ZHXzM0WFgoIk4yOF8zNDMwX01NQzFfQ0xLIiwgMHgxNDQsCi0JCU9NQVAzNFhYX01VWF9NT0RFMCB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMVVApCi1NVVhfQ0ZHXzM0WFgoIk0yN18zNDMwX01NQzFfQ01EIiwgMHgxNDYsCi0JCU9NQVAzNFhYX01VWF9NT0RFMCB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMVVApCi1NVVhfQ0ZHXzM0WFgoIk4yN18zNDMwX01NQzFfREFUMCIsIDB4MTQ4LAotCQlPTUFQMzRYWF9NVVhfTU9ERTAgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTFVQKQotTVVYX0NGR18zNFhYKCJOMjZfMzQzMF9NTUMxX0RBVDEiLCAweDE0YSwKLQkJT01BUDM0WFhfTVVYX01PREUwIHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExVUCkKLU1VWF9DRkdfMzRYWCgiTjI1XzM0MzBfTU1DMV9EQVQyIiwgMHgxNGMsCi0JCU9NQVAzNFhYX01VWF9NT0RFMCB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMVVApCi1NVVhfQ0ZHXzM0WFgoIlAyOF8zNDMwX01NQzFfREFUMyIsIDB4MTRlLAotCQlPTUFQMzRYWF9NVVhfTU9ERTAgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTFVQKQotTVVYX0NGR18zNFhYKCJQMjdfMzQzMF9NTUMxX0RBVDQiLCAweDE1MCwKLQkJT01BUDM0WFhfTVVYX01PREUwIHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExVUCkKLU1VWF9DRkdfMzRYWCgiUDI2XzM0MzBfTU1DMV9EQVQ1IiwgMHgxNTIsCi0JCU9NQVAzNFhYX01VWF9NT0RFMCB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMVVApCi1NVVhfQ0ZHXzM0WFgoIlIyN18zNDMwX01NQzFfREFUNiIsIDB4MTU0LAotCQlPTUFQMzRYWF9NVVhfTU9ERTAgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTFVQKQotTVVYX0NGR18zNFhYKCJSMjVfMzQzMF9NTUMxX0RBVDciLCAweDE1NiwKLQkJT01BUDM0WFhfTVVYX01PREUwIHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExVUCkKLQotLyogTU1DMiAqLwotTVVYX0NGR18zNFhYKCJBRTJfMzQzMF9NTUMyX0NMSyIsIDB4MTU4LAotCQlPTUFQMzRYWF9NVVhfTU9ERTAgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTFVQKQotTVVYX0NGR18zNFhYKCJBRzVfMzQzMF9NTUMyX0NNRCIsIDB4MTVBLAotCQlPTUFQMzRYWF9NVVhfTU9ERTAgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTFVQKQotTVVYX0NGR18zNFhYKCJBSDVfMzQzMF9NTUMyX0RBVDAiLCAweDE1YywKLQkJT01BUDM0WFhfTVVYX01PREUwIHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExVUCkKLU1VWF9DRkdfMzRYWCgiQUg0XzM0MzBfTU1DMl9EQVQxIiwgMHgxNWUsCi0JCU9NQVAzNFhYX01VWF9NT0RFMCB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMVVApCi1NVVhfQ0ZHXzM0WFgoIkFHNF8zNDMwX01NQzJfREFUMiIsIDB4MTYwLAotCQlPTUFQMzRYWF9NVVhfTU9ERTAgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTFVQKQotTVVYX0NGR18zNFhYKCJBRjRfMzQzMF9NTUMyX0RBVDMiLCAweDE2MiwKLQkJT01BUDM0WFhfTVVYX01PREUwIHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExVUCkKLU1VWF9DRkdfMzRYWCgiQUU0XzM0MzBfTU1DMl9EQVQ0IiwgMHgxNjQsCi0JCU9NQVAzNFhYX01VWF9NT0RFMCB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMVVApCi1NVVhfQ0ZHXzM0WFgoIkFIM18zNDMwX01NQzJfREFUNSIsIDB4MTY2LAotCQlPTUFQMzRYWF9NVVhfTU9ERTAgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTFVQKQotTVVYX0NGR18zNFhYKCJBRjNfMzQzMF9NTUMyX0RBVDYiLCAweDE2OCwKLQkJT01BUDM0WFhfTVVYX01PREUwIHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExVUCkKLU1VWF9DRkdfMzRYWCgiQUUzXzM0MzBfTU1DMl9EQVQ3IiwgMHgxNkEsCi0JCU9NQVAzNFhYX01VWF9NT0RFMCB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMVVApCi0KLS8qIE1NQzMgKi8KLU1VWF9DRkdfMzRYWCgiQUYxMF8zNDMwX01NQzNfQ0xLIiwgMHg1ZDgsCi0JCU9NQVAzNFhYX01VWF9NT0RFMiB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMVVApCi1NVVhfQ0ZHXzM0WFgoIkFDM18zNDMwX01NQzNfQ01EIiwgMHgxZDAsCi0JCU9NQVAzNFhYX01VWF9NT0RFMyB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMVVApCi1NVVhfQ0ZHXzM0WFgoIkFFMTFfMzQzMF9NTUMzX0RBVDAiLCAweDVlNCwKLQkJT01BUDM0WFhfTVVYX01PREUyIHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExVUCkKLU1VWF9DRkdfMzRYWCgiQUg5XzM0MzBfTU1DM19EQVQxIiwgMHg1ZTYsCi0JCU9NQVAzNFhYX01VWF9NT0RFMiB8IE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMVVApCi1NVVhfQ0ZHXzM0WFgoIkFGMTNfMzQzMF9NTUMzX0RBVDIiLCAweDVlOCwKLQkJT01BUDM0WFhfTVVYX01PREUyIHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExVUCkKLU1VWF9DRkdfMzRYWCgiQUYxM18zNDMwX01NQzNfREFUMyIsIDB4NWUyLAotCQlPTUFQMzRYWF9NVVhfTU9ERTIgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTFVQKQotCi0vKiBTWVNfTklSUSBUMiBJTlQxICovCi1NVVhfQ0ZHXzM0WFgoIkFGMjZfMzRYWF9TWVNfTklSUSIsIDB4MUUwLAotCQlPTUFQM19XQUtFVVBfRU4gfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTFVQIHwKLQkJT01BUDM0WFhfTVVYX01PREUwKQotLyogRUhDSSBHUElPJ3Mgb24gT01BUDNFVk0gKFJldiA+PSBFKSAqLwotTVVYX0NGR18zNFhYKCJBSDE0XzM0WFhfR1BJTzIxIiwgMHg1ZWEsCi0JT01BUDM0WFhfTVVYX01PREU0IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExVUCkKLU1VWF9DRkdfMzRYWCgiQUY5XzM0WFhfR1BJTzIyIiwgMHg1ZWMsCi0JT01BUDM0WFhfTVVYX01PREU0IHwgT01BUDM0WFhfUElOX0lOUFVUX1BVTExVUCkKLU1VWF9DRkdfMzRYWCgiVTNfMzRYWF9HUElPNjEiLCAweDBjOCwKLQlPTUFQMzRYWF9NVVhfTU9ERTQgfCBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTFVQKQotfTsKLQotI2RlZmluZSBPTUFQMzRYWF9QSU5TX1NaCUFSUkFZX1NJWkUob21hcDM0eHhfcGlucykKLQotI2Vsc2UKLSNkZWZpbmUgb21hcDM0eHhfcGlucwkJTlVMTAotI2RlZmluZSBPTUFQMzRYWF9QSU5TX1NaCTAKLSNlbmRpZgkvKiBDT05GSUdfQVJDSF9PTUFQMzRYWCAqLwotCiAjaWYgZGVmaW5lZChDT05GSUdfT01BUF9NVVhfREVCVUcpIHx8IGRlZmluZWQoQ09ORklHX09NQVBfTVVYX1dBUk5JTkdTKQorCiBzdGF0aWMgdm9pZCBfX2luaXRfb3JfbW9kdWxlIG9tYXAyX2NmZ19kZWJ1Zyhjb25zdCBzdHJ1Y3QgcGluX2NvbmZpZyAqY2ZnLCB1MTYgcmVnKQogewogCXUxNiBvcmlnOwogCXU4IHdhcm4gPSAwLCBkZWJ1ZyA9IDA7CiAKLQlpZiAoY3B1X2lzX29tYXAyNHh4KCkpCi0JCW9yaWcgPSBvbWFwX2N0cmxfcmVhZGIoY2ZnLT5tdXhfcmVnKTsKLQllbHNlCi0JCW9yaWcgPSBvbWFwX2N0cmxfcmVhZHcoY2ZnLT5tdXhfcmVnKTsKKwlvcmlnID0gb21hcF9tdXhfcmVhZChjZmctPm11eF9yZWcgLSBPTUFQX01VWF9CQVNFX09GRlNFVCk7CiAKICNpZmRlZglDT05GSUdfT01BUF9NVVhfREVCVUcKIAlkZWJ1ZyA9IGNmZy0+ZGVidWc7CkBAIC02MDAsNyArMzA1LDYgQEAKICNkZWZpbmUgb21hcDJfY2ZnX2RlYnVnKHgsIHkpCWRvIHt9IHdoaWxlICgwKQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjRYWAogc3RhdGljIGludCBfX2luaXRfb3JfbW9kdWxlIG9tYXAyNHh4X2NmZ19yZWcoY29uc3Qgc3RydWN0IHBpbl9jb25maWcgKmNmZykKIHsKIAlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG11eF9zcGluX2xvY2spOwpAQCAtNjE0LDQ3ICszMTgsNjkyIEBACiAJaWYgKGNmZy0+cHVfcGRfdmFsKQogCQlyZWcgfD0gT01BUDJfUFVMTF9VUDsKIAlvbWFwMl9jZmdfZGVidWcoY2ZnLCByZWcpOwotCW9tYXBfY3RybF93cml0ZWIocmVnLCBjZmctPm11eF9yZWcpOworCW9tYXBfbXV4X3dyaXRlKHJlZywgY2ZnLT5tdXhfcmVnIC0gT01BUF9NVVhfQkFTRV9PRkZTRVQpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11eF9zcGluX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwogfQotI2Vsc2UKLSNkZWZpbmUgb21hcDI0eHhfY2ZnX3JlZwlOVUxMCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19BUkNIX09NQVAzNFhYCi1zdGF0aWMgaW50IF9faW5pdF9vcl9tb2R1bGUgb21hcDM0eHhfY2ZnX3JlZyhjb25zdCBzdHJ1Y3QgcGluX2NvbmZpZyAqY2ZnKQotewotCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobXV4X3NwaW5fbG9jayk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MTYgcmVnID0gMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZtdXhfc3Bpbl9sb2NrLCBmbGFncyk7Ci0JcmVnIHw9IGNmZy0+bXV4X3ZhbDsKLQlvbWFwMl9jZmdfZGVidWcoY2ZnLCByZWcpOwotCW9tYXBfY3RybF93cml0ZXcocmVnLCBjZmctPm11eF9yZWcpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11eF9zcGluX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotI2Vsc2UKLSNkZWZpbmUgb21hcDM0eHhfY2ZnX3JlZwlOVUxMCi0jZW5kaWYKIAogaW50IF9faW5pdCBvbWFwMl9tdXhfaW5pdCh2b2lkKQogeworCXUzMiBtdXhfcGJhc2U7CisKKwlpZiAoY3B1X2lzX29tYXAyNDIwKCkpCisJCW11eF9wYmFzZSA9IE9NQVAyNDIwX0NUUkxfQkFTRSArIE9NQVBfTVVYX0JBU0VfT0ZGU0VUOworCWVsc2UgaWYgKGNwdV9pc19vbWFwMjQzMCgpKQorCQltdXhfcGJhc2UgPSBPTUFQMjQzWF9DVFJMX0JBU0UgKyBPTUFQX01VWF9CQVNFX09GRlNFVDsKKwllbHNlCisJCXJldHVybiAtRU5PREVWOworCisJbXV4X2Jhc2UgPSBpb3JlbWFwKG11eF9wYmFzZSwgT01BUF9NVVhfQkFTRV9TWik7CisJaWYgKCFtdXhfYmFzZSkgeworCQlwcmludGsoS0VSTl9FUlIgIm11eDogQ291bGQgbm90IGlvcmVtYXBcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKIAlpZiAoY3B1X2lzX29tYXAyNHh4KCkpIHsKIAkJYXJjaF9tdXhfY2ZnLnBpbnMJPSBvbWFwMjR4eF9waW5zOwogCQlhcmNoX211eF9jZmcuc2l6ZQk9IE9NQVAyNFhYX1BJTlNfU1o7CiAJCWFyY2hfbXV4X2NmZy5jZmdfcmVnCT0gb21hcDI0eHhfY2ZnX3JlZzsKLQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMzR4eCgpKSB7Ci0JCWFyY2hfbXV4X2NmZy5waW5zCT0gb21hcDM0eHhfcGluczsKLQkJYXJjaF9tdXhfY2ZnLnNpemUJPSBPTUFQMzRYWF9QSU5TX1NaOwotCQlhcmNoX211eF9jZmcuY2ZnX3JlZwk9IG9tYXAzNHh4X2NmZ19yZWc7CisKKwkJcmV0dXJuIG9tYXBfbXV4X3JlZ2lzdGVyKCZhcmNoX211eF9jZmcpOwogCX0KIAotCXJldHVybiBvbWFwX211eF9yZWdpc3RlcigmYXJjaF9tdXhfY2ZnKTsKKwlyZXR1cm4gMDsKIH0KIAorI2Vsc2UKK2ludCBfX2luaXQgb21hcDJfbXV4X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgkvKiBDT05GSUdfT01BUF9NVVggKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIENPTkZJR19BUkNIX09NQVAzNFhYCitzdGF0aWMgTElTVF9IRUFEKG11eG1vZGVzKTsKK3N0YXRpYyBERUZJTkVfTVVURVgobXV4bW9kZV9tdXRleCk7CisKKyNpZmRlZiBDT05GSUdfT01BUF9NVVgKKworc3RhdGljIGNoYXIgKm9tYXBfbXV4X29wdGlvbnM7CisKK2ludCBfX2luaXQgb21hcF9tdXhfaW5pdF9ncGlvKGludCBncGlvLCBpbnQgdmFsKQoreworCXN0cnVjdCBvbWFwX211eF9lbnRyeSAqZTsKKwlpbnQgZm91bmQgPSAwOworCisJaWYgKCFncGlvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZSwgJm11eG1vZGVzLCBub2RlKSB7CisJCXN0cnVjdCBvbWFwX211eCAqbSA9ICZlLT5tdXg7CisJCWlmIChncGlvID09IG0tPmdwaW8pIHsKKwkJCXUxNiBvbGRfbW9kZTsKKwkJCXUxNiBtdXhfbW9kZTsKKworCQkJb2xkX21vZGUgPSBvbWFwX211eF9yZWFkKG0tPnJlZ19vZmZzZXQpOworCQkJbXV4X21vZGUgPSB2YWwgJiB+KE9NQVBfTVVYX05SX01PREVTIC0gMSk7CisJCQltdXhfbW9kZSB8PSBPTUFQX01VWF9NT0RFNDsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJtdXg6IFNldHRpbmcgc2lnbmFsICIKKwkJCQkiJXMuZ3BpbyVpIDB4JTA0eCAtPiAweCUwNHhcbiIsCisJCQkJbS0+bXV4bmFtZXNbMF0sIGdwaW8sIG9sZF9tb2RlLCBtdXhfbW9kZSk7CisJCQlvbWFwX211eF93cml0ZShtdXhfbW9kZSwgbS0+cmVnX29mZnNldCk7CisJCQlmb3VuZCsrOworCQl9CisJfQorCisJaWYgKGZvdW5kID09IDEpCisJCXJldHVybiAwOworCisJaWYgKGZvdW5kID4gMSkgeworCQlwcmludGsoS0VSTl9FUlIgIm11eDogTXVsdGlwbGUgZ3BpbyBwYXRocyBmb3IgZ3BpbyVpXG4iLCBncGlvKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJpbnRrKEtFUk5fRVJSICJtdXg6IENvdWxkIG5vdCBzZXQgZ3BpbyVpXG4iLCBncGlvKTsKKworCXJldHVybiAtRU5PREVWOworfQorCitpbnQgX19pbml0IG9tYXBfbXV4X2luaXRfc2lnbmFsKGNoYXIgKm11eG5hbWUsIGludCB2YWwpCit7CisJc3RydWN0IG9tYXBfbXV4X2VudHJ5ICplOworCWNoYXIgKm0wX25hbWUgPSBOVUxMLCAqbW9kZV9uYW1lID0gTlVMTDsKKwlpbnQgZm91bmQgPSAwOworCisJbW9kZV9uYW1lID0gc3RyY2hyKG11eG5hbWUsICcuJyk7CisJaWYgKG1vZGVfbmFtZSkgeworCQkqbW9kZV9uYW1lID0gJ1wwJzsKKwkJbW9kZV9uYW1lKys7CisJCW0wX25hbWUgPSBtdXhuYW1lOworCX0gZWxzZSB7CisJCW1vZGVfbmFtZSA9IG11eG5hbWU7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlLCAmbXV4bW9kZXMsIG5vZGUpIHsKKwkJc3RydWN0IG9tYXBfbXV4ICptID0gJmUtPm11eDsKKwkJY2hhciAqbTBfZW50cnkgPSBtLT5tdXhuYW1lc1swXTsKKwkJaW50IGk7CisKKwkJaWYgKG0wX25hbWUgJiYgc3RyY21wKG0wX25hbWUsIG0wX2VudHJ5KSkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoaSA9IDA7IGkgPCBPTUFQX01VWF9OUl9NT0RFUzsgaSsrKSB7CisJCQljaGFyICptb2RlX2N1ciA9IG0tPm11eG5hbWVzW2ldOworCisJCQlpZiAoIW1vZGVfY3VyKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoIXN0cmNtcChtb2RlX25hbWUsIG1vZGVfY3VyKSkgeworCQkJCXUxNiBvbGRfbW9kZTsKKwkJCQl1MTYgbXV4X21vZGU7CisKKwkJCQlvbGRfbW9kZSA9IG9tYXBfbXV4X3JlYWQobS0+cmVnX29mZnNldCk7CisJCQkJbXV4X21vZGUgPSB2YWwgfCBpOworCQkJCXByaW50ayhLRVJOX0RFQlVHICJtdXg6IFNldHRpbmcgc2lnbmFsICIKKwkJCQkJIiVzLiVzIDB4JTA0eCAtPiAweCUwNHhcbiIsCisJCQkJCW0wX2VudHJ5LCBtdXhuYW1lLCBvbGRfbW9kZSwgbXV4X21vZGUpOworCQkJCW9tYXBfbXV4X3dyaXRlKG11eF9tb2RlLCBtLT5yZWdfb2Zmc2V0KTsKKwkJCQlmb3VuZCsrOworCQkJfQorCQl9CisJfQorCisJaWYgKGZvdW5kID09IDEpCisJCXJldHVybiAwOworCisJaWYgKGZvdW5kID4gMSkgeworCQlwcmludGsoS0VSTl9FUlIgIm11eDogTXVsdGlwbGUgc2lnbmFsIHBhdGhzICglaSkgZm9yICVzXG4iLAorCQkJCWZvdW5kLCBtdXhuYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJpbnRrKEtFUk5fRVJSICJtdXg6IENvdWxkIG5vdCBzZXQgc2lnbmFsICVzXG4iLCBtdXhuYW1lKTsKKworCXJldHVybiAtRU5PREVWOworfQorCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCisKKyNkZWZpbmUgT01BUF9NVVhfTUFYX05SX0ZMQUdTCTEwCisjZGVmaW5lIE9NQVBfTVVYX1RFU1RfRkxBRyh2YWwsIG1hc2spCQkJCVwKKwlpZiAoKCh2YWwpICYgKG1hc2spKSA9PSAobWFzaykpIHsJCQlcCisJCWkrKzsJCQkJCQlcCisJCWZsYWdzW2ldID0gICNtYXNrOwkJCQlcCisJfQorCisvKiBSRVZJU0lUOiBBZGQgY2hlY2tpbmcgZm9yIG5vbi1vcHRpbWFsIG11eCBzZXR0aW5ncyAqLworc3RhdGljIGlubGluZSB2b2lkIG9tYXBfbXV4X2RlY29kZShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHUxNiB2YWwpCit7CisJY2hhciAqZmxhZ3NbT01BUF9NVVhfTUFYX05SX0ZMQUdTXTsKKwljaGFyIG1vZGVbMTRdOworCWludCBpID0gLTE7CisKKwlzcHJpbnRmKG1vZGUsICJPTUFQX01VWF9NT0RFJWQiLCB2YWwgJiAweDcpOworCWkrKzsKKwlmbGFnc1tpXSA9IG1vZGU7CisKKwlPTUFQX01VWF9URVNUX0ZMQUcodmFsLCBPTUFQX1BJTl9PRkZfV0FLRVVQRU5BQkxFKTsKKwlpZiAodmFsICYgT01BUF9PRkZfRU4pIHsKKwkJaWYgKCEodmFsICYgT01BUF9PRkZPVVRfRU4pKSB7CisJCQlpZiAoISh2YWwgJiBPTUFQX09GRl9QVUxMX1VQKSkgeworCQkJCU9NQVBfTVVYX1RFU1RfRkxBRyh2YWwsCisJCQkJCU9NQVBfUElOX09GRl9JTlBVVF9QVUxMRE9XTik7CisJCQl9IGVsc2UgeworCQkJCU9NQVBfTVVYX1RFU1RfRkxBRyh2YWwsCisJCQkJCU9NQVBfUElOX09GRl9JTlBVVF9QVUxMVVApOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCEodmFsICYgT01BUF9PRkZPVVRfVkFMKSkgeworCQkJCU9NQVBfTVVYX1RFU1RfRkxBRyh2YWwsCisJCQkJCU9NQVBfUElOX09GRl9PVVRQVVRfTE9XKTsKKwkJCX0gZWxzZSB7CisJCQkJT01BUF9NVVhfVEVTVF9GTEFHKHZhbCwKKwkJCQkJT01BUF9QSU5fT0ZGX09VVFBVVF9ISUdIKTsKKwkJCX0KKwkJfQorCX0KKworCWlmICh2YWwgJiBPTUFQX0lOUFVUX0VOKSB7CisJCWlmICh2YWwgJiBPTUFQX1BVTExfRU5BKSB7CisJCQlpZiAoISh2YWwgJiBPTUFQX1BVTExfVVApKSB7CisJCQkJT01BUF9NVVhfVEVTVF9GTEFHKHZhbCwKKwkJCQkJT01BUF9QSU5fSU5QVVRfUFVMTERPV04pOworCQkJfSBlbHNlIHsKKwkJCQlPTUFQX01VWF9URVNUX0ZMQUcodmFsLCBPTUFQX1BJTl9JTlBVVF9QVUxMVVApOworCQkJfQorCQl9IGVsc2UgeworCQkJT01BUF9NVVhfVEVTVF9GTEFHKHZhbCwgT01BUF9QSU5fSU5QVVQpOworCQl9CisJfSBlbHNlIHsKKwkJaSsrOworCQlmbGFnc1tpXSA9ICJPTUFQX1BJTl9PVVRQVVQiOworCX0KKworCWRvIHsKKwkJc2VxX3ByaW50ZihzLCAiJXMiLCBmbGFnc1tpXSk7CisJCWlmIChpID4gMCkKKwkJCXNlcV9wcmludGYocywgIiB8ICIpOworCX0gd2hpbGUgKGktLSA+IDApOworfQorCisjZGVmaW5lIE9NQVBfTVVYX0RFRk5BTUVfTEVOCTE2CisKK3N0YXRpYyBpbnQgb21hcF9tdXhfZGJnX2JvYXJkX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp1bnVzZWQpCit7CisJc3RydWN0IG9tYXBfbXV4X2VudHJ5ICplOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlLCAmbXV4bW9kZXMsIG5vZGUpIHsKKwkJc3RydWN0IG9tYXBfbXV4ICptID0gJmUtPm11eDsKKwkJY2hhciBtMF9kZWZbT01BUF9NVVhfREVGTkFNRV9MRU5dOworCQljaGFyICptMF9uYW1lID0gbS0+bXV4bmFtZXNbMF07CisJCXUxNiB2YWw7CisJCWludCBpLCBtb2RlOworCisJCWlmICghbTBfbmFtZSkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoaSA9IDA7IGkgPCBPTUFQX01VWF9ERUZOQU1FX0xFTjsgaSsrKSB7CisJCQlpZiAobTBfbmFtZVtpXSA9PSAnXDAnKSB7CisJCQkJbTBfZGVmW2ldID0gbTBfbmFtZVtpXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW0wX2RlZltpXSA9IHRvdXBwZXIobTBfbmFtZVtpXSk7CisJCX0KKwkJdmFsID0gb21hcF9tdXhfcmVhZChtLT5yZWdfb2Zmc2V0KTsKKwkJbW9kZSA9IHZhbCAmIE9NQVBfTVVYX01PREU3OworCisJCXNlcV9wcmludGYocywgIk9NQVAlaV9NVVgoJXMsICIsCisJCQkJCWNwdV9pc19vbWFwMzR4eCgpID8gMyA6IDAsIG0wX2RlZik7CisJCW9tYXBfbXV4X2RlY29kZShzLCB2YWwpOworCQlzZXFfcHJpbnRmKHMsICIpLFxuIik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9tdXhfZGJnX2JvYXJkX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIG9tYXBfbXV4X2RiZ19ib2FyZF9zaG93LCAmaW5vZGUtPmlfcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG9tYXBfbXV4X2RiZ19ib2FyZF9mb3BzID0geworCS5vcGVuCQk9IG9tYXBfbXV4X2RiZ19ib2FyZF9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IG9tYXBfbXV4X2RiZ19zaWduYWxfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnVudXNlZCkKK3sKKwlzdHJ1Y3Qgb21hcF9tdXggKm0gPSBzLT5wcml2YXRlOworCWNvbnN0IGNoYXIgKm5vbmUgPSAiTkEiOworCXUxNiB2YWw7CisJaW50IG1vZGU7CisKKwl2YWwgPSBvbWFwX211eF9yZWFkKG0tPnJlZ19vZmZzZXQpOworCW1vZGUgPSB2YWwgJiBPTUFQX01VWF9NT0RFNzsKKworCXNlcV9wcmludGYocywgIm5hbWU6ICVzLiVzICgweCUwOGx4LzB4JTAzeCA9IDB4JTA0eCksIGIgJXMsIHQgJXNcbiIsCisJCQltLT5tdXhuYW1lc1swXSwgbS0+bXV4bmFtZXNbbW9kZV0sCisJCQltdXhfcGh5cyArIG0tPnJlZ19vZmZzZXQsIG0tPnJlZ19vZmZzZXQsIHZhbCwKKwkJCW0tPmJhbGxzWzBdID8gbS0+YmFsbHNbMF0gOiBub25lLAorCQkJbS0+YmFsbHNbMV0gPyBtLT5iYWxsc1sxXSA6IG5vbmUpOworCXNlcV9wcmludGYocywgIm1vZGU6ICIpOworCW9tYXBfbXV4X2RlY29kZShzLCB2YWwpOworCXNlcV9wcmludGYocywgIlxuIik7CisJc2VxX3ByaW50ZihzLCAic2lnbmFsczogJXMgfCAlcyB8ICVzIHwgJXMgfCAlcyB8ICVzIHwgJXMgfCAlc1xuIiwKKwkJCW0tPm11eG5hbWVzWzBdID8gbS0+bXV4bmFtZXNbMF0gOiBub25lLAorCQkJbS0+bXV4bmFtZXNbMV0gPyBtLT5tdXhuYW1lc1sxXSA6IG5vbmUsCisJCQltLT5tdXhuYW1lc1syXSA/IG0tPm11eG5hbWVzWzJdIDogbm9uZSwKKwkJCW0tPm11eG5hbWVzWzNdID8gbS0+bXV4bmFtZXNbM10gOiBub25lLAorCQkJbS0+bXV4bmFtZXNbNF0gPyBtLT5tdXhuYW1lc1s0XSA6IG5vbmUsCisJCQltLT5tdXhuYW1lc1s1XSA/IG0tPm11eG5hbWVzWzVdIDogbm9uZSwKKwkJCW0tPm11eG5hbWVzWzZdID8gbS0+bXV4bmFtZXNbNl0gOiBub25lLAorCQkJbS0+bXV4bmFtZXNbN10gPyBtLT5tdXhuYW1lc1s3XSA6IG5vbmUpOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT01BUF9NVVhfTUFYX0FSR19DSEFSICA3CisKK3N0YXRpYyBzc2l6ZV90IG9tYXBfbXV4X2RiZ19zaWduYWxfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCQljb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyIGJ1ZltPTUFQX01VWF9NQVhfQVJHX0NIQVJdOworCXN0cnVjdCBzZXFfZmlsZSAqc2VxZjsKKwlzdHJ1Y3Qgb21hcF9tdXggKm07CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IGJ1Zl9zaXplLCByZXQ7CisKKwlpZiAoY291bnQgPiBPTUFQX01VWF9NQVhfQVJHX0NIQVIpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCWJ1Zl9zaXplID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtIDEpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGJ1Zl9zaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDB4MTAsICZ2YWwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKHZhbCA+IDB4ZmZmZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzZXFmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCW0gPSBzZXFmLT5wcml2YXRlOworCisJb21hcF9tdXhfd3JpdGUoKHUxNil2YWwsIG0tPnJlZ19vZmZzZXQpOworCSpwcG9zICs9IGNvdW50OworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IG9tYXBfbXV4X2RiZ19zaWduYWxfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgb21hcF9tdXhfZGJnX3NpZ25hbF9zaG93LCBpbm9kZS0+aV9wcml2YXRlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb21hcF9tdXhfZGJnX3NpZ25hbF9mb3BzID0geworCS5vcGVuCQk9IG9tYXBfbXV4X2RiZ19zaWduYWxfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkud3JpdGUJCT0gb21hcF9tdXhfZGJnX3NpZ25hbF93cml0ZSwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKm11eF9kYmdfZGlyOworCitzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9tdXhfZGJnX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3Qgb21hcF9tdXhfZW50cnkgKmU7CisKKwltdXhfZGJnX2RpciA9IGRlYnVnZnNfY3JlYXRlX2Rpcigib21hcF9tdXgiLCBOVUxMKTsKKwlpZiAoIW11eF9kYmdfZGlyKQorCQlyZXR1cm47CisKKwkodm9pZClkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJib2FyZCIsIFNfSVJVR08sIG11eF9kYmdfZGlyLAorCQkJCQlOVUxMLCAmb21hcF9tdXhfZGJnX2JvYXJkX2ZvcHMpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlLCAmbXV4bW9kZXMsIG5vZGUpIHsKKwkJc3RydWN0IG9tYXBfbXV4ICptID0gJmUtPm11eDsKKworCQkodm9pZClkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG0tPm11eG5hbWVzWzBdLCBTX0lXVUdPLCBtdXhfZGJnX2RpciwKKwkJCQkJbSwgJm9tYXBfbXV4X2RiZ19zaWduYWxfZm9wcyk7CisJfQorfQorCisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIG9tYXBfbXV4X2RiZ19pbml0KHZvaWQpCit7Cit9CisjZW5kaWYJLyogQ09ORklHX0RFQlVHX0ZTICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwX211eF9mcmVlX25hbWVzKHN0cnVjdCBvbWFwX211eCAqbSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBPTUFQX01VWF9OUl9NT0RFUzsgaSsrKQorCQlrZnJlZShtLT5tdXhuYW1lc1tpXSk7CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKwlmb3IgKGkgPSAwOyBpIDwgT01BUF9NVVhfTlJfU0lERVM7IGkrKykKKwkJa2ZyZWUobS0+YmFsbHNbaV0pOwogI2VuZGlmCisKK30KKworLyogRnJlZSBhbGwgZGF0YSBleGNlcHQgZm9yIEdQSU8gcGlucyB1bmxlc3MgQ09ORklHX0RFQlVHX0ZTIGlzIHNldCAqLworc3RhdGljIGludCBfX2luaXQgb21hcF9tdXhfbGF0ZV9pbml0KHZvaWQpCit7CisJc3RydWN0IG9tYXBfbXV4X2VudHJ5ICplLCAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGUsIHRtcCwgJm11eG1vZGVzLCBub2RlKSB7CisJCXN0cnVjdCBvbWFwX211eCAqbSA9ICZlLT5tdXg7CisJCXUxNiBtb2RlID0gb21hcF9tdXhfcmVhZChtLT5yZWdfb2Zmc2V0KTsKKworCQlpZiAoT01BUF9NT0RFX0dQSU8obW9kZSkpCisJCQljb250aW51ZTsKKworI2lmbmRlZiBDT05GSUdfREVCVUdfRlMKKwkJbXV0ZXhfbG9jaygmbXV4bW9kZV9tdXRleCk7CisJCWxpc3RfZGVsKCZlLT5ub2RlKTsKKwkJbXV0ZXhfdW5sb2NrKCZtdXhtb2RlX211dGV4KTsKKwkJb21hcF9tdXhfZnJlZV9uYW1lcyhtKTsKKwkJa2ZyZWUobSk7CisjZW5kaWYKKworCX0KKworCW9tYXBfbXV4X2RiZ19pbml0KCk7CisKKwlyZXR1cm4gMDsKK30KK2xhdGVfaW5pdGNhbGwob21hcF9tdXhfbGF0ZV9pbml0KTsKKworc3RhdGljIHZvaWQgX19pbml0IG9tYXBfbXV4X3BhY2thZ2VfZml4dXAoc3RydWN0IG9tYXBfbXV4ICpwLAorCQkJCQlzdHJ1Y3Qgb21hcF9tdXggKnN1cGVyc2V0KQoreworCXdoaWxlIChwLT5yZWdfb2Zmc2V0ICE9ICBPTUFQX01VWF9URVJNSU5BVE9SKSB7CisJCXN0cnVjdCBvbWFwX211eCAqcyA9IHN1cGVyc2V0OworCQlpbnQgZm91bmQgPSAwOworCisJCXdoaWxlIChzLT5yZWdfb2Zmc2V0ICE9IE9NQVBfTVVYX1RFUk1JTkFUT1IpIHsKKwkJCWlmIChzLT5yZWdfb2Zmc2V0ID09IHAtPnJlZ19vZmZzZXQpIHsKKwkJCQkqcyA9ICpwOworCQkJCWZvdW5kKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzKys7CisJCX0KKwkJaWYgKCFmb3VuZCkKKwkJCXByaW50ayhLRVJOX0VSUiAibXV4OiBVbmtub3duIGVudHJ5IG9mZnNldCAweCV4XG4iLAorCQkJCQlwLT5yZWdfb2Zmc2V0KTsKKwkJcCsrOworCX0KK30KKworI2lmZGVmIENPTkZJR19ERUJVR19GUworCitzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9tdXhfcGFja2FnZV9pbml0X2JhbGxzKHN0cnVjdCBvbWFwX2JhbGwgKmIsCisJCQkJc3RydWN0IG9tYXBfbXV4ICpzdXBlcnNldCkKK3sKKwl3aGlsZSAoYi0+cmVnX29mZnNldCAhPSBPTUFQX01VWF9URVJNSU5BVE9SKSB7CisJCXN0cnVjdCBvbWFwX211eCAqcyA9IHN1cGVyc2V0OworCQlpbnQgZm91bmQgPSAwOworCisJCXdoaWxlIChzLT5yZWdfb2Zmc2V0ICE9IE9NQVBfTVVYX1RFUk1JTkFUT1IpIHsKKwkJCWlmIChzLT5yZWdfb2Zmc2V0ID09IGItPnJlZ19vZmZzZXQpIHsKKwkJCQlzLT5iYWxsc1swXSA9IGItPmJhbGxzWzBdOworCQkJCXMtPmJhbGxzWzFdID0gYi0+YmFsbHNbMV07CisJCQkJZm91bmQrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXMrKzsKKwkJfQorCQlpZiAoIWZvdW5kKQorCQkJcHJpbnRrKEtFUk5fRVJSICJtdXg6IFVua25vd24gYmFsbCBvZmZzZXQgMHgleFxuIiwKKwkJCQkJYi0+cmVnX29mZnNldCk7CisJCWIrKzsKKwl9Cit9CisKKyNlbHNlCS8qIENPTkZJR19ERUJVR19GUyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcF9tdXhfcGFja2FnZV9pbml0X2JhbGxzKHN0cnVjdCBvbWFwX2JhbGwgKmIsCisJCQkJCXN0cnVjdCBvbWFwX211eCAqc3VwZXJzZXQpCit7Cit9CisKKyNlbmRpZgkvKiBDT05GSUdfREVCVUdfRlMgKi8KKworc3RhdGljIGludCBfX2luaXQgb21hcF9tdXhfc2V0dXAoY2hhciAqb3B0aW9ucykKK3sKKwlpZiAoIW9wdGlvbnMpCisJCXJldHVybiAwOworCisJb21hcF9tdXhfb3B0aW9ucyA9IG9wdGlvbnM7CisKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoIm9tYXBfbXV4PSIsIG9tYXBfbXV4X3NldHVwKTsKKworLyoKKyAqIE5vdGUgdGhhdCB0aGUgb21hcF9tdXg9c29tZS5zaWduYWwxPTB4MTIzNCxzb21lLnNpZ25hbDI9MHgxMjM0CisgKiBjbWRsaW5lIG9wdGlvbnMgb25seSBvdmVycmlkZSB0aGUgYm9vdGxvYWRlciB2YWx1ZXMuCisgKiBEdXJpbmcgZGV2ZWxvcG1lbnQsIHBsZWFzZSBlbmFibGUgQ09ORklHX0RFQlVHX0ZTLCBhbmQgdXNlIHRoZQorICogc2lnbmFsIHNwZWNpZmljIGVudHJpZXMgdW5kZXIgZGVidWdmcy4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IG9tYXBfbXV4X3NldF9jbWRsaW5lX3NpZ25hbHModm9pZCkKK3sKKwljaGFyICpvcHRpb25zLCAqbmV4dF9vcHQsICp0b2tlbjsKKworCWlmICghb21hcF9tdXhfb3B0aW9ucykKKwkJcmV0dXJuOworCisJb3B0aW9ucyA9IGttYWxsb2Moc3RybGVuKG9tYXBfbXV4X29wdGlvbnMpICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvcHRpb25zKQorCQlyZXR1cm47CisKKwlzdHJjcHkob3B0aW9ucywgb21hcF9tdXhfb3B0aW9ucyk7CisJbmV4dF9vcHQgPSBvcHRpb25zOworCisJd2hpbGUgKCh0b2tlbiA9IHN0cnNlcCgmbmV4dF9vcHQsICIsIikpICE9IE5VTEwpIHsKKwkJY2hhciAqa2V5dmFsLCAqbmFtZTsKKwkJdW5zaWduZWQgbG9uZyB2YWw7CisKKwkJa2V5dmFsID0gdG9rZW47CisJCW5hbWUgPSBzdHJzZXAoJmtleXZhbCwgIj0iKTsKKwkJaWYgKG5hbWUpIHsKKwkJCWludCByZXM7CisKKwkJCXJlcyA9IHN0cmljdF9zdHJ0b3VsKGtleXZhbCwgMHgxMCwgJnZhbCk7CisJCQlpZiAocmVzIDwgMCkKKwkJCQljb250aW51ZTsKKworCQkJb21hcF9tdXhfaW5pdF9zaWduYWwobmFtZSwgKHUxNil2YWwpOworCQl9CisJfQorCisJa2ZyZWUob3B0aW9ucyk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwX211eF9zZXRfYm9hcmRfc2lnbmFscyhzdHJ1Y3Qgb21hcF9ib2FyZF9tdXggKmJvYXJkX211eCkKK3sKKwl3aGlsZSAoYm9hcmRfbXV4LT5yZWdfb2Zmc2V0ICE9ICBPTUFQX01VWF9URVJNSU5BVE9SKSB7CisJCW9tYXBfbXV4X3dyaXRlKGJvYXJkX211eC0+dmFsdWUsIGJvYXJkX211eC0+cmVnX29mZnNldCk7CisJCWJvYXJkX211eCsrOworCX0KK30KKworc3RhdGljIGludCBfX2luaXQgb21hcF9tdXhfY29weV9uYW1lcyhzdHJ1Y3Qgb21hcF9tdXggKnNyYywKKwkJCQkJc3RydWN0IG9tYXBfbXV4ICpkc3QpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgT01BUF9NVVhfTlJfTU9ERVM7IGkrKykgeworCQlpZiAoc3JjLT5tdXhuYW1lc1tpXSkgeworCQkJZHN0LT5tdXhuYW1lc1tpXSA9CisJCQkJa21hbGxvYyhzdHJsZW4oc3JjLT5tdXhuYW1lc1tpXSkgKyAxLAorCQkJCQlHRlBfS0VSTkVMKTsKKwkJCWlmICghZHN0LT5tdXhuYW1lc1tpXSkKKwkJCQlnb3RvIGZyZWU7CisJCQlzdHJjcHkoZHN0LT5tdXhuYW1lc1tpXSwgc3JjLT5tdXhuYW1lc1tpXSk7CisJCX0KKwl9CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKwlmb3IgKGkgPSAwOyBpIDwgT01BUF9NVVhfTlJfU0lERVM7IGkrKykgeworCQlpZiAoc3JjLT5iYWxsc1tpXSkgeworCQkJZHN0LT5iYWxsc1tpXSA9CisJCQkJa21hbGxvYyhzdHJsZW4oc3JjLT5iYWxsc1tpXSkgKyAxLAorCQkJCQlHRlBfS0VSTkVMKTsKKwkJCWlmICghZHN0LT5iYWxsc1tpXSkKKwkJCQlnb3RvIGZyZWU7CisJCQlzdHJjcHkoZHN0LT5iYWxsc1tpXSwgc3JjLT5iYWxsc1tpXSk7CisJCX0KKwl9CisjZW5kaWYKKworCXJldHVybiAwOworCitmcmVlOgorCW9tYXBfbXV4X2ZyZWVfbmFtZXMoZHN0KTsKKwlyZXR1cm4gLUVOT01FTTsKKworfQorCisjZW5kaWYJLyogQ09ORklHX09NQVBfTVVYICovCisKK3N0YXRpYyB1MTYgb21hcF9tdXhfZ2V0X2J5X2dwaW8oaW50IGdwaW8pCit7CisJc3RydWN0IG9tYXBfbXV4X2VudHJ5ICplOworCXUxNiBvZmZzZXQgPSBPTUFQX01VWF9URVJNSU5BVE9SOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlLCAmbXV4bW9kZXMsIG5vZGUpIHsKKwkJc3RydWN0IG9tYXBfbXV4ICptID0gJmUtPm11eDsKKwkJaWYgKG0tPmdwaW8gPT0gZ3BpbykgeworCQkJb2Zmc2V0ID0gbS0+cmVnX29mZnNldDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIG9mZnNldDsKK30KKworLyogTmVlZGVkIGZvciBkeW5hbWljIG11eGluZyBvZiBHUElPIHBpbnMgZm9yIG9mZi1pZGxlICovCit1MTYgb21hcF9tdXhfZ2V0X2dwaW8oaW50IGdwaW8pCit7CisJdTE2IG9mZnNldDsKKworCW9mZnNldCA9IG9tYXBfbXV4X2dldF9ieV9ncGlvKGdwaW8pOworCWlmIChvZmZzZXQgPT0gT01BUF9NVVhfVEVSTUlOQVRPUikgeworCQlwcmludGsoS0VSTl9FUlIgIm11eDogQ291bGQgbm90IGdldCBncGlvJWlcbiIsIGdwaW8pOworCQlyZXR1cm4gb2Zmc2V0OworCX0KKworCXJldHVybiBvbWFwX211eF9yZWFkKG9mZnNldCk7Cit9CisKKy8qIE5lZWRlZCBmb3IgZHluYW1pYyBtdXhpbmcgb2YgR1BJTyBwaW5zIGZvciBvZmYtaWRsZSAqLwordm9pZCBvbWFwX211eF9zZXRfZ3Bpbyh1MTYgdmFsLCBpbnQgZ3BpbykKK3sKKwl1MTYgb2Zmc2V0OworCisJb2Zmc2V0ID0gb21hcF9tdXhfZ2V0X2J5X2dwaW8oZ3Bpbyk7CisJaWYgKG9mZnNldCA9PSBPTUFQX01VWF9URVJNSU5BVE9SKSB7CisJCXByaW50ayhLRVJOX0VSUiAibXV4OiBDb3VsZCBub3Qgc2V0IGdwaW8laVxuIiwgZ3Bpbyk7CisJCXJldHVybjsKKwl9CisKKwlvbWFwX211eF93cml0ZSh2YWwsIG9mZnNldCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9tdXggKiBfX2luaXQgb21hcF9tdXhfbGlzdF9hZGQoc3RydWN0IG9tYXBfbXV4ICpzcmMpCit7CisJc3RydWN0IG9tYXBfbXV4X2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3Qgb21hcF9tdXggKm07CisKKwllbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBvbWFwX211eF9lbnRyeSksIEdGUF9LRVJORUwpOworCWlmICghZW50cnkpCisJCXJldHVybiBOVUxMOworCisJbSA9ICZlbnRyeS0+bXV4OworCW1lbWNweShtLCBzcmMsIHNpemVvZihzdHJ1Y3Qgb21hcF9tdXhfZW50cnkpKTsKKworI2lmZGVmIENPTkZJR19PTUFQX01VWAorCWlmIChvbWFwX211eF9jb3B5X25hbWVzKHNyYywgbSkpIHsKKwkJa2ZyZWUoZW50cnkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisjZW5kaWYKKworCW11dGV4X2xvY2soJm11eG1vZGVfbXV0ZXgpOworCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5ub2RlLCAmbXV4bW9kZXMpOworCW11dGV4X3VubG9jaygmbXV4bW9kZV9tdXRleCk7CisKKwlyZXR1cm4gbTsKK30KKworLyoKKyAqIE5vdGUgaWYgQ09ORklHX09NQVBfTVVYIGlzIG5vdCBzZWxlY3RlZCwgd2Ugd2lsbCBvbmx5IGluaXRpYWxpemUKKyAqIHRoZSBHUElPIHRvIG11eCBvZmZzZXQgbWFwcGluZyB0aGF0IGlzIG5lZWRlZCBmb3IgZHluYW1pYyBtdXhpbmcKKyAqIG9mIEdQSU8gcGlucyBmb3Igb2ZmLWlkbGUuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwX211eF9pbml0X2xpc3Qoc3RydWN0IG9tYXBfbXV4ICpzdXBlcnNldCkKK3sKKwl3aGlsZSAoc3VwZXJzZXQtPnJlZ19vZmZzZXQgIT0gIE9NQVBfTVVYX1RFUk1JTkFUT1IpIHsKKwkJc3RydWN0IG9tYXBfbXV4ICplbnRyeTsKKworI2lmbmRlZiBDT05GSUdfT01BUF9NVVgKKwkJLyogU2tpcCBwaW5zIHRoYXQgYXJlIG5vdCBtdXhlZCBhcyBHUElPIGJ5IGJvb3Rsb2FkZXIgKi8KKwkJaWYgKCFPTUFQX01PREVfR1BJTyhvbWFwX211eF9yZWFkKHN1cGVyc2V0LT5yZWdfb2Zmc2V0KSkpIHsKKwkJCXN1cGVyc2V0Kys7CisJCQljb250aW51ZTsKKwkJfQorI2VuZGlmCisKKwkJZW50cnkgPSBvbWFwX211eF9saXN0X2FkZChzdXBlcnNldCk7CisJCWlmICghZW50cnkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAibXV4OiBDb3VsZCBub3QgYWRkIGVudHJ5XG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlzdXBlcnNldCsrOworCX0KK30KKworaW50IF9faW5pdCBvbWFwX211eF9pbml0KHUzMiBtdXhfcGJhc2UsIHUzMiBtdXhfc2l6ZSwKKwkJCQlzdHJ1Y3Qgb21hcF9tdXggKnN1cGVyc2V0LAorCQkJCXN0cnVjdCBvbWFwX211eCAqcGFja2FnZV9zdWJzZXQsCisJCQkJc3RydWN0IG9tYXBfYm9hcmRfbXV4ICpib2FyZF9tdXgsCisJCQkJc3RydWN0IG9tYXBfYmFsbCAqcGFja2FnZV9iYWxscykKK3sKKwlpZiAobXV4X2Jhc2UpCisJCXJldHVybiAtRUJVU1k7CisKKwltdXhfcGh5cyA9IG11eF9wYmFzZTsKKwltdXhfYmFzZSA9IGlvcmVtYXAobXV4X3BiYXNlLCBtdXhfc2l6ZSk7CisJaWYgKCFtdXhfYmFzZSkgeworCQlwcmludGsoS0VSTl9FUlIgIm11eDogQ291bGQgbm90IGlvcmVtYXBcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKyNpZmRlZiBDT05GSUdfT01BUF9NVVgKKwlvbWFwX211eF9wYWNrYWdlX2ZpeHVwKHBhY2thZ2Vfc3Vic2V0LCBzdXBlcnNldCk7CisJb21hcF9tdXhfcGFja2FnZV9pbml0X2JhbGxzKHBhY2thZ2VfYmFsbHMsIHN1cGVyc2V0KTsKKwlvbWFwX211eF9zZXRfY21kbGluZV9zaWduYWxzKCk7CisJb21hcF9tdXhfc2V0X2JvYXJkX3NpZ25hbHMoYm9hcmRfbXV4KTsKKyNlbmRpZgorCisJb21hcF9tdXhfaW5pdF9saXN0KHN1cGVyc2V0KTsKKworCXJldHVybiAwOworfQorCisjZW5kaWYJLyogQ09ORklHX0FSQ0hfT01BUDM0WFggKi8KKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9tdXguaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhiNGQ1YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvbXV4LmgKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTm9raWEKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgIm11eDM0eHguaCIKKworI2RlZmluZSBPTUFQX01VWF9URVJNSU5BVE9SCTB4ZmZmZgorCisvKiAzNHh4IG11eCBtb2RlIG9wdGlvbnMgZm9yIGVhY2ggcGluLiBTZWUgVFJNIGZvciBvcHRpb25zICovCisjZGVmaW5lIE9NQVBfTVVYX01PREUwICAgICAgMAorI2RlZmluZSBPTUFQX01VWF9NT0RFMSAgICAgIDEKKyNkZWZpbmUgT01BUF9NVVhfTU9ERTIgICAgICAyCisjZGVmaW5lIE9NQVBfTVVYX01PREUzICAgICAgMworI2RlZmluZSBPTUFQX01VWF9NT0RFNCAgICAgIDQKKyNkZWZpbmUgT01BUF9NVVhfTU9ERTUgICAgICA1CisjZGVmaW5lIE9NQVBfTVVYX01PREU2ICAgICAgNgorI2RlZmluZSBPTUFQX01VWF9NT0RFNyAgICAgIDcKKworLyogMjR4eC8zNHh4IG11eCBiaXQgZGVmaW5lcyAqLworI2RlZmluZSBPTUFQX1BVTExfRU5BCQkJKDEgPDwgMykKKyNkZWZpbmUgT01BUF9QVUxMX1VQCQkJKDEgPDwgNCkKKyNkZWZpbmUgT01BUF9BTFRFTEVDVFJJQ0FMU0VMCQkoMSA8PCA1KQorCisvKiAzNHh4IHNwZWNpZmljIG11eCBiaXQgZGVmaW5lcyAqLworI2RlZmluZSBPTUFQX0lOUFVUX0VOCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUF9PRkZfRU4JCQkoMSA8PCA5KQorI2RlZmluZSBPTUFQX09GRk9VVF9FTgkJCSgxIDw8IDEwKQorI2RlZmluZSBPTUFQX09GRk9VVF9WQUwJCQkoMSA8PCAxMSkKKyNkZWZpbmUgT01BUF9PRkZfUFVMTF9FTgkJKDEgPDwgMTIpCisjZGVmaW5lIE9NQVBfT0ZGX1BVTExfVVAJCSgxIDw8IDEzKQorI2RlZmluZSBPTUFQX1dBS0VVUF9FTgkJCSgxIDw8IDE0KQorCisvKiBBY3RpdmUgcGluIHN0YXRlcyAqLworI2RlZmluZSBPTUFQX1BJTl9PVVRQVVQJCQkwCisjZGVmaW5lIE9NQVBfUElOX0lOUFVUCQkJT01BUF9JTlBVVF9FTgorI2RlZmluZSBPTUFQX1BJTl9JTlBVVF9QVUxMVVAJCShPTUFQX1BVTExfRU5BIHwgT01BUF9JTlBVVF9FTiBcCisJCQkJCQl8IE9NQVBfUFVMTF9VUCkKKyNkZWZpbmUgT01BUF9QSU5fSU5QVVRfUFVMTERPV04JCShPTUFQX1BVTExfRU5BIHwgT01BUF9JTlBVVF9FTikKKworLyogT2ZmIG1vZGUgc3RhdGVzICovCisjZGVmaW5lIE9NQVBfUElOX09GRl9OT05FCQkwCisjZGVmaW5lIE9NQVBfUElOX09GRl9PVVRQVVRfSElHSAkoT01BUF9PRkZfRU4gfCBPTUFQX09GRk9VVF9FTiBcCisJCQkJCQl8IE9NQVBfT0ZGT1VUX1ZBTCkKKyNkZWZpbmUgT01BUF9QSU5fT0ZGX09VVFBVVF9MT1cJCShPTUFQX09GRl9FTiB8IE9NQVBfT0ZGT1VUX0VOKQorI2RlZmluZSBPTUFQX1BJTl9PRkZfSU5QVVRfUFVMTFVQCShPTUFQX09GRl9FTiB8IE9NQVBfT0ZGX1BVTExfRU4gXAorCQkJCQkJfCBPTUFQX09GRl9QVUxMX1VQKQorI2RlZmluZSBPTUFQX1BJTl9PRkZfSU5QVVRfUFVMTERPV04JKE9NQVBfT0ZGX0VOIHwgT01BUF9PRkZfUFVMTF9FTikKKyNkZWZpbmUgT01BUF9QSU5fT0ZGX1dBS0VVUEVOQUJMRQlPTUFQX1dBS0VVUF9FTgorCisjZGVmaW5lIE9NQVBfTU9ERV9HUElPKHgpCSgoKHgpICYgT01BUF9NVVhfTU9ERTcpID09IE9NQVBfTVVYX01PREU0KQorCisvKiBGbGFncyBmb3Igb21hcF9tdXhfaW5pdCAqLworI2RlZmluZSBPTUFQX1BBQ0tBR0VfTUFTSwkJMHhmZmZmCisjZGVmaW5lIE9NQVBfUEFDS0FHRV9DQlAJCTQJCS8qIDUxNS1waW4gMC40MCAwLjUwICovCisjZGVmaW5lIE9NQVBfUEFDS0FHRV9DVVMJCTMJCS8qIDQyMy1waW4gMC42NSAqLworI2RlZmluZSBPTUFQX1BBQ0tBR0VfQ0JCCQkyCQkvKiA1MTUtcGluIDAuNDAgMC41MCAqLworI2RlZmluZSBPTUFQX1BBQ0tBR0VfQ0JDCQkxCQkvKiA1MTUtcGluIDAuNTAgMC42NSAqLworCisKKyNkZWZpbmUgT01BUF9NVVhfTlJfTU9ERVMJOAkJCS8qIEF2YWlsYWJsZSBtb2RlcyAqLworI2RlZmluZSBPTUFQX01VWF9OUl9TSURFUwkyCQkJLyogQm90dG9tICYgdG9wICovCisKKy8qKgorICogc3RydWN0IG9tYXBfbXV4IC0gZGF0YSBmb3Igb21hcCBtdXggcmVnaXN0ZXIgb2Zmc2V0IGFuZCBpdCdzIHZhbHVlCisgKiBAcmVnX29mZnNldDoJbXV4IHJlZ2lzdGVyIG9mZnNldCBmcm9tIHRoZSBtdXggYmFzZQorICogQGdwaW86CUdQSU8gbnVtYmVyCisgKiBAbXV4bmFtZXM6CWF2YWlsYWJsZSBzaWduYWwgbW9kZXMgZm9yIGEgYmFsbAorICovCitzdHJ1Y3Qgb21hcF9tdXggeworCXUxNglyZWdfb2Zmc2V0OworCXUxNglncGlvOworI2lmZGVmIENPTkZJR19PTUFQX01VWAorCWNoYXIJKm11eG5hbWVzW09NQVBfTVVYX05SX01PREVTXTsKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKwljaGFyCSpiYWxsc1tPTUFQX01VWF9OUl9TSURFU107CisjZW5kaWYKKyNlbmRpZgorfTsKKworLyoqCisgKiBzdHJ1Y3Qgb21hcF9iYWxsIC0gZGF0YSBmb3IgYmFsbHMgb24gb21hcCBwYWNrYWdlCisgKiBAcmVnX29mZnNldDoJbXV4IHJlZ2lzdGVyIG9mZnNldCBmcm9tIHRoZSBtdXggYmFzZQorICogQGJhbGxzOglhdmFpbGFibGUgYmFsbHMgb24gdGhlIHBhY2thZ2UKKyAqLworc3RydWN0IG9tYXBfYmFsbCB7CisJdTE2CXJlZ19vZmZzZXQ7CisJY2hhcgkqYmFsbHNbT01BUF9NVVhfTlJfU0lERVNdOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgb21hcF9ib2FyZF9tdXggLSBkYXRhIGZvciBpbml0aWFsaXppbmcgbXV4IHJlZ2lzdGVycworICogQHJlZ19vZmZzZXQ6CW11eCByZWdpc3RlciBvZmZzZXQgZnJvbSB0aGUgbXV4IGJhc2UKKyAqIEBtdXhfdmFsdWU6CWRlc2lyZWQgbXV4IHZhbHVlIHRvIHNldAorICovCitzdHJ1Y3Qgb21hcF9ib2FyZF9tdXggeworCXUxNglyZWdfb2Zmc2V0OworCXUxNgl2YWx1ZTsKK307CisKKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQX01VWCkgJiYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMzRYWCkKKworLyoqCisgKiBvbWFwX211eF9pbml0X2dwaW8gLSBpbml0aWFsaXplIGEgc2lnbmFsIGJhc2VkIG9uIHRoZSBHUElPIG51bWJlcgorICogQGdwaW86CQlHUElPIG51bWJlcgorICogQHZhbDoJCU9wdGlvbnMgZm9yIHRoZSBtdXggcmVnaXN0ZXIgdmFsdWUKKyAqLworaW50IG9tYXBfbXV4X2luaXRfZ3BpbyhpbnQgZ3BpbywgaW50IHZhbCk7CisKKy8qKgorICogb21hcF9tdXhfaW5pdF9zaWduYWwgLSBpbml0aWFsaXplIGEgc2lnbmFsIGJhc2VkIG9uIHRoZSBzaWduYWwgbmFtZQorICogQG11eG5hbWU6CQlNdXggbmFtZSBpbiBtb2RlMF9uYW1lLnNpZ25hbF9uYW1lIGZvcm1hdAorICogQHZhbDoJCU9wdGlvbnMgZm9yIHRoZSBtdXggcmVnaXN0ZXIgdmFsdWUKKyAqLworaW50IG9tYXBfbXV4X2luaXRfc2lnbmFsKGNoYXIgKm11eG5hbWUsIGludCB2YWwpOworCisjZWxzZQorCitzdGF0aWMgaW5saW5lIGludCBvbWFwX211eF9pbml0X2dwaW8oaW50IGdwaW8sIGludCB2YWwpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCBvbWFwX211eF9pbml0X3NpZ25hbChjaGFyICptdXhuYW1lLCBpbnQgdmFsKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYKKworLyoqCisgKiBvbWFwX211eF9nZXRfZ3BpbygpIC0gZ2V0IG11eCByZWdpc3RlciB2YWx1ZSBiYXNlZCBvbiBHUElPIG51bWJlcgorICogQGdwaW86CQlHUElPIG51bWJlcgorICoKKyAqLwordTE2IG9tYXBfbXV4X2dldF9ncGlvKGludCBncGlvKTsKKworLyoqCisgKiBvbWFwX211eF9zZXRfZ3BpbygpIC0gc2V0IG11eCByZWdpc3RlciB2YWx1ZSBiYXNlZCBvbiBHUElPIG51bWJlcgorICogQHZhbDoJCU5ldyBtdXggcmVnaXN0ZXIgdmFsdWUKKyAqIEBncGlvOgkJR1BJTyBudW1iZXIKKyAqCisgKi8KK3ZvaWQgb21hcF9tdXhfc2V0X2dwaW8odTE2IHZhbCwgaW50IGdwaW8pOworCisvKioKKyAqIG9tYXAzX211eF9pbml0KCkgLSBpbml0aWFsaXplIG11eCBzeXN0ZW0gd2l0aCBib2FyZCBzcGVjaWZpYyBzZXQKKyAqIEBib2FyZF9tdXg6CQlCb2FyZCBzcGVjaWZpYyBtdXggdGFibGUKKyAqIEBmbGFnczoJCU9NQVAgcGFja2FnZSB0eXBlIHVzZWQgZm9yIHRoZSBib2FyZAorICovCitpbnQgb21hcDNfbXV4X2luaXQoc3RydWN0IG9tYXBfYm9hcmRfbXV4ICpib2FyZF9tdXgsIGludCBmbGFncyk7CisKKy8qKgorICogb21hcF9tdXhfaW5pdCAtIHByaXZhdGUgbXV4IGluaXQgZnVuY3Rpb24sIGRvIG5vdCBjYWxsCisgKi8KK2ludCBvbWFwX211eF9pbml0KHUzMiBtdXhfcGJhc2UsIHUzMiBtdXhfc2l6ZSwKKwkJCQlzdHJ1Y3Qgb21hcF9tdXggKnN1cGVyc2V0LAorCQkJCXN0cnVjdCBvbWFwX211eCAqcGFja2FnZV9zdWJzZXQsCisJCQkJc3RydWN0IG9tYXBfYm9hcmRfbXV4ICpib2FyZF9tdXgsCisJCQkJc3RydWN0IG9tYXBfYmFsbCAqcGFja2FnZV9iYWxscyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL211eDM0eHguYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvbXV4MzR4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZTBhNTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL211eDM0eHguYwpAQCAtMCwwICsxLDIwOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTm9raWEKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgIm11eC5oIgorCisjaWZkZWYgQ09ORklHX09NQVBfTVVYCisKKyNkZWZpbmUgX09NQVAzX01VWEVOVFJZKE0wLCBnLCBtMCwgbTEsIG0yLCBtMywgbTQsIG01LCBtNiwgbTcpCQlcCit7CQkJCQkJCQkJXAorCS5yZWdfb2Zmc2V0CT0gKE9NQVAzX0NPTlRST0xfUEFEQ09ORl8jI00wIyNfT0ZGU0VUKSwJXAorCS5ncGlvCQk9IChnKSwJCQkJCQlcCisJLm11eG5hbWVzCT0geyBtMCwgbTEsIG0yLCBtMywgbTQsIG01LCBtNiwgbTcgfSwJCVwKK30KKworI2Vsc2UKKworI2RlZmluZSBfT01BUDNfTVVYRU5UUlkoTTAsIGcsIG0wLCBtMSwgbTIsIG0zLCBtNCwgbTUsIG02LCBtNykJCVwKK3sJCQkJCQkJCQlcCisJLnJlZ19vZmZzZXQJPSAoT01BUDNfQ09OVFJPTF9QQURDT05GXyMjTTAjI19PRkZTRVQpLAlcCisJLmdwaW8JCT0gKGcpLAkJCQkJCVwKK30KKworI2VuZGlmCisKKyNkZWZpbmUgX09NQVAzX0JBTExFTlRSWShNMCwgYmIsIGJ0KQkJCQkJXAorewkJCQkJCQkJCVwKKwkucmVnX29mZnNldAk9IChPTUFQM19DT05UUk9MX1BBRENPTkZfIyNNMCMjX09GRlNFVCksCVwKKwkuYmFsbHMJCT0geyBiYiwgYnQgfSwJCQkJCVwKK30KKworLyoKKyAqIFN1cGVyc2V0IG9mIGFsbCBtdXggbW9kZXMgZm9yIG9tYXAzCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgb21hcF9tdXggX19pbml0ZGF0YSBvbWFwM19tdXhtb2Rlc1tdID0geworCV9PTUFQM19NVVhFTlRSWShDQU1fRDAsIDk5LAorCQkiY2FtX2QwIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fOTkiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKENBTV9EMSwgMTAwLAorCQkiY2FtX2QxIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTAwIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShDQU1fRDEwLCAxMDksCisJCSJjYW1fZDEwIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTA5IiwgImh3X2RiZzgiLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKENBTV9EMTEsIDExMCwKKwkJImNhbV9kMTEiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xMTAiLCAiaHdfZGJnOSIsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoQ0FNX0QyLCAxMDEsCisJCSJjYW1fZDIiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xMDEiLCAiaHdfZGJnNCIsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoQ0FNX0QzLCAxMDIsCisJCSJjYW1fZDMiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xMDIiLCAiaHdfZGJnNSIsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoQ0FNX0Q0LCAxMDMsCisJCSJjYW1fZDQiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xMDMiLCAiaHdfZGJnNiIsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoQ0FNX0Q1LCAxMDQsCisJCSJjYW1fZDUiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xMDQiLCAiaHdfZGJnNyIsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoQ0FNX0Q2LCAxMDUsCisJCSJjYW1fZDYiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xMDUiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKENBTV9ENywgMTA2LAorCQkiY2FtX2Q3IiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTA2IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShDQU1fRDgsIDEwNywKKwkJImNhbV9kOCIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzEwNyIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoQ0FNX0Q5LCAxMDgsCisJCSJjYW1fZDkiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xMDgiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKENBTV9GTEQsIDk4LAorCQkiY2FtX2ZsZCIsIE5VTEwsICJjYW1fZ2xvYmFsX3Jlc2V0IiwgTlVMTCwKKwkJImdwaW9fOTgiLCAiaHdfZGJnMyIsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoQ0FNX0hTLCA5NCwKKwkJImNhbV9ocyIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzk0IiwgImh3X2RiZzAiLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKENBTV9QQ0xLLCA5NywKKwkJImNhbV9wY2xrIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fOTciLCAiaHdfZGJnMiIsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoQ0FNX1NUUk9CRSwgMTI2LAorCQkiY2FtX3N0cm9iZSIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzEyNiIsICJod19kYmcxMSIsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoQ0FNX1ZTLCA5NSwKKwkJImNhbV92cyIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzk1IiwgImh3X2RiZzEiLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKENBTV9XRU4sIDE2NywKKwkJImNhbV93ZW4iLCBOVUxMLCAiY2FtX3NodXR0ZXIiLCBOVUxMLAorCQkiZ3Bpb18xNjciLCAiaHdfZGJnMTAiLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKENBTV9YQ0xLQSwgOTYsCisJCSJjYW1feGNsa2EiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb185NiIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoQ0FNX1hDTEtCLCAxMTEsCisJCSJjYW1feGNsa2IiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xMTEiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKENTSTJfRFgwLCAxMTIsCisJCSJjc2kyX2R4MCIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzExMiIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoQ1NJMl9EWDEsIDExNCwKKwkJImNzaTJfZHgxIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTE0IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShDU0kyX0RZMCwgMTEzLAorCQkiY3NpMl9keTAiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xMTMiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKENTSTJfRFkxLCAxMTUsCisJCSJjc2kyX2R5MSIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzExNSIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoRFNTX0FDQklBUywgNjksCisJCSJkc3NfYWNiaWFzIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fNjkiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKERTU19EQVRBMCwgNzAsCisJCSJkc3NfZGF0YTAiLCBOVUxMLCAidWFydDFfY3RzIiwgTlVMTCwKKwkJImdwaW9fNzAiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKERTU19EQVRBMSwgNzEsCisJCSJkc3NfZGF0YTEiLCBOVUxMLCAidWFydDFfcnRzIiwgTlVMTCwKKwkJImdwaW9fNzEiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKERTU19EQVRBMTAsIDgwLAorCQkiZHNzX2RhdGExMCIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzgwIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShEU1NfREFUQTExLCA4MSwKKwkJImRzc19kYXRhMTEiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb184MSIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoRFNTX0RBVEExMiwgODIsCisJCSJkc3NfZGF0YTEyIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fODIiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKERTU19EQVRBMTMsIDgzLAorCQkiZHNzX2RhdGExMyIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzgzIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShEU1NfREFUQTE0LCA4NCwKKwkJImRzc19kYXRhMTQiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb184NCIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoRFNTX0RBVEExNSwgODUsCisJCSJkc3NfZGF0YTE1IiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fODUiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKERTU19EQVRBMTYsIDg2LAorCQkiZHNzX2RhdGExNiIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzg2IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShEU1NfREFUQTE3LCA4NywKKwkJImRzc19kYXRhMTciLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb184NyIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoRFNTX0RBVEExOCwgODgsCisJCSJkc3NfZGF0YTE4IiwgTlVMTCwgIm1jc3BpM19jbGsiLCAiZHNzX2RhdGEwIiwKKwkJImdwaW9fODgiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKERTU19EQVRBMTksIDg5LAorCQkiZHNzX2RhdGExOSIsIE5VTEwsICJtY3NwaTNfc2ltbyIsICJkc3NfZGF0YTEiLAorCQkiZ3Bpb184OSIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoRFNTX0RBVEEyMCwgOTAsCisJCSJkc3NfZGF0YTIwIiwgTlVMTCwgIm1jc3BpM19zb21pIiwgImRzc19kYXRhMiIsCisJCSJncGlvXzkwIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShEU1NfREFUQTIxLCA5MSwKKwkJImRzc19kYXRhMjEiLCBOVUxMLCAibWNzcGkzX2NzMCIsICJkc3NfZGF0YTMiLAorCQkiZ3Bpb185MSIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoRFNTX0RBVEEyMiwgOTIsCisJCSJkc3NfZGF0YTIyIiwgTlVMTCwgIm1jc3BpM19jczEiLCAiZHNzX2RhdGE0IiwKKwkJImdwaW9fOTIiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKERTU19EQVRBMjMsIDkzLAorCQkiZHNzX2RhdGEyMyIsIE5VTEwsIE5VTEwsICJkc3NfZGF0YTUiLAorCQkiZ3Bpb185MyIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoRFNTX0RBVEEyLCA3MiwKKwkJImRzc19kYXRhMiIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzcyIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShEU1NfREFUQTMsIDczLAorCQkiZHNzX2RhdGEzIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fNzMiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKERTU19EQVRBNCwgNzQsCisJCSJkc3NfZGF0YTQiLCBOVUxMLCAidWFydDNfcnhfaXJyeCIsIE5VTEwsCisJCSJncGlvXzc0IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShEU1NfREFUQTUsIDc1LAorCQkiZHNzX2RhdGE1IiwgTlVMTCwgInVhcnQzX3R4X2lydHgiLCBOVUxMLAorCQkiZ3Bpb183NSIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoRFNTX0RBVEE2LCA3NiwKKwkJImRzc19kYXRhNiIsIE5VTEwsICJ1YXJ0MV90eCIsIE5VTEwsCisJCSJncGlvXzc2IiwgImh3X2RiZzE0IiwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShEU1NfREFUQTcsIDc3LAorCQkiZHNzX2RhdGE3IiwgTlVMTCwgInVhcnQxX3J4IiwgTlVMTCwKKwkJImdwaW9fNzciLCAiaHdfZGJnMTUiLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKERTU19EQVRBOCwgNzgsCisJCSJkc3NfZGF0YTgiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb183OCIsICJod19kYmcxNiIsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoRFNTX0RBVEE5LCA3OSwKKwkJImRzc19kYXRhOSIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzc5IiwgImh3X2RiZzE3IiwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShEU1NfSFNZTkMsIDY3LAorCQkiZHNzX2hzeW5jIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fNjciLCAiaHdfZGJnMTMiLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKERTU19QQ0xLLCA2NiwKKwkJImRzc19wY2xrIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fNjYiLCAiaHdfZGJnMTIiLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKERTU19WU1lOQywgNjgsCisJCSJkc3NfdnN5bmMiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb182OCIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoRVRLX0NMSywgMTIsCisJCSJldGtfY2xrIiwgIm1jYnNwNV9jbGt4IiwgInNkbW1jM19jbGsiLCAiaHN1c2IxX3N0cCIsCisJCSJncGlvXzEyIiwgIm1tMV9yeGRwIiwgImhzdXNiMV90bGxfc3RwIiwgImh3X2RiZzAiKSwKKwlfT01BUDNfTVVYRU5UUlkoRVRLX0NUTCwgMTMsCisJCSJldGtfY3RsIiwgTlVMTCwgInNkbW1jM19jbWQiLCAiaHN1c2IxX2NsayIsCisJCSJncGlvXzEzIiwgTlVMTCwgImhzdXNiMV90bGxfY2xrIiwgImh3X2RiZzEiKSwKKwlfT01BUDNfTVVYRU5UUlkoRVRLX0QwLCAxNCwKKwkJImV0a19kMCIsICJtY3NwaTNfc2ltbyIsICJzZG1tYzNfZGF0NCIsICJoc3VzYjFfZGF0YTAiLAorCQkiZ3Bpb18xNCIsICJtbTFfcnhyY3YiLCAiaHN1c2IxX3RsbF9kYXRhMCIsICJod19kYmcyIiksCisJX09NQVAzX01VWEVOVFJZKEVUS19EMSwgMTUsCisJCSJldGtfZDEiLCAibWNzcGkzX3NvbWkiLCBOVUxMLCAiaHN1c2IxX2RhdGExIiwKKwkJImdwaW9fMTUiLCAibW0xX3R4c2UwIiwgImhzdXNiMV90bGxfZGF0YTEiLCAiaHdfZGJnMyIpLAorCV9PTUFQM19NVVhFTlRSWShFVEtfRDEwLCAyNCwKKwkJImV0a19kMTAiLCBOVUxMLCAidWFydDFfcngiLCAiaHN1c2IyX2NsayIsCisJCSJncGlvXzI0IiwgTlVMTCwgImhzdXNiMl90bGxfY2xrIiwgImh3X2RiZzEyIiksCisJX09NQVAzX01VWEVOVFJZKEVUS19EMTEsIDI1LAorCQkiZXRrX2QxMSIsIE5VTEwsIE5VTEwsICJoc3VzYjJfc3RwIiwKKwkJImdwaW9fMjUiLCAibW0yX3J4ZHAiLCAiaHN1c2IyX3RsbF9zdHAiLCAiaHdfZGJnMTMiKSwKKwlfT01BUDNfTVVYRU5UUlkoRVRLX0QxMiwgMjYsCisJCSJldGtfZDEyIiwgTlVMTCwgTlVMTCwgImhzdXNiMl9kaXIiLAorCQkiZ3Bpb18yNiIsIE5VTEwsICJoc3VzYjJfdGxsX2RpciIsICJod19kYmcxNCIpLAorCV9PTUFQM19NVVhFTlRSWShFVEtfRDEzLCAyNywKKwkJImV0a19kMTMiLCBOVUxMLCBOVUxMLCAiaHN1c2IyX254dCIsCisJCSJncGlvXzI3IiwgIm1tMl9yeGRtIiwgImhzdXNiMl90bGxfbnh0IiwgImh3X2RiZzE1IiksCisJX09NQVAzX01VWEVOVFJZKEVUS19EMTQsIDI4LAorCQkiZXRrX2QxNCIsIE5VTEwsIE5VTEwsICJoc3VzYjJfZGF0YTAiLAorCQkiZ3Bpb18yOCIsICJtbTJfcnhyY3YiLCAiaHN1c2IyX3RsbF9kYXRhMCIsICJod19kYmcxNiIpLAorCV9PTUFQM19NVVhFTlRSWShFVEtfRDE1LCAyOSwKKwkJImV0a19kMTUiLCBOVUxMLCBOVUxMLCAiaHN1c2IyX2RhdGExIiwKKwkJImdwaW9fMjkiLCAibW0yX3R4c2UwIiwgImhzdXNiMl90bGxfZGF0YTEiLCAiaHdfZGJnMTciKSwKKwlfT01BUDNfTVVYRU5UUlkoRVRLX0QyLCAxNiwKKwkJImV0a19kMiIsICJtY3NwaTNfY3MwIiwgTlVMTCwgImhzdXNiMV9kYXRhMiIsCisJCSJncGlvXzE2IiwgIm1tMV90eGRhdCIsICJoc3VzYjFfdGxsX2RhdGEyIiwgImh3X2RiZzQiKSwKKwlfT01BUDNfTVVYRU5UUlkoRVRLX0QzLCAxNywKKwkJImV0a19kMyIsICJtY3NwaTNfY2xrIiwgInNkbW1jM19kYXQzIiwgImhzdXNiMV9kYXRhNyIsCisJCSJncGlvXzE3IiwgTlVMTCwgImhzdXNiMV90bGxfZGF0YTciLCAiaHdfZGJnNSIpLAorCV9PTUFQM19NVVhFTlRSWShFVEtfRDQsIDE4LAorCQkiZXRrX2Q0IiwgIm1jYnNwNV9kciIsICJzZG1tYzNfZGF0MCIsICJoc3VzYjFfZGF0YTQiLAorCQkiZ3Bpb18xOCIsIE5VTEwsICJoc3VzYjFfdGxsX2RhdGE0IiwgImh3X2RiZzYiKSwKKwlfT01BUDNfTVVYRU5UUlkoRVRLX0Q1LCAxOSwKKwkJImV0a19kNSIsICJtY2JzcDVfZnN4IiwgInNkbW1jM19kYXQxIiwgImhzdXNiMV9kYXRhNSIsCisJCSJncGlvXzE5IiwgTlVMTCwgImhzdXNiMV90bGxfZGF0YTUiLCAiaHdfZGJnNyIpLAorCV9PTUFQM19NVVhFTlRSWShFVEtfRDYsIDIwLAorCQkiZXRrX2Q2IiwgIm1jYnNwNV9keCIsICJzZG1tYzNfZGF0MiIsICJoc3VzYjFfZGF0YTYiLAorCQkiZ3Bpb18yMCIsIE5VTEwsICJoc3VzYjFfdGxsX2RhdGE2IiwgImh3X2RiZzgiKSwKKwlfT01BUDNfTVVYRU5UUlkoRVRLX0Q3LCAyMSwKKwkJImV0a19kNyIsICJtY3NwaTNfY3MxIiwgInNkbW1jM19kYXQ3IiwgImhzdXNiMV9kYXRhMyIsCisJCSJncGlvXzIxIiwgIm1tMV90eGVuX24iLCAiaHN1c2IxX3RsbF9kYXRhMyIsICJod19kYmc5IiksCisJX09NQVAzX01VWEVOVFJZKEVUS19EOCwgMjIsCisJCSJldGtfZDgiLCAic3lzX2RybV9tc2VjdXJlIiwgInNkbW1jM19kYXQ2IiwgImhzdXNiMV9kaXIiLAorCQkiZ3Bpb18yMiIsIE5VTEwsICJoc3VzYjFfdGxsX2RpciIsICJod19kYmcxMCIpLAorCV9PTUFQM19NVVhFTlRSWShFVEtfRDksIDIzLAorCQkiZXRrX2Q5IiwgInN5c19zZWN1cmVfaW5kaWNhdG9yIiwgInNkbW1jM19kYXQ1IiwgImhzdXNiMV9ueHQiLAorCQkiZ3Bpb18yMyIsICJtbTFfcnhkbSIsICJoc3VzYjFfdGxsX254dCIsICJod19kYmcxMSIpLAorCV9PTUFQM19NVVhFTlRSWShHUE1DX0ExLCAzNCwKKwkJImdwbWNfYTEiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18zNCIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoR1BNQ19BMTAsIDQzLAorCQkiZ3BtY19hMTAiLCAic3lzX25kbWFyZXEzIiwgTlVMTCwgTlVMTCwKKwkJImdwaW9fNDMiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKEdQTUNfQTIsIDM1LAorCQkiZ3BtY19hMiIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzM1IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShHUE1DX0EzLCAzNiwKKwkJImdwbWNfYTMiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18zNiIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoR1BNQ19BNCwgMzcsCisJCSJncG1jX2E0IiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMzciLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKEdQTUNfQTUsIDM4LAorCQkiZ3BtY19hNSIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzM4IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShHUE1DX0E2LCAzOSwKKwkJImdwbWNfYTYiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18zOSIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoR1BNQ19BNywgNDAsCisJCSJncG1jX2E3IiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fNDAiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKEdQTUNfQTgsIDQxLAorCQkiZ3BtY19hOCIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzQxIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShHUE1DX0E5LCA0MiwKKwkJImdwbWNfYTkiLCAic3lzX25kbWFyZXEyIiwgTlVMTCwgTlVMTCwKKwkJImdwaW9fNDIiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKEdQTUNfQ0xLLCA1OSwKKwkJImdwbWNfY2xrIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fNTkiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKEdQTUNfRDEwLCA0NiwKKwkJImdwbWNfZDEwIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fNDYiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKEdQTUNfRDExLCA0NywKKwkJImdwbWNfZDExIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fNDciLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKEdQTUNfRDEyLCA0OCwKKwkJImdwbWNfZDEyIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fNDgiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKEdQTUNfRDEzLCA0OSwKKwkJImdwbWNfZDEzIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fNDkiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKEdQTUNfRDE0LCA1MCwKKwkJImdwbWNfZDE0IiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fNTAiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKEdQTUNfRDE1LCA1MSwKKwkJImdwbWNfZDE1IiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fNTEiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKEdQTUNfRDgsIDQ0LAorCQkiZ3BtY19kOCIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzQ0IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShHUE1DX0Q5LCA0NSwKKwkJImdwbWNfZDkiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb180NSIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoR1BNQ19OQkUwX0NMRSwgNjAsCisJCSJncG1jX25iZTBfY2xlIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fNjAiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKEdQTUNfTkJFMSwgNjEsCisJCSJncG1jX25iZTEiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb182MSIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoR1BNQ19OQ1MxLCA1MiwKKwkJImdwbWNfbmNzMSIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzUyIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShHUE1DX05DUzIsIDUzLAorCQkiZ3BtY19uY3MyIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fNTMiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKEdQTUNfTkNTMywgNTQsCisJCSJncG1jX25jczMiLCAic3lzX25kbWFyZXEwIiwgTlVMTCwgTlVMTCwKKwkJImdwaW9fNTQiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKEdQTUNfTkNTNCwgNTUsCisJCSJncG1jX25jczQiLCAic3lzX25kbWFyZXExIiwgIm1jYnNwNF9jbGt4IiwgImdwdDlfcHdtX2V2dCIsCisJCSJncGlvXzU1IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShHUE1DX05DUzUsIDU2LAorCQkiZ3BtY19uY3M1IiwgInN5c19uZG1hcmVxMiIsICJtY2JzcDRfZHIiLCAiZ3B0MTBfcHdtX2V2dCIsCisJCSJncGlvXzU2IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShHUE1DX05DUzYsIDU3LAorCQkiZ3BtY19uY3M2IiwgInN5c19uZG1hcmVxMyIsICJtY2JzcDRfZHgiLCAiZ3B0MTFfcHdtX2V2dCIsCisJCSJncGlvXzU3IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShHUE1DX05DUzcsIDU4LAorCQkiZ3BtY19uY3M3IiwgImdwbWNfaW9fZGlyIiwgIm1jYnNwNF9mc3giLCAiZ3B0OF9wd21fZXZ0IiwKKwkJImdwaW9fNTgiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKEdQTUNfTldQLCA2MiwKKwkJImdwbWNfbndwIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fNjIiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKEdQTUNfV0FJVDEsIDYzLAorCQkiZ3BtY193YWl0MSIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzYzIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShHUE1DX1dBSVQyLCA2NCwKKwkJImdwbWNfd2FpdDIiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb182NCIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoR1BNQ19XQUlUMywgNjUsCisJCSJncG1jX3dhaXQzIiwgInN5c19uZG1hcmVxMSIsIE5VTEwsIE5VTEwsCisJCSJncGlvXzY1IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShIRFFfU0lPLCAxNzAsCisJCSJoZHFfc2lvIiwgInN5c19hbHRjbGsiLCAiaTJjMl9zY2NiZSIsICJpMmMzX3NjY2JlIiwKKwkJImdwaW9fMTcwIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShIU1VTQjBfQ0xLLCAxMjAsCisJCSJoc3VzYjBfY2xrIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTIwIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShIU1VTQjBfREFUQTAsIDEyNSwKKwkJImhzdXNiMF9kYXRhMCIsIE5VTEwsICJ1YXJ0M190eF9pcnR4IiwgTlVMTCwKKwkJImdwaW9fMTI1IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShIU1VTQjBfREFUQTEsIDEzMCwKKwkJImhzdXNiMF9kYXRhMSIsIE5VTEwsICJ1YXJ0M19yeF9pcnJ4IiwgTlVMTCwKKwkJImdwaW9fMTMwIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShIU1VTQjBfREFUQTIsIDEzMSwKKwkJImhzdXNiMF9kYXRhMiIsIE5VTEwsICJ1YXJ0M19ydHNfc2QiLCBOVUxMLAorCQkiZ3Bpb18xMzEiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKEhTVVNCMF9EQVRBMywgMTY5LAorCQkiaHN1c2IwX2RhdGEzIiwgTlVMTCwgInVhcnQzX2N0c19yY3R4IiwgTlVMTCwKKwkJImdwaW9fMTY5IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShIU1VTQjBfREFUQTQsIDE4OCwKKwkJImhzdXNiMF9kYXRhNCIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzE4OCIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoSFNVU0IwX0RBVEE1LCAxODksCisJCSJoc3VzYjBfZGF0YTUiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xODkiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKEhTVVNCMF9EQVRBNiwgMTkwLAorCQkiaHN1c2IwX2RhdGE2IiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTkwIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShIU1VTQjBfREFUQTcsIDE5MSwKKwkJImhzdXNiMF9kYXRhNyIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzE5MSIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoSFNVU0IwX0RJUiwgMTIyLAorCQkiaHN1c2IwX2RpciIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzEyMiIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoSFNVU0IwX05YVCwgMTI0LAorCQkiaHN1c2IwX254dCIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzEyNCIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoSFNVU0IwX1NUUCwgMTIxLAorCQkiaHN1c2IwX3N0cCIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzEyMSIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoSTJDMl9TQ0wsIDE2OCwKKwkJImkyYzJfc2NsIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTY4IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShJMkMyX1NEQSwgMTgzLAorCQkiaTJjMl9zZGEiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xODMiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKEkyQzNfU0NMLCAxODQsCisJCSJpMmMzX3NjbCIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzE4NCIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoSTJDM19TREEsIDE4NSwKKwkJImkyYzNfc2RhIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTg1IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShJMkM0X1NDTCwgMCwKKwkJImkyYzRfc2NsIiwgInN5c19udm1vZGUxIiwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShJMkM0X1NEQSwgMCwKKwkJImkyYzRfc2RhIiwgInN5c19udm1vZGUyIiwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShKVEFHX0VNVTAsIDExLAorCQkianRhZ19lbXUwIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTEiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKEpUQUdfRU1VMSwgMzEsCisJCSJqdGFnX2VtdTEiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18zMSIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoTUNCU1AxX0NMS1IsIDE1NiwKKwkJIm1jYnNwMV9jbGtyIiwgIm1jc3BpNF9jbGsiLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xNTYiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKE1DQlNQMV9DTEtYLCAxNjIsCisJCSJtY2JzcDFfY2xreCIsIE5VTEwsICJtY2JzcDNfY2xreCIsIE5VTEwsCisJCSJncGlvXzE2MiIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoTUNCU1AxX0RSLCAxNTksCisJCSJtY2JzcDFfZHIiLCAibWNzcGk0X3NvbWkiLCAibWNic3AzX2RyIiwgTlVMTCwKKwkJImdwaW9fMTU5IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShNQ0JTUDFfRFgsIDE1OCwKKwkJIm1jYnNwMV9keCIsICJtY3NwaTRfc2ltbyIsICJtY2JzcDNfZHgiLCBOVUxMLAorCQkiZ3Bpb18xNTgiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKE1DQlNQMV9GU1IsIDE1NywKKwkJIm1jYnNwMV9mc3IiLCBOVUxMLCAiY2FtX2dsb2JhbF9yZXNldCIsIE5VTEwsCisJCSJncGlvXzE1NyIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoTUNCU1AxX0ZTWCwgMTYxLAorCQkibWNic3AxX2ZzeCIsICJtY3NwaTRfY3MwIiwgIm1jYnNwM19mc3giLCBOVUxMLAorCQkiZ3Bpb18xNjEiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKE1DQlNQMl9DTEtYLCAxMTcsCisJCSJtY2JzcDJfY2xreCIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzExNyIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoTUNCU1AyX0RSLCAxMTgsCisJCSJtY2JzcDJfZHIiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xMTgiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKE1DQlNQMl9EWCwgMTE5LAorCQkibWNic3AyX2R4IiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTE5IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShNQ0JTUDJfRlNYLCAxMTYsCisJCSJtY2JzcDJfZnN4IiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTE2IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShNQ0JTUDNfQ0xLWCwgMTQyLAorCQkibWNic3AzX2Nsa3giLCAidWFydDJfdHgiLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xNDIiLCAiaHN1c2IzX3RsbF9kYXRhNiIsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoTUNCU1AzX0RSLCAxNDEsCisJCSJtY2JzcDNfZHIiLCAidWFydDJfcnRzIiwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTQxIiwgImhzdXNiM190bGxfZGF0YTUiLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKE1DQlNQM19EWCwgMTQwLAorCQkibWNic3AzX2R4IiwgInVhcnQyX2N0cyIsIE5VTEwsIE5VTEwsCisJCSJncGlvXzE0MCIsICJoc3VzYjNfdGxsX2RhdGE0IiwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShNQ0JTUDNfRlNYLCAxNDMsCisJCSJtY2JzcDNfZnN4IiwgInVhcnQyX3J4IiwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTQzIiwgImhzdXNiM190bGxfZGF0YTciLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKE1DQlNQNF9DTEtYLCAxNTIsCisJCSJtY2JzcDRfY2xreCIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzE1MiIsICJoc3VzYjNfdGxsX2RhdGExIiwgIm1tM190eHNlMCIsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoTUNCU1A0X0RSLCAxNTMsCisJCSJtY2JzcDRfZHIiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xNTMiLCAiaHN1c2IzX3RsbF9kYXRhMCIsICJtbTNfcnhyY3YiLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKE1DQlNQNF9EWCwgMTU0LAorCQkibWNic3A0X2R4IiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTU0IiwgImhzdXNiM190bGxfZGF0YTIiLCAibW0zX3R4ZGF0IiwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShNQ0JTUDRfRlNYLCAxNTUsCisJCSJtY2JzcDRfZnN4IiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTU1IiwgImhzdXNiM190bGxfZGF0YTMiLCAibW0zX3R4ZW5fbiIsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoTUNCU1BfQ0xLUywgMTYwLAorCQkibWNic3BfY2xrcyIsIE5VTEwsICJjYW1fc2h1dHRlciIsIE5VTEwsCisJCSJncGlvXzE2MCIsICJ1YXJ0MV9jdHMiLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKE1DU1BJMV9DTEssIDE3MSwKKwkJIm1jc3BpMV9jbGsiLCAic2RtbWMyX2RhdDQiLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xNzEiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKE1DU1BJMV9DUzAsIDE3NCwKKwkJIm1jc3BpMV9jczAiLCAic2RtbWMyX2RhdDciLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xNzQiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKE1DU1BJMV9DUzEsIDE3NSwKKwkJIm1jc3BpMV9jczEiLCBOVUxMLCBOVUxMLCAic2RtbWMzX2NtZCIsCisJCSJncGlvXzE3NSIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoTUNTUEkxX0NTMiwgMTc2LAorCQkibWNzcGkxX2NzMiIsIE5VTEwsIE5VTEwsICJzZG1tYzNfY2xrIiwKKwkJImdwaW9fMTc2IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShNQ1NQSTFfQ1MzLCAxNzcsCisJCSJtY3NwaTFfY3MzIiwgTlVMTCwgImhzdXNiMl90bGxfZGF0YTIiLCAiaHN1c2IyX2RhdGEyIiwKKwkJImdwaW9fMTc3IiwgIm1tMl90eGRhdCIsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoTUNTUEkxX1NJTU8sIDE3MiwKKwkJIm1jc3BpMV9zaW1vIiwgInNkbW1jMl9kYXQ1IiwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTcyIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShNQ1NQSTFfU09NSSwgMTczLAorCQkibWNzcGkxX3NvbWkiLCAic2RtbWMyX2RhdDYiLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xNzMiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKE1DU1BJMl9DTEssIDE3OCwKKwkJIm1jc3BpMl9jbGsiLCBOVUxMLCAiaHN1c2IyX3RsbF9kYXRhNyIsICJoc3VzYjJfZGF0YTciLAorCQkiZ3Bpb18xNzgiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKE1DU1BJMl9DUzAsIDE4MSwKKwkJIm1jc3BpMl9jczAiLCAiZ3B0MTFfcHdtX2V2dCIsCisJCSJoc3VzYjJfdGxsX2RhdGE2IiwgImhzdXNiMl9kYXRhNiIsCisJCSJncGlvXzE4MSIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoTUNTUEkyX0NTMSwgMTgyLAorCQkibWNzcGkyX2NzMSIsICJncHQ4X3B3bV9ldnQiLAorCQkiaHN1c2IyX3RsbF9kYXRhMyIsICJoc3VzYjJfZGF0YTMiLAorCQkiZ3Bpb18xODIiLCAibW0yX3R4ZW5fbiIsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoTUNTUEkyX1NJTU8sIDE3OSwKKwkJIm1jc3BpMl9zaW1vIiwgImdwdDlfcHdtX2V2dCIsCisJCSJoc3VzYjJfdGxsX2RhdGE0IiwgImhzdXNiMl9kYXRhNCIsCisJCSJncGlvXzE3OSIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoTUNTUEkyX1NPTUksIDE4MCwKKwkJIm1jc3BpMl9zb21pIiwgImdwdDEwX3B3bV9ldnQiLAorCQkiaHN1c2IyX3RsbF9kYXRhNSIsICJoc3VzYjJfZGF0YTUiLAorCQkiZ3Bpb18xODAiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFNETU1DMV9DTEssIDEyMCwKKwkJInNkbW1jMV9jbGsiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xMjAiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFNETU1DMV9DTUQsIDEyMSwKKwkJInNkbW1jMV9jbWQiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xMjEiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFNETU1DMV9EQVQwLCAxMjIsCisJCSJzZG1tYzFfZGF0MCIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzEyMiIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoU0RNTUMxX0RBVDEsIDEyMywKKwkJInNkbW1jMV9kYXQxIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTIzIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShTRE1NQzFfREFUMiwgMTI0LAorCQkic2RtbWMxX2RhdDIiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xMjQiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFNETU1DMV9EQVQzLCAxMjUsCisJCSJzZG1tYzFfZGF0MyIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzEyNSIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoU0RNTUMxX0RBVDQsIDEyNiwKKwkJInNkbW1jMV9kYXQ0IiwgTlVMTCwgInNpbV9pbyIsIE5VTEwsCisJCSJncGlvXzEyNiIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoU0RNTUMxX0RBVDUsIDEyNywKKwkJInNkbW1jMV9kYXQ1IiwgTlVMTCwgInNpbV9jbGsiLCBOVUxMLAorCQkiZ3Bpb18xMjciLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFNETU1DMV9EQVQ2LCAxMjgsCisJCSJzZG1tYzFfZGF0NiIsIE5VTEwsICJzaW1fcHdyY3RybCIsIE5VTEwsCisJCSJncGlvXzEyOCIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoU0RNTUMxX0RBVDcsIDEyOSwKKwkJInNkbW1jMV9kYXQ3IiwgTlVMTCwgInNpbV9yc3QiLCBOVUxMLAorCQkiZ3Bpb18xMjkiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFNETU1DMl9DTEssIDEzMCwKKwkJInNkbW1jMl9jbGsiLCAibWNzcGkzX2NsayIsIE5VTEwsIE5VTEwsCisJCSJncGlvXzEzMCIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoU0RNTUMyX0NNRCwgMTMxLAorCQkic2RtbWMyX2NtZCIsICJtY3NwaTNfc2ltbyIsIE5VTEwsIE5VTEwsCisJCSJncGlvXzEzMSIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoU0RNTUMyX0RBVDAsIDEzMiwKKwkJInNkbW1jMl9kYXQwIiwgIm1jc3BpM19zb21pIiwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTMyIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShTRE1NQzJfREFUMSwgMTMzLAorCQkic2RtbWMyX2RhdDEiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xMzMiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFNETU1DMl9EQVQyLCAxMzQsCisJCSJzZG1tYzJfZGF0MiIsICJtY3NwaTNfY3MxIiwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTM0IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShTRE1NQzJfREFUMywgMTM1LAorCQkic2RtbWMyX2RhdDMiLCAibWNzcGkzX2NzMCIsIE5VTEwsIE5VTEwsCisJCSJncGlvXzEzNSIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoU0RNTUMyX0RBVDQsIDEzNiwKKwkJInNkbW1jMl9kYXQ0IiwgInNkbW1jMl9kaXJfZGF0MCIsIE5VTEwsICJzZG1tYzNfZGF0MCIsCisJCSJncGlvXzEzNiIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoU0RNTUMyX0RBVDUsIDEzNywKKwkJInNkbW1jMl9kYXQ1IiwgInNkbW1jMl9kaXJfZGF0MSIsCisJCSJjYW1fZ2xvYmFsX3Jlc2V0IiwgInNkbW1jM19kYXQxIiwKKwkJImdwaW9fMTM3IiwgImhzdXNiM190bGxfc3RwIiwgIm1tM19yeGRwIiwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShTRE1NQzJfREFUNiwgMTM4LAorCQkic2RtbWMyX2RhdDYiLCAic2RtbWMyX2Rpcl9jbWQiLCAiY2FtX3NodXR0ZXIiLCAic2RtbWMzX2RhdDIiLAorCQkiZ3Bpb18xMzgiLCAiaHN1c2IzX3RsbF9kaXIiLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFNETU1DMl9EQVQ3LCAxMzksCisJCSJzZG1tYzJfZGF0NyIsICJzZG1tYzJfY2xraW4iLCBOVUxMLCAic2RtbWMzX2RhdDMiLAorCQkiZ3Bpb18xMzkiLCAiaHN1c2IzX3RsbF9ueHQiLCAibW0zX3J4ZG0iLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFNEUkNfQ0tFMCwgMCwKKwkJInNkcmNfY2tlMCIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCU5VTEwsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoU0RSQ19DS0UxLCAwLAorCQkic2RyY19ja2UxIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShTWVNfQk9PVDAsIDIsCisJCSJzeXNfYm9vdDAiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18yIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShTWVNfQk9PVDEsIDMsCisJCSJzeXNfYm9vdDEiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18zIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShTWVNfQk9PVDIsIDQsCisJCSJzeXNfYm9vdDIiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb180IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShTWVNfQk9PVDMsIDUsCisJCSJzeXNfYm9vdDMiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb181IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShTWVNfQk9PVDQsIDYsCisJCSJzeXNfYm9vdDQiLCAic2RtbWMyX2Rpcl9kYXQyIiwgTlVMTCwgTlVMTCwKKwkJImdwaW9fNiIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoU1lTX0JPT1Q1LCA3LAorCQkic3lzX2Jvb3Q1IiwgInNkbW1jMl9kaXJfZGF0MyIsIE5VTEwsIE5VTEwsCisJCSJncGlvXzciLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFNZU19CT09UNiwgOCwKKwkJInN5c19ib290NiIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzgiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFNZU19DTEtPVVQxLCAxMCwKKwkJInN5c19jbGtvdXQxIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTAiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFNZU19DTEtPVVQyLCAxODYsCisJCSJzeXNfY2xrb3V0MiIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzE4NiIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoU1lTX0NMS1JFUSwgMSwKKwkJInN5c19jbGtyZXEiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShTWVNfTklSUSwgMCwKKwkJInN5c19uaXJxIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMCIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoU1lTX05SRVNXQVJNLCAzMCwKKwkJInN5c19ucmVzd2FybSIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzMwIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShTWVNfT0ZGX01PREUsIDksCisJCSJzeXNfb2ZmX21vZGUiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb185IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShVQVJUMV9DVFMsIDE1MCwKKwkJInVhcnQxX2N0cyIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzE1MCIsICJoc3VzYjNfdGxsX2NsayIsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoVUFSVDFfUlRTLCAxNDksCisJCSJ1YXJ0MV9ydHMiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xNDkiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFVBUlQxX1JYLCAxNTEsCisJCSJ1YXJ0MV9yeCIsIE5VTEwsICJtY2JzcDFfY2xrciIsICJtY3NwaTRfY2xrIiwKKwkJImdwaW9fMTUxIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShVQVJUMV9UWCwgMTQ4LAorCQkidWFydDFfdHgiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xNDgiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFVBUlQyX0NUUywgMTQ0LAorCQkidWFydDJfY3RzIiwgIm1jYnNwM19keCIsICJncHQ5X3B3bV9ldnQiLCBOVUxMLAorCQkiZ3Bpb18xNDQiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFVBUlQyX1JUUywgMTQ1LAorCQkidWFydDJfcnRzIiwgIm1jYnNwM19kciIsICJncHQxMF9wd21fZXZ0IiwgTlVMTCwKKwkJImdwaW9fMTQ1IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShVQVJUMl9SWCwgMTQ3LAorCQkidWFydDJfcngiLCAibWNic3AzX2ZzeCIsICJncHQ4X3B3bV9ldnQiLCBOVUxMLAorCQkiZ3Bpb18xNDciLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFVBUlQyX1RYLCAxNDYsCisJCSJ1YXJ0Ml90eCIsICJtY2JzcDNfY2xreCIsICJncHQxMV9wd21fZXZ0IiwgTlVMTCwKKwkJImdwaW9fMTQ2IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShVQVJUM19DVFNfUkNUWCwgMTYzLAorCQkidWFydDNfY3RzX3JjdHgiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xNjMiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFVBUlQzX1JUU19TRCwgMTY0LAorCQkidWFydDNfcnRzX3NkIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTY0IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShVQVJUM19SWF9JUlJYLCAxNjUsCisJCSJ1YXJ0M19yeF9pcnJ4IiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTY1IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShVQVJUM19UWF9JUlRYLCAxNjYsCisJCSJ1YXJ0M190eF9pcnR4IiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTY2IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCXsgLnJlZ19vZmZzZXQgPSBPTUFQX01VWF9URVJNSU5BVE9SIH0sCit9OworCisvKgorICogU2lnbmFscyBkaWZmZXJlbnQgb24gQ0JDIHBhY2thZ2UgY29tcGFyZWQgdG8gdGhlIHN1cGVyc2V0CisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQX01VWCkgJiYgZGVmaW5lZChDT05GSUdfT01BUF9QQUNLQUdFX0NCQykKK3N0cnVjdCBvbWFwX211eCBfX2luaXRkYXRhIG9tYXAzX2NiY19zdWJzZXRbXSA9IHsKKwl7IC5yZWdfb2Zmc2V0ID0gT01BUF9NVVhfVEVSTUlOQVRPUiB9LAorfTsKKyNlbHNlCisjZGVmaW5lIG9tYXAzX2NiY19zdWJzZXQJTlVMTAorI2VuZGlmCisKKy8qCisgKiBCYWxscyBmb3IgQ0JDIHBhY2thZ2UKKyAqIDUxNS1waW4gcy1QQkdBIFBhY2thZ2UsIDAuNjVtbSBCYWxsIFBpdGNoIChUb3ApLCAwLjUwbW0gQmFsbCBQaXRjaCAoQm90dG9tKQorICoKKyAqIEZJWE1FOiBXaGF0J3MgdXAgd2l0aCB0aGUgb3V0ZGF0ZWQgVEkgZG9jdW1lbnRhdGlvbj8gU2VlOgorICoKKyAqIGh0dHA6Ly93aWtpLmRhdmluY2lkc3AuY29tL2luZGV4LnBocC9EYXRhc2hlZXRfRXJyYXRhX2Zvcl9PTUFQMzV4X0NCQ19QYWNrYWdlCisgKiBodHRwOi8vY29tbXVuaXR5LnRpLmNvbS9mb3J1bXMvdC8xMDk4Mi5hc3B4CisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQX01VWCkgJiYgZGVmaW5lZChDT05GSUdfREVCVUdfRlMpCVwKKwkJJiYgZGVmaW5lZChDT05GSUdfT01BUF9QQUNLQUdFX0NCQykKK3N0cnVjdCBvbWFwX2JhbGwgX19pbml0ZGF0YSBvbWFwM19jYmNfYmFsbFtdID0geworCV9PTUFQM19CQUxMRU5UUlkoQ0FNX0QwLCAiYWUxNiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoQ0FNX0QxLCAiYWUxNSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoQ0FNX0QxMCwgImQyNSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoQ0FNX0QxMSwgImUyNiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoQ0FNX0QyLCAiYTI0IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDQU1fRDMsICJiMjQiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9ENCwgImQyNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoQ0FNX0Q1LCAiYzI0IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDQU1fRDYsICJwMjUiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9ENywgInAyNiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoQ0FNX0Q4LCAibjI1IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDQU1fRDksICJuMjYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9GTEQsICJiMjMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9IUywgImMyMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoQ0FNX1BDTEssICJjMjYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9TVFJPQkUsICJkMjYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9WUywgImQyMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoQ0FNX1dFTiwgImEyMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoQ0FNX1hDTEtBLCAiYzI1IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDQU1fWENMS0IsICJlMjUiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENTSTJfRFgwLCAiYWQxNyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoQ1NJMl9EWDEsICJhZTE4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDU0kyX0RZMCwgImFkMTYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENTSTJfRFkxLCAiYWUxNyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0FDQklBUywgImYyNiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEEwLCAiYWUyMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEExLCAiYWUyMiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEExMCwgImFjMjYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMTEsICJhZDI2IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShEU1NfREFUQTEyLCAiYWEyNSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEExMywgInkyNSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEExNCwgImFhMjYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMTUsICJhYjI2IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShEU1NfREFUQTE2LCAibDI1IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShEU1NfREFUQTE3LCAibDI2IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShEU1NfREFUQTE4LCAibTI0IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShEU1NfREFUQTE5LCAibTI2IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShEU1NfREFUQTIsICJhZTIzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShEU1NfREFUQTIwLCAiZjI1IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShEU1NfREFUQTIxLCAibjI0IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShEU1NfREFUQTIyLCAiYWMyNSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEEyMywgImFiMjUiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMywgImFlMjQiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBNCwgImFkMjMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBNSwgImFkMjQiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBNiwgImcyNiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEE3LCAiaDI1IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShEU1NfREFUQTgsICJoMjYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBOSwgImoyNiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0hTWU5DLCAiazI0IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShEU1NfUENMSywgImcyNSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX1ZTWU5DLCAibTI1IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShFVEtfQ0xLLCAiYWIyIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShFVEtfQ1RMLCAiYWIzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShFVEtfRDAsICJhYzMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEVUS19EMSwgImFkNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QxMCwgImFlNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QxMSwgImFmNiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QxMiwgImFlNiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QxMywgImFmNyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QxNCwgImFmOSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QxNSwgImFlOSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QyLCAiYWQzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShFVEtfRDMsICJhYTMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEVUS19ENCwgInkzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShFVEtfRDUsICJhYjEiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEVUS19ENiwgImFlMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0Q3LCAiYWQyIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShFVEtfRDgsICJhYTQiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEVUS19EOSwgInYyIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0ExLCAiajIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfQTEwLCAiZDIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfQTIsICJoMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19BMywgImgyIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0E0LCAiZzIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfQTUsICJmMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19BNiwgImYyIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0E3LCAiZTEiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfQTgsICJlMiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19BOSwgImQxIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0NMSywgIm4xIiwgImwxIiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0QxMCwgInQxIiwgIm4xIiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0QxMSwgInUyIiwgInAyIiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0QxMiwgInUxIiwgInAxIiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0QxMywgInAxIiwgIm0xIiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0QxNCwgImwyIiwgImoyIiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0QxNSwgIm0yIiwgImsyIiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0Q4LCAidjEiLCAicjEiKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfRDksICJ5MSIsICJ0MSIpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19OQkUwX0NMRSwgImsyIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX05CRTEsICJqMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19OQ1MxLCAiYWQxIiwgIncxIiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX05DUzIsICJhMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19OQ1MzLCAiYjYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfTkNTNCwgImI0IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX05DUzUsICJjNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19OQ1M2LCAiYjUiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfTkNTNywgImM1IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX05XUCwgImFjNiIsICJ5NSIpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19XQUlUMSwgImFjOCIsICJ5OCIpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19XQUlUMiwgImIzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX1dBSVQzLCAiYzYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEhEUV9TSU8sICJqMjMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEhTVVNCMF9DTEssICJ3MTkiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEhTVVNCMF9EQVRBMCwgInYyMCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoSFNVU0IwX0RBVEExLCAieTIwIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShIU1VTQjBfREFUQTIsICJ2MTgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEhTVVNCMF9EQVRBMywgIncyMCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoSFNVU0IwX0RBVEE0LCAidzE3IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShIU1VTQjBfREFUQTUsICJ5MTgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEhTVVNCMF9EQVRBNiwgInkxOSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoSFNVU0IwX0RBVEE3LCAieTE3IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShIU1VTQjBfRElSLCAidjE5IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShIU1VTQjBfTlhULCAidzE4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShIU1VTQjBfU1RQLCAidTIwIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShJMkMyX1NDTCwgImMyIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShJMkMyX1NEQSwgImMxIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShJMkMzX1NDTCwgImFiNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoSTJDM19TREEsICJhYzQiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEkyQzRfU0NMLCAiYWQxNSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoSTJDNF9TREEsICJ3MTYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEpUQUdfRU1VMCwgInkxNSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoSlRBR19FTVUxLCAieTE0IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ0JTUDFfQ0xLUiwgInUxOSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNCU1AxX0NMS1gsICJ0MTciLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DQlNQMV9EUiwgInQyMCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNCU1AxX0RYLCAidTE3IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ0JTUDFfRlNSLCAidjE3IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ0JTUDFfRlNYLCAicDIwIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ0JTUDJfQ0xLWCwgInIxOCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNCU1AyX0RSLCAidDE4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ0JTUDJfRFgsICJyMTkiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DQlNQMl9GU1gsICJ1MTgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DQlNQM19DTEtYLCAidTMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DQlNQM19EUiwgIm4zIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ0JTUDNfRFgsICJwMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNCU1AzX0ZTWCwgInczIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ0JTUDRfQ0xLWCwgInYzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ0JTUDRfRFIsICJ1NCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNCU1A0X0RYLCAicjMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DQlNQNF9GU1gsICJ0MyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNCU1BfQ0xLUywgInQxOSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNTUEkxX0NMSywgInA5IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ1NQSTFfQ1MwLCAicjciLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DU1BJMV9DUzEsICJyOCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNTUEkxX0NTMiwgInI5IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ1NQSTFfQ1MzLCAidDgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DU1BJMV9TSU1PLCAicDgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DU1BJMV9TT01JLCAicDciLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DU1BJMl9DTEssICJ3NyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNTUEkyX0NTMCwgInY4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ1NQSTJfQ1MxLCAidjkiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DU1BJMl9TSU1PLCAidzgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DU1BJMl9TT01JLCAidTgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNETU1DMV9DTEssICJuMTkiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNETU1DMV9DTUQsICJsMTgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNETU1DMV9EQVQwLCAibTE5IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTRE1NQzFfREFUMSwgIm0xOCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RNTUMxX0RBVDIsICJrMTgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNETU1DMV9EQVQzLCAibjIwIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTRE1NQzFfREFUNCwgIm0yMCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RNTUMxX0RBVDUsICJwMTciLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNETU1DMV9EQVQ2LCAicDE4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTRE1NQzFfREFUNywgInAxOSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RNTUMyX0NMSywgIncxMCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RNTUMyX0NNRCwgInIxMCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RNTUMyX0RBVDAsICJ0MTAiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNETU1DMl9EQVQxLCAidDkiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNETU1DMl9EQVQyLCAidTEwIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTRE1NQzJfREFUMywgInU5IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTRE1NQzJfREFUNCwgInYxMCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RNTUMyX0RBVDUsICJtMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RNTUMyX0RBVDYsICJsMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RNTUMyX0RBVDcsICJrMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU1lTX0JPT1QwLCAiZjMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNZU19CT09UMSwgImQzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTWVNfQk9PVDIsICJjMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU1lTX0JPT1QzLCAiZTMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNZU19CT09UNCwgImU0IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTWVNfQk9PVDUsICJnMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU1lTX0JPT1Q2LCAiZDQiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNZU19DTEtPVVQxLCAiYWUxNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU1lTX0NMS09VVDIsICJ3MTEiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNZU19DTEtSRVEsICJ3MTUiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNZU19OSVJRLCAidjE2IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTWVNfTlJFU1dBUk0sICJhZDciLCAiYWE1IiksCisJX09NQVAzX0JBTExFTlRSWShTWVNfT0ZGX01PREUsICJ2MTIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFVBUlQxX0NUUywgIncyIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShVQVJUMV9SVFMsICJyMiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoVUFSVDFfUlgsICJoMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoVUFSVDFfVFgsICJsNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoVUFSVDJfQ1RTLCAieTI0IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShVQVJUMl9SVFMsICJhYTI0IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShVQVJUMl9SWCwgImFkMjEiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFVBUlQyX1RYLCAiYWQyMiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoVUFSVDNfQ1RTX1JDVFgsICJmMjMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFVBUlQzX1JUU19TRCwgImYyNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoVUFSVDNfUlhfSVJSWCwgImgyNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoVUFSVDNfVFhfSVJUWCwgImcyNCIsIE5VTEwpLAorCXsgLnJlZ19vZmZzZXQgPSBPTUFQX01VWF9URVJNSU5BVE9SIH0sCit9OworI2Vsc2UKKyNkZWZpbmUgb21hcDNfY2JjX2JhbGwJIE5VTEwKKyNlbmRpZgorCisvKgorICogU2lnbmFscyBkaWZmZXJlbnQgb24gQ1VTIHBhY2thZ2UgY29tcGFyZWQgdG8gc3VwZXJzZXQKKyAqLworI2lmIGRlZmluZWQoQ09ORklHX09NQVBfTVVYKSAmJiBkZWZpbmVkKENPTkZJR19PTUFQX1BBQ0tBR0VfQ1VTKQorc3RydWN0IG9tYXBfbXV4IF9faW5pdGRhdGEgb21hcDNfY3VzX3N1YnNldFtdID0geworCV9PTUFQM19NVVhFTlRSWShDQU1fRDEwLCAxMDksCisJCSJjYW1fZDEwIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTA5IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShDQU1fRDExLCAxMTAsCisJCSJjYW1fZDExIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTEwIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShDQU1fRDIsIDEwMSwKKwkJImNhbV9kMiIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzEwMSIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoQ0FNX0QzLCAxMDIsCisJCSJjYW1fZDMiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xMDIiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKENBTV9ENCwgMTAzLAorCQkiY2FtX2Q0IiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTAzIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShDQU1fRDUsIDEwNCwKKwkJImNhbV9kNSIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzEwNCIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoQ0FNX0ZMRCwgOTgsCisJCSJjYW1fZmxkIiwgTlVMTCwgImNhbV9nbG9iYWxfcmVzZXQiLCBOVUxMLAorCQkiZ3Bpb185OCIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoQ0FNX0hTLCA5NCwKKwkJImNhbV9ocyIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzk0IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShDQU1fUENMSywgOTcsCisJCSJjYW1fcGNsayIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzk3IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShDQU1fU1RST0JFLCAxMjYsCisJCSJjYW1fc3Ryb2JlIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTI2IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShDQU1fVlMsIDk1LAorCQkiY2FtX3ZzIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fOTUiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKENBTV9XRU4sIDE2NywKKwkJImNhbV93ZW4iLCBOVUxMLCAiY2FtX3NodXR0ZXIiLCBOVUxMLAorCQkiZ3Bpb18xNjciLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKERTU19EQVRBNiwgNzYsCisJCSJkc3NfZGF0YTYiLCBOVUxMLCAidWFydDFfdHgiLCBOVUxMLAorCQkiZ3Bpb183NiIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoRFNTX0RBVEE3LCA3NywKKwkJImRzc19kYXRhNyIsIE5VTEwsICJ1YXJ0MV9yeCIsIE5VTEwsCisJCSJncGlvXzc3IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShEU1NfREFUQTgsIDc4LAorCQkiZHNzX2RhdGE4IiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fNzgiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKERTU19EQVRBOSwgNzksCisJCSJkc3NfZGF0YTkiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb183OSIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoRFNTX0hTWU5DLCA2NywKKwkJImRzc19oc3luYyIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzY3IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShEU1NfUENMSywgNjYsCisJCSJkc3NfcGNsayIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzY2IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShFVEtfQ0xLLCAxMiwKKwkJImV0a19jbGsiLCAibWNic3A1X2Nsa3giLCAic2RtbWMzX2NsayIsICJoc3VzYjFfc3RwIiwKKwkJImdwaW9fMTIiLCAibW0xX3J4ZHAiLCAiaHN1c2IxX3RsbF9zdHAiLCBOVUxMKSwKKwlfT01BUDNfTVVYRU5UUlkoRVRLX0NUTCwgMTMsCisJCSJldGtfY3RsIiwgTlVMTCwgInNkbW1jM19jbWQiLCAiaHN1c2IxX2NsayIsCisJCSJncGlvXzEzIiwgTlVMTCwgImhzdXNiMV90bGxfY2xrIiwgTlVMTCksCisJX09NQVAzX01VWEVOVFJZKEVUS19EMCwgMTQsCisJCSJldGtfZDAiLCAibWNzcGkzX3NpbW8iLCAic2RtbWMzX2RhdDQiLCAiaHN1c2IxX2RhdGEwIiwKKwkJImdwaW9fMTQiLCAibW0xX3J4cmN2IiwgImhzdXNiMV90bGxfZGF0YTAiLCBOVUxMKSwKKwlfT01BUDNfTVVYRU5UUlkoRVRLX0QxLCAxNSwKKwkJImV0a19kMSIsICJtY3NwaTNfc29taSIsIE5VTEwsICJoc3VzYjFfZGF0YTEiLAorCQkiZ3Bpb18xNSIsICJtbTFfdHhzZTAiLCAiaHN1c2IxX3RsbF9kYXRhMSIsIE5VTEwpLAorCV9PTUFQM19NVVhFTlRSWShFVEtfRDEwLCAyNCwKKwkJImV0a19kMTAiLCBOVUxMLCAidWFydDFfcngiLCAiaHN1c2IyX2NsayIsCisJCSJncGlvXzI0IiwgTlVMTCwgImhzdXNiMl90bGxfY2xrIiwgTlVMTCksCisJX09NQVAzX01VWEVOVFJZKEVUS19EMTEsIDI1LAorCQkiZXRrX2QxMSIsIE5VTEwsIE5VTEwsICJoc3VzYjJfc3RwIiwKKwkJImdwaW9fMjUiLCAibW0yX3J4ZHAiLCAiaHN1c2IyX3RsbF9zdHAiLCBOVUxMKSwKKwlfT01BUDNfTVVYRU5UUlkoRVRLX0QxMiwgMjYsCisJCSJldGtfZDEyIiwgTlVMTCwgTlVMTCwgImhzdXNiMl9kaXIiLAorCQkiZ3Bpb18yNiIsIE5VTEwsICJoc3VzYjJfdGxsX2RpciIsIE5VTEwpLAorCV9PTUFQM19NVVhFTlRSWShFVEtfRDEzLCAyNywKKwkJImV0a19kMTMiLCBOVUxMLCBOVUxMLCAiaHN1c2IyX254dCIsCisJCSJncGlvXzI3IiwgIm1tMl9yeGRtIiwgImhzdXNiMl90bGxfbnh0IiwgTlVMTCksCisJX09NQVAzX01VWEVOVFJZKEVUS19EMTQsIDI4LAorCQkiZXRrX2QxNCIsIE5VTEwsIE5VTEwsICJoc3VzYjJfZGF0YTAiLAorCQkiZ3Bpb18yOCIsICJtbTJfcnhyY3YiLCAiaHN1c2IyX3RsbF9kYXRhMCIsIE5VTEwpLAorCV9PTUFQM19NVVhFTlRSWShFVEtfRDE1LCAyOSwKKwkJImV0a19kMTUiLCBOVUxMLCBOVUxMLCAiaHN1c2IyX2RhdGExIiwKKwkJImdwaW9fMjkiLCAibW0yX3R4c2UwIiwgImhzdXNiMl90bGxfZGF0YTEiLCBOVUxMKSwKKwlfT01BUDNfTVVYRU5UUlkoRVRLX0QyLCAxNiwKKwkJImV0a19kMiIsICJtY3NwaTNfY3MwIiwgTlVMTCwgImhzdXNiMV9kYXRhMiIsCisJCSJncGlvXzE2IiwgIm1tMV90eGRhdCIsICJoc3VzYjFfdGxsX2RhdGEyIiwgTlVMTCksCisJX09NQVAzX01VWEVOVFJZKEVUS19EMywgMTcsCisJCSJldGtfZDMiLCAibWNzcGkzX2NsayIsICJzZG1tYzNfZGF0MyIsICJoc3VzYjFfZGF0YTciLAorCQkiZ3Bpb18xNyIsIE5VTEwsICJoc3VzYjFfdGxsX2RhdGE3IiwgTlVMTCksCisJX09NQVAzX01VWEVOVFJZKEVUS19ENCwgMTgsCisJCSJldGtfZDQiLCAibWNic3A1X2RyIiwgInNkbW1jM19kYXQwIiwgImhzdXNiMV9kYXRhNCIsCisJCSJncGlvXzE4IiwgTlVMTCwgImhzdXNiMV90bGxfZGF0YTQiLCBOVUxMKSwKKwlfT01BUDNfTVVYRU5UUlkoRVRLX0Q1LCAxOSwKKwkJImV0a19kNSIsICJtY2JzcDVfZnN4IiwgInNkbW1jM19kYXQxIiwgImhzdXNiMV9kYXRhNSIsCisJCSJncGlvXzE5IiwgTlVMTCwgImhzdXNiMV90bGxfZGF0YTUiLCBOVUxMKSwKKwlfT01BUDNfTVVYRU5UUlkoRVRLX0Q2LCAyMCwKKwkJImV0a19kNiIsICJtY2JzcDVfZHgiLCAic2RtbWMzX2RhdDIiLCAiaHN1c2IxX2RhdGE2IiwKKwkJImdwaW9fMjAiLCBOVUxMLCAiaHN1c2IxX3RsbF9kYXRhNiIsIE5VTEwpLAorCV9PTUFQM19NVVhFTlRSWShFVEtfRDcsIDIxLAorCQkiZXRrX2Q3IiwgIm1jc3BpM19jczEiLCAic2RtbWMzX2RhdDciLCAiaHN1c2IxX2RhdGEzIiwKKwkJImdwaW9fMjEiLCAibW0xX3R4ZW5fbiIsICJoc3VzYjFfdGxsX2RhdGEzIiwgTlVMTCksCisJX09NQVAzX01VWEVOVFJZKEVUS19EOCwgMjIsCisJCSJldGtfZDgiLCAic3lzX2RybV9tc2VjdXJlIiwgInNkbW1jM19kYXQ2IiwgImhzdXNiMV9kaXIiLAorCQkiZ3Bpb18yMiIsIE5VTEwsICJoc3VzYjFfdGxsX2RpciIsIE5VTEwpLAorCV9PTUFQM19NVVhFTlRSWShFVEtfRDksIDIzLAorCQkiZXRrX2Q5IiwgInN5c19zZWN1cmVfaW5kaWNhdG9yIiwgInNkbW1jM19kYXQ1IiwgImhzdXNiMV9ueHQiLAorCQkiZ3Bpb18yMyIsICJtbTFfcnhkbSIsICJoc3VzYjFfdGxsX254dCIsIE5VTEwpLAorCV9PTUFQM19NVVhFTlRSWShNQ0JTUDNfQ0xLWCwgMTQyLAorCQkibWNic3AzX2Nsa3giLCAidWFydDJfdHgiLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xNDIiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKE1DQlNQM19EUiwgMTQxLAorCQkibWNic3AzX2RyIiwgInVhcnQyX3J0cyIsIE5VTEwsIE5VTEwsCisJCSJncGlvXzE0MSIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoTUNCU1AzX0RYLCAxNDAsCisJCSJtY2JzcDNfZHgiLCAidWFydDJfY3RzIiwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTQwIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShNQ0JTUDNfRlNYLCAxNDMsCisJCSJtY2JzcDNfZnN4IiwgInVhcnQyX3J4IiwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTQzIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShTRE1NQzJfREFUNSwgMTM3LAorCQkic2RtbWMyX2RhdDUiLCAic2RtbWMyX2Rpcl9kYXQxIiwKKwkJImNhbV9nbG9iYWxfcmVzZXQiLCAic2RtbWMzX2RhdDEiLAorCQkiZ3Bpb18xMzciLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFNETU1DMl9EQVQ2LCAxMzgsCisJCSJzZG1tYzJfZGF0NiIsICJzZG1tYzJfZGlyX2NtZCIsICJjYW1fc2h1dHRlciIsICJzZG1tYzNfZGF0MiIsCisJCSJncGlvXzEzOCIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoU0RNTUMyX0RBVDcsIDEzOSwKKwkJInNkbW1jMl9kYXQ3IiwgInNkbW1jMl9jbGtpbiIsIE5VTEwsICJzZG1tYzNfZGF0MyIsCisJCSJncGlvXzEzOSIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoVUFSVDFfQ1RTLCAxNTAsCisJCSJ1YXJ0MV9jdHMiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xNTAiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJeyAucmVnX29mZnNldCA9IE9NQVBfTVVYX1RFUk1JTkFUT1IgfSwKK307CisjZWxzZQorI2RlZmluZSBvbWFwM19jdXNfc3Vic2V0CU5VTEwKKyNlbmRpZgorCisvKgorICogQmFsbHMgZm9yIENVUyBwYWNrYWdlCisgKiA0MjMtcGluIHMtUEJHQSBQYWNrYWdlLCAwLjY1bW0gQmFsbCBQaXRjaCAoQm90dG9tKQorICovCisjaWYgZGVmaW5lZChDT05GSUdfT01BUF9NVVgpICYmIGRlZmluZWQoQ09ORklHX0RFQlVHX0ZTKQkJXAorCQkmJiBkZWZpbmVkKENPTkZJR19PTUFQX1BBQ0tBR0VfQ1VTKQorc3RydWN0IG9tYXBfYmFsbCBfX2luaXRkYXRhIG9tYXAzX2N1c19iYWxsW10gPSB7CisJX09NQVAzX0JBTExFTlRSWShDQU1fRDAsICJhYjE4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDQU1fRDEsICJhYzE4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDQU1fRDEwLCAiZjIxIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDQU1fRDExLCAiZzIxIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDQU1fRDIsICJnMTkiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9EMywgImYxOSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoQ0FNX0Q0LCAiZzIwIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDQU1fRDUsICJiMjEiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9ENiwgImwyNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoQ0FNX0Q3LCAiazI0IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDQU1fRDgsICJqMjMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9EOSwgImsyMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoQ0FNX0ZMRCwgImgyNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoQ0FNX0hTLCAiYTIyIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDQU1fUENMSywgImoxOSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoQ0FNX1NUUk9CRSwgImoyMCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoQ0FNX1ZTLCAiZTE4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDQU1fV0VOLCAiZjE4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDQU1fWENMS0EsICJiMjIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9YQ0xLQiwgImMyMiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0FDQklBUywgImoyMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEEwLCAiYWMxOSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEExLCAiYWIxOSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEExMCwgImFjMjIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMTEsICJhYzIzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShEU1NfREFUQTEyLCAiYWIyMiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEExMywgInkyMiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEExNCwgIncyMiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEExNSwgInYyMiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEExNiwgImoyMiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEExNywgImcyMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEExOCwgImcyNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEExOSwgImgyMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEEyLCAiYWQyMCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEEyMCwgImQyMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEEyMSwgImsyMiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEEyMiwgInYyMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEEyMywgIncyMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEEzLCAiYWMyMCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEE0LCAiYWQyMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEE1LCAiYWMyMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEE2LCAiZDI0IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShEU1NfREFUQTcsICJlMjMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBOCwgImUyNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEE5LCAiZjIzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShEU1NfSFNZTkMsICJlMjIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19QQ0xLLCAiZzIyIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShEU1NfVlNZTkMsICJmMjIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEVUS19DTEssICJhYzEiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEVUS19DVEwsICJhZDMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEVUS19EMCwgImFkNiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QxLCAiYWM2IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShFVEtfRDEwLCAiYWMzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShFVEtfRDExLCAiYWM5IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShFVEtfRDEyLCAiYWMxMCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QxMywgImFkMTEiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEVUS19EMTQsICJhYzExIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShFVEtfRDE1LCAiYWQxMiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QyLCAiYWM3IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShFVEtfRDMsICJhZDgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEVUS19ENCwgImFjNSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0Q1LCAiYWQyIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShFVEtfRDYsICJhYzgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEVUS19ENywgImFkOSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0Q4LCAiYWM0IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShFVEtfRDksICJhZDUiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfQTEsICJrNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19BMTAsICJnMiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19BMiwgImszIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0EzLCAiazIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfQTQsICJqNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19BNSwgImozIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0E2LCAiajIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfQTcsICJqMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19BOCwgImgxIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0E5LCAiaDIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfQ0xLLCAidzIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfRDEwLCAidTEiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfRDExLCAicjMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfRDEyLCAidDMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfRDEzLCAidTIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfRDE0LCAidjEiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfRDE1LCAidjIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfRDgsICJyMiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19EOSwgInQyIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX05CRTBfQ0xFLCAiazUiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfTkJFMSwgImwxIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX05DUzMsICJkMiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19OQ1M0LCAiZjQiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfTkNTNSwgImc1IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX05DUzYsICJmMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19OQ1M3LCAiZzQiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfTldQLCAiZTEiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfV0FJVDMsICJjMiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoSERRX1NJTywgImEyNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoSFNVU0IwX0NMSywgInIyMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoSFNVU0IwX0RBVEEwLCAidDI0IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShIU1VTQjBfREFUQTEsICJ0MjMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEhTVVNCMF9EQVRBMiwgInUyNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoSFNVU0IwX0RBVEEzLCAidTIzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShIU1VTQjBfREFUQTQsICJ3MjQiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEhTVVNCMF9EQVRBNSwgInYyMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoSFNVU0IwX0RBVEE2LCAidzIzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShIU1VTQjBfREFUQTcsICJ0MjIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEhTVVNCMF9ESVIsICJwMjMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEhTVVNCMF9OWFQsICJyMjIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEhTVVNCMF9TVFAsICJyMjMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEkyQzJfU0NMLCAiYWMxNSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoSTJDMl9TREEsICJhYzE0IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShJMkMzX1NDTCwgImFjMTMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEkyQzNfU0RBLCAiYWMxMiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoSTJDNF9TQ0wsICJ5MTYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEkyQzRfU0RBLCAieTE1IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShKVEFHX0VNVTAsICJhYzI0IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShKVEFHX0VNVTEsICJhZDI0IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ0JTUDFfQ0xLUiwgIncxOSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNCU1AxX0NMS1gsICJ2MTgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DQlNQMV9EUiwgInkxOCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNCU1AxX0RYLCAidzE4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ0JTUDFfRlNSLCAiYWIyMCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNCU1AxX0ZTWCwgImFhMTkiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DQlNQMl9DTEtYLCAidDIxIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ0JTUDJfRFIsICJ2MTkiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DQlNQMl9EWCwgInIyMCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNCU1AyX0ZTWCwgInYyMCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNCU1AzX0NMS1gsICJ3NCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNCU1AzX0RSLCAidjUiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DQlNQM19EWCwgInY2IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ0JTUDNfRlNYLCAidjQiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DQlNQX0NMS1MsICJhYTE4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ1NQSTFfQ0xLLCAidDUiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DU1BJMV9DUzAsICJ0NiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNTUEkxX0NTMywgInI1IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ1NQSTFfU0lNTywgInI0IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ1NQSTFfU09NSSwgInQ0IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ1NQSTJfQ0xLLCAibjUiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DU1BJMl9DUzAsICJtNSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNTUEkyX0NTMSwgIm00IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ1NQSTJfU0lNTywgIm40IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ1NQSTJfU09NSSwgIm4zIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTRE1NQzFfQ0xLLCAibTIzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTRE1NQzFfQ01ELCAibDIzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTRE1NQzFfREFUMCwgIm0yMiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RNTUMxX0RBVDEsICJtMjEiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNETU1DMV9EQVQyLCAibTIwIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTRE1NQzFfREFUMywgIm4yMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RNTUMxX0RBVDQsICJuMjIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNETU1DMV9EQVQ1LCAibjIxIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTRE1NQzFfREFUNiwgIm4yMCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RNTUMxX0RBVDcsICJwMjQiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNETU1DMl9DTEssICJ5MSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RNTUMyX0NNRCwgImFiNSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RNTUMyX0RBVDAsICJhYjMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNETU1DMl9EQVQxLCAieTMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNETU1DMl9EQVQyLCAidzMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNETU1DMl9EQVQzLCAidjMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNETU1DMl9EQVQ0LCAiYWIyIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTRE1NQzJfREFUNSwgImFhMiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RNTUMyX0RBVDYsICJ5MiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RNTUMyX0RBVDcsICJhYTEiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNZU19CT09UMCwgImFiMTIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNZU19CT09UMSwgImFjMTYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNZU19CT09UMiwgImFkMTciLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNZU19CT09UMywgImFkMTgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNZU19CT09UNCwgImFjMTciLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNZU19CT09UNSwgImFiMTYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNZU19CT09UNiwgImFhMTUiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNZU19DTEtPVVQxLCAieTciLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNZU19DTEtPVVQyLCAiYWE2IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTWVNfQ0xLUkVRLCAieTEzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTWVNfTklSUSwgIncxNiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU1lTX05SRVNXQVJNLCAieTEwIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTWVNfT0ZGX01PREUsICJhZDIzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShVQVJUMV9DVFMsICJhYzIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFVBUlQxX1JUUywgInc2IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShVQVJUMV9SWCwgInY3IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShVQVJUMV9UWCwgInc3IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShVQVJUM19DVFNfUkNUWCwgImEyMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoVUFSVDNfUlRTX1NELCAiYjIzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShVQVJUM19SWF9JUlJYLCAiYjI0IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShVQVJUM19UWF9JUlRYLCAiYzIzIiwgTlVMTCksCisJeyAucmVnX29mZnNldCA9IE9NQVBfTVVYX1RFUk1JTkFUT1IgfSwKK307CisjZWxzZQorI2RlZmluZSBvbWFwM19jdXNfYmFsbAkgTlVMTAorI2VuZGlmCisKKy8qCisgKiBTaWduYWxzIGRpZmZlcmVudCBvbiBDQkIgcGFja2FnZSBjb21hcGFyZWQgdG8gc3VwZXJzZXQKKyAqLworI2lmIGRlZmluZWQoQ09ORklHX09NQVBfTVVYKSAmJiBkZWZpbmVkKENPTkZJR19PTUFQX1BBQ0tBR0VfQ0JCKQorc3RydWN0IG9tYXBfbXV4IF9faW5pdGRhdGEgb21hcDNfY2JiX3N1YnNldFtdID0geworCV9PTUFQM19NVVhFTlRSWShDQU1fRDEwLCAxMDksCisJCSJjYW1fZDEwIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTA5IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShDQU1fRDExLCAxMTAsCisJCSJjYW1fZDExIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTEwIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShDQU1fRDIsIDEwMSwKKwkJImNhbV9kMiIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzEwMSIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoQ0FNX0QzLCAxMDIsCisJCSJjYW1fZDMiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xMDIiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKENBTV9ENCwgMTAzLAorCQkiY2FtX2Q0IiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTAzIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShDQU1fRDUsIDEwNCwKKwkJImNhbV9kNSIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzEwNCIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoQ0FNX0ZMRCwgOTgsCisJCSJjYW1fZmxkIiwgTlVMTCwgImNhbV9nbG9iYWxfcmVzZXQiLCBOVUxMLAorCQkiZ3Bpb185OCIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoQ0FNX0hTLCA5NCwKKwkJImNhbV9ocyIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzk0IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShDQU1fUENMSywgOTcsCisJCSJjYW1fcGNsayIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzk3IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShDQU1fU1RST0JFLCAxMjYsCisJCSJjYW1fc3Ryb2JlIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTI2IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShDQU1fVlMsIDk1LAorCQkiY2FtX3ZzIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fOTUiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKENBTV9XRU4sIDE2NywKKwkJImNhbV93ZW4iLCBOVUxMLCAiY2FtX3NodXR0ZXIiLCBOVUxMLAorCQkiZ3Bpb18xNjciLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKERTU19EQVRBNiwgNzYsCisJCSJkc3NfZGF0YTYiLCBOVUxMLCAidWFydDFfdHgiLCBOVUxMLAorCQkiZ3Bpb183NiIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoRFNTX0RBVEE3LCA3NywKKwkJImRzc19kYXRhNyIsIE5VTEwsICJ1YXJ0MV9yeCIsIE5VTEwsCisJCSJncGlvXzc3IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShEU1NfREFUQTgsIDc4LAorCQkiZHNzX2RhdGE4IiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fNzgiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKERTU19EQVRBOSwgNzksCisJCSJkc3NfZGF0YTkiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb183OSIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoRFNTX0hTWU5DLCA2NywKKwkJImRzc19oc3luYyIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzY3IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShEU1NfUENMSywgNjYsCisJCSJkc3NfcGNsayIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJncGlvXzY2IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShFVEtfQ0xLLCAxMiwKKwkJImV0a19jbGsiLCAibWNic3A1X2Nsa3giLCAic2RtbWMzX2NsayIsICJoc3VzYjFfc3RwIiwKKwkJImdwaW9fMTIiLCAibW0xX3J4ZHAiLCAiaHN1c2IxX3RsbF9zdHAiLCBOVUxMKSwKKwlfT01BUDNfTVVYRU5UUlkoRVRLX0NUTCwgMTMsCisJCSJldGtfY3RsIiwgTlVMTCwgInNkbW1jM19jbWQiLCAiaHN1c2IxX2NsayIsCisJCSJncGlvXzEzIiwgTlVMTCwgImhzdXNiMV90bGxfY2xrIiwgTlVMTCksCisJX09NQVAzX01VWEVOVFJZKEVUS19EMCwgMTQsCisJCSJldGtfZDAiLCAibWNzcGkzX3NpbW8iLCAic2RtbWMzX2RhdDQiLCAiaHN1c2IxX2RhdGEwIiwKKwkJImdwaW9fMTQiLCAibW0xX3J4cmN2IiwgImhzdXNiMV90bGxfZGF0YTAiLCBOVUxMKSwKKwlfT01BUDNfTVVYRU5UUlkoRVRLX0QxLCAxNSwKKwkJImV0a19kMSIsICJtY3NwaTNfc29taSIsIE5VTEwsICJoc3VzYjFfZGF0YTEiLAorCQkiZ3Bpb18xNSIsICJtbTFfdHhzZTAiLCAiaHN1c2IxX3RsbF9kYXRhMSIsIE5VTEwpLAorCV9PTUFQM19NVVhFTlRSWShFVEtfRDEwLCAyNCwKKwkJImV0a19kMTAiLCBOVUxMLCAidWFydDFfcngiLCAiaHN1c2IyX2NsayIsCisJCSJncGlvXzI0IiwgTlVMTCwgImhzdXNiMl90bGxfY2xrIiwgTlVMTCksCisJX09NQVAzX01VWEVOVFJZKEVUS19EMTEsIDI1LAorCQkiZXRrX2QxMSIsIE5VTEwsIE5VTEwsICJoc3VzYjJfc3RwIiwKKwkJImdwaW9fMjUiLCAibW0yX3J4ZHAiLCAiaHN1c2IyX3RsbF9zdHAiLCBOVUxMKSwKKwlfT01BUDNfTVVYRU5UUlkoRVRLX0QxMiwgMjYsCisJCSJldGtfZDEyIiwgTlVMTCwgTlVMTCwgImhzdXNiMl9kaXIiLAorCQkiZ3Bpb18yNiIsIE5VTEwsICJoc3VzYjJfdGxsX2RpciIsIE5VTEwpLAorCV9PTUFQM19NVVhFTlRSWShFVEtfRDEzLCAyNywKKwkJImV0a19kMTMiLCBOVUxMLCBOVUxMLCAiaHN1c2IyX254dCIsCisJCSJncGlvXzI3IiwgIm1tMl9yeGRtIiwgImhzdXNiMl90bGxfbnh0IiwgTlVMTCksCisJX09NQVAzX01VWEVOVFJZKEVUS19EMTQsIDI4LAorCQkiZXRrX2QxNCIsIE5VTEwsIE5VTEwsICJoc3VzYjJfZGF0YTAiLAorCQkiZ3Bpb18yOCIsICJtbTJfcnhyY3YiLCAiaHN1c2IyX3RsbF9kYXRhMCIsIE5VTEwpLAorCV9PTUFQM19NVVhFTlRSWShFVEtfRDE1LCAyOSwKKwkJImV0a19kMTUiLCBOVUxMLCBOVUxMLCAiaHN1c2IyX2RhdGExIiwKKwkJImdwaW9fMjkiLCAibW0yX3R4c2UwIiwgImhzdXNiMl90bGxfZGF0YTEiLCBOVUxMKSwKKwlfT01BUDNfTVVYRU5UUlkoRVRLX0QyLCAxNiwKKwkJImV0a19kMiIsICJtY3NwaTNfY3MwIiwgTlVMTCwgImhzdXNiMV9kYXRhMiIsCisJCSJncGlvXzE2IiwgIm1tMV90eGRhdCIsICJoc3VzYjFfdGxsX2RhdGEyIiwgTlVMTCksCisJX09NQVAzX01VWEVOVFJZKEVUS19EMywgMTcsCisJCSJldGtfZDMiLCAibWNzcGkzX2NsayIsICJzZG1tYzNfZGF0MyIsICJoc3VzYjFfZGF0YTciLAorCQkiZ3Bpb18xNyIsIE5VTEwsICJoc3VzYjFfdGxsX2RhdGE3IiwgTlVMTCksCisJX09NQVAzX01VWEVOVFJZKEVUS19ENCwgMTgsCisJCSJldGtfZDQiLCAibWNic3A1X2RyIiwgInNkbW1jM19kYXQwIiwgImhzdXNiMV9kYXRhNCIsCisJCSJncGlvXzE4IiwgTlVMTCwgImhzdXNiMV90bGxfZGF0YTQiLCBOVUxMKSwKKwlfT01BUDNfTVVYRU5UUlkoRVRLX0Q1LCAxOSwKKwkJImV0a19kNSIsICJtY2JzcDVfZnN4IiwgInNkbW1jM19kYXQxIiwgImhzdXNiMV9kYXRhNSIsCisJCSJncGlvXzE5IiwgTlVMTCwgImhzdXNiMV90bGxfZGF0YTUiLCBOVUxMKSwKKwlfT01BUDNfTVVYRU5UUlkoRVRLX0Q2LCAyMCwKKwkJImV0a19kNiIsICJtY2JzcDVfZHgiLCAic2RtbWMzX2RhdDIiLCAiaHN1c2IxX2RhdGE2IiwKKwkJImdwaW9fMjAiLCBOVUxMLCAiaHN1c2IxX3RsbF9kYXRhNiIsIE5VTEwpLAorCV9PTUFQM19NVVhFTlRSWShFVEtfRDcsIDIxLAorCQkiZXRrX2Q3IiwgIm1jc3BpM19jczEiLCAic2RtbWMzX2RhdDciLCAiaHN1c2IxX2RhdGEzIiwKKwkJImdwaW9fMjEiLCAibW0xX3R4ZW5fbiIsICJoc3VzYjFfdGxsX2RhdGEzIiwgTlVMTCksCisJX09NQVAzX01VWEVOVFJZKEVUS19EOCwgMjIsCisJCSJldGtfZDgiLCAic3lzX2RybV9tc2VjdXJlIiwgInNkbW1jM19kYXQ2IiwgImhzdXNiMV9kaXIiLAorCQkiZ3Bpb18yMiIsIE5VTEwsICJoc3VzYjFfdGxsX2RpciIsIE5VTEwpLAorCV9PTUFQM19NVVhFTlRSWShFVEtfRDksIDIzLAorCQkiZXRrX2Q5IiwgInN5c19zZWN1cmVfaW5kaWNhdG9yIiwgInNkbW1jM19kYXQ1IiwgImhzdXNiMV9ueHQiLAorCQkiZ3Bpb18yMyIsICJtbTFfcnhkbSIsICJoc3VzYjFfdGxsX254dCIsIE5VTEwpLAorCXsgLnJlZ19vZmZzZXQgPSBPTUFQX01VWF9URVJNSU5BVE9SIH0sCit9OworI2Vsc2UKKyNkZWZpbmUgb21hcDNfY2JiX3N1YnNldAlOVUxMCisjZW5kaWYKKworLyoKKyAqIEJhbGxzIGZvciBDQkIgcGFja2FnZQorICogNTE1LXBpbiBzLVBCR0EgUGFja2FnZSwgMC41MG1tIEJhbGwgUGl0Y2ggKFRvcCksIDAuNDBtbSBCYWxsIFBpdGNoIChCb3R0b20pCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQX01VWCkgJiYgZGVmaW5lZChDT05GSUdfREVCVUdfRlMpCQlcCisJCSYmIGRlZmluZWQoQ09ORklHX09NQVBfUEFDS0FHRV9DQkIpCitzdHJ1Y3Qgb21hcF9iYWxsIF9faW5pdGRhdGEgb21hcDNfY2JiX2JhbGxbXSA9IHsKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9EMCwgImFnMTciLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9EMSwgImFoMTciLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9EMTAsICJiMjUiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9EMTEsICJjMjYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9EMiwgImIyNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoQ0FNX0QzLCAiYzI0IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDQU1fRDQsICJkMjQiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9ENSwgImEyNSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoQ0FNX0Q2LCAiazI4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDQU1fRDcsICJsMjgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9EOCwgImsyNyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoQ0FNX0Q5LCAibDI3IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDQU1fRkxELCAiYzIzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDQU1fSFMsICJhMjQiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9QQ0xLLCAiYzI3IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDQU1fU1RST0JFLCAiZDI1IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDQU1fVlMsICJhMjMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9XRU4sICJiMjMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9YQ0xLQSwgImMyNSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoQ0FNX1hDTEtCLCAiYjI2IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDU0kyX0RYMCwgImFnMTkiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENTSTJfRFgxLCAiYWcxOCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoQ1NJMl9EWTAsICJhaDE5IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDU0kyX0RZMSwgImFoMTgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19BQ0JJQVMsICJlMjciLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMCwgImFnMjIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMSwgImFoMjIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMTAsICJhZDI4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShEU1NfREFUQTExLCAiYWQyNyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEExMiwgImFiMjgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMTMsICJhYjI3IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShEU1NfREFUQTE0LCAiYWEyOCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEExNSwgImFhMjciLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMTYsICJnMjUiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMTcsICJoMjciLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMTgsICJoMjYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMTksICJoMjUiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMiwgImFnMjMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMjAsICJlMjgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMjEsICJqMjYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMjIsICJhYzI3IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShEU1NfREFUQTIzLCAiYWMyOCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEEzLCAiYWgyMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEE0LCAiYWcyNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEE1LCAiYWgyNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEE2LCAiZTI2IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShEU1NfREFUQTcsICJmMjgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBOCwgImYyNyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEE5LCAiZzI2IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShEU1NfSFNZTkMsICJkMjYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19QQ0xLLCAiZDI4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShEU1NfVlNZTkMsICJkMjciLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEVUS19DTEssICJhZjEwIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShFVEtfQ1RMLCAiYWUxMCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QwLCAiYWYxMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QxLCAiYWcxMiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QxMCwgImFlNyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QxMSwgImFmNyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QxMiwgImFnNyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QxMywgImFoNyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QxNCwgImFnOCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QxNSwgImFoOCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QyLCAiYWgxMiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QzLCAiYWUxMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0Q0LCAiYWUxMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0Q1LCAiYWg5IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShFVEtfRDYsICJhZjEzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShFVEtfRDcsICJhaDE0IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShFVEtfRDgsICJhZjkiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEVUS19EOSwgImFnOSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19BMSwgIm40IiwgImFjMTUiKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfQTEwLCAiazMiLCAiYWIxOSIpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19BMiwgIm00IiwgImFiMTUiKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfQTMsICJsNCIsICJhYzE2IiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0E0LCAiazQiLCAiYWIxNiIpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19BNSwgInQzIiwgImFjMTciKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfQTYsICJyMyIsICJhYjE3IiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0E3LCAibjMiLCAiYWMxOCIpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19BOCwgIm0zIiwgImFiMTgiKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfQTksICJsMyIsICJhYzE5IiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0NMSywgInQ0IiwgIncyIiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0QxMCwgInAxIiwgImFiNCIpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19EMTEsICJyMSIsICJhYzQiKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfRDEyLCAicjIiLCAiYWI2IiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0QxMywgInQyIiwgImFjNiIpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19EMTQsICJ3MSIsICJhYjciKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfRDE1LCAieTEiLCAiYWM3IiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0Q4LCAiaDIiLCAiYWIzIiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0Q5LCAiazIiLCAiYWMzIiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX05CRTBfQ0xFLCAiZzMiLCAiYWMxMiIpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19OQkUxLCAidTMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfTkNTMSwgImgzIiwgInkxIiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX05DUzIsICJ2OCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19OQ1MzLCAidTgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfTkNTNCwgInQ4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX05DUzUsICJyOCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19OQ1M2LCAicDgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfTkNTNywgIm44IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX05XUCwgImgxIiwgImFiMTAiKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfV0FJVDEsICJsOCIsICJhYzEwIiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX1dBSVQyLCAiazgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfV0FJVDMsICJqOCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoSERRX1NJTywgImoyNSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoSFNVU0IwX0NMSywgInQyOCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoSFNVU0IwX0RBVEEwLCAidDI3IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShIU1VTQjBfREFUQTEsICJ1MjgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEhTVVNCMF9EQVRBMiwgInUyNyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoSFNVU0IwX0RBVEEzLCAidTI2IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShIU1VTQjBfREFUQTQsICJ1MjUiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEhTVVNCMF9EQVRBNSwgInYyOCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoSFNVU0IwX0RBVEE2LCAidjI3IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShIU1VTQjBfREFUQTcsICJ2MjYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEhTVVNCMF9ESVIsICJyMjgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEhTVVNCMF9OWFQsICJ0MjYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEhTVVNCMF9TVFAsICJ0MjUiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEkyQzJfU0NMLCAiYWYxNSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoSTJDMl9TREEsICJhZTE1IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShJMkMzX1NDTCwgImFmMTQiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEkyQzNfU0RBLCAiYWcxNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoSTJDNF9TQ0wsICJhZDI2IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShJMkM0X1NEQSwgImFlMjYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEpUQUdfRU1VMCwgImFhMTEiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEpUQUdfRU1VMSwgImFhMTAiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DQlNQMV9DTEtSLCAieTIxIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ0JTUDFfQ0xLWCwgIncyMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNCU1AxX0RSLCAidTIxIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ0JTUDFfRFgsICJ2MjEiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DQlNQMV9GU1IsICJhYTIxIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ0JTUDFfRlNYLCAiazI2IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ0JTUDJfQ0xLWCwgIm4yMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNCU1AyX0RSLCAicjIxIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ0JTUDJfRFgsICJtMjEiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DQlNQMl9GU1gsICJwMjEiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DQlNQM19DTEtYLCAiYWY1IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ0JTUDNfRFIsICJhZTYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DQlNQM19EWCwgImFmNiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNCU1AzX0ZTWCwgImFlNSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNCU1A0X0NMS1gsICJhZTEiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DQlNQNF9EUiwgImFkMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNCU1A0X0RYLCAiYWQyIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ0JTUDRfRlNYLCAiYWMxIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ0JTUF9DTEtTLCAidDIxIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ1NQSTFfQ0xLLCAiYWIzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ1NQSTFfQ1MwLCAiYWMyIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ1NQSTFfQ1MxLCAiYWMzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ1NQSTFfQ1MyLCAiYWIxIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ1NQSTFfQ1MzLCAiYWIyIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ1NQSTFfU0lNTywgImFiNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNTUEkxX1NPTUksICJhYTQiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DU1BJMl9DTEssICJhYTMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DU1BJMl9DUzAsICJ5NCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNTUEkyX0NTMSwgInYzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ1NQSTJfU0lNTywgInkyIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ1NQSTJfU09NSSwgInkzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTRE1NQzFfQ0xLLCAibjI4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTRE1NQzFfQ01ELCAibTI3IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTRE1NQzFfREFUMCwgIm4yNyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RNTUMxX0RBVDEsICJuMjYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNETU1DMV9EQVQyLCAibjI1IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTRE1NQzFfREFUMywgInAyOCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RNTUMxX0RBVDQsICJwMjciLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNETU1DMV9EQVQ1LCAicDI2IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTRE1NQzFfREFUNiwgInIyNyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RNTUMxX0RBVDcsICJyMjUiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNETU1DMl9DTEssICJhZTIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNETU1DMl9DTUQsICJhZzUiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNETU1DMl9EQVQwLCAiYWg1IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTRE1NQzJfREFUMSwgImFoNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RNTUMyX0RBVDIsICJhZzQiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNETU1DMl9EQVQzLCAiYWY0IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTRE1NQzJfREFUNCwgImFlNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RNTUMyX0RBVDUsICJhaDMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNETU1DMl9EQVQ2LCAiYWYzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTRE1NQzJfREFUNywgImFlMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU1lTX0JPT1QwLCAiYWgyNiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU1lTX0JPT1QxLCAiYWcyNiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU1lTX0JPT1QyLCAiYWUxNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU1lTX0JPT1QzLCAiYWYxOCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU1lTX0JPT1Q0LCAiYWYxOSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU1lTX0JPT1Q1LCAiYWUyMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU1lTX0JPT1Q2LCAiYWYyMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU1lTX0NMS09VVDEsICJhZzI1IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTWVNfQ0xLT1VUMiwgImFlMjIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNZU19DTEtSRVEsICJhZjI1IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTWVNfTklSUSwgImFmMjYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNZU19OUkVTV0FSTSwgImFmMjQiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNZU19PRkZfTU9ERSwgImFmMjIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFVBUlQxX0NUUywgInc4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShVQVJUMV9SVFMsICJhYTkiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFVBUlQxX1JYLCAieTgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFVBUlQxX1RYLCAiYWE4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShVQVJUMl9DVFMsICJhYjI2IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShVQVJUMl9SVFMsICJhYjI1IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShVQVJUMl9SWCwgImFkMjUiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFVBUlQyX1RYLCAiYWEyNSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoVUFSVDNfQ1RTX1JDVFgsICJoMTgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFVBUlQzX1JUU19TRCwgImgxOSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoVUFSVDNfUlhfSVJSWCwgImgyMCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoVUFSVDNfVFhfSVJUWCwgImgyMSIsIE5VTEwpLAorCXsgLnJlZ19vZmZzZXQgPSBPTUFQX01VWF9URVJNSU5BVE9SIH0sCit9OworI2Vsc2UKKyNkZWZpbmUgb21hcDNfY2JiX2JhbGwJIE5VTEwKKyNlbmRpZgorCisvKgorICogU2lnbmFscyBkaWZmZXJlbnQgb24gMzZYWCBDQlAgcGFja2FnZSBjb21hcGFyZWQgdG8gMzRYWCBDQkMgcGFja2FnZQorICovCisjaWYgZGVmaW5lZChDT05GSUdfT01BUF9NVVgpICYmIGRlZmluZWQoQ09ORklHX09NQVBfUEFDS0FHRV9DQlApCitzdHJ1Y3Qgb21hcF9tdXggX19pbml0ZGF0YSBvbWFwMzZ4eF9jYnBfc3Vic2V0W10gPSB7CisJX09NQVAzX01VWEVOVFJZKENBTV9EMCwgOTksCisJCSJjYW1fZDAiLCBOVUxMLCAiY3NpMl9keDIiLCBOVUxMLAorCQkiZ3Bpb185OSIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoQ0FNX0QxLCAxMDAsCisJCSJjYW1fZDEiLCBOVUxMLCAiY3NpMl9keTIiLCBOVUxMLAorCQkiZ3Bpb18xMDAiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKENBTV9EMTAsIDEwOSwKKwkJImNhbV9kMTAiLCAic3NpMl93YWtlIiwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTA5IiwgImh3X2RiZzgiLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKENBTV9EMiwgMTAxLAorCQkiY2FtX2QyIiwgInNzaTJfcmR5X3R4IiwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTAxIiwgImh3X2RiZzQiLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKENBTV9EMywgMTAyLAorCQkiY2FtX2QzIiwgInNzaTJfZGF0X3J4IiwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTAyIiwgImh3X2RiZzUiLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKENBTV9ENCwgMTAzLAorCQkiY2FtX2Q0IiwgInNzaTJfZmxhZ19yeCIsIE5VTEwsIE5VTEwsCisJCSJncGlvXzEwMyIsICJod19kYmc2IiwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShDQU1fRDUsIDEwNCwKKwkJImNhbV9kNSIsICJzc2kyX3JkeV9yeCIsIE5VTEwsIE5VTEwsCisJCSJncGlvXzEwNCIsICJod19kYmc3IiwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShDQU1fSFMsIDk0LAorCQkiY2FtX2hzIiwgInNzaTJfZGF0X3R4IiwgTlVMTCwgTlVMTCwKKwkJImdwaW9fOTQiLCAiaHdfZGJnMCIsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoQ0FNX1ZTLCA5NSwKKwkJImNhbV92cyIsICJzc2kyX2ZsYWdfdHgiLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb185NSIsICJod19kYmcxIiwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShEU1NfREFUQTAsIDcwLAorCQkiZHNzX2RhdGEwIiwgImRzaV9keDAiLCAidWFydDFfY3RzIiwgTlVMTCwKKwkJImdwaW9fNzAiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKERTU19EQVRBMSwgNzEsCisJCSJkc3NfZGF0YTEiLCAiZHNpX2R5MCIsICJ1YXJ0MV9ydHMiLCBOVUxMLAorCQkiZ3Bpb183MSIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoRFNTX0RBVEEyLCA3MiwKKwkJImRzc19kYXRhMiIsICJkc2lfZHgxIiwgTlVMTCwgTlVMTCwKKwkJImdwaW9fNzIiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKERTU19EQVRBMywgNzMsCisJCSJkc3NfZGF0YTMiLCAiZHNpX2R5MSIsIE5VTEwsIE5VTEwsCisJCSJncGlvXzczIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShEU1NfREFUQTQsIDc0LAorCQkiZHNzX2RhdGE0IiwgImRzaV9keDIiLCAidWFydDNfcnhfaXJyeCIsIE5VTEwsCisJCSJncGlvXzc0IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShEU1NfREFUQTUsIDc1LAorCQkiZHNzX2RhdGE1IiwgImRzaV9keTIiLCAidWFydDNfdHhfaXJ0eCIsIE5VTEwsCisJCSJncGlvXzc1IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShEU1NfREFUQTYsIDc2LAorCQkiZHNzX2RhdGE2IiwgTlVMTCwgInVhcnQxX3R4IiwgImRzc3ZlbmM2NTZfZGF0YTYiLAorCQkiZ3Bpb183NiIsICJod19kYmcxNCIsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoRFNTX0RBVEE3LCA3NywKKwkJImRzc19kYXRhNyIsIE5VTEwsICJ1YXJ0MV9yeCIsICJkc3N2ZW5jNjU2X2RhdGE3IiwKKwkJImdwaW9fNzciLCAiaHdfZGJnMTUiLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKERTU19EQVRBOCwgNzgsCisJCSJkc3NfZGF0YTgiLCBOVUxMLCAidWFydDNfcnhfaXJyeCIsIE5VTEwsCisJCSJncGlvXzc4IiwgImh3X2RiZzE2IiwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShEU1NfREFUQTksIDc5LAorCQkiZHNzX2RhdGE5IiwgTlVMTCwgInVhcnQzX3R4X2lydHgiLCBOVUxMLAorCQkiZ3Bpb183OSIsICJod19kYmcxNyIsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoRVRLX0QxMiwgMjYsCisJCSJldGtfZDEyIiwgInN5c19kcm1fbXNlY3VyZSIsIE5VTEwsICJoc3VzYjJfZGlyIiwKKwkJImdwaW9fMjYiLCBOVUxMLCAiaHN1c2IyX3RsbF9kaXIiLCAiaHdfZGJnMTQiKSwKKwlfT01BUDNfTVVYRU5UUlkoR1BNQ19BMTEsIDAsCisJCSJncG1jX2ExMSIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCU5VTEwsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoR1BNQ19XQUlUMiwgNjQsCisJCSJncG1jX3dhaXQyIiwgTlVMTCwgInVhcnQ0X3R4IiwgTlVMTCwKKwkJImdwaW9fNjQiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKEdQTUNfV0FJVDMsIDY1LAorCQkiZ3BtY193YWl0MyIsICJzeXNfbmRtYXJlcTEiLCAidWFydDRfcngiLCBOVUxMLAorCQkiZ3Bpb182NSIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoSFNVU0IwX0RBVEEwLCAxMjUsCisJCSJoc3VzYjBfZGF0YTAiLCBOVUxMLCAidWFydDNfdHhfaXJ0eCIsIE5VTEwsCisJCSJncGlvXzEyNSIsICJ1YXJ0Ml90eCIsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoSFNVU0IwX0RBVEExLCAxMzAsCisJCSJoc3VzYjBfZGF0YTEiLCBOVUxMLCAidWFydDNfcnhfaXJyeCIsIE5VTEwsCisJCSJncGlvXzEzMCIsICJ1YXJ0Ml9yeCIsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoSFNVU0IwX0RBVEEyLCAxMzEsCisJCSJoc3VzYjBfZGF0YTIiLCBOVUxMLCAidWFydDNfcnRzX3NkIiwgTlVMTCwKKwkJImdwaW9fMTMxIiwgInVhcnQyX3J0cyIsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoSFNVU0IwX0RBVEEzLCAxNjksCisJCSJoc3VzYjBfZGF0YTMiLCBOVUxMLCAidWFydDNfY3RzX3JjdHgiLCBOVUxMLAorCQkiZ3Bpb18xNjkiLCAidWFydDJfY3RzIiwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShNQ0JTUDFfQ0xLUiwgMTU2LAorCQkibWNic3AxX2Nsa3IiLCAibWNzcGk0X2NsayIsICJzaW1fY2QiLCBOVUxMLAorCQkiZ3Bpb18xNTYiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKE1DQlNQMV9GU1IsIDE1NywKKwkJIm1jYnNwMV9mc3IiLCAiYWRwbGx2MmRfZGl0aGVyaW5nX2VuMSIsCisJCSJjYW1fZ2xvYmFsX3Jlc2V0IiwgTlVMTCwKKwkJImdwaW9fMTU3IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShNQ0JTUDRfQ0xLWCwgMTUyLAorCQkibWNic3A0X2Nsa3giLCAic3NpMV9kYXRfcngiLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xNTIiLCAiaHN1c2IzX3RsbF9kYXRhMSIsICJtbTNfdHhzZTAiLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKE1DQlNQNF9EUiwgMTUzLAorCQkibWNic3A0X2RyIiwgInNzaTFfZmxhZ19yeCIsIE5VTEwsIE5VTEwsCisJCSJncGlvXzE1MyIsICJoc3VzYjNfdGxsX2RhdGEwIiwgIm1tM19yeHJjdiIsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoTUNCU1A0X0RYLCAxNTQsCisJCSJtY2JzcDRfZHgiLCAic3NpMV9yZHlfcngiLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xNTQiLCAiaHN1c2IzX3RsbF9kYXRhMiIsICJtbTNfdHhkYXQiLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKE1DQlNQNF9GU1gsIDE1NSwKKwkJIm1jYnNwNF9mc3giLCAic3NpMV93YWtlIiwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTU1IiwgImhzdXNiM190bGxfZGF0YTMiLCAibW0zX3R4ZW5fbiIsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoTUNTUEkxX0NTMSwgMTc1LAorCQkibWNzcGkxX2NzMSIsICJhZHBsbHYyZF9kaXRoZXJpbmdfZW4yIiwgTlVMTCwgInNkbW1jM19jbWQiLAorCQkiZ3Bpb18xNzUiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFNBRDJEX01CVVNGTEFHLCAwLAorCQkic2FkMmRfbWJ1c2ZsYWciLCAibWFkMmRfc2J1c2ZsYWciLCBOVUxMLCBOVUxMLAorCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSwKKwlfT01BUDNfTVVYRU5UUlkoU0FEMkRfTUNBRDI4LCAwLAorCQkic2FkMmRfbWNhZDI4IiwgIm1hZDJkX21jYWQyOCIsIE5VTEwsIE5VTEwsCisJCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpLAorCV9PTUFQM19NVVhFTlRSWShTQUQyRF9NQ0FEMjksIDAsCisJCSJzYWQyZF9tY2FkMjkiLCAibWFkMmRfbWNhZDI5IiwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCksCisJX09NQVAzX01VWEVOVFJZKFNBRDJEX01DQUQzMiwgMCwKKwkJInNhZDJkX21jYWQzMiIsICJtYWQyZF9tY2FkMzIiLCBOVUxMLCBOVUxMLAorCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSwKKwlfT01BUDNfTVVYRU5UUlkoU0FEMkRfTUNBRDMzLCAwLAorCQkic2FkMmRfbWNhZDMzIiwgIm1hZDJkX21jYWQzMyIsIE5VTEwsIE5VTEwsCisJCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpLAorCV9PTUFQM19NVVhFTlRSWShTQUQyRF9NQ0FEMzQsIDAsCisJCSJzYWQyZF9tY2FkMzQiLCAibWFkMmRfbWNhZDM0IiwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCksCisJX09NQVAzX01VWEVOVFJZKFNBRDJEX01DQUQzNSwgMCwKKwkJInNhZDJkX21jYWQzNSIsICJtYWQyZF9tY2FkMzUiLCBOVUxMLCBOVUxMLAorCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSwKKwlfT01BUDNfTVVYRU5UUlkoU0FEMkRfTUNBRDM2LCAwLAorCQkic2FkMmRfbWNhZDM2IiwgIm1hZDJkX21jYWQzNiIsIE5VTEwsIE5VTEwsCisJCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpLAorCV9PTUFQM19NVVhFTlRSWShTQUQyRF9NUkVBRCwgMCwKKwkJInNhZDJkX21yZWFkIiwgIm1hZDJkX3NyZWFkIiwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCksCisJX09NQVAzX01VWEVOVFJZKFNBRDJEX01XUklURSwgMCwKKwkJInNhZDJkX213cml0ZSIsICJtYWQyZF9zd3JpdGUiLCBOVUxMLCBOVUxMLAorCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSwKKwlfT01BUDNfTVVYRU5UUlkoU0FEMkRfU0JVU0ZMQUcsIDAsCisJCSJzYWQyZF9zYnVzZmxhZyIsICJtYWQyZF9tYnVzZmxhZyIsIE5VTEwsIE5VTEwsCisJCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpLAorCV9PTUFQM19NVVhFTlRSWShTQUQyRF9TUkVBRCwgMCwKKwkJInNhZDJkX3NyZWFkIiwgIm1hZDJkX21yZWFkIiwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCksCisJX09NQVAzX01VWEVOVFJZKFNBRDJEX1NXUklURSwgMCwKKwkJInNhZDJkX3N3cml0ZSIsICJtYWQyZF9td3JpdGUiLCBOVUxMLCBOVUxMLAorCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSwKKwlfT01BUDNfTVVYRU5UUlkoU0RNTUMxX0NMSywgMTIwLAorCQkic2RtbWMxX2NsayIsICJtc19jbGsiLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xMjAiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFNETU1DMV9DTUQsIDEyMSwKKwkJInNkbW1jMV9jbWQiLCAibXNfYnMiLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xMjEiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFNETU1DMV9EQVQwLCAxMjIsCisJCSJzZG1tYzFfZGF0MCIsICJtc19kYXQwIiwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTIyIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShTRE1NQzFfREFUMSwgMTIzLAorCQkic2RtbWMxX2RhdDEiLCAibXNfZGF0MSIsIE5VTEwsIE5VTEwsCisJCSJncGlvXzEyMyIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoU0RNTUMxX0RBVDIsIDEyNCwKKwkJInNkbW1jMV9kYXQyIiwgIm1zX2RhdDIiLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xMjQiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFNETU1DMV9EQVQzLCAxMjUsCisJCSJzZG1tYzFfZGF0MyIsICJtc19kYXQzIiwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTI1IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShTRFJDX0NLRTAsIDAsCisJCSJzZHJjX2NrZTAiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQlOVUxMLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlX291dDEiKSwKKwlfT01BUDNfTVVYRU5UUlkoU0RSQ19DS0UxLCAwLAorCQkic2RyY19ja2UxIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZV9vdXQxIiksCisJX09NQVAzX01VWEVOVFJZKFNJTV9JTywgMTI2LAorCQkic2ltX2lvIiwgInNpbV9pb19sb3dfaW1wZWRhbmNlIiwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTI2IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShTSU1fQ0xLLCAxMjcsCisJCSJzaW1fY2xrIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTI3IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShTSU1fUFdSQ1RSTCwgMTI4LAorCQkic2ltX3B3cmN0cmwiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xMjgiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFNJTV9SU1QsIDEyOSwKKwkJInNpbV9yc3QiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xMjkiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFNZU19CT09UMCwgMiwKKwkJInN5c19ib290MCIsIE5VTEwsIE5VTEwsICJkc3NfZGF0YTE4IiwKKwkJImdwaW9fMiIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoU1lTX0JPT1QxLCAzLAorCQkic3lzX2Jvb3QxIiwgTlVMTCwgTlVMTCwgImRzc19kYXRhMTkiLAorCQkiZ3Bpb18zIiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCV9PTUFQM19NVVhFTlRSWShTWVNfQk9PVDMsIDUsCisJCSJzeXNfYm9vdDMiLCBOVUxMLCBOVUxMLCAiZHNzX2RhdGEyMCIsCisJCSJncGlvXzUiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFNZU19CT09UNCwgNiwKKwkJInN5c19ib290NCIsICJzZG1tYzJfZGlyX2RhdDIiLCBOVUxMLCAiZHNzX2RhdGEyMSIsCisJCSJncGlvXzYiLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFNZU19CT09UNSwgNywKKwkJInN5c19ib290NSIsICJzZG1tYzJfZGlyX2RhdDMiLCBOVUxMLCAiZHNzX2RhdGEyMiIsCisJCSJncGlvXzciLCBOVUxMLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFNZU19CT09UNiwgOCwKKwkJInN5c19ib290NiIsIE5VTEwsIE5VTEwsICJkc3NfZGF0YTIzIiwKKwkJImdwaW9fOCIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoVUFSVDFfQ1RTLCAxNTAsCisJCSJ1YXJ0MV9jdHMiLCAic3NpMV9yZHlfdHgiLCBOVUxMLCBOVUxMLAorCQkiZ3Bpb18xNTAiLCAiaHN1c2IzX3RsbF9jbGsiLCBOVUxMLCAic2FmZV9tb2RlIiksCisJX09NQVAzX01VWEVOVFJZKFVBUlQxX1JUUywgMTQ5LAorCQkidWFydDFfcnRzIiwgInNzaTFfZmxhZ190eCIsIE5VTEwsIE5VTEwsCisJCSJncGlvXzE0OSIsIE5VTEwsIE5VTEwsICJzYWZlX21vZGUiKSwKKwlfT01BUDNfTVVYRU5UUlkoVUFSVDFfVFgsIDE0OCwKKwkJInVhcnQxX3R4IiwgInNzaTFfZGF0X3R4IiwgTlVMTCwgTlVMTCwKKwkJImdwaW9fMTQ4IiwgTlVMTCwgTlVMTCwgInNhZmVfbW9kZSIpLAorCXsgLnJlZ19vZmZzZXQgPSBPTUFQX01VWF9URVJNSU5BVE9SIH0sCit9OworI2Vsc2UKKyNkZWZpbmUgb21hcDM2eHhfY2JwX3N1YnNldAlOVUxMCisjZW5kaWYKKworLyoKKyAqIEJhbGxzIGZvciAzNlhYIENCUCBwYWNrYWdlCisgKiA1MTUtcGluIHMtUEJHQSBQYWNrYWdlLCAwLjUwbW0gQmFsbCBQaXRjaCAoVG9wKSwgMC40MG1tIEJhbGwgUGl0Y2ggKEJvdHRvbSkKKyAqLworI2lmIGRlZmluZWQoQ09ORklHX09NQVBfTVVYKSAmJiBkZWZpbmVkKENPTkZJR19ERUJVR19GUykJCVwKKwkJJiYgZGVmaW5lZCAoQ09ORklHX09NQVBfUEFDS0FHRV9DQlApCitzdHJ1Y3Qgb21hcF9iYWxsIF9faW5pdGRhdGEgb21hcDM2eHhfY2JwX2JhbGxbXSA9IHsKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9EMCwgImFnMTciLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9EMSwgImFoMTciLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9EMTAsICJiMjUiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9EMTEsICJjMjYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9EMiwgImIyNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoQ0FNX0QzLCAiYzI0IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDQU1fRDQsICJkMjQiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9ENSwgImEyNSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoQ0FNX0Q2LCAiazI4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDQU1fRDcsICJsMjgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9EOCwgImsyNyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoQ0FNX0Q5LCAibDI3IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDQU1fRkxELCAiYzIzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDQU1fSFMsICJhMjQiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9QQ0xLLCAiYzI3IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDQU1fU1RST0JFLCAiZDI1IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDQU1fVlMsICJhMjMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9XRU4sICJiMjMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENBTV9YQ0xLQSwgImMyNSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoQ0FNX1hDTEtCLCAiYjI2IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDU0kyX0RYMCwgImFnMTkiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKENTSTJfRFgxLCAiYWcxOCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoQ1NJMl9EWTAsICJhaDE5IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShDU0kyX0RZMSwgImFoMTgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19BQ0JJQVMsICJlMjciLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMCwgImFnMjIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMSwgImFoMjIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMTAsICJhZDI4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShEU1NfREFUQTExLCAiYWQyNyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEExMiwgImFiMjgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMTMsICJhYjI3IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShEU1NfREFUQTE0LCAiYWEyOCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEExNSwgImFhMjciLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMTYsICJnMjUiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMTcsICJoMjciLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMTgsICJoMjYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMTksICJoMjUiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMiwgImFnMjMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMjAsICJlMjgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMjEsICJqMjYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBMjIsICJhYzI3IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShEU1NfREFUQTIzLCAiYWMyOCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEEzLCAiYWgyMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEE0LCAiYWcyNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEE1LCAiYWgyNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEE2LCAiZTI2IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShEU1NfREFUQTcsICJmMjgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19EQVRBOCwgImYyNyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRFNTX0RBVEE5LCAiZzI2IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShEU1NfSFNZTkMsICJkMjYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKERTU19QQ0xLLCAiZDI4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShEU1NfVlNZTkMsICJkMjciLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEVUS19DTEssICJhZjEwIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShFVEtfQ1RMLCAiYWUxMCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QwLCAiYWYxMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QxLCAiYWcxMiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QxMCwgImFlNyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QxMSwgImFmNyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QxMiwgImFnNyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QxMywgImFoNyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QxNCwgImFnOCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QxNSwgImFoOCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QyLCAiYWgxMiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0QzLCAiYWUxMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0Q0LCAiYWUxMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoRVRLX0Q1LCAiYWg5IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShFVEtfRDYsICJhZjEzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShFVEtfRDcsICJhaDE0IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShFVEtfRDgsICJhZjkiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEVUS19EOSwgImFnOSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19BMSwgIm40IiwgImFjMTUiKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfQTEwLCAiazMiLCAiYWIxOSIpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19BMTEsIE5VTEwsICJhYzIwIiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0EyLCAibTQiLCAiYWIxNSIpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19BMywgImw0IiwgImFjMTYiKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfQTQsICJrNCIsICJhYjE2IiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0E1LCAidDMiLCAiYWMxNyIpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19BNiwgInIzIiwgImFiMTciKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfQTcsICJuMyIsICJhYzE4IiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0E4LCAibTMiLCAiYWIxOCIpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19BOSwgImwzIiwgImFjMTkiKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfQ0xLLCAidDQiLCAidzIiKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfRDAsICJrMSIsICJtMiIpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19EMSwgImwxIiwgIm0xIiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0QxMCwgInAxIiwgImFiNCIpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19EMTEsICJyMSIsICJhYzQiKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfRDEyLCAicjIiLCAiYWI2IiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0QxMywgInQyIiwgImFjNiIpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19EMTQsICJ3MSIsICJhYjciKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfRDE1LCAieTEiLCAiYWM3IiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0QyLCAibDIiLCAibjIiKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfRDMsICJwMiIsICJuMSIpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19ENCwgInQxIiwgInIyIiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0Q1LCAidjEiLCAicjEiKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfRDYsICJ2MiIsICJ0MiIpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19ENywgIncyIiwgInQxIiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0Q4LCAiaDIiLCAiYWIzIiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX0Q5LCAiazIiLCAiYWMzIiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX05BRFZfQUxFLCAiZjMiLCAidzEiKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfTkJFMF9DTEUsICJnMyIsICJhYzEyIiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX05CRTEsICJ1MyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19OQ1MwLCAiZzQiLCAieTIiKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfTkNTMSwgImgzIiwgInkxIiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX05DUzIsICJ2OCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19OQ1MzLCAidTgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfTkNTNCwgInQ4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX05DUzUsICJyOCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19OQ1M2LCAicDgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfTkNTNywgIm44IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX05PRSwgImcyIiwgInYyIiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX05XRSwgImY0IiwgInYxIiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX05XUCwgImgxIiwgImFiMTAiKSwKKwlfT01BUDNfQkFMTEVOVFJZKEdQTUNfV0FJVDAsICJtOCIsICJhYjEyIiksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX1dBSVQxLCAibDgiLCAiYWMxMCIpLAorCV9PTUFQM19CQUxMRU5UUlkoR1BNQ19XQUlUMiwgIms4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShHUE1DX1dBSVQzLCAiajgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEhEUV9TSU8sICJqMjUiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEhTVVNCMF9DTEssICJ0MjgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEhTVVNCMF9EQVRBMCwgInQyNyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoSFNVU0IwX0RBVEExLCAidTI4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShIU1VTQjBfREFUQTIsICJ1MjciLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEhTVVNCMF9EQVRBMywgInUyNiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoSFNVU0IwX0RBVEE0LCAidTI1IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShIU1VTQjBfREFUQTUsICJ2MjgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEhTVVNCMF9EQVRBNiwgInYyNyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoSFNVU0IwX0RBVEE3LCAidjI2IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShIU1VTQjBfRElSLCAicjI4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShIU1VTQjBfTlhULCAidDI2IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShIU1VTQjBfU1RQLCAidDI1IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShJMkMxX1NDTCwgImsyMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoSTJDMV9TREEsICJqMjEiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEkyQzJfU0NMLCAiYWYxNSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoSTJDMl9TREEsICJhZTE1IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShJMkMzX1NDTCwgImFmMTQiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEkyQzNfU0RBLCAiYWcxNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoSTJDNF9TQ0wsICJhZDI2IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShJMkM0X1NEQSwgImFlMjYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEpUQUdfRU1VMCwgImFhMTEiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEpUQUdfRU1VMSwgImFhMTAiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEpUQUdfUlRDSywgImFhMTIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEpUQUdfVENLLCAiYWExMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoSlRBR19UREksICJhYTIwIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShKVEFHX1RETywgImFhMTkiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKEpUQUdfVE1TX1RNU0MsICJhYTE4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ0JTUDFfQ0xLUiwgInkyMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNCU1AxX0NMS1gsICJ3MjEiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DQlNQMV9EUiwgInUyMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNCU1AxX0RYLCAidjIxIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ0JTUDFfRlNSLCAiYWEyMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNCU1AxX0ZTWCwgImsyNiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNCU1AyX0NMS1gsICJuMjEiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DQlNQMl9EUiwgInIyMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNCU1AyX0RYLCAibTIxIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ0JTUDJfRlNYLCAicDIxIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ0JTUDNfQ0xLWCwgImFmNSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNCU1AzX0RSLCAiYWU2IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ0JTUDNfRFgsICJhZjYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DQlNQM19GU1gsICJhZTUiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DQlNQNF9DTEtYLCAiYWUxIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ0JTUDRfRFIsICJhZDEiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DQlNQNF9EWCwgImFkMiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNCU1A0X0ZTWCwgImFjMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNCU1BfQ0xLUywgInQyMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNTUEkxX0NMSywgImFiMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNTUEkxX0NTMCwgImFjMiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNTUEkxX0NTMSwgImFjMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNTUEkxX0NTMiwgImFiMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNTUEkxX0NTMywgImFiMiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNTUEkxX1NJTU8sICJhYjQiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DU1BJMV9TT01JLCAiYWE0IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ1NQSTJfQ0xLLCAiYWEzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShNQ1NQSTJfQ1MwLCAieTQiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKE1DU1BJMl9DUzEsICJ2MyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNTUEkyX1NJTU8sICJ5MiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoTUNTUEkyX1NPTUksICJ5MyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RNTUMxX0NMSywgIm4yOCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RNTUMxX0NNRCwgIm0yNyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RNTUMxX0RBVDAsICJuMjciLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNETU1DMV9EQVQxLCAibjI2IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTRE1NQzFfREFUMiwgIm4yNSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RNTUMxX0RBVDMsICJwMjgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNETU1DMl9DTEssICJhZTIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNETU1DMl9DTUQsICJhZzUiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNETU1DMl9EQVQwLCAiYWg1IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTRE1NQzJfREFUMSwgImFoNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RNTUMyX0RBVDIsICJhZzQiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNETU1DMl9EQVQzLCAiYWY0IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTRE1NQzJfREFUNCwgImFlNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RNTUMyX0RBVDUsICJhaDMiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNETU1DMl9EQVQ2LCAiYWYzIiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTRE1NQzJfREFUNywgImFlMyIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RSQ19BMCwgTlVMTCwgIm4yMiIpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RSQ19BMSwgTlVMTCwgIm4yMyIpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RSQ19BMTAsIE5VTEwsICJ2MjIiKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNEUkNfQTExLCBOVUxMLCAidjIzIiksCisJX09NQVAzX0JBTExFTlRSWShTRFJDX0ExMiwgTlVMTCwgIncyMiIpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RSQ19BMTMsIE5VTEwsICJ3MjMiKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNEUkNfQTE0LCBOVUxMLCAieTIyIiksCisJX09NQVAzX0JBTExFTlRSWShTRFJDX0EyLCBOVUxMLCAicDIyIiksCisJX09NQVAzX0JBTExFTlRSWShTRFJDX0EzLCBOVUxMLCAicDIzIiksCisJX09NQVAzX0JBTExFTlRSWShTRFJDX0E0LCBOVUxMLCAicjIyIiksCisJX09NQVAzX0JBTExFTlRSWShTRFJDX0E1LCBOVUxMLCAicjIzIiksCisJX09NQVAzX0JBTExFTlRSWShTRFJDX0E2LCBOVUxMLCAidDIyIiksCisJX09NQVAzX0JBTExFTlRSWShTRFJDX0E3LCBOVUxMLCAidDIzIiksCisJX09NQVAzX0JBTExFTlRSWShTRFJDX0E4LCBOVUxMLCAidTIyIiksCisJX09NQVAzX0JBTExFTlRSWShTRFJDX0E5LCBOVUxMLCAidTIzIiksCisJX09NQVAzX0JBTExFTlRSWShTRFJDX0JBMCwgImg5IiwgImFiMjEiKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNEUkNfQkExLCAiaDEwIiwgImFjMjEiKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNEUkNfQ0tFMCwgImgxNiIsICJqMjIiKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNEUkNfQ0tFMSwgImgxNyIsICJqMjMiKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNEUkNfQ0xLLCAiYTEzIiwgImExMSIpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RSQ19EMCwgTlVMTCwgImoyIiksCisJX09NQVAzX0JBTExFTlRSWShTRFJDX0QxLCBOVUxMLCAiajEiKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNEUkNfRDEwLCAiYzE1IiwgImIxNCIpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RSQ19EMTEsICJiMTYiLCAiYTE0IiksCisJX09NQVAzX0JBTExFTlRSWShTRFJDX0QxMiwgImQxNyIsICJiMTYiKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNEUkNfRDEzLCAiYzE3IiwgImExNiIpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RSQ19EMTQsICJiMTciLCAiYjE5IiksCisJX09NQVAzX0JBTExFTlRSWShTRFJDX0QxNSwgImQxOCIsICJhMTkiKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNEUkNfRDE2LCBOVUxMLCAiYjMiKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNEUkNfRDE3LCBOVUxMLCAiYTMiKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNEUkNfRDE4LCBOVUxMLCAiYjUiKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNEUkNfRDE5LCBOVUxMLCAiYTUiKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNEUkNfRDIsIE5VTEwsICJnMiIpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RSQ19EMjAsIE5VTEwsICJiOCIpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RSQ19EMjEsIE5VTEwsICJhOCIpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RSQ19EMjIsIE5VTEwsICJiOSIpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RSQ19EMjMsIE5VTEwsICJhOSIpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RSQ19EMjQsIE5VTEwsICJiMjEiKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNEUkNfRDI1LCBOVUxMLCAiYTIxIiksCisJX09NQVAzX0JBTExFTlRSWShTRFJDX0QyNiwgTlVMTCwgImQyMiIpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RSQ19EMjcsIE5VTEwsICJkMjMiKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNEUkNfRDI4LCBOVUxMLCAiZTIyIiksCisJX09NQVAzX0JBTExFTlRSWShTRFJDX0QyOSwgTlVMTCwgImUyMyIpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RSQ19EMywgTlVMTCwgImcxIiksCisJX09NQVAzX0JBTExFTlRSWShTRFJDX0QzMCwgTlVMTCwgImcyMiIpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RSQ19EMzEsIE5VTEwsICJnMjMiKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNEUkNfRDQsIE5VTEwsICJmMiIpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RSQ19ENSwgTlVMTCwgImYxIiksCisJX09NQVAzX0JBTExFTlRSWShTRFJDX0Q2LCBOVUxMLCAiZDIiKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNEUkNfRDcsIE5VTEwsICJkMSIpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RSQ19EOCwgImMxNCIsICJiMTMiKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNEUkNfRDksICJiMTQiLCAiYTEzIiksCisJX09NQVAzX0JBTExFTlRSWShTRFJDX0RNMCwgTlVMTCwgImMxIiksCisJX09NQVAzX0JBTExFTlRSWShTRFJDX0RNMSwgImExNiIsICJhMTciKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNEUkNfRE0yLCBOVUxMLCAiYTYiKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNEUkNfRE0zLCBOVUxMLCAiYTIwIiksCisJX09NQVAzX0JBTExFTlRSWShTRFJDX0RRUzAsIE5VTEwsICJjMiIpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RSQ19EUVMxLCAiYTE3IiwgImIxNyIpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RSQ19EUVMyLCBOVUxMLCAiYjYiKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNEUkNfRFFTMywgTlVMTCwgImIyMCIpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RSQ19OQ0FTLCAiaDEzIiwgImwyMiIpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RSQ19OQ0xLLCAiYTE0IiwgImIxMSIpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RSQ19OQ1MwLCAiaDExIiwgIm0yMiIpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RSQ19OQ1MxLCAiaDEyIiwgIm0yMyIpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RSQ19OUkFTLCAiaDE0IiwgImwyMyIpLAorCV9PTUFQM19CQUxMRU5UUlkoU0RSQ19OV0UsICJoMTUiLCAiazIzIiksCisJX09NQVAzX0JBTExFTlRSWShTSU1fQ0xLLCAicDI2IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTSU1fSU8sICJwMjciLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNJTV9QV1JDVFJMLCAicjI3IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTSU1fUlNULCAicjI1IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTWVNfMzJLLCAiYWUyNSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU1lTX0JPT1QwLCAiYWgyNiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU1lTX0JPT1QxLCAiYWcyNiIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU1lTX0JPT1QyLCAiYWUxNCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU1lTX0JPT1QzLCAiYWYxOCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU1lTX0JPT1Q0LCAiYWYxOSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU1lTX0JPT1Q1LCAiYWUyMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU1lTX0JPT1Q2LCAiYWYyMSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoU1lTX0NMS09VVDEsICJhZzI1IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTWVNfQ0xLT1VUMiwgImFlMjIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNZU19DTEtSRVEsICJhZjI1IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShTWVNfTklSUSwgImFmMjYiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNZU19OUkVTV0FSTSwgImFmMjQiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFNZU19PRkZfTU9ERSwgImFmMjIiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFVBUlQxX0NUUywgInc4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShVQVJUMV9SVFMsICJhYTkiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFVBUlQxX1JYLCAieTgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFVBUlQxX1RYLCAiYWE4IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShVQVJUMl9DVFMsICJhYjI2IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShVQVJUMl9SVFMsICJhYjI1IiwgTlVMTCksCisJX09NQVAzX0JBTExFTlRSWShVQVJUMl9SWCwgImFkMjUiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFVBUlQyX1RYLCAiYWEyNSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoVUFSVDNfQ1RTX1JDVFgsICJoMTgiLCBOVUxMKSwKKwlfT01BUDNfQkFMTEVOVFJZKFVBUlQzX1JUU19TRCwgImgxOSIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoVUFSVDNfUlhfSVJSWCwgImgyMCIsIE5VTEwpLAorCV9PTUFQM19CQUxMRU5UUlkoVUFSVDNfVFhfSVJUWCwgImgyMSIsIE5VTEwpLAorCXsgLnJlZ19vZmZzZXQgPSBPTUFQX01VWF9URVJNSU5BVE9SIH0sCit9OworI2Vsc2UKKyNkZWZpbmUgb21hcDM2eHhfY2JwX2JhbGwJIE5VTEwKKyNlbmRpZgorCitpbnQgX19pbml0IG9tYXAzX211eF9pbml0KHN0cnVjdCBvbWFwX2JvYXJkX211eCAqYm9hcmRfc3Vic2V0LCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IG9tYXBfbXV4ICpwYWNrYWdlX3N1YnNldDsKKwlzdHJ1Y3Qgb21hcF9iYWxsICpwYWNrYWdlX2JhbGxzOworCisJc3dpdGNoIChmbGFncyAmIE9NQVBfUEFDS0FHRV9NQVNLKSB7CisJY2FzZSAoT01BUF9QQUNLQUdFX0NCQyk6CisJCXBhY2thZ2Vfc3Vic2V0ID0gb21hcDNfY2JjX3N1YnNldDsKKwkJcGFja2FnZV9iYWxscyA9IG9tYXAzX2NiY19iYWxsOworCQlicmVhazsKKwljYXNlIChPTUFQX1BBQ0tBR0VfQ0JCKToKKwkJcGFja2FnZV9zdWJzZXQgPSBvbWFwM19jYmJfc3Vic2V0OworCQlwYWNrYWdlX2JhbGxzID0gb21hcDNfY2JiX2JhbGw7CisJCWJyZWFrOworCWNhc2UgKE9NQVBfUEFDS0FHRV9DVVMpOgorCQlwYWNrYWdlX3N1YnNldCA9IG9tYXAzX2N1c19zdWJzZXQ7CisJCXBhY2thZ2VfYmFsbHMgPSBvbWFwM19jdXNfYmFsbDsKKwkJYnJlYWs7CisJY2FzZSAoT01BUF9QQUNLQUdFX0NCUCk6CisJCXBhY2thZ2Vfc3Vic2V0ID0gb21hcDM2eHhfY2JwX3N1YnNldDsKKwkJcGFja2FnZV9iYWxscyA9IG9tYXAzNnh4X2NicF9iYWxsOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIm11eDogVW5rbm93biBvbWFwIHBhY2thZ2UsIG11eCBkaXNhYmxlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBvbWFwX211eF9pbml0KE9NQVAzX0NPTlRST0xfUEFEQ09ORl9NVVhfUEJBU0UsCisJCQkgICAgIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9NVVhfU0laRSwKKwkJCQlvbWFwM19tdXhtb2RlcywgcGFja2FnZV9zdWJzZXQsIGJvYXJkX3N1YnNldCwKKwkJCQlwYWNrYWdlX2JhbGxzKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvbXV4MzR4eC5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9tdXgzNHh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU0M2ViZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvbXV4MzR4eC5oCkBAIC0wLDAgKzEsMzk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IE5va2lhCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGV4YXMgSW5zdHJ1bWVudHMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX01VWF9QQkFTRQkJCQkweDQ4MDAyMDMwTFUKKworI2RlZmluZSBPTUFQM19NVVgobW9kZTAsIG11eF92YWx1ZSkJCQkJCVwKK3sJCQkJCQkJCQlcCisJLnJlZ19vZmZzZXQJPSAoT01BUDNfQ09OVFJPTF9QQURDT05GXyMjbW9kZTAjI19PRkZTRVQpLAlcCisJLnZhbHVlCQk9IChtdXhfdmFsdWUpLAkJCQkJXAorfQorCisvKgorICogT01BUDMgQ09OVFJPTF9QQURDT05GKiByZWdpc3RlciBvZmZzZXRzIGZvciBwaW4tbXV4aW5nCisgKgorICogRXh0cmFjdGVkIGZyb20gdGhlIFRSTS4gIEFkZCAweDQ4MDAyMDMwIHRvIHRoZXNlIHZhbHVlcyB0byBnZXQgdGhlCisgKiBhYnNvbHV0ZSBhZGRyZXNzZXMuICBUaGUgbmFtZSBpbiB0aGUgbWFjcm8gaXMgdGhlIG1vZGUtMCBuYW1lIG9mCisgKiB0aGUgcGluLiAgTk9URTogVGhlc2UgcmVnaXN0ZXJzIGFyZSAxNi1iaXRzIHdpZGUuCisgKgorICogTm90ZSB0aGF0IDM0WFggVFJNIHVzZXMgTU1DIGluc3RlYWQgb2YgU0RNTUMgYW5kIFNBRDJEIGluc3RlYWQKKyAqIG9mIENIQVNTSVMgZm9yIHNvbWUgcmVnaXN0ZXJzLiBGb3IgdGhlIGRlZmluZXMsIHdlIGZvbGxvdyB0aGUKKyAqIDM2WFggbmFtaW5nLCBhbmQgdXNlIFNETU1DIGFuZCBDSEFTU0lTLgorICovCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRFJDX0QwX09GRlNFVAkJCTB4MDAwCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRFJDX0QxX09GRlNFVAkJCTB4MDAyCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRFJDX0QyX09GRlNFVAkJCTB4MDA0CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRFJDX0QzX09GRlNFVAkJCTB4MDA2CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRFJDX0Q0X09GRlNFVAkJCTB4MDA4CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRFJDX0Q1X09GRlNFVAkJCTB4MDBhCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRFJDX0Q2X09GRlNFVAkJCTB4MDBjCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRFJDX0Q3X09GRlNFVAkJCTB4MDBlCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRFJDX0Q4X09GRlNFVAkJCTB4MDEwCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRFJDX0Q5X09GRlNFVAkJCTB4MDEyCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRFJDX0QxMF9PRkZTRVQJCQkweDAxNAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RSQ19EMTFfT0ZGU0VUCQkJMHgwMTYKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NEUkNfRDEyX09GRlNFVAkJCTB4MDE4CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRFJDX0QxM19PRkZTRVQJCQkweDAxYQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RSQ19EMTRfT0ZGU0VUCQkJMHgwMWMKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NEUkNfRDE1X09GRlNFVAkJCTB4MDFlCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRFJDX0QxNl9PRkZTRVQJCQkweDAyMAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RSQ19EMTdfT0ZGU0VUCQkJMHgwMjIKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NEUkNfRDE4X09GRlNFVAkJCTB4MDI0CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRFJDX0QxOV9PRkZTRVQJCQkweDAyNgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RSQ19EMjBfT0ZGU0VUCQkJMHgwMjgKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NEUkNfRDIxX09GRlNFVAkJCTB4MDJhCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRFJDX0QyMl9PRkZTRVQJCQkweDAyYworI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RSQ19EMjNfT0ZGU0VUCQkJMHgwMmUKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NEUkNfRDI0X09GRlNFVAkJCTB4MDMwCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRFJDX0QyNV9PRkZTRVQJCQkweDAzMgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RSQ19EMjZfT0ZGU0VUCQkJMHgwMzQKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NEUkNfRDI3X09GRlNFVAkJCTB4MDM2CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRFJDX0QyOF9PRkZTRVQJCQkweDAzOAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RSQ19EMjlfT0ZGU0VUCQkJMHgwM2EKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NEUkNfRDMwX09GRlNFVAkJCTB4MDNjCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRFJDX0QzMV9PRkZTRVQJCQkweDAzZQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RSQ19DTEtfT0ZGU0VUCQkJMHgwNDAKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NEUkNfRFFTMF9PRkZTRVQJCQkweDA0MgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RSQ19EUVMxX09GRlNFVAkJCTB4MDQ0CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRFJDX0RRUzJfT0ZGU0VUCQkJMHgwNDYKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NEUkNfRFFTM19PRkZTRVQJCQkweDA0OAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfR1BNQ19BMV9PRkZTRVQJCQkweDA0YQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfR1BNQ19BMl9PRkZTRVQJCQkweDA0YworI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfR1BNQ19BM19PRkZTRVQJCQkweDA0ZQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfR1BNQ19BNF9PRkZTRVQJCQkweDA1MAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfR1BNQ19BNV9PRkZTRVQJCQkweDA1MgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfR1BNQ19BNl9PRkZTRVQJCQkweDA1NAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfR1BNQ19BN19PRkZTRVQJCQkweDA1NgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfR1BNQ19BOF9PRkZTRVQJCQkweDA1OAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfR1BNQ19BOV9PRkZTRVQJCQkweDA1YQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfR1BNQ19BMTBfT0ZGU0VUCQkJMHgwNWMKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0dQTUNfRDBfT0ZGU0VUCQkJMHgwNWUKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0dQTUNfRDFfT0ZGU0VUCQkJMHgwNjAKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0dQTUNfRDJfT0ZGU0VUCQkJMHgwNjIKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0dQTUNfRDNfT0ZGU0VUCQkJMHgwNjQKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0dQTUNfRDRfT0ZGU0VUCQkJMHgwNjYKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0dQTUNfRDVfT0ZGU0VUCQkJMHgwNjgKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0dQTUNfRDZfT0ZGU0VUCQkJMHgwNmEKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0dQTUNfRDdfT0ZGU0VUCQkJMHgwNmMKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0dQTUNfRDhfT0ZGU0VUCQkJMHgwNmUKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0dQTUNfRDlfT0ZGU0VUCQkJMHgwNzAKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0dQTUNfRDEwX09GRlNFVAkJCTB4MDcyCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9HUE1DX0QxMV9PRkZTRVQJCQkweDA3NAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfR1BNQ19EMTJfT0ZGU0VUCQkJMHgwNzYKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0dQTUNfRDEzX09GRlNFVAkJCTB4MDc4CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9HUE1DX0QxNF9PRkZTRVQJCQkweDA3YQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfR1BNQ19EMTVfT0ZGU0VUCQkJMHgwN2MKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0dQTUNfTkNTMF9PRkZTRVQJCQkweDA3ZQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfR1BNQ19OQ1MxX09GRlNFVAkJCTB4MDgwCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9HUE1DX05DUzJfT0ZGU0VUCQkJMHgwODIKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0dQTUNfTkNTM19PRkZTRVQJCQkweDA4NAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfR1BNQ19OQ1M0X09GRlNFVAkJCTB4MDg2CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9HUE1DX05DUzVfT0ZGU0VUCQkJMHgwODgKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0dQTUNfTkNTNl9PRkZTRVQJCQkweDA4YQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfR1BNQ19OQ1M3X09GRlNFVAkJCTB4MDhjCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9HUE1DX0NMS19PRkZTRVQJCQkweDA4ZQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfR1BNQ19OQURWX0FMRV9PRkZTRVQJCTB4MDkwCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9HUE1DX05PRV9PRkZTRVQJCQkweDA5MgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfR1BNQ19OV0VfT0ZGU0VUCQkJMHgwOTQKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0dQTUNfTkJFMF9DTEVfT0ZGU0VUCQkweDA5NgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfR1BNQ19OQkUxX09GRlNFVAkJCTB4MDk4CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9HUE1DX05XUF9PRkZTRVQJCQkweDA5YQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfR1BNQ19XQUlUMF9PRkZTRVQJCQkweDA5YworI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfR1BNQ19XQUlUMV9PRkZTRVQJCQkweDA5ZQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfR1BNQ19XQUlUMl9PRkZTRVQJCQkweDBhMAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfR1BNQ19XQUlUM19PRkZTRVQJCQkweDBhMgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfRFNTX1BDTEtfT0ZGU0VUCQkJMHgwYTQKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0RTU19IU1lOQ19PRkZTRVQJCQkweDBhNgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfRFNTX1ZTWU5DX09GRlNFVAkJCTB4MGE4CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9EU1NfQUNCSUFTX09GRlNFVAkJCTB4MGFhCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9EU1NfREFUQTBfT0ZGU0VUCQkJMHgwYWMKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMV9PRkZTRVQJCQkweDBhZQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfRFNTX0RBVEEyX09GRlNFVAkJCTB4MGIwCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9EU1NfREFUQTNfT0ZGU0VUCQkJMHgwYjIKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0RTU19EQVRBNF9PRkZTRVQJCQkweDBiNAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfRFNTX0RBVEE1X09GRlNFVAkJCTB4MGI2CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9EU1NfREFUQTZfT0ZGU0VUCQkJMHgwYjgKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0RTU19EQVRBN19PRkZTRVQJCQkweDBiYQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfRFNTX0RBVEE4X09GRlNFVAkJCTB4MGJjCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9EU1NfREFUQTlfT0ZGU0VUCQkJMHgwYmUKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMTBfT0ZGU0VUCQkJMHgwYzAKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMTFfT0ZGU0VUCQkJMHgwYzIKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMTJfT0ZGU0VUCQkJMHgwYzQKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMTNfT0ZGU0VUCQkJMHgwYzYKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMTRfT0ZGU0VUCQkJMHgwYzgKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMTVfT0ZGU0VUCQkJMHgwY2EKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMTZfT0ZGU0VUCQkJMHgwY2MKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMTdfT0ZGU0VUCQkJMHgwY2UKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMThfT0ZGU0VUCQkJMHgwZDAKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMTlfT0ZGU0VUCQkJMHgwZDIKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMjBfT0ZGU0VUCQkJMHgwZDQKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMjFfT0ZGU0VUCQkJMHgwZDYKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMjJfT0ZGU0VUCQkJMHgwZDgKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMjNfT0ZGU0VUCQkJMHgwZGEKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0NBTV9IU19PRkZTRVQJCQkweDBkYworI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfQ0FNX1ZTX09GRlNFVAkJCTB4MGRlCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9DQU1fWENMS0FfT0ZGU0VUCQkJMHgwZTAKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0NBTV9QQ0xLX09GRlNFVAkJCTB4MGUyCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9DQU1fRkxEX09GRlNFVAkJCTB4MGU0CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9DQU1fRDBfT0ZGU0VUCQkJMHgwZTYKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0NBTV9EMV9PRkZTRVQJCQkweDBlOAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfQ0FNX0QyX09GRlNFVAkJCTB4MGVhCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9DQU1fRDNfT0ZGU0VUCQkJMHgwZWMKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0NBTV9ENF9PRkZTRVQJCQkweDBlZQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfQ0FNX0Q1X09GRlNFVAkJCTB4MGYwCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9DQU1fRDZfT0ZGU0VUCQkJMHgwZjIKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0NBTV9EN19PRkZTRVQJCQkweDBmNAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfQ0FNX0Q4X09GRlNFVAkJCTB4MGY2CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9DQU1fRDlfT0ZGU0VUCQkJMHgwZjgKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0NBTV9EMTBfT0ZGU0VUCQkJMHgwZmEKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0NBTV9EMTFfT0ZGU0VUCQkJMHgwZmMKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0NBTV9YQ0xLQl9PRkZTRVQJCQkweDBmZQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfQ0FNX1dFTl9PRkZTRVQJCQkweDEwMAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfQ0FNX1NUUk9CRV9PRkZTRVQJCQkweDEwMgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfQ1NJMl9EWDBfT0ZGU0VUCQkJMHgxMDQKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0NTSTJfRFkwX09GRlNFVAkJCTB4MTA2CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9DU0kyX0RYMV9PRkZTRVQJCQkweDEwOAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfQ1NJMl9EWTFfT0ZGU0VUCQkJMHgxMGEKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX01DQlNQMl9GU1hfT0ZGU0VUCQkJMHgxMGMKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX01DQlNQMl9DTEtYX09GRlNFVAkJMHgxMGUKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX01DQlNQMl9EUl9PRkZTRVQJCQkweDExMAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfTUNCU1AyX0RYX09GRlNFVAkJCTB4MTEyCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRE1NQzFfQ0xLX09GRlNFVAkJCTB4MTE0CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRE1NQzFfQ01EX09GRlNFVAkJCTB4MTE2CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRE1NQzFfREFUMF9PRkZTRVQJCTB4MTE4CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRE1NQzFfREFUMV9PRkZTRVQJCTB4MTFhCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRE1NQzFfREFUMl9PRkZTRVQJCTB4MTFjCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRE1NQzFfREFUM19PRkZTRVQJCTB4MTFlCisKKy8qIFNETU1DMV9EQVQ0IC0gREFUNyBhcmUgU0lNX0lPIFNJTV9DTEsgU0lNX1BXUkNUUkwgYW5kIFNJTV9SU1Qgb24gMzZ4eCAqLworI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RNTUMxX0RBVDRfT0ZGU0VUCQkweDEyMAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RNTUMxX0RBVDVfT0ZGU0VUCQkweDEyMgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RNTUMxX0RBVDZfT0ZGU0VUCQkweDEyNAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RNTUMxX0RBVDdfT0ZGU0VUCQkweDEyNgorCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRE1NQzJfQ0xLX09GRlNFVAkJCTB4MTI4CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRE1NQzJfQ01EX09GRlNFVAkJCTB4MTJhCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRE1NQzJfREFUMF9PRkZTRVQJCTB4MTJjCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRE1NQzJfREFUMV9PRkZTRVQJCTB4MTJlCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRE1NQzJfREFUMl9PRkZTRVQJCTB4MTMwCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRE1NQzJfREFUM19PRkZTRVQJCTB4MTMyCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRE1NQzJfREFUNF9PRkZTRVQJCTB4MTM0CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRE1NQzJfREFUNV9PRkZTRVQJCTB4MTM2CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRE1NQzJfREFUNl9PRkZTRVQJCTB4MTM4CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRE1NQzJfREFUN19PRkZTRVQJCTB4MTNhCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9NQ0JTUDNfRFhfT0ZGU0VUCQkJMHgxM2MKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX01DQlNQM19EUl9PRkZTRVQJCQkweDEzZQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfTUNCU1AzX0NMS1hfT0ZGU0VUCQkweDE0MAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfTUNCU1AzX0ZTWF9PRkZTRVQJCQkweDE0MgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfVUFSVDJfQ1RTX09GRlNFVAkJCTB4MTQ0CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9VQVJUMl9SVFNfT0ZGU0VUCQkJMHgxNDYKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1VBUlQyX1RYX09GRlNFVAkJCTB4MTQ4CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9VQVJUMl9SWF9PRkZTRVQJCQkweDE0YQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfVUFSVDFfVFhfT0ZGU0VUCQkJMHgxNGMKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1VBUlQxX1JUU19PRkZTRVQJCQkweDE0ZQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfVUFSVDFfQ1RTX09GRlNFVAkJCTB4MTUwCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9VQVJUMV9SWF9PRkZTRVQJCQkweDE1MgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfTUNCU1A0X0NMS1hfT0ZGU0VUCQkweDE1NAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfTUNCU1A0X0RSX09GRlNFVAkJCTB4MTU2CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9NQ0JTUDRfRFhfT0ZGU0VUCQkJMHgxNTgKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX01DQlNQNF9GU1hfT0ZGU0VUCQkJMHgxNWEKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX01DQlNQMV9DTEtSX09GRlNFVAkJMHgxNWMKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX01DQlNQMV9GU1JfT0ZGU0VUCQkJMHgxNWUKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX01DQlNQMV9EWF9PRkZTRVQJCQkweDE2MAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfTUNCU1AxX0RSX09GRlNFVAkJCTB4MTYyCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9NQ0JTUF9DTEtTX09GRlNFVAkJCTB4MTY0CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9NQ0JTUDFfRlNYX09GRlNFVAkJCTB4MTY2CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9NQ0JTUDFfQ0xLWF9PRkZTRVQJCTB4MTY4CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9VQVJUM19DVFNfUkNUWF9PRkZTRVQJCTB4MTZhCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9VQVJUM19SVFNfU0RfT0ZGU0VUCQkweDE2YworI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfVUFSVDNfUlhfSVJSWF9PRkZTRVQJCTB4MTZlCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9VQVJUM19UWF9JUlRYX09GRlNFVAkJMHgxNzAKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0hTVVNCMF9DTEtfT0ZGU0VUCQkJMHgxNzIKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0hTVVNCMF9TVFBfT0ZGU0VUCQkJMHgxNzQKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0hTVVNCMF9ESVJfT0ZGU0VUCQkJMHgxNzYKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0hTVVNCMF9OWFRfT0ZGU0VUCQkJMHgxNzgKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0hTVVNCMF9EQVRBMF9PRkZTRVQJCTB4MTdhCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9IU1VTQjBfREFUQTFfT0ZGU0VUCQkweDE3YworI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfSFNVU0IwX0RBVEEyX09GRlNFVAkJMHgxN2UKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0hTVVNCMF9EQVRBM19PRkZTRVQJCTB4MTgwCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9IU1VTQjBfREFUQTRfT0ZGU0VUCQkweDE4MgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfSFNVU0IwX0RBVEE1X09GRlNFVAkJMHgxODQKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0hTVVNCMF9EQVRBNl9PRkZTRVQJCTB4MTg2CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9IU1VTQjBfREFUQTdfT0ZGU0VUCQkweDE4OAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfSTJDMV9TQ0xfT0ZGU0VUCQkJMHgxOGEKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0kyQzFfU0RBX09GRlNFVAkJCTB4MThjCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9JMkMyX1NDTF9PRkZTRVQJCQkweDE4ZQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfSTJDMl9TREFfT0ZGU0VUCQkJMHgxOTAKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0kyQzNfU0NMX09GRlNFVAkJCTB4MTkyCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9JMkMzX1NEQV9PRkZTRVQJCQkweDE5NAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfSERRX1NJT19PRkZTRVQJCQkweDE5NgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfTUNTUEkxX0NMS19PRkZTRVQJCQkweDE5OAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfTUNTUEkxX1NJTU9fT0ZGU0VUCQkweDE5YQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfTUNTUEkxX1NPTUlfT0ZGU0VUCQkweDE5YworI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfTUNTUEkxX0NTMF9PRkZTRVQJCQkweDE5ZQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfTUNTUEkxX0NTMV9PRkZTRVQJCQkweDFhMAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfTUNTUEkxX0NTMl9PRkZTRVQJCQkweDFhMgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfTUNTUEkxX0NTM19PRkZTRVQJCQkweDFhNAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfTUNTUEkyX0NMS19PRkZTRVQJCQkweDFhNgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfTUNTUEkyX1NJTU9fT0ZGU0VUCQkweDFhOAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfTUNTUEkyX1NPTUlfT0ZGU0VUCQkweDFhYQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfTUNTUEkyX0NTMF9PRkZTRVQJCQkweDFhYworI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfTUNTUEkyX0NTMV9PRkZTRVQJCQkweDFhZQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU1lTX05JUlFfT0ZGU0VUCQkJMHgxYjAKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NZU19DTEtPVVQyX09GRlNFVAkJMHgxYjIKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NBRDJEX01DQUQwX09GRlNFVAkJMHgxYjQKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NBRDJEX01DQUQxX09GRlNFVAkJMHgxYjYKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NBRDJEX01DQUQyX09GRlNFVAkJMHgxYjgKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NBRDJEX01DQUQzX09GRlNFVAkJMHgxYmEKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NBRDJEX01DQUQ0X09GRlNFVAkJMHgxYmMKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NBRDJEX01DQUQ1X09GRlNFVAkJMHgxYmUKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NBRDJEX01DQUQ2X09GRlNFVAkJMHgxYzAKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NBRDJEX01DQUQ3X09GRlNFVAkJMHgxYzIKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NBRDJEX01DQUQ4X09GRlNFVAkJMHgxYzQKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NBRDJEX01DQUQ5X09GRlNFVAkJMHgxYzYKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NBRDJEX01DQUQxMF9PRkZTRVQJCTB4MWM4CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TQUQyRF9NQ0FEMTFfT0ZGU0VUCQkweDFjYQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0FEMkRfTUNBRDEyX09GRlNFVAkJMHgxY2MKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NBRDJEX01DQUQxM19PRkZTRVQJCTB4MWNlCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TQUQyRF9NQ0FEMTRfT0ZGU0VUCQkweDFkMAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0FEMkRfTUNBRDE1X09GRlNFVAkJMHgxZDIKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NBRDJEX01DQUQxNl9PRkZTRVQJCTB4MWQ0CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TQUQyRF9NQ0FEMTdfT0ZGU0VUCQkweDFkNgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0FEMkRfTUNBRDE4X09GRlNFVAkJMHgxZDgKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NBRDJEX01DQUQxOV9PRkZTRVQJCTB4MWRhCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TQUQyRF9NQ0FEMjBfT0ZGU0VUCQkweDFkYworI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0FEMkRfTUNBRDIxX09GRlNFVAkJMHgxZGUKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NBRDJEX01DQUQyMl9PRkZTRVQJCTB4MWUwCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TQUQyRF9NQ0FEMjNfT0ZGU0VUCQkweDFlMgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0FEMkRfTUNBRDI0X09GRlNFVAkJMHgxZTQKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NBRDJEX01DQUQyNV9PRkZTRVQJCTB4MWU2CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TQUQyRF9NQ0FEMjZfT0ZGU0VUCQkweDFlOAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0FEMkRfTUNBRDI3X09GRlNFVAkJMHgxZWEKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NBRDJEX01DQUQyOF9PRkZTRVQJCTB4MWVjCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TQUQyRF9NQ0FEMjlfT0ZGU0VUCQkweDFlZQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0FEMkRfTUNBRDMwX09GRlNFVAkJMHgxZjAKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NBRDJEX01DQUQzMV9PRkZTRVQJCTB4MWYyCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TQUQyRF9NQ0FEMzJfT0ZGU0VUCQkweDFmNAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0FEMkRfTUNBRDMzX09GRlNFVAkJMHgxZjYKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NBRDJEX01DQUQzNF9PRkZTRVQJCTB4MWY4CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TQUQyRF9NQ0FEMzVfT0ZGU0VUCQkweDFmYQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0FEMkRfTUNBRDM2X09GRlNFVAkJMHgxZmMKKworLyogTm90ZSB0aGF0IDM0eHggVFJNIGhhcyBTQUQyRCBpbnN0ZWFkIG9mIENIQVNTSVMgZm9yIHRoZXNlICovCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9DSEFTU0lTX0NMSzI2TUlfT0ZGU0VUCQkweDFmZQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfQ0hBU1NJU19OUkVTUFdST05fT0ZGU0VUCQkweDIwMAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfQ0hBU1NJU19OUkVTV0FSV19PRkZTRVQJCTB4MjAyCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9DSEFTU0lTX05JUlFfT0ZGU0VUCQkweDIwNAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfQ0hBU1NJU19GSVFfT0ZGU0VUCQkweDIwNgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfQ0hBU1NJU19BUk1JUlFfT0ZGU0VUCQkweDIwOAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfQ0hBU1NJU19JVkFJUlFfT0ZGU0VUCQkweDIwYQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfQ0hBU1NJU19ETUFSRVEwX09GRlNFVAkJMHgyMGMKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0NIQVNTSVNfRE1BUkVRMV9PRkZTRVQJCTB4MjBlCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9DSEFTU0lTX0RNQVJFUTJfT0ZGU0VUCQkweDIxMAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfQ0hBU1NJU19ETUFSRVEzX09GRlNFVAkJMHgyMTIKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0NIQVNTSVNfTlRSU1RfT0ZGU0VUCQkweDIxNAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfQ0hBU1NJU19URElfT0ZGU0VUCQkweDIxNgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfQ0hBU1NJU19URE9fT0ZGU0VUCQkweDIxOAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfQ0hBU1NJU19UTVNfT0ZGU0VUCQkweDIxYQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfQ0hBU1NJU19UQ0tfT0ZGU0VUCQkweDIxYworI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfQ0hBU1NJU19SVENLX09GRlNFVAkJMHgyMWUKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0NIQVNTSVNfTVNUREJZX09GRlNFVAkJMHgyMjAKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0NIQVNTSVNfSURMRVJFUV9PRkZTRVQJCTB4MjIyCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9DSEFTU0lTX0lETEVBQ0tfT0ZGU0VUCQkweDIyNAorCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TQUQyRF9NV1JJVEVfT0ZGU0VUCQkweDIyNgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0FEMkRfU1dSSVRFX09GRlNFVAkJMHgyMjgKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NBRDJEX01SRUFEX09GRlNFVAkJMHgyMmEKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NBRDJEX1NSRUFEX09GRlNFVAkJMHgyMmMKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NBRDJEX01CVVNGTEFHX09GRlNFVAkJMHgyMmUKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NBRDJEX1NCVVNGTEFHX09GRlNFVAkJMHgyMzAKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NEUkNfQ0tFMF9PRkZTRVQJCQkweDIzMgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RSQ19DS0UxX09GRlNFVAkJCTB4MjM0CisKKy8qIDM2eHggb25seSAqLworI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfR1BNQ19BMTFfT0ZGU0VUCQkJMHgyMzYKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NEUkNfQkEwX09GRlNFVAkJCTB4NTcwCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRFJDX0JBMV9PRkZTRVQJCQkweDU3MgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RSQ19BMF9PRkZTRVQJCQkweDU3NAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RSQ19BMV9PRkZTRVQJCQkweDU3NgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RSQ19BMl9PRkZTRVQJCQkweDU3OAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RSQ19BM19PRkZTRVQJCQkweDU3YQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RSQ19BNF9PRkZTRVQJCQkweDU3YworI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RSQ19BNV9PRkZTRVQJCQkweDU3ZQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RSQ19BNl9PRkZTRVQJCQkweDU4MAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RSQ19BN19PRkZTRVQJCQkweDU4MgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RSQ19BOF9PRkZTRVQJCQkweDU4NAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RSQ19BOV9PRkZTRVQJCQkweDU4NgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RSQ19BMTBfT0ZGU0VUCQkJMHg1ODgKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NEUkNfQTExX09GRlNFVAkJCTB4NThhCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRFJDX0ExMl9PRkZTRVQJCQkweDU4YworI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RSQ19BMTNfT0ZGU0VUCQkJMHg1OGUKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NEUkNfQTE0X09GRlNFVAkJCTB4NTkwCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRFJDX05DUzBfT0ZGU0VUCQkJMHg1OTIKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NEUkNfTkNTMV9PRkZTRVQJCQkweDU5NAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RSQ19OQ0xLX09GRlNFVAkJCTB4NTk2CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRFJDX05SQVNfT0ZGU0VUCQkJMHg1OTgKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NEUkNfTkNBU19PRkZTRVQJCQkweDU5YQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RSQ19OV0VfT0ZGU0VUCQkJMHg1OWMKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NEUkNfRE0wX09GRlNFVAkJCTB4NTllCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TRFJDX0RNMV9PRkZTRVQJCQkweDVhMAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU0RSQ19ETTJfT0ZGU0VUCQkJMHg1YTIKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NEUkNfRE0zX09GRlNFVAkJCTB4NWE0CisKKy8qIDM2eHggb25seSwgdGhlc2UgYXJlIFNETU1DMV9EQVQ0IC0gREFUNyBvbiAzNHh4ICovCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TSU1fSU9fT0ZGU0VUCQkJMHgxMjAKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NJTV9DTEtfT0ZGU0VUCQkJMHgxMjIKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NJTV9QV1JDVFJMX09GRlNFVAkJMHgxMjQKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NJTV9SU1RfT0ZGU0VUCQkJMHgxMjYKKworI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfRVRLX0NMS19PRkZTRVQJCQkweDVhOAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfRVRLX0NUTF9PRkZTRVQJCQkweDVhYQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfRVRLX0QwX09GRlNFVAkJCTB4NWFjCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9FVEtfRDFfT0ZGU0VUCQkJMHg1YWUKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0VUS19EMl9PRkZTRVQJCQkweDViMAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfRVRLX0QzX09GRlNFVAkJCTB4NWIyCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9FVEtfRDRfT0ZGU0VUCQkJMHg1YjQKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0VUS19ENV9PRkZTRVQJCQkweDViNgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfRVRLX0Q2X09GRlNFVAkJCTB4NWI4CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9FVEtfRDdfT0ZGU0VUCQkJMHg1YmEKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX0VUS19EOF9PRkZTRVQJCQkweDViYworI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfRVRLX0Q5X09GRlNFVAkJCTB4NWJlCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9FVEtfRDEwX09GRlNFVAkJCTB4NWMwCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9FVEtfRDExX09GRlNFVAkJCTB4NWMyCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9FVEtfRDEyX09GRlNFVAkJCTB4NWM0CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9FVEtfRDEzX09GRlNFVAkJCTB4NWM2CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9FVEtfRDE0X09GRlNFVAkJCTB4NWM4CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9FVEtfRDE1X09GRlNFVAkJCTB4NWNhCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9JMkM0X1NDTF9PRkZTRVQJCQkweDlkMAorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfSTJDNF9TREFfT0ZGU0VUCQkJMHg5ZDIKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NZU18zMktfT0ZGU0VUCQkJMHg5ZDQKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NZU19DTEtSRVFfT0ZGU0VUCQkJMHg5ZDYKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NZU19OUkVTV0FSTV9PRkZTRVQJCTB4OWQ4CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TWVNfQk9PVDBfT0ZGU0VUCQkJMHg5ZGEKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NZU19CT09UMV9PRkZTRVQJCQkweDlkYworI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU1lTX0JPT1QyX09GRlNFVAkJCTB4OWRlCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TWVNfQk9PVDNfT0ZGU0VUCQkJMHg5ZTAKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NZU19CT09UNF9PRkZTRVQJCQkweDllMgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfU1lTX0JPT1Q1X09GRlNFVAkJCTB4OWU0CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TWVNfQk9PVDZfT0ZGU0VUCQkJMHg5ZTYKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NZU19PRkZfTU9ERV9PRkZTRVQJCTB4OWU4CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9TWVNfQ0xLT1VUMV9PRkZTRVQJCTB4OWVhCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9KVEFHX05UUlNUX09GRlNFVAkJCTB4OWVjCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9KVEFHX1RDS19PRkZTRVQJCQkweDllZQorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfSlRBR19UTVNfVE1TQ19PRkZTRVQJCTB4OWYwCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9KVEFHX1RESV9PRkZTRVQJCQkweDlmMgorI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfSlRBR19FTVUwX09GRlNFVAkJCTB4OWY0CisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9KVEFHX0VNVTFfT0ZGU0VUCQkJMHg5ZjYKKyNkZWZpbmUgT01BUDNfQ09OVFJPTF9QQURDT05GX1NBRDJEX1NXQUtFVVBfT0ZGU0VUCQkweGExYworI2RlZmluZSBPTUFQM19DT05UUk9MX1BBRENPTkZfSlRBR19SVENLX09GRlNFVAkJCTB4YTFlCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9KVEFHX1RET19PRkZTRVQJCQkweGEyMAorCisjZGVmaW5lIE9NQVAzX0NPTlRST0xfUEFEQ09ORl9NVVhfU0laRQkJCQlcCisJCShPTUFQM19DT05UUk9MX1BBRENPTkZfSlRBR19URE9fT0ZGU0VUICsgMHgyKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwLWhlYWRzbXAuUyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcC1oZWFkc21wLlMKaW5kZXggNGFmYWRiYS4uYWEzZjY1YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwLWhlYWRzbXAuUworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXAtaGVhZHNtcC5TCkBAIC0yNywyMCArMjcsMzkgQEAKICAqIE9NQVA0IHNwZWNpZmljIGVudHJ5IHBvaW50IGZvciBzZWNvbmRhcnkgQ1BVIHRvIGp1bXAgZnJvbSBST00KICAqIGNvZGUuICBUaGlzIHJvdXRpbmUgYWxzbyBwcm92aWRlcyBhIGhvbGRpbmcgZmxhZyBpbnRvIHdoaWNoCiAgKiBzZWNvbmRhcnkgY29yZSBpcyBoZWxkIHVudGlsIHdlJ3JlIHJlYWR5IGZvciBpdCB0byBpbml0aWFsaXNlLgotICogVGhlIHByaW1hcnkgY29yZSB3aWxsIHVwZGF0ZSB0aGUgdGhpcyBmbGFnIHVzaW5nIGEgaGFyZHdhcmUKLSAqIHJlZ2lzdGVyIEF1eENvcmVCb290MS4KKyAqIFRoZSBwcmltYXJ5IGNvcmUgd2lsbCB1cGRhdGUgdGhpcyBmbGFnIHVzaW5nIGEgaGFyZHdhcmUKKyAqIHJlZ2lzdGVyIEF1eENvcmVCb290MC4KICAqLwogRU5UUlkob21hcF9zZWNvbmRhcnlfc3RhcnR1cCkKLQltcmMJcDE1LCAwLCByMCwgYzAsIGMwLCA1Ci0JYW5kCXIwLCByMCwgIzB4MGYKLWhvbGQ6CWxkcglyMSwgPU9NQVA0X0FVWF9DT1JFX0JPT1QxX1BBCUAgcmVhZCBmcm9tIEF1eENvcmVCb290MQotCWxkcglyMiwgW3IxXQotCWNtcAlyMiwgcjAKK2hvbGQ6CWxkcglyMTIsPTB4MTAzCisJZHNiCisJc21jCQkJCUAgcmVhZCBmcm9tIEF1eENvcmVCb290MAorCW1vdglyMCwgcjAsIGxzciAjOQorCW1yYwlwMTUsIDAsIHI0LCBjMCwgYzAsIDUKKwlhbmQJcjQsIHI0LCAjMHgwZgorCWNtcAlyMCwgcjQKIAlibmUJaG9sZAogCiAJLyoKLQkgKiB3ZSd2ZSBiZWVuIHJlbGVhc2VkIGZyb20gdGhlIGNwdV9yZWxlYXNlLHNlY29uZGFyeV9zdGFjaworCSAqIHdlJ3ZlIGJlZW4gcmVsZWFzZWQgZnJvbSB0aGUgd2FpdCBsb29wLHNlY29uZGFyeV9zdGFjawogCSAqIHNob3VsZCBub3cgY29udGFpbiB0aGUgU1ZDIHN0YWNrIGZvciB0aGlzIGNvcmUKIAkgKi8KIAliCXNlY29uZGFyeV9zdGFydHVwCitFTkQob21hcF9zZWNvbmRhcnlfc3RhcnR1cCkKIAorCitFTlRSWShvbWFwX21vZGlmeV9hdXhjb3JlYm9vdDApCisJc3RtZmQgICBzcCEsIHtyMS1yMTIsIGxyfQorCWxkcglyMTIsID0weDEwNAorCWRzYgorCXNtYworCWxkbWZkICAgc3AhLCB7cjEtcjEyLCBwY30KK0VORChvbWFwX21vZGlmeV9hdXhjb3JlYm9vdDApCisKK0VOVFJZKG9tYXBfYXV4Y29yZWJvb3RfYWRkcikKKwlzdG1mZCAgIHNwISwge3IyLXIxMiwgbHJ9CisJbGRyCXIxMiwgPTB4MTA1CisJZHNiCisJc21jCisJbGRtZmQgICBzcCEsIHtyMi1yMTIsIHBjfQorRU5EKG9tYXBfYXV4Y29yZWJvb3RfYWRkcikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcC1zbXAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcC1zbXAuYwppbmRleCA0ODkwYmNmLi4zODE1M2U1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXAtc21wLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwLXNtcC5jCkBAIC0xNywxOSArMTcsMTUgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIAorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2xvY2FsdGltZXIuaD4KICNpbmNsdWRlIDxhc20vc21wX3NjdS5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxwbGF0L2NvbW1vbi5oPgogCi0vKiBSZWdpc3RlcnMgdXNlZCBmb3IgY29tbXVuaWNhdGluZyBzdGFydHVwIGluZm9ybWF0aW9uICovCi1zdGF0aWMgdm9pZCBfX2lvbWVtICpvbWFwNF9hdXhjb3JlYm9vdF9yZWcwOwotc3RhdGljIHZvaWQgX19pb21lbSAqb21hcDRfYXV4Y29yZWJvb3RfcmVnMTsKLQogLyogU0NVIGJhc2UgYWRkcmVzcyAqLwogc3RhdGljIHZvaWQgX19pb21lbSAqc2N1X2Jhc2U7CiAKQEAgLTY1LDggKzYxLDYgQEAKIAogaW50IF9fY3B1aW5pdCBib290X3NlY29uZGFyeSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGUpCiB7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OwotCiAJLyoKIAkgKiBTZXQgc3luY2hyb25pc2F0aW9uIHN0YXRlIGJldHdlZW4gdGhpcyBib290IHByb2Nlc3NvcgogCSAqIGFuZCB0aGUgc2Vjb25kYXJ5IG9uZQpAQCAtNzQsMTggKzY4LDE1IEBACiAJc3Bpbl9sb2NrKCZib290X2xvY2spOwogCiAJLyoKLQkgKiBVcGRhdGUgdGhlIEF1eENvcmVCb290MSB3aXRoIGJvb3Qgc3RhdGUgZm9yIHNlY29uZGFyeSBjb3JlLgorCSAqIFVwZGF0ZSB0aGUgQXV4Q29yZUJvb3QwIHdpdGggYm9vdCBzdGF0ZSBmb3Igc2Vjb25kYXJ5IGNvcmUuCiAJICogb21hcF9zZWNvbmRhcnlfc3RhcnR1cCgpIHJvdXRpbmUgd2lsbCBob2xkIHRoZSBzZWNvbmRhcnkgY29yZSB0aWxsCiAJICogdGhlIEF1eENvcmVCb290MSByZWdpc3RlciBpcyB1cGRhdGVkIHdpdGggY3B1IHN0YXRlCiAJICogQSBiYXJyaWVyIGlzIGFkZGVkIHRvIGVuc3VyZSB0aGF0IHdyaXRlIGJ1ZmZlciBpcyBkcmFpbmVkCiAJICovCi0JX19yYXdfd3JpdGVsKGNwdSwgb21hcDRfYXV4Y29yZWJvb3RfcmVnMSk7CisJb21hcF9tb2RpZnlfYXV4Y29yZWJvb3QwKDB4MjAwLCAweDApOworCWZsdXNoX2NhY2hlX2FsbCgpOwogCXNtcF93bWIoKTsKIAotCXRpbWVvdXQgPSBqaWZmaWVzICsgKDEgKiBIWik7Ci0Jd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKQotCQk7Ci0KIAkvKgogCSAqIE5vdyB0aGUgc2Vjb25kYXJ5IGNvcmUgaXMgc3RhcnRpbmcgdXAgbGV0IGl0IHJ1biBpdHMKIAkgKiBjYWxpYnJhdGlvbnMsIHRoZW4gd2FpdCBmb3IgaXQgdG8gZmluaXNoCkBAIC05OSwxNyArOTAsMTggQEAKIHsKIAkvKgogCSAqIFdyaXRlIHRoZSBhZGRyZXNzIG9mIHNlY29uZGFyeSBzdGFydHVwIHJvdXRpbmUgaW50byB0aGUKLQkgKiBBdXhDb3JlQm9vdDAgd2hlcmUgUk9NIGNvZGUgd2lsbCBqdW1wIGFuZCBzdGFydCBleGVjdXRpbmcKKwkgKiBBdXhDb3JlQm9vdDEgd2hlcmUgUk9NIGNvZGUgd2lsbCBqdW1wIGFuZCBzdGFydCBleGVjdXRpbmcKIAkgKiBvbiBzZWNvbmRhcnkgY29yZSBvbmNlIG91dCBvZiBXRkUKIAkgKiBBIGJhcnJpZXIgaXMgYWRkZWQgdG8gZW5zdXJlIHRoYXQgd3JpdGUgYnVmZmVyIGlzIGRyYWluZWQKIAkgKi8KLQlfX3Jhd193cml0ZWwodmlydF90b19waHlzKG9tYXBfc2Vjb25kYXJ5X3N0YXJ0dXApLAkgICBcCi0JCQkJCW9tYXA0X2F1eGNvcmVib290X3JlZzApOworCW9tYXBfYXV4Y29yZWJvb3RfYWRkcih2aXJ0X3RvX3BoeXMob21hcF9zZWNvbmRhcnlfc3RhcnR1cCkpOwogCXNtcF93bWIoKTsKIAogCS8qCiAJICogU2VuZCBhICdzZXYnIHRvIHdha2UgdGhlIHNlY29uZGFyeSBjb3JlIGZyb20gV0ZFLgorCSAqIERyYWluIHRoZSBvdXRzdGFuZGluZyB3cml0ZXMgdG8gbWVtb3J5CiAJICovCisJZHNiKCk7CiAJc2V0X2V2ZW50KCk7CiAJbWIoKTsKIH0KQEAgLTEzNiw3ICsxMjgsNiBAQAogewogCXVuc2lnbmVkIGludCBuY29yZXMgPSBnZXRfY29yZV9jb3VudCgpOwogCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0Jdm9pZCBfX2lvbWVtICpvbWFwNF93a3VwZ2VuX2Jhc2U7CiAJaW50IGk7CiAKIAkvKiBzYW5pdHkgY2hlY2sgKi8KQEAgLTE2OCwxMiArMTU5LDYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbWF4X2NwdXM7IGkrKykKIAkJc2V0X2NwdV9wcmVzZW50KGksIHRydWUpOwogCi0JLyogTmV2ZXIgcmVsZWFzZWQgKi8KLQlvbWFwNF93a3VwZ2VuX2Jhc2UgPSBpb3JlbWFwKE9NQVA0NFhYX1dLVVBHRU5fQkFTRSwgU1pfNEspOwotCUJVR19PTighb21hcDRfd2t1cGdlbl9iYXNlKTsKLQlvbWFwNF9hdXhjb3JlYm9vdF9yZWcwID0gb21hcDRfd2t1cGdlbl9iYXNlICsgMHg4MDA7Ci0Jb21hcDRfYXV4Y29yZWJvb3RfcmVnMSA9IG9tYXA0X3drdXBnZW5fYmFzZSArIDB4ODA0OwotCiAJaWYgKG1heF9jcHVzID4gMSkgewogCQkvKgogCQkgKiBFbmFibGUgdGhlIGxvY2FsIHRpbWVyIG9yIGJyb2FkY2FzdCBkZXZpY2UgZm9yIHRoZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2QuYwppbmRleCA2MzNiMjE2Li5kOGM4NTQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2QuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2QuYwpAQCAtNDUsNiArNDUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogCisjaW5jbHVkZSA8cGxhdC9jb21tb24uaD4KICNpbmNsdWRlIDxwbGF0L2NwdS5oPgogI2luY2x1ZGUgPHBsYXQvY2xvY2tkb21haW4uaD4KICNpbmNsdWRlIDxwbGF0L3Bvd2VyZG9tYWluLmg+CkBAIC0yMTAsNiArMjExLDMyIEBACiB9CiAKIC8qKgorICogX3NldF9tb2R1bGVfYXV0b2lkbGU6IHNldCB0aGUgT0NQX1NZU0NPTkZJRyBBVVRPSURMRSBmaWVsZCBpbiBAdgorICogQG9oOiBzdHJ1Y3Qgb21hcF9od21vZCAqCisgKiBAYXV0b2lkbGU6IGRlc2lyZWQgQVVUT0lETEUgYml0ZmllbGQgdmFsdWUgKDAgb3IgMSkKKyAqIEB2OiBwb2ludGVyIHRvIHJlZ2lzdGVyIGNvbnRlbnRzIHRvIG1vZGlmeQorICoKKyAqIFVwZGF0ZSB0aGUgbW9kdWxlIGF1dG9pZGxlIGJpdCBpbiBAdiB0byBiZSBAYXV0b2lkbGUgZm9yIHRoZSBAb2gKKyAqIGh3bW9kLiAgVGhlIGF1dG9pZGxlIGJpdCBjb250cm9scyB3aGV0aGVyIHRoZSBtb2R1bGUgY2FuIGdhdGUKKyAqIGludGVybmFsIGNsb2NrcyBhdXRvbWF0aWNhbGx5IHdoZW4gaXQgaXNuJ3QgZG9pbmcgYW55dGhpbmc7IHRoZQorICogZXhhY3QgZnVuY3Rpb24gb2YgdGhpcyBiaXQgdmFyaWVzIG9uIGEgcGVyLW1vZHVsZSBiYXNpcy4gIFRoaXMKKyAqIGZ1bmN0aW9uIGRvZXMgbm90IHdyaXRlIHRvIHRoZSBoYXJkd2FyZS4gIFJldHVybnMgLUVJTlZBTCB1cG9uCisgKiBlcnJvciBvciAwIHVwb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCBfc2V0X21vZHVsZV9hdXRvaWRsZShzdHJ1Y3Qgb21hcF9od21vZCAqb2gsIHU4IGF1dG9pZGxlLAorCQkJCXUzMiAqdikKK3sKKwlpZiAoIW9oLT5zeXNjb25maWcgfHwKKwkgICAgIShvaC0+c3lzY29uZmlnLT5zeXNjX2ZsYWdzICYgU1lTQ19IQVNfQVVUT0lETEUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSp2ICY9IH5TWVNDX0FVVE9JRExFX01BU0s7CisJKnYgfD0gYXV0b2lkbGUgPDwgU1lTQ19BVVRPSURMRV9TSElGVDsKKworCXJldHVybiAwOworfQorCisvKioKICAqIF9lbmFibGVfd2FrZXVwOiBzZXQgT0NQX1NZU0NPTkZJRy5FTkFXQUtFVVAgYml0IGluIHRoZSBoYXJkd2FyZQogICogQG9oOiBzdHJ1Y3Qgb21hcF9od21vZCAqCiAgKgpAQCAtMzI2LDYgKzM1Myw5IEBACiAJCXJldCA9IC1FSU5WQUw7CiAJb2gtPl9jbGsgPSBjOwogCisJV0FSTighYy0+Y2xrZG0sICJvbWFwX2h3bW9kOiAlczogbWlzc2luZyBjbG9ja2RvbWFpbiBmb3IgJXMuXG4iLAorCSAgICAgb2gtPmNsa2Rldl9jb25faWQsIGMtPm5hbWUpOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTU3LDggKzU4NywxOSBAQAogCQlfc2V0X21hc3Rlcl9zdGFuZGJ5bW9kZShvaCwgaWRsZW1vZGUsICZ2KTsKIAl9CiAKLQkvKiBYWFggT0NQIEFVVE9JRExFIGJpdD8gKi8KKwlpZiAob2gtPnN5c2NvbmZpZy0+c3lzY19mbGFncyAmIFNZU0NfSEFTX0FVVE9JRExFKSB7CisJCWlkbGVtb2RlID0gKG9oLT5mbGFncyAmIEhXTU9EX05PX09DUF9BVVRPSURMRSkgPworCQkJMCA6IDE7CisJCV9zZXRfbW9kdWxlX2F1dG9pZGxlKG9oLCBpZGxlbW9kZSwgJnYpOworCX0KIAorCS8qIFhYWCBPQ1AgRU5BV0FLRVVQIGJpdD8gKi8KKworCS8qCisJICogWFhYIFRoZSBjbG9jayBmcmFtZXdvcmsgc2hvdWxkIGhhbmRsZSB0aGlzLCBieQorCSAqIGNhbGxpbmcgaW50byB0aGlzIGNvZGUuICBCdXQgdGhpcyBtdXN0IHdhaXQgdW50aWwgdGhlCisJICogY2xvY2sgc3RydWN0dXJlcyBhcmUgdGFnZ2VkIHdpdGggb21hcF9od21vZCBlbnRyaWVzCisJICovCiAJaWYgKG9oLT5mbGFncyAmIEhXTU9EX1NFVF9ERUZBVUxUX0NMT0NLQUNUICYmCiAJICAgIG9oLT5zeXNjb25maWctPnN5c2NfZmxhZ3MgJiBTWVNDX0hBU19DTE9DS0FDVElWSVRZKQogCQlfc2V0X2Nsb2NrYWN0aXZpdHkob2gsIG9oLT5zeXNjb25maWctPmNsb2NrYWN0LCAmdik7CkBAIC02MjIsNyArNjYzLDggQEAKIAlpZiAob2gtPnN5c2NvbmZpZy0+c3lzY19mbGFncyAmIFNZU0NfSEFTX01JRExFTU9ERSkKIAkJX3NldF9tYXN0ZXJfc3RhbmRieW1vZGUob2gsIEhXTU9EX0lETEVNT0RFX0ZPUkNFLCAmdik7CiAKLQkvKiBYWFggY2xlYXIgT0NQIEFVVE9JRExFIGJpdD8gKi8KKwlpZiAob2gtPnN5c2NvbmZpZy0+c3lzY19mbGFncyAmIFNZU0NfSEFTX0FVVE9JRExFKQorCQlfc2V0X21vZHVsZV9hdXRvaWRsZShvaCwgMSwgJnYpOwogCiAJX3dyaXRlX3N5c2NvbmZpZyh2LCBvaCk7CiB9CkBAIC03MzYsNyArNzc4LDcgQEAKIHN0YXRpYyBpbnQgX3Jlc2V0KHN0cnVjdCBvbWFwX2h3bW9kICpvaCkKIHsKIAl1MzIgciwgdjsKLQlpbnQgYzsKKwlpbnQgYyA9IDA7CiAKIAlpZiAoIW9oLT5zeXNjb25maWcgfHwKIAkgICAgIShvaC0+c3lzY29uZmlnLT5zeXNjX2ZsYWdzICYgU1lTQ19IQVNfU09GVFJFU0VUKSB8fApAQCAtNzU4LDEzICs4MDAsOSBAQAogCQlyZXR1cm4gcjsKIAlfd3JpdGVfc3lzY29uZmlnKHYsIG9oKTsKIAotCWMgPSAwOwotCXdoaWxlIChjIDwgTUFYX01PRFVMRV9SRVNFVF9XQUlUICYmCi0JICAgICAgICEob21hcF9od21vZF9yZWFkbChvaCwgb2gtPnN5c2NvbmZpZy0+c3lzc19vZmZzKSAmCi0JCSBTWVNTX1JFU0VURE9ORV9NQVNLKSkgewotCQl1ZGVsYXkoMSk7Ci0JCWMrKzsKLQl9CisJb21hcF90ZXN0X3RpbWVvdXQoKG9tYXBfaHdtb2RfcmVhZGwob2gsIG9oLT5zeXNjb25maWctPnN5c3Nfb2ZmcykgJgorCQkJICAgU1lTU19SRVNFVERPTkVfTUFTSyksCisJCQkgIE1BWF9NT0RVTEVfUkVTRVRfV0FJVCwgYyk7CiAKIAlpZiAoYyA9PSBNQVhfTU9EVUxFX1JFU0VUX1dBSVQpCiAJCVdBUk4oMSwgIm9tYXBfaHdtb2Q6ICVzOiBmYWlsZWQgdG8gcmVzZXQgaW4gJWQgdXNlY1xuIiwKQEAgLTg4NCwzMyArOTIyLDYgQEAKIH0KIAogLyoqCi0gKiBfd3JpdGVfY2xvY2thY3RfbG9jayAtIHNldCB0aGUgbW9kdWxlJ3MgY2xvY2thY3Rpdml0eSBiaXRzCi0gKiBAb2g6IHN0cnVjdCBvbWFwX2h3bW9kICoKLSAqIEBjbG9ja2FjdDogQ0xPQ0tBQ1RJVklUWSBmaWVsZCBiaXRzCi0gKgotICogV3JpdGVzIHRoZSBDTE9DS0FDVElWSVRZIGJpdHMgQGNsb2NrYWN0IHRvIHRoZSBod21vZCBAb2gKLSAqIE9DUF9TWVNDT05GSUcgcmVnaXN0ZXIuICBSZXR1cm5zIC1FSU5WQUwgaWYgdGhlIGh3bW9kIGlzIGluIHRoZQotICogd3Jvbmcgc3RhdGUgb3IgcmV0dXJucyAwLgotICovCi1zdGF0aWMgaW50IF93cml0ZV9jbG9ja2FjdF9sb2NrKHN0cnVjdCBvbWFwX2h3bW9kICpvaCwgdTggY2xvY2thY3QpCi17Ci0JdTMyIHY7Ci0KLQlpZiAoIW9oLT5zeXNjb25maWcgfHwKLQkgICAgIShvaC0+c3lzY29uZmlnLT5zeXNjX2ZsYWdzICYgU1lTQ19IQVNfQ0xPQ0tBQ1RJVklUWSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbXV0ZXhfbG9jaygmb21hcF9od21vZF9tdXRleCk7Ci0JdiA9IG9oLT5fc3lzY19jYWNoZTsKLQlfc2V0X2Nsb2NrYWN0aXZpdHkob2gsIGNsb2NrYWN0LCAmdik7Ci0JX3dyaXRlX3N5c2NvbmZpZyh2LCBvaCk7Ci0JbXV0ZXhfdW5sb2NrKCZvbWFwX2h3bW9kX211dGV4KTsKLQotCXJldHVybiAwOwotfQotCi0KLS8qKgogICogX3NldHVwIC0gZG8gaW5pdGlhbCBjb25maWd1cmF0aW9uIG9mIG9tYXBfaHdtb2QKICAqIEBvaDogc3RydWN0IG9tYXBfaHdtb2QgKgogICoKQEAgLTk0OCwxMSArOTU5LDE5IEBACiAKIAlfZW5hYmxlKG9oKTsKIAotCWlmICghKG9oLT5mbGFncyAmIEhXTU9EX0lOSVRfTk9fUkVTRVQpKQotCQlfcmVzZXQob2gpOwotCi0JLyogWFhYIE9DUCBBVVRPSURMRSBiaXQ/ICovCi0JLyogWFhYIE9DUCBFTkFXQUtFVVAgYml0PyAqLworCWlmICghKG9oLT5mbGFncyAmIEhXTU9EX0lOSVRfTk9fUkVTRVQpKSB7CisJCS8qCisJCSAqIFhYWCBEbyB0aGUgT0NQX1NZU0NPTkZJRyBiaXRzIG5lZWQgdG8gYmUKKwkJICogcmVwcm9ncmFtbWVkIGFmdGVyIGEgcmVzZXQ/ICBJZiBub3QsIHRoZW4gdGhpcyBjYW4KKwkJICogYmUgcmVtb3ZlZC4gIElmIHRoZXkgZG8sIHRoZW4gcHJvYmFibHkgdGhlCisJCSAqIF9lbmFibGUoKSBmdW5jdGlvbiBzaG91bGQgYmUgc3BsaXQgdG8gYXZvaWQgdGhlCisJCSAqIHJld3JpdGUgb2YgdGhlIE9DUF9TWVNDT05GSUcgcmVnaXN0ZXIuCisJCSAqLworCQlpZiAob2gtPnN5c2NvbmZpZykgeworCQkJX3VwZGF0ZV9zeXNjX2NhY2hlKG9oKTsKKwkJCV9zeXNjX2VuYWJsZShvaCk7CisJCX0KKwl9CiAKIAlpZiAoIShvaC0+ZmxhZ3MgJiBIV01PRF9JTklUX05PX0lETEUpKQogCQlfaWRsZShvaCk7CkBAIC0xMzQ4LDggKzEzNjcsOSBAQAogCS8qIEZvciBlYWNoIElSUSwgRE1BLCBtZW1vcnkgYXJlYSwgZmlsbCBpbiBhcnJheS4qLwogCiAJZm9yIChpID0gMDsgaSA8IG9oLT5tcHVfaXJxc19jbnQ7IGkrKykgewotCQkocmVzICsgciktPnN0YXJ0ID0gKihvaC0+bXB1X2lycXMgKyBpKTsKLQkJKHJlcyArIHIpLT5lbmQgPSAqKG9oLT5tcHVfaXJxcyArIGkpOworCQkocmVzICsgciktPm5hbWUgPSAob2gtPm1wdV9pcnFzICsgaSktPm5hbWU7CisJCShyZXMgKyByKS0+c3RhcnQgPSAob2gtPm1wdV9pcnFzICsgaSktPmlycTsKKwkJKHJlcyArIHIpLT5lbmQgPSAob2gtPm1wdV9pcnFzICsgaSktPmlycTsKIAkJKHJlcyArIHIpLT5mbGFncyA9IElPUkVTT1VSQ0VfSVJROwogCQlyKys7CiAJfQpAQCAtMTQ1NCw2MiArMTQ3NCw2IEBACiB9CiAKIC8qKgotICogb21hcF9od21vZF9zZXRfY2xvY2thY3Rfbm9uZSAtIHNldCBjbG9ja2FjdGl2aXR5IHRlc3QgdG8gQk9USAotICogQG9oOiBzdHJ1Y3Qgb21hcF9od21vZCAqCi0gKgotICogT24gc29tZSBtb2R1bGVzLCB0aGlzIGZ1bmN0aW9uIGNhbiBhZmZlY3QgdGhlIHdha2V1cCBsYXRlbmN5IHZzLgotICogcG93ZXIgY29uc3VtcHRpb24gYmFsYW5jZS4gIEludGVuZGVkIHRvIGJlIGNhbGxlZCBieSB0aGUKLSAqIG9tYXBfZGV2aWNlIGxheWVyLiAgUGFzc2VzIGFsb25nIHRoZSByZXR1cm4gdmFsdWUgZnJvbQotICogX3dyaXRlX2Nsb2NrYWN0X2xvY2soKS4KLSAqLwotaW50IG9tYXBfaHdtb2Rfc2V0X2Nsb2NrYWN0X2JvdGgoc3RydWN0IG9tYXBfaHdtb2QgKm9oKQotewotCXJldHVybiBfd3JpdGVfY2xvY2thY3RfbG9jayhvaCwgQ0xPQ0tBQ1RfVEVTVF9CT1RIKTsKLX0KLQotLyoqCi0gKiBvbWFwX2h3bW9kX3NldF9jbG9ja2FjdF9ub25lIC0gc2V0IGNsb2NrYWN0aXZpdHkgdGVzdCB0byBNQUlOCi0gKiBAb2g6IHN0cnVjdCBvbWFwX2h3bW9kICoKLSAqCi0gKiBPbiBzb21lIG1vZHVsZXMsIHRoaXMgZnVuY3Rpb24gY2FuIGFmZmVjdCB0aGUgd2FrZXVwIGxhdGVuY3kgdnMuCi0gKiBwb3dlciBjb25zdW1wdGlvbiBiYWxhbmNlLiAgSW50ZW5kZWQgdG8gYmUgY2FsbGVkIGJ5IHRoZQotICogb21hcF9kZXZpY2UgbGF5ZXIuICBQYXNzZXMgYWxvbmcgdGhlIHJldHVybiB2YWx1ZSBmcm9tCi0gKiBfd3JpdGVfY2xvY2thY3RfbG9jaygpLgotICovCi1pbnQgb21hcF9od21vZF9zZXRfY2xvY2thY3RfbWFpbihzdHJ1Y3Qgb21hcF9od21vZCAqb2gpCi17Ci0JcmV0dXJuIF93cml0ZV9jbG9ja2FjdF9sb2NrKG9oLCBDTE9DS0FDVF9URVNUX01BSU4pOwotfQotCi0vKioKLSAqIG9tYXBfaHdtb2Rfc2V0X2Nsb2NrYWN0X25vbmUgLSBzZXQgY2xvY2thY3Rpdml0eSB0ZXN0IHRvIElDTEsKLSAqIEBvaDogc3RydWN0IG9tYXBfaHdtb2QgKgotICoKLSAqIE9uIHNvbWUgbW9kdWxlcywgdGhpcyBmdW5jdGlvbiBjYW4gYWZmZWN0IHRoZSB3YWtldXAgbGF0ZW5jeSB2cy4KLSAqIHBvd2VyIGNvbnN1bXB0aW9uIGJhbGFuY2UuICBJbnRlbmRlZCB0byBiZSBjYWxsZWQgYnkgdGhlCi0gKiBvbWFwX2RldmljZSBsYXllci4gIFBhc3NlcyBhbG9uZyB0aGUgcmV0dXJuIHZhbHVlIGZyb20KLSAqIF93cml0ZV9jbG9ja2FjdF9sb2NrKCkuCi0gKi8KLWludCBvbWFwX2h3bW9kX3NldF9jbG9ja2FjdF9pY2xrKHN0cnVjdCBvbWFwX2h3bW9kICpvaCkKLXsKLQlyZXR1cm4gX3dyaXRlX2Nsb2NrYWN0X2xvY2sob2gsIENMT0NLQUNUX1RFU1RfSUNMSyk7Ci19Ci0KLS8qKgotICogb21hcF9od21vZF9zZXRfY2xvY2thY3Rfbm9uZSAtIHNldCBjbG9ja2FjdGl2aXR5IHRlc3QgdG8gTk9ORQotICogQG9oOiBzdHJ1Y3Qgb21hcF9od21vZCAqCi0gKgotICogT24gc29tZSBtb2R1bGVzLCB0aGlzIGZ1bmN0aW9uIGNhbiBhZmZlY3QgdGhlIHdha2V1cCBsYXRlbmN5IHZzLgotICogcG93ZXIgY29uc3VtcHRpb24gYmFsYW5jZS4gIEludGVuZGVkIHRvIGJlIGNhbGxlZCBieSB0aGUKLSAqIG9tYXBfZGV2aWNlIGxheWVyLiAgUGFzc2VzIGFsb25nIHRoZSByZXR1cm4gdmFsdWUgZnJvbQotICogX3dyaXRlX2Nsb2NrYWN0X2xvY2soKS4KLSAqLwotaW50IG9tYXBfaHdtb2Rfc2V0X2Nsb2NrYWN0X25vbmUoc3RydWN0IG9tYXBfaHdtb2QgKm9oKQotewotCXJldHVybiBfd3JpdGVfY2xvY2thY3RfbG9jayhvaCwgQ0xPQ0tBQ1RfVEVTVF9OT05FKTsKLX0KLQotLyoqCiAgKiBvbWFwX2h3bW9kX2VuYWJsZV93YWtldXAgLSBhbGxvdyBkZXZpY2UgdG8gd2FrZSB1cCB0aGUgc3lzdGVtCiAgKiBAb2g6IHN0cnVjdCBvbWFwX2h3bW9kICoKICAqCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL29wcDI0MjBfZGF0YS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vcHAyNDIwX2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjZhOTM5NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb3BwMjQyMF9kYXRhLmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBvcHAyNDIwX2RhdGEuYyAtIG9sZC1zdHlsZSAiT1BQIiB0YWJsZSBmb3IgT01BUDI0MjAKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDkgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogVGhlIE9NQVAyIHByb2Nlc3NvciBjYW4gYmUgcnVuIGF0IHNldmVyYWwgZGlzY3JldGUgJ1BSQ00gY29uZmlndXJhdGlvbnMnLgorICogVGhlc2UgY29uZmlndXJhdGlvbnMgYXJlIGNoYXJhY3Rlcml6ZWQgYnkgdm9sdGFnZSBhbmQgc3BlZWQgZm9yIGNsb2Nrcy4KKyAqIFRoZSBkZXZpY2UgaXMgb25seSB2YWxpZGF0ZWQgZm9yIGNlcnRhaW4gY29tYmluYXRpb25zLiBPbmUgd2F5IHRvIGV4cHJlc3MKKyAqIHRoZXNlIGNvbWJpbmF0aW9ucyBpcyB2aWEgdGhlICdyYXRpbydzJyB3aGljaCB0aGUgY2xvY2tzIG9wZXJhdGUgd2l0aAorICogcmVzcGVjdCB0byBlYWNoIG90aGVyLiBUaGVzZSByYXRpbyBzZXRzIGFyZSBmb3IgYSBnaXZlbiB2b2x0YWdlL0RQTEwKKyAqIHNldHRpbmcuIEFsbCBjb25maWd1cmF0aW9ucyBjYW4gYmUgZGVzY3JpYmVkIGJ5IGEgRFBMTCBzZXR0aW5nIGFuZCBhIHJhdGlvCisgKiBUaGVyZSBhcmUgMyByYXRpbyBzZXRzIGZvciB0aGUgMjQzMCBhbmQgWCByYXRpbyBzZXRzIGZvciAyNDIwLgorICoKKyAqIDI0MzAgZGlmZmVycyBmcm9tIDI0MjAgaW4gdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSBwaGFzZSBzeW5jaHJvbml6ZXJzIHVzZWQuCisgKiBUaGV5IGJvdGggaGF2ZSBhIHNsaWdodGx5IGRpZmZlcmVudCBjbG9jayBkb21haW4gc2V0dXAuIDI0MjAoaXZhMSxkc3ApIHZzCisgKiAyNDMwIChpdmEyLjEsIE5PZHNwLCBtZG0pCisgKgorICogWFhYIE1pc3Npbmcgdm9sdGFnZSBkYXRhLgorICoKKyAqIFRIZSBmb3JtYXQgZGVzY3JpYmVkIGluIHRoaXMgZmlsZSBpcyBkZXByZWNhdGVkLiAgT25jZSBhIHJlYXNvbmFibGUKKyAqIE9QUCBBUEkgZXhpc3RzLCB0aGUgZGF0YSBpbiB0aGlzIGZpbGUgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byB1c2UgaXQuCisgKgorICogVGhpcyBpcyB0ZWNobmljYWxseSBwYXJ0IG9mIHRoZSBPTUFQMnh4eCBjbG9jayBjb2RlLgorICovCisKKyNpbmNsdWRlICJvcHAyeHh4LmgiCisjaW5jbHVkZSAic2RyYy5oIgorI2luY2x1ZGUgImNsb2NrLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogS2V5IGRpdmlkZXJzIHdoaWNoIG1ha2UgdXAgYSBQUkNNIHNldC4gUmF0aW8ncyBmb3IgYSBQUkNNIGFyZSBtYW5kYXRlZC4KKyAqIHh0YWxfc3BlZWQsIGRwbGxfc3BlZWQsIG1wdV9zcGVlZCwgQ01fQ0xLU0VMX01QVSwKKyAqIENNX0NMS1NFTF9EU1AsIENNX0NMS1NFTF9HRlgsIENNX0NMS1NFTDFfQ09SRSwgQ01fQ0xLU0VMMV9QTEwsCisgKiBDTV9DTEtTRUwyX1BMTCwgQ01fQ0xLU0VMX01ETQorICoKKyAqIEZpbGxpbmcgaW4gdGFibGUgYmFzZWQgb24gSDQgYm9hcmRzIGFuZCAyNDMwLVNEUHMgdmFyaWFudHMgYXZhaWxhYmxlLgorICogVGhlcmUgYXJlIHF1aXRlIGEgZmV3IG1vcmUgcmF0ZXMgY29tYmluYXRpb25zIHdoaWNoIGNvdWxkIGJlIGRlZmluZWQuCisgKgorICogV2hlbiBtdWx0aXBsZSB2YWx1ZXMgYXJlIGRlZmluZWQgdGhlIHN0YXJ0IHVwIHdpbGwgdHJ5IGFuZCBjaG9vc2UgdGhlCisgKiBmYXN0ZXN0IG9uZS4gSWYgYSAnZmFzdCcgdmFsdWUgaXMgZGVmaW5lZCwgdGhlbiBhdXRvbWF0aWNhbGx5LCB0aGUgLzIKKyAqIG9uZSBzaG91bGQgYmUgaW5jbHVkZWQgYXMgaXQgY2FuIGJlIHVzZWQuCUdlbmVyYWxseSBoYXZpbmcgbW9yZSB0aGF0CisgKiBvbmUgZmFzdCBzZXQgZG9lcyBub3QgbWFrZSBzZW5zZSwgYXMgc3RhdGljIHRpbWluZ3MgbmVlZCB0byBiZSBjaGFuZ2VkCisgKiB0byBjaGFuZ2UgdGhlIHNldC4JIFRoZSBleGNlcHRpb24gaXMgdGhlIGJ5cGFzcyBzZXR0aW5nIHdoaWNoIGlzCisgKiBhdmFpbGJsZSBmb3IgbG93IHBvd2VyIGJ5cGFzcy4KKyAqCisgKiBOb3RlOiBUaGlzIHRhYmxlIG5lZWRzIHRvIGJlIHNvcnRlZCwgZmFzdGVzdCB0byBzbG93ZXN0LgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2NvbnN0IHN0cnVjdCBwcmNtX2NvbmZpZyBvbWFwMjQyMF9yYXRlX3RhYmxlW10gPSB7CisJLyogUFJDTSBJIC0gRkFTVCAqLworCXtTMTJNLCBTNjYwTSwgUzMzME0sIFJJX0NNX0NMS1NFTF9NUFVfVkFMLAkJLyogMzMwTUh6IEFSTSAqLworCQlSSV9DTV9DTEtTRUxfRFNQX1ZBTCwgUklfQ01fQ0xLU0VMX0dGWF9WQUwsCisJCVJJX0NNX0NMS1NFTDFfQ09SRV9WQUwsIE1JX0NNX0NMS1NFTDFfUExMXzEyX1ZBTCwKKwkJTVhfQ0xLU0VMMl9QTExfMnhfVkFMLCAwLCBTRFJDX1JGUl9DVFJMXzE2NU1IeiwKKwkJUkFURV9JTl8yNDJYfSwKKworCS8qIFBSQ00gSUkgLSBGQVNUICovCisJe1MxMk0sIFM2MDBNLCBTMzAwTSwgUklJX0NNX0NMS1NFTF9NUFVfVkFMLAkJLyogMzAwTUh6IEFSTSAqLworCQlSSUlfQ01fQ0xLU0VMX0RTUF9WQUwsIFJJSV9DTV9DTEtTRUxfR0ZYX1ZBTCwKKwkJUklJX0NNX0NMS1NFTDFfQ09SRV9WQUwsIE1JSV9DTV9DTEtTRUwxX1BMTF8xMl9WQUwsCisJCU1YX0NMS1NFTDJfUExMXzJ4X1ZBTCwgMCwgU0RSQ19SRlJfQ1RSTF8xMDBNSHosCisJCVJBVEVfSU5fMjQyWH0sCisKKwl7UzEzTSwgUzYwME0sIFMzMDBNLCBSSUlfQ01fQ0xLU0VMX01QVV9WQUwsCQkvKiAzMDBNSHogQVJNICovCisJCVJJSV9DTV9DTEtTRUxfRFNQX1ZBTCwgUklJX0NNX0NMS1NFTF9HRlhfVkFMLAorCQlSSUlfQ01fQ0xLU0VMMV9DT1JFX1ZBTCwgTUlJX0NNX0NMS1NFTDFfUExMXzEzX1ZBTCwKKwkJTVhfQ0xLU0VMMl9QTExfMnhfVkFMLCAwLCBTRFJDX1JGUl9DVFJMXzEwME1IeiwKKwkJUkFURV9JTl8yNDJYfSwKKworCS8qIFBSQ00gSUlJIC0gRkFTVCAqLworCXtTMTJNLCBTNTMyTSwgUzI2Nk0sIFJJSUlfQ01fQ0xLU0VMX01QVV9WQUwsCQkvKiAyNjZNSHogQVJNICovCisJCVJJSUlfQ01fQ0xLU0VMX0RTUF9WQUwsIFJJSUlfQ01fQ0xLU0VMX0dGWF9WQUwsCisJCVJJSUlfQ01fQ0xLU0VMMV9DT1JFX1ZBTCwgTUlJSV9DTV9DTEtTRUwxX1BMTF8xMl9WQUwsCisJCU1YX0NMS1NFTDJfUExMXzJ4X1ZBTCwgMCwgU0RSQ19SRlJfQ1RSTF8xMzNNSHosCisJCVJBVEVfSU5fMjQyWH0sCisKKwl7UzEzTSwgUzUzMk0sIFMyNjZNLCBSSUlJX0NNX0NMS1NFTF9NUFVfVkFMLAkJLyogMjY2TUh6IEFSTSAqLworCQlSSUlJX0NNX0NMS1NFTF9EU1BfVkFMLCBSSUlJX0NNX0NMS1NFTF9HRlhfVkFMLAorCQlSSUlJX0NNX0NMS1NFTDFfQ09SRV9WQUwsIE1JSUlfQ01fQ0xLU0VMMV9QTExfMTNfVkFMLAorCQlNWF9DTEtTRUwyX1BMTF8yeF9WQUwsIDAsIFNEUkNfUkZSX0NUUkxfMTMzTUh6LAorCQlSQVRFX0lOXzI0Mlh9LAorCisJLyogUFJDTSBJSSAtIFNMT1cgKi8KKwl7UzEyTSwgUzMwME0sIFMxNTBNLCBSSUlfQ01fQ0xLU0VMX01QVV9WQUwsCQkvKiAxNTBNSHogQVJNICovCisJCVJJSV9DTV9DTEtTRUxfRFNQX1ZBTCwgUklJX0NNX0NMS1NFTF9HRlhfVkFMLAorCQlSSUlfQ01fQ0xLU0VMMV9DT1JFX1ZBTCwgTUlJX0NNX0NMS1NFTDFfUExMXzEyX1ZBTCwKKwkJTVhfQ0xLU0VMMl9QTExfMnhfVkFMLCAwLCBTRFJDX1JGUl9DVFJMXzEwME1IeiwKKwkJUkFURV9JTl8yNDJYfSwKKworCXtTMTNNLCBTMzAwTSwgUzE1ME0sIFJJSV9DTV9DTEtTRUxfTVBVX1ZBTCwJCS8qIDE1ME1IeiBBUk0gKi8KKwkJUklJX0NNX0NMS1NFTF9EU1BfVkFMLCBSSUlfQ01fQ0xLU0VMX0dGWF9WQUwsCisJCVJJSV9DTV9DTEtTRUwxX0NPUkVfVkFMLCBNSUlfQ01fQ0xLU0VMMV9QTExfMTNfVkFMLAorCQlNWF9DTEtTRUwyX1BMTF8yeF9WQUwsIDAsIFNEUkNfUkZSX0NUUkxfMTAwTUh6LAorCQlSQVRFX0lOXzI0Mlh9LAorCisJLyogUFJDTSBJSUkgLSBTTE9XICovCisJe1MxMk0sIFMyNjZNLCBTMTMzTSwgUklJSV9DTV9DTEtTRUxfTVBVX1ZBTCwJCS8qIDEzM01IeiBBUk0gKi8KKwkJUklJSV9DTV9DTEtTRUxfRFNQX1ZBTCwgUklJSV9DTV9DTEtTRUxfR0ZYX1ZBTCwKKwkJUklJSV9DTV9DTEtTRUwxX0NPUkVfVkFMLCBNSUlJX0NNX0NMS1NFTDFfUExMXzEyX1ZBTCwKKwkJTVhfQ0xLU0VMMl9QTExfMnhfVkFMLCAwLCBTRFJDX1JGUl9DVFJMXzEzM01IeiwKKwkJUkFURV9JTl8yNDJYfSwKKworCXtTMTNNLCBTMjY2TSwgUzEzM00sIFJJSUlfQ01fQ0xLU0VMX01QVV9WQUwsCQkvKiAxMzNNSHogQVJNICovCisJCVJJSUlfQ01fQ0xLU0VMX0RTUF9WQUwsIFJJSUlfQ01fQ0xLU0VMX0dGWF9WQUwsCisJCVJJSUlfQ01fQ0xLU0VMMV9DT1JFX1ZBTCwgTUlJSV9DTV9DTEtTRUwxX1BMTF8xM19WQUwsCisJCU1YX0NMS1NFTDJfUExMXzJ4X1ZBTCwgMCwgU0RSQ19SRlJfQ1RSTF8xMzNNSHosCisJCVJBVEVfSU5fMjQyWH0sCisKKwkvKiBQUkNNLVZJSSAoYm9vdC1ieXBhc3MpICovCisJe1MxMk0sIFMxMk0sIFMxMk0sIFJWSUlfQ01fQ0xLU0VMX01QVV9WQUwsCQkvKiAxMk1IeiBBUk0qLworCQlSVklJX0NNX0NMS1NFTF9EU1BfVkFMLCBSVklJX0NNX0NMS1NFTF9HRlhfVkFMLAorCQlSVklJX0NNX0NMS1NFTDFfQ09SRV9WQUwsIE1WSUlfQ01fQ0xLU0VMMV9QTExfMTJfVkFMLAorCQlNWF9DTEtTRUwyX1BMTF8yeF9WQUwsIDAsIFNEUkNfUkZSX0NUUkxfQllQQVNTLAorCQlSQVRFX0lOXzI0Mlh9LAorCisJLyogUFJDTS1WSUkgKGJvb3QtYnlwYXNzKSAqLworCXtTMTNNLCBTMTNNLCBTMTNNLCBSVklJX0NNX0NMS1NFTF9NUFVfVkFMLAkJLyogMTNNSHogQVJNICovCisJCVJWSUlfQ01fQ0xLU0VMX0RTUF9WQUwsIFJWSUlfQ01fQ0xLU0VMX0dGWF9WQUwsCisJCVJWSUlfQ01fQ0xLU0VMMV9DT1JFX1ZBTCwgTVZJSV9DTV9DTEtTRUwxX1BMTF8xM19WQUwsCisJCU1YX0NMS1NFTDJfUExMXzJ4X1ZBTCwgMCwgU0RSQ19SRlJfQ1RSTF9CWVBBU1MsCisJCVJBVEVfSU5fMjQyWH0sCisKKwl7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb3BwMjQzMF9kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29wcDI0MzBfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYjgxNjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29wcDI0MzBfZGF0YS5jCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogb3BwMjQyMF9kYXRhLmMgLSBvbGQtc3R5bGUgIk9QUCIgdGFibGUgZm9yIE9NQVAyNDIwCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDkgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA5IE5va2lhIENvcnBvcmF0aW9uCisgKgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFRoZSBPTUFQMiBwcm9jZXNzb3IgY2FuIGJlIHJ1biBhdCBzZXZlcmFsIGRpc2NyZXRlICdQUkNNIGNvbmZpZ3VyYXRpb25zJy4KKyAqIFRoZXNlIGNvbmZpZ3VyYXRpb25zIGFyZSBjaGFyYWN0ZXJpemVkIGJ5IHZvbHRhZ2UgYW5kIHNwZWVkIGZvciBjbG9ja3MuCisgKiBUaGUgZGV2aWNlIGlzIG9ubHkgdmFsaWRhdGVkIGZvciBjZXJ0YWluIGNvbWJpbmF0aW9ucy4gT25lIHdheSB0byBleHByZXNzCisgKiB0aGVzZSBjb21iaW5hdGlvbnMgaXMgdmlhIHRoZSAncmF0aW8ncycgd2hpY2ggdGhlIGNsb2NrcyBvcGVyYXRlIHdpdGgKKyAqIHJlc3BlY3QgdG8gZWFjaCBvdGhlci4gVGhlc2UgcmF0aW8gc2V0cyBhcmUgZm9yIGEgZ2l2ZW4gdm9sdGFnZS9EUExMCisgKiBzZXR0aW5nLiBBbGwgY29uZmlndXJhdGlvbnMgY2FuIGJlIGRlc2NyaWJlZCBieSBhIERQTEwgc2V0dGluZyBhbmQgYSByYXRpbworICogVGhlcmUgYXJlIDMgcmF0aW8gc2V0cyBmb3IgdGhlIDI0MzAgYW5kIFggcmF0aW8gc2V0cyBmb3IgMjQyMC4KKyAqCisgKiAyNDMwIGRpZmZlcnMgZnJvbSAyNDIwIGluIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgcGhhc2Ugc3luY2hyb25pemVycyB1c2VkLgorICogVGhleSBib3RoIGhhdmUgYSBzbGlnaHRseSBkaWZmZXJlbnQgY2xvY2sgZG9tYWluIHNldHVwLiAyNDIwKGl2YTEsZHNwKSB2cworICogMjQzMCAoaXZhMi4xLCBOT2RzcCwgbWRtKQorICoKKyAqIFhYWCBNaXNzaW5nIHZvbHRhZ2UgZGF0YS4KKyAqCisgKiBUSGUgZm9ybWF0IGRlc2NyaWJlZCBpbiB0aGlzIGZpbGUgaXMgZGVwcmVjYXRlZC4gIE9uY2UgYSByZWFzb25hYmxlCisgKiBPUFAgQVBJIGV4aXN0cywgdGhlIGRhdGEgaW4gdGhpcyBmaWxlIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gdXNlIGl0LgorICoKKyAqIFRoaXMgaXMgdGVjaG5pY2FsbHkgcGFydCBvZiB0aGUgT01BUDJ4eHggY2xvY2sgY29kZS4KKyAqLworCisjaW5jbHVkZSAib3BwMnh4eC5oIgorI2luY2x1ZGUgInNkcmMuaCIKKyNpbmNsdWRlICJjbG9jay5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEtleSBkaXZpZGVycyB3aGljaCBtYWtlIHVwIGEgUFJDTSBzZXQuIFJhdGlvJ3MgZm9yIGEgUFJDTSBhcmUgbWFuZGF0ZWQuCisgKiB4dGFsX3NwZWVkLCBkcGxsX3NwZWVkLCBtcHVfc3BlZWQsIENNX0NMS1NFTF9NUFUsCisgKiBDTV9DTEtTRUxfRFNQLCBDTV9DTEtTRUxfR0ZYLCBDTV9DTEtTRUwxX0NPUkUsIENNX0NMS1NFTDFfUExMLAorICogQ01fQ0xLU0VMMl9QTEwsIENNX0NMS1NFTF9NRE0KKyAqCisgKiBGaWxsaW5nIGluIHRhYmxlIGJhc2VkIG9uIEg0IGJvYXJkcyBhbmQgMjQzMC1TRFBzIHZhcmlhbnRzIGF2YWlsYWJsZS4KKyAqIFRoZXJlIGFyZSBxdWl0ZSBhIGZldyBtb3JlIHJhdGVzIGNvbWJpbmF0aW9ucyB3aGljaCBjb3VsZCBiZSBkZWZpbmVkLgorICoKKyAqIFdoZW4gbXVsdGlwbGUgdmFsdWVzIGFyZSBkZWZpbmVkIHRoZSBzdGFydCB1cCB3aWxsIHRyeSBhbmQgY2hvb3NlIHRoZQorICogZmFzdGVzdCBvbmUuIElmIGEgJ2Zhc3QnIHZhbHVlIGlzIGRlZmluZWQsIHRoZW4gYXV0b21hdGljYWxseSwgdGhlIC8yCisgKiBvbmUgc2hvdWxkIGJlIGluY2x1ZGVkIGFzIGl0IGNhbiBiZSB1c2VkLglHZW5lcmFsbHkgaGF2aW5nIG1vcmUgdGhhdAorICogb25lIGZhc3Qgc2V0IGRvZXMgbm90IG1ha2Ugc2Vuc2UsIGFzIHN0YXRpYyB0aW1pbmdzIG5lZWQgdG8gYmUgY2hhbmdlZAorICogdG8gY2hhbmdlIHRoZSBzZXQuCSBUaGUgZXhjZXB0aW9uIGlzIHRoZSBieXBhc3Mgc2V0dGluZyB3aGljaCBpcworICogYXZhaWxibGUgZm9yIGxvdyBwb3dlciBieXBhc3MuCisgKgorICogTm90ZTogVGhpcyB0YWJsZSBuZWVkcyB0byBiZSBzb3J0ZWQsIGZhc3Rlc3QgdG8gc2xvd2VzdC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitjb25zdCBzdHJ1Y3QgcHJjbV9jb25maWcgb21hcDI0MzBfcmF0ZV90YWJsZVtdID0geworCS8qIFBSQ00gIzQgLSByYXRpbzIgKEVTMi4xKSAtIEZBU1QgKi8KKwl7UzEzTSwgUzc5OE0sIFMzOTlNLCBSMl9DTV9DTEtTRUxfTVBVX1ZBTCwJCS8qIDM5OU1IeiBBUk0gKi8KKwkJUjJfQ01fQ0xLU0VMX0RTUF9WQUwsIFIyX0NNX0NMS1NFTF9HRlhfVkFMLAorCQlSMl9DTV9DTEtTRUwxX0NPUkVfVkFMLCBNNF9DTV9DTEtTRUwxX1BMTF8xM19WQUwsCisJCU1YX0NMS1NFTDJfUExMXzJ4X1ZBTCwgUjJfQ01fQ0xLU0VMX01ETV9WQUwsCisJCVNEUkNfUkZSX0NUUkxfMTMzTUh6LAorCQlSQVRFX0lOXzI0M1h9LAorCisJLyogUFJDTSAjMiAtIHJhdGlvMSAoRVMyKSAtIEZBU1QgKi8KKwl7UzEzTSwgUzY1OE0sIFMzMjlNLCBSMV9DTV9DTEtTRUxfTVBVX1ZBTCwJCS8qIDMzME1IeiBBUk0gKi8KKwkJUjFfQ01fQ0xLU0VMX0RTUF9WQUwsIFIxX0NNX0NMS1NFTF9HRlhfVkFMLAorCQlSMV9DTV9DTEtTRUwxX0NPUkVfVkFMLCBNMl9DTV9DTEtTRUwxX1BMTF8xM19WQUwsCisJCU1YX0NMS1NFTDJfUExMXzJ4X1ZBTCwgUjFfQ01fQ0xLU0VMX01ETV9WQUwsCisJCVNEUkNfUkZSX0NUUkxfMTY1TUh6LAorCQlSQVRFX0lOXzI0M1h9LAorCisJLyogUFJDTSAjNWEgLSByYXRpbzEgLSBGQVNUICovCisJe1MxM00sIFM1MzJNLCBTMjY2TSwgUjFfQ01fQ0xLU0VMX01QVV9WQUwsCQkvKiAyNjZNSHogQVJNICovCisJCVIxX0NNX0NMS1NFTF9EU1BfVkFMLCBSMV9DTV9DTEtTRUxfR0ZYX1ZBTCwKKwkJUjFfQ01fQ0xLU0VMMV9DT1JFX1ZBTCwgTTVBX0NNX0NMS1NFTDFfUExMXzEzX1ZBTCwKKwkJTVhfQ0xLU0VMMl9QTExfMnhfVkFMLCBSMV9DTV9DTEtTRUxfTURNX1ZBTCwKKwkJU0RSQ19SRlJfQ1RSTF8xMzNNSHosCisJCVJBVEVfSU5fMjQzWH0sCisKKwkvKiBQUkNNICM1YiAtIHJhdGlvMSAtIEZBU1QgKi8KKwl7UzEzTSwgUzQwME0sIFMyMDBNLCBSMV9DTV9DTEtTRUxfTVBVX1ZBTCwJCS8qIDIwME1IeiBBUk0gKi8KKwkJUjFfQ01fQ0xLU0VMX0RTUF9WQUwsIFIxX0NNX0NMS1NFTF9HRlhfVkFMLAorCQlSMV9DTV9DTEtTRUwxX0NPUkVfVkFMLCBNNUJfQ01fQ0xLU0VMMV9QTExfMTNfVkFMLAorCQlNWF9DTEtTRUwyX1BMTF8yeF9WQUwsIFIxX0NNX0NMS1NFTF9NRE1fVkFMLAorCQlTRFJDX1JGUl9DVFJMXzEwME1IeiwKKwkJUkFURV9JTl8yNDNYfSwKKworCS8qIFBSQ00gIzQgLSByYXRpbzEgKEVTMi4xKSAtIFNMT1cgKi8KKwl7UzEzTSwgUzM5OU0sIFMxOTlNLCBSMl9DTV9DTEtTRUxfTVBVX1ZBTCwJCS8qIDIwME1IeiBBUk0gKi8KKwkJUjJfQ01fQ0xLU0VMX0RTUF9WQUwsIFIyX0NNX0NMS1NFTF9HRlhfVkFMLAorCQlSMl9DTV9DTEtTRUwxX0NPUkVfVkFMLCBNNF9DTV9DTEtTRUwxX1BMTF8xM19WQUwsCisJCU1YX0NMS1NFTDJfUExMXzF4X1ZBTCwgUjJfQ01fQ0xLU0VMX01ETV9WQUwsCisJCVNEUkNfUkZSX0NUUkxfMTMzTUh6LAorCQlSQVRFX0lOXzI0M1h9LAorCisJLyogUFJDTSAjMiAtIHJhdGlvMSAoRVMyKSAtIFNMT1cgKi8KKwl7UzEzTSwgUzMyOU0sIFMxNjRNLCBSMV9DTV9DTEtTRUxfTVBVX1ZBTCwJCS8qIDE2NU1IeiBBUk0gKi8KKwkJUjFfQ01fQ0xLU0VMX0RTUF9WQUwsIFIxX0NNX0NMS1NFTF9HRlhfVkFMLAorCQlSMV9DTV9DTEtTRUwxX0NPUkVfVkFMLCBNMl9DTV9DTEtTRUwxX1BMTF8xM19WQUwsCisJCU1YX0NMS1NFTDJfUExMXzF4X1ZBTCwgUjFfQ01fQ0xLU0VMX01ETV9WQUwsCisJCVNEUkNfUkZSX0NUUkxfMTY1TUh6LAorCQlSQVRFX0lOXzI0M1h9LAorCisJLyogUFJDTSAjNWEgLSByYXRpbzEgLSBTTE9XICovCisJe1MxM00sIFMyNjZNLCBTMTMzTSwgUjFfQ01fQ0xLU0VMX01QVV9WQUwsCQkvKiAxMzNNSHogQVJNICovCisJCVIxX0NNX0NMS1NFTF9EU1BfVkFMLCBSMV9DTV9DTEtTRUxfR0ZYX1ZBTCwKKwkJUjFfQ01fQ0xLU0VMMV9DT1JFX1ZBTCwgTTVBX0NNX0NMS1NFTDFfUExMXzEzX1ZBTCwKKwkJTVhfQ0xLU0VMMl9QTExfMXhfVkFMLCBSMV9DTV9DTEtTRUxfTURNX1ZBTCwKKwkJU0RSQ19SRlJfQ1RSTF8xMzNNSHosCisJCVJBVEVfSU5fMjQzWH0sCisKKwkvKiBQUkNNICM1YiAtIHJhdGlvMSAtIFNMT1cqLworCXtTMTNNLCBTMjAwTSwgUzEwME0sIFIxX0NNX0NMS1NFTF9NUFVfVkFMLAkJLyogMTAwTUh6IEFSTSAqLworCQlSMV9DTV9DTEtTRUxfRFNQX1ZBTCwgUjFfQ01fQ0xLU0VMX0dGWF9WQUwsCisJCVIxX0NNX0NMS1NFTDFfQ09SRV9WQUwsIE01Ql9DTV9DTEtTRUwxX1BMTF8xM19WQUwsCisJCU1YX0NMS1NFTDJfUExMXzF4X1ZBTCwgUjFfQ01fQ0xLU0VMX01ETV9WQUwsCisJCVNEUkNfUkZSX0NUUkxfMTAwTUh6LAorCQlSQVRFX0lOXzI0M1h9LAorCisJLyogUFJDTS1ib290L2J5cGFzcyAqLworCXtTMTNNLCBTMTNNLCBTMTNNLCBSQl9DTV9DTEtTRUxfTVBVX1ZBTCwJCS8qIDEzTWh6ICovCisJCVJCX0NNX0NMS1NFTF9EU1BfVkFMLCBSQl9DTV9DTEtTRUxfR0ZYX1ZBTCwKKwkJUkJfQ01fQ0xLU0VMMV9DT1JFX1ZBTCwgTUJfQ01fQ0xLU0VMMV9QTExfMTNfVkFMLAorCQlNWF9DTEtTRUwyX1BMTF8yeF9WQUwsIFJCX0NNX0NMS1NFTF9NRE1fVkFMLAorCQlTRFJDX1JGUl9DVFJMX0JZUEFTUywKKwkJUkFURV9JTl8yNDNYfSwKKworCS8qIFBSQ00tYm9vdC9ieXBhc3MgKi8KKwl7UzEyTSwgUzEyTSwgUzEyTSwgUkJfQ01fQ0xLU0VMX01QVV9WQUwsCQkvKiAxMk1oeiAqLworCQlSQl9DTV9DTEtTRUxfRFNQX1ZBTCwgUkJfQ01fQ0xLU0VMX0dGWF9WQUwsCisJCVJCX0NNX0NMS1NFTDFfQ09SRV9WQUwsIE1CX0NNX0NMS1NFTDFfUExMXzEyX1ZBTCwKKwkJTVhfQ0xLU0VMMl9QTExfMnhfVkFMLCBSQl9DTV9DTEtTRUxfTURNX1ZBTCwKKwkJU0RSQ19SRlJfQ1RSTF9CWVBBU1MsCisJCVJBVEVfSU5fMjQzWH0sCisKKwl7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb3BwMnh4eC5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vcHAyeHh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ2ZGYwNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb3BwMnh4eC5oCkBAIC0wLDAgKzEsNDI0IEBACisvKgorICogb3BwMnh4eC5oIC0gbWFjcm9zIGZvciBvbGQtc3R5bGUgT01BUDJ4eHggIk9QUCIgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDkgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogVGhlIE9NQVAyIHByb2Nlc3NvciBjYW4gYmUgcnVuIGF0IHNldmVyYWwgZGlzY3JldGUgJ1BSQ00gY29uZmlndXJhdGlvbnMnLgorICogVGhlc2UgY29uZmlndXJhdGlvbnMgYXJlIGNoYXJhY3Rlcml6ZWQgYnkgdm9sdGFnZSBhbmQgc3BlZWQgZm9yIGNsb2Nrcy4KKyAqIFRoZSBkZXZpY2UgaXMgb25seSB2YWxpZGF0ZWQgZm9yIGNlcnRhaW4gY29tYmluYXRpb25zLiBPbmUgd2F5IHRvIGV4cHJlc3MKKyAqIHRoZXNlIGNvbWJpbmF0aW9ucyBpcyB2aWEgdGhlICdyYXRpbydzJyB3aGljaCB0aGUgY2xvY2tzIG9wZXJhdGUgd2l0aAorICogcmVzcGVjdCB0byBlYWNoIG90aGVyLiBUaGVzZSByYXRpbyBzZXRzIGFyZSBmb3IgYSBnaXZlbiB2b2x0YWdlL0RQTEwKKyAqIHNldHRpbmcuIEFsbCBjb25maWd1cmF0aW9ucyBjYW4gYmUgZGVzY3JpYmVkIGJ5IGEgRFBMTCBzZXR0aW5nIGFuZCBhIHJhdGlvCisgKiBUaGVyZSBhcmUgMyByYXRpbyBzZXRzIGZvciB0aGUgMjQzMCBhbmQgWCByYXRpbyBzZXRzIGZvciAyNDIwLgorICoKKyAqIDI0MzAgZGlmZmVycyBmcm9tIDI0MjAgaW4gdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSBwaGFzZSBzeW5jaHJvbml6ZXJzIHVzZWQuCisgKiBUaGV5IGJvdGggaGF2ZSBhIHNsaWdodGx5IGRpZmZlcmVudCBjbG9jayBkb21haW4gc2V0dXAuIDI0MjAoaXZhMSxkc3ApIHZzCisgKiAyNDMwIChpdmEyLjEsIE5PZHNwLCBtZG0pCisgKgorICogWFhYIE1pc3Npbmcgdm9sdGFnZSBkYXRhLgorICoKKyAqIFRIZSBmb3JtYXQgZGVzY3JpYmVkIGluIHRoaXMgZmlsZSBpcyBkZXByZWNhdGVkLiAgT25jZSBhIHJlYXNvbmFibGUKKyAqIE9QUCBBUEkgZXhpc3RzLCB0aGUgZGF0YSBpbiB0aGlzIGZpbGUgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byB1c2UgaXQuCisgKgorICogVGhpcyBpcyB0ZWNobmljYWxseSBwYXJ0IG9mIHRoZSBPTUFQMnh4eCBjbG9jayBjb2RlLgorICovCisKKyNpZm5kZWYgX19BUkNIX0FSTV9NQUNIX09NQVAyX09QUDJYWFhfSAorI2RlZmluZSBfX0FSQ0hfQVJNX01BQ0hfT01BUDJfT1BQMlhYWF9ICisKKy8qKgorICogc3RydWN0IHByY21fY29uZmlnIC0gZGVmaW5lIGNsb2NrIHJhdGVzIG9uIGEgcGVyLU9QUCBiYXNpcyAoMjR4eCkKKyAqCisgKiBLZXkgZGl2aWRlcnMgd2hpY2ggbWFrZSB1cCBhIFBSQ00gc2V0LiBSYXRpbydzIGZvciBhIFBSQ00gYXJlIG1hbmRhdGVkLgorICogeHRhbF9zcGVlZCwgZHBsbF9zcGVlZCwgbXB1X3NwZWVkLCBDTV9DTEtTRUxfTVBVLENNX0NMS1NFTF9EU1AKKyAqIENNX0NMS1NFTF9HRlgsIENNX0NMS1NFTDFfQ09SRSwgQ01fQ0xLU0VMMV9QTEwgQ01fQ0xLU0VMMl9QTEwsIENNX0NMS1NFTF9NRE0KKyAqCisgKiBUaGlzIGlzIGRlcHJlY2F0ZWQuICBBcyBzb29uIGFzIHdlIGhhdmUgYSBkZWNlbnQgT1BQIEFQSSwgd2Ugc2hvdWxkCisgKiBtb3ZlIGFsbCB0aGlzIHN0dWZmIHRvIGl0LgorICovCitzdHJ1Y3QgcHJjbV9jb25maWcgeworCXVuc2lnbmVkIGxvbmcgeHRhbF9zcGVlZDsJLyogY3J5c3RhbCByYXRlICovCisJdW5zaWduZWQgbG9uZyBkcGxsX3NwZWVkOwkvKiBkcGxsOiBvdXQqeHRhbCpNLyhOLTEpdGFibGVfcmVjYWxjICovCisJdW5zaWduZWQgbG9uZyBtcHVfc3BlZWQ7CS8qIHNwZWVkIG9mIE1QVSAqLworCXVuc2lnbmVkIGxvbmcgY21fY2xrc2VsX21wdTsJLyogbXB1IGRpdmlkZXIgKi8KKwl1bnNpZ25lZCBsb25nIGNtX2Nsa3NlbF9kc3A7CS8qIGRzcCtpdmExIGRpdigyNDIwKSwgaXZhMi4xKDI0MzApICovCisJdW5zaWduZWQgbG9uZyBjbV9jbGtzZWxfZ2Z4OwkvKiBnZnggZGl2aWRlcnMgKi8KKwl1bnNpZ25lZCBsb25nIGNtX2Nsa3NlbDFfY29yZTsJLyogbWFqb3Igc3Vic3lzdGVtIGRpdmlkZXJzICovCisJdW5zaWduZWQgbG9uZyBjbV9jbGtzZWwxX3BsbDsJLyogbSxuICovCisJdW5zaWduZWQgbG9uZyBjbV9jbGtzZWwyX3BsbDsJLyogZHBsbHgxIG9yIHgyIG91dCAqLworCXVuc2lnbmVkIGxvbmcgY21fY2xrc2VsX21kbTsJLyogbW9kZW0gZGl2aWRlcnMgMjQzMCBvbmx5ICovCisJdW5zaWduZWQgbG9uZyBiYXNlX3NkcmNfcmZyOwkvKiBiYXNlIHJlZnJlc2ggdGltaW5nIGZvciBhIHNldCAqLworCXVuc2lnbmVkIGNoYXIgZmxhZ3M7Cit9OworCisKKy8qIENvcmUgZmllbGRzIGZvciBjbV9jbGtzZWwsIG5vdCByYXRpbyBnb3Zlcm5lZCAqLworI2RlZmluZSBSWF9DTEtTRUxfRFNTMQkJCSgweDEwIDw8IDgpCisjZGVmaW5lIFJYX0NMS1NFTF9EU1MyCQkJKDB4MCA8PCAxMykKKyNkZWZpbmUgUlhfQ0xLU0VMX1NTSQkJCSgweDUgPDwgMjApCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVm9sdGFnZS9EUExMIHJhdGlvcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogMjQzMCBSYXRpbydzLCAyNDMwLVJhdGlvIENvbmZpZyAxICovCisjZGVmaW5lIFIxX0NMS1NFTF9MMwkJCSg0IDw8IDApCisjZGVmaW5lIFIxX0NMS1NFTF9MNAkJCSgyIDw8IDUpCisjZGVmaW5lIFIxX0NMS1NFTF9VU0IJCQkoNCA8PCAyNSkKKyNkZWZpbmUgUjFfQ01fQ0xLU0VMMV9DT1JFX1ZBTAkJKFIxX0NMS1NFTF9VU0IgfCBSWF9DTEtTRUxfU1NJIHwgXAorCQkJCQkgUlhfQ0xLU0VMX0RTUzIgfCBSWF9DTEtTRUxfRFNTMSB8IFwKKwkJCQkJIFIxX0NMS1NFTF9MNCB8IFIxX0NMS1NFTF9MMykKKyNkZWZpbmUgUjFfQ0xLU0VMX01QVQkJCSgyIDw8IDApCisjZGVmaW5lIFIxX0NNX0NMS1NFTF9NUFVfVkFMCQlSMV9DTEtTRUxfTVBVCisjZGVmaW5lIFIxX0NMS1NFTF9EU1AJCQkoMiA8PCAwKQorI2RlZmluZSBSMV9DTEtTRUxfRFNQX0lGCQkoMiA8PCA1KQorI2RlZmluZSBSMV9DTV9DTEtTRUxfRFNQX1ZBTAkJKFIxX0NMS1NFTF9EU1AgfCBSMV9DTEtTRUxfRFNQX0lGKQorI2RlZmluZSBSMV9DTEtTRUxfR0ZYCQkJKDIgPDwgMCkKKyNkZWZpbmUgUjFfQ01fQ0xLU0VMX0dGWF9WQUwJCVIxX0NMS1NFTF9HRlgKKyNkZWZpbmUgUjFfQ0xLU0VMX01ETQkJCSg0IDw8IDApCisjZGVmaW5lIFIxX0NNX0NMS1NFTF9NRE1fVkFMCQlSMV9DTEtTRUxfTURNCisKKy8qIDI0MzAtUmF0aW8gQ29uZmlnIDIgKi8KKyNkZWZpbmUgUjJfQ0xLU0VMX0wzCQkJKDYgPDwgMCkKKyNkZWZpbmUgUjJfQ0xLU0VMX0w0CQkJKDIgPDwgNSkKKyNkZWZpbmUgUjJfQ0xLU0VMX1VTQgkJCSgyIDw8IDI1KQorI2RlZmluZSBSMl9DTV9DTEtTRUwxX0NPUkVfVkFMCQkoUjJfQ0xLU0VMX1VTQiB8IFJYX0NMS1NFTF9TU0kgfCBcCisJCQkJCSBSWF9DTEtTRUxfRFNTMiB8IFJYX0NMS1NFTF9EU1MxIHwgXAorCQkJCQkgUjJfQ0xLU0VMX0w0IHwgUjJfQ0xLU0VMX0wzKQorI2RlZmluZSBSMl9DTEtTRUxfTVBVCQkJKDIgPDwgMCkKKyNkZWZpbmUgUjJfQ01fQ0xLU0VMX01QVV9WQUwJCVIyX0NMS1NFTF9NUFUKKyNkZWZpbmUgUjJfQ0xLU0VMX0RTUAkJCSgyIDw8IDApCisjZGVmaW5lIFIyX0NMS1NFTF9EU1BfSUYJCSgzIDw8IDUpCisjZGVmaW5lIFIyX0NNX0NMS1NFTF9EU1BfVkFMCQkoUjJfQ0xLU0VMX0RTUCB8IFIyX0NMS1NFTF9EU1BfSUYpCisjZGVmaW5lIFIyX0NMS1NFTF9HRlgJCQkoMiA8PCAwKQorI2RlZmluZSBSMl9DTV9DTEtTRUxfR0ZYX1ZBTAkJUjJfQ0xLU0VMX0dGWAorI2RlZmluZSBSMl9DTEtTRUxfTURNCQkJKDYgPDwgMCkKKyNkZWZpbmUgUjJfQ01fQ0xLU0VMX01ETV9WQUwJCVIyX0NMS1NFTF9NRE0KKworLyogMjQzMC1SYXRpbyBCb290bSAoQllQQVNTKSAqLworI2RlZmluZSBSQl9DTEtTRUxfTDMJCQkoMSA8PCAwKQorI2RlZmluZSBSQl9DTEtTRUxfTDQJCQkoMSA8PCA1KQorI2RlZmluZSBSQl9DTEtTRUxfVVNCCQkJKDEgPDwgMjUpCisjZGVmaW5lIFJCX0NNX0NMS1NFTDFfQ09SRV9WQUwJCShSQl9DTEtTRUxfVVNCIHwgUlhfQ0xLU0VMX1NTSSB8IFwKKwkJCQkJIFJYX0NMS1NFTF9EU1MyIHwgUlhfQ0xLU0VMX0RTUzEgfCBcCisJCQkJCSBSQl9DTEtTRUxfTDQgfCBSQl9DTEtTRUxfTDMpCisjZGVmaW5lIFJCX0NMS1NFTF9NUFUJCQkoMSA8PCAwKQorI2RlZmluZSBSQl9DTV9DTEtTRUxfTVBVX1ZBTAkJUkJfQ0xLU0VMX01QVQorI2RlZmluZSBSQl9DTEtTRUxfRFNQCQkJKDEgPDwgMCkKKyNkZWZpbmUgUkJfQ0xLU0VMX0RTUF9JRgkJKDEgPDwgNSkKKyNkZWZpbmUgUkJfQ01fQ0xLU0VMX0RTUF9WQUwJCShSQl9DTEtTRUxfRFNQIHwgUkJfQ0xLU0VMX0RTUF9JRikKKyNkZWZpbmUgUkJfQ0xLU0VMX0dGWAkJCSgxIDw8IDApCisjZGVmaW5lIFJCX0NNX0NMS1NFTF9HRlhfVkFMCQlSQl9DTEtTRUxfR0ZYCisjZGVmaW5lIFJCX0NMS1NFTF9NRE0JCQkoMSA8PCAwKQorI2RlZmluZSBSQl9DTV9DTEtTRUxfTURNX1ZBTAkJUkJfQ0xLU0VMX01ETQorCisvKiAyNDIwIFJhdGlvIEVxdWl2YWxlbnRzICovCisjZGVmaW5lIFJYWF9DTEtTRUxfVkxZTlEJCSgweDEyIDw8IDE1KQorI2RlZmluZSBSWFhfQ0xLU0VMX1NTSQkJCSgweDggPDwgMjApCisKKy8qIDI0MjAtUFJDTSBJSUkgNTMyTUh6IGNvcmUgKi8KKyNkZWZpbmUgUklJSV9DTEtTRUxfTDMJCQkoNCA8PCAwKQkvKiAxMzNNSHogKi8KKyNkZWZpbmUgUklJSV9DTEtTRUxfTDQJCQkoMiA8PCA1KQkvKiA2Ni41TUh6ICovCisjZGVmaW5lIFJJSUlfQ0xLU0VMX1VTQgkJCSg0IDw8IDI1KQkvKiAzMy4yNU1IeiAqLworI2RlZmluZSBSSUlJX0NNX0NMS1NFTDFfQ09SRV9WQUwJKFJJSUlfQ0xLU0VMX1VTQiB8IFJYWF9DTEtTRUxfU1NJIHwgXAorCQkJCQkgUlhYX0NMS1NFTF9WTFlOUSB8IFJYX0NMS1NFTF9EU1MyIHwgXAorCQkJCQkgUlhfQ0xLU0VMX0RTUzEgfCBSSUlJX0NMS1NFTF9MNCB8IFwKKwkJCQkJIFJJSUlfQ0xLU0VMX0wzKQorI2RlZmluZSBSSUlJX0NMS1NFTF9NUFUJCQkoMiA8PCAwKQkvKiAyNjZNSHogKi8KKyNkZWZpbmUgUklJSV9DTV9DTEtTRUxfTVBVX1ZBTAkJUklJSV9DTEtTRUxfTVBVCisjZGVmaW5lIFJJSUlfQ0xLU0VMX0RTUAkJCSgzIDw8IDApCS8qIGM1eCAtIDE3Ny4zTUh6ICovCisjZGVmaW5lIFJJSUlfQ0xLU0VMX0RTUF9JRgkJKDIgPDwgNSkJLyogYzV4IC0gODguNjdNSHogKi8KKyNkZWZpbmUgUklJSV9TWU5DX0RTUAkJCSgxIDw8IDcpCS8qIEVuYWJsZSBzeW5jICovCisjZGVmaW5lIFJJSUlfQ0xLU0VMX0lWQQkJCSg2IDw8IDgpCS8qIGl2YTEgLSA4OC42N01IeiAqLworI2RlZmluZSBSSUlJX1NZTkNfSVZBCQkJKDEgPDwgMTMpCS8qIEVuYWJsZSBzeW5jICovCisjZGVmaW5lIFJJSUlfQ01fQ0xLU0VMX0RTUF9WQUwJCShSSUlJX1NZTkNfSVZBIHwgUklJSV9DTEtTRUxfSVZBIHwgXAorCQkJCQkgUklJSV9TWU5DX0RTUCB8IFJJSUlfQ0xLU0VMX0RTUF9JRiB8IFwKKwkJCQkJIFJJSUlfQ0xLU0VMX0RTUCkKKyNkZWZpbmUgUklJSV9DTEtTRUxfR0ZYCQkJKDIgPDwgMCkJLyogNjYuNU1IeiAqLworI2RlZmluZSBSSUlJX0NNX0NMS1NFTF9HRlhfVkFMCQlSSUlJX0NMS1NFTF9HRlgKKworLyogMjQyMC1QUkNNIElJIDYwME1IeiBjb3JlICovCisjZGVmaW5lIFJJSV9DTEtTRUxfTDMJCQkoNiA8PCAwKQkvKiAxMDBNSHogKi8KKyNkZWZpbmUgUklJX0NMS1NFTF9MNAkJCSgyIDw8IDUpCS8qIDUwTUh6ICovCisjZGVmaW5lIFJJSV9DTEtTRUxfVVNCCQkJKDIgPDwgMjUpCS8qIDUwTUh6ICovCisjZGVmaW5lIFJJSV9DTV9DTEtTRUwxX0NPUkVfVkFMCQkoUklJX0NMS1NFTF9VU0IgfCBSWFhfQ0xLU0VMX1NTSSB8IFwKKwkJCQkJIFJYWF9DTEtTRUxfVkxZTlEgfCBSWF9DTEtTRUxfRFNTMiB8IFwKKwkJCQkJIFJYX0NMS1NFTF9EU1MxIHwgUklJX0NMS1NFTF9MNCB8IFwKKwkJCQkJIFJJSV9DTEtTRUxfTDMpCisjZGVmaW5lIFJJSV9DTEtTRUxfTVBVCQkJKDIgPDwgMCkJLyogMzAwTUh6ICovCisjZGVmaW5lIFJJSV9DTV9DTEtTRUxfTVBVX1ZBTAkJUklJX0NMS1NFTF9NUFUKKyNkZWZpbmUgUklJX0NMS1NFTF9EU1AJCQkoMyA8PCAwKQkvKiBjNXggLSAyMDBNSHogKi8KKyNkZWZpbmUgUklJX0NMS1NFTF9EU1BfSUYJCSgyIDw8IDUpCS8qIGM1eCAtIDEwME1IeiAqLworI2RlZmluZSBSSUlfU1lOQ19EU1AJCQkoMCA8PCA3KQkvKiBCeXBhc3Mgc3luYyAqLworI2RlZmluZSBSSUlfQ0xLU0VMX0lWQQkJCSgzIDw8IDgpCS8qIGl2YTEgLSAyMDBNSHogKi8KKyNkZWZpbmUgUklJX1NZTkNfSVZBCQkJKDAgPDwgMTMpCS8qIEJ5cGFzcyBzeW5jICovCisjZGVmaW5lIFJJSV9DTV9DTEtTRUxfRFNQX1ZBTAkJKFJJSV9TWU5DX0lWQSB8IFJJSV9DTEtTRUxfSVZBIHwgXAorCQkJCQkgUklJX1NZTkNfRFNQIHwgUklJX0NMS1NFTF9EU1BfSUYgfCBcCisJCQkJCSBSSUlfQ0xLU0VMX0RTUCkKKyNkZWZpbmUgUklJX0NMS1NFTF9HRlgJCQkoMiA8PCAwKQkvKiA1ME1IeiAqLworI2RlZmluZSBSSUlfQ01fQ0xLU0VMX0dGWF9WQUwJCVJJSV9DTEtTRUxfR0ZYCisKKy8qIDI0MjAtUFJDTSBJIDY2ME1IeiBjb3JlICovCisjZGVmaW5lIFJJX0NMS1NFTF9MMwkJCSg0IDw8IDApCS8qIDE2NU1IeiAqLworI2RlZmluZSBSSV9DTEtTRUxfTDQJCQkoMiA8PCA1KQkvKiA4Mi41TUh6ICovCisjZGVmaW5lIFJJX0NMS1NFTF9VU0IJCQkoNCA8PCAyNSkJLyogNDEuMjVNSHogKi8KKyNkZWZpbmUgUklfQ01fQ0xLU0VMMV9DT1JFX1ZBTAkJKFJJX0NMS1NFTF9VU0IgfAkJXAorCQkJCQkgUlhYX0NMS1NFTF9TU0kgfCBSWFhfQ0xLU0VMX1ZMWU5RIHwgXAorCQkJCQkgUlhfQ0xLU0VMX0RTUzIgfCBSWF9DTEtTRUxfRFNTMSB8IFwKKwkJCQkJIFJJX0NMS1NFTF9MNCB8IFJJX0NMS1NFTF9MMykKKyNkZWZpbmUgUklfQ0xLU0VMX01QVQkJCSgyIDw8IDApCS8qIDMzME1IeiAqLworI2RlZmluZSBSSV9DTV9DTEtTRUxfTVBVX1ZBTAkJUklfQ0xLU0VMX01QVQorI2RlZmluZSBSSV9DTEtTRUxfRFNQCQkJKDMgPDwgMCkJLyogYzV4IC0gMjIwTUh6ICovCisjZGVmaW5lIFJJX0NMS1NFTF9EU1BfSUYJCSgyIDw8IDUpCS8qIGM1eCAtIDExME1IeiAqLworI2RlZmluZSBSSV9TWU5DX0RTUAkJCSgxIDw8IDcpCS8qIEFjdGl2YXRlIHN5bmMgKi8KKyNkZWZpbmUgUklfQ0xLU0VMX0lWQQkJCSg0IDw8IDgpCS8qIGl2YTEgLSAxNjVNSHogKi8KKyNkZWZpbmUgUklfU1lOQ19JVkEJCQkoMCA8PCAxMykJLyogQnlwYXNzIHN5bmMgKi8KKyNkZWZpbmUgUklfQ01fQ0xLU0VMX0RTUF9WQUwJCShSSV9TWU5DX0lWQSB8IFJJX0NMS1NFTF9JVkEgfAlcCisJCQkJCSBSSV9TWU5DX0RTUCB8IFJJX0NMS1NFTF9EU1BfSUYgfCBcCisJCQkJCSBSSV9DTEtTRUxfRFNQKQorI2RlZmluZSBSSV9DTEtTRUxfR0ZYCQkJKDEgPDwgMCkJLyogMTY1TUh6ICovCisjZGVmaW5lIFJJX0NNX0NMS1NFTF9HRlhfVkFMCQlSSV9DTEtTRUxfR0ZYCisKKy8qIDI0MjAtUFJDTSBWSUkgKGJvb3QpICovCisjZGVmaW5lIFJWSUlfQ0xLU0VMX0wzCQkJKDEgPDwgMCkKKyNkZWZpbmUgUlZJSV9DTEtTRUxfTDQJCQkoMSA8PCA1KQorI2RlZmluZSBSVklJX0NMS1NFTF9EU1MxCQkoMSA8PCA4KQorI2RlZmluZSBSVklJX0NMS1NFTF9EU1MyCQkoMCA8PCAxMykKKyNkZWZpbmUgUlZJSV9DTEtTRUxfVkxZTlEJCSgxIDw8IDE1KQorI2RlZmluZSBSVklJX0NMS1NFTF9TU0kJCQkoMSA8PCAyMCkKKyNkZWZpbmUgUlZJSV9DTEtTRUxfVVNCCQkJKDEgPDwgMjUpCisKKyNkZWZpbmUgUlZJSV9DTV9DTEtTRUwxX0NPUkVfVkFMCShSVklJX0NMS1NFTF9VU0IgfCBSVklJX0NMS1NFTF9TU0kgfCBcCisJCQkJCSBSVklJX0NMS1NFTF9WTFlOUSB8IFwKKwkJCQkJIFJWSUlfQ0xLU0VMX0RTUzIgfCBSVklJX0NMS1NFTF9EU1MxIHwgXAorCQkJCQkgUlZJSV9DTEtTRUxfTDQgfCBSVklJX0NMS1NFTF9MMykKKworI2RlZmluZSBSVklJX0NMS1NFTF9NUFUJCQkoMSA8PCAwKSAvKiBhbGwgZGl2aWRlIGJ5IDEgKi8KKyNkZWZpbmUgUlZJSV9DTV9DTEtTRUxfTVBVX1ZBTAkJUlZJSV9DTEtTRUxfTVBVCisKKyNkZWZpbmUgUlZJSV9DTEtTRUxfRFNQCQkJKDEgPDwgMCkKKyNkZWZpbmUgUlZJSV9DTEtTRUxfRFNQX0lGCQkoMSA8PCA1KQorI2RlZmluZSBSVklJX1NZTkNfRFNQCQkJKDAgPDwgNykKKyNkZWZpbmUgUlZJSV9DTEtTRUxfSVZBCQkJKDEgPDwgOCkKKyNkZWZpbmUgUlZJSV9TWU5DX0lWQQkJCSgwIDw8IDEzKQorI2RlZmluZSBSVklJX0NNX0NMS1NFTF9EU1BfVkFMCQkoUlZJSV9TWU5DX0lWQSB8IFJWSUlfQ0xLU0VMX0lWQSB8IFwKKwkJCQkJIFJWSUlfU1lOQ19EU1AgfCBSVklJX0NMS1NFTF9EU1BfSUYgfCBcCisJCQkJCSBSVklJX0NMS1NFTF9EU1ApCisKKyNkZWZpbmUgUlZJSV9DTEtTRUxfR0ZYCQkJKDEgPDwgMCkKKyNkZWZpbmUgUlZJSV9DTV9DTEtTRUxfR0ZYX1ZBTAkJUlZJSV9DTEtTRUxfR0ZYCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogMjQzMCBUYXJnZXQgbW9kZXM6IEFsb25nIHdpdGggZWFjaCBjb25maWd1cmF0aW9uIHRoZSBDUFUgaGFzIHNldmVyYWwKKyAqIG1vZGVzIHdoaWNoIGdvZXMgYWxvbmcgd2l0aCB0aGVtLiBNb2RlcyBtYWlubHkgYXJlIHRoZSBhZGRpdGlvbiBvZgorICogZGVzY3JpYmUgRFBMTCBjb21iaW5hdGlvbnMgdG8gZ28gYWxvbmcgd2l0aCBhIHJhdGlvLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogSGFyZHdhcmUgZ292ZXJuZWQgKi8KKyNkZWZpbmUgTVhfNDhNX1NSQwkJCSgwIDw8IDMpCisjZGVmaW5lIE1YXzU0TV9TUkMJCQkoMCA8PCA1KQorI2RlZmluZSBNWF9BUExMU19DTElLSU5fMTIJCSgzIDw8IDIzKQorI2RlZmluZSBNWF9BUExMU19DTElLSU5fMTMJCSgyIDw8IDIzKQorI2RlZmluZSBNWF9BUExMU19DTElLSU5fMTlfMgkJKDAgPDwgMjMpCisKKy8qCisgKiAyNDMwIC0gc3RhbmRhbG9uZSwgMipyZWYqTS8obisxKSwgTS9OIGlzIGZvciBleGFjdG5lc3Mgbm90IHJlbG9jayBzcGVlZAorICogIzVhCShyYXRpbzEpIGJhc2Vwb3J0LXRhcmdldCwgdGFyZ2V0IERQTEwgPSAyNjYqMiA9IDUzMk1IegorICovCisjZGVmaW5lIE01QV9EUExMX01VTFRfMTIJCSgxMzMgPDwgMTIpCisjZGVmaW5lIE01QV9EUExMX0RJVl8xMgkJCSg1IDw8IDgpCisjZGVmaW5lIE01QV9DTV9DTEtTRUwxX1BMTF8xMl9WQUwJKE1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgXAorCQkJCQkgTTVBX0RQTExfRElWXzEyIHwgTTVBX0RQTExfTVVMVF8xMiB8IFwKKwkJCQkJIE1YX0FQTExTX0NMSUtJTl8xMikKKyNkZWZpbmUgTTVBX0RQTExfTVVMVF8xMwkJKDYxIDw8IDEyKQorI2RlZmluZSBNNUFfRFBMTF9ESVZfMTMJCQkoMiA8PCA4KQorI2RlZmluZSBNNUFfQ01fQ0xLU0VMMV9QTExfMTNfVkFMCShNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IFwKKwkJCQkJIE01QV9EUExMX0RJVl8xMyB8IE01QV9EUExMX01VTFRfMTMgfCBcCisJCQkJCSBNWF9BUExMU19DTElLSU5fMTMpCisjZGVmaW5lIE01QV9EUExMX01VTFRfMTkJCSg1NSA8PCAxMikKKyNkZWZpbmUgTTVBX0RQTExfRElWXzE5CQkJKDMgPDwgOCkKKyNkZWZpbmUgTTVBX0NNX0NMS1NFTDFfUExMXzE5X1ZBTAkoTVhfNDhNX1NSQyB8IE1YXzU0TV9TUkMgfCBcCisJCQkJCSBNNUFfRFBMTF9ESVZfMTkgfCBNNUFfRFBMTF9NVUxUXzE5IHwgXAorCQkJCQkgTVhfQVBMTFNfQ0xJS0lOXzE5XzIpCisvKiAjNWIJKHJhdGlvMSkgdGFyZ2V0IERQTEwgPSAyMDAqMiA9IDQwME1IeiAqLworI2RlZmluZSBNNUJfRFBMTF9NVUxUXzEyCQkoNTAgPDwgMTIpCisjZGVmaW5lIE01Ql9EUExMX0RJVl8xMgkJCSgyIDw8IDgpCisjZGVmaW5lIE01Ql9DTV9DTEtTRUwxX1BMTF8xMl9WQUwJKE1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgXAorCQkJCQkgTTVCX0RQTExfRElWXzEyIHwgTTVCX0RQTExfTVVMVF8xMiB8IFwKKwkJCQkJIE1YX0FQTExTX0NMSUtJTl8xMikKKyNkZWZpbmUgTTVCX0RQTExfTVVMVF8xMwkJKDIwMCA8PCAxMikKKyNkZWZpbmUgTTVCX0RQTExfRElWXzEzCQkJKDEyIDw8IDgpCisKKyNkZWZpbmUgTTVCX0NNX0NMS1NFTDFfUExMXzEzX1ZBTAkoTVhfNDhNX1NSQyB8IE1YXzU0TV9TUkMgfCBcCisJCQkJCSBNNUJfRFBMTF9ESVZfMTMgfCBNNUJfRFBMTF9NVUxUXzEzIHwgXAorCQkJCQkgTVhfQVBMTFNfQ0xJS0lOXzEzKQorI2RlZmluZSBNNUJfRFBMTF9NVUxUXzE5CQkoMTI1IDw8IDEyKQorI2RlZmluZSBNNUJfRFBMTF9ESVZfMTkJCQkoMzEgPDwgOCkKKyNkZWZpbmUgTTVCX0NNX0NMS1NFTDFfUExMXzE5X1ZBTAkoTVhfNDhNX1NSQyB8IE1YXzU0TV9TUkMgfCBcCisJCQkJCSBNNUJfRFBMTF9ESVZfMTkgfCBNNUJfRFBMTF9NVUxUXzE5IHwgXAorCQkJCQkgTVhfQVBMTFNfQ0xJS0lOXzE5XzIpCisvKgorICogIzQJKHJhdGlvMiksIERQTEwgPSAzOTkqMiA9IDc5OE1IeiwgTDM9MTMzTUh6CisgKi8KKyNkZWZpbmUgTTRfRFBMTF9NVUxUXzEyCQkJKDEzMyA8PCAxMikKKyNkZWZpbmUgTTRfRFBMTF9ESVZfMTIJCQkoMyA8PCA4KQorI2RlZmluZSBNNF9DTV9DTEtTRUwxX1BMTF8xMl9WQUwJKE1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgXAorCQkJCQkgTTRfRFBMTF9ESVZfMTIgfCBNNF9EUExMX01VTFRfMTIgfCBcCisJCQkJCSBNWF9BUExMU19DTElLSU5fMTIpCisKKyNkZWZpbmUgTTRfRFBMTF9NVUxUXzEzCQkJKDM5OSA8PCAxMikKKyNkZWZpbmUgTTRfRFBMTF9ESVZfMTMJCQkoMTIgPDwgOCkKKyNkZWZpbmUgTTRfQ01fQ0xLU0VMMV9QTExfMTNfVkFMCShNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IFwKKwkJCQkJIE00X0RQTExfRElWXzEzIHwgTTRfRFBMTF9NVUxUXzEzIHwgXAorCQkJCQkgTVhfQVBMTFNfQ0xJS0lOXzEzKQorCisjZGVmaW5lIE00X0RQTExfTVVMVF8xOQkJCSgxNDUgPDwgMTIpCisjZGVmaW5lIE00X0RQTExfRElWXzE5CQkJKDYgPDwgOCkKKyNkZWZpbmUgTTRfQ01fQ0xLU0VMMV9QTExfMTlfVkFMCShNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IFwKKwkJCQkJIE00X0RQTExfRElWXzE5IHwgTTRfRFBMTF9NVUxUXzE5IHwgXAorCQkJCQkgTVhfQVBMTFNfQ0xJS0lOXzE5XzIpCisKKy8qCisgKiAjMwkocmF0aW8yKSBiYXNlcG9ydC10YXJnZXQsIHRhcmdldCBEUExMID0gMzMwKjIgPSA2NjBNSHoKKyAqLworI2RlZmluZSBNM19EUExMX01VTFRfMTIJCQkoNTUgPDwgMTIpCisjZGVmaW5lIE0zX0RQTExfRElWXzEyCQkJKDEgPDwgOCkKKyNkZWZpbmUgTTNfQ01fQ0xLU0VMMV9QTExfMTJfVkFMCShNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IFwKKwkJCQkJIE0zX0RQTExfRElWXzEyIHwgTTNfRFBMTF9NVUxUXzEyIHwgXAorCQkJCQkgTVhfQVBMTFNfQ0xJS0lOXzEyKQorI2RlZmluZSBNM19EUExMX01VTFRfMTMJCQkoNzYgPDwgMTIpCisjZGVmaW5lIE0zX0RQTExfRElWXzEzCQkJKDIgPDwgOCkKKyNkZWZpbmUgTTNfQ01fQ0xLU0VMMV9QTExfMTNfVkFMCShNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IFwKKwkJCQkJIE0zX0RQTExfRElWXzEzIHwgTTNfRFBMTF9NVUxUXzEzIHwgXAorCQkJCQkgTVhfQVBMTFNfQ0xJS0lOXzEzKQorI2RlZmluZSBNM19EUExMX01VTFRfMTkJCQkoMTcgPDwgMTIpCisjZGVmaW5lIE0zX0RQTExfRElWXzE5CQkJKDAgPDwgOCkKKyNkZWZpbmUgTTNfQ01fQ0xLU0VMMV9QTExfMTlfVkFMCShNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IFwKKwkJCQkJIE0zX0RQTExfRElWXzE5IHwgTTNfRFBMTF9NVUxUXzE5IHwgXAorCQkJCQkgTVhfQVBMTFNfQ0xJS0lOXzE5XzIpCisKKy8qCisgKiAjMiAgIChyYXRpbzEpIERQTEwgPSAzMzAqMiA9IDY2ME1IeiwgTDM9MTY1TUh6CisgKi8KKyNkZWZpbmUgTTJfRFBMTF9NVUxUXzEyCQkgICAgICAgICg1NSA8PCAxMikKKyNkZWZpbmUgTTJfRFBMTF9ESVZfMTIJCSAgICAgICAgKDEgPDwgOCkKKyNkZWZpbmUgTTJfQ01fQ0xLU0VMMV9QTExfMTJfVkFMCShNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IFwKKwkJCQkJIE0yX0RQTExfRElWXzEyIHwgTTJfRFBMTF9NVUxUXzEyIHwgXAorCQkJCQkgTVhfQVBMTFNfQ0xJS0lOXzEyKQorCisvKiBTcGVlZCBjaGFuZ2VzIC0gVXNlZCA2NTguN01IeiBpbnN0ZWFkIG9mIDY2ME1IeiBmb3IgTFAtUmVmcmVzaCBNPTc2IE49MiwKKyAqIHJlbG9jayB0aW1lIGlzc3VlICovCisvKiBDb3JlIGZyZXF1ZW5jeSBjaGFuZ2VkIGZyb20gMzMwLzE2NSB0byAzMjkvMTY0IE1IeiovCisjZGVmaW5lIE0yX0RQTExfTVVMVF8xMwkJICAgICAgICAoNzYgPDwgMTIpCisjZGVmaW5lIE0yX0RQTExfRElWXzEzCQkgICAgICAgICgyIDw8IDgpCisjZGVmaW5lIE0yX0NNX0NMS1NFTDFfUExMXzEzX1ZBTAkoTVhfNDhNX1NSQyB8IE1YXzU0TV9TUkMgfCBcCisJCQkJCSBNMl9EUExMX0RJVl8xMyB8IE0yX0RQTExfTVVMVF8xMyB8IFwKKwkJCQkJIE1YX0FQTExTX0NMSUtJTl8xMykKKworI2RlZmluZSBNMl9EUExMX01VTFRfMTkJCSAgICAgICAgKDE3IDw8IDEyKQorI2RlZmluZSBNMl9EUExMX0RJVl8xOQkJICAgICAgICAoMCA8PCA4KQorI2RlZmluZSBNMl9DTV9DTEtTRUwxX1BMTF8xOV9WQUwJKE1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgXAorCQkJCQkgTTJfRFBMTF9ESVZfMTkgfCBNMl9EUExMX01VTFRfMTkgfCBcCisJCQkJCSBNWF9BUExMU19DTElLSU5fMTlfMikKKworLyogYm9vdCAoYm9vdCkgKi8KKyNkZWZpbmUgTUJfRFBMTF9NVUxUCQkJKDEgPDwgMTIpCisjZGVmaW5lIE1CX0RQTExfRElWCQkJKDAgPDwgOCkKKyNkZWZpbmUgTUJfQ01fQ0xLU0VMMV9QTExfMTJfVkFMCShNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IFwKKwkJCQkJIE1CX0RQTExfRElWIHwgTUJfRFBMTF9NVUxUIHwgXAorCQkJCQkgTVhfQVBMTFNfQ0xJS0lOXzEyKQorCisjZGVmaW5lIE1CX0NNX0NMS1NFTDFfUExMXzEzX1ZBTAkoTVhfNDhNX1NSQyB8IE1YXzU0TV9TUkMgfCBcCisJCQkJCSBNQl9EUExMX0RJViB8IE1CX0RQTExfTVVMVCB8IFwKKwkJCQkJIE1YX0FQTExTX0NMSUtJTl8xMykKKworI2RlZmluZSBNQl9DTV9DTEtTRUwxX1BMTF8xOV9WQUwJKE1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgXAorCQkJCQkgTUJfRFBMTF9ESVYgfCBNQl9EUExMX01VTFQgfCBcCisJCQkJCSBNWF9BUExMU19DTElLSU5fMTkpCisKKy8qCisgKiAyNDMwIC0gY2hhc3NpcyAoc2VkbmEpCisgKiAxNjUgKHJhdGlvMSkgc2FtZSBhcyBhYm92ZSAjMgorICogMTUwIChyYXRpbzEpCisgKiAxMzMgKHJhdGlvMikgc2FtZSBhcyBhYm92ZSAjNAorICogMTEwIChyYXRpbzIpIHNhbWUgYXMgYWJvdmUgIzMKKyAqIDEwNCAocmF0aW8yKQorICogYm9vdCAoYm9vdCkKKyAqLworCisvKiBQUkNNIEkgdGFyZ2V0IERQTEwgPSAyKjMzME1IeiA9IDY2ME1IeiAqLworI2RlZmluZSBNSV9EUExMX01VTFRfMTIJCQkoNTUgPDwgMTIpCisjZGVmaW5lIE1JX0RQTExfRElWXzEyCQkJKDEgPDwgOCkKKyNkZWZpbmUgTUlfQ01fQ0xLU0VMMV9QTExfMTJfVkFMCShNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IFwKKwkJCQkJIE1JX0RQTExfRElWXzEyIHwgTUlfRFBMTF9NVUxUXzEyIHwgXAorCQkJCQkgTVhfQVBMTFNfQ0xJS0lOXzEyKQorCisvKgorICogMjQyMCBFcXVpdmFsZW50IC0gbW9kZSByZWdpc3RlcnMKKyAqIFBSQ00gSUkgLCB0YXJnZXQgRFBMTCA9IDIqMzAwTUh6ID0gNjAwTUh6CisgKi8KKyNkZWZpbmUgTUlJX0RQTExfTVVMVF8xMgkJKDUwIDw8IDEyKQorI2RlZmluZSBNSUlfRFBMTF9ESVZfMTIJCQkoMSA8PCA4KQorI2RlZmluZSBNSUlfQ01fQ0xLU0VMMV9QTExfMTJfVkFMCShNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8CVwKKwkJCQkJIE1JSV9EUExMX0RJVl8xMiB8IE1JSV9EUExMX01VTFRfMTIgfCBcCisJCQkJCSBNWF9BUExMU19DTElLSU5fMTIpCisjZGVmaW5lIE1JSV9EUExMX01VTFRfMTMJCSgzMDAgPDwgMTIpCisjZGVmaW5lIE1JSV9EUExMX0RJVl8xMwkJCSgxMiA8PCA4KQorI2RlZmluZSBNSUlfQ01fQ0xLU0VMMV9QTExfMTNfVkFMCShNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8CVwKKwkJCQkJIE1JSV9EUExMX0RJVl8xMyB8IE1JSV9EUExMX01VTFRfMTMgfCBcCisJCQkJCSBNWF9BUExMU19DTElLSU5fMTMpCisKKy8qIFBSQ00gSUlJIHRhcmdldCBEUExMID0gMioyNjYgPSA1MzJNSHoqLworI2RlZmluZSBNSUlJX0RQTExfTVVMVF8xMgkJKDEzMyA8PCAxMikKKyNkZWZpbmUgTUlJSV9EUExMX0RJVl8xMgkJKDUgPDwgOCkKKyNkZWZpbmUgTUlJSV9DTV9DTEtTRUwxX1BMTF8xMl9WQUwJKE1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwJXAorCQkJCQkgTUlJSV9EUExMX0RJVl8xMiB8IFwKKwkJCQkJIE1JSUlfRFBMTF9NVUxUXzEyIHwgTVhfQVBMTFNfQ0xJS0lOXzEyKQorI2RlZmluZSBNSUlJX0RQTExfTVVMVF8xMwkJKDI2NiA8PCAxMikKKyNkZWZpbmUgTUlJSV9EUExMX0RJVl8xMwkJKDEyIDw8IDgpCisjZGVmaW5lIE1JSUlfQ01fQ0xLU0VMMV9QTExfMTNfVkFMCShNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8CVwKKwkJCQkJIE1JSUlfRFBMTF9ESVZfMTMgfCBcCisJCQkJCSBNSUlJX0RQTExfTVVMVF8xMyB8IE1YX0FQTExTX0NMSUtJTl8xMykKKworLyogUFJDTSBWSUkgKGJvb3QgYnlwYXNzKSAqLworI2RlZmluZSBNVklJX0NNX0NMS1NFTDFfUExMXzEyX1ZBTAlNQl9DTV9DTEtTRUwxX1BMTF8xMl9WQUwKKyNkZWZpbmUgTVZJSV9DTV9DTEtTRUwxX1BMTF8xM19WQUwJTUJfQ01fQ0xLU0VMMV9QTExfMTNfVkFMCisKKy8qIEhpZ2ggYW5kIGxvdyBvcGVyYXRpb24gdmFsdWUgKi8KKyNkZWZpbmUgTVhfQ0xLU0VMMl9QTExfMnhfVkFMCQkoMiA8PCAwKQorI2RlZmluZSBNWF9DTEtTRUwyX1BMTF8xeF9WQUwJCSgxIDw8IDApCisKKy8qIE1QVSBzcGVlZCBkZWZpbmVzICovCisjZGVmaW5lIFMxMk0JMTIwMDAwMDAKKyNkZWZpbmUgUzEzTQkxMzAwMDAwMAorI2RlZmluZSBTMTlNCTE5MjAwMDAwCisjZGVmaW5lIFMyNk0JMjYwMDAwMDAKKyNkZWZpbmUgUzEwME0JMTAwMDAwMDAwCisjZGVmaW5lIFMxMzNNCTEzMzAwMDAwMAorI2RlZmluZSBTMTUwTQkxNTAwMDAwMDAKKyNkZWZpbmUgUzE2NE0JMTY0MDAwMDAwCisjZGVmaW5lIFMxNjVNCTE2NTAwMDAwMAorI2RlZmluZSBTMTk5TQkxOTkwMDAwMDAKKyNkZWZpbmUgUzIwME0JMjAwMDAwMDAwCisjZGVmaW5lIFMyNjZNCTI2NjAwMDAwMAorI2RlZmluZSBTMzAwTQkzMDAwMDAwMDAKKyNkZWZpbmUgUzMyOU0JMzI5MDAwMDAwCisjZGVmaW5lIFMzMzBNCTMzMDAwMDAwMAorI2RlZmluZSBTMzk5TQkzOTkwMDAwMDAKKyNkZWZpbmUgUzQwME0JNDAwMDAwMDAwCisjZGVmaW5lIFM1MzJNCTUzMjAwMDAwMAorI2RlZmluZSBTNjAwTQk2MDAwMDAwMDAKKyNkZWZpbmUgUzY1OE0JNjU4MDAwMDAwCisjZGVmaW5lIFM2NjBNCTY2MDAwMDAwMAorI2RlZmluZSBTNzk4TQk3OTgwMDAwMDAKKworCitleHRlcm4gY29uc3Qgc3RydWN0IHByY21fY29uZmlnIG9tYXAyNDIwX3JhdGVfdGFibGVbXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcHJjbV9jb25maWcgb21hcDI0MzBfcmF0ZV90YWJsZVtdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBwcmNtX2NvbmZpZyAqcmF0ZV90YWJsZTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcHJjbV9jb25maWcgKmN1cnJfcHJjbV9zZXQ7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wbS1kZWJ1Zy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wbS1kZWJ1Zy5jCmluZGV4IDhiYWEzMGQuLjg2MGI3NTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG0tZGVidWcuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3BtLWRlYnVnLmMKQEAgLTMyNiw3ICszMjYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3QgY2hhciBwd3JkbV9zdGF0ZV9uYW1lc1tdWzRdID0geworc3RhdGljIGNvbnN0IGNoYXIgcHdyZG1fc3RhdGVfbmFtZXNbXVtQV1JETV9NQVhfUFdSU1RTXSA9IHsKIAkiT0ZGIiwKIAkiUkVUIiwKIAkiSU5BIiwKQEAgLTM4MSw3ICszODEsNyBAQAogCiAJc2VxX3ByaW50ZihzLCAiJXMgKCVzKSIsIHB3cmRtLT5uYW1lLAogCQkJcHdyZG1fc3RhdGVfbmFtZXNbcHdyZG0tPnN0YXRlXSk7Ci0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgUFdSRE1fTUFYX1BXUlNUUzsgaSsrKQogCQlzZXFfcHJpbnRmKHMsICIsJXM6JWQiLCBwd3JkbV9zdGF0ZV9uYW1lc1tpXSwKIAkJCXB3cmRtLT5zdGF0ZV9jb3VudGVyW2ldKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbi5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbi5jCmluZGV4IGI2OTkwZTMuLjI2YjNmM2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW4uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluLmMKQEAgLTEwLDkgKzEwLDcgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotI2lmZGVmIENPTkZJR19PTUFQX0RFQlVHX1BPV0VSRE9NQUlOCi0jIGRlZmluZSBERUJVRwotI2VuZGlmCisjdW5kZWYgREVCVUcKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMTYwLDcgKzE1OCw3IEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBQV1JETV9NQVhfUFdSU1RTOyBpKyspCiAJCXB3cmRtLT5zdGF0ZV9jb3VudGVyW2ldID0gMDsKIAogCXB3cmRtX3dhaXRfdHJhbnNpdGlvbihwd3JkbSk7CkBAIC00ODAsNyArNDc4LDcgQEAKIAlpZiAoSVNfRVJSKHApKSB7CiAJCXByX2RlYnVnKCJwb3dlcmRvbWFpbjogaGFyZHdhcmUgY2Fubm90IHNldC9jbGVhciB3YWtlIHVwIG9mICIKIAkJCSAiJXMgd2hlbiAlcyB3YWtlcyB1cFxuIiwgcHdyZG0xLT5uYW1lLCBwd3JkbTItPm5hbWUpOwotCQlyZXR1cm4gSVNfRVJSKHApOworCQlyZXR1cm4gUFRSX0VSUihwKTsKIAl9CiAKIAlwcl9kZWJ1ZygicG93ZXJkb21haW46IGhhcmR3YXJlIHdpbGwgd2FrZSB1cCAlcyB3aGVuICVzIHdha2VzIHVwXG4iLApAQCAtNTEzLDcgKzUxMSw3IEBACiAJaWYgKElTX0VSUihwKSkgewogCQlwcl9kZWJ1ZygicG93ZXJkb21haW46IGhhcmR3YXJlIGNhbm5vdCBzZXQvY2xlYXIgd2FrZSB1cCBvZiAiCiAJCQkgIiVzIHdoZW4gJXMgd2FrZXMgdXBcbiIsIHB3cmRtMS0+bmFtZSwgcHdyZG0yLT5uYW1lKTsKLQkJcmV0dXJuIElTX0VSUihwKTsKKwkJcmV0dXJuIFBUUl9FUlIocCk7CiAJfQogCiAJcHJfZGVidWcoInBvd2VyZG9tYWluOiBoYXJkd2FyZSB3aWxsIG5vIGxvbmdlciB3YWtlIHVwICVzIGFmdGVyICVzICIKQEAgLTU1MCw3ICs1NDgsNyBAQAogCWlmIChJU19FUlIocCkpIHsKIAkJcHJfZGVidWcoInBvd2VyZG9tYWluOiBoYXJkd2FyZSBjYW5ub3Qgc2V0L2NsZWFyIHdha2UgdXAgb2YgIgogCQkJICIlcyB3aGVuICVzIHdha2VzIHVwXG4iLCBwd3JkbTEtPm5hbWUsIHB3cmRtMi0+bmFtZSk7Ci0JCXJldHVybiBJU19FUlIocCk7CisJCXJldHVybiBQVFJfRVJSKHApOwogCX0KIAogCXJldHVybiBwcm1fcmVhZF9tb2RfYml0c19zaGlmdChwd3JkbTEtPnByY21fb2ZmcywgUE1fV0tERVAsCkBAIC01NzMsMTAgKzU3MSwxMCBAQAogewogCXN0cnVjdCBwb3dlcmRvbWFpbiAqcDsKIAotCWlmICghcHdyZG0xKQorCWlmICghY3B1X2lzX29tYXAzNHh4KCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKCFjcHVfaXNfb21hcDM0eHgoKSkKKwlpZiAoIXB3cmRtMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwID0gX3B3cmRtX2RlcHNfbG9va3VwKHB3cmRtMiwgcHdyZG0xLT5zbGVlcGRlcF9zcmNzKTsKQEAgLTU4NCw3ICs1ODIsNyBAQAogCQlwcl9kZWJ1ZygicG93ZXJkb21haW46IGhhcmR3YXJlIGNhbm5vdCBzZXQvY2xlYXIgc2xlZXAgIgogCQkJICJkZXBlbmRlbmN5IGFmZmVjdGluZyAlcyBmcm9tICVzXG4iLCBwd3JkbTEtPm5hbWUsCiAJCQkgcHdyZG0yLT5uYW1lKTsKLQkJcmV0dXJuIElTX0VSUihwKTsKKwkJcmV0dXJuIFBUUl9FUlIocCk7CiAJfQogCiAJcHJfZGVidWcoInBvd2VyZG9tYWluOiB3aWxsIHByZXZlbnQgJXMgZnJvbSBzbGVlcGluZyBpZiAlcyBpcyBhY3RpdmVcbiIsCkBAIC02MTIsMTAgKzYxMCwxMCBAQAogewogCXN0cnVjdCBwb3dlcmRvbWFpbiAqcDsKIAotCWlmICghcHdyZG0xKQorCWlmICghY3B1X2lzX29tYXAzNHh4KCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKCFjcHVfaXNfb21hcDM0eHgoKSkKKwlpZiAoIXB3cmRtMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwID0gX3B3cmRtX2RlcHNfbG9va3VwKHB3cmRtMiwgcHdyZG0xLT5zbGVlcGRlcF9zcmNzKTsKQEAgLTYyMyw3ICs2MjEsNyBAQAogCQlwcl9kZWJ1ZygicG93ZXJkb21haW46IGhhcmR3YXJlIGNhbm5vdCBzZXQvY2xlYXIgc2xlZXAgIgogCQkJICJkZXBlbmRlbmN5IGFmZmVjdGluZyAlcyBmcm9tICVzXG4iLCBwd3JkbTEtPm5hbWUsCiAJCQkgcHdyZG0yLT5uYW1lKTsKLQkJcmV0dXJuIElTX0VSUihwKTsKKwkJcmV0dXJuIFBUUl9FUlIocCk7CiAJfQogCiAJcHJfZGVidWcoInBvd2VyZG9tYWluOiB3aWxsIG5vIGxvbmdlciBwcmV2ZW50ICVzIGZyb20gc2xlZXBpbmcgaWYgIgpAQCAtNjU1LDEwICs2NTMsMTAgQEAKIHsKIAlzdHJ1Y3QgcG93ZXJkb21haW4gKnA7CiAKLQlpZiAoIXB3cmRtMSkKKwlpZiAoIWNwdV9pc19vbWFwMzR4eCgpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICghY3B1X2lzX29tYXAzNHh4KCkpCisJaWYgKCFwd3JkbTEpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcCA9IF9wd3JkbV9kZXBzX2xvb2t1cChwd3JkbTIsIHB3cmRtMS0+c2xlZXBkZXBfc3Jjcyk7CkBAIC02NjYsNyArNjY0LDcgQEAKIAkJcHJfZGVidWcoInBvd2VyZG9tYWluOiBoYXJkd2FyZSBjYW5ub3Qgc2V0L2NsZWFyIHNsZWVwICIKIAkJCSAiZGVwZW5kZW5jeSBhZmZlY3RpbmcgJXMgZnJvbSAlc1xuIiwgcHdyZG0xLT5uYW1lLAogCQkJIHB3cmRtMi0+bmFtZSk7Ci0JCXJldHVybiBJU19FUlIocCk7CisJCXJldHVybiBQVFJfRVJSKHApOwogCX0KIAogCXJldHVybiBwcm1fcmVhZF9tb2RfYml0c19zaGlmdChwd3JkbTEtPnByY21fb2ZmcywgT01BUDM0MzBfQ01fU0xFRVBERVAsCkBAIC05ODUsNiArOTgzLDkgQEAKIAlpZiAocHdyZG0tPmJhbmtzIDwgKGJhbmsgKyAxKSkKIAkJcmV0dXJuIC1FRVhJU1Q7CiAKKwlpZiAocHdyZG0tPmZsYWdzICYgUFdSRE1fSEFTX01QVV9RVUlSSykKKwkJYmFuayA9IDE7CisKIAkvKgogCSAqIFRoZSByZWdpc3RlciBiaXQgbmFtZXMgYmVsb3cgbWF5IG5vdCBjb3JyZXNwb25kIHRvIHRoZQogCSAqIGFjdHVhbCBuYW1lcyBvZiB0aGUgYml0cyBpbiBlYWNoIHBvd2VyZG9tYWluJ3MgcmVnaXN0ZXIsCkBAIC0xMDMyLDYgKzEwMzMsOSBAQAogCWlmIChwd3JkbS0+YmFua3MgPCAoYmFuayArIDEpKQogCQlyZXR1cm4gLUVFWElTVDsKIAorCWlmIChwd3JkbS0+ZmxhZ3MgJiBQV1JETV9IQVNfTVBVX1FVSVJLKQorCQliYW5rID0gMTsKKwogCS8qCiAJICogVGhlIHJlZ2lzdGVyIGJpdCBuYW1lcyBiZWxvdyBtYXkgbm90IGNvcnJlc3BvbmQgdG8gdGhlCiAJICogYWN0dWFsIG5hbWVzIG9mIHRoZSBiaXRzIGluIGVhY2ggcG93ZXJkb21haW4ncyByZWdpc3RlciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW5zMzR4eC5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbnMzNHh4LmgKaW5kZXggZmQwOWIwOC4uNTg4ZjdlMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbnMzNHh4LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbnMzNHh4LmgKQEAgLTE5MCw2ICsxOTAsNyBAQAogCS53a2RlcF9zcmNzCSAgPSBtcHVfMzR4eF93a2RlcHMsCiAJLnB3cnN0cwkJICA9IFBXUlNUU19PRkZfUkVUX09OLAogCS5wd3JzdHNfbG9naWNfcmV0ID0gUFdSU1RTX09GRl9SRVQsCisJLmZsYWdzCQkgID0gUFdSRE1fSEFTX01QVV9RVUlSSywKIAkuYmFua3MJCSAgPSAxLAogCS5wd3JzdHNfbWVtX3JldAkgID0gewogCQlbMF0gPSBQV1JTVFNfT0ZGX1JFVCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcHJjbS1jb21tb24uaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvcHJjbS1jb21tb24uaAppbmRleCBjYjFhZTg0Li42MWFjMmE0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3ByY20tY29tbW9uLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcmNtLWNvbW1vbi5oCkBAIC00LDEwICs0LDEyIEBACiAvKgogICogT01BUDIvMyBQUkNNIGJhc2UgYW5kIG1vZHVsZSBkZWZpbml0aW9ucwogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IE5va2lhIENvcnBvcmF0aW9uCiAgKgogICogV3JpdHRlbiBieSBQYXVsIFdhbG1zbGV5CisgKiBPTUFQNCBkZWZpbmVzIGluIHRoaXMgZmlsZSBhcmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSB0aGUgT01BUCBoYXJkd2FyZQorICogZGF0YWJhc2VzLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtNDksNiArNTEsNzMgQEAKICNkZWZpbmUgT01BUDM0MzBfTkVPTl9NT0QJCQkJMHhiMDAKICNkZWZpbmUgT01BUDM0MzBFUzJfVVNCSE9TVF9NT0QJCQkJMHhjMDAKIAorI2RlZmluZSBCSVRTKG5fYml0KQlcCisJKCgoMSA8PCBuX2JpdCkgLSAxKSB8ICgxIDw8IG5fYml0KSkKKworI2RlZmluZSBCSVRGSUVMRChsX2JpdCwgdV9iaXQpCVwKKwkoQklUUyh1X2JpdCkgJiB+KChCSVRTKGxfYml0KSkgPj4gMSkpCisKKy8qIE9NQVA0NFhYIHNwZWNpZmljIG1vZHVsZSBvZmZzZXRzICovCisKKy8qIENNMSBpbnN0YW5jZXMgKi8KKworI2RlZmluZSBPTUFQNDQzMF9DTTFfT0NQX1NPQ0tFVF9NT0QJMHgwMDAwCisjZGVmaW5lIE9NQVA0NDMwX0NNMV9DS0dFTl9NT0QJCTB4MDEwMAorI2RlZmluZSBPTUFQNDQzMF9DTTFfTVBVX01PRAkJMHgwMzAwCisjZGVmaW5lIE9NQVA0NDMwX0NNMV9URVNMQV9NT0QJCTB4MDQwMAorI2RlZmluZSBPTUFQNDQzMF9DTTFfQUJFX01PRAkJMHgwNTAwCisjZGVmaW5lIE9NQVA0NDMwX0NNMV9SRVNUT1JFX01PRAkweDBlMDAKKyNkZWZpbmUgT01BUDQ0MzBfQ00xX0lOU1RSX01PRAkJMHgwZjAwCisKKy8qIENNMiBpbnN0YW5jZXMgKi8KKworI2RlZmluZSBPTUFQNDQzMF9DTTJfT0NQX1NPQ0tFVF9NT0QJMHgwMDAwCisjZGVmaW5lIE9NQVA0NDMwX0NNMl9DS0dFTl9NT0QJCTB4MDEwMAorI2RlZmluZSBPTUFQNDQzMF9DTTJfQUxXQVlTX09OX01PRAkweDA2MDAKKyNkZWZpbmUgT01BUDQ0MzBfQ00yX0NPUkVfTU9ECQkweDA3MDAKKyNkZWZpbmUgT01BUDQ0MzBfQ00yX0lWQUhEX01PRAkJMHgwZjAwCisjZGVmaW5lIE9NQVA0NDMwX0NNMl9DQU1fTU9ECQkweDEwMDAKKyNkZWZpbmUgT01BUDQ0MzBfQ00yX0RTU19NT0QJCTB4MTEwMAorI2RlZmluZSBPTUFQNDQzMF9DTTJfR0ZYX01PRAkJMHgxMjAwCisjZGVmaW5lIE9NQVA0NDMwX0NNMl9MM0lOSVRfTU9ECQkweDEzMDAKKyNkZWZpbmUgT01BUDQ0MzBfQ00yX0w0UEVSX01PRAkJMHgxNDAwCisjZGVmaW5lIE9NQVA0NDMwX0NNMl9DRUZVU0VfTU9ECQkweDE2MDAKKyNkZWZpbmUgT01BUDQ0MzBfQ00yX1JFU1RPUkVfTU9ECTB4MWUwMAorI2RlZmluZSBPTUFQNDQzMF9DTTJfSU5TVFJfTU9ECQkweDFmMDAKKworLyogUFJNIGluc3RhbmNlcyAqLworCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9PQ1BfU09DS0VUX01PRAkweDAwMDAKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX0NLR0VOX01PRAkJMHgwMTAwCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9NUFVfTU9ECQkweDAzMDAKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX1RFU0xBX01PRAkJMHgwNDAwCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9BQkVfTU9ECQkweDA1MDAKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX0FMV0FZU19PTl9NT0QJMHgwNjAwCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9DT1JFX01PRAkJMHgwNzAwCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9JVkFIRF9NT0QJCTB4MGYwMAorI2RlZmluZSBPTUFQNDQzMF9QUk1fQ0FNX01PRAkJMHgxMDAwCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9EU1NfTU9ECQkweDExMDAKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX0dGWF9NT0QJCTB4MTIwMAorI2RlZmluZSBPTUFQNDQzMF9QUk1fTDNJTklUX01PRAkJMHgxMzAwCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QJCTB4MTQwMAorI2RlZmluZSBPTUFQNDQzMF9QUk1fQ0VGVVNFX01PRAkJMHgxNjAwCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9XS1VQX01PRAkJMHgxNzAwCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9XS1VQX0NNX01PRAkweDE4MDAKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX0VNVV9NT0QJCTB4MTkwMAorI2RlZmluZSBPTUFQNDQzMF9QUk1fRU1VX0NNX01PRAkJMHgxYTAwCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9ERVZJQ0VfTU9ECQkweDFiMDAKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX0lOU1RSX01PRAkJMHgxZjAwCisKKy8qIFNDUk0gaW5zdGFuY2VzICovCisKKyNkZWZpbmUgT01BUDQ0MzBfU0NSTV9TQ1JNX01PRAkweDAwMDAKKworLyogQ0hJUk9OU1MgaW5zdGFuY2VzICovCisKKyNkZWZpbmUgT01BUDQ0MzBfQ0hJUk9OU1NfQ0hJUk9OU1NfT0NQX1NPQ0tFVF9QUkNNX01PRAkweDAwMDAKKyNkZWZpbmUgT01BUDQ0MzBfQ0hJUk9OU1NfQ0hJUk9OU1NfREVWSUNFX1BSTV9NT0QJMHgwMjAwCisjZGVmaW5lIE9NQVA0NDMwX0NISVJPTlNTX0NISVJPTlNTX0NQVTBfTU9ECQkweDA0MDAKKyNkZWZpbmUgT01BUDQ0MzBfQ0hJUk9OU1NfQ0hJUk9OU1NfQ1BVMV9NT0QJCTB4MDgwMAogCiAvKiAyNFhYIHJlZ2lzdGVyIGJpdHMgc2hhcmVkIGJldHdlZW4gQ00gJiBQUk0gcmVnaXN0ZXJzICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcHJjbS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcmNtLmMKaW5kZXggMDI5ZDM3Ni4uM2VhODE3NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcmNtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcmNtLmMKQEAgLTM0LDYgKzM0LDcgQEAKIAogc3RhdGljIHZvaWQgX19pb21lbSAqcHJtX2Jhc2U7CiBzdGF0aWMgdm9pZCBfX2lvbWVtICpjbV9iYXNlOworc3RhdGljIHZvaWQgX19pb21lbSAqY20yX2Jhc2U7CiAKICNkZWZpbmUgTUFYX01PRFVMRV9FTkFCTEVfV0FJVAkJMTAwMDAwCiAKQEAgLTE3MCwxNCArMTcxLDEyIEBACiB7CiAJcmV0dXJuIF9fb21hcF9wcmNtX3JlYWQocHJtX2Jhc2UsIG1vZHVsZSwgaWR4KTsKIH0KLUVYUE9SVF9TWU1CT0wocHJtX3JlYWRfbW9kX3JlZyk7CiAKIC8qIFdyaXRlIGludG8gYSByZWdpc3RlciBpbiBhIFBSTSBtb2R1bGUgKi8KIHZvaWQgcHJtX3dyaXRlX21vZF9yZWcodTMyIHZhbCwgczE2IG1vZHVsZSwgdTE2IGlkeCkKIHsKIAlfX29tYXBfcHJjbV93cml0ZSh2YWwsIHBybV9iYXNlLCBtb2R1bGUsIGlkeCk7CiB9Ci1FWFBPUlRfU1lNQk9MKHBybV93cml0ZV9tb2RfcmVnKTsKIAogLyogUmVhZC1tb2RpZnktd3JpdGUgYSByZWdpc3RlciBpbiBhIFBSTSBtb2R1bGUuIENhbGxlciBtdXN0IGxvY2sgKi8KIHUzMiBwcm1fcm13X21vZF9yZWdfYml0cyh1MzIgbWFzaywgdTMyIGJpdHMsIHMxNiBtb2R1bGUsIHMxNiBpZHgpCkBAIC0xOTEsMjEgKzE5MCwxOCBAQAogCiAJcmV0dXJuIHY7CiB9Ci1FWFBPUlRfU1lNQk9MKHBybV9ybXdfbW9kX3JlZ19iaXRzKTsKIAogLyogUmVhZCBhIHJlZ2lzdGVyIGluIGEgQ00gbW9kdWxlICovCiB1MzIgY21fcmVhZF9tb2RfcmVnKHMxNiBtb2R1bGUsIHUxNiBpZHgpCiB7CiAJcmV0dXJuIF9fb21hcF9wcmNtX3JlYWQoY21fYmFzZSwgbW9kdWxlLCBpZHgpOwogfQotRVhQT1JUX1NZTUJPTChjbV9yZWFkX21vZF9yZWcpOwogCiAvKiBXcml0ZSBpbnRvIGEgcmVnaXN0ZXIgaW4gYSBDTSBtb2R1bGUgKi8KIHZvaWQgY21fd3JpdGVfbW9kX3JlZyh1MzIgdmFsLCBzMTYgbW9kdWxlLCB1MTYgaWR4KQogewogCV9fb21hcF9wcmNtX3dyaXRlKHZhbCwgY21fYmFzZSwgbW9kdWxlLCBpZHgpOwogfQotRVhQT1JUX1NZTUJPTChjbV93cml0ZV9tb2RfcmVnKTsKIAogLyogUmVhZC1tb2RpZnktd3JpdGUgYSByZWdpc3RlciBpbiBhIENNIG1vZHVsZS4gQ2FsbGVyIG11c3QgbG9jayAqLwogdTMyIGNtX3Jtd19tb2RfcmVnX2JpdHModTMyIG1hc2ssIHUzMiBiaXRzLCBzMTYgbW9kdWxlLCBzMTYgaWR4KQpAQCAtMjE5LDcgKzIxNSw2IEBACiAKIAlyZXR1cm4gdjsKIH0KLUVYUE9SVF9TWU1CT0woY21fcm13X21vZF9yZWdfYml0cyk7CiAKIC8qKgogICogb21hcDJfY21fd2FpdF9pZGxlc3QgLSB3YWl0IGZvciBJRExFU1QgYml0IHRvIGluZGljYXRlIG1vZHVsZSByZWFkaW5lc3MKQEAgLTI0Nyw5ICsyNDIsOCBAQAogCQlCVUcoKTsKIAogCS8qIFdhaXQgZm9yIGxvY2sgKi8KLQl3aGlsZSAoKChfX3Jhd19yZWFkbChyZWcpICYgbWFzaykgIT0gZW5hKSAmJgotCSAgICAgICAoaSsrIDwgTUFYX01PRFVMRV9FTkFCTEVfV0FJVCkpCi0JCXVkZWxheSgxKTsKKwlvbWFwX3Rlc3RfdGltZW91dCgoKF9fcmF3X3JlYWRsKHJlZykgJiBtYXNrKSA9PSBlbmEpLAorCQkJICBNQVhfTU9EVUxFX0VOQUJMRV9XQUlULCBpKTsKIAogCWlmIChpIDwgTUFYX01PRFVMRV9FTkFCTEVfV0FJVCkKIAkJcHJfZGVidWcoImNtOiBNb2R1bGUgYXNzb2NpYXRlZCB3aXRoIGNsb2NrICVzIHJlYWR5IGFmdGVyICVkICIKQEAgLTI2NSw2ICsyNTksNyBAQAogewogCXBybV9iYXNlID0gb21hcDJfZ2xvYmFscy0+cHJtOwogCWNtX2Jhc2UgPSBvbWFwMl9nbG9iYWxzLT5jbTsKKwljbTJfYmFzZSA9IG9tYXAyX2dsb2JhbHMtPmNtMjsKIH0KIAogI2lmZGVmIENPTkZJR19BUkNIX09NQVAzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BybS1yZWdiaXRzLTQ0eHguaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvcHJtLXJlZ2JpdHMtNDR4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMWM4MTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3BybS1yZWdiaXRzLTQ0eHguaApAQCAtMCwwICsxLDIyMDUgQEAKKy8qCisgKiBPTUFQNDR4eCBQb3dlciBNYW5hZ2VtZW50IHJlZ2lzdGVyIGJpdHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIFBhdWwgV2FsbXNsZXkgKHBhdWxAcHdzYW4uY29tKQorICogUmFqZW5kcmEgTmF5YWsgKHJuYXlha0B0aS5jb20pCisgKiBCZW5vaXQgQ291c3NvbiAoYi1jb3Vzc29uQHRpLmNvbSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSB0aGUgT01BUCBoYXJkd2FyZSBkYXRhYmFzZXMuCisgKiBXZSByZXNwZWN0ZnVsbHkgYXNrIHRoYXQgYW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIGJlIGNvb3JkaW5hdGVkCisgKiB3aXRoIHRoZSBwdWJsaWMgbGludXgtb21hcEB2Z2VyLmtlcm5lbC5vcmcgbWFpbGluZyBsaXN0IGFuZCB0aGUKKyAqIGF1dGhvcnMgYWJvdmUgdG8gZW5zdXJlIHRoYXQgdGhlIGF1dG9nZW5lcmF0aW9uIHNjcmlwdHMgYXJlIGtlcHQKKyAqIHVwLXRvLWRhdGUgd2l0aCB0aGUgZmlsZSBjb250ZW50cy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19BUkNIX0FSTV9NQUNIX09NQVAyX1BSTV9SRUdCSVRTXzQ0WFhfSAorI2RlZmluZSBfX0FSQ0hfQVJNX01BQ0hfT01BUDJfUFJNX1JFR0JJVFNfNDRYWF9ICisKKyNpbmNsdWRlICJwcm0uaCIKKworCisvKgorICogVXNlZCBieSBQUk1fTERPX1NSQU1fQ09SRV9TRVRVUCwgUFJNX0xET19TUkFNX0lWQV9TRVRVUCwKKyAqIFBSTV9MRE9fU1JBTV9NUFVfU0VUVVAKKyAqLworI2RlZmluZSBPTUFQNDQzMF9BQkJPRkZfQUNUX0VYUE9SVF9TSElGVAkJCQkoMSA8PCAxKQorI2RlZmluZSBPTUFQNDQzMF9BQkJPRkZfQUNUX0VYUE9SVF9NQVNLCQkJCQlCSVRGSUVMRCgxLCAxKQorCisvKgorICogVXNlZCBieSBQUk1fTERPX1NSQU1fQ09SRV9TRVRVUCwgUFJNX0xET19TUkFNX0lWQV9TRVRVUCwKKyAqIFBSTV9MRE9fU1JBTV9NUFVfU0VUVVAKKyAqLworI2RlZmluZSBPTUFQNDQzMF9BQkJPRkZfU0xFRVBfRVhQT1JUX1NISUZUCQkJCSgxIDw8IDIpCisjZGVmaW5lIE9NQVA0NDMwX0FCQk9GRl9TTEVFUF9FWFBPUlRfTUFTSwkJCQlCSVRGSUVMRCgyLCAyKQorCisvKiBVc2VkIGJ5IFBSTV9JUlFFTkFCTEVfRFVDQVRJLCBQUk1fSVJRRU5BQkxFX01QVSAqLworI2RlZmluZSBPTUFQNDQzMF9BQkJfSVZBX0RPTkVfRU5fU0hJRlQJCQkJCSgxIDw8IDMxKQorI2RlZmluZSBPTUFQNDQzMF9BQkJfSVZBX0RPTkVfRU5fTUFTSwkJCQkJQklURklFTEQoMzEsIDMxKQorCisvKiBVc2VkIGJ5IFBSTV9JUlFTVEFUVVNfRFVDQVRJLCBQUk1fSVJRU1RBVFVTX01QVSAqLworI2RlZmluZSBPTUFQNDQzMF9BQkJfSVZBX0RPTkVfU1RfU0hJRlQJCQkJCSgxIDw8IDMxKQorI2RlZmluZSBPTUFQNDQzMF9BQkJfSVZBX0RPTkVfU1RfTUFTSwkJCQkJQklURklFTEQoMzEsIDMxKQorCisvKiBVc2VkIGJ5IFBSTV9JUlFFTkFCTEVfTVBVXzIgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQUJCX01QVV9ET05FX0VOX1NISUZUCQkJCQkoMSA8PCA3KQorI2RlZmluZSBPTUFQNDQzMF9BQkJfTVBVX0RPTkVfRU5fTUFTSwkJCQkJQklURklFTEQoNywgNykKKworLyogVXNlZCBieSBQUk1fSVJRU1RBVFVTX01QVV8yICovCisjZGVmaW5lIE9NQVA0NDMwX0FCQl9NUFVfRE9ORV9TVF9TSElGVAkJCQkJKDEgPDwgNykKKyNkZWZpbmUgT01BUDQ0MzBfQUJCX01QVV9ET05FX1NUX01BU0sJCQkJCUJJVEZJRUxEKDcsIDcpCisKKy8qIFVzZWQgYnkgUFJNX0xET19BQkJfSVZBX1NFVFVQLCBQUk1fTERPX0FCQl9NUFVfU0VUVVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQUNUSVZFX0ZCQl9TRUxfU0hJRlQJCQkJCSgxIDw8IDIpCisjZGVmaW5lIE9NQVA0NDMwX0FDVElWRV9GQkJfU0VMX01BU0sJCQkJCUJJVEZJRUxEKDIsIDIpCisKKy8qIFVzZWQgYnkgUFJNX0xET19BQkJfSVZBX1NFVFVQLCBQUk1fTERPX0FCQl9NUFVfU0VUVVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQUNUSVZFX1JCQl9TRUxfU0hJRlQJCQkJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVA0NDMwX0FDVElWRV9SQkJfU0VMX01BU0sJCQkJCUJJVEZJRUxEKDEsIDEpCisKKy8qIFVzZWQgYnkgUE1fQUJFX1BXUlNUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9BRVNTTUVNX09OU1RBVEVfU0hJRlQJCQkJCSgxIDw8IDE2KQorI2RlZmluZSBPTUFQNDQzMF9BRVNTTUVNX09OU1RBVEVfTUFTSwkJCQkJQklURklFTEQoMTYsIDE3KQorCisvKiBVc2VkIGJ5IFBNX0FCRV9QV1JTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQUVTU01FTV9SRVRTVEFURV9TSElGVAkJCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfQUVTU01FTV9SRVRTVEFURV9NQVNLCQkJCQlCSVRGSUVMRCg4LCA4KQorCisvKiBVc2VkIGJ5IFBNX0FCRV9QV1JTVFNUICovCisjZGVmaW5lIE9NQVA0NDMwX0FFU1NNRU1fU1RBVEVTVF9TSElGVAkJCQkJKDEgPDwgNCkKKyNkZWZpbmUgT01BUDQ0MzBfQUVTU01FTV9TVEFURVNUX01BU0sJCQkJCUJJVEZJRUxEKDQsIDUpCisKKy8qCisgKiBVc2VkIGJ5IFBSTV9MRE9fU1JBTV9DT1JFX1NFVFVQLCBQUk1fTERPX1NSQU1fSVZBX1NFVFVQLAorICogUFJNX0xET19TUkFNX01QVV9TRVRVUAorICovCisjZGVmaW5lIE9NQVA0NDMwX0FJUE9GRl9TSElGVAkJCQkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX0FJUE9GRl9NQVNLCQkJCQkJQklURklFTEQoOCwgOCkKKworLyogVXNlZCBieSBQUk1fVk9MVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQVVUT19DVFJMX1ZERF9DT1JFX0xfU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfQVVUT19DVFJMX1ZERF9DT1JFX0xfTUFTSwkJCQlCSVRGSUVMRCgwLCAxKQorCisvKiBVc2VkIGJ5IFBSTV9WT0xUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9BVVRPX0NUUkxfVkREX0lWQV9MX1NISUZUCQkJCSgxIDw8IDQpCisjZGVmaW5lIE9NQVA0NDMwX0FVVE9fQ1RSTF9WRERfSVZBX0xfTUFTSwkJCQlCSVRGSUVMRCg0LCA1KQorCisvKiBVc2VkIGJ5IFBSTV9WT0xUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9BVVRPX0NUUkxfVkREX01QVV9MX1NISUZUCQkJCSgxIDw8IDIpCisjZGVmaW5lIE9NQVA0NDMwX0FVVE9fQ1RSTF9WRERfTVBVX0xfTUFTSwkJCQlCSVRGSUVMRCgyLCAzKQorCisvKiBVc2VkIGJ5IFBNX0NBTV9QV1JTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ0FNX01FTV9PTlNUQVRFX1NISUZUCQkJCQkoMSA8PCAxNikKKyNkZWZpbmUgT01BUDQ0MzBfQ0FNX01FTV9PTlNUQVRFX01BU0sJCQkJCUJJVEZJRUxEKDE2LCAxNykKKworLyogVXNlZCBieSBQTV9DQU1fUFdSU1RTVCAqLworI2RlZmluZSBPTUFQNDQzMF9DQU1fTUVNX1NUQVRFU1RfU0hJRlQJCQkJCSgxIDw8IDQpCisjZGVmaW5lIE9NQVA0NDMwX0NBTV9NRU1fU1RBVEVTVF9NQVNLCQkJCQlCSVRGSUVMRCg0LCA1KQorCisvKiBVc2VkIGJ5IFBSTV9DTEtSRVFDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX0NMS1JFUV9DT05EX1NISUZUCQkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9DTEtSRVFfQ09ORF9NQVNLCQkJCQlCSVRGSUVMRCgwLCAyKQorCisvKiBVc2VkIGJ5IFBSTV9WQ19WQUxfU01QU19SQV9DTUQgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ01EUkFfVkREX0NPUkVfTF9TSElGVAkJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01EUkFfVkREX0NPUkVfTF9NQVNLCQkJCQlCSVRGSUVMRCgwLCA3KQorCisvKiBVc2VkIGJ5IFBSTV9WQ19WQUxfU01QU19SQV9DTUQgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ01EUkFfVkREX0lWQV9MX1NISUZUCQkJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9DTURSQV9WRERfSVZBX0xfTUFTSwkJCQkJQklURklFTEQoOCwgMTUpCisKKy8qIFVzZWQgYnkgUFJNX1ZDX1ZBTF9TTVBTX1JBX0NNRCAqLworI2RlZmluZSBPTUFQNDQzMF9DTURSQV9WRERfTVBVX0xfU0hJRlQJCQkJCSgxIDw8IDE2KQorI2RlZmluZSBPTUFQNDQzMF9DTURSQV9WRERfTVBVX0xfTUFTSwkJCQkJQklURklFTEQoMTYsIDIzKQorCisvKiBVc2VkIGJ5IFBSTV9WQ19DRkdfQ0hBTk5FTCAqLworI2RlZmluZSBPTUFQNDQzMF9DTURfVkREX0NPUkVfTF9TSElGVAkJCQkJKDEgPDwgNCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01EX1ZERF9DT1JFX0xfTUFTSwkJCQkJQklURklFTEQoNCwgNCkKKworLyogVXNlZCBieSBQUk1fVkNfQ0ZHX0NIQU5ORUwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ01EX1ZERF9JVkFfTF9TSElGVAkJCQkJKDEgPDwgMTIpCisjZGVmaW5lIE9NQVA0NDMwX0NNRF9WRERfSVZBX0xfTUFTSwkJCQkJQklURklFTEQoMTIsIDEyKQorCisvKiBVc2VkIGJ5IFBSTV9WQ19DRkdfQ0hBTk5FTCAqLworI2RlZmluZSBPTUFQNDQzMF9DTURfVkREX01QVV9MX1NISUZUCQkJCQkoMSA8PCAxNykKKyNkZWZpbmUgT01BUDQ0MzBfQ01EX1ZERF9NUFVfTF9NQVNLCQkJCQlCSVRGSUVMRCgxNywgMTcpCisKKy8qIFVzZWQgYnkgUE1fQ09SRV9QV1JTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ09SRV9PQ01SQU1fT05TVEFURV9TSElGVAkJCQkoMSA8PCAxOCkKKyNkZWZpbmUgT01BUDQ0MzBfQ09SRV9PQ01SQU1fT05TVEFURV9NQVNLCQkJCUJJVEZJRUxEKDE4LCAxOSkKKworLyogVXNlZCBieSBQTV9DT1JFX1BXUlNUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9DT1JFX09DTVJBTV9SRVRTVEFURV9TSElGVAkJCQkoMSA8PCA5KQorI2RlZmluZSBPTUFQNDQzMF9DT1JFX09DTVJBTV9SRVRTVEFURV9NQVNLCQkJCUJJVEZJRUxEKDksIDkpCisKKy8qIFVzZWQgYnkgUE1fQ09SRV9QV1JTVFNUICovCisjZGVmaW5lIE9NQVA0NDMwX0NPUkVfT0NNUkFNX1NUQVRFU1RfU0hJRlQJCQkJKDEgPDwgNikKKyNkZWZpbmUgT01BUDQ0MzBfQ09SRV9PQ01SQU1fU1RBVEVTVF9NQVNLCQkJCUJJVEZJRUxEKDYsIDcpCisKKy8qIFVzZWQgYnkgUE1fQ09SRV9QV1JTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ09SRV9PVEhFUl9CQU5LX09OU1RBVEVfU0hJRlQJCQkJKDEgPDwgMTYpCisjZGVmaW5lIE9NQVA0NDMwX0NPUkVfT1RIRVJfQkFOS19PTlNUQVRFX01BU0sJCQkJQklURklFTEQoMTYsIDE3KQorCisvKiBVc2VkIGJ5IFBNX0NPUkVfUFdSU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX0NPUkVfT1RIRVJfQkFOS19SRVRTVEFURV9TSElGVAkJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9DT1JFX09USEVSX0JBTktfUkVUU1RBVEVfTUFTSwkJCQlCSVRGSUVMRCg4LCA4KQorCisvKiBVc2VkIGJ5IFBNX0NPUkVfUFdSU1RTVCAqLworI2RlZmluZSBPTUFQNDQzMF9DT1JFX09USEVSX0JBTktfU1RBVEVTVF9TSElGVAkJCQkoMSA8PCA0KQorI2RlZmluZSBPTUFQNDQzMF9DT1JFX09USEVSX0JBTktfU1RBVEVTVF9NQVNLCQkJCUJJVEZJRUxEKDQsIDUpCisKKy8qIFVzZWQgYnkgUFJNX1ZDX1ZBTF9CWVBBU1MgKi8KKyNkZWZpbmUgT01BUDQ0MzBfREFUQV9TSElGVAkJCQkJCSgxIDw8IDE2KQorI2RlZmluZSBPTUFQNDQzMF9EQVRBX01BU0sJCQkJCQlCSVRGSUVMRCgxNiwgMjMpCisKKy8qIFVzZWQgYnkgUFJNX0RFVklDRV9PRkZfQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9ERVZJQ0VfT0ZGX0VOQUJMRV9TSElGVAkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9ERVZJQ0VfT0ZGX0VOQUJMRV9NQVNLCQkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IFBSTV9WQ19DRkdfSTJDX01PREUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfREZJTFRFUkVOX1NISUZUCQkJCQkoMSA8PCA2KQorI2RlZmluZSBPTUFQNDQzMF9ERklMVEVSRU5fTUFTSwkJCQkJCUJJVEZJRUxEKDYsIDYpCisKKy8qIFVzZWQgYnkgUFJNX0lSUUVOQUJMRV9NUFUsIFBSTV9JUlFFTkFCTEVfVEVTTEEgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9BQkVfUkVDQUxfRU5fU0hJRlQJCQkJKDEgPDwgNCkKKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9BQkVfUkVDQUxfRU5fTUFTSwkJCQkJQklURklFTEQoNCwgNCkKKworLyogVXNlZCBieSBQUk1fSVJRU1RBVFVTX01QVSwgUFJNX0lSUVNUQVRVU19URVNMQSAqLworI2RlZmluZSBPTUFQNDQzMF9EUExMX0FCRV9SRUNBTF9TVF9TSElGVAkJCQkoMSA8PCA0KQorI2RlZmluZSBPTUFQNDQzMF9EUExMX0FCRV9SRUNBTF9TVF9NQVNLCQkJCQlCSVRGSUVMRCg0LCA0KQorCisvKiBVc2VkIGJ5IFBSTV9JUlFFTkFCTEVfRFVDQVRJLCBQUk1fSVJRRU5BQkxFX01QVSAqLworI2RlZmluZSBPTUFQNDQzMF9EUExMX0NPUkVfUkVDQUxfRU5fU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9DT1JFX1JFQ0FMX0VOX01BU0sJCQkJQklURklFTEQoMCwgMCkKKworLyogVXNlZCBieSBQUk1fSVJRU1RBVFVTX0RVQ0FUSSwgUFJNX0lSUVNUQVRVU19NUFUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9DT1JFX1JFQ0FMX1NUX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfQ09SRV9SRUNBTF9TVF9NQVNLCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUFJNX0lSUUVOQUJMRV9NUFUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9ERFJQSFlfUkVDQUxfRU5fU0hJRlQJCQkJKDEgPDwgNikKKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9ERFJQSFlfUkVDQUxfRU5fTUFTSwkJCQlCSVRGSUVMRCg2LCA2KQorCisvKiBVc2VkIGJ5IFBSTV9JUlFTVEFUVVNfTVBVICovCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfRERSUEhZX1JFQ0FMX1NUX1NISUZUCQkJCSgxIDw8IDYpCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfRERSUEhZX1JFQ0FMX1NUX01BU0sJCQkJQklURklFTEQoNiwgNikKKworLyogVXNlZCBieSBQUk1fSVJRRU5BQkxFX0RVQ0FUSSwgUFJNX0lSUUVOQUJMRV9NUFUsIFBSTV9JUlFFTkFCTEVfVEVTTEEgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9JVkFfUkVDQUxfRU5fU0hJRlQJCQkJKDEgPDwgMikKKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9JVkFfUkVDQUxfRU5fTUFTSwkJCQkJQklURklFTEQoMiwgMikKKworLyogVXNlZCBieSBQUk1fSVJRU1RBVFVTX0RVQ0FUSSwgUFJNX0lSUVNUQVRVU19NUFUsIFBSTV9JUlFTVEFUVVNfVEVTTEEgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9JVkFfUkVDQUxfU1RfU0hJRlQJCQkJKDEgPDwgMikKKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9JVkFfUkVDQUxfU1RfTUFTSwkJCQkJQklURklFTEQoMiwgMikKKworLyogVXNlZCBieSBQUk1fSVJRRU5BQkxFX01QVSAqLworI2RlZmluZSBPTUFQNDQzMF9EUExMX01QVV9SRUNBTF9FTl9TSElGVAkJCQkoMSA8PCAxKQorI2RlZmluZSBPTUFQNDQzMF9EUExMX01QVV9SRUNBTF9FTl9NQVNLCQkJCQlCSVRGSUVMRCgxLCAxKQorCisvKiBVc2VkIGJ5IFBSTV9JUlFTVEFUVVNfTVBVICovCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfTVBVX1JFQ0FMX1NUX1NISUZUCQkJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfTVBVX1JFQ0FMX1NUX01BU0sJCQkJCUJJVEZJRUxEKDEsIDEpCisKKy8qIFVzZWQgYnkgUFJNX0lSUUVOQUJMRV9EVUNBVEksIFBSTV9JUlFFTkFCTEVfTVBVICovCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfUEVSX1JFQ0FMX0VOX1NISUZUCQkJCSgxIDw8IDMpCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfUEVSX1JFQ0FMX0VOX01BU0sJCQkJCUJJVEZJRUxEKDMsIDMpCisKKy8qIFVzZWQgYnkgUFJNX0lSUVNUQVRVU19EVUNBVEksIFBSTV9JUlFTVEFUVVNfTVBVICovCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfUEVSX1JFQ0FMX1NUX1NISUZUCQkJCSgxIDw8IDMpCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfUEVSX1JFQ0FMX1NUX01BU0sJCQkJCUJJVEZJRUxEKDMsIDMpCisKKy8qIFVzZWQgYnkgUFJNX0lSUUVOQUJMRV9EVUNBVEksIFBSTV9JUlFFTkFCTEVfTVBVICovCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfVU5JUFJPX1JFQ0FMX0VOX1NISUZUCQkJCSgxIDw8IDcpCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfVU5JUFJPX1JFQ0FMX0VOX01BU0sJCQkJQklURklFTEQoNywgNykKKworLyogVXNlZCBieSBQUk1fSVJRU1RBVFVTX0RVQ0FUSSwgUFJNX0lSUVNUQVRVU19NUFUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9VTklQUk9fUkVDQUxfU1RfU0hJRlQJCQkJKDEgPDwgNykKKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9VTklQUk9fUkVDQUxfU1RfTUFTSwkJCQlCSVRGSUVMRCg3LCA3KQorCisvKiBVc2VkIGJ5IFBSTV9JUlFFTkFCTEVfTVBVICovCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfVVNCX1JFQ0FMX0VOX1NISUZUCQkJCSgxIDw8IDUpCisjZGVmaW5lIE9NQVA0NDMwX0RQTExfVVNCX1JFQ0FMX0VOX01BU0sJCQkJCUJJVEZJRUxEKDUsIDUpCisKKy8qIFVzZWQgYnkgUFJNX0lSUVNUQVRVU19NUFUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9VU0JfUkVDQUxfU1RfU0hJRlQJCQkJKDEgPDwgNSkKKyNkZWZpbmUgT01BUDQ0MzBfRFBMTF9VU0JfUkVDQUxfU1RfTUFTSwkJCQkJQklURklFTEQoNSwgNSkKKworLyogVXNlZCBieSBQTV9EU1NfUFdSU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX0RTU19NRU1fT05TVEFURV9TSElGVAkJCQkJKDEgPDwgMTYpCisjZGVmaW5lIE9NQVA0NDMwX0RTU19NRU1fT05TVEFURV9NQVNLCQkJCQlCSVRGSUVMRCgxNiwgMTcpCisKKy8qIFVzZWQgYnkgUE1fRFNTX1BXUlNUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9EU1NfTUVNX1JFVFNUQVRFX1NISUZUCQkJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9EU1NfTUVNX1JFVFNUQVRFX01BU0sJCQkJCUJJVEZJRUxEKDgsIDgpCisKKy8qIFVzZWQgYnkgUE1fRFNTX1BXUlNUU1QgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRFNTX01FTV9TVEFURVNUX1NISUZUCQkJCQkoMSA8PCA0KQorI2RlZmluZSBPTUFQNDQzMF9EU1NfTUVNX1NUQVRFU1RfTUFTSwkJCQkJQklURklFTEQoNCwgNSkKKworLyogVXNlZCBieSBQTV9DT1JFX1BXUlNUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9EVUNBVElfTDJSQU1fT05TVEFURV9TSElGVAkJCQkoMSA8PCAyMCkKKyNkZWZpbmUgT01BUDQ0MzBfRFVDQVRJX0wyUkFNX09OU1RBVEVfTUFTSwkJCQlCSVRGSUVMRCgyMCwgMjEpCisKKy8qIFVzZWQgYnkgUE1fQ09SRV9QV1JTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRFVDQVRJX0wyUkFNX1JFVFNUQVRFX1NISUZUCQkJCSgxIDw8IDEwKQorI2RlZmluZSBPTUFQNDQzMF9EVUNBVElfTDJSQU1fUkVUU1RBVEVfTUFTSwkJCQlCSVRGSUVMRCgxMCwgMTApCisKKy8qIFVzZWQgYnkgUE1fQ09SRV9QV1JTVFNUICovCisjZGVmaW5lIE9NQVA0NDMwX0RVQ0FUSV9MMlJBTV9TVEFURVNUX1NISUZUCQkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX0RVQ0FUSV9MMlJBTV9TVEFURVNUX01BU0sJCQkJQklURklFTEQoOCwgOSkKKworLyogVXNlZCBieSBQTV9DT1JFX1BXUlNUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9EVUNBVElfVU5JQ0FDSEVfT05TVEFURV9TSElGVAkJCQkoMSA8PCAyMikKKyNkZWZpbmUgT01BUDQ0MzBfRFVDQVRJX1VOSUNBQ0hFX09OU1RBVEVfTUFTSwkJCQlCSVRGSUVMRCgyMiwgMjMpCisKKy8qIFVzZWQgYnkgUE1fQ09SRV9QV1JTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRFVDQVRJX1VOSUNBQ0hFX1JFVFNUQVRFX1NISUZUCQkJCSgxIDw8IDExKQorI2RlZmluZSBPTUFQNDQzMF9EVUNBVElfVU5JQ0FDSEVfUkVUU1RBVEVfTUFTSwkJCQlCSVRGSUVMRCgxMSwgMTEpCisKKy8qIFVzZWQgYnkgUE1fQ09SRV9QV1JTVFNUICovCisjZGVmaW5lIE9NQVA0NDMwX0RVQ0FUSV9VTklDQUNIRV9TVEFURVNUX1NISUZUCQkJCSgxIDw8IDEwKQorI2RlZmluZSBPTUFQNDQzMF9EVUNBVElfVU5JQ0FDSEVfU1RBVEVTVF9NQVNLCQkJCUJJVEZJRUxEKDEwLCAxMSkKKworLyogVXNlZCBieSBSTV9NUFVfUlNUU1QgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRU1VTEFUSU9OX1JTVF9TSElGVAkJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfRU1VTEFUSU9OX1JTVF9NQVNLCQkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IFJNX0RVQ0FUSV9SU1RTVCAqLworI2RlZmluZSBPTUFQNDQzMF9FTVVMQVRJT05fUlNUMVNUX1NISUZUCQkJCQkoMSA8PCAzKQorI2RlZmluZSBPTUFQNDQzMF9FTVVMQVRJT05fUlNUMVNUX01BU0sJCQkJCUJJVEZJRUxEKDMsIDMpCisKKy8qIFVzZWQgYnkgUk1fRFVDQVRJX1JTVFNUICovCisjZGVmaW5lIE9NQVA0NDMwX0VNVUxBVElPTl9SU1QyU1RfU0hJRlQJCQkJCSgxIDw8IDQpCisjZGVmaW5lIE9NQVA0NDMwX0VNVUxBVElPTl9SU1QyU1RfTUFTSwkJCQkJQklURklFTEQoNCwgNCkKKworLyogVXNlZCBieSBSTV9JVkFIRF9SU1RTVCAqLworI2RlZmluZSBPTUFQNDQzMF9FTVVMQVRJT05fU0VRMV9SU1QxU1RfU0hJRlQJCQkJKDEgPDwgMykKKyNkZWZpbmUgT01BUDQ0MzBfRU1VTEFUSU9OX1NFUTFfUlNUMVNUX01BU0sJCQkJQklURklFTEQoMywgMykKKworLyogVXNlZCBieSBSTV9JVkFIRF9SU1RTVCAqLworI2RlZmluZSBPTUFQNDQzMF9FTVVMQVRJT05fU0VRMl9SU1QyU1RfU0hJRlQJCQkJKDEgPDwgNCkKKyNkZWZpbmUgT01BUDQ0MzBfRU1VTEFUSU9OX1NFUTJfUlNUMlNUX01BU0sJCQkJQklURklFTEQoNCwgNCkKKworLyogVXNlZCBieSBQTV9FTVVfUFdSU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX0VNVV9CQU5LX09OU1RBVEVfU0hJRlQJCQkJCSgxIDw8IDE2KQorI2RlZmluZSBPTUFQNDQzMF9FTVVfQkFOS19PTlNUQVRFX01BU0sJCQkJCUJJVEZJRUxEKDE2LCAxNykKKworLyogVXNlZCBieSBQTV9FTVVfUFdSU1RTVCAqLworI2RlZmluZSBPTUFQNDQzMF9FTVVfQkFOS19TVEFURVNUX1NISUZUCQkJCQkoMSA8PCA0KQorI2RlZmluZSBPTUFQNDQzMF9FTVVfQkFOS19TVEFURVNUX01BU0sJCQkJCUJJVEZJRUxEKDQsIDUpCisKKy8qCisgKiBVc2VkIGJ5IFBSTV9MRE9fU1JBTV9DT1JFX1NFVFVQLCBQUk1fTERPX1NSQU1fSVZBX1NFVFVQLAorICogUFJNX0xET19TUkFNX01QVV9TRVRVUCwgUFJNX1NSQU1fV0tVUF9TRVRVUAorICovCisjZGVmaW5lIE9NQVA0NDMwX0VOQUJMRV9SVEFfRVhQT1JUX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX0VOQUJMRV9SVEFfRVhQT1JUX01BU0sJCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qCisgKiBVc2VkIGJ5IFBSTV9MRE9fU1JBTV9DT1JFX1NFVFVQLCBQUk1fTERPX1NSQU1fSVZBX1NFVFVQLAorICogUFJNX0xET19TUkFNX01QVV9TRVRVUAorICovCisjZGVmaW5lIE9NQVA0NDMwX0VORlVOQzFfU0hJRlQJCQkJCQkoMSA8PCAzKQorI2RlZmluZSBPTUFQNDQzMF9FTkZVTkMxX01BU0sJCQkJCQlCSVRGSUVMRCgzLCAzKQorCisvKgorICogVXNlZCBieSBQUk1fTERPX1NSQU1fQ09SRV9TRVRVUCwgUFJNX0xET19TUkFNX0lWQV9TRVRVUCwKKyAqIFBSTV9MRE9fU1JBTV9NUFVfU0VUVVAKKyAqLworI2RlZmluZSBPTUFQNDQzMF9FTkZVTkMzX1NISUZUCQkJCQkJKDEgPDwgNSkKKyNkZWZpbmUgT01BUDQ0MzBfRU5GVU5DM19NQVNLCQkJCQkJQklURklFTEQoNSwgNSkKKworLyoKKyAqIFVzZWQgYnkgUFJNX0xET19TUkFNX0NPUkVfU0VUVVAsIFBSTV9MRE9fU1JBTV9JVkFfU0VUVVAsCisgKiBQUk1fTERPX1NSQU1fTVBVX1NFVFVQCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRU5GVU5DNF9TSElGVAkJCQkJCSgxIDw8IDYpCisjZGVmaW5lIE9NQVA0NDMwX0VORlVOQzRfTUFTSwkJCQkJCUJJVEZJRUxEKDYsIDYpCisKKy8qCisgKiBVc2VkIGJ5IFBSTV9MRE9fU1JBTV9DT1JFX1NFVFVQLCBQUk1fTERPX1NSQU1fSVZBX1NFVFVQLAorICogUFJNX0xET19TUkFNX01QVV9TRVRVUAorICovCisjZGVmaW5lIE9NQVA0NDMwX0VORlVOQzVfU0hJRlQJCQkJCQkoMSA8PCA3KQorI2RlZmluZSBPTUFQNDQzMF9FTkZVTkM1X01BU0sJCQkJCQlCSVRGSUVMRCg3LCA3KQorCisvKiBVc2VkIGJ5IFBSTV9WUF9DT1JFX0NPTkZJRywgUFJNX1ZQX0lWQV9DT05GSUcsIFBSTV9WUF9NUFVfQ09ORklHICovCisjZGVmaW5lIE9NQVA0NDMwX0VSUk9SR0FJTl9TSElGVAkJCQkJKDEgPDwgMTYpCisjZGVmaW5lIE9NQVA0NDMwX0VSUk9SR0FJTl9NQVNLCQkJCQkJQklURklFTEQoMTYsIDIzKQorCisvKiBVc2VkIGJ5IFBSTV9WUF9DT1JFX0NPTkZJRywgUFJNX1ZQX0lWQV9DT05GSUcsIFBSTV9WUF9NUFVfQ09ORklHICovCisjZGVmaW5lIE9NQVA0NDMwX0VSUk9ST0ZGU0VUX1NISUZUCQkJCQkoMSA8PCAyNCkKKyNkZWZpbmUgT01BUDQ0MzBfRVJST1JPRkZTRVRfTUFTSwkJCQkJQklURklFTEQoMjQsIDMxKQorCisvKiBVc2VkIGJ5IFBSTV9SU1RTVCAqLworI2RlZmluZSBPTUFQNDQzMF9FWFRFUk5BTF9XQVJNX1JTVF9TSElGVAkJCQkoMSA8PCA1KQorI2RlZmluZSBPTUFQNDQzMF9FWFRFUk5BTF9XQVJNX1JTVF9NQVNLCQkJCQlCSVRGSUVMRCg1LCA1KQorCisvKiBVc2VkIGJ5IFBSTV9WUF9DT1JFX0NPTkZJRywgUFJNX1ZQX0lWQV9DT05GSUcsIFBSTV9WUF9NUFVfQ09ORklHICovCisjZGVmaW5lIE9NQVA0NDMwX0ZPUkNFVVBEQVRFX1NISUZUCQkJCQkoMSA8PCAxKQorI2RlZmluZSBPTUFQNDQzMF9GT1JDRVVQREFURV9NQVNLCQkJCQlCSVRGSUVMRCgxLCAxKQorCisvKiBVc2VkIGJ5IFBSTV9WUF9DT1JFX1ZPTFRBR0UsIFBSTV9WUF9JVkFfVk9MVEFHRSwgUFJNX1ZQX01QVV9WT0xUQUdFICovCisjZGVmaW5lIE9NQVA0NDMwX0ZPUkNFVVBEQVRFV0FJVF9TSElGVAkJCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfRk9SQ0VVUERBVEVXQUlUX01BU0sJCQkJCUJJVEZJRUxEKDgsIDMxKQorCisvKiBVc2VkIGJ5IFBSTV9JUlFFTkFCTEVfRFVDQVRJLCBQUk1fSVJRRU5BQkxFX1RFU0xBICovCisjZGVmaW5lIE9NQVA0NDMwX0ZPUkNFV0tVUF9FTl9TSElGVAkJCQkJKDEgPDwgMTApCisjZGVmaW5lIE9NQVA0NDMwX0ZPUkNFV0tVUF9FTl9NQVNLCQkJCQlCSVRGSUVMRCgxMCwgMTApCisKKy8qIFVzZWQgYnkgUFJNX0lSUVNUQVRVU19EVUNBVEksIFBSTV9JUlFTVEFUVVNfVEVTTEEgKi8KKyNkZWZpbmUgT01BUDQ0MzBfRk9SQ0VXS1VQX1NUX1NISUZUCQkJCQkoMSA8PCAxMCkKKyNkZWZpbmUgT01BUDQ0MzBfRk9SQ0VXS1VQX1NUX01BU0sJCQkJCUJJVEZJRUxEKDEwLCAxMCkKKworLyogVXNlZCBieSBQTV9HRlhfUFdSU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX0dGWF9NRU1fT05TVEFURV9TSElGVAkJCQkJKDEgPDwgMTYpCisjZGVmaW5lIE9NQVA0NDMwX0dGWF9NRU1fT05TVEFURV9NQVNLCQkJCQlCSVRGSUVMRCgxNiwgMTcpCisKKy8qIFVzZWQgYnkgUE1fR0ZYX1BXUlNUU1QgKi8KKyNkZWZpbmUgT01BUDQ0MzBfR0ZYX01FTV9TVEFURVNUX1NISUZUCQkJCQkoMSA8PCA0KQorI2RlZmluZSBPTUFQNDQzMF9HRlhfTUVNX1NUQVRFU1RfTUFTSwkJCQkJQklURklFTEQoNCwgNSkKKworLyogVXNlZCBieSBQUk1fUlNUU1QgKi8KKyNkZWZpbmUgT01BUDQ0MzBfR0xPQkFMX0NPTERfUlNUX1NISUZUCQkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9HTE9CQUxfQ09MRF9SU1RfTUFTSwkJCQkJQklURklFTEQoMCwgMCkKKworLyogVXNlZCBieSBQUk1fUlNUU1QgKi8KKyNkZWZpbmUgT01BUDQ0MzBfR0xPQkFMX1dBUk1fU1dfUlNUX1NISUZUCQkJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVA0NDMwX0dMT0JBTF9XQVJNX1NXX1JTVF9NQVNLCQkJCUJJVEZJRUxEKDEsIDEpCisKKy8qIFVzZWQgYnkgUFJNX0lPX1BNQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9HTE9CQUxfV1VFTl9TSElGVAkJCQkJKDEgPDwgMTYpCisjZGVmaW5lIE9NQVA0NDMwX0dMT0JBTF9XVUVOX01BU0sJCQkJCUJJVEZJRUxEKDE2LCAxNikKKworLyogVXNlZCBieSBQUk1fVkNfQ0ZHX0kyQ19NT0RFICovCisjZGVmaW5lIE9NQVA0NDMwX0hTTUNPREVfU0hJRlQJCQkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9IU01DT0RFX01BU0sJCQkJCQlCSVRGSUVMRCgwLCAyKQorCisvKiBVc2VkIGJ5IFBSTV9WQ19DRkdfSTJDX01PREUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfSFNNT0RFRU5fU0hJRlQJCQkJCQkoMSA8PCAzKQorI2RlZmluZSBPTUFQNDQzMF9IU01PREVFTl9NQVNLCQkJCQkJQklURklFTEQoMywgMykKKworLyogVXNlZCBieSBQUk1fVkNfQ0ZHX0kyQ19DTEsgKi8KKyNkZWZpbmUgT01BUDQ0MzBfSFNTQ0xIX1NISUZUCQkJCQkJKDEgPDwgMTYpCisjZGVmaW5lIE9NQVA0NDMwX0hTU0NMSF9NQVNLCQkJCQkJQklURklFTEQoMTYsIDIzKQorCisvKiBVc2VkIGJ5IFBSTV9WQ19DRkdfSTJDX0NMSyAqLworI2RlZmluZSBPTUFQNDQzMF9IU1NDTExfU0hJRlQJCQkJCQkoMSA8PCAyNCkKKyNkZWZpbmUgT01BUDQ0MzBfSFNTQ0xMX01BU0sJCQkJCQlCSVRGSUVMRCgyNCwgMzEpCisKKy8qIFVzZWQgYnkgUE1fSVZBSERfUFdSU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX0hXQV9NRU1fT05TVEFURV9TSElGVAkJCQkJKDEgPDwgMTYpCisjZGVmaW5lIE9NQVA0NDMwX0hXQV9NRU1fT05TVEFURV9NQVNLCQkJCQlCSVRGSUVMRCgxNiwgMTcpCisKKy8qIFVzZWQgYnkgUE1fSVZBSERfUFdSU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX0hXQV9NRU1fUkVUU1RBVEVfU0hJRlQJCQkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX0hXQV9NRU1fUkVUU1RBVEVfTUFTSwkJCQkJQklURklFTEQoOCwgOCkKKworLyogVXNlZCBieSBQTV9JVkFIRF9QV1JTVFNUICovCisjZGVmaW5lIE9NQVA0NDMwX0hXQV9NRU1fU1RBVEVTVF9TSElGVAkJCQkJKDEgPDwgNCkKKyNkZWZpbmUgT01BUDQ0MzBfSFdBX01FTV9TVEFURVNUX01BU0sJCQkJCUJJVEZJRUxEKDQsIDUpCisKKy8qIFVzZWQgYnkgUk1fTVBVX1JTVFNUICovCisjZGVmaW5lIE9NQVA0NDMwX0lDRUNSVVNIRVJfTVBVX1JTVF9TSElGVAkJCQkoMSA8PCAxKQorI2RlZmluZSBPTUFQNDQzMF9JQ0VDUlVTSEVSX01QVV9SU1RfTUFTSwkJCQlCSVRGSUVMRCgxLCAxKQorCisvKiBVc2VkIGJ5IFJNX0RVQ0FUSV9SU1RTVCAqLworI2RlZmluZSBPTUFQNDQzMF9JQ0VDUlVTSEVSX1JTVDFTVF9TSElGVAkJCQkoMSA8PCA1KQorI2RlZmluZSBPTUFQNDQzMF9JQ0VDUlVTSEVSX1JTVDFTVF9NQVNLCQkJCQlCSVRGSUVMRCg1LCA1KQorCisvKiBVc2VkIGJ5IFJNX0RVQ0FUSV9SU1RTVCAqLworI2RlZmluZSBPTUFQNDQzMF9JQ0VDUlVTSEVSX1JTVDJTVF9TSElGVAkJCQkoMSA8PCA2KQorI2RlZmluZSBPTUFQNDQzMF9JQ0VDUlVTSEVSX1JTVDJTVF9NQVNLCQkJCQlCSVRGSUVMRCg2LCA2KQorCisvKiBVc2VkIGJ5IFJNX0lWQUhEX1JTVFNUICovCisjZGVmaW5lIE9NQVA0NDMwX0lDRUNSVVNIRVJfU0VRMV9SU1QxU1RfU0hJRlQJCQkJKDEgPDwgNSkKKyNkZWZpbmUgT01BUDQ0MzBfSUNFQ1JVU0hFUl9TRVExX1JTVDFTVF9NQVNLCQkJCUJJVEZJRUxEKDUsIDUpCisKKy8qIFVzZWQgYnkgUk1fSVZBSERfUlNUU1QgKi8KKyNkZWZpbmUgT01BUDQ0MzBfSUNFQ1JVU0hFUl9TRVEyX1JTVDJTVF9TSElGVAkJCQkoMSA8PCA2KQorI2RlZmluZSBPTUFQNDQzMF9JQ0VDUlVTSEVSX1NFUTJfUlNUMlNUX01BU0sJCQkJQklURklFTEQoNiwgNikKKworLyogVXNlZCBieSBQUk1fUlNUU1QgKi8KKyNkZWZpbmUgT01BUDQ0MzBfSUNFUElDS19SU1RfU0hJRlQJCQkJCSgxIDw8IDkpCisjZGVmaW5lIE9NQVA0NDMwX0lDRVBJQ0tfUlNUX01BU0sJCQkJCUJJVEZJRUxEKDksIDkpCisKKy8qIFVzZWQgYnkgUFJNX1ZQX0NPUkVfQ09ORklHLCBQUk1fVlBfSVZBX0NPTkZJRywgUFJNX1ZQX01QVV9DT05GSUcgKi8KKyNkZWZpbmUgT01BUDQ0MzBfSU5JVFZERF9TSElGVAkJCQkJCSgxIDw8IDIpCisjZGVmaW5lIE9NQVA0NDMwX0lOSVRWRERfTUFTSwkJCQkJCUJJVEZJRUxEKDIsIDIpCisKKy8qIFVzZWQgYnkgUFJNX1ZQX0NPUkVfQ09ORklHLCBQUk1fVlBfSVZBX0NPTkZJRywgUFJNX1ZQX01QVV9DT05GSUcgKi8KKyNkZWZpbmUgT01BUDQ0MzBfSU5JVFZPTFRBR0VfU0hJRlQJCQkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX0lOSVRWT0xUQUdFX01BU0sJCQkJCUJJVEZJRUxEKDgsIDE1KQorCisvKgorICogVXNlZCBieSBQTV9FTVVfUFdSU1RTVCwgUE1fQ09SRV9QV1JTVFNULCBQTV9DQU1fUFdSU1RTVCwgUE1fTDNJTklUX1BXUlNUU1QsCisgKiBQTV9BQkVfUFdSU1RTVCwgUE1fR0ZYX1BXUlNUU1QsIFBNX01QVV9QV1JTVFNULCBQTV9DRUZVU0VfUFdSU1RTVCwKKyAqIFBNX0RTU19QV1JTVFNULCBQTV9MNFBFUl9QV1JTVFNULCBQTV9URVNMQV9QV1JTVFNULCBQTV9JVkFIRF9QV1JTVFNUCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfSU5UUkFOU0lUSU9OX1NISUZUCQkJCQkoMSA8PCAyMCkKKyNkZWZpbmUgT01BUDQ0MzBfSU5UUkFOU0lUSU9OX01BU0sJCQkJCUJJVEZJRUxEKDIwLCAyMCkKKworLyogVXNlZCBieSBQUk1fSVJRRU5BQkxFX0RVQ0FUSSwgUFJNX0lSUUVOQUJMRV9NUFUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfSU9fRU5fU0hJRlQJCQkJCQkoMSA8PCA5KQorI2RlZmluZSBPTUFQNDQzMF9JT19FTl9NQVNLCQkJCQkJQklURklFTEQoOSwgOSkKKworLyogVXNlZCBieSBQUk1fSU9fUE1DVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX0lPX09OX1NUQVRVU19TSElGVAkJCQkJKDEgPDwgNSkKKyNkZWZpbmUgT01BUDQ0MzBfSU9fT05fU1RBVFVTX01BU0sJCQkJCUJJVEZJRUxEKDUsIDUpCisKKy8qIFVzZWQgYnkgUFJNX0lSUVNUQVRVU19EVUNBVEksIFBSTV9JUlFTVEFUVVNfTVBVICovCisjZGVmaW5lIE9NQVA0NDMwX0lPX1NUX1NISUZUCQkJCQkJKDEgPDwgOSkKKyNkZWZpbmUgT01BUDQ0MzBfSU9fU1RfTUFTSwkJCQkJCUJJVEZJRUxEKDksIDkpCisKKy8qIFVzZWQgYnkgUFJNX0lPX1BNQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9JU09DTEtfT1ZFUlJJREVfU0hJRlQJCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX0lTT0NMS19PVkVSUklERV9NQVNLCQkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IFBSTV9JT19QTUNUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfSVNPQ0xLX1NUQVRVU19TSElGVAkJCQkJKDEgPDwgMSkKKyNkZWZpbmUgT01BUDQ0MzBfSVNPQ0xLX1NUQVRVU19NQVNLCQkJCQlCSVRGSUVMRCgxLCAxKQorCisvKiBVc2VkIGJ5IFBSTV9JT19QTUNUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfSVNPT1ZSX0VYVEVORF9TSElGVAkJCQkJKDEgPDwgNCkKKyNkZWZpbmUgT01BUDQ0MzBfSVNPT1ZSX0VYVEVORF9NQVNLCQkJCQlCSVRGSUVMRCg0LCA0KQorCisvKiBVc2VkIGJ5IFBSTV9JT19DT1VOVCAqLworI2RlZmluZSBPTUFQNDQzMF9JU09fMl9PTl9USU1FX1NISUZUCQkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9JU09fMl9PTl9USU1FX01BU0sJCQkJCUJJVEZJRUxEKDAsIDcpCisKKy8qIFVzZWQgYnkgUE1fTDNJTklUX1BXUlNUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9MM0lOSVRfQkFOSzFfT05TVEFURV9TSElGVAkJCQkoMSA8PCAxNikKKyNkZWZpbmUgT01BUDQ0MzBfTDNJTklUX0JBTksxX09OU1RBVEVfTUFTSwkJCQlCSVRGSUVMRCgxNiwgMTcpCisKKy8qIFVzZWQgYnkgUE1fTDNJTklUX1BXUlNUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9MM0lOSVRfQkFOSzFfUkVUU1RBVEVfU0hJRlQJCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfTDNJTklUX0JBTksxX1JFVFNUQVRFX01BU0sJCQkJQklURklFTEQoOCwgOCkKKworLyogVXNlZCBieSBQTV9MM0lOSVRfUFdSU1RTVCAqLworI2RlZmluZSBPTUFQNDQzMF9MM0lOSVRfQkFOSzFfU1RBVEVTVF9TSElGVAkJCQkoMSA8PCA0KQorI2RlZmluZSBPTUFQNDQzMF9MM0lOSVRfQkFOSzFfU1RBVEVTVF9NQVNLCQkJCUJJVEZJRUxEKDQsIDUpCisKKy8qCisgKiBVc2VkIGJ5IFBNX0NPUkVfUFdSU1RDVFJMLCBQTV9MM0lOSVRfUFdSU1RDVFJMLCBQTV9BQkVfUFdSU1RDVFJMLAorICogUE1fTVBVX1BXUlNUQ1RSTCwgUE1fRFNTX1BXUlNUQ1RSTCwgUE1fTDRQRVJfUFdSU1RDVFJMLCBQTV9URVNMQV9QV1JTVENUUkwsCisgKiBQTV9JVkFIRF9QV1JTVENUUkwKKyAqLworI2RlZmluZSBPTUFQNDQzMF9MT0dJQ1JFVFNUQVRFX1NISUZUCQkJCQkoMSA8PCAyKQorI2RlZmluZSBPTUFQNDQzMF9MT0dJQ1JFVFNUQVRFX01BU0sJCQkJCUJJVEZJRUxEKDIsIDIpCisKKy8qCisgKiBVc2VkIGJ5IFBNX0VNVV9QV1JTVFNULCBQTV9DT1JFX1BXUlNUU1QsIFBNX0NBTV9QV1JTVFNULCBQTV9MM0lOSVRfUFdSU1RTVCwKKyAqIFBNX0FCRV9QV1JTVFNULCBQTV9HRlhfUFdSU1RTVCwgUE1fTVBVX1BXUlNUU1QsIFBNX0NFRlVTRV9QV1JTVFNULAorICogUE1fRFNTX1BXUlNUU1QsIFBNX0w0UEVSX1BXUlNUU1QsIFBNX1RFU0xBX1BXUlNUU1QsIFBNX0lWQUhEX1BXUlNUU1QKKyAqLworI2RlZmluZSBPTUFQNDQzMF9MT0dJQ1NUQVRFU1RfU0hJRlQJCQkJCSgxIDw8IDIpCisjZGVmaW5lIE9NQVA0NDMwX0xPR0lDU1RBVEVTVF9NQVNLCQkJCQlCSVRGSUVMRCgyLCAyKQorCisvKgorICogVXNlZCBieSBSTV9XS1VQX0dQSU8xX0NPTlRFWFQsIFJNX1dLVVBfS0VZQk9BUkRfQ09OVEVYVCwKKyAqIFJNX1dLVVBfTDRXS1VQX0NPTlRFWFQsIFJNX1dLVVBfUlRDX0NPTlRFWFQsIFJNX1dLVVBfU0FSUkFNX0NPTlRFWFQsCisgKiBSTV9XS1VQX1NZTkNUSU1FUl9DT05URVhULCBSTV9XS1VQX1RJTUVSMTJfQ09OVEVYVCwgUk1fV0tVUF9USU1FUjFfQ09OVEVYVCwKKyAqIFJNX1dLVVBfVVNJTV9DT05URVhULCBSTV9XS1VQX1dEVDFfQ09OVEVYVCwgUk1fV0tVUF9XRFQyX0NPTlRFWFQsCisgKiBSTV9FTVVfREVCVUdTU19DT05URVhULCBSTV9EMkRfU0FEMkRfQ09OVEVYVCwgUk1fRDJEX1NBRDJEX0ZXX0NPTlRFWFQsCisgKiBSTV9EVUNBVElfRFVDQVRJX0NPTlRFWFQsIFJNX0wzSU5TVFJfTDNfM19DT05URVhULAorICogUk1fTDNJTlNUUl9MM19JTlNUUl9DT05URVhULCBSTV9MM0lOU1RSX09DUF9XUDFfQ09OVEVYVCwKKyAqIFJNX0wzXzFfTDNfMV9DT05URVhULCBSTV9MM18yX0wzXzJfQ09OVEVYVCwgUk1fTDNfMl9PQ01DX1JBTV9DT05URVhULAorICogUk1fTDRDRkdfTDRfQ0ZHX0NPTlRFWFQsIFJNX0w0Q0ZHX1NBUl9ST01fQ09OVEVYVCwgUk1fTUVNSUZfRExMX0NPTlRFWFQsCisgKiBSTV9NRU1JRl9ETExfSF9DT05URVhULCBSTV9NRU1JRl9ETU1fQ09OVEVYVCwgUk1fTUVNSUZfRU1JRl9GV19DT05URVhULAorICogUk1fQ0FNX0ZESUZfQ09OVEVYVCwgUk1fQ0FNX0lTU19DT05URVhULCBSTV9MM0lOSVRfQ0NQVFhfQ09OVEVYVCwKKyAqIFJNX0wzSU5JVF9FTUFDX0NPTlRFWFQsIFJNX0wzSU5JVF9QMTUwMF9DT05URVhULCBSTV9MM0lOSVRfUENJRVNTX0NPTlRFWFQsCisgKiBSTV9MM0lOSVRfU0FUQV9DT05URVhULCBSTV9MM0lOSVRfVFBQU1NfQ09OVEVYVCwgUk1fTDNJTklUX1VOSVBSTzFfQ09OVEVYVCwKKyAqIFJNX0wzSU5JVF9VU0JQSFlPQ1AyU0NQX0NPTlRFWFQsIFJNX0wzSU5JVF9YSFBJX0NPTlRFWFQsCisgKiBSTV9BQkVfQUVTU19DT05URVhULCBSTV9BQkVfRE1JQ19DT05URVhULCBSTV9BQkVfTUNBU1BfQ09OVEVYVCwKKyAqIFJNX0FCRV9NQ0JTUDFfQ09OVEVYVCwgUk1fQUJFX01DQlNQMl9DT05URVhULCBSTV9BQkVfTUNCU1AzX0NPTlRFWFQsCisgKiBSTV9BQkVfUERNX0NPTlRFWFQsIFJNX0FCRV9TTElNQlVTX0NPTlRFWFQsIFJNX0FCRV9USU1FUjVfQ09OVEVYVCwKKyAqIFJNX0FCRV9USU1FUjZfQ09OVEVYVCwgUk1fQUJFX1RJTUVSN19DT05URVhULCBSTV9BQkVfVElNRVI4X0NPTlRFWFQsCisgKiBSTV9BQkVfV0RUM19DT05URVhULCBSTV9HRlhfR0ZYX0NPTlRFWFQsIFJNX01QVV9NUFVfQ09OVEVYVCwKKyAqIFJNX0NFRlVTRV9DRUZVU0VfQ09OVEVYVCwgUk1fQUxXT05fTURNSU5UQ19DT05URVhULAorICogUk1fQUxXT05fU1JfQ09SRV9DT05URVhULCBSTV9BTFdPTl9TUl9JVkFfQ09OVEVYVCwgUk1fQUxXT05fU1JfTVBVX0NPTlRFWFQsCisgKiBSTV9EU1NfREVJU1NfQ09OVEVYVCwgUk1fRFNTX0RTU19DT05URVhULCBSTV9MNFBFUl9BRENfQ09OVEVYVCwKKyAqIFJNX0w0UEVSX0RNVElNRVIxMF9DT05URVhULCBSTV9MNFBFUl9ETVRJTUVSMTFfQ09OVEVYVCwKKyAqIFJNX0w0UEVSX0RNVElNRVIyX0NPTlRFWFQsIFJNX0w0UEVSX0RNVElNRVIzX0NPTlRFWFQsCisgKiBSTV9MNFBFUl9ETVRJTUVSNF9DT05URVhULCBSTV9MNFBFUl9ETVRJTUVSOV9DT05URVhULCBSTV9MNFBFUl9FTE1fQ09OVEVYVCwKKyAqIFJNX0w0UEVSX0hEUTFXX0NPTlRFWFQsIFJNX0w0UEVSX0hFQ0MxX0NPTlRFWFQsIFJNX0w0UEVSX0hFQ0MyX0NPTlRFWFQsCisgKiBSTV9MNFBFUl9JMkMyX0NPTlRFWFQsIFJNX0w0UEVSX0kyQzNfQ09OVEVYVCwgUk1fTDRQRVJfSTJDNF9DT05URVhULAorICogUk1fTDRQRVJfSTJDNV9DT05URVhULCBSTV9MNFBFUl9MNF9QRVJfQ09OVEVYVCwgUk1fTDRQRVJfTUNBU1AyX0NPTlRFWFQsCisgKiBSTV9MNFBFUl9NQ0FTUDNfQ09OVEVYVCwgUk1fTDRQRVJfTUNCU1A0X0NPTlRFWFQsIFJNX0w0UEVSX01DU1BJMV9DT05URVhULAorICogUk1fTDRQRVJfTUNTUEkyX0NPTlRFWFQsIFJNX0w0UEVSX01DU1BJM19DT05URVhULCBSTV9MNFBFUl9NQ1NQSTRfQ09OVEVYVCwKKyAqIFJNX0w0UEVSX01HQVRFX0NPTlRFWFQsIFJNX0w0UEVSX01NQ1NEM19DT05URVhULCBSTV9MNFBFUl9NTUNTRDRfQ09OVEVYVCwKKyAqIFJNX0w0UEVSX01NQ1NENV9DT05URVhULCBSTV9MNFBFUl9NU1BST0hHX0NPTlRFWFQsCisgKiBSTV9MNFBFUl9TTElNQlVTMl9DT05URVhULCBSTV9MNFNFQ19QS0FFSVAyOV9DT05URVhULAorICogUk1fVEVTTEFfVEVTTEFfQ09OVEVYVCwgUk1fSVZBSERfSVZBSERfQ09OVEVYVCwgUk1fSVZBSERfU0wyX0NPTlRFWFQKKyAqLworI2RlZmluZSBPTUFQNDQzMF9MT1NUQ09OVEVYVF9ERkZfU0hJRlQJCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX0xPU1RDT05URVhUX0RGRl9NQVNLCQkJCQlCSVRGSUVMRCgwLCAwKQorCisvKgorICogVXNlZCBieSBSTV9EMkRfTU9ERU1fSUNSX0NPTlRFWFQsIFJNX0QyRF9TQUQyRF9DT05URVhULAorICogUk1fRDJEX1NBRDJEX0ZXX0NPTlRFWFQsIFJNX0RVQ0FUSV9EVUNBVElfQ09OVEVYVCwgUk1fTDNJTlNUUl9MM18zX0NPTlRFWFQsCisgKiBSTV9MM0lOU1RSX09DUF9XUDFfQ09OVEVYVCwgUk1fTDNfMV9MM18xX0NPTlRFWFQsIFJNX0wzXzJfR1BNQ19DT05URVhULAorICogUk1fTDNfMl9MM18yX0NPTlRFWFQsIFJNX0w0Q0ZHX0hXX1NFTV9DT05URVhULCBSTV9MNENGR19MNF9DRkdfQ09OVEVYVCwKKyAqIFJNX0w0Q0ZHX01BSUxCT1hfQ09OVEVYVCwgUk1fTUVNSUZfRE1NX0NPTlRFWFQsIFJNX01FTUlGX0VNSUZfMV9DT05URVhULAorICogUk1fTUVNSUZfRU1JRl8yX0NPTlRFWFQsIFJNX01FTUlGX0VNSUZfRldfQ09OVEVYVCwgUk1fTUVNSUZfRU1JRl9IMV9DT05URVhULAorICogUk1fTUVNSUZfRU1JRl9IMl9DT05URVhULCBSTV9TRE1BX1NETUFfQ09OVEVYVCwgUk1fTDNJTklUX0hTSV9DT05URVhULAorICogUk1fTDNJTklUX01NQzFfQ09OVEVYVCwgUk1fTDNJTklUX01NQzJfQ09OVEVYVCwgUk1fTDNJTklUX01NQzZfQ09OVEVYVCwKKyAqIFJNX0wzSU5JVF9VU0JfSE9TVF9DT05URVhULCBSTV9MM0lOSVRfVVNCX0hPU1RfRlNfQ09OVEVYVCwKKyAqIFJNX0wzSU5JVF9VU0JfT1RHX0NPTlRFWFQsIFJNX0wzSU5JVF9VU0JfVExMX0NPTlRFWFQsIFJNX0RTU19EU1NfQ09OVEVYVCwKKyAqIFJNX0w0UEVSX0dQSU8yX0NPTlRFWFQsIFJNX0w0UEVSX0dQSU8zX0NPTlRFWFQsIFJNX0w0UEVSX0dQSU80X0NPTlRFWFQsCisgKiBSTV9MNFBFUl9HUElPNV9DT05URVhULCBSTV9MNFBFUl9HUElPNl9DT05URVhULCBSTV9MNFBFUl9JMkMxX0NPTlRFWFQsCisgKiBSTV9MNFBFUl9MNF9QRVJfQ09OVEVYVCwgUk1fTDRQRVJfVUFSVDFfQ09OVEVYVCwgUk1fTDRQRVJfVUFSVDJfQ09OVEVYVCwKKyAqIFJNX0w0UEVSX1VBUlQzX0NPTlRFWFQsIFJNX0w0UEVSX1VBUlQ0X0NPTlRFWFQsIFJNX0w0U0VDX0FFUzFfQ09OVEVYVCwKKyAqIFJNX0w0U0VDX0FFUzJfQ09OVEVYVCwgUk1fTDRTRUNfQ1JZUFRPRE1BX0NPTlRFWFQsIFJNX0w0U0VDX0RFUzNERVNfQ09OVEVYVCwKKyAqIFJNX0w0U0VDX1JOR19DT05URVhULCBSTV9MNFNFQ19TSEEyTUQ1MV9DT05URVhULCBSTV9URVNMQV9URVNMQV9DT05URVhUCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfTE9TVENPTlRFWFRfUkZGX1NISUZUCQkJCQkoMSA8PCAxKQorI2RlZmluZSBPTUFQNDQzMF9MT1NUQ09OVEVYVF9SRkZfTUFTSwkJCQkJQklURklFTEQoMSwgMSkKKworLyogVXNlZCBieSBSTV9BQkVfQUVTU19DT05URVhUICovCisjZGVmaW5lIE9NQVA0NDMwX0xPU1RNRU1fQUVTU01FTV9TSElGVAkJCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfTE9TVE1FTV9BRVNTTUVNX01BU0sJCQkJCUJJVEZJRUxEKDgsIDgpCisKKy8qIFVzZWQgYnkgUk1fQ0FNX0ZESUZfQ09OVEVYVCwgUk1fQ0FNX0lTU19DT05URVhUICovCisjZGVmaW5lIE9NQVA0NDMwX0xPU1RNRU1fQ0FNX01FTV9TSElGVAkJCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfTE9TVE1FTV9DQU1fTUVNX01BU0sJCQkJCUJJVEZJRUxEKDgsIDgpCisKKy8qIFVzZWQgYnkgUk1fTDNJTlNUUl9PQ1BfV1AxX0NPTlRFWFQgKi8KKyNkZWZpbmUgT01BUDQ0MzBfTE9TVE1FTV9DT1JFX05SRVRfQkFOS19TSElGVAkJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9MT1NUTUVNX0NPUkVfTlJFVF9CQU5LX01BU0sJCQkJQklURklFTEQoOCwgOCkKKworLyogUmVuYW1lZCBmcm9tIExPU1RNRU1fQ09SRV9OUkVUX0JBTksgVXNlZCBieSBSTV9NRU1JRl9ETU1fQ09OVEVYVCAqLworI2RlZmluZSBPTUFQNDQzMF9MT1NUTUVNX0NPUkVfTlJFVF9CQU5LXzlfOV9TSElGVAkJCSgxIDw8IDkpCisjZGVmaW5lIE9NQVA0NDMwX0xPU1RNRU1fQ09SRV9OUkVUX0JBTktfOV85X01BU0sJCQlCSVRGSUVMRCg5LCA5KQorCisvKiBVc2VkIGJ5IFJNX0wzXzJfT0NNQ19SQU1fQ09OVEVYVCAqLworI2RlZmluZSBPTUFQNDQzMF9MT1NUTUVNX0NPUkVfT0NNUkFNX1NISUZUCQkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX0xPU1RNRU1fQ09SRV9PQ01SQU1fTUFTSwkJCQlCSVRGSUVMRCg4LCA4KQorCisvKgorICogVXNlZCBieSBSTV9EMkRfTU9ERU1fSUNSX0NPTlRFWFQsIFJNX01FTUlGX0RNTV9DT05URVhULAorICogUk1fU0RNQV9TRE1BX0NPTlRFWFQKKyAqLworI2RlZmluZSBPTUFQNDQzMF9MT1NUTUVNX0NPUkVfT1RIRVJfQkFOS19TSElGVAkJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9MT1NUTUVNX0NPUkVfT1RIRVJfQkFOS19NQVNLCQkJCUJJVEZJRUxEKDgsIDgpCisKKy8qIFVzZWQgYnkgUk1fRFNTX0RFSVNTX0NPTlRFWFQsIFJNX0RTU19EU1NfQ09OVEVYVCAqLworI2RlZmluZSBPTUFQNDQzMF9MT1NUTUVNX0RTU19NRU1fU0hJRlQJCQkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX0xPU1RNRU1fRFNTX01FTV9NQVNLCQkJCQlCSVRGSUVMRCg4LCA4KQorCisvKiBVc2VkIGJ5IFJNX0RVQ0FUSV9EVUNBVElfQ09OVEVYVCAqLworI2RlZmluZSBPTUFQNDQzMF9MT1NUTUVNX0RVQ0FUSV9MMlJBTV9TSElGVAkJCQkoMSA8PCA5KQorI2RlZmluZSBPTUFQNDQzMF9MT1NUTUVNX0RVQ0FUSV9MMlJBTV9NQVNLCQkJCUJJVEZJRUxEKDksIDkpCisKKy8qIFVzZWQgYnkgUk1fRFVDQVRJX0RVQ0FUSV9DT05URVhUICovCisjZGVmaW5lIE9NQVA0NDMwX0xPU1RNRU1fRFVDQVRJX1VOSUNBQ0hFX1NISUZUCQkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX0xPU1RNRU1fRFVDQVRJX1VOSUNBQ0hFX01BU0sJCQkJQklURklFTEQoOCwgOCkKKworLyogVXNlZCBieSBSTV9FTVVfREVCVUdTU19DT05URVhUICovCisjZGVmaW5lIE9NQVA0NDMwX0xPU1RNRU1fRU1VX0JBTktfU0hJRlQJCQkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX0xPU1RNRU1fRU1VX0JBTktfTUFTSwkJCQkJQklURklFTEQoOCwgOCkKKworLyogVXNlZCBieSBSTV9HRlhfR0ZYX0NPTlRFWFQgKi8KKyNkZWZpbmUgT01BUDQ0MzBfTE9TVE1FTV9HRlhfTUVNX1NISUZUCQkJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9MT1NUTUVNX0dGWF9NRU1fTUFTSwkJCQkJQklURklFTEQoOCwgOCkKKworLyogVXNlZCBieSBSTV9JVkFIRF9JVkFIRF9DT05URVhUICovCisjZGVmaW5lIE9NQVA0NDMwX0xPU1RNRU1fSFdBX01FTV9TSElGVAkJCQkJKDEgPDwgMTApCisjZGVmaW5lIE9NQVA0NDMwX0xPU1RNRU1fSFdBX01FTV9NQVNLCQkJCQlCSVRGSUVMRCgxMCwgMTApCisKKy8qCisgKiBVc2VkIGJ5IFJNX0wzSU5JVF9DQ1BUWF9DT05URVhULCBSTV9MM0lOSVRfRU1BQ19DT05URVhULAorICogUk1fTDNJTklUX0hTSV9DT05URVhULCBSTV9MM0lOSVRfTU1DMV9DT05URVhULCBSTV9MM0lOSVRfTU1DMl9DT05URVhULAorICogUk1fTDNJTklUX01NQzZfQ09OVEVYVCwgUk1fTDNJTklUX1BDSUVTU19DT05URVhULCBSTV9MM0lOSVRfU0FUQV9DT05URVhULAorICogUk1fTDNJTklUX1RQUFNTX0NPTlRFWFQsIFJNX0wzSU5JVF9VTklQUk8xX0NPTlRFWFQsCisgKiBSTV9MM0lOSVRfVVNCX09UR19DT05URVhULCBSTV9MM0lOSVRfWEhQSV9DT05URVhUCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfTE9TVE1FTV9MM0lOSVRfQkFOSzFfU0hJRlQJCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfTE9TVE1FTV9MM0lOSVRfQkFOSzFfTUFTSwkJCQlCSVRGSUVMRCg4LCA4KQorCisvKiBVc2VkIGJ5IFJNX01QVV9NUFVfQ09OVEVYVCAqLworI2RlZmluZSBPTUFQNDQzMF9MT1NUTUVNX01QVV9MMV9TSElGVAkJCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfTE9TVE1FTV9NUFVfTDFfTUFTSwkJCQkJQklURklFTEQoOCwgOCkKKworLyogVXNlZCBieSBSTV9NUFVfTVBVX0NPTlRFWFQgKi8KKyNkZWZpbmUgT01BUDQ0MzBfTE9TVE1FTV9NUFVfTDJfU0hJRlQJCQkJCSgxIDw8IDkpCisjZGVmaW5lIE9NQVA0NDMwX0xPU1RNRU1fTVBVX0wyX01BU0sJCQkJCUJJVEZJRUxEKDksIDkpCisKKy8qIFVzZWQgYnkgUk1fTVBVX01QVV9DT05URVhUICovCisjZGVmaW5lIE9NQVA0NDMwX0xPU1RNRU1fTVBVX1JBTV9TSElGVAkJCQkJKDEgPDwgMTApCisjZGVmaW5lIE9NQVA0NDMwX0xPU1RNRU1fTVBVX1JBTV9NQVNLCQkJCQlCSVRGSUVMRCgxMCwgMTApCisKKy8qCisgKiBVc2VkIGJ5IFJNX0w0UEVSX0hFQ0MxX0NPTlRFWFQsIFJNX0w0UEVSX0hFQ0MyX0NPTlRFWFQsCisgKiBSTV9MNFBFUl9NQ0JTUDRfQ09OVEVYVCwgUk1fTDRQRVJfTU1DU0QzX0NPTlRFWFQsIFJNX0w0UEVSX01NQ1NENF9DT05URVhULAorICogUk1fTDRQRVJfTU1DU0Q1X0NPTlRFWFQsIFJNX0w0UEVSX1NMSU1CVVMyX0NPTlRFWFQsIFJNX0w0U0VDX1BLQUVJUDI5X0NPTlRFWFQKKyAqLworI2RlZmluZSBPTUFQNDQzMF9MT1NUTUVNX05PTlJFVEFJTkVEX0JBTktfU0hJRlQJCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfTE9TVE1FTV9OT05SRVRBSU5FRF9CQU5LX01BU0sJCQkJQklURklFTEQoOCwgOCkKKworLyoKKyAqIFVzZWQgYnkgUk1fQUJFX0RNSUNfQ09OVEVYVCwgUk1fQUJFX01DQlNQMV9DT05URVhULCBSTV9BQkVfTUNCU1AyX0NPTlRFWFQsCisgKiBSTV9BQkVfTUNCU1AzX0NPTlRFWFQsIFJNX0FCRV9QRE1fQ09OVEVYVCwgUk1fQUJFX1NMSU1CVVNfQ09OVEVYVAorICovCisjZGVmaW5lIE9NQVA0NDMwX0xPU1RNRU1fUEVSSUhQTUVNX1NISUZUCQkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX0xPU1RNRU1fUEVSSUhQTUVNX01BU0sJCQkJCUJJVEZJRUxEKDgsIDgpCisKKy8qCisgKiBVc2VkIGJ5IFJNX0w0UEVSX01TUFJPSEdfQ09OVEVYVCwgUk1fTDRQRVJfVUFSVDFfQ09OVEVYVCwKKyAqIFJNX0w0UEVSX1VBUlQyX0NPTlRFWFQsIFJNX0w0UEVSX1VBUlQzX0NPTlRFWFQsIFJNX0w0UEVSX1VBUlQ0X0NPTlRFWFQsCisgKiBSTV9MNFNFQ19DUllQVE9ETUFfQ09OVEVYVAorICovCisjZGVmaW5lIE9NQVA0NDMwX0xPU1RNRU1fUkVUQUlORURfQkFOS19TSElGVAkJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9MT1NUTUVNX1JFVEFJTkVEX0JBTktfTUFTSwkJCQlCSVRGSUVMRCg4LCA4KQorCisvKiBVc2VkIGJ5IFJNX0lWQUhEX1NMMl9DT05URVhUICovCisjZGVmaW5lIE9NQVA0NDMwX0xPU1RNRU1fU0wyX01FTV9TSElGVAkJCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfTE9TVE1FTV9TTDJfTUVNX01BU0sJCQkJCUJJVEZJRUxEKDgsIDgpCisKKy8qIFVzZWQgYnkgUk1fSVZBSERfSVZBSERfQ09OVEVYVCAqLworI2RlZmluZSBPTUFQNDQzMF9MT1NUTUVNX1RDTTFfTUVNX1NISUZUCQkJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9MT1NUTUVNX1RDTTFfTUVNX01BU0sJCQkJCUJJVEZJRUxEKDgsIDgpCisKKy8qIFVzZWQgYnkgUk1fSVZBSERfSVZBSERfQ09OVEVYVCAqLworI2RlZmluZSBPTUFQNDQzMF9MT1NUTUVNX1RDTTJfTUVNX1NISUZUCQkJCQkoMSA8PCA5KQorI2RlZmluZSBPTUFQNDQzMF9MT1NUTUVNX1RDTTJfTUVNX01BU0sJCQkJCUJJVEZJRUxEKDksIDkpCisKKy8qIFVzZWQgYnkgUk1fVEVTTEFfVEVTTEFfQ09OVEVYVCAqLworI2RlZmluZSBPTUFQNDQzMF9MT1NUTUVNX1RFU0xBX0VETUFfU0hJRlQJCQkJKDEgPDwgMTApCisjZGVmaW5lIE9NQVA0NDMwX0xPU1RNRU1fVEVTTEFfRURNQV9NQVNLCQkJCUJJVEZJRUxEKDEwLCAxMCkKKworLyogVXNlZCBieSBSTV9URVNMQV9URVNMQV9DT05URVhUICovCisjZGVmaW5lIE9NQVA0NDMwX0xPU1RNRU1fVEVTTEFfTDFfU0hJRlQJCQkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX0xPU1RNRU1fVEVTTEFfTDFfTUFTSwkJCQkJQklURklFTEQoOCwgOCkKKworLyogVXNlZCBieSBSTV9URVNMQV9URVNMQV9DT05URVhUICovCisjZGVmaW5lIE9NQVA0NDMwX0xPU1RNRU1fVEVTTEFfTDJfU0hJRlQJCQkJCSgxIDw8IDkpCisjZGVmaW5lIE9NQVA0NDMwX0xPU1RNRU1fVEVTTEFfTDJfTUFTSwkJCQkJQklURklFTEQoOSwgOSkKKworLyogVXNlZCBieSBSTV9XS1VQX1NBUlJBTV9DT05URVhUICovCisjZGVmaW5lIE9NQVA0NDMwX0xPU1RNRU1fV0tVUF9CQU5LX1NISUZUCQkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX0xPU1RNRU1fV0tVUF9CQU5LX01BU0sJCQkJCUJJVEZJRUxEKDgsIDgpCisKKy8qCisgKiBVc2VkIGJ5IFBNX0NPUkVfUFdSU1RDVFJMLCBQTV9DQU1fUFdSU1RDVFJMLCBQTV9MM0lOSVRfUFdSU1RDVFJMLAorICogUE1fQUJFX1BXUlNUQ1RSTCwgUE1fR0ZYX1BXUlNUQ1RSTCwgUE1fTVBVX1BXUlNUQ1RSTCwgUE1fQ0VGVVNFX1BXUlNUQ1RSTCwKKyAqIFBNX0RTU19QV1JTVENUUkwsIFBNX0w0UEVSX1BXUlNUQ1RSTCwgUE1fVEVTTEFfUFdSU1RDVFJMLCBQTV9JVkFIRF9QV1JTVENUUkwKKyAqLworI2RlZmluZSBPTUFQNDQzMF9MT1dQT1dFUlNUQVRFQ0hBTkdFX1NISUZUCQkJCSgxIDw8IDQpCisjZGVmaW5lIE9NQVA0NDMwX0xPV1BPV0VSU1RBVEVDSEFOR0VfTUFTSwkJCQlCSVRGSUVMRCg0LCA0KQorCisvKiBVc2VkIGJ5IFBNX0NPUkVfUFdSU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX01FTU9SWUNIQU5HRV9TSElGVAkJCQkJKDEgPDwgMykKKyNkZWZpbmUgT01BUDQ0MzBfTUVNT1JZQ0hBTkdFX01BU0sJCQkJCUJJVEZJRUxEKDMsIDMpCisKKy8qIFVzZWQgYnkgUFJNX01PREVNX0lGX0NUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfTU9ERU1fUkVBRFlfU0hJRlQJCQkJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVA0NDMwX01PREVNX1JFQURZX01BU0sJCQkJCUJJVEZJRUxEKDEsIDEpCisKKy8qIFVzZWQgYnkgUFJNX01PREVNX0lGX0NUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfTU9ERU1fU0hVVERPV05fSVJRX1NISUZUCQkJCSgxIDw8IDkpCisjZGVmaW5lIE9NQVA0NDMwX01PREVNX1NIVVRET1dOX0lSUV9NQVNLCQkJCUJJVEZJRUxEKDksIDkpCisKKy8qIFVzZWQgYnkgUFJNX01PREVNX0lGX0NUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfTU9ERU1fU0xFRVBfU1RfU0hJRlQJCQkJCSgxIDw8IDE2KQorI2RlZmluZSBPTUFQNDQzMF9NT0RFTV9TTEVFUF9TVF9NQVNLCQkJCQlCSVRGSUVMRCgxNiwgMTYpCisKKy8qIFVzZWQgYnkgUFJNX01PREVNX0lGX0NUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfTU9ERU1fV0FLRV9JUlFfU0hJRlQJCQkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX01PREVNX1dBS0VfSVJRX01BU0sJCQkJCUJJVEZJRUxEKDgsIDgpCisKKy8qIFVzZWQgYnkgUE1fTVBVX1BXUlNUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9NUFVfTDFfT05TVEFURV9TSElGVAkJCQkJKDEgPDwgMTYpCisjZGVmaW5lIE9NQVA0NDMwX01QVV9MMV9PTlNUQVRFX01BU0sJCQkJCUJJVEZJRUxEKDE2LCAxNykKKworLyogVXNlZCBieSBQTV9NUFVfUFdSU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX01QVV9MMV9SRVRTVEFURV9TSElGVAkJCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfTVBVX0wxX1JFVFNUQVRFX01BU0sJCQkJCUJJVEZJRUxEKDgsIDgpCisKKy8qIFVzZWQgYnkgUE1fTVBVX1BXUlNUU1QgKi8KKyNkZWZpbmUgT01BUDQ0MzBfTVBVX0wxX1NUQVRFU1RfU0hJRlQJCQkJCSgxIDw8IDQpCisjZGVmaW5lIE9NQVA0NDMwX01QVV9MMV9TVEFURVNUX01BU0sJCQkJCUJJVEZJRUxEKDQsIDUpCisKKy8qIFVzZWQgYnkgUE1fTVBVX1BXUlNUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9NUFVfTDJfT05TVEFURV9TSElGVAkJCQkJKDEgPDwgMTgpCisjZGVmaW5lIE9NQVA0NDMwX01QVV9MMl9PTlNUQVRFX01BU0sJCQkJCUJJVEZJRUxEKDE4LCAxOSkKKworLyogVXNlZCBieSBQTV9NUFVfUFdSU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX01QVV9MMl9SRVRTVEFURV9TSElGVAkJCQkJKDEgPDwgOSkKKyNkZWZpbmUgT01BUDQ0MzBfTVBVX0wyX1JFVFNUQVRFX01BU0sJCQkJCUJJVEZJRUxEKDksIDkpCisKKy8qIFVzZWQgYnkgUE1fTVBVX1BXUlNUU1QgKi8KKyNkZWZpbmUgT01BUDQ0MzBfTVBVX0wyX1NUQVRFU1RfU0hJRlQJCQkJCSgxIDw8IDYpCisjZGVmaW5lIE9NQVA0NDMwX01QVV9MMl9TVEFURVNUX01BU0sJCQkJCUJJVEZJRUxEKDYsIDcpCisKKy8qIFVzZWQgYnkgUE1fTVBVX1BXUlNUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9NUFVfUkFNX09OU1RBVEVfU0hJRlQJCQkJCSgxIDw8IDIwKQorI2RlZmluZSBPTUFQNDQzMF9NUFVfUkFNX09OU1RBVEVfTUFTSwkJCQkJQklURklFTEQoMjAsIDIxKQorCisvKiBVc2VkIGJ5IFBNX01QVV9QV1JTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfTVBVX1JBTV9SRVRTVEFURV9TSElGVAkJCQkJKDEgPDwgMTApCisjZGVmaW5lIE9NQVA0NDMwX01QVV9SQU1fUkVUU1RBVEVfTUFTSwkJCQkJQklURklFTEQoMTAsIDEwKQorCisvKiBVc2VkIGJ5IFBNX01QVV9QV1JTVFNUICovCisjZGVmaW5lIE9NQVA0NDMwX01QVV9SQU1fU1RBVEVTVF9TSElGVAkJCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfTVBVX1JBTV9TVEFURVNUX01BU0sJCQkJCUJJVEZJRUxEKDgsIDkpCisKKy8qIFVzZWQgYnkgUFJNX1JTVFNUICovCisjZGVmaW5lIE9NQVA0NDMwX01QVV9TRUNVUklUWV9WSU9MX1JTVF9TSElGVAkJCQkoMSA8PCAyKQorI2RlZmluZSBPTUFQNDQzMF9NUFVfU0VDVVJJVFlfVklPTF9SU1RfTUFTSwkJCQlCSVRGSUVMRCgyLCAyKQorCisvKiBVc2VkIGJ5IFBSTV9SU1RTVCAqLworI2RlZmluZSBPTUFQNDQzMF9NUFVfV0RUX1JTVF9TSElGVAkJCQkJKDEgPDwgMykKKyNkZWZpbmUgT01BUDQ0MzBfTVBVX1dEVF9SU1RfTUFTSwkJCQkJQklURklFTEQoMywgMykKKworLyogVXNlZCBieSBQTV9MNFBFUl9QV1JTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfTk9OUkVUQUlORURfQkFOS19PTlNUQVRFX1NISUZUCQkJCSgxIDw8IDE4KQorI2RlZmluZSBPTUFQNDQzMF9OT05SRVRBSU5FRF9CQU5LX09OU1RBVEVfTUFTSwkJCQlCSVRGSUVMRCgxOCwgMTkpCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfUFdSU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX05PTlJFVEFJTkVEX0JBTktfUkVUU1RBVEVfU0hJRlQJCQkoMSA8PCA5KQorI2RlZmluZSBPTUFQNDQzMF9OT05SRVRBSU5FRF9CQU5LX1JFVFNUQVRFX01BU0sJCQkJQklURklFTEQoOSwgOSkKKworLyogVXNlZCBieSBQTV9MNFBFUl9QV1JTVFNUICovCisjZGVmaW5lIE9NQVA0NDMwX05PTlJFVEFJTkVEX0JBTktfU1RBVEVTVF9TSElGVAkJCQkoMSA8PCA2KQorI2RlZmluZSBPTUFQNDQzMF9OT05SRVRBSU5FRF9CQU5LX1NUQVRFU1RfTUFTSwkJCQlCSVRGSUVMRCg2LCA3KQorCisvKiBVc2VkIGJ5IFBNX0NPUkVfUFdSU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX09DUF9OUkVUX0JBTktfT05TVEFURV9TSElGVAkJCQkoMSA8PCAyNCkKKyNkZWZpbmUgT01BUDQ0MzBfT0NQX05SRVRfQkFOS19PTlNUQVRFX01BU0sJCQkJQklURklFTEQoMjQsIDI1KQorCisvKiBVc2VkIGJ5IFBNX0NPUkVfUFdSU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX09DUF9OUkVUX0JBTktfUkVUU1RBVEVfU0hJRlQJCQkJKDEgPDwgMTIpCisjZGVmaW5lIE9NQVA0NDMwX09DUF9OUkVUX0JBTktfUkVUU1RBVEVfTUFTSwkJCQlCSVRGSUVMRCgxMiwgMTIpCisKKy8qIFVzZWQgYnkgUE1fQ09SRV9QV1JTVFNUICovCisjZGVmaW5lIE9NQVA0NDMwX09DUF9OUkVUX0JBTktfU1RBVEVTVF9TSElGVAkJCQkoMSA8PCAxMikKKyNkZWZpbmUgT01BUDQ0MzBfT0NQX05SRVRfQkFOS19TVEFURVNUX01BU0sJCQkJQklURklFTEQoMTIsIDEzKQorCisvKgorICogVXNlZCBieSBQUk1fVkNfVkFMX0NNRF9WRERfQ09SRV9MLCBQUk1fVkNfVkFMX0NNRF9WRERfSVZBX0wsCisgKiBQUk1fVkNfVkFMX0NNRF9WRERfTVBVX0wKKyAqLworI2RlZmluZSBPTUFQNDQzMF9PRkZfU0hJRlQJCQkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9PRkZfTUFTSwkJCQkJCUJJVEZJRUxEKDAsIDcpCisKKy8qIFVzZWQgYnkgUFJNX0xET19CQU5ER0FQX0NUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfT0ZGX0VOQUJMRV9TSElGVAkJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfT0ZGX0VOQUJMRV9NQVNLCQkJCQlCSVRGSUVMRCgwLCAwKQorCisvKgorICogVXNlZCBieSBQUk1fVkNfVkFMX0NNRF9WRERfQ09SRV9MLCBQUk1fVkNfVkFMX0NNRF9WRERfSVZBX0wsCisgKiBQUk1fVkNfVkFMX0NNRF9WRERfTVBVX0wKKyAqLworI2RlZmluZSBPTUFQNDQzMF9PTl9TSElGVAkJCQkJCSgxIDw8IDI0KQorI2RlZmluZSBPTUFQNDQzMF9PTl9NQVNLCQkJCQkJQklURklFTEQoMjQsIDMxKQorCisvKgorICogVXNlZCBieSBQUk1fVkNfVkFMX0NNRF9WRERfQ09SRV9MLCBQUk1fVkNfVkFMX0NNRF9WRERfSVZBX0wsCisgKiBQUk1fVkNfVkFMX0NNRF9WRERfTVBVX0wKKyAqLworI2RlZmluZSBPTUFQNDQzMF9PTkxQX1NISUZUCQkJCQkJKDEgPDwgMTYpCisjZGVmaW5lIE9NQVA0NDMwX09OTFBfTUFTSwkJCQkJCUJJVEZJRUxEKDE2LCAyMykKKworLyogVXNlZCBieSBQUk1fTERPX0FCQl9JVkFfQ1RSTCwgUFJNX0xET19BQkJfTVBVX0NUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfT1BQX0NIQU5HRV9TSElGVAkJCQkJKDEgPDwgMikKKyNkZWZpbmUgT01BUDQ0MzBfT1BQX0NIQU5HRV9NQVNLCQkJCQlCSVRGSUVMRCgyLCAyKQorCisvKiBVc2VkIGJ5IFBSTV9MRE9fQUJCX0lWQV9DVFJMLCBQUk1fTERPX0FCQl9NUFVfQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9PUFBfU0VMX1NISUZUCQkJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfT1BQX1NFTF9NQVNLCQkJCQkJQklURklFTEQoMCwgMSkKKworLyogVXNlZCBieSBQUk1fU1JBTV9DT1VOVCAqLworI2RlZmluZSBPTUFQNDQzMF9QQ0hBUkdFQ05UX1ZBTFVFX1NISUZUCQkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9QQ0hBUkdFQ05UX1ZBTFVFX01BU0sJCQkJCUJJVEZJRUxEKDAsIDUpCisKKy8qIFVzZWQgYnkgUFJNX1BTQ09OX0NPVU5UICovCisjZGVmaW5lIE9NQVA0NDMwX1BDSEFSR0VfVElNRV9TSElGVAkJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfUENIQVJHRV9USU1FX01BU0sJCQkJCUJJVEZJRUxEKDAsIDcpCisKKy8qIFVzZWQgYnkgUE1fQUJFX1BXUlNUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9QRVJJUEhNRU1fT05TVEFURV9TSElGVAkJCQkoMSA8PCAyMCkKKyNkZWZpbmUgT01BUDQ0MzBfUEVSSVBITUVNX09OU1RBVEVfTUFTSwkJCQkJQklURklFTEQoMjAsIDIxKQorCisvKiBVc2VkIGJ5IFBNX0FCRV9QV1JTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUEVSSVBITUVNX1JFVFNUQVRFX1NISUZUCQkJCSgxIDw8IDEwKQorI2RlZmluZSBPTUFQNDQzMF9QRVJJUEhNRU1fUkVUU1RBVEVfTUFTSwkJCQlCSVRGSUVMRCgxMCwgMTApCisKKy8qIFVzZWQgYnkgUE1fQUJFX1BXUlNUU1QgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUEVSSVBITUVNX1NUQVRFU1RfU0hJRlQJCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfUEVSSVBITUVNX1NUQVRFU1RfTUFTSwkJCQkJQklURklFTEQoOCwgOSkKKworLyogVXNlZCBieSBQUk1fUEhBU0UxX0NORFAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUEhBU0UxX0NORFBfU0hJRlQJCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1BIQVNFMV9DTkRQX01BU0sJCQkJCUJJVEZJRUxEKDAsIDMxKQorCisvKiBVc2VkIGJ5IFBSTV9QSEFTRTJBX0NORFAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUEhBU0UyQV9DTkRQX1NISUZUCQkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9QSEFTRTJBX0NORFBfTUFTSwkJCQkJQklURklFTEQoMCwgMzEpCisKKy8qIFVzZWQgYnkgUFJNX1BIQVNFMkJfQ05EUCAqLworI2RlZmluZSBPTUFQNDQzMF9QSEFTRTJCX0NORFBfU0hJRlQJCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1BIQVNFMkJfQ05EUF9NQVNLCQkJCQlCSVRGSUVMRCgwLCAzMSkKKworLyogVXNlZCBieSBQUk1fUFNDT05fQ09VTlQgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUE9OT1VUXzJfUEdPT0RJTl9USU1FX1NISUZUCQkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX1BPTk9VVF8yX1BHT09ESU5fVElNRV9NQVNLCQkJCUJJVEZJRUxEKDgsIDE1KQorCisvKgorICogVXNlZCBieSBQTV9FTVVfUFdSU1RDVFJMLCBQTV9DT1JFX1BXUlNUQ1RSTCwgUE1fQ0FNX1BXUlNUQ1RSTCwKKyAqIFBNX0wzSU5JVF9QV1JTVENUUkwsIFBNX0FCRV9QV1JTVENUUkwsIFBNX0dGWF9QV1JTVENUUkwsIFBNX01QVV9QV1JTVENUUkwsCisgKiBQTV9DRUZVU0VfUFdSU1RDVFJMLCBQTV9EU1NfUFdSU1RDVFJMLCBQTV9MNFBFUl9QV1JTVENUUkwsCisgKiBQTV9URVNMQV9QV1JTVENUUkwsIFBNX0lWQUhEX1BXUlNUQ1RSTAorICovCisjZGVmaW5lIE9NQVA0NDMwX1BPV0VSU1RBVEVfU0hJRlQJCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1BPV0VSU1RBVEVfTUFTSwkJCQkJQklURklFTEQoMCwgMSkKKworLyoKKyAqIFVzZWQgYnkgUE1fRU1VX1BXUlNUU1QsIFBNX0NPUkVfUFdSU1RTVCwgUE1fQ0FNX1BXUlNUU1QsIFBNX0wzSU5JVF9QV1JTVFNULAorICogUE1fQUJFX1BXUlNUU1QsIFBNX0dGWF9QV1JTVFNULCBQTV9NUFVfUFdSU1RTVCwgUE1fQ0VGVVNFX1BXUlNUU1QsCisgKiBQTV9EU1NfUFdSU1RTVCwgUE1fTDRQRVJfUFdSU1RTVCwgUE1fVEVTTEFfUFdSU1RTVCwgUE1fSVZBSERfUFdSU1RTVAorICovCisjZGVmaW5lIE9NQVA0NDMwX1BPV0VSU1RBVEVTVF9TSElGVAkJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfUE9XRVJTVEFURVNUX01BU0sJCQkJCUJJVEZJRUxEKDAsIDEpCisKKy8qIFVzZWQgYnkgUFJNX1BXUlJFUUNUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUFdSUkVRX0NPTkRfU0hJRlQJCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1BXUlJFUV9DT05EX01BU0sJCQkJCUJJVEZJRUxEKDAsIDEpCisKKy8qIFVzZWQgYnkgUFJNX1ZDX0NGR19DSEFOTkVMICovCisjZGVmaW5lIE9NQVA0NDMwX1JBQ0VOX1ZERF9DT1JFX0xfU0hJRlQJCQkJCSgxIDw8IDMpCisjZGVmaW5lIE9NQVA0NDMwX1JBQ0VOX1ZERF9DT1JFX0xfTUFTSwkJCQkJQklURklFTEQoMywgMykKKworLyogVXNlZCBieSBQUk1fVkNfQ0ZHX0NIQU5ORUwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUkFDRU5fVkREX0lWQV9MX1NISUZUCQkJCQkoMSA8PCAxMSkKKyNkZWZpbmUgT01BUDQ0MzBfUkFDRU5fVkREX0lWQV9MX01BU0sJCQkJCUJJVEZJRUxEKDExLCAxMSkKKworLyogVXNlZCBieSBQUk1fVkNfQ0ZHX0NIQU5ORUwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUkFDRU5fVkREX01QVV9MX1NISUZUCQkJCQkoMSA8PCAyMCkKKyNkZWZpbmUgT01BUDQ0MzBfUkFDRU5fVkREX01QVV9MX01BU0sJCQkJCUJJVEZJRUxEKDIwLCAyMCkKKworLyogVXNlZCBieSBQUk1fVkNfQ0ZHX0NIQU5ORUwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUkFDX1ZERF9DT1JFX0xfU0hJRlQJCQkJCSgxIDw8IDIpCisjZGVmaW5lIE9NQVA0NDMwX1JBQ19WRERfQ09SRV9MX01BU0sJCQkJCUJJVEZJRUxEKDIsIDIpCisKKy8qIFVzZWQgYnkgUFJNX1ZDX0NGR19DSEFOTkVMICovCisjZGVmaW5lIE9NQVA0NDMwX1JBQ19WRERfSVZBX0xfU0hJRlQJCQkJCSgxIDw8IDEwKQorI2RlZmluZSBPTUFQNDQzMF9SQUNfVkREX0lWQV9MX01BU0sJCQkJCUJJVEZJRUxEKDEwLCAxMCkKKworLyogVXNlZCBieSBQUk1fVkNfQ0ZHX0NIQU5ORUwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUkFDX1ZERF9NUFVfTF9TSElGVAkJCQkJKDEgPDwgMTkpCisjZGVmaW5lIE9NQVA0NDMwX1JBQ19WRERfTVBVX0xfTUFTSwkJCQkJQklURklFTEQoMTksIDE5KQorCisvKgorICogVXNlZCBieSBQUk1fVk9MVFNFVFVQX0NPUkVfT0ZGLCBQUk1fVk9MVFNFVFVQX0NPUkVfUkVUX1NMRUVQLAorICogUFJNX1ZPTFRTRVRVUF9JVkFfT0ZGLCBQUk1fVk9MVFNFVFVQX0lWQV9SRVRfU0xFRVAsIFBSTV9WT0xUU0VUVVBfTVBVX09GRiwKKyAqIFBSTV9WT0xUU0VUVVBfTVBVX1JFVF9TTEVFUAorICovCisjZGVmaW5lIE9NQVA0NDMwX1JBTVBfRE9XTl9DT1VOVF9TSElGVAkJCQkJKDEgPDwgMTYpCisjZGVmaW5lIE9NQVA0NDMwX1JBTVBfRE9XTl9DT1VOVF9NQVNLCQkJCQlCSVRGSUVMRCgxNiwgMjEpCisKKy8qCisgKiBVc2VkIGJ5IFBSTV9WT0xUU0VUVVBfQ09SRV9PRkYsIFBSTV9WT0xUU0VUVVBfQ09SRV9SRVRfU0xFRVAsCisgKiBQUk1fVk9MVFNFVFVQX0lWQV9PRkYsIFBSTV9WT0xUU0VUVVBfSVZBX1JFVF9TTEVFUCwgUFJNX1ZPTFRTRVRVUF9NUFVfT0ZGLAorICogUFJNX1ZPTFRTRVRVUF9NUFVfUkVUX1NMRUVQCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUkFNUF9ET1dOX1BSRVNDQUxfU0hJRlQJCQkJKDEgPDwgMjQpCisjZGVmaW5lIE9NQVA0NDMwX1JBTVBfRE9XTl9QUkVTQ0FMX01BU0sJCQkJCUJJVEZJRUxEKDI0LCAyNSkKKworLyoKKyAqIFVzZWQgYnkgUFJNX1ZPTFRTRVRVUF9DT1JFX09GRiwgUFJNX1ZPTFRTRVRVUF9DT1JFX1JFVF9TTEVFUCwKKyAqIFBSTV9WT0xUU0VUVVBfSVZBX09GRiwgUFJNX1ZPTFRTRVRVUF9JVkFfUkVUX1NMRUVQLCBQUk1fVk9MVFNFVFVQX01QVV9PRkYsCisgKiBQUk1fVk9MVFNFVFVQX01QVV9SRVRfU0xFRVAKKyAqLworI2RlZmluZSBPTUFQNDQzMF9SQU1QX1VQX0NPVU5UX1NISUZUCQkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9SQU1QX1VQX0NPVU5UX01BU0sJCQkJCUJJVEZJRUxEKDAsIDUpCisKKy8qCisgKiBVc2VkIGJ5IFBSTV9WT0xUU0VUVVBfQ09SRV9PRkYsIFBSTV9WT0xUU0VUVVBfQ09SRV9SRVRfU0xFRVAsCisgKiBQUk1fVk9MVFNFVFVQX0lWQV9PRkYsIFBSTV9WT0xUU0VUVVBfSVZBX1JFVF9TTEVFUCwgUFJNX1ZPTFRTRVRVUF9NUFVfT0ZGLAorICogUFJNX1ZPTFRTRVRVUF9NUFVfUkVUX1NMRUVQCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUkFNUF9VUF9QUkVTQ0FMX1NISUZUCQkJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9SQU1QX1VQX1BSRVNDQUxfTUFTSwkJCQkJQklURklFTEQoOCwgOSkKKworLyogVXNlZCBieSBQUk1fVkNfQ0ZHX0NIQU5ORUwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUkFWX1ZERF9DT1JFX0xfU0hJRlQJCQkJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVA0NDMwX1JBVl9WRERfQ09SRV9MX01BU0sJCQkJCUJJVEZJRUxEKDEsIDEpCisKKy8qIFVzZWQgYnkgUFJNX1ZDX0NGR19DSEFOTkVMICovCisjZGVmaW5lIE9NQVA0NDMwX1JBVl9WRERfSVZBX0xfU0hJRlQJCQkJCSgxIDw8IDkpCisjZGVmaW5lIE9NQVA0NDMwX1JBVl9WRERfSVZBX0xfTUFTSwkJCQkJQklURklFTEQoOSwgOSkKKworLyogVXNlZCBieSBQUk1fVkNfQ0ZHX0NIQU5ORUwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUkFWX1ZERF9NUFVfTF9TSElGVAkJCQkJKDEgPDwgMTgpCisjZGVmaW5lIE9NQVA0NDMwX1JBVl9WRERfTVBVX0xfTUFTSwkJCQkJQklURklFTEQoMTgsIDE4KQorCisvKiBVc2VkIGJ5IFBSTV9WQ19WQUxfQllQQVNTICovCisjZGVmaW5lIE9NQVA0NDMwX1JFR0FERFJfU0hJRlQJCQkJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9SRUdBRERSX01BU0sJCQkJCQlCSVRGSUVMRCg4LCAxNSkKKworLyoKKyAqIFVzZWQgYnkgUFJNX1ZDX1ZBTF9DTURfVkREX0NPUkVfTCwgUFJNX1ZDX1ZBTF9DTURfVkREX0lWQV9MLAorICogUFJNX1ZDX1ZBTF9DTURfVkREX01QVV9MCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUkVUX1NISUZUCQkJCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfUkVUX01BU0sJCQkJCQlCSVRGSUVMRCg4LCAxNSkKKworLyogVXNlZCBieSBQTV9MNFBFUl9QV1JTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUkVUQUlORURfQkFOS19PTlNUQVRFX1NISUZUCQkJCSgxIDw8IDE2KQorI2RlZmluZSBPTUFQNDQzMF9SRVRBSU5FRF9CQU5LX09OU1RBVEVfTUFTSwkJCQlCSVRGSUVMRCgxNiwgMTcpCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfUFdSU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX1JFVEFJTkVEX0JBTktfUkVUU1RBVEVfU0hJRlQJCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfUkVUQUlORURfQkFOS19SRVRTVEFURV9NQVNLCQkJCUJJVEZJRUxEKDgsIDgpCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfUFdSU1RTVCAqLworI2RlZmluZSBPTUFQNDQzMF9SRVRBSU5FRF9CQU5LX1NUQVRFU1RfU0hJRlQJCQkJKDEgPDwgNCkKKyNkZWZpbmUgT01BUDQ0MzBfUkVUQUlORURfQkFOS19TVEFURVNUX01BU0sJCQkJQklURklFTEQoNCwgNSkKKworLyoKKyAqIFVzZWQgYnkgUFJNX0xET19TUkFNX0NPUkVfQ1RSTCwgUFJNX0xET19TUkFNX0lWQV9DVFJMLAorICogUFJNX0xET19TUkFNX01QVV9DVFJMCisgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUkVUTU9ERV9FTkFCTEVfU0hJRlQJCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1JFVE1PREVfRU5BQkxFX01BU0sJCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUkVWSVNJT05fUFJNICovCisjZGVmaW5lIE9NQVA0NDMwX1JFVl9TSElGVAkJCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1JFVl9NQVNLCQkJCQkJQklURklFTEQoMCwgNykKKworLyogVXNlZCBieSBSTV9EVUNBVElfUlNUQ1RSTCwgUk1fVEVTTEFfUlNUQ1RSTCwgUk1fSVZBSERfUlNUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9SU1QxX1NISUZUCQkJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfUlNUMV9NQVNLCQkJCQkJQklURklFTEQoMCwgMCkKKworLyogVXNlZCBieSBSTV9EVUNBVElfUlNUU1QsIFJNX1RFU0xBX1JTVFNULCBSTV9JVkFIRF9SU1RTVCAqLworI2RlZmluZSBPTUFQNDQzMF9SU1QxU1RfU0hJRlQJCQkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9SU1QxU1RfTUFTSwkJCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUk1fRFVDQVRJX1JTVENUUkwsIFJNX1RFU0xBX1JTVENUUkwsIFJNX0lWQUhEX1JTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUlNUMl9TSElGVAkJCQkJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVA0NDMwX1JTVDJfTUFTSwkJCQkJCUJJVEZJRUxEKDEsIDEpCisKKy8qIFVzZWQgYnkgUk1fRFVDQVRJX1JTVFNULCBSTV9URVNMQV9SU1RTVCwgUk1fSVZBSERfUlNUU1QgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUlNUMlNUX1NISUZUCQkJCQkJKDEgPDwgMSkKKyNkZWZpbmUgT01BUDQ0MzBfUlNUMlNUX01BU0sJCQkJCQlCSVRGSUVMRCgxLCAxKQorCisvKiBVc2VkIGJ5IFJNX0RVQ0FUSV9SU1RDVFJMLCBSTV9JVkFIRF9SU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX1JTVDNfU0hJRlQJCQkJCQkoMSA8PCAyKQorI2RlZmluZSBPTUFQNDQzMF9SU1QzX01BU0sJCQkJCQlCSVRGSUVMRCgyLCAyKQorCisvKiBVc2VkIGJ5IFJNX0RVQ0FUSV9SU1RTVCwgUk1fSVZBSERfUlNUU1QgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUlNUM1NUX1NISUZUCQkJCQkJKDEgPDwgMikKKyNkZWZpbmUgT01BUDQ0MzBfUlNUM1NUX01BU0sJCQkJCQlCSVRGSUVMRCgyLCAyKQorCisvKiBVc2VkIGJ5IFBSTV9SU1RUSU1FICovCisjZGVmaW5lIE9NQVA0NDMwX1JTVFRJTUUxX1NISUZUCQkJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfUlNUVElNRTFfTUFTSwkJCQkJCUJJVEZJRUxEKDAsIDkpCisKKy8qIFVzZWQgYnkgUFJNX1JTVFRJTUUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUlNUVElNRTJfU0hJRlQJCQkJCQkoMSA8PCAxMCkKKyNkZWZpbmUgT01BUDQ0MzBfUlNUVElNRTJfTUFTSwkJCQkJCUJJVEZJRUxEKDEwLCAxNCkKKworLyogVXNlZCBieSBQUk1fUlNUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9SU1RfR0xPQkFMX0NPTERfU1dfU0hJRlQJCQkJKDEgPDwgMSkKKyNkZWZpbmUgT01BUDQ0MzBfUlNUX0dMT0JBTF9DT0xEX1NXX01BU0sJCQkJQklURklFTEQoMSwgMSkKKworLyogVXNlZCBieSBQUk1fUlNUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9SU1RfR0xPQkFMX1dBUk1fU1dfU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfUlNUX0dMT0JBTF9XQVJNX1NXX01BU0sJCQkJQklURklFTEQoMCwgMCkKKworLyogVXNlZCBieSBQUk1fVkNfQ0ZHX0NIQU5ORUwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfU0FfVkREX0NPUkVfTF9TSElGVAkJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfU0FfVkREX0NPUkVfTF9NQVNLCQkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBSZW5hbWVkIGZyb20gU0FfVkREX0NPUkVfTCBVc2VkIGJ5IFBSTV9WQ19TTVBTX1NBICovCisjZGVmaW5lIE9NQVA0NDMwX1NBX1ZERF9DT1JFX0xfMF82X1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1NBX1ZERF9DT1JFX0xfMF82X01BU0sJCQkJCUJJVEZJRUxEKDAsIDYpCisKKy8qIFVzZWQgYnkgUFJNX1ZDX0NGR19DSEFOTkVMICovCisjZGVmaW5lIE9NQVA0NDMwX1NBX1ZERF9JVkFfTF9TSElGVAkJCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfU0FfVkREX0lWQV9MX01BU0sJCQkJCUJJVEZJRUxEKDgsIDgpCisKKy8qIFJlbmFtZWQgZnJvbSBTQV9WRERfSVZBX0wgVXNlZCBieSBQUk1fVkNfU01QU19TQSAqLworI2RlZmluZSBPTUFQNDQzMF9TQV9WRERfSVZBX0xfUFJNX1ZDX1NNUFNfU0FfU0hJRlQJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9TQV9WRERfSVZBX0xfUFJNX1ZDX1NNUFNfU0FfTUFTSwkJCUJJVEZJRUxEKDgsIDE0KQorCisvKiBVc2VkIGJ5IFBSTV9WQ19DRkdfQ0hBTk5FTCAqLworI2RlZmluZSBPTUFQNDQzMF9TQV9WRERfTVBVX0xfU0hJRlQJCQkJCSgxIDw8IDE2KQorI2RlZmluZSBPTUFQNDQzMF9TQV9WRERfTVBVX0xfTUFTSwkJCQkJQklURklFTEQoMTYsIDE2KQorCisvKiBSZW5hbWVkIGZyb20gU0FfVkREX01QVV9MIFVzZWQgYnkgUFJNX1ZDX1NNUFNfU0EgKi8KKyNkZWZpbmUgT01BUDQ0MzBfU0FfVkREX01QVV9MX1BSTV9WQ19TTVBTX1NBX1NISUZUCQkJKDEgPDwgMTYpCisjZGVmaW5lIE9NQVA0NDMwX1NBX1ZERF9NUFVfTF9QUk1fVkNfU01QU19TQV9NQVNLCQkJQklURklFTEQoMTYsIDIyKQorCisvKiBVc2VkIGJ5IFBSTV9WQ19DRkdfSTJDX0NMSyAqLworI2RlZmluZSBPTUFQNDQzMF9TQ0xIX1NISUZUCQkJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfU0NMSF9NQVNLCQkJCQkJQklURklFTEQoMCwgNykKKworLyogVXNlZCBieSBQUk1fVkNfQ0ZHX0kyQ19DTEsgKi8KKyNkZWZpbmUgT01BUDQ0MzBfU0NMTF9TSElGVAkJCQkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX1NDTExfTUFTSwkJCQkJCUJJVEZJRUxEKDgsIDE1KQorCisvKiBVc2VkIGJ5IFBSTV9SU1RTVCAqLworI2RlZmluZSBPTUFQNDQzMF9TRUNVUkVfV0RUX1JTVF9TSElGVAkJCQkJKDEgPDwgNCkKKyNkZWZpbmUgT01BUDQ0MzBfU0VDVVJFX1dEVF9SU1RfTUFTSwkJCQkJQklURklFTEQoNCwgNCkKKworLyogVXNlZCBieSBQTV9JVkFIRF9QV1JTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfU0wyX01FTV9PTlNUQVRFX1NISUZUCQkJCQkoMSA8PCAxOCkKKyNkZWZpbmUgT01BUDQ0MzBfU0wyX01FTV9PTlNUQVRFX01BU0sJCQkJCUJJVEZJRUxEKDE4LCAxOSkKKworLyogVXNlZCBieSBQTV9JVkFIRF9QV1JTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfU0wyX01FTV9SRVRTVEFURV9TSElGVAkJCQkJKDEgPDwgOSkKKyNkZWZpbmUgT01BUDQ0MzBfU0wyX01FTV9SRVRTVEFURV9NQVNLCQkJCQlCSVRGSUVMRCg5LCA5KQorCisvKiBVc2VkIGJ5IFBNX0lWQUhEX1BXUlNUU1QgKi8KKyNkZWZpbmUgT01BUDQ0MzBfU0wyX01FTV9TVEFURVNUX1NISUZUCQkJCQkoMSA8PCA2KQorI2RlZmluZSBPTUFQNDQzMF9TTDJfTUVNX1NUQVRFU1RfTUFTSwkJCQkJQklURklFTEQoNiwgNykKKworLyogVXNlZCBieSBQUk1fVkNfVkFMX0JZUEFTUyAqLworI2RlZmluZSBPTUFQNDQzMF9TTEFWRUFERFJfU0hJRlQJCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1NMQVZFQUREUl9NQVNLCQkJCQkJQklURklFTEQoMCwgNikKKworLyogVXNlZCBieSBQUk1fTERPX0FCQl9JVkFfU0VUVVAsIFBSTV9MRE9fQUJCX01QVV9TRVRVUCAqLworI2RlZmluZSBPTUFQNDQzMF9TTEVFUF9SQkJfU0VMX1NISUZUCQkJCQkoMSA8PCAzKQorI2RlZmluZSBPTUFQNDQzMF9TTEVFUF9SQkJfU0VMX01BU0sJCQkJCUJJVEZJRUxEKDMsIDMpCisKKy8qIFVzZWQgYnkgUFJNX1NSQU1fQ09VTlQgKi8KKyNkZWZpbmUgT01BUDQ0MzBfU0xQQ05UX1ZBTFVFX1NISUZUCQkJCQkoMSA8PCAxNikKKyNkZWZpbmUgT01BUDQ0MzBfU0xQQ05UX1ZBTFVFX01BU0sJCQkJCUJJVEZJRUxEKDE2LCAyMykKKworLyogVXNlZCBieSBQUk1fVlBfQ09SRV9WU1RFUE1BWCwgUFJNX1ZQX0lWQV9WU1RFUE1BWCwgUFJNX1ZQX01QVV9WU1RFUE1BWCAqLworI2RlZmluZSBPTUFQNDQzMF9TTVBTV0FJVFRJTUVNQVhfU0hJRlQJCQkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX1NNUFNXQUlUVElNRU1BWF9NQVNLCQkJCQlCSVRGSUVMRCg4LCAyMykKKworLyogVXNlZCBieSBQUk1fVlBfQ09SRV9WU1RFUE1JTiwgUFJNX1ZQX0lWQV9WU1RFUE1JTiwgUFJNX1ZQX01QVV9WU1RFUE1JTiAqLworI2RlZmluZSBPTUFQNDQzMF9TTVBTV0FJVFRJTUVNSU5fU0hJRlQJCQkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX1NNUFNXQUlUVElNRU1JTl9NQVNLCQkJCQlCSVRGSUVMRCg4LCAyMykKKworLyogVXNlZCBieSBQUk1fTERPX0FCQl9JVkFfU0VUVVAsIFBSTV9MRE9fQUJCX01QVV9TRVRVUCAqLworI2RlZmluZSBPTUFQNDQzMF9TUjJFTl9TSElGVAkJCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1NSMkVOX01BU0sJCQkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IFBSTV9MRE9fQUJCX0lWQV9DVFJMLCBQUk1fTERPX0FCQl9NUFVfQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9TUjJfSU5fVFJBTlNJVElPTl9TSElGVAkJCQkoMSA8PCA2KQorI2RlZmluZSBPTUFQNDQzMF9TUjJfSU5fVFJBTlNJVElPTl9NQVNLCQkJCQlCSVRGSUVMRCg2LCA2KQorCisvKiBVc2VkIGJ5IFBSTV9MRE9fQUJCX0lWQV9DVFJMLCBQUk1fTERPX0FCQl9NUFVfQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9TUjJfU1RBVFVTX1NISUZUCQkJCQkoMSA8PCAzKQorI2RlZmluZSBPTUFQNDQzMF9TUjJfU1RBVFVTX01BU0sJCQkJCUJJVEZJRUxEKDMsIDQpCisKKy8qIFVzZWQgYnkgUFJNX0xET19BQkJfSVZBX1NFVFVQLCBQUk1fTERPX0FCQl9NUFVfU0VUVVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfU1IyX1dUQ05UX1ZBTFVFX1NISUZUCQkJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9TUjJfV1RDTlRfVkFMVUVfTUFTSwkJCQkJQklURklFTEQoOCwgMTUpCisKKy8qCisgKiBVc2VkIGJ5IFBSTV9MRE9fU1JBTV9DT1JFX0NUUkwsIFBSTV9MRE9fU1JBTV9JVkFfQ1RSTCwKKyAqIFBSTV9MRE9fU1JBTV9NUFVfQ1RSTAorICovCisjZGVmaW5lIE9NQVA0NDMwX1NSQU1MRE9fU1RBVFVTX1NISUZUCQkJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9TUkFNTERPX1NUQVRVU19NQVNLCQkJCQlCSVRGSUVMRCg4LCA4KQorCisvKgorICogVXNlZCBieSBQUk1fTERPX1NSQU1fQ09SRV9DVFJMLCBQUk1fTERPX1NSQU1fSVZBX0NUUkwsCisgKiBQUk1fTERPX1NSQU1fTVBVX0NUUkwKKyAqLworI2RlZmluZSBPTUFQNDQzMF9TUkFNX0lOX1RSQU5TSVRJT05fU0hJRlQJCQkJKDEgPDwgOSkKKyNkZWZpbmUgT01BUDQ0MzBfU1JBTV9JTl9UUkFOU0lUSU9OX01BU0sJCQkJQklURklFTEQoOSwgOSkKKworLyogVXNlZCBieSBQUk1fVkNfQ0ZHX0kyQ19NT0RFICovCisjZGVmaW5lIE9NQVA0NDMwX1NSTU9ERUVOX1NISUZUCQkJCQkJKDEgPDwgNCkKKyNkZWZpbmUgT01BUDQ0MzBfU1JNT0RFRU5fTUFTSwkJCQkJCUJJVEZJRUxEKDQsIDQpCisKKy8qIFVzZWQgYnkgUFJNX1ZPTFRTRVRVUF9XQVJNUkVTRVQgKi8KKyNkZWZpbmUgT01BUDQ0MzBfU1RBQkxFX0NPVU5UX1NISUZUCQkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9TVEFCTEVfQ09VTlRfTUFTSwkJCQkJQklURklFTEQoMCwgNSkKKworLyogVXNlZCBieSBQUk1fVk9MVFNFVFVQX1dBUk1SRVNFVCAqLworI2RlZmluZSBPTUFQNDQzMF9TVEFCTEVfUFJFU0NBTF9TSElGVAkJCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfU1RBQkxFX1BSRVNDQUxfTUFTSwkJCQkJQklURklFTEQoOCwgOSkKKworLyogVXNlZCBieSBQTV9JVkFIRF9QV1JTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVENNMV9NRU1fT05TVEFURV9TSElGVAkJCQkJKDEgPDwgMjApCisjZGVmaW5lIE9NQVA0NDMwX1RDTTFfTUVNX09OU1RBVEVfTUFTSwkJCQkJQklURklFTEQoMjAsIDIxKQorCisvKiBVc2VkIGJ5IFBNX0lWQUhEX1BXUlNUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9UQ00xX01FTV9SRVRTVEFURV9TSElGVAkJCQkoMSA8PCAxMCkKKyNkZWZpbmUgT01BUDQ0MzBfVENNMV9NRU1fUkVUU1RBVEVfTUFTSwkJCQkJQklURklFTEQoMTAsIDEwKQorCisvKiBVc2VkIGJ5IFBNX0lWQUhEX1BXUlNUU1QgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVENNMV9NRU1fU1RBVEVTVF9TSElGVAkJCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfVENNMV9NRU1fU1RBVEVTVF9NQVNLCQkJCQlCSVRGSUVMRCg4LCA5KQorCisvKiBVc2VkIGJ5IFBNX0lWQUhEX1BXUlNUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9UQ00yX01FTV9PTlNUQVRFX1NISUZUCQkJCQkoMSA8PCAyMikKKyNkZWZpbmUgT01BUDQ0MzBfVENNMl9NRU1fT05TVEFURV9NQVNLCQkJCQlCSVRGSUVMRCgyMiwgMjMpCisKKy8qIFVzZWQgYnkgUE1fSVZBSERfUFdSU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX1RDTTJfTUVNX1JFVFNUQVRFX1NISUZUCQkJCSgxIDw8IDExKQorI2RlZmluZSBPTUFQNDQzMF9UQ00yX01FTV9SRVRTVEFURV9NQVNLCQkJCQlCSVRGSUVMRCgxMSwgMTEpCisKKy8qIFVzZWQgYnkgUE1fSVZBSERfUFdSU1RTVCAqLworI2RlZmluZSBPTUFQNDQzMF9UQ00yX01FTV9TVEFURVNUX1NISUZUCQkJCQkoMSA8PCAxMCkKKyNkZWZpbmUgT01BUDQ0MzBfVENNMl9NRU1fU1RBVEVTVF9NQVNLCQkJCQlCSVRGSUVMRCgxMCwgMTEpCisKKy8qIFVzZWQgYnkgUk1fVEVTTEFfUlNUU1QgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVEVTTEFTU19FTVVfUlNUU1RfU0hJRlQJCQkJKDEgPDwgMikKKyNkZWZpbmUgT01BUDQ0MzBfVEVTTEFTU19FTVVfUlNUU1RfTUFTSwkJCQkJQklURklFTEQoMiwgMikKKworLyogVXNlZCBieSBSTV9URVNMQV9SU1RTVCAqLworI2RlZmluZSBPTUFQNDQzMF9URVNMQV9EU1BfRU1VX1JFUV9SU1RTVF9TSElGVAkJCQkoMSA8PCAzKQorI2RlZmluZSBPTUFQNDQzMF9URVNMQV9EU1BfRU1VX1JFUV9SU1RTVF9NQVNLCQkJCUJJVEZJRUxEKDMsIDMpCisKKy8qIFVzZWQgYnkgUE1fVEVTTEFfUFdSU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX1RFU0xBX0VETUFfT05TVEFURV9TSElGVAkJCQkoMSA8PCAyMCkKKyNkZWZpbmUgT01BUDQ0MzBfVEVTTEFfRURNQV9PTlNUQVRFX01BU0sJCQkJQklURklFTEQoMjAsIDIxKQorCisvKiBVc2VkIGJ5IFBNX1RFU0xBX1BXUlNUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9URVNMQV9FRE1BX1JFVFNUQVRFX1NISUZUCQkJCSgxIDw8IDEwKQorI2RlZmluZSBPTUFQNDQzMF9URVNMQV9FRE1BX1JFVFNUQVRFX01BU0sJCQkJQklURklFTEQoMTAsIDEwKQorCisvKiBVc2VkIGJ5IFBNX1RFU0xBX1BXUlNUU1QgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVEVTTEFfRURNQV9TVEFURVNUX1NISUZUCQkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX1RFU0xBX0VETUFfU1RBVEVTVF9NQVNLCQkJCUJJVEZJRUxEKDgsIDkpCisKKy8qIFVzZWQgYnkgUE1fVEVTTEFfUFdSU1RDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX1RFU0xBX0wxX09OU1RBVEVfU0hJRlQJCQkJCSgxIDw8IDE2KQorI2RlZmluZSBPTUFQNDQzMF9URVNMQV9MMV9PTlNUQVRFX01BU0sJCQkJCUJJVEZJRUxEKDE2LCAxNykKKworLyogVXNlZCBieSBQTV9URVNMQV9QV1JTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVEVTTEFfTDFfUkVUU1RBVEVfU0hJRlQJCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfVEVTTEFfTDFfUkVUU1RBVEVfTUFTSwkJCQkJQklURklFTEQoOCwgOCkKKworLyogVXNlZCBieSBQTV9URVNMQV9QV1JTVFNUICovCisjZGVmaW5lIE9NQVA0NDMwX1RFU0xBX0wxX1NUQVRFU1RfU0hJRlQJCQkJCSgxIDw8IDQpCisjZGVmaW5lIE9NQVA0NDMwX1RFU0xBX0wxX1NUQVRFU1RfTUFTSwkJCQkJQklURklFTEQoNCwgNSkKKworLyogVXNlZCBieSBQTV9URVNMQV9QV1JTVENUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVEVTTEFfTDJfT05TVEFURV9TSElGVAkJCQkJKDEgPDwgMTgpCisjZGVmaW5lIE9NQVA0NDMwX1RFU0xBX0wyX09OU1RBVEVfTUFTSwkJCQkJQklURklFTEQoMTgsIDE5KQorCisvKiBVc2VkIGJ5IFBNX1RFU0xBX1BXUlNUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9URVNMQV9MMl9SRVRTVEFURV9TSElGVAkJCQkoMSA8PCA5KQorI2RlZmluZSBPTUFQNDQzMF9URVNMQV9MMl9SRVRTVEFURV9NQVNLCQkJCQlCSVRGSUVMRCg5LCA5KQorCisvKiBVc2VkIGJ5IFBNX1RFU0xBX1BXUlNUU1QgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVEVTTEFfTDJfU1RBVEVTVF9TSElGVAkJCQkJKDEgPDwgNikKKyNkZWZpbmUgT01BUDQ0MzBfVEVTTEFfTDJfU1RBVEVTVF9NQVNLCQkJCQlCSVRGSUVMRCg2LCA3KQorCisvKiBVc2VkIGJ5IFBSTV9WUF9DT1JFX1ZMSU1JVFRPLCBQUk1fVlBfSVZBX1ZMSU1JVFRPLCBQUk1fVlBfTVBVX1ZMSU1JVFRPICovCisjZGVmaW5lIE9NQVA0NDMwX1RJTUVPVVRfU0hJRlQJCQkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9USU1FT1VUX01BU0sJCQkJCQlCSVRGSUVMRCgwLCAxNSkKKworLyogVXNlZCBieSBQUk1fVlBfQ09SRV9DT05GSUcsIFBSTV9WUF9JVkFfQ09ORklHLCBQUk1fVlBfTVBVX0NPTkZJRyAqLworI2RlZmluZSBPTUFQNDQzMF9USU1FT1VURU5fU0hJRlQJCQkJCSgxIDw8IDMpCisjZGVmaW5lIE9NQVA0NDMwX1RJTUVPVVRFTl9NQVNLCQkJCQkJQklURklFTEQoMywgMykKKworLyogVXNlZCBieSBQUk1fSVJRRU5BQkxFX0RVQ0FUSSwgUFJNX0lSUUVOQUJMRV9NUFUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVFJBTlNJVElPTl9FTl9TSElGVAkJCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfVFJBTlNJVElPTl9FTl9NQVNLCQkJCQlCSVRGSUVMRCg4LCA4KQorCisvKiBVc2VkIGJ5IFBSTV9JUlFTVEFUVVNfRFVDQVRJLCBQUk1fSVJRU1RBVFVTX01QVSAqLworI2RlZmluZSBPTUFQNDQzMF9UUkFOU0lUSU9OX1NUX1NISUZUCQkJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9UUkFOU0lUSU9OX1NUX01BU0sJCQkJCUJJVEZJRUxEKDgsIDgpCisKKy8qIFVzZWQgYnkgUFJNX1ZDX1ZBTF9CWVBBU1MgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVkFMSURfU0hJRlQJCQkJCQkoMSA8PCAyNCkKKyNkZWZpbmUgT01BUDQ0MzBfVkFMSURfTUFTSwkJCQkJCUJJVEZJRUxEKDI0LCAyNCkKKworLyogVXNlZCBieSBQUk1fSVJRRU5BQkxFX0RVQ0FUSSwgUFJNX0lSUUVOQUJMRV9NUFUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVkNfQllQQVNTQUNLX0VOX1NISUZUCQkJCQkoMSA8PCAxNCkKKyNkZWZpbmUgT01BUDQ0MzBfVkNfQllQQVNTQUNLX0VOX01BU0sJCQkJCUJJVEZJRUxEKDE0LCAxNCkKKworLyogVXNlZCBieSBQUk1fSVJRU1RBVFVTX0RVQ0FUSSwgUFJNX0lSUVNUQVRVU19NUFUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVkNfQllQQVNTQUNLX1NUX1NISUZUCQkJCQkoMSA8PCAxNCkKKyNkZWZpbmUgT01BUDQ0MzBfVkNfQllQQVNTQUNLX1NUX01BU0sJCQkJCUJJVEZJRUxEKDE0LCAxNCkKKworLyogVXNlZCBieSBQUk1fSVJRRU5BQkxFX0RVQ0FUSSwgUFJNX0lSUUVOQUJMRV9NUFUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVkNfSVZBX1ZQQUNLX0VOX1NISUZUCQkJCQkoMSA8PCAzMCkKKyNkZWZpbmUgT01BUDQ0MzBfVkNfSVZBX1ZQQUNLX0VOX01BU0sJCQkJCUJJVEZJRUxEKDMwLCAzMCkKKworLyogVXNlZCBieSBQUk1fSVJRU1RBVFVTX0RVQ0FUSSwgUFJNX0lSUVNUQVRVU19NUFUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVkNfSVZBX1ZQQUNLX1NUX1NISUZUCQkJCQkoMSA8PCAzMCkKKyNkZWZpbmUgT01BUDQ0MzBfVkNfSVZBX1ZQQUNLX1NUX01BU0sJCQkJCUJJVEZJRUxEKDMwLCAzMCkKKworLyogVXNlZCBieSBQUk1fSVJRRU5BQkxFX01QVV8yICovCisjZGVmaW5lIE9NQVA0NDMwX1ZDX01QVV9WUEFDS19FTl9TSElGVAkJCQkJKDEgPDwgNikKKyNkZWZpbmUgT01BUDQ0MzBfVkNfTVBVX1ZQQUNLX0VOX01BU0sJCQkJCUJJVEZJRUxEKDYsIDYpCisKKy8qIFVzZWQgYnkgUFJNX0lSUVNUQVRVU19NUFVfMiAqLworI2RlZmluZSBPTUFQNDQzMF9WQ19NUFVfVlBBQ0tfU1RfU0hJRlQJCQkJCSgxIDw8IDYpCisjZGVmaW5lIE9NQVA0NDMwX1ZDX01QVV9WUEFDS19TVF9NQVNLCQkJCQlCSVRGSUVMRCg2LCA2KQorCisvKiBVc2VkIGJ5IFBSTV9JUlFFTkFCTEVfRFVDQVRJLCBQUk1fSVJRRU5BQkxFX01QVSAqLworI2RlZmluZSBPTUFQNDQzMF9WQ19SQUVSUl9FTl9TSElGVAkJCQkJKDEgPDwgMTIpCisjZGVmaW5lIE9NQVA0NDMwX1ZDX1JBRVJSX0VOX01BU0sJCQkJCUJJVEZJRUxEKDEyLCAxMikKKworLyogVXNlZCBieSBQUk1fSVJRU1RBVFVTX0RVQ0FUSSwgUFJNX0lSUVNUQVRVU19NUFUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVkNfUkFFUlJfU1RfU0hJRlQJCQkJCSgxIDw8IDEyKQorI2RlZmluZSBPTUFQNDQzMF9WQ19SQUVSUl9TVF9NQVNLCQkJCQlCSVRGSUVMRCgxMiwgMTIpCisKKy8qIFVzZWQgYnkgUFJNX0lSUUVOQUJMRV9EVUNBVEksIFBSTV9JUlFFTkFCTEVfTVBVICovCisjZGVmaW5lIE9NQVA0NDMwX1ZDX1NBRVJSX0VOX1NISUZUCQkJCQkoMSA8PCAxMSkKKyNkZWZpbmUgT01BUDQ0MzBfVkNfU0FFUlJfRU5fTUFTSwkJCQkJQklURklFTEQoMTEsIDExKQorCisvKiBVc2VkIGJ5IFBSTV9JUlFTVEFUVVNfRFVDQVRJLCBQUk1fSVJRU1RBVFVTX01QVSAqLworI2RlZmluZSBPTUFQNDQzMF9WQ19TQUVSUl9TVF9TSElGVAkJCQkJKDEgPDwgMTEpCisjZGVmaW5lIE9NQVA0NDMwX1ZDX1NBRVJSX1NUX01BU0sJCQkJCUJJVEZJRUxEKDExLCAxMSkKKworLyogVXNlZCBieSBQUk1fSVJRRU5BQkxFX0RVQ0FUSSwgUFJNX0lSUUVOQUJMRV9NUFUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVkNfVE9FUlJfRU5fU0hJRlQJCQkJCSgxIDw8IDEzKQorI2RlZmluZSBPTUFQNDQzMF9WQ19UT0VSUl9FTl9NQVNLCQkJCQlCSVRGSUVMRCgxMywgMTMpCisKKy8qIFVzZWQgYnkgUFJNX0lSUVNUQVRVU19EVUNBVEksIFBSTV9JUlFTVEFUVVNfTVBVICovCisjZGVmaW5lIE9NQVA0NDMwX1ZDX1RPRVJSX1NUX1NISUZUCQkJCQkoMSA8PCAxMykKKyNkZWZpbmUgT01BUDQ0MzBfVkNfVE9FUlJfU1RfTUFTSwkJCQkJQklURklFTEQoMTMsIDEzKQorCisvKiBVc2VkIGJ5IFBSTV9WUF9DT1JFX1ZMSU1JVFRPLCBQUk1fVlBfSVZBX1ZMSU1JVFRPLCBQUk1fVlBfTVBVX1ZMSU1JVFRPICovCisjZGVmaW5lIE9NQVA0NDMwX1ZERE1BWF9TSElGVAkJCQkJCSgxIDw8IDI0KQorI2RlZmluZSBPTUFQNDQzMF9WRERNQVhfTUFTSwkJCQkJCUJJVEZJRUxEKDI0LCAzMSkKKworLyogVXNlZCBieSBQUk1fVlBfQ09SRV9WTElNSVRUTywgUFJNX1ZQX0lWQV9WTElNSVRUTywgUFJNX1ZQX01QVV9WTElNSVRUTyAqLworI2RlZmluZSBPTUFQNDQzMF9WRERNSU5fU0hJRlQJCQkJCQkoMSA8PCAxNikKKyNkZWZpbmUgT01BUDQ0MzBfVkRETUlOX01BU0sJCQkJCQlCSVRGSUVMRCgxNiwgMjMpCisKKy8qIFVzZWQgYnkgUFJNX1ZPTFRDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX1ZERF9DT1JFX0kyQ19ESVNBQkxFX1NISUZUCQkJCSgxIDw8IDEyKQorI2RlZmluZSBPTUFQNDQzMF9WRERfQ09SRV9JMkNfRElTQUJMRV9NQVNLCQkJCUJJVEZJRUxEKDEyLCAxMikKKworLyogVXNlZCBieSBQUk1fUlNUU1QgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVkREX0NPUkVfVk9MVF9NR1JfUlNUX1NISUZUCQkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX1ZERF9DT1JFX1ZPTFRfTUdSX1JTVF9NQVNLCQkJCUJJVEZJRUxEKDgsIDgpCisKKy8qIFVzZWQgYnkgUFJNX1ZPTFRDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX1ZERF9JVkFfSTJDX0RJU0FCTEVfU0hJRlQJCQkJKDEgPDwgMTQpCisjZGVmaW5lIE9NQVA0NDMwX1ZERF9JVkFfSTJDX0RJU0FCTEVfTUFTSwkJCQlCSVRGSUVMRCgxNCwgMTQpCisKKy8qIFVzZWQgYnkgUFJNX1ZPTFRDVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX1ZERF9JVkFfUFJFU0VOQ0VfU0hJRlQJCQkJCSgxIDw8IDkpCisjZGVmaW5lIE9NQVA0NDMwX1ZERF9JVkFfUFJFU0VOQ0VfTUFTSwkJCQkJQklURklFTEQoOSwgOSkKKworLyogVXNlZCBieSBQUk1fUlNUU1QgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVkREX0lWQV9WT0xUX01HUl9SU1RfU0hJRlQJCQkJKDEgPDwgNykKKyNkZWZpbmUgT01BUDQ0MzBfVkREX0lWQV9WT0xUX01HUl9SU1RfTUFTSwkJCQlCSVRGSUVMRCg3LCA3KQorCisvKiBVc2VkIGJ5IFBSTV9WT0xUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9WRERfTVBVX0kyQ19ESVNBQkxFX1NISUZUCQkJCSgxIDw8IDEzKQorI2RlZmluZSBPTUFQNDQzMF9WRERfTVBVX0kyQ19ESVNBQkxFX01BU0sJCQkJQklURklFTEQoMTMsIDEzKQorCisvKiBVc2VkIGJ5IFBSTV9WT0xUQ1RSTCAqLworI2RlZmluZSBPTUFQNDQzMF9WRERfTVBVX1BSRVNFTkNFX1NISUZUCQkJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9WRERfTVBVX1BSRVNFTkNFX01BU0sJCQkJCUJJVEZJRUxEKDgsIDgpCisKKy8qIFVzZWQgYnkgUFJNX1JTVFNUICovCisjZGVmaW5lIE9NQVA0NDMwX1ZERF9NUFVfVk9MVF9NR1JfUlNUX1NISUZUCQkJCSgxIDw8IDYpCisjZGVmaW5lIE9NQVA0NDMwX1ZERF9NUFVfVk9MVF9NR1JfUlNUX01BU0sJCQkJQklURklFTEQoNiwgNikKKworLyogVXNlZCBieSBQUk1fVkNfVkFMX1NNUFNfUkFfVk9MICovCisjZGVmaW5lIE9NQVA0NDMwX1ZPTFJBX1ZERF9DT1JFX0xfU0hJRlQJCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1ZPTFJBX1ZERF9DT1JFX0xfTUFTSwkJCQkJQklURklFTEQoMCwgNykKKworLyogVXNlZCBieSBQUk1fVkNfVkFMX1NNUFNfUkFfVk9MICovCisjZGVmaW5lIE9NQVA0NDMwX1ZPTFJBX1ZERF9JVkFfTF9TSElGVAkJCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfVk9MUkFfVkREX0lWQV9MX01BU0sJCQkJCUJJVEZJRUxEKDgsIDE1KQorCisvKiBVc2VkIGJ5IFBSTV9WQ19WQUxfU01QU19SQV9WT0wgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVk9MUkFfVkREX01QVV9MX1NISUZUCQkJCQkoMSA8PCAxNikKKyNkZWZpbmUgT01BUDQ0MzBfVk9MUkFfVkREX01QVV9MX01BU0sJCQkJCUJJVEZJRUxEKDE2LCAyMykKKworLyogVXNlZCBieSBQUk1fVlBfQ09SRV9DT05GSUcsIFBSTV9WUF9JVkFfQ09ORklHLCBQUk1fVlBfTVBVX0NPTkZJRyAqLworI2RlZmluZSBPTUFQNDQzMF9WUEVOQUJMRV9TSElGVAkJCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1ZQRU5BQkxFX01BU0sJCQkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IFBSTV9WUF9DT1JFX1NUQVRVUywgUFJNX1ZQX0lWQV9TVEFUVVMsIFBSTV9WUF9NUFVfU1RBVFVTICovCisjZGVmaW5lIE9NQVA0NDMwX1ZQSU5JRExFX1NISUZUCQkJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfVlBJTklETEVfTUFTSwkJCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUFJNX1ZQX0NPUkVfVk9MVEFHRSwgUFJNX1ZQX0lWQV9WT0xUQUdFLCBQUk1fVlBfTVBVX1ZPTFRBR0UgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVlBWT0xUQUdFX1NISUZUCQkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9WUFZPTFRBR0VfTUFTSwkJCQkJCUJJVEZJRUxEKDAsIDcpCisKKy8qIFVzZWQgYnkgUFJNX0lSUUVOQUJMRV9EVUNBVEksIFBSTV9JUlFFTkFCTEVfTVBVICovCisjZGVmaW5lIE9NQVA0NDMwX1ZQX0NPUkVfRVFWQUxVRV9FTl9TSElGVAkJCQkoMSA8PCAyMCkKKyNkZWZpbmUgT01BUDQ0MzBfVlBfQ09SRV9FUVZBTFVFX0VOX01BU0sJCQkJQklURklFTEQoMjAsIDIwKQorCisvKiBVc2VkIGJ5IFBSTV9JUlFTVEFUVVNfRFVDQVRJLCBQUk1fSVJRU1RBVFVTX01QVSAqLworI2RlZmluZSBPTUFQNDQzMF9WUF9DT1JFX0VRVkFMVUVfU1RfU0hJRlQJCQkJKDEgPDwgMjApCisjZGVmaW5lIE9NQVA0NDMwX1ZQX0NPUkVfRVFWQUxVRV9TVF9NQVNLCQkJCUJJVEZJRUxEKDIwLCAyMCkKKworLyogVXNlZCBieSBQUk1fSVJRRU5BQkxFX0RVQ0FUSSwgUFJNX0lSUUVOQUJMRV9NUFUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVlBfQ09SRV9NQVhWRERfRU5fU0hJRlQJCQkJKDEgPDwgMTgpCisjZGVmaW5lIE9NQVA0NDMwX1ZQX0NPUkVfTUFYVkREX0VOX01BU0sJCQkJCUJJVEZJRUxEKDE4LCAxOCkKKworLyogVXNlZCBieSBQUk1fSVJRU1RBVFVTX0RVQ0FUSSwgUFJNX0lSUVNUQVRVU19NUFUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVlBfQ09SRV9NQVhWRERfU1RfU0hJRlQJCQkJKDEgPDwgMTgpCisjZGVmaW5lIE9NQVA0NDMwX1ZQX0NPUkVfTUFYVkREX1NUX01BU0sJCQkJCUJJVEZJRUxEKDE4LCAxOCkKKworLyogVXNlZCBieSBQUk1fSVJRRU5BQkxFX0RVQ0FUSSwgUFJNX0lSUUVOQUJMRV9NUFUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVlBfQ09SRV9NSU5WRERfRU5fU0hJRlQJCQkJKDEgPDwgMTcpCisjZGVmaW5lIE9NQVA0NDMwX1ZQX0NPUkVfTUlOVkREX0VOX01BU0sJCQkJCUJJVEZJRUxEKDE3LCAxNykKKworLyogVXNlZCBieSBQUk1fSVJRU1RBVFVTX0RVQ0FUSSwgUFJNX0lSUVNUQVRVU19NUFUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVlBfQ09SRV9NSU5WRERfU1RfU0hJRlQJCQkJKDEgPDwgMTcpCisjZGVmaW5lIE9NQVA0NDMwX1ZQX0NPUkVfTUlOVkREX1NUX01BU0sJCQkJCUJJVEZJRUxEKDE3LCAxNykKKworLyogVXNlZCBieSBQUk1fSVJRRU5BQkxFX0RVQ0FUSSwgUFJNX0lSUUVOQUJMRV9NUFUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVlBfQ09SRV9OT1NNUFNBQ0tfRU5fU0hJRlQJCQkJKDEgPDwgMTkpCisjZGVmaW5lIE9NQVA0NDMwX1ZQX0NPUkVfTk9TTVBTQUNLX0VOX01BU0sJCQkJQklURklFTEQoMTksIDE5KQorCisvKiBVc2VkIGJ5IFBSTV9JUlFTVEFUVVNfRFVDQVRJLCBQUk1fSVJRU1RBVFVTX01QVSAqLworI2RlZmluZSBPTUFQNDQzMF9WUF9DT1JFX05PU01QU0FDS19TVF9TSElGVAkJCQkoMSA8PCAxOSkKKyNkZWZpbmUgT01BUDQ0MzBfVlBfQ09SRV9OT1NNUFNBQ0tfU1RfTUFTSwkJCQlCSVRGSUVMRCgxOSwgMTkpCisKKy8qIFVzZWQgYnkgUFJNX0lSUUVOQUJMRV9EVUNBVEksIFBSTV9JUlFFTkFCTEVfTVBVICovCisjZGVmaW5lIE9NQVA0NDMwX1ZQX0NPUkVfT1BQQ0hBTkdFRE9ORV9FTl9TSElGVAkJCQkoMSA8PCAxNikKKyNkZWZpbmUgT01BUDQ0MzBfVlBfQ09SRV9PUFBDSEFOR0VET05FX0VOX01BU0sJCQkJQklURklFTEQoMTYsIDE2KQorCisvKiBVc2VkIGJ5IFBSTV9JUlFTVEFUVVNfRFVDQVRJLCBQUk1fSVJRU1RBVFVTX01QVSAqLworI2RlZmluZSBPTUFQNDQzMF9WUF9DT1JFX09QUENIQU5HRURPTkVfU1RfU0hJRlQJCQkJKDEgPDwgMTYpCisjZGVmaW5lIE9NQVA0NDMwX1ZQX0NPUkVfT1BQQ0hBTkdFRE9ORV9TVF9NQVNLCQkJCUJJVEZJRUxEKDE2LCAxNikKKworLyogVXNlZCBieSBQUk1fSVJRRU5BQkxFX0RVQ0FUSSwgUFJNX0lSUUVOQUJMRV9NUFUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVlBfQ09SRV9UUkFOWERPTkVfRU5fU0hJRlQJCQkJKDEgPDwgMjEpCisjZGVmaW5lIE9NQVA0NDMwX1ZQX0NPUkVfVFJBTlhET05FX0VOX01BU0sJCQkJQklURklFTEQoMjEsIDIxKQorCisvKiBVc2VkIGJ5IFBSTV9JUlFTVEFUVVNfRFVDQVRJLCBQUk1fSVJRU1RBVFVTX01QVSAqLworI2RlZmluZSBPTUFQNDQzMF9WUF9DT1JFX1RSQU5YRE9ORV9TVF9TSElGVAkJCQkoMSA8PCAyMSkKKyNkZWZpbmUgT01BUDQ0MzBfVlBfQ09SRV9UUkFOWERPTkVfU1RfTUFTSwkJCQlCSVRGSUVMRCgyMSwgMjEpCisKKy8qIFVzZWQgYnkgUFJNX0lSUUVOQUJMRV9EVUNBVEksIFBSTV9JUlFFTkFCTEVfTVBVICovCisjZGVmaW5lIE9NQVA0NDMwX1ZQX0lWQV9FUVZBTFVFX0VOX1NISUZUCQkJCSgxIDw8IDI4KQorI2RlZmluZSBPTUFQNDQzMF9WUF9JVkFfRVFWQUxVRV9FTl9NQVNLCQkJCQlCSVRGSUVMRCgyOCwgMjgpCisKKy8qIFVzZWQgYnkgUFJNX0lSUVNUQVRVU19EVUNBVEksIFBSTV9JUlFTVEFUVVNfTVBVICovCisjZGVmaW5lIE9NQVA0NDMwX1ZQX0lWQV9FUVZBTFVFX1NUX1NISUZUCQkJCSgxIDw8IDI4KQorI2RlZmluZSBPTUFQNDQzMF9WUF9JVkFfRVFWQUxVRV9TVF9NQVNLCQkJCQlCSVRGSUVMRCgyOCwgMjgpCisKKy8qIFVzZWQgYnkgUFJNX0lSUUVOQUJMRV9EVUNBVEksIFBSTV9JUlFFTkFCTEVfTVBVICovCisjZGVmaW5lIE9NQVA0NDMwX1ZQX0lWQV9NQVhWRERfRU5fU0hJRlQJCQkJCSgxIDw8IDI2KQorI2RlZmluZSBPTUFQNDQzMF9WUF9JVkFfTUFYVkREX0VOX01BU0sJCQkJCUJJVEZJRUxEKDI2LCAyNikKKworLyogVXNlZCBieSBQUk1fSVJRU1RBVFVTX0RVQ0FUSSwgUFJNX0lSUVNUQVRVU19NUFUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVlBfSVZBX01BWFZERF9TVF9TSElGVAkJCQkJKDEgPDwgMjYpCisjZGVmaW5lIE9NQVA0NDMwX1ZQX0lWQV9NQVhWRERfU1RfTUFTSwkJCQkJQklURklFTEQoMjYsIDI2KQorCisvKiBVc2VkIGJ5IFBSTV9JUlFFTkFCTEVfRFVDQVRJLCBQUk1fSVJRRU5BQkxFX01QVSAqLworI2RlZmluZSBPTUFQNDQzMF9WUF9JVkFfTUlOVkREX0VOX1NISUZUCQkJCQkoMSA8PCAyNSkKKyNkZWZpbmUgT01BUDQ0MzBfVlBfSVZBX01JTlZERF9FTl9NQVNLCQkJCQlCSVRGSUVMRCgyNSwgMjUpCisKKy8qIFVzZWQgYnkgUFJNX0lSUVNUQVRVU19EVUNBVEksIFBSTV9JUlFTVEFUVVNfTVBVICovCisjZGVmaW5lIE9NQVA0NDMwX1ZQX0lWQV9NSU5WRERfU1RfU0hJRlQJCQkJCSgxIDw8IDI1KQorI2RlZmluZSBPTUFQNDQzMF9WUF9JVkFfTUlOVkREX1NUX01BU0sJCQkJCUJJVEZJRUxEKDI1LCAyNSkKKworLyogVXNlZCBieSBQUk1fSVJRRU5BQkxFX0RVQ0FUSSwgUFJNX0lSUUVOQUJMRV9NUFUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVlBfSVZBX05PU01QU0FDS19FTl9TSElGVAkJCQkoMSA8PCAyNykKKyNkZWZpbmUgT01BUDQ0MzBfVlBfSVZBX05PU01QU0FDS19FTl9NQVNLCQkJCUJJVEZJRUxEKDI3LCAyNykKKworLyogVXNlZCBieSBQUk1fSVJRU1RBVFVTX0RVQ0FUSSwgUFJNX0lSUVNUQVRVU19NUFUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVlBfSVZBX05PU01QU0FDS19TVF9TSElGVAkJCQkoMSA8PCAyNykKKyNkZWZpbmUgT01BUDQ0MzBfVlBfSVZBX05PU01QU0FDS19TVF9NQVNLCQkJCUJJVEZJRUxEKDI3LCAyNykKKworLyogVXNlZCBieSBQUk1fSVJRRU5BQkxFX0RVQ0FUSSwgUFJNX0lSUUVOQUJMRV9NUFUgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVlBfSVZBX09QUENIQU5HRURPTkVfRU5fU0hJRlQJCQkJKDEgPDwgMjQpCisjZGVmaW5lIE9NQVA0NDMwX1ZQX0lWQV9PUFBDSEFOR0VET05FX0VOX01BU0sJCQkJQklURklFTEQoMjQsIDI0KQorCisvKiBVc2VkIGJ5IFBSTV9JUlFTVEFUVVNfRFVDQVRJLCBQUk1fSVJRU1RBVFVTX01QVSAqLworI2RlZmluZSBPTUFQNDQzMF9WUF9JVkFfT1BQQ0hBTkdFRE9ORV9TVF9TSElGVAkJCQkoMSA8PCAyNCkKKyNkZWZpbmUgT01BUDQ0MzBfVlBfSVZBX09QUENIQU5HRURPTkVfU1RfTUFTSwkJCQlCSVRGSUVMRCgyNCwgMjQpCisKKy8qIFVzZWQgYnkgUFJNX0lSUUVOQUJMRV9EVUNBVEksIFBSTV9JUlFFTkFCTEVfTVBVICovCisjZGVmaW5lIE9NQVA0NDMwX1ZQX0lWQV9UUkFOWERPTkVfRU5fU0hJRlQJCQkJKDEgPDwgMjkpCisjZGVmaW5lIE9NQVA0NDMwX1ZQX0lWQV9UUkFOWERPTkVfRU5fTUFTSwkJCQlCSVRGSUVMRCgyOSwgMjkpCisKKy8qIFVzZWQgYnkgUFJNX0lSUVNUQVRVU19EVUNBVEksIFBSTV9JUlFTVEFUVVNfTVBVICovCisjZGVmaW5lIE9NQVA0NDMwX1ZQX0lWQV9UUkFOWERPTkVfU1RfU0hJRlQJCQkJKDEgPDwgMjkpCisjZGVmaW5lIE9NQVA0NDMwX1ZQX0lWQV9UUkFOWERPTkVfU1RfTUFTSwkJCQlCSVRGSUVMRCgyOSwgMjkpCisKKy8qIFVzZWQgYnkgUFJNX0lSUUVOQUJMRV9NUFVfMiAqLworI2RlZmluZSBPTUFQNDQzMF9WUF9NUFVfRVFWQUxVRV9FTl9TSElGVAkJCQkoMSA8PCA0KQorI2RlZmluZSBPTUFQNDQzMF9WUF9NUFVfRVFWQUxVRV9FTl9NQVNLCQkJCQlCSVRGSUVMRCg0LCA0KQorCisvKiBVc2VkIGJ5IFBSTV9JUlFTVEFUVVNfTVBVXzIgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVlBfTVBVX0VRVkFMVUVfU1RfU0hJRlQJCQkJKDEgPDwgNCkKKyNkZWZpbmUgT01BUDQ0MzBfVlBfTVBVX0VRVkFMVUVfU1RfTUFTSwkJCQkJQklURklFTEQoNCwgNCkKKworLyogVXNlZCBieSBQUk1fSVJRRU5BQkxFX01QVV8yICovCisjZGVmaW5lIE9NQVA0NDMwX1ZQX01QVV9NQVhWRERfRU5fU0hJRlQJCQkJCSgxIDw8IDIpCisjZGVmaW5lIE9NQVA0NDMwX1ZQX01QVV9NQVhWRERfRU5fTUFTSwkJCQkJQklURklFTEQoMiwgMikKKworLyogVXNlZCBieSBQUk1fSVJRU1RBVFVTX01QVV8yICovCisjZGVmaW5lIE9NQVA0NDMwX1ZQX01QVV9NQVhWRERfU1RfU0hJRlQJCQkJCSgxIDw8IDIpCisjZGVmaW5lIE9NQVA0NDMwX1ZQX01QVV9NQVhWRERfU1RfTUFTSwkJCQkJQklURklFTEQoMiwgMikKKworLyogVXNlZCBieSBQUk1fSVJRRU5BQkxFX01QVV8yICovCisjZGVmaW5lIE9NQVA0NDMwX1ZQX01QVV9NSU5WRERfRU5fU0hJRlQJCQkJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVA0NDMwX1ZQX01QVV9NSU5WRERfRU5fTUFTSwkJCQkJQklURklFTEQoMSwgMSkKKworLyogVXNlZCBieSBQUk1fSVJRU1RBVFVTX01QVV8yICovCisjZGVmaW5lIE9NQVA0NDMwX1ZQX01QVV9NSU5WRERfU1RfU0hJRlQJCQkJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVA0NDMwX1ZQX01QVV9NSU5WRERfU1RfTUFTSwkJCQkJQklURklFTEQoMSwgMSkKKworLyogVXNlZCBieSBQUk1fSVJRRU5BQkxFX01QVV8yICovCisjZGVmaW5lIE9NQVA0NDMwX1ZQX01QVV9OT1NNUFNBQ0tfRU5fU0hJRlQJCQkJKDEgPDwgMykKKyNkZWZpbmUgT01BUDQ0MzBfVlBfTVBVX05PU01QU0FDS19FTl9NQVNLCQkJCUJJVEZJRUxEKDMsIDMpCisKKy8qIFVzZWQgYnkgUFJNX0lSUVNUQVRVU19NUFVfMiAqLworI2RlZmluZSBPTUFQNDQzMF9WUF9NUFVfTk9TTVBTQUNLX1NUX1NISUZUCQkJCSgxIDw8IDMpCisjZGVmaW5lIE9NQVA0NDMwX1ZQX01QVV9OT1NNUFNBQ0tfU1RfTUFTSwkJCQlCSVRGSUVMRCgzLCAzKQorCisvKiBVc2VkIGJ5IFBSTV9JUlFFTkFCTEVfTVBVXzIgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVlBfTVBVX09QUENIQU5HRURPTkVfRU5fU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfVlBfTVBVX09QUENIQU5HRURPTkVfRU5fTUFTSwkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IFBSTV9JUlFTVEFUVVNfTVBVXzIgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVlBfTVBVX09QUENIQU5HRURPTkVfU1RfU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfVlBfTVBVX09QUENIQU5HRURPTkVfU1RfTUFTSwkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IFBSTV9JUlFFTkFCTEVfTVBVXzIgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVlBfTVBVX1RSQU5YRE9ORV9FTl9TSElGVAkJCQkoMSA8PCA1KQorI2RlZmluZSBPTUFQNDQzMF9WUF9NUFVfVFJBTlhET05FX0VOX01BU0sJCQkJQklURklFTEQoNSwgNSkKKworLyogVXNlZCBieSBQUk1fSVJRU1RBVFVTX01QVV8yICovCisjZGVmaW5lIE9NQVA0NDMwX1ZQX01QVV9UUkFOWERPTkVfU1RfU0hJRlQJCQkJKDEgPDwgNSkKKyNkZWZpbmUgT01BUDQ0MzBfVlBfTVBVX1RSQU5YRE9ORV9TVF9NQVNLCQkJCUJJVEZJRUxEKDUsIDUpCisKKy8qIFVzZWQgYnkgUFJNX1NSQU1fQ09VTlQgKi8KKyNkZWZpbmUgT01BUDQ0MzBfVlNFVFVQQ05UX1ZBTFVFX1NISUZUCQkJCQkoMSA8PCA4KQorI2RlZmluZSBPTUFQNDQzMF9WU0VUVVBDTlRfVkFMVUVfTUFTSwkJCQkJQklURklFTEQoOCwgMTUpCisKKy8qIFVzZWQgYnkgUFJNX1ZQX0NPUkVfVlNURVBNQVgsIFBSTV9WUF9JVkFfVlNURVBNQVgsIFBSTV9WUF9NUFVfVlNURVBNQVggKi8KKyNkZWZpbmUgT01BUDQ0MzBfVlNURVBNQVhfU0hJRlQJCQkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9WU1RFUE1BWF9NQVNLCQkJCQkJQklURklFTEQoMCwgNykKKworLyogVXNlZCBieSBQUk1fVlBfQ09SRV9WU1RFUE1JTiwgUFJNX1ZQX0lWQV9WU1RFUE1JTiwgUFJNX1ZQX01QVV9WU1RFUE1JTiAqLworI2RlZmluZSBPTUFQNDQzMF9WU1RFUE1JTl9TSElGVAkJCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1ZTVEVQTUlOX01BU0sJCQkJCQlCSVRGSUVMRCgwLCA3KQorCisvKiBVc2VkIGJ5IFBSTV9NT0RFTV9JRl9DVFJMICovCisjZGVmaW5lIE9NQVA0NDMwX1dBS0VfTU9ERU1fU0hJRlQJCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1dBS0VfTU9ERU1fTUFTSwkJCQkJQklURklFTEQoMCwgMCkKKworLyogVXNlZCBieSBQTV9EU1NfRFNTX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfRElTUENfRFVDQVRJX1NISUZUCQkJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfRElTUENfRFVDQVRJX01BU0sJCQkJQklURklFTEQoMSwgMSkKKworLyogVXNlZCBieSBQTV9EU1NfRFNTX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfRElTUENfTVBVX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfRElTUENfTVBVX01BU0sJCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fRFNTX0RTU19XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0RJU1BDX1NETUFfU0hJRlQJCQkJKDEgPDwgMykKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9ESVNQQ19TRE1BX01BU0sJCQkJQklURklFTEQoMywgMykKKworLyogVXNlZCBieSBQTV9EU1NfRFNTX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfRElTUENfVEVTTEFfU0hJRlQJCQkJKDEgPDwgMikKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9ESVNQQ19URVNMQV9NQVNLCQkJCUJJVEZJRUxEKDIsIDIpCisKKy8qIFVzZWQgYnkgUE1fQUJFX0RNSUNfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9ETUlDX0RNQV9TRE1BX1NISUZUCQkJCSgxIDw8IDcpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfRE1JQ19ETUFfU0RNQV9NQVNLCQkJCUJJVEZJRUxEKDcsIDcpCisKKy8qIFVzZWQgYnkgUE1fQUJFX0RNSUNfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9ETUlDX0RNQV9URVNMQV9TSElGVAkJCQkoMSA8PCA2KQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0RNSUNfRE1BX1RFU0xBX01BU0sJCQkJQklURklFTEQoNiwgNikKKworLyogVXNlZCBieSBQTV9BQkVfRE1JQ19XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0RNSUNfSVJRX01QVV9TSElGVAkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0RNSUNfSVJRX01QVV9NQVNLCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fQUJFX0RNSUNfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9ETUlDX0lSUV9URVNMQV9TSElGVAkJCQkoMSA8PCAyKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0RNSUNfSVJRX1RFU0xBX01BU0sJCQkJQklURklFTEQoMiwgMikKKworLyogVXNlZCBieSBQTV9MNFBFUl9ETVRJTUVSMTBfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9ETVRJTUVSMTBfTVBVX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfRE1USU1FUjEwX01QVV9NQVNLCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfRE1USU1FUjExX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfRE1USU1FUjExX0RVQ0FUSV9TSElGVAkJCQkoMSA8PCAxKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0RNVElNRVIxMV9EVUNBVElfTUFTSwkJCQlCSVRGSUVMRCgxLCAxKQorCisvKiBVc2VkIGJ5IFBNX0w0UEVSX0RNVElNRVIxMV9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0RNVElNRVIxMV9NUFVfU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9ETVRJTUVSMTFfTVBVX01BU0sJCQkJQklURklFTEQoMCwgMCkKKworLyogVXNlZCBieSBQTV9MNFBFUl9ETVRJTUVSMl9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0RNVElNRVIyX01QVV9TSElGVAkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0RNVElNRVIyX01QVV9NQVNLCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfRE1USU1FUjNfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9ETVRJTUVSM19EVUNBVElfU0hJRlQJCQkJKDEgPDwgMSkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9ETVRJTUVSM19EVUNBVElfTUFTSwkJCQlCSVRGSUVMRCgxLCAxKQorCisvKiBVc2VkIGJ5IFBNX0w0UEVSX0RNVElNRVIzX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfRE1USU1FUjNfTVBVX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfRE1USU1FUjNfTVBVX01BU0sJCQkJQklURklFTEQoMCwgMCkKKworLyogVXNlZCBieSBQTV9MNFBFUl9ETVRJTUVSNF9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0RNVElNRVI0X0RVQ0FUSV9TSElGVAkJCQkoMSA8PCAxKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0RNVElNRVI0X0RVQ0FUSV9NQVNLCQkJCUJJVEZJRUxEKDEsIDEpCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfRE1USU1FUjRfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9ETVRJTUVSNF9NUFVfU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9ETVRJTUVSNF9NUFVfTUFTSwkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IFBNX0w0UEVSX0RNVElNRVI5X1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfRE1USU1FUjlfRFVDQVRJX1NISUZUCQkJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfRE1USU1FUjlfRFVDQVRJX01BU0sJCQkJQklURklFTEQoMSwgMSkKKworLyogVXNlZCBieSBQTV9MNFBFUl9ETVRJTUVSOV9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0RNVElNRVI5X01QVV9TSElGVAkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0RNVElNRVI5X01QVV9NQVNLCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fRFNTX0RTU19XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0RTSTFfRFVDQVRJX1NISUZUCQkJCSgxIDw8IDUpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfRFNJMV9EVUNBVElfTUFTSwkJCQlCSVRGSUVMRCg1LCA1KQorCisvKiBVc2VkIGJ5IFBNX0RTU19EU1NfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9EU0kxX01QVV9TSElGVAkJCQkJKDEgPDwgNCkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9EU0kxX01QVV9NQVNLCQkJCQlCSVRGSUVMRCg0LCA0KQorCisvKiBVc2VkIGJ5IFBNX0RTU19EU1NfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9EU0kxX1NETUFfU0hJRlQJCQkJKDEgPDwgNykKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9EU0kxX1NETUFfTUFTSwkJCQkJQklURklFTEQoNywgNykKKworLyogVXNlZCBieSBQTV9EU1NfRFNTX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfRFNJMV9URVNMQV9TSElGVAkJCQkoMSA8PCA2KQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0RTSTFfVEVTTEFfTUFTSwkJCQlCSVRGSUVMRCg2LCA2KQorCisvKiBVc2VkIGJ5IFBNX0RTU19EU1NfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9EU0kyX0RVQ0FUSV9TSElGVAkJCQkoMSA8PCA5KQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0RTSTJfRFVDQVRJX01BU0sJCQkJQklURklFTEQoOSwgOSkKKworLyogVXNlZCBieSBQTV9EU1NfRFNTX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfRFNJMl9NUFVfU0hJRlQJCQkJCSgxIDw8IDgpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfRFNJMl9NUFVfTUFTSwkJCQkJQklURklFTEQoOCwgOCkKKworLyogVXNlZCBieSBQTV9EU1NfRFNTX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfRFNJMl9TRE1BX1NISUZUCQkJCSgxIDw8IDExKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0RTSTJfU0RNQV9NQVNLCQkJCQlCSVRGSUVMRCgxMSwgMTEpCisKKy8qIFVzZWQgYnkgUE1fRFNTX0RTU19XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0RTSTJfVEVTTEFfU0hJRlQJCQkJKDEgPDwgMTApCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfRFNJMl9URVNMQV9NQVNLCQkJCUJJVEZJRUxEKDEwLCAxMCkKKworLyogVXNlZCBieSBQTV9XS1VQX0dQSU8xX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfR1BJTzFfSVJRMV9EVUNBVElfU0hJRlQJCQkoMSA8PCAxKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0dQSU8xX0lSUTFfRFVDQVRJX01BU0sJCQkJQklURklFTEQoMSwgMSkKKworLyogVXNlZCBieSBQTV9XS1VQX0dQSU8xX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfR1BJTzFfSVJRMV9NUFVfU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9HUElPMV9JUlExX01QVV9NQVNLCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fV0tVUF9HUElPMV9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0dQSU8xX0lSUTJfVEVTTEFfU0hJRlQJCQkJKDEgPDwgNikKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9HUElPMV9JUlEyX1RFU0xBX01BU0sJCQkJQklURklFTEQoNiwgNikKKworLyogVXNlZCBieSBQTV9MNFBFUl9HUElPMl9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0dQSU8yX0lSUTFfRFVDQVRJX1NISUZUCQkJKDEgPDwgMSkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9HUElPMl9JUlExX0RVQ0FUSV9NQVNLCQkJCUJJVEZJRUxEKDEsIDEpCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfR1BJTzJfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9HUElPMl9JUlExX01QVV9TSElGVAkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0dQSU8yX0lSUTFfTVBVX01BU0sJCQkJQklURklFTEQoMCwgMCkKKworLyogVXNlZCBieSBQTV9MNFBFUl9HUElPMl9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0dQSU8yX0lSUTJfVEVTTEFfU0hJRlQJCQkJKDEgPDwgNikKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9HUElPMl9JUlEyX1RFU0xBX01BU0sJCQkJQklURklFTEQoNiwgNikKKworLyogVXNlZCBieSBQTV9MNFBFUl9HUElPM19XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0dQSU8zX0lSUTFfTVBVX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfR1BJTzNfSVJRMV9NUFVfTUFTSwkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IFBNX0w0UEVSX0dQSU8zX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfR1BJTzNfSVJRMl9URVNMQV9TSElGVAkJCQkoMSA8PCA2KQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0dQSU8zX0lSUTJfVEVTTEFfTUFTSwkJCQlCSVRGSUVMRCg2LCA2KQorCisvKiBVc2VkIGJ5IFBNX0w0UEVSX0dQSU80X1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfR1BJTzRfSVJRMV9NUFVfU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9HUElPNF9JUlExX01QVV9NQVNLCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfR1BJTzRfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9HUElPNF9JUlEyX1RFU0xBX1NISUZUCQkJCSgxIDw8IDYpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfR1BJTzRfSVJRMl9URVNMQV9NQVNLCQkJCUJJVEZJRUxEKDYsIDYpCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfR1BJTzVfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9HUElPNV9JUlExX01QVV9TSElGVAkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0dQSU81X0lSUTFfTVBVX01BU0sJCQkJQklURklFTEQoMCwgMCkKKworLyogVXNlZCBieSBQTV9MNFBFUl9HUElPNV9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0dQSU81X0lSUTJfVEVTTEFfU0hJRlQJCQkJKDEgPDwgNikKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9HUElPNV9JUlEyX1RFU0xBX01BU0sJCQkJQklURklFTEQoNiwgNikKKworLyogVXNlZCBieSBQTV9MNFBFUl9HUElPNl9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0dQSU82X0lSUTFfTVBVX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfR1BJTzZfSVJRMV9NUFVfTUFTSwkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IFBNX0w0UEVSX0dQSU82X1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfR1BJTzZfSVJRMl9URVNMQV9TSElGVAkJCQkoMSA8PCA2KQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0dQSU82X0lSUTJfVEVTTEFfTUFTSwkJCQlCSVRGSUVMRCg2LCA2KQorCisvKiBVc2VkIGJ5IFBNX0RTU19EU1NfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9IRE1JRE1BX1NETUFfU0hJRlQJCQkJKDEgPDwgMTkpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfSERNSURNQV9TRE1BX01BU0sJCQkJQklURklFTEQoMTksIDE5KQorCisvKiBVc2VkIGJ5IFBNX0RTU19EU1NfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9IRE1JSVJRX0RVQ0FUSV9TSElGVAkJCQkoMSA8PCAxMykKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9IRE1JSVJRX0RVQ0FUSV9NQVNLCQkJCUJJVEZJRUxEKDEzLCAxMykKKworLyogVXNlZCBieSBQTV9EU1NfRFNTX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfSERNSUlSUV9NUFVfU0hJRlQJCQkJKDEgPDwgMTIpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfSERNSUlSUV9NUFVfTUFTSwkJCQlCSVRGSUVMRCgxMiwgMTIpCisKKy8qIFVzZWQgYnkgUE1fRFNTX0RTU19XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0hETUlJUlFfVEVTTEFfU0hJRlQJCQkJKDEgPDwgMTQpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfSERNSUlSUV9URVNMQV9NQVNLCQkJCUJJVEZJRUxEKDE0LCAxNCkKKworLyogVXNlZCBieSBQTV9MNFBFUl9IRUNDMV9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0hFQ0MxX01QVV9TSElGVAkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0hFQ0MxX01QVV9NQVNLCQkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IFBNX0w0UEVSX0hFQ0MyX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfSEVDQzJfTVBVX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfSEVDQzJfTVBVX01BU0sJCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fTDNJTklUX0hTSV9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0hTSV9EU1BfVEVTTEFfU0hJRlQJCQkJKDEgPDwgNikKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9IU0lfRFNQX1RFU0xBX01BU0sJCQkJQklURklFTEQoNiwgNikKKworLyogVXNlZCBieSBQTV9MM0lOSVRfSFNJX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfSFNJX01DVV9EVUNBVElfU0hJRlQJCQkJKDEgPDwgMSkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9IU0lfTUNVX0RVQ0FUSV9NQVNLCQkJCUJJVEZJRUxEKDEsIDEpCisKKy8qIFVzZWQgYnkgUE1fTDNJTklUX0hTSV9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0hTSV9NQ1VfTVBVX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfSFNJX01DVV9NUFVfTUFTSwkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IFBNX0w0UEVSX0kyQzFfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9JMkMxX0RNQV9TRE1BX1NISUZUCQkJCSgxIDw8IDcpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfSTJDMV9ETUFfU0RNQV9NQVNLCQkJCUJJVEZJRUxEKDcsIDcpCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfSTJDMV9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0kyQzFfSVJRX0RVQ0FUSV9TSElGVAkJCQkoMSA8PCAxKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0kyQzFfSVJRX0RVQ0FUSV9NQVNLCQkJCUJJVEZJRUxEKDEsIDEpCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfSTJDMV9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0kyQzFfSVJRX01QVV9TSElGVAkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0kyQzFfSVJRX01QVV9NQVNLCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfSTJDMl9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0kyQzJfRE1BX1NETUFfU0hJRlQJCQkJKDEgPDwgNykKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9JMkMyX0RNQV9TRE1BX01BU0sJCQkJQklURklFTEQoNywgNykKKworLyogVXNlZCBieSBQTV9MNFBFUl9JMkMyX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfSTJDMl9JUlFfRFVDQVRJX1NISUZUCQkJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfSTJDMl9JUlFfRFVDQVRJX01BU0sJCQkJQklURklFTEQoMSwgMSkKKworLyogVXNlZCBieSBQTV9MNFBFUl9JMkMyX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfSTJDMl9JUlFfTVBVX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfSTJDMl9JUlFfTVBVX01BU0sJCQkJQklURklFTEQoMCwgMCkKKworLyogVXNlZCBieSBQTV9MNFBFUl9JMkMzX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfSTJDM19ETUFfU0RNQV9TSElGVAkJCQkoMSA8PCA3KQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0kyQzNfRE1BX1NETUFfTUFTSwkJCQlCSVRGSUVMRCg3LCA3KQorCisvKiBVc2VkIGJ5IFBNX0w0UEVSX0kyQzNfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9JMkMzX0lSUV9EVUNBVElfU0hJRlQJCQkJKDEgPDwgMSkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9JMkMzX0lSUV9EVUNBVElfTUFTSwkJCQlCSVRGSUVMRCgxLCAxKQorCisvKiBVc2VkIGJ5IFBNX0w0UEVSX0kyQzNfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9JMkMzX0lSUV9NUFVfU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9JMkMzX0lSUV9NUFVfTUFTSwkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IFBNX0w0UEVSX0kyQzRfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9JMkM0X0RNQV9TRE1BX1NISUZUCQkJCSgxIDw8IDcpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfSTJDNF9ETUFfU0RNQV9NQVNLCQkJCUJJVEZJRUxEKDcsIDcpCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfSTJDNF9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0kyQzRfSVJRX0RVQ0FUSV9TSElGVAkJCQkoMSA8PCAxKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0kyQzRfSVJRX0RVQ0FUSV9NQVNLCQkJCUJJVEZJRUxEKDEsIDEpCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfSTJDNF9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0kyQzRfSVJRX01QVV9TSElGVAkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0kyQzRfSVJRX01QVV9NQVNLCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfSTJDNV9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX0kyQzVfRE1BX1NETUFfU0hJRlQJCQkJKDEgPDwgNykKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9JMkM1X0RNQV9TRE1BX01BU0sJCQkJQklURklFTEQoNywgNykKKworLyogVXNlZCBieSBQTV9MNFBFUl9JMkM1X1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfSTJDNV9JUlFfTVBVX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfSTJDNV9JUlFfTVBVX01BU0sJCQkJQklURklFTEQoMCwgMCkKKworLyogVXNlZCBieSBQTV9XS1VQX0tFWUJPQVJEX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfS0VZQk9BUkRfTVBVX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfS0VZQk9BUkRfTVBVX01BU0sJCQkJQklURklFTEQoMCwgMCkKKworLyogVXNlZCBieSBQTV9BQkVfTUNBU1BfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NQ0FTUDFfRE1BX1NETUFfU0hJRlQJCQkJKDEgPDwgNykKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NQ0FTUDFfRE1BX1NETUFfTUFTSwkJCQlCSVRGSUVMRCg3LCA3KQorCisvKiBVc2VkIGJ5IFBNX0FCRV9NQ0FTUF9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01DQVNQMV9ETUFfVEVTTEFfU0hJRlQJCQkJKDEgPDwgNikKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NQ0FTUDFfRE1BX1RFU0xBX01BU0sJCQkJQklURklFTEQoNiwgNikKKworLyogVXNlZCBieSBQTV9BQkVfTUNBU1BfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NQ0FTUDFfSVJRX01QVV9TSElGVAkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01DQVNQMV9JUlFfTVBVX01BU0sJCQkJQklURklFTEQoMCwgMCkKKworLyogVXNlZCBieSBQTV9BQkVfTUNBU1BfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NQ0FTUDFfSVJRX1RFU0xBX1NISUZUCQkJCSgxIDw8IDIpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNBU1AxX0lSUV9URVNMQV9NQVNLCQkJCUJJVEZJRUxEKDIsIDIpCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfTUNBU1AyX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNBU1AyX0RNQV9TRE1BX1NISUZUCQkJCSgxIDw8IDcpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNBU1AyX0RNQV9TRE1BX01BU0sJCQkJQklURklFTEQoNywgNykKKworLyogVXNlZCBieSBQTV9MNFBFUl9NQ0FTUDJfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NQ0FTUDJfRE1BX1RFU0xBX1NISUZUCQkJCSgxIDw8IDYpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNBU1AyX0RNQV9URVNMQV9NQVNLCQkJCUJJVEZJRUxEKDYsIDYpCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfTUNBU1AyX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNBU1AyX0lSUV9NUFVfU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NQ0FTUDJfSVJRX01QVV9NQVNLCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfTUNBU1AyX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNBU1AyX0lSUV9URVNMQV9TSElGVAkJCQkoMSA8PCAyKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01DQVNQMl9JUlFfVEVTTEFfTUFTSwkJCQlCSVRGSUVMRCgyLCAyKQorCisvKiBVc2VkIGJ5IFBNX0w0UEVSX01DQVNQM19XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01DQVNQM19ETUFfU0RNQV9TSElGVAkJCQkoMSA8PCA3KQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01DQVNQM19ETUFfU0RNQV9NQVNLCQkJCUJJVEZJRUxEKDcsIDcpCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfTUNBU1AzX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNBU1AzX0RNQV9URVNMQV9TSElGVAkJCQkoMSA8PCA2KQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01DQVNQM19ETUFfVEVTTEFfTUFTSwkJCQlCSVRGSUVMRCg2LCA2KQorCisvKiBVc2VkIGJ5IFBNX0w0UEVSX01DQVNQM19XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01DQVNQM19JUlFfTVBVX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNBU1AzX0lSUV9NUFVfTUFTSwkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IFBNX0w0UEVSX01DQVNQM19XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01DQVNQM19JUlFfVEVTTEFfU0hJRlQJCQkJKDEgPDwgMikKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NQ0FTUDNfSVJRX1RFU0xBX01BU0sJCQkJQklURklFTEQoMiwgMikKKworLyogVXNlZCBieSBQTV9BQkVfTUNCU1AxX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNCU1AxX01QVV9TSElGVAkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01DQlNQMV9NUFVfTUFTSwkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IFBNX0FCRV9NQ0JTUDFfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NQ0JTUDFfU0RNQV9TSElGVAkJCQkoMSA8PCAzKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01DQlNQMV9TRE1BX01BU0sJCQkJQklURklFTEQoMywgMykKKworLyogVXNlZCBieSBQTV9BQkVfTUNCU1AxX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNCU1AxX1RFU0xBX1NISUZUCQkJCSgxIDw8IDIpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNCU1AxX1RFU0xBX01BU0sJCQkJQklURklFTEQoMiwgMikKKworLyogVXNlZCBieSBQTV9BQkVfTUNCU1AyX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNCU1AyX01QVV9TSElGVAkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01DQlNQMl9NUFVfTUFTSwkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IFBNX0FCRV9NQ0JTUDJfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NQ0JTUDJfU0RNQV9TSElGVAkJCQkoMSA8PCAzKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01DQlNQMl9TRE1BX01BU0sJCQkJQklURklFTEQoMywgMykKKworLyogVXNlZCBieSBQTV9BQkVfTUNCU1AyX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNCU1AyX1RFU0xBX1NISUZUCQkJCSgxIDw8IDIpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNCU1AyX1RFU0xBX01BU0sJCQkJQklURklFTEQoMiwgMikKKworLyogVXNlZCBieSBQTV9BQkVfTUNCU1AzX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNCU1AzX01QVV9TSElGVAkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01DQlNQM19NUFVfTUFTSwkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IFBNX0FCRV9NQ0JTUDNfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NQ0JTUDNfU0RNQV9TSElGVAkJCQkoMSA8PCAzKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01DQlNQM19TRE1BX01BU0sJCQkJQklURklFTEQoMywgMykKKworLyogVXNlZCBieSBQTV9BQkVfTUNCU1AzX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNCU1AzX1RFU0xBX1NISUZUCQkJCSgxIDw8IDIpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNCU1AzX1RFU0xBX01BU0sJCQkJQklURklFTEQoMiwgMikKKworLyogVXNlZCBieSBQTV9MNFBFUl9NQ0JTUDRfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NQ0JTUDRfTVBVX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNCU1A0X01QVV9NQVNLCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfTUNCU1A0X1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNCU1A0X1NETUFfU0hJRlQJCQkJKDEgPDwgMykKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NQ0JTUDRfU0RNQV9NQVNLCQkJCUJJVEZJRUxEKDMsIDMpCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfTUNCU1A0X1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNCU1A0X1RFU0xBX1NISUZUCQkJCSgxIDw8IDIpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNCU1A0X1RFU0xBX01BU0sJCQkJQklURklFTEQoMiwgMikKKworLyogVXNlZCBieSBQTV9MNFBFUl9NQ1NQSTFfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NQ1NQSTFfRFVDQVRJX1NISUZUCQkJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNTUEkxX0RVQ0FUSV9NQVNLCQkJCUJJVEZJRUxEKDEsIDEpCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfTUNTUEkxX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNTUEkxX01QVV9TSElGVAkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01DU1BJMV9NUFVfTUFTSwkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IFBNX0w0UEVSX01DU1BJMV9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01DU1BJMV9TRE1BX1NISUZUCQkJCSgxIDw8IDMpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNTUEkxX1NETUFfTUFTSwkJCQlCSVRGSUVMRCgzLCAzKQorCisvKiBVc2VkIGJ5IFBNX0w0UEVSX01DU1BJMV9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01DU1BJMV9URVNMQV9TSElGVAkJCQkoMSA8PCAyKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01DU1BJMV9URVNMQV9NQVNLCQkJCUJJVEZJRUxEKDIsIDIpCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfTUNTUEkyX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNTUEkyX0RVQ0FUSV9TSElGVAkJCQkoMSA8PCAxKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01DU1BJMl9EVUNBVElfTUFTSwkJCQlCSVRGSUVMRCgxLCAxKQorCisvKiBVc2VkIGJ5IFBNX0w0UEVSX01DU1BJMl9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01DU1BJMl9NUFVfU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NQ1NQSTJfTVBVX01BU0sJCQkJQklURklFTEQoMCwgMCkKKworLyogVXNlZCBieSBQTV9MNFBFUl9NQ1NQSTJfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NQ1NQSTJfU0RNQV9TSElGVAkJCQkoMSA8PCAzKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01DU1BJMl9TRE1BX01BU0sJCQkJQklURklFTEQoMywgMykKKworLyogVXNlZCBieSBQTV9MNFBFUl9NQ1NQSTNfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NQ1NQSTNfTVBVX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNTUEkzX01QVV9NQVNLCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfTUNTUEkzX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNTUEkzX1NETUFfU0hJRlQJCQkJKDEgPDwgMykKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NQ1NQSTNfU0RNQV9NQVNLCQkJCUJJVEZJRUxEKDMsIDMpCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfTUNTUEk0X1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNTUEk0X01QVV9TSElGVAkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01DU1BJNF9NUFVfTUFTSwkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IFBNX0w0UEVSX01DU1BJNF9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01DU1BJNF9TRE1BX1NISUZUCQkJCSgxIDw8IDMpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTUNTUEk0X1NETUFfTUFTSwkJCQlCSVRGSUVMRCgzLCAzKQorCisvKiBVc2VkIGJ5IFBNX0wzSU5JVF9NTUMxX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTU1DMV9EVUNBVElfU0hJRlQJCQkJKDEgPDwgMSkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NTUMxX0RVQ0FUSV9NQVNLCQkJCUJJVEZJRUxEKDEsIDEpCisKKy8qIFVzZWQgYnkgUE1fTDNJTklUX01NQzFfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NTUMxX01QVV9TSElGVAkJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NTUMxX01QVV9NQVNLCQkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IFBNX0wzSU5JVF9NTUMxX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTU1DMV9TRE1BX1NISUZUCQkJCSgxIDw8IDMpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTU1DMV9TRE1BX01BU0sJCQkJCUJJVEZJRUxEKDMsIDMpCisKKy8qIFVzZWQgYnkgUE1fTDNJTklUX01NQzFfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NTUMxX1RFU0xBX1NISUZUCQkJCSgxIDw8IDIpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTU1DMV9URVNMQV9NQVNLCQkJCUJJVEZJRUxEKDIsIDIpCisKKy8qIFVzZWQgYnkgUE1fTDNJTklUX01NQzJfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NTUMyX0RVQ0FUSV9TSElGVAkJCQkoMSA8PCAxKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01NQzJfRFVDQVRJX01BU0sJCQkJQklURklFTEQoMSwgMSkKKworLyogVXNlZCBieSBQTV9MM0lOSVRfTU1DMl9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01NQzJfTVBVX1NISUZUCQkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01NQzJfTVBVX01BU0sJCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fTDNJTklUX01NQzJfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NTUMyX1NETUFfU0hJRlQJCQkJKDEgPDwgMykKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NTUMyX1NETUFfTUFTSwkJCQkJQklURklFTEQoMywgMykKKworLyogVXNlZCBieSBQTV9MM0lOSVRfTU1DMl9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01NQzJfVEVTTEFfU0hJRlQJCQkJKDEgPDwgMikKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NTUMyX1RFU0xBX01BU0sJCQkJQklURklFTEQoMiwgMikKKworLyogVXNlZCBieSBQTV9MM0lOSVRfTU1DNl9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01NQzZfRFVDQVRJX1NISUZUCQkJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTU1DNl9EVUNBVElfTUFTSwkJCQlCSVRGSUVMRCgxLCAxKQorCisvKiBVc2VkIGJ5IFBNX0wzSU5JVF9NTUM2X1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTU1DNl9NUFVfU0hJRlQJCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTU1DNl9NUFVfTUFTSwkJCQkJQklURklFTEQoMCwgMCkKKworLyogVXNlZCBieSBQTV9MM0lOSVRfTU1DNl9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01NQzZfVEVTTEFfU0hJRlQJCQkJKDEgPDwgMikKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NTUM2X1RFU0xBX01BU0sJCQkJQklURklFTEQoMiwgMikKKworLyogVXNlZCBieSBQTV9MNFBFUl9NTUNTRDNfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NTUNTRDNfRFVDQVRJX1NISUZUCQkJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTU1DU0QzX0RVQ0FUSV9NQVNLCQkJCUJJVEZJRUxEKDEsIDEpCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfTU1DU0QzX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTU1DU0QzX01QVV9TSElGVAkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01NQ1NEM19NUFVfTUFTSwkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IFBNX0w0UEVSX01NQ1NEM19XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01NQ1NEM19TRE1BX1NISUZUCQkJCSgxIDw8IDMpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTU1DU0QzX1NETUFfTUFTSwkJCQlCSVRGSUVMRCgzLCAzKQorCisvKiBVc2VkIGJ5IFBNX0w0UEVSX01NQ1NENF9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01NQ1NENF9EVUNBVElfU0hJRlQJCQkJKDEgPDwgMSkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NTUNTRDRfRFVDQVRJX01BU0sJCQkJQklURklFTEQoMSwgMSkKKworLyogVXNlZCBieSBQTV9MNFBFUl9NTUNTRDRfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NTUNTRDRfTVBVX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTU1DU0Q0X01QVV9NQVNLCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfTU1DU0Q0X1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTU1DU0Q0X1NETUFfU0hJRlQJCQkJKDEgPDwgMykKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NTUNTRDRfU0RNQV9NQVNLCQkJCUJJVEZJRUxEKDMsIDMpCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfTU1DU0Q1X1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfTU1DU0Q1X0RVQ0FUSV9TSElGVAkJCQkoMSA8PCAxKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01NQ1NENV9EVUNBVElfTUFTSwkJCQlCSVRGSUVMRCgxLCAxKQorCisvKiBVc2VkIGJ5IFBNX0w0UEVSX01NQ1NENV9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01NQ1NENV9NUFVfU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NTUNTRDVfTVBVX01BU0sJCQkJQklURklFTEQoMCwgMCkKKworLyogVXNlZCBieSBQTV9MNFBFUl9NTUNTRDVfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9NTUNTRDVfU0RNQV9TSElGVAkJCQkoMSA8PCAzKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX01NQ1NENV9TRE1BX01BU0sJCQkJQklURklFTEQoMywgMykKKworLyogVXNlZCBieSBQTV9MM0lOSVRfUENJRVNTX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfUENJRVNTX01QVV9TSElGVAkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1BDSUVTU19NUFVfTUFTSwkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IFBNX0wzSU5JVF9QQ0lFU1NfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9QQ0lFU1NfVEVTTEFfU0hJRlQJCQkJKDEgPDwgMikKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9QQ0lFU1NfVEVTTEFfTUFTSwkJCQlCSVRGSUVMRCgyLCAyKQorCisvKiBVc2VkIGJ5IFBNX0FCRV9QRE1fV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9QRE1fRE1BX1NETUFfU0hJRlQJCQkJKDEgPDwgNykKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9QRE1fRE1BX1NETUFfTUFTSwkJCQlCSVRGSUVMRCg3LCA3KQorCisvKiBVc2VkIGJ5IFBNX0FCRV9QRE1fV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9QRE1fRE1BX1RFU0xBX1NISUZUCQkJCSgxIDw8IDYpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfUERNX0RNQV9URVNMQV9NQVNLCQkJCUJJVEZJRUxEKDYsIDYpCisKKy8qIFVzZWQgYnkgUE1fQUJFX1BETV9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1BETV9JUlFfTVBVX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfUERNX0lSUV9NUFVfTUFTSwkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IFBNX0FCRV9QRE1fV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9QRE1fSVJRX1RFU0xBX1NISUZUCQkJCSgxIDw8IDIpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfUERNX0lSUV9URVNMQV9NQVNLCQkJCUJJVEZJRUxEKDIsIDIpCisKKy8qIFVzZWQgYnkgUE1fV0tVUF9SVENfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9SVENfTVBVX1NISUZUCQkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1JUQ19NUFVfTUFTSwkJCQkJQklURklFTEQoMCwgMCkKKworLyogVXNlZCBieSBQTV9MM0lOSVRfU0FUQV9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1NBVEFfTVBVX1NISUZUCQkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1NBVEFfTVBVX01BU0sJCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fTDNJTklUX1NBVEFfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9TQVRBX1RFU0xBX1NISUZUCQkJCSgxIDw8IDIpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfU0FUQV9URVNMQV9NQVNLCQkJCUJJVEZJRUxEKDIsIDIpCisKKy8qIFVzZWQgYnkgUE1fQUJFX1NMSU1CVVNfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9TTElNQlVTMV9ETUFfU0RNQV9TSElGVAkJCSgxIDw8IDcpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfU0xJTUJVUzFfRE1BX1NETUFfTUFTSwkJCQlCSVRGSUVMRCg3LCA3KQorCisvKiBVc2VkIGJ5IFBNX0FCRV9TTElNQlVTX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfU0xJTUJVUzFfRE1BX1RFU0xBX1NISUZUCQkJKDEgPDwgNikKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9TTElNQlVTMV9ETUFfVEVTTEFfTUFTSwkJCUJJVEZJRUxEKDYsIDYpCisKKy8qIFVzZWQgYnkgUE1fQUJFX1NMSU1CVVNfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9TTElNQlVTMV9JUlFfTVBVX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfU0xJTUJVUzFfSVJRX01QVV9NQVNLCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fQUJFX1NMSU1CVVNfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9TTElNQlVTMV9JUlFfVEVTTEFfU0hJRlQJCQkoMSA8PCAyKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1NMSU1CVVMxX0lSUV9URVNMQV9NQVNLCQkJQklURklFTEQoMiwgMikKKworLyogVXNlZCBieSBQTV9MNFBFUl9TTElNQlVTMl9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1NMSU1CVVMyX0RNQV9TRE1BX1NISUZUCQkJKDEgPDwgNykKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9TTElNQlVTMl9ETUFfU0RNQV9NQVNLCQkJCUJJVEZJRUxEKDcsIDcpCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfU0xJTUJVUzJfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9TTElNQlVTMl9ETUFfVEVTTEFfU0hJRlQJCQkoMSA8PCA2KQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1NMSU1CVVMyX0RNQV9URVNMQV9NQVNLCQkJQklURklFTEQoNiwgNikKKworLyogVXNlZCBieSBQTV9MNFBFUl9TTElNQlVTMl9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1NMSU1CVVMyX0lSUV9NUFVfU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9TTElNQlVTMl9JUlFfTVBVX01BU0sJCQkJQklURklFTEQoMCwgMCkKKworLyogVXNlZCBieSBQTV9MNFBFUl9TTElNQlVTMl9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1NMSU1CVVMyX0lSUV9URVNMQV9TSElGVAkJCSgxIDw8IDIpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfU0xJTUJVUzJfSVJRX1RFU0xBX01BU0sJCQlCSVRGSUVMRCgyLCAyKQorCisvKiBVc2VkIGJ5IFBNX0FMV09OX1NSX0NPUkVfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9TUl9DT1JFX0RVQ0FUSV9TSElGVAkJCQkoMSA8PCAxKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1NSX0NPUkVfRFVDQVRJX01BU0sJCQkJQklURklFTEQoMSwgMSkKKworLyogVXNlZCBieSBQTV9BTFdPTl9TUl9DT1JFX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfU1JfQ09SRV9NUFVfU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9TUl9DT1JFX01QVV9NQVNLCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fQUxXT05fU1JfSVZBX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfU1JfSVZBX0RVQ0FUSV9TSElGVAkJCQkoMSA8PCAxKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1NSX0lWQV9EVUNBVElfTUFTSwkJCQlCSVRGSUVMRCgxLCAxKQorCisvKiBVc2VkIGJ5IFBNX0FMV09OX1NSX0lWQV9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1NSX0lWQV9NUFVfU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9TUl9JVkFfTVBVX01BU0sJCQkJQklURklFTEQoMCwgMCkKKworLyogVXNlZCBieSBQTV9BTFdPTl9TUl9NUFVfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9TUl9NUFVfTVBVX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfU1JfTVBVX01QVV9NQVNLCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fV0tVUF9USU1FUjEyX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfVElNRVIxMl9NUFVfU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9USU1FUjEyX01QVV9NQVNLCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fV0tVUF9USU1FUjFfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9USU1FUjFfTVBVX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfVElNRVIxX01QVV9NQVNLCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fQUJFX1RJTUVSNV9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1RJTUVSNV9NUFVfU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9USU1FUjVfTVBVX01BU0sJCQkJQklURklFTEQoMCwgMCkKKworLyogVXNlZCBieSBQTV9BQkVfVElNRVI1X1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfVElNRVI1X1RFU0xBX1NISUZUCQkJCSgxIDw8IDIpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfVElNRVI1X1RFU0xBX01BU0sJCQkJQklURklFTEQoMiwgMikKKworLyogVXNlZCBieSBQTV9BQkVfVElNRVI2X1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfVElNRVI2X01QVV9TSElGVAkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1RJTUVSNl9NUFVfTUFTSwkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IFBNX0FCRV9USU1FUjZfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9USU1FUjZfVEVTTEFfU0hJRlQJCQkJKDEgPDwgMikKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9USU1FUjZfVEVTTEFfTUFTSwkJCQlCSVRGSUVMRCgyLCAyKQorCisvKiBVc2VkIGJ5IFBNX0FCRV9USU1FUjdfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9USU1FUjdfTVBVX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfVElNRVI3X01QVV9NQVNLCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fQUJFX1RJTUVSN19XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1RJTUVSN19URVNMQV9TSElGVAkJCQkoMSA8PCAyKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1RJTUVSN19URVNMQV9NQVNLCQkJCUJJVEZJRUxEKDIsIDIpCisKKy8qIFVzZWQgYnkgUE1fQUJFX1RJTUVSOF9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1RJTUVSOF9NUFVfU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9USU1FUjhfTVBVX01BU0sJCQkJQklURklFTEQoMCwgMCkKKworLyogVXNlZCBieSBQTV9BQkVfVElNRVI4X1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfVElNRVI4X1RFU0xBX1NISUZUCQkJCSgxIDw8IDIpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfVElNRVI4X1RFU0xBX01BU0sJCQkJQklURklFTEQoMiwgMikKKworLyogVXNlZCBieSBQTV9MNFBFUl9VQVJUMV9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1VBUlQxX01QVV9TSElGVAkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1VBUlQxX01QVV9NQVNLCQkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IFBNX0w0UEVSX1VBUlQxX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfVUFSVDFfU0RNQV9TSElGVAkJCQkoMSA8PCAzKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1VBUlQxX1NETUFfTUFTSwkJCQlCSVRGSUVMRCgzLCAzKQorCisvKiBVc2VkIGJ5IFBNX0w0UEVSX1VBUlQyX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfVUFSVDJfTVBVX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfVUFSVDJfTVBVX01BU0sJCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfVUFSVDJfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9VQVJUMl9TRE1BX1NISUZUCQkJCSgxIDw8IDMpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfVUFSVDJfU0RNQV9NQVNLCQkJCUJJVEZJRUxEKDMsIDMpCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfVUFSVDNfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9VQVJUM19EVUNBVElfU0hJRlQJCQkJKDEgPDwgMSkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9VQVJUM19EVUNBVElfTUFTSwkJCQlCSVRGSUVMRCgxLCAxKQorCisvKiBVc2VkIGJ5IFBNX0w0UEVSX1VBUlQzX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfVUFSVDNfTVBVX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfVUFSVDNfTVBVX01BU0sJCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfVUFSVDNfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9VQVJUM19TRE1BX1NISUZUCQkJCSgxIDw8IDMpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfVUFSVDNfU0RNQV9NQVNLCQkJCUJJVEZJRUxEKDMsIDMpCisKKy8qIFVzZWQgYnkgUE1fTDRQRVJfVUFSVDNfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9VQVJUM19URVNMQV9TSElGVAkJCQkoMSA8PCAyKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1VBUlQzX1RFU0xBX01BU0sJCQkJQklURklFTEQoMiwgMikKKworLyogVXNlZCBieSBQTV9MNFBFUl9VQVJUNF9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1VBUlQ0X01QVV9TSElGVAkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1VBUlQ0X01QVV9NQVNLCQkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IFBNX0w0UEVSX1VBUlQ0X1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfVUFSVDRfU0RNQV9TSElGVAkJCQkoMSA8PCAzKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1VBUlQ0X1NETUFfTUFTSwkJCQlCSVRGSUVMRCgzLCAzKQorCisvKiBVc2VkIGJ5IFBNX0wzSU5JVF9VTklQUk8xX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfVU5JUFJPMV9EVUNBVElfU0hJRlQJCQkJKDEgPDwgMSkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9VTklQUk8xX0RVQ0FUSV9NQVNLCQkJCUJJVEZJRUxEKDEsIDEpCisKKy8qIFVzZWQgYnkgUE1fTDNJTklUX1VOSVBSTzFfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9VTklQUk8xX01QVV9TSElGVAkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1VOSVBSTzFfTVBVX01BU0sJCQkJQklURklFTEQoMCwgMCkKKworLyogVXNlZCBieSBQTV9MM0lOSVRfVVNCX0hPU1RfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9VU0JfSE9TVF9EVUNBVElfU0hJRlQJCQkJKDEgPDwgMSkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9VU0JfSE9TVF9EVUNBVElfTUFTSwkJCQlCSVRGSUVMRCgxLCAxKQorCisvKiBVc2VkIGJ5IFBNX0wzSU5JVF9VU0JfSE9TVF9GU19XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1VTQl9IT1NUX0ZTX0RVQ0FUSV9TSElGVAkJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfVVNCX0hPU1RfRlNfRFVDQVRJX01BU0sJCQlCSVRGSUVMRCgxLCAxKQorCisvKiBVc2VkIGJ5IFBNX0wzSU5JVF9VU0JfSE9TVF9GU19XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1VTQl9IT1NUX0ZTX01QVV9TSElGVAkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1VTQl9IT1NUX0ZTX01QVV9NQVNLCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fTDNJTklUX1VTQl9IT1NUX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfVVNCX0hPU1RfTVBVX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfVVNCX0hPU1RfTVBVX01BU0sJCQkJQklURklFTEQoMCwgMCkKKworLyogVXNlZCBieSBQTV9MM0lOSVRfVVNCX09UR19XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1VTQl9PVEdfRFVDQVRJX1NISUZUCQkJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfVVNCX09UR19EVUNBVElfTUFTSwkJCQlCSVRGSUVMRCgxLCAxKQorCisvKiBVc2VkIGJ5IFBNX0wzSU5JVF9VU0JfT1RHX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfVVNCX09UR19NUFVfU0hJRlQJCQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9VU0JfT1RHX01QVV9NQVNLCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fTDNJTklUX1VTQl9UTExfV0tERVAgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9VU0JfVExMX0RVQ0FUSV9TSElGVAkJCQkoMSA8PCAxKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1VTQl9UTExfRFVDQVRJX01BU0sJCQkJQklURklFTEQoMSwgMSkKKworLyogVXNlZCBieSBQTV9MM0lOSVRfVVNCX1RMTF9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1VTQl9UTExfTVBVX1NISUZUCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfVVNCX1RMTF9NUFVfTUFTSwkJCQlCSVRGSUVMRCgwLCAwKQorCisvKiBVc2VkIGJ5IFBNX1dLVVBfVVNJTV9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1VTSU1fTVBVX1NISUZUCQkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1VTSU1fTVBVX01BU0sJCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fV0tVUF9VU0lNX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfVVNJTV9TRE1BX1NISUZUCQkJCSgxIDw8IDMpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfVVNJTV9TRE1BX01BU0sJCQkJCUJJVEZJRUxEKDMsIDMpCisKKy8qIFVzZWQgYnkgUE1fV0tVUF9XRFQyX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfV0RUMl9EVUNBVElfU0hJRlQJCQkJKDEgPDwgMSkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9XRFQyX0RVQ0FUSV9NQVNLCQkJCUJJVEZJRUxEKDEsIDEpCisKKy8qIFVzZWQgYnkgUE1fV0tVUF9XRFQyX1dLREVQICovCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfV0RUMl9NUFVfU0hJRlQJCQkJCSgxIDw8IDApCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfV0RUMl9NUFVfTUFTSwkJCQkJQklURklFTEQoMCwgMCkKKworLyogVXNlZCBieSBQTV9BQkVfV0RUM19XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1dEVDNfTVBVX1NISUZUCQkJCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1dEVDNfTVBVX01BU0sJCQkJCUJJVEZJRUxEKDAsIDApCisKKy8qIFVzZWQgYnkgUE1fTDNJTklUX0hTSV9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1dHTV9IU0lfV0FLRV9NUFVfU0hJRlQJCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfV0tVUERFUF9XR01fSFNJX1dBS0VfTVBVX01BU0sJCQkJQklURklFTEQoOCwgOCkKKworLyogVXNlZCBieSBQTV9MM0lOSVRfWEhQSV9XS0RFUCAqLworI2RlZmluZSBPTUFQNDQzMF9XS1VQREVQX1hIUElfRFVDQVRJX1NISUZUCQkJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVA0NDMwX1dLVVBERVBfWEhQSV9EVUNBVElfTUFTSwkJCQlCSVRGSUVMRCgxLCAxKQorCisvKiBVc2VkIGJ5IFBSTV9JT19QTUNUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV1VDTEtfQ1RSTF9TSElGVAkJCQkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUDQ0MzBfV1VDTEtfQ1RSTF9NQVNLCQkJCQlCSVRGSUVMRCg4LCA4KQorCisvKiBVc2VkIGJ5IFBSTV9JT19QTUNUUkwgKi8KKyNkZWZpbmUgT01BUDQ0MzBfV1VDTEtfU1RBVFVTX1NISUZUCQkJCQkoMSA8PCA5KQorI2RlZmluZSBPTUFQNDQzMF9XVUNMS19TVEFUVVNfTUFTSwkJCQkJQklURklFTEQoOSwgOSkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcm0uaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvcHJtLmgKaW5kZXggYTExN2Y4NS4uZWEwNTBjZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcm0uaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3BybS5oCkBAIC00LDggKzQsOCBAQAogLyoKICAqIE9NQVAyLzMgUG93ZXIvUmVzZXQgTWFuYWdlbWVudCAoUFJNKSByZWdpc3RlciBkZWZpbml0aW9ucwogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA3IE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uCiAgKgogICogV3JpdHRlbiBieSBQYXVsIFdhbG1zbGV5CiAgKgpAQCAtMjIsNiArMjIsMTAgQEAKIAkJT01BUDJfTDRfSU9fQUREUkVTUyhPTUFQMjQzMF9QUk1fQkFTRSArIChtb2R1bGUpICsgKHJlZykpCiAjZGVmaW5lIE9NQVAzNFhYX1BSTV9SRUdBRERSKG1vZHVsZSwgcmVnKQkJCQlcCiAJCU9NQVAyX0w0X0lPX0FERFJFU1MoT01BUDM0MzBfUFJNX0JBU0UgKyAobW9kdWxlKSArIChyZWcpKQorI2RlZmluZSBPTUFQNDRYWF9QUk1fUkVHQUREUihtb2R1bGUsIHJlZykJCQkJXAorCQlPTUFQMl9MNF9JT19BRERSRVNTKE9NQVA0NDMwX1BSTV9CQVNFICsgKG1vZHVsZSkgKyAocmVnKSkKKworI2luY2x1ZGUgInBybTQ0eHguaCIKIAogLyoKICAqIEFyY2hpdGVjdHVyZS1zcGVjaWZpYyBnbG9iYWwgUFJNIHJlZ2lzdGVycwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcm00NHh4LmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL3BybTQ0eHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWJlOTdmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcm00NHh4LmgKQEAgLTAsMCArMSw0MTEgQEAKKy8qCisgKiBPTUFQNDR4eCBQUk0gaW5zdGFuY2Ugb2Zmc2V0IG1hY3JvcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uCisgKgorICogUGF1bCBXYWxtc2xleSAocGF1bEBwd3Nhbi5jb20pCisgKiBSYWplbmRyYSBOYXlhayAocm5heWFrQHRpLmNvbSkKKyAqIEJlbm9pdCBDb3Vzc29uIChiLWNvdXNzb25AdGkuY29tKQorICoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmcm9tIHRoZSBPTUFQIGhhcmR3YXJlIGRhdGFiYXNlcy4KKyAqIFdlIHJlc3BlY3RmdWxseSBhc2sgdGhhdCBhbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgYmUgY29vcmRpbmF0ZWQKKyAqIHdpdGggdGhlIHB1YmxpYyBsaW51eC1vbWFwQHZnZXIua2VybmVsLm9yZyBtYWlsaW5nIGxpc3QgYW5kIHRoZQorICogYXV0aG9ycyBhYm92ZSB0byBlbnN1cmUgdGhhdCB0aGUgYXV0b2dlbmVyYXRpb24gc2NyaXB0cyBhcmUga2VwdAorICogdXAtdG8tZGF0ZSB3aXRoIHRoZSBmaWxlIGNvbnRlbnRzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0FSQ0hfQVJNX01BQ0hfT01BUDJfUFJNNDRYWF9ICisjZGVmaW5lIF9fQVJDSF9BUk1fTUFDSF9PTUFQMl9QUk00NFhYX0gKKworCisvKiBQUk0gKi8KKworCisvKiBQUk0uT0NQX1NPQ0tFVF9QUk0gcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBPTUFQNDQzMF9SRVZJU0lPTl9QUk0JCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX09DUF9TT0NLRVRfTU9ELCAweDAwMDApCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9JUlFTVEFUVVNfTVBVCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX09DUF9TT0NLRVRfTU9ELCAweDAwMTApCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9JUlFTVEFUVVNfTVBVXzIJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fT0NQX1NPQ0tFVF9NT0QsIDB4MDAxNCkKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX0lSUUVOQUJMRV9NUFUJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fT0NQX1NPQ0tFVF9NT0QsIDB4MDAxOCkKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX0lSUUVOQUJMRV9NUFVfMgkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9PQ1BfU09DS0VUX01PRCwgMHgwMDFjKQorI2RlZmluZSBPTUFQNDQzMF9QUk1fSVJRU1RBVFVTX0RVQ0FUSQkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9PQ1BfU09DS0VUX01PRCwgMHgwMDIwKQorI2RlZmluZSBPTUFQNDQzMF9QUk1fSVJRRU5BQkxFX0RVQ0FUSQkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9PQ1BfU09DS0VUX01PRCwgMHgwMDI4KQorI2RlZmluZSBPTUFQNDQzMF9QUk1fSVJRU1RBVFVTX1RFU0xBCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX09DUF9TT0NLRVRfTU9ELCAweDAwMzApCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9JUlFFTkFCTEVfVEVTTEEJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fT0NQX1NPQ0tFVF9NT0QsIDB4MDAzOCkKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX1BSTV9QUk9GSUxJTkdfQ0xLQ1RSTAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX09DUF9TT0NLRVRfTU9ELCAweDAwNDApCisKKy8qIFBSTS5DS0dFTl9QUk0gcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBPTUFQNDQzMF9DTV9BQkVfRFNTX1NZU19DTEtTRUwJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQ0tHRU5fTU9ELCAweDAwMDApCisjZGVmaW5lIE9NQVA0NDMwX0NNX0RQTExfU1lTX1JFRl9DTEtTRUwJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQ0tHRU5fTU9ELCAweDAwMDQpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0w0X1dLVVBfQ0xLU0VMCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0NLR0VOX01PRCwgMHgwMDA4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9BQkVfUExMX1JFRl9DTEtTRUwJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQ0tHRU5fTU9ELCAweDAwMGMpCisjZGVmaW5lIE9NQVA0NDMwX0NNX1NZU19DTEtTRUwJCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0NLR0VOX01PRCwgMHgwMDEwKQorCisvKiBQUk0uTVBVX1BSTSByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE9NQVA0NDMwX1BNX01QVV9QV1JTVENUUkwJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTVBVX01PRCwgMHgwMDAwKQorI2RlZmluZSBPTUFQNDQzMF9QTV9NUFVfUFdSU1RTVAkJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTVBVX01PRCwgMHgwMDA0KQorI2RlZmluZSBPTUFQNDQzMF9STV9NUFVfUlNUU1QJCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX01QVV9NT0QsIDB4MDAxNCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTVBVX01QVV9DT05URVhUCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX01QVV9NT0QsIDB4MDAyNCkKKworLyogUFJNLlRFU0xBX1BSTSByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE9NQVA0NDMwX1BNX1RFU0xBX1BXUlNUQ1RSTAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9URVNMQV9NT0QsIDB4MDAwMCkKKyNkZWZpbmUgT01BUDQ0MzBfUE1fVEVTTEFfUFdSU1RTVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9URVNMQV9NT0QsIDB4MDAwNCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fVEVTTEFfUlNUQ1RSTAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9URVNMQV9NT0QsIDB4MDAxMCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fVEVTTEFfUlNUU1QJCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX1RFU0xBX01PRCwgMHgwMDE0KQorI2RlZmluZSBPTUFQNDQzMF9STV9URVNMQV9URVNMQV9DT05URVhUCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX1RFU0xBX01PRCwgMHgwMDI0KQorCisvKiBQUk0uQUJFX1BSTSByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE9NQVA0NDMwX1BNX0FCRV9QV1JTVENUUkwJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQUJFX01PRCwgMHgwMDAwKQorI2RlZmluZSBPTUFQNDQzMF9QTV9BQkVfUFdSU1RTVAkJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQUJFX01PRCwgMHgwMDA0KQorI2RlZmluZSBPTUFQNDQzMF9STV9BQkVfQUVTU19DT05URVhUCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0FCRV9NT0QsIDB4MDAyYykKKyNkZWZpbmUgT01BUDQ0MzBfUE1fQUJFX1BETV9XS0RFUAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9BQkVfTU9ELCAweDAwMzApCisjZGVmaW5lIE9NQVA0NDMwX1JNX0FCRV9QRE1fQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9BQkVfTU9ELCAweDAwMzQpCisjZGVmaW5lIE9NQVA0NDMwX1BNX0FCRV9ETUlDX1dLREVQCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0FCRV9NT0QsIDB4MDAzOCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fQUJFX0RNSUNfQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9BQkVfTU9ELCAweDAwM2MpCisjZGVmaW5lIE9NQVA0NDMwX1BNX0FCRV9NQ0FTUF9XS0RFUAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9BQkVfTU9ELCAweDAwNDApCisjZGVmaW5lIE9NQVA0NDMwX1JNX0FCRV9NQ0FTUF9DT05URVhUCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0FCRV9NT0QsIDB4MDA0NCkKKyNkZWZpbmUgT01BUDQ0MzBfUE1fQUJFX01DQlNQMV9XS0RFUAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9BQkVfTU9ELCAweDAwNDgpCisjZGVmaW5lIE9NQVA0NDMwX1JNX0FCRV9NQ0JTUDFfQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9BQkVfTU9ELCAweDAwNGMpCisjZGVmaW5lIE9NQVA0NDMwX1BNX0FCRV9NQ0JTUDJfV0tERVAJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQUJFX01PRCwgMHgwMDUwKQorI2RlZmluZSBPTUFQNDQzMF9STV9BQkVfTUNCU1AyX0NPTlRFWFQJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQUJFX01PRCwgMHgwMDU0KQorI2RlZmluZSBPTUFQNDQzMF9QTV9BQkVfTUNCU1AzX1dLREVQCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0FCRV9NT0QsIDB4MDA1OCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fQUJFX01DQlNQM19DT05URVhUCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0FCRV9NT0QsIDB4MDA1YykKKyNkZWZpbmUgT01BUDQ0MzBfUE1fQUJFX1NMSU1CVVNfV0tERVAJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQUJFX01PRCwgMHgwMDYwKQorI2RlZmluZSBPTUFQNDQzMF9STV9BQkVfU0xJTUJVU19DT05URVhUCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0FCRV9NT0QsIDB4MDA2NCkKKyNkZWZpbmUgT01BUDQ0MzBfUE1fQUJFX1RJTUVSNV9XS0RFUAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9BQkVfTU9ELCAweDAwNjgpCisjZGVmaW5lIE9NQVA0NDMwX1JNX0FCRV9USU1FUjVfQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9BQkVfTU9ELCAweDAwNmMpCisjZGVmaW5lIE9NQVA0NDMwX1BNX0FCRV9USU1FUjZfV0tERVAJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQUJFX01PRCwgMHgwMDcwKQorI2RlZmluZSBPTUFQNDQzMF9STV9BQkVfVElNRVI2X0NPTlRFWFQJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQUJFX01PRCwgMHgwMDc0KQorI2RlZmluZSBPTUFQNDQzMF9QTV9BQkVfVElNRVI3X1dLREVQCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0FCRV9NT0QsIDB4MDA3OCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fQUJFX1RJTUVSN19DT05URVhUCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0FCRV9NT0QsIDB4MDA3YykKKyNkZWZpbmUgT01BUDQ0MzBfUE1fQUJFX1RJTUVSOF9XS0RFUAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9BQkVfTU9ELCAweDAwODApCisjZGVmaW5lIE9NQVA0NDMwX1JNX0FCRV9USU1FUjhfQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9BQkVfTU9ELCAweDAwODQpCisjZGVmaW5lIE9NQVA0NDMwX1BNX0FCRV9XRFQzX1dLREVQCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0FCRV9NT0QsIDB4MDA4OCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fQUJFX1dEVDNfQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9BQkVfTU9ELCAweDAwOGMpCisKKy8qIFBSTS5BTFdBWVNfT05fUFJNIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUk1fQUxXT05fTURNSU5UQ19DT05URVhUCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQUxXQVlTX09OX01PRCwgMHgwMDI0KQorI2RlZmluZSBPTUFQNDQzMF9QTV9BTFdPTl9TUl9NUFVfV0tERVAJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQUxXQVlTX09OX01PRCwgMHgwMDI4KQorI2RlZmluZSBPTUFQNDQzMF9STV9BTFdPTl9TUl9NUFVfQ09OVEVYVAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0FMV0FZU19PTl9NT0QsIDB4MDAyYykKKyNkZWZpbmUgT01BUDQ0MzBfUE1fQUxXT05fU1JfSVZBX1dLREVQCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0FMV0FZU19PTl9NT0QsIDB4MDAzMCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fQUxXT05fU1JfSVZBX0NPTlRFWFQJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9BTFdBWVNfT05fTU9ELCAweDAwMzQpCisjZGVmaW5lIE9NQVA0NDMwX1BNX0FMV09OX1NSX0NPUkVfV0tERVAJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQUxXQVlTX09OX01PRCwgMHgwMDM4KQorI2RlZmluZSBPTUFQNDQzMF9STV9BTFdPTl9TUl9DT1JFX0NPTlRFWFQJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9BTFdBWVNfT05fTU9ELCAweDAwM2MpCisKKy8qIFBSTS5DT1JFX1BSTSByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE9NQVA0NDMwX1BNX0NPUkVfUFdSU1RDVFJMCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0NPUkVfTU9ELCAweDAwMDApCisjZGVmaW5lIE9NQVA0NDMwX1BNX0NPUkVfUFdSU1RTVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9DT1JFX01PRCwgMHgwMDA0KQorI2RlZmluZSBPTUFQNDQzMF9STV9MM18xX0wzXzFfQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9DT1JFX01PRCwgMHgwMDI0KQorI2RlZmluZSBPTUFQNDQzMF9STV9MM18yX0wzXzJfQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9DT1JFX01PRCwgMHgwMTI0KQorI2RlZmluZSBPTUFQNDQzMF9STV9MM18yX0dQTUNfQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9DT1JFX01PRCwgMHgwMTJjKQorI2RlZmluZSBPTUFQNDQzMF9STV9MM18yX09DTUNfUkFNX0NPTlRFWFQJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9DT1JFX01PRCwgMHgwMTM0KQorI2RlZmluZSBPTUFQNDQzMF9STV9EVUNBVElfUlNUQ1RSTAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9DT1JFX01PRCwgMHgwMjEwKQorI2RlZmluZSBPTUFQNDQzMF9STV9EVUNBVElfUlNUU1QJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQ09SRV9NT0QsIDB4MDIxNCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fRFVDQVRJX0RVQ0FUSV9DT05URVhUCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQ09SRV9NT0QsIDB4MDIyNCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fU0RNQV9TRE1BX0NPTlRFWFQJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQ09SRV9NT0QsIDB4MDMyNCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTUVNSUZfRE1NX0NPTlRFWFQJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQ09SRV9NT0QsIDB4MDQyNCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTUVNSUZfRU1JRl9GV19DT05URVhUCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQ09SRV9NT0QsIDB4MDQyYykKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTUVNSUZfRU1JRl8xX0NPTlRFWFQJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9DT1JFX01PRCwgMHgwNDM0KQorI2RlZmluZSBPTUFQNDQzMF9STV9NRU1JRl9FTUlGXzJfQ09OVEVYVAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0NPUkVfTU9ELCAweDA0M2MpCisjZGVmaW5lIE9NQVA0NDMwX1JNX01FTUlGX0RMTF9DT05URVhUCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0NPUkVfTU9ELCAweDA0NDQpCisjZGVmaW5lIE9NQVA0NDMwX1JNX01FTUlGX0VNSUZfSDFfQ09OVEVYVAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0NPUkVfTU9ELCAweDA0NTQpCisjZGVmaW5lIE9NQVA0NDMwX1JNX01FTUlGX0VNSUZfSDJfQ09OVEVYVAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0NPUkVfTU9ELCAweDA0NWMpCisjZGVmaW5lIE9NQVA0NDMwX1JNX01FTUlGX0RMTF9IX0NPTlRFWFQJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQ09SRV9NT0QsIDB4MDQ2NCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fRDJEX1NBRDJEX0NPTlRFWFQJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQ09SRV9NT0QsIDB4MDUyNCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fRDJEX01PREVNX0lDUl9DT05URVhUCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQ09SRV9NT0QsIDB4MDUyYykKKyNkZWZpbmUgT01BUDQ0MzBfUk1fRDJEX1NBRDJEX0ZXX0NPTlRFWFQJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9DT1JFX01PRCwgMHgwNTM0KQorI2RlZmluZSBPTUFQNDQzMF9STV9MNENGR19MNF9DRkdfQ09OVEVYVAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0NPUkVfTU9ELCAweDA2MjQpCisjZGVmaW5lIE9NQVA0NDMwX1JNX0w0Q0ZHX0hXX1NFTV9DT05URVhUCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQ09SRV9NT0QsIDB4MDYyYykKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTDRDRkdfTUFJTEJPWF9DT05URVhUCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQ09SRV9NT0QsIDB4MDYzNCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTDRDRkdfU0FSX1JPTV9DT05URVhUCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQ09SRV9NT0QsIDB4MDYzYykKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTDNJTlNUUl9MM18zX0NPTlRFWFQJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9DT1JFX01PRCwgMHgwNzI0KQorI2RlZmluZSBPTUFQNDQzMF9STV9MM0lOU1RSX0wzX0lOU1RSX0NPTlRFWFQJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9DT1JFX01PRCwgMHgwNzJjKQorI2RlZmluZSBPTUFQNDQzMF9STV9MM0lOU1RSX09DUF9XUDFfQ09OVEVYVAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0NPUkVfTU9ELCAweDA3NDQpCisKKy8qIFBSTS5JVkFIRF9QUk0gcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBPTUFQNDQzMF9QTV9JVkFIRF9QV1JTVENUUkwJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fSVZBSERfTU9ELCAweDAwMDApCisjZGVmaW5lIE9NQVA0NDMwX1BNX0lWQUhEX1BXUlNUU1QJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fSVZBSERfTU9ELCAweDAwMDQpCisjZGVmaW5lIE9NQVA0NDMwX1JNX0lWQUhEX1JTVENUUkwJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fSVZBSERfTU9ELCAweDAwMTApCisjZGVmaW5lIE9NQVA0NDMwX1JNX0lWQUhEX1JTVFNUCQkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9JVkFIRF9NT0QsIDB4MDAxNCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fSVZBSERfSVZBSERfQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9JVkFIRF9NT0QsIDB4MDAyNCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fSVZBSERfU0wyX0NPTlRFWFQJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fSVZBSERfTU9ELCAweDAwMmMpCisKKy8qIFBSTS5DQU1fUFJNIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUE1fQ0FNX1BXUlNUQ1RSTAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9DQU1fTU9ELCAweDAwMDApCisjZGVmaW5lIE9NQVA0NDMwX1BNX0NBTV9QV1JTVFNUCQkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9DQU1fTU9ELCAweDAwMDQpCisjZGVmaW5lIE9NQVA0NDMwX1JNX0NBTV9JU1NfQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9DQU1fTU9ELCAweDAwMjQpCisjZGVmaW5lIE9NQVA0NDMwX1JNX0NBTV9GRElGX0NPTlRFWFQJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQ0FNX01PRCwgMHgwMDJjKQorCisvKiBQUk0uRFNTX1BSTSByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE9NQVA0NDMwX1BNX0RTU19QV1JTVENUUkwJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fRFNTX01PRCwgMHgwMDAwKQorI2RlZmluZSBPTUFQNDQzMF9QTV9EU1NfUFdSU1RTVAkJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fRFNTX01PRCwgMHgwMDA0KQorI2RlZmluZSBPTUFQNDQzMF9QTV9EU1NfRFNTX1dLREVQCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0RTU19NT0QsIDB4MDAyMCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fRFNTX0RTU19DT05URVhUCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0RTU19NT0QsIDB4MDAyNCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fRFNTX0RFSVNTX0NPTlRFWFQJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fRFNTX01PRCwgMHgwMDJjKQorCisvKiBQUk0uR0ZYX1BSTSByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE9NQVA0NDMwX1BNX0dGWF9QV1JTVENUUkwJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fR0ZYX01PRCwgMHgwMDAwKQorI2RlZmluZSBPTUFQNDQzMF9QTV9HRlhfUFdSU1RTVAkJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fR0ZYX01PRCwgMHgwMDA0KQorI2RlZmluZSBPTUFQNDQzMF9STV9HRlhfR0ZYX0NPTlRFWFQJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fR0ZYX01PRCwgMHgwMDI0KQorCisvKiBQUk0uTDNJTklUX1BSTSByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE9NQVA0NDMwX1BNX0wzSU5JVF9QV1JTVENUUkwJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDNJTklUX01PRCwgMHgwMDAwKQorI2RlZmluZSBPTUFQNDQzMF9QTV9MM0lOSVRfUFdSU1RTVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MM0lOSVRfTU9ELCAweDAwMDQpCisjZGVmaW5lIE9NQVA0NDMwX1BNX0wzSU5JVF9NTUMxX1dLREVQCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0wzSU5JVF9NT0QsIDB4MDAyOCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTDNJTklUX01NQzFfQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MM0lOSVRfTU9ELCAweDAwMmMpCisjZGVmaW5lIE9NQVA0NDMwX1BNX0wzSU5JVF9NTUMyX1dLREVQCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0wzSU5JVF9NT0QsIDB4MDAzMCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTDNJTklUX01NQzJfQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MM0lOSVRfTU9ELCAweDAwMzQpCisjZGVmaW5lIE9NQVA0NDMwX1BNX0wzSU5JVF9IU0lfV0tERVAJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDNJTklUX01PRCwgMHgwMDM4KQorI2RlZmluZSBPTUFQNDQzMF9STV9MM0lOSVRfSFNJX0NPTlRFWFQJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDNJTklUX01PRCwgMHgwMDNjKQorI2RlZmluZSBPTUFQNDQzMF9QTV9MM0lOSVRfVU5JUFJPMV9XS0RFUAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0wzSU5JVF9NT0QsIDB4MDA0MCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTDNJTklUX1VOSVBSTzFfQ09OVEVYVAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0wzSU5JVF9NT0QsIDB4MDA0NCkKKyNkZWZpbmUgT01BUDQ0MzBfUE1fTDNJTklUX1VTQl9IT1NUX1dLREVQCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDNJTklUX01PRCwgMHgwMDU4KQorI2RlZmluZSBPTUFQNDQzMF9STV9MM0lOSVRfVVNCX0hPU1RfQ09OVEVYVAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0wzSU5JVF9NT0QsIDB4MDA1YykKKyNkZWZpbmUgT01BUDQ0MzBfUE1fTDNJTklUX1VTQl9PVEdfV0tERVAJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MM0lOSVRfTU9ELCAweDAwNjApCisjZGVmaW5lIE9NQVA0NDMwX1JNX0wzSU5JVF9VU0JfT1RHX0NPTlRFWFQJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MM0lOSVRfTU9ELCAweDAwNjQpCisjZGVmaW5lIE9NQVA0NDMwX1BNX0wzSU5JVF9VU0JfVExMX1dLREVQCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDNJTklUX01PRCwgMHgwMDY4KQorI2RlZmluZSBPTUFQNDQzMF9STV9MM0lOSVRfVVNCX1RMTF9DT05URVhUCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDNJTklUX01PRCwgMHgwMDZjKQorI2RlZmluZSBPTUFQNDQzMF9STV9MM0lOSVRfUDE1MDBfQ09OVEVYVAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0wzSU5JVF9NT0QsIDB4MDA3YykKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTDNJTklUX0VNQUNfQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MM0lOSVRfTU9ELCAweDAwODQpCisjZGVmaW5lIE9NQVA0NDMwX1BNX0wzSU5JVF9TQVRBX1dLREVQCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0wzSU5JVF9NT0QsIDB4MDA4OCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTDNJTklUX1NBVEFfQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MM0lOSVRfTU9ELCAweDAwOGMpCisjZGVmaW5lIE9NQVA0NDMwX1JNX0wzSU5JVF9UUFBTU19DT05URVhUCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDNJTklUX01PRCwgMHgwMDk0KQorI2RlZmluZSBPTUFQNDQzMF9QTV9MM0lOSVRfUENJRVNTX1dLREVQCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0wzSU5JVF9NT0QsIDB4MDA5OCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTDNJTklUX1BDSUVTU19DT05URVhUCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDNJTklUX01PRCwgMHgwMDljKQorI2RlZmluZSBPTUFQNDQzMF9STV9MM0lOSVRfQ0NQVFhfQ09OVEVYVAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0wzSU5JVF9NT0QsIDB4MDBhYykKKyNkZWZpbmUgT01BUDQ0MzBfUE1fTDNJTklUX1hIUElfV0tERVAJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDNJTklUX01PRCwgMHgwMGMwKQorI2RlZmluZSBPTUFQNDQzMF9STV9MM0lOSVRfWEhQSV9DT05URVhUCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0wzSU5JVF9NT0QsIDB4MDBjNCkKKyNkZWZpbmUgT01BUDQ0MzBfUE1fTDNJTklUX01NQzZfV0tERVAJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDNJTklUX01PRCwgMHgwMGM4KQorI2RlZmluZSBPTUFQNDQzMF9STV9MM0lOSVRfTU1DNl9DT05URVhUCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0wzSU5JVF9NT0QsIDB4MDBjYykKKyNkZWZpbmUgT01BUDQ0MzBfUE1fTDNJTklUX1VTQl9IT1NUX0ZTX1dLREVQCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDNJTklUX01PRCwgMHgwMGQwKQorI2RlZmluZSBPTUFQNDQzMF9STV9MM0lOSVRfVVNCX0hPU1RfRlNfQ09OVEVYVAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0wzSU5JVF9NT0QsIDB4MDBkNCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTDNJTklUX1VTQlBIWU9DUDJTQ1BfQ09OVEVYVAlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDNJTklUX01PRCwgMHgwMGU0KQorCisvKiBQUk0uTDRQRVJfUFJNIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUE1fTDRQRVJfUFdSU1RDVFJMCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMDAwKQorI2RlZmluZSBPTUFQNDQzMF9QTV9MNFBFUl9QV1JTVFNUCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMDA0KQorI2RlZmluZSBPTUFQNDQzMF9STV9MNFBFUl9BRENfQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QsIDB4MDAyNCkKKyNkZWZpbmUgT01BUDQ0MzBfUE1fTDRQRVJfRE1USU1FUjEwX1dLREVQCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDRQRVJfTU9ELCAweDAwMjgpCisjZGVmaW5lIE9NQVA0NDMwX1JNX0w0UEVSX0RNVElNRVIxMF9DT05URVhUCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDRQRVJfTU9ELCAweDAwMmMpCisjZGVmaW5lIE9NQVA0NDMwX1BNX0w0UEVSX0RNVElNRVIxMV9XS0RFUAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMDMwKQorI2RlZmluZSBPTUFQNDQzMF9STV9MNFBFUl9ETVRJTUVSMTFfQ09OVEVYVAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMDM0KQorI2RlZmluZSBPTUFQNDQzMF9QTV9MNFBFUl9ETVRJTUVSMl9XS0RFUAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMDM4KQorI2RlZmluZSBPTUFQNDQzMF9STV9MNFBFUl9ETVRJTUVSMl9DT05URVhUCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDRQRVJfTU9ELCAweDAwM2MpCisjZGVmaW5lIE9NQVA0NDMwX1BNX0w0UEVSX0RNVElNRVIzX1dLREVQCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDRQRVJfTU9ELCAweDAwNDApCisjZGVmaW5lIE9NQVA0NDMwX1JNX0w0UEVSX0RNVElNRVIzX0NPTlRFWFQJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QsIDB4MDA0NCkKKyNkZWZpbmUgT01BUDQ0MzBfUE1fTDRQRVJfRE1USU1FUjRfV0tERVAJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QsIDB4MDA0OCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTDRQRVJfRE1USU1FUjRfQ09OVEVYVAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMDRjKQorI2RlZmluZSBPTUFQNDQzMF9QTV9MNFBFUl9ETVRJTUVSOV9XS0RFUAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMDUwKQorI2RlZmluZSBPTUFQNDQzMF9STV9MNFBFUl9ETVRJTUVSOV9DT05URVhUCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDRQRVJfTU9ELCAweDAwNTQpCisjZGVmaW5lIE9NQVA0NDMwX1JNX0w0UEVSX0VMTV9DT05URVhUCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMDVjKQorI2RlZmluZSBPTUFQNDQzMF9QTV9MNFBFUl9HUElPMl9XS0RFUAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QsIDB4MDA2MCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTDRQRVJfR1BJTzJfQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QsIDB4MDA2NCkKKyNkZWZpbmUgT01BUDQ0MzBfUE1fTDRQRVJfR1BJTzNfV0tERVAJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDRQRVJfTU9ELCAweDAwNjgpCisjZGVmaW5lIE9NQVA0NDMwX1JNX0w0UEVSX0dQSU8zX0NPTlRFWFQJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDRQRVJfTU9ELCAweDAwNmMpCisjZGVmaW5lIE9NQVA0NDMwX1BNX0w0UEVSX0dQSU80X1dLREVQCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMDcwKQorI2RlZmluZSBPTUFQNDQzMF9STV9MNFBFUl9HUElPNF9DT05URVhUCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMDc0KQorI2RlZmluZSBPTUFQNDQzMF9QTV9MNFBFUl9HUElPNV9XS0RFUAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QsIDB4MDA3OCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTDRQRVJfR1BJTzVfQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QsIDB4MDA3YykKKyNkZWZpbmUgT01BUDQ0MzBfUE1fTDRQRVJfR1BJTzZfV0tERVAJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDRQRVJfTU9ELCAweDAwODApCisjZGVmaW5lIE9NQVA0NDMwX1JNX0w0UEVSX0dQSU82X0NPTlRFWFQJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDRQRVJfTU9ELCAweDAwODQpCisjZGVmaW5lIE9NQVA0NDMwX1JNX0w0UEVSX0hEUTFXX0NPTlRFWFQJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDRQRVJfTU9ELCAweDAwOGMpCisjZGVmaW5lIE9NQVA0NDMwX1BNX0w0UEVSX0hFQ0MxX1dLREVQCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMDkwKQorI2RlZmluZSBPTUFQNDQzMF9STV9MNFBFUl9IRUNDMV9DT05URVhUCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMDk0KQorI2RlZmluZSBPTUFQNDQzMF9QTV9MNFBFUl9IRUNDMl9XS0RFUAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QsIDB4MDA5OCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTDRQRVJfSEVDQzJfQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QsIDB4MDA5YykKKyNkZWZpbmUgT01BUDQ0MzBfUE1fTDRQRVJfSTJDMV9XS0RFUAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QsIDB4MDBhMCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTDRQRVJfSTJDMV9DT05URVhUCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMGE0KQorI2RlZmluZSBPTUFQNDQzMF9QTV9MNFBFUl9JMkMyX1dLREVQCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMGE4KQorI2RlZmluZSBPTUFQNDQzMF9STV9MNFBFUl9JMkMyX0NPTlRFWFQJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDRQRVJfTU9ELCAweDAwYWMpCisjZGVmaW5lIE9NQVA0NDMwX1BNX0w0UEVSX0kyQzNfV0tERVAJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDRQRVJfTU9ELCAweDAwYjApCisjZGVmaW5lIE9NQVA0NDMwX1JNX0w0UEVSX0kyQzNfQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QsIDB4MDBiNCkKKyNkZWZpbmUgT01BUDQ0MzBfUE1fTDRQRVJfSTJDNF9XS0RFUAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QsIDB4MDBiOCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTDRQRVJfSTJDNF9DT05URVhUCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMGJjKQorI2RlZmluZSBPTUFQNDQzMF9STV9MNFBFUl9MNF9QRVJfQ09OVEVYVAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMGMwKQorI2RlZmluZSBPTUFQNDQzMF9QTV9MNFBFUl9NQ0FTUDJfV0tERVAJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDRQRVJfTU9ELCAweDAwZDApCisjZGVmaW5lIE9NQVA0NDMwX1JNX0w0UEVSX01DQVNQMl9DT05URVhUCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDRQRVJfTU9ELCAweDAwZDQpCisjZGVmaW5lIE9NQVA0NDMwX1BNX0w0UEVSX01DQVNQM19XS0RFUAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QsIDB4MDBkOCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTDRQRVJfTUNBU1AzX0NPTlRFWFQJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QsIDB4MDBkYykKKyNkZWZpbmUgT01BUDQ0MzBfUE1fTDRQRVJfTUNCU1A0X1dLREVQCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMGUwKQorI2RlZmluZSBPTUFQNDQzMF9STV9MNFBFUl9NQ0JTUDRfQ09OVEVYVAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMGU0KQorI2RlZmluZSBPTUFQNDQzMF9STV9MNFBFUl9NR0FURV9DT05URVhUCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMGVjKQorI2RlZmluZSBPTUFQNDQzMF9QTV9MNFBFUl9NQ1NQSTFfV0tERVAJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDRQRVJfTU9ELCAweDAwZjApCisjZGVmaW5lIE9NQVA0NDMwX1JNX0w0UEVSX01DU1BJMV9DT05URVhUCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDRQRVJfTU9ELCAweDAwZjQpCisjZGVmaW5lIE9NQVA0NDMwX1BNX0w0UEVSX01DU1BJMl9XS0RFUAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QsIDB4MDBmOCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTDRQRVJfTUNTUEkyX0NPTlRFWFQJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QsIDB4MDBmYykKKyNkZWZpbmUgT01BUDQ0MzBfUE1fTDRQRVJfTUNTUEkzX1dLREVQCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMTAwKQorI2RlZmluZSBPTUFQNDQzMF9STV9MNFBFUl9NQ1NQSTNfQ09OVEVYVAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMTA0KQorI2RlZmluZSBPTUFQNDQzMF9QTV9MNFBFUl9NQ1NQSTRfV0tERVAJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDRQRVJfTU9ELCAweDAxMDgpCisjZGVmaW5lIE9NQVA0NDMwX1JNX0w0UEVSX01DU1BJNF9DT05URVhUCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDRQRVJfTU9ELCAweDAxMGMpCisjZGVmaW5lIE9NQVA0NDMwX1BNX0w0UEVSX01NQ1NEM19XS0RFUAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QsIDB4MDEyMCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTDRQRVJfTU1DU0QzX0NPTlRFWFQJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QsIDB4MDEyNCkKKyNkZWZpbmUgT01BUDQ0MzBfUE1fTDRQRVJfTU1DU0Q0X1dLREVQCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMTI4KQorI2RlZmluZSBPTUFQNDQzMF9STV9MNFBFUl9NTUNTRDRfQ09OVEVYVAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMTJjKQorI2RlZmluZSBPTUFQNDQzMF9STV9MNFBFUl9NU1BST0hHX0NPTlRFWFQJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QsIDB4MDEzNCkKKyNkZWZpbmUgT01BUDQ0MzBfUE1fTDRQRVJfU0xJTUJVUzJfV0tERVAJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QsIDB4MDEzOCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTDRQRVJfU0xJTUJVUzJfQ09OVEVYVAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMTNjKQorI2RlZmluZSBPTUFQNDQzMF9QTV9MNFBFUl9VQVJUMV9XS0RFUAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QsIDB4MDE0MCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTDRQRVJfVUFSVDFfQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QsIDB4MDE0NCkKKyNkZWZpbmUgT01BUDQ0MzBfUE1fTDRQRVJfVUFSVDJfV0tERVAJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDRQRVJfTU9ELCAweDAxNDgpCisjZGVmaW5lIE9NQVA0NDMwX1JNX0w0UEVSX1VBUlQyX0NPTlRFWFQJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDRQRVJfTU9ELCAweDAxNGMpCisjZGVmaW5lIE9NQVA0NDMwX1BNX0w0UEVSX1VBUlQzX1dLREVQCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMTUwKQorI2RlZmluZSBPTUFQNDQzMF9STV9MNFBFUl9VQVJUM19DT05URVhUCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMTU0KQorI2RlZmluZSBPTUFQNDQzMF9QTV9MNFBFUl9VQVJUNF9XS0RFUAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QsIDB4MDE1OCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTDRQRVJfVUFSVDRfQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QsIDB4MDE1YykKKyNkZWZpbmUgT01BUDQ0MzBfUE1fTDRQRVJfTU1DU0Q1X1dLREVQCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMTYwKQorI2RlZmluZSBPTUFQNDQzMF9STV9MNFBFUl9NTUNTRDVfQ09OVEVYVAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMTY0KQorI2RlZmluZSBPTUFQNDQzMF9QTV9MNFBFUl9JMkM1X1dLREVQCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMTY4KQorI2RlZmluZSBPTUFQNDQzMF9STV9MNFBFUl9JMkM1X0NPTlRFWFQJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fTDRQRVJfTU9ELCAweDAxNmMpCisjZGVmaW5lIE9NQVA0NDMwX1JNX0w0U0VDX0FFUzFfQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QsIDB4MDFhNCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTDRTRUNfQUVTMl9DT05URVhUCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMWFjKQorI2RlZmluZSBPTUFQNDQzMF9STV9MNFNFQ19ERVMzREVTX0NPTlRFWFQJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QsIDB4MDFiNCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTDRTRUNfUEtBRUlQMjlfQ09OVEVYVAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMWJjKQorI2RlZmluZSBPTUFQNDQzMF9STV9MNFNFQ19STkdfQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9MNFBFUl9NT0QsIDB4MDFjNCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fTDRTRUNfU0hBMk1ENTFfQ09OVEVYVAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMWNjKQorI2RlZmluZSBPTUFQNDQzMF9STV9MNFNFQ19DUllQVE9ETUFfQ09OVEVYVAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0w0UEVSX01PRCwgMHgwMWRjKQorCisvKiBQUk0uQ0VGVVNFX1BSTSByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE9NQVA0NDMwX1BNX0NFRlVTRV9QV1JTVENUUkwJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fQ0VGVVNFX01PRCwgMHgwMDAwKQorI2RlZmluZSBPTUFQNDQzMF9QTV9DRUZVU0VfUFdSU1RTVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9DRUZVU0VfTU9ELCAweDAwMDQpCisjZGVmaW5lIE9NQVA0NDMwX1JNX0NFRlVTRV9DRUZVU0VfQ09OVEVYVAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0NFRlVTRV9NT0QsIDB4MDAyNCkKKworLyogUFJNLldLVVBfUFJNIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUk1fV0tVUF9MNFdLVVBfQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9XS1VQX01PRCwgMHgwMDI0KQorI2RlZmluZSBPTUFQNDQzMF9STV9XS1VQX1dEVDFfQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9XS1VQX01PRCwgMHgwMDJjKQorI2RlZmluZSBPTUFQNDQzMF9QTV9XS1VQX1dEVDJfV0tERVAJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fV0tVUF9NT0QsIDB4MDAzMCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fV0tVUF9XRFQyX0NPTlRFWFQJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fV0tVUF9NT0QsIDB4MDAzNCkKKyNkZWZpbmUgT01BUDQ0MzBfUE1fV0tVUF9HUElPMV9XS0RFUAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9XS1VQX01PRCwgMHgwMDM4KQorI2RlZmluZSBPTUFQNDQzMF9STV9XS1VQX0dQSU8xX0NPTlRFWFQJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fV0tVUF9NT0QsIDB4MDAzYykKKyNkZWZpbmUgT01BUDQ0MzBfUE1fV0tVUF9USU1FUjFfV0tERVAJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fV0tVUF9NT0QsIDB4MDA0MCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fV0tVUF9USU1FUjFfQ09OVEVYVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9XS1VQX01PRCwgMHgwMDQ0KQorI2RlZmluZSBPTUFQNDQzMF9QTV9XS1VQX1RJTUVSMTJfV0tERVAJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fV0tVUF9NT0QsIDB4MDA0OCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fV0tVUF9USU1FUjEyX0NPTlRFWFQJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9XS1VQX01PRCwgMHgwMDRjKQorI2RlZmluZSBPTUFQNDQzMF9STV9XS1VQX1NZTkNUSU1FUl9DT05URVhUCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fV0tVUF9NT0QsIDB4MDA1NCkKKyNkZWZpbmUgT01BUDQ0MzBfUE1fV0tVUF9VU0lNX1dLREVQCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX1dLVVBfTU9ELCAweDAwNTgpCisjZGVmaW5lIE9NQVA0NDMwX1JNX1dLVVBfVVNJTV9DT05URVhUCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX1dLVVBfTU9ELCAweDAwNWMpCisjZGVmaW5lIE9NQVA0NDMwX1JNX1dLVVBfU0FSUkFNX0NPTlRFWFQJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fV0tVUF9NT0QsIDB4MDA2NCkKKyNkZWZpbmUgT01BUDQ0MzBfUE1fV0tVUF9LRVlCT0FSRF9XS0RFUAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9XS1VQX01PRCwgMHgwMDc4KQorI2RlZmluZSBPTUFQNDQzMF9STV9XS1VQX0tFWUJPQVJEX0NPTlRFWFQJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9XS1VQX01PRCwgMHgwMDdjKQorI2RlZmluZSBPTUFQNDQzMF9QTV9XS1VQX1JUQ19XS0RFUAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9XS1VQX01PRCwgMHgwMDgwKQorI2RlZmluZSBPTUFQNDQzMF9STV9XS1VQX1JUQ19DT05URVhUCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX1dLVVBfTU9ELCAweDAwODQpCisKKy8qIFBSTS5XS1VQX0NNIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgT01BUDQ0MzBfQ01fV0tVUF9DTEtTVENUUkwJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fV0tVUF9DTV9NT0QsIDB4MDAwMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fV0tVUF9MNFdLVVBfQ0xLQ1RSTAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9XS1VQX0NNX01PRCwgMHgwMDIwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9XS1VQX1dEVDFfQ0xLQ1RSTAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9XS1VQX0NNX01PRCwgMHgwMDI4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9XS1VQX1dEVDJfQ0xLQ1RSTAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9XS1VQX0NNX01PRCwgMHgwMDMwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9XS1VQX0dQSU8xX0NMS0NUUkwJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fV0tVUF9DTV9NT0QsIDB4MDAzOCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fV0tVUF9USU1FUjFfQ0xLQ1RSTAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9XS1VQX0NNX01PRCwgMHgwMDQwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9XS1VQX1RJTUVSMTJfQ0xLQ1RSTAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX1dLVVBfQ01fTU9ELCAweDAwNDgpCisjZGVmaW5lIE9NQVA0NDMwX0NNX1dLVVBfU1lOQ1RJTUVSX0NMS0NUUkwJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9XS1VQX0NNX01PRCwgMHgwMDUwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9XS1VQX1VTSU1fQ0xLQ1RSTAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9XS1VQX0NNX01PRCwgMHgwMDU4KQorI2RlZmluZSBPTUFQNDQzMF9DTV9XS1VQX1NBUlJBTV9DTEtDVFJMCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX1dLVVBfQ01fTU9ELCAweDAwNjApCisjZGVmaW5lIE9NQVA0NDMwX0NNX1dLVVBfS0VZQk9BUkRfQ0xLQ1RSTAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX1dLVVBfQ01fTU9ELCAweDAwNzgpCisjZGVmaW5lIE9NQVA0NDMwX0NNX1dLVVBfUlRDX0NMS0NUUkwJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fV0tVUF9DTV9NT0QsIDB4MDA4MCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fV0tVUF9CQU5ER0FQX0NMS0NUUkwJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9XS1VQX0NNX01PRCwgMHgwMDg4KQorCisvKiBQUk0uRU1VX1BSTSByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE9NQVA0NDMwX1BNX0VNVV9QV1JTVENUUkwJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fRU1VX01PRCwgMHgwMDAwKQorI2RlZmluZSBPTUFQNDQzMF9QTV9FTVVfUFdSU1RTVAkJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fRU1VX01PRCwgMHgwMDA0KQorI2RlZmluZSBPTUFQNDQzMF9STV9FTVVfREVCVUdTU19DT05URVhUCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0VNVV9NT0QsIDB4MDAyNCkKKworLyogUFJNLkVNVV9DTSByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE9NQVA0NDMwX0NNX0VNVV9DTEtTVENUUkwJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fRU1VX0NNX01PRCwgMHgwMDAwKQorI2RlZmluZSBPTUFQNDQzMF9DTV9FTVVfRFlOQU1JQ0RFUAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9FTVVfQ01fTU9ELCAweDAwMDgpCisjZGVmaW5lIE9NQVA0NDMwX0NNX0VNVV9ERUJVR1NTX0NMS0NUUkwJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fRU1VX0NNX01PRCwgMHgwMDIwKQorCisvKiBQUk0uREVWSUNFX1BSTSByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9SU1RDVFJMCQkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9ERVZJQ0VfTU9ELCAweDAwMDApCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9SU1RTVAkJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fREVWSUNFX01PRCwgMHgwMDA0KQorI2RlZmluZSBPTUFQNDQzMF9QUk1fUlNUVElNRQkJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fREVWSUNFX01PRCwgMHgwMDA4KQorI2RlZmluZSBPTUFQNDQzMF9QUk1fQ0xLUkVRQ1RSTAkJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fREVWSUNFX01PRCwgMHgwMDBjKQorI2RlZmluZSBPTUFQNDQzMF9QUk1fVk9MVENUUkwJCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0RFVklDRV9NT0QsIDB4MDAxMCkKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX1BXUlJFUUNUUkwJCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0RFVklDRV9NT0QsIDB4MDAxNCkKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX1BTQ09OX0NPVU5UCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0RFVklDRV9NT0QsIDB4MDAxOCkKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX0lPX0NPVU5UCQkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9ERVZJQ0VfTU9ELCAweDAwMWMpCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9JT19QTUNUUkwJCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0RFVklDRV9NT0QsIDB4MDAyMCkKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX1ZPTFRTRVRVUF9XQVJNUkVTRVQJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9ERVZJQ0VfTU9ELCAweDAwMjQpCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9WT0xUU0VUVVBfQ09SRV9PRkYJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fREVWSUNFX01PRCwgMHgwMDI4KQorI2RlZmluZSBPTUFQNDQzMF9QUk1fVk9MVFNFVFVQX01QVV9PRkYJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fREVWSUNFX01PRCwgMHgwMDJjKQorI2RlZmluZSBPTUFQNDQzMF9QUk1fVk9MVFNFVFVQX0lWQV9PRkYJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fREVWSUNFX01PRCwgMHgwMDMwKQorI2RlZmluZSBPTUFQNDQzMF9QUk1fVk9MVFNFVFVQX0NPUkVfUkVUX1NMRUVQCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fREVWSUNFX01PRCwgMHgwMDM0KQorI2RlZmluZSBPTUFQNDQzMF9QUk1fVk9MVFNFVFVQX01QVV9SRVRfU0xFRVAJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9ERVZJQ0VfTU9ELCAweDAwMzgpCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9WT0xUU0VUVVBfSVZBX1JFVF9TTEVFUAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0RFVklDRV9NT0QsIDB4MDAzYykKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX1ZQX0NPUkVfQ09ORklHCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0RFVklDRV9NT0QsIDB4MDA0MCkKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX1ZQX0NPUkVfU1RBVFVTCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0RFVklDRV9NT0QsIDB4MDA0NCkKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX1ZQX0NPUkVfVkxJTUlUVE8JCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fREVWSUNFX01PRCwgMHgwMDQ4KQorI2RlZmluZSBPTUFQNDQzMF9QUk1fVlBfQ09SRV9WT0xUQUdFCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0RFVklDRV9NT0QsIDB4MDA0YykKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX1ZQX0NPUkVfVlNURVBNQVgJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fREVWSUNFX01PRCwgMHgwMDUwKQorI2RlZmluZSBPTUFQNDQzMF9QUk1fVlBfQ09SRV9WU1RFUE1JTgkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9ERVZJQ0VfTU9ELCAweDAwNTQpCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9WUF9NUFVfQ09ORklHCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0RFVklDRV9NT0QsIDB4MDA1OCkKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX1ZQX01QVV9TVEFUVVMJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fREVWSUNFX01PRCwgMHgwMDVjKQorI2RlZmluZSBPTUFQNDQzMF9QUk1fVlBfTVBVX1ZMSU1JVFRPCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0RFVklDRV9NT0QsIDB4MDA2MCkKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX1ZQX01QVV9WT0xUQUdFCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0RFVklDRV9NT0QsIDB4MDA2NCkKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX1ZQX01QVV9WU1RFUE1BWAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9ERVZJQ0VfTU9ELCAweDAwNjgpCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9WUF9NUFVfVlNURVBNSU4JCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fREVWSUNFX01PRCwgMHgwMDZjKQorI2RlZmluZSBPTUFQNDQzMF9QUk1fVlBfSVZBX0NPTkZJRwkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9ERVZJQ0VfTU9ELCAweDAwNzApCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9WUF9JVkFfU1RBVFVTCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0RFVklDRV9NT0QsIDB4MDA3NCkKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX1ZQX0lWQV9WTElNSVRUTwkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9ERVZJQ0VfTU9ELCAweDAwNzgpCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9WUF9JVkFfVk9MVEFHRQkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9ERVZJQ0VfTU9ELCAweDAwN2MpCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9WUF9JVkFfVlNURVBNQVgJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fREVWSUNFX01PRCwgMHgwMDgwKQorI2RlZmluZSBPTUFQNDQzMF9QUk1fVlBfSVZBX1ZTVEVQTUlOCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0RFVklDRV9NT0QsIDB4MDA4NCkKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX1ZDX1NNUFNfU0EJCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0RFVklDRV9NT0QsIDB4MDA4OCkKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX1ZDX1ZBTF9TTVBTX1JBX1ZPTAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9ERVZJQ0VfTU9ELCAweDAwOGMpCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9WQ19WQUxfU01QU19SQV9DTUQJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fREVWSUNFX01PRCwgMHgwMDkwKQorI2RlZmluZSBPTUFQNDQzMF9QUk1fVkNfVkFMX0NNRF9WRERfQ09SRV9MCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fREVWSUNFX01PRCwgMHgwMDk0KQorI2RlZmluZSBPTUFQNDQzMF9QUk1fVkNfVkFMX0NNRF9WRERfTVBVX0wJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9ERVZJQ0VfTU9ELCAweDAwOTgpCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9WQ19WQUxfQ01EX1ZERF9JVkFfTAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0RFVklDRV9NT0QsIDB4MDA5YykKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX1ZDX1ZBTF9CWVBBU1MJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fREVWSUNFX01PRCwgMHgwMGEwKQorI2RlZmluZSBPTUFQNDQzMF9QUk1fVkNfQ0ZHX0NIQU5ORUwJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fREVWSUNFX01PRCwgMHgwMGE0KQorI2RlZmluZSBPTUFQNDQzMF9QUk1fVkNfQ0ZHX0kyQ19NT0RFCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0RFVklDRV9NT0QsIDB4MDBhOCkKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX1ZDX0NGR19JMkNfQ0xLCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0RFVklDRV9NT0QsIDB4MDBhYykKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX1NSQU1fQ09VTlQJCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0RFVklDRV9NT0QsIDB4MDBiMCkKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX1NSQU1fV0tVUF9TRVRVUAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9ERVZJQ0VfTU9ELCAweDAwYjQpCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9MRE9fU1JBTV9DT1JFX1NFVFVQCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fREVWSUNFX01PRCwgMHgwMGI4KQorI2RlZmluZSBPTUFQNDQzMF9QUk1fTERPX1NSQU1fQ09SRV9DVFJMCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0RFVklDRV9NT0QsIDB4MDBiYykKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX0xET19TUkFNX01QVV9TRVRVUAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9ERVZJQ0VfTU9ELCAweDAwYzApCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9MRE9fU1JBTV9NUFVfQ1RSTAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9ERVZJQ0VfTU9ELCAweDAwYzQpCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9MRE9fU1JBTV9JVkFfU0VUVVAJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fREVWSUNFX01PRCwgMHgwMGM4KQorI2RlZmluZSBPTUFQNDQzMF9QUk1fTERPX1NSQU1fSVZBX0NUUkwJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fREVWSUNFX01PRCwgMHgwMGNjKQorI2RlZmluZSBPTUFQNDQzMF9QUk1fTERPX0FCQl9NUFVfU0VUVVAJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fREVWSUNFX01PRCwgMHgwMGQwKQorI2RlZmluZSBPTUFQNDQzMF9QUk1fTERPX0FCQl9NUFVfQ1RSTAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9ERVZJQ0VfTU9ELCAweDAwZDQpCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9MRE9fQUJCX0lWQV9TRVRVUAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9ERVZJQ0VfTU9ELCAweDAwZDgpCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9MRE9fQUJCX0lWQV9DVFJMCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0RFVklDRV9NT0QsIDB4MDBkYykKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX0xET19CQU5ER0FQX0NUUkwJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fREVWSUNFX01PRCwgMHgwMGUwKQorI2RlZmluZSBPTUFQNDQzMF9QUk1fREVWSUNFX09GRl9DVFJMCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0RFVklDRV9NT0QsIDB4MDBlNCkKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX1BIQVNFMV9DTkRQCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfUFJNX0RFVklDRV9NT0QsIDB4MDBlOCkKKyNkZWZpbmUgT01BUDQ0MzBfUFJNX1BIQVNFMkFfQ05EUAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9ERVZJQ0VfTU9ELCAweDAwZWMpCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9QSEFTRTJCX0NORFAJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9QUk1fREVWSUNFX01PRCwgMHgwMGYwKQorI2RlZmluZSBPTUFQNDQzMF9QUk1fTU9ERU1fSUZfQ1RSTAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX1BSTV9ERVZJQ0VfTU9ELCAweDAwZjQpCisKKy8qIENISVJPTl9QUkNNICovCisKKworLyogQ0hJUk9OX1BSQ00uQ0hJUk9OU1NfT0NQX1NPQ0tFVF9QUkNNIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUkVWSVNJT05fUFJDTQkJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9DSElST05TU19DSElST05TU19PQ1BfU09DS0VUX1BSQ01fTU9ELCAweDAwMDApCisKKy8qIENISVJPTl9QUkNNLkNISVJPTlNTX0RFVklDRV9QUk0gcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBPTUFQNDQzMF9DSElST05fUFJDTV9QUk1fUlNUU1QJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9DSElST05TU19DSElST05TU19ERVZJQ0VfUFJNX01PRCwgMHgwMDAwKQorCisvKiBDSElST05fUFJDTS5DSElST05TU19DUFUwIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUE1fUERBX0NQVTBfUFdSU1RDVFJMCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfQ0hJUk9OU1NfQ0hJUk9OU1NfQ1BVMF9NT0QsIDB4MDAwMCkKKyNkZWZpbmUgT01BUDQ0MzBfUE1fUERBX0NQVTBfUFdSU1RTVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX0NISVJPTlNTX0NISVJPTlNTX0NQVTBfTU9ELCAweDAwMDQpCisjZGVmaW5lIE9NQVA0NDMwX1JNX1BEQV9DUFUwX0NQVTBfQ09OVEVYVAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfQ0hJUk9OU1NfQ0hJUk9OU1NfQ1BVMF9NT0QsIDB4MDAwOCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fUERBX0NQVTBfQ1BVMF9SU1RDVFJMCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9DSElST05TU19DSElST05TU19DUFUwX01PRCwgMHgwMDBjKQorI2RlZmluZSBPTUFQNDQzMF9STV9QREFfQ1BVMF9DUFUwX1JTVFNUCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfQ0hJUk9OU1NfQ0hJUk9OU1NfQ1BVMF9NT0QsIDB4MDAxMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fUERBX0NQVTBfQ1BVMF9DTEtDVFJMCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9DSElST05TU19DSElST05TU19DUFUwX01PRCwgMHgwMDE0KQorI2RlZmluZSBPTUFQNDQzMF9DTV9QREFfQ1BVMF9DTEtTVENUUkwJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9DSElST05TU19DSElST05TU19DUFUwX01PRCwgMHgwMDE4KQorCisvKiBDSElST05fUFJDTS5DSElST05TU19DUFUxIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgT01BUDQ0MzBfUE1fUERBX0NQVTFfUFdSU1RDVFJMCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfQ0hJUk9OU1NfQ0hJUk9OU1NfQ1BVMV9NT0QsIDB4MDAwMCkKKyNkZWZpbmUgT01BUDQ0MzBfUE1fUERBX0NQVTFfUFdSU1RTVAkJCU9NQVA0NFhYX1BSTV9SRUdBRERSKE9NQVA0NDMwX0NISVJPTlNTX0NISVJPTlNTX0NQVTFfTU9ELCAweDAwMDQpCisjZGVmaW5lIE9NQVA0NDMwX1JNX1BEQV9DUFUxX0NQVTFfQ09OVEVYVAkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfQ0hJUk9OU1NfQ0hJUk9OU1NfQ1BVMV9NT0QsIDB4MDAwOCkKKyNkZWZpbmUgT01BUDQ0MzBfUk1fUERBX0NQVTFfQ1BVMV9SU1RDVFJMCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9DSElST05TU19DSElST05TU19DUFUxX01PRCwgMHgwMDBjKQorI2RlZmluZSBPTUFQNDQzMF9STV9QREFfQ1BVMV9DUFUxX1JTVFNUCQkJT01BUDQ0WFhfUFJNX1JFR0FERFIoT01BUDQ0MzBfQ0hJUk9OU1NfQ0hJUk9OU1NfQ1BVMV9NT0QsIDB4MDAxMCkKKyNkZWZpbmUgT01BUDQ0MzBfQ01fUERBX0NQVTFfQ1BVMV9DTEtDVFJMCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9DSElST05TU19DSElST05TU19DUFUxX01PRCwgMHgwMDE0KQorI2RlZmluZSBPTUFQNDQzMF9DTV9QREFfQ1BVMV9DTEtTVENUUkwJCQlPTUFQNDRYWF9QUk1fUkVHQUREUihPTUFQNDQzMF9DSElST05TU19DSElST05TU19DUFUxX01PRCwgMHgwMDE4KQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3NkcmMuaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvc2RyYy5oCmluZGV4IDQ4MjA3YjAuLjY4ZjU3YmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvc2RyYy5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvc2RyYy5oCkBAIC0xOCw2ICsxOCw5IEBACiAjaW5jbHVkZSA8cGxhdC9zZHJjLmg+CiAKICNpZm5kZWYgX19BU1NFTUJMRVJfXworCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKwogZXh0ZXJuIHZvaWQgX19pb21lbSAqb21hcDJfc2RyY19iYXNlOwogZXh0ZXJuIHZvaWQgX19pb21lbSAqb21hcDJfc21zX2Jhc2U7CiAKQEAgLTU2LDQgKzU5LDIwIEBACiAJCQlPTUFQMl9MM19JT19BRERSRVNTKE9NQVAzNDNYX1NEUkNfQkFTRSArIChyZWcpKQogI2VuZGlmCS8qIF9fQVNTRU1CTEVSX18gKi8KIAorLyogTWluaW11bSBmcmVxdWVuY3kgdGhhdCB0aGUgU0RSQyBETEwgY2FuIGxvY2sgYXQgKi8KKyNkZWZpbmUgTUlOX1NEUkNfRExMX0xPQ0tfRlJFUQkJODMwMDAwMDAKKworLyogU2NhbGUgZmFjdG9yIGZvciBmaXhlZC1wb2ludCBhcml0aCBpbiBvbWFwM19jb3JlX2RwbGxfbTJfc2V0X3JhdGUoKSAqLworI2RlZmluZSBTRFJDX01QVVJBVEVfU0NBTEUJCTgKKworLyogMl5TRFJDX01QVVJBVEVfQkFTRV9TSElGVDogTVBVIE1IeiB0aGF0IFNEUkNfTVBVUkFURV9MT09QUyBpcyBkZWZpbmVkIGZvciAqLworI2RlZmluZSBTRFJDX01QVVJBVEVfQkFTRV9TSElGVAkJOQorCisvKgorICogU0RSQ19NUFVSQVRFX0xPT1BTOiBOdW1iZXIgb2YgTVBVIGxvb3BzIHRvIGV4ZWN1dGUgYXQKKyAqIDJeTVBVUkFURV9CQVNFX1NISUZUIE1IeiBmb3IgU0RSQyB0byBzdGFiaWxpemUKKyAqLworI2RlZmluZSBTRFJDX01QVVJBVEVfTE9PUFMJCTk2CisKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3NlcmlhbC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9zZXJpYWwuYwppbmRleCAyZTE3YjU3Li4zOWI3OTdiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3NlcmlhbC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvc2VyaWFsLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlICJwbS5oIgogI2luY2x1ZGUgInBybS1yZWdiaXRzLTM0eHguaCIKIAorI2RlZmluZSBVQVJUX09NQVBfTk9fRU1QVFlfRklGT19SRUFEX0lQX1JFVgkweDUyCiAjZGVmaW5lIFVBUlRfT01BUF9XRVIJCTB4MTcJLyogV2FrZS11cCBlbmFibGUgcmVnaXN0ZXIgKi8KIAogI2RlZmluZSBERUZBVUxUX1RJTUVPVVQgKDUgKiBIWikKQEAgLTU3Miw2ICs1NzMsMjMgQEAKICNlbmRpZgogfTsKIAorLyoKKyAqIE92ZXJyaWRlIHRoZSBkZWZhdWx0IDgyNTAgcmVhZCBoYW5kbGVyOiBtZW1fc2VyaWFsX2luKCkKKyAqIEVtcHR5IFJYIGZpZm8gcmVhZCBjYXVzZXMgYW4gYWJvcnQgb24gb21hcDM2MzAgYW5kIG9tYXA0CisgKiBUaGlzIGZ1bmN0aW9uIG1ha2VzIHN1cmUgdGhhdCBhbiBlbXB0eSByeCBmaWZvIGlzIG5vdCByZWFkIG9uIHRoZXNlIHNpbGljb25zCisgKiAoT01BUDEvMi8zNDMwIGFyZSBub3QgYWZmZWN0ZWQpCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2VyaWFsX2luX292ZXJyaWRlKHN0cnVjdCB1YXJ0X3BvcnQgKnVwLCBpbnQgb2Zmc2V0KQoreworCWlmIChVQVJUX1JYID09IG9mZnNldCkgeworCQl1bnNpZ25lZCBpbnQgbHNyOworCQlsc3IgPSBzZXJpYWxfcmVhZF9yZWcob21hcF91YXJ0W3VwLT5saW5lXS5wLCBVQVJUX0xTUik7CisJCWlmICghKGxzciAmIFVBUlRfTFNSX0RSKSkKKwkJCXJldHVybiAtRVBFUk07CisJfQorCXJldHVybiBzZXJpYWxfcmVhZF9yZWcob21hcF91YXJ0W3VwLT5saW5lXS5wLCBvZmZzZXQpOworfQorCiB2b2lkIF9faW5pdCBvbWFwX3NlcmlhbF9lYXJseV9pbml0KHZvaWQpCiB7CiAJaW50IGk7CkBAIC02MzEsMjQgKzY0OSw2NCBAQAogCX0KIH0KIAorLyoqCisgKiBvbWFwX3NlcmlhbF9pbml0X3BvcnQoKSAtIGluaXRpYWxpemUgc2luZ2xlIHNlcmlhbCBwb3J0CisgKiBAcG9ydDogc2VyaWFsIHBvcnQgbnVtYmVyICgwLTMpCisgKgorICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaWVzIHNlcmlhbCBkcml2ZXIgZm9yIGdpdmVuIEBwb3J0IG9ubHkuCisgKiBQbGF0Zm9ybXMgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiBpbnN0ZWFkIG9mIG9tYXBfc2VyaWFsX2luaXQoKQorICogaWYgdGhleSBkb24ndCBwbGFuIHRvIHVzZSBhbGwgYXZhaWxhYmxlIFVBUlRzIGFzIHNlcmlhbCBwb3J0cy4KKyAqCisgKiBEb24ndCBtaXggY2FsbHMgdG8gb21hcF9zZXJpYWxfaW5pdF9wb3J0KCkgYW5kIG9tYXBfc2VyaWFsX2luaXQoKSwKKyAqIHVzZSBvbmx5IG9uZSBvZiB0aGUgdHdvLgorICovCit2b2lkIF9faW5pdCBvbWFwX3NlcmlhbF9pbml0X3BvcnQoaW50IHBvcnQpCit7CisJc3RydWN0IG9tYXBfdWFydF9zdGF0ZSAqdWFydDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCUJVR19PTihwb3J0IDwgMCk7CisJQlVHX09OKHBvcnQgPj0gQVJSQVlfU0laRShvbWFwX3VhcnQpKTsKKworCXVhcnQgPSAmb21hcF91YXJ0W3BvcnRdOworCXBkZXYgPSAmdWFydC0+cGRldjsKKwlkZXYgPSAmcGRldi0+ZGV2OworCisJb21hcF91YXJ0X3Jlc2V0KHVhcnQpOworCW9tYXBfdWFydF9pZGxlX2luaXQodWFydCk7CisKKwlpZiAoV0FSTl9PTihwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIocGRldikpKQorCQlyZXR1cm47CisKKwlpZiAoKGNwdV9pc19vbWFwMzR4eCgpICYmIHVhcnQtPnBhZGNvbmYpIHx8CisJICAgICh1YXJ0LT53a19lbiAmJiB1YXJ0LT53a19tYXNrKSkgeworCQlkZXZpY2VfaW5pdF93YWtldXAoZGV2LCB0cnVlKTsKKwkJREVWX0NSRUFURV9GSUxFKGRldiwgJmRldl9hdHRyX3NsZWVwX3RpbWVvdXQpOworCX0KKworCQkvKiBvbWFwNDR4eDogTmV2ZXIgcmVhZCBlbXB0eSBVQVJUIGZpZm8KKwkJICogb21hcDN4eHg6IE5ldmVyIHJlYWQgZW1wdHkgVUFSVCBmaWZvIG9uIFVBUlRzCisJCSAqIHdpdGggSVAgcmV2ID49MHg1MgorCQkgKi8KKwkJaWYgKGNwdV9pc19vbWFwNDR4eCgpKQorCQkJdWFydC0+cC0+c2VyaWFsX2luID0gc2VyaWFsX2luX292ZXJyaWRlOworCQllbHNlIGlmICgoc2VyaWFsX3JlYWRfcmVnKHVhcnQtPnAsIFVBUlRfT01BUF9NVkVSKSAmIDB4RkYpCisJCQkJPj0gVUFSVF9PTUFQX05PX0VNUFRZX0ZJRk9fUkVBRF9JUF9SRVYpCisJCQl1YXJ0LT5wLT5zZXJpYWxfaW4gPSBzZXJpYWxfaW5fb3ZlcnJpZGU7Cit9CisKKy8qKgorICogb21hcF9zZXJpYWxfaW5pdCgpIC0gaW50aWFsaXplIGFsbCBzdXBwb3J0ZWQgc2VyaWFsIHBvcnRzCisgKgorICogSW5pdGlhbGl6ZXMgYWxsIGF2YWlsYWJsZSBVQVJUcyBhcyBzZXJpYWwgcG9ydHMuIFBsYXRmb3JtcworICogY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHRoZXkgd2FudCB0byBoYXZlIGRlZmF1bHQgYmVoYXZpb3VyCisgKiBmb3Igc2VyaWFsIHBvcnRzIChlLmcgaW5pdGlhbGl6ZSB0aGVtIGFsbCBhcyBzZXJpYWwgcG9ydHMpLgorICovCiB2b2lkIF9faW5pdCBvbWFwX3NlcmlhbF9pbml0KHZvaWQpCiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvbWFwX3VhcnQpOyBpKyspIHsKLQkJc3RydWN0IG9tYXBfdWFydF9zdGF0ZSAqdWFydCA9ICZvbWFwX3VhcnRbaV07Ci0JCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSAmdWFydC0+cGRldjsKLQkJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKLQotCQlvbWFwX3VhcnRfcmVzZXQodWFydCk7Ci0JCW9tYXBfdWFydF9pZGxlX2luaXQodWFydCk7Ci0KLQkJaWYgKFdBUk5fT04ocGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKHBkZXYpKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoKGNwdV9pc19vbWFwMzR4eCgpICYmIHVhcnQtPnBhZGNvbmYpIHx8Ci0JCSAgICAodWFydC0+d2tfZW4gJiYgdWFydC0+d2tfbWFzaykpIHsKLQkJCWRldmljZV9pbml0X3dha2V1cChkZXYsIHRydWUpOwotCQkJREVWX0NSRUFURV9GSUxFKGRldiwgJmRldl9hdHRyX3NsZWVwX3RpbWVvdXQpOwotCQl9Ci0JfQorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9tYXBfdWFydCk7IGkrKykKKwkJb21hcF9zZXJpYWxfaW5pdF9wb3J0KGkpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9zcmFtMzR4eC5TIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9zcmFtMzR4eC5TCmluZGV4IDgyYWE0YTMuLmRlOTliYTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvc3JhbTM0eHguUworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3NyYW0zNHh4LlMKQEAgLTkxLDggKzkxLDE5IEBACiAgKiAgbmV3IFNEUkNfQUNUSU1fQ1RSTF9CXzEgcmVnaXN0ZXIgY29udGVudHMKICAqICBuZXcgU0RSQ19NUl8xIHJlZ2lzdGVyIHZhbHVlCiAgKgotICogSWYgdGhlIHBhcmFtIFNEUkNfUkZSX0NUUkxfMSBpcyAwLCB0aGUgcGFyYW1ldGVycwotICogIGFyZSBub3QgcHJvZ3JhbW1lZCBpbnRvIHRoZSBTRFJDIENTMSByZWdpc3RlcnMKKyAqIElmIHRoZSBwYXJhbSBTRFJDX1JGUl9DVFJMXzEgaXMgMCwgdGhlIHBhcmFtZXRlcnMgYXJlIG5vdCBwcm9ncmFtbWVkIGludG8KKyAqIHRoZSBTRFJDIENTMSByZWdpc3RlcnMKKyAqCisgKiBOT1RFOiBUaGlzIGNvZGUgbm8gbG9uZ2VyIGF0dGVtcHRzIHRvIHByb2dyYW0gdGhlIFNEUkMgQUMgdGltaW5nIGFuZCBNUgorICogcmVnaXN0ZXJzLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBjb2RlIGN1cnJlbnRseSBjYW5ub3QgZW5zdXJlIHRoYXQgYWxsCisgKiBMMyBpbml0aWF0b3JzIChlLmcuLCBzRE1BLCBJVkEsIERTUyBESVNQQywgZXRjLikgYXJlIG5vdCBhY2Nlc3NpbmcgdGhlCisgKiBTRFJBTSB3aGVuIHRoZSByZWdpc3RlcnMgYXJlIHdyaXR0ZW4uICBJZiB0aGUgcmVnaXN0ZXJzIGFyZSBjaGFuZ2VkIHdoaWxlCisgKiBhbiBpbml0aWF0b3IgaXMgYWNjZXNzaW5nIFNEUkFNLCBtZW1vcnkgY2FuIGJlIGNvcnJ1cHRlZCBhbmQvb3IgdGhlIFNEUkMKKyAqIG1heSBlbnRlciBhbiB1bnByZWRpY3RhYmxlIHN0YXRlLiAgSW4gdGhlIGZ1dHVyZSwgdGhlIGludGVudCBpcyB0bworICogcmUtZW5hYmxlIHRoaXMgY29kZSBpbiBjYXNlcyB3aGVyZSB3ZSBjYW4gZW5zdXJlIHRoYXQgbm8gaW5pdGlhdG9ycyBhcmUKKyAqIHRvdWNoaW5nIHRoZSBTRFJBTS4gIFVudGlsIHRoYXQgdGltZSwgdXNlcnMgd2hvIGtub3cgdGhhdCB0aGVpciB1c2UgY2FzZQorICogY2FuIHNhdGlzZnkgdGhlIGFib3ZlIHJlcXVpcmVtZW50IGNhbiBlbmFibGUgdGhlIENPTkZJR19PTUFQM19TRFJDX0FDX1RJTUlORworICogb3B0aW9uLgogICovCiBFTlRSWShvbWFwM19zcmFtX2NvbmZpZ3VyZV9jb3JlX2RwbGwpCiAJc3RtZmQJc3AhLCB7cjEtcjEyLCBscn0JQCBzdG9yZSByZWdzIHRvIHN0YWNrCkBAIC0yMTksNiArMjMwLDcgQEAKIAlsZHIJcjEyLCBvbWFwX3NkcmNfcmZyX2N0cmxfMF92YWwJQCBmZXRjaCB2YWx1ZSBmcm9tIFNSQU0KIAlsZHIJcjExLCBvbWFwM19zZHJjX3Jmcl9jdHJsXzAJQCBmZXRjaCBhZGRyIGZyb20gU1JBTQogCXN0cglyMTIsIFtyMTFdCQkJQCBzdG9yZQorI2lmZGVmIENPTkZJR19PTUFQM19TRFJDX0FDX1RJTUlORwogCWxkcglyMTIsIG9tYXBfc2RyY19hY3RpbV9jdHJsX2FfMF92YWwKIAlsZHIJcjExLCBvbWFwM19zZHJjX2FjdGltX2N0cmxfYV8wCiAJc3RyCXIxMiwgW3IxMV0KQEAgLTIyOCwxMSArMjQwLDEzIEBACiAJbGRyCXIxMiwgb21hcF9zZHJjX21yXzBfdmFsCiAJbGRyCXIxMSwgb21hcDNfc2RyY19tcl8wCiAJc3RyCXIxMiwgW3IxMV0KKyNlbmRpZgogCWxkcglyMTIsIG9tYXBfc2RyY19yZnJfY3RybF8xX3ZhbAogCWNtcAlyMTIsICMwCQkJQCBpZiBTRFJDX1JGUl9DVFJMXzEgaXMgMCwKIAliZXEJc2tpcF9jczFfcHJvZwkJQCAgZG8gbm90IHByb2dyYW0gY3MxIHBhcmFtcwogCWxkcglyMTEsIG9tYXAzX3NkcmNfcmZyX2N0cmxfMQogCXN0cglyMTIsIFtyMTFdCisjaWZkZWYgQ09ORklHX09NQVAzX1NEUkNfQUNfVElNSU5HCiAJbGRyCXIxMiwgb21hcF9zZHJjX2FjdGltX2N0cmxfYV8xX3ZhbAogCWxkcglyMTEsIG9tYXAzX3NkcmNfYWN0aW1fY3RybF9hXzEKIAlzdHIJcjEyLCBbcjExXQpAQCAtMjQyLDYgKzI1Niw3IEBACiAJbGRyCXIxMiwgb21hcF9zZHJjX21yXzFfdmFsCiAJbGRyCXIxMSwgb21hcDNfc2RyY19tcl8xCiAJc3RyCXIxMiwgW3IxMV0KKyNlbmRpZgogc2tpcF9jczFfcHJvZzoKIAlsZHIJcjEyLCBbcjExXQkJQCBwb3N0ZWQtd3JpdGUgYmFycmllciBmb3IgU0RSQwogCWJ4CWxyCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3VzYi1laGNpLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3VzYi1laGNpLmMKaW5kZXggZTQ0OGFiZC4uZjFkZjg3MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi91c2ItZWhjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvdXNiLWVoY2kuYwpAQCAtMjcsNiArMjcsOCBAQAogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPHBsYXQvdXNiLmg+CiAKKyNpbmNsdWRlICJtdXguaCIKKwogI2lmIGRlZmluZWQoQ09ORklHX1VTQl9FSENJX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX0VIQ0lfSENEX01PRFVMRSkKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBlaGNpX3Jlc291cmNlc1tdID0gewpAQCAtNzIsMzIgKzc0LDQ0IEBACiB7CiAJc3dpdGNoIChwb3J0X21vZGVbMF0pIHsKIAljYXNlIEVIQ0lfSENEX09NQVBfTU9ERV9QSFk6Ci0JCW9tYXBfY2ZnX3JlZyhZOV8zNDMwX1VTQjFIU19QSFlfU1RQKTsKLQkJb21hcF9jZmdfcmVnKFk4XzM0MzBfVVNCMUhTX1BIWV9DTEspOwotCQlvbWFwX2NmZ19yZWcoQUExNF8zNDMwX1VTQjFIU19QSFlfRElSKTsKLQkJb21hcF9jZmdfcmVnKEFBMTFfMzQzMF9VU0IxSFNfUEhZX05YVCk7Ci0JCW9tYXBfY2ZnX3JlZyhXMTNfMzQzMF9VU0IxSFNfUEhZX0RBVEEwKTsKLQkJb21hcF9jZmdfcmVnKFcxMl8zNDMwX1VTQjFIU19QSFlfREFUQTEpOwotCQlvbWFwX2NmZ19yZWcoVzExXzM0MzBfVVNCMUhTX1BIWV9EQVRBMik7Ci0JCW9tYXBfY2ZnX3JlZyhZMTFfMzQzMF9VU0IxSFNfUEhZX0RBVEEzKTsKLQkJb21hcF9jZmdfcmVnKFc5XzM0MzBfVVNCMUhTX1BIWV9EQVRBNCk7Ci0JCW9tYXBfY2ZnX3JlZyhZMTJfMzQzMF9VU0IxSFNfUEhZX0RBVEE1KTsKLQkJb21hcF9jZmdfcmVnKFc4XzM0MzBfVVNCMUhTX1BIWV9EQVRBNik7Ci0JCW9tYXBfY2ZnX3JlZyhZMTNfMzQzMF9VU0IxSFNfUEhZX0RBVEE3KTsKKwkJb21hcF9tdXhfaW5pdF9zaWduYWwoImhzdXNiMV9zdHAiLCBPTUFQX1BJTl9PVVRQVVQpOworCQlvbWFwX211eF9pbml0X3NpZ25hbCgiaHN1c2IxX2NsayIsIE9NQVBfUElOX09VVFBVVCk7CisJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJoc3VzYjFfZGlyIiwgT01BUF9QSU5fSU5QVVRfUFVMTERPV04pOworCQlvbWFwX211eF9pbml0X3NpZ25hbCgiaHN1c2IxX254dCIsIE9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKKwkJb21hcF9tdXhfaW5pdF9zaWduYWwoImhzdXNiMV9kYXRhMCIsIE9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKKwkJb21hcF9tdXhfaW5pdF9zaWduYWwoImhzdXNiMV9kYXRhMSIsIE9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKKwkJb21hcF9tdXhfaW5pdF9zaWduYWwoImhzdXNiMV9kYXRhMiIsIE9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKKwkJb21hcF9tdXhfaW5pdF9zaWduYWwoImhzdXNiMV9kYXRhMyIsIE9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKKwkJb21hcF9tdXhfaW5pdF9zaWduYWwoImhzdXNiMV9kYXRhNCIsIE9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKKwkJb21hcF9tdXhfaW5pdF9zaWduYWwoImhzdXNiMV9kYXRhNSIsIE9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKKwkJb21hcF9tdXhfaW5pdF9zaWduYWwoImhzdXNiMV9kYXRhNiIsIE9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKKwkJb21hcF9tdXhfaW5pdF9zaWduYWwoImhzdXNiMV9kYXRhNyIsIE9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKIAkJYnJlYWs7CiAJY2FzZSBFSENJX0hDRF9PTUFQX01PREVfVExMOgotCQlvbWFwX2NmZ19yZWcoWTlfMzQzMF9VU0IxSFNfVExMX1NUUCk7Ci0JCW9tYXBfY2ZnX3JlZyhZOF8zNDMwX1VTQjFIU19UTExfQ0xLKTsKLQkJb21hcF9jZmdfcmVnKEFBMTRfMzQzMF9VU0IxSFNfVExMX0RJUik7Ci0JCW9tYXBfY2ZnX3JlZyhBQTExXzM0MzBfVVNCMUhTX1RMTF9OWFQpOwotCQlvbWFwX2NmZ19yZWcoVzEzXzM0MzBfVVNCMUhTX1RMTF9EQVRBMCk7Ci0JCW9tYXBfY2ZnX3JlZyhXMTJfMzQzMF9VU0IxSFNfVExMX0RBVEExKTsKLQkJb21hcF9jZmdfcmVnKFcxMV8zNDMwX1VTQjFIU19UTExfREFUQTIpOwotCQlvbWFwX2NmZ19yZWcoWTExXzM0MzBfVVNCMUhTX1RMTF9EQVRBMyk7Ci0JCW9tYXBfY2ZnX3JlZyhXOV8zNDMwX1VTQjFIU19UTExfREFUQTQpOwotCQlvbWFwX2NmZ19yZWcoWTEyXzM0MzBfVVNCMUhTX1RMTF9EQVRBNSk7Ci0JCW9tYXBfY2ZnX3JlZyhXOF8zNDMwX1VTQjFIU19UTExfREFUQTYpOwotCQlvbWFwX2NmZ19yZWcoWTEzXzM0MzBfVVNCMUhTX1RMTF9EQVRBNyk7CisJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJoc3VzYjFfdGxsX3N0cCIsCisJCQlPTUFQX1BJTl9JTlBVVF9QVUxMVVApOworCQlvbWFwX211eF9pbml0X3NpZ25hbCgiaHN1c2IxX3RsbF9jbGsiLAorCQkJT01BUF9QSU5fSU5QVVRfUFVMTERPV04pOworCQlvbWFwX211eF9pbml0X3NpZ25hbCgiaHN1c2IxX3RsbF9kaXIiLAorCQkJT01BUF9QSU5fSU5QVVRfUFVMTERPV04pOworCQlvbWFwX211eF9pbml0X3NpZ25hbCgiaHN1c2IxX3RsbF9ueHQiLAorCQkJT01BUF9QSU5fSU5QVVRfUFVMTERPV04pOworCQlvbWFwX211eF9pbml0X3NpZ25hbCgiaHN1c2IxX3RsbF9kYXRhMCIsCisJCQlPTUFQX1BJTl9JTlBVVF9QVUxMRE9XTik7CisJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJoc3VzYjFfdGxsX2RhdGExIiwKKwkJCU9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKKwkJb21hcF9tdXhfaW5pdF9zaWduYWwoImhzdXNiMV90bGxfZGF0YTIiLAorCQkJT01BUF9QSU5fSU5QVVRfUFVMTERPV04pOworCQlvbWFwX211eF9pbml0X3NpZ25hbCgiaHN1c2IxX3RsbF9kYXRhMyIsCisJCQlPTUFQX1BJTl9JTlBVVF9QVUxMRE9XTik7CisJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJoc3VzYjFfdGxsX2RhdGE0IiwKKwkJCU9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKKwkJb21hcF9tdXhfaW5pdF9zaWduYWwoImhzdXNiMV90bGxfZGF0YTUiLAorCQkJT01BUF9QSU5fSU5QVVRfUFVMTERPV04pOworCQlvbWFwX211eF9pbml0X3NpZ25hbCgiaHN1c2IxX3RsbF9kYXRhNiIsCisJCQlPTUFQX1BJTl9JTlBVVF9QVUxMRE9XTik7CisJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJoc3VzYjFfdGxsX2RhdGE3IiwKKwkJCU9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKIAkJYnJlYWs7CiAJY2FzZSBFSENJX0hDRF9PTUFQX01PREVfVU5LTk9XTjoKIAkJLyogRkFMTFRIUk9VR0ggKi8KQEAgLTEwNywzMiArMTIxLDUyIEBACiAKIAlzd2l0Y2ggKHBvcnRfbW9kZVsxXSkgewogCWNhc2UgRUhDSV9IQ0RfT01BUF9NT0RFX1BIWToKLQkJb21hcF9jZmdfcmVnKEFBMTBfMzQzMF9VU0IySFNfUEhZX1NUUCk7Ci0JCW9tYXBfY2ZnX3JlZyhBQThfMzQzMF9VU0IySFNfUEhZX0NMSyk7Ci0JCW9tYXBfY2ZnX3JlZyhBQTlfMzQzMF9VU0IySFNfUEhZX0RJUik7Ci0JCW9tYXBfY2ZnX3JlZyhBQjExXzM0MzBfVVNCMkhTX1BIWV9OWFQpOwotCQlvbWFwX2NmZ19yZWcoQUIxMF8zNDMwX1VTQjJIU19QSFlfREFUQTApOwotCQlvbWFwX2NmZ19yZWcoQUI5XzM0MzBfVVNCMkhTX1BIWV9EQVRBMSk7Ci0JCW9tYXBfY2ZnX3JlZyhXM18zNDMwX1VTQjJIU19QSFlfREFUQTIpOwotCQlvbWFwX2NmZ19yZWcoVDRfMzQzMF9VU0IySFNfUEhZX0RBVEEzKTsKLQkJb21hcF9jZmdfcmVnKFQzXzM0MzBfVVNCMkhTX1BIWV9EQVRBNCk7Ci0JCW9tYXBfY2ZnX3JlZyhSM18zNDMwX1VTQjJIU19QSFlfREFUQTUpOwotCQlvbWFwX2NmZ19yZWcoUjRfMzQzMF9VU0IySFNfUEhZX0RBVEE2KTsKLQkJb21hcF9jZmdfcmVnKFQyXzM0MzBfVVNCMkhTX1BIWV9EQVRBNyk7CisJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJoc3VzYjJfc3RwIiwgT01BUF9QSU5fT1VUUFVUKTsKKwkJb21hcF9tdXhfaW5pdF9zaWduYWwoImhzdXNiMl9jbGsiLCBPTUFQX1BJTl9PVVRQVVQpOworCQlvbWFwX211eF9pbml0X3NpZ25hbCgiaHN1c2IyX2RpciIsIE9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKKwkJb21hcF9tdXhfaW5pdF9zaWduYWwoImhzdXNiMl9ueHQiLCBPTUFQX1BJTl9JTlBVVF9QVUxMRE9XTik7CisJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJoc3VzYjJfZGF0YTAiLAorCQkJT01BUF9QSU5fSU5QVVRfUFVMTERPV04pOworCQlvbWFwX211eF9pbml0X3NpZ25hbCgiaHN1c2IyX2RhdGExIiwKKwkJCU9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKKwkJb21hcF9tdXhfaW5pdF9zaWduYWwoImhzdXNiMl9kYXRhMiIsCisJCQlPTUFQX1BJTl9JTlBVVF9QVUxMRE9XTik7CisJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJoc3VzYjJfZGF0YTMiLAorCQkJT01BUF9QSU5fSU5QVVRfUFVMTERPV04pOworCQlvbWFwX211eF9pbml0X3NpZ25hbCgiaHN1c2IyX2RhdGE0IiwKKwkJCU9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKKwkJb21hcF9tdXhfaW5pdF9zaWduYWwoImhzdXNiMl9kYXRhNSIsCisJCQlPTUFQX1BJTl9JTlBVVF9QVUxMRE9XTik7CisJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJoc3VzYjJfZGF0YTYiLAorCQkJT01BUF9QSU5fSU5QVVRfUFVMTERPV04pOworCQlvbWFwX211eF9pbml0X3NpZ25hbCgiaHN1c2IyX2RhdGE3IiwKKwkJCU9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKIAkJYnJlYWs7CiAJY2FzZSBFSENJX0hDRF9PTUFQX01PREVfVExMOgotCQlvbWFwX2NmZ19yZWcoQUExMF8zNDMwX1VTQjJIU19UTExfU1RQKTsKLQkJb21hcF9jZmdfcmVnKEFBOF8zNDMwX1VTQjJIU19UTExfQ0xLKTsKLQkJb21hcF9jZmdfcmVnKEFBOV8zNDMwX1VTQjJIU19UTExfRElSKTsKLQkJb21hcF9jZmdfcmVnKEFCMTFfMzQzMF9VU0IySFNfVExMX05YVCk7Ci0JCW9tYXBfY2ZnX3JlZyhBQjEwXzM0MzBfVVNCMkhTX1RMTF9EQVRBMCk7Ci0JCW9tYXBfY2ZnX3JlZyhBQjlfMzQzMF9VU0IySFNfVExMX0RBVEExKTsKLQkJb21hcF9jZmdfcmVnKFczXzM0MzBfVVNCMkhTX1RMTF9EQVRBMik7Ci0JCW9tYXBfY2ZnX3JlZyhUNF8zNDMwX1VTQjJIU19UTExfREFUQTMpOwotCQlvbWFwX2NmZ19yZWcoVDNfMzQzMF9VU0IySFNfVExMX0RBVEE0KTsKLQkJb21hcF9jZmdfcmVnKFIzXzM0MzBfVVNCMkhTX1RMTF9EQVRBNSk7Ci0JCW9tYXBfY2ZnX3JlZyhSNF8zNDMwX1VTQjJIU19UTExfREFUQTYpOwotCQlvbWFwX2NmZ19yZWcoVDJfMzQzMF9VU0IySFNfVExMX0RBVEE3KTsKKwkJb21hcF9tdXhfaW5pdF9zaWduYWwoImhzdXNiMl90bGxfc3RwIiwKKwkJCU9NQVBfUElOX0lOUFVUX1BVTExVUCk7CisJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJoc3VzYjJfdGxsX2NsayIsCisJCQlPTUFQX1BJTl9JTlBVVF9QVUxMRE9XTik7CisJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJoc3VzYjJfdGxsX2RpciIsCisJCQlPTUFQX1BJTl9JTlBVVF9QVUxMRE9XTik7CisJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJoc3VzYjJfdGxsX254dCIsCisJCQlPTUFQX1BJTl9JTlBVVF9QVUxMRE9XTik7CisJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJoc3VzYjJfdGxsX2RhdGEwIiwKKwkJCU9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKKwkJb21hcF9tdXhfaW5pdF9zaWduYWwoImhzdXNiMl90bGxfZGF0YTEiLAorCQkJT01BUF9QSU5fSU5QVVRfUFVMTERPV04pOworCQlvbWFwX211eF9pbml0X3NpZ25hbCgiaHN1c2IyX3RsbF9kYXRhMiIsCisJCQlPTUFQX1BJTl9JTlBVVF9QVUxMRE9XTik7CisJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJoc3VzYjJfdGxsX2RhdGEzIiwKKwkJCU9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKKwkJb21hcF9tdXhfaW5pdF9zaWduYWwoImhzdXNiMl90bGxfZGF0YTQiLAorCQkJT01BUF9QSU5fSU5QVVRfUFVMTERPV04pOworCQlvbWFwX211eF9pbml0X3NpZ25hbCgiaHN1c2IyX3RsbF9kYXRhNSIsCisJCQlPTUFQX1BJTl9JTlBVVF9QVUxMRE9XTik7CisJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJoc3VzYjJfdGxsX2RhdGE2IiwKKwkJCU9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKKwkJb21hcF9tdXhfaW5pdF9zaWduYWwoImhzdXNiMl90bGxfZGF0YTciLAorCQkJT01BUF9QSU5fSU5QVVRfUFVMTERPV04pOwogCQlicmVhazsKIAljYXNlIEVIQ0lfSENEX09NQVBfTU9ERV9VTktOT1dOOgogCQkvKiBGQUxMVEhST1VHSCAqLwpAQCAtMTQ1LDE4ICsxNzksMzAgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiUG9ydDMgY2FuJ3QgYmUgdXNlZCBpbiBQSFkgbW9kZVxuIik7CiAJCWJyZWFrOwogCWNhc2UgRUhDSV9IQ0RfT01BUF9NT0RFX1RMTDoKLQkJb21hcF9jZmdfcmVnKEFCM18zNDMwX1VTQjNIU19UTExfU1RQKTsKLQkJb21hcF9jZmdfcmVnKEFBNl8zNDMwX1VTQjNIU19UTExfQ0xLKTsKLQkJb21hcF9jZmdfcmVnKEFBM18zNDMwX1VTQjNIU19UTExfRElSKTsKLQkJb21hcF9jZmdfcmVnKFkzXzM0MzBfVVNCM0hTX1RMTF9OWFQpOwotCQlvbWFwX2NmZ19yZWcoQUE1XzM0MzBfVVNCM0hTX1RMTF9EQVRBMCk7Ci0JCW9tYXBfY2ZnX3JlZyhZNF8zNDMwX1VTQjNIU19UTExfREFUQTEpOwotCQlvbWFwX2NmZ19yZWcoWTVfMzQzMF9VU0IzSFNfVExMX0RBVEEyKTsKLQkJb21hcF9jZmdfcmVnKFc1XzM0MzBfVVNCM0hTX1RMTF9EQVRBMyk7Ci0JCW9tYXBfY2ZnX3JlZyhBQjEyXzM0MzBfVVNCM0hTX1RMTF9EQVRBNCk7Ci0JCW9tYXBfY2ZnX3JlZyhBQjEzXzM0MzBfVVNCM0hTX1RMTF9EQVRBNSk7Ci0JCW9tYXBfY2ZnX3JlZyhBQTEzXzM0MzBfVVNCM0hTX1RMTF9EQVRBNik7Ci0JCW9tYXBfY2ZnX3JlZyhBQTEyXzM0MzBfVVNCM0hTX1RMTF9EQVRBNyk7CisJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJoc3VzYjNfdGxsX3N0cCIsCisJCQlPTUFQX1BJTl9JTlBVVF9QVUxMVVApOworCQlvbWFwX211eF9pbml0X3NpZ25hbCgiaHN1c2IzX3RsbF9jbGsiLAorCQkJT01BUF9QSU5fSU5QVVRfUFVMTERPV04pOworCQlvbWFwX211eF9pbml0X3NpZ25hbCgiaHN1c2IzX3RsbF9kaXIiLAorCQkJT01BUF9QSU5fSU5QVVRfUFVMTERPV04pOworCQlvbWFwX211eF9pbml0X3NpZ25hbCgiaHN1c2IzX3RsbF9ueHQiLAorCQkJT01BUF9QSU5fSU5QVVRfUFVMTERPV04pOworCQlvbWFwX211eF9pbml0X3NpZ25hbCgiaHN1c2IzX3RsbF9kYXRhMCIsCisJCQlPTUFQX1BJTl9JTlBVVF9QVUxMRE9XTik7CisJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJoc3VzYjNfdGxsX2RhdGExIiwKKwkJCU9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKKwkJb21hcF9tdXhfaW5pdF9zaWduYWwoImhzdXNiM190bGxfZGF0YTIiLAorCQkJT01BUF9QSU5fSU5QVVRfUFVMTERPV04pOworCQlvbWFwX211eF9pbml0X3NpZ25hbCgiaHN1c2IzX3RsbF9kYXRhMyIsCisJCQlPTUFQX1BJTl9JTlBVVF9QVUxMRE9XTik7CisJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJoc3VzYjNfdGxsX2RhdGE0IiwKKwkJCU9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKKwkJb21hcF9tdXhfaW5pdF9zaWduYWwoImhzdXNiM190bGxfZGF0YTUiLAorCQkJT01BUF9QSU5fSU5QVVRfUFVMTERPV04pOworCQlvbWFwX211eF9pbml0X3NpZ25hbCgiaHN1c2IzX3RsbF9kYXRhNiIsCisJCQlPTUFQX1BJTl9JTlBVVF9QVUxMRE9XTik7CisJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJoc3VzYjNfdGxsX2RhdGE3IiwKKwkJCU9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKIAkJYnJlYWs7CiAJY2FzZSBFSENJX0hDRF9PTUFQX01PREVfVU5LTk9XTjoKIAkJLyogRkFMTFRIUk9VR0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXB4YS9LY29uZmlnCmluZGV4IGQ4OWM2YWQuLmU2ZDhlMTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvS2NvbmZpZwpAQCAtNjMsNiArNjMsMTUgQEAKIAlzZWxlY3QgSEFWRV9QV00KIAlzZWxlY3QgUFhBX0hBVkVfQk9BUkRfSVJRUwogCXNlbGVjdCBQWEFfSEFWRV9JU0FfSVJRUworCXNlbGVjdCBBUkNPTV9QQ01DSUEKKworY29uZmlnIE1BQ0hfQVJDT01fWkVVUworCWJvb2wgIkFyY29tL0V1cm90ZWNoIFpFVVMgU0JDIgorCXNlbGVjdCBQWEEyN3gKKwlzZWxlY3QgSVNBCisJc2VsZWN0IFBYQV9IQVZFX0JPQVJEX0lSUVMKKwlzZWxlY3QgUFhBX0hBVkVfSVNBX0lSUVMKKwlzZWxlY3QgQVJDT01fUENNQ0lBCiAKIGNvbmZpZyBNQUNIX0JBTExPT04zCiAJYm9vbCAiQmFsbG9vbiAzIGJvYXJkIgpAQCAtMTc5LDYgKzE4OCwxMSBAQAogCiBlbmRjaG9pY2UKIAorY29uZmlnIEFSQ09NX1BDTUNJQQorCWJvb2wKKwloZWxwCisJICBHZW5lcmljIG9wdGlvbiBmb3IgQXJjb20gVmlwZXIvWmV1cyBQQ01DSUEKKwogY29uZmlnIFRSSVpFUFNfUENNQ0lBCiAJYm9vbAogCWhlbHAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1weGEvTWFrZWZpbGUKaW5kZXggYjVkMjllNi4uZjY0YWZkYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvTWFrZWZpbGUKQEAgLTM4LDYgKzM4LDcgQEAKICMgM3JkIFBhcnR5IERldiBQbGF0Zm9ybXMKIG9iai0kKENPTkZJR19BUkNIX1BYQV9JRFApCSs9IGlkcC5vCiBvYmotJChDT05GSUdfQVJDSF9WSVBFUikJKz0gdmlwZXIubworb2JqLSQoQ09ORklHX01BQ0hfQVJDT01fWkVVUykJKz0gemV1cy5vCiBvYmotJChDT05GSUdfTUFDSF9CQUxMT09OMykJKz0gYmFsbG9vbjMubwogb2JqLSQoQ09ORklHX01BQ0hfQ1NCNzI2KQkrPSBjc2I3MjYubwogb2JqLSQoQ09ORklHX0NTQjcyNl9DU0I3MDEpCSs9IGNzYjcwMS5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9lbS14MjcwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9lbS14MjcwLmMKaW5kZXggMWMwZGU4MC4uYzhhMDFiYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvZW0teDI3MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2VtLXgyNzAuYwpAQCAtNDk3LDE2ICs0OTcsMTUgQEAKIAkJZ290byBlcnJfZnJlZV92YnVzX2dwaW87CiAKIAkvKiBVU0IgSHViIHBvd2VyLW9uIGFuZCByZXNldCAqLwotCWdwaW9fZGlyZWN0aW9uX291dHB1dCh1c2JfaHViX3Jlc2V0LCAwKTsKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQodXNiX2h1Yl9yZXNldCwgMSk7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU85X1VTQl9WQlVTX0VOLCAwKTsKIAlyZWd1bGF0b3JfZW5hYmxlKGVtX3gyNzBfdXNiX2xkbyk7Ci0JZ3Bpb19zZXRfdmFsdWUodXNiX2h1Yl9yZXNldCwgMSk7CiAJZ3Bpb19zZXRfdmFsdWUodXNiX2h1Yl9yZXNldCwgMCk7CisJZ3Bpb19zZXRfdmFsdWUodXNiX2h1Yl9yZXNldCwgMSk7CiAJcmVndWxhdG9yX2Rpc2FibGUoZW1feDI3MF91c2JfbGRvKTsKIAlyZWd1bGF0b3JfZW5hYmxlKGVtX3gyNzBfdXNiX2xkbyk7Ci0JZ3Bpb19zZXRfdmFsdWUodXNiX2h1Yl9yZXNldCwgMSk7Ci0KLQkvKiBlbmFibGUgVkJVUyAqLwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPOV9VU0JfVkJVU19FTiwgMSk7CisJZ3Bpb19zZXRfdmFsdWUodXNiX2h1Yl9yZXNldCwgMCk7CisJZ3Bpb19zZXRfdmFsdWUoR1BJTzlfVVNCX1ZCVVNfRU4sIDEpOwogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9hcmNvbS1wY21jaWEuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9hcmNvbS1wY21jaWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDI4YmU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2FyY29tLXBjbWNpYS5oCkBAIC0wLDAgKzEsMTEgQEAKKyNpZm5kZWYgX19BUkNPTV9QQ01DSUFfSAorI2RlZmluZSBfX0FSQ09NX1BDTUNJQV9ICisKK3N0cnVjdCBhcmNvbV9wY21jaWFfcGRhdGEgeworCWludAljZF9ncGlvOworCWludAlyZHlfZ3BpbzsKKwlpbnQJcHdyX2dwaW87CisJdm9pZAkoKnJlc2V0KShpbnQgc3RhdGUpOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvdmlwZXIuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC92aXBlci5oCmluZGV4IDEwOTg4YzIuLjVmNWZiZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC92aXBlci5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC92aXBlci5oCkBAIC04NSw4ICs4NSw2IEBACiAvKiBJbnRlcnJ1cHQgYW5kIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKFZJUEVSX0lDUikgKi8KIC8qIFRoaXMgaXMgYSB3cml0ZSBvbmx5IHJlZ2lzdGVyLiBPbmx5IENGX1JTVCBpcyB1c2VkIHVuZGVyIExpbnV4ICovCiAKLWV4dGVybiB2b2lkIHZpcGVyX2NmX3JzdChpbnQgc3RhdGUpOwotCiAjZGVmaW5lIFZJUEVSX0lDUl9SRVRSSUcJKDEgPDwgMCkKICNkZWZpbmUgVklQRVJfSUNSX0FVVE9fQ0xSCSgxIDw8IDEpCiAjZGVmaW5lIFZJUEVSX0lDUl9SX0RJUwkJKDEgPDwgMikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC96ZXVzLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvemV1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzODcwNDYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvemV1cy5oCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiAgYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3pldXMuaAorICoKKyAqICBBdXRob3I6CURhdmlkIFZyYWJlbAorICogIENyZWF0ZWQ6CVNlcHQgMjgsIDIwMDUKKyAqICBDb3B5cmlnaHQ6CUFyY29tIENvbnRyb2wgU3lzdGVtcyBMdGQuCisgKgorICogIE1haW50YWluZWQgYnk6IE1hcmMgWnluZ2llciA8bWF6QG1pc3RlcmpvbmVzLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX01BQ0hfWkVVU19ICisjZGVmaW5lIF9NQUNIX1pFVVNfSAorCisvKiBQaHlzaWNhbCBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgWkVVU19GTEFTSF9QSFlTCQlQWEFfQ1MwX1BIWVMKKyNkZWZpbmUgWkVVU19FVEgwX1BIWVMJCVBYQV9DUzFfUEhZUworI2RlZmluZSBaRVVTX0VUSDFfUEhZUwkJUFhBX0NTMl9QSFlTCisjZGVmaW5lIFpFVVNfQ1BMRF9QSFlTCQkoUFhBX0NTNF9QSFlTKzB4MjAwMDAwMCkKKyNkZWZpbmUgWkVVU19TUkFNX1BIWVMJCVBYQV9DUzVfUEhZUworI2RlZmluZSBaRVVTX1BDMTA0SU9fUEhZUwkoMHgzMDAwMDAwMCkKKworI2RlZmluZSBaRVVTX0NQTERfVkVSU0lPTl9QSFlTCShaRVVTX0NQTERfUEhZUyArIDB4MDAwMDAwMDApCisjZGVmaW5lIFpFVVNfQ1BMRF9JU0FfSVJRX1BIWVMJKFpFVVNfQ1BMRF9QSFlTICsgMHgwMDgwMDAwMCkKKyNkZWZpbmUgWkVVU19DUExEX0NPTlRST0xfUEhZUwkoWkVVU19DUExEX1BIWVMgKyAweDAxMDAwMDAwKQorI2RlZmluZSBaRVVTX0NQTERfRVhUV0RPR19QSFlTCShaRVVTX0NQTERfUEhZUyArIDB4MDE4MDAwMDApCisKKy8qIEdQSU9zICovCisjZGVmaW5lIFpFVVNfQUM5N19HUElPCQkwCisjZGVmaW5lIFpFVVNfV0FLRVVQX0dQSU8JMQorI2RlZmluZSBaRVVTX1VBUlRBX0dQSU8JCTkKKyNkZWZpbmUgWkVVU19VQVJUQl9HUElPCQkxMAorI2RlZmluZSBaRVVTX1VBUlRDX0dQSU8JCTEyCisjZGVmaW5lIFpFVVNfVUFSVERfR1BJTwkJMTEKKyNkZWZpbmUgWkVVU19FVEgwX0dQSU8JCTE0CisjZGVmaW5lIFpFVVNfSVNBX0dQSU8JCTE3CisjZGVmaW5lIFpFVVNfQktMRU5fR1BJTwkJMTkKKyNkZWZpbmUgWkVVU19VU0IyX1BXUkVOX0dQSU8JMjIKKyNkZWZpbmUgWkVVU19QVFRfR1BJTwkJMjcKKyNkZWZpbmUgWkVVU19DRl9DRF9HUElPICAgICAgICAgMzUKKyNkZWZpbmUgWkVVU19NTUNfV1BfR1BJTyAgICAgICAgNTIKKyNkZWZpbmUgWkVVU19NTUNfQ0RfR1BJTyAgICAgICAgNTMKKyNkZWZpbmUgWkVVU19FWFRHUElPX0dQSU8JOTEKKyNkZWZpbmUgWkVVU19DRl9QV0VOX0dQSU8gICAgICAgOTcKKyNkZWZpbmUgWkVVU19DRl9SRFlfR1BJTyAgICAgICAgOTkKKyNkZWZpbmUgWkVVU19MQ0RfRU5fR1BJTwkxMDEKKyNkZWZpbmUgWkVVU19FVEgxX0dQSU8JCTExMworI2RlZmluZSBaRVVTX0NBTl9HUElPCQkxMTYKKworI2RlZmluZSBaRVVTX0VYVDBfR1BJT19CQVNFCTEyOAorI2RlZmluZSBaRVVTX0VYVDFfR1BJT19CQVNFCTE2MAorI2RlZmluZSBaRVVTX1VTRVJfR1BJT19CQVNFCTE5MgorCisjZGVmaW5lIFpFVVNfRVhUMF9HUElPKHgpCShaRVVTX0VYVDBfR1BJT19CQVNFICsgKHgpKQorI2RlZmluZSBaRVVTX0VYVDFfR1BJTyh4KQkoWkVVU19FWFQxX0dQSU9fQkFTRSArICh4KSkKKyNkZWZpbmUgWkVVU19VU0VSX0dQSU8oeCkJKFpFVVNfVVNFUl9HUElPX0JBU0UgKyAoeCkpCisKKy8qCisgKiBDUExEIHJlZ2lzdGVyczoKKyAqIE9ubHkgNCByZWdpc3RlcnMsIGJ1dCBzcHJlYWRlZCBvdmVyIGEgMzJNQiBhZGRyZXNzIHNwYWNlLgorICogQmUgZ2VudGxlLCBhbmQgcmVtYXAgdGhhdCBvdmVyIDMya0IuLi4KKyAqLworCisjZGVmaW5lIFpFVVNfQ1BMRAkJKDB4ZjAwMDAwMDApCisjZGVmaW5lIFpFVVNfQ1BMRF9WRVJTSU9OCShaRVVTX0NQTEQgKyAweDAwMDApCisjZGVmaW5lIFpFVVNfQ1BMRF9JU0FfSVJRCShaRVVTX0NQTEQgKyAweDEwMDApCisjZGVmaW5lIFpFVVNfQ1BMRF9DT05UUk9MCShaRVVTX0NQTEQgKyAweDIwMDApCisjZGVmaW5lIFpFVVNfQ1BMRF9FWFRXRE9HCShaRVVTX0NQTEQgKyAweDMwMDApCisKKy8qIENQTEQgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBaRVVTX0NQTERfQ09OVFJPTF9DRl9SU1QgICAgICAgIDB4MDEKKworI2RlZmluZSBaRVVTX1BDMTA0SU8JCSgweGYxMDAwMDAwKQorCisjZGVmaW5lIFpFVVNfU1JBTV9TSVpFCQkoMjU2ICogMTAyNCkKKworI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvdmlwZXIuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3ZpcGVyLmMKaW5kZXggY2YwZDcxYi4uNTM1MmI0ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvdmlwZXIuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS92aXBlci5jCkBAIC00Nyw2ICs0Nyw3IEBACiAjaW5jbHVkZSA8bWFjaC9weGFmYi5oPgogI2luY2x1ZGUgPHBsYXQvaTJjLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLXVhcnQuaD4KKyNpbmNsdWRlIDxtYWNoL2FyY29tLXBjbWNpYS5oPgogI2luY2x1ZGUgPG1hY2gvdmlwZXIuaD4KIAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgpAQCAtNzYsMTQgKzc3LDI4IEBACiB9CiAKIC8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmcm9tIHRoZSBwY21jaWEgbW9kdWxlIHRvIHJlc2V0IHRoZSBDRiAqLwotdm9pZCB2aXBlcl9jZl9yc3QoaW50IHN0YXRlKQorc3RhdGljIHZvaWQgdmlwZXJfY2ZfcmVzZXQoaW50IHN0YXRlKQogewogCWlmIChzdGF0ZSkKIAkJdmlwZXJfaWNyX3NldF9iaXQoVklQRVJfSUNSX0NGX1JTVCk7CiAJZWxzZQogCQl2aXBlcl9pY3JfY2xlYXJfYml0KFZJUEVSX0lDUl9DRl9SU1QpOwogfQotRVhQT1JUX1NZTUJPTCh2aXBlcl9jZl9yc3QpOworCitzdGF0aWMgc3RydWN0IGFyY29tX3BjbWNpYV9wZGF0YSB2aXBlcl9wY21jaWFfaW5mbyA9IHsKKwkuY2RfZ3Bpbwk9IFZJUEVSX0NGX0NEX0dQSU8sCisJLnJkeV9ncGlvCT0gVklQRVJfQ0ZfUkRZX0dQSU8sCisJLnB3cl9ncGlvCT0gVklQRVJfQ0ZfUE9XRVJfR1BJTywKKwkucmVzZXQJCT0gdmlwZXJfY2ZfcmVzZXQsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB2aXBlcl9wY21jaWFfZGV2aWNlID0geworCS5uYW1lCQk9ICJ2aXBlci1wY21jaWEiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdmlwZXJfcGNtY2lhX2luZm8sCisJfSwKK307CiAKIC8qCiAgKiBUaGUgQ1BMRCB2ZXJzaW9uIHJlZ2lzdGVyIHdhcyBub3QgcHJlc2VudCBvbiBWSVBFUiBib2FyZHMgcHJpb3IgdG8KQEAgLTY4NSw2ICs3MDAsNyBAQAogCSZ2aXBlcl9tdGRfZGV2aWNlc1swXSwKIAkmdmlwZXJfbXRkX2RldmljZXNbMV0sCiAJJnZpcGVyX2JhY2tsaWdodF9kZXZpY2UsCisJJnZpcGVyX3BjbWNpYV9kZXZpY2UsCiB9OwogCiBzdGF0aWMgbWZwX2NmZ190IHZpcGVyX3Bpbl9jb25maWdbXSBfX2luaXRkYXRhID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvemV1cy5jIGIvYXJjaC9hcm0vbWFjaC1weGEvemV1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOTg2YTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS96ZXVzLmMKQEAgLTAsMCArMSw4MjAgQEAKKy8qCisgKiAgU3VwcG9ydCBmb3IgdGhlIEFyY29tIFpFVVMuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiBBcmNvbSBDb250cm9sIFN5c3RlbXMgTHRkLgorICoKKyAqICBMb29zZWx5IGJhc2VkIG9uIEFyY29tJ3MgMi42LjE2LjI4LgorICogIE1haW50YWluZWQgYnkgTWFyYyBaeW5naWVyIDxtYXpAbWlzdGVyam9uZXMub3JnPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtOTAwMC5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjL3BjYTk1M3guaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSA8cGxhdC9pMmMuaD4KKworI2luY2x1ZGUgPG1hY2gvcHhhMnh4LXJlZ3MuaD4KKyNpbmNsdWRlIDxtYWNoL3JlZ3MtdWFydC5oPgorI2luY2x1ZGUgPG1hY2gvb2hjaS5oPgorI2luY2x1ZGUgPG1hY2gvbW1jLmg+CisjaW5jbHVkZSA8bWFjaC9weGEyN3gtdWRjLmg+CisjaW5jbHVkZSA8bWFjaC91ZGMuaD4KKyNpbmNsdWRlIDxtYWNoL3B4YWZiLmg+CisjaW5jbHVkZSA8bWFjaC9weGEyeHhfc3BpLmg+CisjaW5jbHVkZSA8bWFjaC9tZnAtcHhhMjd4Lmg+CisjaW5jbHVkZSA8bWFjaC9wbS5oPgorI2luY2x1ZGUgPG1hY2gvYXVkaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2FyY29tLXBjbWNpYS5oPgorI2luY2x1ZGUgPG1hY2gvemV1cy5oPgorCisjaW5jbHVkZSAiZ2VuZXJpYy5oIgorCisvKgorICogSW50ZXJydXB0IGhhbmRsaW5nCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgemV1c19pcnFfZW5hYmxlZF9tYXNrOworc3RhdGljIGNvbnN0IGludCB6ZXVzX2lzYV9pcnFzW10gPSB7IDMsIDQsIDUsIDYsIDcsIDEwLCAxMSwgMTIsIH07CitzdGF0aWMgY29uc3QgaW50IHpldXNfaXNhX2lycV9tYXBbXSA9IHsKKwkwLAkJLyogSVNBIGlycSAjMCwgaW52YWxpZCAqLworCTAsCQkvKiBJU0EgaXJxICMxLCBpbnZhbGlkICovCisJMCwJCS8qIElTQSBpcnEgIzIsIGludmFsaWQgKi8KKwkxIDw8IDAsCQkvKiBJU0EgaXJxICMzICovCisJMSA8PCAxLAkJLyogSVNBIGlycSAjNCAqLworCTEgPDwgMiwJCS8qIElTQSBpcnEgIzUgKi8KKwkxIDw8IDMsCQkvKiBJU0EgaXJxICM2ICovCisJMSA8PCA0LAkJLyogSVNBIGlycSAjNyAqLworCTAsCQkvKiBJU0EgaXJxICM4LCBpbnZhbGlkICovCisJMCwJCS8qIElTQSBpcnEgIzksIGludmFsaWQgKi8KKwkxIDw8IDUsCQkvKiBJU0EgaXJxICMxMCAqLworCTEgPDwgNiwJCS8qIElTQSBpcnEgIzExICovCisJMSA8PCA3LAkJLyogSVNBIGlycSAjMTIgKi8KK307CisKK3N0YXRpYyBpbmxpbmUgaW50IHpldXNfaXJxX3RvX2JpdG1hc2sodW5zaWduZWQgaW50IGlycSkKK3sKKwlyZXR1cm4gemV1c19pc2FfaXJxX21hcFtpcnEgLSBQWEFfSVNBX0lSUSgwKV07Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHpldXNfYml0X3RvX2lycShpbnQgYml0KQoreworCXJldHVybiB6ZXVzX2lzYV9pcnFzW2JpdF0gKyBQWEFfSVNBX0lSUSgwKTsKK30KKworc3RhdGljIHZvaWQgemV1c19hY2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJX19yYXdfd3JpdGV3KHpldXNfaXJxX3RvX2JpdG1hc2soaXJxKSwgWkVVU19DUExEX0lTQV9JUlEpOworfQorCitzdGF0aWMgdm9pZCB6ZXVzX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJemV1c19pcnFfZW5hYmxlZF9tYXNrICY9IH4oemV1c19pcnFfdG9fYml0bWFzayhpcnEpKTsKK30KKworc3RhdGljIHZvaWQgemV1c191bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJemV1c19pcnFfZW5hYmxlZF9tYXNrIHw9IHpldXNfaXJxX3RvX2JpdG1hc2soaXJxKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHpldXNfaXJxX3BlbmRpbmcodm9pZCkKK3sKKwlyZXR1cm4gX19yYXdfcmVhZHcoWkVVU19DUExEX0lTQV9JUlEpICYgemV1c19pcnFfZW5hYmxlZF9tYXNrOworfQorCitzdGF0aWMgdm9pZCB6ZXVzX2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwl1bnNpZ25lZCBsb25nIHBlbmRpbmc7CisKKwlwZW5kaW5nID0gemV1c19pcnFfcGVuZGluZygpOworCWRvIHsKKwkJLyogd2UncmUgaW4gYSBjaGFpbmVkIGlycSBoYW5kbGVyLAorCQkgKiBzbyBhY2sgdGhlIGludGVycnVwdCBieSBoYW5kICovCisJCWRlc2MtPmNoaXAtPmFjayhncGlvX3RvX2lycShaRVVTX0lTQV9HUElPKSk7CisKKwkJaWYgKGxpa2VseShwZW5kaW5nKSkgeworCQkJaXJxID0gemV1c19iaXRfdG9faXJxKF9fZmZzKHBlbmRpbmcpKTsKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShpcnEpOworCQl9CisJCXBlbmRpbmcgPSB6ZXVzX2lycV9wZW5kaW5nKCk7CisJfSB3aGlsZSAocGVuZGluZyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgemV1c19pcnFfY2hpcCA9IHsKKwkubmFtZQk9ICJJU0EiLAorCS5hY2sJPSB6ZXVzX2Fja19pcnEsCisJLm1hc2sJPSB6ZXVzX21hc2tfaXJxLAorCS51bm1hc2sJPSB6ZXVzX3VubWFza19pcnEsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgemV1c19pbml0X2lycSh2b2lkKQoreworCWludCBsZXZlbDsKKwlpbnQgaXNhX2lycTsKKworCXB4YTI3eF9pbml0X2lycSgpOworCisJLyogUGVyaXBoZXJhbCBJUlFzLiBJdCB3b3VsZCBiZSBuaWNlIHRvIG1vdmUgdGhvc2UgaW5zaWRlIGRyaXZlcgorCSAgIGNvbmZpZ3VyYXRpb24sIGJ1dCBpdCBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnQuICovCisJc2V0X2lycV90eXBlKGdwaW9fdG9faXJxKFpFVVNfQUM5N19HUElPKSwJSVJRX1RZUEVfRURHRV9SSVNJTkcpOworCXNldF9pcnFfdHlwZShncGlvX3RvX2lycShaRVVTX1dBS0VVUF9HUElPKSwJSVJRX1RZUEVfRURHRV9SSVNJTkcpOworCXNldF9pcnFfdHlwZShncGlvX3RvX2lycShaRVVTX1BUVF9HUElPKSwJSVJRX1RZUEVfRURHRV9SSVNJTkcpOworCXNldF9pcnFfdHlwZShncGlvX3RvX2lycShaRVVTX0VYVEdQSU9fR1BJTyksCUlSUV9UWVBFX0VER0VfRkFMTElORyk7CisJc2V0X2lycV90eXBlKGdwaW9fdG9faXJxKFpFVVNfQ0FOX0dQSU8pLAlJUlFfVFlQRV9FREdFX0ZBTExJTkcpOworCisJLyogU2V0dXAgSVNBIElSUXMgKi8KKwlmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBBUlJBWV9TSVpFKHpldXNfaXNhX2lycXMpOyBsZXZlbCsrKSB7CisJCWlzYV9pcnEgPSB6ZXVzX2JpdF90b19pcnEobGV2ZWwpOworCQlzZXRfaXJxX2NoaXAoaXNhX2lycSwgJnpldXNfaXJxX2NoaXApOworCQlzZXRfaXJxX2hhbmRsZXIoaXNhX2lycSwgaGFuZGxlX2VkZ2VfaXJxKTsKKwkJc2V0X2lycV9mbGFncyhpc2FfaXJxLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CisJfQorCisJc2V0X2lycV90eXBlKGdwaW9fdG9faXJxKFpFVVNfSVNBX0dQSU8pLCBJUlFfVFlQRV9FREdFX1JJU0lORyk7CisJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoZ3Bpb190b19pcnEoWkVVU19JU0FfR1BJTyksIHpldXNfaXJxX2hhbmRsZXIpOworfQorCisKKy8qCisgKiBQbGF0Zm9ybSBkZXZpY2VzCisgKi8KKworLyogRmxhc2ggKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgemV1c19tdGRfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geyAvKiBOT1IgRmxhc2ggKHVwIHRvIDY0TUIpICovCisJCS5zdGFydAk9IFpFVVNfRkxBU0hfUEhZUywKKwkJLmVuZAk9IFpFVVNfRkxBU0hfUEhZUyArIFNaXzY0TSAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geyAvKiBTUkFNICovCisJCS5zdGFydAk9IFpFVVNfU1JBTV9QSFlTLAorCQkuZW5kCT0gWkVVU19TUkFNX1BIWVMgKyBTWl81MTJLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIHpldXNfZmxhc2hfZGF0YVtdID0geworCVswXSA9IHsKKwkJLndpZHRoCQk9IDIsCisJCS5wYXJ0cwkJPSBOVUxMLAorCQkubnJfcGFydHMJPSAwLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB6ZXVzX210ZF9kZXZpY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQkJPSAicGh5c21hcC1mbGFzaCIsCisJCS5pZAkJPSAwLAorCQkuZGV2CQk9IHsKKwkJCS5wbGF0Zm9ybV9kYXRhID0gJnpldXNfZmxhc2hfZGF0YVswXSwKKwkJfSwKKwkJLnJlc291cmNlCT0gJnpldXNfbXRkX3Jlc291cmNlc1swXSwKKwkJLm51bV9yZXNvdXJjZXMJPSAxLAorCX0sCit9OworCisvKiBTZXJpYWwgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgemV1c19zZXJpYWxfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJPSAweDEwMDAwMDAwLAorCQkuZW5kCT0gMHgxMDAwMDAwZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydAk9IDB4MTA4MDAwMDAsCisJCS5lbmQJPSAweDEwODAwMDBmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0CT0gMHgxMTAwMDAwMCwKKwkJLmVuZAk9IDB4MTEwMDAwMGYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQJPSAweDQwMTAwMDAwLAorCQkuZW5kCT0gMHg0MDEwMDAxZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydAk9IDB4NDAyMDAwMDAsCisJCS5lbmQJPSAweDQwMjAwMDFmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0CT0gMHg0MDcwMDAwMCwKKwkJLmVuZAk9IDB4NDA3MDAwMWYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IHNlcmlhbF9wbGF0Zm9ybV9kYXRhW10gPSB7CisJLyogRXh0ZXJuYWwgVUFSVHMgKi8KKwkvKiBGSVhNRTogU2hhcmVkIElSUXMgb24gQ09NMS1DT000IHdpbGwgbm90IHdvcmsgcHJvcGVybHkgb24gdjFpMSBoYXJkd2FyZS4gKi8KKwl7IC8qIENPTTEgKi8KKwkJLm1hcGJhc2UJPSAweDEwMDAwMDAwLAorCQkuaXJxCQk9IGdwaW9fdG9faXJxKFpFVVNfVUFSVEFfR1BJTyksCisJCS5pcnFmbGFncwk9IElSUUZfVFJJR0dFUl9SSVNJTkcsCisJCS51YXJ0Y2xrCT0gMTQ3NDU2MDAsCisJCS5yZWdzaGlmdAk9IDEsCisJCS5mbGFncwkJPSBVUEZfSU9SRU1BUCB8IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCwKKwkJLmlvdHlwZQkJPSBVUElPX01FTSwKKwl9LAorCXsgLyogQ09NMiAqLworCQkubWFwYmFzZQk9IDB4MTA4MDAwMDAsCisJCS5pcnEJCT0gZ3Bpb190b19pcnEoWkVVU19VQVJUQl9HUElPKSwKKwkJLmlycWZsYWdzCT0gSVJRRl9UUklHR0VSX1JJU0lORywKKwkJLnVhcnRjbGsJPSAxNDc0NTYwMCwKKwkJLnJlZ3NoaWZ0CT0gMSwKKwkJLmZsYWdzCQk9IFVQRl9JT1JFTUFQIHwgVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNULAorCQkuaW90eXBlCQk9IFVQSU9fTUVNLAorCX0sCisJeyAvKiBDT00zICovCisJCS5tYXBiYXNlCT0gMHgxMTAwMDAwMCwKKwkJLmlycQkJPSBncGlvX3RvX2lycShaRVVTX1VBUlRDX0dQSU8pLAorCQkuaXJxZmxhZ3MJPSBJUlFGX1RSSUdHRVJfUklTSU5HLAorCQkudWFydGNsawk9IDE0NzQ1NjAwLAorCQkucmVnc2hpZnQJPSAxLAorCQkuZmxhZ3MJCT0gVVBGX0lPUkVNQVAgfCBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9TS0lQX1RFU1QsCisJCS5pb3R5cGUJCT0gVVBJT19NRU0sCisJfSwKKwl7IC8qIENPTTQgKi8KKwkJLm1hcGJhc2UJPSAweDExODAwMDAwLAorCQkuaXJxCQk9IGdwaW9fdG9faXJxKFpFVVNfVUFSVERfR1BJTyksCisJCS5pcnFmbGFncwk9IElSUUZfVFJJR0dFUl9SSVNJTkcsCisJCS51YXJ0Y2xrCT0gMTQ3NDU2MDAsCisJCS5yZWdzaGlmdAk9IDEsCisJCS5mbGFncwkJPSBVUEZfSU9SRU1BUCB8IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCwKKwkJLmlvdHlwZQkJPSBVUElPX01FTSwKKwl9LAorCS8qIEludGVybmFsIFVBUlRzICovCisJeyAvKiBGRlVBUlQgKi8KKwkJLm1lbWJhc2UJPSAodm9pZCAqKSZGRlVBUlQsCisJCS5tYXBiYXNlCT0gX19QUkVHKEZGVUFSVCksCisJCS5pcnEJCT0gSVJRX0ZGVUFSVCwKKwkJLnVhcnRjbGsJPSA5MjE2MDAgKiAxNiwKKwkJLnJlZ3NoaWZ0CT0gMiwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCwKKwkJLmlvdHlwZQkJPSBVUElPX01FTSwKKwl9LAorCXsgLyogQlRVQVJUICovCisJCS5tZW1iYXNlCT0gKHZvaWQgKikmQlRVQVJULAorCQkubWFwYmFzZQk9IF9fUFJFRyhCVFVBUlQpLAorCQkuaXJxCQk9IElSUV9CVFVBUlQsCisJCS51YXJ0Y2xrCT0gOTIxNjAwICogMTYsCisJCS5yZWdzaGlmdAk9IDIsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9TS0lQX1RFU1QsCisJCS5pb3R5cGUJCT0gVVBJT19NRU0sCisJfSwKKwl7IC8qIFNUVUFSVCAqLworCQkubWVtYmFzZQk9ICh2b2lkICopJlNUVUFSVCwKKwkJLm1hcGJhc2UJPSBfX1BSRUcoU1RVQVJUKSwKKwkJLmlycQkJPSBJUlFfU1RVQVJULAorCQkudWFydGNsawk9IDkyMTYwMCAqIDE2LAorCQkucmVnc2hpZnQJPSAyLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNULAorCQkuaW90eXBlCQk9IFVQSU9fTUVNLAorCX0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgemV1c19zZXJpYWxfZGV2aWNlID0geworCS5uYW1lID0gInNlcmlhbDgyNTAiLAorCS5pZCAgID0gUExBVDgyNTBfREVWX1BMQVRGT1JNLAorCS5kZXYgID0geworCQkucGxhdGZvcm1fZGF0YSA9IHNlcmlhbF9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHpldXNfc2VyaWFsX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gemV1c19zZXJpYWxfcmVzb3VyY2VzLAorfTsKKworLyogRXRoZXJuZXQgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgemV1c19kbTlrMF9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gWkVVU19FVEgwX1BIWVMsCisJCS5lbmQgICA9IFpFVVNfRVRIMF9QSFlTICsgMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0KKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gWkVVU19FVEgwX1BIWVMgKyAyLAorCQkuZW5kICAgPSBaRVVTX0VUSDBfUEhZUyArIDMsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNCisJfSwKKwlbMl0gPSB7CisJCS5zdGFydCA9IGdwaW9fdG9faXJxKFpFVVNfRVRIMF9HUElPKSwKKwkJLmVuZCAgID0gZ3Bpb190b19pcnEoWkVVU19FVEgwX0dQSU8pLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSB8IElPUkVTT1VSQ0VfSVJRX0xPV0VER0UsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgemV1c19kbTlrMV9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gWkVVU19FVEgxX1BIWVMsCisJCS5lbmQgICA9IFpFVVNfRVRIMV9QSFlTICsgMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0KKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gWkVVU19FVEgxX1BIWVMgKyAyLAorCQkuZW5kICAgPSBaRVVTX0VUSDFfUEhZUyArIDMsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzJdID0geworCQkuc3RhcnQgPSBncGlvX3RvX2lycShaRVVTX0VUSDFfR1BJTyksCisJCS5lbmQgICA9IGdwaW9fdG9faXJxKFpFVVNfRVRIMV9HUElPKSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEgfCBJT1JFU09VUkNFX0lSUV9MT1dFREdFLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGRtOTAwMF9wbGF0X2RhdGEgemV1c19kbTlrX3BsYXRkYXRhID0geworCS5mbGFncwkJPSBETTkwMDBfUExBVEZfMTZCSVRPTkxZLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgemV1c19kbTlrMF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImRtOTAwMCIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHpldXNfZG05azBfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IHpldXNfZG05azBfcmVzb3VyY2UsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJnpldXNfZG05a19wbGF0ZGF0YSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB6ZXVzX2RtOWsxX2RldmljZSA9IHsKKwkubmFtZQkJPSAiZG05MDAwIiwKKwkuaWQJCT0gMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoemV1c19kbTlrMV9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gemV1c19kbTlrMV9yZXNvdXJjZSwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmemV1c19kbTlrX3BsYXRkYXRhLAorCX0KK307CisKKy8qIEV4dGVybmFsIFNSQU0gKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgemV1c19zcmFtX3Jlc291cmNlID0geworCS5zdGFydAkJPSBaRVVTX1NSQU1fUEhZUywKKwkuZW5kCQk9IFpFVVNfU1JBTV9QSFlTICsgWkVVU19TUkFNX1NJWkUgKiAyIC0gMSwKKwkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB6ZXVzX3NyYW1fZGV2aWNlID0geworCS5uYW1lCQk9ICJweGEyeHgtOGJpdC1zcmFtIiwKKwkuaWQJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IDEsCisJLnJlc291cmNlCT0gJnpldXNfc3JhbV9yZXNvdXJjZSwKK307CisKKy8qIFNQSSBpbnRlcmZhY2Ugb24gU1NQMyAqLworc3RhdGljIHN0cnVjdCBweGEyeHhfc3BpX21hc3RlciBweGEyeHhfc3BpX3NzcDNfbWFzdGVyX2luZm8gPSB7CisJLm51bV9jaGlwc2VsZWN0ID0gMSwKKwkuZW5hYmxlX2RtYSAgICAgPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcHhhMnh4X3NwaV9zc3AzX2RldmljZSA9IHsKKwkubmFtZSA9ICJweGEyeHgtc3BpIiwKKwkuaWQgPSAzLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJnB4YTJ4eF9zcGlfc3NwM19tYXN0ZXJfaW5mbywKKwl9LAorfTsKKworLyogTGVkcyAqLworc3RhdGljIHN0cnVjdCBncGlvX2xlZCB6ZXVzX2xlZHNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCQkgPSAiemV1czp5ZWxsb3c6MSIsCisJCS5kZWZhdWx0X3RyaWdnZXIgPSAiaGVhcnRiZWF0IiwKKwkJLmdwaW8JCSA9IFpFVVNfRVhUMF9HUElPKDMpLAorCQkuYWN0aXZlX2xvdwkgPSAxLAorCX0sCisJWzFdID0geworCQkubmFtZQkJID0gInpldXM6eWVsbG93OjIiLAorCQkuZGVmYXVsdF90cmlnZ2VyID0gImRlZmF1bHQtb24iLAorCQkuZ3BpbwkJID0gWkVVU19FWFQwX0dQSU8oNCksCisJCS5hY3RpdmVfbG93CSA9IDEsCisJfSwKKwlbMl0gPSB7CisJCS5uYW1lCQkgPSAiemV1czp5ZWxsb3c6MyIsCisJCS5kZWZhdWx0X3RyaWdnZXIgPSAiZGVmYXVsdC1vbiIsCisJCS5ncGlvCQkgPSBaRVVTX0VYVDBfR1BJTyg1KSwKKwkJLmFjdGl2ZV9sb3cJID0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2xlZF9wbGF0Zm9ybV9kYXRhIHpldXNfbGVkc19pbmZvID0geworCS5sZWRzCQk9IHpldXNfbGVkcywKKwkubnVtX2xlZHMJPSBBUlJBWV9TSVpFKHpldXNfbGVkcyksCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB6ZXVzX2xlZHNfZGV2aWNlID0geworCS5uYW1lCQk9ICJsZWRzLWdwaW8iLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmemV1c19sZWRzX2luZm8sCisJfSwKK307CisKK3N0YXRpYyB2b2lkIHpldXNfY2ZfcmVzZXQoaW50IHN0YXRlKQoreworCXUxNiBjcGxkX3N0YXRlID0gX19yYXdfcmVhZHcoWkVVU19DUExEX0NPTlRST0wpOworCisJaWYgKHN0YXRlKQorCQljcGxkX3N0YXRlIHw9IFpFVVNfQ1BMRF9DT05UUk9MX0NGX1JTVDsKKwllbHNlCisJCWNwbGRfc3RhdGUgJj0gflpFVVNfQ1BMRF9DT05UUk9MX0NGX1JTVDsKKworCV9fcmF3X3dyaXRldyhjcGxkX3N0YXRlLCBaRVVTX0NQTERfQ09OVFJPTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXJjb21fcGNtY2lhX3BkYXRhIHpldXNfcGNtY2lhX2luZm8gPSB7CisJLmNkX2dwaW8JPSBaRVVTX0NGX0NEX0dQSU8sCisJLnJkeV9ncGlvCT0gWkVVU19DRl9SRFlfR1BJTywKKwkucHdyX2dwaW8JPSBaRVVTX0NGX1BXRU5fR1BJTywKKwkucmVzZXQJCT0gemV1c19jZl9yZXNldCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHpldXNfcGNtY2lhX2RldmljZSA9IHsKKwkubmFtZQkJPSAiemV1cy1wY21jaWEiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmemV1c19wY21jaWFfaW5mbywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnpldXNfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnpldXNfc2VyaWFsX2RldmljZSwKKwkmemV1c19tdGRfZGV2aWNlc1swXSwKKwkmemV1c19kbTlrMF9kZXZpY2UsCisJJnpldXNfZG05azFfZGV2aWNlLAorCSZ6ZXVzX3NyYW1fZGV2aWNlLAorCSZweGEyeHhfc3BpX3NzcDNfZGV2aWNlLAorCSZ6ZXVzX2xlZHNfZGV2aWNlLAorCSZ6ZXVzX3BjbWNpYV9kZXZpY2UsCit9OworCisvKiBBQyc5NyAqLworc3RhdGljIHB4YTJ4eF9hdWRpb19vcHNfdCB6ZXVzX2FjOTdfaW5mbyA9IHsKKwkucmVzZXRfZ3BpbyA9IDk1LAorfTsKKworCisvKgorICogVVNCIGhvc3QKKyAqLworCitzdGF0aWMgaW50IHpldXNfb2hjaV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgZXJyOworCisJLyogU3dpdGNoIG9uIHBvcnQgMi4gKi8KKwlpZiAoKGVyciA9IGdwaW9fcmVxdWVzdChaRVVTX1VTQjJfUFdSRU5fR1BJTywgIlVTQjJfUFdSRU4iKSkpIHsKKwkJZGV2X2VycihkZXYsICJDYW4ndCByZXF1ZXN0IFVTQjJfUFdSRU5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICgoZXJyID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KFpFVVNfVVNCMl9QV1JFTl9HUElPLCAxKSkpIHsKKwkJZ3Bpb19mcmVlKFpFVVNfVVNCMl9QV1JFTl9HUElPKTsKKwkJZGV2X2VycihkZXYsICJDYW4ndCBlbmFibGUgVVNCMl9QV1JFTlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogUG9ydCAyIGlzIHNoYXJlZCBiZXR3ZWVuIGhvc3QgYW5kIGNsaWVudCBpbnRlcmZhY2UuICovCisJVVAyT0NSID0gVVAyT0NSX0hYT0UgfCBVUDJPQ1JfSFhTIHwgVVAyT0NSX0RNUERFIHwgVVAyT0NSX0RQUERFOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHpldXNfb2hjaV9leGl0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwkvKiBQb3dlci1vZmYgcG9ydCAyICovCisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KFpFVVNfVVNCMl9QV1JFTl9HUElPLCAwKTsKKwlncGlvX2ZyZWUoWkVVU19VU0IyX1BXUkVOX0dQSU8pOworfQorCitzdGF0aWMgc3RydWN0IHB4YW9oY2lfcGxhdGZvcm1fZGF0YSB6ZXVzX29oY2lfcGxhdGZvcm1fZGF0YSA9IHsKKwkucG9ydF9tb2RlCT0gUE1NX05QU19NT0RFLAorCS5mbGFncwkJPSBFTkFCTEVfUE9SVF9BTEwgfCBQT1dFUl9DT05UUk9MX0xPVyB8IFBPV0VSX1NFTlNFX0xPVywKKwkuaW5pdAkJPSB6ZXVzX29oY2lfaW5pdCwKKwkuZXhpdAkJPSB6ZXVzX29oY2lfZXhpdCwKK307CisKKy8qCisgKiBGbGF0IFBhbmVsCisgKi8KKworc3RhdGljIHZvaWQgemV1c19sY2RfcG93ZXIoaW50IG9uLCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnNpKQoreworCWdwaW9fc2V0X3ZhbHVlKFpFVVNfTENEX0VOX0dQSU8sIG9uKTsKK30KKworc3RhdGljIHZvaWQgemV1c19iYWNrbGlnaHRfcG93ZXIoaW50IG9uKQoreworCWdwaW9fc2V0X3ZhbHVlKFpFVVNfQktMRU5fR1BJTywgb24pOworfQorCitzdGF0aWMgaW50IHpldXNfc2V0dXBfZmJfZ3Bpb3Modm9pZCkKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBncGlvX3JlcXVlc3QoWkVVU19MQ0RfRU5fR1BJTywgIkxDRF9FTiIpKSkKKwkJZ290byBvdXRfZXJyOworCisJaWYgKChlcnIgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoWkVVU19MQ0RfRU5fR1BJTywgMCkpKQorCQlnb3RvIG91dF9lcnJfbGNkOworCisJaWYgKChlcnIgPSBncGlvX3JlcXVlc3QoWkVVU19CS0xFTl9HUElPLCAiQktMRU4iKSkpCisJCWdvdG8gb3V0X2Vycl9sY2Q7CisKKwlpZiAoKGVyciA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChaRVVTX0JLTEVOX0dQSU8sIDApKSkKKwkJZ290byBvdXRfZXJyX2JrbDsKKworCXJldHVybiAwOworCitvdXRfZXJyX2JrbDoKKwlncGlvX2ZyZWUoWkVVU19CS0xFTl9HUElPKTsKK291dF9lcnJfbGNkOgorCWdwaW9fZnJlZShaRVVTX0xDRF9FTl9HUElPKTsKK291dF9lcnI6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBweGFmYl9tb2RlX2luZm8gemV1c19mYl9tb2RlX2luZm9bXSA9IHsKKwl7CisJCS5waXhjbG9jayAgICAgICA9IDM5NzIyLAorCisJCS54cmVzICAgICAgICAgICA9IDY0MCwKKwkJLnlyZXMgICAgICAgICAgID0gNDgwLAorCisJCS5icHAgICAgICAgICAgICA9IDE2LAorCisJCS5oc3luY19sZW4gICAgICA9IDYzLAorCQkubGVmdF9tYXJnaW4gICAgPSAxNiwKKwkJLnJpZ2h0X21hcmdpbiAgID0gODEsCisKKwkJLnZzeW5jX2xlbiAgICAgID0gMiwKKwkJLnVwcGVyX21hcmdpbiAgID0gMTIsCisJCS5sb3dlcl9tYXJnaW4gICA9IDMxLAorCisJCS5zeW5jCQk9IDAsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHhhZmJfbWFjaF9pbmZvIHpldXNfZmJfaW5mbyA9IHsKKwkubW9kZXMJCQk9IHpldXNfZmJfbW9kZV9pbmZvLAorCS5udW1fbW9kZXMJCT0gMSwKKwkubGNkX2Nvbm4JCT0gTENEX0NPTE9SX1RGVF8xNkJQUCB8IExDRF9QQ0xLX0VER0VfRkFMTCwKKwkucHhhZmJfbGNkX3Bvd2VyCT0gemV1c19sY2RfcG93ZXIsCisJLnB4YWZiX2JhY2tsaWdodF9wb3dlcgk9IHpldXNfYmFja2xpZ2h0X3Bvd2VyLAorfTsKKworLyoKKyAqIE1NQy9TRCBEZXZpY2UKKyAqCisgKiBUaGUgY2FyZCBkZXRlY3QgaW50ZXJydXB0IGlzbid0IGRlYm91bmNlZCBzbyB3ZSBkZWxheSBpdCBieSAyNTBtcworICogdG8gZ2l2ZSB0aGUgY2FyZCBhIGNoYW5jZSB0byBmdWxseSBpbnNlcnQvZWplY3QuCisgKi8KKworc3RhdGljIHN0cnVjdCBweGFtY2lfcGxhdGZvcm1fZGF0YSB6ZXVzX21jaV9wbGF0Zm9ybV9kYXRhID0geworCS5vY3JfbWFzawkJPSBNTUNfVkREXzMyXzMzfE1NQ19WRERfMzNfMzQsCisJLmRldGVjdF9kZWxheQkJPSBIWi80LAorCS5ncGlvX2NhcmRfZGV0ZWN0ICAgICAgID0gWkVVU19NTUNfQ0RfR1BJTywKKwkuZ3Bpb19jYXJkX3JvICAgICAgICAgICA9IFpFVVNfTU1DX1dQX0dQSU8sCisJLmdwaW9fY2FyZF9yb19pbnZlcnQJPSAxLAorCS5ncGlvX3Bvd2VyICAgICAgICAgICAgID0gLTEKK307CisKKy8qCisgKiBVU0IgRGV2aWNlIENvbnRyb2xsZXIKKyAqLworc3RhdGljIHZvaWQgemV1c191ZGNfY29tbWFuZChpbnQgY21kKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBQWEEyWFhfVURDX0NNRF9ESVNDT05ORUNUOgorCQlwcl9pbmZvKCJ6ZXVzOiBkaXNjb25uZWN0aW5nIFVTQiBjbGllbnRcbiIpOworCQlVUDJPQ1IgPSBVUDJPQ1JfSFhPRSB8IFVQMk9DUl9IWFMgfCBVUDJPQ1JfRE1QREUgfCBVUDJPQ1JfRFBQREU7CisJCWJyZWFrOworCisJY2FzZSBQWEEyWFhfVURDX0NNRF9DT05ORUNUOgorCQlwcl9pbmZvKCJ6ZXVzOiBjb25uZWN0aW5nIFVTQiBjbGllbnRcbiIpOworCQlVUDJPQ1IgPSBVUDJPQ1JfSFhPRSB8IFVQMk9DUl9EUFBVRTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHB4YTJ4eF91ZGNfbWFjaF9pbmZvIHpldXNfdWRjX2luZm8gPSB7CisJLnVkY19jb21tYW5kID0gemV1c191ZGNfY29tbWFuZCwKK307CisKK3N0YXRpYyB2b2lkIHpldXNfcG93ZXJfb2ZmKHZvaWQpCit7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlweGEyN3hfY3B1X3N1c3BlbmQoUFdSTU9ERV9ERUVQU0xFRVApOworfQorCitpbnQgemV1c19nZXRfcGNiX2luZm8oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgZ3BpbywKKwkJICAgICAgdW5zaWduZWQgbmdwaW8sIHZvaWQgKmNvbnRleHQpCit7CisJaW50IGk7CisJdTggcGNiX2luZm8gPSAwOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlpbnQgcGNiX2JpdCA9IGdwaW8gKyBpICsgODsKKworCQlpZiAoZ3Bpb19yZXF1ZXN0KHBjYl9iaXQsICJwY2IgaW5mbyIpKSB7CisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNhbid0IHJlcXVlc3QgcGNiIGluZm8gJWRcbiIsIGkpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoZ3Bpb19kaXJlY3Rpb25faW5wdXQocGNiX2JpdCkpIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2FuJ3QgcmVhZCBwY2IgaW5mbyAlZFxuIiwgaSk7CisJCQlncGlvX2ZyZWUocGNiX2JpdCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXBjYl9pbmZvIHw9ICEhZ3Bpb19nZXRfdmFsdWUocGNiX2JpdCkgPDwgaTsKKworCQlncGlvX2ZyZWUocGNiX2JpdCk7CisJfQorCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiWmV1cyBQQ0IgdmVyc2lvbiAlZCBpc3N1ZSAlZFxuIiwKKwkJIHBjYl9pbmZvID4+IDQsIHBjYl9pbmZvICYgMHhmKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjYTk1M3hfcGxhdGZvcm1fZGF0YSB6ZXVzX3BjYTk1M3hfcGRhdGFbXSA9IHsKKwlbMF0gPSB7IC5ncGlvX2Jhc2UJPSBaRVVTX0VYVDBfR1BJT19CQVNFLCB9LAorCVsxXSA9IHsKKwkJLmdwaW9fYmFzZQk9IFpFVVNfRVhUMV9HUElPX0JBU0UsCisJCS5zZXR1cAkJPSB6ZXVzX2dldF9wY2JfaW5mbywKKwl9LAorCVsyXSA9IHsgLmdwaW9fYmFzZSA9IFpFVVNfVVNFUl9HUElPX0JBU0UsIH0sCit9OworCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgemV1c19pMmNfZGV2aWNlc1tdID0geworCXsKKwkJSTJDX0JPQVJEX0lORk8oInBjYTk1MzUiLAkweDIxKSwKKwkJLnBsYXRmb3JtX2RhdGEJPSAmemV1c19wY2E5NTN4X3BkYXRhWzBdLAorCX0sCisJeworCQlJMkNfQk9BUkRfSU5GTygicGNhOTUzNSIsCTB4MjIpLAorCQkucGxhdGZvcm1fZGF0YQk9ICZ6ZXVzX3BjYTk1M3hfcGRhdGFbMV0sCisJfSwKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJwY2E5NTM1IiwJMHgyMCksCisJCS5wbGF0Zm9ybV9kYXRhCT0gJnpldXNfcGNhOTUzeF9wZGF0YVsyXSwKKwkJLmlycQkJPSBncGlvX3RvX2lycShaRVVTX0VYVEdQSU9fR1BJTyksCisJfSwKKwl7IEkyQ19CT0FSRF9JTkZPKCJsbTc1YSIsCTB4NDgpIH0sCisJeyBJMkNfQk9BUkRfSU5GTygiMjRjMDEiLAkweDUwKSB9LAorCXsgSTJDX0JPQVJEX0lORk8oImlzbDEyMDgiLAkweDZmKSB9LAorfTsKKworc3RhdGljIG1mcF9jZmdfdCB6ZXVzX3Bpbl9jb25maWdbXSBfX2luaXRkYXRhID0geworCUdQSU8xNV9uQ1NfMSwKKwlHUElPNzhfbkNTXzIsCisJR1BJTzgwX25DU180LAorCUdQSU8zM19uQ1NfNSwKKworCUdQSU8yMl9HUElPLAorCUdQSU8zMl9NTUNfQ0xLLAorCUdQSU85Ml9NTUNfREFUXzAsCisJR1BJTzEwOV9NTUNfREFUXzEsCisJR1BJTzExMF9NTUNfREFUXzIsCisJR1BJTzExMV9NTUNfREFUXzMsCisJR1BJTzExMl9NTUNfQ01ELAorCisJR1BJTzg4X1VTQkgxX1BXUiwKKwlHUElPODlfVVNCSDFfUEVOLAorCUdQSU8xMTlfVVNCSDJfUFdSLAorCUdQSU8xMjBfVVNCSDJfUEVOLAorCisJR1BJTzg2X0xDRF9MRERfMTYsCisJR1BJTzg3X0xDRF9MRERfMTcsCisKKwlHUElPMTAyX0dQSU8sCisJR1BJTzEwNF9DSUZfRERfMiwKKwlHUElPMTA1X0NJRl9ERF8xLAorCisJR1BJTzQ4X25QT0UsCisJR1BJTzQ5X25QV0UsCisJR1BJTzUwX25QSU9SLAorCUdQSU81MV9uUElPVywKKwlHUElPODVfblBDRV8xLAorCUdQSU81NF9uUENFXzIsCisJR1BJTzc5X1BTS1RTRUwsCisJR1BJTzU1X25QUkVHLAorCUdQSU81Nl9uUFdBSVQsCisJR1BJTzU3X25JT0lTMTYsCisJR1BJTzM2X0dQSU8sCQkvKiBDRiBDRCAqLworCUdQSU85N19HUElPLAkJLyogQ0YgUFdSRU4gKi8KKwlHUElPOTlfR1BJTywJCS8qIENGIFJEWSAqLworfTsKKworc3RhdGljIHZvaWQgX19pbml0IHpldXNfaW5pdCh2b2lkKQoreworCXUxNiBkbTkwMDBfbXNjID0gMHhlMjc5OworCisJc3lzdGVtX3JldiA9IF9fcmF3X3JlYWR3KFpFVVNfQ1BMRF9WRVJTSU9OKTsKKwlwcl9pbmZvKCJaZXVzIENQTEQgViVkSSVkXG4iLCAoc3lzdGVtX3JldiAmIDB4ZjApID4+IDQsIChzeXN0ZW1fcmV2ICYgMHgwZikpOworCisJLyogRml4IHRpbWluZ3MgZm9yIGRtOTAwMHMgKENTMS9DUzIpKi8KKwlNU0MwID0gKE1TQzAgJiAweGZmZmYpIHwgKGRtOTAwMF9tc2MgPDwgMTYpOworCU1TQzEgPSAoTVNDMSAmIDB4ZmZmZjAwMDApIHwgZG05MDAwX21zYzsKKworCXBtX3Bvd2VyX29mZiA9IHpldXNfcG93ZXJfb2ZmOworCisJcHhhMnh4X21mcF9jb25maWcoQVJSQVlfQU5EX1NJWkUoemV1c19waW5fY29uZmlnKSk7CisKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyh6ZXVzX2RldmljZXMsIEFSUkFZX1NJWkUoemV1c19kZXZpY2VzKSk7CisKKwlweGFfc2V0X29oY2lfaW5mbygmemV1c19vaGNpX3BsYXRmb3JtX2RhdGEpOworCisJaWYgKHpldXNfc2V0dXBfZmJfZ3Bpb3MoKSkKKwkJcHJfZXJyKCJGYWlsZWQgdG8gc2V0dXAgZmIgZ3Bpb3NcbiIpOworCWVsc2UKKwkJc2V0X3B4YV9mYl9pbmZvKCZ6ZXVzX2ZiX2luZm8pOworCisJcHhhX3NldF9tY2lfaW5mbygmemV1c19tY2lfcGxhdGZvcm1fZGF0YSk7CisJcHhhX3NldF91ZGNfaW5mbygmemV1c191ZGNfaW5mbyk7CisJcHhhX3NldF9hYzk3X2luZm8oJnpldXNfYWM5N19pbmZvKTsKKwlweGFfc2V0X2kyY19pbmZvKE5VTEwpOworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIEFSUkFZX0FORF9TSVpFKHpldXNfaTJjX2RldmljZXMpKTsKK30KKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyB6ZXVzX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworCXsKKwkJLnZpcnR1YWwgPSBaRVVTX0NQTERfVkVSU0lPTiwKKwkJLnBmbiAgICAgPSBfX3BoeXNfdG9fcGZuKFpFVVNfQ1BMRF9WRVJTSU9OX1BIWVMpLAorCQkubGVuZ3RoICA9IDB4MTAwMCwKKwkJLnR5cGUgICAgPSBNVF9ERVZJQ0UsCisJfSwKKwl7CisJCS52aXJ0dWFsID0gWkVVU19DUExEX0lTQV9JUlEsCisJCS5wZm4gICAgID0gX19waHlzX3RvX3BmbihaRVVTX0NQTERfSVNBX0lSUV9QSFlTKSwKKwkJLmxlbmd0aCAgPSAweDEwMDAsCisJCS50eXBlICAgID0gTVRfREVWSUNFLAorCX0sCisJeworCQkudmlydHVhbCA9IFpFVVNfQ1BMRF9DT05UUk9MLAorCQkucGZuICAgICA9IF9fcGh5c190b19wZm4oWkVVU19DUExEX0NPTlRST0xfUEhZUyksCisJCS5sZW5ndGggID0gMHgxMDAwLAorCQkudHlwZSAgICA9IE1UX0RFVklDRSwKKwl9LAorCXsKKwkJLnZpcnR1YWwgPSBaRVVTX0NQTERfRVhUV0RPRywKKwkJLnBmbiAgICAgPSBfX3BoeXNfdG9fcGZuKFpFVVNfQ1BMRF9FWFRXRE9HX1BIWVMpLAorCQkubGVuZ3RoICA9IDB4MTAwMCwKKwkJLnR5cGUgICAgPSBNVF9ERVZJQ0UsCisJfSwKKwl7CisJCS52aXJ0dWFsID0gWkVVU19QQzEwNElPLAorCQkucGZuICAgICA9IF9fcGh5c190b19wZm4oWkVVU19QQzEwNElPX1BIWVMpLAorCQkubGVuZ3RoICA9IDB4MDA4MDAwMDAsCisJCS50eXBlICAgID0gTVRfREVWSUNFLAorCX0sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgemV1c19tYXBfaW8odm9pZCkKK3sKKwlweGFfbWFwX2lvKCk7CisKKwlpb3RhYmxlX2luaXQoemV1c19pb19kZXNjLCBBUlJBWV9TSVpFKHpldXNfaW9fZGVzYykpOworCisJLyogQ2xlYXIgUFNQUiB0byBlbnN1cmUgYSBmdWxsIHJlc3RhcnQgb24gd2FrZS11cC4gKi8KKwlQTUNSID0gUFNQUiA9IDA7CisKKwkvKiBlbmFibGUgaW50ZXJuYWwgMzIuNzY4S2h6IG9zY2lsbGF0b3IgKGlnbm9yZSBPU0NDX09PSykgKi8KKwlPU0NDIHw9IE9TQ0NfT09OOworCisJLyogU29tZSBjbG9jayBjeWNsZXMgbGF0ZXIgKGZyb20gT1NDQ19PTiksIHByb2dyYW1tZSBQQ0ZSIChPUERFLi4uKS4KKwkgKiBmbG9hdCBjaGlwIHNlbGVjdHMgYW5kIFBDTUNJQSAqLworCVBDRlIgPSBQQ0ZSX09QREUgfCBQQ0ZSX0RDX0VOIHwgUENGUl9GUyB8IFBDRlJfRlA7Cit9CisKK01BQ0hJTkVfU1RBUlQoQVJDT01fWkVVUywgIkFyY29tIFpFVVMiKQorCS8qIE1haW50YWluZXI6IE1hcmMgWnluZ2llciA8bWF6QG1pc3RlcmpvbmVzLm9yZz4gKi8KKwkucGh5c19pbwk9IDB4NDAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKChpb19wMnYoMHg0MDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjKSwKKwkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5tYXBfaW8JCT0gemV1c19tYXBfaW8sCisJLmluaXRfaXJxCT0gemV1c19pbml0X2lycSwKKwkudGltZXIJCT0gJnB4YV90aW1lciwKKwkuaW5pdF9tYWNoaW5lCT0gemV1c19pbml0LAorTUFDSElORV9FTkQKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9LY29uZmlnCmluZGV4IGM0OGUxZjIuLmVlNWUzOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L0tjb25maWcKQEAgLTcwLDcgKzcwLDcgQEAKIAlib29sICJTdXBwb3J0IFJlYWxWaWV3L1BCWCBwbGF0Zm9ybSIKIAlzZWxlY3QgQVJNX0dJQwogCXNlbGVjdCBIQVZFX1BBVEFfUExBVEZPUk0KLQlzZWxlY3QgQVJDSF9TUEFSU0VNRU1fRU5BQkxFIGlmIENQVV9WNyAmJiAhSElHSF9QSFlTX09GRlNFVAorCXNlbGVjdCBBUkNIX1NQQVJTRU1FTV9FTkFCTEUgaWYgQ1BVX1Y3ICYmICFSRUFMVklFV19ISUdIX1BIWVNfT0ZGU0VUCiAJc2VsZWN0IFpPTkVfRE1BIGlmIFNQQVJTRU1FTQogCWhlbHAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIEFSTShSKSBSZWFsVmlldyBQQlggcGxhdGZvcm0uCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNGEwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAppbmRleCA1ODUyMTFjLi43ZDc0ZmQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0YTAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjRhMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTE1LDUgKzE1LDcgQEAKIAogI2RlZmluZSBfX3ZpcnRfdG9fYnVzKHgpIF9fdmlydF90b19waHlzKHgpCiAjZGVmaW5lIF9fYnVzX3RvX3ZpcnQoeCkgX19waHlzX3RvX3ZpcnQoeCkKKyNkZWZpbmUgX19wZm5fdG9fYnVzKHgpIF9fcGZuX3RvX3BoeXMoeCkKKyNkZWZpbmUgX19idXNfdG9fcGZuKHgpCV9fcGh5c190b19wZm4oeCkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvS2NvbmZpZwppbmRleCAwM2E3ZjM4Li5iMTdkNTJmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL0tjb25maWcKQEAgLTQsNiArNCw3IEBACiAKIGNvbmZpZyBTQTExMDBfQVNTQUJFVAogCWJvb2wgIkFzc2FiZXQiCisJc2VsZWN0IENQVV9GUkVRX1NBMTExMAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSB1c2luZyB0aGUgSW50ZWwoUikgU3Ryb25nQVJNKFIpIFNBLTExMTAKIAkgIE1pY3JvcHJvY2Vzc29yIERldmVsb3BtZW50IEJvYXJkIChhbHNvIGtub3duIGFzIHRoZSBBc3NhYmV0KS4KQEAgLTE5LDYgKzIwLDcgQEAKIAogY29uZmlnIFNBMTEwMF9DRVJGCiAJYm9vbCAiQ2VyZkJvYXJkIgorCXNlbGVjdCBDUFVfRlJFUV9TQTExMTAKIAloZWxwCiAJICBUaGUgSW50cmluc3ljIENlcmZCb2FyZCBpcyBiYXNlZCBvbiB0aGUgU3Ryb25nQVJNIDExMTAgKERpc2NvbnRpbnVlZCkuCiAJICBNb3JlIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBhdDoKQEAgLTQ1LDYgKzQ3LDcgQEAKIAogY29uZmlnIFNBMTEwMF9DT0xMSUUKIAlib29sICJTaGFycCBaYXVydXMgU0w1NTAwIgorCSMgRklYTUU6IHNlbGVjdCBDUFVfRlJFUV9TQTExeDAKIAlzZWxlY3QgU0hBUlBfTE9DT01PCiAJc2VsZWN0IFNIQVJQX1NDT09QCiAJc2VsZWN0IFNIQVJQX1BBUkFNCkBAIC01NCw2ICs1Nyw3IEBACiBjb25maWcgU0ExMTAwX0gzMTAwCiAJYm9vbCAiQ29tcGFxIGlQQVEgSDMxMDAiCiAJc2VsZWN0IEhUQ19FR1BJTworCXNlbGVjdCBDUFVfRlJFUV9TQTExMDAKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gcnVuIHRoaXMga2VybmVsIG9uIHRoZSBDb21wYXEgaVBBUQogCSAgSDMxMDAgaGFuZGhlbGQgY29tcHV0ZXIuICBJbmZvcm1hdGlvbiBhYm91dCB0aGlzIG1hY2hpbmUgYW5kIHRoZQpAQCAtNjQsNiArNjgsNyBAQAogY29uZmlnIFNBMTEwMF9IMzYwMAogCWJvb2wgIkNvbXBhcSBpUEFRIEgzNjAwL0gzNzAwIgogCXNlbGVjdCBIVENfRUdQSU8KKwlzZWxlY3QgQ1BVX0ZSRVFfU0ExMTAwCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIHJ1biB0aGlzIGtlcm5lbCBvbiB0aGUgQ29tcGFxIGlQQVEKIAkgIEgzNjAwIGhhbmRoZWxkIGNvbXB1dGVyLiAgSW5mb3JtYXRpb24gYWJvdXQgdGhpcyBtYWNoaW5lIGFuZCB0aGUKQEAgLTc0LDYgKzc5LDcgQEAKIGNvbmZpZyBTQTExMDBfQkFER0U0CiAJYm9vbCAiSFAgTGFicyBCYWRnZVBBRCA0IgogCXNlbGVjdCBTQTExMTEKKwlzZWxlY3QgQ1BVX0ZSRVFfU0ExMTAwCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBhIGtlcm5lbCBmb3IgdGhlIEhQIExhYm9yYXRvcmllcwogCSAgQmFkZ2VQQUQgNC4KQEAgLTgxLDYgKzg3LDcgQEAKIGNvbmZpZyBTQTExMDBfSk9STkFEQTcyMAogCWJvb2wgIkhQIEpvcm5hZGEgNzIwIgogCXNlbGVjdCBTQTExMTEKKwkjIEZJWE1FOiBzZWxlY3QgQ1BVX0ZSRVFfU0ExMXgwCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBhIGtlcm5lbCBmb3IgdGhlIEhQIEpvcm5hZGEgNzIwCiAJICBoYW5kaGVsZCBjb21wdXRlci4gIFNlZSA8aHR0cDovL3d3dy5ocC5jb20vam9ybmFkYS9wcm9kdWN0cy83MjA+CkBAIC05OCwxMiArMTA1LDE0IEBACiAKIGNvbmZpZyBTQTExMDBfSEFDS0tJVAogCWJvb2wgIkhhY2tLaXQgQ29yZSBDUFUgQm9hcmQiCisJc2VsZWN0IENQVV9GUkVRX1NBMTEwMAogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUgSGFja0tpdCBDb3JlIENQVSBCb2FyZAogCSAgPGh0dHA6Ly9oYWNra2l0LmVsZXR6dHJpY2suZGU+OwogCiBjb25maWcgU0ExMTAwX0xBUlQKIAlib29sICJMQVJUIgorCXNlbGVjdCBDUFVfRlJFUV9TQTExMDAKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgdXNpbmcgdGhlIExpbnV4IEFkdmFuY2VkIFJhZGlvIFRlcm1pbmFsCiAJICAoYWxzbyBrbm93biBhcyB0aGUgTEFSVCkuICBTZWUgPGh0dHA6Ly93d3cubGFydG1ha2VyLm5sLz4gZm9yCkBAIC0xMTEsNiArMTIwLDcgQEAKIAogY29uZmlnIFNBMTEwMF9QTEVCCiAJYm9vbCAiUExFQiIKKwlzZWxlY3QgQ1BVX0ZSRVFfU0ExMTAwCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIHVzaW5nIHZlcnNpb24gMSBvZiB0aGUgUG9ydGFibGUgTGludXgKIAkgIEVtYmVkZGVkIEJvYXJkIChhbHNvIGtub3duIGFzIFBMRUIpLgpAQCAtMTE5LDYgKzEyOSw3IEBACiAKIGNvbmZpZyBTQTExMDBfU0hBTk5PTgogCWJvb2wgIlNoYW5ub24iCisJc2VsZWN0IENQVV9GUkVRX1NBMTEwMAogCWhlbHAKIAkgIFRoZSBTaGFubm9uIChhbHNvIGtub3duIGFzIGEgVHV4c2NyZWVuLCBhbmQgYWxzbyBhcyBhIElTMjYzMCkgd2FzIGEKIAkgIGxpbWl0ZWQgZWRpdGlvbiB3ZWJwaG9uZSBwcm9kdWNlZCBieSBQaGlsaXBzLiBUaGUgU2hhbm5vbiBpcyBhIFNBMTEwMApAQCAtMTI3LDYgKzEzOCw3IEBACiAKIGNvbmZpZyBTQTExMDBfU0lNUEFECiAJYm9vbCAiU2ltcGFkIgorCXNlbGVjdCBDUFVfRlJFUV9TQTExMTAKIAloZWxwCiAJICBUaGUgU0lFTUVOUyB3ZWJwYWQgU0lNcGFkIGlzIGJhc2VkIG9uIHRoZSBTdHJvbmdBUk0gMTExMC4gVGhlcmUKIAkgIGFyZSB0d28gZGlmZmVyZW50IHZlcnNpb25zIENMNCBhbmQgU0w0LiBDTDQgaGFzIDMyTUIgUkFNIGFuZCAxNk1CCkBAIC0xNDUsMyArMTU3LDQgQEAKIGVuZG1lbnUKIAogZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvZ2VuZXJpYy5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvZ2VuZXJpYy5jCmluZGV4IDlmYWVhMTUuLjNjMWZjZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2dlbmVyaWMuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9nZW5lcmljLmMKQEAgLTU4LDcgKzU4LDYgQEAKIAkyODAyCS8qIDI4MC4yIE1IeiAqLwogfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9GUkVRX1NBMTEwMCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX0ZSRVFfU0ExMTEwKQogLyogcm91bmRzIHVwKCEpICAqLwogdW5zaWduZWQgaW50IHNhMTF4MF9mcmVxX3RvX3BwY3IodW5zaWduZWQgaW50IGtoeikKIHsKQEAgLTExMCwxNyArMTA5LDYgQEAKIAlyZXR1cm4gY2Nsa19mcmVxdWVuY3lfMTAwa2h6W1BQQ1IgJiAweGZdICogMTAwOwogfQogCi0jZWxzZQotLyoKLSAqIFdlIHN0aWxsIG5lZWQgdG8gcHJvdmlkZSB0aGlzIHNvIGJ1aWxkaW5nIHdpdGhvdXQgY3B1ZnJlcSB3b3Jrcy4KLSAqLwotdW5zaWduZWQgaW50IGNwdWZyZXFfZ2V0KHVuc2lnbmVkIGludCBjcHUpCi17Ci0JcmV0dXJuIGNjbGtfZnJlcXVlbmN5XzEwMGtoeltQUENSICYgMHhmXSAqIDEwMDsKLX0KLUVYUE9SVF9TWU1CT0woY3B1ZnJlcV9nZXQpOwotI2VuZGlmCi0KIC8qCiAgKiBUaGlzIGlzIHRoZSBTQTExeDAgc2NoZWRfY2xvY2sgaW1wbGVtZW50YXRpb24uICBUaGlzIGhhcwogICogYSByZXNvbHV0aW9uIG9mIDI3MW5zLCBhbmQgYSBtYXhpbXVtIHZhbHVlIG9mIDMyMDI1NTk3cyAoMzcwIGRheXMpLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC13OTB4OTAwL2luY2x1ZGUvbWFjaC9udWM5MDBfc3BpLmggYi9hcmNoL2FybS9tYWNoLXc5MHg5MDAvaW5jbHVkZS9tYWNoL251YzkwMF9zcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDk0ODE5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC13OTB4OTAwL2luY2x1ZGUvbWFjaC9udWM5MDBfc3BpLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvbnVjOTAwX3NwaS5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE51dm90b24gdGVjaG5vbG9neSBjb3Jwb3JhdGlvbi4KKyAqCisgKiBXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uO3ZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX1NQSV9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfU1BJX0gKKworZXh0ZXJuIHZvaWQgbWZwX3NldF9ncm91cGcoc3RydWN0IGRldmljZSAqZGV2KTsKKworc3RydWN0IG51YzkwMF9zcGlfaW5mbyB7CisJdW5zaWduZWQgaW50IG51bV9jczsKKwl1bnNpZ25lZCBpbnQgbHNiOworCXVuc2lnbmVkIGludCB0eG5lZzsKKwl1bnNpZ25lZCBpbnQgcnhuZWc7CisJdW5zaWduZWQgaW50IGRpdmlkZXI7CisJdW5zaWduZWQgaW50IHNsZWVwOworCXVuc2lnbmVkIGludCB0eG51bTsKKwl1bnNpZ25lZCBpbnQgdHhiaXRsZW47CisJaW50IGJ1c19udW07Cit9OworCitzdHJ1Y3QgbnVjOTAwX3NwaV9jaGlwIHsKKwl1bnNpZ25lZCBjaGFyIGJpdHNfcGVyX3dvcmQ7Cit9OworCisjZW5kaWYgLyogX19BU01fQVJDSF9TUElfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vbW1hcC5jIGIvYXJjaC9hcm0vbW0vbW1hcC5jCmluZGV4IDJiNzk5NjQuLmY1YWJjNTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL21tYXAuYworKysgYi9hcmNoL2FybS9tbS9tbWFwLmMKQEAgLTU0LDcgKzU0LDggQEAKIAkgKiBXZSBlbmZvcmNlIHRoZSBNQVBfRklYRUQgY2FzZS4KIAkgKi8KIAlpZiAoZmxhZ3MgJiBNQVBfRklYRUQpIHsKLQkJaWYgKGFsaWFzaW5nICYmIGZsYWdzICYgTUFQX1NIQVJFRCAmJiBhZGRyICYgKFNITUxCQSAtIDEpKQorCQlpZiAoYWxpYXNpbmcgJiYgZmxhZ3MgJiBNQVBfU0hBUkVEICYmCisJCSAgICAoYWRkciAtIChwZ29mZiA8PCBQQUdFX1NISUZUKSkgJiAoU0hNTEJBIC0gMSkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJcmV0dXJuIGFkZHI7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvTWFrZWZpbGUgYi9hcmNoL2FybS9wbGF0LW14Yy9NYWtlZmlsZQppbmRleCA0Y2JjYTlkLi45OTZjYmFjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9NYWtlZmlsZQpAQCAtOSw2ICs5LDcgQEAKIG9iai0kKENPTkZJR19BUkNIX01YMikgKz0gaW9tdXgtbXgxLW14Mi5vIGRtYS1teDEtbXgyLm8KIG9iai0kKENPTkZJR19BUkNIX01YQ19JT01VWF9WMykgKz0gaW9tdXgtdjMubwogb2JqLSQoQ09ORklHX01YQ19QV00pICArPSBwd20ubworb2JqLSQoQ09ORklHX1VTQl9FSENJX01YQykgKz0gZWhjaS5vCiBvYmotJChDT05GSUdfTVhDX1VMUEkpICs9IHVscGkubwogb2JqLSQoQ09ORklHX0FSQ0hfTVhDX0FVRE1VWF9WMSkgKz0gYXVkbXV4LXYxLm8KIG9iai0kKENPTkZJR19BUkNIX01YQ19BVURNVVhfVjIpICs9IGF1ZG11eC12Mi5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9laGNpLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9laGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE1OTliZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2VoY2kuYwpAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5IERhbmllbCBNYWNrIDxkYW5pZWxAY2FpYXEuZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorICogb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9teGNfZWhjaS5oPgorCisjZGVmaW5lIFVTQkNUUkxfT1RHQkFTRV9PRkZTRVQJMHg2MDAKKworI2RlZmluZSBNWDMxX09UR19TSUNfU0hJRlQJMjkKKyNkZWZpbmUgTVgzMV9PVEdfU0lDX01BU0sJKDB4ZiA8PCBNWDMxX09UR19TSUNfU0hJRlQpCisjZGVmaW5lIE1YMzFfT1RHX1BNX0JJVAkJKDEgPDwgMjQpCisKKyNkZWZpbmUgTVgzMV9IMl9TSUNfU0hJRlQJMjEKKyNkZWZpbmUgTVgzMV9IMl9TSUNfTUFTSwkoMHhmIDw8IE1YMzFfSDJfU0lDX1NISUZUKQorI2RlZmluZSBNWDMxX0gyX1BNX0JJVAkJKDEgPDwgMTYpCisjZGVmaW5lIE1YMzFfSDJfRFRfQklUCQkoMSA8PCA1KQorCisjZGVmaW5lIE1YMzFfSDFfU0lDX1NISUZUCTEzCisjZGVmaW5lIE1YMzFfSDFfU0lDX01BU0sJKDB4ZiA8PCBNWDMxX0gxX1NJQ19TSElGVCkKKyNkZWZpbmUgTVgzMV9IMV9QTV9CSVQJCSgxIDw8IDgpCisjZGVmaW5lIE1YMzFfSDFfRFRfQklUCQkoMSA8PCA0KQorCitpbnQgbXhjX3NldF91c2Jjb250cm9sKGludCBwb3J0LCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJdW5zaWduZWQgaW50IHY7CisKKwlpZiAoY3B1X2lzX214MzEoKSkgeworCQl2ID0gcmVhZGwoSU9fQUREUkVTUyhNWDMxX09UR19CQVNFX0FERFIgKworCQkJCSAgICAgVVNCQ1RSTF9PVEdCQVNFX09GRlNFVCkpOworCisJCXN3aXRjaCAocG9ydCkgeworCQljYXNlIDA6CS8qIE9URyBwb3J0ICovCisJCQl2ICY9IH4oTVgzMV9PVEdfU0lDX01BU0sgfCBNWDMxX09UR19QTV9CSVQpOworCQkJdiB8PSAoZmxhZ3MgJiBNWENfRUhDSV9JTlRFUkZBQ0VfTUFTSykKKwkJCQkJPDwgTVgzMV9PVEdfU0lDX1NISUZUOworCQkJaWYgKGZsYWdzICYgTVhDX0VIQ0lfUE9XRVJfUElOU19FTkFCTEVEKQorCQkJCXYgfD0gTVgzMV9PVEdfUE1fQklUOworCisJCQlicmVhazsKKwkJY2FzZSAxOiAvKiBIMSBwb3J0ICovCisJCQl2ICY9IH4oTVgzMV9IMV9TSUNfTUFTSyB8IE1YMzFfSDFfUE1fQklUKTsKKwkJCXYgfD0gKGZsYWdzICYgTVhDX0VIQ0lfSU5URVJGQUNFX01BU0spCisJCQkJCQk8PCBNWDMxX0gxX1NJQ19TSElGVDsKKwkJCWlmIChmbGFncyAmIE1YQ19FSENJX1BPV0VSX1BJTlNfRU5BQkxFRCkKKwkJCQl2IHw9IE1YMzFfSDFfUE1fQklUOworCisJCQlpZiAoIShmbGFncyAmIE1YQ19FSENJX1RUTF9FTkFCTEVEKSkKKwkJCQl2IHw9IE1YMzFfSDFfRFRfQklUOworCisJCQlicmVhazsKKwkJY2FzZSAyOgkvKiBIMiBwb3J0ICovCisJCQl2ICY9IH4oTVgzMV9IMl9TSUNfTUFTSyB8IE1YMzFfSDJfUE1fQklUKTsKKwkJCXYgfD0gKGZsYWdzICYgTVhDX0VIQ0lfSU5URVJGQUNFX01BU0spCisJCQkJCQk8PCBNWDMxX0gyX1NJQ19TSElGVDsKKwkJCWlmICghKGZsYWdzICYgTVhDX0VIQ0lfUE9XRVJfUElOU19FTkFCTEVEKSkKKwkJCQl2IHw9IE1YMzFfSDJfUE1fQklUOworCisJCQlpZiAoIShmbGFncyAmIE1YQ19FSENJX1RUTF9FTkFCTEVEKSkKKwkJCQl2IHw9IE1YMzFfSDJfRFRfQklUOworCisJCQlicmVhazsKKwkJfQorCisJCXdyaXRlbCh2LCBJT19BRERSRVNTKE1YMzFfT1RHX0JBU0VfQUREUiArCisJCQkJICAgICBVU0JDVFJMX09UR0JBU0VfT0ZGU0VUKSk7CisJCXJldHVybiAwOworCX0KKworCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJIiVzKCkgdW5hYmxlIHRvIHNldHVwIFVTQkNPTlRST0wgZm9yIHRoaXMgQ1BVXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CitFWFBPUlRfU1lNQk9MKG14Y19zZXRfdXNiY29udHJvbCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teGNfZWhjaS5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214Y19laGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3OTYyMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teGNfZWhjaS5oCkBAIC0wLDAgKzEsMzcgQEAKKyNpZm5kZWYgX19JTkNMVURFX0FTTV9BUkNIX01YQ19FSENJX0gKKyNkZWZpbmUgX19JTkNMVURFX0FTTV9BUkNIX01YQ19FSENJX0gKKworLyogdmFsdWVzIGZvciBwb3J0c2MgZmllbGQgKi8KKyNkZWZpbmUgTVhDX0VIQ0lfUEhZX0xPV19QT1dFUl9TVVNQRU5ECSgxIDw8IDIzKQorI2RlZmluZSBNWENfRUhDSV9GT1JDRV9GUwkJKDEgPDwgMjQpCisjZGVmaW5lIE1YQ19FSENJX1VUTUlfOEJJVAkJKDAgPDwgMjgpCisjZGVmaW5lIE1YQ19FSENJX1VUTUlfMTZCSVQJCSgxIDw8IDI4KQorI2RlZmluZSBNWENfRUhDSV9TRVJJQUwJCQkoMSA8PCAyOSkKKyNkZWZpbmUgTVhDX0VIQ0lfTU9ERV9VVE1JCQkoMCA8PCAzMCkKKyNkZWZpbmUgTVhDX0VIQ0lfTU9ERV9QSElMSVBTCQkoMSA8PCAzMCkKKyNkZWZpbmUgTVhDX0VIQ0lfTU9ERV9VTFBJCQkoMiA8PCAzMCkKKyNkZWZpbmUgTVhDX0VIQ0lfTU9ERV9TRVJJQUwJCSgzIDw8IDMwKQorCisvKiB2YWx1ZXMgZm9yIGZsYWdzIGZpZWxkICovCisjZGVmaW5lIE1YQ19FSENJX0lOVEVSRkFDRV9ESUZGX1VOSQkoMCA8PCAwKQorI2RlZmluZSBNWENfRUhDSV9JTlRFUkZBQ0VfRElGRl9CSQkoMSA8PCAwKQorI2RlZmluZSBNWENfRUhDSV9JTlRFUkZBQ0VfU0lOR0xFX1VOSQkoMiA8PCAwKQorI2RlZmluZSBNWENfRUhDSV9JTlRFUkZBQ0VfU0lOR0xFX0JJCSgzIDw8IDApCisjZGVmaW5lIE1YQ19FSENJX0lOVEVSRkFDRV9NQVNLCQkoMHhmKQorCisjZGVmaW5lIE1YQ19FSENJX1BPV0VSX1BJTlNfRU5BQkxFRAkoMSA8PCA1KQorI2RlZmluZSBNWENfRUhDSV9UVExfRU5BQkxFRAkJKDEgPDwgNikKKworc3RydWN0IG14Y191c2JoX3BsYXRmb3JtX2RhdGEgeworCWludCAoKmluaXQpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworCWludCAoKmV4aXQpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworCisJdW5zaWduZWQgaW50CQkgcG9ydHNjOworCXVuc2lnbmVkIGludAkJIGZsYWdzOworCXN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIJKm90ZzsKK307CisKK2ludCBteGNfc2V0X3VzYmNvbnRyb2woaW50IHBvcnQsIHVuc2lnbmVkIGludCBmbGFncyk7CisKKyNlbmRpZiAvKiBfX0lOQ0xVREVfQVNNX0FSQ0hfTVhDX0VIQ0lfSCAqLworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvS2NvbmZpZyBiL2FyY2gvYXJtL3BsYXQtb21hcC9LY29uZmlnCmluZGV4IGYzNDhkZGYuLmUyZWEwNGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9LY29uZmlnCkBAIC0yNyw2ICsyNyw3IEBACiAJYm9vbCAiVEkgT01BUDQiCiAJc2VsZWN0IENQVV9WNwogCXNlbGVjdCBBUk1fR0lDCisJc2VsZWN0IENPTU1PTl9DTEtERVYKIAogZW5kY2hvaWNlCiAKQEAgLTQyLDI4ICs0Myw2IEBACiAJZGVwZW5kcyBvbiBPTUFQX0RFQlVHX0RFVklDRVMKIAlkZWZhdWx0IHkgaWYgTEVEUyB8fCBMRURTX09NQVBfREVCVUcKIAotY29uZmlnIE9NQVBfREVCVUdfUE9XRVJET01BSU4KLQlib29sICJFbWl0IGRlYnVnIG1lc3NhZ2VzIGZyb20gcG93ZXJkb21haW4gbGF5ZXIiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAyIHx8IEFSQ0hfT01BUDMKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbXBpbGUgaW4gcG93ZXJkb21haW4gbGF5ZXIKLQkgIGRlYnVnZ2luZyBtZXNzYWdlcyBmb3IgT01BUDIvMy4gICBUaGVzZSBtZXNzYWdlcyBjYW4KLQkgIHByb3ZpZGUgbW9yZSBkZXRhaWwgYXMgdG8gd2h5IHNvbWUgcG93ZXJkb21haW4gY2FsbHMKLQkgIG1heSBiZSBmYWlsaW5nLCBhbmQgd2lsbCBhbHNvIGVtaXQgYSBkZXNjcmlwdGl2ZSBtZXNzYWdlCi0JICBmb3IgZXZlcnkgcG93ZXJkb21haW4gcmVnaXN0ZXIgd3JpdGUuICBIb3dldmVyLCB0aGUKLQkgIGV4dHJhIGRldGFpbCBjb3N0cyBzb21lIG1lbW9yeS4KLQotY29uZmlnIE9NQVBfREVCVUdfQ0xPQ0tET01BSU4KLQlib29sICJFbWl0IGRlYnVnIG1lc3NhZ2VzIGZyb20gY2xvY2tkb21haW4gbGF5ZXIiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAyIHx8IEFSQ0hfT01BUDMKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbXBpbGUgaW4gY2xvY2tkb21haW4gbGF5ZXIKLQkgIGRlYnVnZ2luZyBtZXNzYWdlcyBmb3IgT01BUDIvMy4gICBUaGVzZSBtZXNzYWdlcyBjYW4KLQkgIHByb3ZpZGUgbW9yZSBkZXRhaWwgYXMgdG8gd2h5IHNvbWUgY2xvY2tkb21haW4gY2FsbHMKLQkgIG1heSBiZSBmYWlsaW5nLCBhbmQgd2lsbCBhbHNvIGVtaXQgYSBkZXNjcmlwdGl2ZSBtZXNzYWdlCi0JICBmb3IgZXZlcnkgY2xvY2tkb21haW4gcmVnaXN0ZXIgd3JpdGUuICBIb3dldmVyLCB0aGUKLQkgIGV4dHJhIGRldGFpbCBjb3N0cyBzb21lIG1lbW9yeS4KLQogY29uZmlnIE9NQVBfUkVTRVRfQ0xPQ0tTCiAJYm9vbCAiUmVzZXQgdW51c2VkIGNsb2NrcyBkdXJpbmcgYm9vdCIKIAlkZXBlbmRzIG9uIEFSQ0hfT01BUApAQCAtNzgsMjggKzU3LDI4IEBACiAKIGNvbmZpZyBPTUFQX01VWAogCWJvb2wgIk9NQVAgbXVsdGlwbGV4aW5nIHN1cHBvcnQiCi0gICAgICAgIGRlcGVuZHMgb24gQVJDSF9PTUFQCisJZGVwZW5kcyBvbiBBUkNIX09NQVAKIAlkZWZhdWx0IHkKLSAgICAgICAgaGVscAotICAgICAgICAgIFBpbiBtdWx0aXBsZXhpbmcgc3VwcG9ydCBmb3IgT01BUCBib2FyZHMuIElmIHlvdXIgYm9vdGxvYWRlcgotICAgICAgICAgIHNldHMgdGhlIG11bHRpcGxleGluZyBjb3JyZWN0bHksIHNheSBOLiBPdGhlcndpc2UsIG9yIGlmIHVuc3VyZSwKLSAgICAgICAgICBzYXkgWS4KKwloZWxwCisJICBQaW4gbXVsdGlwbGV4aW5nIHN1cHBvcnQgZm9yIE9NQVAgYm9hcmRzLiBJZiB5b3VyIGJvb3Rsb2FkZXIKKwkgIHNldHMgdGhlIG11bHRpcGxleGluZyBjb3JyZWN0bHksIHNheSBOLiBPdGhlcndpc2UsIG9yIGlmIHVuc3VyZSwKKwkgIHNheSBZLgogCiBjb25maWcgT01BUF9NVVhfREVCVUcKIAlib29sICJNdWx0aXBsZXhpbmcgZGVidWcgb3V0cHV0IgotICAgICAgICBkZXBlbmRzIG9uIE9NQVBfTVVYCi0gICAgICAgIGhlbHAKLSAgICAgICAgICBNYWtlcyB0aGUgbXVsdGlwbGV4aW5nIGZ1bmN0aW9ucyBwcmludCBvdXQgYSBsb3Qgb2YgZGVidWcgaW5mby4KLSAgICAgICAgICBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBmaW5kIG91dCB0aGUgY29ycmVjdCB2YWx1ZXMgb2YgdGhlCi0gICAgICAgICAgbXVsdGlwbGV4aW5nIHJlZ2lzdGVycy4KKwlkZXBlbmRzIG9uIE9NQVBfTVVYCisJaGVscAorCSAgTWFrZXMgdGhlIG11bHRpcGxleGluZyBmdW5jdGlvbnMgcHJpbnQgb3V0IGEgbG90IG9mIGRlYnVnIGluZm8uCisJICBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBmaW5kIG91dCB0aGUgY29ycmVjdCB2YWx1ZXMgb2YgdGhlCisJICBtdWx0aXBsZXhpbmcgcmVnaXN0ZXJzLgogCiBjb25maWcgT01BUF9NVVhfV0FSTklOR1MKIAlib29sICJXYXJuIGFib3V0IHBpbnMgdGhlIGJvb3Rsb2FkZXIgZGlkbid0IHNldCB1cCIKLSAgICAgICAgZGVwZW5kcyBvbiBPTUFQX01VWAotICAgICAgICBkZWZhdWx0IHkKLSAgICAgICAgaGVscAorCWRlcGVuZHMgb24gT01BUF9NVVgKKwlkZWZhdWx0IHkKKwloZWxwCiAJICBDaG9vc2UgWSBoZXJlIHRvIHdhcm4gd2hlbmV2ZXIgZHJpdmVyIGluaXRpYWxpemF0aW9uIGxvZ2ljIG5lZWRzCi0JICB0byBjaGFuZ2UgdGhlIHBpbiBtdWx0aXBsZXhpbmcgc2V0dXAuICBXaGVuIHRoZXJlIGFyZSBubyB3YXJuaW5ncworCSAgdG8gY2hhbmdlIHRoZSBwaW4gbXVsdGlwbGV4aW5nIHNldHVwLgkgV2hlbiB0aGVyZSBhcmUgbm8gd2FybmluZ3MKIAkgIHByaW50ZWQsIGl0J3Mgc2FmZSB0byBkZXNlbGVjdCBPTUFQX01VWCBmb3IgeW91ciBwcm9kdWN0LgogCiBjb25maWcgT01BUF9NQ0JTUApAQCAtMTI1LDcgKzEwNCw3IEBACiAJdHJpc3RhdGUKIAogY2hvaWNlCi0gICAgICAgIHByb21wdCAiU3lzdGVtIHRpbWVyIgorCXByb21wdCAiU3lzdGVtIHRpbWVyIgogCWRlZmF1bHQgT01BUF9NUFVfVElNRVIKIAogY29uZmlnIE9NQVBfTVBVX1RJTUVSCkBAIC0xNDgsMTEgKzEyNywxMSBAQAogZW5kY2hvaWNlCiAKIGNvbmZpZyBPTUFQXzMyS19USU1FUl9IWgotICAgICAgIGludCAiS2VybmVsIGludGVybmFsIHRpbWVyIGZyZXF1ZW5jeSBmb3IgMzJLSHogdGltZXIiCi0gICAgICAgcmFuZ2UgMzIgMTAyNAotICAgICAgIGRlcGVuZHMgb24gT01BUF8zMktfVElNRVIKLSAgICAgICBkZWZhdWx0ICIxMjgiCi0gICAgICAgaGVscAorCWludCAiS2VybmVsIGludGVybmFsIHRpbWVyIGZyZXF1ZW5jeSBmb3IgMzJLSHogdGltZXIiCisJcmFuZ2UgMzIgMTAyNAorCWRlcGVuZHMgb24gT01BUF8zMktfVElNRVIKKwlkZWZhdWx0ICIxMjgiCisJaGVscAogCSAgS2VybmVsIGludGVybmFsIHRpbWVyIGZyZXF1ZW5jeSBzaG91bGQgYmUgYSBkaXZpc29yIG9mIDMyNzY4LAogCSAgc3VjaCBhcyA2NCBvciAxMjguCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2Nsb2NrLmMKaW5kZXggNjgxYmZjMy4uODljYWZjOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2Nsb2NrLmMKQEAgLTQwLDM2ICs0MCwxMCBAQAogICogY2xvY2sgZnJhbWV3b3JrIGlzIG5vdCB1cCAsIGl0IGlzIGRlZmluZWQgaGVyZSB0byBhdm9pZCByZXdvcmsgaW4KICAqIGV2ZXJ5IGRyaXZlci4gQWxzbyBkdW1teSBwcmNtIHJlc2V0IGZ1bmN0aW9uIGlzIGFkZGVkICovCiAKLS8qIER1bW15IGhvb2tzIG9ubHkgZm9yIE9NQVA0LkZvciByZXN0IE9NQVBzLCBjb21tb24gY2xrZGV2IGlzIHVzZWQgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVA0KQotc3RydWN0IGNsayAqY2xrX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmlkKQotewotCXJldHVybiBOVUxMOwotfQotRVhQT1JUX1NZTUJPTChjbGtfZ2V0KTsKLQotdm9pZCBjbGtfcHV0KHN0cnVjdCBjbGsgKmNsaykKLXsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX3B1dCk7Ci0KLXZvaWQgb21hcDJfY2xrX3ByZXBhcmVfZm9yX3JlYm9vdCh2b2lkKQotewotfQotRVhQT1JUX1NZTUJPTChvbWFwMl9jbGtfcHJlcGFyZV9mb3JfcmVib290KTsKLQotdm9pZCBvbWFwX3ByY21fYXJjaF9yZXNldChjaGFyIG1vZGUpCi17Ci19Ci1FWFBPUlRfU1lNQk9MKG9tYXBfcHJjbV9hcmNoX3Jlc2V0KTsKLSNlbmRpZgogaW50IGNsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldCA9IDA7Ci0JaWYgKGNwdV9pc19vbWFwNDR4eCgpKQotCQkvKiBPTUFQNCBjbGsgZnJhbWV3b3JrIG5vdCBzdXBwb3J0ZWQgeWV0ICovCi0JCXJldHVybiAwOwogCiAJaWYgKGNsayA9PSBOVUxMIHx8IElTX0VSUihjbGspKQogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9jb21tb24uYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jb21tb24uYwppbmRleCBjYzA1MGIzLi5iZjFlYWYzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvY29tbW9uLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2NvbW1vbi5jCkBAIC0yODAsMTYgKzI4MCwxOCBAQAogI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDQpCiBzdGF0aWMgc3RydWN0IG9tYXBfZ2xvYmFscyBvbWFwNF9nbG9iYWxzID0gewogCS5jbGFzcwk9IE9NQVA0NDNYX0NMQVNTLAotCS50YXAJPSBPTUFQMl9MNF9JT19BRERSRVNTKDB4NDgzMGEwMDApLAorCS50YXAJPSBPTUFQMl9MNF9JT19BRERSRVNTKE9NQVA0NDNYX1NDTV9CQVNFKSwKIAkuY3RybAk9IE9NQVAyX0w0X0lPX0FERFJFU1MoT01BUDQ0M1hfQ1RSTF9CQVNFKSwKIAkucHJtCT0gT01BUDJfTDRfSU9fQUREUkVTUyhPTUFQNDQzMF9QUk1fQkFTRSksCiAJLmNtCT0gT01BUDJfTDRfSU9fQUREUkVTUyhPTUFQNDQzMF9DTV9CQVNFKSwKKwkuY20yCT0gT01BUDJfTDRfSU9fQUREUkVTUyhPTUFQNDQzMF9DTTJfQkFTRSksCiB9OwogCiB2b2lkIF9faW5pdCBvbWFwMl9zZXRfZ2xvYmFsc180NDN4KHZvaWQpCiB7CiAJb21hcDJfc2V0X2dsb2JhbHNfdGFwKCZvbWFwNF9nbG9iYWxzKTsKIAlvbWFwMl9zZXRfZ2xvYmFsc19jb250cm9sKCZvbWFwNF9nbG9iYWxzKTsKKwlvbWFwMl9zZXRfZ2xvYmFsc19wcmNtKCZvbWFwNF9nbG9iYWxzKTsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvZGVidWctZGV2aWNlcy5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2RlYnVnLWRldmljZXMuYwppbmRleCAwOWMxMTA3Li45MjNjOTYyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvZGVidWctZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9kZWJ1Zy1kZXZpY2VzLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbWM5MXguaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIApAQCAtMjQsNiArMjUsMTIgQEAKICAqIHBsYXRmb3JtcyBpbmNsdWRlIEgyLCBIMywgSDQsIGFuZCBQZXJzZXVzMi4KICAqLwogCitzdGF0aWMgc3RydWN0IHNtYzkxeF9wbGF0ZGF0YSBzbWM5MXhfaW5mbyA9IHsKKwkuZmxhZ3MJPSBTTUM5MVhfVVNFXzE2QklUIHwgU01DOTFYX05PV0FJVCwKKwkubGVkYQk9IFJQQ19MRURfMTAwXzEwLAorCS5sZWRiCT0gUlBDX0xFRF9UWF9SWCwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc21jOTF4X3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKIAkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLApAQCAtMzYsNiArNDMsOSBAQAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc21jOTF4X2RldmljZSA9IHsKIAkubmFtZQkJPSAic21jOTF4IiwKIAkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJnNtYzkxeF9pbmZvLAorCX0sCiAJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNtYzkxeF9yZXNvdXJjZXMpLAogCS5yZXNvdXJjZQk9IHNtYzkxeF9yZXNvdXJjZXMsCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RldmljZXMuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9kZXZpY2VzLmMKaW5kZXggZjg2NjE3OC4uMzBiNWRiNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RldmljZXMuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvZGV2aWNlcy5jCkBAIC0yNDIsNiArMjQyLDM5IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKKyNpZiBkZWZpbmVkKENPTkZJR19IV19SQU5ET01fT01BUCkgfHwgZGVmaW5lZChDT05GSUdfSFdfUkFORE9NX09NQVBfTU9EVUxFKQorCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKKyNkZWZpbmUJT01BUF9STkdfQkFTRQkJMHg0ODBBMDAwMAorI2Vsc2UKKyNkZWZpbmUJT01BUF9STkdfQkFTRQkJMHhmZmZlNTAwMAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugcm5nX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CQk9IE9NQVBfUk5HX0JBU0UsCisJCS5lbmQJCT0gT01BUF9STkdfQkFTRSArIDB4NGYsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcF9ybmdfZGV2aWNlID0geworCS5uYW1lCQk9ICJvbWFwX3JuZyIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShybmdfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBybmdfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHZvaWQgb21hcF9pbml0X3JuZyh2b2lkKQoreworCSh2b2lkKSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm9tYXBfcm5nX2RldmljZSk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIG9tYXBfaW5pdF9ybmcodm9pZCkge30KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCiAvKiBOdW1iZXJpbmcgZm9yIHRoZSBTUEktY2FwYWJsZSBjb250cm9sbGVycyB3aGVuIHVzZWQgZm9yIFNQSToKICAqIHNwaQkJPSAxCiAgKiB1d2lyZQk9IDIKQEAgLTMyNCwzOSArMzU3LDYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX2luaXRfd2R0KHZvaWQpIHt9CiAjZW5kaWYKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmIGRlZmluZWQoQ09ORklHX0hXX1JBTkRPTV9PTUFQKSB8fCBkZWZpbmVkKENPTkZJR19IV19SQU5ET01fT01BUF9NT0RVTEUpCi0KLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjRYWAotI2RlZmluZQlPTUFQX1JOR19CQVNFCQkweDQ4MEEwMDAwCi0jZWxzZQotI2RlZmluZQlPTUFQX1JOR19CQVNFCQkweGZmZmU1MDAwCi0jZW5kaWYKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBybmdfcmVzb3VyY2VzW10gPSB7Ci0JewotCQkuc3RhcnQJCT0gT01BUF9STkdfQkFTRSwKLQkJLmVuZAkJPSBPTUFQX1JOR19CQVNFICsgMHg0ZiwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvbWFwX3JuZ19kZXZpY2UgPSB7Ci0JLm5hbWUJICAgPSAib21hcF9ybmciLAotCS5pZAkgICAgID0gLTEsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHJuZ19yZXNvdXJjZXMpLAotCS5yZXNvdXJjZQk9IHJuZ19yZXNvdXJjZXMsCi19OwotCi1zdGF0aWMgdm9pZCBvbWFwX2luaXRfcm5nKHZvaWQpCi17Ci0JKHZvaWQpIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmb21hcF9ybmdfZGV2aWNlKTsKLX0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgb21hcF9pbml0X3JuZyh2b2lkKSB7fQotI2VuZGlmCi0KIC8qCiAgKiBUaGlzIGdldHMgY2FsbGVkIGFmdGVyIGJvYXJkLXNwZWNpZmljIElOSVRfTUFDSElORSwgYW5kIGluaXRpYWxpemVzIG1vc3QKICAqIG9uLWNoaXAgcGVyaXBoZXJhbHMgYWNjZXNzaWJsZSBvbiB0aGlzIGJvYXJkIChleGNlcHQgZm9yIGZldyBsaWtlIFVTQik6CkBAIC0zODQsOSArMzg0LDkgQEAKIAkgKi8KIAlvbWFwX2luaXRfZHNwKCk7CiAJb21hcF9pbml0X2twKCk7CisJb21hcF9pbml0X3JuZygpOwogCW9tYXBfaW5pdF91d2lyZSgpOwogCW9tYXBfaW5pdF93ZHQoKTsKLQlvbWFwX2luaXRfcm5nKCk7CiAJcmV0dXJuIDA7CiB9CiBhcmNoX2luaXRjYWxsKG9tYXBfaW5pdF9kZXZpY2VzKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9kbWEuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9kbWEuYwppbmRleCBkMTczNzVlLi4wOWQ4MmIzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvZG1hLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2RtYS5jCkBAIC00Nyw3ICs0Nyw2IEBACiAjZW5kaWYKIAogI2RlZmluZSBPTUFQX0RNQV9BQ1RJVkUJCQkweDAxCi0jZGVmaW5lIE9NQVBfRE1BX0NDUl9FTgkJCSgxIDw8IDcpCiAjZGVmaW5lIE9NQVAyX0RNQV9DU1JfQ0xFQVJfTUFTSwkweGZmZQogCiAjZGVmaW5lIE9NQVBfRlVOQ19NVVhfQVJNX0JBU0UJCSgweGZmZmUxMDAwICsgMHhlYykKQEAgLTExMjAsMTcgKzExMTksOCBAQAogewogCWludCBsY2g7CiAKLQkvKgotCSAqIE9uIE9NQVAxNTEwLCBpbnRlcm5hbCBMQ0QgY29udHJvbGxlciB3aWxsIHN0YXJ0IHRoZSB0cmFuc2ZlcgotCSAqIHdoZW4gaXQgZ2V0cyBlbmFibGVkLCBzbyBhc3N1bWUgRE1BIHJ1bm5pbmcgaWYgTENEIGVuYWJsZWQuCi0JICovCi0JaWYgKGNwdV9pc19vbWFwMTUxMCgpKQotCQlpZiAob21hcF9yZWFkdygweGZmZmVjMDAwICsgMHgwMCkgJiAoMSA8PCAwKSkKLQkJCXJldHVybiAxOwotCi0JLyogQ2hlY2sgaWYgTENEIERNQSBpcyBydW5uaW5nICovCi0JaWYgKGNwdV9pc19vbWFwMTZ4eCgpKQotCQlpZiAob21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NDUikgJiBPTUFQX0RNQV9DQ1JfRU4pCisJaWYgKGNwdV9jbGFzc19pc19vbWFwMSgpKQorCQlpZiAob21hcF9sY2RfZG1hX3J1bm5pbmcoKSkKIAkJCXJldHVybiAxOwogCiAJZm9yIChsY2ggPSAwOyBsY2ggPCBkbWFfY2hhbl9jb3VudDsgbGNoKyspCkBAIC0xOTkwLDM3NyArMTk4MCw2IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0YXRpYyBzdHJ1Y3QgbGNkX2RtYV9pbmZvIHsKLQlzcGlubG9ja190IGxvY2s7Ci0JaW50IHJlc2VydmVkOwotCXZvaWQgKCpjYWxsYmFjaykodTE2IHN0YXR1cywgdm9pZCAqZGF0YSk7Ci0Jdm9pZCAqY2JfZGF0YTsKLQotCWludCBhY3RpdmU7Ci0JdW5zaWduZWQgbG9uZyBhZGRyLCBzaXplOwotCWludCByb3RhdGUsIGRhdGFfdHlwZSwgeHJlcywgeXJlczsKLQlpbnQgdnhyZXM7Ci0JaW50IG1pcnJvcjsKLQlpbnQgeHNjYWxlLCB5c2NhbGU7Ci0JaW50IGV4dF9jdHJsOwotCWludCBzcmNfcG9ydDsKLQlpbnQgc2luZ2xlX3RyYW5zZmVyOwotfSBsY2RfZG1hOwotCi12b2lkIG9tYXBfc2V0X2xjZF9kbWFfYjEodW5zaWduZWQgbG9uZyBhZGRyLCB1MTYgZmJfeHJlcywgdTE2IGZiX3lyZXMsCi0JCQkgaW50IGRhdGFfdHlwZSkKLXsKLQlsY2RfZG1hLmFkZHIgPSBhZGRyOwotCWxjZF9kbWEuZGF0YV90eXBlID0gZGF0YV90eXBlOwotCWxjZF9kbWEueHJlcyA9IGZiX3hyZXM7Ci0JbGNkX2RtYS55cmVzID0gZmJfeXJlczsKLX0KLUVYUE9SVF9TWU1CT0wob21hcF9zZXRfbGNkX2RtYV9iMSk7Ci0KLXZvaWQgb21hcF9zZXRfbGNkX2RtYV9zcmNfcG9ydChpbnQgcG9ydCkKLXsKLQlsY2RfZG1hLnNyY19wb3J0ID0gcG9ydDsKLX0KLQotdm9pZCBvbWFwX3NldF9sY2RfZG1hX2V4dF9jb250cm9sbGVyKGludCBleHRlcm5hbCkKLXsKLQlsY2RfZG1hLmV4dF9jdHJsID0gZXh0ZXJuYWw7Ci19Ci1FWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2xjZF9kbWFfZXh0X2NvbnRyb2xsZXIpOwotCi12b2lkIG9tYXBfc2V0X2xjZF9kbWFfc2luZ2xlX3RyYW5zZmVyKGludCBzaW5nbGUpCi17Ci0JbGNkX2RtYS5zaW5nbGVfdHJhbnNmZXIgPSBzaW5nbGU7Ci19Ci1FWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2xjZF9kbWFfc2luZ2xlX3RyYW5zZmVyKTsKLQotdm9pZCBvbWFwX3NldF9sY2RfZG1hX2IxX3JvdGF0aW9uKGludCByb3RhdGUpCi17Ci0JaWYgKG9tYXBfZG1hX2luXzE1MTBfbW9kZSgpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRE1BIHJvdGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gMTUxMCBtb2RlXG4iKTsKLQkJQlVHKCk7Ci0JCXJldHVybjsKLQl9Ci0JbGNkX2RtYS5yb3RhdGUgPSByb3RhdGU7Ci19Ci1FWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2xjZF9kbWFfYjFfcm90YXRpb24pOwotCi12b2lkIG9tYXBfc2V0X2xjZF9kbWFfYjFfbWlycm9yKGludCBtaXJyb3IpCi17Ci0JaWYgKG9tYXBfZG1hX2luXzE1MTBfbW9kZSgpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRE1BIG1pcnJvciBpcyBub3Qgc3VwcG9ydGVkIGluIDE1MTAgbW9kZVxuIik7Ci0JCUJVRygpOwotCX0KLQlsY2RfZG1hLm1pcnJvciA9IG1pcnJvcjsKLX0KLUVYUE9SVF9TWU1CT0wob21hcF9zZXRfbGNkX2RtYV9iMV9taXJyb3IpOwotCi12b2lkIG9tYXBfc2V0X2xjZF9kbWFfYjFfdnhyZXModW5zaWduZWQgbG9uZyB2eHJlcykKLXsKLQlpZiAob21hcF9kbWFfaW5fMTUxMF9tb2RlKCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJETUEgdmlydHVhbCByZXN1bG90aW9uIGlzIG5vdCBzdXBwb3J0ZWQgIgotCQkJCSJpbiAxNTEwIG1vZGVcbiIpOwotCQlCVUcoKTsKLQl9Ci0JbGNkX2RtYS52eHJlcyA9IHZ4cmVzOwotfQotRVhQT1JUX1NZTUJPTChvbWFwX3NldF9sY2RfZG1hX2IxX3Z4cmVzKTsKLQotdm9pZCBvbWFwX3NldF9sY2RfZG1hX2IxX3NjYWxlKHVuc2lnbmVkIGludCB4c2NhbGUsIHVuc2lnbmVkIGludCB5c2NhbGUpCi17Ci0JaWYgKG9tYXBfZG1hX2luXzE1MTBfbW9kZSgpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRE1BIHNjYWxlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gMTUxMCBtb2RlXG4iKTsKLQkJQlVHKCk7Ci0JfQotCWxjZF9kbWEueHNjYWxlID0geHNjYWxlOwotCWxjZF9kbWEueXNjYWxlID0geXNjYWxlOwotfQotRVhQT1JUX1NZTUJPTChvbWFwX3NldF9sY2RfZG1hX2IxX3NjYWxlKTsKLQotc3RhdGljIHZvaWQgc2V0X2IxX3JlZ3Modm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHRvcCwgYm90dG9tOwotCWludCBlczsKLQl1MTYgdzsKLQl1bnNpZ25lZCBsb25nIGVuLCBmbjsKLQlsb25nIGVpLCBmaTsKLQl1bnNpZ25lZCBsb25nIHZ4cmVzOwotCXVuc2lnbmVkIGludCB4c2NhbGUsIHlzY2FsZTsKLQotCXN3aXRjaCAobGNkX2RtYS5kYXRhX3R5cGUpIHsKLQljYXNlIE9NQVBfRE1BX0RBVEFfVFlQRV9TODoKLQkJZXMgPSAxOwotCQlicmVhazsKLQljYXNlIE9NQVBfRE1BX0RBVEFfVFlQRV9TMTY6Ci0JCWVzID0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBPTUFQX0RNQV9EQVRBX1RZUEVfUzMyOgotCQllcyA9IDQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCQlyZXR1cm47Ci0JfQotCi0JdnhyZXMgPSBsY2RfZG1hLnZ4cmVzID8gbGNkX2RtYS52eHJlcyA6IGxjZF9kbWEueHJlczsKLQl4c2NhbGUgPSBsY2RfZG1hLnhzY2FsZSA/IGxjZF9kbWEueHNjYWxlIDogMTsKLQl5c2NhbGUgPSBsY2RfZG1hLnlzY2FsZSA/IGxjZF9kbWEueXNjYWxlIDogMTsKLQlCVUdfT04odnhyZXMgPCBsY2RfZG1hLnhyZXMpOwotCi0jZGVmaW5lIFBJWEFERFIoeCwgeSkgKGxjZF9kbWEuYWRkciArCQkJCQlcCi0JCSgoeSkgKiB2eHJlcyAqIHlzY2FsZSArICh4KSAqIHhzY2FsZSkgKiBlcykKLSNkZWZpbmUgUElYU1RFUChzeCwgc3ksIGR4LCBkeSkgKFBJWEFERFIoZHgsIGR5KSAtIFBJWEFERFIoc3gsIHN5KSAtIGVzICsgMSkKLQotCXN3aXRjaCAobGNkX2RtYS5yb3RhdGUpIHsKLQljYXNlIDA6Ci0JCWlmICghbGNkX2RtYS5taXJyb3IpIHsKLQkJCXRvcCA9IFBJWEFERFIoMCwgMCk7Ci0JCQlib3R0b20gPSBQSVhBRERSKGxjZF9kbWEueHJlcyAtIDEsIGxjZF9kbWEueXJlcyAtIDEpOwotCQkJLyogMTUxMCBETUEgcmVxdWlyZXMgdGhlIGJvdHRvbSBhZGRyZXNzIHRvIGJlIDIgbW9yZQotCQkJICogdGhhbiB0aGUgYWN0dWFsIGxhc3QgbWVtb3J5IGFjY2VzcyBsb2NhdGlvbi4gKi8KLQkJCWlmIChvbWFwX2RtYV9pbl8xNTEwX21vZGUoKSAmJgotCQkJCWxjZF9kbWEuZGF0YV90eXBlID09IE9NQVBfRE1BX0RBVEFfVFlQRV9TMzIpCi0JCQkJCWJvdHRvbSArPSAyOwotCQkJZWkgPSBQSVhTVEVQKDAsIDAsIDEsIDApOwotCQkJZmkgPSBQSVhTVEVQKGxjZF9kbWEueHJlcyAtIDEsIDAsIDAsIDEpOwotCQl9IGVsc2UgewotCQkJdG9wID0gUElYQUREUihsY2RfZG1hLnhyZXMgLSAxLCAwKTsKLQkJCWJvdHRvbSA9IFBJWEFERFIoMCwgbGNkX2RtYS55cmVzIC0gMSk7Ci0JCQllaSA9IFBJWFNURVAoMSwgMCwgMCwgMCk7Ci0JCQlmaSA9IFBJWFNURVAoMCwgMCwgbGNkX2RtYS54cmVzIC0gMSwgMSk7Ci0JCX0KLQkJZW4gPSBsY2RfZG1hLnhyZXM7Ci0JCWZuID0gbGNkX2RtYS55cmVzOwotCQlicmVhazsKLQljYXNlIDkwOgotCQlpZiAoIWxjZF9kbWEubWlycm9yKSB7Ci0JCQl0b3AgPSBQSVhBRERSKDAsIGxjZF9kbWEueXJlcyAtIDEpOwotCQkJYm90dG9tID0gUElYQUREUihsY2RfZG1hLnhyZXMgLSAxLCAwKTsKLQkJCWVpID0gUElYU1RFUCgwLCAxLCAwLCAwKTsKLQkJCWZpID0gUElYU1RFUCgwLCAwLCAxLCBsY2RfZG1hLnlyZXMgLSAxKTsKLQkJfSBlbHNlIHsKLQkJCXRvcCA9IFBJWEFERFIobGNkX2RtYS54cmVzIC0gMSwgbGNkX2RtYS55cmVzIC0gMSk7Ci0JCQlib3R0b20gPSBQSVhBRERSKDAsIDApOwotCQkJZWkgPSBQSVhTVEVQKDAsIDEsIDAsIDApOwotCQkJZmkgPSBQSVhTVEVQKDEsIDAsIDAsIGxjZF9kbWEueXJlcyAtIDEpOwotCQl9Ci0JCWVuID0gbGNkX2RtYS55cmVzOwotCQlmbiA9IGxjZF9kbWEueHJlczsKLQkJYnJlYWs7Ci0JY2FzZSAxODA6Ci0JCWlmICghbGNkX2RtYS5taXJyb3IpIHsKLQkJCXRvcCA9IFBJWEFERFIobGNkX2RtYS54cmVzIC0gMSwgbGNkX2RtYS55cmVzIC0gMSk7Ci0JCQlib3R0b20gPSBQSVhBRERSKDAsIDApOwotCQkJZWkgPSBQSVhTVEVQKDEsIDAsIDAsIDApOwotCQkJZmkgPSBQSVhTVEVQKDAsIDEsIGxjZF9kbWEueHJlcyAtIDEsIDApOwotCQl9IGVsc2UgewotCQkJdG9wID0gUElYQUREUigwLCBsY2RfZG1hLnlyZXMgLSAxKTsKLQkJCWJvdHRvbSA9IFBJWEFERFIobGNkX2RtYS54cmVzIC0gMSwgMCk7Ci0JCQllaSA9IFBJWFNURVAoMCwgMCwgMSwgMCk7Ci0JCQlmaSA9IFBJWFNURVAobGNkX2RtYS54cmVzIC0gMSwgMSwgMCwgMCk7Ci0JCX0KLQkJZW4gPSBsY2RfZG1hLnhyZXM7Ci0JCWZuID0gbGNkX2RtYS55cmVzOwotCQlicmVhazsKLQljYXNlIDI3MDoKLQkJaWYgKCFsY2RfZG1hLm1pcnJvcikgewotCQkJdG9wID0gUElYQUREUihsY2RfZG1hLnhyZXMgLSAxLCAwKTsKLQkJCWJvdHRvbSA9IFBJWEFERFIoMCwgbGNkX2RtYS55cmVzIC0gMSk7Ci0JCQllaSA9IFBJWFNURVAoMCwgMCwgMCwgMSk7Ci0JCQlmaSA9IFBJWFNURVAoMSwgbGNkX2RtYS55cmVzIC0gMSwgMCwgMCk7Ci0JCX0gZWxzZSB7Ci0JCQl0b3AgPSBQSVhBRERSKDAsIDApOwotCQkJYm90dG9tID0gUElYQUREUihsY2RfZG1hLnhyZXMgLSAxLCBsY2RfZG1hLnlyZXMgLSAxKTsKLQkJCWVpID0gUElYU1RFUCgwLCAwLCAwLCAxKTsKLQkJCWZpID0gUElYU1RFUCgwLCBsY2RfZG1hLnlyZXMgLSAxLCAxLCAwKTsKLQkJfQotCQllbiA9IGxjZF9kbWEueXJlczsKLQkJZm4gPSBsY2RfZG1hLnhyZXM7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCQlyZXR1cm47CS8qIFN1cHByZXNzIHdhcm5pbmcgYWJvdXQgdW5pbml0aWFsaXplZCB2YXJzICovCi0JfQotCi0JaWYgKG9tYXBfZG1hX2luXzE1MTBfbW9kZSgpKSB7Ci0JCW9tYXBfd3JpdGV3KHRvcCA+PiAxNiwgT01BUDE1MTBfRE1BX0xDRF9UT1BfRjFfVSk7Ci0JCW9tYXBfd3JpdGV3KHRvcCwgT01BUDE1MTBfRE1BX0xDRF9UT1BfRjFfTCk7Ci0JCW9tYXBfd3JpdGV3KGJvdHRvbSA+PiAxNiwgT01BUDE1MTBfRE1BX0xDRF9CT1RfRjFfVSk7Ci0JCW9tYXBfd3JpdGV3KGJvdHRvbSwgT01BUDE1MTBfRE1BX0xDRF9CT1RfRjFfTCk7Ci0KLQkJcmV0dXJuOwotCX0KLQotCS8qIDE2MTAgcmVncyAqLwotCW9tYXBfd3JpdGV3KHRvcCA+PiAxNiwgT01BUDE2MTBfRE1BX0xDRF9UT1BfQjFfVSk7Ci0Jb21hcF93cml0ZXcodG9wLCBPTUFQMTYxMF9ETUFfTENEX1RPUF9CMV9MKTsKLQlvbWFwX3dyaXRldyhib3R0b20gPj4gMTYsIE9NQVAxNjEwX0RNQV9MQ0RfQk9UX0IxX1UpOwotCW9tYXBfd3JpdGV3KGJvdHRvbSwgT01BUDE2MTBfRE1BX0xDRF9CT1RfQjFfTCk7Ci0KLQlvbWFwX3dyaXRldyhlbiwgT01BUDE2MTBfRE1BX0xDRF9TUkNfRU5fQjEpOwotCW9tYXBfd3JpdGV3KGZuLCBPTUFQMTYxMF9ETUFfTENEX1NSQ19GTl9CMSk7Ci0KLQl3ID0gb21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NTRFApOwotCXcgJj0gfjB4MDM7Ci0JdyB8PSBsY2RfZG1hLmRhdGFfdHlwZTsKLQlvbWFwX3dyaXRldyh3LCBPTUFQMTYxMF9ETUFfTENEX0NTRFApOwotCi0JdyA9IG9tYXBfcmVhZHcoT01BUDE2MTBfRE1BX0xDRF9DVFJMKTsKLQkvKiBBbHdheXMgc2V0IHRoZSBzb3VyY2UgcG9ydCBhcyBTRFJBTSBmb3Igbm93Ki8KLQl3ICY9IH4oMHgwMyA8PCA2KTsKLQlpZiAobGNkX2RtYS5jYWxsYmFjayAhPSBOVUxMKQotCQl3IHw9IDEgPDwgMTsJCS8qIEJsb2NrIGludGVycnVwdCBlbmFibGUgKi8KLQllbHNlCi0JCXcgJj0gfigxIDw8IDEpOwotCW9tYXBfd3JpdGV3KHcsIE9NQVAxNjEwX0RNQV9MQ0RfQ1RSTCk7Ci0KLQlpZiAoIShsY2RfZG1hLnJvdGF0ZSB8fCBsY2RfZG1hLm1pcnJvciB8fAotCSAgICAgIGxjZF9kbWEudnhyZXMgfHwgbGNkX2RtYS54c2NhbGUgfHwgbGNkX2RtYS55c2NhbGUpKQotCQlyZXR1cm47Ci0KLQl3ID0gb21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NDUik7Ci0JLyogU2V0IHRoZSBkb3VibGUtaW5kZXhlZCBhZGRyZXNzaW5nIG1vZGUgKi8KLQl3IHw9ICgweDAzIDw8IDEyKTsKLQlvbWFwX3dyaXRldyh3LCBPTUFQMTYxMF9ETUFfTENEX0NDUik7Ci0KLQlvbWFwX3dyaXRldyhlaSwgT01BUDE2MTBfRE1BX0xDRF9TUkNfRUlfQjEpOwotCW9tYXBfd3JpdGV3KGZpID4+IDE2LCBPTUFQMTYxMF9ETUFfTENEX1NSQ19GSV9CMV9VKTsKLQlvbWFwX3dyaXRldyhmaSwgT01BUDE2MTBfRE1BX0xDRF9TUkNfRklfQjFfTCk7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBsY2RfZG1hX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQl1MTYgdzsKLQotCXcgPSBvbWFwX3JlYWR3KE9NQVAxNjEwX0RNQV9MQ0RfQ1RSTCk7Ci0JaWYgKHVubGlrZWx5KCEodyAmICgxIDw8IDMpKSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU3B1cmlvdXMgTENEIERNQSBJUlFcbiIpOwotCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQotCS8qIEFjayB0aGUgSVJRICovCi0JdyB8PSAoMSA8PCAzKTsKLQlvbWFwX3dyaXRldyh3LCBPTUFQMTYxMF9ETUFfTENEX0NUUkwpOwotCWxjZF9kbWEuYWN0aXZlID0gMDsKLQlpZiAobGNkX2RtYS5jYWxsYmFjayAhPSBOVUxMKQotCQlsY2RfZG1hLmNhbGxiYWNrKHcsIGxjZF9kbWEuY2JfZGF0YSk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLWludCBvbWFwX3JlcXVlc3RfbGNkX2RtYSh2b2lkICgqY2FsbGJhY2spKHUxNiBzdGF0dXMsIHZvaWQgKmRhdGEpLAotCQkJIHZvaWQgKmRhdGEpCi17Ci0Jc3Bpbl9sb2NrX2lycSgmbGNkX2RtYS5sb2NrKTsKLQlpZiAobGNkX2RtYS5yZXNlcnZlZCkgewotCQlzcGluX3VubG9ja19pcnEoJmxjZF9kbWEubG9jayk7Ci0JCXByaW50ayhLRVJOX0VSUiAiTENEIERNQSBjaGFubmVsIGFscmVhZHkgcmVzZXJ2ZWRcbiIpOwotCQlCVUcoKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0JbGNkX2RtYS5yZXNlcnZlZCA9IDE7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZsY2RfZG1hLmxvY2spOwotCWxjZF9kbWEuY2FsbGJhY2sgPSBjYWxsYmFjazsKLQlsY2RfZG1hLmNiX2RhdGEgPSBkYXRhOwotCWxjZF9kbWEuYWN0aXZlID0gMDsKLQlsY2RfZG1hLnNpbmdsZV90cmFuc2ZlciA9IDA7Ci0JbGNkX2RtYS5yb3RhdGUgPSAwOwotCWxjZF9kbWEudnhyZXMgPSAwOwotCWxjZF9kbWEubWlycm9yID0gMDsKLQlsY2RfZG1hLnhzY2FsZSA9IDA7Ci0JbGNkX2RtYS55c2NhbGUgPSAwOwotCWxjZF9kbWEuZXh0X2N0cmwgPSAwOwotCWxjZF9kbWEuc3JjX3BvcnQgPSAwOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKG9tYXBfcmVxdWVzdF9sY2RfZG1hKTsKLQotdm9pZCBvbWFwX2ZyZWVfbGNkX2RtYSh2b2lkKQotewotCXNwaW5fbG9jaygmbGNkX2RtYS5sb2NrKTsKLQlpZiAoIWxjZF9kbWEucmVzZXJ2ZWQpIHsKLQkJc3Bpbl91bmxvY2soJmxjZF9kbWEubG9jayk7Ci0JCXByaW50ayhLRVJOX0VSUiAiTENEIERNQSBpcyBub3QgcmVzZXJ2ZWRcbiIpOwotCQlCVUcoKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoIWVuYWJsZV8xNTEwX21vZGUpCi0JCW9tYXBfd3JpdGV3KG9tYXBfcmVhZHcoT01BUDE2MTBfRE1BX0xDRF9DQ1IpICYgfjEsCi0JCQkgICAgT01BUDE2MTBfRE1BX0xDRF9DQ1IpOwotCWxjZF9kbWEucmVzZXJ2ZWQgPSAwOwotCXNwaW5fdW5sb2NrKCZsY2RfZG1hLmxvY2spOwotfQotRVhQT1JUX1NZTUJPTChvbWFwX2ZyZWVfbGNkX2RtYSk7Ci0KLXZvaWQgb21hcF9lbmFibGVfbGNkX2RtYSh2b2lkKQotewotCXUxNiB3OwotCi0JLyoKLQkgKiBTZXQgdGhlIEVuYWJsZSBiaXQgb25seSBpZiBhbiBleHRlcm5hbCBjb250cm9sbGVyIGlzCi0JICogY29ubmVjdGVkLiBPdGhlcndpc2UgdGhlIE9NQVAgaW50ZXJuYWwgY29udHJvbGxlciB3aWxsCi0JICogc3RhcnQgdGhlIHRyYW5zZmVyIHdoZW4gaXQgZ2V0cyBlbmFibGVkLgotCSAqLwotCWlmIChlbmFibGVfMTUxMF9tb2RlIHx8ICFsY2RfZG1hLmV4dF9jdHJsKQotCQlyZXR1cm47Ci0KLQl3ID0gb21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NUUkwpOwotCXcgfD0gMSA8PCA4OwotCW9tYXBfd3JpdGV3KHcsIE9NQVAxNjEwX0RNQV9MQ0RfQ1RSTCk7Ci0KLQlsY2RfZG1hLmFjdGl2ZSA9IDE7Ci0KLQl3ID0gb21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NDUik7Ci0JdyB8PSAxIDw8IDc7Ci0Jb21hcF93cml0ZXcodywgT01BUDE2MTBfRE1BX0xDRF9DQ1IpOwotfQotRVhQT1JUX1NZTUJPTChvbWFwX2VuYWJsZV9sY2RfZG1hKTsKLQotdm9pZCBvbWFwX3NldHVwX2xjZF9kbWEodm9pZCkKLXsKLQlCVUdfT04obGNkX2RtYS5hY3RpdmUpOwotCWlmICghZW5hYmxlXzE1MTBfbW9kZSkgewotCQkvKiBTZXQgc29tZSByZWFzb25hYmxlIGRlZmF1bHRzICovCi0JCW9tYXBfd3JpdGV3KDB4NTQ0MCwgT01BUDE2MTBfRE1BX0xDRF9DQ1IpOwotCQlvbWFwX3dyaXRldygweDkxMDIsIE9NQVAxNjEwX0RNQV9MQ0RfQ1NEUCk7Ci0JCW9tYXBfd3JpdGV3KDB4MDAwNCwgT01BUDE2MTBfRE1BX0xDRF9MQ0hfQ1RSTCk7Ci0JfQotCXNldF9iMV9yZWdzKCk7Ci0JaWYgKCFlbmFibGVfMTUxMF9tb2RlKSB7Ci0JCXUxNiB3OwotCi0JCXcgPSBvbWFwX3JlYWR3KE9NQVAxNjEwX0RNQV9MQ0RfQ0NSKTsKLQkJLyoKLQkJICogSWYgRE1BIHdhcyBhbHJlYWR5IGFjdGl2ZSBzZXQgdGhlIGVuZF9wcm9nIGJpdCB0byBoYXZlCi0JCSAqIHRoZSBwcm9ncmFtbWVkIHJlZ2lzdGVyIHNldCBsb2FkZWQgaW50byB0aGUgYWN0aXZlCi0JCSAqIHJlZ2lzdGVyIHNldC4KLQkJICovCi0JCXcgfD0gMSA8PCAxMTsJCS8qIEVuZF9wcm9nICovCi0JCWlmICghbGNkX2RtYS5zaW5nbGVfdHJhbnNmZXIpCi0JCQl3IHw9ICgzIDw8IDgpOwkvKiBBdXRvX2luaXQsIHJlcGVhdCAqLwotCQlvbWFwX3dyaXRldyh3LCBPTUFQMTYxMF9ETUFfTENEX0NDUik7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChvbWFwX3NldHVwX2xjZF9kbWEpOwotCi12b2lkIG9tYXBfc3RvcF9sY2RfZG1hKHZvaWQpCi17Ci0JdTE2IHc7Ci0KLQlsY2RfZG1hLmFjdGl2ZSA9IDA7Ci0JaWYgKGVuYWJsZV8xNTEwX21vZGUgfHwgIWxjZF9kbWEuZXh0X2N0cmwpCi0JCXJldHVybjsKLQotCXcgPSBvbWFwX3JlYWR3KE9NQVAxNjEwX0RNQV9MQ0RfQ0NSKTsKLQl3ICY9IH4oMSA8PCA3KTsKLQlvbWFwX3dyaXRldyh3LCBPTUFQMTYxMF9ETUFfTENEX0NDUik7Ci0KLQl3ID0gb21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NUUkwpOwotCXcgJj0gfigxIDw8IDgpOwotCW9tYXBfd3JpdGV3KHcsIE9NQVAxNjEwX0RNQV9MQ0RfQ1RSTCk7Ci19Ci1FWFBPUlRfU1lNQk9MKG9tYXBfc3RvcF9sY2RfZG1hKTsKLQogdm9pZCBvbWFwX2RtYV9nbG9iYWxfY29udGV4dF9zYXZlKHZvaWQpCiB7CiAJb21hcF9kbWFfZ2xvYmFsX2NvbnRleHQuZG1hX2lycWVuYWJsZV9sMCA9CkBAIC0yNDY1LDE0ICsyMDg0LDYgQEAKIAkJCWRtYV9jaGFuX2NvdW50ID0gMTY7CiAJCX0gZWxzZQogCQkJZG1hX2NoYW5fY291bnQgPSA5OwotCQlpZiAoY3B1X2lzX29tYXAxNnh4KCkpIHsKLQkJCXUxNiB3OwotCi0JCQkvKiB0aGlzIHdvdWxkIHByZXZlbnQgT01BUCBzbGVlcCAqLwotCQkJdyA9IG9tYXBfcmVhZHcoT01BUDE2MTBfRE1BX0xDRF9DVFJMKTsKLQkJCXcgJj0gfigxIDw8IDgpOwotCQkJb21hcF93cml0ZXcodywgT01BUDE2MTBfRE1BX0xDRF9DVFJMKTsKLQkJfQogCX0gZWxzZSBpZiAoY3B1X2NsYXNzX2lzX29tYXAyKCkpIHsKIAkJdTggcmV2aXNpb24gPSBkbWFfcmVhZChSRVZJU0lPTikgJiAweGZmOwogCQlwcmludGsoS0VSTl9JTkZPICJPTUFQIERNQSBoYXJkd2FyZSByZXZpc2lvbiAlZC4lZFxuIiwKQEAgLTI0ODMsNyArMjA5NCw2IEBACiAJCXJldHVybiAwOwogCX0KIAotCXNwaW5fbG9ja19pbml0KCZsY2RfZG1hLmxvY2spOwogCXNwaW5fbG9ja19pbml0KCZkbWFfY2hhbl9sb2NrKTsKIAogCWZvciAoY2ggPSAwOyBjaCA8IGRtYV9jaGFuX2NvdW50OyBjaCsrKSB7CkBAIC0yNTQ4LDIyICsyMTU4LDYgQEAKIAkJfQogCX0KIAotCi0JLyogRklYTUU6IFVwZGF0ZSBMQ0QgRE1BIHRvIHdvcmsgb24gMjR4eCAqLwotCWlmIChjcHVfY2xhc3NfaXNfb21hcDEoKSkgewotCQlyID0gcmVxdWVzdF9pcnEoSU5UX0RNQV9MQ0QsIGxjZF9kbWFfaXJxX2hhbmRsZXIsIDAsCi0JCQkJIkxDRCBETUEiLCBOVUxMKTsKLQkJaWYgKHIgIT0gMCkgewotCQkJaW50IGk7Ci0KLQkJCXByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIHJlcXVlc3QgSVJRIGZvciBMQ0QgRE1BICIKLQkJCSAgICAgICAiKGVycm9yICVkKVxuIiwgcik7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgZG1hX2NoYW5fY291bnQ7IGkrKykKLQkJCQlmcmVlX2lycShvbWFwMV9kbWFfaXJxW2ldLCAodm9pZCAqKSAoaSArIDEpKTsKLQkJCWdvdG8gb3V0X2ZyZWU7Ci0JCX0KLQl9Ci0KIAlyZXR1cm4gMDsKIAogb3V0X2ZyZWU6CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaTJjLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvaTJjLmMKaW5kZXggYzA4MzYyZC4uMzNmZmY0ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2kyYy5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pMmMuYwpAQCAtODAsNDcgKzgwLDggQEAKICNlbmRpZgogfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDI0WFgpCi1zdGF0aWMgY29uc3QgaW50IG9tYXAyNHh4X3BpbnNbXVsyXSA9IHsKLQl7IE0xOV8yNFhYX0kyQzFfU0NMLCBMMTVfMjRYWF9JMkMxX1NEQSB9LAotCXsgSjE1XzI0WFhfSTJDMl9TQ0wsIEgxOV8yNFhYX0kyQzJfU0RBIH0sCi19OwotI2Vsc2UKLXN0YXRpYyBjb25zdCBpbnQgb21hcDI0eHhfcGluc1tdWzJdID0ge307Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAzNFhYKQotc3RhdGljIGNvbnN0IGludCBvbWFwMzR4eF9waW5zW11bMl0gPSB7Ci0JeyBLMjFfMzRYWF9JMkMxX1NDTCwgSjIxXzM0WFhfSTJDMV9TREF9LAotCXsgQUYxNV8zNFhYX0kyQzJfU0NMLCBBRTE1XzM0WFhfSTJDMl9TREF9LAotCXsgQUYxNF8zNFhYX0kyQzNfU0NMLCBBRzE0XzM0WFhfSTJDM19TREF9LAotfTsKLSNlbHNlCi1zdGF0aWMgY29uc3QgaW50IG9tYXAzNHh4X3BpbnNbXVsyXSA9IHt9OwotI2VuZGlmCi0KICNkZWZpbmUgT01BUF9JMkNfQ01ETElORV9TRVRVUAkoQklUKDMxKSkKIAotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfaTJjX211eF9waW5zKGludCBidXMpCi17Ci0JaW50IHNjbCwgc2RhOwotCi0JaWYgKGNwdV9jbGFzc19pc19vbWFwMSgpKSB7Ci0JCXNjbCA9IEkyQ19TQ0w7Ci0JCXNkYSA9IEkyQ19TREE7Ci0JfSBlbHNlIGlmIChjcHVfaXNfb21hcDI0eHgoKSkgewotCQlzY2wgPSBvbWFwMjR4eF9waW5zW2J1c11bMF07Ci0JCXNkYSA9IG9tYXAyNHh4X3BpbnNbYnVzXVsxXTsKLQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMzR4eCgpKSB7Ci0JCXNjbCA9IG9tYXAzNHh4X3BpbnNbYnVzXVswXTsKLQkJc2RhID0gb21hcDM0eHhfcGluc1tidXNdWzFdOwotCX0gZWxzZSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlvbWFwX2NmZ19yZWcoc2RhKTsKLQlvbWFwX2NmZ19yZWcoc2NsKTsKLX0KLQogc3RhdGljIGludCBfX2luaXQgb21hcF9pMmNfbnJfcG9ydHModm9pZCkKIHsKIAlpbnQgcG9ydHMgPSAwOwpAQCAtMTU2LDcgKzExNyw2IEBACiAJCXJlc1sxXS5zdGFydCA9IGlycTsKIAl9CiAKLQlvbWFwX2kyY19tdXhfcGlucyhidXNfaWQgLSAxKTsKIAlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKHBkZXYpOwogfQogCkBAIC0yMDksNyArMTY5LDcgQEAKIHN1YnN5c19pbml0Y2FsbChvbWFwX3JlZ2lzdGVyX2kyY19idXNfY21kbGluZSk7CiAKIC8qKgotICogb21hcF9yZWdpc3Rlcl9pMmNfYnVzIC0gcmVnaXN0ZXIgSTJDIGJ1cyB3aXRoIGRldmljZSBkZXNjcmlwdG9ycworICogb21hcF9wbGF0X3JlZ2lzdGVyX2kyY19idXMgLSByZWdpc3RlciBJMkMgYnVzIHdpdGggZGV2aWNlIGRlc2NyaXB0b3JzCiAgKiBAYnVzX2lkOiBidXMgaWQgY291bnRpbmcgZnJvbSBudW1iZXIgMQogICogQGNsa3JhdGU6IGNsb2NrIHJhdGUgb2YgdGhlIGJ1cyBpbiBrSHoKICAqIEBpbmZvOiBwb2ludGVyIGludG8gSTJDIGRldmljZSBkZXNjcmlwdG9yIHRhYmxlIG9yIE5VTEwKQEAgLTIxNyw3ICsxNzcsNyBAQAogICoKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIGFuIGVycm9yIGNvZGUuCiAgKi8KLWludCBfX2luaXQgb21hcF9yZWdpc3Rlcl9pMmNfYnVzKGludCBidXNfaWQsIHUzMiBjbGtyYXRlLAoraW50IF9faW5pdCBvbWFwX3BsYXRfcmVnaXN0ZXJfaTJjX2J1cyhpbnQgYnVzX2lkLCB1MzIgY2xrcmF0ZSwKIAkJCSAgc3RydWN0IGkyY19ib2FyZF9pbmZvIGNvbnN0ICppbmZvLAogCQkJICB1bnNpZ25lZCBsZW4pCiB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2JvYXJkLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2JvYXJkLmgKaW5kZXggYWJiMTdiNi4uMzc2Y2UxOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9ib2FyZC5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvYm9hcmQuaApAQCAtMTE0LDE1ICsxMTQsNiBAQAogCXZvaWQgKCpzZXRfcG93ZXIpKHN0cnVjdCBvbWFwX3B3bV9sZWRfcGxhdGZvcm1fZGF0YSAqc2VsZiwgaW50IG9uX29mZik7CiB9OwogCi0vKiBTZWUgYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9ncGlvLXN3aXRjaC5oIGZvciBkZWZpbml0aW9ucyAqLwotc3RydWN0IG9tYXBfZ3Bpb19zd2l0Y2hfY29uZmlnIHsKLQljaGFyIG5hbWVbMTJdOwotCXUxNiBncGlvOwotCWludCBmbGFnczo0OwotCWludCB0eXBlOjQ7Ci0JaW50IGtleV9jb2RlOjI0OyAvKiBMaW51eCBrZXkgY29kZSAqLwotfTsKLQogc3RydWN0IG9tYXBfdWFydF9jb25maWcgewogCS8qIEJpdCBmaWVsZCBvZiBVQVJUcyBwcmVzZW50OyBiaXQgMCAtLT4gVUFSVDEgKi8KIAl1bnNpZ25lZCBpbnQgZW5hYmxlZF91YXJ0czsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvY2xrZGV2X29tYXAuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvY2xrZGV2X29tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWIzNmNhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9jbGtkZXZfb21hcC5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBjbGtkZXYgPC0+IE9NQVAgaW50ZWdyYXRpb24KKyAqCisgKiBSdXNzZWxsIEtpbmcgPGxpbnV4QGFybS5saW51eC5vcmcudWs+CisgKgorICovCisKKyNpZm5kZWYgX19BUkNIX0FSTV9QTEFUX09NQVBfSU5DTFVERV9QTEFUX0NMS0RFVl9PTUFQX0gKKyNkZWZpbmUgX19BUkNIX0FSTV9QTEFUX09NQVBfSU5DTFVERV9QTEFUX0NMS0RFVl9PTUFQX0gKKworI2luY2x1ZGUgPGFzbS9jbGtkZXYuaD4KKworc3RydWN0IG9tYXBfY2xrIHsKKwl1MTYJCQkJY3B1OworCXN0cnVjdCBjbGtfbG9va3VwCQlsazsKK307CisKKyNkZWZpbmUgQ0xLKGRldiwgY29uLCBjaywgY3ApIAkJXAorCXsJCQkJXAorCQkgLmNwdSA9IGNwLAkJXAorCQkubGsgPSB7CQkJXAorCQkJLmRldl9pZCA9IGRldiwJXAorCQkJLmNvbl9pZCA9IGNvbiwJXAorCQkJLmNsayA9IGNrLAlcCisJCX0sCQkJXAorCX0KKworCisjZGVmaW5lIENLXzMxMAkJKDEgPDwgMCkKKyNkZWZpbmUgQ0tfN1hYCQkoMSA8PCAxKQorI2RlZmluZSBDS18xNTEwCQkoMSA8PCAyKQorI2RlZmluZSBDS18xNlhYCQkoMSA8PCAzKQorI2RlZmluZSBDS18yNDNYCQkoMSA8PCA0KQorI2RlZmluZSBDS18yNDJYCQkoMSA8PCA1KQorI2RlZmluZSBDS18zNDNYCQkoMSA8PCA2KQorI2RlZmluZSBDS18zNDMwRVMxCSgxIDw8IDcpCisjZGVmaW5lIENLXzM0MzBFUzIJKDEgPDwgOCkKKyNkZWZpbmUgQ0tfNDQzWAkJKDEgPDwgOSkKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvY2xvY2suaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvY2xvY2suaAppbmRleCA0YjhiMGQ2Li4zMDliNmQxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2Nsb2NrLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9jbG9jay5oCkBAIC0xMyw2ICsxMyw4IEBACiAjaWZuZGVmIF9fQVJDSF9BUk1fT01BUF9DTE9DS19ICiAjZGVmaW5lIF9fQVJDSF9BUk1fT01BUF9DTE9DS19ICiAKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKIHN0cnVjdCBtb2R1bGU7CiBzdHJ1Y3QgY2xrOwogc3RydWN0IGNsb2NrZG9tYWluOwpAQCAtMTQ4LDYgKzE1MCw4IEBACiAjZGVmaW5lIENPTkZJR19QQVJUSUNJUEFOVAkoMSA8PCAxMCkJLyogRnVuZGFtZW50YWwgY2xvY2sgKi8KICNkZWZpbmUgRU5BQkxFX09OX0lOSVQJCSgxIDw8IDExKQkvKiBFbmFibGUgdXBvbiBmcmFtZXdvcmsgaW5pdCAqLwogI2RlZmluZSBJTlZFUlRfRU5BQkxFICAgICAgICAgICAoMSA8PCAxMikgICAgICAgLyogMCBlbmFibGVzLCAxIGRpc2FibGVzICovCisjZGVmaW5lIENMT0NLX0lOX09NQVA0NDMwCSgxIDw8IDEzKQorI2RlZmluZSBBTFdBWVNfRU5BQkxFRAkJKDEgPDwgMTQpCiAvKiBiaXRzIDEzLTMxIGFyZSBjdXJyZW50bHkgZnJlZSAqLwogCiAvKiBDbGtzZWxfcmF0ZSBmbGFncyAqLwpAQCAtMTU2LDYgKzE2MCw3IEBACiAjZGVmaW5lIFJBVEVfSU5fMjQzWAkJKDEgPDwgMikKICNkZWZpbmUgUkFURV9JTl8zNDNYCQkoMSA8PCAzKQkvKiByYXRlcyBjb21tb24gdG8gYWxsIDM0M1ggKi8KICNkZWZpbmUgUkFURV9JTl8zNDMwRVMyCQkoMSA8PCA0KQkvKiAzNDMwRVMyIHJhdGVzIG9ubHkgKi8KKyNkZWZpbmUgUkFURV9JTl80NDMwICAgICAgICAgICAgKDEgPDwgNSkKIAogI2RlZmluZSBSQVRFX0lOXzI0WFgJCShSQVRFX0lOXzI0MlggfCBSQVRFX0lOXzI0M1gpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvY29tbW9uLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2NvbW1vbi5oCmluZGV4IDA2NGYxNzMuLjMyYzIyMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvY29tbW9uLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9jb21tb24uaApAQCAtMjcsNyArMjcsNyBAQAogI2lmbmRlZiBfX0FSQ0hfQVJNX01BQ0hfT01BUF9DT01NT05fSAogI2RlZmluZSBfX0FSQ0hfQVJNX01BQ0hfT01BUF9DT01NT05fSAogCi0jaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8cGxhdC9pMmMuaD4KIAogc3RydWN0IHN5c190aW1lcjsKIApAQCAtMzYsMTggKzM2LDYgQEAKIAogZXh0ZXJuIHZvaWQgb21hcF9tYXBfY29tbW9uX2lvKHZvaWQpOwogZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgb21hcF90aW1lcjsKLSNpZiBkZWZpbmVkKENPTkZJR19JMkNfT01BUCkgfHwgZGVmaW5lZChDT05GSUdfSTJDX09NQVBfTU9EVUxFKQotZXh0ZXJuIGludCBvbWFwX3JlZ2lzdGVyX2kyY19idXMoaW50IGJ1c19pZCwgdTMyIGNsa3JhdGUsCi0JCQkJIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBjb25zdCAqaW5mbywKLQkJCQkgdW5zaWduZWQgbGVuKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBvbWFwX3JlZ2lzdGVyX2kyY19idXMoaW50IGJ1c19pZCwgdTMyIGNsa3JhdGUsCi0JCQkJIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBjb25zdCAqaW5mbywKLQkJCQkgdW5zaWduZWQgbGVuKQotewotCXJldHVybiAwOwotfQotI2VuZGlmCiAKIC8qIElPIGJhc2VzIGZvciB2YXJpb3VzIE9NQVAgcHJvY2Vzc29ycyAqLwogc3RydWN0IG9tYXBfZ2xvYmFscyB7CkBAIC01OCw2ICs0Niw3IEBACiAJdm9pZCBfX2lvbWVtCSpjdHJsOwkJLyogU3lzdGVtIENvbnRyb2wgTW9kdWxlICovCiAJdm9pZCBfX2lvbWVtCSpwcm07CQkvKiBQb3dlciBhbmQgUmVzZXQgTWFuYWdlbWVudCAqLwogCXZvaWQgX19pb21lbQkqY207CQkvKiBDbG9jayBNYW5hZ2VtZW50ICovCisJdm9pZCBfX2lvbWVtCSpjbTI7CiB9OwogCiB2b2lkIG9tYXAyX3NldF9nbG9iYWxzXzI0Mngodm9pZCk7CkBAIC03MSw0ICs2MCwyNCBAQAogdm9pZCBvbWFwMl9zZXRfZ2xvYmFsc19jb250cm9sKHN0cnVjdCBvbWFwX2dsb2JhbHMgKik7CiB2b2lkIG9tYXAyX3NldF9nbG9iYWxzX3ByY20oc3RydWN0IG9tYXBfZ2xvYmFscyAqKTsKIAorLyoqCisgKiBvbWFwX3Rlc3RfdGltZW91dCAtIGJ1c3ktbG9vcCwgdGVzdGluZyBhIGNvbmRpdGlvbgorICogQGNvbmQ6IGNvbmRpdGlvbiB0byB0ZXN0IHVudGlsIGl0IGV2YWx1YXRlcyB0byB0cnVlCisgKiBAdGltZW91dDogbWF4aW11bSBudW1iZXIgb2YgbWljcm9zZWNvbmRzIGluIHRoZSB0aW1lb3V0CisgKiBAaW5kZXg6IGxvb3AgaW5kZXggKGludGVnZXIpCisgKgorICogTG9vcCB3YWl0aW5nIGZvciBAY29uZCB0byBiZWNvbWUgdHJ1ZSBvciB1bnRpbCBhdCBsZWFzdCBAdGltZW91dAorICogbWljcm9zZWNvbmRzIGhhdmUgcGFzc2VkLiAgVG8gdXNlLCBkZWZpbmUgc29tZSBpbnRlZ2VyIEBpbmRleCBpbiB0aGUKKyAqIGNhbGxpbmcgY29kZS4gIEFmdGVyIHJ1bm5pbmcsIGlmIEBpbmRleCA9PSBAdGltZW91dCwgdGhlbiB0aGUgbG9vcCBoYXMKKyAqIHRpbWVkIG91dC4KKyAqLworI2RlZmluZSBvbWFwX3Rlc3RfdGltZW91dChjb25kLCB0aW1lb3V0LCBpbmRleCkJCQlcCisoewkJCQkJCQkJXAorCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHRpbWVvdXQ7IGluZGV4KyspIHsJCVwKKwkJaWYgKGNvbmQpCQkJCQlcCisJCQlicmVhazsJCQkJCVwKKwkJdWRlbGF5KDEpOwkJCQkJXAorCX0JCQkJCQkJXAorfSkKKwogI2VuZGlmIC8qIF9fQVJDSF9BUk1fTUFDSF9PTUFQX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2NwdS5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9jcHUuaAppbmRleCAyZTE3ODkwLi45YTAyOGJkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2NwdS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvY3B1LmgKQEAgLTE3NiwxMSArMTc2LDEzIEBACiBJU19PTUFQX0NMQVNTKDE2eHgsIDB4MTYpCiBJU19PTUFQX0NMQVNTKDI0eHgsIDB4MjQpCiBJU19PTUFQX0NMQVNTKDM0eHgsIDB4MzQpCitJU19PTUFQX0NMQVNTKDQ0eHgsIDB4NDQpCiAKIElTX09NQVBfU1VCQ0xBU1MoMjQyeCwgMHgyNDIpCiBJU19PTUFQX1NVQkNMQVNTKDI0M3gsIDB4MjQzKQogSVNfT01BUF9TVUJDTEFTUygzNDN4LCAweDM0MykKIElTX09NQVBfU1VCQ0xBU1MoMzYzeCwgMHgzNjMpCitJU19PTUFQX1NVQkNMQVNTKDQ0M3gsIDB4NDQzKQogCiAjZGVmaW5lIGNwdV9pc19vbWFwN3h4KCkJCTAKICNkZWZpbmUgY3B1X2lzX29tYXAxNXh4KCkJCTAKQEAgLTM5MywxMSArMzk1LDExIEBACiAJCQkJCQkoIW9tYXAzX2hhc19pdmEoKSkgJiYJXAogCQkJCQkJKCFvbWFwM19oYXNfc2d4KCkpKQogIyBkZWZpbmUgY3B1X2lzX29tYXAzNTE1KCkJCShjcHVfaXNfb21hcDM0MzAoKSAmJgkJXAotCQkJCQkJKG9tYXAzX2hhc19pdmEoKSkgJiYJXAotCQkJCQkJKCFvbWFwM19oYXNfc2d4KCkpKQorCQkJCQkJKCFvbWFwM19oYXNfaXZhKCkpICYmCVwKKwkJCQkJCShvbWFwM19oYXNfc2d4KCkpKQogIyBkZWZpbmUgY3B1X2lzX29tYXAzNTI1KCkJCShjcHVfaXNfb21hcDM0MzAoKSAmJgkJXAotCQkJCQkJKG9tYXAzX2hhc19zZ3goKSkgJiYJXAotCQkJCQkJKCFvbWFwM19oYXNfaXZhKCkpKQorCQkJCQkJKCFvbWFwM19oYXNfc2d4KCkpICYmCVwKKwkJCQkJCShvbWFwM19oYXNfaXZhKCkpKQogIyBkZWZpbmUgY3B1X2lzX29tYXAzNTMwKCkJCShjcHVfaXNfb21hcDM0MzAoKSkKICMgZGVmaW5lIGNwdV9pc19vbWFwMzUwNSgpCQlpc19vbWFwMzUwNSgpCiAjIGRlZmluZSBjcHVfaXNfb21hcDM1MTcoKQkJaXNfb21hcDM1MTcoKQpAQCAtNDA4LDggKzQxMCw4IEBACiAjIGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDQpCiAjIHVuZGVmIGNwdV9pc19vbWFwNDR4eAogIyB1bmRlZiBjcHVfaXNfb21hcDQ0M3gKLSMgZGVmaW5lIGNwdV9pc19vbWFwNDR4eCgpCQkxCi0jIGRlZmluZSBjcHVfaXNfb21hcDQ0M3goKQkJMQorIyBkZWZpbmUgY3B1X2lzX29tYXA0NHh4KCkJCWlzX29tYXA0NHh4KCkKKyMgZGVmaW5lIGNwdV9pc19vbWFwNDQzeCgpCQlpc19vbWFwNDQzeCgpCiAjIGVuZGlmCiAKIC8qIE1hY3JvcyB0byBkZXRlY3QgaWYgd2UgaGF2ZSBPTUFQMSBvciBPTUFQMiAqLwpAQCAtNDM2LDE0ICs0MzgsMTUgQEAKICNkZWZpbmUgT01BUDM2MzBfUkVWX0VTMV8wCTB4MzYzMDAwMzQKIAogI2RlZmluZSBPTUFQMzVYWF9DTEFTUwkJMHgzNTAwMDAzNAotI2RlZmluZSBPTUFQMzUwM19SRVYodikJCShPTUFQMzVYWF9DTEFTUyB8ICgweDM1MDMgPDwgMTYpIHwgKHYgPDwgMTIpKQotI2RlZmluZSBPTUFQMzUxNV9SRVYodikJCShPTUFQMzVYWF9DTEFTUyB8ICgweDM1MTUgPDwgMTYpIHwgKHYgPDwgMTIpKQotI2RlZmluZSBPTUFQMzUyNV9SRVYodikJCShPTUFQMzVYWF9DTEFTUyB8ICgweDM1MjUgPDwgMTYpIHwgKHYgPDwgMTIpKQotI2RlZmluZSBPTUFQMzUzMF9SRVYodikJCShPTUFQMzVYWF9DTEFTUyB8ICgweDM1MzAgPDwgMTYpIHwgKHYgPDwgMTIpKQotI2RlZmluZSBPTUFQMzUwNV9SRVYodikJCShPTUFQMzVYWF9DTEFTUyB8ICgweDM1MDUgPDwgMTYpIHwgKHYgPDwgMTIpKQotI2RlZmluZSBPTUFQMzUxN19SRVYodikJCShPTUFQMzVYWF9DTEFTUyB8ICgweDM1MTcgPDwgMTYpIHwgKHYgPDwgMTIpKQorI2RlZmluZSBPTUFQMzUwM19SRVYodikJCShPTUFQMzVYWF9DTEFTUyB8ICgweDM1MDMgPDwgMTYpIHwgKHYgPDwgOCkpCisjZGVmaW5lIE9NQVAzNTE1X1JFVih2KQkJKE9NQVAzNVhYX0NMQVNTIHwgKDB4MzUxNSA8PCAxNikgfCAodiA8PCA4KSkKKyNkZWZpbmUgT01BUDM1MjVfUkVWKHYpCQkoT01BUDM1WFhfQ0xBU1MgfCAoMHgzNTI1IDw8IDE2KSB8ICh2IDw8IDgpKQorI2RlZmluZSBPTUFQMzUzMF9SRVYodikJCShPTUFQMzVYWF9DTEFTUyB8ICgweDM1MzAgPDwgMTYpIHwgKHYgPDwgOCkpCisjZGVmaW5lIE9NQVAzNTA1X1JFVih2KQkJKE9NQVAzNVhYX0NMQVNTIHwgKDB4MzUwNSA8PCAxNikgfCAodiA8PCA4KSkKKyNkZWZpbmUgT01BUDM1MTdfUkVWKHYpCQkoT01BUDM1WFhfQ0xBU1MgfCAoMHgzNTE3IDw8IDE2KSB8ICh2IDw8IDgpKQogCi0jZGVmaW5lIE9NQVA0NDNYX0NMQVNTCQkweDQ0MzAwMDM0CisjZGVmaW5lIE9NQVA0NDNYX0NMQVNTCQkweDQ0MzAwMDQ0CisjZGVmaW5lIE9NQVA0NDMwX1JFVl9FUzFfMAkweDQ0MzAwMDQ0CiAKIC8qCiAgKiBvbWFwX2NoaXAgYml0cwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9kbWEuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvZG1hLmgKaW5kZXggMWMwMTdiMi4uNGVkZTllMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9kbWEuaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2RtYS5oCkBAIC00MDEsMzMgKzQwMSw2IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLS8qIEhhcmR3YXJlIHJlZ2lzdGVycyBmb3IgTENEIERNQSAqLwotI2RlZmluZSBPTUFQMTUxMF9ETUFfTENEX0JBU0UJCSgweGZmZmVkYjAwKQotI2RlZmluZSBPTUFQMTUxMF9ETUFfTENEX0NUUkwJCShPTUFQMTUxMF9ETUFfTENEX0JBU0UgKyAweDAwKQotI2RlZmluZSBPTUFQMTUxMF9ETUFfTENEX1RPUF9GMV9MCShPTUFQMTUxMF9ETUFfTENEX0JBU0UgKyAweDAyKQotI2RlZmluZSBPTUFQMTUxMF9ETUFfTENEX1RPUF9GMV9VCShPTUFQMTUxMF9ETUFfTENEX0JBU0UgKyAweDA0KQotI2RlZmluZSBPTUFQMTUxMF9ETUFfTENEX0JPVF9GMV9MCShPTUFQMTUxMF9ETUFfTENEX0JBU0UgKyAweDA2KQotI2RlZmluZSBPTUFQMTUxMF9ETUFfTENEX0JPVF9GMV9VCShPTUFQMTUxMF9ETUFfTENEX0JBU0UgKyAweDA4KQotCi0jZGVmaW5lIE9NQVAxNjEwX0RNQV9MQ0RfQkFTRQkJKDB4ZmZmZWUzMDApCi0jZGVmaW5lIE9NQVAxNjEwX0RNQV9MQ0RfQ1NEUAkJKE9NQVAxNjEwX0RNQV9MQ0RfQkFTRSArIDB4YzApCi0jZGVmaW5lIE9NQVAxNjEwX0RNQV9MQ0RfQ0NSCQkoT01BUDE2MTBfRE1BX0xDRF9CQVNFICsgMHhjMikKLSNkZWZpbmUgT01BUDE2MTBfRE1BX0xDRF9DVFJMCQkoT01BUDE2MTBfRE1BX0xDRF9CQVNFICsgMHhjNCkKLSNkZWZpbmUgT01BUDE2MTBfRE1BX0xDRF9UT1BfQjFfTAkoT01BUDE2MTBfRE1BX0xDRF9CQVNFICsgMHhjOCkKLSNkZWZpbmUgT01BUDE2MTBfRE1BX0xDRF9UT1BfQjFfVQkoT01BUDE2MTBfRE1BX0xDRF9CQVNFICsgMHhjYSkKLSNkZWZpbmUgT01BUDE2MTBfRE1BX0xDRF9CT1RfQjFfTAkoT01BUDE2MTBfRE1BX0xDRF9CQVNFICsgMHhjYykKLSNkZWZpbmUgT01BUDE2MTBfRE1BX0xDRF9CT1RfQjFfVQkoT01BUDE2MTBfRE1BX0xDRF9CQVNFICsgMHhjZSkKLSNkZWZpbmUgT01BUDE2MTBfRE1BX0xDRF9UT1BfQjJfTAkoT01BUDE2MTBfRE1BX0xDRF9CQVNFICsgMHhkMCkKLSNkZWZpbmUgT01BUDE2MTBfRE1BX0xDRF9UT1BfQjJfVQkoT01BUDE2MTBfRE1BX0xDRF9CQVNFICsgMHhkMikKLSNkZWZpbmUgT01BUDE2MTBfRE1BX0xDRF9CT1RfQjJfTAkoT01BUDE2MTBfRE1BX0xDRF9CQVNFICsgMHhkNCkKLSNkZWZpbmUgT01BUDE2MTBfRE1BX0xDRF9CT1RfQjJfVQkoT01BUDE2MTBfRE1BX0xDRF9CQVNFICsgMHhkNikKLSNkZWZpbmUgT01BUDE2MTBfRE1BX0xDRF9TUkNfRUlfQjEJKE9NQVAxNjEwX0RNQV9MQ0RfQkFTRSArIDB4ZDgpCi0jZGVmaW5lIE9NQVAxNjEwX0RNQV9MQ0RfU1JDX0ZJX0IxX0wJKE9NQVAxNjEwX0RNQV9MQ0RfQkFTRSArIDB4ZGEpCi0jZGVmaW5lIE9NQVAxNjEwX0RNQV9MQ0RfU1JDX0VOX0IxCShPTUFQMTYxMF9ETUFfTENEX0JBU0UgKyAweGUwKQotI2RlZmluZSBPTUFQMTYxMF9ETUFfTENEX1NSQ19GTl9CMQkoT01BUDE2MTBfRE1BX0xDRF9CQVNFICsgMHhlNCkKLSNkZWZpbmUgT01BUDE2MTBfRE1BX0xDRF9MQ0hfQ1RSTAkoT01BUDE2MTBfRE1BX0xDRF9CQVNFICsgMHhlYSkKLSNkZWZpbmUgT01BUDE2MTBfRE1BX0xDRF9TUkNfRklfQjFfVQkoT01BUDE2MTBfRE1BX0xDRF9CQVNFICsgMHhmNCkKLQogI2RlZmluZSBPTUFQMV9ETUFfVE9VVF9JUlEJCSgxIDw8IDApCiAjZGVmaW5lIE9NQVBfRE1BX0RST1BfSVJRCQkoMSA8PCAxKQogI2RlZmluZSBPTUFQX0RNQV9IQUxGX0lSUQkJKDEgPDwgMikKQEAgLTQ0MSw2ICs0MTQsOCBAQAogI2RlZmluZSBPTUFQMl9ETUFfU1VQRVJWSVNPUl9FUlJfSVJRCSgxIDw8IDEwKQogI2RlZmluZSBPTUFQMl9ETUFfTUlTQUxJR05FRF9FUlJfSVJRCSgxIDw8IDExKQogCisjZGVmaW5lIE9NQVBfRE1BX0NDUl9FTgkJCSgxIDw8IDcpCisKICNkZWZpbmUgT01BUF9ETUFfREFUQV9UWVBFX1M4CQkweDAwCiAjZGVmaW5lIE9NQVBfRE1BX0RBVEFfVFlQRV9TMTYJCTB4MDEKICNkZWZpbmUgT01BUF9ETUFfREFUQV9UWVBFX1MzMgkJMHgwMgpAQCAtNTAzLDE0ICs0NzgsNiBAQAogI2RlZmluZSBETUFfQ0hfUFJJT19ISUdICQkweDEKICNkZWZpbmUgRE1BX0NIX1BSSU9fTE9XCQkJMHgwIC8qIERlZiAqLwogCi0vKiBMQ0QgRE1BIGJsb2NrIG51bWJlcnMgKi8KLWVudW0gewotCU9NQVBfTENEX0RNQV9CMV9UT1AsCi0JT01BUF9MQ0RfRE1BX0IxX0JPVFRPTSwKLQlPTUFQX0xDRF9ETUFfQjJfVE9QLAotCU9NQVBfTENEX0RNQV9CMl9CT1RUT00KLX07Ci0KIGVudW0gb21hcF9kbWFfYnVyc3RfbW9kZSB7CiAJT01BUF9ETUFfREFUQV9CVVJTVF9ESVMgPSAwLAogCU9NQVBfRE1BX0RBVEFfQlVSU1RfNCwKQEAgLTY2MSwyMCArNjI4LDEzIEBACiBleHRlcm4gaW50IG9tYXBfZG1hX2NoYWluX3N0YXR1cyhpbnQgY2hhaW5faWQpOwogI2VuZGlmCiAKLS8qIExDRCBETUEgZnVuY3Rpb25zICovCi1leHRlcm4gaW50IG9tYXBfcmVxdWVzdF9sY2RfZG1hKHZvaWQgKCpjYWxsYmFjaykodTE2IHN0YXR1cywgdm9pZCAqZGF0YSksCi0JCQkJdm9pZCAqZGF0YSk7Ci1leHRlcm4gdm9pZCBvbWFwX2ZyZWVfbGNkX2RtYSh2b2lkKTsKLWV4dGVybiB2b2lkIG9tYXBfc2V0dXBfbGNkX2RtYSh2b2lkKTsKLWV4dGVybiB2b2lkIG9tYXBfZW5hYmxlX2xjZF9kbWEodm9pZCk7Ci1leHRlcm4gdm9pZCBvbWFwX3N0b3BfbGNkX2RtYSh2b2lkKTsKLWV4dGVybiB2b2lkIG9tYXBfc2V0X2xjZF9kbWFfZXh0X2NvbnRyb2xsZXIoaW50IGV4dGVybmFsKTsKLWV4dGVybiB2b2lkIG9tYXBfc2V0X2xjZF9kbWFfc2luZ2xlX3RyYW5zZmVyKGludCBzaW5nbGUpOwotZXh0ZXJuIHZvaWQgb21hcF9zZXRfbGNkX2RtYV9iMSh1bnNpZ25lZCBsb25nIGFkZHIsIHUxNiBmYl94cmVzLCB1MTYgZmJfeXJlcywKLQkJCQlpbnQgZGF0YV90eXBlKTsKLWV4dGVybiB2b2lkIG9tYXBfc2V0X2xjZF9kbWFfYjFfcm90YXRpb24oaW50IHJvdGF0ZSk7Ci1leHRlcm4gdm9pZCBvbWFwX3NldF9sY2RfZG1hX2IxX3Z4cmVzKHVuc2lnbmVkIGxvbmcgdnhyZXMpOwotZXh0ZXJuIHZvaWQgb21hcF9zZXRfbGNkX2RtYV9iMV9taXJyb3IoaW50IG1pcnJvcik7Ci1leHRlcm4gdm9pZCBvbWFwX3NldF9sY2RfZG1hX2IxX3NjYWxlKHVuc2lnbmVkIGludCB4c2NhbGUsIHVuc2lnbmVkIGludCB5c2NhbGUpOworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDEpICYmIGRlZmluZWQoQ09ORklHX0ZCX09NQVApCisjaW5jbHVkZSA8bWFjaC9sY2RfZG1hLmg+CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgb21hcF9sY2RfZG1hX3J1bm5pbmcodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgogCiAjZW5kaWYgLyogX19BU01fQVJDSF9ETUFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9ncG1jLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2dwbWMuaAppbmRleCA2OTZlMGNhLi5lMDgxMzM4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2dwbWMuaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2dwbWMuaApAQCAtNDUsNyArNDUsNyBAQAogI2RlZmluZSBHUE1DX0NPTkZJRzFfREVWSUNFU0laRV8xNiAgICAgIEdQTUNfQ09ORklHMV9ERVZJQ0VTSVpFKDEpCiAjZGVmaW5lIEdQTUNfQ09ORklHMV9ERVZJQ0VUWVBFKHZhbCkgICAgKCh2YWwgJiAzKSA8PCAxMCkKICNkZWZpbmUgR1BNQ19DT05GSUcxX0RFVklDRVRZUEVfTk9SICAgICBHUE1DX0NPTkZJRzFfREVWSUNFVFlQRSgwKQotI2RlZmluZSBHUE1DX0NPTkZJRzFfREVWSUNFVFlQRV9OQU5EICAgIEdQTUNfQ09ORklHMV9ERVZJQ0VUWVBFKDEpCisjZGVmaW5lIEdQTUNfQ09ORklHMV9ERVZJQ0VUWVBFX05BTkQgICAgR1BNQ19DT05GSUcxX0RFVklDRVRZUEUoMikKICNkZWZpbmUgR1BNQ19DT05GSUcxX01VWEFERERBVEEgICAgICAgICAoMSA8PCA5KQogI2RlZmluZSBHUE1DX0NPTkZJRzFfVElNRV9QQVJBX0dSQU4gICAgICgxIDw8IDQpCiAjZGVmaW5lIEdQTUNfQ09ORklHMV9GQ0xLX0RJVih2YWwpICAgICAgKHZhbCAmIDMpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2kyYy5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9pMmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODVkOWNhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9pMmMuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogSGVscGVyIG1vZHVsZSBmb3IgYm9hcmQgc3BlY2lmaWMgSTJDIGJ1cyByZWdpc3RyYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTm9raWEgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19JMkNfT01BUCkgfHwgZGVmaW5lZChDT05GSUdfSTJDX09NQVBfTU9EVUxFKQorZXh0ZXJuIGludCBvbWFwX3JlZ2lzdGVyX2kyY19idXMoaW50IGJ1c19pZCwgdTMyIGNsa3JhdGUsCisJCQkJIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBjb25zdCAqaW5mbywKKwkJCQkgdW5zaWduZWQgbGVuKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBvbWFwX3JlZ2lzdGVyX2kyY19idXMoaW50IGJ1c19pZCwgdTMyIGNsa3JhdGUsCisJCQkJIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBjb25zdCAqaW5mbywKKwkJCQkgdW5zaWduZWQgbGVuKQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKK2ludCBvbWFwX3BsYXRfcmVnaXN0ZXJfaTJjX2J1cyhpbnQgYnVzX2lkLCB1MzIgY2xrcmF0ZSwKKwkJCQkgc3RydWN0IGkyY19ib2FyZF9pbmZvIGNvbnN0ICppbmZvLAorCQkJCSB1bnNpZ25lZCBsZW4pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9pcnFzLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2lycXMuaAppbmRleCBjZTVkZDJkLi45N2Q2YzUwYzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvaXJxcy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvaXJxcy5oCkBAIC00NzIsOCArNDcyLDIyIEBACiAjZW5kaWYKICNkZWZpbmUgVFdMNDAzMF9HUElPX0lSUV9FTkQJKFRXTDQwMzBfR1BJT19JUlFfQkFTRSArIFRXTDQwMzBfR1BJT19OUl9JUlFTKQogCisjZGVmaW5lCVRXTDYwMzBfSVJRX0JBU0UJKE9NQVBfRlBHQV9JUlFfRU5EKQorI2lmZGVmIENPTkZJR19UV0w0MDMwX0NPUkUKKyNkZWZpbmUJVFdMNjAzMF9CQVNFX05SX0lSUVMJMjAKKyNlbHNlCisjZGVmaW5lCVRXTDYwMzBfQkFTRV9OUl9JUlFTCTAKKyNlbmRpZgorI2RlZmluZSBUV0w2MDMwX0lSUV9FTkQJCShUV0w2MDMwX0lSUV9CQVNFICsgVFdMNjAzMF9CQVNFX05SX0lSUVMpCisKIC8qIFRvdGFsIG51bWJlciBvZiBpbnRlcnJ1cHRzIGRlcGVuZHMgb24gdGhlIGVuYWJsZWQgYmxvY2tzIGFib3ZlICovCi0jZGVmaW5lIE5SX0lSUVMJCQlUV0w0MDMwX0dQSU9fSVJRX0VORAorI2lmIChUV0w0MDMwX0dQSU9fSVJRX0VORCA+IFRXTDYwMzBfSVJRX0VORCkKKyNkZWZpbmUgVFdMX0lSUV9FTkQgCQlUV0w0MDMwX0dQSU9fSVJRX0VORAorI2Vsc2UKKyNkZWZpbmUgVFdMX0lSUV9FTkQJCVRXTDYwMzBfSVJRX0VORAorI2VuZGlmCisKKyNkZWZpbmUgTlJfSVJRUwkJCVRXTF9JUlFfRU5ECiAKICNkZWZpbmUgT01BUF9JUlFfQklUKGlycSkJKDEgPDwgKChpcnEpICUgMzIpKQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L211eC5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9tdXguaAppbmRleCBiYTc3ZGU2Li44ZjA2OWNjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L211eC5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvbXV4LmgKQEAgLTEzMCw1OCArMTMwLDExIEBACiAjZGVmaW5lIE9NQVAyX1BVTExfVVAJCSgxIDw8IDQpCiAjZGVmaW5lIE9NQVAyX0FMVEVMRUNUUklDQUxTRUwJKDEgPDwgNSkKIAotLyogMzR4eCBzcGVjaWZpYyBtdXggYml0IGRlZmluZXMgKi8KLSNkZWZpbmUgT01BUDNfSU5QVVRfRU4JCSgxIDw8IDgpCi0jZGVmaW5lIE9NQVAzX09GRl9FTgkJKDEgPDwgOSkKLSNkZWZpbmUgT01BUDNfT0ZGT1VUX0VOCQkoMSA8PCAxMCkKLSNkZWZpbmUgT01BUDNfT0ZGT1VUX1ZBTAkoMSA8PCAxMSkKLSNkZWZpbmUgT01BUDNfT0ZGX1BVTExfRU4JKDEgPDwgMTIpCi0jZGVmaW5lIE9NQVAzX09GRl9QVUxMX1VQCSgxIDw8IDEzKQotI2RlZmluZSBPTUFQM19XQUtFVVBfRU4JCSgxIDw8IDE0KQotCi0vKiAzNHh4IG11eCBtb2RlIG9wdGlvbnMgZm9yIGVhY2ggcGluLiBTZWUgVFJNIGZvciBvcHRpb25zICovCi0jZGVmaW5lCU9NQVAzNFhYX01VWF9NT0RFMAkwCi0jZGVmaW5lCU9NQVAzNFhYX01VWF9NT0RFMQkxCi0jZGVmaW5lCU9NQVAzNFhYX01VWF9NT0RFMgkyCi0jZGVmaW5lCU9NQVAzNFhYX01VWF9NT0RFMwkzCi0jZGVmaW5lCU9NQVAzNFhYX01VWF9NT0RFNAk0Ci0jZGVmaW5lCU9NQVAzNFhYX01VWF9NT0RFNQk1Ci0jZGVmaW5lCU9NQVAzNFhYX01VWF9NT0RFNgk2Ci0jZGVmaW5lCU9NQVAzNFhYX01VWF9NT0RFNwk3Ci0KLS8qIDM0eHggYWN0aXZlIHBpbiBzdGF0ZXMgKi8KLSNkZWZpbmUgT01BUDM0WFhfUElOX09VVFBVVAkJMAotI2RlZmluZSBPTUFQMzRYWF9QSU5fSU5QVVQJCU9NQVAzX0lOUFVUX0VOCi0jZGVmaW5lIE9NQVAzNFhYX1BJTl9JTlBVVF9QVUxMVVAJKE9NQVAyX1BVTExfRU5BIHwgT01BUDNfSU5QVVRfRU4gXAotCQkJCQkJfCBPTUFQMl9QVUxMX1VQKQotI2RlZmluZSBPTUFQMzRYWF9QSU5fSU5QVVRfUFVMTERPV04JKE9NQVAyX1BVTExfRU5BIHwgT01BUDNfSU5QVVRfRU4pCi0KLS8qIDM0eHggb2ZmIG1vZGUgc3RhdGVzICovCi0jZGVmaW5lIE9NQVAzNFhYX1BJTl9PRkZfTk9ORSAgICAgICAgICAgMAotI2RlZmluZSBPTUFQMzRYWF9QSU5fT0ZGX09VVFBVVF9ISUdICShPTUFQM19PRkZfRU4gfCBPTUFQM19PRkZPVVRfRU4gXAotCQkJCQkJfCBPTUFQM19PRkZPVVRfVkFMKQotI2RlZmluZSBPTUFQMzRYWF9QSU5fT0ZGX09VVFBVVF9MT1cJKE9NQVAzX09GRl9FTiB8IE9NQVAzX09GRk9VVF9FTikKLSNkZWZpbmUgT01BUDM0WFhfUElOX09GRl9JTlBVVF9QVUxMVVAJKE9NQVAzX09GRl9FTiB8IE9NQVAzX09GRl9QVUxMX0VOIFwKLQkJCQkJCXwgT01BUDNfT0ZGX1BVTExfVVApCi0jZGVmaW5lIE9NQVAzNFhYX1BJTl9PRkZfSU5QVVRfUFVMTERPV04JKE9NQVAzX09GRl9FTiB8IE9NQVAzX09GRl9QVUxMX0VOKQotI2RlZmluZSBPTUFQMzRYWF9QSU5fT0ZGX1dBS0VVUEVOQUJMRQlPTUFQM19XQUtFVVBfRU4KLQotI2RlZmluZSBNVVhfQ0ZHXzM0WFgoZGVzYywgcmVnX29mZnNldCwgbXV4X3ZhbHVlKSB7CQlcCi0JLm5hbWUJCT0gZGVzYywJCQkJCVwKLQkuZGVidWcJCT0gMCwJCQkJCVwKLQkubXV4X3JlZwk9IHJlZ19vZmZzZXQsCQkJCVwKLQkubXV4X3ZhbAk9IG11eF92YWx1ZQkJCQlcCi19LAotCiBzdHJ1Y3QgcGluX2NvbmZpZyB7CiAJY2hhciAJCQkqbmFtZTsKIAljb25zdCB1bnNpZ25lZCBpbnQgCW11eF9yZWc7CiAJdW5zaWduZWQgY2hhcgkJZGVidWc7CiAKLSNpZglkZWZpbmVkKENPTkZJR19BUkNIX09NQVAzNFhYKQotCXUxNgkJCW11eF92YWw7IC8qIFdha2UtdXAsIG9mZiBtb2RlLCBwdWxsLCBtdXggbW9kZSAqLwotI2VuZGlmCi0KICNpZglkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyNFhYKQogCWNvbnN0IHVuc2lnbmVkIGNoYXIgbWFza19vZmZzZXQ7CiAJY29uc3QgdW5zaWduZWQgY2hhciBtYXNrOwpAQCAtMjE5LDExICsxNzIsMTcgQEAKIAlBQTE3XzdYWF9VU0JfRE0sCiAJVzE2XzdYWF9VU0JfUFVfRU4sCiAJVzE3XzdYWF9VU0JfVkJVU0ksCisJVzE4XzdYWF9VU0JfRE1DS19PVVQsCisJVzE5XzdYWF9VU0JfRENSU1QsCiAKIAkvKiBNTUMgKi8KIAlNTUNfN1hYX0NNRCwKIAlNTUNfN1hYX0NMSywKIAlNTUNfN1hYX0RBVDAsCisKKwkvKiBJMkMgKi8KKwlJMkNfN1hYX1NDTCwKKwlJMkNfN1hYX1NEQSwKIH07CiAKIGVudW0gb21hcDF4eHhfaW5kZXggewpAQCAtNjgxLDE4MSArNjQwLDYgQEAKIAogfTsKIAotZW51bSBvbWFwMzR4eF9pbmRleCB7Ci0JLyogMzR4eCBJMkMgKi8KLQlLMjFfMzRYWF9JMkMxX1NDTCwKLQlKMjFfMzRYWF9JMkMxX1NEQSwKLQlBRjE1XzM0WFhfSTJDMl9TQ0wsCi0JQUUxNV8zNFhYX0kyQzJfU0RBLAotCUFGMTRfMzRYWF9JMkMzX1NDTCwKLQlBRzE0XzM0WFhfSTJDM19TREEsCi0JQUQyNl8zNFhYX0kyQzRfU0NMLAotCUFFMjZfMzRYWF9JMkM0X1NEQSwKLQotCS8qIFBIWSAtIEhTVVNCOiAxMi1waW4gVUxQSSBQSFk6IFBvcnQgMSovCi0JWThfMzQzMF9VU0IxSFNfUEhZX0NMSywKLQlZOV8zNDMwX1VTQjFIU19QSFlfU1RQLAotCUFBMTRfMzQzMF9VU0IxSFNfUEhZX0RJUiwKLQlBQTExXzM0MzBfVVNCMUhTX1BIWV9OWFQsCi0JVzEzXzM0MzBfVVNCMUhTX1BIWV9EQVRBMCwKLQlXMTJfMzQzMF9VU0IxSFNfUEhZX0RBVEExLAotCVcxMV8zNDMwX1VTQjFIU19QSFlfREFUQTIsCi0JWTExXzM0MzBfVVNCMUhTX1BIWV9EQVRBMywKLQlXOV8zNDMwX1VTQjFIU19QSFlfREFUQTQsCi0JWTEyXzM0MzBfVVNCMUhTX1BIWV9EQVRBNSwKLQlXOF8zNDMwX1VTQjFIU19QSFlfREFUQTYsCi0JWTEzXzM0MzBfVVNCMUhTX1BIWV9EQVRBNywKLQotCS8qIFBIWSAtIEhTVVNCOiAxMi1waW4gVUxQSSBQSFk6IFBvcnQgMiovCi0JQUE4XzM0MzBfVVNCMkhTX1BIWV9DTEssCi0JQUExMF8zNDMwX1VTQjJIU19QSFlfU1RQLAotCUFBOV8zNDMwX1VTQjJIU19QSFlfRElSLAotCUFCMTFfMzQzMF9VU0IySFNfUEhZX05YVCwKLQlBQjEwXzM0MzBfVVNCMkhTX1BIWV9EQVRBMCwKLQlBQjlfMzQzMF9VU0IySFNfUEhZX0RBVEExLAotCVczXzM0MzBfVVNCMkhTX1BIWV9EQVRBMiwKLQlUNF8zNDMwX1VTQjJIU19QSFlfREFUQTMsCi0JVDNfMzQzMF9VU0IySFNfUEhZX0RBVEE0LAotCVIzXzM0MzBfVVNCMkhTX1BIWV9EQVRBNSwKLQlSNF8zNDMwX1VTQjJIU19QSFlfREFUQTYsCi0JVDJfMzQzMF9VU0IySFNfUEhZX0RBVEE3LAotCi0KLQkvKiBUTEwgLSBIU1VTQjogMTItcGluIFRMTCBQb3J0IDEqLwotCVk4XzM0MzBfVVNCMUhTX1RMTF9DTEssCi0JWTlfMzQzMF9VU0IxSFNfVExMX1NUUCwKLQlBQTE0XzM0MzBfVVNCMUhTX1RMTF9ESVIsCi0JQUExMV8zNDMwX1VTQjFIU19UTExfTlhULAotCVcxM18zNDMwX1VTQjFIU19UTExfREFUQTAsCi0JVzEyXzM0MzBfVVNCMUhTX1RMTF9EQVRBMSwKLQlXMTFfMzQzMF9VU0IxSFNfVExMX0RBVEEyLAotCVkxMV8zNDMwX1VTQjFIU19UTExfREFUQTMsCi0JVzlfMzQzMF9VU0IxSFNfVExMX0RBVEE0LAotCVkxMl8zNDMwX1VTQjFIU19UTExfREFUQTUsCi0JVzhfMzQzMF9VU0IxSFNfVExMX0RBVEE2LAotCVkxM18zNDMwX1VTQjFIU19UTExfREFUQTcsCi0KLQkvKiBUTEwgLSBIU1VTQjogMTItcGluIFRMTCBQb3J0IDIqLwotCUFBOF8zNDMwX1VTQjJIU19UTExfQ0xLLAotCUFBMTBfMzQzMF9VU0IySFNfVExMX1NUUCwKLQlBQTlfMzQzMF9VU0IySFNfVExMX0RJUiwKLQlBQjExXzM0MzBfVVNCMkhTX1RMTF9OWFQsCi0JQUIxMF8zNDMwX1VTQjJIU19UTExfREFUQTAsCi0JQUI5XzM0MzBfVVNCMkhTX1RMTF9EQVRBMSwKLQlXM18zNDMwX1VTQjJIU19UTExfREFUQTIsCi0JVDRfMzQzMF9VU0IySFNfVExMX0RBVEEzLAotCVQzXzM0MzBfVVNCMkhTX1RMTF9EQVRBNCwKLQlSM18zNDMwX1VTQjJIU19UTExfREFUQTUsCi0JUjRfMzQzMF9VU0IySFNfVExMX0RBVEE2LAotCVQyXzM0MzBfVVNCMkhTX1RMTF9EQVRBNywKLQotCS8qIFRMTCAtIEhTVVNCOiAxMi1waW4gVExMIFBvcnQgMyovCi0JQUE2XzM0MzBfVVNCM0hTX1RMTF9DTEssCi0JQUIzXzM0MzBfVVNCM0hTX1RMTF9TVFAsCi0JQUEzXzM0MzBfVVNCM0hTX1RMTF9ESVIsCi0JWTNfMzQzMF9VU0IzSFNfVExMX05YVCwKLQlBQTVfMzQzMF9VU0IzSFNfVExMX0RBVEEwLAotCVk0XzM0MzBfVVNCM0hTX1RMTF9EQVRBMSwKLQlZNV8zNDMwX1VTQjNIU19UTExfREFUQTIsCi0JVzVfMzQzMF9VU0IzSFNfVExMX0RBVEEzLAotCUFCMTJfMzQzMF9VU0IzSFNfVExMX0RBVEE0LAotCUFCMTNfMzQzMF9VU0IzSFNfVExMX0RBVEE1LAotCUFBMTNfMzQzMF9VU0IzSFNfVExMX0RBVEE2LAotCUFBMTJfMzQzMF9VU0IzSFNfVExMX0RBVEE3LAotCi0JLyogUEhZIEZTVVNCOiBGUyBTZXJpYWwgZm9yIFBvcnQgMSAobXVsdGlwbGUgUEhZIG1vZGVzIHN1cHBvcnRlZCkgKi8KLQlBRjEwXzM0MzBfVVNCMUZTX1BIWV9NTTFfUlhEUCwKLQlBRzlfMzQzMF9VU0IxRlNfUEhZX01NMV9SWERNLAotCVcxM18zNDMwX1VTQjFGU19QSFlfTU0xX1JYUkNWLAotCVcxMl8zNDMwX1VTQjFGU19QSFlfTU0xX1RYU0UwLAotCVcxMV8zNDMwX1VTQjFGU19QSFlfTU0xX1RYREFULAotCVkxMV8zNDMwX1VTQjFGU19QSFlfTU0xX1RYRU5fTiwKLQotCS8qIFBIWSBGU1VTQjogRlMgU2VyaWFsIGZvciBQb3J0IDIgKG11bHRpcGxlIFBIWSBtb2RlcyBzdXBwb3J0ZWQpICovCi0JQUY3XzM0MzBfVVNCMkZTX1BIWV9NTTJfUlhEUCwKLQlBSDdfMzQzMF9VU0IyRlNfUEhZX01NMl9SWERNLAotCUFCMTBfMzQzMF9VU0IyRlNfUEhZX01NMl9SWFJDViwKLQlBQjlfMzQzMF9VU0IyRlNfUEhZX01NMl9UWFNFMCwKLQlXM18zNDMwX1VTQjJGU19QSFlfTU0yX1RYREFULAotCVQ0XzM0MzBfVVNCMkZTX1BIWV9NTTJfVFhFTl9OLAotCi0JLyogUEhZIEZTVVNCOiBGUyBTZXJpYWwgZm9yIFBvcnQgMyAobXVsdGlwbGUgUEhZIG1vZGVzIHN1cHBvcnRlZCkgKi8KLQlBSDNfMzQzMF9VU0IzRlNfUEhZX01NM19SWERQLAotCUFFM18zNDMwX1VTQjNGU19QSFlfTU0zX1JYRE0sCi0JQUQxXzM0MzBfVVNCM0ZTX1BIWV9NTTNfUlhSQ1YsCi0JQUUxXzM0MzBfVVNCM0ZTX1BIWV9NTTNfVFhTRTAsCi0JQUQyXzM0MzBfVVNCM0ZTX1BIWV9NTTNfVFhEQVQsCi0JQUMxXzM0MzBfVVNCM0ZTX1BIWV9NTTNfVFhFTl9OLAotCi0JLyogMzR4eCBHUElPCi0JICogIC0gbm9ybWFsbHkgdGhlc2UgYXJlIGJpZGlyZWN0aW9uYWwsIG5vIGludGVybmFsIHB1bGx1cC9wdWxsZG93bgotCSAqICAtICJfVVAiIHN1ZmZpeCAoR1BJTzNfVVApIGlmIGludGVybmFsIHB1bGx1cCBpcyBjb25maWd1cmVkCi0JICogIC0gIl9ET1dOIiBzdWZmaXggKEdQSU8zX0RPV04pIHdpdGggaW50ZXJuYWwgcHVsbGRvd24KLQkgKiAgLSAiX09VVCIgc3VmZml4IChHUElPM19PVVQpIGZvciBvdXRwdXQtb25seSBwaW5zICh1bmxpa2UgMjR4eCkKLQkgKi8KLQlBRjI2XzM0WFhfR1BJTzAsCi0JQUYyMl8zNFhYX0dQSU85LAotCUFHOV8zNFhYX0dQSU8yMywKLQlBSDhfMzRYWF9HUElPMjksCi0JVThfMzRYWF9HUElPNTRfT1VULAotCVU4XzM0WFhfR1BJTzU0X0RPV04sCi0JTDhfMzRYWF9HUElPNjMsCi0JRzI1XzM0WFhfR1BJTzg2X09VVCwKLQlBRzRfMzRYWF9HUElPMTM0X09VVCwKLQlBRjRfMzRYWF9HUElPMTM1X09VVCwKLQlBRTRfMzRYWF9HUElPMTM2X09VVCwKLQlBRjZfMzRYWF9HUElPMTQwX1VQLAotCUFFNl8zNFhYX0dQSU8xNDEsCi0JQUY1XzM0WFhfR1BJTzE0MiwKLQlBRTVfMzRYWF9HUElPMTQzLAotCUgxOV8zNFhYX0dQSU8xNjRfT1VULAotCUoyNV8zNFhYX0dQSU8xNzAsCi0KLQkvKiBPTUFQMyBTRFJDIENLRSBzaWduYWxzIHRvIFNEUi9ERFIgcmFtIGNoaXBzICovCi0JSDE2XzM0WFhfU0RSQ19DS0UwLAotCUgxN18zNFhYX1NEUkNfQ0tFMSwKLQotCS8qIE1NQzEgKi8KLQlOMjhfMzQzMF9NTUMxX0NMSywKLQlNMjdfMzQzMF9NTUMxX0NNRCwKLQlOMjdfMzQzMF9NTUMxX0RBVDAsCi0JTjI2XzM0MzBfTU1DMV9EQVQxLAotCU4yNV8zNDMwX01NQzFfREFUMiwKLQlQMjhfMzQzMF9NTUMxX0RBVDMsCi0JUDI3XzM0MzBfTU1DMV9EQVQ0LAotCVAyNl8zNDMwX01NQzFfREFUNSwKLQlSMjdfMzQzMF9NTUMxX0RBVDYsCi0JUjI1XzM0MzBfTU1DMV9EQVQ3LAotCi0JLyogTU1DMiAqLwotCUFFMl8zNDMwX01NQzJfQ0xLLAotCUFHNV8zNDMwX01NQzJfQ01ELAotCUFINV8zNDMwX01NQzJfREFUMCwKLQlBSDRfMzQzMF9NTUMyX0RBVDEsCi0JQUc0XzM0MzBfTU1DMl9EQVQyLAotCUFGNF8zNDMwX01NQzJfREFUMywKLQlBRTRfMzQzMF9NTUMyX0RBVDQsCi0JQUgzXzM0MzBfTU1DMl9EQVQ1LAotCUFGM18zNDMwX01NQzJfREFUNiwKLQlBRTNfMzQzMF9NTUMyX0RBVDcsCi0KLQkvKiBNTUMzICovCi0JQUYxMF8zNDMwX01NQzNfQ0xLLAotCUFDM18zNDMwX01NQzNfQ01ELAotCUFFMTFfMzQzMF9NTUMzX0RBVDAsCi0JQUg5XzM0MzBfTU1DM19EQVQxLAotCUFGMTNfMzQzMF9NTUMzX0RBVDIsCi0JQUYxM18zNDMwX01NQzNfREFUMywKLQotCS8qIFNZU19OSVJRIFQyIElOVDEgKi8KLQlBRjI2XzM0WFhfU1lTX05JUlEsCi0KLQkvKiBFSENJIEdQSU8ncyBmb3IgT01BUDNFVk0gKFJldiA+PSBFKSAqLwotCUFIMTRfMzRYWF9HUElPMjEsCi0JQUY5XzM0WFhfR1BJTzIyLAotCVUzXzM0WFhfR1BJTzYxLAotfTsKLQogc3RydWN0IG9tYXBfbXV4X2NmZyB7CiAJc3RydWN0IHBpbl9jb25maWcJKnBpbnM7CiAJdW5zaWduZWQgbG9uZwkJc2l6ZTsKQEAgLTg2NSwxNCArNjQ5LDE0IEBACiAjaWZkZWYJQ09ORklHX09NQVBfTVVYCiAvKiBzZXR1cCBwaW4gbXV4aW5nIGluIExpbnV4ICovCiBleHRlcm4gaW50IG9tYXAxX211eF9pbml0KHZvaWQpOwotZXh0ZXJuIGludCBvbWFwMl9tdXhfaW5pdCh2b2lkKTsKIGV4dGVybiBpbnQgb21hcF9tdXhfcmVnaXN0ZXIoc3RydWN0IG9tYXBfbXV4X2NmZyAqKTsKIGV4dGVybiBpbnQgb21hcF9jZmdfcmVnKHVuc2lnbmVkIGxvbmcgcmVnX2NmZyk7CiAjZWxzZQogLyogYm9vdCBsb2FkZXIgZG9lcyBpdCBhbGwgKG5vIHdhcm5pbmdzIGZyb20gQ09ORklHX09NQVBfTVVYX1dBUk5JTkdTKSAqLwogc3RhdGljIGlubGluZSBpbnQgb21hcDFfbXV4X2luaXQodm9pZCkgeyByZXR1cm4gMDsgfQotc3RhdGljIGlubGluZSBpbnQgb21hcDJfbXV4X2luaXQodm9pZCkgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSBpbnQgb21hcF9jZmdfcmVnKHVuc2lnbmVkIGxvbmcgcmVnX2NmZykgeyByZXR1cm4gMDsgfQogI2VuZGlmCiAKK2V4dGVybiBpbnQgb21hcDJfbXV4X2luaXQodm9pZCk7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9vbWFwNDR4eC5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9vbWFwNDR4eC5oCmluZGV4IGU1MjkwMmEuLmVmODcwZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvb21hcDQ0eHguaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L29tYXA0NHh4LmgKQEAgLTI2LDggKzI2LDEwIEBACiAjZGVmaW5lIE9NQVA0NFhYX0VNSUYyX0JBU0UJCTB4NGQwMDAwMDAKICNkZWZpbmUgT01BUDQ0WFhfRE1NX0JBU0UJCTB4NGUwMDAwMDAKICNkZWZpbmUgT01BUDQ0MzBfMzJLU1lOQ1RfQkFTRQkJMHg0YTMwNDAwMAotI2RlZmluZSBPTUFQNDQzMF9DTV9CQVNFCQkweDRhMDA0MDAwCi0jZGVmaW5lIE9NQVA0NDMwX1BSTV9CQVNFCQkweDQ4MzA2MDAwCisjZGVmaW5lIE9NQVA0NDMwX0NNMV9CQVNFCQkweDRhMDA0MDAwCisjZGVmaW5lIE9NQVA0NDMwX0NNX0JBU0UJCU9NQVA0NDMwX0NNMV9CQVNFCisjZGVmaW5lIE9NQVA0NDMwX0NNMl9CQVNFCQkweDRhMDA4MDAwCisjZGVmaW5lIE9NQVA0NDMwX1BSTV9CQVNFCQkweDRhMzA2MDAwCiAjZGVmaW5lIE9NQVA0NFhYX0dQTUNfQkFTRQkJMHg1MDAwMDAwMAogI2RlZmluZSBPTUFQNDQzWF9TQ01fQkFTRQkJMHg0YTAwMjAwMAogI2RlZmluZSBPTUFQNDQzWF9DVFJMX0JBU0UJCU9NQVA0NDNYX1NDTV9CQVNFCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L29tYXBfZGV2aWNlLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L29tYXBfZGV2aWNlLmgKaW5kZXggMTFhOTc3My4uZGMxZmFjMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9vbWFwX2RldmljZS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvb21hcF9kZXZpY2UuaApAQCAtNTAsOCArNTAsOCBAQAogICogQHBtX2xhdHM6IHB0ciB0byBhbiBvbWFwX2RldmljZV9wbV9sYXRlbmN5IHRhYmxlCiAgKiBAcG1fbGF0c19jbnQ6IEFSUkFZX1NJWkUoKSBvZiB3aGF0IGlzIHBhc3NlZCB0byBAcG1fbGF0cwogICogQHBtX2xhdF9sZXZlbDogYXJyYXkgaW5kZXggb2YgdGhlIGxhc3Qgb2RwbCBlbnRyeSBleGVjdXRlZCAtIC0xIGlmIG5ldmVyCi0gKiBAZGV2X3dha2V1cF9sYXQ6IGRldiB3YWtldXAgbGF0ZW5jeSBpbiBtaWNyb3NlY29uZHMKLSAqIEBfZGV2X3dha2V1cF9sYXRfbGltaXQ6IGRldiB3YWtldXAgbGF0ZW5jeSBsaW1pdCBpbiB1c2VjIC0gc2V0IGJ5IE9NQVAgUE0KKyAqIEBkZXZfd2FrZXVwX2xhdDogZGV2IHdha2V1cCBsYXRlbmN5IGluIG5hbm9zZWNvbmRzCisgKiBAX2Rldl93YWtldXBfbGF0X2xpbWl0OiBkZXYgd2FrZXVwIGxhdGVuY3kgbGltaXQgaW4gbnNlYyAtIHNldCBieSBPTUFQIFBNCiAgKiBAX3N0YXRlOiBvbmUgb2YgT01BUF9ERVZJQ0VfU1RBVEVfKiAoc2VlIGFib3ZlKQogICogQGZsYWdzOiBkZXZpY2UgZmxhZ3MKICAqCkBAIC0xMzcsNSArMTM3LDcgQEAKIH07CiAKIAotI2VuZGlmCisvKiBHZXQgb21hcF9kZXZpY2UgcG9pbnRlciBmcm9tIHBsYXRmb3JtX2RldmljZSBwb2ludGVyICovCisjZGVmaW5lIHRvX29tYXBfZGV2aWNlKHgpIGNvbnRhaW5lcl9vZigoeCksIHN0cnVjdCBvbWFwX2RldmljZSwgcGRldikKIAorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L29tYXBfaHdtb2QuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvb21hcF9od21vZC5oCmluZGV4IGRiZGQxMjMuLjAwNzkzNWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvb21hcF9od21vZC5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvb21hcF9od21vZC5oCkBAIC01MCw2ICs1MCw4IEBACiAjZGVmaW5lIFNZU0NfRU5BV0FLRVVQX01BU0sJCSgxIDw8IFNZU0NfRU5BV0FLRVVQX1NISUZUKQogI2RlZmluZSBTWVNDX1NPRlRSRVNFVF9TSElGVAkJMQogI2RlZmluZSBTWVNDX1NPRlRSRVNFVF9NQVNLCQkoMSA8PCBTWVNDX1NPRlRSRVNFVF9TSElGVCkKKyNkZWZpbmUgU1lTQ19BVVRPSURMRV9TSElGVAkJMAorI2RlZmluZSBTWVNDX0FVVE9JRExFX01BU0sJCSgxIDw8IFNZU0NfQVVUT0lETEVfU0hJRlQpCiAKIC8qIE9DUCBTWVNTVEFUVVMgYml0IHNoaWZ0cy9tYXNrcyAqLwogI2RlZmluZSBTWVNTX1JFU0VURE9ORV9TSElGVAkJMApAQCAtNjIsNyArNjQsMjEgQEAKIAogCiAvKioKLSAqIHN0cnVjdCBvbWFwX2h3bW9kX2RtYV9pbmZvIC0gTVBVIGFkZHJlc3Mgc3BhY2UgaGFuZGxlZCBieSB0aGUgaHdtb2QKKyAqIHN0cnVjdCBvbWFwX2h3bW9kX2lycV9pbmZvIC0gTVBVIElSUXMgdXNlZCBieSB0aGUgaHdtb2QKKyAqIEBuYW1lOiBuYW1lIG9mIHRoZSBJUlEgY2hhbm5lbCAobW9kdWxlIGxvY2FsIG5hbWUpCisgKiBAaXJxX2NoOiBJUlEgY2hhbm5lbCBJRAorICoKKyAqIEBuYW1lIHNob3VsZCBiZSBzb21ldGhpbmcgc2hvcnQsIGUuZy4sICJ0eCIgb3IgInJ4Ii4gIEl0IGlzIGZvciB1c2UKKyAqIGJ5IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUoKS4gIEl0IGlzIGRlZmluZWQgbG9jYWxseSB0byB0aGUKKyAqIGh3bW9kLgorICovCitzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyB7CisJY29uc3QgY2hhcgkqbmFtZTsKKwl1MTYJCWlycTsKK307CisKKy8qKgorICogc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8gLSBETUEgY2hhbm5lbHMgdXNlZCBieSB0aGUgaHdtb2QKICAqIEBuYW1lOiBuYW1lIG9mIHRoZSBETUEgY2hhbm5lbCAobW9kdWxlIGxvY2FsIG5hbWUpCiAgKiBAZG1hX2NoOiBETUEgY2hhbm5lbCBJRAogICoKQEAgLTI5NCwxMyArMzEwLDE3IEBACiAgKiAgICAgU0RSQU0gY29udHJvbGxlciwgZXRjLgogICogSFdNT0RfSU5JVF9OT19JRExFOiBkb24ndCBpZGxlIHRoaXMgbW9kdWxlIGF0IGJvb3QgLSBpbXBvcnRhbnQgZm9yIFNEUkFNCiAgKiAgICAgY29udHJvbGxlciwgZXRjLgorICogSFdNT0RfTk9fQVVUT0lETEU6IGRpc2FibGUgbW9kdWxlIGF1dG9pZGxlIChPQ1BfU1lTQ09ORklHLkFVVE9JRExFKQorICogICAgIHdoZW4gbW9kdWxlIGlzIGVuYWJsZWQsIHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0LCB3aGljaCBpcyB0bworICogICAgIGVuYWJsZSBhdXRvaWRsZQogICogSFdNT0RfU0VUX0RFRkFVTFRfQ0xPQ0tBQ1Q6IHByb2dyYW0gQ0xPQ0tBQ1RJVklUWSBiaXRzIGF0IHN0YXJ0dXAKICAqLwogI2RlZmluZSBIV01PRF9TV1NVUF9TSURMRQkJCSgxIDw8IDApCiAjZGVmaW5lIEhXTU9EX1NXU1VQX01TVEFOREJZCQkJKDEgPDwgMSkKICNkZWZpbmUgSFdNT0RfSU5JVF9OT19SRVNFVAkJCSgxIDw8IDIpCiAjZGVmaW5lIEhXTU9EX0lOSVRfTk9fSURMRQkJCSgxIDw8IDMpCi0jZGVmaW5lIEhXTU9EX1NFVF9ERUZBVUxUX0NMT0NLQUNUCQkoMSA8PCA0KQorI2RlZmluZSBIV01PRF9OT19PQ1BfQVVUT0lETEUJCQkoMSA8PCA0KQorI2RlZmluZSBIV01PRF9TRVRfREVGQVVMVF9DTE9DS0FDVAkJKDEgPDwgNSkKIAogLyoKICAqIG9tYXBfaHdtb2QuX2ludF9mbGFncyBkZWZpbml0aW9ucwpAQCAtMzczLDcgKzM5Myw3IEBACiBzdHJ1Y3Qgb21hcF9od21vZCB7CiAJY29uc3QgY2hhcgkJCSpuYW1lOwogCXN0cnVjdCBvbWFwX2RldmljZQkJKm9kOwotCXU4CQkJCSptcHVfaXJxczsKKwlzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbwkqbXB1X2lycXM7CiAJc3RydWN0IG9tYXBfaHdtb2RfZG1hX2luZm8JKnNkbWFfY2hzOwogCXVuaW9uIHsKIAkJc3RydWN0IG9tYXBfaHdtb2Rfb21hcDJfcHJjbSBvbWFwMjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvcG93ZXJkb21haW4uaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvcG93ZXJkb21haW4uaAppbmRleCAzZDQ1ZWUxLi4wYjk2MDA1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L3Bvd2VyZG9tYWluLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9wb3dlcmRvbWFpbi5oCkBAIC0yOCw2ICsyOCw4IEBACiAjZGVmaW5lIFBXUkRNX1BPV0VSX0lOQUNUSVZFCTB4MgogI2RlZmluZSBQV1JETV9QT1dFUl9PTgkJMHgzCiAKKyNkZWZpbmUgUFdSRE1fTUFYX1BXUlNUUwk0CisKIC8qIFBvd2VyZG9tYWluIGFsbG93YWJsZSBzdGF0ZSBiaXRmaWVsZHMgKi8KICNkZWZpbmUgUFdSU1RTX09GRl9PTgkJKCgxIDw8IFBXUkRNX1BPV0VSX09GRikgfCBcCiAJCQkJICgxIDw8IFBXUkRNX1BPV0VSX09OKSkKQEAgLTQwLDcgKzQyLDEwIEBACiAKIC8qIFBvd2VyZG9tYWluIGZsYWdzICovCiAjZGVmaW5lIFBXUkRNX0hBU19IRFdSX1NBUgkoMSA8PCAwKSAvKiBoYXJkd2FyZSBzYXZlLWFuZC1yZXN0b3JlIHN1cHBvcnQgKi8KLQorI2RlZmluZSBQV1JETV9IQVNfTVBVX1FVSVJLCSgxIDw8IDEpIC8qIE1QVSBwd3IgZG9tYWluIGhhcyBNRU0gYmFuayAwIGJpdHMKKwkJCQkJICAqIGluIE1FTSBiYW5rIDEgcG9zaXRpb24uIFRoaXMgaXMKKwkJCQkJICAqIHRydWUgZm9yIE9NQVAzNDMwCisJCQkJCSAgKi8KIAogLyoKICAqIE51bWJlciBvZiBtZW1vcnkgYmFua3MgdGhhdCBhcmUgcG93ZXItY29udHJvbGxhYmxlLglPbiBPTUFQMzQzMCwgdGhlCkBAIC04NSwxNSArOTAsMTUgQEAKIAkvKiBVc2VkIHRvIHJlcHJlc2VudCB0aGUgT01BUCBjaGlwIHR5cGVzIGNvbnRhaW5pbmcgdGhpcyBwd3JkbSAqLwogCWNvbnN0IHN0cnVjdCBvbWFwX2NoaXBfaWQgb21hcF9jaGlwOwogCi0JLyogQml0IHNoaWZ0IG9mIHRoaXMgcG93ZXJkb21haW4ncyBQTV9XS0RFUC9DTV9TTEVFUERFUCBiaXQgKi8KLQljb25zdCB1OCBkZXBfYml0OwotCiAJLyogUG93ZXJkb21haW5zIHRoYXQgY2FuIGJlIHRvbGQgdG8gd2FrZSB0aGlzIHBvd2VyZG9tYWluIHVwICovCiAJc3RydWN0IHB3cmRtX2RlcCAqd2tkZXBfc3JjczsKIAogCS8qIFBvd2VyZG9tYWlucyB0aGF0IGNhbiBiZSB0b2xkIHRvIGtlZXAgdGhpcyBwd3JkbSBmcm9tIGluYWN0aXZpdHkgKi8KIAlzdHJ1Y3QgcHdyZG1fZGVwICpzbGVlcGRlcF9zcmNzOwogCisJLyogQml0IHNoaWZ0IG9mIHRoaXMgcG93ZXJkb21haW4ncyBQTV9XS0RFUC9DTV9TTEVFUERFUCBiaXQgKi8KKwljb25zdCB1OCBkZXBfYml0OworCiAJLyogUG9zc2libGUgcG93ZXJkb21haW4gcG93ZXIgc3RhdGVzICovCiAJY29uc3QgdTggcHdyc3RzOwogCkBAIC0xMTgsMTEgKzEyMywxMSBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKIAogCWludCBzdGF0ZTsKLQl1bnNpZ25lZCBzdGF0ZV9jb3VudGVyWzRdOworCXVuc2lnbmVkIHN0YXRlX2NvdW50ZXJbUFdSRE1fTUFYX1BXUlNUU107CiAKICNpZmRlZiBDT05GSUdfUE1fREVCVUcKIAlzNjQgdGltZXI7Ci0JczY0IHN0YXRlX3RpbWVyWzRdOworCXM2NCBzdGF0ZV90aW1lcltQV1JETV9NQVhfUFdSU1RTXTsKICNlbmRpZgogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9zZXJpYWwuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvc2VyaWFsLmgKaW5kZXggOTk1MTM0NS4uZjVhNGE5MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9zZXJpYWwuaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L3NlcmlhbC5oCkBAIC01Myw2ICs1Myw3IEBACiAjaWZuZGVmIF9fQVNTRU1CTEVSX18KIGV4dGVybiB2b2lkIF9faW5pdCBvbWFwX3NlcmlhbF9lYXJseV9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgb21hcF9zZXJpYWxfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIG9tYXBfc2VyaWFsX2luaXRfcG9ydChpbnQgcG9ydCk7CiBleHRlcm4gaW50IG9tYXBfdWFydF9jYW5fc2xlZXAodm9pZCk7CiBleHRlcm4gdm9pZCBvbWFwX3VhcnRfY2hlY2tfd2FrZXVwKHZvaWQpOwogZXh0ZXJuIHZvaWQgb21hcF91YXJ0X3ByZXBhcmVfc3VzcGVuZCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvc21wLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L3NtcC5oCmluZGV4IGRjYWE4ZmQuLjg5ODNkNTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvc21wLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9zbXAuaApAQCAtMjgsNiArMjgsOCBAQAogCiAvKiBOZWVkZWQgZm9yIHNlY29uZGFyeSBjb3JlIGJvb3QgKi8KIGV4dGVybiB2b2lkIG9tYXBfc2Vjb25kYXJ5X3N0YXJ0dXAodm9pZCk7CitleHRlcm4gdTMyIG9tYXBfbW9kaWZ5X2F1eGNvcmVib290MCh1MzIgc2V0X21hc2ssIHUzMiBjbGVhcl9tYXNrKTsKK2V4dGVybiB2b2lkIG9tYXBfYXV4Y29yZWJvb3RfYWRkcih1MzIgY3B1X2FkZHIpOwogCiAvKgogICogV2UgdXNlIFNvZnQgSVJRMSBhcyB0aGUgSVBJCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvbXV4LmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvbXV4LmMKaW5kZXggMDVhZWJjYS4uMDY3MDM2MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL211eC5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9tdXguYwpAQCAtNTQsOCArNTQsMTIgQEAKIHsKIAlzdHJ1Y3QgcGluX2NvbmZpZyAqcmVnOwogCi0JaWYgKGNwdV9pc19vbWFwNDR4eCgpKQotCQlyZXR1cm4gMDsKKwlpZiAoY3B1X2lzX29tYXAzNHh4KCkgfHwgY3B1X2lzX29tYXA0NHh4KCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtdXg6IEJyb2tlbiBvbWFwX2NmZ19yZWcoJWx1KSBlbnRyeVxuIiwKKwkJCQlpbmRleCk7CisJCVdBUk5fT04oMSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCWlmIChtdXhfY2ZnID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJQaW4gbXV4IHRhYmxlIG5vdCBpbml0aWFsaXplZFxuIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvb21hcF9kZXZpY2UuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9vbWFwX2RldmljZS5jCmluZGV4IGJiMTZlNjIuLjFlNTY0OGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9vbWFwX2RldmljZS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9vbWFwX2RldmljZS5jCkBAIC0xMzQsMTggKzEzNCwxOCBAQAogCQkgICAgKG9kLT5kZXZfd2FrZXVwX2xhdCA8PSBvZC0+X2Rldl93YWtldXBfbGF0X2xpbWl0KSkKIAkJCWJyZWFrOwogCi0JCWdldG5zdGltZW9mZGF5KCZhKTsKKwkJcmVhZF9wZXJzaXN0ZW50X2Nsb2NrKCZhKTsKIAogCQkvKiBYWFggY2hlY2sgcmV0dXJuIGNvZGUgKi8KIAkJb2RwbC0+YWN0aXZhdGVfZnVuYyhvZCk7CiAKLQkJZ2V0bnN0aW1lb2ZkYXkoJmIpOworCQlyZWFkX3BlcnNpc3RlbnRfY2xvY2soJmIpOwogCiAJCWMgPSB0aW1lc3BlY19zdWIoYiwgYSk7Ci0JCWFjdF9sYXQgPSB0aW1lc3BlY190b19ucygmYykgKiBOU0VDX1BFUl9VU0VDOworCQlhY3RfbGF0ID0gdGltZXNwZWNfdG9fbnMoJmMpOwogCiAJCXByX2RlYnVnKCJvbWFwX2RldmljZTogJXM6IHBtX2xhdCAlZDogYWN0aXZhdGU6IGVsYXBzZWQgdGltZSAiCi0JCQkgIiVsbHUgdXNlY1xuIiwgb2QtPnBkZXYubmFtZSwgb2QtPnBtX2xhdF9sZXZlbCwKKwkJCSAiJWxsdSBuc2VjXG4iLCBvZC0+cGRldi5uYW1lLCBvZC0+cG1fbGF0X2xldmVsLAogCQkJIGFjdF9sYXQpOwogCiAJCVdBUk4oYWN0X2xhdCA+IG9kcGwtPmFjdGl2YXRlX2xhdCwgIm9tYXBfZGV2aWNlOiAlcy4lZDogIgpAQCAtMTkwLDE4ICsxOTAsMTggQEAKIAkJICAgICBvZC0+X2Rldl93YWtldXBfbGF0X2xpbWl0KSkKIAkJCWJyZWFrOwogCi0JCWdldG5zdGltZW9mZGF5KCZhKTsKKwkJcmVhZF9wZXJzaXN0ZW50X2Nsb2NrKCZhKTsKIAogCQkvKiBYWFggY2hlY2sgcmV0dXJuIGNvZGUgKi8KIAkJb2RwbC0+ZGVhY3RpdmF0ZV9mdW5jKG9kKTsKIAotCQlnZXRuc3RpbWVvZmRheSgmYik7CisJCXJlYWRfcGVyc2lzdGVudF9jbG9jaygmYik7CiAKIAkJYyA9IHRpbWVzcGVjX3N1YihiLCBhKTsKLQkJZGVhY3RfbGF0ID0gdGltZXNwZWNfdG9fbnMoJmMpICogTlNFQ19QRVJfVVNFQzsKKwkJZGVhY3RfbGF0ID0gdGltZXNwZWNfdG9fbnMoJmMpOwogCiAJCXByX2RlYnVnKCJvbWFwX2RldmljZTogJXM6IHBtX2xhdCAlZDogZGVhY3RpdmF0ZTogZWxhcHNlZCB0aW1lICIKLQkJCSAiJWxsdSB1c2VjXG4iLCBvZC0+cGRldi5uYW1lLCBvZC0+cG1fbGF0X2xldmVsLAorCQkJICIlbGx1IG5zZWNcbiIsIG9kLT5wZGV2Lm5hbWUsIG9kLT5wbV9sYXRfbGV2ZWwsCiAJCQkgZGVhY3RfbGF0KTsKIAogCQlXQVJOKGRlYWN0X2xhdCA+IG9kcGwtPmRlYWN0aXZhdGVfbGF0LCAib21hcF9kZXZpY2U6ICVzLiVkOiAiCkBAIC00NTksNyArNDU5LDcgQEAKIAlyZXQgPSBfb21hcF9kZXZpY2VfYWN0aXZhdGUob2QsIElHTk9SRV9XQUtFVVBfTEFUKTsKIAogCW9kLT5kZXZfd2FrZXVwX2xhdCA9IDA7Ci0Jb2QtPl9kZXZfd2FrZXVwX2xhdF9saW1pdCA9IElOVF9NQVg7CisJb2QtPl9kZXZfd2FrZXVwX2xhdF9saW1pdCA9IFVJTlRfTUFYOwogCW9kLT5fc3RhdGUgPSBPTUFQX0RFVklDRV9TVEFURV9FTkFCTEVEOwogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS5jCmluZGV4IGFkMmJmMDcuLmQ4ZDUwOTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3NyYW0uYwpAQCAtNDgsOCArNDgsMTAgQEAKICNkZWZpbmUgT01BUDNfU1JBTV9WQSAgICAgICAgICAgMHhmZTQwMDAwMAogI2RlZmluZSBPTUFQM19TUkFNX1BVQl9QQSAgICAgICAweDQwMjA4MDAwCiAjZGVmaW5lIE9NQVAzX1NSQU1fUFVCX1ZBICAgICAgIChPTUFQM19TUkFNX1ZBICsgMHg4MDAwKQotI2RlZmluZSBPTUFQNF9TUkFNX1BBCQkweDQwMjAwMDAwCQkvKjB4NDAyZjAwMDAqLwotI2RlZmluZSBPTUFQNF9TUkFNX1ZBCQkweGZlNDAwMDAwCQkvKjB4ZmU0ZjAwMDAqLworI2RlZmluZSBPTUFQNF9TUkFNX1BBCQkweDQwMzAwMDAwCisjZGVmaW5lIE9NQVA0X1NSQU1fVkEJCTB4ZmU0MDAwMDAKKyNkZWZpbmUgT01BUDRfU1JBTV9QVUJfUEEJKE9NQVA0X1NSQU1fUEEgKyAweDQwMDApCisjZGVmaW5lIE9NQVA0X1NSQU1fUFVCX1ZBCShPTUFQNF9TUkFNX1ZBICsgMHg0MDAwKQogCiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMjRYWCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMzRYWCkKICNkZWZpbmUgU1JBTV9CT09UTE9BREVSX1NaCTB4MDAKQEAgLTE0MCw2ICsxNDIsMTAgQEAKIAkJCQl9IGVsc2UgewogCQkJCQlvbWFwX3NyYW1fc2l6ZSA9IDB4ODAwMDsgLyogMzJLICovCiAJCQkJfQorCQkJfSBlbHNlIGlmIChjcHVfaXNfb21hcDQ0eHgoKSkgeworCQkJCW9tYXBfc3JhbV9iYXNlID0gT01BUDRfU1JBTV9QVUJfVkE7CisJCQkJb21hcF9zcmFtX3N0YXJ0ID0gT01BUDRfU1JBTV9QVUJfUEE7CisJCQkJb21hcF9zcmFtX3NpemUgPSAweGEwMDA7IC8qIDQwSyAqLwogCQkJfSBlbHNlIHsKIAkJCQlvbWFwX3NyYW1fYmFzZSA9IE9NQVAyX1NSQU1fUFVCX1ZBOwogCQkJCW9tYXBfc3JhbV9zdGFydCA9IE9NQVAyX1NSQU1fUFVCX1BBOwpAQCAtMTUzLDcgKzE1OSw3IEBACiAJCQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwNDR4eCgpKSB7CiAJCQkJb21hcF9zcmFtX2Jhc2UgPSBPTUFQNF9TUkFNX1ZBOwogCQkJCW9tYXBfc3JhbV9zdGFydCA9IE9NQVA0X1NSQU1fUEE7Ci0JCQkJb21hcF9zcmFtX3NpemUgPSAweDgwMDA7IC8qIDMySyAqLworCQkJCW9tYXBfc3JhbV9zaXplID0gMHhlMDAwOyAvKiA1NksgKi8KIAkJCX0gZWxzZSB7CiAJCQkJb21hcF9zcmFtX2Jhc2UgPSBPTUFQMl9TUkFNX1ZBOwogCQkJCW9tYXBfc3JhbV9zdGFydCA9IE9NQVAyX1NSQU1fUEE7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvdXNiLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvdXNiLmMKaW5kZXggNTEwMzNhNC4uZDNiZjE3YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL3VzYi5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC91c2IuYwpAQCAtMTM3LDcgKzEzNywxMyBAQAogCWlmIChpc19kZXZpY2UpIHsKIAkJaWYgKGNwdV9pc19vbWFwMjR4eCgpKQogCQkJb21hcF9jZmdfcmVnKEoyMF8yNFhYX1VTQjBfUFVFTik7Ci0JCWVsc2UKKwkJZWxzZSBpZiAoY3B1X2lzX29tYXA3eHgoKSkgeworCQkJb21hcF9jZmdfcmVnKEFBMTdfN1hYX1VTQl9ETSk7CisJCQlvbWFwX2NmZ19yZWcoVzE2XzdYWF9VU0JfUFVfRU4pOworCQkJb21hcF9jZmdfcmVnKFcxN183WFhfVVNCX1ZCVVNJKTsKKwkJCW9tYXBfY2ZnX3JlZyhXMThfN1hYX1VTQl9ETUNLX09VVCk7CisJCQlvbWFwX2NmZ19yZWcoVzE5XzdYWF9VU0JfRENSU1QpOworCQl9IGVsc2UKIAkJCW9tYXBfY2ZnX3JlZyhXNF9VU0JfUFVFTik7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS92ZnAvdmZwbW9kdWxlLmMgYi9hcmNoL2FybS92ZnAvdmZwbW9kdWxlLmMKaW5kZXggMmQ3NDIzYS4uYWVkMDViYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vdmZwL3ZmcG1vZHVsZS5jCisrKyBiL2FyY2gvYXJtL3ZmcC92ZnBtb2R1bGUuYwpAQCAtMzgsMTYgKzM4LDcyIEBACiAgKi8KIHVuc2lnbmVkIGludCBWRlBfYXJjaDsKIAorLyoKKyAqIFBlci10aHJlYWQgVkZQIGluaXRpYWxpemF0aW9uLgorICovCitzdGF0aWMgdm9pZCB2ZnBfdGhyZWFkX2ZsdXNoKHN0cnVjdCB0aHJlYWRfaW5mbyAqdGhyZWFkKQoreworCXVuaW9uIHZmcF9zdGF0ZSAqdmZwID0gJnRocmVhZC0+dmZwc3RhdGU7CisJdW5zaWduZWQgaW50IGNwdTsKKworCW1lbXNldCh2ZnAsIDAsIHNpemVvZih1bmlvbiB2ZnBfc3RhdGUpKTsKKworCXZmcC0+aGFyZC5mcGV4YyA9IEZQRVhDX0VOOworCXZmcC0+aGFyZC5mcHNjciA9IEZQU0NSX1JPVU5EX05FQVJFU1Q7CisKKwkvKgorCSAqIERpc2FibGUgVkZQIHRvIGVuc3VyZSB3ZSBpbml0aWFsaXplIGl0IGZpcnN0LiAgV2UgbXVzdCBlbnN1cmUKKwkgKiB0aGF0IHRoZSBtb2RpZmljYXRpb24gb2YgbGFzdF9WRlBfY29udGV4dFtdIGFuZCBoYXJkd2FyZSBkaXNhYmxlCisJICogYXJlIGRvbmUgZm9yIHRoZSBzYW1lIENQVSBhbmQgd2l0aG91dCBwcmVlbXB0aW9uLgorCSAqLworCWNwdSA9IGdldF9jcHUoKTsKKwlpZiAobGFzdF9WRlBfY29udGV4dFtjcHVdID09IHZmcCkKKwkJbGFzdF9WRlBfY29udGV4dFtjcHVdID0gTlVMTDsKKwlmbXhyKEZQRVhDLCBmbXJ4KEZQRVhDKSAmIH5GUEVYQ19FTik7CisJcHV0X2NwdSgpOworfQorCitzdGF0aWMgdm9pZCB2ZnBfdGhyZWFkX3JlbGVhc2Uoc3RydWN0IHRocmVhZF9pbmZvICp0aHJlYWQpCit7CisJLyogcmVsZWFzZSBjYXNlOiBQZXItdGhyZWFkIFZGUCBjbGVhbnVwLiAqLworCXVuaW9uIHZmcF9zdGF0ZSAqdmZwID0gJnRocmVhZC0+dmZwc3RhdGU7CisJdW5zaWduZWQgaW50IGNwdSA9IHRocmVhZC0+Y3B1OworCisJaWYgKGxhc3RfVkZQX2NvbnRleHRbY3B1XSA9PSB2ZnApCisJCWxhc3RfVkZQX2NvbnRleHRbY3B1XSA9IE5VTEw7Cit9CisKKy8qCisgKiBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIGZvbGxvd2luZyAnY21kJ3MsIHRoZSBmb2xsb3dpbmcKKyAqIGlzIHRydWUgd2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBiZWluZyBydW46CisgKiAgVEhSRUFEX05PRlRJRllfU1dUSUNIOgorICogICAtIHRoZSBwcmV2aW91c2x5IHJ1bm5pbmcgdGhyZWFkIHdpbGwgbm90IGJlIHNjaGVkdWxlZCBvbnRvIGFub3RoZXIgQ1BVLgorICogICAtIHRoZSBuZXh0IHRocmVhZCB0byBiZSBydW4gKHYpIHdpbGwgbm90IGJlIHJ1bm5pbmcgb24gYW5vdGhlciBDUFUuCisgKiAgIC0gdGhyZWFkLT5jcHUgaXMgdGhlIGxvY2FsIENQVSBudW1iZXIKKyAqICAgLSBub3QgcHJlZW1wdGlibGUgYXMgd2UncmUgY2FsbGVkIGluIHRoZSBtaWRkbGUgb2YgYSB0aHJlYWQgc3dpdGNoCisgKiAgVEhSRUFEX05PVElGWV9GTFVTSDoKKyAqICAgLSB0aGUgdGhyZWFkICh2KSB3aWxsIGJlIHJ1bm5pbmcgb24gdGhlIGxvY2FsIENQVSwgc28KKyAqCXYgPT09IGN1cnJlbnRfdGhyZWFkX2luZm8oKQorICogICAtIHRocmVhZC0+Y3B1IGlzIHRoZSBsb2NhbCBDUFUgbnVtYmVyIGF0IHRoZSB0aW1lIGl0IGlzIGFjY2Vzc2VkLAorICoJYnV0IG1heSBjaGFuZ2UgYXQgYW55IHRpbWUuCisgKiAgIC0gd2UgY291bGQgYmUgcHJlZW1wdGVkIGlmIHRyZWUgcHJlZW1wdCByY3UgaXMgZW5hYmxlZCwgc28KKyAqCWl0IGlzIHVuc2FmZSB0byB1c2UgdGhyZWFkLT5jcHUuCisgKiAgVEhSRUFEX05PVElGWV9SRUxFQVNFOgorICogICAtIHRoZSB0aHJlYWQgKHYpIHdpbGwgbm90IGJlIHJ1bm5pbmcgb24gYW55IENQVTsgaXQgaXMgYSBkZWFkIHRocmVhZC4KKyAqICAgLSB0aHJlYWQtPmNwdSB3aWxsIGJlIHRoZSBsYXN0IENQVSB0aGUgdGhyZWFkIHJhbiBvbiwgd2hpY2ggbWF5IG5vdAorICoJYmUgdGhlIGN1cnJlbnQgQ1BVLgorICogICAtIHdlIGNvdWxkIGJlIHByZWVtcHRlZCBpZiB0cmVlIHByZWVtcHQgcmN1IGlzIGVuYWJsZWQuCisgKi8KIHN0YXRpYyBpbnQgdmZwX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZyBjbWQsIHZvaWQgKnYpCiB7CiAJc3RydWN0IHRocmVhZF9pbmZvICp0aHJlYWQgPSB2OwotCXVuaW9uIHZmcF9zdGF0ZSAqdmZwOwotCV9fdTMyIGNwdSA9IHRocmVhZC0+Y3B1OwogCiAJaWYgKGxpa2VseShjbWQgPT0gVEhSRUFEX05PVElGWV9TV0lUQ0gpKSB7CiAJCXUzMiBmcGV4YyA9IGZtcngoRlBFWEMpOwogCiAjaWZkZWYgQ09ORklHX1NNUAorCQl1bnNpZ25lZCBpbnQgY3B1ID0gdGhyZWFkLT5jcHU7CisKIAkJLyoKIAkJICogT24gU01QLCBpZiBWRlAgaXMgZW5hYmxlZCwgc2F2ZSB0aGUgb2xkIHN0YXRlIGluCiAJCSAqIGNhc2UgdGhlIHRocmVhZCBtaWdyYXRlcyB0byBhIGRpZmZlcmVudCBDUFUuIFRoZQpAQCAtNzQsMjUgKzEzMCwxMCBAQAogCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAJfQogCi0JdmZwID0gJnRocmVhZC0+dmZwc3RhdGU7Ci0JaWYgKGNtZCA9PSBUSFJFQURfTk9USUZZX0ZMVVNIKSB7Ci0JCS8qCi0JCSAqIFBlci10aHJlYWQgVkZQIGluaXRpYWxpc2F0aW9uLgotCQkgKi8KLQkJbWVtc2V0KHZmcCwgMCwgc2l6ZW9mKHVuaW9uIHZmcF9zdGF0ZSkpOwotCi0JCXZmcC0+aGFyZC5mcGV4YyA9IEZQRVhDX0VOOwotCQl2ZnAtPmhhcmQuZnBzY3IgPSBGUFNDUl9ST1VORF9ORUFSRVNUOwotCi0JCS8qCi0JCSAqIERpc2FibGUgVkZQIHRvIGVuc3VyZSB3ZSBpbml0aWFsaXNlIGl0IGZpcnN0LgotCQkgKi8KLQkJZm14cihGUEVYQywgZm1yeChGUEVYQykgJiB+RlBFWENfRU4pOwotCX0KLQotCS8qIGZsdXNoIGFuZCByZWxlYXNlIGNhc2U6IFBlci10aHJlYWQgVkZQIGNsZWFudXAuICovCi0JaWYgKGxhc3RfVkZQX2NvbnRleHRbY3B1XSA9PSB2ZnApCi0JCWxhc3RfVkZQX2NvbnRleHRbY3B1XSA9IE5VTEw7CisJaWYgKGNtZCA9PSBUSFJFQURfTk9USUZZX0ZMVVNIKQorCQl2ZnBfdGhyZWFkX2ZsdXNoKHRocmVhZCk7CisJZWxzZQorCQl2ZnBfdGhyZWFkX3JlbGVhc2UodGhyZWFkKTsKIAogCXJldHVybiBOT1RJRllfRE9ORTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vc3lzY2FsbHMuaCBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vc3lzY2FsbHMuaAppbmRleCA0ODNkNjY2Li42NmExOTcyIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL3N5c2NhbGxzLmgKKysrIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9zeXNjYWxscy5oCkBAIC0yOSwxMCArMjksNiBAQAogCQkJICAgICAgIHN0cnVjdCBwdF9yZWdzICopOwogYXNtbGlua2FnZSBpbnQgc3lzX3J0X3NpZ3JldHVybihzdHJ1Y3QgcHRfcmVncyAqKTsKIAotLyoga2VybmVsL3N5c19hdnIzMi5jICovCi1hc21saW5rYWdlIGxvbmcgc3lzX21tYXAyKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsCi0JCQkgIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIG9mZl90KTsKLQogLyogbW0vY2FjaGUuYyAqLwogYXNtbGlua2FnZSBpbnQgc3lzX2NhY2hlZmx1c2goaW50LCB2b2lkIF9fdXNlciAqLCBzaXplX3QpOwogCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC9zeXNfYXZyMzIuYyBiL2FyY2gvYXZyMzIva2VybmVsL3N5c19hdnIzMi5jCmluZGV4IDVkMmRhZWEuLjQ1OTM0OWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL3N5c19hdnIzMi5jCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL3N5c19hdnIzMi5jCkBAIC01LDM5ICs1LDggQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KIAotI2luY2x1ZGUgPGFzbS9tbWFuLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vc3lzY2FsbHMuaD4KLQotYXNtbGlua2FnZSBsb25nIHN5c19tbWFwMih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAotCQkJICB1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCi0JCQkgIHVuc2lnbmVkIGxvbmcgZmQsIG9mZl90IG9mZnNldCkKLXsKLQlpbnQgZXJyb3IgPSAtRUJBREY7Ci0Jc3RydWN0IGZpbGUgKmZpbGUgPSBOVUxMOwotCi0JZmxhZ3MgJj0gfihNQVBfRVhFQ1VUQUJMRSB8IE1BUF9ERU5ZV1JJVEUpOwotCWlmICghKGZsYWdzICYgTUFQX0FOT05ZTU9VUykpIHsKLQkJZmlsZSA9IGZnZXQoZmQpOwotCQlpZiAoIWZpbGUpCi0JCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgb2Zmc2V0KTsKLQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQotCWlmIChmaWxlKQotCQlmcHV0KGZpbGUpOwotCXJldHVybiBlcnJvcjsKLX0KLQogaW50IGtlcm5lbF9leGVjdmUoY29uc3QgY2hhciAqZmlsZSwgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKQogewogCXJlZ2lzdGVyIGxvbmcgc2NubyBhc20oInI4IikgPSBfX05SX2V4ZWN2ZTsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL3N5c2NhbGwtc3R1YnMuUyBiL2FyY2gvYXZyMzIva2VybmVsL3N5c2NhbGwtc3R1YnMuUwppbmRleCBmNzI0NGNkLi4wNDQ3YTNlIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2tlcm5lbC9zeXNjYWxsLXN0dWJzLlMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvc3lzY2FsbC1zdHVicy5TCkBAIC02MSw3ICs2MSw3IEBACiBfX3N5c19tbWFwMjoKIAlwdXNobQlscgogCXN0LncJLS1zcCwgQVJHNgotCWNhbGwJc3lzX21tYXAyCisJY2FsbAlzeXNfbW1hcF9wZ29mZgogCXN1YglzcCwgLTQKIAlwb3BtCXBjCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZmNudGwuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZmNudGwuaAppbmRleCA4NzI3YjJiLi4yNTFjOTExIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2ZjbnRsLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9mY250bC5oCkBAIC03LDggKzcsNiBAQAogI2lmbmRlZiBfQkZJTl9GQ05UTF9ICiAjZGVmaW5lIF9CRklOX0ZDTlRMX0gKIAotLyogb3Blbi9mY250bCAtIE9fU1lOQyBpcyBvbmx5IGltcGxlbWVudGVkIG9uIGJsb2NrcyBkZXZpY2VzIGFuZCBvbiBmaWxlcwotICAgbG9jYXRlZCBvbiBhbiBleHQyIGZpbGUgc3lzdGVtICovCiAjZGVmaW5lIE9fRElSRUNUT1JZCSAwNDAwMDAJLyogbXVzdCBiZSBhIGRpcmVjdG9yeSAqLwogI2RlZmluZSBPX05PRk9MTE9XCTAxMDAwMDAJLyogZG9uJ3QgZm9sbG93IGxpbmtzICovCiAjZGVmaW5lIE9fRElSRUNUCTAyMDAwMDAJLyogZGlyZWN0IGRpc2sgYWNjZXNzIGhpbnQgLSBjdXJyZW50bHkgaWdub3JlZCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc3lzX2JmaW4uYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3N5c19iZmluLmMKaW5kZXggYWZjZWYxMi4uMmU3ZjhlMSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc3lzX2JmaW4uYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9zeXNfYmZpbi5jCkBAIC0yMiwzOSArMjIsNiBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogCi0vKiBjb21tb24gY29kZSBmb3Igb2xkIGFuZCBuZXcgbW1hcHMgKi8KLXN0YXRpYyBpbmxpbmUgbG9uZwotZG9fbW1hcDIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQkgdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLAotCSB1bnNpZ25lZCBsb25nIGZkLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQotewotCWludCBlcnJvciA9IC1FQkFERjsKLQlzdHJ1Y3QgZmlsZSAqZmlsZSA9IE5VTEw7Ci0KLQlmbGFncyAmPSB+KE1BUF9FWEVDVVRBQkxFIHwgTUFQX0RFTllXUklURSk7Ci0JaWYgKCEoZmxhZ3MgJiBNQVBfQU5PTllNT1VTKSkgewotCQlmaWxlID0gZmdldChmZCk7Ci0JCWlmICghZmlsZSkKLQkJCWdvdG8gb3V0OwotCX0KLQotCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JZXJyb3IgPSBkb19tbWFwX3Bnb2ZmKGZpbGUsIGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIHBnb2ZmKTsKLQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQotCWlmIChmaWxlKQotCQlmcHV0KGZpbGUpOwotIG91dDoKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLWFzbWxpbmthZ2UgbG9uZyBzeXNfbW1hcDIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQkJCSAgdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLAotCQkJICB1bnNpZ25lZCBsb25nIGZkLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQotewotCXJldHVybiBkb19tbWFwMihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgcGdvZmYpOwotfQotCiBhc21saW5rYWdlIHZvaWQgKnN5c19zcmFtX2FsbG9jKHNpemVfdCBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXJldHVybiBzcmFtX2FsbG9jX3dpdGhfbHNsKHNpemUsIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vZW50cnkuUyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vZW50cnkuUwppbmRleCBhNTA2MzdhLi5mM2Y4YmI0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2VudHJ5LlMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9lbnRyeS5TCkBAIC0xNDIyLDcgKzE0MjIsNyBAQAogCS5sb25nIF9zeXNfbmlfc3lzY2FsbAkvKiBzdHJlYW1zMiAqLwogCS5sb25nIF9zeXNfdmZvcmsJCS8qIDE5MCAqLwogCS5sb25nIF9zeXNfZ2V0cmxpbWl0Ci0JLmxvbmcgX3N5c19tbWFwMgorCS5sb25nIF9zeXNfbW1hcF9wZ29mZgogCS5sb25nIF9zeXNfdHJ1bmNhdGU2NAogCS5sb25nIF9zeXNfZnRydW5jYXRlNjQKIAkubG9uZyBfc3lzX3N0YXQ2NAkvKiAxOTUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9rZXJuZWwvc3lzX2NyaXMuYyBiL2FyY2gvY3Jpcy9rZXJuZWwvc3lzX2NyaXMuYwppbmRleCAyYWQ5NjJjLi5jMmJiYjFhIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMva2VybmVsL3N5c19jcmlzLmMKKysrIGIvYXJjaC9jcmlzL2tlcm5lbC9zeXNfY3Jpcy5jCkBAIC0yNiwzMSArMjYsNiBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KIAotLyogY29tbW9uIGNvZGUgZm9yIG9sZCBhbmQgbmV3IG1tYXBzICovCi1zdGF0aWMgaW5saW5lIGxvbmcKLWRvX21tYXAyKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgcHJvdCwKLSAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZikKLXsKLSAgICAgICAgaW50IGVycm9yID0gLUVCQURGOwotICAgICAgICBzdHJ1Y3QgZmlsZSAqIGZpbGUgPSBOVUxMOwotCi0gICAgICAgIGZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLSAgICAgICAgaWYgKCEoZmxhZ3MgJiBNQVBfQU5PTllNT1VTKSkgewotICAgICAgICAgICAgICAgIGZpbGUgPSBmZ2V0KGZkKTsKLSAgICAgICAgICAgICAgICBpZiAoIWZpbGUpCi0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKLSAgICAgICAgfQotCi0gICAgICAgIGRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0gICAgICAgIGVycm9yID0gZG9fbW1hcF9wZ29mZihmaWxlLCBhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBwZ29mZik7Ci0gICAgICAgIHVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCi0gICAgICAgIGlmIChmaWxlKQotICAgICAgICAgICAgICAgIGZwdXQoZmlsZSk7Ci1vdXQ6Ci0gICAgICAgIHJldHVybiBlcnJvcjsKLX0KLQogYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nIG9sZF9tbWFwKHVuc2lnbmVkIGxvbmcgX191c2VyICphcmdzKQogeyAgICAgICAgCiAJdW5zaWduZWQgbG9uZyBidWZmZXJbNl07CkBAIC02Myw3ICszOCw3IEBACiAJaWYgKGJ1ZmZlcls1XSAmIH5QQUdFX01BU0spIC8qIHZlcmlmeSB0aGF0IG9mZnNldCBpcyBvbiBwYWdlIGJvdW5kYXJ5ICovCiAJCWdvdG8gb3V0OwogCi0JZXJyID0gZG9fbW1hcDIoYnVmZmVyWzBdLCBidWZmZXJbMV0sIGJ1ZmZlclsyXSwgYnVmZmVyWzNdLAorCWVyciA9IHN5c19tbWFwX3Bnb2ZmKGJ1ZmZlclswXSwgYnVmZmVyWzFdLCBidWZmZXJbMl0sIGJ1ZmZlclszXSwKICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyWzRdLCBidWZmZXJbNV0gPj4gUEFHRV9TSElGVCk7CiBvdXQ6CiAJcmV0dXJuIGVycjsKQEAgLTczLDcgKzQ4LDggQEAKIHN5c19tbWFwMih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIHByb3QsCiAgICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZikKIHsKLSAgICAgICAgcmV0dXJuIGRvX21tYXAyKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBwZ29mZik7CisJLyogYnVnKD8pOiA4S2IgcGFnZXMgaGVyZSAqLworICAgICAgICByZXR1cm4gc3lzX21tYXBfcGdvZmYoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsIHBnb2ZmKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2tlcm5lbC9zeXNfZnJ2LmMgYi9hcmNoL2Zydi9rZXJuZWwvc3lzX2Zydi5jCmluZGV4IDJiNmI1MjguLjFkM2Q0YzkgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2tlcm5lbC9zeXNfZnJ2LmMKKysrIGIvYXJjaC9mcnYva2VybmVsL3N5c19mcnYuYwpAQCAtMzEsOSArMzEsNiBAQAogCQkJICB1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiAJCQkgIHVuc2lnbmVkIGxvbmcgZmQsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCiB7Ci0JaW50IGVycm9yID0gLUVCQURGOwotCXN0cnVjdCBmaWxlICogZmlsZSA9IE5VTEw7Ci0KIAkvKiBBcyB3aXRoIHNwYXJjMzIsIG1ha2Ugc3VyZSB0aGUgc2hpZnQgZm9yIG1tYXAyIGlzIGNvbnN0YW50CiAJICAgKDEyKSwgbm8gbWF0dGVyIHdoYXQgUEFHRV9TSVpFIHdlIGhhdmUuLi4uICovCiAKQEAgLTQxLDcwICszOCwxMSBAQAogCSAgIHRyeWluZyB0byBtYXAgc29tZXRoaW5nIHdlIGNhbid0ICovCiAJaWYgKHBnb2ZmICYgKCgxIDw8IChQQUdFX1NISUZUIC0gMTIpKSAtIDEpKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlwZ29mZiA+Pj0gUEFHRV9TSElGVCAtIDEyOwogCi0JZmxhZ3MgJj0gfihNQVBfRVhFQ1VUQUJMRSB8IE1BUF9ERU5ZV1JJVEUpOwotCWlmICghKGZsYWdzICYgTUFQX0FOT05ZTU9VUykpIHsKLQkJZmlsZSA9IGZnZXQoZmQpOwotCQlpZiAoIWZpbGUpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCWVycm9yID0gZG9fbW1hcF9wZ29mZihmaWxlLCBhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBwZ29mZik7Ci0JdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0KLQlpZiAoZmlsZSkKLQkJZnB1dChmaWxlKTsKLW91dDoKLQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIHN5c19tbWFwX3Bnb2ZmKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLAorCQkJICAgICAgcGdvZmYgPj4gKFBBR0VfU0hJRlQgLSAxMikpOwogfQogCi0jaWYgMCAvKiBEQVZJRE0gLSBkbyB3ZSB3YW50IHRoaXMgKi8KLXN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3Q2NCB7Ci0JX191MzIgYWRkcjsKLQlfX3UzMiBsZW47Ci0JX191MzIgcHJvdDsKLQlfX3UzMiBmbGFnczsKLQlfX3U2NCBvZmZzZXQ7IC8qIDY0IGJpdHMgKi8KLQlfX3UzMiBmZDsKLX07Ci0KLWFzbWxpbmthZ2UgbG9uZyBzeXNfbW1hcDY0KHN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3Q2NCAqYXJnKQotewotCWludCBlcnJvciA9IC1FRkFVTFQ7Ci0Jc3RydWN0IGZpbGUgKiBmaWxlID0gTlVMTDsKLQlzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0NjQgYTsKLQl1bnNpZ25lZCBsb25nIHBnb2ZmOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZhLCBhcmcsIHNpemVvZihhKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKChsb25nKWEub2Zmc2V0ICYgflBBR0VfTUFTSykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwZ29mZiA9IGEub2Zmc2V0ID4+IFBBR0VfU0hJRlQ7Ci0JaWYgKChhLm9mZnNldCA+PiBQQUdFX1NISUZUKSAhPSBwZ29mZikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoIShhLmZsYWdzICYgTUFQX0FOT05ZTU9VUykpIHsKLQkJZXJyb3IgPSAtRUJBREY7Ci0JCWZpbGUgPSBmZ2V0KGEuZmQpOwotCQlpZiAoIWZpbGUpCi0JCQlnb3RvIG91dDsKLQl9Ci0JYS5mbGFncyAmPSB+KE1BUF9FWEVDVVRBQkxFIHwgTUFQX0RFTllXUklURSk7Ci0KLQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCWVycm9yID0gZG9fbW1hcF9wZ29mZihmaWxlLCBhLmFkZHIsIGEubGVuLCBhLnByb3QsIGEuZmxhZ3MsIHBnb2ZmKTsKLQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQlpZiAoZmlsZSkKLQkJZnB1dChmaWxlKTsKLW91dDoKLQlyZXR1cm4gZXJyb3I7Ci19Ci0jZW5kaWYKLQogLyoKICAqIHN5c19pcGMoKSBpcyB0aGUgZGUtbXVsdGlwbGV4ZXIgZm9yIHRoZSBTeXNWIElQQyBjYWxscy4uCiAgKgpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9rZXJuZWwvc3lzX2g4MzAwLmMgYi9hcmNoL2g4MzAwL2tlcm5lbC9zeXNfaDgzMDAuYwppbmRleCA4Y2I1ZDczLi5iNTk2OWRiIDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL2tlcm5lbC9zeXNfaDgzMDAuYworKysgYi9hcmNoL2g4MzAwL2tlcm5lbC9zeXNfaDgzMDAuYwpAQCAtMjYsMzkgKzI2LDYgQEAKICNpbmNsdWRlIDxhc20vdHJhcHMuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAKLS8qIGNvbW1vbiBjb2RlIGZvciBvbGQgYW5kIG5ldyBtbWFwcyAqLwotc3RhdGljIGlubGluZSBsb25nIGRvX21tYXAyKAotCXVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCi0JdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLAotCXVuc2lnbmVkIGxvbmcgZmQsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCi17Ci0JaW50IGVycm9yID0gLUVCQURGOwotCXN0cnVjdCBmaWxlICogZmlsZSA9IE5VTEw7Ci0KLQlmbGFncyAmPSB+KE1BUF9FWEVDVVRBQkxFIHwgTUFQX0RFTllXUklURSk7Ci0JaWYgKCEoZmxhZ3MgJiBNQVBfQU5PTllNT1VTKSkgewotCQlmaWxlID0gZmdldChmZCk7Ci0JCWlmICghZmlsZSkKLQkJCWdvdG8gb3V0OwotCX0KLQotCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JZXJyb3IgPSBkb19tbWFwX3Bnb2ZmKGZpbGUsIGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIHBnb2ZmKTsKLQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQotCWlmIChmaWxlKQotCQlmcHV0KGZpbGUpOwotb3V0OgotCXJldHVybiBlcnJvcjsKLX0KLQotYXNtbGlua2FnZSBsb25nIHN5c19tbWFwMih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAotCXVuc2lnbmVkIGxvbmcgcHJvdCwgdW5zaWduZWQgbG9uZyBmbGFncywKLQl1bnNpZ25lZCBsb25nIGZkLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQotewotCXJldHVybiBkb19tbWFwMihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgcGdvZmYpOwotfQotCiAvKgogICogUGVyZm9ybSB0aGUgc2VsZWN0KG5kLCBpbiwgb3V0LCBleCwgdHYpIGFuZCBtbWFwKCkgc3lzdGVtCiAgKiBjYWxscy4gTGludXgvbTY4ayBjbG9uZWQgTGludXgvaTM4Niwgd2hpY2ggZGlkbid0IHVzZSB0byBiZSBhYmxlIHRvCkBAIC04Nyw1OCArNTQsMTIgQEAKIAlpZiAoYS5vZmZzZXQgJiB+UEFHRV9NQVNLKQogCQlnb3RvIG91dDsKIAotCWEuZmxhZ3MgJj0gfihNQVBfRVhFQ1VUQUJMRSB8IE1BUF9ERU5ZV1JJVEUpOwotCi0JZXJyb3IgPSBkb19tbWFwMihhLmFkZHIsIGEubGVuLCBhLnByb3QsIGEuZmxhZ3MsIGEuZmQsIGEub2Zmc2V0ID4+IFBBR0VfU0hJRlQpOworCWVycm9yID0gc3lzX21tYXBfcGdvZmYoYS5hZGRyLCBhLmxlbiwgYS5wcm90LCBhLmZsYWdzLCBhLmZkLAorCQkJICAgICAgIGEub2Zmc2V0ID4+IFBBR0VfU0hJRlQpOwogb3V0OgogCXJldHVybiBlcnJvcjsKIH0KIAotI2lmIDAgLyogREFWSURNIC0gZG8gd2Ugd2FudCB0aGlzICovCi1zdHJ1Y3QgbW1hcF9hcmdfc3RydWN0NjQgewotCV9fdTMyIGFkZHI7Ci0JX191MzIgbGVuOwotCV9fdTMyIHByb3Q7Ci0JX191MzIgZmxhZ3M7Ci0JX191NjQgb2Zmc2V0OyAvKiA2NCBiaXRzICovCi0JX191MzIgZmQ7Ci19OwotCi1hc21saW5rYWdlIGxvbmcgc3lzX21tYXA2NChzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0NjQgKmFyZykKLXsKLQlpbnQgZXJyb3IgPSAtRUZBVUxUOwotCXN0cnVjdCBmaWxlICogZmlsZSA9IE5VTEw7Ci0Jc3RydWN0IG1tYXBfYXJnX3N0cnVjdDY0IGE7Ci0JdW5zaWduZWQgbG9uZyBwZ29mZjsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmYSwgYXJnLCBzaXplb2YoYSkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmICgobG9uZylhLm9mZnNldCAmIH5QQUdFX01BU0spCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcGdvZmYgPSBhLm9mZnNldCA+PiBQQUdFX1NISUZUOwotCWlmICgoYS5vZmZzZXQgPj4gUEFHRV9TSElGVCkgIT0gcGdvZmYpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCEoYS5mbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWVycm9yID0gLUVCQURGOwotCQlmaWxlID0gZmdldChhLmZkKTsKLQkJaWYgKCFmaWxlKQotCQkJZ290byBvdXQ7Ci0JfQotCWEuZmxhZ3MgJj0gfihNQVBfRVhFQ1VUQUJMRSB8IE1BUF9ERU5ZV1JJVEUpOwotCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYS5hZGRyLCBhLmxlbiwgYS5wcm90LCBhLmZsYWdzLCBwZ29mZik7Ci0JdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JaWYgKGZpbGUpCi0JCWZwdXQoZmlsZSk7Ci1vdXQ6Ci0JcmV0dXJuIGVycm9yOwotfQotI2VuZGlmCi0KIHN0cnVjdCBzZWxfYXJnX3N0cnVjdCB7CiAJdW5zaWduZWQgbG9uZyBuOwogCWZkX3NldCAqaW5wLCAqb3V0cCwgKmV4cDsKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAva2VybmVsL3N5c2NhbGxzLlMgYi9hcmNoL2g4MzAwL2tlcm5lbC9zeXNjYWxscy5TCmluZGV4IDRlYjY3ZmEuLjJkNjk4ODEgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAva2VybmVsL3N5c2NhbGxzLlMKKysrIGIvYXJjaC9oODMwMC9rZXJuZWwvc3lzY2FsbHMuUwpAQCAtMjA2LDcgKzIwNiw3IEBACiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX25pX3N5c2NhbGwpCS8qIHN0cmVhbXMyICovCiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX3Zmb3JrKSAgICAgICAgICAgIC8qIDE5MCAqLwogCS5sb25nIFNZTUJPTF9OQU1FKHN5c19nZXRybGltaXQpCi0JLmxvbmcgU1lNQk9MX05BTUUoc3lzX21tYXAyKQorCS5sb25nIFNZTUJPTF9OQU1FKHN5c19tbWFwX3Bnb2ZmKQogCS5sb25nIFNZTUJPTF9OQU1FKHN5c190cnVuY2F0ZTY0KQogCS5sb25nIFNZTUJPTF9OQU1FKHN5c19mdHJ1bmNhdGU2NCkKIAkubG9uZyBTWU1CT0xfTkFNRShzeXNfc3RhdDY0KQkJLyogMTk1ICovCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvS2NvbmZpZyBiL2FyY2gvaWE2NC9LY29uZmlnCmluZGV4IDFlZTU5NmMuLjJkN2Y1NmEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9LY29uZmlnCisrKyBiL2FyY2gvaWE2NC9LY29uZmlnCkBAIC04Nyw5ICs4Nyw2IEBACiAJYm9vbAogCWRlZmF1bHQgeQogCi1jb25maWcgSEFWRV9MRUdBQ1lfUEVSX0NQVV9BUkVBCi0JZGVmX2Jvb2wgeQotCiBjb25maWcgSEFWRV9TRVRVUF9QRVJfQ1BVX0FSRUEKIAlkZWZfYm9vbCB5CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pYTMyL3N5c19pYTMyLmMgYi9hcmNoL2lhNjQvaWEzMi9zeXNfaWEzMi5jCmluZGV4IDQyOWVjOTYuLjA0NWI3NDZiIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaWEzMi9zeXNfaWEzMi5jCisrKyBiL2FyY2gvaWE2NC9pYTMyL3N5c19pYTMyLmMKQEAgLTg1OCw2ICs4NTgsOSBAQAogCiAJcHJvdCA9IGdldF9wcm90MzIocHJvdCk7CiAKKwlpZiAoZmxhZ3MgJiBNQVBfSFVHRVRMQikKKwkJcmV0dXJuIC1FTk9NRU07CisKICNpZiBQQUdFX1NISUZUID4gSUEzMl9QQUdFX1NISUZUCiAJbXV0ZXhfbG9jaygmaWEzMl9tbWFwX211dGV4KTsKIAl7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vbWVtaW5pdC5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL21lbWluaXQuaAppbmRleCA2ODhhODEyLi42MWM3YjE3IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vbWVtaW5pdC5oCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9tZW1pbml0LmgKQEAgLTYxLDcgKzYxLDcgQEAKIAogI2lmZGVmIENPTkZJR19WSVJUVUFMX01FTV9NQVAKICMgZGVmaW5lIExBUkdFX0dBUAkweDQwMDAwMDAwIC8qIFVzZSB2aXJ0dWFsIG1lbSBtYXAgaWYgaG9sZSBpcyA+IHRoYW4gdGhpcyAqLwotICBleHRlcm4gdW5zaWduZWQgbG9uZyB2bWFsbG9jX2VuZDsKKyAgZXh0ZXJuIHVuc2lnbmVkIGxvbmcgVk1BTExPQ19FTkQ7CiAgIGV4dGVybiBzdHJ1Y3QgcGFnZSAqdm1lbV9tYXA7CiAgIGV4dGVybiBpbnQgZmluZF9sYXJnZXN0X2hvbGUodTY0IHN0YXJ0LCB1NjQgZW5kLCB2b2lkICphcmcpOwogICBleHRlcm4gaW50IGNyZWF0ZV9tZW1fbWFwX3BhZ2VfdGFibGUodTY0IHN0YXJ0LCB1NjQgZW5kLCB2b2lkICphcmcpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKaW5kZXggODg0MGE2OS4uNjliZjEzOCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3BndGFibGUuaAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vcGd0YWJsZS5oCkBAIC0yMjgsOCArMjI4LDcgQEAKICNkZWZpbmUgVk1BTExPQ19TVEFSVAkJKFJHTl9CQVNFKFJHTl9HQVRFKSArIDB4MjAwMDAwMDAwVUwpCiAjaWZkZWYgQ09ORklHX1ZJUlRVQUxfTUVNX01BUAogIyBkZWZpbmUgVk1BTExPQ19FTkRfSU5JVAkoUkdOX0JBU0UoUkdOX0dBVEUpICsgKDFVTCA8PCAoNCpQQUdFX1NISUZUIC0gOSkpKQotIyBkZWZpbmUgVk1BTExPQ19FTkQJCXZtYWxsb2NfZW5kCi0gIGV4dGVybiB1bnNpZ25lZCBsb25nIHZtYWxsb2NfZW5kOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgVk1BTExPQ19FTkQ7CiAjZWxzZQogI2lmIGRlZmluZWQoQ09ORklHX1NQQVJTRU1FTSkgJiYgZGVmaW5lZChDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVApCiAvKiBTUEFSU0VNRU1fVk1FTU1BUCB1c2VzIGhhbGYgb2Ygdm1hbGxvYy4uLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCmluZGV4IDNlYWVlZGYxLi43ZmE5MGY3IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCkBAIC0yMjksNyArMjI5LDcgQEAKICNlbmRpZgogfTsKIAotREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBjcHVpbmZvX2lhNjQsIGNwdV9pbmZvKTsKK0RFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgY3B1aW5mb19pYTY0LCBpYTY0X2NwdV9pbmZvKTsKIAogLyoKICAqIFRoZSAibG9jYWwiIGRhdGEgdmFyaWFibGUuICBJdCByZWZlcnMgdG8gdGhlIHBlci1DUFUgZGF0YSBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZwpAQCAtMjM3LDggKzIzNyw4IEBACiAgKiBEbyBub3QgdXNlIHRoZSBhZGRyZXNzIG9mIGxvY2FsX2NwdV9kYXRhLCBzaW5jZSBpdCB3aWxsIGJlIGRpZmZlcmVudCBmcm9tCiAgKiBjcHVfZGF0YShzbXBfcHJvY2Vzc29yX2lkKCkpIQogICovCi0jZGVmaW5lIGxvY2FsX2NwdV9kYXRhCQkoJl9faWE2NF9wZXJfY3B1X3ZhcihjcHVfaW5mbykpCi0jZGVmaW5lIGNwdV9kYXRhKGNwdSkJCSgmcGVyX2NwdShjcHVfaW5mbywgY3B1KSkKKyNkZWZpbmUgbG9jYWxfY3B1X2RhdGEJCSgmX19pYTY0X3Blcl9jcHVfdmFyKGlhNjRfY3B1X2luZm8pKQorI2RlZmluZSBjcHVfZGF0YShjcHUpCQkoJnBlcl9jcHUoaWE2NF9jcHVfaW5mbywgY3B1KSkKIAogZXh0ZXJuIHZvaWQgcHJpbnRfY3B1X2luZm8gKHN0cnVjdCBjcHVpbmZvX2lhNjQgKik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS94ZW4vaHlwZXJ2aXNvci5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3hlbi9oeXBlcnZpc29yLmgKaW5kZXggODhhZmI1NC4uNjc0NTVjMiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3hlbi9oeXBlcnZpc29yLmgKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3hlbi9oeXBlcnZpc29yLmgKQEAgLTM3LDM1ICszNyw5IEBACiAjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS94ZW4uaD4KICNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3ZlcnNpb24uaD4JLyogdG8gY29tcGlsZSBmZWF0dXJlLmMgKi8KICNpbmNsdWRlIDx4ZW4vZmVhdHVyZXMuaD4JCS8qIHRvIGNvbWlwbGUgeGVuLW5ldGZyb250LmMgKi8KKyNpbmNsdWRlIDx4ZW4veGVuLmg+CiAjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcmNhbGwuaD4KIAotLyogeGVuX2RvbWFpbl90eXBlIGlzIHNldCBiZWZvcmUgZXhlY3V0aW5nIGFueSBDIGNvZGUgYnkgZWFybHlfeGVuX3NldHVwICovCi1lbnVtIHhlbl9kb21haW5fdHlwZSB7Ci0JWEVOX05BVElWRSwJLyogcnVubmluZyBvbiBiYXJlIGhhcmR3YXJlICovCi0JWEVOX1BWX0RPTUFJTiwJLyogcnVubmluZyBpbiBhIFBWIGRvbWFpbiAqLwotCVhFTl9IVk1fRE9NQUlOLAkvKiBydW5uaW5nIGluIGEgWGVuIGh2bSBkb21haW4qLwotfTsKLQotI2lmZGVmIENPTkZJR19YRU4KLWV4dGVybiBlbnVtIHhlbl9kb21haW5fdHlwZSB4ZW5fZG9tYWluX3R5cGU7Ci0jZWxzZQotI2RlZmluZSB4ZW5fZG9tYWluX3R5cGUJCVhFTl9OQVRJVkUKLSNlbmRpZgotCi0jZGVmaW5lIHhlbl9kb21haW4oKQkJKHhlbl9kb21haW5fdHlwZSAhPSBYRU5fTkFUSVZFKQotI2RlZmluZSB4ZW5fcHZfZG9tYWluKCkJCSh4ZW5fZG9tYWluKCkgJiYJCQlcCi0JCQkJIHhlbl9kb21haW5fdHlwZSA9PSBYRU5fUFZfRE9NQUlOKQotI2RlZmluZSB4ZW5faHZtX2RvbWFpbigpCSh4ZW5fZG9tYWluKCkgJiYJCQlcCi0JCQkJIHhlbl9kb21haW5fdHlwZSA9PSBYRU5fSFZNX0RPTUFJTikKLQotI2lmZGVmIENPTkZJR19YRU5fRE9NMAotI2RlZmluZSB4ZW5faW5pdGlhbF9kb21haW4oKQkoeGVuX3B2X2RvbWFpbigpICYmCQkJXAotCQkJCSAoeGVuX3N0YXJ0X2luZm8tPmZsYWdzICYgU0lGX0lOSVRET01BSU4pKQotI2Vsc2UKLSNkZWZpbmUgeGVuX2luaXRpYWxfZG9tYWluKCkJKDApCi0jZW5kaWYKLQotCiAjaWZkZWYgQ09ORklHX1hFTgogZXh0ZXJuIHN0cnVjdCBzaGFyZWRfaW5mbyAqSFlQRVJWSVNPUl9zaGFyZWRfaW5mbzsKIGV4dGVybiBzdHJ1Y3Qgc3RhcnRfaW5mbyAqeGVuX3N0YXJ0X2luZm87CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2FjcGkuYyBiL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCmluZGV4IGJhZWM2ZjAuLjQwNTc0YWUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCkBAIC03MDIsMTEgKzcwMiwyMyBAQAogCQlwcmludGsoS0VSTl9FUlIgUFJFRklYCiAJCSAgICAgICAiRXJyb3IgcGFyc2luZyBNQURUIC0gbm8gTEFQSUMgZW50cmllc1xuIik7CiAKKyNpZmRlZiBDT05GSUdfU01QCisJaWYgKGF2YWlsYWJsZV9jcHVzID09IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQUNQSTogRm91bmQgMCBDUFVTOyBhc3N1bWluZyAxXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVIDAgKDB4JTA0eCkiLCBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKSk7CisJCXNtcF9ib290X2RhdGEuY3B1X3BoeXNfaWRbYXZhaWxhYmxlX2NwdXNdID0KKwkJICAgIGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpOworCQlhdmFpbGFibGVfY3B1cyA9IDE7CS8qIFdlJ3ZlIGdvdCBhdCBsZWFzdCBvbmUgb2YgdGhlc2UsIG5vPyAqLworCX0KKwlzbXBfYm9vdF9kYXRhLmNwdV9jb3VudCA9IGF2YWlsYWJsZV9jcHVzOworI2VuZGlmCisJLyogTWFrZSBib290LXVwIGxvb2sgcHJldHR5ICovCisJcHJpbnRrKEtFUk5fSU5GTyAiJWQgQ1BVcyBhdmFpbGFibGUsICVkIENQVXMgdG90YWxcbiIsIGF2YWlsYWJsZV9jcHVzLAorCSAgICAgICB0b3RhbF9jcHVzKTsKKwogCXJldHVybiAwOwogfQogCi0KLQogaW50IF9faW5pdCBhY3BpX2Jvb3RfaW5pdCh2b2lkKQogewogCkBAIC03NjksMTggKzc4MSw4IEBACiAJaWYgKGFjcGlfdGFibGVfcGFyc2UoQUNQSV9TSUdfRkFEVCwgYWNwaV9wYXJzZV9mYWR0KSkKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiQ2FuJ3QgZmluZCBGQURUXG4iKTsKIAorI2lmZGVmIENPTkZJR19BQ1BJX05VTUEKICNpZmRlZiBDT05GSUdfU01QCi0JaWYgKGF2YWlsYWJsZV9jcHVzID09IDApIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiQUNQSTogRm91bmQgMCBDUFVTOyBhc3N1bWluZyAxXG4iKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVIDAgKDB4JTA0eCkiLCBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKSk7Ci0JCXNtcF9ib290X2RhdGEuY3B1X3BoeXNfaWRbYXZhaWxhYmxlX2NwdXNdID0KLQkJICAgIGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpOwotCQlhdmFpbGFibGVfY3B1cyA9IDE7CS8qIFdlJ3ZlIGdvdCBhdCBsZWFzdCBvbmUgb2YgdGhlc2UsIG5vPyAqLwotCX0KLQlzbXBfYm9vdF9kYXRhLmNwdV9jb3VudCA9IGF2YWlsYWJsZV9jcHVzOwotCi0Jc21wX2J1aWxkX2NwdV9tYXAoKTsKLSMgaWZkZWYgQ09ORklHX0FDUElfTlVNQQogCWlmIChzcmF0X251bV9jcHVzID09IDApIHsKIAkJaW50IGNwdSwgaSA9IDE7CiAJCWZvciAoY3B1ID0gMDsgY3B1IDwgc21wX2Jvb3RfZGF0YS5jcHVfY291bnQ7IGNwdSsrKQpAQCAtNzg5LDE0ICs3OTEsOSBAQAogCQkJCW5vZGVfY3B1aWRbaSsrXS5waHlzX2lkID0KIAkJCQkgICAgc21wX2Jvb3RfZGF0YS5jcHVfcGh5c19pZFtjcHVdOwogCX0KLSMgZW5kaWYKICNlbmRpZgotI2lmZGVmIENPTkZJR19BQ1BJX05VTUEKIAlidWlsZF9jcHVfdG9fbm9kZV9tYXAoKTsKICNlbmRpZgotCS8qIE1ha2UgYm9vdC11cCBsb29rIHByZXR0eSAqLwotCXByaW50ayhLRVJOX0lORk8gIiVkIENQVXMgYXZhaWxhYmxlLCAlZCBDUFVzIHRvdGFsXG4iLCBhdmFpbGFibGVfY3B1cywKLQkgICAgICAgdG90YWxfY3B1cyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvaGVhZC5TIGIvYXJjaC9pYTY0L2tlcm5lbC9oZWFkLlMKaW5kZXggNjk2ZWZmMi4uMTdhOWZiYSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9oZWFkLlMKQEAgLTEwNTEsNyArMTA1MSw3IEBACiAgKiBpbnRlcm1lZGlhdGUgcHJlY2lzaW9uIHNvIHRoYXQgd2UgY2FuIHByb2R1Y2UgYSBmdWxsIDY0LWJpdCByZXN1bHQuCiAgKi8KIEdMT0JBTF9FTlRSWShpYTY0X25hdGl2ZV9zY2hlZF9jbG9jaykKLQlhZGRsIHI4PVRISVNfQ1BVKGNwdV9pbmZvKSArIElBNjRfQ1BVSU5GT19OU0VDX1BFUl9DWUNfT0ZGU0VULHIwCisJYWRkbCByOD1USElTX0NQVShpYTY0X2NwdV9pbmZvKSArIElBNjRfQ1BVSU5GT19OU0VDX1BFUl9DWUNfT0ZGU0VULHIwCiAJbW92Lm0gcjk9YXIuaXRjCQkvLyBmZXRjaCBjeWNsZS1jb3VudGVyCQkJCSgzNSBjeWMpCiAJOzsKIAlsZGY4IGY4PVtyOF0KQEAgLTEwNzcsNyArMTA3Nyw3IEBACiAjaWZkZWYgQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkcKIEdMT0JBTF9FTlRSWShjeWNsZV90b19jcHV0aW1lKQogCWFsbG9jIHIxNj1hci5wZnMsMSwwLDAsMAotCWFkZGwgcjg9VEhJU19DUFUoY3B1X2luZm8pICsgSUE2NF9DUFVJTkZPX05TRUNfUEVSX0NZQ19PRkZTRVQscjAKKwlhZGRsIHI4PVRISVNfQ1BVKGlhNjRfY3B1X2luZm8pICsgSUE2NF9DUFVJTkZPX05TRUNfUEVSX0NZQ19PRkZTRVQscjAKIAk7OwogCWxkZjggZjg9W3I4XQogCTs7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2lhNjRfa3N5bXMuYyBiL2FyY2gvaWE2NC9rZXJuZWwvaWE2NF9rc3ltcy5jCmluZGV4IDE0ZDM5ZTMuLjQ2MWI5OTkgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvaWE2NF9rc3ltcy5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvaWE2NF9rc3ltcy5jCkBAIC0zMCw3ICszMCw3IEBACiAjZW5kaWYKIAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLUVYUE9SVF9TWU1CT0wocGVyX2NwdV9fY3B1X2luZm8pOworRVhQT1JUX1NZTUJPTChwZXJfY3B1X19pYTY0X2NwdV9pbmZvKTsKICNpZmRlZiBDT05GSUdfU01QCiBFWFBPUlRfU1lNQk9MKHBlcl9jcHVfX2xvY2FsX3Blcl9jcHVfb2Zmc2V0KTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9tY2FfYXNtLlMgYi9hcmNoL2lhNjQva2VybmVsL21jYV9hc20uUwppbmRleCA3NDYxZDI1Li5kNWJkZjlkIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL21jYV9hc20uUworKysgYi9hcmNoL2lhNjQva2VybmVsL21jYV9hc20uUwpAQCAtNTksNyArNTksNyBAQAogaWE2NF9kb190bGJfcHVyZ2U6CiAjZGVmaW5lIE8obWVtYmVyKQlJQTY0X0NQVUlORk9fIyNtZW1iZXIjI19PRkZTRVQKIAotCUdFVF9USElTX1BBRERSKHIyLCBjcHVfaW5mbykJLy8gbG9hZCBwaHlzIGFkZHIgb2YgY3B1X2luZm8gaW50byByMgorCUdFVF9USElTX1BBRERSKHIyLCBpYTY0X2NwdV9pbmZvKSAvLyBsb2FkIHBoeXMgYWRkciBvZiBjcHVfaW5mbyBpbnRvIHIyCiAJOzsKIAlhZGRsIHIxNz1PKFBUQ0VfU1RSSURFKSxyMgogCWFkZGwgcjI9TyhQVENFX0JBU0UpLHIyCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TIGIvYXJjaC9pYTY0L2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUwppbmRleCAzMmY2ZmMxLi5jMzcwZTAyIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvcmVsb2NhdGVfa2VybmVsLlMKQEAgLTYxLDcgKzYxLDcgQEAKIAogCS8vIHB1cmdlIGFsbCBUQyBlbnRyaWVzCiAjZGVmaW5lIE8obWVtYmVyKSAgICAgICBJQTY0X0NQVUlORk9fIyNtZW1iZXIjI19PRkZTRVQKLSAgICAgICAgR0VUX1RISVNfUEFERFIocjIsIGNwdV9pbmZvKSAgICAvLyBsb2FkIHBoeXMgYWRkciBvZiBjcHVfaW5mbyBpbnRvIHIyCisgICAgICAgIEdFVF9USElTX1BBRERSKHIyLCBpYTY0X2NwdV9pbmZvKSAvLyBsb2FkIHBoeXMgYWRkciBvZiBjcHVfaW5mbyBpbnRvIHIyCiAgICAgICAgIDs7CiAgICAgICAgIGFkZGwgcjE3PU8oUFRDRV9TVFJJREUpLHIyCiAgICAgICAgIGFkZGwgcjI9TyhQVENFX0JBU0UpLHIyCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMgYi9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMKaW5kZXggMWRlODZjOS4uYTFlYTg3OSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvc2V0dXAuYwpAQCAtNzQsNyArNzQsNyBAQAogRVhQT1JUX1NZTUJPTChfX3Blcl9jcHVfb2Zmc2V0KTsKICNlbmRpZgogCi1ERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY3B1aW5mb19pYTY0LCBjcHVfaW5mbyk7CitERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY3B1aW5mb19pYTY0LCBpYTY0X2NwdV9pbmZvKTsKIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIGxvY2FsX3Blcl9jcHVfb2Zmc2V0KTsKIHVuc2lnbmVkIGxvbmcgaWE2NF9jeWNsZXNfcGVyX3VzZWM7CiBzdHJ1Y3QgaWE2NF9ib290X3BhcmFtICppYTY0X2Jvb3RfcGFyYW07CkBAIC01NjYsMTkgKzU2NiwxOCBAQAogCWVhcmx5X2FjcGlfYm9vdF9pbml0KCk7CiAjIGlmZGVmIENPTkZJR19BQ1BJX05VTUEKIAlhY3BpX251bWFfaW5pdCgpOwotI2lmZGVmIENPTkZJR19BQ1BJX0hPVFBMVUdfQ1BVCisjICBpZmRlZiBDT05GSUdfQUNQSV9IT1RQTFVHX0NQVQogCXByZWZpbGxfcG9zc2libGVfbWFwKCk7Ci0jZW5kaWYKKyMgIGVuZGlmCiAJcGVyX2NwdV9zY2FuX2ZpbmFsaXplKChjcHVzX3dlaWdodChlYXJseV9jcHVfcG9zc2libGVfbWFwKSA9PSAwID8KIAkJMzIgOiBjcHVzX3dlaWdodChlYXJseV9jcHVfcG9zc2libGVfbWFwKSksCiAJCWFkZGl0aW9uYWxfY3B1cyA+IDAgPyBhZGRpdGlvbmFsX2NwdXMgOiAwKTsKICMgZW5kaWYKLSNlbHNlCi0jIGlmZGVmIENPTkZJR19TTVAKLQlzbXBfYnVpbGRfY3B1X21hcCgpOwkvKiBoYXBwZW5zLCBlLmcuLCB3aXRoIHRoZSBTa2kgc2ltdWxhdG9yICovCi0jIGVuZGlmCiAjZW5kaWYgLyogQ09ORklHX0FQQ0lfQk9PVCAqLwogCisjaWZkZWYgQ09ORklHX1NNUAorCXNtcF9idWlsZF9jcHVfbWFwKCk7CisjZW5kaWYKIAlmaW5kX21lbW9yeSgpOwogCiAJLyogcHJvY2VzcyBTQUwgc3lzdGVtIHRhYmxlOiAqLwpAQCAtODU2LDE4ICs4NTUsNiBAQAogfQogCiAvKgotICogSW4gVVAgY29uZmlndXJhdGlvbiwgc2V0dXBfcGVyX2NwdV9hcmVhcygpIGlzIGRlZmluZWQgaW4KLSAqIGluY2x1ZGUvbGludXgvcGVyY3B1LmgKLSAqLwotI2lmZGVmIENPTkZJR19TTVAKLXZvaWQgX19pbml0Ci1zZXR1cF9wZXJfY3B1X2FyZWFzICh2b2lkKQotewotCS8qIHN0YXJ0X2tlcm5lbCgpIHJlcXVpcmVzIHRoaXMuLi4gKi8KLX0KLSNlbmRpZgotCi0vKgogICogRG8gdGhlIGZvbGxvd2luZyBjYWxjdWxhdGlvbnM6CiAgKgogICogMS4gdGhlIG1heC4gY2FjaGUgbGluZSBzaXplLgpAQCAtOTgwLDcgKzk2Nyw3IEBACiAJICogZGVwZW5kcyBvbiB0aGUgZGF0YSByZXR1cm5lZCBieSBpZGVudGlmeV9jcHUoKS4gIFdlIGJyZWFrIHRoZSBkZXBlbmRlbmN5IGJ5CiAJICogYWNjZXNzaW5nIGNwdV9kYXRhKCkgdGhyb3VnaCB0aGUgY2Fub25pY2FsIHBlci1DUFUgYWRkcmVzcy4KIAkgKi8KLQljcHVfaW5mbyA9IGNwdV9kYXRhICsgKChjaGFyICopICZfX2lhNjRfcGVyX2NwdV92YXIoY3B1X2luZm8pIC0gX19wZXJfY3B1X3N0YXJ0KTsKKwljcHVfaW5mbyA9IGNwdV9kYXRhICsgKChjaGFyICopICZfX2lhNjRfcGVyX2NwdV92YXIoaWE2NF9jcHVfaW5mbykgLSBfX3Blcl9jcHVfc3RhcnQpOwogCWlkZW50aWZ5X2NwdShjcHVfaW5mbyk7CiAKICNpZmRlZiBDT05GSUdfTUNLSU5MRVkKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvc3lzX2lhNjQuYyBiL2FyY2gvaWE2NC9rZXJuZWwvc3lzX2lhNjQuYwppbmRleCA5MmVkODNmLi42MDlkNTAwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3N5c19pYTY0LmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9zeXNfaWE2NC5jCkBAIC0xMDAsNTEgKzEwMCw3IEBACiBhc21saW5rYWdlIHVuc2lnbmVkIGxvbmcKIGlhNjRfYnJrICh1bnNpZ25lZCBsb25nIGJyaykKIHsKLQl1bnNpZ25lZCBsb25nIHJsaW0sIHJldHZhbCwgbmV3YnJrLCBvbGRicms7Ci0Jc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKLQotCS8qCi0JICogTW9zdCBvZiB0aGlzIHJlcGxpY2F0ZXMgdGhlIGNvZGUgaW4gc3lzX2JyaygpIGV4Y2VwdCBmb3IgYW4gYWRkaXRpb25hbCBzYWZldHkKLQkgKiBjaGVjayBhbmQgdGhlIGNsZWFyaW5nIG9mIHI4LiAgSG93ZXZlciwgd2UgY2FuJ3QgY2FsbCBzeXNfYnJrKCkgYmVjYXVzZSB3ZSBuZWVkCi0JICogdG8gYWNxdWlyZSB0aGUgbW1hcF9zZW0gYmVmb3JlIHdlIGNhbiBkbyB0aGUgdGVzdC4uLgotCSAqLwotCWRvd25fd3JpdGUoJm1tLT5tbWFwX3NlbSk7Ci0KLQlpZiAoYnJrIDwgbW0tPmVuZF9jb2RlKQotCQlnb3RvIG91dDsKLQluZXdicmsgPSBQQUdFX0FMSUdOKGJyayk7Ci0Jb2xkYnJrID0gUEFHRV9BTElHTihtbS0+YnJrKTsKLQlpZiAob2xkYnJrID09IG5ld2JyaykKLQkJZ290byBzZXRfYnJrOwotCi0JLyogQWx3YXlzIGFsbG93IHNocmlua2luZyBicmsuICovCi0JaWYgKGJyayA8PSBtbS0+YnJrKSB7Ci0JCWlmICghZG9fbXVubWFwKG1tLCBuZXdicmssIG9sZGJyay1uZXdicmspKQotCQkJZ290byBzZXRfYnJrOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBDaGVjayBhZ2FpbnN0IHVuaW1wbGVtZW50ZWQvdW5tYXBwZWQgYWRkcmVzc2VzOiAqLwotCWlmICgobmV3YnJrIC0gb2xkYnJrKSA+IFJHTl9NQVBfTElNSVQgfHwgUkVHSU9OX09GRlNFVChuZXdicmspID4gUkdOX01BUF9MSU1JVCkKLQkJZ290byBvdXQ7Ci0KLQkvKiBDaGVjayBhZ2FpbnN0IHJsaW1pdC4uICovCi0JcmxpbSA9IGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfREFUQV0ucmxpbV9jdXI7Ci0JaWYgKHJsaW0gPCBSTElNX0lORklOSVRZICYmIGJyayAtIG1tLT5zdGFydF9kYXRhID4gcmxpbSkKLQkJZ290byBvdXQ7Ci0KLQkvKiBDaGVjayBhZ2FpbnN0IGV4aXN0aW5nIG1tYXAgbWFwcGluZ3MuICovCi0JaWYgKGZpbmRfdm1hX2ludGVyc2VjdGlvbihtbSwgb2xkYnJrLCBuZXdicmsrUEFHRV9TSVpFKSkKLQkJZ290byBvdXQ7Ci0KLQkvKiBPaywgbG9va3MgZ29vZCAtIGxldCBpdCByaXAuICovCi0JaWYgKGRvX2JyayhvbGRicmssIG5ld2Jyay1vbGRicmspICE9IG9sZGJyaykKLQkJZ290byBvdXQ7Ci1zZXRfYnJrOgotCW1tLT5icmsgPSBicms7Ci1vdXQ6Ci0JcmV0dmFsID0gbW0tPmJyazsKLQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwl1bnNpZ25lZCBsb25nIHJldHZhbCA9IHN5c19icmsoYnJrKTsKIAlmb3JjZV9zdWNjZXNzZnVsX3N5c2NhbGxfcmV0dXJuKCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTE4NSwzOSArMTQxLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCi1kb19tbWFwMiAodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgaW50IHByb3QsIGludCBmbGFncywgaW50IGZkLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQotewotCXN0cnVjdCBmaWxlICpmaWxlID0gTlVMTDsKLQotCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGZkKTsKLQkJaWYgKCFmaWxlKQotCQkJcmV0dXJuIC1FQkFERjsKLQotCQlpZiAoIWZpbGUtPmZfb3AgfHwgIWZpbGUtPmZfb3AtPm1tYXApIHsKLQkJCWFkZHIgPSAtRU5PREVWOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KLQkvKiBDYXJlZnVsIGFib3V0IG92ZXJmbG93cy4uICovCi0JbGVuID0gUEFHRV9BTElHTihsZW4pOwotCWlmICghbGVuIHx8IGxlbiA+IFRBU0tfU0laRSkgewotCQlhZGRyID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQlhZGRyID0gZG9fbW1hcF9wZ29mZihmaWxlLCBhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBwZ29mZik7Ci0JdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0KLW91dDoJaWYgKGZpbGUpCi0JCWZwdXQoZmlsZSk7Ci0JcmV0dXJuIGFkZHI7Ci19Ci0KIC8qCiAgKiBtbWFwMigpIGlzIGxpa2UgbW1hcCgpIGV4Y2VwdCB0aGF0IHRoZSBvZmZzZXQgaXMgZXhwcmVzc2VkIGluIHVuaXRzCiAgKiBvZiBQQUdFX1NJWkUgKGluc3RlYWQgb2YgYnl0ZXMpLiAgVGhpcyBhbGxvd3MgdG8gbW1hcDIoKSAocGllY2VzCkBAIC0yMjYsNyArMTQ5LDcgQEAKIGFzbWxpbmthZ2UgdW5zaWduZWQgbG9uZwogc3lzX21tYXAyICh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCBpbnQgcHJvdCwgaW50IGZsYWdzLCBpbnQgZmQsIGxvbmcgcGdvZmYpCiB7Ci0JYWRkciA9IGRvX21tYXAyKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBwZ29mZik7CisJYWRkciA9IHN5c19tbWFwX3Bnb2ZmKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBwZ29mZik7CiAJaWYgKCFJU19FUlIoKHZvaWQgKikgYWRkcikpCiAJCWZvcmNlX3N1Y2Nlc3NmdWxfc3lzY2FsbF9yZXR1cm4oKTsKIAlyZXR1cm4gYWRkcjsKQEAgLTIzOCw3ICsxNjEsNyBAQAogCWlmIChvZmZzZXRfaW5fcGFnZShvZmYpICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JYWRkciA9IGRvX21tYXAyKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBvZmYgPj4gUEFHRV9TSElGVCk7CisJYWRkciA9IHN5c19tbWFwX3Bnb2ZmKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBvZmYgPj4gUEFHRV9TSElGVCk7CiAJaWYgKCFJU19FUlIoKHZvaWQgKikgYWRkcikpCiAJCWZvcmNlX3N1Y2Nlc3NmdWxfc3lzY2FsbF9yZXR1cm4oKTsKIAlyZXR1cm4gYWRkcjsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvaWE2NC9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCAwYTBjNzdiLi4xMjk1YmEzIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0xNjYsNiArMTY2LDEyIEBACiAJfQogI2VuZGlmCiAKKyNpZmRlZglDT05GSUdfU01QCisgIC4gPSBBTElHTihQRVJDUFVfUEFHRV9TSVpFKTsKKyAgX19jcHUwX3Blcl9jcHUgPSAuOworICAuID0gLiArIFBFUkNQVV9QQUdFX1NJWkU7CS8qIGNwdTAgcGVyLWNwdSBzcGFjZSAqLworI2VuZGlmCisKICAgLiA9IEFMSUdOKFBBR0VfU0laRSk7CiAgIF9faW5pdF9lbmQgPSAuOwogCkBAIC0xOTgsMTEgKzIwNCw2IEBACiAgIGRhdGEgOiB7IH0gOmRhdGEKICAgLmRhdGEgOiBBVChBRERSKC5kYXRhKSAtIExPQURfT0ZGU0VUKQogCXsKLSNpZmRlZglDT05GSUdfU01QCi0gIC4gPSBBTElHTihQRVJDUFVfUEFHRV9TSVpFKTsKLQkJX19jcHUwX3Blcl9jcHUgPSAuOwotICAuID0gLiArIFBFUkNQVV9QQUdFX1NJWkU7CS8qIGNwdTAgcGVyLWNwdSBzcGFjZSAqLwotI2VuZGlmCiAJCUlOSVRfVEFTS19EQVRBKFBBR0VfU0laRSkKIAkJQ0FDSEVMSU5FX0FMSUdORURfREFUQShTTVBfQ0FDSEVfQllURVMpCiAJCVJFQURfTU9TVExZX0RBVEEoU01QX0NBQ0hFX0JZVEVTKQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L21tL2NvbnRpZy5jIGIvYXJjaC9pYTY0L21tL2NvbnRpZy5jCmluZGV4IDJmNzI0ZDIuLjU0YmY1NDAgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9tbS9jb250aWcuYworKysgYi9hcmNoL2lhNjQvbW0vY29udGlnLmMKQEAgLTE1NCwzOCArMTU0LDk5IEBACiB2b2lkICogX19jcHVpbml0CiBwZXJfY3B1X2luaXQgKHZvaWQpCiB7Ci0JaW50IGNwdTsKLQlzdGF0aWMgaW50IGZpcnN0X3RpbWU9MTsKKwlzdGF0aWMgYm9vbCBmaXJzdF90aW1lID0gdHJ1ZTsKKwl2b2lkICpjcHUwX2RhdGEgPSBfX2NwdTBfcGVyX2NwdTsKKwl1bnNpZ25lZCBpbnQgY3B1OworCisJaWYgKCFmaXJzdF90aW1lKQorCQlnb3RvIHNraXA7CisJZmlyc3RfdGltZSA9IGZhbHNlOwogCiAJLyoKLQkgKiBnZXRfZnJlZV9wYWdlcygpIGNhbm5vdCBiZSB1c2VkIGJlZm9yZSBjcHVfaW5pdCgpIGRvbmUuICBCU1AKLQkgKiBhbGxvY2F0ZXMgIk5SX0NQVVMiIHBhZ2VzIGZvciBhbGwgQ1BVcyB0byBhdm9pZCB0aGF0IEFQIGNhbGxzCi0JICogZ2V0X3plcm9lZF9wYWdlKCkuCisJICogZ2V0X2ZyZWVfcGFnZXMoKSBjYW5ub3QgYmUgdXNlZCBiZWZvcmUgY3B1X2luaXQoKSBkb25lLgorCSAqIEJTUCBhbGxvY2F0ZXMgUEVSQ1BVX1BBR0VfU0laRSBieXRlcyBmb3IgYWxsIHBvc3NpYmxlIENQVXMKKwkgKiB0byBhdm9pZCB0aGF0IEFQIGNhbGxzIGdldF96ZXJvZWRfcGFnZSgpLgogCSAqLwotCWlmIChmaXJzdF90aW1lKSB7Ci0JCXZvaWQgKmNwdTBfZGF0YSA9IF9fY3B1MF9wZXJfY3B1OworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJdm9pZCAqc3JjID0gY3B1ID09IDAgPyBjcHUwX2RhdGEgOiBfX3BoeXNfcGVyX2NwdV9zdGFydDsKIAotCQlmaXJzdF90aW1lPTA7CisJCW1lbWNweShjcHVfZGF0YSwgc3JjLCBfX3Blcl9jcHVfZW5kIC0gX19wZXJfY3B1X3N0YXJ0KTsKKwkJX19wZXJfY3B1X29mZnNldFtjcHVdID0gKGNoYXIgKiljcHVfZGF0YSAtIF9fcGVyX2NwdV9zdGFydDsKKwkJcGVyX2NwdShsb2NhbF9wZXJfY3B1X29mZnNldCwgY3B1KSA9IF9fcGVyX2NwdV9vZmZzZXRbY3B1XTsKIAotCQlfX3Blcl9jcHVfb2Zmc2V0WzBdID0gKGNoYXIgKikgY3B1MF9kYXRhIC0gX19wZXJfY3B1X3N0YXJ0OwotCQlwZXJfY3B1KGxvY2FsX3Blcl9jcHVfb2Zmc2V0LCAwKSA9IF9fcGVyX2NwdV9vZmZzZXRbMF07CisJCS8qCisJCSAqIHBlcmNwdSBhcmVhIGZvciBjcHUwIGlzIG1vdmVkIGZyb20gdGhlIF9faW5pdCBhcmVhCisJCSAqIHdoaWNoIGlzIHNldHVwIGJ5IGhlYWQuUyBhbmQgdXNlZCB0aWxsIHRoaXMgcG9pbnQuCisJCSAqIFVwZGF0ZSBhci5rMy4gIFRoaXMgbW92ZSBpcyBlbnN1cmVzIHRoYXQgcGVyY3B1CisJCSAqIGFyZWEgZm9yIGNwdTAgaXMgb24gdGhlIGNvcnJlY3Qgbm9kZSBhbmQgaXRzCisJCSAqIHZpcnR1YWwgYWRkcmVzcyBpc24ndCBpbnNhbmVseSBmYXIgZnJvbSBvdGhlcgorCQkgKiBwZXJjcHUgYXJlYXMgd2hpY2ggaXMgaW1wb3J0YW50IGZvciBjb25ncnVlbnQKKwkJICogcGVyY3B1IGFsbG9jYXRvci4KKwkJICovCisJCWlmIChjcHUgPT0gMCkKKwkJCWlhNjRfc2V0X2tyKElBNjRfS1JfUEVSX0NQVV9EQVRBLCBfX3BhKGNwdV9kYXRhKSAtCisJCQkJICAgICh1bnNpZ25lZCBsb25nKV9fcGVyX2NwdV9zdGFydCk7CiAKLQkJZm9yIChjcHUgPSAxOyBjcHUgPCBOUl9DUFVTOyBjcHUrKykgewotCQkJbWVtY3B5KGNwdV9kYXRhLCBfX3BoeXNfcGVyX2NwdV9zdGFydCwgX19wZXJfY3B1X2VuZCAtIF9fcGVyX2NwdV9zdGFydCk7Ci0JCQlfX3Blcl9jcHVfb2Zmc2V0W2NwdV0gPSAoY2hhciAqKSBjcHVfZGF0YSAtIF9fcGVyX2NwdV9zdGFydDsKLQkJCWNwdV9kYXRhICs9IFBFUkNQVV9QQUdFX1NJWkU7Ci0JCQlwZXJfY3B1KGxvY2FsX3Blcl9jcHVfb2Zmc2V0LCBjcHUpID0gX19wZXJfY3B1X29mZnNldFtjcHVdOwotCQl9CisJCWNwdV9kYXRhICs9IFBFUkNQVV9QQUdFX1NJWkU7CiAJfQorc2tpcDoKIAlyZXR1cm4gX19wZXJfY3B1X3N0YXJ0ICsgX19wZXJfY3B1X29mZnNldFtzbXBfcHJvY2Vzc29yX2lkKCldOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKIGFsbG9jX3Blcl9jcHVfZGF0YSh2b2lkKQogewotCWNwdV9kYXRhID0gX19hbGxvY19ib290bWVtKFBFUkNQVV9QQUdFX1NJWkUgKiBOUl9DUFVTLTEsCisJY3B1X2RhdGEgPSBfX2FsbG9jX2Jvb3RtZW0oUEVSQ1BVX1BBR0VfU0laRSAqIG51bV9wb3NzaWJsZV9jcHVzKCksCiAJCQkJICAgUEVSQ1BVX1BBR0VfU0laRSwgX19wYShNQVhfRE1BX0FERFJFU1MpKTsKIH0KKworLyoqCisgKiBzZXR1cF9wZXJfY3B1X2FyZWFzIC0gc2V0dXAgcGVyY3B1IGFyZWFzCisgKgorICogQXJjaCBjb2RlIGhhcyBhbHJlYWR5IGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgcGVyY3B1IGFyZWFzLiAgQWxsCisgKiB0aGlzIGZ1bmN0aW9uIGhhcyB0byBkbyBpcyB0byB0ZWFjaCB0aGUgZGV0ZXJtaW5lZCBsYXlvdXQgdG8gdGhlCisgKiBkeW5hbWljIHBlcmNwdSBhbGxvY2F0b3IsIHdoaWNoIGhhcHBlbnMgdG8gYmUgbW9yZSBjb21wbGV4IHRoYW4KKyAqIGNyZWF0aW5nIHdob2xlIG5ldyBvbmVzIHVzaW5nIGhlbHBlcnMuCisgKi8KK3ZvaWQgX19pbml0CitzZXR1cF9wZXJfY3B1X2FyZWFzKHZvaWQpCit7CisJc3RydWN0IHBjcHVfYWxsb2NfaW5mbyAqYWk7CisJc3RydWN0IHBjcHVfZ3JvdXBfaW5mbyAqZ2k7CisJdW5zaWduZWQgaW50IGNwdTsKKwlzc2l6ZV90IHN0YXRpY19zaXplLCByZXNlcnZlZF9zaXplLCBkeW5fc2l6ZTsKKwlpbnQgcmM7CisKKwlhaSA9IHBjcHVfYWxsb2NfYWxsb2NfaW5mbygxLCBudW1fcG9zc2libGVfY3B1cygpKTsKKwlpZiAoIWFpKQorCQlwYW5pYygiZmFpbGVkIHRvIGFsbG9jYXRlIHBjcHVfYWxsb2NfaW5mbyIpOworCWdpID0gJmFpLT5ncm91cHNbMF07CisKKwkvKiB1bml0cyBhcmUgYXNzaWduZWQgY29uc2VjdXRpdmVseSB0byBwb3NzaWJsZSBjcHVzICovCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkKKwkJZ2ktPmNwdV9tYXBbZ2ktPm5yX3VuaXRzKytdID0gY3B1OworCisJLyogc2V0IHBhcmFtZXRlcnMgKi8KKwlzdGF0aWNfc2l6ZSA9IF9fcGVyX2NwdV9lbmQgLSBfX3Blcl9jcHVfc3RhcnQ7CisJcmVzZXJ2ZWRfc2l6ZSA9IFBFUkNQVV9NT0RVTEVfUkVTRVJWRTsKKwlkeW5fc2l6ZSA9IFBFUkNQVV9QQUdFX1NJWkUgLSBzdGF0aWNfc2l6ZSAtIHJlc2VydmVkX3NpemU7CisJaWYgKGR5bl9zaXplIDwgMCkKKwkJcGFuaWMoInBlcmNwdSBhcmVhIG92ZXJmbG93IHN0YXRpYz0lemQgcmVzZXJ2ZWQ9JXpkXG4iLAorCQkgICAgICBzdGF0aWNfc2l6ZSwgcmVzZXJ2ZWRfc2l6ZSk7CisKKwlhaS0+c3RhdGljX3NpemUJCT0gc3RhdGljX3NpemU7CisJYWktPnJlc2VydmVkX3NpemUJPSByZXNlcnZlZF9zaXplOworCWFpLT5keW5fc2l6ZQkJPSBkeW5fc2l6ZTsKKwlhaS0+dW5pdF9zaXplCQk9IFBFUkNQVV9QQUdFX1NJWkU7CisJYWktPmF0b21fc2l6ZQkJPSBQQUdFX1NJWkU7CisJYWktPmFsbG9jX3NpemUJCT0gUEVSQ1BVX1BBR0VfU0laRTsKKworCXJjID0gcGNwdV9zZXR1cF9maXJzdF9jaHVuayhhaSwgX19wZXJfY3B1X3N0YXJ0ICsgX19wZXJfY3B1X29mZnNldFswXSk7CisJaWYgKHJjKQorCQlwYW5pYygiZmFpbGVkIHRvIHNldHVwIHBlcmNwdSBhcmVhIChlcnI9JWQpIiwgcmMpOworCisJcGNwdV9mcmVlX2FsbG9jX2luZm8oYWkpOworfQogI2Vsc2UKICNkZWZpbmUgYWxsb2NfcGVyX2NwdV9kYXRhKCkgZG8geyB9IHdoaWxlICgwKQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KQEAgLTI3MCw4ICszMzEsOCBAQAogCiAJCW1hcF9zaXplID0gUEFHRV9BTElHTihBTElHTihtYXhfbG93X3BmbiwgTUFYX09SREVSX05SX1BBR0VTKSAqCiAJCQlzaXplb2Yoc3RydWN0IHBhZ2UpKTsKLQkJdm1hbGxvY19lbmQgLT0gbWFwX3NpemU7Ci0JCXZtZW1fbWFwID0gKHN0cnVjdCBwYWdlICopIHZtYWxsb2NfZW5kOworCQlWTUFMTE9DX0VORCAtPSBtYXBfc2l6ZTsKKwkJdm1lbV9tYXAgPSAoc3RydWN0IHBhZ2UgKikgVk1BTExPQ19FTkQ7CiAJCWVmaV9tZW1tYXBfd2FsayhjcmVhdGVfbWVtX21hcF9wYWdlX3RhYmxlLCBOVUxMKTsKIAogCQkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L21tL2Rpc2NvbnRpZy5jIGIvYXJjaC9pYTY0L21tL2Rpc2NvbnRpZy5jCmluZGV4IGQ4NWJhOTguLjE5YzRiMjEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9tbS9kaXNjb250aWcuYworKysgYi9hcmNoL2lhNjQvbW0vZGlzY29udGlnLmMKQEAgLTE0MywyMiArMTQzLDEyMCBAQAogCWludCBjcHU7CiAKIAlmb3JfZWFjaF9wb3NzaWJsZV9lYXJseV9jcHUoY3B1KSB7Ci0JCWlmIChjcHUgPT0gMCkgewotCQkJdm9pZCAqY3B1MF9kYXRhID0gX19jcHUwX3Blcl9jcHU7Ci0JCQlfX3Blcl9jcHVfb2Zmc2V0W2NwdV0gPSAoY2hhciopY3B1MF9kYXRhIC0KLQkJCQlfX3Blcl9jcHVfc3RhcnQ7Ci0JCX0gZWxzZSBpZiAobm9kZSA9PSBub2RlX2NwdWlkW2NwdV0ubmlkKSB7Ci0JCQltZW1jcHkoX192YShjcHVfZGF0YSksIF9fcGh5c19wZXJfY3B1X3N0YXJ0LAotCQkJICAgICAgIF9fcGVyX2NwdV9lbmQgLSBfX3Blcl9jcHVfc3RhcnQpOwotCQkJX19wZXJfY3B1X29mZnNldFtjcHVdID0gKGNoYXIqKV9fdmEoY3B1X2RhdGEpIC0KLQkJCQlfX3Blcl9jcHVfc3RhcnQ7Ci0JCQljcHVfZGF0YSArPSBQRVJDUFVfUEFHRV9TSVpFOwotCQl9CisJCXZvaWQgKnNyYyA9IGNwdSA9PSAwID8gX19jcHUwX3Blcl9jcHUgOiBfX3BoeXNfcGVyX2NwdV9zdGFydDsKKworCQlpZiAobm9kZSAhPSBub2RlX2NwdWlkW2NwdV0ubmlkKQorCQkJY29udGludWU7CisKKwkJbWVtY3B5KF9fdmEoY3B1X2RhdGEpLCBzcmMsIF9fcGVyX2NwdV9lbmQgLSBfX3Blcl9jcHVfc3RhcnQpOworCQlfX3Blcl9jcHVfb2Zmc2V0W2NwdV0gPSAoY2hhciAqKV9fdmEoY3B1X2RhdGEpIC0KKwkJCV9fcGVyX2NwdV9zdGFydDsKKworCQkvKgorCQkgKiBwZXJjcHUgYXJlYSBmb3IgY3B1MCBpcyBtb3ZlZCBmcm9tIHRoZSBfX2luaXQgYXJlYQorCQkgKiB3aGljaCBpcyBzZXR1cCBieSBoZWFkLlMgYW5kIHVzZWQgdGlsbCB0aGlzIHBvaW50LgorCQkgKiBVcGRhdGUgYXIuazMuICBUaGlzIG1vdmUgaXMgZW5zdXJlcyB0aGF0IHBlcmNwdQorCQkgKiBhcmVhIGZvciBjcHUwIGlzIG9uIHRoZSBjb3JyZWN0IG5vZGUgYW5kIGl0cworCQkgKiB2aXJ0dWFsIGFkZHJlc3MgaXNuJ3QgaW5zYW5lbHkgZmFyIGZyb20gb3RoZXIKKwkJICogcGVyY3B1IGFyZWFzIHdoaWNoIGlzIGltcG9ydGFudCBmb3IgY29uZ3J1ZW50CisJCSAqIHBlcmNwdSBhbGxvY2F0b3IuCisJCSAqLworCQlpZiAoY3B1ID09IDApCisJCQlpYTY0X3NldF9rcihJQTY0X0tSX1BFUl9DUFVfREFUQSwKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcpY3B1X2RhdGEgLQorCQkJCSAgICAodW5zaWduZWQgbG9uZylfX3Blcl9jcHVfc3RhcnQpOworCisJCWNwdV9kYXRhICs9IFBFUkNQVV9QQUdFX1NJWkU7CiAJfQogI2VuZGlmCiAJcmV0dXJuIGNwdV9kYXRhOwogfQogCisjaWZkZWYgQ09ORklHX1NNUAorLyoqCisgKiBzZXR1cF9wZXJfY3B1X2FyZWFzIC0gc2V0dXAgcGVyY3B1IGFyZWFzCisgKgorICogQXJjaCBjb2RlIGhhcyBhbHJlYWR5IGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgcGVyY3B1IGFyZWFzLiAgQWxsCisgKiB0aGlzIGZ1bmN0aW9uIGhhcyB0byBkbyBpcyB0byB0ZWFjaCB0aGUgZGV0ZXJtaW5lZCBsYXlvdXQgdG8gdGhlCisgKiBkeW5hbWljIHBlcmNwdSBhbGxvY2F0b3IsIHdoaWNoIGhhcHBlbnMgdG8gYmUgbW9yZSBjb21wbGV4IHRoYW4KKyAqIGNyZWF0aW5nIHdob2xlIG5ldyBvbmVzIHVzaW5nIGhlbHBlcnMuCisgKi8KK3ZvaWQgX19pbml0IHNldHVwX3Blcl9jcHVfYXJlYXModm9pZCkKK3sKKwlzdHJ1Y3QgcGNwdV9hbGxvY19pbmZvICphaTsKKwlzdHJ1Y3QgcGNwdV9ncm91cF9pbmZvICp1bmluaXRpYWxpemVkX3ZhcihnaSk7CisJdW5zaWduZWQgaW50ICpjcHVfbWFwOworCXZvaWQgKmJhc2U7CisJdW5zaWduZWQgbG9uZyBiYXNlX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgY3B1OworCXNzaXplX3Qgc3RhdGljX3NpemUsIHJlc2VydmVkX3NpemUsIGR5bl9zaXplOworCWludCBub2RlLCBwcmV2X25vZGUsIHVuaXQsIG5yX3VuaXRzLCByYzsKKworCWFpID0gcGNwdV9hbGxvY19hbGxvY19pbmZvKE1BWF9OVU1OT0RFUywgbnJfY3B1X2lkcyk7CisJaWYgKCFhaSkKKwkJcGFuaWMoImZhaWxlZCB0byBhbGxvY2F0ZSBwY3B1X2FsbG9jX2luZm8iKTsKKwljcHVfbWFwID0gYWktPmdyb3Vwc1swXS5jcHVfbWFwOworCisJLyogZGV0ZXJtaW5lIGJhc2UgKi8KKwliYXNlID0gKHZvaWQgKilVTE9OR19NQVg7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkKKwkJYmFzZSA9IG1pbihiYXNlLAorCQkJICAgKHZvaWQgKikoX19wZXJfY3B1X29mZnNldFtjcHVdICsgX19wZXJfY3B1X3N0YXJ0KSk7CisJYmFzZV9vZmZzZXQgPSAodm9pZCAqKV9fcGVyX2NwdV9zdGFydCAtIGJhc2U7CisKKwkvKiBidWlsZCBjcHVfbWFwLCB1bml0cyBhcmUgZ3JvdXBlZCBieSBub2RlICovCisJdW5pdCA9IDA7CisJZm9yX2VhY2hfbm9kZShub2RlKQorCQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KQorCQkJaWYgKG5vZGUgPT0gbm9kZV9jcHVpZFtjcHVdLm5pZCkKKwkJCQljcHVfbWFwW3VuaXQrK10gPSBjcHU7CisJbnJfdW5pdHMgPSB1bml0OworCisJLyogc2V0IGJhc2ljIHBhcmFtZXRlcnMgKi8KKwlzdGF0aWNfc2l6ZSA9IF9fcGVyX2NwdV9lbmQgLSBfX3Blcl9jcHVfc3RhcnQ7CisJcmVzZXJ2ZWRfc2l6ZSA9IFBFUkNQVV9NT0RVTEVfUkVTRVJWRTsKKwlkeW5fc2l6ZSA9IFBFUkNQVV9QQUdFX1NJWkUgLSBzdGF0aWNfc2l6ZSAtIHJlc2VydmVkX3NpemU7CisJaWYgKGR5bl9zaXplIDwgMCkKKwkJcGFuaWMoInBlcmNwdSBhcmVhIG92ZXJmbG93IHN0YXRpYz0lemQgcmVzZXJ2ZWQ9JXpkXG4iLAorCQkgICAgICBzdGF0aWNfc2l6ZSwgcmVzZXJ2ZWRfc2l6ZSk7CisKKwlhaS0+c3RhdGljX3NpemUJCT0gc3RhdGljX3NpemU7CisJYWktPnJlc2VydmVkX3NpemUJPSByZXNlcnZlZF9zaXplOworCWFpLT5keW5fc2l6ZQkJPSBkeW5fc2l6ZTsKKwlhaS0+dW5pdF9zaXplCQk9IFBFUkNQVV9QQUdFX1NJWkU7CisJYWktPmF0b21fc2l6ZQkJPSBQQUdFX1NJWkU7CisJYWktPmFsbG9jX3NpemUJCT0gUEVSQ1BVX1BBR0VfU0laRTsKKworCS8qCisJICogQ1BVcyBhcmUgcHV0IGludG8gZ3JvdXBzIGFjY29yZGluZyB0byBub2RlLiAgV2FsayBjcHVfbWFwCisJICogYW5kIGNyZWF0ZSBuZXcgZ3JvdXBzIGF0IG5vZGUgYm91bmRhcmllcy4KKwkgKi8KKwlwcmV2X25vZGUgPSAtMTsKKwlhaS0+bnJfZ3JvdXBzID0gMDsKKwlmb3IgKHVuaXQgPSAwOyB1bml0IDwgbnJfdW5pdHM7IHVuaXQrKykgeworCQljcHUgPSBjcHVfbWFwW3VuaXRdOworCQlub2RlID0gbm9kZV9jcHVpZFtjcHVdLm5pZDsKKworCQlpZiAobm9kZSA9PSBwcmV2X25vZGUpIHsKKwkJCWdpLT5ucl91bml0cysrOworCQkJY29udGludWU7CisJCX0KKwkJcHJldl9ub2RlID0gbm9kZTsKKworCQlnaSA9ICZhaS0+Z3JvdXBzW2FpLT5ucl9ncm91cHMrK107CisJCWdpLT5ucl91bml0cwkJPSAxOworCQlnaS0+YmFzZV9vZmZzZXQJCT0gX19wZXJfY3B1X29mZnNldFtjcHVdICsgYmFzZV9vZmZzZXQ7CisJCWdpLT5jcHVfbWFwCQk9ICZjcHVfbWFwW3VuaXRdOworCX0KKworCXJjID0gcGNwdV9zZXR1cF9maXJzdF9jaHVuayhhaSwgYmFzZSk7CisJaWYgKHJjKQorCQlwYW5pYygiZmFpbGVkIHRvIHNldHVwIHBlcmNwdSBhcmVhIChlcnI9JWQpIiwgcmMpOworCisJcGNwdV9mcmVlX2FsbG9jX2luZm8oYWkpOworfQorI2VuZGlmCisKIC8qKgogICogZmlsbF9wZXJub2RlIC0gaW5pdGlhbGl6ZSBwZXJub2RlIGRhdGEuCiAgKiBAbm9kZTogdGhlIG5vZGUgaWQuCkBAIC0zNTIsNyArNDUwLDggQEAKIAkvKiBTZXQgdGhlIG5vZGVfZGF0YSBwb2ludGVyIGZvciBlYWNoIHBlci1jcHUgc3RydWN0ICovCiAJZm9yX2VhY2hfcG9zc2libGVfZWFybHlfY3B1KGNwdSkgewogCQlub2RlID0gbm9kZV9jcHVpZFtjcHVdLm5pZDsKLQkJcGVyX2NwdShjcHVfaW5mbywgY3B1KS5ub2RlX2RhdGEgPSBtZW1fZGF0YVtub2RlXS5ub2RlX2RhdGE7CisJCXBlcl9jcHUoaWE2NF9jcHVfaW5mbywgY3B1KS5ub2RlX2RhdGEgPQorCQkJbWVtX2RhdGFbbm9kZV0ubm9kZV9kYXRhOwogCX0KICNlbHNlCiAJewpAQCAtMzYwLDcgKzQ1OSw3IEBACiAJCWNwdSA9IDA7CiAJCW5vZGUgPSBub2RlX2NwdWlkW2NwdV0ubmlkOwogCQljcHUwX2NwdV9pbmZvID0gKHN0cnVjdCBjcHVpbmZvX2lhNjQgKikoX19waHlzX3Blcl9jcHVfc3RhcnQgKwotCQkJKChjaGFyICopJnBlcl9jcHVfX2NwdV9pbmZvIC0gX19wZXJfY3B1X3N0YXJ0KSk7CisJCQkoKGNoYXIgKikmcGVyX2NwdV9faWE2NF9jcHVfaW5mbyAtIF9fcGVyX2NwdV9zdGFydCkpOwogCQljcHUwX2NwdV9pbmZvLT5ub2RlX2RhdGEgPSBtZW1fZGF0YVtub2RlXS5ub2RlX2RhdGE7CiAJfQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KQEAgLTY2Niw5ICs3NjUsOSBAQAogCXNwYXJzZV9pbml0KCk7CiAKICNpZmRlZiBDT05GSUdfVklSVFVBTF9NRU1fTUFQCi0Jdm1hbGxvY19lbmQgLT0gUEFHRV9BTElHTihBTElHTihtYXhfbG93X3BmbiwgTUFYX09SREVSX05SX1BBR0VTKSAqCisJVk1BTExPQ19FTkQgLT0gUEFHRV9BTElHTihBTElHTihtYXhfbG93X3BmbiwgTUFYX09SREVSX05SX1BBR0VTKSAqCiAJCXNpemVvZihzdHJ1Y3QgcGFnZSkpOwotCXZtZW1fbWFwID0gKHN0cnVjdCBwYWdlICopIHZtYWxsb2NfZW5kOworCXZtZW1fbWFwID0gKHN0cnVjdCBwYWdlICopIFZNQUxMT0NfRU5EOwogCWVmaV9tZW1tYXBfd2FsayhjcmVhdGVfbWVtX21hcF9wYWdlX3RhYmxlLCBOVUxMKTsKIAlwcmludGsoIlZpcnR1YWwgbWVtX21hcCBzdGFydHMgYXQgMHglcFxuIiwgdm1lbV9tYXApOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvbW0vaW5pdC5jIGIvYXJjaC9pYTY0L21tL2luaXQuYwppbmRleCAxODU3NzY2Li5iOTYwOWM2IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvbW0vaW5pdC5jCisrKyBiL2FyY2gvaWE2NC9tbS9pbml0LmMKQEAgLTQ0LDggKzQ0LDggQEAKIHVuc2lnbmVkIGxvbmcgTUFYX0RNQV9BRERSRVNTID0gUEFHRV9PRkZTRVQgKyAweDEwMDAwMDAwMFVMOwogCiAjaWZkZWYgQ09ORklHX1ZJUlRVQUxfTUVNX01BUAotdW5zaWduZWQgbG9uZyB2bWFsbG9jX2VuZCA9IFZNQUxMT0NfRU5EX0lOSVQ7Ci1FWFBPUlRfU1lNQk9MKHZtYWxsb2NfZW5kKTsKK3Vuc2lnbmVkIGxvbmcgVk1BTExPQ19FTkQgPSBWTUFMTE9DX0VORF9JTklUOworRVhQT1JUX1NZTUJPTChWTUFMTE9DX0VORCk7CiBzdHJ1Y3QgcGFnZSAqdm1lbV9tYXA7CiBFWFBPUlRfU1lNQk9MKHZtZW1fbWFwKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3BjaS9wY2kuYyBiL2FyY2gvaWE2NC9wY2kvcGNpLmMKaW5kZXggYzBmY2EyYy4uZGY2MzlkYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9wY2kvcGNpLmMKKysrIGIvYXJjaC9pYTY0L3BjaS9wY2kuYwpAQCAtMTMxLDYgKzEzMSw3IEBACiB9CiAKIHN0cnVjdCBwY2lfcm9vdF9pbmZvIHsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmJyaWRnZTsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXI7CiAJY2hhciAqbmFtZTsKIH07CkBAIC0yOTcsOSArMjk4LDIwIEBACiAJd2luZG93LT5vZmZzZXQgPSBvZmZzZXQ7CiAKIAlpZiAoaW5zZXJ0X3Jlc291cmNlKHJvb3QsICZ3aW5kb3ctPnJlc291cmNlKSkgewotCQlwcmludGsoS0VSTl9FUlIgImFsbG9jIDB4JWxseC0weCVsbHggZnJvbSAlcyBmb3IgJXMgZmFpbGVkXG4iLAotCQkJd2luZG93LT5yZXNvdXJjZS5zdGFydCwgd2luZG93LT5yZXNvdXJjZS5lbmQsCi0JCQlyb290LT5uYW1lLCBpbmZvLT5uYW1lKTsKKwkJZGV2X2VycigmaW5mby0+YnJpZGdlLT5kZXYsCisJCQkiY2FuJ3QgYWxsb2NhdGUgaG9zdCBicmlkZ2Ugd2luZG93ICVwUlxuIiwKKwkJCSZ3aW5kb3ctPnJlc291cmNlKTsKKwl9IGVsc2UgeworCQlpZiAob2Zmc2V0KQorCQkJZGV2X2luZm8oJmluZm8tPmJyaWRnZS0+ZGV2LCAiaG9zdCBicmlkZ2Ugd2luZG93ICVwUiAiCisJCQkJICIoUENJIGFkZHJlc3MgWyUjbGx4LSUjbGx4XSlcbiIsCisJCQkJICZ3aW5kb3ctPnJlc291cmNlLAorCQkJCSB3aW5kb3ctPnJlc291cmNlLnN0YXJ0IC0gb2Zmc2V0LAorCQkJCSB3aW5kb3ctPnJlc291cmNlLmVuZCAtIG9mZnNldCk7CisJCWVsc2UKKwkJCWRldl9pbmZvKCZpbmZvLT5icmlkZ2UtPmRldiwKKwkJCQkgImhvc3QgYnJpZGdlIHdpbmRvdyAlcFJcbiIsCisJCQkJICZ3aW5kb3ctPnJlc291cmNlKTsKIAl9CiAKIAlyZXR1cm4gQUVfT0s7CkBAIC0zMTksOCArMzMxLDkgQEAKIAkJICAgIChyZXMtPmVuZCAtIHJlcy0+c3RhcnQgPCAxNikpCiAJCQljb250aW51ZTsKIAkJaWYgKGogPj0gUENJX0JVU19OVU1fUkVTT1VSQ0VTKSB7Ci0JCQlwcmludGsoIklnbm9yaW5nIHJhbmdlIFslI2xseC0lI2xseF0gKCVseClcbiIsCi0JCQkJCXJlcy0+c3RhcnQsIHJlcy0+ZW5kLCByZXMtPmZsYWdzKTsKKwkJCWRldl93YXJuKCZidXMtPmRldiwKKwkJCQkgImlnbm9yaW5nIGhvc3QgYnJpZGdlIHdpbmRvdyAlcFIgKG5vIHNwYWNlKVxuIiwKKwkJCQkgcmVzKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWJ1cy0+cmVzb3VyY2VbaisrXSA9IHJlczsKQEAgLTM2NCw2ICszNzcsNyBAQAogCQkJZ290byBvdXQzOwogCiAJCXNwcmludGYobmFtZSwgIlBDSSBCdXMgJTA0eDolMDJ4IiwgZG9tYWluLCBidXMpOworCQlpbmZvLmJyaWRnZSA9IGRldmljZTsKIAkJaW5mby5jb250cm9sbGVyID0gY29udHJvbGxlcjsKIAkJaW5mby5uYW1lID0gbmFtZTsKIAkJYWNwaV93YWxrX3Jlc291cmNlcyhkZXZpY2UtPmhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywKQEAgLTcyMCw5ICs3MzQsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qIEl0J3MgZGVmaW5lZCBpbiBkcml2ZXJzL3BjaS9wY2kuYyAqLwotZXh0ZXJuIHU4IHBjaV9jYWNoZV9saW5lX3NpemU7Ci0KIC8qKgogICogc2V0X3BjaV9jYWNoZWxpbmVfc2l6ZSAtIGRldGVybWluZSBjYWNoZWxpbmUgc2l6ZSBmb3IgUENJIGRldmljZXMKICAqCkBAIC03MzEsNyArNzQyLDcgQEAKICAqCiAgKiBDb2RlIG1vc3RseSB0YWtlbiBmcm9tIGFyY2gvaWE2NC9rZXJuZWwvcGFsaW5mby5jOmNhY2hlX2luZm8oKS4KICAqLwotc3RhdGljIHZvaWQgX19pbml0IHNldF9wY2lfY2FjaGVsaW5lX3NpemUodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXRfcGNpX2RmbF9jYWNoZWxpbmVfc2l6ZSh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgbGV2ZWxzLCB1bmlxdWVfY2FjaGVzOwogCWxvbmcgc3RhdHVzOwpAQCAtNzUxLDcgKzc2Miw3IEBACiAJCQkiKHN0YXR1cz0lbGQpXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KLQlwY2lfY2FjaGVfbGluZV9zaXplID0gKDEgPDwgY2NpLnBjY2lfbGluZV9zaXplKSAvIDQ7CisJcGNpX2RmbF9jYWNoZV9saW5lX3NpemUgPSAoMSA8PCBjY2kucGNjaV9saW5lX3NpemUpIC8gNDsKIH0KIAogdTY0IGlhNjRfZG1hX2dldF9yZXF1aXJlZF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTc4Miw3ICs3OTMsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBwY2liaW9zX2luaXQodm9pZCkKIHsKLQlzZXRfcGNpX2NhY2hlbGluZV9zaXplKCk7CisJc2V0X3BjaV9kZmxfY2FjaGVsaW5lX3NpemUoKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc24yX3NtcC5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc24yX3NtcC5jCmluZGV4IDExNzY1MDYuLmU4ODRiYTQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL3NuMl9zbXAuYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL3NuMi9zbjJfc21wLmMKQEAgLTQ5NiwxMyArNDk2LDEzIEBACiAJCXNlcV9wcmludGYoZmlsZSwgImNwdSAlZCAlbGQgJWxkICVsZCAlbGQgJWxkICVsZCAlbGQgJWxkICVsZCAlbGQgJWxkICVsZFxuIiwgY3B1LCBzdGF0LT5wdGNfbCwKIAkJCQlzdGF0LT5jaGFuZ2VfcmlkLCBzdGF0LT5zaHViX3B0Y19mbHVzaGVzLCBzdGF0LT5ub2Rlc19mbHVzaGVkLAogCQkJCXN0YXQtPmRlYWRsb2NrcywKLQkJCQkxMDAwICogc3RhdC0+bG9ja19pdGNfY2xvY2tzIC8gcGVyX2NwdShjcHVfaW5mbywgY3B1KS5jeWNfcGVyX3VzZWMsCi0JCQkJMTAwMCAqIHN0YXQtPnNodWJfaXRjX2Nsb2NrcyAvIHBlcl9jcHUoY3B1X2luZm8sIGNwdSkuY3ljX3Blcl91c2VjLAotCQkJCTEwMDAgKiBzdGF0LT5zaHViX2l0Y19jbG9ja3NfbWF4IC8gcGVyX2NwdShjcHVfaW5mbywgY3B1KS5jeWNfcGVyX3VzZWMsCisJCQkJMTAwMCAqIHN0YXQtPmxvY2tfaXRjX2Nsb2NrcyAvIHBlcl9jcHUoaWE2NF9jcHVfaW5mbywgY3B1KS5jeWNfcGVyX3VzZWMsCisJCQkJMTAwMCAqIHN0YXQtPnNodWJfaXRjX2Nsb2NrcyAvIHBlcl9jcHUoaWE2NF9jcHVfaW5mbywgY3B1KS5jeWNfcGVyX3VzZWMsCisJCQkJMTAwMCAqIHN0YXQtPnNodWJfaXRjX2Nsb2Nrc19tYXggLyBwZXJfY3B1KGlhNjRfY3B1X2luZm8sIGNwdSkuY3ljX3Blcl91c2VjLAogCQkJCXN0YXQtPnNodWJfcHRjX2ZsdXNoZXNfbm90X215X21tLAogCQkJCXN0YXQtPmRlYWRsb2NrczIsCiAJCQkJc3RhdC0+c2h1Yl9pcGlfZmx1c2hlcywKLQkJCQkxMDAwICogc3RhdC0+c2h1Yl9pcGlfZmx1c2hlc19pdGNfY2xvY2tzIC8gcGVyX2NwdShjcHVfaW5mbywgY3B1KS5jeWNfcGVyX3VzZWMpOworCQkJCTEwMDAgKiBzdGF0LT5zaHViX2lwaV9mbHVzaGVzX2l0Y19jbG9ja3MgLyBwZXJfY3B1KGlhNjRfY3B1X2luZm8sIGNwdSkuY3ljX3Blcl91c2VjKTsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQveGVuL2lycV94ZW4uYyBiL2FyY2gvaWE2NC94ZW4vaXJxX3hlbi5jCmluZGV4IGYwNDJlMTkuLmEzZmI3Y2YgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC94ZW4vaXJxX3hlbi5jCisrKyBiL2FyY2gvaWE2NC94ZW4vaXJxX3hlbi5jCkBAIC02MywxOSArNjMsMTkgQEAKIH0KIAogCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCB0aW1lcl9pcnEpID0gLTE7Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBpcGlfaXJxKSA9IC0xOwotc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgcmVzY2hlZF9pcnEpID0gLTE7Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBjbWNfaXJxKSA9IC0xOwotc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgY21jcF9pcnEpID0gLTE7Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBjcGVwX2lycSkgPSAtMTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIHhlbl90aW1lcl9pcnEpID0gLTE7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCB4ZW5faXBpX2lycSkgPSAtMTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIHhlbl9yZXNjaGVkX2lycSkgPSAtMTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIHhlbl9jbWNfaXJxKSA9IC0xOworc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgeGVuX2NtY3BfaXJxKSA9IC0xOworc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgeGVuX2NwZXBfaXJxKSA9IC0xOwogI2RlZmluZSBOQU1FX1NJWkUJMTUKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShjaGFyW05BTUVfU0laRV0sIHRpbWVyX25hbWUpOwotc3RhdGljIERFRklORV9QRVJfQ1BVKGNoYXJbTkFNRV9TSVpFXSwgaXBpX25hbWUpOwotc3RhdGljIERFRklORV9QRVJfQ1BVKGNoYXJbTkFNRV9TSVpFXSwgcmVzY2hlZF9uYW1lKTsKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShjaGFyW05BTUVfU0laRV0sIGNtY19uYW1lKTsKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShjaGFyW05BTUVfU0laRV0sIGNtY3BfbmFtZSk7Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUoY2hhcltOQU1FX1NJWkVdLCBjcGVwX25hbWUpOworc3RhdGljIERFRklORV9QRVJfQ1BVKGNoYXJbTkFNRV9TSVpFXSwgeGVuX3RpbWVyX25hbWUpOworc3RhdGljIERFRklORV9QRVJfQ1BVKGNoYXJbTkFNRV9TSVpFXSwgeGVuX2lwaV9uYW1lKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShjaGFyW05BTUVfU0laRV0sIHhlbl9yZXNjaGVkX25hbWUpOworc3RhdGljIERFRklORV9QRVJfQ1BVKGNoYXJbTkFNRV9TSVpFXSwgeGVuX2NtY19uYW1lKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShjaGFyW05BTUVfU0laRV0sIHhlbl9jbWNwX25hbWUpOworc3RhdGljIERFRklORV9QRVJfQ1BVKGNoYXJbTkFNRV9TSVpFXSwgeGVuX2NwZXBfbmFtZSk7CiAjdW5kZWYgTkFNRV9TSVpFCiAKIHN0cnVjdCBzYXZlZF9pcnEgewpAQCAtMTQ0LDY0ICsxNDQsNjQgQEAKIAlpZiAoeGVuX3NsYWJfcmVhZHkpIHsKIAkJc3dpdGNoICh2ZWMpIHsKIAkJY2FzZSBJQTY0X1RJTUVSX1ZFQ1RPUjoKLQkJCXNucHJpbnRmKHBlcl9jcHUodGltZXJfbmFtZSwgY3B1KSwKLQkJCQkgc2l6ZW9mKHBlcl9jcHUodGltZXJfbmFtZSwgY3B1KSksCisJCQlzbnByaW50ZihwZXJfY3B1KHhlbl90aW1lcl9uYW1lLCBjcHUpLAorCQkJCSBzaXplb2YocGVyX2NwdSh4ZW5fdGltZXJfbmFtZSwgY3B1KSksCiAJCQkJICIlcyVkIiwgYWN0aW9uLT5uYW1lLCBjcHUpOwogCQkJaXJxID0gYmluZF92aXJxX3RvX2lycWhhbmRsZXIoVklSUV9JVEMsIGNwdSwKIAkJCQlhY3Rpb24tPmhhbmRsZXIsIGFjdGlvbi0+ZmxhZ3MsCi0JCQkJcGVyX2NwdSh0aW1lcl9uYW1lLCBjcHUpLCBhY3Rpb24tPmRldl9pZCk7Ci0JCQlwZXJfY3B1KHRpbWVyX2lycSwgY3B1KSA9IGlycTsKKwkJCQlwZXJfY3B1KHhlbl90aW1lcl9uYW1lLCBjcHUpLCBhY3Rpb24tPmRldl9pZCk7CisJCQlwZXJfY3B1KHhlbl90aW1lcl9pcnEsIGNwdSkgPSBpcnE7CiAJCQlicmVhazsKIAkJY2FzZSBJQTY0X0lQSV9SRVNDSEVEVUxFOgotCQkJc25wcmludGYocGVyX2NwdShyZXNjaGVkX25hbWUsIGNwdSksCi0JCQkJIHNpemVvZihwZXJfY3B1KHJlc2NoZWRfbmFtZSwgY3B1KSksCisJCQlzbnByaW50ZihwZXJfY3B1KHhlbl9yZXNjaGVkX25hbWUsIGNwdSksCisJCQkJIHNpemVvZihwZXJfY3B1KHhlbl9yZXNjaGVkX25hbWUsIGNwdSkpLAogCQkJCSAiJXMlZCIsIGFjdGlvbi0+bmFtZSwgY3B1KTsKIAkJCWlycSA9IGJpbmRfaXBpX3RvX2lycWhhbmRsZXIoWEVOX1JFU0NIRURVTEVfVkVDVE9SLCBjcHUsCiAJCQkJYWN0aW9uLT5oYW5kbGVyLCBhY3Rpb24tPmZsYWdzLAotCQkJCXBlcl9jcHUocmVzY2hlZF9uYW1lLCBjcHUpLCBhY3Rpb24tPmRldl9pZCk7Ci0JCQlwZXJfY3B1KHJlc2NoZWRfaXJxLCBjcHUpID0gaXJxOworCQkJCXBlcl9jcHUoeGVuX3Jlc2NoZWRfbmFtZSwgY3B1KSwgYWN0aW9uLT5kZXZfaWQpOworCQkJcGVyX2NwdSh4ZW5fcmVzY2hlZF9pcnEsIGNwdSkgPSBpcnE7CiAJCQlicmVhazsKIAkJY2FzZSBJQTY0X0lQSV9WRUNUT1I6Ci0JCQlzbnByaW50ZihwZXJfY3B1KGlwaV9uYW1lLCBjcHUpLAotCQkJCSBzaXplb2YocGVyX2NwdShpcGlfbmFtZSwgY3B1KSksCisJCQlzbnByaW50ZihwZXJfY3B1KHhlbl9pcGlfbmFtZSwgY3B1KSwKKwkJCQkgc2l6ZW9mKHBlcl9jcHUoeGVuX2lwaV9uYW1lLCBjcHUpKSwKIAkJCQkgIiVzJWQiLCBhY3Rpb24tPm5hbWUsIGNwdSk7CiAJCQlpcnEgPSBiaW5kX2lwaV90b19pcnFoYW5kbGVyKFhFTl9JUElfVkVDVE9SLCBjcHUsCiAJCQkJYWN0aW9uLT5oYW5kbGVyLCBhY3Rpb24tPmZsYWdzLAotCQkJCXBlcl9jcHUoaXBpX25hbWUsIGNwdSksIGFjdGlvbi0+ZGV2X2lkKTsKLQkJCXBlcl9jcHUoaXBpX2lycSwgY3B1KSA9IGlycTsKKwkJCQlwZXJfY3B1KHhlbl9pcGlfbmFtZSwgY3B1KSwgYWN0aW9uLT5kZXZfaWQpOworCQkJcGVyX2NwdSh4ZW5faXBpX2lycSwgY3B1KSA9IGlycTsKIAkJCWJyZWFrOwogCQljYXNlIElBNjRfQ01DX1ZFQ1RPUjoKLQkJCXNucHJpbnRmKHBlcl9jcHUoY21jX25hbWUsIGNwdSksCi0JCQkJIHNpemVvZihwZXJfY3B1KGNtY19uYW1lLCBjcHUpKSwKKwkJCXNucHJpbnRmKHBlcl9jcHUoeGVuX2NtY19uYW1lLCBjcHUpLAorCQkJCSBzaXplb2YocGVyX2NwdSh4ZW5fY21jX25hbWUsIGNwdSkpLAogCQkJCSAiJXMlZCIsIGFjdGlvbi0+bmFtZSwgY3B1KTsKIAkJCWlycSA9IGJpbmRfdmlycV90b19pcnFoYW5kbGVyKFZJUlFfTUNBX0NNQywgY3B1LAotCQkJCQkJICAgICAgYWN0aW9uLT5oYW5kbGVyLAotCQkJCQkJICAgICAgYWN0aW9uLT5mbGFncywKLQkJCQkJCSAgICAgIHBlcl9jcHUoY21jX25hbWUsIGNwdSksCi0JCQkJCQkgICAgICBhY3Rpb24tPmRldl9pZCk7Ci0JCQlwZXJfY3B1KGNtY19pcnEsIGNwdSkgPSBpcnE7CisJCQkJCQlhY3Rpb24tPmhhbmRsZXIsCisJCQkJCQlhY3Rpb24tPmZsYWdzLAorCQkJCQkJcGVyX2NwdSh4ZW5fY21jX25hbWUsIGNwdSksCisJCQkJCQlhY3Rpb24tPmRldl9pZCk7CisJCQlwZXJfY3B1KHhlbl9jbWNfaXJxLCBjcHUpID0gaXJxOwogCQkJYnJlYWs7CiAJCWNhc2UgSUE2NF9DTUNQX1ZFQ1RPUjoKLQkJCXNucHJpbnRmKHBlcl9jcHUoY21jcF9uYW1lLCBjcHUpLAotCQkJCSBzaXplb2YocGVyX2NwdShjbWNwX25hbWUsIGNwdSkpLAorCQkJc25wcmludGYocGVyX2NwdSh4ZW5fY21jcF9uYW1lLCBjcHUpLAorCQkJCSBzaXplb2YocGVyX2NwdSh4ZW5fY21jcF9uYW1lLCBjcHUpKSwKIAkJCQkgIiVzJWQiLCBhY3Rpb24tPm5hbWUsIGNwdSk7CiAJCQlpcnEgPSBiaW5kX2lwaV90b19pcnFoYW5kbGVyKFhFTl9DTUNQX1ZFQ1RPUiwgY3B1LAotCQkJCQkJICAgICBhY3Rpb24tPmhhbmRsZXIsCi0JCQkJCQkgICAgIGFjdGlvbi0+ZmxhZ3MsCi0JCQkJCQkgICAgIHBlcl9jcHUoY21jcF9uYW1lLCBjcHUpLAotCQkJCQkJICAgICBhY3Rpb24tPmRldl9pZCk7Ci0JCQlwZXJfY3B1KGNtY3BfaXJxLCBjcHUpID0gaXJxOworCQkJCQkJYWN0aW9uLT5oYW5kbGVyLAorCQkJCQkJYWN0aW9uLT5mbGFncywKKwkJCQkJCXBlcl9jcHUoeGVuX2NtY3BfbmFtZSwgY3B1KSwKKwkJCQkJCWFjdGlvbi0+ZGV2X2lkKTsKKwkJCXBlcl9jcHUoeGVuX2NtY3BfaXJxLCBjcHUpID0gaXJxOwogCQkJYnJlYWs7CiAJCWNhc2UgSUE2NF9DUEVQX1ZFQ1RPUjoKLQkJCXNucHJpbnRmKHBlcl9jcHUoY3BlcF9uYW1lLCBjcHUpLAotCQkJCSBzaXplb2YocGVyX2NwdShjcGVwX25hbWUsIGNwdSkpLAorCQkJc25wcmludGYocGVyX2NwdSh4ZW5fY3BlcF9uYW1lLCBjcHUpLAorCQkJCSBzaXplb2YocGVyX2NwdSh4ZW5fY3BlcF9uYW1lLCBjcHUpKSwKIAkJCQkgIiVzJWQiLCBhY3Rpb24tPm5hbWUsIGNwdSk7CiAJCQlpcnEgPSBiaW5kX2lwaV90b19pcnFoYW5kbGVyKFhFTl9DUEVQX1ZFQ1RPUiwgY3B1LAotCQkJCQkJICAgICBhY3Rpb24tPmhhbmRsZXIsCi0JCQkJCQkgICAgIGFjdGlvbi0+ZmxhZ3MsCi0JCQkJCQkgICAgIHBlcl9jcHUoY3BlcF9uYW1lLCBjcHUpLAotCQkJCQkJICAgICBhY3Rpb24tPmRldl9pZCk7Ci0JCQlwZXJfY3B1KGNwZXBfaXJxLCBjcHUpID0gaXJxOworCQkJCQkJYWN0aW9uLT5oYW5kbGVyLAorCQkJCQkJYWN0aW9uLT5mbGFncywKKwkJCQkJCXBlcl9jcHUoeGVuX2NwZXBfbmFtZSwgY3B1KSwKKwkJCQkJCWFjdGlvbi0+ZGV2X2lkKTsKKwkJCXBlcl9jcHUoeGVuX2NwZXBfaXJxLCBjcHUpID0gaXJxOwogCQkJYnJlYWs7CiAJCWNhc2UgSUE2NF9DUEVfVkVDVE9SOgogCQljYXNlIElBNjRfTUNBX1JFTkRFWl9WRUNUT1I6CkBAIC0yNzUsMzAgKzI3NSwzMyBAQAogCiAJaWYgKGFjdGlvbiA9PSBDUFVfREVBRCkgewogCQkvKiBVbnJlZ2lzdGVyIGV2dGNobi4gICovCi0JCWlmIChwZXJfY3B1KGNwZXBfaXJxLCBjcHUpID49IDApIHsKLQkJCXVuYmluZF9mcm9tX2lycWhhbmRsZXIocGVyX2NwdShjcGVwX2lycSwgY3B1KSwgTlVMTCk7Ci0JCQlwZXJfY3B1KGNwZXBfaXJxLCBjcHUpID0gLTE7CisJCWlmIChwZXJfY3B1KHhlbl9jcGVwX2lycSwgY3B1KSA+PSAwKSB7CisJCQl1bmJpbmRfZnJvbV9pcnFoYW5kbGVyKHBlcl9jcHUoeGVuX2NwZXBfaXJxLCBjcHUpLAorCQkJCQkgICAgICAgTlVMTCk7CisJCQlwZXJfY3B1KHhlbl9jcGVwX2lycSwgY3B1KSA9IC0xOwogCQl9Ci0JCWlmIChwZXJfY3B1KGNtY3BfaXJxLCBjcHUpID49IDApIHsKLQkJCXVuYmluZF9mcm9tX2lycWhhbmRsZXIocGVyX2NwdShjbWNwX2lycSwgY3B1KSwgTlVMTCk7Ci0JCQlwZXJfY3B1KGNtY3BfaXJxLCBjcHUpID0gLTE7CisJCWlmIChwZXJfY3B1KHhlbl9jbWNwX2lycSwgY3B1KSA+PSAwKSB7CisJCQl1bmJpbmRfZnJvbV9pcnFoYW5kbGVyKHBlcl9jcHUoeGVuX2NtY3BfaXJxLCBjcHUpLAorCQkJCQkgICAgICAgTlVMTCk7CisJCQlwZXJfY3B1KHhlbl9jbWNwX2lycSwgY3B1KSA9IC0xOwogCQl9Ci0JCWlmIChwZXJfY3B1KGNtY19pcnEsIGNwdSkgPj0gMCkgewotCQkJdW5iaW5kX2Zyb21faXJxaGFuZGxlcihwZXJfY3B1KGNtY19pcnEsIGNwdSksIE5VTEwpOwotCQkJcGVyX2NwdShjbWNfaXJxLCBjcHUpID0gLTE7CisJCWlmIChwZXJfY3B1KHhlbl9jbWNfaXJxLCBjcHUpID49IDApIHsKKwkJCXVuYmluZF9mcm9tX2lycWhhbmRsZXIocGVyX2NwdSh4ZW5fY21jX2lycSwgY3B1KSwgTlVMTCk7CisJCQlwZXJfY3B1KHhlbl9jbWNfaXJxLCBjcHUpID0gLTE7CiAJCX0KLQkJaWYgKHBlcl9jcHUoaXBpX2lycSwgY3B1KSA+PSAwKSB7Ci0JCQl1bmJpbmRfZnJvbV9pcnFoYW5kbGVyKHBlcl9jcHUoaXBpX2lycSwgY3B1KSwgTlVMTCk7Ci0JCQlwZXJfY3B1KGlwaV9pcnEsIGNwdSkgPSAtMTsKKwkJaWYgKHBlcl9jcHUoeGVuX2lwaV9pcnEsIGNwdSkgPj0gMCkgeworCQkJdW5iaW5kX2Zyb21faXJxaGFuZGxlcihwZXJfY3B1KHhlbl9pcGlfaXJxLCBjcHUpLCBOVUxMKTsKKwkJCXBlcl9jcHUoeGVuX2lwaV9pcnEsIGNwdSkgPSAtMTsKIAkJfQotCQlpZiAocGVyX2NwdShyZXNjaGVkX2lycSwgY3B1KSA+PSAwKSB7Ci0JCQl1bmJpbmRfZnJvbV9pcnFoYW5kbGVyKHBlcl9jcHUocmVzY2hlZF9pcnEsIGNwdSksCi0JCQkJCQlOVUxMKTsKLQkJCXBlcl9jcHUocmVzY2hlZF9pcnEsIGNwdSkgPSAtMTsKKwkJaWYgKHBlcl9jcHUoeGVuX3Jlc2NoZWRfaXJxLCBjcHUpID49IDApIHsKKwkJCXVuYmluZF9mcm9tX2lycWhhbmRsZXIocGVyX2NwdSh4ZW5fcmVzY2hlZF9pcnEsIGNwdSksCisJCQkJCSAgICAgICBOVUxMKTsKKwkJCXBlcl9jcHUoeGVuX3Jlc2NoZWRfaXJxLCBjcHUpID0gLTE7CiAJCX0KLQkJaWYgKHBlcl9jcHUodGltZXJfaXJxLCBjcHUpID49IDApIHsKLQkJCXVuYmluZF9mcm9tX2lycWhhbmRsZXIocGVyX2NwdSh0aW1lcl9pcnEsIGNwdSksIE5VTEwpOwotCQkJcGVyX2NwdSh0aW1lcl9pcnEsIGNwdSkgPSAtMTsKKwkJaWYgKHBlcl9jcHUoeGVuX3RpbWVyX2lycSwgY3B1KSA+PSAwKSB7CisJCQl1bmJpbmRfZnJvbV9pcnFoYW5kbGVyKHBlcl9jcHUoeGVuX3RpbWVyX2lycSwgY3B1KSwKKwkJCQkJICAgICAgIE5VTEwpOworCQkJcGVyX2NwdSh4ZW5fdGltZXJfaXJxLCBjcHUpID0gLTE7CiAJCX0KIAl9CiAJcmV0dXJuIE5PVElGWV9PSzsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC94ZW4vdGltZS5jIGIvYXJjaC9pYTY0L3hlbi90aW1lLmMKaW5kZXggZGJlYWRiOS4uYzFjNTQ0NSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3hlbi90aW1lLmMKKysrIGIvYXJjaC9pYTY0L3hlbi90aW1lLmMKQEAgLTM0LDE1ICszNCwxNSBAQAogCiAjaW5jbHVkZSAiLi4va2VybmVsL2ZzeXNjYWxsX2d0b2RfZGF0YS5oIgogCi1ERUZJTkVfUEVSX0NQVShzdHJ1Y3QgdmNwdV9ydW5zdGF0ZV9pbmZvLCBydW5zdGF0ZSk7Ci1ERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBwcm9jZXNzZWRfc3RvbGVuX3RpbWUpOwotREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgcHJvY2Vzc2VkX2Jsb2NrZWRfdGltZSk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHZjcHVfcnVuc3RhdGVfaW5mbywgeGVuX3J1bnN0YXRlKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCB4ZW5fc3RvbGVuX3RpbWUpOworc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIHhlbl9ibG9ja2VkX3RpbWUpOwogCiAvKiB0YWtlbiBmcm9tIGkzODYva2VybmVsL3RpbWUteGVuLmMgKi8KIHN0YXRpYyB2b2lkIHhlbl9pbml0X21pc3NpbmdfdGlja3NfYWNjb3VudGluZyhpbnQgY3B1KQogewogCXN0cnVjdCB2Y3B1X3JlZ2lzdGVyX3J1bnN0YXRlX21lbW9yeV9hcmVhIGFyZWE7Ci0Jc3RydWN0IHZjcHVfcnVuc3RhdGVfaW5mbyAqcnVuc3RhdGUgPSAmcGVyX2NwdShydW5zdGF0ZSwgY3B1KTsKKwlzdHJ1Y3QgdmNwdV9ydW5zdGF0ZV9pbmZvICpydW5zdGF0ZSA9ICZwZXJfY3B1KHhlbl9ydW5zdGF0ZSwgY3B1KTsKIAlpbnQgcmM7CiAKIAltZW1zZXQocnVuc3RhdGUsIDAsIHNpemVvZigqcnVuc3RhdGUpKTsKQEAgLTUyLDggKzUyLDggQEAKIAkJCQkmYXJlYSk7CiAJV0FSTl9PTihyYyAmJiByYyAhPSAtRU5PU1lTKTsKIAotCXBlcl9jcHUocHJvY2Vzc2VkX2Jsb2NrZWRfdGltZSwgY3B1KSA9IHJ1bnN0YXRlLT50aW1lW1JVTlNUQVRFX2Jsb2NrZWRdOwotCXBlcl9jcHUocHJvY2Vzc2VkX3N0b2xlbl90aW1lLCBjcHUpID0gcnVuc3RhdGUtPnRpbWVbUlVOU1RBVEVfcnVubmFibGVdCisJcGVyX2NwdSh4ZW5fYmxvY2tlZF90aW1lLCBjcHUpID0gcnVuc3RhdGUtPnRpbWVbUlVOU1RBVEVfYmxvY2tlZF07CisJcGVyX2NwdSh4ZW5fc3RvbGVuX3RpbWUsIGNwdSkgPSBydW5zdGF0ZS0+dGltZVtSVU5TVEFURV9ydW5uYWJsZV0KIAkJCQkJICAgICsgcnVuc3RhdGUtPnRpbWVbUlVOU1RBVEVfb2ZmbGluZV07CiB9CiAKQEAgLTY4LDcgKzY4LDcgQEAKIAogCUJVR19PTihwcmVlbXB0aWJsZSgpKTsKIAotCXN0YXRlID0gJl9fZ2V0X2NwdV92YXIocnVuc3RhdGUpOworCXN0YXRlID0gJl9fZ2V0X2NwdV92YXIoeGVuX3J1bnN0YXRlKTsKIAogCS8qCiAJICogVGhlIHJ1bnN0YXRlIGluZm8gaXMgYWx3YXlzIHVwZGF0ZWQgYnkgdGhlIGh5cGVydmlzb3Igb24KQEAgLTEwMywxMiArMTAzLDEyIEBACiAJICogVGhpcyBmdW5jdGlvbiBqdXN0IGNoZWNrcyBhbmQgcmVqZWN0IHRoaXMgZWZmZWN0LgogCSAqLwogCWlmICghdGltZV9hZnRlcl9lcShydW5zdGF0ZS50aW1lW1JVTlNUQVRFX2Jsb2NrZWRdLAotCQkJICAgcGVyX2NwdShwcm9jZXNzZWRfYmxvY2tlZF90aW1lLCBjcHUpKSkKKwkJCSAgIHBlcl9jcHUoeGVuX2Jsb2NrZWRfdGltZSwgY3B1KSkpCiAJCWJsb2NrZWQgPSAwOwogCiAJaWYgKCF0aW1lX2FmdGVyX2VxKHJ1bnN0YXRlLnRpbWVbUlVOU1RBVEVfcnVubmFibGVdICsKIAkJCSAgIHJ1bnN0YXRlLnRpbWVbUlVOU1RBVEVfb2ZmbGluZV0sCi0JCQkgICBwZXJfY3B1KHByb2Nlc3NlZF9zdG9sZW5fdGltZSwgY3B1KSkpCisJCQkgICBwZXJfY3B1KHhlbl9zdG9sZW5fdGltZSwgY3B1KSkpCiAJCXN0b2xlbiA9IDA7CiAKIAlpZiAoIXRpbWVfYWZ0ZXIoZGVsdGFfaXRtICsgbmV3X2l0bSwgaWE2NF9nZXRfaXRjKCkpKQpAQCAtMTQ3LDggKzE0Nyw4IEBACiAJCX0gZWxzZSB7CiAJCQlsb2NhbF9jcHVfZGF0YS0+aXRtX25leHQgPSBkZWx0YV9pdG0gKyBuZXdfaXRtOwogCQl9Ci0JCXBlcl9jcHUocHJvY2Vzc2VkX3N0b2xlbl90aW1lLCBjcHUpICs9IE5TX1BFUl9USUNLICogc3RvbGVuOwotCQlwZXJfY3B1KHByb2Nlc3NlZF9ibG9ja2VkX3RpbWUsIGNwdSkgKz0gTlNfUEVSX1RJQ0sgKiBibG9ja2VkOworCQlwZXJfY3B1KHhlbl9zdG9sZW5fdGltZSwgY3B1KSArPSBOU19QRVJfVElDSyAqIHN0b2xlbjsKKwkJcGVyX2NwdSh4ZW5fYmxvY2tlZF90aW1lLCBjcHUpICs9IE5TX1BFUl9USUNLICogYmxvY2tlZDsKIAl9CiAJcmV0dXJuIGRlbHRhX2l0bTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvc3lzX20zMnIuYyBiL2FyY2gvbTMyci9rZXJuZWwvc3lzX20zMnIuYwppbmRleCAzMDVhYzg1Li5kM2M4NjVjIDEwMDY0NAotLS0gYS9hcmNoL20zMnIva2VybmVsL3N5c19tMzJyLmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9zeXNfbTMyci5jCkBAIC03NiwzMCArNzYsNiBAQAogCXJldHVybiBvbGR2YWw7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfbW1hcDIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQl1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCi0JdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZikKLXsKLQlpbnQgZXJyb3IgPSAtRUJBREY7Ci0Jc3RydWN0IGZpbGUgKmZpbGUgPSBOVUxMOwotCi0JZmxhZ3MgJj0gfihNQVBfRVhFQ1VUQUJMRSB8IE1BUF9ERU5ZV1JJVEUpOwotCWlmICghKGZsYWdzICYgTUFQX0FOT05ZTU9VUykpIHsKLQkJZmlsZSA9IGZnZXQoZmQpOwotCQlpZiAoIWZpbGUpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCWVycm9yID0gZG9fbW1hcF9wZ29mZihmaWxlLCBhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBwZ29mZik7Ci0JdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0KLQlpZiAoZmlsZSkKLQkJZnB1dChmaWxlKTsKLW91dDoKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KIC8qCiAgKiBzeXNfaXBjKCkgaXMgdGhlIGRlLW11bHRpcGxleGVyIGZvciB0aGUgU3lzViBJUEMgY2FsbHMuLgogICoKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvc3lzY2FsbF90YWJsZS5TIGIvYXJjaC9tMzJyL2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMKaW5kZXggYWEzYmY0Yy4uNjA1MzZlMiAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMKQEAgLTE5MSw3ICsxOTEsNyBAQAogCS5sb25nIHN5c19uaV9zeXNjYWxsCQkvKiBzdHJlYW1zMiAqLwogCS5sb25nIHN5c192Zm9yawkJCS8qIDE5MCAqLwogCS5sb25nIHN5c19nZXRybGltaXQKLQkubG9uZyBzeXNfbW1hcDIKKwkubG9uZyBzeXNfbW1hcF9wZ29mZgogCS5sb25nIHN5c190cnVuY2F0ZTY0CiAJLmxvbmcgc3lzX2Z0cnVuY2F0ZTY0CiAJLmxvbmcgc3lzX3N0YXQ2NAkJLyogMTk1ICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vcGd0YWJsZV9tbS5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3BndGFibGVfbW0uaAppbmRleCBmZTYwZTFhLi5hY2EwZTI4IDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vcGd0YWJsZV9tbS5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9wZ3RhYmxlX21tLmgKQEAgLTgzLDkgKzgzLDkgQEAKICNkZWZpbmUgVk1BTExPQ19TVEFSVCAoKCh1bnNpZ25lZCBsb25nKSBoaWdoX21lbW9yeSArIFZNQUxMT0NfT0ZGU0VUKSAmIH4oVk1BTExPQ19PRkZTRVQtMSkpCiAjZGVmaW5lIFZNQUxMT0NfRU5EIEtNQVBfU1RBUlQKICNlbHNlCi1leHRlcm4gdW5zaWduZWQgbG9uZyB2bWFsbG9jX2VuZDsKK2V4dGVybiB1bnNpZ25lZCBsb25nIG02OGtfdm1hbGxvY19lbmQ7CiAjZGVmaW5lIFZNQUxMT0NfU1RBUlQgMHgwZjgwMDAwMAotI2RlZmluZSBWTUFMTE9DX0VORCB2bWFsbG9jX2VuZAorI2RlZmluZSBWTUFMTE9DX0VORCBtNjhrX3ZtYWxsb2NfZW5kCiAjZW5kaWYgLyogQ09ORklHX1NVTjMgKi8KIAogLyogemVybyBwYWdlIHVzZWQgZm9yIHVuaW5pdGlhbGl6ZWQgc3R1ZmYgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvc3lzX202OGsuYyBiL2FyY2gvbTY4ay9rZXJuZWwvc3lzX202OGsuYwppbmRleCA3ZGViNDAyLi4yMThmNDQxIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3N5c19tNjhrLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9zeXNfbTY4ay5jCkBAIC0yOSwzNyArMjksMTYgQEAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KIAotLyogY29tbW9uIGNvZGUgZm9yIG9sZCBhbmQgbmV3IG1tYXBzICovCi1zdGF0aWMgaW5saW5lIGxvbmcgZG9fbW1hcDIoCi0JdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQl1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCi0JdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZikKLXsKLQlpbnQgZXJyb3IgPSAtRUJBREY7Ci0Jc3RydWN0IGZpbGUgKiBmaWxlID0gTlVMTDsKLQotCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGZkKTsKLQkJaWYgKCFmaWxlKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOwotCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCi0JaWYgKGZpbGUpCi0JCWZwdXQoZmlsZSk7Ci1vdXQ6Ci0JcmV0dXJuIGVycm9yOwotfQotCiBhc21saW5rYWdlIGxvbmcgc3lzX21tYXAyKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCiAJdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLAogCXVuc2lnbmVkIGxvbmcgZmQsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCiB7Ci0JcmV0dXJuIGRvX21tYXAyKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBwZ29mZik7CisJLyoKKwkgKiBUaGlzIGlzIHdyb25nIGZvciBzdW4zIC0gdGhlcmUgUEFHRV9TSVpFIGlzIDhLYiwKKwkgKiBzbyB3ZSBuZWVkIHRvIHNoaWZ0IHRoZSBhcmd1bWVudCBkb3duIGJ5IDE7IG02OGsgbW1hcDY0KDMpCisJICogKGluIGxpYmMpIGV4cGVjdHMgdGhlIGxhc3QgYXJndW1lbnQgb2YgbW1hcDIgaW4gNEtiIHVuaXRzLgorCSAqLworCXJldHVybiBzeXNfbW1hcF9wZ29mZihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgcGdvZmYpOwogfQogCiAvKgpAQCAtOTAsNTggKzY5LDEyIEBACiAJaWYgKGEub2Zmc2V0ICYgflBBR0VfTUFTSykKIAkJZ290byBvdXQ7CiAKLQlhLmZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQotCWVycm9yID0gZG9fbW1hcDIoYS5hZGRyLCBhLmxlbiwgYS5wcm90LCBhLmZsYWdzLCBhLmZkLCBhLm9mZnNldCA+PiBQQUdFX1NISUZUKTsKKwllcnJvciA9IHN5c19tbWFwX3Bnb2ZmKGEuYWRkciwgYS5sZW4sIGEucHJvdCwgYS5mbGFncywgYS5mZCwKKwkJCSAgICAgICBhLm9mZnNldCA+PiBQQUdFX1NISUZUKTsKIG91dDoKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLSNpZiAwCi1zdHJ1Y3QgbW1hcF9hcmdfc3RydWN0NjQgewotCV9fdTMyIGFkZHI7Ci0JX191MzIgbGVuOwotCV9fdTMyIHByb3Q7Ci0JX191MzIgZmxhZ3M7Ci0JX191NjQgb2Zmc2V0OyAvKiA2NCBiaXRzICovCi0JX191MzIgZmQ7Ci19OwotCi1hc21saW5rYWdlIGxvbmcgc3lzX21tYXA2NChzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0NjQgKmFyZykKLXsKLQlpbnQgZXJyb3IgPSAtRUZBVUxUOwotCXN0cnVjdCBmaWxlICogZmlsZSA9IE5VTEw7Ci0Jc3RydWN0IG1tYXBfYXJnX3N0cnVjdDY0IGE7Ci0JdW5zaWduZWQgbG9uZyBwZ29mZjsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmYSwgYXJnLCBzaXplb2YoYSkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmICgobG9uZylhLm9mZnNldCAmIH5QQUdFX01BU0spCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcGdvZmYgPSBhLm9mZnNldCA+PiBQQUdFX1NISUZUOwotCWlmICgoYS5vZmZzZXQgPj4gUEFHRV9TSElGVCkgIT0gcGdvZmYpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCEoYS5mbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWVycm9yID0gLUVCQURGOwotCQlmaWxlID0gZmdldChhLmZkKTsKLQkJaWYgKCFmaWxlKQotCQkJZ290byBvdXQ7Ci0JfQotCWEuZmxhZ3MgJj0gfihNQVBfRVhFQ1VUQUJMRSB8IE1BUF9ERU5ZV1JJVEUpOwotCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYS5hZGRyLCBhLmxlbiwgYS5wcm90LCBhLmZsYWdzLCBwZ29mZik7Ci0JdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JaWYgKGZpbGUpCi0JCWZwdXQoZmlsZSk7Ci1vdXQ6Ci0JcmV0dXJuIGVycm9yOwotfQotI2VuZGlmCi0KIHN0cnVjdCBzZWxfYXJnX3N0cnVjdCB7CiAJdW5zaWduZWQgbG9uZyBuOwogCWZkX3NldCBfX3VzZXIgKmlucCwgKm91dHAsICpleHA7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvc3VuMy9tbXVfZW11LmMgYi9hcmNoL202OGsvc3VuMy9tbXVfZW11LmMKaW5kZXggM2NkMTkzOS4uOTRmODFlYyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL3N1bjMvbW11X2VtdS5jCisrKyBiL2FyY2gvbTY4ay9zdW4zL21tdV9lbXUuYwpAQCAtNDUsOCArNDUsOCBAQAogKiogR2xvYmFscwogKi8KIAotdW5zaWduZWQgbG9uZyB2bWFsbG9jX2VuZDsKLUVYUE9SVF9TWU1CT0wodm1hbGxvY19lbmQpOwordW5zaWduZWQgbG9uZyBtNjhrX3ZtYWxsb2NfZW5kOworRVhQT1JUX1NZTUJPTChtNjhrX3ZtYWxsb2NfZW5kKTsKIAogdW5zaWduZWQgbG9uZyBwbWVnX3ZhZGRyW1BNRUdTX05VTV07CiB1bnNpZ25lZCBjaGFyIHBtZWdfYWxsb2NbUE1FR1NfTlVNXTsKQEAgLTE3Miw4ICsxNzIsOCBAQAogI2VuZGlmCiAJCQkvLyB0aGUgbG93ZXN0IG1hcHBpbmcgaGVyZSBpcyB0aGUgZW5kIG9mIG91cgogCQkJLy8gdm1hbGxvYyByZWdpb24KLQkJCWlmKCF2bWFsbG9jX2VuZCkKLQkJCQl2bWFsbG9jX2VuZCA9IHNlZzsKKwkJCWlmICghbTY4a192bWFsbG9jX2VuZCkKKwkJCQltNjhrX3ZtYWxsb2NfZW5kID0gc2VnOwogCiAJCQkvLyBtYXJrIHRoZSBzZWdtYXAgYWxsb2MnZCwgYW5kIHJlc2VydmUgYW55CiAJCQkvLyBvZiB0aGUgZmlyc3QgMHhiZmYgcGFnZXMgdGhlIGhhcmR3YXJlIGlzCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9rZXJuZWwvc3lzX202OGsuYyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zeXNfbTY4ay5jCmluZGV4IGVmZGQwOTAuLmI2N2NiYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zeXNfbTY4ay5jCisrKyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zeXNfbTY4ay5jCkBAIC0yNywzOSArMjcsNiBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogCi0vKiBjb21tb24gY29kZSBmb3Igb2xkIGFuZCBuZXcgbW1hcHMgKi8KLXN0YXRpYyBpbmxpbmUgbG9uZyBkb19tbWFwMigKLQl1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAotCXVuc2lnbmVkIGxvbmcgcHJvdCwgdW5zaWduZWQgbG9uZyBmbGFncywKLQl1bnNpZ25lZCBsb25nIGZkLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQotewotCWludCBlcnJvciA9IC1FQkFERjsKLQlzdHJ1Y3QgZmlsZSAqIGZpbGUgPSBOVUxMOwotCi0JZmxhZ3MgJj0gfihNQVBfRVhFQ1VUQUJMRSB8IE1BUF9ERU5ZV1JJVEUpOwotCWlmICghKGZsYWdzICYgTUFQX0FOT05ZTU9VUykpIHsKLQkJZmlsZSA9IGZnZXQoZmQpOwotCQlpZiAoIWZpbGUpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCWVycm9yID0gZG9fbW1hcF9wZ29mZihmaWxlLCBhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBwZ29mZik7Ci0JdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0KLQlpZiAoZmlsZSkKLQkJZnB1dChmaWxlKTsKLW91dDoKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLWFzbWxpbmthZ2UgbG9uZyBzeXNfbW1hcDIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQl1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCi0JdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZikKLXsKLQlyZXR1cm4gZG9fbW1hcDIoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsIHBnb2ZmKTsKLX0KLQogLyoKICAqIFBlcmZvcm0gdGhlIHNlbGVjdChuZCwgaW4sIG91dCwgZXgsIHR2KSBhbmQgbW1hcCgpIHN5c3RlbQogICogY2FsbHMuIExpbnV4L202OGsgY2xvbmVkIExpbnV4L2kzODYsIHdoaWNoIGRpZG4ndCB1c2UgdG8gYmUgYWJsZSB0bwpAQCAtODgsOSArNTUsOCBAQAogCWlmIChhLm9mZnNldCAmIH5QQUdFX01BU0spCiAJCWdvdG8gb3V0OwogCi0JYS5mbGFncyAmPSB+KE1BUF9FWEVDVVRBQkxFIHwgTUFQX0RFTllXUklURSk7Ci0KLQllcnJvciA9IGRvX21tYXAyKGEuYWRkciwgYS5sZW4sIGEucHJvdCwgYS5mbGFncywgYS5mZCwgYS5vZmZzZXQgPj4gUEFHRV9TSElGVCk7CisJZXJyb3IgPSBzeXNfbW1hcF9wZ29mZihhLmFkZHIsIGEubGVuLCBhLnByb3QsIGEuZmxhZ3MsIGEuZmQsCisJCQkJYS5vZmZzZXQgPj4gUEFHRV9TSElGVCk7CiBvdXQ6CiAJcmV0dXJuIGVycm9yOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3N5c2NhbGx0YWJsZS5TIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3N5c2NhbGx0YWJsZS5TCmluZGV4IDIzNTM1Y2MuLjQ4NjgzN2UgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zeXNjYWxsdGFibGUuUworKysgYi9hcmNoL202OGtub21tdS9rZXJuZWwvc3lzY2FsbHRhYmxlLlMKQEAgLTIxMCw3ICsyMTAsNyBAQAogCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIHN0cmVhbXMyICovCiAJLmxvbmcgc3lzX3Zmb3JrCQkvKiAxOTAgKi8KIAkubG9uZyBzeXNfZ2V0cmxpbWl0Ci0JLmxvbmcgc3lzX21tYXAyCisJLmxvbmcgc3lzX21tYXBfcGdvZmYKIAkubG9uZyBzeXNfdHJ1bmNhdGU2NAogCS5sb25nIHN5c19mdHJ1bmNhdGU2NAogCS5sb25nIHN5c19zdGF0NjQJLyogMTk1ICovCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvS2NvbmZpZyBiL2FyY2gvbWljcm9ibGF6ZS9LY29uZmlnCmluZGV4IGJiZDgzMjcuLmZkNTNlNTAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9LY29uZmlnCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9LY29uZmlnCkBAIC02LDggKzYsMTUgQEAKIGNvbmZpZyBNSUNST0JMQVpFCiAJZGVmX2Jvb2wgeQogCXNlbGVjdCBIQVZFX0xNQgorCXNlbGVjdCBIQVZFX0ZVTkNUSU9OX1RSQUNFUgorCXNlbGVjdCBIQVZFX0ZVTkNUSU9OX1RSQUNFX01DT1VOVF9URVNUCisJc2VsZWN0IEhBVkVfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSCisJc2VsZWN0IEhBVkVfRFlOQU1JQ19GVFJBQ0UKKwlzZWxlY3QgSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRAogCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSQogCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgorCXNlbGVjdCBIQVZFX09QUk9GSUxFCisJc2VsZWN0IFRSQUNJTkdfU1VQUE9SVAogCiBjb25maWcgU1dBUAogCWRlZl9ib29sIG4KQEAgLTU3LDEyICs2NCwyNCBAQAogY29uZmlnIEdFTkVSSUNfQ1NVTQogCWRlZl9ib29sIHkKIAorY29uZmlnIFNUQUNLVFJBQ0VfU1VQUE9SVAorCWRlZl9ib29sIHkKKworY29uZmlnIExPQ0tERVBfU1VQUE9SVAorCWRlZl9ib29sIHkKKworY29uZmlnIEhBVkVfTEFURU5DWVRPUF9TVVBQT1JUCisJZGVmX2Jvb2wgeQorCiBjb25maWcgUENJCiAJZGVmX2Jvb2wgbgogCiBjb25maWcgTk9fRE1BCiAJZGVmX2Jvb2wgeQogCitjb25maWcgRFRDCisJZGVmX2Jvb2wgeQorCiBzb3VyY2UgImluaXQvS2NvbmZpZyIKIAogc291cmNlICJrZXJuZWwvS2NvbmZpZy5mcmVlemVyIgpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL0tjb25maWcuZGVidWcgYi9hcmNoL21pY3JvYmxhemUvS2NvbmZpZy5kZWJ1ZwppbmRleCAyNDJjZDM1Li45ZGM3MDhhIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvS2NvbmZpZy5kZWJ1ZworKysgYi9hcmNoL21pY3JvYmxhemUvS2NvbmZpZy5kZWJ1ZwpAQCAtMyw2ICszLDkgQEAKIAogbWVudSAiS2VybmVsIGhhY2tpbmciCiAKK2NvbmZpZyBUUkFDRV9JUlFGTEFHU19TVVBQT1JUCisJZGVmX2Jvb2wgeQorCiBzb3VyY2UgImxpYi9LY29uZmlnLmRlYnVnIgogCiBjb25maWcgRUFSTFlfUFJJTlRLCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvTWFrZWZpbGUgYi9hcmNoL21pY3JvYmxhemUvTWFrZWZpbGUKaW5kZXggMzQxODczNS4uZDJkNmNmYyAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL01ha2VmaWxlCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9NYWtlZmlsZQpAQCAtNTEsNiArNTEsOCBAQAogY29yZS15ICs9IGFyY2gvbWljcm9ibGF6ZS9tbS8KIGNvcmUteSArPSBhcmNoL21pY3JvYmxhemUvcGxhdGZvcm0vCiAKK2RyaXZlcnMtJChDT05GSUdfT1BST0ZJTEUpICs9IGFyY2gvbWljcm9ibGF6ZS9vcHJvZmlsZS8KKwogYm9vdCA6PSBhcmNoL21pY3JvYmxhemUvYm9vdAogCiAjIEFyZSB3ZSBtYWtpbmcgYSBzaW1wbGVJbWFnZS48Ym9hcmRuYW1lPiB0YXJnZXQ/IElmIHNvLCBjcmFjayBvdXQgdGhlIGJvYXJkbmFtZQpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2Jvb3QvTWFrZWZpbGUgYi9hcmNoL21pY3JvYmxhemUvYm9vdC9NYWtlZmlsZQppbmRleCAyMWYxMzMyLi45MDJjZjk4IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvYm9vdC9NYWtlZmlsZQorKysgYi9hcmNoL21pY3JvYmxhemUvYm9vdC9NYWtlZmlsZQpAQCAtMiwxMSArMiwxMyBAQAogIyBhcmNoL21pY3JvYmxhemUvYm9vdC9NYWtlZmlsZQogIwogCitNS0lNQUdFIDo9ICQoc3JjdHJlZSkvc2NyaXB0cy9ta3Vib290LnNoCisKIG9iai15ICs9IGxpbmtlZF9kdGIubwogCiB0YXJnZXRzIDo9IGxpbnV4LmJpbiBsaW51eC5iaW4uZ3ogc2ltcGxlSW1hZ2UuJQogCi1PQkpDT1BZRkxBR1NfbGludXguYmluICA6PSAtTyBiaW5hcnkKK09CSkNPUFlGTEFHUyA6PSAtTyBiaW5hcnkKIAogIyBXaGVyZSB0aGUgRFRTIGZpbGVzIGxpdmUKIGR0c3RyZWUgICAgICAgICA6PSAkKHNyY3RyZWUpLyQoc3JjKS9kdHMKQEAgLTI0LDYgKzI2LDcgQEAKIAlbIC1uICQoQ09ORklHX0lOSVRSQU1GU19TT1VSQ0UpIF0gJiYgWyAhIC1lICQoQ09ORklHX0lOSVRSQU1GU19TT1VSQ0UpIF0gJiYgXAogCXRvdWNoICQoQ09ORklHX0lOSVRSQU1GU19TT1VSQ0UpIHx8IGVjaG8gIk5vIENQSU8gaW1hZ2UiCiAJJChjYWxsIGlmX2NoYW5nZWQsb2JqY29weSkKKwkkKGNhbGwgaWZfY2hhbmdlZCx1aW1hZ2UpCiAJQGVjaG8gJ0tlcm5lbDogJEAgaXMgcmVhZHknICcgKCMnYGNhdCAudmVyc2lvbmAnKScKIAogJChvYmopL2xpbnV4LmJpbi5nejogJChvYmopL2xpbnV4LmJpbiBGT1JDRQpAQCAtMzYsOCArMzksMTYgQEAKIHF1aWV0X2NtZF9zdHJpcCA9IFNUUklQICAgJEAKICAgICAgIGNtZF9zdHJpcCA9ICQoU1RSSVApIC1LIF9zdGFydCAtSyBfZW5kIC1LIF9fbG9nX2J1ZiAtSyBfZmR0X3N0YXJ0IHZtbGludXggLW8gJEAKIAorcXVpZXRfY21kX3VpbWFnZSA9IFVJTUFHRSAgJEAudWIKKyAgICAgIGNtZF91aW1hZ2UgPSAkKENPTkZJR19TSEVMTCkgJChNS0lNQUdFKSAtQSBtaWNyb2JsYXplIC1PIGxpbnV4IC1UIGtlcm5lbCBcCisgICAgICAgICAgICAgICAgICAgLUMgbm9uZSAtbiAnTGludXgtJChLRVJORUxSRUxFQVNFKScgXAorICAgICAgICAgICAgICAgICAgIC1hICQoQ09ORklHX0tFUk5FTF9CQVNFX0FERFIpIC1lICQoQ09ORklHX0tFUk5FTF9CQVNFX0FERFIpIFwKKyAgICAgICAgICAgICAgICAgICAtZCAkQCAkQC51YgorCiAkKG9iaikvc2ltcGxlSW1hZ2UuJTogdm1saW51eCBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkLGNwLC51bnN0cmlwKQorCSQoY2FsbCBpZl9jaGFuZ2VkLG9iamNvcHkpCisJJChjYWxsIGlmX2NoYW5nZWQsdWltYWdlKQogCSQoY2FsbCBpZl9jaGFuZ2VkLHN0cmlwKQogCUBlY2hvICdLZXJuZWw6ICRAIGlzIHJlYWR5JyAnICgjJ2BjYXQgLnZlcnNpb25gJyknCiAKQEAgLTUzLDQgKzY0LDQgQEAKIAogY2xlYW4ta2VybmVsICs9IGxpbnV4LmJpbiBsaW51eC5iaW4uZ3ogc2ltcGxlSW1hZ2UuKgogCi1jbGVhbi1maWxlcyArPSAqLmR0YgorY2xlYW4tZmlsZXMgKz0gKi5kdGIgc2ltcGxlSW1hZ2UuKi51bnN0cmlwCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vY2FjaGUuaCBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9jYWNoZS5oCmluZGV4IGMyMDljNDcuLmU1MjIxMDggMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9jYWNoZS5oCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9jYWNoZS5oCkBAIC0yMSwyMCArMjEsNCBAQAogCiAjZGVmaW5lIFNNUF9DQUNIRV9CWVRFUwlMMV9DQUNIRV9CWVRFUwogCi12b2lkIF9lbmFibGVfaWNhY2hlKHZvaWQpOwotdm9pZCBfZGlzYWJsZV9pY2FjaGUodm9pZCk7Ci12b2lkIF9pbnZhbGlkYXRlX2ljYWNoZSh1bnNpZ25lZCBpbnQgYWRkcik7Ci0KLSNkZWZpbmUgX19lbmFibGVfaWNhY2hlKCkJCV9lbmFibGVfaWNhY2hlKCkKLSNkZWZpbmUgX19kaXNhYmxlX2ljYWNoZSgpCQlfZGlzYWJsZV9pY2FjaGUoKQotI2RlZmluZSBfX2ludmFsaWRhdGVfaWNhY2hlKGFkZHIpCV9pbnZhbGlkYXRlX2ljYWNoZShhZGRyKQotCi12b2lkIF9lbmFibGVfZGNhY2hlKHZvaWQpOwotdm9pZCBfZGlzYWJsZV9kY2FjaGUodm9pZCk7Ci12b2lkIF9pbnZhbGlkYXRlX2RjYWNoZSh1bnNpZ25lZCBpbnQgYWRkcik7Ci0KLSNkZWZpbmUgX19lbmFibGVfZGNhY2hlKCkJCV9lbmFibGVfZGNhY2hlKCkKLSNkZWZpbmUgX19kaXNhYmxlX2RjYWNoZSgpCQlfZGlzYWJsZV9kY2FjaGUoKQotI2RlZmluZSBfX2ludmFsaWRhdGVfZGNhY2hlKGFkZHIpCV9pbnZhbGlkYXRlX2RjYWNoZShhZGRyKQotCiAjZW5kaWYgLyogX0FTTV9NSUNST0JMQVpFX0NBQ0hFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmggYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oCmluZGV4IDA4ODA3NmUuLmE2ZWRkMzU2IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKQEAgLTE4LDYgKzE4LDggQEAKIC8qIFNvbWVib2R5IGRlcGVuZHMgb24gdGhpczsgc2lnaC4uLiAqLwogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAKKy8qIExvb2sgYXQgRG9jdW1lbnRhdGlvbi9jYWNoZXRsYi50eHQgKi8KKwogLyoKICAqIENhY2hlIGhhbmRsaW5nIGZ1bmN0aW9ucy4KICAqIE1pY3JvYmxhemUgaGFzIGEgd3JpdGUtdGhyb3VnaCBkYXRhIGNhY2hlLCBtZWFuaW5nIHRoYXQgdGhlIGRhdGEgY2FjaGUKQEAgLTI3LDc4ICsyOSw4MSBAQAogICogaW5zdHJ1Y3Rpb24gY2FjaGUgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGZldGNoIG9sZCwgYmFkIGNvZGUuCiAgKi8KIAorLyogc3RydWN0IGNhY2hlLCBkPWRjYWNoZSwgaT1pY2FjaGUsIGZsID0gZmx1c2gsIGl2ID0gaW52YWxpZGF0ZSwKKyAqIHN1ZmZpeCByID0gcmFuZ2UgKi8KK3N0cnVjdCBzY2FjaGUgeworCS8qIGljYWNoZSAqLworCXZvaWQgKCppZSkodm9pZCk7IC8qIGVuYWJsZSAqLworCXZvaWQgKCppZCkodm9pZCk7IC8qIGRpc2FibGUgKi8KKwl2b2lkICgqaWZsKSh2b2lkKTsgLyogZmx1c2ggKi8KKwl2b2lkICgqaWZscikodW5zaWduZWQgbG9uZyBhLCB1bnNpZ25lZCBsb25nIGIpOworCXZvaWQgKCppaW4pKHZvaWQpOyAvKiBpbnZhbGlkYXRlICovCisJdm9pZCAoKmlpbnIpKHVuc2lnbmVkIGxvbmcgYSwgdW5zaWduZWQgbG9uZyBiKTsKKwkvKiBkY2FjaGUgKi8KKwl2b2lkICgqZGUpKHZvaWQpOyAvKiBlbmFibGUgKi8KKwl2b2lkICgqZGQpKHZvaWQpOyAvKiBkaXNhYmxlICovCisJdm9pZCAoKmRmbCkodm9pZCk7IC8qIGZsdXNoICovCisJdm9pZCAoKmRmbHIpKHVuc2lnbmVkIGxvbmcgYSwgdW5zaWduZWQgbG9uZyBiKTsKKwl2b2lkICgqZGluKSh2b2lkKTsgLyogaW52YWxpZGF0ZSAqLworCXZvaWQgKCpkaW5yKSh1bnNpZ25lZCBsb25nIGEsIHVuc2lnbmVkIGxvbmcgYik7Cit9OworCisvKiBtaWNyb2JsYXplIGNhY2hlICovCitleHRlcm4gc3RydWN0IHNjYWNoZSAqbWJjOworCit2b2lkIG1pY3JvYmxhemVfY2FjaGVfaW5pdCh2b2lkKTsKKworI2RlZmluZSBlbmFibGVfaWNhY2hlKCkJCQkJCW1iYy0+aWUoKTsKKyNkZWZpbmUgZGlzYWJsZV9pY2FjaGUoKQkJCQltYmMtPmlkKCk7CisjZGVmaW5lIGZsdXNoX2ljYWNoZSgpCQkJCQltYmMtPmlmbCgpOworI2RlZmluZSBmbHVzaF9pY2FjaGVfcmFuZ2Uoc3RhcnQsIGVuZCkJCQltYmMtPmlmbHIoc3RhcnQsIGVuZCk7CisjZGVmaW5lIGludmFsaWRhdGVfaWNhY2hlKCkJCQkJbWJjLT5paW4oKTsKKyNkZWZpbmUgaW52YWxpZGF0ZV9pY2FjaGVfcmFuZ2Uoc3RhcnQsIGVuZCkJCW1iYy0+aWlucihzdGFydCwgZW5kKTsKKworCisjZGVmaW5lIGZsdXNoX2ljYWNoZV91c2VyX3JhbmdlKHZtYSwgcGcsIGFkciwgbGVuKQlmbHVzaF9pY2FjaGUoKTsKKyNkZWZpbmUgZmx1c2hfaWNhY2hlX3BhZ2Uodm1hLCBwZykJCQlkbyB7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgZW5hYmxlX2RjYWNoZSgpCQkJCQltYmMtPmRlKCk7CisjZGVmaW5lIGRpc2FibGVfZGNhY2hlKCkJCQkJbWJjLT5kZCgpOwogLyogRklYTUUgZm9yIExMLXRlbWFjIGRyaXZlciAqLwotI2RlZmluZSBpbnZhbGlkYXRlX2RjYWNoZV9yYW5nZShzdGFydCwgZW5kKSBcCi0JCQlfX2ludmFsaWRhdGVfZGNhY2hlX3JhbmdlKHN0YXJ0LCBlbmQpCisjZGVmaW5lIGludmFsaWRhdGVfZGNhY2hlKCkJCQkJbWJjLT5kaW4oKTsKKyNkZWZpbmUgaW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2Uoc3RhcnQsIGVuZCkJCW1iYy0+ZGlucihzdGFydCwgZW5kKTsKKyNkZWZpbmUgZmx1c2hfZGNhY2hlKCkJCQkJCW1iYy0+ZGZsKCk7CisjZGVmaW5lIGZsdXNoX2RjYWNoZV9yYW5nZShzdGFydCwgZW5kKQkJCW1iYy0+ZGZscihzdGFydCwgZW5kKTsKIAotI2RlZmluZSBmbHVzaF9jYWNoZV9hbGwoKQkJCV9faW52YWxpZGF0ZV9jYWNoZV9hbGwoKQotI2RlZmluZSBmbHVzaF9jYWNoZV9tbShtbSkJCQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgc3RhcnQsIGVuZCkJX19pbnZhbGlkYXRlX2NhY2hlX2FsbCgpCi0jZGVmaW5lIGZsdXNoX2NhY2hlX3BhZ2Uodm1hLCB2bWFkZHIsIHBmbikJZG8geyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIGZsdXNoX2RjYWNoZV9yYW5nZShzdGFydCwgZW5kKQlfX2ludmFsaWRhdGVfZGNhY2hlX3JhbmdlKHN0YXJ0LCBlbmQpCiAjZGVmaW5lIEFSQ0hfSU1QTEVNRU5UU19GTFVTSF9EQ0FDSEVfUEFHRSAwCisvKiBELWNhY2hlIGFsaWFzaW5nIHByb2JsZW0gY2FuJ3QgaGFwcGVuIC0gY2FjaGUgaXMgYmV0d2VlbiBNTVUgYW5kIHJhbSAqLwogI2RlZmluZSBmbHVzaF9kY2FjaGVfcGFnZShwYWdlKQkJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfZGNhY2hlX21tYXBfbG9jayhtYXBwaW5nKQkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBmbHVzaF9kY2FjaGVfbW1hcF91bmxvY2sobWFwcGluZykJZG8geyB9IHdoaWxlICgwKQogCi0jZGVmaW5lIGZsdXNoX2ljYWNoZV9yYW5nZShzdGFydCwgbGVuKQlfX2ludmFsaWRhdGVfaWNhY2hlX3JhbmdlKHN0YXJ0LCBsZW4pCi0jZGVmaW5lIGZsdXNoX2ljYWNoZV9wYWdlKHZtYSwgcGcpCQlkbyB7IH0gd2hpbGUgKDApCiAKLSNpZm5kZWYgQ09ORklHX01NVQotIyBkZWZpbmUgZmx1c2hfaWNhY2hlX3VzZXJfcmFuZ2Uoc3RhcnQsIGxlbikJZG8geyB9IHdoaWxlICgwKQotI2Vsc2UKLSMgZGVmaW5lIGZsdXNoX2ljYWNoZV91c2VyX3JhbmdlKHZtYSwgcGcsIGFkciwgbGVuKSBfX2ludmFsaWRhdGVfaWNhY2hlX2FsbCgpCisjZGVmaW5lIGZsdXNoX2NhY2hlX2R1cF9tbShtbSkJCQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBmbHVzaF9jYWNoZV92bWFwKHN0YXJ0LCBlbmQpCQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBmbHVzaF9jYWNoZV92dW5tYXAoc3RhcnQsIGVuZCkJCQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIGZsdXNoX2NhY2hlX21tKG1tKQkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZmx1c2hfY2FjaGVfcGFnZSh2bWEsIHZtYWRkciwgcGZuKQlkbyB7IH0gd2hpbGUgKDApCiAKLSMgZGVmaW5lIGZsdXNoX3BhZ2VfdG9fcmFtKHBhZ2UpCQlkbyB7IH0gd2hpbGUgKDApCi0KLSMgZGVmaW5lIGZsdXNoX2ljYWNoZSgpCQkJX19pbnZhbGlkYXRlX2ljYWNoZV9hbGwoKQotIyBkZWZpbmUgZmx1c2hfY2FjaGVfc2lndHJhbXAodmFkZHIpIFwKLQkJCV9faW52YWxpZGF0ZV9pY2FjaGVfcmFuZ2UodmFkZHIsIHZhZGRyICsgOCkKLQotIyBkZWZpbmUgZmx1c2hfZGNhY2hlX21tYXBfbG9jayhtYXBwaW5nKQlkbyB7IH0gd2hpbGUgKDApCi0jIGRlZmluZSBmbHVzaF9kY2FjaGVfbW1hcF91bmxvY2sobWFwcGluZykJZG8geyB9IHdoaWxlICgwKQotCi0jIGRlZmluZSBmbHVzaF9jYWNoZV9kdXBfbW0obW0pCQkJZG8geyB9IHdoaWxlICgwKQorLyogTVM6IGtnZGIgY29kZSB1c2UgdGhpcyBtYWNybywgd3JvbmcgbGVuIHdpdGggRkxBU0ggKi8KKyNpZiAwCisjZGVmaW5lIGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgc3RhcnQsIGxlbikJewlcCisJZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCkgKHN0YXJ0KSwgKHVuc2lnbmVkKSAoc3RhcnQpICsgKGxlbikpOyBcCisJZmx1c2hfZGNhY2hlX3JhbmdlKCh1bnNpZ25lZCkgKHN0YXJ0KSwgKHVuc2lnbmVkKSAoc3RhcnQpICsgKGxlbikpOyBcCit9CiAjZW5kaWYKIAotI2RlZmluZSBmbHVzaF9jYWNoZV92bWFwKHN0YXJ0LCBlbmQpCQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIGZsdXNoX2NhY2hlX3Z1bm1hcChzdGFydCwgZW5kKQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIHN0YXJ0LCBsZW4pIGRvIHsgfSB3aGlsZSAoMCkKIAotc3RydWN0IHBhZ2U7Ci1zdHJ1Y3QgbW1fc3RydWN0Owotc3RydWN0IHZtX2FyZWFfc3RydWN0OwotCi0vKiBzZWUgYXJjaC9taWNyb2JsYXplL2tlcm5lbC9jYWNoZS5jICovCi1leHRlcm4gdm9pZCBfX2ludmFsaWRhdGVfaWNhY2hlX2FsbCh2b2lkKTsKLWV4dGVybiB2b2lkIF9faW52YWxpZGF0ZV9pY2FjaGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOwotZXh0ZXJuIHZvaWQgX19pbnZhbGlkYXRlX2ljYWNoZV9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJCXN0cnVjdCBwYWdlICpwYWdlKTsKLWV4dGVybiB2b2lkIF9faW52YWxpZGF0ZV9pY2FjaGVfdXNlcl9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQlzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkJCQl1bnNpZ25lZCBsb25nIGFkciwgaW50IGxlbik7Ci1leHRlcm4gdm9pZCBfX2ludmFsaWRhdGVfY2FjaGVfc2lndHJhbXAodW5zaWduZWQgbG9uZyBhZGRyKTsKLQotZXh0ZXJuIHZvaWQgX19pbnZhbGlkYXRlX2RjYWNoZV9hbGwodm9pZCk7Ci1leHRlcm4gdm9pZCBfX2ludmFsaWRhdGVfZGNhY2hlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKLWV4dGVybiB2b2lkIF9faW52YWxpZGF0ZV9kY2FjaGVfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQlzdHJ1Y3QgcGFnZSAqcGFnZSk7Ci1leHRlcm4gdm9pZCBfX2ludmFsaWRhdGVfZGNhY2hlX3VzZXJfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCQkJc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCQkJdW5zaWduZWQgbG9uZyBhZHIsIGludCBsZW4pOwotCi1leHRlcm4gaW5saW5lIHZvaWQgX19pbnZhbGlkYXRlX2NhY2hlX2FsbCh2b2lkKQotewotCV9faW52YWxpZGF0ZV9pY2FjaGVfYWxsKCk7Ci0JX19pbnZhbGlkYXRlX2RjYWNoZV9hbGwoKTsKLX0KLQotI2RlZmluZSBjb3B5X3RvX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIHZhZGRyLCBkc3QsIHNyYywgbGVuKSBcCi1kbyB7IG1lbWNweSgoZHN0KSwgKHNyYyksIChsZW4pKTsgXAotCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQpIChkc3QpLCAodW5zaWduZWQpIChkc3QpICsgKGxlbikpOyBcCisjZGVmaW5lIGNvcHlfdG9fdXNlcl9wYWdlKHZtYSwgcGFnZSwgdmFkZHIsIGRzdCwgc3JjLCBsZW4pCQlcCitkbyB7CQkJCQkJCQkJXAorCW1lbWNweSgoZHN0KSwgKHNyYyksIChsZW4pKTsJCQkJCVwKKwlmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkKSAoZHN0KSwgKHVuc2lnbmVkKSAoZHN0KSArIChsZW4pKTsJXAogfSB3aGlsZSAoMCkKIAotI2RlZmluZSBjb3B5X2Zyb21fdXNlcl9wYWdlKHZtYSwgcGFnZSwgdmFkZHIsIGRzdCwgc3JjLCBsZW4pIFwKLQltZW1jcHkoKGRzdCksIChzcmMpLCAobGVuKSkKKyNkZWZpbmUgY29weV9mcm9tX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIHZhZGRyLCBkc3QsIHNyYywgbGVuKQkJXAorZG8gewkJCQkJCQkJCVwKKwltZW1jcHkoKGRzdCksIChzcmMpLCAobGVuKSk7CQkJCQlcCit9IHdoaWxlICgwKQogCiAjZW5kaWYgLyogX0FTTV9NSUNST0JMQVpFX0NBQ0hFRkxVU0hfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2NwdWluZm8uaCBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9jcHVpbmZvLmgKaW5kZXggNTJmMjhmNi4uYjRmNWNhMyAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2NwdWluZm8uaAorKysgYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vY3B1aW5mby5oCkBAIC00Myw3ICs0Myw3IEBACiAJdTMyIHVzZV9pY2FjaGU7CiAJdTMyIGljYWNoZV90YWdiaXRzOwogCXUzMiBpY2FjaGVfd3JpdGU7Ci0JdTMyIGljYWNoZV9saW5lOworCXUzMiBpY2FjaGVfbGluZV9sZW5ndGg7CiAJdTMyIGljYWNoZV9zaXplOwogCXVuc2lnbmVkIGxvbmcgaWNhY2hlX2Jhc2U7CiAJdW5zaWduZWQgbG9uZyBpY2FjaGVfaGlnaDsKQEAgLTUxLDggKzUxLDkgQEAKIAl1MzIgdXNlX2RjYWNoZTsKIAl1MzIgZGNhY2hlX3RhZ2JpdHM7CiAJdTMyIGRjYWNoZV93cml0ZTsKLQl1MzIgZGNhY2hlX2xpbmU7CisJdTMyIGRjYWNoZV9saW5lX2xlbmd0aDsKIAl1MzIgZGNhY2hlX3NpemU7CisJdTMyIGRjYWNoZV93YjsKIAl1bnNpZ25lZCBsb25nIGRjYWNoZV9iYXNlOwogCXVuc2lnbmVkIGxvbmcgZGNhY2hlX2hpZ2g7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9kZXZpY2UuaCBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9kZXZpY2UuaAppbmRleCAzMDI4NmRiLi43OGEwMzg0IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vZGV2aWNlLmgKKysrIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2RldmljZS5oCkBAIC0xOSw2ICsxOSwxOCBAQAogc3RydWN0IHBkZXZfYXJjaGRhdGEgewogfTsKIAorc3RhdGljIGlubGluZSB2b2lkIGRldl9hcmNoZGF0YV9zZXRfbm9kZShzdHJ1Y3QgZGV2X2FyY2hkYXRhICphZCwKKwkJCQkJIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJYWQtPm9mX25vZGUgPSBucDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlX25vZGUgKgorZGV2X2FyY2hkYXRhX2dldF9ub2RlKGNvbnN0IHN0cnVjdCBkZXZfYXJjaGRhdGEgKmFkKQoreworCXJldHVybiBhZC0+b2Zfbm9kZTsKK30KKwogI2VuZGlmIC8qIF9BU01fTUlDUk9CTEFaRV9ERVZJQ0VfSCAqLwogCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9mdHJhY2UuaCBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9mdHJhY2UuaAppbmRleCA4YjEzNzg5Li5mZDJmYTJlYyAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2Z0cmFjZS5oCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9mdHJhY2UuaApAQCAtMSArMSwyNiBAQAorI2lmbmRlZiBfQVNNX01JQ1JPQkxBWkVfRlRSQUNFCisjZGVmaW5lIF9BU01fTUlDUk9CTEFaRV9GVFJBQ0UKIAorI2lmZGVmIENPTkZJR19GVU5DVElPTl9UUkFDRVIKKworI2RlZmluZSBNQ09VTlRfQUREUgkJKChsb25nKShfbWNvdW50KSkKKyNkZWZpbmUgTUNPVU5UX0lOU05fU0laRQk4IC8qIHNpemVvZiBtY291bnQgY2FsbCAqLworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworZXh0ZXJuIHZvaWQgX21jb3VudCh2b2lkKTsKK2V4dGVybiB2b2lkIGZ0cmFjZV9jYWxsX2dyYXBoKHZvaWQpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRFlOQU1JQ19GVFJBQ0UKKy8qIHJlbG9jdGlvbiBvZiBtY291bnQgY2FsbCBzaXRlIGlzIHRoZSBzYW1lIGFzIHRoZSBhZGRyZXNzICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZnRyYWNlX2NhbGxfYWRqdXN0KHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlyZXR1cm4gYWRkcjsKK30KKworc3RydWN0IGR5bl9hcmNoX2Z0cmFjZSB7Cit9OworI2VuZGlmIC8qIENPTkZJR19EWU5BTUlDX0ZUUkFDRSAqLworCisjZW5kaWYgLyogQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiAqLworI2VuZGlmIC8qIF9BU01fTUlDUk9CTEFaRV9GVFJBQ0UgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9mdXRleC5oIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2Z1dGV4LmgKaW5kZXggMGI3NDU4Mi4uOGRiYjZlNyAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2Z1dGV4LmgKKysrIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2Z1dGV4LmgKQEAgLTEgKzEsMTI2IEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZnV0ZXguaD4KKyNpZm5kZWYgX0FTTV9NSUNST0JMQVpFX0ZVVEVYX0gKKyNkZWZpbmUgX0FTTV9NSUNST0JMQVpFX0ZVVEVYX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorCisjZGVmaW5lIF9fZnV0ZXhfYXRvbWljX29wKGluc24sIHJldCwgb2xkdmFsLCB1YWRkciwgb3BhcmcpIFwKKyh7CQkJCQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgJCQkJCQlcCisJCQkiMToJbHd4CSUwLCAlMiwgcjA7ICIJCQlcCisJCQkJaW5zbgkJCQkJXAorCQkJIjI6CXN3eAklMSwgJTIsIHIwOwkJCVwKKwkJCQlhZGRpYwklMSwgcjAsIDA7CQkJXAorCQkJCWJuZWkJJTEsIDFiOwkJCQlcCisJCQkzOgkJCQkJCVwKKwkJCS5zZWN0aW9uIC5maXh1cCxcImF4XCI7CQkJCVwKKwkJCTQ6CWJyaWQJM2I7CQkJCVwKKwkJCQlhZGRpawklMSwgcjAsICUzOwkJCVwKKwkJCS5wcmV2aW91czsJCQkJCVwKKwkJCS5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCI7CQkJXAorCQkJLndvcmQJMWIsNGIsMmIsNGI7CQkJCVwKKwkJCS5wcmV2aW91czsiCQkJCQlcCisJOiAiPSZyIiAob2xkdmFsKSwgIj0mciIgKHJldCkJCQkJCVwKKwk6ICJiIiAodWFkZHIpLCAiaSIgKC1FRkFVTFQpLCAiciIgKG9wYXJnKQkJCVwKKwkpOwkJCQkJCQkJXAorfSkKKworc3RhdGljIGlubGluZSBpbnQKK2Z1dGV4X2F0b21pY19vcF9pbnVzZXIoaW50IGVuY29kZWRfb3AsIGludCBfX3VzZXIgKnVhZGRyKQoreworCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7CisJaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OworCWludCBvcGFyZyA9IChlbmNvZGVkX29wIDw8IDgpID4+IDIwOworCWludCBjbXBhcmcgPSAoZW5jb2RlZF9vcCA8PCAyMCkgPj4gMjA7CisJaW50IG9sZHZhbCA9IDAsIHJldDsKKwlpZiAoZW5jb2RlZF9vcCAmIChGVVRFWF9PUF9PUEFSR19TSElGVCA8PCAyOCkpCisJCW9wYXJnID0gMSA8PCBvcGFyZzsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlwYWdlZmF1bHRfZGlzYWJsZSgpOworCisJc3dpdGNoIChvcCkgeworCWNhc2UgRlVURVhfT1BfU0VUOgorCQlfX2Z1dGV4X2F0b21pY19vcCgib3IgJTEsJTQsJTQ7IiwgcmV0LCBvbGR2YWwsIHVhZGRyLCBvcGFyZyk7CisJCWJyZWFrOworCWNhc2UgRlVURVhfT1BfQUREOgorCQlfX2Z1dGV4X2F0b21pY19vcCgiYWRkICUxLCUwLCU0OyIsIHJldCwgb2xkdmFsLCB1YWRkciwgb3BhcmcpOworCQlicmVhazsKKwljYXNlIEZVVEVYX09QX09SOgorCQlfX2Z1dGV4X2F0b21pY19vcCgib3IgJTEsJTAsJTQ7IiwgcmV0LCBvbGR2YWwsIHVhZGRyLCBvcGFyZyk7CisJCWJyZWFrOworCWNhc2UgRlVURVhfT1BfQU5ETjoKKwkJX19mdXRleF9hdG9taWNfb3AoImFuZCAlMSwlMCwlNDsiLCByZXQsIG9sZHZhbCwgdWFkZHIsIG9wYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBGVVRFWF9PUF9YT1I6CisJCV9fZnV0ZXhfYXRvbWljX29wKCJ4b3IgJTEsJTAsJTQ7IiwgcmV0LCBvbGR2YWwsIHVhZGRyLCBvcGFyZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9TWVM7CisJfQorCisJcGFnZWZhdWx0X2VuYWJsZSgpOworCisJaWYgKCFyZXQpIHsKKwkJc3dpdGNoIChjbXApIHsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfRVE6CisJCQlyZXQgPSAob2xkdmFsID09IGNtcGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTkU6CisJCQlyZXQgPSAob2xkdmFsICE9IGNtcGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTFQ6CisJCQlyZXQgPSAob2xkdmFsIDwgY21wYXJnKTsKKwkJCWJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HRToKKwkJCXJldCA9IChvbGR2YWwgPj0gY21wYXJnKTsKKwkJCWJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MRToKKwkJCXJldCA9IChvbGR2YWwgPD0gY21wYXJnKTsKKwkJCWJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HVDoKKwkJCXJldCA9IChvbGR2YWwgPiBjbXBhcmcpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRU5PU1lTOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitmdXRleF9hdG9taWNfY21weGNoZ19pbmF0b21pYyhpbnQgX191c2VyICp1YWRkciwgaW50IG9sZHZhbCwgaW50IG5ld3ZhbCkKK3sKKwlpbnQgcHJldiwgY21wOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgiMToJbHd4CSUwLCAlMiwgcjA7CQlcCisJCQkJCWNtcAklMSwgJTAsICUzOwkJXAorCQkJCQliZXFpCSUxLCAzZjsJCQlcCisJCQkJMjoJc3d4CSU0LCAlMiwgcjA7CQlcCisJCQkJCWFkZGljCSUxLCByMCwgMDsJCVwKKwkJCQkJYm5laQklMSwgMWI7CQkJXAorCQkJCTM6CQkJCQlcCisJCQkJLnNlY3Rpb24gLmZpeHVwLFwiYXhcIjsJCQlcCisJCQkJNDoJYnJpZAkzYjsJCQlcCisJCQkJCWFkZGlrCSUwLCByMCwgJTU7CQlcCisJCQkJLnByZXZpb3VzOwkJCQlcCisJCQkJLnNlY3Rpb24gX19leF90YWJsZSxcImFcIjsJCVwKKwkJCQkud29yZAkxYiw0YiwyYiw0YjsJCQlcCisJCQkJLnByZXZpb3VzOyIJCQkJXAorCQk6ICI9JnIiIChwcmV2KSwgIj0mciIoY21wKQkJCQlcCisJCTogInIiICh1YWRkciksICJyIiAob2xkdmFsKSwgInIiIChuZXd2YWwpLCAiaSIgKC1FRkFVTFQpKTsKKworCXJldHVybiBwcmV2OworfQorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9pcnFmbGFncy5oIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2lycWZsYWdzLmgKaW5kZXggZGVhNjU2NC4uMmMzOGM2ZCAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2lycWZsYWdzLmgKKysrIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2lycWZsYWdzLmgKQEAgLTEwLDc4ICsxMCw3MyBAQAogI2RlZmluZSBfQVNNX01JQ1JPQkxBWkVfSVJRRkxBR1NfSAogCiAjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KKyNpbmNsdWRlIDxhc20vcmVnaXN0ZXJzLmg+CiAKICMgaWYgQ09ORklHX1hJTElOWF9NSUNST0JMQVpFMF9VU0VfTVNSX0lOU1RSCiAKLSMgZGVmaW5lIGxvY2FsX2lycV9zYXZlKGZsYWdzKQkJCQlcCisjIGRlZmluZSByYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpCQkJXAogCWRvIHsJCQkJCQlcCi0JCWFzbSB2b2xhdGlsZSAoIiMgbG9jYWxfaXJxX3NhdmUJXG5cdCIJXAotCQkJCSJtc3JjbHIgJTAsICUxCVxuXHQiCVwKLQkJCQkibm9wCVxuXHQiCQlcCisJCWFzbSB2b2xhdGlsZSAoIgltc3JjbHIgJTAsICUxOwkJXAorCQkJCW5vcDsiCQkJXAogCQkJCTogIj1yIihmbGFncykJCVwKIAkJCQk6ICJpIihNU1JfSUUpCQlcCiAJCQkJOiAibWVtb3J5Iik7CQlcCiAJfSB3aGlsZSAoMCkKIAotIyBkZWZpbmUgbG9jYWxfaXJxX2Rpc2FibGUoKQkJCQkJXAotCWRvIHsJCQkJCQkJXAotCQlhc20gdm9sYXRpbGUgKCIjIGxvY2FsX2lycV9kaXNhYmxlIFxuXHQiCVwKLQkJCQkibXNyY2xyIHIwLCAlMCBcblx0IgkJXAotCQkJCSJub3AJXG5cdCIJCQlcCi0JCQkJOgkJCQlcCi0JCQkJOiAiaSIoTVNSX0lFKQkJCVwKLQkJCQk6ICJtZW1vcnkiKTsJCQlcCisjIGRlZmluZSByYXdfbG9jYWxfaXJxX2Rpc2FibGUoKQkJCVwKKwlkbyB7CQkJCQkJXAorCQlhc20gdm9sYXRpbGUgKCIJbXNyY2xyIHIwLCAlMDsJCVwKKwkJCQlub3A7IgkJCVwKKwkJCQk6CQkJXAorCQkJCTogImkiKE1TUl9JRSkJCVwKKwkJCQk6ICJtZW1vcnkiKTsJCVwKIAl9IHdoaWxlICgwKQogCi0jIGRlZmluZSBsb2NhbF9pcnFfZW5hYmxlKCkJCQkJCVwKLQlkbyB7CQkJCQkJCVwKLQkJYXNtIHZvbGF0aWxlICgiIyBsb2NhbF9pcnFfZW5hYmxlIFxuXHQiCQlcCi0JCQkJIm1zcnNldAlyMCwgJTAgXG5cdCIJCVwKLQkJCQkibm9wCVxuXHQiCQkJXAotCQkJCToJCQkJXAotCQkJCTogImkiKE1TUl9JRSkJCQlcCi0JCQkJOiAibWVtb3J5Iik7CQkJXAorIyBkZWZpbmUgcmF3X2xvY2FsX2lycV9lbmFibGUoKQkJCQlcCisJZG8gewkJCQkJCVwKKwkJYXNtIHZvbGF0aWxlICgiCW1zcnNldAlyMCwgJTA7CQlcCisJCQkJbm9wOyIJCQlcCisJCQkJOgkJCVwKKwkJCQk6ICJpIihNU1JfSUUpCQlcCisJCQkJOiAibWVtb3J5Iik7CQlcCiAJfSB3aGlsZSAoMCkKIAogIyBlbHNlIC8qIENPTkZJR19YSUxJTlhfTUlDUk9CTEFaRTBfVVNFX01TUl9JTlNUUiA9PSAwICovCiAKLSMgZGVmaW5lIGxvY2FsX2lycV9zYXZlKGZsYWdzKQkJCQkJXAorIyBkZWZpbmUgcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKQkJCQlcCiAJZG8gewkJCQkJCQlcCiAJCXJlZ2lzdGVyIHVuc2lnbmVkIHRtcDsJCQkJXAotCQlhc20gdm9sYXRpbGUgKCIjIGxvY2FsX2lycV9zYXZlCVxuXHQiCQlcCi0JCQkJIm1mcwklMCwgcm1zciBcblx0IgkJXAotCQkJCSJub3AgXG5cdCIJCQlcCi0JCQkJImFuZGkJJTEsICUwLCAlMiBcblx0IglcCi0JCQkJIm10cwlybXNyLCAlMSBcblx0IgkJXAotCQkJCSJub3AgXG5cdCIJCQlcCisJCWFzbSB2b2xhdGlsZSAoIgltZnMJJTAsIHJtc3I7CQlcCisJCQkJbm9wOwkJCQlcCisJCQkJYW5kaQklMSwgJTAsICUyOwkJXAorCQkJCW10cwlybXNyLCAlMTsJCVwKKwkJCQlub3A7IgkJCQlcCiAJCQkJOiAiPXIiKGZsYWdzKSwgIj1yIiAodG1wKQlcCiAJCQkJOiAiaSIofk1TUl9JRSkJCQlcCiAJCQkJOiAibWVtb3J5Iik7CQkJXAogCX0gd2hpbGUgKDApCiAKLSMgZGVmaW5lIGxvY2FsX2lycV9kaXNhYmxlKCkJCQkJCVwKKyMgZGVmaW5lIHJhd19sb2NhbF9pcnFfZGlzYWJsZSgpCQkJCVwKIAlkbyB7CQkJCQkJCVwKIAkJcmVnaXN0ZXIgdW5zaWduZWQgdG1wOwkJCQlcCi0JCWFzbSB2b2xhdGlsZSAoIiMgbG9jYWxfaXJxX2Rpc2FibGUgXG5cdCIJXAotCQkJCSJtZnMJJTAsIHJtc3IgXG5cdCIJCVwKLQkJCQkibm9wIFxuXHQiCQkJXAotCQkJCSJhbmRpCSUwLCAlMCwgJTEgXG5cdCIJXAotCQkJCSJtdHMJcm1zciwgJTAgXG5cdCIJCVwKLQkJCQkibm9wIFxuXHQiCQkJXAorCQlhc20gdm9sYXRpbGUgKCIJbWZzCSUwLCBybXNyOwkJXAorCQkJCW5vcDsJCQkJXAorCQkJCWFuZGkJJTAsICUwLCAlMTsJCVwKKwkJCQltdHMJcm1zciwgJTA7CQlcCisJCQkJbm9wOyIJCQlcCiAJCQkJOiAiPXIiKHRtcCkJCQlcCiAJCQkJOiAiaSIofk1TUl9JRSkJCQlcCiAJCQkJOiAibWVtb3J5Iik7CQkJXAogCX0gd2hpbGUgKDApCiAKLSMgZGVmaW5lIGxvY2FsX2lycV9lbmFibGUoKQkJCQkJXAorIyBkZWZpbmUgcmF3X2xvY2FsX2lycV9lbmFibGUoKQkJCQkJXAogCWRvIHsJCQkJCQkJXAogCQlyZWdpc3RlciB1bnNpZ25lZCB0bXA7CQkJCVwKLQkJYXNtIHZvbGF0aWxlICgiIyBsb2NhbF9pcnFfZW5hYmxlIFxuXHQiCQlcCi0JCQkJIm1mcwklMCwgcm1zciBcblx0IgkJXAotCQkJCSJub3AgXG5cdCIJCQlcCi0JCQkJIm9yaQklMCwgJTAsICUxIFxuXHQiCVwKLQkJCQkibXRzCXJtc3IsICUwIFxuXHQiCQlcCi0JCQkJIm5vcCBcblx0IgkJCVwKKwkJYXNtIHZvbGF0aWxlICgiCW1mcwklMCwgcm1zcjsJCVwKKwkJCQlub3A7CQkJCVwKKwkJCQlvcmkJJTAsICUwLCAlMTsJCVwKKwkJCQltdHMJcm1zciwgJTA7CQlcCisJCQkJbm9wOyIJCQkJXAogCQkJCTogIj1yIih0bXApCQkJXAogCQkJCTogImkiKE1TUl9JRSkJCQlcCiAJCQkJOiAibWVtb3J5Iik7CQkJXApAQCAtODksMzUgKzg0LDI4IEBACiAKICMgZW5kaWYgLyogQ09ORklHX1hJTElOWF9NSUNST0JMQVpFMF9VU0VfTVNSX0lOU1RSICovCiAKLSNkZWZpbmUgbG9jYWxfc2F2ZV9mbGFncyhmbGFncykJCQkJCVwKKyNkZWZpbmUgcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKQkJCQlcCiAJZG8gewkJCQkJCQlcCi0JCWFzbSB2b2xhdGlsZSAoIiMgbG9jYWxfc2F2ZV9mbGFncyBcblx0IgkJXAotCQkJCSJtZnMJJTAsIHJtc3IgXG5cdCIJCVwKLQkJCQkibm9wCVxuXHQiCQkJXAotCQkJCTogIj1yIihmbGFncykJCQlcCisJCWFzbSB2b2xhdGlsZSAoIgltdHMJcm1zciwgJTA7CQlcCisJCQkJbm9wOyIJCQkJXAogCQkJCToJCQkJXAorCQkJCTogInIiKGZsYWdzKQkJCVwKIAkJCQk6ICJtZW1vcnkiKTsJCQlcCiAJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBsb2NhbF9pcnFfcmVzdG9yZShmbGFncykJCQlcCi0JZG8gewkJCQkJCVwKLQkJYXNtIHZvbGF0aWxlICgiIyBsb2NhbF9pcnFfcmVzdG9yZSBcblx0IlwKLQkJCQkibXRzCXJtc3IsICUwIFxuXHQiCVwKLQkJCQkibm9wCVxuXHQiCQlcCi0JCQkJOgkJCVwKLQkJCQk6ICJyIihmbGFncykJCVwKLQkJCQk6ICJtZW1vcnkiKTsJCVwKLQl9IHdoaWxlICgwKQotCi1zdGF0aWMgaW5saW5lIGludCBpcnFzX2Rpc2FibGVkKHZvaWQpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X21zcih2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsKLQlyZXR1cm4gKChmbGFncyAmIE1TUl9JRSkgPT0gMCk7CisJYXNtIHZvbGF0aWxlICgiCW1mcwklMCwgcm1zcjsJXAorCQkJbm9wOyIJCQlcCisJCQk6ICI9ciIoZmxhZ3MpCQlcCisJCQk6CQkJXAorCQkJOiAibWVtb3J5Iik7CQlcCisJcmV0dXJuIGZsYWdzOwogfQogCi0jZGVmaW5lIHJhd19pcnFzX2Rpc2FibGVkIGlycXNfZGlzYWJsZWQKLSNkZWZpbmUgcmF3X2lycXNfZGlzYWJsZWRfZmxhZ3MoZmxhZ3MpCSgoZmxhZ3MpID09IDApCisjZGVmaW5lIHJhd19sb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKQkoKGZsYWdzKSA9IGdldF9tc3IoKSkKKyNkZWZpbmUgcmF3X2lycXNfZGlzYWJsZWQoKQkJKChnZXRfbXNyKCkgJiBNU1JfSUUpID09IDApCisjZGVmaW5lIHJhd19pcnFzX2Rpc2FibGVkX2ZsYWdzKGZsYWdzKQkoKGZsYWdzICYgTVNSX0lFKSA9PSAwKQogCiAjZW5kaWYgLyogX0FTTV9NSUNST0JMQVpFX0lSUUZMQUdTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9wYWdlLmggYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vcGFnZS5oCmluZGV4IDg4MGM5ODguLjliNjZjMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9wYWdlLmgKKysrIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3BhZ2UuaApAQCAtMTY0LDcgKzE2NCw4IEBACiAjICBlbmRpZiAvKiBDT05GSUdfTU1VICovCiAKICMgIGlmbmRlZiBDT05GSUdfTU1VCi0jICBkZWZpbmUgcGZuX3ZhbGlkKHBmbikJKChwZm4pID49IG1pbl9sb3dfcGZuICYmIChwZm4pIDw9IG1heF9tYXBucikKKyMgIGRlZmluZSBwZm5fdmFsaWQocGZuKQkoKChwZm4pID49IG1pbl9sb3dfcGZuKSAmJiBcCisJCQkJKChwZm4pIDw9IChtaW5fbG93X3BmbiArIG1heF9tYXBucikpKQogIyAgZGVmaW5lIEFSQ0hfUEZOX09GRlNFVAkoUEFHRV9PRkZTRVQgPj4gUEFHRV9TSElGVCkKICMgIGVsc2UgLyogQ09ORklHX01NVSAqLwogIyAgZGVmaW5lIEFSQ0hfUEZOX09GRlNFVAkobWVtb3J5X3N0YXJ0ID4+IFBBR0VfU0hJRlQpCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vcGdhbGxvYy5oIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3BnYWxsb2MuaAppbmRleCBiMDEzMWRhLi43NTQ3ZjUwIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vcGdhbGxvYy5oCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9wZ2FsbG9jLmgKQEAgLTEwNiw5ICsxMDYsNiBAQAogICovCiAjZGVmaW5lIHBtZF9hbGxvY19vbmVfZmFzdChtbSwgYWRkcmVzcykJKHsgQlVHKCk7ICgocG1kX3QgKikxKTsgfSkKICNkZWZpbmUgcG1kX2FsbG9jX29uZShtbSwgYWRkcmVzcykJKHsgQlVHKCk7ICgocG1kX3QgKikyKTsgfSkKLS8qIEZJWE1FIHR3byBkZWZpbml0aW9uIC0gbG9vayBiZWxvdyAqLwotI2RlZmluZSBwbWRfZnJlZShtbSwgeCkJCQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIHBnZF9wb3B1bGF0ZShtbSwgcG1kLCBwdGUpCUJVRygpCiAKIHN0YXRpYyBpbmxpbmUgcHRlX3QgKnB0ZV9hbGxvY19vbmVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQl1bnNpZ25lZCBsb25nIGFkZHJlc3MpCkBAIC0xOTIsMTQgKzE4OSwxNCBAQAogICogdGhlIHBnZCB3aWxsIGFsd2F5cyBiZSBwcmVzZW50Li4KICAqLwogI2RlZmluZSBwbWRfYWxsb2Nfb25lKG1tLCBhZGRyZXNzKQkoeyBCVUcoKTsgKChwbWRfdCAqKTIpOyB9KQotLyojZGVmaW5lIHBtZF9mcmVlKG1tLCB4KQkJCWRvIHsgfSB3aGlsZSAoMCkqLwotI2RlZmluZSBfX3BtZF9mcmVlX3RsYih0bGIsIHgsIGFkZHIpCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgcG1kX2ZyZWUobW0sIHgpCQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBfX3BtZF9mcmVlX3RsYih0bGIsIHgsIGFkZHIpCXBtZF9mcmVlKCh0bGIpLT5tbSwgeCkKICNkZWZpbmUgcGdkX3BvcHVsYXRlKG1tLCBwbWQsIHB0ZSkJQlVHKCkKIAogZXh0ZXJuIGludCBkb19jaGVja19wZ3RfY2FjaGUoaW50LCBpbnQpOwogCiAjZW5kaWYgLyogQ09ORklHX01NVSAqLwogCi0jZGVmaW5lIGNoZWNrX3BndF9jYWNoZSgpCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBjaGVja19wZ3RfY2FjaGUoKQkJZG8geyB9IHdoaWxlICgwKQogCiAjZW5kaWYgLyogX0FTTV9NSUNST0JMQVpFX1BHQUxMT0NfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3B2ci5oIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3B2ci5oCmluZGV4IDY2ZjFiMzAuLmUzOGFiYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9wdnIuaAorKysgYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vcHZyLmgKQEAgLTc2LDIwICs3NiwyMyBAQAogI2RlZmluZSBQVlIzX0ZTTF9MSU5LU19NQVNLCQkweDAwMDAwMzgwCiAKIC8qIElDYWNoZSBjb25maWcgUFZSIG1hc2tzICovCi0jZGVmaW5lIFBWUjRfVVNFX0lDQUNIRV9NQVNLCQkweDgwMDAwMDAwCi0jZGVmaW5lIFBWUjRfSUNBQ0hFX0FERFJfVEFHX0JJVFNfTUFTSwkweDdDMDAwMDAwCi0jZGVmaW5lIFBWUjRfSUNBQ0hFX1VTRV9GU0xfTUFTSwkweDAyMDAwMDAwCi0jZGVmaW5lIFBWUjRfSUNBQ0hFX0FMTE9XX1dSX01BU0sJMHgwMTAwMDAwMAotI2RlZmluZSBQVlI0X0lDQUNIRV9MSU5FX0xFTl9NQVNLCTB4MDBFMDAwMDAKLSNkZWZpbmUgUFZSNF9JQ0FDSEVfQllURV9TSVpFX01BU0sJMHgwMDFGMDAwMAorI2RlZmluZSBQVlI0X1VTRV9JQ0FDSEVfTUFTSwkJMHg4MDAwMDAwMCAvKiBJQ1UgKi8KKyNkZWZpbmUgUFZSNF9JQ0FDSEVfQUREUl9UQUdfQklUU19NQVNLCTB4N0MwMDAwMDAgLyogSUNUUyAqLworI2RlZmluZSBQVlI0X0lDQUNIRV9BTExPV19XUl9NQVNLCTB4MDEwMDAwMDAgLyogSUNXICovCisjZGVmaW5lIFBWUjRfSUNBQ0hFX0xJTkVfTEVOX01BU0sJMHgwMEUwMDAwMCAvKiBJQ0xMICovCisjZGVmaW5lIFBWUjRfSUNBQ0hFX0JZVEVfU0laRV9NQVNLCTB4MDAxRjAwMDAgLyogSUNCUyAqLworI2RlZmluZSBQVlI0X0lDQUNIRV9BTFdBWVNfVVNFRAkJMHgwMDAwODAwMCAvKiBJQVUgKi8KKyNkZWZpbmUgUFZSNF9JQ0FDSEVfSU5URVJGQUNFCQkweDAwMDAyMDAwIC8qIElDSSAqLwogCiAvKiBEQ2FjaGUgY29uZmlnIFBWUiBtYXNrcyAqLwotI2RlZmluZSBQVlI1X1VTRV9EQ0FDSEVfTUFTSwkJMHg4MDAwMDAwMAotI2RlZmluZSBQVlI1X0RDQUNIRV9BRERSX1RBR19CSVRTX01BU0sJMHg3QzAwMDAwMAotI2RlZmluZSBQVlI1X0RDQUNIRV9VU0VfRlNMX01BU0sJMHgwMjAwMDAwMAotI2RlZmluZSBQVlI1X0RDQUNIRV9BTExPV19XUl9NQVNLCTB4MDEwMDAwMDAKLSNkZWZpbmUgUFZSNV9EQ0FDSEVfTElORV9MRU5fTUFTSwkweDAwRTAwMDAwCi0jZGVmaW5lIFBWUjVfRENBQ0hFX0JZVEVfU0laRV9NQVNLCTB4MDAxRjAwMDAKKyNkZWZpbmUgUFZSNV9VU0VfRENBQ0hFX01BU0sJCTB4ODAwMDAwMDAgLyogRENVICovCisjZGVmaW5lIFBWUjVfRENBQ0hFX0FERFJfVEFHX0JJVFNfTUFTSwkweDdDMDAwMDAwIC8qIERDVFMgKi8KKyNkZWZpbmUgUFZSNV9EQ0FDSEVfQUxMT1dfV1JfTUFTSwkweDAxMDAwMDAwIC8qIERDVyAqLworI2RlZmluZSBQVlI1X0RDQUNIRV9MSU5FX0xFTl9NQVNLCTB4MDBFMDAwMDAgLyogRENMTCAqLworI2RlZmluZSBQVlI1X0RDQUNIRV9CWVRFX1NJWkVfTUFTSwkweDAwMUYwMDAwIC8qIERDQlMgKi8KKyNkZWZpbmUgUFZSNV9EQ0FDSEVfQUxXQVlTX1VTRUQJCTB4MDAwMDgwMDAgLyogREFVICovCisjZGVmaW5lIFBWUjVfRENBQ0hFX1VTRV9XUklURUJBQ0sJMHgwMDAwNDAwMCAvKiBEV0IgKi8KKyNkZWZpbmUgUFZSNV9EQ0FDSEVfSU5URVJGQUNFCQkweDAwMDAyMDAwIC8qIERDSSAqLwogCiAvKiBJQ2FjaGUgYmFzZSBhZGRyZXNzIFBWUiBtYXNrICovCiAjZGVmaW5lIFBWUjZfSUNBQ0hFX0JBU0VBRERSX01BU0sJMHhGRkZGRkZGRgpAQCAtMTc4LDExICsxODEsMTQgQEAKIAkJCSgocHZyLnB2cls1XSAmIFBWUjVfRENBQ0hFX0FERFJfVEFHX0JJVFNfTUFTSykgPj4gMjYpCiAjZGVmaW5lIFBWUl9EQ0FDSEVfVVNFX0ZTTChwdnIpCQkocHZyLnB2cls1XSAmIFBWUjVfRENBQ0hFX1VTRV9GU0xfTUFTSykKICNkZWZpbmUgUFZSX0RDQUNIRV9BTExPV19XUihwdnIpCShwdnIucHZyWzVdICYgUFZSNV9EQ0FDSEVfQUxMT1dfV1JfTUFTSykKKy8qIEZJWE1FIHR3byBzaGlmdHMgb24gb25lIGxpbmUgbmVlZHMgYW55IGNvbW1lbnQgKi8KICNkZWZpbmUgUFZSX0RDQUNIRV9MSU5FX0xFTihwdnIpIFwKIAkJCSgxIDw8ICgocHZyLnB2cls1XSAmIFBWUjVfRENBQ0hFX0xJTkVfTEVOX01BU0spID4+IDIxKSkKICNkZWZpbmUgUFZSX0RDQUNIRV9CWVRFX1NJWkUocHZyKSBcCiAJCQkoMSA8PCAoKHB2ci5wdnJbNV0gJiBQVlI1X0RDQUNIRV9CWVRFX1NJWkVfTUFTSykgPj4gMTYpKQogCisjZGVmaW5lIFBWUl9EQ0FDSEVfVVNFX1dSSVRFQkFDSyhwdnIpIFwKKwkJCSgocHZyLnB2cls1XSAmIFBWUjVfRENBQ0hFX1VTRV9XUklURUJBQ0spID4+IDE0KQogCiAjZGVmaW5lIFBWUl9JQ0FDSEVfQkFTRUFERFIocHZyKQkocHZyLnB2cls2XSAmIFBWUjZfSUNBQ0hFX0JBU0VBRERSX01BU0spCiAjZGVmaW5lIFBWUl9JQ0FDSEVfSElHSEFERFIocHZyKQkocHZyLnB2cls3XSAmIFBWUjdfSUNBQ0hFX0hJR0hBRERSX01BU0spCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vc2V0dXAuaCBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9zZXR1cC5oCmluZGV4IGVkNjdjOWUuLjdmMzEzOTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9zZXR1cC5oCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9zZXR1cC5oCkBAIC0zNSw2ICszNSw4IEBACiBleHRlcm4gdm9pZCBlYXJseV9jb25zb2xlX3JlZ190bGJfYWxsb2ModW5zaWduZWQgaW50IGFkZHIpOwogIyAgIGVuZGlmIC8qIENPTkZJR19NTVUgKi8KIAorZXh0ZXJuIHZvaWQgb2ZfcGxhdGZvcm1fcmVzZXRfZ3Bpb19wcm9iZSh2b2lkKTsKKwogdm9pZCB0aW1lX2luaXQodm9pZCk7CiB2b2lkIGluaXRfSVJRKHZvaWQpOwogdm9pZCBtYWNoaW5lX2Vhcmx5X2luaXQoY29uc3QgY2hhciAqY21kbGluZSwgdW5zaWduZWQgaW50IHJhbSwKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9zeXN0ZW0uaCBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9zeXN0ZW0uaAppbmRleCBiMWVkNjE1Li4xNTc5NzA2OCAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3N5c3RlbS5oCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9zeXN0ZW0uaApAQCAtMTYsNiArMTYsOCBAQAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2NtcHhjaGcuaD4KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jbXB4Y2hnLWxvY2FsLmg+CiAKKyNkZWZpbmUgX19BUkNIX1dBTlRfSU5URVJSVVBUU19PTl9DVFhTVworCiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7CiBzdHJ1Y3QgdGhyZWFkX2luZm87CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IDU0MzFiNDYuLjM3MWJkNmUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtMjcyLDggKzI3Miw5IEBACiAJcmV0dXJuIHNpemU7CiB9CiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIF9fY29weV90b2Zyb21fdXNlcih2b2lkIF9fdXNlciAqdG8sCi0JCWNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIHNpemUpOworI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKQljb3B5X2Zyb21fdXNlcigodG8pLCAoZnJvbSksIChuKSkKKyNkZWZpbmUgX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyh0bywgZnJvbSwgbikgXAorCQljb3B5X2Zyb21fdXNlcigodG8pLCAoZnJvbSksIChuKSkKIAogI2RlZmluZSBjb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pCQkJCQlcCiAJKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsICh0byksIChuKSkgPwkJCQlcCkBAIC0yOTAsMTAgKzI5MSw2IEBACiAJCQkodm9pZCBfX3VzZXIgKikoZnJvbSksIChuKSkJCQlcCiAJCTogLUVGQVVMVCkKIAotI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKQljb3B5X2Zyb21fdXNlcigodG8pLCAoZnJvbSksIChuKSkKLSNkZWZpbmUgX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyh0bywgZnJvbSwgbikgXAotCQljb3B5X2Zyb21fdXNlcigodG8pLCAoZnJvbSksIChuKSkKLQogZXh0ZXJuIGludCBfX3N0cm5jcHlfdXNlcihjaGFyICp0bywgY29uc3QgY2hhciBfX3VzZXIgKmZyb20sIGludCBsZW4pOwogZXh0ZXJuIGludCBfX3N0cm5sZW5fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqc3N0ciwgaW50IGxlbik7CiAKQEAgLTMwNSw2ICszMDIsOSBAQAogCiAjZW5kaWYgLyogQ09ORklHX01NVSAqLwogCitleHRlcm4gdW5zaWduZWQgbG9uZyBfX2NvcHlfdG9mcm9tX3VzZXIodm9pZCBfX3VzZXIgKnRvLAorCQljb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBzaXplKTsKKwogLyoKICAqIFRoZSBleGNlcHRpb24gdGFibGUgY29uc2lzdHMgb2YgcGFpcnMgb2YgYWRkcmVzc2VzOiB0aGUgZmlyc3QgaXMgdGhlCiAgKiBhZGRyZXNzIG9mIGFuIGluc3RydWN0aW9uIHRoYXQgaXMgYWxsb3dlZCB0byBmYXVsdCwgYW5kIHRoZSBzZWNvbmQgaXMKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL01ha2VmaWxlCmluZGV4IGQ0ODc3MjkuLmIwNzU5NGUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9NYWtlZmlsZQpAQCAtMiwxMiArMiwyMiBAQAogIyBNYWtlZmlsZQogIwogCitpZmRlZiBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSCisjIERvIG5vdCB0cmFjZSBlYXJseSBib290IGNvZGUgYW5kIGxvdyBsZXZlbCBjb2RlCitDRkxBR1NfUkVNT1ZFX3RpbWVyLm8gPSAtcGcKK0NGTEFHU19SRU1PVkVfaW50Yy5vID0gLXBnCitDRkxBR1NfUkVNT1ZFX2Vhcmx5X3ByaW50ay5vID0gLXBnCitDRkxBR1NfUkVNT1ZFX3NlbGZtb2QubyA9IC1wZworQ0ZMQUdTX1JFTU9WRV9oZWFydGJlYXQubyA9IC1wZworQ0ZMQUdTX1JFTU9WRV9mdHJhY2UubyA9IC1wZworZW5kaWYKKwogZXh0cmEteSA6PSBoZWFkLm8gdm1saW51eC5sZHMKIAogb2JqLXkgKz0gZXhjZXB0aW9ucy5vIFwKIAlod19leGNlcHRpb25faGFuZGxlci5vIGluaXRfdGFzay5vIGludGMubyBpcnEubyBvZl9kZXZpY2UubyBcCiAJb2ZfcGxhdGZvcm0ubyBwcm9jZXNzLm8gcHJvbS5vIHByb21fcGFyc2UubyBwdHJhY2UubyBcCi0Jc2V0dXAubyBzaWduYWwubyBzeXNfbWljcm9ibGF6ZS5vIHRpbWVyLm8gdHJhcHMubworCXNldHVwLm8gc2lnbmFsLm8gc3lzX21pY3JvYmxhemUubyB0aW1lci5vIHRyYXBzLm8gcmVzZXQubwogCiBvYmoteSArPSBjcHUvCiAKQEAgLTE2LDUgKzI2LDcgQEAKIG9iai0kKENPTkZJR19IRUFSVF9CRUFUKQkrPSBoZWFydGJlYXQubwogb2JqLSQoQ09ORklHX01PRFVMRVMpCQkrPSBtaWNyb2JsYXplX2tzeW1zLm8gbW9kdWxlLm8KIG9iai0kKENPTkZJR19NTVUpCQkrPSBtaXNjLm8KK29iai0kKENPTkZJR19TVEFDS1RSQUNFKQkrPSBzdGFja3RyYWNlLm8KK29iai0kKENPTkZJR19GVU5DVElPTl9UUkFDRVIpCSs9IGZ0cmFjZS5vIG1jb3VudC5vCiAKIG9iai15CSs9IGVudHJ5JChNTVUpLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvY3B1L01ha2VmaWxlIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9jcHUvTWFrZWZpbGUKaW5kZXggMjA2NDZlNS4uNTljYzdiYyAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9jcHUvTWFrZWZpbGUKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9jcHUvTWFrZWZpbGUKQEAgLTIsNiArMiwxMCBAQAogIyBCdWlsZCB0aGUgYXBwcm9wcmlhdGUgQ1BVIHZlcnNpb24gc3VwcG9ydAogIwogCitpZmRlZiBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSCitDRkxBR1NfUkVNT1ZFX2NhY2hlLm8gPSAtcGcKK2VuZGlmCisKIEVYVFJBX0NGTEFHUyArPSAtRENQVV9NQUpPUj0kKENQVV9NQUpPUikgLURDUFVfTUlOT1I9JChDUFVfTUlOT1IpIFwKIAkJLURDUFVfUkVWPSQoQ1BVX1JFVikKIApkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9jcHUvY2FjaGUuYyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvY3B1L2NhY2hlLmMKaW5kZXggYWY4NjZhNC4uZDlkNjM4MyAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9jcHUvY2FjaGUuYworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2NwdS9jYWNoZS5jCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IE1pY2hhbCBTaW1layA8bW9uc3RyQG1vbnN0ci5ldT4KICAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFBldGFMb2dpeAotICogQ29weXJpZ2h0IChDKSAyMDA3IEpvaG4gV2lsbGlhbXMgPGpvaG4ud2lsbGlhbXNAcGV0YWxvZ2l4LmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEpvaG4gV2lsbGlhbXMgPGpvaG4ud2lsbGlhbXNAcGV0YWxvZ2l4LmNvbT4KICAqCiAgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsCiAgKiBQdWJsaWMgTGljZW5zZS4gU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMKQEAgLTEzLDI0MyArMTMsNTM0IEBACiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGFzbS9jcHVpbmZvLmg+CisjaW5jbHVkZSA8YXNtL3B2ci5oPgogCi0vKiBFeHBvcnRlZCBmdW5jdGlvbnMgKi8KLQotdm9pZCBfZW5hYmxlX2ljYWNoZSh2b2lkKQorc3RhdGljIGlubGluZSB2b2lkIF9faW52YWxpZGF0ZV9mbHVzaF9pY2FjaGUodW5zaWduZWQgaW50IGFkZHIpCiB7Ci0JaWYgKGNwdWluZm8udXNlX2ljYWNoZSkgewotI2lmIENPTkZJR19YSUxJTlhfTUlDUk9CTEFaRTBfVVNFX01TUl9JTlNUUgotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIgkJCQkJXAotCQkJCW1zcnNldAlyMCwgJTA7CQkJCVwKLQkJCQlub3A7ICIJCQkJCVwKLQkJCQk6CQkJCQlcCi0JCQkJOiAiaSIgKE1TUl9JQ0UpCQkJCVwKLQkJCQk6ICJtZW1vcnkiKTsKLSNlbHNlCi0JCV9fYXNtX18gX192b2xhdGlsZV9fICgiCQkJCQlcCi0JCQkJbWZzCXIxMiwgcm1zcjsJCQlcCi0JCQkJbm9wOwkJCQkJXAotCQkJCW9yaQlyMTIsIHIxMiwgJTA7CQkJXAotCQkJCW10cwlybXNyLCByMTI7CQkJXAotCQkJCW5vcDsgIgkJCQkJXAotCQkJCToJCQkJCVwKLQkJCQk6ICJpIiAoTVNSX0lDRSkJCQkJXAotCQkJCTogIm1lbW9yeSIsICJyMTIiKTsKLSNlbmRpZgotCX0KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIndpYwklMCwgcjA7IglcCisJCQkJCTogOiAiciIgKGFkZHIpKTsKIH0KIAotdm9pZCBfZGlzYWJsZV9pY2FjaGUodm9pZCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2ZsdXNoX2RjYWNoZSh1bnNpZ25lZCBpbnQgYWRkcikKIHsKLQlpZiAoY3B1aW5mby51c2VfaWNhY2hlKSB7Ci0jaWYgQ09ORklHX1hJTElOWF9NSUNST0JMQVpFMF9VU0VfTVNSX0lOU1RSCi0JCV9fYXNtX18gX192b2xhdGlsZV9fICgiCQkJCQlcCi0JCQkJbXNyY2xyIHIwLCAlMDsJCQkJXAotCQkJCW5vcDsgIgkJCQkJXAotCQkJCToJCQkJCVwKLQkJCQk6ICJpIiAoTVNSX0lDRSkJCQkJXAotCQkJCTogIm1lbW9yeSIpOwotI2Vsc2UKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCIJCQkJCVwKLQkJCQltZnMJcjEyLCBybXNyOwkJCVwKLQkJCQlub3A7CQkJCQlcCi0JCQkJYW5kaQlyMTIsIHIxMiwgfiUwOwkJCVwKLQkJCQltdHMJcm1zciwgcjEyOwkJCVwKLQkJCQlub3A7ICIJCQkJCVwKLQkJCQk6CQkJCQlcCi0JCQkJOiAiaSIgKE1TUl9JQ0UpCQkJCVwKLQkJCQk6ICJtZW1vcnkiLCAicjEyIik7Ci0jZW5kaWYKLQl9CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJ3ZGMuZmx1c2gJJTAsIHIwOyIJXAorCQkJCQk6IDogInIiIChhZGRyKSk7CiB9CiAKLXZvaWQgX2ludmFsaWRhdGVfaWNhY2hlKHVuc2lnbmVkIGludCBhZGRyKQorc3RhdGljIGlubGluZSB2b2lkIF9faW52YWxpZGF0ZV9kY2FjaGUodW5zaWduZWQgaW50IGJhc2VhZGRyLAorCQkJCQkJdW5zaWduZWQgaW50IG9mZnNldCkKIHsKLQlpZiAoY3B1aW5mby51c2VfaWNhY2hlKSB7Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fICgiCQkJCQlcCi0JCQkJd2ljCSUwLCByMCIJCQkJXAotCQkJCToJCQkJCVwKLQkJCQk6ICJyIiAoYWRkcikpOwotCX0KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIndkYy5jbGVhcgklMCwgJTE7IglcCisJCQkJCTogOiAiciIgKGJhc2VhZGRyKSwgInIiIChvZmZzZXQpKTsKIH0KIAotdm9pZCBfZW5hYmxlX2RjYWNoZSh2b2lkKQorc3RhdGljIGlubGluZSB2b2lkIF9fZW5hYmxlX2ljYWNoZV9tc3Iodm9pZCkKIHsKLQlpZiAoY3B1aW5mby51c2VfZGNhY2hlKSB7Ci0jaWYgQ09ORklHX1hJTElOWF9NSUNST0JMQVpFMF9VU0VfTVNSX0lOU1RSCi0JCV9fYXNtX18gX192b2xhdGlsZV9fICgiCQkJCQlcCi0JCQkJbXNyc2V0CXIwLCAlMDsJCQkJXAotCQkJCW5vcDsgIgkJCQkJXAotCQkJCToJCQkJCVwKLQkJCQk6ICJpIiAoTVNSX0RDRSkJCQkJXAotCQkJCTogIm1lbW9yeSIpOwotI2Vsc2UKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCIJCQkJCVwKLQkJCQltZnMJcjEyLCBybXNyOwkJCVwKLQkJCQlub3A7CQkJCQlcCi0JCQkJb3JpCXIxMiwgcjEyLCAlMDsJCQlcCi0JCQkJbXRzCXJtc3IsIHIxMjsJCQlcCi0JCQkJbm9wOyAiCQkJCQlcCi0JCQkJOgkJCQkJXAotCQkJCTogImkiIChNU1JfRENFKQkJCVwKLQkJCQk6ICJtZW1vcnkiLCAicjEyIik7Ci0jZW5kaWYKLQl9CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCIJbXNyc2V0CXIwLCAlMDsJCVwKKwkJCQlub3A7ICIJCQlcCisJCQk6IDogImkiIChNU1JfSUNFKSA6ICJtZW1vcnkiKTsKIH0KIAotdm9pZCBfZGlzYWJsZV9kY2FjaGUodm9pZCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2Rpc2FibGVfaWNhY2hlX21zcih2b2lkKQogewotI2lmIENPTkZJR19YSUxJTlhfTUlDUk9CTEFaRTBfVVNFX01TUl9JTlNUUgotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIgkJCQkJXAotCQkJCW1zcmNscglyMCwgJTA7CQkJCVwKLQkJCQlub3A7ICIJCQkJCVwKLQkJCQk6CQkJCQlcCi0JCQkJOiAiaSIgKE1TUl9EQ0UpCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgiCW1zcmNscglyMCwgJTA7CQlcCisJCQkJbm9wOyAiCQkJXAorCQkJOiA6ICJpIiAoTVNSX0lDRSkgOiAibWVtb3J5Iik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2VuYWJsZV9kY2FjaGVfbXNyKHZvaWQpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCIJbXNyc2V0CXIwLCAlMDsJCVwKKwkJCQlub3A7ICIJCQlcCisJCQkJOgkJCVwKKwkJCQk6ICJpIiAoTVNSX0RDRSkJCVwKIAkJCQk6ICJtZW1vcnkiKTsKLSNlbHNlCi0JCV9fYXNtX18gX192b2xhdGlsZV9fICgiCQkJCQlcCi0JCQkJbWZzCXIxMiwgcm1zcjsJCQlcCi0JCQkJbm9wOwkJCQkJXAotCQkJCWFuZGkJcjEyLCByMTIsIH4lMDsJCQlcCi0JCQkJbXRzCXJtc3IsIHIxMjsJCQlcCi0JCQkJbm9wOyAiCQkJCQlcCi0JCQkJOgkJCQkJXAotCQkJCTogImkiIChNU1JfRENFKQkJCVwKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fZGlzYWJsZV9kY2FjaGVfbXNyKHZvaWQpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCIJbXNyY2xyCXIwLCAlMDsJCVwKKwkJCQlub3A7ICIJCQlcCisJCQkJOgkJCVwKKwkJCQk6ICJpIiAoTVNSX0RDRSkJCVwKKwkJCQk6ICJtZW1vcnkiKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fZW5hYmxlX2ljYWNoZV9ub21zcih2b2lkKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fICgiCW1mcwlyMTIsIHJtc3I7CVwKKwkJCQlub3A7CQkJXAorCQkJCW9yaQlyMTIsIHIxMiwgJTA7CVwKKwkJCQltdHMJcm1zciwgcjEyOwlcCisJCQkJbm9wOyAiCQkJXAorCQkJCToJCQlcCisJCQkJOiAiaSIgKE1TUl9JQ0UpCQlcCiAJCQkJOiAibWVtb3J5IiwgInIxMiIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19kaXNhYmxlX2ljYWNoZV9ub21zcih2b2lkKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fICgiCW1mcwlyMTIsIHJtc3I7CVwKKwkJCQlub3A7CQkJXAorCQkJCWFuZGkJcjEyLCByMTIsIH4lMDsJXAorCQkJCW10cwlybXNyLCByMTI7CVwKKwkJCQlub3A7ICIJCQlcCisJCQkJOgkJCVwKKwkJCQk6ICJpIiAoTVNSX0lDRSkJCVwKKwkJCQk6ICJtZW1vcnkiLCAicjEyIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2VuYWJsZV9kY2FjaGVfbm9tc3Iodm9pZCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIgltZnMJcjEyLCBybXNyOwlcCisJCQkJbm9wOwkJCVwKKwkJCQlvcmkJcjEyLCByMTIsICUwOwlcCisJCQkJbXRzCXJtc3IsIHIxMjsJXAorCQkJCW5vcDsgIgkJCVwKKwkJCQk6CQkJXAorCQkJCTogImkiIChNU1JfRENFKQkJXAorCQkJCTogIm1lbW9yeSIsICJyMTIiKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fZGlzYWJsZV9kY2FjaGVfbm9tc3Iodm9pZCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIgltZnMJcjEyLCBybXNyOwlcCisJCQkJbm9wOwkJCVwKKwkJCQlhbmRpCXIxMiwgcjEyLCB+JTA7CVwKKwkJCQltdHMJcm1zciwgcjEyOwlcCisJCQkJbm9wOyAiCQkJXAorCQkJCToJCQlcCisJCQkJOiAiaSIgKE1TUl9EQ0UpCQlcCisJCQkJOiAibWVtb3J5IiwgInIxMiIpOworfQorCisKKy8qIEhlbHBlciBtYWNybyBmb3IgY29tcHV0aW5nIHRoZSBsaW1pdHMgb2YgY2FjaGUgcmFuZ2UgbG9vcHMgKi8KKyNkZWZpbmUgQ0FDSEVfTE9PUF9MSU1JVFMoc3RhcnQsIGVuZCwgY2FjaGVfbGluZV9sZW5ndGgsIGNhY2hlX3NpemUpCVwKK2RvIHsJCQkJCQkJCQlcCisJaW50IGFsaWduID0gfihjYWNoZV9saW5lX2xlbmd0aCAtIDEpOwkJCQlcCisJZW5kID0gbWluKHN0YXJ0ICsgY2FjaGVfc2l6ZSwgZW5kKTsJCQkJXAorCXN0YXJ0ICY9IGFsaWduOwkJCQkJCQlcCisJZW5kID0gKChlbmQgJiBhbGlnbikgKyBjYWNoZV9saW5lX2xlbmd0aCk7CQkJXAorfSB3aGlsZSAoMCk7CisKKy8qCisgKiBIZWxwZXIgbWFjcm8gdG8gbG9vcCBvdmVyIHRoZSBzcGVjaWZpZWQgY2FjaGVfc2l6ZS9saW5lX2xlbmd0aCBhbmQKKyAqIGV4ZWN1dGUgJ29wJyBvbiB0aGF0IGNhY2hlbGluZQorICovCisjZGVmaW5lIENBQ0hFX0FMTF9MT09QKGNhY2hlX3NpemUsIGxpbmVfbGVuZ3RoLCBvcCkJCQlcCitkbyB7CQkJCQkJCQkJXAorCXVuc2lnbmVkIGludCBsZW4gPSBjYWNoZV9zaXplOwkJCQkJXAorCWludCBzdGVwID0gLWxpbmVfbGVuZ3RoOwkJCQkJXAorCUJVR19PTihzdGVwID49IDApOwkJCQkJCVwKKwkJCQkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIiAxOiAgICAgICIgI29wICIgJTAsIHIwOwkJCVwKKwkJCQkJYmd0aWQgICAlMCwgMWI7CQkJXAorCQkJCQlhZGRrICAgICUwLCAlMCwgJTE7CQlcCisJCQkJCSIgOiA6ICJyIiAobGVuKSwgInIiIChzdGVwKQlcCisJCQkJCTogIm1lbW9yeSIpOwkJCVwKK30gd2hpbGUgKDApOworCisKKyNkZWZpbmUgQ0FDSEVfQUxMX0xPT1AyKGNhY2hlX3NpemUsIGxpbmVfbGVuZ3RoLCBvcCkJCQlcCitkbyB7CQkJCQkJCQkJXAorCXVuc2lnbmVkIGludCBsZW4gPSBjYWNoZV9zaXplOwkJCQkJXAorCWludCBzdGVwID0gLWxpbmVfbGVuZ3RoOwkJCQkJXAorCUJVR19PTihzdGVwID49IDApOwkJCQkJCVwKKwkJCQkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIiAxOiAgICAgICIgI29wICIgcjAsICUwOwkJCVwKKwkJCQkJYmd0aWQgICAlMCwgMWI7CQkJXAorCQkJCQlhZGRrICAgICUwLCAlMCwgJTE7CQlcCisJCQkJCSIgOiA6ICJyIiAobGVuKSwgInIiIChzdGVwKQlcCisJCQkJCTogIm1lbW9yeSIpOwkJCVwKK30gd2hpbGUgKDApOworCisvKiBmb3Igd2RjLmZsdXNoL2NsZWFyICovCisjZGVmaW5lIENBQ0hFX1JBTkdFX0xPT1BfMihzdGFydCwgZW5kLCBsaW5lX2xlbmd0aCwgb3ApCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpbnQgc3RlcCA9IC1saW5lX2xlbmd0aDsJCQkJCVwKKwlpbnQgY291bnQgPSBlbmQgLSBzdGFydDsJCQkJCVwKKwlCVUdfT04oY291bnQgPD0gMCk7CQkJCQkJXAorCQkJCQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgiIDE6CSIgI29wICIgJTAsICUxOwkJCVwKKwkJCQkJYmd0aWQgICAlMSwgMWI7CQkJXAorCQkJCQlhZGRrICAgICUxLCAlMSwgJTI7CQlcCisJCQkJCSIgOiA6ICJyIiAoc3RhcnQpLCAiciIgKGNvdW50KSwJXAorCQkJCQkiciIgKHN0ZXApIDogIm1lbW9yeSIpOwkJXAorfSB3aGlsZSAoMCk7CisKKy8qIEl0IGlzIHVzZWQgb25seSBmaXJzdCBwYXJhbWV0ZXIgZm9yIE9QIC0gZm9yIHdpYywgd2RjICovCisjZGVmaW5lIENBQ0hFX1JBTkdFX0xPT1BfMShzdGFydCwgZW5kLCBsaW5lX2xlbmd0aCwgb3ApCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpbnQgc3RlcCA9IC1saW5lX2xlbmd0aDsJCQkJCVwKKwlpbnQgY291bnQgPSBlbmQgLSBzdGFydDsJCQkJCVwKKwlCVUdfT04oY291bnQgPD0gMCk7CQkJCQkJXAorCQkJCQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgiIDE6CWFkZGsJJTAsICUwLCAlMTsJCVwKKwkJCQkJIiAjb3AgIiAlMCwgcjA7CQkJXAorCQkJCQliZ3RpZCAgICUxLCAxYjsJCQlcCisJCQkJCWFkZGsgICAgJTEsICUxLCAlMjsJCVwKKwkJCQkJIiA6IDogInIiIChzdGFydCksICJyIiAoY291bnQpLAlcCisJCQkJCSJyIiAoc3RlcCkgOiAibWVtb3J5Iik7CQlcCit9IHdoaWxlICgwKTsKKworc3RhdGljIHZvaWQgX19mbHVzaF9pY2FjaGVfcmFuZ2VfbXNyX2lycSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcHJfZGVidWcoIiVzOiBzdGFydCAweCV4LCBlbmQgMHgleFxuIiwgX19mdW5jX18sCisJCQkJKHVuc2lnbmVkIGludClzdGFydCwgKHVuc2lnbmVkIGludCkgZW5kKTsKKworCUNBQ0hFX0xPT1BfTElNSVRTKHN0YXJ0LCBlbmQsCisJCQljcHVpbmZvLmljYWNoZV9saW5lX2xlbmd0aCwgY3B1aW5mby5pY2FjaGVfc2l6ZSk7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJX19kaXNhYmxlX2ljYWNoZV9tc3IoKTsKKworCUNBQ0hFX1JBTkdFX0xPT1BfMShzdGFydCwgZW5kLCBjcHVpbmZvLmljYWNoZV9saW5lX2xlbmd0aCwgd2ljKTsKKworCV9fZW5hYmxlX2ljYWNoZV9tc3IoKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZmx1c2hfaWNhY2hlX3JhbmdlX25vbXNyX2lycSh1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJCXVuc2lnbmVkIGxvbmcgZW5kKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcl9kZWJ1ZygiJXM6IHN0YXJ0IDB4JXgsIGVuZCAweCV4XG4iLCBfX2Z1bmNfXywKKwkJCQkodW5zaWduZWQgaW50KXN0YXJ0LCAodW5zaWduZWQgaW50KSBlbmQpOworCisJQ0FDSEVfTE9PUF9MSU1JVFMoc3RhcnQsIGVuZCwKKwkJCWNwdWluZm8uaWNhY2hlX2xpbmVfbGVuZ3RoLCBjcHVpbmZvLmljYWNoZV9zaXplKTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlfX2Rpc2FibGVfaWNhY2hlX25vbXNyKCk7CisKKwlDQUNIRV9SQU5HRV9MT09QXzEoc3RhcnQsIGVuZCwgY3B1aW5mby5pY2FjaGVfbGluZV9sZW5ndGgsIHdpYyk7CisKKwlfX2VuYWJsZV9pY2FjaGVfbm9tc3IoKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZmx1c2hfaWNhY2hlX3JhbmdlX25vaXJxKHVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCQkJdW5zaWduZWQgbG9uZyBlbmQpCit7CisJcHJfZGVidWcoIiVzOiBzdGFydCAweCV4LCBlbmQgMHgleFxuIiwgX19mdW5jX18sCisJCQkJKHVuc2lnbmVkIGludClzdGFydCwgKHVuc2lnbmVkIGludCkgZW5kKTsKKworCUNBQ0hFX0xPT1BfTElNSVRTKHN0YXJ0LCBlbmQsCisJCQljcHVpbmZvLmljYWNoZV9saW5lX2xlbmd0aCwgY3B1aW5mby5pY2FjaGVfc2l6ZSk7CisJQ0FDSEVfUkFOR0VfTE9PUF8xKHN0YXJ0LCBlbmQsIGNwdWluZm8uaWNhY2hlX2xpbmVfbGVuZ3RoLCB3aWMpOworfQorCitzdGF0aWMgdm9pZCBfX2ZsdXNoX2ljYWNoZV9hbGxfbXNyX2lycSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlfX2Rpc2FibGVfaWNhY2hlX21zcigpOworCisJQ0FDSEVfQUxMX0xPT1AoY3B1aW5mby5pY2FjaGVfc2l6ZSwgY3B1aW5mby5pY2FjaGVfbGluZV9sZW5ndGgsIHdpYyk7CisKKwlfX2VuYWJsZV9pY2FjaGVfbXNyKCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBfX2ZsdXNoX2ljYWNoZV9hbGxfbm9tc3JfaXJxKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCV9fZGlzYWJsZV9pY2FjaGVfbm9tc3IoKTsKKworCUNBQ0hFX0FMTF9MT09QKGNwdWluZm8uaWNhY2hlX3NpemUsIGNwdWluZm8uaWNhY2hlX2xpbmVfbGVuZ3RoLCB3aWMpOworCisJX19lbmFibGVfaWNhY2hlX25vbXNyKCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBfX2ZsdXNoX2ljYWNoZV9hbGxfbm9pcnEodm9pZCkKK3sKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKwlDQUNIRV9BTExfTE9PUChjcHVpbmZvLmljYWNoZV9zaXplLCBjcHVpbmZvLmljYWNoZV9saW5lX2xlbmd0aCwgd2ljKTsKK30KKworc3RhdGljIHZvaWQgX19pbnZhbGlkYXRlX2RjYWNoZV9hbGxfbXNyX2lycSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlfX2Rpc2FibGVfZGNhY2hlX21zcigpOworCisJQ0FDSEVfQUxMX0xPT1AoY3B1aW5mby5kY2FjaGVfc2l6ZSwgY3B1aW5mby5kY2FjaGVfbGluZV9sZW5ndGgsIHdkYyk7CisKKwlfX2VuYWJsZV9kY2FjaGVfbXNyKCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBfX2ludmFsaWRhdGVfZGNhY2hlX2FsbF9ub21zcl9pcnEodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJX19kaXNhYmxlX2RjYWNoZV9ub21zcigpOworCisJQ0FDSEVfQUxMX0xPT1AoY3B1aW5mby5kY2FjaGVfc2l6ZSwgY3B1aW5mby5kY2FjaGVfbGluZV9sZW5ndGgsIHdkYyk7CisKKwlfX2VuYWJsZV9kY2FjaGVfbm9tc3IoKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW52YWxpZGF0ZV9kY2FjaGVfYWxsX25vaXJxX3d0KHZvaWQpCit7CisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisJQ0FDSEVfQUxMX0xPT1AoY3B1aW5mby5kY2FjaGVfc2l6ZSwgY3B1aW5mby5kY2FjaGVfbGluZV9sZW5ndGgsIHdkYykKK30KKworLyogRklYTUUgdGhpcyBpcyB3ZWlyZCAtIHNob3VsZCBiZSBvbmx5IHdkYyBidXQgbm90IHdvcmsKKyAqIE1TOiBJIGFtIGdldHRpbmcgYnVzIGVycm9ycyBhbmQgb3RoZXIgd2VpcmQgdGhpbmdzICovCitzdGF0aWMgdm9pZCBfX2ludmFsaWRhdGVfZGNhY2hlX2FsbF93Yih2b2lkKQoreworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCUNBQ0hFX0FMTF9MT09QMihjcHVpbmZvLmRjYWNoZV9zaXplLCBjcHVpbmZvLmRjYWNoZV9saW5lX2xlbmd0aCwKKwkJCQkJd2RjLmNsZWFyKQorCisjaWYgMAorCXVuc2lnbmVkIGludCBpOworCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBKdXN0IGxvb3AgdGhyb3VnaCBjYWNoZSBzaXplIGFuZCBpbnZhbGlkYXRlIGl0ICovCisJZm9yIChpID0gMDsgaSA8IGNwdWluZm8uZGNhY2hlX3NpemU7IGkgKz0gY3B1aW5mby5kY2FjaGVfbGluZV9sZW5ndGgpCisJCQlfX2ludmFsaWRhdGVfZGNhY2hlKDAsIGkpOwogI2VuZGlmCiB9CiAKLXZvaWQgX2ludmFsaWRhdGVfZGNhY2hlKHVuc2lnbmVkIGludCBhZGRyKQorc3RhdGljIHZvaWQgX19pbnZhbGlkYXRlX2RjYWNoZV9yYW5nZV93Yih1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJCQkJdW5zaWduZWQgbG9uZyBlbmQpCiB7Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fICgiCQkJCQlcCi0JCQkJd2RjCSUwLCByMCIJCQkJXAotCQkJCToJCQkJCVwKLQkJCQk6ICJyIiAoYWRkcikpOworCXByX2RlYnVnKCIlczogc3RhcnQgMHgleCwgZW5kIDB4JXhcbiIsIF9fZnVuY19fLAorCQkJCSh1bnNpZ25lZCBpbnQpc3RhcnQsICh1bnNpZ25lZCBpbnQpIGVuZCk7CisKKwlDQUNIRV9MT09QX0xJTUlUUyhzdGFydCwgZW5kLAorCQkJY3B1aW5mby5kY2FjaGVfbGluZV9sZW5ndGgsIGNwdWluZm8uZGNhY2hlX3NpemUpOworCUNBQ0hFX1JBTkdFX0xPT1BfMihzdGFydCwgZW5kLCBjcHVpbmZvLmRjYWNoZV9saW5lX2xlbmd0aCwgd2RjLmNsZWFyKTsKIH0KIAotdm9pZCBfX2ludmFsaWRhdGVfaWNhY2hlX2FsbCh2b2lkKQorc3RhdGljIHZvaWQgX19pbnZhbGlkYXRlX2RjYWNoZV9yYW5nZV9ub21zcl93dCh1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJCQkJCXVuc2lnbmVkIGxvbmcgZW5kKQogewotCXVuc2lnbmVkIGludCBpOwotCXVuc2lnbmVkIGZsYWdzOworCXByX2RlYnVnKCIlczogc3RhcnQgMHgleCwgZW5kIDB4JXhcbiIsIF9fZnVuY19fLAorCQkJCSh1bnNpZ25lZCBpbnQpc3RhcnQsICh1bnNpZ25lZCBpbnQpIGVuZCk7CisJQ0FDSEVfTE9PUF9MSU1JVFMoc3RhcnQsIGVuZCwKKwkJCWNwdWluZm8uZGNhY2hlX2xpbmVfbGVuZ3RoLCBjcHVpbmZvLmRjYWNoZV9zaXplKTsKIAotCWlmIChjcHVpbmZvLnVzZV9pY2FjaGUpIHsKLQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQlfX2Rpc2FibGVfaWNhY2hlKCk7CisJQ0FDSEVfUkFOR0VfTE9PUF8xKHN0YXJ0LCBlbmQsIGNwdWluZm8uZGNhY2hlX2xpbmVfbGVuZ3RoLCB3ZGMpOworfQogCi0JCS8qIEp1c3QgbG9vcCB0aHJvdWdoIGNhY2hlIHNpemUgYW5kIGludmFsaWRhdGUsIG5vIG5lZWQgdG8gYWRkCi0JCQlDQUNIRV9CQVNFIGFkZHJlc3MgKi8KLQkJZm9yIChpID0gMDsgaSA8IGNwdWluZm8uaWNhY2hlX3NpemU7Ci0JCQlpICs9IGNwdWluZm8uaWNhY2hlX2xpbmUpCi0JCQkJX19pbnZhbGlkYXRlX2ljYWNoZShpKTsKK3N0YXRpYyB2b2lkIF9faW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2VfbXNyX2lycV93dCh1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJCQkJCXVuc2lnbmVkIGxvbmcgZW5kKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQkJX19lbmFibGVfaWNhY2hlKCk7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlwcl9kZWJ1ZygiJXM6IHN0YXJ0IDB4JXgsIGVuZCAweCV4XG4iLCBfX2Z1bmNfXywKKwkJCQkodW5zaWduZWQgaW50KXN0YXJ0LCAodW5zaWduZWQgaW50KSBlbmQpOworCUNBQ0hFX0xPT1BfTElNSVRTKHN0YXJ0LCBlbmQsCisJCQljcHVpbmZvLmRjYWNoZV9saW5lX2xlbmd0aCwgY3B1aW5mby5kY2FjaGVfc2l6ZSk7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJX19kaXNhYmxlX2RjYWNoZV9tc3IoKTsKKworCUNBQ0hFX1JBTkdFX0xPT1BfMShzdGFydCwgZW5kLCBjcHVpbmZvLmRjYWNoZV9saW5lX2xlbmd0aCwgd2RjKTsKKworCV9fZW5hYmxlX2RjYWNoZV9tc3IoKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2Vfbm9tc3JfaXJxKHVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCQkJCQkJdW5zaWduZWQgbG9uZyBlbmQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXByX2RlYnVnKCIlczogc3RhcnQgMHgleCwgZW5kIDB4JXhcbiIsIF9fZnVuY19fLAorCQkJCSh1bnNpZ25lZCBpbnQpc3RhcnQsICh1bnNpZ25lZCBpbnQpIGVuZCk7CisKKwlDQUNIRV9MT09QX0xJTUlUUyhzdGFydCwgZW5kLAorCQkJY3B1aW5mby5kY2FjaGVfbGluZV9sZW5ndGgsIGNwdWluZm8uZGNhY2hlX3NpemUpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCV9fZGlzYWJsZV9kY2FjaGVfbm9tc3IoKTsKKworCUNBQ0hFX1JBTkdFX0xPT1BfMShzdGFydCwgZW5kLCBjcHVpbmZvLmRjYWNoZV9saW5lX2xlbmd0aCwgd2RjKTsKKworCV9fZW5hYmxlX2RjYWNoZV9ub21zcigpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgX19mbHVzaF9kY2FjaGVfYWxsX3diKHZvaWQpCit7CisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisJQ0FDSEVfQUxMX0xPT1AoY3B1aW5mby5kY2FjaGVfc2l6ZSwgY3B1aW5mby5kY2FjaGVfbGluZV9sZW5ndGgsCisJCQkJd2RjLmZsdXNoKTsKK30KKworc3RhdGljIHZvaWQgX19mbHVzaF9kY2FjaGVfcmFuZ2Vfd2IodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJcHJfZGVidWcoIiVzOiBzdGFydCAweCV4LCBlbmQgMHgleFxuIiwgX19mdW5jX18sCisJCQkJKHVuc2lnbmVkIGludClzdGFydCwgKHVuc2lnbmVkIGludCkgZW5kKTsKKworCUNBQ0hFX0xPT1BfTElNSVRTKHN0YXJ0LCBlbmQsCisJCQljcHVpbmZvLmRjYWNoZV9saW5lX2xlbmd0aCwgY3B1aW5mby5kY2FjaGVfc2l6ZSk7CisJQ0FDSEVfUkFOR0VfTE9PUF8yKHN0YXJ0LCBlbmQsIGNwdWluZm8uZGNhY2hlX2xpbmVfbGVuZ3RoLCB3ZGMuZmx1c2gpOworfQorCisvKiBzdHJ1Y3QgZm9yIHdiIGNhY2hlcyBhbmQgZm9yIHd0IGNhY2hlcyAqLworc3RydWN0IHNjYWNoZSAqbWJjOworCisvKiBuZXcgd2IgY2FjaGUgbW9kZWwgKi8KK2NvbnN0IHN0cnVjdCBzY2FjaGUgd2JfbXNyID0geworCS5pZSA9IF9fZW5hYmxlX2ljYWNoZV9tc3IsCisJLmlkID0gX19kaXNhYmxlX2ljYWNoZV9tc3IsCisJLmlmbCA9IF9fZmx1c2hfaWNhY2hlX2FsbF9ub2lycSwKKwkuaWZsciA9IF9fZmx1c2hfaWNhY2hlX3JhbmdlX25vaXJxLAorCS5paW4gPSBfX2ZsdXNoX2ljYWNoZV9hbGxfbm9pcnEsCisJLmlpbnIgPSBfX2ZsdXNoX2ljYWNoZV9yYW5nZV9ub2lycSwKKwkuZGUgPSBfX2VuYWJsZV9kY2FjaGVfbXNyLAorCS5kZCA9IF9fZGlzYWJsZV9kY2FjaGVfbXNyLAorCS5kZmwgPSBfX2ZsdXNoX2RjYWNoZV9hbGxfd2IsCisJLmRmbHIgPSBfX2ZsdXNoX2RjYWNoZV9yYW5nZV93YiwKKwkuZGluID0gX19pbnZhbGlkYXRlX2RjYWNoZV9hbGxfd2IsCisJLmRpbnIgPSBfX2ludmFsaWRhdGVfZGNhY2hlX3JhbmdlX3diLAorfTsKKworLyogVGhlcmUgaXMgb25seSBkaWZmZXJlbmNlIGluIGllLCBpZCwgZGUsIGRkIGZ1bmN0aW9ucyAqLworY29uc3Qgc3RydWN0IHNjYWNoZSB3Yl9ub21zciA9IHsKKwkuaWUgPSBfX2VuYWJsZV9pY2FjaGVfbm9tc3IsCisJLmlkID0gX19kaXNhYmxlX2ljYWNoZV9ub21zciwKKwkuaWZsID0gX19mbHVzaF9pY2FjaGVfYWxsX25vaXJxLAorCS5pZmxyID0gX19mbHVzaF9pY2FjaGVfcmFuZ2Vfbm9pcnEsCisJLmlpbiA9IF9fZmx1c2hfaWNhY2hlX2FsbF9ub2lycSwKKwkuaWluciA9IF9fZmx1c2hfaWNhY2hlX3JhbmdlX25vaXJxLAorCS5kZSA9IF9fZW5hYmxlX2RjYWNoZV9ub21zciwKKwkuZGQgPSBfX2Rpc2FibGVfZGNhY2hlX25vbXNyLAorCS5kZmwgPSBfX2ZsdXNoX2RjYWNoZV9hbGxfd2IsCisJLmRmbHIgPSBfX2ZsdXNoX2RjYWNoZV9yYW5nZV93YiwKKwkuZGluID0gX19pbnZhbGlkYXRlX2RjYWNoZV9hbGxfd2IsCisJLmRpbnIgPSBfX2ludmFsaWRhdGVfZGNhY2hlX3JhbmdlX3diLAorfTsKKworLyogT2xkIHd0IGNhY2hlIG1vZGVsIHdpdGggZGlzYWJsaW5nIGlycSBhbmQgdHVybiBvZmYgY2FjaGUgKi8KK2NvbnN0IHN0cnVjdCBzY2FjaGUgd3RfbXNyID0geworCS5pZSA9IF9fZW5hYmxlX2ljYWNoZV9tc3IsCisJLmlkID0gX19kaXNhYmxlX2ljYWNoZV9tc3IsCisJLmlmbCA9IF9fZmx1c2hfaWNhY2hlX2FsbF9tc3JfaXJxLAorCS5pZmxyID0gX19mbHVzaF9pY2FjaGVfcmFuZ2VfbXNyX2lycSwKKwkuaWluID0gX19mbHVzaF9pY2FjaGVfYWxsX21zcl9pcnEsCisJLmlpbnIgPSBfX2ZsdXNoX2ljYWNoZV9yYW5nZV9tc3JfaXJxLAorCS5kZSA9IF9fZW5hYmxlX2RjYWNoZV9tc3IsCisJLmRkID0gX19kaXNhYmxlX2RjYWNoZV9tc3IsCisJLmRmbCA9IF9faW52YWxpZGF0ZV9kY2FjaGVfYWxsX21zcl9pcnEsCisJLmRmbHIgPSBfX2ludmFsaWRhdGVfZGNhY2hlX3JhbmdlX21zcl9pcnFfd3QsCisJLmRpbiA9IF9faW52YWxpZGF0ZV9kY2FjaGVfYWxsX21zcl9pcnEsCisJLmRpbnIgPSBfX2ludmFsaWRhdGVfZGNhY2hlX3JhbmdlX21zcl9pcnFfd3QsCit9OworCitjb25zdCBzdHJ1Y3Qgc2NhY2hlIHd0X25vbXNyID0geworCS5pZSA9IF9fZW5hYmxlX2ljYWNoZV9ub21zciwKKwkuaWQgPSBfX2Rpc2FibGVfaWNhY2hlX25vbXNyLAorCS5pZmwgPSBfX2ZsdXNoX2ljYWNoZV9hbGxfbm9tc3JfaXJxLAorCS5pZmxyID0gX19mbHVzaF9pY2FjaGVfcmFuZ2Vfbm9tc3JfaXJxLAorCS5paW4gPSBfX2ZsdXNoX2ljYWNoZV9hbGxfbm9tc3JfaXJxLAorCS5paW5yID0gX19mbHVzaF9pY2FjaGVfcmFuZ2Vfbm9tc3JfaXJxLAorCS5kZSA9IF9fZW5hYmxlX2RjYWNoZV9ub21zciwKKwkuZGQgPSBfX2Rpc2FibGVfZGNhY2hlX25vbXNyLAorCS5kZmwgPSBfX2ludmFsaWRhdGVfZGNhY2hlX2FsbF9ub21zcl9pcnEsCisJLmRmbHIgPSBfX2ludmFsaWRhdGVfZGNhY2hlX3JhbmdlX25vbXNyX2lycSwKKwkuZGluID0gX19pbnZhbGlkYXRlX2RjYWNoZV9hbGxfbm9tc3JfaXJxLAorCS5kaW5yID0gX19pbnZhbGlkYXRlX2RjYWNoZV9yYW5nZV9ub21zcl9pcnEsCit9OworCisvKiBOZXcgd3QgY2FjaGUgbW9kZWwgZm9yIG5ld2VyIE1pY3JvYmxhemUgdmVyc2lvbnMgKi8KK2NvbnN0IHN0cnVjdCBzY2FjaGUgd3RfbXNyX25vaXJxID0geworCS5pZSA9IF9fZW5hYmxlX2ljYWNoZV9tc3IsCisJLmlkID0gX19kaXNhYmxlX2ljYWNoZV9tc3IsCisJLmlmbCA9IF9fZmx1c2hfaWNhY2hlX2FsbF9ub2lycSwKKwkuaWZsciA9IF9fZmx1c2hfaWNhY2hlX3JhbmdlX25vaXJxLAorCS5paW4gPSBfX2ZsdXNoX2ljYWNoZV9hbGxfbm9pcnEsCisJLmlpbnIgPSBfX2ZsdXNoX2ljYWNoZV9yYW5nZV9ub2lycSwKKwkuZGUgPSBfX2VuYWJsZV9kY2FjaGVfbXNyLAorCS5kZCA9IF9fZGlzYWJsZV9kY2FjaGVfbXNyLAorCS5kZmwgPSBfX2ludmFsaWRhdGVfZGNhY2hlX2FsbF9ub2lycV93dCwKKwkuZGZsciA9IF9faW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2Vfbm9tc3Jfd3QsCisJLmRpbiA9IF9faW52YWxpZGF0ZV9kY2FjaGVfYWxsX25vaXJxX3d0LAorCS5kaW5yID0gX19pbnZhbGlkYXRlX2RjYWNoZV9yYW5nZV9ub21zcl93dCwKK307CisKK2NvbnN0IHN0cnVjdCBzY2FjaGUgd3Rfbm9tc3Jfbm9pcnEgPSB7CisJLmllID0gX19lbmFibGVfaWNhY2hlX25vbXNyLAorCS5pZCA9IF9fZGlzYWJsZV9pY2FjaGVfbm9tc3IsCisJLmlmbCA9IF9fZmx1c2hfaWNhY2hlX2FsbF9ub2lycSwKKwkuaWZsciA9IF9fZmx1c2hfaWNhY2hlX3JhbmdlX25vaXJxLAorCS5paW4gPSBfX2ZsdXNoX2ljYWNoZV9hbGxfbm9pcnEsCisJLmlpbnIgPSBfX2ZsdXNoX2ljYWNoZV9yYW5nZV9ub2lycSwKKwkuZGUgPSBfX2VuYWJsZV9kY2FjaGVfbm9tc3IsCisJLmRkID0gX19kaXNhYmxlX2RjYWNoZV9ub21zciwKKwkuZGZsID0gX19pbnZhbGlkYXRlX2RjYWNoZV9hbGxfbm9pcnFfd3QsCisJLmRmbHIgPSBfX2ludmFsaWRhdGVfZGNhY2hlX3JhbmdlX25vbXNyX3d0LAorCS5kaW4gPSBfX2ludmFsaWRhdGVfZGNhY2hlX2FsbF9ub2lycV93dCwKKwkuZGluciA9IF9faW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2Vfbm9tc3Jfd3QsCit9OworCisvKiBDUFUgdmVyc2lvbiBjb2RlIGZvciA3LjIwLmMgLSBzZWUgYXJjaC9taWNyb2JsYXplL2tlcm5lbC9jcHUvY3B1aW5mby5jICovCisjZGVmaW5lIENQVVZFUl83XzIwX0EJMHgwYworI2RlZmluZSBDUFVWRVJfN18yMF9ECTB4MGYKKworI2RlZmluZSBJTkZPKHMpCXByaW50ayhLRVJOX0lORk8gImNhY2hlOiAiIHMgIiBcbiIpOworCit2b2lkIG1pY3JvYmxhemVfY2FjaGVfaW5pdCh2b2lkKQoreworCWlmIChjcHVpbmZvLnVzZV9pbnN0ciAmIFBWUjJfVVNFX01TUl9JTlNUUikgeworCQlpZiAoY3B1aW5mby5kY2FjaGVfd2IpIHsKKwkJCUlORk8oIndiX21zciIpOworCQkJbWJjID0gKHN0cnVjdCBzY2FjaGUgKikmd2JfbXNyOworCQkJaWYgKGNwdWluZm8udmVyX2NvZGUgPCBDUFVWRVJfN18yMF9EKSB7CisJCQkJLyogTVM6IHByb2JsZW0gd2l0aCBzaWduYWwgaGFuZGxpbmcgLSBodyBidWcgKi8KKwkJCQlJTkZPKCJXQiB3b24ndCB3b3JrIHByb3Blcmx5Iik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoY3B1aW5mby52ZXJfY29kZSA+PSBDUFVWRVJfN18yMF9BKSB7CisJCQkJSU5GTygid3RfbXNyX25vaXJxIik7CisJCQkJbWJjID0gKHN0cnVjdCBzY2FjaGUgKikmd3RfbXNyX25vaXJxOworCQkJfSBlbHNlIHsKKwkJCQlJTkZPKCJ3dF9tc3IiKTsKKwkJCQltYmMgPSAoc3RydWN0IHNjYWNoZSAqKSZ3dF9tc3I7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAoY3B1aW5mby5kY2FjaGVfd2IpIHsKKwkJCUlORk8oIndiX25vbXNyIik7CisJCQltYmMgPSAoc3RydWN0IHNjYWNoZSAqKSZ3Yl9ub21zcjsKKwkJCWlmIChjcHVpbmZvLnZlcl9jb2RlIDwgQ1BVVkVSXzdfMjBfRCkgeworCQkJCS8qIE1TOiBwcm9ibGVtIHdpdGggc2lnbmFsIGhhbmRsaW5nIC0gaHcgYnVnICovCisJCQkJSU5GTygiV0Igd29uJ3Qgd29yayBwcm9wZXJseSIpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGNwdWluZm8udmVyX2NvZGUgPj0gQ1BVVkVSXzdfMjBfQSkgeworCQkJCUlORk8oInd0X25vbXNyX25vaXJxIik7CisJCQkJbWJjID0gKHN0cnVjdCBzY2FjaGUgKikmd3Rfbm9tc3Jfbm9pcnE7CisJCQl9IGVsc2UgeworCQkJCUlORk8oInd0X25vbXNyIik7CisJCQkJbWJjID0gKHN0cnVjdCBzY2FjaGUgKikmd3Rfbm9tc3I7CisJCQl9CisJCX0KIAl9CiB9Ci0KLXZvaWQgX19pbnZhbGlkYXRlX2ljYWNoZV9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQl1bnNpZ25lZCBmbGFnczsKLQl1bnNpZ25lZCBpbnQgYWxpZ247Ci0KLQlpZiAoY3B1aW5mby51c2VfaWNhY2hlKSB7Ci0JCS8qCi0JCSAqIE5vIG5lZWQgdG8gY292ZXIgZW50aXJlIGNhY2hlIHJhbmdlLAotCQkgKiBqdXN0IGNvdmVyIGNhY2hlIGZvb3RwcmludAotCQkgKi8KLQkJZW5kID0gbWluKHN0YXJ0ICsgY3B1aW5mby5pY2FjaGVfc2l6ZSwgZW5kKTsKLQkJYWxpZ24gPSB+KGNwdWluZm8uaWNhY2hlX2xpbmUgLSAxKTsKLQkJc3RhcnQgJj0gYWxpZ247IC8qIE1ha2Ugc3VyZSB3ZSBhcmUgYWxpZ25lZCAqLwotCQkvKiBQdXNoIGVuZCB1cCB0byB0aGUgbmV4dCBjYWNoZSBsaW5lICovCi0JCWVuZCA9ICgoZW5kICYgYWxpZ24pICsgY3B1aW5mby5pY2FjaGVfbGluZSk7Ci0KLQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQlfX2Rpc2FibGVfaWNhY2hlKCk7Ci0KLQkJZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gY3B1aW5mby5pY2FjaGVfbGluZSkKLQkJCV9faW52YWxpZGF0ZV9pY2FjaGUoaSk7Ci0KLQkJX19lbmFibGVfaWNhY2hlKCk7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQl9Ci19Ci0KLXZvaWQgX19pbnZhbGlkYXRlX2ljYWNoZV9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQlfX2ludmFsaWRhdGVfaWNhY2hlX2FsbCgpOwotfQotCi12b2lkIF9faW52YWxpZGF0ZV9pY2FjaGVfdXNlcl9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBhZHIsCi0JCQkJaW50IGxlbikKLXsKLQlfX2ludmFsaWRhdGVfaWNhY2hlX2FsbCgpOwotfQotCi12b2lkIF9faW52YWxpZGF0ZV9jYWNoZV9zaWd0cmFtcCh1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JX19pbnZhbGlkYXRlX2ljYWNoZV9yYW5nZShhZGRyLCBhZGRyICsgOCk7Ci19Ci0KLXZvaWQgX19pbnZhbGlkYXRlX2RjYWNoZV9hbGwodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQl1bnNpZ25lZCBmbGFnczsKLQotCWlmIChjcHVpbmZvLnVzZV9kY2FjaGUpIHsKLQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQlfX2Rpc2FibGVfZGNhY2hlKCk7Ci0KLQkJLyoKLQkJICogSnVzdCBsb29wIHRocm91Z2ggY2FjaGUgc2l6ZSBhbmQgaW52YWxpZGF0ZSwKLQkJICogbm8gbmVlZCB0byBhZGQgQ0FDSEVfQkFTRSBhZGRyZXNzCi0JCSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgY3B1aW5mby5kY2FjaGVfc2l6ZTsKLQkJCWkgKz0gY3B1aW5mby5kY2FjaGVfbGluZSkKLQkJCQlfX2ludmFsaWRhdGVfZGNhY2hlKGkpOwotCi0JCV9fZW5hYmxlX2RjYWNoZSgpOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JfQotfQotCi12b2lkIF9faW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0JdW5zaWduZWQgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IGFsaWduOwotCi0JaWYgKGNwdWluZm8udXNlX2RjYWNoZSkgewotCQkvKgotCQkgKiBObyBuZWVkIHRvIGNvdmVyIGVudGlyZSBjYWNoZSByYW5nZSwKLQkJICoganVzdCBjb3ZlciBjYWNoZSBmb290cHJpbnQKLQkJICovCi0JCWVuZCA9IG1pbihzdGFydCArIGNwdWluZm8uZGNhY2hlX3NpemUsIGVuZCk7Ci0JCWFsaWduID0gfihjcHVpbmZvLmRjYWNoZV9saW5lIC0gMSk7Ci0JCXN0YXJ0ICY9IGFsaWduOyAvKiBNYWtlIHN1cmUgd2UgYXJlIGFsaWduZWQgKi8KLQkJLyogUHVzaCBlbmQgdXAgdG8gdGhlIG5leHQgY2FjaGUgbGluZSAqLwotCQllbmQgPSAoKGVuZCAmIGFsaWduKSArIGNwdWluZm8uZGNhY2hlX2xpbmUpOwotCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCV9fZGlzYWJsZV9kY2FjaGUoKTsKLQotCQlmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSBjcHVpbmZvLmRjYWNoZV9saW5lKQotCQkJX19pbnZhbGlkYXRlX2RjYWNoZShpKTsKLQotCQlfX2VuYWJsZV9kY2FjaGUoKTsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCX0KLX0KLQotdm9pZCBfX2ludmFsaWRhdGVfZGNhY2hlX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBwYWdlICpwYWdlKQotewotCV9faW52YWxpZGF0ZV9kY2FjaGVfYWxsKCk7Ci19Ci0KLXZvaWQgX19pbnZhbGlkYXRlX2RjYWNoZV91c2VyX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJCXN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIGFkciwKLQkJCQlpbnQgbGVuKQotewotCV9faW52YWxpZGF0ZV9kY2FjaGVfYWxsKCk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUva2VybmVsL2NwdS9jcHVpbmZvLXB2ci1mdWxsLmMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2NwdS9jcHVpbmZvLXB2ci1mdWxsLmMKaW5kZXggYzI1OTc4Ni4uZjcyZGJkNiAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9jcHUvY3B1aW5mby1wdnItZnVsbC5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvY3B1L2NwdWluZm8tcHZyLWZ1bGwuYwpAQCAtMjEsOCArMjEsMTQgQEAKICAqLwogCiAjZGVmaW5lIENJKGMsIHApIHsgY2ktPmMgPSBQVlJfIyNwKHB2cik7IH0KKworI2lmIGRlZmluZWQoQ09ORklHX0VBUkxZX1BSSU5USykgJiYgZGVmaW5lZChDT05GSUdfU0VSSUFMX1VBUlRMSVRFX0NPTlNPTEUpCiAjZGVmaW5lIGVycl9wcmludGsoeCkgXAogCWVhcmx5X3ByaW50aygiRVJST1I6IE1pY3JvYmxhemUgIiB4ICItZGlmZmVyZW50IGZvciBQVlIgYW5kIERUU1xuIik7CisjZWxzZQorI2RlZmluZSBlcnJfcHJpbnRrKHgpIFwKKwlwcmludGsoS0VSTl9JTkZPICJFUlJPUjogTWljcm9ibGF6ZSAiIHggIi1kaWZmZXJlbnQgZm9yIFBWUiBhbmQgRFRTXG4iKTsKKyNlbmRpZgogCiB2b2lkIHNldF9jcHVpbmZvX3B2cl9mdWxsKHN0cnVjdCBjcHVpbmZvICpjaSwgc3RydWN0IGRldmljZV9ub2RlICpjcHUpCiB7CkBAIC03MCw3ICs3Niw3IEBACiAJQ0kodXNlX2ljYWNoZSwgVVNFX0lDQUNIRSk7CiAJQ0koaWNhY2hlX3RhZ2JpdHMsIElDQUNIRV9BRERSX1RBR19CSVRTKTsKIAlDSShpY2FjaGVfd3JpdGUsIElDQUNIRV9BTExPV19XUik7Ci0JQ0koaWNhY2hlX2xpbmUsIElDQUNIRV9MSU5FX0xFTik7CisJY2ktPmljYWNoZV9saW5lX2xlbmd0aCA9IFBWUl9JQ0FDSEVfTElORV9MRU4ocHZyKSA8PCAyOwogCUNJKGljYWNoZV9zaXplLCBJQ0FDSEVfQllURV9TSVpFKTsKIAlDSShpY2FjaGVfYmFzZSwgSUNBQ0hFX0JBU0VBRERSKTsKIAlDSShpY2FjaGVfaGlnaCwgSUNBQ0hFX0hJR0hBRERSKTsKQEAgLTc4LDExICs4NCwxNiBAQAogCUNJKHVzZV9kY2FjaGUsIFVTRV9EQ0FDSEUpOwogCUNJKGRjYWNoZV90YWdiaXRzLCBEQ0FDSEVfQUREUl9UQUdfQklUUyk7CiAJQ0koZGNhY2hlX3dyaXRlLCBEQ0FDSEVfQUxMT1dfV1IpOwotCUNJKGRjYWNoZV9saW5lLCBEQ0FDSEVfTElORV9MRU4pOworCWNpLT5kY2FjaGVfbGluZV9sZW5ndGggPSBQVlJfRENBQ0hFX0xJTkVfTEVOKHB2cikgPDwgMjsKIAlDSShkY2FjaGVfc2l6ZSwgRENBQ0hFX0JZVEVfU0laRSk7CiAJQ0koZGNhY2hlX2Jhc2UsIERDQUNIRV9CQVNFQUREUik7CiAJQ0koZGNhY2hlX2hpZ2gsIERDQUNIRV9ISUdIQUREUik7CiAKKwl0ZW1wID0gUFZSX0RDQUNIRV9VU0VfV1JJVEVCQUNLKHB2cik7CisJaWYgKGNpLT5kY2FjaGVfd2IgIT0gdGVtcCkKKwkJZXJyX3ByaW50aygiRENBQ0hFIFdCIik7CisJY2ktPmRjYWNoZV93YiA9IHRlbXA7CisKIAlDSSh1c2VfZG9wYiwgRF9PUEIpOwogCUNJKHVzZV9pb3BiLCBJX09QQik7CiAJQ0kodXNlX2RsbWIsIERfTE1CKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvY3B1L2NwdWluZm8tc3RhdGljLmMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2NwdS9jcHVpbmZvLXN0YXRpYy5jCmluZGV4IGFkYjQ0OGYuLjYwOTVhYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvY3B1L2NwdWluZm8tc3RhdGljLmMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9jcHUvY3B1aW5mby1zdGF0aWMuYwpAQCAtNzIsMTIgKzcyLDEyIEBACiAJY2ktPnVzZV9pY2FjaGUgPSBmY3B1KGNwdSwgInhsbngsdXNlLWljYWNoZSIpOwogCWNpLT5pY2FjaGVfdGFnYml0cyA9IGZjcHUoY3B1LCAieGxueCxhZGRyLXRhZy1iaXRzIik7CiAJY2ktPmljYWNoZV93cml0ZSA9IGZjcHUoY3B1LCAieGxueCxhbGxvdy1pY2FjaGUtd3IiKTsKLQljaS0+aWNhY2hlX2xpbmUgPSBmY3B1KGNwdSwgInhsbngsaWNhY2hlLWxpbmUtbGVuIikgPDwgMjsKLQlpZiAoIWNpLT5pY2FjaGVfbGluZSkgeworCWNpLT5pY2FjaGVfbGluZV9sZW5ndGggPSBmY3B1KGNwdSwgInhsbngsaWNhY2hlLWxpbmUtbGVuIikgPDwgMjsKKwlpZiAoIWNpLT5pY2FjaGVfbGluZV9sZW5ndGgpIHsKIAkJaWYgKGZjcHUoY3B1LCAieGxueCxpY2FjaGUtdXNlLWZzbCIpKQotCQkJY2ktPmljYWNoZV9saW5lID0gNCA8PCAyOworCQkJY2ktPmljYWNoZV9saW5lX2xlbmd0aCA9IDQgPDwgMjsKIAkJZWxzZQotCQkJY2ktPmljYWNoZV9saW5lID0gMSA8PCAyOworCQkJY2ktPmljYWNoZV9saW5lX2xlbmd0aCA9IDEgPDwgMjsKIAl9CiAJY2ktPmljYWNoZV9zaXplID0gZmNwdShjcHUsICJpLWNhY2hlLXNpemUiKTsKIAljaS0+aWNhY2hlX2Jhc2UgPSBmY3B1KGNwdSwgImktY2FjaGUtYmFzZWFkZHIiKTsKQEAgLTg2LDE2ICs4NiwxNyBAQAogCWNpLT51c2VfZGNhY2hlID0gZmNwdShjcHUsICJ4bG54LHVzZS1kY2FjaGUiKTsKIAljaS0+ZGNhY2hlX3RhZ2JpdHMgPSBmY3B1KGNwdSwgInhsbngsZGNhY2hlLWFkZHItdGFnIik7CiAJY2ktPmRjYWNoZV93cml0ZSA9IGZjcHUoY3B1LCAieGxueCxhbGxvdy1kY2FjaGUtd3IiKTsKLQljaS0+ZGNhY2hlX2xpbmUgPSBmY3B1KGNwdSwgInhsbngsZGNhY2hlLWxpbmUtbGVuIikgPDwgMjsKLQlpZiAoIWNpLT5kY2FjaGVfbGluZSkgeworCWNpLT5kY2FjaGVfbGluZV9sZW5ndGggPSBmY3B1KGNwdSwgInhsbngsZGNhY2hlLWxpbmUtbGVuIikgPDwgMjsKKwlpZiAoIWNpLT5kY2FjaGVfbGluZV9sZW5ndGgpIHsKIAkJaWYgKGZjcHUoY3B1LCAieGxueCxkY2FjaGUtdXNlLWZzbCIpKQotCQkJY2ktPmRjYWNoZV9saW5lID0gNCA8PCAyOworCQkJY2ktPmRjYWNoZV9saW5lX2xlbmd0aCA9IDQgPDwgMjsKIAkJZWxzZQotCQkJY2ktPmRjYWNoZV9saW5lID0gMSA8PCAyOworCQkJY2ktPmRjYWNoZV9saW5lX2xlbmd0aCA9IDEgPDwgMjsKIAl9CiAJY2ktPmRjYWNoZV9zaXplID0gZmNwdShjcHUsICJkLWNhY2hlLXNpemUiKTsKIAljaS0+ZGNhY2hlX2Jhc2UgPSBmY3B1KGNwdSwgImQtY2FjaGUtYmFzZWFkZHIiKTsKIAljaS0+ZGNhY2hlX2hpZ2ggPSBmY3B1KGNwdSwgImQtY2FjaGUtaGlnaGFkZHIiKTsKKwljaS0+ZGNhY2hlX3diID0gZmNwdShjcHUsICJ4bG54LGRjYWNoZS11c2Utd3JpdGViYWNrIik7CiAKIAljaS0+dXNlX2RvcGIgPSBmY3B1KGNwdSwgInhsbngsZC1vcGIiKTsKIAljaS0+dXNlX2lvcGIgPSBmY3B1KGNwdSwgInhsbngsaS1vcGIiKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvY3B1L2NwdWluZm8uYyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvY3B1L2NwdWluZm8uYwppbmRleCAzNTM5YmFiLi45OTFkNzEzIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL2NwdS9jcHVpbmZvLmMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9jcHUvY3B1aW5mby5jCkBAIC0yOSwxMSArMjksOCBAQAogCXsiNy4yMC5hIiwgMHgwY30sCiAJeyI3LjIwLmIiLCAweDBkfSwKIAl7IjcuMjAuYyIsIDB4MGV9LAotCS8qIEZJWE1FIFRoZXJlIGlzIG5vIGtleWNvZGUgZGVmaW5lZCBpbiBNQlYgZm9yIHRoZXNlIHZlcnNpb25zICovCi0JeyIyLjEwLmEiLCAweDEwfSwKLQl7IjMuMDAuYSIsIDB4MjB9LAotCXsiNC4wMC5hIiwgMHgzMH0sCi0JeyI0LjAwLmIiLCAweDQwfSwKKwl7IjcuMjAuZCIsIDB4MGZ9LAorCXsiNy4zMC5hIiwgMHgxMH0sCiAJe05VTEwsIDB9LAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9jcHUvbWIuYyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvY3B1L21iLmMKaW5kZXggNGRjZmNjZC4uMGM5MTJiMiAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9jcHUvbWIuYworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2NwdS9tYi5jCkBAIC0xMDMsMTEgKzEwMywxNSBAQAogCWVsc2UKIAkJY291bnQgKz0gc2VxX3ByaW50ZihtLCAiSWNhY2hlOlx0XHRub1xuIik7CiAKLQlpZiAoY3B1aW5mby51c2VfZGNhY2hlKQorCWlmIChjcHVpbmZvLnVzZV9kY2FjaGUpIHsKIAkJY291bnQgKz0gc2VxX3ByaW50ZihtLAogCQkJCSJEY2FjaGU6XHRcdCV1a0JcbiIsCiAJCQkJY3B1aW5mby5kY2FjaGVfc2l6ZSA+PiAxMCk7Ci0JZWxzZQorCQlpZiAoY3B1aW5mby5kY2FjaGVfd2IpCisJCQljb3VudCArPSBzZXFfcHJpbnRmKG0sICJcdFx0d3JpdGUtYmFja1xuIik7CisJCWVsc2UKKwkJCWNvdW50ICs9IHNlcV9wcmludGYobSwgIlx0XHR3cml0ZS10aHJvdWdoXG4iKTsKKwl9IGVsc2UKIAkJY291bnQgKz0gc2VxX3ByaW50ZihtLCAiRGNhY2hlOlx0XHRub1xuIik7CiAKIAljb3VudCArPSBzZXFfcHJpbnRmKG0sCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUva2VybmVsL2NwdS9wdnIuYyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvY3B1L3B2ci5jCmluZGV4IGM5YTQzNDAuLjliZWU5MzggMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvY3B1L3B2ci5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvY3B1L3B2ci5jCkBAIC00NSw3ICs0NSw3IEBACiAKIGludCBjcHVfaGFzX3B2cih2b2lkKQogewotCXVuc2lnbmVkIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgcHZyMDsKIAogCWxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9lbnRyeS1ub21tdS5TIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9lbnRyeS1ub21tdS5TCmluZGV4IDkwODNkODUuLjk1YjA4NTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZW50cnktbm9tbXUuUworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2VudHJ5LW5vbW11LlMKQEAgLTIwOCw4ICsyMDgsNiBAQAogCWx3aQlyMSwgcjEsIFRTX1RIUkVBRF9JTkZPCQkvKiBnZXQgdGhlIHRocmVhZCBpbmZvICovCiAJLyogY2FsY3VsYXRlIGtlcm5lbCBzdGFjayBwb2ludGVyICovCiAJYWRkaWsJcjEsIHIxLCBUSFJFQURfU0laRSAtIFBUX1NJWkUKLQlzd2kJcjExLCByMCwgUEVSX0NQVShSMTFfU0FWRSkJLyogdGVtcG9yYXJpbHkgc2F2ZSByMTEgKi8KLQlsd2kJcjExLCByMCwgUEVSX0NQVShLTSkJCS8qIGxvYWQgbW9kZSBpbmRpY2F0b3IgKi8KIDI6CiAJc3dpCXIxMSwgcjEsIFBUX01PREUJCS8qIHN0b3JlIHRoZSBtb2RlICovCiAJbHdpCXIxMSwgcjAsIFBFUl9DUFUoUjExX1NBVkUpCS8qIHJlbG9hZCByMTEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZW50cnkuUyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZW50cnkuUwppbmRleCBlM2VjYjM2Li4zYmFkNGZmIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9lbnRyeS5TCkBAIC0zMSw2ICszMSw4IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CiAKKyN1bmRlZiBERUJVRworCiAvKiBUaGUgc2l6ZSBvZiBhIHN0YXRlIHNhdmUgZnJhbWUuICovCiAjZGVmaW5lIFNUQVRFX1NBVkVfU0laRQkJKFBUX1NJWkUgKyBTVEFURV9TQVZFX0FSR19TUEFDRSkKIApAQCAtMzUyLDEwICszNTQsMTIgQEAKIAlhZGQJcjEyLCByMTIsIHIxMjsJCQkvKiBjb252ZXJ0IG51bSAtPiBwdHIgKi8KIAlhZGQJcjEyLCByMTIsIHIxMjsKIAorI2lmZGVmIERFQlVHCiAJLyogVHJhYyBzeXNjYWxscyBhbmQgc3RvcmVkIHRoZW0gdG8gcjBfcmFtICovCiAJbHdpCXIzLCByMTIsIDB4NDAwICsgcjBfcmFtCiAJYWRkaQlyMywgcjMsIDEKIAlzd2kJcjMsIHIxMiwgMHg0MDAgKyByMF9yYW0KKyNlbmRpZgogCiAJIyBGaW5kIGFuZCBqdW1wIGludG8gdGhlIHN5c2NhbGwgaGFuZGxlci4KIAlsd2kJcjEyLCByMTIsIHN5c19jYWxsX3RhYmxlCkBAIC00OTYsMTcgKzUwMCw2IEBACiAJYnJpZAltaWNyb2JsYXplX2V4ZWN2ZTsJLyogRG8gcmVhbCB3b3JrICh0YWlsLWNhbGwpLiovCiAJbm9wOwogCi1DX0VOVFJZKHN5c19ydF9zaWdzdXNwZW5kX3dyYXBwZXIpOgotCXN3aQlyMywgcjEsIFBUTytQVF9SMzsgLyogcmVzdG9yZSBzYXZlZCByMywgcjQgcmVnaXN0ZXJzICovCi0Jc3dpCXI0LCByMSwgUFRPK1BUX1I0OwotCWxhCXI3LCByMSwgUFRPOwkJLyogYWRkIHVzZXIgY29udGV4dCBhcyAzcmQgYXJnICovCi0JYnJsaWQJcjE1LCBzeXNfcnRfc2lnc3VzcGVuZDsJLyogRG8gcmVhbCB3b3JrLiovCi0Jbm9wOwotCWx3aQlyMywgcjEsIFBUTytQVF9SMzsgLyogcmVzdG9yZSBzYXZlZCByMywgcjQgcmVnaXN0ZXJzICovCi0JbHdpCXI0LCByMSwgUFRPK1BUX1I0OwotCWJyaSByZXRfZnJvbV90cmFwIC8qIGZhbGwgdGhyb3VnaCB3aWxsIG5vdCB3b3JrIGhlcmUgZHVlIHRvIGFsaWduICovCi0Jbm9wOwotCiBDX0VOVFJZKHN5c19ydF9zaWdyZXR1cm5fd3JhcHBlcik6CiAJc3dpCXIzLCByMSwgUFRPK1BUX1IzOyAvKiByZXN0b3JlIHNhdmVkIHIzLCByNCByZWdpc3RlcnMgKi8KIAlzd2kJcjQsIHIxLCBQVE8rUFRfUjQ7CkBAIC03MTEsMTUgKzcwNCwxMSBAQAogCSAqIChpbiBhIHBvc3NpYmx5IG1vZGlmaWVkIGZvcm0pIGFmdGVyIGRvX3NpZ25hbCByZXR1cm5zLgogCSAqIHN0b3JlIHJldHVybiByZWdpc3RlcnMgc2VwYXJhdGVseSBiZWNhdXNlIHRoaXMgbWFjcm9zIGlzIHVzZQogCSAqIGZvciBvdGhlcnMgZXhjZXB0aW9ucyAqLwotCXN3aQlyMywgcjEsIFBUTyArIFBUX1IzOwotCXN3aQlyNCwgcjEsIFBUTyArIFBUX1I0OwogCWxhCXI1LCByMSwgUFRPOwkJLyogQXJnIDE6IHN0cnVjdCBwdF9yZWdzICpyZWdzICovCiAJYWRkCXI2LCByMCwgcjA7CQkvKiBBcmcgMjogc2lnc2V0X3QgKm9sZHNldCAqLwogCWFkZGkJcjcsIHIwLCAwOwkJLyogQXJnIDM6IGludCBpbl9zeXNjYWxsICovCiAJYnJhbGlkCXIxNSwgZG9fc2lnbmFsOwkvKiBIYW5kbGUgYW55IHNpZ25hbHMgKi8KIAlub3A7Ci0JbHdpCXIzLCByMSwgUFRPK1BUX1IzOyAvKiByZXN0b3JlIHNhdmVkIHIzLCByNCByZWdpc3RlcnMgKi8KLQlsd2kJcjQsIHIxLCBQVE8rUFRfUjQ7CiAKIC8qIEZpbmFsbHksIHJldHVybiB0byB1c2VyIHN0YXRlLiAgKi8KIDE6CXN3aQlyMCwgcjAsIFBFUl9DUFUoS00pOwkvKiBOb3cgb2ZmaWNpYWxseSBpbiB1c2VyIHN0YXRlLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9mdHJhY2UuYyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZnRyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg4YjMxYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZnRyYWNlLmMKQEAgLTAsMCArMSwyMzcgQEAKKy8qCisgKiBGdHJhY2Ugc3VwcG9ydCBmb3IgTWljcm9ibGF6ZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTWljaGFsIFNpbWVrIDxtb25zdHJAbW9uc3RyLmV1PgorICogQ29weXJpZ2h0IChDKSAyMDA5IFBldGFMb2dpeAorICoKKyAqIEJhc2VkIG9uIE1JUFMgYW5kIFBvd2VyUEMgZnRyYWNlIGNvZGUKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgorCisjaWZkZWYgQ09ORklHX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUgorLyoKKyAqIEhvb2sgdGhlIHJldHVybiBhZGRyZXNzIGFuZCBwdXNoIGl0IGluIHRoZSBzdGFjayBvZiByZXR1cm4gYWRkcnMKKyAqIGluIGN1cnJlbnQgdGhyZWFkIGluZm8uCisgKi8KK3ZvaWQgcHJlcGFyZV9mdHJhY2VfcmV0dXJuKHVuc2lnbmVkIGxvbmcgKnBhcmVudCwgdW5zaWduZWQgbG9uZyBzZWxmX2FkZHIpCit7CisJdW5zaWduZWQgbG9uZyBvbGQ7CisJaW50IGZhdWx0ZWQsIGVycjsKKwlzdHJ1Y3QgZnRyYWNlX2dyYXBoX2VudCB0cmFjZTsKKwl1bnNpZ25lZCBsb25nIHJldHVybl9ob29rZXIgPSAodW5zaWduZWQgbG9uZykKKwkJCQkmcmV0dXJuX3RvX2hhbmRsZXI7CisKKwlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJmN1cnJlbnQtPnRyYWNpbmdfZ3JhcGhfcGF1c2UpKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBQcm90ZWN0IGFnYWluc3QgZmF1bHQsIGV2ZW4gaWYgaXQgc2hvdWxkbid0CisJICogaGFwcGVuLiBUaGlzIHRvb2wgaXMgdG9vIG11Y2ggaW50cnVzaXZlIHRvCisJICogaWdub3JlIHN1Y2ggYSBwcm90ZWN0aW9uLgorCSAqLworCWFzbSB2b2xhdGlsZSgiCTE6CWx3aQklMCwgJTIsIDA7CQlcCisJCQkyOglzd2kJJTMsICUyLCAwOwkJXAorCQkJCWFkZGlrCSUxLCByMCwgMDsJCVwKKwkJCTM6CQkJCQlcCisJCQkJLnNlY3Rpb24gLmZpeHVwLCBcImF4XCI7CVwKKwkJCTQ6CWJyaWQJM2I7CQkJXAorCQkJCWFkZGlrCSUxLCByMCwgMTsJCVwKKwkJCQkucHJldmlvdXM7CQkJXAorCQkJCS5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCI7CVwKKwkJCQkud29yZAkxYiw0YjsJCQlcCisJCQkJLndvcmQJMmIsNGI7CQkJXAorCQkJCS5wcmV2aW91czsiCQkJXAorCQkJOiAiPSZyIiAob2xkKSwgIj1yIiAoZmF1bHRlZCkKKwkJCTogInIiIChwYXJlbnQpLCAiciIgKHJldHVybl9ob29rZXIpCisJKTsKKworCWlmICh1bmxpa2VseShmYXVsdGVkKSkgeworCQlmdHJhY2VfZ3JhcGhfc3RvcCgpOworCQlXQVJOX09OKDEpOworCQlyZXR1cm47CisJfQorCisJZXJyID0gZnRyYWNlX3B1c2hfcmV0dXJuX3RyYWNlKG9sZCwgc2VsZl9hZGRyLCAmdHJhY2UuZGVwdGgsIDApOworCWlmIChlcnIgPT0gLUVCVVNZKSB7CisJCSpwYXJlbnQgPSBvbGQ7CisJCXJldHVybjsKKwl9CisKKwl0cmFjZS5mdW5jID0gc2VsZl9hZGRyOworCS8qIE9ubHkgdHJhY2UgaWYgdGhlIGNhbGxpbmcgZnVuY3Rpb24gZXhwZWN0cyB0byAqLworCWlmICghZnRyYWNlX2dyYXBoX2VudHJ5KCZ0cmFjZSkpIHsKKwkJY3VycmVudC0+Y3Vycl9yZXRfc3RhY2stLTsKKwkJKnBhcmVudCA9IG9sZDsKKwl9Cit9CisjZW5kaWYgLyogQ09ORklHX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUiAqLworCisjaWZkZWYgQ09ORklHX0RZTkFNSUNfRlRSQUNFCisvKiBzYXZlIHZhbHVlIHRvIGFkZHIgLSBpdCBpcyBzYXZlIHRvIGRvIGl0IGluIGFzbSAqLworc3RhdGljIGludCBmdHJhY2VfbW9kaWZ5X2NvZGUodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJaW50IGZhdWx0ZWQgPSAwOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIgkxOglzd2kJJTIsICUxLCAwOwkJXAorCQkJCQlhZGRpawklMCwgcjAsIDA7CQlcCisJCQkJMjoJCQkJCVwKKwkJCQkJLnNlY3Rpb24gLmZpeHVwLCBcImF4XCI7CVwKKwkJCQkzOglicmlkCTJiOwkJCVwKKwkJCQkJYWRkaWsJJTAsIHIwLCAxOwkJXAorCQkJCQkucHJldmlvdXM7CQkJXAorCQkJCQkuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiOwlcCisJCQkJCS53b3JkCTFiLDNiOwkJCVwKKwkJCQkJLnByZXZpb3VzOyIJCQlcCisJCQkJOiAiPXIiIChmYXVsdGVkKQorCQkJCTogInIiIChhZGRyKSwgInIiICh2YWx1ZSkKKwkpOworCisJaWYgKHVubGlrZWx5KGZhdWx0ZWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIE1JQ1JPQkxBWkVfTk9QIDB4ODAwMDAwMDAKKyNkZWZpbmUgTUlDUk9CTEFaRV9CUkkgMHhiODAwMDAwQworCitzdGF0aWMgdW5zaWduZWQgaW50IHJlY29yZGVkOyAvKiBpZiBzYXZlIHdhcyBvciBub3QgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW1tOyAvKiBzYXZpbmcgd2hvbGUgaW1tIGluc3RydWN0aW9uICovCisKKy8qIFRoZXJlIGFyZSB0d28gYXBwcm9hY2hlcyBob3d0byBzb2x2ZSBmdHJhY2VfbWFrZSBub3AgZnVuY3Rpb24gLSBsb29rIGJlbG93ICovCisjdW5kZWYgVVNFX0ZUUkFDRV9OT1AKKworI2lmZGVmIFVTRV9GVFJBQ0VfTk9QCitzdGF0aWMgdW5zaWduZWQgaW50IGJyYWxpZDsgLyogc2F2aW5nIHdob2xlIGJyYWxpZCBpbnN0cnVjdGlvbiAqLworI2VuZGlmCisKK2ludCBmdHJhY2VfbWFrZV9ub3Aoc3RydWN0IG1vZHVsZSAqbW9kLAorCQkJc3RydWN0IGR5bl9mdHJhY2UgKnJlYywgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCS8qIHdlIGhhdmUgdGhpcyBwYXJ0IG9mIGNvZGUgd2hpY2ggd2UgYXJlIHdvcmtpbmcgd2l0aAorCSAqIGIwMDBjMDAwICAgICAgICBpbW0gICAgIC0xNjM4NAorCSAqIGI5ZmM4ZTMwICAgICAgICBicmFsaWQgIHIxNSwgLTI5MTM2ICAgICAvLyBjMDAwOGUzMCA8X21jb3VudD4KKwkgKiA4MDAwMDAwMCAgICAgICAgb3IgICAgICByMCwgcjAsIHIwCisJICoKKwkgKiBUaGUgZmlyc3Qgc29sdXRpb24gKCFVU0VfRlRSQUNFX05PUC1jb3VsZCBiZSBjYWxsZWQgYnJhbmNoIHNvbHV0aW9uKQorCSAqIGIwMDBjMDAwICAgICAgICBicmkJMTIgKDB4QyAtIGp1bXAgdG8gYW55IG90aGVyIGluc3RydWN0aW9uKQorCSAqIGI5ZmM4ZTMwICAgICAgICBicmFsaWQgIHIxNSwgLTI5MTM2ICAgICAvLyBjMDAwOGUzMCA8X21jb3VudD4KKwkgKiA4MDAwMDAwMCAgICAgICAgb3IgICAgICByMCwgcjAsIHIwCisJICogYW55IG90aGVyIGluc3RydWN0aW9uCisJICoKKwkgKiBUaGUgc2Vjb25kIHNvbHV0aW9uIChVU0VfRlRSQUNFX05PUCkgLSBubyBqdW1wIGp1c3Qgbm9wcworCSAqIDgwMDAwMDAwICAgICAgICBvciAgICAgIHIwLCByMCwgcjAKKwkgKiA4MDAwMDAwMCAgICAgICAgb3IgICAgICByMCwgcjAsIHIwCisJICogODAwMDAwMDAgICAgICAgIG9yICAgICAgcjAsIHIwLCByMAorCSAqLworCWludCByZXQgPSAwOworCisJaWYgKHJlY29yZGVkID09IDApIHsKKwkJcmVjb3JkZWQgPSAxOworCQlpbW0gPSAqKHVuc2lnbmVkIGludCAqKXJlYy0+aXA7CisJCXByX2RlYnVnKCIlczogaW1tOjB4JXhcbiIsIF9fZnVuY19fLCBpbW0pOworI2lmZGVmIFVTRV9GVFJBQ0VfTk9QCisJCWJyYWxpZCA9ICoodW5zaWduZWQgaW50ICopKHJlYy0+aXAgKyA0KTsKKwkJcHJfZGVidWcoIiVzOiBicmFsaWQgMHgleFxuIiwgX19mdW5jX18sIGJyYWxpZCk7CisjZW5kaWYgLyogVVNFX0ZUUkFDRV9OT1AgKi8KKwl9CisKKyNpZmRlZiBVU0VfRlRSQUNFX05PUAorCXJldCA9IGZ0cmFjZV9tb2RpZnlfY29kZShyZWMtPmlwLCBNSUNST0JMQVpFX05PUCk7CisJcmV0ICs9IGZ0cmFjZV9tb2RpZnlfY29kZShyZWMtPmlwICsgNCwgTUlDUk9CTEFaRV9OT1ApOworI2Vsc2UgLyogVVNFX0ZUUkFDRV9OT1AgKi8KKwlyZXQgPSBmdHJhY2VfbW9kaWZ5X2NvZGUocmVjLT5pcCwgTUlDUk9CTEFaRV9CUkkpOworI2VuZGlmIC8qIFVTRV9GVFJBQ0VfTk9QICovCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByZXRfYWRkcjsgLyogaW5pdGlhbGl6ZWQgYXMgMCBieSBkZWZhdWx0ICovCisKKy8qIEkgYmVsaWV2ZSB0aGF0IGZpcnN0IGlzIGNhbGxlZCBmdHJhY2VfbWFrZV9ub3AgYmVmb3JlIHRoaXMgZnVuY3Rpb24gKi8KK2ludCBmdHJhY2VfbWFrZV9jYWxsKHN0cnVjdCBkeW5fZnRyYWNlICpyZWMsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlpbnQgcmV0OworCXJldF9hZGRyID0gYWRkcjsgLyogc2F2aW5nIHdoZXJlIHRoZSBiYXJyaWVyIGp1bXAgaXMgKi8KKwlwcl9kZWJ1ZygiJXM6IGFkZHI6MHgleCwgcmVjLT5pcDogMHgleCwgaW1tOjB4JXhcbiIsCisJCV9fZnVuY19fLCAodW5zaWduZWQgaW50KWFkZHIsICh1bnNpZ25lZCBpbnQpcmVjLT5pcCwgaW1tKTsKKwlyZXQgPSBmdHJhY2VfbW9kaWZ5X2NvZGUocmVjLT5pcCwgaW1tKTsKKyNpZmRlZiBVU0VfRlRSQUNFX05PUAorCXByX2RlYnVnKCIlczogYnJhbGlkOjB4JXhcbiIsIF9fZnVuY19fLCBicmFsaWQpOworCXJldCArPSBmdHJhY2VfbW9kaWZ5X2NvZGUocmVjLT5pcCArIDQsIGJyYWxpZCk7CisjZW5kaWYgLyogVVNFX0ZUUkFDRV9OT1AgKi8KKwlyZXR1cm4gcmV0OworfQorCitpbnQgX19pbml0IGZ0cmFjZV9keW5fYXJjaF9pbml0KHZvaWQgKmRhdGEpCit7CisJLyogVGhlIHJldHVybiBjb2RlIGlzIHJldHVyZWQgdmlhIGRhdGEgKi8KKwkqKHVuc2lnbmVkIGxvbmcgKilkYXRhID0gMDsKKworCXJldHVybiAwOworfQorCitpbnQgZnRyYWNlX3VwZGF0ZV9mdHJhY2VfZnVuYyhmdHJhY2VfZnVuY190IGZ1bmMpCit7CisJdW5zaWduZWQgbG9uZyBpcCA9ICh1bnNpZ25lZCBsb25nKSgmZnRyYWNlX2NhbGwpOworCXVuc2lnbmVkIGludCB1cHBlciA9ICh1bnNpZ25lZCBpbnQpZnVuYzsKKwl1bnNpZ25lZCBpbnQgbG93ZXIgPSAodW5zaWduZWQgaW50KWZ1bmM7CisJaW50IHJldCA9IDA7CisKKwkvKiBjcmVhdGUgcHJvcGVyIHNhdmluZyB0byBmdHJhY2VfY2FsbCBwb2xsICovCisJdXBwZXIgPSAweGIwMDAwMDAwICsgKHVwcGVyID4+IDE2KTsgLyogaW1tIGZ1bmNfdXBwZXIgKi8KKwlsb3dlciA9IDB4MzI4MDAwMDAgKyAobG93ZXIgJiAweEZGRkYpOyAvKiBhZGRpayByMjAsIHIwLCBmdW5jX2xvd2VyICovCisKKwlwcl9kZWJ1ZygiJXM6IGZ1bmM9MHgleCwgaXA9MHgleCwgdXBwZXI9MHgleCwgbG93ZXI9MHgleFxuIiwKKwkJX19mdW5jX18sICh1bnNpZ25lZCBpbnQpZnVuYywgKHVuc2lnbmVkIGludClpcCwgdXBwZXIsIGxvd2VyKTsKKworCS8qIHNhdmUgdXBwZXIgYW5kIGxvd2VyIGNvZGUgKi8KKwlyZXQgPSBmdHJhY2VfbW9kaWZ5X2NvZGUoaXAsIHVwcGVyKTsKKwlyZXQgKz0gZnRyYWNlX21vZGlmeV9jb2RlKGlwICsgNCwgbG93ZXIpOworCisJLyogV2UganVzdCBuZWVkIHRvIHJlbW92ZSB0aGUgcnRzZCByMTUsIDggYnkgTk9QICovCisJQlVHX09OKCFyZXRfYWRkcik7CisJaWYgKHJldF9hZGRyKQorCQlyZXQgKz0gZnRyYWNlX21vZGlmeV9jb2RlKHJldF9hZGRyLCBNSUNST0JMQVpFX05PUCk7CisJZWxzZQorCQlyZXQgPSAxOyAvKiBmYXVsdCAqLworCisJLyogQWxsIGNoYW5nZXMgYXJlIGRvbmUgLSBsZXRzIGRvIGNhY2hlcyBjb25zaXN0ZW50ICovCisJZmx1c2hfaWNhY2hlKCk7CisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIKK3Vuc2lnbmVkIGludCBvbGRfanVtcDsgLyogc2F2aW5nIHBsYWNlIGZvciBqdW1wIGluc3RydWN0aW9uICovCisKK2ludCBmdHJhY2VfZW5hYmxlX2Z0cmFjZV9ncmFwaF9jYWxsZXIodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgaXAgPSAodW5zaWduZWQgbG9uZykoJmZ0cmFjZV9jYWxsX2dyYXBoKTsKKworCW9sZF9qdW1wID0gKih1bnNpZ25lZCBpbnQgKilpcDsgLyogc2F2ZSBqdW1wIG92ZXIgaW5zdHJ1Y3Rpb24gKi8KKwlyZXQgPSBmdHJhY2VfbW9kaWZ5X2NvZGUoaXAsIE1JQ1JPQkxBWkVfTk9QKTsKKwlmbHVzaF9pY2FjaGUoKTsKKworCXByX2RlYnVnKCIlczogUmVwbGFjZSBpbnN0cnVjdGlvbjogMHgleFxuIiwgX19mdW5jX18sIG9sZF9qdW1wKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZnRyYWNlX2Rpc2FibGVfZnRyYWNlX2dyYXBoX2NhbGxlcih2b2lkKQoreworCXVuc2lnbmVkIGludCByZXQ7CisJdW5zaWduZWQgbG9uZyBpcCA9ICh1bnNpZ25lZCBsb25nKSgmZnRyYWNlX2NhbGxfZ3JhcGgpOworCisJcmV0ID0gZnRyYWNlX21vZGlmeV9jb2RlKGlwLCBvbGRfanVtcCk7CisJZmx1c2hfaWNhY2hlKCk7CisKKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmIC8qIENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIgKi8KKyNlbmRpZiAvKiBDT05GSUdfRFlOQU1JQ19GVFJBQ0UgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvaGVhcnRiZWF0LmMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2hlYXJ0YmVhdC5jCmluZGV4IDFiZGYyMDIuLjUyMjc1MTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvaGVhcnRiZWF0LmMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9oZWFydGJlYXQuYwpAQCAtNDUsNiArNDUsNyBAQAogdm9pZCBzZXR1cF9oZWFydGJlYXQodm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmdwaW8gPSBOVUxMOworCWludCAqcHJvcDsKIAlpbnQgajsKIAljaGFyICpncGlvX2xpc3RbXSA9IHsKIAkJCQkieGxueCx4cHMtZ3Bpby0xLjAwLmEiLApAQCAtNTgsMTAgKzU5LDE0IEBACiAJCQlicmVhazsKIAl9CiAKLQliYXNlX2FkZHIgPSAqKGludCAqKSBvZl9nZXRfcHJvcGVydHkoZ3BpbywgInJlZyIsIE5VTEwpOwotCWJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKSBpb3JlbWFwKGJhc2VfYWRkciwgUEFHRV9TSVpFKTsKLQlwcmludGsoS0VSTl9OT1RJQ0UgIkhlYXJ0YmVhdCBHUElPIGF0IDB4JXhcbiIsIGJhc2VfYWRkcik7CisJaWYgKGdwaW8pIHsKKwkJYmFzZV9hZGRyID0gKihpbnQgKikgb2ZfZ2V0X3Byb3BlcnR5KGdwaW8sICJyZWciLCBOVUxMKTsKKwkJYmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpIGlvcmVtYXAoYmFzZV9hZGRyLCBQQUdFX1NJWkUpOworCQlwcmludGsoS0VSTl9OT1RJQ0UgIkhlYXJ0YmVhdCBHUElPIGF0IDB4JXhcbiIsIGJhc2VfYWRkcik7CiAKLQlpZiAoKihpbnQgKikgb2ZfZ2V0X3Byb3BlcnR5KGdwaW8sICJ4bG54LGlzLWJpZGlyIiwgTlVMTCkpCi0JCW91dF9iZTMyKGJhc2VfYWRkciArIDQsIDApOyAvKiBHUElPIGlzIGNvbmZpZ3VyZWQgYXMgb3V0cHV0ICovCisJCS8qIEdQSU8gaXMgY29uZmlndXJlZCBhcyBvdXRwdXQgKi8KKwkJcHJvcCA9IChpbnQgKikgb2ZfZ2V0X3Byb3BlcnR5KGdwaW8sICJ4bG54LGlzLWJpZGlyIiwgTlVMTCk7CisJCWlmIChwcm9wKQorCQkJb3V0X2JlMzIoYmFzZV9hZGRyICsgNCwgMCk7CisJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9pbnRjLmMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2ludGMuYwppbmRleCA2ZWVhNmY5Li4wMzE3MmMxIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL2ludGMuYworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2ludGMuYwpAQCAtNDIsOCArNDIsMTYgQEAKIAogc3RhdGljIHZvaWQgaW50Y19lbmFibGVfb3JfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCiB7CisJdW5zaWduZWQgbG9uZyBtYXNrID0gMSA8PCBpcnE7CiAJcHJfZGVidWcoImVuYWJsZV9vcl91bm1hc2s6ICVkXG4iLCBpcnEpOwotCW91dF9iZTMyKElOVENfQkFTRSArIFNJRSwgMSA8PCBpcnEpOworCW91dF9iZTMyKElOVENfQkFTRSArIFNJRSwgbWFzayk7CisKKwkvKiBhY2sgbGV2ZWwgaXJxcyBiZWNhdXNlIHRoZXkgY2FuJ3QgYmUgYWNrZWQgZHVyaW5nCisJICogYWNrIGZ1bmN0aW9uIHNpbmNlIHRoZSBoYW5kbGVfbGV2ZWxfaXJxIGZ1bmN0aW9uCisJICogYWNrcyB0aGUgaXJxIGJlZm9yZSBjYWxsaW5nIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcgorCSAqLworCWlmIChpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIElSUV9MRVZFTCkKKwkJb3V0X2JlMzIoSU5UQ19CQVNFICsgSUFSLCBtYXNrKTsKIH0KIAogc3RhdGljIHZvaWQgaW50Y19kaXNhYmxlX29yX21hc2sodW5zaWduZWQgaW50IGlycSkKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvbWNvdW50LlMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL21jb3VudC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZWFhN2EKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL21jb3VudC5TCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogTG93LWxldmVsIGZ0cmFjZSBoYW5kbGluZworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBNaWNoYWwgU2ltZWsgPG1vbnN0ckBtb25zdHIuZXU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgUGV0YUxvZ2l4CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzCisgKiBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKworI2RlZmluZSBOT0FMSUdOX0VOVFJZKG5hbWUpCS5nbG9ibCBuYW1lOyBuYW1lOgorCisvKiBGSVhNRSBNUzogSSB0aGluayB0aGF0IEkgZG9uJ3QgbmVlZCB0byBzYXZlIGFsbCByZWdzICovCisjZGVmaW5lIFNBVkVfUkVHUwkJXAorCWFkZGlrCXIxLCByMSwgLTEyMDsJXAorCXN3aQlyMiwgcjEsIDQ7CVwKKwlzd2kJcjMsIHIxLCA4OwlcCisJc3dpCXI0LCByMSwgMTI7CVwKKwlzd2kJcjUsIHIxLCAxMTY7CVwKKwlzd2kJcjYsIHIxLCAxNjsJXAorCXN3aQlyNywgcjEsIDIwOwlcCisJc3dpCXI4LCByMSwgMjQ7CVwKKwlzd2kJcjksIHIxLCAyODsJXAorCXN3aQlyMTAsIHIxLCAzMjsJXAorCXN3aQlyMTEsIHIxLCAzNjsJXAorCXN3aQlyMTIsIHIxLCA0MDsJXAorCXN3aQlyMTMsIHIxLCA0NDsJXAorCXN3aQlyMTQsIHIxLCA0ODsJXAorCXN3aQlyMTYsIHIxLCA1MjsJXAorCXN3aQlyMTcsIHIxLCA1NjsJXAorCXN3aQlyMTgsIHIxLCA2MDsJXAorCXN3aQlyMTksIHIxLCA2NDsJXAorCXN3aQlyMjAsIHIxLCA2ODsJXAorCXN3aQlyMjEsIHIxLCA3MjsJXAorCXN3aQlyMjIsIHIxLCA3NjsJXAorCXN3aQlyMjMsIHIxLCA4MDsJXAorCXN3aQlyMjQsIHIxLCA4NDsJXAorCXN3aQlyMjUsIHIxLCA4ODsJXAorCXN3aQlyMjYsIHIxLCA5MjsJXAorCXN3aQlyMjcsIHIxLCA5NjsJXAorCXN3aQlyMjgsIHIxLCAxMDA7CVwKKwlzd2kJcjI5LCByMSwgMTA0OwlcCisJc3dpCXIzMCwgcjEsIDEwODsJXAorCXN3aQlyMzEsIHIxLCAxMTI7CisKKyNkZWZpbmUgUkVTVE9SRV9SRUdTCQlcCisJbHdpCXIyLCByMSwgNDsJXAorCWx3aQlyMywgcjEsIDg7CVwKKwlsd2kJcjQsIHIxLCAxMjsJXAorCWx3aQlyNSwgcjEsIDExNjsJXAorCWx3aQlyNiwgcjEsIDE2OwlcCisJbHdpCXI3LCByMSwgMjA7CVwKKwlsd2kJcjgsIHIxLCAyNDsJXAorCWx3aQlyOSwgcjEsIDI4OwlcCisJbHdpCXIxMCwgcjEsIDMyOwlcCisJbHdpCXIxMSwgcjEsIDM2OwlcCisJbHdpCXIxMiwgcjEsIDQwOwlcCisJbHdpCXIxMywgcjEsIDQ0OwlcCisJbHdpCXIxNCwgcjEsIDQ4OwlcCisJbHdpCXIxNiwgcjEsIDUyOwlcCisJbHdpCXIxNywgcjEsIDU2OwlcCisJbHdpCXIxOCwgcjEsIDYwOwlcCisJbHdpCXIxOSwgcjEsIDY0OwlcCisJbHdpCXIyMCwgcjEsIDY4OwlcCisJbHdpCXIyMSwgcjEsIDcyOwlcCisJbHdpCXIyMiwgcjEsIDc2OwlcCisJbHdpCXIyMywgcjEsIDgwOwlcCisJbHdpCXIyNCwgcjEsIDg0OwlcCisJbHdpCXIyNSwgcjEsIDg4OwlcCisJbHdpCXIyNiwgcjEsIDkyOwlcCisJbHdpCXIyNywgcjEsIDk2OwlcCisJbHdpCXIyOCwgcjEsIDEwMDsJXAorCWx3aQlyMjksIHIxLCAxMDQ7CVwKKwlsd2kJcjMwLCByMSwgMTA4OwlcCisJbHdpCXIzMSwgcjEsIDExMjsJXAorCWFkZGlrCXIxLCByMSwgMTIwOworCitFTlRSWShmdHJhY2Vfc3R1YikKKwlydHNkCXIxNSwgODsKKwlub3A7CisKK0VOVFJZKF9tY291bnQpCisjaWZkZWYgQ09ORklHX0RZTkFNSUNfRlRSQUNFCitFTlRSWShmdHJhY2VfY2FsbGVyKQorCS8qIE1TOiBJdCBpcyBqdXN0IGJhcnJpZXIgd2hpY2ggaXMgcmVtb3ZlZCBmcm9tIEMgY29kZSAqLworCXJ0c2QJcjE1LCA4CisJbm9wCisjZW5kaWYgLyogQ09ORklHX0RZTkFNSUNfRlRSQUNFICovCisJU0FWRV9SRUdTCisJc3dpCXIxNSwgcjEsIDA7CisJLyogTVM6IEhBVkVfRlVOQ1RJT05fVFJBQ0VfTUNPVU5UX1RFU1QgYmVnaW4gb2YgY2hlY2tpbmcgKi8KKwlsd2kJcjUsIHIwLCBmdW5jdGlvbl90cmFjZV9zdG9wOworCWJuZWlkCXI1LCBlbmQ7CisJbm9wOworCS8qIE1TOiBIQVZFX0ZVTkNUSU9OX1RSQUNFX01DT1VOVF9URVNUIGVuZCBvZiBjaGVja2luZyAqLworI2lmZGVmIENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIKKyNpZm5kZWYgQ09ORklHX0RZTkFNSUNfRlRSQUNFCisJbHdpCXI1LCByMCwgZnRyYWNlX2dyYXBoX3JldHVybjsKKwlhZGRpawlyNiwgcjAsIGZ0cmFjZV9zdHViOyAvKiBhc20gaW1wbGVtZW50YXRpb24gKi8KKwljbXB1CXI1LCByNSwgcjY7IC8qIGZ0cmFjZV9ncmFwaF9yZXR1cm4gIT0gZnRyYWNlX3N0dWIgKi8KKwliZXFpZAlyNSwgZW5kX2dyYXBoX3RyYWNlcjsKKwlub3A7CisKKwlsd2kJcjYsIHIwLCBmdHJhY2VfZ3JhcGhfZW50cnk7CisJYWRkaWsJcjUsIHIwLCBmdHJhY2VfZ3JhcGhfZW50cnlfc3R1YjsgLyogaW1wbGVtZW50ZWQgaW4gQyAqLworCWNtcHUJcjUsIHI1LCByNjsgLyogZnRyYWNlX2dyYXBoX2VudHJ5ICE9IGZ0cmFjZV9ncmFwaF9lbnRyeV9zdHViICovCisJYmVxaWQJcjUsIGVuZF9ncmFwaF90cmFjZXI7CisJbm9wOworI2Vsc2UgLyogQ09ORklHX0RZTkFNSUNfRlRSQUNFICovCitOT0FMSUdOX0VOVFJZKGZ0cmFjZV9jYWxsX2dyYXBoKQorCS8qIE1TOiBqdW1wIG92ZXIgZ3JhcGggZnVuY3Rpb24gLSByZXBsYWNlZCBmcm9tIEMgY29kZSAqLworCWJyaQllbmRfZ3JhcGhfdHJhY2VyCisjZW5kaWYgLyogQ09ORklHX0RZTkFNSUNfRlRSQUNFICovCisJYWRkaWsJcjUsIHIxLCAxMjA7IC8qIE1TOiBsb2FkIHBhcmVudCBhZGRyICovCisJYWRkaWsJcjYsIHIxNSwgMDsgLyogTVM6IGxvYWQgY3VycmVudCBmdW5jdGlvbiBhZGRyICovCisJYnJhbGlkCXIxNSwgcHJlcGFyZV9mdHJhY2VfcmV0dXJuOworCW5vcDsKKwkvKiBNUzogZ3JhcGggd2FzIHRha2VuIHRoYXQncyB3aHkgLSBjYW4ganVtcCBvdmVyIGZ1bmN0aW9uIHRyYWNlICovCisJYnJpZAllbmQ7CisJbm9wOworZW5kX2dyYXBoX3RyYWNlcjoKKyNlbmRpZiAvKiBDT05GSUdfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSICovCisjaWZuZGVmIENPTkZJR19EWU5BTUlDX0ZUUkFDRQorCS8qIE1TOiB0ZXN0IGZ1bmN0aW9uIHRyYWNlIGlmIGlzIHRha2VuIG9yIG5vdCAqLworCWx3aQlyMjAsIHIwLCBmdHJhY2VfdHJhY2VfZnVuY3Rpb247CisJYWRkaWsJcjYsIHIwLCBmdHJhY2Vfc3R1YjsKKwljbXB1CXI1LCByMjAsIHI2OyAvKiBmdHJhY2VfdHJhY2VfZnVuY3Rpb24gIT0gZnRyYWNlX3N0dWIgKi8KKwliZXFpZAlyNSwgZW5kOyAvKiBNUzogbm90IHRha2VuIC0+IGp1bXAgb3ZlciAqLworCW5vcDsKKyNlbHNlIC8qIENPTkZJR19EWU5BTUlDX0ZUUkFDRSAqLworTk9BTElHTl9FTlRSWShmdHJhY2VfY2FsbCkKKy8qIGluc3RydWN0aW9uIGZvciBzZXR1cCBpbW0gRlVOQ19wYXJ0MSwgYWRkaWsgcjIwLCByMCwgRlVOQ19wYXJ0MiAqLworCW5vcAorCW5vcAorI2VuZGlmIC8qIENPTkZJR19EWU5BTUlDX0ZUUkFDRSAqLworLyogc3RhdGljIG5vcm1hbCB0cmFjZSAqLworCWx3aQlyNiwgcjEsIDEyMDsgLyogTVM6IGxvYWQgcGFyZW50IGFkZHIgKi8KKwlhZGRpawlyNSwgcjE1LCAwOyAvKiBNUzogbG9hZCBjdXJyZW50IGZ1bmN0aW9uIGFkZHIgKi8KKwkvKiBNUzogaGVyZSBpcyBkZXBlbmRlbmN5IG9uIHByZXZpb3VzIGNvZGUgKi8KKwlicmFsZAlyMTUsIHIyMDsgLyogTVM6IGp1bXAgdG8gZnRyYWNlIGhhbmRsZXIgKi8KKwlub3A7CitlbmQ6CisJbHdpCXIxNSwgcjEsIDA7CisJUkVTVE9SRV9SRUdTCisKKwlydHNkCXIxNSwgODsgLyogTVM6IGp1bXAgYmFjayAqLworCW5vcDsKKworI2lmZGVmIENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIKK0VOVFJZKHJldHVybl90b19oYW5kbGVyKQorCW5vcDsgLyogTVM6IGp1c3QgYmFycmllciBmb3IgcnRzZCByMTUsIDggKi8KKwlub3A7CisJU0FWRV9SRUdTCisJc3dpCXIxNSwgcjEsIDA7CisKKwkvKiBNUzogZmluZCBvdXQgcmV0dXJuaW5nIGFkZHJlc3MgKi8KKwlicmFsaWQJcjE1LCBmdHJhY2VfcmV0dXJuX3RvX2hhbmRsZXI7CisJbm9wOworCisJLyogTVM6IHJldHVybiB2YWx1ZSBmcm9tIGZ0cmFjZV9yZXR1cm5fdG9faGFuZGxlciBpcyBteSByZXR1cm5pbmcgYWRkcgorCSAqIG11c3QgYmUgYmVmb3JlIHJlc3RvcmUgcmVncyBiZWNhdXNlIEkgaGF2ZSB0byByZXN0b3JlIHIzIGNvbnRlbnQgKi8KKwlhZGRpawlyMTUsIHIzLCAwOworCVJFU1RPUkVfUkVHUworCisJcnRzZAlyMTUsIDg7IC8qIE1TOiBqdW1wIGJhY2sgKi8KKwlub3A7CisjZW5kaWYJLyogQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9taWNyb2JsYXplX2tzeW1zLmMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL21pY3JvYmxhemVfa3N5bXMuYwppbmRleCA1OWZmMjBlLi5iYzRkY2I3IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL21pY3JvYmxhemVfa3N5bXMuYworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL21pY3JvYmxhemVfa3N5bXMuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCiAvKgpAQCAtNDcsMyArNDgsNyBAQAogRVhQT1JUX1NZTUJPTChfX3Vtb2RzaTMpOwogZXh0ZXJuIGNoYXIgKl9lYnNzOwogRVhQT1JUX1NZTUJPTF9HUEwoX2Vic3MpOworI2lmZGVmIENPTkZJR19GVU5DVElPTl9UUkFDRVIKK2V4dGVybiB2b2lkIF9tY291bnQodm9pZCk7CitFWFBPUlRfU1lNQk9MKF9tY291bnQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGM1OTJkNDcuLjgxMmYxYmYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIAogdm9pZCBzaG93X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3Jlc2V0LmMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL3Jlc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3MjFhMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcmVzZXQuYwpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBNaWNoYWwgU2ltZWsgPG1vbnN0ckBtb25zdHIuZXU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgUGV0YUxvZ2l4CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKworLyogVHJpZ2dlciBzcGVjaWZpYyBmdW5jdGlvbnMgKi8KKyNpZmRlZiBDT05GSUdfR1BJT0xJQgorCisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorCitzdGF0aWMgaW50IGhhbmRsZTsgLyogcmVzZXQgcGluIGhhbmRsZSAqLworc3RhdGljIHVuc2lnbmVkIGludCByZXNldF92YWw7CisKK3N0YXRpYyBpbnQgb2ZfcmVzZXRfZ3Bpb19oYW5kbGUodm9pZCkKK3sKKwlpbnQgcmV0OyAvKiB2YXJpYWJsZSB3aGljaCBzdG9yZWQgaGFuZGxlIHJlc2V0IGdwaW8gcGluICovCisJc3RydWN0IGRldmljZV9ub2RlICpyb290OyAvKiByb290IG5vZGUgKi8KKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmdwaW87IC8qIGdwaW8gbm9kZSAqLworCXN0cnVjdCBvZl9ncGlvX2NoaXAgKm9mX2djID0gTlVMTDsKKwllbnVtIG9mX2dwaW9fZmxhZ3MgZmxhZ3MgOworCWNvbnN0IHZvaWQgKmdwaW9fc3BlYzsKKworCS8qIGZpbmQgb3V0IHJvb3Qgbm9kZSAqLworCXJvb3QgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOworCisJLyogZ2l2ZSBtZSBoYW5kbGUgZm9yIGdwaW8gbm9kZSB0byBiZSBwb3NzaWJsZSBhbGxvY2F0ZSBwaW4gKi8KKwlyZXQgPSBvZl9wYXJzZV9waGFuZGxlc193aXRoX2FyZ3Mocm9vdCwgImhhcmQtcmVzZXQtZ3Bpb3MiLAorCQkJCSIjZ3Bpby1jZWxscyIsIDAsICZncGlvLCAmZ3Bpb19zcGVjKTsKKwlpZiAocmV0KSB7CisJCXByX2RlYnVnKCIlczogY2FuJ3QgcGFyc2UgZ3Bpb3MgcHJvcGVydHlcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnIwOworCX0KKworCW9mX2djID0gZ3Bpby0+ZGF0YTsKKwlpZiAoIW9mX2djKSB7CisJCXByX2RlYnVnKCIlczogZ3BpbyBjb250cm9sbGVyICVzIGlzbid0IHJlZ2lzdGVyZWRcbiIsCisJCQkgcm9vdC0+ZnVsbF9uYW1lLCBncGlvLT5mdWxsX25hbWUpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycjE7CisJfQorCisJcmV0ID0gb2ZfZ2MtPnhsYXRlKG9mX2djLCByb290LCBncGlvX3NwZWMsICZmbGFncyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyMTsKKworCXJldCArPSBvZl9nYy0+Z2MuYmFzZTsKK2VycjE6CisJb2Zfbm9kZV9wdXQoZ3Bpbyk7CitlcnIwOgorCXByX2RlYnVnKCIlcyBleGl0ZWQgd2l0aCBzdGF0dXMgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgb2ZfcGxhdGZvcm1fcmVzZXRfZ3Bpb19wcm9iZSh2b2lkKQoreworCWludCByZXQ7CisJaGFuZGxlID0gb2ZfcmVzZXRfZ3Bpb19oYW5kbGUoKTsKKworCWlmICghZ3Bpb19pc192YWxpZChoYW5kbGUpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIlNraXBwaW5nIHVuYXZhaWxhYmxlIFJFU0VUIGdwaW8gJWQgKCVzKVxuIiwKKwkJCQloYW5kbGUsICJyZXNldCIpOworCX0KKworCXJldCA9IGdwaW9fcmVxdWVzdChoYW5kbGUsICJyZXNldCIpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkdQSU8gcGluIGlzIGFscmVhZHkgYWxsb2NhdGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGdldCBjdXJyZW50IHNldHVwIHZhbHVlICovCisJcmVzZXRfdmFsID0gZ3Bpb19nZXRfdmFsdWUoaGFuZGxlKTsKKwkvKiBGSVhNRSBtYXliZSB3b3J0aCB0byBwZXJmb3JtIGFueSBhY3Rpb24gKi8KKwlwcl9kZWJ1ZygiUmVzZXQ6IEdwaW8gb3V0cHV0IHN0YXRlOiAweCV4XG4iLCByZXNldF92YWwpOworCisJLyogU2V0dXAgR1BJTyBhcyBvdXRwdXQgKi8KKwlyZXQgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoaGFuZGxlLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnI7CisKKwkvKiBTZXR1cCBvdXRwdXQgZGlyZWN0aW9uICovCisJZ3Bpb19zZXRfdmFsdWUoaGFuZGxlLCAwKTsKKworCXByaW50ayhLRVJOX0lORk8gIlJFU0VUOiBSZWdpc3RlcmVkIGdwaW8gZGV2aWNlOiAlZCwgY3VycmVudCB2YWw6ICVkXG4iLAorCQkJCQkJCWhhbmRsZSwgcmVzZXRfdmFsKTsKKwlyZXR1cm47CitlcnI6CisJZ3Bpb19mcmVlKGhhbmRsZSk7CisJcmV0dXJuOworfQorCisKK3N0YXRpYyB2b2lkIGdwaW9fc3lzdGVtX3Jlc2V0KHZvaWQpCit7CisJZ3Bpb19zZXRfdmFsdWUoaGFuZGxlLCAxIC0gcmVzZXRfdmFsKTsKK30KKyNlbHNlCisjZGVmaW5lIGdwaW9fc3lzdGVtX3Jlc2V0KCkgZG8ge30gd2hpbGUgKDApCit2b2lkIG9mX3BsYXRmb3JtX3Jlc2V0X2dwaW9fcHJvYmUodm9pZCkKK3sKKwlyZXR1cm47Cit9CisjZW5kaWYKKwordm9pZCBtYWNoaW5lX3Jlc3RhcnQoY2hhciAqY21kKQoreworCXByaW50ayhLRVJOX05PVElDRSAiTWFjaGluZSByZXN0YXJ0Li4uXG4iKTsKKwlncGlvX3N5c3RlbV9yZXNldCgpOworCWR1bXBfc3RhY2soKTsKKwl3aGlsZSAoMSkKKwkJOworfQorCit2b2lkIG1hY2hpbmVfc2h1dGRvd24odm9pZCkKK3sKKwlwcmludGsoS0VSTl9OT1RJQ0UgIk1hY2hpbmUgc2h1dGRvd24uLi5cbiIpOworCXdoaWxlICgxKQorCQk7Cit9CisKK3ZvaWQgbWFjaGluZV9oYWx0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fTk9USUNFICJNYWNoaW5lIGhhbHQuLi5cbiIpOworCXdoaWxlICgxKQorCQk7Cit9CisKK3ZvaWQgbWFjaGluZV9wb3dlcl9vZmYodm9pZCkKK3sKKwlwcmludGsoS0VSTl9OT1RJQ0UgIk1hY2hpbmUgcG93ZXIgb2ZmLi4uXG4iKTsKKwl3aGlsZSAoMSkKKwkJOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9zZXR1cC5jCmluZGV4IDhjMWUwZjRkLi41MzcyYjI0IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9zZXR1cC5jCkBAIC01MiwxMyArNTIsMTIgQEAKIAkvKiBpcnFfZWFybHlfaW5pdCgpOyAqLwogCXNldHVwX2NwdWluZm8oKTsKIAotCV9faW52YWxpZGF0ZV9pY2FjaGVfYWxsKCk7Ci0JX19lbmFibGVfaWNhY2hlKCk7CisJbWljcm9ibGF6ZV9jYWNoZV9pbml0KCk7CiAKLQlfX2ludmFsaWRhdGVfZGNhY2hlX2FsbCgpOwotCV9fZW5hYmxlX2RjYWNoZSgpOworCWVuYWJsZV9kY2FjaGUoKTsKIAotCXBhbmljX3RpbWVvdXQgPSAxMjA7CisJaW52YWxpZGF0ZV9pY2FjaGUoKTsKKwllbmFibGVfaWNhY2hlKCk7CiAKIAlzZXR1cF9tZW1vcnkoKTsKIApAQCAtMTMxLDYgKzEzMCw4IEBACiAJCXN0cmxjcHkoY21kX2xpbmUsIGNtZGxpbmUsIENPTU1BTkRfTElORV9TSVpFKTsKICNlbmRpZgogCisJbG9ja2RlcF9pbml0KCk7CisKIC8qIGluaXRpYWxpemUgZGV2aWNlIHRyZWUgZm9yIHVzYWdlIGluIGVhcmx5X3ByaW50ayAqLwogCWVhcmx5X2luaXRfZGV2dHJlZSgodm9pZCAqKV9mZHRfc3RhcnQpOwogCkBAIC0xODYsMzIgKzE4NywzIEBACiB9CiBhcmNoX2luaXRjYWxsKG1pY3JvYmxhemVfZGVidWdmc19pbml0KTsKICNlbmRpZgotCi12b2lkIG1hY2hpbmVfcmVzdGFydChjaGFyICpjbWQpCi17Ci0JcHJpbnRrKEtFUk5fTk9USUNFICJNYWNoaW5lIHJlc3RhcnQuLi5cbiIpOwotCWR1bXBfc3RhY2soKTsKLQl3aGlsZSAoMSkKLQkJOwotfQotCi12b2lkIG1hY2hpbmVfc2h1dGRvd24odm9pZCkKLXsKLQlwcmludGsoS0VSTl9OT1RJQ0UgIk1hY2hpbmUgc2h1dGRvd24uLi5cbiIpOwotCXdoaWxlICgxKQotCQk7Ci19Ci0KLXZvaWQgbWFjaGluZV9oYWx0KHZvaWQpCi17Ci0JcHJpbnRrKEtFUk5fTk9USUNFICJNYWNoaW5lIGhhbHQuLi5cbiIpOwotCXdoaWxlICgxKQotCQk7Ci19Ci0KLXZvaWQgbWFjaGluZV9wb3dlcl9vZmYodm9pZCkKLXsKLQlwcmludGsoS0VSTl9OT1RJQ0UgIk1hY2hpbmUgcG93ZXIgb2ZmLi4uXG4iKTsKLQl3aGlsZSAoMSkKLQkJOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvc2lnbmFsLmMKaW5kZXggMWM4MGU0Zi4uZDhkM2JiMyAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL3NpZ25hbC5jCkBAIC00NCw3ICs0NCw2IEBACiAKIGFzbWxpbmthZ2UgaW50IGRvX3NpZ25hbChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc2lnc2V0X3QgKm9sZHNldCwgaW50IGluX3N5Y2FsbCk7CiAKLQogYXNtbGlua2FnZSBsb25nCiBzeXNfc2lnYWx0c3RhY2soY29uc3Qgc3RhY2tfdCBfX3VzZXIgKnVzcywgc3RhY2tfdCBfX3VzZXIgKnVvc3MsCiAJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQpAQCAtMTc2LDYgKzE3NSwxMSBAQAogCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKmZyYW1lOwogCWludCBlcnIgPSAwOwogCWludCBzaWduYWw7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gMDsKKyNpZmRlZiBDT05GSUdfTU1VCisJcG1kX3QgKnBtZHA7CisJcHRlX3QgKnB0ZXA7CisjZW5kaWYKIAogCWZyYW1lID0gZ2V0X3NpZ2ZyYW1lKGthLCByZWdzLCBzaXplb2YoKmZyYW1lKSk7CiAKQEAgLTIxNiw4ICsyMjAsMjkgQEAKIAkgTmVnYXRpdmUgOCBvZmZzZXQgYmVjYXVzZSByZXR1cm4gaXMgcnRzZCByMTUsIDggKi8KIAlyZWdzLT5yMTUgPSAoKHVuc2lnbmVkIGxvbmcpZnJhbWUtPnRyYW1wKS04OwogCi0JX19pbnZhbGlkYXRlX2NhY2hlX3NpZ3RyYW1wKCh1bnNpZ25lZCBsb25nKWZyYW1lLT50cmFtcCk7CisJYWRkcmVzcyA9ICgodW5zaWduZWQgbG9uZylmcmFtZS0+dHJhbXApOworI2lmZGVmIENPTkZJR19NTVUKKwlwbWRwID0gcG1kX29mZnNldChwdWRfb2Zmc2V0KAorCQkJcGdkX29mZnNldChjdXJyZW50LT5tbSwgYWRkcmVzcyksCisJCQkJCWFkZHJlc3MpLCBhZGRyZXNzKTsKIAorCXByZWVtcHRfZGlzYWJsZSgpOworCXB0ZXAgPSBwdGVfb2Zmc2V0X21hcChwbWRwLCBhZGRyZXNzKTsKKwlpZiAocHRlX3ByZXNlbnQoKnB0ZXApKSB7CisJCWFkZHJlc3MgPSAodW5zaWduZWQgbG9uZykgcGFnZV9hZGRyZXNzKHB0ZV9wYWdlKCpwdGVwKSk7CisJCS8qIE1TOiBJIG5lZWQgYWRkIG9mZnNldCBpbiBwYWdlICovCisJCWFkZHJlc3MgKz0gKCh1bnNpZ25lZCBsb25nKWZyYW1lLT50cmFtcCkgJiB+UEFHRV9NQVNLOworCQkvKiBNUyBhZGRyZXNzIGlzIHZpcnR1YWwgKi8KKwkJYWRkcmVzcyA9IHZpcnRfdG9fcGh5cyhhZGRyZXNzKTsKKwkJaW52YWxpZGF0ZV9pY2FjaGVfcmFuZ2UoYWRkcmVzcywgYWRkcmVzcyArIDgpOworCQlmbHVzaF9kY2FjaGVfcmFuZ2UoYWRkcmVzcywgYWRkcmVzcyArIDgpOworCX0KKwlwdGVfdW5tYXAocHRlcCk7CisJcHJlZW1wdF9lbmFibGUoKTsKKyNlbHNlCisJZmx1c2hfaWNhY2hlX3JhbmdlKGFkZHJlc3MsIGFkZHJlc3MgKyA4KTsKKwlmbHVzaF9kY2FjaGVfcmFuZ2UoYWRkcmVzcywgYWRkcmVzcyArIDgpOworI2VuZGlmCiAJaWYgKGVycikKIAkJZ290byBnaXZlX3NpZ3NlZ3Y7CiAKQEAgLTIzMyw2ICsyNTgsMTAgQEAKIAogCXNldF9mcyhVU0VSX0RTKTsKIAorCS8qIHRoZSB0cmFjZXIgbWF5IHdhbnQgdG8gc2luZ2xlLXN0ZXAgaW5zaWRlIHRoZSBoYW5kbGVyICovCisJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NJTkdMRVNURVApKQorCQlwdHJhY2Vfbm90aWZ5KFNJR1RSQVApOworCiAjaWZkZWYgREVCVUdfU0lHCiAJcHJpbnRrKEtFUk5fSU5GTyAiU0lHIGRlbGl2ZXIgKCVzOiVkKTogc3A9JXAgcGM9JTA4bHhcbiIsCiAJCWN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgZnJhbWUsIHJlZ3MtPnBjKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvc3RhY2t0cmFjZS5jIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9zdGFja3RyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIzNjkyZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvc3RhY2t0cmFjZS5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBTdGFjayB0cmFjZSBzdXBwb3J0IGZvciBNaWNyb2JsYXplLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBNaWNoYWwgU2ltZWsgPG1vbnN0ckBtb25zdHIuZXU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgUGV0YUxvZ2l4CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGFja3RyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkX2luZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworLyogRklYTUUgaW5pdGlhbCBzdXBwb3J0ICovCit2b2lkIHNhdmVfc3RhY2tfdHJhY2Uoc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSkKK3sKKwl1bnNpZ25lZCBsb25nICpzcDsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJYXNtKCJhZGRpayAlMCwgcjEsIDAiIDogIj1yIiAoc3ApKTsKKworCXdoaWxlICgha3N0YWNrX2VuZChzcCkpIHsKKwkJYWRkciA9ICpzcCsrOworCQlpZiAoX19rZXJuZWxfdGV4dF9hZGRyZXNzKGFkZHIpKSB7CisJCQlpZiAodHJhY2UtPnNraXAgPiAwKQorCQkJCXRyYWNlLT5za2lwLS07CisJCQllbHNlCisJCQkJdHJhY2UtPmVudHJpZXNbdHJhY2UtPm5yX2VudHJpZXMrK10gPSBhZGRyOworCisJCQlpZiAodHJhY2UtPm5yX2VudHJpZXMgPj0gdHJhY2UtPm1heF9lbnRyaWVzKQorCQkJCWJyZWFrOworCQl9CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoc2F2ZV9zdGFja190cmFjZSk7CisKK3ZvaWQgc2F2ZV9zdGFja190cmFjZV90c2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBzdGFja190cmFjZSAqdHJhY2UpCit7CisJdW5zaWduZWQgaW50ICpzcDsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpID0gdGFza190aHJlYWRfaW5mbyh0c2spOworCisJaWYgKHRzayA9PSBjdXJyZW50KQorCQlhc20oImFkZGlrICUwLCByMSwgMCIgOiAiPXIiIChzcCkpOworCWVsc2UKKwkJc3AgPSAodW5zaWduZWQgaW50ICopdGktPmNwdV9jb250ZXh0LnIxOworCisJd2hpbGUgKCFrc3RhY2tfZW5kKHNwKSkgeworCQlhZGRyID0gKnNwKys7CisJCWlmIChfX2tlcm5lbF90ZXh0X2FkZHJlc3MoYWRkcikpIHsKKwkJCWlmICh0cmFjZS0+c2tpcCA+IDApCisJCQkJdHJhY2UtPnNraXAtLTsKKwkJCWVsc2UKKwkJCQl0cmFjZS0+ZW50cmllc1t0cmFjZS0+bnJfZW50cmllcysrXSA9IGFkZHI7CisKKwkJCWlmICh0cmFjZS0+bnJfZW50cmllcyA+PSB0cmFjZS0+bWF4X2VudHJpZXMpCisJCQkJYnJlYWs7CisJCX0KKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzYXZlX3N0YWNrX3RyYWNlX3Rzayk7CmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3N5c19taWNyb2JsYXplLmMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL3N5c19taWNyb2JsYXplLmMKaW5kZXggMDdjYWJlZC4uOWYzYzIwNSAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9zeXNfbWljcm9ibGF6ZS5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvc3lzX21pY3JvYmxhemUuYwpAQCAtNjIsNDYgKzYyLDE0IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1hc21saW5rYWdlIGxvbmcKLXN5c19tbWFwMih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAotCXVuc2lnbmVkIGxvbmcgcHJvdCwgdW5zaWduZWQgbG9uZyBmbGFncywKLQl1bnNpZ25lZCBsb25nIGZkLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQotewotCXN0cnVjdCBmaWxlICpmaWxlID0gTlVMTDsKLQlpbnQgcmV0ID0gLUVCQURGOwotCi0JZmxhZ3MgJj0gfihNQVBfRVhFQ1VUQUJMRSB8IE1BUF9ERU5ZV1JJVEUpOwotCWlmICghKGZsYWdzICYgTUFQX0FOT05ZTU9VUykpIHsKLQkJZmlsZSA9IGZnZXQoZmQpOwotCQlpZiAoIWZpbGUpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIm5vIGZkIGluIG1tYXBcclxuIik7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQotCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JcmV0ID0gZG9fbW1hcF9wZ29mZihmaWxlLCBhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBwZ29mZik7Ci0JdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JaWYgKGZpbGUpCi0JCWZwdXQoZmlsZSk7Ci1vdXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQogYXNtbGlua2FnZSBsb25nIHN5c19tbWFwKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCiAJCQl1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiAJCQl1bnNpZ25lZCBsb25nIGZkLCBvZmZfdCBwZ29mZikKIHsKLQlpbnQgZXJyID0gLUVJTlZBTDsKKwlpZiAocGdvZmYgJiB+UEFHRV9NQVNLKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChwZ29mZiAmIH5QQUdFX01BU0spIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAibm8gcGFnZW1hc2sgaW4gbW1hcFxyXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZXJyID0gc3lzX21tYXAyKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBwZ29mZiA+PiBQQUdFX1NISUZUKTsKLW91dDoKLQlyZXR1cm4gZXJyOworCXJldHVybiBzeXNfbW1hcF9wZ29mZihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgcGdvZmYgPj4gUEFHRV9TSElGVCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3N5c2NhbGxfdGFibGUuUyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvc3lzY2FsbF90YWJsZS5TCmluZGV4IGMxYWIxZGMuLjQwODhiZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvc3lzY2FsbF90YWJsZS5TCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvc3lzY2FsbF90YWJsZS5TCkBAIC0xODMsNyArMTgzLDcgQEAKIAkubG9uZyBzeXNfcnRfc2lncGVuZGluZwogCS5sb25nIHN5c19ydF9zaWd0aW1lZHdhaXQKIAkubG9uZyBzeXNfcnRfc2lncXVldWVpbmZvCi0JLmxvbmcgc3lzX3J0X3NpZ3N1c3BlbmRfd3JhcHBlcgorCS5sb25nIHN5c19ydF9zaWdzdXNwZW5kCiAJLmxvbmcgc3lzX3ByZWFkNjQJCS8qIDE4MCAqLwogCS5sb25nIHN5c19wd3JpdGU2NAogCS5sb25nIHN5c19jaG93bgpAQCAtMTk2LDcgKzE5Niw3IEBACiAJLmxvbmcgc3lzX25pX3N5c2NhbGwJCS8qIHJlc2VydmVkIGZvciBzdHJlYW1zMiAqLwogCS5sb25nIHN5c192Zm9yawkJLyogMTkwICovCiAJLmxvbmcgc3lzX2dldHJsaW1pdAotCS5sb25nIHN5c19tbWFwMgkJCS8qIG1tYXAyICovCisJLmxvbmcgc3lzX21tYXBfcGdvZmYJCS8qIG1tYXAyICovCiAJLmxvbmcgc3lzX3RydW5jYXRlNjQKIAkubG9uZyBzeXNfZnRydW5jYXRlNjQKIAkubG9uZyBzeXNfc3RhdDY0CQkvKiAxOTUgKi8KQEAgLTMwMyw3ICszMDMsNyBAQAogCS5sb25nIHN5c19ta2RpcmF0CiAJLmxvbmcgc3lzX21rbm9kYXQKIAkubG9uZyBzeXNfZmNob3duYXQKLQkubG9uZyBzeXNfbmlfc3lzY2FsbAorCS5sb25nIHN5c19mdXRpbWVzYXQKIAkubG9uZyBzeXNfZnN0YXRhdDY0CQkvKiAzMDAgKi8KIAkubG9uZyBzeXNfdW5saW5rYXQKIAkubG9uZyBzeXNfcmVuYW1lYXQKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvdGltZXIuYyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvdGltZXIuYwppbmRleCA1NDk5ZGVhLi5lZDYxYjJmIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3RpbWVyLmMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC90aW1lci5jCkBAIC0xODMsNiArMTgzLDMxIEBACiAJcmV0dXJuIChjeWNsZV90KSAoaW5fYmUzMihUSU1FUl9CQVNFICsgVENSMSkpOwogfQogCitzdGF0aWMgc3RydWN0IHRpbWVjb3VudGVyIG1pY3JvYmxhemVfdGMgPSB7CisJLmNjID0gTlVMTCwKK307CisKK3N0YXRpYyBjeWNsZV90IG1pY3JvYmxhemVfY2NfcmVhZChjb25zdCBzdHJ1Y3QgY3ljbGVjb3VudGVyICpjYykKK3sKKwlyZXR1cm4gbWljcm9ibGF6ZV9yZWFkKE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IGN5Y2xlY291bnRlciBtaWNyb2JsYXplX2NjID0geworCS5yZWFkID0gbWljcm9ibGF6ZV9jY19yZWFkLAorCS5tYXNrID0gQ0xPQ0tTT1VSQ0VfTUFTSygzMiksCisJLnNoaWZ0ID0gMjQsCit9OworCitpbnQgX19pbml0IGluaXRfbWljcm9ibGF6ZV90aW1lY291bnRlcih2b2lkKQoreworCW1pY3JvYmxhemVfY2MubXVsdCA9IGRpdl9zYyhjcHVpbmZvLmNwdV9jbG9ja19mcmVxLCBOU0VDX1BFUl9TRUMsCisJCQkJbWljcm9ibGF6ZV9jYy5zaGlmdCk7CisKKwl0aW1lY291bnRlcl9pbml0KCZtaWNyb2JsYXplX3RjLCAmbWljcm9ibGF6ZV9jYywgc2NoZWRfY2xvY2soKSk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV9taWNyb2JsYXplID0gewogCS5uYW1lCQk9ICJtaWNyb2JsYXplX2Nsb2Nrc291cmNlIiwKIAkucmF0aW5nCQk9IDMwMCwKQEAgLTIwNCw2ICsyMjksOSBAQAogCW91dF9iZTMyKFRJTUVSX0JBU0UgKyBUQ1NSMSwgaW5fYmUzMihUSU1FUl9CQVNFICsgVENTUjEpICYgflRDU1JfRU5UKTsKIAkvKiBzdGFydCB0aW1lcjEgLSB1cCBjb3VudGluZyB3aXRob3V0IGludGVycnVwdCAqLwogCW91dF9iZTMyKFRJTUVSX0JBU0UgKyBUQ1NSMSwgVENTUl9USU5UfFRDU1JfRU5UfFRDU1JfQVJIVCk7CisKKwkvKiByZWdpc3RlciB0aW1lY291bnRlciAtIGZvciBmdHJhY2Ugc3VwcG9ydCAqLworCWluaXRfbWljcm9ibGF6ZV90aW1lY291bnRlcigpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggZTcwNDE4OC4uNWVmNjE5YSAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMjYsMTEgKzI2LDEyIEBACiAJCV9zdGV4dCA9IC4gOwogCQkqKC50ZXh0IC50ZXh0LiopCiAJCSooLmZpeHVwKQotICAgICAgICAgICAgICAgRVhJVF9URVhUCi0gICAgICAgICAgICAgICBFWElUX0NBTEwKKwkJRVhJVF9URVhUCisJCUVYSVRfQ0FMTAogCQlTQ0hFRF9URVhUCiAJCUxPQ0tfVEVYVAogCQlLUFJPQkVTX1RFWFQKKwkJSVJRRU5UUllfVEVYVAogCQkuID0gQUxJR04gKDQpIDsKIAkJX2V0ZXh0ID0gLiA7CiAJfQpAQCAtODYsNiArODcsNyBAQAogCQlfS0VSTkVMX1NEQV9CQVNFXyA9IF9zc3JvICsgKF9zc3JvX3NpemUgLyAyKSA7CiAJfQogCisJLiA9IEFMSUdOKFBBR0VfU0laRSk7CiAJX19pbml0X2JlZ2luID0gLjsKIAogCUlOSVRfVEVYVF9TRUNUSU9OKFBBR0VfU0laRSkKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9saWIvdWFjY2Vzcy5jIGIvYXJjaC9taWNyb2JsYXplL2xpYi91YWNjZXNzLmMKaW5kZXggOGViOWRmNS4uYTg1M2ZlMCAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2xpYi91YWNjZXNzLmMKKysrIGIvYXJjaC9taWNyb2JsYXplL2xpYi91YWNjZXNzLmMKQEAgLTM5LDMgKzM5LDEwIEBACiAJCV9fZG9fc3RybmNweV9mcm9tX3VzZXIoZHN0LCBzcmMsIGNvdW50LCByZXMpOwogCXJldHVybiByZXM7CiB9CisKK3Vuc2lnbmVkIGxvbmcgX19jb3B5X3RvZnJvbV91c2VyKHZvaWQgX191c2VyICp0bywKKwkJY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwltZW1jcHkodG8sIGZyb20sIHNpemUpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL21tL2luaXQuYyBiL2FyY2gvbWljcm9ibGF6ZS9tbS9pbml0LmMKaW5kZXggYTQ0ODkyZS4uYTU3Y2VkZiAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL21tL2luaXQuYworKysgYi9hcmNoL21pY3JvYmxhemUvbW0vaW5pdC5jCkBAIC00MSw2ICs0MSw3IEBACiAgKiBoYXZlIGF2YWlsYWJsZS4KICAqLwogdW5zaWduZWQgbG9uZyBtZW1vcnlfc3RhcnQ7CitFWFBPUlRfU1lNQk9MKG1lbW9yeV9zdGFydCk7CiB1bnNpZ25lZCBsb25nIG1lbW9yeV9lbmQ7IC8qIGR1ZSB0byBtbS9ub21tdS5jICovCiB1bnNpZ25lZCBsb25nIG1lbW9yeV9zaXplOwogCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvbW0vcGd0YWJsZS5jIGIvYXJjaC9taWNyb2JsYXplL21tL3BndGFibGUuYwppbmRleCA0NmM0Y2E1Li4yODIwMDgxIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvbW0vcGd0YWJsZS5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9tbS9wZ3RhYmxlLmMKQEAgLTE0NCw3ICsxNDQsNiBAQAogCXBtZF90ICpwZDsKIAlwdGVfdCAqcGc7CiAJaW50IGVyciA9IC1FTk9NRU07Ci0JLyogc3Bpbl9sb2NrKCZpbml0X21tLnBhZ2VfdGFibGVfbG9jayk7ICovCiAJLyogVXNlIHVwcGVyIDEwIGJpdHMgb2YgVkEgdG8gaW5kZXggdGhlIGZpcnN0IGxldmVsIG1hcCAqLwogCXBkID0gcG1kX29mZnNldChwZ2Rfb2Zmc2V0X2sodmEpLCB2YSk7CiAJLyogVXNlIG1pZGRsZSAxMCBiaXRzIG9mIFZBIHRvIGluZGV4IHRoZSBzZWNvbmQtbGV2ZWwgbWFwICovCkBAIC0xNTgsOSArMTU3LDcgQEAKIAkJaWYgKG1lbV9pbml0X2RvbmUpCiAJCQlmbHVzaF9IUFRFKDAsIHZhLCBwbWRfdmFsKCpwZCkpOwogCQkJLyogZmx1c2hfSFBURSgwLCB2YSwgcGcpOyAqLwotCiAJfQotCS8qIHNwaW5fdW5sb2NrKCZpbml0X21tLnBhZ2VfdGFibGVfbG9jayk7ICovCiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTgyLDEyICsxNzksNiBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyB2b2lkIHNob3dfdG1lbSh1bnNpZ25lZCBsb25nIHRtZW0pCi17Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBhOwotCWEgPSBhICsgdG1lbTsKLX0KLQogLyoKICAqIE1hcCBpbiBhbGwgb2YgcGh5c2ljYWwgbWVtb3J5IHN0YXJ0aW5nIGF0IENPTkZJR19LRVJORUxfU1RBUlQuCiAgKi8KQEAgLTE5Nyw3ICsxODgsNiBAQAogCiAJdiA9IENPTkZJR19LRVJORUxfU1RBUlQ7CiAJcCA9IG1lbW9yeV9zdGFydDsKLQlzaG93X3RtZW0obWVtb3J5X3NpemUpOwogCWZvciAocyA9IDA7IHMgPCBtZW1vcnlfc2l6ZTsgcyArPSBQQUdFX1NJWkUpIHsKIAkJZiA9IF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9BQ0NFU1NFRCB8CiAJCQkJX1BBR0VfU0hBUkVEIHwgX1BBR0VfSFdFWEVDOwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL29wcm9maWxlL01ha2VmaWxlIGIvYXJjaC9taWNyb2JsYXplL29wcm9maWxlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMDM0OGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pY3JvYmxhemUvb3Byb2ZpbGUvTWFrZWZpbGUKQEAgLTAsMCArMSwxMyBAQAorIworIyBhcmNoL21pY3JvYmxhemUvb3Byb2ZpbGUvTWFrZWZpbGUKKyMKKworb2JqLSQoQ09ORklHX09QUk9GSUxFKSArPSBvcHJvZmlsZS5vCisKK0RSSVZFUl9PQkpTIDo9ICQoYWRkcHJlZml4IC4uLy4uLy4uL2RyaXZlcnMvb3Byb2ZpbGUvLCBcCisJCW9wcm9mLm8gY3B1X2J1ZmZlci5vIGJ1ZmZlcl9zeW5jLm8gXAorCQlldmVudF9idWZmZXIubyBvcHJvZmlsZV9maWxlcy5vIFwKKwkJb3Byb2ZpbGVmcy5vIG9wcm9maWxlX3N0YXRzLm8gXAorCQl0aW1lcl9pbnQubyApCisKK29wcm9maWxlLXkgOj0gJChEUklWRVJfT0JKUykgbWljcm9ibGF6ZV9vcHJvZmlsZS5vCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvb3Byb2ZpbGUvbWljcm9ibGF6ZV9vcHJvZmlsZS5jIGIvYXJjaC9taWNyb2JsYXplL29wcm9maWxlL21pY3JvYmxhemVfb3Byb2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWYxN2U1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taWNyb2JsYXplL29wcm9maWxlL21pY3JvYmxhemVfb3Byb2ZpbGUuYwpAQCAtMCwwICsxLDIyIEBACisvKgorICogTWljcm9ibGF6ZSBvcHJvZmlsZSBjb2RlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IE1pY2hhbCBTaW1layA8bW9uc3RyQG1vbnN0ci5ldT4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBQZXRhTG9naXgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9vcHJvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworaW50IF9faW5pdCBvcHJvZmlsZV9hcmNoX2luaXQoc3RydWN0IG9wcm9maWxlX29wZXJhdGlvbnMgKm9wcykKK3sKKwlyZXR1cm4gLTE7Cit9CisKK3ZvaWQgb3Byb2ZpbGVfYXJjaF9leGl0KHZvaWQpCit7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvcGxhdGZvcm0vS2NvbmZpZy5wbGF0Zm9ybSBiL2FyY2gvbWljcm9ibGF6ZS9wbGF0Zm9ybS9LY29uZmlnLnBsYXRmb3JtCmluZGV4IDhlOWI0NzUuLjY2OWM3ZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9wbGF0Zm9ybS9LY29uZmlnLnBsYXRmb3JtCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9wbGF0Zm9ybS9LY29uZmlnLnBsYXRmb3JtCkBAIC01MywzMSArNTMsMTIgQEAKIAogY29uZmlnIE9QVF9MSUJfQVNNCiAJYm9vbCAiT3B0aW1hbGl6ZWQgbGliIGZ1bmN0aW9uIEFTTSIKLQlkZXBlbmRzIG9uIE9QVF9MSUJfRlVOQ1RJT04KKwlkZXBlbmRzIG9uIE9QVF9MSUJfRlVOQ1RJT04gJiYgKFhJTElOWF9NSUNST0JMQVpFMF9VU0VfQkFSUkVMID0gMSkKIAlkZWZhdWx0IG4KIAloZWxwCiAJICBBbGxvd3MgdHVybiBvbiBvcHRpbWFsaXplZCBsaWJyYXJ5IGZ1bmN0aW9uIChtZW1jcHkgYW5kIG1lbW1vdmUpLgogCSAgRnVuY3Rpb24gYXJlIHdyaXR0ZW4gaW4gYXNtIGNvZGUuCiAKLSMgVGhpcyBpcyBzdGlsbCBhIGJpdCBicm9rZW4gLSBkaXNhYmxpbmcgZm9yIG5vdyBKVyAyMDA3MDUwNAotY29uZmlnIEFMTE9XX0VESVRfQVVUTwotCWJvb2wgIlBlcm1pdCBEaXNwbGF5L2VkaXQgb2YgS2NvbmZpZy5hdXRvIHBsYXRmb3JtIHNldHRpbmdzIgotCWRlZmF1bHQgbgotCWhlbHAKLQkgIEFsbG93cyB0aGUgZWRpdGluZyBvZiBhdXRvLWdlbmVyYXRlZCBwbGF0Zm9ybSBzZXR0aW5ncyBmcm9tCi0JICB0aGUgS2NvbmZpZy5hdXRvIGZpbGUuIE9idmlvdXNseSB0aGlzIGRvZXMgbm90IGNoYW5nZSB0aGUKLQkgIHVuZGVybHlpbmcgaGFyZHdhcmUsIHNvIGJlIHZlcnkgY2FyZWZ1bCBpZiB5b3UgZ28gZWRpdGluZwotCSAgdGhlc2Ugc2V0dGluZ3MuCi0KLQkgIEFsc28sIGlmIHlvdSBlbmFibGUgdGhpcywgYW5kIGVkaXQgdmFyaW91cyBLY29uZmlnLmF1dG8KLQkgIHNldHRpbmdzLCBZT1VSIENIQU5HRVMgV0lMTCBCRSBMT1NUIGlmIHlvdSB0aGVuIGRpc2FibGUgaXQKLQkgIGFnYWluLiBZb3UgaGF2ZSBiZWVuIHdhcm5lZCEKLQotCSAgSWYgdW5zdXJlLCBzYXkgbm8uCi0KLWNvbW1lbnQgIkF1dG9tYXRpYyBwbGF0Zm9ybSBzZXR0aW5ncyBmcm9tIEtjb25maWcuYXV0byIKLQlkZXBlbmRzIG9uIEFMTE9XX0VESVRfQVVUTwotCiBpZiBQTEFURk9STV9HRU5FUklDPXkKIAlzb3VyY2UgImFyY2gvbWljcm9ibGF6ZS9wbGF0Zm9ybS9nZW5lcmljL0tjb25maWcuYXV0byIKIGVuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvcGxhdGZvcm0vZ2VuZXJpYy9LY29uZmlnLmF1dG8gYi9hcmNoL21pY3JvYmxhemUvcGxhdGZvcm0vZ2VuZXJpYy9LY29uZmlnLmF1dG8KaW5kZXggZmJjYTIyZC4uNWQ4NmZjMSAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL3BsYXRmb3JtL2dlbmVyaWMvS2NvbmZpZy5hdXRvCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9wbGF0Zm9ybS9nZW5lcmljL0tjb25maWcuYXV0bwpAQCAtMjEsNyArMjEsNiBAQAogCiAjIERlZmluaXRpb25zIGZvciBNSUNST0JMQVpFMAogY29tbWVudCAiRGVmaW5pdGlvbnMgZm9yIE1JQ1JPQkxBWkUwIgotCWRlcGVuZHMgb24gQUxMT1dfRURJVF9BVVRPCiAKIGNvbmZpZyBLRVJORUxfQkFTRV9BRERSCiAJaGV4ICJQaHlzaWNhbCBhZGRyZXNzIHdoZXJlIExpbnV4IEtlcm5lbCBpcyIKQEAgLTMwLDMzICsyOSwzMyBAQAogCSAgQkFTRSBBZGRyZXNzIGZvciBrZXJuZWwKIAogY29uZmlnIFhJTElOWF9NSUNST0JMQVpFMF9GQU1JTFkKLQlzdHJpbmcgIlRhcmdldHRlZCBGUEdBIGZhbWlseSIgaWYgQUxMT1dfRURJVF9BVVRPCisJc3RyaW5nICJUYXJnZXR0ZWQgRlBHQSBmYW1pbHkiCiAJZGVmYXVsdCAidmlydGV4NSIKIAogY29uZmlnIFhJTElOWF9NSUNST0JMQVpFMF9VU0VfTVNSX0lOU1RSCi0JaW50ICJVU0VfTVNSX0lOU1RSIHJhbmdlICgwOjEpIiBpZiBBTExPV19FRElUX0FVVE8KLQlkZWZhdWx0IDEKKwlpbnQgIlVTRV9NU1JfSU5TVFIgcmFuZ2UgKDA6MSkiCisJZGVmYXVsdCAwCiAKIGNvbmZpZyBYSUxJTlhfTUlDUk9CTEFaRTBfVVNFX1BDTVBfSU5TVFIKLQlpbnQgIlVTRV9QQ01QX0lOU1RSIHJhbmdlICgwOjEpIiBpZiBBTExPV19FRElUX0FVVE8KLQlkZWZhdWx0IDEKKwlpbnQgIlVTRV9QQ01QX0lOU1RSIHJhbmdlICgwOjEpIgorCWRlZmF1bHQgMAogCiBjb25maWcgWElMSU5YX01JQ1JPQkxBWkUwX1VTRV9CQVJSRUwKLQlpbnQgIlVTRV9CQVJSRUwgcmFuZ2UgKDA6MSkiIGlmIEFMTE9XX0VESVRfQVVUTwotCWRlZmF1bHQgMQorCWludCAiVVNFX0JBUlJFTCByYW5nZSAoMDoxKSIKKwlkZWZhdWx0IDAKIAogY29uZmlnIFhJTElOWF9NSUNST0JMQVpFMF9VU0VfRElWCi0JaW50ICJVU0VfRElWIHJhbmdlICgwOjEpIiBpZiBBTExPV19FRElUX0FVVE8KLQlkZWZhdWx0IDEKKwlpbnQgIlVTRV9ESVYgcmFuZ2UgKDA6MSkiCisJZGVmYXVsdCAwCiAKIGNvbmZpZyBYSUxJTlhfTUlDUk9CTEFaRTBfVVNFX0hXX01VTAotCWludCAiVVNFX0hXX01VTCB2YWx1ZXMgKDA9Tk9ORSwgMT1NVUwzMiwgMj1NVUw2NCkiIGlmIEFMTE9XX0VESVRfQVVUTwotCWRlZmF1bHQgMgorCWludCAiVVNFX0hXX01VTCB2YWx1ZXMgKDA9Tk9ORSwgMT1NVUwzMiwgMj1NVUw2NCkiCisJZGVmYXVsdCAwCiAKIGNvbmZpZyBYSUxJTlhfTUlDUk9CTEFaRTBfVVNFX0ZQVQotCWludCAiVVNFX0ZQVSB2YWx1ZXMgKDA9Tk9ORSwgMT1CQVNJQywgMj1FWFRFTkRFRCkiIGlmIEFMTE9XX0VESVRfQVVUTwotCWRlZmF1bHQgMgorCWludCAiVVNFX0ZQVSB2YWx1ZXMgKDA9Tk9ORSwgMT1CQVNJQywgMj1FWFRFTkRFRCkiCisJZGVmYXVsdCAwCiAKIGNvbmZpZyBYSUxJTlhfTUlDUk9CTEFaRTBfSFdfVkVSCi0Jc3RyaW5nICJDb3JlIHZlcnNpb24gbnVtYmVyIiBpZiBBTExPV19FRElUX0FVVE8KKwlzdHJpbmcgIkNvcmUgdmVyc2lvbiBudW1iZXIiCiAJZGVmYXVsdCA3LjEwLmQKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9wbGF0Zm9ybS9nZW5lcmljL3N5c3RlbS5kdHMgYi9hcmNoL21pY3JvYmxhemUvcGxhdGZvcm0vZ2VuZXJpYy9zeXN0ZW0uZHRzCmluZGV4IDI5OTkzZjYuLjJkNWM0MTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9wbGF0Zm9ybS9nZW5lcmljL3N5c3RlbS5kdHMKKysrIGIvYXJjaC9taWNyb2JsYXplL3BsYXRmb3JtL2dlbmVyaWMvc3lzdGVtLmR0cwpAQCAtMzIsMTEgKzMyLDE2IEBACiAJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJI3NpemUtY2VsbHMgPSA8MT47CiAJY29tcGF0aWJsZSA9ICJ4bG54LG1pY3JvYmxhemUiOworCWhhcmQtcmVzZXQtZ3Bpb3MgPSA8JkxFRHNfOEJpdCAyIDE+OwogCW1vZGVsID0gInRlc3RpbmciOwogCUREUjJfU0RSQU06IG1lbW9yeUA5MDAwMDAwMCB7CiAJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CiAJCXJlZyA9IDwgMHg5MDAwMDAwMCAweDEwMDAwMDAwID47CiAJfSA7CisJYWxpYXNlcyB7CisJCWV0aGVybmV0MCA9ICZIYXJkX0V0aGVybmV0X01BQzsKKwkJc2VyaWFsMCA9ICZSUzIzMl9VYXJ0XzE7CisJfSA7CiAJY2hvc2VuIHsKIAkJYm9vdGFyZ3MgPSAiY29uc29sZT10dHlVTDAsMTE1MjAwIGhpZ2hyZXM9b24iOwogCQlsaW51eCxzdGRvdXQtcGF0aCA9ICIvcGxiQDAvc2VyaWFsQDg0MDAwMDAwIjsKQEAgLTEyNyw3ICsxMzIsNyBAQAogCW1iX3BsYjogcGxiQDAgewogCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCWNvbXBhdGlibGUgPSAieGxueCxwbGItdjQ2LTEuMDMuYSIsICJzaW1wbGUtYnVzIjsKKwkJY29tcGF0aWJsZSA9ICJ4bG54LHBsYi12NDYtMS4wMy5hIiwgInhsbngscGxiLXY0Ni0xLjAwLmEiLCAic2ltcGxlLWJ1cyI7CiAJCXJhbmdlcyA7CiAJCUZMQVNIOiBmbGFzaEBhMDAwMDAwMCB7CiAJCQliYW5rLXdpZHRoID0gPDI+OwpAQCAtMjE0LDEyICsyMTksMTIgQEAKIAkJCSNzaXplLWNlbGxzID0gPDE+OwogCQkJY29tcGF0aWJsZSA9ICJ4bG54LGNvbXBvdW5kIjsKIAkJCWV0aGVybmV0QDgxYzAwMDAwIHsKLQkJCQljb21wYXRpYmxlID0gInhsbngseHBzLWxsLXRlbWFjLTEuMDEuYiI7CisJCQkJY29tcGF0aWJsZSA9ICJ4bG54LHhwcy1sbC10ZW1hYy0xLjAxLmIiLCAieGxueCx4cHMtbGwtdGVtYWMtMS4wMC5hIjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ4cHNfaW50Y18wPjsKIAkJCQlpbnRlcnJ1cHRzID0gPCA1IDIgPjsKIAkJCQlsbGluay1jb25uZWN0ZWQgPSA8JlBJTTM+OwotCQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMiAwMCAwMCAwMCAwMCAwMCBdOworCQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwYSAzNSAwMCAwMCAwMCBdOwogCQkJCXJlZyA9IDwgMHg4MWMwMDAwMCAweDQwID47CiAJCQkJeGxueCxidXMyY29yZS1jbGstcmF0aW8gPSA8MHgxPjsKIAkJCQl4bG54LHBoeS10eXBlID0gPDB4MT47CkBAIC0yNjEsNiArMjY2LDMzIEBACiAJCQl4bG54LGlzLWR1YWwgPSA8MHgwPjsKIAkJCXhsbngsdHJpLWRlZmF1bHQgPSA8MHhmZmZmZmZmZj47CiAJCQl4bG54LHRyaS1kZWZhdWx0LTIgPSA8MHhmZmZmZmZmZj47CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJfSA7CisKKwkJZ3Bpby1sZWRzIHsKKwkJCWNvbXBhdGlibGUgPSAiZ3Bpby1sZWRzIjsKKworCQkJaGVhcnRiZWF0IHsKKwkJCQlsYWJlbCA9ICJIZWFydGJlYXQiOworCQkJCWdwaW9zID0gPCZMRURzXzhCaXQgNCAxPjsKKwkJCQlsaW51eCxkZWZhdWx0LXRyaWdnZXIgPSAiaGVhcnRiZWF0IjsKKwkJCX07CisKKwkJCXllbGxvdyB7CisJCQkJbGFiZWwgPSAiWWVsbG93IjsKKwkJCQlncGlvcyA9IDwmTEVEc184Qml0IDUgMT47CisJCQl9OworCisJCQlyZWQgeworCQkJCWxhYmVsID0gIlJlZCI7CisJCQkJZ3Bpb3MgPSA8JkxFRHNfOEJpdCA2IDE+OworCQkJfTsKKworCQkJZ3JlZW4geworCQkJCWxhYmVsID0gIkdyZWVuIjsKKwkJCQlncGlvcyA9IDwmTEVEc184Qml0IDcgMT47CisJCQl9OwogCQl9IDsKIAkJUlMyMzJfVWFydF8xOiBzZXJpYWxAODQwMDAwMDAgewogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDEyNTAwMDAwMD47CmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvcGxhdGZvcm0vcGxhdGZvcm0uYyBiL2FyY2gvbWljcm9ibGF6ZS9wbGF0Zm9ybS9wbGF0Zm9ybS5jCmluZGV4IDU2ZTAyMzQuLjViODliNTggMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9wbGF0Zm9ybS9wbGF0Zm9ybS5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9wbGF0Zm9ybS9wbGF0Zm9ybS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KIAogc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgeGlsaW54X29mX2J1c19pZHNbXSBfX2luaXRkYXRhID0gewogCXsgLmNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyIsIH0sCkBAIC0yNiw2ICsyNyw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBtaWNyb2JsYXplX2RldmljZV9wcm9iZSh2b2lkKQogewogCW9mX3BsYXRmb3JtX2J1c19wcm9iZShOVUxMLCB4aWxpbnhfb2ZfYnVzX2lkcywgTlVMTCk7CisJb2ZfcGxhdGZvcm1fcmVzZXRfZ3Bpb19wcm9iZSgpOwogCXJldHVybiAwOwogfQogZGV2aWNlX2luaXRjYWxsKG1pY3JvYmxhemVfZGV2aWNlX3Byb2JlKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9mY250bC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2ZjbnRsLmgKaW5kZXggMmE1MjMzMy4uN2M2NjgxYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2ZjbnRsLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2ZjbnRsLmgKQEAgLTEwLDcgKzEwLDcgQEAKIAogCiAjZGVmaW5lIE9fQVBQRU5ECTB4MDAwOAotI2RlZmluZSBPX1NZTkMJCTB4MDAxMAorI2RlZmluZSBPX0RTWU5DCQkweDAwMTAJLyogdXNlZCB0byBiZSBPX1NZTkMsIHNlZSBiZWxvdyAqLwogI2RlZmluZSBPX05PTkJMT0NLCTB4MDA4MAogI2RlZmluZSBPX0NSRUFUICAgICAgICAgMHgwMTAwCS8qIG5vdCBmY250bCAqLwogI2RlZmluZSBPX1RSVU5DCQkweDAyMDAJLyogbm90IGZjbnRsICovCkBAIC0xOCw2ICsxOCwyMSBAQAogI2RlZmluZSBPX05PQ1RUWQkweDA4MDAJLyogbm90IGZjbnRsICovCiAjZGVmaW5lIEZBU1lOQwkJMHgxMDAwCS8qIGZjbnRsLCBmb3IgQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgT19MQVJHRUZJTEUJMHgyMDAwCS8qIGFsbG93IGxhcmdlIGZpbGUgb3BlbnMgKi8KKy8qCisgKiBCZWZvcmUgTGludXggMi42LjMyIG9ubHkgT19EU1lOQyBzZW1hbnRpY3Mgd2VyZSBpbXBsZW1lbnRlZCwgYnV0IHVzaW5nCisgKiB0aGUgT19TWU5DIGZsYWcuICBXZSBjb250aW51ZSB0byB1c2UgdGhlIGV4aXN0aW5nIG51bWVyaWNhbCB2YWx1ZQorICogZm9yIE9fRFNZTkMgc2VtYW50aWNzIG5vdywgYnV0IHVzaW5nIHRoZSBjb3JyZWN0IHN5bWJvbGljIG5hbWUgZm9yIGl0LgorICogVGhpcyBuZXcgdmFsdWUgaXMgdXNlZCB0byByZXF1ZXN0IHRydWUgUG9zaXggT19TWU5DIHNlbWFudGljcy4gIEl0IGlzCisgKiBkZWZpbmVkIGluIHRoaXMgc3RyYW5nZSB3YXkgdG8gbWFrZSBzdXJlIGFwcGxpY2F0aW9ucyBjb21waWxlZCBhZ2FpbnN0CisgKiBuZXcgaGVhZGVycyBnZXQgYXQgbGVhc3QgT19EU1lOQyBzZW1hbnRpY3Mgb24gb2xkZXIga2VybmVscy4KKyAqCisgKiBUaGlzIGhhcyB0aGUgbmljZSBzaWRlLWVmZmVjdCB0aGF0IHdlIGNhbiBzaW1wbHkgdGVzdCBmb3IgT19EU1lOQworICogd2hlcmV2ZXIgd2UgZG8gbm90IGNhcmUgaWYgT19EU1lOQyBvciBPX1NZTkMgaXMgdXNlZC4KKyAqCisgKiBOb3RlOiBfX09fU1lOQyBtdXN0IG5ldmVyIGJlIHVzZWQgZGlyZWN0bHkuCisgKi8KKyNkZWZpbmUgX19PX1NZTkMJMHg0MDAwCisjZGVmaW5lIE9fU1lOQwkJKF9fT19TWU5DfE9fRFNZTkMpCiAjZGVmaW5lIE9fRElSRUNUCTB4ODAwMAkvKiBkaXJlY3QgZGlzayBhY2Nlc3MgaGludCAqLwogCiAjZGVmaW5lIEZfR0VUTEsJCTE0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2tzcGQuYyBiL2FyY2gvbWlwcy9rZXJuZWwva3NwZC5jCmluZGV4IGFkNGUwMTcuLjgwZTJiYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwva3NwZC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwva3NwZC5jCkBAIC04Miw2ICs4Miw3IEBACiAjZGVmaW5lIE1UU1BfT19TSExPQ0sJCTB4MDAxMAogI2RlZmluZSBNVFNQX09fRVhMT0NLCQkweDAwMjAKICNkZWZpbmUgTVRTUF9PX0FTWU5DCQkweDAwNDAKKy8qIFhYWDogY2hlY2sgd2hpY2ggb2YgdGhlc2UgaXMgYWN0dWFsbHkgT19TWU5DIHZzIE9fRFNZTkMgKi8KICNkZWZpbmUgTVRTUF9PX0ZTWU5DCQlPX1NZTkMKICNkZWZpbmUgTVRTUF9PX05PRk9MTE9XCQkweDAxMDAKICNkZWZpbmUgTVRTUF9PX1NZTkMJCTB4MDA4MApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9saW51eDMyLmMgYi9hcmNoL21pcHMva2VybmVsL2xpbnV4MzIuYwppbmRleCAxYTI3OTNlLi5mMDQyNTYzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2xpbnV4MzIuYworKysgYi9hcmNoL21pcHMva2VybmVsL2xpbnV4MzIuYwpAQCAtNjcsMjggKzY3LDEzIEBACiAJdW5zaWduZWQgbG9uZywgcHJvdCwgdW5zaWduZWQgbG9uZywgZmxhZ3MsIHVuc2lnbmVkIGxvbmcsIGZkLAogCXVuc2lnbmVkIGxvbmcsIHBnb2ZmKQogewotCXN0cnVjdCBmaWxlICogZmlsZSA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBlcnJvcjsKIAogCWVycm9yID0gLUVJTlZBTDsKIAlpZiAocGdvZmYgJiAoflBBR0VfTUFTSyA+PiAxMikpCiAJCWdvdG8gb3V0OwotCXBnb2ZmID4+PSBQQUdFX1NISUZULTEyOwotCi0JaWYgKCEoZmxhZ3MgJiBNQVBfQU5PTllNT1VTKSkgewotCQllcnJvciA9IC1FQkFERjsKLQkJZmlsZSA9IGZnZXQoZmQpOwotCQlpZiAoIWZpbGUpCi0JCQlnb3RvIG91dDsKLQl9Ci0JZmxhZ3MgJj0gfihNQVBfRVhFQ1VUQUJMRSB8IE1BUF9ERU5ZV1JJVEUpOwotCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOwotCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCWlmIChmaWxlKQotCQlmcHV0KGZpbGUpOwotCisJZXJyb3IgPSBzeXNfbW1hcF9wZ29mZihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwKKwkJCSAgICAgICBwZ29mZiA+PiAoUEFHRV9TSElGVC0xMikpOwogb3V0OgogCXJldHVybiBlcnJvcjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc3lzY2FsbC5jIGIvYXJjaC9taXBzL2tlcm5lbC9zeXNjYWxsLmMKaW5kZXggZmUwZDc5OC4uM2Y3ZjQ2NiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zeXNjYWxsLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zeXNjYWxsLmMKQEAgLTkzLDcgKzkzLDggQEAKIAkJICogV2UgZG8gbm90IGFjY2VwdCBhIHNoYXJlZCBtYXBwaW5nIGlmIGl0IHdvdWxkIHZpb2xhdGUKIAkJICogY2FjaGUgYWxpYXNpbmcgY29uc3RyYWludHMuCiAJCSAqLwotCQlpZiAoKGZsYWdzICYgTUFQX1NIQVJFRCkgJiYgKGFkZHIgJiBzaG1fYWxpZ25fbWFzaykpCisJCWlmICgoZmxhZ3MgJiBNQVBfU0hBUkVEKSAmJgorCQkgICAgKChhZGRyIC0gKHBnb2ZmIDw8IFBBR0VfU0hJRlQpKSAmIHNobV9hbGlnbl9tYXNrKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCQlyZXR1cm4gYWRkcjsKIAl9CkBAIC0xMjksMzEgKzEzMCw2IEBACiAJfQogfQogCi0vKiBjb21tb24gY29kZSBmb3Igb2xkIGFuZCBuZXcgbW1hcHMgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotZG9fbW1hcDIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyBwcm90LAotICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIGZkLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQotewotCXVuc2lnbmVkIGxvbmcgZXJyb3IgPSAtRUJBREY7Ci0Jc3RydWN0IGZpbGUgKiBmaWxlID0gTlVMTDsKLQotCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGZkKTsKLQkJaWYgKCFmaWxlKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOwotCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCi0JaWYgKGZpbGUpCi0JCWZwdXQoZmlsZSk7Ci1vdXQ6Ci0JcmV0dXJuIGVycm9yOwotfQotCiBTWVNDQUxMX0RFRklORTYobWlwc19tbWFwLCB1bnNpZ25lZCBsb25nLCBhZGRyLCB1bnNpZ25lZCBsb25nLCBsZW4sCiAJdW5zaWduZWQgbG9uZywgcHJvdCwgdW5zaWduZWQgbG9uZywgZmxhZ3MsIHVuc2lnbmVkIGxvbmcsCiAJZmQsIG9mZl90LCBvZmZzZXQpCkBAIC0xNjQsNyArMTQwLDcgQEAKIAlpZiAob2Zmc2V0ICYgflBBR0VfTUFTSykKIAkJZ290byBvdXQ7CiAKLQlyZXN1bHQgPSBkb19tbWFwMihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgb2Zmc2V0ID4+IFBBR0VfU0hJRlQpOworCXJlc3VsdCA9IHN5c19tbWFwX3Bnb2ZmKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBvZmZzZXQgPj4gUEFHRV9TSElGVCk7CiAKIG91dDoKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMTc3LDcgKzE1Myw3IEBACiAJaWYgKHBnb2ZmICYgKH5QQUdFX01BU0sgPj4gMTIpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldHVybiBkb19tbWFwMihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgcGdvZmYgPj4gKFBBR0VfU0hJRlQtMTIpKTsKKwlyZXR1cm4gc3lzX21tYXBfcGdvZmYoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsIHBnb2ZmID4+IChQQUdFX1NISUZULTEyKSk7CiB9CiAKIHNhdmVfc3RhdGljX2Z1bmN0aW9uKHN5c19mb3JrKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vbWVtLmMgYi9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL21lbS5jCmluZGV4IDdjOTJmNzkuLmU5NGVmMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vbWVtLmMKKysrIGIvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9tZW0uYwpAQCAtMjYsNyArMjYsNyBAQAogLyogb3ZlcnJpZGUgb2YgYXJjaC9taXBzL21tL2NhY2hlLmM6IF9fdW5jYWNoZWRfYWNjZXNzICovCiBpbnQgX191bmNhY2hlZF9hY2Nlc3Moc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKLQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fU1lOQykKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fRFNZTkMpCiAJCXJldHVybiAxOwogCiAJcmV0dXJuIGFkZHIgPj0gX19wYShoaWdoX21lbW9yeSkgfHwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9jYWNoZS5jIGIvYXJjaC9taXBzL21tL2NhY2hlLmMKaW5kZXggNjk0ZDUxZi4uMTAyYjJkZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2NhY2hlLmMKKysrIGIvYXJjaC9taXBzL21tL2NhY2hlLmMKQEAgLTE5NCw3ICsxOTQsNyBAQAogCiBpbnQgX193ZWFrIF9fdW5jYWNoZWRfYWNjZXNzKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0JaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX1NZTkMpCisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX0RTWU5DKQogCQlyZXR1cm4gMTsKIAogCXJldHVybiBhZGRyID49IF9fcGEoaGlnaF9tZW1vcnkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL21tYW4uaCBiL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS9tbWFuLmgKaW5kZXggOGVlYmY4OS4uZGI1YzUzZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS9tbWFuLmgKKysrIGIvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL21tYW4uaApAQCAtMSArMSw2IEBACiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbW1hbi5oPgorCisjZGVmaW5lIE1JTl9NQVBfQUREUglQQUdFX1NJWkUJLyogbWluaW11bSBmaXhlZCBtbWFwIGFkZHJlc3MgKi8KKworI2RlZmluZSBhcmNoX21tYXBfY2hlY2soYWRkciwgbGVuLCBmbGFncykgXAorCSgoKGZsYWdzKSAmIE1BUF9GSVhFRCAmJiAoYWRkcikgPCBNSU5fTUFQX0FERFIpID8gLUVJTlZBTCA6IDApCmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL2VudHJ5LlMgYi9hcmNoL21uMTAzMDAva2VybmVsL2VudHJ5LlMKaW5kZXggYTk0ZTdlYS4uYzllZTZjMCAxMDA2NDQKLS0tIGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvZW50cnkuUwpAQCAtNTc4LDcgKzU3OCw3IEBACiAJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogcmVzZXJ2ZWQgZm9yIHN0cmVhbXMyICovCiAJLmxvbmcgc3lzX3Zmb3JrCQkvKiAxOTAgKi8KIAkubG9uZyBzeXNfZ2V0cmxpbWl0Ci0JLmxvbmcgc3lzX21tYXAyCisJLmxvbmcgc3lzX21tYXBfcGdvZmYKIAkubG9uZyBzeXNfdHJ1bmNhdGU2NAogCS5sb25nIHN5c19mdHJ1bmNhdGU2NAogCS5sb25nIHN5c19zdGF0NjQJLyogMTk1ICovCmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL2twcm9iZXMuYyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IGRhY2FmYWIuLjY3ZTYzODkgMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwva3Byb2Jlcy5jCkBAIC0zMSwxMyArMzEsMTMgQEAKICNkZWZpbmUgS1BST0JFX0hJVF9BQ1RJVkUJMHgwMDAwMDAwMQogI2RlZmluZSBLUFJPQkVfSElUX1NTCQkweDAwMDAwMDAyCiAKLXN0YXRpYyBzdHJ1Y3Qga3Byb2JlICpjdXJyZW50X2twcm9iZTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGN1cnJlbnRfa3Byb2JlX29yaWdfcGM7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBjdXJyZW50X2twcm9iZV9uZXh0X3BjOwotc3RhdGljIGludCBjdXJyZW50X2twcm9iZV9zc19mbGFnczsKK3N0YXRpYyBzdHJ1Y3Qga3Byb2JlICpjdXJfa3Byb2JlOworc3RhdGljIHVuc2lnbmVkIGxvbmcgY3VyX2twcm9iZV9vcmlnX3BjOworc3RhdGljIHVuc2lnbmVkIGxvbmcgY3VyX2twcm9iZV9uZXh0X3BjOworc3RhdGljIGludCBjdXJfa3Byb2JlX3NzX2ZsYWdzOwogc3RhdGljIHVuc2lnbmVkIGxvbmcga3Byb2JlX3N0YXR1czsKLXN0YXRpYyBrcHJvYmVfb3Bjb2RlX3QgY3VycmVudF9rcHJvYmVfc3NfYnVmW01BWF9JTlNOX1NJWkUgKyAyXTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGN1cnJlbnRfa3Byb2JlX2JwX2FkZHI7CitzdGF0aWMga3Byb2JlX29wY29kZV90IGN1cl9rcHJvYmVfc3NfYnVmW01BWF9JTlNOX1NJWkUgKyAyXTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGN1cl9rcHJvYmVfYnBfYWRkcjsKIAogREVGSU5FX1BFUl9DUFUoc3RydWN0IGtwcm9iZSAqLCBjdXJyZW50X2twcm9iZSkgPSBOVUxMOwogCkBAIC0zOTksMjYgKzM5OSwyNSBAQAogewogCXVuc2lnbmVkIGxvbmcgbmV4dHBjOwogCi0JY3VycmVudF9rcHJvYmVfb3JpZ19wYyA9IHJlZ3MtPnBjOwotCW1lbWNweShjdXJyZW50X2twcm9iZV9zc19idWYsICZwLT5haW5zbi5pbnNuWzBdLCBNQVhfSU5TTl9TSVpFKTsKLQlyZWdzLT5wYyA9ICh1bnNpZ25lZCBsb25nKSBjdXJyZW50X2twcm9iZV9zc19idWY7CisJY3VyX2twcm9iZV9vcmlnX3BjID0gcmVncy0+cGM7CisJbWVtY3B5KGN1cl9rcHJvYmVfc3NfYnVmLCAmcC0+YWluc24uaW5zblswXSwgTUFYX0lOU05fU0laRSk7CisJcmVncy0+cGMgPSAodW5zaWduZWQgbG9uZykgY3VyX2twcm9iZV9zc19idWY7CiAKLQluZXh0cGMgPSBmaW5kX25leHRwYyhyZWdzLCAmY3VycmVudF9rcHJvYmVfc3NfZmxhZ3MpOwotCWlmIChjdXJyZW50X2twcm9iZV9zc19mbGFncyAmIFNJTkdMRVNURVBfUENSRUwpCi0JCWN1cnJlbnRfa3Byb2JlX25leHRfcGMgPQotCQkJY3VycmVudF9rcHJvYmVfb3JpZ19wYyArIChuZXh0cGMgLSByZWdzLT5wYyk7CisJbmV4dHBjID0gZmluZF9uZXh0cGMocmVncywgJmN1cl9rcHJvYmVfc3NfZmxhZ3MpOworCWlmIChjdXJfa3Byb2JlX3NzX2ZsYWdzICYgU0lOR0xFU1RFUF9QQ1JFTCkKKwkJY3VyX2twcm9iZV9uZXh0X3BjID0gY3VyX2twcm9iZV9vcmlnX3BjICsgKG5leHRwYyAtIHJlZ3MtPnBjKTsKIAllbHNlCi0JCWN1cnJlbnRfa3Byb2JlX25leHRfcGMgPSBuZXh0cGM7CisJCWN1cl9rcHJvYmVfbmV4dF9wYyA9IG5leHRwYzsKIAogCS8qIGJyYW5jaGluZyBpbnN0cnVjdGlvbnMgbmVlZCBzcGVjaWFsIGhhbmRsaW5nICovCi0JaWYgKGN1cnJlbnRfa3Byb2JlX3NzX2ZsYWdzICYgU0lOR0xFU1RFUF9CUkFOQ0gpCisJaWYgKGN1cl9rcHJvYmVfc3NfZmxhZ3MgJiBTSU5HTEVTVEVQX0JSQU5DSCkKIAkJbmV4dHBjID0gc2luZ2xlc3RlcF9icmFuY2hfc2V0dXAocmVncyk7CiAKLQljdXJyZW50X2twcm9iZV9icF9hZGRyID0gbmV4dHBjOworCWN1cl9rcHJvYmVfYnBfYWRkciA9IG5leHRwYzsKIAogCSoodTggKikgbmV4dHBjID0gQlJFQUtQT0lOVF9JTlNUUlVDVElPTjsKLQltbjEwMzAwX2RjYWNoZV9mbHVzaF9yYW5nZTIoKHVuc2lnbmVkKSBjdXJyZW50X2twcm9iZV9zc19idWYsCi0JCQkJICAgIHNpemVvZihjdXJyZW50X2twcm9iZV9zc19idWYpKTsKKwltbjEwMzAwX2RjYWNoZV9mbHVzaF9yYW5nZTIoKHVuc2lnbmVkKSBjdXJfa3Byb2JlX3NzX2J1ZiwKKwkJCQkgICAgc2l6ZW9mKGN1cl9rcHJvYmVfc3NfYnVmKSk7CiAJbW4xMDMwMF9pY2FjaGVfaW52KCk7CiB9CiAKQEAgLTQ0MCw3ICs0MzksNyBAQAogCQkJZGlzYXJtX2twcm9iZShwLCByZWdzKTsKIAkJCXJldCA9IDE7CiAJCX0gZWxzZSB7Ci0JCQlwID0gY3VycmVudF9rcHJvYmU7CisJCQlwID0gY3VyX2twcm9iZTsKIAkJCWlmIChwLT5icmVha19oYW5kbGVyICYmIHAtPmJyZWFrX2hhbmRsZXIocCwgcmVncykpCiAJCQkJZ290byBzc19wcm9iZTsKIAkJfQpAQCAtNDY0LDcgKzQ2Myw3IEBACiAJfQogCiAJa3Byb2JlX3N0YXR1cyA9IEtQUk9CRV9ISVRfQUNUSVZFOwotCWN1cnJlbnRfa3Byb2JlID0gcDsKKwljdXJfa3Byb2JlID0gcDsKIAlpZiAocC0+cHJlX2hhbmRsZXIocCwgcmVncykpIHsKIAkJLyogaGFuZGxlciBoYXMgYWxyZWFkeSBzZXQgdGhpbmdzIHVwLCBzbyBza2lwIHNzIHNldHVwICovCiAJCXJldHVybiAxOwpAQCAtNDkxLDggKzQ5MCw4IEBACiBzdGF0aWMgdm9pZCBfX2twcm9iZXMgcmVzdW1lX2V4ZWN1dGlvbihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAkvKiB3ZSBtYXkgbmVlZCB0byBmaXh1cCByZWdzL3N0YWNrIGFmdGVyIHNpbmdsZXN0ZXBwaW5nIGEgY2FsbCBpbnNuICovCi0JaWYgKGN1cnJlbnRfa3Byb2JlX3NzX2ZsYWdzICYgU0lOR0xFU1RFUF9CUkFOQ0gpIHsKLQkJcmVncy0+cGMgPSBjdXJyZW50X2twcm9iZV9vcmlnX3BjOworCWlmIChjdXJfa3Byb2JlX3NzX2ZsYWdzICYgU0lOR0xFU1RFUF9CUkFOQ0gpIHsKKwkJcmVncy0+cGMgPSBjdXJfa3Byb2JlX29yaWdfcGM7CiAJCXN3aXRjaCAocC0+YWluc24uaW5zblswXSkgewogCQljYXNlIDB4Y2Q6CS8qIENBTEwgKGQxNixQQykgKi8KIAkJCSoodW5zaWduZWQgKikgcmVncy0+c3AgPSByZWdzLT5tZHIgPSByZWdzLT5wYyArIDU7CkBAIC01MjMsOCArNTIyLDggQEAKIAkJfQogCX0KIAotCXJlZ3MtPnBjID0gY3VycmVudF9rcHJvYmVfbmV4dF9wYzsKLQljdXJyZW50X2twcm9iZV9icF9hZGRyID0gMDsKKwlyZWdzLT5wYyA9IGN1cl9rcHJvYmVfbmV4dF9wYzsKKwljdXJfa3Byb2JlX2JwX2FkZHIgPSAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBfX2twcm9iZXMgcG9zdF9rcHJvYmVfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKQEAgLTUzMiwxMCArNTMxLDEwIEBACiAJaWYgKCFrcHJvYmVfcnVubmluZygpKQogCQlyZXR1cm4gMDsKIAotCWlmIChjdXJyZW50X2twcm9iZS0+cG9zdF9oYW5kbGVyKQotCQljdXJyZW50X2twcm9iZS0+cG9zdF9oYW5kbGVyKGN1cnJlbnRfa3Byb2JlLCByZWdzLCAwKTsKKwlpZiAoY3VyX2twcm9iZS0+cG9zdF9oYW5kbGVyKQorCQljdXJfa3Byb2JlLT5wb3N0X2hhbmRsZXIoY3VyX2twcm9iZSwgcmVncywgMCk7CiAKLQlyZXN1bWVfZXhlY3V0aW9uKGN1cnJlbnRfa3Byb2JlLCByZWdzKTsKKwlyZXN1bWVfZXhlY3V0aW9uKGN1cl9rcHJvYmUsIHJlZ3MpOwogCXJlc2V0X2N1cnJlbnRfa3Byb2JlKCk7CiAJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwogCXJldHVybiAxOwpAQCAtNTQ1LDEyICs1NDQsMTIgQEAKIHN0YXRpYyBpbmxpbmUKIGludCBfX2twcm9iZXMga3Byb2JlX2ZhdWx0X2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCB0cmFwbnIpCiB7Ci0JaWYgKGN1cnJlbnRfa3Byb2JlLT5mYXVsdF9oYW5kbGVyICYmCi0JICAgIGN1cnJlbnRfa3Byb2JlLT5mYXVsdF9oYW5kbGVyKGN1cnJlbnRfa3Byb2JlLCByZWdzLCB0cmFwbnIpKQorCWlmIChjdXJfa3Byb2JlLT5mYXVsdF9oYW5kbGVyICYmCisJICAgIGN1cl9rcHJvYmUtPmZhdWx0X2hhbmRsZXIoY3VyX2twcm9iZSwgcmVncywgdHJhcG5yKSkKIAkJcmV0dXJuIDE7CiAKIAlpZiAoa3Byb2JlX3N0YXR1cyAmIEtQUk9CRV9ISVRfU1MpIHsKLQkJcmVzdW1lX2V4ZWN1dGlvbihjdXJyZW50X2twcm9iZSwgcmVncyk7CisJCXJlc3VtZV9leGVjdXRpb24oY3VyX2twcm9iZSwgcmVncyk7CiAJCXJlc2V0X2N1cnJlbnRfa3Byb2JlKCk7CiAJCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKIAl9CkBAIC01NjcsNyArNTY2LDcgQEAKIAogCXN3aXRjaCAodmFsKSB7CiAJY2FzZSBESUVfQlJFQUtQT0lOVDoKLQkJaWYgKGN1cnJlbnRfa3Byb2JlX2JwX2FkZHIgIT0gYXJncy0+cmVncy0+cGMpIHsKKwkJaWYgKGN1cl9rcHJvYmVfYnBfYWRkciAhPSBhcmdzLT5yZWdzLT5wYykgewogCQkJaWYgKGtwcm9iZV9oYW5kbGVyKGFyZ3MtPnJlZ3MpKQogCQkJCXJldHVybiBOT1RJRllfU1RPUDsKIAkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvc3lzX21uMTAzMDAuYyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvc3lzX21uMTAzMDAuYwppbmRleCA4Y2E1YWYwLi4xN2NjNmNlIDEwMDY0NAotLS0gYS9hcmNoL21uMTAzMDAva2VybmVsL3N5c19tbjEwMzAwLmMKKysrIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9zeXNfbW4xMDMwMC5jCkBAIC0yMyw0NyArMjMsMTMgQEAKIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLSNkZWZpbmUgTUlOX01BUF9BRERSCVBBR0VfU0laRQkvKiBtaW5pbXVtIGZpeGVkIG1tYXAgYWRkcmVzcyAqLwotCi0vKgotICogbWVtb3J5IG1hcHBpbmcgc3lzY2FsbAotICovCi1hc21saW5rYWdlIGxvbmcgc3lzX21tYXAyKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCi0JCQkgIHVuc2lnbmVkIGxvbmcgcHJvdCwgdW5zaWduZWQgbG9uZyBmbGFncywKLQkJCSAgdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZikKLXsKLQlzdHJ1Y3QgZmlsZSAqZmlsZSA9IE5VTEw7Ci0JbG9uZyBlcnJvciA9IC1FSU5WQUw7Ci0KLQlmbGFncyAmPSB+KE1BUF9FWEVDVVRBQkxFIHwgTUFQX0RFTllXUklURSk7Ci0KLQlpZiAoZmxhZ3MgJiBNQVBfRklYRUQgJiYgYWRkciA8IE1JTl9NQVBfQUREUikKLQkJZ290byBvdXQ7Ci0KLQllcnJvciA9IC1FQkFERjsKLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGZkKTsKLQkJaWYgKCFmaWxlKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOwotCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCi0JaWYgKGZpbGUpCi0JCWZwdXQoZmlsZSk7Ci1vdXQ6Ci0JcmV0dXJuIGVycm9yOwotfQotCiBhc21saW5rYWdlIGxvbmcgb2xkX21tYXAodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKIAkJCSB1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiAJCQkgdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCiB7CiAJaWYgKG9mZnNldCAmIH5QQUdFX01BU0spCiAJCXJldHVybiAtRUlOVkFMOwotCXJldHVybiBzeXNfbW1hcDIoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsIG9mZnNldCA+PiBQQUdFX1NISUZUKTsKKwlyZXR1cm4gc3lzX21tYXBfcGdvZmYoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsIG9mZnNldCA+PiBQQUdFX1NISUZUKTsKIH0KIAogc3RydWN0IHNlbF9hcmdfc3RydWN0IHsKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2ZjbnRsLmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9mY250bC5oCmluZGV4IDFlMWM4MjQuLmYzNTdmYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2ZjbnRsLmgKKysrIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vZmNudGwuaApAQCAtMSwxNCArMSwxMyBAQAogI2lmbmRlZiBfUEFSSVNDX0ZDTlRMX0gKICNkZWZpbmUgX1BBUklTQ19GQ05UTF9ICiAKLS8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKLSAgIGxvY2F0ZWQgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLwogI2RlZmluZSBPX0FQUEVORAkwMDAwMDAwMTAKICNkZWZpbmUgT19CTEtTRUVLCTAwMDAwMDEwMCAvKiBIUFVYIG9ubHkgKi8KICNkZWZpbmUgT19DUkVBVAkJMDAwMDAwNDAwIC8qIG5vdCBmY250bCAqLwogI2RlZmluZSBPX0VYQ0wJCTAwMDAwMjAwMCAvKiBub3QgZmNudGwgKi8KICNkZWZpbmUgT19MQVJHRUZJTEUJMDAwMDA0MDAwCi0jZGVmaW5lIE9fU1lOQwkJMDAwMTAwMDAwCisjZGVmaW5lIF9fT19TWU5DCTAwMDEwMDAwMAorI2RlZmluZSBPX1NZTkMJCShfX09fU1lOQ3xPX0RTWU5DKQogI2RlZmluZSBPX05PTkJMT0NLCTAwMDIwMDAwNCAvKiBIUFVYIGhhcyBzZXBhcmF0ZSBOREVMQVkgJiBOT05CTE9DSyAqLwogI2RlZmluZSBPX05PQ1RUWQkwMDA0MDAwMDAgLyogbm90IGZjbnRsICovCiAjZGVmaW5lIE9fRFNZTkMJCTAwMTAwMDAwMCAvKiBIUFVYIG9ubHkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9zeXNfcGFyaXNjLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvc3lzX3BhcmlzYy5jCmluZGV4IDcxYjMxOTUuLjkxNDczOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9zeXNfcGFyaXNjLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL3N5c19wYXJpc2MuYwpAQCAtMTEwLDM3ICsxMTAsMTQgQEAKIAlyZXR1cm4gYWRkcjsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgZG9fbW1hcDIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQl1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgZmQsCi0JdW5zaWduZWQgbG9uZyBwZ29mZikKLXsKLQlzdHJ1Y3QgZmlsZSAqIGZpbGUgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgZXJyb3IgPSAtRUJBREY7Ci0JaWYgKCEoZmxhZ3MgJiBNQVBfQU5PTllNT1VTKSkgewotCQlmaWxlID0gZmdldChmZCk7Ci0JCWlmICghZmlsZSkKLQkJCWdvdG8gb3V0OwotCX0KLQotCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQotCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JZXJyb3IgPSBkb19tbWFwX3Bnb2ZmKGZpbGUsIGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIHBnb2ZmKTsKLQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQotCWlmIChmaWxlICE9IE5VTEwpCi0JCWZwdXQoZmlsZSk7Ci1vdXQ6Ci0JcmV0dXJuIGVycm9yOwotfQotCiBhc21saW5rYWdlIHVuc2lnbmVkIGxvbmcgc3lzX21tYXAyKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCiAJdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIGZkLAogCXVuc2lnbmVkIGxvbmcgcGdvZmYpCiB7CiAJLyogTWFrZSBzdXJlIHRoZSBzaGlmdCBmb3IgbW1hcDIgaXMgY29uc3RhbnQgKDEyKSwgbm8gbWF0dGVyIHdoYXQgUEFHRV9TSVpFCiAJICAgd2UgaGF2ZS4gKi8KLQlyZXR1cm4gZG9fbW1hcDIoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsIHBnb2ZmID4+IChQQUdFX1NISUZUIC0gMTIpKTsKKwlyZXR1cm4gc3lzX21tYXBfcGdvZmYoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsCisJCQkgICAgICBwZ29mZiA+PiAoUEFHRV9TSElGVCAtIDEyKSk7CiB9CiAKIGFzbWxpbmthZ2UgdW5zaWduZWQgbG9uZyBzeXNfbW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLApAQCAtMTQ4LDcgKzEyNSw4IEBACiAJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0KQogewogCWlmICghKG9mZnNldCAmIH5QQUdFX01BU0spKSB7Ci0JCXJldHVybiBkb19tbWFwMihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgb2Zmc2V0ID4+IFBBR0VfU0hJRlQpOworCQlyZXR1cm4gc3lzX21tYXBfcGdvZmYoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsCisJCQkJCW9mZnNldCA+PiBQQUdFX1NISUZUKTsKIAl9IGVsc2UgewogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCmluZGV4IDJiYTE0ZTcuLjBkZjU3NDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCkBAIC01Niw2ICs1NiwxNiBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIE5SX0lSUVMKKwlpbnQgIk51bWJlciBvZiB2aXJ0dWFsIGludGVycnVwdCBudW1iZXJzIgorCXJhbmdlIDMyIDUxMgorCWRlZmF1bHQgIjUxMiIKKwloZWxwCisJICBUaGlzIGRlZmluZXMgdGhlIG51bWJlciBvZiB2aXJ0dWFsIGludGVycnVwdCBudW1iZXJzIHRoZSBrZXJuZWwKKwkgIGNhbiBtYW5hZ2UuIFZpcnR1YWwgaW50ZXJydXB0IG51bWJlcnMgYXJlIHdoYXQgeW91IHNlZSBpbgorCSAgL3Byb2MvaW50ZXJydXB0cy4gSWYgeW91IGNvbmZpZ3VyZSB5b3VyIHN5c3RlbSB0byBoYXZlIHRvbyBmZXcsCisJICBkcml2ZXJzIHdpbGwgZmFpbCB0byBsb2FkIG9yIHdvcnNlIC0gaGFuZGxlIHdpdGggY2FyZS4KKwogY29uZmlnIFNUQUNLVFJBQ0VfU1VQUE9SVAogCWJvb2wKIAlkZWZhdWx0IHkKQEAgLTE5OSwyNCArMjA5LDE0IEBACiBjb25maWcgUkVEQk9PVAogCWJvb2wKIAotY29uZmlnIEhJQkVSTkFURV8zMgotCWJvb2wKLQlkZXBlbmRzIG9uIChQUENfUE1BQyAmJiAhU01QKSB8fCBCUk9LRU4KLQlkZWZhdWx0IHkKLQotY29uZmlnIEhJQkVSTkFURV82NAotCWJvb2wKLQlkZXBlbmRzIG9uIEJST0tFTiB8fCAoUFBDX1BNQUM2NCAmJiBFWFBFUklNRU5UQUwpCi0JZGVmYXVsdCB5Ci0KIGNvbmZpZyBBUkNIX0hJQkVSTkFUSU9OX1BPU1NJQkxFCiAJYm9vbAotCWRlcGVuZHMgb24gKFBQQzY0ICYmIEhJQkVSTkFURV82NCkgfHwgKFBQQzMyICYmIEhJQkVSTkFURV8zMikKIAlkZWZhdWx0IHkKIAogY29uZmlnIEFSQ0hfU1VTUEVORF9QT1NTSUJMRQogCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIEFEQl9QTVUgfHwgUFBDX0VGSUtBIHx8IFBQQ19MSVRFNTIwMCB8fCBQUENfODN4eAorCWRlcGVuZHMgb24gQURCX1BNVSB8fCBQUENfRUZJS0EgfHwgUFBDX0xJVEU1MjAwIHx8IFBQQ184M3h4IHx8IFwKKwkJICAgUFBDXzg1eHggfHwgUFBDXzg2eHgKIAogY29uZmlnIFBQQ19EQ1JfTkFUSVZFCiAJYm9vbApAQCAtMzIwLDYgKzMyMCwxMCBAQAogCiAJICBTYXkgTiBpZiB5b3UgYXJlIHVuc3VyZS4KIAorY29uZmlnIEFSQ0hfQ1BVX1BST0JFX1JFTEVBU0UKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBIT1RQTFVHX0NQVQorCiBjb25maWcgQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFBMVUcKIAlkZWZfYm9vbCB5CiAKQEAgLTM3OCw2ICszODIsMTkgQEAKIAkgIENQVS4gIEdlbmVyYWxseSBzYXlpbmcgWSBpcyBzYWZlLCBhbHRob3VnaCBzb21lIHByb2JsZW1zIGhhdmUgYmVlbgogCSAgcmVwb3J0ZWQgd2l0aCBTTVAgUG93ZXIgTWFjaW50b3NoZXMgd2l0aCB0aGlzIG9wdGlvbiBlbmFibGVkLgogCitjb25maWcgU1BBUlNFX0lSUQorCWJvb2wgIlN1cHBvcnQgc3BhcnNlIGlycSBudW1iZXJpbmciCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHNwYXJzZSBpcnFzLiBUaGlzIGlzIHVzZWZ1bCBmb3IgZGlzdHJvCisJICBrZXJuZWxzIHRoYXQgd2FudCB0byBkZWZpbmUgYSBoaWdoIENPTkZJR19OUl9DUFVTIHZhbHVlIGJ1dCBzdGlsbAorCSAgd2FudCB0byBoYXZlIGxvdyBrZXJuZWwgbWVtb3J5IGZvb3RwcmludCBvbiBzbWFsbGVyIG1hY2hpbmVzLgorCisJICAoIFNwYXJzZSBJUlFzIGNhbiBhbHNvIGJlIGJlbmVmaWNpYWwgb24gTlVNQSBib3hlcywgYXMgdGhleSBzcHJlYWQKKwkgICAgb3V0IHRoZSBpcnFfZGVzY1tdIGFycmF5IGluIGEgbW9yZSBOVU1BLWZyaWVuZGx5IHdheS4gKQorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGhlcmUsIHNheSBZLgorCiBjb25maWcgTlVNQQogCWJvb2wgIk5VTUEgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBQQzY0CkBAIC02NTIsNiArNjY5LDE0IEBACiAJc2VsZWN0IFBQQ19JTkRJUkVDVF9QQ0kKIAlzZWxlY3QgUENJX1FVSVJLUwogCitjb25maWcgRlNMX1BNQworCWJvb2wKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNVU1BFTkQgJiYgKFBQQ184NXh4IHx8IFBQQ184Nnh4KQorCWhlbHAKKwkgIEZyZWVzY2FsZSBNUEM4NXh4L01QQzg2eHggcG93ZXIgbWFuYWdlbWVudCBjb250cm9sbGVyIHN1cHBvcnQKKwkgIChzdXNwZW5kL3Jlc3VtZSkuIEZvciBNUEM4M3h4IHNlZSBwbGF0Zm9ybXMvODN4eC9zdXNwZW5kLmMKKwogY29uZmlnIDR4eF9TT0MKIAlib29sCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9jYW55b25sYW5kcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvY2FueW9ubGFuZHMuZHRzCmluZGV4IGM5MjAxNzAuLmNkNTZiYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9jYW55b25sYW5kcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2NhbnlvbmxhbmRzLmR0cwpAQCAtMzUyLDYgKzM1Miw3IEBACiAJCQkJbWF4LWZyYW1lLXNpemUgPSA8OTAwMD47CiAJCQkJcngtZmlmby1zaXplID0gPDQwOTY+OwogCQkJCXR4LWZpZm8tc2l6ZSA9IDwyMDQ4PjsKKwkJCQlyeC1maWZvLXNpemUtZ2lnZSA9IDwxNjM4ND47CiAJCQkJcGh5LW1vZGUgPSAicmdtaWkiOwogCQkJCXBoeS1tYXAgPSA8MHgwMDAwMDAwMD47CiAJCQkJcmdtaWktZGV2aWNlID0gPCZSR01JSTA+OwpAQCAtMzgxLDYgKzM4Miw3IEBACiAJCQkJbWF4LWZyYW1lLXNpemUgPSA8OTAwMD47CiAJCQkJcngtZmlmby1zaXplID0gPDQwOTY+OwogCQkJCXR4LWZpZm8tc2l6ZSA9IDwyMDQ4PjsKKwkJCQlyeC1maWZvLXNpemUtZ2lnZSA9IDwxNjM4ND47CiAJCQkJcGh5LW1vZGUgPSAicmdtaWkiOwogCQkJCXBoeS1tYXAgPSA8MHgwMDAwMDAwMD47CiAJCQkJcmdtaWktZGV2aWNlID0gPCZSR01JSTA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2VpZ2VyLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9laWdlci5kdHMKaW5kZXggYzRhOTM0Zi4uNDhiY2Y3MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2VpZ2VyLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZWlnZXIuZHRzCkBAIC0zMTYsNiArMzE2LDcgQEAKIAkJCQltYXgtZnJhbWUtc2l6ZSA9IDw5MDAwPjsKIAkJCQlyeC1maWZvLXNpemUgPSA8NDA5Nj47CiAJCQkJdHgtZmlmby1zaXplID0gPDIwNDg+OworCQkJCXJ4LWZpZm8tc2l6ZS1naWdlID0gPDE2Mzg0PjsKIAkJCQlwaHktbW9kZSA9ICJyZ21paSI7CiAJCQkJcGh5LW1hcCA9IDwweDAwMDAwMDAwPjsKIAkJCQlyZ21paS1kZXZpY2UgPSA8JlJHTUlJMD47CkBAIC0zNDUsNiArMzQ2LDcgQEAKIAkJCQltYXgtZnJhbWUtc2l6ZSA9IDw5MDAwPjsKIAkJCQlyeC1maWZvLXNpemUgPSA8NDA5Nj47CiAJCQkJdHgtZmlmby1zaXplID0gPDIwNDg+OworCQkJCXJ4LWZpZm8tc2l6ZS1naWdlID0gPDE2Mzg0PjsKIAkJCQlwaHktbW9kZSA9ICJyZ21paSI7CiAJCQkJcGh5LW1hcCA9IDwweDAwMDAwMDAwPjsKIAkJCQlyZ21paS1kZXZpY2UgPSA8JlJHTUlJMD47CkBAIC0zNzUsNiArMzc3LDggQEAKIAkJCQltYXgtZnJhbWUtc2l6ZSA9IDw5MDAwPjsKIAkJCQlyeC1maWZvLXNpemUgPSA8NDA5Nj47CiAJCQkJdHgtZmlmby1zaXplID0gPDIwNDg+OworCQkJCXJ4LWZpZm8tc2l6ZS1naWdlID0gPDE2Mzg0PjsKKwkJCQl0eC1maWZvLXNpemUtZ2lnZSA9IDwxNjM4ND47IC8qIGVtYWMyJjMgb25seSAqLwogCQkJCXBoeS1tb2RlID0gInJnbWlpIjsKIAkJCQlwaHktbWFwID0gPDB4MDAwMDAwMDA+OwogCQkJCXJnbWlpLWRldmljZSA9IDwmUkdNSUkxPjsKQEAgLTQwMyw2ICs0MDcsOCBAQAogCQkJCW1heC1mcmFtZS1zaXplID0gPDkwMDA+OwogCQkJCXJ4LWZpZm8tc2l6ZSA9IDw0MDk2PjsKIAkJCQl0eC1maWZvLXNpemUgPSA8MjA0OD47CisJCQkJcngtZmlmby1zaXplLWdpZ2UgPSA8MTYzODQ+OworCQkJCXR4LWZpZm8tc2l6ZS1naWdlID0gPDE2Mzg0PjsgLyogZW1hYzImMyBvbmx5ICovCiAJCQkJcGh5LW1vZGUgPSAicmdtaWkiOwogCQkJCXBoeS1tYXAgPSA8MHgwMDAwMDAwMD47CiAJCQkJcmdtaWktZGV2aWNlID0gPCZSR01JSTE+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2dlZl9wcGM5YS5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2VmX3BwYzlhLmR0cwppbmRleCA5MTA5NDRlLi5jODYxMTRlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2VmX3BwYzlhLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2VmX3BwYzlhLmR0cwpAQCAtMTE4LDYgKzExOCwxMiBAQAogCQkJfTsKIAkJfTsKIAorCQludnJhbUAzLDAgeworCQkJZGV2aWNlX3R5cGUgPSAibnZyYW0iOworCQkJY29tcGF0aWJsZSA9ICJzaW10ZWssc3RrMTRjYTgiOworCQkJcmVnID0gPDB4MyAweDAgMHgyMDAwMD47CisJCX07CisKIAkJZnBnYUA0LDAgewogCQkJY29tcGF0aWJsZSA9ICJnZWYscHBjOWEtZnBnYS1yZWdzIjsKIAkJCXJlZyA9IDwweDQgMHgwIDB4NDA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2dlZl9zYmMzMTAuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2dlZl9zYmMzMTAuZHRzCmluZGV4IDIxMDdkM2MuLjgyMGMyYjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9nZWZfc2JjMzEwLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2VmX3NiYzMxMC5kdHMKQEAgLTExNSw2ICsxMTUsMTIgQEAKIAkJCX07CiAJCX07CiAKKwkJbnZyYW1AMywwIHsKKwkJCWRldmljZV90eXBlID0gIm52cmFtIjsKKwkJCWNvbXBhdGlibGUgPSAic2ltdGVrLHN0azE0Y2E4IjsKKwkJCXJlZyA9IDwweDMgMHgwIDB4MjAwMDA+OworCQl9OworCiAJCWZwZ2FANCwwIHsKIAkJCWNvbXBhdGlibGUgPSAiZ2VmLGZwZ2EtcmVncyI7CiAJCQlyZWcgPSA8MHg0IDB4MCAweDQwPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9nZWZfc2JjNjEwLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9nZWZfc2JjNjEwLmR0cwppbmRleCAzNWE2MzE4Li4zMDkxMWFkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2VmX3NiYzYxMC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2dlZl9zYmM2MTAuZHRzCkBAIC04NCw2ICs4NCwxMiBAQAogCQkJICA2IDAgMHhmZDAwMDAwMCAweDAwODAwMDAwICAgICAvLyBJTyBGUEdBICg4LWJpdCkKIAkJCSAgNyAwIDB4ZmQ4MDAwMDAgMHgwMDgwMDAwMD47ICAgLy8gSU8gRlBHQSAoMzItYml0KQogCisJCW52cmFtQDMsMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJudnJhbSI7CisJCQljb21wYXRpYmxlID0gInNpbXRlayxzdGsxNGNhOCI7CisJCQlyZWcgPSA8MHgzIDB4MCAweDIwMDAwPjsKKwkJfTsKKwogCQlmcGdhQDQsMCB7CiAJCQljb21wYXRpYmxlID0gImdlZixmcGdhLXJlZ3MiOwogCQkJcmVnID0gPDB4NCAweDAgMHg0MD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2xhY2llci5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2xhY2llci5kdHMKaW5kZXggZjM3ODdhMi4uZjZmNjE4OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2dsYWNpZXIuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9nbGFjaWVyLmR0cwpAQCAtMjkyLDYgKzI5Miw3IEBACiAJCQkJbWF4LWZyYW1lLXNpemUgPSA8OTAwMD47CiAJCQkJcngtZmlmby1zaXplID0gPDQwOTY+OwogCQkJCXR4LWZpZm8tc2l6ZSA9IDwyMDQ4PjsKKwkJCQlyeC1maWZvLXNpemUtZ2lnZSA9IDwxNjM4ND47CiAJCQkJcGh5LW1vZGUgPSAicmdtaWkiOwogCQkJCXBoeS1tYXAgPSA8MHgwMDAwMDAwMD47CiAJCQkJcmdtaWktZGV2aWNlID0gPCZSR01JSTA+OwpAQCAtMzIxLDYgKzMyMiw3IEBACiAJCQkJbWF4LWZyYW1lLXNpemUgPSA8OTAwMD47CiAJCQkJcngtZmlmby1zaXplID0gPDQwOTY+OwogCQkJCXR4LWZpZm8tc2l6ZSA9IDwyMDQ4PjsKKwkJCQlyeC1maWZvLXNpemUtZ2lnZSA9IDwxNjM4ND47CiAJCQkJcGh5LW1vZGUgPSAicmdtaWkiOwogCQkJCXBoeS1tYXAgPSA8MHgwMDAwMDAwMD47CiAJCQkJcmdtaWktZGV2aWNlID0gPCZSR01JSTA+OwpAQCAtMzUxLDYgKzM1Myw4IEBACiAJCQkJbWF4LWZyYW1lLXNpemUgPSA8OTAwMD47CiAJCQkJcngtZmlmby1zaXplID0gPDQwOTY+OwogCQkJCXR4LWZpZm8tc2l6ZSA9IDwyMDQ4PjsKKwkJCQlyeC1maWZvLXNpemUtZ2lnZSA9IDwxNjM4ND47CisJCQkJdHgtZmlmby1zaXplLWdpZ2UgPSA8MTYzODQ+OyAvKiBlbWFjMiYzIG9ubHkgKi8KIAkJCQlwaHktbW9kZSA9ICJyZ21paSI7CiAJCQkJcGh5LW1hcCA9IDwweDAwMDAwMDAwPjsKIAkJCQlyZ21paS1kZXZpY2UgPSA8JlJHTUlJMT47CkBAIC0zNzksNiArMzgzLDggQEAKIAkJCQltYXgtZnJhbWUtc2l6ZSA9IDw5MDAwPjsKIAkJCQlyeC1maWZvLXNpemUgPSA8NDA5Nj47CiAJCQkJdHgtZmlmby1zaXplID0gPDIwNDg+OworCQkJCXJ4LWZpZm8tc2l6ZS1naWdlID0gPDE2Mzg0PjsKKwkJCQl0eC1maWZvLXNpemUtZ2lnZSA9IDwxNjM4ND47IC8qIGVtYWMyJjMgb25seSAqLwogCQkJCXBoeS1tb2RlID0gInJnbWlpIjsKIAkJCQlwaHktbWFwID0gPDB4MDAwMDAwMDA+OwogCQkJCXJnbWlpLWRldmljZSA9IDwmUkdNSUkxPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9oYWxlYWthbGEuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2hhbGVha2FsYS5kdHMKaW5kZXggNWIyYTQ5NC4uMmIyNTY2OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2hhbGVha2FsYS5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2hhbGVha2FsYS5kdHMKQEAgLTIyNiw2ICsyMjYsOCBAQAogCQkJCW1heC1mcmFtZS1zaXplID0gPDkwMDA+OwogCQkJCXJ4LWZpZm8tc2l6ZSA9IDw0MDk2PjsKIAkJCQl0eC1maWZvLXNpemUgPSA8MjA0OD47CisJCQkJcngtZmlmby1zaXplLWdpZ2UgPSA8MTYzODQ+OworCQkJCXR4LWZpZm8tc2l6ZS1naWdlID0gPDE2Mzg0PjsKIAkJCQlwaHktbW9kZSA9ICJyZ21paSI7CiAJCQkJcGh5LW1hcCA9IDwweDAwMDAwMDAwPjsKIAkJCQlyZ21paS1kZXZpY2UgPSA8JlJHTUlJMD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMva2F0bWFpLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9rYXRtYWkuZHRzCmluZGV4IDA3NzgxOWIuLjUxZWI2ZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9rYXRtYWkuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9rYXRtYWkuZHRzCkBAIC0xNiw3ICsxNiw3IEBACiAKIC8gewogCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCSNzaXplLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDI+OwogCW1vZGVsID0gImFtY2Msa2F0bWFpIjsKIAljb21wYXRpYmxlID0gImFtY2Msa2F0bWFpIjsKIAlkY3ItcGFyZW50ID0gPCZ7L2NwdXMvY3B1QDB9PjsKQEAgLTQ5LDcgKzQ5LDcgQEAKIAogCW1lbW9yeSB7CiAJCWRldmljZV90eXBlID0gIm1lbW9yeSI7Ci0JCXJlZyA9IDwweDAwMDAwMDAwIDB4MDAwMDAwMDAgMHgwMDAwMDAwMD47IC8qIEZpbGxlZCBpbiBieSB6SW1hZ2UgKi8KKwkJcmVnID0gPDB4MCAweDAwMDAwMDAwIDB4MCAweDAwMDAwMDAwPjsgLyogRmlsbGVkIGluIGJ5IFUtQm9vdCAqLwogCX07CiAKIAlVSUMwOiBpbnRlcnJ1cHQtY29udHJvbGxlcjAgewpAQCAtMTEyLDcgKzExMiwxNSBAQAogCQljb21wYXRpYmxlID0gImlibSxwbGItNDQwc3BlIiwgImlibSxwbGItNDQwZ3AiLCAiaWJtLHBsYjQiOwogCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKIAkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCXJhbmdlczsKKwkJLyogICAgICAgIGFkZHItY2hpbGQgICAgIGFkZHItcGFyZW50ICAgIHNpemUgKi8KKwkJcmFuZ2VzID0gPDB4NCAweGUwMDAwMDAwIDB4NCAweGUwMDAwMDAwIDB4MjAwMDAwMDAKKwkJCSAgMHhjIDB4MDAwMDAwMDAgMHhjIDB4MDAwMDAwMDAgMHgyMDAwMDAwMAorCQkJICAweGQgMHgwMDAwMDAwMCAweGQgMHgwMDAwMDAwMCAweDgwMDAwMDAwCisJCQkgIDB4ZCAweDgwMDAwMDAwIDB4ZCAweDgwMDAwMDAwIDB4ODAwMDAwMDAKKwkJCSAgMHhlIDB4MDAwMDAwMDAgMHhlIDB4MDAwMDAwMDAgMHg4MDAwMDAwMAorCQkJICAweGUgMHg4MDAwMDAwMCAweGUgMHg4MDAwMDAwMCAweDgwMDAwMDAwCisJCQkgIDB4ZiAweDAwMDAwMDAwIDB4ZiAweDAwMDAwMDAwIDB4ODAwMDAwMDAKKwkJCSAgMHhmIDB4ODAwMDAwMDAgMHhmIDB4ODAwMDAwMDAgMHg4MDAwMDAwMD47CiAJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgLyogRmlsbGVkIGluIGJ5IHpJbWFnZSAqLwogCiAJCVNEUkFNMDogc2RyYW0gewpAQCAtMjQ1LDggKzI1Myw4IEBACiAJCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAweDAwMDAwMDAwIDB4ODAwMDAwMDAgMHgwMDAwMDAwZCAweDgwMDAwMDAwIDB4MDAwMDAwMDAgMHg4MDAwMDAwMAogCQkJCSAgMHgwMTAwMDAwMCAweDAwMDAwMDAwIDB4MDAwMDAwMDAgMHgwMDAwMDAwYyAweDA4MDAwMDAwIDB4MDAwMDAwMDAgMHgwMDAxMDAwMD47CiAKLQkJCS8qIEluYm91bmQgMkdCIHJhbmdlIHN0YXJ0aW5nIGF0IDAgKi8KLQkJCWRtYS1yYW5nZXMgPSA8MHg0MjAwMDAwMCAweDAgMHgwIDB4MCAweDAgMHgwIDB4ODAwMDAwMDA+OworCQkJLyogSW5ib3VuZCA0R0IgcmFuZ2Ugc3RhcnRpbmcgYXQgMCAqLworCQkJZG1hLXJhbmdlcyA9IDwweDQyMDAwMDAwIDB4MCAweDAgMHgwIDB4MCAweDEgMHgwMDAwMDAwMD47CiAKIAkJCS8qIFRoaXMgZHJpdmVzIGJ1c3NlcyAwIHRvIDB4ZiAqLwogCQkJYnVzLXJhbmdlID0gPDB4MCAweGY+OwpAQCAtMjg5LDEwICsyOTcsMTAgQEAKIAkJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDB4MDAwMDAwMDAgMHg4MDAwMDAwMCAweDAwMDAwMDBlIDB4MDAwMDAwMDAgMHgwMDAwMDAwMCAweDgwMDAwMDAwCiAJCQkJICAweDAxMDAwMDAwIDB4MDAwMDAwMDAgMHgwMDAwMDAwMCAweDAwMDAwMDBmIDB4ODAwMDAwMDAgMHgwMDAwMDAwMCAweDAwMDEwMDAwPjsKIAotCQkJLyogSW5ib3VuZCAyR0IgcmFuZ2Ugc3RhcnRpbmcgYXQgMCAqLwotCQkJZG1hLXJhbmdlcyA9IDwweDQyMDAwMDAwIDB4MCAweDAgMHgwIDB4MCAweDAgMHg4MDAwMDAwMD47CisJCQkvKiBJbmJvdW5kIDRHQiByYW5nZSBzdGFydGluZyBhdCAwICovCisJCQlkbWEtcmFuZ2VzID0gPDB4NDIwMDAwMDAgMHgwIDB4MCAweDAgMHgwIDB4MSAweDAwMDAwMDAwPjsKIAotCQkJLyogVGhpcyBkcml2ZXMgYnVzc2VzIDEwIHRvIDB4MWYgKi8KKwkJCS8qIFRoaXMgZHJpdmVzIGJ1c3NlcyAweDEwIHRvIDB4MWYgKi8KIAkJCWJ1cy1yYW5nZSA9IDwweDEwIDB4MWY+OwogCiAJCQkvKiBMZWdhY3kgaW50ZXJydXB0cyAobm90ZSB0aGUgd2VpcmQgcG9sYXJpdHksIHRoZSBicmlkZ2Ugc2VlbXMKQEAgLTMzMCwxMCArMzM4LDEwIEBACiAJCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAweDAwMDAwMDAwIDB4ODAwMDAwMDAgMHgwMDAwMDAwZSAweDgwMDAwMDAwIDB4MDAwMDAwMDAgMHg4MDAwMDAwMAogCQkJCSAgMHgwMTAwMDAwMCAweDAwMDAwMDAwIDB4MDAwMDAwMDAgMHgwMDAwMDAwZiAweDgwMDEwMDAwIDB4MDAwMDAwMDAgMHgwMDAxMDAwMD47CiAKLQkJCS8qIEluYm91bmQgMkdCIHJhbmdlIHN0YXJ0aW5nIGF0IDAgKi8KLQkJCWRtYS1yYW5nZXMgPSA8MHg0MjAwMDAwMCAweDAgMHgwIDB4MCAweDAgMHgwIDB4ODAwMDAwMDA+OworCQkJLyogSW5ib3VuZCA0R0IgcmFuZ2Ugc3RhcnRpbmcgYXQgMCAqLworCQkJZG1hLXJhbmdlcyA9IDwweDQyMDAwMDAwIDB4MCAweDAgMHgwIDB4MCAweDEgMHgwMDAwMDAwMD47CiAKLQkJCS8qIFRoaXMgZHJpdmVzIGJ1c3NlcyAxMCB0byAweDFmICovCisJCQkvKiBUaGlzIGRyaXZlcyBidXNzZXMgMHgyMCB0byAweDJmICovCiAJCQlidXMtcmFuZ2UgPSA8MHgyMCAweDJmPjsKIAogCQkJLyogTGVnYWN5IGludGVycnVwdHMgKG5vdGUgdGhlIHdlaXJkIHBvbGFyaXR5LCB0aGUgYnJpZGdlIHNlZW1zCkBAIC0zNzEsMTAgKzM3OSwxMCBAQAogCQkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMHgwMDAwMDAwMCAweDgwMDAwMDAwIDB4MDAwMDAwMGYgMHgwMDAwMDAwMCAweDAwMDAwMDAwIDB4ODAwMDAwMDAKIAkJCQkgIDB4MDEwMDAwMDAgMHgwMDAwMDAwMCAweDAwMDAwMDAwIDB4MDAwMDAwMGYgMHg4MDAyMDAwMCAweDAwMDAwMDAwIDB4MDAwMTAwMDA+OwogCi0JCQkvKiBJbmJvdW5kIDJHQiByYW5nZSBzdGFydGluZyBhdCAwICovCi0JCQlkbWEtcmFuZ2VzID0gPDB4NDIwMDAwMDAgMHgwIDB4MCAweDAgMHgwIDB4MCAweDgwMDAwMDAwPjsKKwkJCS8qIEluYm91bmQgNEdCIHJhbmdlIHN0YXJ0aW5nIGF0IDAgKi8KKwkJCWRtYS1yYW5nZXMgPSA8MHg0MjAwMDAwMCAweDAgMHgwIDB4MCAweDAgMHgxIDB4MDAwMDAwMDA+OwogCi0JCQkvKiBUaGlzIGRyaXZlcyBidXNzZXMgMTAgdG8gMHgxZiAqLworCQkJLyogVGhpcyBkcml2ZXMgYnVzc2VzIDB4MzAgdG8gMHgzZiAqLwogCQkJYnVzLXJhbmdlID0gPDB4MzAgMHgzZj47CiAKIAkJCS8qIExlZ2FjeSBpbnRlcnJ1cHRzIChub3RlIHRoZSB3ZWlyZCBwb2xhcml0eSwgdGhlIGJyaWRnZSBzZWVtcwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2tpbGF1ZWEuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2tpbGF1ZWEuZHRzCmluZGV4IGM0NjU2MTQuLjA4M2U2OGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9raWxhdWVhLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMva2lsYXVlYS5kdHMKQEAgLTI3Miw2ICsyNzIsOCBAQAogCQkJCW1heC1mcmFtZS1zaXplID0gPDkwMDA+OwogCQkJCXJ4LWZpZm8tc2l6ZSA9IDw0MDk2PjsKIAkJCQl0eC1maWZvLXNpemUgPSA8MjA0OD47CisJCQkJcngtZmlmby1zaXplLWdpZ2UgPSA8MTYzODQ+OworCQkJCXR4LWZpZm8tc2l6ZS1naWdlID0gPDE2Mzg0PjsKIAkJCQlwaHktbW9kZSA9ICJyZ21paSI7CiAJCQkJcGh5LW1hcCA9IDwweDAwMDAwMDAwPjsKIAkJCQlyZ21paS1kZXZpY2UgPSA8JlJHTUlJMD47CkBAIC0zMDAsNiArMzAyLDggQEAKIAkJCQltYXgtZnJhbWUtc2l6ZSA9IDw5MDAwPjsKIAkJCQlyeC1maWZvLXNpemUgPSA8NDA5Nj47CiAJCQkJdHgtZmlmby1zaXplID0gPDIwNDg+OworCQkJCXJ4LWZpZm8tc2l6ZS1naWdlID0gPDE2Mzg0PjsKKwkJCQl0eC1maWZvLXNpemUtZ2lnZSA9IDwxNjM4ND47CiAJCQkJcGh5LW1vZGUgPSAicmdtaWkiOwogCQkJCXBoeS1tYXAgPSA8MHgwMDAwMDAwMD47CiAJCQkJcmdtaWktZGV2aWNlID0gPCZSR01JSTA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ttZXRlcjEuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ttZXRlcjEuZHRzCmluZGV4IDE2NzA0NGYuLjY1YjhiNGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9rbWV0ZXIxLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMva21ldGVyMS5kdHMKQEAgLTU5LDYgKzU5LDEzIEBACiAJCXJlZyA9IDwweGUwMDAwMDAwIDB4MDAwMDAyMDA+OwogCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCiAKKwkJcG1jOiBwb3dlckBiMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM2MC1wbWMiLCAiZnNsLG1wYzgzNDktcG1jIjsKKwkJCXJlZyA9IDwweGIwMCAweDEwMCAweGEwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDgwIDB4OD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpcGljPjsKKwkJfTsKKwogCQlpMmNAMzAwMCB7CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21ha2FsdS5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbWFrYWx1LmR0cwppbmRleCBmZmMyNDZlLi42M2Q0OGI2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbWFrYWx1LmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbWFrYWx1LmR0cwpAQCAtMjI3LDYgKzIyNyw4IEBACiAJCQkJbWF4LWZyYW1lLXNpemUgPSA8OTAwMD47CiAJCQkJcngtZmlmby1zaXplID0gPDQwOTY+OwogCQkJCXR4LWZpZm8tc2l6ZSA9IDwyMDQ4PjsKKwkJCQlyeC1maWZvLXNpemUtZ2lnZSA9IDwxNjM4ND47CisJCQkJdHgtZmlmby1zaXplLWdpZ2UgPSA8MTYzODQ+OwogCQkJCXBoeS1tb2RlID0gInJnbWlpIjsKIAkJCQlwaHktbWFwID0gPDB4MDAwMDAwM2Y+OwkvKiBTdGFydCBhdCA2ICovCiAJCQkJcmdtaWktZGV2aWNlID0gPCZSR01JSTA+OwpAQCAtMjU1LDYgKzI1Nyw4IEBACiAJCQkJbWF4LWZyYW1lLXNpemUgPSA8OTAwMD47CiAJCQkJcngtZmlmby1zaXplID0gPDQwOTY+OwogCQkJCXR4LWZpZm8tc2l6ZSA9IDwyMDQ4PjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcngtZmlmby1zaXplLWdpZ2UgPSA8MTYzODQ+OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eC1maWZvLXNpemUtZ2lnZSA9IDwxNjM4ND47CiAJCQkJcGh5LW1vZGUgPSAicmdtaWkiOwogCQkJCXBoeS1tYXAgPSA8MHgwMDAwMDAwMD47CiAJCQkJcmdtaWktZGV2aWNlID0gPCZSR01JSTA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfbWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzJ4X21kcy5kdHMKaW5kZXggNDM2YzljNi4uMDVhZDhjOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfbWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMyeF9tZHMuZHRzCkBAIC03OSw2ICs3OSwxMyBAQAogCQkJcmVnID0gPDB4MjAwIDB4MTAwPjsKIAkJfTsKIAorCQlwbWM6IHBvd2VyQGIwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzIzLXBtYyIsICJmc2wsbXBjODM0OS1wbWMiOworCQkJcmVnID0gPDB4YjAwIDB4MTAwIDB4YTAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8ODAgMHg4PjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OworCQl9OworCiAJCWkyY0AzMDAwIHsKIAkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkJI3NpemUtY2VsbHMgPSA8MD47CkBAIC0xNjMsNiArMTcwLDcgQEAKIAkJCWZzbCxjaGFubmVsLWZpZm8tbGVuID0gPDI0PjsKIAkJCWZzbCxleGVjLXVuaXRzLW1hc2sgPSA8MHg0Yz47CiAJCQlmc2wsZGVzY3JpcHRvci10eXBlcy1tYXNrID0gPDB4MDEyMjAwM2Y+OworCQkJc2xlZXAgPSA8JnBtYyAweDAzMDAwMDAwPjsKIAkJfTsKIAogCQlpcGljOiBwaWNANzAwIHsKQEAgLTQyOCw1ICs0MzYsNiBAQAogCQkgICAgICAgMHhlMDAwODMwMCAweDg+OwkJLyogY29uZmlnIHNwYWNlIGFjY2VzcyByZWdpc3RlcnMgKi8KIAkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM0OS1wY2kiOwogCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQlzbGVlcCA9IDwmcG1jIDB4MDAwMTAwMDA+OwogCX07CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfcmRiLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzJ4X3JkYi5kdHMKaW5kZXggOWEwOTUyZi4uZjRmYWRiMjNhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMyeF9yZGIuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzJ4X3JkYi5kdHMKQEAgLTYyLDYgKzYyLDEzIEBACiAJCQlyZWcgPSA8MHgyMDAgMHgxMDA+OwogCQl9OwogCisJCXBtYzogcG93ZXJAYjAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzMjMtcG1jIiwgImZzbCxtcGM4MzQ5LXBtYyI7CisJCQlyZWcgPSA8MHhiMDAgMHgxMDAgMHhhMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDw4MCAweDg+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CisJCX07CisKIAkJaTJjQDMwMDAgewogCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCQkjc2l6ZS1jZWxscyA9IDwwPjsKQEAgLTE0MSw2ICsxNDgsNyBAQAogCQkJZnNsLGNoYW5uZWwtZmlmby1sZW4gPSA8MjQ+OwogCQkJZnNsLGV4ZWMtdW5pdHMtbWFzayA9IDwweDRjPjsKIAkJCWZzbCxkZXNjcmlwdG9yLXR5cGVzLW1hc2sgPSA8MHgwMTIyMDAzZj47CisJCQlzbGVlcCA9IDwmcG1jIDB4MDMwMDAwMDA+OwogCQl9OwogCiAJCWlwaWM6cGljQDcwMCB7CkBAIC0zNjAsNSArMzY4LDYgQEAKIAkJICAgICAgIDB4ZTAwMDgzMDAgMHg4PjsJCS8qIGNvbmZpZyBzcGFjZSBhY2Nlc3MgcmVnaXN0ZXJzICovCiAJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNDktcGNpIjsKIAkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJc2xlZXAgPSA8JnBtYyAweDAwMDEwMDAwPjsKIAl9OwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X21kcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9tZHMuZHRzCmluZGV4IDM5ZmY0YzguLjQ1Y2ZhMWM1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9tZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X21kcy5kdHMKQEAgLTk5LDYgKzk5LDEzIEBACiAJCQlyZWcgPSA8MHgyMDAgMHgxMDA+OwogCQl9OwogCisJCXBtYzogcG93ZXJAYjAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNjAtcG1jIiwgImZzbCxtcGM4MzQ5LXBtYyI7CisJCQlyZWcgPSA8MHhiMDAgMHgxMDAgMHhhMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDw4MCAweDg+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CisJCX07CisKIAkJaTJjQDMwMDAgewogCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCQkjc2l6ZS1jZWxscyA9IDwwPjsKQEAgLTE5NCw2ICsyMDEsNyBAQAogCQkJZnNsLGNoYW5uZWwtZmlmby1sZW4gPSA8MjQ+OwogCQkJZnNsLGV4ZWMtdW5pdHMtbWFzayA9IDwweDdlPjsKIAkJCWZzbCxkZXNjcmlwdG9yLXR5cGVzLW1hc2sgPSA8MHgwMTAxMGViZj47CisJCQlzbGVlcCA9IDwmcG1jIDB4MDMwMDAwMDA+OwogCQl9OwogCiAJCWlwaWM6IHBpY0A3MDAgewpAQCAtNDcwLDUgKzQ3OCw2IEBACiAJCSAgICAgICAweGUwMDA4MzAwIDB4OD47CQkvKiBjb25maWcgc3BhY2UgYWNjZXNzIHJlZ2lzdGVycyAqLwogCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzQ5LXBjaSI7CiAJCWRldmljZV90eXBlID0gInBjaSI7CisJCXNsZWVwID0gPCZwbWMgMHgwMDAxMDAwMD47CiAJfTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9yZGsuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNnhfcmRrLmR0cwppbmRleCA2MzE1ZDZmLi5iZGY0NDU5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9yZGsuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X3Jkay5kdHMKQEAgLTcxLDYgKzcxLDEzIEBACiAJCQlyZWcgPSA8MHgyMDAgMHgxMDA+OwogCQl9OwogCisJCXBtYzogcG93ZXJAYjAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNjAtcG1jIiwgImZzbCxtcGM4MzQ5LXBtYyI7CisJCQlyZWcgPSA8MHhiMDAgMHgxMDAgMHhhMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDw4MCAweDg+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CisJCX07CisKIAkJaTJjQDMwMDAgewogCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCQkjc2l6ZS1jZWxscyA9IDwwPjsKQEAgLTE2MSw2ICsxNjgsNyBAQAogCQkJZnNsLGNoYW5uZWwtZmlmby1sZW4gPSA8MjQ+OwogCQkJZnNsLGV4ZWMtdW5pdHMtbWFzayA9IDwweDdlPjsKIAkJCWZzbCxkZXNjcmlwdG9yLXR5cGVzLW1hc2sgPSA8MHgwMTAxMGViZj47CisJCQlzbGVlcCA9IDwmcG1jIDB4MDMwMDAwMDA+OwogCQl9OwogCiAJCWlwaWM6IGludGVycnVwdC1jb250cm9sbGVyQDcwMCB7CkBAIC00NTUsNiArNDYzLDcgQEAKIAkJCQkgMHhhODAwIDAgMCAyICZpcGljIDIwIDgKIAkJCQkgMHhhODAwIDAgMCAzICZpcGljIDIxIDgKIAkJCQkgMHhhODAwIDAgMCA0ICZpcGljIDE4IDg+OworCQlzbGVlcCA9IDwmcG1jIDB4MDAwMTAwMDA+OwogCQkvKiBmaWxsZWQgYnkgdS1ib290ICovCiAJCWJ1cy1yYW5nZSA9IDwwIDA+OwogCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2OG1kcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2OG1kcy5kdHMKaW5kZXggMDBjMmJiZC4uNmQ4OTJiYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjhtZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTY4bWRzLmR0cwpAQCAtNDAsNiArNDAsOCBAQAogCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwkvLyAzMiBieXRlcwogCQkJZC1jYWNoZS1zaXplID0gPDB4ODAwMD47CQkvLyBMMSwgMzJLCiAJCQlpLWNhY2hlLXNpemUgPSA8MHg4MDAwPjsJCS8vIEwxLCAzMksKKwkJCXNsZWVwID0gPCZwbWMgMHgwMDAwODAwMAkvLyBjb3JlCisJCQkJICZwbWMgMHgwMDAwNDAwMD47CS8vIHRpbWViYXNlCiAJCQl0aW1lYmFzZS1mcmVxdWVuY3kgPSA8MD47CiAJCQlidXMtZnJlcXVlbmN5ID0gPDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwpAQCAtOTQsMzEgKzk2LDQxIEBACiAJCQlpbnRlcnJ1cHRzID0gPDE2IDI+OwogCQl9OwogCi0JCWkyY0AzMDAwIHsKKwkJaTJjLXNsZWVwLW5leHVzIHsKIAkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDMwMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDw0MyAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJZGZzcnI7CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisJCQlzbGVlcCA9IDwmcG1jIDB4MDAwMDAwMDQ+OworCQkJcmFuZ2VzOwogCi0JCQlydGNANjggewotCQkJCWNvbXBhdGlibGUgPSAiZGFsbGFzLGRzMTM3NCI7Ci0JCQkJcmVnID0gPDB4Njg+OworCQkJaTJjQDMwMDAgeworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCWNlbGwtaW5kZXggPSA8MD47CisJCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKKwkJCQlyZWcgPSA8MHgzMDAwIDB4MTAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDQzIDI+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCWRmc3JyOworCisJCQkJcnRjQDY4IHsKKwkJCQkJY29tcGF0aWJsZSA9ICJkYWxsYXMsZHMxMzc0IjsKKwkJCQkJcmVnID0gPDB4Njg+OworCQkJCQlpbnRlcnJ1cHRzID0gPDMgMT47CisJCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCX07CiAJCQl9OwotCQl9OwogCi0JCWkyY0AzMTAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDMxMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDw0MyAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJZGZzcnI7CisJCQlpMmNAMzEwMCB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOworCQkJCXJlZyA9IDwweDMxMDAgMHgxMDA+OworCQkJCWludGVycnVwdHMgPSA8NDMgMj47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQkJZGZzcnI7CisJCQl9OwogCQl9OwogCiAJCWRtYUAyMTMwMCB7CkBAIC0xMjgsNiArMTQwLDggQEAKIAkJCXJlZyA9IDwweDIxMzAwIDB4ND47CiAJCQlyYW5nZXMgPSA8MHgwIDB4MjExMDAgMHgyMDA+OwogCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCXNsZWVwID0gPCZwbWMgMHgwMDAwMDQwMD47CisKIAkJCWRtYS1jaGFubmVsQDAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjgtZG1hLWNoYW5uZWwiLAogCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKQEAgLTE3Niw2ICsxOTAsNyBAQAogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQl0YmktaGFuZGxlID0gPCZ0YmkwPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTI+OworCQkJc2xlZXAgPSA8JnBtYyAweDAwMDAwMDgwPjsKIAogCQkJbWRpb0A1MjAgewogCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwpAQCAtMjI4LDYgKzI0Myw3IEBACiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXRiaS1oYW5kbGUgPSA8JnRiaTE+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5Mz47CisJCQlzbGVlcCA9IDwmcG1jIDB4MDAwMDAwNDA+OwogCiAJCQltZGlvQDUyMCB7CiAJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CkBAIC0yNDIsMzAgKzI1OCw0NyBAQAogCQkJfTsKIAkJfTsKIAotCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHg0NTAwIDB4MTAwPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8NDIgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJZHVhcnQtc2xlZXAtbmV4dXMgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisJCQlzbGVlcCA9IDwmcG1jIDB4MDAwMDAwMDI+OworCQkJcmFuZ2VzOworCisJCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7CisJCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQkJcmVnID0gPDB4NDUwMCAweDEwMD47CisJCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQkJCWludGVycnVwdHMgPSA8NDIgMj47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQl9OworCisJCQlzZXJpYWwxOiBzZXJpYWxANDYwMCB7CisJCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQkJcmVnID0gPDB4NDYwMCAweDEwMD47CisJCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQkJCWludGVycnVwdHMgPSA8NDIgMj47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQl9OwogCQl9OwogCi0JCWdsb2JhbC11dGlsaXRpZXNAZTAwMDAgewkvL2dsb2JhbCB1dGlsaXRpZXMgYmxvY2sKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtZ3V0cyI7CisJCWdsb2JhbC11dGlsaXRpZXNAZTAwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjgtZ3V0cyIsICJmc2wsbXBjODU0OC1ndXRzIjsKIAkJCXJlZyA9IDwweGUwMDAwIDB4MTAwMD47CisJCQlyYW5nZXMgPSA8MCAweGUwMDAwIDB4MTAwMD47CiAJCQlmc2wsaGFzLXJzdGNyOwotCQl9OwogCi0JCXNlcmlhbDE6IHNlcmlhbEA0NjAwIHsKLQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKLQkJCXJlZyA9IDwweDQ2MDAgMHgxMDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDw0MiAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJcG1jOiBwb3dlckA3MCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2OC1wbWMiLAorCQkJCQkgICAgICJmc2wsbXBjODU0OC1wbWMiOworCQkJCXJlZyA9IDwweDcwIDB4MjA+OworCQkJfTsKIAkJfTsKIAogCQljcnlwdG9AMzAwMDAgewpAQCAtMjc3LDYgKzMxMCw3IEBACiAJCQlmc2wsY2hhbm5lbC1maWZvLWxlbiA9IDwyND47CiAJCQlmc2wsZXhlYy11bml0cy1tYXNrID0gPDB4ZmU+OwogCQkJZnNsLGRlc2NyaXB0b3ItdHlwZXMtbWFzayA9IDwweDEyYjBlYmY+OworCQkJc2xlZXAgPSA8JnBtYyAweDAxMDAwMDAwPjsKIAkJfTsKIAogCQltcGljOiBwaWNANDAwMDAgewpAQCAtMzc2LDYgKzQxMCw3IEBACiAJCWNvbXBhdGlibGUgPSAiZnNsLHFlIjsKIAkJcmFuZ2VzID0gPDB4MCAweGUwMDgwMDAwIDB4NDAwMDA+OwogCQlyZWcgPSA8MHhlMDA4MDAwMCAweDQ4MD47CisJCXNsZWVwID0gPCZwbWMgMHgwMDAwMDgwMD47CiAJCWJyZy1mcmVxdWVuY3kgPSA8MD47CiAJCWJ1cy1mcmVxdWVuY3kgPSA8Mzk2MDAwMDAwPjsKIAkJZnNsLHFlLW51bS1yaXNjcyA9IDwyPjsKQEAgLTUwOSw2ICs1NDQsNyBAQAogCQlidXMtcmFuZ2UgPSA8MCAyNTU+OwogCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwIDB4ODAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKIAkJCSAgMHgxMDAwMDAwIDB4MCAweDAgMHhlMjAwMDAwMCAweDAgMHg4MDAwMDA+OworCQlzbGVlcCA9IDwmcG1jIDB4ODAwMDAwMDA+OwogCQljbG9jay1mcmVxdWVuY3kgPSA8NjY2NjY2NjY+OwogCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwyPjsKQEAgLTUzNCw2ICs1NzAsNyBAQAogCQlidXMtcmFuZ2UgPSA8MCAyNTU+OwogCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGEwMDAwMDAwIDB4YTAwMDAwMDAgMHgwIDB4MTAwMDAwMDAKIAkJCSAgMHgxMDAwMDAwIDB4MCAweDAgMHhlMjgwMDAwMCAweDAgMHg4MDAwMDA+OworCQlzbGVlcCA9IDwmcG1jIDB4MjAwMDAwMDA+OwogCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwogCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwyPjsKQEAgLTU3MCw1ICs2MDcsNyBAQAogCQkJICAgICAgNTUgMiAvKiBtc2cyX3R4ICAgKi8KIAkJCSAgICAgIDU2IDIgLyogbXNnMl9yeCAgICovPjsKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCXNsZWVwID0gPCZwbWMgMHgwMDA4MDAwMCAgIC8qIGNvbnRyb2xsZXIgKi8KKwkJCSAmcG1jIDB4MDAwNDAwMDA+OyAvKiBtZXNzYWdlIHVuaXQgKi8KIAl9OwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTY5bWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTY5bWRzLmR0cwppbmRleCAxZTNlYzhmLi43OTVlYjM2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2OW1kcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjltZHMuZHRzCkBAIC00MSw2ICs0MSw4IEBACiAJCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CS8vIDMyIGJ5dGVzCiAJCQlkLWNhY2hlLXNpemUgPSA8MHg4MDAwPjsJCS8vIEwxLCAzMksKIAkJCWktY2FjaGUtc2l6ZSA9IDwweDgwMDA+OwkJLy8gTDEsIDMySworCQkJc2xlZXAgPSA8JnBtYyAweDAwMDA4MDAwCS8vIGNvcmUKKwkJCQkgJnBtYyAweDAwMDA0MDAwPjsJLy8gdGltZWJhc2UKIAkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwwPjsKIAkJCWJ1cy1mcmVxdWVuY3kgPSA8MD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CkBAIC01OSw2ICs2MSw3IEBACiAJCXJlZyA9IDwweGUwMDA1MDAwIDB4MTAwMD47CiAJCWludGVycnVwdHMgPSA8MTkgMj47CiAJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQlzbGVlcCA9IDwmcG1jIDB4MDgwMDAwMDA+OwogCiAJCXJhbmdlcyA9IDwweDAgMHgwIDB4ZmUwMDAwMDAgMHgwMjAwMDAwMAogCQkJICAweDEgMHgwIDB4ZjgwMDAwMDAgMHgwMDAwODAwMApAQCAtMTU4LDUxICsxNjEsNjkgQEAKIAkJCWludGVycnVwdHMgPSA8MTggMj47CiAJCX07CiAKLQkJaTJjQDMwMDAgeworCQlpMmMtc2xlZXAtbmV4dXMgewogCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwotCQkJcmVnID0gPDB4MzAwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQzIDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlkZnNycjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKKwkJCXNsZWVwID0gPCZwbWMgMHgwMDAwMDAwND47CisJCQlyYW5nZXM7CiAKLQkJCXJ0Y0A2OCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJkYWxsYXMsZHMxMzc0IjsKLQkJCQlyZWcgPSA8MHg2OD47CisJCQlpMmNAMzAwMCB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOworCQkJCXJlZyA9IDwweDMwMDAgMHgxMDA+OworCQkJCWludGVycnVwdHMgPSA8NDMgMj47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQkJZGZzcnI7CisKKwkJCQlydGNANjggeworCQkJCQljb21wYXRpYmxlID0gImRhbGxhcyxkczEzNzQiOworCQkJCQlyZWcgPSA8MHg2OD47CisJCQkJCWludGVycnVwdHMgPSA8MyAxPjsKKwkJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQkJfTsKKwkJCX07CisKKwkJCWkyY0AzMTAwIHsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQljZWxsLWluZGV4ID0gPDE+OworCQkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CisJCQkJcmVnID0gPDB4MzEwMCAweDEwMD47CisJCQkJaW50ZXJydXB0cyA9IDw0MyAyPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCQlkZnNycjsKIAkJCX07CiAJCX07CiAKLQkJaTJjQDMxMDAgeworCQlkdWFydC1zbGVlcC1uZXh1cyB7CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgzMTAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8NDMgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWRmc3JyOwotCQl9OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCQkJc2xlZXAgPSA8JnBtYyAweDAwMDAwMDAyPjsKKwkJCXJhbmdlczsKIAotCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHg0NTAwIDB4MTAwPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8NDIgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJfTsKKwkJCXNlcmlhbDA6IHNlcmlhbEA0NTAwIHsKKwkJCQljZWxsLWluZGV4ID0gPDA+OworCQkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCQlyZWcgPSA8MHg0NTAwIDB4MTAwPjsKKwkJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQkJaW50ZXJydXB0cyA9IDw0MiAyPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCX07CiAKLQkJc2VyaWFsMTogc2VyaWFsQDQ2MDAgewotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwotCQkJcmVnID0gPDB4NDYwMCAweDEwMD47Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQyIDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlzZXJpYWwxOiBzZXJpYWxANDYwMCB7CisJCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQkJcmVnID0gPDB4NDYwMCAweDEwMD47CisJCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQkJCWludGVycnVwdHMgPSA8NDIgMj47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQl9OwogCQl9OwogCiAJCUwyOiBsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKQEAgLTI2MCw2ICsyODEsNyBAQAogCQkJcmVnID0gPDB4MmUwMDAgMHgxMDAwPjsKIAkJCWludGVycnVwdHMgPSA8NzIgMHg4PjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJc2xlZXAgPSA8JnBtYyAweDAwMjAwMDAwPjsKIAkJCS8qIEZpbGxlZCBpbiBieSBVLUJvb3QgKi8KIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKIAkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CkBAIC0yNzYsNiArMjk4LDcgQEAKIAkJCWZzbCxjaGFubmVsLWZpZm8tbGVuID0gPDI0PjsKIAkJCWZzbCxleGVjLXVuaXRzLW1hc2sgPSA8MHhiZmU+OwogCQkJZnNsLGRlc2NyaXB0b3ItdHlwZXMtbWFzayA9IDwweDNhYjBlYmY+OworCQkJc2xlZXAgPSA8JnBtYyAweDAxMDAwMDAwPjsKIAkJfTsKIAogCQltcGljOiBwaWNANDAwMDAgewpAQCAtMzA0LDkgKzMyNywxOCBAQAogCQl9OwogCiAJCWdsb2JhbC11dGlsaXRpZXNAZTAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2OS1ndXRzIjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTY5LWd1dHMiLCAiZnNsLG1wYzg1NDgtZ3V0cyI7CiAJCQlyZWcgPSA8MHhlMDAwMCAweDEwMDA+OworCQkJcmFuZ2VzID0gPDAgMHhlMDAwMCAweDEwMDA+OwogCQkJZnNsLGhhcy1yc3RjcjsKKworCQkJcG1jOiBwb3dlckA3MCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2OS1wbWMiLAorCQkJCQkgICAgICJmc2wsbXBjODU0OC1wbWMiOworCQkJCXJlZyA9IDwweDcwIDB4MjA+OworCQkJfTsKIAkJfTsKIAogCQlwYXJfaW9AZTAxMDAgewpAQCAtNDIyLDYgKzQ1NCw3IEBACiAJCWNvbXBhdGlibGUgPSAiZnNsLHFlIjsKIAkJcmFuZ2VzID0gPDB4MCAweGUwMDgwMDAwIDB4NDAwMDA+OwogCQlyZWcgPSA8MHhlMDA4MDAwMCAweDQ4MD47CisJCXNsZWVwID0gPCZwbWMgMHgwMDAwMDgwMD47CiAJCWJyZy1mcmVxdWVuY3kgPSA8MD47CiAJCWJ1cy1mcmVxdWVuY3kgPSA8MD47CiAJCWZzbCxxZS1udW0tcmlzY3MgPSA8ND47CkBAIC02ODQsNiArNzE3LDcgQEAKIAkJYnVzLXJhbmdlID0gPDAgMjU1PjsKIAkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhhMDAwMDAwMCAweGEwMDAwMDAwIDB4MCAweDEwMDAwMDAwCiAJCQkgIDB4MTAwMDAwMCAweDAgMHgwMDAwMDAwMCAweGUyODAwMDAwIDB4MCAweDAwODAwMDAwPjsKKwkJc2xlZXAgPSA8JnBtYyAweDIwMDAwMDAwPjsKIAkJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKIAkJcGNpZUAwIHsKIAkJCXJlZyA9IDwweDAgMHgwIDB4MCAweDAgMHgwPjsKQEAgLTcxNCw1ICs3NDgsNiBAQAogCQkJICAgICAgNTUgMiAvKiBtc2cyX3R4ICAgKi8KIAkJCSAgICAgIDU2IDIgLyogbXNnMl9yeCAgICovPjsKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCXNsZWVwID0gPCZwbWMgMHgwMDA4MDAwMD47CiAJfTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODYxMF9ocGNkLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjEwX2hwY2QuZHRzCmluZGV4IGY0NjhkMjEuLjk1MzVjZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjEwX2hwY2QuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjEwX2hwY2QuZHRzCkBAIC0zNSw2ICszNSw4IEBACiAJCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CiAJCQlkLWNhY2hlLXNpemUgPSA8MzI3Njg+OwkJLy8gTDEKIAkJCWktY2FjaGUtc2l6ZSA9IDwzMjc2OD47CQkvLyBMMQorCQkJc2xlZXAgPSA8JnBtYyAweDAwMDA4MDAwIDAJLy8gY29yZQorCQkJCSAmcG1jIDB4MDAwMDQwMDAgMD47CS8vIHRpbWViYXNlCiAJCQl0aW1lYmFzZS1mcmVxdWVuY3kgPSA8MD47CS8vIEZyb20gdWJvb3QKIAkJCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBGcm9tIHVib290CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CQkvLyBGcm9tIHVib290CkBAIC02MCw2ICs2Miw3IEBACiAJCQkgIDUgMCAweGU4NDgwMDAwIDB4MDAwMDgwMDAKIAkJCSAgNiAwIDB4ZTg0YzAwMDAgMHgwMDAwODAwMAogCQkJICAzIDAgMHhlODAwMDAwMCAweDAwMDAwMDIwPjsKKwkJc2xlZXAgPSA8JnBtYyAweDA4MDAwMDAwIDA+OwogCiAJCWZsYXNoQDAsMCB7CiAJCQljb21wYXRpYmxlID0gImNmaS1mbGFzaCI7CkBAIC0xMDUsNiArMTA4LDggQEAKIAkJCWNvbXBhdGlibGUgPSAiZnNsLGZwZ2EtcGl4aXMiOwogCQkJcmVnID0gPDMgMCAweDIwPjsKIAkJCXJhbmdlcyA9IDwwIDMgMCAweDIwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJaW50ZXJydXB0cyA9IDw4IDg+OwogCiAJCQlzZGNzcl9waW86IGdwaW8tY29udHJvbGxlckBhIHsKIAkJCQkjZ3Bpby1jZWxscyA9IDwyPjsKQEAgLTE2Myw2ICsxNjgsNyBAQAogCQkJcmVnID0gPDB4MzEwMCAweDEwMD47CiAJCQlpbnRlcnJ1cHRzID0gPDQzIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlzbGVlcCA9IDwmcG1jIDB4MDAwMDAwMDQgMD47CiAJCQlkZnNycjsKIAkJfTsKIApAQCAtMTc0LDYgKzE4MCw3IEBACiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CiAJCQlpbnRlcnJ1cHRzID0gPDQyIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlzbGVlcCA9IDwmcG1jIDB4MDAwMDAwMDIgMD47CiAJCX07CiAKIAkJc2VyaWFsMTogc2VyaWFsQDQ2MDAgewpAQCAtMTg0LDYgKzE5MSw3IEBACiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CiAJCQlpbnRlcnJ1cHRzID0gPDQyIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlzbGVlcCA9IDwmcG1jIDB4MDAwMDAwMDggMD47CiAJCX07CiAKIAkJc3BpQDcwMDAgewpAQCAtMTk2LDYgKzIwNCw3IEBACiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCW1vZGUgPSAiY3B1IjsKIAkJCWdwaW9zID0gPCZzZGNzcl9waW8gNyAwPjsKKwkJCXNsZWVwID0gPCZwbWMgMHgwMDAwMDgwMCAwPjsKIAogCQkJbW1jLXNsb3RAMCB7CiAJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODYxMGhwY2QtbW1jLXNsb3QiLApAQCAtMjEzLDYgKzIyMiw3IEBACiAJCQlyZWcgPSA8MHgyYzAwMCAxMDA+OwogCQkJaW50ZXJydXB0cyA9IDw3MiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJc2xlZXAgPSA8JnBtYyAweDA0MDAwMDAwIDA+OwogCQl9OwogCiAJCW1waWM6IGludGVycnVwdC1jb250cm9sbGVyQDQwMDAwIHsKQEAgLTI0MSw5ICsyNTEsMTggQEAKIAkJfTsKIAogCQlnbG9iYWwtdXRpbGl0aWVzQGUwMDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NjEwLWd1dHMiOwogCQkJcmVnID0gPDB4ZTAwMDAgMHgxMDAwPjsKKwkJCXJhbmdlcyA9IDwwIDB4ZTAwMDAgMHgxMDAwPjsKIAkJCWZzbCxoYXMtcnN0Y3I7CisKKwkJCXBtYzogcG93ZXJANzAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg2MTAtcG1jIiwKKwkJCQkJICAgICAiZnNsLG1wYzg2NDFkLXBtYyI7CisJCQkJcmVnID0gPDB4NzAgMHgyMD47CisJCQl9OwogCQl9OwogCiAJCXdkdEBlNDAwMCB7CkBAIC0yNjIsNiArMjgxLDcgQEAKIAkJCWZzbCxwbGF5YmFjay1kbWEgPSA8JmRtYTAwPjsKIAkJCWZzbCxjYXB0dXJlLWRtYSA9IDwmZG1hMDE+OwogCQkJZnNsLGZpZm8tZGVwdGggPSA8OD47CisJCQlzbGVlcCA9IDwmcG1jIDAgMHgwODAwMDAwMD47CiAJCX07CiAKIAkJc3NpQDE2MTAwIHsKQEAgLTI3MSw2ICsyOTEsNyBAQAogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlpbnRlcnJ1cHRzID0gPDYzIDI+OwogCQkJZnNsLGZpZm8tZGVwdGggPSA8OD47CisJCQlzbGVlcCA9IDwmcG1jIDAgMHgwNDAwMDAwMD47CiAJCX07CiAKIAkJZG1hQDIxMzAwIHsKQEAgLTI4MCw2ICszMDEsNyBAQAogCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCXJlZyA9IDwweDIxMzAwIDB4ND47IC8qIERNQSBnZW5lcmFsIHN0YXR1cyByZWdpc3RlciAqLwogCQkJcmFuZ2VzID0gPDB4MCAweDIxMTAwIDB4MjAwPjsKKwkJCXNsZWVwID0gPCZwbWMgMHgwMDAwMDQwMCAwPjsKIAogCQkJZG1hMDA6IGRtYS1jaGFubmVsQDAgewogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg2MTAtZG1hLWNoYW5uZWwiLApAQCAtMzIyLDYgKzM0NCw3IEBACiAJCQljZWxsLWluZGV4ID0gPDE+OwogCQkJcmVnID0gPDB4YzMwMCAweDQ+OyAvKiBETUEgZ2VuZXJhbCBzdGF0dXMgcmVnaXN0ZXIgKi8KIAkJCXJhbmdlcyA9IDwweDAgMHhjMTAwIDB4MjAwPjsKKwkJCXNsZWVwID0gPCZwbWMgMHgwMDAwMDIwMCAwPjsKIAogCQkJZG1hLWNoYW5uZWxAMCB7CiAJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODYxMC1kbWEtY2hhbm5lbCIsCkBAIC0zNjksNiArMzkyLDcgQEAKIAkJYnVzLXJhbmdlID0gPDAgMD47CiAJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDB4MCAweDgwMDAwMDAwIDB4ODAwMDAwMDAgMHgwIDB4MTAwMDAwMDAKIAkJCSAgMHgwMTAwMDAwMCAweDAgMHgwMDAwMDAwMCAweGUxMDAwMDAwIDB4MCAweDAwMTAwMDAwPjsKKwkJc2xlZXAgPSA8JnBtYyAweDgwMDAwMDAwIDA+OwogCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwogCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJaW50ZXJydXB0cyA9IDwyNCAyPjsKQEAgLTM5OCw2ICs0MjIsNyBAQAogCQlidXMtcmFuZ2UgPSA8MSAzPjsKIAkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMHgwIDB4YTAwMDAwMDAgMHhhMDAwMDAwMCAweDAgMHgxMDAwMDAwMAogCQkJICAweDAxMDAwMDAwIDB4MCAweDAwMDAwMDAwIDB4ZTMwMDAwMDAgMHgwIDB4MDAxMDAwMDA+OworCQlzbGVlcCA9IDwmcG1jIDB4NDAwMDAwMDAgMD47CiAJCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CiAJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQlpbnRlcnJ1cHRzID0gPDI2IDI+OwpAQCAtNDc0LDYgKzQ5OSw3IEBACiAJCQkJIDB4MDAwMCAwIDAgNCAmbXBpYyA3IDE+OwogCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJaW50ZXJydXB0cyA9IDwyNSAyPjsKKwkJc2xlZXAgPSA8JnBtYyAweDIwMDAwMDAwIDA+OwogCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwogCX07CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AxMDIwcmRiLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAyMHJkYi5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1MjY5MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAyMHJkYi5kdHMKQEAgLTAsMCArMSw0NzcgQEAKKy8qCisgKiBQMTAyMCBSREIgRGV2aWNlIFRyZWUgU291cmNlCisgKgorICogQ29weXJpZ2h0IDIwMDkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworL2R0cy12MS87CisvIHsKKwltb2RlbCA9ICJmc2wsUDEwMjAiOworCWNvbXBhdGlibGUgPSAiZnNsLFAxMDIwUkRCIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKworCWFsaWFzZXMgeworCQlzZXJpYWwwID0gJnNlcmlhbDA7CisJCXNlcmlhbDEgPSAmc2VyaWFsMTsKKwkJcGNpMCA9ICZwY2kwOworCQlwY2kxID0gJnBjaTE7CisJfTsKKworCWNwdXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJUG93ZXJQQyxQMTAyMEAwIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MHgwPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKKwkJfTsKKworCQlQb3dlclBDLFAxMDIwQDEgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwweDE+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDI+OworCQl9OworCX07CisKKwltZW1vcnkgeworCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOworCX07CisKKwlsb2NhbGJ1c0BmZmUwNTAwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjAtZWxiYyIsICJmc2wsZWxiYyIsICJzaW1wbGUtYnVzIjsKKwkJcmVnID0gPDAgMHhmZmUwNTAwMCAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8MTkgMj47CisJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCisJCS8qIE5PUiwgTkFORCBGbGFzaGVzIGFuZCBWaXRlc3NlIDUgcG9ydCBMMiBzd2l0Y2ggKi8KKwkJcmFuZ2VzID0gPDB4MCAweDAgMHgwIDB4ZWYwMDAwMDAgMHgwMTAwMDAwMAorCQkJICAweDEgMHgwIDB4MCAweGZmYTAwMDAwIDB4MDAwNDAwMDAKKwkJCSAgMHgyIDB4MCAweDAgMHhmZmIwMDAwMCAweDAwMDIwMDAwPjsKKworCQlub3JAMCwwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljb21wYXRpYmxlID0gImNmaS1mbGFzaCI7CisJCQlyZWcgPSA8MHgwIDB4MCAweDEwMDAwMDA+OworCQkJYmFuay13aWR0aCA9IDwyPjsKKwkJCWRldmljZS13aWR0aCA9IDwxPjsKKworCQkJcGFydGl0aW9uQDAgeworCQkJCS8qIFRoaXMgbG9jYXRpb24gbXVzdCBub3QgYmUgYWx0ZXJlZCAgKi8KKwkJCQkvKiAyNTZLQiBmb3IgVml0ZXNzZSA3Mzg1IFN3aXRjaCBmaXJtd2FyZSAqLworCQkJCXJlZyA9IDwweDAgMHgwMDA0MDAwMD47CisJCQkJbGFiZWwgPSAiTk9SIChSTykgVml0ZXNzZS03Mzg1IEZpcm13YXJlIjsKKwkJCQlyZWFkLW9ubHk7CisJCQl9OworCisJCQlwYXJ0aXRpb25ANDAwMDAgeworCQkJCS8qIDI1NktCIGZvciBEVEIgSW1hZ2UgKi8KKwkJCQlyZWcgPSA8MHgwMDA0MDAwMCAweDAwMDQwMDAwPjsKKwkJCQlsYWJlbCA9ICJOT1IgKFJPKSBEVEIgSW1hZ2UiOworCQkJCXJlYWQtb25seTsKKwkJCX07CisKKwkJCXBhcnRpdGlvbkA4MDAwMCB7CisJCQkJLyogMy41IE1CIGZvciBMaW51eCBLZXJuZWwgSW1hZ2UgKi8KKwkJCQlyZWcgPSA8MHgwMDA4MDAwMCAweDAwMzgwMDAwPjsKKwkJCQlsYWJlbCA9ICJOT1IgKFJPKSBMaW51eCBLZXJuZWwgSW1hZ2UiOworCQkJCXJlYWQtb25seTsKKwkJCX07CisKKwkJCXBhcnRpdGlvbkA0MDAwMDAgeworCQkJCS8qIDExTUIgZm9yIEpGRlMyIGJhc2VkIFJvb3QgZmlsZSBTeXN0ZW0gKi8KKwkJCQlyZWcgPSA8MHgwMDQwMDAwMCAweDAwYjAwMDAwPjsKKwkJCQlsYWJlbCA9ICJOT1IgKFJXKSBKRkZTMiBSb290IEZpbGUgU3lzdGVtIjsKKwkJCX07CisKKwkJCXBhcnRpdGlvbkBmMDAwMDAgeworCQkJCS8qIFRoaXMgbG9jYXRpb24gbXVzdCBub3QgYmUgYWx0ZXJlZCAgKi8KKwkJCQkvKiA1MTJLQiBmb3IgdS1ib290IEJvb3Rsb2FkZXIgSW1hZ2UgKi8KKwkJCQkvKiA1MTJLQiBmb3IgdS1ib290IEVudmlyb25tZW50IFZhcmlhYmxlcyAqLworCQkJCXJlZyA9IDwweDAwZjAwMDAwIDB4MDAxMDAwMDA+OworCQkJCWxhYmVsID0gIk5PUiAoUk8pIFUtQm9vdCBJbWFnZSI7CisJCQkJcmVhZC1vbmx5OworCQkJfTsKKwkJfTsKKworCQluYW5kQDEsMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjAtZmNtLW5hbmQiLAorCQkJCSAgICAgImZzbCxlbGJjLWZjbS1uYW5kIjsKKwkJCXJlZyA9IDwweDEgMHgwIDB4NDAwMDA+OworCisJCQlwYXJ0aXRpb25AMCB7CisJCQkJLyogVGhpcyBsb2NhdGlvbiBtdXN0IG5vdCBiZSBhbHRlcmVkICAqLworCQkJCS8qIDFNQiBmb3IgdS1ib290IEJvb3Rsb2FkZXIgSW1hZ2UgKi8KKwkJCQlyZWcgPSA8MHgwIDB4MDAxMDAwMDA+OworCQkJCWxhYmVsID0gIk5BTkQgKFJPKSBVLUJvb3QgSW1hZ2UiOworCQkJCXJlYWQtb25seTsKKwkJCX07CisKKwkJCXBhcnRpdGlvbkAxMDAwMDAgeworCQkJCS8qIDFNQiBmb3IgRFRCIEltYWdlICovCisJCQkJcmVnID0gPDB4MDAxMDAwMDAgMHgwMDEwMDAwMD47CisJCQkJbGFiZWwgPSAiTkFORCAoUk8pIERUQiBJbWFnZSI7CisJCQkJcmVhZC1vbmx5OworCQkJfTsKKworCQkJcGFydGl0aW9uQDIwMDAwMCB7CisJCQkJLyogNE1CIGZvciBMaW51eCBLZXJuZWwgSW1hZ2UgKi8KKwkJCQlyZWcgPSA8MHgwMDIwMDAwMCAweDAwNDAwMDAwPjsKKwkJCQlsYWJlbCA9ICJOQU5EIChSTykgTGludXggS2VybmVsIEltYWdlIjsKKwkJCQlyZWFkLW9ubHk7CisJCQl9OworCisJCQlwYXJ0aXRpb25ANjAwMDAwIHsKKwkJCQkvKiA0TUIgZm9yIENvbXByZXNzZWQgUm9vdCBmaWxlIFN5c3RlbSBJbWFnZSAqLworCQkJCXJlZyA9IDwweDAwNjAwMDAwIDB4MDA0MDAwMDA+OworCQkJCWxhYmVsID0gIk5BTkQgKFJPKSBDb21wcmVzc2VkIFJGUyBJbWFnZSI7CisJCQkJcmVhZC1vbmx5OworCQkJfTsKKworCQkJcGFydGl0aW9uQGEwMDAwMCB7CisJCQkJLyogN01CIGZvciBKRkZTMiBiYXNlZCBSb290IGZpbGUgU3lzdGVtICovCisJCQkJcmVnID0gPDB4MDBhMDAwMDAgMHgwMDcwMDAwMD47CisJCQkJbGFiZWwgPSAiTkFORCAoUlcpIEpGRlMyIFJvb3QgRmlsZSBTeXN0ZW0iOworCQkJfTsKKworCQkJcGFydGl0aW9uQDExMDAwMDAgeworCQkJCS8qIDE1TUIgZm9yIEpGRlMyIGJhc2VkIFJvb3QgZmlsZSBTeXN0ZW0gKi8KKwkJCQlyZWcgPSA8MHgwMTEwMDAwMCAweDAwZjAwMDAwPjsKKwkJCQlsYWJlbCA9ICJOQU5EIChSVykgV3JpdGFibGUgVXNlciBhcmVhIjsKKwkJCX07CisJCX07CisKKwkJTDJzd2l0Y2hAMiwwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljb21wYXRpYmxlID0gInZpdGVzc2UtNzM4NSI7CisJCQlyZWcgPSA8MHgyIDB4MCAweDIwMDAwPjsKKwkJfTsKKworCX07CisKKwlzb2NAZmZlMDAwMDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWRldmljZV90eXBlID0gInNvYyI7CisJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIwLWltbXIiLCAic2ltcGxlLWJ1cyI7CisJCXJhbmdlcyA9IDwweDAgIDB4MCAweGZmZTAwMDAwIDB4MTAwMDAwPjsKKwkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIEZpbGxlZCBvdXQgYnkgdWJvb3QuCisKKwkJZWNtLWxhd0AwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGVjbS1sYXciOworCQkJcmVnID0gPDB4MCAweDEwMDA+OworCQkJZnNsLG51bS1sYXdzID0gPDEyPjsKKwkJfTsKKworCQllY21AMTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMTAyMC1lY20iLCAiZnNsLGVjbSI7CisJCQlyZWcgPSA8MHgxMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDE2IDI+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCX07CisKKwkJbWVtb3J5LWNvbnRyb2xsZXJAMjAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMTAyMC1tZW1vcnktY29udHJvbGxlciI7CisJCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCWludGVycnVwdHMgPSA8MTYgMj47CisJCX07CisKKwkJaTJjQDMwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNlbGwtaW5kZXggPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOworCQkJcmVnID0gPDB4MzAwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDQzIDI+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlkZnNycjsKKwkJCXJ0Y0A2OCB7CisJCQkJY29tcGF0aWJsZSA9ICJkYWxsYXMsZHMxMzM5IjsKKwkJCQlyZWcgPSA8MHg2OD47CisJCQl9OworCQl9OworCisJCWkyY0AzMTAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljZWxsLWluZGV4ID0gPDE+OworCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKKwkJCXJlZyA9IDwweDMxMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDw0MyAyPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJZGZzcnI7CisJCX07CisKKwkJc2VyaWFsMDogc2VyaWFsQDQ1MDAgeworCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJcmVnID0gPDB4NDUwMCAweDEwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDQyIDI+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCX07CisKKwkJc2VyaWFsMTogc2VyaWFsQDQ2MDAgeworCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJcmVnID0gPDB4NDYwMCAweDEwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDQyIDI+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCX07CisKKwkJc3BpQDcwMDAgeworCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbCxlc3BpIjsKKwkJCXJlZyA9IDwweDcwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8NTkgMHgyPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJbW9kZSA9ICJjcHUiOworCisJCQlmc2xfbTI1cDgwQDAgeworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGVzcGktZmxhc2giOworCQkJCXJlZyA9IDwwPjsKKwkJCQlsaW51eCxtb2RhbGlhcyA9ICJmc2xfbTI1cDgwIjsKKwkJCQltb2RhbCA9ICJzMjVzbDEyOGIiOworCQkJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDUwMDAwMDAwPjsKKwkJCQltb2RlID0gPDA+OworCisJCQkJcGFydGl0aW9uQDAgeworCQkJCQkvKiA1MTJLQiBmb3IgdS1ib290IEJvb3Rsb2FkZXIgSW1hZ2UgKi8KKwkJCQkJcmVnID0gPDB4MCAweDAwMDgwMDAwPjsKKwkJCQkJbGFiZWwgPSAiU1BJIChSTykgVS1Cb290IEltYWdlIjsKKwkJCQkJcmVhZC1vbmx5OworCQkJCX07CisKKwkJCQlwYXJ0aXRpb25AODAwMDAgeworCQkJCQkvKiA1MTJLQiBmb3IgRFRCIEltYWdlICovCisJCQkJCXJlZyA9IDwweDAwMDgwMDAwIDB4MDAwODAwMDA+OworCQkJCQlsYWJlbCA9ICJTUEkgKFJPKSBEVEIgSW1hZ2UiOworCQkJCQlyZWFkLW9ubHk7CisJCQkJfTsKKworCQkJCXBhcnRpdGlvbkAxMDAwMDAgeworCQkJCQkvKiA0TUIgZm9yIExpbnV4IEtlcm5lbCBJbWFnZSAqLworCQkJCQlyZWcgPSA8MHgwMDEwMDAwMCAweDAwNDAwMDAwPjsKKwkJCQkJbGFiZWwgPSAiU1BJIChSTykgTGludXggS2VybmVsIEltYWdlIjsKKwkJCQkJcmVhZC1vbmx5OworCQkJCX07CisKKwkJCQlwYXJ0aXRpb25ANTAwMDAwIHsKKwkJCQkJLyogNE1CIGZvciBDb21wcmVzc2VkIFJGUyBJbWFnZSAqLworCQkJCQlyZWcgPSA8MHgwMDUwMDAwMCAweDAwNDAwMDAwPjsKKwkJCQkJbGFiZWwgPSAiU1BJIChSTykgQ29tcHJlc3NlZCBSRlMgSW1hZ2UiOworCQkJCQlyZWFkLW9ubHk7CisJCQkJfTsKKworCQkJCXBhcnRpdGlvbkA5MDAwMDAgeworCQkJCQkvKiA3TUIgZm9yIEpGRlMyIGJhc2VkIFJGUyAqLworCQkJCQlyZWcgPSA8MHgwMDkwMDAwMCAweDAwNzAwMDAwPjsKKwkJCQkJbGFiZWwgPSAiU1BJIChSVykgSkZGUzIgUkZTIjsKKwkJCQl9OworCQkJfTsKKwkJfTsKKworCQlncGlvOiBncGlvLWNvbnRyb2xsZXJAZjAwMCB7CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItZ3BpbyI7CisJCQlyZWcgPSA8MHhmMDAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8NDcgMHgyPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJZ3Bpby1jb250cm9sbGVyOworCQl9OworCisJCUwyOiBsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIwLWwyLWNhY2hlLWNvbnRyb2xsZXIiOworCQkJcmVnID0gPDB4MjAwMDAgMHgxMDAwPjsKKwkJCWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CS8vIDMyIGJ5dGVzCisJCQljYWNoZS1zaXplID0gPDB4NDAwMDA+OyAvLyBMMiwyNTZLCisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCWludGVycnVwdHMgPSA8MTYgMj47CisJCX07CisKKwkJZG1hQDIxMzAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYSI7CisJCQlyZWcgPSA8MHgyMTMwMCAweDQ+OworCQkJcmFuZ2VzID0gPDB4MCAweDIxMTAwIDB4MjAwPjsKKwkJCWNlbGwtaW5kZXggPSA8MD47CisJCQlkbWEtY2hhbm5lbEAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQkJaW50ZXJydXB0cyA9IDwyMCAyPjsKKwkJCX07CisJCQlkbWEtY2hhbm5lbEA4MCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4ODAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDIxIDI+OworCQkJfTsKKwkJCWRtYS1jaGFubmVsQDEwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MTAwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8Mj47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQkJaW50ZXJydXB0cyA9IDwyMiAyPjsKKwkJCX07CisJCQlkbWEtY2hhbm5lbEAxODAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDE4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDM+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCWludGVycnVwdHMgPSA8MjMgMj47CisJCQl9OworCQl9OworCisJCXVzYkAyMjAwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wtdXNiMi1kciI7CisJCQlyZWcgPSA8MHgyMjAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlpbnRlcnJ1cHRzID0gPDI4IDB4Mj47CisJCQlwaHlfdHlwZSA9ICJ1bHBpIjsKKwkJfTsKKworCQl1c2JAMjMwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLXVzYjItZHIiOworCQkJcmVnID0gPDB4MjMwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJaW50ZXJydXB0cyA9IDw0NiAweDI+OworCQkJcGh5X3R5cGUgPSAidWxwaSI7CisJCX07CisKKwkJc2RoY2lAMmUwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjAtZXNkaGMiLCAiZnNsLGVzZGhjIjsKKwkJCXJlZyA9IDwweDJlMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDcyIDB4Mj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCS8qIEZpbGxlZCBpbiBieSBVLUJvb3QgKi8KKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJfTsKKworCQljcnlwdG9AMzAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjMy4xIiwgImZzbCxzZWMzLjAiLCAiZnNsLHNlYzIuNCIsCisJCQkJICAgICAiZnNsLHNlYzIuMiIsICJmc2wsc2VjMi4xIiwgImZzbCxzZWMyLjAiOworCQkJcmVnID0gPDB4MzAwMDAgMHgxMDAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDQ1IDIgNTggMj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCWZzbCxudW0tY2hhbm5lbHMgPSA8ND47CisJCQlmc2wsY2hhbm5lbC1maWZvLWxlbiA9IDwyND47CisJCQlmc2wsZXhlYy11bml0cy1tYXNrID0gPDB4YmZlPjsKKwkJCWZzbCxkZXNjcmlwdG9yLXR5cGVzLW1hc2sgPSA8MHgzYWIwZWJmPjsKKwkJfTsKKworCQltcGljOiBwaWNANDAwMDAgeworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCQlyZWcgPSA8MHg0MDAwMCAweDQwMDAwPjsKKwkJCWNvbXBhdGlibGUgPSAiY2hycCxvcGVuLXBpYyI7CisJCQlkZXZpY2VfdHlwZSA9ICJvcGVuLXBpYyI7CisJCX07CisKKwkJbXNpQDQxNjAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIwLW1zaSIsICJmc2wsbXBpYy1tc2kiOworCQkJcmVnID0gPDB4NDE2MDAgMHg4MD47CisJCQltc2ktYXZhaWxhYmxlLXJhbmdlcyA9IDwwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8CisJCQkJMHhlMCAwCisJCQkJMHhlMSAwCisJCQkJMHhlMiAwCisJCQkJMHhlMyAwCisJCQkJMHhlNCAwCisJCQkJMHhlNSAwCisJCQkJMHhlNiAwCisJCQkJMHhlNyAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQl9OworCisJCWdsb2JhbC11dGlsaXRpZXNAZTAwMDAgewkvL2dsb2JhbCB1dGlsaXRpZXMgYmxvY2sKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIwLWd1dHMiOworCQkJcmVnID0gPDB4ZTAwMDAgMHgxMDAwPjsKKwkJCWZzbCxoYXMtcnN0Y3I7CisJCX07CisJfTsKKworCXBjaTA6IHBjaWVAZmZlMDkwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LXBjaWUiOworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCXJlZyA9IDwwIDB4ZmZlMDkwMDAgMCAweDEwMDA+OworCQlidXMtcmFuZ2UgPSA8MCAyNTU+OworCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGEwMDAwMDAwIDAgMHhhMDAwMDAwMCAweDAgMHgyMDAwMDAwMAorCQkJICAweDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMCAweGZmYzMwMDAwIDB4MCAweDEwMDAwPjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCWludGVycnVwdHMgPSA8MTYgMj47CisJCXBjaWVAMCB7CisJCQlyZWcgPSA8MHgwIDB4MCAweDAgMHgwIDB4MD47CisJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4YTAwMDAwMDAKKwkJCQkgIDB4MjAwMDAwMCAweDAgMHhhMDAwMDAwMAorCQkJCSAgMHgwIDB4MjAwMDAwMDAKKworCQkJCSAgMHgxMDAwMDAwIDB4MCAweDAKKwkJCQkgIDB4MTAwMDAwMCAweDAgMHgwCisJCQkJICAweDAgMHgxMDAwMDA+OworCQl9OworCX07CisKKwlwY2kxOiBwY2llQGZmZTBhMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1wY2llIjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlyZWcgPSA8MCAweGZmZTBhMDAwIDAgMHgxMDAwPjsKKwkJYnVzLXJhbmdlID0gPDAgMjU1PjsKKwkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhjMDAwMDAwMCAwIDB4YzAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKKwkJCSAgMHgxMDAwMDAwIDB4MCAweDAwMDAwMDAwIDAgMHhmZmMyMDAwMCAweDAgMHgxMDAwMD47CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CisJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQlpbnRlcnJ1cHRzID0gPDE2IDI+OworCQlwY2llQDAgeworCQkJcmVnID0gPDB4MCAweDAgMHgwIDB4MCAweDA+OworCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCWRldmljZV90eXBlID0gInBjaSI7CisJCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGMwMDAwMDAwCisJCQkJICAweDIwMDAwMDAgMHgwIDB4YzAwMDAwMDAKKwkJCQkgIDB4MCAweDIwMDAwMDAwCisKKwkJCQkgIDB4MTAwMDAwMCAweDAgMHgwCisJCQkJICAweDEwMDAwMDAgMHgwIDB4MAorCQkJCSAgMHgwIDB4MTAwMDAwPjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMjAyMHJkYl9jYW1wX2NvcmUwLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMjAyMHJkYl9jYW1wX2NvcmUwLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmU5M2QwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AyMDIwcmRiX2NhbXBfY29yZTAuZHRzCkBAIC0wLDAgKzEsMzYzIEBACisvKgorICogUDIwMjAgUkRCICBDb3JlMCBEZXZpY2UgVHJlZSBTb3VyY2UgaW4gQ0FNUCBtb2RlLgorICoKKyAqIEluIENBTVAgbW9kZSwgZWFjaCBjb3JlIG5lZWRzIHRvIGhhdmUgaXRzIG93biBkdHMuIE9ubHkgbXBpYyBhbmQgTDIgY2FjaGUKKyAqIGNhbiBiZSBzaGFyZWQsIGFsbCB0aGUgb3RoZXIgZGV2aWNlcyBtdXN0IGJlIGFzc2lnbmVkIHRvIG9uZSBjb3JlIG9ubHkuCisgKiBUaGlzIGR0cyBmaWxlIGFsbG93cyBjb3JlMCB0byBoYXZlIG1lbW9yeSwgbDIsIGkyYywgc3BpLCBncGlvLCBkbWExLCB1c2IsCisgKiBldGgxLCBldGgyLCBzZGhjLCBjcnlwdG8sIGdsb2JhbC11dGlsLCBwY2kwLgorICoKKyAqIENvcHlyaWdodCAyMDA5IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKy9kdHMtdjEvOworLyB7CisJbW9kZWwgPSAiZnNsLFAyMDIwIjsKKwljb21wYXRpYmxlID0gImZzbCxQMjAyMFJEQiIsICJmc2wsTVBDODVYWFJEQi1DQU1QIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKworCWFsaWFzZXMgeworCQlldGhlcm5ldDEgPSAmZW5ldDE7CisJCWV0aGVybmV0MiA9ICZlbmV0MjsKKwkJc2VyaWFsMCA9ICZzZXJpYWwwOworCQlwY2kwID0gJnBjaTA7CisJfTsKKworCWNwdXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJUG93ZXJQQyxQMjAyMEAwIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MHgwPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKKwkJfTsKKwl9OworCisJbWVtb3J5IHsKKwkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKKwl9OworCisJc29jQGZmZTAwMDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQlkZXZpY2VfdHlwZSA9ICJzb2MiOworCQljb21wYXRpYmxlID0gImZzbCxwMjAyMC1pbW1yIiwgInNpbXBsZS1idXMiOworCQlyYW5nZXMgPSA8MHgwICAweDAgMHhmZmUwMDAwMCAweDEwMDAwMD47CisJCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBGaWxsZWQgb3V0IGJ5IHVib290LgorCisJCWVjbS1sYXdAMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxlY20tbGF3IjsKKwkJCXJlZyA9IDwweDAgMHgxMDAwPjsKKwkJCWZzbCxudW0tbGF3cyA9IDwxMj47CisJCX07CisKKwkJZWNtQDEwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwMjAtZWNtIiwgImZzbCxlY20iOworCQkJcmVnID0gPDB4MTAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwxNyAyPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQl9OworCisJCW1lbW9yeS1jb250cm9sbGVyQDIwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwMjAtbWVtb3J5LWNvbnRyb2xsZXIiOworCQkJcmVnID0gPDB4MjAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlpbnRlcnJ1cHRzID0gPDE4IDI+OworCQl9OworCisJCWkyY0AzMDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljZWxsLWluZGV4ID0gPDA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKKwkJCXJlZyA9IDwweDMwMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDw0MyAyPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJZGZzcnI7CisJCQlydGNANjggeworCQkJCWNvbXBhdGlibGUgPSAiZGFsbGFzLGRzMTMzOSI7CisJCQkJcmVnID0gPDB4Njg+OworCQkJfTsKKwkJfTsKKworCQlpMmNAMzEwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CisJCQlyZWcgPSA8MHgzMTAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8NDMgMj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCWRmc3JyOworCQl9OworCisJCXNlcmlhbDA6IHNlcmlhbEA0NTAwIHsKKwkJCWNlbGwtaW5kZXggPSA8MD47CisJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCXJlZyA9IDwweDQ1MDAgMHgxMDA+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQl9OworCisJCXNwaUA3MDAwIHsKKwkJCWNlbGwtaW5kZXggPSA8MD47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wsZXNwaSI7CisJCQlyZWcgPSA8MHg3MDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDU5IDB4Mj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCW1vZGUgPSAiY3B1IjsKKworCQkJZnNsX20yNXA4MEAwIHsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCQljb21wYXRpYmxlID0gImZzbCxlc3BpLWZsYXNoIjsKKwkJCQlyZWcgPSA8MD47CisJCQkJbGludXgsbW9kYWxpYXMgPSAiZnNsX20yNXA4MCI7CisJCQkJbW9kYWwgPSAiczI1c2wxMjhiIjsKKwkJCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDw1MDAwMDAwMD47CisJCQkJbW9kZSA9IDwwPjsKKworCQkJCXBhcnRpdGlvbkAwIHsKKwkJCQkJLyogNTEyS0IgZm9yIHUtYm9vdCBCb290bG9hZGVyIEltYWdlICovCisJCQkJCXJlZyA9IDwweDAgMHgwMDA4MDAwMD47CisJCQkJCWxhYmVsID0gIlNQSSAoUk8pIFUtQm9vdCBJbWFnZSI7CisJCQkJCXJlYWQtb25seTsKKwkJCQl9OworCisJCQkJcGFydGl0aW9uQDgwMDAwIHsKKwkJCQkJLyogNTEyS0IgZm9yIERUQiBJbWFnZSAqLworCQkJCQlyZWcgPSA8MHgwMDA4MDAwMCAweDAwMDgwMDAwPjsKKwkJCQkJbGFiZWwgPSAiU1BJIChSTykgRFRCIEltYWdlIjsKKwkJCQkJcmVhZC1vbmx5OworCQkJCX07CisKKwkJCQlwYXJ0aXRpb25AMTAwMDAwIHsKKwkJCQkJLyogNE1CIGZvciBMaW51eCBLZXJuZWwgSW1hZ2UgKi8KKwkJCQkJcmVnID0gPDB4MDAxMDAwMDAgMHgwMDQwMDAwMD47CisJCQkJCWxhYmVsID0gIlNQSSAoUk8pIExpbnV4IEtlcm5lbCBJbWFnZSI7CisJCQkJCXJlYWQtb25seTsKKwkJCQl9OworCisJCQkJcGFydGl0aW9uQDUwMDAwMCB7CisJCQkJCS8qIDRNQiBmb3IgQ29tcHJlc3NlZCBSRlMgSW1hZ2UgKi8KKwkJCQkJcmVnID0gPDB4MDA1MDAwMDAgMHgwMDQwMDAwMD47CisJCQkJCWxhYmVsID0gIlNQSSAoUk8pIENvbXByZXNzZWQgUkZTIEltYWdlIjsKKwkJCQkJcmVhZC1vbmx5OworCQkJCX07CisKKwkJCQlwYXJ0aXRpb25AOTAwMDAwIHsKKwkJCQkJLyogN01CIGZvciBKRkZTMiBiYXNlZCBSRlMgKi8KKwkJCQkJcmVnID0gPDB4MDA5MDAwMDAgMHgwMDcwMDAwMD47CisJCQkJCWxhYmVsID0gIlNQSSAoUlcpIEpGRlMyIFJGUyI7CisJCQkJfTsKKwkJCX07CisJCX07CisKKwkJZ3BpbzogZ3Bpby1jb250cm9sbGVyQGYwMDAgeworCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLWdwaW8iOworCQkJcmVnID0gPDB4ZjAwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDQ3IDB4Mj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJfTsKKworCQlMMjogbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMjAyMC1sMi1jYWNoZS1jb250cm9sbGVyIjsKKwkJCXJlZyA9IDwweDIwMDAwIDB4MTAwMD47CisJCQljYWNoZS1saW5lLXNpemUgPSA8MzI+OwkvLyAzMiBieXRlcworCQkJY2FjaGUtc2l6ZSA9IDwweDgwMDAwPjsgLy8gTDIsNTEySworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlpbnRlcnJ1cHRzID0gPDE2IDI+OworCQl9OworCisJCWRtYUAyMTMwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJY29tcGF0aWJsZSA9ICJmc2wsZWxvcGx1cy1kbWEiOworCQkJcmVnID0gPDB4MjEzMDAgMHg0PjsKKwkJCXJhbmdlcyA9IDwweDAgMHgyMTEwMCAweDIwMD47CisJCQljZWxsLWluZGV4ID0gPDA+OworCQkJZG1hLWNoYW5uZWxAMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCWludGVycnVwdHMgPSA8MjAgMj47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAODAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MT47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQkJaW50ZXJydXB0cyA9IDwyMSAyPjsKKwkJCX07CisJCQlkbWEtY2hhbm5lbEAxMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDEwMCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDI+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCWludGVycnVwdHMgPSA8MjIgMj47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAMTgwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHgxODAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwzPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDIzIDI+OworCQkJfTsKKwkJfTsKKworCQl1c2JAMjIwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLXVzYjItZHIiOworCQkJcmVnID0gPDB4MjIwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJaW50ZXJydXB0cyA9IDwyOCAweDI+OworCQkJcGh5X3R5cGUgPSAidWxwaSI7CisJCX07CisKKwkJbWRpb0AyNDUyMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wsZ2lhbmZhci1tZGlvIjsKKwkJCXJlZyA9IDwweDI0NTIwIDB4MjA+OworCisJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQkJaW50ZXJydXB0cyA9IDwzIDE+OworCQkJCXJlZyA9IDwweDA+OworCQkJfTsKKwkJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDMgMT47CisJCQkJcmVnID0gPDB4MT47CisJCQl9OworCQl9OworCisJCW1kaW9AMjU1MjAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGdpYW5mYXItdGJpIjsKKwkJCXJlZyA9IDwweDI2NTIwIDB4MjA+OworCisJCQl0YmkwOiB0YmktcGh5QDExIHsKKwkJCQlyZWcgPSA8MHgxMT47CisJCQkJZGV2aWNlX3R5cGUgPSAidGJpLXBoeSI7CisJCQl9OworCQl9OworCisJCWVuZXQxOiBldGhlcm5ldEAyNTAwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOworCQkJbW9kZWwgPSAiZVRTRUMiOworCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKKwkJCXJlZyA9IDwweDI1MDAwIDB4MTAwMD47CisJCQlyYW5nZXMgPSA8MHgwIDB4MjUwMDAgMHgxMDAwPjsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwzNSAyIDM2IDIgNDAgMj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCXRiaS1oYW5kbGUgPSA8JnRiaTA+OworCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CisJCQlwaHktY29ubmVjdGlvbi10eXBlID0gInNnbWlpIjsKKworCQl9OworCisJCWVuZXQyOiBldGhlcm5ldEAyNjAwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJY2VsbC1pbmRleCA9IDwyPjsKKwkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOworCQkJbW9kZWwgPSAiZVRTRUMiOworCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKKwkJCXJlZyA9IDwweDI2MDAwIDB4MTAwMD47CisJCQlyYW5nZXMgPSA8MHgwIDB4MjYwMDAgMHgxMDAwPjsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwzMSAyIDMyIDIgMzMgMj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCXBoeS1oYW5kbGUgPSA8JnBoeTE+OworCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJyZ21paS1pZCI7CisJCX07CisKKwkJc2RoY2lAMmUwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwMjAtZXNkaGMiLCAiZnNsLGVzZGhjIjsKKwkJCXJlZyA9IDwweDJlMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDcyIDB4Mj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCS8qIEZpbGxlZCBpbiBieSBVLUJvb3QgKi8KKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJfTsKKworCQljcnlwdG9AMzAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjMy4xIiwgImZzbCxzZWMzLjAiLCAiZnNsLHNlYzIuNCIsCisJCQkJICAgICAiZnNsLHNlYzIuMiIsICJmc2wsc2VjMi4xIiwgImZzbCxzZWMyLjAiOworCQkJcmVnID0gPDB4MzAwMDAgMHgxMDAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDQ1IDIgNTggMj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCWZzbCxudW0tY2hhbm5lbHMgPSA8ND47CisJCQlmc2wsY2hhbm5lbC1maWZvLWxlbiA9IDwyND47CisJCQlmc2wsZXhlYy11bml0cy1tYXNrID0gPDB4YmZlPjsKKwkJCWZzbCxkZXNjcmlwdG9yLXR5cGVzLW1hc2sgPSA8MHgzYWIwZWJmPjsKKwkJfTsKKworCQltcGljOiBwaWNANDAwMDAgeworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCQlyZWcgPSA8MHg0MDAwMCAweDQwMDAwPjsKKwkJCWNvbXBhdGlibGUgPSAiY2hycCxvcGVuLXBpYyI7CisJCQlkZXZpY2VfdHlwZSA9ICJvcGVuLXBpYyI7CisJCQlwcm90ZWN0ZWQtc291cmNlcyA9IDwKKwkJCTQyIDc2IDc3IDc4IDc5IC8qIHNlcmlhbDEgLCBkbWEyICovCisJCQkyOSAzMCAzNCAyNiAvKiBlbmV0MCwgcGNpMSAqLworCQkJMHhlMCAweGUxIDB4ZTIgMHhlMyAvKiBtc2kgKi8KKwkJCTB4ZTQgMHhlNSAweGU2IDB4ZTcKKwkJCT47CisJCX07CisKKwkJZ2xvYmFsLXV0aWxpdGllc0BlMDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMjAyMC1ndXRzIjsKKwkJCXJlZyA9IDwweGUwMDAwIDB4MTAwMD47CisJCQlmc2wsaGFzLXJzdGNyOworCQl9OworCX07CisKKwlwY2kwOiBwY2llQGZmZTA5MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1wY2llIjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlyZWcgPSA8MCAweGZmZTA5MDAwIDAgMHgxMDAwPjsKKwkJYnVzLXJhbmdlID0gPDAgMjU1PjsKKwkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhhMDAwMDAwMCAwIDB4YTAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKKwkJCSAgMHgxMDAwMDAwIDB4MCAweDAwMDAwMDAwIDAgMHhmZmMzMDAwMCAweDAgMHgxMDAwMD47CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CisJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQlpbnRlcnJ1cHRzID0gPDI1IDI+OworCQlwY2llQDAgeworCQkJcmVnID0gPDB4MCAweDAgMHgwIDB4MCAweDA+OworCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCWRldmljZV90eXBlID0gInBjaSI7CisJCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGEwMDAwMDAwCisJCQkJICAweDIwMDAwMDAgMHgwIDB4YTAwMDAwMDAKKwkJCQkgIDB4MCAweDIwMDAwMDAwCisKKwkJCQkgIDB4MTAwMDAwMCAweDAgMHgwCisJCQkJICAweDEwMDAwMDAgMHgwIDB4MAorCQkJCSAgMHgwIDB4MTAwMDAwPjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMjAyMHJkYl9jYW1wX2NvcmUxLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMjAyMHJkYl9jYW1wX2NvcmUxLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTVhNTEyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AyMDIwcmRiX2NhbXBfY29yZTEuZHRzCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogUDIwMjAgUkRCIENvcmUxIERldmljZSBUcmVlIFNvdXJjZSBpbiBDQU1QIG1vZGUuCisgKgorICogSW4gQ0FNUCBtb2RlLCBlYWNoIGNvcmUgbmVlZHMgdG8gaGF2ZSBpdHMgb3duIGR0cy4gT25seSBtcGljIGFuZCBMMiBjYWNoZQorICogY2FuIGJlIHNoYXJlZCwgYWxsIHRoZSBvdGhlciBkZXZpY2VzIG11c3QgYmUgYXNzaWduZWQgdG8gb25lIGNvcmUgb25seS4KKyAqIFRoaXMgZHRzIGFsbG93cyBjb3JlMSB0byBoYXZlIGwyLCBkbWEyLCBldGgwLCBwY2kxLCBtc2kuCisgKgorICogUGxlYXNlIG5vdGUgdG8gYWRkICItYiAxIiBmb3IgY29yZTEncyBkdHMgY29tcGlsaW5nLgorICoKKyAqIENvcHlyaWdodCAyMDA5IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKy9kdHMtdjEvOworLyB7CisJbW9kZWwgPSAiZnNsLFAyMDIwIjsKKwljb21wYXRpYmxlID0gImZzbCxQMjAyMFJEQiIsICJmc2wsTVBDODVYWFJEQi1DQU1QIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKworCWFsaWFzZXMgeworCQlldGhlcm5ldDAgPSAmZW5ldDA7CisJCXNlcmlhbDAgPSAmc2VyaWFsMDsKKwkJcGNpMSA9ICZwY2kxOworCX07CisKKwljcHVzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCVBvd2VyUEMsUDIwMjBAMSB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDB4MT47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMj47CisJCX07CisJfTsKKworCW1lbW9yeSB7CisJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CisJfTsKKworCXNvY0BmZmUwMDAwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJZGV2aWNlX3R5cGUgPSAic29jIjsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDIwMjAtaW1tciIsICJzaW1wbGUtYnVzIjsKKwkJcmFuZ2VzID0gPDB4MCAgMHgwIDB4ZmZlMDAwMDAgMHgxMDAwMDA+OworCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gRmlsbGVkIG91dCBieSB1Ym9vdC4KKworCQlzZXJpYWwwOiBzZXJpYWxANDYwMCB7CisJCQljZWxsLWluZGV4ID0gPDE+OworCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKKwkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJfTsKKworCQlkbWFAYzMwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJY29tcGF0aWJsZSA9ICJmc2wsZWxvcGx1cy1kbWEiOworCQkJcmVnID0gPDB4YzMwMCAweDQ+OworCQkJcmFuZ2VzID0gPDB4MCAweGMxMDAgMHgyMDA+OworCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCWRtYS1jaGFubmVsQDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDc2IDI+OworCQkJfTsKKwkJCWRtYS1jaGFubmVsQDgwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHg4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDE+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCWludGVycnVwdHMgPSA8NzcgMj47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAMTAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHgxMDAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwyPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDc4IDI+OworCQkJfTsKKwkJCWRtYS1jaGFubmVsQDE4MCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MTgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8Mz47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQkJaW50ZXJydXB0cyA9IDw3OSAyPjsKKwkJCX07CisJCX07CisKKwkJTDI6IGwyLWNhY2hlLWNvbnRyb2xsZXJAMjAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwMjAtbDItY2FjaGUtY29udHJvbGxlciI7CisJCQlyZWcgPSA8MHgyMDAwMCAweDEwMDA+OworCQkJY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKKwkJCWNhY2hlLXNpemUgPSA8MHg4MDAwMD47IC8vIEwyLDUxMksKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQl9OworCisKKwkJZW5ldDA6IGV0aGVybmV0QDI0MDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljZWxsLWluZGV4ID0gPDA+OworCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7CisJCQltb2RlbCA9ICJlVFNFQyI7CisJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOworCQkJcmVnID0gPDB4MjQwMDAgMHgxMDAwPjsKKwkJCXJhbmdlcyA9IDwweDAgMHgyNDAwMCAweDEwMDA+OworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDI5IDIgMzAgMiAzNCAyPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJZml4ZWQtbGluayA9IDwxIDEgMTAwMCAwIDA+OworCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJyZ21paS1pZCI7CisKKwkJfTsKKworCQltcGljOiBwaWNANDAwMDAgeworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCQlyZWcgPSA8MHg0MDAwMCAweDQwMDAwPjsKKwkJCWNvbXBhdGlibGUgPSAiY2hycCxvcGVuLXBpYyI7CisJCQlkZXZpY2VfdHlwZSA9ICJvcGVuLXBpYyI7CisJCQlwcm90ZWN0ZWQtc291cmNlcyA9IDwKKwkJCTE3IDE4IDQzIDQyIDU5IDQ3IC8qZWNtLCBtZW0sIGkyYywgc2VyaWFsMCwgc3BpLGdwaW8gKi8KKwkJCTE2IDIwIDIxIDIyIDIzIDI4IAkvKiBMMiwgZG1hMSwgVVNCICovCisJCQkwMyAzNSAzNiA0MCAzMSAzMiAzMyAJLyogbWRpbywgZW5ldDEsIGVuZXQyICovCisJCQk3MiA0NSA1OCAyNSAJCS8qIHNkaGNpLCBjcnlwdG8gLCBwY2kgKi8KKwkJCT47CisJCX07CisKKwkJbXNpQDQxNjAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDIwLW1zaSIsICJmc2wsbXBpYy1tc2kiOworCQkJcmVnID0gPDB4NDE2MDAgMHg4MD47CisJCQltc2ktYXZhaWxhYmxlLXJhbmdlcyA9IDwwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8CisJCQkJMHhlMCAwCisJCQkJMHhlMSAwCisJCQkJMHhlMiAwCisJCQkJMHhlMyAwCisJCQkJMHhlNCAwCisJCQkJMHhlNSAwCisJCQkJMHhlNiAwCisJCQkJMHhlNyAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQl9OworCX07CisKKwlwY2kxOiBwY2llQGZmZTBhMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1wY2llIjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlyZWcgPSA8MCAweGZmZTBhMDAwIDAgMHgxMDAwPjsKKwkJYnVzLXJhbmdlID0gPDAgMjU1PjsKKwkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhjMDAwMDAwMCAwIDB4YzAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKKwkJCSAgMHgxMDAwMDAwIDB4MCAweDAwMDAwMDAwIDAgMHhmZmMyMDAwMCAweDAgMHgxMDAwMD47CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CisJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQlpbnRlcnJ1cHRzID0gPDI2IDI+OworCQlwY2llQDAgeworCQkJcmVnID0gPDB4MCAweDAgMHgwIDB4MCAweDA+OworCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCWRldmljZV90eXBlID0gInBjaSI7CisJCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGMwMDAwMDAwCisJCQkJICAweDIwMDAwMDAgMHgwIDB4YzAwMDAwMDAKKwkJCQkgIDB4MCAweDIwMDAwMDAwCisKKwkJCQkgIDB4MTAwMDAwMCAweDAgMHgwCisJCQkJICAweDEwMDAwMDAgMHgwIDB4MAorCQkJCSAgMHgwIDB4MTAwMDAwPjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wNDA4MGRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wNDA4MGRzLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjI5ZWFiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3A0MDgwZHMuZHRzCkBAIC0wLDAgKzEsNTU0IEBACisvKgorICogUDQwODBEUyBEZXZpY2UgVHJlZSBTb3VyY2UKKyAqCisgKiBDb3B5cmlnaHQgMjAwOSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCWl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YJdGhlIEdOVSBHZW5lcmFsCSBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworL2R0cy12MS87CisKKy8geworCW1vZGVsID0gImZzbCxQNDA4MERTIjsKKwljb21wYXRpYmxlID0gImZzbCxQNDA4MERTIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKworCWFsaWFzZXMgeworCQljY3NyID0gJnNvYzsKKworCQlzZXJpYWwwID0gJnNlcmlhbDA7CisJCXNlcmlhbDEgPSAmc2VyaWFsMTsKKwkJc2VyaWFsMiA9ICZzZXJpYWwyOworCQlzZXJpYWwzID0gJnNlcmlhbDM7CisJCXBjaTAgPSAmcGNpMDsKKwkJcGNpMSA9ICZwY2kxOworCQlwY2kyID0gJnBjaTI7CisJCXVzYjAgPSAmdXNiMDsKKwkJdXNiMSA9ICZ1c2IxOworCQlkbWEwID0gJmRtYTA7CisJCWRtYTEgPSAmZG1hMTsKKwkJc2RoYyA9ICZzZGhjOworCisJCXJpbzAgPSAmcmFwaWRpbzA7CisJfTsKKworCWNwdXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJY3B1MDogUG93ZXJQQyw0MDgwQDAgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwwPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzA+OworCQkJTDJfMDogbDItY2FjaGUgeworCQkJfTsKKwkJfTsKKwkJY3B1MTogUG93ZXJQQyw0MDgwQDEgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwxPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzE+OworCQkJTDJfMTogbDItY2FjaGUgeworCQkJfTsKKwkJfTsKKwkJY3B1MjogUG93ZXJQQyw0MDgwQDIgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwyPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzI+OworCQkJTDJfMjogbDItY2FjaGUgeworCQkJfTsKKwkJfTsKKwkJY3B1MzogUG93ZXJQQyw0MDgwQDMgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwzPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzM+OworCQkJTDJfMzogbDItY2FjaGUgeworCQkJfTsKKwkJfTsKKwkJY3B1NDogUG93ZXJQQyw0MDgwQDQgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDw0PjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzQ+OworCQkJTDJfNDogbDItY2FjaGUgeworCQkJfTsKKwkJfTsKKwkJY3B1NTogUG93ZXJQQyw0MDgwQDUgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDw1PjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzU+OworCQkJTDJfNTogbDItY2FjaGUgeworCQkJfTsKKwkJfTsKKwkJY3B1NjogUG93ZXJQQyw0MDgwQDYgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDw2PjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzY+OworCQkJTDJfNjogbDItY2FjaGUgeworCQkJfTsKKwkJfTsKKwkJY3B1NzogUG93ZXJQQyw0MDgwQDcgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDw3PjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzc+OworCQkJTDJfNzogbDItY2FjaGUgeworCQkJfTsKKwkJfTsKKwl9OworCisJbWVtb3J5IHsKKwkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKKwl9OworCisJc29jOiBzb2NAZmZlMDAwMDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQlkZXZpY2VfdHlwZSA9ICJzb2MiOworCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCQlyYW5nZXMgPSA8MHgwMDAwMDAwMCAweGYgMHhmZTAwMDAwMCAweDEwMDAwMDA+OworCQlyZWcgPSA8MHhmIDB4ZmUwMDAwMDAgMCAweDAwMDAxMDAwPjsKKworCQljb3JlbmV0LWxhd0AwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGNvcmVuZXQtbGF3IjsKKwkJCXJlZyA9IDwweDAgMHgxMDAwPjsKKwkJCWZzbCxudW0tbGF3cyA9IDwzMj47CisJCX07CisKKwkJbWVtb3J5LWNvbnRyb2xsZXJAODAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1tZW1vcnktY29udHJvbGxlciI7CisJCQlyZWcgPSA8MHg4MDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCWludGVycnVwdHMgPSA8MHgxMiAyPjsKKwkJfTsKKworCQltZW1vcnktY29udHJvbGxlckA5MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLW1lbW9yeS1jb250cm9sbGVyIjsKKwkJCXJlZyA9IDwweDkwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJaW50ZXJydXB0cyA9IDwweDEyIDI+OworCQl9OworCisJCWNvcmVuZXQtY2ZAMTgwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsY29yZW5ldC1jZiI7CisJCQlyZWcgPSA8MHgxODAwMCAweDEwMDA+OworCQkJZnNsLGNjZi1udW0tY3NkaWRzID0gPDMyPjsKKwkJCWZzbCxjY2YtbnVtLXNub29waWRzID0gPDMyPjsKKwkJfTsKKworCQlpb21tdUAyMDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1wYW11IjsKKwkJCXJlZyA9IDwweDIwMDAwIDB4MTAwMDA+OworCQkJaW50ZXJydXB0cyA9IDwyNCAyPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQl9OworCisJCW1waWM6IHBpY0A0MDAwMCB7CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OworCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwkJCXJlZyA9IDwweDQwMDAwIDB4NDAwMDA+OworCQkJY29tcGF0aWJsZSA9ICJjaHJwLG9wZW4tcGljIjsKKwkJCWRldmljZV90eXBlID0gIm9wZW4tcGljIjsKKwkJfTsKKworCQlkbWEwOiBkbWFAMTAwMzAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1kbWEiLCAiZnNsLGVsb3BsdXMtZG1hIjsKKwkJCXJlZyA9IDwweDEwMDMwMCAweDQ+OworCQkJcmFuZ2VzID0gPDB4MCAweDEwMDEwMCAweDIwMD47CisJCQljZWxsLWluZGV4ID0gPDA+OworCQkJZG1hLWNoYW5uZWxAMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtZG1hLWNoYW5uZWwiLAorCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQkJaW50ZXJydXB0cyA9IDwyOCAyPjsKKwkJCX07CisJCQlkbWEtY2hhbm5lbEA4MCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtZG1hLWNoYW5uZWwiLAorCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHg4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDE+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCWludGVycnVwdHMgPSA8MjkgMj47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAMTAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1kbWEtY2hhbm5lbCIsCisJCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDEwMCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDI+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCWludGVycnVwdHMgPSA8MzAgMj47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAMTgwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1kbWEtY2hhbm5lbCIsCisJCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDE4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDM+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCWludGVycnVwdHMgPSA8MzEgMj47CisJCQl9OworCQl9OworCisJCWRtYTE6IGRtYUAxMDEzMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWRtYSIsICJmc2wsZWxvcGx1cy1kbWEiOworCQkJcmVnID0gPDB4MTAxMzAwIDB4ND47CisJCQlyYW5nZXMgPSA8MHgwIDB4MTAxMTAwIDB4MjAwPjsKKwkJCWNlbGwtaW5kZXggPSA8MT47CisJCQlkbWEtY2hhbm5lbEAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1kbWEtY2hhbm5lbCIsCisJCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDMyIDI+OworCQkJfTsKKwkJCWRtYS1jaGFubmVsQDgwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1kbWEtY2hhbm5lbCIsCisJCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MT47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQkJaW50ZXJydXB0cyA9IDwzMyAyPjsKKwkJCX07CisJCQlkbWEtY2hhbm5lbEAxMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWRtYS1jaGFubmVsIiwKKwkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MTAwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8Mj47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQkJaW50ZXJydXB0cyA9IDwzNCAyPjsKKwkJCX07CisJCQlkbWEtY2hhbm5lbEAxODAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWRtYS1jaGFubmVsIiwKKwkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MTgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8Mz47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQkJaW50ZXJydXB0cyA9IDwzNSAyPjsKKwkJCX07CisJCX07CisKKwkJc3BpQDExMDAwMCB7CisJCQljZWxsLWluZGV4ID0gPDA+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGVzcGkiOworCQkJcmVnID0gPDB4MTEwMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDUzIDB4Mj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCWVzcGksbnVtLXNzLWJpdHMgPSA8ND47CisJCQltb2RlID0gImNwdSI7CisKKwkJCWZzbF9tMjVwODBAMCB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsZXNwaS1mbGFzaCI7CisJCQkJcmVnID0gPDA+OworCQkJCWxpbnV4LG1vZGFsaWFzID0gImZzbF9tMjVwODAiOworCQkJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDQwMDAwMDAwPjsgLyogaW5wdXQgY2xvY2sgKi8KKwkJCQlwYXJ0aXRpb25AdS1ib290IHsKKwkJCQkJbGFiZWwgPSAidS1ib290IjsKKwkJCQkJcmVnID0gPDB4MDAwMDAwMDAgMHgwMDEwMDAwMD47CisJCQkJCXJlYWQtb25seTsKKwkJCQl9OworCQkJCXBhcnRpdGlvbkBrZXJuZWwgeworCQkJCQlsYWJlbCA9ICJrZXJuZWwiOworCQkJCQlyZWcgPSA8MHgwMDEwMDAwMCAweDAwNTAwMDAwPjsKKwkJCQkJcmVhZC1vbmx5OworCQkJCX07CisJCQkJcGFydGl0aW9uQGR0YiB7CisJCQkJCWxhYmVsID0gImR0YiI7CisJCQkJCXJlZyA9IDwweDAwNjAwMDAwIDB4MDAxMDAwMDA+OworCQkJCQlyZWFkLW9ubHk7CisJCQkJfTsKKwkJCQlwYXJ0aXRpb25AZnMgeworCQkJCQlsYWJlbCA9ICJmaWxlIHN5c3RlbSI7CisJCQkJCXJlZyA9IDwweDAwNzAwMDAwIDB4MDA5MDAwMDA+OworCQkJCX07CisJCQl9OworCQl9OworCisJCXNkaGM6IHNkaGNAMTE0MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWVzZGhjIiwgImZzbCxlc2RoYyI7CisJCQlyZWcgPSA8MHgxMTQwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8NDggMj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJfTsKKworCQlpMmNAMTE4MDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljZWxsLWluZGV4ID0gPDA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKKwkJCXJlZyA9IDwweDExODAwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDM4IDI+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlkZnNycjsKKwkJfTsKKworCQlpMmNAMTE4MTAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljZWxsLWluZGV4ID0gPDE+OworCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKKwkJCXJlZyA9IDwweDExODEwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDM4IDI+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlkZnNycjsKKwkJCWVlcHJvbUA1MSB7CisJCQkJY29tcGF0aWJsZSA9ICJhdDI0LDI0YzI1NiI7CisJCQkJcmVnID0gPDB4NTE+OworCQkJfTsKKwkJCWVlcHJvbUA1MiB7CisJCQkJY29tcGF0aWJsZSA9ICJhdDI0LDI0YzI1NiI7CisJCQkJcmVnID0gPDB4NTI+OworCQkJfTsKKwkJCXJ0Y0A2OCB7CisJCQkJY29tcGF0aWJsZSA9ICJkYWxsYXMsZHMzMjMyIjsKKwkJCQlyZWcgPSA8MHg2OD47CisJCQkJaW50ZXJydXB0cyA9IDwwIDB4MT47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQl9OworCQl9OworCisJCWkyY0AxMTkwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNlbGwtaW5kZXggPSA8Mj47CisJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOworCQkJcmVnID0gPDB4MTE5MDAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MzkgMj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCWRmc3JyOworCQl9OworCisJCWkyY0AxMTkxMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNlbGwtaW5kZXggPSA8Mz47CisJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOworCQkJcmVnID0gPDB4MTE5MTAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MzkgMj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCWRmc3JyOworCQl9OworCisJCXNlcmlhbDA6IHNlcmlhbEAxMWM1MDAgeworCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJcmVnID0gPDB4MTFjNTAwIDB4MTAwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWludGVycnVwdHMgPSA8MzYgMj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJfTsKKworCQlzZXJpYWwxOiBzZXJpYWxAMTFjNjAwIHsKKwkJCWNlbGwtaW5kZXggPSA8MT47CisJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCXJlZyA9IDwweDExYzYwMCAweDEwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDM2IDI+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCX07CisKKwkJc2VyaWFsMjogc2VyaWFsQDExZDUwMCB7CisJCQljZWxsLWluZGV4ID0gPDI+OworCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKKwkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQlyZWcgPSA8MHgxMWQ1MDAgMHgxMDA+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQkJaW50ZXJydXB0cyA9IDwzNyAyPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQl9OworCisJCXNlcmlhbDM6IHNlcmlhbEAxMWQ2MDAgeworCQkJY2VsbC1pbmRleCA9IDwzPjsKKwkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJcmVnID0gPDB4MTFkNjAwIDB4MTAwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWludGVycnVwdHMgPSA8MzcgMj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJfTsKKworCQlncGlvMDogZ3Bpb0AxMzAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtZ3BpbyI7CisJCQlyZWcgPSA8MHgxMzAwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8NTUgMj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJZ3Bpby1jb250cm9sbGVyOworCQl9OworCisJCXVzYjA6IHVzYkAyMTAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtdXNiMi1tcGgiLAorCQkJCQkiZnNsLG1wYzg1eHgtdXNiMi1tcGgiLCAiZnNsLXVzYjItbXBoIjsKKwkJCXJlZyA9IDwweDIxMDAwMCAweDEwMDA+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJaW50ZXJydXB0cyA9IDw0NCAweDI+OworCQkJcGh5X3R5cGUgPSAidWxwaSI7CisJCX07CisKKwkJdXNiMTogdXNiQDIxMTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC11c2IyLWRyIiwKKwkJCQkJImZzbCxtcGM4NXh4LXVzYjItZHIiLCAiZnNsLXVzYjItZHIiOworCQkJcmVnID0gPDB4MjExMDAwIDB4MTAwMD47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlpbnRlcnJ1cHRzID0gPDQ1IDB4Mj47CisJCQlkcl9tb2RlID0gImhvc3QiOworCQkJcGh5X3R5cGUgPSAidWxwaSI7CisJCX07CisJfTsKKworCXJhcGlkaW8wOiByYXBpZGlvQGZmZTBjMDAwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJY29tcGF0aWJsZSA9ICJmc2wscmFwaWRpby1kZWx0YSI7CisJCXJlZyA9IDwweGYgMHhmZTBjMDAwMCAwIDB4MjAwMDA+OworCQlyYW5nZXMgPSA8MCAwIDB4ZiAweGY1MDAwMDAwIDAgMHgwMTAwMDAwMD47CisJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkvKiBlcnJfaXJxIGJlbGxfb3V0Yl9pcnEgYmVsbF9pbmJfaXJxCisJCQltc2cxX3R4X2lycSBtc2cxX3J4X2lycQltc2cyX3R4X2lycSBtc2cyX3J4X2lycSAqLworCQlpbnRlcnJ1cHRzID0gPDE2IDIgNTYgMiA1NyAyIDYwIDIgNjEgMiA2MiAyIDYzIDI+OworCX07CisKKwlsb2NhbGJ1c0BmZmUxMjQwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1lbGJjIiwgImZzbCxlbGJjIiwgInNpbXBsZS1idXMiOworCQlyZWcgPSA8MHhmIDB4ZmUxMjQwMDAgMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDI1IDI+OworCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisKKwkJcmFuZ2VzID0gPDAgMCAweGYgMHhlODAwMDAwMCAweDA4MDAwMDAwPjsKKworCQlmbGFzaEAwLDAgeworCQkJY29tcGF0aWJsZSA9ICJjZmktZmxhc2giOworCQkJcmVnID0gPDAgMCAweDA4MDAwMDAwPjsKKwkJCWJhbmstd2lkdGggPSA8Mj47CisJCQlkZXZpY2Utd2lkdGggPSA8Mj47CisJCX07CisJfTsKKworCXBjaTA6IHBjaWVAZmZlMjAwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtcGNpZSI7CisJCWRldmljZV90eXBlID0gInBjaSI7CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJcmVnID0gPDB4ZiAweGZlMjAwMDAwIDAgMHgxMDAwPjsKKwkJYnVzLXJhbmdlID0gPDB4MCAweGZmPjsKKwkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwIDB4YyAweDAwMDAwMDAwIDB4MCAweDIwMDAwMDAwCisJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwIDB4ZiAweGY4MDAwMDAwIDB4MCAweDAwMDEwMDAwPjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDB4MWZjYTA1NT47CisJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQlpbnRlcnJ1cHRzID0gPDE2IDI+OworCisJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OworCQlpbnRlcnJ1cHQtbWFwID0gPAorCQkJLyogSURTRUwgMHgwICovCisJCQkwMDAwIDAgMCAxICZtcGljIDQwIDEKKwkJCTAwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkwMDAwIDAgMCAzICZtcGljIDIgMQorCQkJMDAwMCAwIDAgNCAmbXBpYyAzIDEKKwkJCT47CisJCXBjaWVAMCB7CisJCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJCSNzaXplLWNlbGxzID0gPDI+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCisJCQkJICAweDAyMDAwMDAwIDAgMHhlMDAwMDAwMAorCQkJCSAgMCAweDIwMDAwMDAwCisKKwkJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwCisJCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMAorCQkJCSAgMCAweDAwMDEwMDAwPjsKKwkJfTsKKwl9OworCisJcGNpMTogcGNpZUBmZmUyMDEwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1wY2llIjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlyZWcgPSA8MHhmIDB4ZmUyMDEwMDAgMCAweDEwMDA+OworCQlidXMtcmFuZ2UgPSA8MCAweGZmPjsKKwkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMHgwIDB4ZTAwMDAwMDAgMHhjIDB4MjAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKKwkJCSAgMHgwMTAwMDAwMCAweDAgMHgwMDAwMDAwMCAweGYgMHhmODAxMDAwMCAweDAgMHgwMDAxMDAwMD47CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwweDFmY2EwNTU+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyPjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisJCWludGVycnVwdC1tYXAgPSA8CisJCQkvKiBJRFNFTCAweDAgKi8KKwkJCTAwMDAgMCAwIDEgJm1waWMgNDEgMQorCQkJMDAwMCAwIDAgMiAmbXBpYyA1IDEKKwkJCTAwMDAgMCAwIDMgJm1waWMgNiAxCisJCQkwMDAwIDAgMCA0ICZtcGljIDcgMQorCQkJPjsKKwkJcGNpZUAwIHsKKwkJCXJlZyA9IDwwIDAgMCAwIDA+OworCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCWRldmljZV90eXBlID0gInBjaSI7CisJCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKKwkJCQkgIDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCisJCQkJICAwIDB4MjAwMDAwMDAKKworCQkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAKKwkJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwCisJCQkJICAwIDB4MDAwMTAwMDA+OworCQl9OworCX07CisKKwlwY2kyOiBwY2llQGZmZTIwMjAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLXBjaWUiOworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCXJlZyA9IDwweGYgMHhmZTIwMjAwMCAwIDB4MTAwMD47CisJCWJ1cy1yYW5nZSA9IDwweDAgMHhmZj47CisJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhlMDAwMDAwMCAweGMgMHg0MDAwMDAwMCAwIDB4MjAwMDAwMDAKKwkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAgMHhmIDB4ZjgwMjAwMDAgMCAweDAwMDEwMDAwPjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDB4MWZjYTA1NT47CisJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQlpbnRlcnJ1cHRzID0gPDE2IDI+OworCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKKwkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCS8qIElEU0VMIDB4MCAqLworCQkJMDAwMCAwIDAgMSAmbXBpYyA0MiAxCisJCQkwMDAwIDAgMCAyICZtcGljIDkgMQorCQkJMDAwMCAwIDAgMyAmbXBpYyAxMCAxCisJCQkwMDAwIDAgMCA0ICZtcGljIDExIDEKKwkJCT47CisJCXBjaWVAMCB7CisJCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJCSNzaXplLWNlbGxzID0gPDI+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCisJCQkJICAweDAyMDAwMDAwIDAgMHhlMDAwMDAwMAorCQkJCSAgMCAweDIwMDAwMDAwCisKKwkJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwCisJCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMAorCQkJCSAgMCAweDAwMDEwMDAwPjsKKwkJfTsKKwl9OworCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3JlZHdvb2QuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3JlZHdvb2QuZHRzCmluZGV4IGFkNDAyYzQuLmQyYWYzMmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9yZWR3b29kLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcmVkd29vZC5kdHMKQEAgLTIyNiw2ICsyMjYsNyBAQAogCQkJCW1heC1mcmFtZS1zaXplID0gPDkwMDA+OwogCQkJCXJ4LWZpZm8tc2l6ZSA9IDw0MDk2PjsKIAkJCQl0eC1maWZvLXNpemUgPSA8MjA0OD47CisJCQkJcngtZmlmby1zaXplLWdpZ2UgPSA8MTYzODQ+OwogCQkJCXBoeS1tb2RlID0gInJnbWlpIjsKIAkJCQlwaHktbWFwID0gPDB4MDAwMDAwMDA+OwogCQkJCXJnbWlpLWRldmljZSA9IDwmUkdNSUkwPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy95b3NlbWl0ZS5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMveW9zZW1pdGUuZHRzCmluZGV4IDFmYTNjYjQuLjY0OTIzMjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy95b3NlbWl0ZS5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3lvc2VtaXRlLmR0cwpAQCAtMjgyLDIwICsyODIsMTAgQEAKIAkJCS8qIEluYm91bmQgMkdCIHJhbmdlIHN0YXJ0aW5nIGF0IDAgKi8KIAkJCWRtYS1yYW5nZXMgPSA8MHg0MjAwMDAwMCAweDAgMHgwIDB4MCAweDAgMHgwIDB4ODAwMDAwMDA+OwogCi0JCQkvKiBCYW1ib28gaGFzIGFsbCA0IElSUSBwaW5zIHRpZWQgdG9nZXRoZXIgcGVyIHNsb3QgKi8KIAkJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMHgwIDB4MCAweDA+OwogCQkJaW50ZXJydXB0LW1hcCA9IDwKLQkJCQkvKiBJRFNFTCAxICovCi0JCQkJMHg4MDAgMHgwIDB4MCAweDAgJlVJQzAgMHgxYyAweDgKLQotCQkJCS8qIElEU0VMIDIgKi8KLQkJCQkweDEwMDAgMHgwIDB4MCAweDAgJlVJQzAgMHgxYiAweDgKLQotCQkJCS8qIElEU0VMIDMgKi8KLQkJCQkweDE4MDAgMHgwIDB4MCAweDAgJlVJQzAgMHgxYSAweDgKLQotCQkJCS8qIElEU0VMIDQgKi8KLQkJCQkweDIwMDAgMHgwIDB4MCAweDAgJlVJQzAgMHgxOSAweDgKKwkJCQkvKiBJRFNFTCAxMiAqLworCQkJCTB4NjAwMCAweDAgMHgwIDB4MCAmVUlDMCAweDE5IDB4OAogCQkJPjsKIAkJfTsKIAl9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODZ4eC9nZWZfcHBjOWFfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODZ4eC9nZWZfcHBjOWFfZGVmY29uZmlnCmluZGV4IDI4OTgwNzMuLjZjZDJjZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzg2eHgvZ2VmX3BwYzlhX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84Nnh4L2dlZl9wcGM5YV9kZWZjb25maWcKQEAgLTIxOCw3ICsyMTgsNyBAQAogIyBDT05GSUdfTVBJQ19XRUlSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfSTgyNTkgaXMgbm90IHNldAogIyBDT05GSUdfUFBDX1JUQVMgaXMgbm90IHNldAotIyBDT05GSUdfTU1JT19OVlJBTSBpcyBub3Qgc2V0CitDT05GSUdfTU1JT19OVlJBTT15CiAjIENPTkZJR19QUENfTVBDMTA2IGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ185NzBfTkFQIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ19JTkRJUkVDVF9JTyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy84Nnh4L2dlZl9zYmMzMTBfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODZ4eC9nZWZfc2JjMzEwX2RlZmNvbmZpZwppbmRleCBlMTk5ZDFjLi5hNmEzNzY4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy84Nnh4L2dlZl9zYmMzMTBfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg2eHgvZ2VmX3NiYzMxMF9kZWZjb25maWcKQEAgLTIxOCw3ICsyMTgsNyBAQAogIyBDT05GSUdfTVBJQ19XRUlSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfSTgyNTkgaXMgbm90IHNldAogIyBDT05GSUdfUFBDX1JUQVMgaXMgbm90IHNldAotIyBDT05GSUdfTU1JT19OVlJBTSBpcyBub3Qgc2V0CitDT05GSUdfTU1JT19OVlJBTT15CiAjIENPTkZJR19QUENfTVBDMTA2IGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ185NzBfTkFQIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ19JTkRJUkVDVF9JTyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy84Nnh4L2dlZl9zYmM2MTBfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODZ4eC9nZWZfc2JjNjEwX2RlZmNvbmZpZwppbmRleCAzYjBmYmZiLi4xOTc1ZDQxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy84Nnh4L2dlZl9zYmM2MTBfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg2eHgvZ2VmX3NiYzYxMF9kZWZjb25maWcKQEAgLTIxOSw3ICsyMTksNyBAQAogIyBDT05GSUdfTVBJQ19XRUlSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfSTgyNTkgaXMgbm90IHNldAogIyBDT05GSUdfUFBDX1JUQVMgaXMgbm90IHNldAotIyBDT05GSUdfTU1JT19OVlJBTSBpcyBub3Qgc2V0CitDT05GSUdfTU1JT19OVlJBTT15CiAjIENPTkZJR19QUENfTVBDMTA2IGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ185NzBfTkFQIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ19JTkRJUkVDVF9JTyBpcyBub3Qgc2V0CkBAIC0xMTI0LDcgKzExMjQsNyBAQAogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKIENPTkZJR19IV19SQU5ET009eQogIyBDT05GSUdfSFdfUkFORE9NX1RJTUVSSU9NRU0gaXMgbm90IHNldAotIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorQ09ORklHX05WUkFNPXkKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKICMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwbS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwbS5oCmluZGV4IDI0ZDc5ZTMuLjA4MzVlYjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcG0uaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3BtLmgKQEAgLTMsOCArMyw0NyBAQAogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KIAorLyoKKyAqIFVTQiBDb250cm9sbGVyIHByYW0gY29tbW9uIHRvIFFFIGFuZCBDUE0uCisgKi8KK3N0cnVjdCB1c2JfY3RsciB7CisJdTgJdXNiX3VzbW9kOworCXU4CXVzYl91c2FkcjsKKwl1OAl1c2JfdXNjb207CisJdTgJcmVzMVsxXTsKKwlfX2JlMTYJdXNiX3VzZXBbNF07CisJdTgJcmVzMls0XTsKKwlfX2JlMTYJdXNiX3VzYmVyOworCXU4CXJlczNbMl07CisJX19iZTE2CXVzYl91c2JtcjsKKwl1OAlyZXM0WzFdOworCXU4CXVzYl91c2JzOworCS8qIEZpZWxkcyBkb3duIGJlbG93IGFyZSBRRS1vbmx5ICovCisJX19iZTE2CXVzYl91c3NmdDsKKwl1OAlyZXM1WzJdOworCV9fYmUxNgl1c2JfdXNmcm47CisJdTgJcmVzNlsweDIyXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKgorICogRnVuY3Rpb24gY29kZSBiaXRzLCB1c3VhbGx5IGdlbmVyaWMgdG8gZGV2aWNlcy4KKyAqLworI2lmZGVmIENPTkZJR19DUE0xCisjZGVmaW5lIENQTUZDUl9HQkwJKCh1X2NoYXIpMHgwMCkJLyogRmxhZyBkb2Vzbid0IGV4aXN0IGluIENQTTEgKi8KKyNkZWZpbmUgQ1BNRkNSX1RDMgkoKHVfY2hhcikweDAwKQkvKiBGbGFnIGRvZXNuJ3QgZXhpc3QgaW4gQ1BNMSAqLworI2RlZmluZSBDUE1GQ1JfRFRCCSgodV9jaGFyKTB4MDApCS8qIEZsYWcgZG9lc24ndCBleGlzdCBpbiBDUE0xICovCisjZGVmaW5lIENQTUZDUl9CREIJKCh1X2NoYXIpMHgwMCkJLyogRmxhZyBkb2Vzbid0IGV4aXN0IGluIENQTTEgKi8KKyNlbHNlCisjZGVmaW5lIENQTUZDUl9HQkwJKCh1X2NoYXIpMHgyMCkJLyogU2V0IG1lbW9yeSBzbm9vcGluZyAqLworI2RlZmluZSBDUE1GQ1JfVEMyCSgodV9jaGFyKTB4MDQpCS8qIFRyYW5zZmVyIGNvZGUgMiB2YWx1ZSAqLworI2RlZmluZSBDUE1GQ1JfRFRCCSgodV9jaGFyKTB4MDIpCS8qIFVzZSBsb2NhbCBidXMgZm9yIGRhdGEgd2hlbiBzZXQgKi8KKyNkZWZpbmUgQ1BNRkNSX0JEQgkoKHVfY2hhcikweDAxKQkvKiBVc2UgbG9jYWwgYnVzIGZvciBCRCB3aGVuIHNldCAqLworI2VuZGlmCisjZGVmaW5lIENQTUZDUl9FQgkoKHVfY2hhcikweDEwKQkvKiBTZXQgYmlnIGVuZGlhbiBieXRlIG9yZGVyICovCisKIC8qIE9wY29kZXMgY29tbW9uIHRvIENQTTEgYW5kIENQTTIKICovCiAjZGVmaW5lIENQTV9DUl9JTklUX1RSWAkJKCh1c2hvcnQpMHgwMDAwKQpAQCAtOTMsMTMgKzEzMiw1NiBAQAogI2RlZmluZSBCRF9JMkNfU1RBUlQJCSgweDA0MDApCiAKIGludCBjcG1fbXVyYW1faW5pdCh2b2lkKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0NQTSkgfHwgZGVmaW5lZChDT05GSUdfUVVJQ0NfRU5HSU5FKQogdW5zaWduZWQgbG9uZyBjcG1fbXVyYW1fYWxsb2ModW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGFsaWduKTsKIGludCBjcG1fbXVyYW1fZnJlZSh1bnNpZ25lZCBsb25nIG9mZnNldCk7CiB1bnNpZ25lZCBsb25nIGNwbV9tdXJhbV9hbGxvY19maXhlZCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplKTsKIHZvaWQgX19pb21lbSAqY3BtX211cmFtX2FkZHIodW5zaWduZWQgbG9uZyBvZmZzZXQpOwogdW5zaWduZWQgbG9uZyBjcG1fbXVyYW1fb2Zmc2V0KHZvaWQgX19pb21lbSAqYWRkcik7CiBkbWFfYWRkcl90IGNwbV9tdXJhbV9kbWEodm9pZCBfX2lvbWVtICphZGRyKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY3BtX211cmFtX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWxpZ24pCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNwbV9tdXJhbV9mcmVlKHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXJldHVybiAtRU5PU1lTOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY3BtX211cmFtX2FsbG9jX2ZpeGVkKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCQkJICB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICpjcG1fbXVyYW1fYWRkcih1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNwbV9tdXJhbV9vZmZzZXQodm9pZCBfX2lvbWVtICphZGRyKQoreworCXJldHVybiAtRU5PU1lTOworfQorCitzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgY3BtX211cmFtX2RtYSh2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfQ1BNKSB8fCBkZWZpbmVkKENPTkZJR19RVUlDQ19FTkdJTkUpICovCisKKyNpZmRlZiBDT05GSUdfQ1BNCiBpbnQgY3BtX2NvbW1hbmQodTMyIGNvbW1hbmQsIHU4IG9wY29kZSk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgY3BtX2NvbW1hbmQodTMyIGNvbW1hbmQsIHU4IG9wY29kZSkKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKyNlbmRpZiAvKiBDT05GSUdfQ1BNICovCiAKIGludCBjcG0yX2dwaW9jaGlwX2FkZDMyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3BtMS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwbTEuaAppbmRleCA3Njg1ZmZkLi44MWIwMTE5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3BtMS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcG0xLmgKQEAgLTQ3OCw1MSArNDc4LDYgQEAKIAljaGFyCXJlczJbMl07CS8qIFJlc2VydmVkICovCiB9IGlpY190OwogCi0vKiBTUEkgcGFyYW1ldGVyIFJBTS4KLSovCi10eXBlZGVmIHN0cnVjdCBzcGkgewotCXVzaG9ydAlzcGlfcmJhc2U7CS8qIFJ4IEJ1ZmZlciBkZXNjcmlwdG9yIGJhc2UgYWRkcmVzcyAqLwotCXVzaG9ydAlzcGlfdGJhc2U7CS8qIFR4IEJ1ZmZlciBkZXNjcmlwdG9yIGJhc2UgYWRkcmVzcyAqLwotCXVfY2hhcglzcGlfcmZjcjsJLyogUnggZnVuY3Rpb24gY29kZSAqLwotCXVfY2hhcglzcGlfdGZjcjsJLyogVHggZnVuY3Rpb24gY29kZSAqLwotCXVzaG9ydAlzcGlfbXJibHI7CS8qIE1heCByZWNlaXZlIGJ1ZmZlciBsZW5ndGggKi8KLQl1aW50CXNwaV9yc3RhdGU7CS8qIEludGVybmFsICovCi0JdWludAlzcGlfcmRwOwkvKiBJbnRlcm5hbCAqLwotCXVzaG9ydAlzcGlfcmJwdHI7CS8qIEludGVybmFsICovCi0JdXNob3J0CXNwaV9yYmM7CS8qIEludGVybmFsICovCi0JdWludAlzcGlfcnh0bXA7CS8qIEludGVybmFsICovCi0JdWludAlzcGlfdHN0YXRlOwkvKiBJbnRlcm5hbCAqLwotCXVpbnQJc3BpX3RkcDsJLyogSW50ZXJuYWwgKi8KLQl1c2hvcnQJc3BpX3RicHRyOwkvKiBJbnRlcm5hbCAqLwotCXVzaG9ydAlzcGlfdGJjOwkvKiBJbnRlcm5hbCAqLwotCXVpbnQJc3BpX3R4dG1wOwkvKiBJbnRlcm5hbCAqLwotCXVpbnQJc3BpX3JlczsKLQl1c2hvcnQJc3BpX3JwYmFzZTsJLyogUmVsb2NhdGlvbiBwb2ludGVyICovCi0JdXNob3J0CXNwaV9yZXMyOwotfSBzcGlfdDsKLQotLyogU1BJIE1vZGUgcmVnaXN0ZXIuCi0qLwotI2RlZmluZSBTUE1PREVfTE9PUAkoKHVzaG9ydCkweDQwMDApCS8qIExvb3BiYWNrICovCi0jZGVmaW5lIFNQTU9ERV9DSQkoKHVzaG9ydCkweDIwMDApCS8qIENsb2NrIEludmVydCAqLwotI2RlZmluZSBTUE1PREVfQ1AJKCh1c2hvcnQpMHgxMDAwKQkvKiBDbG9jayBQaGFzZSAqLwotI2RlZmluZSBTUE1PREVfRElWMTYJKCh1c2hvcnQpMHgwODAwKQkvKiBCUkcvMTYgbW9kZSAqLwotI2RlZmluZSBTUE1PREVfUkVWCSgodXNob3J0KTB4MDQwMCkJLyogUmV2ZXJzZWQgRGF0YSAqLwotI2RlZmluZSBTUE1PREVfTVNUUgkoKHVzaG9ydCkweDAyMDApCS8qIFNQSSBNYXN0ZXIgKi8KLSNkZWZpbmUgU1BNT0RFX0VOCSgodXNob3J0KTB4MDEwMCkJLyogRW5hYmxlICovCi0jZGVmaW5lIFNQTU9ERV9MRU5NU0sJKCh1c2hvcnQpMHgwMGYwKQkvKiBjaGFyYWN0ZXIgbGVuZ3RoICovCi0jZGVmaW5lIFNQTU9ERV9MRU40CSgodXNob3J0KTB4MDAzMCkJLyogIDQgYml0cyBwZXIgY2hhciAqLwotI2RlZmluZSBTUE1PREVfTEVOOAkoKHVzaG9ydCkweDAwNzApCS8qICA4IGJpdHMgcGVyIGNoYXIgKi8KLSNkZWZpbmUgU1BNT0RFX0xFTjE2CSgodXNob3J0KTB4MDBmMCkJLyogMTYgYml0cyBwZXIgY2hhciAqLwotI2RlZmluZSBTUE1PREVfUE1NU0sJKCh1c2hvcnQpMHgwMDBmKQkvKiBwcmVzY2FsZSBtb2R1bHVzICovCi0KLS8qIFNQSUUgZmllbGRzICovCi0jZGVmaW5lIFNQSUVfTU1FCTB4MjAKLSNkZWZpbmUgU1BJRV9UWEUJMHgxMAotI2RlZmluZSBTUElFX0JTWQkweDA0Ci0jZGVmaW5lIFNQSUVfVFhCCTB4MDIKLSNkZWZpbmUgU1BJRV9SWEIJMHgwMQotCiAvKgogICogUklTQyBDb250cm9sbGVyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgZGVmaW5pdG9ucwogICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3BtMi5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwbTIuaAppbmRleCA5OTBmZjE5Li5mNDJlOWJhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3BtMi5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcG0yLmgKQEAgLTEyNCwxNCArMTI0LDYgQEAKIAlfX2NwbTJfc2V0YnJnKGJyZywgcmF0ZSwgQ1BNMl9CUkdfSU5UX0NMSywgZGl2MTYsIENQTV9CUkdfRVhUQ19JTlQpOwogfQogCi0vKiBGdW5jdGlvbiBjb2RlIGJpdHMsIHVzdWFsbHkgZ2VuZXJpYyB0byBkZXZpY2VzLgotKi8KLSNkZWZpbmUgQ1BNRkNSX0dCTAkoKHVfY2hhcikweDIwKQkvKiBTZXQgbWVtb3J5IHNub29waW5nICovCi0jZGVmaW5lIENQTUZDUl9FQgkoKHVfY2hhcikweDEwKQkvKiBTZXQgYmlnIGVuZGlhbiBieXRlIG9yZGVyICovCi0jZGVmaW5lIENQTUZDUl9UQzIJKCh1X2NoYXIpMHgwNCkJLyogVHJhbnNmZXIgY29kZSAyIHZhbHVlICovCi0jZGVmaW5lIENQTUZDUl9EVEIJKCh1X2NoYXIpMHgwMikJLyogVXNlIGxvY2FsIGJ1cyBmb3IgZGF0YSB3aGVuIHNldCAqLwotI2RlZmluZSBDUE1GQ1JfQkRCCSgodV9jaGFyKTB4MDEpCS8qIFVzZSBsb2NhbCBidXMgZm9yIEJEIHdoZW4gc2V0ICovCi0KIC8qIFBhcmFtZXRlciBSQU0gb2Zmc2V0cyBmcm9tIHRoZSBiYXNlLgogKi8KICNkZWZpbmUgUFJPRkZfU0NDMQkJKCh1aW50KTB4ODAwMCkKQEAgLTY1NCw0NSArNjQ2LDYgQEAKIAl1aW50CWlpY190eHRtcDsJLyogSW50ZXJuYWwgKi8KIH0gaWljX3Q7CiAKLS8qIFNQSSBwYXJhbWV0ZXIgUkFNLgotKi8KLXR5cGVkZWYgc3RydWN0IHNwaSB7Ci0JdXNob3J0CXNwaV9yYmFzZTsJLyogUnggQnVmZmVyIGRlc2NyaXB0b3IgYmFzZSBhZGRyZXNzICovCi0JdXNob3J0CXNwaV90YmFzZTsJLyogVHggQnVmZmVyIGRlc2NyaXB0b3IgYmFzZSBhZGRyZXNzICovCi0JdV9jaGFyCXNwaV9yZmNyOwkvKiBSeCBmdW5jdGlvbiBjb2RlICovCi0JdV9jaGFyCXNwaV90ZmNyOwkvKiBUeCBmdW5jdGlvbiBjb2RlICovCi0JdXNob3J0CXNwaV9tcmJscjsJLyogTWF4IHJlY2VpdmUgYnVmZmVyIGxlbmd0aCAqLwotCXVpbnQJc3BpX3JzdGF0ZTsJLyogSW50ZXJuYWwgKi8KLQl1aW50CXNwaV9yZHA7CS8qIEludGVybmFsICovCi0JdXNob3J0CXNwaV9yYnB0cjsJLyogSW50ZXJuYWwgKi8KLQl1c2hvcnQJc3BpX3JiYzsJLyogSW50ZXJuYWwgKi8KLQl1aW50CXNwaV9yeHRtcDsJLyogSW50ZXJuYWwgKi8KLQl1aW50CXNwaV90c3RhdGU7CS8qIEludGVybmFsICovCi0JdWludAlzcGlfdGRwOwkvKiBJbnRlcm5hbCAqLwotCXVzaG9ydAlzcGlfdGJwdHI7CS8qIEludGVybmFsICovCi0JdXNob3J0CXNwaV90YmM7CS8qIEludGVybmFsICovCi0JdWludAlzcGlfdHh0bXA7CS8qIEludGVybmFsICovCi0JdWludAlzcGlfcmVzOwkvKiBUeCB0ZW1wLiAqLwotCXVpbnQJc3BpX3JlczFbNF07CS8qIFNETUEgdGVtcC4gKi8KLX0gc3BpX3Q7Ci0KLS8qIFNQSSBNb2RlIHJlZ2lzdGVyLgotKi8KLSNkZWZpbmUgU1BNT0RFX0xPT1AJKCh1c2hvcnQpMHg0MDAwKQkvKiBMb29wYmFjayAqLwotI2RlZmluZSBTUE1PREVfQ0kJKCh1c2hvcnQpMHgyMDAwKQkvKiBDbG9jayBJbnZlcnQgKi8KLSNkZWZpbmUgU1BNT0RFX0NQCSgodXNob3J0KTB4MTAwMCkJLyogQ2xvY2sgUGhhc2UgKi8KLSNkZWZpbmUgU1BNT0RFX0RJVjE2CSgodXNob3J0KTB4MDgwMCkJLyogQlJHLzE2IG1vZGUgKi8KLSNkZWZpbmUgU1BNT0RFX1JFVgkoKHVzaG9ydCkweDA0MDApCS8qIFJldmVyc2VkIERhdGEgKi8KLSNkZWZpbmUgU1BNT0RFX01TVFIJKCh1c2hvcnQpMHgwMjAwKQkvKiBTUEkgTWFzdGVyICovCi0jZGVmaW5lIFNQTU9ERV9FTgkoKHVzaG9ydCkweDAxMDApCS8qIEVuYWJsZSAqLwotI2RlZmluZSBTUE1PREVfTEVOTVNLCSgodXNob3J0KTB4MDBmMCkJLyogY2hhcmFjdGVyIGxlbmd0aCAqLwotI2RlZmluZSBTUE1PREVfUE1NU0sJKCh1c2hvcnQpMHgwMDBmKQkvKiBwcmVzY2FsZSBtb2R1bHVzICovCi0KLSNkZWZpbmUgU1BNT0RFX0xFTih4KQkoKCgoeCktMSkmMHhGKTw8NCkKLSNkZWZpbmUgU1BNT0RFX1BNKHgpCSgoeCkgJjB4RikKLQotI2RlZmluZSBTUElfRUIJCSgodV9jaGFyKTB4MTApCQkvKiBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIgKi8KLQogLyogSURNQSBwYXJhbWV0ZXIgUkFNCiAqLwogdHlwZWRlZiBzdHJ1Y3QgaWRtYSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZXhjZXB0aW9uLTY0cy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2V4Y2VwdGlvbi02NHMuaAppbmRleCBhOTg2NTNiLi41N2M0MDAwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZXhjZXB0aW9uLTY0cy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9leGNlcHRpb24tNjRzLmgKQEAgLTE0Nyw2ICsxNDcsNyBAQAogCS5nbG9ibCBsYWJlbCMjX3BTZXJpZXM7CQkJCVwKIGxhYmVsIyNfcFNlcmllczoJCQkJCVwKIAlITVRfTUVESVVNOwkJCQkJXAorCURPX0tWTQluOwkJCQkJXAogCW10c3ByCVNQUk5fU1BSR19TQ1JBVENIMCxyMTM7CQkvKiBzYXZlIHIxMyAqLwlcCiAJRVhDRVBUSU9OX1BST0xPR19QU0VSSUVTKFBBQ0FfRVhHRU4sIGxhYmVsIyNfY29tbW9uKQogCkBAIC0xNzAsNiArMTcxLDcgQEAKIAkuZ2xvYmwgbGFiZWwjI19wU2VyaWVzOwkJCQkJCVwKIGxhYmVsIyNfcFNlcmllczoJCQkJCQkJXAogCUhNVF9NRURJVU07CQkJCQkJCVwKKwlET19LVk0JbjsJCQkJCQkJXAogCW10c3ByCVNQUk5fU1BSR19TQ1JBVENIMCxyMTM7CS8qIHNhdmUgcjEzICovCQkJXAogCW1mc3ByCXIxMyxTUFJOX1NQUkdfUEFDQTsJLyogZ2V0IHBhY2EgYWRkcmVzcyBpbnRvIHIxMyAqLwlcCiAJc3RkCXI5LFBBQ0FfRVhHRU4rRVhfUjkocjEzKTsJLyogc2F2ZSByOSwgcjEwICovCVwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odWdldGxiLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHVnZXRsYi5oCmluZGV4IGIxZGFmYjYuLjU4NTZhNjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odWdldGxiLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h1Z2V0bGIuaApAQCAtMyw2ICszLDEwIEBACiAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogCitwdGVfdCAqaHVnZV9wdGVfb2Zmc2V0X2FuZF9zaGlmdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCAqc2hpZnQpOworCit2b2lkIGZsdXNoX2RjYWNoZV9pY2FjaGVfaHVnZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpOwogCiBpbnQgaXNfaHVnZXBhZ2Vfb25seV9yYW5nZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJICAgdW5zaWduZWQgbG9uZyBsZW4pOwpAQCAtMTEsMTIgKzE1LDYgQEAKIAkJCSAgICB1bnNpZ25lZCBsb25nIGVuZCwgdW5zaWduZWQgbG9uZyBmbG9vciwKIAkJCSAgICB1bnNpZ25lZCBsb25nIGNlaWxpbmcpOwogCi12b2lkIHNldF9odWdlX3B0ZV9hdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAotCQkgICAgIHB0ZV90ICpwdGVwLCBwdGVfdCBwdGUpOwotCi1wdGVfdCBodWdlX3B0ZXBfZ2V0X2FuZF9jbGVhcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAotCQkJICAgICAgcHRlX3QgKnB0ZXApOwotCiAvKgogICogVGhlIHZlcnNpb24gb2Ygdm1hX21tdV9wYWdlc2l6ZSgpIGluIGFyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS5jIG5lZWRzCiAgKiB0byBvdmVycmlkZSB0aGUgdmVyc2lvbiBpbiBtbS9odWdldGxiLmMKQEAgLTQyLDkgKzQwLDI2IEBACiB7CiB9CiAKKworc3RhdGljIGlubGluZSB2b2lkIHNldF9odWdlX3B0ZV9hdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJCSAgIHB0ZV90ICpwdGVwLCBwdGVfdCBwdGUpCit7CisJc2V0X3B0ZV9hdChtbSwgYWRkciwgcHRlcCwgcHRlKTsKK30KKworc3RhdGljIGlubGluZSBwdGVfdCBodWdlX3B0ZXBfZ2V0X2FuZF9jbGVhcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCit7CisJdW5zaWduZWQgbG9uZyBvbGQgPSBwdGVfdXBkYXRlKG1tLCBhZGRyLCBwdGVwLCB+MFVMLCAxKTsKKwlyZXR1cm4gX19wdGUob2xkKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGh1Z2VfcHRlcF9jbGVhcl9mbHVzaChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCQkJIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCiB7CisJcHRlX3QgcHRlOworCXB0ZSA9IGh1Z2VfcHRlcF9nZXRfYW5kX2NsZWFyKHZtYS0+dm1fbW0sIGFkZHIsIHB0ZXApOworCWZsdXNoX3RsYl9wYWdlKHZtYSwgYWRkcik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGh1Z2VfcHRlX25vbmUocHRlX3QgcHRlKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h2Y2FsbC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h2Y2FsbC5oCmluZGV4IGMyN2NhYWMuLmYwMjc1ODEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odmNhbGwuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHZjYWxsLmgKQEAgLTIxMiw2ICsyMTIsMTkgQEAKICNkZWZpbmUgSF9RVUVSWV9JTlRfU1RBVEUgICAgICAgMHgxRTQKICNkZWZpbmUgSF9QT0xMX1BFTkRJTkcJCTB4MUQ4CiAjZGVmaW5lIEhfSUxMQU5fQVRUUklCVVRFUwkweDI0NAorI2RlZmluZSBIX01PRElGWV9IRUFfUVAJCTB4MjUwCisjZGVmaW5lIEhfUVVFUllfSEVBX1FQCQkweDI1NAorI2RlZmluZSBIX1FVRVJZX0hFQQkJMHgyNTgKKyNkZWZpbmUgSF9RVUVSWV9IRUFfUE9SVAkweDI1QworI2RlZmluZSBIX01PRElGWV9IRUFfUE9SVAkweDI2MAorI2RlZmluZSBIX1JFR19CQ01DCQkweDI2NAorI2RlZmluZSBIX0RFUkVHX0JDTUMJCTB4MjY4CisjZGVmaW5lIEhfUkVHSVNURVJfSEVBX1JQQUdFUwkweDI2QworI2RlZmluZSBIX0RJU0FCTEVfQU5EX0dFVF9IRUEJMHgyNzAKKyNkZWZpbmUgSF9HRVRfSEVBX0lORk8JCTB4Mjc0CisjZGVmaW5lIEhfQUxMT0NfSEVBX1JFU09VUkNFCTB4Mjc4CisjZGVmaW5lIEhfQUREX0NPTk4JCTB4Mjg0CisjZGVmaW5lIEhfREVMX0NPTk4JCTB4Mjg4CiAjZGVmaW5lIEhfSk9JTgkJCTB4Mjk4CiAjZGVmaW5lIEhfVkFTSV9TVEFURSAgICAgICAgICAgIDB4MkE0CiAjZGVmaW5lIEhfRU5BQkxFX0NSUQkJMHgyQjAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9od19pcnEuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9od19pcnEuaAppbmRleCBhYmJjMmFhLi45ZjRjOWQ0ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h3X2lycS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9od19pcnEuaApAQCAtNjQsMTEgKzY0LDYgQEAKIAkJZ2V0X3BhY2EoKS0+aGFyZF9lbmFibGVkID0gMDsJXAogCX0gd2hpbGUoMCkKIAotc3RhdGljIGlubGluZSBpbnQgaXJxc19kaXNhYmxlZF9mbGFncyh1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXJldHVybiBmbGFncyA9PSAwOwotfQotCiAjZWxzZQogCiAjaWYgZGVmaW5lZChDT05GSUdfQk9PS0UpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaW1tYXBfY3BtMi5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2ltbWFwX2NwbTIuaAppbmRleCBkNGYwNjliLi43YzY0ZmRhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaW1tYXBfY3BtMi5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9pbW1hcF9jcG0yLmgKQEAgLTU0OSw3ICs1NDksNyBAQAogCiAvKiBVU0IgQ29udHJvbGxlci4KICovCi10eXBlZGVmIHN0cnVjdCB1c2JfY3RsciB7Cit0eXBlZGVmIHN0cnVjdCBjcG1fdXNiX2N0bHIgewogCXU4CXVzYl91c21vZDsKIAl1OAl1c2JfdXNhZHI7CiAJdTgJdXNiX3VzY29tOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2ltbWFwX3FlLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaW1tYXBfcWUuaAppbmRleCBjMzQ2ZDBiLi40ZTEwZjUwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaW1tYXBfcWUuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaW1tYXBfcWUuaApAQCAtMjEwLDcgKzIxMCw3IEBACiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogLyogVVNCIENvbnRyb2xsZXIgKi8KLXN0cnVjdCB1c2JfY3RsciB7CitzdHJ1Y3QgcWVfdXNiX2N0bHIgewogCXU4CXVzYl91c21vZDsKIAl1OAl1c2JfdXNhZHI7CiAJdTgJdXNiX3VzY29tOwpAQCAtMjI5LDcgKzIyOSw3IEBACiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogLyogTUNDICovCi1zdHJ1Y3QgbWNjIHsKK3N0cnVjdCBxZV9tY2MgewogCV9fYmUzMgltY2NlOwkJLyogTUNDIGV2ZW50IHJlZ2lzdGVyICovCiAJX19iZTMyCW1jY207CQkvKiBNQ0MgbWFzayByZWdpc3RlciAqLwogCV9fYmUzMgltY2NmOwkJLyogTUNDIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KQEAgLTQzMSw5ICs0MzEsOSBAQAogCXN0cnVjdCBxZV9tdXgJCXFteDsJCS8qIFFFIE11bHRpcGxleGVyICovCiAJc3RydWN0IHFlX3RpbWVycwlxZXQ7CQkvKiBRRSBUaW1lcnMgKi8KIAlzdHJ1Y3Qgc3BpCQlzcGlbMHgyXTsJLyogc3BpICovCi0Jc3RydWN0IG1jYwkJbWNjOwkJLyogbWNjICovCisJc3RydWN0IHFlX21jYwkJbWNjOwkJLyogbWNjICovCiAJc3RydWN0IHFlX2JyZwkJYnJnOwkJLyogYnJnICovCi0Jc3RydWN0IHVzYl9jdGxyCQl1c2I7CQkvKiBVU0IgKi8KKwlzdHJ1Y3QgcWVfdXNiX2N0bHIJdXNiOwkJLyogVVNCICovCiAJc3RydWN0IHNpMQkJc2kxOwkJLyogU0kgKi8KIAl1OAkJCXJlczExWzB4ODAwXTsKIAlzdHJ1Y3Qgc2lyCQlzaXI7CQkvKiBTSSBSb3V0aW5nIFRhYmxlcyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2lycS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2lycS5oCmluZGV4IGJiY2QxYWEuLmUwNTRiYWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9pcnEuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaXJxLmgKQEAgLTE3LDggKzE3LDYgQEAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKIAotI2RlZmluZSBnZXRfaXJxX2Rlc2MoaXJxKSAoJmlycV9kZXNjWyhpcnEpXSkKLQogLyogRGVmaW5lIGEgd2F5IHRvIGl0ZXJhdGUgYWNyb3NzIGlycXMuICovCiAjZGVmaW5lIGZvcl9lYWNoX2lycShpKSBcCiAJZm9yICgoaSkgPSAwOyAoaSkgPCBOUl9JUlFTOyArKyhpKSkKQEAgLTM0LDEyICszMiwxNSBAQAogICovCiAjZGVmaW5lIE5PX0lSUV9JR05PUkUJCSgodW5zaWduZWQgaW50KS0xKQogCi0vKiBUb3RhbCBudW1iZXIgb2YgdmlycSBpbiB0aGUgcGxhdGZvcm0gKG1ha2UgaXQgYSBDT05GSUdfKiBvcHRpb24gPyAqLwotI2RlZmluZSBOUl9JUlFTCQk1MTIKKy8qIFRvdGFsIG51bWJlciBvZiB2aXJxIGluIHRoZSBwbGF0Zm9ybSAqLworI2RlZmluZSBOUl9JUlFTCQlDT05GSUdfTlJfSVJRUwogCiAvKiBOdW1iZXIgb2YgaXJxcyByZXNlcnZlZCBmb3IgdGhlIGxlZ2FjeSBjb250cm9sbGVyICovCiAjZGVmaW5lIE5VTV9JU0FfSU5URVJSVVBUUwkxNgogCisvKiBTYW1lIHRoaW5nLCB1c2VkIGJ5IHRoZSBnZW5lcmljIElSUSBjb2RlICovCisjZGVmaW5lIE5SX0lSUVNfTEVHQUNZCQlOVU1fSVNBX0lOVEVSUlVQVFMKKwogLyogVGhpcyB0eXBlIGlzIHRoZSBwbGFjZWhvbGRlciBmb3IgYSBoYXJkd2FyZSBpbnRlcnJ1cHQgbnVtYmVyLiBJdCBoYXMgdG8KICAqIGJlIGJpZyBlbm91Z2ggdG8gZW5jbG9zZSB3aGF0ZXZlciByZXByZXNlbnRhdGlvbiBpcyB1c2VkIGJ5IGEgZ2l2ZW4KICAqIHBsYXRmb3JtLgpAQCAtOTksNyArMTAwLDcgQEAKIAkgKiBpbnRlcnJ1cHQgY29udHJvbGxlciBoYXMgZm9yIHRoYXQgbGluZSkKIAkgKi8KIAlpbnQgKCp4bGF0ZSkoc3RydWN0IGlycV9ob3N0ICpoLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmN0cmxlciwKLQkJICAgICB1MzIgKmludHNwZWMsIHVuc2lnbmVkIGludCBpbnRzaXplLAorCQkgICAgIGNvbnN0IHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUsCiAJCSAgICAgaXJxX2h3X251bWJlcl90ICpvdXRfaHdpcnEsIHVuc2lnbmVkIGludCAqb3V0X3R5cGUpOwogfTsKIApAQCAtMzEzLDcgKzMxNCw3IEBACiAgKiBvZiB0aGUgb2ZfaXJxX21hcF8qKCkgZnVuY3Rpb25zLgogICovCiBleHRlcm4gdW5zaWduZWQgaW50IGlycV9jcmVhdGVfb2ZfbWFwcGluZyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmNvbnRyb2xsZXIsCi0JCQkJCSAgdTMyICppbnRzcGVjLCB1bnNpZ25lZCBpbnQgaW50c2l6ZSk7CisJCQkJCSAgY29uc3QgdTMyICppbnRzcGVjLCB1bnNpZ25lZCBpbnQgaW50c2l6ZSk7CiAKIC8qKgogICogaXJxX29mX3BhcnNlX2FuZF9tYXAgLSBQYXJzZSBhbmQgTWFwIGFuIGludGVycnVwdCBpbnRvIGxpbnV4IHZpcnEgc3BhY2UKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm0uaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm0uaAppbmRleCBiYjJkZTZhLi44MWYzYjBiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bS5oCkBAIC00Niw2ICs0NiwyNCBAQAogfTsKIAogc3RydWN0IGt2bV9zcmVncyB7CisJX191MzIgcHZyOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTY0IHNkcjE7CisJCQlzdHJ1Y3QgeworCQkJCXN0cnVjdCB7CisJCQkJCV9fdTY0IHNsYmU7CisJCQkJCV9fdTY0IHNsYnY7CisJCQkJfSBzbGJbNjRdOworCQkJfSBwcGM2NDsKKwkJCXN0cnVjdCB7CisJCQkJX191MzIgc3JbMTZdOworCQkJCV9fdTY0IGliYXRbOF07IAorCQkJCV9fdTY0IGRiYXRbOF07IAorCQkJfSBwcGMzMjsKKwkJfSBzOworCQlfX3U4IHBhZFsxMDIwXTsKKwl9IHU7CiB9OwogCiBzdHJ1Y3Qga3ZtX2ZwdSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2FzbS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9hc20uaAppbmRleCA1NmJmYWU1Li5hZjJhYmU3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2FzbS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYXNtLmgKQEAgLTQ5LDYgKzQ5LDQ2IEBACiAjZGVmaW5lIEJPT0tFX0lOVEVSUlVQVF9TUEVfRlBfUk9VTkQgMzQKICNkZWZpbmUgQk9PS0VfSU5URVJSVVBUX1BFUkZPUk1BTkNFX01PTklUT1IgMzUKIAorLyogYm9vazNzICovCisKKyNkZWZpbmUgQk9PSzNTX0lOVEVSUlVQVF9TWVNURU1fUkVTRVQJMHgxMDAKKyNkZWZpbmUgQk9PSzNTX0lOVEVSUlVQVF9NQUNISU5FX0NIRUNLCTB4MjAwCisjZGVmaW5lIEJPT0szU19JTlRFUlJVUFRfREFUQV9TVE9SQUdFCTB4MzAwCisjZGVmaW5lIEJPT0szU19JTlRFUlJVUFRfREFUQV9TRUdNRU5UCTB4MzgwCisjZGVmaW5lIEJPT0szU19JTlRFUlJVUFRfSU5TVF9TVE9SQUdFCTB4NDAwCisjZGVmaW5lIEJPT0szU19JTlRFUlJVUFRfSU5TVF9TRUdNRU5UCTB4NDgwCisjZGVmaW5lIEJPT0szU19JTlRFUlJVUFRfRVhURVJOQUwJMHg1MDAKKyNkZWZpbmUgQk9PSzNTX0lOVEVSUlVQVF9BTElHTk1FTlQJMHg2MDAKKyNkZWZpbmUgQk9PSzNTX0lOVEVSUlVQVF9QUk9HUkFNCTB4NzAwCisjZGVmaW5lIEJPT0szU19JTlRFUlJVUFRfRlBfVU5BVkFJTAkweDgwMAorI2RlZmluZSBCT09LM1NfSU5URVJSVVBUX0RFQ1JFTUVOVEVSCTB4OTAwCisjZGVmaW5lIEJPT0szU19JTlRFUlJVUFRfU1lTQ0FMTAkweGMwMAorI2RlZmluZSBCT09LM1NfSU5URVJSVVBUX1RSQUNFCQkweGQwMAorI2RlZmluZSBCT09LM1NfSU5URVJSVVBUX1BFUkZNT04JMHhmMDAKKyNkZWZpbmUgQk9PSzNTX0lOVEVSUlVQVF9BTFRJVkVDCTB4ZjIwCisjZGVmaW5lIEJPT0szU19JTlRFUlJVUFRfVlNYCQkweGY0MAorCisjZGVmaW5lIEJPT0szU19JUlFQUklPX1NZU1RFTV9SRVNFVAkJMAorI2RlZmluZSBCT09LM1NfSVJRUFJJT19EQVRBX1NFR01FTlQJCTEKKyNkZWZpbmUgQk9PSzNTX0lSUVBSSU9fSU5TVF9TRUdNRU5UCQkyCisjZGVmaW5lIEJPT0szU19JUlFQUklPX0RBVEFfU1RPUkFHRQkJMworI2RlZmluZSBCT09LM1NfSVJRUFJJT19JTlNUX1NUT1JBR0UJCTQKKyNkZWZpbmUgQk9PSzNTX0lSUVBSSU9fQUxJR05NRU5UCQk1CisjZGVmaW5lIEJPT0szU19JUlFQUklPX1BST0dSQU0JCQk2CisjZGVmaW5lIEJPT0szU19JUlFQUklPX0ZQX1VOQVZBSUwJCTcKKyNkZWZpbmUgQk9PSzNTX0lSUVBSSU9fQUxUSVZFQwkJCTgKKyNkZWZpbmUgQk9PSzNTX0lSUVBSSU9fVlNYCQkJOQorI2RlZmluZSBCT09LM1NfSVJRUFJJT19TWVNDQUxMCQkJMTAKKyNkZWZpbmUgQk9PSzNTX0lSUVBSSU9fTUFDSElORV9DSEVDSwkJMTEKKyNkZWZpbmUgQk9PSzNTX0lSUVBSSU9fREVCVUcJCQkxMgorI2RlZmluZSBCT09LM1NfSVJRUFJJT19FWFRFUk5BTAkJCTEzCisjZGVmaW5lIEJPT0szU19JUlFQUklPX0RFQ1JFTUVOVEVSCQkxNAorI2RlZmluZSBCT09LM1NfSVJRUFJJT19QRVJGT1JNQU5DRV9NT05JVE9SCTE1CisjZGVmaW5lIEJPT0szU19JUlFQUklPX01BWAkJCTE2CisKKyNkZWZpbmUgQk9PSzNTX0hGTEFHX0RDQlozMgkJCTB4MQorI2RlZmluZSBCT09LM1NfSEZMQUdfU0xCCQkJMHgyCisKICNkZWZpbmUgUkVTVU1FX0ZMQUdfTlYgICAgICAgICAgKDE8PDApICAvKiBSZWxvYWQgZ3Vlc3Qgbm9udm9sYXRpbGUgc3RhdGU/ICovCiAjZGVmaW5lIFJFU1VNRV9GTEFHX0hPU1QgICAgICAgICgxPDwxKSAgLyogUmVzdW1lIGhvc3Q/ICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9vazNzLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2szcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YjczNjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2szcy5oCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCisgKgorICogQ29weXJpZ2h0IFNVU0UgTGludXggUHJvZHVjdHMgR21iSCAyMDA5CisgKgorICogQXV0aG9yczogQWxleGFuZGVyIEdyYWYgPGFncmFmQHN1c2UuZGU+CisgKi8KKworI2lmbmRlZiBfX0FTTV9LVk1fQk9PSzNTX0hfXworI2RlZmluZSBfX0FTTV9LVk1fQk9PSzNTX0hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgorI2luY2x1ZGUgPGFzbS9rdm1fcHBjLmg+CisKK3N0cnVjdCBrdm1wcGNfc2xiIHsKKwl1NjQgZXNpZDsKKwl1NjQgdnNpZDsKKwl1NjQgb3JpZ2U7CisJdTY0IG9yaWd2OworCWJvb2wgdmFsaWQ7CisJYm9vbCBLczsKKwlib29sIEtwOworCWJvb2wgbng7CisJYm9vbCBsYXJnZTsKKwlib29sIGNsYXNzOworfTsKKworc3RydWN0IGt2bXBwY19zciB7CisJdTMyIHJhdzsKKwl1MzIgdnNpZDsKKwlib29sIEtzOworCWJvb2wgS3A7CisJYm9vbCBueDsKK307CisKK3N0cnVjdCBrdm1wcGNfYmF0IHsKKwl1NjQgcmF3OworCXUzMiBiZXBpOworCXUzMiBiZXBpX21hc2s7CisJYm9vbCB2czsKKwlib29sIHZwOworCXUzMiBicnBuOworCXU4IHdpbWc7CisJdTggcHA7Cit9OworCitzdHJ1Y3Qga3ZtcHBjX3NpZF9tYXAgeworCXU2NCBndWVzdF92c2lkOworCXU2NCBndWVzdF9lc2lkOworCXU2NCBob3N0X3ZzaWQ7CisJYm9vbCB2YWxpZDsKK307CisKKyNkZWZpbmUgU0lEX01BUF9CSVRTICAgIDkKKyNkZWZpbmUgU0lEX01BUF9OVU0gICAgICgxIDw8IFNJRF9NQVBfQklUUykKKyNkZWZpbmUgU0lEX01BUF9NQVNLICAgIChTSURfTUFQX05VTSAtIDEpCisKK3N0cnVjdCBrdm1wcGNfdmNwdV9ib29rM3MgeworCXN0cnVjdCBrdm1fdmNwdSB2Y3B1OworCXN0cnVjdCBrdm1wcGNfc2lkX21hcCBzaWRfbWFwW1NJRF9NQVBfTlVNXTsKKwlzdHJ1Y3Qga3ZtcHBjX3NsYiBzbGJbNjRdOworCXN0cnVjdCB7CisJCXU2NCBlc2lkOworCQl1NjQgdnNpZDsKKwl9IHNsYl9zaGFkb3dbNjRdOworCXU4IHNsYl9zaGFkb3dfbWF4OworCXN0cnVjdCBrdm1wcGNfc3Igc3JbMTZdOworCXN0cnVjdCBrdm1wcGNfYmF0IGliYXRbOF07CisJc3RydWN0IGt2bXBwY19iYXQgZGJhdFs4XTsKKwl1NjQgaGlkWzZdOworCWludCBzbGJfbnI7CisJdTY0IHNkcjE7CisJdTY0IGRzaXNyOworCXU2NCBoaW9yOworCXU2NCBtc3JfbWFzazsKKwl1NjQgdnNpZF9maXJzdDsKKwl1NjQgdnNpZF9uZXh0OworCXU2NCB2c2lkX21heDsKKwlpbnQgY29udGV4dF9pZDsKK307CisKKyNkZWZpbmUgQ09OVEVYVF9IT1NUCQkwCisjZGVmaW5lIENPTlRFWFRfR1VFU1QJCTEKKyNkZWZpbmUgQ09OVEVYVF9HVUVTVF9FTkQJMgorCisjZGVmaW5lIFZTSURfUkVBTAkweGZmZmZmZmZmZmZmMDAwMDAKKyNkZWZpbmUgVlNJRF9SRUFMX0RSCTB4ZmZmZmZmZmZmZmUwMDAwMAorI2RlZmluZSBWU0lEX1JFQUxfSVIJMHhmZmZmZmZmZmZmZDAwMDAwCisjZGVmaW5lIFZTSURfQkFUCTB4ZmZmZmZmZmZmZmMwMDAwMAorI2RlZmluZSBWU0lEX1BSCQkweDgwMDAwMDAwMDAwMDAwMDAKKworZXh0ZXJuIHZvaWQga3ZtcHBjX21tdV9wdGVfZmx1c2goc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgZWEsIHU2NCBlYV9tYXNrKTsKK2V4dGVybiB2b2lkIGt2bXBwY19tbXVfcHRlX3ZmbHVzaChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCB2cCwgdTY0IHZwX21hc2spOworZXh0ZXJuIHZvaWQga3ZtcHBjX21tdV9wdGVfcGZsdXNoKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IHBhX3N0YXJ0LCB1NjQgcGFfZW5kKTsKK2V4dGVybiB2b2lkIGt2bXBwY19zZXRfbXNyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IG5ld19tc3IpOworZXh0ZXJuIHZvaWQga3ZtcHBjX21tdV9ib29rM3NfNjRfaW5pdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworZXh0ZXJuIHZvaWQga3ZtcHBjX21tdV9ib29rM3NfMzJfaW5pdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworZXh0ZXJuIGludCBrdm1wcGNfbW11X21hcF9wYWdlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bXBwY19wdGUgKnB0ZSk7CitleHRlcm4gaW50IGt2bXBwY19tbXVfbWFwX3NlZ21lbnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bG9uZyBlYWRkcik7CitleHRlcm4gdm9pZCBrdm1wcGNfbW11X2ZsdXNoX3NlZ21lbnRzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CitleHRlcm4gc3RydWN0IGt2bXBwY19wdGUgKmt2bXBwY19tbXVfZmluZF9wdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgZWEsIGJvb2wgZGF0YSk7CitleHRlcm4gaW50IGt2bXBwY19sZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVsb25nIGVhZGRyLCBpbnQgc2l6ZSwgdm9pZCAqcHRyLCBib29sIGRhdGEpOworZXh0ZXJuIGludCBrdm1wcGNfc3Qoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bG9uZyBlYWRkciwgaW50IHNpemUsIHZvaWQgKnB0cik7CitleHRlcm4gdm9pZCBrdm1wcGNfYm9vazNzX3F1ZXVlX2lycXByaW8oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBpbnQgdmVjKTsKK2V4dGVybiB2b2lkIGt2bXBwY19zZXRfYmF0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bXBwY19iYXQgKmJhdCwKKwkJCSAgIGJvb2wgdXBwZXIsIHUzMiB2YWwpOworCitleHRlcm4gdTMyIGt2bXBwY190cmFtcG9saW5lX2xvd21lbTsKK2V4dGVybiB1MzIga3ZtcHBjX3RyYW1wb2xpbmVfZW50ZXI7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGt2bXBwY192Y3B1X2Jvb2szcyAqdG9fYm9vazNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKHZjcHUsIHN0cnVjdCBrdm1wcGNfdmNwdV9ib29rM3MsIHZjcHUpOworfQorCitzdGF0aWMgaW5saW5lIHVsb25nIGRzaXNyKHZvaWQpCit7CisJdWxvbmcgcjsKKwlhc20gKCAibWZkc2lzciAlMCAiIDogIj1yIiAocikgKTsKKwlyZXR1cm4gcjsKK30KKworZXh0ZXJuIHZvaWQga3ZtX3JldHVybl9wb2ludCh2b2lkKTsKKworI2RlZmluZSBJTlNfRENCWgkJCTB4N2MwMDA3ZWMKKworI2VuZGlmIC8qIF9fQVNNX0tWTV9CT09LM1NfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2szc182NF9hc20uaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9vazNzXzY0X2FzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMDZlZTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2szc182NF9hc20uaApAQCAtMCwwICsxLDU4IEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCisgKgorICogQ29weXJpZ2h0IFNVU0UgTGludXggUHJvZHVjdHMgR21iSCAyMDA5CisgKgorICogQXV0aG9yczogQWxleGFuZGVyIEdyYWYgPGFncmFmQHN1c2UuZGU+CisgKi8KKworI2lmbmRlZiBfX0FTTV9LVk1fQk9PSzNTX0FTTV9IX18KKyNkZWZpbmUgX19BU01fS1ZNX0JPT0szU19BU01fSF9fCisKKyNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU182NF9IQU5ETEVSCisKKyNpbmNsdWRlIDxhc20va3ZtX2FzbS5oPgorCisubWFjcm8gRE9fS1ZNIGludG5vCisJLmlmIChcaW50bm8gPT0gQk9PSzNTX0lOVEVSUlVQVF9TWVNURU1fUkVTRVQpIHx8IFwKKwkgICAgKFxpbnRubyA9PSBCT09LM1NfSU5URVJSVVBUX01BQ0hJTkVfQ0hFQ0spIHx8IFwKKwkgICAgKFxpbnRubyA9PSBCT09LM1NfSU5URVJSVVBUX0RBVEFfU1RPUkFHRSkgfHwgXAorCSAgICAoXGludG5vID09IEJPT0szU19JTlRFUlJVUFRfSU5TVF9TVE9SQUdFKSB8fCBcCisJICAgIChcaW50bm8gPT0gQk9PSzNTX0lOVEVSUlVQVF9EQVRBX1NFR01FTlQpIHx8IFwKKwkgICAgKFxpbnRubyA9PSBCT09LM1NfSU5URVJSVVBUX0lOU1RfU0VHTUVOVCkgfHwgXAorCSAgICAoXGludG5vID09IEJPT0szU19JTlRFUlJVUFRfRVhURVJOQUwpIHx8IFwKKwkgICAgKFxpbnRubyA9PSBCT09LM1NfSU5URVJSVVBUX0FMSUdOTUVOVCkgfHwgXAorCSAgICAoXGludG5vID09IEJPT0szU19JTlRFUlJVUFRfUFJPR1JBTSkgfHwgXAorCSAgICAoXGludG5vID09IEJPT0szU19JTlRFUlJVUFRfRlBfVU5BVkFJTCkgfHwgXAorCSAgICAoXGludG5vID09IEJPT0szU19JTlRFUlJVUFRfREVDUkVNRU5URVIpIHx8IFwKKwkgICAgKFxpbnRubyA9PSBCT09LM1NfSU5URVJSVVBUX1NZU0NBTEwpIHx8IFwKKwkgICAgKFxpbnRubyA9PSBCT09LM1NfSU5URVJSVVBUX1RSQUNFKSB8fCBcCisJICAgIChcaW50bm8gPT0gQk9PSzNTX0lOVEVSUlVQVF9QRVJGTU9OKSB8fCBcCisJICAgIChcaW50bm8gPT0gQk9PSzNTX0lOVEVSUlVQVF9BTFRJVkVDKSB8fCBcCisJICAgIChcaW50bm8gPT0gQk9PSzNTX0lOVEVSUlVQVF9WU1gpCisKKwliCWt2bXBwY190cmFtcG9saW5lX1xpbnRubwora3ZtcHBjX3Jlc3VtZV9caW50bm86CisKKwkuZW5kaWYKKy5lbmRtCisKKyNlbHNlCisKKy5tYWNybyBET19LVk0gaW50bm8KKy5lbmRtCisKKyNlbmRpZiAvKiBDT05GSUdfS1ZNX0JPT0szU182NF9IQU5ETEVSICovCisKKyNlbmRpZiAvKiBfX0FTTV9LVk1fQk9PSzNTX0FTTV9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1faG9zdC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKaW5kZXggYzljOTMwZS4uMTIwMWY2MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKQEAgLTIxLDcgKzIxLDggQEAKICNkZWZpbmUgX19QT1dFUlBDX0tWTV9IT1NUX0hfXwogCiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2t2bV90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9rdm1fYXNtLmg+CkBAIC0zNyw2ICszOCw4IEBACiAjZGVmaW5lIEtWTV9OUl9QQUdFX1NJWkVTCTEKICNkZWZpbmUgS1ZNX1BBR0VTX1BFUl9IUEFHRSh4KQkoMVVMPDwzMSkKIAorI2RlZmluZSBIUFRFR19DQUNIRV9OVU0gMTAyNAorCiBzdHJ1Y3Qga3ZtOwogc3RydWN0IGt2bV9ydW47CiBzdHJ1Y3Qga3ZtX3ZjcHU7CkBAIC02Myw2ICs2NiwxNyBAQAogCXUzMiBkZWNfZXhpdHM7CiAJdTMyIGV4dF9pbnRyX2V4aXRzOwogCXUzMiBoYWx0X3dha2V1cDsKKyNpZmRlZiBDT05GSUdfUFBDNjQKKwl1MzIgcGZfc3RvcmFnZTsKKwl1MzIgcGZfaW5zdHJ1YzsKKwl1MzIgc3Bfc3RvcmFnZTsKKwl1MzIgc3BfaW5zdHJ1YzsKKwl1MzIgcXVldWVfaW50cjsKKwl1MzIgbGQ7CisJdTMyIGxkX3Nsb3c7CisJdTMyIHN0OworCXUzMiBzdF9zbG93OworI2VuZGlmCiB9OwogCiBlbnVtIGt2bV9leGl0X3R5cGVzIHsKQEAgLTEwOSw5ICsxMjMsNTMgQEAKIHN0cnVjdCBrdm1fYXJjaCB7CiB9OwogCitzdHJ1Y3Qga3ZtcHBjX3B0ZSB7CisJdTY0IGVhZGRyOworCXU2NCB2cGFnZTsKKwl1NjQgcmFkZHI7CisJYm9vbCBtYXlfcmVhZDsKKwlib29sIG1heV93cml0ZTsKKwlib29sIG1heV9leGVjdXRlOworfTsKKworc3RydWN0IGt2bXBwY19tbXUgeworCS8qIGJvb2szc182NCBvbmx5ICovCisJdm9pZCAoKnNsYm10ZSkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgcmIsIHU2NCBycyk7CisJdTY0ICAoKnNsYm1mZWUpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IHNsYl9ucik7CisJdTY0ICAoKnNsYm1mZXYpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IHNsYl9ucik7CisJdm9pZCAoKnNsYmllKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBzbGJfbnIpOworCXZvaWQgKCpzbGJpYSkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKKwkvKiBib29rM3MgKi8KKwl2b2lkICgqbXRzcmluKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUzMiBzcm51bSwgdWxvbmcgdmFsdWUpOworCXUzMiAgKCptZnNyaW4pKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTMyIHNybnVtKTsKKwlpbnQgICgqeGxhdGUpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgZWFkZHIsIHN0cnVjdCBrdm1wcGNfcHRlICpwdGUsIGJvb2wgZGF0YSk7CisJdm9pZCAoKnJlc2V0X21zcikoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKKwl2b2lkICgqdGxiaWUpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdWxvbmcgYWRkciwgYm9vbCBsYXJnZSk7CisJaW50ICAoKmVzaWRfdG9fdnNpZCkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgZXNpZCwgdTY0ICp2c2lkKTsKKwl1NjQgICgqZWFfdG9fdnApKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgZWFkZHIsIGJvb2wgZGF0YSk7CisJYm9vbCAoKmlzX2RjYnozMikoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKK307CisKK3N0cnVjdCBocHRlX2NhY2hlIHsKKwl1NjQgaG9zdF92YTsKKwl1NjQgcGZuOworCXVsb25nIHNsb3Q7CisJc3RydWN0IGt2bXBwY19wdGUgcHRlOworfTsKKwogc3RydWN0IGt2bV92Y3B1X2FyY2ggewotCXUzMiBob3N0X3N0YWNrOworCXVsb25nIGhvc3Rfc3RhY2s7CiAJdTMyIGhvc3RfcGlkOworI2lmZGVmIENPTkZJR19QUEM2NAorCXVsb25nIGhvc3RfbXNyOworCXVsb25nIGhvc3RfcjI7CisJdm9pZCAqaG9zdF9yZXRpcDsKKwl1bG9uZyB0cmFtcG9saW5lX2xvd21lbTsKKwl1bG9uZyB0cmFtcG9saW5lX2VudGVyOworCXVsb25nIGhpZ2htZW1faGFuZGxlcjsKKwl1bG9uZyBob3N0X3BhY2FfcGh5czsKKwlzdHJ1Y3Qga3ZtcHBjX21tdSBtbXU7CisjZW5kaWYKIAogCXU2NCBmcHJbMzJdOwogCXVsb25nIGdwclszMl07CkBAIC0xMjMsNiArMTgxLDEwIEBACiAJdWxvbmcgeGVyOwogCiAJdWxvbmcgbXNyOworI2lmZGVmIENPTkZJR19QUEM2NAorCXVsb25nIHNoYWRvd19tc3I7CisJdWxvbmcgaGZsYWdzOworI2VuZGlmCiAJdTMyIG1tdWNyOwogCXVsb25nIHNwcmcwOwogCXVsb25nIHNwcmcxOwpAQCAtMTQ5LDYgKzIxMSw3IEBACiAJdTMyIGl2b3JbNjRdOwogCXVsb25nIGl2cHI7CiAJdTMyIHBpcjsKKwl1MzIgcHZyOwogCiAJdTMyIHNoYWRvd19waWQ7CiAJdTMyIHBpZDsKQEAgLTE3NCw2ICsyMzcsOSBAQAogI2VuZGlmCiAKIAl1MzIgbGFzdF9pbnN0OworI2lmZGVmIENPTkZJR19QUEM2NAorCXVsb25nIGZhdWx0X2RzaXNyOworI2VuZGlmCiAJdWxvbmcgZmF1bHRfZGVhcjsKIAl1bG9uZyBmYXVsdF9lc3I7CiAJZ3BhX3QgcGFkZHJfYWNjZXNzZWQ7CkBAIC0xODUsOCArMjUxLDE1IEBACiAKIAl1MzIgY3ByMF9jZmdhZGRyOyAvKiBob2xkcyB0aGUgbGFzdCBzZXQgY3ByMF9jZmdhZGRyICovCiAKLQlzdHJ1Y3QgdGltZXJfbGlzdCBkZWNfdGltZXI7CisJc3RydWN0IGhydGltZXIgZGVjX3RpbWVyOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB0YXNrbGV0OworCXU2NCBkZWNfamlmZmllczsKIAl1bnNpZ25lZCBsb25nIHBlbmRpbmdfZXhjZXB0aW9uczsKKworI2lmZGVmIENPTkZJR19QUEM2NAorCXN0cnVjdCBocHRlX2NhY2hlIGhwdGVfY2FjaGVbSFBURUdfQ0FDSEVfTlVNXTsKKwlpbnQgaHB0ZV9jYWNoZV9vZmZzZXQ7CisjZW5kaWYKIH07CiAKICNlbmRpZiAvKiBfX1BPV0VSUENfS1ZNX0hPU1RfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX3BwYy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9wcGMuaAppbmRleCAyYzZlZTM0OS4uMjY5ZWU0NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9wcGMuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX3BwYy5oCkBAIC0zOSw2ICszOSw3IEBACiBleHRlcm4gaW50IF9fa3ZtcHBjX3ZjcHVfcnVuKHN0cnVjdCBrdm1fcnVuICprdm1fcnVuLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogZXh0ZXJuIGNoYXIga3ZtcHBjX2hhbmRsZXJzX3N0YXJ0W107CiBleHRlcm4gdW5zaWduZWQgbG9uZyBrdm1wcGNfaGFuZGxlcl9sZW47CitleHRlcm4gdm9pZCBrdm1wcGNfaGFuZGxlcl9oaWdobWVtKHZvaWQpOwogCiBleHRlcm4gdm9pZCBrdm1wcGNfZHVtcF92Y3B1KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiBleHRlcm4gaW50IGt2bXBwY19oYW5kbGVfbG9hZChzdHJ1Y3Qga3ZtX3J1biAqcnVuLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbHBwYWNhLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbHBwYWNhLmgKaW5kZXggZjc4ZjY1Yy4uMTRiNTkyZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2xwcGFjYS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9scHBhY2EuaApAQCAtMTAwLDcgKzEwMCwxNCBAQAogCS8vIFVzZWQgdG8gcGFzcyBwYXJtcyBmcm9tIHRoZSBPUyB0byBQTElDIGZvciBTZXRBc3JBbmRSZmlkCiAJdTY0CXNhdmVkX2dwcjM7CQkvLyBTYXZlZCBHUFIzICAgICAgICAgICAgICAgICAgIHgyMC14MjcKIAl1NjQJc2F2ZWRfZ3ByNDsJCS8vIFNhdmVkIEdQUjQgICAgICAgICAgICAgICAgICAgeDI4LXgyRgotCXU2NAlzYXZlZF9ncHI1OwkJLy8gU2F2ZWQgR1BSNSAgICAgICAgICAgICAgICAgICB4MzAteDM3CisJdW5pb24geworCQl1NjQJc2F2ZWRfZ3ByNTsJLyogU2F2ZWQgR1BSNSAgICAgICAgICAgICAgIHgzMC14MzcgKi8KKwkJc3RydWN0IHsKKwkJCXU4CWNlZGVfbGF0ZW5jeV9oaW50OyAgLyoJCQl4MzAgKi8KKwkJCXU4CXJlc2VydmVkWzddOyAgICAgICAgLyoJCSAgICB4MzEteDM2ICovCisJCX0gZmllbGRzOworCX0gZ3ByNV9kd29yZDsKKwogCiAJdTgJZHRsX2VuYWJsZV9tYXNrOwkvLyBEaXNwYXRjaCBUcmFjZSBMb2cgbWFzawl4MzgteDM4CiAJdTgJZG9uYXRlX2RlZGljYXRlZF9jcHU7CS8vIERvbmF0ZSBkZWRpY2F0ZWQgQ1BVIGN5Y2xlcyAgeDM5LXgzOQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21hY2hkZXAuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tYWNoZGVwLmgKaW5kZXggOWVmYTJiZS4uOWYwZmM5ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21hY2hkZXAuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbWFjaGRlcC5oCkBAIC0yNjYsNiArMjY2LDExIEBACiAJdm9pZCAoKnN1c3BlbmRfZGlzYWJsZV9pcnFzKSh2b2lkKTsKIAl2b2lkICgqc3VzcGVuZF9lbmFibGVfaXJxcykodm9pZCk7CiAjZW5kaWYKKworI2lmZGVmIENPTkZJR19BUkNIX0NQVV9QUk9CRV9SRUxFQVNFCisJc3NpemVfdCAoKmNwdV9wcm9iZSkoY29uc3QgY2hhciAqLCBzaXplX3QpOworCXNzaXplX3QgKCpjcHVfcmVsZWFzZSkoY29uc3QgY2hhciAqLCBzaXplX3QpOworI2VuZGlmCiB9OwogCiBleHRlcm4gdm9pZCBlNTAwX2lkbGUodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbWFjaW8uaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tYWNpby5oCmluZGV4IDA3OWMwNmUuLmEwNjJjNTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tYWNpby5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tYWNpby5oCkBAIC0zOSw2ICszOSw3IEBACiAJc3RydWN0IG1hY2lvX2J1cwkqYnVzOwkJLyogbWFjaW8gYnVzIHRoaXMgZGV2aWNlIGlzIG9uICovCiAJc3RydWN0IG1hY2lvX2RldgkqbWVkaWFfYmF5OwkvKiBEZXZpY2UgaXMgcGFydCBvZiBhIG1lZGlhIGJheSAqLwogCXN0cnVjdCBvZl9kZXZpY2UJb2ZkZXY7CisJc3RydWN0IGRldmljZV9kbWFfcGFyYW1ldGVycyBkbWFfcGFybXM7IC8qIGlkZSBuZWVkcyB0aGF0ICovCiAJaW50CQkJbl9yZXNvdXJjZXM7CiAJc3RydWN0IHJlc291cmNlCQlyZXNvdXJjZVtNQUNJT19ERVZfQ09VTlRfUkVTT1VSQ0VTXTsKIAlpbnQJCQluX2ludGVycnVwdHM7CkBAIC03OCw2ICs3OSw4IEBACiAJcmV0dXJuIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CiB9CiAKK2V4dGVybiBpbnQgbWFjaW9fZW5hYmxlX2RldnJlcyhzdHJ1Y3QgbWFjaW9fZGV2ICpkZXYpOworCiBleHRlcm4gaW50IG1hY2lvX3JlcXVlc3RfcmVzb3VyY2Uoc3RydWN0IG1hY2lvX2RldiAqZGV2LCBpbnQgcmVzb3VyY2Vfbm8sIGNvbnN0IGNoYXIgKm5hbWUpOwogZXh0ZXJuIHZvaWQgbWFjaW9fcmVsZWFzZV9yZXNvdXJjZShzdHJ1Y3QgbWFjaW9fZGV2ICpkZXYsIGludCByZXNvdXJjZV9ubyk7CiBleHRlcm4gaW50IG1hY2lvX3JlcXVlc3RfcmVzb3VyY2VzKHN0cnVjdCBtYWNpb19kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSk7CkBAIC0xMzEsNiArMTM0LDkgQEAKIAlpbnQJKCpyZXN1bWUpKHN0cnVjdCBtYWNpb19kZXYqIGRldik7CiAJaW50CSgqc2h1dGRvd24pKHN0cnVjdCBtYWNpb19kZXYqIGRldik7CiAKKyNpZmRlZiBDT05GSUdfUE1BQ19NRURJQUJBWQorCXZvaWQJKCptZWRpYWJheV9ldmVudCkoc3RydWN0IG1hY2lvX2RldiogZGV2LCBpbnQgbWJfc3RhdGUpOworI2VuZGlmCiAJc3RydWN0IGRldmljZV9kcml2ZXIJZHJpdmVyOwogfTsKICNkZWZpbmUJdG9fbWFjaW9fZHJpdmVyKGRydikgY29udGFpbmVyX29mKGRydixzdHJ1Y3QgbWFjaW9fZHJpdmVyLCBkcml2ZXIpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbWVkaWFiYXkuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tZWRpYWJheS5oCmluZGV4IGIyZWZiMzMuLjExMDM3YTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tZWRpYWJheS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tZWRpYWJheS5oCkBAIC0xNywyNiArMTcsMzEgQEAKICNkZWZpbmUgTUJfUE9XRVIJNgkvKiBtZWRpYSBiYXkgY29udGFpbnMgYSBQb3dlciBkZXZpY2UgKD8/PykgKi8KICNkZWZpbmUgTUJfTk8JCTcJLyogbWVkaWEgYmF5IGNvbnRhaW5zIG5vdGhpbmcgKi8KIAotLyogTnVtYmVyIG9mIGJheXMgaW4gdGhlIG1hY2hpbmUgb3IgMCAqLwotZXh0ZXJuIGludCBtZWRpYV9iYXlfY291bnQ7CitzdHJ1Y3QgbWFjaW9fZGV2OwogCi0jaWZkZWYgQ09ORklHX0JMS19ERVZfSURFX1BNQUMKLSNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpZmRlZiBDT05GSUdfUE1BQ19NRURJQUJBWQogCi1pbnQgY2hlY2tfbWVkaWFfYmF5X2J5X2Jhc2UodW5zaWduZWQgbG9uZyBiYXNlLCBpbnQgd2hhdCk7Ci0vKiBjYWxsZWQgYnkgSURFIFBNQUMgaG9zdCBkcml2ZXIgdG8gcmVnaXN0ZXIgSURFIGNvbnRyb2xsZXIgZm9yIG1lZGlhIGJheSAqLwotaW50IG1lZGlhX2JheV9zZXRfaWRlX2luZm9zKHN0cnVjdCBkZXZpY2Vfbm9kZSAqd2hpY2hfYmF5LCB1bnNpZ25lZCBsb25nIGJhc2UsCi0JCQkgICAgaW50IGlycSwgaWRlX2h3aWZfdCAqaHdpZik7CisvKiBDaGVjayB0aGUgY29udGVudCB0eXBlIG9mIHRoZSBiYXksIHJldHVybnMgTUJfTk8gaWYgdGhlIGJheSBpcyBzdGlsbAorICogdHJhbnNpdGlvbm5pbmcKKyAqLworZXh0ZXJuIGludCBjaGVja19tZWRpYV9iYXkoc3RydWN0IG1hY2lvX2RldiAqYmF5KTsKIAotaW50IGNoZWNrX21lZGlhX2JheShzdHJ1Y3QgZGV2aWNlX25vZGUgKndoaWNoX2JheSwgaW50IHdoYXQpOworLyogVGhlIEFUQSBkcml2ZXIgdXNlcyB0aGUgY2FsbHMgYmVsb3cgdG8gdGVtcG9yYXJpbHkgaG9sZCBvbiB0aGUKKyAqIG1lZGlhIGJheSBjYWxsYmFja3Mgd2hpbGUgaW5pdGlhbGl6aW5nIHRoZSBpbnRlcmZhY2UKKyAqLworZXh0ZXJuIHZvaWQgbG9ja19tZWRpYV9iYXkoc3RydWN0IG1hY2lvX2RldiAqYmF5KTsKK2V4dGVybiB2b2lkIHVubG9ja19tZWRpYV9iYXkoc3RydWN0IG1hY2lvX2RldiAqYmF5KTsKIAogI2Vsc2UKIAotc3RhdGljIGlubGluZSBpbnQgY2hlY2tfbWVkaWFfYmF5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqd2hpY2hfYmF5LCBpbnQgd2hhdCkKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX21lZGlhX2JheShzdHJ1Y3QgbWFjaW9fZGV2ICpiYXkpCiB7Ci0JcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIE1CX05POwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgbG9ja19tZWRpYV9iYXkoc3RydWN0IG1hY2lvX2RldiAqYmF5KSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCB1bmxvY2tfbWVkaWFfYmF5KHN0cnVjdCBtYWNpb19kZXYgKmJheSkgeyB9CisKICNlbmRpZgogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdS1oYXNoNjQuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUtaGFzaDY0LmgKaW5kZXggYmViZTMxYy4uMjEwMmIyMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdS1oYXNoNjQuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW11LWhhc2g2NC5oCkBAIC0xNzMsMTQgKzE3Myw2IEBACiAgKi8KIGV4dGVybiBpbnQgbW11X2NpX3Jlc3RyaWN0aW9uczsKIAotI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKLS8qCi0gKiBUaGUgcGFnZSBzaXplIGluZGV4ZXMgb2YgdGhlIGh1Z2UgcGFnZXMgZm9yIHVzZSBieSBodWdldGxiZnMKLSAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBtbXVfaHVnZV9wc2l6ZXNbTU1VX1BBR0VfQ09VTlRdOwotCi0jZW5kaWYgLyogQ09ORklHX0hVR0VUTEJfUEFHRSAqLwotCiAvKgogICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBBVlBOIGFuZCBMIGZpZWxkcyBvZiB0aGUgSFBURSAgYXBwcm9wcmlhdGVseQogICogZm9yIHRoZSBwYWdlIHNpemUKQEAgLTI1MywxMCArMjQ1LDExIEBACiAJCQkgICB1bnNpZ25lZCBsb25nIHZzaWQsIHB0ZV90ICpwdGVwLCB1bnNpZ25lZCBsb25nIHRyYXAsCiAJCQkgICB1bnNpZ25lZCBpbnQgbG9jYWwsIGludCBzc2l6ZSk7CiBzdHJ1Y3QgbW1fc3RydWN0OwordW5zaWduZWQgaW50IGhhc2hfcGFnZV9kb19sYXp5X2ljYWNoZSh1bnNpZ25lZCBpbnQgcHAsIHB0ZV90IHB0ZSwgaW50IHRyYXApOwogZXh0ZXJuIGludCBoYXNoX3BhZ2UodW5zaWduZWQgbG9uZyBlYSwgdW5zaWduZWQgbG9uZyBhY2Nlc3MsIHVuc2lnbmVkIGxvbmcgdHJhcCk7Ci1leHRlcm4gaW50IGhhc2hfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFjY2VzcywKLQkJCSAgdW5zaWduZWQgbG9uZyBlYSwgdW5zaWduZWQgbG9uZyB2c2lkLCBpbnQgbG9jYWwsCi0JCQkgIHVuc2lnbmVkIGxvbmcgdHJhcCk7CitpbnQgX19oYXNoX3BhZ2VfaHVnZSh1bnNpZ25lZCBsb25nIGVhLCB1bnNpZ25lZCBsb25nIGFjY2VzcywgdW5zaWduZWQgbG9uZyB2c2lkLAorCQkgICAgIHB0ZV90ICpwdGVwLCB1bnNpZ25lZCBsb25nIHRyYXAsIGludCBsb2NhbCwgaW50IHNzaXplLAorCQkgICAgIHVuc2lnbmVkIGludCBzaGlmdCwgdW5zaWduZWQgaW50IG1tdV9wc2l6ZSk7CiAKIGV4dGVybiBpbnQgaHRhYl9ib2x0X21hcHBpbmcodW5zaWduZWQgbG9uZyB2c3RhcnQsIHVuc2lnbmVkIGxvbmcgdmVuZCwKIAkJCSAgICAgdW5zaWduZWQgbG9uZyBwc3RhcnQsIHVuc2lnbmVkIGxvbmcgcHJvdCwKQEAgLTM4MCw2ICszNzMsMzggQEAKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAorI2lmZGVmIENPTkZJR19QUENfU1VCUEFHRV9QUk9UCisvKgorICogRm9yIHRoZSBzdWItcGFnZSBwcm90ZWN0aW9uIG9wdGlvbiwgd2UgZXh0ZW5kIHRoZSBQR0Qgd2l0aCBvbmUgb2YKKyAqIHRoZXNlLiAgQmFzaWNhbGx5IHdlIGhhdmUgYSAzLWxldmVsIHRyZWUsIHdpdGggdGhlIHRvcCBsZXZlbCBiZWluZworICogdGhlIHByb3RwdHJzIGFycmF5LiAgVG8gb3B0aW1pemUgc3BlZWQgYW5kIG1lbW9yeSBjb25zdW1wdGlvbiB3aGVuCisgKiBvbmx5IGFkZHJlc3NlcyA8IDRHQiBhcmUgYmVpbmcgcHJvdGVjdGVkLCBwb2ludGVycyB0byB0aGUgZmlyc3QKKyAqIGZvdXIgcGFnZXMgb2Ygc3ViLXBhZ2UgcHJvdGVjdGlvbiB3b3JkcyBhcmUgc3RvcmVkIGluIHRoZSBsb3dfcHJvdAorICogYXJyYXkuCisgKiBFYWNoIHBhZ2Ugb2Ygc3ViLXBhZ2UgcHJvdGVjdGlvbiB3b3JkcyBwcm90ZWN0cyAxR0IgKDQgYnl0ZXMKKyAqIHByb3RlY3RzIDY0aykuICBGb3IgdGhlIDMtbGV2ZWwgdHJlZSwgZWFjaCBwYWdlIG9mIHBvaW50ZXJzIHRoZW4KKyAqIHByb3RlY3RzIDhUQi4KKyAqLworc3RydWN0IHN1YnBhZ2VfcHJvdF90YWJsZSB7CisJdW5zaWduZWQgbG9uZyBtYXhhZGRyOwkvKiBvbmx5IGFkZHJlc3NlcyA8IHRoaXMgYXJlIHByb3RlY3RlZCAqLworCXVuc2lnbmVkIGludCAqKnByb3RwdHJzWzJdOworCXVuc2lnbmVkIGludCAqbG93X3Byb3RbNF07Cit9OworCisjZGVmaW5lIFNCUF9MMV9CSVRTCQkoUEFHRV9TSElGVCAtIDIpCisjZGVmaW5lIFNCUF9MMl9CSVRTCQkoUEFHRV9TSElGVCAtIDMpCisjZGVmaW5lIFNCUF9MMV9DT1VOVAkJKDEgPDwgU0JQX0wxX0JJVFMpCisjZGVmaW5lIFNCUF9MMl9DT1VOVAkJKDEgPDwgU0JQX0wyX0JJVFMpCisjZGVmaW5lIFNCUF9MMl9TSElGVAkJKFBBR0VfU0hJRlQgKyBTQlBfTDFfQklUUykKKyNkZWZpbmUgU0JQX0wzX1NISUZUCQkoU0JQX0wyX1NISUZUICsgU0JQX0wyX0JJVFMpCisKK2V4dGVybiB2b2lkIHN1YnBhZ2VfcHJvdF9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKK2V4dGVybiB2b2lkIHN1YnBhZ2VfcHJvdF9pbml0X25ld19jb250ZXh0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgc3VicGFnZV9wcm90X2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0pIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgc3VicGFnZV9wcm90X2luaXRfbmV3X2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0pIHsgfQorI2VuZGlmIC8qIENPTkZJR19QUENfU1VCUEFHRV9QUk9UICovCisKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBtbV9jb250ZXh0X2lkX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKQEAgLTM5Myw2ICs0MTgsOSBAQAogCXUxNiBzbGxwOwkJLyogU0xCIHBhZ2Ugc2l6ZSBlbmNvZGluZyAqLwogI2VuZGlmCiAJdW5zaWduZWQgbG9uZyB2ZHNvX2Jhc2U7CisjaWZkZWYgQ09ORklHX1BQQ19TVUJQQUdFX1BST1QKKwlzdHJ1Y3Qgc3VicGFnZV9wcm90X3RhYmxlIHNwdDsKKyNlbmRpZiAvKiBDT05GSUdfUFBDX1NVQlBBR0VfUFJPVCAqLwogfSBtbV9jb250ZXh0X3Q7CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaAppbmRleCBiMzRlOTRkLi4yNjM4M2UwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaApAQCAtMjMsNiArMjMsOCBAQAogZXh0ZXJuIHZvaWQgc2V0X2NvbnRleHQodW5zaWduZWQgbG9uZyBpZCwgcGdkX3QgKnBnZCk7CiAKICNpZmRlZiBDT05GSUdfUFBDX0JPT0szU182NAorZXh0ZXJuIGludCBfX2luaXRfbmV3X2NvbnRleHQodm9pZCk7CitleHRlcm4gdm9pZCBfX2Rlc3Ryb3lfY29udGV4dChpbnQgY29udGV4dF9pZCk7CiBzdGF0aWMgaW5saW5lIHZvaWQgbW11X2NvbnRleHRfaW5pdCh2b2lkKSB7IH0KICNlbHNlCiBleHRlcm4gdm9pZCBtbXVfY29udGV4dF9pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21wYzUyeHguaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tcGM1Mnh4LmgKaW5kZXggMWI0ZjY5Ny4uYjY2NGNlNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21wYzUyeHguaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbXBjNTJ4eC5oCkBAIC0yNzYsNiArMjc2LDUzIEBACiBleHRlcm4gdW5zaWduZWQgaW50IG1wYzUyeHhfZ2V0X3h0YWxfZnJlcShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpOwogZXh0ZXJuIHZvaWQgbXBjNTJ4eF9yZXN0YXJ0KGNoYXIgKmNtZCk7CiAKKy8qIG1wYzUyeHhfZ3B0LmMgKi8KK3N0cnVjdCBtcGM1Mnh4X2dwdF9wcml2OworZXh0ZXJuIHN0cnVjdCBtcGM1Mnh4X2dwdF9wcml2ICptcGM1Mnh4X2dwdF9mcm9tX2lycShpbnQgaXJxKTsKK2V4dGVybiBpbnQgbXBjNTJ4eF9ncHRfc3RhcnRfdGltZXIoc3RydWN0IG1wYzUyeHhfZ3B0X3ByaXYgKmdwdCwgdTY0IHBlcmlvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udGludW91cyk7CitleHRlcm4gdTY0IG1wYzUyeHhfZ3B0X3RpbWVyX3BlcmlvZChzdHJ1Y3QgbXBjNTJ4eF9ncHRfcHJpdiAqZ3B0KTsKK2V4dGVybiBpbnQgbXBjNTJ4eF9ncHRfc3RvcF90aW1lcihzdHJ1Y3QgbXBjNTJ4eF9ncHRfcHJpdiAqZ3B0KTsKKworLyogbXBjNTJ4eF9scGJmaWZvLmMgKi8KKyNkZWZpbmUgTVBDNTJYWF9MUEJGSUZPX0ZMQUdfUkVBRAkJKDApCisjZGVmaW5lIE1QQzUyWFhfTFBCRklGT19GTEFHX1dSSVRFCQkoMTw8MCkKKyNkZWZpbmUgTVBDNTJYWF9MUEJGSUZPX0ZMQUdfTk9fSU5DUkVNRU5UCSgxPDwxKQorI2RlZmluZSBNUEM1MlhYX0xQQkZJRk9fRkxBR19OT19ETUEJCSgxPDwyKQorI2RlZmluZSBNUEM1MlhYX0xQQkZJRk9fRkxBR19QT0xMX0RNQQkJKDE8PDMpCisKK3N0cnVjdCBtcGM1Mnh4X2xwYmZpZm9fcmVxdWVzdCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJLyogbG9jYWxwbHVzIGJ1cyBhZGRyZXNzICovCisJdW5zaWduZWQgaW50IGNzOworCXNpemVfdCBvZmZzZXQ7CisKKwkvKiBNZW1vcnkgYWRkcmVzcyAqLworCXZvaWQgKmRhdGE7CisJcGh5c19hZGRyX3QgZGF0YV9waHlzOworCisJLyogRGV0YWlscyBvZiB0cmFuc2ZlciAqLworCXNpemVfdCBzaXplOworCXNpemVfdCBwb3M7CS8qIGN1cnJlbnQgcG9zaXRpb24gb2YgdHJhbnNmZXIgKi8KKwlpbnQgZmxhZ3M7CisKKwkvKiBXaGF0IHRvIGRvIHdoZW4gZmluaXNoZWQgKi8KKwl2b2lkICgqY2FsbGJhY2spKHN0cnVjdCBtcGM1Mnh4X2xwYmZpZm9fcmVxdWVzdCAqKTsKKworCXZvaWQgKnByaXY7CQkvKiBEcml2ZXIgcHJpdmF0ZSBkYXRhICovCisKKwkvKiBzdGF0aXN0aWNzICovCisJaW50IGlycV9jb3VudDsKKwlpbnQgaXJxX3RpY2tzOworCXU4IGxhc3RfYnl0ZTsKKwlpbnQgYnVmZmVyX25vdF9kb25lX2NudDsKK307CisKK2V4dGVybiBpbnQgbXBjNTJ4eF9scGJmaWZvX3N1Ym1pdChzdHJ1Y3QgbXBjNTJ4eF9scGJmaWZvX3JlcXVlc3QgKnJlcSk7CitleHRlcm4gdm9pZCBtcGM1Mnh4X2xwYmZpZm9fYWJvcnQoc3RydWN0IG1wYzUyeHhfbHBiZmlmb19yZXF1ZXN0ICpyZXEpOworZXh0ZXJuIHZvaWQgbXBjNTJ4eF9scGJmaWZvX3BvbGwodm9pZCk7CisKIC8qIG1wYzUyeHhfcGljLmMgKi8KIGV4dGVybiB2b2lkIG1wYzUyeHhfaW5pdF9pcnEodm9pZCk7CiBleHRlcm4gdW5zaWduZWQgaW50IG1wYzUyeHhfZ2V0X2lycSh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9udnJhbS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL252cmFtLmgKaW5kZXggNmM1ODdlZC4uODUwYjcyZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL252cmFtLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL252cmFtLmgKQEAgLTczLDcgKzczLDYgQEAKIGV4dGVybiBpbnQgbnZyYW1fcmVhZF9lcnJvcl9sb2coY2hhciAqIGJ1ZmYsIGludCBsZW5ndGgsCiAJCQkJCSB1bnNpZ25lZCBpbnQgKiBlcnJfdHlwZSwgdW5zaWduZWQgaW50ICplcnJfc2VxKTsKIGV4dGVybiBpbnQgbnZyYW1fY2xlYXJfZXJyb3JfbG9nKHZvaWQpOwotZXh0ZXJuIHN0cnVjdCBudnJhbV9wYXJ0aXRpb24gKm52cmFtX2ZpbmRfcGFydGl0aW9uKGludCBzaWcsIGNvbnN0IGNoYXIgKm5hbWUpOwogCiBleHRlcm4gaW50IHBTZXJpZXNfbnZyYW1faW5pdCh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BTZXJpZXNfcmVjb25maWcuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wU2VyaWVzX3JlY29uZmlnLmgKaW5kZXggZTQ4MmU1My4uZDRiNGJmYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BTZXJpZXNfcmVjb25maWcuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcFNlcmllc19yZWNvbmZpZy5oCkBAIC0xNyw2ICsxNyw3IEBACiAjaWZkZWYgQ09ORklHX1BQQ19QU0VSSUVTCiBleHRlcm4gaW50IHBTZXJpZXNfcmVjb25maWdfbm90aWZpZXJfcmVnaXN0ZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICopOwogZXh0ZXJuIHZvaWQgcFNlcmllc19yZWNvbmZpZ19ub3RpZmllcl91bnJlZ2lzdGVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqKTsKK2V4dGVybiBzdHJ1Y3QgYmxvY2tpbmdfbm90aWZpZXJfaGVhZCBwU2VyaWVzX3JlY29uZmlnX2NoYWluOwogI2Vsc2UgLyogIUNPTkZJR19QUENfUFNFUklFUyAqLwogc3RhdGljIGlubGluZSBpbnQgcFNlcmllc19yZWNvbmZpZ19ub3RpZmllcl9yZWdpc3RlcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhY2EuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWNhLmgKaW5kZXggN2Q4NTE0Yy4uNWU5YjRlZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhY2EuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFjYS5oCkBAIC0xMjksNiArMTI5LDE1IEBACiAJdTY0IHN5c3RlbV90aW1lOwkJLyogYWNjdW11bGF0ZWQgc3lzdGVtIFRCIHRpY2tzICovCiAJdTY0IHN0YXJ0cHVycjsJCQkvKiBQVVJSL1RCIHZhbHVlIHNuYXBzaG90ICovCiAJdTY0IHN0YXJ0c3B1cnI7CQkJLyogU1BVUlIgdmFsdWUgc25hcHNob3QgKi8KKworI2lmZGVmIENPTkZJR19LVk1fQk9PSzNTXzY0X0hBTkRMRVIKKwlzdHJ1Y3QgIHsKKwkJdTY0ICAgICBlc2lkOworCQl1NjQgICAgIHZzaWQ7CisJfSBrdm1fc2xiWzY0XTsJCQkvKiBndWVzdCBTTEIgKi8KKwl1OCBrdm1fc2xiX21heDsJCQkvKiBoaWdoZXN0IHVzZWQgZ3Vlc3Qgc2xiIGVudHJ5ICovCisJdTgga3ZtX2luX2d1ZXN0OwkJLyogYXJlIHdlIGluc2lkZSB0aGUgZ3Vlc3Q/ICovCisjZW5kaWYKIH07CiAKIGV4dGVybiBzdHJ1Y3QgcGFjYV9zdHJ1Y3QgcGFjYVtdOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhZ2UuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWdlLmgKaW5kZXggZmYyNDI1NC4uZTk2ZDUyYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhZ2UuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFnZS5oCkBAIC0yMjksNiArMjI5LDIwIEBACiAKICNlbmRpZgogCit0eXBlZGVmIHN0cnVjdCB7IHNpZ25lZCBsb25nIHBkOyB9IGh1Z2VwZF90OworI2RlZmluZSBIVUdFUERfU0hJRlRfTUFTSyAgICAgMHgzZgorCisjaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQorc3RhdGljIGlubGluZSBpbnQgaHVnZXBkX29rKGh1Z2VwZF90IGhwZCkKK3sKKwlyZXR1cm4gKGhwZC5wZCA+IDApOworfQorCisjZGVmaW5lIGlzX2h1Z2VwZChwZGVwKSAgICAgICAgICAgICAgIChodWdlcGRfb2soKigoaHVnZXBkX3QgKikocGRlcCkpKSkKKyNlbHNlIC8qIENPTkZJR19IVUdFVExCX1BBR0UgKi8KKyNkZWZpbmUgaXNfaHVnZXBkKHBkZXApCQkJMAorI2VuZGlmIC8qIENPTkZJR19IVUdFVExCX1BBR0UgKi8KKwogc3RydWN0IHBhZ2U7CiBleHRlcm4gdm9pZCBjbGVhcl91c2VyX3BhZ2Uodm9pZCAqcGFnZSwgdW5zaWduZWQgbG9uZyB2YWRkciwgc3RydWN0IHBhZ2UgKnBnKTsKIGV4dGVybiB2b2lkIGNvcHlfdXNlcl9wYWdlKHZvaWQgKnRvLCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIHZhZGRyLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhZ2VfNjQuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWdlXzY0LmgKaW5kZXggM2YxN2I4My4uYmZjNGUwMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhZ2VfNjQuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFnZV82NC5oCkBAIC05MCw3ICs5MCw3IEBACiAjZGVmaW5lIEhQQUdFX1NJWkUJCSgoMVVMKSA8PCBIUEFHRV9TSElGVCkKICNkZWZpbmUgSFBBR0VfTUFTSwkJKH4oSFBBR0VfU0laRSAtIDEpKQogI2RlZmluZSBIVUdFVExCX1BBR0VfT1JERVIJKEhQQUdFX1NISUZUIC0gUEFHRV9TSElGVCkKLSNkZWZpbmUgSFVHRV9NQVhfSFNUQVRFCQkzCisjZGVmaW5lIEhVR0VfTUFYX0hTVEFURQkJKE1NVV9QQUdFX0NPVU5ULTEpCiAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BnYWxsb2MtMzIuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wZ2FsbG9jLTMyLmgKaW5kZXggYzk1MDBkNi4uNTgwY2Y3MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BnYWxsb2MtMzIuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGdhbGxvYy0zMi5oCkBAIC0zLDcgKzMsOCBAQAogCiAjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgogCi0jZGVmaW5lIFBURV9OT05DQUNIRV9OVU0JMCAgLyogZHVtbXkgZm9yIG5vdyB0byBzaGFyZSBjb2RlIHcvcHBjNjQgKi8KKy8qIEZvciAzMi1iaXQsIGFsbCBsZXZlbHMgb2YgcGFnZSB0YWJsZXMgYXJlIGp1c3QgZHJhd24gZnJvbSBnZXRfZnJlZV9wYWdlKCkgKi8KKyNkZWZpbmUgTUFYX1BHVEFCTEVfSU5ERVhfU0laRQkwCiAKIGV4dGVybiB2b2lkIF9fYmFkX3B0ZShwbWRfdCAqcG1kKTsKIApAQCAtMzYsMTEgKzM3LDEwIEBACiBleHRlcm4gcHRlX3QgKnB0ZV9hbGxvY19vbmVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpOwogZXh0ZXJuIHBndGFibGVfdCBwdGVfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGd0YWJsZV9mcmVlKHBndGFibGVfZnJlZV90IHBnZikKK3N0YXRpYyBpbmxpbmUgdm9pZCBwZ3RhYmxlX2ZyZWUodm9pZCAqdGFibGUsIHVuc2lnbmVkIGluZGV4X3NpemUpCiB7Ci0Jdm9pZCAqcCA9ICh2b2lkICopKHBnZi52YWwgJiB+UEdGX0NBQ0hFTlVNX01BU0spOwotCi0JZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXApOworCUJVR19PTihpbmRleF9zaXplKTsgLyogMzItYml0IGRvZXNuJ3QgdXNlIHRoaXMgKi8KKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdGFibGUpOwogfQogCiAjZGVmaW5lIGNoZWNrX3BndF9jYWNoZSgpCWRvIHsgfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wZ2FsbG9jLTY0LmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGdhbGxvYy02NC5oCmluZGV4IGU2ZjA2OWMuLjYwNWY1YzUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wZ2FsbG9jLTY0LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BnYWxsb2MtNjQuaApAQCAtMTEsMjcgKzExLDM0IEBACiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogCi0jaWZuZGVmIENPTkZJR19QUENfU1VCUEFHRV9QUk9UCi1zdGF0aWMgaW5saW5lIHZvaWQgc3VicGFnZV9wcm90X2ZyZWUocGdkX3QgKnBnZCkge30KLSNlbmRpZgorLyoKKyAqIEZ1bmN0aW9ucyB0aGF0IGRlYWwgd2l0aCBwYWdldGFibGVzIHRoYXQgY291bGQgYmUgYXQgYW55IGxldmVsIG9mCisgKiB0aGUgdGFibGUgbmVlZCB0byBiZSBwYXNzZWQgYW4gImluZGV4X3NpemUiIHNvIHRoZXkga25vdyBob3cgdG8KKyAqIGhhbmRsZSBhbGxvY2F0aW9uLiAgRm9yIFBURSBwYWdlcyAod2hpY2ggYXJlIGxpbmtlZCB0byBhIHN0cnVjdAorICogcGFnZSBmb3Igbm93LCBhbmQgZHJhd24gZnJvbSB0aGUgbWFpbiBnZXRfZnJlZV9wYWdlcygpIHBvb2wpLCB0aGUKKyAqIGFsbG9jYXRpb24gc2l6ZSB3aWxsIGJlICgyXmluZGV4X3NpemUgKiBzaXplb2YocG9pbnRlcikpIGFuZAorICogYWxsb2NhdGlvbnMgYXJlIGRyYXduIGZyb20gdGhlIGttZW1fY2FjaGUgaW4gUEdUX0NBQ0hFKGluZGV4X3NpemUpLgorICoKKyAqIFRoZSBtYXhpbXVtIGluZGV4IHNpemUgbmVlZHMgdG8gYmUgYmlnIGVub3VnaCB0byBhbGxvdyBhbnkKKyAqIHBhZ2V0YWJsZSBzaXplcyB3ZSBuZWVkLCBidXQgc21hbGwgZW5vdWdoIHRvIGZpdCBpbiB0aGUgbG93IGJpdHMgb2YKKyAqIGFueSBwYWdlIHRhYmxlIHBvaW50ZXIuICBJbiBvdGhlciB3b3JkcyBhbGwgcGFnZXRhYmxlcywgZXZlbiB0aW55CisgKiBvbmVzLCBtdXN0IGJlIGFsaWduZWQgdG8gYWxsb3cgYXQgbGVhc3QgZW5vdWdoIGxvdyAwIGJpdHMgdG8KKyAqIGNvbnRhaW4gdGhpcyB2YWx1ZS4gIFRoaXMgdmFsdWUgaXMgYWxzbyB1c2VkIGFzIGEgbWFzaywgc28gaXQgbXVzdAorICogYmUgb25lIGxlc3MgdGhhbiBhIHBvd2VyIG9mIHR3by4KKyAqLworI2RlZmluZSBNQVhfUEdUQUJMRV9JTkRFWF9TSVpFCTB4ZgogCiBleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKnBndGFibGVfY2FjaGVbXTsKLQotI2RlZmluZSBQR0RfQ0FDSEVfTlVNCQkwCi0jZGVmaW5lIFBVRF9DQUNIRV9OVU0JCTEKLSNkZWZpbmUgUE1EX0NBQ0hFX05VTQkJMQotI2RlZmluZSBIVUdFUFRFX0NBQ0hFX05VTQkyCi0jZGVmaW5lIFBURV9OT05DQUNIRV9OVU0JNyAgLyogZnJvbSBHRlAgcmF0aGVyIHRoYW4ga21lbV9jYWNoZSAqLworI2RlZmluZSBQR1RfQ0FDSEUoc2hpZnQpIChwZ3RhYmxlX2NhY2hlWyhzaGlmdCktMV0pCiAKIHN0YXRpYyBpbmxpbmUgcGdkX3QgKnBnZF9hbGxvYyhzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKLQlyZXR1cm4ga21lbV9jYWNoZV9hbGxvYyhwZ3RhYmxlX2NhY2hlW1BHRF9DQUNIRV9OVU1dLCBHRlBfS0VSTkVMKTsKKwlyZXR1cm4ga21lbV9jYWNoZV9hbGxvYyhQR1RfQ0FDSEUoUEdEX0lOREVYX1NJWkUpLCBHRlBfS0VSTkVMKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHBnZF9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwZ2RfdCAqcGdkKQogewotCXN1YnBhZ2VfcHJvdF9mcmVlKHBnZCk7Ci0Ja21lbV9jYWNoZV9mcmVlKHBndGFibGVfY2FjaGVbUEdEX0NBQ0hFX05VTV0sIHBnZCk7CisJa21lbV9jYWNoZV9mcmVlKFBHVF9DQUNIRShQR0RfSU5ERVhfU0laRSksIHBnZCk7CiB9CiAKICNpZm5kZWYgQ09ORklHX1BQQ182NEtfUEFHRVMKQEAgLTQwLDEzICs0NywxMyBAQAogCiBzdGF0aWMgaW5saW5lIHB1ZF90ICpwdWRfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0JcmV0dXJuIGttZW1fY2FjaGVfYWxsb2MocGd0YWJsZV9jYWNoZVtQVURfQ0FDSEVfTlVNXSwKKwlyZXR1cm4ga21lbV9jYWNoZV9hbGxvYyhQR1RfQ0FDSEUoUFVEX0lOREVYX1NJWkUpLAogCQkJCUdGUF9LRVJORUx8X19HRlBfUkVQRUFUKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHB1ZF9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwdWRfdCAqcHVkKQogewotCWttZW1fY2FjaGVfZnJlZShwZ3RhYmxlX2NhY2hlW1BVRF9DQUNIRV9OVU1dLCBwdWQpOworCWttZW1fY2FjaGVfZnJlZShQR1RfQ0FDSEUoUFVEX0lOREVYX1NJWkUpLCBwdWQpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHVkX3BvcHVsYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwdWRfdCAqcHVkLCBwbWRfdCAqcG1kKQpAQCAtNzgsMTMgKzg1LDEzIEBACiAKIHN0YXRpYyBpbmxpbmUgcG1kX3QgKnBtZF9hbGxvY19vbmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKLQlyZXR1cm4ga21lbV9jYWNoZV9hbGxvYyhwZ3RhYmxlX2NhY2hlW1BNRF9DQUNIRV9OVU1dLAorCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKFBHVF9DQUNIRShQTURfSU5ERVhfU0laRSksCiAJCQkJR0ZQX0tFUk5FTHxfX0dGUF9SRVBFQVQpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcG1kX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBtZF90ICpwbWQpCiB7Ci0Ja21lbV9jYWNoZV9mcmVlKHBndGFibGVfY2FjaGVbUE1EX0NBQ0hFX05VTV0sIHBtZCk7CisJa21lbV9jYWNoZV9mcmVlKFBHVF9DQUNIRShQTURfSU5ERVhfU0laRSksIHBtZCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgcHRlX3QgKnB0ZV9hbGxvY19vbmVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLApAQCAtMTA3LDI0ICsxMTQsMjIgQEAKIAlyZXR1cm4gcGFnZTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHBndGFibGVfZnJlZShwZ3RhYmxlX2ZyZWVfdCBwZ2YpCitzdGF0aWMgaW5saW5lIHZvaWQgcGd0YWJsZV9mcmVlKHZvaWQgKnRhYmxlLCB1bnNpZ25lZCBpbmRleF9zaXplKQogewotCXZvaWQgKnAgPSAodm9pZCAqKShwZ2YudmFsICYgflBHRl9DQUNIRU5VTV9NQVNLKTsKLQlpbnQgY2FjaGVudW0gPSBwZ2YudmFsICYgUEdGX0NBQ0hFTlVNX01BU0s7Ci0KLQlpZiAoY2FjaGVudW0gPT0gUFRFX05PTkNBQ0hFX05VTSkKLQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXApOwotCWVsc2UKLQkJa21lbV9jYWNoZV9mcmVlKHBndGFibGVfY2FjaGVbY2FjaGVudW1dLCBwKTsKKwlpZiAoIWluZGV4X3NpemUpCisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl0YWJsZSk7CisJZWxzZSB7CisJCUJVR19PTihpbmRleF9zaXplID4gTUFYX1BHVEFCTEVfSU5ERVhfU0laRSk7CisJCWttZW1fY2FjaGVfZnJlZShQR1RfQ0FDSEUoaW5kZXhfc2l6ZSksIHRhYmxlKTsKKwl9CiB9CiAKLSNkZWZpbmUgX19wbWRfZnJlZV90bGIodGxiLCBwbWQsYWRkcikJCSAgICAgIFwKLQlwZ3RhYmxlX2ZyZWVfdGxiKHRsYiwgcGd0YWJsZV9mcmVlX2NhY2hlKHBtZCwgXAotCQlQTURfQ0FDSEVfTlVNLCBQTURfVEFCTEVfU0laRS0xKSkKKyNkZWZpbmUgX19wbWRfZnJlZV90bGIodGxiLCBwbWQsIGFkZHIpCQkgICAgICBcCisJcGd0YWJsZV9mcmVlX3RsYih0bGIsIHBtZCwgUE1EX0lOREVYX1NJWkUpCiAjaWZuZGVmIENPTkZJR19QUENfNjRLX1BBR0VTCiAjZGVmaW5lIF9fcHVkX2ZyZWVfdGxiKHRsYiwgcHVkLCBhZGRyKQkJICAgICAgXAotCXBndGFibGVfZnJlZV90bGIodGxiLCBwZ3RhYmxlX2ZyZWVfY2FjaGUocHVkLCBcCi0JCVBVRF9DQUNIRV9OVU0sIFBVRF9UQUJMRV9TSVpFLTEpKQorCXBndGFibGVfZnJlZV90bGIodGxiLCBwdWQsIFBVRF9JTkRFWF9TSVpFKQorCiAjZW5kaWYgLyogQ09ORklHX1BQQ182NEtfUEFHRVMgKi8KIAogI2RlZmluZSBjaGVja19wZ3RfY2FjaGUoKQlkbyB7IH0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGdhbGxvYy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BnYWxsb2MuaAppbmRleCBmMmU4MTJkLi5hYmU4NTMyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGdhbGxvYy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wZ2FsbG9jLmgKQEAgLTI0LDI1ICsyNCw2IEBACiAJX19mcmVlX3BhZ2UocHRlcGFnZSk7CiB9CiAKLXR5cGVkZWYgc3RydWN0IHBndGFibGVfZnJlZSB7Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci19IHBndGFibGVfZnJlZV90OwotCi0vKiBUaGlzIG5lZWRzIHRvIGJlIGJpZyBlbm91Z2ggdG8gYWxsb3cgZm9yIE1NVV9QQUdFX0NPVU5UICsgMiB0byBiZSBzdG9yZWQKLSAqIGFuZCBzbWFsbCBlbm91Z2ggdG8gZml0IGluIHRoZSBsb3cgYml0cyBvZiBhbnkgbmF0dXJhbGx5IGFsaWduZWQgcGFnZQotICogdGFibGUgY2FjaGUgZW50cnkuIEFyYml0cmFyaWx5IHNldCB0byAweDFmLCB0aGF0IHNob3VsZCBnaXZlIHVzIHNvbWUKLSAqIHJvb20gdG8gZ3JvdwotICovCi0jZGVmaW5lIFBHRl9DQUNIRU5VTV9NQVNLCTB4MWYKLQotc3RhdGljIGlubGluZSBwZ3RhYmxlX2ZyZWVfdCBwZ3RhYmxlX2ZyZWVfY2FjaGUodm9pZCAqcCwgaW50IGNhY2hlbnVtLAotCQkJCQkJdW5zaWduZWQgbG9uZyBtYXNrKQotewotCUJVR19PTihjYWNoZW51bSA+IFBHRl9DQUNIRU5VTV9NQVNLKTsKLQotCXJldHVybiAocGd0YWJsZV9mcmVlX3Qpey52YWwgPSAoKHVuc2lnbmVkIGxvbmcpIHAgJiB+bWFzaykgfCBjYWNoZW51bX07Ci19Ci0KICNpZmRlZiBDT05GSUdfUFBDNjQKICNpbmNsdWRlIDxhc20vcGdhbGxvYy02NC5oPgogI2Vsc2UKQEAgLTUwLDEyICszMSwxMiBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfU01QCi1leHRlcm4gdm9pZCBwZ3RhYmxlX2ZyZWVfdGxiKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIHBndGFibGVfZnJlZV90IHBnZik7CitleHRlcm4gdm9pZCBwZ3RhYmxlX2ZyZWVfdGxiKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIHZvaWQgKnRhYmxlLCB1bnNpZ25lZCBzaGlmdCk7CiBleHRlcm4gdm9pZCBwdGVfZnJlZV9maW5pc2godm9pZCk7CiAjZWxzZSAvKiBDT05GSUdfU01QICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcGd0YWJsZV9mcmVlX3RsYihzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCBwZ3RhYmxlX2ZyZWVfdCBwZ2YpCitzdGF0aWMgaW5saW5lIHZvaWQgcGd0YWJsZV9mcmVlX3RsYihzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCB2b2lkICp0YWJsZSwgdW5zaWduZWQgc2hpZnQpCiB7Ci0JcGd0YWJsZV9mcmVlKHBnZik7CisJcGd0YWJsZV9mcmVlKHRhYmxlLCBzaGlmdCk7CiB9CiBzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWVfZmluaXNoKHZvaWQpIHsgfQogI2VuZGlmIC8qICFDT05GSUdfU01QICovCkBAIC02MywxMiArNDQsOSBAQAogc3RhdGljIGlubGluZSB2b2lkIF9fcHRlX2ZyZWVfdGxiKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIHN0cnVjdCBwYWdlICpwdGVwYWdlLAogCQkJCSAgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewotCXBndGFibGVfZnJlZV90IHBnZiA9IHBndGFibGVfZnJlZV9jYWNoZShwYWdlX2FkZHJlc3MocHRlcGFnZSksCi0JCQkJCQlQVEVfTk9OQ0FDSEVfTlVNLAotCQkJCQkJUFRFX1RBQkxFX1NJWkUtMSk7CiAJdGxiX2ZsdXNoX3BndGFibGUodGxiLCBhZGRyZXNzKTsKIAlwZ3RhYmxlX3BhZ2VfZHRvcihwdGVwYWdlKTsKLQlwZ3RhYmxlX2ZyZWVfdGxiKHRsYiwgcGdmKTsKKwlwZ3RhYmxlX2ZyZWVfdGxiKHRsYiwgcGFnZV9hZGRyZXNzKHB0ZXBhZ2UpLCAwKTsKIH0KIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wZ3RhYmxlLXBwYzY0LmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGd0YWJsZS1wcGM2NC5oCmluZGV4IDgwNmFiZTcuLjQ5ODY1MDQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wZ3RhYmxlLXBwYzY0LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BndGFibGUtcHBjNjQuaApAQCAtMzU0LDYgKzM1NCw3IEBACiAjZGVmaW5lIHBnb2ZmX3RvX3B0ZShvZmYpCSgocHRlX3QpIHsoKG9mZikgPDwgUFRFX1JQTl9TSElGVCl8X1BBR0VfRklMRX0pCiAjZGVmaW5lIFBURV9GSUxFX01BWF9CSVRTCShCSVRTX1BFUl9MT05HIC0gUFRFX1JQTl9TSElGVCkKIAordm9pZCBwZ3RhYmxlX2NhY2hlX2FkZCh1bnNpZ25lZCBzaGlmdCwgdm9pZCAoKmN0b3IpKHZvaWQgKikpOwogdm9pZCBwZ3RhYmxlX2NhY2hlX2luaXQodm9pZCk7CiAKIC8qCkBAIC0zNzgsNyArMzc5LDE4IEBACiAJcmV0dXJuIHB0OwogfQogCi1wdGVfdCAqaHVnZV9wdGVfb2Zmc2V0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpOworI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKK3B0ZV90ICpmaW5kX2xpbnV4X3B0ZV9vcl9odWdlcHRlKHBnZF90ICpwZ2RpciwgdW5zaWduZWQgbG9uZyBlYSwKKwkJCQkgdW5zaWduZWQgKnNoaWZ0KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHB0ZV90ICpmaW5kX2xpbnV4X3B0ZV9vcl9odWdlcHRlKHBnZF90ICpwZ2RpciwgdW5zaWduZWQgbG9uZyBlYSwKKwkJCQkJICAgICAgIHVuc2lnbmVkICpzaGlmdCkKK3sKKwlpZiAoc2hpZnQpCisJCSpzaGlmdCA9IDA7CisJcmV0dXJuIGZpbmRfbGludXhfcHRlKHBnZGlyLCBlYSk7Cit9CisjZW5kaWYgLyogIUNPTkZJR19IVUdFVExCX1BBR0UgKi8KIAogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGd0YWJsZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BndGFibGUuaAppbmRleCAyYTVkYTA2Li4yMTIwN2U1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGd0YWJsZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKQEAgLTIxMSw2ICsyMTEsOSBAQAogICovCiBleHRlcm4gdm9pZCB1cGRhdGVfbW11X2NhY2hlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqLCB1bnNpZ25lZCBsb25nLCBwdGVfdCk7CiAKK2V4dGVybiBpbnQgZ3VwX2h1Z2VwZChodWdlcGRfdCAqaHVnZXBkLCB1bnNpZ25lZCBwZHNoaWZ0LCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgZW5kLCBpbnQgd3JpdGUsIHN0cnVjdCBwYWdlICoqcGFnZXMsIGludCAqbnIpOworCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHRlLTh4eC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3B0ZS04eHguaAppbmRleCBkZDVlYTk1Li5kNDQ4MjZlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHRlLTh4eC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wdGUtOHh4LmgKQEAgLTMzLDIxICszMywyMSBAQAogI2RlZmluZSBfUEFHRV9OT19DQUNIRQkweDAwMDIJLyogSTogY2FjaGUgaW5oaWJpdCAqLwogI2RlZmluZSBfUEFHRV9TSEFSRUQJMHgwMDA0CS8qIE5vIEFTSUQgKGNvbnRleHQpIGNvbXBhcmUgKi8KICNkZWZpbmUgX1BBR0VfU1BFQ0lBTAkweDAwMDgJLyogU1cgZW50cnksIGZvcmNlZCB0byAwIGJ5IHRoZSBUTEIgbWlzcyAqLworI2RlZmluZSBfUEFHRV9ESVJUWQkweDAxMDAJLyogQzogcGFnZSBjaGFuZ2VkICovCiAKLS8qIFRoZXNlIGZpdmUgc29mdHdhcmUgYml0cyBtdXN0IGJlIG1hc2tlZCBvdXQgd2hlbiB0aGUgZW50cnkgaXMgbG9hZGVkCi0gKiBpbnRvIHRoZSBUTEIuCisvKiBUaGVzZSA0IHNvZnR3YXJlIGJpdHMgbXVzdCBiZSBtYXNrZWQgb3V0IHdoZW4gdGhlIGVudHJ5IGlzIGxvYWRlZAorICogaW50byB0aGUgVExCLCAxIFNXIGJpdCBsZWZ0KDB4MDA4MCkuCiAgKi8KICNkZWZpbmUgX1BBR0VfR1VBUkRFRAkweDAwMTAJLyogc29mdHdhcmU6IGd1YXJkZWQgYWNjZXNzICovCi0jZGVmaW5lIF9QQUdFX0RJUlRZCTB4MDAyMAkvKiBzb2Z0d2FyZTogcGFnZSBjaGFuZ2VkICovCi0jZGVmaW5lIF9QQUdFX1JXCTB4MDA0MAkvKiBzb2Z0d2FyZTogdXNlciB3cml0ZSBhY2Nlc3MgYWxsb3dlZCAqLwotI2RlZmluZSBfUEFHRV9BQ0NFU1NFRAkweDAwODAJLyogc29mdHdhcmU6IHBhZ2UgcmVmZXJlbmNlZCAqLworI2RlZmluZSBfUEFHRV9BQ0NFU1NFRAkweDAwMjAJLyogc29mdHdhcmU6IHBhZ2UgcmVmZXJlbmNlZCAqLworI2RlZmluZSBfUEFHRV9XUklURVRIUlUJMHgwMDQwCS8qIHNvZnR3YXJlOiBjYWNoaW5nIGlzIHdyaXRlIHRocm91Z2ggKi8KIAogLyogU2V0dGluZyBhbnkgYml0cyBpbiB0aGUgbmliYmxlIHdpdGggdGhlIGZvbGxvdyB0d28gY29udHJvbHMgd2lsbAogICogcmVxdWlyZSBhIFRMQiBleGNlcHRpb24gaGFuZGxlciBjaGFuZ2UuICBJdCBpcyBhc3N1bWVkIHVudXNlZCBiaXRzCiAgKiBhcmUgYWx3YXlzIHplcm8uCiAgKi8KLSNkZWZpbmUgX1BBR0VfSFdXUklURQkweDAxMDAJLyogaC93IHdyaXRlIGVuYWJsZTogbmV2ZXIgc2V0IGluIExpbnV4IFBURSAqLwotI2RlZmluZSBfUEFHRV9VU0VSCTB4MDgwMAkvKiBPbmUgb2YgdGhlIFBQIGJpdHMsIHRoZSBvdGhlciBpcyBVU0VSJn5SVyAqLworI2RlZmluZSBfUEFHRV9SVwkweDA0MDAJLyogbHNiIFBQIGJpdHMsIGludmVydGVkIGluIEhXICovCisjZGVmaW5lIF9QQUdFX1VTRVIJMHgwODAwCS8qIG1zYiBQUCBiaXRzICovCiAKICNkZWZpbmUgX1BNRF9QUkVTRU5UCTB4MDAwMQogI2RlZmluZSBfUE1EX0JBRAkweDBmZjAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wdGUtaGFzaDY0LTY0ay5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3B0ZS1oYXNoNjQtNjRrLmgKaW5kZXggODJiNzIyMC4uYzQ0OTBmOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3B0ZS1oYXNoNjQtNjRrLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3B0ZS1oYXNoNjQtNjRrLmgKQEAgLTc2LDQxICs3Niw0IEBACiAJcmVtYXBfcGZuX3JhbmdlKCh2bWEpLCAoYWRkciksIChwZm4pLCBQQUdFX1NJWkUsCQlcCiAJCQlfX3BncHJvdChwZ3Byb3RfdmFsKChwcm90KSkgfCBfUEFHRV80S19QRk4pKQogCi0KLSNpZmRlZiBDT05GSUdfUFBDX1NVQlBBR0VfUFJPVAotLyoKLSAqIEZvciB0aGUgc3ViLXBhZ2UgcHJvdGVjdGlvbiBvcHRpb24sIHdlIGV4dGVuZCB0aGUgUEdEIHdpdGggb25lIG9mCi0gKiB0aGVzZS4gIEJhc2ljYWxseSB3ZSBoYXZlIGEgMy1sZXZlbCB0cmVlLCB3aXRoIHRoZSB0b3AgbGV2ZWwgYmVpbmcKLSAqIHRoZSBwcm90cHRycyBhcnJheS4gIFRvIG9wdGltaXplIHNwZWVkIGFuZCBtZW1vcnkgY29uc3VtcHRpb24gd2hlbgotICogb25seSBhZGRyZXNzZXMgPCA0R0IgYXJlIGJlaW5nIHByb3RlY3RlZCwgcG9pbnRlcnMgdG8gdGhlIGZpcnN0Ci0gKiBmb3VyIHBhZ2VzIG9mIHN1Yi1wYWdlIHByb3RlY3Rpb24gd29yZHMgYXJlIHN0b3JlZCBpbiB0aGUgbG93X3Byb3QKLSAqIGFycmF5LgotICogRWFjaCBwYWdlIG9mIHN1Yi1wYWdlIHByb3RlY3Rpb24gd29yZHMgcHJvdGVjdHMgMUdCICg0IGJ5dGVzCi0gKiBwcm90ZWN0cyA2NGspLiAgRm9yIHRoZSAzLWxldmVsIHRyZWUsIGVhY2ggcGFnZSBvZiBwb2ludGVycyB0aGVuCi0gKiBwcm90ZWN0cyA4VEIuCi0gKi8KLXN0cnVjdCBzdWJwYWdlX3Byb3RfdGFibGUgewotCXVuc2lnbmVkIGxvbmcgbWF4YWRkcjsJLyogb25seSBhZGRyZXNzZXMgPCB0aGlzIGFyZSBwcm90ZWN0ZWQgKi8KLQl1bnNpZ25lZCBpbnQgKipwcm90cHRyc1syXTsKLQl1bnNpZ25lZCBpbnQgKmxvd19wcm90WzRdOwotfTsKLQotI3VuZGVmIFBHRF9UQUJMRV9TSVpFCi0jZGVmaW5lIFBHRF9UQUJMRV9TSVpFCQkoKHNpemVvZihwZ2RfdCkgPDwgUEdEX0lOREVYX1NJWkUpICsgXAotCQkJCSBzaXplb2Yoc3RydWN0IHN1YnBhZ2VfcHJvdF90YWJsZSkpCi0KLSNkZWZpbmUgU0JQX0wxX0JJVFMJCShQQUdFX1NISUZUIC0gMikKLSNkZWZpbmUgU0JQX0wyX0JJVFMJCShQQUdFX1NISUZUIC0gMykKLSNkZWZpbmUgU0JQX0wxX0NPVU5UCQkoMSA8PCBTQlBfTDFfQklUUykKLSNkZWZpbmUgU0JQX0wyX0NPVU5UCQkoMSA8PCBTQlBfTDJfQklUUykKLSNkZWZpbmUgU0JQX0wyX1NISUZUCQkoUEFHRV9TSElGVCArIFNCUF9MMV9CSVRTKQotI2RlZmluZSBTQlBfTDNfU0hJRlQJCShTQlBfTDJfU0hJRlQgKyBTQlBfTDJfQklUUykKLQotZXh0ZXJuIHZvaWQgc3VicGFnZV9wcm90X2ZyZWUocGdkX3QgKnBnZCk7Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHN1YnBhZ2VfcHJvdF90YWJsZSAqcGdkX3N1YnBhZ2VfcHJvdChwZ2RfdCAqcGdkKQotewotCXJldHVybiAoc3RydWN0IHN1YnBhZ2VfcHJvdF90YWJsZSAqKShwZ2QgKyBQVFJTX1BFUl9QR0QpOwotfQotI2VuZGlmIC8qIENPTkZJR19QUENfU1VCUEFHRV9QUk9UICovCiAjZW5kaWYJLyogX19BU1NFTUJMWV9fICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcWUuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9xZS5oCmluZGV4IGYzODhmMGEuLjA5NDdiMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9xZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9xZS5oCkBAIC04Nyw3ICs4Nyw3IEBACiAKIC8qIEV4cG9ydCBRRSBjb21tb24gb3BlcmF0aW9ucyAqLwogI2lmZGVmIENPTkZJR19RVUlDQ19FTkdJTkUKLWV4dGVybiB2b2lkIF9faW5pdCBxZV9yZXNldCh2b2lkKTsKK2V4dGVybiB2b2lkIHFlX3Jlc2V0KHZvaWQpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBxZV9yZXNldCh2b2lkKSB7fQogI2VuZGlmCkBAIC0xNDUsOCArMTQ1LDE3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgcWVfcGluX3NldF9kZWRpY2F0ZWQoc3RydWN0IHFlX3BpbiAqcGluKSB7fQogI2VuZGlmIC8qIENPTkZJR19RRV9HUElPICovCiAKLS8qIFFFIGludGVybmFsIEFQSSAqLworI2lmZGVmIENPTkZJR19RVUlDQ19FTkdJTkUKIGludCBxZV9pc3N1ZV9jbWQodTMyIGNtZCwgdTMyIGRldmljZSwgdTggbWNuX3Byb3RvY29sLCB1MzIgY21kX2lucHV0KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBxZV9pc3N1ZV9jbWQodTMyIGNtZCwgdTMyIGRldmljZSwgdTggbWNuX3Byb3RvY29sLAorCQkJICAgICAgIHUzMiBjbWRfaW5wdXQpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisjZW5kaWYgLyogQ09ORklHX1FVSUNDX0VOR0lORSAqLworCisvKiBRRSBpbnRlcm5hbCBBUEkgKi8KIGVudW0gcWVfY2xvY2sgcWVfY2xvY2tfc291cmNlKGNvbnN0IGNoYXIgKnNvdXJjZSk7CiB1bnNpZ25lZCBpbnQgcWVfZ2V0X2JyZ19jbGsodm9pZCk7CiBpbnQgcWVfc2V0YnJnKGVudW0gcWVfY2xvY2sgYnJnLCB1bnNpZ25lZCBpbnQgcmF0ZSwgdW5zaWduZWQgaW50IG11bHRpcGxpZXIpOwpAQCAtMTU0LDcgKzE2MywyOCBAQAogdm9pZCBxZV9wdXRfc251bSh1OCBzbnVtKTsKIHVuc2lnbmVkIGludCBxZV9nZXRfbnVtX29mX3Jpc2Modm9pZCk7CiB1bnNpZ25lZCBpbnQgcWVfZ2V0X251bV9vZl9zbnVtcyh2b2lkKTsKLWludCBxZV9hbGl2ZV9kdXJpbmdfc2xlZXAodm9pZCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHFlX2FsaXZlX2R1cmluZ19zbGVlcCh2b2lkKQoreworCS8qCisJICogTVBDODU2OEUgcmVmZXJlbmNlIG1hbnVhbCBzYXlzOgorCSAqCisJICogIi4uLnBvd2VyIGRvd24gc2VxdWVuY2Ugd2FpdHMgZm9yIGFsbCBJL08gaW50ZXJmYWNlcyB0byBiZWNvbWUgaWRsZS4KKwkgKiAgSW4gc29tZSBhcHBsaWNhdGlvbnMgdGhpcyBtYXkgaGFwcGVuIGV2ZW50dWFsbHkgd2l0aG91dCBhY3RpdmVseQorCSAqICBzaHV0dGluZyBkb3duIGludGVyZmFjZXMsIGJ1dCBtb3N0IGxpa2VseSwgc29mdHdhcmUgd2lsbCBoYXZlIHRvCisJICogIHRha2Ugc3RlcHMgdG8gc2h1dCBkb3duIHRoZSBlVFNFQywgUVVJQ0MgRW5naW5lIEJsb2NrLCBhbmQgUENJCisJICogIGludGVyZmFjZXMgYmVmb3JlIGlzc3VpbmcgdGhlIGNvbW1hbmQgKGVpdGhlciB0aGUgd3JpdGUgdG8gdGhlIGNvcmUKKwkgKiAgTVNSW1dFXSBhcyBkZXNjcmliZWQgYWJvdmUgb3Igd3JpdGluZyB0byBQT1dNR1RDU1IpIHRvIHB1dCB0aGUKKwkgKiAgZGV2aWNlIGludG8gc2xlZXAgc3RhdGUuIgorCSAqCisJICogTVBDODU2OUUgcmVmZXJlbmNlIG1hbnVhbCBoYXMgYSBzaW1pbGFyIHBhcmFncmFwaC4KKwkgKi8KKyNpZmRlZiBDT05GSUdfUFBDXzg1eHgKKwlyZXR1cm4gMDsKKyNlbHNlCisJcmV0dXJuIDE7CisjZW5kaWYKK30KIAogLyogd2UgYWN0dWFsbHkgdXNlIGNwbV9tdXJhbSBpbXBsZW1lbnRhdGlvbiwgZGVmaW5lIHRoaXMgZm9yIGNvbnZlbmllbmNlICovCiAjZGVmaW5lIHFlX211cmFtX2luaXQgY3BtX211cmFtX2luaXQKQEAgLTIxMCw4ICsyNDAsMTUgQEAKIAl1NjQgZXh0ZW5kZWRfbW9kZXM7CS8qIEV4dGVuZGVkIG1vZGVzICovCiB9OwogCisjaWZkZWYgQ09ORklHX1FVSUNDX0VOR0lORQogLyogVXBsb2FkIGEgZmlybXdhcmUgdG8gdGhlIFFFICovCiBpbnQgcWVfdXBsb2FkX2Zpcm13YXJlKGNvbnN0IHN0cnVjdCBxZV9maXJtd2FyZSAqZmlybXdhcmUpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHFlX3VwbG9hZF9maXJtd2FyZShjb25zdCBzdHJ1Y3QgcWVfZmlybXdhcmUgKmZpcm13YXJlKQoreworCXJldHVybiAtRU5PU1lTOworfQorI2VuZGlmIC8qIENPTkZJR19RVUlDQ19FTkdJTkUgKi8KIAogLyogT2J0YWluIGluZm9ybWF0aW9uIG9uIHRoZSB1cGxvYWRlZCBmaXJtd2FyZSAqLwogc3RydWN0IHFlX2Zpcm13YXJlX2luZm8gKnFlX2dldF9maXJtd2FyZV9pbmZvKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NtcC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NtcC5oCmluZGV4IGQ5ZWE4ZDMuLjFkM2IyNzAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zbXAuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc21wLmgKQEAgLTM3LDcgKzM3LDcgQEAKIGV4dGVybiB2b2lkIHNtcF9zZW5kX2RlYnVnZ2VyX2JyZWFrKGludCBjcHUpOwogZXh0ZXJuIHZvaWQgc21wX21lc3NhZ2VfcmVjdihpbnQpOwogCi1ERUNMQVJFX1BFUl9DUFUodW5zaWduZWQgaW50LCBwdnIpOworREVDTEFSRV9QRVJfQ1BVKHVuc2lnbmVkIGludCwgY3B1X3B2cik7CiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIGV4dGVybiB2b2lkIGZpeHVwX2lycXMoY3B1bWFza190IG1hcCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3lzdGJsLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3lzdGJsLmgKaW5kZXggYzdkNjcxYS4uMDdkMmQxOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3N5c3RibC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zeXN0YmwuaApAQCAtMTQ1LDcgKzE0NSw3IEBACiBTWVNDQUxMX1NQVShzZXRmc2dpZCkKIFNZU0NBTExfU1BVKGxsc2VlaykKIENPTVBBVF9TWVNfU1BVKGdldGRlbnRzKQotU1lTWF9TUFUoc3lzX3NlbGVjdCxwcGMzMl9zZWxlY3QscHBjX3NlbGVjdCkKK1NZU1hfU1BVKHN5c19zZWxlY3QscHBjMzJfc2VsZWN0LHN5c19zZWxlY3QpCiBTWVNDQUxMX1NQVShmbG9jaykKIFNZU0NBTExfU1BVKG1zeW5jKQogQ09NUEFUX1NZU19TUFUocmVhZHYpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQppbmRleCBiMjM2NjRhLi5jMDAyYjA0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKQEAgLTQyLDEwICs0MiwxMSBAQAogb2JqLSQoQ09ORklHX1BQQ185NzBfTkFQKQkrPSBpZGxlX3Bvd2VyNC5vCiBvYmotJChDT05GSUdfUFBDX09GKQkJKz0gb2ZfZGV2aWNlLm8gb2ZfcGxhdGZvcm0ubyBwcm9tX3BhcnNlLm8KIG9iai0kKENPTkZJR19QUENfQ0xPQ0spCQkrPSBjbG9jay5vCi1wcm9jZnMtJChDT05GSUdfUFBDNjQpCQk6PSBwcm9jX3BwYzY0Lm8KK3Byb2Nmcy15CQkJOj0gcHJvY19wb3dlcnBjLm8KIG9iai0kKENPTkZJR19QUk9DX0ZTKQkJKz0gJChwcm9jZnMteSkKIHJ0YXNwY2ktJChDT05GSUdfUFBDNjQpLSQoQ09ORklHX1BDSSkJOj0gcnRhc19wY2kubwogb2JqLSQoQ09ORklHX1BQQ19SVEFTKQkJKz0gcnRhcy5vIHJ0YXMtcnRjLm8gJChydGFzcGNpLXkteSkKK29iai0kKENPTkZJR19QUENfUlRBU19EQUVNT04pCSs9IHJ0YXNkLm8KIG9iai0kKENPTkZJR19SVEFTX0ZMQVNIKQkrPSBydGFzX2ZsYXNoLm8KIG9iai0kKENPTkZJR19SVEFTX1BST0MpCQkrPSBydGFzLXByb2Mubwogb2JqLSQoQ09ORklHX0xQQVJDRkcpCQkrPSBscGFyY2ZnLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYwppbmRleCAwODEyYjBmLi5hNmMyYjYzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC0xOTAsNiArMTkwLDExIEBACiAJREVGSU5FKFBBQ0FfU1lTVEVNX1RJTUUsIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgc3lzdGVtX3RpbWUpKTsKIAlERUZJTkUoUEFDQV9EQVRBX09GRlNFVCwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBkYXRhX29mZnNldCkpOwogCURFRklORShQQUNBX1RSQVBfU0FWRSwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCB0cmFwX3NhdmUpKTsKKyNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU182NF9IQU5ETEVSCisJREVGSU5FKFBBQ0FfS1ZNX0lOX0dVRVNULCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIGt2bV9pbl9ndWVzdCkpOworCURFRklORShQQUNBX0tWTV9TTEIsIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwga3ZtX3NsYikpOworCURFRklORShQQUNBX0tWTV9TTEJfTUFYLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIGt2bV9zbGJfbWF4KSk7CisjZW5kaWYKICNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KIAogCS8qIFJUQVMgKi8KQEAgLTM5OCwxNCArNDAzLDI0IEBACiAJREVGSU5FKFZDUFVfTEFTVF9JTlNULCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gubGFzdF9pbnN0KSk7CiAJREVGSU5FKFZDUFVfRkFVTFRfREVBUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmZhdWx0X2RlYXIpKTsKIAlERUZJTkUoVkNQVV9GQVVMVF9FU1IsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5mYXVsdF9lc3IpKTsKKworCS8qIGJvb2szc182NCAqLworI2lmZGVmIENPTkZJR19QUEM2NAorCURFRklORShWQ1BVX0ZBVUxUX0RTSVNSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guZmF1bHRfZHNpc3IpKTsKKwlERUZJTkUoVkNQVV9IT1NUX1JFVElQLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guaG9zdF9yZXRpcCkpOworCURFRklORShWQ1BVX0hPU1RfUjIsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5ob3N0X3IyKSk7CisJREVGSU5FKFZDUFVfSE9TVF9NU1IsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5ob3N0X21zcikpOworCURFRklORShWQ1BVX1NIQURPV19NU1IsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5zaGFkb3dfbXNyKSk7CisJREVGSU5FKFZDUFVfVFJBTVBPTElORV9MT1dNRU0sIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC50cmFtcG9saW5lX2xvd21lbSkpOworCURFRklORShWQ1BVX1RSQU1QT0xJTkVfRU5URVIsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC50cmFtcG9saW5lX2VudGVyKSk7CisJREVGSU5FKFZDUFVfSElHSE1FTV9IQU5ETEVSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guaGlnaG1lbV9oYW5kbGVyKSk7CisJREVGSU5FKFZDUFVfSEZMQUdTLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guaGZsYWdzKSk7CisjZW5kaWYKICNlbmRpZgogI2lmZGVmIENPTkZJR180NHgKIAlERUZJTkUoUEdEX1RfTE9HMiwgUEdEX1RfTE9HMik7CiAJREVGSU5FKFBURV9UX0xPRzIsIFBURV9UX0xPRzIpOwogI2VuZGlmCi0jaWZkZWYgQ09ORklHX0ZTTF9CT09LRQotCURFRklORShUTEJDQU1fU0laRSwgc2l6ZW9mKHN0cnVjdCB0bGJjYW0pKTsKLSNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0tWTV9FWElUX1RJTUlORwogCURFRklORShWQ1BVX1RJTUlOR19FWElUX1RCVSwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcmFzaC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcmFzaC5jCmluZGV4IDBhODQzOWEuLjZmNDYxM2QgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3Jhc2guYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NyYXNoLmMKQEAgLTM3Myw3ICszNzMsNyBAQAogCWhhcmRfaXJxX2Rpc2FibGUoKTsKIAogCWZvcl9lYWNoX2lycShpKSB7Ci0JCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaTsKKwkJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaSk7CiAKIAkJaWYgKGRlc2MtPnN0YXR1cyAmIElSUV9JTlBST0dSRVNTKQogCQkJZGVzYy0+Y2hpcC0+ZW9pKGkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9kbWEtc3dpb3RsYi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9kbWEtc3dpb3RsYi5jCmluZGV4IGU5NmNiYmQuLjU5YzkyODUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZG1hLXN3aW90bGIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2RtYS1zd2lvdGxiLmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2Fic19hZGRyLmg+CiAKLWludCBzd2lvdGxiIF9fcmVhZF9tb3N0bHk7CiB1bnNpZ25lZCBpbnQgcHBjX3N3aW90bGJfZW5hYmxlOwogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0cy5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0cy5TCmluZGV4IGM3ZWI0ZTAuLmUzYmU5OGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZXhjZXB0aW9ucy02NHMuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRzLlMKQEAgLTQxLDYgKzQxLDcgQEAKIAkuID0gMHgyMDAKIF9tYWNoaW5lX2NoZWNrX3BTZXJpZXM6CiAJSE1UX01FRElVTQorCURPX0tWTQkweDIwMAogCW10c3ByCVNQUk5fU1BSR19TQ1JBVENIMCxyMTMJCS8qIHNhdmUgcjEzICovCiAJRVhDRVBUSU9OX1BST0xPR19QU0VSSUVTKFBBQ0FfRVhNQywgbWFjaGluZV9jaGVja19jb21tb24pCiAKQEAgLTQ4LDYgKzQ5LDcgQEAKIAkuZ2xvYmwgZGF0YV9hY2Nlc3NfcFNlcmllcwogZGF0YV9hY2Nlc3NfcFNlcmllczoKIAlITVRfTUVESVVNCisJRE9fS1ZNCTB4MzAwCiAJbXRzcHIJU1BSTl9TUFJHX1NDUkFUQ0gwLHIxMwogQkVHSU5fRlRSX1NFQ1RJT04KIAltZnNwcglyMTMsU1BSTl9TUFJHX1BBQ0EKQEAgLTc3LDYgKzc5LDcgQEAKIAkuZ2xvYmwgZGF0YV9hY2Nlc3Nfc2xiX3BTZXJpZXMKIGRhdGFfYWNjZXNzX3NsYl9wU2VyaWVzOgogCUhNVF9NRURJVU0KKwlET19LVk0JMHgzODAKIAltdHNwcglTUFJOX1NQUkdfU0NSQVRDSDAscjEzCiAJbWZzcHIJcjEzLFNQUk5fU1BSR19QQUNBCQkvKiBnZXQgcGFjYSBhZGRyZXNzIGludG8gcjEzICovCiAJc3RkCXIzLFBBQ0FfRVhTTEIrRVhfUjMocjEzKQpAQCAtMTE1LDYgKzExOCw3IEBACiAJLmdsb2JsIGluc3RydWN0aW9uX2FjY2Vzc19zbGJfcFNlcmllcwogaW5zdHJ1Y3Rpb25fYWNjZXNzX3NsYl9wU2VyaWVzOgogCUhNVF9NRURJVU0KKwlET19LVk0JMHg0ODAKIAltdHNwcglTUFJOX1NQUkdfU0NSQVRDSDAscjEzCiAJbWZzcHIJcjEzLFNQUk5fU1BSR19QQUNBCQkvKiBnZXQgcGFjYSBhZGRyZXNzIGludG8gcjEzICovCiAJc3RkCXIzLFBBQ0FfRVhTTEIrRVhfUjMocjEzKQpAQCAtMTU0LDYgKzE1OCw3IEBACiAJLmdsb2JsCXN5c3RlbV9jYWxsX3BTZXJpZXMKIHN5c3RlbV9jYWxsX3BTZXJpZXM6CiAJSE1UX01FRElVTQorCURPX0tWTQkweGMwMAogQkVHSU5fRlRSX1NFQ1RJT04KIAljbXBkaQlyMCwweDFlYmUKIAliZXEtCTFmCkBAIC0xODcsMTQgKzE5MiwxNyBAQAogCSAqLwogcGVyZm9ybWFuY2VfbW9uaXRvcl9wU2VyaWVzXzE6CiAJLiA9IDB4ZjAwCisJRE9fS1ZNCTB4ZjAwCiAJYglwZXJmb3JtYW5jZV9tb25pdG9yX3BTZXJpZXMKIAogYWx0aXZlY191bmF2YWlsYWJsZV9wU2VyaWVzXzE6CiAJLiA9IDB4ZjIwCisJRE9fS1ZNCTB4ZjIwCiAJYglhbHRpdmVjX3VuYXZhaWxhYmxlX3BTZXJpZXMKIAogdnN4X3VuYXZhaWxhYmxlX3BTZXJpZXNfMToKIAkuID0gMHhmNDAKKwlET19LVk0JMHhmNDAKIAliCXZzeF91bmF2YWlsYWJsZV9wU2VyaWVzCiAKICNpZmRlZiBDT05GSUdfQ0JFX1JBUwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNjQuUwppbmRleCBjMzhhZmRiLi45MjU4MDc0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNjQuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNjQuUwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlXzY0Lmg+CiAjaW5jbHVkZSA8YXNtL2lycWZsYWdzLmg+CisjaW5jbHVkZSA8YXNtL2t2bV9ib29rM3NfNjRfYXNtLmg+CiAKIC8qIFRoZSBwaHlzaWNhbCBtZW1vcnkgaXMgbGF5ZWQgb3V0IHN1Y2ggdGhhdCB0aGUgc2Vjb25kYXJ5IHByb2Nlc3NvcgogICogc3BpbiBjb2RlIHNpdHMgYXQgMHgwMDAwLi4uMHgwMGZmLiBPbiBzZXJ2ZXIsIHRoZSB2ZWN0b3JzIGZvbGxvdwpAQCAtMTY1LDYgKzE2NiwxMiBAQAogI2luY2x1ZGUgImV4Y2VwdGlvbnMtNjRzLlMiCiAjZW5kaWYKIAorLyogS1ZNIHRyYW1wb2xpbmUgY29kZSBuZWVkcyB0byBiZSBjbG9zZSB0byB0aGUgaW50ZXJydXB0IGhhbmRsZXJzICovCisKKyNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU182NF9IQU5ETEVSCisjaW5jbHVkZSAiLi4va3ZtL2Jvb2szc182NF9ybWhhbmRsZXJzLlMiCisjZW5kaWYKKwogX0dMT0JBTChnZW5lcmljX3NlY29uZGFyeV90aHJlYWRfaW5pdCkKIAltcglyMjQscjMKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzh4eC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzh4eC5TCmluZGV4IDZkZWQxOWQuLjY3OGY5OGMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF84eHguUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfOHh4LlMKQEAgLTIwNiw2ICsyMDYsOCBAQAogCUVYQ0VQVElPTl9QUk9MT0cKIAltZnNwciByNCxTUFJOX0RBUgogCXN0dyByNCxfREFSKHIxMSkKKwlsaSByNSwweDAwZjAKKwltdHNwciBTUFJOX0RBUixyNQkvKiBUYWcgREFSLCB0byBiZSB1c2VkIGluIERUTEIgRXJyb3IgKi8KIAltZnNwciByNSxTUFJOX0RTSVNSCiAJc3R3IHI1LF9EU0lTUihyMTEpCiAJYWRkaSByMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRApAQCAtMjIyLDYgKzIyNCw4IEBACiAJc3R3CXIxMCxfRFNJU1IocjExKQogCW1yCXI1LHIxMAogCW1mc3ByCXI0LFNQUk5fREFSCisJbGkJcjEwLDB4MDBmMAorCW10c3ByCVNQUk5fREFSLHIxMAkvKiBUYWcgREFSLCB0byBiZSB1c2VkIGluIERUTEIgRXJyb3IgKi8KIAlFWENfWEZFUl9FRV9MSVRFKDB4MzAwLCBoYW5kbGVfcGFnZV9mYXVsdCkKIAogLyogSW5zdHJ1Y3Rpb24gYWNjZXNzIGV4Y2VwdGlvbi4KQEAgLTI0NCw2ICsyNDgsOCBAQAogCUVYQ0VQVElPTl9QUk9MT0cKIAltZnNwcglyNCxTUFJOX0RBUgogCXN0dwlyNCxfREFSKHIxMSkKKwlsaQlyNSwweDAwZjAKKwltdHNwcglTUFJOX0RBUixyNQkvKiBUYWcgREFSLCB0byBiZSB1c2VkIGluIERUTEIgRXJyb3IgKi8KIAltZnNwcglyNSxTUFJOX0RTSVNSCiAJc3R3CXI1LF9EU0lTUihyMTEpCiAJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRApAQCAtMzMzLDI2ICszMzksMjAgQEAKIAltZnNwcglyMTEsIFNQUk5fTURfVFdDCS8qIC4uLi5hbmQgZ2V0IHRoZSBwdGUgYWRkcmVzcyAqLwogCWx3eglyMTAsIDAocjExKQkvKiBHZXQgdGhlIHB0ZSAqLwogCi0jaWZkZWYgQ09ORklHX1NXQVAKLQkvKiBkbyBub3Qgc2V0IHRoZSBfUEFHRV9BQ0NFU1NFRCBiaXQgb2YgYSBub24tcHJlc2VudCBwYWdlICovCi0JYW5kaS4JcjExLCByMTAsIF9QQUdFX1BSRVNFTlQKLQliZXEJNGYKLQlvcmkJcjEwLCByMTAsIF9QQUdFX0FDQ0VTU0VECi0JbWZzcHIJcjExLCBTUFJOX01EX1RXQwkvKiBnZXQgdGhlIHB0ZSBhZGRyZXNzIGFnYWluICovCi0Jc3R3CXIxMCwgMChyMTEpCi00OgotI2Vsc2UKLQlvcmkJcjEwLCByMTAsIF9QQUdFX0FDQ0VTU0VECi0Jc3R3CXIxMCwgMChyMTEpCi0jZW5kaWYKKwlhbmRpLglyMTEsIHIxMCwgX1BBR0VfQUNDRVNTRUQgfCBfUEFHRV9QUkVTRU5UCisJY21wd2kJY3IwLCByMTEsIF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfUFJFU0VOVAorCWJuZS0JY3IwLCAyZgorCisJLyogQ2xlYXIgUFAgbHNiLCAweDQwMCAqLworCXJsd2lubSAJcjEwLCByMTAsIDAsIDIyLCAyMAogCiAJLyogVGhlIExpbnV4IFBURSB3b24ndCBnbyBleGFjdGx5IGludG8gdGhlIE1NVSBUTEIuCi0JICogU29mdHdhcmUgaW5kaWNhdG9yIGJpdHMgMjEsIDIyIGFuZCAyOCBtdXN0IGJlIGNsZWFyLgorCSAqIFNvZnR3YXJlIGluZGljYXRvciBiaXRzIDIyIGFuZCAyOCBtdXN0IGJlIGNsZWFyLgogCSAqIFNvZnR3YXJlIGluZGljYXRvciBiaXRzIDI0LCAyNSwgMjYsIGFuZCAyNyBtdXN0IGJlCiAJICogc2V0LiAgQWxsIG90aGVyIExpbnV4IFBURSBiaXRzIGNvbnRyb2wgdGhlIGJlaGF2aW9yCiAJICogb2YgdGhlIE1NVS4KIAkgKi8KLTI6CWxpCXIxMSwgMHgwMGYwCisJbGkJcjExLCAweDAwZjAKIAlybHdpbWkJcjEwLCByMTEsIDAsIDI0LCAyOAkvKiBTZXQgMjQtMjcsIGNsZWFyIDI4ICovCiAJRE9fOHh4X0NQVTYoMHgyZDgwLCByMykKIAltdHNwcglTUFJOX01JX1JQTiwgcjEwCS8qIFVwZGF0ZSBUTEIgZW50cnkgKi8KQEAgLTM2NSw2ICszNjUsMjIgQEAKIAlsd3oJcjMsIDgocjApCiAjZW5kaWYKIAlyZmkKKzI6CisJbWZzcHIJcjExLCBTUFJOX1NSUjEKKwkvKiBjbGVhciBhbGwgZXJyb3IgYml0cyBhcyBUTEIgTWlzcworCSAqIHNldHMgYSBmZXcgdW5jb25kaXRpb25hbGx5CisJKi8KKwlybHdpbm0JcjExLCByMTEsIDAsIDB4ZmZmZgorCW10c3ByCVNQUk5fU1JSMSwgcjExCisKKwltZnNwcglyMTAsIFNQUk5fTV9UVwkvKiBSZXN0b3JlIHJlZ2lzdGVycyAqLworCWx3eglyMTEsIDAocjApCisJbXRjcglyMTEKKwlsd3oJcjExLCA0KHIwKQorI2lmZGVmIENPTkZJR184eHhfQ1BVNgorCWx3eglyMywgOChyMCkKKyNlbmRpZgorCWIJSW5zdHJ1Y3Rpb25BY2Nlc3MKIAogCS4gPSAweDEyMDAKIERhdGFTdG9yZVRMQk1pc3M6CkBAIC00MDYsMjkgKzQyMiw0NSBAQAogCSAqIGFib3ZlLgogCSAqLwogCXJsd2ltaQlyMTEsIHIxMCwgMCwgMjcsIDI3CisJLyogSW5zZXJ0IHRoZSBXcml0ZVRocnUgZmxhZyBpbnRvIHRoZSBUV0MgZnJvbSB0aGUgTGludXggUFRFLgorCSAqIEl0IGlzIGJpdCAyNSBpbiB0aGUgTGludXggUFRFIGFuZCBiaXQgMzAgaW4gdGhlIFRXQworCSAqLworCXJsd2ltaQlyMTEsIHIxMCwgMzItNSwgMzAsIDMwCiAJRE9fOHh4X0NQVTYoMHgzYjgwLCByMykKIAltdHNwcglTUFJOX01EX1RXQywgcjExCiAKLSNpZmRlZiBDT05GSUdfU1dBUAotCS8qIGRvIG5vdCBzZXQgdGhlIF9QQUdFX0FDQ0VTU0VEIGJpdCBvZiBhIG5vbi1wcmVzZW50IHBhZ2UgKi8KLQlhbmRpLglyMTEsIHIxMCwgX1BBR0VfUFJFU0VOVAotCWJlcQk0ZgotCW9yaQlyMTAsIHIxMCwgX1BBR0VfQUNDRVNTRUQKLTQ6Ci0JLyogYW5kIHVwZGF0ZSBwdGUgaW4gdGFibGUgKi8KLSNlbHNlCi0Jb3JpCXIxMCwgcjEwLCBfUEFHRV9BQ0NFU1NFRAotI2VuZGlmCi0JbWZzcHIJcjExLCBTUFJOX01EX1RXQwkvKiBnZXQgdGhlIHB0ZSBhZGRyZXNzIGFnYWluICovCi0Jc3R3CXIxMCwgMChyMTEpCisJLyogQm90aCBfUEFHRV9BQ0NFU1NFRCBhbmQgX1BBR0VfUFJFU0VOVCBoYXMgdG8gYmUgc2V0LgorCSAqIFdlIGFsc28gbmVlZCB0byBrbm93IGlmIHRoZSBpbnNuIGlzIGEgbG9hZC9zdG9yZSwgc286CisJICogQ2xlYXIgX1BBR0VfUFJFU0VOVCBhbmQgbG9hZCB0aGF0IHdoaWNoIHdpbGwKKwkgKiB0cmFwIGludG8gRFRMQiBFcnJvciB3aXRoIHN0b3JlIGJpdCBzZXQgYWNjb3JkaW5seS4KKwkgKi8KKwkvKiBQUkVTRU5UPTB4MSwgQUNDRVNTRUQ9MHgyMAorCSAqIHIxMSA9ICgocjEwICYgUFJFU0VOVCkgJiAoKHIxMCAmIEFDQ0VTU0VEKSA+PiA1KSk7CisJICogcjEwID0gKHIxMCAmIH5QUkVTRU5UKSB8IHIxMTsKKwkgKi8KKwlybHdpbm0JcjExLCByMTAsIDMyLTUsIF9QQUdFX1BSRVNFTlQKKwlhbmQJcjExLCByMTEsIHIxMAorCXJsd2ltaQlyMTAsIHIxMSwgMCwgX1BBR0VfUFJFU0VOVAorCisJLyogSG9ub3VyIGtlcm5lbCBSTywgVXNlciBOQSAqLworCS8qIDB4MjAwID09IEV4dGVuZGVkIGVuY29kaW5nLCBiaXQgMjIgKi8KKwkvKiByMTEgPSAgKHIxMCAmIF9QQUdFX1VTRVIpID4+IDIgKi8KKwlybHdpbm0JcjExLCByMTAsIDMyLTIsIDB4MjAwCisJb3IJcjEwLCByMTEsIHIxMAorCS8qIHIxMSA9ICAocjEwICYgX1BBR0VfUlcpID4+IDEgKi8KKwlybHdpbm0JcjExLCByMTAsIDMyLTEsIDB4MjAwCisJb3IJcjEwLCByMTEsIHIxMAorCS8qIGludmVydCBSVyBhbmQgMHgyMDAgYml0cyAqLworCXhvcmkJcjEwLCByMTAsIF9QQUdFX1JXIHwgMHgyMDAKIAogCS8qIFRoZSBMaW51eCBQVEUgd29uJ3QgZ28gZXhhY3RseSBpbnRvIHRoZSBNTVUgVExCLgotCSAqIFNvZnR3YXJlIGluZGljYXRvciBiaXRzIDIxLCAyMiBhbmQgMjggbXVzdCBiZSBjbGVhci4KKwkgKiBTb2Z0d2FyZSBpbmRpY2F0b3IgYml0cyAyMiBhbmQgMjggbXVzdCBiZSBjbGVhci4KIAkgKiBTb2Z0d2FyZSBpbmRpY2F0b3IgYml0cyAyNCwgMjUsIDI2LCBhbmQgMjcgbXVzdCBiZQogCSAqIHNldC4gIEFsbCBvdGhlciBMaW51eCBQVEUgYml0cyBjb250cm9sIHRoZSBiZWhhdmlvcgogCSAqIG9mIHRoZSBNTVUuCiAJICovCiAyOglsaQlyMTEsIDB4MDBmMAorCW10c3ByCVNQUk5fREFSLHIxMQkvKiBUYWcgREFSICovCiAJcmx3aW1pCXIxMCwgcjExLCAwLCAyNCwgMjgJLyogU2V0IDI0LTI3LCBjbGVhciAyOCAqLwogCURPXzh4eF9DUFU2KDB4M2Q4MCwgcjMpCiAJbXRzcHIJU1BSTl9NRF9SUE4sIHIxMAkvKiBVcGRhdGUgVExCIGVudHJ5ICovCkBAIC00NjksOTcgKzUwMSwxMCBAQAogCXN0dwlyMTAsIDAocjApCiAJc3R3CXIxMSwgNChyMCkKIAotCS8qIEZpcnN0LCBtYWtlIHN1cmUgdGhpcyB3YXMgYSBzdG9yZSBvcGVyYXRpb24uCi0JKi8KLQltZnNwcglyMTAsIFNQUk5fRFNJU1IKLQlhbmRpcy4JcjExLCByMTAsIDB4MDIwMAkvKiBJZiBzZXQsIGluZGljYXRlcyBzdG9yZSBvcCAqLwotCWJlcQkyZgotCi0JLyogVGhlIEVBIG9mIGEgZGF0YSBUTEIgbWlzcyBpcyBhdXRvbWF0aWNhbGx5IHN0b3JlZCBpbiB0aGUgTURfRVBOCi0JICogcmVnaXN0ZXIuICBUaGUgRUEgb2YgYSBkYXRhIFRMQiBlcnJvciBpcyBhdXRvbWF0aWNhbGx5IHN0b3JlZCBpbgotCSAqIHRoZSBEQVIsIGJ1dCBub3QgdGhlIE1EX0VQTiByZWdpc3Rlci4gIFdlIG11c3QgY29weSB0aGUgMjAgbW9zdAotCSAqIHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIEVBIGZyb20gdGhlIERBUiB0byBNRF9FUE4gYmVmb3JlIHdlCi0JICogc3RhcnQgd2Fsa2luZyB0aGUgcGFnZSB0YWJsZXMuICBXZSBhbHNvIG5lZWQgdG8gY29weSB0aGUgQ0FTSUQKLQkgKiB2YWx1ZSBmcm9tIHRoZSBNX0NBU0lEIHJlZ2lzdGVyLgotCSAqIEFkZGVuZHVtOiAgVGhlIEVBIG9mIGEgZGF0YSBUTEIgZXJyb3IgaXMgX3N1cHBvc2VkXyB0byBiZSBzdG9yZWQKLQkgKiBpbiBEQVIsIGJ1dCBpdCBzZWVtcyB0aGF0IHRoaXMgZG9lc24ndCBoYXBwZW4gaW4gc29tZSBjYXNlcywgc3VjaAotCSAqIGFzIHdoZW4gdGhlIGVycm9yIGlzIGR1ZSB0byBhIGRjYmkgaW5zdHJ1Y3Rpb24gdG8gYSBwYWdlIHdpdGggYQotCSAqIFRMQiB0aGF0IGRvZXNuJ3QgaGF2ZSB0aGUgY2hhbmdlZCBiaXQgc2V0LiAgSW4gc3VjaCBjYXNlcywgdGhlcmUKLQkgKiBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYW55IHdheSAgdG8gcmVjb3ZlciB0aGUgRUEgb2YgdGhlIGVycm9yCi0JICogc2luY2UgaXQgaXMgbmVpdGhlciBpbiBEQVIgbm9yIE1EX0VQTi4gIEFzIGEgd29ya2Fyb3VuZCwgdGhlCi0JICogX1BBR0VfSFdXUklURSBiaXQgaXMgc2V0IGZvciBhbGwga2VybmVsIGRhdGEgcGFnZXMgd2hlbiB0aGUgUFRFcwotCSAqIGFyZSBpbml0aWFsaXplZCBpbiBtYXBpbl9yYW0oKS4gIFRoaXMgd2lsbCBhdm9pZCB0aGUgcHJvYmxlbSwKLQkgKiBhc3N1bWluZyB3ZSBvbmx5IHVzZSB0aGUgZGNiaSBpbnN0cnVjdGlvbiBvbiBrZXJuZWwgYWRkcmVzc2VzLgotCSAqLwogCW1mc3ByCXIxMCwgU1BSTl9EQVIKLQlybHdpbm0JcjExLCByMTAsIDAsIDAsIDE5Ci0Jb3JpCXIxMSwgcjExLCBNRF9FVkFMSUQKLQltZnNwcglyMTAsIFNQUk5fTV9DQVNJRAotCXJsd2ltaQlyMTEsIHIxMCwgMCwgMjgsIDMxCi0JRE9fOHh4X0NQVTYoMHgzNzgwLCByMykKLQltdHNwcglTUFJOX01EX0VQTiwgcjExCi0KLQltZnNwcglyMTAsIFNQUk5fTV9UV0IJLyogR2V0IGxldmVsIDEgdGFibGUgZW50cnkgYWRkcmVzcyAqLwotCi0JLyogSWYgd2UgYXJlIGZhdWx0aW5nIGEga2VybmVsIGFkZHJlc3MsIHdlIGhhdmUgdG8gdXNlIHRoZQotCSAqIGtlcm5lbCBwYWdlIHRhYmxlcy4KLQkgKi8KLQlhbmRpLglyMTEsIHIxMCwgMHgwODAwCi0JYmVxCTNmCi0JbGlzCXIxMSwgc3dhcHBlcl9wZ19kaXJAaAotCW9yaQlyMTEsIHIxMSwgc3dhcHBlcl9wZ19kaXJAbAotCXJsd2ltaQlyMTAsIHIxMSwgMCwgMiwgMTkKLTM6Ci0JbHd6CXIxMSwgMChyMTApCS8qIEdldCB0aGUgbGV2ZWwgMSBlbnRyeSAqLwotCXJsd2lubS4JcjEwLCByMTEsMCwwLDE5CS8qIEV4dHJhY3QgcGFnZSBkZXNjcmlwdG9yIHBhZ2UgYWRkcmVzcyAqLwotCWJlcQkyZgkJLyogSWYgemVybywgYmFpbCAqLwotCi0JLyogV2UgaGF2ZSBhIHB0ZSB0YWJsZSwgc28gZmV0Y2ggdGhlIHB0ZSBmcm9tIHRoZSB0YWJsZS4KLQkgKi8KLQlvcmkJcjExLCByMTEsIDEJCS8qIFNldCB2YWxpZCBiaXQgaW4gcGh5c2ljYWwgTDIgcGFnZSAqLwotCURPXzh4eF9DUFU2KDB4M2I4MCwgcjMpCi0JbXRzcHIJU1BSTl9NRF9UV0MsIHIxMQkJLyogTG9hZCBwdGUgdGFibGUgYmFzZSBhZGRyZXNzICovCi0JbWZzcHIJcjExLCBTUFJOX01EX1RXQwkJLyogLi4uLmFuZCBnZXQgdGhlIHB0ZSBhZGRyZXNzICovCi0JbHd6CXIxMCwgMChyMTEpCQkvKiBHZXQgdGhlIHB0ZSAqLwotCi0JYW5kaS4JcjExLCByMTAsIF9QQUdFX1JXCS8qIElzIGl0IHdyaXRlYWJsZT8gKi8KLQliZXEJMmYJCQkvKiBCYWlsIG91dCBpZiBub3QgKi8KLQotCS8qIFVwZGF0ZSAnY2hhbmdlZCcsIGFtb25nIG90aGVycy4KLQkqLwotI2lmZGVmIENPTkZJR19TV0FQCi0Jb3JpCXIxMCwgcjEwLCBfUEFHRV9ESVJUWXxfUEFHRV9IV1dSSVRFCi0JLyogZG8gbm90IHNldCB0aGUgX1BBR0VfQUNDRVNTRUQgYml0IG9mIGEgbm9uLXByZXNlbnQgcGFnZSAqLwotCWFuZGkuCXIxMSwgcjEwLCBfUEFHRV9QUkVTRU5UCi0JYmVxCTRmCi0Jb3JpCXIxMCwgcjEwLCBfUEFHRV9BQ0NFU1NFRAotNDoKLSNlbHNlCi0Jb3JpCXIxMCwgcjEwLCBfUEFHRV9ESVJUWXxfUEFHRV9BQ0NFU1NFRHxfUEFHRV9IV1dSSVRFCi0jZW5kaWYKLQltZnNwcglyMTEsIFNQUk5fTURfVFdDCQkvKiBHZXQgcHRlIGFkZHJlc3MgYWdhaW4gKi8KLQlzdHcJcjEwLCAwKHIxMSkJCS8qIGFuZCB1cGRhdGUgcHRlIGluIHRhYmxlICovCi0KLQkvKiBUaGUgTGludXggUFRFIHdvbid0IGdvIGV4YWN0bHkgaW50byB0aGUgTU1VIFRMQi4KLQkgKiBTb2Z0d2FyZSBpbmRpY2F0b3IgYml0cyAyMSwgMjIgYW5kIDI4IG11c3QgYmUgY2xlYXIuCi0JICogU29mdHdhcmUgaW5kaWNhdG9yIGJpdHMgMjQsIDI1LCAyNiwgYW5kIDI3IG11c3QgYmUKLQkgKiBzZXQuICBBbGwgb3RoZXIgTGludXggUFRFIGJpdHMgY29udHJvbCB0aGUgYmVoYXZpb3IKLQkgKiBvZiB0aGUgTU1VLgotCSAqLwotCWxpCXIxMSwgMHgwMGYwCi0Jcmx3aW1pCXIxMCwgcjExLCAwLCAyNCwgMjgJLyogU2V0IDI0LTI3LCBjbGVhciAyOCAqLwotCURPXzh4eF9DUFU2KDB4M2Q4MCwgcjMpCi0JbXRzcHIJU1BSTl9NRF9SUE4sIHIxMAkvKiBVcGRhdGUgVExCIGVudHJ5ICovCi0KLQltZnNwcglyMTAsIFNQUk5fTV9UVwkvKiBSZXN0b3JlIHJlZ2lzdGVycyAqLwotCWx3eglyMTEsIDAocjApCi0JbXRjcglyMTEKLQlsd3oJcjExLCA0KHIwKQotI2lmZGVmIENPTkZJR184eHhfQ1BVNgotCWx3eglyMywgOChyMCkKLSNlbmRpZgotCXJmaQotMjoKKwljbXB3aQljcjAsIHIxMCwgMHgwMGYwCisJYmVxLQlGaXh1cERBUgkvKiBtdXN0IGJlIGEgYnVnZ3kgZGNiWCwgaWNiaSBpbnNuLiAqLworREFSRml4ZWQ6LyogUmV0dXJuIGZyb20gZGNieCBpbnN0cnVjdGlvbiBidWcgd29ya2Fyb3VuZCwgcjEwIGhvbGRzIHZhbHVlIG9mIERBUiAqLwogCW1mc3ByCXIxMCwgU1BSTl9NX1RXCS8qIFJlc3RvcmUgcmVnaXN0ZXJzICovCiAJbHd6CXIxMSwgMChyMCkKIAltdGNyCXIxMQpAQCAtNTg4LDYgKzUzMywxNDAgQEAKIAogCS4gPSAweDIwMDAKIAorLyogVGhpcyBpcyB0aGUgcHJvY2VkdXJlIHRvIGNhbGN1bGF0ZSB0aGUgZGF0YSBFQSBmb3IgYnVnZ3kgZGNieCxkY2JpIGluc3RydWN0aW9ucworICogYnkgZGVjb2RpbmcgdGhlIHJlZ2lzdGVycyB1c2VkIGJ5IHRoZSBkY2J4IGluc3RydWN0aW9uIGFuZCBhZGRpbmcgdGhlbS4KKyAqIERBUiBpcyBzZXQgdG8gdGhlIGNhbGN1bGF0ZWQgYWRkcmVzcyBhbmQgcjEwIGFsc28gaG9sZHMgdGhlIEVBIG9uIGV4aXQuCisgKi8KKyAvKiBkZWZpbmUgaWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIHNlbGYgbW9kaWZ5aW5nIGNvZGUgKi8KKyNkZWZpbmUgTk9fU0VMRl9NT0RJRllJTkdfQ09ERQorRml4dXBEQVI6LyogRW50cnkgcG9pbnQgZm9yIGRjYnggd29ya2Fyb3VuZC4gKi8KKwkvKiBmZXRjaCBpbnN0cnVjdGlvbiBmcm9tIG1lbW9yeS4gKi8KKwltZnNwcglyMTAsIFNQUk5fU1JSMAorCURPXzh4eF9DUFU2KDB4Mzc4MCwgcjMpCisJbXRzcHIJU1BSTl9NRF9FUE4sIHIxMAorCW1mc3ByCXIxMSwgU1BSTl9NX1RXQgkvKiBHZXQgbGV2ZWwgMSB0YWJsZSBlbnRyeSBhZGRyZXNzICovCisJY21wbHdpCWNyMCwgcjExLCAweDA4MDAKKwlibHQtCTNmCQkvKiBCcmFuY2ggaWYgdXNlciBzcGFjZSAqLworCWxpcwlyMTEsIChzd2FwcGVyX3BnX2Rpci1QQUdFX09GRlNFVClAaAorCW9yaQlyMTEsIHIxMSwgKHN3YXBwZXJfcGdfZGlyLVBBR0VfT0ZGU0VUKUBsCisJcmx3aW1pCXIxMSwgcjEwLCAzMi0yMCwgMHhmZmMgLyogcjExID0gcjExJn4weGZmY3wocjEwPj4yMCkmMHhmZmMgKi8KKzM6CWx3eglyMTEsIDAocjExKQkvKiBHZXQgdGhlIGxldmVsIDEgZW50cnkgKi8KKwlET184eHhfQ1BVNigweDNiODAsIHIzKQorCW10c3ByCVNQUk5fTURfVFdDLCByMTEJLyogTG9hZCBwdGUgdGFibGUgYmFzZSBhZGRyZXNzICovCisJbWZzcHIJcjExLCBTUFJOX01EX1RXQwkvKiAuLi4uYW5kIGdldCB0aGUgcHRlIGFkZHJlc3MgKi8KKwlsd3oJcjExLCAwKHIxMSkJLyogR2V0IHRoZSBwdGUgKi8KKwkvKiBjb25jYXQgcGh5c2ljYWwgcGFnZSBhZGRyZXNzKHIxMSkgYW5kIHBhZ2Ugb2Zmc2V0KHIxMCkgKi8KKwlybHdpbWkJcjExLCByMTAsIDAsIDIwLCAzMQorCWx3eglyMTEsMChyMTEpCisvKiBDaGVjayBpZiBpdCByZWFsbHkgaXMgYSBkY2J4IGluc3RydWN0aW9uLiAqLworLyogZGNidCBhbmQgZGNidHN0IGRvZXMgbm90IGdlbmVyYXRlIERUTEIgTWlzc2VzL0Vycm9ycywKKyAqIG5vIG5lZWQgdG8gaW5jbHVkZSB0aGVtIGhlcmUgKi8KKwlzcndpCXIxMCwgcjExLCAyNgkvKiBjaGVjayBpZiBtYWpvciBPUCBjb2RlIGlzIDMxICovCisJY21wd2kJY3IwLCByMTAsIDMxCisJYm5lLQkxNDFmCisJcmx3aW5tCXIxMCwgcjExLCAwLCAyMSwgMzAKKwljbXB3aQljcjAsIHIxMCwgMjAyOAkvKiBJcyBkY2J6PyAqLworCWJlcSsJMTQyZgorCWNtcHdpCWNyMCwgcjEwLCA5NDAJLyogSXMgZGNiaT8gKi8KKwliZXErCTE0MmYKKwljbXB3aQljcjAsIHIxMCwgMTA4CS8qIElzIGRjYnN0PyAqLworCWJlcSsJMTQ0ZgkJLyogRml4IHVwIHN0b3JlIGJpdCEgKi8KKwljbXB3aQljcjAsIHIxMCwgMTcyCS8qIElzIGRjYmY/ICovCisJYmVxKwkxNDJmCisJY21wd2kJY3IwLCByMTAsIDE5NjQJLyogSXMgaWNiaT8gKi8KKwliZXErCTE0MmYKKzE0MToJbWZzcHIJcjEwLCBTUFJOX0RBUgkvKiByMTAgbXVzdCBob2xkIERBUiBhdCBleGl0ICovCisJYglEQVJGaXhlZAkvKiBOb3BlLCBnbyBiYWNrIHRvIG5vcm1hbCBUTEIgcHJvY2Vzc2luZyAqLworCisxNDQ6CW1mc3ByCXIxMCwgU1BSTl9EU0lTUgorCXJsd2lubQlyMTAsIHIxMCwwLDcsNQkvKiBDbGVhciBzdG9yZSBiaXQgZm9yIGJ1Z2d5IGRjYnN0IGluc24gKi8KKwltdHNwcglTUFJOX0RTSVNSLCByMTAKKzE0MjoJLyogY29udGludWUsIGl0IHdhcyBhIGRjYngsIGRjYmkgaW5zdHJ1Y3Rpb24uICovCisjaWZkZWYgQ09ORklHXzh4eF9DUFU2CisJbHd6CXIzLCA4KHIwKQkvKiByZXN0b3JlIHIzIGZyb20gbWVtb3J5ICovCisjZW5kaWYKKyNpZm5kZWYgTk9fU0VMRl9NT0RJRllJTkdfQ09ERQorCWFuZGlzLglyMTAscjExLDB4MWYJLyogdGVzdCBpZiByZWcgUkEgaXMgcjAgKi8KKwlsaQlyMTAsbW9kaWZpZWRfaW5zdHJAbAorCWRjYnRzdAlyMCxyMTAJCS8qIHRvdWNoIGZvciBzdG9yZSAqLworCXJsd2lubQlyMTEscjExLDAsMCwyMAkvKiBaZXJvIGxvd2VyIDEwIGJpdHMgKi8KKwlvcmlzCXIxMSxyMTEsNjQwCS8qIFRyYW5zZm9ybSBpbnN0ci4gdG8gYSAiYWRkIHIxMCxSQSxSQiIgKi8KKwlvcmkJcjExLHIxMSw1MzIKKwlzdHcJcjExLDAocjEwKQkvKiBzdG9yZSBhZGQvYW5kIGluc3RydWN0aW9uICovCisJZGNiZgkwLHIxMAkJLyogZmx1c2ggbmV3IGluc3RyLiB0byBtZW1vcnkuICovCisJaWNiaQkwLHIxMAkJLyogaW52YWxpZGF0ZSBpbnN0ci4gY2FjaGUgbGluZSAqLworCWx3eglyMTEsIDQocjApCS8qIHJlc3RvcmUgcjExIGZyb20gbWVtb3J5ICovCisJbWZzcHIJcjEwLCBTUFJOX01fVFcJLyogcmVzdG9yZSByMTAgZnJvbSBNX1RXICovCisJaXN5bmMJCQkvKiBXYWl0IHVudGlsIG5ldyBpbnN0ciBpcyBsb2FkZWQgZnJvbSBtZW1vcnkgKi8KK21vZGlmaWVkX2luc3RyOgorCS5zcGFjZQk0CQkvKiB0aGlzIGlzIHdoZXJlIHRoZSBhZGQgaW5zdHIuIGlzIHN0b3JlZCAqLworCWJuZSsJMTQzZgorCXN1YmYJcjEwLHIwLHIxMAkvKiByMTA9cjEwLXIwLCBvbmx5IGlmIHJlZyBSQSBpcyByMCAqLworMTQzOgltdGRhcglyMTAJCS8qIHN0b3JlIGZhdWx0aW5nIEVBIGluIERBUiAqLworCWIJREFSRml4ZWQJLyogR28gYmFjayB0byBub3JtYWwgVExCIGhhbmRsaW5nICovCisjZWxzZQorCW1mY3RyCXIxMAorCW10ZGFyCXIxMAkJCS8qIHNhdmUgY3RyIHJlZyBpbiBEQVIgKi8KKwlybHdpbm0JcjEwLCByMTEsIDI0LCAyNCwgMjgJLyogb2Zmc2V0IGludG8ganVtcCB0YWJsZSBmb3IgcmVnIFJCICovCisJYWRkaQlyMTAsIHIxMCwgMTUwZkBsCS8qIGFkZCBzdGFydCBvZiB0YWJsZSAqLworCW10Y3RyCXIxMAkJCS8qIGxvYWQgY3RyIHdpdGgganVtcCBhZGRyZXNzICovCisJeG9yCXIxMCwgcjEwLCByMTAJCS8qIHN1bSBzdGFydHMgYXQgemVybyAqLworCWJjdHIJCQkJLyoganVtcCBpbnRvIHRhYmxlICovCisxNTA6CisJYWRkCXIxMCwgcjEwLCByMAk7YgkxNTFmCisJYWRkCXIxMCwgcjEwLCByMQk7YgkxNTFmCisJYWRkCXIxMCwgcjEwLCByMgk7YgkxNTFmCisJYWRkCXIxMCwgcjEwLCByMwk7YgkxNTFmCisJYWRkCXIxMCwgcjEwLCByNAk7YgkxNTFmCisJYWRkCXIxMCwgcjEwLCByNQk7YgkxNTFmCisJYWRkCXIxMCwgcjEwLCByNgk7YgkxNTFmCisJYWRkCXIxMCwgcjEwLCByNwk7YgkxNTFmCisJYWRkCXIxMCwgcjEwLCByOAk7YgkxNTFmCisJYWRkCXIxMCwgcjEwLCByOQk7YgkxNTFmCisJbXRjdHIJcjExCTtiCTE1NGYJLyogcjEwIG5lZWRzIHNwZWNpYWwgaGFuZGxpbmcgKi8KKwltdGN0cglyMTEJO2IJMTUzZgkvKiByMTEgbmVlZHMgc3BlY2lhbCBoYW5kbGluZyAqLworCWFkZAlyMTAsIHIxMCwgcjEyCTtiCTE1MWYKKwlhZGQJcjEwLCByMTAsIHIxMwk7YgkxNTFmCisJYWRkCXIxMCwgcjEwLCByMTQJO2IJMTUxZgorCWFkZAlyMTAsIHIxMCwgcjE1CTtiCTE1MWYKKwlhZGQJcjEwLCByMTAsIHIxNgk7YgkxNTFmCisJYWRkCXIxMCwgcjEwLCByMTcJO2IJMTUxZgorCWFkZAlyMTAsIHIxMCwgcjE4CTtiCTE1MWYKKwlhZGQJcjEwLCByMTAsIHIxOQk7YgkxNTFmCisJYWRkCXIxMCwgcjEwLCByMjAJO2IJMTUxZgorCWFkZAlyMTAsIHIxMCwgcjIxCTtiCTE1MWYKKwlhZGQJcjEwLCByMTAsIHIyMgk7YgkxNTFmCisJYWRkCXIxMCwgcjEwLCByMjMJO2IJMTUxZgorCWFkZAlyMTAsIHIxMCwgcjI0CTtiCTE1MWYKKwlhZGQJcjEwLCByMTAsIHIyNQk7YgkxNTFmCisJYWRkCXIxMCwgcjEwLCByMjYJO2IJMTUxZgorCWFkZAlyMTAsIHIxMCwgcjI3CTtiCTE1MWYKKwlhZGQJcjEwLCByMTAsIHIyOAk7YgkxNTFmCisJYWRkCXIxMCwgcjEwLCByMjkJO2IJMTUxZgorCWFkZAlyMTAsIHIxMCwgcjMwCTtiCTE1MWYKKwlhZGQJcjEwLCByMTAsIHIzMQorMTUxOgorCXJsd2lubS4gcjExLHIxMSwxOSwyNCwyOAkvKiBvZmZzZXQgaW50byBqdW1wIHRhYmxlIGZvciByZWcgUkEgKi8KKwliZXEJMTUyZgkJCS8qIGlmIHJlZyBSQSBpcyB6ZXJvLCBkb24ndCBhZGQgaXQgKi8KKwlhZGRpCXIxMSwgcjExLCAxNTBiQGwJLyogYWRkIHN0YXJ0IG9mIHRhYmxlICovCisJbXRjdHIJcjExCQkJLyogbG9hZCBjdHIgd2l0aCBqdW1wIGFkZHJlc3MgKi8KKwlybHdpbm0JcjExLHIxMSwwLDE2LDEwCQkvKiBtYWtlIHN1cmUgd2UgZG9uJ3QgZXhlY3V0ZSB0aGlzIG1vcmUgdGhhbiBvbmNlICovCisJYmN0cgkJCQkvKiBqdW1wIGludG8gdGFibGUgKi8KKzE1MjoKKwltZmRhcglyMTEKKwltdGN0cglyMTEJCQkvKiByZXN0b3JlIGN0ciByZWcgZnJvbSBEQVIgKi8KKwltdGRhcglyMTAJCQkvKiBzYXZlIGZhdWx0IEVBIHRvIERBUiAqLworCWIJREFSRml4ZWQJCS8qIEdvIGJhY2sgdG8gbm9ybWFsIFRMQiBoYW5kbGluZyAqLworCisJLyogc3BlY2lhbCBoYW5kbGluZyBmb3IgcjEwLHIxMSBzaW5jZSB0aGVzZSBhcmUgbW9kaWZpZWQgYWxyZWFkeSAqLworMTUzOglsd3oJcjExLCA0KHIwKQkvKiBsb2FkIHIxMSBmcm9tIG1lbW9yeSAqLworCWIJMTU1ZgorMTU0OgltZnNwcglyMTEsIFNQUk5fTV9UVwkvKiBsb2FkIHIxMCBmcm9tIE1fVFcgKi8KKzE1NToJYWRkCXIxMCwgcjEwLCByMTEJLyogYWRkIGl0ICovCisJbWZjdHIJcjExCQkvKiByZXN0b3JlIHIxMSAqLworCWIJMTUxYgorI2VuZGlmCisKIAkuZ2xvYmwJZ2l2ZXVwX2ZwdQogZ2l2ZXVwX2ZwdToKIAlibHIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF9mc2xfYm9va2UuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF9mc2xfYm9va2UuUwppbmRleCA5NzU3ODhjLi43ZjRiZDdmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfZnNsX2Jvb2tlLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkX2ZzbF9ib29rZS5TCkBAIC05NDQsMjggKzk0NCw2IEBACiAJYmxyCiAKIC8qCi0gKiBleHRlcm4gdm9pZCBsb2FkY2FtX2VudHJ5KHVuc2lnbmVkIGludCBpbmRleCkKLSAqCi0gKiBMb2FkIFRMQkNBTVtpbmRleF0gZW50cnkgaW4gdG8gdGhlIEwyIENBTSBNTVUKLSAqLwotX0dMT0JBTChsb2FkY2FtX2VudHJ5KQotCWxpcwlyNCxUTEJDQU1AaGEKLQlhZGRpCXI0LHI0LFRMQkNBTUBsCi0JbXVsbGkJcjUscjMsVExCQ0FNX1NJWkUKLQlhZGQJcjMscjUscjQKLQlsd3oJcjQsMChyMykKLQltdHNwcglTUFJOX01BUzAscjQKLQlsd3oJcjQsNChyMykKLQltdHNwcglTUFJOX01BUzEscjQKLQlsd3oJcjQsOChyMykKLQltdHNwcglTUFJOX01BUzIscjQKLQlsd3oJcjQsMTIocjMpCi0JbXRzcHIJU1BSTl9NQVMzLHI0Ci0JdGxid2UKLQlpc3luYwotCWJscgotCi0vKgogICogZXh0ZXJuIHZvaWQgZ2l2ZXVwX2FsdGl2ZWMoc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KQogICoKICAqIFRoZSBlNTAwIGNvcmUgZG9lcyBub3QgaGF2ZSBhbiBBbHRpVmVjIHVuaXQuCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lvLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lvLmMKaW5kZXggMTg4MmJmNC4uOGRjNzU0N2MgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW8uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lvLmMKQEAgLTE2MSw3ICsxNjEsNyBAQAogCQlkZXN0Kys7CiAJCW4tLTsKIAl9Ci0Jd2hpbGUobiA+IDQpIHsKKwl3aGlsZShuID49IDQpIHsKIAkJKigodTMyICopZGVzdCkgPSAqKCh2b2xhdGlsZSB1MzIgKil2c3JjKTsKIAkJZWllaW8oKTsKIAkJdnNyYyArPSA0OwpAQCAtMTkwLDcgKzE5MCw3IEBACiAJCXZkZXN0Kys7CiAJCW4tLTsKIAl9Ci0Jd2hpbGUobiA+IDQpIHsKKwl3aGlsZShuID49IDQpIHsKIAkJKigodm9sYXRpbGUgdTMyICopdmRlc3QpID0gKigodm9sYXRpbGUgdTMyICopc3JjKTsKIAkJc3JjICs9IDQ7CiAJCXZkZXN0ICs9IDQ7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYwppbmRleCAwMmEzMzQ2Li5mNmRjYTRmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMKQEAgLTg3LDcgKzg3LDEwIEBACiAjZW5kaWYgLyogQ09ORklHX1BQQzMyICovCiAKICNpZmRlZiBDT05GSUdfUFBDNjQKKworI2lmbmRlZiBDT05GSUdfU1BBUlNFX0lSUQogRVhQT1JUX1NZTUJPTChpcnFfZGVzYyk7CisjZW5kaWYKIAogaW50IGRpc3RyaWJ1dGVfaXJxcyA9IDE7CiAKQEAgLTE4OSwzMyArMTkyLDcgQEAKIAkJZm9yX2VhY2hfb25saW5lX2NwdShqKQogCQkJc2VxX3ByaW50ZihwLCAiQ1BVJWQgICAgICAgIiwgaik7CiAJCXNlcV9wdXRjKHAsICdcbicpOwotCX0KLQotCWlmIChpIDwgTlJfSVJRUykgewotCQlkZXNjID0gZ2V0X2lycV9kZXNjKGkpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwotCQlhY3Rpb24gPSBkZXNjLT5hY3Rpb247Ci0JCWlmICghYWN0aW9uIHx8ICFhY3Rpb24tPmhhbmRsZXIpCi0JCQlnb3RvIHNraXA7Ci0JCXNlcV9wcmludGYocCwgIiUzZDogIiwgaSk7Ci0jaWZkZWYgQ09ORklHX1NNUAotCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGopCi0JCQlzZXFfcHJpbnRmKHAsICIlMTB1ICIsIGtzdGF0X2lycXNfY3B1KGksIGopKTsKLSNlbHNlCi0JCXNlcV9wcmludGYocCwgIiUxMHUgIiwga3N0YXRfaXJxcyhpKSk7Ci0jZW5kaWYgLyogQ09ORklHX1NNUCAqLwotCQlpZiAoZGVzYy0+Y2hpcCkKLQkJCXNlcV9wcmludGYocCwgIiAlcyAiLCBkZXNjLT5jaGlwLT50eXBlbmFtZSk7Ci0JCWVsc2UKLQkJCXNlcV9wdXRzKHAsICIgIE5vbmUgICAgICAiKTsKLQkJc2VxX3ByaW50ZihwLCAiJXMiLCAoZGVzYy0+c3RhdHVzICYgSVJRX0xFVkVMKSA/ICJMZXZlbCAiIDogIkVkZ2UgICIpOwotCQlzZXFfcHJpbnRmKHAsICIgICAgJXMiLCBhY3Rpb24tPm5hbWUpOwotCQlmb3IgKGFjdGlvbiA9IGFjdGlvbi0+bmV4dDsgYWN0aW9uOyBhY3Rpb24gPSBhY3Rpb24tPm5leHQpCi0JCQlzZXFfcHJpbnRmKHAsICIsICVzIiwgYWN0aW9uLT5uYW1lKTsKLQkJc2VxX3B1dGMocCwgJ1xuJyk7Ci1za2lwOgotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXNjLT5sb2NrLCBmbGFncyk7Ci0JfSBlbHNlIGlmIChpID09IE5SX0lSUVMpIHsKKwl9IGVsc2UgaWYgKGkgPT0gbnJfaXJxcykgewogI2lmIGRlZmluZWQoQ09ORklHX1BQQzMyKSAmJiBkZWZpbmVkKENPTkZJR19UQVVfSU5UKQogCQlpZiAodGF1X2luaXRpYWxpemVkKXsKIAkJCXNlcV9wdXRzKHAsICJUQVU6ICIpOwpAQCAtMjI1LDMwICsyMDIsNjggQEAKIAkJfQogI2VuZGlmIC8qIENPTkZJR19QUEMzMiAmJiBDT05GSUdfVEFVX0lOVCovCiAJCXNlcV9wcmludGYocCwgIkJBRDogJTEwdVxuIiwgcHBjX3NwdXJpb3VzX2ludGVycnVwdHMpOworCisJCXJldHVybiAwOwogCX0KKworCWRlc2MgPSBpcnFfdG9fZGVzYyhpKTsKKwlpZiAoIWRlc2MpCisJCXJldHVybiAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKKworCWFjdGlvbiA9IGRlc2MtPmFjdGlvbjsKKwlpZiAoIWFjdGlvbiB8fCAhYWN0aW9uLT5oYW5kbGVyKQorCQlnb3RvIHNraXA7CisKKwlzZXFfcHJpbnRmKHAsICIlM2Q6ICIsIGkpOworI2lmZGVmIENPTkZJR19TTVAKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGopCisJCXNlcV9wcmludGYocCwgIiUxMHUgIiwga3N0YXRfaXJxc19jcHUoaSwgaikpOworI2Vsc2UKKwlzZXFfcHJpbnRmKHAsICIlMTB1ICIsIGtzdGF0X2lycXMoaSkpOworI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KKworCWlmIChkZXNjLT5jaGlwKQorCQlzZXFfcHJpbnRmKHAsICIgJXMgIiwgZGVzYy0+Y2hpcC0+bmFtZSk7CisJZWxzZQorCQlzZXFfcHV0cyhwLCAiICBOb25lICAgICAgIik7CisKKwlzZXFfcHJpbnRmKHAsICIlcyIsIChkZXNjLT5zdGF0dXMgJiBJUlFfTEVWRUwpID8gIkxldmVsICIgOiAiRWRnZSAgIik7CisJc2VxX3ByaW50ZihwLCAiICAgICVzIiwgYWN0aW9uLT5uYW1lKTsKKworCWZvciAoYWN0aW9uID0gYWN0aW9uLT5uZXh0OyBhY3Rpb247IGFjdGlvbiA9IGFjdGlvbi0+bmV4dCkKKwkJc2VxX3ByaW50ZihwLCAiLCAlcyIsIGFjdGlvbi0+bmFtZSk7CisJc2VxX3B1dGMocCwgJ1xuJyk7CisKK3NraXA6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOworCiAJcmV0dXJuIDA7CiB9CiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIHZvaWQgZml4dXBfaXJxcyhjcHVtYXNrX3QgbWFwKQogeworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKIAl1bnNpZ25lZCBpbnQgaXJxOwogCXN0YXRpYyBpbnQgd2FybmVkOwogCiAJZm9yX2VhY2hfaXJxKGlycSkgewogCQljcHVtYXNrX3QgbWFzazsKIAotCQlpZiAoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiBJUlFfUEVSX0NQVSkKKwkJZGVzYyA9IGlycV90b19kZXNjKGlycSk7CisJCWlmIChkZXNjICYmIGRlc2MtPnN0YXR1cyAmIElSUV9QRVJfQ1BVKQogCQkJY29udGludWU7CiAKLQkJY3B1bWFza19hbmQoJm1hc2ssIGlycV9kZXNjW2lycV0uYWZmaW5pdHksICZtYXApOworCQljcHVtYXNrX2FuZCgmbWFzaywgZGVzYy0+YWZmaW5pdHksICZtYXApOwogCQlpZiAoYW55X29ubGluZV9jcHUobWFzaykgPT0gTlJfQ1BVUykgewogCQkJcHJpbnRrKCJCcmVha2luZyBhZmZpbml0eSBmb3IgaXJxICVpXG4iLCBpcnEpOwogCQkJbWFzayA9IG1hcDsKIAkJfQotCQlpZiAoaXJxX2Rlc2NbaXJxXS5jaGlwLT5zZXRfYWZmaW5pdHkpCi0JCQlpcnFfZGVzY1tpcnFdLmNoaXAtPnNldF9hZmZpbml0eShpcnEsICZtYXNrKTsKLQkJZWxzZSBpZiAoaXJxX2Rlc2NbaXJxXS5hY3Rpb24gJiYgISh3YXJuZWQrKykpCisJCWlmIChkZXNjLT5jaGlwLT5zZXRfYWZmaW5pdHkpCisJCQlkZXNjLT5jaGlwLT5zZXRfYWZmaW5pdHkoaXJxLCAmbWFzayk7CisJCWVsc2UgaWYgKGRlc2MtPmFjdGlvbiAmJiAhKHdhcm5lZCsrKSkKIAkJCXByaW50aygiQ2Fubm90IHNldCBhZmZpbml0eSBmb3IgaXJxICVpXG4iLCBpcnEpOwogCX0KIApAQCAtMjc1LDcgKzI5MCw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisJZGVzYyA9IGlycV90b19kZXNjKGlycSk7CiAJc2F2ZWRfc3BfbGltaXQgPSBjdXJyZW50LT50aHJlYWQua3NwX2xpbWl0OwogCiAJaXJxdHAtPnRhc2sgPSBjdXJ0cC0+dGFzazsKQEAgLTU0MSw3ICs1NTYsNyBAQAogCQkJc21wX3dtYigpOwogCiAJCQkvKiBDbGVhciBub3JlcXVlc3QgZmxhZ3MgKi8KLQkJCWdldF9pcnFfZGVzYyhpKS0+c3RhdHVzICY9IH5JUlFfTk9SRVFVRVNUOworCQkJaXJxX3RvX2Rlc2MoaSktPnN0YXR1cyAmPSB+SVJRX05PUkVRVUVTVDsKIAogCQkJLyogTGVnYWN5IGZsYWdzIGFyZSBsZWZ0IHRvIGRlZmF1bHQgYXQgdGhpcyBwb2ludCwKIAkJCSAqIG9uZSBjYW4gdGhlbiB1c2UgaXJxX2NyZWF0ZV9tYXBwaW5nKCkgdG8KQEAgLTYwNyw4ICs2MjIsMTYgQEAKIHN0YXRpYyBpbnQgaXJxX3NldHVwX3ZpcnEoc3RydWN0IGlycV9ob3N0ICpob3N0LCB1bnNpZ25lZCBpbnQgdmlycSwKIAkJCSAgICBpcnFfaHdfbnVtYmVyX3QgaHdpcnEpCiB7CisJc3RydWN0IGlycV9kZXNjICpkZXNjOworCisJZGVzYyA9IGlycV90b19kZXNjX2FsbG9jX25vZGUodmlycSwgMCk7CisJaWYgKCFkZXNjKSB7CisJCXByX2RlYnVnKCJpcnE6IC0+IGFsbG9jYXRpbmcgZGVzYyBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwogCS8qIENsZWFyIElSUV9OT1JFUVVFU1QgZmxhZyAqLwotCWdldF9pcnFfZGVzYyh2aXJxKS0+c3RhdHVzICY9IH5JUlFfTk9SRVFVRVNUOworCWRlc2MtPnN0YXR1cyAmPSB+SVJRX05PUkVRVUVTVDsKIAogCS8qIG1hcCBpdCAqLwogCXNtcF93bWIoKTsKQEAgLTYxNywxMSArNjQwLDE0IEBACiAKIAlpZiAoaG9zdC0+b3BzLT5tYXAoaG9zdCwgdmlycSwgaHdpcnEpKSB7CiAJCXByX2RlYnVnKCJpcnE6IC0+IG1hcHBpbmcgZmFpbGVkLCBmcmVlaW5nXG4iKTsKLQkJaXJxX2ZyZWVfdmlydCh2aXJxLCAxKTsKLQkJcmV0dXJuIC0xOworCQlnb3RvIGVycm9yOwogCX0KIAogCXJldHVybiAwOworCitlcnJvcjoKKwlpcnFfZnJlZV92aXJ0KHZpcnEsIDEpOworCXJldHVybiAtMTsKIH0KIAogdW5zaWduZWQgaW50IGlycV9jcmVhdGVfZGlyZWN0X21hcHBpbmcoc3RydWN0IGlycV9ob3N0ICpob3N0KQpAQCAtNzA1LDcgKzczMSw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChpcnFfY3JlYXRlX21hcHBpbmcpOwogCiB1bnNpZ25lZCBpbnQgaXJxX2NyZWF0ZV9vZl9tYXBwaW5nKHN0cnVjdCBkZXZpY2Vfbm9kZSAqY29udHJvbGxlciwKLQkJCQkgICB1MzIgKmludHNwZWMsIHVuc2lnbmVkIGludCBpbnRzaXplKQorCQkJCSAgIGNvbnN0IHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUpCiB7CiAJc3RydWN0IGlycV9ob3N0ICpob3N0OwogCWlycV9od19udW1iZXJfdCBod2lycTsKQEAgLTczOCw3ICs3NjQsNyBAQAogCiAJLyogU2V0IHR5cGUgaWYgc3BlY2lmaWVkIGFuZCBkaWZmZXJlbnQgdGhhbiB0aGUgY3VycmVudCBvbmUgKi8KIAlpZiAodHlwZSAhPSBJUlFfVFlQRV9OT05FICYmCi0JICAgIHR5cGUgIT0gKGdldF9pcnFfZGVzYyh2aXJxKS0+c3RhdHVzICYgSVJRRl9UUklHR0VSX01BU0spKQorCSAgICB0eXBlICE9IChpcnFfdG9fZGVzYyh2aXJxKS0+c3RhdHVzICYgSVJRRl9UUklHR0VSX01BU0spKQogCQlzZXRfaXJxX3R5cGUodmlycSwgdHlwZSk7CiAJcmV0dXJuIHZpcnE7CiB9CkBAIC04MTAsNyArODM2LDcgQEAKIAlpcnFfbWFwW3ZpcnFdLmh3aXJxID0gaG9zdC0+aW52YWxfaXJxOwogCiAJLyogU2V0IHNvbWUgZmxhZ3MgKi8KLQlnZXRfaXJxX2Rlc2ModmlycSktPnN0YXR1cyB8PSBJUlFfTk9SRVFVRVNUOworCWlycV90b19kZXNjKHZpcnEpLT5zdGF0dXMgfD0gSVJRX05PUkVRVUVTVDsKIAogCS8qIEZyZWUgaXQgKi8KIAlpcnFfZnJlZV92aXJ0KHZpcnEsIDEpOwpAQCAtMTAwMiwxMiArMTAyOCwyNCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9iaWdfbG9jaywgZmxhZ3MpOwogfQogCi12b2lkIGlycV9lYXJseV9pbml0KHZvaWQpCitpbnQgYXJjaF9lYXJseV9pcnFfaW5pdCh2b2lkKQogewotCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKKwlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBOUl9JUlFTOyBpKyspCi0JCWdldF9pcnFfZGVzYyhpKS0+c3RhdHVzIHw9IElSUV9OT1JFUVVFU1Q7CisJZm9yIChpID0gMDsgaSA8IE5SX0lSUVM7IGkrKykgeworCQlkZXNjID0gaXJxX3RvX2Rlc2MoaSk7CisJCWlmIChkZXNjKQorCQkJZGVzYy0+c3RhdHVzIHw9IElSUV9OT1JFUVVFU1Q7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBhcmNoX2luaXRfY2hpcF9kYXRhKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IG5vZGUpCit7CisJZGVzYy0+c3RhdHVzIHw9IElSUV9OT1JFUVVFU1Q7CisJcmV0dXJuIDA7CiB9CiAKIC8qIFdlIG5lZWQgdG8gY3JlYXRlIHRoZSByYWRpeCB0cmVlcyBsYXRlICovCkBAIC0xMDY5LDE2ICsxMTA3LDE5IEBACiAJc2VxX3ByaW50ZihtLCAiJS01cyAgJS03cyAgJS0xNXMgICVzXG4iLCAidmlycSIsICJod2lycSIsCiAJCSAgICAgICJjaGlwIG5hbWUiLCAiaG9zdCBuYW1lIik7CiAKLQlmb3IgKGkgPSAxOyBpIDwgTlJfSVJRUzsgaSsrKSB7Ci0JCWRlc2MgPSBnZXRfaXJxX2Rlc2MoaSk7CisJZm9yIChpID0gMTsgaSA8IG5yX2lycXM7IGkrKykgeworCQlkZXNjID0gaXJxX3RvX2Rlc2MoaSk7CisJCWlmICghZGVzYykKKwkJCWNvbnRpbnVlOworCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXNjLT5sb2NrLCBmbGFncyk7CiAKIAkJaWYgKGRlc2MtPmFjdGlvbiAmJiBkZXNjLT5hY3Rpb24tPmhhbmRsZXIpIHsKIAkJCXNlcV9wcmludGYobSwgIiU1ZCAgIiwgaSk7CiAJCQlzZXFfcHJpbnRmKG0sICIweCUwNWx4ICAiLCB2aXJxX3RvX2h3KGkpKTsKIAotCQkJaWYgKGRlc2MtPmNoaXAgJiYgZGVzYy0+Y2hpcC0+dHlwZW5hbWUpCi0JCQkJcCA9IGRlc2MtPmNoaXAtPnR5cGVuYW1lOworCQkJaWYgKGRlc2MtPmNoaXAgJiYgZGVzYy0+Y2hpcC0+bmFtZSkKKwkJCQlwID0gZGVzYy0+Y2hpcC0+bmFtZTsKIAkJCWVsc2UKIAkJCQlwID0gbm9uZTsKIAkJCXNlcV9wcmludGYobSwgIiUtMTVzICAiLCBwKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbHBhcmNmZy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9scGFyY2ZnLmMKaW5kZXggZWQwYWM0ZS4uNzlhMDBiYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9scGFyY2ZnLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9scGFyY2ZnLmMKQEAgLTc4MSw5ICs3ODEsOSBAQAogCQkJIWZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpCiAJCW1vZGUgfD0gU19JV1VTUjsKIAotCWVudCA9IHByb2NfY3JlYXRlKCJwcGM2NC9scGFyY2ZnIiwgbW9kZSwgTlVMTCwgJmxwYXJjZmdfZm9wcyk7CisJZW50ID0gcHJvY19jcmVhdGUoInBvd2VycGMvbHBhcmNmZyIsIG1vZGUsIE5VTEwsICZscGFyY2ZnX2ZvcHMpOwogCWlmICghZW50KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGNyZWF0ZSBwcGM2NC9scGFyY2ZnXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gY3JlYXRlIHBvd2VycGMvbHBhcmNmZ1xuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzMyLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUwppbmRleCBkYTljMGM0Li44NjQ5ZjUzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUwpAQCAtNTAyLDE1ICs1MDIsNyBAQAogCWxpCXIwLFBBR0VfU0laRS9MMV9DQUNIRV9CWVRFUwogCXNsdwlyMCxyMCxyNAogCW10Y3RyCXIwCi0jaWZkZWYgQ09ORklHXzh4eAotCWxpCXI0LCAwCi0xOglzdHcJcjQsIDAocjMpCi0Jc3R3CXI0LCA0KHIzKQotCXN0dwlyNCwgOChyMykKLQlzdHcJcjQsIDEyKHIzKQotI2Vsc2UKIDE6CWRjYnoJMCxyMwotI2VuZGlmCiAJYWRkaQlyMyxyMyxMMV9DQUNIRV9CWVRFUwogCWJkbnoJMWIKIAlibHIKQEAgLTUzNSwxNSArNTI3LDYgQEAKIAlhZGRpCXIzLHIzLC00CiAJYWRkaQlyNCxyNCwtNAogCi0jaWZkZWYgQ09ORklHXzh4eAotCS8qIGRvbid0IHVzZSBwcmVmZXRjaCBvbiA4eHggKi8KLSAgICAJbGkJcjAsNDA5Ni9MMV9DQUNIRV9CWVRFUwotCW10Y3RyCXIwCi0xOglDT1BZXzE2X0JZVEVTCi0JYmRuegkxYgotCWJscgotCi0jZWxzZQkvKiBub3QgOHh4LCB3ZSBjYW4gcHJlZmV0Y2ggKi8KIAlsaQlyNSw0CiAKICNpZiBNQVhfQ09QWV9QUkVGRVRDSCA+IDEKQEAgLTU4NCw3ICs1NjcsNiBAQAogCWxpCXIwLE1BWF9DT1BZX1BSRUZFVENICiAJbGkJcjExLDQKIAliCTJiCi0jZW5kaWYJLyogQ09ORklHXzh4eCAqLwogCiAvKgogICogdm9pZCBhdG9taWNfY2xlYXJfbWFzayhhdG9taWNfdCBtYXNrLCBhdG9taWNfdCAqYWRkcikKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbnZyYW1fNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbnZyYW1fNjQuYwppbmRleCAwZWQzMWYyLi5hZDQ2MWU3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL252cmFtXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9udnJhbV82NC5jCkBAIC0xMzksOCArMTM5LDggQEAKIAogfQogCi1zdGF0aWMgaW50IGRldl9udnJhbV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBsb25nIGRldl9udnJhbV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzd2l0Y2goY21kKSB7CiAjaWZkZWYgQ09ORklHX1BQQ19QTUFDCkBAIC0xNjksMTEgKzE2OSwxMSBAQAogfQogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG52cmFtX2ZvcHMgPSB7Ci0JLm93bmVyID0JVEhJU19NT0RVTEUsCi0JLmxsc2VlayA9CWRldl9udnJhbV9sbHNlZWssCi0JLnJlYWQgPQkJZGV2X252cmFtX3JlYWQsCi0JLndyaXRlID0JZGV2X252cmFtX3dyaXRlLAotCS5pb2N0bCA9CWRldl9udnJhbV9pb2N0bCwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBkZXZfbnZyYW1fbGxzZWVrLAorCS5yZWFkCQk9IGRldl9udnJhbV9yZWFkLAorCS53cml0ZQkJPSBkZXZfbnZyYW1fd3JpdGUsCisJLnVubG9ja2VkX2lvY3RsCT0gZGV2X252cmFtX2lvY3RsLAogfTsKIAogc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIG52cmFtX2RldiA9IHsKQEAgLTE4NCw3ICsxODQsNyBAQAogCiAKICNpZmRlZiBERUJVR19OVlJBTQotc3RhdGljIHZvaWQgbnZyYW1fcHJpbnRfcGFydGl0aW9ucyhjaGFyICogbGFiZWwpCitzdGF0aWMgdm9pZCBfX2luaXQgbnZyYW1fcHJpbnRfcGFydGl0aW9ucyhjaGFyICogbGFiZWwpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqIHA7CiAJc3RydWN0IG52cmFtX3BhcnRpdGlvbiAqIHRtcF9wYXJ0OwpAQCAtMjAyLDcgKzIwMiw3IEBACiAjZW5kaWYKIAogCi1zdGF0aWMgaW50IG52cmFtX3dyaXRlX2hlYWRlcihzdHJ1Y3QgbnZyYW1fcGFydGl0aW9uICogcGFydCkKK3N0YXRpYyBpbnQgX19pbml0IG52cmFtX3dyaXRlX2hlYWRlcihzdHJ1Y3QgbnZyYW1fcGFydGl0aW9uICogcGFydCkKIHsKIAlsb2ZmX3QgdG1wX2luZGV4OwogCWludCByYzsKQEAgLTIxNCw3ICsyMTQsNyBAQAogfQogCiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIG52cmFtX2NoZWNrc3VtKHN0cnVjdCBudnJhbV9oZWFkZXIgKnApCitzdGF0aWMgdW5zaWduZWQgY2hhciBfX2luaXQgbnZyYW1fY2hlY2tzdW0oc3RydWN0IG52cmFtX2hlYWRlciAqcCkKIHsKIAl1bnNpZ25lZCBpbnQgY19zdW0sIGNfc3VtMjsKIAl1bnNpZ25lZCBzaG9ydCAqc3AgPSAodW5zaWduZWQgc2hvcnQgKilwLT5uYW1lOyAvKiBhc3N1bWUgNiBzaG9ydHMgKi8KQEAgLTIyOCwzMiArMjI4LDcgQEAKIAlyZXR1cm4gY19zdW07CiB9CiAKLQotLyoKLSAqIEZpbmQgYW4gbnZyYW0gcGFydGl0aW9uLCBzaWcgY2FuIGJlIDAgZm9yIGFueQotICogcGFydGl0aW9uIG9yIG5hbWUgY2FuIGJlIE5VTEwgZm9yIGFueSBuYW1lLCBlbHNlCi0gKiB0cmllcyB0byBtYXRjaCBib3RoCi0gKi8KLXN0cnVjdCBudnJhbV9wYXJ0aXRpb24gKm52cmFtX2ZpbmRfcGFydGl0aW9uKGludCBzaWcsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IG52cmFtX3BhcnRpdGlvbiAqIHBhcnQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqIHA7Ci0KLQlsaXN0X2Zvcl9lYWNoKHAsICZudnJhbV9wYXJ0LT5wYXJ0aXRpb24pIHsKLQkJcGFydCA9IGxpc3RfZW50cnkocCwgc3RydWN0IG52cmFtX3BhcnRpdGlvbiwgcGFydGl0aW9uKTsKLQotCQlpZiAoc2lnICYmIHBhcnQtPmhlYWRlci5zaWduYXR1cmUgIT0gc2lnKQotCQkJY29udGludWU7Ci0JCWlmIChuYW1lICYmIDAgIT0gc3RybmNtcChuYW1lLCBwYXJ0LT5oZWFkZXIubmFtZSwgMTIpKQotCQkJY29udGludWU7Ci0JCXJldHVybiBwYXJ0OyAKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MKG52cmFtX2ZpbmRfcGFydGl0aW9uKTsKLQotCi1zdGF0aWMgaW50IG52cmFtX3JlbW92ZV9vc19wYXJ0aXRpb24odm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IG52cmFtX3JlbW92ZV9vc19wYXJ0aXRpb24odm9pZCkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICppOwogCXN0cnVjdCBsaXN0X2hlYWQgKmo7CkBAIC0zMTksNyArMjk0LDcgQEAKICAqIFdpbGwgY3JlYXRlIGEgcGFydGl0aW9uIHN0YXJ0aW5nIGF0IHRoZSBmaXJzdCBmcmVlCiAgKiBzcGFjZSBmb3VuZCBpZiBzcGFjZSBoYXMgZW5vdWdoIHJvb20uCiAgKi8KLXN0YXRpYyBpbnQgbnZyYW1fY3JlYXRlX29zX3BhcnRpdGlvbih2b2lkKQorc3RhdGljIGludCBfX2luaXQgbnZyYW1fY3JlYXRlX29zX3BhcnRpdGlvbih2b2lkKQogewogCXN0cnVjdCBudnJhbV9wYXJ0aXRpb24gKnBhcnQ7CiAJc3RydWN0IG52cmFtX3BhcnRpdGlvbiAqbmV3X3BhcnQ7CkBAIC00MjIsNyArMzk3LDcgQEAKICAqIDUuKSBJZiB0aGUgbWF4IGNodW5rIGNhbm5vdCBiZSBhbGxvY2F0ZWQgdGhlbiB0cnkgZmluZGluZyBhIGNodW5rCiAgKiB0aGF0IHdpbGwgc2F0aXNmeSB0aGUgbWludW0gbmVlZGVkIChOVlJBTV9NSU5fUkVRKS4KICAqLwotc3RhdGljIGludCBudnJhbV9zZXR1cF9wYXJ0aXRpb24odm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IG52cmFtX3NldHVwX3BhcnRpdGlvbih2b2lkKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKiBwOwogCXN0cnVjdCBudnJhbV9wYXJ0aXRpb24gKiBwYXJ0OwpAQCAtNDgwLDcgKzQ1NSw3IEBACiB9CiAKIAotc3RhdGljIGludCBudnJhbV9zY2FuX3BhcnRpdGlvbnModm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IG52cmFtX3NjYW5fcGFydGl0aW9ucyh2b2lkKQogewogCWxvZmZfdCBjdXJfaW5kZXggPSAwOwogCXN0cnVjdCBudnJhbV9oZWFkZXIgcGhlYWQ7CkBAIC03MDYsNiArNjgxLDkgQEAKIAlpbnQgY2xlYXJfd29yZCA9IEVSUl9GTEFHX0FMUkVBRFlfTE9HR0VEOwogCWludCByYzsKIAorCWlmIChudnJhbV9lcnJvcl9sb2dfaW5kZXggPT0gLTEpCisJCXJldHVybiAtMTsKKwogCXRtcF9pbmRleCA9IG52cmFtX2Vycm9yX2xvZ19pbmRleDsKIAkKIAlyYyA9IHBwY19tZC5udnJhbV93cml0ZSgoY2hhciAqKSZjbGVhcl93b3JkLCBzaXplb2YoaW50KSwgJnRtcF9pbmRleCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BlcmZfY2FsbGNoYWluLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BlcmZfY2FsbGNoYWluLmMKaW5kZXggMGEwM2NmNy4uYTNjMTFjYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wZXJmX2NhbGxjaGFpbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGVyZl9jYWxsY2hhaW4uYwpAQCAtMTE5LDEzICsxMTksNiBAQAogfQogCiAjaWZkZWYgQ09ORklHX1BQQzY0Ci0KLSNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFCi0jZGVmaW5lIGlzX2h1Z2VfcHNpemUocGFnZXNpemUpCShIUEFHRV9TSElGVCAmJiBtbXVfaHVnZV9wc2l6ZXNbcGFnZXNpemVdKQotI2Vsc2UKLSNkZWZpbmUgaXNfaHVnZV9wc2l6ZShwYWdlc2l6ZSkJMAotI2VuZGlmCi0KIC8qCiAgKiBPbiA2NC1iaXQgd2UgZG9uJ3Qgd2FudCB0byBpbnZva2UgaGFzaF9wYWdlIG9uIHVzZXIgYWRkcmVzc2VzIGZyb20KICAqIGludGVycnVwdCBjb250ZXh0LCBzbyBpZiB0aGUgYWNjZXNzIGZhdWx0cywgd2UgcmVhZCB0aGUgcGFnZSB0YWJsZXMKQEAgLTEzNSw3ICsxMjgsNyBAQAogewogCXBnZF90ICpwZ2RpcjsKIAlwdGVfdCAqcHRlcCwgcHRlOwotCWludCBwYWdlc2l6ZTsKKwl1bnNpZ25lZCBzaGlmdDsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZykgcHRyOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCXVuc2lnbmVkIGxvbmcgcGZuOwpAQCAtMTQ1LDE3ICsxMzgsMTQgQEAKIAlpZiAoIXBnZGlyKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCXBhZ2VzaXplID0gZ2V0X3NsaWNlX3BzaXplKGN1cnJlbnQtPm1tLCBhZGRyKTsKKwlwdGVwID0gZmluZF9saW51eF9wdGVfb3JfaHVnZXB0ZShwZ2RpciwgYWRkciwgJnNoaWZ0KTsKKwlpZiAoIXNoaWZ0KQorCQlzaGlmdCA9IFBBR0VfU0hJRlQ7CiAKIAkvKiBhbGlnbiBhZGRyZXNzIHRvIHBhZ2UgYm91bmRhcnkgKi8KLQlvZmZzZXQgPSBhZGRyICYgKCgxdWwgPDwgbW11X3BzaXplX2RlZnNbcGFnZXNpemVdLnNoaWZ0KSAtIDEpOworCW9mZnNldCA9IGFkZHIgJiAoKDFVTCA8PCBzaGlmdCkgLSAxKTsKIAlhZGRyIC09IG9mZnNldDsKIAotCWlmIChpc19odWdlX3BzaXplKHBhZ2VzaXplKSkKLQkJcHRlcCA9IGh1Z2VfcHRlX29mZnNldChjdXJyZW50LT5tbSwgYWRkcik7Ci0JZWxzZQotCQlwdGVwID0gZmluZF9saW51eF9wdGUocGdkaXIsIGFkZHIpOwotCiAJaWYgKHB0ZXAgPT0gTlVMTCkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJcHRlID0gKnB0ZXA7CkBAIC00OTcsMTEgKzQ4NywxMSBAQAogICogU2luY2Ugd2UgY2FuJ3QgZ2V0IFBNVSBpbnRlcnJ1cHRzIGluc2lkZSBhIFBNVSBpbnRlcnJ1cHQgaGFuZGxlciwKICAqIHdlIGRvbid0IG5lZWQgc2VwYXJhdGUgaXJxIGFuZCBubWkgZW50cmllcyBoZXJlLgogICovCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5LCBjYWxsY2hhaW4pOworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBwZXJmX2NhbGxjaGFpbl9lbnRyeSwgY3B1X3BlcmZfY2FsbGNoYWluKTsKIAogc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5ICpwZXJmX2NhbGxjaGFpbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnkgKmVudHJ5ID0gJl9fZ2V0X2NwdV92YXIoY2FsbGNoYWluKTsKKwlzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnkgKmVudHJ5ID0gJl9fZ2V0X2NwdV92YXIoY3B1X3BlcmZfY2FsbGNoYWluKTsKIAogCWVudHJ5LT5uciA9IDA7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jCmluZGV4IGM4YjI3YmIuLjQyNTQ1MTQ1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMKQEAgLTk2LDggKzk2LDYgQEAKIEVYUE9SVF9TWU1CT0woaXNhX2lvX2Jhc2UpOwogRVhQT1JUX1NZTUJPTChpc2FfbWVtX2Jhc2UpOwogRVhQT1JUX1NZTUJPTChwY2lfZHJhbV9vZmZzZXQpOwotRVhQT1JUX1NZTUJPTChwY2lfYWxsb2NfY29uc2lzdGVudCk7Ci1FWFBPUlRfU1lNQk9MKHBjaV9mcmVlX2NvbnNpc3RlbnQpOwogI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KIAogRVhQT1JUX1NZTUJPTChzdGFydF90aHJlYWQpOwpAQCAtMTYyLDcgKzE2MCw2IEBACiAKICNpZmRlZiBDT05GSUdfUFBDMzIKIEVYUE9SVF9TWU1CT0wodGltZXJfaW50ZXJydXB0KTsKLUVYUE9SVF9TWU1CT0woaXJxX2Rlc2MpOwogRVhQT1JUX1NZTUJPTCh0Yl90aWNrc19wZXJfamlmZnkpOwogRVhQT1JUX1NZTUJPTChjYWNoZWFibGVfbWVtY3B5KTsKIEVYUE9SVF9TWU1CT0woY2FjaGVhYmxlX21lbXplcm8pOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9jX3Bvd2VycGMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY19wb3dlcnBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVkM2I4ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY19wb3dlcnBjLmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgTWlrZSBDb3JyaWdhbiAmIERhdmUgRW5nZWJyZXRzZW4gSUJNIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS92ZHNvX2RhdGFwYWdlLmg+CisjaW5jbHVkZSA8YXNtL3J0YXMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisKKyNpZmRlZiBDT05GSUdfUFBDNjQKKworc3RhdGljIGxvZmZfdCBwYWdlX21hcF9zZWVrKCBzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZiwgaW50IHdoZW5jZSkKK3sKKwlsb2ZmX3QgbmV3OworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisKKwlzd2l0Y2god2hlbmNlKSB7CisJY2FzZSAwOgorCQluZXcgPSBvZmY7CisJCWJyZWFrOworCWNhc2UgMToKKwkJbmV3ID0gZmlsZS0+Zl9wb3MgKyBvZmY7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJbmV3ID0gZHAtPnNpemUgKyBvZmY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoIG5ldyA8IDAgfHwgbmV3ID4gZHAtPnNpemUgKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gKGZpbGUtPmZfcG9zID0gbmV3KTsKK30KKworc3RhdGljIHNzaXplX3QgcGFnZV9tYXBfcmVhZCggc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBuYnl0ZXMsCisJCQkgICAgICBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcCA9IFBERShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBuYnl0ZXMsIHBwb3MsIGRwLT5kYXRhLCBkcC0+c2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgcGFnZV9tYXBfbW1hcCggc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hICkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOworCisJaWYgKCh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpID4gZHAtPnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgX19wYShkcC0+ZGF0YSkgPj4gUEFHRV9TSElGVCwKKwkJCQkJCWRwLT5zaXplLCB2bWEtPnZtX3BhZ2VfcHJvdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBhZ2VfbWFwX2ZvcHMgPSB7CisJLmxsc2Vlawk9IHBhZ2VfbWFwX3NlZWssCisJLnJlYWQJPSBwYWdlX21hcF9yZWFkLAorCS5tbWFwCT0gcGFnZV9tYXBfbW1hcAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBwcm9jX3BwYzY0X2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZTsKKworCXBkZSA9IHByb2NfY3JlYXRlX2RhdGEoInBvd2VycGMvc3lzdGVtY2ZnIiwgU19JRlJFR3xTX0lSVUdPLCBOVUxMLAorCQkJICAgICAgICZwYWdlX21hcF9mb3BzLCB2ZHNvX2RhdGEpOworCWlmICghcGRlKQorCQlyZXR1cm4gMTsKKwlwZGUtPnNpemUgPSBQQUdFX1NJWkU7CisKKwlyZXR1cm4gMDsKK30KK19faW5pdGNhbGwocHJvY19wcGM2NF9pbml0KTsKKworI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLworCisvKgorICogQ3JlYXRlIHRoZSBwcGM2NCBhbmQgcHBjNjQvcnRhcyBkaXJlY3RvcmllcyBlYXJseS4gVGhpcyBhbGxvd3MgdXMgdG8KKyAqIGFzc3VtZSB0aGF0IHRoZXkgaGF2ZSBiZWVuIHByZXZpb3VzbHkgY3JlYXRlZCBpbiBkcml2ZXJzLgorICovCitzdGF0aWMgaW50IF9faW5pdCBwcm9jX3BwYzY0X2NyZWF0ZSh2b2lkKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcm9vdDsKKworCXJvb3QgPSBwcm9jX21rZGlyKCJwb3dlcnBjIiwgTlVMTCk7CisJaWYgKCFyb290KQorCQlyZXR1cm4gMTsKKworI2lmZGVmIENPTkZJR19QUEM2NAorCWlmICghcHJvY19zeW1saW5rKCJwcGM2NCIsIE5VTEwsICJwb3dlcnBjIikpCisJCXByX2VycigiRmFpbGVkIHRvIGNyZWF0ZSBsaW5rIC9wcm9jL3BwYzY0IC0+IC9wcm9jL3Bvd2VycGNcbiIpOworI2VuZGlmCisKKwlpZiAoIW9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvcnRhcyIpKQorCQlyZXR1cm4gMDsKKworCWlmICghcHJvY19ta2RpcigicnRhcyIsIHJvb3QpKQorCQlyZXR1cm4gMTsKKworCWlmICghcHJvY19zeW1saW5rKCJydGFzIiwgTlVMTCwgInBvd2VycGMvcnRhcyIpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorY29yZV9pbml0Y2FsbChwcm9jX3BwYzY0X2NyZWF0ZSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2NfcHBjNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY19wcGM2NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjQ3ZGRlLi4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY19wcGM2NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgTWlrZSBDb3JyaWdhbiAmIERhdmUgRW5nZWJyZXRzZW4gSUJNIENvcnBvcmF0aW9uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotI2luY2x1ZGUgPGFzbS92ZHNvX2RhdGFwYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL3J0YXMuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9wcm9tLmg+Ci0KLXN0YXRpYyBsb2ZmX3QgIHBhZ2VfbWFwX3NlZWsoIHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2ZmLCBpbnQgd2hlbmNlKTsKLXN0YXRpYyBzc2l6ZV90IHBhZ2VfbWFwX3JlYWQoIHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLAotCQkJICAgICAgbG9mZl90ICpwcG9zKTsKLXN0YXRpYyBpbnQgICAgIHBhZ2VfbWFwX21tYXAoIHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSApOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwYWdlX21hcF9mb3BzID0gewotCS5sbHNlZWsJPSBwYWdlX21hcF9zZWVrLAotCS5yZWFkCT0gcGFnZV9tYXBfcmVhZCwKLQkubW1hcAk9IHBhZ2VfbWFwX21tYXAKLX07Ci0KLS8qCi0gKiBDcmVhdGUgdGhlIHBwYzY0IGFuZCBwcGM2NC9ydGFzIGRpcmVjdG9yaWVzIGVhcmx5LiBUaGlzIGFsbG93cyB1cyB0bwotICogYXNzdW1lIHRoYXQgdGhleSBoYXZlIGJlZW4gcHJldmlvdXNseSBjcmVhdGVkIGluIGRyaXZlcnMuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IHByb2NfcHBjNjRfY3JlYXRlKHZvaWQpCi17Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyb290OwotCi0Jcm9vdCA9IHByb2NfbWtkaXIoInBwYzY0IiwgTlVMTCk7Ci0JaWYgKCFyb290KQotCQlyZXR1cm4gMTsKLQotCWlmICghb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9ydGFzIikpCi0JCXJldHVybiAwOwotCi0JaWYgKCFwcm9jX21rZGlyKCJydGFzIiwgcm9vdCkpCi0JCXJldHVybiAxOwotCi0JaWYgKCFwcm9jX3N5bWxpbmsoInJ0YXMiLCBOVUxMLCAicHBjNjQvcnRhcyIpKQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOwotfQotY29yZV9pbml0Y2FsbChwcm9jX3BwYzY0X2NyZWF0ZSk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IHByb2NfcHBjNjRfaW5pdCh2b2lkKQotewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlOwotCi0JcGRlID0gcHJvY19jcmVhdGVfZGF0YSgicHBjNjQvc3lzdGVtY2ZnIiwgU19JRlJFR3xTX0lSVUdPLCBOVUxMLAotCQkJICAgICAgICZwYWdlX21hcF9mb3BzLCB2ZHNvX2RhdGEpOwotCWlmICghcGRlKQotCQlyZXR1cm4gMTsKLQlwZGUtPnNpemUgPSBQQUdFX1NJWkU7Ci0KLQlyZXR1cm4gMDsKLX0KLV9faW5pdGNhbGwocHJvY19wcGM2NF9pbml0KTsKLQotc3RhdGljIGxvZmZfdCBwYWdlX21hcF9zZWVrKCBzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZiwgaW50IHdoZW5jZSkKLXsKLQlsb2ZmX3QgbmV3OwotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7Ci0KLQlzd2l0Y2god2hlbmNlKSB7Ci0JY2FzZSAwOgotCQluZXcgPSBvZmY7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJbmV3ID0gZmlsZS0+Zl9wb3MgKyBvZmY7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJbmV3ID0gZHAtPnNpemUgKyBvZmY7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoIG5ldyA8IDAgfHwgbmV3ID4gZHAtPnNpemUgKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gKGZpbGUtPmZfcG9zID0gbmV3KTsKLX0KLQotc3RhdGljIHNzaXplX3QgcGFnZV9tYXBfcmVhZCggc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBuYnl0ZXMsCi0JCQkgICAgICBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcCA9IFBERShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBuYnl0ZXMsIHBwb3MsIGRwLT5kYXRhLCBkcC0+c2l6ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgcGFnZV9tYXBfbW1hcCggc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hICkKLXsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwotCi0JaWYgKCh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpID4gZHAtPnNpemUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgX19wYShkcC0+ZGF0YSkgPj4gUEFHRV9TSElGVCwKLQkJCQkJCWRwLT5zaXplLCB2bWEtPnZtX3BhZ2VfcHJvdCk7Ci0JcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhc19mbGFzaC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzX2ZsYXNoLmMKaW5kZXggMTMwMTFhOS4uYTg1MTE3ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzX2ZsYXNoLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzX2ZsYXNoLmMKQEAgLTYsNyArNiw3IEBACiAgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICoKLSAqIC9wcm9jL3BwYzY0L3J0YXMvZmlybXdhcmVfZmxhc2ggaW50ZXJmYWNlCisgKiAvcHJvYy9wb3dlcnBjL3J0YXMvZmlybXdhcmVfZmxhc2ggaW50ZXJmYWNlCiAgKgogICogVGhpcyBmaWxlIGltcGxlbWVudHMgYSBmaXJtd2FyZV9mbGFzaCBpbnRlcmZhY2UgdG8gcHVtcCBhIGZpcm13YXJlCiAgKiBpbWFnZSBpbnRvIHRoZSBrZXJuZWwuICBBdCByZWJvb3QgdGltZSBydGFzX3Jlc3RhcnQoKSB3aWxsIHNlZSB0aGUKQEAgLTc0MCw3ICs3NDAsNyBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlmaXJtd2FyZV9mbGFzaF9wZGUgPSBjcmVhdGVfZmxhc2hfcGRlKCJwcGM2NC9ydGFzLyIKKwlmaXJtd2FyZV9mbGFzaF9wZGUgPSBjcmVhdGVfZmxhc2hfcGRlKCJwb3dlcnBjL3J0YXMvIgogCQkJCQkgICAgICBGSVJNV0FSRV9GTEFTSF9OQU1FLAogCQkJCQkgICAgICAmcnRhc19mbGFzaF9vcGVyYXRpb25zKTsKIAlpZiAoZmlybXdhcmVfZmxhc2hfcGRlID09IE5VTEwpIHsKQEAgLTc1NCw3ICs3NTQsNyBAQAogCWlmIChyYyAhPSAwKQogCQlnb3RvIGNsZWFudXA7CiAKLQlmaXJtd2FyZV91cGRhdGVfcGRlID0gY3JlYXRlX2ZsYXNoX3BkZSgicHBjNjQvcnRhcy8iCisJZmlybXdhcmVfdXBkYXRlX3BkZSA9IGNyZWF0ZV9mbGFzaF9wZGUoInBvd2VycGMvcnRhcy8iCiAJCQkJCSAgICAgICBGSVJNV0FSRV9VUERBVEVfTkFNRSwKIAkJCQkJICAgICAgICZydGFzX2ZsYXNoX29wZXJhdGlvbnMpOwogCWlmIChmaXJtd2FyZV91cGRhdGVfcGRlID09IE5VTEwpIHsKQEAgLTc2OCw3ICs3NjgsNyBAQAogCWlmIChyYyAhPSAwKQogCQlnb3RvIGNsZWFudXA7CiAKLQl2YWxpZGF0ZV9wZGUgPSBjcmVhdGVfZmxhc2hfcGRlKCJwcGM2NC9ydGFzLyIgVkFMSURBVEVfRkxBU0hfTkFNRSwKKwl2YWxpZGF0ZV9wZGUgPSBjcmVhdGVfZmxhc2hfcGRlKCJwb3dlcnBjL3J0YXMvIiBWQUxJREFURV9GTEFTSF9OQU1FLAogCQkJICAgICAgCQkmdmFsaWRhdGVfZmxhc2hfb3BlcmF0aW9ucyk7CiAJaWYgKHZhbGlkYXRlX3BkZSA9PSBOVUxMKSB7CiAJCXJjID0gLUVOT01FTTsKQEAgLTc4MSw3ICs3ODEsNyBAQAogCWlmIChyYyAhPSAwKQogCQlnb3RvIGNsZWFudXA7CiAKLQltYW5hZ2VfcGRlID0gY3JlYXRlX2ZsYXNoX3BkZSgicHBjNjQvcnRhcy8iIE1BTkFHRV9GTEFTSF9OQU1FLAorCW1hbmFnZV9wZGUgPSBjcmVhdGVfZmxhc2hfcGRlKCJwb3dlcnBjL3J0YXMvIiBNQU5BR0VfRkxBU0hfTkFNRSwKIAkJCQkgICAgICAmbWFuYWdlX2ZsYXNoX29wZXJhdGlvbnMpOwogCWlmIChtYW5hZ2VfcGRlID09IE5VTEwpIHsKIAkJcmMgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzZC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNDgzMmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXNkLmMKQEAgLTAsMCArMSw1MzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgQW50b24gQmxhbmNoYXJkIDxhbnRvbkBhdS5pYm0uY29tPiwgSUJNCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBDb21tdW5pY2F0aW9uIHRvIHVzZXJzcGFjZSBiYXNlZCBvbiBrZXJuZWwvcHJpbnRrLmMKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9ydGFzLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vbnZyYW0uaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJ0YXNkX2xvZ19sb2NrKTsKKworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHJ0YXNfbG9nX3dhaXQpOworCitzdGF0aWMgY2hhciAqcnRhc19sb2dfYnVmOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcnRhc19sb2dfc3RhcnQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBydGFzX2xvZ19zaXplOworCitzdGF0aWMgaW50IHN1cnZlaWxsYW5jZV90aW1lb3V0ID0gLTE7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnRhc19lcnJvcl9sb2dfbWF4Oworc3RhdGljIHVuc2lnbmVkIGludCBydGFzX2Vycm9yX2xvZ19idWZmZXJfbWF4OworCisvKiBSVEFTIHNlcnZpY2UgdG9rZW5zICovCitzdGF0aWMgdW5zaWduZWQgaW50IGV2ZW50X3NjYW47CitzdGF0aWMgdW5zaWduZWQgaW50IHJ0YXNfZXZlbnRfc2Nhbl9yYXRlOworCitzdGF0aWMgaW50IGZ1bGxfcnRhc19tc2dzID0gMDsKKworLyogU3RvcCBsb2dnaW5nIHRvIG52cmFtIGFmdGVyIGZpcnN0IGZhdGFsIGVycm9yICovCitzdGF0aWMgaW50IGxvZ2dpbmdfZW5hYmxlZDsgLyogVW50aWwgd2UgaW5pdGlhbGl6ZSBldmVyeXRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1ha2Ugc3VyZSB3ZSBkb24ndCB0cnkgbG9nZ2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFueXRoaW5nICovCitzdGF0aWMgaW50IGVycm9yX2xvZ19jbnQ7CisKKy8qCisgKiBTaW5jZSB3ZSB1c2UgMzIgYml0IFJUQVMsIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoaXMgbXVzdCBiZSBiZWxvdworICogNEcgb3IgZWxzZSBiYWQgdGhpbmdzIGhhcHBlbi4gQWxsb2NhdGUgdGhpcyBpbiB0aGUga2VybmVsIGRhdGEgYW5kCisgKiBtYWtlIGl0IGJpZyBlbm91Z2guCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGxvZ2RhdGFbUlRBU19FUlJPUl9MT0dfTUFYXTsKKworc3RhdGljIGNoYXIgKnJ0YXNfdHlwZVtdID0geworCSJVbmtub3duIiwgIlJldHJ5IiwgIlRDRSBFcnJvciIsICJJbnRlcm5hbCBEZXZpY2UgRmFpbHVyZSIsCisJIlRpbWVvdXQiLCAiRGF0YSBQYXJpdHkiLCAiQWRkcmVzcyBQYXJpdHkiLCAiQ2FjaGUgUGFyaXR5IiwKKwkiQWRkcmVzcyBJbnZhbGlkIiwgIkVDQyBVbmNvcnJlY3RlZCIsICJFQ0MgQ29ycnVwdGVkIiwKK307CisKK3N0YXRpYyBjaGFyICpydGFzX2V2ZW50X3R5cGUoaW50IHR5cGUpCit7CisJaWYgKCh0eXBlID4gMCkgJiYgKHR5cGUgPCAxMSkpCisJCXJldHVybiBydGFzX3R5cGVbdHlwZV07CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBSVEFTX1RZUEVfRVBPVzoKKwkJCXJldHVybiAiRVBPVyI7CisJCWNhc2UgUlRBU19UWVBFX1BMQVRGT1JNOgorCQkJcmV0dXJuICJQbGF0Zm9ybSBFcnJvciI7CisJCWNhc2UgUlRBU19UWVBFX0lPOgorCQkJcmV0dXJuICJJL08gRXZlbnQiOworCQljYXNlIFJUQVNfVFlQRV9JTkZPOgorCQkJcmV0dXJuICJQbGF0Zm9ybSBJbmZvcm1hdGlvbiBFdmVudCI7CisJCWNhc2UgUlRBU19UWVBFX0RFQUxMT0M6CisJCQlyZXR1cm4gIlJlc291cmNlIERlYWxsb2NhdGlvbiBFdmVudCI7CisJCWNhc2UgUlRBU19UWVBFX0RVTVA6CisJCQlyZXR1cm4gIkR1bXAgTm90aWZpY2F0aW9uIEV2ZW50IjsKKwl9CisKKwlyZXR1cm4gcnRhc190eXBlWzBdOworfQorCisvKiBUbyBzZWUgdGhpcyBpbmZvLCBncmVwIFJUQVMgL3Zhci9sb2cvbWVzc2FnZXMgYW5kIGVhY2ggZW50cnkKKyAqIHdpbGwgYmUgY29sbGVjdGVkIHRvZ2V0aGVyIHdpdGggb2J2aW91cyBiZWdpbi9lbmQuCisgKiBUaGVyZSB3aWxsIGJlIGEgdW5pcXVlIGlkZW50aWZpZXIgb24gdGhlIGJlZ2luIGFuZCBlbmQgbGluZXMuCisgKiBUaGlzIHdpbGwgcGVyc2lzdCBhY3Jvc3MgcmVib290cy4KKyAqCisgKiBmb3JtYXQgb2YgZXJyb3IgbG9ncyByZXR1cm5lZCBmcm9tIFJUQVM6CisgKiBieXRlcwkoc2l6ZSkJOiBjb250ZW50cworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIDAtNwkJKDgpCTogcnRhc19lcnJvcl9sb2cKKyAqIDgtNDcJCSg0MCkJOiBleHRlbmRlZCBpbmZvCisgKiA0OC01MQkoNCkJOiB2ZW5kb3IgaWQKKyAqIDUyLTEwMjMgKHZlbmRvciBzcGVjaWZpYykgOiBsb2NhdGlvbiBjb2RlIGFuZCBkZWJ1ZyBkYXRhCisgKi8KK3N0YXRpYyB2b2lkIHByaW50a19sb2dfcnRhcyhjaGFyICpidWYsIGludCBsZW4pCit7CisKKwlpbnQgaSxqLG4gPSAwOworCWludCBwZXJsaW5lID0gMTY7CisJY2hhciBidWZmZXJbNjRdOworCWNoYXIgKiBzdHIgPSAiUlRBUyBldmVudCI7CisKKwlpZiAoZnVsbF9ydGFzX21zZ3MpIHsKKwkJcHJpbnRrKFJUQVNfREVCVUcgIiVkIC0tLS0tLS0tICVzIGJlZ2luIC0tLS0tLS0tXG4iLAorCQkgICAgICAgZXJyb3JfbG9nX2NudCwgc3RyKTsKKworCQkvKgorCQkgKiBQcmludCBwZXJsaW5lIGJ5dGVzIG9uIGVhY2ggbGluZSwgZWFjaCBsaW5lIHdpbGwgc3RhcnQKKwkJICogd2l0aCBSVEFTIGFuZCBhIGNoYW5naW5nIG51bWJlciwgc28gc3lzbG9nZCB3aWxsCisJCSAqIHByaW50IGxpbmVzIHRoYXQgYXJlIG90aGVyd2lzZSB0aGUgc2FtZS4gIFNlcGFyYXRlIGV2ZXJ5CisJCSAqIDQgYnl0ZXMgd2l0aCBhIHNwYWNlLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCQlqID0gaSAlIHBlcmxpbmU7CisJCQlpZiAoaiA9PSAwKSB7CisJCQkJbWVtc2V0KGJ1ZmZlciwgMCwgc2l6ZW9mKGJ1ZmZlcikpOworCQkJCW4gPSBzcHJpbnRmKGJ1ZmZlciwgIlJUQVMgJWQ6IiwgaS9wZXJsaW5lKTsKKwkJCX0KKworCQkJaWYgKChpICUgNCkgPT0gMCkKKwkJCQluICs9IHNwcmludGYoYnVmZmVyK24sICIgIik7CisKKwkJCW4gKz0gc3ByaW50ZihidWZmZXIrbiwgIiUwMngiLCAodW5zaWduZWQgY2hhcilidWZbaV0pOworCisJCQlpZiAoaiA9PSAocGVybGluZS0xKSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIGJ1ZmZlcik7CisJCX0KKwkJaWYgKChpICUgcGVybGluZSkgIT0gMCkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgYnVmZmVyKTsKKworCQlwcmludGsoUlRBU19ERUJVRyAiJWQgLS0tLS0tLS0gJXMgZW5kIC0tLS0tLS0tLS1cbiIsCisJCSAgICAgICBlcnJvcl9sb2dfY250LCBzdHIpOworCX0gZWxzZSB7CisJCXN0cnVjdCBydGFzX2Vycm9yX2xvZyAqZXJybG9nID0gKHN0cnVjdCBydGFzX2Vycm9yX2xvZyAqKWJ1ZjsKKworCQlwcmludGsoUlRBU19ERUJVRyAiZXZlbnQ6ICVkLCBUeXBlOiAlcywgU2V2ZXJpdHk6ICVkXG4iLAorCQkgICAgICAgZXJyb3JfbG9nX2NudCwgcnRhc19ldmVudF90eXBlKGVycmxvZy0+dHlwZSksCisJCSAgICAgICBlcnJsb2ctPnNldmVyaXR5KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbG9nX3J0YXNfbGVuKGNoYXIgKiBidWYpCit7CisJaW50IGxlbjsKKwlzdHJ1Y3QgcnRhc19lcnJvcl9sb2cgKmVycjsKKworCS8qIHJ0YXMgZml4ZWQgaGVhZGVyICovCisJbGVuID0gODsKKwllcnIgPSAoc3RydWN0IHJ0YXNfZXJyb3JfbG9nICopYnVmOworCWlmIChlcnItPmV4dGVuZGVkX2xvZ19sZW5ndGgpIHsKKworCQkvKiBleHRlbmRlZCBoZWFkZXIgKi8KKwkJbGVuICs9IGVyci0+ZXh0ZW5kZWRfbG9nX2xlbmd0aDsKKwl9CisKKwlpZiAocnRhc19lcnJvcl9sb2dfbWF4ID09IDApCisJCXJ0YXNfZXJyb3JfbG9nX21heCA9IHJ0YXNfZ2V0X2Vycm9yX2xvZ19tYXgoKTsKKworCWlmIChsZW4gPiBydGFzX2Vycm9yX2xvZ19tYXgpCisJCWxlbiA9IHJ0YXNfZXJyb3JfbG9nX21heDsKKworCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBGaXJzdCB3cml0ZSB0byBudnJhbSwgaWYgZmF0YWwgZXJyb3IsIHRoYXQgaXMgdGhlIG9ubHkKKyAqIHBsYWNlIHdlIGxvZyB0aGUgaW5mby4gIFRoZSBlcnJvciB3aWxsIGJlIHBpY2tlZCB1cAorICogb24gdGhlIG5leHQgcmVib290IGJ5IHJ0YXNkLiAgSWYgbm90IGZhdGFsLCBydW4gdGhlCisgKiBtZXRob2QgZm9yIHRoZSB0eXBlIG9mIGVycm9yLiAgQ3VycmVudGx5LCBvbmx5IFJUQVMKKyAqIGVycm9ycyBoYXZlIG1ldGhvZHMgaW1wbGVtZW50ZWQsIGJ1dCBpbiB0aGUgZnV0dXJlCisgKiB0aGVyZSBtaWdodCBiZSBhIG5lZWQgdG8gc3RvcmUgZGF0YSBpbiBudnJhbSBiZWZvcmUgYQorICogY2FsbCB0byBwYW5pYygpLgorICoKKyAqIFhYWCBXZSB3cml0ZSB0byBudnJhbSBwZXJpb2RpY2FsbHksIHRvIGluZGljYXRlIGVycm9yIGhhcworICogYmVlbiB3cml0dGVuIGFuZCBzeW5jJ2QsIGJ1dCB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5CisgKiB0aGF0IGlmIHdlIGRvbid0IHNodXRkb3duIGNvcnJlY3RseSwgYSBkdXBsaWNhdGUgZXJyb3IKKyAqIHJlY29yZCB3aWxsIGJlIGNyZWF0ZWQgb24gbmV4dCByZWJvb3QuCisgKi8KK3ZvaWQgcFNlcmllc19sb2dfZXJyb3IoY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgZXJyX3R5cGUsIGludCBmYXRhbCkKK3sKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIHM7CisJaW50IGxlbiA9IDA7CisKKwlwcl9kZWJ1ZygicnRhc2Q6IGxvZ2dpbmcgZXZlbnRcbiIpOworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0YXNkX2xvZ19sb2NrLCBzKTsKKworCS8qIGdldCBsZW5ndGggYW5kIGluY3JlYXNlIGNvdW50ICovCisJc3dpdGNoIChlcnJfdHlwZSAmIEVSUl9UWVBFX01BU0spIHsKKwljYXNlIEVSUl9UWVBFX1JUQVNfTE9HOgorCQlsZW4gPSBsb2dfcnRhc19sZW4oYnVmKTsKKwkJaWYgKCEoZXJyX3R5cGUgJiBFUlJfRkxBR19CT09UKSkKKwkJCWVycm9yX2xvZ19jbnQrKzsKKwkJYnJlYWs7CisJY2FzZSBFUlJfVFlQRV9LRVJORUxfUEFOSUM6CisJZGVmYXVsdDoKKwkJV0FSTl9PTl9PTkNFKCFpcnFzX2Rpc2FibGVkKCkpOyAvKiBAQEAgREVCVUcgQEBAICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0YXNkX2xvZ19sb2NrLCBzKTsKKwkJcmV0dXJuOworCX0KKworI2lmZGVmIENPTkZJR19QUEM2NAorCS8qIFdyaXRlIGVycm9yIHRvIE5WUkFNICovCisJaWYgKGxvZ2dpbmdfZW5hYmxlZCAmJiAhKGVycl90eXBlICYgRVJSX0ZMQUdfQk9PVCkpCisJCW52cmFtX3dyaXRlX2Vycm9yX2xvZyhidWYsIGxlbiwgZXJyX3R5cGUsIGVycm9yX2xvZ19jbnQpOworI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLworCisJLyoKKwkgKiBydGFzIGVycm9ycyBjYW4gb2NjdXIgZHVyaW5nIGJvb3QsIGFuZCB3ZSBkbyB3YW50IHRvIGNhcHR1cmUKKwkgKiB0aG9zZSBzb21ld2hlcmUsIGV2ZW4gaWYgbnZyYW0gaXNuJ3QgcmVhZHkgKHdoeSBub3Q/KSwgYW5kIGV2ZW4KKwkgKiBpZiBydGFzZCBpc24ndCByZWFkeS4gUHV0IHRoZW0gaW50byB0aGUgYm9vdCBsb2csIGF0IGxlYXN0LgorCSAqLworCWlmICgoZXJyX3R5cGUgJiBFUlJfVFlQRV9NQVNLKSA9PSBFUlJfVFlQRV9SVEFTX0xPRykKKwkJcHJpbnRrX2xvZ19ydGFzKGJ1ZiwgbGVuKTsKKworCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIG9yIGhhdmUgc3RvcHBlZCBsb2dnaW5nICovCisJaWYgKGZhdGFsIHx8ICFsb2dnaW5nX2VuYWJsZWQpIHsKKwkJbG9nZ2luZ19lbmFibGVkID0gMDsKKwkJV0FSTl9PTl9PTkNFKCFpcnFzX2Rpc2FibGVkKCkpOyAvKiBAQEAgREVCVUcgQEBAICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0YXNkX2xvZ19sb2NrLCBzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGNhbGwgdHlwZSBzcGVjaWZpYyBtZXRob2QgZm9yIGVycm9yICovCisJc3dpdGNoIChlcnJfdHlwZSAmIEVSUl9UWVBFX01BU0spIHsKKwljYXNlIEVSUl9UWVBFX1JUQVNfTE9HOgorCQlvZmZzZXQgPSBydGFzX2Vycm9yX2xvZ19idWZmZXJfbWF4ICoKKwkJCSgocnRhc19sb2dfc3RhcnQrcnRhc19sb2dfc2l6ZSkgJiBMT0dfTlVNQkVSX01BU0spOworCisJCS8qIEZpcnN0IGNvcHkgb3ZlciBzZXF1ZW5jZSBudW1iZXIgKi8KKwkJbWVtY3B5KCZydGFzX2xvZ19idWZbb2Zmc2V0XSwgKHZvaWQgKikgJmVycm9yX2xvZ19jbnQsIHNpemVvZihpbnQpKTsKKworCQkvKiBTZWNvbmQgY29weSBvdmVyIGVycm9yIGxvZyBkYXRhICovCisJCW9mZnNldCArPSBzaXplb2YoaW50KTsKKwkJbWVtY3B5KCZydGFzX2xvZ19idWZbb2Zmc2V0XSwgYnVmLCBsZW4pOworCisJCWlmIChydGFzX2xvZ19zaXplIDwgTE9HX05VTUJFUikKKwkJCXJ0YXNfbG9nX3NpemUgKz0gMTsKKwkJZWxzZQorCQkJcnRhc19sb2dfc3RhcnQgKz0gMTsKKworCQlXQVJOX09OX09OQ0UoIWlycXNfZGlzYWJsZWQoKSk7IC8qIEBAQCBERUJVRyBAQEAgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRhc2RfbG9nX2xvY2ssIHMpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnJ0YXNfbG9nX3dhaXQpOworCQlicmVhazsKKwljYXNlIEVSUl9UWVBFX0tFUk5FTF9QQU5JQzoKKwlkZWZhdWx0OgorCQlXQVJOX09OX09OQ0UoIWlycXNfZGlzYWJsZWQoKSk7IC8qIEBAQCBERUJVRyBAQEAgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRhc2RfbG9nX2xvY2ssIHMpOworCQlyZXR1cm47CisJfQorCit9CisKK3N0YXRpYyBpbnQgcnRhc19sb2dfb3BlbihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0YXNfbG9nX3JlbGVhc2Uoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyB3aWxsIGNoZWNrIGlmIGFsbCBldmVudHMgYXJlIGxvZ2dlZCwgaWYgdGhleSBhcmUgdGhlbiwgd2UKKyAqIGtub3cgdGhhdCB3ZSBjYW4gc2FmZWx5IGNsZWFyIHRoZSBldmVudHMgaW4gTlZSQU0uCisgKiBOZXh0IHdlJ2xsIHNpdCBhbmQgd2FpdCBmb3Igc29tZXRoaW5nIGVsc2UgdG8gbG9nLgorICovCitzdGF0aWMgc3NpemVfdCBydGFzX2xvZ19yZWFkKHN0cnVjdCBmaWxlICogZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsCisJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IGVycm9yOworCWNoYXIgKnRtcDsKKwl1bnNpZ25lZCBsb25nIHM7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisKKwlpZiAoIWJ1ZiB8fCBjb3VudCA8IHJ0YXNfZXJyb3JfbG9nX2J1ZmZlcl9tYXgpCisJCXJldHVybiAtRUlOVkFMOworCisJY291bnQgPSBydGFzX2Vycm9yX2xvZ19idWZmZXJfbWF4OworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWYsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwl0bXAgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRtcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRhc2RfbG9nX2xvY2ssIHMpOworCisJLyogaWYgaXQncyAwLCB0aGVuIHdlIGtub3cgd2UgZ290IHRoZSBsYXN0IG9uZSAodGhlIG9uZSBpbiBOVlJBTSkgKi8KKwl3aGlsZSAocnRhc19sb2dfc2l6ZSA9PSAwKSB7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRhc2RfbG9nX2xvY2ssIHMpOworCQkJZXJyb3IgPSAtRUFHQUlOOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoIWxvZ2dpbmdfZW5hYmxlZCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRhc2RfbG9nX2xvY2ssIHMpOworCQkJZXJyb3IgPSAtRU5PREFUQTsKKwkJCWdvdG8gb3V0OworCQl9CisjaWZkZWYgQ09ORklHX1BQQzY0CisJCW52cmFtX2NsZWFyX2Vycm9yX2xvZygpOworI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0YXNkX2xvZ19sb2NrLCBzKTsKKwkJZXJyb3IgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocnRhc19sb2dfd2FpdCwgcnRhc19sb2dfc2l6ZSk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0OworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnRhc2RfbG9nX2xvY2ssIHMpOworCX0KKworCW9mZnNldCA9IHJ0YXNfZXJyb3JfbG9nX2J1ZmZlcl9tYXggKiAocnRhc19sb2dfc3RhcnQgJiBMT0dfTlVNQkVSX01BU0spOworCW1lbWNweSh0bXAsICZydGFzX2xvZ19idWZbb2Zmc2V0XSwgY291bnQpOworCisJcnRhc19sb2dfc3RhcnQgKz0gMTsKKwlydGFzX2xvZ19zaXplIC09IDE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRhc2RfbG9nX2xvY2ssIHMpOworCisJZXJyb3IgPSBjb3B5X3RvX3VzZXIoYnVmLCB0bXAsIGNvdW50KSA/IC1FRkFVTFQgOiBjb3VudDsKK291dDoKKwlrZnJlZSh0bXApOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBydGFzX2xvZ19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICogd2FpdCkKK3sKKwlwb2xsX3dhaXQoZmlsZSwgJnJ0YXNfbG9nX3dhaXQsIHdhaXQpOworCWlmIChydGFzX2xvZ19zaXplKQorCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19ydGFzX2xvZ19vcGVyYXRpb25zID0geworCS5yZWFkID0JCXJ0YXNfbG9nX3JlYWQsCisJLnBvbGwgPQkJcnRhc19sb2dfcG9sbCwKKwkub3BlbiA9CQlydGFzX2xvZ19vcGVuLAorCS5yZWxlYXNlID0JcnRhc19sb2dfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgZW5hYmxlX3N1cnZlaWxsYW5jZShpbnQgdGltZW91dCkKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IHJ0YXNfc2V0X2luZGljYXRvcihTVVJWRUlMTEFOQ0VfVE9LRU4sIDAsIHRpbWVvdXQpOworCisJaWYgKGVycm9yID09IDApCisJCXJldHVybiAwOworCisJaWYgKGVycm9yID09IC1FSU5WQUwpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInJ0YXNkOiBzdXJ2ZWlsbGFuY2Ugbm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAwOworCX0KKworCXByaW50ayhLRVJOX0VSUiAicnRhc2Q6IGNvdWxkIG5vdCB1cGRhdGUgc3VydmVpbGxhbmNlXG4iKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2V2ZW50X3NjYW4odm9pZCkKK3sKKwlpbnQgZXJyb3I7CisJZG8geworCQltZW1zZXQobG9nZGF0YSwgMCwgcnRhc19lcnJvcl9sb2dfbWF4KTsKKwkJZXJyb3IgPSBydGFzX2NhbGwoZXZlbnRfc2NhbiwgNCwgMSwgTlVMTCwKKwkJCQkgIFJUQVNfRVZFTlRfU0NBTl9BTExfRVZFTlRTLCAwLAorCQkJCSAgX19wYShsb2dkYXRhKSwgcnRhc19lcnJvcl9sb2dfbWF4KTsKKwkJaWYgKGVycm9yID09IC0xKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImV2ZW50LXNjYW4gZmFpbGVkXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGVycm9yID09IDApCisJCQlwU2VyaWVzX2xvZ19lcnJvcihsb2dkYXRhLCBFUlJfVFlQRV9SVEFTX0xPRywgMCk7CisKKwl9IHdoaWxlKGVycm9yID09IDApOworfQorCitzdGF0aWMgdm9pZCBydGFzX2V2ZW50X3NjYW4oc3RydWN0IHdvcmtfc3RydWN0ICp3KTsKK0RFQ0xBUkVfREVMQVlFRF9XT1JLKGV2ZW50X3NjYW5fd29yaywgcnRhc19ldmVudF9zY2FuKTsKKworLyoKKyAqIERlbGF5IHNob3VsZCBiZSBhdCBsZWFzdCBvbmUgc2Vjb25kIHNpbmNlIHNvbWUgbWFjaGluZXMgaGF2ZSBwcm9ibGVtcyBpZgorICogd2UgY2FsbCBldmVudC1zY2FuIHRvbyBxdWlja2x5LgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBldmVudF9zY2FuX2RlbGF5ID0gMSpIWjsKK3N0YXRpYyBpbnQgZmlyc3RfcGFzcyA9IDE7CisKK3N0YXRpYyB2b2lkIHJ0YXNfZXZlbnRfc2NhbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKncpCit7CisJdW5zaWduZWQgaW50IGNwdTsKKworCWRvX2V2ZW50X3NjYW4oKTsKKworCWdldF9vbmxpbmVfY3B1cygpOworCisJY3B1ID0gbmV4dF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjcHVfb25saW5lX21hcCk7CisJaWYgKGNwdSA9PSBOUl9DUFVTKSB7CisJCWNwdSA9IGZpcnN0X2NwdShjcHVfb25saW5lX21hcCk7CisKKwkJaWYgKGZpcnN0X3Bhc3MpIHsKKwkJCWZpcnN0X3Bhc3MgPSAwOworCQkJZXZlbnRfc2Nhbl9kZWxheSA9IDMwKkhaL3J0YXNfZXZlbnRfc2Nhbl9yYXRlOworCisJCQlpZiAoc3VydmVpbGxhbmNlX3RpbWVvdXQgIT0gLTEpIHsKKwkJCQlwcl9kZWJ1ZygicnRhc2Q6IGVuYWJsaW5nIHN1cnZlaWxsYW5jZVxuIik7CisJCQkJZW5hYmxlX3N1cnZlaWxsYW5jZShzdXJ2ZWlsbGFuY2VfdGltZW91dCk7CisJCQkJcHJfZGVidWcoInJ0YXNkOiBzdXJ2ZWlsbGFuY2UgZW5hYmxlZFxuIik7CisJCQl9CisJCX0KKwl9CisKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmtfb24oY3B1LCAmZXZlbnRfc2Nhbl93b3JrLAorCQlfX3JvdW5kX2ppZmZpZXNfcmVsYXRpdmUoZXZlbnRfc2Nhbl9kZWxheSwgY3B1KSk7CisKKwlwdXRfb25saW5lX2NwdXMoKTsKK30KKworI2lmZGVmIENPTkZJR19QUEM2NAorc3RhdGljIHZvaWQgcmV0cmVpdmVfbnZyYW1fZXJyb3JfbG9nKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGVycl90eXBlIDsKKwlpbnQgcmMgOworCisJLyogU2VlIGlmIHdlIGhhdmUgYW55IGVycm9yIHN0b3JlZCBpbiBOVlJBTSAqLworCW1lbXNldChsb2dkYXRhLCAwLCBydGFzX2Vycm9yX2xvZ19tYXgpOworCXJjID0gbnZyYW1fcmVhZF9lcnJvcl9sb2cobG9nZGF0YSwgcnRhc19lcnJvcl9sb2dfbWF4LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycl90eXBlLCAmZXJyb3JfbG9nX2NudCk7CisJLyogV2UgY2FuIHVzZSBydGFzX2xvZ19idWYgbm93ICovCisJbG9nZ2luZ19lbmFibGVkID0gMTsKKwlpZiAoIXJjKSB7CisJCWlmIChlcnJfdHlwZSAhPSBFUlJfRkxBR19BTFJFQURZX0xPR0dFRCkgeworCQkJcFNlcmllc19sb2dfZXJyb3IobG9nZGF0YSwgZXJyX3R5cGUgfCBFUlJfRkxBR19CT09ULCAwKTsKKwkJfQorCX0KK30KKyNlbHNlIC8qIENPTkZJR19QUEM2NCAqLworc3RhdGljIHZvaWQgcmV0cmVpdmVfbnZyYW1fZXJyb3JfbG9nKHZvaWQpCit7Cit9CisjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCisKK3N0YXRpYyB2b2lkIHN0YXJ0X2V2ZW50X3NjYW4odm9pZCkKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiUlRBUyBkYWVtb24gc3RhcnRlZFxuIik7CisJcHJfZGVidWcoInJ0YXNkOiB3aWxsIHNsZWVwIGZvciAlZCBtaWxsaXNlY29uZHNcbiIsCisJCSAoMzAwMDAgLyBydGFzX2V2ZW50X3NjYW5fcmF0ZSkpOworCisJLyogUmV0cmVpdmUgZXJyb3JzIGZyb20gbnZyYW0gaWYgYW55ICovCisJcmV0cmVpdmVfbnZyYW1fZXJyb3JfbG9nKCk7CisKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmtfb24oZmlyc3RfY3B1KGNwdV9vbmxpbmVfbWFwKSwgJmV2ZW50X3NjYW5fd29yaywKKwkJCQkgZXZlbnRfc2Nhbl9kZWxheSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHJ0YXNfaW5pdCh2b2lkKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50cnk7CisKKwlpZiAoIW1hY2hpbmVfaXMocHNlcmllcykgJiYgIW1hY2hpbmVfaXMoY2hycCkpCisJCXJldHVybiAwOworCisJLyogTm8gUlRBUyAqLworCWV2ZW50X3NjYW4gPSBydGFzX3Rva2VuKCJldmVudC1zY2FuIik7CisJaWYgKGV2ZW50X3NjYW4gPT0gUlRBU19VTktOT1dOX1NFUlZJQ0UpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicnRhc2Q6IE5vIGV2ZW50LXNjYW4gb24gc3lzdGVtXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcnRhc19ldmVudF9zY2FuX3JhdGUgPSBydGFzX3Rva2VuKCJydGFzLWV2ZW50LXNjYW4tcmF0ZSIpOworCWlmIChydGFzX2V2ZW50X3NjYW5fcmF0ZSA9PSBSVEFTX1VOS05PV05fU0VSVklDRSkgeworCQlwcmludGsoS0VSTl9FUlIgInJ0YXNkOiBubyBydGFzLWV2ZW50LXNjYW4tcmF0ZSBvbiBzeXN0ZW1cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBNYWtlIHJvb20gZm9yIHRoZSBzZXF1ZW5jZSBudW1iZXIgKi8KKwlydGFzX2Vycm9yX2xvZ19tYXggPSBydGFzX2dldF9lcnJvcl9sb2dfbWF4KCk7CisJcnRhc19lcnJvcl9sb2dfYnVmZmVyX21heCA9IHJ0YXNfZXJyb3JfbG9nX21heCArIHNpemVvZihpbnQpOworCisJcnRhc19sb2dfYnVmID0gdm1hbGxvYyhydGFzX2Vycm9yX2xvZ19idWZmZXJfbWF4KkxPR19OVU1CRVIpOworCWlmICghcnRhc19sb2dfYnVmKSB7CisJCXByaW50ayhLRVJOX0VSUiAicnRhc2Q6IG5vIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWVudHJ5ID0gcHJvY19jcmVhdGUoInBvd2VycGMvcnRhcy9lcnJvcl9sb2ciLCBTX0lSVVNSLCBOVUxMLAorCQkJICAgICZwcm9jX3J0YXNfbG9nX29wZXJhdGlvbnMpOworCWlmICghZW50cnkpCisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGNyZWF0ZSBlcnJvcl9sb2cgcHJvYyBlbnRyeVxuIik7CisKKwlzdGFydF9ldmVudF9zY2FuKCk7CisKKwlyZXR1cm4gMDsKK30KK19faW5pdGNhbGwocnRhc19pbml0KTsKKworc3RhdGljIGludCBfX2luaXQgc3VydmVpbGxhbmNlX3NldHVwKGNoYXIgKnN0cikKK3sKKwlpbnQgaTsKKworCS8qIFdlIG9ubHkgZG8gc3VydmVpbGxhbmNlIG9uIHBzZXJpZXMgKi8KKwlpZiAoIW1hY2hpbmVfaXMocHNlcmllcykpCisJCXJldHVybiAwOworCisJaWYgKGdldF9vcHRpb24oJnN0ciwmaSkpIHsKKwkJaWYgKGkgPj0gMCAmJiBpIDw9IDI1NSkKKwkJCXN1cnZlaWxsYW5jZV90aW1lb3V0ID0gaTsKKwl9CisKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoInN1cnZlaWxsYW5jZT0iLCBzdXJ2ZWlsbGFuY2Vfc2V0dXApOworCitzdGF0aWMgaW50IF9faW5pdCBydGFzbXNnc19zZXR1cChjaGFyICpzdHIpCit7CisJaWYgKHN0cmNtcChzdHIsICJvbiIpID09IDApCisJCWZ1bGxfcnRhc19tc2dzID0gMTsKKwllbHNlIGlmIChzdHJjbXAoc3RyLCAib2ZmIikgPT0gMCkKKwkJZnVsbF9ydGFzX21zZ3MgPSAwOworCisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJydGFzbXNncz0iLCBydGFzbXNnc19zZXR1cCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwLWNvbW1vbi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cC1jb21tb24uYwppbmRleCA4NDVjNzJhLi4wM2RkNmEyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwLWNvbW1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXAtY29tbW9uLmMKQEAgLTE1Nyw3ICsxNTcsNyBAQAogI2VuZGlmIC8qIENPTkZJR19UQVUgKi8KIAogI2lmZGVmIENPTkZJR19TTVAKLURFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGludCwgcHZyKTsKK0RFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGludCwgY3B1X3B2cik7CiAjZW5kaWYKIAogc3RhdGljIGludCBzaG93X2NwdWluZm8oc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQpAQCAtMjA5LDcgKzIwOSw3IEBACiAJfQogCiAjaWZkZWYgQ09ORklHX1NNUAotCXB2ciA9IHBlcl9jcHUocHZyLCBjcHVfaWQpOworCXB2ciA9IHBlcl9jcHUoY3B1X3B2ciwgY3B1X2lkKTsKICNlbHNlCiAJcHZyID0gbWZzcHIoU1BSTl9QVlIpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMKaW5kZXggZGYyYzllOS4uNjU2ODQwNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYwpAQCAtMzU2LDExICszNTYsNiBAQAogCSAqLwogCWluaXRpYWxpemVfY2FjaGVfaW5mbygpOwogCi0JLyoKLQkgKiBJbml0aWFsaXplIGlycSByZW1hcHBpbmcgc3Vic3lzdGVtCi0JICovCi0JaXJxX2Vhcmx5X2luaXQoKTsKLQogI2lmZGVmIENPTkZJR19QUENfUlRBUwogCS8qCiAJICogSW5pdGlhbGl6ZSBSVEFTIGlmIGF2YWlsYWJsZQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMKaW5kZXggOWI4NmE3NC4uYTUyMWZiOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jCkBAIC0yMTgsNiArMjE4LDkgQEAKIAogc3RhdGljIHZvaWQgc3RvcF90aGlzX2NwdSh2b2lkICpkdW1teSkKIHsKKwkvKiBSZW1vdmUgdGhpcyBDUFUgKi8KKwlzZXRfY3B1X29ubGluZShzbXBfcHJvY2Vzc29yX2lkKCksIGZhbHNlKTsKKwogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJd2hpbGUgKDEpCiAJCTsKQEAgLTIzMiw3ICsyMzUsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgc21wX3N0b3JlX2NwdV9pbmZvKGludCBpZCkKIHsKLQlwZXJfY3B1KHB2ciwgaWQpID0gbWZzcHIoU1BSTl9QVlIpOworCXBlcl9jcHUoY3B1X3B2ciwgaWQpID0gbWZzcHIoU1BSTl9QVlIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgc21wX2NyZWF0ZV9pZGxlKHVuc2lnbmVkIGludCBjcHUpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2NhbGxzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2NhbGxzLmMKaW5kZXggYzA0ODMyYy4uMzM3MGU2MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNjYWxscy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzY2FsbHMuYwpAQCAtMTQwLDcgKzE0MCw2IEBACiAJCQl1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiAJCQl1bnNpZ25lZCBsb25nIGZkLCB1bnNpZ25lZCBsb25nIG9mZiwgaW50IHNoaWZ0KQogewotCXN0cnVjdCBmaWxlICogZmlsZSA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyByZXQgPSAtRUlOVkFMOwogCiAJaWYgKCFhcmNoX3ZhbGlkYXRlX3Byb3QocHJvdCkpCkBAIC0xNTEsMjAgKzE1MCw4IEBACiAJCQlnb3RvIG91dDsKIAkJb2ZmID4+PSBzaGlmdDsKIAl9Ci0JCQotCXJldCA9IC1FQkFERjsKLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWlmICghKGZpbGUgPSBmZ2V0KGZkKSkpCi0JCQlnb3RvIG91dDsKLQl9CiAKLQlmbGFncyAmPSB+KE1BUF9FWEVDVVRBQkxFIHwgTUFQX0RFTllXUklURSk7Ci0KLQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCXJldCA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgb2ZmKTsKLQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQlpZiAoZmlsZSkKLQkJZnB1dChmaWxlKTsKKwlyZXQgPSBzeXNfbW1hcF9wZ29mZihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgb2ZmKTsKIG91dDoKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNmcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNmcy5jCmluZGV4IDk1NmFiMzMuLmUyMzVlNTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzZnMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2ZzLmMKQEAgLTQ2MSw2ICs0NjEsMjUgQEAKIAogCWNhY2hlaW5mb19jcHVfb2ZmbGluZShjcHUpOwogfQorCisjaWZkZWYgQ09ORklHX0FSQ0hfQ1BVX1BST0JFX1JFTEVBU0UKK3NzaXplX3QgYXJjaF9jcHVfcHJvYmUoY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaWYgKHBwY19tZC5jcHVfcHJvYmUpCisJCXJldHVybiBwcGNfbWQuY3B1X3Byb2JlKGJ1ZiwgY291bnQpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3NzaXplX3QgYXJjaF9jcHVfcmVsZWFzZShjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpZiAocHBjX21kLmNwdV9yZWxlYXNlKQorCQlyZXR1cm4gcHBjX21kLmNwdV9yZWxlYXNlKGJ1ZiwgY291bnQpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisjZW5kaWYgLyogQ09ORklHX0FSQ0hfQ1BVX1BST0JFX1JFTEVBU0UgKi8KKwogI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLwogCiBzdGF0aWMgaW50IF9fY3B1aW5pdCBzeXNmc19jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKaW5kZXggNjc0ODAwYi4uOWJhMmNjOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKQEAgLTI2OSw2ICsyNjksNyBAQAogCXBlcl9jcHUoY3B1dGltZV9zY2FsZWRfbGFzdF9kZWx0YSwgc21wX3Byb2Nlc3Nvcl9pZCgpKSA9IGRlbHRhc2NhbGVkOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGFjY291bnRfc3lzdGVtX3Z0aW1lKTsKIAogLyoKICAqIFRyYW5zZmVyIHRoZSB1c2VyIGFuZCBzeXN0ZW0gdGltZXMgYWNjdW11bGF0ZWQgaW4gdGhlIHBhY2EKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYwppbmRleCA5ZDFmOTM1Li44MDRmMGYzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCkBAIC0xOTgsMjggKzE5OCw2IEBACiAJaW5mby5zaV9jb2RlID0gY29kZTsKIAlpbmZvLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKikgYWRkcjsKIAlmb3JjZV9zaWdfaW5mbyhzaWduciwgJmluZm8sIGN1cnJlbnQpOwotCi0JLyoKLQkgKiBJbml0IGdldHMgbm8gc2lnbmFscyB0aGF0IGl0IGRvZXNuJ3QgaGF2ZSBhIGhhbmRsZXIgZm9yLgotCSAqIFRoYXQncyBhbGwgdmVyeSB3ZWxsLCBidXQgaWYgaXQgaGFzIGNhdXNlZCBhIHN5bmNocm9ub3VzCi0JICogZXhjZXB0aW9uIGFuZCB3ZSBpZ25vcmUgdGhlIHJlc3VsdGluZyBzaWduYWwsIGl0IHdpbGwganVzdAotCSAqIGdlbmVyYXRlIHRoZSBzYW1lIGV4Y2VwdGlvbiBvdmVyIGFuZCBvdmVyIGFnYWluIGFuZCB3ZSBnZXQKLQkgKiBub3doZXJlLiAgQmV0dGVyIHRvIGtpbGwgaXQgYW5kIGxldCB0aGUga2VybmVsIHBhbmljLgotCSAqLwotCWlmIChpc19nbG9iYWxfaW5pdChjdXJyZW50KSkgewotCQlfX3NpZ2hhbmRsZXJfdCBoYW5kbGVyOwotCi0JCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCQloYW5kbGVyID0gY3VycmVudC0+c2lnaGFuZC0+YWN0aW9uW3NpZ25yLTFdLnNhLnNhX2hhbmRsZXI7Ci0JCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JCWlmIChoYW5kbGVyID09IFNJR19ERkwpIHsKLQkJCS8qIGluaXQgaGFzIGdlbmVyYXRlZCBhIHN5bmNocm9ub3VzIGV4Y2VwdGlvbgotCQkJICAgYW5kIGl0IGRvZXNuJ3QgaGF2ZSBhIGhhbmRsZXIgZm9yIHRoZSBzaWduYWwgKi8KLQkJCXByaW50ayhLRVJOX0NSSVQgImluaXQgaGFzIGdlbmVyYXRlZCBzaWduYWwgJWQgIgotCQkJICAgICAgICJidXQgaGFzIG5vIGhhbmRsZXIgZm9yIGl0XG4iLCBzaWducik7Ci0JCQlkb19leGl0KHNpZ25yKTsKLQkJfQotCX0KIH0KIAogI2lmZGVmIENPTkZJR19QUEM2NApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZWN0b3IuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmVjdG9yLlMKaW5kZXggNjdiNjkxNi4uZmU0NjA0OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZWN0b3IuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3ZlY3Rvci5TCkBAIC01OCw3ICs1OCw3IEBACiAJICogYWxsIDEncwogCSAqLwogCW1mc3ByCXI0LFNQUk5fVlJTQVZFCi0JY21wZGkJMCxyNCwwCisJY21wd2kJMCxyNCwwCiAJYm5lKwkxZgogCWxpCXI0LC0xCiAJbXRzcHIJU1BSTl9WUlNBVkUscjQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9rdm0vS2NvbmZpZwppbmRleCBjMjk5MjY4Li4wNzcwM2Y3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9LY29uZmlnCkBAIC0yMSw2ICsyMSwyMyBAQAogCXNlbGVjdCBQUkVFTVBUX05PVElGSUVSUwogCXNlbGVjdCBBTk9OX0lOT0RFUwogCitjb25maWcgS1ZNX0JPT0szU182NF9IQU5ETEVSCisJYm9vbAorCitjb25maWcgS1ZNX0JPT0szU182NAorCXRyaXN0YXRlICJLVk0gc3VwcG9ydCBmb3IgUG93ZXJQQyBib29rM3NfNjQgcHJvY2Vzc29ycyIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBQUEM2NAorCXNlbGVjdCBLVk0KKwlzZWxlY3QgS1ZNX0JPT0szU182NF9IQU5ETEVSCisJLS0taGVscC0tLQorCSAgU3VwcG9ydCBydW5uaW5nIHVubW9kaWZpZWQgYm9vazNzXzY0IGFuZCBib29rM3NfMzIgZ3Vlc3Qga2VybmVscworCSAgaW4gdmlydHVhbCBtYWNoaW5lcyBvbiBib29rM3NfNjQgaG9zdCBwcm9jZXNzb3JzLgorCisJICBUaGlzIG1vZHVsZSBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGhhcmR3YXJlIGNhcGFiaWxpdGllcyB0aHJvdWdoCisJICBhIGNoYXJhY3RlciBkZXZpY2Ugbm9kZSBuYW1lZCAvZGV2L2t2bS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIEtWTV80NDAKIAlib29sICJLVk0gc3VwcG9ydCBmb3IgUG93ZXJQQyA0NDAgcHJvY2Vzc29ycyIKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiA0NHgKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMva3ZtL01ha2VmaWxlCmluZGV4IDM3NjU1ZmUuLjU2NDg0ZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9NYWtlZmlsZQpAQCAtMTIsMjYgKzEyLDQ1IEBACiBDRkxBR1NfZTUwMF90bGIubyA6PSAtSS4KIENGTEFHU19lbXVsYXRlLm8gIDo9IC1JLgogCi1rdm0tb2JqcyA6PSAkKGNvbW1vbi1vYmpzLXkpIHBvd2VycGMubyBlbXVsYXRlLm8KK2NvbW1vbi1vYmpzLXkgKz0gcG93ZXJwYy5vIGVtdWxhdGUubwogb2JqLSQoQ09ORklHX0tWTV9FWElUX1RJTUlORykgKz0gdGltaW5nLm8KLW9iai0kKENPTkZJR19LVk0pICs9IGt2bS5vCitvYmotJChDT05GSUdfS1ZNX0JPT0szU182NF9IQU5ETEVSKSArPSBib29rM3NfNjRfZXhwb3J0cy5vCiAKIEFGTEFHU19ib29rZV9pbnRlcnJ1cHRzLm8gOj0gLUkkKG9iaikKIAoga3ZtLTQ0MC1vYmpzIDo9IFwKKwkkKGNvbW1vbi1vYmpzLXkpIFwKIAlib29rZS5vIFwKIAlib29rZV9lbXVsYXRlLm8gXAogCWJvb2tlX2ludGVycnVwdHMubyBcCiAJNDR4Lm8gXAogCTQ0eF90bGIubyBcCiAJNDR4X2VtdWxhdGUubwotb2JqLSQoQ09ORklHX0tWTV80NDApICs9IGt2bS00NDAubwora3ZtLW9ianMtJChDT05GSUdfS1ZNXzQ0MCkgOj0gJChrdm0tNDQwLW9ianMpCiAKIGt2bS1lNTAwLW9ianMgOj0gXAorCSQoY29tbW9uLW9ianMteSkgXAogCWJvb2tlLm8gXAogCWJvb2tlX2VtdWxhdGUubyBcCiAJYm9va2VfaW50ZXJydXB0cy5vIFwKIAllNTAwLm8gXAogCWU1MDBfdGxiLm8gXAogCWU1MDBfZW11bGF0ZS5vCi1vYmotJChDT05GSUdfS1ZNX0U1MDApICs9IGt2bS1lNTAwLm8KK2t2bS1vYmpzLSQoQ09ORklHX0tWTV9FNTAwKSA6PSAkKGt2bS1lNTAwLW9ianMpCisKK2t2bS1ib29rM3NfNjQtb2JqcyA6PSBcCisJJChjb21tb24tb2Jqcy15KSBcCisJYm9vazNzLm8gXAorCWJvb2szc182NF9lbXVsYXRlLm8gXAorCWJvb2szc182NF9pbnRlcnJ1cHRzLm8gXAorCWJvb2szc182NF9tbXVfaG9zdC5vIFwKKwlib29rM3NfNjRfbW11Lm8gXAorCWJvb2szc18zMl9tbXUubwora3ZtLW9ianMtJChDT05GSUdfS1ZNX0JPT0szU182NCkgOj0gJChrdm0tYm9vazNzXzY0LW9ianMpCisKK2t2bS1vYmpzIDo9ICQoa3ZtLW9ianMtbSkgJChrdm0tb2Jqcy15KQorCitvYmotJChDT05GSUdfS1ZNXzQ0MCkgKz0ga3ZtLm8KK29iai0kKENPTkZJR19LVk1fRTUwMCkgKz0ga3ZtLm8KK29iai0kKENPTkZJR19LVk1fQk9PSzNTXzY0KSArPSBrdm0ubworCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szcy5jIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTI5NGJkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3MuYwpAQCAtMCwwICsxLDk3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOS4gU1VTRSBMaW51eCBQcm9kdWN0cyBHbWJILiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBBbGV4YW5kZXIgR3JhZiA8YWdyYWZAc3VzZS5kZT4KKyAqICAgIEtldmluIFdvbGYgPG1haWxAa2V2aW4td29sZi5kZT4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYXJjaC9wb3dlcnBjL2t2bS80NHguYywKKyAqIGJ5IEhvbGxpcyBCbGFuY2hhcmQgPGhvbGxpc2JAdXMuaWJtLmNvbT4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorCisjaW5jbHVkZSA8YXNtL3JlZy5oPgorI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20va3ZtX3BwYy5oPgorI2luY2x1ZGUgPGFzbS9rdm1fYm9vazNzLmg+CisjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKKyNkZWZpbmUgVkNQVV9TVEFUKHgpIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgc3RhdC54KSwgS1ZNX1NUQVRfVkNQVQorCisvKiAjZGVmaW5lIEVYSVRfREVCVUcgKi8KKy8qICNkZWZpbmUgRVhJVF9ERUJVR19TSU1QTEUgKi8KKworLyogV2l0aG91dCBBR0dSRVNTSVZFX0RFQyB3ZSBvbmx5IGZpcmUgb2ZmIGEgREVDIGludGVycnVwdCB3aGVuIERFQyB0dXJucyAwLgorICogV2hlbiBzZXQsIHdlIHJldHJpZ2dlciBhIERFQyBpbnRlcnJ1cHQgYWZ0ZXIgdGhhdCBpZiBERUMgPD0gMC4KKyAqIFBQQzMyIExpbnV4IHJ1bnMgZmFzdGVyIHdpdGhvdXQgQUdHUkVTU0lWRV9ERUMsIFBQQzY0IExpbnV4IHJlcXVpcmVzIGl0LiAqLworCisvKiAjZGVmaW5lIEFHR1JFU1NJVkVfREVDICovCisKK3N0cnVjdCBrdm1fc3RhdHNfZGVidWdmc19pdGVtIGRlYnVnZnNfZW50cmllc1tdID0geworCXsgImV4aXRzIiwgICAgICAgVkNQVV9TVEFUKHN1bV9leGl0cykgfSwKKwl7ICJtbWlvIiwgICAgICAgIFZDUFVfU1RBVChtbWlvX2V4aXRzKSB9LAorCXsgInNpZyIsICAgICAgICAgVkNQVV9TVEFUKHNpZ25hbF9leGl0cykgfSwKKwl7ICJzeXNjIiwgICAgICAgIFZDUFVfU1RBVChzeXNjYWxsX2V4aXRzKSB9LAorCXsgImluc3RfZW11IiwgICAgVkNQVV9TVEFUKGVtdWxhdGVkX2luc3RfZXhpdHMpIH0sCisJeyAiZGVjIiwgICAgICAgICBWQ1BVX1NUQVQoZGVjX2V4aXRzKSB9LAorCXsgImV4dF9pbnRyIiwgICAgVkNQVV9TVEFUKGV4dF9pbnRyX2V4aXRzKSB9LAorCXsgInF1ZXVlX2ludHIiLCAgVkNQVV9TVEFUKHF1ZXVlX2ludHIpIH0sCisJeyAiaGFsdF93YWtldXAiLCBWQ1BVX1NUQVQoaGFsdF93YWtldXApIH0sCisJeyAicGZfc3RvcmFnZSIsICBWQ1BVX1NUQVQocGZfc3RvcmFnZSkgfSwKKwl7ICJzcF9zdG9yYWdlIiwgIFZDUFVfU1RBVChzcF9zdG9yYWdlKSB9LAorCXsgInBmX2luc3RydWMiLCAgVkNQVV9TVEFUKHBmX2luc3RydWMpIH0sCisJeyAic3BfaW5zdHJ1YyIsICBWQ1BVX1NUQVQoc3BfaW5zdHJ1YykgfSwKKwl7ICJsZCIsICAgICAgICAgIFZDUFVfU1RBVChsZCkgfSwKKwl7ICJsZF9zbG93IiwgICAgIFZDUFVfU1RBVChsZF9zbG93KSB9LAorCXsgInN0IiwgICAgICAgICAgVkNQVV9TVEFUKHN0KSB9LAorCXsgInN0X3Nsb3ciLCAgICAgVkNQVV9TVEFUKHN0X3Nsb3cpIH0sCisJeyBOVUxMIH0KK307CisKK3ZvaWQga3ZtcHBjX2NvcmVfbG9hZF9ob3N0X2RlYnVnc3RhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworfQorCit2b2lkIGt2bXBwY19jb3JlX2xvYWRfZ3Vlc3RfZGVidWdzdGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7Cit9CisKK3ZvaWQga3ZtcHBjX2NvcmVfdmNwdV9sb2FkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IGNwdSkKK3sKKwltZW1jcHkoZ2V0X3BhY2EoKS0+a3ZtX3NsYiwgdG9fYm9vazNzKHZjcHUpLT5zbGJfc2hhZG93LCBzaXplb2YoZ2V0X3BhY2EoKS0+a3ZtX3NsYikpOworCWdldF9wYWNhKCktPmt2bV9zbGJfbWF4ID0gdG9fYm9vazNzKHZjcHUpLT5zbGJfc2hhZG93X21heDsKK30KKwordm9pZCBrdm1wcGNfY29yZV92Y3B1X3B1dChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJbWVtY3B5KHRvX2Jvb2szcyh2Y3B1KS0+c2xiX3NoYWRvdywgZ2V0X3BhY2EoKS0+a3ZtX3NsYiwgc2l6ZW9mKGdldF9wYWNhKCktPmt2bV9zbGIpKTsKKwl0b19ib29rM3ModmNwdSktPnNsYl9zaGFkb3dfbWF4ID0gZ2V0X3BhY2EoKS0+a3ZtX3NsYl9tYXg7Cit9CisKKyNpZiBkZWZpbmVkKEFHR1JFU1NJVkVfREVDKSB8fCBkZWZpbmVkKEVYSVRfREVCVUcpCitzdGF0aWMgdTMyIGt2bXBwY19nZXRfZGVjKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl1NjQgamQgPSBtZnRiKCkgLSB2Y3B1LT5hcmNoLmRlY19qaWZmaWVzOworCXJldHVybiB2Y3B1LT5hcmNoLmRlYyAtIGpkOworfQorI2VuZGlmCisKK3ZvaWQga3ZtcHBjX3NldF9tc3Ioc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgbXNyKQoreworCXVsb25nIG9sZF9tc3IgPSB2Y3B1LT5hcmNoLm1zcjsKKworI2lmZGVmIEVYSVRfREVCVUcKKwlwcmludGsoS0VSTl9JTkZPICJLVk06IFNldCBNU1IgdG8gMHglbGx4XG4iLCBtc3IpOworI2VuZGlmCisJbXNyICY9IHRvX2Jvb2szcyh2Y3B1KS0+bXNyX21hc2s7CisJdmNwdS0+YXJjaC5tc3IgPSBtc3I7CisJdmNwdS0+YXJjaC5zaGFkb3dfbXNyID0gbXNyIHwgTVNSX1VTRVIzMjsKKwl2Y3B1LT5hcmNoLnNoYWRvd19tc3IgJj0gKCBNU1JfVkVDIHwgTVNSX1ZTWCB8IE1TUl9GUCB8IE1TUl9GRTAgfAorCQkJCSAgIE1TUl9VU0VSNjQgfCBNU1JfU0UgfCBNU1JfQkUgfCBNU1JfREUgfAorCQkJCSAgIE1TUl9GRTEpOworCisJaWYgKG1zciAmIChNU1JfV0V8TVNSX1BPVykpIHsKKwkJaWYgKCF2Y3B1LT5hcmNoLnBlbmRpbmdfZXhjZXB0aW9ucykgeworCQkJa3ZtX3ZjcHVfYmxvY2sodmNwdSk7CisJCQl2Y3B1LT5zdGF0LmhhbHRfd2FrZXVwKys7CisJCX0KKwl9CisKKwlpZiAoKCh2Y3B1LT5hcmNoLm1zciAmIChNU1JfSVJ8TVNSX0RSKSkgIT0gKG9sZF9tc3IgJiAoTVNSX0lSfE1TUl9EUikpKSB8fAorCSAgICAodmNwdS0+YXJjaC5tc3IgJiBNU1JfUFIpICE9IChvbGRfbXNyICYgTVNSX1BSKSkgeworCQlrdm1wcGNfbW11X2ZsdXNoX3NlZ21lbnRzKHZjcHUpOworCQlrdm1wcGNfbW11X21hcF9zZWdtZW50KHZjcHUsIHZjcHUtPmFyY2gucGMpOworCX0KK30KKwordm9pZCBrdm1wcGNfaW5qZWN0X2ludGVycnVwdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCB2ZWMsIHU2NCBmbGFncykKK3sKKwl2Y3B1LT5hcmNoLnNycjAgPSB2Y3B1LT5hcmNoLnBjOworCXZjcHUtPmFyY2guc3JyMSA9IHZjcHUtPmFyY2gubXNyIHwgZmxhZ3M7CisJdmNwdS0+YXJjaC5wYyA9IHRvX2Jvb2szcyh2Y3B1KS0+aGlvciArIHZlYzsKKwl2Y3B1LT5hcmNoLm1tdS5yZXNldF9tc3IodmNwdSk7Cit9CisKK3ZvaWQga3ZtcHBjX2Jvb2szc19xdWV1ZV9pcnFwcmlvKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgaW50IHZlYykKK3sKKwl1bnNpZ25lZCBpbnQgcHJpbzsKKworCXZjcHUtPnN0YXQucXVldWVfaW50cisrOworCXN3aXRjaCAodmVjKSB7CisJY2FzZSAweDEwMDogcHJpbyA9IEJPT0szU19JUlFQUklPX1NZU1RFTV9SRVNFVDsJCWJyZWFrOworCWNhc2UgMHgyMDA6IHByaW8gPSBCT09LM1NfSVJRUFJJT19NQUNISU5FX0NIRUNLOwlicmVhazsKKwljYXNlIDB4MzAwOiBwcmlvID0gQk9PSzNTX0lSUVBSSU9fREFUQV9TVE9SQUdFOwkJYnJlYWs7CisJY2FzZSAweDM4MDogcHJpbyA9IEJPT0szU19JUlFQUklPX0RBVEFfU0VHTUVOVDsJCWJyZWFrOworCWNhc2UgMHg0MDA6IHByaW8gPSBCT09LM1NfSVJRUFJJT19JTlNUX1NUT1JBR0U7CQlicmVhazsKKwljYXNlIDB4NDgwOiBwcmlvID0gQk9PSzNTX0lSUVBSSU9fSU5TVF9TRUdNRU5UOwkJYnJlYWs7CisJY2FzZSAweDUwMDogcHJpbyA9IEJPT0szU19JUlFQUklPX0VYVEVSTkFMOwkJYnJlYWs7CisJY2FzZSAweDYwMDogcHJpbyA9IEJPT0szU19JUlFQUklPX0FMSUdOTUVOVDsJCWJyZWFrOworCWNhc2UgMHg3MDA6IHByaW8gPSBCT09LM1NfSVJRUFJJT19QUk9HUkFNOwkJYnJlYWs7CisJY2FzZSAweDgwMDogcHJpbyA9IEJPT0szU19JUlFQUklPX0ZQX1VOQVZBSUw7CQlicmVhazsKKwljYXNlIDB4OTAwOiBwcmlvID0gQk9PSzNTX0lSUVBSSU9fREVDUkVNRU5URVI7CQlicmVhazsKKwljYXNlIDB4YzAwOiBwcmlvID0gQk9PSzNTX0lSUVBSSU9fU1lTQ0FMTDsJCWJyZWFrOworCWNhc2UgMHhkMDA6IHByaW8gPSBCT09LM1NfSVJRUFJJT19ERUJVRzsJCWJyZWFrOworCWNhc2UgMHhmMjA6IHByaW8gPSBCT09LM1NfSVJRUFJJT19BTFRJVkVDOwkJYnJlYWs7CisJY2FzZSAweGY0MDogcHJpbyA9IEJPT0szU19JUlFQUklPX1ZTWDsJCQlicmVhazsKKwlkZWZhdWx0OiAgICBwcmlvID0gQk9PSzNTX0lSUVBSSU9fTUFYOwkJCWJyZWFrOworCX0KKworCXNldF9iaXQocHJpbywgJnZjcHUtPmFyY2gucGVuZGluZ19leGNlcHRpb25zKTsKKyNpZmRlZiBFWElUX0RFQlVHCisJcHJpbnRrKEtFUk5fSU5GTyAiUXVldWVpbmcgaW50ZXJydXB0ICV4XG4iLCB2ZWMpOworI2VuZGlmCit9CisKKwordm9pZCBrdm1wcGNfY29yZV9xdWV1ZV9wcm9ncmFtKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlrdm1wcGNfYm9vazNzX3F1ZXVlX2lycXByaW8odmNwdSwgQk9PSzNTX0lOVEVSUlVQVF9QUk9HUkFNKTsKK30KKwordm9pZCBrdm1wcGNfY29yZV9xdWV1ZV9kZWMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCWt2bXBwY19ib29rM3NfcXVldWVfaXJxcHJpbyh2Y3B1LCBCT09LM1NfSU5URVJSVVBUX0RFQ1JFTUVOVEVSKTsKK30KKworaW50IGt2bXBwY19jb3JlX3BlbmRpbmdfZGVjKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlyZXR1cm4gdGVzdF9iaXQoQk9PSzNTX0lOVEVSUlVQVF9ERUNSRU1FTlRFUiA+PiA3LCAmdmNwdS0+YXJjaC5wZW5kaW5nX2V4Y2VwdGlvbnMpOworfQorCit2b2lkIGt2bXBwY19jb3JlX3F1ZXVlX2V4dGVybmFsKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGt2bV9pbnRlcnJ1cHQgKmlycSkKK3sKKwlrdm1wcGNfYm9vazNzX3F1ZXVlX2lycXByaW8odmNwdSwgQk9PSzNTX0lOVEVSUlVQVF9FWFRFUk5BTCk7Cit9CisKK2ludCBrdm1wcGNfYm9vazNzX2lycXByaW9fZGVsaXZlcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGludCBwcmlvcml0eSkKK3sKKwlpbnQgZGVsaXZlciA9IDE7CisJaW50IHZlYyA9IDA7CisKKwlzd2l0Y2ggKHByaW9yaXR5KSB7CisJY2FzZSBCT09LM1NfSVJRUFJJT19ERUNSRU1FTlRFUjoKKwkJZGVsaXZlciA9IHZjcHUtPmFyY2gubXNyICYgTVNSX0VFOworCQl2ZWMgPSBCT09LM1NfSU5URVJSVVBUX0RFQ1JFTUVOVEVSOworCQlicmVhazsKKwljYXNlIEJPT0szU19JUlFQUklPX0VYVEVSTkFMOgorCQlkZWxpdmVyID0gdmNwdS0+YXJjaC5tc3IgJiBNU1JfRUU7CisJCXZlYyA9IEJPT0szU19JTlRFUlJVUFRfRVhURVJOQUw7CisJCWJyZWFrOworCWNhc2UgQk9PSzNTX0lSUVBSSU9fU1lTVEVNX1JFU0VUOgorCQl2ZWMgPSBCT09LM1NfSU5URVJSVVBUX1NZU1RFTV9SRVNFVDsKKwkJYnJlYWs7CisJY2FzZSBCT09LM1NfSVJRUFJJT19NQUNISU5FX0NIRUNLOgorCQl2ZWMgPSBCT09LM1NfSU5URVJSVVBUX01BQ0hJTkVfQ0hFQ0s7CisJCWJyZWFrOworCWNhc2UgQk9PSzNTX0lSUVBSSU9fREFUQV9TVE9SQUdFOgorCQl2ZWMgPSBCT09LM1NfSU5URVJSVVBUX0RBVEFfU1RPUkFHRTsKKwkJYnJlYWs7CisJY2FzZSBCT09LM1NfSVJRUFJJT19JTlNUX1NUT1JBR0U6CisJCXZlYyA9IEJPT0szU19JTlRFUlJVUFRfSU5TVF9TVE9SQUdFOworCQlicmVhazsKKwljYXNlIEJPT0szU19JUlFQUklPX0RBVEFfU0VHTUVOVDoKKwkJdmVjID0gQk9PSzNTX0lOVEVSUlVQVF9EQVRBX1NFR01FTlQ7CisJCWJyZWFrOworCWNhc2UgQk9PSzNTX0lSUVBSSU9fSU5TVF9TRUdNRU5UOgorCQl2ZWMgPSBCT09LM1NfSU5URVJSVVBUX0lOU1RfU0VHTUVOVDsKKwkJYnJlYWs7CisJY2FzZSBCT09LM1NfSVJRUFJJT19BTElHTk1FTlQ6CisJCXZlYyA9IEJPT0szU19JTlRFUlJVUFRfQUxJR05NRU5UOworCQlicmVhazsKKwljYXNlIEJPT0szU19JUlFQUklPX1BST0dSQU06CisJCXZlYyA9IEJPT0szU19JTlRFUlJVUFRfUFJPR1JBTTsKKwkJYnJlYWs7CisJY2FzZSBCT09LM1NfSVJRUFJJT19WU1g6CisJCXZlYyA9IEJPT0szU19JTlRFUlJVUFRfVlNYOworCQlicmVhazsKKwljYXNlIEJPT0szU19JUlFQUklPX0FMVElWRUM6CisJCXZlYyA9IEJPT0szU19JTlRFUlJVUFRfQUxUSVZFQzsKKwkJYnJlYWs7CisJY2FzZSBCT09LM1NfSVJRUFJJT19GUF9VTkFWQUlMOgorCQl2ZWMgPSBCT09LM1NfSU5URVJSVVBUX0ZQX1VOQVZBSUw7CisJCWJyZWFrOworCWNhc2UgQk9PSzNTX0lSUVBSSU9fU1lTQ0FMTDoKKwkJdmVjID0gQk9PSzNTX0lOVEVSUlVQVF9TWVNDQUxMOworCQlicmVhazsKKwljYXNlIEJPT0szU19JUlFQUklPX0RFQlVHOgorCQl2ZWMgPSBCT09LM1NfSU5URVJSVVBUX1RSQUNFOworCQlicmVhazsKKwljYXNlIEJPT0szU19JUlFQUklPX1BFUkZPUk1BTkNFX01PTklUT1I6CisJCXZlYyA9IEJPT0szU19JTlRFUlJVUFRfUEVSRk1PTjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGVsaXZlciA9IDA7CisJCXByaW50ayhLRVJOX0VSUiAiS1ZNOiBVbmtub3duIGludGVycnVwdDogMHgleFxuIiwgcHJpb3JpdHkpOworCQlicmVhazsKKwl9CisKKyNpZiAwCisJcHJpbnRrKEtFUk5fSU5GTyAiRGVsaXZlciBpbnRlcnJ1cHQgMHgleD8gJXhcbiIsIHZlYywgZGVsaXZlcik7CisjZW5kaWYKKworCWlmIChkZWxpdmVyKQorCQlrdm1wcGNfaW5qZWN0X2ludGVycnVwdCh2Y3B1LCB2ZWMsIDBVTEwpOworCisJcmV0dXJuIGRlbGl2ZXI7Cit9CisKK3ZvaWQga3ZtcHBjX2NvcmVfZGVsaXZlcl9pbnRlcnJ1cHRzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl1bnNpZ25lZCBsb25nICpwZW5kaW5nID0gJnZjcHUtPmFyY2gucGVuZGluZ19leGNlcHRpb25zOworCXVuc2lnbmVkIGludCBwcmlvcml0eTsKKworCS8qIFhYWCBiZSBtb3JlIGNsZXZlciBoZXJlIC0gbm8gbmVlZCB0byBtZnRiKCkgb24gZXZlcnkgZW50cnkgKi8KKwkvKiBJc3N1ZSBERUMgYWdhaW4gaWYgaXQncyBzdGlsbCBhY3RpdmUgKi8KKyNpZmRlZiBBR0dSRVNTSVZFX0RFQworCWlmICh2Y3B1LT5hcmNoLm1zciAmIE1TUl9FRSkKKwkJaWYgKGt2bXBwY19nZXRfZGVjKHZjcHUpICYgMHg4MDAwMDAwMCkKKwkJCWt2bXBwY19jb3JlX3F1ZXVlX2RlYyh2Y3B1KTsKKyNlbmRpZgorCisjaWZkZWYgRVhJVF9ERUJVRworCWlmICh2Y3B1LT5hcmNoLnBlbmRpbmdfZXhjZXB0aW9ucykKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIktWTTogQ2hlY2sgcGVuZGluZzogJWx4XG4iLCB2Y3B1LT5hcmNoLnBlbmRpbmdfZXhjZXB0aW9ucyk7CisjZW5kaWYKKwlwcmlvcml0eSA9IF9fZmZzKCpwZW5kaW5nKTsKKwl3aGlsZSAocHJpb3JpdHkgPD0gKHNpemVvZih1bnNpZ25lZCBpbnQpICogOCkpIHsKKwkJaWYgKGt2bXBwY19ib29rM3NfaXJxcHJpb19kZWxpdmVyKHZjcHUsIHByaW9yaXR5KSkgeworCQkJY2xlYXJfYml0KHByaW9yaXR5LCAmdmNwdS0+YXJjaC5wZW5kaW5nX2V4Y2VwdGlvbnMpOworCQkJYnJlYWs7CisJCX0KKworCQlwcmlvcml0eSA9IGZpbmRfbmV4dF9iaXQocGVuZGluZywKKwkJCQkJIEJJVFNfUEVSX0JZVEUgKiBzaXplb2YoKnBlbmRpbmcpLAorCQkJCQkgcHJpb3JpdHkgKyAxKTsKKwl9Cit9CisKK3ZvaWQga3ZtcHBjX3NldF9wdnIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1MzIgcHZyKQoreworCXZjcHUtPmFyY2guaGZsYWdzICY9IH5CT09LM1NfSEZMQUdfU0xCOworCXZjcHUtPmFyY2gucHZyID0gcHZyOworCWlmICgocHZyID49IDB4MzMwMDAwKSAmJiAocHZyIDwgMHg3MDMzMDAwMCkpIHsKKwkJa3ZtcHBjX21tdV9ib29rM3NfNjRfaW5pdCh2Y3B1KTsKKwkJdG9fYm9vazNzKHZjcHUpLT5oaW9yID0gMHhmZmYwMDAwMDsKKwkJdG9fYm9vazNzKHZjcHUpLT5tc3JfbWFzayA9IDB4ZmZmZmZmZmZmZmZmZmZmZlVMTDsKKwl9IGVsc2UgeworCQlrdm1wcGNfbW11X2Jvb2szc18zMl9pbml0KHZjcHUpOworCQl0b19ib29rM3ModmNwdSktPmhpb3IgPSAwOworCQl0b19ib29rM3ModmNwdSktPm1zcl9tYXNrID0gMHhmZmZmZmZmZlVMTDsKKwl9CisKKwkvKiBJZiB3ZSBhcmUgaW4gaHlwZXJ2aXNvciBsZXZlbCBvbiA5NzAsIHdlIGNhbiB0ZWxsIHRoZSBDUFUgdG8KKwkgKiB0cmVhdCBEQ0JaIGFzIDMyIGJ5dGVzIHN0b3JlICovCisJdmNwdS0+YXJjaC5oZmxhZ3MgJj0gfkJPT0szU19IRkxBR19EQ0JaMzI7CisJaWYgKHZjcHUtPmFyY2gubW11LmlzX2RjYnozMih2Y3B1KSAmJiAobWZtc3IoKSAmIE1TUl9IVikgJiYKKwkgICAgIXN0cmNtcChjdXJfY3B1X3NwZWMtPnBsYXRmb3JtLCAicHBjOTcwIikpCisJCXZjcHUtPmFyY2guaGZsYWdzIHw9IEJPT0szU19IRkxBR19EQ0JaMzI7CisKK30KKworLyogQm9vazNzXzMyIENQVXMgYWx3YXlzIGhhdmUgMzIgYnl0ZXMgY2FjaGUgbGluZSBzaXplLCB3aGljaCBMaW51eCBhc3N1bWVzLiBUbworICogbWFrZSBCb29rM3NfMzIgTGludXggd29yayBvbiBCb29rM3NfNjQsIHdlIGhhdmUgdG8gbWFrZSBzdXJlIHdlIHRyYXAgZGNieiB0bworICogZW11bGF0ZSAzMiBieXRlcyBkY2J6IGxlbmd0aC4KKyAqCisgKiBUaGUgQm9vazNzXzY0IGludmVudG9ycyBhbHNvIHJlYWxpemVkIHRoaXMgY2FzZSBhbmQgaW1wbGVtZW50ZWQgYSBzcGVjaWFsIGJpdAorICogaW4gdGhlIEhJRDUgcmVnaXN0ZXIsIHdoaWNoIGlzIGEgaHlwZXJ2aXNvciByZXNzb3VyY2UuIFRodXMgd2UgY2FuJ3QgdXNlIGl0LgorICoKKyAqIE15IGFwcHJvYWNoIGhlcmUgaXMgdG8gcGF0Y2ggdGhlIGRjYnogaW5zdHJ1Y3Rpb24gb24gZXhlY3V0aW5nIHBhZ2VzLgorICovCitzdGF0aWMgdm9pZCBrdm1wcGNfcGF0Y2hfZGNieihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1wcGNfcHRlICpwdGUpCit7CisJYm9vbCB0b3VjaGVkID0gZmFsc2U7CisJaHZhX3QgaHBhZ2U7CisJdTMyICpwYWdlOworCWludCBpOworCisJaHBhZ2UgPSBnZm5fdG9faHZhKHZjcHUtPmt2bSwgcHRlLT5yYWRkciA+PiBQQUdFX1NISUZUKTsKKwlpZiAoa3ZtX2lzX2Vycm9yX2h2YShocGFnZSkpCisJCXJldHVybjsKKworCWhwYWdlIHw9IHB0ZS0+cmFkZHIgJiB+UEFHRV9NQVNLOworCWhwYWdlICY9IH4weEZGRlVMTDsKKworCXBhZ2UgPSB2bWFsbG9jKEhXX1BBR0VfU0laRSk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIocGFnZSwgKHZvaWQgX191c2VyICopaHBhZ2UsIEhXX1BBR0VfU0laRSkpCisJCWdvdG8gb3V0OworCisJZm9yIChpPTA7IGkgPCBIV19QQUdFX1NJWkUgLyA0OyBpKyspCisJCWlmICgocGFnZVtpXSAmIDB4ZmYwMDA3ZmYpID09IElOU19EQ0JaKSB7CisJCQlwYWdlW2ldICY9IDB4ZmZmZmZmZjc7IC8vIHJlc2VydmVkIGluc3RydWN0aW9uLCBzbyB3ZSB0cmFwCisJCQl0b3VjaGVkID0gdHJ1ZTsKKwkJfQorCisJaWYgKHRvdWNoZWQpCisJCWNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilocGFnZSwgcGFnZSwgSFdfUEFHRV9TSVpFKTsKKworb3V0OgorCXZmcmVlKHBhZ2UpOworfQorCitzdGF0aWMgaW50IGt2bXBwY194bGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVsb25nIGVhZGRyLCBib29sIGRhdGEsCisJCQkgc3RydWN0IGt2bXBwY19wdGUgKnB0ZSkKK3sKKwlpbnQgcmVsb2NhdGVkID0gKHZjcHUtPmFyY2gubXNyICYgKGRhdGEgPyBNU1JfRFIgOiBNU1JfSVIpKTsKKwlpbnQgcjsKKworCWlmIChyZWxvY2F0ZWQpIHsKKwkJciA9IHZjcHUtPmFyY2gubW11LnhsYXRlKHZjcHUsIGVhZGRyLCBwdGUsIGRhdGEpOworCX0gZWxzZSB7CisJCXB0ZS0+ZWFkZHIgPSBlYWRkcjsKKwkJcHRlLT5yYWRkciA9IGVhZGRyICYgMHhmZmZmZmZmZjsKKwkJcHRlLT52cGFnZSA9IGVhZGRyID4+IDEyOworCQlzd2l0Y2ggKHZjcHUtPmFyY2gubXNyICYgKE1TUl9EUnxNU1JfSVIpKSB7CisJCWNhc2UgMDoKKwkJCXB0ZS0+dnBhZ2UgfD0gVlNJRF9SRUFMOworCQljYXNlIE1TUl9EUjoKKwkJCXB0ZS0+dnBhZ2UgfD0gVlNJRF9SRUFMX0RSOworCQljYXNlIE1TUl9JUjoKKwkJCXB0ZS0+dnBhZ2UgfD0gVlNJRF9SRUFMX0lSOworCQl9CisJCXB0ZS0+bWF5X3JlYWQgPSB0cnVlOworCQlwdGUtPm1heV93cml0ZSA9IHRydWU7CisJCXB0ZS0+bWF5X2V4ZWN1dGUgPSB0cnVlOworCQlyID0gMDsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGh2YV90IGt2bXBwY19iYWRfaHZhKHZvaWQpCit7CisJcmV0dXJuIFBBR0VfT0ZGU0VUOworfQorCitzdGF0aWMgaHZhX3Qga3ZtcHBjX3B0ZV90b19odmEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtcHBjX3B0ZSAqcHRlLAorCQkJICAgICAgIGJvb2wgcmVhZCkKK3sKKwlodmFfdCBocGFnZTsKKworCWlmIChyZWFkICYmICFwdGUtPm1heV9yZWFkKQorCQlnb3RvIGVycjsKKworCWlmICghcmVhZCAmJiAhcHRlLT5tYXlfd3JpdGUpCisJCWdvdG8gZXJyOworCisJaHBhZ2UgPSBnZm5fdG9faHZhKHZjcHUtPmt2bSwgcHRlLT5yYWRkciA+PiBQQUdFX1NISUZUKTsKKwlpZiAoa3ZtX2lzX2Vycm9yX2h2YShocGFnZSkpCisJCWdvdG8gZXJyOworCisJcmV0dXJuIGhwYWdlIHwgKHB0ZS0+cmFkZHIgJiB+UEFHRV9NQVNLKTsKK2VycjoKKwlyZXR1cm4ga3ZtcHBjX2JhZF9odmEoKTsKK30KKworaW50IGt2bXBwY19zdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVsb25nIGVhZGRyLCBpbnQgc2l6ZSwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBrdm1wcGNfcHRlIHB0ZTsKKwlodmFfdCBodmEgPSBlYWRkcjsKKworCXZjcHUtPnN0YXQuc3QrKzsKKworCWlmIChrdm1wcGNfeGxhdGUodmNwdSwgZWFkZHIsIGZhbHNlLCAmcHRlKSkKKwkJZ290byBlcnI7CisKKwlodmEgPSBrdm1wcGNfcHRlX3RvX2h2YSh2Y3B1LCAmcHRlLCBmYWxzZSk7CisJaWYgKGt2bV9pc19lcnJvcl9odmEoaHZhKSkKKwkJZ290byBlcnI7CisKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWh2YSwgcHRyLCBzaXplKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJrdm1wcGNfc3QgYXQgMHglbHggZmFpbGVkXG4iLCBodmEpOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyOgorCXJldHVybiAtRU5PRU5UOworfQorCitpbnQga3ZtcHBjX2xkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdWxvbmcgZWFkZHIsIGludCBzaXplLCB2b2lkICpwdHIsCisJCSAgICAgIGJvb2wgZGF0YSkKK3sKKwlzdHJ1Y3Qga3ZtcHBjX3B0ZSBwdGU7CisJaHZhX3QgaHZhID0gZWFkZHI7CisKKwl2Y3B1LT5zdGF0LmxkKys7CisKKwlpZiAoa3ZtcHBjX3hsYXRlKHZjcHUsIGVhZGRyLCBkYXRhLCAmcHRlKSkKKwkJZ290byBlcnI7CisKKwlodmEgPSBrdm1wcGNfcHRlX3RvX2h2YSh2Y3B1LCAmcHRlLCB0cnVlKTsKKwlpZiAoa3ZtX2lzX2Vycm9yX2h2YShodmEpKQorCQlnb3RvIGVycjsKKworCWlmIChjb3B5X2Zyb21fdXNlcihwdHIsICh2b2lkIF9fdXNlciAqKWh2YSwgc2l6ZSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAia3ZtcHBjX2xkIGF0IDB4JWx4IGZhaWxlZFxuIiwgaHZhKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0dXJuIDA7CisKK2VycjoKKwlyZXR1cm4gLUVOT0VOVDsKK30KKworc3RhdGljIGludCBrdm1wcGNfdmlzaWJsZV9nZm4oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBnZm5fdCBnZm4pCit7CisJcmV0dXJuIGt2bV9pc192aXNpYmxlX2dmbih2Y3B1LT5rdm0sIGdmbik7Cit9CisKK2ludCBrdm1wcGNfaGFuZGxlX3BhZ2VmYXVsdChzdHJ1Y3Qga3ZtX3J1biAqcnVuLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQkgICAgdWxvbmcgZWFkZHIsIGludCB2ZWMpCit7CisJYm9vbCBkYXRhID0gKHZlYyA9PSBCT09LM1NfSU5URVJSVVBUX0RBVEFfU1RPUkFHRSk7CisJaW50IHIgPSBSRVNVTUVfR1VFU1Q7CisJaW50IHJlbG9jYXRlZDsKKwlpbnQgcGFnZV9mb3VuZCA9IDA7CisJc3RydWN0IGt2bXBwY19wdGUgcHRlOworCWJvb2wgaXNfbW1pbyA9IGZhbHNlOworCisJaWYgKCB2ZWMgPT0gQk9PSzNTX0lOVEVSUlVQVF9EQVRBX1NUT1JBR0UgKSB7CisJCXJlbG9jYXRlZCA9ICh2Y3B1LT5hcmNoLm1zciAmIE1TUl9EUik7CisJfSBlbHNlIHsKKwkJcmVsb2NhdGVkID0gKHZjcHUtPmFyY2gubXNyICYgTVNSX0lSKTsKKwl9CisKKwkvKiBSZXNvbHZlIHJlYWwgYWRkcmVzcyBpZiB0cmFuc2xhdGlvbiB0dXJuZWQgb24gKi8KKwlpZiAocmVsb2NhdGVkKSB7CisJCXBhZ2VfZm91bmQgPSB2Y3B1LT5hcmNoLm1tdS54bGF0ZSh2Y3B1LCBlYWRkciwgJnB0ZSwgZGF0YSk7CisJfSBlbHNlIHsKKwkJcHRlLm1heV9leGVjdXRlID0gdHJ1ZTsKKwkJcHRlLm1heV9yZWFkID0gdHJ1ZTsKKwkJcHRlLm1heV93cml0ZSA9IHRydWU7CisJCXB0ZS5yYWRkciA9IGVhZGRyICYgMHhmZmZmZmZmZjsKKwkJcHRlLmVhZGRyID0gZWFkZHI7CisJCXB0ZS52cGFnZSA9IGVhZGRyID4+IDEyOworCQlzd2l0Y2ggKHZjcHUtPmFyY2gubXNyICYgKE1TUl9EUnxNU1JfSVIpKSB7CisJCWNhc2UgMDoKKwkJCXB0ZS52cGFnZSB8PSBWU0lEX1JFQUw7CisJCWNhc2UgTVNSX0RSOgorCQkJcHRlLnZwYWdlIHw9IFZTSURfUkVBTF9EUjsKKwkJY2FzZSBNU1JfSVI6CisJCQlwdGUudnBhZ2UgfD0gVlNJRF9SRUFMX0lSOworCQl9CisJfQorCisJaWYgKHZjcHUtPmFyY2gubW11LmlzX2RjYnozMih2Y3B1KSAmJgorCSAgICghKHZjcHUtPmFyY2guaGZsYWdzICYgQk9PSzNTX0hGTEFHX0RDQlozMikpKSB7CisJCS8qCisJCSAqIElmIHdlIGRvIHRoZSBkY2J6IGhhY2ssIHdlIGhhdmUgdG8gTlggb24gZXZlcnkgZXhlY3V0aW9uLAorCQkgKiBzbyB3ZSBjYW4gcGF0Y2ggdGhlIGV4ZWN1dGluZyBjb2RlLiBUaGlzIHJlbmRlcnMgb3VyIGd1ZXN0CisJCSAqIE5YLWxlc3MuCisJCSAqLworCQlwdGUubWF5X2V4ZWN1dGUgPSAhZGF0YTsKKwl9CisKKwlpZiAocGFnZV9mb3VuZCA9PSAtRU5PRU5UKSB7CisJCS8qIFBhZ2Ugbm90IGZvdW5kIGluIGd1ZXN0IFBURSBlbnRyaWVzICovCisJCXZjcHUtPmFyY2guZGVhciA9IHZjcHUtPmFyY2guZmF1bHRfZGVhcjsKKwkJdG9fYm9vazNzKHZjcHUpLT5kc2lzciA9IHZjcHUtPmFyY2guZmF1bHRfZHNpc3I7CisJCXZjcHUtPmFyY2gubXNyIHw9ICh2Y3B1LT5hcmNoLnNoYWRvd19tc3IgJiAweDAwMDAwMDAwZjgwMDAwMDBVTEwpOworCQlrdm1wcGNfYm9vazNzX3F1ZXVlX2lycXByaW8odmNwdSwgdmVjKTsKKwl9IGVsc2UgaWYgKHBhZ2VfZm91bmQgPT0gLUVQRVJNKSB7CisJCS8qIFN0b3JhZ2UgcHJvdGVjdGlvbiAqLworCQl2Y3B1LT5hcmNoLmRlYXIgPSB2Y3B1LT5hcmNoLmZhdWx0X2RlYXI7CisJCXRvX2Jvb2szcyh2Y3B1KS0+ZHNpc3IgPSB2Y3B1LT5hcmNoLmZhdWx0X2RzaXNyICYgfkRTSVNSX05PSFBURTsKKwkJdG9fYm9vazNzKHZjcHUpLT5kc2lzciB8PSBEU0lTUl9QUk9URkFVTFQ7CisJCXZjcHUtPmFyY2gubXNyIHw9ICh2Y3B1LT5hcmNoLnNoYWRvd19tc3IgJiAweDAwMDAwMDAwZjgwMDAwMDBVTEwpOworCQlrdm1wcGNfYm9vazNzX3F1ZXVlX2lycXByaW8odmNwdSwgdmVjKTsKKwl9IGVsc2UgaWYgKHBhZ2VfZm91bmQgPT0gLUVJTlZBTCkgeworCQkvKiBQYWdlIG5vdCBmb3VuZCBpbiBndWVzdCBTTEIgKi8KKwkJdmNwdS0+YXJjaC5kZWFyID0gdmNwdS0+YXJjaC5mYXVsdF9kZWFyOworCQlrdm1wcGNfYm9vazNzX3F1ZXVlX2lycXByaW8odmNwdSwgdmVjICsgMHg4MCk7CisJfSBlbHNlIGlmICghaXNfbW1pbyAmJgorCQkgICBrdm1wcGNfdmlzaWJsZV9nZm4odmNwdSwgcHRlLnJhZGRyID4+IFBBR0VfU0hJRlQpKSB7CisJCS8qIFRoZSBndWVzdCdzIFBURSBpcyBub3QgbWFwcGVkIHlldC4gTWFwIG9uIHRoZSBob3N0ICovCisJCWt2bXBwY19tbXVfbWFwX3BhZ2UodmNwdSwgJnB0ZSk7CisJCWlmIChkYXRhKQorCQkJdmNwdS0+c3RhdC5zcF9zdG9yYWdlKys7CisJCWVsc2UgaWYgKHZjcHUtPmFyY2gubW11LmlzX2RjYnozMih2Y3B1KSAmJgorCQkJKCEodmNwdS0+YXJjaC5oZmxhZ3MgJiBCT09LM1NfSEZMQUdfRENCWjMyKSkpCisJCQlrdm1wcGNfcGF0Y2hfZGNieih2Y3B1LCAmcHRlKTsKKwl9IGVsc2UgeworCQkvKiBNTUlPICovCisJCXZjcHUtPnN0YXQubW1pb19leGl0cysrOworCQl2Y3B1LT5hcmNoLnBhZGRyX2FjY2Vzc2VkID0gcHRlLnJhZGRyOworCQlyID0ga3ZtcHBjX2VtdWxhdGVfbW1pbyhydW4sIHZjcHUpOworCQlpZiAoIHIgPT0gUkVTVU1FX0hPU1RfTlYgKQorCQkJciA9IFJFU1VNRV9IT1NUOworCQlpZiAoIHIgPT0gUkVTVU1FX0dVRVNUX05WICkKKwkJCXIgPSBSRVNVTUVfR1VFU1Q7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK2ludCBrdm1wcGNfaGFuZGxlX2V4aXQoc3RydWN0IGt2bV9ydW4gKnJ1biwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZXhpdF9ucikKK3sKKwlpbnQgciA9IFJFU1VNRV9IT1NUOworCisJdmNwdS0+c3RhdC5zdW1fZXhpdHMrKzsKKworCXJ1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9VTktOT1dOOworCXJ1bi0+cmVhZHlfZm9yX2ludGVycnVwdF9pbmplY3Rpb24gPSAxOworI2lmZGVmIEVYSVRfREVCVUcKKwlwcmludGsoS0VSTl9FTUVSRyAiZXhpdF9ucj0weCV4IHwgcGM9MHglbHggfCBkYXI9MHglbHggfCBkZWM9MHgleCB8IG1zcj0weCVseFxuIiwKKwkJZXhpdF9uciwgdmNwdS0+YXJjaC5wYywgdmNwdS0+YXJjaC5mYXVsdF9kZWFyLAorCQlrdm1wcGNfZ2V0X2RlYyh2Y3B1KSwgdmNwdS0+YXJjaC5tc3IpOworI2VsaWYgZGVmaW5lZCAoRVhJVF9ERUJVR19TSU1QTEUpCisJaWYgKChleGl0X25yICE9IDB4OTAwKSAmJiAoZXhpdF9uciAhPSAweDUwMCkpCisJCXByaW50ayhLRVJOX0VNRVJHICJleGl0X25yPTB4JXggfCBwYz0weCVseCB8IGRhcj0weCVseCB8IG1zcj0weCVseFxuIiwKKwkJCWV4aXRfbnIsIHZjcHUtPmFyY2gucGMsIHZjcHUtPmFyY2guZmF1bHRfZGVhciwKKwkJCXZjcHUtPmFyY2gubXNyKTsKKyNlbmRpZgorCWt2bV9yZXNjaGVkKHZjcHUpOworCXN3aXRjaCAoZXhpdF9ucikgeworCWNhc2UgQk9PSzNTX0lOVEVSUlVQVF9JTlNUX1NUT1JBR0U6CisJCXZjcHUtPnN0YXQucGZfaW5zdHJ1YysrOworCQkvKiBvbmx5IGNhcmUgYWJvdXQgUFRFRyBub3QgZm91bmQgZXJyb3JzLCBidXQgbGVhdmUgTlggYWxvbmUgKi8KKwkJaWYgKHZjcHUtPmFyY2guc2hhZG93X21zciAmIDB4NDAwMDAwMDApIHsKKwkJCXIgPSBrdm1wcGNfaGFuZGxlX3BhZ2VmYXVsdChydW4sIHZjcHUsIHZjcHUtPmFyY2gucGMsIGV4aXRfbnIpOworCQkJdmNwdS0+c3RhdC5zcF9pbnN0cnVjKys7CisJCX0gZWxzZSBpZiAodmNwdS0+YXJjaC5tbXUuaXNfZGNiejMyKHZjcHUpICYmCisJCQkgICghKHZjcHUtPmFyY2guaGZsYWdzICYgQk9PSzNTX0hGTEFHX0RDQlozMikpKSB7CisJCQkvKgorCQkJICogWFhYIElmIHdlIGRvIHRoZSBkY2J6IGhhY2sgd2UgdXNlIHRoZSBOWCBiaXQgdG8gZmx1c2gmcGF0Y2ggdGhlIHBhZ2UsCisJCQkgKiAgICAgc28gd2UgY2FuJ3QgdXNlIHRoZSBOWCBiaXQgaW5zaWRlIHRoZSBndWVzdC4gTGV0J3MgY3Jvc3Mgb3VyIGZpbmdlcnMsCisJCQkgKiAgICAgdGhhdCBubyBndWVzdCB0aGF0IG5lZWRzIHRoZSBkY2J6IGhhY2sgZG9lcyBOWC4KKwkJCSAqLworCQkJa3ZtcHBjX21tdV9wdGVfZmx1c2godmNwdSwgdmNwdS0+YXJjaC5wYywgfjB4RkZGVUxMKTsKKwkJfSBlbHNlIHsKKwkJCXZjcHUtPmFyY2gubXNyIHw9ICh2Y3B1LT5hcmNoLnNoYWRvd19tc3IgJiAweDU4MDAwMDAwKTsKKwkJCWt2bXBwY19ib29rM3NfcXVldWVfaXJxcHJpbyh2Y3B1LCBleGl0X25yKTsKKwkJCWt2bXBwY19tbXVfcHRlX2ZsdXNoKHZjcHUsIHZjcHUtPmFyY2gucGMsIH4weEZGRlVMTCk7CisJCQlyID0gUkVTVU1FX0dVRVNUOworCQl9CisJCWJyZWFrOworCWNhc2UgQk9PSzNTX0lOVEVSUlVQVF9EQVRBX1NUT1JBR0U6CisJCXZjcHUtPnN0YXQucGZfc3RvcmFnZSsrOworCQkvKiBUaGUgb25seSBjYXNlIHdlIG5lZWQgdG8gaGFuZGxlIGlzIG1pc3Npbmcgc2hhZG93IFBURXMgKi8KKwkJaWYgKHZjcHUtPmFyY2guZmF1bHRfZHNpc3IgJiBEU0lTUl9OT0hQVEUpIHsKKwkJCXIgPSBrdm1wcGNfaGFuZGxlX3BhZ2VmYXVsdChydW4sIHZjcHUsIHZjcHUtPmFyY2guZmF1bHRfZGVhciwgZXhpdF9ucik7CisJCX0gZWxzZSB7CisJCQl2Y3B1LT5hcmNoLmRlYXIgPSB2Y3B1LT5hcmNoLmZhdWx0X2RlYXI7CisJCQl0b19ib29rM3ModmNwdSktPmRzaXNyID0gdmNwdS0+YXJjaC5mYXVsdF9kc2lzcjsKKwkJCWt2bXBwY19ib29rM3NfcXVldWVfaXJxcHJpbyh2Y3B1LCBleGl0X25yKTsKKwkJCWt2bXBwY19tbXVfcHRlX2ZsdXNoKHZjcHUsIHZjcHUtPmFyY2guZGVhciwgfjB4RkZGVUxMKTsKKwkJCXIgPSBSRVNVTUVfR1VFU1Q7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCT09LM1NfSU5URVJSVVBUX0RBVEFfU0VHTUVOVDoKKwkJaWYgKGt2bXBwY19tbXVfbWFwX3NlZ21lbnQodmNwdSwgdmNwdS0+YXJjaC5mYXVsdF9kZWFyKSA8IDApIHsKKwkJCXZjcHUtPmFyY2guZGVhciA9IHZjcHUtPmFyY2guZmF1bHRfZGVhcjsKKwkJCWt2bXBwY19ib29rM3NfcXVldWVfaXJxcHJpbyh2Y3B1LAorCQkJCUJPT0szU19JTlRFUlJVUFRfREFUQV9TRUdNRU5UKTsKKwkJfQorCQlyID0gUkVTVU1FX0dVRVNUOworCQlicmVhazsKKwljYXNlIEJPT0szU19JTlRFUlJVUFRfSU5TVF9TRUdNRU5UOgorCQlpZiAoa3ZtcHBjX21tdV9tYXBfc2VnbWVudCh2Y3B1LCB2Y3B1LT5hcmNoLnBjKSA8IDApIHsKKwkJCWt2bXBwY19ib29rM3NfcXVldWVfaXJxcHJpbyh2Y3B1LAorCQkJCUJPT0szU19JTlRFUlJVUFRfSU5TVF9TRUdNRU5UKTsKKwkJfQorCQlyID0gUkVTVU1FX0dVRVNUOworCQlicmVhazsKKwkvKiBXZSdyZSBnb29kIG9uIHRoZXNlIC0gdGhlIGhvc3QgbWVyZWx5IHdhbnRlZCB0byBnZXQgb3VyIGF0dGVudGlvbiAqLworCWNhc2UgQk9PSzNTX0lOVEVSUlVQVF9ERUNSRU1FTlRFUjoKKwkJdmNwdS0+c3RhdC5kZWNfZXhpdHMrKzsKKwkJciA9IFJFU1VNRV9HVUVTVDsKKwkJYnJlYWs7CisJY2FzZSBCT09LM1NfSU5URVJSVVBUX0VYVEVSTkFMOgorCQl2Y3B1LT5zdGF0LmV4dF9pbnRyX2V4aXRzKys7CisJCXIgPSBSRVNVTUVfR1VFU1Q7CisJCWJyZWFrOworCWNhc2UgQk9PSzNTX0lOVEVSUlVQVF9QUk9HUkFNOgorCXsKKwkJZW51bSBlbXVsYXRpb25fcmVzdWx0IGVyOworCisJCWlmICh2Y3B1LT5hcmNoLm1zciAmIE1TUl9QUikgeworI2lmZGVmIEVYSVRfREVCVUcKKwkJCXByaW50ayhLRVJOX0lORk8gIlVzZXJzcGFjZSB0cmlnZ2VyZWQgMHg3MDAgZXhjZXB0aW9uIGF0IDB4JWx4ICgweCV4KVxuIiwgdmNwdS0+YXJjaC5wYywgdmNwdS0+YXJjaC5sYXN0X2luc3QpOworI2VuZGlmCisJCQlpZiAoKHZjcHUtPmFyY2gubGFzdF9pbnN0ICYgMHhmZjAwMDdmZikgIT0KKwkJCSAgICAoSU5TX0RDQlogJiAweGZmZmZmZmY3KSkgeworCQkJCWt2bXBwY19ib29rM3NfcXVldWVfaXJxcHJpbyh2Y3B1LCBleGl0X25yKTsKKwkJCQlyID0gUkVTVU1FX0dVRVNUOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJdmNwdS0+c3RhdC5lbXVsYXRlZF9pbnN0X2V4aXRzKys7CisJCWVyID0ga3ZtcHBjX2VtdWxhdGVfaW5zdHJ1Y3Rpb24ocnVuLCB2Y3B1KTsKKwkJc3dpdGNoIChlcikgeworCQljYXNlIEVNVUxBVEVfRE9ORToKKwkJCXIgPSBSRVNVTUVfR1VFU1Q7CisJCQlicmVhazsKKwkJY2FzZSBFTVVMQVRFX0ZBSUw6CisJCQlwcmludGsoS0VSTl9DUklUICIlczogZW11bGF0aW9uIGF0ICVseCBmYWlsZWQgKCUwOHgpXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCB2Y3B1LT5hcmNoLnBjLCB2Y3B1LT5hcmNoLmxhc3RfaW5zdCk7CisJCQlrdm1wcGNfYm9vazNzX3F1ZXVlX2lycXByaW8odmNwdSwgZXhpdF9ucik7CisJCQlyID0gUkVTVU1FX0dVRVNUOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBCT09LM1NfSU5URVJSVVBUX1NZU0NBTEw6CisjaWZkZWYgRVhJVF9ERUJVRworCQlwcmludGsoS0VSTl9JTkZPICJTeXNjYWxsIE5yICVkXG4iLCAoaW50KXZjcHUtPmFyY2guZ3ByWzBdKTsKKyNlbmRpZgorCQl2Y3B1LT5zdGF0LnN5c2NhbGxfZXhpdHMrKzsKKwkJa3ZtcHBjX2Jvb2szc19xdWV1ZV9pcnFwcmlvKHZjcHUsIGV4aXRfbnIpOworCQlyID0gUkVTVU1FX0dVRVNUOworCQlicmVhazsKKwljYXNlIEJPT0szU19JTlRFUlJVUFRfTUFDSElORV9DSEVDSzoKKwljYXNlIEJPT0szU19JTlRFUlJVUFRfRlBfVU5BVkFJTDoKKwljYXNlIEJPT0szU19JTlRFUlJVUFRfVFJBQ0U6CisJY2FzZSBCT09LM1NfSU5URVJSVVBUX0FMVElWRUM6CisJY2FzZSBCT09LM1NfSU5URVJSVVBUX1ZTWDoKKwkJa3ZtcHBjX2Jvb2szc19xdWV1ZV9pcnFwcmlvKHZjcHUsIGV4aXRfbnIpOworCQlyID0gUkVTVU1FX0dVRVNUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBVZ2ggLSBib3JrIGhlcmUhIFdoYXQgZGlkIHdlIGdldD8gKi8KKwkJcHJpbnRrKEtFUk5fRU1FUkcgImV4aXRfbnI9MHgleCB8IHBjPTB4JWx4IHwgbXNyPTB4JWx4XG4iLCBleGl0X25yLCB2Y3B1LT5hcmNoLnBjLCB2Y3B1LT5hcmNoLnNoYWRvd19tc3IpOworCQlyID0gUkVTVU1FX0hPU1Q7CisJCUJVRygpOworCQlicmVhazsKKwl9CisKKworCWlmICghKHIgJiBSRVNVTUVfSE9TVCkpIHsKKwkJLyogVG8gYXZvaWQgY2xvYmJlcmluZyBleGl0X3JlYXNvbiwgb25seSBjaGVjayBmb3Igc2lnbmFscyBpZgorCQkgKiB3ZSBhcmVuJ3QgYWxyZWFkeSBleGl0aW5nIHRvIHVzZXJzcGFjZSBmb3Igc29tZSBvdGhlcgorCQkgKiByZWFzb24uICovCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworI2lmZGVmIEVYSVRfREVCVUcKKwkJCXByaW50ayhLRVJOX0VNRVJHICJLVk06IEdvaW5nIGJhY2sgdG8gaG9zdFxuIik7CisjZW5kaWYKKwkJCXZjcHUtPnN0YXQuc2lnbmFsX2V4aXRzKys7CisJCQlydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfSU5UUjsKKwkJCXIgPSAtRUlOVFI7CisJCX0gZWxzZSB7CisJCQkvKiBJbiBjYXNlIGFuIGludGVycnVwdCBjYW1lIGluIHRoYXQgd2FzIHRyaWdnZXJlZAorCQkJICogZnJvbSB1c2Vyc3BhY2UgKGxpa2UgREVDKSwgd2UgbmVlZCB0byBjaGVjayB3aGF0CisJCQkgKiB0byBpbmplY3Qgbm93ISAqLworCQkJa3ZtcHBjX2NvcmVfZGVsaXZlcl9pbnRlcnJ1cHRzKHZjcHUpOworCQl9CisJfQorCisjaWZkZWYgRVhJVF9ERUJVRworCXByaW50ayhLRVJOX0VNRVJHICJLVk0gZXhpdDogdmNwdT0weCVwIHBjPTB4JWx4IHI9MHgleFxuIiwgdmNwdSwgdmNwdS0+YXJjaC5wYywgcik7CisjZW5kaWYKKworCXJldHVybiByOworfQorCitpbnQga3ZtX2FyY2hfdmNwdV9zZXR1cChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCBrdm1fYXJjaF92Y3B1X2lvY3RsX2dldF9yZWdzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9yZWdzICpyZWdzKQoreworCWludCBpOworCisJcmVncy0+cGMgPSB2Y3B1LT5hcmNoLnBjOworCXJlZ3MtPmNyID0gdmNwdS0+YXJjaC5jcjsKKwlyZWdzLT5jdHIgPSB2Y3B1LT5hcmNoLmN0cjsKKwlyZWdzLT5sciA9IHZjcHUtPmFyY2gubHI7CisJcmVncy0+eGVyID0gdmNwdS0+YXJjaC54ZXI7CisJcmVncy0+bXNyID0gdmNwdS0+YXJjaC5tc3I7CisJcmVncy0+c3JyMCA9IHZjcHUtPmFyY2guc3JyMDsKKwlyZWdzLT5zcnIxID0gdmNwdS0+YXJjaC5zcnIxOworCXJlZ3MtPnBpZCA9IHZjcHUtPmFyY2gucGlkOworCXJlZ3MtPnNwcmcwID0gdmNwdS0+YXJjaC5zcHJnMDsKKwlyZWdzLT5zcHJnMSA9IHZjcHUtPmFyY2guc3ByZzE7CisJcmVncy0+c3ByZzIgPSB2Y3B1LT5hcmNoLnNwcmcyOworCXJlZ3MtPnNwcmczID0gdmNwdS0+YXJjaC5zcHJnMzsKKwlyZWdzLT5zcHJnNSA9IHZjcHUtPmFyY2guc3ByZzQ7CisJcmVncy0+c3ByZzYgPSB2Y3B1LT5hcmNoLnNwcmc1OworCXJlZ3MtPnNwcmc3ID0gdmNwdS0+YXJjaC5zcHJnNjsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJlZ3MtPmdwcik7IGkrKykKKwkJcmVncy0+Z3ByW2ldID0gdmNwdS0+YXJjaC5ncHJbaV07CisKKwlyZXR1cm4gMDsKK30KKworaW50IGt2bV9hcmNoX3ZjcHVfaW9jdGxfc2V0X3JlZ3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3JlZ3MgKnJlZ3MpCit7CisJaW50IGk7CisKKwl2Y3B1LT5hcmNoLnBjID0gcmVncy0+cGM7CisJdmNwdS0+YXJjaC5jciA9IHJlZ3MtPmNyOworCXZjcHUtPmFyY2guY3RyID0gcmVncy0+Y3RyOworCXZjcHUtPmFyY2gubHIgPSByZWdzLT5scjsKKwl2Y3B1LT5hcmNoLnhlciA9IHJlZ3MtPnhlcjsKKwlrdm1wcGNfc2V0X21zcih2Y3B1LCByZWdzLT5tc3IpOworCXZjcHUtPmFyY2guc3JyMCA9IHJlZ3MtPnNycjA7CisJdmNwdS0+YXJjaC5zcnIxID0gcmVncy0+c3JyMTsKKwl2Y3B1LT5hcmNoLnNwcmcwID0gcmVncy0+c3ByZzA7CisJdmNwdS0+YXJjaC5zcHJnMSA9IHJlZ3MtPnNwcmcxOworCXZjcHUtPmFyY2guc3ByZzIgPSByZWdzLT5zcHJnMjsKKwl2Y3B1LT5hcmNoLnNwcmczID0gcmVncy0+c3ByZzM7CisJdmNwdS0+YXJjaC5zcHJnNSA9IHJlZ3MtPnNwcmc0OworCXZjcHUtPmFyY2guc3ByZzYgPSByZWdzLT5zcHJnNTsKKwl2Y3B1LT5hcmNoLnNwcmc3ID0gcmVncy0+c3ByZzY7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2Y3B1LT5hcmNoLmdwcik7IGkrKykKKwkJdmNwdS0+YXJjaC5ncHJbaV0gPSByZWdzLT5ncHJbaV07CisKKwlyZXR1cm4gMDsKK30KKworaW50IGt2bV9hcmNoX3ZjcHVfaW9jdGxfZ2V0X3NyZWdzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qga3ZtX3NyZWdzICpzcmVncykKK3sKKwlzdHJ1Y3Qga3ZtcHBjX3ZjcHVfYm9vazNzICp2Y3B1M3MgPSB0b19ib29rM3ModmNwdSk7CisJaW50IGk7CisKKwlzcmVncy0+cHZyID0gdmNwdS0+YXJjaC5wdnI7CisKKwlzcmVncy0+dS5zLnNkcjEgPSB0b19ib29rM3ModmNwdSktPnNkcjE7CisJaWYgKHZjcHUtPmFyY2guaGZsYWdzICYgQk9PSzNTX0hGTEFHX1NMQikgeworCQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworCQkJc3JlZ3MtPnUucy5wcGM2NC5zbGJbaV0uc2xiZSA9IHZjcHUzcy0+c2xiW2ldLm9yaWdlIHwgaTsKKwkJCXNyZWdzLT51LnMucHBjNjQuc2xiW2ldLnNsYnYgPSB2Y3B1M3MtPnNsYltpXS5vcmlndjsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCQlzcmVncy0+dS5zLnBwYzMyLnNyW2ldID0gdmNwdTNzLT5zcltpXS5yYXc7CisJCQlzcmVncy0+dS5zLnBwYzMyLnNyW2ldID0gdmNwdTNzLT5zcltpXS5yYXc7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJc3JlZ3MtPnUucy5wcGMzMi5pYmF0W2ldID0gdmNwdTNzLT5pYmF0W2ldLnJhdzsKKwkJCXNyZWdzLT51LnMucHBjMzIuZGJhdFtpXSA9IHZjcHUzcy0+ZGJhdFtpXS5yYXc7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBrdm1fYXJjaF92Y3B1X2lvY3RsX3NldF9zcmVncyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGt2bV9zcmVncyAqc3JlZ3MpCit7CisJc3RydWN0IGt2bXBwY192Y3B1X2Jvb2szcyAqdmNwdTNzID0gdG9fYm9vazNzKHZjcHUpOworCWludCBpOworCisJa3ZtcHBjX3NldF9wdnIodmNwdSwgc3JlZ3MtPnB2cik7CisKKwl2Y3B1M3MtPnNkcjEgPSBzcmVncy0+dS5zLnNkcjE7CisJaWYgKHZjcHUtPmFyY2guaGZsYWdzICYgQk9PSzNTX0hGTEFHX1NMQikgeworCQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworCQkJdmNwdS0+YXJjaC5tbXUuc2xibXRlKHZjcHUsIHNyZWdzLT51LnMucHBjNjQuc2xiW2ldLnNsYnYsCisJCQkJCQkgICAgc3JlZ3MtPnUucy5wcGM2NC5zbGJbaV0uc2xiZSk7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJdmNwdS0+YXJjaC5tbXUubXRzcmluKHZjcHUsIGksIHNyZWdzLT51LnMucHBjMzIuc3JbaV0pOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCWt2bXBwY19zZXRfYmF0KHZjcHUsICYodmNwdTNzLT5pYmF0W2ldKSwgZmFsc2UsCisJCQkJICAgICAgICh1MzIpc3JlZ3MtPnUucy5wcGMzMi5pYmF0W2ldKTsKKwkJCWt2bXBwY19zZXRfYmF0KHZjcHUsICYodmNwdTNzLT5pYmF0W2ldKSwgdHJ1ZSwKKwkJCQkgICAgICAgKHUzMikoc3JlZ3MtPnUucy5wcGMzMi5pYmF0W2ldID4+IDMyKSk7CisJCQlrdm1wcGNfc2V0X2JhdCh2Y3B1LCAmKHZjcHUzcy0+ZGJhdFtpXSksIGZhbHNlLAorCQkJCSAgICAgICAodTMyKXNyZWdzLT51LnMucHBjMzIuZGJhdFtpXSk7CisJCQlrdm1wcGNfc2V0X2JhdCh2Y3B1LCAmKHZjcHUzcy0+ZGJhdFtpXSksIHRydWUsCisJCQkJICAgICAgICh1MzIpKHNyZWdzLT51LnMucHBjMzIuZGJhdFtpXSA+PiAzMikpOworCQl9CisJfQorCisJLyogRmx1c2ggdGhlIE1NVSBhZnRlciBtZXNzaW5nIHdpdGggdGhlIHNlZ21lbnRzICovCisJa3ZtcHBjX21tdV9wdGVfZmx1c2godmNwdSwgMCwgMCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBrdm1fYXJjaF92Y3B1X2lvY3RsX2dldF9mcHUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX2ZwdSAqZnB1KQoreworCXJldHVybiAtRU5PVFNVUFA7Cit9CisKK2ludCBrdm1fYXJjaF92Y3B1X2lvY3RsX3NldF9mcHUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX2ZwdSAqZnB1KQoreworCXJldHVybiAtRU5PVFNVUFA7Cit9CisKK2ludCBrdm1fYXJjaF92Y3B1X2lvY3RsX3RyYW5zbGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGt2bV90cmFuc2xhdGlvbiAqdHIpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHZXQgKGFuZCBjbGVhcikgdGhlIGRpcnR5IG1lbW9yeSBsb2cgZm9yIGEgbWVtb3J5IHNsb3QuCisgKi8KK2ludCBrdm1fdm1faW9jdGxfZ2V0X2RpcnR5X2xvZyhzdHJ1Y3Qga3ZtICprdm0sCisJCQkJICAgICAgc3RydWN0IGt2bV9kaXJ0eV9sb2cgKmxvZykKK3sKKwlzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICptZW1zbG90OworCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTsKKwl1bG9uZyBnYSwgZ2FfZW5kOworCWludCBpc19kaXJ0eSA9IDA7CisJaW50IHIsIG47CisKKwlkb3duX3dyaXRlKCZrdm0tPnNsb3RzX2xvY2spOworCisJciA9IGt2bV9nZXRfZGlydHlfbG9nKGt2bSwgbG9nLCAmaXNfZGlydHkpOworCWlmIChyKQorCQlnb3RvIG91dDsKKworCS8qIElmIG5vdGhpbmcgaXMgZGlydHksIGRvbid0IGJvdGhlciBtZXNzaW5nIHdpdGggcGFnZSB0YWJsZXMuICovCisJaWYgKGlzX2RpcnR5KSB7CisJCW1lbXNsb3QgPSAma3ZtLT5tZW1zbG90c1tsb2ctPnNsb3RdOworCisJCWdhID0gbWVtc2xvdC0+YmFzZV9nZm4gPDwgUEFHRV9TSElGVDsKKwkJZ2FfZW5kID0gZ2EgKyAobWVtc2xvdC0+bnBhZ2VzIDw8IFBBR0VfU0hJRlQpOworCisJCWt2bV9mb3JfZWFjaF92Y3B1KG4sIHZjcHUsIGt2bSkKKwkJCWt2bXBwY19tbXVfcHRlX3BmbHVzaCh2Y3B1LCBnYSwgZ2FfZW5kKTsKKworCQluID0gQUxJR04obWVtc2xvdC0+bnBhZ2VzLCBCSVRTX1BFUl9MT05HKSAvIDg7CisJCW1lbXNldChtZW1zbG90LT5kaXJ0eV9iaXRtYXAsIDAsIG4pOworCX0KKworCXIgPSAwOworb3V0OgorCXVwX3dyaXRlKCZrdm0tPnNsb3RzX2xvY2spOworCXJldHVybiByOworfQorCitpbnQga3ZtcHBjX2NvcmVfY2hlY2tfcHJvY2Vzc29yX2NvbXBhdCh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3Qga3ZtX3ZjcHUgKmt2bXBwY19jb3JlX3ZjcHVfY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgdW5zaWduZWQgaW50IGlkKQoreworCXN0cnVjdCBrdm1wcGNfdmNwdV9ib29rM3MgKnZjcHVfYm9vazNzOworCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTsKKwlpbnQgZXJyOworCisJdmNwdV9ib29rM3MgPSAoc3RydWN0IGt2bXBwY192Y3B1X2Jvb2szcyAqKV9fZ2V0X2ZyZWVfcGFnZXMoIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPLAorCQkJZ2V0X29yZGVyKHNpemVvZihzdHJ1Y3Qga3ZtcHBjX3ZjcHVfYm9vazNzKSkpOworCWlmICghdmNwdV9ib29rM3MpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJdmNwdSA9ICZ2Y3B1X2Jvb2szcy0+dmNwdTsKKwllcnIgPSBrdm1fdmNwdV9pbml0KHZjcHUsIGt2bSwgaWQpOworCWlmIChlcnIpCisJCWdvdG8gZnJlZV92Y3B1OworCisJdmNwdS0+YXJjaC5ob3N0X3JldGlwID0ga3ZtX3JldHVybl9wb2ludDsKKwl2Y3B1LT5hcmNoLmhvc3RfbXNyID0gbWZtc3IoKTsKKwkvKiBkZWZhdWx0IHRvIGJvb2szc182NCAoOTcwZngpICovCisJdmNwdS0+YXJjaC5wdnIgPSAweDNDMDMwMTsKKwlrdm1wcGNfc2V0X3B2cih2Y3B1LCB2Y3B1LT5hcmNoLnB2cik7CisJdmNwdV9ib29rM3MtPnNsYl9uciA9IDY0OworCisJLyogcmVtZW1iZXIgd2hlcmUgc29tZSByZWFsLW1vZGUgaGFuZGxlcnMgYXJlICovCisJdmNwdS0+YXJjaC50cmFtcG9saW5lX2xvd21lbSA9IGt2bXBwY190cmFtcG9saW5lX2xvd21lbTsKKwl2Y3B1LT5hcmNoLnRyYW1wb2xpbmVfZW50ZXIgPSBrdm1wcGNfdHJhbXBvbGluZV9lbnRlcjsKKwl2Y3B1LT5hcmNoLmhpZ2htZW1faGFuZGxlciA9ICh1bG9uZylrdm1wcGNfaGFuZGxlcl9oaWdobWVtOworCisJdmNwdS0+YXJjaC5zaGFkb3dfbXNyID0gTVNSX1VTRVI2NDsKKworCWVyciA9IF9faW5pdF9uZXdfY29udGV4dCgpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGZyZWVfdmNwdTsKKwl2Y3B1X2Jvb2szcy0+Y29udGV4dF9pZCA9IGVycjsKKworCXZjcHVfYm9vazNzLT52c2lkX21heCA9ICgodmNwdV9ib29rM3MtPmNvbnRleHRfaWQgKyAxKSA8PCBVU0VSX0VTSURfQklUUykgLSAxOworCXZjcHVfYm9vazNzLT52c2lkX2ZpcnN0ID0gdmNwdV9ib29rM3MtPmNvbnRleHRfaWQgPDwgVVNFUl9FU0lEX0JJVFM7CisJdmNwdV9ib29rM3MtPnZzaWRfbmV4dCA9IHZjcHVfYm9vazNzLT52c2lkX2ZpcnN0OworCisJcmV0dXJuIHZjcHU7CisKK2ZyZWVfdmNwdToKKwlmcmVlX3BhZ2VzKChsb25nKXZjcHVfYm9vazNzLCBnZXRfb3JkZXIoc2l6ZW9mKHN0cnVjdCBrdm1wcGNfdmNwdV9ib29rM3MpKSk7CitvdXQ6CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKwordm9pZCBrdm1wcGNfY29yZV92Y3B1X2ZyZWUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCBrdm1wcGNfdmNwdV9ib29rM3MgKnZjcHVfYm9vazNzID0gdG9fYm9vazNzKHZjcHUpOworCisJX19kZXN0cm95X2NvbnRleHQodmNwdV9ib29rM3MtPmNvbnRleHRfaWQpOworCWt2bV92Y3B1X3VuaW5pdCh2Y3B1KTsKKwlmcmVlX3BhZ2VzKChsb25nKXZjcHVfYm9vazNzLCBnZXRfb3JkZXIoc2l6ZW9mKHN0cnVjdCBrdm1wcGNfdmNwdV9ib29rM3MpKSk7Cit9CisKK2V4dGVybiBpbnQgX19rdm1wcGNfdmNwdV9lbnRyeShzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1biwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKK2ludCBfX2t2bXBwY192Y3B1X3J1bihzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1biwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCWludCByZXQ7CisKKwkvKiBObyBuZWVkIHRvIGdvIGludG8gdGhlIGd1ZXN0IHdoZW4gYWxsIHdlIGRvIGlzIGdvaW5nIG91dCAqLworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQlrdm1fcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX0lOVFI7CisJCXJldHVybiAtRUlOVFI7CisJfQorCisJLyogWFhYIHdlIGdldCBjYWxsZWQgd2l0aCBpcnEgZGlzYWJsZWQgLSBjaGFuZ2UgdGhhdCEgKi8KKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwlyZXQgPSBfX2t2bXBwY192Y3B1X2VudHJ5KGt2bV9ydW4sIHZjcHUpOworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQga3ZtcHBjX2Jvb2szc19pbml0KHZvaWQpCit7CisJcmV0dXJuIGt2bV9pbml0KE5VTEwsIHNpemVvZihzdHJ1Y3Qga3ZtcHBjX3ZjcHVfYm9vazNzKSwgVEhJU19NT0RVTEUpOworfQorCitzdGF0aWMgdm9pZCBrdm1wcGNfYm9vazNzX2V4aXQodm9pZCkKK3sKKwlrdm1fZXhpdCgpOworfQorCittb2R1bGVfaW5pdChrdm1wcGNfYm9vazNzX2luaXQpOworbW9kdWxlX2V4aXQoa3ZtcHBjX2Jvb2szc19leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzXzMyX21tdS5jIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfMzJfbW11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmOTlmMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzXzMyX21tdS5jCkBAIC0wLDAgKzEsMzcyIEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCisgKgorICogQ29weXJpZ2h0IFNVU0UgTGludXggUHJvZHVjdHMgR21iSCAyMDA5CisgKgorICogQXV0aG9yczogQWxleGFuZGVyIEdyYWYgPGFncmFmQHN1c2UuZGU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgva3ZtLmg+CisjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisKKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKyNpbmNsdWRlIDxhc20va3ZtX3BwYy5oPgorI2luY2x1ZGUgPGFzbS9rdm1fYm9vazNzLmg+CisKKy8qICNkZWZpbmUgREVCVUdfTU1VICovCisvKiAjZGVmaW5lIERFQlVHX01NVV9QVEUgKi8KKy8qICNkZWZpbmUgREVCVUdfTU1VX1BURV9JUCAweGZmZjE0YzQwICovCisKKyNpZmRlZiBERUJVR19NTVUKKyNkZWZpbmUgZHByaW50ayhYLi4uKSBwcmludGsoS0VSTl9JTkZPIFgpCisjZWxzZQorI2RlZmluZSBkcHJpbnRrKFguLi4pIGRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKyNpZmRlZiBERUJVR19QVEUKKyNkZWZpbmUgZHByaW50a19wdGUoWC4uLikgcHJpbnRrKEtFUk5fSU5GTyBYKQorI2Vsc2UKKyNkZWZpbmUgZHByaW50a19wdGUoWC4uLikgZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworI2RlZmluZSBQVEVHX0ZMQUdfQUNDRVNTRUQJMHgwMDAwMDEwMAorI2RlZmluZSBQVEVHX0ZMQUdfRElSVFkJCTB4MDAwMDAwODAKKworc3RhdGljIGlubGluZSBib29sIGNoZWNrX2RlYnVnX2lwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKyNpZmRlZiBERUJVR19NTVVfUFRFX0lQCisJcmV0dXJuIHZjcHUtPmFyY2gucGMgPT0gREVCVUdfTU1VX1BURV9JUDsKKyNlbHNlCisJcmV0dXJuIHRydWU7CisjZW5kaWYKK30KKworc3RhdGljIGludCBrdm1wcGNfbW11X2Jvb2szc18zMl94bGF0ZV9iYXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBlYWRkciwKKwkJCQkJICBzdHJ1Y3Qga3ZtcHBjX3B0ZSAqcHRlLCBib29sIGRhdGEpOworCitzdGF0aWMgc3RydWN0IGt2bXBwY19zciAqZmluZF9zcihzdHJ1Y3Qga3ZtcHBjX3ZjcHVfYm9vazNzICp2Y3B1X2Jvb2szcywgZ3ZhX3QgZWFkZHIpCit7CisJcmV0dXJuICZ2Y3B1X2Jvb2szcy0+c3JbKGVhZGRyID4+IDI4KSAmIDB4Zl07Cit9CisKK3N0YXRpYyB1NjQga3ZtcHBjX21tdV9ib29rM3NfMzJfZWFfdG9fdnAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBlYWRkciwKKwkJCQkJIGJvb2wgZGF0YSkKK3sKKwlzdHJ1Y3Qga3ZtcHBjX3NyICpzcmUgPSBmaW5kX3NyKHRvX2Jvb2szcyh2Y3B1KSwgZWFkZHIpOworCXN0cnVjdCBrdm1wcGNfcHRlIHB0ZTsKKworCWlmICgha3ZtcHBjX21tdV9ib29rM3NfMzJfeGxhdGVfYmF0KHZjcHUsIGVhZGRyLCAmcHRlLCBkYXRhKSkKKwkJcmV0dXJuIHB0ZS52cGFnZTsKKworCXJldHVybiAoKCh1NjQpZWFkZHIgPj4gMTIpICYgMHhmZmZmKSB8ICgoKHU2NClzcmUtPnZzaWQpIDw8IDE2KTsKK30KKworc3RhdGljIHZvaWQga3ZtcHBjX21tdV9ib29rM3NfMzJfcmVzZXRfbXNyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlrdm1wcGNfc2V0X21zcih2Y3B1LCAwKTsKK30KKworc3RhdGljIGh2YV90IGt2bXBwY19tbXVfYm9vazNzXzMyX2dldF9wdGVnKHN0cnVjdCBrdm1wcGNfdmNwdV9ib29rM3MgKnZjcHVfYm9vazNzLAorCQkJCSAgICAgIHN0cnVjdCBrdm1wcGNfc3IgKnNyZSwgZ3ZhX3QgZWFkZHIsCisJCQkJICAgICAgYm9vbCBwcmltYXJ5KQoreworCXUzMiBwYWdlLCBoYXNoLCBwdGVnLCBodGFibWFzazsKKwlodmFfdCByOworCisJcGFnZSA9IChlYWRkciAmIDB4MEZGRkZGRkYpID4+IDEyOworCWh0YWJtYXNrID0gKCh2Y3B1X2Jvb2szcy0+c2RyMSAmIDB4MUZGKSA8PCAxNikgfCAweEZGQzA7CisKKwloYXNoID0gKChzcmUtPnZzaWQgXiBwYWdlKSA8PCA2KTsKKwlpZiAoIXByaW1hcnkpCisJCWhhc2ggPSB+aGFzaDsKKwloYXNoICY9IGh0YWJtYXNrOworCisJcHRlZyA9ICh2Y3B1X2Jvb2szcy0+c2RyMSAmIDB4ZmZmZjAwMDApIHwgaGFzaDsKKworCWRwcmludGsoIk1NVTogcGM9MHglbHggZWFkZHI9MHglbHggc2RyMT0weCVsbHggcHRlZz0weCV4IHZzaWQ9MHgleFxuIiwKKwkJdmNwdV9ib29rM3MtPnZjcHUuYXJjaC5wYywgZWFkZHIsIHZjcHVfYm9vazNzLT5zZHIxLCBwdGVnLAorCQlzcmUtPnZzaWQpOworCisJciA9IGdmbl90b19odmEodmNwdV9ib29rM3MtPnZjcHUua3ZtLCBwdGVnID4+IFBBR0VfU0hJRlQpOworCWlmIChrdm1faXNfZXJyb3JfaHZhKHIpKQorCQlyZXR1cm4gcjsKKwlyZXR1cm4gciB8IChwdGVnICYgflBBR0VfTUFTSyk7Cit9CisKK3N0YXRpYyB1MzIga3ZtcHBjX21tdV9ib29rM3NfMzJfZ2V0X3B0ZW0oc3RydWN0IGt2bXBwY19zciAqc3JlLCBndmFfdCBlYWRkciwKKwkJCQkgICAgYm9vbCBwcmltYXJ5KQoreworCXJldHVybiAoKGVhZGRyICYgMHgwZmZmZmZmZikgPj4gMjIpIHwgKHNyZS0+dnNpZCA8PCA3KSB8CisJICAgICAgIChwcmltYXJ5ID8gMCA6IDB4NDApIHwgMHg4MDAwMDAwMDsKK30KKworc3RhdGljIGludCBrdm1wcGNfbW11X2Jvb2szc18zMl94bGF0ZV9iYXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBlYWRkciwKKwkJCQkJICBzdHJ1Y3Qga3ZtcHBjX3B0ZSAqcHRlLCBib29sIGRhdGEpCit7CisJc3RydWN0IGt2bXBwY192Y3B1X2Jvb2szcyAqdmNwdV9ib29rM3MgPSB0b19ib29rM3ModmNwdSk7CisJc3RydWN0IGt2bXBwY19iYXQgKmJhdDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJaWYgKGRhdGEpCisJCQliYXQgPSAmdmNwdV9ib29rM3MtPmRiYXRbaV07CisJCWVsc2UKKwkJCWJhdCA9ICZ2Y3B1X2Jvb2szcy0+aWJhdFtpXTsKKworCQlpZiAodmNwdS0+YXJjaC5tc3IgJiBNU1JfUFIpIHsKKwkJCWlmICghYmF0LT52cCkKKwkJCQljb250aW51ZTsKKwkJfSBlbHNlIHsKKwkJCWlmICghYmF0LT52cykKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChjaGVja19kZWJ1Z19pcCh2Y3B1KSkKKwkJeworCQkJZHByaW50a19wdGUoIiVjQkFUICUwMmQ6IDB4JWx4IC0gMHgleCAoMHgleClcbiIsCisJCQkJICAgIGRhdGEgPyAnZCcgOiAnaScsIGksIGVhZGRyLCBiYXQtPmJlcGksCisJCQkJICAgIGJhdC0+YmVwaV9tYXNrKTsKKwkJfQorCQlpZiAoKGVhZGRyICYgYmF0LT5iZXBpX21hc2spID09IGJhdC0+YmVwaSkgeworCQkJcHRlLT5yYWRkciA9IGJhdC0+YnJwbiB8IChlYWRkciAmIH5iYXQtPmJlcGlfbWFzayk7CisJCQlwdGUtPnZwYWdlID0gKGVhZGRyID4+IDEyKSB8IFZTSURfQkFUOworCQkJcHRlLT5tYXlfcmVhZCA9IGJhdC0+cHA7CisJCQlwdGUtPm1heV93cml0ZSA9IGJhdC0+cHAgPiAxOworCQkJcHRlLT5tYXlfZXhlY3V0ZSA9IHRydWU7CisJCQlpZiAoIXB0ZS0+bWF5X3JlYWQpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJCQVQgaXMgbm90IHJlYWRhYmxlIVxuIik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXB0ZS0+bWF5X3dyaXRlKSB7CisJCQkJLyogbGV0J3MgdHJlYXQgci9vIEJBVHMgYXMgbm90LXJlYWRhYmxlIGZvciBub3cgKi8KKwkJCQlkcHJpbnRrX3B0ZSgiQkFUIGlzIHJlYWQtb25seSFcbiIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAtRU5PRU5UOworfQorCitzdGF0aWMgaW50IGt2bXBwY19tbXVfYm9vazNzXzMyX3hsYXRlX3B0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IGVhZGRyLAorCQkJCSAgICAgc3RydWN0IGt2bXBwY19wdGUgKnB0ZSwgYm9vbCBkYXRhLAorCQkJCSAgICAgYm9vbCBwcmltYXJ5KQoreworCXN0cnVjdCBrdm1wcGNfdmNwdV9ib29rM3MgKnZjcHVfYm9vazNzID0gdG9fYm9vazNzKHZjcHUpOworCXN0cnVjdCBrdm1wcGNfc3IgKnNyZTsKKwlodmFfdCBwdGVncDsKKwl1MzIgcHRlZ1sxNl07CisJdTY0IHB0ZW0gPSAwOworCWludCBpOworCWludCBmb3VuZCA9IDA7CisKKwlzcmUgPSBmaW5kX3NyKHZjcHVfYm9vazNzLCBlYWRkcik7CisKKwlkcHJpbnRrX3B0ZSgiU1IgMHglbHg6IHZzaWQ9MHgleCwgcmF3PTB4JXhcbiIsIGVhZGRyID4+IDI4LAorCQkgICAgc3JlLT52c2lkLCBzcmUtPnJhdyk7CisKKwlwdGUtPnZwYWdlID0ga3ZtcHBjX21tdV9ib29rM3NfMzJfZWFfdG9fdnAodmNwdSwgZWFkZHIsIGRhdGEpOworCisJcHRlZ3AgPSBrdm1wcGNfbW11X2Jvb2szc18zMl9nZXRfcHRlZyh2Y3B1X2Jvb2szcywgc3JlLCBlYWRkciwgcHJpbWFyeSk7CisJaWYgKGt2bV9pc19lcnJvcl9odmEocHRlZ3ApKSB7CisJCXByaW50ayhLRVJOX0lORk8gIktWTTogSW52YWxpZCBQVEVHIVxuIik7CisJCWdvdG8gbm9fcGFnZV9mb3VuZDsKKwl9CisKKwlwdGVtID0ga3ZtcHBjX21tdV9ib29rM3NfMzJfZ2V0X3B0ZW0oc3JlLCBlYWRkciwgcHJpbWFyeSk7CisKKwlpZihjb3B5X2Zyb21fdXNlcihwdGVnLCAodm9pZCBfX3VzZXIgKilwdGVncCwgc2l6ZW9mKHB0ZWcpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIktWTTogQ2FuJ3QgY29weSBkYXRhIGZyb20gMHglbHghXG4iLCBwdGVncCk7CisJCWdvdG8gbm9fcGFnZV9mb3VuZDsKKwl9CisKKwlmb3IgKGk9MDsgaTwxNjsgaSs9MikgeworCQlpZiAocHRlbSA9PSBwdGVnW2ldKSB7CisJCQl1OCBwcDsKKworCQkJcHRlLT5yYWRkciA9IChwdGVnW2krMV0gJiB+KDB4RkZGVUxMKSkgfCAoZWFkZHIgJiAweEZGRik7CisJCQlwcCA9IHB0ZWdbaSsxXSAmIDM7CisKKwkJCWlmICgoc3JlLT5LcCAmJiAgKHZjcHUtPmFyY2gubXNyICYgTVNSX1BSKSkgfHwKKwkJCSAgICAoc3JlLT5LcyAmJiAhKHZjcHUtPmFyY2gubXNyICYgTVNSX1BSKSkpCisJCQkJcHAgfD0gNDsKKworCQkJcHRlLT5tYXlfd3JpdGUgPSBmYWxzZTsKKwkJCXB0ZS0+bWF5X3JlYWQgPSBmYWxzZTsKKwkJCXB0ZS0+bWF5X2V4ZWN1dGUgPSB0cnVlOworCQkJc3dpdGNoIChwcCkgeworCQkJCWNhc2UgMDoKKwkJCQljYXNlIDE6CisJCQkJY2FzZSAyOgorCQkJCWNhc2UgNjoKKwkJCQkJcHRlLT5tYXlfd3JpdGUgPSB0cnVlOworCQkJCWNhc2UgMzoKKwkJCQljYXNlIDU6CisJCQkJY2FzZSA3OgorCQkJCQlwdGUtPm1heV9yZWFkID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICggIXB0ZS0+bWF5X3JlYWQgKQorCQkJCWNvbnRpbnVlOworCisJCQlkcHJpbnRrX3B0ZSgiTU1VOiBGb3VuZCBQVEUgLT4gJXggJXggLSAleFxuIiwKKwkJCQkgICAgcHRlZ1tpXSwgcHRlZ1tpKzFdLCBwcCk7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIFVwZGF0ZSBQVEUgQyBhbmQgQSBiaXRzLCBzbyB0aGUgZ3Vlc3QncyBzd2FwcGVyIGtub3dzIHdlIHVzZWQgdGhlCisJICAgcGFnZSAqLworCWlmIChmb3VuZCkgeworCQl1MzIgb2xkcHRlID0gcHRlZ1tpKzFdOworCisJCWlmIChwdGUtPm1heV9yZWFkKQorCQkJcHRlZ1tpKzFdIHw9IFBURUdfRkxBR19BQ0NFU1NFRDsKKwkJaWYgKHB0ZS0+bWF5X3dyaXRlKQorCQkJcHRlZ1tpKzFdIHw9IFBURUdfRkxBR19ESVJUWTsKKwkJZWxzZQorCQkJZHByaW50a19wdGUoIktWTTogTWFwcGluZyByZWFkLW9ubHkgcGFnZSFcbiIpOworCisJCS8qIFdyaXRlIGJhY2sgaW50byB0aGUgUFRFRyAqLworCQlpZiAocHRlZ1tpKzFdICE9IG9sZHB0ZSkKKwkJCWNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilwdGVncCwgcHRlZywgc2l6ZW9mKHB0ZWcpKTsKKworCQlyZXR1cm4gMDsKKwl9CisKK25vX3BhZ2VfZm91bmQ6CisKKwlpZiAoY2hlY2tfZGVidWdfaXAodmNwdSkpIHsKKwkJZHByaW50a19wdGUoIktWTSBNTVU6IE5vIFBURSBmb3VuZCAoc2RyMT0weCVsbHggcHRlZ3A9MHglbHgpXG4iLAorCQkJICAgIHRvX2Jvb2szcyh2Y3B1KS0+c2RyMSwgcHRlZ3ApOworCQlmb3IgKGk9MDsgaTwxNjsgaSs9MikgeworCQkJZHByaW50a19wdGUoIiAgICUwMmQ6IDB4JXggLSAweCV4ICgweCVsbHgpXG4iLAorCQkJCSAgICBpLCBwdGVnW2ldLCBwdGVnW2krMV0sIHB0ZW0pOworCQl9CisJfQorCisJcmV0dXJuIC1FTk9FTlQ7Cit9CisKK3N0YXRpYyBpbnQga3ZtcHBjX21tdV9ib29rM3NfMzJfeGxhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBlYWRkciwKKwkJCQkgICAgICBzdHJ1Y3Qga3ZtcHBjX3B0ZSAqcHRlLCBib29sIGRhdGEpCit7CisJaW50IHI7CisKKwlwdGUtPmVhZGRyID0gZWFkZHI7CisJciA9IGt2bXBwY19tbXVfYm9vazNzXzMyX3hsYXRlX2JhdCh2Y3B1LCBlYWRkciwgcHRlLCBkYXRhKTsKKwlpZiAociA8IDApCisJICAgICAgIHIgPSBrdm1wcGNfbW11X2Jvb2szc18zMl94bGF0ZV9wdGUodmNwdSwgZWFkZHIsIHB0ZSwgZGF0YSwgdHJ1ZSk7CisJaWYgKHIgPCAwKQorCSAgICAgICByID0ga3ZtcHBjX21tdV9ib29rM3NfMzJfeGxhdGVfcHRlKHZjcHUsIGVhZGRyLCBwdGUsIGRhdGEsIGZhbHNlKTsKKworCXJldHVybiByOworfQorCisKK3N0YXRpYyB1MzIga3ZtcHBjX21tdV9ib29rM3NfMzJfbWZzcmluKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTMyIHNybnVtKQoreworCXJldHVybiB0b19ib29rM3ModmNwdSktPnNyW3NybnVtXS5yYXc7Cit9CisKK3N0YXRpYyB2b2lkIGt2bXBwY19tbXVfYm9vazNzXzMyX210c3JpbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUzMiBzcm51bSwKKwkJCQkJdWxvbmcgdmFsdWUpCit7CisJc3RydWN0IGt2bXBwY19zciAqc3JlOworCisJc3JlID0gJnRvX2Jvb2szcyh2Y3B1KS0+c3Jbc3JudW1dOworCisJLyogRmx1c2ggYW55IGxlZnQtb3ZlciBzaGFkb3dzIGZyb20gdGhlIHByZXZpb3VzIFNSICovCisKKwkvKiBYWFggTm90IG5lY2Vzc2FyeT8gKi8KKwkvKiBrdm1wcGNfbW11X3B0ZV9mbHVzaCh2Y3B1LCAoKHU2NClzcmUtPnZzaWQpIDw8IDI4LCAweGYwMDAwMDAwVUxMKTsgKi8KKworCS8qIEFuZCB0aGVuIHB1dCBpbiB0aGUgbmV3IFNSICovCisJc3JlLT5yYXcgPSB2YWx1ZTsKKwlzcmUtPnZzaWQgPSAodmFsdWUgJiAweDBmZmZmZmZmKTsKKwlzcmUtPktzID0gKHZhbHVlICYgMHg0MDAwMDAwMCkgPyB0cnVlIDogZmFsc2U7CisJc3JlLT5LcCA9ICh2YWx1ZSAmIDB4MjAwMDAwMDApID8gdHJ1ZSA6IGZhbHNlOworCXNyZS0+bnggPSAodmFsdWUgJiAweDEwMDAwMDAwKSA/IHRydWUgOiBmYWxzZTsKKworCS8qIE1hcCB0aGUgbmV3IHNlZ21lbnQgKi8KKwlrdm1wcGNfbW11X21hcF9zZWdtZW50KHZjcHUsIHNybnVtIDw8IFNJRF9TSElGVCk7Cit9CisKK3N0YXRpYyB2b2lkIGt2bXBwY19tbXVfYm9vazNzXzMyX3RsYmllKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdWxvbmcgZWEsIGJvb2wgbGFyZ2UpCit7CisJa3ZtcHBjX21tdV9wdGVfZmx1c2godmNwdSwgZWEsIH4weEZGRlVMTCk7Cit9CisKK3N0YXRpYyBpbnQga3ZtcHBjX21tdV9ib29rM3NfMzJfZXNpZF90b192c2lkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IGVzaWQsCisJCQkJCSAgICAgdTY0ICp2c2lkKQoreworCS8qIEluIGNhc2Ugd2Ugb25seSBoYXZlIG9uZSBvZiBNU1JfSVIgb3IgTVNSX0RSIHNldCwgbGV0J3MgcHV0CisJICAgdGhhdCBpbiB0aGUgcmVhbC1tb2RlIGNvbnRleHQgKGFuZCBob3BlIFJNIGRvZXNuJ3QgYWNjZXNzCisJICAgaGlnaCBtZW1vcnkpICovCisJc3dpdGNoICh2Y3B1LT5hcmNoLm1zciAmIChNU1JfRFJ8TVNSX0lSKSkgeworCWNhc2UgMDoKKwkJKnZzaWQgPSAoVlNJRF9SRUFMID4+IDE2KSB8IGVzaWQ7CisJCWJyZWFrOworCWNhc2UgTVNSX0lSOgorCQkqdnNpZCA9IChWU0lEX1JFQUxfSVIgPj4gMTYpIHwgZXNpZDsKKwkJYnJlYWs7CisJY2FzZSBNU1JfRFI6CisJCSp2c2lkID0gKFZTSURfUkVBTF9EUiA+PiAxNikgfCBlc2lkOworCQlicmVhazsKKwljYXNlIE1TUl9EUnxNU1JfSVI6CisJeworCQl1bG9uZyBlYTsKKwkJZWEgPSBlc2lkIDw8IFNJRF9TSElGVDsKKwkJKnZzaWQgPSBmaW5kX3NyKHRvX2Jvb2szcyh2Y3B1KSwgZWEpLT52c2lkOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sIGt2bXBwY19tbXVfYm9vazNzXzMyX2lzX2RjYnozMihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJcmV0dXJuIHRydWU7Cit9CisKKwordm9pZCBrdm1wcGNfbW11X2Jvb2szc18zMl9pbml0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzdHJ1Y3Qga3ZtcHBjX21tdSAqbW11ID0gJnZjcHUtPmFyY2gubW11OworCisJbW11LT5tdHNyaW4gPSBrdm1wcGNfbW11X2Jvb2szc18zMl9tdHNyaW47CisJbW11LT5tZnNyaW4gPSBrdm1wcGNfbW11X2Jvb2szc18zMl9tZnNyaW47CisJbW11LT54bGF0ZSA9IGt2bXBwY19tbXVfYm9vazNzXzMyX3hsYXRlOworCW1tdS0+cmVzZXRfbXNyID0ga3ZtcHBjX21tdV9ib29rM3NfMzJfcmVzZXRfbXNyOworCW1tdS0+dGxiaWUgPSBrdm1wcGNfbW11X2Jvb2szc18zMl90bGJpZTsKKwltbXUtPmVzaWRfdG9fdnNpZCA9IGt2bXBwY19tbXVfYm9vazNzXzMyX2VzaWRfdG9fdnNpZDsKKwltbXUtPmVhX3RvX3ZwID0ga3ZtcHBjX21tdV9ib29rM3NfMzJfZWFfdG9fdnA7CisJbW11LT5pc19kY2J6MzIgPSBrdm1wcGNfbW11X2Jvb2szc18zMl9pc19kY2J6MzI7CisKKwltbXUtPnNsYm10ZSA9IE5VTEw7CisJbW11LT5zbGJtZmVlID0gTlVMTDsKKwltbXUtPnNsYm1mZXYgPSBOVUxMOworCW1tdS0+c2xiaWUgPSBOVUxMOworCW1tdS0+c2xiaWEgPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfNjRfZW11bGF0ZS5jIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfNjRfZW11bGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMjdlYWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc182NF9lbXVsYXRlLmMKQEAgLTAsMCArMSwzNDUgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKiBDb3B5cmlnaHQgU1VTRSBMaW51eCBQcm9kdWN0cyBHbWJIIDIwMDkKKyAqCisgKiBBdXRob3JzOiBBbGV4YW5kZXIgR3JhZiA8YWdyYWZAc3VzZS5kZT4KKyAqLworCisjaW5jbHVkZSA8YXNtL2t2bV9wcGMuaD4KKyNpbmNsdWRlIDxhc20vZGlzYXNzZW1ibGUuaD4KKyNpbmNsdWRlIDxhc20va3ZtX2Jvb2szcy5oPgorI2luY2x1ZGUgPGFzbS9yZWcuaD4KKworI2RlZmluZSBPUF8xOV9YT1BfUkZJRAkJMTgKKyNkZWZpbmUgT1BfMTlfWE9QX1JGSQkJNTAKKworI2RlZmluZSBPUF8zMV9YT1BfTUZNU1IJCTgzCisjZGVmaW5lIE9QXzMxX1hPUF9NVE1TUgkJMTQ2CisjZGVmaW5lIE9QXzMxX1hPUF9NVE1TUkQJMTc4CisjZGVmaW5lIE9QXzMxX1hPUF9NVFNSSU4JMjQyCisjZGVmaW5lIE9QXzMxX1hPUF9UTEJJRUwJMjc0CisjZGVmaW5lIE9QXzMxX1hPUF9UTEJJRQkJMzA2CisjZGVmaW5lIE9QXzMxX1hPUF9TTEJNVEUJNDAyCisjZGVmaW5lIE9QXzMxX1hPUF9TTEJJRQkJNDM0CisjZGVmaW5lIE9QXzMxX1hPUF9TTEJJQQkJNDk4CisjZGVmaW5lIE9QXzMxX1hPUF9NRlNSSU4JNjU5CisjZGVmaW5lIE9QXzMxX1hPUF9TTEJNRkVWCTg1MQorI2RlZmluZSBPUF8zMV9YT1BfRUlPSU8JCTg1NAorI2RlZmluZSBPUF8zMV9YT1BfU0xCTUZFRQk5MTUKKworLyogRENCWiBpcyBhY3R1YWxseSAxMDE0LCBidXQgd2UgcGF0Y2ggaXQgdG8gMTAxMCBzbyB3ZSBnZXQgYSB0cmFwICovCisjZGVmaW5lIE9QXzMxX1hPUF9EQ0JaCQkxMDEwCisKK2ludCBrdm1wcGNfY29yZV9lbXVsYXRlX29wKHN0cnVjdCBrdm1fcnVuICpydW4sIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpbnN0LCBpbnQgKmFkdmFuY2UpCit7CisJaW50IGVtdWxhdGVkID0gRU1VTEFURV9ET05FOworCisJc3dpdGNoIChnZXRfb3AoaW5zdCkpIHsKKwljYXNlIDE5OgorCQlzd2l0Y2ggKGdldF94b3AoaW5zdCkpIHsKKwkJY2FzZSBPUF8xOV9YT1BfUkZJRDoKKwkJY2FzZSBPUF8xOV9YT1BfUkZJOgorCQkJdmNwdS0+YXJjaC5wYyA9IHZjcHUtPmFyY2guc3JyMDsKKwkJCWt2bXBwY19zZXRfbXNyKHZjcHUsIHZjcHUtPmFyY2guc3JyMSk7CisJCQkqYWR2YW5jZSA9IDA7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZW11bGF0ZWQgPSBFTVVMQVRFX0ZBSUw7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIDMxOgorCQlzd2l0Y2ggKGdldF94b3AoaW5zdCkpIHsKKwkJY2FzZSBPUF8zMV9YT1BfTUZNU1I6CisJCQl2Y3B1LT5hcmNoLmdwcltnZXRfcnQoaW5zdCldID0gdmNwdS0+YXJjaC5tc3I7CisJCQlicmVhazsKKwkJY2FzZSBPUF8zMV9YT1BfTVRNU1JEOgorCQl7CisJCQl1bG9uZyBycyA9IHZjcHUtPmFyY2guZ3ByW2dldF9ycyhpbnN0KV07CisJCQlpZiAoaW5zdCAmIDB4MTAwMDApIHsKKwkJCQl2Y3B1LT5hcmNoLm1zciAmPSB+KE1TUl9SSSB8IE1TUl9FRSk7CisJCQkJdmNwdS0+YXJjaC5tc3IgfD0gcnMgJiAoTVNSX1JJIHwgTVNSX0VFKTsKKwkJCX0gZWxzZQorCQkJCWt2bXBwY19zZXRfbXNyKHZjcHUsIHJzKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgT1BfMzFfWE9QX01UTVNSOgorCQkJa3ZtcHBjX3NldF9tc3IodmNwdSwgdmNwdS0+YXJjaC5ncHJbZ2V0X3JzKGluc3QpXSk7CisJCQlicmVhazsKKwkJY2FzZSBPUF8zMV9YT1BfTUZTUklOOgorCQl7CisJCQlpbnQgc3JudW07CisKKwkJCXNybnVtID0gKHZjcHUtPmFyY2guZ3ByW2dldF9yYihpbnN0KV0gPj4gMjgpICYgMHhmOworCQkJaWYgKHZjcHUtPmFyY2gubW11Lm1mc3JpbikgeworCQkJCXUzMiBzcjsKKwkJCQlzciA9IHZjcHUtPmFyY2gubW11Lm1mc3Jpbih2Y3B1LCBzcm51bSk7CisJCQkJdmNwdS0+YXJjaC5ncHJbZ2V0X3J0KGluc3QpXSA9IHNyOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBPUF8zMV9YT1BfTVRTUklOOgorCQkJdmNwdS0+YXJjaC5tbXUubXRzcmluKHZjcHUsCisJCQkJKHZjcHUtPmFyY2guZ3ByW2dldF9yYihpbnN0KV0gPj4gMjgpICYgMHhmLAorCQkJCXZjcHUtPmFyY2guZ3ByW2dldF9ycyhpbnN0KV0pOworCQkJYnJlYWs7CisJCWNhc2UgT1BfMzFfWE9QX1RMQklFOgorCQljYXNlIE9QXzMxX1hPUF9UTEJJRUw6CisJCXsKKwkJCWJvb2wgbGFyZ2UgPSAoaW5zdCAmIDB4MDAyMDAwMDApID8gdHJ1ZSA6IGZhbHNlOworCQkJdWxvbmcgYWRkciA9IHZjcHUtPmFyY2guZ3ByW2dldF9yYihpbnN0KV07CisJCQl2Y3B1LT5hcmNoLm1tdS50bGJpZSh2Y3B1LCBhZGRyLCBsYXJnZSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIE9QXzMxX1hPUF9FSU9JTzoKKwkJCWJyZWFrOworCQljYXNlIE9QXzMxX1hPUF9TTEJNVEU6CisJCQlpZiAoIXZjcHUtPmFyY2gubW11LnNsYm10ZSkKKwkJCQlyZXR1cm4gRU1VTEFURV9GQUlMOworCisJCQl2Y3B1LT5hcmNoLm1tdS5zbGJtdGUodmNwdSwgdmNwdS0+YXJjaC5ncHJbZ2V0X3JzKGluc3QpXSwKKwkJCQkJCXZjcHUtPmFyY2guZ3ByW2dldF9yYihpbnN0KV0pOworCQkJYnJlYWs7CisJCWNhc2UgT1BfMzFfWE9QX1NMQklFOgorCQkJaWYgKCF2Y3B1LT5hcmNoLm1tdS5zbGJpZSkKKwkJCQlyZXR1cm4gRU1VTEFURV9GQUlMOworCisJCQl2Y3B1LT5hcmNoLm1tdS5zbGJpZSh2Y3B1LCB2Y3B1LT5hcmNoLmdwcltnZXRfcmIoaW5zdCldKTsKKwkJCWJyZWFrOworCQljYXNlIE9QXzMxX1hPUF9TTEJJQToKKwkJCWlmICghdmNwdS0+YXJjaC5tbXUuc2xiaWEpCisJCQkJcmV0dXJuIEVNVUxBVEVfRkFJTDsKKworCQkJdmNwdS0+YXJjaC5tbXUuc2xiaWEodmNwdSk7CisJCQlicmVhazsKKwkJY2FzZSBPUF8zMV9YT1BfU0xCTUZFRToKKwkJCWlmICghdmNwdS0+YXJjaC5tbXUuc2xibWZlZSkgeworCQkJCWVtdWxhdGVkID0gRU1VTEFURV9GQUlMOworCQkJfSBlbHNlIHsKKwkJCQl1bG9uZyB0LCByYjsKKworCQkJCXJiID0gdmNwdS0+YXJjaC5ncHJbZ2V0X3JiKGluc3QpXTsKKwkJCQl0ID0gdmNwdS0+YXJjaC5tbXUuc2xibWZlZSh2Y3B1LCByYik7CisJCQkJdmNwdS0+YXJjaC5ncHJbZ2V0X3J0KGluc3QpXSA9IHQ7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPUF8zMV9YT1BfU0xCTUZFVjoKKwkJCWlmICghdmNwdS0+YXJjaC5tbXUuc2xibWZldikgeworCQkJCWVtdWxhdGVkID0gRU1VTEFURV9GQUlMOworCQkJfSBlbHNlIHsKKwkJCQl1bG9uZyB0LCByYjsKKworCQkJCXJiID0gdmNwdS0+YXJjaC5ncHJbZ2V0X3JiKGluc3QpXTsKKwkJCQl0ID0gdmNwdS0+YXJjaC5tbXUuc2xibWZldih2Y3B1LCByYik7CisJCQkJdmNwdS0+YXJjaC5ncHJbZ2V0X3J0KGluc3QpXSA9IHQ7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPUF8zMV9YT1BfRENCWjoKKwkJeworCQkJdWxvbmcgcmIgPSAgdmNwdS0+YXJjaC5ncHJbZ2V0X3JiKGluc3QpXTsKKwkJCXVsb25nIHJhID0gMDsKKwkJCXVsb25nIGFkZHI7CisJCQl1MzIgemVyb3NbOF0gPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKKworCQkJaWYgKGdldF9yYShpbnN0KSkKKwkJCQlyYSA9IHZjcHUtPmFyY2guZ3ByW2dldF9yYShpbnN0KV07CisKKwkJCWFkZHIgPSAocmEgKyByYikgJiB+MzFVTEw7CisJCQlpZiAoISh2Y3B1LT5hcmNoLm1zciAmIE1TUl9TRikpCisJCQkJYWRkciAmPSAweGZmZmZmZmZmOworCisJCQlpZiAoa3ZtcHBjX3N0KHZjcHUsIGFkZHIsIDMyLCB6ZXJvcykpIHsKKwkJCQl2Y3B1LT5hcmNoLmRlYXIgPSBhZGRyOworCQkJCXZjcHUtPmFyY2guZmF1bHRfZGVhciA9IGFkZHI7CisJCQkJdG9fYm9vazNzKHZjcHUpLT5kc2lzciA9IERTSVNSX1BST1RGQVVMVCB8CisJCQkJCQkgICAgICBEU0lTUl9JU1NUT1JFOworCQkJCWt2bXBwY19ib29rM3NfcXVldWVfaXJxcHJpbyh2Y3B1LAorCQkJCQlCT09LM1NfSU5URVJSVVBUX0RBVEFfU1RPUkFHRSk7CisJCQkJa3ZtcHBjX21tdV9wdGVfZmx1c2godmNwdSwgYWRkciwgfjB4RkZGVUxMKTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJCWVtdWxhdGVkID0gRU1VTEFURV9GQUlMOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVtdWxhdGVkID0gRU1VTEFURV9GQUlMOworCX0KKworCXJldHVybiBlbXVsYXRlZDsKK30KKwordm9pZCBrdm1wcGNfc2V0X2JhdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1wcGNfYmF0ICpiYXQsIGJvb2wgdXBwZXIsCisgICAgICAgICAgICAgICAgICAgIHUzMiB2YWwpCit7CisJaWYgKHVwcGVyKSB7CisJCS8qIFVwcGVyIEJBVCAqLworCQl1MzIgYmwgPSAodmFsID4+IDIpICYgMHg3ZmY7CisJCWJhdC0+YmVwaV9tYXNrID0gKH5ibCA8PCAxNyk7CisJCWJhdC0+YmVwaSA9IHZhbCAmIDB4ZmZmZTAwMDA7CisJCWJhdC0+dnMgPSAodmFsICYgMikgPyAxIDogMDsKKwkJYmF0LT52cCA9ICh2YWwgJiAxKSA/IDEgOiAwOworCQliYXQtPnJhdyA9IChiYXQtPnJhdyAmIDB4ZmZmZmZmZmYwMDAwMDAwMFVMTCkgfCB2YWw7CisJfSBlbHNlIHsKKwkJLyogTG93ZXIgQkFUICovCisJCWJhdC0+YnJwbiA9IHZhbCAmIDB4ZmZmZTAwMDA7CisJCWJhdC0+d2ltZyA9ICh2YWwgPj4gMykgJiAweGY7CisJCWJhdC0+cHAgPSB2YWwgJiAzOworCQliYXQtPnJhdyA9IChiYXQtPnJhdyAmIDB4MDAwMDAwMDBmZmZmZmZmZlVMTCkgfCAoKHU2NCl2YWwgPDwgMzIpOworCX0KK30KKworc3RhdGljIHZvaWQga3ZtcHBjX3dyaXRlX2JhdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBzcHJuLCB1MzIgdmFsKQoreworCXN0cnVjdCBrdm1wcGNfdmNwdV9ib29rM3MgKnZjcHVfYm9vazNzID0gdG9fYm9vazNzKHZjcHUpOworCXN0cnVjdCBrdm1wcGNfYmF0ICpiYXQ7CisKKwlzd2l0Y2ggKHNwcm4pIHsKKwljYXNlIFNQUk5fSUJBVDBVIC4uLiBTUFJOX0lCQVQzTDoKKwkJYmF0ID0gJnZjcHVfYm9vazNzLT5pYmF0WyhzcHJuIC0gU1BSTl9JQkFUMFUpIC8gMl07CisJCWJyZWFrOworCWNhc2UgU1BSTl9JQkFUNFUgLi4uIFNQUk5fSUJBVDdMOgorCQliYXQgPSAmdmNwdV9ib29rM3MtPmliYXRbKHNwcm4gLSBTUFJOX0lCQVQ0VSkgLyAyXTsKKwkJYnJlYWs7CisJY2FzZSBTUFJOX0RCQVQwVSAuLi4gU1BSTl9EQkFUM0w6CisJCWJhdCA9ICZ2Y3B1X2Jvb2szcy0+ZGJhdFsoc3BybiAtIFNQUk5fREJBVDBVKSAvIDJdOworCQlicmVhazsKKwljYXNlIFNQUk5fREJBVDRVIC4uLiBTUFJOX0RCQVQ3TDoKKwkJYmF0ID0gJnZjcHVfYm9vazNzLT5kYmF0WyhzcHJuIC0gU1BSTl9EQkFUNFUpIC8gMl07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCWt2bXBwY19zZXRfYmF0KHZjcHUsIGJhdCwgIShzcHJuICUgMiksIHZhbCk7Cit9CisKK2ludCBrdm1wcGNfY29yZV9lbXVsYXRlX210c3ByKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IHNwcm4sIGludCBycykKK3sKKwlpbnQgZW11bGF0ZWQgPSBFTVVMQVRFX0RPTkU7CisKKwlzd2l0Y2ggKHNwcm4pIHsKKwljYXNlIFNQUk5fU0RSMToKKwkJdG9fYm9vazNzKHZjcHUpLT5zZHIxID0gdmNwdS0+YXJjaC5ncHJbcnNdOworCQlicmVhazsKKwljYXNlIFNQUk5fRFNJU1I6CisJCXRvX2Jvb2szcyh2Y3B1KS0+ZHNpc3IgPSB2Y3B1LT5hcmNoLmdwcltyc107CisJCWJyZWFrOworCWNhc2UgU1BSTl9EQVI6CisJCXZjcHUtPmFyY2guZGVhciA9IHZjcHUtPmFyY2guZ3ByW3JzXTsKKwkJYnJlYWs7CisJY2FzZSBTUFJOX0hJT1I6CisJCXRvX2Jvb2szcyh2Y3B1KS0+aGlvciA9IHZjcHUtPmFyY2guZ3ByW3JzXTsKKwkJYnJlYWs7CisJY2FzZSBTUFJOX0lCQVQwVSAuLi4gU1BSTl9JQkFUM0w6CisJY2FzZSBTUFJOX0lCQVQ0VSAuLi4gU1BSTl9JQkFUN0w6CisJY2FzZSBTUFJOX0RCQVQwVSAuLi4gU1BSTl9EQkFUM0w6CisJY2FzZSBTUFJOX0RCQVQ0VSAuLi4gU1BSTl9EQkFUN0w6CisJCWt2bXBwY193cml0ZV9iYXQodmNwdSwgc3BybiwgKHUzMil2Y3B1LT5hcmNoLmdwcltyc10pOworCQkvKiBCQVQgd3JpdGVzIGhhcHBlbiBzbyByYXJlbHkgdGhhdCB3ZSdyZSBvayB0byBmbHVzaAorCQkgKiBldmVyeXRoaW5nIGhlcmUgKi8KKwkJa3ZtcHBjX21tdV9wdGVfZmx1c2godmNwdSwgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgU1BSTl9ISUQwOgorCQl0b19ib29rM3ModmNwdSktPmhpZFswXSA9IHZjcHUtPmFyY2guZ3ByW3JzXTsKKwkJYnJlYWs7CisJY2FzZSBTUFJOX0hJRDE6CisJCXRvX2Jvb2szcyh2Y3B1KS0+aGlkWzFdID0gdmNwdS0+YXJjaC5ncHJbcnNdOworCQlicmVhazsKKwljYXNlIFNQUk5fSElEMjoKKwkJdG9fYm9vazNzKHZjcHUpLT5oaWRbMl0gPSB2Y3B1LT5hcmNoLmdwcltyc107CisJCWJyZWFrOworCWNhc2UgU1BSTl9ISUQ0OgorCQl0b19ib29rM3ModmNwdSktPmhpZFs0XSA9IHZjcHUtPmFyY2guZ3ByW3JzXTsKKwkJYnJlYWs7CisJY2FzZSBTUFJOX0hJRDU6CisJCXRvX2Jvb2szcyh2Y3B1KS0+aGlkWzVdID0gdmNwdS0+YXJjaC5ncHJbcnNdOworCQkvKiBndWVzdCBISUQ1IHNldCBjYW4gY2hhbmdlIGlzX2RjYnozMiAqLworCQlpZiAodmNwdS0+YXJjaC5tbXUuaXNfZGNiejMyKHZjcHUpICYmCisJCSAgICAobWZtc3IoKSAmIE1TUl9IVikpCisJCQl2Y3B1LT5hcmNoLmhmbGFncyB8PSBCT09LM1NfSEZMQUdfRENCWjMyOworCQlicmVhazsKKwljYXNlIFNQUk5fSUNUQzoKKwljYXNlIFNQUk5fVEhSTTE6CisJY2FzZSBTUFJOX1RIUk0yOgorCWNhc2UgU1BSTl9USFJNMzoKKwljYXNlIFNQUk5fQ1RSTEY6CisJY2FzZSBTUFJOX0NUUkxUOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9JTkZPICJLVk06IGludmFsaWQgU1BSIHdyaXRlOiAlZFxuIiwgc3Bybik7CisjaWZuZGVmIERFQlVHX1NQUgorCQllbXVsYXRlZCA9IEVNVUxBVEVfRkFJTDsKKyNlbmRpZgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZW11bGF0ZWQ7Cit9CisKK2ludCBrdm1wcGNfY29yZV9lbXVsYXRlX21mc3ByKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IHNwcm4sIGludCBydCkKK3sKKwlpbnQgZW11bGF0ZWQgPSBFTVVMQVRFX0RPTkU7CisKKwlzd2l0Y2ggKHNwcm4pIHsKKwljYXNlIFNQUk5fU0RSMToKKwkJdmNwdS0+YXJjaC5ncHJbcnRdID0gdG9fYm9vazNzKHZjcHUpLT5zZHIxOworCQlicmVhazsKKwljYXNlIFNQUk5fRFNJU1I6CisJCXZjcHUtPmFyY2guZ3ByW3J0XSA9IHRvX2Jvb2szcyh2Y3B1KS0+ZHNpc3I7CisJCWJyZWFrOworCWNhc2UgU1BSTl9EQVI6CisJCXZjcHUtPmFyY2guZ3ByW3J0XSA9IHZjcHUtPmFyY2guZGVhcjsKKwkJYnJlYWs7CisJY2FzZSBTUFJOX0hJT1I6CisJCXZjcHUtPmFyY2guZ3ByW3J0XSA9IHRvX2Jvb2szcyh2Y3B1KS0+aGlvcjsKKwkJYnJlYWs7CisJY2FzZSBTUFJOX0hJRDA6CisJCXZjcHUtPmFyY2guZ3ByW3J0XSA9IHRvX2Jvb2szcyh2Y3B1KS0+aGlkWzBdOworCQlicmVhazsKKwljYXNlIFNQUk5fSElEMToKKwkJdmNwdS0+YXJjaC5ncHJbcnRdID0gdG9fYm9vazNzKHZjcHUpLT5oaWRbMV07CisJCWJyZWFrOworCWNhc2UgU1BSTl9ISUQyOgorCQl2Y3B1LT5hcmNoLmdwcltydF0gPSB0b19ib29rM3ModmNwdSktPmhpZFsyXTsKKwkJYnJlYWs7CisJY2FzZSBTUFJOX0hJRDQ6CisJCXZjcHUtPmFyY2guZ3ByW3J0XSA9IHRvX2Jvb2szcyh2Y3B1KS0+aGlkWzRdOworCQlicmVhazsKKwljYXNlIFNQUk5fSElENToKKwkJdmNwdS0+YXJjaC5ncHJbcnRdID0gdG9fYm9vazNzKHZjcHUpLT5oaWRbNV07CisJCWJyZWFrOworCWNhc2UgU1BSTl9USFJNMToKKwljYXNlIFNQUk5fVEhSTTI6CisJY2FzZSBTUFJOX1RIUk0zOgorCWNhc2UgU1BSTl9DVFJMRjoKKwljYXNlIFNQUk5fQ1RSTFQ6CisJCXZjcHUtPmFyY2guZ3ByW3J0XSA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0lORk8gIktWTTogaW52YWxpZCBTUFIgcmVhZDogJWRcbiIsIHNwcm4pOworI2lmbmRlZiBERUJVR19TUFIKKwkJZW11bGF0ZWQgPSBFTVVMQVRFX0ZBSUw7CisjZW5kaWYKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVtdWxhdGVkOworfQorCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc182NF9leHBvcnRzLmMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc182NF9leHBvcnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIyZGIzOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzXzY0X2V4cG9ydHMuYwpAQCAtMCwwICsxLDI0IEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCisgKgorICogQ29weXJpZ2h0IFNVU0UgTGludXggUHJvZHVjdHMgR21iSCAyMDA5CisgKgorICogQXV0aG9yczogQWxleGFuZGVyIEdyYWYgPGFncmFmQHN1c2UuZGU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS9rdm1fYm9vazNzLmg+CisKK0VYUE9SVF9TWU1CT0xfR1BMKGt2bXBwY190cmFtcG9saW5lX2VudGVyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGt2bXBwY190cmFtcG9saW5lX2xvd21lbSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc182NF9pbnRlcnJ1cHRzLlMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc182NF9pbnRlcnJ1cHRzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I1NWQ4MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzXzY0X2ludGVycnVwdHMuUwpAQCAtMCwwICsxLDM5MiBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqIENvcHlyaWdodCBTVVNFIExpbnV4IFByb2R1Y3RzIEdtYkggMjAwOQorICoKKyAqIEF1dGhvcnM6IEFsZXhhbmRlciBHcmFmIDxhZ3JhZkBzdXNlLmRlPgorICovCisKKyNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgorI2luY2x1ZGUgPGFzbS9rdm1fYXNtLmg+CisjaW5jbHVkZSA8YXNtL3JlZy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2V4Y2VwdGlvbi02NHMuaD4KKworI2RlZmluZSBLVk1QUENfSEFORExFX0VYSVQgLmt2bXBwY19oYW5kbGVfZXhpdAorI2RlZmluZSBVTE9OR19TSVpFIDgKKyNkZWZpbmUgVkNQVV9HUFIobikgICAgIChWQ1BVX0dQUlMgKyAobiAqIFVMT05HX1NJWkUpKQorCisubWFjcm8gbWZwYWNhIHRtcF9yZWcsIHNyY19yZWcsIG9mZnNldCwgdmNwdV9yZWcKKwlsZAlcdG1wX3JlZywgKFBBQ0FfRVhNQytcb2Zmc2V0KShyMTMpCisJc3RkCVx0bXBfcmVnLCBWQ1BVX0dQUihcc3JjX3JlZykoXHZjcHVfcmVnKQorLmVuZG0KKworLm1hY3JvIERJU0FCTEVfSU5URVJSVVBUUworICAgICAgIG1mbXNyICAgcjAKKyAgICAgICBybGRpY2wgIHIwLHIwLDQ4LDEKKyAgICAgICByb3RsZGkgIHIwLHIwLDE2CisgICAgICAgbXRtc3JkICByMCwxCisuZW5kbQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgIEd1ZXN0IGVudHJ5IC8gZXhpdCBjb2RlIHRoYXQgaXMgaW4ga2VybmVsIG1vZHVsZSBtZW1vcnkgKGhpZ2htZW0pICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBSZWdpc3RlcnM6CisgKiAgcjM6IGt2bV9ydW4gcG9pbnRlcgorICogIHI0OiB2Y3B1IHBvaW50ZXIKKyAqLworX0dMT0JBTChfX2t2bXBwY192Y3B1X2VudHJ5KQorCitrdm1fc3RhcnRfZW50cnk6CisJLyogV3JpdGUgY29ycmVjdCBzdGFjayBmcmFtZSAqLworCW1mbHIgICAgcjAKKwlzdGQgICAgIHIwLDE2KHIxKQorCisJLyogU2F2ZSBob3N0IHN0YXRlIHRvIHRoZSBzdGFjayAqLworCXN0ZHUJcjEsIC1TV0lUQ0hfRlJBTUVfU0laRShyMSkKKworCS8qIFNhdmUgcjMgKGt2bV9ydW4pIGFuZCByNCAodmNwdSkgKi8KKwlTQVZFXzJHUFJTKDMsIHIxKQorCisJLyogU2F2ZSBub24tdm9sYXRpbGUgcmVnaXN0ZXJzIChyMTQgLSByMzEpICovCisJU0FWRV9OVkdQUlMocjEpCisKKwkvKiBTYXZlIExSICovCisJbWZscglyMTQKKwlzdGQJcjE0LCBfTElOSyhyMSkKKworLyogWFhYIG9wdGltaXplIG5vbi12b2xhdGlsZSBsb2FkaW5nIGF3YXkgKi8KK2t2bV9zdGFydF9saWdodHdlaWdodDoKKworCURJU0FCTEVfSU5URVJSVVBUUworCisJLyogU2F2ZSBSMS9SMiBpbiB0aGUgUEFDQSAqLworCXN0ZAlyMSwgUEFDQVIxKHIxMykKKwlzdGQJcjIsIChQQUNBX0VYTUMrRVhfU1JSMCkocjEzKQorCWxkCXIzLCBWQ1BVX0hJR0hNRU1fSEFORExFUihyNCkKKwlzdGQJcjMsIFBBQ0FTQVZFRE1TUihyMTMpCisKKwkvKiBMb2FkIG5vbi12b2xhdGlsZSBndWVzdCBzdGF0ZSBmcm9tIHRoZSB2Y3B1ICovCisJbGQJcjE0LCBWQ1BVX0dQUihyMTQpKHI0KQorCWxkCXIxNSwgVkNQVV9HUFIocjE1KShyNCkKKwlsZAlyMTYsIFZDUFVfR1BSKHIxNikocjQpCisJbGQJcjE3LCBWQ1BVX0dQUihyMTcpKHI0KQorCWxkCXIxOCwgVkNQVV9HUFIocjE4KShyNCkKKwlsZAlyMTksIFZDUFVfR1BSKHIxOSkocjQpCisJbGQJcjIwLCBWQ1BVX0dQUihyMjApKHI0KQorCWxkCXIyMSwgVkNQVV9HUFIocjIxKShyNCkKKwlsZAlyMjIsIFZDUFVfR1BSKHIyMikocjQpCisJbGQJcjIzLCBWQ1BVX0dQUihyMjMpKHI0KQorCWxkCXIyNCwgVkNQVV9HUFIocjI0KShyNCkKKwlsZAlyMjUsIFZDUFVfR1BSKHIyNSkocjQpCisJbGQJcjI2LCBWQ1BVX0dQUihyMjYpKHI0KQorCWxkCXIyNywgVkNQVV9HUFIocjI3KShyNCkKKwlsZAlyMjgsIFZDUFVfR1BSKHIyOCkocjQpCisJbGQJcjI5LCBWQ1BVX0dQUihyMjkpKHI0KQorCWxkCXIzMCwgVkNQVV9HUFIocjMwKShyNCkKKwlsZAlyMzEsIFZDUFVfR1BSKHIzMSkocjQpCisKKwlsZAlyOSwgVkNQVV9QQyhyNCkJCQkvKiByOSA9IHZjcHUtPmFyY2gucGMgKi8KKwlsZAlyMTAsIFZDUFVfU0hBRE9XX01TUihyNCkJLyogcjEwID0gdmNwdS0+YXJjaC5zaGFkb3dfbXNyICovCisKKwlsZAlyMywgVkNQVV9UUkFNUE9MSU5FX0VOVEVSKHI0KQorCW10c3JyMAlyMworCisJTE9BRF9SRUdfSU1NRURJQVRFKHIzLCBNU1JfS0VSTkVMICYgfihNU1JfSVIgfCBNU1JfRFIpKQorCW10c3JyMQlyMworCisJLyogTG9hZCBndWVzdCBzdGF0ZSBpbiB0aGUgcmVzcGVjdGl2ZSByZWdpc3RlcnMgKi8KKwlsd3oJcjMsIFZDUFVfQ1IocjQpCQkvKiByMyA9IHZjcHUtPmFyY2guY3IgKi8KKwlzdHcJcjMsIChQQUNBX0VYTUMgKyBFWF9DQ1IpKHIxMykKKworCWxkCXIzLCBWQ1BVX0NUUihyNCkJLyogcjMgPSB2Y3B1LT5hcmNoLmN0ciAqLworCW10Y3RyCXIzCQkJLyogQ1RSID0gcjMgKi8KKworCWxkCXIzLCBWQ1BVX0xSKHI0KQkJLyogcjMgPSB2Y3B1LT5hcmNoLmxyICovCisJbXRscglyMwkJCS8qIExSID0gcjMgKi8KKworCWxkCXIzLCBWQ1BVX1hFUihyNCkJLyogcjMgPSB2Y3B1LT5hcmNoLnhlciAqLworCXN0ZAlyMywgKFBBQ0FfRVhNQyArIEVYX1IzKShyMTMpCisKKwkvKiBTb21lIGd1ZXN0cyBtYXkgbmVlZCB0byBoYXZlIGRjYnogc2V0IHRvIDMyIGJ5dGUgbGVuZ3RoLgorCSAqCisJICogVXN1YWxseSB3ZSBlbnN1cmUgdGhhdCBieSBwYXRjaGluZyB0aGUgZ3Vlc3QncyBpbnN0cnVjdGlvbnMKKwkgKiB0byB0cmFwIG9uIGRjYnogYW5kIGVtdWxhdGUgaXQgaW4gdGhlIGh5cGVydmlzb3IuCisJICoKKwkgKiBJZiB3ZSBjYW4sIHdlIHNob3VsZCB0ZWxsIHRoZSBDUFUgdG8gdXNlIDMyIGJ5dGUgZGNieiB0aG91Z2gsCisJICogYmVjYXVzZSB0aGF0J3MgYSBsb3QgZmFzdGVyLgorCSAqLworCisJbGQJcjMsIFZDUFVfSEZMQUdTKHI0KQorCXJsZGljbC4JcjMsIHIzLCAwLCA2MwkJLyogQ1IgPSAoKHIzICYgMSkgPT0gMCkgKi8KKwliZXEJbm9fZGNiejMyX29uCisKKwltZnNwciAgIHIzLFNQUk5fSElENQorCW9yaSAgICAgcjMsIHIzLCAweDgwCQkvKiBYWFggSElENV9kY2J6MzIgPSAweDgwICovCisJbXRzcHIgICBTUFJOX0hJRDUscjMKKworbm9fZGNiejMyX29uOgorCS8qCUxvYWQgZ3Vlc3QgR1BScyAqLworCisJbGQJcjMsIFZDUFVfR1BSKHI5KShyNCkKKwlzdGQJcjMsIChQQUNBX0VYTUMgKyBFWF9SOSkocjEzKQorCWxkCXIzLCBWQ1BVX0dQUihyMTApKHI0KQorCXN0ZAlyMywgKFBBQ0FfRVhNQyArIEVYX1IxMCkocjEzKQorCWxkCXIzLCBWQ1BVX0dQUihyMTEpKHI0KQorCXN0ZAlyMywgKFBBQ0FfRVhNQyArIEVYX1IxMSkocjEzKQorCWxkCXIzLCBWQ1BVX0dQUihyMTIpKHI0KQorCXN0ZAlyMywgKFBBQ0FfRVhNQyArIEVYX1IxMikocjEzKQorCWxkCXIzLCBWQ1BVX0dQUihyMTMpKHI0KQorCXN0ZAlyMywgKFBBQ0FfRVhNQyArIEVYX1IxMykocjEzKQorCisJbGQJcjAsIFZDUFVfR1BSKHIwKShyNCkKKwlsZAlyMSwgVkNQVV9HUFIocjEpKHI0KQorCWxkCXIyLCBWQ1BVX0dQUihyMikocjQpCisJbGQJcjMsIFZDUFVfR1BSKHIzKShyNCkKKwlsZAlyNSwgVkNQVV9HUFIocjUpKHI0KQorCWxkCXI2LCBWQ1BVX0dQUihyNikocjQpCisJbGQJcjcsIFZDUFVfR1BSKHI3KShyNCkKKwlsZAlyOCwgVkNQVV9HUFIocjgpKHI0KQorCWxkCXI0LCBWQ1BVX0dQUihyNCkocjQpCisKKwkvKiBUaGlzIHNldHMgdGhlIE1hZ2ljIHZhbHVlIGZvciB0aGUgdHJhbXBvbGluZSAqLworCisJbGkJcjExLCAxCisJc3RiCXIxMSwgUEFDQV9LVk1fSU5fR1VFU1QocjEzKQorCisJLyogSnVtcCB0byBTTEIgcGF0Y2hpbmcgaGFuZGxkZXIgYW5kIGludG8gb3VyIGd1ZXN0ICovCisJUkZJCisKKy8qCisgKiBUaGlzIGlzIHRoZSBoYW5kbGVyIGluIG1vZHVsZSBtZW1vcnkuIEl0IGdldHMganVtcGVkIGF0IGZyb20gdGhlCisgKiBsb3dtZW0gdHJhbXBvbGluZSBjb2RlLCBzbyBpdCdzIGJhc2ljYWxseSB0aGUgZ3Vlc3QgZXhpdCBjb2RlLgorICoKKyAqLworCisuZ2xvYmFsIGt2bXBwY19oYW5kbGVyX2hpZ2htZW0KK2t2bXBwY19oYW5kbGVyX2hpZ2htZW06CisKKwkvKgorCSAqIFJlZ2lzdGVyIHVzYWdlIGF0IHRoaXMgcG9pbnQ6CisJICoKKwkgKiBSMDAgICA9IGd1ZXN0IFIxMworCSAqIFIwMSAgID0gaG9zdCBSMQorCSAqIFIwMiAgID0gaG9zdCBSMgorCSAqIFIxMCAgID0gZ3Vlc3QgUEMKKwkgKiBSMTEgICA9IGd1ZXN0IE1TUgorCSAqIFIxMiAgID0gZXhpdCBoYW5kbGVyIGlkCisJICogUjEzICAgPSBQQUNBCisJICogUEFDQS5leG1jLlI5ICAgID0gZ3Vlc3QgUjEKKwkgKiBQQUNBLmV4bWMuUjEwICAgPSBndWVzdCBSMTAKKwkgKiBQQUNBLmV4bWMuUjExICAgPSBndWVzdCBSMTEKKwkgKiBQQUNBLmV4bWMuUjEyICAgPSBndWVzdCBSMTIKKwkgKiBQQUNBLmV4bWMuUjEzICAgPSBndWVzdCBSMgorCSAqIFBBQ0EuZXhtYy5EQVIgICA9IGd1ZXN0IERBUgorCSAqIFBBQ0EuZXhtYy5EU0lTUiA9IGd1ZXN0IERTSVNSCisJICogUEFDQS5leG1jLkxSICAgID0gZ3Vlc3QgaW5zdHJ1Y3Rpb24KKwkgKiBQQUNBLmV4bWMuQ0NSICAgPSBndWVzdCBDUgorCSAqIFBBQ0EuZXhtYy5TUlIwICA9IGd1ZXN0IFIwCisJICoKKwkgKi8KKworCXN0ZAlyMywgKFBBQ0FfRVhNQytFWF9SMykocjEzKQorCisJLyogc2F2ZSB0aGUgZXhpdCBpZCBpbiBSMyAqLworCW1yCXIzLCByMTIKKworCS8qIFIxMiA9IHZjcHUgKi8KKwlsZAlyMTIsIEdQUjQocjEpCisKKwkvKiBOb3cgc2F2ZSB0aGUgZ3Vlc3Qgc3RhdGUgKi8KKworCXN0ZAlyMCwgVkNQVV9HUFIocjEzKShyMTIpCisJc3RkCXI0LCBWQ1BVX0dQUihyNCkocjEyKQorCXN0ZAlyNSwgVkNQVV9HUFIocjUpKHIxMikKKwlzdGQJcjYsIFZDUFVfR1BSKHI2KShyMTIpCisJc3RkCXI3LCBWQ1BVX0dQUihyNykocjEyKQorCXN0ZAlyOCwgVkNQVV9HUFIocjgpKHIxMikKKwlzdGQJcjksIFZDUFVfR1BSKHI5KShyMTIpCisKKwkvKiBnZXQgcmVnaXN0ZXJzIGZyb20gUEFDQSAqLworCW1mcGFjYQlyNSwgcjAsIEVYX1NSUjAsIHIxMgorCW1mcGFjYQlyNSwgcjMsIEVYX1IzLCByMTIKKwltZnBhY2EJcjUsIHIxLCBFWF9SOSwgcjEyCisJbWZwYWNhCXI1LCByMTAsIEVYX1IxMCwgcjEyCisJbWZwYWNhCXI1LCByMTEsIEVYX1IxMSwgcjEyCisJbWZwYWNhCXI1LCByMTIsIEVYX1IxMiwgcjEyCisJbWZwYWNhCXI1LCByMiwgRVhfUjEzLCByMTIKKworCWx3eglyNSwgKFBBQ0FfRVhNQytFWF9MUikocjEzKQorCXN0dwlyNSwgVkNQVV9MQVNUX0lOU1QocjEyKQorCisJbHd6CXI1LCAoUEFDQV9FWE1DK0VYX0NDUikocjEzKQorCXN0dwlyNSwgVkNQVV9DUihyMTIpCisKKwlsZAlyNSwgVkNQVV9IRkxBR1MocjEyKQorCXJsZGljbC4JcjUsIHI1LCAwLCA2MwkJLyogQ1IgPSAoKHI1ICYgMSkgPT0gMCkgKi8KKwliZXEJbm9fZGNiejMyX29mZgorCisJbWZzcHIgICByNSxTUFJOX0hJRDUKKwlybGRpbWkgIHI1LHI1LDYsNTYKKwltdHNwciAgIFNQUk5fSElENSxyNQorCitub19kY2J6MzJfb2ZmOgorCisJLyogWFhYIG1heWJlIHNraXAgb24gbGlnaHR3ZWlnaHQ/ICovCisJc3RkCXIxNCwgVkNQVV9HUFIocjE0KShyMTIpCisJc3RkCXIxNSwgVkNQVV9HUFIocjE1KShyMTIpCisJc3RkCXIxNiwgVkNQVV9HUFIocjE2KShyMTIpCisJc3RkCXIxNywgVkNQVV9HUFIocjE3KShyMTIpCisJc3RkCXIxOCwgVkNQVV9HUFIocjE4KShyMTIpCisJc3RkCXIxOSwgVkNQVV9HUFIocjE5KShyMTIpCisJc3RkCXIyMCwgVkNQVV9HUFIocjIwKShyMTIpCisJc3RkCXIyMSwgVkNQVV9HUFIocjIxKShyMTIpCisJc3RkCXIyMiwgVkNQVV9HUFIocjIyKShyMTIpCisJc3RkCXIyMywgVkNQVV9HUFIocjIzKShyMTIpCisJc3RkCXIyNCwgVkNQVV9HUFIocjI0KShyMTIpCisJc3RkCXIyNSwgVkNQVV9HUFIocjI1KShyMTIpCisJc3RkCXIyNiwgVkNQVV9HUFIocjI2KShyMTIpCisJc3RkCXIyNywgVkNQVV9HUFIocjI3KShyMTIpCisJc3RkCXIyOCwgVkNQVV9HUFIocjI4KShyMTIpCisJc3RkCXIyOSwgVkNQVV9HUFIocjI5KShyMTIpCisJc3RkCXIzMCwgVkNQVV9HUFIocjMwKShyMTIpCisJc3RkCXIzMSwgVkNQVV9HUFIocjMxKShyMTIpCisKKwkvKiBSZXN0b3JlIG5vbi12b2xhdGlsZSBob3N0IHJlZ2lzdGVycyAocjE0IC0gcjMxKSAqLworCVJFU1RfTlZHUFJTKHIxKQorCisJLyogU2F2ZSBndWVzdCBQQyAoUjEwKSAqLworCXN0ZAlyMTAsIFZDUFVfUEMocjEyKQorCisJLyogU2F2ZSBndWVzdCBtc3IgKFIxMSkgKi8KKwlzdGQJcjExLCBWQ1BVX1NIQURPV19NU1IocjEyKQorCisJLyogU2F2ZSBndWVzdCBDVFIgKGluIFIxMikgKi8KKwltZmN0cglyNQorCXN0ZAlyNSwgVkNQVV9DVFIocjEyKQorCisJLyogU2F2ZSBndWVzdCBMUiAqLworCW1mbHIJcjUKKwlzdGQJcjUsIFZDUFVfTFIocjEyKQorCisJLyogU2F2ZSBndWVzdCBYRVIgKi8KKwltZnhlcglyNQorCXN0ZAlyNSwgVkNQVV9YRVIocjEyKQorCisJLyogU2F2ZSBndWVzdCBEQVIgKi8KKwlsZAlyNSwgKFBBQ0FfRVhNQytFWF9EQVIpKHIxMykKKwlzdGQJcjUsIFZDUFVfRkFVTFRfREVBUihyMTIpCisKKwkvKiBTYXZlIGd1ZXN0IERTSVNSICovCisJbHd6CXI1LCAoUEFDQV9FWE1DK0VYX0RTSVNSKShyMTMpCisJc3RkCXI1LCBWQ1BVX0ZBVUxUX0RTSVNSKHIxMikKKworCS8qIFJlc3RvcmUgaG9zdCBtc3IgLT4gU1JSMSAqLworCWxkCXI3LCBWQ1BVX0hPU1RfTVNSKHIxMikKKwltdHNycjEJcjcKKworCS8qIFJlc3RvcmUgaG9zdCBJUCAtPiBTUlIwICovCisJbGQJcjYsIFZDUFVfSE9TVF9SRVRJUChyMTIpCisJbXRzcnIwCXI2CisKKwkvKgorCSAqIEZvciBzb21lIGludGVycnVwdHMsIHdlIG5lZWQgdG8gY2FsbCB0aGUgcmVhbCBMaW51eAorCSAqIGhhbmRsZXIsIHNvIGl0IGNhbiBkbyB3b3JrIGZvciB1cy4gVGhpcyBoYXMgdG8gaGFwcGVuCisJICogYXMgaWYgdGhlIGludGVycnVwdCBhcnJpdmVkIGZyb20gdGhlIGtlcm5lbCB0aG91Z2gsCisJICogc28gbGV0J3MgZmFrZSBpdCBoZXJlIHdoZXJlIG1vc3Qgc3RhdGUgaXMgcmVzdG9yZWQuCisJICoKKwkgKiBDYWxsIExpbnV4IGZvciBoYXJkd2FyZSBpbnRlcnJ1cHRzL2RlY3JlbWVudGVyCisJICogcjMgPSBhZGRyZXNzIG9mIGludGVycnVwdCBoYW5kbGVyIChleGl0IHJlYXNvbikKKwkgKi8KKworCWNtcHdpCXIzLCBCT09LM1NfSU5URVJSVVBUX0VYVEVSTkFMCisJYmVxCWNhbGxfbGludXhfaGFuZGxlcgorCWNtcHdpCXIzLCBCT09LM1NfSU5URVJSVVBUX0RFQ1JFTUVOVEVSCisJYmVxCWNhbGxfbGludXhfaGFuZGxlcgorCisJLyogQmFjayB0byBJbnRlcnJ1cHRhYmxlIE1vZGUhIChnb3RvIGt2bV9yZXR1cm5fcG9pbnQpICovCisJUkZJCisKK2NhbGxfbGludXhfaGFuZGxlcjoKKworCS8qCisJICogSWYgd2UgbGFuZCBoZXJlIHdlIG5lZWQgdG8ganVtcCBiYWNrIHRvIHRoZSBoYW5kbGVyIHdlCisJICogY2FtZSBmcm9tLgorCSAqCisJICogV2UgaGF2ZSBhIHBhZ2UgdGhhdCB3ZSBjYW4gYWNjZXNzIGZyb20gcmVhbCBtb2RlLCBzbyBsZXQncworCSAqIGp1bXAgYmFjayB0byB0aGF0IGFuZCB1c2UgaXQgYXMgYSB0cmFtcG9saW5lIHRvIGdldCBiYWNrIGludG8gdGhlCisJICogaW50ZXJydXB0IGhhbmRsZXIhCisJICoKKwkgKiBSMyBzdGlsbCBjb250YWlucyB0aGUgZXhpdCBjb2RlLAorCSAqIFI2IFZDUFVfSE9TVF9SRVRJUCBhbmQKKwkgKiBSNyBWQ1BVX0hPU1RfTVNSCisJICovCisKKwltdGxyCXIzCisKKwlsZAlyNSwgVkNQVV9UUkFNUE9MSU5FX0xPV01FTShyMTIpCisJbXRzcnIwCXI1CisJTE9BRF9SRUdfSU1NRURJQVRFKHI1LCBNU1JfS0VSTkVMICYgfihNU1JfSVIgfCBNU1JfRFIpKQorCW10c3JyMQlyNQorCisJUkZJCisKKy5nbG9iYWwga3ZtX3JldHVybl9wb2ludAora3ZtX3JldHVybl9wb2ludDoKKworCS8qIEp1bXAgYmFjayB0byBsaWdodHdlaWdodCBlbnRyeSBpZiB3ZSdyZSBzdXBwb3NlZCB0byAqLworCS8qIGdvIGJhY2sgaW50byB0aGUgZ3Vlc3QgKi8KKwltcglyNSwgcjMKKwkvKiBSZXN0b3JlIHIzIChrdm1fcnVuKSBhbmQgcjQgKHZjcHUpICovCisJUkVTVF8yR1BSUygzLCByMSkKKwlibAlLVk1QUENfSEFORExFX0VYSVQKKworI2lmIDAgLyogWFhYIGdldCBsaWdodHdlaWdodCBleGl0cyBiYWNrICovCisJY21wd2kJcjMsIFJFU1VNRV9HVUVTVAorCWJuZQlrdm1fZXhpdF9oZWF2eXdlaWdodAorCisJLyogcHV0IFZDUFUgYW5kIEtWTV9SVU4gYmFjayBpbnRvIHBsYWNlIGFuZCByb2xsIGFnYWluISAqLworCVJFU1RfMkdQUlMoMywgcjEpCisJYglrdm1fc3RhcnRfbGlnaHR3ZWlnaHQKKwora3ZtX2V4aXRfaGVhdnl3ZWlnaHQ6CisJLyogUmVzdG9yZSBub24tdm9sYXRpbGUgaG9zdCByZWdpc3RlcnMgKi8KKwlsZAlyMTQsIF9MSU5LKHIxKQorCW10bHIJcjE0CisJUkVTVF9OVkdQUlMocjEpCisKKwlhZGRpICAgIHIxLCByMSwgU1dJVENIX0ZSQU1FX1NJWkUKKyNlbHNlCisJbGQJcjQsIF9MSU5LKHIxKQorCW10bHIJcjQKKworCWNtcHdpCXIzLCBSRVNVTUVfR1VFU1QKKwlibmUJa3ZtX2V4aXRfaGVhdnl3ZWlnaHQKKworCVJFU1RfMkdQUlMoMywgcjEpCisKKwlhZGRpICAgIHIxLCByMSwgU1dJVENIX0ZSQU1FX1NJWkUKKworCWIJa3ZtX3N0YXJ0X2VudHJ5CisKK2t2bV9leGl0X2hlYXZ5d2VpZ2h0OgorCisJYWRkaSAgICByMSwgcjEsIFNXSVRDSF9GUkFNRV9TSVpFCisjZW5kaWYKKworCWJscgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfNjRfbW11LmMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc182NF9tbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTk4Zjg4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfNjRfbW11LmMKQEAgLTAsMCArMSw0NzggQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKiBDb3B5cmlnaHQgU1VTRSBMaW51eCBQcm9kdWN0cyBHbWJIIDIwMDkKKyAqCisgKiBBdXRob3JzOiBBbGV4YW5kZXIgR3JhZiA8YWdyYWZAc3VzZS5kZT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rdm0uaD4KKyNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKworI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9rdm1fcHBjLmg+CisjaW5jbHVkZSA8YXNtL2t2bV9ib29rM3MuaD4KKworLyogI2RlZmluZSBERUJVR19NTVUgKi8KKworI2lmZGVmIERFQlVHX01NVQorI2RlZmluZSBkcHJpbnRrKFguLi4pIHByaW50ayhLRVJOX0lORk8gWCkKKyNlbHNlCisjZGVmaW5lIGRwcmludGsoWC4uLikgZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworc3RhdGljIHZvaWQga3ZtcHBjX21tdV9ib29rM3NfNjRfcmVzZXRfbXNyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlrdm1wcGNfc2V0X21zcih2Y3B1LCBNU1JfU0YpOworfQorCitzdGF0aWMgc3RydWN0IGt2bXBwY19zbGIgKmt2bXBwY19tbXVfYm9vazNzXzY0X2ZpbmRfc2xiZSgKKwkJCQlzdHJ1Y3Qga3ZtcHBjX3ZjcHVfYm9vazNzICp2Y3B1X2Jvb2szcywKKwkJCQlndmFfdCBlYWRkcikKK3sKKwlpbnQgaTsKKwl1NjQgZXNpZCA9IEdFVF9FU0lEKGVhZGRyKTsKKwl1NjQgZXNpZF8xdCA9IEdFVF9FU0lEXzFUKGVhZGRyKTsKKworCWZvciAoaSA9IDA7IGkgPCB2Y3B1X2Jvb2szcy0+c2xiX25yOyBpKyspIHsKKwkJdTY0IGNtcF9lc2lkID0gZXNpZDsKKworCQlpZiAoIXZjcHVfYm9vazNzLT5zbGJbaV0udmFsaWQpCisJCQljb250aW51ZTsKKworCQlpZiAodmNwdV9ib29rM3MtPnNsYltpXS5sYXJnZSkKKwkJCWNtcF9lc2lkID0gZXNpZF8xdDsKKworCQlpZiAodmNwdV9ib29rM3MtPnNsYltpXS5lc2lkID09IGNtcF9lc2lkKQorCQkJcmV0dXJuICZ2Y3B1X2Jvb2szcy0+c2xiW2ldOworCX0KKworCWRwcmludGsoIktWTTogTm8gU0xCIGVudHJ5IGZvdW5kIGZvciAweCVseCBbJWxseCB8ICVsbHhdXG4iLAorCQllYWRkciwgZXNpZCwgZXNpZF8xdCk7CisJZm9yIChpID0gMDsgaSA8IHZjcHVfYm9vazNzLT5zbGJfbnI7IGkrKykgeworCSAgICBpZiAodmNwdV9ib29rM3MtPnNsYltpXS52c2lkKQorCQlkcHJpbnRrKCIgICVkOiAlYyVjICVsbHggJWxseFxuIiwgaSwKKwkJCXZjcHVfYm9vazNzLT5zbGJbaV0udmFsaWQgPyAndicgOiAnICcsCisJCQl2Y3B1X2Jvb2szcy0+c2xiW2ldLmxhcmdlID8gJ2wnIDogJyAnLAorCQkJdmNwdV9ib29rM3MtPnNsYltpXS5lc2lkLAorCQkJdmNwdV9ib29rM3MtPnNsYltpXS52c2lkKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHU2NCBrdm1wcGNfbW11X2Jvb2szc182NF9lYV90b192cChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IGVhZGRyLAorCQkJCQkgYm9vbCBkYXRhKQoreworCXN0cnVjdCBrdm1wcGNfc2xiICpzbGI7CisKKwlzbGIgPSBrdm1wcGNfbW11X2Jvb2szc182NF9maW5kX3NsYmUodG9fYm9vazNzKHZjcHUpLCBlYWRkcik7CisJaWYgKCFzbGIpCisJCXJldHVybiAwOworCisJaWYgKHNsYi0+bGFyZ2UpCisJCXJldHVybiAoKCh1NjQpZWFkZHIgPj4gMTIpICYgMHhmZmZmZmZmKSB8CisJCSAgICAgICAoKCh1NjQpc2xiLT52c2lkKSA8PCAyOCk7CisKKwlyZXR1cm4gKCgodTY0KWVhZGRyID4+IDEyKSAmIDB4ZmZmZikgfCAoKCh1NjQpc2xiLT52c2lkKSA8PCAxNik7Cit9CisKK3N0YXRpYyBpbnQga3ZtcHBjX21tdV9ib29rM3NfNjRfZ2V0X3BhZ2VzaXplKHN0cnVjdCBrdm1wcGNfc2xiICpzbGJlKQoreworCXJldHVybiBzbGJlLT5sYXJnZSA/IDI0IDogMTI7Cit9CisKK3N0YXRpYyB1MzIga3ZtcHBjX21tdV9ib29rM3NfNjRfZ2V0X3BhZ2Uoc3RydWN0IGt2bXBwY19zbGIgKnNsYmUsIGd2YV90IGVhZGRyKQoreworCWludCBwID0ga3ZtcHBjX21tdV9ib29rM3NfNjRfZ2V0X3BhZ2VzaXplKHNsYmUpOworCXJldHVybiAoKGVhZGRyICYgMHhmZmZmZmZmKSA+PiBwKTsKK30KKworc3RhdGljIGh2YV90IGt2bXBwY19tbXVfYm9vazNzXzY0X2dldF9wdGVnKAorCQkJCXN0cnVjdCBrdm1wcGNfdmNwdV9ib29rM3MgKnZjcHVfYm9vazNzLAorCQkJCXN0cnVjdCBrdm1wcGNfc2xiICpzbGJlLCBndmFfdCBlYWRkciwKKwkJCQlib29sIHNlY29uZCkKK3sKKwl1NjQgaGFzaCwgcHRlZywgaHRhYnNpemU7CisJdTMyIHBhZ2U7CisJaHZhX3QgcjsKKworCXBhZ2UgPSBrdm1wcGNfbW11X2Jvb2szc182NF9nZXRfcGFnZShzbGJlLCBlYWRkcik7CisJaHRhYnNpemUgPSAoKDEgPDwgKCh2Y3B1X2Jvb2szcy0+c2RyMSAmIDB4MWYpICsgMTEpKSAtIDEpOworCisJaGFzaCA9IHNsYmUtPnZzaWQgXiBwYWdlOworCWlmIChzZWNvbmQpCisJCWhhc2ggPSB+aGFzaDsKKwloYXNoICY9ICgoMVVMTCA8PCAzOVVMTCkgLSAxVUxMKTsKKwloYXNoICY9IGh0YWJzaXplOworCWhhc2ggPDw9IDdVTEw7CisKKwlwdGVnID0gdmNwdV9ib29rM3MtPnNkcjEgJiAweGZmZmZmZmZmZmZmYzAwMDBVTEw7CisJcHRlZyB8PSBoYXNoOworCisJZHByaW50aygiTU1VOiBwYWdlPTB4JXggc2RyMT0weCVsbHggcHRlZz0weCVsbHggdnNpZD0weCVsbHhcbiIsCisJCXBhZ2UsIHZjcHVfYm9vazNzLT5zZHIxLCBwdGVnLCBzbGJlLT52c2lkKTsKKworCXIgPSBnZm5fdG9faHZhKHZjcHVfYm9vazNzLT52Y3B1Lmt2bSwgcHRlZyA+PiBQQUdFX1NISUZUKTsKKwlpZiAoa3ZtX2lzX2Vycm9yX2h2YShyKSkKKwkJcmV0dXJuIHI7CisJcmV0dXJuIHIgfCAocHRlZyAmIH5QQUdFX01BU0spOworfQorCitzdGF0aWMgdTY0IGt2bXBwY19tbXVfYm9vazNzXzY0X2dldF9hdnBuKHN0cnVjdCBrdm1wcGNfc2xiICpzbGJlLCBndmFfdCBlYWRkcikKK3sKKwlpbnQgcCA9IGt2bXBwY19tbXVfYm9vazNzXzY0X2dldF9wYWdlc2l6ZShzbGJlKTsKKwl1NjQgYXZwbjsKKworCWF2cG4gPSBrdm1wcGNfbW11X2Jvb2szc182NF9nZXRfcGFnZShzbGJlLCBlYWRkcik7CisJYXZwbiB8PSBzbGJlLT52c2lkIDw8ICgyOCAtIHApOworCisJaWYgKHAgPCAyNCkKKwkJYXZwbiA+Pj0gKCg4MCAtIHApIC0gNTYpIC0gODsKKwllbHNlCisJCWF2cG4gPDw9IDg7CisKKwlyZXR1cm4gYXZwbjsKK30KKworc3RhdGljIGludCBrdm1wcGNfbW11X2Jvb2szc182NF94bGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IGVhZGRyLAorCQkJCXN0cnVjdCBrdm1wcGNfcHRlICpncHRlLCBib29sIGRhdGEpCit7CisJc3RydWN0IGt2bXBwY192Y3B1X2Jvb2szcyAqdmNwdV9ib29rM3MgPSB0b19ib29rM3ModmNwdSk7CisJc3RydWN0IGt2bXBwY19zbGIgKnNsYmU7CisJaHZhX3QgcHRlZ3A7CisJdTY0IHB0ZWdbMTZdOworCXU2NCBhdnBuID0gMDsKKwlpbnQgaTsKKwl1OCBrZXkgPSAwOworCWJvb2wgZm91bmQgPSBmYWxzZTsKKwlib29sIHBlcm1fZXJyID0gZmFsc2U7CisJaW50IHNlY29uZCA9IDA7CisKKwlzbGJlID0ga3ZtcHBjX21tdV9ib29rM3NfNjRfZmluZF9zbGJlKHZjcHVfYm9vazNzLCBlYWRkcik7CisJaWYgKCFzbGJlKQorCQlnb3RvIG5vX3NlZ19mb3VuZDsKKworZG9fc2Vjb25kOgorCXB0ZWdwID0ga3ZtcHBjX21tdV9ib29rM3NfNjRfZ2V0X3B0ZWcodmNwdV9ib29rM3MsIHNsYmUsIGVhZGRyLCBzZWNvbmQpOworCWlmIChrdm1faXNfZXJyb3JfaHZhKHB0ZWdwKSkKKwkJZ290byBub19wYWdlX2ZvdW5kOworCisJYXZwbiA9IGt2bXBwY19tbXVfYm9vazNzXzY0X2dldF9hdnBuKHNsYmUsIGVhZGRyKTsKKworCWlmKGNvcHlfZnJvbV91c2VyKHB0ZWcsICh2b2lkIF9fdXNlciAqKXB0ZWdwLCBzaXplb2YocHRlZykpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiS1ZNIGNhbid0IGNvcHkgZGF0YSBmcm9tIDB4JWx4IVxuIiwgcHRlZ3ApOworCQlnb3RvIG5vX3BhZ2VfZm91bmQ7CisJfQorCisJaWYgKCh2Y3B1LT5hcmNoLm1zciAmIE1TUl9QUikgJiYgc2xiZS0+S3ApCisJCWtleSA9IDQ7CisJZWxzZSBpZiAoISh2Y3B1LT5hcmNoLm1zciAmIE1TUl9QUikgJiYgc2xiZS0+S3MpCisJCWtleSA9IDQ7CisKKwlmb3IgKGk9MDsgaTwxNjsgaSs9MikgeworCQl1NjQgdiA9IHB0ZWdbaV07CisJCXU2NCByID0gcHRlZ1tpKzFdOworCisJCS8qIFZhbGlkIGNoZWNrICovCisJCWlmICghKHYgJiBIUFRFX1ZfVkFMSUQpKQorCQkJY29udGludWU7CisJCS8qIEhhc2ggY2hlY2sgKi8KKwkJaWYgKCh2ICYgSFBURV9WX1NFQ09OREFSWSkgIT0gc2Vjb25kKQorCQkJY29udGludWU7CisKKwkJLyogQVZQTiBjb21wYXJlICovCisJCWlmIChIUFRFX1ZfQVZQTl9WQUwoYXZwbikgPT0gSFBURV9WX0FWUE5fVkFMKHYpKSB7CisJCQl1OCBwcCA9IChyICYgSFBURV9SX1BQKSB8IGtleTsKKwkJCWludCBlYWRkcl9tYXNrID0gMHhGRkY7CisKKwkJCWdwdGUtPmVhZGRyID0gZWFkZHI7CisJCQlncHRlLT52cGFnZSA9IGt2bXBwY19tbXVfYm9vazNzXzY0X2VhX3RvX3ZwKHZjcHUsCisJCQkJCQkJCSAgICBlYWRkciwKKwkJCQkJCQkJICAgIGRhdGEpOworCQkJaWYgKHNsYmUtPmxhcmdlKQorCQkJCWVhZGRyX21hc2sgPSAweEZGRkZGRjsKKwkJCWdwdGUtPnJhZGRyID0gKHIgJiBIUFRFX1JfUlBOKSB8IChlYWRkciAmIGVhZGRyX21hc2spOworCQkJZ3B0ZS0+bWF5X2V4ZWN1dGUgPSAoKHIgJiBIUFRFX1JfTikgPyBmYWxzZSA6IHRydWUpOworCQkJZ3B0ZS0+bWF5X3JlYWQgPSBmYWxzZTsKKwkJCWdwdGUtPm1heV93cml0ZSA9IGZhbHNlOworCisJCQlzd2l0Y2ggKHBwKSB7CisJCQljYXNlIDA6CisJCQljYXNlIDE6CisJCQljYXNlIDI6CisJCQljYXNlIDY6CisJCQkJZ3B0ZS0+bWF5X3dyaXRlID0gdHJ1ZTsKKwkJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJCWNhc2UgMzoKKwkJCWNhc2UgNToKKwkJCWNhc2UgNzoKKwkJCQlncHRlLT5tYXlfcmVhZCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICghZ3B0ZS0+bWF5X3JlYWQpIHsKKwkJCQlwZXJtX2VyciA9IHRydWU7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWRwcmludGsoIktWTSBNTVU6IFRyYW5zbGF0ZWQgMHglbHggWzB4JWxseF0gLT4gMHglbGx4ICIKKwkJCQkiLT4gMHglbGx4XG4iLAorCQkJCWVhZGRyLCBhdnBuLCBncHRlLT52cGFnZSwgZ3B0ZS0+cmFkZHIpOworCQkJZm91bmQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBVcGRhdGUgUFRFIFIgYW5kIEMgYml0cywgc28gdGhlIGd1ZXN0J3Mgc3dhcHBlciBrbm93cyB3ZSB1c2VkIHRoZQorCSAqIHBhZ2UgKi8KKwlpZiAoZm91bmQpIHsKKwkJdTMyIG9sZHIgPSBwdGVnW2krMV07CisKKwkJaWYgKGdwdGUtPm1heV9yZWFkKSB7CisJCQkvKiBTZXQgdGhlIGFjY2Vzc2VkIGZsYWcgKi8KKwkJCXB0ZWdbaSsxXSB8PSBIUFRFX1JfUjsKKwkJfQorCQlpZiAoZ3B0ZS0+bWF5X3dyaXRlKSB7CisJCQkvKiBTZXQgdGhlIGRpcnR5IGZsYWcgKi8KKwkJCXB0ZWdbaSsxXSB8PSBIUFRFX1JfQzsKKwkJfSBlbHNlIHsKKwkJCWRwcmludGsoIktWTTogTWFwcGluZyByZWFkLW9ubHkgcGFnZSFcbiIpOworCQl9CisKKwkJLyogV3JpdGUgYmFjayBpbnRvIHRoZSBQVEVHICovCisJCWlmIChwdGVnW2krMV0gIT0gb2xkcikKKwkJCWNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilwdGVncCwgcHRlZywgc2l6ZW9mKHB0ZWcpKTsKKworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlkcHJpbnRrKCJLVk0gTU1VOiBObyBQVEUgZm91bmQgKGVhPTB4JWx4IHNkcjE9MHglbGx4ICIKKwkJCSJwdGVncD0weCVseClcbiIsCisJCQllYWRkciwgdG9fYm9vazNzKHZjcHUpLT5zZHIxLCBwdGVncCk7CisJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSArPSAyKQorCQkJZHByaW50aygiICAgJTAyZDogMHglbGx4IC0gMHglbGx4ICgweCVsbHgpXG4iLAorCQkJCWksIHB0ZWdbaV0sIHB0ZWdbaSsxXSwgYXZwbik7CisKKwkJaWYgKCFzZWNvbmQpIHsKKwkJCXNlY29uZCA9IEhQVEVfVl9TRUNPTkRBUlk7CisJCQlnb3RvIGRvX3NlY29uZDsKKwkJfQorCX0KKworCitub19wYWdlX2ZvdW5kOgorCisKKwlpZiAocGVybV9lcnIpCisJCXJldHVybiAtRVBFUk07CisKKwlyZXR1cm4gLUVOT0VOVDsKKworbm9fc2VnX2ZvdW5kOgorCisJZHByaW50aygiS1ZNIE1NVTogVHJpZ2dlciBzZWdtZW50IGZhdWx0XG4iKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQga3ZtcHBjX21tdV9ib29rM3NfNjRfc2xibXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IHJzLCB1NjQgcmIpCit7CisJc3RydWN0IGt2bXBwY192Y3B1X2Jvb2szcyAqdmNwdV9ib29rM3M7CisJdTY0IGVzaWQsIGVzaWRfMXQ7CisJaW50IHNsYl9ucjsKKwlzdHJ1Y3Qga3ZtcHBjX3NsYiAqc2xiZTsKKworCWRwcmludGsoIktWTSBNTVU6IHNsYm10ZSgweCVsbHgsIDB4JWxseClcbiIsIHJzLCByYik7CisKKwl2Y3B1X2Jvb2szcyA9IHRvX2Jvb2szcyh2Y3B1KTsKKworCWVzaWQgPSBHRVRfRVNJRChyYik7CisJZXNpZF8xdCA9IEdFVF9FU0lEXzFUKHJiKTsKKwlzbGJfbnIgPSByYiAmIDB4ZmZmOworCisJaWYgKHNsYl9uciA+IHZjcHVfYm9vazNzLT5zbGJfbnIpCisJCXJldHVybjsKKworCXNsYmUgPSAmdmNwdV9ib29rM3MtPnNsYltzbGJfbnJdOworCisJc2xiZS0+bGFyZ2UgPSAocnMgJiBTTEJfVlNJRF9MKSA/IDEgOiAwOworCXNsYmUtPmVzaWQgID0gc2xiZS0+bGFyZ2UgPyBlc2lkXzF0IDogZXNpZDsKKwlzbGJlLT52c2lkICA9IHJzID4+IDEyOworCXNsYmUtPnZhbGlkID0gKHJiICYgU0xCX0VTSURfVikgPyAxIDogMDsKKwlzbGJlLT5LcyAgICA9IChycyAmIFNMQl9WU0lEX0tTKSA/IDEgOiAwOworCXNsYmUtPktwICAgID0gKHJzICYgU0xCX1ZTSURfS1ApID8gMSA6IDA7CisJc2xiZS0+bnggICAgPSAocnMgJiBTTEJfVlNJRF9OKSA/IDEgOiAwOworCXNsYmUtPmNsYXNzID0gKHJzICYgU0xCX1ZTSURfQykgPyAxIDogMDsKKworCXNsYmUtPm9yaWdlID0gcmIgJiAoRVNJRF9NQVNLIHwgU0xCX0VTSURfVik7CisJc2xiZS0+b3JpZ3YgPSByczsKKworCS8qIE1hcCB0aGUgbmV3IHNlZ21lbnQgKi8KKwlrdm1wcGNfbW11X21hcF9zZWdtZW50KHZjcHUsIGVzaWQgPDwgU0lEX1NISUZUKTsKK30KKworc3RhdGljIHU2NCBrdm1wcGNfbW11X2Jvb2szc182NF9zbGJtZmVlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IHNsYl9ucikKK3sKKwlzdHJ1Y3Qga3ZtcHBjX3ZjcHVfYm9vazNzICp2Y3B1X2Jvb2szcyA9IHRvX2Jvb2szcyh2Y3B1KTsKKwlzdHJ1Y3Qga3ZtcHBjX3NsYiAqc2xiZTsKKworCWlmIChzbGJfbnIgPiB2Y3B1X2Jvb2szcy0+c2xiX25yKQorCQlyZXR1cm4gMDsKKworCXNsYmUgPSAmdmNwdV9ib29rM3MtPnNsYltzbGJfbnJdOworCisJcmV0dXJuIHNsYmUtPm9yaWdlOworfQorCitzdGF0aWMgdTY0IGt2bXBwY19tbXVfYm9vazNzXzY0X3NsYm1mZXYoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgc2xiX25yKQoreworCXN0cnVjdCBrdm1wcGNfdmNwdV9ib29rM3MgKnZjcHVfYm9vazNzID0gdG9fYm9vazNzKHZjcHUpOworCXN0cnVjdCBrdm1wcGNfc2xiICpzbGJlOworCisJaWYgKHNsYl9uciA+IHZjcHVfYm9vazNzLT5zbGJfbnIpCisJCXJldHVybiAwOworCisJc2xiZSA9ICZ2Y3B1X2Jvb2szcy0+c2xiW3NsYl9ucl07CisKKwlyZXR1cm4gc2xiZS0+b3JpZ3Y7Cit9CisKK3N0YXRpYyB2b2lkIGt2bXBwY19tbXVfYm9vazNzXzY0X3NsYmllKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IGVhKQoreworCXN0cnVjdCBrdm1wcGNfdmNwdV9ib29rM3MgKnZjcHVfYm9vazNzID0gdG9fYm9vazNzKHZjcHUpOworCXN0cnVjdCBrdm1wcGNfc2xiICpzbGJlOworCisJZHByaW50aygiS1ZNIE1NVTogc2xiaWUoMHglbGx4KVxuIiwgZWEpOworCisJc2xiZSA9IGt2bXBwY19tbXVfYm9vazNzXzY0X2ZpbmRfc2xiZSh2Y3B1X2Jvb2szcywgZWEpOworCisJaWYgKCFzbGJlKQorCQlyZXR1cm47CisKKwlkcHJpbnRrKCJLVk0gTU1VOiBzbGJpZSgweCVsbHgsIDB4JWxseClcbiIsIGVhLCBzbGJlLT5lc2lkKTsKKworCXNsYmUtPnZhbGlkID0gZmFsc2U7CisKKwlrdm1wcGNfbW11X21hcF9zZWdtZW50KHZjcHUsIGVhKTsKK30KKworc3RhdGljIHZvaWQga3ZtcHBjX21tdV9ib29rM3NfNjRfc2xiaWEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCBrdm1wcGNfdmNwdV9ib29rM3MgKnZjcHVfYm9vazNzID0gdG9fYm9vazNzKHZjcHUpOworCWludCBpOworCisJZHByaW50aygiS1ZNIE1NVTogc2xiaWEoKVxuIik7CisKKwlmb3IgKGkgPSAxOyBpIDwgdmNwdV9ib29rM3MtPnNsYl9ucjsgaSsrKQorCQl2Y3B1X2Jvb2szcy0+c2xiW2ldLnZhbGlkID0gZmFsc2U7CisKKwlpZiAodmNwdS0+YXJjaC5tc3IgJiBNU1JfSVIpIHsKKwkJa3ZtcHBjX21tdV9mbHVzaF9zZWdtZW50cyh2Y3B1KTsKKwkJa3ZtcHBjX21tdV9tYXBfc2VnbWVudCh2Y3B1LCB2Y3B1LT5hcmNoLnBjKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGt2bXBwY19tbXVfYm9vazNzXzY0X210c3JpbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUzMiBzcm51bSwKKwkJCQkJdWxvbmcgdmFsdWUpCit7CisJdTY0IHJiID0gMCwgcnMgPSAwOworCisJLyogRVNJRCA9IHNybnVtICovCisJcmIgfD0gKHNybnVtICYgMHhmKSA8PCAyODsKKwkvKiBTZXQgdGhlIHZhbGlkIGJpdCAqLworCXJiIHw9IDEgPDwgMjc7CisJLyogSW5kZXggPSBFU0lEICovCisJcmIgfD0gc3JudW07CisKKwkvKiBWU0lEID0gVlNJRCAqLworCXJzIHw9ICh2YWx1ZSAmIDB4ZmZmZmZmZikgPDwgMTI7CisJLyogZmxhZ3MgPSBmbGFncyAqLworCXJzIHw9ICgodmFsdWUgPj4gMjcpICYgMHhmKSA8PCA5OworCisJa3ZtcHBjX21tdV9ib29rM3NfNjRfc2xibXRlKHZjcHUsIHJzLCByYik7Cit9CisKK3N0YXRpYyB2b2lkIGt2bXBwY19tbXVfYm9vazNzXzY0X3RsYmllKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdWxvbmcgdmEsCisJCQkJICAgICAgIGJvb2wgbGFyZ2UpCit7CisJdTY0IG1hc2sgPSAweEZGRkZGRkZGRlVMTDsKKworCWRwcmludGsoIktWTSBNTVU6IHRsYmllKDB4JWx4KVxuIiwgdmEpOworCisJaWYgKGxhcmdlKQorCQltYXNrID0gMHhGRkZGRkYwMDBVTEw7CisJa3ZtcHBjX21tdV9wdGVfdmZsdXNoKHZjcHUsIHZhID4+IDEyLCBtYXNrKTsKK30KKworc3RhdGljIGludCBrdm1wcGNfbW11X2Jvb2szc182NF9lc2lkX3RvX3ZzaWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgZXNpZCwKKwkJCQkJICAgICB1NjQgKnZzaWQpCit7CisJc3dpdGNoICh2Y3B1LT5hcmNoLm1zciAmIChNU1JfRFJ8TVNSX0lSKSkgeworCWNhc2UgMDoKKwkJKnZzaWQgPSAoVlNJRF9SRUFMID4+IDE2KSB8IGVzaWQ7CisJCWJyZWFrOworCWNhc2UgTVNSX0lSOgorCQkqdnNpZCA9IChWU0lEX1JFQUxfSVIgPj4gMTYpIHwgZXNpZDsKKwkJYnJlYWs7CisJY2FzZSBNU1JfRFI6CisJCSp2c2lkID0gKFZTSURfUkVBTF9EUiA+PiAxNikgfCBlc2lkOworCQlicmVhazsKKwljYXNlIE1TUl9EUnxNU1JfSVI6CisJeworCQl1bG9uZyBlYTsKKwkJc3RydWN0IGt2bXBwY19zbGIgKnNsYjsKKwkJZWEgPSBlc2lkIDw8IFNJRF9TSElGVDsKKwkJc2xiID0ga3ZtcHBjX21tdV9ib29rM3NfNjRfZmluZF9zbGJlKHRvX2Jvb2szcyh2Y3B1KSwgZWEpOworCQlpZiAoc2xiKQorCQkJKnZzaWQgPSBzbGItPnZzaWQ7CisJCWVsc2UKKwkJCXJldHVybiAtRU5PRU5UOworCisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sIGt2bXBwY19tbXVfYm9vazNzXzY0X2lzX2RjYnozMihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJcmV0dXJuICh0b19ib29rM3ModmNwdSktPmhpZFs1XSAmIDB4ODApOworfQorCit2b2lkIGt2bXBwY19tbXVfYm9vazNzXzY0X2luaXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCBrdm1wcGNfbW11ICptbXUgPSAmdmNwdS0+YXJjaC5tbXU7CisKKwltbXUtPm1mc3JpbiA9IE5VTEw7CisJbW11LT5tdHNyaW4gPSBrdm1wcGNfbW11X2Jvb2szc182NF9tdHNyaW47CisJbW11LT5zbGJtdGUgPSBrdm1wcGNfbW11X2Jvb2szc182NF9zbGJtdGU7CisJbW11LT5zbGJtZmVlID0ga3ZtcHBjX21tdV9ib29rM3NfNjRfc2xibWZlZTsKKwltbXUtPnNsYm1mZXYgPSBrdm1wcGNfbW11X2Jvb2szc182NF9zbGJtZmV2OworCW1tdS0+c2xiaWUgPSBrdm1wcGNfbW11X2Jvb2szc182NF9zbGJpZTsKKwltbXUtPnNsYmlhID0ga3ZtcHBjX21tdV9ib29rM3NfNjRfc2xiaWE7CisJbW11LT54bGF0ZSA9IGt2bXBwY19tbXVfYm9vazNzXzY0X3hsYXRlOworCW1tdS0+cmVzZXRfbXNyID0ga3ZtcHBjX21tdV9ib29rM3NfNjRfcmVzZXRfbXNyOworCW1tdS0+dGxiaWUgPSBrdm1wcGNfbW11X2Jvb2szc182NF90bGJpZTsKKwltbXUtPmVzaWRfdG9fdnNpZCA9IGt2bXBwY19tbXVfYm9vazNzXzY0X2VzaWRfdG9fdnNpZDsKKwltbXUtPmVhX3RvX3ZwID0ga3ZtcHBjX21tdV9ib29rM3NfNjRfZWFfdG9fdnA7CisJbW11LT5pc19kY2J6MzIgPSBrdm1wcGNfbW11X2Jvb2szc182NF9pc19kY2J6MzI7CisKKwl2Y3B1LT5hcmNoLmhmbGFncyB8PSBCT09LM1NfSEZMQUdfU0xCOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfNjRfbW11X2hvc3QuYyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzXzY0X21tdV9ob3N0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI4OTliMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzXzY0X21tdV9ob3N0LmMKQEAgLTAsMCArMSw0MDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU1VTRSBMaW51eCBQcm9kdWN0cyBHbWJILiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICAgQWxleGFuZGVyIEdyYWYgPGFncmFmQHN1c2UuZGU+CisgKiAgICAgS2V2aW4gV29sZiA8bWFpbEBrZXZpbi13b2xmLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgorCisjaW5jbHVkZSA8YXNtL2t2bV9wcGMuaD4KKyNpbmNsdWRlIDxhc20va3ZtX2Jvb2szcy5oPgorI2luY2x1ZGUgPGFzbS9tbXUtaGFzaDY0Lmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KKyNpbmNsdWRlIDxhc20vaHdfaXJxLmg+CisKKyNkZWZpbmUgUFRFX1NJWkUgMTIKKyNkZWZpbmUgVlNJRF9BTEwgMAorCisvKiAjZGVmaW5lIERFQlVHX01NVSAqLworLyogI2RlZmluZSBERUJVR19TTEIgKi8KKworI2lmZGVmIERFQlVHX01NVQorI2RlZmluZSBkcHJpbnRrX21tdShhLCAuLi4pIHByaW50ayhLRVJOX0lORk8gYSwgX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBkcHJpbnRrX21tdShhLCAuLi4pIGRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKyNpZmRlZiBERUJVR19TTEIKKyNkZWZpbmUgZHByaW50a19zbGIoYSwgLi4uKSBwcmludGsoS0VSTl9JTkZPIGEsIF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgZHByaW50a19zbGIoYSwgLi4uKSBkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBpbnZhbGlkYXRlX3B0ZShzdHJ1Y3QgaHB0ZV9jYWNoZSAqcHRlKQoreworCWRwcmludGtfbW11KCJLVk06IEZsdXNoaW5nIFNQVCAlZDogMHglbGx4ICgweCVsbHgpIC0+IDB4JWxseFxuIiwKKwkJICAgIGksIHB0ZS0+cHRlLmVhZGRyLCBwdGUtPnB0ZS52cGFnZSwgcHRlLT5ob3N0X3ZhKTsKKworCXBwY19tZC5ocHRlX2ludmFsaWRhdGUocHRlLT5zbG90LCBwdGUtPmhvc3RfdmEsCisJCQkgICAgICAgTU1VX1BBR0VfNEssIE1NVV9TRUdTSVpFXzI1Nk0sCisJCQkgICAgICAgZmFsc2UpOworCXB0ZS0+aG9zdF92YSA9IDA7CisJa3ZtX3JlbGVhc2VfcGZuX2RpcnR5KHB0ZS0+cGZuKTsKK30KKwordm9pZCBrdm1wcGNfbW11X3B0ZV9mbHVzaChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBndWVzdF9lYSwgdTY0IGVhX21hc2spCit7CisJaW50IGk7CisKKwlkcHJpbnRrX21tdSgiS1ZNOiBGbHVzaGluZyAlZCBTaGFkb3cgUFRFczogMHglbGx4ICYgMHglbGx4XG4iLAorCQkgICAgdmNwdS0+YXJjaC5ocHRlX2NhY2hlX29mZnNldCwgZ3Vlc3RfZWEsIGVhX21hc2spOworCUJVR19PTih2Y3B1LT5hcmNoLmhwdGVfY2FjaGVfb2Zmc2V0ID4gSFBURUdfQ0FDSEVfTlVNKTsKKworCWd1ZXN0X2VhICY9IGVhX21hc2s7CisJZm9yIChpID0gMDsgaSA8IHZjcHUtPmFyY2guaHB0ZV9jYWNoZV9vZmZzZXQ7IGkrKykgeworCQlzdHJ1Y3QgaHB0ZV9jYWNoZSAqcHRlOworCisJCXB0ZSA9ICZ2Y3B1LT5hcmNoLmhwdGVfY2FjaGVbaV07CisJCWlmICghcHRlLT5ob3N0X3ZhKQorCQkJY29udGludWU7CisKKwkJaWYgKChwdGUtPnB0ZS5lYWRkciAmIGVhX21hc2spID09IGd1ZXN0X2VhKSB7CisJCQlpbnZhbGlkYXRlX3B0ZShwdGUpOworCQl9CisJfQorCisJLyogRG9pbmcgYSBjb21wbGV0ZSBmbHVzaCAtPiBzdGFydCBmcm9tIHNjcmF0Y2ggKi8KKwlpZiAoIWVhX21hc2spCisJCXZjcHUtPmFyY2guaHB0ZV9jYWNoZV9vZmZzZXQgPSAwOworfQorCit2b2lkIGt2bXBwY19tbXVfcHRlX3ZmbHVzaChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBndWVzdF92cCwgdTY0IHZwX21hc2spCit7CisJaW50IGk7CisKKwlkcHJpbnRrX21tdSgiS1ZNOiBGbHVzaGluZyAlZCBTaGFkb3cgdlBURXM6IDB4JWxseCAmIDB4JWxseFxuIiwKKwkJICAgIHZjcHUtPmFyY2guaHB0ZV9jYWNoZV9vZmZzZXQsIGd1ZXN0X3ZwLCB2cF9tYXNrKTsKKwlCVUdfT04odmNwdS0+YXJjaC5ocHRlX2NhY2hlX29mZnNldCA+IEhQVEVHX0NBQ0hFX05VTSk7CisKKwlndWVzdF92cCAmPSB2cF9tYXNrOworCWZvciAoaSA9IDA7IGkgPCB2Y3B1LT5hcmNoLmhwdGVfY2FjaGVfb2Zmc2V0OyBpKyspIHsKKwkJc3RydWN0IGhwdGVfY2FjaGUgKnB0ZTsKKworCQlwdGUgPSAmdmNwdS0+YXJjaC5ocHRlX2NhY2hlW2ldOworCQlpZiAoIXB0ZS0+aG9zdF92YSkKKwkJCWNvbnRpbnVlOworCisJCWlmICgocHRlLT5wdGUudnBhZ2UgJiB2cF9tYXNrKSA9PSBndWVzdF92cCkgeworCQkJaW52YWxpZGF0ZV9wdGUocHRlKTsKKwkJfQorCX0KK30KKwordm9pZCBrdm1wcGNfbW11X3B0ZV9wZmx1c2goc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgcGFfc3RhcnQsIHU2NCBwYV9lbmQpCit7CisJaW50IGk7CisKKwlkcHJpbnRrX21tdSgiS1ZNOiBGbHVzaGluZyAlZCBTaGFkb3cgcFBURXM6IDB4JWxseCAmIDB4JWxseFxuIiwKKwkJICAgIHZjcHUtPmFyY2guaHB0ZV9jYWNoZV9vZmZzZXQsIGd1ZXN0X3BhLCBwYV9tYXNrKTsKKwlCVUdfT04odmNwdS0+YXJjaC5ocHRlX2NhY2hlX29mZnNldCA+IEhQVEVHX0NBQ0hFX05VTSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmNwdS0+YXJjaC5ocHRlX2NhY2hlX29mZnNldDsgaSsrKSB7CisJCXN0cnVjdCBocHRlX2NhY2hlICpwdGU7CisKKwkJcHRlID0gJnZjcHUtPmFyY2guaHB0ZV9jYWNoZVtpXTsKKwkJaWYgKCFwdGUtPmhvc3RfdmEpCisJCQljb250aW51ZTsKKworCQlpZiAoKHB0ZS0+cHRlLnJhZGRyID49IHBhX3N0YXJ0KSAmJgorCQkgICAgKHB0ZS0+cHRlLnJhZGRyIDwgcGFfZW5kKSkgeworCQkJaW52YWxpZGF0ZV9wdGUocHRlKTsKKwkJfQorCX0KK30KKworc3RydWN0IGt2bXBwY19wdGUgKmt2bXBwY19tbXVfZmluZF9wdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgZWEsIGJvb2wgZGF0YSkKK3sKKwlpbnQgaTsKKwl1NjQgZ3Vlc3RfdnA7CisKKwlndWVzdF92cCA9IHZjcHUtPmFyY2gubW11LmVhX3RvX3ZwKHZjcHUsIGVhLCBmYWxzZSk7CisJZm9yIChpPTA7IGk8dmNwdS0+YXJjaC5ocHRlX2NhY2hlX29mZnNldDsgaSsrKSB7CisJCXN0cnVjdCBocHRlX2NhY2hlICpwdGU7CisKKwkJcHRlID0gJnZjcHUtPmFyY2guaHB0ZV9jYWNoZVtpXTsKKwkJaWYgKCFwdGUtPmhvc3RfdmEpCisJCQljb250aW51ZTsKKworCQlpZiAocHRlLT5wdGUudnBhZ2UgPT0gZ3Vlc3RfdnApCisJCQlyZXR1cm4gJnB0ZS0+cHRlOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGt2bXBwY19tbXVfaHB0ZV9jYWNoZV9uZXh0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlpZiAodmNwdS0+YXJjaC5ocHRlX2NhY2hlX29mZnNldCA9PSBIUFRFR19DQUNIRV9OVU0pCisJCWt2bXBwY19tbXVfcHRlX2ZsdXNoKHZjcHUsIDAsIDApOworCisJcmV0dXJuIHZjcHUtPmFyY2guaHB0ZV9jYWNoZV9vZmZzZXQrKzsKK30KKworLyogV2Uga2VlcCA1MTIgZ3ZzaWQtPmh2c2lkIGVudHJpZXMsIG1hcHBpbmcgdGhlIGd1ZXN0IG9uZXMgdG8gdGhlIGFycmF5IHVzaW5nCisgKiBhIGhhc2gsIHNvIHdlIGRvbid0IHdhc3RlIGN5Y2xlcyBvbiBsb29waW5nICovCitzdGF0aWMgdTE2IGt2bXBwY19zaWRfaGFzaChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBndnNpZCkKK3sKKwlyZXR1cm4gKHUxNikoKChndnNpZCA+PiAoU0lEX01BUF9CSVRTICogNykpICYgU0lEX01BUF9NQVNLKSBeCisJCSAgICAgKChndnNpZCA+PiAoU0lEX01BUF9CSVRTICogNikpICYgU0lEX01BUF9NQVNLKSBeCisJCSAgICAgKChndnNpZCA+PiAoU0lEX01BUF9CSVRTICogNSkpICYgU0lEX01BUF9NQVNLKSBeCisJCSAgICAgKChndnNpZCA+PiAoU0lEX01BUF9CSVRTICogNCkpICYgU0lEX01BUF9NQVNLKSBeCisJCSAgICAgKChndnNpZCA+PiAoU0lEX01BUF9CSVRTICogMykpICYgU0lEX01BUF9NQVNLKSBeCisJCSAgICAgKChndnNpZCA+PiAoU0lEX01BUF9CSVRTICogMikpICYgU0lEX01BUF9NQVNLKSBeCisJCSAgICAgKChndnNpZCA+PiAoU0lEX01BUF9CSVRTICogMSkpICYgU0lEX01BUF9NQVNLKSBeCisJCSAgICAgKChndnNpZCA+PiAoU0lEX01BUF9CSVRTICogMCkpICYgU0lEX01BUF9NQVNLKSk7Cit9CisKKworc3RhdGljIHN0cnVjdCBrdm1wcGNfc2lkX21hcCAqZmluZF9zaWRfdnNpZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBndnNpZCkKK3sKKwlzdHJ1Y3Qga3ZtcHBjX3NpZF9tYXAgKm1hcDsKKwl1MTYgc2lkX21hcF9tYXNrOworCisJaWYgKHZjcHUtPmFyY2gubXNyICYgTVNSX1BSKQorCQlndnNpZCB8PSBWU0lEX1BSOworCisJc2lkX21hcF9tYXNrID0ga3ZtcHBjX3NpZF9oYXNoKHZjcHUsIGd2c2lkKTsKKwltYXAgPSAmdG9fYm9vazNzKHZjcHUpLT5zaWRfbWFwW3NpZF9tYXBfbWFza107CisJaWYgKG1hcC0+Z3Vlc3RfdnNpZCA9PSBndnNpZCkgeworCQlkcHJpbnRrX3NsYigiU0xCOiBTZWFyY2hpbmcgMHglbGx4IC0+IDB4JWxseFxuIiwKKwkJCSAgICBndnNpZCwgbWFwLT5ob3N0X3ZzaWQpOworCQlyZXR1cm4gbWFwOworCX0KKworCW1hcCA9ICZ0b19ib29rM3ModmNwdSktPnNpZF9tYXBbU0lEX01BUF9NQVNLIC0gc2lkX21hcF9tYXNrXTsKKwlpZiAobWFwLT5ndWVzdF92c2lkID09IGd2c2lkKSB7CisJCWRwcmludGtfc2xiKCJTTEI6IFNlYXJjaGluZyAweCVsbHggLT4gMHglbGx4XG4iLAorCQkJICAgIGd2c2lkLCBtYXAtPmhvc3RfdnNpZCk7CisJCXJldHVybiBtYXA7CisJfQorCisJZHByaW50a19zbGIoIlNMQjogU2VhcmNoaW5nIDB4JWxseCAtPiBub3QgZm91bmRcbiIsIGd2c2lkKTsKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IGt2bXBwY19tbXVfbWFwX3BhZ2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtcHBjX3B0ZSAqb3JpZ19wdGUpCit7CisJcGZuX3QgaHBhZGRyOworCXVsb25nIGhhc2gsIGhwdGVnLCB2YTsKKwl1NjQgdnNpZDsKKwlpbnQgcmV0OworCWludCByZmxhZ3MgPSAweDE5MjsKKwlpbnQgdmZsYWdzID0gMDsKKwlpbnQgYXR0ZW1wdCA9IDA7CisJc3RydWN0IGt2bXBwY19zaWRfbWFwICptYXA7CisKKwkvKiBHZXQgaG9zdCBwaHlzaWNhbCBhZGRyZXNzIGZvciBncGEgKi8KKwlocGFkZHIgPSBnZm5fdG9fcGZuKHZjcHUtPmt2bSwgb3JpZ19wdGUtPnJhZGRyID4+IFBBR0VfU0hJRlQpOworCWlmIChrdm1faXNfZXJyb3JfaHZhKGhwYWRkcikpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ291bGRuJ3QgZ2V0IGd1ZXN0IHBhZ2UgZm9yIGdmbiAlbGx4IVxuIiwgb3JpZ19wdGUtPmVhZGRyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWhwYWRkciA8PD0gUEFHRV9TSElGVDsKKyNpZiBQQUdFX1NISUZUID09IDEyCisjZWxpZiBQQUdFX1NISUZUID09IDE2CisJaHBhZGRyIHw9IG9yaWdfcHRlLT5yYWRkciAmIDB4ZjAwMDsKKyNlbHNlCisjZXJyb3IgVW5rbm93biBwYWdlIHNpemUKKyNlbmRpZgorCisJLyogYW5kIHdyaXRlIHRoZSBtYXBwaW5nIGVhIC0+IGhwYSBpbnRvIHRoZSBwdCAqLworCXZjcHUtPmFyY2gubW11LmVzaWRfdG9fdnNpZCh2Y3B1LCBvcmlnX3B0ZS0+ZWFkZHIgPj4gU0lEX1NISUZULCAmdnNpZCk7CisJbWFwID0gZmluZF9zaWRfdnNpZCh2Y3B1LCB2c2lkKTsKKwlpZiAoIW1hcCkgeworCQlrdm1wcGNfbW11X21hcF9zZWdtZW50KHZjcHUsIG9yaWdfcHRlLT5lYWRkcik7CisJCW1hcCA9IGZpbmRfc2lkX3ZzaWQodmNwdSwgdnNpZCk7CisJfQorCUJVR19PTighbWFwKTsKKworCXZzaWQgPSBtYXAtPmhvc3RfdnNpZDsKKwl2YSA9IGhwdF92YShvcmlnX3B0ZS0+ZWFkZHIsIHZzaWQsIE1NVV9TRUdTSVpFXzI1Nk0pOworCisJaWYgKCFvcmlnX3B0ZS0+bWF5X3dyaXRlKQorCQlyZmxhZ3MgfD0gSFBURV9SX1BQOworCWVsc2UKKwkJbWFya19wYWdlX2RpcnR5KHZjcHUtPmt2bSwgb3JpZ19wdGUtPnJhZGRyID4+IFBBR0VfU0hJRlQpOworCisJaWYgKCFvcmlnX3B0ZS0+bWF5X2V4ZWN1dGUpCisJCXJmbGFncyB8PSBIUFRFX1JfTjsKKworCWhhc2ggPSBocHRfaGFzaCh2YSwgUFRFX1NJWkUsIE1NVV9TRUdTSVpFXzI1Nk0pOworCittYXBfYWdhaW46CisJaHB0ZWcgPSAoKGhhc2ggJiBodGFiX2hhc2hfbWFzaykgKiBIUFRFU19QRVJfR1JPVVApOworCisJLyogSW4gY2FzZSB3ZSB0cmllZCBub3JtYWwgbWFwcGluZyBhbHJlYWR5LCBsZXQncyBudWtlIG9sZCBlbnRyaWVzICovCisJaWYgKGF0dGVtcHQgPiAxKQorCQlpZiAocHBjX21kLmhwdGVfcmVtb3ZlKGhwdGVnKSA8IDApCisJCQlyZXR1cm4gLTE7CisKKwlyZXQgPSBwcGNfbWQuaHB0ZV9pbnNlcnQoaHB0ZWcsIHZhLCBocGFkZHIsIHJmbGFncywgdmZsYWdzLCBNTVVfUEFHRV80SywgTU1VX1NFR1NJWkVfMjU2TSk7CisKKwlpZiAocmV0IDwgMCkgeworCQkvKiBJZiB3ZSBjb3VsZG4ndCBtYXAgYSBwcmltYXJ5IFBURSwgdHJ5IGEgc2Vjb25kYXJ5ICovCisjaWZkZWYgVVNFX1NFQ09OREFSWQorCQloYXNoID0gfmhhc2g7CisJCWF0dGVtcHQrKzsKKwkJaWYgKGF0dGVtcHQgJSAyKQorCQkJdmZsYWdzID0gSFBURV9WX1NFQ09OREFSWTsKKwkJZWxzZQorCQkJdmZsYWdzID0gMDsKKyNlbHNlCisJCWF0dGVtcHQgPSAyOworI2VuZGlmCisJCWdvdG8gbWFwX2FnYWluOworCX0gZWxzZSB7CisJCWludCBocHRlX2lkID0ga3ZtcHBjX21tdV9ocHRlX2NhY2hlX25leHQodmNwdSk7CisJCXN0cnVjdCBocHRlX2NhY2hlICpwdGUgPSAmdmNwdS0+YXJjaC5ocHRlX2NhY2hlW2hwdGVfaWRdOworCisJCWRwcmludGtfbW11KCJLVk06ICVjJWMgTWFwIDB4JWxseDogWyVseF0gMHglbHggKDB4JWxseCkgLT4gJWx4XG4iLAorCQkJICAgICgocmZsYWdzICYgSFBURV9SX1BQKSA9PSAzKSA/ICctJyA6ICd3JywKKwkJCSAgICAocmZsYWdzICYgSFBURV9SX04pID8gJy0nIDogJ3gnLAorCQkJICAgIG9yaWdfcHRlLT5lYWRkciwgaHB0ZWcsIHZhLCBvcmlnX3B0ZS0+dnBhZ2UsIGhwYWRkcik7CisKKwkJcHRlLT5zbG90ID0gaHB0ZWcgKyAocmV0ICYgNyk7CisJCXB0ZS0+aG9zdF92YSA9IHZhOworCQlwdGUtPnB0ZSA9ICpvcmlnX3B0ZTsKKwkJcHRlLT5wZm4gPSBocGFkZHIgPj4gUEFHRV9TSElGVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBrdm1wcGNfc2lkX21hcCAqY3JlYXRlX3NpZF9tYXAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgZ3ZzaWQpCit7CisJc3RydWN0IGt2bXBwY19zaWRfbWFwICptYXA7CisJc3RydWN0IGt2bXBwY192Y3B1X2Jvb2szcyAqdmNwdV9ib29rM3MgPSB0b19ib29rM3ModmNwdSk7CisJdTE2IHNpZF9tYXBfbWFzazsKKwlzdGF0aWMgaW50IGJhY2t3YXJkc19tYXAgPSAwOworCisJaWYgKHZjcHUtPmFyY2gubXNyICYgTVNSX1BSKQorCQlndnNpZCB8PSBWU0lEX1BSOworCisJLyogV2UgbWlnaHQgZ2V0IGNvbGxpc2lvbnMgdGhhdCB0cmFwIGluIHByZWNlZGluZyBvcmRlciwgc28gbGV0J3MKKwkgICBtYXAgdGhlbSBkaWZmZXJlbnRseSAqLworCisJc2lkX21hcF9tYXNrID0ga3ZtcHBjX3NpZF9oYXNoKHZjcHUsIGd2c2lkKTsKKwlpZiAoYmFja3dhcmRzX21hcCkKKwkJc2lkX21hcF9tYXNrID0gU0lEX01BUF9NQVNLIC0gc2lkX21hcF9tYXNrOworCisJbWFwID0gJnRvX2Jvb2szcyh2Y3B1KS0+c2lkX21hcFtzaWRfbWFwX21hc2tdOworCisJLyogTWFrZSBzdXJlIHdlJ3JlIHRha2luZyB0aGUgb3RoZXIgbWFwIG5leHQgdGltZSAqLworCWJhY2t3YXJkc19tYXAgPSAhYmFja3dhcmRzX21hcDsKKworCS8qIFVoLW9oIC4uLiBvdXQgb2YgbWFwcGluZ3MuIExldCdzIGZsdXNoISAqLworCWlmICh2Y3B1X2Jvb2szcy0+dnNpZF9uZXh0ID09IHZjcHVfYm9vazNzLT52c2lkX21heCkgeworCQl2Y3B1X2Jvb2szcy0+dnNpZF9uZXh0ID0gdmNwdV9ib29rM3MtPnZzaWRfZmlyc3Q7CisJCW1lbXNldCh2Y3B1X2Jvb2szcy0+c2lkX21hcCwgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3Qga3ZtcHBjX3NpZF9tYXApICogU0lEX01BUF9OVU0pOworCQlrdm1wcGNfbW11X3B0ZV9mbHVzaCh2Y3B1LCAwLCAwKTsKKwkJa3ZtcHBjX21tdV9mbHVzaF9zZWdtZW50cyh2Y3B1KTsKKwl9CisJbWFwLT5ob3N0X3ZzaWQgPSB2Y3B1X2Jvb2szcy0+dnNpZF9uZXh0Kys7CisKKwltYXAtPmd1ZXN0X3ZzaWQgPSBndnNpZDsKKwltYXAtPnZhbGlkID0gdHJ1ZTsKKworCXJldHVybiBtYXA7Cit9CisKK3N0YXRpYyBpbnQga3ZtcHBjX21tdV9uZXh0X3NlZ21lbnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bG9uZyBlc2lkKQoreworCWludCBpOworCWludCBtYXhfc2xiX3NpemUgPSA2NDsKKwlpbnQgZm91bmRfaW52YWwgPSAtMTsKKwlpbnQgcjsKKworCWlmICghZ2V0X3BhY2EoKS0+a3ZtX3NsYl9tYXgpCisJCWdldF9wYWNhKCktPmt2bV9zbGJfbWF4ID0gMTsKKworCS8qIEFyZSB3ZSBvdmVyd3JpdGluZz8gKi8KKwlmb3IgKGkgPSAxOyBpIDwgZ2V0X3BhY2EoKS0+a3ZtX3NsYl9tYXg7IGkrKykgeworCQlpZiAoIShnZXRfcGFjYSgpLT5rdm1fc2xiW2ldLmVzaWQgJiBTTEJfRVNJRF9WKSkKKwkJCWZvdW5kX2ludmFsID0gaTsKKwkJZWxzZSBpZiAoKGdldF9wYWNhKCktPmt2bV9zbGJbaV0uZXNpZCAmIEVTSURfTUFTSykgPT0gZXNpZCkKKwkJCXJldHVybiBpOworCX0KKworCS8qIEZvdW5kIGEgc3BhcmUgZW50cnkgdGhhdCB3YXMgaW52YWxpZGF0ZWQgYmVmb3JlICovCisJaWYgKGZvdW5kX2ludmFsID4gMCkKKwkJcmV0dXJuIGZvdW5kX2ludmFsOworCisJLyogTm8gc3BhcmUgaW52YWxpZCBlbnRyeSwgc28gY3JlYXRlIG9uZSAqLworCisJaWYgKG1tdV9zbGJfc2l6ZSA8IDY0KQorCQltYXhfc2xiX3NpemUgPSBtbXVfc2xiX3NpemU7CisKKwkvKiBPdmVyZmxvd2luZyAtPiBwdXJnZSAqLworCWlmICgoZ2V0X3BhY2EoKS0+a3ZtX3NsYl9tYXgpID09IG1heF9zbGJfc2l6ZSkKKwkJa3ZtcHBjX21tdV9mbHVzaF9zZWdtZW50cyh2Y3B1KTsKKworCXIgPSBnZXRfcGFjYSgpLT5rdm1fc2xiX21heDsKKwlnZXRfcGFjYSgpLT5rdm1fc2xiX21heCsrOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBrdm1wcGNfbW11X21hcF9zZWdtZW50KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdWxvbmcgZWFkZHIpCit7CisJdTY0IGVzaWQgPSBlYWRkciA+PiBTSURfU0hJRlQ7CisJdTY0IHNsYl9lc2lkID0gKGVhZGRyICYgRVNJRF9NQVNLKSB8IFNMQl9FU0lEX1Y7CisJdTY0IHNsYl92c2lkID0gU0xCX1ZTSURfVVNFUjsKKwl1NjQgZ3ZzaWQ7CisJaW50IHNsYl9pbmRleDsKKwlzdHJ1Y3Qga3ZtcHBjX3NpZF9tYXAgKm1hcDsKKworCXNsYl9pbmRleCA9IGt2bXBwY19tbXVfbmV4dF9zZWdtZW50KHZjcHUsIGVhZGRyICYgRVNJRF9NQVNLKTsKKworCWlmICh2Y3B1LT5hcmNoLm1tdS5lc2lkX3RvX3ZzaWQodmNwdSwgZXNpZCwgJmd2c2lkKSkgeworCQkvKiBJbnZhbGlkYXRlIGFuIGVudHJ5ICovCisJCWdldF9wYWNhKCktPmt2bV9zbGJbc2xiX2luZGV4XS5lc2lkID0gMDsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJbWFwID0gZmluZF9zaWRfdnNpZCh2Y3B1LCBndnNpZCk7CisJaWYgKCFtYXApCisJCW1hcCA9IGNyZWF0ZV9zaWRfbWFwKHZjcHUsIGd2c2lkKTsKKworCW1hcC0+Z3Vlc3RfZXNpZCA9IGVzaWQ7CisKKwlzbGJfdnNpZCB8PSAobWFwLT5ob3N0X3ZzaWQgPDwgMTIpOworCXNsYl92c2lkICY9IH5TTEJfVlNJRF9LUDsKKwlzbGJfZXNpZCB8PSBzbGJfaW5kZXg7CisKKwlnZXRfcGFjYSgpLT5rdm1fc2xiW3NsYl9pbmRleF0uZXNpZCA9IHNsYl9lc2lkOworCWdldF9wYWNhKCktPmt2bV9zbGJbc2xiX2luZGV4XS52c2lkID0gc2xiX3ZzaWQ7CisKKwlkcHJpbnRrX3NsYigic2xibXRlICUjbGx4LCAlI2xseFxuIiwgc2xiX3ZzaWQsIHNsYl9lc2lkKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGt2bXBwY19tbXVfZmx1c2hfc2VnbWVudHMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCWdldF9wYWNhKCktPmt2bV9zbGJfbWF4ID0gMTsKKwlnZXRfcGFjYSgpLT5rdm1fc2xiWzBdLmVzaWQgPSAwOworfQorCit2b2lkIGt2bXBwY19tbXVfZGVzdHJveShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJa3ZtcHBjX21tdV9wdGVfZmx1c2godmNwdSwgMCwgMCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc182NF9ybWhhbmRsZXJzLlMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc182NF9ybWhhbmRsZXJzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI3ZGQyZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzXzY0X3JtaGFuZGxlcnMuUwpAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqIENvcHlyaWdodCBTVVNFIExpbnV4IFByb2R1Y3RzIEdtYkggMjAwOQorICoKKyAqIEF1dGhvcnM6IEFsZXhhbmRlciBHcmFmIDxhZ3JhZkBzdXNlLmRlPgorICovCisKKyNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgorI2luY2x1ZGUgPGFzbS9rdm1fYXNtLmg+CisjaW5jbHVkZSA8YXNtL3JlZy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2V4Y2VwdGlvbi02NHMuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICBSZWFsIE1vZGUgaGFuZGxlcnMgdGhhdCBuZWVkIHRvIGJlIGluIGxvdyBwaHlzaWNhbCBtZW1vcnkgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisubWFjcm8gSU5URVJSVVBUX1RSQU1QT0xJTkUgaW50bm8KKworLmdsb2JhbCBrdm1wcGNfdHJhbXBvbGluZV9caW50bm8KK2t2bXBwY190cmFtcG9saW5lX1xpbnRubzoKKworCW10c3ByCVNQUk5fU1BSR19TQ1JBVENIMCwgcjEzCQkvKiBTYXZlIHIxMyAqLworCisJLyoKKwkgKiBGaXJzdCB0aGluZyB0byBkbyBpcyB0byBmaW5kIG91dCBpZiB3ZSdyZSBjb21pbmcKKwkgKiBmcm9tIGEgS1ZNIGd1ZXN0IG9yIGEgTGludXggcHJvY2Vzcy4KKwkgKgorCSAqIFRvIGRpc3Rpbmd1aXNoLCB3ZSBjaGVjayBhIG1hZ2ljIGJ5dGUgaW4gdGhlIFBBQ0EKKwkgKi8KKwltZnNwcglyMTMsIFNQUk5fU1BSR19QQUNBCQkvKiByMTMgPSBQQUNBICovCisJc3RkCXIxMiwgKFBBQ0FfRVhNQyArIEVYX1IxMikocjEzKQorCW1mY3IJcjEyCisJc3R3CXIxMiwgKFBBQ0FfRVhNQyArIEVYX0NDUikocjEzKQorCWxieglyMTIsIFBBQ0FfS1ZNX0lOX0dVRVNUKHIxMykKKwljbXB3aQlyMTIsIDAKKwlibmUJLi5rdm1wcGNfaGFuZGxlcl9oYXNtYWdpY19caW50bm8KKwkvKiBObyBLVk0gZ3Vlc3Q/IFRoZW4ganVtcCBiYWNrIHRvIHRoZSBMaW51eCBoYW5kbGVyISAqLworCWx3eglyMTIsIChQQUNBX0VYTUMgKyBFWF9DQ1IpKHIxMykKKwltdGNyCXIxMgorCWxkCXIxMiwgKFBBQ0FfRVhNQyArIEVYX1IxMikocjEzKQorCW1mc3ByCXIxMywgU1BSTl9TUFJHX1NDUkFUQ0gwCQkvKiByMTMgPSBvcmlnaW5hbCByMTMgKi8KKwliCWt2bXBwY19yZXN1bWVfXGludG5vCQkvKiBHZXQgYmFjayBvcmlnaW5hbCBoYW5kbGVyICovCisKKwkvKiBOb3cgd2Uga25vdyB3ZSdyZSBoYW5kbGluZyBhIEtWTSBndWVzdCAqLworLi5rdm1wcGNfaGFuZGxlcl9oYXNtYWdpY19caW50bm86CisJLyogVW5zZXQgZ3Vlc3Qgc3RhdGUgKi8KKwlsaQlyMTIsIDAKKwlzdGIJcjEyLCBQQUNBX0tWTV9JTl9HVUVTVChyMTMpCisKKwlzdGQJcjEsIChQQUNBX0VYTUMrRVhfUjkpKHIxMykKKwlzdGQJcjEwLCAoUEFDQV9FWE1DK0VYX1IxMCkocjEzKQorCXN0ZAlyMTEsIChQQUNBX0VYTUMrRVhfUjExKShyMTMpCisJc3RkCXIyLCAoUEFDQV9FWE1DK0VYX1IxMykocjEzKQorCisJbWZzcnIwCXIxMAorCW1mc3JyMQlyMTEKKworCS8qIFJlc3RvcmUgUjEvUjIgc28gd2UgY2FuIGhhbmRsZSBmYXVsdHMgKi8KKwlsZAlyMSwgUEFDQVIxKHIxMykKKwlsZAlyMiwgKFBBQ0FfRVhNQytFWF9TUlIwKShyMTMpCisKKwkvKiBMZXQncyBzdG9yZSB3aGljaCBpbnRlcnJ1cHQgd2UncmUgaGFuZGxpbmcgKi8KKwlsaQlyMTIsIFxpbnRubworCisJLyogSnVtcCBpbnRvIHRoZSBTTEIgZXhpdCBjb2RlIHRoYXQgZ29lcyB0byB0aGUgaGlnaG1lbSBoYW5kbGVyICovCisJYglrdm1wcGNfaGFuZGxlcl90cmFtcG9saW5lX2V4aXQKKworLmVuZG0KKworSU5URVJSVVBUX1RSQU1QT0xJTkUJQk9PSzNTX0lOVEVSUlVQVF9TWVNURU1fUkVTRVQKK0lOVEVSUlVQVF9UUkFNUE9MSU5FCUJPT0szU19JTlRFUlJVUFRfTUFDSElORV9DSEVDSworSU5URVJSVVBUX1RSQU1QT0xJTkUJQk9PSzNTX0lOVEVSUlVQVF9EQVRBX1NUT1JBR0UKK0lOVEVSUlVQVF9UUkFNUE9MSU5FCUJPT0szU19JTlRFUlJVUFRfREFUQV9TRUdNRU5UCitJTlRFUlJVUFRfVFJBTVBPTElORQlCT09LM1NfSU5URVJSVVBUX0lOU1RfU1RPUkFHRQorSU5URVJSVVBUX1RSQU1QT0xJTkUJQk9PSzNTX0lOVEVSUlVQVF9JTlNUX1NFR01FTlQKK0lOVEVSUlVQVF9UUkFNUE9MSU5FCUJPT0szU19JTlRFUlJVUFRfRVhURVJOQUwKK0lOVEVSUlVQVF9UUkFNUE9MSU5FCUJPT0szU19JTlRFUlJVUFRfQUxJR05NRU5UCitJTlRFUlJVUFRfVFJBTVBPTElORQlCT09LM1NfSU5URVJSVVBUX1BST0dSQU0KK0lOVEVSUlVQVF9UUkFNUE9MSU5FCUJPT0szU19JTlRFUlJVUFRfRlBfVU5BVkFJTAorSU5URVJSVVBUX1RSQU1QT0xJTkUJQk9PSzNTX0lOVEVSUlVQVF9ERUNSRU1FTlRFUgorSU5URVJSVVBUX1RSQU1QT0xJTkUJQk9PSzNTX0lOVEVSUlVQVF9TWVNDQUxMCitJTlRFUlJVUFRfVFJBTVBPTElORQlCT09LM1NfSU5URVJSVVBUX1RSQUNFCitJTlRFUlJVUFRfVFJBTVBPTElORQlCT09LM1NfSU5URVJSVVBUX1BFUkZNT04KK0lOVEVSUlVQVF9UUkFNUE9MSU5FCUJPT0szU19JTlRFUlJVUFRfQUxUSVZFQworSU5URVJSVVBUX1RSQU1QT0xJTkUJQk9PSzNTX0lOVEVSUlVQVF9WU1gKKworLyoKKyAqIFRoaXMgdHJhbXBvbGluZSBicmluZ3MgdXMgYmFjayB0byBhIHJlYWwgbW9kZSBoYW5kbGVyCisgKgorICogSW5wdXQgUmVnaXN0ZXJzOgorICoKKyAqIFI2ID0gU1JSMAorICogUjcgPSBTUlIxCisgKiBMUiA9IHJlYWwtbW9kZSBJUAorICoKKyAqLworLmdsb2JhbCBrdm1wcGNfaGFuZGxlcl9sb3dtZW1fdHJhbXBvbGluZQora3ZtcHBjX2hhbmRsZXJfbG93bWVtX3RyYW1wb2xpbmU6CisKKwltdHNycjAJcjYKKwltdHNycjEJcjcKKwlibHIKK2t2bXBwY19oYW5kbGVyX2xvd21lbV90cmFtcG9saW5lX2VuZDoKKworLmdsb2JhbCBrdm1wcGNfdHJhbXBvbGluZV9sb3dtZW0KK2t2bXBwY190cmFtcG9saW5lX2xvd21lbToKKwkubG9uZyBrdm1wcGNfaGFuZGxlcl9sb3dtZW1fdHJhbXBvbGluZSAtIF9zdGV4dAorCisuZ2xvYmFsIGt2bXBwY190cmFtcG9saW5lX2VudGVyCitrdm1wcGNfdHJhbXBvbGluZV9lbnRlcjoKKwkubG9uZyBrdm1wcGNfaGFuZGxlcl90cmFtcG9saW5lX2VudGVyIC0gX3N0ZXh0CisKKyNpbmNsdWRlICJib29rM3NfNjRfc2xiLlMiCisKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzXzY0X3NsYi5TIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfNjRfc2xiLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNkMjM3YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzXzY0X3NsYi5TCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCisgKgorICogQ29weXJpZ2h0IFNVU0UgTGludXggUHJvZHVjdHMgR21iSCAyMDA5CisgKgorICogQXV0aG9yczogQWxleGFuZGVyIEdyYWYgPGFncmFmQHN1c2UuZGU+CisgKi8KKworI2RlZmluZSBTSEFET1dfU0xCX0VTSUQobnVtKQkoU0xCU0hBRE9XX1NBVkVBUkVBICsgKG51bSAqIDB4MTApKQorI2RlZmluZSBTSEFET1dfU0xCX1ZTSUQobnVtKQkoU0xCU0hBRE9XX1NBVkVBUkVBICsgKG51bSAqIDB4MTApICsgMHg4KQorI2RlZmluZSBVTkJPTFRfU0xCX0VOVFJZKG51bSkgXAorCWxkCXI5LCBTSEFET1dfU0xCX0VTSUQobnVtKShyMTIpOyBcCisJLyogSW52YWxpZD8gU2tpcC4gKi87IFwKKwlybGRpY2wuIHIwLCByOSwgMzcsIDYzOyBcCisJYmVxCXNsYl9lbnRyeV9za2lwXyAjIyBudW07IFwKKwl4b3JpcwlyOSwgcjksIFNMQl9FU0lEX1ZAaDsgXAorCXN0ZAlyOSwgU0hBRE9XX1NMQl9FU0lEKG51bSkocjEyKTsgXAorICBzbGJfZW50cnlfc2tpcF8gIyMgbnVtOgorCisjZGVmaW5lIFJFQk9MVF9TTEJfRU5UUlkobnVtKSBcCisJbGQJcjEwLCBTSEFET1dfU0xCX0VTSUQobnVtKShyMTEpOyBcCisJY21wZGkJcjEwLCAwOyBcCisJYmVxCXNsYl9leGl0X3NraXBfMTsgXAorCW9yaXMJcjEwLCByMTAsIFNMQl9FU0lEX1ZAaDsgXAorCWxkCXI5LCBTSEFET1dfU0xCX1ZTSUQobnVtKShyMTEpOyBcCisJc2xibXRlCXI5LCByMTA7IFwKKwlzdGQJcjEwLCBTSEFET1dfU0xCX0VTSUQobnVtKShyMTEpOyBcCitzbGJfZXhpdF9za2lwXyAjIyBudW06CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudHJ5IGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLmdsb2JhbCBrdm1wcGNfaGFuZGxlcl90cmFtcG9saW5lX2VudGVyCitrdm1wcGNfaGFuZGxlcl90cmFtcG9saW5lX2VudGVyOgorCisJLyogUmVxdWlyZWQgc3RhdGU6CisJICoKKwkgKiBNU1IgPSB+SVJ8RFIKKwkgKiBSMTMgPSBQQUNBCisJICogUjkgPSBndWVzdCBJUAorCSAqIFIxMCA9IGd1ZXN0IE1TUgorCSAqIFIxMSA9IGZyZWUKKwkgKiBSMTIgPSBmcmVlCisJICogUEFDQVtQQUNBX0VYTUMgKyBFWF9SOV0gPSBndWVzdCBSOQorCSAqIFBBQ0FbUEFDQV9FWE1DICsgRVhfUjEwXSA9IGd1ZXN0IFIxMAorCSAqIFBBQ0FbUEFDQV9FWE1DICsgRVhfUjExXSA9IGd1ZXN0IFIxMQorCSAqIFBBQ0FbUEFDQV9FWE1DICsgRVhfUjEyXSA9IGd1ZXN0IFIxMgorCSAqIFBBQ0FbUEFDQV9FWE1DICsgRVhfUjEzXSA9IGd1ZXN0IFIxMworCSAqIFBBQ0FbUEFDQV9FWE1DICsgRVhfQ0NSXSA9IGd1ZXN0IENSCisJICogUEFDQVtQQUNBX0VYTUMgKyBFWF9SM10gPSBndWVzdCBYRVIKKwkgKi8KKworCW10c3JyMAlyOQorCW10c3JyMQlyMTAKKworCW10c3ByCVNQUk5fU1BSR19TQ1JBVENIMCwgcjAKKworCS8qIFJlbW92ZSBMUEFSIHNoYWRvdyBlbnRyaWVzICovCisKKyNpZiBTTEJfTlVNX0JPTFRFRCA9PSAzCisKKwlsZAlyMTIsIFBBQ0FfU0xCU0hBRE9XUFRSKHIxMykKKworCS8qIFNhdmUgb2ZmIHRoZSBmaXJzdCBlbnRyeSBzbyB3ZSBjYW4gc2xiaWUgaXQgbGF0ZXIgKi8KKwlsZAlyMTAsIFNIQURPV19TTEJfRVNJRCgwKShyMTIpCisJbGQJcjExLCBTSEFET1dfU0xCX1ZTSUQoMCkocjEyKQorCisJLyogUmVtb3ZlIGJvbHRlZCBlbnRyaWVzICovCisJVU5CT0xUX1NMQl9FTlRSWSgwKQorCVVOQk9MVF9TTEJfRU5UUlkoMSkKKwlVTkJPTFRfU0xCX0VOVFJZKDIpCisJCisjZWxzZQorI2Vycm9yIHVua25vd24gbnVtYmVyIG9mIGJvbHRlZCBlbnRyaWVzCisjZW5kaWYKKworCS8qIEZsdXNoIFNMQiAqLworCisJc2xiaWEKKworCS8qIHIwID0gZXNpZCAmIEVTSURfTUFTSyAqLworCXJsZGljciAgcjEwLCByMTAsIDAsIDM1CisJLyogcjAgfD0gQ0xBU1NfQklUKFZTSUQpICovCisJcmxkaWMgICByMTIsIHIxMSwgNTYgLSAzNiwgMzYKKwlvciAgICAgIHIxMCwgcjEwLCByMTIKKwlzbGJpZQlyMTAKKworCWlzeW5jCisKKwkvKiBGaWxsIFNMQiB3aXRoIG91ciBzaGFkb3cgKi8KKworCWxieglyMTIsIFBBQ0FfS1ZNX1NMQl9NQVgocjEzKQorCW11bGxpCXIxMiwgcjEyLCAxNgorCWFkZGkJcjEyLCByMTIsIFBBQ0FfS1ZNX1NMQgorCWFkZAlyMTIsIHIxMiwgcjEzCisKKwkvKiBmb3IgKHIxMSA9IGt2bV9zbGI7IHIxMSA8IGt2bV9zbGIgKyBrdm1fc2xiX3NpemU7IHIxMSs9c2xiX2VudHJ5KSAqLworCWxpCXIxMSwgUEFDQV9LVk1fU0xCCisJYWRkCXIxMSwgcjExLCByMTMKKworc2xiX2xvb3BfZW50ZXI6CisKKwlsZAlyMTAsIDAocjExKQorCisJcmxkaWNsLiByMCwgcjEwLCAzNywgNjMKKwliZXEJc2xiX2xvb3BfZW50ZXJfc2tpcAorCisJbGQJcjksIDgocjExKQorCXNsYm10ZQlyOSwgcjEwCisKK3NsYl9sb29wX2VudGVyX3NraXA6CisJYWRkaQlyMTEsIHIxMSwgMTYKKwljbXBkCWNyMCwgcjExLCByMTIKKwlibHQJc2xiX2xvb3BfZW50ZXIKKworc2xiX2RvX2VudGVyOgorCisJLyogRW50ZXIgZ3Vlc3QgKi8KKworCW1mc3ByCXIwLCBTUFJOX1NQUkdfU0NSQVRDSDAKKworCWxkCXI5LCAoUEFDQV9FWE1DK0VYX1I5KShyMTMpCisJbGQJcjEwLCAoUEFDQV9FWE1DK0VYX1IxMCkocjEzKQorCWxkCXIxMiwgKFBBQ0FfRVhNQytFWF9SMTIpKHIxMykKKworCWx3eglyMTEsIChQQUNBX0VYTUMrRVhfQ0NSKShyMTMpCisJbXRjcglyMTEKKworCWxkCXIxMSwgKFBBQ0FfRVhNQytFWF9SMykocjEzKQorCW10eGVyCXIxMQorCisJbGQJcjExLCAoUEFDQV9FWE1DK0VYX1IxMSkocjEzKQorCWxkCXIxMywgKFBBQ0FfRVhNQytFWF9SMTMpKHIxMykKKworCVJGSQora3ZtcHBjX2hhbmRsZXJfdHJhbXBvbGluZV9lbnRlcl9lbmQ6CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGl0IGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy5nbG9iYWwga3ZtcHBjX2hhbmRsZXJfdHJhbXBvbGluZV9leGl0Citrdm1wcGNfaGFuZGxlcl90cmFtcG9saW5lX2V4aXQ6CisKKwkvKiBSZWdpc3RlciB1c2FnZSBhdCB0aGlzIHBvaW50OgorCSAqCisJICogU1BSR19TQ1JBVENIMCA9IGd1ZXN0IFIxMworCSAqIFIwMSAgICAgICAgICAgPSBob3N0IFIxCisJICogUjAyICAgICAgICAgICA9IGhvc3QgUjIKKwkgKiBSMTAgICAgICAgICAgID0gZ3Vlc3QgUEMKKwkgKiBSMTEgICAgICAgICAgID0gZ3Vlc3QgTVNSCisJICogUjEyICAgICAgICAgICA9IGV4aXQgaGFuZGxlciBpZAorCSAqIFIxMyAgICAgICAgICAgPSBQQUNBCisJICogUEFDQS5leG1jLkNDUiAgPSBndWVzdCBDUgorCSAqIFBBQ0EuZXhtYy5SOSAgPSBndWVzdCBSMQorCSAqIFBBQ0EuZXhtYy5SMTAgPSBndWVzdCBSMTAKKwkgKiBQQUNBLmV4bWMuUjExID0gZ3Vlc3QgUjExCisJICogUEFDQS5leG1jLlIxMiA9IGd1ZXN0IFIxMgorCSAqIFBBQ0EuZXhtYy5SMTMgPSBndWVzdCBSMgorCSAqCisJICovCisKKwkvKiBTYXZlIHJlZ2lzdGVycyAqLworCisJc3RkCXIwLCAoUEFDQV9FWE1DK0VYX1NSUjApKHIxMykKKwlzdGQJcjksIChQQUNBX0VYTUMrRVhfUjMpKHIxMykKKwlzdGQJcjEwLCAoUEFDQV9FWE1DK0VYX0xSKShyMTMpCisJc3RkCXIxMSwgKFBBQ0FfRVhNQytFWF9EQVIpKHIxMykKKworCS8qCisJICogSW4gb3JkZXIgZm9yIHVzIHRvIGVhc2lseSBnZXQgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24sCisJICogd2UgZ290IHRoZSAjdm1leGl0IGF0LCB3ZSBleHBsb2l0IHRoZSBmYWN0IHRoYXQgdGhlCisJICogdmlydHVhbCBsYXlvdXQgaXMgc3RpbGwgdGhlIHNhbWUgaGVyZSwgc28gd2UgY2FuIGp1c3QKKwkgKiBsZCBmcm9tIHRoZSBndWVzdCdzIFBDIGFkZHJlc3MKKwkgKi8KKworCS8qIFdlIG9ubHkgbG9hZCB0aGUgbGFzdCBpbnN0cnVjdGlvbiB3aGVuIGl0J3Mgc2FmZSAqLworCWNtcHdpCXIxMiwgQk9PSzNTX0lOVEVSUlVQVF9EQVRBX1NUT1JBR0UKKwliZXEJbGRfbGFzdF9pbnN0CisJY21wd2kJcjEyLCBCT09LM1NfSU5URVJSVVBUX1BST0dSQU0KKwliZXEJbGRfbGFzdF9pbnN0CisKKwliCW5vX2xkX2xhc3RfaW5zdAorCitsZF9sYXN0X2luc3Q6CisJLyogU2F2ZSBvZmYgdGhlIGd1ZXN0IGluc3RydWN0aW9uIHdlJ3JlIGF0ICovCisJLyogICAgMSkgZW5hYmxlIHBhZ2luZyBmb3IgZGF0YSAqLworCW1mbXNyCXI5CisJb3JpCXIxMSwgcjksIE1TUl9EUgkJCS8qIEVuYWJsZSBwYWdpbmcgZm9yIGRhdGEgKi8KKwltdG1zcglyMTEKKwkvKiAgICAyKSBmZXRjaCB0aGUgaW5zdHJ1Y3Rpb24gKi8KKwlsd3oJcjAsIDAocjEwKQorCS8qICAgIDMpIGRpc2FibGUgcGFnaW5nIGFnYWluICovCisJbXRtc3IJcjkKKworbm9fbGRfbGFzdF9pbnN0OgorCisJLyogUmVzdG9yZSBib2x0ZWQgZW50cmllcyBmcm9tIHRoZSBzaGFkb3cgYW5kIGZpeCBpdCBhbG9uZyB0aGUgd2F5ICovCisKKwkvKiBXZSBkb24ndCBzdG9yZSBhbnl0aGluZyBpbiBlbnRyeSAwLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHRha2UgY2FyZSBvZiBpdCAqLworCXNsYmlhCisJaXN5bmMKKworI2lmIFNMQl9OVU1fQk9MVEVEID09IDMKKworCWxkCXIxMSwgUEFDQV9TTEJTSEFET1dQVFIocjEzKQorCisJUkVCT0xUX1NMQl9FTlRSWSgwKQorCVJFQk9MVF9TTEJfRU5UUlkoMSkKKwlSRUJPTFRfU0xCX0VOVFJZKDIpCisJCisjZWxzZQorI2Vycm9yIHVua25vd24gbnVtYmVyIG9mIGJvbHRlZCBlbnRyaWVzCisjZW5kaWYKKworc2xiX2RvX2V4aXQ6CisKKwkvKiBSZXN0b3JlIHJlZ2lzdGVycyAqLworCisJbGQJcjExLCAoUEFDQV9FWE1DK0VYX0RBUikocjEzKQorCWxkCXIxMCwgKFBBQ0FfRVhNQytFWF9MUikocjEzKQorCWxkCXI5LCAoUEFDQV9FWE1DK0VYX1IzKShyMTMpCisKKwkvKiBTYXZlIGxhc3QgaW5zdCAqLworCXN0dwlyMCwgKFBBQ0FfRVhNQytFWF9MUikocjEzKQorCisJLyogU2F2ZSBEQVIgYW5kIERTSVNSIGJlZm9yZSBnb2luZyB0byBwYWdlZCBtb2RlICovCisJbWZkYXIJcjAKKwlzdGQJcjAsIChQQUNBX0VYTUMrRVhfREFSKShyMTMpCisJbWZkc2lzcglyMAorCXN0dwlyMCwgKFBBQ0FfRVhNQytFWF9EU0lTUikocjEzKQorCisJLyogUkZJIGludG8gdGhlIGhpZ2htZW0gaGFuZGxlciAqLworCW1mbXNyCXIwCisJb3JpCXIwLCByMCwgTVNSX0lSfE1TUl9EUnxNU1JfUkkJLyogRW5hYmxlIHBhZ2luZyAqLworCW10c3JyMQlyMAorCWxkCXIwLCBQQUNBU0FWRURNU1IocjEzKQkJLyogSGlnaG1lbSBoYW5kbGVyIGFkZHJlc3MgKi8KKwltdHNycjAJcjAKKworCW1mc3ByCXIwLCBTUFJOX1NQUkdfU0NSQVRDSDAKKworCVJGSQora3ZtcHBjX2hhbmRsZXJfdHJhbXBvbGluZV9leGl0X2VuZDoKKwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rZS5jIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rZS5jCmluZGV4IGU3YmY0ZDAuLjA2ZjVhOWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vYm9va2UuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2tlLmMKQEAgLTUyMCw2ICs1MjAsMTEgQEAKIAlyZXR1cm4ga3ZtcHBjX2NvcmVfdmNwdV90cmFuc2xhdGUodmNwdSwgdHIpOwogfQogCitpbnQga3ZtX3ZtX2lvY3RsX2dldF9kaXJ0eV9sb2coc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2RpcnR5X2xvZyAqbG9nKQoreworCXJldHVybiAtRU5PVFNVUFA7Cit9CisKIGludCBfX2luaXQga3ZtcHBjX2Jvb2tlX2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGl2b3JbMTZdOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9lbXVsYXRlLmMgYi9hcmNoL3Bvd2VycGMva3ZtL2VtdWxhdGUuYwppbmRleCA3NzM3MTQ2Li40YTlhYzY2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2VtdWxhdGUuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2VtdWxhdGUuYwpAQCAtMTgsNyArMTgsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgInRyYWNlLmgiCiAKICNkZWZpbmUgT1BfVFJBUCAzCisjZGVmaW5lIE9QX1RSQVBfNjQgMgogCiAjZGVmaW5lIE9QXzMxX1hPUF9MV1pYICAgICAgMjMKICNkZWZpbmUgT1BfMzFfWE9QX0xCWlggICAgICA4NwpAQCAtNjQsMTkgKzY1LDQ1IEBACiAjZGVmaW5lIE9QX1NUSCAgNDQKICNkZWZpbmUgT1BfU1RIVSA0NQogCisjaWZkZWYgQ09ORklHX1BQQzY0CitzdGF0aWMgaW50IGt2bXBwY19kZWNfZW5hYmxlZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJcmV0dXJuIDE7Cit9CisjZWxzZQorc3RhdGljIGludCBrdm1wcGNfZGVjX2VuYWJsZWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXJldHVybiB2Y3B1LT5hcmNoLnRjciAmIFRDUl9ESUU7Cit9CisjZW5kaWYKKwogdm9pZCBrdm1wcGNfZW11bGF0ZV9kZWMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCWlmICh2Y3B1LT5hcmNoLnRjciAmIFRDUl9ESUUpIHsKKwl1bnNpZ25lZCBsb25nIGRlY19uc2VjOworCisJcHJfZGVidWcoIm10REVDOiAleFxuIiwgdmNwdS0+YXJjaC5kZWMpOworI2lmZGVmIENPTkZJR19QUEM2NAorCS8qIFBPV0VSNCsgdHJpZ2dlcnMgYSBkZWMgaW50ZXJydXB0IGlmIHRoZSB2YWx1ZSBpcyA8IDAgKi8KKwlpZiAodmNwdS0+YXJjaC5kZWMgJiAweDgwMDAwMDAwKSB7CisJCWhydGltZXJfdHJ5X3RvX2NhbmNlbCgmdmNwdS0+YXJjaC5kZWNfdGltZXIpOworCQlrdm1wcGNfY29yZV9xdWV1ZV9kZWModmNwdSk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwlpZiAoa3ZtcHBjX2RlY19lbmFibGVkKHZjcHUpKSB7CiAJCS8qIFRoZSBkZWNyZW1lbnRlciB0aWNrcyBhdCB0aGUgc2FtZSByYXRlIGFzIHRoZSB0aW1lYmFzZSwgc28KIAkJICogdGhhdCdzIGhvdyB3ZSBjb252ZXJ0IHRoZSBndWVzdCBERUMgdmFsdWUgdG8gdGhlIG51bWJlciBvZgogCQkgKiBob3N0IHRpY2tzLiAqLwotCQl1bnNpZ25lZCBsb25nIG5yX2ppZmZpZXM7CiAKLQkJbnJfamlmZmllcyA9IHZjcHUtPmFyY2guZGVjIC8gdGJfdGlja3NfcGVyX2ppZmZ5OwotCQltb2RfdGltZXIoJnZjcHUtPmFyY2guZGVjX3RpbWVyLAotCQkgICAgICAgICAgZ2V0X2ppZmZpZXNfNjQoKSArIG5yX2ppZmZpZXMpOworCQlocnRpbWVyX3RyeV90b19jYW5jZWwoJnZjcHUtPmFyY2guZGVjX3RpbWVyKTsKKwkJZGVjX25zZWMgPSB2Y3B1LT5hcmNoLmRlYzsKKwkJZGVjX25zZWMgKj0gMTAwMDsKKwkJZGVjX25zZWMgLz0gdGJfdGlja3NfcGVyX3VzZWM7CisJCWhydGltZXJfc3RhcnQoJnZjcHUtPmFyY2guZGVjX3RpbWVyLCBrdGltZV9zZXQoMCwgZGVjX25zZWMpLAorCQkJICAgICAgSFJUSU1FUl9NT0RFX1JFTCk7CisJCXZjcHUtPmFyY2guZGVjX2ppZmZpZXMgPSBnZXRfdGIoKTsKIAl9IGVsc2UgewotCQlkZWxfdGltZXIoJnZjcHUtPmFyY2guZGVjX3RpbWVyKTsKKwkJaHJ0aW1lcl90cnlfdG9fY2FuY2VsKCZ2Y3B1LT5hcmNoLmRlY190aW1lcik7CiAJfQogfQogCkBAIC0xMTEsOSArMTM4LDE1IEBACiAJLyogdGhpcyBkZWZhdWx0IHR5cGUgbWlnaHQgYmUgb3ZlcndyaXR0ZW4gYnkgc3ViY2F0ZWdvcmllcyAqLwogCWt2bXBwY19zZXRfZXhpdF90eXBlKHZjcHUsIEVNVUxBVEVEX0lOU1RfRVhJVFMpOwogCisJcHJfZGVidWcoS0VSTl9JTkZPICJFbXVsYXRpbmcgb3Bjb2RlICVkIC8gJWRcbiIsIGdldF9vcChpbnN0KSwgZ2V0X3hvcChpbnN0KSk7CisKIAlzd2l0Y2ggKGdldF9vcChpbnN0KSkgewogCWNhc2UgT1BfVFJBUDoKKyNpZmRlZiBDT05GSUdfUFBDNjQKKwljYXNlIE9QX1RSQVBfNjQ6CisjZWxzZQogCQl2Y3B1LT5hcmNoLmVzciB8PSBFU1JfUFRSOworI2VuZGlmCiAJCWt2bXBwY19jb3JlX3F1ZXVlX3Byb2dyYW0odmNwdSk7CiAJCWFkdmFuY2UgPSAwOwogCQlicmVhazsKQEAgLTE4OCwxNyArMjIxLDE5IEBACiAJCQljYXNlIFNQUk5fU1JSMToKIAkJCQl2Y3B1LT5hcmNoLmdwcltydF0gPSB2Y3B1LT5hcmNoLnNycjE7IGJyZWFrOwogCQkJY2FzZSBTUFJOX1BWUjoKLQkJCQl2Y3B1LT5hcmNoLmdwcltydF0gPSBtZnNwcihTUFJOX1BWUik7IGJyZWFrOworCQkJCXZjcHUtPmFyY2guZ3ByW3J0XSA9IHZjcHUtPmFyY2gucHZyOyBicmVhazsKIAkJCWNhc2UgU1BSTl9QSVI6Ci0JCQkJdmNwdS0+YXJjaC5ncHJbcnRdID0gbWZzcHIoU1BSTl9QSVIpOyBicmVhazsKKwkJCQl2Y3B1LT5hcmNoLmdwcltydF0gPSB2Y3B1LT52Y3B1X2lkOyBicmVhazsKKwkJCWNhc2UgU1BSTl9NU1NTUjA6CisJCQkJdmNwdS0+YXJjaC5ncHJbcnRdID0gMDsgYnJlYWs7CiAKIAkJCS8qIE5vdGU6IG1mdGIgYW5kIFRCUkwvVEJXTCBhcmUgdXNlci1hY2Nlc3NpYmxlLCBzbwogCQkJICogdGhlIGd1ZXN0IGNhbiBhbHdheXMgYWNjZXNzIHRoZSByZWFsIFRCIGFueXdheXMuCiAJCQkgKiBJbiBmYWN0LCB3ZSBwcm9iYWJseSB3aWxsIG5ldmVyIHNlZSB0aGVzZSB0cmFwcy4gKi8KIAkJCWNhc2UgU1BSTl9UQldMOgotCQkJCXZjcHUtPmFyY2guZ3ByW3J0XSA9IG1mdGJsKCk7IGJyZWFrOworCQkJCXZjcHUtPmFyY2guZ3ByW3J0XSA9IGdldF90YigpID4+IDMyOyBicmVhazsKIAkJCWNhc2UgU1BSTl9UQldVOgotCQkJCXZjcHUtPmFyY2guZ3ByW3J0XSA9IG1mdGJ1KCk7IGJyZWFrOworCQkJCXZjcHUtPmFyY2guZ3ByW3J0XSA9IGdldF90YigpOyBicmVhazsKIAogCQkJY2FzZSBTUFJOX1NQUkcwOgogCQkJCXZjcHUtPmFyY2guZ3ByW3J0XSA9IHZjcHUtPmFyY2guc3ByZzA7IGJyZWFrOwpAQCAtMjExLDYgKzI0NiwxMyBAQAogCQkJLyogTm90ZTogU1BSRzQtNyBhcmUgdXNlci1yZWFkYWJsZSwgc28gd2UgZG9uJ3QgZ2V0CiAJCQkgKiBhIHRyYXAuICovCiAKKwkJCWNhc2UgU1BSTl9ERUM6CisJCQl7CisJCQkJdTY0IGpkID0gZ2V0X3RiKCkgLSB2Y3B1LT5hcmNoLmRlY19qaWZmaWVzOworCQkJCXZjcHUtPmFyY2guZ3ByW3J0XSA9IHZjcHUtPmFyY2guZGVjIC0gamQ7CisJCQkJcHJfZGVidWcoS0VSTl9JTkZPICJtZkRFQzogJXggLSAlbGx4ID0gJWx4XG4iLCB2Y3B1LT5hcmNoLmRlYywgamQsIHZjcHUtPmFyY2guZ3ByW3J0XSk7CisJCQkJYnJlYWs7CisJCQl9CiAJCQlkZWZhdWx0OgogCQkJCWVtdWxhdGVkID0ga3ZtcHBjX2NvcmVfZW11bGF0ZV9tZnNwcih2Y3B1LCBzcHJuLCBydCk7CiAJCQkJaWYgKGVtdWxhdGVkID09IEVNVUxBVEVfRkFJTCkgewpAQCAtMjYwLDYgKzMwMiw4IEBACiAJCQljYXNlIFNQUk5fVEJXTDogYnJlYWs7CiAJCQljYXNlIFNQUk5fVEJXVTogYnJlYWs7CiAKKwkJCWNhc2UgU1BSTl9NU1NTUjA6IGJyZWFrOworCiAJCQljYXNlIFNQUk5fREVDOgogCQkJCXZjcHUtPmFyY2guZGVjID0gdmNwdS0+YXJjaC5ncHJbcnNdOwogCQkJCWt2bXBwY19lbXVsYXRlX2RlYyh2Y3B1KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vcG93ZXJwYy5jIGIvYXJjaC9wb3dlcnBjL2t2bS9wb3dlcnBjLmMKaW5kZXggNTkwMmJiYy4uZjA2Y2Y5MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9wb3dlcnBjLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9wb3dlcnBjLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtMTQ0LDYgKzE0NSw5IEBACiAJaW50IHI7CiAKIAlzd2l0Y2ggKGV4dCkgeworCWNhc2UgS1ZNX0NBUF9QUENfU0VHU1RBVEU6CisJCXIgPSAxOworCQlicmVhazsKIAljYXNlIEtWTV9DQVBfQ09BTEVTQ0VEX01NSU86CiAJCXIgPSBLVk1fQ09BTEVTQ0VEX01NSU9fUEFHRV9PRkZTRVQ7CiAJCWJyZWFrOwpAQCAtMjA5LDEwICsyMTMsMjUgQEAKIAl9CiB9CiAKKy8qCisgKiBsb3cgbGV2ZWwgaHJ0aW1lciB3YWtlIHJvdXRpbmUuIEJlY2F1c2UgdGhpcyBydW5zIGluIGhhcmRpcnEgY29udGV4dAorICogd2Ugc2NoZWR1bGUgYSB0YXNrbGV0IHRvIGRvIHRoZSByZWFsIHdvcmsuCisgKi8KK2VudW0gaHJ0aW1lcl9yZXN0YXJ0IGt2bXBwY19kZWNyZW1lbnRlcl93YWtldXAoc3RydWN0IGhydGltZXIgKnRpbWVyKQoreworCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTsKKworCXZjcHUgPSBjb250YWluZXJfb2YodGltZXIsIHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5kZWNfdGltZXIpOworCXRhc2tsZXRfc2NoZWR1bGUoJnZjcHUtPmFyY2gudGFza2xldCk7CisKKwlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7Cit9CisKIGludCBrdm1fYXJjaF92Y3B1X2luaXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCXNldHVwX3RpbWVyKCZ2Y3B1LT5hcmNoLmRlY190aW1lciwga3ZtcHBjX2RlY3JlbWVudGVyX2Z1bmMsCi0JICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpdmNwdSk7CisJaHJ0aW1lcl9pbml0KCZ2Y3B1LT5hcmNoLmRlY190aW1lciwgQ0xPQ0tfUkVBTFRJTUUsIEhSVElNRVJfTU9ERV9BQlMpOworCXRhc2tsZXRfaW5pdCgmdmNwdS0+YXJjaC50YXNrbGV0LCBrdm1wcGNfZGVjcmVtZW50ZXJfZnVuYywgKHVsb25nKXZjcHUpOworCXZjcHUtPmFyY2guZGVjX3RpbWVyLmZ1bmN0aW9uID0ga3ZtcHBjX2RlY3JlbWVudGVyX3dha2V1cDsKIAogCXJldHVybiAwOwogfQpAQCAtNDEwLDExICs0MjksNiBAQAogCXJldHVybiByOwogfQogCi1pbnQga3ZtX3ZtX2lvY3RsX2dldF9kaXJ0eV9sb2coc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2RpcnR5X2xvZyAqbG9nKQotewotCXJldHVybiAtRU5PVFNVUFA7Ci19Ci0KIGxvbmcga3ZtX2FyY2hfdm1faW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsCiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpb2N0bCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL3RpbWluZy5jIGIvYXJjaC9wb3dlcnBjL2t2bS90aW1pbmcuYwppbmRleCAyYWEzNzFlLi43MDM3ODU1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL3RpbWluZy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vdGltaW5nLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vdGltZS5oPgogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RpdjY0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL3RyYWNlLmggYi9hcmNoL3Bvd2VycGMva3ZtL3RyYWNlLmgKaW5kZXggNjdmMjE5ZC4uYThlODQwMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS90cmFjZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vdHJhY2UuaApAQCAtMTIsOCArMTIsOCBAQAogICogVHJhY2Vwb2ludCBmb3IgZ3Vlc3QgbW9kZSBlbnRyeS4KICAqLwogVFJBQ0VfRVZFTlQoa3ZtX3BwY19pbnN0ciwKLQlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgaW5zdCwgdW5zaWduZWQgbG9uZyBwYywgdW5zaWduZWQgaW50IGVtdWxhdGUpLAotCVRQX0FSR1MoaW5zdCwgcGMsIGVtdWxhdGUpLAorCVRQX1BST1RPKHVuc2lnbmVkIGludCBpbnN0LCB1bnNpZ25lZCBsb25nIF9wYywgdW5zaWduZWQgaW50IGVtdWxhdGUpLAorCVRQX0FSR1MoaW5zdCwgX3BjLCBlbXVsYXRlKSwKIAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCV9fZmllbGQoCXVuc2lnbmVkIGludCwJaW5zdAkJKQpAQCAtMjMsNyArMjMsNyBAQAogCiAJVFBfZmFzdF9hc3NpZ24oCiAJCV9fZW50cnktPmluc3QJCT0gaW5zdDsKLQkJX19lbnRyeS0+cGMJCT0gcGM7CisJCV9fZW50cnktPnBjCQk9IF9wYzsKIAkJX19lbnRyeS0+ZW11bGF0ZQk9IGVtdWxhdGU7CiAJKSwKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2xpYi9jb3B5XzMyLlMgYi9hcmNoL3Bvd2VycGMvbGliL2NvcHlfMzIuUwppbmRleCBjNjU3ZGU1Li43NGE3ZjQxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbGliL2NvcHlfMzIuUworKysgYi9hcmNoL3Bvd2VycGMvbGliL2NvcHlfMzIuUwpAQCAtOTgsMjAgKzk4LDcgQEAKIAliZG56CTRiCiAzOgltdGN0cglyOQogCWxpCXI3LDQKLSNpZiAhZGVmaW5lZChDT05GSUdfOHh4KQogMTA6CWRjYnoJcjcscjYKLSNlbHNlCi0xMDoJc3R3CXI0LCA0KHI2KQotCXN0dwlyNCwgOChyNikKLQlzdHcJcjQsIDEyKHI2KQotCXN0dwlyNCwgMTYocjYpCi0jaWYgQ0FDSEVfTElORV9TSVpFID49IDMyCi0Jc3R3CXI0LCAyMChyNikKLQlzdHcJcjQsIDI0KHI2KQotCXN0dwlyNCwgMjgocjYpCi0Jc3R3CXI0LCAzMihyNikKLSNlbmRpZiAvKiBDQUNIRV9MSU5FX1NJWkUgKi8KLSNlbmRpZgogCWFkZGkJcjYscjYsQ0FDSEVMSU5FX0JZVEVTCiAJYmRuegkxMGIKIAljbHJsd2kJcjUscjgsMzItTEdfQ0FDSEVMSU5FX0JZVEVTCkBAIC0yMDAsOSArMTg3LDcgQEAKIAltdGN0cglyMAogCWJlcQk2M2YKIDUzOgotI2lmICFkZWZpbmVkKENPTkZJR184eHgpCiAJZGNieglyMTEscjYKLSNlbmRpZgogCUNPUFlfMTZfQllURVMKICNpZiBMMV9DQUNIRV9CWVRFUyA+PSAzMgogCUNPUFlfMTZfQllURVMKQEAgLTM1NiwxNCArMzQxLDYgQEAKIAlsaQlyMTEsNAogCWJlcQk2M2YKIAotI2lmZGVmIENPTkZJR184eHgKLQkvKiBEb24ndCB1c2UgcHJlZmV0Y2ggb24gOHh4ICovCi0JbXRjdHIJcjAKLQlsaQlyMCwwCi01MzoJQ09QWV8xNl9CWVRFU19XSVRIRVgoMCkKLQliZG56CTUzYgotCi0jZWxzZSAvKiBub3QgQ09ORklHXzh4eCAqLwogCS8qIEhlcmUgd2UgZGVjaWRlIGhvdyBmYXIgYWhlYWQgdG8gcHJlZmV0Y2ggdGhlIHNvdXJjZSAqLwogCWxpCXIzLDQKIAljbXB3aQlyMCwxCkBAIC00MTYsNyArMzkzLDYgQEAKIAlsaQlyMyw0CiAJbGkJcjcsMAogCWJuZQkxMTRiCi0jZW5kaWYgLyogQ09ORklHXzh4eCAqLwogCiA2MzoJc3J3aS4JcjAscjUsMgogCW10Y3RyCXIwCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvbW0vTWFrZWZpbGUKaW5kZXggNmZiOGZjOC4uY2U2ODcwOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9NYWtlZmlsZQpAQCAtMjgsNyArMjgsMTAgQEAKIG9iai0kKENPTkZJR19GU0xfQk9PS0UpCQkrPSBmc2xfYm9va2VfbW11Lm8KIG9iai0kKENPTkZJR19ORUVEX01VTFRJUExFX05PREVTKSArPSBudW1hLm8KIG9iai0kKENPTkZJR19QUENfTU1fU0xJQ0VTKQkrPSBzbGljZS5vCi1vYmotJChDT05GSUdfSFVHRVRMQl9QQUdFKQkrPSBodWdldGxicGFnZS5vCitpZmVxICgkKENPTkZJR19IVUdFVExCX1BBR0UpLHkpCitvYmoteQkJCQkrPSBodWdldGxicGFnZS5vCitvYmotJChDT05GSUdfUFBDX1NURF9NTVVfNjQpCSs9IGh1Z2V0bGJwYWdlLWhhc2g2NC5vCitlbmRpZgogb2JqLSQoQ09ORklHX1BQQ19TVUJQQUdFX1BST1QpCSs9IHN1YnBhZ2UtcHJvdC5vCiBvYmotJChDT05GSUdfTk9UX0NPSEVSRU5UX0NBQ0hFKSArPSBkbWEtbm9uY29oZXJlbnQubwogb2JqLSQoQ09ORklHX0hJR0hNRU0pCQkrPSBoaWdobWVtLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9mYXVsdC5jIGIvYXJjaC9wb3dlcnBjL21tL2ZhdWx0LmMKaW5kZXggZTdkYWU4Mi4uMjZmYjZiOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2ZhdWx0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2ZhdWx0LmMKQEAgLTQwLDcgKzQwLDcgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9zaWdpbmZvLmg+Ci0KKyNpbmNsdWRlIDxtbS9tbXVfZGVjbC5oPgogCiAjaWZkZWYgQ09ORklHX0tQUk9CRVMKIHN0YXRpYyBpbmxpbmUgaW50IG5vdGlmeV9wYWdlX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQpAQCAtMjQ2LDYgKzI0NiwxMiBAQAogCQlnb3RvIGJhZF9hcmVhOwogI2VuZGlmIC8qIENPTkZJR182eHggKi8KICNpZiBkZWZpbmVkKENPTkZJR184eHgpCisJLyogOHh4IHNvbWV0aW1lcyBuZWVkIHRvIGxvYWQgYSBpbnZhbGlkL25vbi1wcmVzZW50IFRMQnMuCisJICogVGhlc2UgbXVzdCBiZSBpbnZhbGlkYXRlZCBzZXBhcmF0ZWx5IGFzIGxpbnV4IG1tIGRvbid0LgorCSAqLworCWlmIChlcnJvcl9jb2RlICYgMHg0MDAwMDAwMCkgLyogbm8gdHJhbnNsYXRpb24/ICovCisJCV90bGJpbF92YShhZGRyZXNzLCAwLCAwLCAwKTsKKwogICAgICAgICAvKiBUaGUgTVBDOHh4IHNlZW1zIHRvIGFsd2F5cyBzZXQgMHg4MDAwMDAwMCwgd2hpY2ggaXMKICAgICAgICAgICogInVuZGVmaW5lZCIuICBPZiB0aG9zZSB0aGF0IGNhbiBiZSBzZXQsIHRoaXMgaXMgdGhlIG9ubHkKICAgICAgICAgICogb25lIHdoaWNoIHNlZW1zIGJhZC4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9mc2xfYm9va2VfbW11LmMgYi9hcmNoL3Bvd2VycGMvbW0vZnNsX2Jvb2tlX21tdS5jCmluZGV4IGRjOTNlOTUuLmZjZmNiNmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9mc2xfYm9va2VfbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2ZzbF9ib29rZV9tbXUuYwpAQCAtNTQsMjYgKzU0LDM1IEBACiAKICNpbmNsdWRlICJtbXVfZGVjbC5oIgogCi1leHRlcm4gdm9pZCBsb2FkY2FtX2VudHJ5KHVuc2lnbmVkIGludCBpbmRleCk7CiB1bnNpZ25lZCBpbnQgdGxiY2FtX2luZGV4Owotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FtW0NPTkZJR19MT1dNRU1fQ0FNX05VTV07CiAKLSNkZWZpbmUgTlVNX1RMQkNBTVMJKDE2KQorI2RlZmluZSBOVU1fVExCQ0FNUwkoNjQpCiAKICNpZiBkZWZpbmVkKENPTkZJR19MT1dNRU1fQ0FNX05VTV9CT09MKSAmJiAoQ09ORklHX0xPV01FTV9DQU1fTlVNID49IE5VTV9UTEJDQU1TKQogI2Vycm9yICJMT1dNRU1fQ0FNX05VTSBtdXN0IGJlIGxlc3MgdGhhbiBOVU1fVExCQ0FNUyIKICNlbmRpZgogCi1zdHJ1Y3QgdGxiY2FtIFRMQkNBTVtOVU1fVExCQ0FNU107CitzdHJ1Y3QgdGxiY2FtIHsKKwl1MzIJTUFTMDsKKwl1MzIJTUFTMTsKKwl1bnNpZ25lZCBsb25nCU1BUzI7CisJdTMyCU1BUzM7CisJdTMyCU1BUzc7Cit9IFRMQkNBTVtOVU1fVExCQ0FNU107CiAKIHN0cnVjdCB0bGJjYW1yYW5nZSB7Ci0gICAJdW5zaWduZWQgbG9uZyBzdGFydDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0OwogCXVuc2lnbmVkIGxvbmcgbGltaXQ7CiAJcGh5c19hZGRyX3QgcGh5czsKIH0gdGxiY2FtX2FkZHJzW05VTV9UTEJDQU1TXTsKIAogZXh0ZXJuIHVuc2lnbmVkIGludCB0bGJjYW1faW5kZXg7CiAKK3Vuc2lnbmVkIGxvbmcgdGxiY2FtX3N6KGludCBpZHgpCit7CisJcmV0dXJuIHRsYmNhbV9hZGRyc1tpZHhdLmxpbWl0IC0gdGxiY2FtX2FkZHJzW2lkeF0uc3RhcnQgKyAxOworfQorCiAvKgogICogUmV0dXJuIFBBIGZvciB0aGlzIFZBIGlmIGl0IGlzIG1hcHBlZCBieSBhIENBTSwgb3IgMAogICovCkBAIC05NCwyMyArMTAzLDM2IEBACiAJaW50IGI7CiAJZm9yIChiID0gMDsgYiA8IHRsYmNhbV9pbmRleDsgKytiKQogCQlpZiAocGEgPj0gdGxiY2FtX2FkZHJzW2JdLnBoeXMKLQkgICAgCSAgICAmJiBwYSA8ICh0bGJjYW1fYWRkcnNbYl0ubGltaXQtdGxiY2FtX2FkZHJzW2JdLnN0YXJ0KQorCQkJJiYgcGEgPCAodGxiY2FtX2FkZHJzW2JdLmxpbWl0LXRsYmNhbV9hZGRyc1tiXS5zdGFydCkKIAkJICAgICAgICAgICAgICArdGxiY2FtX2FkZHJzW2JdLnBoeXMpCiAJCQlyZXR1cm4gdGxiY2FtX2FkZHJzW2JdLnN0YXJ0KyhwYS10bGJjYW1fYWRkcnNbYl0ucGh5cyk7CiAJcmV0dXJuIDA7CiB9CiAKK3ZvaWQgbG9hZGNhbV9lbnRyeShpbnQgaWR4KQoreworCW10c3ByKFNQUk5fTUFTMCwgVExCQ0FNW2lkeF0uTUFTMCk7CisJbXRzcHIoU1BSTl9NQVMxLCBUTEJDQU1baWR4XS5NQVMxKTsKKwltdHNwcihTUFJOX01BUzIsIFRMQkNBTVtpZHhdLk1BUzIpOworCW10c3ByKFNQUk5fTUFTMywgVExCQ0FNW2lkeF0uTUFTMyk7CisKKwlpZiAoY3VyX2NwdV9zcGVjLT5jcHVfZmVhdHVyZXMgJiBNTVVfRlRSX0JJR19QSFlTKQorCQltdHNwcihTUFJOX01BUzcsIFRMQkNBTVtpZHhdLk1BUzcpOworCisJYXNtIHZvbGF0aWxlKCJpc3luYzt0bGJ3ZTtpc3luYyIgOiA6IDogIm1lbW9yeSIpOworfQorCiAvKgogICogU2V0IHVwIG9uZSBvZiB0aGUgSS9EIEJBVCAoYmxvY2sgYWRkcmVzcyB0cmFuc2xhdGlvbikgcmVnaXN0ZXIgcGFpcnMuCiAgKiBUaGUgcGFyYW1ldGVycyBhcmUgbm90IGNoZWNrZWQ7IGluIHBhcnRpY3VsYXIgc2l6ZSBtdXN0IGJlIGEgcG93ZXIKICAqIG9mIDQgYmV0d2VlbiA0ayBhbmQgMjU2TS4KICAqLwotdm9pZCBzZXR0bGJjYW0oaW50IGluZGV4LCB1bnNpZ25lZCBsb25nIHZpcnQsIHBoeXNfYWRkcl90IHBoeXMsCi0JCXVuc2lnbmVkIGludCBzaXplLCBpbnQgZmxhZ3MsIHVuc2lnbmVkIGludCBwaWQpCitzdGF0aWMgdm9pZCBzZXR0bGJjYW0oaW50IGluZGV4LCB1bnNpZ25lZCBsb25nIHZpcnQsIHBoeXNfYWRkcl90IHBoeXMsCisJCXVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgaW50IHBpZCkKIHsKIAl1bnNpZ25lZCBpbnQgdHNpemUsIGx6OwogCi0JYXNtICgiY250bHp3ICUwLCUxIiA6ICI9ciIgKGx6KSA6ICJyIiAoc2l6ZSkpOworCWFzbSAoUFBDX0NOVExaTCAiJTAsJTEiIDogIj1yIiAobHopIDogInIiIChzaXplKSk7CiAJdHNpemUgPSAyMSAtIGx6OwogCiAjaWZkZWYgQ09ORklHX1NNUApAQCAtMTI4LDggKzE1MCwxMCBAQAogCVRMQkNBTVtpbmRleF0uTUFTMiB8PSAoZmxhZ3MgJiBfUEFHRV9HVUFSREVEKSA/IE1BUzJfRyA6IDA7CiAJVExCQ0FNW2luZGV4XS5NQVMyIHw9IChmbGFncyAmIF9QQUdFX0VORElBTikgPyBNQVMyX0UgOiAwOwogCi0JVExCQ0FNW2luZGV4XS5NQVMzID0gKHBoeXMgJiBQQUdFX01BU0spIHwgTUFTM19TWCB8IE1BUzNfU1I7CisJVExCQ0FNW2luZGV4XS5NQVMzID0gKHBoeXMgJiBNQVMzX1JQTikgfCBNQVMzX1NYIHwgTUFTM19TUjsKIAlUTEJDQU1baW5kZXhdLk1BUzMgfD0gKChmbGFncyAmIF9QQUdFX1JXKSA/IE1BUzNfU1cgOiAwKTsKKwlpZiAoY3VyX2NwdV9zcGVjLT5jcHVfZmVhdHVyZXMgJiBNTVVfRlRSX0JJR19QSFlTKQorCQlUTEJDQU1baW5kZXhdLk1BUzcgPSAodTY0KXBoeXMgPj4gMzI7CiAKICNpZm5kZWYgQ09ORklHX0tHREIgLyogd2FudCB1c2VyIGFjY2VzcyBmb3IgYnJlYWtwb2ludHMgKi8KIAlpZiAoZmxhZ3MgJiBfUEFHRV9VU0VSKSB7CkBAIC0xNDgsMjcgKzE3Miw0NCBAQAogCWxvYWRjYW1fZW50cnkoaW5kZXgpOwogfQogCi12b2lkIGludmFsaWRhdGVfdGxiY2FtX2VudHJ5KGludCBpbmRleCkKK3Vuc2lnbmVkIGxvbmcgbWFwX21lbV9pbl9jYW1zKHVuc2lnbmVkIGxvbmcgcmFtLCBpbnQgbWF4X2NhbV9pZHgpCiB7Ci0JVExCQ0FNW2luZGV4XS5NQVMwID0gTUFTMF9UTEJTRUwoMSkgfCBNQVMwX0VTRUwoaW5kZXgpOwotCVRMQkNBTVtpbmRleF0uTUFTMSA9IH5NQVMxX1ZBTElEOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgdmlydCA9IFBBR0VfT0ZGU0VUOworCXBoeXNfYWRkcl90IHBoeXMgPSBtZW1zdGFydF9hZGRyOworCXVuc2lnbmVkIGxvbmcgYW1vdW50X21hcHBlZCA9IDA7CisJdW5zaWduZWQgbG9uZyBtYXhfY2FtID0gKG1mc3ByKFNQUk5fVExCMUNGRykgPj4gMTYpICYgMHhmOwogCi0JbG9hZGNhbV9lbnRyeShpbmRleCk7CisJLyogQ29udmVydCAoNF5tYXgpIGtCIHRvICgyXm1heCkgYnl0ZXMgKi8KKwltYXhfY2FtID0gbWF4X2NhbSAqIDIgKyAxMDsKKworCS8qIENhbGN1bGF0ZSBDQU0gdmFsdWVzICovCisJZm9yIChpID0gMDsgcmFtICYmIGkgPCBtYXhfY2FtX2lkeDsgaSsrKSB7CisJCXVuc2lnbmVkIGludCBjYW1zaXplID0gX19pbG9nMihyYW0pICYgfjFVOworCQl1bnNpZ25lZCBpbnQgYWxpZ24gPSBfX2Zmcyh2aXJ0IHwgcGh5cykgJiB+MVU7CisJCXVuc2lnbmVkIGxvbmcgY2FtX3N6OworCisJCWlmIChjYW1zaXplID4gYWxpZ24pCisJCQljYW1zaXplID0gYWxpZ247CisJCWlmIChjYW1zaXplID4gbWF4X2NhbSkKKwkJCWNhbXNpemUgPSBtYXhfY2FtOworCisJCWNhbV9zeiA9IDFVTCA8PCBjYW1zaXplOworCQlzZXR0bGJjYW0oaSwgdmlydCwgcGh5cywgY2FtX3N6LCBQQUdFX0tFUk5FTF9YLCAwKTsKKworCQlyYW0gLT0gY2FtX3N6OworCQlhbW91bnRfbWFwcGVkICs9IGNhbV9zejsKKwkJdmlydCArPSBjYW1fc3o7CisJCXBoeXMgKz0gY2FtX3N6OworCX0KKwl0bGJjYW1faW5kZXggPSBpOworCisJcmV0dXJuIGFtb3VudF9tYXBwZWQ7CiB9CiAKIHVuc2lnbmVkIGxvbmcgX19pbml0IG1tdV9tYXBpbl9yYW0odm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHZpcnQgPSBQQUdFX09GRlNFVDsKLQlwaHlzX2FkZHJfdCBwaHlzID0gbWVtc3RhcnRfYWRkcjsKLQotCXdoaWxlICh0bGJjYW1faW5kZXggPCBBUlJBWV9TSVpFKGNhbSkgJiYgY2FtW3RsYmNhbV9pbmRleF0pIHsKLQkJc2V0dGxiY2FtKHRsYmNhbV9pbmRleCwgdmlydCwgcGh5cywgY2FtW3RsYmNhbV9pbmRleF0sIFBBR0VfS0VSTkVMX1gsIDApOwotCQl2aXJ0ICs9IGNhbVt0bGJjYW1faW5kZXhdOwotCQlwaHlzICs9IGNhbVt0bGJjYW1faW5kZXhdOwotCQl0bGJjYW1faW5kZXgrKzsKLQl9Ci0KLQlyZXR1cm4gdmlydCAtIFBBR0VfT0ZGU0VUOworCXJldHVybiB0bGJjYW1fYWRkcnNbdGxiY2FtX2luZGV4IC0gMV0ubGltaXQgLSBQQUdFX09GRlNFVCArIDE7CiB9CiAKIC8qCkBAIC0xNzksNDYgKzIyMCwyMSBAQAogCWZsdXNoX2luc3RydWN0aW9uX2NhY2hlKCk7CiB9CiAKLXZvaWQgX19pbml0Ci1hZGp1c3RfdG90YWxfbG93bWVtKHZvaWQpCit2b2lkIF9faW5pdCBhZGp1c3RfdG90YWxfbG93bWVtKHZvaWQpCiB7Ci0JcGh5c19hZGRyX3QgcmFtOwotCXVuc2lnbmVkIGludCBtYXhfY2FtID0gKG1mc3ByKFNQUk5fVExCMUNGRykgPj4gMTYpICYgMHhmZjsKLQljaGFyIGJ1ZltBUlJBWV9TSVpFKGNhbSkgKiA1ICsgMV0sICpwID0gYnVmOworCXVuc2lnbmVkIGxvbmcgcmFtOwogCWludCBpOwotCXVuc2lnbmVkIGxvbmcgdmlydCA9IFBBR0VfT0ZGU0VUICYgMHhmZmZmZmZmZlVMOwotCXVuc2lnbmVkIGxvbmcgcGh5cyA9IG1lbXN0YXJ0X2FkZHIgJiAweGZmZmZmZmZmVUw7Ci0KLQkvKiBDb252ZXJ0ICg0Xm1heCkga0IgdG8gKDJebWF4KSBieXRlcyAqLwotCW1heF9jYW0gPSBtYXhfY2FtICogMiArIDEwOwogCiAJLyogYWRqdXN0IGxvd21lbSBzaXplIHRvIF9fbWF4X2xvd19tZW1vcnkgKi8KIAlyYW0gPSBtaW4oKHBoeXNfYWRkcl90KV9fbWF4X2xvd19tZW1vcnksIChwaHlzX2FkZHJfdCl0b3RhbF9sb3dtZW0pOwogCi0JLyogQ2FsY3VsYXRlIENBTSB2YWx1ZXMgKi8KLQlfX21heF9sb3dfbWVtb3J5ID0gMDsKLQlmb3IgKGkgPSAwOyByYW0gJiYgaSA8IEFSUkFZX1NJWkUoY2FtKTsgaSsrKSB7Ci0JCXVuc2lnbmVkIGludCBjYW1zaXplID0gX19pbG9nMihyYW0pICYgfjFVOwotCQl1bnNpZ25lZCBpbnQgYWxpZ24gPSBfX2Zmcyh2aXJ0IHwgcGh5cykgJiB+MVU7CisJX19tYXhfbG93X21lbW9yeSA9IG1hcF9tZW1faW5fY2FtcyhyYW0sIENPTkZJR19MT1dNRU1fQ0FNX05VTSk7CiAKLQkJaWYgKGNhbXNpemUgPiBhbGlnbikKLQkJCWNhbXNpemUgPSBhbGlnbjsKLQkJaWYgKGNhbXNpemUgPiBtYXhfY2FtKQotCQkJY2Ftc2l6ZSA9IG1heF9jYW07Ci0KLQkJY2FtW2ldID0gMVVMIDw8IGNhbXNpemU7Ci0JCXJhbSAtPSBjYW1baV07Ci0JCV9fbWF4X2xvd19tZW1vcnkgKz0gY2FtW2ldOwotCQl2aXJ0ICs9IGNhbVtpXTsKLQkJcGh5cyArPSBjYW1baV07Ci0KLQkJcCArPSBzcHJpbnRmKHAsICIlbHUvIiwgY2FtW2ldID4+IDIwKTsKLQl9Ci0JZm9yICg7IGkgPCBBUlJBWV9TSVpFKGNhbSk7IGkrKykKLQkJcCArPSBzcHJpbnRmKHAsICIwLyIpOwotCXBbLTFdID0gJ1wwJzsKLQotCXByX2luZm8oIk1lbW9yeSBDQU0gbWFwcGluZzogJXMgTWIsIHJlc2lkdWFsOiAlZE1iXG4iLCBidWYsCisJcHJfaW5mbygiTWVtb3J5IENBTSBtYXBwaW5nOiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgdGxiY2FtX2luZGV4IC0gMTsgaSsrKQorCQlwcl9jb250KCIlbHUvIiwgdGxiY2FtX3N6KGkpID4+IDIwKTsKKwlwcl9jb250KCIlbHUgTWIsIHJlc2lkdWFsOiAlZE1iXG4iLCB0bGJjYW1fc3oodGxiY2FtX2luZGV4IC0gMSkgPj4gMjAsCiAJICAgICAgICAodW5zaWduZWQgaW50KSgodG90YWxfbG93bWVtIC0gX19tYXhfbG93X21lbW9yeSkgPj4gMjApKTsKKwogCV9faW5pdGlhbF9tZW1vcnlfbGltaXRfYWRkciA9IG1lbXN0YXJ0X2FkZHIgKyBfX21heF9sb3dfbWVtb3J5OwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2d1cC5jIGIvYXJjaC9wb3dlcnBjL21tL2d1cC5jCmluZGV4IGJjMTIyYTEuLmQ3ZWZkYmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9ndXAuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vZ3VwLmMKQEAgLTU1LDU3ICs1NSw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLSNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFCi1zdGF0aWMgbm9pbmxpbmUgaW50IGd1cF9odWdlX3B0ZShwdGVfdCAqcHRlcCwgc3RydWN0IGhzdGF0ZSAqaHN0YXRlLAotCQkJCSB1bnNpZ25lZCBsb25nICphZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwKLQkJCQkgaW50IHdyaXRlLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBpbnQgKm5yKQotewotCXVuc2lnbmVkIGxvbmcgbWFzazsKLQl1bnNpZ25lZCBsb25nIHB0ZV9lbmQ7Ci0Jc3RydWN0IHBhZ2UgKmhlYWQsICpwYWdlOwotCXB0ZV90IHB0ZTsKLQlpbnQgcmVmczsKLQotCXB0ZV9lbmQgPSAoKmFkZHIgKyBodWdlX3BhZ2Vfc2l6ZShoc3RhdGUpKSAmIGh1Z2VfcGFnZV9tYXNrKGhzdGF0ZSk7Ci0JaWYgKHB0ZV9lbmQgPCBlbmQpCi0JCWVuZCA9IHB0ZV9lbmQ7Ci0KLQlwdGUgPSAqcHRlcDsKLQltYXNrID0gX1BBR0VfUFJFU0VOVHxfUEFHRV9VU0VSOwotCWlmICh3cml0ZSkKLQkJbWFzayB8PSBfUEFHRV9SVzsKLQlpZiAoKHB0ZV92YWwocHRlKSAmIG1hc2spICE9IG1hc2spCi0JCXJldHVybiAwOwotCS8qIGh1Z2VwYWdlcyBhcmUgbmV2ZXIgInNwZWNpYWwiICovCi0JVk1fQlVHX09OKCFwZm5fdmFsaWQocHRlX3BmbihwdGUpKSk7Ci0KLQlyZWZzID0gMDsKLQloZWFkID0gcHRlX3BhZ2UocHRlKTsKLQlwYWdlID0gaGVhZCArICgoKmFkZHIgJiB+aHVnZV9wYWdlX21hc2soaHN0YXRlKSkgPj4gUEFHRV9TSElGVCk7Ci0JZG8gewotCQlWTV9CVUdfT04oY29tcG91bmRfaGVhZChwYWdlKSAhPSBoZWFkKTsKLQkJcGFnZXNbKm5yXSA9IHBhZ2U7Ci0JCSgqbnIpKys7Ci0JCXBhZ2UrKzsKLQkJcmVmcysrOwotCX0gd2hpbGUgKCphZGRyICs9IFBBR0VfU0laRSwgKmFkZHIgIT0gZW5kKTsKLQotCWlmICghcGFnZV9jYWNoZV9hZGRfc3BlY3VsYXRpdmUoaGVhZCwgcmVmcykpIHsKLQkJKm5yIC09IHJlZnM7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAodW5saWtlbHkocHRlX3ZhbChwdGUpICE9IHB0ZV92YWwoKnB0ZXApKSkgewotCQkvKiBDb3VsZCBiZSBvcHRpbWl6ZWQgYmV0dGVyICovCi0JCXdoaWxlICgqbnIpIHsKLQkJCXB1dF9wYWdlKHBhZ2UpOwotCQkJKCpuciktLTsKLQkJfQotCX0KLQotCXJldHVybiAxOwotfQotI2VuZGlmIC8qIENPTkZJR19IVUdFVExCX1BBR0UgKi8KLQogc3RhdGljIGludCBndXBfcG1kX3JhbmdlKHB1ZF90IHB1ZCwgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwKIAkJaW50IHdyaXRlLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBpbnQgKm5yKQogewpAQCAtMTE5LDcgKzY4LDExIEBACiAJCW5leHQgPSBwbWRfYWRkcl9lbmQoYWRkciwgZW5kKTsKIAkJaWYgKHBtZF9ub25lKHBtZCkpCiAJCQlyZXR1cm4gMDsKLQkJaWYgKCFndXBfcHRlX3JhbmdlKHBtZCwgYWRkciwgbmV4dCwgd3JpdGUsIHBhZ2VzLCBucikpCisJCWlmIChpc19odWdlcGQocG1kcCkpIHsKKwkJCWlmICghZ3VwX2h1Z2VwZCgoaHVnZXBkX3QgKilwbWRwLCBQTURfU0hJRlQsCisJCQkJCWFkZHIsIG5leHQsIHdyaXRlLCBwYWdlcywgbnIpKQorCQkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKCFndXBfcHRlX3JhbmdlKHBtZCwgYWRkciwgbmV4dCwgd3JpdGUsIHBhZ2VzLCBucikpCiAJCQlyZXR1cm4gMDsKIAl9IHdoaWxlIChwbWRwKyssIGFkZHIgPSBuZXh0LCBhZGRyICE9IGVuZCk7CiAKQEAgLTEzOSw3ICs5MiwxMSBAQAogCQluZXh0ID0gcHVkX2FkZHJfZW5kKGFkZHIsIGVuZCk7CiAJCWlmIChwdWRfbm9uZShwdWQpKQogCQkJcmV0dXJuIDA7Ci0JCWlmICghZ3VwX3BtZF9yYW5nZShwdWQsIGFkZHIsIG5leHQsIHdyaXRlLCBwYWdlcywgbnIpKQorCQlpZiAoaXNfaHVnZXBkKHB1ZHApKSB7CisJCQlpZiAoIWd1cF9odWdlcGQoKGh1Z2VwZF90ICopcHVkcCwgUFVEX1NISUZULAorCQkJCQlhZGRyLCBuZXh0LCB3cml0ZSwgcGFnZXMsIG5yKSkKKwkJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmICghZ3VwX3BtZF9yYW5nZShwdWQsIGFkZHIsIG5leHQsIHdyaXRlLCBwYWdlcywgbnIpKQogCQkJcmV0dXJuIDA7CiAJfSB3aGlsZSAocHVkcCsrLCBhZGRyID0gbmV4dCwgYWRkciAhPSBlbmQpOwogCkBAIC0xNTQsMTAgKzExMSw2IEBACiAJdW5zaWduZWQgbG9uZyBuZXh0OwogCXBnZF90ICpwZ2RwOwogCWludCBuciA9IDA7Ci0jaWZkZWYgQ09ORklHX1BQQzY0Ci0JdW5zaWduZWQgaW50IHNoaWZ0OwotCWludCBwc2l6ZTsKLSNlbmRpZgogCiAJcHJfZGV2ZWwoIiVzKCVseCwleCwlcylcbiIsIF9fZnVuY19fLCBzdGFydCwgbnJfcGFnZXMsIHdyaXRlID8gIndyaXRlIiA6ICJyZWFkIik7CiAKQEAgLTE3MiwyNSArMTI1LDYgQEAKIAogCXByX2RldmVsKCIgIGFsaWduZWQ6ICVseCAuLiAlbHhcbiIsIHN0YXJ0LCBlbmQpOwogCi0jaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQotCS8qIFdlIGJhaWwgb3V0IG9uIHNsaWNlIGJvdW5kYXJ5IGNyb3NzaW5nIHdoZW4gaHVnZXRsYiBpcwotCSAqIGVuYWJsZWQgaW4gb3JkZXIgdG8gbm90IGhhdmUgdG8gZGVhbCB3aXRoIHR3byBkaWZmZXJlbnQKLQkgKiBwYWdlIHRhYmxlIGZvcm1hdHMKLQkgKi8KLQlpZiAoYWRkciA8IFNMSUNFX0xPV19UT1ApIHsKLQkJaWYgKGVuZCA+IFNMSUNFX0xPV19UT1ApCi0JCQlnb3RvIHNsb3dfaXJxb247Ci0KLQkJaWYgKHVubGlrZWx5KEdFVF9MT1dfU0xJQ0VfSU5ERVgoYWRkcikgIT0KLQkJCSAgICAgR0VUX0xPV19TTElDRV9JTkRFWChlbmQgLSAxKSkpCi0JCQlnb3RvIHNsb3dfaXJxb247Ci0JfSBlbHNlIHsKLQkJaWYgKHVubGlrZWx5KEdFVF9ISUdIX1NMSUNFX0lOREVYKGFkZHIpICE9Ci0JCQkgICAgIEdFVF9ISUdIX1NMSUNFX0lOREVYKGVuZCAtIDEpKSkKLQkJCWdvdG8gc2xvd19pcnFvbjsKLQl9Ci0jZW5kaWYgLyogQ09ORklHX0hVR0VUTEJfUEFHRSAqLwotCiAJLyoKIAkgKiBYWFg6IGJhdGNoIC8gbGltaXQgJ25yJywgdG8gYXZvaWQgbGFyZ2UgaXJxIG9mZiBsYXRlbmN5CiAJICogbmVlZHMgc29tZSBpbnN0cnVtZW50aW5nIHRvIGRldGVybWluZSB0aGUgY29tbW9uIHNpemVzIHVzZWQgYnkKQEAgLTIxMCw1NCArMTQ0LDIzIEBACiAJICovCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAotI2lmZGVmIENPTkZJR19QUEM2NAotCS8qIFRob3NlIGJpdHMgYXJlIHJlbGF0ZWQgdG8gaHVnZXRsYmZzIGltcGxlbWVudGF0aW9uIGFuZCBvbmx5IGV4aXN0Ci0JICogb24gNjQtYml0IGZvciBub3cKLQkgKi8KLQlwc2l6ZSA9IGdldF9zbGljZV9wc2l6ZShtbSwgYWRkcik7Ci0Jc2hpZnQgPSBtbXVfcHNpemVfZGVmc1twc2l6ZV0uc2hpZnQ7Ci0jZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCisJcGdkcCA9IHBnZF9vZmZzZXQobW0sIGFkZHIpOworCWRvIHsKKwkJcGdkX3QgcGdkID0gKnBnZHA7CiAKLSNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFCi0JaWYgKHVubGlrZWx5KG1tdV9odWdlX3BzaXplc1twc2l6ZV0pKSB7Ci0JCXB0ZV90ICpwdGVwOwotCQl1bnNpZ25lZCBsb25nIGEgPSBhZGRyOwotCQl1bnNpZ25lZCBsb25nIHN6ID0gKCgxVUwpIDw8IHNoaWZ0KTsKLQkJc3RydWN0IGhzdGF0ZSAqaHN0YXRlID0gc2l6ZV90b19oc3RhdGUoc3opOwotCi0JCUJVR19PTighaHN0YXRlKTsKLQkJLyoKLQkJICogWFhYOiBjb3VsZCBiZSBvcHRpbWl6ZWQgdG8gYXZvaWQgaHN0YXRlCi0JCSAqIGxvb2t1cCBlbnRpcmVseSAoanVzdCB1c2Ugc2hpZnQpCi0JCSAqLwotCi0JCWRvIHsKLQkJCVZNX0JVR19PTihzaGlmdCAhPSBtbXVfcHNpemVfZGVmc1tnZXRfc2xpY2VfcHNpemUobW0sIGEpXS5zaGlmdCk7Ci0JCQlwdGVwID0gaHVnZV9wdGVfb2Zmc2V0KG1tLCBhKTsKLQkJCXByX2RldmVsKCIgJTAxNmx4OiBodWdlIHB0ZXAgJXBcbiIsIGEsIHB0ZXApOwotCQkJaWYgKCFwdGVwIHx8ICFndXBfaHVnZV9wdGUocHRlcCwgaHN0YXRlLCAmYSwgZW5kLCB3cml0ZSwgcGFnZXMsCi0JCQkJCQkgICAmbnIpKQorCQlwcl9kZXZlbCgiICAlMDE2bHg6IG5vcm1hbCBwZ2QgJXBcbiIsIGFkZHIsCisJCQkgKHZvaWQgKilwZ2RfdmFsKHBnZCkpOworCQluZXh0ID0gcGdkX2FkZHJfZW5kKGFkZHIsIGVuZCk7CisJCWlmIChwZ2Rfbm9uZShwZ2QpKQorCQkJZ290byBzbG93OworCQlpZiAoaXNfaHVnZXBkKHBnZHApKSB7CisJCQlpZiAoIWd1cF9odWdlcGQoKGh1Z2VwZF90ICopcGdkcCwgUEdESVJfU0hJRlQsCisJCQkJCWFkZHIsIG5leHQsIHdyaXRlLCBwYWdlcywgJm5yKSkKIAkJCQlnb3RvIHNsb3c7Ci0JCX0gd2hpbGUgKGEgIT0gZW5kKTsKLQl9IGVsc2UKLSNlbmRpZiAvKiBDT05GSUdfSFVHRVRMQl9QQUdFICovCi0JewotCQlwZ2RwID0gcGdkX29mZnNldChtbSwgYWRkcik7Ci0JCWRvIHsKLQkJCXBnZF90IHBnZCA9ICpwZ2RwOworCQl9IGVsc2UgaWYgKCFndXBfcHVkX3JhbmdlKHBnZCwgYWRkciwgbmV4dCwgd3JpdGUsIHBhZ2VzLCAmbnIpKQorCQkJZ290byBzbG93OworCX0gd2hpbGUgKHBnZHArKywgYWRkciA9IG5leHQsIGFkZHIgIT0gZW5kKTsKIAotI2lmZGVmIENPTkZJR19QUEM2NAotCQkJVk1fQlVHX09OKHNoaWZ0ICE9IG1tdV9wc2l6ZV9kZWZzW2dldF9zbGljZV9wc2l6ZShtbSwgYWRkcildLnNoaWZ0KTsKLSNlbmRpZgotCQkJcHJfZGV2ZWwoIiAgJTAxNmx4OiBub3JtYWwgcGdkICVwXG4iLCBhZGRyLAotCQkJCSAodm9pZCAqKXBnZF92YWwocGdkKSk7Ci0JCQluZXh0ID0gcGdkX2FkZHJfZW5kKGFkZHIsIGVuZCk7Ci0JCQlpZiAocGdkX25vbmUocGdkKSkKLQkJCQlnb3RvIHNsb3c7Ci0JCQlpZiAoIWd1cF9wdWRfcmFuZ2UocGdkLCBhZGRyLCBuZXh0LCB3cml0ZSwgcGFnZXMsICZucikpCi0JCQkJZ290byBzbG93OwotCQl9IHdoaWxlIChwZ2RwKyssIGFkZHIgPSBuZXh0LCBhZGRyICE9IGVuZCk7Ci0JfQogCWxvY2FsX2lycV9lbmFibGUoKTsKIAogCVZNX0JVR19PTihuciAhPSAoZW5kIC0gc3RhcnQpID4+IFBBR0VfU0hJRlQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfdXRpbHNfNjQuYyBiL2FyY2gvcG93ZXJwYy9tbS9oYXNoX3V0aWxzXzY0LmMKaW5kZXggMWFkZTdlYi4uNTBmODY3ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfdXRpbHNfNjQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vaGFzaF91dGlsc182NC5jCkBAIC05Miw2ICs5Miw3IEBACiBzdHJ1Y3QgaGFzaF9wdGUgKmh0YWJfYWRkcmVzczsKIHVuc2lnbmVkIGxvbmcgaHRhYl9zaXplX2J5dGVzOwogdW5zaWduZWQgbG9uZyBodGFiX2hhc2hfbWFzazsKK0VYUE9SVF9TWU1CT0xfR1BMKGh0YWJfaGFzaF9tYXNrKTsKIGludCBtbXVfbGluZWFyX3BzaXplID0gTU1VX1BBR0VfNEs7CiBpbnQgbW11X3ZpcnR1YWxfcHNpemUgPSBNTVVfUEFHRV80SzsKIGludCBtbXVfdm1hbGxvY19wc2l6ZSA9IE1NVV9QQUdFXzRLOwpAQCAtMTAyLDYgKzEwMyw3IEBACiBpbnQgbW11X2tlcm5lbF9zc2l6ZSA9IE1NVV9TRUdTSVpFXzI1Nk07CiBpbnQgbW11X2hpZ2h1c2VyX3NzaXplID0gTU1VX1NFR1NJWkVfMjU2TTsKIHUxNiBtbXVfc2xiX3NpemUgPSA2NDsKK0VYUE9SVF9TWU1CT0xfR1BMKG1tdV9zbGJfc2l6ZSk7CiAjaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQogdW5zaWduZWQgaW50IEhQQUdFX1NISUZUOwogI2VuZGlmCkBAIC00ODEsMTYgKzQ4Myw2IEBACiAjaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQogCS8qIFJlc2VydmUgMTZHIGh1Z2UgcGFnZSBtZW1vcnkgc2VjdGlvbnMgZm9yIGh1Z2UgcGFnZXMgKi8KIAlvZl9zY2FuX2ZsYXRfZHQoaHRhYl9kdF9zY2FuX2h1Z2VwYWdlX2Jsb2NrcywgTlVMTCk7Ci0KLS8qIFNldCBkZWZhdWx0IGxhcmdlIHBhZ2Ugc2l6ZS4gQ3VycmVudGx5LCB3ZSBwaWNrIDE2TSBvciAxTSBkZXBlbmRpbmcKLQkgKiBvbiB3aGF0IGlzIGF2YWlsYWJsZQotCSAqLwotCWlmIChtbXVfcHNpemVfZGVmc1tNTVVfUEFHRV8xNk1dLnNoaWZ0KQotCQlIUEFHRV9TSElGVCA9IG1tdV9wc2l6ZV9kZWZzW01NVV9QQUdFXzE2TV0uc2hpZnQ7Ci0JLyogV2l0aCA0ay80bGV2ZWwgcGFnZXRhYmxlcywgd2UgY2FuJ3QgKGZvciBub3cpIGNvcGUgd2l0aCBhCi0JICogaHVnZSBwYWdlIHNpemUgPCBQTURfU0laRSAqLwotCWVsc2UgaWYgKG1tdV9wc2l6ZV9kZWZzW01NVV9QQUdFXzFNXS5zaGlmdCkKLQkJSFBBR0VfU0hJRlQgPSBtbXVfcHNpemVfZGVmc1tNTVVfUEFHRV8xTV0uc2hpZnQ7CiAjZW5kaWYgLyogQ09ORklHX0hVR0VUTEJfUEFHRSAqLwogfQogCkBAIC03ODUsNyArNzc3LDcgQEAKIAkvKiBwYWdlIGlzIGRpcnR5ICovCiAJaWYgKCF0ZXN0X2JpdChQR19hcmNoXzEsICZwYWdlLT5mbGFncykgJiYgIVBhZ2VSZXNlcnZlZChwYWdlKSkgewogCQlpZiAodHJhcCA9PSAweDQwMCkgewotCQkJX19mbHVzaF9kY2FjaGVfaWNhY2hlKHBhZ2VfYWRkcmVzcyhwYWdlKSk7CisJCQlmbHVzaF9kY2FjaGVfaWNhY2hlX3BhZ2UocGFnZSk7CiAJCQlzZXRfYml0KFBHX2FyY2hfMSwgJnBhZ2UtPmZsYWdzKTsKIAkJfSBlbHNlCiAJCQlwcCB8PSBIUFRFX1JfTjsKQEAgLTg0Myw5ICs4MzUsOSBAQAogICogUmVzdWx0IGlzIDA6IGZ1bGwgcGVybWlzc2lvbnMsIF9QQUdFX1JXOiByZWFkLW9ubHksCiAgKiBfUEFHRV9VU0VSIG9yIF9QQUdFX1VTRVJ8X1BBR0VfUlc6IG5vIGFjY2Vzcy4KICAqLwotc3RhdGljIGludCBzdWJwYWdlX3Byb3RlY3Rpb24ocGdkX3QgKnBnZGlyLCB1bnNpZ25lZCBsb25nIGVhKQorc3RhdGljIGludCBzdWJwYWdlX3Byb3RlY3Rpb24oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgZWEpCiB7Ci0Jc3RydWN0IHN1YnBhZ2VfcHJvdF90YWJsZSAqc3B0ID0gcGdkX3N1YnBhZ2VfcHJvdChwZ2Rpcik7CisJc3RydWN0IHN1YnBhZ2VfcHJvdF90YWJsZSAqc3B0ID0gJm1tLT5jb250ZXh0LnNwdDsKIAl1MzIgc3BwID0gMDsKIAl1MzIgKipzYnBtLCAqc2JwcDsKIApAQCAtODczLDcgKzg2NSw3IEBACiB9CiAKICNlbHNlIC8qIENPTkZJR19QUENfU1VCUEFHRV9QUk9UICovCi1zdGF0aWMgaW5saW5lIGludCBzdWJwYWdlX3Byb3RlY3Rpb24ocGdkX3QgKnBnZGlyLCB1bnNpZ25lZCBsb25nIGVhKQorc3RhdGljIGlubGluZSBpbnQgc3VicGFnZV9wcm90ZWN0aW9uKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGVhKQogewogCXJldHVybiAwOwogfQpAQCAtODkxLDYgKzg4Myw3IEBACiAJdW5zaWduZWQgbG9uZyB2c2lkOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwogCXB0ZV90ICpwdGVwOworCXVuc2lnbmVkIGh1Z2VzaGlmdDsKIAljb25zdCBzdHJ1Y3QgY3B1bWFzayAqdG1wOwogCWludCByYywgdXNlcl9yZWdpb24gPSAwLCBsb2NhbCA9IDA7CiAJaW50IHBzaXplLCBzc2l6ZTsKQEAgLTk0MywzMCArOTM2LDMxIEBACiAJaWYgKHVzZXJfcmVnaW9uICYmIGNwdW1hc2tfZXF1YWwobW1fY3B1bWFzayhtbSksIHRtcCkpCiAJCWxvY2FsID0gMTsKIAotI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKLQkvKiBIYW5kbGUgaHVnZXBhZ2UgcmVnaW9ucyAqLwotCWlmIChIUEFHRV9TSElGVCAmJiBtbXVfaHVnZV9wc2l6ZXNbcHNpemVdKSB7Ci0JCURCR19MT1coIiAtPiBodWdlIHBhZ2UgIVxuIik7Ci0JCXJldHVybiBoYXNoX2h1Z2VfcGFnZShtbSwgYWNjZXNzLCBlYSwgdnNpZCwgbG9jYWwsIHRyYXApOwotCX0KLSNlbmRpZiAvKiBDT05GSUdfSFVHRVRMQl9QQUdFICovCi0KICNpZm5kZWYgQ09ORklHX1BQQ182NEtfUEFHRVMKLQkvKiBJZiB3ZSB1c2UgNEsgcGFnZXMgYW5kIG91ciBwc2l6ZSBpcyBub3QgNEssIHRoZW4gd2UgYXJlIGhpdHRpbmcKLQkgKiBhIHNwZWNpYWwgZHJpdmVyIG1hcHBpbmcsIHdlIG5lZWQgdG8gYWxpZ24gdGhlIGFkZHJlc3MgYmVmb3JlCi0JICogd2UgZmV0Y2ggdGhlIFBURQorCS8qIElmIHdlIHVzZSA0SyBwYWdlcyBhbmQgb3VyIHBzaXplIGlzIG5vdCA0SywgdGhlbiB3ZSBtaWdodAorCSAqIGJlIGhpdHRpbmcgYSBzcGVjaWFsIGRyaXZlciBtYXBwaW5nLCBhbmQgbmVlZCB0byBhbGlnbiB0aGUKKwkgKiBhZGRyZXNzIGJlZm9yZSB3ZSBmZXRjaCB0aGUgUFRFLgorCSAqCisJICogSXQgY291bGQgYWxzbyBiZSBhIGh1Z2VwYWdlIG1hcHBpbmcsIGluIHdoaWNoIGNhc2UgdGhpcyBpcworCSAqIG5vdCBuZWNlc3NhcnksIGJ1dCBpdCdzIG5vdCBoYXJtZnVsLCBlaXRoZXIuCiAJICovCiAJaWYgKHBzaXplICE9IE1NVV9QQUdFXzRLKQogCQllYSAmPSB+KCgxdWwgPDwgbW11X3BzaXplX2RlZnNbcHNpemVdLnNoaWZ0KSAtIDEpOwogI2VuZGlmIC8qIENPTkZJR19QUENfNjRLX1BBR0VTICovCiAKIAkvKiBHZXQgUFRFIGFuZCBwYWdlIHNpemUgZnJvbSBwYWdlIHRhYmxlcyAqLwotCXB0ZXAgPSBmaW5kX2xpbnV4X3B0ZShwZ2RpciwgZWEpOworCXB0ZXAgPSBmaW5kX2xpbnV4X3B0ZV9vcl9odWdlcHRlKHBnZGlyLCBlYSwgJmh1Z2VzaGlmdCk7CiAJaWYgKHB0ZXAgPT0gTlVMTCB8fCAhcHRlX3ByZXNlbnQoKnB0ZXApKSB7CiAJCURCR19MT1coIiBubyBQVEUgIVxuIik7CiAJCXJldHVybiAxOwogCX0KIAorI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKKwlpZiAoaHVnZXNoaWZ0KQorCQlyZXR1cm4gX19oYXNoX3BhZ2VfaHVnZShlYSwgYWNjZXNzLCB2c2lkLCBwdGVwLCB0cmFwLCBsb2NhbCwKKwkJCQkJc3NpemUsIGh1Z2VzaGlmdCwgcHNpemUpOworI2VuZGlmIC8qIENPTkZJR19IVUdFVExCX1BBR0UgKi8KKwogI2lmbmRlZiBDT05GSUdfUFBDXzY0S19QQUdFUwogCURCR19MT1coIiBpLXB0ZTogJTAxNmx4XG4iLCBwdGVfdmFsKCpwdGVwKSk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2h1Z2V0bGJwYWdlLWhhc2g2NC5jIGIvYXJjaC9wb3dlcnBjL21tL2h1Z2V0bGJwYWdlLWhhc2g2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5OTUzOTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UtaGFzaDY0LmMKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBQUEM2NCBIdWdlIFRMQiBQYWdlIFN1cHBvcnQgZm9yIGhhc2ggYmFzZWQgTU1VcyAoUE9XRVI0IGFuZCBsYXRlcikKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgRGF2aWQgR2lic29uLCBJQk0gQ29ycG9yYXRpb24uCisgKgorICogQmFzZWQgb24gdGhlIElBLTMyIHZlcnNpb246CisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIFJvaGl0IFNldGggPHJvaGl0LnNldGhAaW50ZWwuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorCitpbnQgX19oYXNoX3BhZ2VfaHVnZSh1bnNpZ25lZCBsb25nIGVhLCB1bnNpZ25lZCBsb25nIGFjY2VzcywgdW5zaWduZWQgbG9uZyB2c2lkLAorCQkgICAgIHB0ZV90ICpwdGVwLCB1bnNpZ25lZCBsb25nIHRyYXAsIGludCBsb2NhbCwgaW50IHNzaXplLAorCQkgICAgIHVuc2lnbmVkIGludCBzaGlmdCwgdW5zaWduZWQgaW50IG1tdV9wc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIG9sZF9wdGUsIG5ld19wdGU7CisJdW5zaWduZWQgbG9uZyB2YSwgcmZsYWdzLCBwYSwgc3o7CisJbG9uZyBzbG90OworCWludCBlcnIgPSAxOworCisJQlVHX09OKHNoaWZ0ICE9IG1tdV9wc2l6ZV9kZWZzW21tdV9wc2l6ZV0uc2hpZnQpOworCisJLyogU2VhcmNoIHRoZSBMaW51eCBwYWdlIHRhYmxlIGZvciBhIG1hdGNoIHdpdGggdmEgKi8KKwl2YSA9IGhwdF92YShlYSwgdnNpZCwgc3NpemUpOworCisJLyoKKwkgKiBDaGVjayB0aGUgdXNlcidzIGFjY2VzcyByaWdodHMgdG8gdGhlIHBhZ2UuICBJZiBhY2Nlc3Mgc2hvdWxkIGJlCisJICogcHJldmVudGVkIHRoZW4gc2VuZCB0aGUgcHJvYmxlbSB1cCB0byBkb19wYWdlX2ZhdWx0LgorCSAqLworCWlmICh1bmxpa2VseShhY2Nlc3MgJiB+cHRlX3ZhbCgqcHRlcCkpKQorCQlnb3RvIG91dDsKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgYSBwdGUgKG9sZF9wdGUpIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGJ1aWxkCisJICogb3IgdXBkYXRlIGFuIEhQVEUuIFRoZXJlIGFyZSAyIGNhc2VzOgorCSAqCisJICogMS4gVGhlcmUgaXMgYSB2YWxpZCAocHJlc2VudCkgcHRlIHdpdGggbm8gYXNzb2NpYXRlZCBIUFRFICh0aGlzIGlzCisJICoJdGhlIG1vc3QgY29tbW9uIGNhc2UpCisJICogMi4gVGhlcmUgaXMgYSB2YWxpZCAocHJlc2VudCkgcHRlIHdpdGggYW4gYXNzb2NpYXRlZCBIUFRFLiBUaGUKKwkgKgljdXJyZW50IHZhbHVlcyBvZiB0aGUgcHAgYml0cyBpbiB0aGUgSFBURSBwcmV2ZW50IGFjY2VzcworCSAqCWJlY2F1c2Ugd2UgYXJlIGRvaW5nIHNvZnR3YXJlIERJUlRZIGJpdCBtYW5hZ2VtZW50IGFuZCB0aGUKKwkgKglwYWdlIGlzIGN1cnJlbnRseSBub3QgRElSVFkuCisJICovCisKKworCWRvIHsKKwkJb2xkX3B0ZSA9IHB0ZV92YWwoKnB0ZXApOworCQlpZiAob2xkX3B0ZSAmIF9QQUdFX0JVU1kpCisJCQlnb3RvIG91dDsKKwkJbmV3X3B0ZSA9IG9sZF9wdGUgfCBfUEFHRV9CVVNZIHwgX1BBR0VfQUNDRVNTRUQ7CisJfSB3aGlsZShvbGRfcHRlICE9IF9fY21weGNoZ191NjQoKHVuc2lnbmVkIGxvbmcgKilwdGVwLAorCQkJCQkgb2xkX3B0ZSwgbmV3X3B0ZSkpOworCisJcmZsYWdzID0gMHgyIHwgKCEobmV3X3B0ZSAmIF9QQUdFX1JXKSk7CisJLyogX1BBR0VfRVhFQyAtPiBIV19OT19FWEVDIHNpbmNlIGl0J3MgaW52ZXJ0ZWQgKi8KKwlyZmxhZ3MgfD0gKChuZXdfcHRlICYgX1BBR0VfRVhFQykgPyAwIDogSFBURV9SX04pOworCXN6ID0gKCgxVUwpIDw8IHNoaWZ0KTsKKwlpZiAoIWNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRSkpCisJCS8qIE5vIENQVSBoYXMgaHVnZXBhZ2VzIGJ1dCBsYWNrcyBubyBleGVjdXRlLCBzbyB3ZQorCQkgKiBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoYXQgY2FzZSAqLworCQlyZmxhZ3MgPSBoYXNoX3BhZ2VfZG9fbGF6eV9pY2FjaGUocmZsYWdzLCBfX3B0ZShvbGRfcHRlKSwgdHJhcCk7CisKKwkvKiBDaGVjayBpZiBwdGUgYWxyZWFkeSBoYXMgYW4gaHB0ZSAoY2FzZSAyKSAqLworCWlmICh1bmxpa2VseShvbGRfcHRlICYgX1BBR0VfSEFTSFBURSkpIHsKKwkJLyogVGhlcmUgTUlHSFQgYmUgYW4gSFBURSBmb3IgdGhpcyBwdGUgKi8KKwkJdW5zaWduZWQgbG9uZyBoYXNoLCBzbG90OworCisJCWhhc2ggPSBocHRfaGFzaCh2YSwgc2hpZnQsIHNzaXplKTsKKwkJaWYgKG9sZF9wdGUgJiBfUEFHRV9GX1NFQ09ORCkKKwkJCWhhc2ggPSB+aGFzaDsKKwkJc2xvdCA9IChoYXNoICYgaHRhYl9oYXNoX21hc2spICogSFBURVNfUEVSX0dST1VQOworCQlzbG90ICs9IChvbGRfcHRlICYgX1BBR0VfRl9HSVgpID4+IDEyOworCisJCWlmIChwcGNfbWQuaHB0ZV91cGRhdGVwcChzbG90LCByZmxhZ3MsIHZhLCBtbXVfcHNpemUsCisJCQkJCSBzc2l6ZSwgbG9jYWwpID09IC0xKQorCQkJb2xkX3B0ZSAmPSB+X1BBR0VfSFBURUZMQUdTOworCX0KKworCWlmIChsaWtlbHkoIShvbGRfcHRlICYgX1BBR0VfSEFTSFBURSkpKSB7CisJCXVuc2lnbmVkIGxvbmcgaGFzaCA9IGhwdF9oYXNoKHZhLCBzaGlmdCwgc3NpemUpOworCQl1bnNpZ25lZCBsb25nIGhwdGVfZ3JvdXA7CisKKwkJcGEgPSBwdGVfcGZuKF9fcHRlKG9sZF9wdGUpKSA8PCBQQUdFX1NISUZUOworCityZXBlYXQ6CisJCWhwdGVfZ3JvdXAgPSAoKGhhc2ggJiBodGFiX2hhc2hfbWFzaykgKgorCQkJICAgICAgSFBURVNfUEVSX0dST1VQKSAmIH4weDdVTDsKKworCQkvKiBjbGVhciBIUFRFIHNsb3QgaW5mb3JtYXRpb25zIGluIG5ldyBQVEUgKi8KKyNpZmRlZiBDT05GSUdfUFBDXzY0S19QQUdFUworCQluZXdfcHRlID0gKG5ld19wdGUgJiB+X1BBR0VfSFBURUZMQUdTKSB8IF9QQUdFX0hQVEVfU1VCMDsKKyNlbHNlCisJCW5ld19wdGUgPSAobmV3X3B0ZSAmIH5fUEFHRV9IUFRFRkxBR1MpIHwgX1BBR0VfSEFTSFBURTsKKyNlbmRpZgorCQkvKiBBZGQgaW4gV0lNRyBiaXRzICovCisJCXJmbGFncyB8PSAobmV3X3B0ZSAmIChfUEFHRV9XUklURVRIUlUgfCBfUEFHRV9OT19DQUNIRSB8CisJCQkJICAgICAgX1BBR0VfQ09IRVJFTlQgfCBfUEFHRV9HVUFSREVEKSk7CisKKwkJLyogSW5zZXJ0IGludG8gdGhlIGhhc2ggdGFibGUsIHByaW1hcnkgc2xvdCAqLworCQlzbG90ID0gcHBjX21kLmhwdGVfaW5zZXJ0KGhwdGVfZ3JvdXAsIHZhLCBwYSwgcmZsYWdzLCAwLAorCQkJCQkgIG1tdV9wc2l6ZSwgc3NpemUpOworCisJCS8qIFByaW1hcnkgaXMgZnVsbCwgdHJ5IHRoZSBzZWNvbmRhcnkgKi8KKwkJaWYgKHVubGlrZWx5KHNsb3QgPT0gLTEpKSB7CisJCQlocHRlX2dyb3VwID0gKCh+aGFzaCAmIGh0YWJfaGFzaF9tYXNrKSAqCisJCQkJICAgICAgSFBURVNfUEVSX0dST1VQKSAmIH4weDdVTDsKKwkJCXNsb3QgPSBwcGNfbWQuaHB0ZV9pbnNlcnQoaHB0ZV9ncm91cCwgdmEsIHBhLCByZmxhZ3MsCisJCQkJCQkgIEhQVEVfVl9TRUNPTkRBUlksCisJCQkJCQkgIG1tdV9wc2l6ZSwgc3NpemUpOworCQkJaWYgKHNsb3QgPT0gLTEpIHsKKwkJCQlpZiAobWZ0YigpICYgMHgxKQorCQkJCQlocHRlX2dyb3VwID0gKChoYXNoICYgaHRhYl9oYXNoX21hc2spICoKKwkJCQkJCSAgICAgIEhQVEVTX1BFUl9HUk9VUCkmfjB4N1VMOworCisJCQkJcHBjX21kLmhwdGVfcmVtb3ZlKGhwdGVfZ3JvdXApOworCQkJCWdvdG8gcmVwZWF0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorCQl9CisKKwkJaWYgKHVubGlrZWx5KHNsb3QgPT0gLTIpKQorCQkJcGFuaWMoImhhc2hfaHVnZV9wYWdlOiBwdGVfaW5zZXJ0IGZhaWxlZFxuIik7CisKKwkJbmV3X3B0ZSB8PSAoc2xvdCA8PCAxMikgJiAoX1BBR0VfRl9TRUNPTkQgfCBfUEFHRV9GX0dJWCk7CisJfQorCisJLyoKKwkgKiBObyBuZWVkIHRvIHVzZSBsZGFyeC9zdGRjeCBoZXJlCisJICovCisJKnB0ZXAgPSBfX3B0ZShuZXdfcHRlICYgfl9QQUdFX0JVU1kpOworCisJZXJyID0gMDsKKworIG91dDoKKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2h1Z2V0bGJwYWdlLmMgYi9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYwppbmRleCA5MGRmNmZmLi4xMjNmNzA3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYwpAQCAtNywyOSArNywxNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDAyLCBSb2hpdCBTZXRoIDxyb2hpdC5zZXRoQGludGVsLmNvbT4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KLSNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgotI2luY2x1ZGUgPGFzbS9tbWFuLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogI2luY2x1ZGUgPGFzbS90bGIuaD4KLSNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KLSNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KLSNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9zcHUuaD4KIAogI2RlZmluZSBQQUdFX1NISUZUXzY0SwkxNgogI2RlZmluZSBQQUdFX1NISUZUXzE2TQkyNAogI2RlZmluZSBQQUdFX1NISUZUXzE2RwkzNAogCi0jZGVmaW5lIE5VTV9MT1dfQVJFQVMJKDB4MTAwMDAwMDAwVUwgPj4gU0lEX1NISUZUKQotI2RlZmluZSBOVU1fSElHSF9BUkVBUwkoUEdUQUJMRV9SQU5HRSA+PiBIVExCX0FSRUFfU0hJRlQpCiAjZGVmaW5lIE1BWF9OVU1CRVJfR1BBR0VTCTEwMjQKIAogLyogVHJhY2tzIHRoZSAxNkcgcGFnZXMgYWZ0ZXIgdGhlIGRldmljZSB0cmVlIGlzIHNjYW5uZWQgYW5kIGJlZm9yZSB0aGUKQEAgLTM3LDUzICsyNSwxNyBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgZ3BhZ2VfZnJlZWFycmF5W01BWF9OVU1CRVJfR1BBR0VTXTsKIHN0YXRpYyB1bnNpZ25lZCBucl9ncGFnZXM7CiAKLS8qIEFycmF5IG9mIHZhbGlkIGh1Z2UgcGFnZSBzaXplcyAtIG5vbi16ZXJvIHZhbHVlKGh1Z2VwdGVfc2hpZnQpIGlzCi0gKiBzdG9yZWQgZm9yIHRoZSBodWdlIHBhZ2Ugc2l6ZXMgdGhhdCBhcmUgdmFsaWQuCi0gKi8KLXVuc2lnbmVkIGludCBtbXVfaHVnZV9wc2l6ZXNbTU1VX1BBR0VfQ09VTlRdID0geyB9OyAvKiBpbml0aWFsaXplIGFsbCB0byAwICovCi0KLSNkZWZpbmUgaHVnZXB0ZV9zaGlmdAkJCW1tdV9odWdlX3BzaXplcwotI2RlZmluZSBQVFJTX1BFUl9IVUdFUFRFKHBzaXplKQkJKDEgPDwgaHVnZXB0ZV9zaGlmdFtwc2l6ZV0pCi0jZGVmaW5lIEhVR0VQVEVfVEFCTEVfU0laRShwc2l6ZSkJKHNpemVvZihwdGVfdCkgPDwgaHVnZXB0ZV9zaGlmdFtwc2l6ZV0pCi0KLSNkZWZpbmUgSFVHRVBEX1NISUZUKHBzaXplKQkJKG1tdV9wc2l6ZV90b19zaGlmdChwc2l6ZSkgXAotCQkJCQkJKyBodWdlcHRlX3NoaWZ0W3BzaXplXSkKLSNkZWZpbmUgSFVHRVBEX1NJWkUocHNpemUpCQkoMVVMIDw8IEhVR0VQRF9TSElGVChwc2l6ZSkpCi0jZGVmaW5lIEhVR0VQRF9NQVNLKHBzaXplKQkJKH4oSFVHRVBEX1NJWkUocHNpemUpLTEpKQotCi0vKiBTdWJ0cmFjdCBvbmUgZnJvbSBhcnJheSBzaXplIGJlY2F1c2Ugd2UgZG9uJ3QgbmVlZCBhIGNhY2hlIGZvciA0SyBzaW5jZQotICogaXMgbm90IGEgaHVnZSBwYWdlIHNpemUgKi8KLSNkZWZpbmUgSFVHRV9QR1RBQkxFX0lOREVYKHBzaXplKQkoSFVHRVBURV9DQUNIRV9OVU0gKyBwc2l6ZSAtIDEpCi0jZGVmaW5lIEhVR0VQVEVfQ0FDSEVfTkFNRShwc2l6ZSkJKGh1Z2VfcGd0YWJsZV9jYWNoZV9uYW1lW3BzaXplXSkKLQotc3RhdGljIGNvbnN0IGNoYXIgKmh1Z2VfcGd0YWJsZV9jYWNoZV9uYW1lW01NVV9QQUdFX0NPVU5UXSA9IHsKLQlbTU1VX1BBR0VfNjRLXQk9ICJodWdlcHRlX2NhY2hlXzY0SyIsCi0JW01NVV9QQUdFXzFNXQk9ICJodWdlcHRlX2NhY2hlXzFNIiwKLQlbTU1VX1BBR0VfMTZNXQk9ICJodWdlcHRlX2NhY2hlXzE2TSIsCi0JW01NVV9QQUdFXzE2R10JPSAiaHVnZXB0ZV9jYWNoZV8xNkciLAotfTsKLQogLyogRmxhZyB0byBtYXJrIGh1Z2UgUEQgcG9pbnRlcnMuICBUaGlzIG1lYW5zIHBtZF9iYWQoKSBhbmQgcHVkX2JhZCgpCiAgKiB3aWxsIGNob2tlIG9uIHBvaW50ZXJzIHRvIGh1Z2VwdGUgdGFibGVzLCB3aGljaCBpcyBoYW5keSBmb3IKICAqIGNhdGNoaW5nIHNjcmV3dXBzIGVhcmx5LiAqLwotI2RlZmluZSBIVUdFUERfT0sJMHgxCi0KLXR5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgbG9uZyBwZDsgfSBodWdlcGRfdDsKLQotI2RlZmluZSBodWdlcGRfbm9uZShocGQpCSgoaHBkKS5wZCA9PSAwKQogCiBzdGF0aWMgaW5saW5lIGludCBzaGlmdF90b19tbXVfcHNpemUodW5zaWduZWQgaW50IHNoaWZ0KQogewotCXN3aXRjaCAoc2hpZnQpIHsKLSNpZm5kZWYgQ09ORklHX1BQQ182NEtfUEFHRVMKLQljYXNlIFBBR0VfU0hJRlRfNjRLOgotCSAgICByZXR1cm4gTU1VX1BBR0VfNjRLOwotI2VuZGlmCi0JY2FzZSBQQUdFX1NISUZUXzE2TToKLQkgICAgcmV0dXJuIE1NVV9QQUdFXzE2TTsKLQljYXNlIFBBR0VfU0hJRlRfMTZHOgotCSAgICByZXR1cm4gTU1VX1BBR0VfMTZHOwotCX0KKwlpbnQgcHNpemU7CisKKwlmb3IgKHBzaXplID0gMDsgcHNpemUgPCBNTVVfUEFHRV9DT1VOVDsgKytwc2l6ZSkKKwkJaWYgKG1tdV9wc2l6ZV9kZWZzW3BzaXplXS5zaGlmdCA9PSBzaGlmdCkKKwkJCXJldHVybiBwc2l6ZTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTk0LDcxICs0NiwxMjYgQEAKIAlCVUcoKTsKIH0KIAorI2RlZmluZSBodWdlcGRfbm9uZShocGQpCSgoaHBkKS5wZCA9PSAwKQorCiBzdGF0aWMgaW5saW5lIHB0ZV90ICpodWdlcGRfcGFnZShodWdlcGRfdCBocGQpCiB7Ci0JQlVHX09OKCEoaHBkLnBkICYgSFVHRVBEX09LKSk7Ci0JcmV0dXJuIChwdGVfdCAqKShocGQucGQgJiB+SFVHRVBEX09LKTsKKwlCVUdfT04oIWh1Z2VwZF9vayhocGQpKTsKKwlyZXR1cm4gKHB0ZV90ICopKChocGQucGQgJiB+SFVHRVBEX1NISUZUX01BU0spIHwgMHhjMDAwMDAwMDAwMDAwMDAwKTsKIH0KIAotc3RhdGljIGlubGluZSBwdGVfdCAqaHVnZXB0ZV9vZmZzZXQoaHVnZXBkX3QgKmhwZHAsIHVuc2lnbmVkIGxvbmcgYWRkciwKLQkJCQkgICAgc3RydWN0IGhzdGF0ZSAqaHN0YXRlKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaHVnZXBkX3NoaWZ0KGh1Z2VwZF90IGhwZCkKIHsKLQl1bnNpZ25lZCBpbnQgc2hpZnQgPSBodWdlX3BhZ2Vfc2hpZnQoaHN0YXRlKTsKLQlpbnQgcHNpemUgPSBzaGlmdF90b19tbXVfcHNpemUoc2hpZnQpOwotCXVuc2lnbmVkIGxvbmcgaWR4ID0gKChhZGRyID4+IHNoaWZ0KSAmIChQVFJTX1BFUl9IVUdFUFRFKHBzaXplKS0xKSk7CisJcmV0dXJuIGhwZC5wZCAmIEhVR0VQRF9TSElGVF9NQVNLOworfQorCitzdGF0aWMgaW5saW5lIHB0ZV90ICpodWdlcHRlX29mZnNldChodWdlcGRfdCAqaHBkcCwgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBwZHNoaWZ0KQoreworCXVuc2lnbmVkIGxvbmcgaWR4ID0gKGFkZHIgJiAoKDFVTCA8PCBwZHNoaWZ0KSAtIDEpKSA+PiBodWdlcGRfc2hpZnQoKmhwZHApOwogCXB0ZV90ICpkaXIgPSBodWdlcGRfcGFnZSgqaHBkcCk7CiAKIAlyZXR1cm4gZGlyICsgaWR4OwogfQogCi1zdGF0aWMgaW50IF9faHVnZXB0ZV9hbGxvYyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgaHVnZXBkX3QgKmhwZHAsCi0JCQkgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGludCBwc2l6ZSkKK3B0ZV90ICpmaW5kX2xpbnV4X3B0ZV9vcl9odWdlcHRlKHBnZF90ICpwZ2RpciwgdW5zaWduZWQgbG9uZyBlYSwgdW5zaWduZWQgKnNoaWZ0KQogewotCXB0ZV90ICpuZXcgPSBrbWVtX2NhY2hlX3phbGxvYyhwZ3RhYmxlX2NhY2hlW0hVR0VfUEdUQUJMRV9JTkRFWChwc2l6ZSldLAotCQkJCSAgICAgIEdGUF9LRVJORUx8X19HRlBfUkVQRUFUKTsKKwlwZ2RfdCAqcGc7CisJcHVkX3QgKnB1OworCXBtZF90ICpwbTsKKwlodWdlcGRfdCAqaHBkcCA9IE5VTEw7CisJdW5zaWduZWQgcGRzaGlmdCA9IFBHRElSX1NISUZUOworCisJaWYgKHNoaWZ0KQorCQkqc2hpZnQgPSAwOworCisJcGcgPSBwZ2RpciArIHBnZF9pbmRleChlYSk7CisJaWYgKGlzX2h1Z2VwZChwZykpIHsKKwkJaHBkcCA9IChodWdlcGRfdCAqKXBnOworCX0gZWxzZSBpZiAoIXBnZF9ub25lKCpwZykpIHsKKwkJcGRzaGlmdCA9IFBVRF9TSElGVDsKKwkJcHUgPSBwdWRfb2Zmc2V0KHBnLCBlYSk7CisJCWlmIChpc19odWdlcGQocHUpKQorCQkJaHBkcCA9IChodWdlcGRfdCAqKXB1OworCQllbHNlIGlmICghcHVkX25vbmUoKnB1KSkgeworCQkJcGRzaGlmdCA9IFBNRF9TSElGVDsKKwkJCXBtID0gcG1kX29mZnNldChwdSwgZWEpOworCQkJaWYgKGlzX2h1Z2VwZChwbSkpCisJCQkJaHBkcCA9IChodWdlcGRfdCAqKXBtOworCQkJZWxzZSBpZiAoIXBtZF9ub25lKCpwbSkpIHsKKwkJCQlyZXR1cm4gcHRlX29mZnNldF9tYXAocG0sIGVhKTsKKwkJCX0KKwkJfQorCX0KKworCWlmICghaHBkcCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoc2hpZnQpCisJCSpzaGlmdCA9IGh1Z2VwZF9zaGlmdCgqaHBkcCk7CisJcmV0dXJuIGh1Z2VwdGVfb2Zmc2V0KGhwZHAsIGVhLCBwZHNoaWZ0KTsKK30KKworcHRlX3QgKmh1Z2VfcHRlX29mZnNldChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCXJldHVybiBmaW5kX2xpbnV4X3B0ZV9vcl9odWdlcHRlKG1tLT5wZ2QsIGFkZHIsIE5VTEwpOworfQorCitzdGF0aWMgaW50IF9faHVnZXB0ZV9hbGxvYyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgaHVnZXBkX3QgKmhwZHAsCisJCQkgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIHBkc2hpZnQsIHVuc2lnbmVkIHBzaGlmdCkKK3sKKwlwdGVfdCAqbmV3ID0ga21lbV9jYWNoZV96YWxsb2MoUEdUX0NBQ0hFKHBkc2hpZnQgLSBwc2hpZnQpLAorCQkJCSAgICAgICBHRlBfS0VSTkVMfF9fR0ZQX1JFUEVBVCk7CisKKwlCVUdfT04ocHNoaWZ0ID4gSFVHRVBEX1NISUZUX01BU0spOworCUJVR19PTigodW5zaWduZWQgbG9uZyluZXcgJiBIVUdFUERfU0hJRlRfTUFTSyk7CiAKIAlpZiAoISBuZXcpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKIAlpZiAoIWh1Z2VwZF9ub25lKCpocGRwKSkKLQkJa21lbV9jYWNoZV9mcmVlKHBndGFibGVfY2FjaGVbSFVHRV9QR1RBQkxFX0lOREVYKHBzaXplKV0sIG5ldyk7CisJCWttZW1fY2FjaGVfZnJlZShQR1RfQ0FDSEUocGRzaGlmdCAtIHBzaGlmdCksIG5ldyk7CiAJZWxzZQotCQlocGRwLT5wZCA9ICh1bnNpZ25lZCBsb25nKW5ldyB8IEhVR0VQRF9PSzsKKwkJaHBkcC0+cGQgPSAoKHVuc2lnbmVkIGxvbmcpbmV3ICYgfjB4ODAwMDAwMDAwMDAwMDAwMCkgfCBwc2hpZnQ7CiAJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOwogCXJldHVybiAwOwogfQogCitwdGVfdCAqaHVnZV9wdGVfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzeikKK3sKKwlwZ2RfdCAqcGc7CisJcHVkX3QgKnB1OworCXBtZF90ICpwbTsKKwlodWdlcGRfdCAqaHBkcCA9IE5VTEw7CisJdW5zaWduZWQgcHNoaWZ0ID0gX19mZnMoc3opOworCXVuc2lnbmVkIHBkc2hpZnQgPSBQR0RJUl9TSElGVDsKIAotc3RhdGljIHB1ZF90ICpocHVkX29mZnNldChwZ2RfdCAqcGdkLCB1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCBoc3RhdGUgKmhzdGF0ZSkKLXsKLQlpZiAoaHVnZV9wYWdlX3NoaWZ0KGhzdGF0ZSkgPCBQVURfU0hJRlQpCi0JCXJldHVybiBwdWRfb2Zmc2V0KHBnZCwgYWRkcik7Ci0JZWxzZQotCQlyZXR1cm4gKHB1ZF90ICopIHBnZDsKLX0KLXN0YXRpYyBwdWRfdCAqaHB1ZF9hbGxvYyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcGdkX3QgKnBnZCwgdW5zaWduZWQgbG9uZyBhZGRyLAotCQkJIHN0cnVjdCBoc3RhdGUgKmhzdGF0ZSkKLXsKLQlpZiAoaHVnZV9wYWdlX3NoaWZ0KGhzdGF0ZSkgPCBQVURfU0hJRlQpCi0JCXJldHVybiBwdWRfYWxsb2MobW0sIHBnZCwgYWRkcik7Ci0JZWxzZQotCQlyZXR1cm4gKHB1ZF90ICopIHBnZDsKLX0KLXN0YXRpYyBwbWRfdCAqaHBtZF9vZmZzZXQocHVkX3QgKnB1ZCwgdW5zaWduZWQgbG9uZyBhZGRyLCBzdHJ1Y3QgaHN0YXRlICpoc3RhdGUpCi17Ci0JaWYgKGh1Z2VfcGFnZV9zaGlmdChoc3RhdGUpIDwgUE1EX1NISUZUKQotCQlyZXR1cm4gcG1kX29mZnNldChwdWQsIGFkZHIpOwotCWVsc2UKLQkJcmV0dXJuIChwbWRfdCAqKSBwdWQ7Ci19Ci1zdGF0aWMgcG1kX3QgKmhwbWRfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqbW0sIHB1ZF90ICpwdWQsIHVuc2lnbmVkIGxvbmcgYWRkciwKLQkJCSBzdHJ1Y3QgaHN0YXRlICpoc3RhdGUpCi17Ci0JaWYgKGh1Z2VfcGFnZV9zaGlmdChoc3RhdGUpIDwgUE1EX1NISUZUKQotCQlyZXR1cm4gcG1kX2FsbG9jKG1tLCBwdWQsIGFkZHIpOwotCWVsc2UKLQkJcmV0dXJuIChwbWRfdCAqKSBwdWQ7CisJYWRkciAmPSB+KHN6LTEpOworCisJcGcgPSBwZ2Rfb2Zmc2V0KG1tLCBhZGRyKTsKKwlpZiAocHNoaWZ0ID49IFBVRF9TSElGVCkgeworCQlocGRwID0gKGh1Z2VwZF90ICopcGc7CisJfSBlbHNlIHsKKwkJcGRzaGlmdCA9IFBVRF9TSElGVDsKKwkJcHUgPSBwdWRfYWxsb2MobW0sIHBnLCBhZGRyKTsKKwkJaWYgKHBzaGlmdCA+PSBQTURfU0hJRlQpIHsKKwkJCWhwZHAgPSAoaHVnZXBkX3QgKilwdTsKKwkJfSBlbHNlIHsKKwkJCXBkc2hpZnQgPSBQTURfU0hJRlQ7CisJCQlwbSA9IHBtZF9hbGxvYyhtbSwgcHUsIGFkZHIpOworCQkJaHBkcCA9IChodWdlcGRfdCAqKXBtOworCQl9CisJfQorCisJaWYgKCFocGRwKQorCQlyZXR1cm4gTlVMTDsKKworCUJVR19PTighaHVnZXBkX25vbmUoKmhwZHApICYmICFodWdlcGRfb2soKmhwZHApKTsKKworCWlmIChodWdlcGRfbm9uZSgqaHBkcCkgJiYgX19odWdlcHRlX2FsbG9jKG1tLCBocGRwLCBhZGRyLCBwZHNoaWZ0LCBwc2hpZnQpKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBodWdlcHRlX29mZnNldChocGRwLCBhZGRyLCBwZHNoaWZ0KTsKIH0KIAogLyogQnVpbGQgbGlzdCBvZiBhZGRyZXNzZXMgb2YgZ2lnYW50aWMgcGFnZXMuICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gZWFybHkKQEAgLTE5Miw5NCArMTk5LDM4IEBACiAJcmV0dXJuIDE7CiB9CiAKLQotLyogTW9kZWxsZWQgYWZ0ZXIgZmluZF9saW51eF9wdGUoKSAqLwotcHRlX3QgKmh1Z2VfcHRlX29mZnNldChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKQotewotCXBnZF90ICpwZzsKLQlwdWRfdCAqcHU7Ci0JcG1kX3QgKnBtOwotCi0JdW5zaWduZWQgaW50IHBzaXplOwotCXVuc2lnbmVkIGludCBzaGlmdDsKLQl1bnNpZ25lZCBsb25nIHN6OwotCXN0cnVjdCBoc3RhdGUgKmhzdGF0ZTsKLQlwc2l6ZSA9IGdldF9zbGljZV9wc2l6ZShtbSwgYWRkcik7Ci0Jc2hpZnQgPSBtbXVfcHNpemVfdG9fc2hpZnQocHNpemUpOwotCXN6ID0gKCgxVUwpIDw8IHNoaWZ0KTsKLQloc3RhdGUgPSBzaXplX3RvX2hzdGF0ZShzeik7Ci0KLQlhZGRyICY9IGhzdGF0ZS0+bWFzazsKLQotCXBnID0gcGdkX29mZnNldChtbSwgYWRkcik7Ci0JaWYgKCFwZ2Rfbm9uZSgqcGcpKSB7Ci0JCXB1ID0gaHB1ZF9vZmZzZXQocGcsIGFkZHIsIGhzdGF0ZSk7Ci0JCWlmICghcHVkX25vbmUoKnB1KSkgewotCQkJcG0gPSBocG1kX29mZnNldChwdSwgYWRkciwgaHN0YXRlKTsKLQkJCWlmICghcG1kX25vbmUoKnBtKSkKLQkJCQlyZXR1cm4gaHVnZXB0ZV9vZmZzZXQoKGh1Z2VwZF90ICopcG0sIGFkZHIsCi0JCQkJCQkgICAgICBoc3RhdGUpOwotCQl9Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXB0ZV90ICpodWdlX3B0ZV9hbGxvYyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKLQkJCXVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzeikKLXsKLQlwZ2RfdCAqcGc7Ci0JcHVkX3QgKnB1OwotCXBtZF90ICpwbTsKLQlodWdlcGRfdCAqaHBkcCA9IE5VTEw7Ci0Jc3RydWN0IGhzdGF0ZSAqaHN0YXRlOwotCXVuc2lnbmVkIGludCBwc2l6ZTsKLQloc3RhdGUgPSBzaXplX3RvX2hzdGF0ZShzeik7Ci0KLQlwc2l6ZSA9IGdldF9zbGljZV9wc2l6ZShtbSwgYWRkcik7Ci0JQlVHX09OKCFtbXVfaHVnZV9wc2l6ZXNbcHNpemVdKTsKLQotCWFkZHIgJj0gaHN0YXRlLT5tYXNrOwotCi0JcGcgPSBwZ2Rfb2Zmc2V0KG1tLCBhZGRyKTsKLQlwdSA9IGhwdWRfYWxsb2MobW0sIHBnLCBhZGRyLCBoc3RhdGUpOwotCi0JaWYgKHB1KSB7Ci0JCXBtID0gaHBtZF9hbGxvYyhtbSwgcHUsIGFkZHIsIGhzdGF0ZSk7Ci0JCWlmIChwbSkKLQkJCWhwZHAgPSAoaHVnZXBkX3QgKilwbTsKLQl9Ci0KLQlpZiAoISBocGRwKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChodWdlcGRfbm9uZSgqaHBkcCkgJiYgX19odWdlcHRlX2FsbG9jKG1tLCBocGRwLCBhZGRyLCBwc2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIGh1Z2VwdGVfb2Zmc2V0KGhwZHAsIGFkZHIsIGhzdGF0ZSk7Ci19Ci0KIGludCBodWdlX3BtZF91bnNoYXJlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nICphZGRyLCBwdGVfdCAqcHRlcCkKIHsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZnJlZV9odWdlcHRlX3JhbmdlKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIGh1Z2VwZF90ICpocGRwLAotCQkJICAgICAgIHVuc2lnbmVkIGludCBwc2l6ZSkKK3N0YXRpYyB2b2lkIGZyZWVfaHVnZXBkX3JhbmdlKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIGh1Z2VwZF90ICpocGRwLCBpbnQgcGRzaGlmdCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBmbG9vciwgdW5zaWduZWQgbG9uZyBjZWlsaW5nKQogewogCXB0ZV90ICpodWdlcHRlID0gaHVnZXBkX3BhZ2UoKmhwZHApOworCXVuc2lnbmVkIHNoaWZ0ID0gaHVnZXBkX3NoaWZ0KCpocGRwKTsKKwl1bnNpZ25lZCBsb25nIHBkbWFzayA9IH4oKDFVTCA8PCBwZHNoaWZ0KSAtIDEpOworCisJc3RhcnQgJj0gcGRtYXNrOworCWlmIChzdGFydCA8IGZsb29yKQorCQlyZXR1cm47CisJaWYgKGNlaWxpbmcpIHsKKwkJY2VpbGluZyAmPSBwZG1hc2s7CisJCWlmICghIGNlaWxpbmcpCisJCQlyZXR1cm47CisJfQorCWlmIChlbmQgLSAxID4gY2VpbGluZyAtIDEpCisJCXJldHVybjsKIAogCWhwZHAtPnBkID0gMDsKIAl0bGItPm5lZWRfZmx1c2ggPSAxOwotCXBndGFibGVfZnJlZV90bGIodGxiLCBwZ3RhYmxlX2ZyZWVfY2FjaGUoaHVnZXB0ZSwKLQkJCQkJCSBIVUdFUFRFX0NBQ0hFX05VTStwc2l6ZS0xLAotCQkJCQkJIFBHRl9DQUNIRU5VTV9NQVNLKSk7CisJcGd0YWJsZV9mcmVlX3RsYih0bGIsIGh1Z2VwdGUsIHBkc2hpZnQgLSBzaGlmdCk7CiB9CiAKIHN0YXRpYyB2b2lkIGh1Z2V0bGJfZnJlZV9wbWRfcmFuZ2Uoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgcHVkX3QgKnB1ZCwKIAkJCQkgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgZmxvb3IsIHVuc2lnbmVkIGxvbmcgY2VpbGluZywKLQkJCQkgICB1bnNpZ25lZCBpbnQgcHNpemUpCisJCQkJICAgdW5zaWduZWQgbG9uZyBmbG9vciwgdW5zaWduZWQgbG9uZyBjZWlsaW5nKQogewogCXBtZF90ICpwbWQ7CiAJdW5zaWduZWQgbG9uZyBuZXh0OwpAQCAtMjkxLDcgKzI0Miw4IEBACiAJCW5leHQgPSBwbWRfYWRkcl9lbmQoYWRkciwgZW5kKTsKIAkJaWYgKHBtZF9ub25lKCpwbWQpKQogCQkJY29udGludWU7Ci0JCWZyZWVfaHVnZXB0ZV9yYW5nZSh0bGIsIChodWdlcGRfdCAqKXBtZCwgcHNpemUpOworCQlmcmVlX2h1Z2VwZF9yYW5nZSh0bGIsIChodWdlcGRfdCAqKXBtZCwgUE1EX1NISUZULAorCQkJCSAgYWRkciwgbmV4dCwgZmxvb3IsIGNlaWxpbmcpOwogCX0gd2hpbGUgKHBtZCsrLCBhZGRyID0gbmV4dCwgYWRkciAhPSBlbmQpOwogCiAJc3RhcnQgJj0gUFVEX01BU0s7CkBAIC0zMTcsMjMgKzI2OSwxOSBAQAogCXB1ZF90ICpwdWQ7CiAJdW5zaWduZWQgbG9uZyBuZXh0OwogCXVuc2lnbmVkIGxvbmcgc3RhcnQ7Ci0JdW5zaWduZWQgaW50IHNoaWZ0OwotCXVuc2lnbmVkIGludCBwc2l6ZSA9IGdldF9zbGljZV9wc2l6ZSh0bGItPm1tLCBhZGRyKTsKLQlzaGlmdCA9IG1tdV9wc2l6ZV90b19zaGlmdChwc2l6ZSk7CiAKIAlzdGFydCA9IGFkZHI7CiAJcHVkID0gcHVkX29mZnNldChwZ2QsIGFkZHIpOwogCWRvIHsKIAkJbmV4dCA9IHB1ZF9hZGRyX2VuZChhZGRyLCBlbmQpOwotCQlpZiAoc2hpZnQgPCBQTURfU0hJRlQpIHsKKwkJaWYgKCFpc19odWdlcGQocHVkKSkgewogCQkJaWYgKHB1ZF9ub25lX29yX2NsZWFyX2JhZChwdWQpKQogCQkJCWNvbnRpbnVlOwogCQkJaHVnZXRsYl9mcmVlX3BtZF9yYW5nZSh0bGIsIHB1ZCwgYWRkciwgbmV4dCwgZmxvb3IsCi0JCQkJCSAgICAgICBjZWlsaW5nLCBwc2l6ZSk7CisJCQkJCSAgICAgICBjZWlsaW5nKTsKIAkJfSBlbHNlIHsKLQkJCWlmIChwdWRfbm9uZSgqcHVkKSkKLQkJCQljb250aW51ZTsKLQkJCWZyZWVfaHVnZXB0ZV9yYW5nZSh0bGIsIChodWdlcGRfdCAqKXB1ZCwgcHNpemUpOworCQkJZnJlZV9odWdlcGRfcmFuZ2UodGxiLCAoaHVnZXBkX3QgKilwdWQsIFBVRF9TSElGVCwKKwkJCQkJICBhZGRyLCBuZXh0LCBmbG9vciwgY2VpbGluZyk7CiAJCX0KIAl9IHdoaWxlIChwdWQrKywgYWRkciA9IG5leHQsIGFkZHIgIT0gZW5kKTsKIApAQCAtMzY0LDEyMSArMzEyLDU2IEBACiB7CiAJcGdkX3QgKnBnZDsKIAl1bnNpZ25lZCBsb25nIG5leHQ7Ci0JdW5zaWduZWQgbG9uZyBzdGFydDsKIAogCS8qCi0JICogQ29tbWVudHMgYmVsb3cgdGFrZSBmcm9tIHRoZSBub3JtYWwgZnJlZV9wZ2RfcmFuZ2UoKS4gIFRoZXkKLQkgKiBhcHBseSBoZXJlIHRvby4gIFRoZSB0ZXN0cyBhZ2FpbnN0IEhVR0VQRF9NQVNLIGJlbG93IGFyZQotCSAqIGVzc2VudGlhbCwgYmVjYXVzZSB3ZSAqZG9uJ3QqIHRlc3QgZm9yIHRoaXMgYXQgdGhlIGJvdHRvbQotCSAqIGxldmVsLiAgV2l0aG91dCB0aGVtIHdlJ2xsIGF0dGVtcHQgdG8gZnJlZSBhIGh1Z2VwdGUgdGFibGUKLQkgKiB3aGVuIHdlIHVubWFwIGp1c3QgcGFydCBvZiBpdCwgZXZlbiBpZiB0aGVyZSBhcmUgb3RoZXIKLQkgKiBhY3RpdmUgbWFwcGluZ3MgdXNpbmcgaXQuCisJICogQmVjYXVzZSB0aGVyZSBhcmUgYSBudW1iZXIgb2YgZGlmZmVyZW50IHBvc3NpYmxlIHBhZ2V0YWJsZQorCSAqIGxheW91dHMgZm9yIGh1Z2VwYWdlIHJhbmdlcywgd2UgbGltaXQga25vd2xlZGdlIG9mIGhvdworCSAqIHRoaW5ncyBzaG91bGQgYmUgbGFpZCBvdXQgdG8gdGhlIGFsbG9jYXRpb24gcGF0aAorCSAqIChodWdlX3B0ZV9hbGxvYygpLCBhYm92ZSkuICBFdmVyeXRoaW5nIGVsc2Ugd29ya3Mgb3V0IHRoZQorCSAqIHN0cnVjdHVyZSBhcyBpdCBnb2VzIGZyb20gaW5mb3JtYXRpb24gaW4gdGhlIGh1Z2VwZAorCSAqIHBvaW50ZXJzLiAgVGhhdCBtZWFucyB0aGF0IHdlIGNhbid0IGhlcmUgdXNlIHRoZQorCSAqIG9wdGltaXphdGlvbiB1c2VkIGluIHRoZSBub3JtYWwgcGFnZSBmcmVlX3BnZF9yYW5nZSgpLCBvZgorCSAqIGNoZWNraW5nIHdoZXRoZXIgd2UncmUgYWN0dWFsbHkgY292ZXJpbmcgYSBsYXJnZSBlbm91Z2gKKwkgKiByYW5nZSB0byBoYXZlIHRvIGRvIGFueXRoaW5nIGF0IHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHdhbGsKKwkgKiBpbnN0ZWFkIG9mIGF0IHRoZSBib3R0b20uCiAJICoKLQkgKiBUaGUgbmV4dCBmZXcgbGluZXMgaGF2ZSBnaXZlbiB1cyBsb3RzIG9mIGdyaWVmLi4uCi0JICoKLQkgKiBXaHkgYXJlIHdlIHRlc3RpbmcgSFVHRVBEKiBhdCB0aGlzIHRvcCBsZXZlbD8gIEJlY2F1c2UKLQkgKiBvZnRlbiB0aGVyZSB3aWxsIGJlIG5vIHdvcmsgdG8gZG8gYXQgYWxsLCBhbmQgd2UnZCBwcmVmZXIKLQkgKiBub3QgdG8gZ28gYWxsIHRoZSB3YXkgZG93biB0byB0aGUgYm90dG9tIGp1c3QgdG8gZGlzY292ZXIKLQkgKiB0aGF0LgotCSAqCi0JICogV2h5IGFsbCB0aGVzZSAiLSAxInM/ICBCZWNhdXNlIDAgcmVwcmVzZW50cyBib3RoIHRoZSBib3R0b20KLQkgKiBvZiB0aGUgYWRkcmVzcyBzcGFjZSBhbmQgdGhlIHRvcCBvZiBpdCAodXNpbmcgLTEgZm9yIHRoZQotCSAqIHRvcCB3b3VsZG4ndCBoZWxwIG11Y2g6IHRoZSBtYXNrcyB3b3VsZCBkbyB0aGUgd3JvbmcgdGhpbmcpLgotCSAqIFRoZSBydWxlIGlzIHRoYXQgYWRkciAwIGFuZCBmbG9vciAwIHJlZmVyIHRvIHRoZSBib3R0b20gb2YKLQkgKiB0aGUgYWRkcmVzcyBzcGFjZSwgYnV0IGVuZCAwIGFuZCBjZWlsaW5nIDAgcmVmZXIgdG8gdGhlIHRvcAotCSAqIENvbXBhcmlzb25zIG5lZWQgdG8gdXNlICJlbmQgLSAxIiBhbmQgImNlaWxpbmcgLSAxIiAodGhvdWdoCi0JICogdGhhdCBlbmQgMCBjYXNlIHNob3VsZCBiZSBteXRoaWNhbCkuCi0JICoKLQkgKiBXaGVyZXZlciBhZGRyIGlzIGJyb3VnaHQgdXAgb3IgY2VpbGluZyBicm91Z2h0IGRvd24sIHdlCi0JICogbXVzdCBiZSBjYXJlZnVsIHRvIHJlamVjdCAidGhlIG9wcG9zaXRlIDAiIGJlZm9yZSBpdAotCSAqIGNvbmZ1c2VzIHRoZSBzdWJzZXF1ZW50IHRlc3RzLiAgQnV0IHdoYXQgYWJvdXQgd2hlcmUgZW5kIGlzCi0JICogYnJvdWdodCBkb3duIGJ5IEhVR0VQRF9TSVpFIGJlbG93PyBubywgZW5kIGNhbid0IGdvIGRvd24gdG8KLQkgKiAwIHRoZXJlLgotCSAqCi0JICogV2hlcmVhcyB3ZSByb3VuZCBzdGFydCAoYWRkcikgYW5kIGNlaWxpbmcgZG93biwgYnkgZGlmZmVyZW50Ci0JICogbWFza3MgYXQgZGlmZmVyZW50IGxldmVscywgaW4gb3JkZXIgdG8gdGVzdCB3aGV0aGVyIGEgdGFibGUKLQkgKiBub3cgaGFzIG5vIG90aGVyIHZtYXMgdXNpbmcgaXQsIHNvIGNhbiBiZSBmcmVlZCwgd2UgZG9uJ3QKLQkgKiBib3RoZXIgdG8gcm91bmQgZmxvb3Igb3IgZW5kIHVwIC0gdGhlIHRlc3RzIGRvbid0IG5lZWQgdGhhdC4KKwkgKiBUbyBtYWtlIHNlbnNlIG9mIHRoaXMsIHlvdSBzaG91bGQgcHJvYmFibHkgZ28gcmVhZCB0aGUgYmlnCisJICogYmxvY2sgY29tbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBub3JtYWwgZnJlZV9wZ2RfcmFuZ2UoKSwKKwkgKiB0b28uCiAJICovCi0JdW5zaWduZWQgaW50IHBzaXplID0gZ2V0X3NsaWNlX3BzaXplKHRsYi0+bW0sIGFkZHIpOwogCi0JYWRkciAmPSBIVUdFUERfTUFTSyhwc2l6ZSk7Ci0JaWYgKGFkZHIgPCBmbG9vcikgewotCQlhZGRyICs9IEhVR0VQRF9TSVpFKHBzaXplKTsKLQkJaWYgKCFhZGRyKQotCQkJcmV0dXJuOwotCX0KLQlpZiAoY2VpbGluZykgewotCQljZWlsaW5nICY9IEhVR0VQRF9NQVNLKHBzaXplKTsKLQkJaWYgKCFjZWlsaW5nKQotCQkJcmV0dXJuOwotCX0KLQlpZiAoZW5kIC0gMSA+IGNlaWxpbmcgLSAxKQotCQllbmQgLT0gSFVHRVBEX1NJWkUocHNpemUpOwotCWlmIChhZGRyID4gZW5kIC0gMSkKLQkJcmV0dXJuOwotCi0Jc3RhcnQgPSBhZGRyOwogCXBnZCA9IHBnZF9vZmZzZXQodGxiLT5tbSwgYWRkcik7CiAJZG8gewotCQlwc2l6ZSA9IGdldF9zbGljZV9wc2l6ZSh0bGItPm1tLCBhZGRyKTsKLQkJQlVHX09OKCFtbXVfaHVnZV9wc2l6ZXNbcHNpemVdKTsKIAkJbmV4dCA9IHBnZF9hZGRyX2VuZChhZGRyLCBlbmQpOwotCQlpZiAobW11X3BzaXplX3RvX3NoaWZ0KHBzaXplKSA8IFBVRF9TSElGVCkgeworCQlpZiAoIWlzX2h1Z2VwZChwZ2QpKSB7CiAJCQlpZiAocGdkX25vbmVfb3JfY2xlYXJfYmFkKHBnZCkpCiAJCQkJY29udGludWU7CiAJCQlodWdldGxiX2ZyZWVfcHVkX3JhbmdlKHRsYiwgcGdkLCBhZGRyLCBuZXh0LCBmbG9vciwgY2VpbGluZyk7CiAJCX0gZWxzZSB7Ci0JCQlpZiAocGdkX25vbmUoKnBnZCkpCi0JCQkJY29udGludWU7Ci0JCQlmcmVlX2h1Z2VwdGVfcmFuZ2UodGxiLCAoaHVnZXBkX3QgKilwZ2QsIHBzaXplKTsKKwkJCWZyZWVfaHVnZXBkX3JhbmdlKHRsYiwgKGh1Z2VwZF90ICopcGdkLCBQR0RJUl9TSElGVCwKKwkJCQkJICBhZGRyLCBuZXh0LCBmbG9vciwgY2VpbGluZyk7CiAJCX0KIAl9IHdoaWxlIChwZ2QrKywgYWRkciA9IG5leHQsIGFkZHIgIT0gZW5kKTsKIH0KIAotdm9pZCBzZXRfaHVnZV9wdGVfYXQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKLQkJICAgICBwdGVfdCAqcHRlcCwgcHRlX3QgcHRlKQotewotCWlmIChwdGVfcHJlc2VudCgqcHRlcCkpIHsKLQkJLyogV2Ugb3Blbi1jb2RlIHB0ZV9jbGVhciBiZWNhdXNlIHdlIG5lZWQgdG8gcGFzcyB0aGUgcmlnaHQKLQkJICogYXJndW1lbnQgdG8gaHB0ZV9uZWVkX2ZsdXNoIChodWdlIC8gIWh1Z2UpLiBNaWdodCBub3QgYmUKLQkJICogbmVjZXNzYXJ5IGFueW1vcmUgaWYgd2UgbWFrZSBocHRlX25lZWRfZmx1c2goKSBnZXQgdGhlCi0JCSAqIHBhZ2Ugc2l6ZSBmcm9tIHRoZSBzbGljZXMKLQkJICovCi0JCXVuc2lnbmVkIGludCBwc2l6ZSA9IGdldF9zbGljZV9wc2l6ZShtbSwgYWRkcik7Ci0JCXVuc2lnbmVkIGludCBzaGlmdCA9IG1tdV9wc2l6ZV90b19zaGlmdChwc2l6ZSk7Ci0JCXVuc2lnbmVkIGxvbmcgc3ogPSAoKDFVTCkgPDwgc2hpZnQpOwotCQlzdHJ1Y3QgaHN0YXRlICpoc3RhdGUgPSBzaXplX3RvX2hzdGF0ZShzeik7Ci0JCXB0ZV91cGRhdGUobW0sIGFkZHIgJiBoc3RhdGUtPm1hc2ssIHB0ZXAsIH4wVUwsIDEpOwotCX0KLQkqcHRlcCA9IF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9IUFRFRkxBR1MpOwotfQotCi1wdGVfdCBodWdlX3B0ZXBfZ2V0X2FuZF9jbGVhcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAotCQkJICAgICAgcHRlX3QgKnB0ZXApCi17Ci0JdW5zaWduZWQgbG9uZyBvbGQgPSBwdGVfdXBkYXRlKG1tLCBhZGRyLCBwdGVwLCB+MFVMLCAxKTsKLQlyZXR1cm4gX19wdGUob2xkKTsKLX0KLQogc3RydWN0IHBhZ2UgKgogZm9sbG93X2h1Z2VfYWRkcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgd3JpdGUpCiB7CiAJcHRlX3QgKnB0ZXA7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JdW5zaWduZWQgaW50IG1tdV9wc2l6ZSA9IGdldF9zbGljZV9wc2l6ZShtbSwgYWRkcmVzcyk7CisJdW5zaWduZWQgc2hpZnQ7CisJdW5zaWduZWQgbG9uZyBtYXNrOworCisJcHRlcCA9IGZpbmRfbGludXhfcHRlX29yX2h1Z2VwdGUobW0tPnBnZCwgYWRkcmVzcywgJnNoaWZ0KTsKIAogCS8qIFZlcmlmeSBpdCBpcyBhIGh1Z2UgcGFnZSBlbHNlIGJhaWwuICovCi0JaWYgKCFtbXVfaHVnZV9wc2l6ZXNbbW11X3BzaXplXSkKKwlpZiAoIXB0ZXAgfHwgIXNoaWZ0KQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAotCXB0ZXAgPSBodWdlX3B0ZV9vZmZzZXQobW0sIGFkZHJlc3MpOworCW1hc2sgPSAoMVVMIDw8IHNoaWZ0KSAtIDE7CiAJcGFnZSA9IHB0ZV9wYWdlKCpwdGVwKTsKLQlpZiAocGFnZSkgewotCQl1bnNpZ25lZCBpbnQgc2hpZnQgPSBtbXVfcHNpemVfdG9fc2hpZnQobW11X3BzaXplKTsKLQkJdW5zaWduZWQgbG9uZyBzeiA9ICgoMVVMKSA8PCBzaGlmdCk7Ci0JCXBhZ2UgKz0gKGFkZHJlc3MgJSBzeikgLyBQQUdFX1NJWkU7Ci0JfQorCWlmIChwYWdlKQorCQlwYWdlICs9IChhZGRyZXNzICYgbWFzaykgLyBQQUdFX1NJWkU7CiAKIAlyZXR1cm4gcGFnZTsKIH0KQEAgLTUwMSw2ICszODQsODIgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIG5vaW5saW5lIGludCBndXBfaHVnZXB0ZShwdGVfdCAqcHRlcCwgdW5zaWduZWQgbG9uZyBzeiwgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBlbmQsIGludCB3cml0ZSwgc3RydWN0IHBhZ2UgKipwYWdlcywgaW50ICpucikKK3sKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisJdW5zaWduZWQgbG9uZyBwdGVfZW5kOworCXN0cnVjdCBwYWdlICpoZWFkLCAqcGFnZTsKKwlwdGVfdCBwdGU7CisJaW50IHJlZnM7CisKKwlwdGVfZW5kID0gKGFkZHIgKyBzeikgJiB+KHN6LTEpOworCWlmIChwdGVfZW5kIDwgZW5kKQorCQllbmQgPSBwdGVfZW5kOworCisJcHRlID0gKnB0ZXA7CisJbWFzayA9IF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9VU0VSOworCWlmICh3cml0ZSkKKwkJbWFzayB8PSBfUEFHRV9SVzsKKworCWlmICgocHRlX3ZhbChwdGUpICYgbWFzaykgIT0gbWFzaykKKwkJcmV0dXJuIDA7CisKKwkvKiBodWdlcGFnZXMgYXJlIG5ldmVyICJzcGVjaWFsIiAqLworCVZNX0JVR19PTighcGZuX3ZhbGlkKHB0ZV9wZm4ocHRlKSkpOworCisJcmVmcyA9IDA7CisJaGVhZCA9IHB0ZV9wYWdlKHB0ZSk7CisKKwlwYWdlID0gaGVhZCArICgoYWRkciAmIChzei0xKSkgPj4gUEFHRV9TSElGVCk7CisJZG8geworCQlWTV9CVUdfT04oY29tcG91bmRfaGVhZChwYWdlKSAhPSBoZWFkKTsKKwkJcGFnZXNbKm5yXSA9IHBhZ2U7CisJCSgqbnIpKys7CisJCXBhZ2UrKzsKKwkJcmVmcysrOworCX0gd2hpbGUgKGFkZHIgKz0gUEFHRV9TSVpFLCBhZGRyICE9IGVuZCk7CisKKwlpZiAoIXBhZ2VfY2FjaGVfYWRkX3NwZWN1bGF0aXZlKGhlYWQsIHJlZnMpKSB7CisJCSpuciAtPSByZWZzOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodW5saWtlbHkocHRlX3ZhbChwdGUpICE9IHB0ZV92YWwoKnB0ZXApKSkgeworCQkvKiBDb3VsZCBiZSBvcHRpbWl6ZWQgYmV0dGVyICovCisJCXdoaWxlICgqbnIpIHsKKwkJCXB1dF9wYWdlKHBhZ2UpOworCQkJKCpuciktLTsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBodWdlcHRlX2FkZHJfZW5kKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBzeikKK3sKKwl1bnNpZ25lZCBsb25nIF9fYm91bmRhcnkgPSAoYWRkciArIHN6KSAmIH4oc3otMSk7CisJcmV0dXJuIChfX2JvdW5kYXJ5IC0gMSA8IGVuZCAtIDEpID8gX19ib3VuZGFyeSA6IGVuZDsKK30KKworaW50IGd1cF9odWdlcGQoaHVnZXBkX3QgKmh1Z2VwZCwgdW5zaWduZWQgcGRzaGlmdCwKKwkgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwKKwkgICAgICAgaW50IHdyaXRlLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBpbnQgKm5yKQoreworCXB0ZV90ICpwdGVwOworCXVuc2lnbmVkIGxvbmcgc3ogPSAxVUwgPDwgaHVnZXBkX3NoaWZ0KCpodWdlcGQpOworCXVuc2lnbmVkIGxvbmcgbmV4dDsKKworCXB0ZXAgPSBodWdlcHRlX29mZnNldChodWdlcGQsIGFkZHIsIHBkc2hpZnQpOworCWRvIHsKKwkJbmV4dCA9IGh1Z2VwdGVfYWRkcl9lbmQoYWRkciwgZW5kLCBzeik7CisJCWlmICghZ3VwX2h1Z2VwdGUocHRlcCwgc3osIGFkZHIsIGVuZCwgd3JpdGUsIHBhZ2VzLCBucikpCisJCQlyZXR1cm4gMDsKKwl9IHdoaWxlIChwdGVwKyssIGFkZHIgPSBuZXh0LCBhZGRyICE9IGVuZCk7CisKKwlyZXR1cm4gMTsKK30KIAogdW5zaWduZWQgbG9uZyBodWdldGxiX2dldF91bm1hcHBlZF9hcmVhKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkJCXVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIHBnb2ZmLApAQCAtNTA5LDggKzQ2OCw2IEBACiAJc3RydWN0IGhzdGF0ZSAqaHN0YXRlID0gaHN0YXRlX2ZpbGUoZmlsZSk7CiAJaW50IG1tdV9wc2l6ZSA9IHNoaWZ0X3RvX21tdV9wc2l6ZShodWdlX3BhZ2Vfc2hpZnQoaHN0YXRlKSk7CiAKLQlpZiAoIW1tdV9odWdlX3BzaXplc1ttbXVfcHNpemVdKQotCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR1cm4gc2xpY2VfZ2V0X3VubWFwcGVkX2FyZWEoYWRkciwgbGVuLCBmbGFncywgbW11X3BzaXplLCAxLCAwKTsKIH0KIApAQCAtNTIxLDIyOSArNDc4LDQ2IEBACiAJcmV0dXJuIDFVTCA8PCBtbXVfcHNpemVfdG9fc2hpZnQocHNpemUpOwogfQogCi0vKgotICogQ2FsbGVkIGJ5IGFzbSBoYXNodGFibGUuUyBmb3IgZG9pbmcgbGF6eSBpY2FjaGUgZmx1c2gKLSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBoYXNoX2h1Z2VfcGFnZV9kb19sYXp5X2ljYWNoZSh1bnNpZ25lZCBsb25nIHJmbGFncywKLQkJCQkJcHRlX3QgcHRlLCBpbnQgdHJhcCwgdW5zaWduZWQgbG9uZyBzeikKK3N0YXRpYyBpbnQgX19pbml0IGFkZF9odWdlX3BhZ2Vfc2l6ZSh1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSkKIHsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlpbnQgaTsKKwlpbnQgc2hpZnQgPSBfX2ZmcyhzaXplKTsKKwlpbnQgbW11X3BzaXplOwogCi0JaWYgKCFwZm5fdmFsaWQocHRlX3BmbihwdGUpKSkKLQkJcmV0dXJuIHJmbGFnczsKLQotCXBhZ2UgPSBwdGVfcGFnZShwdGUpOwotCi0JLyogcGFnZSBpcyBkaXJ0eSAqLwotCWlmICghdGVzdF9iaXQoUEdfYXJjaF8xLCAmcGFnZS0+ZmxhZ3MpICYmICFQYWdlUmVzZXJ2ZWQocGFnZSkpIHsKLQkJaWYgKHRyYXAgPT0gMHg0MDApIHsKLQkJCWZvciAoaSA9IDA7IGkgPCAoc3ogLyBQQUdFX1NJWkUpOyBpKyspCi0JCQkJX19mbHVzaF9kY2FjaGVfaWNhY2hlKHBhZ2VfYWRkcmVzcyhwYWdlK2kpKTsKLQkJCXNldF9iaXQoUEdfYXJjaF8xLCAmcGFnZS0+ZmxhZ3MpOwotCQl9IGVsc2UgewotCQkJcmZsYWdzIHw9IEhQVEVfUl9OOwotCQl9Ci0JfQotCXJldHVybiByZmxhZ3M7Ci19Ci0KLWludCBoYXNoX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhY2Nlc3MsCi0JCSAgIHVuc2lnbmVkIGxvbmcgZWEsIHVuc2lnbmVkIGxvbmcgdnNpZCwgaW50IGxvY2FsLAotCQkgICB1bnNpZ25lZCBsb25nIHRyYXApCi17Ci0JcHRlX3QgKnB0ZXA7Ci0JdW5zaWduZWQgbG9uZyBvbGRfcHRlLCBuZXdfcHRlOwotCXVuc2lnbmVkIGxvbmcgdmEsIHJmbGFncywgcGEsIHN6OwotCWxvbmcgc2xvdDsKLQlpbnQgZXJyID0gMTsKLQlpbnQgc3NpemUgPSB1c2VyX3NlZ21lbnRfc2l6ZShlYSk7Ci0JdW5zaWduZWQgaW50IG1tdV9wc2l6ZTsKLQlpbnQgc2hpZnQ7Ci0JbW11X3BzaXplID0gZ2V0X3NsaWNlX3BzaXplKG1tLCBlYSk7Ci0KLQlpZiAoIW1tdV9odWdlX3BzaXplc1ttbXVfcHNpemVdKQotCQlnb3RvIG91dDsKLQlwdGVwID0gaHVnZV9wdGVfb2Zmc2V0KG1tLCBlYSk7Ci0KLQkvKiBTZWFyY2ggdGhlIExpbnV4IHBhZ2UgdGFibGUgZm9yIGEgbWF0Y2ggd2l0aCB2YSAqLwotCXZhID0gaHB0X3ZhKGVhLCB2c2lkLCBzc2l6ZSk7Ci0KLQkvKgotCSAqIElmIG5vIHB0ZSBmb3VuZCBvciBub3QgcHJlc2VudCwgc2VuZCB0aGUgcHJvYmxlbSB1cCB0bwotCSAqIGRvX3BhZ2VfZmF1bHQKLQkgKi8KLQlpZiAodW5saWtlbHkoIXB0ZXAgfHwgcHRlX25vbmUoKnB0ZXApKSkKLQkJZ290byBvdXQ7Ci0KLQkvKiAKLQkgKiBDaGVjayB0aGUgdXNlcidzIGFjY2VzcyByaWdodHMgdG8gdGhlIHBhZ2UuICBJZiBhY2Nlc3Mgc2hvdWxkIGJlCi0JICogcHJldmVudGVkIHRoZW4gc2VuZCB0aGUgcHJvYmxlbSB1cCB0byBkb19wYWdlX2ZhdWx0LgotCSAqLwotCWlmICh1bmxpa2VseShhY2Nlc3MgJiB+cHRlX3ZhbCgqcHRlcCkpKQotCQlnb3RvIG91dDsKLQkvKgotCSAqIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgYSBwdGUgKG9sZF9wdGUpIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGJ1aWxkCi0JICogb3IgdXBkYXRlIGFuIEhQVEUuIFRoZXJlIGFyZSAyIGNhc2VzOgotCSAqCi0JICogMS4gVGhlcmUgaXMgYSB2YWxpZCAocHJlc2VudCkgcHRlIHdpdGggbm8gYXNzb2NpYXRlZCBIUFRFICh0aGlzIGlzIAotCSAqCXRoZSBtb3N0IGNvbW1vbiBjYXNlKQotCSAqIDIuIFRoZXJlIGlzIGEgdmFsaWQgKHByZXNlbnQpIHB0ZSB3aXRoIGFuIGFzc29jaWF0ZWQgSFBURS4gVGhlCi0JICoJY3VycmVudCB2YWx1ZXMgb2YgdGhlIHBwIGJpdHMgaW4gdGhlIEhQVEUgcHJldmVudCBhY2Nlc3MKLQkgKgliZWNhdXNlIHdlIGFyZSBkb2luZyBzb2Z0d2FyZSBESVJUWSBiaXQgbWFuYWdlbWVudCBhbmQgdGhlCi0JICoJcGFnZSBpcyBjdXJyZW50bHkgbm90IERJUlRZLiAKLQkgKi8KLQotCi0JZG8gewotCQlvbGRfcHRlID0gcHRlX3ZhbCgqcHRlcCk7Ci0JCWlmIChvbGRfcHRlICYgX1BBR0VfQlVTWSkKLQkJCWdvdG8gb3V0OwotCQluZXdfcHRlID0gb2xkX3B0ZSB8IF9QQUdFX0JVU1kgfCBfUEFHRV9BQ0NFU1NFRDsKLQl9IHdoaWxlKG9sZF9wdGUgIT0gX19jbXB4Y2hnX3U2NCgodW5zaWduZWQgbG9uZyAqKXB0ZXAsCi0JCQkJCSBvbGRfcHRlLCBuZXdfcHRlKSk7Ci0KLQlyZmxhZ3MgPSAweDIgfCAoIShuZXdfcHRlICYgX1BBR0VfUlcpKTsKLSAJLyogX1BBR0VfRVhFQyAtPiBIV19OT19FWEVDIHNpbmNlIGl0J3MgaW52ZXJ0ZWQgKi8KLQlyZmxhZ3MgfD0gKChuZXdfcHRlICYgX1BBR0VfRVhFQykgPyAwIDogSFBURV9SX04pOwotCXNoaWZ0ID0gbW11X3BzaXplX3RvX3NoaWZ0KG1tdV9wc2l6ZSk7Ci0Jc3ogPSAoKDFVTCkgPDwgc2hpZnQpOwotCWlmICghY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFKSkKLQkJLyogTm8gQ1BVIGhhcyBodWdlcGFnZXMgYnV0IGxhY2tzIG5vIGV4ZWN1dGUsIHNvIHdlCi0JCSAqIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhhdCBjYXNlICovCi0JCXJmbGFncyA9IGhhc2hfaHVnZV9wYWdlX2RvX2xhenlfaWNhY2hlKHJmbGFncywgX19wdGUob2xkX3B0ZSksCi0JCQkJCQkgICAgICAgdHJhcCwgc3opOwotCi0JLyogQ2hlY2sgaWYgcHRlIGFscmVhZHkgaGFzIGFuIGhwdGUgKGNhc2UgMikgKi8KLQlpZiAodW5saWtlbHkob2xkX3B0ZSAmIF9QQUdFX0hBU0hQVEUpKSB7Ci0JCS8qIFRoZXJlIE1JR0hUIGJlIGFuIEhQVEUgZm9yIHRoaXMgcHRlICovCi0JCXVuc2lnbmVkIGxvbmcgaGFzaCwgc2xvdDsKLQotCQloYXNoID0gaHB0X2hhc2godmEsIHNoaWZ0LCBzc2l6ZSk7Ci0JCWlmIChvbGRfcHRlICYgX1BBR0VfRl9TRUNPTkQpCi0JCQloYXNoID0gfmhhc2g7Ci0JCXNsb3QgPSAoaGFzaCAmIGh0YWJfaGFzaF9tYXNrKSAqIEhQVEVTX1BFUl9HUk9VUDsKLQkJc2xvdCArPSAob2xkX3B0ZSAmIF9QQUdFX0ZfR0lYKSA+PiAxMjsKLQotCQlpZiAocHBjX21kLmhwdGVfdXBkYXRlcHAoc2xvdCwgcmZsYWdzLCB2YSwgbW11X3BzaXplLAotCQkJCQkgc3NpemUsIGxvY2FsKSA9PSAtMSkKLQkJCW9sZF9wdGUgJj0gfl9QQUdFX0hQVEVGTEFHUzsKLQl9Ci0KLQlpZiAobGlrZWx5KCEob2xkX3B0ZSAmIF9QQUdFX0hBU0hQVEUpKSkgewotCQl1bnNpZ25lZCBsb25nIGhhc2ggPSBocHRfaGFzaCh2YSwgc2hpZnQsIHNzaXplKTsKLQkJdW5zaWduZWQgbG9uZyBocHRlX2dyb3VwOwotCi0JCXBhID0gcHRlX3BmbihfX3B0ZShvbGRfcHRlKSkgPDwgUEFHRV9TSElGVDsKLQotcmVwZWF0OgotCQlocHRlX2dyb3VwID0gKChoYXNoICYgaHRhYl9oYXNoX21hc2spICoKLQkJCSAgICAgIEhQVEVTX1BFUl9HUk9VUCkgJiB+MHg3VUw7Ci0KLQkJLyogY2xlYXIgSFBURSBzbG90IGluZm9ybWF0aW9ucyBpbiBuZXcgUFRFICovCi0jaWZkZWYgQ09ORklHX1BQQ182NEtfUEFHRVMKLQkJbmV3X3B0ZSA9IChuZXdfcHRlICYgfl9QQUdFX0hQVEVGTEFHUykgfCBfUEFHRV9IUFRFX1NVQjA7Ci0jZWxzZQotCQluZXdfcHRlID0gKG5ld19wdGUgJiB+X1BBR0VfSFBURUZMQUdTKSB8IF9QQUdFX0hBU0hQVEU7Ci0jZW5kaWYKLQkJLyogQWRkIGluIFdJTUcgYml0cyAqLwotCQlyZmxhZ3MgfD0gKG5ld19wdGUgJiAoX1BBR0VfV1JJVEVUSFJVIHwgX1BBR0VfTk9fQ0FDSEUgfAotCQkJCSAgICAgIF9QQUdFX0NPSEVSRU5UIHwgX1BBR0VfR1VBUkRFRCkpOwotCi0JCS8qIEluc2VydCBpbnRvIHRoZSBoYXNoIHRhYmxlLCBwcmltYXJ5IHNsb3QgKi8KLQkJc2xvdCA9IHBwY19tZC5ocHRlX2luc2VydChocHRlX2dyb3VwLCB2YSwgcGEsIHJmbGFncywgMCwKLQkJCQkJICBtbXVfcHNpemUsIHNzaXplKTsKLQotCQkvKiBQcmltYXJ5IGlzIGZ1bGwsIHRyeSB0aGUgc2Vjb25kYXJ5ICovCi0JCWlmICh1bmxpa2VseShzbG90ID09IC0xKSkgewotCQkJaHB0ZV9ncm91cCA9ICgofmhhc2ggJiBodGFiX2hhc2hfbWFzaykgKgotCQkJCSAgICAgIEhQVEVTX1BFUl9HUk9VUCkgJiB+MHg3VUw7IAotCQkJc2xvdCA9IHBwY19tZC5ocHRlX2luc2VydChocHRlX2dyb3VwLCB2YSwgcGEsIHJmbGFncywKLQkJCQkJCSAgSFBURV9WX1NFQ09OREFSWSwKLQkJCQkJCSAgbW11X3BzaXplLCBzc2l6ZSk7Ci0JCQlpZiAoc2xvdCA9PSAtMSkgewotCQkJCWlmIChtZnRiKCkgJiAweDEpCi0JCQkJCWhwdGVfZ3JvdXAgPSAoKGhhc2ggJiBodGFiX2hhc2hfbWFzaykgKgotCQkJCQkJICAgICAgSFBURVNfUEVSX0dST1VQKSZ+MHg3VUw7Ci0KLQkJCQlwcGNfbWQuaHB0ZV9yZW1vdmUoaHB0ZV9ncm91cCk7Ci0JCQkJZ290byByZXBlYXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0JCX0KLQotCQlpZiAodW5saWtlbHkoc2xvdCA9PSAtMikpCi0JCQlwYW5pYygiaGFzaF9odWdlX3BhZ2U6IHB0ZV9pbnNlcnQgZmFpbGVkXG4iKTsKLQotCQluZXdfcHRlIHw9IChzbG90IDw8IDEyKSAmIChfUEFHRV9GX1NFQ09ORCB8IF9QQUdFX0ZfR0lYKTsKLQl9Ci0KLQkvKgotCSAqIE5vIG5lZWQgdG8gdXNlIGxkYXJ4L3N0ZGN4IGhlcmUKLQkgKi8KLQkqcHRlcCA9IF9fcHRlKG5ld19wdGUgJiB+X1BBR0VfQlVTWSk7Ci0KLQllcnIgPSAwOwotCi0gb3V0OgotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBzZXRfaHVnZV9wc2l6ZShpbnQgcHNpemUpCi17CiAJLyogQ2hlY2sgdGhhdCBpdCBpcyBhIHBhZ2Ugc2l6ZSBzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlIGFuZAotCSAqIHRoYXQgaXQgZml0cyB3aXRoaW4gcGFnZXRhYmxlIGxpbWl0cy4gKi8KLQlpZiAobW11X3BzaXplX2RlZnNbcHNpemVdLnNoaWZ0ICYmCi0JCW1tdV9wc2l6ZV9kZWZzW3BzaXplXS5zaGlmdCA8IFNJRF9TSElGVF8xVCAmJgotCQkobW11X3BzaXplX2RlZnNbcHNpemVdLnNoaWZ0ID4gTUlOX0hVR0VQVEVfU0hJRlQgfHwKLQkJIG1tdV9wc2l6ZV9kZWZzW3BzaXplXS5zaGlmdCA9PSBQQUdFX1NISUZUXzY0SyB8fAotCQkgbW11X3BzaXplX2RlZnNbcHNpemVdLnNoaWZ0ID09IFBBR0VfU0hJRlRfMTZHKSkgewotCQkvKiBSZXR1cm4gaWYgaHVnZSBwYWdlIHNpemUgaGFzIGFscmVhZHkgYmVlbiBzZXR1cCBvciBpcyB0aGUKLQkJICogc2FtZSBhcyB0aGUgYmFzZSBwYWdlIHNpemUuICovCi0JCWlmIChtbXVfaHVnZV9wc2l6ZXNbcHNpemVdIHx8Ci0JCSAgIG1tdV9wc2l6ZV9kZWZzW3BzaXplXS5zaGlmdCA9PSBQQUdFX1NISUZUKQotCQkJcmV0dXJuOwotCQlpZiAoV0FSTl9PTihIVUdFUFRFX0NBQ0hFX05BTUUocHNpemUpID09IE5VTEwpKQotCQkJcmV0dXJuOwotCQlodWdldGxiX2FkZF9oc3RhdGUobW11X3BzaXplX2RlZnNbcHNpemVdLnNoaWZ0IC0gUEFHRV9TSElGVCk7CisJICogdGhhdCBpdCBmaXRzIHdpdGhpbiBwYWdldGFibGUgYW5kIHNsaWNlIGxpbWl0cy4gKi8KKwlpZiAoIWlzX3Bvd2VyX29mXzIoc2l6ZSkKKwkgICAgfHwgKHNoaWZ0ID4gU0xJQ0VfSElHSF9TSElGVCkgfHwgKHNoaWZ0IDw9IFBBR0VfU0hJRlQpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCQlzd2l0Y2ggKG1tdV9wc2l6ZV9kZWZzW3BzaXplXS5zaGlmdCkgewotCQljYXNlIFBBR0VfU0hJRlRfNjRLOgotCQkgICAgLyogV2Ugb25seSBhbGxvdyA2NGsgaHBhZ2VzIHdpdGggNGsgYmFzZSBwYWdlLAotCQkgICAgICogd2hpY2ggd2FzIGNoZWNrZWQgYWJvdmUsIGFuZCBhbHdheXMgcHV0IHRoZW0KLQkJICAgICAqIGF0IHRoZSBQTUQgKi8KLQkJICAgIGh1Z2VwdGVfc2hpZnRbcHNpemVdID0gUE1EX1NISUZUOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgUEFHRV9TSElGVF8xNk06Ci0JCSAgICAvKiAxNk0gcGFnZXMgY2FuIGJlIGF0IHR3byBkaWZmZXJlbnQgbGV2ZWxzCi0JCSAgICAgKiBvZiBwYWdlc3RhYmxlcyBiYXNlZCBvbiBiYXNlIHBhZ2Ugc2l6ZSAqLwotCQkgICAgaWYgKFBBR0VfU0hJRlQgPT0gUEFHRV9TSElGVF82NEspCi0JCQkgICAgaHVnZXB0ZV9zaGlmdFtwc2l6ZV0gPSBQTURfU0hJRlQ7Ci0JCSAgICBlbHNlIC8qIDRrIGJhc2UgcGFnZSAqLwotCQkJICAgIGh1Z2VwdGVfc2hpZnRbcHNpemVdID0gUFVEX1NISUZUOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgUEFHRV9TSElGVF8xNkc6Ci0JCSAgICAvKiAxNkcgcGFnZXMgYXJlIGFsd2F5cyBhdCBQR0QgbGV2ZWwgKi8KLQkJICAgIGh1Z2VwdGVfc2hpZnRbcHNpemVdID0gUEdESVJfU0hJRlQ7Ci0JCSAgICBicmVhazsKLQkJfQotCQlodWdlcHRlX3NoaWZ0W3BzaXplXSAtPSBtbXVfcHNpemVfZGVmc1twc2l6ZV0uc2hpZnQ7Ci0JfSBlbHNlCi0JCWh1Z2VwdGVfc2hpZnRbcHNpemVdID0gMDsKKwlpZiAoKG1tdV9wc2l6ZSA9IHNoaWZ0X3RvX21tdV9wc2l6ZShzaGlmdCkpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKyNpZmRlZiBDT05GSUdfU1BVX0ZTXzY0S19MUworCS8qIERpc2FibGUgc3VwcG9ydCBmb3IgNjRLIGh1Z2UgcGFnZXMgd2hlbiA2NEsgU1BVIGxvY2FsIHN0b3JlCisJICogc3VwcG9ydCBpcyBlbmFibGVkIGFzIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGNvbmZsaWN0cy4KKwkgKi8KKwlpZiAoc2hpZnQgPT0gUEFHRV9TSElGVF82NEspCisJCXJldHVybiAtRUlOVkFMOworI2VuZGlmIC8qIENPTkZJR19TUFVfRlNfNjRLX0xTICovCisKKwlCVUdfT04obW11X3BzaXplX2RlZnNbbW11X3BzaXplXS5zaGlmdCAhPSBzaGlmdCk7CisKKwkvKiBSZXR1cm4gaWYgaHVnZSBwYWdlIHNpemUgaGFzIGFscmVhZHkgYmVlbiBzZXR1cCAqLworCWlmIChzaXplX3RvX2hzdGF0ZShzaXplKSkKKwkJcmV0dXJuIDA7CisKKwlodWdldGxiX2FkZF9oc3RhdGUoc2hpZnQgLSBQQUdFX1NISUZUKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBodWdlcGFnZV9zZXR1cF9zeihjaGFyICpzdHIpCiB7CiAJdW5zaWduZWQgbG9uZyBsb25nIHNpemU7Ci0JaW50IG1tdV9wc2l6ZTsKLQlpbnQgc2hpZnQ7CiAKIAlzaXplID0gbWVtcGFyc2Uoc3RyLCAmc3RyKTsKIAotCXNoaWZ0ID0gX19mZnMoc2l6ZSk7Ci0JbW11X3BzaXplID0gc2hpZnRfdG9fbW11X3BzaXplKHNoaWZ0KTsKLQlpZiAobW11X3BzaXplID49IDAgJiYgbW11X3BzaXplX2RlZnNbbW11X3BzaXplXS5zaGlmdCkKLQkJc2V0X2h1Z2VfcHNpemUobW11X3BzaXplKTsKLQllbHNlCisJaWYgKGFkZF9odWdlX3BhZ2Vfc2l6ZShzaXplKSAhPSAwKQogCQlwcmludGsoS0VSTl9XQVJOSU5HICJJbnZhbGlkIGh1Z2UgcGFnZSBzaXplIHNwZWNpZmllZCglbGx1KVxuIiwgc2l6ZSk7CiAKIAlyZXR1cm4gMTsKQEAgLTc1Miw0MSArNTI2LDU1IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGh1Z2V0bGJwYWdlX2luaXQodm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgcHNpemU7CisJaW50IHBzaXplOwogCiAJaWYgKCFjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl8xNk1fUEFHRSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JLyogQWRkIHN1cHBvcnRlZCBodWdlIHBhZ2Ugc2l6ZXMuICBOZWVkIHRvIGNoYW5nZSBIVUdFX01BWF9IU1RBVEUKLQkgKiBhbmQgYWRqdXN0IFBURV9OT05DQUNIRV9OVU0gaWYgdGhlIG51bWJlciBvZiBzdXBwb3J0ZWQgaHVnZSBwYWdlCi0JICogc2l6ZXMgY2hhbmdlcy4KLQkgKi8KLQlzZXRfaHVnZV9wc2l6ZShNTVVfUEFHRV8xNk0pOwotCXNldF9odWdlX3BzaXplKE1NVV9QQUdFXzE2Ryk7Ci0KLQkvKiBUZW1wb3JhcmlseSBkaXNhYmxlIHN1cHBvcnQgZm9yIDY0SyBodWdlIHBhZ2VzIHdoZW4gNjRLIFNQVSBsb2NhbAotCSAqIHN0b3JlIHN1cHBvcnQgaXMgZW5hYmxlZCBhcyB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBjb25mbGljdHMuCi0JICovCi0jaWZuZGVmIENPTkZJR19TUFVfRlNfNjRLX0xTCi0Jc2V0X2h1Z2VfcHNpemUoTU1VX1BBR0VfNjRLKTsKLSNlbmRpZgotCiAJZm9yIChwc2l6ZSA9IDA7IHBzaXplIDwgTU1VX1BBR0VfQ09VTlQ7ICsrcHNpemUpIHsKLQkJaWYgKG1tdV9odWdlX3BzaXplc1twc2l6ZV0pIHsKLQkJCXBndGFibGVfY2FjaGVbSFVHRV9QR1RBQkxFX0lOREVYKHBzaXplKV0gPQotCQkJCWttZW1fY2FjaGVfY3JlYXRlKAotCQkJCQlIVUdFUFRFX0NBQ0hFX05BTUUocHNpemUpLAotCQkJCQlIVUdFUFRFX1RBQkxFX1NJWkUocHNpemUpLAotCQkJCQlIVUdFUFRFX1RBQkxFX1NJWkUocHNpemUpLAotCQkJCQkwLAotCQkJCQlOVUxMKTsKLQkJCWlmICghcGd0YWJsZV9jYWNoZVtIVUdFX1BHVEFCTEVfSU5ERVgocHNpemUpXSkKLQkJCQlwYW5pYygiaHVnZXRsYnBhZ2VfaW5pdCgpOiBjb3VsZCBub3QgY3JlYXRlICVzIlwKLQkJCQkgICAgICAiXG4iLCBIVUdFUFRFX0NBQ0hFX05BTUUocHNpemUpKTsKLQkJfQorCQl1bnNpZ25lZCBzaGlmdDsKKwkJdW5zaWduZWQgcGRzaGlmdDsKKworCQlpZiAoIW1tdV9wc2l6ZV9kZWZzW3BzaXplXS5zaGlmdCkKKwkJCWNvbnRpbnVlOworCisJCXNoaWZ0ID0gbW11X3BzaXplX3RvX3NoaWZ0KHBzaXplKTsKKworCQlpZiAoYWRkX2h1Z2VfcGFnZV9zaXplKDFVTEwgPDwgc2hpZnQpIDwgMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChzaGlmdCA8IFBNRF9TSElGVCkKKwkJCXBkc2hpZnQgPSBQTURfU0hJRlQ7CisJCWVsc2UgaWYgKHNoaWZ0IDwgUFVEX1NISUZUKQorCQkJcGRzaGlmdCA9IFBVRF9TSElGVDsKKwkJZWxzZQorCQkJcGRzaGlmdCA9IFBHRElSX1NISUZUOworCisJCXBndGFibGVfY2FjaGVfYWRkKHBkc2hpZnQgLSBzaGlmdCwgTlVMTCk7CisJCWlmICghUEdUX0NBQ0hFKHBkc2hpZnQgLSBzaGlmdCkpCisJCQlwYW5pYygiaHVnZXRsYnBhZ2VfaW5pdCgpOiBjb3VsZCBub3QgY3JlYXRlICIKKwkJCSAgICAgICJwZ3RhYmxlIGNhY2hlIGZvciAlZCBiaXQgcGFnZXNpemVcbiIsIHNoaWZ0KTsKIAl9CiAKKwkvKiBTZXQgZGVmYXVsdCBsYXJnZSBwYWdlIHNpemUuIEN1cnJlbnRseSwgd2UgcGljayAxNk0gb3IgMU0KKwkgKiBkZXBlbmRpbmcgb24gd2hhdCBpcyBhdmFpbGFibGUKKwkgKi8KKwlpZiAobW11X3BzaXplX2RlZnNbTU1VX1BBR0VfMTZNXS5zaGlmdCkKKwkJSFBBR0VfU0hJRlQgPSBtbXVfcHNpemVfZGVmc1tNTVVfUEFHRV8xNk1dLnNoaWZ0OworCWVsc2UgaWYgKG1tdV9wc2l6ZV9kZWZzW01NVV9QQUdFXzFNXS5zaGlmdCkKKwkJSFBBR0VfU0hJRlQgPSBtbXVfcHNpemVfZGVmc1tNTVVfUEFHRV8xTV0uc2hpZnQ7CisKIAlyZXR1cm4gMDsKIH0KIAogbW9kdWxlX2luaXQoaHVnZXRsYnBhZ2VfaW5pdCk7CisKK3ZvaWQgZmx1c2hfZGNhY2hlX2ljYWNoZV9odWdlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlpbnQgaTsKKworCUJVR19PTighUGFnZUNvbXBvdW5kKHBhZ2UpKTsKKworCWZvciAoaSA9IDA7IGkgPCAoMVVMIDw8IGNvbXBvdW5kX29yZGVyKHBhZ2UpKTsgaSsrKQorCQlfX2ZsdXNoX2RjYWNoZV9pY2FjaGUocGFnZV9hZGRyZXNzKHBhZ2UraSkpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2luaXRfNjQuYyBiL2FyY2gvcG93ZXJwYy9tbS9pbml0XzY0LmMKaW5kZXggMzM1YzU3OC4uNzc2ZjI4ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2luaXRfNjQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vaW5pdF82NC5jCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcG9pc29uLmg+CiAjaW5jbHVkZSA8bGludXgvbG1iLmg+CisjaW5jbHVkZSA8bGludXgvaHVnZXRsYi5oPgogCiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpAQCAtMTE5LDMwICsxMjAsNjMgQEAKIAltZW1zZXQoYWRkciwgMCwgUE1EX1RBQkxFX1NJWkUpOwogfQogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBndGFibGVfY2FjaGVfc2l6ZVsyXSA9IHsKLQlQR0RfVEFCTEVfU0laRSwgUE1EX1RBQkxFX1NJWkUKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqcGd0YWJsZV9jYWNoZV9uYW1lW0FSUkFZX1NJWkUocGd0YWJsZV9jYWNoZV9zaXplKV0gPSB7Ci0jaWZkZWYgQ09ORklHX1BQQ182NEtfUEFHRVMKLQkicGdkX2NhY2hlIiwgInBtZF9jYWNoZSIsCi0jZWxzZQotCSJwZ2RfY2FjaGUiLCAicHVkX3BtZF9jYWNoZSIsCi0jZW5kaWYgLyogQ09ORklHX1BQQ182NEtfUEFHRVMgKi8KLX07CitzdHJ1Y3Qga21lbV9jYWNoZSAqcGd0YWJsZV9jYWNoZVtNQVhfUEdUQUJMRV9JTkRFWF9TSVpFXTsKIAotI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKLS8qIEh1Z2VwYWdlcyBuZWVkIGFuIGV4dHJhIGNhY2hlIHBlciBodWdlcGFnZXNpemUsIGluaXRpYWxpemVkIGluCi0gKiBodWdldGxicGFnZS5jLiAgV2UgY2FuJ3QgcHV0IGludG8gdGhlIHRhYmxlcyBhYm92ZSwgYmVjYXVzZSBIUEFHRV9TSElGVAotICogaXMgbm90IGNvbXBpbGUgdGltZSBjb25zdGFudC4gKi8KLXN0cnVjdCBrbWVtX2NhY2hlICpwZ3RhYmxlX2NhY2hlW0FSUkFZX1NJWkUocGd0YWJsZV9jYWNoZV9zaXplKStNTVVfUEFHRV9DT1VOVF07Ci0jZWxzZQotc3RydWN0IGttZW1fY2FjaGUgKnBndGFibGVfY2FjaGVbQVJSQVlfU0laRShwZ3RhYmxlX2NhY2hlX3NpemUpXTsKLSNlbmRpZgorLyoKKyAqIENyZWF0ZSBhIGttZW1fY2FjaGUoKSBmb3IgcGFnZXRhYmxlcy4gIFRoaXMgaXMgbm90IHVzZWQgZm9yIFBURQorICogcGFnZXMgLSB0aGV5J3JlIGxpbmtlZCB0byBzdHJ1Y3QgcGFnZSwgY29tZSBmcm9tIHRoZSBub3JtYWwgZnJlZQorICogcGFnZXMgcG9vbCBhbmQgaGF2ZSBhIGRpZmZlcmVudCBlbnRyeSBzaXplIChzZWUgcmVhbF9wdGVfdCkgdG8KKyAqIGV2ZXJ5dGhpbmcgZWxzZS4gIENhY2hlcyBjcmVhdGVkIGJ5IHRoaXMgZnVuY3Rpb24gYXJlIHVzZWQgZm9yIGFsbAorICogdGhlIGhpZ2hlciBsZXZlbCBwYWdldGFibGVzLCBhbmQgZm9yIGh1Z2VwYWdlIHBhZ2V0YWJsZXMuCisgKi8KK3ZvaWQgcGd0YWJsZV9jYWNoZV9hZGQodW5zaWduZWQgc2hpZnQsIHZvaWQgKCpjdG9yKSh2b2lkICopKQoreworCWNoYXIgKm5hbWU7CisJdW5zaWduZWQgbG9uZyB0YWJsZV9zaXplID0gc2l6ZW9mKHZvaWQgKikgPDwgc2hpZnQ7CisJdW5zaWduZWQgbG9uZyBhbGlnbiA9IHRhYmxlX3NpemU7CisKKwkvKiBXaGVuIGJhdGNoaW5nIHBndGFibGUgcG9pbnRlcnMgZm9yIFJDVSBmcmVlaW5nLCB3ZSBzdG9yZQorCSAqIHRoZSBpbmRleCBzaXplIGluIHRoZSBsb3cgYml0cy4gIFRhYmxlIGFsaWdubWVudCBtdXN0IGJlCisJICogYmlnIGVub3VnaCB0byBmaXQgaXQuCisJICoKKwkgKiBMaWtld2lzZSwgaHVnZWFwZ2UgcGFnZXRhYmxlIHBvaW50ZXJzIGNvbnRhaW4gYSAoZGlmZmVyZW50KQorCSAqIHNoaWZ0IHZhbHVlIGluIHRoZSBsb3cgYml0cy4gIEFsbCB0YWJsZXMgbXVzdCBiZSBhbGlnbmVkIHNvCisJICogYXMgdG8gbGVhdmUgZW5vdWdoIDAgYml0cyBpbiB0aGUgYWRkcmVzcyB0byBjb250YWluIGl0LiAqLworCXVuc2lnbmVkIGxvbmcgbWluYWxpZ24gPSBtYXgoTUFYX1BHVEFCTEVfSU5ERVhfU0laRSArIDEsCisJCQkJICAgICBIVUdFUERfU0hJRlRfTUFTSyArIDEpOworCXN0cnVjdCBrbWVtX2NhY2hlICpuZXc7CisKKwkvKiBJdCB3b3VsZCBiZSBuaWNlIGlmIHRoaXMgd2FzIGEgQlVJTERfQlVHX09OKCksIGJ1dCBhdCB0aGUKKwkgKiBtb21lbnQsIGdjYyBkb2Vzbid0IHNlZW0gdG8gcmVjb2duaXplIGlzX3Bvd2VyX29mXzIgYXMgYQorCSAqIGNvbnN0YW50IGV4cHJlc3Npb24sIHNvIHNvIG11Y2ggZm9yIHRoYXQuICovCisJQlVHX09OKCFpc19wb3dlcl9vZl8yKG1pbmFsaWduKSk7CisJQlVHX09OKChzaGlmdCA8IDEpIHx8IChzaGlmdCA+IE1BWF9QR1RBQkxFX0lOREVYX1NJWkUpKTsKKworCWlmIChQR1RfQ0FDSEUoc2hpZnQpKQorCQlyZXR1cm47IC8qIEFscmVhZHkgaGF2ZSBhIGNhY2hlIG9mIHRoaXMgc2l6ZSAqLworCisJYWxpZ24gPSBtYXhfdCh1bnNpZ25lZCBsb25nLCBhbGlnbiwgbWluYWxpZ24pOworCW5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgInBndGFibGUtMl4lZCIsIHNoaWZ0KTsKKwluZXcgPSBrbWVtX2NhY2hlX2NyZWF0ZShuYW1lLCB0YWJsZV9zaXplLCBhbGlnbiwgMCwgY3Rvcik7CisJUEdUX0NBQ0hFKHNoaWZ0KSA9IG5ldzsKKworCXByX2RlYnVnKCJBbGxvY2F0ZWQgcGd0YWJsZSBjYWNoZSBmb3Igb3JkZXIgJWRcbiIsIHNoaWZ0KTsKK30KKwogCiB2b2lkIHBndGFibGVfY2FjaGVfaW5pdCh2b2lkKQogewotCXBndGFibGVfY2FjaGVbMF0gPSBrbWVtX2NhY2hlX2NyZWF0ZShwZ3RhYmxlX2NhY2hlX25hbWVbMF0sIFBHRF9UQUJMRV9TSVpFLCBQR0RfVEFCTEVfU0laRSwgU0xBQl9QQU5JQywgcGdkX2N0b3IpOwotCXBndGFibGVfY2FjaGVbMV0gPSBrbWVtX2NhY2hlX2NyZWF0ZShwZ3RhYmxlX2NhY2hlX25hbWVbMV0sIFBNRF9UQUJMRV9TSVpFLCBQTURfVEFCTEVfU0laRSwgU0xBQl9QQU5JQywgcG1kX2N0b3IpOworCXBndGFibGVfY2FjaGVfYWRkKFBHRF9JTkRFWF9TSVpFLCBwZ2RfY3Rvcik7CisJcGd0YWJsZV9jYWNoZV9hZGQoUE1EX0lOREVYX1NJWkUsIHBtZF9jdG9yKTsKKwlpZiAoIVBHVF9DQUNIRShQR0RfSU5ERVhfU0laRSkgfHwgIVBHVF9DQUNIRShQTURfSU5ERVhfU0laRSkpCisJCXBhbmljKCJDb3VsZG4ndCBhbGxvY2F0ZSBwZ3RhYmxlIGNhY2hlcyIpOworCisJLyogSW4gYWxsIGN1cnJlbnQgY29uZmlncywgd2hlbiB0aGUgUFVEIGluZGV4IGV4aXN0cyBpdCdzIHRoZQorCSAqIHNhbWUgc2l6ZSBhcyBlaXRoZXIgdGhlIHBnZCBvciBwbWQgaW5kZXguICBWZXJpZnkgdGhhdCB0aGUKKwkgKiBpbml0aWFsaXphdGlvbiBhYm92ZSBoYXMgYWxzbyBjcmVhdGVkIGEgUFVEIGNhY2hlLiAgVGhpcworCSAqIHdpbGwgbmVlZCByZS1leGFtaW5pYXRpb24gaWYgd2UgYWRkIG5ldyBwb3NzaWJpbGl0aWVzIGZvcgorCSAqIHRoZSBwYWdldGFibGUgbGF5b3V0LiAqLworCUJVR19PTihQVURfSU5ERVhfU0laRSAmJiAhUEdUX0NBQ0hFKFBVRF9JTkRFWF9TSVpFKSk7CiB9CiAKICNpZmRlZiBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9tZW0uYyBiL2FyY2gvcG93ZXJwYy9tbS9tZW0uYwppbmRleCA1OTczNjMxLi5iOWIxNTI1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vbWVtLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL21lbS5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9sbWIuaD4KKyNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CiAKICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CkBAIC00MTcsMTggKzQxOCwyNiBAQAogCiB2b2lkIGZsdXNoX2RjYWNoZV9pY2FjaGVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKKyNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFCisJaWYgKFBhZ2VDb21wb3VuZChwYWdlKSkgeworCQlmbHVzaF9kY2FjaGVfaWNhY2hlX2h1Z2VwYWdlKHBhZ2UpOworCQlyZXR1cm47CisJfQorI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JPT0tFCi0Jdm9pZCAqc3RhcnQgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9QUENfU1lOQ19JQ0FDSEUpOwotCV9fZmx1c2hfZGNhY2hlX2ljYWNoZShzdGFydCk7Ci0Ja3VubWFwX2F0b21pYyhzdGFydCwgS01fUFBDX1NZTkNfSUNBQ0hFKTsKKwl7CisJCXZvaWQgKnN0YXJ0ID0ga21hcF9hdG9taWMocGFnZSwgS01fUFBDX1NZTkNfSUNBQ0hFKTsKKwkJX19mbHVzaF9kY2FjaGVfaWNhY2hlKHN0YXJ0KTsKKwkJa3VubWFwX2F0b21pYyhzdGFydCwgS01fUFBDX1NZTkNfSUNBQ0hFKTsKKwl9CiAjZWxpZiBkZWZpbmVkKENPTkZJR184eHgpIHx8IGRlZmluZWQoQ09ORklHX1BQQzY0KQogCS8qIE9uIDh4eCB0aGVyZSBpcyBubyBuZWVkIHRvIGttYXAgc2luY2UgaGlnaG1lbSBpcyBub3Qgc3VwcG9ydGVkICovCiAJX19mbHVzaF9kY2FjaGVfaWNhY2hlKHBhZ2VfYWRkcmVzcyhwYWdlKSk7IAogI2Vsc2UKIAlfX2ZsdXNoX2RjYWNoZV9pY2FjaGVfcGh5cyhwYWdlX3RvX3BmbihwYWdlKSA8PCBQQUdFX1NISUZUKTsKICNlbmRpZgotCiB9CisKIHZvaWQgY2xlYXJfdXNlcl9wYWdlKHZvaWQgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHN0cnVjdCBwYWdlICpwZykKIHsKIAljbGVhcl9wYWdlKHBhZ2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0X2hhc2g2NC5jIGIvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0X2hhc2g2NC5jCmluZGV4IGRiZWI4NmEuLmI5MTBkMzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9tbXVfY29udGV4dF9oYXNoNjQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vbW11X2NvbnRleHRfaGFzaDY0LmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaWRyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KIApAQCAtMzIsNyArMzMsNyBAQAogI2RlZmluZSBOT19DT05URVhUCTAKICNkZWZpbmUgTUFYX0NPTlRFWFQJKCgxVUwgPDwgMTkpIC0gMSkKIAotaW50IGluaXRfbmV3X2NvbnRleHQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoraW50IF9faW5pdF9uZXdfY29udGV4dCh2b2lkKQogewogCWludCBpbmRleDsKIAlpbnQgZXJyOwpAQCAtNTcsMjIgKzU4LDQxIEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCXJldHVybiBpbmRleDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9faW5pdF9uZXdfY29udGV4dCk7CisKK2ludCBpbml0X25ld19jb250ZXh0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlpbnQgaW5kZXg7CisKKwlpbmRleCA9IF9faW5pdF9uZXdfY29udGV4dCgpOworCWlmIChpbmRleCA8IDApCisJCXJldHVybiBpbmRleDsKKwogCS8qIFRoZSBvbGQgY29kZSB3b3VsZCByZS1wcm9tb3RlIG9uIGZvcmssIHdlIGRvbid0IGRvIHRoYXQKIAkgKiB3aGVuIHVzaW5nIHNsaWNlcyBhcyBpdCBjb3VsZCBjYXVzZSBwcm9ibGVtIHByb21vdGluZyBzbGljZXMKIAkgKiB0aGF0IGhhdmUgYmVlbiBmb3JjZWQgZG93biB0byA0SwogCSAqLwogCWlmIChzbGljZV9tbV9uZXdfY29udGV4dChtbSkpCiAJCXNsaWNlX3NldF91c2VyX3BzaXplKG1tLCBtbXVfdmlydHVhbF9wc2l6ZSk7CisJc3VicGFnZV9wcm90X2luaXRfbmV3X2NvbnRleHQobW0pOwogCW1tLT5jb250ZXh0LmlkID0gaW5kZXg7CiAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBkZXN0cm95X2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit2b2lkIF9fZGVzdHJveV9jb250ZXh0KGludCBjb250ZXh0X2lkKQogewogCXNwaW5fbG9jaygmbW11X2NvbnRleHRfbG9jayk7Ci0JaWRyX3JlbW92ZSgmbW11X2NvbnRleHRfaWRyLCBtbS0+Y29udGV4dC5pZCk7CisJaWRyX3JlbW92ZSgmbW11X2NvbnRleHRfaWRyLCBjb250ZXh0X2lkKTsKIAlzcGluX3VubG9jaygmbW11X2NvbnRleHRfbG9jayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChfX2Rlc3Ryb3lfY29udGV4dCk7CiAKK3ZvaWQgZGVzdHJveV9jb250ZXh0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCV9fZGVzdHJveV9jb250ZXh0KG1tLT5jb250ZXh0LmlkKTsKKwlzdWJwYWdlX3Byb3RfZnJlZShtbSk7CiAJbW0tPmNvbnRleHQuaWQgPSBOT19DT05URVhUOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL21tdV9kZWNsLmggYi9hcmNoL3Bvd2VycGMvbW0vbW11X2RlY2wuaAppbmRleCBkMmU1MzIxLi5lMjdhOTkwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vbW11X2RlY2wuaAorKysgYi9hcmNoL3Bvd2VycGMvbW0vbW11X2RlY2wuaApAQCAtOTgsMjEgKzk4LDEwIEBACiAKICNpZmRlZiBDT05GSUdfUFBDMzIKIAotc3RydWN0IHRsYmNhbSB7Ci0JdTMyCU1BUzA7Ci0JdTMyCU1BUzE7Ci0JdTMyCU1BUzI7Ci0JdTMyCU1BUzM7Ci0JdTMyCU1BUzc7Ci19OwotCiBleHRlcm4gdm9pZCBtYXBpbl9yYW0odm9pZCk7CiBleHRlcm4gaW50IG1hcF9wYWdlKHVuc2lnbmVkIGxvbmcgdmEsIHBoeXNfYWRkcl90IHBhLCBpbnQgZmxhZ3MpOwogZXh0ZXJuIHZvaWQgc2V0YmF0KGludCBpbmRleCwgdW5zaWduZWQgbG9uZyB2aXJ0LCBwaHlzX2FkZHJfdCBwaHlzLAogCQkgICB1bnNpZ25lZCBpbnQgc2l6ZSwgaW50IGZsYWdzKTsKLWV4dGVybiB2b2lkIHNldHRsYmNhbShpbnQgaW5kZXgsIHVuc2lnbmVkIGxvbmcgdmlydCwgcGh5c19hZGRyX3QgcGh5cywKLQkJICAgICAgdW5zaWduZWQgaW50IHNpemUsIGludCBmbGFncywgdW5zaWduZWQgaW50IHBpZCk7Ci1leHRlcm4gdm9pZCBpbnZhbGlkYXRlX3RsYmNhbV9lbnRyeShpbnQgaW5kZXgpOwogCiBleHRlcm4gaW50IF9fbWFwX3dpdGhvdXRfYmF0czsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGlvcmVtYXBfYmFzZTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlLmMgYi9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZS5jCmluZGV4IDUzMDQwOTMuLjk5ZGY2OTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3BndGFibGUuYwpAQCAtNDksMTIgKzQ5LDEyIEBACiB7CiAJc3RydWN0IHJjdV9oZWFkCXJjdTsKIAl1bnNpZ25lZCBpbnQJaW5kZXg7Ci0JcGd0YWJsZV9mcmVlX3QJdGFibGVzWzBdOworCXVuc2lnbmVkIGxvbmcJdGFibGVzWzBdOwogfTsKIAogI2RlZmluZSBQVEVfRlJFRUxJU1RfU0laRSBcCiAJKChQQUdFX1NJWkUgLSBzaXplb2Yoc3RydWN0IHB0ZV9mcmVlbGlzdF9iYXRjaCkpIFwKLQkgIC8gc2l6ZW9mKHBndGFibGVfZnJlZV90KSkKKwkgIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQogCiBzdGF0aWMgdm9pZCBwdGVfZnJlZV9zbXBfc3luYyh2b2lkICphcmcpCiB7CkBAIC02NCwxMyArNjQsMTMgQEAKIC8qIFRoaXMgaXMgb25seSBjYWxsZWQgd2hlbiB3ZSBhcmUgY3JpdGljYWxseSBvdXQgb2YgbWVtb3J5CiAgKiAoYW5kIGZhaWwgdG8gZ2V0IGEgcGFnZSBpbiBwdGVfZnJlZV90bGIpLgogICovCi1zdGF0aWMgdm9pZCBwZ3RhYmxlX2ZyZWVfbm93KHBndGFibGVfZnJlZV90IHBnZikKK3N0YXRpYyB2b2lkIHBndGFibGVfZnJlZV9ub3codm9pZCAqdGFibGUsIHVuc2lnbmVkIHNoaWZ0KQogewogCXB0ZV9mcmVlbGlzdF9mb3JjZWRfZnJlZSsrOwogCiAJc21wX2NhbGxfZnVuY3Rpb24ocHRlX2ZyZWVfc21wX3N5bmMsIE5VTEwsIDEpOwogCi0JcGd0YWJsZV9mcmVlKHBnZik7CisJcGd0YWJsZV9mcmVlKHRhYmxlLCBzaGlmdCk7CiB9CiAKIHN0YXRpYyB2b2lkIHB0ZV9mcmVlX3JjdV9jYWxsYmFjayhzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCkBAIC03OSw4ICs3OSwxMiBAQAogCQljb250YWluZXJfb2YoaGVhZCwgc3RydWN0IHB0ZV9mcmVlbGlzdF9iYXRjaCwgcmN1KTsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBiYXRjaC0+aW5kZXg7IGkrKykKLQkJcGd0YWJsZV9mcmVlKGJhdGNoLT50YWJsZXNbaV0pOworCWZvciAoaSA9IDA7IGkgPCBiYXRjaC0+aW5kZXg7IGkrKykgeworCQl2b2lkICp0YWJsZSA9ICh2b2lkICopKGJhdGNoLT50YWJsZXNbaV0gJiB+TUFYX1BHVEFCTEVfSU5ERVhfU0laRSk7CisJCXVuc2lnbmVkIHNoaWZ0ID0gYmF0Y2gtPnRhYmxlc1tpXSAmIE1BWF9QR1RBQkxFX0lOREVYX1NJWkU7CisKKwkJcGd0YWJsZV9mcmVlKHRhYmxlLCBzaGlmdCk7CisJfQogCiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWJhdGNoKTsKIH0KQEAgLTkxLDI1ICs5NSwyOCBAQAogCWNhbGxfcmN1KCZiYXRjaC0+cmN1LCBwdGVfZnJlZV9yY3VfY2FsbGJhY2spOwogfQogCi12b2lkIHBndGFibGVfZnJlZV90bGIoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgcGd0YWJsZV9mcmVlX3QgcGdmKQordm9pZCBwZ3RhYmxlX2ZyZWVfdGxiKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIHZvaWQgKnRhYmxlLCB1bnNpZ25lZCBzaGlmdCkKIHsKIAkvKiBUaGlzIGlzIHNhZmUgc2luY2UgdGxiX2dhdGhlcl9tbXUgaGFzIGRpc2FibGVkIHByZWVtcHRpb24gKi8KIAlzdHJ1Y3QgcHRlX2ZyZWVsaXN0X2JhdGNoICoqYmF0Y2hwID0gJl9fZ2V0X2NwdV92YXIocHRlX2ZyZWVsaXN0X2N1cik7CisJdW5zaWduZWQgbG9uZyBwZ2Y7CiAKIAlpZiAoYXRvbWljX3JlYWQoJnRsYi0+bW0tPm1tX3VzZXJzKSA8IDIgfHwKIAkgICAgY3B1bWFza19lcXVhbChtbV9jcHVtYXNrKHRsYi0+bW0pLCBjcHVtYXNrX29mKHNtcF9wcm9jZXNzb3JfaWQoKSkpKXsKLQkJcGd0YWJsZV9mcmVlKHBnZik7CisJCXBndGFibGVfZnJlZSh0YWJsZSwgc2hpZnQpOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKCpiYXRjaHAgPT0gTlVMTCkgewogCQkqYmF0Y2hwID0gKHN0cnVjdCBwdGVfZnJlZWxpc3RfYmF0Y2ggKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0FUT01JQyk7CiAJCWlmICgqYmF0Y2hwID09IE5VTEwpIHsKLQkJCXBndGFibGVfZnJlZV9ub3cocGdmKTsKKwkJCXBndGFibGVfZnJlZV9ub3codGFibGUsIHNoaWZ0KTsKIAkJCXJldHVybjsKIAkJfQogCQkoKmJhdGNocCktPmluZGV4ID0gMDsKIAl9CisJQlVHX09OKHNoaWZ0ID4gTUFYX1BHVEFCTEVfSU5ERVhfU0laRSk7CisJcGdmID0gKHVuc2lnbmVkIGxvbmcpdGFibGUgfCBzaGlmdDsKIAkoKmJhdGNocCktPnRhYmxlc1soKmJhdGNocCktPmluZGV4KytdID0gcGdmOwogCWlmICgoKmJhdGNocCktPmluZGV4ID09IFBURV9GUkVFTElTVF9TSVpFKSB7CiAJCXB0ZV9mcmVlX3N1Ym1pdCgqYmF0Y2hwKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9zdWJwYWdlLXByb3QuYyBiL2FyY2gvcG93ZXJwYy9tbS9zdWJwYWdlLXByb3QuYwppbmRleCA0Y2FmYzBjLi5hMDQwYjgxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vc3VicGFnZS1wcm90LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3N1YnBhZ2UtcHJvdC5jCkBAIC0yNCw5ICsyNCw5IEBACiAgKiBBbHNvIG1ha2VzIHN1cmUgdGhhdCB0aGUgc3VicGFnZV9wcm90X3RhYmxlIHN0cnVjdHVyZSBpcwogICogcmVpbml0aWFsaXplZCBmb3IgdGhlIG5leHQgdXNlci4KICAqLwotdm9pZCBzdWJwYWdlX3Byb3RfZnJlZShwZ2RfdCAqcGdkKQordm9pZCBzdWJwYWdlX3Byb3RfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKLQlzdHJ1Y3Qgc3VicGFnZV9wcm90X3RhYmxlICpzcHQgPSBwZ2Rfc3VicGFnZV9wcm90KHBnZCk7CisJc3RydWN0IHN1YnBhZ2VfcHJvdF90YWJsZSAqc3B0ID0gJm1tLT5jb250ZXh0LnNwdDsKIAl1bnNpZ25lZCBsb25nIGksIGosIGFkZHI7CiAJdTMyICoqcDsKIApAQCAtNTEsNiArNTEsMTMgQEAKIAlzcHQtPm1heGFkZHIgPSAwOwogfQogCit2b2lkIHN1YnBhZ2VfcHJvdF9pbml0X25ld19jb250ZXh0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXN0cnVjdCBzdWJwYWdlX3Byb3RfdGFibGUgKnNwdCA9ICZtbS0+Y29udGV4dC5zcHQ7CisKKwltZW1zZXQoc3B0LCAwLCBzaXplb2YoKnNwdCkpOworfQorCiBzdGF0aWMgdm9pZCBocHRlX2ZsdXNoX3JhbmdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkgICAgIGludCBucGFnZXMpCiB7CkBAIC04Nyw3ICs5NCw3IEBACiBzdGF0aWMgdm9pZCBzdWJwYWdlX3Byb3RfY2xlYXIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbikKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOwotCXN0cnVjdCBzdWJwYWdlX3Byb3RfdGFibGUgKnNwdCA9IHBnZF9zdWJwYWdlX3Byb3QobW0tPnBnZCk7CisJc3RydWN0IHN1YnBhZ2VfcHJvdF90YWJsZSAqc3B0ID0gJm1tLT5jb250ZXh0LnNwdDsKIAl1MzIgKipzcG0sICpzcHA7CiAJaW50IGksIG53OwogCXVuc2lnbmVkIGxvbmcgbmV4dCwgbGltaXQ7CkBAIC0xMzYsNyArMTQzLDcgQEAKIGxvbmcgc3lzX3N1YnBhZ2VfcHJvdCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCB1MzIgX191c2VyICptYXApCiB7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKLQlzdHJ1Y3Qgc3VicGFnZV9wcm90X3RhYmxlICpzcHQgPSBwZ2Rfc3VicGFnZV9wcm90KG1tLT5wZ2QpOworCXN0cnVjdCBzdWJwYWdlX3Byb3RfdGFibGUgKnNwdCA9ICZtbS0+Y29udGV4dC5zcHQ7CiAJdTMyICoqc3BtLCAqc3BwOwogCWludCBpLCBudzsKIAl1bnNpZ25lZCBsb25nIG5leHQsIGxpbWl0OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL3RsYl9oYXNoNjQuYyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfaGFzaDY0LmMKaW5kZXggMmIyZjM1Zi4uMjgyZDkzMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3RsYl9oYXNoNjQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vdGxiX2hhc2g2NC5jCkBAIC01MywxMSArNTMsNiBAQAogCiAJaSA9IGJhdGNoLT5pbmRleDsKIAotCS8qIFdlIG1hc2sgdGhlIGFkZHJlc3MgZm9yIHRoZSBiYXNlIHBhZ2Ugc2l6ZS4gSHVnZSBwYWdlcyB3aWxsCi0JICogaGF2ZSBhcHBsaWVkIHRoZWlyIG93biBtYXNraW5nIGFscmVhZHkKLQkgKi8KLQlhZGRyICY9IFBBR0VfTUFTSzsKLQogCS8qIEdldCBwYWdlIHNpemUgKG1heWJlIG1vdmUgYmFjayB0byBjYWxsZXIpLgogCSAqCiAJICogTk9URTogd2hlbiB1c2luZyBzcGVjaWFsIDY0SyBtYXBwaW5ncyBpbiA0SyBlbnZpcm9ubWVudCBsaWtlCkBAIC03NSw2ICs3MCw5IEBACiAJfSBlbHNlCiAJCXBzaXplID0gcHRlX3BhZ2VzaXplX2luZGV4KG1tLCBhZGRyLCBwdGUpOwogCisJLyogTWFzayB0aGUgYWRkcmVzcyBmb3IgdGhlIGNvcnJlY3QgcGFnZSBzaXplICovCisJYWRkciAmPSB+KCgxVUwgPDwgbW11X3BzaXplX2RlZnNbcHNpemVdLnNoaWZ0KSAtIDEpOworCiAJLyogQnVpbGQgZnVsbCB2YWRkciAqLwogCWlmICghaXNfa2VybmVsX2FkZHIoYWRkcikpIHsKIAkJc3NpemUgPSB1c2VyX3NlZ21lbnRfc2l6ZShhZGRyKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9tcGM1MTIxX2Fkc19jcGxkLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvbXBjNTEyMV9hZHNfY3BsZC5jCmluZGV4IGE2Y2U4MDUuLmRhOWIyMGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9tcGM1MTIxX2Fkc19jcGxkLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L21wYzUxMjFfYWRzX2NwbGQuYwpAQCAtNzksNyArNzksNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGNwbGRfcGljID0gewotCS50eXBlbmFtZSA9ICIgQ1BMRCBQSUMgIiwKKwkubmFtZSA9ICIgQ1BMRCBQSUMgIiwKIAkubWFzayA9IGNwbGRfbWFza19pcnEsCiAJLmFjayA9IGNwbGRfbWFza19pcnEsCiAJLnVubWFzayA9IGNwbGRfdW5tYXNrX2lycSwKQEAgLTEzMiw3ICsxMzIsNyBAQAogY3BsZF9waWNfaG9zdF9tYXAoc3RydWN0IGlycV9ob3N0ICpoLCB1bnNpZ25lZCBpbnQgdmlycSwKIAkJCSAgICAgaXJxX2h3X251bWJlcl90IGh3KQogewotCWdldF9pcnFfZGVzYyh2aXJxKS0+c3RhdHVzIHw9IElSUV9MRVZFTDsKKwlpcnFfdG9fZGVzYyh2aXJxKS0+c3RhdHVzIHw9IElSUV9MRVZFTDsKIAlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIodmlycSwgJmNwbGRfcGljLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L0tjb25maWcKaW5kZXggOGI4ZTk1Ni4uNDdlYTFiZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L0tjb25maWcKQEAgLTYyLDMgKzYyLDggQEAKIAlzZWxlY3QgR0VORVJJQ19HUElPCiAJaGVscAogCSAgRW5hYmxlIGdwaW9saWIgc3VwcG9ydCBmb3IgbXBjNTIwMCBiYXNlZCBib2FyZHMKKworY29uZmlnIFBQQ19NUEM1MjAwX0xQQkZJRk8KKwl0cmlzdGF0ZSAiTVBDNTIwMCBMb2NhbFBsdXMgYnVzIEZJRk8gZHJpdmVyIgorCWRlcGVuZHMgb24gUFBDX01QQzUyeHgKKwlzZWxlY3QgUFBDX0JFU1RDT01NX0dFTl9CRApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L01ha2VmaWxlCmluZGV4IGJmZDRmNTIuLjJiYzhjZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvTWFrZWZpbGUKQEAgLTE1LDMgKzE1LDQgQEAKIGVuZGlmCiAKIG9iai0kKENPTkZJR19QUENfTVBDNTIwMF9HUElPKQkrPSBtcGM1Mnh4X2dwaW8ubworb2JqLSQoQ09ORklHX1BQQ19NUEM1MjAwX0xQQkZJRk8pCSs9IG1wYzUyeHhfbHBiZmlmby5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbWVkaWE1MjAwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbWVkaWE1MjAwLmMKaW5kZXggNjhlNGYxNi4uY2MwYzg1NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21lZGlhNTIwMC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tZWRpYTUyMDAuYwpAQCAtNzQsNyArNzQsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIG1lZGlhNTIwMF9pcnFfY2hpcCA9IHsKLQkudHlwZW5hbWUgPSAiTWVkaWE1MjAwIEZQR0EiLAorCS5uYW1lID0gIk1lZGlhNTIwMCBGUEdBIiwKIAkudW5tYXNrID0gbWVkaWE1MjAwX2lycV91bm1hc2ssCiAJLm1hc2sgPSBtZWRpYTUyMDBfaXJxX21hc2ssCiAJLm1hc2tfYWNrID0gbWVkaWE1MjAwX2lycV9tYXNrLApAQCAtMTE0LDcgKzExNCw3IEBACiBzdGF0aWMgaW50IG1lZGlhNTIwMF9pcnFfbWFwKHN0cnVjdCBpcnFfaG9zdCAqaCwgdW5zaWduZWQgaW50IHZpcnEsCiAJCQkgICAgIGlycV9od19udW1iZXJfdCBodykKIHsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBnZXRfaXJxX2Rlc2ModmlycSk7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2ModmlycSk7CiAKIAlwcl9kZWJ1ZygiJXM6IGg9JXAsIHZpcnE9JWksIGh3aXJxPSVpXG4iLCBfX2Z1bmNfXywgaCwgdmlycSwgKGludClodyk7CiAJc2V0X2lycV9jaGlwX2RhdGEodmlycSwgJm1lZGlhNTIwMF9pcnEpOwpAQCAtMTI3LDcgKzEyNyw3IEBACiB9CiAKIHN0YXRpYyBpbnQgbWVkaWE1MjAwX2lycV94bGF0ZShzdHJ1Y3QgaXJxX2hvc3QgKmgsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqY3QsCi0JCQkJIHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUsCisJCQkJIGNvbnN0IHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUsCiAJCQkJIGlycV9od19udW1iZXJfdCAqb3V0X2h3aXJxLAogCQkJCSB1bnNpZ25lZCBpbnQgKm91dF9mbGFncykKIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X2dwdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfZ3B0LmMKaW5kZXggYmZiY2Q0MS4uNmY4ZWJlMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfZ3B0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfZ3B0LmMKQEAgLTE2LDggKzE2LDE0IEBACiAgKiBvdXRwdXQgc2lnbmFscyBvciBtZWFzdXJlIGlucHV0IHNpZ25hbHMuCiAgKgogICogVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIEdQSU8gYW5kIElSUSBjb250cm9sbGVyIGZ1bmN0aW9ucyBvZiB0aGUgR1BUCi0gKiBkZXZpY2UuICBUaW1lciBmdW5jdGlvbnMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkLCBub3IgaXMgdGhlIHdhdGNoZG9nCi0gKiB0aW1lci4KKyAqIGRldmljZS4gIFRpbWVyIGZ1bmN0aW9ucyBhcmUgbm90IHlldCBzdXBwb3J0ZWQuCisgKgorICogVGhlIHRpbWVyIGdwdDAgY2FuIGJlIHVzZWQgYXMgd2F0Y2hkb2cgKHdkdCkuICBJZiB0aGUgd2R0IG1vZGUgaXMgdXNlZCwKKyAqIHRoaXMgcHJldmVudHMgdGhlIHVzZSBvZiBhbnkgZ3B0MCBncHQgZnVuY3Rpb24gKGkuZS4gdGhleSB3aWxsIGZhaWwgd2l0aAorICogLUVCVVNZKS4gIFRodXMsIHRoZSBzYWZldHkgd2R0IGZ1bmN0aW9uIGFsd2F5cyBoYXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBncHQKKyAqIGZ1bmN0aW9uLiAgSWYgdGhlIGtlcm5lbCBoYXMgYmVlbiBjb21waWxlZCB3aXRoIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCwKKyAqIHRoaXMgbWVhbnMgdGhhdCBncHQwIGlzIGxvY2tlZCBpbiB3ZHQgbW9kZSB1bnRpbCB0aGUgbmV4dCByZWJvb3QgLSB0aGlzCisgKiBtYXkgYmUgYSByZXF1aXJlbWVudCBpbiBzYWZldHkgYXBwbGljYXRpb25zLgogICoKICAqIFRvIHVzZSB0aGUgR1BJTyBmdW5jdGlvbiwgdGhlIGZvbGxvd2luZyB0d28gcHJvcGVydGllcyBtdXN0IGJlIGFkZGVkCiAgKiB0byB0aGUgZGV2aWNlIHRyZWUgbm9kZSBmb3IgdGhlIGdwdCBkZXZpY2UgKHR5cGljYWxseSBpbiB0aGUgLmR0cyBmaWxlCkBAIC00NiwxNyArNTIsMjQgQEAKICAqIHRoZSBvdXRwdXQgbW9kZS4gIFRoaXMgZHJpdmVyIGRvZXMgbm90IGNoYW5nZSB0aGUgb3V0cHV0IG1vZGUgc2V0dGluZy4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KICNpbmNsdWRlIDxhc20vbXBjNTJ4eC5oPgogCiBNT0RVTEVfREVTQ1JJUFRJT04oIkZyZWVzY2FsZSBNUEM1Mnh4IGdwdCBkcml2ZXIiKTsKLU1PRFVMRV9BVVRIT1IoIlNhc2NoYSBIYXVlciwgR3JhbnQgTGlrZWx5Iik7CitNT0RVTEVfQVVUSE9SKCJTYXNjaGEgSGF1ZXIsIEdyYW50IExpa2VseSwgQWxicmVjaHQgRHJlw58iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogLyoqCkBAIC02NiwxOCArNzksMjcgQEAKICAqIEBsb2NrOiBzcGlubG9jayB0byBjb29yZGluYXRlIGJldHdlZW4gZGlmZmVyZW50IGZ1bmN0aW9ucy4KICAqIEBvZl9nYzogb2ZfZ3Bpb19jaGlwIGluc3RhbmNlIHN0cnVjdHVyZTsgdXNlZCB3aGVuIEdQSU8gaXMgZW5hYmxlZAogICogQGlycWhvc3Q6IFBvaW50ZXIgdG8gaXJxX2hvc3QgaW5zdGFuY2U7IHVzZWQgd2hlbiBJUlEgbW9kZSBpcyBzdXBwb3J0ZWQKKyAqIEB3ZHRfbW9kZTogb25seSByZWxldmFudCBmb3IgZ3B0MDogYml0IDAgKE1QQzUyeHhfR1BUX0NBTl9XRFQpIGluZGljYXRlcworICogICBpZiB0aGUgZ3B0IG1heSBiZSB1c2VkIGFzIHdkdCwgYml0IDEgKE1QQzUyeHhfR1BUX0lTX1dEVCkgaW5kaWNhdGVzCisgKiAgIGlmIHRoZSB0aW1lciBpcyBhY3RpdmVseSB1c2VkIGFzIHdkdCB3aGljaCBibG9ja3MgZ3B0IGZ1bmN0aW9ucwogICovCiBzdHJ1Y3QgbXBjNTJ4eF9ncHRfcHJpdiB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkJLyogTGlzdCBvZiBhbGwgR1BUIGRldmljZXMgKi8KIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc3RydWN0IG1wYzUyeHhfZ3B0IF9faW9tZW0gKnJlZ3M7CiAJc3BpbmxvY2tfdCBsb2NrOwogCXN0cnVjdCBpcnFfaG9zdCAqaXJxaG9zdDsKKwl1MzIgaXBiX2ZyZXE7CisJdTggd2R0X21vZGU7CiAKICNpZiBkZWZpbmVkKENPTkZJR19HUElPTElCKQogCXN0cnVjdCBvZl9ncGlvX2NoaXAgb2ZfZ2M7CiAjZW5kaWYKIH07CiAKK0xJU1RfSEVBRChtcGM1Mnh4X2dwdF9saXN0KTsKK0RFRklORV9NVVRFWChtcGM1Mnh4X2dwdF9saXN0X211dGV4KTsKKwogI2RlZmluZSBNUEM1Mnh4X0dQVF9NT0RFX01TX01BU0sJKDB4MDcpCiAjZGVmaW5lIE1QQzUyeHhfR1BUX01PREVfTVNfSUMJCSgweDAxKQogI2RlZmluZSBNUEM1Mnh4X0dQVF9NT0RFX01TX09DCQkoMHgwMikKQEAgLTg4LDE1ICsxMTAsMjUgQEAKICNkZWZpbmUgTVBDNTJ4eF9HUFRfTU9ERV9HUElPX09VVF9MT1cJKDB4MjApCiAjZGVmaW5lIE1QQzUyeHhfR1BUX01PREVfR1BJT19PVVRfSElHSAkoMHgzMCkKIAorI2RlZmluZSBNUEM1Mnh4X0dQVF9NT0RFX0NPVU5URVJfRU5BQkxFCSgweDEwMDApCisjZGVmaW5lIE1QQzUyeHhfR1BUX01PREVfQ09OVElOVU9VUwkoMHgwNDAwKQorI2RlZmluZSBNUEM1Mnh4X0dQVF9NT0RFX09QRU5fRFJBSU4JKDB4MDIwMCkKICNkZWZpbmUgTVBDNTJ4eF9HUFRfTU9ERV9JUlFfRU4JCSgweDAxMDApCisjZGVmaW5lIE1QQzUyeHhfR1BUX01PREVfV0RUX0VOCQkoMHg4MDAwKQogCiAjZGVmaW5lIE1QQzUyeHhfR1BUX01PREVfSUNUX01BU0sJKDB4MDMwMDAwKQogI2RlZmluZSBNUEM1Mnh4X0dQVF9NT0RFX0lDVF9SSVNJTkcJKDB4MDEwMDAwKQogI2RlZmluZSBNUEM1Mnh4X0dQVF9NT0RFX0lDVF9GQUxMSU5HCSgweDAyMDAwMCkKICNkZWZpbmUgTVBDNTJ4eF9HUFRfTU9ERV9JQ1RfVE9HR0xFCSgweDAzMDAwMCkKIAorI2RlZmluZSBNUEM1Mnh4X0dQVF9NT0RFX1dEVF9QSU5HCSgweGE1KQorCiAjZGVmaW5lIE1QQzUyeHhfR1BUX1NUQVRVU19JUlFNQVNLCSgweDAwMGYpCiAKKyNkZWZpbmUgTVBDNTJ4eF9HUFRfQ0FOX1dEVAkJKDEgPDwgMCkKKyNkZWZpbmUgTVBDNTJ4eF9HUFRfSVNfV0RUCQkoMSA8PCAxKQorCisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogQ2FzY2FkZWQgaW50ZXJydXB0IGNvbnRyb2xsZXIgaG9va3MKICAqLwpAQCAtMTQ5LDcgKzE4MSw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgbXBjNTJ4eF9ncHRfaXJxX2NoaXAgPSB7Ci0JLnR5cGVuYW1lID0gIk1QQzUyeHggR1BUIiwKKwkubmFtZSA9ICJNUEM1Mnh4IEdQVCIsCiAJLnVubWFzayA9IG1wYzUyeHhfZ3B0X2lycV91bm1hc2ssCiAJLm1hc2sgPSBtcGM1Mnh4X2dwdF9pcnFfbWFzaywKIAkuYWNrID0gbXBjNTJ4eF9ncHRfaXJxX2FjaywKQEAgLTE4Miw3ICsyMTQsNyBAQAogfQogCiBzdGF0aWMgaW50IG1wYzUyeHhfZ3B0X2lycV94bGF0ZShzdHJ1Y3QgaXJxX2hvc3QgKmgsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqY3QsCi0JCQkJIHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUsCisJCQkJIGNvbnN0IHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUsCiAJCQkJIGlycV9od19udW1iZXJfdCAqb3V0X2h3aXJxLAogCQkJCSB1bnNpZ25lZCBpbnQgKm91dF9mbGFncykKIHsKQEAgLTE5MCw3ICsyMjIsNyBAQAogCiAJZGV2X2RiZyhncHQtPmRldiwgIiVzOiBmbGFncz0laVxuIiwgX19mdW5jX18sIGludHNwZWNbMF0pOwogCi0JaWYgKChpbnRzaXplIDwgMSkgfHwgKGludHNwZWNbMF0gPCAxKSB8fCAoaW50c3BlY1swXSA+IDMpKSB7CisJaWYgKChpbnRzaXplIDwgMSkgfHwgKGludHNwZWNbMF0gPiAzKSkgewogCQlkZXZfZXJyKGdwdC0+ZGV2LCAiYmFkIGlycSBzcGVjaWZpZXIgaW4gJXNcbiIsIGN0LT5mdWxsX25hbWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0yMTEsMTMgKzI0MywxMSBAQAogewogCWludCBjYXNjYWRlX3ZpcnE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIE9ubHkgc2V0dXAgY2FzY2FkZWQgSVJRIGlmIGRldmljZSB0cmVlIGNsYWltcyB0aGUgR1BUIGlzCi0JICogYW4gaW50ZXJydXB0IGNvbnRyb2xsZXIgKi8KLQlpZiAoIW9mX2ZpbmRfcHJvcGVydHkobm9kZSwgImludGVycnVwdC1jb250cm9sbGVyIiwgTlVMTCkpCi0JCXJldHVybjsKKwl1MzIgbW9kZTsKIAogCWNhc2NhZGVfdmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5vZGUsIDApOworCWlmICghY2FzY2FkZV92aXJxKQorCQlyZXR1cm47CiAKIAlncHQtPmlycWhvc3QgPSBpcnFfYWxsb2NfaG9zdChub2RlLCBJUlFfSE9TVF9NQVBfTElORUFSLCAxLAogCQkJCSAgICAgICZtcGM1Mnh4X2dwdF9pcnFfb3BzLCAtMSk7CkBAIC0yMjcsMTQgKzI1NywxNiBAQAogCX0KIAogCWdwdC0+aXJxaG9zdC0+aG9zdF9kYXRhID0gZ3B0OwotCiAJc2V0X2lycV9kYXRhKGNhc2NhZGVfdmlycSwgZ3B0KTsKIAlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihjYXNjYWRlX3ZpcnEsIG1wYzUyeHhfZ3B0X2lycV9jYXNjYWRlKTsKIAotCS8qIFNldCB0byBJbnB1dCBDYXB0dXJlIG1vZGUgKi8KKwkvKiBJZiB0aGUgR1BUIGlzIGN1cnJlbnRseSBkaXNhYmxlZCwgdGhlbiBjaGFuZ2UgaXQgdG8gYmUgaW4gSW5wdXQKKwkgKiBDYXB0dXJlIG1vZGUuICBJZiB0aGUgbW9kZSBpcyBub24temVybywgdGhlbiB0aGUgcGluIGNvdWxkIGJlCisJICogYWxyZWFkeSBpbiB1c2UgZm9yIHNvbWV0aGluZy4gKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZ3B0LT5sb2NrLCBmbGFncyk7Ci0JY2xyc2V0Yml0c19iZTMyKCZncHQtPnJlZ3MtPm1vZGUsIE1QQzUyeHhfR1BUX01PREVfTVNfTUFTSywKLQkJCU1QQzUyeHhfR1BUX01PREVfTVNfSUMpOworCW1vZGUgPSBpbl9iZTMyKCZncHQtPnJlZ3MtPm1vZGUpOworCWlmICgobW9kZSAmIE1QQzUyeHhfR1BUX01PREVfTVNfTUFTSykgPT0gMCkKKwkJb3V0X2JlMzIoJmdwdC0+cmVncy0+bW9kZSwgbW9kZSB8IE1QQzUyeHhfR1BUX01PREVfTVNfSUMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwdC0+bG9jaywgZmxhZ3MpOwogCiAJZGV2X2RiZyhncHQtPmRldiwgIiVzKCkgY29tcGxldGUuIHZpcnE9JWlcbiIsIF9fZnVuY19fLCBjYXNjYWRlX3ZpcnEpOwpAQCAtMzM1LDYgKzM2NywzNTQgQEAKIG1wYzUyeHhfZ3B0X2dwaW9fc2V0dXAoc3RydWN0IG1wYzUyeHhfZ3B0X3ByaXYgKnAsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApIHsgfQogI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0dQSU9MSUIpICovCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGltZXIgQVBJCisgKi8KKworLyoqCisgKiBtcGM1Mnh4X2dwdF9mcm9tX2lycSAtIFJldHVybiB0aGUgR1BUIGRldmljZSBhc3NvY2lhdGVkIHdpdGggYW4gSVJRIG51bWJlcgorICogQGlycTogaXJxIG9mIHRpbWVyLgorICovCitzdHJ1Y3QgbXBjNTJ4eF9ncHRfcHJpdiAqbXBjNTJ4eF9ncHRfZnJvbV9pcnEoaW50IGlycSkKK3sKKwlzdHJ1Y3QgbXBjNTJ4eF9ncHRfcHJpdiAqZ3B0OworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKworCS8qIEl0ZXJhdGUgb3ZlciB0aGUgbGlzdCBvZiB0aW1lcnMgbG9va2luZyBmb3IgYSBtYXRjaGluZyBkZXZpY2UgKi8KKwltdXRleF9sb2NrKCZtcGM1Mnh4X2dwdF9saXN0X211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJm1wYzUyeHhfZ3B0X2xpc3QpIHsKKwkJZ3B0ID0gY29udGFpbmVyX29mKHBvcywgc3RydWN0IG1wYzUyeHhfZ3B0X3ByaXYsIGxpc3QpOworCQlpZiAoZ3B0LT5pcnFob3N0ICYmIGlycSA9PSBpcnFfbGluZWFyX3Jldm1hcChncHQtPmlycWhvc3QsIDApKSB7CisJCQltdXRleF91bmxvY2soJm1wYzUyeHhfZ3B0X2xpc3RfbXV0ZXgpOworCQkJcmV0dXJuIGdwdDsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJm1wYzUyeHhfZ3B0X2xpc3RfbXV0ZXgpOworCisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKG1wYzUyeHhfZ3B0X2Zyb21faXJxKTsKKworc3RhdGljIGludCBtcGM1Mnh4X2dwdF9kb19zdGFydChzdHJ1Y3QgbXBjNTJ4eF9ncHRfcHJpdiAqZ3B0LCB1NjQgcGVyaW9kLAorCQkJCWludCBjb250aW51b3VzLCBpbnQgYXNfd2R0KQoreworCXUzMiBjbGVhciwgc2V0OworCXU2NCBjbG9ja3M7CisJdTMyIHByZXNjYWxlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwljbGVhciA9IE1QQzUyeHhfR1BUX01PREVfTVNfTUFTSyB8IE1QQzUyeHhfR1BUX01PREVfQ09OVElOVU9VUzsKKwlzZXQgPSBNUEM1Mnh4X0dQVF9NT0RFX01TX0dQSU8gfCBNUEM1Mnh4X0dQVF9NT0RFX0NPVU5URVJfRU5BQkxFOworCWlmIChhc193ZHQpIHsKKwkJY2xlYXIgfD0gTVBDNTJ4eF9HUFRfTU9ERV9JUlFfRU47CisJCXNldCB8PSBNUEM1Mnh4X0dQVF9NT0RFX1dEVF9FTjsKKwl9IGVsc2UgaWYgKGNvbnRpbnVvdXMpCisJCXNldCB8PSBNUEM1Mnh4X0dQVF9NT0RFX0NPTlRJTlVPVVM7CisKKwkvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBjbG9ja3MgaW4gdGhlIHJlcXVlc3RlZCBwZXJpb2QuICA2NCBiaXQKKwkgKiBhcml0aG1hdGljIGlzIGRvbmUgaGVyZSB0byBwcmVzZXJ2ZSB0aGUgcHJlY2lzaW9uIHVudGlsIHRoZSB2YWx1ZQorCSAqIGlzIHNjYWxlZCBiYWNrIGRvd24gaW50byB0aGUgdTMyIHJhbmdlLiAgUGVyaW9kIGlzIGluICducycsIGJ1cworCSAqIGZyZXF1ZW5jeSBpcyBpbiBIei4gKi8KKwljbG9ja3MgPSBwZXJpb2QgKiAodTY0KWdwdC0+aXBiX2ZyZXE7CisJZG9fZGl2KGNsb2NrcywgMTAwMDAwMDAwMCk7IC8qIFNjYWxlIGl0IGRvd24gdG8gbnMgcmFuZ2UgKi8KKworCS8qIFRoaXMgZGV2aWNlIGNhbm5vdCBoYW5kbGUgYSBjbG9jayBjb3VudCBncmVhdGVyIHRoYW4gMzIgYml0cyAqLworCWlmIChjbG9ja3MgPiAweGZmZmZmZmZmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIENhbGN1bGF0ZSB0aGUgcHJlc2NhbGVyIGFuZCBjb3VudCB2YWx1ZXMgZnJvbSB0aGUgY2xvY2tzIHZhbHVlLgorCSAqICdjbG9ja3MnIGlzIHRoZSBudW1iZXIgb2YgY2xvY2sgdGlja3MgaW4gdGhlIHBlcmlvZC4gIFRoZSB0aW1lcgorCSAqIGhhcyAxNiBiaXQgcHJlY2lzaW9uIGFuZCBhIDE2IGJpdCBwcmVzY2FsZXIuICBQcmVzY2FsZXIgaXMKKwkgKiBjYWxjdWxhdGVkIGJ5IGludGVnZXIgZGl2aWRpbmcgdGhlIGNsb2NrcyBieSAweDEwMDAwIChzaGlmdGluZworCSAqIGRvd24gMTYgYml0cykgdG8gb2J0YWluIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBkaXZpc29yIGZvciBjbG9ja3MKKwkgKiB0byBnZXQgYSAxNiBiaXQgY291bnQgdmFsdWUuCisJICoKKwkgKiBOb3RlOiB0aGUgcHJlc2NhbGUgcmVnaXN0ZXIgaXMgJzEnIGJhc2VkLCBub3QgJzAnIGJhc2VkLiAgaWUuIGEKKwkgKiB2YWx1ZSBvZiAnMScgbWVhbnMgZGl2aWRlIHRoZSBjbG9jayBieSBvbmUuICAweGZmZmYgZGl2aWRlcyB0aGUKKwkgKiBjbG9jayBieSAweGZmZmYuICAnMHgwMDAwJyBkb2VzIG5vdCBkaXZpZGUgYnkgemVybywgYnV0IHdyYXBzCisJICogYXJvdW5kIGFuZCBkaXZpZGVzIGJ5IDB4MTAwMDAuICBUaGF0IGlzIHdoeSBwcmVzY2FsZSBtdXN0IGJlCisJICogYSB1MzIgdmFyaWFibGUsIG5vdCBhIHUxNiwgZm9yIHRoaXMgY2FsY3VsYXRpb24uICovCisJcHJlc2NhbGUgPSAoY2xvY2tzID4+IDE2KSArIDE7CisJZG9fZGl2KGNsb2NrcywgcHJlc2NhbGUpOworCWlmIChjbG9ja3MgPiAweGZmZmYpIHsKKwkJcHJfZXJyKCJjYWxjdWxhdGlvbiBlcnJvcjsgcHJlc2NhbGU6JXggY2xvY2tzOiVsbHhcbiIsCisJCSAgICAgICBwcmVzY2FsZSwgY2xvY2tzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogU2V0IGFuZCBlbmFibGUgdGhlIHRpbWVyLCByZWplY3QgYW4gYXR0ZW1wdCB0byB1c2UgYSB3ZHQgYXMgZ3B0ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwdC0+bG9jaywgZmxhZ3MpOworCWlmIChhc193ZHQpCisJCWdwdC0+d2R0X21vZGUgfD0gTVBDNTJ4eF9HUFRfSVNfV0RUOworCWVsc2UgaWYgKChncHQtPndkdF9tb2RlICYgTVBDNTJ4eF9HUFRfSVNfV0RUKSAhPSAwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwdC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlvdXRfYmUzMigmZ3B0LT5yZWdzLT5jb3VudCwgcHJlc2NhbGUgPDwgMTYgfCBjbG9ja3MpOworCWNscnNldGJpdHNfYmUzMigmZ3B0LT5yZWdzLT5tb2RlLCBjbGVhciwgc2V0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncHQtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIG1wYzUyeHhfZ3B0X3N0YXJ0X3RpbWVyIC0gU2V0IGFuZCBlbmFibGUgdGhlIEdQVCB0aW1lcgorICogQGdwdDogUG9pbnRlciB0byBncHQgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQorICogQHBlcmlvZDogcGVyaW9kIG9mIHRpbWVyIGluIG5zOyBtYXguIH4xMzBzIEAgMzNNSHogSVBCIGNsb2NrCisgKiBAY29udGludW91czogc2V0IHRvIDEgdG8gbWFrZSB0aW1lciBjb250aW51b3VzIGZyZWUgcnVubmluZworICoKKyAqIEFuIGludGVycnVwdCB3aWxsIGJlIGdlbmVyYXRlZCBldmVyeSB0aW1lIHRoZSB0aW1lciBmaXJlcworICovCitpbnQgbXBjNTJ4eF9ncHRfc3RhcnRfdGltZXIoc3RydWN0IG1wYzUyeHhfZ3B0X3ByaXYgKmdwdCwgdTY0IHBlcmlvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udGludW91cykKK3sKKwlyZXR1cm4gbXBjNTJ4eF9ncHRfZG9fc3RhcnQoZ3B0LCBwZXJpb2QsIGNvbnRpbnVvdXMsIDApOworfQorRVhQT1JUX1NZTUJPTChtcGM1Mnh4X2dwdF9zdGFydF90aW1lcik7CisKKy8qKgorICogbXBjNTJ4eF9ncHRfc3RvcF90aW1lciAtIFN0b3AgYSBncHQKKyAqIEBncHQ6IFBvaW50ZXIgdG8gZ3B0IHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIGFuIGVycm9yIGlmIGF0dGVtcHRpbmcgdG8gc3RvcCBhIHdkdAorICovCitpbnQgbXBjNTJ4eF9ncHRfc3RvcF90aW1lcihzdHJ1Y3QgbXBjNTJ4eF9ncHRfcHJpdiAqZ3B0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiByZWplY3QgdGhlIG9wZXJhdGlvbiBpZiB0aGUgdGltZXIgaXMgdXNlZCBhcyB3YXRjaGRvZyAoZ3B0IDAgb25seSkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3B0LT5sb2NrLCBmbGFncyk7CisJaWYgKChncHQtPndkdF9tb2RlICYgTVBDNTJ4eF9HUFRfSVNfV0RUKSAhPSAwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwdC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWNscmJpdHMzMigmZ3B0LT5yZWdzLT5tb2RlLCBNUEM1Mnh4X0dQVF9NT0RFX0NPVU5URVJfRU5BQkxFKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncHQtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wobXBjNTJ4eF9ncHRfc3RvcF90aW1lcik7CisKKy8qKgorICogbXBjNTJ4eF9ncHRfdGltZXJfcGVyaW9kIC0gUmVhZCB0aGUgdGltZXIgcGVyaW9kCisgKiBAZ3B0OiBQb2ludGVyIHRvIGdwdCBwcml2YXRlIGRhdGEgc3RydWN0dXJlCisgKgorICogUmV0dXJucyB0aGUgdGltZXIgcGVyaW9kIGluIG5zCisgKi8KK3U2NCBtcGM1Mnh4X2dwdF90aW1lcl9wZXJpb2Qoc3RydWN0IG1wYzUyeHhfZ3B0X3ByaXYgKmdwdCkKK3sKKwl1NjQgcGVyaW9kOworCXU2NCBwcmVzY2FsZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwdC0+bG9jaywgZmxhZ3MpOworCXBlcmlvZCA9IGluX2JlMzIoJmdwdC0+cmVncy0+Y291bnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwdC0+bG9jaywgZmxhZ3MpOworCisJcHJlc2NhbGUgPSBwZXJpb2QgPj4gMTY7CisJcGVyaW9kICY9IDB4ZmZmZjsKKwlpZiAocHJlc2NhbGUgPT0gMCkKKwkJcHJlc2NhbGUgPSAweDEwMDAwOworCXBlcmlvZCA9IHBlcmlvZCAqIHByZXNjYWxlICogMTAwMDAwMDAwMFVMTDsKKwlkb19kaXYocGVyaW9kLCAodTY0KWdwdC0+aXBiX2ZyZXEpOworCXJldHVybiBwZXJpb2Q7Cit9CitFWFBPUlRfU1lNQk9MKG1wYzUyeHhfZ3B0X3RpbWVyX3BlcmlvZCk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM1MjAwX1dEVCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogV2F0Y2hkb2cgQVBJIGZvciBncHQwCisgKi8KKworI2RlZmluZSBXRFRfSURFTlRJVFkJICAgICJtcGM1Mnh4IHdhdGNoZG9nIG9uIEdQVDAiCisKKy8qIHdkdF9pc19hY3RpdmUgc3RvcmVzIHdldGhlciBvciBub3QgdGhlIC9kZXYvd2F0Y2hkb2cgZGV2aWNlIGlzIG9wZW5lZCAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgd2R0X2lzX2FjdGl2ZTsKKworLyogd2R0LWNhcGFibGUgZ3B0ICovCitzdGF0aWMgc3RydWN0IG1wYzUyeHhfZ3B0X3ByaXYgKm1wYzUyeHhfZ3B0X3dkdDsKKworLyogbG93LWxldmVsIHdkdCBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtcGM1Mnh4X2dwdF93ZHRfcGluZyhzdHJ1Y3QgbXBjNTJ4eF9ncHRfcHJpdiAqZ3B0X3dkdCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwdF93ZHQtPmxvY2ssIGZsYWdzKTsKKwlvdXRfOCgodTggKikgJmdwdF93ZHQtPnJlZ3MtPm1vZGUsIE1QQzUyeHhfR1BUX01PREVfV0RUX1BJTkcpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwdF93ZHQtPmxvY2ssIGZsYWdzKTsKK30KKworLyogd2R0IG1pc2MgZGV2aWNlIGFwaSAqLworc3RhdGljIHNzaXplX3QgbXBjNTJ4eF93ZHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpkYXRhLAorCQkJCSBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IG1wYzUyeHhfZ3B0X3ByaXYgKmdwdF93ZHQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJbXBjNTJ4eF9ncHRfd2R0X3BpbmcoZ3B0X3dkdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBtcGM1MjAwX3dkdF9pbmZvID0geworCS5vcHRpb25zCT0gV0RJT0ZfU0VUVElNRU9VVCB8IFdESU9GX0tFRVBBTElWRVBJTkcsCisJLmlkZW50aXR5CT0gV0RUX0lERU5USVRZLAorfTsKKworc3RhdGljIGxvbmcgbXBjNTJ4eF93ZHRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbXBjNTJ4eF9ncHRfcHJpdiAqZ3B0X3dkdCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgX191c2VyICpkYXRhID0gKGludCBfX3VzZXIgKilhcmc7CisJaW50IHRpbWVvdXQ7CisJdTY0IHJlYWxfdGltZW91dDsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQlyZXQgPSBjb3B5X3RvX3VzZXIoZGF0YSwgJm1wYzUyMDBfd2R0X2luZm8sCisJCQkJICAgc2l6ZW9mKG1wYzUyMDBfd2R0X2luZm8pKTsKKwkJaWYgKHJldCkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQlyZXQgPSBwdXRfdXNlcigwLCBkYXRhKTsKKwkJYnJlYWs7CisKKwljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJbXBjNTJ4eF9ncHRfd2R0X3BpbmcoZ3B0X3dkdCk7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQlyZXQgPSBnZXRfdXNlcih0aW1lb3V0LCBkYXRhKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCQlyZWFsX3RpbWVvdXQgPSAodTY0KSB0aW1lb3V0ICogMTAwMDAwMDAwMFVMTDsKKwkJcmV0ID0gbXBjNTJ4eF9ncHRfZG9fc3RhcnQoZ3B0X3dkdCwgcmVhbF90aW1lb3V0LCAwLCAxKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCQkvKiBmYWxsIHRocm91Z2ggYW5kIHJldHVybiB0aGUgdGltZW91dCAqLworCisJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQkvKiB3ZSBuZWVkIHRvIHJvdW5kIGhlcmUgYXMgdG8gYXZvaWQgZS5nLiB0aGUgZm9sbG93aW5nCisJCSAqIHNpdHVhdGlvbjoKKwkJICogLSB0aW1lb3V0IHJlcXVlc3RlZCBpcyAxIHNlY29uZDsKKwkJICogLSByZWFsIHRpbWVvdXQgQDMzTUh6IGlzIDk5OTk5NzA5MG5zCisJCSAqIC0gdGhlIGludCBkaXZpZGUgYnkgMTBeOSB3aWxsIHJldHVybiAwLgorCQkgKi8KKwkJcmVhbF90aW1lb3V0ID0KKwkJCW1wYzUyeHhfZ3B0X3RpbWVyX3BlcmlvZChncHRfd2R0KSArIDUwMDAwMDAwMFVMTDsKKwkJZG9fZGl2KHJlYWxfdGltZW91dCwgMTAwMDAwMDAwMFVMTCk7CisJCXRpbWVvdXQgPSAoaW50KSByZWFsX3RpbWVvdXQ7CisJCXJldCA9IHB1dF91c2VyKHRpbWVvdXQsIGRhdGEpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9UVFk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXBjNTJ4eF93ZHRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgcmV0OworCisJLyogc2FuaXR5IGNoZWNrICovCisJaWYgKCFtcGM1Mnh4X2dwdF93ZHQpCisJCXJldHVybiAtRU5PREVWOworCisJLyogL2Rldi93YXRjaGRvZyBjYW4gb25seSBiZSBvcGVuZWQgb25jZSAqLworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZ3ZHRfaXNfYWN0aXZlKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIFNldCBhbmQgYWN0aXZhdGUgdGhlIHdhdGNoZG9nIHdpdGggMzAgc2Vjb25kcyB0aW1lb3V0ICovCisJcmV0ID0gbXBjNTJ4eF9ncHRfZG9fc3RhcnQobXBjNTJ4eF9ncHRfd2R0LCAzMFVMTCAqIDEwMDAwMDAwMDBVTEwsCisJCQkJICAgMCwgMSk7CisJaWYgKHJldCkgeworCQljbGVhcl9iaXQoMCwgJndkdF9pc19hY3RpdmUpOworCQlyZXR1cm4gcmV0OworCX0KKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IG1wYzUyeHhfZ3B0X3dkdDsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgbXBjNTJ4eF93ZHRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKiBub3RlOiByZWxlYXNpbmcgdGhlIHdkdCBpbiBOT1dBWU9VVC1tb2RlIGRvZXMgbm90IHN0b3AgaXQgKi8KKyNpZiAhZGVmaW5lZChDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpCisJc3RydWN0IG1wYzUyeHhfZ3B0X3ByaXYgKmdwdF93ZHQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncHRfd2R0LT5sb2NrLCBmbGFncyk7CisJY2xyYml0czMyKCZncHRfd2R0LT5yZWdzLT5tb2RlLAorCQkgIE1QQzUyeHhfR1BUX01PREVfQ09VTlRFUl9FTkFCTEUgfCBNUEM1Mnh4X0dQVF9NT0RFX1dEVF9FTik7CisJZ3B0X3dkdC0+d2R0X21vZGUgJj0gfk1QQzUyeHhfR1BUX0lTX1dEVDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncHRfd2R0LT5sb2NrLCBmbGFncyk7CisjZW5kaWYKKwljbGVhcl9iaXQoMCwgJndkdF9pc19hY3RpdmUpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1wYzUyeHhfd2R0X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS53cml0ZQkJPSBtcGM1Mnh4X3dkdF93cml0ZSwKKwkudW5sb2NrZWRfaW9jdGwgPSBtcGM1Mnh4X3dkdF9pb2N0bCwKKwkub3BlbgkJPSBtcGM1Mnh4X3dkdF9vcGVuLAorCS5yZWxlYXNlCT0gbXBjNTJ4eF93ZHRfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBtcGM1Mnh4X3dkdF9taXNjZGV2ID0geworCS5taW5vcgkJPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZQkJPSAid2F0Y2hkb2ciLAorCS5mb3BzCQk9ICZtcGM1Mnh4X3dkdF9mb3BzLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgbXBjNTJ4eF9ncHRfd2R0X2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJLyogdHJ5IHRvIHJlZ2lzdGVyIHRoZSB3YXRjaGRvZyBtaXNjIGRldmljZSAqLworCWVyciA9IG1pc2NfcmVnaXN0ZXIoJm1wYzUyeHhfd2R0X21pc2NkZXYpOworCWlmIChlcnIpCisJCXByX2VycigiJXM6IGNhbm5vdCByZWdpc3RlciB3YXRjaGRvZyBkZXZpY2VcbiIsIFdEVF9JREVOVElUWSk7CisJZWxzZQorCQlwcl9pbmZvKCIlczogd2F0Y2hkb2cgZGV2aWNlIHJlZ2lzdGVyZWRcbiIsIFdEVF9JREVOVElUWSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtcGM1Mnh4X2dwdF93ZHRfc2V0dXAoc3RydWN0IG1wYzUyeHhfZ3B0X3ByaXYgKmdwdCwKKwkJCQkgY29uc3QgdTMyICpwZXJpb2QpCit7CisJdTY0IHJlYWxfdGltZW91dDsKKworCS8qIHJlbWVtYmVyIHRoZSBncHQgZm9yIHRoZSB3ZHQgb3BlcmF0aW9uICovCisJbXBjNTJ4eF9ncHRfd2R0ID0gZ3B0OworCisJLyogY29uZmlndXJlIHRoZSB3ZHQgaWYgdGhlIGRldmljZSB0cmVlIGNvbnRhaW5lZCBhIHRpbWVvdXQgKi8KKwlpZiAoIXBlcmlvZCB8fCAqcGVyaW9kID09IDApCisJCXJldHVybiAwOworCisJcmVhbF90aW1lb3V0ID0gKHU2NCkgKnBlcmlvZCAqIDEwMDAwMDAwMDBVTEw7CisJaWYgKG1wYzUyeHhfZ3B0X2RvX3N0YXJ0KGdwdCwgcmVhbF90aW1lb3V0LCAwLCAxKSkKKwkJZGV2X3dhcm4oZ3B0LT5kZXYsICJzdGFydGluZyBhcyB3ZHQgZmFpbGVkXG4iKTsKKwllbHNlCisJCWRldl9pbmZvKGdwdC0+ZGV2LCAid2F0Y2hkb2cgc2V0IHRvICV1cyB0aW1lb3V0XG4iLCAqcGVyaW9kKTsKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKworc3RhdGljIGludCBfX2RldmluaXQgbXBjNTJ4eF9ncHRfd2R0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBtcGM1Mnh4X2dwdF93ZHRfc2V0dXAoeCwgeSkJCSgwKQorCisjZW5kaWYJLyogIENPTkZJR19NUEM1MjAwX1dEVAkqLworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIG9mX3BsYXRmb3JtIGJ1cyBiaW5kaW5nIGNvZGUKICAqLwpAQCAtMzQ5LDYgKzcyOSw3IEBACiAKIAlzcGluX2xvY2tfaW5pdCgmZ3B0LT5sb2NrKTsKIAlncHQtPmRldiA9ICZvZmRldi0+ZGV2OworCWdwdC0+aXBiX2ZyZXEgPSBtcGM1eHh4X2dldF9idXNfZnJlcXVlbmN5KG9mZGV2LT5ub2RlKTsKIAlncHQtPnJlZ3MgPSBvZl9pb21hcChvZmRldi0+bm9kZSwgMCk7CiAJaWYgKCFncHQtPnJlZ3MpIHsKIAkJa2ZyZWUoZ3B0KTsKQEAgLTM2MCw2ICs3NDEsMjYgQEAKIAltcGM1Mnh4X2dwdF9ncGlvX3NldHVwKGdwdCwgb2ZkZXYtPm5vZGUpOwogCW1wYzUyeHhfZ3B0X2lycV9zZXR1cChncHQsIG9mZGV2LT5ub2RlKTsKIAorCW11dGV4X2xvY2soJm1wYzUyeHhfZ3B0X2xpc3RfbXV0ZXgpOworCWxpc3RfYWRkKCZncHQtPmxpc3QsICZtcGM1Mnh4X2dwdF9saXN0KTsKKwltdXRleF91bmxvY2soJm1wYzUyeHhfZ3B0X2xpc3RfbXV0ZXgpOworCisJLyogY2hlY2sgaWYgdGhpcyBkZXZpY2UgY291bGQgYmUgYSB3YXRjaGRvZyAqLworCWlmIChvZl9nZXRfcHJvcGVydHkob2ZkZXYtPm5vZGUsICJmc2wsaGFzLXdkdCIsIE5VTEwpIHx8CisJICAgIG9mX2dldF9wcm9wZXJ0eShvZmRldi0+bm9kZSwgImhhcy13ZHQiLCBOVUxMKSkgeworCQljb25zdCB1MzIgKm9uX2Jvb3Rfd2R0OworCisJCWdwdC0+d2R0X21vZGUgPSBNUEM1Mnh4X0dQVF9DQU5fV0RUOworCQlvbl9ib290X3dkdCA9IG9mX2dldF9wcm9wZXJ0eShvZmRldi0+bm9kZSwgImZzbCx3ZHQtb24tYm9vdCIsCisJCQkJCSAgICAgIE5VTEwpOworCQlpZiAob25fYm9vdF93ZHQpIHsKKwkJCWRldl9pbmZvKGdwdC0+ZGV2LCAidXNlZCBhcyB3YXRjaGRvZ1xuIik7CisJCQlncHQtPndkdF9tb2RlIHw9IE1QQzUyeHhfR1BUX0lTX1dEVDsKKwkJfSBlbHNlCisJCQlkZXZfaW5mbyhncHQtPmRldiwgImNhbiBmdW5jdGlvbiBhcyB3YXRjaGRvZ1xuIik7CisJCW1wYzUyeHhfZ3B0X3dkdF9zZXR1cChncHQsIG9uX2Jvb3Rfd2R0KTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzk0LDMgKzc5NSw0IEBACiAKIC8qIE1ha2Ugc3VyZSBHUElPcyBhbmQgSVJRcyBnZXQgc2V0IHVwIGJlZm9yZSBhbnlvbmUgdHJpZXMgdG8gdXNlIHRoZW0gKi8KIHN1YnN5c19pbml0Y2FsbChtcGM1Mnh4X2dwdF9pbml0KTsKK2RldmljZV9pbml0Y2FsbChtcGM1Mnh4X2dwdF93ZHRfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9scGJmaWZvLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9scGJmaWZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI5ZDAxNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X2xwYmZpZm8uYwpAQCAtMCwwICsxLDU2MCBAQAorLyoKKyAqIExvY2FsUGx1cyBCdXMgRklGTyBkcml2ZXIgZm9yIHRoZSBGcmVlc2NhbGUgTVBDNTJ4eC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2VjcmV0IExhYiBUZWNobm9sb2dpZXMgTHRkLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIKKyAqCisgKiBUb2RvOgorICogLSBBZGQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgcmVxdWVzdHMgdG8gYmUgcXVldWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9tcGM1Mnh4Lmg+CisjaW5jbHVkZSA8YXNtL3RpbWUuaD4KKworI2luY2x1ZGUgPHN5c2Rldi9iZXN0Y29tbS9iZXN0Y29tbS5oPgorI2luY2x1ZGUgPHN5c2Rldi9iZXN0Y29tbS9iZXN0Y29tbV9wcml2Lmg+CisjaW5jbHVkZSA8c3lzZGV2L2Jlc3Rjb21tL2dlbl9iZC5oPgorCitNT0RVTEVfQVVUSE9SKCJHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1QQzUyMDAgTG9jYWxQbHVzIEZJRk8gZGV2aWNlIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIExQQkZJRk9fUkVHX1BBQ0tFVF9TSVpFCQkoMHgwMCkKKyNkZWZpbmUgTFBCRklGT19SRUdfU1RBUlRfQUREUkVTUwkoMHgwNCkKKyNkZWZpbmUgTFBCRklGT19SRUdfQ09OVFJPTAkJKDB4MDgpCisjZGVmaW5lIExQQkZJRk9fUkVHX0VOQUJMRQkJKDB4MEMpCisjZGVmaW5lIExQQkZJRk9fUkVHX0JZVEVTX0RPTkVfU1RBVFVTCSgweDE0KQorI2RlZmluZSBMUEJGSUZPX1JFR19GSUZPX0RBVEEJCSgweDQwKQorI2RlZmluZSBMUEJGSUZPX1JFR19GSUZPX1NUQVRVUwkJKDB4NDQpCisjZGVmaW5lIExQQkZJRk9fUkVHX0ZJRk9fQ09OVFJPTAkoMHg0OCkKKyNkZWZpbmUgTFBCRklGT19SRUdfRklGT19BTEFSTQkJKDB4NEMpCisKK3N0cnVjdCBtcGM1Mnh4X2xwYmZpZm8geworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlwaHlzX2FkZHJfdCByZWdzX3BoeXM7CisJdm9pZCBfX2lvbWVtICpyZWdzOworCWludCBpcnE7CisJc3BpbmxvY2tfdCBsb2NrOworCisJc3RydWN0IGJjb21fdGFzayAqYmNvbV90eF90YXNrOworCXN0cnVjdCBiY29tX3Rhc2sgKmJjb21fcnhfdGFzazsKKwlzdHJ1Y3QgYmNvbV90YXNrICpiY29tX2N1cl90YXNrOworCisJLyogQ3VycmVudCBzdGF0ZSBkYXRhICovCisJc3RydWN0IG1wYzUyeHhfbHBiZmlmb19yZXF1ZXN0ICpyZXE7CisJaW50IGRtYV9pcnFzX2VuYWJsZWQ7Cit9OworCisvKiBUaGUgTVBDNTIwMCBoYXMgb25seSBvbmUgZmlmbywgc28gb25seSBuZWVkIG9uZSBpbnN0YW5jZSBzdHJ1Y3R1cmUgKi8KK3N0YXRpYyBzdHJ1Y3QgbXBjNTJ4eF9scGJmaWZvIGxwYmZpZm87CisKKy8qKgorICogbXBjNTJ4eF9scGJmaWZvX2tpY2sgLSBUcmlnZ2VyIHRoZSBuZXh0IGJsb2NrIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJlZAorICovCitzdGF0aWMgdm9pZCBtcGM1Mnh4X2xwYmZpZm9fa2ljayhzdHJ1Y3QgbXBjNTJ4eF9scGJmaWZvX3JlcXVlc3QgKnJlcSkKK3sKKwlzaXplX3QgdHJhbnNmZXJfc2l6ZSA9IHJlcS0+c2l6ZSAtIHJlcS0+cG9zOworCXN0cnVjdCBiY29tX2JkICpiZDsKKwl2b2lkIF9faW9tZW0gKnJlZzsKKwl1MzIgKmRhdGE7CisJaW50IGk7CisJaW50IGJpdF9maWVsZHM7CisJaW50IGRtYSA9ICEocmVxLT5mbGFncyAmIE1QQzUyWFhfTFBCRklGT19GTEFHX05PX0RNQSk7CisJaW50IHdyaXRlID0gcmVxLT5mbGFncyAmIE1QQzUyWFhfTFBCRklGT19GTEFHX1dSSVRFOworCWludCBwb2xsX2RtYSA9IHJlcS0+ZmxhZ3MgJiBNUEM1MlhYX0xQQkZJRk9fRkxBR19QT0xMX0RNQTsKKworCS8qIFNldCBhbmQgY2xlYXIgdGhlIHJlc2V0IGJpdHM7IGlzIGdvb2QgcHJhY3RpY2UgaW4gVXNlciBNYW51YWwgKi8KKwlvdXRfYmUzMihscGJmaWZvLnJlZ3MgKyBMUEJGSUZPX1JFR19FTkFCTEUsIDB4MDEwMTAwMDApOworCisJLyogc2V0IG1hc3RlciBlbmFibGUgYml0ICovCisJb3V0X2JlMzIobHBiZmlmby5yZWdzICsgTFBCRklGT19SRUdfRU5BQkxFLCAweDAwMDAwMDAxKTsKKwlpZiAoIWRtYSkgeworCQkvKiBXaGlsZSB0aGUgRklGTyBjYW4gYmUgc2V0dXAgZm9yIHRyYW5zZmVyIHNpemVzIGFzIGxhcmdlIGFzCisJCSAqIDE2TS0xLCB0aGUgRklGTyBpdHNlbGYgaXMgb25seSA1MTIgYnl0ZXMgZGVlcCBhbmQgaXQgZG9lcworCQkgKiBub3QgZ2VuZXJhdGUgaW50ZXJydXB0cyBmb3IgRklGTyBmdWxsIGV2ZW50cyAob25seSB0cmFuc2ZlcgorCQkgKiBjb21wbGV0ZSB3aWxsIHJhaXNlIGFuIElSUSkuICBUaGVyZWZvcmUgd2hlbiBub3QgdXNpbmcKKwkJICogQmVzdGNvbW0gdG8gZHJpdmUgdGhlIEZJRk8gaXQgbmVlZHMgdG8gZWl0aGVyIGJlIHBvbGxlZCwgb3IKKwkJICogdHJhbnNmZXJzIG5lZWQgdG8gY29uc3RyYWluZWQgdG8gdGhlIHNpemUgb2YgdGhlIGZpZm8uCisJCSAqCisJCSAqIFRoaXMgZHJpdmVyIHJlc3RyaWN0cyB0aGUgc2l6ZSBvZiB0aGUgdHJhbnNmZXIKKwkJICovCisJCWlmICh0cmFuc2Zlcl9zaXplID4gNTEyKQorCQkJdHJhbnNmZXJfc2l6ZSA9IDUxMjsKKworCQkvKiBMb2FkIHRoZSBGSUZPIHdpdGggZGF0YSAqLworCQlpZiAod3JpdGUpIHsKKwkJCXJlZyA9IGxwYmZpZm8ucmVncyArIExQQkZJRk9fUkVHX0ZJRk9fREFUQTsKKwkJCWRhdGEgPSByZXEtPmRhdGEgKyByZXEtPnBvczsKKwkJCWZvciAoaSA9IDA7IGkgPCB0cmFuc2Zlcl9zaXplOyBpICs9IDQpCisJCQkJb3V0X2JlMzIocmVnLCAqZGF0YSsrKTsKKwkJfQorCisJCS8qIFVubWFzayBib3RoIGVycm9yIGFuZCBjb21wbGV0aW9uIGlycXMgKi8KKwkJb3V0X2JlMzIobHBiZmlmby5yZWdzICsgTFBCRklGT19SRUdfRU5BQkxFLCAweDAwMDAwMzAxKTsKKwl9IGVsc2UgeworCQkvKiBDaG9vc2UgdGhlIGNvcnJlY3QgZGlyZWN0aW9uCisJCSAqCisJCSAqIENvbmZpZ3VyZSB0aGUgd2F0ZXJtYXJrcyBzbyBETUEgd2lsbCBhbHdheXMgY29tcGxldGUgY29ycmVjdGx5LgorCQkgKiBJdCBtYXkgYmUgd29ydGggZXhwZXJpbWVudGluZyB3aXRoIHRoZSBBTEFSTSB2YWx1ZSB0byBzZWUgaWYKKwkJICogdGhlcmUgaXMgYSBwZXJmb3JtYW5jZSBpbXBhY2l0LiAgSG93ZXZlciwgaWYgaXQgaXMgd3JvbmcgdGhlcmUKKwkJICogaXMgYSByaXNrIG9mIERNQSBub3QgdHJhbnNmZXJyaW5nIHRoZSBsYXN0IGNodW5rIG9mIGRhdGEKKwkJICovCisJCWlmICh3cml0ZSkgeworCQkJb3V0X2JlMzIobHBiZmlmby5yZWdzICsgTFBCRklGT19SRUdfRklGT19BTEFSTSwgMHgxZTQpOworCQkJb3V0XzgobHBiZmlmby5yZWdzICsgTFBCRklGT19SRUdfRklGT19DT05UUk9MLCA3KTsKKwkJCWxwYmZpZm8uYmNvbV9jdXJfdGFzayA9IGxwYmZpZm8uYmNvbV90eF90YXNrOworCQl9IGVsc2UgeworCQkJb3V0X2JlMzIobHBiZmlmby5yZWdzICsgTFBCRklGT19SRUdfRklGT19BTEFSTSwgMHgxZmYpOworCQkJb3V0XzgobHBiZmlmby5yZWdzICsgTFBCRklGT19SRUdfRklGT19DT05UUk9MLCAwKTsKKwkJCWxwYmZpZm8uYmNvbV9jdXJfdGFzayA9IGxwYmZpZm8uYmNvbV9yeF90YXNrOworCisJCQlpZiAocG9sbF9kbWEpIHsKKwkJCQlpZiAobHBiZmlmby5kbWFfaXJxc19lbmFibGVkKSB7CisJCQkJCWRpc2FibGVfaXJxKGJjb21fZ2V0X3Rhc2tfaXJxKGxwYmZpZm8uYmNvbV9yeF90YXNrKSk7CisJCQkJCWxwYmZpZm8uZG1hX2lycXNfZW5hYmxlZCA9IDA7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoIWxwYmZpZm8uZG1hX2lycXNfZW5hYmxlZCkgeworCQkJCQllbmFibGVfaXJxKGJjb21fZ2V0X3Rhc2tfaXJxKGxwYmZpZm8uYmNvbV9yeF90YXNrKSk7CisJCQkJCWxwYmZpZm8uZG1hX2lycXNfZW5hYmxlZCA9IDE7CisJCQkJfQorCQkJfQorCQl9CisKKwkJYmQgPSBiY29tX3ByZXBhcmVfbmV4dF9idWZmZXIobHBiZmlmby5iY29tX2N1cl90YXNrKTsKKwkJYmQtPnN0YXR1cyA9IHRyYW5zZmVyX3NpemU7CisJCWlmICghd3JpdGUpIHsKKwkJCS8qCisJCQkgKiBJbiB0aGUgRE1BIHJlYWQgY2FzZSwgdGhlIERNQSBkb2Vzbid0IGNvbXBsZXRlLAorCQkJICogcG9zc2libHkgZHVlIHRvIGluY29ycmVjdCB3YXRlcm1hcmtzIGluIHRoZSBBTEFSTQorCQkJICogYW5kIENPTlRST0wgcmVncy4gRm9yIG5vdyBpbnN0ZWFkIG9mIHRyeWluZyB0bworCQkJICogZGV0ZXJtaW5lIHRoZSByaWdodCB3YXRlcm1hcmtzIHRoYXQgd2lsbCBtYWtlIHRoaXMKKwkJCSAqIHdvcmssIGp1c3QgaW5jcmVhc2UgdGhlIG51bWJlciBvZiBieXRlcyB0aGUgRklGTyBpcworCQkJICogZXhwZWN0aW5nLgorCQkJICoKKwkJCSAqIFdoZW4gc3VibWl0dGluZyBhbm90aGVyIG9wZXJhdGlvbiwgdGhlIEZJRk8gd2lsbCBnZXQKKwkJCSAqIHJlc2V0LCBzbyB0aGUgY29uZGl0aW9uIG9mIHRoZSBGSUZPIHdhaXRpbmcgZm9yIGEKKwkJCSAqIG5vbi1leGlzdGVudCA0IGJ5dGVzIHdpbGwgZ2V0IGNsZWFyZWQuCisJCQkgKi8KKwkJCXRyYW5zZmVyX3NpemUgKz0gNDsgLyogQkxFQ0ghICovCisJCX0KKwkJYmQtPmRhdGFbMF0gPSByZXEtPmRhdGFfcGh5cyArIHJlcS0+cG9zOworCQliY29tX3N1Ym1pdF9uZXh0X2J1ZmZlcihscGJmaWZvLmJjb21fY3VyX3Rhc2ssIE5VTEwpOworCisJCS8qIGVycm9yIGlycSAmIG1hc3RlciBlbmFibGVkIGJpdCAqLworCQliaXRfZmllbGRzID0gMHgwMDAwMDIwMTsKKworCQkvKiBVbm1hc2sgaXJxcyAqLworCQlpZiAod3JpdGUgJiYgKCFwb2xsX2RtYSkpCisJCQliaXRfZmllbGRzIHw9IDB4MDAwMDAxMDA7IC8qIGNvbXBsZXRpb24gaXJxIHRvbyAqLworCQlvdXRfYmUzMihscGJmaWZvLnJlZ3MgKyBMUEJGSUZPX1JFR19FTkFCTEUsIGJpdF9maWVsZHMpOworCX0KKworCS8qIFNldCB0cmFuc2ZlciBzaXplLCB3aWR0aCwgY2hpcCBzZWxlY3QgYW5kIFJFQUQgbW9kZSAqLworCW91dF9iZTMyKGxwYmZpZm8ucmVncyArIExQQkZJRk9fUkVHX1NUQVJUX0FERFJFU1MsCisJCSByZXEtPm9mZnNldCArIHJlcS0+cG9zKTsKKwlvdXRfYmUzMihscGJmaWZvLnJlZ3MgKyBMUEJGSUZPX1JFR19QQUNLRVRfU0laRSwgdHJhbnNmZXJfc2l6ZSk7CisKKwliaXRfZmllbGRzID0gcmVxLT5jcyA8PCAyNCB8IDB4MDAwMDA4OworCWlmICghd3JpdGUpCisJCWJpdF9maWVsZHMgfD0gMHgwMTAwMDA7IC8qIHJlYWQgbW9kZSAqLworCW91dF9iZTMyKGxwYmZpZm8ucmVncyArIExQQkZJRk9fUkVHX0NPTlRST0wsIGJpdF9maWVsZHMpOworCisJLyogS2ljayBpdCBvZmYgKi8KKwlvdXRfOChscGJmaWZvLnJlZ3MgKyBMUEJGSUZPX1JFR19QQUNLRVRfU0laRSwgMHgwMSk7CisJaWYgKGRtYSkKKwkJYmNvbV9lbmFibGUobHBiZmlmby5iY29tX2N1cl90YXNrKTsKK30KKworLyoqCisgKiBtcGM1Mnh4X2xwYmZpZm9faXJxIC0gSVJRIGhhbmRsZXIgZm9yIExQQiBGSUZPCisgKgorICogT24gdHJhbnNtaXQsIHRoZSBkbWEgY29tcGxldGlvbiBpcnEgdHJpZ2dlcnMgYmVmb3JlIHRoZSBmaWZvIGNvbXBsZXRpb24KKyAqIHRyaWdnZXJzLiAgSGFuZGxlIHRoZSBkbWEgY29tcGxldGlvbiBoZXJlIGluc3RlYWQgb2YgdGhlIExQQiBGSUZPIEJlc3Rjb21tCisgKiB0YXNrIGNvbXBsZXRpb24gaXJxIGJlY3Vhc2UgZXZlcnl0aW5nIGlzIG5vdCByZWFsbHkgZG9uZSB1bnRpbCB0aGUgTFBCIEZJRk8KKyAqIGNvbXBsZXRpb24gaXJxIHRyaWdnZXJzLgorICoKKyAqIEluIG90aGVyIHdvcmRzOgorICogRm9yIERNQSwgb24gcmVjZWl2ZSwgdGhlICJGYXQgTGFkeSIgaXMgdGhlIGJlc3Rjb20gY29tcGxldGlvbiBpcnEuIG9uCisgKiB0cmFuc21pdCwgdGhlIGZpZm8gY29tcGxldGlvbiBpcnEgaXMgdGhlICJGYXQgTGFkeSIuIFRoZSBvcGVyYSAob3IgaW4gdGhpcworICogY2FzZSB0aGUgRE1BL0ZJRk8gb3BlcmF0aW9uKSBpcyBub3QgZmluaXNoZWQgdW50aWwgdGhlICJGYXQgTGFkeSIgc2luZ3MuCisgKgorICogUmVhc29ucyBmb3IgZW50ZXJpbmcgdGhpcyByb3V0aW5lOgorICogMSkgUElPIG1vZGUgcnggYW5kIHR4IGNvbXBsZXRpb24gaXJxCisgKiAyKSBETUEgaW50ZXJydXB0IG1vZGUgdHggY29tcGxldGlvbiBpcnEKKyAqIDMpIERNQSBwb2xsZWQgbW9kZSB0eAorICoKKyAqIEV4aXQgY29uZGl0aW9uczoKKyAqIDEpIFRyYW5zZmVyIGFib3J0ZWQKKyAqIDIpIEZJRk8gY29tcGxldGUgd2l0aG91dCBETUE7IG1vcmUgZGF0YSB0byBkbworICogMykgRklGTyBjb21wbGV0ZSB3aXRob3V0IERNQTsgYWxsIGRhdGEgdHJhbnNmZXJlZAorICogNCkgRklGTyBjb21wbGV0ZSB1c2luZyBETUEKKyAqCisgKiBDb25kaXRpb24gMSBjYW4gb2NjdXIgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdCBETUEgaXMgdXNlZC4KKyAqIEl0IHJlcXVpcmVzIGV4ZWN1dGluZyB0aGUgY2FsbGJhY2sgdG8gcmVwb3J0IHRoZSBlcnJvciBhbmQgZXhpdGluZworICogaW1tZWRpYXRlbHkuCisgKgorICogQ29uZGl0aW9uIDIgcmVxdWlyZXMgcHJvZ3JhbW1pbmcgdGhlIEZJRk8gd2l0aCB0aGUgbmV4dCBibG9jayBvZiBkYXRhCisgKgorICogQ29uZGl0aW9uIDMgcmVxdWlyZXMgZXhlY3V0aW5nIHRoZSBjYWxsYmFjayB0byByZXBvcnQgY29tcGxldGlvbgorICoKKyAqIENvbmRpdGlvbiA0IG1lYW5zIHRoZSBzYW1lIGFzIDMsIGV4Y2VwdCB0aGF0IHdlIGFsc28gcmV0cmlldmUgdGhlIGJjb20KKyAqIGJ1ZmZlciBzbyBETUEgZG9lc24ndCBnZXQgY2xvZ2dlZCB1cC4KKyAqCisgKiBUbyBtYWtlIHRoaW5ncyB0cmlja2llciwgdGhlIHNwaW5sb2NrIG11c3QgYmUgZHJvcHBlZCBiZWZvcmUKKyAqIGV4ZWN1dGluZyB0aGUgY2FsbGJhY2ssIG90aGVyd2lzZSB3ZSBjb3VsZCBlbmQgdXAgd2l0aCBhIGRlYWRsb2NrCisgKiBvciBuZXN0ZWQgc3BpbmxvY2sgY29uZGl0aW9uLiAgVGhlIG91dCBwYXRoIGlzIG5vbi10cml2aWFsLCBzbworICogZXh0cmEgZmlkZGxpbmcgaXMgZG9uZSB0byBtYWtlIHN1cmUgYWxsIHBhdGhzIGxlYWQgdG8gdGhlIHNhbWUKKyAqIG91dGJvdW5kIGNvZGUuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBtcGM1Mnh4X2xwYmZpZm9faXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgbXBjNTJ4eF9scGJmaWZvX3JlcXVlc3QgKnJlcTsKKwl1MzIgc3RhdHVzID0gaW5fOChscGJmaWZvLnJlZ3MgKyBMUEJGSUZPX1JFR19CWVRFU19ET05FX1NUQVRVUyk7CisJdm9pZCBfX2lvbWVtICpyZWc7CisJdTMyICpkYXRhOworCWludCBjb3VudCwgaTsKKwlpbnQgZG9fY2FsbGJhY2sgPSAwOworCXUzMiB0czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBkbWEsIHdyaXRlLCBwb2xsX2RtYTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscGJmaWZvLmxvY2ssIGZsYWdzKTsKKwl0cyA9IGdldF90YmwoKTsKKworCXJlcSA9IGxwYmZpZm8ucmVxOworCWlmICghcmVxKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwYmZpZm8ubG9jaywgZmxhZ3MpOworCQlwcl9lcnIoImJvZ3VzIExQQkZJRk8gSVJRXG4iKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWRtYSA9ICEocmVxLT5mbGFncyAmIE1QQzUyWFhfTFBCRklGT19GTEFHX05PX0RNQSk7CisJd3JpdGUgPSByZXEtPmZsYWdzICYgTVBDNTJYWF9MUEJGSUZPX0ZMQUdfV1JJVEU7CisJcG9sbF9kbWEgPSByZXEtPmZsYWdzICYgTVBDNTJYWF9MUEJGSUZPX0ZMQUdfUE9MTF9ETUE7CisKKwlpZiAoZG1hICYmICF3cml0ZSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscGJmaWZvLmxvY2ssIGZsYWdzKTsKKwkJcHJfZXJyKCJib2d1cyBMUEJGSUZPIElSUSAoZG1hIGFuZCBub3Qgd3JpdHRpbmcpXG4iKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWlmICgoc3RhdHVzICYgMHgwMSkgPT0gMCkgeworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBjaGVjayBhYm9ydCBiaXQgKi8KKwlpZiAoc3RhdHVzICYgMHgxMCkgeworCQlvdXRfYmUzMihscGJmaWZvLnJlZ3MgKyBMUEJGSUZPX1JFR19FTkFCTEUsIDB4MDEwMTAwMDApOworCQlkb19jYWxsYmFjayA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFJlYWQgcmVzdWx0IGZyb20gaGFyZHdhcmUgKi8KKwljb3VudCA9IGluX2JlMzIobHBiZmlmby5yZWdzICsgTFBCRklGT19SRUdfQllURVNfRE9ORV9TVEFUVVMpOworCWNvdW50ICY9IDB4MDBmZmZmZmY7CisKKwlpZiAoIWRtYSAmJiAhd3JpdGUpIHsKKwkJLyogY29weSB0aGUgZGF0YSBvdXQgb2YgdGhlIEZJRk8gKi8KKwkJcmVnID0gbHBiZmlmby5yZWdzICsgTFBCRklGT19SRUdfRklGT19EQVRBOworCQlkYXRhID0gcmVxLT5kYXRhICsgcmVxLT5wb3M7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSArPSA0KQorCQkJKmRhdGErKyA9IGluX2JlMzIocmVnKTsKKwl9CisKKwkvKiBVcGRhdGUgdHJhbnNmZXIgcG9zaXRpb24gYW5kIGNvdW50ICovCisJcmVxLT5wb3MgKz0gY291bnQ7CisKKwkvKiBEZWNpZGUgd2hhdCB0byBkbyBuZXh0ICovCisJaWYgKHJlcS0+c2l6ZSAtIHJlcS0+cG9zKQorCQltcGM1Mnh4X2xwYmZpZm9fa2ljayhyZXEpOyAvKiBtb3JlIHdvcmsgdG8gZG8gKi8KKwllbHNlCisJCWRvX2NhbGxiYWNrID0gMTsKKworIG91dDoKKwkvKiBDbGVhciB0aGUgSVJRICovCisJb3V0XzgobHBiZmlmby5yZWdzICsgTFBCRklGT19SRUdfQllURVNfRE9ORV9TVEFUVVMsIDB4MDEpOworCisJaWYgKGRtYSAmJiAoc3RhdHVzICYgMHgxMSkpIHsKKwkJLyoKKwkJICogQ291bnQgdGhlIERNQSBhcyBjb21wbGV0ZSBvbmx5IHdoZW4gdGhlIEZJRk8gY29tcGxldGlvbgorCQkgKiBzdGF0dXMgb3IgYWJvcnQgYml0cyBhcmUgc2V0LgorCQkgKgorCQkgKiAoc3RhdHVzICYgMHgwMSkgc2hvdWxkIGFsd2F5cyBiZSB0aGUgY2FzZSBleGNlcHQgc29tZXRpbWVzCisJCSAqIHdoZW4gdXNpbmcgcG9sbGVkIERNQS4KKwkJICoKKwkJICogKHN0YXR1cyAmIDB4MTApIHt0cmFuc2ZlciBhYm9ydGVkfTogVGhpcyBjYXNlIG5lZWRzIG1vcmUKKwkJICogdGVzdGluZy4KKwkJICovCisJCWJjb21fcmV0cmlldmVfYnVmZmVyKGxwYmZpZm8uYmNvbV9jdXJfdGFzaywgJnN0YXR1cywgTlVMTCk7CisJfQorCXJlcS0+bGFzdF9ieXRlID0gKCh1OCAqKXJlcS0+ZGF0YSlbcmVxLT5zaXplIC0gMV07CisKKwkvKiBXaGVuIHRoZSBkb19jYWxsYmFjayBmbGFnIGlzIHNldDsgaXQgbWVhbnMgdGhlIHRyYW5zZmVyIGlzIGZpbmlzaGVkCisJICogc28gc2V0IHRoZSBGSUZPIGFzIGlkbGUgKi8KKwlpZiAoZG9fY2FsbGJhY2spCisJCWxwYmZpZm8ucmVxID0gTlVMTDsKKworCWlmIChpcnEgIT0gMCkgLyogZG9uJ3QgaW5jcmVtZW50IG9uIHBvbGxlZCBjYXNlICovCisJCXJlcS0+aXJxX2NvdW50Kys7CisKKwlyZXEtPmlycV90aWNrcyArPSBnZXRfdGJsKCkgLSB0czsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscGJmaWZvLmxvY2ssIGZsYWdzKTsKKworCS8qIFNwaW5sb2NrIGlzIHJlbGVhc2VkOyBpdCBpcyBub3cgc2FmZSB0byBjYWxsIHRoZSBjYWxsYmFjayAqLworCWlmIChkb19jYWxsYmFjayAmJiByZXEtPmNhbGxiYWNrKQorCQlyZXEtPmNhbGxiYWNrKHJlcSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKgorICogbXBjNTJ4eF9scGJmaWZvX2Jjb21faXJxIC0gSVJRIGhhbmRsZXIgZm9yIExQQiBGSUZPIEJlc3Rjb21tIHRhc2sKKyAqCisgKiBPbmx5IHVzZWQgd2hlbiByZWNlaXZpbmcgZGF0YS4KKyAqLworc3RhdGljIGlycXJldHVybl90IG1wYzUyeHhfbHBiZmlmb19iY29tX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG1wYzUyeHhfbHBiZmlmb19yZXF1ZXN0ICpyZXE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgc3RhdHVzOworCXUzMiB0czsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscGJmaWZvLmxvY2ssIGZsYWdzKTsKKwl0cyA9IGdldF90YmwoKTsKKworCXJlcSA9IGxwYmZpZm8ucmVxOworCWlmICghcmVxIHx8IChyZXEtPmZsYWdzICYgTVBDNTJYWF9MUEJGSUZPX0ZMQUdfTk9fRE1BKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscGJmaWZvLmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWlmIChpcnEgIT0gMCkgLyogZG9uJ3QgaW5jcmVtZW50IG9uIHBvbGxlZCBjYXNlICovCisJCXJlcS0+aXJxX2NvdW50Kys7CisKKwlpZiAoIWJjb21fYnVmZmVyX2RvbmUobHBiZmlmby5iY29tX2N1cl90YXNrKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscGJmaWZvLmxvY2ssIGZsYWdzKTsKKworCQlyZXEtPmJ1ZmZlcl9ub3RfZG9uZV9jbnQrKzsKKwkJaWYgKChyZXEtPmJ1ZmZlcl9ub3RfZG9uZV9jbnQgJSAxMDAwKSA9PSAwKQorCQkJcHJfZXJyKCJ0cmFuc2ZlciBzdGFsbGVkXG4iKTsKKworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJYmNvbV9yZXRyaWV2ZV9idWZmZXIobHBiZmlmby5iY29tX2N1cl90YXNrLCAmc3RhdHVzLCBOVUxMKTsKKworCXJlcS0+bGFzdF9ieXRlID0gKCh1OCAqKXJlcS0+ZGF0YSlbcmVxLT5zaXplIC0gMV07CisKKwlyZXEtPnBvcyA9IHN0YXR1cyAmIDB4MDBmZmZmZmY7CisKKwkvKiBNYXJrIHRoZSBGSUZPIGFzIGlkbGUgKi8KKwlscGJmaWZvLnJlcSA9IE5VTEw7CisKKwkvKiBSZWxlYXNlIHRoZSBsb2NrIGJlZm9yZSBjYWxsaW5nIG91dCB0byB0aGUgY2FsbGJhY2suICovCisJcmVxLT5pcnFfdGlja3MgKz0gZ2V0X3RibCgpIC0gdHM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHBiZmlmby5sb2NrLCBmbGFncyk7CisKKwlpZiAocmVxLT5jYWxsYmFjaykKKwkJcmVxLT5jYWxsYmFjayhyZXEpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioKKyAqIG1wYzUyeHhfbHBiZmlmb19iY29tX3BvbGwgLSBQb2xsIGZvciBETUEgY29tcGxldGlvbgorICovCit2b2lkIG1wYzUyeHhfbHBiZmlmb19wb2xsKHZvaWQpCit7CisJc3RydWN0IG1wYzUyeHhfbHBiZmlmb19yZXF1ZXN0ICpyZXEgPSBscGJmaWZvLnJlcTsKKwlpbnQgZG1hID0gIShyZXEtPmZsYWdzICYgTVBDNTJYWF9MUEJGSUZPX0ZMQUdfTk9fRE1BKTsKKwlpbnQgd3JpdGUgPSByZXEtPmZsYWdzICYgTVBDNTJYWF9MUEJGSUZPX0ZMQUdfV1JJVEU7CisKKwkvKgorCSAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgY29tbWVudHMgb24gdGhlICJGYXQgTGFkeSIgCisJICovCisJaWYgKGRtYSAmJiB3cml0ZSkKKwkJbXBjNTJ4eF9scGJmaWZvX2lycSgwLCBOVUxMKTsKKwllbHNlIAorCQltcGM1Mnh4X2xwYmZpZm9fYmNvbV9pcnEoMCwgTlVMTCk7Cit9CitFWFBPUlRfU1lNQk9MKG1wYzUyeHhfbHBiZmlmb19wb2xsKTsKKworLyoqCisgKiBtcGM1Mnh4X2xwYmZpZm9fc3VibWl0IC0gU3VibWl0IGFuIExQQiBGSUZPIHRyYW5zZmVyIHJlcXVlc3QuCisgKiBAcmVxOiBQb2ludGVyIHRvIHJlcXVlc3Qgc3RydWN0dXJlCisgKi8KK2ludCBtcGM1Mnh4X2xwYmZpZm9fc3VibWl0KHN0cnVjdCBtcGM1Mnh4X2xwYmZpZm9fcmVxdWVzdCAqcmVxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWxwYmZpZm8ucmVncykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHBiZmlmby5sb2NrLCBmbGFncyk7CisKKwkvKiBJZiB0aGUgcmVxIHBvaW50ZXIgaXMgYWxyZWFkeSBzZXQsIHRoZW4gYSB0cmFuc2ZlciBpcyBpbiBwcm9ncmVzcyAqLworCWlmIChscGJmaWZvLnJlcSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscGJmaWZvLmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBTZXR1cCB0aGUgdHJhbnNmZXIgKi8KKwlscGJmaWZvLnJlcSA9IHJlcTsKKwlyZXEtPmlycV9jb3VudCA9IDA7CisJcmVxLT5pcnFfdGlja3MgPSAwOworCXJlcS0+YnVmZmVyX25vdF9kb25lX2NudCA9IDA7CisJcmVxLT5wb3MgPSAwOworCisJbXBjNTJ4eF9scGJmaWZvX2tpY2socmVxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscGJmaWZvLmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wobXBjNTJ4eF9scGJmaWZvX3N1Ym1pdCk7CisKK3ZvaWQgbXBjNTJ4eF9scGJmaWZvX2Fib3J0KHN0cnVjdCBtcGM1Mnh4X2xwYmZpZm9fcmVxdWVzdCAqcmVxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHBiZmlmby5sb2NrLCBmbGFncyk7CisJaWYgKGxwYmZpZm8ucmVxID09IHJlcSkgeworCQkvKiBQdXQgaXQgaW50byByZXNldCBhbmQgY2xlYXIgdGhlIHN0YXRlICovCisJCWJjb21fZ2VuX2JkX3J4X3Jlc2V0KGxwYmZpZm8uYmNvbV9yeF90YXNrKTsKKwkJYmNvbV9nZW5fYmRfdHhfcmVzZXQobHBiZmlmby5iY29tX3R4X3Rhc2spOworCQlvdXRfYmUzMihscGJmaWZvLnJlZ3MgKyBMUEJGSUZPX1JFR19FTkFCTEUsIDB4MDEwMTAwMDApOworCQlscGJmaWZvLnJlcSA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwYmZpZm8ubG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChtcGM1Mnh4X2xwYmZpZm9fYWJvcnQpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdAorbXBjNTJ4eF9scGJmaWZvX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzOworCWludCByYyA9IC1FTk9NRU07CisKKwlpZiAobHBiZmlmby5kZXYgIT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlscGJmaWZvLmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG9wLT5ub2RlLCAwKTsKKwlpZiAoIWxwYmZpZm8uaXJxKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG9wLT5ub2RlLCAwLCAmcmVzKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJbHBiZmlmby5yZWdzX3BoeXMgPSByZXMuc3RhcnQ7CisJbHBiZmlmby5yZWdzID0gb2ZfaW9tYXAob3AtPm5vZGUsIDApOworCWlmICghbHBiZmlmby5yZWdzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pbml0KCZscGJmaWZvLmxvY2spOworCisJLyogUHV0IEZJRk8gaW50byByZXNldCAqLworCW91dF9iZTMyKGxwYmZpZm8ucmVncyArIExQQkZJRk9fUkVHX0VOQUJMRSwgMHgwMTAxMDAwMCk7CisKKwkvKiBSZWdpc3RlciB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwlyYyA9IHJlcXVlc3RfaXJxKGxwYmZpZm8uaXJxLCBtcGM1Mnh4X2xwYmZpZm9faXJxLCAwLAorCQkJICJtcGM1Mnh4LWxwYmZpZm8iLCAmbHBiZmlmbyk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9pcnE7CisKKwkvKiBSZXF1ZXN0IHRoZSBCZXN0Y29tbSByZWNlaXZlIChmaWZvIC0tPiBtZW1vcnkpIHRhc2sgYW5kIElSUSAqLworCWxwYmZpZm8uYmNvbV9yeF90YXNrID0KKwkJYmNvbV9nZW5fYmRfcnhfaW5pdCgyLCByZXMuc3RhcnQgKyBMUEJGSUZPX1JFR19GSUZPX0RBVEEsCisJCQkJICAgIEJDT01fSU5JVElBVE9SX1NDTFBDLCBCQ09NX0lQUl9TQ0xQQywKKwkJCQkgICAgMTYqMTAyNCoxMDI0KTsKKwlpZiAoIWxwYmZpZm8uYmNvbV9yeF90YXNrKQorCQlnb3RvIGVycl9iY29tX3J4OworCisJcmMgPSByZXF1ZXN0X2lycShiY29tX2dldF90YXNrX2lycShscGJmaWZvLmJjb21fcnhfdGFzayksCisJCQkgbXBjNTJ4eF9scGJmaWZvX2Jjb21faXJxLCAwLAorCQkJICJtcGM1Mnh4LWxwYmZpZm8tcngiLCAmbHBiZmlmbyk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9iY29tX3J4X2lycTsKKworCS8qIFJlcXVlc3QgdGhlIEJlc3Rjb21tIHRyYW5zbWl0IChtZW1vcnkgLS0+IGZpZm8pIHRhc2sgYW5kIElSUSAqLworCWxwYmZpZm8uYmNvbV90eF90YXNrID0KKwkJYmNvbV9nZW5fYmRfdHhfaW5pdCgyLCByZXMuc3RhcnQgKyBMUEJGSUZPX1JFR19GSUZPX0RBVEEsCisJCQkJICAgIEJDT01fSU5JVElBVE9SX1NDTFBDLCBCQ09NX0lQUl9TQ0xQQyk7CisJaWYgKCFscGJmaWZvLmJjb21fdHhfdGFzaykKKwkJZ290byBlcnJfYmNvbV90eDsKKworCWxwYmZpZm8uZGV2ID0gJm9wLT5kZXY7CisJcmV0dXJuIDA7CisKKyBlcnJfYmNvbV90eDoKKwlmcmVlX2lycShiY29tX2dldF90YXNrX2lycShscGJmaWZvLmJjb21fcnhfdGFzayksICZscGJmaWZvKTsKKyBlcnJfYmNvbV9yeF9pcnE6CisJYmNvbV9nZW5fYmRfcnhfcmVsZWFzZShscGJmaWZvLmJjb21fcnhfdGFzayk7CisgZXJyX2Jjb21fcng6CisgZXJyX2lycToKKwlpb3VubWFwKGxwYmZpZm8ucmVncyk7CisJbHBiZmlmby5yZWdzID0gTlVMTDsKKworCWRldl9lcnIoJm9wLT5kZXYsICJtcGM1Mnh4X2xwYmZpZm9fcHJvYmUoKSBmYWlsZWRcbiIpOworCXJldHVybiAtRU5PREVWOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZleGl0IG1wYzUyeHhfbHBiZmlmb19yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqb3ApCit7CisJaWYgKGxwYmZpZm8uZGV2ICE9ICZvcC0+ZGV2KQorCQlyZXR1cm4gMDsKKworCS8qIFB1dCBGSUZPIGluIHJlc2V0ICovCisJb3V0X2JlMzIobHBiZmlmby5yZWdzICsgTFBCRklGT19SRUdfRU5BQkxFLCAweDAxMDEwMDAwKTsKKworCS8qIFJlbGVhc2UgdGhlIGJlc3Rjb21tIHRyYW5zbWl0IHRhc2sgKi8KKwlmcmVlX2lycShiY29tX2dldF90YXNrX2lycShscGJmaWZvLmJjb21fdHhfdGFzayksICZscGJmaWZvKTsKKwliY29tX2dlbl9iZF90eF9yZWxlYXNlKGxwYmZpZm8uYmNvbV90eF90YXNrKTsKKwkKKwkvKiBSZWxlYXNlIHRoZSBiZXN0Y29tbSByZWNlaXZlIHRhc2sgKi8KKwlmcmVlX2lycShiY29tX2dldF90YXNrX2lycShscGJmaWZvLmJjb21fcnhfdGFzayksICZscGJmaWZvKTsKKwliY29tX2dlbl9iZF9yeF9yZWxlYXNlKGxwYmZpZm8uYmNvbV9yeF90YXNrKTsKKworCWZyZWVfaXJxKGxwYmZpZm8uaXJxLCAmbHBiZmlmbyk7CisJaW91bm1hcChscGJmaWZvLnJlZ3MpOworCWxwYmZpZm8ucmVncyA9IE5VTEw7CisJbHBiZmlmby5kZXYgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1wYzUyeHhfbHBiZmlmb19tYXRjaFtdIF9fZGV2aW5pdGNvbnN0ID0geworCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDAtbHBiZmlmbyIsIH0sCisJe30sCit9OworCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBtcGM1Mnh4X2xwYmZpZm9fZHJpdmVyID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5uYW1lID0gIm1wYzUyeHgtbHBiZmlmbyIsCisJLm1hdGNoX3RhYmxlID0gbXBjNTJ4eF9scGJmaWZvX21hdGNoLAorCS5wcm9iZSA9IG1wYzUyeHhfbHBiZmlmb19wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AobXBjNTJ4eF9scGJmaWZvX3JlbW92ZSksCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1vZHVsZSBpbml0L2V4aXQKKyAqLworc3RhdGljIGludCBfX2luaXQgbXBjNTJ4eF9scGJmaWZvX2luaXQodm9pZCkKK3sKKwlwcl9kZWJ1ZygiUmVnaXN0ZXJpbmcgTG9jYWxQbHVzIGJ1cyBGSUZPIGRyaXZlclxuIik7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmbXBjNTJ4eF9scGJmaWZvX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChtcGM1Mnh4X2xwYmZpZm9faW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtcGM1Mnh4X2xwYmZpZm9fZXhpdCh2b2lkKQoreworCXByX2RlYnVnKCJVbnJlZ2lzdGVyaW5nIExvY2FsUGx1cyBidXMgRklGTyBkcml2ZXJcbiIpOworCW9mX3VucmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZtcGM1Mnh4X2xwYmZpZm9fZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KG1wYzUyeHhfbHBiZmlmb19leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BpYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGljLmMKaW5kZXggNDgwZjgwNi4uNGJmNGJmNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGljLmMKQEAgLTIyMCw3ICsyMjAsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIG1wYzUyeHhfZXh0aXJxX2lycWNoaXAgPSB7Ci0JLnR5cGVuYW1lID0gIk1QQzUyeHggRXh0ZXJuYWwiLAorCS5uYW1lID0gIk1QQzUyeHggRXh0ZXJuYWwiLAogCS5tYXNrID0gbXBjNTJ4eF9leHRpcnFfbWFzaywKIAkudW5tYXNrID0gbXBjNTJ4eF9leHRpcnFfdW5tYXNrLAogCS5hY2sgPSBtcGM1Mnh4X2V4dGlycV9hY2ssCkBAIC0yNTgsNyArMjU4LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBtcGM1Mnh4X21haW5faXJxY2hpcCA9IHsKLQkudHlwZW5hbWUgPSAiTVBDNTJ4eCBNYWluIiwKKwkubmFtZSA9ICJNUEM1Mnh4IE1haW4iLAogCS5tYXNrID0gbXBjNTJ4eF9tYWluX21hc2ssCiAJLm1hc2tfYWNrID0gbXBjNTJ4eF9tYWluX21hc2ssCiAJLnVubWFzayA9IG1wYzUyeHhfbWFpbl91bm1hc2ssCkBAIC0yOTEsNyArMjkxLDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBtcGM1Mnh4X3BlcmlwaF9pcnFjaGlwID0gewotCS50eXBlbmFtZSA9ICJNUEM1Mnh4IFBlcmlwaGVyYWxzIiwKKwkubmFtZSA9ICJNUEM1Mnh4IFBlcmlwaGVyYWxzIiwKIAkubWFzayA9IG1wYzUyeHhfcGVyaXBoX21hc2ssCiAJLm1hc2tfYWNrID0gbXBjNTJ4eF9wZXJpcGhfbWFzaywKIAkudW5tYXNrID0gbXBjNTJ4eF9wZXJpcGhfdW5tYXNrLApAQCAtMzM1LDcgKzMzNSw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgbXBjNTJ4eF9zZG1hX2lycWNoaXAgPSB7Ci0JLnR5cGVuYW1lID0gIk1QQzUyeHggU0RNQSIsCisJLm5hbWUgPSAiTVBDNTJ4eCBTRE1BIiwKIAkubWFzayA9IG1wYzUyeHhfc2RtYV9tYXNrLAogCS51bm1hc2sgPSBtcGM1Mnh4X3NkbWFfdW5tYXNrLAogCS5hY2sgPSBtcGM1Mnh4X3NkbWFfYWNrLApAQCAtMzU1LDcgKzM1NSw3IEBACiAgKiBtcGM1Mnh4X2lycWhvc3RfeGxhdGUgLSB0cmFuc2xhdGUgdmlycSMgZnJvbSBkZXZpY2UgdHJlZSBpbnRlcnJ1cHRzIHByb3BlcnR5CiAgKi8KIHN0YXRpYyBpbnQgbXBjNTJ4eF9pcnFob3N0X3hsYXRlKHN0cnVjdCBpcnFfaG9zdCAqaCwgc3RydWN0IGRldmljZV9ub2RlICpjdCwKLQkJCQkgdTMyICppbnRzcGVjLCB1bnNpZ25lZCBpbnQgaW50c2l6ZSwKKwkJCQkgY29uc3QgdTMyICppbnRzcGVjLCB1bnNpZ25lZCBpbnQgaW50c2l6ZSwKIAkJCQkgaXJxX2h3X251bWJlcl90ICpvdXRfaHdpcnEsCiAJCQkJIHVuc2lnbmVkIGludCAqb3V0X2ZsYWdzKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L3BxMmFkcy1wY2ktcGljLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvcHEyYWRzLXBjaS1waWMuYwppbmRleCA3ZWU5NzlmLi45ZDk2MmQ3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvcHEyYWRzLXBjaS1waWMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvcHEyYWRzLXBjaS1waWMuYwpAQCAtNjksNyArNjksNiBAQAogfQogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHBxMmFkc19wY2lfaWMgPSB7Ci0JLnR5cGVuYW1lID0gIlBRMiBBRFMgUENJIiwKIAkubmFtZSA9ICJQUTIgQURTIFBDSSIsCiAJLmVuZCA9IHBxMmFkc19wY2lfdW5tYXNrX2lycSwKIAkubWFzayA9IHBxMmFkc19wY2lfbWFza19pcnEsCkBAIC0xMDcsNyArMTA2LDcgQEAKIHN0YXRpYyBpbnQgcGNpX3BpY19ob3N0X21hcChzdHJ1Y3QgaXJxX2hvc3QgKmgsIHVuc2lnbmVkIGludCB2aXJxLAogCQkJICAgIGlycV9od19udW1iZXJfdCBodykKIHsKLQlnZXRfaXJxX2Rlc2ModmlycSktPnN0YXR1cyB8PSBJUlFfTEVWRUw7CisJaXJxX3RvX2Rlc2ModmlycSktPnN0YXR1cyB8PSBJUlFfTEVWRUw7CiAJc2V0X2lycV9jaGlwX2RhdGEodmlycSwgaC0+aG9zdF9kYXRhKTsKIAlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIodmlycSwgJnBxMmFkc19wY2lfaWMsIGhhbmRsZV9sZXZlbF9pcnEpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfcmRiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9yZGIuYwppbmRleCA1NjdkZWQ3Li4xN2Y5OTc0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9yZGIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9yZGIuYwpAQCAtNzQsNyArNzQsNyBAQAogCiAJCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJtb2RlIiwgTlVMTCk7CiAJCWlmIChwcm9wICYmICFzdHJjbXAocHJvcCwgImNwdS1xZSIpKQotCQkJcGRhdGEucWVfbW9kZSA9IDE7CisJCQlwZGF0YS5mbGFncyA9IFNQSV9RRV9DUFVfTU9ERTsKIAogCQlmb3IgKGogPSAwOyBqIDwgbnVtX2JvYXJkX2luZm9zOyBqKyspIHsKIAkJCWlmIChib2FyZF9pbmZvc1tqXS5idXNfbnVtID09IHBkYXRhLmJ1c19udW0pCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvc3VzcGVuZC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3N1c3BlbmQuYwppbmRleCAwOGU2NWZjLi5kMzA2ZjA3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvc3VzcGVuZC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9zdXNwZW5kLmMKQEAgLTk2LDYgKzk2LDcgQEAKIHsKIAlyZXR1cm4gZGVlcF9zbGVlcGluZzsKIH0KK0VYUE9SVF9TWU1CT0woZnNsX2RlZXBfc2xlZXApOwogCiBzdGF0aWMgaW50IG1wYzgzeHhfY2hhbmdlX3N0YXRlKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9LY29uZmlnCmluZGV4IGQzYTk3NWUuLmQ5NTEyMTggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9LY29uZmlnCkBAIC0xLDYgKzEsNyBAQAotbWVudWNvbmZpZyBNUEM4NXh4Ci0JYm9vbCAiTWFjaGluZSBUeXBlIgotCWRlcGVuZHMgb24gUFBDXzg1eHgKK21lbnVjb25maWcgRlNMX1NPQ19CT09LRQorCWJvb2wgIkZyZWVzY2FsZSBCb29rLUUgTWFjaGluZSBUeXBlIgorCWRlcGVuZHMgb24gUFBDXzg1eHggfHwgUFBDX0JPT0szRQorCXNlbGVjdCBGU0xfU09DCiAJc2VsZWN0IFBQQ19VREJHXzE2NTUwCiAJc2VsZWN0IE1QSUMKIAlzZWxlY3QgUFBDX1BDSV9DSE9JQ0UKQEAgLTgsNyArOSw3IEBACiAJc2VsZWN0IFNFUklBTF84MjUwX1NIQVJFX0lSUSBpZiBTRVJJQUxfODI1MAogCWRlZmF1bHQgeQogCi1pZiBNUEM4NXh4CitpZiBGU0xfU09DX0JPT0tFCiAKIGNvbmZpZyBNUEM4NTQwX0FEUwogCWJvb2wgIkZyZWVzY2FsZSBNUEM4NTQwIEFEUyIKQEAgLTE0NCw3ICsxNDUsMTkgQEAKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBXaW5kIFJpdmVyIFNCQzg1NjAgYm9hcmQKIAotZW5kaWYgIyBNUEM4NXh4Citjb25maWcgUDQwODBfRFMKKwlib29sICJGcmVlc2NhbGUgUDQwODAgRFMiCisJc2VsZWN0IERFRkFVTFRfVUlNQUdFCisJc2VsZWN0IFBQQ19GU0xfQk9PSzNFCisJc2VsZWN0IFBQQ19FNTAwTUMKKwlzZWxlY3QgUEhZU182NEJJVAorCXNlbGVjdCBTV0lPVExCCisJc2VsZWN0IE1QQzh4eHhfR1BJTworCXNlbGVjdCBIQVNfUkFQSURJTworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFA0MDgwIERTIGJvYXJkCisKK2VuZGlmICMgRlNMX1NPQ19CT09LRQogCiBjb25maWcgVFFNODV4eAogCWJvb2wKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9NYWtlZmlsZQppbmRleCA5MDk4YWVhLi4zODdjMTI4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L01ha2VmaWxlCkBAIC0xMCw2ICsxMCw3IEBACiBvYmotJChDT05GSUdfTVBDODV4eF9EUykgICs9IG1wYzg1eHhfZHMubwogb2JqLSQoQ09ORklHX01QQzg1eHhfTURTKSArPSBtcGM4NXh4X21kcy5vCiBvYmotJChDT05GSUdfTVBDODV4eF9SREIpICs9IG1wYzg1eHhfcmRiLm8KK29iai0kKENPTkZJR19QNDA4MF9EUykgICAgKz0gcDQwODBfZHMubyBjb3JlbmV0X2RzLm8KIG9iai0kKENPTkZJR19TVFhfR1AzKQkgICs9IHN0eF9ncDMubwogb2JqLSQoQ09ORklHX1RRTTg1eHgpCSAgKz0gdHFtODV4eC5vCiBvYmotJChDT05GSUdfU0JDODU2MCkgICAgICs9IHNiYzg1NjAubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L2NvcmVuZXRfZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9jb3JlbmV0X2RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM0YzJlYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9jb3JlbmV0X2RzLmMKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3JlbmV0IGJhc2VkIFNvQyBEUyBTZXR1cAorICoKKyAqIE1haW50YWluZWQgYnkgS3VtYXIgR2FsYSAoc2VlIE1BSU5UQUlORVJTIGZvciBjb250YWN0IGluZm9ybWF0aW9uKQorICoKKyAqIENvcHlyaWdodCAyMDA5IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xtYi5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS90aW1lLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2luY2x1ZGUgPG1tL21tdV9kZWNsLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vdWRiZy5oPgorI2luY2x1ZGUgPGFzbS9tcGljLmg+CisKKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CisjaW5jbHVkZSA8c3lzZGV2L2ZzbF9wY2kuaD4KKwordm9pZCBfX2luaXQgY29yZW5ldF9kc19waWNfaW5pdCh2b2lkKQoreworCXN0cnVjdCBtcGljICptcGljOworCXN0cnVjdCByZXNvdXJjZSByOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBOVUxMOworCXVuc2lnbmVkIGludCBmbGFncyA9IE1QSUNfUFJJTUFSWSB8IE1QSUNfQklHX0VORElBTiB8CisJCQkJTVBJQ19CUk9LRU5fRlJSX05JUlFTIHwgTVBJQ19TSU5HTEVfREVTVF9DUFU7CisKKwlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAib3Blbi1waWMiKTsKKworCWlmIChucCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IGZpbmQgb3Blbi1waWMgbm9kZVxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIG1hcCBtcGljIHJlZ2lzdGVyIHNwYWNlXG4iKTsKKwkJb2Zfbm9kZV9wdXQobnApOworCQlyZXR1cm47CisJfQorCisJaWYgKHBwY19tZC5nZXRfaXJxID09IG1waWNfZ2V0X2NvcmVpbnRfaXJxKQorCQlmbGFncyB8PSBNUElDX0VOQUJMRV9DT1JFSU5UOworCisJbXBpYyA9IG1waWNfYWxsb2MobnAsIHIuc3RhcnQsIGZsYWdzLCAwLCAyNTYsICIgT3BlblBJQyAgIik7CisJQlVHX09OKG1waWMgPT0gTlVMTCk7CisKKwltcGljX2luaXQobXBpYyk7Cit9CisKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgaW50IHByaW1hcnlfcGhiX2FkZHI7CisjZW5kaWYKKworLyoKKyAqIFNldHVwIHRoZSBhcmNoaXRlY3R1cmUKKyAqLworI2lmZGVmIENPTkZJR19TTVAKK3ZvaWQgX19pbml0IG1wYzg1eHhfc21wX2luaXQodm9pZCk7CisjZW5kaWYKKwordm9pZCBfX2luaXQgY29yZW5ldF9kc19zZXR1cF9hcmNoKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1BDSQorCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOworI2VuZGlmCisJZG1hX2FkZHJfdCBtYXggPSAweGZmZmZmZmZmOworCisjaWZkZWYgQ09ORklHX1NNUAorCW1wYzg1eHhfc21wX2luaXQoKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BDSQorCWZvcl9lYWNoX2NvbXBhdGlibGVfbm9kZShucCwgInBjaSIsICJmc2wscDQwODAtcGNpZSIpIHsKKwkJc3RydWN0IHJlc291cmNlIHJzcmM7CisJCW9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyc3JjKTsKKwkJaWYgKChyc3JjLnN0YXJ0ICYgMHhmZmZmZikgPT0gcHJpbWFyeV9waGJfYWRkcikKKwkJCWZzbF9hZGRfYnJpZGdlKG5wLCAxKTsKKwkJZWxzZQorCQkJZnNsX2FkZF9icmlkZ2UobnAsIDApOworCisJCWhvc2UgPSBwY2lfZmluZF9ob3NlX2Zvcl9PRl9kZXZpY2UobnApOworCQltYXggPSBtaW4obWF4LCBob3NlLT5kbWFfd2luZG93X2Jhc2VfY3VyICsKKwkJCQlob3NlLT5kbWFfd2luZG93X3NpemUpOworCX0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NXSU9UTEIKKwlpZiAobG1iX2VuZF9vZl9EUkFNKCkgPiBtYXgpIHsKKwkJcHBjX3N3aW90bGJfZW5hYmxlID0gMTsKKwkJc2V0X3BjaV9kbWFfb3BzKCZzd2lvdGxiX2RtYV9vcHMpOworCQlwcGNfbWQucGNpX2RtYV9kZXZfc2V0dXAgPSBwY2lfZG1hX2Rldl9zZXR1cF9zd2lvdGxiOworCX0KKyNlbmRpZgorCXByX2luZm8oIiVzIGJvYXJkIGZyb20gRnJlZXNjYWxlIFNlbWljb25kdWN0b3JcbiIsIHBwY19tZC5uYW1lKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfZGV2aWNlX2lkc1tdIF9fZGV2aW5pdGNvbnN0ID0geworCXsKKwkJLmNvbXBhdGlibGUJPSAic2ltcGxlLWJ1cyIKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUJPSAiZnNsLHJhcGlkaW8tZGVsdGEiLAorCX0sCisJe30KK307CisKK2ludCBfX2luaXQgY29yZW5ldF9kc19wdWJsaXNoX2RldmljZXModm9pZCkKK3sKKwlyZXR1cm4gb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIG9mX2RldmljZV9pZHMsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L2NvcmVuZXRfZHMuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9jb3JlbmV0X2RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRkNzAwYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9jb3JlbmV0X2RzLmgKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIENvcmVuZXQgYmFzZWQgU29DIERTIFNldHVwCisgKgorICogQ29weXJpZ2h0IDIwMDkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpZm5kZWYgQ09SRU5FVF9EU19ICisjZGVmaW5lIENPUkVORVRfRFNfSAorCitleHRlcm4gdm9pZCBfX2luaXQgY29yZW5ldF9kc19waWNfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIF9faW5pdCBjb3JlbmV0X2RzX3NldHVwX2FyY2godm9pZCk7CitleHRlcm4gaW50IF9faW5pdCBjb3JlbmV0X2RzX3B1Ymxpc2hfZGV2aWNlcyh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9tZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X21kcy5jCmluZGV4IDM5MDlkNTcuLmM1MDI4YTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X21kcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X21kcy5jCkBAIC0zMDEsNiArMzAxLDcgQEAKIAl7IC5jb21wYXRpYmxlID0gImZzbCxxZSIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJnaWFuZmFyIiwgfSwKIAl7IC5jb21wYXRpYmxlID0gImZzbCxyYXBpZGlvLWRlbHRhIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LWd1dHMiLCB9LAogCXt9LAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfcmRiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9yZGIuYwppbmRleCBjODQ2OGRlLi4wODhmMzBiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9yZGIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9yZGIuYwpAQCAtNDQsNiArNDQsNyBAQAogCXN0cnVjdCBtcGljICptcGljOwogCXN0cnVjdCByZXNvdXJjZSByOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJdW5zaWduZWQgbG9uZyByb290ID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOwogCiAJbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAib3Blbi1waWMiKTsKIAlpZiAobnAgPT0gTlVMTCkgewpAQCAtNTcsMTEgKzU4LDE4IEBACiAJCXJldHVybjsKIAl9CiAKLQltcGljID0gbXBpY19hbGxvYyhucCwgci5zdGFydCwKKwlpZiAob2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJmc2wsODVYWFJEQi1DQU1QIikpIHsKKwkJbXBpYyA9IG1waWNfYWxsb2MobnAsIHIuc3RhcnQsCisJCQlNUElDX1BSSU1BUlkgfAorCQkJTVBJQ19CSUdfRU5ESUFOIHwgTVBJQ19CUk9LRU5fRlJSX05JUlFTLAorCQkJMCwgMjU2LCAiIE9wZW5QSUMgICIpOworCX0gZWxzZSB7CisJCW1waWMgPSBtcGljX2FsbG9jKG5wLCByLnN0YXJ0LAogCQkgIE1QSUNfUFJJTUFSWSB8IE1QSUNfV0FOVFNfUkVTRVQgfAogCQkgIE1QSUNfQklHX0VORElBTiB8IE1QSUNfQlJPS0VOX0ZSUl9OSVJRUyB8CiAJCSAgTVBJQ19TSU5HTEVfREVTVF9DUFUsCiAJCSAgMCwgMjU2LCAiIE9wZW5QSUMgICIpOworCX0KIAogCUJVR19PTihtcGljID09IE5VTEwpOwogCW9mX25vZGVfcHV0KG5wKTsKQEAgLTExMyw2ICsxMjEsNyBAQAogCXJldHVybiBvZl9wbGF0Zm9ybV9idXNfcHJvYmUoTlVMTCwgbXBjODV4eHJkYl9pZHMsIE5VTEwpOwogfQogbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwocDIwMjBfcmRiLCBtcGM4NXh4cmRiX3B1Ymxpc2hfZGV2aWNlcyk7CittYWNoaW5lX2RldmljZV9pbml0Y2FsbChwMTAyMF9yZGIsIG1wYzg1eHhyZGJfcHVibGlzaF9kZXZpY2VzKTsKIAogLyoKICAqIENhbGxlZCB2ZXJ5IGVhcmx5LCBkZXZpY2UtdHJlZSBpc24ndCB1bmZsYXR0ZW5lZApAQCAtMTI2LDYgKzEzNSwxNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IF9faW5pdCBwMTAyMF9yZGJfcHJvYmUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHJvb3QgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7CisKKwlpZiAob2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJmc2wsUDEwMjBSREIiKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKIGRlZmluZV9tYWNoaW5lKHAyMDIwX3JkYikgewogCS5uYW1lCQkJPSAiUDIwMjAgUkRCIiwKIAkucHJvYmUJCQk9IHAyMDIwX3JkYl9wcm9iZSwKQEAgLTEzOSwzICsxNTcsMTcgQEAKIAkuY2FsaWJyYXRlX2RlY3IJCT0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKIAkucHJvZ3Jlc3MJCT0gdWRiZ19wcm9ncmVzcywKIH07CisKK2RlZmluZV9tYWNoaW5lKHAxMDIwX3JkYikgeworCS5uYW1lCQkJPSAiUDEwMjAgUkRCIiwKKwkucHJvYmUJCQk9IHAxMDIwX3JkYl9wcm9iZSwKKwkuc2V0dXBfYXJjaAkJPSBtcGM4NXh4X3JkYl9zZXR1cF9hcmNoLAorCS5pbml0X0lSUQkJPSBtcGM4NXh4X3JkYl9waWNfaW5pdCwKKyNpZmRlZiBDT05GSUdfUENJCisJLnBjaWJpb3NfZml4dXBfYnVzCT0gZnNsX3BjaWJpb3NfZml4dXBfYnVzLAorI2VuZGlmCisJLmdldF9pcnEJCT0gbXBpY19nZXRfaXJxLAorCS5yZXN0YXJ0CQk9IGZzbF9yc3Rjcl9yZXN0YXJ0LAorCS5jYWxpYnJhdGVfZGVjcgkJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAorCS5wcm9ncmVzcwkJPSB1ZGJnX3Byb2dyZXNzLAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wNDA4MF9kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3A0MDgwX2RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQxNzA0NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wNDA4MF9kcy5jCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBQNDA4MCBEUyBTZXR1cAorICoKKyAqIE1haW50YWluZWQgYnkgS3VtYXIgR2FsYSAoc2VlIE1BSU5UQUlORVJTIGZvciBjb250YWN0IGluZm9ybWF0aW9uKQorICoKKyAqIENvcHlyaWdodCAyMDA5IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS90aW1lLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2luY2x1ZGUgPG1tL21tdV9kZWNsLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vdWRiZy5oPgorI2luY2x1ZGUgPGFzbS9tcGljLmg+CisKKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CisjaW5jbHVkZSA8c3lzZGV2L2ZzbF9wY2kuaD4KKworI2luY2x1ZGUgImNvcmVuZXRfZHMuaCIKKworI2lmZGVmIENPTkZJR19QQ0kKK3N0YXRpYyBpbnQgcHJpbWFyeV9waGJfYWRkcjsKKyNlbmRpZgorCisvKgorICogQ2FsbGVkIHZlcnkgZWFybHksIGRldmljZS10cmVlIGlzbid0IHVuZmxhdHRlbmVkCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHA0MDgwX2RzX3Byb2JlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyByb290ID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOworCisJaWYgKG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiZnNsLFA0MDgwRFMiKSkgeworI2lmZGVmIENPTkZJR19QQ0kKKwkJLyogdHJlYXQgUENJZTEgYXMgcHJpbWFyeSwKKwkJICogc2hvdWxkbid0IG1hdHRlciBhcyB3ZSBoYXZlIG5vIElTQSBvbiB0aGUgYm9hcmQKKwkJICovCisJCXByaW1hcnlfcGhiX2FkZHIgPSAweDAwMDA7CisjZW5kaWYKKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorfQorCitkZWZpbmVfbWFjaGluZShwNDA4MF9kcykgeworCS5uYW1lCQkJPSAiUDQwODAgRFMiLAorCS5wcm9iZQkJCT0gcDQwODBfZHNfcHJvYmUsCisJLnNldHVwX2FyY2gJCT0gY29yZW5ldF9kc19zZXR1cF9hcmNoLAorCS5pbml0X0lSUQkJPSBjb3JlbmV0X2RzX3BpY19pbml0LAorI2lmZGVmIENPTkZJR19QQ0kKKwkucGNpYmlvc19maXh1cF9idXMJPSBmc2xfcGNpYmlvc19maXh1cF9idXMsCisjZW5kaWYKKwkuZ2V0X2lycQkJPSBtcGljX2dldF9jb3JlaW50X2lycSwKKwkucmVzdGFydAkJPSBmc2xfcnN0Y3JfcmVzdGFydCwKKwkuY2FsaWJyYXRlX2RlY3IJCT0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKKwkucHJvZ3Jlc3MJCT0gdWRiZ19wcm9ncmVzcywKK307CisKK21hY2hpbmVfZGV2aWNlX2luaXRjYWxsKHA0MDgwX2RzLCBjb3JlbmV0X2RzX3B1Ymxpc2hfZGV2aWNlcyk7CittYWNoaW5lX2FyY2hfaW5pdGNhbGwocDQwODBfZHMsIHN3aW90bGJfc2V0dXBfYnVzX25vdGlmaWVyKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zb2NyYXRlc19mcGdhX3BpYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NvY3JhdGVzX2ZwZ2FfcGljLmMKaW5kZXggNjBlZGY2My4uZTVkYTVmNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NvY3JhdGVzX2ZwZ2FfcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NvY3JhdGVzX2ZwZ2FfcGljLmMKQEAgLTIzMiw3ICsyMzIsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHNvY3JhdGVzX2ZwZ2FfcGljX2NoaXAgPSB7Ci0JLnR5cGVuYW1lICAgICAgID0gIiBGUEdBLVBJQyAiLAorCS5uYW1lCQk9ICIgRlBHQS1QSUMgIiwKIAkuYWNrCQk9IHNvY3JhdGVzX2ZwZ2FfcGljX2FjaywKIAkubWFzayAgICAgICAgICAgPSBzb2NyYXRlc19mcGdhX3BpY19tYXNrLAogCS5tYXNrX2FjayAgICAgICA9IHNvY3JhdGVzX2ZwZ2FfcGljX21hc2tfYWNrLApAQCAtMjQ1LDcgKzI0NSw3IEBACiAJCWlycV9od19udW1iZXJfdCBod2lycSkKIHsKIAkvKiBBbGwgaW50ZXJydXB0cyBhcmUgTEVWRUwgc2Vuc2l0aXZlICovCi0JZ2V0X2lycV9kZXNjKHZpcnEpLT5zdGF0dXMgfD0gSVJRX0xFVkVMOworCWlycV90b19kZXNjKHZpcnEpLT5zdGF0dXMgfD0gSVJRX0xFVkVMOwogCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcih2aXJxLCAmc29jcmF0ZXNfZnBnYV9waWNfY2hpcCwKIAkJCWhhbmRsZV9mYXN0ZW9pX2lycSk7CiAKQEAgLTI1Myw3ICsyNTMsNyBAQAogfQogCiBzdGF0aWMgaW50IHNvY3JhdGVzX2ZwZ2FfcGljX2hvc3RfeGxhdGUoc3RydWN0IGlycV9ob3N0ICpoLAotCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmN0LAl1MzIgKmludHNwZWMsIHVuc2lnbmVkIGludCBpbnRzaXplLAorCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmN0LAljb25zdCB1MzIgKmludHNwZWMsIHVuc2lnbmVkIGludCBpbnRzaXplLAogCQlpcnFfaHdfbnVtYmVyX3QgKm91dF9od2lycSwgdW5zaWduZWQgaW50ICpvdXRfZmxhZ3MpCiB7CiAJc3RydWN0IHNvY3JhdGVzX2ZwZ2FfaXJxX2luZm8gKmZwZ2FfaXJxID0gJmZwZ2FfaXJxc1tpbnRzcGVjWzBdXTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L0tjb25maWcKaW5kZXggOWM3YjY0YS4uMmJiZmQ1MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L0tjb25maWcKQEAgLTM1LDYgKzM1LDcgQEAKIGNvbmZpZyBHRUZfUFBDOUEKIAlib29sICJHRSBGYW51YyBQUEM5QSIKIAlzZWxlY3QgREVGQVVMVF9VSU1BR0UKKwlzZWxlY3QgTU1JT19OVlJBTQogCXNlbGVjdCBHRU5FUklDX0dQSU8KIAlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKIAloZWxwCkBAIC00Myw2ICs0NCw3IEBACiBjb25maWcgR0VGX1NCQzMxMAogCWJvb2wgIkdFIEZhbnVjIFNCQzMxMCIKIAlzZWxlY3QgREVGQVVMVF9VSU1BR0UKKwlzZWxlY3QgTU1JT19OVlJBTQogCXNlbGVjdCBHRU5FUklDX0dQSU8KIAlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKIAloZWxwCkBAIC01MSw2ICs1Myw3IEBACiBjb25maWcgR0VGX1NCQzYxMAogCWJvb2wgIkdFIEZhbnVjIFNCQzYxMCIKIAlzZWxlY3QgREVGQVVMVF9VSU1BR0UKKwlzZWxlY3QgTU1JT19OVlJBTQogCXNlbGVjdCBHRU5FUklDX0dQSU8KIAlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKIAlzZWxlY3QgSEFTX1JBUElESU8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9nZWZfcGljLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvZ2VmX3BpYy5jCmluZGV4IDUwZDBhMmIuLjAxMTBhODcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9nZWZfcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L2dlZl9waWMuYwpAQCAtMTQ5LDcgKzE0OSw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgZ2VmX3BpY19jaGlwID0gewotCS50eXBlbmFtZQk9ICJnZWZwIiwKKwkubmFtZQkJPSAiZ2VmcCIsCiAJLm1hc2sJCT0gZ2VmX3BpY19tYXNrLAogCS5tYXNrX2Fjawk9IGdlZl9waWNfbWFza19hY2ssCiAJLnVubWFzawkJPSBnZWZfcGljX3VubWFzaywKQEAgLTE2MywxNCArMTYzLDE0IEBACiAJCQkgIGlycV9od19udW1iZXJfdCBod2lycSkKIHsKIAkvKiBBbGwgaW50ZXJydXB0cyBhcmUgTEVWRUwgc2Vuc2l0aXZlICovCi0JZ2V0X2lycV9kZXNjKHZpcnEpLT5zdGF0dXMgfD0gSVJRX0xFVkVMOworCWlycV90b19kZXNjKHZpcnEpLT5zdGF0dXMgfD0gSVJRX0xFVkVMOwogCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcih2aXJxLCAmZ2VmX3BpY19jaGlwLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGdlZl9waWNfaG9zdF94bGF0ZShzdHJ1Y3QgaXJxX2hvc3QgKmgsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqY3QsCi0JCQkgICAgdTMyICppbnRzcGVjLCB1bnNpZ25lZCBpbnQgaW50c2l6ZSwKKwkJCSAgICBjb25zdCB1MzIgKmludHNwZWMsIHVuc2lnbmVkIGludCBpbnRzaXplLAogCQkJICAgIGlycV9od19udW1iZXJfdCAqb3V0X2h3aXJxLCB1bnNpZ25lZCBpbnQgKm91dF9mbGFncykKIHsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L2dlZl9wcGM5YS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L2dlZl9wcGM5YS5jCmluZGV4IDI4N2Y3YmQuLmE3OTJlNWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9nZWZfcHBjOWEuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvZ2VmX3BwYzlhLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxhc20vdWRiZy5oPgogCiAjaW5jbHVkZSA8YXNtL21waWMuaD4KKyNpbmNsdWRlIDxhc20vbnZyYW0uaD4KIAogI2luY2x1ZGUgPHN5c2Rldi9mc2xfcGNpLmg+CiAjaW5jbHVkZSA8c3lzZGV2L2ZzbF9zb2MuaD4KQEAgLTk1LDYgKzk2LDEwIEBACiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJVbmFibGUgdG8gbWFwIGJvYXJkIHJlZ2lzdGVyc1xuIik7CiAJCW9mX25vZGVfcHV0KHJlZ3MpOwogCX0KKworI2lmIGRlZmluZWQoQ09ORklHX01NSU9fTlZSQU0pCisJbW1pb19udnJhbV9pbml0KCk7CisjZW5kaWYKIH0KIAogLyogUmV0dXJuIHRoZSBQQ0IgcmV2aXNpb24gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9nZWZfc2JjMzEwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvZ2VmX3NiYzMxMC5jCmluZGV4IDkwNzU0ZTcuLjZhMWE2MTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9nZWZfc2JjMzEwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L2dlZl9zYmMzMTAuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGFzbS91ZGJnLmg+CiAKICNpbmNsdWRlIDxhc20vbXBpYy5oPgorI2luY2x1ZGUgPGFzbS9udnJhbS5oPgogCiAjaW5jbHVkZSA8c3lzZGV2L2ZzbF9wY2kuaD4KICNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgpAQCAtOTUsNiArOTYsMTAgQEAKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBtYXAgYm9hcmQgcmVnaXN0ZXJzXG4iKTsKIAkJb2Zfbm9kZV9wdXQocmVncyk7CiAJfQorCisjaWYgZGVmaW5lZChDT05GSUdfTU1JT19OVlJBTSkKKwltbWlvX252cmFtX2luaXQoKTsKKyNlbmRpZgogfQogCiAvKiBSZXR1cm4gdGhlIFBDQiByZXZpc2lvbiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L2dlZl9zYmM2MTAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9nZWZfc2JjNjEwLmMKaW5kZXggNzJiMzFhNi4uZTEwNjg4YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L2dlZl9zYmM2MTAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvZ2VmX3NiYzYxMC5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8YXNtL3VkYmcuaD4KIAogI2luY2x1ZGUgPGFzbS9tcGljLmg+CisjaW5jbHVkZSA8YXNtL252cmFtLmg+CiAKICNpbmNsdWRlIDxzeXNkZXYvZnNsX3BjaS5oPgogI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CkBAIC05NSw2ICs5NiwxMCBAQAogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5hYmxlIHRvIG1hcCBib2FyZCByZWdpc3RlcnNcbiIpOwogCQlvZl9ub2RlX3B1dChyZWdzKTsKIAl9CisKKyNpZiBkZWZpbmVkKENPTkZJR19NTUlPX05WUkFNKQorCW1taW9fbnZyYW1faW5pdCgpOworI2VuZGlmCiB9CiAKIC8qIFJldHVybiB0aGUgUENCIHJldmlzaW9uICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODYxMF9ocGNkLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODYxMF9ocGNkLmMKaW5kZXggNjI3OTA4YS4uNWFiZTEzNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2MTBfaHBjZC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4NjEwX2hwY2QuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KQEAgLTQxLDEwICs0Miw0NiBAQAogCiAjaW5jbHVkZSAibXBjODZ4eC5oIgogCitzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpwaXhpc19ub2RlOwogc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBpeGlzX2JkY2ZnMCwgKnBpeGlzX2FyY2g7CiAKKyNpZmRlZiBDT05GSUdfU1VTUEVORAorc3RhdGljIGlycXJldHVybl90IG1wYzg2MTBfc3c5X2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXByX2RlYnVnKCIlczogUElYSVMnIGV2ZW50IChzdzkvd2FrZXVwKSBJUlEgaGFuZGxlZFxuIiwgX19mdW5jX18pOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IG1wYzg2MTBfc3VzcGVuZF9pbml0KHZvaWQpCit7CisJaW50IGlycTsKKwlpbnQgcmV0OworCisJaWYgKCFwaXhpc19ub2RlKQorCQlyZXR1cm47CisKKwlpcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChwaXhpc19ub2RlLCAwKTsKKwlpZiAoIWlycSkgeworCQlwcl9lcnIoIiVzOiBjYW4ndCBtYXAgcGl4aXMgZXZlbnQgSVJRLlxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBtcGM4NjEwX3N3OV9pcnEsIDAsICJzdzkvd2FrZXVwIiwgTlVMTCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBjYW4ndCByZXF1ZXN0IHBpeGlzIGV2ZW50IElSUTogJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKKwkJaXJxX2Rpc3Bvc2VfbWFwcGluZyhpcnEpOworCX0KKworCWVuYWJsZV9pcnFfd2FrZShpcnEpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBtcGM4NjEwX3N1c3BlbmRfaW5pdCh2b2lkKSB7IH0KKyNlbmRpZiAvKiBDT05GSUdfU1VTUEVORCAqLworCiBzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBfX2luaXRkYXRhIG1wYzg2MTBfaWRzW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODYxMC1pbW1yIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NjEwLWd1dHMiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJnaWFuZmFyIiwgfSwKIAl7fQpAQCAtNTUsNiArOTIsOSBAQAogCS8qIEZpcnN0bHksIHJlZ2lzdGVyIFBJWElTIEdQSU9zLiAqLwogCXNpbXBsZV9ncGlvY2hpcF9pbml0KCJmc2wsZnBnYS1waXhpcy1ncGlvLWJhbmsiKTsKIAorCS8qIEVuYWJsZSB3YWtldXAgb24gUElYSVMnIGV2ZW50IElSUS4gKi8KKwltcGM4NjEwX3N1c3BlbmRfaW5pdCgpOworCiAJLyogV2l0aG91dCB0aGlzIGNhbGwsIHRoZSBTU0kgZGV2aWNlIGRyaXZlciB3b24ndCBnZXQgcHJvYmVkLiAqLwogCW9mX3BsYXRmb3JtX2J1c19wcm9iZShOVUxMLCBtcGM4NjEwX2lkcywgTlVMTCk7CiAKQEAgLTI1MCwxMCArMjkwLDEwIEBACiAJZGl1X29wcy5zZXRfc3lzZnNfbW9uaXRvcl9wb3J0CT0gbXBjODYxMGhwY2Rfc2V0X3N5c2ZzX21vbml0b3JfcG9ydDsKICNlbmRpZgogCi0JbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiZnNsLGZwZ2EtcGl4aXMiKTsKLQlpZiAobnApIHsKLQkJb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnIpOwotCQlvZl9ub2RlX3B1dChucCk7CisJcGl4aXNfbm9kZSA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wsZnBnYS1waXhpcyIpOworCWlmIChwaXhpc19ub2RlKSB7CisJCW9mX2FkZHJlc3NfdG9fcmVzb3VyY2UocGl4aXNfbm9kZSwgMCwgJnIpOworCQlvZl9ub2RlX3B1dChwaXhpc19ub2RlKTsKIAkJcGl4aXMgPSBpb3JlbWFwKHIuc3RhcnQsIDMyKTsKIAkJaWYgKCFwaXhpcykgewogCQkJcHJpbnRrKEtFUk5fRVJSICJFcnI6IGNhbid0IG1hcCBGUEdBIGNmZyByZWdpc3RlciFcbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvbTh4eF9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvbTh4eF9zZXR1cC5jCmluZGV4IDM4NWFjZmMuLjI0Mjk1NGMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L204eHhfc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9tOHh4X3NldHVwLmMKQEAgLTIyMiw3ICsyMjIsNyBAQAogCWludCBjYXNjYWRlX2lycTsKIAogCWlmICgoY2FzY2FkZV9pcnEgPSBjcG1fZ2V0X2lycSgpKSA+PSAwKSB7Ci0JCXN0cnVjdCBpcnFfZGVzYyAqY2Rlc2MgPSBpcnFfZGVzYyArIGNhc2NhZGVfaXJxOworCQlzdHJ1Y3QgaXJxX2Rlc2MgKmNkZXNjID0gaXJxX3RvX2Rlc2MoY2FzY2FkZV9pcnEpOwogCiAJCWdlbmVyaWNfaGFuZGxlX2lycShjYXNjYWRlX2lycSk7CiAJCWNkZXNjLT5jaGlwLT5lb2koY2FzY2FkZV9pcnEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnCmluZGV4IDA0YTgwNjEuLmQxNjYzZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcKQEAgLTg2LDYgKzg2LDExIEBACiAJZGVwZW5kcyBvbiBQUENfUlRBUwogCWRlZmF1bHQgbgogCitjb25maWcgUFBDX1JUQVNfREFFTU9OCisJYm9vbAorCWRlcGVuZHMgb24gUFBDX1JUQVMKKwlkZWZhdWx0IG4KKwogY29uZmlnIFJUQVNfUFJPQwogCWJvb2wgIlByb2MgaW50ZXJmYWNlIHRvIFJUQVMiCiAJZGVwZW5kcyBvbiBQUENfUlRBUwpAQCAtMjU1LDcgKzI2MCw3IEBACiAKIGNvbmZpZyBDUE0yCiAJYm9vbCAiRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBDUE0yIChDb21tdW5pY2F0aW9ucyBQcm9jZXNzb3IgTW9kdWxlKSIKLQlkZXBlbmRzIG9uIE1QQzg1eHggfHwgODI2MAorCWRlcGVuZHMgb24gKEZTTF9TT0NfQk9PS0UgJiYgUFBDMzIpIHx8IDgyNjAKIAlzZWxlY3QgQ1BNCiAJc2VsZWN0IFBQQ19MSUJfUkhFQVAKIAlzZWxlY3QgUFBDX1BDSV9DSE9JQ0UKQEAgLTMwMCw3ICszMDUsNyBAQAogCiBjb25maWcgTVBDOHh4eF9HUElPCiAJYm9vbCAiTVBDOHh4eCBHUElPIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQUENfTVBDODMxeCB8fCBQUENfTVBDODM0eCB8fCBQUENfTVBDODM3eCB8fCBQUENfODV4eCB8fCBQUENfODZ4eAorCWRlcGVuZHMgb24gUFBDX01QQzgzMXggfHwgUFBDX01QQzgzNHggfHwgUFBDX01QQzgzN3ggfHwgRlNMX1NPQ19CT09LRSB8fCBQUENfODZ4eAogCXNlbGVjdCBHRU5FUklDX0dQSU8KIAlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKIAloZWxwCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZy5jcHV0eXBlCmluZGV4IGUzODJjYWUuLjJlYWIyN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZy5jcHV0eXBlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZy5jcHV0eXBlCkBAIC0yOCw4ICsyOCw2IEBACiBjb25maWcgUFBDXzg1eHgKIAlib29sICJGcmVlc2NhbGUgODV4eCIKIAlzZWxlY3QgRTUwMAotCXNlbGVjdCBGU0xfU09DCi0Jc2VsZWN0IE1QQzg1eHgKIAogY29uZmlnIFBQQ184eHgKIAlib29sICJGcmVlc2NhbGUgOHh4IgpAQCAtMTM4LDYgKzEzNiwxNCBAQAogCWJvb2wKIAlkZWZhdWx0IHkgaWYgUFBDNjQKIAorY29uZmlnIEZTTF9FTUJfUEVSRk1PTgorCWJvb2wgIkZyZWVzY2FsZSBFbWJlZGRlZCBQZXJmbW9uIgorCWRlcGVuZHMgb24gRTUwMCB8fCBQUENfODN4eAorCWhlbHAKKwkgIFRoaXMgaXMgdGhlIFBlcmZvcm1hbmNlIE1vbml0b3Igc3VwcG9ydCBmb3VuZCBvbiB0aGUgZTUwMCBjb3JlCisJICBhbmQgc29tZSBlMzAwIGNvcmVzIChjMyBhbmQgYzQpLiAgU2VsZWN0IHRoaXMgb25seSBpZiB5b3VyCisJICBjb3JlIHN1cHBvcnRzIHRoZSBFbWJlZGRlZCBQZXJmb3JtYW5jZSBNb25pdG9yIEFQVQorCiBjb25maWcgNHh4CiAJYm9vbAogCWRlcGVuZHMgb24gNDB4IHx8IDQ0eApAQCAtMTUzLDEzICsxNTksNiBAQAogCWRlcGVuZHMgb24gRTIwMCB8fCBFNTAwCiAJZGVmYXVsdCB5CiAKLWNvbmZpZyBGU0xfRU1CX1BFUkZNT04KLQlib29sICJGcmVlc2NhbGUgRW1iZWRkZWQgUGVyZm1vbiIKLQlkZXBlbmRzIG9uIEU1MDAgfHwgUFBDXzgzeHgKLQloZWxwCi0JICBUaGlzIGlzIHRoZSBQZXJmb3JtYW5jZSBNb25pdG9yIHN1cHBvcnQgZm91bmQgb24gdGhlIGU1MDAgY29yZQotCSAgYW5kIHNvbWUgZTMwMCBjb3JlcyAoYzMgYW5kIGM0KS4gIFNlbGVjdCB0aGlzIG9ubHkgaWYgeW91cgotCSAgY29yZSBzdXBwb3J0cyB0aGUgRW1iZWRkZWQgUGVyZm9ybWFuY2UgTW9uaXRvciBBUFUKIAogY29uZmlnIFBURV82NEJJVAogCWJvb2wKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL01ha2VmaWxlCmluZGV4IGE2ODEyZWUuLmZkYjlmMGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9NYWtlZmlsZQpAQCAtMTIsNyArMTIsNyBAQAogb2JqLSQoQ09ORklHX1BQQ184eHgpCQkrPSA4eHgvCiBvYmotJChDT05GSUdfUFBDXzgyeHgpCQkrPSA4Mnh4Lwogb2JqLSQoQ09ORklHX1BQQ184M3h4KQkJKz0gODN4eC8KLW9iai0kKENPTkZJR19QUENfODV4eCkJCSs9IDg1eHgvCitvYmotJChDT05GSUdfRlNMX1NPQ19CT09LRSkJKz0gODV4eC8KIG9iai0kKENPTkZJR19QUENfODZ4eCkJCSs9IDg2eHgvCiBvYmotJChDT05GSUdfUFBDX1BTRVJJRVMpCSs9IHBzZXJpZXMvCiBvYmotJChDT05GSUdfUFBDX0lTRVJJRVMpCSs9IGlzZXJpZXMvCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYXhvbl9tc2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9heG9uX21zaS5jCmluZGV4IGE4NmMzNGIuLjk2ZmU4OTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9heG9uX21zaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9heG9uX21zaS5jCkBAIC0zMTIsNyArMzEyLDcgQEAKIAkubWFzawkJPSBtYXNrX21zaV9pcnEsCiAJLnVubWFzawkJPSB1bm1hc2tfbXNpX2lycSwKIAkuc2h1dGRvd24JPSB1bm1hc2tfbXNpX2lycSwKLQkudHlwZW5hbWUJPSAiQVhPTi1NU0kiLAorCS5uYW1lCQk9ICJBWE9OLU1TSSIsCiB9OwogCiBzdGF0aWMgaW50IG1zaWNfaG9zdF9tYXAoc3RydWN0IGlycV9ob3N0ICpoLCB1bnNpZ25lZCBpbnQgdmlycSwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9iZWF0X2ludGVycnVwdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2JlYXRfaW50ZXJydXB0LmMKaW5kZXggNzIyNTQ4NC4uMzYwNTJhOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2JlYXRfaW50ZXJydXB0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2JlYXRfaW50ZXJydXB0LmMKQEAgLTExMCw3ICsxMTAsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGJlYXRpY19waWMgPSB7Ci0JLnR5cGVuYW1lID0gIiBDRUxMLUJFQVQgIiwKKwkubmFtZSA9ICIgQ0VMTC1CRUFUICIsCiAJLnVubWFzayA9IGJlYXRpY191bm1hc2tfaXJxLAogCS5tYXNrID0gYmVhdGljX21hc2tfaXJxLAogCS5lb2kgPSBiZWF0aWNfZW5kX2lycSwKQEAgLTEzNiw3ICsxMzYsNyBAQAogc3RhdGljIGludCBiZWF0aWNfcGljX2hvc3RfbWFwKHN0cnVjdCBpcnFfaG9zdCAqaCwgdW5zaWduZWQgaW50IHZpcnEsCiAJCQkgICAgICAgaXJxX2h3X251bWJlcl90IGh3KQogewotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGdldF9pcnFfZGVzYyh2aXJxKTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyh2aXJxKTsKIAlpbnQ2NF90CWVycjsKIAogCWVyciA9IGJlYXRfY29uc3RydWN0X2FuZF9jb25uZWN0X2lycV9wbHVnKHZpcnEsIGh3KTsKQEAgLTE2NiwxMSArMTY2LDExIEBACiAgKiBOb3RlOiBXZSBoYXZlIG9ubHkgMSBlbnRyeSB0byB0cmFuc2xhdGUuCiAgKi8KIHN0YXRpYyBpbnQgYmVhdGljX3BpY19ob3N0X3hsYXRlKHN0cnVjdCBpcnFfaG9zdCAqaCwgc3RydWN0IGRldmljZV9ub2RlICpjdCwKLQkJCQkgdTMyICppbnRzcGVjLCB1bnNpZ25lZCBpbnQgaW50c2l6ZSwKKwkJCQkgY29uc3QgdTMyICppbnRzcGVjLCB1bnNpZ25lZCBpbnQgaW50c2l6ZSwKIAkJCQkgaXJxX2h3X251bWJlcl90ICpvdXRfaHdpcnEsCiAJCQkJIHVuc2lnbmVkIGludCAqb3V0X2ZsYWdzKQogewotCXU2NCAqaW50c3BlYzIgPSAodTY0ICopaW50c3BlYzsKKwljb25zdCB1NjQgKmludHNwZWMyID0gKGNvbnN0IHU2NCAqKWludHNwZWM7CiAKIAkqb3V0X2h3aXJxID0gKmludHNwZWMyOwogCSpvdXRfZmxhZ3MgfD0gSVJRX1RZUEVfTEVWRUxfTE9XOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5jCmluZGV4IDg4MmU0NzAuLjcyNjdlZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pbnRlcnJ1cHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW50ZXJydXB0LmMKQEAgLTU0LDcgKzU0LDcgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CiB9OwogCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGlpYywgaWljKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgaWljLCBjcHVfaWljKTsKICNkZWZpbmUgSUlDX05PREVfQ09VTlQJMgogc3RhdGljIHN0cnVjdCBpcnFfaG9zdCAqaWljX2hvc3Q7CiAKQEAgLTgyLDEzICs4MiwxMyBAQAogCiBzdGF0aWMgdm9pZCBpaWNfZW9pKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0Jc3RydWN0IGlpYyAqaWljID0gJl9fZ2V0X2NwdV92YXIoaWljKTsKKwlzdHJ1Y3QgaWljICppaWMgPSAmX19nZXRfY3B1X3ZhcihjcHVfaWljKTsKIAlvdXRfYmU2NCgmaWljLT5yZWdzLT5wcmlvLCBpaWMtPmVvaV9zdGFja1stLWlpYy0+ZW9pX3B0cl0pOwogCUJVR19PTihpaWMtPmVvaV9wdHIgPCAwKTsKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpaWNfY2hpcCA9IHsKLQkudHlwZW5hbWUgPSAiIENFTEwtSUlDICIsCisJLm5hbWUgPSAiIENFTEwtSUlDICIsCiAJLm1hc2sgPSBpaWNfbWFzaywKIAkudW5tYXNrID0gaWljX3VubWFzaywKIAkuZW9pID0gaWljX2VvaSwKQEAgLTEzMyw3ICsxMzMsNyBAQAogCiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaWljX2lvZXhjX2NoaXAgPSB7Ci0JLnR5cGVuYW1lID0gIiBDRUxMLUlPRVgiLAorCS5uYW1lID0gIiBDRUxMLUlPRVgiLAogCS5tYXNrID0gaWljX21hc2ssCiAJLnVubWFzayA9IGlpY191bm1hc2ssCiAJLmVvaSA9IGlpY19pb2V4Y19lb2ksCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAlzdHJ1Y3QgaWljICppaWM7CiAJdW5zaWduZWQgaW50IHZpcnE7CiAKLQlpaWMgPSAmX19nZXRfY3B1X3ZhcihpaWMpOworCWlpYyA9ICZfX2dldF9jcHVfdmFyKGNwdV9paWMpOwogCSoodW5zaWduZWQgbG9uZyAqKSAmcGVuZGluZyA9CiAJCWluX2JlNjQoKHU2NCBfX2lvbWVtICopICZpaWMtPnJlZ3MtPnBlbmRpbmdfZGVzdHIpOwogCWlmICghKHBlbmRpbmcuZmxhZ3MgJiBDQkVfSUlDX0lSUV9WQUxJRCkpCkBAIC0xNjEsMTIgKzE2MSwxMiBAQAogCiB2b2lkIGlpY19zZXR1cF9jcHUodm9pZCkKIHsKLQlvdXRfYmU2NCgmX19nZXRfY3B1X3ZhcihpaWMpLnJlZ3MtPnByaW8sIDB4ZmYpOworCW91dF9iZTY0KCZfX2dldF9jcHVfdmFyKGNwdV9paWMpLnJlZ3MtPnByaW8sIDB4ZmYpOwogfQogCiB1OCBpaWNfZ2V0X3RhcmdldF9pZChpbnQgY3B1KQogewotCXJldHVybiBwZXJfY3B1KGlpYywgY3B1KS50YXJnZXRfaWQ7CisJcmV0dXJuIHBlcl9jcHUoY3B1X2lpYywgY3B1KS50YXJnZXRfaWQ7CiB9CiAKIEVYUE9SVF9TWU1CT0xfR1BMKGlpY19nZXRfdGFyZ2V0X2lkKTsKQEAgLTE4MSw3ICsxODEsNyBAQAogCiB2b2lkIGlpY19jYXVzZV9JUEkoaW50IGNwdSwgaW50IG1lc2cpCiB7Ci0Jb3V0X2JlNjQoJnBlcl9jcHUoaWljLCBjcHUpLnJlZ3MtPmdlbmVyYXRlLCAoMHhmIC0gbWVzZykgPDwgNCk7CisJb3V0X2JlNjQoJnBlcl9jcHUoY3B1X2lpYywgY3B1KS5yZWdzLT5nZW5lcmF0ZSwgKDB4ZiAtIG1lc2cpIDw8IDQpOwogfQogCiBzdHJ1Y3QgaXJxX2hvc3QgKmlpY19nZXRfaXJxX2hvc3QoaW50IG5vZGUpCkBAIC0yOTcsNyArMjk3LDcgQEAKIH0KIAogc3RhdGljIGludCBpaWNfaG9zdF94bGF0ZShzdHJ1Y3QgaXJxX2hvc3QgKmgsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqY3QsCi0JCQkgICB1MzIgKmludHNwZWMsIHVuc2lnbmVkIGludCBpbnRzaXplLAorCQkJICAgY29uc3QgdTMyICppbnRzcGVjLCB1bnNpZ25lZCBpbnQgaW50c2l6ZSwKIAkJCSAgIGlycV9od19udW1iZXJfdCAqb3V0X2h3aXJxLCB1bnNpZ25lZCBpbnQgKm91dF9mbGFncykKIAogewpAQCAtMzQ4LDcgKzM0OCw3IEBACiAJLyogWFhYIEZJWE1FOiBzaG91bGQgbG9jYXRlIHRoZSBsaW51eCBDUFUgbnVtYmVyIGZyb20gdGhlIEhXIGNwdQogCSAqIG51bWJlciBwcm9wZXJseS4gV2UgYXJlIGx1Y2t5IGZvciBub3cKIAkgKi8KLQlzdHJ1Y3QgaWljICppaWMgPSAmcGVyX2NwdShpaWMsIGh3X2NwdSk7CisJc3RydWN0IGlpYyAqaWljID0gJnBlcl9jcHUoY3B1X2lpYywgaHdfY3B1KTsKIAogCWlpYy0+cmVncyA9IGlvcmVtYXAoYWRkciwgc2l6ZW9mKHN0cnVjdCBjYmVfaWljX3RocmVhZF9yZWdzKSk7CiAJQlVHX09OKGlpYy0+cmVncyA9PSBOVUxMKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcGlkZXItcGljLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3BpZGVyLXBpYy5jCmluZGV4IDRlNTY1NTYuLjAxMjQ0ZjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcGlkZXItcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwaWRlci1waWMuYwpAQCAtMTAyLDcgKzEwMiw3IEBACiAKIAkvKiBSZXNldCBlZGdlIGRldGVjdGlvbiBsb2dpYyBpZiBuZWNlc3NhcnkKIAkgKi8KLQlpZiAoZ2V0X2lycV9kZXNjKHZpcnEpLT5zdGF0dXMgJiBJUlFfTEVWRUwpCisJaWYgKGlycV90b19kZXNjKHZpcnEpLT5zdGF0dXMgJiBJUlFfTEVWRUwpCiAJCXJldHVybjsKIAogCS8qIE9ubHkgaW50ZXJydXB0cyA0NyB0byA1MCBjYW4gYmUgc2V0IHRvIGVkZ2UgKi8KQEAgLTExOSw3ICsxMTksNyBAQAogCXN0cnVjdCBzcGlkZXJfcGljICpwaWMgPSBzcGlkZXJfdmlycV90b19waWModmlycSk7CiAJdW5zaWduZWQgaW50IGh3ID0gaXJxX21hcFt2aXJxXS5od2lycTsKIAl2b2lkIF9faW9tZW0gKmNmZyA9IHNwaWRlcl9nZXRfaXJxX2NvbmZpZyhwaWMsIGh3KTsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBnZXRfaXJxX2Rlc2ModmlycSk7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2ModmlycSk7CiAJdTMyIG9sZF9tYXNrOwogCXUzMiBpYzsKIApAQCAtMTY4LDcgKzE2OCw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgc3BpZGVyX3BpYyA9IHsKLQkudHlwZW5hbWUgPSAiIFNQSURFUiAgICIsCisJLm5hbWUgPSAiIFNQSURFUiAgICIsCiAJLnVubWFzayA9IHNwaWRlcl91bm1hc2tfaXJxLAogCS5tYXNrID0gc3BpZGVyX21hc2tfaXJxLAogCS5hY2sgPSBzcGlkZXJfYWNrX2lycSwKQEAgLTE4Nyw3ICsxODcsNyBAQAogfQogCiBzdGF0aWMgaW50IHNwaWRlcl9ob3N0X3hsYXRlKHN0cnVjdCBpcnFfaG9zdCAqaCwgc3RydWN0IGRldmljZV9ub2RlICpjdCwKLQkJCSAgIHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUsCisJCQkgICBjb25zdCB1MzIgKmludHNwZWMsIHVuc2lnbmVkIGludCBpbnRzaXplLAogCQkJICAgaXJxX2h3X251bWJlcl90ICpvdXRfaHdpcnEsIHVuc2lnbmVkIGludCAqb3V0X2ZsYWdzKQogCiB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYwppbmRleCA4ODRlOGJjLi42NGE0YzJkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9maWxlLmMKQEAgLTI0OTQsNyArMjQ5NCw3IEBACiAJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBTUFVGU19JKGlub2RlKS0+aV9jdHg7CiAJaW50IGVycm9yID0gMCwgY250ID0gMDsKIAotCWlmICghYnVmIHx8IGxlbiA8IDApCisJaWYgKCFidWYpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJZXJyb3IgPSBzcHVfYWNxdWlyZShjdHgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvS2NvbmZpZwppbmRleCAzN2Q0MzhiLi5iYzBiMGVmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvS2NvbmZpZwpAQCAtNSw2ICs1LDggQEAKIAlzZWxlY3QgUFBDX0k4MjU5CiAJc2VsZWN0IFBQQ19JTkRJUkVDVF9QQ0kKIAlzZWxlY3QgUFBDX1JUQVMKKwlzZWxlY3QgUFBDX1JUQVNfREFFTU9OCisJc2VsZWN0IFJUQVNfRVJST1JfTE9HR0lORwogCXNlbGVjdCBQUENfTVBDMTA2CiAJc2VsZWN0IFBQQ19VREJHXzE2NTUwCiAJc2VsZWN0IFBQQ19OQVRJVkUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3NldHVwLmMKaW5kZXggY2Q0YWQ5YS4uNTJmM2RmMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3NldHVwLmMKQEAgLTM2NCwxOSArMzY0LDYgQEAKIAlpZiAocHBjX21kLnByb2dyZXNzKSBwcGNfbWQucHJvZ3Jlc3MoIkxpbnV4L1BQQyAiVVRTX1JFTEVBU0UiXG4iLCAweDApOwogfQogCi12b2lkCi1jaHJwX2V2ZW50X3NjYW4odW5zaWduZWQgbG9uZyB1bnVzZWQpCi17Ci0JdW5zaWduZWQgY2hhciBsb2dbMTAyNF07Ci0JaW50IHJldCA9IDA7Ci0KLQkvKiBYWFg6IHdlIHNob3VsZCBsb29wIHVudGlsIHRoZSBoYXJkd2FyZSBzYXlzIG5vIG1vcmUgZXJyb3IgbG9ncyAtLSBDb3J0ICovCi0JcnRhc19jYWxsKHJ0YXNfdG9rZW4oImV2ZW50LXNjYW4iKSwgNCwgMSwgJnJldCwgMHhmZmZmZmZmZiwgMCwKLQkJICBfX3BhKGxvZyksIDEwMjQpOwotCW1vZF90aW1lcigmX19nZXRfY3B1X3ZhcihoZWFydGJlYXRfdGltZXIpLAotCQkgIGppZmZpZXMgKyBldmVudF9zY2FuX2ludGVydmFsKTsKLX0KLQogc3RhdGljIHZvaWQgY2hycF84MjU5X2Nhc2NhZGUodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewogCXVuc2lnbmVkIGludCBjYXNjYWRlX2lycSA9IGk4MjU5X2lycSgpOwpAQCAtNTY4LDkgKzU1NSw2IEBACiB2b2lkIF9faW5pdAogY2hycF9pbml0Mih2b2lkKQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2aWNlOwotCWNvbnN0IHVuc2lnbmVkIGludCAqcCA9IE5VTEw7Ci0KICNpZmRlZiBDT05GSUdfTlZSQU0KIAljaHJwX252cmFtX2luaXQoKTsKICNlbmRpZgpAQCAtNTgyLDQwICs1NjYsNiBAQAogCXJlcXVlc3RfcmVnaW9uKDB4ODAsMHgxMCwiZG1hIHBhZ2UgcmVnIik7CiAJcmVxdWVzdF9yZWdpb24oMHhjMCwweDIwLCJkbWEyIik7CiAKLQkvKiBHZXQgdGhlIGV2ZW50IHNjYW4gcmF0ZSBmb3IgdGhlIHJ0YXMgc28gd2Uga25vdyBob3cKLQkgKiBvZnRlbiBpdCBleHBlY3RzIGEgaGVhcnRiZWF0LiAtLSBDb3J0Ci0JICovCi0JZGV2aWNlID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInJ0YXMiKTsKLQlpZiAoZGV2aWNlKQotCQlwID0gb2ZfZ2V0X3Byb3BlcnR5KGRldmljZSwgInJ0YXMtZXZlbnQtc2Nhbi1yYXRlIiwgTlVMTCk7Ci0JaWYgKHAgJiYgKnApIHsKLQkJLyoKLQkJICogQXJyYW5nZSB0byBjYWxsIGNocnBfZXZlbnRfc2NhbiBhdCBsZWFzdCAqcCB0aW1lcwotCQkgKiBwZXIgbWludXRlLiAgV2UgdXNlIDU5IHJhdGhlciB0aGFuIDYwIGhlcmUgc28gdGhhdAotCQkgKiB0aGUgcmF0ZSB3aWxsIGJlIHNsaWdodGx5IGhpZ2hlciB0aGFuIHRoZSBtaW5pbXVtLgotCQkgKiBUaGlzIGFsbCBhc3N1bWVzIHdlIGRvbid0IGRvIGhvdHBsdWcgQ1BVIG9uIGFueQotCQkgKiBtYWNoaW5lIHRoYXQgbmVlZHMgdGhlIGV2ZW50IHNjYW5zIGRvbmUuCi0JCSAqLwotCQl1bnNpZ25lZCBsb25nIGludGVydmFsLCBvZmZzZXQ7Ci0JCWludCBjcHUsIG5jcHVzOwotCQlzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXI7Ci0KLQkJaW50ZXJ2YWwgPSBIWiAqIDU5IC8gKnA7Ci0JCW9mZnNldCA9IEhaOwotCQluY3B1cyA9IG51bV9vbmxpbmVfY3B1cygpOwotCQlldmVudF9zY2FuX2ludGVydmFsID0gbmNwdXMgKiBpbnRlcnZhbDsKLQkJZm9yIChjcHUgPSAwOyBjcHUgPCBuY3B1czsgKytjcHUpIHsKLQkJCXRpbWVyID0gJnBlcl9jcHUoaGVhcnRiZWF0X3RpbWVyLCBjcHUpOwotCQkJc2V0dXBfdGltZXIodGltZXIsIGNocnBfZXZlbnRfc2NhbiwgMCk7Ci0JCQl0aW1lci0+ZXhwaXJlcyA9IGppZmZpZXMgKyBvZmZzZXQ7Ci0JCQlhZGRfdGltZXJfb24odGltZXIsIGNwdSk7Ci0JCQlvZmZzZXQgKz0gaW50ZXJ2YWw7Ci0JCX0KLQkJcHJpbnRrKCJSVEFTIEV2ZW50IFNjYW4gUmF0ZTogJXUgKCVsdSBqaWZmaWVzKVxuIiwKLQkJICAgICAgICpwLCBpbnRlcnZhbCk7Ci0JfQotCW9mX25vZGVfcHV0KGRldmljZSk7Ci0KIAlpZiAocHBjX21kLnByb2dyZXNzKQogCQlwcGNfbWQucHJvZ3Jlc3MoIiAgSGF2ZSBmdW4hICAgICIsIDB4Nzc3Nyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaHRhYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2h0YWIuYwppbmRleCBmOTljNmM0Li4zYWU2NmFiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaHRhYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9odGFiLmMKQEAgLTE5LDggKzE5LDcgQEAKIAogI2luY2x1ZGUgImNhbGxfaHB0LmgiCiAKLXN0YXRpYyBzcGlubG9ja190IGlTZXJpZXNfaGxvY2tzWzY0XSBfX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcCA9Ci0JeyBbMCAuLi4gNjNdID0gU1BJTl9MT0NLX1VOTE9DS0VEfTsKK3N0YXRpYyBzcGlubG9ja190IGlTZXJpZXNfaGxvY2tzWzY0XSBfX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKIAogLyoKICAqIFZlcnkgcHJpbWl0aXZlIGFsZ29yaXRobSBmb3IgcGlja2luZyB1cCBhIGxvY2sKQEAgLTI0NSw2ICsyNDQsMTEgQEAKIAogdm9pZCBfX2luaXQgaHB0ZV9pbml0X2lTZXJpZXModm9pZCkKIHsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlTZXJpZXNfaGxvY2tzKTsgaSsrKQorCQlzcGluX2xvY2tfaW5pdCgmaVNlcmllc19obG9ja3NbaV0pOworCiAJcHBjX21kLmhwdGVfaW52YWxpZGF0ZQk9IGlTZXJpZXNfaHB0ZV9pbnZhbGlkYXRlOwogCXBwY19tZC5ocHRlX3VwZGF0ZXBwCT0gaVNlcmllc19ocHRlX3VwZGF0ZXBwOwogCXBwY19tZC5ocHRlX3VwZGF0ZWJvbHRlZHBwID0gaVNlcmllc19ocHRlX3VwZGF0ZWJvbHRlZHBwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lycS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lycS5jCmluZGV4IDk0ZjQ0NDcuLjA3NzYyMjUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9pcnEuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaXJxLmMKQEAgLTIxNCw3ICsyMTQsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlmb3JfZWFjaF9pcnEgKGlycSkgewotCQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBnZXRfaXJxX2Rlc2MoaXJxKTsKKwkJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKIAogCQlpZiAoZGVzYyAmJiBkZXNjLT5jaGlwICYmIGRlc2MtPmNoaXAtPnN0YXJ0dXApIHsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXNjLT5sb2NrLCBmbGFncyk7CkBAIC0yNzMsNyArMjczLDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpc2VyaWVzX3BpYyA9IHsKLQkudHlwZW5hbWUJPSAiaVNlcmllcyBpcnEgY29udHJvbGxlciIsCisJLm5hbWUJPSAiaVNlcmllcyBpcnEgY29udHJvbGxlciIsCiAJLnN0YXJ0dXAJPSBpc2VyaWVzX3N0YXJ0dXBfSVJRLAogCS5zaHV0ZG93bgk9IGlzZXJpZXNfc2h1dGRvd25fSVJRLAogCS51bm1hc2sJCT0gaXNlcmllc19lbmFibGVfSVJRLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9waWMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGljLmMKaW5kZXggZDIxMjAwNi4uMDllODI3MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9waWMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BpYy5jCkBAIC0xNTIsMTIgKzE1MiwxMiBAQAogICAgICAgICB1bnNpZ25lZCBsb25nIGJpdCA9IDFVTCA8PCAoc3JjICYgMHgxZik7CiAgICAgICAgIGludCBpID0gc3JjID4+IDU7CiAKLSAgCXNwaW5fbG9ja19pcnFzYXZlKCZwbWFjX3BpY19sb2NrLCBmbGFncyk7Ci0JaWYgKChpcnFfZGVzY1t2aXJxXS5zdGF0dXMgJiBJUlFfTEVWRUwpID09IDApCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBtYWNfcGljX2xvY2ssIGZsYWdzKTsKKwlpZiAoKGlycV90b19kZXNjKHZpcnEpLT5zdGF0dXMgJiBJUlFfTEVWRUwpID09IDApCiAJCW91dF9sZTMyKCZwbWFjX2lycV9od1tpXS0+YWNrLCBiaXQpOwogICAgICAgICBfX3NldF9iaXQoc3JjLCBwcGNfY2FjaGVkX2lycV9tYXNrKTsKICAgICAgICAgX19wbWFjX3NldF9pcnFfbWFzayhzcmMsIDApOwotICAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG1hY19waWNfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtYWNfcGljX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTk1LDcgKzE5NSw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgcG1hY19waWMgPSB7Ci0JLnR5cGVuYW1lCT0gIiBQTUFDLVBJQyAiLAorCS5uYW1lCQk9ICIgUE1BQy1QSUMgIiwKIAkuc3RhcnR1cAk9IHBtYWNfc3RhcnR1cF9pcnEsCiAJLm1hc2sJCT0gcG1hY19tYXNrX2lycSwKIAkuYWNrCQk9IHBtYWNfYWNrX2lycSwKQEAgLTI4NSw3ICsyODUsNyBAQAogc3RhdGljIGludCBwbWFjX3BpY19ob3N0X21hcChzdHJ1Y3QgaXJxX2hvc3QgKmgsIHVuc2lnbmVkIGludCB2aXJxLAogCQkJICAgICBpcnFfaHdfbnVtYmVyX3QgaHcpCiB7Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjID0gZ2V0X2lycV9kZXNjKHZpcnEpOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKHZpcnEpOwogCWludCBsZXZlbDsKIAogCWlmIChodyA+PSBtYXhfaXJxcykKQEAgLTMwMyw3ICszMDMsNyBAQAogfQogCiBzdGF0aWMgaW50IHBtYWNfcGljX2hvc3RfeGxhdGUoc3RydWN0IGlycV9ob3N0ICpoLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmN0LAotCQkJICAgICAgIHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUsCisJCQkgICAgICAgY29uc3QgdTMyICppbnRzcGVjLCB1bnNpZ25lZCBpbnQgaW50c2l6ZSwKIAkJCSAgICAgICBpcnFfaHdfbnVtYmVyX3QgKm91dF9od2lycSwKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgKm91dF9mbGFncykKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaW50ZXJydXB0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYwppbmRleCA4ZWM1Y2NmLi41OWQ5NzEyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYwpAQCAtMTUyLDcgKzE1Miw3IEBACiAgKi8KIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBwczNfaXJxX2NoaXAgPSB7Ci0JLnR5cGVuYW1lID0gInBzMyIsCisJLm5hbWUgPSAicHMzIiwKIAkubWFzayA9IHBzM19jaGlwX21hc2ssCiAJLnVubWFzayA9IHBzM19jaGlwX3VubWFzaywKIAkuZW9pID0gcHMzX2NoaXBfZW9pLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvbW0uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL21tLmMKaW5kZXggMTg5YTI1Yi4uZTgxYjAyOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvbW0uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9tbS5jCkBAIC0zNCw3ICszNCw3IEBACiAjaWYgZGVmaW5lZChERUJVRykKICNkZWZpbmUgREJHIHVkYmdfcHJpbnRmCiAjZWxzZQotI2RlZmluZSBEQkcgcHJfZGVidWcKKyNkZWZpbmUgREJHIHByX2RldmVsCiAjZW5kaWYKIAogZW51bSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9LY29uZmlnCmluZGV4IGYwZTZmMjguLjI3NTU0YzggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9LY29uZmlnCkBAIC00LDYgKzQsNyBAQAogCXNlbGVjdCBNUElDCiAJc2VsZWN0IFBQQ19JODI1OQogCXNlbGVjdCBQUENfUlRBUworCXNlbGVjdCBQUENfUlRBU19EQUVNT04KIAlzZWxlY3QgUlRBU19FUlJPUl9MT0dHSU5HCiAJc2VsZWN0IFBQQ19VREJHXzE2NTUwCiAJc2VsZWN0IFBQQ19OQVRJVkUKQEAgLTU5LDcgKzYwLDcgQEAKIAogY29uZmlnIENNTQogCXRyaXN0YXRlICJDb2xsYWJvcmF0aXZlIG1lbW9yeSBtYW5hZ2VtZW50IgotCWRlcGVuZHMgb24gUFBDX1NNTFBBUiAmJiAhQ1JBU0hfRFVNUAorCWRlcGVuZHMgb24gUFBDX1NNTFBBUgogCWRlZmF1bHQgeQogCWhlbHAKIAkgIFNlbGVjdCB0aGlzIG9wdGlvbiwgaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoZSBrZXJuZWwgaW50ZXJmYWNlCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvTWFrZWZpbGUKaW5kZXggNzkwYzBiOC4uMGZmNTE3NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9NYWtlZmlsZQpAQCAtNyw4ICs3LDggQEAKIGVuZGlmCiAKIG9iai15CQkJOj0gbHBhci5vIGh2Q2FsbC5vIG52cmFtLm8gcmVjb25maWcubyBcCi0JCQkgICBzZXR1cC5vIGlvbW11Lm8gcmFzLm8gcnRhc2QubyBcCi0JCQkgICBmaXJtd2FyZS5vIHBvd2VyLm8KKwkJCSAgIHNldHVwLm8gaW9tbXUubyByYXMubyBcCisJCQkgICBmaXJtd2FyZS5vIHBvd2VyLm8gZGxwYXIubwogb2JqLSQoQ09ORklHX1NNUCkJKz0gc21wLm8KIG9iai0kKENPTkZJR19YSUNTKQkrPSB4aWNzLm8KIG9iai0kKENPTkZJR19TQ0FOTE9HKQkrPSBzY2FubG9nLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9jbW0uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9jbW0uYwppbmRleCA2NTY3NDM5Li5iY2RjZjBjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvY21tLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2NtbS5jCkBAIC0yMjksOCArMjI5LDkgQEAKIHsKIAlpbnQgcmM7CiAJc3RydWN0IGh2Y2FsbF9tcHBfZGF0YSBtcHBfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGFjdGl2ZV9wYWdlc190YXJnZXQ7Ci0Jc2lnbmVkIGxvbmcgcGFnZV9sb2FuX3JlcXVlc3Q7CisJc2lnbmVkIGxvbmcgYWN0aXZlX3BhZ2VzX3RhcmdldCwgcGFnZV9sb2FuX3JlcXVlc3QsIHRhcmdldDsKKwlzaWduZWQgbG9uZyB0b3RhbF9wYWdlcyA9IHRvdGFscmFtX3BhZ2VzICsgbG9hbmVkX3BhZ2VzOworCXNpZ25lZCBsb25nIG1pbl9tZW1fcGFnZXMgPSAobWluX21lbV9tYiAqIDEwMjQgKiAxMDI0KSAvIFBBR0VfU0laRTsKIAogCXJjID0gaF9nZXRfbXBwKCZtcHBfZGF0YSk7CiAKQEAgLTIzOCwxNyArMjM5LDI1IEBACiAJCXJldHVybjsKIAogCXBhZ2VfbG9hbl9yZXF1ZXN0ID0gZGl2X3M2NCgoczY0KW1wcF9kYXRhLmxvYW5fcmVxdWVzdCwgUEFHRV9TSVpFKTsKLQlsb2FuZWRfcGFnZXNfdGFyZ2V0ID0gcGFnZV9sb2FuX3JlcXVlc3QgKyBsb2FuZWRfcGFnZXM7Ci0JaWYgKGxvYW5lZF9wYWdlc190YXJnZXQgPiBvb21fZnJlZWRfcGFnZXMpCi0JCWxvYW5lZF9wYWdlc190YXJnZXQgLT0gb29tX2ZyZWVkX3BhZ2VzOworCXRhcmdldCA9IHBhZ2VfbG9hbl9yZXF1ZXN0ICsgKHNpZ25lZCBsb25nKWxvYW5lZF9wYWdlczsKKworCWlmICh0YXJnZXQgPCAwIHx8IHRvdGFsX3BhZ2VzIDwgbWluX21lbV9wYWdlcykKKwkJdGFyZ2V0ID0gMDsKKworCWlmICh0YXJnZXQgPiBvb21fZnJlZWRfcGFnZXMpCisJCXRhcmdldCAtPSBvb21fZnJlZWRfcGFnZXM7CiAJZWxzZQotCQlsb2FuZWRfcGFnZXNfdGFyZ2V0ID0gMDsKKwkJdGFyZ2V0ID0gMDsKIAotCWFjdGl2ZV9wYWdlc190YXJnZXQgPSB0b3RhbHJhbV9wYWdlcyArIGxvYW5lZF9wYWdlcyAtIGxvYW5lZF9wYWdlc190YXJnZXQ7CisJYWN0aXZlX3BhZ2VzX3RhcmdldCA9IHRvdGFsX3BhZ2VzIC0gdGFyZ2V0OwogCi0JaWYgKChtaW5fbWVtX21iICogMTAyNCAqIDEwMjQpID4gKGFjdGl2ZV9wYWdlc190YXJnZXQgKiBQQUdFX1NJWkUpKQotCQlsb2FuZWRfcGFnZXNfdGFyZ2V0ID0gdG90YWxyYW1fcGFnZXMgKyBsb2FuZWRfcGFnZXMgLQotCQkJKChtaW5fbWVtX21iICogMTAyNCAqIDEwMjQpIC8gUEFHRV9TSVpFKTsKKwlpZiAobWluX21lbV9wYWdlcyA+IGFjdGl2ZV9wYWdlc190YXJnZXQpCisJCXRhcmdldCA9IHRvdGFsX3BhZ2VzIC0gbWluX21lbV9wYWdlczsKKworCWlmICh0YXJnZXQgPCAwKQorCQl0YXJnZXQgPSAwOworCisJbG9hbmVkX3BhZ2VzX3RhcmdldCA9IHRhcmdldDsKIAogCWNtbV9kYmcoImRlbHRhID0gJWxkLCBsb2FuZWQgPSAlbHUsIHRhcmdldCA9ICVsdSwgb29tID0gJWx1LCB0b3RhbHJhbSA9ICVsdVxuIiwKIAkJcGFnZV9sb2FuX3JlcXVlc3QsIGxvYW5lZF9wYWdlcywgbG9hbmVkX3BhZ2VzX3RhcmdldCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9kbHBhci5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2RscGFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJkZjllOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9kbHBhci5jCkBAIC0wLDAgKzEsNTU4IEBACisvKgorICogU3VwcG9ydCBmb3IgZHluYW1pYyByZWNvbmZpZ3VyYXRpb24gZm9yIFBDSSwgTWVtb3J5LCBhbmQgQ1BVCisgKiBIb3RwbHVnIGFuZCBEeW5hbWljIExvZ2ljYWwgUGFydGl0aW9uaW5nIG9uIFJQQSBwbGF0Zm9ybXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IE5hdGhhbiBGb250ZW5vdAorICogQ29weXJpZ2h0IChDKSAyMDA5IElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgIm9mZmxpbmVfc3RhdGVzLmgiCisKKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcnRhcy5oPgorI2luY2x1ZGUgPGFzbS9wU2VyaWVzX3JlY29uZmlnLmg+CisKK3N0cnVjdCBjY193b3JrYXJlYSB7CisJdTMyCWRyY19pbmRleDsKKwl1MzIJemVybzsKKwl1MzIJbmFtZV9vZmZzZXQ7CisJdTMyCXByb3BfbGVuZ3RoOworCXUzMglwcm9wX29mZnNldDsKK307CisKK3N0YXRpYyB2b2lkIGRscGFyX2ZyZWVfY2NfcHJvcGVydHkoc3RydWN0IHByb3BlcnR5ICpwcm9wKQoreworCWtmcmVlKHByb3AtPm5hbWUpOworCWtmcmVlKHByb3AtPnZhbHVlKTsKKwlrZnJlZShwcm9wKTsKK30KKworc3RhdGljIHN0cnVjdCBwcm9wZXJ0eSAqZGxwYXJfcGFyc2VfY2NfcHJvcGVydHkoc3RydWN0IGNjX3dvcmthcmVhICpjY3dhKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwljaGFyICpuYW1lOworCWNoYXIgKnZhbHVlOworCisJcHJvcCA9IGt6YWxsb2Moc2l6ZW9mKCpwcm9wKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcm9wKQorCQlyZXR1cm4gTlVMTDsKKworCW5hbWUgPSAoY2hhciAqKWNjd2EgKyBjY3dhLT5uYW1lX29mZnNldDsKKwlwcm9wLT5uYW1lID0ga3N0cmR1cChuYW1lLCBHRlBfS0VSTkVMKTsKKworCXByb3AtPmxlbmd0aCA9IGNjd2EtPnByb3BfbGVuZ3RoOworCXZhbHVlID0gKGNoYXIgKiljY3dhICsgY2N3YS0+cHJvcF9vZmZzZXQ7CisJcHJvcC0+dmFsdWUgPSBremFsbG9jKHByb3AtPmxlbmd0aCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcm9wLT52YWx1ZSkgeworCQlkbHBhcl9mcmVlX2NjX3Byb3BlcnR5KHByb3ApOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1jcHkocHJvcC0+dmFsdWUsIHZhbHVlLCBwcm9wLT5sZW5ndGgpOworCXJldHVybiBwcm9wOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpkbHBhcl9wYXJzZV9jY19ub2RlKHN0cnVjdCBjY193b3JrYXJlYSAqY2N3YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOworCWNoYXIgKm5hbWU7CisKKwlkbiA9IGt6YWxsb2Moc2l6ZW9mKCpkbiksIEdGUF9LRVJORUwpOworCWlmICghZG4pCisJCXJldHVybiBOVUxMOworCisJLyogVGhlIGNvbmZpZ3VyZSBjb25uZWN0b3IgcmVwb3J0ZWQgbmFtZSBkb2VzIG5vdCBjb250YWluIGEKKwkgKiBwcmVjZWVkaW5nICcvJywgc28gd2UgYWxsb2NhdGUgYSBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvCisJICogcHJlcGVuZCB0aGlzIHRvIHRoZSBmdWxsX25hbWUuCisJICovCisJbmFtZSA9IChjaGFyICopY2N3YSArIGNjd2EtPm5hbWVfb2Zmc2V0OworCWRuLT5mdWxsX25hbWUgPSBrbWFsbG9jKHN0cmxlbihuYW1lKSArIDIsIEdGUF9LRVJORUwpOworCWlmICghZG4tPmZ1bGxfbmFtZSkgeworCQlrZnJlZShkbik7CisJCXJldHVybiBOVUxMOworCX0KKworCXNwcmludGYoZG4tPmZ1bGxfbmFtZSwgIi8lcyIsIG5hbWUpOworCXJldHVybiBkbjsKK30KKworc3RhdGljIHZvaWQgZGxwYXJfZnJlZV9vbmVfY2Nfbm9kZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKworCXdoaWxlIChkbi0+cHJvcGVydGllcykgeworCQlwcm9wID0gZG4tPnByb3BlcnRpZXM7CisJCWRuLT5wcm9wZXJ0aWVzID0gcHJvcC0+bmV4dDsKKwkJZGxwYXJfZnJlZV9jY19wcm9wZXJ0eShwcm9wKTsKKwl9CisKKwlrZnJlZShkbi0+ZnVsbF9uYW1lKTsKKwlrZnJlZShkbik7Cit9CisKK3N0YXRpYyB2b2lkIGRscGFyX2ZyZWVfY2Nfbm9kZXMoc3RydWN0IGRldmljZV9ub2RlICpkbikKK3sKKwlpZiAoZG4tPmNoaWxkKQorCQlkbHBhcl9mcmVlX2NjX25vZGVzKGRuLT5jaGlsZCk7CisKKwlpZiAoZG4tPnNpYmxpbmcpCisJCWRscGFyX2ZyZWVfY2Nfbm9kZXMoZG4tPnNpYmxpbmcpOworCisJZGxwYXJfZnJlZV9vbmVfY2Nfbm9kZShkbik7Cit9CisKKyNkZWZpbmUgTkVYVF9TSUJMSU5HICAgIDEKKyNkZWZpbmUgTkVYVF9DSElMRCAgICAgIDIKKyNkZWZpbmUgTkVYVF9QUk9QRVJUWSAgIDMKKyNkZWZpbmUgUFJFVl9QQVJFTlQgICAgIDQKKyNkZWZpbmUgTU9SRV9NRU1PUlkgICAgIDUKKyNkZWZpbmUgQ0FMTF9BR0FJTgktMgorI2RlZmluZSBFUlJfQ0ZHX1VTRSAgICAgLTkwMDMKKworc3RydWN0IGRldmljZV9ub2RlICpkbHBhcl9jb25maWd1cmVfY29ubmVjdG9yKHUzMiBkcmNfaW5kZXgpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpkbjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmZpcnN0X2RuID0gTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmxhc3RfZG4gPSBOVUxMOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcGVydHk7CisJc3RydWN0IHByb3BlcnR5ICpsYXN0X3Byb3BlcnR5ID0gTlVMTDsKKwlzdHJ1Y3QgY2Nfd29ya2FyZWEgKmNjd2E7CisJaW50IGNjX3Rva2VuOworCWludCByYzsKKworCWNjX3Rva2VuID0gcnRhc190b2tlbigiaWJtLGNvbmZpZ3VyZS1jb25uZWN0b3IiKTsKKwlpZiAoY2NfdG9rZW4gPT0gUlRBU19VTktOT1dOX1NFUlZJQ0UpCisJCXJldHVybiBOVUxMOworCisJc3Bpbl9sb2NrKCZydGFzX2RhdGFfYnVmX2xvY2spOworCWNjd2EgPSAoc3RydWN0IGNjX3dvcmthcmVhICopJnJ0YXNfZGF0YV9idWZbMF07CisJY2N3YS0+ZHJjX2luZGV4ID0gZHJjX2luZGV4OworCWNjd2EtPnplcm8gPSAwOworCisJcmMgPSBydGFzX2NhbGwoY2NfdG9rZW4sIDIsIDEsIE5VTEwsIHJ0YXNfZGF0YV9idWYsIE5VTEwpOworCXdoaWxlIChyYykgeworCQlzd2l0Y2ggKHJjKSB7CisJCWNhc2UgTkVYVF9TSUJMSU5HOgorCQkJZG4gPSBkbHBhcl9wYXJzZV9jY19ub2RlKGNjd2EpOworCQkJaWYgKCFkbikKKwkJCQlnb3RvIGNjX2Vycm9yOworCisJCQlkbi0+cGFyZW50ID0gbGFzdF9kbi0+cGFyZW50OworCQkJbGFzdF9kbi0+c2libGluZyA9IGRuOworCQkJbGFzdF9kbiA9IGRuOworCQkJYnJlYWs7CisKKwkJY2FzZSBORVhUX0NISUxEOgorCQkJZG4gPSBkbHBhcl9wYXJzZV9jY19ub2RlKGNjd2EpOworCQkJaWYgKCFkbikKKwkJCQlnb3RvIGNjX2Vycm9yOworCisJCQlpZiAoIWZpcnN0X2RuKQorCQkJCWZpcnN0X2RuID0gZG47CisJCQllbHNlIHsKKwkJCQlkbi0+cGFyZW50ID0gbGFzdF9kbjsKKwkJCQlpZiAobGFzdF9kbikKKwkJCQkJbGFzdF9kbi0+Y2hpbGQgPSBkbjsKKwkJCX0KKworCQkJbGFzdF9kbiA9IGRuOworCQkJYnJlYWs7CisKKwkJY2FzZSBORVhUX1BST1BFUlRZOgorCQkJcHJvcGVydHkgPSBkbHBhcl9wYXJzZV9jY19wcm9wZXJ0eShjY3dhKTsKKwkJCWlmICghcHJvcGVydHkpCisJCQkJZ290byBjY19lcnJvcjsKKworCQkJaWYgKCFsYXN0X2RuLT5wcm9wZXJ0aWVzKQorCQkJCWxhc3RfZG4tPnByb3BlcnRpZXMgPSBwcm9wZXJ0eTsKKwkJCWVsc2UKKwkJCQlsYXN0X3Byb3BlcnR5LT5uZXh0ID0gcHJvcGVydHk7CisKKwkJCWxhc3RfcHJvcGVydHkgPSBwcm9wZXJ0eTsKKwkJCWJyZWFrOworCisJCWNhc2UgUFJFVl9QQVJFTlQ6CisJCQlsYXN0X2RuID0gbGFzdF9kbi0+cGFyZW50OworCQkJYnJlYWs7CisKKwkJY2FzZSBDQUxMX0FHQUlOOgorCQkJYnJlYWs7CisKKwkJY2FzZSBNT1JFX01FTU9SWToKKwkJY2FzZSBFUlJfQ0ZHX1VTRToKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiVW5leHBlY3RlZCBFcnJvciAoJWQpICIKKwkJCSAgICAgICAicmV0dXJuZWQgZnJvbSBjb25maWd1cmUtY29ubmVjdG9yXG4iLCByYyk7CisJCQlnb3RvIGNjX2Vycm9yOworCQl9CisKKwkJcmMgPSBydGFzX2NhbGwoY2NfdG9rZW4sIDIsIDEsIE5VTEwsIHJ0YXNfZGF0YV9idWYsIE5VTEwpOworCX0KKworCXNwaW5fdW5sb2NrKCZydGFzX2RhdGFfYnVmX2xvY2spOworCXJldHVybiBmaXJzdF9kbjsKKworY2NfZXJyb3I6CisJaWYgKGZpcnN0X2RuKQorCQlkbHBhcl9mcmVlX2NjX25vZGVzKGZpcnN0X2RuKTsKKwlzcGluX3VubG9jaygmcnRhc19kYXRhX2J1Zl9sb2NrKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGVyaXZlX3BhcmVudChjb25zdCBjaGFyICpwYXRoKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50OworCWNoYXIgKmxhc3Rfc2xhc2g7CisKKwlsYXN0X3NsYXNoID0gc3RycmNocihwYXRoLCAnLycpOworCWlmIChsYXN0X3NsYXNoID09IHBhdGgpIHsKKwkJcGFyZW50ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKKwl9IGVsc2UgeworCQljaGFyICpwYXJlbnRfcGF0aDsKKwkJaW50IHBhcmVudF9wYXRoX2xlbiA9IGxhc3Rfc2xhc2ggLSBwYXRoICsgMTsKKwkJcGFyZW50X3BhdGggPSBrbWFsbG9jKHBhcmVudF9wYXRoX2xlbiwgR0ZQX0tFUk5FTCk7CisJCWlmICghcGFyZW50X3BhdGgpCisJCQlyZXR1cm4gTlVMTDsKKworCQlzdHJsY3B5KHBhcmVudF9wYXRoLCBwYXRoLCBwYXJlbnRfcGF0aF9sZW4pOworCQlwYXJlbnQgPSBvZl9maW5kX25vZGVfYnlfcGF0aChwYXJlbnRfcGF0aCk7CisJCWtmcmVlKHBhcmVudF9wYXRoKTsKKwl9CisKKwlyZXR1cm4gcGFyZW50OworfQorCitpbnQgZGxwYXJfYXR0YWNoX25vZGUoc3RydWN0IGRldmljZV9ub2RlICpkbikKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudDsKKwlpbnQgcmM7CisKKwlvZl9ub2RlX3NldF9mbGFnKGRuLCBPRl9EWU5BTUlDKTsKKwlrcmVmX2luaXQoJmRuLT5rcmVmKTsKKwlkbi0+cGFyZW50ID0gZGVyaXZlX3BhcmVudChkbi0+ZnVsbF9uYW1lKTsKKwlpZiAoIWRuLT5wYXJlbnQpCisJCXJldHVybiAtRU5PTUVNOworCisJcmMgPSBibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZwU2VyaWVzX3JlY29uZmlnX2NoYWluLAorCQkJCQkgIFBTRVJJRVNfUkVDT05GSUdfQURELCBkbik7CisJaWYgKHJjID09IE5PVElGWV9CQUQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gYWRkIGRldmljZSBub2RlICVzXG4iLAorCQkgICAgICAgZG4tPmZ1bGxfbmFtZSk7CisJCXJldHVybiAtRU5PTUVNOyAvKiBGb3Igbm93LCBzYWZlIHRvIGFzc3VtZSBrbWFsbG9jIGZhaWx1cmUgKi8KKwl9CisKKwlvZl9hdHRhY2hfbm9kZShkbik7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19ERVZJQ0VUUkVFCisJZW50ID0gcHJvY19ta2RpcihzdHJyY2hyKGRuLT5mdWxsX25hbWUsICcvJykgKyAxLCBkbi0+cGFyZW50LT5wZGUpOworCWlmIChlbnQpCisJCXByb2NfZGV2aWNlX3RyZWVfYWRkX25vZGUoZG4sIGVudCk7CisjZW5kaWYKKworCW9mX25vZGVfcHV0KGRuLT5wYXJlbnQpOworCXJldHVybiAwOworfQorCitpbnQgZGxwYXJfZGV0YWNoX25vZGUoc3RydWN0IGRldmljZV9ub2RlICpkbikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCA9IGRuLT5wYXJlbnQ7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wID0gZG4tPnByb3BlcnRpZXM7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19ERVZJQ0VUUkVFCisJd2hpbGUgKHByb3ApIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkocHJvcC0+bmFtZSwgZG4tPnBkZSk7CisJCXByb3AgPSBwcm9wLT5uZXh0OworCX0KKworCWlmIChkbi0+cGRlKQorCQlyZW1vdmVfcHJvY19lbnRyeShkbi0+cGRlLT5uYW1lLCBwYXJlbnQtPnBkZSk7CisjZW5kaWYKKworCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJnBTZXJpZXNfcmVjb25maWdfY2hhaW4sCisJCQkgICAgUFNFUklFU19SRUNPTkZJR19SRU1PVkUsIGRuKTsKKwlvZl9kZXRhY2hfbm9kZShkbik7CisJb2Zfbm9kZV9wdXQoZG4pOyAvKiBNdXN0IGRlY3JlbWVudCB0aGUgcmVmY291bnQgKi8KKworCXJldHVybiAwOworfQorCisjZGVmaW5lIERSX0VOVElUWV9TRU5TRQkJOTAwMworI2RlZmluZSBEUl9FTlRJVFlfUFJFU0VOVAkxCisjZGVmaW5lIERSX0VOVElUWV9VTlVTQUJMRQkyCisjZGVmaW5lIEFMTE9DQVRJT05fU1RBVEUJOTAwMworI2RlZmluZSBBTExPQ19VTlVTQUJMRQkJMAorI2RlZmluZSBBTExPQ19VU0FCTEUJCTEKKyNkZWZpbmUgSVNPTEFUSU9OX1NUQVRFCQk5MDAxCisjZGVmaW5lIElTT0xBVEUJCQkwCisjZGVmaW5lIFVOSVNPTEFURQkJMQorCitpbnQgZGxwYXJfYWNxdWlyZV9kcmModTMyIGRyY19pbmRleCkKK3sKKwlpbnQgZHJfc3RhdHVzLCByYzsKKworCXJjID0gcnRhc19jYWxsKHJ0YXNfdG9rZW4oImdldC1zZW5zb3Itc3RhdGUiKSwgMiwgMiwgJmRyX3N0YXR1cywKKwkJICAgICAgIERSX0VOVElUWV9TRU5TRSwgZHJjX2luZGV4KTsKKwlpZiAocmMgfHwgZHJfc3RhdHVzICE9IERSX0VOVElUWV9VTlVTQUJMRSkKKwkJcmV0dXJuIC0xOworCisJcmMgPSBydGFzX3NldF9pbmRpY2F0b3IoQUxMT0NBVElPTl9TVEFURSwgZHJjX2luZGV4LCBBTExPQ19VU0FCTEUpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBydGFzX3NldF9pbmRpY2F0b3IoSVNPTEFUSU9OX1NUQVRFLCBkcmNfaW5kZXgsIFVOSVNPTEFURSk7CisJaWYgKHJjKSB7CisJCXJ0YXNfc2V0X2luZGljYXRvcihBTExPQ0FUSU9OX1NUQVRFLCBkcmNfaW5kZXgsIEFMTE9DX1VOVVNBQkxFKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgZGxwYXJfcmVsZWFzZV9kcmModTMyIGRyY19pbmRleCkKK3sKKwlpbnQgZHJfc3RhdHVzLCByYzsKKworCXJjID0gcnRhc19jYWxsKHJ0YXNfdG9rZW4oImdldC1zZW5zb3Itc3RhdGUiKSwgMiwgMiwgJmRyX3N0YXR1cywKKwkJICAgICAgIERSX0VOVElUWV9TRU5TRSwgZHJjX2luZGV4KTsKKwlpZiAocmMgfHwgZHJfc3RhdHVzICE9IERSX0VOVElUWV9QUkVTRU5UKQorCQlyZXR1cm4gLTE7CisKKwlyYyA9IHJ0YXNfc2V0X2luZGljYXRvcihJU09MQVRJT05fU1RBVEUsIGRyY19pbmRleCwgSVNPTEFURSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IHJ0YXNfc2V0X2luZGljYXRvcihBTExPQ0FUSU9OX1NUQVRFLCBkcmNfaW5kZXgsIEFMTE9DX1VOVVNBQkxFKTsKKwlpZiAocmMpIHsKKwkJcnRhc19zZXRfaW5kaWNhdG9yKElTT0xBVElPTl9TVEFURSwgZHJjX2luZGV4LCBVTklTT0xBVEUpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfQVJDSF9DUFVfUFJPQkVfUkVMRUFTRQorCitzdGF0aWMgREVGSU5FX01VVEVYKHBzZXJpZXNfY3B1X2hvdHBsdWdfbXV0ZXgpOworCit2b2lkIGNwdV9ob3RwbHVnX2RyaXZlcl9sb2NrKCkKK3sKKwltdXRleF9sb2NrKCZwc2VyaWVzX2NwdV9ob3RwbHVnX211dGV4KTsKK30KKwordm9pZCBjcHVfaG90cGx1Z19kcml2ZXJfdW5sb2NrKCkKK3sKKwltdXRleF91bmxvY2soJnBzZXJpZXNfY3B1X2hvdHBsdWdfbXV0ZXgpOworfQorCitzdGF0aWMgaW50IGRscGFyX29ubGluZV9jcHUoc3RydWN0IGRldmljZV9ub2RlICpkbikKK3sKKwlpbnQgcmMgPSAwOworCXVuc2lnbmVkIGludCBjcHU7CisJaW50IGxlbiwgbnRocmVhZHMsIGk7CisJY29uc3QgdTMyICppbnRzZXJ2OworCisJaW50c2VydiA9IG9mX2dldF9wcm9wZXJ0eShkbiwgImlibSxwcGMtaW50ZXJydXB0LXNlcnZlciNzIiwgJmxlbik7CisJaWYgKCFpbnRzZXJ2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW50aHJlYWRzID0gbGVuIC8gc2l6ZW9mKHUzMik7CisKKwljcHVfbWFwc191cGRhdGVfYmVnaW4oKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnRocmVhZHM7IGkrKykgeworCQlmb3JfZWFjaF9wcmVzZW50X2NwdShjcHUpIHsKKwkJCWlmIChnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGNwdSkgIT0gaW50c2VydltpXSkKKwkJCQljb250aW51ZTsKKwkJCUJVR19PTihnZXRfY3B1X2N1cnJlbnRfc3RhdGUoY3B1KQorCQkJCQkhPSBDUFVfU1RBVEVfT0ZGTElORSk7CisJCQljcHVfbWFwc191cGRhdGVfZG9uZSgpOworCQkJcmMgPSBjcHVfdXAoY3B1KTsKKwkJCWlmIChyYykKKwkJCQlnb3RvIG91dDsKKwkJCWNwdV9tYXBzX3VwZGF0ZV9iZWdpbigpOworCisJCQlicmVhazsKKwkJfQorCQlpZiAoY3B1ID09IG51bV9wb3NzaWJsZV9jcHVzKCkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDb3VsZCBub3QgZmluZCBjcHUgdG8gb25saW5lICIKKwkJCSAgICAgICAid2l0aCBwaHlzaWNhbCBpZCAweCV4XG4iLCBpbnRzZXJ2W2ldKTsKKwl9CisJY3B1X21hcHNfdXBkYXRlX2RvbmUoKTsKKworb3V0OgorCXJldHVybiByYzsKKworfQorCitzdGF0aWMgc3NpemVfdCBkbHBhcl9jcHVfcHJvYmUoY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpkbjsKKwl1bnNpZ25lZCBsb25nIGRyY19pbmRleDsKKwljaGFyICpjcHVfbmFtZTsKKwlpbnQgcmM7CisKKwljcHVfaG90cGx1Z19kcml2ZXJfbG9jaygpOworCXJjID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmZHJjX2luZGV4KTsKKwlpZiAocmMpIHsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlkbiA9IGRscGFyX2NvbmZpZ3VyZV9jb25uZWN0b3IoZHJjX2luZGV4KTsKKwlpZiAoIWRuKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogY29uZmlndXJlLWNvbm5lY3RvciByZXBvcnRzIGNwdXMgYXMgbGl2aW5nIGluIHRoZSBiYXNlCisJICogZGlyZWN0b3J5IG9mIHRoZSBkZXZpY2UgdHJlZS4gIENQVXMgYWN0dWFsbHkgbGl2ZSBpbiB0aGUKKwkgKiBjcHVzIGRpcmVjdG9yeSBzbyB3ZSBuZWVkIHRvIGZpeHVwIHRoZSBmdWxsX25hbWUuCisJICovCisJY3B1X25hbWUgPSBremFsbG9jKHN0cmxlbihkbi0+ZnVsbF9uYW1lKSArIHN0cmxlbigiL2NwdXMiKSArIDEsCisJCQkgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWNwdV9uYW1lKSB7CisJCWRscGFyX2ZyZWVfY2Nfbm9kZXMoZG4pOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXNwcmludGYoY3B1X25hbWUsICIvY3B1cyVzIiwgZG4tPmZ1bGxfbmFtZSk7CisJa2ZyZWUoZG4tPmZ1bGxfbmFtZSk7CisJZG4tPmZ1bGxfbmFtZSA9IGNwdV9uYW1lOworCisJcmMgPSBkbHBhcl9hY3F1aXJlX2RyYyhkcmNfaW5kZXgpOworCWlmIChyYykgeworCQlkbHBhcl9mcmVlX2NjX25vZGVzKGRuKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlyYyA9IGRscGFyX2F0dGFjaF9ub2RlKGRuKTsKKwlpZiAocmMpIHsKKwkJZGxwYXJfcmVsZWFzZV9kcmMoZHJjX2luZGV4KTsKKwkJZGxwYXJfZnJlZV9jY19ub2Rlcyhkbik7CisJfQorCisJcmMgPSBkbHBhcl9vbmxpbmVfY3B1KGRuKTsKK291dDoKKwljcHVfaG90cGx1Z19kcml2ZXJfdW5sb2NrKCk7CisKKwlyZXR1cm4gcmMgPyByYyA6IGNvdW50OworfQorCitzdGF0aWMgaW50IGRscGFyX29mZmxpbmVfY3B1KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pCit7CisJaW50IHJjID0gMDsKKwl1bnNpZ25lZCBpbnQgY3B1OworCWludCBsZW4sIG50aHJlYWRzLCBpOworCWNvbnN0IHUzMiAqaW50c2VydjsKKworCWludHNlcnYgPSBvZl9nZXRfcHJvcGVydHkoZG4sICJpYm0scHBjLWludGVycnVwdC1zZXJ2ZXIjcyIsICZsZW4pOworCWlmICghaW50c2VydikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwludGhyZWFkcyA9IGxlbiAvIHNpemVvZih1MzIpOworCisJY3B1X21hcHNfdXBkYXRlX2JlZ2luKCk7CisJZm9yIChpID0gMDsgaSA8IG50aHJlYWRzOyBpKyspIHsKKwkJZm9yX2VhY2hfcHJlc2VudF9jcHUoY3B1KSB7CisJCQlpZiAoZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChjcHUpICE9IGludHNlcnZbaV0pCisJCQkJY29udGludWU7CisKKwkJCWlmIChnZXRfY3B1X2N1cnJlbnRfc3RhdGUoY3B1KSA9PSBDUFVfU1RBVEVfT0ZGTElORSkKKwkJCQlicmVhazsKKworCQkJaWYgKGdldF9jcHVfY3VycmVudF9zdGF0ZShjcHUpID09IENQVV9TVEFURV9PTkxJTkUpIHsKKwkJCQljcHVfbWFwc191cGRhdGVfZG9uZSgpOworCQkJCXJjID0gY3B1X2Rvd24oY3B1KTsKKwkJCQlpZiAocmMpCisJCQkJCWdvdG8gb3V0OworCQkJCWNwdV9tYXBzX3VwZGF0ZV9iZWdpbigpOworCQkJCWJyZWFrOworCisJCQl9CisKKwkJCS8qCisJCQkgKiBUaGUgY3B1IGlzIGluIENQVV9TVEFURV9JTkFDVElWRS4KKwkJCSAqIFVwZ3JhZGUgaXQncyBzdGF0ZSB0byBDUFVfU1RBVEVfT0ZGTElORS4KKwkJCSAqLworCQkJc2V0X3ByZWZlcnJlZF9vZmZsaW5lX3N0YXRlKGNwdSwgQ1BVX1NUQVRFX09GRkxJTkUpOworCQkJQlVHX09OKHBscGFyX2hjYWxsX25vcmV0cyhIX1BST0QsIGludHNlcnZbaV0pCisJCQkJCQkJCSE9IEhfU1VDQ0VTUyk7CisJCQlfX2NwdV9kaWUoY3B1KTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjcHUgPT0gbnVtX3Bvc3NpYmxlX2NwdXMoKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNvdWxkIG5vdCBmaW5kIGNwdSB0byBvZmZsaW5lICIKKwkJCSAgICAgICAid2l0aCBwaHlzaWNhbCBpZCAweCV4XG4iLCBpbnRzZXJ2W2ldKTsKKwl9CisJY3B1X21hcHNfdXBkYXRlX2RvbmUoKTsKKworb3V0OgorCXJldHVybiByYzsKKworfQorCitzdGF0aWMgc3NpemVfdCBkbHBhcl9jcHVfcmVsZWFzZShjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOworCWNvbnN0IHUzMiAqZHJjX2luZGV4OworCWludCByYzsKKworCWRuID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoYnVmKTsKKwlpZiAoIWRuKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRyY19pbmRleCA9IG9mX2dldF9wcm9wZXJ0eShkbiwgImlibSxteS1kcmMtaW5kZXgiLCBOVUxMKTsKKwlpZiAoIWRyY19pbmRleCkgeworCQlvZl9ub2RlX3B1dChkbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNwdV9ob3RwbHVnX2RyaXZlcl9sb2NrKCk7CisJcmMgPSBkbHBhcl9vZmZsaW5lX2NwdShkbik7CisJaWYgKHJjKSB7CisJCW9mX25vZGVfcHV0KGRuKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlyYyA9IGRscGFyX3JlbGVhc2VfZHJjKCpkcmNfaW5kZXgpOworCWlmIChyYykgeworCQlvZl9ub2RlX3B1dChkbik7CisJCWdvdG8gb3V0OworCX0KKworCXJjID0gZGxwYXJfZGV0YWNoX25vZGUoZG4pOworCWlmIChyYykgeworCQlkbHBhcl9hY3F1aXJlX2RyYygqZHJjX2luZGV4KTsKKwkJZ290byBvdXQ7CisJfQorCisJb2Zfbm9kZV9wdXQoZG4pOworb3V0OgorCWNwdV9ob3RwbHVnX2RyaXZlcl91bmxvY2soKTsKKwlyZXR1cm4gcmMgPyByYyA6IGNvdW50OworfQorCitzdGF0aWMgaW50IF9faW5pdCBwc2VyaWVzX2RscGFyX2luaXQodm9pZCkKK3sKKwlwcGNfbWQuY3B1X3Byb2JlID0gZGxwYXJfY3B1X3Byb2JlOworCXBwY19tZC5jcHVfcmVsZWFzZSA9IGRscGFyX2NwdV9yZWxlYXNlOworCisJcmV0dXJuIDA7Cit9CittYWNoaW5lX2RldmljZV9pbml0Y2FsbChwc2VyaWVzLCBwc2VyaWVzX2RscGFyX2luaXQpOworCisjZW5kaWYgLyogQ09ORklHX0FSQ0hfQ1BVX1BST0JFX1JFTEVBU0UgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9kdGwuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9kdGwuYwppbmRleCA5MzdhNTQ0Li5jNWYzMTE2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZHRsLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2R0bC5jCkBAIC01NCw3ICs1NCw3IEBACiAJaW50CQkJYnVmX2VudHJpZXM7CiAJdTY0CQkJbGFzdF9pZHg7CiB9Owotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBkdGwsIGR0bCk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGR0bCwgY3B1X2R0bCk7CiAKIC8qCiAgKiBEaXNwYXRjaCB0cmFjZSBsb2cgZXZlbnQgbWFzazoKQEAgLTI2MSw3ICsyNjEsNyBAQAogCiAJLyogc2V0IHVwIHRoZSBwZXItY3B1IGxvZyBzdHJ1Y3R1cmVzICovCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKLQkJc3RydWN0IGR0bCAqZHRsID0gJnBlcl9jcHUoZHRsLCBpKTsKKwkJc3RydWN0IGR0bCAqZHRsID0gJnBlcl9jcHUoY3B1X2R0bCwgaSk7CiAJCWR0bC0+Y3B1ID0gaTsKIAogCQlyYyA9IGR0bF9zZXR1cF9maWxlKGR0bCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2RyaXZlci5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9kcml2ZXIuYwppbmRleCAwZThkYjY3Li5lZjhlNDU0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2RyaXZlci5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfZHJpdmVyLmMKQEAgLTYzLDIyICs2Myw2IEBACiB9CiAjZW5kaWYKIAotLyoqIAotICogaXJxX2luX3VzZSAtIHJldHVybiB0cnVlIGlmIHRoaXMgaXJxIGlzIGJlaW5nIHVzZWQgCi0gKi8KLXN0YXRpYyBpbnQgaXJxX2luX3VzZSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWludCByYyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLSAgIHN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKLQlpZiAoZGVzYy0+YWN0aW9uKQotCQlyYyA9IDE7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwotCXJldHVybiByYzsKLX0KLQogLyoqCiAgKiBlZWhfZGlzYWJsZV9pcnEgLSBkaXNhYmxlIGludGVycnVwdCBmb3IgdGhlIHJlY292ZXJpbmcgZGV2aWNlCiAgKi8KQEAgLTkzLDcgKzc3LDcgQEAKIAlpZiAoZGV2LT5tc2lfZW5hYmxlZCB8fCBkZXYtPm1zaXhfZW5hYmxlZCkKIAkJcmV0dXJuOwogCi0JaWYgKCFpcnFfaW5fdXNlKGRldi0+aXJxKSkKKwlpZiAoIWlycV9oYXNfYWN0aW9uKGRldi0+aXJxKSkKIAkJcmV0dXJuOwogCiAJUENJX0ROKGRuKS0+ZWVoX21vZGUgfD0gRUVIX01PREVfSVJRX0RJU0FCTEVEOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2hvdHBsdWctY3B1LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaG90cGx1Zy1jcHUuYwppbmRleCBlYmZmNmQ5Li42ZWE0Njk4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaG90cGx1Zy1jcHUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaG90cGx1Zy1jcHUuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGFzbS9wU2VyaWVzX3JlY29uZmlnLmg+CiAjaW5jbHVkZSAieGljcy5oIgogI2luY2x1ZGUgInBscGFyX3dyYXBwZXJzLmgiCisjaW5jbHVkZSAib2ZmbGluZV9zdGF0ZXMuaCIKIAogLyogVGhpcyB2ZXJzaW9uIGNhbid0IHRha2UgdGhlIHNwaW5sb2NrLCBiZWNhdXNlIGl0IG5ldmVyIHJldHVybnMgKi8KIHN0YXRpYyBzdHJ1Y3QgcnRhc19hcmdzIHJ0YXNfc3RvcF9zZWxmX2FyZ3MgPSB7CkBAIC0zOSw2ICs0MCw1NSBAQAogCS5yZXRzID0gJnJ0YXNfc3RvcF9zZWxmX2FyZ3MuYXJnc1swXSwKIH07CiAKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShlbnVtIGNwdV9zdGF0ZV92YWxzLCBwcmVmZXJyZWRfb2ZmbGluZV9zdGF0ZSkgPQorCQkJCQkJCUNQVV9TVEFURV9PRkZMSU5FOworc3RhdGljIERFRklORV9QRVJfQ1BVKGVudW0gY3B1X3N0YXRlX3ZhbHMsIGN1cnJlbnRfc3RhdGUpID0gQ1BVX1NUQVRFX09GRkxJTkU7CisKK3N0YXRpYyBlbnVtIGNwdV9zdGF0ZV92YWxzIGRlZmF1bHRfb2ZmbGluZV9zdGF0ZSA9IENQVV9TVEFURV9PRkZMSU5FOworCitzdGF0aWMgaW50IGNlZGVfb2ZmbGluZV9lbmFibGVkIF9fcmVhZF9tb3N0bHkgPSAxOworCisvKgorICogRW5hYmxlL2Rpc2FibGUgY2VkZV9vZmZsaW5lIHdoZW4gYXZhaWxhYmxlLgorICovCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9jZWRlX29mZmxpbmUoY2hhciAqc3RyKQoreworCWlmICghc3RyY21wKHN0ciwgIm9mZiIpKQorCQljZWRlX29mZmxpbmVfZW5hYmxlZCA9IDA7CisJZWxzZSBpZiAoIXN0cmNtcChzdHIsICJvbiIpKQorCQljZWRlX29mZmxpbmVfZW5hYmxlZCA9IDE7CisJZWxzZQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiY2VkZV9vZmZsaW5lPSIsIHNldHVwX2NlZGVfb2ZmbGluZSk7CisKK2VudW0gY3B1X3N0YXRlX3ZhbHMgZ2V0X2NwdV9jdXJyZW50X3N0YXRlKGludCBjcHUpCit7CisJcmV0dXJuIHBlcl9jcHUoY3VycmVudF9zdGF0ZSwgY3B1KTsKK30KKwordm9pZCBzZXRfY3B1X2N1cnJlbnRfc3RhdGUoaW50IGNwdSwgZW51bSBjcHVfc3RhdGVfdmFscyBzdGF0ZSkKK3sKKwlwZXJfY3B1KGN1cnJlbnRfc3RhdGUsIGNwdSkgPSBzdGF0ZTsKK30KKworZW51bSBjcHVfc3RhdGVfdmFscyBnZXRfcHJlZmVycmVkX29mZmxpbmVfc3RhdGUoaW50IGNwdSkKK3sKKwlyZXR1cm4gcGVyX2NwdShwcmVmZXJyZWRfb2ZmbGluZV9zdGF0ZSwgY3B1KTsKK30KKwordm9pZCBzZXRfcHJlZmVycmVkX29mZmxpbmVfc3RhdGUoaW50IGNwdSwgZW51bSBjcHVfc3RhdGVfdmFscyBzdGF0ZSkKK3sKKwlwZXJfY3B1KHByZWZlcnJlZF9vZmZsaW5lX3N0YXRlLCBjcHUpID0gc3RhdGU7Cit9CisKK3ZvaWQgc2V0X2RlZmF1bHRfb2ZmbGluZV9zdGF0ZShpbnQgY3B1KQoreworCXBlcl9jcHUocHJlZmVycmVkX29mZmxpbmVfc3RhdGUsIGNwdSkgPSBkZWZhdWx0X29mZmxpbmVfc3RhdGU7Cit9CisKIHN0YXRpYyB2b2lkIHJ0YXNfc3RvcF9zZWxmKHZvaWQpCiB7CiAJc3RydWN0IHJ0YXNfYXJncyAqYXJncyA9ICZydGFzX3N0b3Bfc2VsZl9hcmdzOwpAQCAtNTYsMTEgKzEwNiw2MSBAQAogCiBzdGF0aWMgdm9pZCBwc2VyaWVzX21hY2hfY3B1X2RpZSh2b2lkKQogeworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJdW5zaWduZWQgaW50IGh3Y3B1ID0gaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCk7CisJdTggY2VkZV9sYXRlbmN5X2hpbnQgPSAwOworCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAlpZGxlX3Rhc2tfZXhpdCgpOwogCXhpY3NfdGVhcmRvd25fY3B1KCk7Ci0JdW5yZWdpc3Rlcl9zbGJfc2hhZG93KGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpLCBfX3BhKGdldF9zbGJfc2hhZG93KCkpKTsKLQlydGFzX3N0b3Bfc2VsZigpOworCisJaWYgKGdldF9wcmVmZXJyZWRfb2ZmbGluZV9zdGF0ZShjcHUpID09IENQVV9TVEFURV9JTkFDVElWRSkgeworCQlzZXRfY3B1X2N1cnJlbnRfc3RhdGUoY3B1LCBDUFVfU1RBVEVfSU5BQ1RJVkUpOworCQljZWRlX2xhdGVuY3lfaGludCA9IDI7CisKKwkJZ2V0X2xwcGFjYSgpLT5pZGxlID0gMTsKKwkJaWYgKCFnZXRfbHBwYWNhKCktPnNoYXJlZF9wcm9jKQorCQkJZ2V0X2xwcGFjYSgpLT5kb25hdGVfZGVkaWNhdGVkX2NwdSA9IDE7CisKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJImNwdSAldSAoaHdpZCAldSkgY2VkaW5nIGZvciBvZmZsaW5lIHdpdGggaGludCAlZFxuIiwKKwkJCWNwdSwgaHdjcHUsIGNlZGVfbGF0ZW5jeV9oaW50KTsKKwkJd2hpbGUgKGdldF9wcmVmZXJyZWRfb2ZmbGluZV9zdGF0ZShjcHUpID09IENQVV9TVEFURV9JTkFDVElWRSkgeworCQkJZXh0ZW5kZWRfY2VkZV9wcm9jZXNzb3IoY2VkZV9sYXRlbmN5X2hpbnQpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiY3B1ICV1IChod2lkICV1KSByZXR1cm5lZCBmcm9tIGNlZGUuXG4iLAorCQkJCWNwdSwgaHdjcHUpOworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJIkRlY3JlbWVudGVyIHZhbHVlID0gJXggVGltZWJhc2UgdmFsdWUgPSAlbGx4XG4iLAorCQkJZ2V0X2RlYygpLCBnZXRfdGIoKSk7CisJCX0KKworCQlwcmludGsoS0VSTl9JTkZPICJjcHUgJXUgKGh3aWQgJXUpIGdvdCBwcm9kZGVkIHRvIGdvIG9ubGluZVxuIiwKKwkJCWNwdSwgaHdjcHUpOworCisJCWlmICghZ2V0X2xwcGFjYSgpLT5zaGFyZWRfcHJvYykKKwkJCWdldF9scHBhY2EoKS0+ZG9uYXRlX2RlZGljYXRlZF9jcHUgPSAwOworCQlnZXRfbHBwYWNhKCktPmlkbGUgPSAwOworCX0KKworCWlmIChnZXRfcHJlZmVycmVkX29mZmxpbmVfc3RhdGUoY3B1KSA9PSBDUFVfU1RBVEVfT05MSU5FKSB7CisJCXVucmVnaXN0ZXJfc2xiX3NoYWRvdyhod2NwdSwgX19wYShnZXRfc2xiX3NoYWRvdygpKSk7CisKKwkJLyoKKwkJICogTk9URTogQ2FsbGluZyBzdGFydF9zZWNvbmRhcnkoKSBoZXJlIGZvciBub3cgdG8KKwkJICogc3RhcnQgbmV3IGNvbnRleHQuCisJCSAqIEhvd2V2ZXIsIG5lZWQgdG8gZG8gaXQgY2xlYW5seSBieSByZXNldHRpbmcgdGhlCisJCSAqIHN0YWNrIHBvaW50ZXIuCisJCSAqLworCQlzdGFydF9zZWNvbmRhcnkoKTsKKworCX0gZWxzZSBpZiAoZ2V0X3ByZWZlcnJlZF9vZmZsaW5lX3N0YXRlKGNwdSkgPT0gQ1BVX1NUQVRFX09GRkxJTkUpIHsKKworCQlzZXRfY3B1X2N1cnJlbnRfc3RhdGUoY3B1LCBDUFVfU1RBVEVfT0ZGTElORSk7CisJCXVucmVnaXN0ZXJfc2xiX3NoYWRvdyhoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKSwKKwkJCQkJX19wYShnZXRfc2xiX3NoYWRvdygpKSk7CisJCXJ0YXNfc3RvcF9zZWxmKCk7CisJfQorCiAJLyogU2hvdWxkIG5ldmVyIGdldCBoZXJlLi4uICovCiAJQlVHKCk7CiAJZm9yKDs7KTsKQEAgLTEwNiwxOCArMjA2LDQzIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBwc2VyaWVzX2NwdV9kaWU6IFdhaXQgZm9yIHRoZSBjcHUgdG8gZGllLgorICogQGNwdTogbG9naWNhbCBwcm9jZXNzb3IgaWQgb2YgdGhlIENQVSB3aG9zZSBkZWF0aCB3ZSdyZSBhd2FpdGluZy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBjb250ZXh0IG9mIHRoZSB0aHJlYWQgd2hpY2ggaXMgcGVyZm9ybWluZworICogdGhlIGNwdS1vZmZsaW5lLiBIZXJlIHdlIHdhaXQgZm9yIGxvbmcgZW5vdWdoIHRvIGFsbG93IHRoZSBjcHUgaW4gcXVlc3Rpb24KKyAqIHRvIHNlbGYtZGVzdHJveSBzbyB0aGF0IHRoZSBjcHUtb2ZmbGluZSB0aHJlYWQgY2FuIHNlbmQgdGhlIENQVV9ERUFECisgKiBub3RpZmljYXRpb25zLgorICoKKyAqIE9UT0gsIHBzZXJpZXNfbWFjaF9jcHVfZGllKCkgaXMgY2FsbGVkIGJ5IHRoZSBAY3B1IHdoZW4gaXQgd2FudHMgdG8KKyAqIHNlbGYtZGVzdHJ1Y3QuCisgKi8KIHN0YXRpYyB2b2lkIHBzZXJpZXNfY3B1X2RpZSh1bnNpZ25lZCBpbnQgY3B1KQogewogCWludCB0cmllczsKLQlpbnQgY3B1X3N0YXR1czsKKwlpbnQgY3B1X3N0YXR1cyA9IDE7CiAJdW5zaWduZWQgaW50IHBjcHUgPSBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGNwdSk7CiAKLQlmb3IgKHRyaWVzID0gMDsgdHJpZXMgPCAyNTsgdHJpZXMrKykgewotCQljcHVfc3RhdHVzID0gcXVlcnlfY3B1X3N0b3BwZWQocGNwdSk7Ci0JCWlmIChjcHVfc3RhdHVzID09IDAgfHwgY3B1X3N0YXR1cyA9PSAtMSkKLQkJCWJyZWFrOwotCQljcHVfcmVsYXgoKTsKKwlpZiAoZ2V0X3ByZWZlcnJlZF9vZmZsaW5lX3N0YXRlKGNwdSkgPT0gQ1BVX1NUQVRFX0lOQUNUSVZFKSB7CisJCWNwdV9zdGF0dXMgPSAxOworCQlmb3IgKHRyaWVzID0gMDsgdHJpZXMgPCAxMDAwOyB0cmllcysrKSB7CisJCQlpZiAoZ2V0X2NwdV9jdXJyZW50X3N0YXRlKGNwdSkgPT0gQ1BVX1NUQVRFX0lOQUNUSVZFKSB7CisJCQkJY3B1X3N0YXR1cyA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQljcHVfcmVsYXgoKTsKKwkJfQorCX0gZWxzZSBpZiAoZ2V0X3ByZWZlcnJlZF9vZmZsaW5lX3N0YXRlKGNwdSkgPT0gQ1BVX1NUQVRFX09GRkxJTkUpIHsKKworCQlmb3IgKHRyaWVzID0gMDsgdHJpZXMgPCAyNTsgdHJpZXMrKykgeworCQkJY3B1X3N0YXR1cyA9IHF1ZXJ5X2NwdV9zdG9wcGVkKHBjcHUpOworCQkJaWYgKGNwdV9zdGF0dXMgPT0gMCB8fCBjcHVfc3RhdHVzID09IC0xKQorCQkJCWJyZWFrOworCQkJY3B1X3JlbGF4KCk7CisJCX0KIAl9CisKIAlpZiAoY3B1X3N0YXR1cyAhPSAwKSB7CiAJCXByaW50aygiUXVlcnlpbmcgREVBRD8gY3B1ICVpICglaSkgc2hvd3MgJWlcbiIsCiAJCSAgICAgICBjcHUsIHBjcHUsIGNwdV9zdGF0dXMpOwpAQCAtMjUyLDEwICszNzcsNDEgQEAKIAkubm90aWZpZXJfY2FsbCA9IHBzZXJpZXNfc21wX25vdGlmaWVyLAogfTsKIAorI2RlZmluZSBNQVhfQ0VERV9MQVRFTkNZX0xFVkVMUwkJNAorI2RlZmluZQlDRURFX0xBVEVOQ1lfUEFSQU1fTEVOR1RICTEwCisjZGVmaW5lIENFREVfTEFURU5DWV9QQVJBTV9NQVhfTEVOR1RICVwKKwkoTUFYX0NFREVfTEFURU5DWV9MRVZFTFMgKiBDRURFX0xBVEVOQ1lfUEFSQU1fTEVOR1RIICogc2l6ZW9mKGNoYXIpKQorI2RlZmluZSBDRURFX0xBVEVOQ1lfVE9LRU4JCTQ1CisKK3N0YXRpYyBjaGFyIGNlZGVfcGFyYW1ldGVyc1tDRURFX0xBVEVOQ1lfUEFSQU1fTUFYX0xFTkdUSF07CisKK3N0YXRpYyBpbnQgcGFyc2VfY2VkZV9wYXJhbWV0ZXJzKHZvaWQpCit7CisJaW50IGNhbGxfc3RhdHVzOworCisJbWVtc2V0KGNlZGVfcGFyYW1ldGVycywgMCwgQ0VERV9MQVRFTkNZX1BBUkFNX01BWF9MRU5HVEgpOworCWNhbGxfc3RhdHVzID0gcnRhc19jYWxsKHJ0YXNfdG9rZW4oImlibSxnZXQtc3lzdGVtLXBhcmFtZXRlciIpLCAzLCAxLAorCQkJCU5VTEwsCisJCQkJQ0VERV9MQVRFTkNZX1RPS0VOLAorCQkJCV9fcGEoY2VkZV9wYXJhbWV0ZXJzKSwKKwkJCQlDRURFX0xBVEVOQ1lfUEFSQU1fTUFYX0xFTkdUSCk7CisKKwlpZiAoY2FsbF9zdGF0dXMgIT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ0VERV9MQVRFTkNZOiBcCisJCQklcyAlcyBFcnJvciBjYWxsaW5nIGdldC1zeXN0ZW0tcGFyYW1ldGVyKDB4JXgpXG4iLAorCQkJX19GSUxFX18sIF9fZnVuY19fLCBjYWxsX3N0YXR1cyk7CisJZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICJDRURFX0xBVEVOQ1k6IFwKKwkJCWdldC1zeXN0ZW0tcGFyYW1ldGVyIHN1Y2Nlc3NmdWwuXG4iKTsKKworCXJldHVybiBjYWxsX3N0YXR1czsKK30KKwogc3RhdGljIGludCBfX2luaXQgcHNlcmllc19jcHVfaG90cGx1Z19pbml0KHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKIAljb25zdCBjaGFyICp0eXBlcDsKKwlpbnQgY3B1OwogCiAJZm9yX2VhY2hfbm9kZV9ieV9uYW1lKG5wLCAiaW50ZXJydXB0LWNvbnRyb2xsZXIiKSB7CiAJCXR5cGVwID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiY29tcGF0aWJsZSIsIE5VTEwpOwpAQCAtMjgzLDggKzQzOSwxNiBAQAogCXNtcF9vcHMtPmNwdV9kaWUgPSBwc2VyaWVzX2NwdV9kaWU7CiAKIAkvKiBQcm9jZXNzb3JzIGNhbiBiZSBhZGRlZC9yZW1vdmVkIG9ubHkgb24gTFBBUiAqLwotCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0xQQVIpKQorCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0xQQVIpKSB7CiAJCXBTZXJpZXNfcmVjb25maWdfbm90aWZpZXJfcmVnaXN0ZXIoJnBzZXJpZXNfc21wX25iKTsKKwkJY3B1X21hcHNfdXBkYXRlX2JlZ2luKCk7CisJCWlmIChjZWRlX29mZmxpbmVfZW5hYmxlZCAmJiBwYXJzZV9jZWRlX3BhcmFtZXRlcnMoKSA9PSAwKSB7CisJCQlkZWZhdWx0X29mZmxpbmVfc3RhdGUgPSBDUFVfU1RBVEVfSU5BQ1RJVkU7CisJCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKKwkJCQlzZXRfZGVmYXVsdF9vZmZsaW5lX3N0YXRlKGNwdSk7CisJCX0KKwkJY3B1X21hcHNfdXBkYXRlX2RvbmUoKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9vZmZsaW5lX3N0YXRlcy5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL29mZmxpbmVfc3RhdGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI1NzRlMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9vZmZsaW5lX3N0YXRlcy5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgX09GRkxJTkVfU1RBVEVTX0hfCisjZGVmaW5lIF9PRkZMSU5FX1NUQVRFU19IXworCisvKiBDcHUgb2ZmbGluZSBzdGF0ZXMgZ28gaGVyZSAqLworZW51bSBjcHVfc3RhdGVfdmFscyB7CisJQ1BVX1NUQVRFX09GRkxJTkUsCisJQ1BVX1NUQVRFX0lOQUNUSVZFLAorCUNQVV9TVEFURV9PTkxJTkUsCisJQ1BVX01BWF9PRkZMSU5FX1NUQVRFUworfTsKKworZXh0ZXJuIGVudW0gY3B1X3N0YXRlX3ZhbHMgZ2V0X2NwdV9jdXJyZW50X3N0YXRlKGludCBjcHUpOworZXh0ZXJuIHZvaWQgc2V0X2NwdV9jdXJyZW50X3N0YXRlKGludCBjcHUsIGVudW0gY3B1X3N0YXRlX3ZhbHMgc3RhdGUpOworZXh0ZXJuIGVudW0gY3B1X3N0YXRlX3ZhbHMgZ2V0X3ByZWZlcnJlZF9vZmZsaW5lX3N0YXRlKGludCBjcHUpOworZXh0ZXJuIHZvaWQgc2V0X3ByZWZlcnJlZF9vZmZsaW5lX3N0YXRlKGludCBjcHUsIGVudW0gY3B1X3N0YXRlX3ZhbHMgc3RhdGUpOworZXh0ZXJuIHZvaWQgc2V0X2RlZmF1bHRfb2ZmbGluZV9zdGF0ZShpbnQgY3B1KTsKK2V4dGVybiBpbnQgc3RhcnRfc2Vjb25kYXJ5KHZvaWQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGxwYXJfd3JhcHBlcnMuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wbHBhcl93cmFwcGVycy5oCmluZGV4IGEyNGE2YjIzLi4wNjAzYzkxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGxwYXJfd3JhcHBlcnMuaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGxwYXJfd3JhcHBlcnMuaApAQCAtOSwxMSArOSwzMyBAQAogCXJldHVybiBwbHBhcl9oY2FsbF9ub3JldHMoSF9QT0xMX1BFTkRJTkcpOwogfQogCitzdGF0aWMgaW5saW5lIHU4IGdldF9jZWRlX2xhdGVuY3lfaGludCh2b2lkKQoreworCXJldHVybiBnZXRfbHBwYWNhKCktPmdwcjVfZHdvcmQuZmllbGRzLmNlZGVfbGF0ZW5jeV9oaW50OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2NlZGVfbGF0ZW5jeV9oaW50KHU4IGxhdGVuY3lfaGludCkKK3sKKwlnZXRfbHBwYWNhKCktPmdwcjVfZHdvcmQuZmllbGRzLmNlZGVfbGF0ZW5jeV9oaW50ID0gbGF0ZW5jeV9oaW50OworfQorCiBzdGF0aWMgaW5saW5lIGxvbmcgY2VkZV9wcm9jZXNzb3Iodm9pZCkKIHsKIAlyZXR1cm4gcGxwYXJfaGNhbGxfbm9yZXRzKEhfQ0VERSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgbG9uZyBleHRlbmRlZF9jZWRlX3Byb2Nlc3Nvcih1bnNpZ25lZCBsb25nIGxhdGVuY3lfaGludCkKK3sKKwlsb25nIHJjOworCXU4IG9sZF9sYXRlbmN5X2hpbnQgPSBnZXRfY2VkZV9sYXRlbmN5X2hpbnQoKTsKKworCXNldF9jZWRlX2xhdGVuY3lfaGludChsYXRlbmN5X2hpbnQpOworCXJjID0gY2VkZV9wcm9jZXNzb3IoKTsKKwlzZXRfY2VkZV9sYXRlbmN5X2hpbnQob2xkX2xhdGVuY3lfaGludCk7CisKKwlyZXR1cm4gcmM7Cit9CisKIHN0YXRpYyBpbmxpbmUgbG9uZyB2cGFfY2FsbCh1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIGNwdSwKIAkJdW5zaWduZWQgbG9uZyB2cGEpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9yZWNvbmZpZy5jCmluZGV4IDJlMmJiZTEuLmEyMzA1ZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9yZWNvbmZpZy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9yZWNvbmZpZy5jCkBAIC05Niw3ICs5Niw3IEBACiAJcmV0dXJuIHBhcmVudDsKIH0KIAotc3RhdGljIEJMT0NLSU5HX05PVElGSUVSX0hFQUQocFNlcmllc19yZWNvbmZpZ19jaGFpbik7CitCTE9DS0lOR19OT1RJRklFUl9IRUFEKHBTZXJpZXNfcmVjb25maWdfY2hhaW4pOwogCiBpbnQgcFNlcmllc19yZWNvbmZpZ19ub3RpZmllcl9yZWdpc3RlcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQogewpAQCAtMTg0LDcgKzE4NCw3IEBACiB9CiAKIC8qCi0gKiAvcHJvYy9wcGM2NC9vZmR0IC0geXVja3kgYmluYXJ5IGludGVyZmFjZSBmb3IgYWRkaW5nIGFuZCByZW1vdmluZworICogL3Byb2MvcG93ZXJwYy9vZmR0IC0geXVja3kgYmluYXJ5IGludGVyZmFjZSBmb3IgYWRkaW5nIGFuZCByZW1vdmluZwogICogT0YgZGV2aWNlIG5vZGVzLiAgU2hvdWxkIGJlIGRlcHJlY2F0ZWQgYXMgc29vbiBhcyB3ZSBnZXQgYW4KICAqIGluLWtlcm5lbCB3cmFwcGVyIGZvciB0aGUgUlRBUyBpYm0sY29uZmlndXJlLWNvbm5lY3RvciBjYWxsLgogICovCkBAIC01NDMsNyArNTQzLDcgQEAKIAkud3JpdGUgPSBvZmR0X3dyaXRlCiB9OwogCi0vKiBjcmVhdGUgL3Byb2MvcHBjNjQvb2ZkdCB3cml0ZS1vbmx5IGJ5IHJvb3QgKi8KKy8qIGNyZWF0ZSAvcHJvYy9wb3dlcnBjL29mZHQgd3JpdGUtb25seSBieSByb290ICovCiBzdGF0aWMgaW50IHByb2NfcHBjNjRfY3JlYXRlX29mZHQodm9pZCkKIHsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudDsKQEAgLTU1MSw3ICs1NTEsNyBAQAogCWlmICghbWFjaGluZV9pcyhwc2VyaWVzKSkKIAkJcmV0dXJuIDA7CiAKLQllbnQgPSBwcm9jX2NyZWF0ZSgicHBjNjQvb2ZkdCIsIFNfSVdVU1IsIE5VTEwsICZvZmR0X2ZvcHMpOworCWVudCA9IHByb2NfY3JlYXRlKCJwb3dlcnBjL29mZHQiLCBTX0lXVVNSLCBOVUxMLCAmb2ZkdF9mb3BzKTsKIAlpZiAoZW50KQogCQllbnQtPnNpemUgPSAwOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcnRhc2QuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ydGFzZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2NiYWM4Li4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ydGFzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgQW50b24gQmxhbmNoYXJkIDxhbnRvbkBhdS5pYm0uY29tPiwgSUJNCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBDb21tdW5pY2F0aW9uIHRvIHVzZXJzcGFjZSBiYXNlZCBvbiBrZXJuZWwvcHJpbnRrLmMKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1Lmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9ydGFzLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vbnZyYW0uaD4KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KLQotCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJ0YXNkX2xvZ19sb2NrKTsKLQotc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHJ0YXNfbG9nX3dhaXQpOwotCi1zdGF0aWMgY2hhciAqcnRhc19sb2dfYnVmOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgcnRhc19sb2dfc3RhcnQ7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBydGFzX2xvZ19zaXplOwotCi1zdGF0aWMgaW50IHN1cnZlaWxsYW5jZV90aW1lb3V0ID0gLTE7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHJ0YXNfZXJyb3JfbG9nX21heDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcnRhc19lcnJvcl9sb2dfYnVmZmVyX21heDsKLQotLyogUlRBUyBzZXJ2aWNlIHRva2VucyAqLwotc3RhdGljIHVuc2lnbmVkIGludCBldmVudF9zY2FuOwotc3RhdGljIHVuc2lnbmVkIGludCBydGFzX2V2ZW50X3NjYW5fcmF0ZTsKLQotc3RhdGljIGludCBmdWxsX3J0YXNfbXNncyA9IDA7Ci0KLS8qIFN0b3AgbG9nZ2luZyB0byBudnJhbSBhZnRlciBmaXJzdCBmYXRhbCBlcnJvciAqLwotc3RhdGljIGludCBsb2dnaW5nX2VuYWJsZWQ7IC8qIFVudGlsIHdlIGluaXRpYWxpemUgZXZlcnl0aGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtYWtlIHN1cmUgd2UgZG9uJ3QgdHJ5IGxvZ2dpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbnl0aGluZyAqLwotc3RhdGljIGludCBlcnJvcl9sb2dfY250OwotCi0vKgotICogU2luY2Ugd2UgdXNlIDMyIGJpdCBSVEFTLCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGlzIG11c3QgYmUgYmVsb3cKLSAqIDRHIG9yIGVsc2UgYmFkIHRoaW5ncyBoYXBwZW4uIEFsbG9jYXRlIHRoaXMgaW4gdGhlIGtlcm5lbCBkYXRhIGFuZAotICogbWFrZSBpdCBiaWcgZW5vdWdoLgotICovCi1zdGF0aWMgdW5zaWduZWQgY2hhciBsb2dkYXRhW1JUQVNfRVJST1JfTE9HX01BWF07Ci0KLXN0YXRpYyBjaGFyICpydGFzX3R5cGVbXSA9IHsKLQkiVW5rbm93biIsICJSZXRyeSIsICJUQ0UgRXJyb3IiLCAiSW50ZXJuYWwgRGV2aWNlIEZhaWx1cmUiLAotCSJUaW1lb3V0IiwgIkRhdGEgUGFyaXR5IiwgIkFkZHJlc3MgUGFyaXR5IiwgIkNhY2hlIFBhcml0eSIsCi0JIkFkZHJlc3MgSW52YWxpZCIsICJFQ0MgVW5jb3JyZWN0ZWQiLCAiRUNDIENvcnJ1cHRlZCIsCi19OwotCi1zdGF0aWMgY2hhciAqcnRhc19ldmVudF90eXBlKGludCB0eXBlKQotewotCWlmICgodHlwZSA+IDApICYmICh0eXBlIDwgMTEpKQotCQlyZXR1cm4gcnRhc190eXBlW3R5cGVdOwotCi0Jc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgUlRBU19UWVBFX0VQT1c6Ci0JCQlyZXR1cm4gIkVQT1ciOwotCQljYXNlIFJUQVNfVFlQRV9QTEFURk9STToKLQkJCXJldHVybiAiUGxhdGZvcm0gRXJyb3IiOwotCQljYXNlIFJUQVNfVFlQRV9JTzoKLQkJCXJldHVybiAiSS9PIEV2ZW50IjsKLQkJY2FzZSBSVEFTX1RZUEVfSU5GTzoKLQkJCXJldHVybiAiUGxhdGZvcm0gSW5mb3JtYXRpb24gRXZlbnQiOwotCQljYXNlIFJUQVNfVFlQRV9ERUFMTE9DOgotCQkJcmV0dXJuICJSZXNvdXJjZSBEZWFsbG9jYXRpb24gRXZlbnQiOwotCQljYXNlIFJUQVNfVFlQRV9EVU1QOgotCQkJcmV0dXJuICJEdW1wIE5vdGlmaWNhdGlvbiBFdmVudCI7Ci0JfQotCi0JcmV0dXJuIHJ0YXNfdHlwZVswXTsKLX0KLQotLyogVG8gc2VlIHRoaXMgaW5mbywgZ3JlcCBSVEFTIC92YXIvbG9nL21lc3NhZ2VzIGFuZCBlYWNoIGVudHJ5Ci0gKiB3aWxsIGJlIGNvbGxlY3RlZCB0b2dldGhlciB3aXRoIG9idmlvdXMgYmVnaW4vZW5kLgotICogVGhlcmUgd2lsbCBiZSBhIHVuaXF1ZSBpZGVudGlmaWVyIG9uIHRoZSBiZWdpbiBhbmQgZW5kIGxpbmVzLgotICogVGhpcyB3aWxsIHBlcnNpc3QgYWNyb3NzIHJlYm9vdHMuCi0gKgotICogZm9ybWF0IG9mIGVycm9yIGxvZ3MgcmV0dXJuZWQgZnJvbSBSVEFTOgotICogYnl0ZXMJKHNpemUpCTogY29udGVudHMKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAwLTcJCSg4KQk6IHJ0YXNfZXJyb3JfbG9nCi0gKiA4LTQ3CQkoNDApCTogZXh0ZW5kZWQgaW5mbwotICogNDgtNTEJKDQpCTogdmVuZG9yIGlkCi0gKiA1Mi0xMDIzICh2ZW5kb3Igc3BlY2lmaWMpIDogbG9jYXRpb24gY29kZSBhbmQgZGVidWcgZGF0YQotICovCi1zdGF0aWMgdm9pZCBwcmludGtfbG9nX3J0YXMoY2hhciAqYnVmLCBpbnQgbGVuKQotewotCi0JaW50IGksaixuID0gMDsKLQlpbnQgcGVybGluZSA9IDE2OwotCWNoYXIgYnVmZmVyWzY0XTsKLQljaGFyICogc3RyID0gIlJUQVMgZXZlbnQiOwotCi0JaWYgKGZ1bGxfcnRhc19tc2dzKSB7Ci0JCXByaW50ayhSVEFTX0RFQlVHICIlZCAtLS0tLS0tLSAlcyBiZWdpbiAtLS0tLS0tLVxuIiwKLQkJICAgICAgIGVycm9yX2xvZ19jbnQsIHN0cik7Ci0KLQkJLyoKLQkJICogUHJpbnQgcGVybGluZSBieXRlcyBvbiBlYWNoIGxpbmUsIGVhY2ggbGluZSB3aWxsIHN0YXJ0Ci0JCSAqIHdpdGggUlRBUyBhbmQgYSBjaGFuZ2luZyBudW1iZXIsIHNvIHN5c2xvZ2Qgd2lsbAotCQkgKiBwcmludCBsaW5lcyB0aGF0IGFyZSBvdGhlcndpc2UgdGhlIHNhbWUuICBTZXBhcmF0ZSBldmVyeQotCQkgKiA0IGJ5dGVzIHdpdGggYSBzcGFjZS4KLQkJICovCi0JCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaiA9IGkgJSBwZXJsaW5lOwotCQkJaWYgKGogPT0gMCkgewotCQkJCW1lbXNldChidWZmZXIsIDAsIHNpemVvZihidWZmZXIpKTsKLQkJCQluID0gc3ByaW50ZihidWZmZXIsICJSVEFTICVkOiIsIGkvcGVybGluZSk7Ci0JCQl9Ci0KLQkJCWlmICgoaSAlIDQpID09IDApCi0JCQkJbiArPSBzcHJpbnRmKGJ1ZmZlcituLCAiICIpOwotCi0JCQluICs9IHNwcmludGYoYnVmZmVyK24sICIlMDJ4IiwgKHVuc2lnbmVkIGNoYXIpYnVmW2ldKTsKLQotCQkJaWYgKGogPT0gKHBlcmxpbmUtMSkpCi0JCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCBidWZmZXIpOwotCQl9Ci0JCWlmICgoaSAlIHBlcmxpbmUpICE9IDApCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIGJ1ZmZlcik7Ci0KLQkJcHJpbnRrKFJUQVNfREVCVUcgIiVkIC0tLS0tLS0tICVzIGVuZCAtLS0tLS0tLS0tXG4iLAotCQkgICAgICAgZXJyb3JfbG9nX2NudCwgc3RyKTsKLQl9IGVsc2UgewotCQlzdHJ1Y3QgcnRhc19lcnJvcl9sb2cgKmVycmxvZyA9IChzdHJ1Y3QgcnRhc19lcnJvcl9sb2cgKilidWY7Ci0KLQkJcHJpbnRrKFJUQVNfREVCVUcgImV2ZW50OiAlZCwgVHlwZTogJXMsIFNldmVyaXR5OiAlZFxuIiwKLQkJICAgICAgIGVycm9yX2xvZ19jbnQsIHJ0YXNfZXZlbnRfdHlwZShlcnJsb2ctPnR5cGUpLAotCQkgICAgICAgZXJybG9nLT5zZXZlcml0eSk7Ci0JfQotfQotCi1zdGF0aWMgaW50IGxvZ19ydGFzX2xlbihjaGFyICogYnVmKQotewotCWludCBsZW47Ci0Jc3RydWN0IHJ0YXNfZXJyb3JfbG9nICplcnI7Ci0KLQkvKiBydGFzIGZpeGVkIGhlYWRlciAqLwotCWxlbiA9IDg7Ci0JZXJyID0gKHN0cnVjdCBydGFzX2Vycm9yX2xvZyAqKWJ1ZjsKLQlpZiAoZXJyLT5leHRlbmRlZF9sb2dfbGVuZ3RoKSB7Ci0KLQkJLyogZXh0ZW5kZWQgaGVhZGVyICovCi0JCWxlbiArPSBlcnItPmV4dGVuZGVkX2xvZ19sZW5ndGg7Ci0JfQotCi0JaWYgKHJ0YXNfZXJyb3JfbG9nX21heCA9PSAwKQotCQlydGFzX2Vycm9yX2xvZ19tYXggPSBydGFzX2dldF9lcnJvcl9sb2dfbWF4KCk7Ci0KLQlpZiAobGVuID4gcnRhc19lcnJvcl9sb2dfbWF4KQotCQlsZW4gPSBydGFzX2Vycm9yX2xvZ19tYXg7Ci0KLQlyZXR1cm4gbGVuOwotfQotCi0vKgotICogRmlyc3Qgd3JpdGUgdG8gbnZyYW0sIGlmIGZhdGFsIGVycm9yLCB0aGF0IGlzIHRoZSBvbmx5Ci0gKiBwbGFjZSB3ZSBsb2cgdGhlIGluZm8uICBUaGUgZXJyb3Igd2lsbCBiZSBwaWNrZWQgdXAKLSAqIG9uIHRoZSBuZXh0IHJlYm9vdCBieSBydGFzZC4gIElmIG5vdCBmYXRhbCwgcnVuIHRoZQotICogbWV0aG9kIGZvciB0aGUgdHlwZSBvZiBlcnJvci4gIEN1cnJlbnRseSwgb25seSBSVEFTCi0gKiBlcnJvcnMgaGF2ZSBtZXRob2RzIGltcGxlbWVudGVkLCBidXQgaW4gdGhlIGZ1dHVyZQotICogdGhlcmUgbWlnaHQgYmUgYSBuZWVkIHRvIHN0b3JlIGRhdGEgaW4gbnZyYW0gYmVmb3JlIGEKLSAqIGNhbGwgdG8gcGFuaWMoKS4KLSAqCi0gKiBYWFggV2Ugd3JpdGUgdG8gbnZyYW0gcGVyaW9kaWNhbGx5LCB0byBpbmRpY2F0ZSBlcnJvciBoYXMKLSAqIGJlZW4gd3JpdHRlbiBhbmQgc3luYydkLCBidXQgdGhlcmUgaXMgYSBwb3NzaWJpbGl0eQotICogdGhhdCBpZiB3ZSBkb24ndCBzaHV0ZG93biBjb3JyZWN0bHksIGEgZHVwbGljYXRlIGVycm9yCi0gKiByZWNvcmQgd2lsbCBiZSBjcmVhdGVkIG9uIG5leHQgcmVib290LgotICovCi12b2lkIHBTZXJpZXNfbG9nX2Vycm9yKGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGVycl90eXBlLCBpbnQgZmF0YWwpCi17Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBzOwotCWludCBsZW4gPSAwOwotCi0JcHJfZGVidWcoInJ0YXNkOiBsb2dnaW5nIGV2ZW50XG4iKTsKLQlpZiAoYnVmID09IE5VTEwpCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZydGFzZF9sb2dfbG9jaywgcyk7Ci0KLQkvKiBnZXQgbGVuZ3RoIGFuZCBpbmNyZWFzZSBjb3VudCAqLwotCXN3aXRjaCAoZXJyX3R5cGUgJiBFUlJfVFlQRV9NQVNLKSB7Ci0JY2FzZSBFUlJfVFlQRV9SVEFTX0xPRzoKLQkJbGVuID0gbG9nX3J0YXNfbGVuKGJ1Zik7Ci0JCWlmICghKGVycl90eXBlICYgRVJSX0ZMQUdfQk9PVCkpCi0JCQllcnJvcl9sb2dfY250Kys7Ci0JCWJyZWFrOwotCWNhc2UgRVJSX1RZUEVfS0VSTkVMX1BBTklDOgotCWRlZmF1bHQ6Ci0JCVdBUk5fT05fT05DRSghaXJxc19kaXNhYmxlZCgpKTsgLyogQEBAIERFQlVHIEBAQCAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGFzZF9sb2dfbG9jaywgcyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBXcml0ZSBlcnJvciB0byBOVlJBTSAqLwotCWlmIChsb2dnaW5nX2VuYWJsZWQgJiYgIShlcnJfdHlwZSAmIEVSUl9GTEFHX0JPT1QpKQotCQludnJhbV93cml0ZV9lcnJvcl9sb2coYnVmLCBsZW4sIGVycl90eXBlLCBlcnJvcl9sb2dfY250KTsKLQotCS8qCi0JICogcnRhcyBlcnJvcnMgY2FuIG9jY3VyIGR1cmluZyBib290LCBhbmQgd2UgZG8gd2FudCB0byBjYXB0dXJlCi0JICogdGhvc2Ugc29tZXdoZXJlLCBldmVuIGlmIG52cmFtIGlzbid0IHJlYWR5ICh3aHkgbm90PyksIGFuZCBldmVuCi0JICogaWYgcnRhc2QgaXNuJ3QgcmVhZHkuIFB1dCB0aGVtIGludG8gdGhlIGJvb3QgbG9nLCBhdCBsZWFzdC4KLQkgKi8KLQlpZiAoKGVycl90eXBlICYgRVJSX1RZUEVfTUFTSykgPT0gRVJSX1RZUEVfUlRBU19MT0cpCi0JCXByaW50a19sb2dfcnRhcyhidWYsIGxlbik7Ci0KLQkvKiBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBvciBoYXZlIHN0b3BwZWQgbG9nZ2luZyAqLwotCWlmIChmYXRhbCB8fCAhbG9nZ2luZ19lbmFibGVkKSB7Ci0JCWxvZ2dpbmdfZW5hYmxlZCA9IDA7Ci0JCVdBUk5fT05fT05DRSghaXJxc19kaXNhYmxlZCgpKTsgLyogQEBAIERFQlVHIEBAQCAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGFzZF9sb2dfbG9jaywgcyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBjYWxsIHR5cGUgc3BlY2lmaWMgbWV0aG9kIGZvciBlcnJvciAqLwotCXN3aXRjaCAoZXJyX3R5cGUgJiBFUlJfVFlQRV9NQVNLKSB7Ci0JY2FzZSBFUlJfVFlQRV9SVEFTX0xPRzoKLQkJb2Zmc2V0ID0gcnRhc19lcnJvcl9sb2dfYnVmZmVyX21heCAqCi0JCQkoKHJ0YXNfbG9nX3N0YXJ0K3J0YXNfbG9nX3NpemUpICYgTE9HX05VTUJFUl9NQVNLKTsKLQotCQkvKiBGaXJzdCBjb3B5IG92ZXIgc2VxdWVuY2UgbnVtYmVyICovCi0JCW1lbWNweSgmcnRhc19sb2dfYnVmW29mZnNldF0sICh2b2lkICopICZlcnJvcl9sb2dfY250LCBzaXplb2YoaW50KSk7Ci0KLQkJLyogU2Vjb25kIGNvcHkgb3ZlciBlcnJvciBsb2cgZGF0YSAqLwotCQlvZmZzZXQgKz0gc2l6ZW9mKGludCk7Ci0JCW1lbWNweSgmcnRhc19sb2dfYnVmW29mZnNldF0sIGJ1ZiwgbGVuKTsKLQotCQlpZiAocnRhc19sb2dfc2l6ZSA8IExPR19OVU1CRVIpCi0JCQlydGFzX2xvZ19zaXplICs9IDE7Ci0JCWVsc2UKLQkJCXJ0YXNfbG9nX3N0YXJ0ICs9IDE7Ci0KLQkJV0FSTl9PTl9PTkNFKCFpcnFzX2Rpc2FibGVkKCkpOyAvKiBAQEAgREVCVUcgQEBAICovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0YXNkX2xvZ19sb2NrLCBzKTsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZydGFzX2xvZ193YWl0KTsKLQkJYnJlYWs7Ci0JY2FzZSBFUlJfVFlQRV9LRVJORUxfUEFOSUM6Ci0JZGVmYXVsdDoKLQkJV0FSTl9PTl9PTkNFKCFpcnFzX2Rpc2FibGVkKCkpOyAvKiBAQEAgREVCVUcgQEBAICovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0YXNkX2xvZ19sb2NrLCBzKTsKLQkJcmV0dXJuOwotCX0KLQotfQotCi0KLXN0YXRpYyBpbnQgcnRhc19sb2dfb3BlbihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJ0YXNfbG9nX3JlbGVhc2Uoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotLyogVGhpcyB3aWxsIGNoZWNrIGlmIGFsbCBldmVudHMgYXJlIGxvZ2dlZCwgaWYgdGhleSBhcmUgdGhlbiwgd2UKLSAqIGtub3cgdGhhdCB3ZSBjYW4gc2FmZWx5IGNsZWFyIHRoZSBldmVudHMgaW4gTlZSQU0uCi0gKiBOZXh0IHdlJ2xsIHNpdCBhbmQgd2FpdCBmb3Igc29tZXRoaW5nIGVsc2UgdG8gbG9nLgotICovCi1zdGF0aWMgc3NpemVfdCBydGFzX2xvZ19yZWFkKHN0cnVjdCBmaWxlICogZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsCi0JCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JaW50IGVycm9yOwotCWNoYXIgKnRtcDsKLQl1bnNpZ25lZCBsb25nIHM7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0KLQlpZiAoIWJ1ZiB8fCBjb3VudCA8IHJ0YXNfZXJyb3JfbG9nX2J1ZmZlcl9tYXgpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JY291bnQgPSBydGFzX2Vycm9yX2xvZ19idWZmZXJfbWF4OwotCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWYsIGNvdW50KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQl0bXAgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKLQlpZiAoIXRtcCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcnRhc2RfbG9nX2xvY2ssIHMpOwotCS8qIGlmIGl0J3MgMCwgdGhlbiB3ZSBrbm93IHdlIGdvdCB0aGUgbGFzdCBvbmUgKHRoZSBvbmUgaW4gTlZSQU0pICovCi0Jd2hpbGUgKHJ0YXNfbG9nX3NpemUgPT0gMCkgewotCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0YXNkX2xvZ19sb2NrLCBzKTsKLQkJCWVycm9yID0gLUVBR0FJTjsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJaWYgKCFsb2dnaW5nX2VuYWJsZWQpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0YXNkX2xvZ19sb2NrLCBzKTsKLQkJCWVycm9yID0gLUVOT0RBVEE7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQludnJhbV9jbGVhcl9lcnJvcl9sb2coKTsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGFzZF9sb2dfbG9jaywgcyk7Ci0JCWVycm9yID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHJ0YXNfbG9nX3dhaXQsIHJ0YXNfbG9nX3NpemUpOwotCQlpZiAoZXJyb3IpCi0JCQlnb3RvIG91dDsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0YXNkX2xvZ19sb2NrLCBzKTsKLQl9Ci0KLQlvZmZzZXQgPSBydGFzX2Vycm9yX2xvZ19idWZmZXJfbWF4ICogKHJ0YXNfbG9nX3N0YXJ0ICYgTE9HX05VTUJFUl9NQVNLKTsKLQltZW1jcHkodG1wLCAmcnRhc19sb2dfYnVmW29mZnNldF0sIGNvdW50KTsKLQotCXJ0YXNfbG9nX3N0YXJ0ICs9IDE7Ci0JcnRhc19sb2dfc2l6ZSAtPSAxOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0YXNkX2xvZ19sb2NrLCBzKTsKLQotCWVycm9yID0gY29weV90b191c2VyKGJ1ZiwgdG1wLCBjb3VudCkgPyAtRUZBVUxUIDogY291bnQ7Ci1vdXQ6Ci0Ja2ZyZWUodG1wKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgcnRhc19sb2dfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqIHdhaXQpCi17Ci0JcG9sbF93YWl0KGZpbGUsICZydGFzX2xvZ193YWl0LCB3YWl0KTsKLQlpZiAocnRhc19sb2dfc2l6ZSkKLQkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfcnRhc19sb2dfb3BlcmF0aW9ucyA9IHsKLQkucmVhZCA9CQlydGFzX2xvZ19yZWFkLAotCS5wb2xsID0JCXJ0YXNfbG9nX3BvbGwsCi0JLm9wZW4gPQkJcnRhc19sb2dfb3BlbiwKLQkucmVsZWFzZSA9CXJ0YXNfbG9nX3JlbGVhc2UsCi19OwotCi1zdGF0aWMgaW50IGVuYWJsZV9zdXJ2ZWlsbGFuY2UoaW50IHRpbWVvdXQpCi17Ci0JaW50IGVycm9yOwotCi0JZXJyb3IgPSBydGFzX3NldF9pbmRpY2F0b3IoU1VSVkVJTExBTkNFX1RPS0VOLCAwLCB0aW1lb3V0KTsKLQotCWlmIChlcnJvciA9PSAwKQotCQlyZXR1cm4gMDsKLQotCWlmIChlcnJvciA9PSAtRUlOVkFMKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJydGFzZDogc3VydmVpbGxhbmNlIG5vdCBzdXBwb3J0ZWRcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwcmludGsoS0VSTl9FUlIgInJ0YXNkOiBjb3VsZCBub3QgdXBkYXRlIHN1cnZlaWxsYW5jZVxuIik7Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgdm9pZCBkb19ldmVudF9zY2FuKHZvaWQpCi17Ci0JaW50IGVycm9yOwotCWRvIHsKLQkJbWVtc2V0KGxvZ2RhdGEsIDAsIHJ0YXNfZXJyb3JfbG9nX21heCk7Ci0JCWVycm9yID0gcnRhc19jYWxsKGV2ZW50X3NjYW4sIDQsIDEsIE5VTEwsCi0JCQkJICBSVEFTX0VWRU5UX1NDQU5fQUxMX0VWRU5UUywgMCwKLQkJCQkgIF9fcGEobG9nZGF0YSksIHJ0YXNfZXJyb3JfbG9nX21heCk7Ci0JCWlmIChlcnJvciA9PSAtMSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJldmVudC1zY2FuIGZhaWxlZFxuIik7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChlcnJvciA9PSAwKQotCQkJcFNlcmllc19sb2dfZXJyb3IobG9nZGF0YSwgRVJSX1RZUEVfUlRBU19MT0csIDApOwotCi0JfSB3aGlsZShlcnJvciA9PSAwKTsKLX0KLQotc3RhdGljIHZvaWQgcnRhc19ldmVudF9zY2FuKHN0cnVjdCB3b3JrX3N0cnVjdCAqdyk7Ci1ERUNMQVJFX0RFTEFZRURfV09SSyhldmVudF9zY2FuX3dvcmssIHJ0YXNfZXZlbnRfc2Nhbik7Ci0KLS8qCi0gKiBEZWxheSBzaG91bGQgYmUgYXQgbGVhc3Qgb25lIHNlY29uZCBzaW5jZSBzb21lIG1hY2hpbmVzIGhhdmUgcHJvYmxlbXMgaWYKLSAqIHdlIGNhbGwgZXZlbnQtc2NhbiB0b28gcXVpY2tseS4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZXZlbnRfc2Nhbl9kZWxheSA9IDEqSFo7Ci1zdGF0aWMgaW50IGZpcnN0X3Bhc3MgPSAxOwotCi1zdGF0aWMgdm9pZCBydGFzX2V2ZW50X3NjYW4oc3RydWN0IHdvcmtfc3RydWN0ICp3KQotewotCXVuc2lnbmVkIGludCBjcHU7Ci0KLQlkb19ldmVudF9zY2FuKCk7Ci0KLQlnZXRfb25saW5lX2NwdXMoKTsKLQotCWNwdSA9IG5leHRfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1X29ubGluZV9tYXApOwotCWlmIChjcHUgPT0gTlJfQ1BVUykgewotCQljcHUgPSBmaXJzdF9jcHUoY3B1X29ubGluZV9tYXApOwotCi0JCWlmIChmaXJzdF9wYXNzKSB7Ci0JCQlmaXJzdF9wYXNzID0gMDsKLQkJCWV2ZW50X3NjYW5fZGVsYXkgPSAzMCpIWi9ydGFzX2V2ZW50X3NjYW5fcmF0ZTsKLQotCQkJaWYgKHN1cnZlaWxsYW5jZV90aW1lb3V0ICE9IC0xKSB7Ci0JCQkJcHJfZGVidWcoInJ0YXNkOiBlbmFibGluZyBzdXJ2ZWlsbGFuY2VcbiIpOwotCQkJCWVuYWJsZV9zdXJ2ZWlsbGFuY2Uoc3VydmVpbGxhbmNlX3RpbWVvdXQpOwotCQkJCXByX2RlYnVnKCJydGFzZDogc3VydmVpbGxhbmNlIGVuYWJsZWRcbiIpOwotCQkJfQotCQl9Ci0JfQotCi0Jc2NoZWR1bGVfZGVsYXllZF93b3JrX29uKGNwdSwgJmV2ZW50X3NjYW5fd29yaywKLQkJX19yb3VuZF9qaWZmaWVzX3JlbGF0aXZlKGV2ZW50X3NjYW5fZGVsYXksIGNwdSkpOwotCi0JcHV0X29ubGluZV9jcHVzKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0YXJ0X2V2ZW50X3NjYW4odm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgZXJyX3R5cGU7Ci0JaW50IHJjOwotCi0JcHJpbnRrKEtFUk5fREVCVUcgIlJUQVMgZGFlbW9uIHN0YXJ0ZWRcbiIpOwotCXByX2RlYnVnKCJydGFzZDogd2lsbCBzbGVlcCBmb3IgJWQgbWlsbGlzZWNvbmRzXG4iLAotCQkgKDMwMDAwIC8gcnRhc19ldmVudF9zY2FuX3JhdGUpKTsKLQotCS8qIFNlZSBpZiB3ZSBoYXZlIGFueSBlcnJvciBzdG9yZWQgaW4gTlZSQU0gKi8KLQltZW1zZXQobG9nZGF0YSwgMCwgcnRhc19lcnJvcl9sb2dfbWF4KTsKLQlyYyA9IG52cmFtX3JlYWRfZXJyb3JfbG9nKGxvZ2RhdGEsIHJ0YXNfZXJyb3JfbG9nX21heCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJfdHlwZSwgJmVycm9yX2xvZ19jbnQpOwotCS8qIFdlIGNhbiB1c2UgcnRhc19sb2dfYnVmIG5vdyAqLwotCWxvZ2dpbmdfZW5hYmxlZCA9IDE7Ci0KLQlpZiAoIXJjKSB7Ci0JCWlmIChlcnJfdHlwZSAhPSBFUlJfRkxBR19BTFJFQURZX0xPR0dFRCkgewotCQkJcFNlcmllc19sb2dfZXJyb3IobG9nZGF0YSwgZXJyX3R5cGUgfCBFUlJfRkxBR19CT09ULCAwKTsKLQkJfQotCX0KLQotCXNjaGVkdWxlX2RlbGF5ZWRfd29ya19vbihmaXJzdF9jcHUoY3B1X29ubGluZV9tYXApLCAmZXZlbnRfc2Nhbl93b3JrLAotCQkJCSBldmVudF9zY2FuX2RlbGF5KTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgcnRhc19pbml0KHZvaWQpCi17Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeTsKLQotCWlmICghbWFjaGluZV9pcyhwc2VyaWVzKSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBObyBSVEFTICovCi0JZXZlbnRfc2NhbiA9IHJ0YXNfdG9rZW4oImV2ZW50LXNjYW4iKTsKLQlpZiAoZXZlbnRfc2NhbiA9PSBSVEFTX1VOS05PV05fU0VSVklDRSkgewotCQlwcmludGsoS0VSTl9ERUJVRyAicnRhc2Q6IG5vIGV2ZW50LXNjYW4gb24gc3lzdGVtXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JcnRhc19ldmVudF9zY2FuX3JhdGUgPSBydGFzX3Rva2VuKCJydGFzLWV2ZW50LXNjYW4tcmF0ZSIpOwotCWlmIChydGFzX2V2ZW50X3NjYW5fcmF0ZSA9PSBSVEFTX1VOS05PV05fU0VSVklDRSkgewotCQlwcmludGsoS0VSTl9FUlIgInJ0YXNkOiBubyBydGFzLWV2ZW50LXNjYW4tcmF0ZSBvbiBzeXN0ZW1cbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQkvKiBNYWtlIHJvb20gZm9yIHRoZSBzZXF1ZW5jZSBudW1iZXIgKi8KLQlydGFzX2Vycm9yX2xvZ19tYXggPSBydGFzX2dldF9lcnJvcl9sb2dfbWF4KCk7Ci0JcnRhc19lcnJvcl9sb2dfYnVmZmVyX21heCA9IHJ0YXNfZXJyb3JfbG9nX21heCArIHNpemVvZihpbnQpOwotCi0JcnRhc19sb2dfYnVmID0gdm1hbGxvYyhydGFzX2Vycm9yX2xvZ19idWZmZXJfbWF4KkxPR19OVU1CRVIpOwotCWlmICghcnRhc19sb2dfYnVmKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicnRhc2Q6IG5vIG1lbW9yeVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWVudHJ5ID0gcHJvY19jcmVhdGUoInBwYzY0L3J0YXMvZXJyb3JfbG9nIiwgU19JUlVTUiwgTlVMTCwKLQkJCSAgICAmcHJvY19ydGFzX2xvZ19vcGVyYXRpb25zKTsKLQlpZiAoIWVudHJ5KQotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBjcmVhdGUgZXJyb3JfbG9nIHByb2MgZW50cnlcbiIpOwotCi0Jc3RhcnRfZXZlbnRfc2NhbigpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHN1cnZlaWxsYW5jZV9zZXR1cChjaGFyICpzdHIpCi17Ci0JaW50IGk7Ci0KLQlpZiAoZ2V0X29wdGlvbigmc3RyLCZpKSkgewotCQlpZiAoaSA+PSAwICYmIGkgPD0gMjU1KQotCQkJc3VydmVpbGxhbmNlX3RpbWVvdXQgPSBpOwotCX0KLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBydGFzbXNnc19zZXR1cChjaGFyICpzdHIpCi17Ci0JaWYgKHN0cmNtcChzdHIsICJvbiIpID09IDApCi0JCWZ1bGxfcnRhc19tc2dzID0gMTsKLQllbHNlIGlmIChzdHJjbXAoc3RyLCAib2ZmIikgPT0gMCkKLQkJZnVsbF9ydGFzX21zZ3MgPSAwOwotCi0JcmV0dXJuIDE7Ci19Ci1fX2luaXRjYWxsKHJ0YXNfaW5pdCk7Ci1fX3NldHVwKCJzdXJ2ZWlsbGFuY2U9Iiwgc3VydmVpbGxhbmNlX3NldHVwKTsKLV9fc2V0dXAoInJ0YXNtc2dzPSIsIHJ0YXNtc2dzX3NldHVwKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zY2FubG9nLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2NhbmxvZy5jCmluZGV4IDQxN2VjYTcuLjFiNDVjNDUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zY2FubG9nLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NjYW5sb2cuYwpAQCAtMTMsNyArMTMsNyBAQAogICogb2YgdGhpcyBkYXRhIHVzaW5nIHRoaXMgZHJpdmVyLiAgQSBkdW1wIGV4aXN0cyBpZiB0aGUgZGV2aWNlLXRyZWUKICAqIC9jaG9zZW4vaWJtLHNjYW4tbG9nLWRhdGEgcHJvcGVydHkgZXhpc3RzLgogICoKLSAqIFRoaXMgZHJpdmVyIGV4cG9ydHMgL3Byb2MvcHBjNjQvc2Nhbi1sb2ctZHVtcCB3aGljaCBjYW4gYmUgcmVhZC4KKyAqIFRoaXMgZHJpdmVyIGV4cG9ydHMgL3Byb2MvcG93ZXJwYy9zY2FuLWxvZy1kdW1wIHdoaWNoIGNhbiBiZSByZWFkLgogICogVGhlIGRyaXZlciBzdXBwb3J0cyBvbmx5IHNlcXVlbnRpYWwgcmVhZHMuCiAgKgogICogVGhlIGRyaXZlciBsb29rcyBhdCBhIHdyaXRlIHRvIHRoZSBkcml2ZXIgZm9yIHRoZSBzaW5nbGUgd29yZCAicmVzZXQiLgpAQCAtMTg2LDcgKzE4Niw3IEBACiAJaWYgKCFkYXRhKQogCQlnb3RvIGVycjsKIAotCWVudCA9IHByb2NfY3JlYXRlX2RhdGEoInBwYzY0L3J0YXMvc2Nhbi1sb2ctZHVtcCIsIFNfSVJVU1IsIE5VTEwsCisJZW50ID0gcHJvY19jcmVhdGVfZGF0YSgicG93ZXJwYy9ydGFzL3NjYW4tbG9nLWR1bXAiLCBTX0lSVVNSLCBOVUxMLAogCQkJICAgICAgICZzY2FubG9nX2ZvcHMsIGRhdGEpOwogCWlmICghZW50KQogCQlnb3RvIGVycjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zbXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zbXAuYwppbmRleCA0NDAwMDBjLi44ODY4YzAxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc21wLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NtcC5jCkBAIC00OCw2ICs0OCw3IEBACiAjaW5jbHVkZSAicGxwYXJfd3JhcHBlcnMuaCIKICNpbmNsdWRlICJwc2VyaWVzLmgiCiAjaW5jbHVkZSAieGljcy5oIgorI2luY2x1ZGUgIm9mZmxpbmVfc3RhdGVzLmgiCiAKIAogLyoKQEAgLTg0LDYgKzg1LDkgQEAKIAkvKiBGaXh1cCBhdG9taWMgY291bnQ6IGl0IGV4aXRlZCBpbnNpZGUgSVJRIGhhbmRsZXIuICovCiAJdGFza190aHJlYWRfaW5mbyhwYWNhW2xjcHVdLl9fY3VycmVudCktPnByZWVtcHRfY291bnQJPSAwOwogCisJaWYgKGdldF9jcHVfY3VycmVudF9zdGF0ZShsY3B1KSA9PSBDUFVfU1RBVEVfSU5BQ1RJVkUpCisJCWdvdG8gb3V0OworCiAJLyogCiAJICogSWYgdGhlIFJUQVMgc3RhcnQtY3B1IHRva2VuIGRvZXMgbm90IGV4aXN0IHRoZW4gcHJlc3VtZSB0aGUKIAkgKiBjcHUgaXMgYWxyZWFkeSBzcGlubmluZy4KQEAgLTk4LDYgKzEwMiw3IEBACiAJCXJldHVybiAwOwogCX0KIAorb3V0OgogCXJldHVybiAxOwogfQogCkBAIC0xMTEsMTIgKzExNiwxNiBAQAogCQl2cGFfaW5pdChjcHUpOwogCiAJY3B1X2NsZWFyKGNwdSwgb2Zfc3Bpbl9tYXApOworCXNldF9jcHVfY3VycmVudF9zdGF0ZShjcHUsIENQVV9TVEFURV9PTkxJTkUpOworCXNldF9kZWZhdWx0X29mZmxpbmVfc3RhdGUoY3B1KTsKIAogfQogI2VuZGlmIC8qIENPTkZJR19YSUNTICovCiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBzbXBfcFNlcmllc19raWNrX2NwdShpbnQgbnIpCiB7CisJbG9uZyByYzsKKwl1bnNpZ25lZCBsb25nIGhjcHVpZDsKIAlCVUdfT04obnIgPCAwIHx8IG5yID49IE5SX0NQVVMpOwogCiAJaWYgKCFzbXBfc3RhcnR1cF9jcHUobnIpKQpAQCAtMTI4LDYgKzEzNywxNiBAQAogCSAqIHRoZSBwcm9jZXNzb3Igd2lsbCBjb250aW51ZSBvbiB0byBzZWNvbmRhcnlfc3RhcnQKIAkgKi8KIAlwYWNhW25yXS5jcHVfc3RhcnQgPSAxOworCisJc2V0X3ByZWZlcnJlZF9vZmZsaW5lX3N0YXRlKG5yLCBDUFVfU1RBVEVfT05MSU5FKTsKKworCWlmIChnZXRfY3B1X2N1cnJlbnRfc3RhdGUobnIpID09IENQVV9TVEFURV9JTkFDVElWRSkgeworCQloY3B1aWQgPSBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKG5yKTsKKwkJcmMgPSBwbHBhcl9oY2FsbF9ub3JldHMoSF9QUk9ELCBoY3B1aWQpOworCQlpZiAocmMgIT0gSF9TVUNDRVNTKQorCQkJcGFuaWMoIkVycm9yOiBQcm9kIHRvIHdha2UgdXAgcHJvY2Vzc29yICVkIFJldD0gJWxkXG4iLAorCQkJCW5yLCByYyk7CisJfQogfQogCiBzdGF0aWMgaW50IHNtcF9wU2VyaWVzX2NwdV9ib290YWJsZSh1bnNpZ25lZCBpbnQgbnIpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMveGljcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuYwppbmRleCBiOWJmMGVlLi43ZDAxYjU4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMveGljcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy94aWNzLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9tc2kuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogCiAjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC00Niw2ICs0NywxMiBAQAogICovCiAjZGVmaW5lIElQSV9QUklPUklUWQkJNAogCisvKiBUaGUgbGVhc3QgZmF2b3JlZCBwcmlvcml0eSAqLworI2RlZmluZSBMT1dFU1RfUFJJT1JJVFkJCTB4RkYKKworLyogVGhlIG51bWJlciBvZiBwcmlvcml0aWVzIGRlZmluZWQgYWJvdmUgKi8KKyNkZWZpbmUgTUFYX05VTV9QUklPUklUSUVTCTMKKwogc3RhdGljIHVuc2lnbmVkIGludCBkZWZhdWx0X3NlcnZlciA9IDB4RkY7CiBzdGF0aWMgdW5zaWduZWQgaW50IGRlZmF1bHRfZGlzdHJpYl9zZXJ2ZXIgPSAwOwogc3RhdGljIHVuc2lnbmVkIGludCBpbnRlcnJ1cHRfc2VydmVyX3NpemUgPSA4OwpAQCAtNTYsNiArNjMsMTIgQEAKIHN0YXRpYyBpbnQgaWJtX2ludF9vbjsKIHN0YXRpYyBpbnQgaWJtX2ludF9vZmY7CiAKK3N0cnVjdCB4aWNzX2NwcHIgeworCXVuc2lnbmVkIGNoYXIgc3RhY2tbTUFYX05VTV9QUklPUklUSUVTXTsKKwlpbnQgaW5kZXg7Cit9OworCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHhpY3NfY3BwciwgeGljc19jcHByKTsKIAogLyogRGlyZWN0IGhhcmR3YXJlIGxvdyBsZXZlbCBhY2Nlc3NvcnMgKi8KIApAQCAtMTU3LDcgKzE3MCw3IEBACiAJY3B1bWFza190IGNwdW1hc2s7CiAJY3B1bWFza190IHRtcCA9IENQVV9NQVNLX05PTkU7CiAKLQljcHVtYXNrX2NvcHkoJmNwdW1hc2ssIGlycV9kZXNjW3ZpcnFdLmFmZmluaXR5KTsKKwljcHVtYXNrX2NvcHkoJmNwdW1hc2ssIGlycV90b19kZXNjKHZpcnEpLT5hZmZpbml0eSk7CiAJaWYgKCFkaXN0cmlidXRlX2lycXMpCiAJCXJldHVybiBkZWZhdWx0X3NlcnZlcjsKIApAQCAtMjg0LDYgKzI5NywxOSBAQAogCXJldHVybiB4aXJyICYgMHgwMGZmZmZmZjsKIH0KIAorc3RhdGljIHZvaWQgcHVzaF9jcHByKHVuc2lnbmVkIGludCB2ZWMpCit7CisJc3RydWN0IHhpY3NfY3BwciAqb3NfY3BwciA9ICZfX2dldF9jcHVfdmFyKHhpY3NfY3Bwcik7CisKKwlpZiAoV0FSTl9PTihvc19jcHByLT5pbmRleCA+PSBNQVhfTlVNX1BSSU9SSVRJRVMgLSAxKSkKKwkJcmV0dXJuOworCisJaWYgKHZlYyA9PSBYSUNTX0lQSSkKKwkJb3NfY3Bwci0+c3RhY2tbKytvc19jcHByLT5pbmRleF0gPSBJUElfUFJJT1JJVFk7CisJZWxzZQorCQlvc19jcHByLT5zdGFja1srK29zX2NwcHItPmluZGV4XSA9IERFRkFVTFRfUFJJT1JJVFk7Cit9CisKIHN0YXRpYyB1bnNpZ25lZCBpbnQgeGljc19nZXRfaXJxX2RpcmVjdCh2b2lkKQogewogCXVuc2lnbmVkIGludCB4aXJyID0gZGlyZWN0X3hpcnJfaW5mb19nZXQoKTsKQEAgLTI5NCw4ICszMjAsMTAgQEAKIAkJcmV0dXJuIE5PX0lSUTsKIAogCWlycSA9IGlycV9yYWRpeF9yZXZtYXBfbG9va3VwKHhpY3NfaG9zdCwgdmVjKTsKLQlpZiAobGlrZWx5KGlycSAhPSBOT19JUlEpKQorCWlmIChsaWtlbHkoaXJxICE9IE5PX0lSUSkpIHsKKwkJcHVzaF9jcHByKHZlYyk7CiAJCXJldHVybiBpcnE7CisJfQogCiAJLyogV2UgZG9uJ3QgaGF2ZSBhIGxpbnV4IG1hcHBpbmcsIHNvIGhhdmUgcnRhcyBtYXNrIGl0LiAqLwogCXhpY3NfbWFza191bmtub3duX3ZlYyh2ZWMpOwpAQCAtMzE1LDggKzM0MywxMCBAQAogCQlyZXR1cm4gTk9fSVJROwogCiAJaXJxID0gaXJxX3JhZGl4X3Jldm1hcF9sb29rdXAoeGljc19ob3N0LCB2ZWMpOwotCWlmIChsaWtlbHkoaXJxICE9IE5PX0lSUSkpCisJaWYgKGxpa2VseShpcnEgIT0gTk9fSVJRKSkgeworCQlwdXNoX2NwcHIodmVjKTsKIAkJcmV0dXJuIGlycTsKKwl9CiAKIAkvKiBXZSBkb24ndCBoYXZlIGEgbGludXggbWFwcGluZywgc28gaGF2ZSBSVEFTIG1hc2sgaXQuICovCiAJeGljc19tYXNrX3Vua25vd25fdmVjKHZlYyk7CkBAIC0zMjYsMTIgKzM1NiwyMiBAQAogCXJldHVybiBOT19JUlE7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBvcF9jcHByKHZvaWQpCit7CisJc3RydWN0IHhpY3NfY3BwciAqb3NfY3BwciA9ICZfX2dldF9jcHVfdmFyKHhpY3NfY3Bwcik7CisKKwlpZiAoV0FSTl9PTihvc19jcHByLT5pbmRleCA8IDEpKQorCQlyZXR1cm4gTE9XRVNUX1BSSU9SSVRZOworCisJcmV0dXJuIG9zX2NwcHItPnN0YWNrWy0tb3NfY3Bwci0+aW5kZXhdOworfQorCiBzdGF0aWMgdm9pZCB4aWNzX2VvaV9kaXJlY3QodW5zaWduZWQgaW50IHZpcnEpCiB7CiAJdW5zaWduZWQgaW50IGlycSA9ICh1bnNpZ25lZCBpbnQpaXJxX21hcFt2aXJxXS5od2lycTsKIAogCWlvc3luYygpOwotCWRpcmVjdF94aXJyX2luZm9fc2V0KCgweGZmIDw8IDI0KSB8IGlycSk7CisJZGlyZWN0X3hpcnJfaW5mb19zZXQoKHBvcF9jcHByKCkgPDwgMjQpIHwgaXJxKTsKIH0KIAogc3RhdGljIHZvaWQgeGljc19lb2lfbHBhcih1bnNpZ25lZCBpbnQgdmlycSkKQEAgLTMzOSw3ICszNzksNyBAQAogCXVuc2lnbmVkIGludCBpcnEgPSAodW5zaWduZWQgaW50KWlycV9tYXBbdmlycV0uaHdpcnE7CiAKIAlpb3N5bmMoKTsKLQlscGFyX3hpcnJfaW5mb19zZXQoKDB4ZmYgPDwgMjQpIHwgaXJxKTsKKwlscGFyX3hpcnJfaW5mb19zZXQoKHBvcF9jcHByKCkgPDwgMjQpIHwgaXJxKTsKIH0KIAogc3RhdGljIGludCB4aWNzX3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgdmlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2spCkBAIC0zODgsNyArNDI4LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCB4aWNzX3BpY19kaXJlY3QgPSB7Ci0JLnR5cGVuYW1lID0gIiBYSUNTICAgICAiLAorCS5uYW1lID0gIiBYSUNTICAgICAiLAogCS5zdGFydHVwID0geGljc19zdGFydHVwLAogCS5tYXNrID0geGljc19tYXNrX2lycSwKIAkudW5tYXNrID0geGljc191bm1hc2tfaXJxLApAQCAtMzk3LDcgKzQzNyw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHhpY3NfcGljX2xwYXIgPSB7Ci0JLnR5cGVuYW1lID0gIiBYSUNTICAgICAiLAorCS5uYW1lID0gIiBYSUNTICAgICAiLAogCS5zdGFydHVwID0geGljc19zdGFydHVwLAogCS5tYXNrID0geGljc19tYXNrX2lycSwKIAkudW5tYXNrID0geGljc191bm1hc2tfaXJxLApAQCAtNDI4LDEzICs0NjgsMTMgQEAKIAkvKiBJbnNlcnQgdGhlIGludGVycnVwdCBtYXBwaW5nIGludG8gdGhlIHJhZGl4IHRyZWUgZm9yIGZhc3QgbG9va3VwICovCiAJaXJxX3JhZGl4X3Jldm1hcF9pbnNlcnQoeGljc19ob3N0LCB2aXJxLCBodyk7CiAKLQlnZXRfaXJxX2Rlc2ModmlycSktPnN0YXR1cyB8PSBJUlFfTEVWRUw7CisJaXJxX3RvX2Rlc2ModmlycSktPnN0YXR1cyB8PSBJUlFfTEVWRUw7CiAJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKHZpcnEsIHhpY3NfaXJxX2NoaXAsIGhhbmRsZV9mYXN0ZW9pX2lycSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgeGljc19ob3N0X3hsYXRlKHN0cnVjdCBpcnFfaG9zdCAqaCwgc3RydWN0IGRldmljZV9ub2RlICpjdCwKLQkJCSAgIHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUsCisJCQkgICBjb25zdCB1MzIgKmludHNwZWMsIHVuc2lnbmVkIGludCBpbnRzaXplLAogCQkJICAgaXJxX2h3X251bWJlcl90ICpvdXRfaHdpcnEsIHVuc2lnbmVkIGludCAqb3V0X2ZsYWdzKQogCiB7CkBAIC03NDYsNiArNzg2LDEyIEBACiAKIHN0YXRpYyB2b2lkIHhpY3Nfc2V0X2NwdV9wcmlvcml0eSh1bnNpZ25lZCBjaGFyIGNwcHIpCiB7CisJc3RydWN0IHhpY3NfY3BwciAqb3NfY3BwciA9ICZfX2dldF9jcHVfdmFyKHhpY3NfY3Bwcik7CisKKwlCVUdfT04ob3NfY3Bwci0+aW5kZXggIT0gMCk7CisKKwlvc19jcHByLT5zdGFja1tvc19jcHByLT5pbmRleF0gPSBjcHByOworCiAJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfTFBBUikpCiAJCWxwYXJfY3Bwcl9pbmZvKGNwcHIpOwogCWVsc2UKQEAgLTc3Miw3ICs4MTgsNyBAQAogCiB2b2lkIHhpY3Nfc2V0dXBfY3B1KHZvaWQpCiB7Ci0JeGljc19zZXRfY3B1X3ByaW9yaXR5KDB4ZmYpOworCXhpY3Nfc2V0X2NwdV9wcmlvcml0eShMT1dFU1RfUFJJT1JJVFkpOwogCiAJeGljc19zZXRfY3B1X2dpcShkZWZhdWx0X2Rpc3RyaWJfc2VydmVyLCAxKTsKIH0KQEAgLTg1Miw3ICs4OTgsNyBAQAogCQkvKiBXZSBuZWVkIHRvIGdldCBJUElzIHN0aWxsLiAqLwogCQlpZiAoaXJxID09IFhJQ1NfSVBJIHx8IGlycSA9PSBYSUNTX0lSUV9TUFVSSU9VUykKIAkJCWNvbnRpbnVlOwotCQlkZXNjID0gZ2V0X2lycV9kZXNjKHZpcnEpOworCQlkZXNjID0gaXJxX3RvX2Rlc2ModmlycSk7CiAKIAkJLyogV2Ugb25seSBuZWVkIHRvIG1pZ3JhdGUgZW5hYmxlZCBJUlFTICovCiAJCWlmIChkZXNjID09IE5VTEwgfHwgZGVzYy0+Y2hpcCA9PSBOVUxMCkBAIC04ODEsNyArOTI3LDcgQEAKIAkJICAgICAgIHZpcnEsIGNwdSk7CiAKIAkJLyogUmVzZXQgYWZmaW5pdHkgdG8gYWxsIGNwdXMgKi8KLQkJY3B1bWFza19zZXRhbGwoaXJxX2Rlc2NbdmlycV0uYWZmaW5pdHkpOworCQljcHVtYXNrX3NldGFsbChpcnFfdG9fZGVzYyh2aXJxKS0+YWZmaW5pdHkpOwogCQlkZXNjLT5jaGlwLT5zZXRfYWZmaW5pdHkodmlycSwgY3B1X2FsbF9tYXNrKTsKIHVubG9jazoKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKaW5kZXggOWQ0YjE3NC4uNTY0MjkyNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCkBAIC0xNiw2ICsxNiw3IEBACiBvYmotJChDT05GSUdfTU1JT19OVlJBTSkJKz0gbW1pb19udnJhbS5vCiBvYmotJChDT05GSUdfRlNMX1NPQykJCSs9IGZzbF9zb2Mubwogb2JqLSQoQ09ORklHX0ZTTF9QQ0kpCQkrPSBmc2xfcGNpLm8gJChmc2wtbXNpLW9iai15KQorb2JqLSQoQ09ORklHX0ZTTF9QTUMpCQkrPSBmc2xfcG1jLm8KIG9iai0kKENPTkZJR19GU0xfTEJDKQkJKz0gZnNsX2xiYy5vCiBvYmotJChDT05GSUdfRlNMX0dUTSkJCSs9IGZzbF9ndG0ubwogb2JqLSQoQ09ORklHX01QQzh4eHhfR1BJTykJKz0gbXBjOHh4eF9ncGlvLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvY3BtMS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9jcG0xLmMKaW5kZXggODI0MjRjZC4uYTRiNDFkYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9jcG0xLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9jcG0xLmMKQEAgLTc3LDcgKzc3LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBjcG1fcGljID0gewotCS50eXBlbmFtZSA9ICIgQ1BNIFBJQyAiLAorCS5uYW1lID0gIiBDUE0gUElDICIsCiAJLm1hc2sgPSBjcG1fbWFza19pcnEsCiAJLnVubWFzayA9IGNwbV91bm1hc2tfaXJxLAogCS5lb2kgPSBjcG1fZW5kX2lycSwKQEAgLTEwMiw3ICsxMDIsNyBAQAogewogCXByX2RlYnVnKCJjcG1fcGljX2hvc3RfbWFwKCVkLCAweCVseClcbiIsIHZpcnEsIGh3KTsKIAotCWdldF9pcnFfZGVzYyh2aXJxKS0+c3RhdHVzIHw9IElSUV9MRVZFTDsKKwlpcnFfdG9fZGVzYyh2aXJxKS0+c3RhdHVzIHw9IElSUV9MRVZFTDsKIAlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIodmlycSwgJmNwbV9waWMsIGhhbmRsZV9mYXN0ZW9pX2lycSk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2NwbTJfcGljLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2NwbTJfcGljLmMKaW5kZXggNzhmMWY3Yy4uOTcxNDgzZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9jcG0yX3BpYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvY3BtMl9waWMuYwpAQCAtMTE1LDExICsxMTUsMTMgQEAKIAogc3RhdGljIHZvaWQgY3BtMl9lbmRfaXJxKHVuc2lnbmVkIGludCB2aXJxKQogeworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKIAlpbnQJYml0LCB3b3JkOwogCXVuc2lnbmVkIGludCBpcnFfbnIgPSB2aXJxX3RvX2h3KHZpcnEpOwogCi0JaWYgKCEoaXJxX2Rlc2NbaXJxX25yXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEfElSUV9JTlBST0dSRVNTKSkKLQkJCSYmIGlycV9kZXNjW2lycV9ucl0uYWN0aW9uKSB7CisJZGVzYyA9IGlycV90b19kZXNjKGlycV9ucik7CisJaWYgKCEoZGVzYy0+c3RhdHVzICYgKElSUV9ESVNBQkxFRHxJUlFfSU5QUk9HUkVTUykpCisJCQkmJiBkZXNjLT5hY3Rpb24pIHsKIAogCQliaXQgPSBpcnFfdG9fc2l1Yml0W2lycV9ucl07CiAJCXdvcmQgPSBpcnFfdG9fc2l1cmVnW2lycV9ucl07CkBAIC0xMzgsNyArMTQwLDcgQEAKIHN0YXRpYyBpbnQgY3BtMl9zZXRfaXJxX3R5cGUodW5zaWduZWQgaW50IHZpcnEsIHVuc2lnbmVkIGludCBmbG93X3R5cGUpCiB7CiAJdW5zaWduZWQgaW50IHNyYyA9IHZpcnFfdG9faHcodmlycSk7Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjID0gZ2V0X2lycV9kZXNjKHZpcnEpOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKHZpcnEpOwogCXVuc2lnbmVkIGludCB2b2xkLCB2bmV3LCBlZGliaXQ7CiAKIAlpZiAoZmxvd190eXBlID09IElSUV9UWVBFX05PTkUpCkBAIC0xODIsNyArMTg0LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBjcG0yX3BpYyA9IHsKLQkudHlwZW5hbWUgPSAiIENQTTIgU0lVICIsCisJLm5hbWUgPSAiIENQTTIgU0lVICIsCiAJLm1hc2sgPSBjcG0yX21hc2tfaXJxLAogCS51bm1hc2sgPSBjcG0yX3VubWFza19pcnEsCiAJLmFjayA9IGNwbTJfYWNrLApAQCAtMjEwLDEzICsyMTIsMTMgQEAKIHsKIAlwcl9kZWJ1ZygiY3BtMl9waWNfaG9zdF9tYXAoJWQsIDB4JWx4KVxuIiwgdmlycSwgaHcpOwogCi0JZ2V0X2lycV9kZXNjKHZpcnEpLT5zdGF0dXMgfD0gSVJRX0xFVkVMOworCWlycV90b19kZXNjKHZpcnEpLT5zdGF0dXMgfD0gSVJRX0xFVkVMOwogCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcih2aXJxLCAmY3BtMl9waWMsIGhhbmRsZV9sZXZlbF9pcnEpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGNwbTJfcGljX2hvc3RfeGxhdGUoc3RydWN0IGlycV9ob3N0ICpoLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmN0LAotCQkJICAgIHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUsCisJCQkgICAgY29uc3QgdTMyICppbnRzcGVjLCB1bnNpZ25lZCBpbnQgaW50c2l6ZSwKIAkJCSAgICBpcnFfaHdfbnVtYmVyX3QgKm91dF9od2lycSwgdW5zaWduZWQgaW50ICpvdXRfZmxhZ3MpCiB7CiAJKm91dF9od2lycSA9IGludHNwZWNbMF07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2NwbV9jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvY3BtX2NvbW1vbi5jCmluZGV4IGU0YjZkNjYuLjlkZTcyYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvY3BtX2NvbW1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvY3BtX2NvbW1vbi5jCkBAIC03Miw3ICs3Miw3IEBACiAvKiBNYXggYWRkcmVzcyBzaXplIHdlIGRlYWwgd2l0aCAqLwogI2RlZmluZSBPRl9NQVhfQUREUl9DRUxMUwk0CiAKLWludCBfX2luaXQgY3BtX211cmFtX2luaXQodm9pZCkKK2ludCBjcG1fbXVyYW1faW5pdCh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CiAJc3RydWN0IHJlc291cmNlIHI7CkBAIC04MSw2ICs4MSw5IEBACiAJaW50IGkgPSAwOwogCWludCByZXQgPSAwOwogCisJaWYgKG11cmFtX3BiYXNlKQorCQlyZXR1cm4gMDsKKwogCXNwaW5fbG9ja19pbml0KCZjcG1fbXVyYW1fbG9jayk7CiAJLyogaW5pdGlhbGl6ZSB0aGUgaW5mbyBoZWFkZXIgKi8KIAlyaF9pbml0KCZjcG1fbXVyYW1faW5mbywgMSwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX21zaS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbXNpLmMKaW5kZXggZGEzOGExZi4uNjJlNTAyNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbXNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbXNpLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIAkubWFzawkJPSBtYXNrX21zaV9pcnEsCiAJLnVubWFzawkJPSB1bm1hc2tfbXNpX2lycSwKIAkuYWNrCQk9IGZzbF9tc2lfZW5kX2lycSwKLQkudHlwZW5hbWUJPSAiIEZTTC1NU0kgICIsCisJLm5hbWUJPSAiIEZTTC1NU0kgICIsCiB9OwogCiBzdGF0aWMgaW50IGZzbF9tc2lfaG9zdF9tYXAoc3RydWN0IGlycV9ob3N0ICpoLCB1bnNpZ25lZCBpbnQgdmlycSwKQEAgLTU1LDcgKzU1LDcgQEAKIHsKIAlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSAmZnNsX21zaV9jaGlwOwogCi0JZ2V0X2lycV9kZXNjKHZpcnEpLT5zdGF0dXMgfD0gSVJRX1RZUEVfRURHRV9GQUxMSU5HOworCWlycV90b19kZXNjKHZpcnEpLT5zdGF0dXMgfD0gSVJRX1RZUEVfRURHRV9GQUxMSU5HOwogCiAJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKHZpcnEsIGNoaXAsIGhhbmRsZV9lZGdlX2lycSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcGNpLmMKaW5kZXggYWU4OGIxNC4uNGUzYTNlMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcGNpLmMKQEAgLTU2LDcgKzU2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX1BQQ184NXh4KSB8fCBkZWZpbmVkKENPTkZJR19QUENfODZ4eCkKKyNpZiBkZWZpbmVkKENPTkZJR19GU0xfU09DX0JPT0tFKSB8fCBkZWZpbmVkKENPTkZJR19QUENfODZ4eCkKIHN0YXRpYyBpbnQgX19pbml0IHNldHVwX29uZV9hdG11KHN0cnVjdCBjY3NyX3BjaSBfX2lvbWVtICpwY2ksCiAJdW5zaWduZWQgaW50IGluZGV4LCBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywKIAlyZXNvdXJjZV9zaXplX3Qgb2Zmc2V0KQpAQCAtMzkyLDkgKzM5MiwyMyBAQAogREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9NUEM4NjQxLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwogREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9NUEM4NjQxRCwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKIERFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfTVBDODYxMCwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfUDEwMTFFLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9QMTAxMSwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfUDEwMTNFLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9QMTAxMywgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfUDEwMjBFLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9QMTAyMCwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfUDEwMjJFLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9QMTAyMiwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfUDIwMTBFLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9QMjAxMCwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKIERFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfUDIwMjBFLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwogREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKDB4MTk1NywgUENJX0RFVklDRV9JRF9QMjAyMCwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKLSNlbmRpZiAvKiBDT05GSUdfUFBDXzg1eHggfHwgQ09ORklHX1BQQ184Nnh4ICovCitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoMHgxOTU3LCBQQ0lfREVWSUNFX0lEX1A0MDQwRSwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfUDQwNDAsIHF1aXJrX2ZzbF9wY2llX2hlYWRlcik7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoMHgxOTU3LCBQQ0lfREVWSUNFX0lEX1A0MDgwRSwgcXVpcmtfZnNsX3BjaWVfaGVhZGVyKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUigweDE5NTcsIFBDSV9ERVZJQ0VfSURfUDQwODAsIHF1aXJrX2ZzbF9wY2llX2hlYWRlcik7CisjZW5kaWYgLyogQ09ORklHX0ZTTF9TT0NfQk9PS0UgfHwgQ09ORklHX1BQQ184Nnh4ICovCiAKICNpZiBkZWZpbmVkKENPTkZJR19QUENfODN4eCkgfHwgZGVmaW5lZChDT05GSUdfUFBDX01QQzUxMngpCiBERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoMHgxOTU3LCBQQ0lfREVWSUNFX0lEX01QQzgzMTRFLCBxdWlya19mc2xfcGNpZV9oZWFkZXIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcG1jLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wbWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzYzNWE5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcG1jLmMKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIFN1c3BlbmQvcmVzdW1lIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgMjAwOSAgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIEF1dGhvcjogQW50b24gVm9yb250c292IDxhdm9yb250c292QHJ1Lm12aXN0YS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorCitzdHJ1Y3QgcG1jX3JlZ3MgeworCV9fYmUzMiBkZXZkaXNyOworCV9fYmUzMiBkZXZkaXNyMjsKKwlfX2JlMzIgOjMyOworCV9fYmUzMiA6MzI7CisJX19iZTMyIHBtY3NyOworI2RlZmluZSBQTUNTUl9TTFAJKDEgPDwgMTcpCit9OworCitzdGF0aWMgc3RydWN0IGRldmljZSAqcG1jX2RldjsKK3N0YXRpYyBzdHJ1Y3QgcG1jX3JlZ3MgX19pb21lbSAqcG1jX3JlZ3M7CisKK3N0YXRpYyBpbnQgcG1jX3N1c3BlbmRfZW50ZXIoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQoreworCWludCByZXQ7CisKKwlzZXRiaXRzMzIoJnBtY19yZWdzLT5wbWNzciwgUE1DU1JfU0xQKTsKKwkvKiBBdCB0aGlzIHBvaW50LCB0aGUgQ1BVIGlzIGFzbGVlcC4gKi8KKworCS8qIFVwb24gcmVzdW1lLCB3YWl0IGZvciBTTFAgYml0IHRvIGJlIGNsZWFyLiAqLworCXJldCA9IHNwaW5fZXZlbnRfdGltZW91dCgoaW5fYmUzMigmcG1jX3JlZ3MtPnBtY3NyKSAmIFBNQ1NSX1NMUCkgPT0gMCwKKwkJCQkgMTAwMDAsIDEwKSA/IDAgOiAtRVRJTUVET1VUOworCWlmIChyZXQpCisJCWRldl9lcnIocG1jX2RldiwgInRpcmVkIHdhaXRpbmcgZm9yIFNMUCBiaXQgdG8gY2xlYXJcbiIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcG1jX3N1c3BlbmRfdmFsaWQoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQoreworCWlmIChzdGF0ZSAhPSBQTV9TVVNQRU5EX1NUQU5EQlkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzIHBtY19zdXNwZW5kX29wcyA9IHsKKwkudmFsaWQgPSBwbWNfc3VzcGVuZF92YWxpZCwKKwkuZW50ZXIgPSBwbWNfc3VzcGVuZF9lbnRlciwKK307CisKK3N0YXRpYyBpbnQgcG1jX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICppZCkKK3sKKwlwbWNfcmVncyA9IG9mX2lvbWFwKG9mZGV2LT5ub2RlLCAwKTsKKwlpZiAoIXBtY19yZWdzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBtY19kZXYgPSAmb2ZkZXYtPmRldjsKKwlzdXNwZW5kX3NldF9vcHMoJnBtY19zdXNwZW5kX29wcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBtY19pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LXBtYyIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODY0MWQtcG1jIiwgfSwKKwl7IH0sCit9OworCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBwbWNfZHJpdmVyID0geworCS5kcml2ZXIubmFtZSA9ICJmc2wtcG1jIiwKKwkubWF0Y2hfdGFibGUgPSBwbWNfaWRzLAorCS5wcm9iZSA9IHBtY19wcm9iZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBtY19pbml0KHZvaWQpCit7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmcG1jX2RyaXZlcik7Cit9CitkZXZpY2VfaW5pdGNhbGwocG1jX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYwppbmRleCBhZGNhNGFmLi5iOTFmN2FjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYwpAQCAtMzcyLDcgKzM3Miw3IEBACiAKIGFyY2hfaW5pdGNhbGwoZnNsX3VzYl9vZl9pbml0KTsKIAotI2lmIGRlZmluZWQoQ09ORklHX1BQQ184NXh4KSB8fCBkZWZpbmVkKENPTkZJR19QUENfODZ4eCkKKyNpZiBkZWZpbmVkKENPTkZJR19GU0xfU09DX0JPT0tFKSB8fCBkZWZpbmVkKENPTkZJR19QUENfODZ4eCkKIHN0YXRpYyBfX2JlMzIgX19pb21lbSAqcnN0Y3I7CiAKIHN0YXRpYyBpbnQgX19pbml0IHNldHVwX3JzdGNyKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2k4MjU5LmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2k4MjU5LmMKaW5kZXggYTk2NTg0YS4uMGE1NWRiOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9pODI1OS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvaTgyNTkuYwpAQCAtMTM1LDcgKzEzNSw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaTgyNTlfcGljID0gewotCS50eXBlbmFtZQk9ICIgaTgyNTkgICAgIiwKKwkubmFtZQkJPSAiIGk4MjU5ICAgICIsCiAJLm1hc2sJCT0gaTgyNTlfbWFza19pcnEsCiAJLmRpc2FibGUJPSBpODI1OV9tYXNrX2lycSwKIAkudW5tYXNrCQk9IGk4MjU5X3VubWFza19pcnEsCkBAIC0xNzUsMTIgKzE3NSwxMiBAQAogCiAJLyogV2UgYmxvY2sgdGhlIGludGVybmFsIGNhc2NhZGUgKi8KIAlpZiAoaHcgPT0gMikKLQkJZ2V0X2lycV9kZXNjKHZpcnEpLT5zdGF0dXMgfD0gSVJRX05PUkVRVUVTVDsKKwkJaXJxX3RvX2Rlc2ModmlycSktPnN0YXR1cyB8PSBJUlFfTk9SRVFVRVNUOwogCiAJLyogV2UgdXNlIHRoZSBsZXZlbCBoYW5kbGVyIG9ubHkgZm9yIG5vdywgd2UgbWlnaHQgd2FudCB0bwogCSAqIGJlIG1vcmUgY2F1dGlvdXMgaGVyZSBidXQgdGhhdCB3b3JrcyBmb3Igbm93CiAJICovCi0JZ2V0X2lycV9kZXNjKHZpcnEpLT5zdGF0dXMgfD0gSVJRX0xFVkVMOworCWlycV90b19kZXNjKHZpcnEpLT5zdGF0dXMgfD0gSVJRX0xFVkVMOwogCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcih2aXJxLCAmaTgyNTlfcGljLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE5OCw3ICsxOTgsNyBAQAogfQogCiBzdGF0aWMgaW50IGk4MjU5X2hvc3RfeGxhdGUoc3RydWN0IGlycV9ob3N0ICpoLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmN0LAotCQkJICAgIHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUsCisJCQkgICAgY29uc3QgdTMyICppbnRzcGVjLCB1bnNpZ25lZCBpbnQgaW50c2l6ZSwKIAkJCSAgICBpcnFfaHdfbnVtYmVyX3QgKm91dF9od2lycSwgdW5zaWduZWQgaW50ICpvdXRfZmxhZ3MpCiB7CiAJc3RhdGljIHVuc2lnbmVkIGNoYXIgbWFwX2lzYV9zZW5zZXNbNF0gPSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2lwaWMuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvaXBpYy5jCmluZGV4IGNiNzY4OWMuLjI4Y2RkZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvaXBpYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvaXBpYy5jCkBAIC02MDUsNyArNjA1LDcgQEAKIHsKIAlzdHJ1Y3QgaXBpYyAqaXBpYyA9IGlwaWNfZnJvbV9pcnEodmlycSk7CiAJdW5zaWduZWQgaW50IHNyYyA9IGlwaWNfaXJxX3RvX2h3KHZpcnEpOwotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGdldF9pcnFfZGVzYyh2aXJxKTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyh2aXJxKTsKIAl1bnNpZ25lZCBpbnQgdm9sZCwgdm5ldywgZWRpYml0OwogCiAJaWYgKGZsb3dfdHlwZSA9PSBJUlFfVFlQRV9OT05FKQpAQCAtNjYwLDcgKzY2MCw3IEBACiAKIC8qIGxldmVsIGludGVycnVwdHMgYW5kIGVkZ2UgaW50ZXJydXB0cyBoYXZlIGRpZmZlcmVudCBhY2sgb3BlcmF0aW9ucyAqLwogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpcGljX2xldmVsX2lycV9jaGlwID0gewotCS50eXBlbmFtZQk9ICIgSVBJQyAgIiwKKwkubmFtZQkJPSAiIElQSUMgICIsCiAJLnVubWFzawkJPSBpcGljX3VubWFza19pcnEsCiAJLm1hc2sJCT0gaXBpY19tYXNrX2lycSwKIAkubWFza19hY2sJPSBpcGljX21hc2tfaXJxLApAQCAtNjY4LDcgKzY2OCw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGlwaWNfZWRnZV9pcnFfY2hpcCA9IHsKLQkudHlwZW5hbWUJPSAiIElQSUMgICIsCisJLm5hbWUJCT0gIiBJUElDICAiLAogCS51bm1hc2sJCT0gaXBpY191bm1hc2tfaXJxLAogCS5tYXNrCQk9IGlwaWNfbWFza19pcnEsCiAJLm1hc2tfYWNrCT0gaXBpY19tYXNrX2lycV9hbmRfYWNrLApAQCAtNjk3LDcgKzY5Nyw3IEBACiB9CiAKIHN0YXRpYyBpbnQgaXBpY19ob3N0X3hsYXRlKHN0cnVjdCBpcnFfaG9zdCAqaCwgc3RydWN0IGRldmljZV9ub2RlICpjdCwKLQkJCSAgIHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUsCisJCQkgICBjb25zdCB1MzIgKmludHNwZWMsIHVuc2lnbmVkIGludCBpbnRzaXplLAogCQkJICAgaXJxX2h3X251bWJlcl90ICpvdXRfaHdpcnEsIHVuc2lnbmVkIGludCAqb3V0X2ZsYWdzKQogCiB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21wYzh4eF9waWMuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBjOHh4X3BpYy5jCmluZGV4IDVkMmQ1NTIuLjY5YmQ2ZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBjOHh4X3BpYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBjOHh4X3BpYy5jCkBAIC03Miw3ICs3Miw3IEBACiAKIHN0YXRpYyBpbnQgbXBjOHh4X3NldF9pcnFfdHlwZSh1bnNpZ25lZCBpbnQgdmlycSwgdW5zaWduZWQgaW50IGZsb3dfdHlwZSkKIHsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBnZXRfaXJxX2Rlc2ModmlycSk7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2ModmlycSk7CiAKIAlkZXNjLT5zdGF0dXMgJj0gfihJUlFfVFlQRV9TRU5TRV9NQVNLIHwgSVJRX0xFVkVMKTsKIAlkZXNjLT5zdGF0dXMgfD0gZmxvd190eXBlICYgSVJRX1RZUEVfU0VOU0VfTUFTSzsKQEAgLTk0LDcgKzk0LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBtcGM4eHhfcGljID0gewotCS50eXBlbmFtZSA9ICIgTVBDOFhYIFNJVSAiLAorCS5uYW1lID0gIiBNUEM4WFggU0lVICIsCiAJLnVubWFzayA9IG1wYzh4eF91bm1hc2tfaXJxLAogCS5tYXNrID0gbXBjOHh4X21hc2tfaXJxLAogCS5hY2sgPSBtcGM4eHhfYWNrLApAQCAtMTMwLDcgKzEzMCw3IEBACiAKIAogc3RhdGljIGludCBtcGM4eHhfcGljX2hvc3RfeGxhdGUoc3RydWN0IGlycV9ob3N0ICpoLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmN0LAotCQkJICAgIHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUsCisJCQkgICAgY29uc3QgdTMyICppbnRzcGVjLCB1bnNpZ25lZCBpbnQgaW50c2l6ZSwKIAkJCSAgICBpcnFfaHdfbnVtYmVyX3QgKm91dF9od2lycSwgdW5zaWduZWQgaW50ICpvdXRfZmxhZ3MpCiB7CiAJc3RhdGljIHVuc2lnbmVkIGNoYXIgbWFwX3BpY19zZW5zZXNbNF0gPSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5jCmluZGV4IDMwYzQ0ZTYuLmFhOWQwNmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5jCkBAIC01NzIsNyArNTcyLDcgQEAKIAljcHVtYXNrX3QgbWFzazsKIAlpbnQgY3B1aWQ7CiAKLQljcHVtYXNrX2NvcHkoJm1hc2ssIGlycV9kZXNjW3ZpcnRfaXJxXS5hZmZpbml0eSk7CisJY3B1bWFza19jb3B5KCZtYXNrLCBpcnFfdG9fZGVzYyh2aXJ0X2lycSktPmFmZmluaXR5KTsKIAlpZiAoY3B1c19lcXVhbChtYXNrLCBDUFVfTUFTS19BTEwpKSB7CiAJCXN0YXRpYyBpbnQgaXJxX3JvdmVyOwogCQlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlycV9yb3Zlcl9sb2NrKTsKQEAgLTYyMSw3ICs2MjEsNyBAQAogCWlmIChpcnEgPCBOVU1fSVNBX0lOVEVSUlVQVFMpCiAJCXJldHVybiBOVUxMOwogCi0JcmV0dXJuIGlycV9kZXNjW2lycV0uY2hpcF9kYXRhOworCXJldHVybiBpcnFfdG9fZGVzYyhpcnEpLT5jaGlwX2RhdGE7CiB9CiAKIC8qIERldGVybWluZSBpZiB0aGUgbGludXggaXJxIGlzIGFuIElQSSAqLwpAQCAtNjQ4LDE0ICs2NDgsMTQgQEAKIC8qIEdldCB0aGUgbXBpYyBzdHJ1Y3R1cmUgZnJvbSB0aGUgSVBJIG51bWJlciAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3QgbXBpYyAqIG1waWNfZnJvbV9pcGkodW5zaWduZWQgaW50IGlwaSkKIHsKLQlyZXR1cm4gaXJxX2Rlc2NbaXBpXS5jaGlwX2RhdGE7CisJcmV0dXJuIGlycV90b19kZXNjKGlwaSktPmNoaXBfZGF0YTsKIH0KICNlbmRpZgogCiAvKiBHZXQgdGhlIG1waWMgc3RydWN0dXJlIGZyb20gdGhlIGlycSBudW1iZXIgKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IG1waWMgKiBtcGljX2Zyb21faXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JcmV0dXJuIGlycV9kZXNjW2lycV0uY2hpcF9kYXRhOworCXJldHVybiBpcnFfdG9fZGVzYyhpcnEpLT5jaGlwX2RhdGE7CiB9CiAKIC8qIFNlbmQgYW4gRU9JICovCkBAIC03MzUsNyArNzM1LDcgQEAKIAogCW1waWNfdW5tYXNrX2lycShpcnEpOwogCi0JaWYgKGlycV9kZXNjW2lycV0uc3RhdHVzICYgSVJRX0xFVkVMKQorCWlmIChpcnFfdG9fZGVzYyhpcnEpLT5zdGF0dXMgJiBJUlFfTEVWRUwpCiAJCW1waWNfaHRfZW5kX2lycShtcGljLCBzcmMpOwogfQogCkBAIC03NDUsNyArNzQ1LDcgQEAKIAl1bnNpZ25lZCBpbnQgc3JjID0gbXBpY19pcnFfdG9faHcoaXJxKTsKIAogCW1waWNfdW5tYXNrX2lycShpcnEpOwotCW1waWNfc3RhcnR1cF9odF9pbnRlcnJ1cHQobXBpYywgc3JjLCBpcnFfZGVzY1tpcnFdLnN0YXR1cyk7CisJbXBpY19zdGFydHVwX2h0X2ludGVycnVwdChtcGljLCBzcmMsIGlycV90b19kZXNjKGlycSktPnN0YXR1cyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc1NSw3ICs3NTUsNyBAQAogCXN0cnVjdCBtcGljICptcGljID0gbXBpY19mcm9tX2lycShpcnEpOwogCXVuc2lnbmVkIGludCBzcmMgPSBtcGljX2lycV90b19odyhpcnEpOwogCi0JbXBpY19zaHV0ZG93bl9odF9pbnRlcnJ1cHQobXBpYywgc3JjLCBpcnFfZGVzY1tpcnFdLnN0YXR1cyk7CisJbXBpY19zaHV0ZG93bl9odF9pbnRlcnJ1cHQobXBpYywgc3JjLCBpcnFfdG9fZGVzYyhpcnEpLT5zdGF0dXMpOwogCW1waWNfbWFza19pcnEoaXJxKTsKIH0KIApAQCAtNzcyLDcgKzc3Miw3IEBACiAJICogbGF0Y2hlZCBhbm90aGVyIGVkZ2UgaW50ZXJydXB0IGNvbWluZyBpbiBhbnl3YXkKIAkgKi8KIAotCWlmIChpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIElSUV9MRVZFTCkKKwlpZiAoaXJxX3RvX2Rlc2MoaXJxKS0+c3RhdHVzICYgSVJRX0xFVkVMKQogCQltcGljX2h0X2VuZF9pcnEobXBpYywgc3JjKTsKIAltcGljX2VvaShtcGljKTsKIH0KQEAgLTg1Niw3ICs4NTYsNyBAQAogewogCXN0cnVjdCBtcGljICptcGljID0gbXBpY19mcm9tX2lycSh2aXJxKTsKIAl1bnNpZ25lZCBpbnQgc3JjID0gbXBpY19pcnFfdG9faHcodmlycSk7Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjID0gZ2V0X2lycV9kZXNjKHZpcnEpOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKHZpcnEpOwogCXVuc2lnbmVkIGludCB2ZWNwcmksIHZvbGQsIHZuZXc7CiAKIAlEQkcoIm1waWM6IHNldF9pcnFfdHlwZShtcGljOkAlcCx2aXJxOiVkLHNyYzoweCV4LHR5cGU6MHgleClcbiIsCkBAIC05OTQsNyArOTk0LDcgQEAKIH0KIAogc3RhdGljIGludCBtcGljX2hvc3RfeGxhdGUoc3RydWN0IGlycV9ob3N0ICpoLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmN0LAotCQkJICAgdTMyICppbnRzcGVjLCB1bnNpZ25lZCBpbnQgaW50c2l6ZSwKKwkJCSAgIGNvbnN0IHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUsCiAJCQkgICBpcnFfaHdfbnVtYmVyX3QgKm91dF9od2lycSwgdW5zaWduZWQgaW50ICpvdXRfZmxhZ3MpCiAKIHsKQEAgLTEwNjIsMTkgKzEwNjIsMTkgQEAKIAltcGljLT5uYW1lID0gbmFtZTsKIAogCW1waWMtPmhjX2lycSA9IG1waWNfaXJxX2NoaXA7Ci0JbXBpYy0+aGNfaXJxLnR5cGVuYW1lID0gbmFtZTsKKwltcGljLT5oY19pcnEubmFtZSA9IG5hbWU7CiAJaWYgKGZsYWdzICYgTVBJQ19QUklNQVJZKQogCQltcGljLT5oY19pcnEuc2V0X2FmZmluaXR5ID0gbXBpY19zZXRfYWZmaW5pdHk7CiAjaWZkZWYgQ09ORklHX01QSUNfVTNfSFRfSVJRUwogCW1waWMtPmhjX2h0X2lycSA9IG1waWNfaXJxX2h0X2NoaXA7Ci0JbXBpYy0+aGNfaHRfaXJxLnR5cGVuYW1lID0gbmFtZTsKKwltcGljLT5oY19odF9pcnEubmFtZSA9IG5hbWU7CiAJaWYgKGZsYWdzICYgTVBJQ19QUklNQVJZKQogCQltcGljLT5oY19odF9pcnEuc2V0X2FmZmluaXR5ID0gbXBpY19zZXRfYWZmaW5pdHk7CiAjZW5kaWYgLyogQ09ORklHX01QSUNfVTNfSFRfSVJRUyAqLwogCiAjaWZkZWYgQ09ORklHX1NNUAogCW1waWMtPmhjX2lwaSA9IG1waWNfaXBpX2NoaXA7Ci0JbXBpYy0+aGNfaXBpLnR5cGVuYW1lID0gbmFtZTsKKwltcGljLT5oY19pcGkubmFtZSA9IG5hbWU7CiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCiAJbXBpYy0+ZmxhZ3MgPSBmbGFnczsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpY19wYXNlbWlfbXNpLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWNfcGFzZW1pX21zaS5jCmluZGV4IDY1NmNiNzcuLjBmNmFiMDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpY19wYXNlbWlfbXNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljX3Bhc2VtaV9tc2kuYwpAQCAtNjAsNyArNjAsNyBAQAogCS5lb2kJCT0gbXBpY19lbmRfaXJxLAogCS5zZXRfdHlwZQk9IG1waWNfc2V0X2lycV90eXBlLAogCS5zZXRfYWZmaW5pdHkJPSBtcGljX3NldF9hZmZpbml0eSwKLQkudHlwZW5hbWUJPSAiUEFTRU1JLU1TSSAiLAorCS5uYW1lCQk9ICJQQVNFTUktTVNJICIsCiB9OwogCiBzdGF0aWMgaW50IHBhc2VtaV9tc2lfY2hlY2tfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgbnZlYywgaW50IHR5cGUpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWNfdTNtc2kuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpY191M21zaS5jCmluZGV4IDBhOGY1YTkuLmQzY2FmMjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpY191M21zaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpY191M21zaS5jCkBAIC00Miw3ICs0Miw3IEBACiAJLmVvaQkJPSBtcGljX2VuZF9pcnEsCiAJLnNldF90eXBlCT0gbXBpY19zZXRfaXJxX3R5cGUsCiAJLnNldF9hZmZpbml0eQk9IG1waWNfc2V0X2FmZmluaXR5LAotCS50eXBlbmFtZQk9ICJNUElDLVUzTVNJIiwKKwkubmFtZQkJPSAiTVBJQy1VM01TSSIsCiB9OwogCiBzdGF0aWMgdTY0IHJlYWRfaHRfbWFnaWNfYWRkcihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdW5zaWduZWQgaW50IHBvcykKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9waWMuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9waWMuYwppbmRleCAyYWE0ZWQwLi40ODViOTI0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L212NjR4NjBfcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX3BpYy5jCkBAIC0yMTMsNyArMjEzLDcgQEAKIHsKIAlpbnQgbGV2ZWwxOwogCi0JZ2V0X2lycV9kZXNjKHZpcnEpLT5zdGF0dXMgfD0gSVJRX0xFVkVMOworCWlycV90b19kZXNjKHZpcnEpLT5zdGF0dXMgfD0gSVJRX0xFVkVMOwogCiAJbGV2ZWwxID0gKGh3aXJxICYgTVY2NHg2MF9MRVZFTDFfTUFTSykgPj4gTVY2NHg2MF9MRVZFTDFfT0ZGU0VUOwogCUJVR19PTihsZXZlbDEgPiBNVjY0eDYwX0xFVkVMMV9HUFApOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvcWUuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3FlLmMKaW5kZXggNDY0MjcxYi4uMTQ5MzkzYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvcWUuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9xZS5jCkBAIC0yNyw2ICsyNyw4IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTY1LDE5ICs2Nyw2IEBACiAKIHN0YXRpYyBwaHlzX2FkZHJfdCBxZWJhc2UgPSAtMTsKIAotaW50IHFlX2FsaXZlX2R1cmluZ19zbGVlcCh2b2lkKQotewotCXN0YXRpYyBpbnQgcmV0ID0gLTE7Ci0KLQlpZiAocmV0ICE9IC0xKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gIW9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wsbXBjODU2OS1wbWMiKTsKLQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKHFlX2FsaXZlX2R1cmluZ19zbGVlcCk7Ci0KIHBoeXNfYWRkcl90IGdldF9xZV9iYXNlKHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpxZTsKQEAgLTEwNCw3ICs5Myw3IEBACiAKIEVYUE9SVF9TWU1CT0woZ2V0X3FlX2Jhc2UpOwogCi12b2lkIF9faW5pdCBxZV9yZXNldCh2b2lkKQordm9pZCBxZV9yZXNldCh2b2lkKQogewogCWlmIChxZV9pbW1yID09IE5VTEwpCiAJCXFlX2ltbXIgPSBpb3JlbWFwKGdldF9xZV9iYXNlKCksIFFFX0lNTUFQX1NJWkUpOwpAQCAtMzMwLDE2ICszMTksMTggQEAKIHN0YXRpYyBpbnQgcWVfc2RtYV9pbml0KHZvaWQpCiB7CiAJc3RydWN0IHNkbWEgX19pb21lbSAqc2RtYSA9ICZxZV9pbW1yLT5zZG1hOwotCXVuc2lnbmVkIGxvbmcgc2RtYV9idWZfb2Zmc2V0OworCXN0YXRpYyB1bnNpZ25lZCBsb25nIHNkbWFfYnVmX29mZnNldCA9ICh1bnNpZ25lZCBsb25nKS1FTk9NRU07CiAKIAlpZiAoIXNkbWEpCiAJCXJldHVybiAtRU5PREVWOwogCiAJLyogYWxsb2NhdGUgMiBpbnRlcm5hbCB0ZW1wb3JhcnkgYnVmZmVycyAoNTEyIGJ5dGVzIHNpemUgZWFjaCkgZm9yCiAJICogdGhlIFNETUEgKi8KLSAJc2RtYV9idWZfb2Zmc2V0ID0gcWVfbXVyYW1fYWxsb2MoNTEyICogMiwgNDA5Nik7Ci0JaWYgKElTX0VSUl9WQUxVRShzZG1hX2J1Zl9vZmZzZXQpKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHNkbWFfYnVmX29mZnNldCkpIHsKKwkJc2RtYV9idWZfb2Zmc2V0ID0gcWVfbXVyYW1fYWxsb2MoNTEyICogMiwgNDA5Nik7CisJCWlmIChJU19FUlJfVkFMVUUoc2RtYV9idWZfb2Zmc2V0KSkKKwkJCXJldHVybiAtRU5PTUVNOworCX0KIAogCW91dF9iZTMyKCZzZG1hLT5zZGViY3IsICh1MzIpIHNkbWFfYnVmX29mZnNldCAmIFFFX1NERUJDUl9CQV9NQVNLKTsKICAJb3V0X2JlMzIoJnNkbWEtPnNkbXIsIChRRV9TRE1SX0dMQl8xX01TSyB8CkBAIC0zNDksNyArMzQwLDcgQEAKIH0KIAogLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIFJJU0NzIHdlIHN1cHBvcnQgKi8KLSNkZWZpbmUgTUFYX1FFX1JJU0MgICAgIDIKKyNkZWZpbmUgTUFYX1FFX1JJU0MgICAgIDQKIAogLyogRmlybXdhcmUgaW5mb3JtYXRpb24gc3RvcmVkIGhlcmUgZm9yIHFlX2dldF9maXJtd2FyZV9pbmZvKCkgKi8KIHN0YXRpYyBzdHJ1Y3QgcWVfZmlybXdhcmVfaW5mbyBxZV9maXJtd2FyZV9pbmZvOwpAQCAtNjU4LDMgKzY0OSwzNSBAQAogCXJldHVybiBudW1fb2Zfc251bXM7CiB9CiBFWFBPUlRfU1lNQk9MKHFlX2dldF9udW1fb2Zfc251bXMpOworCisjaWYgZGVmaW5lZChDT05GSUdfU1VTUEVORCkgJiYgZGVmaW5lZChDT05GSUdfUFBDXzg1eHgpCitzdGF0aWMgaW50IHFlX3Jlc3VtZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldikKK3sKKwlpZiAoIXFlX2FsaXZlX2R1cmluZ19zbGVlcCgpKQorCQlxZV9yZXNldCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFlX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICppZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcWVfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJmc2wscWUiLCB9LAorCXsgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIHFlX2RyaXZlciA9IHsKKwkuZHJpdmVyLm5hbWUgPSAiZnNsLXFlIiwKKwkubWF0Y2hfdGFibGUgPSBxZV9pZHMsCisJLnByb2JlID0gcWVfcHJvYmUsCisJLnJlc3VtZSA9IHFlX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHFlX2Rydl9pbml0KHZvaWQpCit7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmcWVfZHJpdmVyKTsKK30KK2RldmljZV9pbml0Y2FsbChxZV9kcnZfaW5pdCk7CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfU1VTUEVORCkgJiYgZGVmaW5lZChDT05GSUdfUFBDXzg1eHgpICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9xZV9pYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvcWVfaWMuYwppbmRleCAzZmFhNDJlLi4yYWNjOTI4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9xZV9pYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3FlX2ljLmMKQEAgLTE4OSw3ICsxODksNyBAQAogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBxZV9pYyAqcWVfaWNfZnJvbV9pcnEodW5zaWduZWQgaW50IHZpcnEpCiB7Ci0JcmV0dXJuIGlycV9kZXNjW3ZpcnFdLmNoaXBfZGF0YTsKKwlyZXR1cm4gaXJxX3RvX2Rlc2ModmlycSktPmNoaXBfZGF0YTsKIH0KIAogI2RlZmluZSB2aXJxX3RvX2h3KHZpcnEpCSgodW5zaWduZWQgaW50KWlycV9tYXBbdmlycV0uaHdpcnEpCkBAIC0yMzcsNyArMjM3LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBxZV9pY19pcnFfY2hpcCA9IHsKLQkudHlwZW5hbWUgPSAiIFFFSUMgICIsCisJLm5hbWUgPSAiIFFFSUMgICIsCiAJLnVubWFzayA9IHFlX2ljX3VubWFza19pcnEsCiAJLm1hc2sgPSBxZV9pY19tYXNrX2lycSwKIAkubWFza19hY2sgPSBxZV9pY19tYXNrX2lycSwKQEAgLTI2Myw3ICsyNjMsNyBAQAogCWNoaXAgPSAmcWVfaWMtPmhjX2lycTsKIAogCXNldF9pcnFfY2hpcF9kYXRhKHZpcnEsIHFlX2ljKTsKLQlnZXRfaXJxX2Rlc2ModmlycSktPnN0YXR1cyB8PSBJUlFfTEVWRUw7CisJaXJxX3RvX2Rlc2ModmlycSktPnN0YXR1cyB8PSBJUlFfTEVWRUw7CiAKIAlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIodmlycSwgY2hpcCwgaGFuZGxlX2xldmVsX2lycSk7CiAKQEAgLTI3MSw3ICsyNzEsNyBAQAogfQogCiBzdGF0aWMgaW50IHFlX2ljX2hvc3RfeGxhdGUoc3RydWN0IGlycV9ob3N0ICpoLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmN0LAotCQkJICAgIHUzMiAqIGludHNwZWMsIHVuc2lnbmVkIGludCBpbnRzaXplLAorCQkJICAgIGNvbnN0IHUzMiAqIGludHNwZWMsIHVuc2lnbmVkIGludCBpbnRzaXplLAogCQkJICAgIGlycV9od19udW1iZXJfdCAqIG91dF9od2lycSwKIAkJCSAgICB1bnNpZ25lZCBpbnQgKm91dF9mbGFncykKIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvdHNpMTA4X3BjaS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfcGNpLmMKaW5kZXggY2YyNDRhNC4uNTk1MDM0YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfcGNpLmMKQEAgLTM3Niw3ICszNzYsNyBAQAogICovCiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgdHNpMTA4X3BjaV9pcnEgPSB7Ci0JLnR5cGVuYW1lID0gInRzaTEwOF9QQ0lfaW50IiwKKwkubmFtZSA9ICJ0c2kxMDhfUENJX2ludCIsCiAJLm1hc2sgPSB0c2kxMDhfcGNpX2lycV9kaXNhYmxlLAogCS5hY2sgPSB0c2kxMDhfcGNpX2lycV9hY2ssCiAJLmVuZCA9IHRzaTEwOF9wY2lfaXJxX2VuZCwKQEAgLTM4NCw3ICszODQsNyBAQAogfTsKIAogc3RhdGljIGludCBwY2lfaXJxX2hvc3RfeGxhdGUoc3RydWN0IGlycV9ob3N0ICpoLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmN0LAotCQkJICAgIHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUsCisJCQkgICAgY29uc3QgdTMyICppbnRzcGVjLCB1bnNpZ25lZCBpbnQgaW50c2l6ZSwKIAkJCSAgICBpcnFfaHdfbnVtYmVyX3QgKm91dF9od2lycSwgdW5zaWduZWQgaW50ICpvdXRfZmxhZ3MpCiB7CiAJKm91dF9od2lycSA9IGludHNwZWNbMF07CkBAIC0zOTgsNyArMzk4LDcgQEAKIAlEQkcoIiVzKCVkLCAweCVseClcbiIsIF9fZnVuY19fLCB2aXJxLCBodyk7CiAJaWYgKCh2aXJxID49IDEpICYmICh2aXJxIDw9IDQpKXsKIAkJaXJxID0gdmlycSArIElSUV9QQ0lfSU5UQURfQkFTRSAtIDE7Ci0JCWdldF9pcnFfZGVzYyhpcnEpLT5zdGF0dXMgfD0gSVJRX0xFVkVMOworCQlpcnFfdG9fZGVzYyhpcnEpLT5zdGF0dXMgfD0gSVJRX0xFVkVMOwogCQlzZXRfaXJxX2NoaXAoaXJxLCAmdHNpMTA4X3BjaV9pcnEpOwogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvdWljLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3VpYy5jCmluZGV4IDQ2NmNlOWEuLjdkMTAwNzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvdWljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi91aWMuYwpAQCAtNTcsNyArNTcsNyBAQAogCiBzdGF0aWMgdm9pZCB1aWNfdW5tYXNrX2lycSh1bnNpZ25lZCBpbnQgdmlycSkKIHsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBnZXRfaXJxX2Rlc2ModmlycSk7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2ModmlycSk7CiAJc3RydWN0IHVpYyAqdWljID0gZ2V0X2lycV9jaGlwX2RhdGEodmlycSk7CiAJdW5zaWduZWQgaW50IHNyYyA9IHVpY19pcnFfdG9faHcodmlycSk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTEwMSw3ICsxMDEsNyBAQAogCiBzdGF0aWMgdm9pZCB1aWNfbWFza19hY2tfaXJxKHVuc2lnbmVkIGludCB2aXJxKQogewotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGdldF9pcnFfZGVzYyh2aXJxKTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyh2aXJxKTsKIAlzdHJ1Y3QgdWljICp1aWMgPSBnZXRfaXJxX2NoaXBfZGF0YSh2aXJxKTsKIAl1bnNpZ25lZCBpbnQgc3JjID0gdWljX2lycV90b19odyh2aXJxKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTI5LDcgKzEyOSw3IEBACiB7CiAJc3RydWN0IHVpYyAqdWljID0gZ2V0X2lycV9jaGlwX2RhdGEodmlycSk7CiAJdW5zaWduZWQgaW50IHNyYyA9IHVpY19pcnFfdG9faHcodmlycSk7Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjID0gZ2V0X2lycV9kZXNjKHZpcnEpOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKHZpcnEpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHRyaWdnZXIsIHBvbGFyaXR5OwogCXUzMiB0ciwgcHIsIG1hc2s7CkBAIC0xNzcsNyArMTc3LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCB1aWNfaXJxX2NoaXAgPSB7Ci0JLnR5cGVuYW1lCT0gIiBVSUMgICIsCisJLm5hbWUJCT0gIiBVSUMgICIsCiAJLnVubWFzawkJPSB1aWNfdW5tYXNrX2lycSwKIAkubWFzawkJPSB1aWNfbWFza19pcnEsCiAgCS5tYXNrX2Fjawk9IHVpY19tYXNrX2Fja19pcnEsCkBAIC0yMDIsNyArMjAyLDcgQEAKIH0KIAogc3RhdGljIGludCB1aWNfaG9zdF94bGF0ZShzdHJ1Y3QgaXJxX2hvc3QgKmgsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqY3QsCi0JCQkgIHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUsCisJCQkgIGNvbnN0IHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUsCiAJCQkgIGlycV9od19udW1iZXJfdCAqb3V0X2h3aXJxLCB1bnNpZ25lZCBpbnQgKm91dF90eXBlKQogCiB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3hpbGlueF9pbnRjLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3hpbGlueF9pbnRjLmMKaW5kZXggNDBlZGFkNS4uMWUwY2NmYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi94aWxpbnhfaW50Yy5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYveGlsaW54X2ludGMuYwpAQCAtNzksNyArNzksNyBAQAogCiBzdGF0aWMgaW50IHhpbGlueF9pbnRjX3NldF90eXBlKHVuc2lnbmVkIGludCB2aXJxLCB1bnNpZ25lZCBpbnQgZmxvd190eXBlKQogewotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGdldF9pcnFfZGVzYyh2aXJxKTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyh2aXJxKTsKIAogCWRlc2MtPnN0YXR1cyAmPSB+KElSUV9UWVBFX1NFTlNFX01BU0sgfCBJUlFfTEVWRUwpOwogCWRlc2MtPnN0YXR1cyB8PSBmbG93X3R5cGUgJiBJUlFfVFlQRV9TRU5TRV9NQVNLOwpAQCAtMTA2LDcgKzEwNiw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgeGlsaW54X2ludGNfbGV2ZWxfaXJxY2hpcCA9IHsKLQkudHlwZW5hbWUgPSAiWGlsaW54IExldmVsIElOVEMiLAorCS5uYW1lID0gIlhpbGlueCBMZXZlbCBJTlRDIiwKIAkubWFzayA9IHhpbGlueF9pbnRjX21hc2ssCiAJLm1hc2tfYWNrID0geGlsaW54X2ludGNfbWFzaywKIAkudW5tYXNrID0geGlsaW54X2ludGNfbGV2ZWxfdW5tYXNrLApAQCAtMTMzLDcgKzEzMyw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgeGlsaW54X2ludGNfZWRnZV9pcnFjaGlwID0gewotCS50eXBlbmFtZSA9ICJYaWxpbnggRWRnZSAgSU5UQyIsCisJLm5hbWUgPSAiWGlsaW54IEVkZ2UgIElOVEMiLAogCS5tYXNrID0geGlsaW54X2ludGNfbWFzaywKIAkudW5tYXNrID0geGlsaW54X2ludGNfZWRnZV91bm1hc2ssCiAJLmFjayA9IHhpbGlueF9pbnRjX2VkZ2VfYWNrLApAQCAtMTQ4LDcgKzE0OCw3IEBACiAgKiB4aWxpbnhfaW50Y194bGF0ZSAtIHRyYW5zbGF0ZSB2aXJxIyBmcm9tIGRldmljZSB0cmVlIGludGVycnVwdHMgcHJvcGVydHkKICAqLwogc3RhdGljIGludCB4aWxpbnhfaW50Y194bGF0ZShzdHJ1Y3QgaXJxX2hvc3QgKmgsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqY3QsCi0JCQkJdTMyICppbnRzcGVjLCB1bnNpZ25lZCBpbnQgaW50c2l6ZSwKKwkJCQljb25zdCB1MzIgKmludHNwZWMsIHVuc2lnbmVkIGludCBpbnRzaXplLAogCQkJCWlycV9od19udW1iZXJfdCAqb3V0X2h3aXJxLAogCQkJCXVuc2lnbmVkIGludCAqb3V0X2ZsYWdzKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3htb24veG1vbi5jIGIvYXJjaC9wb3dlcnBjL3htb24veG1vbi5jCmluZGV4IGJkYmU5NmMuLjRlNjE1MmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy94bW9uL3htb24uYworKysgYi9hcmNoL3Bvd2VycGMveG1vbi94bW9uLmMKQEAgLTE2NDEsNyArMTY0MSw4IEBACiAJCQkgICAgICAgcHRyTHBQYWNhLT5zYXZlZF9zcnIwLCBwdHJMcFBhY2EtPnNhdmVkX3NycjEpOwogCQkJcHJpbnRmKCIgICAgU2F2ZWQgR3ByMz0lLjE2bHggIFNhdmVkIEdwcjQ9JS4xNmx4IFxuIiwKIAkJCSAgICAgICBwdHJMcFBhY2EtPnNhdmVkX2dwcjMsIHB0ckxwUGFjYS0+c2F2ZWRfZ3ByNCk7Ci0JCQlwcmludGYoIiAgICBTYXZlZCBHcHI1PSUuMTZseCBcbiIsIHB0ckxwUGFjYS0+c2F2ZWRfZ3ByNSk7CisJCQlwcmludGYoIiAgICBTYXZlZCBHcHI1PSUuMTZseCBcbiIsCisJCQkJcHRyTHBQYWNhLT5ncHI1X2R3b3JkLnNhdmVkX2dwcjUpOwogCQl9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguYyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmMKaW5kZXggMjVjMzFkNi4uMjJjOWU1NSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguYworKysgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5jCkBAIC02MjQsMzggKzYyNCw2IEBACiAJdTMyCW9mZnNldDsKIH07CiAKLS8qIGNvbW1vbiBjb2RlIGZvciBvbGQgYW5kIG5ldyBtbWFwcyAqLwotc3RhdGljIGlubGluZSBsb25nIGRvX21tYXAyKAotCXVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCi0JdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLAotCXVuc2lnbmVkIGxvbmcgZmQsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCi17Ci0Jc3RydWN0IGZpbGUgKiBmaWxlID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGVycm9yID0gLUVCQURGOwotCi0JZmxhZ3MgJj0gfihNQVBfRVhFQ1VUQUJMRSB8IE1BUF9ERU5ZV1JJVEUpOwotCWlmICghKGZsYWdzICYgTUFQX0FOT05ZTU9VUykpIHsKLQkJZmlsZSA9IGZnZXQoZmQpOwotCQlpZiAoIWZpbGUpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCWVycm9yID0gZG9fbW1hcF9wZ29mZihmaWxlLCBhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBwZ29mZik7Ci0JaWYgKCFJU19FUlIoKHZvaWQgKikgZXJyb3IpICYmIGVycm9yICsgbGVuID49IDB4ODAwMDAwMDBVTEwpIHsKLQkJLyogUmVzdWx0IGlzIG91dCBvZiBib3VuZHMuICAqLwotCQlkb19tdW5tYXAoY3VycmVudC0+bW0sIGFkZHIsIGxlbik7Ci0JCWVycm9yID0gLUVOT01FTTsKLQl9Ci0JdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0KLQlpZiAoZmlsZSkKLQkJZnB1dChmaWxlKTsKLW91dDogICAgCi0JcmV0dXJuIGVycm9yOwotfQotCi0KIGFzbWxpbmthZ2UgdW5zaWduZWQgbG9uZwogb2xkMzJfbW1hcChzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0X2VtdTMxIF9fdXNlciAqYXJnKQogewpAQCAtNjY5LDcgKzYzNyw4IEBACiAJaWYgKGEub2Zmc2V0ICYgflBBR0VfTUFTSykKIAkJZ290byBvdXQ7CiAKLQllcnJvciA9IGRvX21tYXAyKGEuYWRkciwgYS5sZW4sIGEucHJvdCwgYS5mbGFncywgYS5mZCwgYS5vZmZzZXQgPj4gUEFHRV9TSElGVCk7IAorCWVycm9yID0gc3lzX21tYXBfcGdvZmYoYS5hZGRyLCBhLmxlbiwgYS5wcm90LCBhLmZsYWdzLCBhLmZkLAorCQkJICAgICAgIGEub2Zmc2V0ID4+IFBBR0VfU0hJRlQpOwogb3V0OgogCXJldHVybiBlcnJvcjsKIH0KQEAgLTY4Miw3ICs2NTEsNyBAQAogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZhLCBhcmcsIHNpemVvZihhKSkpCiAJCWdvdG8gb3V0OwotCWVycm9yID0gZG9fbW1hcDIoYS5hZGRyLCBhLmxlbiwgYS5wcm90LCBhLmZsYWdzLCBhLmZkLCBhLm9mZnNldCk7CisJZXJyb3IgPSBzeXNfbW1hcF9wZ29mZihhLmFkZHIsIGEubGVuLCBhLnByb3QsIGEuZmxhZ3MsIGEuZmQsIGEub2Zmc2V0KTsKIG91dDoKIAlyZXR1cm4gZXJyb3I7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3N5c19zMzkwLmMgYi9hcmNoL3MzOTAva2VybmVsL3N5c19zMzkwLmMKaW5kZXggZTlkOTRmNi4uODZhNzRjOSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zeXNfczM5MC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc3lzX3MzOTAuYwpAQCAtMzIsMzIgKzMyLDYgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgImVudHJ5LmgiCiAKLS8qIGNvbW1vbiBjb2RlIGZvciBvbGQgYW5kIG5ldyBtbWFwcyAqLwotc3RhdGljIGlubGluZSBsb25nIGRvX21tYXAyKAotCXVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCi0JdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLAotCXVuc2lnbmVkIGxvbmcgZmQsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCi17Ci0JbG9uZyBlcnJvciA9IC1FQkFERjsKLQlzdHJ1Y3QgZmlsZSAqIGZpbGUgPSBOVUxMOwotCi0JZmxhZ3MgJj0gfihNQVBfRVhFQ1VUQUJMRSB8IE1BUF9ERU5ZV1JJVEUpOwotCWlmICghKGZsYWdzICYgTUFQX0FOT05ZTU9VUykpIHsKLQkJZmlsZSA9IGZnZXQoZmQpOwotCQlpZiAoIWZpbGUpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCWVycm9yID0gZG9fbW1hcF9wZ29mZihmaWxlLCBhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBwZ29mZik7Ci0JdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0KLQlpZiAoZmlsZSkKLQkJZnB1dChmaWxlKTsKLW91dDoKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KIC8qCiAgKiBQZXJmb3JtIHRoZSBzZWxlY3QobmQsIGluLCBvdXQsIGV4LCB0dikgYW5kIG1tYXAoKSBzeXN0ZW0KICAqIGNhbGxzLiBMaW51eCBmb3IgUy8zOTAgaXNuJ3QgYWJsZSB0byBoYW5kbGUgbW9yZSB0aGFuIDUKQEAgLTgxLDcgKzU1LDcgQEAKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmYSwgYXJnLCBzaXplb2YoYSkpKQogCQlnb3RvIG91dDsKLQllcnJvciA9IGRvX21tYXAyKGEuYWRkciwgYS5sZW4sIGEucHJvdCwgYS5mbGFncywgYS5mZCwgYS5vZmZzZXQpOworCWVycm9yID0gc3lzX21tYXBfcGdvZmYoYS5hZGRyLCBhLmxlbiwgYS5wcm90LCBhLmZsYWdzLCBhLmZkLCBhLm9mZnNldCk7CiBvdXQ6CiAJcmV0dXJuIGVycm9yOwogfQpAQCAtOTgsNyArNzIsNyBAQAogCWlmIChhLm9mZnNldCAmIH5QQUdFX01BU0spCiAJCWdvdG8gb3V0OwogCi0JZXJyb3IgPSBkb19tbWFwMihhLmFkZHIsIGEubGVuLCBhLnByb3QsIGEuZmxhZ3MsIGEuZmQsIGEub2Zmc2V0ID4+IFBBR0VfU0hJRlQpOworCWVycm9yID0gc3lzX21tYXBfcGdvZmYoYS5hZGRyLCBhLmxlbiwgYS5wcm90LCBhLmZsYWdzLCBhLmZkLCBhLm9mZnNldCA+PiBQQUdFX1NISUZUKTsKIG91dDoKIAlyZXR1cm4gZXJyb3I7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Njb3JlL2tlcm5lbC9zeXNfc2NvcmUuYyBiL2FyY2gvc2NvcmUva2VybmVsL3N5c19zY29yZS5jCmluZGV4IDAwMTI0OTQuLjg1NmVkNjggMTAwNjQ0Ci0tLSBhL2FyY2gvc2NvcmUva2VybmVsL3N5c19zY29yZS5jCisrKyBiL2FyY2gvc2NvcmUva2VybmVsL3N5c19zY29yZS5jCkBAIC0zNiwzNCArMzYsMTYgQEAKIHN5c19tbWFwMih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIHByb3QsCiAJICB1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIGZkLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQogewotCWludCBlcnJvciA9IC1FQkFERjsKLQlzdHJ1Y3QgZmlsZSAqZmlsZSA9IE5VTEw7Ci0KLQlpZiAocGdvZmYgJiAoflBBR0VfTUFTSyA+PiAxMikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZmxhZ3MgJj0gfihNQVBfRVhFQ1VUQUJMRSB8IE1BUF9ERU5ZV1JJVEUpOwotCWlmICghKGZsYWdzICYgTUFQX0FOT05ZTU9VUykpIHsKLQkJZmlsZSA9IGZnZXQoZmQpOwotCQlpZiAoIWZpbGUpCi0JCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOwotCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCi0JaWYgKGZpbGUpCi0JCWZwdXQoZmlsZSk7Ci0KLQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIHN5c19tbWFwX3Bnb2ZmKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBwZ29mZik7CiB9CiAKIGFzbWxpbmthZ2UgbG9uZwogc3lzX21tYXAodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyBwcm90LAotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgZmQsIG9mZl90IHBnb2ZmKQorCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgZmQsIG9mZl90IG9mZnNldCkKIHsKLQlyZXR1cm4gc3lzX21tYXAyKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBwZ29mZiA+PiBQQUdFX1NISUZUKTsKKwlpZiAodW5saWtlbHkob2Zmc2V0ICYgflBBR0VfTUFTSykpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBzeXNfbW1hcF9wZ29mZihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgb2Zmc2V0ID4+IFBBR0VfU0hJRlQpOwogfQogCiBhc21saW5rYWdlIGxvbmcKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3N5c19zaC5jIGIvYXJjaC9zaC9rZXJuZWwvc3lzX3NoLmMKaW5kZXggOGFhNWQxYy4uNzEzOTljZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvc3lzX3NoLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvc3lzX3NoLmMKQEAgLTI4LDM3ICsyOCwxMyBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlY3RsLmg+CiAKLXN0YXRpYyBpbmxpbmUgbG9uZwotZG9fbW1hcDIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyBwcm90LAotCSB1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgZmQsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCi17Ci0JaW50IGVycm9yID0gLUVCQURGOwotCXN0cnVjdCBmaWxlICpmaWxlID0gTlVMTDsKLQotCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGZkKTsKLQkJaWYgKCFmaWxlKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOwotCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCi0JaWYgKGZpbGUpCi0JCWZwdXQoZmlsZSk7Ci1vdXQ6Ci0JcmV0dXJuIGVycm9yOwotfQotCiBhc21saW5rYWdlIGludCBvbGRfbW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAogCXVuc2lnbmVkIGxvbmcgcHJvdCwgdW5zaWduZWQgbG9uZyBmbGFncywKIAlpbnQgZmQsIHVuc2lnbmVkIGxvbmcgb2ZmKQogewogCWlmIChvZmYgJiB+UEFHRV9NQVNLKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gZG9fbW1hcDIoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsIG9mZj4+UEFHRV9TSElGVCk7CisJcmV0dXJuIHN5c19tbWFwX3Bnb2ZmKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBvZmY+PlBBR0VfU0hJRlQpOwogfQogCiBhc21saW5rYWdlIGxvbmcgc3lzX21tYXAyKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCkBAIC03NCw3ICs1MCw3IEBACiAKIAlwZ29mZiA+Pj0gUEFHRV9TSElGVCAtIDEyOwogCi0JcmV0dXJuIGRvX21tYXAyKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBwZ29mZik7CisJcmV0dXJuIHN5c19tbWFwX3Bnb2ZmKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBwZ29mZik7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL21tYXAuYyBiL2FyY2gvc2gvbW0vbW1hcC5jCmluZGV4IGQyOTg0ZmEuLmFmZWI3MTAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vbW1hcC5jCisrKyBiL2FyY2gvc2gvbW0vbW1hcC5jCkBAIC01NCw3ICs1NCw4IEBACiAJCS8qIFdlIGRvIG5vdCBhY2NlcHQgYSBzaGFyZWQgbWFwcGluZyBpZiBpdCB3b3VsZCB2aW9sYXRlCiAJCSAqIGNhY2hlIGFsaWFzaW5nIGNvbnN0cmFpbnRzLgogCQkgKi8KLQkJaWYgKChmbGFncyAmIE1BUF9TSEFSRUQpICYmIChhZGRyICYgc2htX2FsaWduX21hc2spKQorCQlpZiAoKGZsYWdzICYgTUFQX1NIQVJFRCkgJiYKKwkJICAgICgoYWRkciAtIChwZ29mZiA8PCBQQUdFX1NISUZUKSkgJiBzaG1fYWxpZ25fbWFzaykpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJcmV0dXJuIGFkZHI7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9mY250bC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9mY250bC5oCmluZGV4IGQ0ZDljOWQuLjNiOWNmYjMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZmNudGwuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2ZjbnRsLmgKQEAgLTEsMTQgKzEsMTIgQEAKICNpZm5kZWYgX1NQQVJDX0ZDTlRMX0gKICNkZWZpbmUgX1NQQVJDX0ZDTlRMX0gKIAotLyogb3Blbi9mY250bCAtIE9fU1lOQyBpcyBvbmx5IGltcGxlbWVudGVkIG9uIGJsb2NrcyBkZXZpY2VzIGFuZCBvbiBmaWxlcwotICAgbG9jYXRlZCBvbiBhbiBleHQyIGZpbGUgc3lzdGVtICovCiAjZGVmaW5lIE9fQVBQRU5ECTB4MDAwOAogI2RlZmluZSBGQVNZTkMJCTB4MDA0MAkvKiBmY250bCwgZm9yIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIE9fQ1JFQVQJCTB4MDIwMAkvKiBub3QgZmNudGwgKi8KICNkZWZpbmUgT19UUlVOQwkJMHgwNDAwCS8qIG5vdCBmY250bCAqLwogI2RlZmluZSBPX0VYQ0wJCTB4MDgwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19TWU5DCQkweDIwMDAKKyNkZWZpbmUgT19EU1lOQwkJMHgyMDAwCS8qIHVzZWQgdG8gYmUgT19TWU5DLCBzZWUgYmVsb3cgKi8KICNkZWZpbmUgT19OT05CTE9DSwkweDQwMDAKICNpZiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgZGVmaW5lZChfX2FyY2g2NF9fKQogI2RlZmluZSBPX05ERUxBWQkweDAwMDQKQEAgLTIwLDYgKzE4LDIxIEBACiAjZGVmaW5lIE9fRElSRUNUICAgICAgICAweDEwMDAwMCAvKiBkaXJlY3QgZGlzayBhY2Nlc3MgaGludCAqLwogI2RlZmluZSBPX05PQVRJTUUJMHgyMDAwMDAKICNkZWZpbmUgT19DTE9FWEVDCTB4NDAwMDAwCisvKgorICogQmVmb3JlIExpbnV4IDIuNi4zMiBvbmx5IE9fRFNZTkMgc2VtYW50aWNzIHdlcmUgaW1wbGVtZW50ZWQsIGJ1dCB1c2luZworICogdGhlIE9fU1lOQyBmbGFnLiAgV2UgY29udGludWUgdG8gdXNlIHRoZSBleGlzdGluZyBudW1lcmljYWwgdmFsdWUKKyAqIGZvciBPX0RTWU5DIHNlbWFudGljcyBub3csIGJ1dCB1c2luZyB0aGUgY29ycmVjdCBzeW1ib2xpYyBuYW1lIGZvciBpdC4KKyAqIFRoaXMgbmV3IHZhbHVlIGlzIHVzZWQgdG8gcmVxdWVzdCB0cnVlIFBvc2l4IE9fU1lOQyBzZW1hbnRpY3MuICBJdCBpcworICogZGVmaW5lZCBpbiB0aGlzIHN0cmFuZ2Ugd2F5IHRvIG1ha2Ugc3VyZSBhcHBsaWNhdGlvbnMgY29tcGlsZWQgYWdhaW5zdAorICogbmV3IGhlYWRlcnMgZ2V0IGF0IGxlYXN0IE9fRFNZTkMgc2VtYW50aWNzIG9uIG9sZGVyIGtlcm5lbHMuCisgKgorICogVGhpcyBoYXMgdGhlIG5pY2Ugc2lkZS1lZmZlY3QgdGhhdCB3ZSBjYW4gc2ltcGx5IHRlc3QgZm9yIE9fRFNZTkMKKyAqIHdoZXJldmVyIHdlIGRvIG5vdCBjYXJlIGlmIE9fRFNZTkMgb3IgT19TWU5DIGlzIHVzZWQuCisgKgorICogTm90ZTogX19PX1NZTkMgbXVzdCBuZXZlciBiZSB1c2VkIGRpcmVjdGx5LgorICovCisjZGVmaW5lIF9fT19TWU5DCTB4ODAwMDAwCisjZGVmaW5lIE9fU1lOQwkJKF9fT19TWU5DfE9fRFNZTkMpCiAKICNkZWZpbmUgRl9HRVRPV04JNQkvKiAgZm9yIHNvY2tldHMuICovCiAjZGVmaW5lIEZfU0VUT1dOCTYJLyogIGZvciBzb2NrZXRzLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wY2lfNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGNpXzY0LmgKaW5kZXggYjYzZTUxYy4uYjA1NzZkZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wY2lfNjQuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BjaV82NC5oCkBAIC0xNiw4ICsxNiw2IEBACiAKICNkZWZpbmUgUENJX0lSUV9OT05FCQkweGZmZmZmZmZmCiAKLSNkZWZpbmUgUENJX0NBQ0hFX0xJTkVfQllURVMJNjQKLQogc3RhdGljIGlubGluZSB2b2lkIHBjaWJpb3Nfc2V0X21hc3RlcihzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCS8qIE5vIHNwZWNpYWwgYnVzIG1hc3RlcmluZyBzZXR1cCBoYW5kbGluZyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvbm1pLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9ubWkuYwppbmRleCBiMTI5NjExLi5mMzBmNGExIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9ubWkuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9ubWkuYwpAQCAtNDcsNyArNDcsNyBAQAogc3RhdGljIGludCBlbmRmbGFnIF9faW5pdGRhdGE7CiAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBpbnQsIGxhc3RfaXJxX3N1bSk7Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUobG9jYWxfdCwgYWxlcnRfY291bnRlcik7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUobG9uZywgYWxlcnRfY291bnRlcik7CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBubWlfdG91Y2gpOwogCiB2b2lkIHRvdWNoX25taV93YXRjaGRvZyh2b2lkKQpAQCAtMTEyLDEzICsxMTIsMTMgQEAKIAkJdG91Y2hlZCA9IDE7CiAJfQogCWlmICghdG91Y2hlZCAmJiBfX2dldF9jcHVfdmFyKGxhc3RfaXJxX3N1bSkgPT0gc3VtKSB7Ci0JCWxvY2FsX2luYygmX19nZXRfY3B1X3ZhcihhbGVydF9jb3VudGVyKSk7Ci0JCWlmIChsb2NhbF9yZWFkKCZfX2dldF9jcHVfdmFyKGFsZXJ0X2NvdW50ZXIpKSA9PSAzMCAqIG5taV9oeikKKwkJX190aGlzX2NwdV9pbmMocGVyX2NwdV92YXIoYWxlcnRfY291bnRlcikpOworCQlpZiAoX190aGlzX2NwdV9yZWFkKHBlcl9jcHVfdmFyKGFsZXJ0X2NvdW50ZXIpKSA9PSAzMCAqIG5taV9oeikKIAkJCWRpZV9ubWkoIkJVRzogTk1JIFdhdGNoZG9nIGRldGVjdGVkIExPQ0tVUCIsCiAJCQkJcmVncywgcGFuaWNfb25fdGltZW91dCk7CiAJfSBlbHNlIHsKIAkJX19nZXRfY3B1X3ZhcihsYXN0X2lycV9zdW0pID0gc3VtOwotCQlsb2NhbF9zZXQoJl9fZ2V0X2NwdV92YXIoYWxlcnRfY291bnRlciksIDApOworCQlfX3RoaXNfY3B1X3dyaXRlKHBlcl9jcHVfdmFyKGFsZXJ0X2NvdW50ZXIpLCAwKTsKIAl9CiAJaWYgKF9fZ2V0X2NwdV92YXIod2RfZW5hYmxlZCkpIHsKIAkJd3JpdGVfcGljKHBpY2xfdmFsdWUobm1pX2h6KSk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2kuYyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaS5jCmluZGV4IGM2ODY0ODYuLmI4NTM3NGYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BjaS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaS5jCkBAIC0xMDgxLDMgKzEwODEsMTAgQEAKIAkqc3RhcnQgPSBycC0+c3RhcnQgLSBvZmZzZXQ7CiAJKmVuZCA9IHJwLT5lbmQgLSBvZmZzZXQ7CiB9CisKK3N0YXRpYyBpbnQgX19pbml0IHBjaWJpb3NfaW5pdCh2b2lkKQoreworCXBjaV9kZmxfY2FjaGVfbGluZV9zaXplID0gNjQgPj4gMjsKKwlyZXR1cm4gMDsKK30KK3N1YnN5c19pbml0Y2FsbChwY2liaW9zX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjMzIuYyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyYzMyLmMKaW5kZXggMDBhYmU4Ny4uZGMwYWMxOSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjMzIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXNfc3BhcmMzMi5jCkBAIC01NjQsMjggKzU2NCw2IEBACiAJcmV0dXJuIGRvX3N5c19vcGVuKEFUX0ZEQ1dELCBmaWxlbmFtZSwgZmxhZ3MsIG1vZGUpOwogfQogCi1leHRlcm4gdW5zaWduZWQgbG9uZyBkb19tcmVtYXAodW5zaWduZWQgbG9uZyBhZGRyLAotCXVuc2lnbmVkIGxvbmcgb2xkX2xlbiwgdW5zaWduZWQgbG9uZyBuZXdfbGVuLAotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgbmV3X2FkZHIpOwotICAgICAgICAgICAgICAgIAotYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nIHN5czMyX21yZW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsCi0JdW5zaWduZWQgbG9uZyBvbGRfbGVuLCB1bnNpZ25lZCBsb25nIG5ld19sZW4sCi0JdW5zaWduZWQgbG9uZyBmbGFncywgdTMyIF9fbmV3X2FkZHIpCi17Ci0JdW5zaWduZWQgbG9uZyByZXQgPSAtRUlOVkFMOwotCXVuc2lnbmVkIGxvbmcgbmV3X2FkZHIgPSBfX25ld19hZGRyOwotCi0JaWYgKHVubGlrZWx5KHNwYXJjX21tYXBfY2hlY2soYWRkciwgb2xkX2xlbikpKQotCQlnb3RvIG91dDsKLQlpZiAodW5saWtlbHkoc3BhcmNfbW1hcF9jaGVjayhuZXdfYWRkciwgbmV3X2xlbikpKQotCQlnb3RvIG91dDsKLQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCXJldCA9IGRvX21yZW1hcChhZGRyLCBvbGRfbGVuLCBuZXdfbGVuLCBmbGFncywgbmV3X2FkZHIpOwotCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotb3V0OgotCXJldHVybiByZXQ7ICAgICAgIAotfQotCiBsb25nIHN5czMyX2xvb2t1cF9kY29va2llKHVuc2lnbmVkIGxvbmcgY29va2llX2hpZ2gsCiAJCQkgIHVuc2lnbmVkIGxvbmcgY29va2llX2xvdywKIAkJCSAgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbikKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyY18zMi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjXzMyLmMKaW5kZXggMDMwMzVjOC4uM2E4MmU2NSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjXzMyLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjXzMyLmMKQEAgLTQ1LDcgKzQ1LDggQEAKIAkJLyogV2UgZG8gbm90IGFjY2VwdCBhIHNoYXJlZCBtYXBwaW5nIGlmIGl0IHdvdWxkIHZpb2xhdGUKIAkJICogY2FjaGUgYWxpYXNpbmcgY29uc3RyYWludHMuCiAJCSAqLwotCQlpZiAoKGZsYWdzICYgTUFQX1NIQVJFRCkgJiYgKGFkZHIgJiAoU0hNTEJBIC0gMSkpKQorCQlpZiAoKGZsYWdzICYgTUFQX1NIQVJFRCkgJiYKKwkJICAgICgoYWRkciAtIChwZ29mZiA8PCBQQUdFX1NISUZUKSkgJiAoU0hNTEJBIC0gMSkpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXJldHVybiBhZGRyOwogCX0KQEAgLTc5LDE1ICs4MCw2IEBACiAJfQogfQogCi1hc21saW5rYWdlIHVuc2lnbmVkIGxvbmcgc3BhcmNfYnJrKHVuc2lnbmVkIGxvbmcgYnJrKQotewotCWlmKEFSQ0hfU1VONEMpIHsKLQkJaWYgKChicmsgJiAweGUwMDAwMDAwKSAhPSAoY3VycmVudC0+bW0tPmJyayAmIDB4ZTAwMDAwMDApKQotCQkJcmV0dXJuIGN1cnJlbnQtPm1tLT5icms7Ci0JfQotCXJldHVybiBzeXNfYnJrKGJyayk7Ci19Ci0KIC8qCiAgKiBzeXNfcGlwZSgpIGlzIHRoZSBub3JtYWwgQyBjYWxsaW5nIHN0YW5kYXJkIGZvciBjcmVhdGluZwogICogYSBwaXBlLiBJdCdzIG5vdCB0aGUgd2F5IHVuaXggdHJhZGl0aW9uYWxseSBkb2VzIHRoaXMsIHRob3VnaC4KQEAgLTIzNCwzMSArMjI2LDYgQEAKIH0KIAogLyogTGludXggdmVyc2lvbiBvZiBtbWFwICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBkb19tbWFwMih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAotCXVuc2lnbmVkIGxvbmcgcHJvdCwgdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBmZCwKLQl1bnNpZ25lZCBsb25nIHBnb2ZmKQotewotCXN0cnVjdCBmaWxlICogZmlsZSA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyByZXR2YWwgPSAtRUJBREY7Ci0KLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGZkKTsKLQkJaWYgKCFmaWxlKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JbGVuID0gUEFHRV9BTElHTihsZW4pOwotCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQotCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JcmV0dmFsID0gZG9fbW1hcF9wZ29mZihmaWxlLCBhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBwZ29mZik7Ci0JdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0KLQlpZiAoZmlsZSkKLQkJZnB1dChmaWxlKTsKLW91dDoKLQlyZXR1cm4gcmV0dmFsOwotfQogCiBhc21saW5rYWdlIHVuc2lnbmVkIGxvbmcgc3lzX21tYXAyKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCiAJdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIGZkLApAQCAtMjY2LDE0ICsyMzMsMTYgQEAKIHsKIAkvKiBNYWtlIHN1cmUgdGhlIHNoaWZ0IGZvciBtbWFwMiBpcyBjb25zdGFudCAoMTIpLCBubyBtYXR0ZXIgd2hhdCBQQUdFX1NJWkUKIAkgICB3ZSBoYXZlLiAqLwotCXJldHVybiBkb19tbWFwMihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgcGdvZmYgPj4gKFBBR0VfU0hJRlQgLSAxMikpOworCXJldHVybiBzeXNfbW1hcF9wZ29mZihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwKKwkJCSAgICAgIHBnb2ZmID4+IChQQUdFX1NISUZUIC0gMTIpKTsKIH0KIAogYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nIHN5c19tbWFwKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCiAJdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIGZkLAogCXVuc2lnbmVkIGxvbmcgb2ZmKQogewotCXJldHVybiBkb19tbWFwMihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgb2ZmID4+IFBBR0VfU0hJRlQpOworCS8qIG5vIGFsaWdubWVudCBjaGVjaz8gKi8KKwlyZXR1cm4gc3lzX21tYXBfcGdvZmYoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsIG9mZiA+PiBQQUdFX1NISUZUKTsKIH0KIAogbG9uZyBzcGFyY19yZW1hcF9maWxlX3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKQEAgLTI4NywyNyArMjU2LDYgQEAKIAkJCQkgICAgKHBnb2ZmID4+IChQQUdFX1NISUZUIC0gMTIpKSwgZmxhZ3MpOwogfQogCi1leHRlcm4gdW5zaWduZWQgbG9uZyBkb19tcmVtYXAodW5zaWduZWQgbG9uZyBhZGRyLAotCXVuc2lnbmVkIGxvbmcgb2xkX2xlbiwgdW5zaWduZWQgbG9uZyBuZXdfbGVuLAotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgbmV3X2FkZHIpOwotICAgICAgICAgICAgICAgIAotYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nIHNwYXJjX21yZW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsCi0JdW5zaWduZWQgbG9uZyBvbGRfbGVuLCB1bnNpZ25lZCBsb25nIG5ld19sZW4sCi0JdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBuZXdfYWRkcikKLXsKLQl1bnNpZ25lZCBsb25nIHJldCA9IC1FSU5WQUw7Ci0KLQlpZiAodW5saWtlbHkoc3BhcmNfbW1hcF9jaGVjayhhZGRyLCBvbGRfbGVuKSkpCi0JCWdvdG8gb3V0OwotCWlmICh1bmxpa2VseShzcGFyY19tbWFwX2NoZWNrKG5ld19hZGRyLCBuZXdfbGVuKSkpCi0JCWdvdG8gb3V0OwotCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JcmV0ID0gZG9fbXJlbWFwKGFkZHIsIG9sZF9sZW4sIG5ld19sZW4sIGZsYWdzLCBuZXdfYWRkcik7Ci0JdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci1vdXQ6Ci0JcmV0dXJuIHJldDsgICAgICAgCi19Ci0KIC8qIHdlIGNvbWUgdG8gaGVyZSB2aWEgc3lzX25pc19zeXNjYWxsIHNvIGl0IGNhbiBzZXR1cCB0aGUgcmVncyBhcmd1bWVudCAqLwogYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nCiBjX3N5c19uaXNfc3lzY2FsbCAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zeXNfc3BhcmNfNjQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyY182NC5jCmluZGV4IGUyZDEwMjQuLmNmYTBlMTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyY182NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyY182NC5jCkBAIC0zMTcsMTAgKzMxNywxNCBAQAogdW5zaWduZWQgbG9uZyBnZXRfZmJfdW5tYXBwZWRfYXJlYShzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgbG9uZyBvcmlnX2FkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIHBnb2ZmLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXVuc2lnbmVkIGxvbmcgYWxpZ25fZ29hbCwgYWRkciA9IC1FTk9NRU07CisJdW5zaWduZWQgbG9uZyAoKmdldF9hcmVhKShzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBsb25nLAorCQkJCSAgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CisKKwlnZXRfYXJlYSA9IGN1cnJlbnQtPm1tLT5nZXRfdW5tYXBwZWRfYXJlYTsKIAogCWlmIChmbGFncyAmIE1BUF9GSVhFRCkgewogCQkvKiBPaywgZG9uJ3QgbWVzcyB3aXRoIGl0LiAqLwotCQlyZXR1cm4gZ2V0X3VubWFwcGVkX2FyZWEoTlVMTCwgb3JpZ19hZGRyLCBsZW4sIHBnb2ZmLCBmbGFncyk7CisJCXJldHVybiBnZXRfYXJlYShOVUxMLCBvcmlnX2FkZHIsIGxlbiwgcGdvZmYsIGZsYWdzKTsKIAl9CiAJZmxhZ3MgJj0gfk1BUF9TSEFSRUQ7CiAKQEAgLTMzMyw3ICszMzcsNyBAQAogCQlhbGlnbl9nb2FsID0gKDY0VUwgKiAxMDI0KTsKIAogCWRvIHsKLQkJYWRkciA9IGdldF91bm1hcHBlZF9hcmVhKE5VTEwsIG9yaWdfYWRkciwgbGVuICsgKGFsaWduX2dvYWwgLSBQQUdFX1NJWkUpLCBwZ29mZiwgZmxhZ3MpOworCQlhZGRyID0gZ2V0X2FyZWEoTlVMTCwgb3JpZ19hZGRyLCBsZW4gKyAoYWxpZ25fZ29hbCAtIFBBR0VfU0laRSksIHBnb2ZmLCBmbGFncyk7CiAJCWlmICghKGFkZHIgJiB+UEFHRV9NQVNLKSkgewogCQkJYWRkciA9IChhZGRyICsgKGFsaWduX2dvYWwgLSAxVUwpKSAmIH4oYWxpZ25fZ29hbCAtIDFVTCk7CiAJCQlicmVhazsKQEAgLTM1MSw3ICszNTUsNyBAQAogCSAqIGJlIG9idGFpbmVkLgogCSAqLwogCWlmIChhZGRyICYgflBBR0VfTUFTSykKLQkJYWRkciA9IGdldF91bm1hcHBlZF9hcmVhKE5VTEwsIG9yaWdfYWRkciwgbGVuLCBwZ29mZiwgZmxhZ3MpOworCQlhZGRyID0gZ2V0X2FyZWEoTlVMTCwgb3JpZ19hZGRyLCBsZW4sIHBnb2ZmLCBmbGFncyk7CiAKIAlyZXR1cm4gYWRkcjsKIH0KQEAgLTM5OSwxOCArNDAzLDYgQEAKIAl9CiB9CiAKLVNZU0NBTExfREVGSU5FMShzcGFyY19icmssIHVuc2lnbmVkIGxvbmcsIGJyaykKLXsKLQkvKiBQZW9wbGUgY291bGQgdHJ5IHRvIGJlIG5hc3R5IGFuZCB1c2UgdGEgMHg2ZCBpbiAzMmJpdCBwcm9ncmFtcyAqLwotCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVCkgJiYgYnJrID49IFNUQUNLX1RPUDMyKQotCQlyZXR1cm4gY3VycmVudC0+bW0tPmJyazsKLQotCWlmICh1bmxpa2VseShzdHJhZGRsZXNfNjRiaXRfdmFfaG9sZShjdXJyZW50LT5tbS0+YnJrLCBicmspKSkKLQkJcmV0dXJuIGN1cnJlbnQtPm1tLT5icms7Ci0KLQlyZXR1cm4gc3lzX2JyayhicmspOwotfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogLyoKICAqIHN5c19waXBlKCkgaXMgdGhlIG5vcm1hbCBDIGNhbGxpbmcgc3RhbmRhcmQgZm9yIGNyZWF0aW5nCiAgKiBhIHBpcGUuIEl0J3Mgbm90IHRoZSB3YXkgdW5peCB0cmFkaXRpb25hbGx5IGRvZXMgdGhpcywgdGhvdWdoLgpAQCAtNTY4LDIzICs1NjAsMTMgQEAKIAkJdW5zaWduZWQgbG9uZywgcHJvdCwgdW5zaWduZWQgbG9uZywgZmxhZ3MsIHVuc2lnbmVkIGxvbmcsIGZkLAogCQl1bnNpZ25lZCBsb25nLCBvZmYpCiB7Ci0Jc3RydWN0IGZpbGUgKiBmaWxlID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIHJldHZhbCA9IC1FQkFERjsKKwl1bnNpZ25lZCBsb25nIHJldHZhbCA9IC1FSU5WQUw7CiAKLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGZkKTsKLQkJaWYgKCFmaWxlKQotCQkJZ290byBvdXQ7Ci0JfQotCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQlsZW4gPSBQQUdFX0FMSUdOKGxlbik7Ci0KLQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCXJldHZhbCA9IGRvX21tYXAoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgb2ZmKTsKLQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQotCWlmIChmaWxlKQotCQlmcHV0KGZpbGUpOworCWlmICgob2ZmICsgUEFHRV9BTElHTihsZW4pKSA8IG9mZikKKwkJZ290byBvdXQ7CisJaWYgKG9mZiAmIH5QQUdFX01BU0spCisJCWdvdG8gb3V0OworCXJldHZhbCA9IHN5c19tbWFwX3Bnb2ZmKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBvZmYgPj4gUEFHRV9TSElGVCk7CiBvdXQ6CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTYxNCwxMiArNTk2LDYgQEAKIAogCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVCkpCiAJCWdvdG8gb3V0OwotCWlmICh1bmxpa2VseShuZXdfbGVuID49IFZBX0VYQ0xVREVfU1RBUlQpKQotCQlnb3RvIG91dDsKLQlpZiAodW5saWtlbHkoc3BhcmNfbW1hcF9jaGVjayhhZGRyLCBvbGRfbGVuKSkpCi0JCWdvdG8gb3V0OwotCWlmICh1bmxpa2VseShzcGFyY19tbWFwX2NoZWNrKG5ld19hZGRyLCBuZXdfbGVuKSkpCi0JCWdvdG8gb3V0OwogCiAJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAlyZXQgPSBkb19tcmVtYXAoYWRkciwgb2xkX2xlbiwgbmV3X2xlbiwgZmxhZ3MsIG5ld19hZGRyKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3N5c3RibHMuaCBiL2FyY2gvc3BhcmMva2VybmVsL3N5c3RibHMuaAppbmRleCBhNjNjNWQyLi5kMmY5OTlhIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzLmgKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJscy5oCkBAIC05LDcgKzksNiBAQAogc3RydWN0IG5ld191dHNuYW1lOwogCiBleHRlcm4gYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nIHN5c19nZXRwYWdlc2l6ZSh2b2lkKTsKLWV4dGVybiBhc21saW5rYWdlIHVuc2lnbmVkIGxvbmcgc3BhcmNfYnJrKHVuc2lnbmVkIGxvbmcgYnJrKTsKIGV4dGVybiBhc21saW5rYWdlIGxvbmcgc3BhcmNfcGlwZShzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBleHRlcm4gYXNtbGlua2FnZSBsb25nIHN5c19pcGModW5zaWduZWQgaW50IGNhbGwsIGludCBmaXJzdCwKIAkJCSAgICAgICB1bnNpZ25lZCBsb25nIHNlY29uZCwKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3N5c3RibHNfMzIuUyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c3RibHNfMzIuUwppbmRleCBjZWIxNTMwLi44MDFmYzhlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzXzMyLlMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJsc18zMi5TCkBAIC0xOSw3ICsxOSw3IEBACiAvKjAqLwkubG9uZyBzeXNfcmVzdGFydF9zeXNjYWxsLCBzeXNfZXhpdCwgc3lzX2ZvcmssIHN5c19yZWFkLCBzeXNfd3JpdGUKIC8qNSovCS5sb25nIHN5c19vcGVuLCBzeXNfY2xvc2UsIHN5c193YWl0NCwgc3lzX2NyZWF0LCBzeXNfbGluawogLyoxMCovICAubG9uZyBzeXNfdW5saW5rLCBzdW5vc19leGVjdiwgc3lzX2NoZGlyLCBzeXNfY2hvd24xNiwgc3lzX21rbm9kCi0vKjE1Ki8JLmxvbmcgc3lzX2NobW9kLCBzeXNfbGNob3duMTYsIHNwYXJjX2Jyaywgc3lzX25pc19zeXNjYWxsLCBzeXNfbHNlZWsKKy8qMTUqLwkubG9uZyBzeXNfY2htb2QsIHN5c19sY2hvd24xNiwgc3lzX2Jyaywgc3lzX25pc19zeXNjYWxsLCBzeXNfbHNlZWsKIC8qMjAqLwkubG9uZyBzeXNfZ2V0cGlkLCBzeXNfY2FwZ2V0LCBzeXNfY2Fwc2V0LCBzeXNfc2V0dWlkMTYsIHN5c19nZXR1aWQxNgogLyoyNSovCS5sb25nIHN5c192bXNwbGljZSwgc3lzX3B0cmFjZSwgc3lzX2FsYXJtLCBzeXNfc2lnYWx0c3RhY2ssIHN5c19wYXVzZQogLyozMCovCS5sb25nIHN5c191dGltZSwgc3lzX2xjaG93biwgc3lzX2ZjaG93biwgc3lzX2FjY2Vzcywgc3lzX25pY2UKQEAgLTY3LDcgKzY3LDcgQEAKIC8qMjM1Ki8JLmxvbmcgc3lzX2ZzdGF0ZnM2NCwgc3lzX2xsc2Vlaywgc3lzX21sb2NrLCBzeXNfbXVubG9jaywgc3lzX21sb2NrYWxsCiAvKjI0MCovCS5sb25nIHN5c19tdW5sb2NrYWxsLCBzeXNfc2NoZWRfc2V0cGFyYW0sIHN5c19zY2hlZF9nZXRwYXJhbSwgc3lzX3NjaGVkX3NldHNjaGVkdWxlciwgc3lzX3NjaGVkX2dldHNjaGVkdWxlcgogLyoyNDUqLwkubG9uZyBzeXNfc2NoZWRfeWllbGQsIHN5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWF4LCBzeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbiwgc3lzX3NjaGVkX3JyX2dldF9pbnRlcnZhbCwgc3lzX25hbm9zbGVlcAotLyoyNTAqLwkubG9uZyBzcGFyY19tcmVtYXAsIHN5c19zeXNjdGwsIHN5c19nZXRzaWQsIHN5c19mZGF0YXN5bmMsIHN5c19uZnNzZXJ2Y3RsCisvKjI1MCovCS5sb25nIHN5c19tcmVtYXAsIHN5c19zeXNjdGwsIHN5c19nZXRzaWQsIHN5c19mZGF0YXN5bmMsIHN5c19uZnNzZXJ2Y3RsCiAvKjI1NSovCS5sb25nIHN5c19zeW5jX2ZpbGVfcmFuZ2UsIHN5c19jbG9ja19zZXR0aW1lLCBzeXNfY2xvY2tfZ2V0dGltZSwgc3lzX2Nsb2NrX2dldHJlcywgc3lzX2Nsb2NrX25hbm9zbGVlcAogLyoyNjAqLwkubG9uZyBzeXNfc2NoZWRfZ2V0YWZmaW5pdHksIHN5c19zY2hlZF9zZXRhZmZpbml0eSwgc3lzX3RpbWVyX3NldHRpbWUsIHN5c190aW1lcl9nZXR0aW1lLCBzeXNfdGltZXJfZ2V0b3ZlcnJ1bgogLyoyNjUqLwkubG9uZyBzeXNfdGltZXJfZGVsZXRlLCBzeXNfdGltZXJfY3JlYXRlLCBzeXNfbmlzX3N5c2NhbGwsIHN5c19pb19zZXR1cCwgc3lzX2lvX2Rlc3Ryb3kKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3N5c3RibHNfNjQuUyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c3RibHNfNjQuUwppbmRleCBjYzhlNzg2Li5lNTc1YjQ2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzXzY0LlMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJsc182NC5TCkBAIC0yMSw3ICsyMSw3IEBACiAvKjAqLwkud29yZCBzeXNfcmVzdGFydF9zeXNjYWxsLCBzeXMzMl9leGl0LCBzeXNfZm9yaywgc3lzX3JlYWQsIHN5c193cml0ZQogLyo1Ki8JLndvcmQgc3lzMzJfb3Blbiwgc3lzX2Nsb3NlLCBzeXMzMl93YWl0NCwgc3lzMzJfY3JlYXQsIHN5c19saW5rCiAvKjEwKi8gIC53b3JkIHN5c191bmxpbmssIHN1bm9zX2V4ZWN2LCBzeXNfY2hkaXIsIHN5c19jaG93bjE2LCBzeXMzMl9ta25vZAotLyoxNSovCS53b3JkIHN5c19jaG1vZCwgc3lzX2xjaG93bjE2LCBzeXNfc3BhcmNfYnJrLCBzeXMzMl9wZXJmY3RyLCBzeXMzMl9sc2VlaworLyoxNSovCS53b3JkIHN5c19jaG1vZCwgc3lzX2xjaG93bjE2LCBzeXNfYnJrLCBzeXMzMl9wZXJmY3RyLCBzeXMzMl9sc2VlawogLyoyMCovCS53b3JkIHN5c19nZXRwaWQsIHN5c19jYXBnZXQsIHN5c19jYXBzZXQsIHN5c19zZXR1aWQxNiwgc3lzX2dldHVpZDE2CiAvKjI1Ki8JLndvcmQgc3lzMzJfdm1zcGxpY2UsIGNvbXBhdF9zeXNfcHRyYWNlLCBzeXNfYWxhcm0sIHN5czMyX3NpZ2FsdHN0YWNrLCBzeXNfcGF1c2UKIC8qMzAqLwkud29yZCBjb21wYXRfc3lzX3V0aW1lLCBzeXNfbGNob3duLCBzeXNfZmNob3duLCBzeXMzMl9hY2Nlc3MsIHN5czMyX25pY2UKQEAgLTY4LDcgKzY4LDcgQEAKIAkud29yZCBjb21wYXRfc3lzX2ZzdGF0ZnM2NCwgc3lzX2xsc2Vlaywgc3lzX21sb2NrLCBzeXNfbXVubG9jaywgc3lzMzJfbWxvY2thbGwKIC8qMjQwKi8JLndvcmQgc3lzX211bmxvY2thbGwsIHN5czMyX3NjaGVkX3NldHBhcmFtLCBzeXMzMl9zY2hlZF9nZXRwYXJhbSwgc3lzMzJfc2NoZWRfc2V0c2NoZWR1bGVyLCBzeXMzMl9zY2hlZF9nZXRzY2hlZHVsZXIKIAkud29yZCBzeXNfc2NoZWRfeWllbGQsIHN5czMyX3NjaGVkX2dldF9wcmlvcml0eV9tYXgsIHN5czMyX3NjaGVkX2dldF9wcmlvcml0eV9taW4sIHN5czMyX3NjaGVkX3JyX2dldF9pbnRlcnZhbCwgY29tcGF0X3N5c19uYW5vc2xlZXAKLS8qMjUwKi8JLndvcmQgc3lzMzJfbXJlbWFwLCBjb21wYXRfc3lzX3N5c2N0bCwgc3lzMzJfZ2V0c2lkLCBzeXNfZmRhdGFzeW5jLCBzeXMzMl9uZnNzZXJ2Y3RsCisvKjI1MCovCS53b3JkIHN5c19tcmVtYXAsIGNvbXBhdF9zeXNfc3lzY3RsLCBzeXMzMl9nZXRzaWQsIHN5c19mZGF0YXN5bmMsIHN5czMyX25mc3NlcnZjdGwKIAkud29yZCBzeXMzMl9zeW5jX2ZpbGVfcmFuZ2UsIGNvbXBhdF9zeXNfY2xvY2tfc2V0dGltZSwgY29tcGF0X3N5c19jbG9ja19nZXR0aW1lLCBjb21wYXRfc3lzX2Nsb2NrX2dldHJlcywgc3lzMzJfY2xvY2tfbmFub3NsZWVwCiAvKjI2MCovCS53b3JkIGNvbXBhdF9zeXNfc2NoZWRfZ2V0YWZmaW5pdHksIGNvbXBhdF9zeXNfc2NoZWRfc2V0YWZmaW5pdHksIHN5czMyX3RpbWVyX3NldHRpbWUsIGNvbXBhdF9zeXNfdGltZXJfZ2V0dGltZSwgc3lzX3RpbWVyX2dldG92ZXJydW4KIAkud29yZCBzeXNfdGltZXJfZGVsZXRlLCBjb21wYXRfc3lzX3RpbWVyX2NyZWF0ZSwgc3lzX25pX3N5c2NhbGwsIGNvbXBhdF9zeXNfaW9fc2V0dXAsIHN5c19pb19kZXN0cm95CkBAIC05Niw3ICs5Niw3IEBACiAvKjAqLwkud29yZCBzeXNfcmVzdGFydF9zeXNjYWxsLCBzcGFyY19leGl0LCBzeXNfZm9yaywgc3lzX3JlYWQsIHN5c193cml0ZQogLyo1Ki8JLndvcmQgc3lzX29wZW4sIHN5c19jbG9zZSwgc3lzX3dhaXQ0LCBzeXNfY3JlYXQsIHN5c19saW5rCiAvKjEwKi8gIC53b3JkIHN5c191bmxpbmssIHN5c19uaXNfc3lzY2FsbCwgc3lzX2NoZGlyLCBzeXNfY2hvd24sIHN5c19ta25vZAotLyoxNSovCS53b3JkIHN5c19jaG1vZCwgc3lzX2xjaG93biwgc3lzX3NwYXJjX2Jyaywgc3lzX3BlcmZjdHIsIHN5c19sc2VlaworLyoxNSovCS53b3JkIHN5c19jaG1vZCwgc3lzX2xjaG93biwgc3lzX2Jyaywgc3lzX3BlcmZjdHIsIHN5c19sc2VlawogLyoyMCovCS53b3JkIHN5c19nZXRwaWQsIHN5c19jYXBnZXQsIHN5c19jYXBzZXQsIHN5c19zZXR1aWQsIHN5c19nZXR1aWQKIC8qMjUqLwkud29yZCBzeXNfdm1zcGxpY2UsIHN5c19wdHJhY2UsIHN5c19hbGFybSwgc3lzX3NpZ2FsdHN0YWNrLCBzeXNfbmlzX3N5c2NhbGwKIC8qMzAqLwkud29yZCBzeXNfdXRpbWUsIHN5c19uaXNfc3lzY2FsbCwgc3lzX25pc19zeXNjYWxsLCBzeXNfYWNjZXNzLCBzeXNfbmljZQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc3lzY2FsbC5jIGIvYXJjaC91bS9rZXJuZWwvc3lzY2FsbC5jCmluZGV4IGE0NjI1YzcuLmNjY2FiODUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3N5c2NhbGwuYworKysgYi9hcmNoL3VtL2tlcm5lbC9zeXNjYWxsLmMKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSAibGludXgvbW0uaCIKICNpbmNsdWRlICJsaW51eC9zY2hlZC5oIgogI2luY2x1ZGUgImxpbnV4L3V0c25hbWUuaCIKKyNpbmNsdWRlICJsaW51eC9zeXNjYWxscy5oIgogI2luY2x1ZGUgImFzbS9jdXJyZW50LmgiCiAjaW5jbHVkZSAiYXNtL21tYW4uaCIKICNpbmNsdWRlICJhc20vdWFjY2Vzcy5oIgpAQCAtMzcsMzEgKzM4LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBjb21tb24gY29kZSBmb3Igb2xkIGFuZCBuZXcgbW1hcHMgKi8KLWxvbmcgc3lzX21tYXAyKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCi0JICAgICAgIHVuc2lnbmVkIGxvbmcgcHJvdCwgdW5zaWduZWQgbG9uZyBmbGFncywKLQkgICAgICAgdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZikKLXsKLQlsb25nIGVycm9yID0gLUVCQURGOwotCXN0cnVjdCBmaWxlICogZmlsZSA9IE5VTEw7Ci0KLQlmbGFncyAmPSB+KE1BUF9FWEVDVVRBQkxFIHwgTUFQX0RFTllXUklURSk7Ci0JaWYgKCEoZmxhZ3MgJiBNQVBfQU5PTllNT1VTKSkgewotCQlmaWxlID0gZmdldChmZCk7Ci0JCWlmICghZmlsZSkKLQkJCWdvdG8gb3V0OwotCX0KLQotCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JZXJyb3IgPSBkb19tbWFwX3Bnb2ZmKGZpbGUsIGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIHBnb2ZmKTsKLQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQotCWlmIChmaWxlKQotCQlmcHV0KGZpbGUpOwotIG91dDoKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KIGxvbmcgb2xkX21tYXAodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKIAkgICAgICB1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiAJICAgICAgdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCkBAIC03MCw3ICs0Niw3IEBACiAJaWYgKG9mZnNldCAmIH5QQUdFX01BU0spCiAJCWdvdG8gb3V0OwogCi0JZXJyID0gc3lzX21tYXAyKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBvZmZzZXQgPj4gUEFHRV9TSElGVCk7CisJZXJyID0gc3lzX21tYXBfcGdvZmYoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsIG9mZnNldCA+PiBQQUdFX1NISUZUKTsKICBvdXQ6CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9zeXNjYWxscy5oIGIvYXJjaC91bS9zeXMtaTM4Ni9zaGFyZWQvc3lzZGVwL3N5c2NhbGxzLmgKaW5kZXggOTA1Njk4MS4uZTc3ODc2NyAxMDA2NDQKLS0tIGEvYXJjaC91bS9zeXMtaTM4Ni9zaGFyZWQvc3lzZGVwL3N5c2NhbGxzLmgKKysrIGIvYXJjaC91bS9zeXMtaTM4Ni9zaGFyZWQvc3lzZGVwL3N5c2NhbGxzLmgKQEAgLTIwLDcgKzIwLDMgQEAKICNkZWZpbmUgRVhFQ1VURV9TWVNDQUxMKHN5c2NhbGwsIHJlZ3MpIFwKIAkoKGxvbmcgKCopKHN0cnVjdCBzeXNjYWxsX2FyZ3MpKSBcCiAJICgqc3lzX2NhbGxfdGFibGVbc3lzY2FsbF0pKShTWVNDQUxMX0FSR1MoJnJlZ3MtPnJlZ3MpKQotCi1leHRlcm4gbG9uZyBzeXNfbW1hcDIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQkJICAgICAgdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLAotCQkgICAgICB1bnNpZ25lZCBsb25nIGZkLCB1bnNpZ25lZCBsb25nIHBnb2ZmKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L0tjb25maWcuZGVidWcgYi9hcmNoL3g4Ni9LY29uZmlnLmRlYnVnCmluZGV4IDczMTMxOGUuLmJjMDFlM2UgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L0tjb25maWcuZGVidWcKKysrIGIvYXJjaC94ODYvS2NvbmZpZy5kZWJ1ZwpAQCAtMTg3LDggKzE4Nyw4IEBACiAJZGVmX2Jvb2wgeQogCiBjb25maWcgWDg2X0RFQ09ERVJfU0VMRlRFU1QKLSAgICAgYm9vbCAieDg2IGluc3RydWN0aW9uIGRlY29kZXIgc2VsZnRlc3QiCi0gICAgIGRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisJYm9vbCAieDg2IGluc3RydWN0aW9uIGRlY29kZXIgc2VsZnRlc3QiCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwgJiYgS1BST0JFUwogCS0tLWhlbHAtLS0KIAkgUGVyZm9ybSB4ODYgaW5zdHJ1Y3Rpb24gZGVjb2RlciBzZWxmdGVzdHMgYXQgYnVpbGQgdGltZS4KIAkgVGhpcyBvcHRpb24gaXMgdXNlZnVsIGZvciBjaGVja2luZyB0aGUgc2FuaXR5IG9mIHg4NiBpbnN0cnVjdGlvbgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaWEzMi9pYTMyZW50cnkuUyBiL2FyY2gveDg2L2lhMzIvaWEzMmVudHJ5LlMKaW5kZXggNGVlZmRjYS4uNTMxNDdhZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaWEzMi9pYTMyZW50cnkuUworKysgYi9hcmNoL3g4Ni9pYTMyL2lhMzJlbnRyeS5TCkBAIC02OTYsNyArNjk2LDcgQEAKIAkucXVhZCBxdWlldF9uaV9zeXNjYWxsCQkvKiBzdHJlYW1zMiAqLwogCS5xdWFkIHN0dWIzMl92Zm9yayAgICAgICAgICAgIC8qIDE5MCAqLwogCS5xdWFkIGNvbXBhdF9zeXNfZ2V0cmxpbWl0Ci0JLnF1YWQgc3lzMzJfbW1hcDIKKwkucXVhZCBzeXNfbW1hcF9wZ29mZgogCS5xdWFkIHN5czMyX3RydW5jYXRlNjQKIAkucXVhZCBzeXMzMl9mdHJ1bmNhdGU2NAogCS5xdWFkIHN5czMyX3N0YXQ2NAkJLyogMTk1ICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pYTMyL3N5c19pYTMyLmMgYi9hcmNoL3g4Ni9pYTMyL3N5c19pYTMyLmMKaW5kZXggZGY4MmMwZS4uNDIyNTcyYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaWEzMi9zeXNfaWEzMi5jCisrKyBiL2FyY2gveDg2L2lhMzIvc3lzX2lhMzIuYwpAQCAtMTU1LDkgKzE1NSw2IEBACiBhc21saW5rYWdlIGxvbmcgc3lzMzJfbW1hcChzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0IF9fdXNlciAqYXJnKQogewogCXN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3QgYTsKLQlzdHJ1Y3QgZmlsZSAqZmlsZSA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyByZXR2YWw7Ci0Jc3RydWN0IG1tX3N0cnVjdCAqbW0gOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZhLCBhcmcsIHNpemVvZihhKSkpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtMTY1LDIyICsxNjIsOCBAQAogCWlmIChhLm9mZnNldCAmIH5QQUdFX01BU0spCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKCEoYS5mbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGEuZmQpOwotCQlpZiAoIWZpbGUpCi0JCQlyZXR1cm4gLUVCQURGOwotCX0KLQotCW1tID0gY3VycmVudC0+bW07Ci0JZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKLQlyZXR2YWwgPSBkb19tbWFwX3Bnb2ZmKGZpbGUsIGEuYWRkciwgYS5sZW4sIGEucHJvdCwgYS5mbGFncywKKwlyZXR1cm4gc3lzX21tYXBfcGdvZmYoYS5hZGRyLCBhLmxlbiwgYS5wcm90LCBhLmZsYWdzLCBhLmZkLAogCQkJICAgICAgIGEub2Zmc2V0Pj5QQUdFX1NISUZUKTsKLQlpZiAoZmlsZSkKLQkJZnB1dChmaWxlKTsKLQotCXVwX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwotCi0JcmV0dXJuIHJldHZhbDsKIH0KIAogYXNtbGlua2FnZSBsb25nIHN5czMyX21wcm90ZWN0KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHNpemVfdCBsZW4sCkBAIC00ODMsMzAgKzQ2Niw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5czMyX21tYXAyKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCi0JCQkgICAgdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLAotCQkJICAgIHVuc2lnbmVkIGxvbmcgZmQsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCi17Ci0Jc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKLQl1bnNpZ25lZCBsb25nIGVycm9yOwotCXN0cnVjdCBmaWxlICpmaWxlID0gTlVMTDsKLQotCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGZkKTsKLQkJaWYgKCFmaWxlKQotCQkJcmV0dXJuIC1FQkFERjsKLQl9Ci0KLQlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwotCWVycm9yID0gZG9fbW1hcF9wZ29mZihmaWxlLCBhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBwZ29mZik7Ci0JdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7Ci0KLQlpZiAoZmlsZSkKLQkJZnB1dChmaWxlKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KIGFzbWxpbmthZ2UgbG9uZyBzeXMzMl9vbGR1bmFtZShzdHJ1Y3Qgb2xkb2xkX3V0c25hbWUgX191c2VyICpuYW1lKQogewogCWNoYXIgKmFyY2ggPSAieDg2XzY0IjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BjaV94ODYuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BjaV94ODYuaAppbmRleCBiMzk5OTg4Li5iNGJmOWE5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wY2lfeDg2LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGNpX3g4Ni5oCkBAIC0xMTgsMTEgKzExOCwyNyBAQAogCiAvKiBwY2ktbW1jb25maWcuYyAqLwogCisvKiAiUENJIE1NQ09ORklHICUwNHggW2J1cyAlMDJ4LSUwMnhdIiAqLworI2RlZmluZSBQQ0lfTU1DRkdfUkVTT1VSQ0VfTkFNRV9MRU4gKDIyICsgNCArIDIgKyAyKQorCitzdHJ1Y3QgcGNpX21tY2ZnX3JlZ2lvbiB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCByZXNvdXJjZSByZXM7CisJdTY0IGFkZHJlc3M7CisJY2hhciBfX2lvbWVtICp2aXJ0OworCXUxNiBzZWdtZW50OworCXU4IHN0YXJ0X2J1czsKKwl1OCBlbmRfYnVzOworCWNoYXIgbmFtZVtQQ0lfTU1DRkdfUkVTT1VSQ0VfTkFNRV9MRU5dOworfTsKKwogZXh0ZXJuIGludCBfX2luaXQgcGNpX21tY2ZnX2FyY2hfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIF9faW5pdCBwY2lfbW1jZmdfYXJjaF9mcmVlKHZvaWQpOworZXh0ZXJuIHN0cnVjdCBwY2lfbW1jZmdfcmVnaW9uICpwY2lfbW1jb25maWdfbG9va3VwKGludCBzZWdtZW50LCBpbnQgYnVzKTsKIAotZXh0ZXJuIHN0cnVjdCBhY3BpX21jZmdfYWxsb2NhdGlvbiAqcGNpX21tY2ZnX2NvbmZpZzsKLWV4dGVybiBpbnQgcGNpX21tY2ZnX2NvbmZpZ19udW07CitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBwY2lfbW1jZmdfbGlzdDsKKworI2RlZmluZSBQQ0lfTU1DRkdfQlVTX09GRlNFVChidXMpICAgICAgKChidXMpIDw8IDIwKQogCiAvKgogICogQU1EIEZhbTEwaCBDUFVzIGFyZSBidWdneSwgYW5kIGNhbm5vdCBhY2Nlc3MgTU1JTyBjb25maWcgc3BhY2UKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BlcmNwdS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGVyY3B1LmgKaW5kZXggYjY1YTM2ZC4uMGM0NDE5NiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGVyY3B1LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGVyY3B1LmgKQEAgLTc0LDMxICs3NCwzMSBAQAogCiAjZGVmaW5lIHBlcmNwdV90b19vcChvcCwgdmFyLCB2YWwpCQkJXAogZG8gewkJCQkJCQlcCi0JdHlwZWRlZiB0eXBlb2YodmFyKSBUX187CQkJXAorCXR5cGVkZWYgdHlwZW9mKHZhcikgcHRvX1RfXzsJCQlcCiAJaWYgKDApIHsJCQkJCVwKLQkJVF9fIHRtcF9fOwkJCQlcCi0JCXRtcF9fID0gKHZhbCk7CQkJCVwKKwkJcHRvX1RfXyBwdG9fdG1wX187CQkJXAorCQlwdG9fdG1wX18gPSAodmFsKTsJCQlcCiAJfQkJCQkJCVwKIAlzd2l0Y2ggKHNpemVvZih2YXIpKSB7CQkJCVwKIAljYXNlIDE6CQkJCQkJXAogCQlhc20ob3AgImIgJTEsIl9fcGVyY3B1X2FyZygwKQkJXAogCQkgICAgOiAiK20iICh2YXIpCQkJXAotCQkgICAgOiAicWkiICgoVF9fKSh2YWwpKSk7CQlcCisJCSAgICA6ICJxaSIgKChwdG9fVF9fKSh2YWwpKSk7CQlcCiAJCWJyZWFrOwkJCQkJXAogCWNhc2UgMjoJCQkJCQlcCiAJCWFzbShvcCAidyAlMSwiX19wZXJjcHVfYXJnKDApCQlcCiAJCSAgICA6ICIrbSIgKHZhcikJCQlcCi0JCSAgICA6ICJyaSIgKChUX18pKHZhbCkpKTsJCVwKKwkJICAgIDogInJpIiAoKHB0b19UX18pKHZhbCkpKTsJCVwKIAkJYnJlYWs7CQkJCQlcCiAJY2FzZSA0OgkJCQkJCVwKIAkJYXNtKG9wICJsICUxLCJfX3BlcmNwdV9hcmcoMCkJCVwKIAkJICAgIDogIittIiAodmFyKQkJCVwKLQkJICAgIDogInJpIiAoKFRfXykodmFsKSkpOwkJXAorCQkgICAgOiAicmkiICgocHRvX1RfXykodmFsKSkpOwkJXAogCQlicmVhazsJCQkJCVwKIAljYXNlIDg6CQkJCQkJXAogCQlhc20ob3AgInEgJTEsIl9fcGVyY3B1X2FyZygwKQkJXAogCQkgICAgOiAiK20iICh2YXIpCQkJXAotCQkgICAgOiAicmUiICgoVF9fKSh2YWwpKSk7CQlcCisJCSAgICA6ICJyZSIgKChwdG9fVF9fKSh2YWwpKSk7CQlcCiAJCWJyZWFrOwkJCQkJXAogCWRlZmF1bHQ6IF9fYmFkX3BlcmNwdV9zaXplKCk7CQkJXAogCX0JCQkJCQlcCkBAIC0xMDYsMzEgKzEwNiwzMSBAQAogCiAjZGVmaW5lIHBlcmNwdV9mcm9tX29wKG9wLCB2YXIsIGNvbnN0cmFpbnQpCQlcCiAoewkJCQkJCQlcCi0JdHlwZW9mKHZhcikgcmV0X187CQkJCVwKKwl0eXBlb2YodmFyKSBwZm9fcmV0X187CQkJCVwKIAlzd2l0Y2ggKHNpemVvZih2YXIpKSB7CQkJCVwKIAljYXNlIDE6CQkJCQkJXAogCQlhc20ob3AgImIgIl9fcGVyY3B1X2FyZygxKSIsJTAiCQlcCi0JCSAgICA6ICI9cSIgKHJldF9fKQkJCVwKKwkJICAgIDogIj1xIiAocGZvX3JldF9fKQkJCVwKIAkJICAgIDogY29uc3RyYWludCk7CQkJXAogCQlicmVhazsJCQkJCVwKIAljYXNlIDI6CQkJCQkJXAogCQlhc20ob3AgIncgIl9fcGVyY3B1X2FyZygxKSIsJTAiCQlcCi0JCSAgICA6ICI9ciIgKHJldF9fKQkJCVwKKwkJICAgIDogIj1yIiAocGZvX3JldF9fKQkJCVwKIAkJICAgIDogY29uc3RyYWludCk7CQkJXAogCQlicmVhazsJCQkJCVwKIAljYXNlIDQ6CQkJCQkJXAogCQlhc20ob3AgImwgIl9fcGVyY3B1X2FyZygxKSIsJTAiCQlcCi0JCSAgICA6ICI9ciIgKHJldF9fKQkJCVwKKwkJICAgIDogIj1yIiAocGZvX3JldF9fKQkJCVwKIAkJICAgIDogY29uc3RyYWludCk7CQkJXAogCQlicmVhazsJCQkJCVwKIAljYXNlIDg6CQkJCQkJXAogCQlhc20ob3AgInEgIl9fcGVyY3B1X2FyZygxKSIsJTAiCQlcCi0JCSAgICA6ICI9ciIgKHJldF9fKQkJCVwKKwkJICAgIDogIj1yIiAocGZvX3JldF9fKQkJCVwKIAkJICAgIDogY29uc3RyYWludCk7CQkJXAogCQlicmVhazsJCQkJCVwKIAlkZWZhdWx0OiBfX2JhZF9wZXJjcHVfc2l6ZSgpOwkJCVwKIAl9CQkJCQkJXAotCXJldF9fOwkJCQkJCVwKKwlwZm9fcmV0X187CQkJCQlcCiB9KQogCiAvKgpAQCAtMTUzLDYgKzE1Myw4NCBAQAogI2RlZmluZSBwZXJjcHVfb3IodmFyLCB2YWwpCXBlcmNwdV90b19vcCgib3IiLCBwZXJfY3B1X18jI3ZhciwgdmFsKQogI2RlZmluZSBwZXJjcHVfeG9yKHZhciwgdmFsKQlwZXJjcHVfdG9fb3AoInhvciIsIHBlcl9jcHVfXyMjdmFyLCB2YWwpCiAKKyNkZWZpbmUgX190aGlzX2NwdV9yZWFkXzEocGNwKQkJcGVyY3B1X2Zyb21fb3AoIm1vdiIsIChwY3ApLCAibSIocGNwKSkKKyNkZWZpbmUgX190aGlzX2NwdV9yZWFkXzIocGNwKQkJcGVyY3B1X2Zyb21fb3AoIm1vdiIsIChwY3ApLCAibSIocGNwKSkKKyNkZWZpbmUgX190aGlzX2NwdV9yZWFkXzQocGNwKQkJcGVyY3B1X2Zyb21fb3AoIm1vdiIsIChwY3ApLCAibSIocGNwKSkKKworI2RlZmluZSBfX3RoaXNfY3B1X3dyaXRlXzEocGNwLCB2YWwpCXBlcmNwdV90b19vcCgibW92IiwgKHBjcCksIHZhbCkKKyNkZWZpbmUgX190aGlzX2NwdV93cml0ZV8yKHBjcCwgdmFsKQlwZXJjcHVfdG9fb3AoIm1vdiIsIChwY3ApLCB2YWwpCisjZGVmaW5lIF9fdGhpc19jcHVfd3JpdGVfNChwY3AsIHZhbCkJcGVyY3B1X3RvX29wKCJtb3YiLCAocGNwKSwgdmFsKQorI2RlZmluZSBfX3RoaXNfY3B1X2FkZF8xKHBjcCwgdmFsKQlwZXJjcHVfdG9fb3AoImFkZCIsIChwY3ApLCB2YWwpCisjZGVmaW5lIF9fdGhpc19jcHVfYWRkXzIocGNwLCB2YWwpCXBlcmNwdV90b19vcCgiYWRkIiwgKHBjcCksIHZhbCkKKyNkZWZpbmUgX190aGlzX2NwdV9hZGRfNChwY3AsIHZhbCkJcGVyY3B1X3RvX29wKCJhZGQiLCAocGNwKSwgdmFsKQorI2RlZmluZSBfX3RoaXNfY3B1X2FuZF8xKHBjcCwgdmFsKQlwZXJjcHVfdG9fb3AoImFuZCIsIChwY3ApLCB2YWwpCisjZGVmaW5lIF9fdGhpc19jcHVfYW5kXzIocGNwLCB2YWwpCXBlcmNwdV90b19vcCgiYW5kIiwgKHBjcCksIHZhbCkKKyNkZWZpbmUgX190aGlzX2NwdV9hbmRfNChwY3AsIHZhbCkJcGVyY3B1X3RvX29wKCJhbmQiLCAocGNwKSwgdmFsKQorI2RlZmluZSBfX3RoaXNfY3B1X29yXzEocGNwLCB2YWwpCXBlcmNwdV90b19vcCgib3IiLCAocGNwKSwgdmFsKQorI2RlZmluZSBfX3RoaXNfY3B1X29yXzIocGNwLCB2YWwpCXBlcmNwdV90b19vcCgib3IiLCAocGNwKSwgdmFsKQorI2RlZmluZSBfX3RoaXNfY3B1X29yXzQocGNwLCB2YWwpCXBlcmNwdV90b19vcCgib3IiLCAocGNwKSwgdmFsKQorI2RlZmluZSBfX3RoaXNfY3B1X3hvcl8xKHBjcCwgdmFsKQlwZXJjcHVfdG9fb3AoInhvciIsIChwY3ApLCB2YWwpCisjZGVmaW5lIF9fdGhpc19jcHVfeG9yXzIocGNwLCB2YWwpCXBlcmNwdV90b19vcCgieG9yIiwgKHBjcCksIHZhbCkKKyNkZWZpbmUgX190aGlzX2NwdV94b3JfNChwY3AsIHZhbCkJcGVyY3B1X3RvX29wKCJ4b3IiLCAocGNwKSwgdmFsKQorCisjZGVmaW5lIHRoaXNfY3B1X3JlYWRfMShwY3ApCQlwZXJjcHVfZnJvbV9vcCgibW92IiwgKHBjcCksICJtIihwY3ApKQorI2RlZmluZSB0aGlzX2NwdV9yZWFkXzIocGNwKQkJcGVyY3B1X2Zyb21fb3AoIm1vdiIsIChwY3ApLCAibSIocGNwKSkKKyNkZWZpbmUgdGhpc19jcHVfcmVhZF80KHBjcCkJCXBlcmNwdV9mcm9tX29wKCJtb3YiLCAocGNwKSwgIm0iKHBjcCkpCisjZGVmaW5lIHRoaXNfY3B1X3dyaXRlXzEocGNwLCB2YWwpCXBlcmNwdV90b19vcCgibW92IiwgKHBjcCksIHZhbCkKKyNkZWZpbmUgdGhpc19jcHVfd3JpdGVfMihwY3AsIHZhbCkJcGVyY3B1X3RvX29wKCJtb3YiLCAocGNwKSwgdmFsKQorI2RlZmluZSB0aGlzX2NwdV93cml0ZV80KHBjcCwgdmFsKQlwZXJjcHVfdG9fb3AoIm1vdiIsIChwY3ApLCB2YWwpCisjZGVmaW5lIHRoaXNfY3B1X2FkZF8xKHBjcCwgdmFsKQlwZXJjcHVfdG9fb3AoImFkZCIsIChwY3ApLCB2YWwpCisjZGVmaW5lIHRoaXNfY3B1X2FkZF8yKHBjcCwgdmFsKQlwZXJjcHVfdG9fb3AoImFkZCIsIChwY3ApLCB2YWwpCisjZGVmaW5lIHRoaXNfY3B1X2FkZF80KHBjcCwgdmFsKQlwZXJjcHVfdG9fb3AoImFkZCIsIChwY3ApLCB2YWwpCisjZGVmaW5lIHRoaXNfY3B1X2FuZF8xKHBjcCwgdmFsKQlwZXJjcHVfdG9fb3AoImFuZCIsIChwY3ApLCB2YWwpCisjZGVmaW5lIHRoaXNfY3B1X2FuZF8yKHBjcCwgdmFsKQlwZXJjcHVfdG9fb3AoImFuZCIsIChwY3ApLCB2YWwpCisjZGVmaW5lIHRoaXNfY3B1X2FuZF80KHBjcCwgdmFsKQlwZXJjcHVfdG9fb3AoImFuZCIsIChwY3ApLCB2YWwpCisjZGVmaW5lIHRoaXNfY3B1X29yXzEocGNwLCB2YWwpCQlwZXJjcHVfdG9fb3AoIm9yIiwgKHBjcCksIHZhbCkKKyNkZWZpbmUgdGhpc19jcHVfb3JfMihwY3AsIHZhbCkJCXBlcmNwdV90b19vcCgib3IiLCAocGNwKSwgdmFsKQorI2RlZmluZSB0aGlzX2NwdV9vcl80KHBjcCwgdmFsKQkJcGVyY3B1X3RvX29wKCJvciIsIChwY3ApLCB2YWwpCisjZGVmaW5lIHRoaXNfY3B1X3hvcl8xKHBjcCwgdmFsKQlwZXJjcHVfdG9fb3AoInhvciIsIChwY3ApLCB2YWwpCisjZGVmaW5lIHRoaXNfY3B1X3hvcl8yKHBjcCwgdmFsKQlwZXJjcHVfdG9fb3AoInhvciIsIChwY3ApLCB2YWwpCisjZGVmaW5lIHRoaXNfY3B1X3hvcl80KHBjcCwgdmFsKQlwZXJjcHVfdG9fb3AoInhvciIsIChwY3ApLCB2YWwpCisKKyNkZWZpbmUgaXJxc2FmZV9jcHVfYWRkXzEocGNwLCB2YWwpCXBlcmNwdV90b19vcCgiYWRkIiwgKHBjcCksIHZhbCkKKyNkZWZpbmUgaXJxc2FmZV9jcHVfYWRkXzIocGNwLCB2YWwpCXBlcmNwdV90b19vcCgiYWRkIiwgKHBjcCksIHZhbCkKKyNkZWZpbmUgaXJxc2FmZV9jcHVfYWRkXzQocGNwLCB2YWwpCXBlcmNwdV90b19vcCgiYWRkIiwgKHBjcCksIHZhbCkKKyNkZWZpbmUgaXJxc2FmZV9jcHVfYW5kXzEocGNwLCB2YWwpCXBlcmNwdV90b19vcCgiYW5kIiwgKHBjcCksIHZhbCkKKyNkZWZpbmUgaXJxc2FmZV9jcHVfYW5kXzIocGNwLCB2YWwpCXBlcmNwdV90b19vcCgiYW5kIiwgKHBjcCksIHZhbCkKKyNkZWZpbmUgaXJxc2FmZV9jcHVfYW5kXzQocGNwLCB2YWwpCXBlcmNwdV90b19vcCgiYW5kIiwgKHBjcCksIHZhbCkKKyNkZWZpbmUgaXJxc2FmZV9jcHVfb3JfMShwY3AsIHZhbCkJcGVyY3B1X3RvX29wKCJvciIsIChwY3ApLCB2YWwpCisjZGVmaW5lIGlycXNhZmVfY3B1X29yXzIocGNwLCB2YWwpCXBlcmNwdV90b19vcCgib3IiLCAocGNwKSwgdmFsKQorI2RlZmluZSBpcnFzYWZlX2NwdV9vcl80KHBjcCwgdmFsKQlwZXJjcHVfdG9fb3AoIm9yIiwgKHBjcCksIHZhbCkKKyNkZWZpbmUgaXJxc2FmZV9jcHVfeG9yXzEocGNwLCB2YWwpCXBlcmNwdV90b19vcCgieG9yIiwgKHBjcCksIHZhbCkKKyNkZWZpbmUgaXJxc2FmZV9jcHVfeG9yXzIocGNwLCB2YWwpCXBlcmNwdV90b19vcCgieG9yIiwgKHBjcCksIHZhbCkKKyNkZWZpbmUgaXJxc2FmZV9jcHVfeG9yXzQocGNwLCB2YWwpCXBlcmNwdV90b19vcCgieG9yIiwgKHBjcCksIHZhbCkKKworLyoKKyAqIFBlciBjcHUgYXRvbWljIDY0IGJpdCBvcGVyYXRpb25zIGFyZSBvbmx5IGF2YWlsYWJsZSB1bmRlciA2NCBiaXQuCisgKiAzMiBiaXQgbXVzdCBmYWxsIGJhY2sgdG8gZ2VuZXJpYyBvcGVyYXRpb25zLgorICovCisjaWZkZWYgQ09ORklHX1g4Nl82NAorI2RlZmluZSBfX3RoaXNfY3B1X3JlYWRfOChwY3ApCQlwZXJjcHVfZnJvbV9vcCgibW92IiwgKHBjcCksICJtIihwY3ApKQorI2RlZmluZSBfX3RoaXNfY3B1X3dyaXRlXzgocGNwLCB2YWwpCXBlcmNwdV90b19vcCgibW92IiwgKHBjcCksIHZhbCkKKyNkZWZpbmUgX190aGlzX2NwdV9hZGRfOChwY3AsIHZhbCkJcGVyY3B1X3RvX29wKCJhZGQiLCAocGNwKSwgdmFsKQorI2RlZmluZSBfX3RoaXNfY3B1X2FuZF84KHBjcCwgdmFsKQlwZXJjcHVfdG9fb3AoImFuZCIsIChwY3ApLCB2YWwpCisjZGVmaW5lIF9fdGhpc19jcHVfb3JfOChwY3AsIHZhbCkJcGVyY3B1X3RvX29wKCJvciIsIChwY3ApLCB2YWwpCisjZGVmaW5lIF9fdGhpc19jcHVfeG9yXzgocGNwLCB2YWwpCXBlcmNwdV90b19vcCgieG9yIiwgKHBjcCksIHZhbCkKKworI2RlZmluZSB0aGlzX2NwdV9yZWFkXzgocGNwKQkJcGVyY3B1X2Zyb21fb3AoIm1vdiIsIChwY3ApLCAibSIocGNwKSkKKyNkZWZpbmUgdGhpc19jcHVfd3JpdGVfOChwY3AsIHZhbCkJcGVyY3B1X3RvX29wKCJtb3YiLCAocGNwKSwgdmFsKQorI2RlZmluZSB0aGlzX2NwdV9hZGRfOChwY3AsIHZhbCkJcGVyY3B1X3RvX29wKCJhZGQiLCAocGNwKSwgdmFsKQorI2RlZmluZSB0aGlzX2NwdV9hbmRfOChwY3AsIHZhbCkJcGVyY3B1X3RvX29wKCJhbmQiLCAocGNwKSwgdmFsKQorI2RlZmluZSB0aGlzX2NwdV9vcl84KHBjcCwgdmFsKQkJcGVyY3B1X3RvX29wKCJvciIsIChwY3ApLCB2YWwpCisjZGVmaW5lIHRoaXNfY3B1X3hvcl84KHBjcCwgdmFsKQlwZXJjcHVfdG9fb3AoInhvciIsIChwY3ApLCB2YWwpCisKKyNkZWZpbmUgaXJxc2FmZV9jcHVfYWRkXzgocGNwLCB2YWwpCXBlcmNwdV90b19vcCgiYWRkIiwgKHBjcCksIHZhbCkKKyNkZWZpbmUgaXJxc2FmZV9jcHVfYW5kXzgocGNwLCB2YWwpCXBlcmNwdV90b19vcCgiYW5kIiwgKHBjcCksIHZhbCkKKyNkZWZpbmUgaXJxc2FmZV9jcHVfb3JfOChwY3AsIHZhbCkJcGVyY3B1X3RvX29wKCJvciIsIChwY3ApLCB2YWwpCisjZGVmaW5lIGlycXNhZmVfY3B1X3hvcl84KHBjcCwgdmFsKQlwZXJjcHVfdG9fb3AoInhvciIsIChwY3ApLCB2YWwpCisKKyNlbmRpZgorCiAvKiBUaGlzIGlzIG5vdCBhdG9taWMgYWdhaW5zdCBvdGhlciBDUFVzIC0tIENQVSBwcmVlbXB0aW9uIG5lZWRzIHRvIGJlIG9mZiAqLwogI2RlZmluZSB4ODZfdGVzdF9hbmRfY2xlYXJfYml0X3BlcmNwdShiaXQsIHZhcikJCQkJXAogKHsJCQkJCQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zeXNfaWEzMi5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3lzX2lhMzIuaAppbmRleCA5YWY5ZGVjLi40YTVhMDg5ZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3lzX2lhMzIuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zeXNfaWEzMi5oCkBAIC01Nyw5ICs1Nyw2IEBACiBhc21saW5rYWdlIGxvbmcgc3lzMzJfcGVyc29uYWxpdHkodW5zaWduZWQgbG9uZyk7CiBhc21saW5rYWdlIGxvbmcgc3lzMzJfc2VuZGZpbGUoaW50LCBpbnQsIGNvbXBhdF9vZmZfdCBfX3VzZXIgKiwgczMyKTsKIAotYXNtbGlua2FnZSBsb25nIHN5czMyX21tYXAyKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsCi0JCQkgICAgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7Ci0KIHN0cnVjdCBvbGRvbGRfdXRzbmFtZTsKIHN0cnVjdCBvbGRfdXRzbmFtZTsKIGFzbWxpbmthZ2UgbG9uZyBzeXMzMl9vbGR1bmFtZShzdHJ1Y3Qgb2xkb2xkX3V0c25hbWUgX191c2VyICopOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3lzY2FsbHMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N5c2NhbGxzLmgKaW5kZXggMzcyYjc2ZS4uMWJiNmUzOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3lzY2FsbHMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zeXNjYWxscy5oCkBAIC01NSw4ICs1NSw2IEBACiBzdHJ1Y3Qgb2xkb2xkX3V0c25hbWU7CiBzdHJ1Y3Qgb2xkX3V0c25hbWU7CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfbW1hcDIodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywKLQkJCSAgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CiBhc21saW5rYWdlIGludCBvbGRfbW1hcChzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0IF9fdXNlciAqKTsKIGFzbWxpbmthZ2UgaW50IG9sZF9zZWxlY3Qoc3RydWN0IHNlbF9hcmdfc3RydWN0IF9fdXNlciAqKTsKIGFzbWxpbmthZ2UgaW50IHN5c19pcGModWludCwgaW50LCBpbnQsIGludCwgdm9pZCBfX3VzZXIgKiwgbG9uZyk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94ZW4vaHlwZXJ2aXNvci5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL2h5cGVydmlzb3IuaAppbmRleCBkNWI3ZTkwLi4zOTZmZjRjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94ZW4vaHlwZXJ2aXNvci5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hlbi9oeXBlcnZpc29yLmgKQEAgLTM3LDMxICszNyw0IEBACiBleHRlcm4gc3RydWN0IHNoYXJlZF9pbmZvICpIWVBFUlZJU09SX3NoYXJlZF9pbmZvOwogZXh0ZXJuIHN0cnVjdCBzdGFydF9pbmZvICp4ZW5fc3RhcnRfaW5mbzsKIAotZW51bSB4ZW5fZG9tYWluX3R5cGUgewotCVhFTl9OQVRJVkUsCQkvKiBydW5uaW5nIG9uIGJhcmUgaGFyZHdhcmUgICAgKi8KLQlYRU5fUFZfRE9NQUlOLAkJLyogcnVubmluZyBpbiBhIFBWIGRvbWFpbiAgICAgICovCi0JWEVOX0hWTV9ET01BSU4sCQkvKiBydW5uaW5nIGluIGEgWGVuIGh2bSBkb21haW4gKi8KLX07Ci0KLSNpZmRlZiBDT05GSUdfWEVOCi1leHRlcm4gZW51bSB4ZW5fZG9tYWluX3R5cGUgeGVuX2RvbWFpbl90eXBlOwotI2Vsc2UKLSNkZWZpbmUgeGVuX2RvbWFpbl90eXBlCQlYRU5fTkFUSVZFCi0jZW5kaWYKLQotI2RlZmluZSB4ZW5fZG9tYWluKCkJCSh4ZW5fZG9tYWluX3R5cGUgIT0gWEVOX05BVElWRSkKLSNkZWZpbmUgeGVuX3B2X2RvbWFpbigpCQkoeGVuX2RvbWFpbigpICYmCQkJXAotCQkJCSB4ZW5fZG9tYWluX3R5cGUgPT0gWEVOX1BWX0RPTUFJTikKLSNkZWZpbmUgeGVuX2h2bV9kb21haW4oKQkoeGVuX2RvbWFpbigpICYmCQkJXAotCQkJCSB4ZW5fZG9tYWluX3R5cGUgPT0gWEVOX0hWTV9ET01BSU4pCi0KLSNpZmRlZiBDT05GSUdfWEVOX0RPTTAKLSNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3hlbi5oPgotCi0jZGVmaW5lIHhlbl9pbml0aWFsX2RvbWFpbigpCSh4ZW5fcHZfZG9tYWluKCkgJiYgXAotCQkJCSB4ZW5fc3RhcnRfaW5mby0+ZmxhZ3MgJiBTSUZfSU5JVERPTUFJTikKLSNlbHNlICAvKiAhQ09ORklHX1hFTl9ET00wICovCi0jZGVmaW5lIHhlbl9pbml0aWFsX2RvbWFpbigpCSgwKQotI2VuZGlmCS8qIENPTkZJR19YRU5fRE9NMCAqLwotCiAjZW5kaWYgLyogX0FTTV9YODZfWEVOX0hZUEVSVklTT1JfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdV9pbml0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11X2luaXQuYwppbmRleCAzMDlhNTJmLi4xZGNhOWMzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11X2luaXQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11X2luaXQuYwpAQCAtMTM0NSw2ICsxMzQ1LDkgQEAKIAkJaW9tbXVfZGV0ZWN0ZWQgPSAxOwogCQlhbWRfaW9tbXVfZGV0ZWN0ZWQgPSAxOwogCQl4ODZfaW5pdC5pb21tdS5pb21tdV9pbml0ID0gYW1kX2lvbW11X2luaXQ7CisKKwkJLyogTWFrZSBzdXJlIEFDUyB3aWxsIGJlIGVuYWJsZWQgKi8KKwkJcGNpX3JlcXVlc3RfYWNzKCk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9ubWkuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL25taS5jCmluZGV4IDYzODk0MzIuLjAxNTlhNjkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL25taS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL25taS5jCkBAIC0zNjEsNyArMzYxLDcgQEAKICAqLwogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQsIGxhc3RfaXJxX3N1bSk7Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUobG9jYWxfdCwgYWxlcnRfY291bnRlcik7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUobG9uZywgYWxlcnRfY291bnRlcik7CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBubWlfdG91Y2gpOwogCiB2b2lkIHRvdWNoX25taV93YXRjaGRvZyh2b2lkKQpAQCAtNDM4LDggKzQzOCw4IEBACiAJCSAqIEF5aWVlLCBsb29rcyBsaWtlIHRoaXMgQ1BVIGlzIHN0dWNrIC4uLgogCQkgKiB3YWl0IGEgZmV3IElSUXMgKDUgc2Vjb25kcykgYmVmb3JlIGRvaW5nIHRoZSBvb3BzIC4uLgogCQkgKi8KLQkJbG9jYWxfaW5jKCZfX2dldF9jcHVfdmFyKGFsZXJ0X2NvdW50ZXIpKTsKLQkJaWYgKGxvY2FsX3JlYWQoJl9fZ2V0X2NwdV92YXIoYWxlcnRfY291bnRlcikpID09IDUgKiBubWlfaHopCisJCV9fdGhpc19jcHVfaW5jKHBlcl9jcHVfdmFyKGFsZXJ0X2NvdW50ZXIpKTsKKwkJaWYgKF9fdGhpc19jcHVfcmVhZChwZXJfY3B1X3ZhcihhbGVydF9jb3VudGVyKSkgPT0gNSAqIG5taV9oeikKIAkJCS8qCiAJCQkgKiBkaWVfbm1pIHdpbGwgcmV0dXJuIE9OTFkgaWYgTk9USUZZX1NUT1AgaGFwcGVucy4uCiAJCQkgKi8KQEAgLTQ0Nyw3ICs0NDcsNyBAQAogCQkJCXJlZ3MsIHBhbmljX29uX3RpbWVvdXQpOwogCX0gZWxzZSB7CiAJCV9fZ2V0X2NwdV92YXIobGFzdF9pcnFfc3VtKSA9IHN1bTsKLQkJbG9jYWxfc2V0KCZfX2dldF9jcHVfdmFyKGFsZXJ0X2NvdW50ZXIpLCAwKTsKKwkJX190aGlzX2NwdV93cml0ZShwZXJfY3B1X3ZhcihhbGVydF9jb3VudGVyKSwgMCk7CiAJfQogCiAJLyogc2VlIGlmIHRoZSBubWkgd2F0Y2hkb2cgd2VudCBvZmYgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY29tbW9uLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jCmluZGV4IDBlZTlhMzIuLjQ4NjhlNGEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY29tbW9uLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb24uYwpAQCAtMTA5NSw3ICsxMDk1LDcgQEAKIAogdm9pZCBfX2NwdWluaXQgY3B1X2luaXQodm9pZCkKIHsKLQlzdHJ1Y3Qgb3JpZ19pc3QgKm9yaWdfaXN0OworCXN0cnVjdCBvcmlnX2lzdCAqb2lzdDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm1lOwogCXN0cnVjdCB0c3Nfc3RydWN0ICp0OwogCXVuc2lnbmVkIGxvbmcgdjsKQEAgLTExMDQsNyArMTEwNCw3IEBACiAKIAljcHUgPSBzdGFja19zbXBfcHJvY2Vzc29yX2lkKCk7CiAJdCA9ICZwZXJfY3B1KGluaXRfdHNzLCBjcHUpOwotCW9yaWdfaXN0ID0gJnBlcl9jcHUob3JpZ19pc3QsIGNwdSk7CisJb2lzdCA9ICZwZXJfY3B1KG9yaWdfaXN0LCBjcHUpOwogCiAjaWZkZWYgQ09ORklHX05VTUEKIAlpZiAoY3B1ICE9IDAgJiYgcGVyY3B1X3JlYWQobm9kZV9udW1iZXIpID09IDAgJiYKQEAgLTExNDUsMTIgKzExNDUsMTIgQEAKIAkvKgogCSAqIHNldCB1cCBhbmQgbG9hZCB0aGUgcGVyLUNQVSBUU1MKIAkgKi8KLQlpZiAoIW9yaWdfaXN0LT5pc3RbMF0pIHsKKwlpZiAoIW9pc3QtPmlzdFswXSkgewogCQljaGFyICplc3RhY2tzID0gcGVyX2NwdShleGNlcHRpb25fc3RhY2tzLCBjcHUpOwogCiAJCWZvciAodiA9IDA7IHYgPCBOX0VYQ0VQVElPTl9TVEFDS1M7IHYrKykgewogCQkJZXN0YWNrcyArPSBleGNlcHRpb25fc3RhY2tfc2l6ZXNbdl07Ci0JCQlvcmlnX2lzdC0+aXN0W3ZdID0gdC0+eDg2X3Rzcy5pc3Rbdl0gPQorCQkJb2lzdC0+aXN0W3ZdID0gdC0+eDg2X3Rzcy5pc3Rbdl0gPQogCQkJCQkodW5zaWduZWQgbG9uZyllc3RhY2tzOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVfZGVidWcuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1X2RlYnVnLmMKaW5kZXggZGNhMzI1Yy4uYjM2OGNkOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVfZGVidWcuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdV9kZWJ1Zy5jCkBAIC0zMCw5ICszMCw5IEBACiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KICNpbmNsdWRlIDxhc20vZGVzYy5oPgogCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGNwdV9jcHVYX2Jhc2UgW0NQVV9SRUdfQUxMX0JJVF0sIGNwdV9hcnIpOwotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHVfcHJpdmF0ZSAqIFtNQVhfQ1BVX0ZJTEVTXSwgcHJpdl9hcnIpOwotc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgY3B1X3ByaXZfY291bnQpOworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHVfY3B1WF9iYXNlIFtDUFVfUkVHX0FMTF9CSVRdLCBjcHVkX2Fycik7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGNwdV9wcml2YXRlICogW01BWF9DUFVfRklMRVNdLCBjcHVkX3ByaXZfYXJyKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIGNwdWRfcHJpdl9jb3VudCk7CiAKIHN0YXRpYyBERUZJTkVfTVVURVgoY3B1X2RlYnVnX2xvY2spOwogCkBAIC01MzEsNyArNTMxLDcgQEAKIAogCS8qIEFscmVhZHkgaW50aWFsaXplZCAqLwogCWlmIChmaWxlID09IENQVV9JTkRFWF9CSVQpCi0JCWlmIChwZXJfY3B1KGNwdV9hcnJbdHlwZV0uaW5pdCwgY3B1KSkKKwkJaWYgKHBlcl9jcHUoY3B1ZF9hcnJbdHlwZV0uaW5pdCwgY3B1KSkKIAkJCXJldHVybiAwOwogCiAJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CkBAIC01NDMsOCArNTQzLDggQEAKIAlwcml2LT5yZWcgPSByZWc7CiAJcHJpdi0+ZmlsZSA9IGZpbGU7CiAJbXV0ZXhfbG9jaygmY3B1X2RlYnVnX2xvY2spOwotCXBlcl9jcHUocHJpdl9hcnJbdHlwZV0sIGNwdSkgPSBwcml2OwotCXBlcl9jcHUoY3B1X3ByaXZfY291bnQsIGNwdSkrKzsKKwlwZXJfY3B1KGNwdWRfcHJpdl9hcnJbdHlwZV0sIGNwdSkgPSBwcml2OworCXBlcl9jcHUoY3B1ZF9wcml2X2NvdW50LCBjcHUpKys7CiAJbXV0ZXhfdW5sb2NrKCZjcHVfZGVidWdfbG9jayk7CiAKIAlpZiAoZmlsZSkKQEAgLTU1MiwxMCArNTUyLDEwIEBACiAJCQkJICAgIGRlbnRyeSwgKHZvaWQgKilwcml2LCAmY3B1X2ZvcHMpOwogCWVsc2UgewogCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGNwdV9iYXNlW3R5cGVdLm5hbWUsIFNfSVJVR08sCi0JCQkJICAgIHBlcl9jcHUoY3B1X2Fyclt0eXBlXS5kZW50cnksIGNwdSksCisJCQkJICAgIHBlcl9jcHUoY3B1ZF9hcnJbdHlwZV0uZGVudHJ5LCBjcHUpLAogCQkJCSAgICAodm9pZCAqKXByaXYsICZjcHVfZm9wcyk7CiAJCW11dGV4X2xvY2soJmNwdV9kZWJ1Z19sb2NrKTsKLQkJcGVyX2NwdShjcHVfYXJyW3R5cGVdLmluaXQsIGNwdSkgPSAxOworCQlwZXJfY3B1KGNwdWRfYXJyW3R5cGVdLmluaXQsIGNwdSkgPSAxOwogCQltdXRleF91bmxvY2soJmNwdV9kZWJ1Z19sb2NrKTsKIAl9CiAKQEAgLTYxNSw3ICs2MTUsNyBAQAogCQlpZiAoIWlzX3R5cGVmbGFnX3ZhbGlkKGNwdSwgY3B1X2Jhc2VbdHlwZV0uZmxhZykpCiAJCQljb250aW51ZTsKIAkJY3B1X2RlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2RpcihjcHVfYmFzZVt0eXBlXS5uYW1lLCBkZW50cnkpOwotCQlwZXJfY3B1KGNwdV9hcnJbdHlwZV0uZGVudHJ5LCBjcHUpID0gY3B1X2RlbnRyeTsKKwkJcGVyX2NwdShjcHVkX2Fyclt0eXBlXS5kZW50cnksIGNwdSkgPSBjcHVfZGVudHJ5OwogCiAJCWlmICh0eXBlIDwgQ1BVX1RTU19CSVQpCiAJCQllcnIgPSBjcHVfaW5pdF9tc3IoY3B1LCB0eXBlLCBjcHVfZGVudHJ5KTsKQEAgLTY0NywxMSArNjQ3LDExIEBACiAJCWVyciA9IGNwdV9pbml0X2FsbHJlZyhjcHUsIGNwdV9kZW50cnkpOwogCiAJCXByX2luZm8oImNwdSVkKCVkKSBkZWJ1ZyBmaWxlcyAlZFxuIiwKLQkJCWNwdSwgbnJfY3B1X2lkcywgcGVyX2NwdShjcHVfcHJpdl9jb3VudCwgY3B1KSk7Ci0JCWlmIChwZXJfY3B1KGNwdV9wcml2X2NvdW50LCBjcHUpID4gTUFYX0NQVV9GSUxFUykgeworCQkJY3B1LCBucl9jcHVfaWRzLCBwZXJfY3B1KGNwdWRfcHJpdl9jb3VudCwgY3B1KSk7CisJCWlmIChwZXJfY3B1KGNwdWRfcHJpdl9jb3VudCwgY3B1KSA+IE1BWF9DUFVfRklMRVMpIHsKIAkJCXByX2VycigiUmVnaXN0ZXIgZmlsZXMgY291bnQgJWQgZXhjZWVkcyBsaW1pdCAlZFxuIiwKLQkJCQlwZXJfY3B1KGNwdV9wcml2X2NvdW50LCBjcHUpLCBNQVhfQ1BVX0ZJTEVTKTsKLQkJCXBlcl9jcHUoY3B1X3ByaXZfY291bnQsIGNwdSkgPSBNQVhfQ1BVX0ZJTEVTOworCQkJCXBlcl9jcHUoY3B1ZF9wcml2X2NvdW50LCBjcHUpLCBNQVhfQ1BVX0ZJTEVTKTsKKwkJCXBlcl9jcHUoY3B1ZF9wcml2X2NvdW50LCBjcHUpID0gTUFYX0NQVV9GSUxFUzsKIAkJCWVyciA9IC1FTkZJTEU7CiAJCX0KIAkJaWYgKGVycikKQEAgLTY3Niw4ICs2NzYsOCBAQAogCQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoY3B1X2RlYnVnZnNfZGlyKTsKIAogCWZvciAoY3B1ID0gMDsgY3B1IDwgIG5yX2NwdV9pZHM7IGNwdSsrKQotCQlmb3IgKGkgPSAwOyBpIDwgcGVyX2NwdShjcHVfcHJpdl9jb3VudCwgY3B1KTsgaSsrKQotCQkJa2ZyZWUocGVyX2NwdShwcml2X2FycltpXSwgY3B1KSk7CisJCWZvciAoaSA9IDA7IGkgPCBwZXJfY3B1KGNwdWRfcHJpdl9jb3VudCwgY3B1KTsgaSsrKQorCQkJa2ZyZWUocGVyX2NwdShjcHVkX3ByaXZfYXJyW2ldLCBjcHUpKTsKIH0KIAogbW9kdWxlX2luaXQoY3B1X2RlYnVnX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jCmluZGV4IDhiNTgxZDMuLmYyOGRlY2YgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKQEAgLTY4LDkgKzY4LDkgQEAKIAl1bnNpZ25lZCBpbnQgY3B1X2ZlYXR1cmU7CiB9OwogCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGFjcGlfY3B1ZnJlcV9kYXRhICosIGRydl9kYXRhKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgYWNwaV9jcHVmcmVxX2RhdGEgKiwgYWNmcmVxX2RhdGEpOwogCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGFwZXJmbXBlcmYsIG9sZF9wZXJmKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgYXBlcmZtcGVyZiwgYWNmcmVxX29sZF9wZXJmKTsKIAogLyogYWNwaV9wZXJmX2RhdGEgaXMgYSBwb2ludGVyIHRvIHBlcmNwdSBkYXRhLiAqLwogc3RhdGljIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSAqYWNwaV9wZXJmX2RhdGE7CkBAIC0yMTQsMTQgKzIxNCwxNCBAQAogCWlmICh1bmxpa2VseShjcHVtYXNrX2VtcHR5KG1hc2spKSkKIAkJcmV0dXJuIDA7CiAKLQlzd2l0Y2ggKHBlcl9jcHUoZHJ2X2RhdGEsIGNwdW1hc2tfZmlyc3QobWFzaykpLT5jcHVfZmVhdHVyZSkgeworCXN3aXRjaCAocGVyX2NwdShhY2ZyZXFfZGF0YSwgY3B1bWFza19maXJzdChtYXNrKSktPmNwdV9mZWF0dXJlKSB7CiAJY2FzZSBTWVNURU1fSU5URUxfTVNSX0NBUEFCTEU6CiAJCWNtZC50eXBlID0gU1lTVEVNX0lOVEVMX01TUl9DQVBBQkxFOwogCQljbWQuYWRkci5tc3IucmVnID0gTVNSX0lBMzJfUEVSRl9TVEFUVVM7CiAJCWJyZWFrOwogCWNhc2UgU1lTVEVNX0lPX0NBUEFCTEU6CiAJCWNtZC50eXBlID0gU1lTVEVNX0lPX0NBUEFCTEU7Ci0JCXBlcmYgPSBwZXJfY3B1KGRydl9kYXRhLCBjcHVtYXNrX2ZpcnN0KG1hc2spKS0+YWNwaV9kYXRhOworCQlwZXJmID0gcGVyX2NwdShhY2ZyZXFfZGF0YSwgY3B1bWFza19maXJzdChtYXNrKSktPmFjcGlfZGF0YTsKIAkJY21kLmFkZHIuaW8ucG9ydCA9IHBlcmYtPmNvbnRyb2xfcmVnaXN0ZXIuYWRkcmVzczsKIAkJY21kLmFkZHIuaW8uYml0X3dpZHRoID0gcGVyZi0+Y29udHJvbF9yZWdpc3Rlci5iaXRfd2lkdGg7CiAJCWJyZWFrOwpAQCAtMjY4LDggKzI2OCw4IEBACiAJaWYgKHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIHJlYWRfbWVhc3VyZWRfcGVyZl9jdHJzLCAmcGVyZiwgMSkpCiAJCXJldHVybiAwOwogCi0JcmF0aW8gPSBjYWxjX2FwZXJmbXBlcmZfcmF0aW8oJnBlcl9jcHUob2xkX3BlcmYsIGNwdSksICZwZXJmKTsKLQlwZXJfY3B1KG9sZF9wZXJmLCBjcHUpID0gcGVyZjsKKwlyYXRpbyA9IGNhbGNfYXBlcmZtcGVyZl9yYXRpbygmcGVyX2NwdShhY2ZyZXFfb2xkX3BlcmYsIGNwdSksICZwZXJmKTsKKwlwZXJfY3B1KGFjZnJlcV9vbGRfcGVyZiwgY3B1KSA9IHBlcmY7CiAKIAlyZXR2YWwgPSAocG9saWN5LT5jcHVpbmZvLm1heF9mcmVxICogcmF0aW8pID4+IEFQRVJGTVBFUkZfU0hJRlQ7CiAKQEAgLTI3OCw3ICsyNzgsNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IGdldF9jdXJfZnJlcV9vbl9jcHUodW5zaWduZWQgaW50IGNwdSkKIHsKLQlzdHJ1Y3QgYWNwaV9jcHVmcmVxX2RhdGEgKmRhdGEgPSBwZXJfY3B1KGRydl9kYXRhLCBjcHUpOworCXN0cnVjdCBhY3BpX2NwdWZyZXFfZGF0YSAqZGF0YSA9IHBlcl9jcHUoYWNmcmVxX2RhdGEsIGNwdSk7CiAJdW5zaWduZWQgaW50IGZyZXE7CiAJdW5zaWduZWQgaW50IGNhY2hlZF9mcmVxOwogCkBAIC0zMjIsNyArMzIyLDcgQEAKIHN0YXRpYyBpbnQgYWNwaV9jcHVmcmVxX3RhcmdldChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0X2ZyZXEsIHVuc2lnbmVkIGludCByZWxhdGlvbikKIHsKLQlzdHJ1Y3QgYWNwaV9jcHVmcmVxX2RhdGEgKmRhdGEgPSBwZXJfY3B1KGRydl9kYXRhLCBwb2xpY3ktPmNwdSk7CisJc3RydWN0IGFjcGlfY3B1ZnJlcV9kYXRhICpkYXRhID0gcGVyX2NwdShhY2ZyZXFfZGF0YSwgcG9saWN5LT5jcHUpOwogCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSAqcGVyZjsKIAlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyBmcmVxczsKIAlzdHJ1Y3QgZHJ2X2NtZCBjbWQ7CkBAIC00MTYsNyArNDE2LDcgQEAKIAogc3RhdGljIGludCBhY3BpX2NwdWZyZXFfdmVyaWZ5KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQogewotCXN0cnVjdCBhY3BpX2NwdWZyZXFfZGF0YSAqZGF0YSA9IHBlcl9jcHUoZHJ2X2RhdGEsIHBvbGljeS0+Y3B1KTsKKwlzdHJ1Y3QgYWNwaV9jcHVmcmVxX2RhdGEgKmRhdGEgPSBwZXJfY3B1KGFjZnJlcV9kYXRhLCBwb2xpY3ktPmNwdSk7CiAKIAlkcHJpbnRrKCJhY3BpX2NwdWZyZXFfdmVyaWZ5XG4iKTsKIApAQCAtNTc0LDcgKzU3NCw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJZGF0YS0+YWNwaV9kYXRhID0gcGVyX2NwdV9wdHIoYWNwaV9wZXJmX2RhdGEsIGNwdSk7Ci0JcGVyX2NwdShkcnZfZGF0YSwgY3B1KSA9IGRhdGE7CisJcGVyX2NwdShhY2ZyZXFfZGF0YSwgY3B1KSA9IGRhdGE7CiAKIAlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9DT05TVEFOVF9UU0MpKQogCQlhY3BpX2NwdWZyZXFfZHJpdmVyLmZsYWdzIHw9IENQVUZSRVFfQ09OU1RfTE9PUFM7CkBAIC03MjUsMjAgKzcyNSwyMCBAQAogCWFjcGlfcHJvY2Vzc29yX3VucmVnaXN0ZXJfcGVyZm9ybWFuY2UocGVyZiwgY3B1KTsKIGVycl9mcmVlOgogCWtmcmVlKGRhdGEpOwotCXBlcl9jcHUoZHJ2X2RhdGEsIGNwdSkgPSBOVUxMOworCXBlcl9jcHUoYWNmcmVxX2RhdGEsIGNwdSkgPSBOVUxMOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGludCBhY3BpX2NwdWZyZXFfY3B1X2V4aXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCiB7Ci0Jc3RydWN0IGFjcGlfY3B1ZnJlcV9kYXRhICpkYXRhID0gcGVyX2NwdShkcnZfZGF0YSwgcG9saWN5LT5jcHUpOworCXN0cnVjdCBhY3BpX2NwdWZyZXFfZGF0YSAqZGF0YSA9IHBlcl9jcHUoYWNmcmVxX2RhdGEsIHBvbGljeS0+Y3B1KTsKIAogCWRwcmludGsoImFjcGlfY3B1ZnJlcV9jcHVfZXhpdFxuIik7CiAKIAlpZiAoZGF0YSkgewogCQljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9wdXRfYXR0cihwb2xpY3ktPmNwdSk7Ci0JCXBlcl9jcHUoZHJ2X2RhdGEsIHBvbGljeS0+Y3B1KSA9IE5VTEw7CisJCXBlcl9jcHUoYWNmcmVxX2RhdGEsIHBvbGljeS0+Y3B1KSA9IE5VTEw7CiAJCWFjcGlfcHJvY2Vzc29yX3VucmVnaXN0ZXJfcGVyZm9ybWFuY2UoZGF0YS0+YWNwaV9kYXRhLAogCQkJCQkJICAgICAgcG9saWN5LT5jcHUpOwogCQlrZnJlZShkYXRhKTsKQEAgLTc0OSw3ICs3NDksNyBAQAogCiBzdGF0aWMgaW50IGFjcGlfY3B1ZnJlcV9yZXN1bWUoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCiB7Ci0Jc3RydWN0IGFjcGlfY3B1ZnJlcV9kYXRhICpkYXRhID0gcGVyX2NwdShkcnZfZGF0YSwgcG9saWN5LT5jcHUpOworCXN0cnVjdCBhY3BpX2NwdWZyZXFfZGF0YSAqZGF0YSA9IHBlcl9jcHUoYWNmcmVxX2RhdGEsIHBvbGljeS0+Y3B1KTsKIAogCWRwcmludGsoImFjcGlfY3B1ZnJlcV9yZXN1bWVcbiIpOwogCkBAIC03NjQsMTQgKzc2NCwxNSBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBhY3BpX2NwdWZyZXFfZHJpdmVyID0gewotCS52ZXJpZnkgPSBhY3BpX2NwdWZyZXFfdmVyaWZ5LAotCS50YXJnZXQgPSBhY3BpX2NwdWZyZXFfdGFyZ2V0LAotCS5pbml0ID0gYWNwaV9jcHVmcmVxX2NwdV9pbml0LAotCS5leGl0ID0gYWNwaV9jcHVmcmVxX2NwdV9leGl0LAotCS5yZXN1bWUgPSBhY3BpX2NwdWZyZXFfcmVzdW1lLAotCS5uYW1lID0gImFjcGktY3B1ZnJlcSIsCi0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLmF0dHIgPSBhY3BpX2NwdWZyZXFfYXR0ciwKKwkudmVyaWZ5CQk9IGFjcGlfY3B1ZnJlcV92ZXJpZnksCisJLnRhcmdldAkJPSBhY3BpX2NwdWZyZXFfdGFyZ2V0LAorCS5iaW9zX2xpbWl0CT0gYWNwaV9wcm9jZXNzb3JfZ2V0X2Jpb3NfbGltaXQsCisJLmluaXQJCT0gYWNwaV9jcHVmcmVxX2NwdV9pbml0LAorCS5leGl0CQk9IGFjcGlfY3B1ZnJlcV9jcHVfZXhpdCwKKwkucmVzdW1lCQk9IGFjcGlfY3B1ZnJlcV9yZXN1bWUsCisJLm5hbWUJCT0gImFjcGktY3B1ZnJlcSIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5hdHRyCQk9IGFjcGlfY3B1ZnJlcV9hdHRyLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgYWNwaV9jcHVmcmVxX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rNi5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs2LmMKaW5kZXggZjEwZGVhNC4uY2IwMWRhYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs2LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs2LmMKQEAgLTE2NCw3ICsxNjQsNyBAQAogCX0KIAogCS8qIGNwdWluZm8gYW5kIGRlZmF1bHQgcG9saWN5IHZhbHVlcyAqLwotCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSBDUFVGUkVRX0VURVJOQUw7CisJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IDIwMDAwMDsKIAlwb2xpY3ktPmN1ciA9IGJ1c2ZyZXEgKiBtYXhfbXVsdGlwbGllcjsKIAogCXJlc3VsdCA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCBjbG9ja19yYXRpbyk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazcuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rNy5jCmluZGV4IGQ0N2M3NzUuLjlhOTcxMTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rNy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rNy5jCkBAIC03MTQsMTQgKzcxNCwxNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBwb3dlcm5vd19kcml2ZXIgPSB7Ci0JLnZlcmlmeQk9IHBvd2Vybm93X3ZlcmlmeSwKLQkudGFyZ2V0CT0gcG93ZXJub3dfdGFyZ2V0LAotCS5nZXQJPSBwb3dlcm5vd19nZXQsCi0JLmluaXQJPSBwb3dlcm5vd19jcHVfaW5pdCwKLQkuZXhpdAk9IHBvd2Vybm93X2NwdV9leGl0LAotCS5uYW1lCT0gInBvd2Vybm93LWs3IiwKLQkub3duZXIJPSBUSElTX01PRFVMRSwKLQkuYXR0cgk9IHBvd2Vybm93X3RhYmxlX2F0dHIsCisJLnZlcmlmeQkJPSBwb3dlcm5vd192ZXJpZnksCisJLnRhcmdldAkJPSBwb3dlcm5vd190YXJnZXQsCisJLmdldAkJPSBwb3dlcm5vd19nZXQsCisjaWZkZWYgQ09ORklHX1g4Nl9QT1dFUk5PV19LN19BQ1BJCisJLmJpb3NfbGltaXQJPSBhY3BpX3Byb2Nlc3Nvcl9nZXRfYmlvc19saW1pdCwKKyNlbmRpZgorCS5pbml0CQk9IHBvd2Vybm93X2NwdV9pbml0LAorCS5leGl0CQk9IHBvd2Vybm93X2NwdV9leGl0LAorCS5uYW1lCQk9ICJwb3dlcm5vdy1rNyIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5hdHRyCQk9IHBvd2Vybm93X3RhYmxlX2F0dHIsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBwb3dlcm5vd19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rOC5jCmluZGV4IDNmMTJkYWIuLmE5ZGY5NDQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rOC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rOC5jCkBAIC0xMTE4LDcgKzExMTgsNyBAQAogc3RhdGljIGludCBwb3dlcm5vd2s4X3RhcmdldChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbCwKIAkJdW5zaWduZWQgdGFyZ2ZyZXEsIHVuc2lnbmVkIHJlbGF0aW9uKQogewotCWNwdW1hc2tfdCBvbGRtYXNrOworCWNwdW1hc2tfdmFyX3Qgb2xkbWFzazsKIAlzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSA9IHBlcl9jcHUocG93ZXJub3dfZGF0YSwgcG9sLT5jcHUpOwogCXUzMiBjaGVja2ZpZDsKIAl1MzIgY2hlY2t2aWQ7CkBAIC0xMTMxLDkgKzExMzEsMTMgQEAKIAljaGVja2ZpZCA9IGRhdGEtPmN1cnJmaWQ7CiAJY2hlY2t2aWQgPSBkYXRhLT5jdXJydmlkOwogCi0JLyogb25seSBydW4gb24gc3BlY2lmaWMgQ1BVIGZyb20gaGVyZSBvbiAqLwotCW9sZG1hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7Ci0Jc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgJmNwdW1hc2tfb2ZfY3B1KHBvbC0+Y3B1KSk7CisJLyogb25seSBydW4gb24gc3BlY2lmaWMgQ1BVIGZyb20gaGVyZSBvbi4gKi8KKwkvKiBUaGlzIGlzIHBvb3IgZm9ybTogdXNlIGEgd29ya3F1ZXVlIG9yIHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZSAqLworCWlmICghYWxsb2NfY3B1bWFza192YXIoJm9sZG1hc2ssIEdGUF9LRVJORUwpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNwdW1hc2tfY29weShvbGRtYXNrLCB0c2tfY3B1bWFzayhjdXJyZW50KSk7CisJc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgY3B1bWFza19vZihwb2wtPmNwdSkpOwogCiAJaWYgKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSBwb2wtPmNwdSkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJsaW1pdGluZyB0byBjcHUgJXUgZmFpbGVkXG4iLCBwb2wtPmNwdSk7CkBAIC0xMTkzLDcgKzExOTcsOCBAQAogCXJldCA9IDA7CiAKIGVycl9vdXQ6Ci0Jc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgJm9sZG1hc2spOworCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsIG9sZG1hc2spOworCWZyZWVfY3B1bWFza192YXIob2xkbWFzayk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTM5MywxNCArMTM5OCwxNSBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBjcHVmcmVxX2FtZDY0X2RyaXZlciA9IHsKLQkudmVyaWZ5ID0gcG93ZXJub3drOF92ZXJpZnksCi0JLnRhcmdldCA9IHBvd2Vybm93azhfdGFyZ2V0LAotCS5pbml0ID0gcG93ZXJub3drOF9jcHVfaW5pdCwKLQkuZXhpdCA9IF9fZGV2ZXhpdF9wKHBvd2Vybm93azhfY3B1X2V4aXQpLAotCS5nZXQgPSBwb3dlcm5vd2s4X2dldCwKLQkubmFtZSA9ICJwb3dlcm5vdy1rOCIsCi0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLmF0dHIgPSBwb3dlcm5vd19rOF9hdHRyLAorCS52ZXJpZnkJCT0gcG93ZXJub3drOF92ZXJpZnksCisJLnRhcmdldAkJPSBwb3dlcm5vd2s4X3RhcmdldCwKKwkuYmlvc19saW1pdAk9IGFjcGlfcHJvY2Vzc29yX2dldF9iaW9zX2xpbWl0LAorCS5pbml0CQk9IHBvd2Vybm93azhfY3B1X2luaXQsCisJLmV4aXQJCT0gX19kZXZleGl0X3AocG93ZXJub3drOF9jcHVfZXhpdCksCisJLmdldAkJPSBwb3dlcm5vd2s4X2dldCwKKwkubmFtZQkJPSAicG93ZXJub3ctazgiLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuYXR0cgkJPSBwb3dlcm5vd19rOF9hdHRyLAogfTsKIAogLyogZHJpdmVyIGVudHJ5IHBvaW50IGZvciBpbml0ICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWljaC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1pY2guYwppbmRleCAzYWU1YTdhLi4yY2U4ZTBiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWljaC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtaWNoLmMKQEAgLTM5LDcgKzM5LDcgQEAKIAogLyogc3BlZWRzdGVwX3Byb2Nlc3NvcgogICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHNwZWVkc3RlcF9wcm9jZXNzb3I7CitzdGF0aWMgZW51bSBzcGVlZHN0ZXBfcHJvY2Vzc29yIHNwZWVkc3RlcF9wcm9jZXNzb3I7CiAKIHN0YXRpYyB1MzIgcG1iYXNlOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1saWIuYwppbmRleCBmNGMyOTBiLi5hZDAwODNhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtbGliLmMKQEAgLTM0LDcgKzM0LDcgQEAKICAqICAgICAgICAgICAgICAgICAgIEdFVCBQUk9DRVNTT1IgQ09SRSBTUEVFRCBJTiBLSFogICAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGVudGl1bTNfZ2V0X2ZyZXF1ZW5jeSh1bnNpZ25lZCBpbnQgcHJvY2Vzc29yKQorc3RhdGljIHVuc2lnbmVkIGludCBwZW50aXVtM19nZXRfZnJlcXVlbmN5KGVudW0gc3BlZWRzdGVwX3Byb2Nlc3NvciBwcm9jZXNzb3IpCiB7CiAJLyogU2VlIHRhYmxlIDE0IG9mIHAzX2RzLnBkZiBhbmQgdGFibGUgMjIgb2YgMjk4MzQwMDMucGRmICovCiAJc3RydWN0IHsKQEAgLTIyNyw3ICsyMjcsNyBAQAogCiAKIC8qIFdhcm5pbmc6IG1heSBnZXQgY2FsbGVkIGZyb20gc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlLiAqLwotdW5zaWduZWQgaW50IHNwZWVkc3RlcF9nZXRfZnJlcXVlbmN5KHVuc2lnbmVkIGludCBwcm9jZXNzb3IpCit1bnNpZ25lZCBpbnQgc3BlZWRzdGVwX2dldF9mcmVxdWVuY3koZW51bSBzcGVlZHN0ZXBfcHJvY2Vzc29yIHByb2Nlc3NvcikKIHsKIAlzd2l0Y2ggKHByb2Nlc3NvcikgewogCWNhc2UgU1BFRURTVEVQX0NQVV9QQ09SRToKQEAgLTM4MCw3ICszODAsNyBAQAogICogICAgICAgICAgICAgICAgICAgICBERVRFQ1QgU1BFRURTVEVQIFNQRUVEUyAgICAgICAgICAgICAgICAgICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdW5zaWduZWQgaW50IHNwZWVkc3RlcF9nZXRfZnJlcXModW5zaWduZWQgaW50IHByb2Nlc3NvciwKK3Vuc2lnbmVkIGludCBzcGVlZHN0ZXBfZ2V0X2ZyZXFzKGVudW0gc3BlZWRzdGVwX3Byb2Nlc3NvciBwcm9jZXNzb3IsCiAJCQkJICB1bnNpZ25lZCBpbnQgKmxvd19zcGVlZCwKIAkJCQkgIHVuc2lnbmVkIGludCAqaGlnaF9zcGVlZCwKIAkJCQkgIHVuc2lnbmVkIGludCAqdHJhbnNpdGlvbl9sYXRlbmN5LApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1saWIuaCBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtbGliLmgKaW5kZXggMmI2YzA0ZS4uNzBkOWNlYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1saWIuaAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5oCkBAIC0xMSwxOCArMTEsMTggQEAKIAogCiAvKiBwcm9jZXNzb3JzICovCi0KLSNkZWZpbmUgU1BFRURTVEVQX0NQVV9QSUlJX0NfRUFSTFkJMHgwMDAwMDAwMSAgLyogQ29wcGVybWluZSBjb3JlICovCi0jZGVmaW5lIFNQRUVEU1RFUF9DUFVfUElJSV9DCQkweDAwMDAwMDAyICAvKiBDb3BwZXJtaW5lIGNvcmUgKi8KLSNkZWZpbmUgU1BFRURTVEVQX0NQVV9QSUlJX1QJCTB4MDAwMDAwMDMgIC8qIFR1YWxhdGluIGNvcmUgKi8KLSNkZWZpbmUgU1BFRURTVEVQX0NQVV9QNE0JCTB4MDAwMDAwMDQgIC8qIFA0LU0gICovCi0KK2VudW0gc3BlZWRzdGVwX3Byb2Nlc3NvciB7CisJU1BFRURTVEVQX0NQVV9QSUlJX0NfRUFSTFkgPSAweDAwMDAwMDAxLCAgLyogQ29wcGVybWluZSBjb3JlICovCisJU1BFRURTVEVQX0NQVV9QSUlJX0MJICAgPSAweDAwMDAwMDAyLCAgLyogQ29wcGVybWluZSBjb3JlICovCisJU1BFRURTVEVQX0NQVV9QSUlJX1QJICAgPSAweDAwMDAwMDAzLCAgLyogVHVhbGF0aW4gY29yZSAqLworCVNQRUVEU1RFUF9DUFVfUDRNCSAgID0gMHgwMDAwMDAwNCwgIC8qIFA0LU0gICovCiAvKiB0aGUgZm9sbG93aW5nIHByb2Nlc3NvcnMgYXJlIG5vdCBzcGVlZHN0ZXAtY2FwYWJsZSBhbmQgYXJlIG5vdCBhdXRvLWRldGVjdGVkCiAgKiBpbiBzcGVlZHN0ZXBfZGV0ZWN0X3Byb2Nlc3NvcigpLiBIb3dldmVyLCB0aGVpciBzcGVlZCBjYW4gYmUgZGV0ZWN0ZWQgdXNpbmcKICAqIHRoZSBzcGVlZHN0ZXBfZ2V0X2ZyZXF1ZW5jeSgpIGNhbGwuICovCi0jZGVmaW5lIFNQRUVEU1RFUF9DUFVfUE0JCTB4RkZGRkZGMDMgIC8qIFBlbnRpdW0gTSAgKi8KLSNkZWZpbmUgU1BFRURTVEVQX0NQVV9QNEQJCTB4RkZGRkZGMDQgIC8qIGRlc2t0b3AgUDQgICovCi0jZGVmaW5lIFNQRUVEU1RFUF9DUFVfUENPUkUJCTB4RkZGRkZGMDUgIC8qIENvcmUgKi8KKwlTUEVFRFNURVBfQ1BVX1BNCSAgID0gMHhGRkZGRkYwMywgIC8qIFBlbnRpdW0gTSAgKi8KKwlTUEVFRFNURVBfQ1BVX1A0RAkgICA9IDB4RkZGRkZGMDQsICAvKiBkZXNrdG9wIFA0ICAqLworCVNQRUVEU1RFUF9DUFVfUENPUkUJICAgPSAweEZGRkZGRjA1LCAgLyogQ29yZSAqLworfTsKIAogLyogc3BlZWRzdGVwIHN0YXRlcyAtLSBvbmx5IHR3byBvZiB0aGVtICovCiAKQEAgLTMxLDEwICszMSwxMCBAQAogCiAKIC8qIGRldGVjdCBhIHNwZWVkc3RlcC1jYXBhYmxlIHByb2Nlc3NvciAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBzcGVlZHN0ZXBfZGV0ZWN0X3Byb2Nlc3NvciAodm9pZCk7CitleHRlcm4gZW51bSBzcGVlZHN0ZXBfcHJvY2Vzc29yIHNwZWVkc3RlcF9kZXRlY3RfcHJvY2Vzc29yKHZvaWQpOwogCiAvKiBkZXRlY3QgdGhlIGN1cnJlbnQgc3BlZWQgKGluIGtoeikgb2YgdGhlIHByb2Nlc3NvciAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBzcGVlZHN0ZXBfZ2V0X2ZyZXF1ZW5jeSh1bnNpZ25lZCBpbnQgcHJvY2Vzc29yKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgc3BlZWRzdGVwX2dldF9mcmVxdWVuY3koZW51bSBzcGVlZHN0ZXBfcHJvY2Vzc29yIHByb2Nlc3Nvcik7CiAKIAogLyogZGV0ZWN0IHRoZSBsb3cgYW5kIGhpZ2ggc3BlZWRzIG9mIHRoZSBwcm9jZXNzb3IuIFRoZSBjYWxsYmFjawpAQCAtNDIsNyArNDIsNyBAQAogICogU1BFRURTVEVQX0xPVzsgdGhlIHNlY29uZCBhcmd1bWVudCBpcyB6ZXJvIHNvIHRoYXQgbm8KICAqIGNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24gY2FsbHMgYXJlIGluaXRpYXRlZC4KICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBzcGVlZHN0ZXBfZ2V0X2ZyZXFzKHVuc2lnbmVkIGludCBwcm9jZXNzb3IsCitleHRlcm4gdW5zaWduZWQgaW50IHNwZWVkc3RlcF9nZXRfZnJlcXMoZW51bSBzcGVlZHN0ZXBfcHJvY2Vzc29yIHByb2Nlc3NvciwKIAl1bnNpZ25lZCBpbnQgKmxvd19zcGVlZCwKIAl1bnNpZ25lZCBpbnQgKmhpZ2hfc3BlZWQsCiAJdW5zaWduZWQgaW50ICp0cmFuc2l0aW9uX2xhdGVuY3ksCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLXNtaS5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1zbWkuYwppbmRleCBiZWZlYTA4Li4wNGQ3M2MxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLXNtaS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtc21pLmMKQEAgLTM1LDcgKzM1LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc21pX3NpZzsKIAogLyogaW5mbyBhYm91dCB0aGUgcHJvY2Vzc29yICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHNwZWVkc3RlcF9wcm9jZXNzb3I7CitzdGF0aWMgZW51bSBzcGVlZHN0ZXBfcHJvY2Vzc29yIHNwZWVkc3RlcF9wcm9jZXNzb3I7CiAKIC8qCiAgKiBUaGVyZSBhcmUgb25seSB0d28gZnJlcXVlbmN5IHN0YXRlcyBmb3IgZWFjaCBwcm9jZXNzb3IuIFZhbHVlcwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbF9jYWNoZWluZm8uYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWxfY2FjaGVpbmZvLmMKaW5kZXggNjNhZGExNy4uZmM2YzhlZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbF9jYWNoZWluZm8uYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2ludGVsX2NhY2hlaW5mby5jCkBAIC00OTksOCArNDk5LDggQEAKICNpZmRlZiBDT05GSUdfU1lTRlMKIAogLyogcG9pbnRlciB0byBfY3B1aWQ0X2luZm8gYXJyYXkgKGZvciBlYWNoIGNhY2hlIGxlYWYpICovCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IF9jcHVpZDRfaW5mbyAqLCBjcHVpZDRfaW5mbyk7Ci0jZGVmaW5lIENQVUlENF9JTkZPX0lEWCh4LCB5KQkoJigocGVyX2NwdShjcHVpZDRfaW5mbywgeCkpW3ldKSkKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgX2NwdWlkNF9pbmZvICosIGljaV9jcHVpZDRfaW5mbyk7CisjZGVmaW5lIENQVUlENF9JTkZPX0lEWCh4LCB5KQkoJigocGVyX2NwdShpY2lfY3B1aWQ0X2luZm8sIHgpKVt5XSkpCiAKICNpZmRlZiBDT05GSUdfU01QCiBzdGF0aWMgdm9pZCBfX2NwdWluaXQgY2FjaGVfc2hhcmVkX2NwdV9tYXBfc2V0dXAodW5zaWduZWQgaW50IGNwdSwgaW50IGluZGV4KQpAQCAtNTEyLDcgKzUxMiw3IEBACiAKIAlpZiAoKGluZGV4ID09IDMpICYmIChjLT54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfQU1EKSkgewogCQlmb3JfZWFjaF9jcHUoaSwgYy0+bGxjX3NoYXJlZF9tYXApIHsKLQkJCWlmICghcGVyX2NwdShjcHVpZDRfaW5mbywgaSkpCisJCQlpZiAoIXBlcl9jcHUoaWNpX2NwdWlkNF9pbmZvLCBpKSkKIAkJCQljb250aW51ZTsKIAkJCXRoaXNfbGVhZiA9IENQVUlENF9JTkZPX0lEWChpLCBpbmRleCk7CiAJCQlmb3JfZWFjaF9jcHUoc2libGluZywgYy0+bGxjX3NoYXJlZF9tYXApIHsKQEAgLTUzNiw3ICs1MzYsNyBAQAogCQkJICAgIGMtPmFwaWNpZCA+PiBpbmRleF9tc2IpIHsKIAkJCQljcHVtYXNrX3NldF9jcHUoaSwKIAkJCQkJdG9fY3B1bWFzayh0aGlzX2xlYWYtPnNoYXJlZF9jcHVfbWFwKSk7Ci0JCQkJaWYgKGkgIT0gY3B1ICYmIHBlcl9jcHUoY3B1aWQ0X2luZm8sIGkpKSAgeworCQkJCWlmIChpICE9IGNwdSAmJiBwZXJfY3B1KGljaV9jcHVpZDRfaW5mbywgaSkpICB7CiAJCQkJCXNpYmxpbmdfbGVhZiA9CiAJCQkJCQlDUFVJRDRfSU5GT19JRFgoaSwgaW5kZXgpOwogCQkJCQljcHVtYXNrX3NldF9jcHUoY3B1LCB0b19jcHVtYXNrKApAQCAtNTc1LDggKzU3NSw4IEBACiAJZm9yIChpID0gMDsgaSA8IG51bV9jYWNoZV9sZWF2ZXM7IGkrKykKIAkJY2FjaGVfcmVtb3ZlX3NoYXJlZF9jcHVfbWFwKGNwdSwgaSk7CiAKLQlrZnJlZShwZXJfY3B1KGNwdWlkNF9pbmZvLCBjcHUpKTsKLQlwZXJfY3B1KGNwdWlkNF9pbmZvLCBjcHUpID0gTlVMTDsKKwlrZnJlZShwZXJfY3B1KGljaV9jcHVpZDRfaW5mbywgY3B1KSk7CisJcGVyX2NwdShpY2lfY3B1aWQ0X2luZm8sIGNwdSkgPSBOVUxMOwogfQogCiBzdGF0aWMgaW50CkBAIC02MTUsMTUgKzYxNSwxNSBAQAogCWlmIChudW1fY2FjaGVfbGVhdmVzID09IDApCiAJCXJldHVybiAtRU5PRU5UOwogCi0JcGVyX2NwdShjcHVpZDRfaW5mbywgY3B1KSA9IGt6YWxsb2MoCisJcGVyX2NwdShpY2lfY3B1aWQ0X2luZm8sIGNwdSkgPSBremFsbG9jKAogCSAgICBzaXplb2Yoc3RydWN0IF9jcHVpZDRfaW5mbykgKiBudW1fY2FjaGVfbGVhdmVzLCBHRlBfS0VSTkVMKTsKLQlpZiAocGVyX2NwdShjcHVpZDRfaW5mbywgY3B1KSA9PSBOVUxMKQorCWlmIChwZXJfY3B1KGljaV9jcHVpZDRfaW5mbywgY3B1KSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIGdldF9jcHVfbGVhdmVzLCAmcmV0dmFsLCB0cnVlKTsKIAlpZiAocmV0dmFsKSB7Ci0JCWtmcmVlKHBlcl9jcHUoY3B1aWQ0X2luZm8sIGNwdSkpOwotCQlwZXJfY3B1KGNwdWlkNF9pbmZvLCBjcHUpID0gTlVMTDsKKwkJa2ZyZWUocGVyX2NwdShpY2lfY3B1aWQ0X2luZm8sIGNwdSkpOworCQlwZXJfY3B1KGljaV9jcHVpZDRfaW5mbywgY3B1KSA9IE5VTEw7CiAJfQogCiAJcmV0dXJuIHJldHZhbDsKQEAgLTYzNSw3ICs2MzUsNyBAQAogZXh0ZXJuIHN0cnVjdCBzeXNkZXZfY2xhc3MgY3B1X3N5c2Rldl9jbGFzczsgLyogZnJvbSBkcml2ZXJzL2Jhc2UvY3B1LmMgKi8KIAogLyogcG9pbnRlciB0byBrb2JqZWN0IGZvciBjcHVYL2NhY2hlICovCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGtvYmplY3QgKiwgY2FjaGVfa29iamVjdCk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGtvYmplY3QgKiwgaWNpX2NhY2hlX2tvYmplY3QpOwogCiBzdHJ1Y3QgX2luZGV4X2tvYmplY3QgewogCXN0cnVjdCBrb2JqZWN0IGtvYmo7CkBAIC02NDQsOCArNjQ0LDggQEAKIH07CiAKIC8qIHBvaW50ZXIgdG8gYXJyYXkgb2Yga29iamVjdHMgZm9yIGNwdVgvY2FjaGUvaW5kZXhZICovCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IF9pbmRleF9rb2JqZWN0ICosIGluZGV4X2tvYmplY3QpOwotI2RlZmluZSBJTkRFWF9LT0JKRUNUX1BUUih4LCB5KQkJKCYoKHBlcl9jcHUoaW5kZXhfa29iamVjdCwgeCkpW3ldKSkKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgX2luZGV4X2tvYmplY3QgKiwgaWNpX2luZGV4X2tvYmplY3QpOworI2RlZmluZSBJTkRFWF9LT0JKRUNUX1BUUih4LCB5KQkJKCYoKHBlcl9jcHUoaWNpX2luZGV4X2tvYmplY3QsIHgpKVt5XSkpCiAKICNkZWZpbmUgc2hvd19vbmVfcGx1cyhmaWxlX25hbWUsIG9iamVjdCwgdmFsKQkJCQlcCiBzdGF0aWMgc3NpemVfdCBzaG93XyMjZmlsZV9uYW1lCQkJCQkJXApAQCAtODY0LDEwICs4NjQsMTAgQEAKIAogc3RhdGljIHZvaWQgX19jcHVpbml0IGNwdWlkNF9jYWNoZV9zeXNmc19leGl0KHVuc2lnbmVkIGludCBjcHUpCiB7Ci0Ja2ZyZWUocGVyX2NwdShjYWNoZV9rb2JqZWN0LCBjcHUpKTsKLQlrZnJlZShwZXJfY3B1KGluZGV4X2tvYmplY3QsIGNwdSkpOwotCXBlcl9jcHUoY2FjaGVfa29iamVjdCwgY3B1KSA9IE5VTEw7Ci0JcGVyX2NwdShpbmRleF9rb2JqZWN0LCBjcHUpID0gTlVMTDsKKwlrZnJlZShwZXJfY3B1KGljaV9jYWNoZV9rb2JqZWN0LCBjcHUpKTsKKwlrZnJlZShwZXJfY3B1KGljaV9pbmRleF9rb2JqZWN0LCBjcHUpKTsKKwlwZXJfY3B1KGljaV9jYWNoZV9rb2JqZWN0LCBjcHUpID0gTlVMTDsKKwlwZXJfY3B1KGljaV9pbmRleF9rb2JqZWN0LCBjcHUpID0gTlVMTDsKIAlmcmVlX2NhY2hlX2F0dHJpYnV0ZXMoY3B1KTsKIH0KIApAQCAtODgzLDE0ICs4ODMsMTQgQEAKIAkJcmV0dXJuIGVycjsKIAogCS8qIEFsbG9jYXRlIGFsbCByZXF1aXJlZCBtZW1vcnkgKi8KLQlwZXJfY3B1KGNhY2hlX2tvYmplY3QsIGNwdSkgPQorCXBlcl9jcHUoaWNpX2NhY2hlX2tvYmplY3QsIGNwdSkgPQogCQlremFsbG9jKHNpemVvZihzdHJ1Y3Qga29iamVjdCksIEdGUF9LRVJORUwpOwotCWlmICh1bmxpa2VseShwZXJfY3B1KGNhY2hlX2tvYmplY3QsIGNwdSkgPT0gTlVMTCkpCisJaWYgKHVubGlrZWx5KHBlcl9jcHUoaWNpX2NhY2hlX2tvYmplY3QsIGNwdSkgPT0gTlVMTCkpCiAJCWdvdG8gZXJyX291dDsKIAotCXBlcl9jcHUoaW5kZXhfa29iamVjdCwgY3B1KSA9IGt6YWxsb2MoCisJcGVyX2NwdShpY2lfaW5kZXhfa29iamVjdCwgY3B1KSA9IGt6YWxsb2MoCiAJICAgIHNpemVvZihzdHJ1Y3QgX2luZGV4X2tvYmplY3QpICogbnVtX2NhY2hlX2xlYXZlcywgR0ZQX0tFUk5FTCk7Ci0JaWYgKHVubGlrZWx5KHBlcl9jcHUoaW5kZXhfa29iamVjdCwgY3B1KSA9PSBOVUxMKSkKKwlpZiAodW5saWtlbHkocGVyX2NwdShpY2lfaW5kZXhfa29iamVjdCwgY3B1KSA9PSBOVUxMKSkKIAkJZ290byBlcnJfb3V0OwogCiAJcmV0dXJuIDA7CkBAIC05MTQsNyArOTE0LDcgQEAKIAlpZiAodW5saWtlbHkocmV0dmFsIDwgMCkpCiAJCXJldHVybiByZXR2YWw7CiAKLQlyZXR2YWwgPSBrb2JqZWN0X2luaXRfYW5kX2FkZChwZXJfY3B1KGNhY2hlX2tvYmplY3QsIGNwdSksCisJcmV0dmFsID0ga29iamVjdF9pbml0X2FuZF9hZGQocGVyX2NwdShpY2lfY2FjaGVfa29iamVjdCwgY3B1KSwKIAkJCQkgICAgICAma3R5cGVfcGVyY3B1X2VudHJ5LAogCQkJCSAgICAgICZzeXNfZGV2LT5rb2JqLCAiJXMiLCAiY2FjaGUiKTsKIAlpZiAocmV0dmFsIDwgMCkgewpAQCAtOTI4LDEyICs5MjgsMTIgQEAKIAkJdGhpc19vYmplY3QtPmluZGV4ID0gaTsKIAkJcmV0dmFsID0ga29iamVjdF9pbml0X2FuZF9hZGQoJih0aGlzX29iamVjdC0+a29iaiksCiAJCQkJCSAgICAgICZrdHlwZV9jYWNoZSwKLQkJCQkJICAgICAgcGVyX2NwdShjYWNoZV9rb2JqZWN0LCBjcHUpLAorCQkJCQkgICAgICBwZXJfY3B1KGljaV9jYWNoZV9rb2JqZWN0LCBjcHUpLAogCQkJCQkgICAgICAiaW5kZXglMWx1IiwgaSk7CiAJCWlmICh1bmxpa2VseShyZXR2YWwpKSB7CiAJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQogCQkJCWtvYmplY3RfcHV0KCYoSU5ERVhfS09CSkVDVF9QVFIoY3B1LCBqKS0+a29iaikpOwotCQkJa29iamVjdF9wdXQocGVyX2NwdShjYWNoZV9rb2JqZWN0LCBjcHUpKTsKKwkJCWtvYmplY3RfcHV0KHBlcl9jcHUoaWNpX2NhY2hlX2tvYmplY3QsIGNwdSkpOwogCQkJY3B1aWQ0X2NhY2hlX3N5c2ZzX2V4aXQoY3B1KTsKIAkJCXJldHVybiByZXR2YWw7CiAJCX0KQEAgLTk0MSw3ICs5NDEsNyBAQAogCX0KIAljcHVtYXNrX3NldF9jcHUoY3B1LCB0b19jcHVtYXNrKGNhY2hlX2Rldl9tYXApKTsKIAotCWtvYmplY3RfdWV2ZW50KHBlcl9jcHUoY2FjaGVfa29iamVjdCwgY3B1KSwgS09CSl9BREQpOworCWtvYmplY3RfdWV2ZW50KHBlcl9jcHUoaWNpX2NhY2hlX2tvYmplY3QsIGNwdSksIEtPQkpfQUREKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTUwLDcgKzk1MCw3IEBACiAJdW5zaWduZWQgaW50IGNwdSA9IHN5c19kZXYtPmlkOwogCXVuc2lnbmVkIGxvbmcgaTsKIAotCWlmIChwZXJfY3B1KGNwdWlkNF9pbmZvLCBjcHUpID09IE5VTEwpCisJaWYgKHBlcl9jcHUoaWNpX2NwdWlkNF9pbmZvLCBjcHUpID09IE5VTEwpCiAJCXJldHVybjsKIAlpZiAoIWNwdW1hc2tfdGVzdF9jcHUoY3B1LCB0b19jcHVtYXNrKGNhY2hlX2Rldl9tYXApKSkKIAkJcmV0dXJuOwpAQCAtOTU4LDcgKzk1OCw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2NhY2hlX2xlYXZlczsgaSsrKQogCQlrb2JqZWN0X3B1dCgmKElOREVYX0tPQkpFQ1RfUFRSKGNwdSwgaSktPmtvYmopKTsKLQlrb2JqZWN0X3B1dChwZXJfY3B1KGNhY2hlX2tvYmplY3QsIGNwdSkpOworCWtvYmplY3RfcHV0KHBlcl9jcHUoaWNpX2NhY2hlX2tvYmplY3QsIGNwdSkpOwogCWNwdWlkNF9jYWNoZV9zeXNmc19leGl0KGNwdSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50LmMKaW5kZXggYWIxYThhOC4uNDU1MDZkNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50LmMKQEAgLTE2MzIsNiArMTYzMiw3IEBACiAKIAlkYXRhLnBlcmlvZAk9IGV2ZW50LT5ody5sYXN0X3BlcmlvZDsKIAlkYXRhLmFkZHIJPSAwOworCWRhdGEucmF3CT0gTlVMTDsKIAlyZWdzLmlwCQk9IDA7CiAKIAkvKgpAQCAtMTc0OSw2ICsxNzUwLDcgQEAKIAl1NjQgdmFsOwogCiAJZGF0YS5hZGRyID0gMDsKKwlkYXRhLnJhdyA9IE5VTEw7CiAKIAljcHVjID0gJl9fZ2V0X2NwdV92YXIoY3B1X2h3X2V2ZW50cyk7CiAKQEAgLTE3OTQsNiArMTc5Niw3IEBACiAJdTY0IGFjaywgc3RhdHVzOwogCiAJZGF0YS5hZGRyID0gMDsKKwlkYXRhLnJhdyA9IE5VTEw7CiAKIAljcHVjID0gJl9fZ2V0X2NwdV92YXIoY3B1X2h3X2V2ZW50cyk7CiAKQEAgLTE4NTcsNiArMTg2MCw3IEBACiAJdTY0IHZhbDsKIAogCWRhdGEuYWRkciA9IDA7CisJZGF0YS5yYXcgPSBOVUxMOwogCiAJY3B1YyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19ldmVudHMpOwogCkBAIC0yMDYyLDEyICsyMDY2LDYgQEAKIAogCXg4Nl9wbXUgPSBwNl9wbXU7CiAKLQlpZiAoIWNwdV9oYXNfYXBpYykgewotCQlwcl9pbmZvKCJubyBBUElDLCBib290IHdpdGggdGhlIFwibGFwaWNcIiBib290IHBhcmFtZXRlciB0byBmb3JjZS1lbmFibGUgaXQuXG4iKTsKLQkJcHJfaW5mbygibm8gaGFyZHdhcmUgc2FtcGxpbmcgaW50ZXJydXB0IGF2YWlsYWJsZS5cbiIpOwotCQl4ODZfcG11LmFwaWMgPSAwOwotCX0KLQogCXJldHVybiAwOwogfQogCkBAIC0yMTU5LDYgKzIxNTcsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgX19pbml0IHBtdV9jaGVja19hcGljKHZvaWQpCit7CisJaWYgKGNwdV9oYXNfYXBpYykKKwkJcmV0dXJuOworCisJeDg2X3BtdS5hcGljID0gMDsKKwlwcl9pbmZvKCJubyBBUElDLCBib290IHdpdGggdGhlIFwibGFwaWNcIiBib290IHBhcmFtZXRlciB0byBmb3JjZS1lbmFibGUgaXQuXG4iKTsKKwlwcl9pbmZvKCJubyBoYXJkd2FyZSBzYW1wbGluZyBpbnRlcnJ1cHQgYXZhaWxhYmxlLlxuIik7Cit9CisKIHZvaWQgX19pbml0IGluaXRfaHdfcGVyZl9ldmVudHModm9pZCkKIHsKIAlpbnQgZXJyOwpAQCAtMjE4MCw2ICsyMTg4LDggQEAKIAkJcmV0dXJuOwogCX0KIAorCXBtdV9jaGVja19hcGljKCk7CisKIAlwcl9jb250KCIlcyBQTVUgZHJpdmVyLlxuIiwgeDg2X3BtdS5uYW1lKTsKIAogCWlmICh4ODZfcG11Lm51bV9ldmVudHMgPiBYODZfUE1DX01BWF9HRU5FUklDKSB7CkBAIC0yMjg3LDcgKzIyOTcsNyBAQAogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5LCBwbWNfaXJxX2VudHJ5KTsKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnksIHBtY19ubWlfZW50cnkpOwotc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgaW5fbm1pX2ZyYW1lKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIGluX2lnbm9yZWRfZnJhbWUpOwogCiAKIHN0YXRpYyB2b2lkCkBAIC0yMzAzLDggKzIzMTMsOSBAQAogCiBzdGF0aWMgaW50IGJhY2t0cmFjZV9zdGFjayh2b2lkICpkYXRhLCBjaGFyICpuYW1lKQogewotCXBlcl9jcHUoaW5fbm1pX2ZyYW1lLCBzbXBfcHJvY2Vzc29yX2lkKCkpID0KLQkJCXg4Nl9pc19zdGFja19pZChOTUlfU1RBQ0ssIG5hbWUpOworCXBlcl9jcHUoaW5faWdub3JlZF9mcmFtZSwgc21wX3Byb2Nlc3Nvcl9pZCgpKSA9CisJCQl4ODZfaXNfc3RhY2tfaWQoTk1JX1NUQUNLLCBuYW1lKSB8fAorCQkJeDg2X2lzX3N0YWNrX2lkKERFQlVHX1NUQUNLLCBuYW1lKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjMxMyw3ICsyMzI0LDcgQEAKIHsKIAlzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnkgKmVudHJ5ID0gZGF0YTsKIAotCWlmIChwZXJfY3B1KGluX25taV9mcmFtZSwgc21wX3Byb2Nlc3Nvcl9pZCgpKSkKKwlpZiAocGVyX2NwdShpbl9pZ25vcmVkX2ZyYW1lLCBzbXBfcHJvY2Vzc29yX2lkKCkpKQogCQlyZXR1cm47CiAKIAlpZiAocmVsaWFibGUpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZHMuYyBiL2FyY2gveDg2L2tlcm5lbC9kcy5jCmluZGV4IGVmNDJhMDMuLjFjNDczOTAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9kcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9kcy5jCkBAIC0yNjUsMTMgKzI2NSwxMyBAQAogCWludAkJCWNwdTsKIH07CiAKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgZHNfY29udGV4dCAqLCBjcHVfY29udGV4dCk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGRzX2NvbnRleHQgKiwgY3B1X2RzX2NvbnRleHQpOwogCiAKIHN0YXRpYyBzdHJ1Y3QgZHNfY29udGV4dCAqZHNfZ2V0X2NvbnRleHQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgY3B1KQogewogCXN0cnVjdCBkc19jb250ZXh0ICoqcF9jb250ZXh0ID0KLQkJKHRhc2sgPyAmdGFzay0+dGhyZWFkLmRzX2N0eCA6ICZwZXJfY3B1KGNwdV9jb250ZXh0LCBjcHUpKTsKKwkJKHRhc2sgPyAmdGFzay0+dGhyZWFkLmRzX2N0eCA6ICZwZXJfY3B1KGNwdV9kc19jb250ZXh0LCBjcHUpKTsKIAlzdHJ1Y3QgZHNfY29udGV4dCAqY29udGV4dCA9IE5VTEw7CiAJc3RydWN0IGRzX2NvbnRleHQgKm5ld19jb250ZXh0ID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja182NC5jIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja182NC5jCmluZGV4IDhlNzQwOTMuLmIxM2FmNTMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzY0LmMKQEAgLTEwMyw2ICsxMDMsMzUgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQKK2luX2lycV9zdGFjayh1bnNpZ25lZCBsb25nICpzdGFjaywgdW5zaWduZWQgbG9uZyAqaXJxX3N0YWNrLAorCSAgICAgdW5zaWduZWQgbG9uZyAqaXJxX3N0YWNrX2VuZCkKK3sKKwlyZXR1cm4gKHN0YWNrID49IGlycV9zdGFjayAmJiBzdGFjayA8IGlycV9zdGFja19lbmQpOworfQorCisvKgorICogV2UgYXJlIHJldHVybmluZyBmcm9tIHRoZSBpcnEgc3RhY2sgYW5kIGdvIHRvIHRoZSBwcmV2aW91cyBvbmUuCisgKiBJZiB0aGUgcHJldmlvdXMgc3RhY2sgaXMgYWxzbyBpbiB0aGUgaXJxIHN0YWNrLCB0aGVuIGJwIGluIHRoZSBmaXJzdAorICogZnJhbWUgb2YgdGhlIGlycSBzdGFjayBwb2ludHMgdG8gdGhlIHByZXZpb3VzLCBpbnRlcnJ1cHRlZCBvbmUuCisgKiBPdGhlcndpc2Ugd2UgaGF2ZSBhbm90aGVyIGxldmVsIG9mIGluZGlyZWN0aW9uOiBXZSBmaXJzdCBzYXZlCisgKiB0aGUgYnAgb2YgdGhlIHByZXZpb3VzIHN0YWNrLCB0aGVuIHdlIHN3aXRjaCB0aGUgc3RhY2sgdG8gdGhlIGlycSBvbmUKKyAqIGFuZCBzYXZlIGEgbmV3IGJwIHRoYXQgbGlua3MgdG8gdGhlIHByZXZpb3VzIG9uZS4KKyAqIChTZWUgc2F2ZV9hcmdzKCkpCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworZml4dXBfYnBfaXJxX2xpbmsodW5zaWduZWQgbG9uZyBicCwgdW5zaWduZWQgbG9uZyAqc3RhY2ssCisJCSAgdW5zaWduZWQgbG9uZyAqaXJxX3N0YWNrLCB1bnNpZ25lZCBsb25nICppcnFfc3RhY2tfZW5kKQoreworI2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCisJc3RydWN0IHN0YWNrX2ZyYW1lICpmcmFtZSA9IChzdHJ1Y3Qgc3RhY2tfZnJhbWUgKilicDsKKworCWlmICghaW5faXJxX3N0YWNrKHN0YWNrLCBpcnFfc3RhY2ssIGlycV9zdGFja19lbmQpKQorCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpZnJhbWUtPm5leHRfZnJhbWU7CisjZW5kaWYKKwlyZXR1cm4gYnA7Cit9CisKIC8qCiAgKiB4ODYtNjQgY2FuIGhhdmUgdXAgdG8gdGhyZWUga2VybmVsIHN0YWNrczoKICAqIHByb2Nlc3Mgc3RhY2sKQEAgLTE3NSw3ICsyMDQsNyBAQAogCQkJaXJxX3N0YWNrID0gaXJxX3N0YWNrX2VuZCAtCiAJCQkJKElSUV9TVEFDS19TSVpFIC0gNjQpIC8gc2l6ZW9mKCppcnFfc3RhY2spOwogCi0JCQlpZiAoc3RhY2sgPj0gaXJxX3N0YWNrICYmIHN0YWNrIDwgaXJxX3N0YWNrX2VuZCkgeworCQkJaWYgKGluX2lycV9zdGFjayhzdGFjaywgaXJxX3N0YWNrLCBpcnFfc3RhY2tfZW5kKSkgewogCQkJCWlmIChvcHMtPnN0YWNrKGRhdGEsICJJUlEiKSA8IDApCiAJCQkJCWJyZWFrOwogCQkJCWJwID0gcHJpbnRfY29udGV4dF9zdGFjayh0aW5mbywgc3RhY2ssIGJwLApAQCAtMTg2LDYgKzIxNSw4IEBACiAJCQkJICogcG9pbnRlciAoaW5kZXggLTEgdG8gZW5kKSBpbiB0aGUgSVJRIHN0YWNrOgogCQkJCSAqLwogCQkJCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKikgKGlycV9zdGFja19lbmRbLTFdKTsKKwkJCQlicCA9IGZpeHVwX2JwX2lycV9saW5rKGJwLCBzdGFjaywgaXJxX3N0YWNrLAorCQkJCQkJICAgICAgIGlycV9zdGFja19lbmQpOwogCQkJCWlycV9zdGFja19lbmQgPSBOVUxMOwogCQkJCW9wcy0+c3RhY2soZGF0YSwgIkVPSSIpOwogCQkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2VudHJ5XzY0LlMgYi9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfNjQuUwppbmRleCA2M2JjYTc5Li42NzNmNjkzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfNjQuUworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfNjQuUwpAQCAtMTA3NiwxMCArMTA3NiwxMCBAQAogCVRSQUNFX0lSUVNfT0ZGCiAJbW92cSAlcnNwLCVyZGkJCS8qIHB0X3JlZ3MgcG9pbnRlciAqLwogCXhvcmwgJWVzaSwlZXNpCQkvKiBubyBlcnJvciBjb2RlICovCi0JUEVSX0NQVShpbml0X3RzcywgJXJicCkKLQlzdWJxICRFWENFUFRJT05fU1RLU1osIFRTU19pc3QgKyAoXGlzdCAtIDEpICogOCglcmJwKQorCVBFUl9DUFUoaW5pdF90c3MsICVyMTIpCisJc3VicSAkRVhDRVBUSU9OX1NUS1NaLCBUU1NfaXN0ICsgKFxpc3QgLSAxKSAqIDgoJXIxMikKIAljYWxsIFxkb19zeW0KLQlhZGRxICRFWENFUFRJT05fU1RLU1osIFRTU19pc3QgKyAoXGlzdCAtIDEpICogOCglcmJwKQorCWFkZHEgJEVYQ0VQVElPTl9TVEtTWiwgVFNTX2lzdCArIChcaXN0IC0gMSkgKiA4KCVyMTIpCiAJam1wIHBhcmFub2lkX2V4aXQJLyogJWVieDogbm8gc3dhcGdzIGZsYWcgKi8KIAlDRklfRU5EUFJPQwogRU5EKFxzeW0pCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaHdfYnJlYWtwb2ludC5jIGIvYXJjaC94ODYva2VybmVsL2h3X2JyZWFrcG9pbnQuYwppbmRleCBkNDJmNjVhLi4wNWQ1ZmVjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaHdfYnJlYWtwb2ludC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9od19icmVha3BvaW50LmMKQEAgLTM2Miw4ICszNjIsNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCWlmIChicC0+Y2FsbGJhY2spCi0JCXJldCA9IGFyY2hfc3RvcmVfaW5mbyhicCk7CisJcmV0ID0gYXJjaF9zdG9yZV9pbmZvKGJwKTsKIAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwpAQCAtNTE5LDcgKzUxOCw3IEBACiAJCQlicmVhazsKIAkJfQogCi0JCShicC0+Y2FsbGJhY2spKGJwLCBhcmdzLT5yZWdzKTsKKwkJcGVyZl9icF9ldmVudChicCwgYXJncy0+cmVncyk7CiAKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2tnZGIuYyBiL2FyY2gveDg2L2tlcm5lbC9rZ2RiLmMKaW5kZXggMjBhNWIzNi4uZGQ3NGZlNzIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9rZ2RiLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2tnZGIuYwpAQCAtODYsOSArODYsMTUgQEAKIAlnZGJfcmVnc1tHREJfRFNdCT0gcmVncy0+ZHM7CiAJZ2RiX3JlZ3NbR0RCX0VTXQk9IHJlZ3MtPmVzOwogCWdkYl9yZWdzW0dEQl9DU10JPSByZWdzLT5jczsKLQlnZGJfcmVnc1tHREJfU1NdCT0gX19LRVJORUxfRFM7CiAJZ2RiX3JlZ3NbR0RCX0ZTXQk9IDB4RkZGRjsKIAlnZGJfcmVnc1tHREJfR1NdCT0gMHhGRkZGOworCWlmICh1c2VyX21vZGVfdm0ocmVncykpIHsKKwkJZ2RiX3JlZ3NbR0RCX1NTXSA9IHJlZ3MtPnNzOworCQlnZGJfcmVnc1tHREJfU1BdID0gcmVncy0+c3A7CisJfSBlbHNlIHsKKwkJZ2RiX3JlZ3NbR0RCX1NTXSA9IF9fS0VSTkVMX0RTOworCQlnZGJfcmVnc1tHREJfU1BdID0ga2VybmVsX3N0YWNrX3BvaW50ZXIocmVncyk7CisJfQogI2Vsc2UKIAlnZGJfcmVnc1tHREJfUjhdCT0gcmVncy0+cjg7CiAJZ2RiX3JlZ3NbR0RCX1I5XQk9IHJlZ3MtPnI5OwpAQCAtMTAxLDggKzEwNyw4IEBACiAJZ2RiX3JlZ3MzMltHREJfUFNdCT0gcmVncy0+ZmxhZ3M7CiAJZ2RiX3JlZ3MzMltHREJfQ1NdCT0gcmVncy0+Y3M7CiAJZ2RiX3JlZ3MzMltHREJfU1NdCT0gcmVncy0+c3M7Ci0jZW5kaWYKIAlnZGJfcmVnc1tHREJfU1BdCT0ga2VybmVsX3N0YWNrX3BvaW50ZXIocmVncyk7CisjZW5kaWYKIH0KIAogLyoqCkBAIC0yMjAsOCArMjI2LDcgQEAKIAkJCWRyNyB8PSAoKGJyZWFraW5mb1ticmVha25vXS5sZW4gPDwgMikgfAogCQkJCSBicmVha2luZm9bYnJlYWtub10udHlwZSkgPDwKIAkJCSAgICAgICAoKGJyZWFrbm8gPDwgMikgKyAxNik7Ci0JCQlpZiAoYnJlYWtubyA+PSAwICYmIGJyZWFrbm8gPD0gMykKLQkJCQlzZXRfZGVidWdyZWcoYnJlYWtpbmZvW2JyZWFrbm9dLmFkZHIsIGJyZWFrbm8pOworCQkJc2V0X2RlYnVncmVnKGJyZWFraW5mb1ticmVha25vXS5hZGRyLCBicmVha25vKTsKIAogCQl9IGVsc2UgewogCQkJaWYgKChkcjcgJiBicmVha2JpdCkgJiYgIWJyZWFraW5mb1ticmVha25vXS5lbmFibGVkKSB7CkBAIC0zOTUsNyArNDAwLDYgQEAKIAkJLyogc2V0IHRoZSB0cmFjZSBiaXQgaWYgd2UncmUgc3RlcHBpbmcgKi8KIAkJaWYgKHJlbWNvbUluQnVmZmVyWzBdID09ICdzJykgewogCQkJbGludXhfcmVncy0+ZmxhZ3MgfD0gWDg2X0VGTEFHU19URjsKLQkJCWtnZGJfc2luZ2xlX3N0ZXAgPSAxOwogCQkJYXRvbWljX3NldCgma2dkYl9jcHVfZG9pbmdfc2luZ2xlX3N0ZXAsCiAJCQkJICAgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gveDg2L2tlcm5lbC9wdHJhY2UuYwppbmRleCAwNGQxODJhLi43MDc5ZGRhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3B0cmFjZS5jCkBAIC01NTUsNyArNTU1LDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBwdHJhY2VfdHJpZ2dlcmVkKHN0cnVjdCBwZXJmX2V2ZW50ICpicCwgdm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIHB0cmFjZV90cmlnZ2VyZWQoc3RydWN0IHBlcmZfZXZlbnQgKmJwLCBpbnQgbm1pLAorCQkJICAgICBzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSAqZGF0YSwKKwkJCSAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaW50IGk7CiAJc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRocmVhZCA9ICYoY3VycmVudC0+dGhyZWFkKTsKQEAgLTU5MywxMyArNTk1LDEzIEBACiAJcmV0dXJuIGRyNzsKIH0KIAotc3RhdGljIHN0cnVjdCBwZXJmX2V2ZW50ICoKK3N0YXRpYyBpbnQKIHB0cmFjZV9tb2RpZnlfYnJlYWtwb2ludChzdHJ1Y3QgcGVyZl9ldmVudCAqYnAsIGludCBsZW4sIGludCB0eXBlLAogCQkJIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgZGlzYWJsZWQpCiB7CiAJaW50IGVycjsKIAlpbnQgZ2VuX2xlbiwgZ2VuX3R5cGU7Ci0JREVGSU5FX0JSRUFLUE9JTlRfQVRUUihhdHRyKTsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIGF0dHI7CiAKIAkvKgogCSAqIFdlIHNob3VkIGhhdmUgYXQgbGVhc3QgYW4gaW5hY3RpdmUgYnJlYWtwb2ludCBhdCB0aGlzCkBAIC02MDcsMTggKzYwOSwxOCBAQAogCSAqIHdyaXR0ZW4gdGhlIGFkZHJlc3MgcmVnaXN0ZXIgZmlyc3QKIAkgKi8KIAlpZiAoIWJwKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAllcnIgPSBhcmNoX2JwX2dlbmVyaWNfZmllbGRzKGxlbiwgdHlwZSwgJmdlbl9sZW4sICZnZW5fdHlwZSk7CiAJaWYgKGVycikKLQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwkJcmV0dXJuIGVycjsKIAogCWF0dHIgPSBicC0+YXR0cjsKIAlhdHRyLmJwX2xlbiA9IGdlbl9sZW47CiAJYXR0ci5icF90eXBlID0gZ2VuX3R5cGU7CiAJYXR0ci5kaXNhYmxlZCA9IGRpc2FibGVkOwogCi0JcmV0dXJuIG1vZGlmeV91c2VyX2h3X2JyZWFrcG9pbnQoYnAsICZhdHRyLCBicC0+Y2FsbGJhY2ssIHRzayk7CisJcmV0dXJuIG1vZGlmeV91c2VyX2h3X2JyZWFrcG9pbnQoYnAsICZhdHRyKTsKIH0KIAogLyoKQEAgLTY1NiwyOCArNjU4LDE3IEBACiAJCQkJaWYgKCFzZWNvbmRfcGFzcykKIAkJCQkJY29udGludWU7CiAKLQkJCQl0aHJlYWQtPnB0cmFjZV9icHNbaV0gPSBOVUxMOwotCQkJCWJwID0gcHRyYWNlX21vZGlmeV9icmVha3BvaW50KGJwLCBsZW4sIHR5cGUsCisJCQkJcmMgPSBwdHJhY2VfbW9kaWZ5X2JyZWFrcG9pbnQoYnAsIGxlbiwgdHlwZSwKIAkJCQkJCQkgICAgICB0c2ssIDEpOwotCQkJCWlmIChJU19FUlIoYnApKSB7Ci0JCQkJCXJjID0gUFRSX0VSUihicCk7Ci0JCQkJCXRocmVhZC0+cHRyYWNlX2Jwc1tpXSA9IE5VTEw7CisJCQkJaWYgKHJjKQogCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJdGhyZWFkLT5wdHJhY2VfYnBzW2ldID0gYnA7CiAJCQl9CiAJCQljb250aW51ZTsKIAkJfQogCi0JCWJwID0gcHRyYWNlX21vZGlmeV9icmVha3BvaW50KGJwLCBsZW4sIHR5cGUsIHRzaywgMCk7Ci0KLQkJLyogSW5jb3JyZWN0IGJwLCBvciB3ZSBoYXZlIGEgYnVnIGluIGJwIEFQSSAqLwotCQlpZiAoSVNfRVJSKGJwKSkgewotCQkJcmMgPSBQVFJfRVJSKGJwKTsKLQkJCXRocmVhZC0+cHRyYWNlX2Jwc1tpXSA9IE5VTEw7CisJCXJjID0gcHRyYWNlX21vZGlmeV9icmVha3BvaW50KGJwLCBsZW4sIHR5cGUsIHRzaywgMCk7CisJCWlmIChyYykKIAkJCWJyZWFrOwotCQl9Ci0JCXRocmVhZC0+cHRyYWNlX2Jwc1tpXSA9IGJwOwogCX0KIAkvKgogCSAqIE1ha2UgYSBzZWNvbmQgcGFzcyB0byBmcmVlIHRoZSByZW1haW5pbmcgdW51c2VkIGJyZWFrcG9pbnRzCkBAIC03MjEsOSArNzEyLDEwIEBACiB7CiAJc3RydWN0IHBlcmZfZXZlbnQgKmJwOwogCXN0cnVjdCB0aHJlYWRfc3RydWN0ICp0ID0gJnRzay0+dGhyZWFkOwotCURFRklORV9CUkVBS1BPSU5UX0FUVFIoYXR0cik7CisJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciBhdHRyOwogCiAJaWYgKCF0LT5wdHJhY2VfYnBzW25yXSkgeworCQlod19icmVha3BvaW50X2luaXQoJmF0dHIpOwogCQkvKgogCQkgKiBQdXQgc3R1YiBsZW4gYW5kIHR5cGUgdG8gcmVnaXN0ZXIgKHJlc2VydmUpIGFuIGluYWN0aXZlIGJ1dAogCQkgKiBjb3JyZWN0IGJwCkBAIC03MzQsMjYgKzcyNiwzMiBAQAogCQlhdHRyLmRpc2FibGVkID0gMTsKIAogCQlicCA9IHJlZ2lzdGVyX3VzZXJfaHdfYnJlYWtwb2ludCgmYXR0ciwgcHRyYWNlX3RyaWdnZXJlZCwgdHNrKTsKKworCQkvKgorCQkgKiBDSEVDS01FOiB0aGUgcHJldmlvdXMgY29kZSByZXR1cm5lZCAtRUlPIGlmIHRoZSBhZGRyIHdhc24ndAorCQkgKiBhIHZhbGlkIHRhc2sgdmlydHVhbCBhZGRyLiBUaGUgbmV3IG9uZSB3aWxsIHJldHVybiAtRUlOVkFMIGluCisJCSAqICB0aGlzIGNhc2UuCisJCSAqIC1FSU5WQUwgbWF5IGJlIHdoYXQgd2Ugd2FudCBmb3IgaW4ta2VybmVsIGJyZWFrcG9pbnRzIHVzZXJzLAorCQkgKiBidXQgLUVJTyBsb29rcyBiZXR0ZXIgZm9yIHB0cmFjZSwgc2luY2Ugd2UgcmVmdXNlIGEgcmVnaXN0ZXIKKwkJICogd3JpdGluZyBmb3IgdGhlIHVzZXIuIEFuZCBhbnl3YXkgdGhpcyBpcyB0aGUgcHJldmlvdXMKKwkJICogYmVoYXZpb3VyLgorCQkgKi8KKwkJaWYgKElTX0VSUihicCkpCisJCQlyZXR1cm4gUFRSX0VSUihicCk7CisKKwkJdC0+cHRyYWNlX2Jwc1tucl0gPSBicDsKIAl9IGVsc2UgeworCQlpbnQgZXJyOworCiAJCWJwID0gdC0+cHRyYWNlX2Jwc1tucl07Ci0JCXQtPnB0cmFjZV9icHNbbnJdID0gTlVMTDsKIAogCQlhdHRyID0gYnAtPmF0dHI7CiAJCWF0dHIuYnBfYWRkciA9IGFkZHI7Ci0JCWJwID0gbW9kaWZ5X3VzZXJfaHdfYnJlYWtwb2ludChicCwgJmF0dHIsIGJwLT5jYWxsYmFjaywgdHNrKTsKKwkJZXJyID0gbW9kaWZ5X3VzZXJfaHdfYnJlYWtwb2ludChicCwgJmF0dHIpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAl9Ci0JLyoKLQkgKiBDSEVDS01FOiB0aGUgcHJldmlvdXMgY29kZSByZXR1cm5lZCAtRUlPIGlmIHRoZSBhZGRyIHdhc24ndCBhCi0JICogdmFsaWQgdGFzayB2aXJ0dWFsIGFkZHIuIFRoZSBuZXcgb25lIHdpbGwgcmV0dXJuIC1FSU5WQUwgaW4gdGhpcwotCSAqIGNhc2UuCi0JICogLUVJTlZBTCBtYXkgYmUgd2hhdCB3ZSB3YW50IGZvciBpbi1rZXJuZWwgYnJlYWtwb2ludHMgdXNlcnMsIGJ1dAotCSAqIC1FSU8gbG9va3MgYmV0dGVyIGZvciBwdHJhY2UsIHNpbmNlIHdlIHJlZnVzZSBhIHJlZ2lzdGVyIHdyaXRpbmcKLQkgKiBmb3IgdGhlIHVzZXIuIEFuZCBhbnl3YXkgdGhpcyBpcyB0aGUgcHJldmlvdXMgYmVoYXZpb3VyLgotCSAqLwotCWlmIChJU19FUlIoYnApKQotCQlyZXR1cm4gUFRSX0VSUihicCk7CiAKLQl0LT5wdHJhY2VfYnBzW25yXSA9IGJwOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc3lzX2kzODZfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9zeXNfaTM4Nl8zMi5jCmluZGV4IDE4ODRhOGQuLmRlZTFmZjcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9zeXNfaTM4Nl8zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zeXNfaTM4Nl8zMi5jCkBAIC0yNCwzMSArMjQsNiBAQAogCiAjaW5jbHVkZSA8YXNtL3N5c2NhbGxzLmg+CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfbW1hcDIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQkJCSAgdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLAotCQkJICB1bnNpZ25lZCBsb25nIGZkLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQotewotCWludCBlcnJvciA9IC1FQkFERjsKLQlzdHJ1Y3QgZmlsZSAqZmlsZSA9IE5VTEw7Ci0Jc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKLQotCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGZkKTsKLQkJaWYgKCFmaWxlKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKLQllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOwotCXVwX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwotCi0JaWYgKGZpbGUpCi0JCWZwdXQoZmlsZSk7Ci1vdXQ6Ci0JcmV0dXJuIGVycm9yOwotfQotCiAvKgogICogUGVyZm9ybSB0aGUgc2VsZWN0KG5kLCBpbiwgb3V0LCBleCwgdHYpIGFuZCBtbWFwKCkgc3lzdGVtCiAgKiBjYWxscy4gTGludXgvaTM4NiBkaWRuJ3QgdXNlIHRvIGJlIGFibGUgdG8gaGFuZGxlIG1vcmUgdGhhbgpAQCAtNzcsNyArNTIsNyBAQAogCWlmIChhLm9mZnNldCAmIH5QQUdFX01BU0spCiAJCWdvdG8gb3V0OwogCi0JZXJyID0gc3lzX21tYXAyKGEuYWRkciwgYS5sZW4sIGEucHJvdCwgYS5mbGFncywKKwllcnIgPSBzeXNfbW1hcF9wZ29mZihhLmFkZHIsIGEubGVuLCBhLnByb3QsIGEuZmxhZ3MsCiAJCQlhLmZkLCBhLm9mZnNldCA+PiBQQUdFX1NISUZUKTsKIG91dDoKIAlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3N5c194ODZfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9zeXNfeDg2XzY0LmMKaW5kZXggNDVlMDBlYi4uOGFhMjA1NyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3N5c194ODZfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc3lzX3g4Nl82NC5jCkBAIC0yMywyNiArMjMsMTEgQEAKIAkJdW5zaWduZWQgbG9uZywgZmQsIHVuc2lnbmVkIGxvbmcsIG9mZikKIHsKIAlsb25nIGVycm9yOwotCXN0cnVjdCBmaWxlICpmaWxlOwotCiAJZXJyb3IgPSAtRUlOVkFMOwogCWlmIChvZmYgJiB+UEFHRV9NQVNLKQogCQlnb3RvIG91dDsKIAotCWVycm9yID0gLUVCQURGOwotCWZpbGUgPSBOVUxMOwotCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGZkKTsKLQkJaWYgKCFmaWxlKQotCQkJZ290byBvdXQ7Ci0JfQotCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JZXJyb3IgPSBkb19tbWFwX3Bnb2ZmKGZpbGUsIGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIG9mZiA+PiBQQUdFX1NISUZUKTsKLQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQotCWlmIChmaWxlKQotCQlmcHV0KGZpbGUpOworCWVycm9yID0gc3lzX21tYXBfcGdvZmYoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsIG9mZiA+PiBQQUdFX1NISUZUKTsKIG91dDoKIAlyZXR1cm4gZXJyb3I7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc3lzY2FsbF90YWJsZV8zMi5TIGIvYXJjaC94ODYva2VybmVsL3N5c2NhbGxfdGFibGVfMzIuUwppbmRleCA3MGMyMTI1Li4xNTIyOGI1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc3lzY2FsbF90YWJsZV8zMi5TCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zeXNjYWxsX3RhYmxlXzMyLlMKQEAgLTE5MSw3ICsxOTEsNyBAQAogCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIHJlc2VydmVkIGZvciBzdHJlYW1zMiAqLwogCS5sb25nIHB0cmVnc192Zm9yawkvKiAxOTAgKi8KIAkubG9uZyBzeXNfZ2V0cmxpbWl0Ci0JLmxvbmcgc3lzX21tYXAyCisJLmxvbmcgc3lzX21tYXBfcGdvZmYKIAkubG9uZyBzeXNfdHJ1bmNhdGU2NAogCS5sb25nIHN5c19mdHJ1bmNhdGU2NAogCS5sb25nIHN5c19zdGF0NjQJLyogMTk1ICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vc3ZtLmMgYi9hcmNoL3g4Ni9rdm0vc3ZtLmMKaW5kZXggM2RlMGIzNy4uMWQ5YjMzOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL3N2bS5jCisrKyBiL2FyY2gveDg2L2t2bS9zdm0uYwpAQCAtMzE2LDcgKzMxNiw3IEBACiBzdGF0aWMgaW50IHN2bV9oYXJkd2FyZV9lbmFibGUodm9pZCAqZ2FyYmFnZSkKIHsKIAotCXN0cnVjdCBzdm1fY3B1X2RhdGEgKnN2bV9kYXRhOworCXN0cnVjdCBzdm1fY3B1X2RhdGEgKnNkOwogCXVpbnQ2NF90IGVmZXI7CiAJc3RydWN0IGRlc2NyaXB0b3JfdGFibGUgZ2R0X2Rlc2NyOwogCXN0cnVjdCBkZXNjX3N0cnVjdCAqZ2R0OwpAQCAtMzMxLDYzICszMzEsNjEgQEAKIAkJICAgICAgIG1lKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXN2bV9kYXRhID0gcGVyX2NwdShzdm1fZGF0YSwgbWUpOworCXNkID0gcGVyX2NwdShzdm1fZGF0YSwgbWUpOwogCi0JaWYgKCFzdm1fZGF0YSkgeworCWlmICghc2QpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJzdm1faGFyZHdhcmVfZW5hYmxlOiBzdm1fZGF0YSBpcyBOVUxMIG9uICVkXG4iLAogCQkgICAgICAgbWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlzdm1fZGF0YS0+YXNpZF9nZW5lcmF0aW9uID0gMTsKLQlzdm1fZGF0YS0+bWF4X2FzaWQgPSBjcHVpZF9lYngoU1ZNX0NQVUlEX0ZVTkMpIC0gMTsKLQlzdm1fZGF0YS0+bmV4dF9hc2lkID0gc3ZtX2RhdGEtPm1heF9hc2lkICsgMTsKKwlzZC0+YXNpZF9nZW5lcmF0aW9uID0gMTsKKwlzZC0+bWF4X2FzaWQgPSBjcHVpZF9lYngoU1ZNX0NQVUlEX0ZVTkMpIC0gMTsKKwlzZC0+bmV4dF9hc2lkID0gc2QtPm1heF9hc2lkICsgMTsKIAogCWt2bV9nZXRfZ2R0KCZnZHRfZGVzY3IpOwogCWdkdCA9IChzdHJ1Y3QgZGVzY19zdHJ1Y3QgKilnZHRfZGVzY3IuYmFzZTsKLQlzdm1fZGF0YS0+dHNzX2Rlc2MgPSAoc3RydWN0IGt2bV9sZHR0c3NfZGVzYyAqKShnZHQgKyBHRFRfRU5UUllfVFNTKTsKKwlzZC0+dHNzX2Rlc2MgPSAoc3RydWN0IGt2bV9sZHR0c3NfZGVzYyAqKShnZHQgKyBHRFRfRU5UUllfVFNTKTsKIAogCXdybXNybChNU1JfRUZFUiwgZWZlciB8IEVGRVJfU1ZNRSk7CiAKLQl3cm1zcmwoTVNSX1ZNX0hTQVZFX1BBLAotCSAgICAgICBwYWdlX3RvX3Bmbihzdm1fZGF0YS0+c2F2ZV9hcmVhKSA8PCBQQUdFX1NISUZUKTsKKwl3cm1zcmwoTVNSX1ZNX0hTQVZFX1BBLCBwYWdlX3RvX3BmbihzZC0+c2F2ZV9hcmVhKSA8PCBQQUdFX1NISUZUKTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBzdm1fY3B1X3VuaW5pdChpbnQgY3B1KQogewotCXN0cnVjdCBzdm1fY3B1X2RhdGEgKnN2bV9kYXRhCi0JCT0gcGVyX2NwdShzdm1fZGF0YSwgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CisJc3RydWN0IHN2bV9jcHVfZGF0YSAqc2QgPSBwZXJfY3B1KHN2bV9kYXRhLCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAotCWlmICghc3ZtX2RhdGEpCisJaWYgKCFzZCkKIAkJcmV0dXJuOwogCiAJcGVyX2NwdShzdm1fZGF0YSwgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSkgPSBOVUxMOwotCV9fZnJlZV9wYWdlKHN2bV9kYXRhLT5zYXZlX2FyZWEpOwotCWtmcmVlKHN2bV9kYXRhKTsKKwlfX2ZyZWVfcGFnZShzZC0+c2F2ZV9hcmVhKTsKKwlrZnJlZShzZCk7CiB9CiAKIHN0YXRpYyBpbnQgc3ZtX2NwdV9pbml0KGludCBjcHUpCiB7Ci0Jc3RydWN0IHN2bV9jcHVfZGF0YSAqc3ZtX2RhdGE7CisJc3RydWN0IHN2bV9jcHVfZGF0YSAqc2Q7CiAJaW50IHI7CiAKLQlzdm1fZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzdm1fY3B1X2RhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXN2bV9kYXRhKQorCXNkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHN2bV9jcHVfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghc2QpCiAJCXJldHVybiAtRU5PTUVNOwotCXN2bV9kYXRhLT5jcHUgPSBjcHU7Ci0Jc3ZtX2RhdGEtPnNhdmVfYXJlYSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJc2QtPmNwdSA9IGNwdTsKKwlzZC0+c2F2ZV9hcmVhID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKIAlyID0gLUVOT01FTTsKLQlpZiAoIXN2bV9kYXRhLT5zYXZlX2FyZWEpCisJaWYgKCFzZC0+c2F2ZV9hcmVhKQogCQlnb3RvIGVycl8xOwogCi0JcGVyX2NwdShzdm1fZGF0YSwgY3B1KSA9IHN2bV9kYXRhOworCXBlcl9jcHUoc3ZtX2RhdGEsIGNwdSkgPSBzZDsKIAogCXJldHVybiAwOwogCiBlcnJfMToKLQlrZnJlZShzdm1fZGF0YSk7CisJa2ZyZWUoc2QpOwogCXJldHVybiByOwogCiB9CkBAIC0xMDkyLDE2ICsxMDkwLDE2IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIHZvaWQgbmV3X2FzaWQoc3RydWN0IHZjcHVfc3ZtICpzdm0sIHN0cnVjdCBzdm1fY3B1X2RhdGEgKnN2bV9kYXRhKQorc3RhdGljIHZvaWQgbmV3X2FzaWQoc3RydWN0IHZjcHVfc3ZtICpzdm0sIHN0cnVjdCBzdm1fY3B1X2RhdGEgKnNkKQogewotCWlmIChzdm1fZGF0YS0+bmV4dF9hc2lkID4gc3ZtX2RhdGEtPm1heF9hc2lkKSB7Ci0JCSsrc3ZtX2RhdGEtPmFzaWRfZ2VuZXJhdGlvbjsKLQkJc3ZtX2RhdGEtPm5leHRfYXNpZCA9IDE7CisJaWYgKHNkLT5uZXh0X2FzaWQgPiBzZC0+bWF4X2FzaWQpIHsKKwkJKytzZC0+YXNpZF9nZW5lcmF0aW9uOworCQlzZC0+bmV4dF9hc2lkID0gMTsKIAkJc3ZtLT52bWNiLT5jb250cm9sLnRsYl9jdGwgPSBUTEJfQ09OVFJPTF9GTFVTSF9BTExfQVNJRDsKIAl9CiAKLQlzdm0tPmFzaWRfZ2VuZXJhdGlvbiA9IHN2bV9kYXRhLT5hc2lkX2dlbmVyYXRpb247Ci0Jc3ZtLT52bWNiLT5jb250cm9sLmFzaWQgPSBzdm1fZGF0YS0+bmV4dF9hc2lkKys7CisJc3ZtLT5hc2lkX2dlbmVyYXRpb24gPSBzZC0+YXNpZF9nZW5lcmF0aW9uOworCXN2bS0+dm1jYi0+Y29udHJvbC5hc2lkID0gc2QtPm5leHRfYXNpZCsrOwogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzdm1fZ2V0X2RyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IGRyKQpAQCAtMjQyOSw4ICsyNDI3LDggQEAKIHsKIAlpbnQgY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKIAotCXN0cnVjdCBzdm1fY3B1X2RhdGEgKnN2bV9kYXRhID0gcGVyX2NwdShzdm1fZGF0YSwgY3B1KTsKLQlzdm1fZGF0YS0+dHNzX2Rlc2MtPnR5cGUgPSA5OyAvKiBhdmFpbGFibGUgMzIvNjQtYml0IFRTUyAqLworCXN0cnVjdCBzdm1fY3B1X2RhdGEgKnNkID0gcGVyX2NwdShzdm1fZGF0YSwgY3B1KTsKKwlzZC0+dHNzX2Rlc2MtPnR5cGUgPSA5OyAvKiBhdmFpbGFibGUgMzIvNjQtYml0IFRTUyAqLwogCWxvYWRfVFJfZGVzYygpOwogfQogCkBAIC0yNDM4LDEyICsyNDM2LDEyIEBACiB7CiAJaW50IGNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CiAKLQlzdHJ1Y3Qgc3ZtX2NwdV9kYXRhICpzdm1fZGF0YSA9IHBlcl9jcHUoc3ZtX2RhdGEsIGNwdSk7CisJc3RydWN0IHN2bV9jcHVfZGF0YSAqc2QgPSBwZXJfY3B1KHN2bV9kYXRhLCBjcHUpOwogCiAJc3ZtLT52bWNiLT5jb250cm9sLnRsYl9jdGwgPSBUTEJfQ09OVFJPTF9ET19OT1RISU5HOwogCS8qIEZJWE1FOiBoYW5kbGUgd3JhcGFyb3VuZCBvZiBhc2lkX2dlbmVyYXRpb24gKi8KLQlpZiAoc3ZtLT5hc2lkX2dlbmVyYXRpb24gIT0gc3ZtX2RhdGEtPmFzaWRfZ2VuZXJhdGlvbikKLQkJbmV3X2FzaWQoc3ZtLCBzdm1fZGF0YSk7CisJaWYgKHN2bS0+YXNpZF9nZW5lcmF0aW9uICE9IHNkLT5hc2lkX2dlbmVyYXRpb24pCisJCW5ld19hc2lkKHN2bSwgc2QpOwogfQogCiBzdGF0aWMgdm9pZCBzdm1faW5qZWN0X25taShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9saWIvTWFrZWZpbGUgYi9hcmNoL3g4Ni9saWIvTWFrZWZpbGUKaW5kZXggYTJkNjQ3Mi4uNDViMjBlNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGliL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L2xpYi9NYWtlZmlsZQpAQCAtNSw3ICs1LDcgQEAKIGluYXRfdGFibGVzX3NjcmlwdCA9ICQoc3JjdHJlZSkvYXJjaC94ODYvdG9vbHMvZ2VuLWluc24tYXR0ci14ODYuYXdrCiBpbmF0X3RhYmxlc19tYXBzID0gJChzcmN0cmVlKS9hcmNoL3g4Ni9saWIveDg2LW9wY29kZS1tYXAudHh0CiBxdWlldF9jbWRfaW5hdF90YWJsZXMgPSBHRU4gICAgICRACi0gICAgICBjbWRfaW5hdF90YWJsZXMgPSAkKEFXSykgLWYgJChpbmF0X3RhYmxlc19zY3JpcHQpICQoaW5hdF90YWJsZXNfbWFwcykgPiAkQAorICAgICAgY21kX2luYXRfdGFibGVzID0gJChBV0spIC1mICQoaW5hdF90YWJsZXNfc2NyaXB0KSAkKGluYXRfdGFibGVzX21hcHMpID4gJEAgfHwgcm0gLWYgJEAKIAogJChvYmopL2luYXQtdGFibGVzLmM6ICQoaW5hdF90YWJsZXNfc2NyaXB0KSAkKGluYXRfdGFibGVzX21hcHMpCiAJJChjYWxsIGNtZCxpbmF0X3RhYmxlcykKQEAgLTIwLDcgKzIwLDcgQEAKIGxpYi15ICs9IHRodW5rXyQoQklUUykubwogbGliLXkgKz0gdXNlcmNvcHlfJChCSVRTKS5vIGdldHVzZXIubyBwdXR1c2VyLm8KIGxpYi15ICs9IG1lbWNweV8kKEJJVFMpLm8KLWxpYi15ICs9IGluc24ubyBpbmF0Lm8KK2xpYi0kKENPTkZJR19LUFJPQkVTKSArPSBpbnNuLm8gaW5hdC5vCiAKIG9iai15ICs9IG1zci1yZWcubyBtc3ItcmVnLWV4cG9ydC5vCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL3BhdC5jIGIvYXJjaC94ODYvbW0vcGF0LmMKaW5kZXggNjZiNTVkNi4uYWU5NjQ4ZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vcGF0LmMKKysrIGIvYXJjaC94ODYvbW0vcGF0LmMKQEAgLTcwNCw5ICs3MDQsOCBAQAogCWlmICghcmFuZ2VfaXNfYWxsb3dlZChwZm4sIHNpemUpKQogCQlyZXR1cm4gMDsKIAotCWlmIChmaWxlLT5mX2ZsYWdzICYgT19TWU5DKSB7CisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX0RTWU5DKQogCQlmbGFncyA9IF9QQUdFX0NBQ0hFX1VDX01JTlVTOwotCX0KIAogI2lmZGVmIENPTkZJR19YODZfMzIKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL01ha2VmaWxlIGIvYXJjaC94ODYvcGNpL01ha2VmaWxlCmluZGV4IGQ0OTIwMmUuLjU2NGIwMDggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9wY2kvTWFrZWZpbGUKQEAgLTE1LDMgKzE1LDggQEAKIAogb2JqLXkJCQkJKz0gY29tbW9uLm8gZWFybHkubwogb2JqLXkJCQkJKz0gYW1kX2J1cy5vCitvYmotJChDT05GSUdfWDg2XzY0KQkJKz0gYnVzX251bWEubyBpbnRlbF9idXMubworCitpZmVxICgkKENPTkZJR19QQ0lfREVCVUcpLHkpCitFWFRSQV9DRkxBR1MgKz0gLURERUJVRworZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9hY3BpLmMgYi9hcmNoL3g4Ni9wY2kvYWNwaS5jCmluZGV4IDEwMTRlYjQuLjk1OWU1NDggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9hY3BpLmMKKysrIGIvYXJjaC94ODYvcGNpL2FjcGkuYwpAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlIDxhc20vcGNpX3g4Ni5oPgogCiBzdHJ1Y3QgcGNpX3Jvb3RfaW5mbyB7CisJc3RydWN0IGFjcGlfZGV2aWNlICpicmlkZ2U7CiAJY2hhciAqbmFtZTsKIAl1bnNpZ25lZCBpbnQgcmVzX251bTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKQEAgLTU4LDYgKzU5LDMwIEBACiAJcmV0dXJuIGZhbHNlOwogfQogCitzdGF0aWMgdm9pZAorYWxpZ25fcmVzb3VyY2Uoc3RydWN0IGFjcGlfZGV2aWNlICpicmlkZ2UsIHN0cnVjdCByZXNvdXJjZSAqcmVzKQoreworCWludCBhbGlnbiA9IChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pID8gMTYgOiA0OworCisJLyoKKwkgKiBIb3N0IGJyaWRnZSB3aW5kb3dzIGFyZSBub3QgQkFScywgYnV0IHRoZSBkZWNvZGVycyBvbiB0aGUgUENJIHNpZGUKKwkgKiB0aGF0IGNsYWltIHRoaXMgYWRkcmVzcyBzcGFjZSBoYXZlIHN0YXJ0aW5nIGFsaWdubWVudCBhbmQgbGVuZ3RoCisJICogY29uc3RyYWludHMsIHNvIGZpeCBhbnkgb2J2aW91cyBCSU9TIGdvb2ZzLgorCSAqLworCWlmICghSVNfQUxJR05FRChyZXMtPnN0YXJ0LCBhbGlnbikpIHsKKwkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmYnJpZGdlLT5kZXYsCisJCQkgICAiaG9zdCBicmlkZ2Ugd2luZG93ICVwUiBpbnZhbGlkOyAiCisJCQkgICAiYWxpZ25pbmcgc3RhcnQgdG8gJWQtYnl0ZSBib3VuZGFyeVxuIiwgcmVzLCBhbGlnbik7CisJCXJlcy0+c3RhcnQgJj0gfihhbGlnbiAtIDEpOworCX0KKwlpZiAoIUlTX0FMSUdORUQocmVzLT5lbmQgKyAxLCBhbGlnbikpIHsKKwkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmYnJpZGdlLT5kZXYsCisJCQkgICAiaG9zdCBicmlkZ2Ugd2luZG93ICVwUiBpbnZhbGlkOyAiCisJCQkgICAiYWxpZ25pbmcgZW5kIHRvICVkLWJ5dGUgYm91bmRhcnlcbiIsIHJlcywgYWxpZ24pOworCQlyZXMtPmVuZCA9IEFMSUdOKHJlcy0+ZW5kLCBhbGlnbikgLSAxOworCX0KK30KKwogc3RhdGljIGFjcGlfc3RhdHVzCiBzZXR1cF9yZXNvdXJjZShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqYWNwaV9yZXMsIHZvaWQgKmRhdGEpCiB7CkBAIC05MSwxMSArMTE2LDEyIEBACiAJc3RhcnQgPSBhZGRyLm1pbmltdW0gKyBhZGRyLnRyYW5zbGF0aW9uX29mZnNldDsKIAllbmQgPSBzdGFydCArIGFkZHIuYWRkcmVzc19sZW5ndGggLSAxOwogCWlmIChpbmZvLT5yZXNfbnVtID49IG1heF9yb290X2J1c19yZXNvdXJjZXMpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUENJOiBGYWlsZWQgdG8gYWxsb2NhdGUgMHglbHgtMHglbHggIgotCQkJImZyb20gJXMgZm9yICVzIGR1ZSB0byBfQ1JTIHJldHVybmluZyBtb3JlIHRoYW4gIgotCQkJIiVkIHJlc291cmNlIGRlc2NyaXB0b3JzXG4iLCAodW5zaWduZWQgbG9uZykgc3RhcnQsCi0JCQkodW5zaWduZWQgbG9uZykgZW5kLCByb290LT5uYW1lLCBpbmZvLT5uYW1lLAotCQkJbWF4X3Jvb3RfYnVzX3Jlc291cmNlcyk7CisJCWlmIChwY2lfcHJvYmUgJiBQQ0lfVVNFX19DUlMpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0k6IEZhaWxlZCB0byBhbGxvY2F0ZSAiCisJCQkgICAgICAgIjB4JWx4LTB4JWx4IGZyb20gJXMgZm9yICVzIGR1ZSB0byBfQ1JTICIKKwkJCSAgICAgICAicmV0dXJuaW5nIG1vcmUgdGhhbiAlZCByZXNvdXJjZSBkZXNjcmlwdG9yc1xuIiwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZykgc3RhcnQsICh1bnNpZ25lZCBsb25nKSBlbmQsCisJCQkgICAgICAgcm9vdC0+bmFtZSwgaW5mby0+bmFtZSwgbWF4X3Jvb3RfYnVzX3Jlc291cmNlcyk7CiAJCXJldHVybiBBRV9PSzsKIAl9CiAKQEAgLTEwNSwxNCArMTMxLDI4IEBACiAJcmVzLT5zdGFydCA9IHN0YXJ0OwogCXJlcy0+ZW5kID0gZW5kOwogCXJlcy0+Y2hpbGQgPSBOVUxMOworCWFsaWduX3Jlc291cmNlKGluZm8tPmJyaWRnZSwgcmVzKTsKKworCWlmICghKHBjaV9wcm9iZSAmIFBDSV9VU0VfX0NSUykpIHsKKwkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmaW5mby0+YnJpZGdlLT5kZXYsCisJCQkgICAiaG9zdCBicmlkZ2Ugd2luZG93ICVwUiAoaWdub3JlZClcbiIsIHJlcyk7CisJCXJldHVybiBBRV9PSzsKKwl9CiAKIAlpZiAoaW5zZXJ0X3Jlc291cmNlKHJvb3QsIHJlcykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IEZhaWxlZCB0byBhbGxvY2F0ZSAweCVseC0weCVseCAiCi0JCQkiZnJvbSAlcyBmb3IgJXNcbiIsICh1bnNpZ25lZCBsb25nKSByZXMtPnN0YXJ0LAotCQkJKHVuc2lnbmVkIGxvbmcpIHJlcy0+ZW5kLCByb290LT5uYW1lLCBpbmZvLT5uYW1lKTsKKwkJZGV2X2VycigmaW5mby0+YnJpZGdlLT5kZXYsCisJCQkiY2FuJ3QgYWxsb2NhdGUgaG9zdCBicmlkZ2Ugd2luZG93ICVwUlxuIiwgcmVzKTsKIAl9IGVsc2UgewogCQlpbmZvLT5idXMtPnJlc291cmNlW2luZm8tPnJlc19udW1dID0gcmVzOwogCQlpbmZvLT5yZXNfbnVtKys7CisJCWlmIChhZGRyLnRyYW5zbGF0aW9uX29mZnNldCkKKwkJCWRldl9pbmZvKCZpbmZvLT5icmlkZ2UtPmRldiwgImhvc3QgYnJpZGdlIHdpbmRvdyAlcFIgIgorCQkJCSAiKFBDSSBhZGRyZXNzIFslI2xseC0lI2xseF0pXG4iLAorCQkJCSByZXMsIHJlcy0+c3RhcnQgLSBhZGRyLnRyYW5zbGF0aW9uX29mZnNldCwKKwkJCQkgcmVzLT5lbmQgLSBhZGRyLnRyYW5zbGF0aW9uX29mZnNldCk7CisJCWVsc2UKKwkJCWRldl9pbmZvKCZpbmZvLT5icmlkZ2UtPmRldiwKKwkJCQkgImhvc3QgYnJpZGdlIHdpbmRvdyAlcFJcbiIsIHJlcyk7CiAJfQogCXJldHVybiBBRV9PSzsKIH0KQEAgLTEyNCw2ICsxNjQsMTIgQEAKIAlzdHJ1Y3QgcGNpX3Jvb3RfaW5mbyBpbmZvOwogCXNpemVfdCBzaXplOwogCisJaWYgKCEocGNpX3Byb2JlICYgUENJX1VTRV9fQ1JTKSkKKwkJZGV2X2luZm8oJmRldmljZS0+ZGV2LAorCQkJICJpZ25vcmluZyBob3N0IGJyaWRnZSB3aW5kb3dzIGZyb20gQUNQSTsgIgorCQkJICJib290IHdpdGggXCJwY2k9dXNlX2Nyc1wiIHRvIHVzZSB0aGVtXG4iKTsKKworCWluZm8uYnJpZGdlID0gZGV2aWNlOwogCWluZm8uYnVzID0gYnVzOwogCWluZm8ucmVzX251bSA9IDA7CiAJYWNwaV93YWxrX3Jlc291cmNlcyhkZXZpY2UtPmhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywgY291bnRfcmVzb3VyY2UsCkBAIC0xNjMsOCArMjA5LDkgQEAKICNlbmRpZgogCiAJaWYgKGRvbWFpbiAmJiAhcGNpX2RvbWFpbnNfc3VwcG9ydGVkKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlBDSTogTXVsdGlwbGUgZG9tYWlucyBub3Qgc3VwcG9ydGVkICIKLQkJICAgICAgICIoZG9tICVkLCBidXMgJWQpXG4iLCBkb21haW4sIGJ1c251bSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInBjaV9idXMgJTA0eDolMDJ4OiAiCisJCSAgICAgICAiaWdub3JlZCAobXVsdGlwbGUgZG9tYWlucyBub3Qgc3VwcG9ydGVkKVxuIiwKKwkJICAgICAgIGRvbWFpbiwgYnVzbnVtKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0xODgsNyArMjM1LDggQEAKIAkgKi8KIAlzZCA9IGt6YWxsb2Moc2l6ZW9mKCpzZCksIEdGUF9LRVJORUwpOwogCWlmICghc2QpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IE9PTSwgbm90IHByb2JpbmcgUENJIGJ1cyAlMDJ4XG4iLCBidXNudW0pOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJwY2lfYnVzICUwNHg6JTAyeDogIgorCQkgICAgICAgImlnbm9yZWQgKG91dCBvZiBtZW1vcnkpXG4iLCBkb21haW4sIGJ1c251bSk7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtMjA5LDkgKzI1Nyw3IEBACiAJfSBlbHNlIHsKIAkJYnVzID0gcGNpX2NyZWF0ZV9idXMoTlVMTCwgYnVzbnVtLCAmcGNpX3Jvb3Rfb3BzLCBzZCk7CiAJCWlmIChidXMpIHsKLQkJCWlmIChwY2lfcHJvYmUgJiBQQ0lfVVNFX19DUlMpCi0JCQkJZ2V0X2N1cnJlbnRfcmVzb3VyY2VzKGRldmljZSwgYnVzbnVtLCBkb21haW4sCi0JCQkJCQkJYnVzKTsKKwkJCWdldF9jdXJyZW50X3Jlc291cmNlcyhkZXZpY2UsIGJ1c251bSwgZG9tYWluLCBidXMpOwogCQkJYnVzLT5zdWJvcmRpbmF0ZSA9IHBjaV9zY2FuX2NoaWxkX2J1cyhidXMpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2FtZF9idXMuYyBiL2FyY2gveDg2L3BjaS9hbWRfYnVzLmMKaW5kZXggNTcyZWU5Ny4uOTVlY2JkNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2FtZF9idXMuYworKysgYi9hcmNoL3g4Ni9wY2kvYW1kX2J1cy5jCkBAIC02LDEwICs2LDEwIEBACiAKICNpZmRlZiBDT05GSUdfWDg2XzY0CiAjaW5jbHVkZSA8YXNtL3BjaS1kaXJlY3QuaD4KLSNpbmNsdWRlIDxhc20vbXBzcGVjLmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgogI2VuZGlmCiAKKyNpbmNsdWRlICJidXNfbnVtYS5oIgorCiAvKgogICogVGhpcyBkaXNjb3ZlcnMgdGhlIHBjaWJ1cyA8LT4gbm9kZSBtYXBwaW5nIG9uIEFNRCBLOC4KICAqIGFsc28gZ2V0IHBlZXIgcm9vdCBidXMgcmVzb3VyY2UgZm9yIGlvLG1taW8KQEAgLTE3LDY3ICsxNyw2IEBACiAKICNpZmRlZiBDT05GSUdfWDg2XzY0CiAKLS8qCi0gKiBzdWIgYnVzICh0cmFuc3BhcmVudCkgd2lsbCB1c2UgZW50cmVzIGZyb20gMyB0byBzdG9yZSBleHRyYSBmcm9tIHJvb3QsCi0gKiBzbyBuZWVkIHRvIG1ha2Ugc3VyZSBoYXZlIGVub3VnaHQgc2xvdCB0aGVyZSwgaW5jcmVhc2UgUENJX0JVU19OVU1fUkVTT1VSQ0VTPwotICovCi0jZGVmaW5lIFJFU19OVU0gMTYKLXN0cnVjdCBwY2lfcm9vdF9pbmZvIHsKLQljaGFyIG5hbWVbMTJdOwotCXVuc2lnbmVkIGludCByZXNfbnVtOwotCXN0cnVjdCByZXNvdXJjZSByZXNbUkVTX05VTV07Ci0JaW50IGJ1c19taW47Ci0JaW50IGJ1c19tYXg7Ci0JaW50IG5vZGU7Ci0JaW50IGxpbms7Ci19OwotCi0vKiA0IGF0IHRoaXMgdGltZSwgaXQgbWF5IGJlY29tZSB0byAzMiAqLwotI2RlZmluZSBQQ0lfUk9PVF9OUiA0Ci1zdGF0aWMgaW50IHBjaV9yb290X251bTsKLXN0YXRpYyBzdHJ1Y3QgcGNpX3Jvb3RfaW5mbyBwY2lfcm9vdF9pbmZvW1BDSV9ST09UX05SXTsKLQotdm9pZCB4ODZfcGNpX3Jvb3RfYnVzX3Jlc19xdWlya3Moc3RydWN0IHBjaV9idXMgKmIpCi17Ci0JaW50IGk7Ci0JaW50IGo7Ci0Jc3RydWN0IHBjaV9yb290X2luZm8gKmluZm87Ci0KLQkvKiBkb24ndCBnbyBmb3IgaXQgaWYgX0NSUyBpcyB1c2VkIGFscmVhZHkgKi8KLQlpZiAoYi0+cmVzb3VyY2VbMF0gIT0gJmlvcG9ydF9yZXNvdXJjZSB8fAotCSAgICBiLT5yZXNvdXJjZVsxXSAhPSAmaW9tZW1fcmVzb3VyY2UpCi0JCXJldHVybjsKLQotCS8qIGlmIG9ubHkgb25lIHJvb3QgYnVzLCBkb24ndCBuZWVkIHRvIGFueXRoaW5nICovCi0JaWYgKHBjaV9yb290X251bSA8IDIpCi0JCXJldHVybjsKLQotCWZvciAoaSA9IDA7IGkgPCBwY2lfcm9vdF9udW07IGkrKykgewotCQlpZiAocGNpX3Jvb3RfaW5mb1tpXS5idXNfbWluID09IGItPm51bWJlcikKLQkJCWJyZWFrOwotCX0KLQotCWlmIChpID09IHBjaV9yb290X251bSkKLQkJcmV0dXJuOwotCi0JcHJpbnRrKEtFUk5fREVCVUcgIlBDSTogcGVlciByb290IGJ1cyAlMDJ4IHJlcyB1cGRhdGVkIGZyb20gcGNpIGNvbmZcbiIsCi0JCQliLT5udW1iZXIpOwotCi0JaW5mbyA9ICZwY2lfcm9vdF9pbmZvW2ldOwotCWZvciAoaiA9IDA7IGogPCBpbmZvLT5yZXNfbnVtOyBqKyspIHsKLQkJc3RydWN0IHJlc291cmNlICpyZXM7Ci0JCXN0cnVjdCByZXNvdXJjZSAqcm9vdDsKLQotCQlyZXMgPSAmaW5mby0+cmVzW2pdOwotCQliLT5yZXNvdXJjZVtqXSA9IHJlczsKLQkJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQotCQkJcm9vdCA9ICZpb3BvcnRfcmVzb3VyY2U7Ci0JCWVsc2UKLQkJCXJvb3QgPSAmaW9tZW1fcmVzb3VyY2U7Ci0JCWluc2VydF9yZXNvdXJjZShyb290LCByZXMpOwotCX0KLX0KLQogI2RlZmluZSBSQU5HRV9OVU0gMTYKIAogc3RydWN0IHJlc19yYW5nZSB7CkBAIC0xMzAsNTIgKzY5LDYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCB1cGRhdGVfcmVzKHN0cnVjdCBwY2lfcm9vdF9pbmZvICppbmZvLCBzaXplX3Qgc3RhcnQsCi0JCQkgICAgICBzaXplX3QgZW5kLCB1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgbWVyZ2UpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0KLQlpZiAoIW1lcmdlKQotCQlnb3RvIGFkZGl0OwotCi0JLyogdHJ5IHRvIG1lcmdlIGl0IHdpdGggb2xkIG9uZSAqLwotCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5yZXNfbnVtOyBpKyspIHsKLQkJc2l6ZV90IGZpbmFsX3N0YXJ0LCBmaW5hbF9lbmQ7Ci0JCXNpemVfdCBjb21tb25fc3RhcnQsIGNvbW1vbl9lbmQ7Ci0KLQkJcmVzID0gJmluZm8tPnJlc1tpXTsKLQkJaWYgKHJlcy0+ZmxhZ3MgIT0gZmxhZ3MpCi0JCQljb250aW51ZTsKLQotCQljb21tb25fc3RhcnQgPSBtYXgoKHNpemVfdClyZXMtPnN0YXJ0LCBzdGFydCk7Ci0JCWNvbW1vbl9lbmQgPSBtaW4oKHNpemVfdClyZXMtPmVuZCwgZW5kKTsKLQkJaWYgKGNvbW1vbl9zdGFydCA+IGNvbW1vbl9lbmQgKyAxKQotCQkJY29udGludWU7Ci0KLQkJZmluYWxfc3RhcnQgPSBtaW4oKHNpemVfdClyZXMtPnN0YXJ0LCBzdGFydCk7Ci0JCWZpbmFsX2VuZCA9IG1heCgoc2l6ZV90KXJlcy0+ZW5kLCBlbmQpOwotCi0JCXJlcy0+c3RhcnQgPSBmaW5hbF9zdGFydDsKLQkJcmVzLT5lbmQgPSBmaW5hbF9lbmQ7Ci0JCXJldHVybjsKLQl9Ci0KLWFkZGl0OgotCi0JLyogbmVlZCB0byBhZGQgdGhhdCAqLwotCWlmIChpbmZvLT5yZXNfbnVtID49IFJFU19OVU0pCi0JCXJldHVybjsKLQotCXJlcyA9ICZpbmZvLT5yZXNbaW5mby0+cmVzX251bV07Ci0JcmVzLT5uYW1lID0gaW5mby0+bmFtZTsKLQlyZXMtPmZsYWdzID0gZmxhZ3M7Ci0JcmVzLT5zdGFydCA9IHN0YXJ0OwotCXJlcy0+ZW5kID0gZW5kOwotCXJlcy0+Y2hpbGQgPSBOVUxMOwotCWluZm8tPnJlc19udW0rKzsKLX0KLQogc3RydWN0IHBjaV9ob3N0YnJpZGdlX3Byb2JlIHsKIAl1MzIgYnVzOwogCXUzMiBzbG90OwpAQCAtMjMwLDcgKzEyMyw2IEBACiAJaW50IGo7CiAJdW5zaWduZWQgYnVzOwogCXVuc2lnbmVkIHNsb3Q7Ci0JaW50IGZvdW5kOwogCWludCBub2RlOwogCWludCBsaW5rOwogCWludCBkZWZfbm9kZTsKQEAgLTI0Nyw3ICsxMzksNyBAQAogCWlmICghZWFybHlfcGNpX2FsbG93ZWQoKSkKIAkJcmV0dXJuIC0xOwogCi0JZm91bmQgPSAwOworCWZvdW5kX2FsbF9udW1hX2Vhcmx5ID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwY2lfcHJvYmVzKTsgaSsrKSB7CiAJCXUzMiBpZDsKIAkJdTE2IGRldmljZTsKQEAgLTI2MSwxMiArMTUzLDEyIEBACiAJCWRldmljZSA9IChpZD4+MTYpICYgMHhmZmZmOwogCQlpZiAocGNpX3Byb2Jlc1tpXS52ZW5kb3IgPT0gdmVuZG9yICYmCiAJCSAgICBwY2lfcHJvYmVzW2ldLmRldmljZSA9PSBkZXZpY2UpIHsKLQkJCWZvdW5kID0gMTsKKwkJCWZvdW5kX2FsbF9udW1hX2Vhcmx5ID0gMTsKIAkJCWJyZWFrOwogCQl9CiAJfQogCi0JaWYgKCFmb3VuZCkKKwlpZiAoIWZvdW5kX2FsbF9udW1hX2Vhcmx5KQogCQlyZXR1cm4gMDsKIAogCXBjaV9yb290X251bSA9IDA7CkBAIC00ODgsNyArMzgwLDcgQEAKIAkJaW5mbyA9ICZwY2lfcm9vdF9pbmZvW2ldOwogCQlyZXNfbnVtID0gaW5mby0+cmVzX251bTsKIAkJYnVzbnVtID0gaW5mby0+YnVzX21pbjsKLQkJcHJpbnRrKEtFUk5fREVCVUcgImJ1czogWyUwMngsJTAyeF0gb24gbm9kZSAleCBsaW5rICV4XG4iLAorCQlwcmludGsoS0VSTl9ERUJVRyAiYnVzOiBbJTAyeCwgJTAyeF0gb24gbm9kZSAleCBsaW5rICV4XG4iLAogCQkgICAgICAgaW5mby0+YnVzX21pbiwgaW5mby0+YnVzX21heCwgaW5mby0+bm9kZSwgaW5mby0+bGluayk7CiAJCWZvciAoaiA9IDA7IGogPCByZXNfbnVtOyBqKyspIHsKIAkJCXJlcyA9ICZpbmZvLT5yZXNbal07CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvYnVzX251bWEuYyBiL2FyY2gveDg2L3BjaS9idXNfbnVtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NWRmMDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9wY2kvYnVzX251bWEuYwpAQCAtMCwwICsxLDEwMSBAQAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgImJ1c19udW1hLmgiCisKK2ludCBwY2lfcm9vdF9udW07CitzdHJ1Y3QgcGNpX3Jvb3RfaW5mbyBwY2lfcm9vdF9pbmZvW1BDSV9ST09UX05SXTsKK2ludCBmb3VuZF9hbGxfbnVtYV9lYXJseTsKKwordm9pZCB4ODZfcGNpX3Jvb3RfYnVzX3Jlc19xdWlya3Moc3RydWN0IHBjaV9idXMgKmIpCit7CisJaW50IGk7CisJaW50IGo7CisJc3RydWN0IHBjaV9yb290X2luZm8gKmluZm87CisKKwkvKiBkb24ndCBnbyBmb3IgaXQgaWYgX0NSUyBpcyB1c2VkIGFscmVhZHkgKi8KKwlpZiAoYi0+cmVzb3VyY2VbMF0gIT0gJmlvcG9ydF9yZXNvdXJjZSB8fAorCSAgICBiLT5yZXNvdXJjZVsxXSAhPSAmaW9tZW1fcmVzb3VyY2UpCisJCXJldHVybjsKKworCWlmICghcGNpX3Jvb3RfbnVtKQorCQlyZXR1cm47CisKKwkvKiBmb3IgYW1kLCBpZiBvbmx5IG9uZSByb290IGJ1cywgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyAqLworCWlmIChwY2lfcm9vdF9udW0gPCAyICYmIGZvdW5kX2FsbF9udW1hX2Vhcmx5KQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgcGNpX3Jvb3RfbnVtOyBpKyspIHsKKwkJaWYgKHBjaV9yb290X2luZm9baV0uYnVzX21pbiA9PSBiLT5udW1iZXIpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA9PSBwY2lfcm9vdF9udW0pCisJCXJldHVybjsKKworCXByaW50ayhLRVJOX0RFQlVHICJQQ0k6IHBlZXIgcm9vdCBidXMgJTAyeCByZXMgdXBkYXRlZCBmcm9tIHBjaSBjb25mXG4iLAorCQkJYi0+bnVtYmVyKTsKKworCWluZm8gPSAmcGNpX3Jvb3RfaW5mb1tpXTsKKwlmb3IgKGogPSAwOyBqIDwgaW5mby0+cmVzX251bTsgaisrKSB7CisJCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCQlzdHJ1Y3QgcmVzb3VyY2UgKnJvb3Q7CisKKwkJcmVzID0gJmluZm8tPnJlc1tqXTsKKwkJYi0+cmVzb3VyY2Vbal0gPSByZXM7CisJCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKKwkJCXJvb3QgPSAmaW9wb3J0X3Jlc291cmNlOworCQllbHNlCisJCQlyb290ID0gJmlvbWVtX3Jlc291cmNlOworCQlpbnNlcnRfcmVzb3VyY2Uocm9vdCwgcmVzKTsKKwl9Cit9CisKK3ZvaWQgX19pbml0IHVwZGF0ZV9yZXMoc3RydWN0IHBjaV9yb290X2luZm8gKmluZm8sIHNpemVfdCBzdGFydCwKKwkJCSAgICAgIHNpemVfdCBlbmQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGludCBtZXJnZSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCWlmIChzdGFydCA+IGVuZCkKKwkJcmV0dXJuOworCisJaWYgKCFtZXJnZSkKKwkJZ290byBhZGRpdDsKKworCS8qIHRyeSB0byBtZXJnZSBpdCB3aXRoIG9sZCBvbmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+cmVzX251bTsgaSsrKSB7CisJCXNpemVfdCBmaW5hbF9zdGFydCwgZmluYWxfZW5kOworCQlzaXplX3QgY29tbW9uX3N0YXJ0LCBjb21tb25fZW5kOworCisJCXJlcyA9ICZpbmZvLT5yZXNbaV07CisJCWlmIChyZXMtPmZsYWdzICE9IGZsYWdzKQorCQkJY29udGludWU7CisKKwkJY29tbW9uX3N0YXJ0ID0gbWF4KChzaXplX3QpcmVzLT5zdGFydCwgc3RhcnQpOworCQljb21tb25fZW5kID0gbWluKChzaXplX3QpcmVzLT5lbmQsIGVuZCk7CisJCWlmIChjb21tb25fc3RhcnQgPiBjb21tb25fZW5kICsgMSkKKwkJCWNvbnRpbnVlOworCisJCWZpbmFsX3N0YXJ0ID0gbWluKChzaXplX3QpcmVzLT5zdGFydCwgc3RhcnQpOworCQlmaW5hbF9lbmQgPSBtYXgoKHNpemVfdClyZXMtPmVuZCwgZW5kKTsKKworCQlyZXMtPnN0YXJ0ID0gZmluYWxfc3RhcnQ7CisJCXJlcy0+ZW5kID0gZmluYWxfZW5kOworCQlyZXR1cm47CisJfQorCithZGRpdDoKKworCS8qIG5lZWQgdG8gYWRkIHRoYXQgKi8KKwlpZiAoaW5mby0+cmVzX251bSA+PSBSRVNfTlVNKQorCQlyZXR1cm47CisKKwlyZXMgPSAmaW5mby0+cmVzW2luZm8tPnJlc19udW1dOworCXJlcy0+bmFtZSA9IGluZm8tPm5hbWU7CisJcmVzLT5mbGFncyA9IGZsYWdzOworCXJlcy0+c3RhcnQgPSBzdGFydDsKKwlyZXMtPmVuZCA9IGVuZDsKKwlyZXMtPmNoaWxkID0gTlVMTDsKKwlpbmZvLT5yZXNfbnVtKys7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvYnVzX251bWEuaCBiL2FyY2gveDg2L3BjaS9idXNfbnVtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYmMyM2ZlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvcGNpL2J1c19udW1hLmgKQEAgLTAsMCArMSwyNyBAQAorI2lmZGVmIENPTkZJR19YODZfNjQKKworLyoKKyAqIHN1YiBidXMgKHRyYW5zcGFyZW50KSB3aWxsIHVzZSBlbnRyZXMgZnJvbSAzIHRvIHN0b3JlIGV4dHJhIGZyb20KKyAqIHJvb3QsIHNvIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIHNsb3QgdGhlcmUsIFNob3VsZCB3ZQorICogaW5jcmVhc2UgUENJX0JVU19OVU1fUkVTT1VSQ0VTPworICovCisjZGVmaW5lIFJFU19OVU0gMTYKK3N0cnVjdCBwY2lfcm9vdF9pbmZvIHsKKwljaGFyIG5hbWVbMTJdOworCXVuc2lnbmVkIGludCByZXNfbnVtOworCXN0cnVjdCByZXNvdXJjZSByZXNbUkVTX05VTV07CisJaW50IGJ1c19taW47CisJaW50IGJ1c19tYXg7CisJaW50IG5vZGU7CisJaW50IGxpbms7Cit9OworCisvKiA0IGF0IHRoaXMgdGltZSwgaXQgbWF5IGJlY29tZSB0byAzMiAqLworI2RlZmluZSBQQ0lfUk9PVF9OUiA0CitleHRlcm4gaW50IHBjaV9yb290X251bTsKK2V4dGVybiBzdHJ1Y3QgcGNpX3Jvb3RfaW5mbyBwY2lfcm9vdF9pbmZvW1BDSV9ST09UX05SXTsKK2V4dGVybiBpbnQgZm91bmRfYWxsX251bWFfZWFybHk7CisKK2V4dGVybiB2b2lkIHVwZGF0ZV9yZXMoc3RydWN0IHBjaV9yb290X2luZm8gKmluZm8sIHNpemVfdCBzdGFydCwKKwkJCSAgICAgIHNpemVfdCBlbmQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGludCBtZXJnZSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9jb21tb24uYyBiL2FyY2gveDg2L3BjaS9jb21tb24uYwppbmRleCAxMzMxZmNmLi5kMjU1MmM2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvY29tbW9uLmMKKysrIGIvYXJjaC94ODYvcGNpL2NvbW1vbi5jCkBAIC00MTAsOCArNDEwLDYgQEAKIAlyZXR1cm4gYnVzOwogfQogCi1leHRlcm4gdTggcGNpX2NhY2hlX2xpbmVfc2l6ZTsKLQogaW50IF9faW5pdCBwY2liaW9zX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmYm9vdF9jcHVfZGF0YTsKQEAgLTQyMiwxNSArNDIwLDE5IEBACiAJfQogCiAJLyoKLQkgKiBBc3N1bWUgUENJIGNhY2hlbGluZSBzaXplIG9mIDMyIGJ5dGVzIGZvciBhbGwgeDg2cyBleGNlcHQgSzcvSzgKLQkgKiBhbmQgUDQuIEl0J3MgYWxzbyBnb29kIGZvciAzODYvNDg2cyAod2hpY2ggYWN0dWFsbHkgaGF2ZSAxNikKKwkgKiBTZXQgUENJIGNhY2hlbGluZSBzaXplIHRvIHRoYXQgb2YgdGhlIENQVSBpZiB0aGUgQ1BVIGhhcyByZXBvcnRlZCBpdC4KKwkgKiAoRm9yIG9sZGVyIENQVXMgdGhhdCBkb24ndCBzdXBwb3J0IGNwdWlkLCB3ZSBzZSBpdCB0byAzMiBieXRlcworCSAqIEl0J3MgYWxzbyBnb29kIGZvciAzODYvNDg2cyAod2hpY2ggYWN0dWFsbHkgaGF2ZSAxNikKIAkgKiBhcyBxdWl0ZSBhIGZldyBQQ0kgZGV2aWNlcyBkbyBub3Qgc3VwcG9ydCBzbWFsbGVyIHZhbHVlcy4KIAkgKi8KLQlwY2lfY2FjaGVfbGluZV9zaXplID0gMzIgPj4gMjsKLQlpZiAoYy0+eDg2ID49IDYgJiYgYy0+eDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0FNRCkKLQkJcGNpX2NhY2hlX2xpbmVfc2l6ZSA9IDY0ID4+IDI7CS8qIEs3ICYgSzggKi8KLQllbHNlIGlmIChjLT54ODYgPiA2ICYmIGMtPng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCkKLQkJcGNpX2NhY2hlX2xpbmVfc2l6ZSA9IDEyOCA+PiAyOwkvKiBQNCAqLworCWlmIChjLT54ODZfY2xmbHVzaF9zaXplID4gMCkgeworCQlwY2lfZGZsX2NhY2hlX2xpbmVfc2l6ZSA9IGMtPng4Nl9jbGZsdXNoX3NpemUgPj4gMjsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlBDSTogcGNpX2NhY2hlX2xpbmVfc2l6ZSBzZXQgdG8gJWQgYnl0ZXNcbiIsCisJCQlwY2lfZGZsX2NhY2hlX2xpbmVfc2l6ZSA8PCAyKTsKKwl9IGVsc2UgeworIAkJcGNpX2RmbF9jYWNoZV9saW5lX3NpemUgPSAzMiA+PiAyOworCQlwcmludGsoS0VSTl9ERUJVRyAiUENJOiBVbmtub3duIGNhY2hlbGluZSBzaXplLiBTZXR0aW5nIHRvIDMyIGJ5dGVzXG4iKTsKKwl9CiAKIAlwY2liaW9zX3Jlc291cmNlX3N1cnZleSgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvZWFybHkuYyBiL2FyY2gveDg2L3BjaS9lYXJseS5jCmluZGV4IGFhZjI2YWUuLmQxMDY3ZDUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9lYXJseS5jCisrKyBiL2FyY2gveDg2L3BjaS9lYXJseS5jCkBAIC0xMiw4ICsxMiw2IEBACiAJdTMyIHY7CiAJb3V0bCgweDgwMDAwMDAwIHwgKGJ1czw8MTYpIHwgKHNsb3Q8PDExKSB8IChmdW5jPDw4KSB8IG9mZnNldCwgMHhjZjgpOwogCXYgPSBpbmwoMHhjZmMpOwotCWlmICh2ICE9IDB4ZmZmZmZmZmYpCi0JCXByX2RlYnVnKCIleCByZWFkaW5nIDQgZnJvbSAleDogJXhcbiIsIHNsb3QsIG9mZnNldCwgdik7CiAJcmV0dXJuIHY7CiB9CiAKQEAgLTIyLDcgKzIwLDYgQEAKIAl1OCB2OwogCW91dGwoMHg4MDAwMDAwMCB8IChidXM8PDE2KSB8IChzbG90PDwxMSkgfCAoZnVuYzw8OCkgfCBvZmZzZXQsIDB4Y2Y4KTsKIAl2ID0gaW5iKDB4Y2ZjICsgKG9mZnNldCYzKSk7Ci0JcHJfZGVidWcoIiV4IHJlYWRpbmcgMSBmcm9tICV4OiAleFxuIiwgc2xvdCwgb2Zmc2V0LCB2KTsKIAlyZXR1cm4gdjsKIH0KIApAQCAtMzEsMjggKzI4LDI0IEBACiAJdTE2IHY7CiAJb3V0bCgweDgwMDAwMDAwIHwgKGJ1czw8MTYpIHwgKHNsb3Q8PDExKSB8IChmdW5jPDw4KSB8IG9mZnNldCwgMHhjZjgpOwogCXYgPSBpbncoMHhjZmMgKyAob2Zmc2V0JjIpKTsKLQlwcl9kZWJ1ZygiJXggcmVhZGluZyAyIGZyb20gJXg6ICV4XG4iLCBzbG90LCBvZmZzZXQsIHYpOwogCXJldHVybiB2OwogfQogCiB2b2lkIHdyaXRlX3BjaV9jb25maWcodTggYnVzLCB1OCBzbG90LCB1OCBmdW5jLCB1OCBvZmZzZXQsCiAJCQkJICAgIHUzMiB2YWwpCiB7Ci0JcHJfZGVidWcoIiV4IHdyaXRpbmcgdG8gJXg6ICV4XG4iLCBzbG90LCBvZmZzZXQsIHZhbCk7CiAJb3V0bCgweDgwMDAwMDAwIHwgKGJ1czw8MTYpIHwgKHNsb3Q8PDExKSB8IChmdW5jPDw4KSB8IG9mZnNldCwgMHhjZjgpOwogCW91dGwodmFsLCAweGNmYyk7CiB9CiAKIHZvaWQgd3JpdGVfcGNpX2NvbmZpZ19ieXRlKHU4IGJ1cywgdTggc2xvdCwgdTggZnVuYywgdTggb2Zmc2V0LCB1OCB2YWwpCiB7Ci0JcHJfZGVidWcoIiV4IHdyaXRpbmcgdG8gJXg6ICV4XG4iLCBzbG90LCBvZmZzZXQsIHZhbCk7CiAJb3V0bCgweDgwMDAwMDAwIHwgKGJ1czw8MTYpIHwgKHNsb3Q8PDExKSB8IChmdW5jPDw4KSB8IG9mZnNldCwgMHhjZjgpOwogCW91dGIodmFsLCAweGNmYyArIChvZmZzZXQmMykpOwogfQogCiB2b2lkIHdyaXRlX3BjaV9jb25maWdfMTYodTggYnVzLCB1OCBzbG90LCB1OCBmdW5jLCB1OCBvZmZzZXQsIHUxNiB2YWwpCiB7Ci0JcHJfZGVidWcoIiV4IHdyaXRpbmcgdG8gJXg6ICV4XG4iLCBzbG90LCBvZmZzZXQsIHZhbCk7CiAJb3V0bCgweDgwMDAwMDAwIHwgKGJ1czw8MTYpIHwgKHNsb3Q8PDExKSB8IChmdW5jPDw4KSB8IG9mZnNldCwgMHhjZjgpOwogCW91dHcodmFsLCAweGNmYyArIChvZmZzZXQmMikpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2kzODYuYyBiL2FyY2gveDg2L3BjaS9pMzg2LmMKaW5kZXggYjIyZDEzYi4uNWRjOWU4YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2kzODYuYworKysgYi9hcmNoL3g4Ni9wY2kvaTM4Ni5jCkBAIC0xMjksNyArMTI5LDkgQEAKIAkJCQkJY29udGludWU7CiAJCQkJaWYgKCFyLT5zdGFydCB8fAogCQkJCSAgICBwY2lfY2xhaW1fcmVzb3VyY2UoZGV2LCBpZHgpIDwgMCkgewotCQkJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJCQVIgJWQ6IGNhbid0IGFsbG9jYXRlIHJlc291cmNlXG4iLCBpZHgpOworCQkJCQlkZXZfaW5mbygmZGV2LT5kZXYsCisJCQkJCQkgImNhbid0IHJlc2VydmUgd2luZG93ICVwUlxuIiwKKwkJCQkJCSByKTsKIAkJCQkJLyoKIAkJCQkJICogU29tZXRoaW5nIGlzIHdyb25nIHdpdGggdGhlIHJlZ2lvbi4KIAkJCQkJICogSW52YWxpZGF0ZSB0aGUgcmVzb3VyY2UgdG8gcHJldmVudApAQCAtMTQ0LDE2ICsxNDYsMjkgQEAKIAl9CiB9CiAKK3N0cnVjdCBwY2lfY2hlY2tfaWR4X3JhbmdlIHsKKwlpbnQgc3RhcnQ7CisJaW50IGVuZDsKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBwY2liaW9zX2FsbG9jYXRlX3Jlc291cmNlcyhpbnQgcGFzcykKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKLQlpbnQgaWR4LCBkaXNhYmxlZDsKKwlpbnQgaWR4LCBkaXNhYmxlZCwgaTsKIAl1MTYgY29tbWFuZDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnI7CiAKKwlzdHJ1Y3QgcGNpX2NoZWNrX2lkeF9yYW5nZSBpZHhfcmFuZ2VbXSA9IHsKKwkJeyBQQ0lfU1REX1JFU09VUkNFUywgUENJX1NURF9SRVNPVVJDRV9FTkQgfSwKKyNpZmRlZiBDT05GSUdfUENJX0lPVgorCQl7IFBDSV9JT1ZfUkVTT1VSQ0VTLCBQQ0lfSU9WX1JFU09VUkNFX0VORCB9LAorI2VuZGlmCisJfTsKKwogCWZvcl9lYWNoX3BjaV9kZXYoZGV2KSB7CiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjb21tYW5kKTsKLQkJZm9yIChpZHggPSAwOyBpZHggPCBQQ0lfUk9NX1JFU09VUkNFOyBpZHgrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpZHhfcmFuZ2UpOyBpKyspCisJCWZvciAoaWR4ID0gaWR4X3JhbmdlW2ldLnN0YXJ0OyBpZHggPD0gaWR4X3JhbmdlW2ldLmVuZDsgaWR4KyspIHsKIAkJCXIgPSAmZGV2LT5yZXNvdXJjZVtpZHhdOwogCQkJaWYgKHItPnBhcmVudCkJCS8qIEFscmVhZHkgYWxsb2NhdGVkICovCiAJCQkJY29udGludWU7CkBAIC0xNjQsMTIgKzE3OSwxMiBAQAogCQkJZWxzZQogCQkJCWRpc2FibGVkID0gIShjb21tYW5kICYgUENJX0NPTU1BTkRfTUVNT1JZKTsKIAkJCWlmIChwYXNzID09IGRpc2FibGVkKSB7Ci0JCQkJZGV2X2RiZygmZGV2LT5kZXYsICJyZXNvdXJjZSAlIzA4bGx4LSUjMDhsbHggKGY9JWx4LCBkPSVkLCBwPSVkKVxuIiwKLQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgci0+c3RhcnQsCi0JCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIHItPmVuZCwKLQkJCQkJci0+ZmxhZ3MsIGRpc2FibGVkLCBwYXNzKTsKKwkJCQlkZXZfZGJnKCZkZXYtPmRldiwKKwkJCQkJIkJBUiAlZDogcmVzZXJ2aW5nICVwciAoZD0lZCwgcD0lZClcbiIsCisJCQkJCWlkeCwgciwgZGlzYWJsZWQsIHBhc3MpOwogCQkJCWlmIChwY2lfY2xhaW1fcmVzb3VyY2UoZGV2LCBpZHgpIDwgMCkgewotCQkJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJCQVIgJWQ6IGNhbid0IGFsbG9jYXRlIHJlc291cmNlXG4iLCBpZHgpOworCQkJCQlkZXZfaW5mbygmZGV2LT5kZXYsCisJCQkJCQkgImNhbid0IHJlc2VydmUgJXBSXG4iLCByKTsKIAkJCQkJLyogV2UnbGwgYXNzaWduIGEgbmV3IGFkZHJlc3MgbGF0ZXIgKi8KIAkJCQkJci0+ZW5kIC09IHItPnN0YXJ0OwogCQkJCQlyLT5zdGFydCA9IDA7CkBAIC0xODIsNyArMTk3LDcgQEAKIAkJCQkvKiBUdXJuIHRoZSBST00gb2ZmLCBsZWF2ZSB0aGUgcmVzb3VyY2UgcmVnaW9uLAogCQkJCSAqIGJ1dCBrZWVwIGl0IHVucmVnaXN0ZXJlZC4gKi8KIAkJCQl1MzIgcmVnOwotCQkJCWRldl9kYmcoJmRldi0+ZGV2LCAiZGlzYWJsaW5nIFJPTVxuIik7CisJCQkJZGV2X2RiZygmZGV2LT5kZXYsICJkaXNhYmxpbmcgUk9NICVwUlxuIiwgcik7CiAJCQkJci0+ZmxhZ3MgJj0gfklPUkVTT1VSQ0VfUk9NX0VOQUJMRTsKIAkJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LAogCQkJCQkJZGV2LT5yb21fYmFzZV9yZWcsICZyZWcpOwpAQCAtMjgyLDYgKzI5NywxNSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXByb3QgPSBwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KTsKKworCS8qCisgCSAqIFJldHVybiBlcnJvciBpZiBwYXQgaXMgbm90IGVuYWJsZWQgYW5kIHdyaXRlX2NvbWJpbmUgaXMgcmVxdWVzdGVkLgorIAkgKiBDYWxsZXIgY2FuIGZvbGxvd3VwIHdpdGggVUMgTUlOVVMgcmVxdWVzdCBhbmQgYWRkIGEgV0MgbXRyciBpZiB0aGVyZQorIAkgKiBpcyBhIGZyZWUgbXRyciBzbG90LgorIAkgKi8KKwlpZiAoIXBhdF9lbmFibGVkICYmIHdyaXRlX2NvbWJpbmUpCisJCXJldHVybiAtRUlOVkFMOworCiAJaWYgKHBhdF9lbmFibGVkICYmIHdyaXRlX2NvbWJpbmUpCiAJCXByb3QgfD0gX1BBR0VfQ0FDSEVfV0M7CiAJZWxzZSBpZiAocGF0X2VuYWJsZWQgfHwgYm9vdF9jcHVfZGF0YS54ODYgPiAzKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2ludGVsX2J1cy5jIGIvYXJjaC94ODYvcGNpL2ludGVsX2J1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YTU1ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9wY2kvaW50ZWxfYnVzLmMKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIHRvIHJlYWQgaW8gcmFuZ2UgZnJvbSBJT0ggcGNpIGNvbmYsIG5lZWQgdG8gZG8gaXQgYWZ0ZXIgbW1jb25maWcgaXMgdGhlcmUKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3BjaV94ODYuaD4KKworI2luY2x1ZGUgImJ1c19udW1hLmgiCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmludF9pb2hfcmVzb3VyY2VzKHN0cnVjdCBwY2lfcm9vdF9pbmZvICppbmZvKQoreworCWludCByZXNfbnVtOworCWludCBidXNudW07CisJaW50IGk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiSU9IIGJ1czogWyUwMngsICUwMnhdXG4iLAorCQkJaW5mby0+YnVzX21pbiwgaW5mby0+YnVzX21heCk7CisJcmVzX251bSA9IGluZm8tPnJlc19udW07CisJYnVzbnVtID0gaW5mby0+YnVzX21pbjsKKwlmb3IgKGkgPSAwOyBpIDwgcmVzX251bTsgaSsrKSB7CisJCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJCXJlcyA9ICZpbmZvLT5yZXNbaV07CisJCXByaW50ayhLRVJOX0RFQlVHICJJT0ggYnVzOiAlMDJ4IGluZGV4ICV4ICVzOiBbJWxseCwgJWxseF1cbiIsCisJCQlidXNudW0sIGksCisJCQkocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pID8gImlvIHBvcnQiIDoKKwkJCQkJCQkibW1pbyIsCisJCQlyZXMtPnN0YXJ0LCByZXMtPmVuZCk7CisJfQorfQorCisjZGVmaW5lIElPSF9MSU8JCQkweDEwOAorI2RlZmluZSBJT0hfTE1NSU9MCQkweDEwYworI2RlZmluZSBJT0hfTE1NSU9ICQkweDExMAorI2RlZmluZSBJT0hfTE1NSU9IX0JBU0VVCTB4MTE0CisjZGVmaW5lIElPSF9MTU1JT0hfTElNSVRVCTB4MTE4CisjZGVmaW5lIElPSF9MQ0ZHQlVTCQkweDExYworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcGNpX3Jvb3RfYnVzX3JlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXUxNiB3b3JkOworCXUzMiBkd29yZDsKKwlzdHJ1Y3QgcGNpX3Jvb3RfaW5mbyAqaW5mbzsKKwl1MTYgaW9fYmFzZSwgaW9fZW5kOworCXUzMiBtbWlvbF9iYXNlLCBtbWlvbF9lbmQ7CisJdTY0IG1taW9oX2Jhc2UsIG1taW9oX2VuZDsKKwlpbnQgYnVzX2Jhc2UsIGJ1c19lbmQ7CisKKwlpZiAocGNpX3Jvb3RfbnVtID49IFBDSV9ST09UX05SKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpbnRlbF9idXMuYzogUENJX1JPT1RfTlIgaXMgdG9vIHNtYWxsXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWluZm8gPSAmcGNpX3Jvb3RfaW5mb1twY2lfcm9vdF9udW1dOworCXBjaV9yb290X251bSsrOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBJT0hfTENGR0JVUywgJndvcmQpOworCWJ1c19iYXNlID0gKHdvcmQgJiAweGZmKTsKKwlidXNfZW5kID0gKHdvcmQgJiAweGZmMDApID4+IDg7CisJc3ByaW50ZihpbmZvLT5uYW1lLCAiUENJIEJ1cyAjJTAyeCIsIGJ1c19iYXNlKTsKKwlpbmZvLT5idXNfbWluID0gYnVzX2Jhc2U7CisJaW5mby0+YnVzX21heCA9IGJ1c19lbmQ7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIElPSF9MSU8sICZ3b3JkKTsKKwlpb19iYXNlID0gKHdvcmQgJiAweGYwKSA8PCAoMTIgLSA0KTsKKwlpb19lbmQgPSAod29yZCAmIDB4ZjAwMCkgfCAweGZmZjsKKwl1cGRhdGVfcmVzKGluZm8sIGlvX2Jhc2UsIGlvX2VuZCwgSU9SRVNPVVJDRV9JTywgMCk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBJT0hfTE1NSU9MLCAmZHdvcmQpOworCW1taW9sX2Jhc2UgPSAoZHdvcmQgJiAweGZmMDApIDw8ICgyNCAtIDgpOworCW1taW9sX2VuZCA9IChkd29yZCAmIDB4ZmYwMDAwMDApIHwgMHhmZmZmZmY7CisJdXBkYXRlX3JlcyhpbmZvLCBtbWlvbF9iYXNlLCBtbWlvbF9lbmQsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIElPSF9MTU1JT0gsICZkd29yZCk7CisJbW1pb2hfYmFzZSA9ICgodTY0KShkd29yZCAmIDB4ZmMwMCkpIDw8ICgyNiAtIDEwKTsKKwltbWlvaF9lbmQgPSAoKHU2NCkoZHdvcmQgJiAweGZjMDAwMDAwKSB8IDB4M2ZmZmZmZik7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgSU9IX0xNTUlPSF9CQVNFVSwgJmR3b3JkKTsKKwltbWlvaF9iYXNlIHw9ICgodTY0KShkd29yZCAmIDB4N2ZmZmYpKSA8PCAzMjsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBJT0hfTE1NSU9IX0xJTUlUVSwgJmR3b3JkKTsKKwltbWlvaF9lbmQgfD0gKCh1NjQpKGR3b3JkICYgMHg3ZmZmZikpIDw8IDMyOworCXVwZGF0ZV9yZXMoaW5mbywgbW1pb2hfYmFzZSwgbW1pb2hfZW5kLCBJT1JFU09VUkNFX01FTSwgMCk7CisKKwlwcmludF9pb2hfcmVzb3VyY2VzKGluZm8pOworfQorCisvKiBpbnRlbCBJT0ggKi8KK0RFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MzQyZSwgcGNpX3Jvb3RfYnVzX3Jlcyk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvbW1jb25maWctc2hhcmVkLmMgYi9hcmNoL3g4Ni9wY2kvbW1jb25maWctc2hhcmVkLmMKaW5kZXggNjAyYzE3MmQuLmIxOWQxZTUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9tbWNvbmZpZy1zaGFyZWQuYworKysgYi9hcmNoL3g4Ni9wY2kvbW1jb25maWctc2hhcmVkLmMKQEAgLTE1LDQ4ICsxNSw5OCBAQAogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zZmlfYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KICNpbmNsdWRlIDxhc20vZTgyMC5oPgogI2luY2x1ZGUgPGFzbS9wY2lfeDg2Lmg+CiAjaW5jbHVkZSA8YXNtL2FjcGkuaD4KIAogI2RlZmluZSBQUkVGSVggIlBDSTogIgogCi0vKiBhcGVydHVyZSBpcyB1cCB0byAyNTZNQiBidXQgQklPUyBtYXkgcmVzZXJ2ZSBsZXNzICovCi0jZGVmaW5lIE1NQ09ORklHX0FQRVJfTUlOCSgyICogMTAyNCoxMDI0KQotI2RlZmluZSBNTUNPTkZJR19BUEVSX01BWAkoMjU2ICogMTAyNCoxMDI0KQotCiAvKiBJbmRpY2F0ZSBpZiB0aGUgbW1jZmcgcmVzb3VyY2VzIGhhdmUgYmVlbiBwbGFjZWQgaW50byB0aGUgcmVzb3VyY2UgdGFibGUuICovCiBzdGF0aWMgaW50IF9faW5pdGRhdGEgcGNpX21tY2ZnX3Jlc291cmNlc19pbnNlcnRlZDsKIAotc3RhdGljIF9faW5pdCBpbnQgZXh0ZW5kX21tY2ZnKGludCBudW0pCitMSVNUX0hFQUQocGNpX21tY2ZnX2xpc3QpOworCitzdGF0aWMgX19pbml0IHZvaWQgcGNpX21tY29uZmlnX3JlbW92ZShzdHJ1Y3QgcGNpX21tY2ZnX3JlZ2lvbiAqY2ZnKQogewotCXN0cnVjdCBhY3BpX21jZmdfYWxsb2NhdGlvbiAqbmV3OwotCWludCBuZXdfbnVtID0gcGNpX21tY2ZnX2NvbmZpZ19udW0gKyBudW07Ci0KLQluZXcgPSBremFsbG9jKHNpemVvZihwY2lfbW1jZmdfY29uZmlnWzBdKSAqIG5ld19udW0sIEdGUF9LRVJORUwpOwotCWlmICghbmV3KQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAocGNpX21tY2ZnX2NvbmZpZykgewotCQltZW1jcHkobmV3LCBwY2lfbW1jZmdfY29uZmlnLAotCQkJIHNpemVvZihwY2lfbW1jZmdfY29uZmlnWzBdKSAqIG5ld19udW0pOwotCQlrZnJlZShwY2lfbW1jZmdfY29uZmlnKTsKLQl9Ci0JcGNpX21tY2ZnX2NvbmZpZyA9IG5ldzsKLQotCXJldHVybiAwOworCWlmIChjZmctPnJlcy5wYXJlbnQpCisJCXJlbGVhc2VfcmVzb3VyY2UoJmNmZy0+cmVzKTsKKwlsaXN0X2RlbCgmY2ZnLT5saXN0KTsKKwlrZnJlZShjZmcpOwogfQogCi1zdGF0aWMgX19pbml0IHZvaWQgZmlsbF9vbmVfbW1jZmcodTY0IGFkZHIsIGludCBzZWdtZW50LCBpbnQgc3RhcnQsIGludCBlbmQpCitzdGF0aWMgX19pbml0IHZvaWQgZnJlZV9hbGxfbW1jZmcodm9pZCkKIHsKLQlpbnQgaSA9IHBjaV9tbWNmZ19jb25maWdfbnVtOworCXN0cnVjdCBwY2lfbW1jZmdfcmVnaW9uICpjZmcsICp0bXA7CiAKLQlwY2lfbW1jZmdfY29uZmlnX251bSsrOwotCXBjaV9tbWNmZ19jb25maWdbaV0uYWRkcmVzcyA9IGFkZHI7Ci0JcGNpX21tY2ZnX2NvbmZpZ1tpXS5wY2lfc2VnbWVudCA9IHNlZ21lbnQ7Ci0JcGNpX21tY2ZnX2NvbmZpZ1tpXS5zdGFydF9idXNfbnVtYmVyID0gc3RhcnQ7Ci0JcGNpX21tY2ZnX2NvbmZpZ1tpXS5lbmRfYnVzX251bWJlciA9IGVuZDsKKwlwY2lfbW1jZmdfYXJjaF9mcmVlKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNmZywgdG1wLCAmcGNpX21tY2ZnX2xpc3QsIGxpc3QpCisJCXBjaV9tbWNvbmZpZ19yZW1vdmUoY2ZnKTsKK30KKworc3RhdGljIF9faW5pdCB2b2lkIGxpc3RfYWRkX3NvcnRlZChzdHJ1Y3QgcGNpX21tY2ZnX3JlZ2lvbiAqbmV3KQoreworCXN0cnVjdCBwY2lfbW1jZmdfcmVnaW9uICpjZmc7CisKKwkvKiBrZWVwIGxpc3Qgc29ydGVkIGJ5IHNlZ21lbnQgYW5kIHN0YXJ0aW5nIGJ1cyBudW1iZXIgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNmZywgJnBjaV9tbWNmZ19saXN0LCBsaXN0KSB7CisJCWlmIChjZmctPnNlZ21lbnQgPiBuZXctPnNlZ21lbnQgfHwKKwkJICAgIChjZmctPnNlZ21lbnQgPT0gbmV3LT5zZWdtZW50ICYmCisJCSAgICAgY2ZnLT5zdGFydF9idXMgPj0gbmV3LT5zdGFydF9idXMpKSB7CisJCQlsaXN0X2FkZF90YWlsKCZuZXctPmxpc3QsICZjZmctPmxpc3QpOworCQkJcmV0dXJuOworCQl9CisJfQorCWxpc3RfYWRkX3RhaWwoJm5ldy0+bGlzdCwgJnBjaV9tbWNmZ19saXN0KTsKK30KKworc3RhdGljIF9faW5pdCBzdHJ1Y3QgcGNpX21tY2ZnX3JlZ2lvbiAqcGNpX21tY29uZmlnX2FkZChpbnQgc2VnbWVudCwgaW50IHN0YXJ0LAorCQkJCQkJCWludCBlbmQsIHU2NCBhZGRyKQoreworCXN0cnVjdCBwY2lfbW1jZmdfcmVnaW9uICpuZXc7CisJaW50IG51bV9idXNlczsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCWlmIChhZGRyID09IDApCisJCXJldHVybiBOVUxMOworCisJbmV3ID0ga3phbGxvYyhzaXplb2YoKm5ldyksIEdGUF9LRVJORUwpOworCWlmICghbmV3KQorCQlyZXR1cm4gTlVMTDsKKworCW5ldy0+YWRkcmVzcyA9IGFkZHI7CisJbmV3LT5zZWdtZW50ID0gc2VnbWVudDsKKwluZXctPnN0YXJ0X2J1cyA9IHN0YXJ0OworCW5ldy0+ZW5kX2J1cyA9IGVuZDsKKworCWxpc3RfYWRkX3NvcnRlZChuZXcpOworCisJbnVtX2J1c2VzID0gZW5kIC0gc3RhcnQgKyAxOworCXJlcyA9ICZuZXctPnJlczsKKwlyZXMtPnN0YXJ0ID0gYWRkciArIFBDSV9NTUNGR19CVVNfT0ZGU0VUKHN0YXJ0KTsKKwlyZXMtPmVuZCA9IGFkZHIgKyBQQ0lfTU1DRkdfQlVTX09GRlNFVChudW1fYnVzZXMpIC0gMTsKKwlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9NRU0gfCBJT1JFU09VUkNFX0JVU1k7CisJc25wcmludGYobmV3LT5uYW1lLCBQQ0lfTU1DRkdfUkVTT1VSQ0VfTkFNRV9MRU4sCisJCSAiUENJIE1NQ09ORklHICUwNHggW2J1cyAlMDJ4LSUwMnhdIiwgc2VnbWVudCwgc3RhcnQsIGVuZCk7CisJcmVzLT5uYW1lID0gbmV3LT5uYW1lOworCisJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIk1NQ09ORklHIGZvciBkb21haW4gJTA0eCBbYnVzICUwMngtJTAyeF0gYXQgIgorCSAgICAgICAiJXBSIChiYXNlICUjbHgpXG4iLCBzZWdtZW50LCBzdGFydCwgZW5kLCAmbmV3LT5yZXMsCisJICAgICAgICh1bnNpZ25lZCBsb25nKSBhZGRyKTsKKworCXJldHVybiBuZXc7Cit9CisKK3N0cnVjdCBwY2lfbW1jZmdfcmVnaW9uICpwY2lfbW1jb25maWdfbG9va3VwKGludCBzZWdtZW50LCBpbnQgYnVzKQoreworCXN0cnVjdCBwY2lfbW1jZmdfcmVnaW9uICpjZmc7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNmZywgJnBjaV9tbWNmZ19saXN0LCBsaXN0KQorCQlpZiAoY2ZnLT5zZWdtZW50ID09IHNlZ21lbnQgJiYKKwkJICAgIGNmZy0+c3RhcnRfYnVzIDw9IGJ1cyAmJiBidXMgPD0gY2ZnLT5lbmRfYnVzKQorCQkJcmV0dXJuIGNmZzsKKworCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgY29uc3QgY2hhciBfX2luaXQgKnBjaV9tbWNmZ19lNzUyMCh2b2lkKQpAQCAtNjgsMTEgKzExOCw5IEBACiAJaWYgKHdpbiA9PSAweDAwMDAgfHwgd2luID09IDB4ZjAwMCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlpZiAoZXh0ZW5kX21tY2ZnKDEpID09IC0xKQorCWlmIChwY2lfbW1jb25maWdfYWRkKDAsIDAsIDI1NSwgd2luIDw8IDE2KSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCWZpbGxfb25lX21tY2ZnKHdpbiA8PCAxNiwgMCwgMCwgMjU1KTsKLQogCXJldHVybiAiSW50ZWwgQ29ycG9yYXRpb24gRTc1MjAgTWVtb3J5IENvbnRyb2xsZXIgSHViIjsKIH0KIApAQCAtMTE0LDExICsxNjIsOSBAQAogCWlmICgocGNpZXhiYXIgJiBtYXNrKSA+PSAweGYwMDAwMDAwVSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlpZiAoZXh0ZW5kX21tY2ZnKDEpID09IC0xKQorCWlmIChwY2lfbW1jb25maWdfYWRkKDAsIDAsIChsZW4gPj4gMjApIC0gMSwgcGNpZXhiYXIgJiBtYXNrKSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCWZpbGxfb25lX21tY2ZnKHBjaWV4YmFyICYgbWFzaywgMCwgMCwgKGxlbiA+PiAyMCkgLSAxKTsKLQogCXJldHVybiAiSW50ZWwgQ29ycG9yYXRpb24gOTQ1Ry9HWi9QL1BMIEV4cHJlc3MgTWVtb3J5IENvbnRyb2xsZXIgSHViIjsKIH0KIApAQCAtMTI3LDcgKzE3Myw3IEBACiAJdTMyIGxvdywgaGlnaCwgYWRkcmVzczsKIAl1NjQgYmFzZSwgbXNyOwogCWludCBpOwotCXVuc2lnbmVkIHNlZ25iaXRzID0gMCwgYnVzbmJpdHM7CisJdW5zaWduZWQgc2VnbmJpdHMgPSAwLCBidXNuYml0cywgZW5kX2J1czsKIAogCWlmICghKHBjaV9wcm9iZSAmIFBDSV9DSEVDS19FTkFCTEVfQU1EX01NQ09ORikpCiAJCXJldHVybiBOVUxMOwpAQCAtMTYxLDExICsyMDcsMTMgQEAKIAkJYnVzbmJpdHMgPSA4OwogCX0KIAotCWlmIChleHRlbmRfbW1jZmcoMSA8PCBzZWduYml0cykgPT0gLTEpCi0JCXJldHVybiBOVUxMOwotCisJZW5kX2J1cyA9ICgxIDw8IGJ1c25iaXRzKSAtIDE7CiAJZm9yIChpID0gMDsgaSA8ICgxIDw8IHNlZ25iaXRzKTsgaSsrKQotCQlmaWxsX29uZV9tbWNmZyhiYXNlICsgKDE8PDI4KSAqIGksIGksIDAsICgxIDw8IGJ1c25iaXRzKSAtIDEpOworCQlpZiAocGNpX21tY29uZmlnX2FkZChpLCAwLCBlbmRfYnVzLAorCQkJCSAgICAgYmFzZSArICgxPDwyOCkgKiBpKSA9PSBOVUxMKSB7CisJCQlmcmVlX2FsbF9tbWNmZygpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KIAogCXJldHVybiAiQU1EIEZhbWlseSAxMGggTkIiOwogfQpAQCAtMTkwLDcgKzIzOCw3IEBACiAJLyoKIAkgKiBkbyBjaGVjayBpZiBhbWQgZmFtMTBoIGFscmVhZHkgdG9vayBvdmVyCiAJICovCi0JaWYgKCFhY3BpX2Rpc2FibGVkIHx8IHBjaV9tbWNmZ19jb25maWdfbnVtIHx8IG1jcDU1X2NoZWNrZWQpCisJaWYgKCFhY3BpX2Rpc2FibGVkIHx8ICFsaXN0X2VtcHR5KCZwY2lfbW1jZmdfbGlzdCkgfHwgbWNwNTVfY2hlY2tlZCkKIAkJcmV0dXJuIE5VTEw7CiAKIAltY3A1NV9jaGVja2VkID0gdHJ1ZTsKQEAgLTIxMywxNiArMjYxLDE0IEBACiAJCWlmICghKGV4dGNmZyAmIGV4dGNmZ19lbmFibGVfbWFzaykpCiAJCQljb250aW51ZTsKIAotCQlpZiAoZXh0ZW5kX21tY2ZnKDEpID09IC0xKQotCQkJY29udGludWU7Ci0KIAkJc2l6ZV9pbmRleCA9IChleHRjZmcgJiBleHRjZmdfc2l6ZV9tYXNrKSA+PiBleHRjZmdfc2l6ZV9zaGlmdDsKIAkJYmFzZSA9IGV4dGNmZyAmIGV4dGNmZ19iYXNlX21hc2tbc2l6ZV9pbmRleF07CiAJCS8qIGJhc2UgY291bGQgPiA0RyAqLwogCQliYXNlIDw8PSBleHRjZmdfYmFzZV9sc2hpZnQ7CiAJCXN0YXJ0ID0gKGV4dGNmZyAmIGV4dGNmZ19zdGFydF9tYXNrKSA+PiBleHRjZmdfc3RhcnRfc2hpZnQ7CiAJCWVuZCA9IHN0YXJ0ICsgZXh0Y2ZnX3NpemVidXNbc2l6ZV9pbmRleF0gLSAxOwotCQlmaWxsX29uZV9tbWNmZyhiYXNlLCAwLCBzdGFydCwgZW5kKTsKKwkJaWYgKHBjaV9tbWNvbmZpZ19hZGQoMCwgc3RhcnQsIGVuZCwgYmFzZSkgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOwogCQltY3A1NV9tbWNvbmZfZm91bmQrKzsKIAl9CiAKQEAgLTI1Myw0NSArMjk5LDI3IEBACiAJICAweDAzNjksIHBjaV9tbWNmZ19udmlkaWFfbWNwNTUgfSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IGNtcF9tbWNmZyhjb25zdCB2b2lkICp4MSwgY29uc3Qgdm9pZCAqeDIpCi17Ci0JY29uc3QgdHlwZW9mKHBjaV9tbWNmZ19jb25maWdbMF0pICptMSA9IHgxOwotCWNvbnN0IHR5cGVvZihwY2lfbW1jZmdfY29uZmlnWzBdKSAqbTIgPSB4MjsKLQlpbnQgc3RhcnQxLCBzdGFydDI7Ci0KLQlzdGFydDEgPSBtMS0+c3RhcnRfYnVzX251bWJlcjsKLQlzdGFydDIgPSBtMi0+c3RhcnRfYnVzX251bWJlcjsKLQotCXJldHVybiBzdGFydDEgLSBzdGFydDI7Ci19Ci0KIHN0YXRpYyB2b2lkIF9faW5pdCBwY2lfbW1jZmdfY2hlY2tfZW5kX2J1c19udW1iZXIodm9pZCkKIHsKLQlpbnQgaTsKLQl0eXBlb2YocGNpX21tY2ZnX2NvbmZpZ1swXSkgKmNmZywgKmNmZ3g7Ci0KLQkvKiBzb3J0IHRoZW0gYXQgZmlyc3QgKi8KLQlzb3J0KHBjaV9tbWNmZ19jb25maWcsIHBjaV9tbWNmZ19jb25maWdfbnVtLAotCQkgc2l6ZW9mKHBjaV9tbWNmZ19jb25maWdbMF0pLCBjbXBfbW1jZmcsIE5VTEwpOworCXN0cnVjdCBwY2lfbW1jZmdfcmVnaW9uICpjZmcsICpjZmd4OwogCiAJLyogbGFzdCBvbmUqLwotCWlmIChwY2lfbW1jZmdfY29uZmlnX251bSA+IDApIHsKLQkJaSA9IHBjaV9tbWNmZ19jb25maWdfbnVtIC0gMTsKLQkJY2ZnID0gJnBjaV9tbWNmZ19jb25maWdbaV07Ci0JCWlmIChjZmctPmVuZF9idXNfbnVtYmVyIDwgY2ZnLT5zdGFydF9idXNfbnVtYmVyKQotCQkJY2ZnLT5lbmRfYnVzX251bWJlciA9IDI1NTsKLQl9CisJY2ZnID0gbGlzdF9lbnRyeShwY2lfbW1jZmdfbGlzdC5wcmV2LCB0eXBlb2YoKmNmZyksIGxpc3QpOworCWlmIChjZmcpCisJCWlmIChjZmctPmVuZF9idXMgPCBjZmctPnN0YXJ0X2J1cykKKwkJCWNmZy0+ZW5kX2J1cyA9IDI1NTsKKworCWlmIChsaXN0X2lzX3Npbmd1bGFyKCZwY2lfbW1jZmdfbGlzdCkpCisJCXJldHVybjsKIAogCS8qIGRvbid0IG92ZXJsYXAgcGxlYXNlICovCi0JZm9yIChpID0gMDsgaSA8IHBjaV9tbWNmZ19jb25maWdfbnVtIC0gMTsgaSsrKSB7Ci0JCWNmZyA9ICZwY2lfbW1jZmdfY29uZmlnW2ldOwotCQljZmd4ID0gJnBjaV9tbWNmZ19jb25maWdbaSsxXTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNmZywgJnBjaV9tbWNmZ19saXN0LCBsaXN0KSB7CisJCWlmIChjZmctPmVuZF9idXMgPCBjZmctPnN0YXJ0X2J1cykKKwkJCWNmZy0+ZW5kX2J1cyA9IDI1NTsKIAotCQlpZiAoY2ZnLT5lbmRfYnVzX251bWJlciA8IGNmZy0+c3RhcnRfYnVzX251bWJlcikKLQkJCWNmZy0+ZW5kX2J1c19udW1iZXIgPSAyNTU7Ci0KLQkJaWYgKGNmZy0+ZW5kX2J1c19udW1iZXIgPj0gY2ZneC0+c3RhcnRfYnVzX251bWJlcikKLQkJCWNmZy0+ZW5kX2J1c19udW1iZXIgPSBjZmd4LT5zdGFydF9idXNfbnVtYmVyIC0gMTsKKwkJY2ZneCA9IGxpc3RfZW50cnkoY2ZnLT5saXN0Lm5leHQsIHR5cGVvZigqY2ZnKSwgbGlzdCk7CisJCWlmIChjZmcgIT0gY2ZneCAmJiBjZmctPmVuZF9idXMgPj0gY2ZneC0+c3RhcnRfYnVzKQorCQkJY2ZnLT5lbmRfYnVzID0gY2ZneC0+c3RhcnRfYnVzIC0gMTsKIAl9CiB9CiAKQEAgLTMwNiw4ICszMzQsNyBAQAogCWlmICghcmF3X3BjaV9vcHMpCiAJCXJldHVybiAwOwogCi0JcGNpX21tY2ZnX2NvbmZpZ19udW0gPSAwOwotCXBjaV9tbWNmZ19jb25maWcgPSBOVUxMOworCWZyZWVfYWxsX21tY2ZnKCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwY2lfbW1jZmdfcHJvYmVzKTsgaSsrKSB7CiAJCWJ1cyA9ICBwY2lfbW1jZmdfcHJvYmVzW2ldLmJ1czsKQEAgLTMyMiw0NSArMzQ5LDIyIEBACiAJCQluYW1lID0gcGNpX21tY2ZnX3Byb2Jlc1tpXS5wcm9iZSgpOwogCiAJCWlmIChuYW1lKQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBGb3VuZCAlcyB3aXRoIE1NQ09ORklHIHN1cHBvcnQuXG4iLAorCQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIiVzIHdpdGggTU1DT05GSUcgc3VwcG9ydFxuIiwKIAkJCSAgICAgICBuYW1lKTsKIAl9CiAKIAkvKiBzb21lIGVuZF9idXNfbnVtYmVyIGlzIGNyYXp5LCBmaXggaXQgKi8KIAlwY2lfbW1jZmdfY2hlY2tfZW5kX2J1c19udW1iZXIoKTsKIAotCXJldHVybiBwY2lfbW1jZmdfY29uZmlnX251bSAhPSAwOworCXJldHVybiAhbGlzdF9lbXB0eSgmcGNpX21tY2ZnX2xpc3QpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgcGNpX21tY2ZnX2luc2VydF9yZXNvdXJjZXModm9pZCkKIHsKLSNkZWZpbmUgUENJX01NQ0ZHX1JFU09VUkNFX05BTUVfTEVOIDI0Ci0JaW50IGk7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0JY2hhciAqbmFtZXM7Ci0JdW5zaWduZWQgbnVtX2J1c2VzOworCXN0cnVjdCBwY2lfbW1jZmdfcmVnaW9uICpjZmc7CiAKLQlyZXMgPSBrY2FsbG9jKFBDSV9NTUNGR19SRVNPVVJDRV9OQU1FX0xFTiArIHNpemVvZigqcmVzKSwKLQkJCXBjaV9tbWNmZ19jb25maWdfbnVtLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJlcykgewotCQlwcmludGsoS0VSTl9FUlIgIlBDSTogVW5hYmxlIHRvIGFsbG9jYXRlIE1NQ09ORklHIHJlc291cmNlc1xuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQluYW1lcyA9ICh2b2lkICopJnJlc1twY2lfbW1jZmdfY29uZmlnX251bV07Ci0JZm9yIChpID0gMDsgaSA8IHBjaV9tbWNmZ19jb25maWdfbnVtOyBpKyssIHJlcysrKSB7Ci0JCXN0cnVjdCBhY3BpX21jZmdfYWxsb2NhdGlvbiAqY2ZnID0gJnBjaV9tbWNmZ19jb25maWdbaV07Ci0JCW51bV9idXNlcyA9IGNmZy0+ZW5kX2J1c19udW1iZXIgLSBjZmctPnN0YXJ0X2J1c19udW1iZXIgKyAxOwotCQlyZXMtPm5hbWUgPSBuYW1lczsKLQkJc25wcmludGYobmFtZXMsIFBDSV9NTUNGR19SRVNPVVJDRV9OQU1FX0xFTiwKLQkJCSAiUENJIE1NQ09ORklHICV1IFslMDJ4LSUwMnhdIiwgY2ZnLT5wY2lfc2VnbWVudCwKLQkJCSBjZmctPnN0YXJ0X2J1c19udW1iZXIsIGNmZy0+ZW5kX2J1c19udW1iZXIpOwotCQlyZXMtPnN0YXJ0ID0gY2ZnLT5hZGRyZXNzICsgKGNmZy0+c3RhcnRfYnVzX251bWJlciA8PCAyMCk7Ci0JCXJlcy0+ZW5kID0gcmVzLT5zdGFydCArIChudW1fYnVzZXMgPDwgMjApIC0gMTsKLQkJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9CVVNZOwotCQlpbnNlcnRfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCByZXMpOwotCQluYW1lcyArPSBQQ0lfTU1DRkdfUkVTT1VSQ0VfTkFNRV9MRU47Ci0JfQorCWxpc3RfZm9yX2VhY2hfZW50cnkoY2ZnLCAmcGNpX21tY2ZnX2xpc3QsIGxpc3QpCisJCWluc2VydF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZjZmctPnJlcyk7CiAKIAkvKiBNYXJrIHRoYXQgdGhlIHJlc291cmNlcyBoYXZlIGJlZW4gaW5zZXJ0ZWQuICovCiAJcGNpX21tY2ZnX3Jlc291cmNlc19pbnNlcnRlZCA9IDE7CkBAIC00MzcsMTEgKzQ0MSwxMiBAQAogdHlwZWRlZiBpbnQgKCpjaGVja19yZXNlcnZlZF90KSh1NjQgc3RhcnQsIHU2NCBlbmQsIHVuc2lnbmVkIHR5cGUpOwogCiBzdGF0aWMgaW50IF9faW5pdCBpc19tbWNvbmZfcmVzZXJ2ZWQoY2hlY2tfcmVzZXJ2ZWRfdCBpc19yZXNlcnZlZCwKLQkJdTY0IGFkZHIsIHU2NCBzaXplLCBpbnQgaSwKLQkJdHlwZW9mKHBjaV9tbWNmZ19jb25maWdbMF0pICpjZmcsIGludCB3aXRoX2U4MjApCisJCQkJICAgIHN0cnVjdCBwY2lfbW1jZmdfcmVnaW9uICpjZmcsIGludCB3aXRoX2U4MjApCiB7CisJdTY0IGFkZHIgPSBjZmctPnJlcy5zdGFydDsKKwl1NjQgc2l6ZSA9IHJlc291cmNlX3NpemUoJmNmZy0+cmVzKTsKIAl1NjQgb2xkX3NpemUgPSBzaXplOwotCWludCB2YWxpZCA9IDA7CisJaW50IHZhbGlkID0gMCwgbnVtX2J1c2VzOwogCiAJd2hpbGUgKCFpc19yZXNlcnZlZChhZGRyLCBhZGRyICsgc2l6ZSwgRTgyMF9SRVNFUlZFRCkpIHsKIAkJc2l6ZSA+Pj0gMTsKQEAgLTQ1MCwxOSArNDU1LDI1IEBACiAJfQogCiAJaWYgKHNpemUgPj0gKDE2VUw8PDIwKSB8fCBzaXplID09IG9sZF9zaXplKSB7Ci0JCXByaW50ayhLRVJOX05PVElDRQotCQkgICAgICAgIlBDSTogTUNGRyBhcmVhIGF0ICVMeCByZXNlcnZlZCBpbiAlc1xuIiwKLQkJCWFkZHIsIHdpdGhfZTgyMD8iRTgyMCI6IkFDUEkgbW90aGVyYm9hcmQgcmVzb3VyY2VzIik7CisJCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJNTUNPTkZJRyBhdCAlcFIgcmVzZXJ2ZWQgaW4gJXNcbiIsCisJCSAgICAgICAmY2ZnLT5yZXMsCisJCSAgICAgICB3aXRoX2U4MjAgPyAiRTgyMCIgOiAiQUNQSSBtb3RoZXJib2FyZCByZXNvdXJjZXMiKTsKIAkJdmFsaWQgPSAxOwogCiAJCWlmIChvbGRfc2l6ZSAhPSBzaXplKSB7Ci0JCQkvKiB1cGRhdGUgZW5kX2J1c19udW1iZXIgKi8KLQkJCWNmZy0+ZW5kX2J1c19udW1iZXIgPSBjZmctPnN0YXJ0X2J1c19udW1iZXIgKyAoKHNpemU+PjIwKSAtIDEpOwotCQkJcHJpbnRrKEtFUk5fTk9USUNFICJQQ0k6IHVwZGF0ZWQgTUNGRyBjb25maWd1cmF0aW9uICVkOiBiYXNlICVseCAiCi0JCQkgICAgICAgInNlZ21lbnQgJWh1IGJ1c2VzICV1IC0gJXVcbiIsCi0JCQkgICAgICAgaSwgKHVuc2lnbmVkIGxvbmcpY2ZnLT5hZGRyZXNzLCBjZmctPnBjaV9zZWdtZW50LAotCQkJICAgICAgICh1bnNpZ25lZCBpbnQpY2ZnLT5zdGFydF9idXNfbnVtYmVyLAotCQkJICAgICAgICh1bnNpZ25lZCBpbnQpY2ZnLT5lbmRfYnVzX251bWJlcik7CisJCQkvKiB1cGRhdGUgZW5kX2J1cyAqLworCQkJY2ZnLT5lbmRfYnVzID0gY2ZnLT5zdGFydF9idXMgKyAoKHNpemU+PjIwKSAtIDEpOworCQkJbnVtX2J1c2VzID0gY2ZnLT5lbmRfYnVzIC0gY2ZnLT5zdGFydF9idXMgKyAxOworCQkJY2ZnLT5yZXMuZW5kID0gY2ZnLT5yZXMuc3RhcnQgKworCQkJICAgIFBDSV9NTUNGR19CVVNfT0ZGU0VUKG51bV9idXNlcykgLSAxOworCQkJc25wcmludGYoY2ZnLT5uYW1lLCBQQ0lfTU1DRkdfUkVTT1VSQ0VfTkFNRV9MRU4sCisJCQkJICJQQ0kgTU1DT05GSUcgJTA0eCBbYnVzICUwMngtJTAyeF0iLAorCQkJCSBjZmctPnNlZ21lbnQsIGNmZy0+c3RhcnRfYnVzLCBjZmctPmVuZF9idXMpOworCQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVgKKwkJCSAgICAgICAiTU1DT05GSUcgZm9yICUwNHggW2J1cyUwMngtJTAyeF0gIgorCQkJICAgICAgICJhdCAlcFIgKGJhc2UgJSNseCkgKHNpemUgcmVkdWNlZCEpXG4iLAorCQkJICAgICAgIGNmZy0+c2VnbWVudCwgY2ZnLT5zdGFydF9idXMsIGNmZy0+ZW5kX2J1cywKKwkJCSAgICAgICAmY2ZnLT5yZXMsICh1bnNpZ25lZCBsb25nKSBjZmctPmFkZHJlc3MpOwogCQl9CiAJfQogCkBAIC00NzEsNDUgKzQ4MiwyNiBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgcGNpX21tY2ZnX3JlamVjdF9icm9rZW4oaW50IGVhcmx5KQogewotCXR5cGVvZihwY2lfbW1jZmdfY29uZmlnWzBdKSAqY2ZnOwotCWludCBpOworCXN0cnVjdCBwY2lfbW1jZmdfcmVnaW9uICpjZmc7CiAKLQlpZiAoKHBjaV9tbWNmZ19jb25maWdfbnVtID09IDApIHx8Ci0JICAgIChwY2lfbW1jZmdfY29uZmlnID09IE5VTEwpIHx8Ci0JICAgIChwY2lfbW1jZmdfY29uZmlnWzBdLmFkZHJlc3MgPT0gMCkpCi0JCXJldHVybjsKLQotCWZvciAoaSA9IDA7IGkgPCBwY2lfbW1jZmdfY29uZmlnX251bTsgaSsrKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjZmcsICZwY2lfbW1jZmdfbGlzdCwgbGlzdCkgewogCQlpbnQgdmFsaWQgPSAwOwotCQl1NjQgYWRkciwgc2l6ZTsKLQotCQljZmcgPSAmcGNpX21tY2ZnX2NvbmZpZ1tpXTsKLQkJYWRkciA9IGNmZy0+c3RhcnRfYnVzX251bWJlcjsKLQkJYWRkciA8PD0gMjA7Ci0JCWFkZHIgKz0gY2ZnLT5hZGRyZXNzOwotCQlzaXplID0gY2ZnLT5lbmRfYnVzX251bWJlciArIDEgLSBjZmctPnN0YXJ0X2J1c19udW1iZXI7Ci0JCXNpemUgPDw9IDIwOwotCQlwcmludGsoS0VSTl9OT1RJQ0UgIlBDSTogTUNGRyBjb25maWd1cmF0aW9uICVkOiBiYXNlICVseCAiCi0JCSAgICAgICAic2VnbWVudCAlaHUgYnVzZXMgJXUgLSAldVxuIiwKLQkJICAgICAgIGksICh1bnNpZ25lZCBsb25nKWNmZy0+YWRkcmVzcywgY2ZnLT5wY2lfc2VnbWVudCwKLQkJICAgICAgICh1bnNpZ25lZCBpbnQpY2ZnLT5zdGFydF9idXNfbnVtYmVyLAotCQkgICAgICAgKHVuc2lnbmVkIGludCljZmctPmVuZF9idXNfbnVtYmVyKTsKIAogCQlpZiAoIWVhcmx5ICYmICFhY3BpX2Rpc2FibGVkKQotCQkJdmFsaWQgPSBpc19tbWNvbmZfcmVzZXJ2ZWQoaXNfYWNwaV9yZXNlcnZlZCwgYWRkciwgc2l6ZSwgaSwgY2ZnLCAwKTsKKwkJCXZhbGlkID0gaXNfbW1jb25mX3Jlc2VydmVkKGlzX2FjcGlfcmVzZXJ2ZWQsIGNmZywgMCk7CiAKIAkJaWYgKHZhbGlkKQogCQkJY29udGludWU7CiAKIAkJaWYgKCFlYXJseSkKLQkJCXByaW50ayhLRVJOX0VSUiAiUENJOiBCSU9TIEJ1ZzogTUNGRyBhcmVhIGF0ICVMeCBpcyBub3QiCi0JCQkgICAgICAgIiByZXNlcnZlZCBpbiBBQ1BJIG1vdGhlcmJvYXJkIHJlc291cmNlc1xuIiwKLQkJCSAgICAgICBjZmctPmFkZHJlc3MpOworCQkJcHJpbnRrKEtFUk5fRVJSIEZXX0JVRyBQUkVGSVgKKwkJCSAgICAgICAiTU1DT05GSUcgYXQgJXBSIG5vdCByZXNlcnZlZCBpbiAiCisJCQkgICAgICAgIkFDUEkgbW90aGVyYm9hcmQgcmVzb3VyY2VzXG4iLCAmY2ZnLT5yZXMpOwogCiAJCS8qIERvbid0IHRyeSB0byBkbyB0aGlzIGNoZWNrIHVubGVzcyBjb25maWd1cmF0aW9uCiAJCSAgIHR5cGUgMSBpcyBhdmFpbGFibGUuIGhvdyBhYm91dCB0eXBlIDIgPyovCiAJCWlmIChyYXdfcGNpX29wcykKLQkJCXZhbGlkID0gaXNfbW1jb25mX3Jlc2VydmVkKGU4MjBfYWxsX21hcHBlZCwgYWRkciwgc2l6ZSwgaSwgY2ZnLCAxKTsKKwkJCXZhbGlkID0gaXNfbW1jb25mX3Jlc2VydmVkKGU4MjBfYWxsX21hcHBlZCwgY2ZnLCAxKTsKIAogCQlpZiAoIXZhbGlkKQogCQkJZ290byByZWplY3Q7CkBAIC01MTgsMzQgKzUxMCw0MSBAQAogCXJldHVybjsKIAogcmVqZWN0OgotCXByaW50ayhLRVJOX0lORk8gIlBDSTogTm90IHVzaW5nIE1NQ09ORklHLlxuIik7Ci0JcGNpX21tY2ZnX2FyY2hfZnJlZSgpOwotCWtmcmVlKHBjaV9tbWNmZ19jb25maWcpOwotCXBjaV9tbWNmZ19jb25maWcgPSBOVUxMOwotCXBjaV9tbWNmZ19jb25maWdfbnVtID0gMDsKKwlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAibm90IHVzaW5nIE1NQ09ORklHXG4iKTsKKwlmcmVlX2FsbF9tbWNmZygpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdGRhdGEga25vd25fYnJpZGdlOwogCi1zdGF0aWMgaW50IGFjcGlfbWNmZ182NGJpdF9iYXNlX2FkZHIgX19pbml0ZGF0YSA9IEZBTFNFOwotCi0vKiBUaGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgTU1DT05GSUcgYXBlcnR1cmUuICBTZXQgZnJvbSBBQ1BJIHRhYmxlcy4gKi8KLXN0cnVjdCBhY3BpX21jZmdfYWxsb2NhdGlvbiAqcGNpX21tY2ZnX2NvbmZpZzsKLWludCBwY2lfbW1jZmdfY29uZmlnX251bTsKLQotc3RhdGljIGludCBfX2luaXQgYWNwaV9tY2ZnX29lbV9jaGVjayhzdHJ1Y3QgYWNwaV90YWJsZV9tY2ZnICptY2ZnKQorc3RhdGljIGludCBfX2luaXQgYWNwaV9tY2ZnX2NoZWNrX2VudHJ5KHN0cnVjdCBhY3BpX3RhYmxlX21jZmcgKm1jZmcsCisJCQkJCXN0cnVjdCBhY3BpX21jZmdfYWxsb2NhdGlvbiAqY2ZnKQogewotCWlmICghc3RyY21wKG1jZmctPmhlYWRlci5vZW1faWQsICJTR0kiKSkKLQkJYWNwaV9tY2ZnXzY0Yml0X2Jhc2VfYWRkciA9IFRSVUU7CisJaW50IHllYXI7CiAKLQlyZXR1cm4gMDsKKwlpZiAoY2ZnLT5hZGRyZXNzIDwgMHhGRkZGRkZGRikKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXN0cmNtcChtY2ZnLT5oZWFkZXIub2VtX2lkLCAiU0dJIikpCisJCXJldHVybiAwOworCisJaWYgKG1jZmctPmhlYWRlci5yZXZpc2lvbiA+PSAxKSB7CisJCWlmIChkbWlfZ2V0X2RhdGUoRE1JX0JJT1NfREFURSwgJnllYXIsIE5VTEwsIE5VTEwpICYmCisJCSAgICB5ZWFyID49IDIwMTApCisJCQlyZXR1cm4gMDsKKwl9CisKKwlwcmludGsoS0VSTl9FUlIgUFJFRklYICJNQ0ZHIHJlZ2lvbiBmb3IgJTA0eCBbYnVzICUwMngtJTAyeF0gYXQgJSNsbHggIgorCSAgICAgICAiaXMgYWJvdmUgNEdCLCBpZ25vcmVkXG4iLCBjZmctPnBjaV9zZWdtZW50LAorCSAgICAgICBjZmctPnN0YXJ0X2J1c19udW1iZXIsIGNmZy0+ZW5kX2J1c19udW1iZXIsIGNmZy0+YWRkcmVzcyk7CisJcmV0dXJuIC1FSU5WQUw7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHBjaV9wYXJzZV9tY2ZnKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyKQogewogCXN0cnVjdCBhY3BpX3RhYmxlX21jZmcgKm1jZmc7CisJc3RydWN0IGFjcGlfbWNmZ19hbGxvY2F0aW9uICpjZmdfdGFibGUsICpjZmc7CiAJdW5zaWduZWQgbG9uZyBpOwotCWludCBjb25maWdfc2l6ZTsKKwlpbnQgZW50cmllczsKIAogCWlmICghaGVhZGVyKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTU1MywzOCArNTUyLDMzIEBACiAJbWNmZyA9IChzdHJ1Y3QgYWNwaV90YWJsZV9tY2ZnICopaGVhZGVyOwogCiAJLyogaG93IG1hbnkgY29uZmlnIHN0cnVjdHVyZXMgZG8gd2UgaGF2ZSAqLwotCXBjaV9tbWNmZ19jb25maWdfbnVtID0gMDsKKwlmcmVlX2FsbF9tbWNmZygpOworCWVudHJpZXMgPSAwOwogCWkgPSBoZWFkZXItPmxlbmd0aCAtIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9tY2ZnKTsKIAl3aGlsZSAoaSA+PSBzaXplb2Yoc3RydWN0IGFjcGlfbWNmZ19hbGxvY2F0aW9uKSkgewotCQkrK3BjaV9tbWNmZ19jb25maWdfbnVtOworCQllbnRyaWVzKys7CiAJCWkgLT0gc2l6ZW9mKHN0cnVjdCBhY3BpX21jZmdfYWxsb2NhdGlvbik7CiAJfTsKLQlpZiAocGNpX21tY2ZnX2NvbmZpZ19udW0gPT0gMCkgeworCWlmIChlbnRyaWVzID09IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiTU1DT05GSUcgaGFzIG5vIGVudHJpZXNcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQljb25maWdfc2l6ZSA9IHBjaV9tbWNmZ19jb25maWdfbnVtICogc2l6ZW9mKCpwY2lfbW1jZmdfY29uZmlnKTsKLQlwY2lfbW1jZmdfY29uZmlnID0ga21hbGxvYyhjb25maWdfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwY2lfbW1jZmdfY29uZmlnKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYCi0JCSAgICAgICAiTm8gbWVtb3J5IGZvciBNQ0ZHIGNvbmZpZyB0YWJsZXNcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQltZW1jcHkocGNpX21tY2ZnX2NvbmZpZywgJm1jZmdbMV0sIGNvbmZpZ19zaXplKTsKLQotCWFjcGlfbWNmZ19vZW1fY2hlY2sobWNmZyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcGNpX21tY2ZnX2NvbmZpZ19udW07ICsraSkgewotCQlpZiAoKHBjaV9tbWNmZ19jb25maWdbaV0uYWRkcmVzcyA+IDB4RkZGRkZGRkYpICYmCi0JCSAgICAhYWNwaV9tY2ZnXzY0Yml0X2Jhc2VfYWRkcikgewotCQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAotCQkJICAgICAgICJNTUNPTkZJRyBub3QgaW4gbG93IDRHQiBvZiBtZW1vcnlcbiIpOwotCQkJa2ZyZWUocGNpX21tY2ZnX2NvbmZpZyk7Ci0JCQlwY2lfbW1jZmdfY29uZmlnX251bSA9IDA7CisJY2ZnX3RhYmxlID0gKHN0cnVjdCBhY3BpX21jZmdfYWxsb2NhdGlvbiAqKSAmbWNmZ1sxXTsKKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7CisJCWNmZyA9ICZjZmdfdGFibGVbaV07CisJCWlmIChhY3BpX21jZmdfY2hlY2tfZW50cnkobWNmZywgY2ZnKSkgeworCQkJZnJlZV9hbGxfbW1jZmcoKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CisKKwkJaWYgKHBjaV9tbWNvbmZpZ19hZGQoY2ZnLT5wY2lfc2VnbWVudCwgY2ZnLT5zdGFydF9idXNfbnVtYmVyLAorCQkJCSAgIGNmZy0+ZW5kX2J1c19udW1iZXIsIGNmZy0+YWRkcmVzcykgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVgKKwkJCSAgICAgICAibm8gbWVtb3J5IGZvciBNQ0ZHIGVudHJpZXNcbiIpOworCQkJZnJlZV9hbGxfbW1jZmcoKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CiAJfQogCiAJcmV0dXJuIDA7CkBAIC02MTQsOSArNjA4LDcgQEAKIAogCXBjaV9tbWNmZ19yZWplY3RfYnJva2VuKGVhcmx5KTsKIAotCWlmICgocGNpX21tY2ZnX2NvbmZpZ19udW0gPT0gMCkgfHwKLQkgICAgKHBjaV9tbWNmZ19jb25maWcgPT0gTlVMTCkgfHwKLQkgICAgKHBjaV9tbWNmZ19jb25maWdbMF0uYWRkcmVzcyA9PSAwKSkKKwlpZiAobGlzdF9lbXB0eSgmcGNpX21tY2ZnX2xpc3QpKQogCQlyZXR1cm47CiAKIAlpZiAocGNpX21tY2ZnX2FyY2hfaW5pdCgpKQpAQCAtNjQ4LDkgKzY0MCw3IEBACiAJICovCiAJaWYgKChwY2lfbW1jZmdfcmVzb3VyY2VzX2luc2VydGVkID09IDEpIHx8CiAJICAgIChwY2lfcHJvYmUgJiBQQ0lfUFJPQkVfTU1DT05GKSA9PSAwIHx8Ci0JICAgIChwY2lfbW1jZmdfY29uZmlnX251bSA9PSAwKSB8fAotCSAgICAocGNpX21tY2ZnX2NvbmZpZyA9PSBOVUxMKSB8fAotCSAgICAocGNpX21tY2ZnX2NvbmZpZ1swXS5hZGRyZXNzID09IDApKQorCSAgICBsaXN0X2VtcHR5KCZwY2lfbW1jZmdfbGlzdCkpCiAJCXJldHVybiAxOwogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9tbWNvbmZpZ18zMi5jIGIvYXJjaC94ODYvcGNpL21tY29uZmlnXzMyLmMKaW5kZXggZjEwYTdlOS4uOTBkNWZkNDcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9tbWNvbmZpZ18zMi5jCisrKyBiL2FyY2gveDg2L3BjaS9tbWNvbmZpZ18zMi5jCkBAIC0yNywxOCArMjcsMTAgQEAKICAqLwogc3RhdGljIHUzMiBnZXRfYmFzZV9hZGRyKHVuc2lnbmVkIGludCBzZWcsIGludCBidXMsIHVuc2lnbmVkIGRldmZuKQogewotCXN0cnVjdCBhY3BpX21jZmdfYWxsb2NhdGlvbiAqY2ZnOwotCWludCBjZmdfbnVtOworCXN0cnVjdCBwY2lfbW1jZmdfcmVnaW9uICpjZmcgPSBwY2lfbW1jb25maWdfbG9va3VwKHNlZywgYnVzKTsKIAotCWZvciAoY2ZnX251bSA9IDA7IGNmZ19udW0gPCBwY2lfbW1jZmdfY29uZmlnX251bTsgY2ZnX251bSsrKSB7Ci0JCWNmZyA9ICZwY2lfbW1jZmdfY29uZmlnW2NmZ19udW1dOwotCQlpZiAoY2ZnLT5wY2lfc2VnbWVudCA9PSBzZWcgJiYKLQkJICAgIChjZmctPnN0YXJ0X2J1c19udW1iZXIgPD0gYnVzKSAmJgotCQkgICAgKGNmZy0+ZW5kX2J1c19udW1iZXIgPj0gYnVzKSkKLQkJCXJldHVybiBjZmctPmFkZHJlc3M7Ci0JfQotCi0JLyogRmFsbCBiYWNrIHRvIHR5cGUgMCAqLworCWlmIChjZmcpCisJCXJldHVybiBjZmctPmFkZHJlc3M7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ3LDcgKzM5LDcgQEAKICAqLwogc3RhdGljIHZvaWQgcGNpX2V4cF9zZXRfZGV2X2Jhc2UodW5zaWduZWQgaW50IGJhc2UsIGludCBidXMsIGludCBkZXZmbikKIHsKLQl1MzIgZGV2X2Jhc2UgPSBiYXNlIHwgKGJ1cyA8PCAyMCkgfCAoZGV2Zm4gPDwgMTIpOworCXUzMiBkZXZfYmFzZSA9IGJhc2UgfCBQQ0lfTU1DRkdfQlVTX09GRlNFVChidXMpIHwgKGRldmZuIDw8IDEyKTsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCWlmIChkZXZfYmFzZSAhPSBtbWNmZ19sYXN0X2FjY2Vzc2VkX2RldmljZSB8fAogCSAgICBjcHUgIT0gbW1jZmdfbGFzdF9hY2Nlc3NlZF9jcHUpIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9tbWNvbmZpZ182NC5jIGIvYXJjaC94ODYvcGNpL21tY29uZmlnXzY0LmMKaW5kZXggOTQzNDlmOC4uZTc4Mzg0MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL21tY29uZmlnXzY0LmMKKysrIGIvYXJjaC94ODYvcGNpL21tY29uZmlnXzY0LmMKQEAgLTEyLDM4ICsxMiwxNSBAQAogI2luY2x1ZGUgPGFzbS9lODIwLmg+CiAjaW5jbHVkZSA8YXNtL3BjaV94ODYuaD4KIAotLyogU3RhdGljIHZpcnR1YWwgbWFwcGluZyBvZiB0aGUgTU1DT05GSUcgYXBlcnR1cmUgKi8KLXN0cnVjdCBtbWNmZ192aXJ0IHsKLQlzdHJ1Y3QgYWNwaV9tY2ZnX2FsbG9jYXRpb24gKmNmZzsKLQljaGFyIF9faW9tZW0gKnZpcnQ7Ci19Owotc3RhdGljIHN0cnVjdCBtbWNmZ192aXJ0ICpwY2lfbW1jZmdfdmlydDsKLQotc3RhdGljIGNoYXIgX19pb21lbSAqZ2V0X3ZpcnQodW5zaWduZWQgaW50IHNlZywgdW5zaWduZWQgYnVzKQotewotCXN0cnVjdCBhY3BpX21jZmdfYWxsb2NhdGlvbiAqY2ZnOwotCWludCBjZmdfbnVtOwotCi0JZm9yIChjZmdfbnVtID0gMDsgY2ZnX251bSA8IHBjaV9tbWNmZ19jb25maWdfbnVtOyBjZmdfbnVtKyspIHsKLQkJY2ZnID0gcGNpX21tY2ZnX3ZpcnRbY2ZnX251bV0uY2ZnOwotCQlpZiAoY2ZnLT5wY2lfc2VnbWVudCA9PSBzZWcgJiYKLQkJICAgIChjZmctPnN0YXJ0X2J1c19udW1iZXIgPD0gYnVzKSAmJgotCQkgICAgKGNmZy0+ZW5kX2J1c19udW1iZXIgPj0gYnVzKSkKLQkJCXJldHVybiBwY2lfbW1jZmdfdmlydFtjZmdfbnVtXS52aXJ0OwotCX0KLQotCS8qIEZhbGwgYmFjayB0byB0eXBlIDAgKi8KLQlyZXR1cm4gTlVMTDsKLX0KKyNkZWZpbmUgUFJFRklYICJQQ0k6ICIKIAogc3RhdGljIGNoYXIgX19pb21lbSAqcGNpX2Rldl9iYXNlKHVuc2lnbmVkIGludCBzZWcsIHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZmbikKIHsKLQljaGFyIF9faW9tZW0gKmFkZHI7CisJc3RydWN0IHBjaV9tbWNmZ19yZWdpb24gKmNmZyA9IHBjaV9tbWNvbmZpZ19sb29rdXAoc2VnLCBidXMpOwogCi0JYWRkciA9IGdldF92aXJ0KHNlZywgYnVzKTsKLQlpZiAoIWFkZHIpCi0JCXJldHVybiBOVUxMOwotIAlyZXR1cm4gYWRkciArICgoYnVzIDw8IDIwKSB8IChkZXZmbiA8PCAxMikpOworCWlmIChjZmcgJiYgY2ZnLT52aXJ0KQorCQlyZXR1cm4gY2ZnLT52aXJ0ICsgKFBDSV9NTUNGR19CVVNfT0ZGU0VUKGJ1cykgfCAoZGV2Zm4gPDwgMTIpKTsKKwlyZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGludCBwY2lfbW1jZmdfcmVhZCh1bnNpZ25lZCBpbnQgc2VnLCB1bnNpZ25lZCBpbnQgYnVzLApAQCAtMTA5LDQyICs4NiwzMCBAQAogCS53cml0ZSA9CXBjaV9tbWNmZ193cml0ZSwKIH07CiAKLXN0YXRpYyB2b2lkIF9faW9tZW0gKiBfX2luaXQgbWNmZ19pb3JlbWFwKHN0cnVjdCBhY3BpX21jZmdfYWxsb2NhdGlvbiAqY2ZnKQorc3RhdGljIHZvaWQgX19pb21lbSAqIF9faW5pdCBtY2ZnX2lvcmVtYXAoc3RydWN0IHBjaV9tbWNmZ19yZWdpb24gKmNmZykKIHsKIAl2b2lkIF9faW9tZW0gKmFkZHI7CiAJdTY0IHN0YXJ0LCBzaXplOworCWludCBudW1fYnVzZXM7CiAKLQlzdGFydCA9IGNmZy0+c3RhcnRfYnVzX251bWJlcjsKLQlzdGFydCA8PD0gMjA7Ci0Jc3RhcnQgKz0gY2ZnLT5hZGRyZXNzOwotCXNpemUgPSBjZmctPmVuZF9idXNfbnVtYmVyICsgMSAtIGNmZy0+c3RhcnRfYnVzX251bWJlcjsKLQlzaXplIDw8PSAyMDsKKwlzdGFydCA9IGNmZy0+YWRkcmVzcyArIFBDSV9NTUNGR19CVVNfT0ZGU0VUKGNmZy0+c3RhcnRfYnVzKTsKKwludW1fYnVzZXMgPSBjZmctPmVuZF9idXMgLSBjZmctPnN0YXJ0X2J1cyArIDE7CisJc2l6ZSA9IFBDSV9NTUNGR19CVVNfT0ZGU0VUKG51bV9idXNlcyk7CiAJYWRkciA9IGlvcmVtYXBfbm9jYWNoZShzdGFydCwgc2l6ZSk7Ci0JaWYgKGFkZHIpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBVc2luZyBNTUNPTkZJRyBhdCAlTHggLSAlTHhcbiIsCi0JCSAgICAgICBzdGFydCwgc3RhcnQgKyBzaXplIC0gMSk7Ci0JCWFkZHIgLT0gY2ZnLT5zdGFydF9idXNfbnVtYmVyIDw8IDIwOwotCX0KKwlpZiAoYWRkcikKKwkJYWRkciAtPSBQQ0lfTU1DRkdfQlVTX09GRlNFVChjZmctPnN0YXJ0X2J1cyk7CiAJcmV0dXJuIGFkZHI7CiB9CiAKIGludCBfX2luaXQgcGNpX21tY2ZnX2FyY2hfaW5pdCh2b2lkKQogewotCWludCBpOwotCXBjaV9tbWNmZ192aXJ0ID0ga3phbGxvYyhzaXplb2YoKnBjaV9tbWNmZ192aXJ0KSAqCi0JCQkJIHBjaV9tbWNmZ19jb25maWdfbnVtLCBHRlBfS0VSTkVMKTsKLQlpZiAocGNpX21tY2ZnX3ZpcnQgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIlBDSTogQ2FuIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIG1tY29uZmlnIHN0cnVjdHVyZXNcbiIpOwotCQlyZXR1cm4gMDsKLQl9CisJc3RydWN0IHBjaV9tbWNmZ19yZWdpb24gKmNmZzsKIAotCWZvciAoaSA9IDA7IGkgPCBwY2lfbW1jZmdfY29uZmlnX251bTsgKytpKSB7Ci0JCXBjaV9tbWNmZ192aXJ0W2ldLmNmZyA9ICZwY2lfbW1jZmdfY29uZmlnW2ldOwotCQlwY2lfbW1jZmdfdmlydFtpXS52aXJ0ID0gbWNmZ19pb3JlbWFwKCZwY2lfbW1jZmdfY29uZmlnW2ldKTsKLQkJaWYgKCFwY2lfbW1jZmdfdmlydFtpXS52aXJ0KSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlBDSTogQ2Fubm90IG1hcCBtbWNvbmZpZyBhcGVydHVyZSBmb3IgIgotCQkJCQkic2VnbWVudCAlZFxuIiwKLQkJCQlwY2lfbW1jZmdfY29uZmlnW2ldLnBjaV9zZWdtZW50KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNmZywgJnBjaV9tbWNmZ19saXN0LCBsaXN0KSB7CisJCWNmZy0+dmlydCA9IG1jZmdfaW9yZW1hcChjZmcpOworCQlpZiAoIWNmZy0+dmlydCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiY2FuJ3QgbWFwIE1NQ09ORklHIGF0ICVwUlxuIiwKKwkJCSAgICAgICAmY2ZnLT5yZXMpOwogCQkJcGNpX21tY2ZnX2FyY2hfZnJlZSgpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTE1NSwxOSArMTIwLDEyIEBACiAKIHZvaWQgX19pbml0IHBjaV9tbWNmZ19hcmNoX2ZyZWUodm9pZCkKIHsKLQlpbnQgaTsKKwlzdHJ1Y3QgcGNpX21tY2ZnX3JlZ2lvbiAqY2ZnOwogCi0JaWYgKHBjaV9tbWNmZ192aXJ0ID09IE5VTEwpCi0JCXJldHVybjsKLQotCWZvciAoaSA9IDA7IGkgPCBwY2lfbW1jZmdfY29uZmlnX251bTsgKytpKSB7Ci0JCWlmIChwY2lfbW1jZmdfdmlydFtpXS52aXJ0KSB7Ci0JCQlpb3VubWFwKHBjaV9tbWNmZ192aXJ0W2ldLnZpcnQgKyAocGNpX21tY2ZnX3ZpcnRbaV0uY2ZnLT5zdGFydF9idXNfbnVtYmVyIDw8IDIwKSk7Ci0JCQlwY2lfbW1jZmdfdmlydFtpXS52aXJ0ID0gTlVMTDsKLQkJCXBjaV9tbWNmZ192aXJ0W2ldLmNmZyA9IE5VTEw7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjZmcsICZwY2lfbW1jZmdfbGlzdCwgbGlzdCkgeworCQlpZiAoY2ZnLT52aXJ0KSB7CisJCQlpb3VubWFwKGNmZy0+dmlydCArIFBDSV9NTUNGR19CVVNfT0ZGU0VUKGNmZy0+c3RhcnRfYnVzKSk7CisJCQljZmctPnZpcnQgPSBOVUxMOwogCQl9CiAJfQotCi0Ja2ZyZWUocGNpX21tY2ZnX3ZpcnQpOwotCXBjaV9tbWNmZ192aXJ0ID0gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3Rvb2xzL3Rlc3RfZ2V0X2xlbi5jIGIvYXJjaC94ODYvdG9vbHMvdGVzdF9nZXRfbGVuLmMKaW5kZXggZDgyMTRkYy4uYmVlOGQ2YSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvdG9vbHMvdGVzdF9nZXRfbGVuLmMKKysrIGIvYXJjaC94ODYvdG9vbHMvdGVzdF9nZXRfbGVuLmMKQEAgLTExMyw3ICsxMTMsNyBAQAogCWNoYXIgbGluZVtCVUZTSVpFXSwgc3ltW0JVRlNJWkVdID0gIjx1bmtub3duPiI7CiAJdW5zaWduZWQgY2hhciBpbnNuX2J1ZlsxNl07CiAJc3RydWN0IGluc24gaW5zbjsKLQlpbnQgaW5zbnMgPSAwLCBjOworCWludCBpbnNucyA9IDA7CiAJaW50IHdhcm5pbmdzID0gMDsKIAogCXBhcnNlX2FyZ3MoYXJnYywgYXJndik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMgYi9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMKaW5kZXggYjhlNDVmMS4uMmIyNmRkNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jCisrKyBiL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYwpAQCAtMjcsNyArMjcsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2UtZmxhZ3MuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCisjaW5jbHVkZSA8eGVuL3hlbi5oPgogI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UveGVuLmg+CiAjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS9waHlzZGV2Lmg+CkBAIC0xMTc1LDcgKzExNzcsMTEgQEAKIAkJYWRkX3ByZWZlcnJlZF9jb25zb2xlKCJ4ZW5ib290IiwgMCwgTlVMTCk7CiAJCWFkZF9wcmVmZXJyZWRfY29uc29sZSgidHR5IiwgMCwgTlVMTCk7CiAJCWFkZF9wcmVmZXJyZWRfY29uc29sZSgiaHZjIiwgMCwgTlVMTCk7CisJfSBlbHNlIHsKKwkJLyogTWFrZSBzdXJlIEFDUyB3aWxsIGJlIGVuYWJsZWQgKi8KKwkJcGNpX3JlcXVlc3RfYWNzKCk7CiAJfQorCQkKIAogCXhlbl9yYXdfY29uc29sZV93cml0ZSgiYWJvdXQgdG8gZ2V0IHN0YXJ0ZWQuLi5cbiIpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vc21wLmMgYi9hcmNoL3g4Ni94ZW4vc21wLmMKaW5kZXggNjQ3NTdjMC4uNTYzZDIwNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL3NtcC5jCisrKyBiL2FyY2gveDg2L3hlbi9zbXAuYwpAQCAtMzUsMTAgKzM1LDEwIEBACiAKIGNwdW1hc2tfdmFyX3QgeGVuX2NwdV9pbml0aWFsaXplZF9tYXA7CiAKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIHJlc2NoZWRfaXJxKTsKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIGNhbGxmdW5jX2lycSk7Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBjYWxsZnVuY3NpbmdsZV9pcnEpOwotc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgZGVidWdfaXJxKSA9IC0xOworc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgeGVuX3Jlc2NoZWRfaXJxKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIHhlbl9jYWxsZnVuY19pcnEpOworc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgeGVuX2NhbGxmdW5jc2luZ2xlX2lycSk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCB4ZW5fZGVidWdfaXJxKSA9IC0xOwogCiBzdGF0aWMgaXJxcmV0dXJuX3QgeGVuX2NhbGxfZnVuY3Rpb25faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCk7CiBzdGF0aWMgaXJxcmV0dXJuX3QgeGVuX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwpAQCAtMTAzLDcgKzEwMyw3IEBACiAJCQkJICAgIE5VTEwpOwogCWlmIChyYyA8IDApCiAJCWdvdG8gZmFpbDsKLQlwZXJfY3B1KHJlc2NoZWRfaXJxLCBjcHUpID0gcmM7CisJcGVyX2NwdSh4ZW5fcmVzY2hlZF9pcnEsIGNwdSkgPSByYzsKIAogCWNhbGxmdW5jX25hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgImNhbGxmdW5jJWQiLCBjcHUpOwogCXJjID0gYmluZF9pcGlfdG9faXJxaGFuZGxlcihYRU5fQ0FMTF9GVU5DVElPTl9WRUNUT1IsCkBAIC0xMTQsNyArMTE0LDcgQEAKIAkJCQkgICAgTlVMTCk7CiAJaWYgKHJjIDwgMCkKIAkJZ290byBmYWlsOwotCXBlcl9jcHUoY2FsbGZ1bmNfaXJxLCBjcHUpID0gcmM7CisJcGVyX2NwdSh4ZW5fY2FsbGZ1bmNfaXJxLCBjcHUpID0gcmM7CiAKIAlkZWJ1Z19uYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICJkZWJ1ZyVkIiwgY3B1KTsKIAlyYyA9IGJpbmRfdmlycV90b19pcnFoYW5kbGVyKFZJUlFfREVCVUcsIGNwdSwgeGVuX2RlYnVnX2ludGVycnVwdCwKQEAgLTEyMiw3ICsxMjIsNyBAQAogCQkJCSAgICAgZGVidWdfbmFtZSwgTlVMTCk7CiAJaWYgKHJjIDwgMCkKIAkJZ290byBmYWlsOwotCXBlcl9jcHUoZGVidWdfaXJxLCBjcHUpID0gcmM7CisJcGVyX2NwdSh4ZW5fZGVidWdfaXJxLCBjcHUpID0gcmM7CiAKIAljYWxsZnVuY19uYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICJjYWxsZnVuY3NpbmdsZSVkIiwgY3B1KTsKIAlyYyA9IGJpbmRfaXBpX3RvX2lycWhhbmRsZXIoWEVOX0NBTExfRlVOQ1RJT05fU0lOR0xFX1ZFQ1RPUiwKQEAgLTEzMywxOSArMTMzLDIwIEBACiAJCQkJICAgIE5VTEwpOwogCWlmIChyYyA8IDApCiAJCWdvdG8gZmFpbDsKLQlwZXJfY3B1KGNhbGxmdW5jc2luZ2xlX2lycSwgY3B1KSA9IHJjOworCXBlcl9jcHUoeGVuX2NhbGxmdW5jc2luZ2xlX2lycSwgY3B1KSA9IHJjOwogCiAJcmV0dXJuIDA7CiAKICBmYWlsOgotCWlmIChwZXJfY3B1KHJlc2NoZWRfaXJxLCBjcHUpID49IDApCi0JCXVuYmluZF9mcm9tX2lycWhhbmRsZXIocGVyX2NwdShyZXNjaGVkX2lycSwgY3B1KSwgTlVMTCk7Ci0JaWYgKHBlcl9jcHUoY2FsbGZ1bmNfaXJxLCBjcHUpID49IDApCi0JCXVuYmluZF9mcm9tX2lycWhhbmRsZXIocGVyX2NwdShjYWxsZnVuY19pcnEsIGNwdSksIE5VTEwpOwotCWlmIChwZXJfY3B1KGRlYnVnX2lycSwgY3B1KSA+PSAwKQotCQl1bmJpbmRfZnJvbV9pcnFoYW5kbGVyKHBlcl9jcHUoZGVidWdfaXJxLCBjcHUpLCBOVUxMKTsKLQlpZiAocGVyX2NwdShjYWxsZnVuY3NpbmdsZV9pcnEsIGNwdSkgPj0gMCkKLQkJdW5iaW5kX2Zyb21faXJxaGFuZGxlcihwZXJfY3B1KGNhbGxmdW5jc2luZ2xlX2lycSwgY3B1KSwgTlVMTCk7CisJaWYgKHBlcl9jcHUoeGVuX3Jlc2NoZWRfaXJxLCBjcHUpID49IDApCisJCXVuYmluZF9mcm9tX2lycWhhbmRsZXIocGVyX2NwdSh4ZW5fcmVzY2hlZF9pcnEsIGNwdSksIE5VTEwpOworCWlmIChwZXJfY3B1KHhlbl9jYWxsZnVuY19pcnEsIGNwdSkgPj0gMCkKKwkJdW5iaW5kX2Zyb21faXJxaGFuZGxlcihwZXJfY3B1KHhlbl9jYWxsZnVuY19pcnEsIGNwdSksIE5VTEwpOworCWlmIChwZXJfY3B1KHhlbl9kZWJ1Z19pcnEsIGNwdSkgPj0gMCkKKwkJdW5iaW5kX2Zyb21faXJxaGFuZGxlcihwZXJfY3B1KHhlbl9kZWJ1Z19pcnEsIGNwdSksIE5VTEwpOworCWlmIChwZXJfY3B1KHhlbl9jYWxsZnVuY3NpbmdsZV9pcnEsIGNwdSkgPj0gMCkKKwkJdW5iaW5kX2Zyb21faXJxaGFuZGxlcihwZXJfY3B1KHhlbl9jYWxsZnVuY3NpbmdsZV9pcnEsIGNwdSksCisJCQkJICAgICAgIE5VTEwpOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtMzQ5LDEwICszNTAsMTAgQEAKIAkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1VOSU5URVJSVVBUSUJMRTsKIAkJc2NoZWR1bGVfdGltZW91dChIWi8xMCk7CiAJfQotCXVuYmluZF9mcm9tX2lycWhhbmRsZXIocGVyX2NwdShyZXNjaGVkX2lycSwgY3B1KSwgTlVMTCk7Ci0JdW5iaW5kX2Zyb21faXJxaGFuZGxlcihwZXJfY3B1KGNhbGxmdW5jX2lycSwgY3B1KSwgTlVMTCk7Ci0JdW5iaW5kX2Zyb21faXJxaGFuZGxlcihwZXJfY3B1KGRlYnVnX2lycSwgY3B1KSwgTlVMTCk7Ci0JdW5iaW5kX2Zyb21faXJxaGFuZGxlcihwZXJfY3B1KGNhbGxmdW5jc2luZ2xlX2lycSwgY3B1KSwgTlVMTCk7CisJdW5iaW5kX2Zyb21faXJxaGFuZGxlcihwZXJfY3B1KHhlbl9yZXNjaGVkX2lycSwgY3B1KSwgTlVMTCk7CisJdW5iaW5kX2Zyb21faXJxaGFuZGxlcihwZXJfY3B1KHhlbl9jYWxsZnVuY19pcnEsIGNwdSksIE5VTEwpOworCXVuYmluZF9mcm9tX2lycWhhbmRsZXIocGVyX2NwdSh4ZW5fZGVidWdfaXJxLCBjcHUpLCBOVUxMKTsKKwl1bmJpbmRfZnJvbV9pcnFoYW5kbGVyKHBlcl9jcHUoeGVuX2NhbGxmdW5jc2luZ2xlX2lycSwgY3B1KSwgTlVMTCk7CiAJeGVuX3VuaW5pdF9sb2NrX2NwdShjcHUpOwogCXhlbl90ZWFyZG93bl90aW1lcihjcHUpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vdGltZS5jIGIvYXJjaC94ODYveGVuL3RpbWUuYwppbmRleCA5ZDFmODUzLi4wZDNmMDdjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vdGltZS5jCisrKyBiL2FyY2gveDg2L3hlbi90aW1lLmMKQEAgLTMxLDE0ICszMSwxNCBAQAogI2RlZmluZSBOU19QRVJfVElDSwkoMTAwMDAwMDAwMExMIC8gSFopCiAKIC8qIHJ1bnN0YXRlIGluZm8gdXBkYXRlZCBieSBYZW4gKi8KLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgdmNwdV9ydW5zdGF0ZV9pbmZvLCBydW5zdGF0ZSk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHZjcHVfcnVuc3RhdGVfaW5mbywgeGVuX3J1bnN0YXRlKTsKIAogLyogc25hcHNob3RzIG9mIHJ1bnN0YXRlIGluZm8gKi8KLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgdmNwdV9ydW5zdGF0ZV9pbmZvLCBydW5zdGF0ZV9zbmFwc2hvdCk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHZjcHVfcnVuc3RhdGVfaW5mbywgeGVuX3J1bnN0YXRlX3NuYXBzaG90KTsKIAogLyogdW51c2VkIG5zIG9mIHN0b2xlbiBhbmQgYmxvY2tlZCB0aW1lICovCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUodTY0LCByZXNpZHVhbF9zdG9sZW4pOwotc3RhdGljIERFRklORV9QRVJfQ1BVKHU2NCwgcmVzaWR1YWxfYmxvY2tlZCk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUodTY0LCB4ZW5fcmVzaWR1YWxfc3RvbGVuKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1NjQsIHhlbl9yZXNpZHVhbF9ibG9ja2VkKTsKIAogLyogcmV0dXJuIGFuIGNvbnNpc3RlbnQgc25hcHNob3Qgb2YgNjQtYml0IHRpbWUvY291bnRlciB2YWx1ZSAqLwogc3RhdGljIHU2NCBnZXQ2NChjb25zdCB1NjQgKnApCkBAIC03OSw3ICs3OSw3IEBACiAKIAlCVUdfT04ocHJlZW1wdGlibGUoKSk7CiAKLQlzdGF0ZSA9ICZfX2dldF9jcHVfdmFyKHJ1bnN0YXRlKTsKKwlzdGF0ZSA9ICZfX2dldF9jcHVfdmFyKHhlbl9ydW5zdGF0ZSk7CiAKIAkvKgogCSAqIFRoZSBydW5zdGF0ZSBpbmZvIGlzIGFsd2F5cyB1cGRhdGVkIGJ5IHRoZSBoeXBlcnZpc29yIG9uCkBAIC05NywxNCArOTcsMTQgQEAKIC8qIHJldHVybiB0cnVlIHdoZW4gYSB2Y3B1IGNvdWxkIHJ1biBidXQgaGFzIG5vIHJlYWwgY3B1IHRvIHJ1biBvbiAqLwogYm9vbCB4ZW5fdmNwdV9zdG9sZW4oaW50IHZjcHUpCiB7Ci0JcmV0dXJuIHBlcl9jcHUocnVuc3RhdGUsIHZjcHUpLnN0YXRlID09IFJVTlNUQVRFX3J1bm5hYmxlOworCXJldHVybiBwZXJfY3B1KHhlbl9ydW5zdGF0ZSwgdmNwdSkuc3RhdGUgPT0gUlVOU1RBVEVfcnVubmFibGU7CiB9CiAKIHZvaWQgeGVuX3NldHVwX3J1bnN0YXRlX2luZm8oaW50IGNwdSkKIHsKIAlzdHJ1Y3QgdmNwdV9yZWdpc3Rlcl9ydW5zdGF0ZV9tZW1vcnlfYXJlYSBhcmVhOwogCi0JYXJlYS5hZGRyLnYgPSAmcGVyX2NwdShydW5zdGF0ZSwgY3B1KTsKKwlhcmVhLmFkZHIudiA9ICZwZXJfY3B1KHhlbl9ydW5zdGF0ZSwgY3B1KTsKIAogCWlmIChIWVBFUlZJU09SX3ZjcHVfb3AoVkNQVU9QX3JlZ2lzdGVyX3J1bnN0YXRlX21lbW9yeV9hcmVhLAogCQkJICAgICAgIGNwdSwgJmFyZWEpKQpAQCAtMTIyLDcgKzEyMiw3IEBACiAKIAlXQVJOX09OKHN0YXRlLnN0YXRlICE9IFJVTlNUQVRFX3J1bm5pbmcpOwogCi0Jc25hcCA9ICZfX2dldF9jcHVfdmFyKHJ1bnN0YXRlX3NuYXBzaG90KTsKKwlzbmFwID0gJl9fZ2V0X2NwdV92YXIoeGVuX3J1bnN0YXRlX3NuYXBzaG90KTsKIAogCS8qIHdvcmsgb3V0IGhvdyBtdWNoIHRpbWUgdGhlIFZDUFUgaGFzIG5vdCBiZWVuIHJ1bm4qaW5nKiAgKi8KIAlibG9ja2VkID0gc3RhdGUudGltZVtSVU5TVEFURV9ibG9ja2VkXSAtIHNuYXAtPnRpbWVbUlVOU1RBVEVfYmxvY2tlZF07CkBAIC0xMzMsMjQgKzEzMywyNCBAQAogCiAJLyogQWRkIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgdGlja3Mgb2Ygc3RvbGVuIHRpbWUsCiAJICAgaW5jbHVkaW5nIGFueSBsZWZ0LW92ZXJzIGZyb20gbGFzdCB0aW1lLiAqLwotCXN0b2xlbiA9IHJ1bm5hYmxlICsgb2ZmbGluZSArIF9fZ2V0X2NwdV92YXIocmVzaWR1YWxfc3RvbGVuKTsKKwlzdG9sZW4gPSBydW5uYWJsZSArIG9mZmxpbmUgKyBfX2dldF9jcHVfdmFyKHhlbl9yZXNpZHVhbF9zdG9sZW4pOwogCiAJaWYgKHN0b2xlbiA8IDApCiAJCXN0b2xlbiA9IDA7CiAKIAl0aWNrcyA9IGl0ZXJfZGl2X3U2NF9yZW0oc3RvbGVuLCBOU19QRVJfVElDSywgJnN0b2xlbik7Ci0JX19nZXRfY3B1X3ZhcihyZXNpZHVhbF9zdG9sZW4pID0gc3RvbGVuOworCV9fZ2V0X2NwdV92YXIoeGVuX3Jlc2lkdWFsX3N0b2xlbikgPSBzdG9sZW47CiAJYWNjb3VudF9zdGVhbF90aWNrcyh0aWNrcyk7CiAKIAkvKiBBZGQgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiB0aWNrcyBvZiBibG9ja2VkIHRpbWUsCiAJICAgaW5jbHVkaW5nIGFueSBsZWZ0LW92ZXJzIGZyb20gbGFzdCB0aW1lLiAqLwotCWJsb2NrZWQgKz0gX19nZXRfY3B1X3ZhcihyZXNpZHVhbF9ibG9ja2VkKTsKKwlibG9ja2VkICs9IF9fZ2V0X2NwdV92YXIoeGVuX3Jlc2lkdWFsX2Jsb2NrZWQpOwogCiAJaWYgKGJsb2NrZWQgPCAwKQogCQlibG9ja2VkID0gMDsKIAogCXRpY2tzID0gaXRlcl9kaXZfdTY0X3JlbShibG9ja2VkLCBOU19QRVJfVElDSywgJmJsb2NrZWQpOwotCV9fZ2V0X2NwdV92YXIocmVzaWR1YWxfYmxvY2tlZCkgPSBibG9ja2VkOworCV9fZ2V0X2NwdV92YXIoeGVuX3Jlc2lkdWFsX2Jsb2NrZWQpID0gYmxvY2tlZDsKIAlhY2NvdW50X2lkbGVfdGlja3ModGlja3MpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zeXNjYWxsLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zeXNjYWxsLmgKaW5kZXggMDVjZWJmOC4uNDM1MmRiZSAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc3lzY2FsbC5oCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3N5c2NhbGwuaApAQCAtMTMsOCArMTMsNiBAQAogYXNtbGlua2FnZSBsb25nIHh0ZW5zYV9leGVjdmUoY2hhciosIGNoYXIqKiwgY2hhcioqLCBzdHJ1Y3QgcHRfcmVncyopOwogYXNtbGlua2FnZSBsb25nIHh0ZW5zYV9jbG9uZSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgcHRfcmVncyopOwogYXNtbGlua2FnZSBsb25nIHh0ZW5zYV9waXBlKGludCBfX3VzZXIgKik7Ci1hc21saW5rYWdlIGxvbmcgeHRlbnNhX21tYXAyKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsCi0gICAgCQkJICAgICB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKIGFzbWxpbmthZ2UgbG9uZyB4dGVuc2FfcHRyYWNlKGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcpOwogYXNtbGlua2FnZSBsb25nIHh0ZW5zYV9zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MqKTsKIGFzbWxpbmthZ2UgbG9uZyB4dGVuc2FfcnRfc2lncmV0dXJuKHN0cnVjdCBwdF9yZWdzKik7CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS91bmlzdGQuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCmluZGV4IDRlNTVkYzcuLmZiZjMxOGIgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCkBAIC0xODksNyArMTg5LDcgQEAKIC8qIEZpbGUgTWFwIC8gU2hhcmVkIE1lbW9yeSBPcGVyYXRpb25zICovCiAKICNkZWZpbmUgX19OUl9tbWFwMiAJCQkJIDgwCi1fX1NZU0NBTEwoIDgwLCB4dGVuc2FfbW1hcDIsIDYpCitfX1NZU0NBTEwoIDgwLCBzeXNfbW1hcF9wZ29mZiwgNikKICNkZWZpbmUgX19OUl9tdW5tYXAgCQkJCSA4MQogX19TWVNDQUxMKCA4MSwgc3lzX211bm1hcCwgMikKICNkZWZpbmUgX19OUl9tcHJvdGVjdCAJCQkJIDgyCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvc3lzY2FsbC5jIGIvYXJjaC94dGVuc2Eva2VybmVsL3N5c2NhbGwuYwppbmRleCBhYzE1ZWNiLi4xZTY3YmFiIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvc3lzY2FsbC5jCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9zeXNjYWxsLmMKQEAgLTU3LDMxICs1Nyw2IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi0KLWFzbWxpbmthZ2UgbG9uZyB4dGVuc2FfbW1hcDIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLSAgIAkJCSAgICAgdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLAotCQkJICAgICB1bnNpZ25lZCBsb25nIGZkLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQotewotCWludCBlcnJvciA9IC1FQkFERjsKLQlzdHJ1Y3QgZmlsZSAqIGZpbGUgPSBOVUxMOwotCi0JZmxhZ3MgJj0gfihNQVBfRVhFQ1VUQUJMRSB8IE1BUF9ERU5ZV1JJVEUpOwotCWlmICghKGZsYWdzICYgTUFQX0FOT05ZTU9VUykpIHsKLQkJZmlsZSA9IGZnZXQoZmQpOwotCQlpZiAoIWZpbGUpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCWVycm9yID0gZG9fbW1hcF9wZ29mZihmaWxlLCBhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBwZ29mZik7Ci0JdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0KLQlpZiAoZmlsZSkKLQkJZnB1dChmaWxlKTsKLW91dDoKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KIGFzbWxpbmthZ2UgbG9uZyB4dGVuc2Ffc2htYXQoaW50IHNobWlkLCBjaGFyIF9fdXNlciAqc2htYWRkciwgaW50IHNobWZsZykKIHsKIAl1bnNpZ25lZCBsb25nIHJldDsKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3MvY29uc29sZS5jIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9jb25zb2xlLmMKaW5kZXggNGM1NTljZi4uZTYwYTFmNSAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9jb25zb2xlLmMKKysrIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9jb25zb2xlLmMKQEAgLTE5Niw3ICsxOTYsNyBAQAogCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCi1zdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIHNlcmlhbF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHR0eV9vcGVyYXRpb25zIHNlcmlhbF9vcHMgPSB7CiAJLm9wZW4gPSByc19vcGVuLAogCS5jbG9zZSA9IHJzX2Nsb3NlLAogCS53cml0ZSA9IHJzX3dyaXRlLApkaWZmIC0tZ2l0IGEvY3J5cHRvL2NyeXB0ZC5jIGIvY3J5cHRvL2NyeXB0ZC5jCmluZGV4IGY4YWUwZDkuLjcwNGMxNDEgMTAwNjQ0Ci0tLSBhL2NyeXB0by9jcnlwdGQuYworKysgYi9jcnlwdG8vY3J5cHRkLmMKQEAgLTk5LDcgKzk5LDcgQEAKIAlzdHJ1Y3QgY3J5cHRkX2NwdV9xdWV1ZSAqY3B1X3F1ZXVlOwogCiAJY3B1ID0gZ2V0X2NwdSgpOwotCWNwdV9xdWV1ZSA9IHBlcl9jcHVfcHRyKHF1ZXVlLT5jcHVfcXVldWUsIGNwdSk7CisJY3B1X3F1ZXVlID0gdGhpc19jcHVfcHRyKHF1ZXVlLT5jcHVfcXVldWUpOwogCWVyciA9IGNyeXB0b19lbnF1ZXVlX3JlcXVlc3QoJmNwdV9xdWV1ZS0+cXVldWUsIHJlcXVlc3QpOwogCXF1ZXVlX3dvcmtfb24oY3B1LCBrY3J5cHRvX3dxLCAmY3B1X3F1ZXVlLT53b3JrKTsKIAlwdXRfY3B1KCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvTWFrZWZpbGUgYi9kcml2ZXJzL2FjcGkvTWFrZWZpbGUKaW5kZXggNzcwMjExOC4uYzdiMTBiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYWNwaS9NYWtlZmlsZQpAQCAtMTksNiArMTksNyBAQAogCiAjIEFsbCB0aGUgYnVpbHRpbiBmaWxlcyBhcmUgaW4gdGhlICJhY3BpLiIgbW9kdWxlX3BhcmFtIG5hbWVzcGFjZS4KIGFjcGkteQkJCQkrPSBvc2wubyB1dGlscy5vIHJlYm9vdC5vCithY3BpLXkJCQkJKz0gaGVzdC5vCiAKICMgc2xlZXAgcmVsYXRlZCBmaWxlcwogYWNwaS15CQkJCSs9IHdha2V1cC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaGVzdC5jIGIvZHJpdmVycy9hY3BpL2hlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmIxOGM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2hlc3QuYwpAQCAtMCwwICsxLDEzNSBAQAorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2RlZmluZSBQUkVGSVggIkFDUEk6ICIKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBhcnNlX2FjcGlfaGVzdF9pYV9tYWNoaW5lX2NoZWNrKHN0cnVjdCBhY3BpX2hlc3RfaWFfbWFjaGluZV9jaGVjayAqcCkKK3sKKwlyZXR1cm4gc2l6ZW9mKCpwKSArCisJCShzaXplb2Yoc3RydWN0IGFjcGlfaGVzdF9pYV9lcnJvcl9iYW5rKSAqIHAtPm51bV9oYXJkd2FyZV9iYW5rcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwYXJzZV9hY3BpX2hlc3RfaWFfY29ycmVjdGVkKHN0cnVjdCBhY3BpX2hlc3RfaWFfY29ycmVjdGVkICpwKQoreworCXJldHVybiBzaXplb2YoKnApICsKKwkJKHNpemVvZihzdHJ1Y3QgYWNwaV9oZXN0X2lhX2Vycm9yX2JhbmspICogcC0+bnVtX2hhcmR3YXJlX2JhbmtzKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBhcnNlX2FjcGlfaGVzdF9pYV9ubWkoc3RydWN0IGFjcGlfaGVzdF9pYV9ubWkgKnApCit7CisJcmV0dXJuIHNpemVvZigqcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwYXJzZV9hY3BpX2hlc3RfZ2VuZXJpYyhzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWMgKnApCit7CisJcmV0dXJuIHNpemVvZigqcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGhlc3RfbWF0Y2hfcGNpKHN0cnVjdCBhY3BpX2hlc3RfYWVyX2NvbW1vbiAqcCwgc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwlyZXR1cm4JKDAgICAgICAgICAgID09IHBjaV9kb21haW5fbnIocGNpLT5idXMpICYmCisJCSBwLT5idXMgICAgICA9PSBwY2ktPmJ1cy0+bnVtYmVyICYmCisJCSBwLT5kZXZpY2UgICA9PSBQQ0lfU0xPVChwY2ktPmRldmZuKSAmJgorCQkgcC0+ZnVuY3Rpb24gPT0gUENJX0ZVTkMocGNpLT5kZXZmbikpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYXJzZV9hY3BpX2hlc3RfYWVyKHZvaWQgKmhkciwgaW50IHR5cGUsIHN0cnVjdCBwY2lfZGV2ICpwY2ksIGludCAqZmlybXdhcmVfZmlyc3QpCit7CisJc3RydWN0IGFjcGlfaGVzdF9hZXJfY29tbW9uICpwID0gaGRyICsgc2l6ZW9mKHN0cnVjdCBhY3BpX2hlc3RfaGVhZGVyKTsKKwl1bnNpZ25lZCBsb25nIHJjPTA7CisJdTggcGNpZV90eXBlID0gMDsKKwl1OCBicmlkZ2UgPSAwOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgQUNQSV9IRVNUX1RZUEVfQUVSX1JPT1RfUE9SVDoKKwkJcmMgPSBzaXplb2Yoc3RydWN0IGFjcGlfaGVzdF9hZXJfcm9vdCk7CisJCXBjaWVfdHlwZSA9IFBDSV9FWFBfVFlQRV9ST09UX1BPUlQ7CisJCWJyZWFrOworCWNhc2UgQUNQSV9IRVNUX1RZUEVfQUVSX0VORFBPSU5UOgorCQlyYyA9IHNpemVvZihzdHJ1Y3QgYWNwaV9oZXN0X2Flcik7CisJCXBjaWVfdHlwZSA9IFBDSV9FWFBfVFlQRV9FTkRQT0lOVDsKKwkJYnJlYWs7CisJY2FzZSBBQ1BJX0hFU1RfVFlQRV9BRVJfQlJJREdFOgorCQlyYyA9IHNpemVvZihzdHJ1Y3QgYWNwaV9oZXN0X2Flcl9icmlkZ2UpOworCQlpZiAoKHBjaS0+Y2xhc3MgPj4gMTYpID09IFBDSV9CQVNFX0NMQVNTX0JSSURHRSkKKwkJCWJyaWRnZSA9IDE7CisJCWJyZWFrOworCX0KKworCWlmIChwLT5mbGFncyAmIEFDUElfSEVTVF9HTE9CQUwpIHsKKwkJaWYgKChwY2ktPmlzX3BjaWUgJiYgKHBjaS0+cGNpZV90eXBlID09IHBjaWVfdHlwZSkpIHx8IGJyaWRnZSkKKwkJCSpmaXJtd2FyZV9maXJzdCA9ICEhKHAtPmZsYWdzICYgQUNQSV9IRVNUX0ZJUk1XQVJFX0ZJUlNUKTsKKwl9CisJZWxzZQorCQlpZiAoaGVzdF9tYXRjaF9wY2kocCwgcGNpKSkKKwkJCSpmaXJtd2FyZV9maXJzdCA9ICEhKHAtPmZsYWdzICYgQUNQSV9IRVNUX0ZJUk1XQVJFX0ZJUlNUKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgYWNwaV9oZXN0X2Zpcm13YXJlX2ZpcnN0KHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqc3RkaGVhZGVyLCBzdHJ1Y3QgcGNpX2RldiAqcGNpKQoreworCXN0cnVjdCBhY3BpX3RhYmxlX2hlc3QgKmhlc3QgPSAoc3RydWN0IGFjcGlfdGFibGVfaGVzdCAqKXN0ZGhlYWRlcjsKKwl2b2lkICpwID0gKHZvaWQgKiloZXN0ICsgc2l6ZW9mKCpoZXN0KTsgLyogZGVmaW5lZCBieSB0aGUgQUNQSSA0LjAgc3BlYyAqLworCXN0cnVjdCBhY3BpX2hlc3RfaGVhZGVyICpoZHIgPSBwOworCisJaW50IGk7CisJaW50IGZpcm13YXJlX2ZpcnN0ID0gMDsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBwcmludGVkX3VudXNlZCA9IDA7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgcHJpbnRlZF9yZXNlcnZlZCA9IDA7CisKKwlmb3IgKGk9MCwgaGRyPXA7IHAgPCAoKCh2b2lkICopaGVzdCkgKyBoZXN0LT5oZWFkZXIubGVuZ3RoKSAmJiBpIDwgaGVzdC0+ZXJyb3Jfc291cmNlX2NvdW50OyBpKyspIHsKKwkJc3dpdGNoIChoZHItPnR5cGUpIHsKKwkJY2FzZSBBQ1BJX0hFU1RfVFlQRV9JQTMyX0NIRUNLOgorCQkJcCArPSBwYXJzZV9hY3BpX2hlc3RfaWFfbWFjaGluZV9jaGVjayhwKTsKKwkJCWJyZWFrOworCQljYXNlIEFDUElfSEVTVF9UWVBFX0lBMzJfQ09SUkVDVEVEX0NIRUNLOgorCQkJcCArPSBwYXJzZV9hY3BpX2hlc3RfaWFfY29ycmVjdGVkKHApOworCQkJYnJlYWs7CisJCWNhc2UgQUNQSV9IRVNUX1RZUEVfSUEzMl9OTUk6CisJCQlwICs9IHBhcnNlX2FjcGlfaGVzdF9pYV9ubWkocCk7CisJCQlicmVhazsKKwkJLyogVGhlc2UgdGhyZWUgc2hvdWxkIG5ldmVyIGFwcGVhciAqLworCQljYXNlIEFDUElfSEVTVF9UWVBFX05PVF9VU0VEMzoKKwkJY2FzZSBBQ1BJX0hFU1RfVFlQRV9OT1RfVVNFRDQ6CisJCWNhc2UgQUNQSV9IRVNUX1RZUEVfTk9UX1VTRUQ1OgorCQkJaWYgKCFwcmludGVkX3VudXNlZCkgeworCQkJCXByaW50ayhLRVJOX0RFQlVHIFBSRUZJWAorCQkJCSAgICAgICAiSEVTVCBFcnJvciBTb3VyY2UgbGlzdCBjb250YWlucyBhbiBvYnNvbGV0ZSB0eXBlICglZCkuXG4iLCBoZHItPnR5cGUpOworCQkJCXByaW50ZWRfdW51c2VkID0gMTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEFDUElfSEVTVF9UWVBFX0FFUl9ST09UX1BPUlQ6CisJCWNhc2UgQUNQSV9IRVNUX1RZUEVfQUVSX0VORFBPSU5UOgorCQljYXNlIEFDUElfSEVTVF9UWVBFX0FFUl9CUklER0U6CisJCQlwICs9IHBhcnNlX2FjcGlfaGVzdF9hZXIocCwgaGRyLT50eXBlLCBwY2ksICZmaXJtd2FyZV9maXJzdCk7CisJCQlicmVhazsKKwkJY2FzZSBBQ1BJX0hFU1RfVFlQRV9HRU5FUklDX0VSUk9SOgorCQkJcCArPSBwYXJzZV9hY3BpX2hlc3RfZ2VuZXJpYyhwKTsKKwkJCWJyZWFrOworCQkvKiBUaGVzZSBzaG91bGQgbmV2ZXIgYXBwZWFyIGVpdGhlciAqLworCQljYXNlIEFDUElfSEVTVF9UWVBFX1JFU0VSVkVEOgorCQlkZWZhdWx0OgorCQkJaWYgKCFwcmludGVkX3Jlc2VydmVkKSB7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgUFJFRklYCisJCQkJICAgICAgICJIRVNUIEVycm9yIFNvdXJjZSBsaXN0IGNvbnRhaW5zIGEgcmVzZXJ2ZWQgdHlwZSAoJWQpLlxuIiwgaGRyLT50eXBlKTsKKwkJCQlwcmludGVkX3Jlc2VydmVkID0gMTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBmaXJtd2FyZV9maXJzdDsKK30KKworaW50IGFjcGlfaGVzdF9maXJtd2FyZV9maXJzdF9wY2koc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9OT1RfRk9VTkQ7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpoZXN0ID0gTlVMTDsKKwlzdGF0dXMgPSBhY3BpX2dldF90YWJsZShBQ1BJX1NJR19IRVNULCAxLCAmaGVzdCk7CisKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJaWYgKGFjcGlfaGVzdF9maXJtd2FyZV9maXJzdChoZXN0LCBwY2kpKSB7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFjcGlfaGVzdF9maXJtd2FyZV9maXJzdF9wY2kpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9wZXJmbGliLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3BlcmZsaWIuYwppbmRleCA4YmEwZWQwLi4wMWUzNjZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3BlcmZsaWIuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3BlcmZsaWIuYwpAQCAtMTY3LDYgKzE2NywxOSBAQAogCQlyZXR1cm4gY3B1ZnJlcV91cGRhdGVfcG9saWN5KHByLT5pZCk7CiB9CiAKK2ludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfYmlvc19saW1pdChpbnQgY3B1LCB1bnNpZ25lZCBpbnQgKmxpbWl0KQoreworCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHI7CisKKwlwciA9IHBlcl9jcHUocHJvY2Vzc29ycywgY3B1KTsKKwlpZiAoIXByIHx8ICFwci0+cGVyZm9ybWFuY2UgfHwgIXByLT5wZXJmb3JtYW5jZS0+c3RhdGVfY291bnQpCisJCXJldHVybiAtRU5PREVWOworCSpsaW1pdCA9IHByLT5wZXJmb3JtYW5jZS0+c3RhdGVzW3ByLT5wZXJmb3JtYW5jZV9wbGF0Zm9ybV9saW1pdF0uCisJCWNvcmVfZnJlcXVlbmN5ICogMTAwMDsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYWNwaV9wcm9jZXNzb3JfZ2V0X2Jpb3NfbGltaXQpOworCiB2b2lkIGFjcGlfcHJvY2Vzc29yX3BwY19pbml0KHZvaWQpCiB7CiAJaWYgKCFjcHVmcmVxX3JlZ2lzdGVyX25vdGlmaWVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9LY29uZmlnIGIvZHJpdmVycy9hdGEvS2NvbmZpZwppbmRleCA2NzZmMDhiLi44NTg0NGQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9LY29uZmlnCisrKyBiL2RyaXZlcnMvYXRhL0tjb25maWcKQEAgLTc5MCw1ICs3OTAsMTUgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIFBBVEFfTUFDSU8KKwl0cmlzdGF0ZSAiQXBwbGUgUG93ZXJNYWMvUG93ZXJCb29rIGludGVybmFsICdNYWNJTycgSURFIgorCWRlcGVuZHMgb24gUFBDX1BNQUMKKwloZWxwCisJICBNb3N0IElERSBjYXBhYmxlIFBvd2VyTWFjcyBoYXZlIElERSBidXNzZXMgZHJpdmVuIGJ5IGEgdmFyaWFudAorICAgICAgICAgIG9mIHRoaXMgY29udHJvbGxlciB3aGljaCBpcyBwYXJ0IG9mIHRoZSBBcHBsZSBjaGlwc2V0IHVzZWQgb24KKyAgICAgICAgICBtb3N0IFBvd2VyTWFjIG1vZGVscy4gU29tZSBtb2RlbHMgaGF2ZSBtdWx0aXBsZSBidXNzZXMgdXNpbmcKKyAgICAgICAgICBkaWZmZXJlbnQgY2hpcHNldHMsIHRob3VnaCBnZW5lcmFsbHksIE1hY0lPIGlzIG9uZSBvZiB0aGVtLgorCisKIGVuZGlmICMgQVRBX1NGRgogZW5kaWYgIyBBVEEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL01ha2VmaWxlIGIvZHJpdmVycy9hdGEvTWFrZWZpbGUKaW5kZXggZDkwOTQzNS4uZmM5MzZkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9hdGEvTWFrZWZpbGUKQEAgLTE4LDYgKzE4LDcgQEAKIG9iai0kKENPTkZJR19TQVRBX0lOSUMxNjJYKQkrPSBzYXRhX2luaWMxNjJ4Lm8KIG9iai0kKENPTkZJR19QRENfQURNQSkJCSs9IHBkY19hZG1hLm8KIG9iai0kKENPTkZJR19TQVRBX0ZTTCkJCSs9IHNhdGFfZnNsLm8KK29iai0kKENPTkZJR19QQVRBX01BQ0lPKQkrPSBwYXRhX21hY2lvLm8KIAogb2JqLSQoQ09ORklHX1BBVEFfQUxJKQkJKz0gcGF0YV9hbGkubwogb2JqLSQoQ09ORklHX1BBVEFfQU1EKQkJKz0gcGF0YV9hbWQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9tYWNpby5jIGIvZHJpdmVycy9hdGEvcGF0YV9tYWNpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYzdiYmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2F0YS9wYXRhX21hY2lvLmMKQEAgLTAsMCArMSwxNDI3IEBACisvKgorICogTGliYXRhIGJhc2VkIGRyaXZlciBmb3IgQXBwbGUgIm1hY2lvIiBmYW1pbHkgb2YgUEFUQSBjb250cm9sbGVycworICoKKyAqIENvcHlyaWdodCAyMDA4LzIwMDkgQmVuamFtaW4gSGVycmVuc2NobWlkdCwgSUJNIENvcnAKKyAqICAgICAgICAgICAgICAgICAgICAgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAqCisgKiBTb21lIGJpdHMgYW5kIHBpZWNlcyBmcm9tIGRyaXZlcnMvaWRlL3BwYy9wbWFjLmMKKyAqCisgKi8KKworI3VuZGVmIERFQlVHCisjdW5kZWYgREVCVUdfRE1BCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvYXRhLmg+CisjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CisjaW5jbHVkZSA8bGludXgvYWRiLmg+CisjaW5jbHVkZSA8bGludXgvcG11Lmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaW8uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZGJkbWEuaD4KKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL3BtYWNfZmVhdHVyZS5oPgorI2luY2x1ZGUgPGFzbS9tZWRpYWJheS5oPgorCisjaWZkZWYgREVCVUdfRE1BCisjZGVmaW5lIGRldl9kYmdkbWEoZGV2LCBmb3JtYXQsIGFyZy4uLikJCVwKKwlkZXZfcHJpbnRrKEtFUk5fREVCVUcgLCBkZXYgLCBmb3JtYXQgLCAjIyBhcmcpCisjZWxzZQorI2RlZmluZSBkZXZfZGJnZG1hKGRldiwgZm9ybWF0LCBhcmcuLi4pCQlcCisJKHsgaWYgKDApIGRldl9wcmludGsoS0VSTl9ERUJVRywgZGV2LCBmb3JtYXQsICMjYXJnKTsgMDsgfSkKKyNlbmRpZgorCisjZGVmaW5lIERSVl9OQU1FCSJwYXRhX21hY2lvIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC45IgorCisvKiBNb2RlbHMgb2YgbWFjaW8gQVRBIGNvbnRyb2xsZXIgKi8KK2VudW0geworCWNvbnRyb2xsZXJfb2hhcmUsCS8qIE9IYXJlIGJhc2VkICovCisJY29udHJvbGxlcl9oZWF0aHJvdywJLyogSGVhdGhyb3cvUGFkZGluZ3RvbiAqLworCWNvbnRyb2xsZXJfa2xfYXRhMywJLyogS2V5TGFyZ28gQVRBLTMgKi8KKwljb250cm9sbGVyX2tsX2F0YTQsCS8qIEtleUxhcmdvIEFUQS00ICovCisJY29udHJvbGxlcl91bl9hdGE2LAkvKiBVbmlOb3J0aDIgQVRBLTYgKi8KKwljb250cm9sbGVyX2syX2F0YTYsCS8qIEsyIEFUQS02ICovCisJY29udHJvbGxlcl9zaF9hdGE2LAkvKiBTaGFzdGEgQVRBLTYgKi8KK307CisKK3N0YXRpYyBjb25zdCBjaGFyKiBtYWNpb19hdGFfbmFtZXNbXSA9IHsKKwkiT0hhcmUgQVRBIiwJCS8qIE9IYXJlIGJhc2VkICovCisJIkhlYXRocm93IEFUQSIsCQkvKiBIZWF0aHJvdy9QYWRkaW5ndG9uICovCisJIktleUxhcmdvIEFUQS0zIiwJLyogS2V5TGFyZ28gQVRBLTMgKE1ETUEgb25seSkgKi8KKwkiS2V5TGFyZ28gQVRBLTQiLAkvKiBLZXlMYXJnbyBBVEEtNCAoVURNQS82NikgKi8KKwkiVW5pTm9ydGggQVRBLTYiLAkvKiBVbmlOb3J0aDIgQVRBLTYgKFVETUEvMTAwKSAqLworCSJLMiBBVEEtNiIsCQkvKiBLMiBBVEEtNiAoVURNQS8xMDApICovCisJIlNoYXN0YSBBVEEtNiIsCQkvKiBTaGFzdGEgQVRBLTYgKFVETUEvMTMzKSAqLworfTsKKworLyoKKyAqIEV4dHJhIHJlZ2lzdGVycywgYm90aCAzMi1iaXQgbGl0dGxlLWVuZGlhbgorICovCisjZGVmaW5lIElERV9USU1JTkdfQ09ORklHCTB4MjAwCisjZGVmaW5lIElERV9JTlRFUlJVUFQJCTB4MzAwCisKKy8qIEthdWFpIChVMikgQVRBIGhhcyBkaWZmZXJlbnQgcmVnaXN0ZXIgc2V0dXAgKi8KKyNkZWZpbmUgSURFX0tBVUFJX1BJT19DT05GSUcJMHgyMDAKKyNkZWZpbmUgSURFX0tBVUFJX1VMVFJBX0NPTkZJRwkweDIxMAorI2RlZmluZSBJREVfS0FVQUlfUE9MTF9DT05GSUcJMHgyMjAKKworLyoKKyAqIFRpbWluZyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKi8KKworLyogTnVtYmVyIG9mIElERV9TWVNDTEtfTlMgdGlja3MsIGFyZ3VtZW50IGlzIGluIG5hbm9zZWNvbmRzICovCisjZGVmaW5lIFNZU0NMS19USUNLUyh0KQkJKCgodCkgKyBJREVfU1lTQ0xLX05TIC0gMSkgLyBJREVfU1lTQ0xLX05TKQorI2RlZmluZSBTWVNDTEtfVElDS1NfNjYodCkJKCgodCkgKyBJREVfU1lTQ0xLXzY2X05TIC0gMSkgLyBJREVfU1lTQ0xLXzY2X05TKQorI2RlZmluZSBJREVfU1lTQ0xLX05TCQkzMAkvKiAzM01oeiBjZWxsICovCisjZGVmaW5lIElERV9TWVNDTEtfNjZfTlMJMTUJLyogNjZNaHogY2VsbCAqLworCisvKiAxMzNNaHogY2VsbCwgZm91bmQgaW4gc2hhc3RhLgorICogU2VlIGNvbW1lbnRzIGFib3V0IDEwMCBNaHogVW5pbm9ydGggMi4uLgorICogTm90ZSB0aGF0IFBJT19NQVNLIGFuZCBNRE1BX01BU0sgc2VlbSB0byBvdmVybGFwLCB0aGF0J3MganVzdAorICogd2VpcmQgYW5kIEkgZG9uJ3Qgbm93IHdoeSAuLiBhdCB0aGlzIHN0YWdlCisgKi8KKyNkZWZpbmUgVFJfMTMzX1BJT1JFR19QSU9fTUFTSwkJMHhmZjAwMGZmZgorI2RlZmluZSBUUl8xMzNfUElPUkVHX01ETUFfTUFTSwkJMHgwMGZmZjgwMAorI2RlZmluZSBUUl8xMzNfVURNQVJFR19VRE1BX01BU0sJMHgwMDAzZmZmZgorI2RlZmluZSBUUl8xMzNfVURNQVJFR19VRE1BX0VOCQkweDAwMDAwMDAxCisKKy8qIDEwME1oeiBjZWxsLCBmb3VuZCBpbiBVbmlub3J0aCAyIGFuZCBLMi4gSXQgYXBwZWFycyBhcyBhIHBjaSBkZXZpY2UKKyAqICgxMDZiLzAwMzMpIG9uIHVuaW5vcnRoIG9yIEsyIGludGVybmFsIFBDSSBidXMgYW5kIGl0J3MgY2xvY2sgaXMKKyAqIGNvbnRyb2xsZWQgbGlrZSBnZW0gb3IgZncuIEl0IGFwcGVhcnMgdG8gYmUgYW4gZXZvbHV0aW9uIG9mIGtleWxhcmdvCisgKiBBVEE0IHdpdGggYSB0aW1pbmcgcmVnaXN0ZXIgZXh0ZW5kZWQgdG8gMngzMmJpdHMgcmVnaXN0ZXJzIChvbmUKKyAqIGZvciBQSU8gJiBNV0RNQSBhbmQgb25lIGZvciBVRE1BLCBhbmQgYSBzaW1pbGFyIERCRE1BIGNoYW5uZWwuCisgKiBJdCBoYXMgaXQncyBvd24gbG9jYWwgZmVhdHVyZSBjb250cm9sIHJlZ2lzdGVyIGFzIHdlbGwuCisgKgorICogQWZ0ZXIgc2NyYXRjaGluZyBteSBtaW5kIG92ZXIgdGhlIHRpbWluZyB2YWx1ZXMsIGF0IGxlYXN0IGZvciBQSU8KKyAqIGFuZCBNRE1BLCBJIHRoaW5rIEkndmUgZmlndXJlZCB0aGUgZm9ybWF0IG9mIHRoZSB0aW1pbmcgcmVnaXN0ZXIsCisgKiB0aG91Z2ggSSB1c2UgcHJlLWNhbGN1bGF0ZWQgdGFibGVzIGZvciBVRE1BIGFzIHVzdWFsLi4uCisgKi8KKyNkZWZpbmUgVFJfMTAwX1BJT19BRERSU0VUVVBfTUFTSwkweGZmMDAwMDAwIC8qIFNpemUgb2YgZmllbGQgdW5rbm93biAqLworI2RlZmluZSBUUl8xMDBfUElPX0FERFJTRVRVUF9TSElGVAkyNAorI2RlZmluZSBUUl8xMDBfTURNQV9NQVNLCQkweDAwZmZmMDAwCisjZGVmaW5lIFRSXzEwMF9NRE1BX1JFQ09WRVJZX01BU0sJMHgwMGZjMDAwMAorI2RlZmluZSBUUl8xMDBfTURNQV9SRUNPVkVSWV9TSElGVAkxOAorI2RlZmluZSBUUl8xMDBfTURNQV9BQ0NFU1NfTUFTSwkJMHgwMDAzZjAwMAorI2RlZmluZSBUUl8xMDBfTURNQV9BQ0NFU1NfU0hJRlQJMTIKKyNkZWZpbmUgVFJfMTAwX1BJT19NQVNLCQkJMHhmZjAwMGZmZgorI2RlZmluZSBUUl8xMDBfUElPX1JFQ09WRVJZX01BU0sJMHgwMDAwMGZjMAorI2RlZmluZSBUUl8xMDBfUElPX1JFQ09WRVJZX1NISUZUCTYKKyNkZWZpbmUgVFJfMTAwX1BJT19BQ0NFU1NfTUFTSwkJMHgwMDAwMDAzZgorI2RlZmluZSBUUl8xMDBfUElPX0FDQ0VTU19TSElGVAkJMAorCisjZGVmaW5lIFRSXzEwMF9VRE1BUkVHX1VETUFfTUFTSwkweDAwMDBmZmZmCisjZGVmaW5lIFRSXzEwMF9VRE1BUkVHX1VETUFfRU4JCTB4MDAwMDAwMDEKKworCisvKiA2Nk1oeiBjZWxsLCBmb3VuZCBpbiBLZXlMYXJnby4gQ2FuIGRvIHVsdHJhIG1vZGUgMCB0byAyIG9uCisgKiA0MCBjb25uZWN0b3IgY2FibGUgYW5kIHRvIDQgb24gODAgY29ubmVjdG9yIG9uZS4KKyAqIENsb2NrIHVuaXQgaXMgMTVucyAoNjZNaHopCisgKgorICogMyBWYWx1ZXMgY2FuIGJlIHByb2dyYW1tZWQ6CisgKiAgLSBXcml0ZSBkYXRhIHNldHVwLCB3aGljaCBhcHBlYXJzIHRvIG1hdGNoIHRoZSBjeWNsZSB0aW1lLiBUaGV5CisgKiAgICBhbHNvIGNhbGwgaXQgRElPVyBzZXR1cC4KKyAqICAtIFJlYWR5IHRvIHBhdXNlIHRpbWUgKGZyb20gc3BlYykKKyAqICAtIEFkZHJlc3Mgc2V0dXAuIFRoYXQgb25lIGlzIHdlaXJkLiBJIGRvbid0IHNlZSB3aGVyZSBleGFjdGx5CisgKiAgICBpdCBmaXRzIGluIFVETUEgY3ljbGVzLCBJIGdvdCBpdCdzIG5hbWUgZnJvbSBhbiBvYnNjdXJlIHBpZWNlCisgKiAgICBvZiBjb21tZW50ZWQgb3V0IGNvZGUgaW4gRGFyd2luLiBUaGV5IGxlYXZlIGl0IHRvIDAsIHdlIGRvIGFzCisgKiAgICB3ZWxsLCBkZXNwaXRlIGEgY29tbWVudCB0aGF0IHdvdWxkIGxlYWQgdG8gdGhpbmsgaXQgaGFzIGEKKyAqICAgIG1pbiB2YWx1ZSBvZiA0NW5zLgorICogQXBwbGUgYWxzbyBhZGQgNjBucyB0byB0aGUgd3JpdGUgZGF0YSBzZXR1cCAob3IgY3ljbGUgdGltZSA/KSBvbgorICogcmVhZHMuCisgKi8KKyNkZWZpbmUgVFJfNjZfVURNQV9NQVNLCQkJMHhmZmYwMDAwMAorI2RlZmluZSBUUl82Nl9VRE1BX0VOCQkJMHgwMDEwMDAwMCAvKiBFbmFibGUgVWx0cmEgbW9kZSBmb3IgRE1BICovCisjZGVmaW5lIFRSXzY2X1BJT19BRERSU0VUVVBfTUFTSwkweGUwMDAwMDAwIC8qIEFkZHJlc3Mgc2V0dXAgKi8KKyNkZWZpbmUgVFJfNjZfUElPX0FERFJTRVRVUF9TSElGVAkyOQorI2RlZmluZSBUUl82Nl9VRE1BX1JEWTJQQVVTX01BU0sJMHgxZTAwMDAwMCAvKiBSZWFkeSAyIHBhdXNlIHRpbWUgKi8KKyNkZWZpbmUgVFJfNjZfVURNQV9SRFkyUEFVU19TSElGVAkyNQorI2RlZmluZSBUUl82Nl9VRE1BX1dSREFUQVNFVFVQX01BU0sJMHgwMWUwMDAwMCAvKiBXcml0ZSBkYXRhIHNldHVwIHRpbWUgKi8KKyNkZWZpbmUgVFJfNjZfVURNQV9XUkRBVEFTRVRVUF9TSElGVAkyMQorI2RlZmluZSBUUl82Nl9NRE1BX01BU0sJCQkweDAwMGZmYzAwCisjZGVmaW5lIFRSXzY2X01ETUFfUkVDT1ZFUllfTUFTSwkweDAwMGY4MDAwCisjZGVmaW5lIFRSXzY2X01ETUFfUkVDT1ZFUllfU0hJRlQJMTUKKyNkZWZpbmUgVFJfNjZfTURNQV9BQ0NFU1NfTUFTSwkJMHgwMDAwN2MwMAorI2RlZmluZSBUUl82Nl9NRE1BX0FDQ0VTU19TSElGVAkJMTAKKyNkZWZpbmUgVFJfNjZfUElPX01BU0sJCQkweGUwMDAwM2ZmCisjZGVmaW5lIFRSXzY2X1BJT19SRUNPVkVSWV9NQVNLCQkweDAwMDAwM2UwCisjZGVmaW5lIFRSXzY2X1BJT19SRUNPVkVSWV9TSElGVAk1CisjZGVmaW5lIFRSXzY2X1BJT19BQ0NFU1NfTUFTSwkJMHgwMDAwMDAxZgorI2RlZmluZSBUUl82Nl9QSU9fQUNDRVNTX1NISUZUCQkwCisKKy8qIDMzTWh6IGNlbGwsIGZvdW5kIGluIE9IYXJlLCBIZWF0aHJvdyAoJiBQYWRkaW5ndG9uKSBhbmQgS2V5TGFyZ28KKyAqIENhbiBkbyBwaW8gJiBtZG1hIG1vZGVzLCBjbG9jayB1bml0IGlzIDMwbnMgKDMzTWh6KQorICoKKyAqIFRoZSBhY2Nlc3MgdGltZSBhbmQgcmVjb3ZlcnkgdGltZSBjYW4gYmUgcHJvZ3JhbW1lZC4gU29tZSBvbGRlcgorICogRGFyd2luIGNvZGUgYmFzZSBsaW1pdCBPSGFyZSB0byAxNTBucyBjeWNsZSB0aW1lLiBJIGRlY2lkZWQgdG8gZG8KKyAqIHRoZSBzYW1lIGhlcmUgZm9yZSBzYWZldHkgYWdhaW5zdCBicm9rZW4gb2xkIGhhcmR3YXJlIDspCisgKiBUaGUgSGFsZlRpY2sgYml0LCB3aGVuIHNldCwgYWRkcyBoYWxmIGEgY2xvY2sgKDE1bnMpIHRvIHRoZSBhY2Nlc3MKKyAqIHRpbWUgYW5kIHJlbW92ZXMgb25lIGZyb20gcmVjb3ZlcnkuIEl0J3Mgbm90IHN1cHBvcnRlZCBvbiBLZXlMYXJnbworICogaW1wbGVtZW50YXRpb24gYWZhaWsuIFRoZSBFIGJpdCBhcHBlYXJzIHRvIGJlIHNldCBmb3IgUElPIG1vZGUgMCBhbmQKKyAqIGlzIHVzZWQgdG8gcmVhY2ggbG9uZyB0aW1pbmdzIHVzZWQgaW4gdGhpcyBtb2RlLgorICovCisjZGVmaW5lIFRSXzMzX01ETUFfTUFTSwkJCTB4MDAzZmY4MDAKKyNkZWZpbmUgVFJfMzNfTURNQV9SRUNPVkVSWV9NQVNLCTB4MDAxZjAwMDAKKyNkZWZpbmUgVFJfMzNfTURNQV9SRUNPVkVSWV9TSElGVAkxNgorI2RlZmluZSBUUl8zM19NRE1BX0FDQ0VTU19NQVNLCQkweDAwMDBmODAwCisjZGVmaW5lIFRSXzMzX01ETUFfQUNDRVNTX1NISUZUCQkxMQorI2RlZmluZSBUUl8zM19NRE1BX0hBTEZUSUNLCQkweDAwMjAwMDAwCisjZGVmaW5lIFRSXzMzX1BJT19NQVNLCQkJMHgwMDAwMDdmZgorI2RlZmluZSBUUl8zM19QSU9fRQkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgVFJfMzNfUElPX1JFQ09WRVJZX01BU0sJCTB4MDAwMDAzZTAKKyNkZWZpbmUgVFJfMzNfUElPX1JFQ09WRVJZX1NISUZUCTUKKyNkZWZpbmUgVFJfMzNfUElPX0FDQ0VTU19NQVNLCQkweDAwMDAwMDFmCisjZGVmaW5lIFRSXzMzX1BJT19BQ0NFU1NfU0hJRlQJCTAKKworLyoKKyAqIEludGVycnVwdCByZWdpc3RlciBkZWZpbml0aW9ucy4gT25seSBwcmVzZW50IG9uIG5ld2VyIGNlbGxzCisgKiAoS2V5bGFyZ28gYW5kIGxhdGVyIGFmYWlrKSBzbyB3ZSBkb24ndCB1c2UgaXQuCisgKi8KKyNkZWZpbmUgSURFX0lOVFJfRE1BCQkJMHg4MDAwMDAwMAorI2RlZmluZSBJREVfSU5UUl9ERVZJQ0UJCQkweDQwMDAwMDAwCisKKy8qCisgKiBGQ1IgUmVnaXN0ZXIgb24gS2F1YWkuIE5vdCBzdXJlIHdoYXQgYml0IDB4NCBpcyAgLi4uCisgKi8KKyNkZWZpbmUgS0FVQUlfRkNSX1VBVEFfTUFHSUMJCTB4MDAwMDAwMDQKKyNkZWZpbmUgS0FVQUlfRkNSX1VBVEFfUkVTRVRfTgkJMHgwMDAwMDAwMgorI2RlZmluZSBLQVVBSV9GQ1JfVUFUQV9FTkFCTEUJCTB4MDAwMDAwMDEKKworCisvKiBBbGxvdyB1cCB0byAyNTYgREJETUEgY29tbWFuZHMgcGVyIHhmZXIgKi8KKyNkZWZpbmUgTUFYX0RDTURTCQkyNTYKKworLyogRG9uJ3QgbGV0IGEgRE1BIHNlZ21lbnQgZ28gYWxsIHRoZSB3YXkgdG8gNjRLICovCisjZGVmaW5lIE1BWF9EQkRNQV9TRUcJCTB4ZmYwMAorCisKKy8qCisgKiBXYWl0IDFzIGZvciBkaXNrIHRvIGFuc3dlciBvbiBJREUgYnVzIGFmdGVyIGEgaGFyZCByZXNldAorICogb2YgdGhlIGRldmljZSAodmlhIEdQSU8vRkNSKS4KKyAqCisgKiBTb21lIGRldmljZXMgc2VlbSB0byAicG9sbHV0ZSIgdGhlIGJ1cyBldmVuIGFmdGVyIGRyb3BwaW5nCisgKiB0aGUgQlNZIGJpdCAodHlwaWNhbGx5IHNvbWUgY29tYm8gZHJpdmVzIHNsYXZlIG9uIHRoZSBVRE1BCisgKiBidXMpIGFmdGVyIGEgaGFyZCByZXNldC4gU2luY2Ugd2UgaGFyZCByZXNldCBhbGwgZHJpdmVzIG9uCisgKiBLZXlMYXJnbyBBVEE2Niwgd2UgaGF2ZSB0byBrZWVwIHRoYXQgZGVsYXkgYXJvdW5kLiBJIG1heSBlbmQKKyAqIHVwIG5vdCBoYXJkIHJlc2V0dGluZyBhbnltb3JlIG9uIHRoZXNlIGFuZCBrZWVwIHRoZSBkZWxheSBvbmx5CisgKiBmb3Igb2xkZXIgaW50ZXJmYWNlcyBpbnN0ZWFkICh3ZSBoYXZlIHRvIHJlc2V0IHdoZW4gY29taW5nCisgKiBmcm9tIE1hY09TLi4uKSAtLUJlbkguCisgKi8KKyNkZWZpbmUgSURFX1dBS0VVUF9ERUxBWV9NUwkxMDAwCisKK3N0cnVjdCBwYXRhX21hY2lvX3RpbWluZzsKKworc3RydWN0IHBhdGFfbWFjaW9fcHJpdiB7CisJaW50CQkJCWtpbmQ7CisJaW50CQkJCWFhcGxfYnVzX2lkOworCWludAkJCQltZWRpYWJheSA6IDE7CisJc3RydWN0IGRldmljZV9ub2RlCQkqbm9kZTsKKwlzdHJ1Y3QgbWFjaW9fZGV2CQkqbWRldjsKKwlzdHJ1Y3QgcGNpX2RldgkJCSpwZGV2OworCXN0cnVjdCBkZXZpY2UJCQkqZGV2OworCWludAkJCQlpcnE7CisJdTMyCQkJCXRyZWdbMl1bMl07CisJdm9pZCBfX2lvbWVtCQkJKnRmcmVnczsKKwl2b2lkIF9faW9tZW0JCQkqa2F1YWlfZmNyOworCXN0cnVjdCBkYmRtYV9jbWQgKgkJZG1hX3RhYmxlX2NwdTsKKwlkbWFfYWRkcl90CQkJZG1hX3RhYmxlX2RtYTsKKwlzdHJ1Y3QgYXRhX2hvc3QJCQkqaG9zdDsKKwljb25zdCBzdHJ1Y3QgcGF0YV9tYWNpb190aW1pbmcJKnRpbWluZ3M7Cit9OworCisvKiBQcmV2aW91cyB2YXJpYW50cyBvZiB0aGlzIGRyaXZlciB1c2VkIHRvIGNhbGN1bGF0ZSB0aW1pbmdzCisgKiBmb3IgdmFyaW91cyB2YXJpYW50cyBvZiB0aGUgY2hpcCBhbmQgdXNlIHRhYmxlcyBmb3Igb3RoZXJzLgorICoKKyAqIE5vdCBvbmx5IHdhcyB0aGlzIGNvbmZ1c2luZywgYnV0IGluIGFkZGl0aW9uLCBpdCBpc24ndCBjbGVhcgorICogd2hldGhlciBvdXIgY2FsY3VsYXRpb24gY29kZSB3YXMgY29ycmVjdC4gSXQgZGlkbid0IGVudGlyZWx5CisgKiBtYXRjaCB0aGUgZGFyd2luIGNvZGUgYW5kIHdoYXRldmVyIGRvY3VtZW50YXRpb24gSSBjb3VsZCBmaW5kCisgKiBvbiB0aGVzZSBjZWxscworICoKKyAqIEkgZGVjaWRlZCB0byBlbnRpcmVseSByZWx5IG9uIGEgdGFibGUgaW5zdGVhZCBmb3IgdGhpcyB2ZXJzaW9uCisgKiBvZiB0aGUgZHJpdmVyLiBBbHNvLCBiZWNhdXNlIEkgZG9uJ3QgcmVhbGx5IGNhcmUgYWJvdXQgZGVyYXRlZAorICogbW9kZXMgYW5kIHJlYWxseSBvbGQgSFcgb3RoZXIgdGhhbiBtYWtpbmcgaXQgd29yaywgSSdtIG5vdCBnb2luZworICogdG8gY2FsY3VsYXRlIC8gc25vb3AgdGltaW5nIHZhbHVlcyBmb3Igc29tZXRoaW5nIGVsc2UgdGhhbiB0aGUKKyAqIHN0YW5kYXJkIG1vZGVzLgorICovCitzdHJ1Y3QgcGF0YV9tYWNpb190aW1pbmcgeworCWludAltb2RlOworCXUzMglyZWcxOwkvKiBCaXRzIHRvIHNldCBpbiBmaXJzdCB0aW1pbmcgcmVnICovCisJdTMyCXJlZzI7CS8qIEJpdHMgdG8gc2V0IGluIHNlY29uZCB0aW1pbmcgcmVnICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBhdGFfbWFjaW9fdGltaW5nIHBhdGFfbWFjaW9fb2hhcmVfdGltaW5nc1tdID0geworCXsgWEZFUl9QSU9fMCwJCTB4MDAwMDA1MjYsCTAsIH0sCisJeyBYRkVSX1BJT18xLAkJMHgwMDAwMDA4NSwJMCwgfSwKKwl7IFhGRVJfUElPXzIsCQkweDAwMDAwMDI1LAkwLCB9LAorCXsgWEZFUl9QSU9fMywJCTB4MDAwMDAwMjUsCTAsIH0sCisJeyBYRkVSX1BJT180LAkJMHgwMDAwMDAyNSwJMCwgfSwKKwl7IFhGRVJfTVdfRE1BXzAsCTB4MDAwNzQwMDAsCTAsIH0sCisJeyBYRkVSX01XX0RNQV8xLAkweDAwMjIxMDAwLAkwLCB9LAorCXsgWEZFUl9NV19ETUFfMiwJMHgwMDIxMTAwMCwJMCwgfSwKKwl7IC0xLCAwLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGF0YV9tYWNpb190aW1pbmcgcGF0YV9tYWNpb19oZWF0aHJvd190aW1pbmdzW10gPSB7CisJeyBYRkVSX1BJT18wLAkJMHgwMDAwMDUyNiwJMCwgfSwKKwl7IFhGRVJfUElPXzEsCQkweDAwMDAwMDg1LAkwLCB9LAorCXsgWEZFUl9QSU9fMiwJCTB4MDAwMDAwMjUsCTAsIH0sCisJeyBYRkVSX1BJT18zLAkJMHgwMDAwMDAyNSwJMCwgfSwKKwl7IFhGRVJfUElPXzQsCQkweDAwMDAwMDI1LAkwLCB9LAorCXsgWEZFUl9NV19ETUFfMCwJMHgwMDA3NDAwMCwJMCwgfSwKKwl7IFhGRVJfTVdfRE1BXzEsCTB4MDAyMjEwMDAsCTAsIH0sCisJeyBYRkVSX01XX0RNQV8yLAkweDAwMjExMDAwLAkwLCB9LAorCXsgLTEsIDAsIDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwYXRhX21hY2lvX3RpbWluZyBwYXRhX21hY2lvX2tsMzNfdGltaW5nc1tdID0geworCXsgWEZFUl9QSU9fMCwJCTB4MDAwMDA1MjYsCTAsIH0sCisJeyBYRkVSX1BJT18xLAkJMHgwMDAwMDA4NSwJMCwgfSwKKwl7IFhGRVJfUElPXzIsCQkweDAwMDAwMDI1LAkwLCB9LAorCXsgWEZFUl9QSU9fMywJCTB4MDAwMDAwMjUsCTAsIH0sCisJeyBYRkVSX1BJT180LAkJMHgwMDAwMDAyNSwJMCwgfSwKKwl7IFhGRVJfTVdfRE1BXzAsCTB4MDAwODQwMDAsCTAsIH0sCisJeyBYRkVSX01XX0RNQV8xLAkweDAwMDIxODAwLAkwLCB9LAorCXsgWEZFUl9NV19ETUFfMiwJMHgwMDAxMTgwMCwJMCwgfSwKKwl7IC0xLCAwLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGF0YV9tYWNpb190aW1pbmcgcGF0YV9tYWNpb19rbDY2X3RpbWluZ3NbXSA9IHsKKwl7IFhGRVJfUElPXzAsCQkweDAwMDAwMzhjLAkwLCB9LAorCXsgWEZFUl9QSU9fMSwJCTB4MDAwMDAyMGEsCTAsIH0sCisJeyBYRkVSX1BJT18yLAkJMHgwMDAwMDEyNywJMCwgfSwKKwl7IFhGRVJfUElPXzMsCQkweDAwMDAwMGM2LAkwLCB9LAorCXsgWEZFUl9QSU9fNCwJCTB4MDAwMDAwNjUsCTAsIH0sCisJeyBYRkVSX01XX0RNQV8wLAkweDAwMDg0MDAwLAkwLCB9LAorCXsgWEZFUl9NV19ETUFfMSwJMHgwMDAyOTgwMCwJMCwgfSwKKwl7IFhGRVJfTVdfRE1BXzIsCTB4MDAwMTk0MDAsCTAsIH0sCisJeyBYRkVSX1VETUFfMCwJCTB4MTkxMDAwMDAsCTAsIH0sCisJeyBYRkVSX1VETUFfMSwJCTB4MTRkMDAwMDAsCTAsIH0sCisJeyBYRkVSX1VETUFfMiwJCTB4MTA5MDAwMDAsCTAsIH0sCisJeyBYRkVSX1VETUFfMywJCTB4MGM3MDAwMDAsCTAsIH0sCisJeyBYRkVSX1VETUFfNCwJCTB4MGM1MDAwMDAsCTAsIH0sCisJeyAtMSwgMCwgMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBhdGFfbWFjaW9fdGltaW5nIHBhdGFfbWFjaW9fa2F1YWlfdGltaW5nc1tdID0geworCXsgWEZFUl9QSU9fMCwJCTB4MDgwMDBhOTIsCTAsIH0sCisJeyBYRkVSX1BJT18xLAkJMHgwODAwMDYwZiwJMCwgfSwKKwl7IFhGRVJfUElPXzIsCQkweDA4MDAwMzhiLAkwLCB9LAorCXsgWEZFUl9QSU9fMywJCTB4MDUwMDAyNDksCTAsIH0sCisJeyBYRkVSX1BJT180LAkJMHgwNDAwMDE0OCwJMCwgfSwKKwl7IFhGRVJfTVdfRE1BXzAsCTB4MDA2MTgwMDAsCTAsIH0sCisJeyBYRkVSX01XX0RNQV8xLAkweDAwMjA5MDAwLAkwLCB9LAorCXsgWEZFUl9NV19ETUFfMiwJMHgwMDE0ODAwMCwJMCwgfSwKKwl7IFhGRVJfVURNQV8wLAkJICAgICAgICAgMCwJMHgwMDAwNzBjMSwgfSwKKwl7IFhGRVJfVURNQV8xLAkJICAgICAgICAgMCwJMHgwMDAwNWQ4MSwgfSwKKwl7IFhGRVJfVURNQV8yLAkJICAgICAgICAgMCwJMHgwMDAwNGE2MSwgfSwKKwl7IFhGRVJfVURNQV8zLAkJICAgICAgICAgMCwJMHgwMDAwM2E1MSwgfSwKKwl7IFhGRVJfVURNQV80LAkJICAgICAgICAgMCwJMHgwMDAwMmEzMSwgfSwKKwl7IFhGRVJfVURNQV81LAkJICAgICAgICAgMCwJMHgwMDAwMjkyMSwgfSwKKwl7IC0xLCAwLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGF0YV9tYWNpb190aW1pbmcgcGF0YV9tYWNpb19zaGFzdGFfdGltaW5nc1tdID0geworCXsgWEZFUl9QSU9fMCwJCTB4MGEwMDBjOTcsCTAsIH0sCisJeyBYRkVSX1BJT18xLAkJMHgwNzAwMDcxMiwJMCwgfSwKKwl7IFhGRVJfUElPXzIsCQkweDA0MDAwM2NkLAkwLCB9LAorCXsgWEZFUl9QSU9fMywJCTB4MDUwMDAyOGIsCTAsIH0sCisJeyBYRkVSX1BJT180LAkJMHgwNDAwMDEwYSwJMCwgfSwKKwl7IFhGRVJfTVdfRE1BXzAsCTB4MDA4MjA4MDAsCTAsIH0sCisJeyBYRkVSX01XX0RNQV8xLAkweDAwMjhiMDAwLAkwLCB9LAorCXsgWEZFUl9NV19ETUFfMiwJMHgwMDFjYTAwMCwJMCwgfSwKKwl7IFhGRVJfVURNQV8wLAkJICAgICAgICAgMCwJMHgwMDAzNTkwMSwgfSwKKwl7IFhGRVJfVURNQV8xLAkJICAgICAgICAgMCwJMHgwMDAzNDhiMSwgfSwKKwl7IFhGRVJfVURNQV8yLAkJICAgICAgICAgMCwJMHgwMDAzMzg4MSwgfSwKKwl7IFhGRVJfVURNQV8zLAkJICAgICAgICAgMCwJMHgwMDAzMzg2MSwgfSwKKwl7IFhGRVJfVURNQV80LAkJICAgICAgICAgMCwJMHgwMDAzMzg0MSwgfSwKKwl7IFhGRVJfVURNQV81LAkJICAgICAgICAgMCwJMHgwMDAzMzAzMSwgfSwKKwl7IFhGRVJfVURNQV82LAkJICAgICAgICAgMCwJMHgwMDAzMzAyMSwgfSwKKwl7IC0xLCAwLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGF0YV9tYWNpb190aW1pbmcgKnBhdGFfbWFjaW9fZmluZF90aW1pbmcoCisJCQkJCSAgICBzdHJ1Y3QgcGF0YV9tYWNpb19wcml2ICpwcml2LAorCQkJCQkgICAgaW50IG1vZGUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBwcml2LT50aW1pbmdzW2ldLm1vZGUgPiAwOyBpKyspIHsKKwkJaWYgKHByaXYtPnRpbWluZ3NbaV0ubW9kZSA9PSBtb2RlKQorCQkJcmV0dXJuICZwcml2LT50aW1pbmdzW2ldOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgdm9pZCBwYXRhX21hY2lvX2FwcGx5X3RpbWluZ3Moc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IGRldmljZSkKK3sKKwlzdHJ1Y3QgcGF0YV9tYWNpb19wcml2ICpwcml2ID0gYXAtPnByaXZhdGVfZGF0YTsKKwl2b2lkIF9faW9tZW0gKnJiYXNlID0gYXAtPmlvYWRkci5jbWRfYWRkcjsKKworCWlmIChwcml2LT5raW5kID09IGNvbnRyb2xsZXJfc2hfYXRhNiB8fAorCSAgICBwcml2LT5raW5kID09IGNvbnRyb2xsZXJfdW5fYXRhNiB8fAorCSAgICBwcml2LT5raW5kID09IGNvbnRyb2xsZXJfazJfYXRhNikgeworCQl3cml0ZWwocHJpdi0+dHJlZ1tkZXZpY2VdWzBdLCByYmFzZSArIElERV9LQVVBSV9QSU9fQ09ORklHKTsKKwkJd3JpdGVsKHByaXYtPnRyZWdbZGV2aWNlXVsxXSwgcmJhc2UgKyBJREVfS0FVQUlfVUxUUkFfQ09ORklHKTsKKwl9IGVsc2UKKwkJd3JpdGVsKHByaXYtPnRyZWdbZGV2aWNlXVswXSwgcmJhc2UgKyBJREVfVElNSU5HX0NPTkZJRyk7Cit9CisKK3N0YXRpYyB2b2lkIHBhdGFfbWFjaW9fZGV2X3NlbGVjdChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgZGV2aWNlKQoreworCWF0YV9zZmZfZGV2X3NlbGVjdChhcCwgZGV2aWNlKTsKKworCS8qIEFwcGx5IHRpbWluZ3MgKi8KKwlwYXRhX21hY2lvX2FwcGx5X3RpbWluZ3MoYXAsIGRldmljZSk7Cit9CisKK3N0YXRpYyB2b2lkIHBhdGFfbWFjaW9fc2V0X3RpbWluZ3Moc3RydWN0IGF0YV9wb3J0ICphcCwKKwkJCQkgICBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldikKK3sKKwlzdHJ1Y3QgcGF0YV9tYWNpb19wcml2ICpwcml2ID0gYXAtPnByaXZhdGVfZGF0YTsKKwljb25zdCBzdHJ1Y3QgcGF0YV9tYWNpb190aW1pbmcgKnQ7CisKKwlkZXZfZGJnKHByaXYtPmRldiwgIlNldCB0aW1pbmdzOiBERVY9JWQsUElPPTB4JXggKCVzKSxETUE9MHgleCAoJXMpXG4iLAorCQlhZGV2LT5kZXZubywKKwkJYWRldi0+cGlvX21vZGUsCisJCWF0YV9tb2RlX3N0cmluZyhhdGFfeGZlcl9tb2RlMm1hc2soYWRldi0+cGlvX21vZGUpKSwKKwkJYWRldi0+ZG1hX21vZGUsCisJCWF0YV9tb2RlX3N0cmluZyhhdGFfeGZlcl9tb2RlMm1hc2soYWRldi0+ZG1hX21vZGUpKSk7CisKKwkvKiBGaXJzdCBjbGVhciB0aW1pbmdzICovCisJcHJpdi0+dHJlZ1thZGV2LT5kZXZub11bMF0gPSBwcml2LT50cmVnW2FkZXYtPmRldm5vXVsxXSA9IDA7CisKKwkvKiBOb3cgZ2V0IHRoZSBQSU8gdGltaW5ncyAqLworCXQgPSBwYXRhX21hY2lvX2ZpbmRfdGltaW5nKHByaXYsIGFkZXYtPnBpb19tb2RlKTsKKwlpZiAodCA9PSBOVUxMKSB7CisJCWRldl93YXJuKHByaXYtPmRldiwgIkludmFsaWQgUElPIHRpbWluZyByZXF1ZXN0ZWQ6IDB4JXhcbiIsCisJCQkgYWRldi0+cGlvX21vZGUpOworCQl0ID0gcGF0YV9tYWNpb19maW5kX3RpbWluZyhwcml2LCBYRkVSX1BJT18wKTsKKwl9CisJQlVHX09OKHQgPT0gTlVMTCk7CisKKwkvKiBQSU8gdGltaW5ncyBvbmx5IGV2ZXIgdXNlIHRoZSBmaXJzdCB0cmVnICovCisJcHJpdi0+dHJlZ1thZGV2LT5kZXZub11bMF0gfD0gdC0+cmVnMTsKKworCS8qIE5vdyBnZXQgRE1BIHRpbWluZ3MgKi8KKwl0ID0gcGF0YV9tYWNpb19maW5kX3RpbWluZyhwcml2LCBhZGV2LT5kbWFfbW9kZSk7CisJaWYgKHQgPT0gTlVMTCB8fCAodC0+cmVnMSA9PSAwICYmIHQtPnJlZzIgPT0gMCkpIHsKKwkJZGV2X2RiZyhwcml2LT5kZXYsICJETUEgdGltaW5nIG5vdCBzZXQgeWV0LCB1c2luZyBNV19ETUFfMFxuIik7CisJCXQgPSBwYXRhX21hY2lvX2ZpbmRfdGltaW5nKHByaXYsIFhGRVJfTVdfRE1BXzApOworCX0KKwlCVUdfT04odCA9PSBOVUxMKTsKKworCS8qIERNQSB0aW1pbmdzIGNhbiB1c2UgYm90aCB0cmVncyAqLworCXByaXYtPnRyZWdbYWRldi0+ZGV2bm9dWzBdIHw9IHQtPnJlZzE7CisJcHJpdi0+dHJlZ1thZGV2LT5kZXZub11bMV0gfD0gdC0+cmVnMjsKKworCWRldl9kYmcocHJpdi0+ZGV2LCAiIC0+ICUwOHggJTA4eFxuIiwKKwkJcHJpdi0+dHJlZ1thZGV2LT5kZXZub11bMF0sCisJCXByaXYtPnRyZWdbYWRldi0+ZGV2bm9dWzFdKTsKKworCS8qIEFwcGx5IHRvIGhhcmR3YXJlICovCisJcGF0YV9tYWNpb19hcHBseV90aW1pbmdzKGFwLCBhZGV2LT5kZXZubyk7Cit9CisKKy8qCisgKiBCbGFzdCBzb21lIHdlbGwga25vd24gInNhZmUiIHZhbHVlcyB0byB0aGUgdGltaW5nIHJlZ2lzdGVycyBhdCBpbml0IG9yCisgKiB3YWtldXAgZnJvbSBzbGVlcCB0aW1lLCBiZWZvcmUgd2UgZG8gcmVhbCBjYWxjdWxhdGlvbgorICovCitzdGF0aWMgdm9pZCBwYXRhX21hY2lvX2RlZmF1bHRfdGltaW5ncyhzdHJ1Y3QgcGF0YV9tYWNpb19wcml2ICpwcml2KQoreworCXVuc2lnbmVkIGludCB2YWx1ZSwgdmFsdWUyID0gMDsKKworCXN3aXRjaChwcml2LT5raW5kKSB7CisJCWNhc2UgY29udHJvbGxlcl9zaF9hdGE2OgorCQkJdmFsdWUgPSAweDBhODIwYzk3OworCQkJdmFsdWUyID0gMHgwMDAzMzAzMTsKKwkJCWJyZWFrOworCQljYXNlIGNvbnRyb2xsZXJfdW5fYXRhNjoKKwkJY2FzZSBjb250cm9sbGVyX2syX2F0YTY6CisJCQl2YWx1ZSA9IDB4MDg2MThhOTI7CisJCQl2YWx1ZTIgPSAweDAwMDAyOTIxOworCQkJYnJlYWs7CisJCWNhc2UgY29udHJvbGxlcl9rbF9hdGE0OgorCQkJdmFsdWUgPSAweDAwMDg0MzhjOworCQkJYnJlYWs7CisJCWNhc2UgY29udHJvbGxlcl9rbF9hdGEzOgorCQkJdmFsdWUgPSAweDAwMDg0NTI2OworCQkJYnJlYWs7CisJCWNhc2UgY29udHJvbGxlcl9oZWF0aHJvdzoKKwkJY2FzZSBjb250cm9sbGVyX29oYXJlOgorCQlkZWZhdWx0OgorCQkJdmFsdWUgPSAweDAwMDc0NTI2OworCQkJYnJlYWs7CisJfQorCXByaXYtPnRyZWdbMF1bMF0gPSBwcml2LT50cmVnWzFdWzBdID0gdmFsdWU7CisJcHJpdi0+dHJlZ1swXVsxXSA9IHByaXYtPnRyZWdbMV1bMV0gPSB2YWx1ZTI7Cit9CisKK3N0YXRpYyBpbnQgcGF0YV9tYWNpb19jYWJsZV9kZXRlY3Qoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgcGF0YV9tYWNpb19wcml2ICpwcml2ID0gYXAtPnByaXZhdGVfZGF0YTsKKworCS8qIEdldCBjYWJsZSB0eXBlIGZyb20gZGV2aWNlLXRyZWUgKi8KKwlpZiAocHJpdi0+a2luZCA9PSBjb250cm9sbGVyX2tsX2F0YTQgfHwKKwkgICAgcHJpdi0+a2luZCA9PSBjb250cm9sbGVyX3VuX2F0YTYgfHwKKwkgICAgcHJpdi0+a2luZCA9PSBjb250cm9sbGVyX2syX2F0YTYgfHwKKwkgICAgcHJpdi0+a2luZCA9PSBjb250cm9sbGVyX3NoX2F0YTYpIHsKKwkJY29uc3QgY2hhciogY2FibGUgPSBvZl9nZXRfcHJvcGVydHkocHJpdi0+bm9kZSwgImNhYmxlLXR5cGUiLAorCQkJCQkJICAgIE5VTEwpOworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3QgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOworCQljb25zdCBjaGFyICptb2RlbCA9IG9mX2dldF9wcm9wZXJ0eShyb290LCAibW9kZWwiLCBOVUxMKTsKKworCQlpZiAoY2FibGUgJiYgIXN0cm5jbXAoY2FibGUsICI4MC0iLCAzKSkgeworCQkJLyogU29tZSBkcml2ZXMgZmFpbCB0byBkZXRlY3QgODBjIGNhYmxlIGluIFBvd2VyQm9vaworCQkJICogVGhlc2UgbWFjaGluZSB1c2UgcHJvcHJpZXRhcnkgc2hvcnQgSURFIGNhYmxlCisJCQkgKiBhbnl3YXkKKwkJCSAqLworCQkJaWYgKCFzdHJuY21wKG1vZGVsLCAiUG93ZXJCb29rIiwgOSkpCisJCQkJcmV0dXJuIEFUQV9DQkxfUEFUQTQwX1NIT1JUOworCQkJZWxzZQorCQkJCXJldHVybiBBVEFfQ0JMX1BBVEE4MDsKKwkJfQorCX0KKworCS8qIEc1J3Mgc2VlbSB0byBoYXZlIGluY29ycmVjdCBjYWJsZSB0eXBlIGluIGRldmljZS10cmVlLgorCSAqIExldCdzIGFzc3VtZSB0aGV5IGFsd2F5cyBoYXZlIGEgODAgY29uZHVjdG9yIGNhYmxlLCB0aGlzIHNlZW0gdG8KKwkgKiBiZSBhbHdheXMgdGhlIGNhc2UgdW5sZXNzIHRoZSB1c2VyIG11Y2tlZCBhcm91bmQKKwkgKi8KKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocHJpdi0+bm9kZSwgIksyLVVBVEEiKSB8fAorCSAgICBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwcml2LT5ub2RlLCAic2hhc3RhLWF0YSIpKQorCQlyZXR1cm4gQVRBX0NCTF9QQVRBODA7CisKKwkvKiBBbnl0aGluZyBlbHNlIGlzIDQwIGNvbm5lY3RvcnMgKi8KKwlyZXR1cm4gQVRBX0NCTF9QQVRBNDA7Cit9CisKK3N0YXRpYyB2b2lkIHBhdGFfbWFjaW9fcWNfcHJlcChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXVuc2lnbmVkIGludCB3cml0ZSA9IChxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfV1JJVEUpOworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisJc3RydWN0IHBhdGFfbWFjaW9fcHJpdiAqcHJpdiA9IGFwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlzdHJ1Y3QgZGJkbWFfY21kICp0YWJsZTsKKwl1bnNpZ25lZCBpbnQgc2ksIHBpOworCisJZGV2X2RiZ2RtYShwcml2LT5kZXYsICIlczogcWMgJXAgZmxhZ3MgJWx4LCB3cml0ZSAlZCBkZXYgJWRcbiIsCisJCSAgIF9fZnVuY19fLCBxYywgcWMtPmZsYWdzLCB3cml0ZSwgcWMtPmRldi0+ZGV2bm8pOworCisJaWYgKCEocWMtPmZsYWdzICYgQVRBX1FDRkxBR19ETUFNQVApKQorCQlyZXR1cm47CisKKwl0YWJsZSA9IChzdHJ1Y3QgZGJkbWFfY21kICopIHByaXYtPmRtYV90YWJsZV9jcHU7CisKKwlwaSA9IDA7CisJZm9yX2VhY2hfc2cocWMtPnNnLCBzZywgcWMtPm5fZWxlbSwgc2kpIHsKKwkJdTMyIGFkZHIsIHNnX2xlbiwgbGVuOworCisJCS8qIGRldGVybWluZSBpZiBwaHlzaWNhbCBETUEgYWRkciBzcGFucyA2NEsgYm91bmRhcnkuCisJCSAqIE5vdGUgaC93IGRvZXNuJ3Qgc3VwcG9ydCA2NC1iaXQsIHNvIHdlIHVuY29uZGl0aW9uYWxseQorCQkgKiB0cnVuY2F0ZSBkbWFfYWRkcl90IHRvIHUzMi4KKwkJICovCisJCWFkZHIgPSAodTMyKSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJCXNnX2xlbiA9IHNnX2RtYV9sZW4oc2cpOworCisJCXdoaWxlIChzZ19sZW4pIHsKKwkJCS8qIHRhYmxlIG92ZXJmbG93IHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJCUJVR19PTiAocGkrKyA+PSBNQVhfRENNRFMpOworCisJCQlsZW4gPSAoc2dfbGVuIDwgTUFYX0RCRE1BX1NFRykgPyBzZ19sZW4gOiBNQVhfREJETUFfU0VHOworCQkJc3RfbGUxNigmdGFibGUtPmNvbW1hbmQsIHdyaXRlID8gT1VUUFVUX01PUkU6IElOUFVUX01PUkUpOworCQkJc3RfbGUxNigmdGFibGUtPnJlcV9jb3VudCwgbGVuKTsKKwkJCXN0X2xlMzIoJnRhYmxlLT5waHlfYWRkciwgYWRkcik7CisJCQl0YWJsZS0+Y21kX2RlcCA9IDA7CisJCQl0YWJsZS0+eGZlcl9zdGF0dXMgPSAwOworCQkJdGFibGUtPnJlc19jb3VudCA9IDA7CisJCQlhZGRyICs9IGxlbjsKKwkJCXNnX2xlbiAtPSBsZW47CisJCQkrK3RhYmxlOworCQl9CisJfQorCisJLyogU2hvdWxkIG5ldmVyIGhhcHBlbiBhY2NvcmRpbmcgdG8gVGVqdW4gKi8KKwlCVUdfT04oIXBpKTsKKworCS8qIENvbnZlcnQgdGhlIGxhc3QgY29tbWFuZCB0byBhbiBpbnB1dC9vdXRwdXQgKi8KKwl0YWJsZS0tOworCXN0X2xlMTYoJnRhYmxlLT5jb21tYW5kLCB3cml0ZSA/IE9VVFBVVF9MQVNUOiBJTlBVVF9MQVNUKTsKKwl0YWJsZSsrOworCisJLyogQWRkIHRoZSBzdG9wIGNvbW1hbmQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCAqLworCW1lbXNldCh0YWJsZSwgMCwgc2l6ZW9mKHN0cnVjdCBkYmRtYV9jbWQpKTsKKwlzdF9sZTE2KCZ0YWJsZS0+Y29tbWFuZCwgREJETUFfU1RPUCk7CisKKwlkZXZfZGJnZG1hKHByaXYtPmRldiwgIiVzOiAlZCBETUEgbGlzdCBlbnRyaWVzXG4iLCBfX2Z1bmNfXywgcGkpOworfQorCisKK3N0YXRpYyB2b2lkIHBhdGFfbWFjaW9fZnJlZXplKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqZG1hX3JlZ3MgPSBhcC0+aW9hZGRyLmJtZG1hX2FkZHI7CisKKwlpZiAoZG1hX3JlZ3MpIHsKKwkJdW5zaWduZWQgaW50IHRpbWVvdXQgPSAxMDAwMDAwOworCisJCS8qIE1ha2Ugc3VyZSBETUEgY29udHJvbGxlciBpcyBzdG9wcGVkICovCisJCXdyaXRlbCgoUlVOfFBBVVNFfEZMVVNIfFdBS0V8REVBRCkgPDwgMTYsICZkbWFfcmVncy0+Y29udHJvbCk7CisJCXdoaWxlICgtLXRpbWVvdXQgJiYgKHJlYWRsKCZkbWFfcmVncy0+c3RhdHVzKSAmIFJVTikpCisJCQl1ZGVsYXkoMSk7CisJfQorCisJYXRhX3NmZl9mcmVlemUoYXApOworfQorCisKK3N0YXRpYyB2b2lkIHBhdGFfbWFjaW9fYm1kbWFfc2V0dXAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXN0cnVjdCBwYXRhX21hY2lvX3ByaXYgKnByaXYgPSBhcC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKmRtYV9yZWdzID0gYXAtPmlvYWRkci5ibWRtYV9hZGRyOworCWludCBkZXYgPSBxYy0+ZGV2LT5kZXZubzsKKworCWRldl9kYmdkbWEocHJpdi0+ZGV2LCAiJXM6IHFjICVwXG4iLCBfX2Z1bmNfXywgcWMpOworCisJLyogTWFrZSBzdXJlIERNQSBjb21tYW5kcyB1cGRhdGVzIGFyZSB2aXNpYmxlICovCisJd3JpdGVsKHByaXYtPmRtYV90YWJsZV9kbWEsICZkbWFfcmVncy0+Y21kcHRyKTsKKworCS8qIE9uIEtleUxhcmdvIDY2TWh6IGNlbGwsIHdlIG5lZWQgdG8gYWRkIDYwbnMgdG8gd3JEYXRhU2V0dXAgb24KKwkgKiBVRE1BIHJlYWRzCisJICovCisJaWYgKHByaXYtPmtpbmQgPT0gY29udHJvbGxlcl9rbF9hdGE0ICYmCisJICAgIChwcml2LT50cmVnW2Rldl1bMF0gJiBUUl82Nl9VRE1BX0VOKSkgeworCQl2b2lkIF9faW9tZW0gKnJiYXNlID0gYXAtPmlvYWRkci5jbWRfYWRkcjsKKwkJdTMyIHJlZyA9IHByaXYtPnRyZWdbZGV2XVswXTsKKworCQlpZiAoIShxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfV1JJVEUpKQorCQkJcmVnICs9IDB4MDA4MDAwMDA7CisJCXdyaXRlbChyZWcsIHJiYXNlICsgSURFX1RJTUlOR19DT05GSUcpOworCX0KKworCS8qIGlzc3VlIHIvdyBjb21tYW5kICovCisJYXAtPm9wcy0+c2ZmX2V4ZWNfY29tbWFuZChhcCwgJnFjLT50Zik7Cit9CisKK3N0YXRpYyB2b2lkIHBhdGFfbWFjaW9fYm1kbWFfc3RhcnQoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXN0cnVjdCBwYXRhX21hY2lvX3ByaXYgKnByaXYgPSBhcC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKmRtYV9yZWdzID0gYXAtPmlvYWRkci5ibWRtYV9hZGRyOworCisJZGV2X2RiZ2RtYShwcml2LT5kZXYsICIlczogcWMgJXBcbiIsIF9fZnVuY19fLCBxYyk7CisKKwl3cml0ZWwoKFJVTiA8PCAxNikgfCBSVU4sICZkbWFfcmVncy0+Y29udHJvbCk7CisJLyogTWFrZSBzdXJlIGl0IGdldHMgdG8gdGhlIGNvbnRyb2xsZXIgcmlnaHQgbm93ICovCisJKHZvaWQpcmVhZGwoJmRtYV9yZWdzLT5jb250cm9sKTsKK30KKworc3RhdGljIHZvaWQgcGF0YV9tYWNpb19ibWRtYV9zdG9wKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKwlzdHJ1Y3QgcGF0YV9tYWNpb19wcml2ICpwcml2ID0gYXAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICpkbWFfcmVncyA9IGFwLT5pb2FkZHIuYm1kbWFfYWRkcjsKKwl1bnNpZ25lZCBpbnQgdGltZW91dCA9IDEwMDAwMDA7CisKKwlkZXZfZGJnZG1hKHByaXYtPmRldiwgIiVzOiBxYyAlcFxuIiwgX19mdW5jX18sIHFjKTsKKworCS8qIFN0b3AgdGhlIERNQSBlbmdpbmUgYW5kIHdhaXQgZm9yIGl0IHRvIGZ1bGwgaGFsdCAqLworCXdyaXRlbCAoKChSVU58V0FLRXxERUFEKSA8PCAxNiksICZkbWFfcmVncy0+Y29udHJvbCk7CisJd2hpbGUgKC0tdGltZW91dCAmJiAocmVhZGwoJmRtYV9yZWdzLT5zdGF0dXMpICYgUlVOKSkKKwkJdWRlbGF5KDEpOworfQorCitzdGF0aWMgdTggcGF0YV9tYWNpb19ibWRtYV9zdGF0dXMoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgcGF0YV9tYWNpb19wcml2ICpwcml2ID0gYXAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICpkbWFfcmVncyA9IGFwLT5pb2FkZHIuYm1kbWFfYWRkcjsKKwl1MzIgZHN0YXQsIHJzdGF0ID0gQVRBX0RNQV9JTlRSOworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IDA7CisKKwlkc3RhdCA9IHJlYWRsKCZkbWFfcmVncy0+c3RhdHVzKTsKKworCWRldl9kYmdkbWEocHJpdi0+ZGV2LCAiJXM6IGRzdGF0PSV4XG4iLCBfX2Z1bmNfXywgZHN0YXQpOworCisJLyogV2UgaGF2ZSB0d28gdGhpbmdzIHRvIGRlYWwgd2l0aCBoZXJlOgorCSAqCisJICogLSBUaGUgZGJkbWEgd29uJ3Qgc3RvcCBpZiB0aGUgY29tbWFuZCB3YXMgc3RhcnRlZAorCSAqIGJ1dCBjb21wbGV0ZWQgd2l0aCBhbiBlcnJvciB3aXRob3V0IHRyYW5zZmVycmluZyBhbGwKKwkgKiBkYXRhcy4gVGhpcyBoYXBwZW5zIHdoZW4gYmFkIGJsb2NrcyBhcmUgbWV0IGR1cmluZworCSAqIGEgbXVsdGktYmxvY2sgdHJhbnNmZXIuCisJICoKKwkgKiAtIFRoZSBkYmRtYSBmaWZvIGhhc24ndCB5ZXQgZmluaXNoZWQgZmx1c2hpbmcgdG8KKwkgKiB0byBzeXN0ZW0gbWVtb3J5IHdoZW4gdGhlIGRpc2sgaW50ZXJydXB0IG9jY3Vycy4KKwkgKgorCSAqLworCisJLyogRmlyc3QgY2hlY2sgZm9yIGVycm9ycyAqLworCWlmICgoZHN0YXQgJiAoUlVOfERFQUQpKSAhPSBSVU4pCisJCXJzdGF0IHw9IEFUQV9ETUFfRVJSOworCisJLyogSWYgQUNUSVZFIGlzIGNsZWFyZWQsIHRoZSBTVE9QIGNvbW1hbmQgaGFzIGJlZW4gaGl0IGFuZAorCSAqIHRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZS4gSWYgbm90LCB3ZSBoYXZlIHRvIGZsdXNoIHRoZQorCSAqIGNoYW5uZWwuCisJICovCisJaWYgKChkc3RhdCAmIEFDVElWRSkgPT0gMCkKKwkJcmV0dXJuIHJzdGF0OworCisJZGV2X2RiZ2RtYShwcml2LT5kZXYsICIlczogRE1BIHN0aWxsIGFjdGl2ZSwgZmx1c2hpbmcuLi5cbiIsIF9fZnVuY19fKTsKKworCS8qIElmIGRiZG1hIGRpZG4ndCBleGVjdXRlIHRoZSBTVE9QIGNvbW1hbmQgeWV0LCB0aGUKKwkgKiBhY3RpdmUgYml0IGlzIHN0aWxsIHNldC4gV2UgY29uc2lkZXIgdGhhdCB3ZSBhcmVuJ3QKKwkgKiBzaGFyaW5nIGludGVycnVwdHMgKHdoaWNoIGlzIGhvcGVmdWxseSB0aGUgY2FzZSB3aXRoCisJICogdGhvc2UgY29udHJvbGxlcnMpIGFuZCBzbyB3ZSBqdXN0IHRyeSB0byBmbHVzaCB0aGUKKwkgKiBjaGFubmVsIGZvciBwZW5kaW5nIGRhdGEgaW4gdGhlIGZpZm8KKwkgKi8KKwl1ZGVsYXkoMSk7CisJd3JpdGVsKChGTFVTSCA8PCAxNikgfCBGTFVTSCwgJmRtYV9yZWdzLT5jb250cm9sKTsKKwlmb3IgKDs7KSB7CisJCXVkZWxheSgxKTsKKwkJZHN0YXQgPSByZWFkbCgmZG1hX3JlZ3MtPnN0YXR1cyk7CisJCWlmICgoZHN0YXQgJiBGTFVTSCkgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoKyt0aW1lb3V0ID4gMTAwMCkgeworCQkJZGV2X3dhcm4ocHJpdi0+ZGV2LCAidGltZW91dCBmbHVzaGluZyBETUFcbiIpOworCQkJcnN0YXQgfD0gQVRBX0RNQV9FUlI7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcnN0YXQ7Cit9CisKKy8qIHBvcnRfc3RhcnQgaXMgd2hlbiB3ZSBhbGxvY2F0ZSB0aGUgRE1BIGNvbW1hbmQgbGlzdCAqLworc3RhdGljIGludCBwYXRhX21hY2lvX3BvcnRfc3RhcnQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgcGF0YV9tYWNpb19wcml2ICpwcml2ID0gYXAtPnByaXZhdGVfZGF0YTsKKworCWlmIChhcC0+aW9hZGRyLmJtZG1hX2FkZHIgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIERCRE1BIGNvbW1hbmRzLgorCSAqCisJICogVGhlICsyIGlzICsxIGZvciB0aGUgc3RvcCBjb21tYW5kIGFuZCArMSB0byBhbGxvdyBmb3IKKwkgKiBhbGlnbmluZyB0aGUgc3RhcnQgYWRkcmVzcyB0byBhIG11bHRpcGxlIG9mIDE2IGJ5dGVzLgorCSAqLworCXByaXYtPmRtYV90YWJsZV9jcHUgPQorCQlkbWFtX2FsbG9jX2NvaGVyZW50KHByaXYtPmRldiwKKwkJCQkgICAgKE1BWF9EQ01EUyArIDIpICogc2l6ZW9mKHN0cnVjdCBkYmRtYV9jbWQpLAorCQkJCSAgICAmcHJpdi0+ZG1hX3RhYmxlX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByaXYtPmRtYV90YWJsZV9jcHUgPT0gTlVMTCkgeworCQlkZXZfZXJyKHByaXYtPmRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBETUEgY29tbWFuZCBsaXN0XG4iKTsKKwkJYXAtPmlvYWRkci5ibWRtYV9hZGRyID0gTlVMTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBhdGFfbWFjaW9faXJxX2NsZWFyKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJc3RydWN0IHBhdGFfbWFjaW9fcHJpdiAqcHJpdiA9IGFwLT5wcml2YXRlX2RhdGE7CisKKwkvKiBOb3RoaW5nIHRvIGRvIGhlcmUgKi8KKworCWRldl9kYmdkbWEocHJpdi0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIHZvaWQgcGF0YV9tYWNpb19yZXNldF9odyhzdHJ1Y3QgcGF0YV9tYWNpb19wcml2ICpwcml2LCBpbnQgcmVzdW1lKQoreworCWRldl9kYmcocHJpdi0+ZGV2LCAiRW5hYmxpbmcgJiByZXNldHRpbmcuLi4gXG4iKTsKKworCWlmIChwcml2LT5tZWRpYWJheSkKKwkJcmV0dXJuOworCisJaWYgKHByaXYtPmtpbmQgPT0gY29udHJvbGxlcl9vaGFyZSAmJiAhcmVzdW1lKSB7CisJCS8qIFRoZSBjb2RlIGJlbG93IGlzIGhhdmluZyB0cm91YmxlIG9uIHNvbWUgb2hhcmUgbWFjaGluZXMKKwkJICogKHRpbWluZyByZWxhdGVkID8pLiBVbnRpbCBJIGNhbiBwdXQgbXkgaGFuZCBvbiBvbmUgb2YgdGhlc2UKKwkJICogdW5pdHMsIEkga2VlcCB0aGUgb2xkIHdheQorCQkgKi8KKwkJcHBjX21kLmZlYXR1cmVfY2FsbChQTUFDX0ZUUl9JREVfRU5BQkxFLCBwcml2LT5ub2RlLCAwLCAxKTsKKwl9IGVsc2UgeworCQlpbnQgcmM7CisKKyAJCS8qIFJlc2V0IGFuZCBlbmFibGUgY29udHJvbGxlciAqLworCQlyYyA9IHBwY19tZC5mZWF0dXJlX2NhbGwoUE1BQ19GVFJfSURFX1JFU0VULAorCQkJCQkgcHJpdi0+bm9kZSwgcHJpdi0+YWFwbF9idXNfaWQsIDEpOworCQlwcGNfbWQuZmVhdHVyZV9jYWxsKFBNQUNfRlRSX0lERV9FTkFCTEUsCisJCQkJICAgIHByaXYtPm5vZGUsIHByaXYtPmFhcGxfYnVzX2lkLCAxKTsKKwkJbXNsZWVwKDEwKTsKKwkJLyogT25seSBib3RoZXIgd2FpdGluZyBpZiB0aGVyZSdzIGEgcmVzZXQgY29udHJvbCAqLworCQlpZiAocmMgPT0gMCkgeworCQkJcHBjX21kLmZlYXR1cmVfY2FsbChQTUFDX0ZUUl9JREVfUkVTRVQsCisJCQkJCSAgICBwcml2LT5ub2RlLCBwcml2LT5hYXBsX2J1c19pZCwgMCk7CisJCQltc2xlZXAoSURFX1dBS0VVUF9ERUxBWV9NUyk7CisJCX0KKwl9CisKKwkvKiBJZiByZXN1bWluZyBhIFBDSSBkZXZpY2UsIHJlc3RvcmUgdGhlIGNvbmZpZyBzcGFjZSBoZXJlICovCisJaWYgKHByaXYtPnBkZXYgJiYgcmVzdW1lKSB7CisJCWludCByYzsKKworCQlwY2lfcmVzdG9yZV9zdGF0ZShwcml2LT5wZGV2KTsKKwkJcmMgPSBwY2ltX2VuYWJsZV9kZXZpY2UocHJpdi0+cGRldik7CisJCWlmIChyYykKKwkJCWRldl9wcmludGsoS0VSTl9FUlIsICZwcml2LT5wZGV2LT5kZXYsCisJCQkJICAgIkZhaWxlZCB0byBlbmFibGUgZGV2aWNlIGFmdGVyIHJlc3VtZSAoJWQpXG4iLCByYyk7CisJCWVsc2UKKwkJCXBjaV9zZXRfbWFzdGVyKHByaXYtPnBkZXYpOworCX0KKworCS8qIE9uIEthdWFpLCBpbml0aWFsaXplIHRoZSBGQ1IuIFdlIGRvbid0IHBlcmZvcm0gYSByZXNldCwgZG9lc24ndCByZWFsbHkKKwkgKiBzZWVtIG5lY2Vzc2FyeSBhbmQgc3BlZWRzIHVwIHRoZSBib290IHByb2Nlc3MKKwkgKi8KKwlpZiAocHJpdi0+a2F1YWlfZmNyKQorCQl3cml0ZWwoS0FVQUlfRkNSX1VBVEFfTUFHSUMgfAorCQkgICAgICAgS0FVQUlfRkNSX1VBVEFfUkVTRVRfTiB8CisJCSAgICAgICBLQVVBSV9GQ1JfVUFUQV9FTkFCTEUsIHByaXYtPmthdWFpX2Zjcik7Cit9CisKKy8qIEhvb2sgdGhlIHN0YW5kYXJkIHNsYXZlIGNvbmZpZyB0byBmaXh1cCBzb21lIEhXIHJlbGF0ZWQgYWxpZ25tZW50CisgKiByZXN0cmljdGlvbnMKKyAqLworc3RhdGljIGludCBwYXRhX21hY2lvX3NsYXZlX2NvbmZpZyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IGF0YV9zaG9zdF90b19wb3J0KHNkZXYtPmhvc3QpOworCXN0cnVjdCBwYXRhX21hY2lvX3ByaXYgKnByaXYgPSBhcC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhdGFfZGV2aWNlICpkZXY7CisJdTE2IGNtZDsKKwlpbnQgcmM7CisKKwkvKiBGaXJzdCBjYWxsIG9yaWdpbmFsICovCisJcmMgPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcoc2Rldik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKiBUaGlzIGlzIGxpZnRlZCBmcm9tIHNhdGFfbnYgKi8KKwlkZXYgPSAmYXAtPmxpbmsuZGV2aWNlW3NkZXYtPmlkXTsKKworCS8qIE9IYXJlIGhhcyBpc3N1ZXMgd2l0aCBub24gY2FjaGUgYWxpZ25lZCBETUEgb24gc29tZSBjaGlwc2V0cyAqLworCWlmIChwcml2LT5raW5kID09IGNvbnRyb2xsZXJfb2hhcmUpIHsKKwkJYmxrX3F1ZXVlX3VwZGF0ZV9kbWFfYWxpZ25tZW50KHNkZXYtPnJlcXVlc3RfcXVldWUsIDMxKTsKKwkJYmxrX3F1ZXVlX3VwZGF0ZV9kbWFfcGFkKHNkZXYtPnJlcXVlc3RfcXVldWUsIDMxKTsKKworCQkvKiBUZWxsIHRoZSB3b3JsZCBhYm91dCBpdCAqLworCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fSU5GTywgIk9IYXJlIGFsaWdubWVudCBsaW1pdHMgYXBwbGllZFxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIFdlIG9ubHkgaGF2ZSBpc3N1ZXMgd2l0aCBBVEFQSSAqLworCWlmIChkZXYtPmNsYXNzICE9IEFUQV9ERVZfQVRBUEkpCisJCXJldHVybiAwOworCisJLyogU2hhc3RhIGFuZCBLMiBzZWVtIHRvIGhhdmUgImlzc3VlcyIgd2l0aCByZWFkcyAuLi4gKi8KKwlpZiAocHJpdi0+a2luZCA9PSBjb250cm9sbGVyX3NoX2F0YTYgfHwgcHJpdi0+a2luZCA9PSBjb250cm9sbGVyX2syX2F0YTYpIHsKKwkJLyogQWxscmlnaHQgdGhlc2UgYXJlIGJhZCwgYXBwbHkgcmVzdHJpY3Rpb25zICovCisJCWJsa19xdWV1ZV91cGRhdGVfZG1hX2FsaWdubWVudChzZGV2LT5yZXF1ZXN0X3F1ZXVlLCAxNSk7CisJCWJsa19xdWV1ZV91cGRhdGVfZG1hX3BhZChzZGV2LT5yZXF1ZXN0X3F1ZXVlLCAxNSk7CisKKwkJLyogV2UgZW5hYmxlIE1XSSBhbmQgaGFjayBjYWNoZSBsaW5lIHNpemUgZGlyZWN0bHkgaGVyZSwgdGhpcworCQkgKiBpcyBzcGVjaWZpYyB0byB0aGlzIGNoaXBzZXQgYW5kIG5vdCBub3JtYWwgdmFsdWVzLCB3ZSBoYXBwZW4KKwkJICogdG8gc29tZXdoYXQga25vdyB3aGF0IHdlIGFyZSBkb2luZyBoZXJlICh3aGljaCBpcyBiYXNpY2FsbHkKKwkJICogdG8gZG8gdGhlIHNhbWUgQXBwbGUgZG9lcyBhbmQgcHJheSB0aGV5IGRpZCBub3QgZ2V0IGl0IHdyb25nIDotKQorCQkgKi8KKwkJQlVHX09OKCFwcml2LT5wZGV2KTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHByaXYtPnBkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsIDB4MDgpOworCQlwY2lfcmVhZF9jb25maWdfd29yZChwcml2LT5wZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChwcml2LT5wZGV2LCBQQ0lfQ09NTUFORCwKKwkJCQkgICAgICBjbWQgfCBQQ0lfQ09NTUFORF9JTlZBTElEQVRFKTsKKworCQkvKiBUZWxsIHRoZSB3b3JsZCBhYm91dCBpdCAqLworCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fSU5GTywKKwkJCSAgICAgICAiSzIvU2hhc3RhIGFsaWdubWVudCBsaW1pdHMgYXBwbGllZFxuIik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKworc3RhdGljIGludCBwYXRhX21hY2lvX2RvX3N1c3BlbmQoc3RydWN0IHBhdGFfbWFjaW9fcHJpdiAqcHJpdiwgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJaW50IHJjOworCisJLyogRmlyc3QsIGNvcmUgbGliYXRhIHN1c3BlbmQgdG8gZG8gbW9zdCBvZiB0aGUgd29yayAqLworCXJjID0gYXRhX2hvc3Rfc3VzcGVuZChwcml2LT5ob3N0LCBtZXNnKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCS8qIFJlc3RvcmUgdG8gZGVmYXVsdCB0aW1pbmdzICovCisJcGF0YV9tYWNpb19kZWZhdWx0X3RpbWluZ3MocHJpdik7CisKKwkvKiBNYXNrIGludGVycnVwdC4gTm90IHN0cmljdGx5IG5lY2Vzc2FyeSBidXQgb2xkIGRyaXZlciBkaWQKKwkgKiBpdCBhbmQgSSdkIHJhdGhlciBub3QgY2hhbmdlIHRoYXQgaGVyZSAqLworCWRpc2FibGVfaXJxKHByaXYtPmlycSk7CisKKwkvKiBUaGUgbWVkaWEgYmF5IHdpbGwgaGFuZGxlIGl0c2VsZiBqdXN0IGZpbmUgKi8KKwlpZiAocHJpdi0+bWVkaWFiYXkpCisJCXJldHVybiAwOworCisJLyogS2F1YWkgaGFzIGJ1cyBjb250cm9sIEZDUnMgZGlyZWN0bHkgaGVyZSAqLworCWlmIChwcml2LT5rYXVhaV9mY3IpIHsKKwkJdTMyIGZjciA9IHJlYWRsKHByaXYtPmthdWFpX2Zjcik7CisJCWZjciAmPSB+KEtBVUFJX0ZDUl9VQVRBX1JFU0VUX04gfCBLQVVBSV9GQ1JfVUFUQV9FTkFCTEUpOworCQl3cml0ZWwoZmNyLCBwcml2LT5rYXVhaV9mY3IpOworCX0KKworCS8qIEZvciBQQ0ksIHNhdmUgc3RhdGUgYW5kIGRpc2FibGUgRE1BLiBObyBuZWVkIHRvIGNhbGwKKwkgKiBwY2lfc2V0X3Bvd2VyX3N0YXRlKCksIHRoZSBIVyBkb2Vzbid0IGRvIEQgc3RhdGVzIHRoYXQKKwkgKiB3YXksIHRoZSBwbGF0Zm9ybSBjb2RlIHdpbGwgdGFrZSBjYXJlIG9mIHN1c3BlbmRpbmcgdGhlCisJICogQVNJQyBwcm9wZXJseQorCSAqLworCWlmIChwcml2LT5wZGV2KSB7CisJCXBjaV9zYXZlX3N0YXRlKHByaXYtPnBkZXYpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocHJpdi0+cGRldik7CisJfQorCisJLyogRGlzYWJsZSB0aGUgYnVzIG9uIG9sZGVyIG1hY2hpbmVzIGFuZCB0aGUgY2VsbCBvbiBrYXVhaSAqLworCXBwY19tZC5mZWF0dXJlX2NhbGwoUE1BQ19GVFJfSURFX0VOQUJMRSwgcHJpdi0+bm9kZSwKKwkJCSAgICBwcml2LT5hYXBsX2J1c19pZCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXRhX21hY2lvX2RvX3Jlc3VtZShzdHJ1Y3QgcGF0YV9tYWNpb19wcml2ICpwcml2KQoreworCS8qIFJlc2V0IGFuZCByZS1lbmFibGUgdGhlIEhXICovCisJcGF0YV9tYWNpb19yZXNldF9odyhwcml2LCAxKTsKKworCS8qIFNhbml0aXplIGRyaXZlIHRpbWluZ3MgKi8KKwlwYXRhX21hY2lvX2FwcGx5X3RpbWluZ3MocHJpdi0+aG9zdC0+cG9ydHNbMF0sIDApOworCisJLyogV2Ugd2FudCBvdXIgSVJRIGJhY2sgISAqLworCWVuYWJsZV9pcnEocHJpdi0+aXJxKTsKKworCS8qIExldCB0aGUgbGliYXRhIGNvcmUgdGFrZSBpdCBmcm9tIHRoZXJlICovCisJYXRhX2hvc3RfcmVzdW1lKHByaXYtPmhvc3QpOworCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgcGF0YV9tYWNpb19zaHQgPSB7CisJQVRBX0JBU0VfU0hUKERSVl9OQU1FKSwKKwkuc2dfdGFibGVzaXplCQk9IE1BWF9EQ01EUywKKwkvKiBXZSBtYXkgbm90IG5lZWQgdGhhdCBzdHJpY3Qgb25lICovCisJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAorCS5zbGF2ZV9jb25maWd1cmUJPSBwYXRhX21hY2lvX3NsYXZlX2NvbmZpZywKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBwYXRhX21hY2lvX29wcyA9IHsKKwkuaW5oZXJpdHMJCT0gJmF0YV9zZmZfcG9ydF9vcHMsCisKKwkuZnJlZXplCQkJPSBwYXRhX21hY2lvX2ZyZWV6ZSwKKwkuc2V0X3Bpb21vZGUJCT0gcGF0YV9tYWNpb19zZXRfdGltaW5ncywKKwkuc2V0X2RtYW1vZGUJCT0gcGF0YV9tYWNpb19zZXRfdGltaW5ncywKKwkuY2FibGVfZGV0ZWN0CQk9IHBhdGFfbWFjaW9fY2FibGVfZGV0ZWN0LAorCS5zZmZfZGV2X3NlbGVjdAkJPSBwYXRhX21hY2lvX2Rldl9zZWxlY3QsCisJLnFjX3ByZXAJCT0gcGF0YV9tYWNpb19xY19wcmVwLAorCS5tb2RlX2ZpbHRlcgkJPSBhdGFfYm1kbWFfbW9kZV9maWx0ZXIsCisJLmJtZG1hX3NldHVwCQk9IHBhdGFfbWFjaW9fYm1kbWFfc2V0dXAsCisJLmJtZG1hX3N0YXJ0CQk9IHBhdGFfbWFjaW9fYm1kbWFfc3RhcnQsCisJLmJtZG1hX3N0b3AJCT0gcGF0YV9tYWNpb19ibWRtYV9zdG9wLAorCS5ibWRtYV9zdGF0dXMJCT0gcGF0YV9tYWNpb19ibWRtYV9zdGF0dXMsCisJLnBvcnRfc3RhcnQJCT0gcGF0YV9tYWNpb19wb3J0X3N0YXJ0LAorCS5zZmZfaXJxX2NsZWFyCQk9IHBhdGFfbWFjaW9faXJxX2NsZWFyLAorfTsKKworc3RhdGljIHZvaWQgX19kZXZpbml0IHBhdGFfbWFjaW9faW52YXJpYW50cyhzdHJ1Y3QgcGF0YV9tYWNpb19wcml2ICpwcml2KQoreworCWNvbnN0IGludCAqYmlkcDsKKworCS8qIElkZW50aWZ5IHRoZSB0eXBlIG9mIGNvbnRyb2xsZXIgKi8KKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocHJpdi0+bm9kZSwgInNoYXN0YS1hdGEiKSkgeworCQlwcml2LT5raW5kID0gY29udHJvbGxlcl9zaF9hdGE2OworCSAgICAgICAgcHJpdi0+dGltaW5ncyA9IHBhdGFfbWFjaW9fc2hhc3RhX3RpbWluZ3M7CisJfSBlbHNlIGlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwcml2LT5ub2RlLCAia2F1YWktYXRhIikpIHsKKwkJcHJpdi0+a2luZCA9IGNvbnRyb2xsZXJfdW5fYXRhNjsKKwkgICAgICAgIHByaXYtPnRpbWluZ3MgPSBwYXRhX21hY2lvX2thdWFpX3RpbWluZ3M7CisJfSBlbHNlIGlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwcml2LT5ub2RlLCAiSzItVUFUQSIpKSB7CisJCXByaXYtPmtpbmQgPSBjb250cm9sbGVyX2syX2F0YTY7CisJICAgICAgICBwcml2LT50aW1pbmdzID0gcGF0YV9tYWNpb19rYXVhaV90aW1pbmdzOworCX0gZWxzZSBpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocHJpdi0+bm9kZSwgImtleWxhcmdvLWF0YSIpKSB7CisJCWlmIChzdHJjbXAocHJpdi0+bm9kZS0+bmFtZSwgImF0YS00IikgPT0gMCkgeworCQkJcHJpdi0+a2luZCA9IGNvbnRyb2xsZXJfa2xfYXRhNDsKKwkJCXByaXYtPnRpbWluZ3MgPSBwYXRhX21hY2lvX2tsNjZfdGltaW5nczsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPmtpbmQgPSBjb250cm9sbGVyX2tsX2F0YTM7CisJCQlwcml2LT50aW1pbmdzID0gcGF0YV9tYWNpb19rbDMzX3RpbWluZ3M7CisJCX0KKwl9IGVsc2UgaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKHByaXYtPm5vZGUsICJoZWF0aHJvdy1hdGEiKSkgeworCQlwcml2LT5raW5kID0gY29udHJvbGxlcl9oZWF0aHJvdzsKKwkJcHJpdi0+dGltaW5ncyA9IHBhdGFfbWFjaW9faGVhdGhyb3dfdGltaW5nczsKKwl9IGVsc2UgeworCQlwcml2LT5raW5kID0gY29udHJvbGxlcl9vaGFyZTsKKwkJcHJpdi0+dGltaW5ncyA9IHBhdGFfbWFjaW9fb2hhcmVfdGltaW5nczsKKwl9CisKKwkvKiBYWFggRklYTUUgLS0tIHNldHVwIHByaXYtPm1lZGlhYmF5IGhlcmUgKi8KKworCS8qIEdldCBBcHBsZSBidXMgSUQgKGZvciBjbG9jayBhbmQgQVNJQyBjb250cm9sKSAqLworCWJpZHAgPSBvZl9nZXRfcHJvcGVydHkocHJpdi0+bm9kZSwgIkFBUEwsYnVzLWlkIiwgTlVMTCk7CisJcHJpdi0+YWFwbF9idXNfaWQgPSAgYmlkcCA/ICpiaWRwIDogMDsKKworCS8qIEZpeHVwIG1pc3NpbmcgQXBwbGUgYnVzIElEIGluIGNhc2Ugb2YgbWVkaWEtYmF5ICovCisJaWYgKHByaXYtPm1lZGlhYmF5ICYmIGJpZHAgPT0gMCkKKwkJcHJpdi0+YWFwbF9idXNfaWQgPSAxOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcGF0YV9tYWNpb19zZXR1cF9pb3Moc3RydWN0IGF0YV9pb3BvcnRzICppb2FkZHIsCisJCQkJCSAgIHZvaWQgX19pb21lbSAqIGJhc2UsCisJCQkJCSAgIHZvaWQgX19pb21lbSAqIGRtYSkKK3sKKwkvKiBjbWRfYWRkciBpcyB0aGUgYmFzZSBvZiByZWdzIGZvciB0aGF0IHBvcnQgKi8KKwlpb2FkZHItPmNtZF9hZGRyCT0gYmFzZTsKKworCS8qIHRhc2tmaWxlIHJlZ2lzdGVycyAqLworCWlvYWRkci0+ZGF0YV9hZGRyCT0gYmFzZSArIChBVEFfUkVHX0RBVEEgICAgPDwgNCk7CisJaW9hZGRyLT5lcnJvcl9hZGRyCT0gYmFzZSArIChBVEFfUkVHX0VSUiAgICAgPDwgNCk7CisJaW9hZGRyLT5mZWF0dXJlX2FkZHIJPSBiYXNlICsgKEFUQV9SRUdfRkVBVFVSRSA8PCA0KTsKKwlpb2FkZHItPm5zZWN0X2FkZHIJPSBiYXNlICsgKEFUQV9SRUdfTlNFQ1QgICA8PCA0KTsKKwlpb2FkZHItPmxiYWxfYWRkcgk9IGJhc2UgKyAoQVRBX1JFR19MQkFMICAgIDw8IDQpOworCWlvYWRkci0+bGJhbV9hZGRyCT0gYmFzZSArIChBVEFfUkVHX0xCQU0gICAgPDwgNCk7CisJaW9hZGRyLT5sYmFoX2FkZHIJPSBiYXNlICsgKEFUQV9SRUdfTEJBSCAgICA8PCA0KTsKKwlpb2FkZHItPmRldmljZV9hZGRyCT0gYmFzZSArIChBVEFfUkVHX0RFVklDRSAgPDwgNCk7CisJaW9hZGRyLT5zdGF0dXNfYWRkcgk9IGJhc2UgKyAoQVRBX1JFR19TVEFUVVMgIDw8IDQpOworCWlvYWRkci0+Y29tbWFuZF9hZGRyCT0gYmFzZSArIChBVEFfUkVHX0NNRCAgICAgPDwgNCk7CisJaW9hZGRyLT5hbHRzdGF0dXNfYWRkcgk9IGJhc2UgKyAweDE2MDsKKwlpb2FkZHItPmN0bF9hZGRyCT0gYmFzZSArIDB4MTYwOworCWlvYWRkci0+Ym1kbWFfYWRkcgk9IGRtYTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHBtYWNfbWFjaW9fY2FsY190aW1pbmdfbWFza3Moc3RydWN0IHBhdGFfbWFjaW9fcHJpdiAqcHJpdiwKKwkJCQkJCSAgIHN0cnVjdCBhdGFfcG9ydF9pbmZvICAgKnBpbmZvKQoreworCWludCBpID0gMDsKKworCXBpbmZvLT5waW9fbWFzawkJPSAwOworCXBpbmZvLT5td2RtYV9tYXNrCT0gMDsKKwlwaW5mby0+dWRtYV9tYXNrCT0gMDsKKworCXdoaWxlIChwcml2LT50aW1pbmdzW2ldLm1vZGUgPiAwKSB7CisJCXVuc2lnbmVkIGludCBtYXNrID0gMVUgPDwgKHByaXYtPnRpbWluZ3NbaV0ubW9kZSAmIDB4MGYpOworCQlzd2l0Y2gocHJpdi0+dGltaW5nc1tpXS5tb2RlICYgMHhmMCkgeworCQljYXNlIDB4MDA6IC8qIFBJTyAqLworCQkJcGluZm8tPnBpb19tYXNrIHw9IChtYXNrID4+IDgpOworCQkJYnJlYWs7CisJCWNhc2UgMHgyMDogLyogTVdETUEgKi8KKwkJCXBpbmZvLT5td2RtYV9tYXNrIHw9IG1hc2s7CisJCQlicmVhazsKKwkJY2FzZSAweDQwOiAvKiBVRE1BICovCisJCQlwaW5mby0+dWRtYV9tYXNrIHw9IG1hc2s7CisJCQlicmVhazsKKwkJfQorCQlpKys7CisJfQorCWRldl9kYmcocHJpdi0+ZGV2LCAiU3VwcG9ydGVkIG1hc2tzOiBQSU89JWx4LCBNV0RNQT0lbHgsIFVETUE9JWx4XG4iLAorCQlwaW5mby0+cGlvX21hc2ssIHBpbmZvLT5td2RtYV9tYXNrLCBwaW5mby0+dWRtYV9tYXNrKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcGF0YV9tYWNpb19jb21tb25faW5pdChzdHJ1Y3QgcGF0YV9tYWNpb19wcml2CSpwcml2LAorCQkJCQkgICAgcmVzb3VyY2Vfc2l6ZV90CQl0ZnJlZ3MsCisJCQkJCSAgICByZXNvdXJjZV9zaXplX3QJCWRtYXJlZ3MsCisJCQkJCSAgICByZXNvdXJjZV9zaXplX3QJCWZjcmVncywKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcJCWlycSkKK3sKKwlzdHJ1Y3QgYXRhX3BvcnRfaW5mbwkJcGluZm87CisJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8JKnBwaVtdID0geyAmcGluZm8sIE5VTEwgfTsKKwl2b2lkIF9faW9tZW0JCQkqZG1hX3JlZ3MgPSBOVUxMOworCisJLyogRmlsbCB1cCBwcml2YXRlcyB3aXRoIHZhcmlvdXMgaW52YXJpYW50cyBjb2xsZWN0ZWQgZnJvbSB0aGUKKwkgKiBkZXZpY2UtdHJlZQorCSAqLworCXBhdGFfbWFjaW9faW52YXJpYW50cyhwcml2KTsKKworCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHNhbmUgaW5pdGlhbCB0aW1pbmdzIGluIHRoZSBjYWNoZSAqLworCXBhdGFfbWFjaW9fZGVmYXVsdF90aW1pbmdzKHByaXYpOworCisJLyogTm90IHN1cmUgd2hhdCB0aGUgcmVhbCBtYXggaXMgYnV0IHdlIGtub3cgaXQncyBsZXNzIHRoYW4gNjRLLCBsZXQncworCSAqIHVzZSA2NEsgbWludXMgMjU2CisJICovCisJZG1hX3NldF9tYXhfc2VnX3NpemUocHJpdi0+ZGV2LCBNQVhfREJETUFfU0VHKTsKKworCS8qIEFsbG9jYXRlIGxpYmF0YSBob3N0IGZvciAxIHBvcnQgKi8KKwltZW1zZXQoJnBpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGF0YV9wb3J0X2luZm8pKTsKKwlwbWFjX21hY2lvX2NhbGNfdGltaW5nX21hc2tzKHByaXYsICZwaW5mbyk7CisJcGluZm8uZmxhZ3MJCT0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX01NSU8gfAorCQkJCSAgQVRBX0ZMQUdfTk9fTEVHQUNZOworCXBpbmZvLnBvcnRfb3BzCQk9ICZwYXRhX21hY2lvX29wczsKKwlwaW5mby5wcml2YXRlX2RhdGEJPSBwcml2OworCisJcHJpdi0+aG9zdCA9IGF0YV9ob3N0X2FsbG9jX3BpbmZvKHByaXYtPmRldiwgcHBpLCAxKTsKKwlpZiAocHJpdi0+aG9zdCA9PSBOVUxMKSB7CisJCWRldl9lcnIocHJpdi0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIEFUQSBwb3J0IHN0cnVjdHVyZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIFNldHVwIHRoZSBwcml2YXRlIGRhdGEgaW4gaG9zdCB0b28gKi8KKwlwcml2LT5ob3N0LT5wcml2YXRlX2RhdGEgPSBwcml2OworCisJLyogTWFwIGJhc2UgcmVnaXN0ZXJzICovCisJcHJpdi0+dGZyZWdzID0gZGV2bV9pb3JlbWFwKHByaXYtPmRldiwgdGZyZWdzLCAweDEwMCk7CisJaWYgKHByaXYtPnRmcmVncyA9PSBOVUxMKSB7CisJCWRldl9lcnIocHJpdi0+ZGV2LCAiRmFpbGVkIHRvIG1hcCBBVEEgcG9ydHNcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcHJpdi0+aG9zdC0+aW9tYXAgPSAmcHJpdi0+dGZyZWdzOworCisJLyogTWFwIERNQSByZWdzICovCisJaWYgKGRtYXJlZ3MgIT0gMCkgeworCQlkbWFfcmVncyA9IGRldm1faW9yZW1hcChwcml2LT5kZXYsIGRtYXJlZ3MsCisJCQkJCXNpemVvZihzdHJ1Y3QgZGJkbWFfcmVncykpOworCQlpZiAoZG1hX3JlZ3MgPT0gTlVMTCkKKwkJCWRldl93YXJuKHByaXYtPmRldiwgIkZhaWxlZCB0byBtYXAgQVRBIERNQSByZWdpc3RlcnNcbiIpOworCX0KKworCS8qIElmIGNoaXAgaGFzIGxvY2FsIGZlYXR1cmUgY29udHJvbCwgbWFwIHRob3NlIHJlZ3MgdG9vICovCisJaWYgKGZjcmVncyAhPSAwKSB7CisJCXByaXYtPmthdWFpX2ZjciA9IGRldm1faW9yZW1hcChwcml2LT5kZXYsIGZjcmVncywgNCk7CisJCWlmIChwcml2LT5rYXVhaV9mY3IgPT0gTlVMTCkgeworCQkJZGV2X2Vycihwcml2LT5kZXYsICJGYWlsZWQgdG8gbWFwIEFUQSBGQ1IgcmVnaXN0ZXJcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKwkvKiBTZXR1cCBwb3J0IGRhdGEgc3RydWN0dXJlICovCisJcGF0YV9tYWNpb19zZXR1cF9pb3MoJnByaXYtPmhvc3QtPnBvcnRzWzBdLT5pb2FkZHIsCisJCQkgICAgIHByaXYtPnRmcmVncywgZG1hX3JlZ3MpOworCXByaXYtPmhvc3QtPnBvcnRzWzBdLT5wcml2YXRlX2RhdGEgPSBwcml2OworCisJLyogaGFyZC1yZXNldCB0aGUgY29udHJvbGxlciAqLworCXBhdGFfbWFjaW9fcmVzZXRfaHcocHJpdiwgMCk7CisJcGF0YV9tYWNpb19hcHBseV90aW1pbmdzKHByaXYtPmhvc3QtPnBvcnRzWzBdLCAwKTsKKworCS8qIEVuYWJsZSBidXMgbWFzdGVyIGlmIG5lY2Vzc2FyeSAqLworCWlmIChwcml2LT5wZGV2ICYmIGRtYV9yZWdzKQorCQlwY2lfc2V0X21hc3Rlcihwcml2LT5wZGV2KTsKKworCWRldl9pbmZvKHByaXYtPmRldiwgIkFjdGl2YXRpbmcgcGF0YS1tYWNpbyBjaGlwc2V0ICVzLCBBcHBsZSBidXMgSUQgJWRcbiIsCisJCSBtYWNpb19hdGFfbmFtZXNbcHJpdi0+a2luZF0sIHByaXYtPmFhcGxfYnVzX2lkKTsKKworCS8qIFN0YXJ0IGl0IHVwICovCisJcHJpdi0+aXJxID0gaXJxOworCXJldHVybiBhdGFfaG9zdF9hY3RpdmF0ZShwcml2LT5ob3N0LCBpcnEsIGF0YV9zZmZfaW50ZXJydXB0LCAwLAorCQkJCSAmcGF0YV9tYWNpb19zaHQpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwYXRhX21hY2lvX2F0dGFjaChzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKK3sKKwlzdHJ1Y3QgcGF0YV9tYWNpb19wcml2CSpwcml2OworCXJlc291cmNlX3NpemVfdAkJdGZyZWdzLCBkbWFyZWdzID0gMDsKKwl1bnNpZ25lZCBsb25nCQlpcnE7CisJaW50CQkJcmM7CisKKwkvKiBDaGVjayBmb3IgYnJva2VuIGRldmljZS10cmVlcyAqLworCWlmIChtYWNpb19yZXNvdXJjZV9jb3VudChtZGV2KSA9PSAwKSB7CisJCWRldl9lcnIoJm1kZXYtPm9mZGV2LmRldiwKKwkJCSJObyBhZGRyZXNzZXMgZm9yIGNvbnRyb2xsZXJcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCS8qIEVuYWJsZSBtYW5hZ2VkIHJlc291cmNlcyAqLworCW1hY2lvX2VuYWJsZV9kZXZyZXMobWRldik7CisKKwkvKiBBbGxvY2F0ZSBhbmQgaW5pdCBwcml2YXRlIGRhdGEgc3RydWN0dXJlICovCisJcHJpdiA9IGRldm1fa3phbGxvYygmbWRldi0+b2ZkZXYuZGV2LAorCQkJICAgIHNpemVvZihzdHJ1Y3QgcGF0YV9tYWNpb19wcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByaXYgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZtZGV2LT5vZmRldi5kZXYsCisJCQkiRmFpbGVkIHRvIGFsbG9jYXRlIHByaXZhdGUgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXByaXYtPm5vZGUgPSBvZl9ub2RlX2dldChtZGV2LT5vZmRldi5ub2RlKTsKKwlwcml2LT5tZGV2ID0gbWRldjsKKwlwcml2LT5kZXYgPSAmbWRldi0+b2ZkZXYuZGV2OworCisJLyogUmVxdWVzdCBtZW1vcnkgcmVzb3VyY2UgZm9yIHRhc2tmaWxlIHJlZ2lzdGVycyAqLworCWlmIChtYWNpb19yZXF1ZXN0X3Jlc291cmNlKG1kZXYsIDAsICJwYXRhLW1hY2lvIikpIHsKKwkJZGV2X2VycigmbWRldi0+b2ZkZXYuZGV2LAorCQkJIkNhbm5vdCBvYnRhaW4gdGFza2ZpbGUgcmVzb3VyY2VcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwl0ZnJlZ3MgPSBtYWNpb19yZXNvdXJjZV9zdGFydChtZGV2LCAwKTsKKworCS8qIFJlcXVlc3QgcmVzb3VyY2VzIGZvciBETUEgcmVnaXN0ZXJzIGlmIGFueSAqLworCWlmIChtYWNpb19yZXNvdXJjZV9jb3VudChtZGV2KSA+PSAyKSB7CisJCWlmIChtYWNpb19yZXF1ZXN0X3Jlc291cmNlKG1kZXYsIDEsICJwYXRhLW1hY2lvLWRtYSIpKQorCQkJZGV2X2VycigmbWRldi0+b2ZkZXYuZGV2LAorCQkJCSJDYW5ub3Qgb2J0YWluIERNQSByZXNvdXJjZVxuIik7CisJCWVsc2UKKwkJCWRtYXJlZ3MgPSBtYWNpb19yZXNvdXJjZV9zdGFydChtZGV2LCAxKTsKKwl9CisKKwkvKgorCSAqIEZpeHVwIG1pc3NpbmcgSVJRIGZvciBzb21lIG9sZCBpbXBsZW1lbnRhdGlvbnMgd2l0aCBicm9rZW4KKwkgKiBkZXZpY2UtdHJlZXMuCisJICoKKwkgKiBUaGlzIGlzIGEgYml0IGJvZ3VzLCBpdCBzaG91bGQgYmUgZml4ZWQgaW4gdGhlIGRldmljZS10cmVlIGl0c2VsZiwKKwkgKiB2aWEgdGhlIGV4aXN0aW5nIG1hY2lvIGZpeHVwcywgYmFzZWQgb24gdGhlIHR5cGUgb2YgaW50ZXJydXB0CisJICogY29udHJvbGxlciBpbiB0aGUgbWFjaGluZS4gSG93ZXZlciwgSSBoYXZlIG5vIHRlc3QgSFcgZm9yIHRoaXMgY2FzZSwKKwkgKiBhbmQgdGhpcyB0cmljayB3b3JrcyB3ZWxsIGVub3VnaCBvbiB0aG9zZSBvbGQgbWFjaGluZXMuLi4KKwkgKi8KKwlpZiAobWFjaW9faXJxX2NvdW50KG1kZXYpID09IDApIHsKKwkJZGV2X3dhcm4oJm1kZXYtPm9mZGV2LmRldiwKKwkJCSAiTm8gaW50ZXJydXB0cyBmb3IgY29udHJvbGxlciwgdXNpbmcgMTNcbiIpOworCQlpcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgMTMpOworCX0gZWxzZQorCQlpcnEgPSBtYWNpb19pcnEobWRldiwgMCk7CisKKwkvKiBQcmV2dmVudCBtZWRpYSBiYXkgY2FsbGJhY2tzIHVudGlsIGZ1bGx5IHJlZ2lzdGVyZWQgKi8KKwlsb2NrX21lZGlhX2JheShwcml2LT5tZGV2LT5tZWRpYV9iYXkpOworCisJLyogR2V0IHJlZ2lzdGVyIGFkZHJlc3NlcyBhbmQgY2FsbCBjb21tb24gaW5pdGlhbGl6YXRpb24gKi8KKwlyYyA9IHBhdGFfbWFjaW9fY29tbW9uX2luaXQocHJpdiwKKwkJCQkgICAgdGZyZWdzLAkJLyogVGFza2ZpbGUgcmVncyAqLworCQkJCSAgICBkbWFyZWdzLAkJLyogREJETUEgcmVncyAqLworCQkJCSAgICAwLAkJCS8qIEZlYXR1cmUgY29udHJvbCAqLworCQkJCSAgICBpcnEpOworCXVubG9ja19tZWRpYV9iYXkocHJpdi0+bWRldi0+bWVkaWFfYmF5KTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgcGF0YV9tYWNpb19kZXRhY2goc3RydWN0IG1hY2lvX2RldiAqbWRldikKK3sKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBtYWNpb19nZXRfZHJ2ZGF0YShtZGV2KTsKKwlzdHJ1Y3QgcGF0YV9tYWNpb19wcml2ICpwcml2ID0gaG9zdC0+cHJpdmF0ZV9kYXRhOworCisJbG9ja19tZWRpYV9iYXkocHJpdi0+bWRldi0+bWVkaWFfYmF5KTsKKworCS8qIE1ha2Ugc3VyZSB0aGUgbWVkaWFiYXkgY2FsbGJhY2sgZG9lc24ndCB0cnkgdG8gYWNjZXNzCisJICogZGVhZCBzdHVmZgorCSAqLworCXByaXYtPmhvc3QtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisKKwlhdGFfaG9zdF9kZXRhY2goaG9zdCk7CisKKwl1bmxvY2tfbWVkaWFfYmF5KHByaXYtPm1kZXYtPm1lZGlhX2JheSk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IHBhdGFfbWFjaW9fc3VzcGVuZChzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBtYWNpb19nZXRfZHJ2ZGF0YShtZGV2KTsKKworCXJldHVybiBwYXRhX21hY2lvX2RvX3N1c3BlbmQoaG9zdC0+cHJpdmF0ZV9kYXRhLCBtZXNnKTsKK30KKworc3RhdGljIGludCBwYXRhX21hY2lvX3Jlc3VtZShzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2KQoreworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IG1hY2lvX2dldF9kcnZkYXRhKG1kZXYpOworCisJcmV0dXJuIHBhdGFfbWFjaW9fZG9fcmVzdW1lKGhvc3QtPnByaXZhdGVfZGF0YSk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworI2lmZGVmIENPTkZJR19QTUFDX01FRElBQkFZCitzdGF0aWMgdm9pZCBwYXRhX21hY2lvX21iX2V2ZW50KHN0cnVjdCBtYWNpb19kZXYqIG1kZXYsIGludCBtYl9zdGF0ZSkKK3sKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBtYWNpb19nZXRfZHJ2ZGF0YShtZGV2KTsKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwOworCXN0cnVjdCBhdGFfZWhfaW5mbyAqZWhpOworCXN0cnVjdCBhdGFfZGV2aWNlICpkZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghaG9zdCB8fCAhaG9zdC0+cHJpdmF0ZV9kYXRhKQorCQlyZXR1cm47CisJYXAgPSBob3N0LT5wb3J0c1swXTsKKwlzcGluX2xvY2tfaXJxc2F2ZShhcC0+bG9jaywgZmxhZ3MpOworCWVoaSA9ICZhcC0+bGluay5laF9pbmZvOworCWlmIChtYl9zdGF0ZSA9PSBNQl9DRCkgeworCQlhdGFfZWhpX3B1c2hfZGVzYyhlaGksICJtZWRpYWJheSBwbHVnIik7CisJCWF0YV9laGlfaG90cGx1Z2dlZChlaGkpOworCQlhdGFfcG9ydF9mcmVlemUoYXApOworCX0gZWxzZSB7CisJCWF0YV9laGlfcHVzaF9kZXNjKGVoaSwgIm1lZGlhYmF5IHVucGx1ZyIpOworCQlhdGFfZm9yX2VhY2hfZGV2KGRldiwgJmFwLT5saW5rLCBBTEwpCisJCQlkZXYtPmZsYWdzIHw9IEFUQV9ERkxBR19ERVRBQ0g7CisJCWF0YV9wb3J0X2Fib3J0KGFwKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShhcC0+bG9jaywgZmxhZ3MpOworCit9CisjZW5kaWYgLyogQ09ORklHX1BNQUNfTUVESUFCQVkgKi8KKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwYXRhX21hY2lvX3BjaV9hdHRhY2goc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgcGF0YV9tYWNpb19wcml2CSpwcml2OworCXN0cnVjdCBkZXZpY2Vfbm9kZQkqbnA7CisJcmVzb3VyY2Vfc2l6ZV90CQlyYmFzZTsKKworCS8qIFdlIGNhbm5vdCB1c2UgYSBNYWNJTyBjb250cm9sbGVyIHdpdGhvdXQgaXRzIE9GIGRldmljZSBub2RlICovCisJbnAgPSBwY2lfZGV2aWNlX3RvX09GX25vZGUocGRldik7CisJaWYgKG5wID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIkNhbm5vdCBmaW5kIE9GIGRldmljZSBub2RlIGZvciBjb250cm9sbGVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogQ2hlY2sgdGhhdCBpdCBjYW4gYmUgZW5hYmxlZCAqLworCWlmIChwY2ltX2VuYWJsZV9kZXZpY2UocGRldikpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIkNhbm5vdCBlbmFibGUgY29udHJvbGxlciBQQ0kgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwkvKiBBbGxvY2F0ZSBhbmQgaW5pdCBwcml2YXRlIGRhdGEgc3RydWN0dXJlICovCisJcHJpdiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAorCQkJICAgIHNpemVvZihzdHJ1Y3QgcGF0YV9tYWNpb19wcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByaXYgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiRmFpbGVkIHRvIGFsbG9jYXRlIHByaXZhdGUgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXByaXYtPm5vZGUgPSBvZl9ub2RlX2dldChucCk7CisJcHJpdi0+cGRldiA9IHBkZXY7CisJcHJpdi0+ZGV2ID0gJnBkZXYtPmRldjsKKworCS8qIEdldCBNTUlPIHJlZ2lvbnMgKi8KKwlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCAicGF0YS1tYWNpbyIpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJDYW5ub3Qgb2J0YWluIFBDSSByZXNvdXJjZXNcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8qIEdldCByZWdpc3RlciBhZGRyZXNzZXMgYW5kIGNhbGwgY29tbW9uIGluaXRpYWxpemF0aW9uICovCisJcmJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJaWYgKHBhdGFfbWFjaW9fY29tbW9uX2luaXQocHJpdiwKKwkJCQkgICByYmFzZSArIDB4MjAwMCwJLyogVGFza2ZpbGUgcmVncyAqLworCQkJCSAgIHJiYXNlICsgMHgxMDAwLAkvKiBEQkRNQSByZWdzICovCisJCQkJICAgcmJhc2UsCQkvKiBGZWF0dXJlIGNvbnRyb2wgKi8KKwkJCQkgICBwZGV2LT5pcnEpKQorCQlyZXR1cm4gLUVOWElPOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBwYXRhX21hY2lvX3BjaV9kZXRhY2goc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCisJYXRhX2hvc3RfZGV0YWNoKGhvc3QpOworfQorCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgcGF0YV9tYWNpb19wY2lfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCisJcmV0dXJuIHBhdGFfbWFjaW9fZG9fc3VzcGVuZChob3N0LT5wcml2YXRlX2RhdGEsIG1lc2cpOworfQorCitzdGF0aWMgaW50IHBhdGFfbWFjaW9fcGNpX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisKKwlyZXR1cm4gcGF0YV9tYWNpb19kb19yZXN1bWUoaG9zdC0+cHJpdmF0ZV9kYXRhKTsKK30KKworI2VuZGlmIC8qIENPTkZJR19QTSAqLworCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBwYXRhX21hY2lvX21hdGNoW10gPQoreworCXsKKwkubmFtZSAJCT0gIklERSIsCisJfSwKKwl7CisJLm5hbWUgCQk9ICJBVEEiLAorCX0sCisJeworCS50eXBlCQk9ICJpZGUiLAorCX0sCisJeworCS50eXBlCQk9ICJhdGEiLAorCX0sCisJe30sCit9OworCitzdGF0aWMgc3RydWN0IG1hY2lvX2RyaXZlciBwYXRhX21hY2lvX2RyaXZlciA9Cit7CisJLm5hbWUgCQk9ICJwYXRhLW1hY2lvIiwKKwkubWF0Y2hfdGFibGUJPSBwYXRhX21hY2lvX21hdGNoLAorCS5wcm9iZQkJPSBwYXRhX21hY2lvX2F0dGFjaCwKKwkucmVtb3ZlCQk9IHBhdGFfbWFjaW9fZGV0YWNoLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gcGF0YV9tYWNpb19zdXNwZW5kLAorCS5yZXN1bWUJCT0gcGF0YV9tYWNpb19yZXN1bWUsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUE1BQ19NRURJQUJBWQorCS5tZWRpYWJheV9ldmVudAk9IHBhdGFfbWFjaW9fbWJfZXZlbnQsCisjZW5kaWYKKwkuZHJpdmVyID0geworCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwYXRhX21hY2lvX3BjaV9tYXRjaFtdID0geworCXsgUENJX1ZERVZJQ0UoQVBQTEUsIFBDSV9ERVZJQ0VfSURfQVBQTEVfVU5JX05fQVRBKSwJMCB9LAorCXsgUENJX1ZERVZJQ0UoQVBQTEUsIFBDSV9ERVZJQ0VfSURfQVBQTEVfSVBJRF9BVEExMDApLAkwIH0sCisJeyBQQ0lfVkRFVklDRShBUFBMRSwgUENJX0RFVklDRV9JRF9BUFBMRV9LMl9BVEExMDApLAkwIH0sCisJeyBQQ0lfVkRFVklDRShBUFBMRSwgUENJX0RFVklDRV9JRF9BUFBMRV9TSF9BVEEpLAkwIH0sCisJeyBQQ0lfVkRFVklDRShBUFBMRSwgUENJX0RFVklDRV9JRF9BUFBMRV9JUElEMl9BVEEpLAkwIH0sCisJe30sCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcGF0YV9tYWNpb19wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJwYXRhLXBjaS1tYWNpbyIsCisJLmlkX3RhYmxlCT0gcGF0YV9tYWNpb19wY2lfbWF0Y2gsCisJLnByb2JlCQk9IHBhdGFfbWFjaW9fcGNpX2F0dGFjaCwKKwkucmVtb3ZlCQk9IHBhdGFfbWFjaW9fcGNpX2RldGFjaCwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IHBhdGFfbWFjaW9fcGNpX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBwYXRhX21hY2lvX3BjaV9yZXN1bWUsCisjZW5kaWYKKwkuZHJpdmVyID0geworCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcGF0YV9tYWNpb19wY2lfbWF0Y2gpOworCisKK3N0YXRpYyBpbnQgX19pbml0IHBhdGFfbWFjaW9faW5pdCh2b2lkKQoreworCWludCByYzsKKworCWlmICghbWFjaGluZV9pcyhwb3dlcm1hYykpCisJCXJldHVybiAtRU5PREVWOworCisJcmMgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZwYXRhX21hY2lvX3BjaV9kcml2ZXIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCXJjID0gbWFjaW9fcmVnaXN0ZXJfZHJpdmVyKCZwYXRhX21hY2lvX2RyaXZlcik7CisJaWYgKHJjKSB7CisJCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcGF0YV9tYWNpb19wY2lfZHJpdmVyKTsKKwkJcmV0dXJuIHJjOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBhdGFfbWFjaW9fZXhpdCh2b2lkKQoreworCW1hY2lvX3VucmVnaXN0ZXJfZHJpdmVyKCZwYXRhX21hY2lvX2RyaXZlcik7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZwYXRhX21hY2lvX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChwYXRhX21hY2lvX2luaXQpOworbW9kdWxlX2V4aXQocGF0YV9tYWNpb19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQmVuamFtaW4gSGVycmVuc2NobWlkdCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBcHBsZSBNYWNJTyBQQVRBIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vaGUuYyBiL2RyaXZlcnMvYXRtL2hlLmMKaW5kZXggZTkwNjY1OC4uZThjNjUyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vaGUuYworKysgYi9kcml2ZXJzL2F0bS9oZS5jCkBAIC0yNTA1LDcgKzI1MDUsNyBAQAogCQkgKiBUQlJRLCB0aGUgaG9zdCBpc3N1ZXMgdGhlIGNsb3NlIGNvbW1hbmQgdG8gdGhlIGFkYXB0ZXIuCiAJCSAqLwogCi0JCXdoaWxlICgoKHR4X2ludXNlID0gYXRvbWljX3JlYWQoJnNrX2F0bSh2Y2MpLT5za193bWVtX2FsbG9jKSkgPiAwKSAmJgorCQl3aGlsZSAoKCh0eF9pbnVzZSA9IGF0b21pY19yZWFkKCZza19hdG0odmNjKS0+c2tfd21lbV9hbGxvYykpID4gMSkgJiYKIAkJICAgICAgIChyZXRyeSA8IE1BWF9SRVRSWSkpIHsKIAkJCW1zbGVlcChzbGVlcCk7CiAJCQlpZiAoc2xlZXAgPCAyNTApCkBAIC0yNTE0LDcgKzI1MTQsNyBAQAogCQkJKytyZXRyeTsKIAkJfQogCi0JCWlmICh0eF9pbnVzZSkKKwkJaWYgKHR4X2ludXNlID4gMSkKIAkJCWhwcmludGsoImNsb3NlIHR4IGNpZCAweCV4IHR4X2ludXNlID0gJWRcbiIsIGNpZCwgdHhfaW51c2UpOwogCiAJCS8qIDIuMy4xLjEgZ2VuZXJpYyBjbG9zZSBvcGVyYXRpb25zIHdpdGggZmx1c2ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9jb3JlLmMgYi9kcml2ZXJzL2Jhc2UvY29yZS5jCmluZGV4IDZiZWU2YWYuLmYxMjkwY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9jb3JlLmMKKysrIGIvZHJpdmVycy9iYXNlL2NvcmUuYwpAQCAtNTYsNyArNTYsMTQgQEAKICAqLwogY29uc3QgY2hhciAqZGV2X2RyaXZlcl9zdHJpbmcoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2KQogewotCXJldHVybiBkZXYtPmRyaXZlciA/IGRldi0+ZHJpdmVyLT5uYW1lIDoKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2OworCisJLyogZGV2LT5kcml2ZXIgY2FuIGNoYW5nZSB0byBOVUxMIHVuZGVybmVhdGggdXMgYmVjYXVzZSBvZiB1bmJpbmRpbmcsCisJICogc28gYmUgY2FyZWZ1bCBhYm91dCBhY2Nlc3NpbmcgaXQuICBkZXYtPmJ1cyBhbmQgZGV2LT5jbGFzcyBzaG91bGQKKwkgKiBuZXZlciBjaGFuZ2Ugb25jZSB0aGV5IGFyZSBzZXQsIHNvIHRoZXkgZG9uJ3QgbmVlZCBzcGVjaWFsIGNhcmUuCisJICovCisJZHJ2ID0gQUNDRVNTX09OQ0UoZGV2LT5kcml2ZXIpOworCXJldHVybiBkcnYgPyBkcnYtPm5hbWUgOgogCQkJKGRldi0+YnVzID8gZGV2LT5idXMtPm5hbWUgOgogCQkJKGRldi0+Y2xhc3MgPyBkZXYtPmNsYXNzLT5uYW1lIDogIiIpKTsKIH0KQEAgLTk4Nyw2ICs5OTQsOCBAQAogCWRldmljZV9yZW1vdmVfY2xhc3Nfc3ltbGlua3MoZGV2KTsKICBTeW1saW5rRXJyb3I6CiAJaWYgKE1BSk9SKGRldi0+ZGV2dCkpCisJCWRldnRtcGZzX2RlbGV0ZV9ub2RlKGRldik7CisJaWYgKE1BSk9SKGRldi0+ZGV2dCkpCiAJCWRldmljZV9yZW1vdmVfc3lzX2Rldl9lbnRyeShkZXYpOwogIGRldnRhdHRyRXJyb3I6CiAJaWYgKE1BSk9SKGRldi0+ZGV2dCkpCkBAIC0xNzI4LDggKzE3MzcsNSBAQAogCQkJZGV2LT5kcml2ZXItPnNodXRkb3duKGRldik7CiAJCX0KIAl9Ci0Ja29iamVjdF9wdXQoc3lzZnNfZGV2X2NoYXJfa29iaik7Ci0Ja29iamVjdF9wdXQoc3lzZnNfZGV2X2Jsb2NrX2tvYmopOwotCWtvYmplY3RfcHV0KGRldl9rb2JqKTsKIAlhc3luY19zeW5jaHJvbml6ZV9mdWxsKCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvY3B1LmMgYi9kcml2ZXJzL2Jhc2UvY3B1LmMKaW5kZXggZTYyYTRjYy4uOTU4YmQxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2NwdS5jCisrKyBiL2RyaXZlcnMvYmFzZS9jcHUuYwpAQCAtMzUsNiArMzUsNyBAQAogCXN0cnVjdCBjcHUgKmNwdSA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjcHUsIHN5c2Rldik7CiAJc3NpemVfdCByZXQ7CiAKKwljcHVfaG90cGx1Z19kcml2ZXJfbG9jaygpOwogCXN3aXRjaCAoYnVmWzBdKSB7CiAJY2FzZSAnMCc6CiAJCXJldCA9IGNwdV9kb3duKGNwdS0+c3lzZGV2LmlkKTsKQEAgLTQ5LDYgKzUwLDcgQEAKIAlkZWZhdWx0OgogCQlyZXQgPSAtRUlOVkFMOwogCX0KKwljcHVfaG90cGx1Z19kcml2ZXJfdW5sb2NrKCk7CiAKIAlpZiAocmV0ID49IDApCiAJCXJldCA9IGNvdW50OwpAQCAtNzIsNiArNzQsMzggQEAKIAlwZXJfY3B1KGNwdV9zeXNfZGV2aWNlcywgbG9naWNhbF9jcHUpID0gTlVMTDsKIAlyZXR1cm47CiB9CisKKyNpZmRlZiBDT05GSUdfQVJDSF9DUFVfUFJPQkVfUkVMRUFTRQorc3RhdGljIHNzaXplX3QgY3B1X3Byb2JlX3N0b3JlKHN0cnVjdCBjbGFzcyAqY2xhc3MsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCSAgICAgICBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIGFyY2hfY3B1X3Byb2JlKGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgc3NpemVfdCBjcHVfcmVsZWFzZV9zdG9yZShzdHJ1Y3QgY2xhc3MgKmNsYXNzLCBjb25zdCBjaGFyICpidWYsCisJCQkJIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gYXJjaF9jcHVfcmVsZWFzZShidWYsIGNvdW50KTsKK30KKworc3RhdGljIENMQVNTX0FUVFIocHJvYmUsIFNfSVdVU1IsIE5VTEwsIGNwdV9wcm9iZV9zdG9yZSk7CitzdGF0aWMgQ0xBU1NfQVRUUihyZWxlYXNlLCBTX0lXVVNSLCBOVUxMLCBjcHVfcmVsZWFzZV9zdG9yZSk7CisKK2ludCBfX2luaXQgY3B1X3Byb2JlX3JlbGVhc2VfaW5pdCh2b2lkKQoreworCWludCByYzsKKworCXJjID0gc3lzZnNfY3JlYXRlX2ZpbGUoJmNwdV9zeXNkZXZfY2xhc3Mua3NldC5rb2JqLAorCQkJICAgICAgICZjbGFzc19hdHRyX3Byb2JlLmF0dHIpOworCWlmICghcmMpCisJCXJjID0gc3lzZnNfY3JlYXRlX2ZpbGUoJmNwdV9zeXNkZXZfY2xhc3Mua3NldC5rb2JqLAorCQkJCSAgICAgICAmY2xhc3NfYXR0cl9yZWxlYXNlLmF0dHIpOworCisJcmV0dXJuIHJjOworfQorZGV2aWNlX2luaXRjYWxsKGNwdV9wcm9iZV9yZWxlYXNlX2luaXQpOworI2VuZGlmIC8qIENPTkZJR19BUkNIX0NQVV9QUk9CRV9SRUxFQVNFICovCisKICNlbHNlIC8qIC4uLiAhQ09ORklHX0hPVFBMVUdfQ1BVICovCiBzdGF0aWMgaW5saW5lIHZvaWQgcmVnaXN0ZXJfY3B1X2NvbnRyb2woc3RydWN0IGNwdSAqY3B1KQogewpAQCAtOTcsNyArMTMxLDcgQEAKIAkgKiBib290IHVwIGFuZCB0aGlzIGRhdGEgZG9lcyBub3QgY2hhbmdlIHRoZXJlIGFmdGVyLiBIZW5jZSB0aGlzCiAJICogb3BlcmF0aW9uIHNob3VsZCBiZSBzYWZlLiBObyBsb2NraW5nIHJlcXVpcmVkLgogCSAqLwotCWFkZHIgPSBfX3BhKHBlcl9jcHVfcHRyKGNyYXNoX25vdGVzLCBjcHVudW0pKTsKKwlhZGRyID0gcGVyX2NwdV9wdHJfdG9fcGh5cyhwZXJfY3B1X3B0cihjcmFzaF9ub3RlcywgY3B1bnVtKSk7CiAJcmMgPSBzcHJpbnRmKGJ1ZiwgIiVMeFxuIiwgYWRkcik7CiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2RldnRtcGZzLmMgYi9kcml2ZXJzL2Jhc2UvZGV2dG1wZnMuYwppbmRleCBhMWNiNWFmLi41MDM3NWJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZGV2dG1wZnMuYworKysgYi9kcml2ZXJzL2Jhc2UvZGV2dG1wZnMuYwpAQCAtMzIsNiArMzIsOCBAQAogc3RhdGljIGludCBkZXZfbW91bnQ7CiAjZW5kaWYKIAorc3RhdGljIHJ3bG9ja190IGRpcmxvY2s7CisKIHN0YXRpYyBpbnQgX19pbml0IG1vdW50X3BhcmFtKGNoYXIgKnN0cikKIHsKIAlkZXZfbW91bnQgPSBzaW1wbGVfc3RydG91bChzdHIsIE5VTEwsIDApOwpAQCAtNzQsNDcgKzc2LDM1IEBACiAJZGVudHJ5ID0gbG9va3VwX2NyZWF0ZSgmbmQsIDEpOwogCWlmICghSVNfRVJSKGRlbnRyeSkpIHsKIAkJZXJyID0gdmZzX21rZGlyKG5kLnBhdGguZGVudHJ5LT5kX2lub2RlLCBkZW50cnksIG1vZGUpOworCQlpZiAoIWVycikKKwkJCS8qIG1hcmsgYXMga2VybmVsLWNyZWF0ZWQgaW5vZGUgKi8KKwkJCWRlbnRyeS0+ZF9pbm9kZS0+aV9wcml2YXRlID0gJmRldl9tbnQ7CiAJCWRwdXQoZGVudHJ5KTsKIAl9IGVsc2UgewogCQllcnIgPSBQVFJfRVJSKGRlbnRyeSk7CiAJfQotCW11dGV4X3VubG9jaygmbmQucGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogCisJbXV0ZXhfdW5sb2NrKCZuZC5wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJcGF0aF9wdXQoJm5kLnBhdGgpOwogCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgY3JlYXRlX3BhdGgoY29uc3QgY2hhciAqbm9kZXBhdGgpCiB7Ci0JY2hhciAqcGF0aDsKLQlzdHJ1Y3QgbmFtZWlkYXRhIG5kOwotCWludCBlcnIgPSAwOworCWludCBlcnI7CiAKLQlwYXRoID0ga3N0cmR1cChub2RlcGF0aCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwYXRoKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWVyciA9IHZmc19wYXRoX2xvb2t1cChkZXZfbW50LT5tbnRfcm9vdCwgZGV2X21udCwKLQkJCSAgICAgIHBhdGgsIExPT0tVUF9QQVJFTlQsICZuZCk7Ci0JaWYgKGVyciA9PSAwKSB7Ci0JCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKLQotCQkvKiBjcmVhdGUgZGlyZWN0b3J5IHJpZ2h0IGF3YXkgKi8KLQkJZGVudHJ5ID0gbG9va3VwX2NyZWF0ZSgmbmQsIDEpOwotCQlpZiAoIUlTX0VSUihkZW50cnkpKSB7Ci0JCQllcnIgPSB2ZnNfbWtkaXIobmQucGF0aC5kZW50cnktPmRfaW5vZGUsCi0JCQkJCWRlbnRyeSwgMDc1NSk7Ci0JCQlkcHV0KGRlbnRyeSk7Ci0JCX0KLQkJbXV0ZXhfdW5sb2NrKCZuZC5wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7Ci0KLQkJcGF0aF9wdXQoJm5kLnBhdGgpOwotCX0gZWxzZSBpZiAoZXJyID09IC1FTk9FTlQpIHsKKwlyZWFkX2xvY2soJmRpcmxvY2spOworCWVyciA9IGRldl9ta2Rpcihub2RlcGF0aCwgMDc1NSk7CisJaWYgKGVyciA9PSAtRU5PRU5UKSB7CisJCWNoYXIgKnBhdGg7CiAJCWNoYXIgKnM7CiAKIAkJLyogcGFyZW50IGRpcmVjdG9yaWVzIGRvIG5vdCBleGlzdCwgY3JlYXRlIHRoZW0gKi8KKwkJcGF0aCA9IGtzdHJkdXAobm9kZXBhdGgsIEdGUF9LRVJORUwpOworCQlpZiAoIXBhdGgpCisJCQlyZXR1cm4gLUVOT01FTTsKIAkJcyA9IHBhdGg7Ci0JCXdoaWxlICgxKSB7CisJCWZvciAoOzspIHsKIAkJCXMgPSBzdHJjaHIocywgJy8nKTsKIAkJCWlmICghcykKIAkJCQlicmVhazsKQEAgLTEyNSw5ICsxMTUsOSBAQAogCQkJc1swXSA9ICcvJzsKIAkJCXMrKzsKIAkJfQorCQlrZnJlZShwYXRoKTsKIAl9Ci0KLQlrZnJlZShwYXRoKTsKKwlyZWFkX3VubG9jaygmZGlybG9jayk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTU2LDM0ICsxNDYsNDAgQEAKIAkJbW9kZSB8PSBTX0lGQ0hSOwogCiAJY3Vycl9jcmVkID0gb3ZlcnJpZGVfY3JlZHMoJmluaXRfY3JlZCk7CisKIAllcnIgPSB2ZnNfcGF0aF9sb29rdXAoZGV2X21udC0+bW50X3Jvb3QsIGRldl9tbnQsCiAJCQkgICAgICBub2RlbmFtZSwgTE9PS1VQX1BBUkVOVCwgJm5kKTsKIAlpZiAoZXJyID09IC1FTk9FTlQpIHsKLQkJLyogY3JlYXRlIG1pc3NpbmcgcGFyZW50IGRpcmVjdG9yaWVzICovCiAJCWNyZWF0ZV9wYXRoKG5vZGVuYW1lKTsKIAkJZXJyID0gdmZzX3BhdGhfbG9va3VwKGRldl9tbnQtPm1udF9yb290LCBkZXZfbW50LAogCQkJCSAgICAgIG5vZGVuYW1lLCBMT09LVVBfUEFSRU5ULCAmbmQpOwotCQlpZiAoZXJyKQotCQkJZ290byBvdXQ7CiAJfQorCWlmIChlcnIpCisJCWdvdG8gb3V0OwogCiAJZGVudHJ5ID0gbG9va3VwX2NyZWF0ZSgmbmQsIDApOwogCWlmICghSVNfRVJSKGRlbnRyeSkpIHsKLQkJaW50IHVtYXNrOwotCi0JCXVtYXNrID0gc3lzX3VtYXNrKDAwMDApOwogCQllcnIgPSB2ZnNfbWtub2QobmQucGF0aC5kZW50cnktPmRfaW5vZGUsCiAJCQkJZGVudHJ5LCBtb2RlLCBkZXYtPmRldnQpOwotCQlzeXNfdW1hc2sodW1hc2spOwotCQkvKiBtYXJrIGFzIGtlcm5lbCBjcmVhdGVkIGlub2RlICovCi0JCWlmICghZXJyKQorCQlpZiAoIWVycikgeworCQkJc3RydWN0IGlhdHRyIG5ld2F0dHJzOworCisJCQkvKiBmaXh1cCBwb3NzaWJseSB1bWFza2VkIG1vZGUgKi8KKwkJCW5ld2F0dHJzLmlhX21vZGUgPSBtb2RlOworCQkJbmV3YXR0cnMuaWFfdmFsaWQgPSBBVFRSX01PREU7CisJCQltdXRleF9sb2NrKCZkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCQkJbm90aWZ5X2NoYW5nZShkZW50cnksICZuZXdhdHRycyk7CisJCQltdXRleF91bmxvY2soJmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CisKKwkJCS8qIG1hcmsgYXMga2VybmVsLWNyZWF0ZWQgaW5vZGUgKi8KIAkJCWRlbnRyeS0+ZF9pbm9kZS0+aV9wcml2YXRlID0gJmRldl9tbnQ7CisJCX0KIAkJZHB1dChkZW50cnkpOwogCX0gZWxzZSB7CiAJCWVyciA9IFBUUl9FUlIoZGVudHJ5KTsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZuZC5wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAKKwltdXRleF91bmxvY2soJm5kLnBhdGguZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAlwYXRoX3B1dCgmbmQucGF0aCk7CiBvdXQ6CiAJa2ZyZWUodG1wKTsKQEAgLTIwNSwxNiArMjAxLDIxIEBACiAJbXV0ZXhfbG9ja19uZXN0ZWQoJm5kLnBhdGguZGVudHJ5LT5kX2lub2RlLT5pX211dGV4LCBJX01VVEVYX1BBUkVOVCk7CiAJZGVudHJ5ID0gbG9va3VwX29uZV9sZW4obmQubGFzdC5uYW1lLCBuZC5wYXRoLmRlbnRyeSwgbmQubGFzdC5sZW4pOwogCWlmICghSVNfRVJSKGRlbnRyeSkpIHsKLQkJaWYgKGRlbnRyeS0+ZF9pbm9kZSkKLQkJCWVyciA9IHZmc19ybWRpcihuZC5wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZGVudHJ5KTsKLQkJZWxzZQorCQlpZiAoZGVudHJ5LT5kX2lub2RlKSB7CisJCQlpZiAoZGVudHJ5LT5kX2lub2RlLT5pX3ByaXZhdGUgPT0gJmRldl9tbnQpCisJCQkJZXJyID0gdmZzX3JtZGlyKG5kLnBhdGguZGVudHJ5LT5kX2lub2RlLAorCQkJCQkJZGVudHJ5KTsKKwkJCWVsc2UKKwkJCQllcnIgPSAtRVBFUk07CisJCX0gZWxzZSB7CiAJCQllcnIgPSAtRU5PRU5UOworCQl9CiAJCWRwdXQoZGVudHJ5KTsKIAl9IGVsc2UgewogCQllcnIgPSBQVFJfRVJSKGRlbnRyeSk7CiAJfQotCW11dGV4X3VubG9jaygmbmQucGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogCisJbXV0ZXhfdW5sb2NrKCZuZC5wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJcGF0aF9wdXQoJm5kLnBhdGgpOwogCXJldHVybiBlcnI7CiB9CkBAIC0yMjgsNyArMjI5LDggQEAKIAlpZiAoIXBhdGgpCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jd2hpbGUgKDEpIHsKKwl3cml0ZV9sb2NrKCZkaXJsb2NrKTsKKwlmb3IgKDs7KSB7CiAJCWNoYXIgKmJhc2U7CiAKIAkJYmFzZSA9IHN0cnJjaHIocGF0aCwgJy8nKTsKQEAgLTIzOSw2ICsyNDEsNyBAQAogCQlpZiAoZXJyKQogCQkJYnJlYWs7CiAJfQorCXdyaXRlX3VubG9jaygmZGlybG9jayk7CiAKIAlrZnJlZShwYXRoKTsKIAlyZXR1cm4gZXJyOwpAQCAtMzIyLDkgKzMyNSw4IEBACiAgKiBJZiBjb25maWd1cmVkLCBvciByZXF1ZXN0ZWQgYnkgdGhlIGNvbW1hbmRsaW5lLCBkZXZ0bXBmcyB3aWxsIGJlCiAgKiBhdXRvLW1vdW50ZWQgYWZ0ZXIgdGhlIGtlcm5lbCBtb3VudGVkIHRoZSByb290IGZpbGVzeXN0ZW0uCiAgKi8KLWludCBkZXZ0bXBmc19tb3VudChjb25zdCBjaGFyICptb3VudHBvaW50KQoraW50IGRldnRtcGZzX21vdW50KGNvbnN0IGNoYXIgKm1udGRpcikKIHsKLQlzdHJ1Y3QgcGF0aCBwYXRoOwogCWludCBlcnI7CiAKIAlpZiAoIWRldl9tb3VudCkKQEAgLTMzMywxNSArMzM1LDExIEBACiAJaWYgKCFkZXZfbW50KQogCQlyZXR1cm4gMDsKIAotCWVyciA9IGtlcm5fcGF0aChtb3VudHBvaW50LCBMT09LVVBfRk9MTE9XLCAmcGF0aCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQllcnIgPSBkb19hZGRfbW91bnQoZGV2X21udCwgJnBhdGgsIDAsIE5VTEwpOworCWVyciA9IHN5c19tb3VudCgiZGV2dG1wZnMiLCAoY2hhciAqKW1udGRpciwgImRldnRtcGZzIiwgTVNfU0lMRU5ULCBOVUxMKTsKIAlpZiAoZXJyKQogCQlwcmludGsoS0VSTl9JTkZPICJkZXZ0bXBmczogZXJyb3IgbW91bnRpbmcgJWlcbiIsIGVycik7CiAJZWxzZQogCQlwcmludGsoS0VSTl9JTkZPICJkZXZ0bXBmczogbW91bnRlZFxuIik7Ci0JcGF0aF9wdXQoJnBhdGgpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTM1NCw2ICszNTIsOCBAQAogCWludCBlcnI7CiAJc3RydWN0IHZmc21vdW50ICptbnQ7CiAKKwlyd2xvY2tfaW5pdCgmZGlybG9jayk7CisKIAllcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZkZXZfZnNfdHlwZSk7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgImRldnRtcGZzOiB1bmFibGUgdG8gcmVnaXN0ZXIgZGV2dG1wZnMgIgpAQCAtMzYxLDcgKzM2MSw3IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0JbW50ID0ga2Vybl9tb3VudCgmZGV2X2ZzX3R5cGUpOworCW1udCA9IGtlcm5fbW91bnRfZGF0YSgmZGV2X2ZzX3R5cGUsICJtb2RlPTA3NTUiKTsKIAlpZiAoSVNfRVJSKG1udCkpIHsKIAkJZXJyID0gUFRSX0VSUihtbnQpOwogCQlwcmludGsoS0VSTl9FUlIgImRldnRtcGZzOiB1bmFibGUgdG8gY3JlYXRlIGRldnRtcGZzICVpXG4iLCBlcnIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMgYi9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYwppbmRleCA3Mzc2MzY3Li5hOTUwMjQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYworKysgYi9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYwpAQCAtNjAxLDEyICs2MDEsOSBAQAogCX0KIAlyZXQgPSBfcmVxdWVzdF9maXJtd2FyZSgmZncsIGZ3X3dvcmstPm5hbWUsIGZ3X3dvcmstPmRldmljZSwKIAkJZndfd29yay0+dWV2ZW50KTsKLQlpZiAocmV0IDwgMCkKLQkJZndfd29yay0+Y29udChOVUxMLCBmd193b3JrLT5jb250ZXh0KTsKLQllbHNlIHsKLQkJZndfd29yay0+Y29udChmdywgZndfd29yay0+Y29udGV4dCk7Ci0JCXJlbGVhc2VfZmlybXdhcmUoZncpOwotCX0KKworCWZ3X3dvcmstPmNvbnQoZncsIGZ3X3dvcmstPmNvbnRleHQpOworCiAJbW9kdWxlX3B1dChmd193b3JrLT5tb2R1bGUpOwogCWtmcmVlKGZ3X3dvcmspOwogCXJldHVybiByZXQ7CkBAIC02MTksNiArNjE2LDcgQEAKICAqCWlzIG5vbi16ZXJvIGVsc2UgdGhlIGZpcm13YXJlIGNvcHkgbXVzdCBiZSBkb25lIG1hbnVhbGx5LgogICogQG5hbWU6IG5hbWUgb2YgZmlybXdhcmUgZmlsZQogICogQGRldmljZTogZGV2aWNlIGZvciB3aGljaCBmaXJtd2FyZSBpcyBiZWluZyBsb2FkZWQKKyAqIEBnZnA6IGFsbG9jYXRpb24gZmxhZ3MKICAqIEBjb250ZXh0OiB3aWxsIGJlIHBhc3NlZCBvdmVyIHRvIEBjb250LCBhbmQKICAqCUBmdyBtYXkgYmUgJU5VTEwgaWYgZmlybXdhcmUgcmVxdWVzdCBmYWlscy4KICAqIEBjb250OiBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhc3luY2hyb25vdXNseSB3aGVuIHRoZSBmaXJtd2FyZQpAQCAtNjMxLDEyICs2MjksMTIgQEAKIGludAogcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQoCiAJc3RydWN0IG1vZHVsZSAqbW9kdWxlLCBpbnQgdWV2ZW50LAotCWNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZXZpY2UgKmRldmljZSwgdm9pZCAqY29udGV4dCwKKwljb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsIGdmcF90IGdmcCwgdm9pZCAqY29udGV4dCwKIAl2b2lkICgqY29udCkoY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywgdm9pZCAqY29udGV4dCkpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwogCXN0cnVjdCBmaXJtd2FyZV93b3JrICpmd193b3JrID0ga21hbGxvYyhzaXplb2YgKHN0cnVjdCBmaXJtd2FyZV93b3JrKSwKLQkJCQkJCUdGUF9BVE9NSUMpOworCQkJCQkJZ2ZwKTsKIAogCWlmICghZndfd29yaykKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYyBiL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCmluZGV4IDRmYTk1NGIuLjlkMmVlMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCkBAIC0xMDAwLDcgKzEwMDAsNyBAQAogaW50IF9faW5pdCBlYXJseV9wbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IGVhcmx5X3BsYXRmb3JtX2RyaXZlciAqZXBkcnYsCiAJCQkJCSAgY2hhciAqYnVmKQogewotCXVuc2lnbmVkIGxvbmcgaW5kZXg7CisJY2hhciAqdG1wOwogCWludCBuOwogCiAJLyogU2ltcGx5IGFkZCB0aGUgZHJpdmVyIHRvIHRoZSBlbmQgb2YgdGhlIGdsb2JhbCBsaXN0LgpAQCAtMTAxOSwxMyArMTAxOSwyOCBAQAogCWlmIChidWYgJiYgIXN0cm5jbXAoYnVmLCBlcGRydi0+cGRydi0+ZHJpdmVyLm5hbWUsIG4pKSB7CiAJCWxpc3RfbW92ZSgmZXBkcnYtPmxpc3QsICZlYXJseV9wbGF0Zm9ybV9kcml2ZXJfbGlzdCk7CiAKLQkJaWYgKCFzdHJjbXAoYnVmLCBlcGRydi0+cGRydi0+ZHJpdmVyLm5hbWUpKQorCQkvKiBBbGxvdyBwYXNzaW5nIHBhcmFtZXRlcnMgYWZ0ZXIgZGV2aWNlIG5hbWUgKi8KKwkJaWYgKGJ1ZltuXSA9PSAnXDAnIHx8IGJ1ZltuXSA9PSAnLCcpCiAJCQllcGRydi0+cmVxdWVzdGVkX2lkID0gLTE7Ci0JCWVsc2UgaWYgKGJ1ZltuXSA9PSAnLicgJiYgc3RyaWN0X3N0cnRvdWwoJmJ1ZltuICsgMV0sIDEwLAotCQkJCQkJCSAmaW5kZXgpID09IDApCi0JCQllcGRydi0+cmVxdWVzdGVkX2lkID0gaW5kZXg7Ci0JCWVsc2UKLQkJCWVwZHJ2LT5yZXF1ZXN0ZWRfaWQgPSBFQVJMWV9QTEFURk9STV9JRF9FUlJPUjsKKwkJZWxzZSB7CisJCQllcGRydi0+cmVxdWVzdGVkX2lkID0gc2ltcGxlX3N0cnRvdWwoJmJ1ZltuICsgMV0sCisJCQkJCQkJICAgICAmdG1wLCAxMCk7CisKKwkJCWlmIChidWZbbl0gIT0gJy4nIHx8ICh0bXAgPT0gJmJ1ZltuICsgMV0pKSB7CisJCQkJZXBkcnYtPnJlcXVlc3RlZF9pZCA9IEVBUkxZX1BMQVRGT1JNX0lEX0VSUk9SOworCQkJCW4gPSAwOworCQkJfSBlbHNlCisJCQkJbiArPSBzdHJjc3BuKCZidWZbbiArIDFdLCAiLCIpICsgMTsKKwkJfQorCisJCWlmIChidWZbbl0gPT0gJywnKQorCQkJbisrOworCisJCWlmIChlcGRydi0+YnVmc2l6ZSkgeworCQkJbWVtY3B5KGVwZHJ2LT5idWZmZXIsICZidWZbbl0sCisJCQkgICAgICAgbWluX3QoaW50LCBlcGRydi0+YnVmc2l6ZSwgc3RybGVuKCZidWZbbl0pICsgMSkpOworCQkJZXBkcnYtPmJ1ZmZlcltlcGRydi0+YnVmc2l6ZSAtIDFdID0gJ1wwJzsKKwkJfQogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9zd2ltMy5jIGIvZHJpdmVycy9ibG9jay9zd2ltMy5jCmluZGV4IDYzODBhZDguLjU5Y2EyYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svc3dpbTMuYworKysgYi9kcml2ZXJzL2Jsb2NrL3N3aW0zLmMKQEAgLTIwMCw3ICsyMDAsNyBAQAogCWludAllamVjdGVkOwogCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CiAJaW50CXdhbnRlZDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUqCW1lZGlhX2JheTsgLyogTlVMTCB3aGVuIG5vdCBpbiBiYXkgKi8KKwlzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2OwogCWNoYXIJZGJkbWFfY21kX3NwYWNlWzUgKiBzaXplb2Yoc3RydWN0IGRiZG1hX2NtZCldOwogfTsKIApAQCAtMzAzLDE0ICszMDMsMTMgQEAKIHN0YXRpYyB2b2lkIGRvX2ZkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiBxKQogewogCWludCBpOwotCWZvcihpPTA7aTxmbG9wcHlfY291bnQ7aSsrKQotCXsKLSNpZmRlZiBDT05GSUdfUE1BQ19NRURJQUJBWQotCQlpZiAoZmxvcHB5X3N0YXRlc1tpXS5tZWRpYV9iYXkgJiYKLQkJCWNoZWNrX21lZGlhX2JheShmbG9wcHlfc3RhdGVzW2ldLm1lZGlhX2JheSwgTUJfRkQpKQorCisJZm9yKGk9MDsgaTxmbG9wcHlfY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgZmxvcHB5X3N0YXRlICpmcyA9ICZmbG9wcHlfc3RhdGVzW2ldOworCQlpZiAoZnMtPm1kZXYtPm1lZGlhX2JheSAmJgorCQkgICAgY2hlY2tfbWVkaWFfYmF5KGZzLT5tZGV2LT5tZWRpYV9iYXkpICE9IE1CX0ZEKQogCQkJY29udGludWU7Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfTUVESUFCQVkgKi8KLQkJc3RhcnRfcmVxdWVzdCgmZmxvcHB5X3N0YXRlc1tpXSk7CisJCXN0YXJ0X3JlcXVlc3QoZnMpOwogCX0KIH0KIApAQCAtODQ5LDEwICs4NDgsOSBAQAogCWlmICgoY21kICYgMHg4MCkgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAKLSNpZmRlZiBDT05GSUdfUE1BQ19NRURJQUJBWQotCWlmIChmcy0+bWVkaWFfYmF5ICYmIGNoZWNrX21lZGlhX2JheShmcy0+bWVkaWFfYmF5LCBNQl9GRCkpCisJaWYgKGZzLT5tZGV2LT5tZWRpYV9iYXkgJiYKKwkgICAgY2hlY2tfbWVkaWFfYmF5KGZzLT5tZGV2LT5tZWRpYV9iYXkpICE9IE1CX0ZEKQogCQlyZXR1cm4gLUVOWElPOwotI2VuZGlmCiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgRkRFSkVDVDoKQEAgLTg3NiwxMCArODc0LDkgQEAKIAlpbnQgbiwgZXJyID0gMDsKIAogCWlmIChmcy0+cmVmX2NvdW50ID09IDApIHsKLSNpZmRlZiBDT05GSUdfUE1BQ19NRURJQUJBWQotCQlpZiAoZnMtPm1lZGlhX2JheSAmJiBjaGVja19tZWRpYV9iYXkoZnMtPm1lZGlhX2JheSwgTUJfRkQpKQorCQlpZiAoZnMtPm1kZXYtPm1lZGlhX2JheSAmJgorCQkgICAgY2hlY2tfbWVkaWFfYmF5KGZzLT5tZGV2LT5tZWRpYV9iYXkpICE9IE1CX0ZEKQogCQkJcmV0dXJuIC1FTlhJTzsKLSNlbmRpZgogCQlvdXRfOCgmc3ctPnNldHVwLCBTX0lCTV9EUklWRSB8IFNfRkNMS19ESVYyKTsKIAkJb3V0XzgoJnN3LT5jb250cm9sX2JpYywgMHhmZik7CiAJCW91dF84KCZzdy0+bW9kZSwgMHg5NSk7CkBAIC05NjMsMTAgKzk2MCw5IEBACiAJc3RydWN0IHN3aW0zIF9faW9tZW0gKnN3OwogCWludCByZXQsIG47CiAKLSNpZmRlZiBDT05GSUdfUE1BQ19NRURJQUJBWQotCWlmIChmcy0+bWVkaWFfYmF5ICYmIGNoZWNrX21lZGlhX2JheShmcy0+bWVkaWFfYmF5LCBNQl9GRCkpCisJaWYgKGZzLT5tZGV2LT5tZWRpYV9iYXkgJiYKKwkgICAgY2hlY2tfbWVkaWFfYmF5KGZzLT5tZGV2LT5tZWRpYV9iYXkpICE9IE1CX0ZEKQogCQlyZXR1cm4gLUVOWElPOwotI2VuZGlmCiAKIAlzdyA9IGZzLT5zd2ltMzsKIAlncmFiX2RyaXZlKGZzLCByZXZhbGlkYXRpbmcsIDApOwpAQCAtMTAwOSw3ICsxMDA1LDYgQEAKIHN0YXRpYyBpbnQgc3dpbTNfYWRkX2RldmljZShzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCBpbnQgaW5kZXgpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpzd2ltID0gbWRldi0+b2ZkZXYubm9kZTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm1lZGlhYmF5OwogCXN0cnVjdCBmbG9wcHlfc3RhdGUgKmZzID0gJmZsb3BweV9zdGF0ZXNbaW5kZXhdOwogCWludCByYyA9IC1FQlVTWTsKIApAQCAtMTAzNiw5ICsxMDMxLDcgQEAKIAl9CiAJZGV2X3NldF9kcnZkYXRhKCZtZGV2LT5vZmRldi5kZXYsIGZzKTsKIAotCW1lZGlhYmF5ID0gKHN0cmNhc2VjbXAoc3dpbS0+cGFyZW50LT50eXBlLCAibWVkaWEtYmF5IikgPT0gMCkgPwotCQlzd2ltLT5wYXJlbnQgOiBOVUxMOwotCWlmIChtZWRpYWJheSA9PSBOVUxMKQorCWlmIChtZGV2LT5tZWRpYV9iYXkgPT0gTlVMTCkKIAkJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfU1dJTTNfRU5BQkxFLCBzd2ltLCAwLCAxKTsKIAkKIAltZW1zZXQoZnMsIDAsIHNpemVvZigqZnMpKTsKQEAgLTEwNjgsNyArMTA2MSw3IEBACiAJZnMtPnNlY3BlcmN5bCA9IDM2OwogCWZzLT5zZWNwZXJ0cmFjayA9IDE4OwogCWZzLT50b3RhbF9zZWNzID0gMjg4MDsKLQlmcy0+bWVkaWFfYmF5ID0gbWVkaWFiYXk7CisJZnMtPm1kZXYgPSBtZGV2OwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZzLT53YWl0KTsKIAogCWZzLT5kbWFfY21kID0gKHN0cnVjdCBkYmRtYV9jbWQgKikgREJETUFfQUxJR04oZnMtPmRiZG1hX2NtZF9zcGFjZSk7CkBAIC0xMDkzLDcgKzEwODYsNyBAQAogCWluaXRfdGltZXIoJmZzLT50aW1lb3V0KTsKIAogCXByaW50ayhLRVJOX0lORk8gImZkJWQ6IFNXSU0zIGZsb3BweSBjb250cm9sbGVyICVzXG4iLCBmbG9wcHlfY291bnQsCi0JCW1lZGlhYmF5ID8gImluIG1lZGlhIGJheSIgOiAiIik7CisJCW1kZXYtPm1lZGlhX2JheSA/ICJpbiBtZWRpYSBiYXkiIDogIiIpOwogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2Zyb250LmMgYi9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtmcm9udC5jCmluZGV4IGI4NTc4YmIuLjA1YTMxZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2Zyb250LmMKKysrIGIvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAKKyNpbmNsdWRlIDx4ZW4veGVuLmg+CiAjaW5jbHVkZSA8eGVuL3hlbmJ1cy5oPgogI2luY2x1ZGUgPHhlbi9ncmFudF90YWJsZS5oPgogI2luY2x1ZGUgPHhlbi9ldmVudHMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dXNiLmMgYi9kcml2ZXJzL2JsdWV0b290aC9idHVzYi5jCmluZGV4IDQ0YmM4YmIuLjRkMjkwNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dXNiLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYnR1c2IuYwpAQCAtMTA2Niw3ICsxMDY2LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlzcGluX2xvY2tfaXJxKCZkYXRhLT50eGxvY2spOwotCWlmICghKGludGVyZmFjZV90b191c2JkZXYoaW50ZiktPmF1dG9fcG0gJiYgZGF0YS0+dHhfaW5fZmxpZ2h0KSkgeworCWlmICghKChtZXNzYWdlLmV2ZW50ICYgUE1fRVZFTlRfQVVUTykgJiYgZGF0YS0+dHhfaW5fZmxpZ2h0KSkgewogCQlzZXRfYml0KEJUVVNCX1NVU1BFTkRJTkcsICZkYXRhLT5mbGFncyk7CiAJCXNwaW5fdW5sb2NrX2lycSgmZGF0YS0+dHhsb2NrKTsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvS2NvbmZpZwppbmRleCA2YWFkOTllLi42ZjMxYzk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvS2NvbmZpZworKysgYi9kcml2ZXJzL2NoYXIvS2NvbmZpZwpAQCAtMjAxLDE5ICsyMDEsNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZXBjYS4KIAotY29uZmlnIEVTUFNFUklBTAotCXRyaXN0YXRlICJIYXllcyBFU1Agc2VyaWFsIHBvcnQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRCAmJiBJU0EgJiYgSVNBX0RNQV9BUEkgJiYgQlJPS0VOCi0JaGVscAotCSAgVGhpcyBpcyBhIGRyaXZlciB3aGljaCBzdXBwb3J0cyBIYXllcyBFU1Agc2VyaWFsIHBvcnRzLiAgQm90aCBzaW5nbGUKLQkgIHBvcnQgY2FyZHMgYW5kIG11bHRpcG9ydCBjYXJkcyBhcmUgc3VwcG9ydGVkLiAgTWFrZSBzdXJlIHRvIHJlYWQKLQkgIDxmaWxlOkRvY3VtZW50YXRpb24vaGF5ZXMtZXNwLnR4dD4uCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGVzcC4KLQotCSAgSWYgdW5zdXJlLCBzYXkgTi4KLQogY29uZmlnIE1PWEFfSU5URUxMSU8KIAl0cmlzdGF0ZSAiTW94YSBJbnRlbGxpbyBzdXBwb3J0IgogCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJEICYmIChJU0EgfHwgRUlTQSB8fCBQQ0kpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvTWFrZWZpbGUKaW5kZXggMTlhNzlkZC4uZjk1N2VkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2hhci9NYWtlZmlsZQpAQCAtMTgsNyArMTgsNiBAQAogb2JqLSQoQ09ORklHX0hXX0NPTlNPTEUpCSs9IHZ0Lm8gZGVma2V5bWFwLm8KIG9iai0kKENPTkZJR19BVURJVCkJCSs9IHR0eV9hdWRpdC5vCiBvYmotJChDT05GSUdfTUFHSUNfU1lTUlEpCSs9IHN5c3JxLm8KLW9iai0kKENPTkZJR19FU1BTRVJJQUwpCQkrPSBlc3Aubwogb2JqLSQoQ09ORklHX01WTUUxNDdfU0NDKQkrPSBnZW5lcmljX3NlcmlhbC5vIHZtZV9zY2Mubwogb2JqLSQoQ09ORklHX01WTUUxNjJfU0NDKQkrPSBnZW5lcmljX3NlcmlhbC5vIHZtZV9zY2Mubwogb2JqLSQoQ09ORklHX0JWTUU2MDAwX1NDQykJKz0gZ2VuZXJpY19zZXJpYWwubyB2bWVfc2NjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvdW5pbm9ydGgtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL3VuaW5vcnRoLWFncC5jCmluZGV4IDcwMzk1OWUuLmQ4OWRhNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvdW5pbm9ydGgtYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC91bmlub3J0aC1hZ3AuYwpAQCAtMTQ0LDU5ICsxNDQsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB1bmlub3J0aF9pbnNlcnRfbWVtb3J5KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sIG9mZl90IHBnX3N0YXJ0LAotCQkJCWludCB0eXBlKQotewotCWludCBpLCBqLCBudW1fZW50cmllczsKLQl2b2lkICp0ZW1wOwotCWludCBtYXNrX3R5cGU7Ci0KLQl0ZW1wID0gYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplOwotCW51bV9lbnRyaWVzID0gQV9TSVpFXzMyKHRlbXApLT5udW1fZW50cmllczsKLQotCWlmICh0eXBlICE9IG1lbS0+dHlwZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltYXNrX3R5cGUgPSBhZ3BfYnJpZGdlLT5kcml2ZXItPmFncF90eXBlX3RvX21hc2tfdHlwZShhZ3BfYnJpZGdlLCB0eXBlKTsKLQlpZiAobWFza190eXBlICE9IDApIHsKLQkJLyogV2Uga25vdyBub3RoaW5nIG9mIG1lbW9yeSB0eXBlcyAqLwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50KSA+IG51bV9lbnRyaWVzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWogPSBwZ19zdGFydDsKLQotCXdoaWxlIChqIDwgKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50KSkgewotCQlpZiAoYWdwX2JyaWRnZS0+Z2F0dF90YWJsZVtqXSkKLQkJCXJldHVybiAtRUJVU1k7Ci0JCWorKzsKLQl9Ci0KLQlmb3IgKGkgPSAwLCBqID0gcGdfc3RhcnQ7IGkgPCBtZW0tPnBhZ2VfY291bnQ7IGkrKywgaisrKSB7Ci0JCWFncF9icmlkZ2UtPmdhdHRfdGFibGVbal0gPQotCQkJY3B1X3RvX2xlMzIoKHBhZ2VfdG9fcGh5cyhtZW0tPnBhZ2VzW2ldKSAmIDB4RkZGRkYwMDBVTCkgfCAweDFVTCk7Ci0JCWZsdXNoX2RjYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylfX3ZhKHBhZ2VfdG9fcGh5cyhtZW0tPnBhZ2VzW2ldKSksCi0JCQkJICAgKHVuc2lnbmVkIGxvbmcpX192YShwYWdlX3RvX3BoeXMobWVtLT5wYWdlc1tpXSkpKzB4MTAwMCk7Ci0JfQotCSh2b2lkKWluX2xlMzIoKHZvbGF0aWxlIHUzMiopJmFncF9icmlkZ2UtPmdhdHRfdGFibGVbcGdfc3RhcnRdKTsKLQltYigpOwotCi0JdW5pbm9ydGhfdGxiZmx1c2gobWVtKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB1M19pbnNlcnRfbWVtb3J5KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sIG9mZl90IHBnX3N0YXJ0LCBpbnQgdHlwZSkKK3N0YXRpYyBpbnQgdW5pbm9ydGhfaW5zZXJ0X21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLCBvZmZfdCBwZ19zdGFydCwgaW50IHR5cGUpCiB7CiAJaW50IGksIG51bV9lbnRyaWVzOwogCXZvaWQgKnRlbXA7CiAJdTMyICpncDsKIAlpbnQgbWFza190eXBlOwogCi0JdGVtcCA9IGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZTsKLQludW1fZW50cmllcyA9IEFfU0laRV8zMih0ZW1wKS0+bnVtX2VudHJpZXM7Ci0KIAlpZiAodHlwZSAhPSBtZW0tPnR5cGUpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0yMDYsNiArMTYwLDEyIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWlmIChtZW0tPnBhZ2VfY291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwl0ZW1wID0gYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplOworCW51bV9lbnRyaWVzID0gQV9TSVpFXzMyKHRlbXApLT5udW1fZW50cmllczsKKwogCWlmICgocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQpID4gbnVtX2VudHJpZXMpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0yMTMsMTQgKzE3MywxOCBAQAogCWZvciAoaSA9IDA7IGkgPCBtZW0tPnBhZ2VfY291bnQ7ICsraSkgewogCQlpZiAoZ3BbaV0pIHsKIAkJCWRldl9pbmZvKCZhZ3BfYnJpZGdlLT5kZXYtPmRldiwKLQkJCQkgInUzX2luc2VydF9tZW1vcnk6IGVudHJ5IDB4JXggb2NjdXBpZWQgKCV4KVxuIiwKKwkJCQkgInVuaW5vcnRoX2luc2VydF9tZW1vcnk6IGVudHJ5IDB4JXggb2NjdXBpZWQgKCV4KVxuIiwKIAkJCQkgaSwgZ3BbaV0pOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBtZW0tPnBhZ2VfY291bnQ7IGkrKykgewotCQlncFtpXSA9IChwYWdlX3RvX3BoeXMobWVtLT5wYWdlc1tpXSkgPj4gUEFHRV9TSElGVCkgfCAweDgwMDAwMDAwVUw7CisJCWlmIChpc191MykKKwkJCWdwW2ldID0gKHBhZ2VfdG9fcGh5cyhtZW0tPnBhZ2VzW2ldKSA+PiBQQUdFX1NISUZUKSB8IDB4ODAwMDAwMDBVTDsKKwkJZWxzZQorCQkJZ3BbaV0gPQljcHVfdG9fbGUzMigocGFnZV90b19waHlzKG1lbS0+cGFnZXNbaV0pICYgMHhGRkZGRjAwMFVMKSB8CisJCQkJCSAgICAweDFVTCk7CiAJCWZsdXNoX2RjYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylfX3ZhKHBhZ2VfdG9fcGh5cyhtZW0tPnBhZ2VzW2ldKSksCiAJCQkJICAgKHVuc2lnbmVkIGxvbmcpX192YShwYWdlX3RvX3BoeXMobWVtLT5wYWdlc1tpXSkpKzB4MTAwMCk7CiAJfQpAQCAtMjMwLDE0ICsxOTQsMjMgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHUzX3JlbW92ZV9tZW1vcnkoc3RydWN0IGFncF9tZW1vcnkgKm1lbSwgb2ZmX3QgcGdfc3RhcnQsIGludCB0eXBlKQoraW50IHVuaW5vcnRoX3JlbW92ZV9tZW1vcnkoc3RydWN0IGFncF9tZW1vcnkgKm1lbSwgb2ZmX3QgcGdfc3RhcnQsIGludCB0eXBlKQogewogCXNpemVfdCBpOwogCXUzMiAqZ3A7CisJaW50IG1hc2tfdHlwZTsKIAotCWlmICh0eXBlICE9IDAgfHwgbWVtLT50eXBlICE9IDApCisJaWYgKHR5cGUgIT0gbWVtLT50eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1hc2tfdHlwZSA9IGFncF9icmlkZ2UtPmRyaXZlci0+YWdwX3R5cGVfdG9fbWFza190eXBlKGFncF9icmlkZ2UsIHR5cGUpOworCWlmIChtYXNrX3R5cGUgIT0gMCkgewogCQkvKiBXZSBrbm93IG5vdGhpbmcgb2YgbWVtb3J5IHR5cGVzICovCiAJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChtZW0tPnBhZ2VfY291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CiAKIAlncCA9ICh1MzIgKikgJmFncF9icmlkZ2UtPmdhdHRfdGFibGVbcGdfc3RhcnRdOwogCWZvciAoaSA9IDA7IGkgPCBtZW0tPnBhZ2VfY291bnQ7ICsraSkKQEAgLTUzNiw3ICs1MDksNyBAQAogCS5jcmVhdGVfZ2F0dF90YWJsZQk9IHVuaW5vcnRoX2NyZWF0ZV9nYXR0X3RhYmxlLAogCS5mcmVlX2dhdHRfdGFibGUJPSB1bmlub3J0aF9mcmVlX2dhdHRfdGFibGUsCiAJLmluc2VydF9tZW1vcnkJCT0gdW5pbm9ydGhfaW5zZXJ0X21lbW9yeSwKLQkucmVtb3ZlX21lbW9yeQkJPSBhZ3BfZ2VuZXJpY19yZW1vdmVfbWVtb3J5LAorCS5yZW1vdmVfbWVtb3J5CQk9IHVuaW5vcnRoX3JlbW92ZV9tZW1vcnksCiAJLmFsbG9jX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSwKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKQEAgLTU2Miw4ICs1MzUsOCBAQAogCS5hZ3BfZW5hYmxlCQk9IHVuaW5vcnRoX2FncF9lbmFibGUsCiAJLmNyZWF0ZV9nYXR0X3RhYmxlCT0gdW5pbm9ydGhfY3JlYXRlX2dhdHRfdGFibGUsCiAJLmZyZWVfZ2F0dF90YWJsZQk9IHVuaW5vcnRoX2ZyZWVfZ2F0dF90YWJsZSwKLQkuaW5zZXJ0X21lbW9yeQkJPSB1M19pbnNlcnRfbWVtb3J5LAotCS5yZW1vdmVfbWVtb3J5CQk9IHUzX3JlbW92ZV9tZW1vcnksCisJLmluc2VydF9tZW1vcnkJCT0gdW5pbm9ydGhfaW5zZXJ0X21lbW9yeSwKKwkucmVtb3ZlX21lbW9yeQkJPSB1bmlub3J0aF9yZW1vdmVfbWVtb3J5LAogCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCiAJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYmZpbl9qdGFnX2NvbW0uYyBiL2RyaXZlcnMvY2hhci9iZmluX2p0YWdfY29tbS5jCmluZGV4IDFkN2MzNGMuLjI2MjhjNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9iZmluX2p0YWdfY29tbS5jCisrKyBiL2RyaXZlcnMvY2hhci9iZmluX2p0YWdfY29tbS5jCkBAIC0yMjYsNyArMjI2LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgYmZpbl9qY19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHR0eV9vcGVyYXRpb25zIGJmaW5famNfb3BzID0gewogCS5vcGVuICAgICAgICAgICAgPSBiZmluX2pjX29wZW4sCiAJLmNsb3NlICAgICAgICAgICA9IGJmaW5famNfY2xvc2UsCiAJLndyaXRlICAgICAgICAgICA9IGJmaW5famNfd3JpdGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZXBjYS5jIGIvZHJpdmVycy9jaGFyL2VwY2EuYwppbmRleCBkZGU1MTM0Li4xN2IwNDRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZXBjYS5jCisrKyBiL2RyaXZlcnMvY2hhci9lcGNhLmMKQEAgLTkzNSw3ICs5MzUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIGluZm9fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBpbmZvX29wcyA9IHsKIAkub3BlbiA9IGluZm9fb3BlbiwKIAkuaW9jdGwgPSBpbmZvX2lvY3RsLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9lc3AuYyBiL2RyaXZlcnMvY2hhci9lc3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE5ZDQzYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvZXNwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMzICswLDAgQEAKLS8qCi0gKiAgZXNwLmMgLSBkcml2ZXIgZm9yIEhheWVzIEVTUCBzZXJpYWwgY2FyZHMKLSAqCi0gKiAgLS0tIE5vdGljZXMgZnJvbSBzZXJpYWwuYywgdXBvbiB3aGljaCB0aGlzIGRyaXZlciBpcyBiYXNlZCAtLS0KLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcwotICoKLSAqICBFeHRlbnNpdmVseSByZXdyaXR0ZW4gYnkgVGhlb2RvcmUgVHMnbywgOC8xNi85MiAtLSA5LzE0LzkyLiAgTm93Ci0gKiAgbXVjaCBtb3JlIGV4dGVuc2libGUgdG8gc3VwcG9ydCBvdGhlciBzZXJpYWwgY2FyZHMgYmFzZWQgb24gdGhlCi0gKiAgMTY0NTAvMTY1NTBBIFVBUlQncy4gIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBBU1QgRm91clBvcnQgYW5kIHRoZQotICogIEFjY2VudCBBc3luYyBib2FyZC4KLSAqCi0gKiAgc2V0X3NlcmlhbF9pbmZvIGZpeGVkIHRvIHNldCB0aGUgZmxhZ3MsIGN1c3RvbSBkaXZpc29yLCBhbmQgdWFydAotICogCXR5cGUgZmllbGRzLiAgRml4IHN1Z2dlc3RlZCBieSBNaWNoYWVsIEsuIEpvaG5zb24gMTIvMTIvOTIuCi0gKgotICogIDExLzk1OiBUSU9DTUlXQUlULCBUSU9DR0lDT1VOVCBieSBBbmdlbG8gSGFyaXRzaXMgPGFoQGRvYy5pYy5hYy51az4KLSAqCi0gKiAgMDMvOTY6IE1vZHVsYXJpc2VkIGJ5IEFuZ2VsbyBIYXJpdHNpcyA8YWhAZG9jLmljLmFjLnVrPgotICoKLSAqICByc19zZXRfdGVybWlvcyBmaXhlZCB0byBsb29rIGFsc28gZm9yIGNoYW5nZXMgb2YgdGhlIGlucHV0Ci0gKiAgICAgIGZsYWdzIElOUENLLCBCUktJTlQsIFBBUk1SSywgSUdOUEFSIGFuZCBJR05CUksuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVybmQgQW5ow6R1cGwgMDUvMTcvOTYuCi0gKgotICogLS0tIEVuZCBvZiBub3RpY2VzIGZyb20gc2VyaWFsLmMgLS0tCi0gKgotICogU3VwcG9ydCBmb3IgdGhlIEVTUCBzZXJpYWwgY2FyZCBieSBBbmRyZXcgSi4gUm9iaW5zb24KLSAqICAgICA8YXJvYmluc29Abnl4Lm5ldD4gKENhcmQgZGV0ZWN0aW9uIHJvdXRpbmUgdGFrZW4gZnJvbSBhIHBhdGNoCi0gKiAgICAgYnkgRGVubmlzIEouIEJveWxhbikuICBQYXRjaGVzIHRvIGFsbG93IHVzZSB3aXRoIDIuMS54IGNvbnRyaWJ1dGVkCi0gKiAgICAgYnkgQ2hyaXMgRmF5bG9yLgotICoKLSAqIE1vc3QgcmVjZW50IGNoYW5nZXM6IChBbmRyZXcgSi4gUm9iaW5zb24pCi0gKiAgIFN1cHBvcnQgZm9yIFBJTyBtb2RlLiAgVGhpcyBhbGxvd3MgdGhlIGRyaXZlciB0byB3b3JrIHByb3Blcmx5IHdpdGgKLSAqICAgICBtdWx0aXBvcnQgY2FyZHMuCi0gKgotICogQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+IC0KLSAqIHNldmVyYWwgY2xlYW51cHMsIHVzZSBtb2R1bGVfaW5pdC9tb2R1bGVfZXhpdCwgZXRjCi0gKgotICogVGhpcyBtb2R1bGUgZXhwb3J0cyB0aGUgZm9sbG93aW5nIHJzMjMyIGlvIGZ1bmN0aW9uczoKLSAqCi0gKglpbnQgZXNwc2VyaWFsX2luaXQodm9pZCk7Ci0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC90dHkuaD4KLSNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbFAuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+Ci0jaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9mY250bC5oPgotI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLQotI2luY2x1ZGUgPGFzbS9kbWEuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotCi0jaW5jbHVkZSA8bGludXgvaGF5ZXNlc3AuaD4KLQotI2RlZmluZSBOUl9QT1JUUyA2NAkvKiBtYXhpbXVtIG51bWJlciBvZiBwb3J0cyAqLwotI2RlZmluZSBOUl9QUklNQVJZIDgJLyogbWF4aW11bSBudW1iZXIgb2YgcHJpbWFyeSBwb3J0cyAqLwotI2RlZmluZSBSRUdJT05fU0laRSA4ICAgLyogc2l6ZSBvZiBpbyByZWdpb24gdG8gcmVxdWVzdCAqLwotCi0vKiBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBjYW4gYmUgc2V0IGJ5IGdpdmluZyBtb2R1bGUgb3B0aW9ucyAqLwotc3RhdGljIGludCBpcnFbTlJfUFJJTUFSWV07CS8qIElSUSBmb3IgZWFjaCBiYXNlIHBvcnQgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZGl2aXNvcltOUl9QUklNQVJZXTsgLyogY3VzdG9tIGRpdmlzb3IgZm9yIGVhY2ggcG9ydCAqLwotc3RhdGljIHVuc2lnbmVkIGludCBkbWEgPSBFU1BfRE1BX0NIQU5ORUw7IC8qIERNQSBjaGFubmVsICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHJ4X3RyaWdnZXIgPSBFU1BfUlhfVFJJR0dFUjsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgdHhfdHJpZ2dlciA9IEVTUF9UWF9UUklHR0VSOwotc3RhdGljIHVuc2lnbmVkIGludCBmbG93X29mZiA9IEVTUF9GTE9XX09GRjsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZmxvd19vbiA9IEVTUF9GTE9XX09OOwotc3RhdGljIHVuc2lnbmVkIGludCByeF90aW1lb3V0ID0gRVNQX1JYX1RNT1VUOwotc3RhdGljIHVuc2lnbmVkIGludCBwaW9fdGhyZXNob2xkID0gRVNQX1BJT19USFJFU0hPTEQ7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKLW1vZHVsZV9wYXJhbV9hcnJheShkaXZpc29yLCB1aW50LCBOVUxMLCAwKTsKLW1vZHVsZV9wYXJhbShkbWEsIHVpbnQsIDApOwotbW9kdWxlX3BhcmFtKHJ4X3RyaWdnZXIsIHVpbnQsIDApOwotbW9kdWxlX3BhcmFtKHR4X3RyaWdnZXIsIHVpbnQsIDApOwotbW9kdWxlX3BhcmFtKGZsb3dfb2ZmLCB1aW50LCAwKTsKLW1vZHVsZV9wYXJhbShmbG93X29uLCB1aW50LCAwKTsKLW1vZHVsZV9wYXJhbShyeF90aW1lb3V0LCB1aW50LCAwKTsKLW1vZHVsZV9wYXJhbShwaW9fdGhyZXNob2xkLCB1aW50LCAwKTsKLQotLyogRU5EICovCi0KLXN0YXRpYyBjaGFyICpkbWFfYnVmZmVyOwotc3RhdGljIGludCBkbWFfYnl0ZXM7Ci1zdGF0aWMgc3RydWN0IGVzcF9waW9fYnVmZmVyICpmcmVlX3Bpb19idWY7Ci0KLSNkZWZpbmUgRE1BX0JVRkZFUl9TWiAxMDI0Ci0KLSNkZWZpbmUgV0FLRVVQX0NIQVJTIDEwMjQKLQotc3RhdGljIGNoYXIgc2VyaWFsX25hbWVbXSBfX2luaXRkYXRhID0gIkVTUCBzZXJpYWwgZHJpdmVyIjsKLXN0YXRpYyBjaGFyIHNlcmlhbF92ZXJzaW9uW10gX19pbml0ZGF0YSA9ICIyLjIiOwotCi1zdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKmVzcF9kcml2ZXI7Ci0KLS8qCi0gKiBTZXJpYWwgZHJpdmVyIGNvbmZpZ3VyYXRpb24gc2VjdGlvbi4gIEhlcmUgYXJlIHRoZSB2YXJpb3VzIG9wdGlvbnM6Ci0gKgotICogU0VSSUFMX1BBUkFOT0lBX0NIRUNLCi0gKiAJCUNoZWNrIHRoZSBtYWdpYyBudW1iZXIgZm9yIHRoZSBlc3Bfc3RydWN0dXJlIHdoZXJlCi0gKiAJCWV2ZXIgcG9zc2libGUuCi0gKi8KLQotI3VuZGVmIFNFUklBTF9QQVJBTk9JQV9DSEVDSwotI2RlZmluZSBTRVJJQUxfRE9fUkVTVEFSVAotCi0jdW5kZWYgU0VSSUFMX0RFQlVHX0lOVFIKLSN1bmRlZiBTRVJJQUxfREVCVUdfT1BFTgotI3VuZGVmIFNFUklBTF9ERUJVR19GTE9XCi0KLSNpZiBkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChTRVJJQUxfREVCVUdfTUNPVU5UKQotI2RlZmluZSBEQkdfQ05UKHMpIHByaW50ayhLRVJOX0RFQlVHICIoJXMpOiBbJXhdIHJlZmM9JWQsIHNlcmM9JWQsIHR0eWM9JWQgLT4gJXNcbiIsIFwKLQkJCQl0dHktPm5hbWUsIGluZm8tPnBvcnQuZmxhZ3MsIFwKLQkJCQlzZXJpYWxfZHJpdmVyLnJlZmNvdW50LCBcCi0JCQkJaW5mby0+cG9ydC5jb3VudCwgdHR5LT5jb3VudCwgcykKLSNlbHNlCi0jZGVmaW5lIERCR19DTlQocykKLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IGVzcF9zdHJ1Y3QgKnBvcnRzOwotCi1zdGF0aWMgdm9pZCBjaGFuZ2Vfc3BlZWQoc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8pOwotc3RhdGljIHZvaWQgcnNfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICosIGludCk7Ci0KLS8qCi0gKiBUaGUgRVNQIGNhcmQgaGFzIGEgY2xvY2sgcmF0ZSBvZiAxNC43NDU2IE1IeiAodGhhdCBpcywgMioqRVNQQ19TQ0FMRQotICogdGltZXMgdGhlIG5vcm1hbCAxLjg0MzIgTWh6IGNsb2NrIG9mIG1vc3Qgc2VyaWFsIGJvYXJkcykuCi0gKi8KLSNkZWZpbmUgQkFTRV9CQVVEICgoMTg0MzIwMCAvIDE2KSAqICgxIDw8IEVTUENfU0NBTEUpKQotCi0vKiBTdGFuZGFyZCBDT00gZmxhZ3MgKGV4Y2VwdCBmb3IgQ09NNCwgYmVjYXVzZSBvZiB0aGUgODUxNCBwcm9ibGVtKSAqLwotI2RlZmluZSBTVERfQ09NX0ZMQUdTIChBU1lOQ19CT09UX0FVVE9DT05GIHwgQVNZTkNfU0tJUF9URVNUKQotCi1zdGF0aWMgaW5saW5lIGludCBzZXJpYWxfcGFyYW5vaWFfY2hlY2soc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8sCi0JCQkJCWNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnJvdXRpbmUpCi17Ci0jaWZkZWYgU0VSSUFMX1BBUkFOT0lBX0NIRUNLCi0Jc3RhdGljIGNvbnN0IGNoYXIgYmFkbWFnaWNbXSA9IEtFUk5fV0FSTklORwotCQkiV2FybmluZzogYmFkIG1hZ2ljIG51bWJlciBmb3Igc2VyaWFsIHN0cnVjdCAoJXMpIGluICVzXG4iOwotCXN0YXRpYyBjb25zdCBjaGFyIGJhZGluZm9bXSA9IEtFUk5fV0FSTklORwotCQkiV2FybmluZzogbnVsbCBlc3Bfc3RydWN0IGZvciAoJXMpIGluICVzXG4iOwotCi0JaWYgKCFpbmZvKSB7Ci0JCXByaW50ayhiYWRpbmZvLCBuYW1lLCByb3V0aW5lKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmIChpbmZvLT5tYWdpYyAhPSBFU1BfTUFHSUMpIHsKLQkJcHJpbnRrKGJhZG1hZ2ljLCBuYW1lLCByb3V0aW5lKTsKLQkJcmV0dXJuIDE7Ci0JfQotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNlcmlhbF9pbihzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbywgaW50IG9mZnNldCkKLXsKLQlyZXR1cm4gaW5iKGluZm8tPmlvX3BvcnQgKyBvZmZzZXQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2VyaWFsX291dChzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbywgaW50IG9mZnNldCwKLQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgdmFsdWUpCi17Ci0Jb3V0Yih2YWx1ZSwgaW5mby0+aW9fcG9ydCtvZmZzZXQpOwotfQotCi0vKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiByc19zdG9wKCkgYW5kIHJzX3N0YXJ0KCkKLSAqCi0gKiBUaGlzIHJvdXRpbmVzIGFyZSBjYWxsZWQgYmVmb3JlIHNldHRpbmcgb3IgcmVzZXR0aW5nIHR0eS0+c3RvcHBlZC4KLSAqIFRoZXkgZW5hYmxlIG9yIGRpc2FibGUgdHJhbnNtaXR0ZXIgaW50ZXJydXB0cywgYXMgbmVjZXNzYXJ5LgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLXN0YXRpYyB2b2lkIHJzX3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfc3RvcCIpKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCWlmIChpbmZvLT5JRVIgJiBVQVJUX0lFUl9USFJJKSB7Ci0JCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1NSVl9NQVNLKTsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5JRVIpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJzX3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3N0YXJ0IikpCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JaWYgKGluZm8tPnhtaXRfY250ICYmIGluZm8tPnhtaXRfYnVmICYmICEoaW5mby0+SUVSICYgVUFSVF9JRVJfVEhSSSkpIHsKLQkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9TUlZfTUFTSyk7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+SUVSKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotfQotCi0vKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIEhlcmUgc3RhcnRzIHRoZSBpbnRlcnJ1cHQgaGFuZGxpbmcgcm91dGluZXMuICBBbGwgb2YgdGhlIGZvbGxvd2luZwotICogc3Vicm91dGluZXMgYXJlIGRlY2xhcmVkIGFzIGlubGluZSBhbmQgYXJlIGZvbGRlZCBpbnRvCi0gKiByc19pbnRlcnJ1cHQoKS4gIFRoZXkgd2VyZSBzZXBhcmF0ZWQgb3V0IGZvciByZWFkYWJpbGl0eSdzIHNha2UuCi0gKgotICogTm90ZTogcnNfaW50ZXJydXB0KCkgaXMgYSAiZmFzdCIgaW50ZXJydXB0LCB3aGljaCBtZWFucyB0aGF0IGl0Ci0gKiBydW5zIHdpdGggaW50ZXJydXB0cyB0dXJuZWQgb2ZmLiAgUGVvcGxlIHdobyBtYXkgd2FudCB0byBtb2RpZnkKLSAqIHJzX2ludGVycnVwdCgpIHNob3VsZCB0cnkgdG8ga2VlcCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgYXMgZmFzdCBhcwotICogcG9zc2libGUuICBBZnRlciB5b3UgYXJlIGRvbmUgbWFraW5nIG1vZGlmaWNhdGlvbnMsIGl0IGlzIG5vdCBhIGJhZAotICogaWRlYSB0byBkbzoKLSAqCi0gKiBnY2MgLVMgLURLRVJORUwgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLWZvbWl0LWZyYW1lLXBvaW50ZXIgc2VyaWFsLmMKLSAqCi0gKiBhbmQgbG9vayBhdCB0aGUgcmVzdWx0aW5nIGFzc2VtYmxlIGNvZGUgaW4gc2VyaWFsLnMuCi0gKgotICogCQkJCS0gVGVkIFRzJ28gKHR5dHNvQG1pdC5lZHUpLCA3LU1hci05MwotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBpb19sb2NrKTsKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgZXNwX3Bpb19idWZmZXIgKmdldF9waW9fYnVmZmVyKHZvaWQpCi17Ci0Jc3RydWN0IGVzcF9waW9fYnVmZmVyICpidWY7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwaW9fbG9jaywgZmxhZ3MpOwotCWlmIChmcmVlX3Bpb19idWYpIHsKLQkJYnVmID0gZnJlZV9waW9fYnVmOwotCQlmcmVlX3Bpb19idWYgPSBidWYtPm5leHQ7Ci0JfSBlbHNlIHsKLQkJYnVmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGVzcF9waW9fYnVmZmVyKSwgR0ZQX0FUT01JQyk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBpb19sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHJlbGVhc2VfcGlvX2J1ZmZlcihzdHJ1Y3QgZXNwX3Bpb19idWZmZXIgKmJ1ZikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXNwaW5fbG9ja19pcnFzYXZlKCZwaW9fbG9jaywgZmxhZ3MpOwotCWJ1Zi0+bmV4dCA9IGZyZWVfcGlvX2J1ZjsKLQlmcmVlX3Bpb19idWYgPSBidWY7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGlvX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHJlY2VpdmVfY2hhcnNfcGlvKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvLCBpbnQgbnVtX2J5dGVzKQotewotCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBpbmZvLT5wb3J0LnR0eTsKLQlpbnQgaTsKLQlzdHJ1Y3QgZXNwX3Bpb19idWZmZXIgKnBpb19idWY7Ci0Jc3RydWN0IGVzcF9waW9fYnVmZmVyICplcnJfYnVmOwotCXVuc2lnbmVkIGNoYXIgc3RhdHVzX21hc2s7Ci0KLQlwaW9fYnVmID0gZ2V0X3Bpb19idWZmZXIoKTsKLQotCWlmICghcGlvX2J1ZikKLQkJcmV0dXJuOwotCi0JZXJyX2J1ZiA9IGdldF9waW9fYnVmZmVyKCk7Ci0KLQlpZiAoIWVycl9idWYpIHsKLQkJcmVsZWFzZV9waW9fYnVmZmVyKHBpb19idWYpOwotCQlyZXR1cm47Ci0JfQotCi0Jc3RhdHVzX21hc2sgPSAoaW5mby0+cmVhZF9zdGF0dXNfbWFzayA+PiAyKSAmIDB4MDc7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2J5dGVzIC0gMTsgaSArPSAyKSB7Ci0JCSooKHVuc2lnbmVkIHNob3J0ICopKHBpb19idWYtPmRhdGEgKyBpKSkgPQotCQkJaW53KGluZm8tPmlvX3BvcnQgKyBVQVJUX0VTSV9SWCk7Ci0JCWVycl9idWYtPmRhdGFbaV0gPSBzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfUldTKTsKLQkJZXJyX2J1Zi0+ZGF0YVtpICsgMV0gPSAoZXJyX2J1Zi0+ZGF0YVtpXSA+PiAzKSAmIHN0YXR1c19tYXNrOwotCQllcnJfYnVmLT5kYXRhW2ldICY9IHN0YXR1c19tYXNrOwotCX0KLQotCWlmIChudW1fYnl0ZXMgJiAweDAwMDEpIHsKLQkJcGlvX2J1Zi0+ZGF0YVtudW1fYnl0ZXMgLSAxXSA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9SWCk7Ci0JCWVycl9idWYtPmRhdGFbbnVtX2J5dGVzIC0gMV0gPQotCQkJKHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9SV1MpID4+IDMpICYgc3RhdHVzX21hc2s7Ci0JfQotCi0JLyogbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgc3RpbGwgb2sgc2luY2UgaW50ZXJydXB0cyB3ZXJlIGVuYWJsZWQgKi8KLQl0dHkgPSBpbmZvLT5wb3J0LnR0eTsKLQotCWlmICghdHR5KSB7Ci0JCXJlbGVhc2VfcGlvX2J1ZmZlcihwaW9fYnVmKTsKLQkJcmVsZWFzZV9waW9fYnVmZmVyKGVycl9idWYpOwotCQlpbmZvLT5zdGF0X2ZsYWdzICY9IH5FU1BfU1RBVF9SWF9USU1FT1VUOwotCQlyZXR1cm47Ci0JfQotCi0Jc3RhdHVzX21hc2sgPSAoaW5mby0+aWdub3JlX3N0YXR1c19tYXNrID4+IDIpICYgMHgwNzsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fYnl0ZXM7IGkrKykgewotCQlpZiAoIShlcnJfYnVmLT5kYXRhW2ldICYgc3RhdHVzX21hc2spKSB7Ci0JCQlpbnQgZmxhZyA9IDA7Ci0KLQkJCWlmIChlcnJfYnVmLT5kYXRhW2ldICYgMHgwNCkgewotCQkJCWZsYWcgPSBUVFlfQlJFQUs7Ci0JCQkJaWYgKGluZm8tPnBvcnQuZmxhZ3MgJiBBU1lOQ19TQUspCi0JCQkJCWRvX1NBSyh0dHkpOwotCQkJfSBlbHNlIGlmIChlcnJfYnVmLT5kYXRhW2ldICYgMHgwMikKLQkJCQlmbGFnID0gVFRZX0ZSQU1FOwotCQkJZWxzZSBpZiAoZXJyX2J1Zi0+ZGF0YVtpXSAmIDB4MDEpCi0JCQkJZmxhZyA9IFRUWV9QQVJJVFk7Ci0JCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIHBpb19idWYtPmRhdGFbaV0sIGZsYWcpOwotCQl9Ci0JfQotCi0JdHR5X3NjaGVkdWxlX2ZsaXAodHR5KTsKLQotCWluZm8tPnN0YXRfZmxhZ3MgJj0gfkVTUF9TVEFUX1JYX1RJTUVPVVQ7Ci0JcmVsZWFzZV9waW9fYnVmZmVyKHBpb19idWYpOwotCXJlbGVhc2VfcGlvX2J1ZmZlcihlcnJfYnVmKTsKLX0KLQotc3RhdGljIHZvaWQgcHJvZ3JhbV9pc2FfZG1hKGludCBkbWEsIGludCBkaXIsIHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGxlbikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOwotCWRpc2FibGVfZG1hKGRtYSk7Ci0JY2xlYXJfZG1hX2ZmKGRtYSk7Ci0Jc2V0X2RtYV9tb2RlKGRtYSwgZGlyKTsKLQlzZXRfZG1hX2FkZHIoZG1hLCBhZGRyKTsKLQlzZXRfZG1hX2NvdW50KGRtYSwgbGVuKTsKLQllbmFibGVfZG1hKGRtYSk7Ci0JcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlY2VpdmVfY2hhcnNfZG1hKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvLCBpbnQgbnVtX2J5dGVzKQotewotCWluZm8tPnN0YXRfZmxhZ3MgJj0gfkVTUF9TVEFUX1JYX1RJTUVPVVQ7Ci0JZG1hX2J5dGVzID0gbnVtX2J5dGVzOwotCWluZm8tPnN0YXRfZmxhZ3MgfD0gRVNQX1NUQVRfRE1BX1JYOwotCi0JcHJvZ3JhbV9pc2FfZG1hKGRtYSwgRE1BX01PREVfUkVBRCwgaXNhX3ZpcnRfdG9fYnVzKGRtYV9idWZmZXIpLAotCQkJCQkJCQlkbWFfYnl0ZXMpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NUQVJUX0RNQV9SWCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCByZWNlaXZlX2NoYXJzX2RtYV9kb25lKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvLAotCQkJCQkgICAgaW50IHN0YXR1cykKLXsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gaW5mby0+cG9ydC50dHk7Ci0JaW50IG51bV9ieXRlczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOwotCWRpc2FibGVfZG1hKGRtYSk7Ci0JY2xlYXJfZG1hX2ZmKGRtYSk7Ci0KLQlpbmZvLT5zdGF0X2ZsYWdzICY9IH5FU1BfU1RBVF9ETUFfUlg7Ci0JbnVtX2J5dGVzID0gZG1hX2J5dGVzIC0gZ2V0X2RtYV9yZXNpZHVlKGRtYSk7Ci0JcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7Ci0KLQlpbmZvLT5pY291bnQucnggKz0gbnVtX2J5dGVzOwotCi0JaWYgKG51bV9ieXRlcyA+IDApIHsKLQkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIGRtYV9idWZmZXIsIG51bV9ieXRlcyAtIDEpOwotCi0JCXN0YXR1cyAmPSAoMHgxYyAmIGluZm8tPnJlYWRfc3RhdHVzX21hc2spOwotCi0JCS8qIElzIHRoZSBzdGF0dXMgc2lnbmlmaWNhbnQgb3IgZG8gd2UgdGhyb3cgdGhlIGxhc3QgYnl0ZSA/ICovCi0JCWlmICghKHN0YXR1cyAmIGluZm8tPmlnbm9yZV9zdGF0dXNfbWFzaykpIHsKLQkJCWludCBzdGF0ZmxhZyA9IDA7Ci0KLQkJCWlmIChzdGF0dXMgJiAweDEwKSB7Ci0JCQkJc3RhdGZsYWcgPSBUVFlfQlJFQUs7Ci0JCQkJKGluZm8tPmljb3VudC5icmspKys7Ci0JCQkJaWYgKGluZm8tPnBvcnQuZmxhZ3MgJiBBU1lOQ19TQUspCi0JCQkJCWRvX1NBSyh0dHkpOwotCQkJfSBlbHNlIGlmIChzdGF0dXMgJiAweDA4KSB7Ci0JCQkJc3RhdGZsYWcgPSBUVFlfRlJBTUU7Ci0JCQkJaW5mby0+aWNvdW50LmZyYW1lKys7Ci0JCQl9IGVsc2UgaWYgKHN0YXR1cyAmIDB4MDQpIHsKLQkJCQlzdGF0ZmxhZyA9IFRUWV9QQVJJVFk7Ci0JCQkJaW5mby0+aWNvdW50LnBhcml0eSsrOwotCQkJfQotCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBkbWFfYnVmZmVyW251bV9ieXRlcyAtIDFdLAotCQkJCQkJCQlzdGF0ZmxhZyk7Ci0JCX0KLQkJdHR5X3NjaGVkdWxlX2ZsaXAodHR5KTsKLQl9Ci0KLQlpZiAoZG1hX2J5dGVzICE9IG51bV9ieXRlcykgewotCQludW1fYnl0ZXMgPSBkbWFfYnl0ZXMgLSBudW1fYnl0ZXM7Ci0JCWRtYV9ieXRlcyA9IDA7Ci0JCXJlY2VpdmVfY2hhcnNfZG1hKGluZm8sIG51bV9ieXRlcyk7Ci0JfSBlbHNlCi0JCWRtYV9ieXRlcyA9IDA7Ci19Ci0KLS8qIENhbGxlciBtdXN0IGhvbGQgaW5mby0+bG9jayAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgdHJhbnNtaXRfY2hhcnNfcGlvKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvLAotCQkJCQlpbnQgc3BhY2VfYXZhaWwpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IGVzcF9waW9fYnVmZmVyICpwaW9fYnVmOwotCi0JcGlvX2J1ZiA9IGdldF9waW9fYnVmZmVyKCk7Ci0KLQlpZiAoIXBpb19idWYpCi0JCXJldHVybjsKLQotCXdoaWxlIChzcGFjZV9hdmFpbCAmJiBpbmZvLT54bWl0X2NudCkgewotCQlpZiAoaW5mby0+eG1pdF90YWlsICsgc3BhY2VfYXZhaWwgPD0gRVNQX1hNSVRfU0laRSkgewotCQkJbWVtY3B5KHBpb19idWYtPmRhdGEsCi0JCQkgICAgICAgJihpbmZvLT54bWl0X2J1ZltpbmZvLT54bWl0X3RhaWxdKSwKLQkJCSAgICAgICBzcGFjZV9hdmFpbCk7Ci0JCX0gZWxzZSB7Ci0JCQlpID0gRVNQX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfdGFpbDsKLQkJCW1lbWNweShwaW9fYnVmLT5kYXRhLAotCQkJICAgICAgICYoaW5mby0+eG1pdF9idWZbaW5mby0+eG1pdF90YWlsXSksIGkpOwotCQkJbWVtY3B5KCYocGlvX2J1Zi0+ZGF0YVtpXSksIGluZm8tPnhtaXRfYnVmLAotCQkJICAgICAgIHNwYWNlX2F2YWlsIC0gaSk7Ci0JCX0KLQotCQlpbmZvLT54bWl0X2NudCAtPSBzcGFjZV9hdmFpbDsKLQkJaW5mby0+eG1pdF90YWlsID0gKGluZm8tPnhtaXRfdGFpbCArIHNwYWNlX2F2YWlsKSAmCi0JCQkoRVNQX1hNSVRfU0laRSAtIDEpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBzcGFjZV9hdmFpbCAtIDE7IGkgKz0gMikgewotCQkJb3V0dygqKCh1bnNpZ25lZCBzaG9ydCAqKShwaW9fYnVmLT5kYXRhICsgaSkpLAotCQkJICAgICBpbmZvLT5pb19wb3J0ICsgVUFSVF9FU0lfVFgpOwotCQl9Ci0KLQkJaWYgKHNwYWNlX2F2YWlsICYgMHgwMDAxKQotCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9UWCwKLQkJCQkgICBwaW9fYnVmLT5kYXRhW3NwYWNlX2F2YWlsIC0gMV0pOwotCi0JCWlmIChpbmZvLT54bWl0X2NudCkgewotCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfTk9fQ09NTUFORCk7Ci0JCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9HRVRfVFhfQVZBSUwpOwotCQkJc3BhY2VfYXZhaWwgPSBzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfU1RBVDEpIDw8IDg7Ci0JCQlzcGFjZV9hdmFpbCB8PSBzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfU1RBVDIpOwotCi0JCQlpZiAoc3BhY2VfYXZhaWwgPiBpbmZvLT54bWl0X2NudCkKLQkJCQlzcGFjZV9hdmFpbCA9IGluZm8tPnhtaXRfY250OwotCQl9Ci0JfQotCi0JaWYgKGluZm8tPnhtaXRfY250IDwgV0FLRVVQX0NIQVJTKSB7Ci0JCWlmIChpbmZvLT5wb3J0LnR0eSkKLQkJCXR0eV93YWtldXAoaW5mby0+cG9ydC50dHkpOwotCi0jaWZkZWYgU0VSSUFMX0RFQlVHX0lOVFIKLQkJcHJpbnRrKCJUSFJFLi4uIik7Ci0jZW5kaWYKLQotCQlpZiAoaW5mby0+eG1pdF9jbnQgPD0gMCkgewotCQkJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9USFJJOwotCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLAotCQkJCSAgIEVTSV9TRVRfU1JWX01BU0spOwotCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5JRVIpOwotCQl9Ci0JfQotCi0JcmVsZWFzZV9waW9fYnVmZmVyKHBpb19idWYpOwotfQotCi0vKiBDYWxsZXIgbXVzdCBob2xkIGluZm8tPmxvY2sgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCB0cmFuc21pdF9jaGFyc19kbWEoc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8sIGludCBudW1fYnl0ZXMpCi17Ci0JZG1hX2J5dGVzID0gbnVtX2J5dGVzOwotCi0JaWYgKGluZm8tPnhtaXRfdGFpbCArIGRtYV9ieXRlcyA8PSBFU1BfWE1JVF9TSVpFKSB7Ci0JCW1lbWNweShkbWFfYnVmZmVyLCAmKGluZm8tPnhtaXRfYnVmW2luZm8tPnhtaXRfdGFpbF0pLAotCQkgICAgICAgZG1hX2J5dGVzKTsKLQl9IGVsc2UgewotCQlpbnQgaSA9IEVTUF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X3RhaWw7Ci0JCW1lbWNweShkbWFfYnVmZmVyLCAmKGluZm8tPnhtaXRfYnVmW2luZm8tPnhtaXRfdGFpbF0pLAotCQkJaSk7Ci0JCW1lbWNweSgmKGRtYV9idWZmZXJbaV0pLCBpbmZvLT54bWl0X2J1ZiwgZG1hX2J5dGVzIC0gaSk7Ci0JfQotCi0JaW5mby0+eG1pdF9jbnQgLT0gZG1hX2J5dGVzOwotCWluZm8tPnhtaXRfdGFpbCA9IChpbmZvLT54bWl0X3RhaWwgKyBkbWFfYnl0ZXMpICYgKEVTUF9YTUlUX1NJWkUgLSAxKTsKLQotCWlmIChpbmZvLT54bWl0X2NudCA8IFdBS0VVUF9DSEFSUykgewotCQlpZiAoaW5mby0+cG9ydC50dHkpCi0JCQl0dHlfd2FrZXVwKGluZm8tPnBvcnQudHR5KTsKLQotI2lmZGVmIFNFUklBTF9ERUJVR19JTlRSCi0JCXByaW50aygiVEhSRS4uLiIpOwotI2VuZGlmCi0KLQkJaWYgKGluZm8tPnhtaXRfY250IDw9IDApIHsKLQkJCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKLQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9TUlZfTUFTSyk7Ci0JCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPklFUik7Ci0JCX0KLQl9Ci0KLQlpbmZvLT5zdGF0X2ZsYWdzIHw9IEVTUF9TVEFUX0RNQV9UWDsKLQotCXByb2dyYW1faXNhX2RtYShkbWEsIERNQV9NT0RFX1dSSVRFLCBpc2FfdmlydF90b19idXMoZG1hX2J1ZmZlciksCi0JCQkJCQkJCWRtYV9ieXRlcyk7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU1RBUlRfRE1BX1RYKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHRyYW5zbWl0X2NoYXJzX2RtYV9kb25lKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvKQotewotCWludCBudW1fYnl0ZXM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKLQlkaXNhYmxlX2RtYShkbWEpOwotCWNsZWFyX2RtYV9mZihkbWEpOwotCi0JbnVtX2J5dGVzID0gZG1hX2J5dGVzIC0gZ2V0X2RtYV9yZXNpZHVlKGRtYSk7Ci0JaW5mby0+aWNvdW50LnR4ICs9IGRtYV9ieXRlczsKLQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKLQotCWlmIChkbWFfYnl0ZXMgIT0gbnVtX2J5dGVzKSB7Ci0JCWRtYV9ieXRlcyAtPSBudW1fYnl0ZXM7Ci0JCW1lbW1vdmUoZG1hX2J1ZmZlciwgZG1hX2J1ZmZlciArIG51bV9ieXRlcywgZG1hX2J5dGVzKTsKLQotCQlwcm9ncmFtX2lzYV9kbWEoZG1hLCBETUFfTU9ERV9XUklURSwKLQkJCQlpc2FfdmlydF90b19idXMoZG1hX2J1ZmZlciksIGRtYV9ieXRlcyk7Ci0KLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU1RBUlRfRE1BX1RYKTsKLQl9IGVsc2UgewotCQlkbWFfYnl0ZXMgPSAwOwotCQlpbmZvLT5zdGF0X2ZsYWdzICY9IH5FU1BfU1RBVF9ETUFfVFg7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBjaGVja19tb2RlbV9zdGF0dXMoc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8pCi17Ci0JaW50CXN0YXR1czsKLQotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX0dFVF9VQVJUX1NUQVQpOwotCXN0YXR1cyA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMik7Ci0KLQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfQU5ZX0RFTFRBKSB7Ci0JCS8qIHVwZGF0ZSBpbnB1dCBsaW5lIGNvdW50ZXJzICovCi0JCWlmIChzdGF0dXMgJiBVQVJUX01TUl9URVJJKQotCQkJaW5mby0+aWNvdW50LnJuZysrOwotCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRERTUikKLQkJCWluZm8tPmljb3VudC5kc3IrKzsKLQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0REQ0QpCi0JCQlpbmZvLT5pY291bnQuZGNkKys7Ci0JCWlmIChzdGF0dXMgJiBVQVJUX01TUl9EQ1RTKQotCQkJaW5mby0+aWNvdW50LmN0cysrOwotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPnBvcnQuZGVsdGFfbXNyX3dhaXQpOwotCX0KLQotCWlmICgoaW5mby0+cG9ydC5mbGFncyAmIEFTWU5DX0NIRUNLX0NEKSAmJiAoc3RhdHVzICYgVUFSVF9NU1JfRERDRCkpIHsKLSNpZiAoZGVmaW5lZChTRVJJQUxfREVCVUdfT1BFTikgfHwgZGVmaW5lZChTRVJJQUxfREVCVUdfSU5UUikpCi0JCXByaW50aygidHR5cyVkIENEIG5vdyAlcy4uLiIsIGluZm8tPmxpbmUsCi0JCSAgICAgICAoc3RhdHVzICYgVUFSVF9NU1JfRENEKSA/ICJvbiIgOiAib2ZmIik7Ci0jZW5kaWYKLQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDRCkKLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+cG9ydC5vcGVuX3dhaXQpOwotCQllbHNlIHsKLSNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgotCQkJcHJpbnRrKCJzY2hlZHVsaW5nIGhhbmd1cC4uLiIpOwotI2VuZGlmCi0JCQl0dHlfaGFuZ3VwKGluZm8tPnBvcnQudHR5KTsKLQkJfQotCX0KLX0KLQotLyoKLSAqIFRoaXMgaXMgdGhlIHNlcmlhbCBkcml2ZXIncyBpbnRlcnJ1cHQgcm91dGluZQotICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgcnNfaW50ZXJydXB0X3NpbmdsZShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm87Ci0JdW5zaWduZWQgZXJyX3N0YXR1czsKLQl1bnNpZ25lZCBpbnQgc2NyYXRjaDsKLQotI2lmZGVmIFNFUklBTF9ERUJVR19JTlRSCi0JcHJpbnRrKCJyc19pbnRlcnJ1cHRfc2luZ2xlKCVkKS4uLiIsIGlycSk7Ci0jZW5kaWYKLQlpbmZvID0gKHN0cnVjdCBlc3Bfc3RydWN0ICopZGV2X2lkOwotCWVycl9zdGF0dXMgPSAwOwotCXNjcmF0Y2ggPSBzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfU0lEKTsKLQotCXNwaW5fbG9jaygmaW5mby0+bG9jayk7Ci0KLQlpZiAoIWluZm8tPnBvcnQudHR5KSB7Ci0JCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQkJcmV0dXJuIElSUV9OT05FOwotCX0KLQotCWlmIChzY3JhdGNoICYgMHgwNCkgeyAvKiBlcnJvciAqLwotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9HRVRfRVJSX1NUQVQpOwotCQllcnJfc3RhdHVzID0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQxKTsKLQkJc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQyKTsKLQotCQlpZiAoZXJyX3N0YXR1cyAmIDB4MDEpCi0JCQlpbmZvLT5zdGF0X2ZsYWdzIHw9IEVTUF9TVEFUX1JYX1RJTUVPVVQ7Ci0KLQkJaWYgKGVycl9zdGF0dXMgJiAweDIwKSAvKiBVQVJUIHN0YXR1cyAqLwotCQkJY2hlY2tfbW9kZW1fc3RhdHVzKGluZm8pOwotCi0JCWlmIChlcnJfc3RhdHVzICYgMHg4MCkgLyogU3RhcnQgYnJlYWsgKi8KLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+YnJlYWtfd2FpdCk7Ci0JfQotCi0JaWYgKChzY3JhdGNoICYgMHg4OCkgfHwgLyogRE1BIGNvbXBsZXRlZCBvciB0aW1lZCBvdXQgKi8KLQkgICAgKGVycl9zdGF0dXMgJiAweDFjKSAvKiByZWNlaXZlIGVycm9yICovKSB7Ci0JCWlmIChpbmZvLT5zdGF0X2ZsYWdzICYgRVNQX1NUQVRfRE1BX1JYKQotCQkJcmVjZWl2ZV9jaGFyc19kbWFfZG9uZShpbmZvLCBlcnJfc3RhdHVzKTsKLQkJZWxzZSBpZiAoaW5mby0+c3RhdF9mbGFncyAmIEVTUF9TVEFUX0RNQV9UWCkKLQkJCXRyYW5zbWl0X2NoYXJzX2RtYV9kb25lKGluZm8pOwotCX0KLQotCWlmICghKGluZm8tPnN0YXRfZmxhZ3MgJiAoRVNQX1NUQVRfRE1BX1JYIHwgRVNQX1NUQVRfRE1BX1RYKSkgJiYKLQkgICAgKChzY3JhdGNoICYgMHgwMSkgfHwgKGluZm8tPnN0YXRfZmxhZ3MgJiBFU1BfU1RBVF9SWF9USU1FT1VUKSkgJiYKLQkgICAgKGluZm8tPklFUiAmIFVBUlRfSUVSX1JESSkpIHsKLQkJaW50IG51bV9ieXRlczsKLQotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9OT19DT01NQU5EKTsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfR0VUX1JYX0FWQUlMKTsKLQkJbnVtX2J5dGVzID0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQxKSA8PCA4OwotCQludW1fYnl0ZXMgfD0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQyKTsKLQotCQludW1fYnl0ZXMgPSB0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbShpbmZvLT5wb3J0LnR0eSwgbnVtX2J5dGVzKTsKLQotCQlpZiAobnVtX2J5dGVzKSB7Ci0JCQlpZiAoZG1hX2J5dGVzIHx8Ci0JCQkgICAgKGluZm8tPnN0YXRfZmxhZ3MgJiBFU1BfU1RBVF9VU0VfUElPKSB8fAotCQkJICAgIChudW1fYnl0ZXMgPD0gaW5mby0+Y29uZmlnLnBpb190aHJlc2hvbGQpKQotCQkJCXJlY2VpdmVfY2hhcnNfcGlvKGluZm8sIG51bV9ieXRlcyk7Ci0JCQllbHNlCi0JCQkJcmVjZWl2ZV9jaGFyc19kbWEoaW5mbywgbnVtX2J5dGVzKTsKLQkJfQotCX0KLQotCWlmICghKGluZm8tPnN0YXRfZmxhZ3MgJiAoRVNQX1NUQVRfRE1BX1JYIHwgRVNQX1NUQVRfRE1BX1RYKSkgJiYKLQkgICAgKHNjcmF0Y2ggJiAweDAyKSAmJiAoaW5mby0+SUVSICYgVUFSVF9JRVJfVEhSSSkpIHsKLQkJaWYgKChpbmZvLT54bWl0X2NudCA8PSAwKSB8fCBpbmZvLT5wb3J0LnR0eS0+c3RvcHBlZCkgewotCQkJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9USFJJOwotCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1NSVl9NQVNLKTsKLQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+SUVSKTsKLQkJfSBlbHNlIHsKLQkJCWludCBudW1fYnl0ZXM7Ci0KLQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX05PX0NPTU1BTkQpOwotCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfR0VUX1RYX0FWQUlMKTsKLQkJCW51bV9ieXRlcyA9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMSkgPDwgODsKLQkJCW51bV9ieXRlcyB8PSBzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfU1RBVDIpOwotCi0JCQlpZiAobnVtX2J5dGVzID4gaW5mby0+eG1pdF9jbnQpCi0JCQkJbnVtX2J5dGVzID0gaW5mby0+eG1pdF9jbnQ7Ci0KLQkJCWlmIChudW1fYnl0ZXMpIHsKLQkJCQlpZiAoZG1hX2J5dGVzIHx8Ci0JCQkJICAgIChpbmZvLT5zdGF0X2ZsYWdzICYgRVNQX1NUQVRfVVNFX1BJTykgfHwKLQkJCQkgICAgKG51bV9ieXRlcyA8PSBpbmZvLT5jb25maWcucGlvX3RocmVzaG9sZCkpCi0JCQkJCXRyYW5zbWl0X2NoYXJzX3BpbyhpbmZvLCBudW1fYnl0ZXMpOwotCQkJCWVsc2UKLQkJCQkJdHJhbnNtaXRfY2hhcnNfZG1hKGluZm8sIG51bV9ieXRlcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpbmZvLT5sYXN0X2FjdGl2ZSA9IGppZmZpZXM7Ci0KLSNpZmRlZiBTRVJJQUxfREVCVUdfSU5UUgotCXByaW50aygiZW5kLlxuIik7Ci0jZW5kaWYKLQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogSGVyZSBlbmRzIHRoZSBzZXJpYWwgaW50ZXJydXB0IHJvdXRpbmVzLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLS8qCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvdyBsZXZlbCB1dGlsaXR5IHN1YnJvdXRpbmVzIGZvciB0aGUgc2VyaWFsIGRyaXZlcjogIHJvdXRpbmVzIHRvCi0gKiBmaWd1cmUgb3V0IHRoZSBhcHByb3ByaWF0ZSB0aW1lb3V0IGZvciBhbiBpbnRlcnJ1cHQgY2hhaW4sIHJvdXRpbmVzCi0gKiB0byBpbml0aWFsaXplIGFuZCBzdGFydHVwIGEgc2VyaWFsIHBvcnQsIGFuZCByb3V0aW5lcyB0byBzaHV0ZG93biBhCi0gKiBzZXJpYWwgcG9ydC4gIFVzZWZ1bCBzdHVmZiBsaWtlIHRoYXQuCi0gKgotICogQ2FsbGVyIHNob3VsZCBob2xkIGxvY2sKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLXN0YXRpYyB2b2lkIGVzcF9iYXNpY19pbml0KHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvKQotewotCS8qIHB1dCBFU1BDIGluIGVuaGFuY2VkIG1vZGUgKi8KLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfTU9ERSk7Ci0KLQlpZiAoaW5mby0+c3RhdF9mbGFncyAmIEVTUF9TVEFUX05FVkVSX0RNQSkKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDAxKTsKLQllbHNlCi0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgzMSk7Ci0KLQkvKiBkaXNhYmxlIGludGVycnVwdHMgZm9yIG5vdyAqLwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9TUlZfTUFTSyk7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDAwKTsKLQotCS8qIHNldCBpbnRlcnJ1cHQgYW5kIERNQSBjaGFubmVsICovCi0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX0lSUSk7Ci0KLQlpZiAoaW5mby0+c3RhdF9mbGFncyAmIEVTUF9TVEFUX05FVkVSX0RNQSkKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDAxKTsKLQllbHNlCi0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgKGRtYSA8PCA0KSB8IDB4MDEpOwotCi0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX0VOSF9JUlEpOwotCi0JaWYgKGluZm8tPmxpbmUgJSA4KQkvKiBzZWNvbmRhcnkgcG9ydCAqLwotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MGQpOwkvKiBzaGFyZWQgKi8KLQllbHNlIGlmIChpbmZvLT5pcnEgPT0gOSkKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDAyKTsKLQllbHNlCi0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+aXJxKTsKLQotCS8qIHNldCBlcnJvciBzdGF0dXMgbWFzayAoY2hlY2sgdGhpcykgKi8KLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfRVJSX01BU0spOwotCi0JaWYgKGluZm8tPnN0YXRfZmxhZ3MgJiBFU1BfU1RBVF9ORVZFUl9ETUEpCi0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHhhMSk7Ci0JZWxzZQotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4YmQpOwotCi0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDAwKTsKLQotCS8qIHNldCBETUEgdGltZW91dCAqLwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9ETUFfVE1PVVQpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHhmZik7Ci0KLQkvKiBzZXQgRklGTyB0cmlnZ2VyIGxldmVscyAqLwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9UUklHR0VSKTsKLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPmNvbmZpZy5yeF90cmlnZ2VyID4+IDgpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+Y29uZmlnLnJ4X3RyaWdnZXIpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+Y29uZmlnLnR4X3RyaWdnZXIgPj4gOCk7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5jb25maWcudHhfdHJpZ2dlcik7Ci0KLQkvKiBTZXQgY2xvY2sgc2NhbGluZyBhbmQgd2FpdCBzdGF0ZXMgKi8KLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfUFJFU0NBTEFSKTsKLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MDQgfCBFU1BDX1NDQUxFKTsKLQotCS8qIHNldCByZWludGVycnVwdCBwYWNpbmcgKi8KLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfUkVJTlRSKTsKLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4ZmYpOwotfQotCi1zdGF0aWMgaW50IHN0YXJ0dXAoc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQJcmV0dmFsID0gMDsKLQl1bnNpZ25lZCBpbnQgbnVtX2NoYXJzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQotCWlmIChpbmZvLT5wb3J0LmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpCi0JCWdvdG8gb3V0OwotCi0JaWYgKCFpbmZvLT54bWl0X2J1ZikgewotCQlpbmZvLT54bWl0X2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopZ2V0X3plcm9lZF9wYWdlKEdGUF9BVE9NSUMpOwotCQlyZXR2YWwgPSAtRU5PTUVNOwotCQlpZiAoIWluZm8tPnhtaXRfYnVmKQotCQkJZ290byBvdXQ7Ci0JfQotCi0jaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KLQlwcmludGsoS0VSTl9ERUJVRyAic3RhcnRpbmcgdXAgdHR5cyVkIChpcnEgJWQpLi4uIiwKLQkJCQkJCWluZm8tPmxpbmUsIGluZm8tPmlycSk7Ci0jZW5kaWYKLQotCS8qIEZsdXNoIHRoZSBSWCBidWZmZXIuICBVc2luZyB0aGUgRVNJIGZsdXNoIGNvbW1hbmQgbWF5IGNhdXNlICovCi0JLyogd2lsZCBpbnRlcnJ1cHRzLCBzbyByZWFkIGFsbCB0aGUgZGF0YSBpbnN0ZWFkLiAqLwotCi0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfTk9fQ09NTUFORCk7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfR0VUX1JYX0FWQUlMKTsKLQludW1fY2hhcnMgPSBzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfU1RBVDEpIDw8IDg7Ci0JbnVtX2NoYXJzIHw9IHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMik7Ci0KLQl3aGlsZSAobnVtX2NoYXJzID4gMSkgewotCQlpbncoaW5mby0+aW9fcG9ydCArIFVBUlRfRVNJX1JYKTsKLQkJbnVtX2NoYXJzIC09IDI7Ci0JfQotCi0JaWYgKG51bV9jaGFycykKLQkJc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1JYKTsKLQotCS8qIHNldCByZWNlaXZlIGNoYXJhY3RlciB0aW1lb3V0ICovCi0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1JYX1RJTUVPVVQpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+Y29uZmlnLnJ4X3RpbWVvdXQpOwotCi0JLyogY2xlYXIgYWxsIGZsYWdzIGV4Y2VwdCB0aGUgIm5ldmVyIERNQSIgZmxhZyAqLwotCWluZm8tPnN0YXRfZmxhZ3MgJj0gRVNQX1NUQVRfTkVWRVJfRE1BOwotCi0JaWYgKGluZm8tPnN0YXRfZmxhZ3MgJiBFU1BfU1RBVF9ORVZFUl9ETUEpCi0JCWluZm8tPnN0YXRfZmxhZ3MgfD0gRVNQX1NUQVRfVVNFX1BJTzsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQotCS8qCi0JICogQWxsb2NhdGUgdGhlIElSUQotCSAqLwotCi0JcmV0dmFsID0gcmVxdWVzdF9pcnEoaW5mby0+aXJxLCByc19pbnRlcnJ1cHRfc2luZ2xlLCBJUlFGX1NIQVJFRCwKLQkJCSAgICAgImVzcCBzZXJpYWwiLCBpbmZvKTsKLQotCWlmIChyZXR2YWwpIHsKLQkJaWYgKGNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKLQkJCWlmIChpbmZvLT5wb3J0LnR0eSkKLQkJCQlzZXRfYml0KFRUWV9JT19FUlJPUiwKLQkJCQkJJmluZm8tPnBvcnQudHR5LT5mbGFncyk7Ci0JCQlyZXR2YWwgPSAwOwotCQl9Ci0JCWdvdG8gb3V0X3VubG9ja2VkOwotCX0KLQotCWlmICghKGluZm8tPnN0YXRfZmxhZ3MgJiBFU1BfU1RBVF9VU0VfUElPKSAmJiAhZG1hX2J1ZmZlcikgewotCQlkbWFfYnVmZmVyID0gKGNoYXIgKilfX2dldF9kbWFfcGFnZXMoCi0JCQlHRlBfS0VSTkVMLCBnZXRfb3JkZXIoRE1BX0JVRkZFUl9TWikpOwotCi0JCS8qIHVzZSBQSU8gbW9kZSBpZiBETUEgYnVmL2NoYW4gY2Fubm90IGJlIGFsbG9jYXRlZCAqLwotCQlpZiAoIWRtYV9idWZmZXIpCi0JCQlpbmZvLT5zdGF0X2ZsYWdzIHw9IEVTUF9TVEFUX1VTRV9QSU87Ci0JCWVsc2UgaWYgKHJlcXVlc3RfZG1hKGRtYSwgImVzcCBzZXJpYWwiKSkgewotCQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylkbWFfYnVmZmVyLAotCQkJCSAgIGdldF9vcmRlcihETUFfQlVGRkVSX1NaKSk7Ci0JCQlkbWFfYnVmZmVyID0gTlVMTDsKLQkJCWluZm8tPnN0YXRfZmxhZ3MgfD0gRVNQX1NUQVRfVVNFX1BJTzsKLQkJfQotCi0JfQotCi0JaW5mby0+TUNSID0gVUFSVF9NQ1JfRFRSIHwgVUFSVF9NQ1JfUlRTIHwgVUFSVF9NQ1JfT1VUMjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfV1JJVEVfVUFSVCk7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBVQVJUX01DUik7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5NQ1IpOwotCi0JLyoKLQkgKiBGaW5hbGx5LCBlbmFibGUgaW50ZXJydXB0cwotCSAqLwotCS8qIGluZm8tPklFUiA9IFVBUlRfSUVSX01TSSB8IFVBUlRfSUVSX1JMU0kgfCBVQVJUX0lFUl9SREk7ICovCi0JaW5mby0+SUVSID0gVUFSVF9JRVJfUkxTSSB8IFVBUlRfSUVSX1JESSB8IFVBUlRfSUVSX0RNQV9UTU9VVCB8Ci0JCQlVQVJUX0lFUl9ETUFfVEM7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1NSVl9NQVNLKTsKLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPklFUik7Ci0KLQlpZiAoaW5mby0+cG9ydC50dHkpCi0JCWNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT5wb3J0LnR0eS0+ZmxhZ3MpOwotCWluZm8tPnhtaXRfY250ID0gaW5mby0+eG1pdF9oZWFkID0gaW5mby0+eG1pdF90YWlsID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0KLQkvKgotCSAqIFNldCB1cCB0aGUgdHR5LT5hbHRfc3BlZWQga2x1ZGdlCi0JICovCi0JaWYgKGluZm8tPnBvcnQudHR5KSB7Ci0JCWlmICgoaW5mby0+cG9ydC5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfSEkpCi0JCQlpbmZvLT5wb3J0LnR0eS0+YWx0X3NwZWVkID0gNTc2MDA7Ci0JCWlmICgoaW5mby0+cG9ydC5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfVkhJKQotCQkJaW5mby0+cG9ydC50dHktPmFsdF9zcGVlZCA9IDExNTIwMDsKLQkJaWYgKChpbmZvLT5wb3J0LmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9TSEkpCi0JCQlpbmZvLT5wb3J0LnR0eS0+YWx0X3NwZWVkID0gMjMwNDAwOwotCQlpZiAoKGluZm8tPnBvcnQuZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1dBUlApCi0JCQlpbmZvLT5wb3J0LnR0eS0+YWx0X3NwZWVkID0gNDYwODAwOwotCX0KLQotCS8qCi0JICogc2V0IHRoZSBzcGVlZCBvZiB0aGUgc2VyaWFsIHBvcnQKLQkgKi8KLQljaGFuZ2Vfc3BlZWQoaW5mbyk7Ci0JaW5mby0+cG9ydC5mbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKLQlyZXR1cm4gMDsKLQotb3V0OgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLW91dF91bmxvY2tlZDoKLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKgotICogVGhpcyByb3V0aW5lIHdpbGwgc2h1dGRvd24gYSBzZXJpYWwgcG9ydDsgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQsIGFuZAotICogRFRSIGlzIGRyb3BwZWQgaWYgdGhlIGhhbmd1cCBvbiBjbG9zZSB0ZXJtaW8gZmxhZyBpcyBvbi4KLSAqLwotc3RhdGljIHZvaWQgc2h1dGRvd24oc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8pCi17Ci0JdW5zaWduZWQgbG9uZwlmbGFncywgZjsKLQotCWlmICghKGluZm8tPnBvcnQuZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpCi0JCXJldHVybjsKLQotI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCi0JcHJpbnRrKCJTaHV0dGluZyBkb3duIHNlcmlhbCBwb3J0ICVkIChpcnEgJWQpLi4uLiIsIGluZm8tPmxpbmUsCi0JICAgICAgIGluZm8tPmlycSk7Ci0jZW5kaWYKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JLyoKLQkgKiBjbGVhciBkZWx0YV9tc3Jfd2FpdCBxdWV1ZSB0byBhdm9pZCBtZW0gbGVha3M6IHdlIG1heSBmcmVlIHRoZSBpcnEKLQkgKiBoZXJlIHNvIHRoZSBxdWV1ZSBtaWdodCBuZXZlciBiZSB3YWtlbiB1cAotCSAqLwotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+cG9ydC5kZWx0YV9tc3Jfd2FpdCk7Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5icmVha193YWl0KTsKLQotCS8qIHN0b3AgYSBETUEgdHJhbnNmZXIgb24gdGhlIHBvcnQgYmVpbmcgY2xvc2VkICovCi0JLyogRE1BIGxvY2sgaXMgaGlnaGVyIHByaW9yaXR5IGFsd2F5cyAqLwotCWlmIChpbmZvLT5zdGF0X2ZsYWdzICYgKEVTUF9TVEFUX0RNQV9SWCB8IEVTUF9TVEFUX0RNQV9UWCkpIHsKLQkJZiA9IGNsYWltX2RtYV9sb2NrKCk7Ci0JCWRpc2FibGVfZG1hKGRtYSk7Ci0JCWNsZWFyX2RtYV9mZihkbWEpOwotCQlyZWxlYXNlX2RtYV9sb2NrKGYpOwotCi0JCWRtYV9ieXRlcyA9IDA7Ci0JfQotCi0JLyoKLQkgKiBGcmVlIHRoZSBJUlEKLQkgKi8KLQlmcmVlX2lycShpbmZvLT5pcnEsIGluZm8pOwotCi0JaWYgKGRtYV9idWZmZXIpIHsKLQkJc3RydWN0IGVzcF9zdHJ1Y3QgKmN1cnJlbnRfcG9ydCA9IHBvcnRzOwotCi0JCXdoaWxlIChjdXJyZW50X3BvcnQpIHsKLQkJCWlmICgoY3VycmVudF9wb3J0ICE9IGluZm8pICYmCi0JCQkgICAgKGN1cnJlbnRfcG9ydC0+cG9ydC5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkKLQkJCQlicmVhazsKLQotCQkJY3VycmVudF9wb3J0ID0gY3VycmVudF9wb3J0LT5uZXh0X3BvcnQ7Ci0JCX0KLQotCQlpZiAoIWN1cnJlbnRfcG9ydCkgewotCQkJZnJlZV9kbWEoZG1hKTsKLQkJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpZG1hX2J1ZmZlciwKLQkJCQkgICBnZXRfb3JkZXIoRE1BX0JVRkZFUl9TWikpOwotCQkJZG1hX2J1ZmZlciA9IE5VTEw7Ci0JCX0KLQl9Ci0KLQlpZiAoaW5mby0+eG1pdF9idWYpIHsKLQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBpbmZvLT54bWl0X2J1Zik7Ci0JCWluZm8tPnhtaXRfYnVmID0gTlVMTDsKLQl9Ci0KLQlpbmZvLT5JRVIgPSAwOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9TUlZfTUFTSyk7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDAwKTsKLQotCWlmICghaW5mby0+cG9ydC50dHkgfHwgKGluZm8tPnBvcnQudHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wpKQotCQlpbmZvLT5NQ1IgJj0gfihVQVJUX01DUl9EVFJ8VUFSVF9NQ1JfUlRTKTsKLQotCWluZm8tPk1DUiAmPSB+VUFSVF9NQ1JfT1VUMjsKLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9XUklURV9VQVJUKTsKLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIFVBUlRfTUNSKTsKLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPk1DUik7Ci0KLQlpZiAoaW5mby0+cG9ydC50dHkpCi0JCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+cG9ydC50dHktPmZsYWdzKTsKLQotCWluZm8tPnBvcnQuZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLX0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gc2V0IHRoZSBVQVJUIGRpdmlzb3IgcmVnaXN0ZXJzIHRvIG1hdGNoCi0gKiB0aGUgc3BlY2lmaWVkIGJhdWQgcmF0ZSBmb3IgYSBzZXJpYWwgcG9ydC4KLSAqLwotc3RhdGljIHZvaWQgY2hhbmdlX3NwZWVkKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvKQotewotCXVuc2lnbmVkIHNob3J0IHBvcnQ7Ci0JaW50CXF1b3QgPSAwOwotCXVuc2lnbmVkIGNmbGFnLCBjdmFsOwotCWludAliYXVkLCBiaXRzOwotCXVuc2lnbmVkIGNoYXIgZmxvdzEgPSAwLCBmbG93MiA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghaW5mby0+cG9ydC50dHkgfHwgIWluZm8tPnBvcnQudHR5LT50ZXJtaW9zKQotCQlyZXR1cm47Ci0JY2ZsYWcgPSBpbmZvLT5wb3J0LnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKLQlwb3J0ID0gaW5mby0+aW9fcG9ydDsKLQotCS8qIGJ5dGUgc2l6ZSBhbmQgcGFyaXR5ICovCi0Jc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7Ci0JY2FzZSBDUzU6IGN2YWwgPSAweDAwOyBiaXRzID0gNzsgYnJlYWs7Ci0JY2FzZSBDUzY6IGN2YWwgPSAweDAxOyBiaXRzID0gODsgYnJlYWs7Ci0JY2FzZSBDUzc6IGN2YWwgPSAweDAyOyBiaXRzID0gOTsgYnJlYWs7Ci0JY2FzZSBDUzg6IGN2YWwgPSAweDAzOyBiaXRzID0gMTA7IGJyZWFrOwotCWRlZmF1bHQ6ICBjdmFsID0gMHgwMDsgYml0cyA9IDc7IGJyZWFrOwotCX0KLQlpZiAoY2ZsYWcgJiBDU1RPUEIpIHsKLQkJY3ZhbCB8PSAweDA0OwotCQliaXRzKys7Ci0JfQotCWlmIChjZmxhZyAmIFBBUkVOQikgewotCQljdmFsIHw9IFVBUlRfTENSX1BBUklUWTsKLQkJYml0cysrOwotCX0KLQlpZiAoIShjZmxhZyAmIFBBUk9ERCkpCi0JCWN2YWwgfD0gVUFSVF9MQ1JfRVBBUjsKLSNpZmRlZiBDTVNQQVIKLQlpZiAoY2ZsYWcgJiBDTVNQQVIpCi0JCWN2YWwgfD0gVUFSVF9MQ1JfU1BBUjsKLSNlbmRpZgotCWJhdWQgPSB0dHlfZ2V0X2JhdWRfcmF0ZShpbmZvLT5wb3J0LnR0eSk7Ci0JaWYgKGJhdWQgPT0gMzg0MDAgJiYKLQkJKChpbmZvLT5wb3J0LmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9DVVNUKSkKLQkJcXVvdCA9IGluZm8tPmN1c3RvbV9kaXZpc29yOwotCWVsc2UgewotCQlpZiAoYmF1ZCA9PSAxMzQpIC8qIFNwZWNpYWwgY2FzZSBzaW5jZSAxMzQgaXMgcmVhbGx5IDEzNC41ICovCi0JCQlxdW90ID0gKDIqQkFTRV9CQVVEIC8gMjY5KTsKLQkJZWxzZSBpZiAoYmF1ZCkKLQkJCXF1b3QgPSBCQVNFX0JBVUQgLyBiYXVkOwotCX0KLQkvKiBJZiB0aGUgcXVvdGllbnQgaXMgZXZlciB6ZXJvLCBkZWZhdWx0IHRvIDk2MDAgYnBzICovCi0JaWYgKCFxdW90KQotCQlxdW90ID0gQkFTRV9CQVVEIC8gOTYwMDsKLQotCWlmIChiYXVkKSB7Ci0JCS8qIEFjdHVhbCByYXRlICovCi0JCWJhdWQgPSBCQVNFX0JBVUQvcXVvdDsKLQkJdHR5X2VuY29kZV9iYXVkX3JhdGUoaW5mby0+cG9ydC50dHksIGJhdWQsIGJhdWQpOwotCX0KLQlpbmZvLT50aW1lb3V0ID0gKCgxMDI0ICogSFogKiBiaXRzICogcXVvdCkgLyBCQVNFX0JBVUQpICsgKEhaIC8gNTApOwotCi0JLyogQ1RTIGZsb3cgY29udHJvbCBmbGFnIGFuZCBtb2RlbSBzdGF0dXMgaW50ZXJydXB0cyAqLwotCS8qIGluZm8tPklFUiAmPSB+VUFSVF9JRVJfTVNJOyAqLwotCWlmIChjZmxhZyAmIENSVFNDVFMpIHsKLQkJaW5mby0+cG9ydC5mbGFncyB8PSBBU1lOQ19DVFNfRkxPVzsKLQkJLyogaW5mby0+SUVSIHw9IFVBUlRfSUVSX01TSTsgKi8KLQkJZmxvdzEgPSAweDA0OwotCQlmbG93MiA9IDB4MTA7Ci0JfSBlbHNlCi0JCWluZm8tPnBvcnQuZmxhZ3MgJj0gfkFTWU5DX0NUU19GTE9XOwotCWlmIChjZmxhZyAmIENMT0NBTCkKLQkJaW5mby0+cG9ydC5mbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7Ci0JZWxzZQotCQlpbmZvLT5wb3J0LmZsYWdzIHw9IEFTWU5DX0NIRUNLX0NEOwotCi0JLyoKLQkgKiBTZXQgdXAgcGFyaXR5IGNoZWNrIGZsYWcKLQkgKi8KLQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrID0gVUFSVF9MU1JfT0UgfCBVQVJUX0xTUl9USFJFIHwgVUFSVF9MU1JfRFI7Ci0JaWYgKElfSU5QQ0soaW5mby0+cG9ydC50dHkpKQotCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0ZFIHwgVUFSVF9MU1JfUEU7Ci0JaWYgKElfQlJLSU5UKGluZm8tPnBvcnQudHR5KSB8fCBJX1BBUk1SSyhpbmZvLT5wb3J0LnR0eSkpCi0JCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfQkk7Ci0KLQlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgPSAwOwotI2lmIDAKLQkvKiBUaGlzIHNob3VsZCBiZSBzYWZlLCBidXQgZm9yIHNvbWUgYnJva2VuIGJpdHMgb2YgaGFyZHdhcmUuLi4gKi8KLQlpZiAoSV9JR05QQVIoaW5mby0+cG9ydC50dHkpKSB7Ci0JCWluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9QRSB8IFVBUlRfTFNSX0ZFOwotCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX1BFIHwgVUFSVF9MU1JfRkU7Ci0JfQotI2VuZGlmCi0JaWYgKElfSUdOQlJLKGluZm8tPnBvcnQudHR5KSkgewotCQlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfQkk7Ci0JCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfQkk7Ci0JCS8qCi0JCSAqIElmIHdlJ3JlIGlnbm9yZSBwYXJpdHkgYW5kIGJyZWFrIGluZGljYXRvcnMsIGlnbm9yZQotCQkgKiBvdmVycnVucyB0b28uICAoRm9yIHJlYWwgcmF3IHN1cHBvcnQpLgotCQkgKi8KLQkJaWYgKElfSUdOUEFSKGluZm8tPnBvcnQudHR5KSkgewotCQkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX09FIHwgXAotCQkJCVVBUlRfTFNSX1BFIHwgVUFSVF9MU1JfRkU7Ci0JCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX09FIHwgXAotCQkJCVVBUlRfTFNSX1BFIHwgVUFSVF9MU1JfRkU7Ci0JCX0KLQl9Ci0KLQlpZiAoSV9JWE9GRihpbmZvLT5wb3J0LnR0eSkpCi0JCWZsb3cxIHw9IDB4ODE7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCS8qIHNldCBiYXVkICovCi0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX0JBVUQpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgcXVvdCA+PiA4KTsKLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIHF1b3QgJiAweGZmKTsKLQotCS8qIHNldCBkYXRhIGJpdHMsIHBhcml0eSwgZXRjLiAqLwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1dSSVRFX1VBUlQpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgVUFSVF9MQ1IpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgY3ZhbCk7Ci0KLQkvKiBFbmFibGUgZmxvdyBjb250cm9sICovCi0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX0ZMT1dfQ05UTCk7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBmbG93MSk7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBmbG93Mik7Ci0KLQkvKiBzZXQgZmxvdyBjb250cm9sIGNoYXJhY3RlcnMgKFhPTi9YT0ZGIG9ubHkpICovCi0JaWYgKElfSVhPRkYoaW5mby0+cG9ydC50dHkpKSB7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9GTE9XX0NIQVJTKTsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBTVEFSVF9DSEFSKGluZm8tPnBvcnQudHR5KSk7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgU1RPUF9DSEFSKGluZm8tPnBvcnQudHR5KSk7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgxMCk7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgyMSk7Ci0JCXN3aXRjaCAoY2ZsYWcgJiBDU0laRSkgewotCQljYXNlIENTNToKLQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgxZik7Ci0JCQlicmVhazsKLQkJY2FzZSBDUzY6Ci0JCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4M2YpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ1M3OgotCQljYXNlIENTODoKLQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHg3Zik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHhmZik7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qIFNldCBoaWdoL2xvdyB3YXRlciAqLwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9GTE9XX0xWTCk7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5jb25maWcuZmxvd19vZmYgPj4gOCk7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5jb25maWcuZmxvd19vZmYpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+Y29uZmlnLmZsb3dfb24gPj4gOCk7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5jb25maWcuZmxvd19vbik7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgcnNfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjaCkKLXsKLQlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfcHV0X2NoYXIiKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIWluZm8tPnhtaXRfYnVmKQotCQlyZXR1cm4gMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JaWYgKGluZm8tPnhtaXRfY250IDwgRVNQX1hNSVRfU0laRSAtIDEpIHsKLQkJaW5mby0+eG1pdF9idWZbaW5mby0+eG1pdF9oZWFkKytdID0gY2g7Ci0JCWluZm8tPnhtaXRfaGVhZCAmPSBFU1BfWE1JVF9TSVpFLTE7Ci0JCWluZm8tPnhtaXRfY250Kys7Ci0JCXJldCA9IDE7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCByc19mbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19mbHVzaF9jaGFycyIpKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKGluZm8tPnhtaXRfY250IDw9IDAgfHwgdHR5LT5zdG9wcGVkIHx8ICFpbmZvLT54bWl0X2J1ZikKLQkJZ290byBvdXQ7Ci0KLQlpZiAoIShpbmZvLT5JRVIgJiBVQVJUX0lFUl9USFJJKSkgewotCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1NSVl9NQVNLKTsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5JRVIpOwotCX0KLW91dDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgcnNfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQotewotCWludAljLCB0LCByZXQgPSAwOwotCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc193cml0ZSIpKQotCQlyZXR1cm4gMDsKLQotCWlmICghaW5mby0+eG1pdF9idWYpCi0JCXJldHVybiAwOwotCi0Jd2hpbGUgKDEpIHsKLQkJLyogVGhhbmtzIHRvIFIuIFdvbGZmIGZvciBzdWdnZXN0aW5nIGhvdyB0byBkbyB0aGlzIHdpdGggKi8KLQkJLyogaW50ZXJydXB0cyBlbmFibGVkICovCi0KLQkJYyA9IGNvdW50OwotCQl0ID0gRVNQX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfY250IC0gMTsKLQotCQlpZiAodCA8IGMpCi0JCQljID0gdDsKLQotCQl0ID0gRVNQX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfaGVhZDsKLQotCQlpZiAodCA8IGMpCi0JCQljID0gdDsKLQotCQlpZiAoYyA8PSAwKQotCQkJYnJlYWs7Ci0KLQkJbWVtY3B5KGluZm8tPnhtaXRfYnVmICsgaW5mby0+eG1pdF9oZWFkLCBidWYsIGMpOwotCi0JCWluZm8tPnhtaXRfaGVhZCA9IChpbmZvLT54bWl0X2hlYWQgKyBjKSAmIChFU1BfWE1JVF9TSVpFLTEpOwotCQlpbmZvLT54bWl0X2NudCArPSBjOwotCQlidWYgKz0gYzsKLQkJY291bnQgLT0gYzsKLQkJcmV0ICs9IGM7Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQotCWlmIChpbmZvLT54bWl0X2NudCAmJiAhdHR5LT5zdG9wcGVkICYmICEoaW5mby0+SUVSICYgVUFSVF9JRVJfVEhSSSkpIHsKLQkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9TUlZfTUFTSyk7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+SUVSKTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCByc193cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwotCWludAlyZXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfd3JpdGVfcm9vbSIpKQotCQlyZXR1cm4gMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXQgPSBFU1BfWE1JVF9TSVpFIC0gaW5mby0+eG1pdF9jbnQgLSAxOwotCWlmIChyZXQgPCAwKQotCQlyZXQgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHJzX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKLQotCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfY2hhcnNfaW5fYnVmZmVyIikpCi0JCXJldHVybiAwOwotCXJldHVybiBpbmZvLT54bWl0X2NudDsKLX0KLQotc3RhdGljIHZvaWQgcnNfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX2ZsdXNoX2J1ZmZlciIpKQotCQlyZXR1cm47Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQlpbmZvLT54bWl0X2NudCA9IGluZm8tPnhtaXRfaGVhZCA9IGluZm8tPnhtaXRfdGFpbCA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCXR0eV93YWtldXAodHR5KTsKLX0KLQotLyoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogcnNfdGhyb3R0bGUoKQotICoKLSAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIHVwcGVyLWxheWVyIHR0eSBsYXllciB0byBzaWduYWwgdGhhdAotICogaW5jb21pbmcgY2hhcmFjdGVycyBzaG91bGQgYmUgdGhyb3R0bGVkLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLXN0YXRpYyB2b2lkIHJzX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0jaWZkZWYgU0VSSUFMX0RFQlVHX1RIUk9UVExFCi0JY2hhcglidWZbNjRdOwotCi0JcHJpbnRrKCJ0aHJvdHRsZSAlczogJWQuLi4uXG4iLCB0dHlfbmFtZSh0dHksIGJ1ZiksCi0JCQkJCQl0dHlfY2hhcnNfaW5fYnVmZmVyKHR0eSkpOwotI2VuZGlmCi0KLQlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3Rocm90dGxlIikpCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JaW5mby0+SUVSICY9IH5VQVJUX0lFUl9SREk7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1NSVl9NQVNLKTsKLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPklFUik7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1JYX1RJTUVPVVQpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgwMCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCByc191bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0jaWZkZWYgU0VSSUFMX0RFQlVHX1RIUk9UVExFCi0JY2hhcglidWZbNjRdOwotCi0JcHJpbnRrKEtFUk5fREVCVUcgInVudGhyb3R0bGUgJXM6ICVkLi4uLlxuIiwgdHR5X25hbWUodHR5LCBidWYpLAotCSAgICAgICB0dHlfY2hhcnNfaW5fYnVmZmVyKHR0eSkpOwotI2VuZGlmCi0KLQlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3VudGhyb3R0bGUiKSkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfUkRJOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9TUlZfTUFTSyk7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBpbmZvLT5JRVIpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1NFVF9SWF9USU1FT1VUKTsKLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPmNvbmZpZy5yeF90aW1lb3V0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci19Ci0KLS8qCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHJzX2lvY3RsKCkgYW5kIGZyaWVuZHMKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLXN0YXRpYyBpbnQgZ2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvLAotCQkJICAgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpyZXRpbmZvKQotewotCXN0cnVjdCBzZXJpYWxfc3RydWN0IHRtcDsKLQotCWxvY2tfa2VybmVsKCk7Ci0JbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKLQl0bXAudHlwZSA9IFBPUlRfMTY1NTBBOwotCXRtcC5saW5lID0gaW5mby0+bGluZTsKLQl0bXAucG9ydCA9IGluZm8tPmlvX3BvcnQ7Ci0JdG1wLmlycSA9IGluZm8tPmlycTsKLQl0bXAuZmxhZ3MgPSBpbmZvLT5wb3J0LmZsYWdzOwotCXRtcC54bWl0X2ZpZm9fc2l6ZSA9IDEwMjQ7Ci0JdG1wLmJhdWRfYmFzZSA9IEJBU0VfQkFVRDsKLQl0bXAuY2xvc2VfZGVsYXkgPSBpbmZvLT5jbG9zZV9kZWxheTsKLQl0bXAuY2xvc2luZ193YWl0ID0gaW5mby0+Y2xvc2luZ193YWl0OwotCXRtcC5jdXN0b21fZGl2aXNvciA9IGluZm8tPmN1c3RvbV9kaXZpc29yOwotCXRtcC5odWI2ID0gMDsKLQl1bmxvY2tfa2VybmVsKCk7Ci0JaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCAmdG1wLCBzaXplb2YoKnJldGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2VzcF9jb25maWcoc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8sCi0JCQkgIHN0cnVjdCBoYXllc19lc3BfY29uZmlnIF9fdXNlciAqcmV0aW5mbykKLXsKLQlzdHJ1Y3QgaGF5ZXNfZXNwX2NvbmZpZyB0bXA7Ci0KLQlpZiAoIXJldGluZm8pCi0JCXJldHVybiAtRUZBVUxUOwotCi0JbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKLQlsb2NrX2tlcm5lbCgpOwotCXRtcC5yeF90aW1lb3V0ID0gaW5mby0+Y29uZmlnLnJ4X3RpbWVvdXQ7Ci0JdG1wLnJ4X3RyaWdnZXIgPSBpbmZvLT5jb25maWcucnhfdHJpZ2dlcjsKLQl0bXAudHhfdHJpZ2dlciA9IGluZm8tPmNvbmZpZy50eF90cmlnZ2VyOwotCXRtcC5mbG93X29mZiA9IGluZm8tPmNvbmZpZy5mbG93X29mZjsKLQl0bXAuZmxvd19vbiA9IGluZm8tPmNvbmZpZy5mbG93X29uOwotCXRtcC5waW9fdGhyZXNob2xkID0gaW5mby0+Y29uZmlnLnBpb190aHJlc2hvbGQ7Ci0JdG1wLmRtYV9jaGFubmVsID0gKGluZm8tPnN0YXRfZmxhZ3MgJiBFU1BfU1RBVF9ORVZFUl9ETUEgPyAwIDogZG1hKTsKLQl1bmxvY2tfa2VybmVsKCk7Ci0KLQlyZXR1cm4gY29weV90b191c2VyKHJldGluZm8sICZ0bXAsIHNpemVvZigqcmV0aW5mbykpID8gLUVGQVVMVCA6IDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvLAotCQkJICAgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpuZXdfaW5mbykKLXsKLQlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBuZXdfc2VyaWFsOwotCXN0cnVjdCBlc3Bfc3RydWN0IG9sZF9pbmZvOwotCXVuc2lnbmVkIGludCBjaGFuZ2VfaXJxOwotCWludCByZXR2YWwgPSAwOwotCXN0cnVjdCBlc3Bfc3RydWN0ICpjdXJyZW50X2FzeW5jOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfc2VyaWFsLCBuZXdfaW5mbywgc2l6ZW9mKG5ld19zZXJpYWwpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0Jb2xkX2luZm8gPSAqaW5mbzsKLQotCWlmICgobmV3X3NlcmlhbC50eXBlICE9IFBPUlRfMTY1NTBBKSB8fAotCSAgICAobmV3X3NlcmlhbC5odWI2KSB8fAotCSAgICAoaW5mby0+aW9fcG9ydCAhPSBuZXdfc2VyaWFsLnBvcnQpIHx8Ci0JICAgIChuZXdfc2VyaWFsLmJhdWRfYmFzZSAhPSBCQVNFX0JBVUQpIHx8Ci0JICAgIChuZXdfc2VyaWFsLmlycSA+IDE1KSB8fAotCSAgICAobmV3X3NlcmlhbC5pcnEgPCAyKSB8fAotCSAgICAobmV3X3NlcmlhbC5pcnEgPT0gNikgfHwKLQkgICAgKG5ld19zZXJpYWwuaXJxID09IDgpIHx8Ci0JICAgIChuZXdfc2VyaWFsLmlycSA9PSAxMykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JY2hhbmdlX2lycSA9IG5ld19zZXJpYWwuaXJxICE9IGluZm8tPmlycTsKLQotCWlmIChjaGFuZ2VfaXJxICYmIChpbmZvLT5saW5lICUgOCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7Ci0JCWlmIChjaGFuZ2VfaXJxIHx8Ci0JCSAgICAobmV3X3NlcmlhbC5jbG9zZV9kZWxheSAhPSBpbmZvLT5jbG9zZV9kZWxheSkgfHwKLQkJICAgICgobmV3X3NlcmlhbC5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgIT0KLQkJICAgICAoaW5mby0+cG9ydC5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykpKQotCQkJcmV0dXJuIC1FUEVSTTsKLQkJaW5mby0+cG9ydC5mbGFncyA9ICgoaW5mby0+cG9ydC5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgfAotCQkJICAgICAgIChuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfVVNSX01BU0spKTsKLQkJaW5mby0+Y3VzdG9tX2Rpdmlzb3IgPSBuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yOwotCX0gZWxzZSB7Ci0JCWlmIChuZXdfc2VyaWFsLmlycSA9PSAyKQotCQkJbmV3X3NlcmlhbC5pcnEgPSA5OwotCi0JCWlmIChjaGFuZ2VfaXJxKSB7Ci0JCQljdXJyZW50X2FzeW5jID0gcG9ydHM7Ci0KLQkJCXdoaWxlIChjdXJyZW50X2FzeW5jKSB7Ci0JCQkJaWYgKChjdXJyZW50X2FzeW5jLT5saW5lID49IGluZm8tPmxpbmUpICYmCi0JCQkJICAgIChjdXJyZW50X2FzeW5jLT5saW5lIDwgKGluZm8tPmxpbmUgKyA4KSkpIHsKLQkJCQkJaWYgKGN1cnJlbnRfYXN5bmMgPT0gaW5mbykgewotCQkJCQkJaWYgKGN1cnJlbnRfYXN5bmMtPnBvcnQuY291bnQgPiAxKQotCQkJCQkJCXJldHVybiAtRUJVU1k7Ci0JCQkJCX0gZWxzZSBpZiAoY3VycmVudF9hc3luYy0+cG9ydC5jb3VudCkKLQkJCQkJCXJldHVybiAtRUJVU1k7Ci0JCQkJfQotCi0JCQkJY3VycmVudF9hc3luYyA9IGN1cnJlbnRfYXN5bmMtPm5leHRfcG9ydDsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIE9LLCBwYXN0IHRoaXMgcG9pbnQsIGFsbCB0aGUgZXJyb3IgY2hlY2tpbmcgaGFzIGJlZW4gZG9uZS4KLQkJICogQXQgdGhpcyBwb2ludCwgd2Ugc3RhcnQgbWFraW5nIGNoYW5nZXMuLi4uLgotCQkgKi8KLQotCQlpbmZvLT5wb3J0LmZsYWdzID0gKChpbmZvLT5wb3J0LmZsYWdzICYgfkFTWU5DX0ZMQUdTKSB8Ci0JCQkgICAgICAgKG5ld19zZXJpYWwuZmxhZ3MgJiBBU1lOQ19GTEFHUykpOwotCQlpbmZvLT5jdXN0b21fZGl2aXNvciA9IG5ld19zZXJpYWwuY3VzdG9tX2Rpdmlzb3I7Ci0JCWluZm8tPmNsb3NlX2RlbGF5ID0gbmV3X3NlcmlhbC5jbG9zZV9kZWxheSAqIEhaLzEwMDsKLQkJaW5mby0+Y2xvc2luZ193YWl0ID0gbmV3X3NlcmlhbC5jbG9zaW5nX3dhaXQgKiBIWi8xMDA7Ci0KLQkJaWYgKGNoYW5nZV9pcnEpIHsKLQkJCS8qCi0JCQkgKiBXZSBuZWVkIHRvIHNodXRkb3duIHRoZSBzZXJpYWwgcG9ydCBhdCB0aGUgb2xkCi0JCQkgKiBwb3J0L2lycSBjb21iaW5hdGlvbi4KLQkJCSAqLwotCQkJc2h1dGRvd24oaW5mbyk7Ci0KLQkJCWN1cnJlbnRfYXN5bmMgPSBwb3J0czsKLQotCQkJd2hpbGUgKGN1cnJlbnRfYXN5bmMpIHsKLQkJCQlpZiAoKGN1cnJlbnRfYXN5bmMtPmxpbmUgPj0gaW5mby0+bGluZSkgJiYKLQkJCQkgICAgKGN1cnJlbnRfYXN5bmMtPmxpbmUgPCAoaW5mby0+bGluZSArIDgpKSkKLQkJCQkJY3VycmVudF9hc3luYy0+aXJxID0gbmV3X3NlcmlhbC5pcnE7Ci0KLQkJCQljdXJyZW50X2FzeW5jID0gY3VycmVudF9hc3luYy0+bmV4dF9wb3J0OwotCQkJfQotCi0JCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfRU5IX0lSUSk7Ci0JCQlpZiAoaW5mby0+aXJxID09IDkpCi0JCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDAyKTsKLQkJCWVsc2UKLQkJCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPmlycSk7Ci0JCX0KLQl9Ci0KLQlpZiAoaW5mby0+cG9ydC5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7Ci0JCWlmICgoKG9sZF9pbmZvLnBvcnQuZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgIT0KLQkJICAgICAoaW5mby0+cG9ydC5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSkgfHwKLQkJICAgIChvbGRfaW5mby5jdXN0b21fZGl2aXNvciAhPSBpbmZvLT5jdXN0b21fZGl2aXNvcikpIHsKLQkJCWlmICgoaW5mby0+cG9ydC5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfSEkpCi0JCQkJaW5mby0+cG9ydC50dHktPmFsdF9zcGVlZCA9IDU3NjAwOwotCQkJaWYgKChpbmZvLT5wb3J0LmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9WSEkpCi0JCQkJaW5mby0+cG9ydC50dHktPmFsdF9zcGVlZCA9IDExNTIwMDsKLQkJCWlmICgoaW5mby0+cG9ydC5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfU0hJKQotCQkJCWluZm8tPnBvcnQudHR5LT5hbHRfc3BlZWQgPSAyMzA0MDA7Ci0JCQlpZiAoKGluZm8tPnBvcnQuZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1dBUlApCi0JCQkJaW5mby0+cG9ydC50dHktPmFsdF9zcGVlZCA9IDQ2MDgwMDsKLQkJCWNoYW5nZV9zcGVlZChpbmZvKTsKLQkJfQotCX0gZWxzZQotCQlyZXR2YWwgPSBzdGFydHVwKGluZm8pOwotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIGludCBzZXRfZXNwX2NvbmZpZyhzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbywKLQkJCSAgc3RydWN0IGhheWVzX2VzcF9jb25maWcgX191c2VyICpuZXdfaW5mbykKLXsKLQlzdHJ1Y3QgaGF5ZXNfZXNwX2NvbmZpZyBuZXdfY29uZmlnOwotCXVuc2lnbmVkIGludCBjaGFuZ2VfZG1hOwotCWludCByZXR2YWwgPSAwOwotCXN0cnVjdCBlc3Bfc3RydWN0ICpjdXJyZW50X2FzeW5jOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBQZXJoYXBzIGEgbm9uLXN5c2FkbWluIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gZG8gc29tZSBvZiB0aGVzZSAqLwotCS8qIG9wZXJhdGlvbnMuICBJIGhhdmVuJ3QgZGVjaWRlZCB5ZXQuICovCi0KLQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCXJldHVybiAtRVBFUk07Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19jb25maWcsIG5ld19pbmZvLCBzaXplb2YobmV3X2NvbmZpZykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmICgobmV3X2NvbmZpZy5mbG93X29uID49IG5ld19jb25maWcuZmxvd19vZmYpIHx8Ci0JICAgIChuZXdfY29uZmlnLnJ4X3RyaWdnZXIgPCAxKSB8fAotCSAgICAobmV3X2NvbmZpZy50eF90cmlnZ2VyIDwgMSkgfHwKLQkgICAgKG5ld19jb25maWcuZmxvd19vZmYgPCAxKSB8fAotCSAgICAobmV3X2NvbmZpZy5mbG93X29uIDwgMSkgfHwKLQkgICAgKG5ld19jb25maWcucnhfdHJpZ2dlciA+IDEwMjMpIHx8Ci0JICAgIChuZXdfY29uZmlnLnR4X3RyaWdnZXIgPiAxMDIzKSB8fAotCSAgICAobmV3X2NvbmZpZy5mbG93X29mZiA+IDEwMjMpIHx8Ci0JICAgIChuZXdfY29uZmlnLmZsb3dfb24gPiAxMDIzKSB8fAotCSAgICAobmV3X2NvbmZpZy5waW9fdGhyZXNob2xkIDwgMCkgfHwKLQkgICAgKG5ld19jb25maWcucGlvX3RocmVzaG9sZCA+IDEwMjQpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICgobmV3X2NvbmZpZy5kbWFfY2hhbm5lbCAhPSAxKSAmJiAobmV3X2NvbmZpZy5kbWFfY2hhbm5lbCAhPSAzKSkKLQkJbmV3X2NvbmZpZy5kbWFfY2hhbm5lbCA9IDA7Ci0KLQlpZiAoaW5mby0+c3RhdF9mbGFncyAmIEVTUF9TVEFUX05FVkVSX0RNQSkKLQkJY2hhbmdlX2RtYSA9IG5ld19jb25maWcuZG1hX2NoYW5uZWw7Ci0JZWxzZQotCQljaGFuZ2VfZG1hID0gKG5ld19jb25maWcuZG1hX2NoYW5uZWwgIT0gZG1hKTsKLQotCWlmIChjaGFuZ2VfZG1hKSB7Ci0JCWlmIChuZXdfY29uZmlnLmRtYV9jaGFubmVsKSB7Ci0JCQkvKiBQSU8gbW9kZSB0byBETUEgbW9kZSB0cmFuc2l0aW9uIE9SICovCi0JCQkvKiBjaGFuZ2UgY3VycmVudCBETUEgY2hhbm5lbCAqLwotCQkJY3VycmVudF9hc3luYyA9IHBvcnRzOwotCi0JCQl3aGlsZSAoY3VycmVudF9hc3luYykgewotCQkJCWlmIChjdXJyZW50X2FzeW5jID09IGluZm8pIHsKLQkJCQkJaWYgKGN1cnJlbnRfYXN5bmMtPnBvcnQuY291bnQgPiAxKQotCQkJCQkJcmV0dXJuIC1FQlVTWTsKLQkJCQl9IGVsc2UgaWYgKGN1cnJlbnRfYXN5bmMtPnBvcnQuY291bnQpCi0JCQkJCXJldHVybiAtRUJVU1k7Ci0KLQkJCQljdXJyZW50X2FzeW5jID0gY3VycmVudF9hc3luYy0+bmV4dF9wb3J0OwotCQkJfQotCi0JCQlzaHV0ZG93bihpbmZvKTsKLQkJCWRtYSA9IG5ld19jb25maWcuZG1hX2NoYW5uZWw7Ci0JCQlpbmZvLT5zdGF0X2ZsYWdzICY9IH5FU1BfU1RBVF9ORVZFUl9ETUE7Ci0KLQkJCS8qIGFsbCBwb3J0cyBtdXN0IHVzZSB0aGUgc2FtZSBETUEgY2hhbm5lbCAqLwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCQkJY3VycmVudF9hc3luYyA9IHBvcnRzOwotCi0JCQl3aGlsZSAoY3VycmVudF9hc3luYykgewotCQkJCWVzcF9iYXNpY19pbml0KGN1cnJlbnRfYXN5bmMpOwotCQkJCWN1cnJlbnRfYXN5bmMgPSBjdXJyZW50X2FzeW5jLT5uZXh0X3BvcnQ7Ci0JCQl9Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBETUEgbW9kZSB0byBQSU8gbW9kZSBvbmx5ICovCi0JCQlpZiAoaW5mby0+cG9ydC5jb3VudCA+IDEpCi0JCQkJcmV0dXJuIC1FQlVTWTsKLQotCQkJc2h1dGRvd24oaW5mbyk7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCQkJaW5mby0+c3RhdF9mbGFncyB8PSBFU1BfU1RBVF9ORVZFUl9ETUE7Ci0JCQllc3BfYmFzaWNfaW5pdChpbmZvKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQkJfQotCX0KLQotCWluZm8tPmNvbmZpZy5waW9fdGhyZXNob2xkID0gbmV3X2NvbmZpZy5waW9fdGhyZXNob2xkOwotCi0JaWYgKChuZXdfY29uZmlnLmZsb3dfb2ZmICE9IGluZm8tPmNvbmZpZy5mbG93X29mZikgfHwKLQkgICAgKG5ld19jb25maWcuZmxvd19vbiAhPSBpbmZvLT5jb25maWcuZmxvd19vbikpIHsKLQkJaW5mby0+Y29uZmlnLmZsb3dfb2ZmID0gbmV3X2NvbmZpZy5mbG93X29mZjsKLQkJaW5mby0+Y29uZmlnLmZsb3dfb24gPSBuZXdfY29uZmlnLmZsb3dfb247Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX0ZMT1dfTFZMKTsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBuZXdfY29uZmlnLmZsb3dfb2ZmID4+IDgpOwotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIG5ld19jb25maWcuZmxvd19vZmYpOwotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIG5ld19jb25maWcuZmxvd19vbiA+PiA4KTsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBuZXdfY29uZmlnLmZsb3dfb24pOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JfQotCi0JaWYgKChuZXdfY29uZmlnLnJ4X3RyaWdnZXIgIT0gaW5mby0+Y29uZmlnLnJ4X3RyaWdnZXIpIHx8Ci0JICAgIChuZXdfY29uZmlnLnR4X3RyaWdnZXIgIT0gaW5mby0+Y29uZmlnLnR4X3RyaWdnZXIpKSB7Ci0JCWluZm8tPmNvbmZpZy5yeF90cmlnZ2VyID0gbmV3X2NvbmZpZy5yeF90cmlnZ2VyOwotCQlpbmZvLT5jb25maWcudHhfdHJpZ2dlciA9IG5ld19jb25maWcudHhfdHJpZ2dlcjsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1RSSUdHRVIpOwotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsCi0JCQkgICBuZXdfY29uZmlnLnJ4X3RyaWdnZXIgPj4gOCk7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgbmV3X2NvbmZpZy5yeF90cmlnZ2VyKTsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLAotCQkJICAgbmV3X2NvbmZpZy50eF90cmlnZ2VyID4+IDgpOwotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIG5ld19jb25maWcudHhfdHJpZ2dlcik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQlpZiAobmV3X2NvbmZpZy5yeF90aW1lb3V0ICE9IGluZm8tPmNvbmZpZy5yeF90aW1lb3V0KSB7Ci0JCWluZm8tPmNvbmZpZy5yeF90aW1lb3V0ID0gbmV3X2NvbmZpZy5yeF90aW1lb3V0OwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCi0JCWlmIChpbmZvLT5JRVIgJiBVQVJUX0lFUl9SREkpIHsKLQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwKLQkJCQkgICBFU0lfU0VUX1JYX1RJTUVPVVQpOwotCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLAotCQkJCSAgIG5ld19jb25maWcucnhfdGltZW91dCk7Ci0JCX0KLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JfQotCi0JaWYgKCEoaW5mby0+cG9ydC5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkKLQkJcmV0dmFsID0gc3RhcnR1cChpbmZvKTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLS8qCi0gKiBnZXRfbHNyX2luZm8gLSBnZXQgbGluZSBzdGF0dXMgcmVnaXN0ZXIgaW5mbwotICoKLSAqIFB1cnBvc2U6IExldCB1c2VyIGNhbGwgaW9jdGwoKSB0byBnZXQgaW5mbyB3aGVuIHRoZSBVQVJUIHBoeXNpY2FsbHkKLSAqIAkgICAgaXMgZW1wdGllZC4gIE9uIGJ1cyB0eXBlcyBsaWtlIFJTNDg1LCB0aGUgdHJhbnNtaXR0ZXIgbXVzdAotICogCSAgICByZWxlYXNlIHRoZSBidXMgYWZ0ZXIgdHJhbnNtaXR0aW5nLiBUaGlzIG11c3QgYmUgZG9uZSB3aGVuCi0gKiAJICAgIHRoZSB0cmFuc21pdCBzaGlmdCByZWdpc3RlciBpcyBlbXB0eSwgbm90IGJlIGRvbmUgd2hlbiB0aGUKLSAqIAkgICAgdHJhbnNtaXQgaG9sZGluZyByZWdpc3RlciBpcyBlbXB0eS4gIFRoaXMgZnVuY3Rpb25hbGl0eQotICogCSAgICBhbGxvd3MgYW4gUlM0ODUgZHJpdmVyIHRvIGJlIHdyaXR0ZW4gaW4gdXNlciBzcGFjZS4KLSAqLwotc3RhdGljIGludCBnZXRfbHNyX2luZm8oc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8sIHVuc2lnbmVkIGludCBfX3VzZXIgKnZhbHVlKQotewotCXVuc2lnbmVkIGNoYXIgc3RhdHVzOwotCXVuc2lnbmVkIGludCByZXN1bHQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfR0VUX1VBUlRfU1RBVCk7Ci0Jc3RhdHVzID0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQxKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JcmVzdWx0ID0gKChzdGF0dXMgJiBVQVJUX0xTUl9URU1UKSA/IFRJT0NTRVJfVEVNVCA6IDApOwotCXJldHVybiBwdXRfdXNlcihyZXN1bHQsIHZhbHVlKTsKLX0KLQotCi1zdGF0aWMgaW50IGVzcF90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JdW5zaWduZWQgY2hhciBjb250cm9sLCBzdGF0dXM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCBfX2Z1bmNfXykpCi0JCXJldHVybiAtRU5PREVWOwotCWlmICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQljb250cm9sID0gaW5mby0+TUNSOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9HRVRfVUFSVF9TVEFUKTsKLQlzdGF0dXMgPSBzZXJpYWxfaW4oaW5mbywgVUFSVF9FU0lfU1RBVDIpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiAgICAoKGNvbnRyb2wgJiBVQVJUX01DUl9SVFMpID8gVElPQ01fUlRTIDogMCkKLQkJfCAoKGNvbnRyb2wgJiBVQVJUX01DUl9EVFIpID8gVElPQ01fRFRSIDogMCkKLQkJfCAoKHN0YXR1cyAgJiBVQVJUX01TUl9EQ0QpID8gVElPQ01fQ0FSIDogMCkKLQkJfCAoKHN0YXR1cyAgJiBVQVJUX01TUl9SSSkgPyBUSU9DTV9STkcgOiAwKQotCQl8ICgoc3RhdHVzICAmIFVBUlRfTVNSX0RTUikgPyBUSU9DTV9EU1IgOiAwKQotCQl8ICgoc3RhdHVzICAmIFVBUlRfTVNSX0NUUykgPyBUSU9DTV9DVFMgOiAwKTsKLX0KLQotc3RhdGljIGludCBlc3BfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQl1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCi17Ci0Jc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgX19mdW5jX18pKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCi0JCXJldHVybiAtRUlPOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQotCWlmIChzZXQgJiBUSU9DTV9SVFMpCi0JCWluZm8tPk1DUiB8PSBVQVJUX01DUl9SVFM7Ci0JaWYgKHNldCAmIFRJT0NNX0RUUikKLQkJaW5mby0+TUNSIHw9IFVBUlRfTUNSX0RUUjsKLQotCWlmIChjbGVhciAmIFRJT0NNX1JUUykKLQkJaW5mby0+TUNSICY9IH5VQVJUX01DUl9SVFM7Ci0JaWYgKGNsZWFyICYgVElPQ01fRFRSKQotCQlpbmZvLT5NQ1IgJj0gflVBUlRfTUNSX0RUUjsKLQotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1dSSVRFX1VBUlQpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgVUFSVF9NQ1IpOwotCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+TUNSKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIHJzX2JyZWFrKCkgLS0tIHJvdXRpbmUgd2hpY2ggdHVybnMgdGhlIGJyZWFrIGhhbmRsaW5nIG9uIG9yIG9mZgotICovCi1zdGF0aWMgaW50IGVzcF9icmVhayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgYnJlYWtfc3RhdGUpCi17Ci0Jc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImVzcF9icmVhayIpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChicmVha19zdGF0ZSA9PSAtMSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9JU1NVRV9CUkVBSyk7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgMHgwMSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQotCQkvKiBGSVhNRSAtIG5ldyBzdHlsZSB3YWl0IG5lZWRlZCBoZXJlICovCi0JCWludGVycnVwdGlibGVfc2xlZXBfb24oJmluZm8tPmJyZWFrX3dhaXQpOwotCX0gZWxzZSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX0lTU1VFX0JSRUFLKTsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCAweDAwKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByc19pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlzdHJ1Y3QgYXN5bmNfaWNvdW50IGNwcmV2LCBjbm93OwkvKiBrZXJuZWwgY291bnRlciB0ZW1wcyAqLwotCXN0cnVjdCBzZXJpYWxfaWNvdW50ZXJfc3RydWN0IF9fdXNlciAqcF9jdXNlcjsJLyogdXNlciBzcGFjZSAqLwotCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldDsKLQotCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfaW9jdGwiKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlpZiAoKGNtZCAhPSBUSU9DR1NFUklBTCkgJiYgKGNtZCAhPSBUSU9DU1NFUklBTCkgJiYKLQkgICAgKGNtZCAhPSBUSU9DU0VSQ09ORklHKSAmJiAoY21kICE9IFRJT0NTRVJHV0lMRCkgICYmCi0JICAgIChjbWQgIT0gVElPQ1NFUlNXSUxEKSAmJiAoY21kICE9IFRJT0NTRVJHU1RSVUNUKSAmJgotCSAgICAoY21kICE9IFRJT0NNSVdBSVQpICYmIChjbWQgIT0gVElPQ0dJQ09VTlQpICYmCi0JICAgIChjbWQgIT0gVElPQ0dIQVlFU0VTUCkgJiYgKGNtZCAhPSBUSU9DU0hBWUVTRVNQKSkgewotCQlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCi0JCSAgICByZXR1cm4gLUVJTzsKLQl9Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgVElPQ0dTRVJJQUw6Ci0JCXJldHVybiBnZXRfc2VyaWFsX2luZm8oaW5mbywgYXJncCk7Ci0JY2FzZSBUSU9DU1NFUklBTDoKLQkJbG9ja19rZXJuZWwoKTsKLQkJcmV0ID0gc2V0X3NlcmlhbF9pbmZvKGluZm8sIGFyZ3ApOwotCQl1bmxvY2tfa2VybmVsKCk7Ci0JCXJldHVybiByZXQ7Ci0JY2FzZSBUSU9DU0VSR1dJTEQ6Ci0JCXJldHVybiBwdXRfdXNlcigwTCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJncCk7Ci0JY2FzZSBUSU9DU0VSR0VUTFNSOiAvKiBHZXQgbGluZSBzdGF0dXMgcmVnaXN0ZXIgKi8KLQkJcmV0dXJuIGdldF9sc3JfaW5mbyhpbmZvLCBhcmdwKTsKLQljYXNlIFRJT0NTRVJTV0lMRDoKLQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQotCQkJcmV0dXJuIC1FUEVSTTsKLQkJcmV0dXJuIDA7Ci0JLyoKLQkgKiBXYWl0IGZvciBhbnkgb2YgdGhlIDQgbW9kZW0gaW5wdXRzIChEQ0QsUkksRFNSLENUUykgdG8gY2hhbmdlCi0JICogLSBtYXNrIHBhc3NlZCBpbiBhcmcgZm9yIGxpbmVzIG9mIGludGVyZXN0Ci0JICogICAodXNlIHwnZWQgVElPQ01fUk5HL0RTUi9DRC9DVFMgZm9yIG1hc2tpbmcpCi0JICogQ2FsbGVyIHNob3VsZCB1c2UgVElPQ0dJQ09VTlQgdG8gc2VlIHdoaWNoIG9uZSBpdCB3YXMKLQkgKi8KLQljYXNlIFRJT0NNSVdBSVQ6Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCWNwcmV2ID0gaW5mby0+aWNvdW50OwkvKiBub3RlIHRoZSBjb3VudGVycyBvbiBlbnRyeSAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCXdoaWxlICgxKSB7Ci0JCQkvKiBGSVhNRTogY29udmVydCB0byBuZXcgc3R5bGUgd2FrZXVwICovCi0JCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZpbmZvLT5wb3J0LmRlbHRhX21zcl93YWl0KTsKLQkJCS8qIHNlZSBpZiBhIHNpZ25hbCBkaWQgaXQgKi8KLQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQkJCWNub3cgPSBpbmZvLT5pY291bnQ7CS8qIGF0b21pYyBjb3B5ICovCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCQlpZiAoY25vdy5ybmcgPT0gY3ByZXYucm5nICYmCi0JCQkgICAgY25vdy5kc3IgPT0gY3ByZXYuZHNyICYmCi0JCQkgICAgY25vdy5kY2QgPT0gY3ByZXYuZGNkICYmCi0JCQkgICAgY25vdy5jdHMgPT0gY3ByZXYuY3RzKQotCQkJCXJldHVybiAtRUlPOyAvKiBubyBjaGFuZ2UgPT4gZXJyb3IgKi8KLQkJCWlmICgoKGFyZyAmIFRJT0NNX1JORykgJiYKLQkJCSAgICAgKGNub3cucm5nICE9IGNwcmV2LnJuZykpIHx8Ci0JCQkgICAgICgoYXJnICYgVElPQ01fRFNSKSAmJgotCQkJICAgICAgKGNub3cuZHNyICE9IGNwcmV2LmRzcikpIHx8Ci0JCQkgICAgICgoYXJnICYgVElPQ01fQ0QpICYmCi0JCQkgICAgICAoY25vdy5kY2QgIT0gY3ByZXYuZGNkKSkgfHwKLQkJCSAgICAgKChhcmcgJiBUSU9DTV9DVFMpICYmCi0JCQkgICAgICAoY25vdy5jdHMgIT0gY3ByZXYuY3RzKSkpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWNwcmV2ID0gY25vdzsKLQkJfQotCQkvKiBOT1RSRUFDSEVEICovCi0JLyoKLQkgKiBHZXQgY291bnRlciBvZiBpbnB1dCBzZXJpYWwgbGluZSBpbnRlcnJ1cHRzIChEQ0QsUkksRFNSLENUUykKLQkgKiBSZXR1cm46IHdyaXRlIGNvdW50ZXJzIHRvIHRoZSB1c2VyIHBhc3NlZCBjb3VudGVyIHN0cnVjdAotCSAqIE5COiBib3RoIDEtPjAgYW5kIDAtPjEgdHJhbnNpdGlvbnMgYXJlIGNvdW50ZWQgZXhjZXB0IGZvcgotCSAqICAgICBSSSB3aGVyZSBvbmx5IDAtPjEgaXMgY291bnRlZC4KLQkgKi8KLQljYXNlIFRJT0NHSUNPVU5UOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCQljbm93ID0gaW5mby0+aWNvdW50OwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCXBfY3VzZXIgPSBhcmdwOwotCQlpZiAocHV0X3VzZXIoY25vdy5jdHMsICZwX2N1c2VyLT5jdHMpIHx8Ci0JCSAgICBwdXRfdXNlcihjbm93LmRzciwgJnBfY3VzZXItPmRzcikgfHwKLQkJICAgIHB1dF91c2VyKGNub3cucm5nLCAmcF9jdXNlci0+cm5nKSB8fAotCQkgICAgcHV0X3VzZXIoY25vdy5kY2QsICZwX2N1c2VyLT5kY2QpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlyZXR1cm4gMDsKLQljYXNlIFRJT0NHSEFZRVNFU1A6Ci0JCXJldHVybiBnZXRfZXNwX2NvbmZpZyhpbmZvLCBhcmdwKTsKLQljYXNlIFRJT0NTSEFZRVNFU1A6Ci0JCWxvY2tfa2VybmVsKCk7Ci0JCXJldCA9IHNldF9lc3BfY29uZmlnKGluZm8sIGFyZ3ApOwotCQl1bmxvY2tfa2VybmVsKCk7Ci0JCXJldHVybiByZXQ7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHJzX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCi17Ci0Jc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQljaGFuZ2Vfc3BlZWQoaW5mbyk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCi0JLyogSGFuZGxlIHRyYW5zaXRpb24gdG8gQjAgc3RhdHVzICovCi0JaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSAmJgotCQkhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSkgewotCQlpbmZvLT5NQ1IgJj0gfihVQVJUX01DUl9EVFJ8VUFSVF9NQ1JfUlRTKTsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfV1JJVEVfVUFSVCk7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgVUFSVF9NQ1IpOwotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPk1DUik7Ci0JfQotCi0JLyogSGFuZGxlIHRyYW5zaXRpb24gYXdheSBmcm9tIEIwIHN0YXR1cyAqLwotCWlmICghKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpICYmCi0JCSh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkpIHsKLQkJaW5mby0+TUNSIHw9IChVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFMpOwotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9XUklURV9VQVJUKTsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBVQVJUX01DUik7Ci0JCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMiwgaW5mby0+TUNSKTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBIYW5kbGUgdHVybmluZyBvZiBDUlRTQ1RTICovCi0JaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpICYmCi0JICAgICEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykpIHsKLQkJcnNfc3RhcnQodHR5KTsKLQl9Ci19Ci0KLS8qCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHJzX2Nsb3NlKCkKLSAqCi0gKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gdGhlIHNlcmlhbCBwb3J0IGdldHMgY2xvc2VkLiAgRmlyc3QsIHdlCi0gKiB3YWl0IGZvciB0aGUgbGFzdCByZW1haW5pbmcgZGF0YSB0byBiZSBzZW50LiAgVGhlbiwgd2UgdW5saW5rIGl0cwotICogYXN5bmMgc3RydWN0dXJlIGZyb20gdGhlIGludGVycnVwdCBjaGFpbiBpZiBuZWNlc3NhcnksIGFuZCB3ZSBmcmVlCi0gKiB0aGF0IElSUSBpZiBub3RoaW5nIGlzIGxlZnQgaW4gdGhlIGNoYWluLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLXN0YXRpYyB2b2lkIHJzX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQotewotCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFpbmZvIHx8IHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19jbG9zZSIpKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpIHsKLQkJREJHX0NOVCgiYmVmb3JlIERFQy1odW5nIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCi0JcHJpbnRrKEtFUk5fREVCVUcgInJzX2Nsb3NlIHR0eXMlZCwgY291bnQgPSAlZFxuIiwKLQkJCQkJCWluZm8tPmxpbmUsIGluZm8tPnBvcnQuY291bnQpOwotI2VuZGlmCi0JaWYgKHR0eS0+Y291bnQgPT0gMSAmJiBpbmZvLT5wb3J0LmNvdW50ICE9IDEpIHsKLQkJLyoKLQkJICogVWgsIG9oLiAgdHR5LT5jb3VudCBpcyAxLCB3aGljaCBtZWFucyB0aGF0IHRoZSB0dHkKLQkJICogc3RydWN0dXJlIHdpbGwgYmUgZnJlZWQuICBJbmZvLT5jb3VudCBzaG91bGQgYWx3YXlzCi0JCSAqIGJlIG9uZSBpbiB0aGVzZSBjb25kaXRpb25zLiAgSWYgaXQncyBncmVhdGVyIHRoYW4KLQkJICogb25lLCB3ZSd2ZSBnb3QgcmVhbCBwcm9ibGVtcywgc2luY2UgaXQgbWVhbnMgdGhlCi0JCSAqIHNlcmlhbCBwb3J0IHdvbid0IGJlIHNodXRkb3duLgotCQkgKi8KLQkJcHJpbnRrKEtFUk5fREVCVUcgInJzX2Nsb3NlOiBiYWQgc2VyaWFsIHBvcnQgY291bnQ7IHR0eS0+Y291bnQgaXMgMSwgaW5mby0+cG9ydC5jb3VudCBpcyAlZFxuIiwgaW5mby0+cG9ydC5jb3VudCk7Ci0JCWluZm8tPnBvcnQuY291bnQgPSAxOwotCX0KLQlpZiAoLS1pbmZvLT5wb3J0LmNvdW50IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgInJzX2Nsb3NlOiBiYWQgc2VyaWFsIHBvcnQgY291bnQgZm9yIHR0eXMlZDogJWRcbiIsCi0JCSAgICAgICBpbmZvLT5saW5lLCBpbmZvLT5wb3J0LmNvdW50KTsKLQkJaW5mby0+cG9ydC5jb3VudCA9IDA7Ci0JfQotCWlmIChpbmZvLT5wb3J0LmNvdW50KSB7Ci0JCURCR19DTlQoImJlZm9yZSBERUMtMiIpOwotCQlnb3RvIG91dDsKLQl9Ci0JaW5mby0+cG9ydC5mbGFncyB8PSBBU1lOQ19DTE9TSU5HOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCS8qCi0JICogTm93IHdlIHdhaXQgZm9yIHRoZSB0cmFuc21pdCBidWZmZXIgdG8gY2xlYXI7IGFuZCB3ZSBub3RpZnkKLQkgKiB0aGUgbGluZSBkaXNjaXBsaW5lIHRvIG9ubHkgcHJvY2VzcyBYT04vWE9GRiBjaGFyYWN0ZXJzLgotCSAqLwotCXR0eS0+Y2xvc2luZyA9IDE7Ci0JaWYgKGluZm8tPmNsb3Npbmdfd2FpdCAhPSBBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORSkKLQkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIGluZm8tPmNsb3Npbmdfd2FpdCk7Ci0JLyoKLQkgKiBBdCB0aGlzIHBvaW50IHdlIHN0b3AgYWNjZXB0aW5nIGlucHV0LiAgVG8gZG8gdGhpcywgd2UKLQkgKiBkaXNhYmxlIHRoZSByZWNlaXZlIGxpbmUgc3RhdHVzIGludGVycnVwdHMsIGFuZCB0ZWxsIHRoZQotCSAqIGludGVycnVwdCBkcml2ZXIgdG8gc3RvcCBjaGVja2luZyB0aGUgZGF0YSByZWFkeSBiaXQgaW4gdGhlCi0JICogbGluZSBzdGF0dXMgcmVnaXN0ZXIuCi0JICovCi0JLyogaW5mby0+SUVSICY9IH5VQVJUX0lFUl9STFNJOyAqLwotCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfUkRJOwotCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgJj0gflVBUlRfTFNSX0RSOwotCWlmIChpbmZvLT5wb3J0LmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9TRVRfU1JWX01BU0spOwotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIGluZm8tPklFUik7Ci0KLQkJLyogZGlzYWJsZSByZWNlaXZlIHRpbWVvdXQgKi8KLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfU0VUX1JYX1RJTUVPVVQpOwotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MDApOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQotCQkvKgotCQkgKiBCZWZvcmUgd2UgZHJvcCBEVFIsIG1ha2Ugc3VyZSB0aGUgVUFSVCB0cmFuc21pdHRlcgotCQkgKiBoYXMgY29tcGxldGVseSBkcmFpbmVkOyB0aGlzIGlzIGVzcGVjaWFsbHkKLQkJICogaW1wb3J0YW50IGlmIHRoZXJlIGlzIGEgdHJhbnNtaXQgRklGTyEKLQkJICovCi0JCXJzX3dhaXRfdW50aWxfc2VudCh0dHksIGluZm8tPnRpbWVvdXQpOwotCX0KLQlzaHV0ZG93bihpbmZvKTsKLQlyc19mbHVzaF9idWZmZXIodHR5KTsKLQl0dHlfbGRpc2NfZmx1c2godHR5KTsKLQl0dHktPmNsb3NpbmcgPSAwOwotCWluZm8tPnBvcnQudHR5ID0gTlVMTDsKLQotCWlmIChpbmZvLT5wb3J0LmJsb2NrZWRfb3BlbikgewotCQlpZiAoaW5mby0+Y2xvc2VfZGVsYXkpCi0JCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGluZm8tPmNsb3NlX2RlbGF5KSk7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+cG9ydC5vcGVuX3dhaXQpOwotCX0KLQlpbmZvLT5wb3J0LmZsYWdzICY9IH4oQVNZTkNfTk9STUFMX0FDVElWRXxBU1lOQ19DTE9TSU5HKTsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPnBvcnQuY2xvc2Vfd2FpdCk7Ci0JcmV0dXJuOwotCi1vdXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCByc193YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpCi17Ci0Jc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwotCXVuc2lnbmVkIGxvbmcgb3JpZ19qaWZmaWVzLCBjaGFyX3RpbWU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfd2FpdF91bnRpbF9zZW50IikpCi0JCXJldHVybjsKLQotCW9yaWdfamlmZmllcyA9IGppZmZpZXM7Ci0JY2hhcl90aW1lID0gKChpbmZvLT50aW1lb3V0IC0gSFogLyA1MCkgLyAxMDI0KSAvIDU7Ci0KLQlpZiAoIWNoYXJfdGltZSkKLQkJY2hhcl90aW1lID0gMTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfTk9fQ09NTUFORCk7Ci0Jc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfR0VUX1RYX0FWQUlMKTsKLQotCXdoaWxlICgoc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQxKSAhPSAweDAzKSB8fAotCQkoc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQyKSAhPSAweGZmKSkgewotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhjaGFyX3RpbWUpKTsKLQotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHRpbWVvdXQgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBvcmlnX2ppZmZpZXMgKyB0aW1lb3V0KSkKLQkJCXJldHVybjsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9OT19DT01NQU5EKTsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCBFU0lfR0VUX1RYX0FWQUlMKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci19Ci0KLS8qCi0gKiBlc3BfaGFuZ3VwKCkgLS0tIGNhbGxlZCBieSB0dHlfaGFuZ3VwKCkgd2hlbiBhIGhhbmd1cCBpcyBzaWduYWxlZC4KLSAqLwotc3RhdGljIHZvaWQgZXNwX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKLQotCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiZXNwX2hhbmd1cCIpKQotCQlyZXR1cm47Ci0KLQlyc19mbHVzaF9idWZmZXIodHR5KTsKLQlzaHV0ZG93bihpbmZvKTsKLQlpbmZvLT5wb3J0LmNvdW50ID0gMDsKLQlpbmZvLT5wb3J0LmZsYWdzICY9IH5BU1lOQ19OT1JNQUxfQUNUSVZFOwotCWluZm8tPnBvcnQudHR5ID0gTlVMTDsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPnBvcnQub3Blbl93YWl0KTsKLX0KLQotc3RhdGljIGludCBlc3BfY2Fycmllcl9yYWlzZWQoc3RydWN0IHR0eV9wb3J0ICpwb3J0KQotewotCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBlc3Bfc3RydWN0LCBwb3J0KTsKLQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9HRVRfVUFSVF9TVEFUKTsKLQlpZiAoc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQyKSAmIFVBUlRfTVNSX0RDRCkKLQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIGVzcF9vcGVuKCkgYW5kIGZyaWVuZHMKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi1zdGF0aWMgaW50IGJsb2NrX3RpbF9yZWFkeShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCSAgIHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvKQotewotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotCWludAkJcmV0dmFsOwotCWludAkJZG9fY2xvY2FsID0gMDsKLQl1bnNpZ25lZCBsb25nCWZsYWdzOwotCWludAkJY2Q7Ci0Jc3RydWN0IHR0eV9wb3J0ICpwb3J0ID0gJmluZm8tPnBvcnQ7Ci0KLQkvKgotCSAqIElmIHRoZSBkZXZpY2UgaXMgaW4gdGhlIG1pZGRsZSBvZiBiZWluZyBjbG9zZWQsIHRoZW4gYmxvY2sKLQkgKiB1bnRpbCBpdCdzIGRvbmUsIGFuZCB0aGVuIHRyeSBhZ2Fpbi4KLQkgKi8KLQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fAotCSAgICAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSkgewotCQlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKQotCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcG9ydC0+Y2xvc2Vfd2FpdCk7Ci0jaWZkZWYgU0VSSUFMX0RPX1JFU1RBUlQKLQkJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkKLQkJCXJldHVybiAtRUFHQUlOOwotCQllbHNlCi0JCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotI2Vsc2UKLQkJcmV0dXJuIC1FQUdBSU47Ci0jZW5kaWYKLQl9Ci0KLQkvKgotCSAqIElmIG5vbi1ibG9ja2luZyBtb2RlIGlzIHNldCwgb3IgdGhlIHBvcnQgaXMgbm90IGVuYWJsZWQsCi0JICogdGhlbiBtYWtlIHRoZSBjaGVjayB1cCBmcm9udCBhbmQgdGhlbiBleGl0LgotCSAqLwotCWlmICgoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHx8Ci0JICAgICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkpIHsKLQkJcG9ydC0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkKLQkJZG9fY2xvY2FsID0gMTsKLQotCS8qCi0JICogQmxvY2sgd2FpdGluZyBmb3IgdGhlIGNhcnJpZXIgZGV0ZWN0IGFuZCB0aGUgbGluZSB0byBiZWNvbWUKLQkgKiBmcmVlIChpLmUuLCBub3QgaW4gdXNlIGJ5IHRoZSBjYWxsb3V0KS4gIFdoaWxlIHdlIGFyZSBpbgotCSAqIHRoaXMgbG9vcCwgcG9ydC0+Y291bnQgaXMgZHJvcHBlZCBieSBvbmUsIHNvIHRoYXQKLQkgKiByc19jbG9zZSgpIGtub3dzIHdoZW4gdG8gZnJlZSB0aGluZ3MuICBXZSByZXN0b3JlIGl0IHVwb24KLQkgKiBleGl0LCBlaXRoZXIgbm9ybWFsIG9yIGFibm9ybWFsLgotCSAqLwotCXJldHZhbCA9IDA7Ci0JYWRkX3dhaXRfcXVldWUoJnBvcnQtPm9wZW5fd2FpdCwgJndhaXQpOwotI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCi0JcHJpbnRrKEtFUk5fREVCVUcgImJsb2NrX3RpbF9yZWFkeSBiZWZvcmUgYmxvY2s6IHR0eXMlZCwgY291bnQgPSAlZFxuIiwKLQkgICAgICAgaW5mby0+bGluZSwgcG9ydC0+Y291bnQpOwotI2VuZGlmCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpCi0JCXBvcnQtPmNvdW50LS07Ci0JcG9ydC0+YmxvY2tlZF9vcGVuKys7Ci0Jd2hpbGUgKDEpIHsKLQkJaWYgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkpIHsKLQkJCXVuc2lnbmVkIGludCBzY3JhdGNoOwotCi0JCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDEsIEVTSV9SRUFEX1VBUlQpOwotCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBVQVJUX01DUik7Ci0JCQlzY3JhdGNoID0gc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQxKTsKLQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1dSSVRFX1VBUlQpOwotCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBVQVJUX01DUik7Ci0JCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsCi0JCQkJc2NyYXRjaCB8IFVBUlRfTUNSX0RUUiB8IFVBUlRfTUNSX1JUUyk7Ci0JCX0KLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwKLQkJICAgICEocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIHsKLSNpZmRlZiBTRVJJQUxfRE9fUkVTVEFSVAotCQkJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkKLQkJCQlyZXR2YWwgPSAtRUFHQUlOOwotCQkJZWxzZQotCQkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKLSNlbHNlCi0JCQlyZXR2YWwgPSAtRUFHQUlOOwotI2VuZGlmCi0JCQlicmVhazsKLQkJfQotCi0JCWNkID0gdHR5X3BvcnRfY2Fycmllcl9yYWlzZWQocG9ydCk7Ci0KLQkJaWYgKCEocG9ydC0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSAmJgotCQkgICAgKGRvX2Nsb2NhbCkpCi0JCQlicmVhazsKLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7Ci0JCQlicmVhazsKLQkJfQotI2lmZGVmIFNFUklBTF9ERUJVR19PUEVOCi0JCXByaW50ayhLRVJOX0RFQlVHICJibG9ja190aWxfcmVhZHkgYmxvY2tpbmc6IHR0eXMlZCwgY291bnQgPSAlZFxuIiwKLQkJICAgICAgIGluZm8tPmxpbmUsIHBvcnQtPmNvdW50KTsKLSNlbmRpZgotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCXNjaGVkdWxlKCk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JfQotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJnBvcnQtPm9wZW5fd2FpdCwgJndhaXQpOwotCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkKLQkJcG9ydC0+Y291bnQrKzsKLQlwb3J0LT5ibG9ja2VkX29wZW4tLTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0jaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KLQlwcmludGsoS0VSTl9ERUJVRyAiYmxvY2tfdGlsX3JlYWR5IGFmdGVyIGJsb2NraW5nOiB0dHlzJWQsIGNvdW50ID0gJWRcbiIsCi0JICAgICAgIGluZm8tPmxpbmUsIHBvcnQtPmNvdW50KTsKLSNlbmRpZgotCWlmIChyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7Ci0JcG9ydC0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBzZXJpYWwgcG9ydCBpcyBvcGVuZWQuICBJdAotICogZW5hYmxlcyBpbnRlcnJ1cHRzIGZvciBhIHNlcmlhbCBwb3J0LCBsaW5raW5nIGluIGl0cyBhc3luYyBzdHJ1Y3R1cmUgaW50bwotICogdGhlIElSUSBjaGFpbi4gICBJdCBhbHNvIHBlcmZvcm1zIHRoZSBzZXJpYWwtc3BlY2lmaWMKLSAqIGluaXRpYWxpemF0aW9uIGZvciB0aGUgdHR5IHN0cnVjdHVyZS4KLSAqLwotc3RhdGljIGludCBlc3Bfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKLXsKLQlzdHJ1Y3QgZXNwX3N0cnVjdAkqaW5mbzsKLQlpbnQgCQkJcmV0dmFsLCBsaW5lOwotCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwotCi0JbGluZSA9IHR0eS0+aW5kZXg7Ci0JaWYgKChsaW5lIDwgMCkgfHwgKGxpbmUgPj0gTlJfUE9SVFMpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCS8qIGZpbmQgdGhlIHBvcnQgaW4gdGhlIGNoYWluICovCi0KLQlpbmZvID0gcG9ydHM7Ci0KLQl3aGlsZSAoaW5mbyAmJiAoaW5mby0+bGluZSAhPSBsaW5lKSkKLQkJaW5mbyA9IGluZm8tPm5leHRfcG9ydDsKLQotCWlmICghaW5mbykgewotCQlzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiZXNwX29wZW4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0jaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KLQlwcmludGsoS0VSTl9ERUJVRyAiZXNwX29wZW4gJXMsIGNvdW50ID0gJWRcbiIsIHR0eS0+bmFtZSwgaW5mby0+cG9ydC5jb3VudCk7Ci0jZW5kaWYKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCWluZm8tPnBvcnQuY291bnQrKzsKLQl0dHktPmRyaXZlcl9kYXRhID0gaW5mbzsKLQlpbmZvLT5wb3J0LnR0eSA9IHR0eTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQotCS8qCi0JICogU3RhcnQgdXAgc2VyaWFsIHBvcnQKLQkgKi8KLQlyZXR2YWwgPSBzdGFydHVwKGluZm8pOwotCWlmIChyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7Ci0KLQlyZXR2YWwgPSBibG9ja190aWxfcmVhZHkodHR5LCBmaWxwLCBpbmZvKTsKLQlpZiAocmV0dmFsKSB7Ci0jaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KLQkJcHJpbnRrKEtFUk5fREVCVUcgImVzcF9vcGVuIHJldHVybmluZyBhZnRlciBibG9ja190aWxfcmVhZHkgd2l0aCAlZFxuIiwKLQkJICAgICAgIHJldHZhbCk7Ci0jZW5kaWYKLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0jaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KLQlwcmludGsoS0VSTl9ERUJVRyAiZXNwX29wZW4gJXMgc3VjY2Vzc2Z1bC4uLiIsIHR0eS0+bmFtZSk7Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogZXNwc2VyaWFsX2luaXQoKSBhbmQgZnJpZW5kcwotICoKLSAqIGVzcHNlcmlhbF9pbml0KCkgaXMgY2FsbGVkIGF0IGJvb3QtdGltZSB0byBpbml0aWFsaXplIHRoZSBzZXJpYWwgZHJpdmVyLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotLyoKLSAqIFRoaXMgcm91dGluZSBwcmludHMgb3V0IHRoZSBhcHByb3ByaWF0ZSBzZXJpYWwgZHJpdmVyIHZlcnNpb24KLSAqIG51bWJlciwgYW5kIGlkZW50aWZpZXMgd2hpY2ggb3B0aW9ucyB3ZXJlIGNvbmZpZ3VyZWQgaW50byB0aGlzCi0gKiBkcml2ZXIuCi0gKi8KLQotc3RhdGljIHZvaWQgX19pbml0IHNob3dfc2VyaWFsX3ZlcnNpb24odm9pZCkKLXsKLQlwcmludGsoS0VSTl9JTkZPICIlcyB2ZXJzaW9uICVzIChETUEgJXUpXG4iLAotCQlzZXJpYWxfbmFtZSwgc2VyaWFsX3ZlcnNpb24sIGRtYSk7Ci19Ci0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IGVzcHNlcmlhbF9pbml0KCkgdG8gaW5pdGlhbGl6ZSBhIHNwZWNpZmljIHNlcmlhbAotICogcG9ydC4KLSAqLwotc3RhdGljIGludCBhdXRvY29uZmlnKHN0cnVjdCBlc3Bfc3RydWN0ICppbmZvKQotewotCWludCBwb3J0X2RldGVjdGVkID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFyZXF1ZXN0X3JlZ2lvbihpbmZvLT5pb19wb3J0LCBSRUdJT05fU0laRSwgImVzcCBzZXJpYWwiKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCS8qCi0JICogQ2hlY2sgZm9yIEVTUCBjYXJkCi0JICovCi0KLQlpZiAoc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX0JBU0UpID09IDB4ZjMpIHsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCAweDAwKTsKLQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQxLCAweDAxKTsKLQotCQlpZiAoKHNlcmlhbF9pbihpbmZvLCBVQVJUX0VTSV9TVEFUMikgJiAweDcwKSA9PSAweDIwKSB7Ci0JCQlwb3J0X2RldGVjdGVkID0gMTsKLQotCQkJaWYgKCEoaW5mby0+aXJxKSkgewotCQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgMHgwMik7Ci0KLQkJCQlpZiAoc2VyaWFsX2luKGluZm8sIFVBUlRfRVNJX1NUQVQxKSAmIDB4MDEpCi0JCQkJCWluZm8tPmlycSA9IDM7Ci0JCQkJZWxzZQotCQkJCQlpbmZvLT5pcnEgPSA0OwotCQkJfQotCi0KLQkJCS8qIHB1dCBjYXJkIGluIGVuaGFuY2VkIG1vZGUgKi8KLQkJCS8qIHRoaXMgcHJldmVudHMgYWNjZXNzIHRocm91Z2ggKi8KLQkJCS8qIHRoZSAib2xkIiBJTyBwb3J0cyAqLwotCQkJZXNwX2Jhc2ljX2luaXQoaW5mbyk7Ci0KLQkJCS8qIGNsZWFyIG91dCBNQ1IgKi8KLQkJCXNlcmlhbF9vdXQoaW5mbywgVUFSVF9FU0lfQ01EMSwgRVNJX1dSSVRFX1VBUlQpOwotCQkJc2VyaWFsX291dChpbmZvLCBVQVJUX0VTSV9DTUQyLCBVQVJUX01DUik7Ci0JCQlzZXJpYWxfb3V0KGluZm8sIFVBUlRfRVNJX0NNRDIsIDB4MDApOwotCQl9Ci0JfQotCWlmICghcG9ydF9kZXRlY3RlZCkKLQkJcmVsZWFzZV9yZWdpb24oaW5mby0+aW9fcG9ydCwgUkVHSU9OX1NJWkUpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCXJldHVybiAocG9ydF9kZXRlY3RlZCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgZXNwX29wcyA9IHsKLQkub3BlbiA9IGVzcF9vcGVuLAotCS5jbG9zZSA9IHJzX2Nsb3NlLAotCS53cml0ZSA9IHJzX3dyaXRlLAotCS5wdXRfY2hhciA9IHJzX3B1dF9jaGFyLAotCS5mbHVzaF9jaGFycyA9IHJzX2ZsdXNoX2NoYXJzLAotCS53cml0ZV9yb29tID0gcnNfd3JpdGVfcm9vbSwKLQkuY2hhcnNfaW5fYnVmZmVyID0gcnNfY2hhcnNfaW5fYnVmZmVyLAotCS5mbHVzaF9idWZmZXIgPSByc19mbHVzaF9idWZmZXIsCi0JLmlvY3RsID0gcnNfaW9jdGwsCi0JLnRocm90dGxlID0gcnNfdGhyb3R0bGUsCi0JLnVudGhyb3R0bGUgPSByc191bnRocm90dGxlLAotCS5zZXRfdGVybWlvcyA9IHJzX3NldF90ZXJtaW9zLAotCS5zdG9wID0gcnNfc3RvcCwKLQkuc3RhcnQgPSByc19zdGFydCwKLQkuaGFuZ3VwID0gZXNwX2hhbmd1cCwKLQkuYnJlYWtfY3RsID0gZXNwX2JyZWFrLAotCS53YWl0X3VudGlsX3NlbnQgPSByc193YWl0X3VudGlsX3NlbnQsCi0JLnRpb2NtZ2V0ID0gZXNwX3Rpb2NtZ2V0LAotCS50aW9jbXNldCA9IGVzcF90aW9jbXNldCwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X3BvcnRfb3BlcmF0aW9ucyBlc3BfcG9ydF9vcHMgPSB7Ci0JLmVzcF9jYXJyaWVyX3JhaXNlZCwKLX07Ci0KLS8qCi0gKiBUaGUgc2VyaWFsIGRyaXZlciBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gY29kZSEKLSAqLwotc3RhdGljIGludCBfX2luaXQgZXNwc2VyaWFsX2luaXQodm9pZCkKLXsKLQlpbnQgaSwgb2Zmc2V0OwotCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvOwotCXN0cnVjdCBlc3Bfc3RydWN0ICpsYXN0X3ByaW1hcnkgPSBOVUxMOwotCWludCBlc3BbXSA9IHsgMHgxMDAsIDB4MTQwLCAweDE4MCwgMHgyMDAsIDB4MjQwLCAweDI4MCwgMHgzMDAsIDB4MzgwIH07Ci0KLQllc3BfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihOUl9QT1JUUyk7Ci0JaWYgKCFlc3BfZHJpdmVyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWZvciAoaSA9IDA7IGkgPCBOUl9QUklNQVJZOyBpKyspIHsKLQkJaWYgKGlycVtpXSAhPSAwKSB7Ci0JCQlpZiAoKGlycVtpXSA8IDIpIHx8IChpcnFbaV0gPiAxNSkgfHwgKGlycVtpXSA9PSA2KSB8fAotCQkJICAgIChpcnFbaV0gPT0gOCkgfHwgKGlycVtpXSA9PSAxMykpCi0JCQkJaXJxW2ldID0gMDsKLQkJCWVsc2UgaWYgKGlycVtpXSA9PSAyKQotCQkJCWlycVtpXSA9IDk7Ci0JCX0KLQl9Ci0KLQlpZiAoKGRtYSAhPSAxKSAmJiAoZG1hICE9IDMpKQotCQlkbWEgPSAwOwotCi0JaWYgKChyeF90cmlnZ2VyIDwgMSkgfHwgKHJ4X3RyaWdnZXIgPiAxMDIzKSkKLQkJcnhfdHJpZ2dlciA9IDc2ODsKLQotCWlmICgodHhfdHJpZ2dlciA8IDEpIHx8ICh0eF90cmlnZ2VyID4gMTAyMykpCi0JCXR4X3RyaWdnZXIgPSA3Njg7Ci0KLQlpZiAoKGZsb3dfb2ZmIDwgMSkgfHwgKGZsb3dfb2ZmID4gMTAyMykpCi0JCWZsb3dfb2ZmID0gMTAxNjsKLQotCWlmICgoZmxvd19vbiA8IDEpIHx8IChmbG93X29uID4gMTAyMykpCi0JCWZsb3dfb24gPSA5NDQ7Ci0KLQlpZiAoKHJ4X3RpbWVvdXQgPCAwKSB8fCAocnhfdGltZW91dCA+IDI1NSkpCi0JCXJ4X3RpbWVvdXQgPSAxMjg7Ci0KLQlpZiAoZmxvd19vbiA+PSBmbG93X29mZikKLQkJZmxvd19vbiA9IGZsb3dfb2ZmIC0gMTsKLQotCXNob3dfc2VyaWFsX3ZlcnNpb24oKTsKLQotCS8qIEluaXRpYWxpemUgdGhlIHR0eV9kcml2ZXIgc3RydWN0dXJlICovCi0KLQllc3BfZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOwotCWVzcF9kcml2ZXItPm5hbWUgPSAidHR5UCI7Ci0JZXNwX2RyaXZlci0+bWFqb3IgPSBFU1BfSU5fTUFKT1I7Ci0JZXNwX2RyaXZlci0+bWlub3Jfc3RhcnQgPSAwOwotCWVzcF9kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOwotCWVzcF9kcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7Ci0JZXNwX2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOwotCWVzcF9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0KLQkJQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOwotCWVzcF9kcml2ZXItPmluaXRfdGVybWlvcy5jX2lzcGVlZCA9IDk2MDA7Ci0JZXNwX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfb3NwZWVkID0gOTYwMDsKLQllc3BfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7Ci0JdHR5X3NldF9vcGVyYXRpb25zKGVzcF9kcml2ZXIsICZlc3Bfb3BzKTsKLQlpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcihlc3BfZHJpdmVyKSkgewotCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkbid0IHJlZ2lzdGVyIGVzcCBzZXJpYWwgZHJpdmVyIik7Ci0JCXB1dF90dHlfZHJpdmVyKGVzcF9kcml2ZXIpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlpbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGVzcF9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKLQotCWlmICghaW5mbykgewotCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgZXNwIHNlcmlhbCBkZXZpY2UgaW5mb3JtYXRpb25cbiIpOwotCQl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoZXNwX2RyaXZlcik7Ci0JCXB1dF90dHlfZHJpdmVyKGVzcF9kcml2ZXIpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlzcGluX2xvY2tfaW5pdCgmaW5mby0+bG9jayk7Ci0JLyogcnhfdHJpZ2dlciwgdHhfdHJpZ2dlciBhcmUgbmVlZGVkIGJ5IGF1dG9jb25maWcgKi8KLQlpbmZvLT5jb25maWcucnhfdHJpZ2dlciA9IHJ4X3RyaWdnZXI7Ci0JaW5mby0+Y29uZmlnLnR4X3RyaWdnZXIgPSB0eF90cmlnZ2VyOwotCi0JaSA9IDA7Ci0Jb2Zmc2V0ID0gMDsKLQotCWRvIHsKLQkJdHR5X3BvcnRfaW5pdCgmaW5mby0+cG9ydCk7Ci0JCWluZm8tPnBvcnQub3BzID0gJmVzcF9wb3J0X29wczsKLQkJaW5mby0+aW9fcG9ydCA9IGVzcFtpXSArIG9mZnNldDsKLQkJaW5mby0+aXJxID0gaXJxW2ldOwotCQlpbmZvLT5saW5lID0gKGkgKiA4KSArIChvZmZzZXQgLyA4KTsKLQotCQlpZiAoIWF1dG9jb25maWcoaW5mbykpIHsKLQkJCWkrKzsKLQkJCW9mZnNldCA9IDA7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWluZm8tPmN1c3RvbV9kaXZpc29yID0gKGRpdmlzb3JbaV0gPj4gKG9mZnNldCAvIDIpKSAmIDB4ZjsKLQkJaW5mby0+cG9ydC5mbGFncyA9IFNURF9DT01fRkxBR1M7Ci0JCWlmIChpbmZvLT5jdXN0b21fZGl2aXNvcikKLQkJCWluZm8tPnBvcnQuZmxhZ3MgfD0gQVNZTkNfU1BEX0NVU1Q7Ci0JCWluZm8tPm1hZ2ljID0gRVNQX01BR0lDOwotCQlpbmZvLT5jbG9zZV9kZWxheSA9IDUqSFovMTA7Ci0JCWluZm8tPmNsb3Npbmdfd2FpdCA9IDMwKkhaOwotCQlpbmZvLT5jb25maWcucnhfdGltZW91dCA9IHJ4X3RpbWVvdXQ7Ci0JCWluZm8tPmNvbmZpZy5mbG93X29uID0gZmxvd19vbjsKLQkJaW5mby0+Y29uZmlnLmZsb3dfb2ZmID0gZmxvd19vZmY7Ci0JCWluZm8tPmNvbmZpZy5waW9fdGhyZXNob2xkID0gcGlvX3RocmVzaG9sZDsKLQkJaW5mby0+bmV4dF9wb3J0ID0gcG9ydHM7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPmJyZWFrX3dhaXQpOwotCQlwb3J0cyA9IGluZm87Ci0JCXByaW50ayhLRVJOX0lORk8gInR0eVAlZCBhdCAweCUwNHggKGlycSA9ICVkKSBpcyBhbiBFU1AgIiwKLQkJCWluZm8tPmxpbmUsIGluZm8tPmlvX3BvcnQsIGluZm8tPmlycSk7Ci0KLQkJaWYgKGluZm8tPmxpbmUgJSA4KSB7Ci0JCQlwcmludGsoInNlY29uZGFyeSBwb3J0XG4iKTsKLQkJCS8qIDggcG9ydCBjYXJkcyBjYW4ndCBkbyBETUEgKi8KLQkJCWluZm8tPnN0YXRfZmxhZ3MgfD0gRVNQX1NUQVRfTkVWRVJfRE1BOwotCi0JCQlpZiAobGFzdF9wcmltYXJ5KQotCQkJCWxhc3RfcHJpbWFyeS0+c3RhdF9mbGFncyB8PSBFU1BfU1RBVF9ORVZFUl9ETUE7Ci0JCX0gZWxzZSB7Ci0JCQlwcmludGsoInByaW1hcnkgcG9ydFxuIik7Ci0JCQlsYXN0X3ByaW1hcnkgPSBpbmZvOwotCQkJaXJxW2ldID0gaW5mby0+aXJxOwotCQl9Ci0KLQkJaWYgKCFkbWEpCi0JCQlpbmZvLT5zdGF0X2ZsYWdzIHw9IEVTUF9TVEFUX05FVkVSX0RNQTsKLQotCQlpbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGVzcF9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFpbmZvKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgZXNwIHNlcmlhbCBkZXZpY2UgaW5mb3JtYXRpb25cbiIpOwotCQkJLyogYWxsb3cgdXNlIG9mIHRoZSBhbHJlYWR5IGRldGVjdGVkIHBvcnRzICovCi0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCXNwaW5fbG9ja19pbml0KCZpbmZvLT5sb2NrKTsKLQkJLyogcnhfdHJpZ2dlciwgdHhfdHJpZ2dlciBhcmUgbmVlZGVkIGJ5IGF1dG9jb25maWcgKi8KLQkJaW5mby0+Y29uZmlnLnJ4X3RyaWdnZXIgPSByeF90cmlnZ2VyOwotCQlpbmZvLT5jb25maWcudHhfdHJpZ2dlciA9IHR4X3RyaWdnZXI7Ci0KLQkJaWYgKG9mZnNldCA9PSA1NikgewotCQkJaSsrOwotCQkJb2Zmc2V0ID0gMDsKLQkJfSBlbHNlIHsKLQkJCW9mZnNldCArPSA4OwotCQl9Ci0JfSB3aGlsZSAoaSA8IE5SX1BSSU1BUlkpOwotCi0JLyogZnJlZSB0aGUgbGFzdCBwb3J0IG1lbW9yeSBhbGxvY2F0aW9uICovCi0Ja2ZyZWUoaW5mbyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGVzcHNlcmlhbF9leGl0KHZvaWQpCi17Ci0JaW50IGUxOwotCXN0cnVjdCBlc3Bfc3RydWN0ICp0ZW1wX2FzeW5jOwotCXN0cnVjdCBlc3BfcGlvX2J1ZmZlciAqcGlvX2J1ZjsKLQotCWUxID0gdHR5X3VucmVnaXN0ZXJfZHJpdmVyKGVzcF9kcml2ZXIpOwotCWlmIChlMSkKLQkJcHJpbnRrKEtFUk5fRVJSICJlc3A6IGZhaWxlZCB0byB1bnJlZ2lzdGVyIGRyaXZlciAoJWQpXG4iLCBlMSk7Ci0JcHV0X3R0eV9kcml2ZXIoZXNwX2RyaXZlcik7Ci0KLQl3aGlsZSAocG9ydHMpIHsKLQkJaWYgKHBvcnRzLT5pb19wb3J0KQotCQkJcmVsZWFzZV9yZWdpb24ocG9ydHMtPmlvX3BvcnQsIFJFR0lPTl9TSVpFKTsKLQkJdGVtcF9hc3luYyA9IHBvcnRzLT5uZXh0X3BvcnQ7Ci0JCWtmcmVlKHBvcnRzKTsKLQkJcG9ydHMgPSB0ZW1wX2FzeW5jOwotCX0KLQotCWlmIChkbWFfYnVmZmVyKQotCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWRtYV9idWZmZXIsCi0JCQlnZXRfb3JkZXIoRE1BX0JVRkZFUl9TWikpOwotCi0Jd2hpbGUgKGZyZWVfcGlvX2J1ZikgewotCQlwaW9fYnVmID0gZnJlZV9waW9fYnVmLT5uZXh0OwotCQlrZnJlZShmcmVlX3Bpb19idWYpOwotCQlmcmVlX3Bpb19idWYgPSBwaW9fYnVmOwotCX0KLX0KLQotbW9kdWxlX2luaXQoZXNwc2VyaWFsX2luaXQpOwotbW9kdWxlX2V4aXQoZXNwc2VyaWFsX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMgYi9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYwppbmRleCBhNjMyZjI1Li40MTZkMzQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYworKysgYi9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYwpAQCAtODMyLDYgKzgzMiw3IEBACiAJCXR0eV9oYW5ndXAodHR5KTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGh2Y19yZW1vdmUpOwogCiAvKiBEcml2ZXIgaW5pdGlhbGl6YXRpb246IGNhbGxlZCBhcyBzb29uIGFzIHNvbWVvbmUgdXNlcyBodmNfYWxsb2MoKS4gKi8KIHN0YXRpYyBpbnQgaHZjX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9odmNfeGVuLmMgYi9kcml2ZXJzL2NoYXIvaHZjX3hlbi5jCmluZGV4IGE2ZWUzMmIuLmIxYTcxNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9odmNfeGVuLmMKKysrIGIvZHJpdmVycy9jaGFyL2h2Y194ZW4uYwpAQCAtMjUsNiArMjUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KKworI2luY2x1ZGUgPHhlbi94ZW4uaD4KICNpbmNsdWRlIDx4ZW4vcGFnZS5oPgogI2luY2x1ZGUgPHhlbi9ldmVudHMuaD4KICNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL2lvL2NvbnNvbGUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pc2ljb20uYyBiL2RyaXZlcnMvY2hhci9pc2ljb20uYwppbmRleCA0MjZiZmRkLi4zMDBkNWJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXNpY29tLmMKKysrIGIvZHJpdmVycy9jaGFyL2lzaWNvbS5jCkBAIC03OTMsMzUgKzc5MywzMCBAQAogewogCWludCBjaGFubmVsOwogCXN0cnVjdCBpc2lfcG9ydCAqcG9ydDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5jYXJkX2xvY2ssIGZsYWdzKTsKLQlpZiAoYnAtPnN0YXR1cyAmIEJPQVJEX0FDVElWRSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+Y2FyZF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKKwlicC0+Y291bnQrKzsKKwlpZiAoIShicC0+c3RhdHVzICYgQk9BUkRfSU5JVCkpIHsKKwkJcG9ydCA9IGJwLT5wb3J0czsKKwkJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IGJwLT5wb3J0X2NvdW50OyBjaGFubmVsKyssIHBvcnQrKykKKwkJCWRyb3BfZHRyX3J0cyhwb3J0KTsKIAl9Ci0JcG9ydCA9IGJwLT5wb3J0czsKLQlicC0+c3RhdHVzIHw9IEJPQVJEX0FDVElWRTsKLQlmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgYnAtPnBvcnRfY291bnQ7IGNoYW5uZWwrKywgcG9ydCsrKQotCQlkcm9wX2R0cl9ydHMocG9ydCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmNhcmRfbG9jaywgZmxhZ3MpOworCWJwLT5zdGF0dXMgfD0gQk9BUkRfQUNUSVZFIHwgQk9BUkRfSU5JVDsKIH0KIAotc3RhdGljIGludCBpc2ljb21fc2V0dXBfcG9ydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQorLyogQWN0aXZhdGUgYW5kIHRodXMgc2V0dXAgYm9hcmQgYXJlIHByb3RlY3RlZCBmcm9tIHJhY2VzIGFnYWluc3Qgc2h1dGRvd24KKyAgIGJ5IHRoZSB0dHlfcG9ydCBtdXRleCAqLworCitzdGF0aWMgaW50IGlzaWNvbV9hY3RpdmF0ZShzdHJ1Y3QgdHR5X3BvcnQgKnRwb3J0LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0cnVjdCBpc2lfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGlzaV9wb3J0ICpwb3J0ID0gY29udGFpbmVyX29mKHRwb3J0LCBzdHJ1Y3QgaXNpX3BvcnQsIHBvcnQpOwogCXN0cnVjdCBpc2lfYm9hcmQgKmNhcmQgPSBwb3J0LT5jYXJkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAocG9ydC0+cG9ydC5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKQotCQlyZXR1cm4gMDsKLQlpZiAodHR5X3BvcnRfYWxsb2NfeG1pdF9idWYoJnBvcnQtPnBvcnQpIDwgMCkKKwlpZiAodHR5X3BvcnRfYWxsb2NfeG1pdF9idWYodHBvcnQpIDwgMCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7Ci0JY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpOwotCWlmIChwb3J0LT5wb3J0LmNvdW50ID09IDEpCi0JCWNhcmQtPmNvdW50Kys7CisJaXNpY29tX3NldHVwX2JvYXJkKGNhcmQpOwogCiAJcG9ydC0+eG1pdF9jbnQgPSBwb3J0LT54bWl0X2hlYWQgPSBwb3J0LT54bWl0X3RhaWwgPSAwOwogCkBAIC04MzIsOSArODI3LDcgQEAKIAkJb3V0dygoKElTSUNPTV9LSUxMVFggfCBJU0lDT01fS0lMTFJYKSA8PCA4KSB8IDB4MDYsIGNhcmQtPmJhc2UpOwogCQlJbnRlcnJ1cHRUaGVDYXJkKGNhcmQtPmJhc2UpOwogCX0KLQogCWlzaWNvbV9jb25maWdfcG9ydCh0dHkpOwotCXBvcnQtPnBvcnQuZmxhZ3MgfD0gQVNZTkNfSU5JVElBTElaRUQ7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKQEAgLTg3MSw4NSArODY0LDM3IEBACiAKIAlyZXR1cm4gJnBvcnQtPnBvcnQ7CiB9Ci0JCisKIHN0YXRpYyBpbnQgaXNpY29tX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJc3RydWN0IGlzaV9wb3J0ICpwb3J0OwogCXN0cnVjdCBpc2lfYm9hcmQgKmNhcmQ7CiAJc3RydWN0IHR0eV9wb3J0ICp0cG9ydDsKLQlpbnQgZXJyb3IgPSAwOwogCiAJdHBvcnQgPSBpc2ljb21fZmluZF9wb3J0KHR0eSk7CiAJaWYgKHRwb3J0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCXBvcnQgPSBjb250YWluZXJfb2YodHBvcnQsIHN0cnVjdCBpc2lfcG9ydCwgcG9ydCk7CiAJY2FyZCA9ICZpc2lfY2FyZFtCT0FSRCh0dHktPmluZGV4KV07Ci0JaXNpY29tX3NldHVwX2JvYXJkKGNhcmQpOwogCi0JLyogRklYTUU6IGxvY2tpbmcgb24gcG9ydC5jb3VudCBldGMgKi8KLQlwb3J0LT5wb3J0LmNvdW50Kys7Ci0JdHR5LT5kcml2ZXJfZGF0YSA9IHBvcnQ7Ci0JdHR5X3BvcnRfdHR5X3NldCgmcG9ydC0+cG9ydCwgdHR5KTsKLQkvKiBGSVhNRTogTG9ja2luZyBvbiBJbml0aWFsaXplZCBmbGFnICovCi0JaWYgKCF0ZXN0X2JpdChBU1lOQ0JfSU5JVElBTElaRUQsICZ0cG9ydC0+ZmxhZ3MpKQotCQllcnJvciA9IGlzaWNvbV9zZXR1cF9wb3J0KHR0eSk7Ci0JaWYgKGVycm9yID09IDApCi0JCWVycm9yID0gdHR5X3BvcnRfYmxvY2tfdGlsX3JlYWR5KCZwb3J0LT5wb3J0LCB0dHksIGZpbHApOwotCXJldHVybiBlcnJvcjsKKwlyZXR1cm4gdHR5X3BvcnRfb3Blbih0cG9ydCwgdHR5LCBmaWxwKTsKIH0KIAogLyogY2xvc2UgZXQgYWxsICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpc2ljb21fc2h1dGRvd25fYm9hcmQoc3RydWN0IGlzaV9ib2FyZCAqYnApCi17Ci0JaWYgKGJwLT5zdGF0dXMgJiBCT0FSRF9BQ1RJVkUpCi0JCWJwLT5zdGF0dXMgJj0gfkJPQVJEX0FDVElWRTsKLX0KLQogLyogY2FyZC0+bG9jayBIQVMgdG8gYmUgaGVsZCAqLwogc3RhdGljIHZvaWQgaXNpY29tX3NodXRkb3duX3BvcnQoc3RydWN0IGlzaV9wb3J0ICpwb3J0KQogewogCXN0cnVjdCBpc2lfYm9hcmQgKmNhcmQgPSBwb3J0LT5jYXJkOwotCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7Ci0KLQl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKLQotCWlmICghKHBvcnQtPnBvcnQuZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIHsKLQkJdHR5X2tyZWZfcHV0KHR0eSk7Ci0JCXJldHVybjsKLQl9Ci0KLQl0dHlfcG9ydF9mcmVlX3htaXRfYnVmKCZwb3J0LT5wb3J0KTsKLQlwb3J0LT5wb3J0LmZsYWdzICY9IH5BU1lOQ19JTklUSUFMSVpFRDsKLQkvKiAzcmQgT2N0b2JlciAyMDAwIDogVmluYXlhayBQIFJpc2J1ZCAqLwotCXR0eV9wb3J0X3R0eV9zZXQoJnBvcnQtPnBvcnQsIE5VTEwpOwotCi0JLypGaXggZG9uZSBieSBBbmlsIC5TIG9uIDMwLTA0LTIwMDEKLQlyZW1vdGUgbG9naW4gdGhyb3VnaCBpc2kgcG9ydCBoYXMgZHRyIHRvZ2dsZSBwcm9ibGVtCi0JZHVlIHRvIHdoaWNoIHRoZSBjYXJyaWVyIGRyb3BzIGJlZm9yZSB0aGUgcGFzc3dvcmQgcHJvbXB0Ci0JYXBwZWFycyBvbiB0aGUgcmVtb3RlIGVuZC4gTm93IHdlIGRyb3AgdGhlIGR0ciBvbmx5IGlmIHRoZQotCUhVUENMKEhhbmd1cCBvbiBjbG9zZSkgZmxhZyBpcyBzZXQgZm9yIHRoZSB0dHkqLwotCi0JaWYgKENfSFVQQ0wodHR5KSkKLQkJLyogZHJvcCBkdHIgb24gdGhpcyBwb3J0ICovCi0JCWRyb3BfZHRyKHBvcnQpOwotCi0JLyogYW55IG90aGVyIHBvcnQgdW5pbml0cyAgKi8KLQlpZiAodHR5KQotCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpOwogCiAJaWYgKC0tY2FyZC0+Y291bnQgPCAwKSB7CiAJCXByX2RiZygiaXNpY29tX3NodXRkb3duX3BvcnQ6IGJhZCBib2FyZCgweCVseCkgY291bnQgJWQuXG4iLAogCQkJY2FyZC0+YmFzZSwgY2FyZC0+Y291bnQpOwogCQljYXJkLT5jb3VudCA9IDA7CiAJfQotCi0JLyogbGFzdCBwb3J0IHdhcyBjbG9zZWQsIHNodXRkb3duIHRoYXQgYm9hZCB0b28gKi8KLQlpZiAoQ19IVVBDTCh0dHkpKSB7Ci0JCWlmICghY2FyZC0+Y291bnQpCi0JCQlpc2ljb21fc2h1dGRvd25fYm9hcmQoY2FyZCk7Ci0JfQotCXR0eV9rcmVmX3B1dCh0dHkpOworCS8qIGxhc3QgcG9ydCB3YXMgY2xvc2VkLCBzaHV0ZG93biB0aGF0IGJvYXJkIHRvbyAqLworCWlmICghY2FyZC0+Y291bnQpCisJCWNhcmQtPnN0YXR1cyAmPSBCT0FSRF9BQ1RJVkU7CiB9CiAKIHN0YXRpYyB2b2lkIGlzaWNvbV9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKQEAgLTk2OCw3ICs5MTMsNyBAQAogCXR0eV93YWtldXAodHR5KTsKIH0KIAotc3RhdGljIHZvaWQgaXNpY29tX2Nsb3NlX3BvcnQoc3RydWN0IHR0eV9wb3J0ICpwb3J0KQorc3RhdGljIHZvaWQgaXNpY29tX3NodXRkb3duKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgaXNpX3BvcnQgKmlwID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBpc2lfcG9ydCwgcG9ydCk7CiAJc3RydWN0IGlzaV9ib2FyZCAqY2FyZCA9IGlwLT5jYXJkOwpAQCAtOTc3LDEyICs5MjIsMTEgQEAKIAkvKiBpbmRpY2F0ZSB0byB0aGUgY2FyZCB0aGF0IG5vIG1vcmUgZGF0YSBjYW4gYmUgcmVjZWl2ZWQKIAkgICBvbiB0aGlzIHBvcnQgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7Ci0JaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsKLQkJY2FyZC0+cG9ydF9zdGF0dXMgJj0gfigxIDw8IGlwLT5jaGFubmVsKTsKLQkJb3V0dyhjYXJkLT5wb3J0X3N0YXR1cywgY2FyZC0+YmFzZSArIDB4MDIpOwotCX0KKwljYXJkLT5wb3J0X3N0YXR1cyAmPSB+KDEgPDwgaXAtPmNoYW5uZWwpOworCW91dHcoY2FyZC0+cG9ydF9zdGF0dXMsIGNhcmQtPmJhc2UgKyAweDAyKTsKIAlpc2ljb21fc2h1dGRvd25fcG9ydChpcCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJdHR5X3BvcnRfZnJlZV94bWl0X2J1Zihwb3J0KTsKIH0KIAogc3RhdGljIHZvaWQgaXNpY29tX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQpAQCAtOTkxLDEyICs5MzUsNyBAQAogCXN0cnVjdCB0dHlfcG9ydCAqcG9ydCA9ICZpcC0+cG9ydDsKIAlpZiAoaXNpY29tX3BhcmFub2lhX2NoZWNrKGlwLCB0dHktPm5hbWUsICJpc2ljb21fY2xvc2UiKSkKIAkJcmV0dXJuOwotCi0JaWYgKHR0eV9wb3J0X2Nsb3NlX3N0YXJ0KHBvcnQsIHR0eSwgZmlscCkgPT0gMCkKLQkJcmV0dXJuOwotCWlzaWNvbV9jbG9zZV9wb3J0KHBvcnQpOwotCWlzaWNvbV9mbHVzaF9idWZmZXIodHR5KTsKLQl0dHlfcG9ydF9jbG9zZV9lbmQocG9ydCwgdHR5KTsKKwl0dHlfcG9ydF9jbG9zZShwb3J0LCB0dHksIGZpbHApOwogfQogCiAvKiB3cml0ZSBldCBhbGwgKi8KQEAgLTEzMjYsMTUgKzEyNjUsOSBAQAogc3RhdGljIHZvaWQgaXNpY29tX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCXN0cnVjdCBpc2lfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChpc2ljb21fcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAiaXNpY29tX2hhbmd1cCIpKQogCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+Y2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7Ci0JaXNpY29tX3NodXRkb3duX3BvcnQocG9ydCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+Y2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7Ci0KIAl0dHlfcG9ydF9oYW5ndXAoJnBvcnQtPnBvcnQpOwogfQogCkBAIC0xMzY3LDYgKzEzMDAsOCBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCB0dHlfcG9ydF9vcGVyYXRpb25zIGlzaWNvbV9wb3J0X29wcyA9IHsKIAkuY2Fycmllcl9yYWlzZWQJCT0gaXNpY29tX2NhcnJpZXJfcmFpc2VkLAogCS5kdHJfcnRzCQk9IGlzaWNvbV9kdHJfcnRzLAorCS5hY3RpdmF0ZQkJPSBpc2ljb21fYWN0aXZhdGUsCisJLnNodXRkb3duCQk9IGlzaWNvbV9zaHV0ZG93biwKIH07CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHJlc2V0X2NhcmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXN0YWxsaW9uLmMgYi9kcml2ZXJzL2NoYXIvaXN0YWxsaW9uLmMKaW5kZXggNDAyODM4Zi4uNGNkNmM1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lzdGFsbGlvbi5jCisrKyBiL2RyaXZlcnMvY2hhci9pc3RhbGxpb24uYwpAQCAtMjEzLDcgKzIxMyw2IEBACiAgKgl3aXRoIHRoZSBzbGF2ZS4gTW9zdCBvZiB0aGVtIG5lZWQgdG8gYmUgdXBkYXRlZCBhdG9taWNhbGx5LCBzbyBhbHdheXMKICAqCXVzZSB0aGUgYml0IHNldHRpbmcgb3BlcmF0aW9ucyAodW5sZXNzIHByb3RlY3RlZCBieSBjbGkvc3RpKS4KICAqLwotI2RlZmluZQlTVF9JTklUSUFMSVpJTkcJMQogI2RlZmluZQlTVF9PUEVOSU5HCTIKICNkZWZpbmUJU1RfQ0xPU0lORwkzCiAjZGVmaW5lCVNUX0NNRElORwk0CkBAIC02MjEsNyArNjIwLDcgQEAKIHN0YXRpYyBpbnQJc3RsaV9zdGFydGJyZChzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCk7CiBzdGF0aWMgc3NpemVfdAlzdGxpX21lbXJlYWQoc3RydWN0IGZpbGUgKmZwLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmcCk7CiBzdGF0aWMgc3NpemVfdAlzdGxpX21lbXdyaXRlKHN0cnVjdCBmaWxlICpmcCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnApOwotc3RhdGljIGludAlzdGxpX21lbWlvY3RsKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBmaWxlICpmcCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGxvbmcJc3RsaV9tZW1pb2N0bChzdHJ1Y3QgZmlsZSAqZnAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIHN0YXRpYyB2b2lkCXN0bGlfYnJkcG9sbChzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCwgY2RraGRyX3QgX19pb21lbSAqaGRycCk7CiBzdGF0aWMgdm9pZAlzdGxpX3BvbGwodW5zaWduZWQgbG9uZyBhcmcpOwogc3RhdGljIGludAlzdGxpX2hvc3RjbWQoc3RydWN0IHN0bGlicmQgKmJyZHAsIHN0cnVjdCBzdGxpcG9ydCAqcG9ydHApOwpAQCAtNzA0LDcgKzcwMyw3IEBACiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5yZWFkCQk9IHN0bGlfbWVtcmVhZCwKIAkud3JpdGUJCT0gc3RsaV9tZW13cml0ZSwKLQkuaW9jdGwJCT0gc3RsaV9tZW1pb2N0bCwKKwkudW5sb2NrZWRfaW9jdGwJPSBzdGxpX21lbWlvY3RsLAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNzgzLDEzICs3ODIsMzIgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisvKgorICoJT24gdGhlIGZpcnN0IG9wZW4gb2YgdGhlIGRldmljZSBzZXR1cCB0aGUgcG9ydCBoYXJkd2FyZSwgYW5kCisgKglpbml0aWFsaXplIHRoZSBwZXIgcG9ydCBkYXRhIHN0cnVjdHVyZS4gU2luY2UgaW5pdGlhbGl6aW5nIHRoZSBwb3J0CisgKglyZXF1aXJlcyBzZXZlcmFsIGNvbW1hbmRzIHRvIHRoZSBib2FyZCB3ZSB3aWxsIG5lZWQgdG8gd2FpdCBmb3IgYW55CisgKglvdGhlciBvcGVuIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXppbmcgdGhlIHBvcnQuCisgKgorICoJTG9ja2luZzogcHJvdGVjdGVkIGJ5IHRoZSBwb3J0IG11dGV4LgorICovCisKK3N0YXRpYyBpbnQgc3RsaV9hY3RpdmF0ZShzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHN0bGlwb3J0ICpwb3J0cCA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3Qgc3RsaXBvcnQsIHBvcnQpOworCXN0cnVjdCBzdGxpYnJkICpicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CisJaW50IHJjOworCisJaWYgKChyYyA9IHN0bGlfaW5pdG9wZW4odHR5LCBicmRwLCBwb3J0cCkpID49IDApCisJCWNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnRwLT5yYXdfd2FpdCk7CisJcmV0dXJuIHJjOworfQorCiBzdGF0aWMgaW50IHN0bGlfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlzdHJ1Y3Qgc3RsaWJyZCAqYnJkcDsKIAlzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwOwotCXN0cnVjdCB0dHlfcG9ydCAqcG9ydDsKIAl1bnNpZ25lZCBpbnQgbWlub3JkZXYsIGJyZG5yLCBwb3J0bnI7Ci0JaW50IHJjOwogCiAJbWlub3JkZXYgPSB0dHktPmluZGV4OwogCWJyZG5yID0gTUlOT1IyQlJEKG1pbm9yZGV2KTsKQEAgLTgwOSw5NSArODI3LDU2IEBACiAJCXJldHVybiAtRU5PREVWOwogCWlmIChwb3J0cC0+ZGV2bnIgPCAxKQogCQlyZXR1cm4gLUVOT0RFVjsKLQlwb3J0ID0gJnBvcnRwLT5wb3J0OwotCi0vKgotICoJT24gdGhlIGZpcnN0IG9wZW4gb2YgdGhlIGRldmljZSBzZXR1cCB0aGUgcG9ydCBoYXJkd2FyZSwgYW5kCi0gKglpbml0aWFsaXplIHRoZSBwZXIgcG9ydCBkYXRhIHN0cnVjdHVyZS4gU2luY2UgaW5pdGlhbGl6aW5nIHRoZSBwb3J0Ci0gKglyZXF1aXJlcyBzZXZlcmFsIGNvbW1hbmRzIHRvIHRoZSBib2FyZCB3ZSB3aWxsIG5lZWQgdG8gd2FpdCBmb3IgYW55Ci0gKglvdGhlciBvcGVuIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXppbmcgdGhlIHBvcnQuCi0gKgotICoJUmV2aWV3IC0gbG9ja2luZwotICovCi0JdHR5X3BvcnRfdHR5X3NldChwb3J0LCB0dHkpOwotCXR0eS0+ZHJpdmVyX2RhdGEgPSBwb3J0cDsKLQlwb3J0LT5jb3VudCsrOwotCi0Jd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBvcnRwLT5yYXdfd2FpdCwKLQkJCSF0ZXN0X2JpdChTVF9JTklUSUFMSVpJTkcsICZwb3J0cC0+c3RhdGUpKTsKLQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0KLQlpZiAoKHBvcnRwLT5wb3J0LmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpID09IDApIHsKLQkJc2V0X2JpdChTVF9JTklUSUFMSVpJTkcsICZwb3J0cC0+c3RhdGUpOwotCQlpZiAoKHJjID0gc3RsaV9pbml0b3Blbih0dHksIGJyZHAsIHBvcnRwKSkgPj0gMCkgewotCQkJLyogTG9ja2luZyAqLwotCQkJcG9ydC0+ZmxhZ3MgfD0gQVNZTkNfSU5JVElBTElaRUQ7Ci0JCQljbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncyk7Ci0JCX0KLQkJY2xlYXJfYml0KFNUX0lOSVRJQUxJWklORywgJnBvcnRwLT5zdGF0ZSk7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydHAtPnJhd193YWl0KTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQl9Ci0JcmV0dXJuIHR0eV9wb3J0X2Jsb2NrX3RpbF9yZWFkeSgmcG9ydHAtPnBvcnQsIHR0eSwgZmlscCk7CisJcmV0dXJuIHR0eV9wb3J0X29wZW4oJnBvcnRwLT5wb3J0LCB0dHksIGZpbHApOwogfQogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgc3RsaV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3N0YXRpYyB2b2lkIHN0bGlfc2h1dGRvd24oc3RydWN0IHR0eV9wb3J0ICpwb3J0KQogewogCXN0cnVjdCBzdGxpYnJkICpicmRwOwotCXN0cnVjdCBzdGxpcG9ydCAqcG9ydHA7Ci0Jc3RydWN0IHR0eV9wb3J0ICpwb3J0OworCXVuc2lnbmVkIGxvbmcgZnR5cGU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBzdGxpcG9ydCwgcG9ydCk7CiAKLQlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKHBvcnRwLT5icmRuciA+PSBzdGxpX25yYnJkcykKKwkJcmV0dXJuOworCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKKwlpZiAoYnJkcCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKgorCSAqCU1heSB3YW50IHRvIHdhaXQgZm9yIGRhdGEgdG8gZHJhaW4gYmVmb3JlIGNsb3NpbmcuIFRoZSBCVVNZCisJICoJZmxhZyBrZWVwcyB0cmFjayBvZiB3aGV0aGVyIHdlIGFyZSBzdGlsbCB0cmFuc21pdHRpbmcgb3Igbm90LgorCSAqCUl0IGlzIHVwZGF0ZWQgYnkgbWVzc2FnZXMgZnJvbSB0aGUgc2xhdmUgLSBpbmRpY2F0aW5nIHdoZW4gYWxsCisJICoJY2hhcnMgcmVhbGx5IGhhdmUgZHJhaW5lZC4KKwkgKi8KKworCWlmICghdGVzdF9iaXQoU1RfQ0xPU0lORywgJnBvcnRwLT5zdGF0ZSkpCisJCXN0bGlfcmF3Y2xvc2UoYnJkcCwgcG9ydHAsIDAsIDApOworCisgCXNwaW5fbG9ja19pcnFzYXZlKCZzdGxpX2xvY2ssIGZsYWdzKTsKKwljbGVhcl9iaXQoU1RfVFhCVVNZLCAmcG9ydHAtPnN0YXRlKTsKKwljbGVhcl9iaXQoU1RfUlhTVE9QLCAmcG9ydHAtPnN0YXRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGxpX2xvY2ssIGZsYWdzKTsKKworCWZ0eXBlID0gRkxVU0hUWCB8IEZMVVNIUlg7CisJc3RsaV9jbWR3YWl0KGJyZHAsIHBvcnRwLCBBX0ZMVVNILCAmZnR5cGUsIHNpemVvZih1MzIpLCAwKTsKK30KKworc3RhdGljIHZvaWQgc3RsaV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWlmIChwb3J0cCA9PSBOVUxMKQogCQlyZXR1cm47Ci0JcG9ydCA9ICZwb3J0cC0+cG9ydDsKLQotCWlmICh0dHlfcG9ydF9jbG9zZV9zdGFydChwb3J0LCB0dHksIGZpbHApID09IDApCi0JCXJldHVybjsKLQotLyoKLSAqCU1heSB3YW50IHRvIHdhaXQgZm9yIGRhdGEgdG8gZHJhaW4gYmVmb3JlIGNsb3NpbmcuIFRoZSBCVVNZIGZsYWcKLSAqCWtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgd2UgYXJlIHN0aWxsIHRyYW5zbWl0dGluZyBvciBub3QuIEl0IGlzCi0gKgl1cGRhdGVkIGJ5IG1lc3NhZ2VzIGZyb20gdGhlIHNsYXZlIC0gaW5kaWNhdGluZyB3aGVuIGFsbCBjaGFycwotICoJcmVhbGx5IGhhdmUgZHJhaW5lZC4KLSAqLwogIAlzcGluX2xvY2tfaXJxc2F2ZSgmc3RsaV9sb2NrLCBmbGFncyk7CisJLyoJRmx1c2ggYW55IGludGVybmFsIGJ1ZmZlcmluZyBvdXQgZmlyc3QgKi8KIAlpZiAodHR5ID09IHN0bGlfdHhjb29rdHR5KQogCQlzdGxpX2ZsdXNoY2hhcnModHR5KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGxpX2xvY2ssIGZsYWdzKTsKLQotCS8qIFdlIGVuZCB1cCBkb2luZyB0aGlzIHR3aWNlIGZvciB0aGUgbW9tZW50LiBUaGlzIG5lZWRzIGxvb2tpbmcgYXQKLQkgICBldmVudHVhbGx5LiBOb3RlIHdlIHN0aWxsIHVzZSBwb3J0cC0+Y2xvc2luZ193YWl0IGFzIGEgcmVzdWx0ICovCi0JaWYgKHBvcnRwLT5jbG9zaW5nX3dhaXQgIT0gQVNZTkNfQ0xPU0lOR19XQUlUX05PTkUpCi0JCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCBwb3J0cC0+Y2xvc2luZ193YWl0KTsKLQotCS8qIEZJWE1FOiBwb3J0IGxvY2tpbmcgaGVyZSBuZWVkcyBhdHRlbmRpbmcgdG8gKi8KLQlwb3J0LT5mbGFncyAmPSB+QVNZTkNfSU5JVElBTElaRUQ7Ci0KLQlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07Ci0Jc3RsaV9yYXdjbG9zZShicmRwLCBwb3J0cCwgMCwgMCk7Ci0JaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKSB7Ci0JCXN0bGlfbWthc3lzaWdzKCZwb3J0cC0+YXNpZywgMCwgMCk7Ci0JCWlmICh0ZXN0X2JpdChTVF9DTURJTkcsICZwb3J0cC0+c3RhdGUpKQotCQkJc2V0X2JpdChTVF9ET1NJR1MsICZwb3J0cC0+c3RhdGUpOwotCQllbHNlCi0JCQlzdGxpX3NlbmRjbWQoYnJkcCwgcG9ydHAsIEFfU0VUU0lHTkFMUywgJnBvcnRwLT5hc2lnLAotCQkJCXNpemVvZihhc3lzaWdzX3QpLCAwKTsKLQl9Ci0JY2xlYXJfYml0KFNUX1RYQlVTWSwgJnBvcnRwLT5zdGF0ZSk7Ci0JY2xlYXJfYml0KFNUX1JYU1RPUCwgJnBvcnRwLT5zdGF0ZSk7Ci0Jc2V0X2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKTsKLQl0dHlfbGRpc2NfZmx1c2godHR5KTsKLQlzZXRfYml0KFNUX0RPRkxVU0hSWCwgJnBvcnRwLT5zdGF0ZSk7Ci0Jc3RsaV9mbHVzaGJ1ZmZlcih0dHkpOwotCi0JdHR5X3BvcnRfY2xvc2VfZW5kKHBvcnQsIHR0eSk7Ci0JdHR5X3BvcnRfdHR5X3NldChwb3J0LCBOVUxMKTsKKwl0dHlfcG9ydF9jbG9zZSgmcG9ydHAtPnBvcnQsIHR0eSwgZmlscCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE3MjQsNiArMTcwMyw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorCiAvKgogICoJSGFuZ3VwIHRoaXMgcG9ydC4gVGhpcyBpcyBwcmV0dHkgbXVjaCBsaWtlIGNsb3NpbmcgdGhlIHBvcnQsIG9ubHkKICAqCWEgbGl0dGxlIG1vcmUgYnJ1dGFsLiBObyB3YWl0aW5nIGZvciBkYXRhIHRvIGRyYWluLiBTaHV0ZG93biB0aGUKQEAgLTE3MzMsNDcgKzE3MTMsOCBAQAogCiBzdGF0aWMgdm9pZCBzdGxpX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0cnVjdCBzdGxpcG9ydCAqcG9ydHA7Ci0Jc3RydWN0IHN0bGlicmQgKmJyZHA7Ci0Jc3RydWN0IHR0eV9wb3J0ICpwb3J0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKHBvcnRwID09IE5VTEwpCi0JCXJldHVybjsKLQlpZiAocG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKQotCQlyZXR1cm47Ci0JYnJkcCA9IHN0bGlfYnJkc1twb3J0cC0+YnJkbnJdOwotCWlmIChicmRwID09IE5VTEwpCi0JCXJldHVybjsKLQlwb3J0ID0gJnBvcnRwLT5wb3J0OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQlwb3J0LT5mbGFncyAmPSB+QVNZTkNfSU5JVElBTElaRUQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKCF0ZXN0X2JpdChTVF9DTE9TSU5HLCAmcG9ydHAtPnN0YXRlKSkKLQkJc3RsaV9yYXdjbG9zZShicmRwLCBwb3J0cCwgMCwgMCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RsaV9sb2NrLCBmbGFncyk7Ci0JaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKSB7Ci0JCXN0bGlfbWthc3lzaWdzKCZwb3J0cC0+YXNpZywgMCwgMCk7Ci0JCWlmICh0ZXN0X2JpdChTVF9DTURJTkcsICZwb3J0cC0+c3RhdGUpKSB7Ci0JCQlzZXRfYml0KFNUX0RPU0lHUywgJnBvcnRwLT5zdGF0ZSk7Ci0JCQlzZXRfYml0KFNUX0RPRkxVU0hUWCwgJnBvcnRwLT5zdGF0ZSk7Ci0JCQlzZXRfYml0KFNUX0RPRkxVU0hSWCwgJnBvcnRwLT5zdGF0ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdGxpX3NlbmRjbWQoYnJkcCwgcG9ydHAsIEFfU0VUU0lHTkFMU0YsCi0JCQkJJnBvcnRwLT5hc2lnLCBzaXplb2YoYXN5c2lnc190KSwgMCk7Ci0JCX0KLQl9Ci0KLQljbGVhcl9iaXQoU1RfVFhCVVNZLCAmcG9ydHAtPnN0YXRlKTsKLQljbGVhcl9iaXQoU1RfUlhTVE9QLCAmcG9ydHAtPnN0YXRlKTsKLQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0bGlfbG9jaywgZmxhZ3MpOwotCi0JdHR5X3BvcnRfaGFuZ3VwKHBvcnQpOworCXN0cnVjdCBzdGxpcG9ydCAqcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCXR0eV9wb3J0X2hhbmd1cCgmcG9ydHAtPnBvcnQpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00MzExLDcgKzQyNTIsNyBAQAogICoJcmVzZXQgaXQsIGFuZCBzdGFydC9zdG9wIGl0LgogICovCiAKLXN0YXRpYyBpbnQgc3RsaV9tZW1pb2N0bChzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZmlsZSAqZnAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGxvbmcgc3RsaV9tZW1pb2N0bChzdHJ1Y3QgZmlsZSAqZnAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBzdGxpYnJkICpicmRwOwogCWludCBicmRuciwgcmMsIGRvbmU7CkBAIC00MzU2LDcgKzQyOTcsNyBAQAogICoJTm93IGhhbmRsZSB0aGUgYm9hcmQgc3BlY2lmaWMgaW9jdGxzLiBUaGVzZSBhbGwgZGVwZW5kIG9uIHRoZQogICoJbWlub3IgbnVtYmVyIG9mIHRoZSBkZXZpY2UgdGhleSB3ZXJlIGNhbGxlZCBmcm9tLgogICovCi0JYnJkbnIgPSBpbWlub3IoaXApOworCWJyZG5yID0gaW1pbm9yKGZwLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CiAJaWYgKGJyZG5yID49IFNUTF9NQVhCUkRTKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlicmRwID0gc3RsaV9icmRzW2JyZG5yXTsKQEAgLTQ0MjAsNiArNDM2MSw4IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHR0eV9wb3J0X29wZXJhdGlvbnMgc3RsaV9wb3J0X29wcyA9IHsKIAkuY2Fycmllcl9yYWlzZWQgPSBzdGxpX2NhcnJpZXJfcmFpc2VkLAogCS5kdHJfcnRzID0gc3RsaV9kdHJfcnRzLAorCS5hY3RpdmF0ZSA9IHN0bGlfYWN0aXZhdGUsCisJLnNodXRkb3duID0gc3RsaV9zaHV0ZG93biwKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9scC5jIGIvZHJpdmVycy9jaGFyL2xwLmMKaW5kZXggZTQ0NGMyZC4uOTM4YTNhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2xwLmMKKysrIGIvZHJpdmVycy9jaGFyL2xwLmMKQEAgLTEyNyw2ICsxMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KICN1bmRlZiBMUF9TVEFUUwpAQCAtNTcxLDEzICs1NzIsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBscF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCBscF9kb19pb2N0bCh1bnNpZ25lZCBpbnQgbWlub3IsIHVuc2lnbmVkIGludCBjbWQsCisJdW5zaWduZWQgbG9uZyBhcmcsIHZvaWQgX191c2VyICphcmdwKQogewotCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CiAJaW50IHN0YXR1czsKIAlpbnQgcmV0dmFsID0gMDsKLQl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAogI2lmZGVmIExQX0RFQlVHCiAJcHJpbnRrKEtFUk5fREVCVUcgImxwJWQgaW9jdGwsIGNtZDogMHgleCwgYXJnOiAweCVseFxuIiwgbWlub3IsIGNtZCwgYXJnKTsKQEAgLTU4Nyw5ICs1ODYsNiBAQAogCWlmICgoTFBfRihtaW5vcikgJiBMUF9FWElTVCkgPT0gMCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJc3dpdGNoICggY21kICkgewotCQlzdHJ1Y3QgdGltZXZhbCBwYXJfdGltZW91dDsKLQkJbG9uZyB0b19qaWZmaWVzOwotCiAJCWNhc2UgTFBUSU1FOgogCQkJTFBfVElNRShtaW5vcikgPSBhcmcgKiBIWi8xMDA7CiAJCQlicmVhazsKQEAgLTY1MiwzNCArNjQ4LDEwMSBAQAogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJYnJlYWs7CiAKLQkJY2FzZSBMUFNFVFRJTUVPVVQ6Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIgKCZwYXJfdGltZW91dCwgYXJncCwKLQkJCQkJICAgIHNpemVvZiAoc3RydWN0IHRpbWV2YWwpKSkgewotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJfQotCQkJLyogQ29udmVydCB0byBqaWZmaWVzLCBwbGFjZSBpbiBscF90YWJsZSAqLwotCQkJaWYgKChwYXJfdGltZW91dC50dl9zZWMgPCAwKSB8fAotCQkJICAgIChwYXJfdGltZW91dC50dl91c2VjIDwgMCkpIHsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJCXRvX2ppZmZpZXMgPSBESVZfUk9VTkRfVVAocGFyX3RpbWVvdXQudHZfdXNlYywgMTAwMDAwMC9IWik7Ci0JCQl0b19qaWZmaWVzICs9IHBhcl90aW1lb3V0LnR2X3NlYyAqIChsb25nKSBIWjsKLQkJCWlmICh0b19qaWZmaWVzIDw9IDApIHsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJCWxwX3RhYmxlW21pbm9yXS50aW1lb3V0ID0gdG9famlmZmllczsKLQkJCWJyZWFrOwotCiAJCWRlZmF1bHQ6CiAJCQlyZXR2YWwgPSAtRUlOVkFMOwogCX0KIAlyZXR1cm4gcmV0dmFsOwogfQogCitzdGF0aWMgaW50IGxwX3NldF90aW1lb3V0KHVuc2lnbmVkIGludCBtaW5vciwgc3RydWN0IHRpbWV2YWwgKnBhcl90aW1lb3V0KQoreworCWxvbmcgdG9famlmZmllczsKKworCS8qIENvbnZlcnQgdG8gamlmZmllcywgcGxhY2UgaW4gbHBfdGFibGUgKi8KKwlpZiAoKHBhcl90aW1lb3V0LT50dl9zZWMgPCAwKSB8fAorCSAgICAocGFyX3RpbWVvdXQtPnR2X3VzZWMgPCAwKSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdG9famlmZmllcyA9IERJVl9ST1VORF9VUChwYXJfdGltZW91dC0+dHZfdXNlYywgMTAwMDAwMC9IWik7CisJdG9famlmZmllcyArPSBwYXJfdGltZW91dC0+dHZfc2VjICogKGxvbmcpIEhaOworCWlmICh0b19qaWZmaWVzIDw9IDApIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWxwX3RhYmxlW21pbm9yXS50aW1lb3V0ID0gdG9famlmZmllczsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgbHBfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3I7CisJc3RydWN0IHRpbWV2YWwgcGFyX3RpbWVvdXQ7CisJaW50IHJldDsKKworCW1pbm9yID0gaW1pbm9yKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOworCWxvY2tfa2VybmVsKCk7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIExQU0VUVElNRU9VVDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwYXJfdGltZW91dCwgKHZvaWQgX191c2VyICopYXJnLAorCQkJCQlzaXplb2YgKHN0cnVjdCB0aW1ldmFsKSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSBscF9zZXRfdGltZW91dChtaW5vciwgJnBhcl90aW1lb3V0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gbHBfZG9faW9jdGwobWlub3IsIGNtZCwgYXJnLCAodm9pZCBfX3VzZXIgKilhcmcpOworCQlicmVhazsKKwl9CisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIENPTkZJR19DT01QQVQKK3N0YXRpYyBsb25nIGxwX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVuc2lnbmVkIGludCBtaW5vcjsKKwlzdHJ1Y3QgdGltZXZhbCBwYXJfdGltZW91dDsKKwlzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICp0YzsKKwlpbnQgcmV0OworCisJbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJbG9ja19rZXJuZWwoKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTFBTRVRUSU1FT1VUOgorCQl0YyA9IGNvbXBhdF9wdHIoYXJnKTsKKwkJaWYgKGdldF91c2VyKHBhcl90aW1lb3V0LnR2X3NlYywgJnRjLT50dl9zZWMpIHx8CisJCSAgICBnZXRfdXNlcihwYXJfdGltZW91dC50dl91c2VjLCAmdGMtPnR2X3VzZWMpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ID0gbHBfc2V0X3RpbWVvdXQobWlub3IsICZwYXJfdGltZW91dCk7CisJCWJyZWFrOworI2lmZGVmIExQX1NUQVRTCisJY2FzZSBMUEdFVFNUQVRTOgorCQkvKiBGSVhNRTogYWRkIGFuIGltcGxlbWVudGF0aW9uIGlmIHlvdSBzZXQgTFBfU1RBVFMgKi8KKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlyZXQgPSBscF9kb19pb2N0bChtaW5vciwgY21kLCBhcmcsIGNvbXBhdF9wdHIoYXJnKSk7CisJCWJyZWFrOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxwX2ZvcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS53cml0ZQkJPSBscF93cml0ZSwKLQkuaW9jdGwJCT0gbHBfaW9jdGwsCisJLnVubG9ja2VkX2lvY3RsCT0gbHBfaW9jdGwsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwJPSBscF9jb21wYXRfaW9jdGwsCisjZW5kaWYKIAkub3BlbgkJPSBscF9vcGVuLAogCS5yZWxlYXNlCT0gbHBfcmVsZWFzZSwKICNpZmRlZiBDT05GSUdfUEFSUE9SVF8xMjg0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbWVtLmMgYi9kcml2ZXJzL2NoYXIvbWVtLmMKaW5kZXggMzBlZmY4MC4uZmJhNzZmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL21lbS5jCisrKyBiL2RyaXZlcnMvY2hhci9tZW0uYwpAQCAtNDMsNyArNDMsNyBAQAogewogI2lmIGRlZmluZWQoQ09ORklHX0lBNjQpCiAJLyoKLQkgKiBPbiBpYTY0LCB3ZSBpZ25vcmUgT19TWU5DIGJlY2F1c2Ugd2UgY2Fubm90IHRvbGVyYXRlIG1lbW9yeSBhdHRyaWJ1dGUgYWxpYXNlcy4KKwkgKiBPbiBpYTY0LCB3ZSBpZ25vcmUgT19EU1lOQyBiZWNhdXNlIHdlIGNhbm5vdCB0b2xlcmF0ZSBtZW1vcnkgYXR0cmlidXRlIGFsaWFzZXMuCiAJICovCiAJcmV0dXJuICEoZWZpX21lbV9hdHRyaWJ1dGVzKGFkZHIpICYgRUZJX01FTU9SWV9XQik7CiAjZWxpZiBkZWZpbmVkKENPTkZJR19NSVBTKQpAQCAtNTYsOSArNTYsOSBAQAogI2Vsc2UKIAkvKgogCSAqIEFjY2Vzc2luZyBtZW1vcnkgYWJvdmUgdGhlIHRvcCB0aGUga2VybmVsIGtub3dzIGFib3V0IG9yIHRocm91Z2ggYSBmaWxlIHBvaW50ZXIKLQkgKiB0aGF0IHdhcyBtYXJrZWQgT19TWU5DIHdpbGwgYmUgZG9uZSBub24tY2FjaGVkLgorCSAqIHRoYXQgd2FzIG1hcmtlZCBPX0RTWU5DIHdpbGwgYmUgZG9uZSBub24tY2FjaGVkLgogCSAqLwotCWlmIChmaWxlLT5mX2ZsYWdzICYgT19TWU5DKQorCWlmIChmaWxlLT5mX2ZsYWdzICYgT19EU1lOQykKIAkJcmV0dXJuIDE7CiAJcmV0dXJuIGFkZHIgPj0gX19wYShoaWdoX21lbW9yeSk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9tb3hhLmMgYi9kcml2ZXJzL2NoYXIvbW94YS5jCmluZGV4IGRkMDA4M2IuLjYzZWUzYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9tb3hhLmMKKysrIGIvZHJpdmVycy9jaGFyL21veGEuYwpAQCAtMzQsNyArMzQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CiAjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CkBAIC0xMzksNyArMTM4LDcgQEAKIAlpbnQgY2ZsYWc7CiAJdW5zaWduZWQgbG9uZyBzdGF0dXNmbGFnczsKIAotCXU4IERDRFN0YXRlOworCXU4IERDRFN0YXRlOwkJLyogUHJvdGVjdGVkIGJ5IHRoZSBwb3J0IGxvY2sgKi8KIAl1OCBsaW5lQ3RybDsKIAl1OCBsb3dDaGtGbGFnOwogfTsKQEAgLTE1MSwxMCArMTUwLDkgQEAKIH07CiAKIC8qIHN0YXR1c2ZsYWdzICovCi0jZGVmaW5lIFRYU1RPUFBFRAkweDEKLSNkZWZpbmUgTE9XV0FJVCAJMHgyCi0jZGVmaW5lIEVNUFRZV0FJVAkweDQKLSNkZWZpbmUgVEhST1RUTEUJMHg4CisjZGVmaW5lIFRYU1RPUFBFRAkxCisjZGVmaW5lIExPV1dBSVQgCTIKKyNkZWZpbmUgRU1QVFlXQUlUCTMKIAogI2RlZmluZSBTRVJJQUxfRE9fUkVTVEFSVAogCkBAIC0xNjUsNiArMTYzLDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbW94YUZ1bmNUb3V0ID0gSFogLyAyOwogc3RhdGljIHVuc2lnbmVkIGludCBtb3hhTG93V2F0ZXJDaGs7CiBzdGF0aWMgREVGSU5FX01VVEVYKG1veGFfb3BlbmxvY2spOworc3RhdGljIERFRklORV9TUElOTE9DSyhtb3hhX2xvY2spOwogLyogVmFyaWFibGVzIGZvciBpbnNtb2QgKi8KICNpZmRlZiBNT0RVTEUKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGJhc2VhZGRyW01BWF9CT0FSRFNdOwpAQCAtMTk0LDggKzE5Myw2IEBACiBzdGF0aWMgaW50IG1veGFfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKIHN0YXRpYyB2b2lkIG1veGFfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICopOwogc3RhdGljIGludCBtb3hhX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKLXN0YXRpYyB2b2lkIG1veGFfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKik7Ci1zdGF0aWMgdm9pZCBtb3hhX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CiBzdGF0aWMgdm9pZCBtb3hhX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBrdGVybWlvcyAqKTsKIHN0YXRpYyB2b2lkIG1veGFfc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKIHN0YXRpYyB2b2lkIG1veGFfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CkBAIC0yMDUsOSArMjAyLDkgQEAKIAkJCSB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpOwogc3RhdGljIHZvaWQgbW94YV9wb2xsKHVuc2lnbmVkIGxvbmcpOwogc3RhdGljIHZvaWQgbW94YV9zZXRfdHR5X3BhcmFtKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBrdGVybWlvcyAqKTsKLXN0YXRpYyB2b2lkIG1veGFfc2V0dXBfZW1wdHlfZXZlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKik7Ci1zdGF0aWMgdm9pZCBtb3hhX3NodXRfZG93bihzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIG1veGFfc2h1dGRvd24oc3RydWN0IHR0eV9wb3J0ICopOwogc3RhdGljIGludCBtb3hhX2NhcnJpZXJfcmFpc2VkKHN0cnVjdCB0dHlfcG9ydCAqKTsKK3N0YXRpYyB2b2lkIG1veGFfZHRyX3J0cyhzdHJ1Y3QgdHR5X3BvcnQgKiwgaW50KTsKIC8qCiAgKiBtb3hhIGJvYXJkIGludGVyZmFjZSBmdW5jdGlvbnM6CiAgKi8KQEAgLTIzNCw2ICsyMzEsOCBAQAogICogSS9PIGZ1bmN0aW9ucwogICovCiAKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobW94YWZ1bmNfbG9jayk7CisKIHN0YXRpYyB2b2lkIG1veGFfd2FpdF9maW5pc2godm9pZCBfX2lvbWVtICpvZnNBZGRyKQogewogCXVuc2lnbmVkIGxvbmcgZW5kID0gamlmZmllcyArIG1veGFGdW5jVG91dDsKQEAgLTI0Nyw5ICsyNDYsMjUgQEAKIAogc3RhdGljIHZvaWQgbW94YWZ1bmModm9pZCBfX2lvbWVtICpvZnNBZGRyLCB1MTYgY21kLCB1MTYgYXJnKQogeworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbW94YWZ1bmNfbG9jaywgZmxhZ3MpOwogCXdyaXRldyhhcmcsIG9mc0FkZHIgKyBGdW5jQXJnKTsKIAl3cml0ZXcoY21kLCBvZnNBZGRyICsgRnVuY0NvZGUpOwogCW1veGFfd2FpdF9maW5pc2gob2ZzQWRkcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbW94YWZ1bmNfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IG1veGFmdW5jcmV0KHZvaWQgX19pb21lbSAqb2ZzQWRkciwgdTE2IGNtZCwgdTE2IGFyZykKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAgdTE2IHJldDsKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1veGFmdW5jX2xvY2ssIGZsYWdzKTsKKwl3cml0ZXcoYXJnLCBvZnNBZGRyICsgRnVuY0FyZyk7CisJd3JpdGV3KGNtZCwgb2ZzQWRkciArIEZ1bmNDb2RlKTsKKwltb3hhX3dhaXRfZmluaXNoKG9mc0FkZHIpOworCXJldCA9IHJlYWR3KG9mc0FkZHIgKyBGdW5jQXJnKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtb3hhZnVuY19sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgbW94YV9sb3dfd2F0ZXJfY2hlY2sodm9pZCBfX2lvbWVtICpvZnNBZGRyKQpAQCAtMjk5LDIyICszMTQsMjAgQEAKIAkJc3RydWN0IG1veGFfcG9ydCAqcDsKIAkJdW5zaWduZWQgaW50IGksIGo7CiAKLQkJbXV0ZXhfbG9jaygmbW94YV9vcGVubG9jayk7CiAJCWZvciAoaSA9IDA7IGkgPCBNQVhfQk9BUkRTOyBpKyspIHsKIAkJCXAgPSBtb3hhX2JvYXJkc1tpXS5wb3J0czsKIAkJCWZvciAoaiA9IDA7IGogPCBNQVhfUE9SVFNfUEVSX0JPQVJEOyBqKyssIHArKywgYXJnbSsrKSB7CiAJCQkJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKKwkJCQlzcGluX2xvY2tfYmgoJm1veGFfbG9jayk7CiAJCQkJaWYgKG1veGFfYm9hcmRzW2ldLnJlYWR5KSB7CiAJCQkJCXRtcC5pbnEgPSBNb3hhUG9ydFJ4UXVldWUocCk7CiAJCQkJCXRtcC5vdXRxID0gTW94YVBvcnRUeFF1ZXVlKHApOwogCQkJCX0KLQkJCQlpZiAoY29weV90b191c2VyKGFyZ20sICZ0bXAsIHNpemVvZih0bXApKSkgewotCQkJCQltdXRleF91bmxvY2soJm1veGFfb3BlbmxvY2spOworCQkJCXNwaW5fdW5sb2NrX2JoKCZtb3hhX2xvY2spOworCQkJCWlmIChjb3B5X3RvX3VzZXIoYXJnbSwgJnRtcCwgc2l6ZW9mKHRtcCkpKQogCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQl9CiAJCQl9CiAJCX0KLQkJbXV0ZXhfdW5sb2NrKCZtb3hhX29wZW5sb2NrKTsKIAkJYnJlYWs7CiAJfSBjYXNlIE1PWEFfR0VUX09RVUVVRToKIAkJc3RhdHVzID0gTW94YVBvcnRUeFF1ZXVlKGNoKTsKQEAgLTMzMCwxNiArMzQzLDIwIEBACiAJCXN0cnVjdCBtb3hhX3BvcnQgKnA7CiAJCXVuc2lnbmVkIGludCBpLCBqOwogCi0JCW11dGV4X2xvY2soJm1veGFfb3BlbmxvY2spOwogCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0JPQVJEUzsgaSsrKSB7CiAJCQlwID0gbW94YV9ib2FyZHNbaV0ucG9ydHM7CiAJCQlmb3IgKGogPSAwOyBqIDwgTUFYX1BPUlRTX1BFUl9CT0FSRDsgaisrLCBwKyssIGFyZ20rKykgewogCQkJCXN0cnVjdCB0dHlfc3RydWN0ICp0dHlwOwogCQkJCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7Ci0JCQkJaWYgKCFtb3hhX2JvYXJkc1tpXS5yZWFkeSkKKwkJCQlzcGluX2xvY2tfYmgoJm1veGFfbG9jayk7CisJCQkJaWYgKCFtb3hhX2JvYXJkc1tpXS5yZWFkeSkgeworCQkJCSAgICAgICAgc3Bpbl91bmxvY2tfYmgoJm1veGFfbG9jayk7CiAJCQkJCWdvdG8gY29weTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAJCQkJc3RhdHVzID0gTW94YVBvcnRMaW5lU3RhdHVzKHApOworCQkJCXNwaW5fdW5sb2NrX2JoKCZtb3hhX2xvY2spOworCiAJCQkJaWYgKHN0YXR1cyAmIDEpCiAJCQkJCXRtcC5jdHMgPSAxOwogCQkJCWlmIChzdGF0dXMgJiAyKQpAQCAtMzU0LDI0ICszNzEsMjEgQEAKIAkJCQkJdG1wLmNmbGFnID0gdHR5cC0+dGVybWlvcy0+Y19jZmxhZzsKIAkJCQl0dHlfa3JlZl9wdXQodHR5KTsKIGNvcHk6Ci0JCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdtLCAmdG1wLCBzaXplb2YodG1wKSkpIHsKLQkJCQkJbXV0ZXhfdW5sb2NrKCZtb3hhX29wZW5sb2NrKTsKKwkJCQlpZiAoY29weV90b191c2VyKGFyZ20sICZ0bXAsIHNpemVvZih0bXApKSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQogCQkJfQogCQl9Ci0JCW11dGV4X3VubG9jaygmbW94YV9vcGVubG9jayk7CiAJCWJyZWFrOwogCX0KIAljYXNlIFRJT0NHU0VSSUFMOgotCQltdXRleF9sb2NrKCZtb3hhX29wZW5sb2NrKTsKKwkgICAgICAgIG11dGV4X2xvY2soJmNoLT5wb3J0Lm11dGV4KTsKIAkJcmV0ID0gbW94YV9nZXRfc2VyaWFsX2luZm8oY2gsIGFyZ3ApOwotCQltdXRleF91bmxvY2soJm1veGFfb3BlbmxvY2spOworCQltdXRleF91bmxvY2soJmNoLT5wb3J0Lm11dGV4KTsKIAkJYnJlYWs7CiAJY2FzZSBUSU9DU1NFUklBTDoKLQkJbXV0ZXhfbG9jaygmbW94YV9vcGVubG9jayk7CisJICAgICAgICBtdXRleF9sb2NrKCZjaC0+cG9ydC5tdXRleCk7CiAJCXJldCA9IG1veGFfc2V0X3NlcmlhbF9pbmZvKGNoLCBhcmdwKTsKLQkJbXV0ZXhfdW5sb2NrKCZtb3hhX29wZW5sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZjaC0+cG9ydC5tdXRleCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldCA9IC1FTk9JT0NUTENNRDsKQEAgLTM5Niw4ICs0MTAsNiBAQAogCS5mbHVzaF9idWZmZXIgPSBtb3hhX2ZsdXNoX2J1ZmZlciwKIAkuY2hhcnNfaW5fYnVmZmVyID0gbW94YV9jaGFyc19pbl9idWZmZXIsCiAJLmlvY3RsID0gbW94YV9pb2N0bCwKLQkudGhyb3R0bGUgPSBtb3hhX3Rocm90dGxlLAotCS51bnRocm90dGxlID0gbW94YV91bnRocm90dGxlLAogCS5zZXRfdGVybWlvcyA9IG1veGFfc2V0X3Rlcm1pb3MsCiAJLnN0b3AgPSBtb3hhX3N0b3AsCiAJLnN0YXJ0ID0gbW94YV9zdGFydCwKQEAgLTQwOSwxMSArNDIxLDEyIEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X3BvcnRfb3BlcmF0aW9ucyBtb3hhX3BvcnRfb3BzID0gewogCS5jYXJyaWVyX3JhaXNlZCA9IG1veGFfY2Fycmllcl9yYWlzZWQsCisJLmR0cl9ydHMgPSBtb3hhX2R0cl9ydHMsCisJLnNodXRkb3duID0gbW94YV9zaHV0ZG93biwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqbW94YURyaXZlcjsKIHN0YXRpYyBERUZJTkVfVElNRVIobW94YVRpbWVyLCBtb3hhX3BvbGwsIDAsIDApOwotc3RhdGljIERFRklORV9TUElOTE9DSyhtb3hhX2xvY2spOwogCiAvKgogICogSFcgaW5pdApAQCAtMTExMiwxNCArMTEyNSwxMiBAQAogbW9kdWxlX2luaXQobW94YV9pbml0KTsKIG1vZHVsZV9leGl0KG1veGFfZXhpdCk7CiAKLXN0YXRpYyB2b2lkIG1veGFfY2xvc2VfcG9ydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQorc3RhdGljIHZvaWQgbW94YV9zaHV0ZG93bihzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpCiB7Ci0Jc3RydWN0IG1veGFfcG9ydCAqY2ggPSB0dHktPmRyaXZlcl9kYXRhOwotCW1veGFfc2h1dF9kb3duKHR0eSk7CisJc3RydWN0IG1veGFfcG9ydCAqY2ggPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IG1veGFfcG9ydCwgcG9ydCk7CisgICAgICAgIE1veGFQb3J0RGlzYWJsZShjaCk7CiAJTW94YVBvcnRGbHVzaERhdGEoY2gsIDIpOwotCWNoLT5wb3J0LmZsYWdzICY9IH5BU1lOQ19OT1JNQUxfQUNUSVZFOwotCXR0eS0+ZHJpdmVyX2RhdGEgPSBOVUxMOwotCXR0eV9wb3J0X3R0eV9zZXQoJmNoLT5wb3J0LCBOVUxMKTsKKwljbGVhcl9iaXQoQVNZTkNCX05PUk1BTF9BQ1RJVkUsICZwb3J0LT5mbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQgbW94YV9jYXJyaWVyX3JhaXNlZChzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpCkBAIC0xMTI3LDQ1ICsxMTM4LDE5IEBACiAJc3RydWN0IG1veGFfcG9ydCAqY2ggPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IG1veGFfcG9ydCwgcG9ydCk7CiAJaW50IGRjZDsKIAotCXNwaW5fbG9ja19iaCgmbW94YV9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZwb3J0LT5sb2NrKTsKIAlkY2QgPSBjaC0+RENEU3RhdGU7Ci0Jc3Bpbl91bmxvY2tfYmgoJm1veGFfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZwb3J0LT5sb2NrKTsKIAlyZXR1cm4gZGNkOwogfQogCi1zdGF0aWMgaW50IG1veGFfYmxvY2tfdGlsbF9yZWFkeShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCSAgICBzdHJ1Y3QgbW94YV9wb3J0ICpjaCkKK3N0YXRpYyB2b2lkIG1veGFfZHRyX3J0cyhzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQsIGludCBvbm9mZikKIHsKLQlzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQgPSAmY2gtPnBvcnQ7Ci0JREVGSU5FX1dBSVQod2FpdCk7Ci0JaW50IHJldHZhbCA9IDA7Ci0JdTggZGNkOwotCi0Jd2hpbGUgKDEpIHsKLQkJcHJlcGFyZV90b193YWl0KCZwb3J0LT5vcGVuX3dhaXQsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkgewotI2lmZGVmIFNFUklBTF9ET19SRVNUQVJUCi0JCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7Ci0jZWxzZQotCQkJcmV0dmFsID0gLUVBR0FJTjsKLSNlbmRpZgotCQkJYnJlYWs7Ci0JCX0KLQkJZGNkID0gdHR5X3BvcnRfY2Fycmllcl9yYWlzZWQocG9ydCk7Ci0JCWlmIChkY2QpCi0JCQlicmVhazsKLQotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKLQkJCWJyZWFrOwotCQl9Ci0JCXNjaGVkdWxlKCk7Ci0JfQotCWZpbmlzaF93YWl0KCZwb3J0LT5vcGVuX3dhaXQsICZ3YWl0KTsKLQotCXJldHVybiByZXR2YWw7CisJc3RydWN0IG1veGFfcG9ydCAqY2ggPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IG1veGFfcG9ydCwgcG9ydCk7CisJTW94YVBvcnRMaW5lQ3RybChjaCwgb25vZmYsIG9ub2ZmKTsKIH0KIAorCiBzdGF0aWMgaW50IG1veGFfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlzdHJ1Y3QgbW94YV9ib2FyZF9jb25mICpicmQ7CkBAIC0xMTk0LDYgKzExNzksNyBAQAogCWNoLT5wb3J0LmNvdW50Kys7CiAJdHR5LT5kcml2ZXJfZGF0YSA9IGNoOwogCXR0eV9wb3J0X3R0eV9zZXQoJmNoLT5wb3J0LCB0dHkpOworCW11dGV4X2xvY2soJmNoLT5wb3J0Lm11dGV4KTsKIAlpZiAoIShjaC0+cG9ydC5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkgewogCQljaC0+c3RhdHVzZmxhZ3MgPSAwOwogCQltb3hhX3NldF90dHlfcGFyYW0odHR5LCB0dHktPnRlcm1pb3MpOwpAQCAtMTIwMiw1OCArMTE4OCwyMCBAQAogCQlNb3hhU2V0RmlmbyhjaCwgY2gtPnR5cGUgPT0gUE9SVF8xNjU1MEEpOwogCQljaC0+cG9ydC5mbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKIAl9CisJbXV0ZXhfdW5sb2NrKCZjaC0+cG9ydC5tdXRleCk7CiAJbXV0ZXhfdW5sb2NrKCZtb3hhX29wZW5sb2NrKTsKIAotCXJldHZhbCA9IDA7Ci0JaWYgKCEoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spICYmICFDX0NMT0NBTCh0dHkpKQotCQlyZXR2YWwgPSBtb3hhX2Jsb2NrX3RpbGxfcmVhZHkodHR5LCBmaWxwLCBjaCk7Ci0JbXV0ZXhfbG9jaygmbW94YV9vcGVubG9jayk7Ci0JaWYgKHJldHZhbCkgewotCQlpZiAoY2gtPnBvcnQuY291bnQpIC8qIDAgbWVhbnMgYWxyZWFkeSBodW5nIHVwLi4uICovCi0JCQlpZiAoLS1jaC0+cG9ydC5jb3VudCA9PSAwKQotCQkJCW1veGFfY2xvc2VfcG9ydCh0dHkpOwotCX0gZWxzZQotCQljaC0+cG9ydC5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOwotCW11dGV4X3VubG9jaygmbW94YV9vcGVubG9jayk7Ci0KKwlyZXR2YWwgPSB0dHlfcG9ydF9ibG9ja190aWxfcmVhZHkoJmNoLT5wb3J0LCB0dHksIGZpbHApOworCWlmIChyZXR2YWwgPT0gMCkKKwkgICAgICAgIHNldF9iaXQoQVNZTkNCX05PUk1BTF9BQ1RJVkUsICZjaC0+cG9ydC5mbGFncyk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIHZvaWQgbW94YV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlzdHJ1Y3QgbW94YV9wb3J0ICpjaDsKLQlpbnQgcG9ydDsKLQotCXBvcnQgPSB0dHktPmluZGV4OwotCWlmIChwb3J0ID09IE1BWF9QT1JUUyB8fCB0dHlfaHVuZ191cF9wKGZpbHApKQotCQlyZXR1cm47Ci0KLQltdXRleF9sb2NrKCZtb3hhX29wZW5sb2NrKTsKLQljaCA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKGNoID09IE5VTEwpCi0JCWdvdG8gdW5sb2NrOwotCWlmICh0dHktPmNvdW50ID09IDEgJiYgY2gtPnBvcnQuY291bnQgIT0gMSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJtb3hhX2Nsb3NlOiBiYWQgc2VyaWFsIHBvcnQgY291bnQ7ICIKLQkJCSJ0dHktPmNvdW50IGlzIDEsIGNoLT5wb3J0LmNvdW50IGlzICVkXG4iLCBjaC0+cG9ydC5jb3VudCk7Ci0JCWNoLT5wb3J0LmNvdW50ID0gMTsKLQl9Ci0JaWYgKC0tY2gtPnBvcnQuY291bnQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIm1veGFfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudCwgIgotCQkJImRldmljZT0lc1xuIiwgdHR5LT5uYW1lKTsKLQkJY2gtPnBvcnQuY291bnQgPSAwOwotCX0KLQlpZiAoY2gtPnBvcnQuY291bnQpCi0JCWdvdG8gdW5sb2NrOwotCisJc3RydWN0IG1veGFfcG9ydCAqY2ggPSB0dHktPmRyaXZlcl9kYXRhOwogCWNoLT5jZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKLQlpZiAoY2gtPnBvcnQuZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgewotCQltb3hhX3NldHVwX2VtcHR5X2V2ZW50KHR0eSk7Ci0JCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAzMCAqIEhaKTsJLyogMzAgc2Vjb25kcyB0aW1lb3V0ICovCi0JfQotCi0JbW94YV9jbG9zZV9wb3J0KHR0eSk7Ci11bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZtb3hhX29wZW5sb2NrKTsKKwl0dHlfcG9ydF9jbG9zZSgmY2gtPnBvcnQsIHR0eSwgZmlscCk7CiB9CiAKIHN0YXRpYyBpbnQgbW94YV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LApAQCAtMTI2OSw3ICsxMjE3LDcgQEAKIAlsZW4gPSBNb3hhUG9ydFdyaXRlRGF0YSh0dHksIGJ1ZiwgY291bnQpOwogCXNwaW5fdW5sb2NrX2JoKCZtb3hhX2xvY2spOwogCi0JY2gtPnN0YXR1c2ZsYWdzIHw9IExPV1dBSVQ7CisJc2V0X2JpdChMT1dXQUlULCAmY2gtPnN0YXR1c2ZsYWdzKTsKIAlyZXR1cm4gbGVuOwogfQogCkBAIC0xMzAwLDQwICsxMjQ4LDIxIEBACiAJc3RydWN0IG1veGFfcG9ydCAqY2ggPSB0dHktPmRyaXZlcl9kYXRhOwogCWludCBjaGFyczsKIAotCS8qCi0JICogU2lnaC4uLkkgaGF2ZSB0byBjaGVjayBpZiBkcml2ZXJfZGF0YSBpcyBOVUxMIGhlcmUsIGJlY2F1c2UKLQkgKiBpZiBhbiBvcGVuKCkgZmFpbHMsIHRoZSBUVFkgc3Vic3lzdGVtIGV2ZW50dWFsbHkgY2FsbHMKLQkgKiB0dHlfd2FpdF91bnRpbF9zZW50KCksIHdoaWNoIGNhbGxzIHRoZSBkcml2ZXIncyBjaGFyc19pbl9idWZmZXIoKQotCSAqIHJvdXRpbmUuICBBbmQgc2luY2UgdGhlIG9wZW4oKSBmYWlsZWQsIHdlIHJldHVybiAwIGhlcmUuICBUREoKLQkgKi8KLQlpZiAoY2ggPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JbG9ja19rZXJuZWwoKTsKIAljaGFycyA9IE1veGFQb3J0VHhRdWV1ZShjaCk7Ci0JaWYgKGNoYXJzKSB7CisJaWYgKGNoYXJzKQogCQkvKgogCQkgKiBNYWtlIGl0IHBvc3NpYmxlIHRvIHdha2V1cCBhbnl0aGluZyB3YWl0aW5nIGZvciBvdXRwdXQKIAkJICogaW4gdHR5X2lvY3RsLmMsIGV0Yy4KIAkJICovCi0JCWlmICghKGNoLT5zdGF0dXNmbGFncyAmIEVNUFRZV0FJVCkpCi0JCQltb3hhX3NldHVwX2VtcHR5X2V2ZW50KHR0eSk7Ci0JfQotCXVubG9ja19rZXJuZWwoKTsKKyAgICAgICAgCXNldF9iaXQoRU1QVFlXQUlULCAmY2gtPnN0YXR1c2ZsYWdzKTsKIAlyZXR1cm4gY2hhcnM7CiB9CiAKIHN0YXRpYyBpbnQgbW94YV90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgbW94YV9wb3J0ICpjaDsKKwlzdHJ1Y3QgbW94YV9wb3J0ICpjaCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaW50IGZsYWcgPSAwLCBkdHIsIHJ0czsKIAotCW11dGV4X2xvY2soJm1veGFfb3BlbmxvY2spOwotCWNoID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIWNoKSB7Ci0JCW11dGV4X3VubG9jaygmbW94YV9vcGVubG9jayk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQogCU1veGFQb3J0R2V0TGluZU91dChjaCwgJmR0ciwgJnJ0cyk7CiAJaWYgKGR0cikKIAkJZmxhZyB8PSBUSU9DTV9EVFI7CkBAIC0xMzQ2LDcgKzEyNzUsNiBAQAogCQlmbGFnIHw9IFRJT0NNX0RTUjsKIAlpZiAoZHRyICYgNCkKIAkJZmxhZyB8PSBUSU9DTV9DRDsKLQltdXRleF91bmxvY2soJm1veGFfb3BlbmxvY2spOwogCXJldHVybiBmbGFnOwogfQogCkBAIC0xMzc5LDIwICsxMzA3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbW94YV90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBtb3hhX3BvcnQgKmNoID0gdHR5LT5kcml2ZXJfZGF0YTsKLQotCWNoLT5zdGF0dXNmbGFncyB8PSBUSFJPVFRMRTsKLX0KLQotc3RhdGljIHZvaWQgbW94YV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IG1veGFfcG9ydCAqY2ggPSB0dHktPmRyaXZlcl9kYXRhOwotCi0JY2gtPnN0YXR1c2ZsYWdzICY9IH5USFJPVFRMRTsKLX0KLQogc3RhdGljIHZvaWQgbW94YV9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAogCQlzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQogewpAQCAtMTQxMiw3ICsxMzI2LDcgQEAKIAlpZiAoY2ggPT0gTlVMTCkKIAkJcmV0dXJuOwogCU1veGFQb3J0VHhEaXNhYmxlKGNoKTsKLQljaC0+c3RhdHVzZmxhZ3MgfD0gVFhTVE9QUEVEOworCXNldF9iaXQoVFhTVE9QUEVELCAmY2gtPnN0YXR1c2ZsYWdzKTsKIH0KIAogCkBAIC0xNDI3LDM4ICsxMzQxLDMyIEBACiAJCXJldHVybjsKIAogCU1veGFQb3J0VHhFbmFibGUoY2gpOwotCWNoLT5zdGF0dXNmbGFncyAmPSB+VFhTVE9QUEVEOworCWNsZWFyX2JpdChUWFNUT1BQRUQsICZjaC0+c3RhdHVzZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBtb3hhX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0cnVjdCBtb3hhX3BvcnQgKmNoOwotCi0JbXV0ZXhfbG9jaygmbW94YV9vcGVubG9jayk7Ci0JY2ggPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmIChjaCA9PSBOVUxMKSB7Ci0JCW11dGV4X3VubG9jaygmbW94YV9vcGVubG9jayk7Ci0JCXJldHVybjsKLQl9Ci0JY2gtPnBvcnQuY291bnQgPSAwOwotCW1veGFfY2xvc2VfcG9ydCh0dHkpOwotCW11dGV4X3VubG9jaygmbW94YV9vcGVubG9jayk7Ci0KLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoLT5wb3J0Lm9wZW5fd2FpdCk7CisJc3RydWN0IG1veGFfcG9ydCAqY2ggPSB0dHktPmRyaXZlcl9kYXRhOworCXR0eV9wb3J0X2hhbmd1cCgmY2gtPnBvcnQpOwogfQogCiBzdGF0aWMgdm9pZCBtb3hhX25ld19kY2RzdGF0ZShzdHJ1Y3QgbW94YV9wb3J0ICpwLCB1OCBkY2QpCiB7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWRjZCA9ICEhZGNkOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJnAtPnBvcnQubG9jaywgZmxhZ3MpOwogCWlmIChkY2QgIT0gcC0+RENEU3RhdGUpIHsKKyAgICAgICAgCXAtPkRDRFN0YXRlID0gZGNkOworICAgICAgICAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcC0+cG9ydC5sb2NrLCBmbGFncyk7CiAJCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnAtPnBvcnQpOwogCQlpZiAodHR5ICYmIENfQ0xPQ0FMKHR0eSkgJiYgIWRjZCkKIAkJCXR0eV9oYW5ndXAodHR5KTsKIAkJdHR5X2tyZWZfcHV0KHR0eSk7CiAJfQotCXAtPkRDRFN0YXRlID0gZGNkOworCWVsc2UKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcC0+cG9ydC5sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQgbW94YV9wb2xsX3BvcnQoc3RydWN0IG1veGFfcG9ydCAqcCwgdW5zaWduZWQgaW50IGhhbmRsZSwKQEAgLTE0NzAsMjQgKzEzNzgsMjQgQEAKIAl1MTYgaW50cjsKIAogCWlmICh0dHkpIHsKLQkJaWYgKChwLT5zdGF0dXNmbGFncyAmIEVNUFRZV0FJVCkgJiYKKwkJaWYgKHRlc3RfYml0KEVNUFRZV0FJVCwgJnAtPnN0YXR1c2ZsYWdzKSAmJgogCQkJCU1veGFQb3J0VHhRdWV1ZShwKSA9PSAwKSB7Ci0JCQlwLT5zdGF0dXNmbGFncyAmPSB+RU1QVFlXQUlUOworCQkJY2xlYXJfYml0KEVNUFRZV0FJVCwgJnAtPnN0YXR1c2ZsYWdzKTsKIAkJCXR0eV93YWtldXAodHR5KTsKIAkJfQotCQlpZiAoKHAtPnN0YXR1c2ZsYWdzICYgTE9XV0FJVCkgJiYgIXR0eS0+c3RvcHBlZCAmJgorCQlpZiAodGVzdF9iaXQoTE9XV0FJVCwgJnAtPnN0YXR1c2ZsYWdzKSAmJiAhdHR5LT5zdG9wcGVkICYmCiAJCQkJTW94YVBvcnRUeFF1ZXVlKHApIDw9IFdBS0VVUF9DSEFSUykgewotCQkJcC0+c3RhdHVzZmxhZ3MgJj0gfkxPV1dBSVQ7CisJCQljbGVhcl9iaXQoTE9XV0FJVCwgJnAtPnN0YXR1c2ZsYWdzKTsKIAkJCXR0eV93YWtldXAodHR5KTsKIAkJfQogCi0JCWlmIChpbml0ZWQgJiYgIShwLT5zdGF0dXNmbGFncyAmIFRIUk9UVExFKSAmJgorCQlpZiAoaW5pdGVkICYmICF0ZXN0X2JpdChUVFlfVEhST1RUTEVELCAmdHR5LT5mbGFncykgJiYKIAkJCQlNb3hhUG9ydFJ4UXVldWUocCkgPiAwKSB7IC8qIFJYICovCiAJCQlNb3hhUG9ydFJlYWREYXRhKHApOwogCQkJdHR5X3NjaGVkdWxlX2ZsaXAodHR5KTsKIAkJfQogCX0gZWxzZSB7Ci0JCXAtPnN0YXR1c2ZsYWdzICY9IH5FTVBUWVdBSVQ7CisJCWNsZWFyX2JpdChFTVBUWVdBSVQsICZwLT5zdGF0dXNmbGFncyk7CiAJCU1veGFQb3J0Rmx1c2hEYXRhKHAsIDApOyAvKiBmbHVzaCBSWCAqLwogCX0KIApAQCAtMTU4OCwzNSArMTQ5Niw2IEBACiAJdHR5X2VuY29kZV9iYXVkX3JhdGUodHR5LCBiYXVkLCBiYXVkKTsKIH0KIAotc3RhdGljIHZvaWQgbW94YV9zZXR1cF9lbXB0eV9ldmVudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBtb3hhX3BvcnQgKmNoID0gdHR5LT5kcml2ZXJfZGF0YTsKLQotCXNwaW5fbG9ja19iaCgmbW94YV9sb2NrKTsKLQljaC0+c3RhdHVzZmxhZ3MgfD0gRU1QVFlXQUlUOwotCXNwaW5fdW5sb2NrX2JoKCZtb3hhX2xvY2spOwotfQotCi1zdGF0aWMgdm9pZCBtb3hhX3NodXRfZG93bihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBtb3hhX3BvcnQgKmNoID0gdHR5LT5kcml2ZXJfZGF0YTsKLQotCWlmICghKGNoLT5wb3J0LmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKQotCQlyZXR1cm47Ci0KLQlNb3hhUG9ydERpc2FibGUoY2gpOwotCi0JLyoKLQkgKiBJZiB3ZSdyZSBhIG1vZGVtIGNvbnRyb2wgZGV2aWNlIGFuZCBIVVBDTCBpcyBvbiwgZHJvcCBSVFMgJiBEVFIuCi0JICovCi0JaWYgKENfSFVQQ0wodHR5KSkKLQkJTW94YVBvcnRMaW5lQ3RybChjaCwgMCwgMCk7Ci0KLQlzcGluX2xvY2tfYmgoJm1veGFfbG9jayk7Ci0JY2gtPnBvcnQuZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOwotCXNwaW5fdW5sb2NrX2JoKCZtb3hhX2xvY2spOwotfQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCURyaXZlciBsZXZlbCBmdW5jdGlvbnM6IAkJCQkJICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xOTE4LDEwICsxNzk3LDEyIEBACiAJYmF1ZCA9IE1veGFQb3J0U2V0QmF1ZChwb3J0LCBiYXVkKTsKIAogCWlmICh0ZXJtaW8tPmNfaWZsYWcgJiAoSVhPTiB8IElYT0ZGIHwgSVhBTlkpKSB7CisJICAgICAgICBzcGluX2xvY2tfaXJxKCZtb3hhZnVuY19sb2NrKTsKIAkJd3JpdGViKHRlcm1pby0+Y19jY1tWU1RBUlRdLCBvZnNBZGRyICsgRnVuY0FyZyk7CiAJCXdyaXRlYih0ZXJtaW8tPmNfY2NbVlNUT1BdLCBvZnNBZGRyICsgRnVuY0FyZzEpOwogCQl3cml0ZWIoRkNfU2V0WG9uWG9mZiwgb2ZzQWRkciArIEZ1bmNDb2RlKTsKIAkJbW94YV93YWl0X2ZpbmlzaChvZnNBZGRyKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZtb3hhZnVuY19sb2NrKTsKIAogCX0KIAlyZXR1cm4gYmF1ZDsKQEAgLTE5NzQsMTggKzE4NTUsMTQgQEAKIAlpbnQgdmFsOwogCiAJb2ZzQWRkciA9IHBvcnQtPnRhYmxlQWRkcjsKLQlpZiAoTU9YQV9JU18zMjAocG9ydC0+Ym9hcmQpKSB7Ci0JCW1veGFmdW5jKG9mc0FkZHIsIEZDX0xpbmVTdGF0dXMsIDApOwotCQl2YWwgPSByZWFkdyhvZnNBZGRyICsgRnVuY0FyZyk7Ci0JfSBlbHNlIHsKKwlpZiAoTU9YQV9JU18zMjAocG9ydC0+Ym9hcmQpKQorCQl2YWwgPSBtb3hhZnVuY3JldChvZnNBZGRyLCBGQ19MaW5lU3RhdHVzLCAwKTsKKwllbHNlCiAJCXZhbCA9IHJlYWR3KG9mc0FkZHIgKyBGbGFnU3RhdCkgPj4gNDsKLQl9CiAJdmFsICY9IDB4MEI7CiAJaWYgKHZhbCAmIDgpCiAJCXZhbCB8PSA0OwotCXNwaW5fbG9ja19iaCgmbW94YV9sb2NrKTsKIAltb3hhX25ld19kY2RzdGF0ZShwb3J0LCB2YWwgJiA4KTsKLQlzcGluX3VubG9ja19iaCgmbW94YV9sb2NrKTsKIAl2YWwgJj0gNzsKIAlyZXR1cm4gdmFsOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL214c2VyLmMgYi9kcml2ZXJzL2NoYXIvbXhzZXIuYwppbmRleCA1ZTI4ZDM5Li4zZDkyMzA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbXhzZXIuYworKysgYi9kcml2ZXJzL2NoYXIvbXhzZXIuYwpAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CkBAIC04NTYsOSArODU1LDkgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgbXhzZXJfc3RhcnR1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQorc3RhdGljIGludCBteHNlcl9hY3RpdmF0ZShzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0Jc3RydWN0IG14c2VyX3BvcnQgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBteHNlcl9wb3J0LCBwb3J0KTsKIAl1bnNpZ25lZCBsb25nIHBhZ2U7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtODY4LDIyICs4NjcsMTMgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwogCi0JaWYgKGluZm8tPnBvcnQuZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgewotCQlmcmVlX3BhZ2UocGFnZSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOwotCX0KLQogCWlmICghaW5mby0+aW9hZGRyIHx8ICFpbmZvLT50eXBlKSB7CiAJCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncyk7CiAJCWZyZWVfcGFnZShwYWdlKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIDA7CiAJfQotCWlmIChpbmZvLT5wb3J0LnhtaXRfYnVmKQotCQlmcmVlX3BhZ2UocGFnZSk7Ci0JZWxzZQotCQlpbmZvLT5wb3J0LnhtaXRfYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgcGFnZTsKKwlpbmZvLT5wb3J0LnhtaXRfYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgcGFnZTsKIAogCS8qCiAJICogQ2xlYXIgdGhlIEZJRk8gYnVmZmVycyBhbmQgZGlzYWJsZSB0aGVtCkBAIC05NTEsMjQgKzk0MSwxOSBAQAogCSAqIGFuZCBzZXQgdGhlIHNwZWVkIG9mIHRoZSBzZXJpYWwgcG9ydAogCSAqLwogCW14c2VyX2NoYW5nZV9zcGVlZCh0dHksIE5VTEwpOwotCWluZm8tPnBvcnQuZmxhZ3MgfD0gQVNZTkNfSU5JVElBTElaRUQ7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwogfQogCiAvKgotICogVGhpcyByb3V0aW5lIHdpbGwgc2h1dGRvd24gYSBzZXJpYWwgcG9ydDsgaW50ZXJydXB0cyBtYXliZSBkaXNhYmxlZCwgYW5kCi0gKiBEVFIgaXMgZHJvcHBlZCBpZiB0aGUgaGFuZ3VwIG9uIGNsb3NlIHRlcm1pbyBmbGFnIGlzIG9uLgorICogVGhpcyByb3V0aW5lIHdpbGwgc2h1dGRvd24gYSBzZXJpYWwgcG9ydAogICovCi1zdGF0aWMgdm9pZCBteHNlcl9zaHV0ZG93bihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQorc3RhdGljIHZvaWQgbXhzZXJfc2h1dGRvd25fcG9ydChzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpCiB7Ci0Jc3RydWN0IG14c2VyX3BvcnQgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBteHNlcl9wb3J0LCBwb3J0KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKCEoaW5mby0+cG9ydC5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkKLQkJcmV0dXJuOwotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CiAKIAkvKgpAQCAtOTc4LDcgKzk2Myw3IEBACiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5wb3J0LmRlbHRhX21zcl93YWl0KTsKIAogCS8qCi0JICogRnJlZSB0aGUgSVJRLCBpZiBuZWNlc3NhcnkKKwkgKiBGcmVlIHRoZSB4bWl0IGJ1ZmZlciwgaWYgbmVjZXNzYXJ5CiAJICovCiAJaWYgKGluZm8tPnBvcnQueG1pdF9idWYpIHsKIAkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBpbmZvLT5wb3J0LnhtaXRfYnVmKTsKQEAgLTk4OCwxMCArOTczLDYgQEAKIAlpbmZvLT5JRVIgPSAwOwogCW91dGIoMHgwMCwgaW5mby0+aW9hZGRyICsgVUFSVF9JRVIpOwogCi0JaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKQotCQlpbmZvLT5NQ1IgJj0gfihVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFMpOwotCW91dGIoaW5mby0+TUNSLCBpbmZvLT5pb2FkZHIgKyBVQVJUX01DUik7Ci0KIAkvKiBjbGVhciBSeC9UeCBGSUZPJ3MgKi8KIAlpZiAoaW5mby0+Ym9hcmQtPmNoaXBfZmxhZykKIAkJb3V0YihVQVJUX0ZDUl9DTEVBUl9SQ1ZSIHwgVUFSVF9GQ1JfQ0xFQVJfWE1JVCB8CkBAIC0xMDA0LDkgKzk4NSw2IEBACiAJLyogcmVhZCBkYXRhIHBvcnQgdG8gcmVzZXQgdGhpbmdzICovCiAJKHZvaWQpIGluYihpbmZvLT5pb2FkZHIgKyBVQVJUX1JYKTsKIAotCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncyk7Ci0KLQlpbmZvLT5wb3J0LmZsYWdzICY9IH5BU1lOQ19JTklUSUFMSVpFRDsKIAogCWlmIChpbmZvLT5ib2FyZC0+Y2hpcF9mbGFnKQogCQlTRVRfTU9YQV9NVVNUX05PX1NPRlRXQVJFX0ZMT1dfQ09OVFJPTChpbmZvLT5pb2FkZHIpOwpAQCAtMTAyMyw4ICsxMDAxLDcgQEAKIHN0YXRpYyBpbnQgbXhzZXJfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXR2YWwsIGxpbmU7CisJaW50IGxpbmU7CiAKIAlsaW5lID0gdHR5LT5pbmRleDsKIAlpZiAobGluZSA9PSBNWFNFUl9QT1JUUykKQEAgLTEwMzUsMjMgKzEwMTIsNyBAQAogCWlmICghaW5mby0+aW9hZGRyKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXR0eS0+ZHJpdmVyX2RhdGEgPSBpbmZvOwotCXR0eV9wb3J0X3R0eV9zZXQoJmluZm8tPnBvcnQsIHR0eSk7Ci0JLyoKLQkgKiBTdGFydCB1cCBzZXJpYWwgcG9ydAotCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5wb3J0LmxvY2ssIGZsYWdzKTsKLQlpbmZvLT5wb3J0LmNvdW50Kys7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+cG9ydC5sb2NrLCBmbGFncyk7Ci0JcmV0dmFsID0gbXhzZXJfc3RhcnR1cCh0dHkpOwotCWlmIChyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7Ci0KLQlyZXR2YWwgPSB0dHlfcG9ydF9ibG9ja190aWxfcmVhZHkoJmluZm8tPnBvcnQsIHR0eSwgZmlscCk7Ci0JaWYgKHJldHZhbCkKLQkJcmV0dXJuIHJldHZhbDsKLQotCXJldHVybiAwOworCXJldHVybiB0dHlfcG9ydF9vcGVuKCZpbmZvLT5wb3J0LCB0dHksIGZpbHApOwogfQogCiBzdGF0aWMgdm9pZCBteHNlcl9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKQEAgLTEwNzUsMTkgKzEwMzYsMTEgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBteHNlcl9jbG9zZV9wb3J0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0dHlfcG9ydCAqcG9ydCkKK3N0YXRpYyB2b2lkIG14c2VyX2Nsb3NlX3BvcnQoc3RydWN0IHR0eV9wb3J0ICpwb3J0KQogewogCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBteHNlcl9wb3J0LCBwb3J0KTsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAJLyoKLQkgKiBTYXZlIHRoZSB0ZXJtaW9zIHN0cnVjdHVyZSwgc2luY2UgdGhpcyBwb3J0IG1heSBoYXZlCi0JICogc2VwYXJhdGUgdGVybWlvcyBmb3IgY2FsbG91dCBhbmQgZGlhbGluLgotCSAqCi0JICogRklYTUU6IENhbiB0aGlzIGdvID8KLQkgKi8KLQlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19OT1JNQUxfQUNUSVZFKQotCQlpbmZvLT5ub3JtYWxfdGVybWlvcyA9ICp0dHktPnRlcm1pb3M7Ci0JLyoKIAkgKiBBdCB0aGlzIHBvaW50IHdlIHN0b3AgYWNjZXB0aW5nIGlucHV0LiAgVG8gZG8gdGhpcywgd2UKIAkgKiBkaXNhYmxlIHRoZSByZWNlaXZlIGxpbmUgc3RhdHVzIGludGVycnVwdHMsIGFuZCB0ZWxsIHRoZQogCSAqIGludGVycnVwdCBkcml2ZXIgdG8gc3RvcCBjaGVja2luZyB0aGUgZGF0YSByZWFkeSBiaXQgaW4gdGhlCkBAIC0xMDk3LDIyICsxMDUwLDE4IEBACiAJaWYgKGluZm8tPmJvYXJkLT5jaGlwX2ZsYWcpCiAJCWluZm8tPklFUiAmPSB+TU9YQV9NVVNUX1JFQ1ZfSVNSOwogCi0JaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsKLQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmlvYWRkciArIFVBUlRfSUVSKTsKLQkJLyoKLQkJICogQmVmb3JlIHdlIGRyb3AgRFRSLCBtYWtlIHN1cmUgdGhlIFVBUlQgdHJhbnNtaXR0ZXIKLQkJICogaGFzIGNvbXBsZXRlbHkgZHJhaW5lZDsgdGhpcyBpcyBlc3BlY2lhbGx5Ci0JCSAqIGltcG9ydGFudCBpZiB0aGVyZSBpcyBhIHRyYW5zbWl0IEZJRk8hCi0JCSAqLwotCQl0aW1lb3V0ID0gamlmZmllcyArIEhaOwotCQl3aGlsZSAoIShpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9MU1IpICYgVUFSVF9MU1JfVEVNVCkpIHsKLQkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSg1KTsKLQkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQotCQkJCWJyZWFrOwotCQl9CisJb3V0YihpbmZvLT5JRVIsIGluZm8tPmlvYWRkciArIFVBUlRfSUVSKTsKKwkvKgorCSAqIEJlZm9yZSB3ZSBkcm9wIERUUiwgbWFrZSBzdXJlIHRoZSBVQVJUIHRyYW5zbWl0dGVyCisJICogaGFzIGNvbXBsZXRlbHkgZHJhaW5lZDsgdGhpcyBpcyBlc3BlY2lhbGx5CisJICogaW1wb3J0YW50IGlmIHRoZXJlIGlzIGEgdHJhbnNtaXQgRklGTyEKKwkgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArIEhaOworCXdoaWxlICghKGluYihpbmZvLT5pb2FkZHIgKyBVQVJUX0xTUikgJiBVQVJUX0xTUl9URU1UKSkgeworCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoNSk7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJYnJlYWs7CiAJfQotCW14c2VyX3NodXRkb3duKHR0eSk7Ci0KIH0KIAogLyoKQEAgLTExMzAsOCArMTA3OSwxMiBAQAogCQlyZXR1cm47CiAJaWYgKHR0eV9wb3J0X2Nsb3NlX3N0YXJ0KHBvcnQsIHR0eSwgZmlscCkgPT0gMCkKIAkJcmV0dXJuOwotCW14c2VyX2Nsb3NlX3BvcnQodHR5LCBwb3J0KTsKKwltdXRleF9sb2NrKCZwb3J0LT5tdXRleCk7CisJbXhzZXJfY2xvc2VfcG9ydChwb3J0KTsKIAlteHNlcl9mbHVzaF9idWZmZXIodHR5KTsKKwlteHNlcl9zaHV0ZG93bl9wb3J0KHBvcnQpOworCWNsZWFyX2JpdChBU1lOQ0JfSU5JVElBTElaRUQsICZwb3J0LT5mbGFncyk7CisJbXV0ZXhfdW5sb2NrKCZwb3J0LT5tdXRleCk7CiAJLyogUmlnaHQgbm93IHRoZSB0dHlfcG9ydCBzZXQgaXMgZG9uZSBvdXRzaWRlIG9mIHRoZSBjbG9zZV9lbmQgaGVscGVyCiAJICAgYXMgd2UgZG9uJ3QgeWV0IGhhdmUgZXZlcnlvbmUgdXNpbmcgcmVmY291bnRzICovCQogCXR0eV9wb3J0X2Nsb3NlX2VuZChwb3J0LCB0dHkpOwpAQCAtMTI3NSw2ICsxMjI4LDcgQEAKIAkJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpuZXdfaW5mbykKIHsKIAlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHR0eV9wb3J0ICpwb3J0ID0gJmluZm8tPnBvcnQ7CiAJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgbmV3X3NlcmlhbDsKIAlzcGVlZF90IGJhdWQ7CiAJdW5zaWduZWQgbG9uZyBzbF9mbGFnczsKQEAgLTEyOTAsNyArMTI0NCw3IEBACiAJCQluZXdfc2VyaWFsLnBvcnQgIT0gaW5mby0+aW9hZGRyKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWZsYWdzID0gaW5mby0+cG9ydC5mbGFncyAmIEFTWU5DX1NQRF9NQVNLOworCWZsYWdzID0gcG9ydC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSzsKIAogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgewogCQlpZiAoKG5ld19zZXJpYWwuYmF1ZF9iYXNlICE9IGluZm8tPmJhdWRfYmFzZSkgfHwKQEAgLTEzMDQsMTYgKzEyNTgsMTcgQEAKIAkJICogT0ssIHBhc3QgdGhpcyBwb2ludCwgYWxsIHRoZSBlcnJvciBjaGVja2luZyBoYXMgYmVlbiBkb25lLgogCQkgKiBBdCB0aGlzIHBvaW50LCB3ZSBzdGFydCBtYWtpbmcgY2hhbmdlcy4uLi4uCiAJCSAqLwotCQlpbmZvLT5wb3J0LmZsYWdzID0gKChpbmZvLT5wb3J0LmZsYWdzICYgfkFTWU5DX0ZMQUdTKSB8CisJCXBvcnQtPmZsYWdzID0gKChwb3J0LT5mbGFncyAmIH5BU1lOQ19GTEFHUykgfAogCQkJCShuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfRkxBR1MpKTsKLQkJaW5mby0+cG9ydC5jbG9zZV9kZWxheSA9IG5ld19zZXJpYWwuY2xvc2VfZGVsYXkgKiBIWiAvIDEwMDsKLQkJaW5mby0+cG9ydC5jbG9zaW5nX3dhaXQgPSBuZXdfc2VyaWFsLmNsb3Npbmdfd2FpdCAqIEhaIC8gMTAwOwotCQl0dHktPmxvd19sYXRlbmN5ID0gKGluZm8tPnBvcnQuZmxhZ3MgJiBBU1lOQ19MT1dfTEFURU5DWSkKLQkJCQkJCQkJPyAxIDogMDsKLQkJaWYgKChpbmZvLT5wb3J0LmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9DVVNUICYmCisJCXBvcnQtPmNsb3NlX2RlbGF5ID0gbmV3X3NlcmlhbC5jbG9zZV9kZWxheSAqIEhaIC8gMTAwOworCQlwb3J0LT5jbG9zaW5nX3dhaXQgPSBuZXdfc2VyaWFsLmNsb3Npbmdfd2FpdCAqIEhaIC8gMTAwOworCQl0dHktPmxvd19sYXRlbmN5ID0gKHBvcnQtPmZsYWdzICYgQVNZTkNfTE9XX0xBVEVOQ1kpID8gMSA6IDA7CisJCWlmICgocG9ydC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0NVU1QgJiYKIAkJCQkobmV3X3NlcmlhbC5iYXVkX2Jhc2UgIT0gaW5mby0+YmF1ZF9iYXNlIHx8CiAJCQkJbmV3X3NlcmlhbC5jdXN0b21fZGl2aXNvciAhPQogCQkJCWluZm8tPmN1c3RvbV9kaXZpc29yKSkgeworCQkJaWYgKG5ld19zZXJpYWwuY3VzdG9tX2Rpdmlzb3IgPT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCWJhdWQgPSBuZXdfc2VyaWFsLmJhdWRfYmFzZSAvIG5ld19zZXJpYWwuY3VzdG9tX2Rpdmlzb3I7CiAJCQl0dHlfZW5jb2RlX2JhdWRfcmF0ZSh0dHksIGJhdWQsIGJhdWQpOwogCQl9CkBAIC0xMzIzLDE1ICsxMjc4LDE3IEBACiAKIAlwcm9jZXNzX3R4cnhfZmlmbyhpbmZvKTsKIAotCWlmIChpbmZvLT5wb3J0LmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsKLQkJaWYgKGZsYWdzICE9IChpbmZvLT5wb3J0LmZsYWdzICYgQVNZTkNfU1BEX01BU0spKSB7CisJaWYgKHRlc3RfYml0KEFTWU5DQl9JTklUSUFMSVpFRCwgJnBvcnQtPmZsYWdzKSkgeworCQlpZiAoZmxhZ3MgIT0gKHBvcnQtPmZsYWdzICYgQVNZTkNfU1BEX01BU0spKSB7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIHNsX2ZsYWdzKTsKIAkJCW14c2VyX2NoYW5nZV9zcGVlZCh0dHksIE5VTEwpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIHNsX2ZsYWdzKTsKIAkJfQotCX0gZWxzZQotCQlyZXR2YWwgPSBteHNlcl9zdGFydHVwKHR0eSk7Ci0KKwl9IGVsc2UgeworCQlyZXR2YWwgPSBteHNlcl9hY3RpdmF0ZShwb3J0LCB0dHkpOworCQlpZiAocmV0dmFsID09IDApCisJCQlzZXRfYml0KEFTWU5DQl9JTklUSUFMSVpFRCwgJnBvcnQtPmZsYWdzKTsKKwl9CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMTUyMCw3ICsxNDc3LDggQEAKIAogc3RhdGljIGludCBteHNlcl9pb2N0bF9zcGVjaWFsKHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmdwKQogewotCXN0cnVjdCBteHNlcl9wb3J0ICpwb3J0OworCXN0cnVjdCBteHNlcl9wb3J0ICppcDsKKwlzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQ7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAlpbnQgcmVzdWx0LCBzdGF0dXM7CiAJdW5zaWduZWQgaW50IGksIGo7CkBAIC0xNTM2LDM4ICsxNDk0LDM5IEBACiAKIAljYXNlIE1PWEFfQ0hLUE9SVEVOQUJMRToKIAkJcmVzdWx0ID0gMDsKLQkJbG9ja19rZXJuZWwoKTsKIAkJZm9yIChpID0gMDsgaSA8IE1YU0VSX0JPQVJEUzsgaSsrKQogCQkJZm9yIChqID0gMDsgaiA8IE1YU0VSX1BPUlRTX1BFUl9CT0FSRDsgaisrKQogCQkJCWlmIChteHNlcl9ib2FyZHNbaV0ucG9ydHNbal0uaW9hZGRyKQogCQkJCQlyZXN1bHQgfD0gKDEgPDwgaSk7Ci0JCXVubG9ja19rZXJuZWwoKTsKIAkJcmV0dXJuIHB1dF91c2VyKHJlc3VsdCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJncCk7CiAJY2FzZSBNT1hBX0dFVERBVEFDT1VOVDoKLQkJbG9ja19rZXJuZWwoKTsKKwkJLyogVGhlIHJlY2VpdmUgc2lkZSBpcyBsb2NrZWQgYnkgcG9ydC0+c2xvY2sgYnV0IGl0IGlzbid0CisJCSAgIGNsZWFyIHRoYXQgYW4gZXhhY3Qgc25hcHNob3QgaXMgd29ydGggY29weWluZyBoZXJlICovCiAJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJm14dmFyX2xvZywgc2l6ZW9mKG14dmFyX2xvZykpKQogCQkJcmV0ID0gLUVGQVVMVDsKLQkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gcmV0OwogCWNhc2UgTU9YQV9HRVRNU1RBVFVTOiB7CiAJCXN0cnVjdCBteHNlcl9tc3RhdHVzIG1zLCBfX3VzZXIgKm1zdSA9IGFyZ3A7Ci0JCWxvY2tfa2VybmVsKCk7CiAJCWZvciAoaSA9IDA7IGkgPCBNWFNFUl9CT0FSRFM7IGkrKykKIAkJCWZvciAoaiA9IDA7IGogPCBNWFNFUl9QT1JUU19QRVJfQk9BUkQ7IGorKykgewotCQkJCXBvcnQgPSAmbXhzZXJfYm9hcmRzW2ldLnBvcnRzW2pdOworCQkJCWlwID0gJm14c2VyX2JvYXJkc1tpXS5wb3J0c1tqXTsKKwkJCQlwb3J0ID0gJmlwLT5wb3J0OwogCQkJCW1lbXNldCgmbXMsIDAsIHNpemVvZihtcykpOwogCi0JCQkJaWYgKCFwb3J0LT5pb2FkZHIpCisJCQkJbXV0ZXhfbG9jaygmcG9ydC0+bXV0ZXgpOworCQkJCWlmICghaXAtPmlvYWRkcikKIAkJCQkJZ290byBjb3B5OwogCQkJCQotCQkJCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnQtPnBvcnQpOworCQkJCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQocG9ydCk7CiAKIAkJCQlpZiAoIXR0eSB8fCAhdHR5LT50ZXJtaW9zKQotCQkJCQltcy5jZmxhZyA9IHBvcnQtPm5vcm1hbF90ZXJtaW9zLmNfY2ZsYWc7CisJCQkJCW1zLmNmbGFnID0gaXAtPm5vcm1hbF90ZXJtaW9zLmNfY2ZsYWc7CiAJCQkJZWxzZQogCQkJCQltcy5jZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKIAkJCQl0dHlfa3JlZl9wdXQodHR5KTsKLQkJCQlzdGF0dXMgPSBpbmIocG9ydC0+aW9hZGRyICsgVUFSVF9NU1IpOworCQkJCXNwaW5fbG9ja19pcnEoJmlwLT5zbG9jayk7CisJCQkJc3RhdHVzID0gaW5iKGlwLT5pb2FkZHIgKyBVQVJUX01TUik7CisJCQkJc3Bpbl91bmxvY2tfaXJxKCZpcC0+c2xvY2spOwogCQkJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9EQ0QpCiAJCQkJCW1zLmRjZCA9IDE7CiAJCQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RTUikKQEAgLTE1NzUsMTMgKzE1MzQsMTEgQEAKIAkJCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfQ1RTKQogCQkJCQltcy5jdHMgPSAxOwogCQkJY29weToKLQkJCQlpZiAoY29weV90b191c2VyKG1zdSwgJm1zLCBzaXplb2YobXMpKSkgewotCQkJCQl1bmxvY2tfa2VybmVsKCk7CisJCQkJbXV0ZXhfdW5sb2NrKCZwb3J0LT5tdXRleCk7CisJCQkJaWYgKGNvcHlfdG9fdXNlcihtc3UsICZtcywgc2l6ZW9mKG1zKSkpCiAJCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCX0KIAkJCQltc3UrKzsKIAkJCX0KLQkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gMDsKIAl9CiAJY2FzZSBNT1hBX0FTUFBfTU9OX0VYVDogewpAQCAtMTU5Myw0MSArMTU1MCw0OCBAQAogCQlpZiAoIW1lKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKLQkJbG9ja19rZXJuZWwoKTsKIAkJZm9yIChpID0gMCwgcCA9IDA7IGkgPCBNWFNFUl9CT0FSRFM7IGkrKykgewogCQkJZm9yIChqID0gMDsgaiA8IE1YU0VSX1BPUlRTX1BFUl9CT0FSRDsgaisrLCBwKyspIHsKIAkJCQlpZiAocCA+PSBBUlJBWV9TSVpFKG1lLT5yeF9jbnQpKSB7CiAJCQkJCWkgPSBNWFNFUl9CT0FSRFM7CiAJCQkJCWJyZWFrOwogCQkJCX0KLQkJCQlwb3J0ID0gJm14c2VyX2JvYXJkc1tpXS5wb3J0c1tqXTsKLQkJCQlpZiAoIXBvcnQtPmlvYWRkcikKLQkJCQkJY29udGludWU7CisJCQkJaXAgPSAmbXhzZXJfYm9hcmRzW2ldLnBvcnRzW2pdOworCQkJCXBvcnQgPSAmaXAtPnBvcnQ7CiAKLQkJCQlzdGF0dXMgPSBteHNlcl9nZXRfbXNyKHBvcnQtPmlvYWRkciwgMCwgcCk7CisJCQkJbXV0ZXhfbG9jaygmcG9ydC0+bXV0ZXgpOworCQkJCWlmICghaXAtPmlvYWRkcikgeworCQkJCQltdXRleF91bmxvY2soJnBvcnQtPm11dGV4KTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJc3Bpbl9sb2NrX2lycSgmaXAtPnNsb2NrKTsKKwkJCQlzdGF0dXMgPSBteHNlcl9nZXRfbXNyKGlwLT5pb2FkZHIsIDAsIHApOwogCiAJCQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX1RFUkkpCi0JCQkJCXBvcnQtPmljb3VudC5ybmcrKzsKKwkJCQkJaXAtPmljb3VudC5ybmcrKzsKIAkJCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRERTUikKLQkJCQkJcG9ydC0+aWNvdW50LmRzcisrOworCQkJCQlpcC0+aWNvdW50LmRzcisrOwogCQkJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9ERENEKQotCQkJCQlwb3J0LT5pY291bnQuZGNkKys7CisJCQkJCWlwLT5pY291bnQuZGNkKys7CiAJCQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDVFMpCi0JCQkJCXBvcnQtPmljb3VudC5jdHMrKzsKKwkJCQkJaXAtPmljb3VudC5jdHMrKzsKIAotCQkJCXBvcnQtPm1vbl9kYXRhLm1vZGVtX3N0YXR1cyA9IHN0YXR1czsKLQkJCQltZS0+cnhfY250W3BdID0gcG9ydC0+bW9uX2RhdGEucnhjbnQ7Ci0JCQkJbWUtPnR4X2NudFtwXSA9IHBvcnQtPm1vbl9kYXRhLnR4Y250OwotCQkJCW1lLT51cF9yeGNudFtwXSA9IHBvcnQtPm1vbl9kYXRhLnVwX3J4Y250OwotCQkJCW1lLT51cF90eGNudFtwXSA9IHBvcnQtPm1vbl9kYXRhLnVwX3R4Y250OworCQkJCWlwLT5tb25fZGF0YS5tb2RlbV9zdGF0dXMgPSBzdGF0dXM7CisJCQkJbWUtPnJ4X2NudFtwXSA9IGlwLT5tb25fZGF0YS5yeGNudDsKKwkJCQltZS0+dHhfY250W3BdID0gaXAtPm1vbl9kYXRhLnR4Y250OworCQkJCW1lLT51cF9yeGNudFtwXSA9IGlwLT5tb25fZGF0YS51cF9yeGNudDsKKwkJCQltZS0+dXBfdHhjbnRbcF0gPSBpcC0+bW9uX2RhdGEudXBfdHhjbnQ7CiAJCQkJbWUtPm1vZGVtX3N0YXR1c1twXSA9Ci0JCQkJCXBvcnQtPm1vbl9kYXRhLm1vZGVtX3N0YXR1czsKLQkJCQl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKKwkJCQkJaXAtPm1vbl9kYXRhLm1vZGVtX3N0YXR1czsKKwkJCQlzcGluX3VubG9ja19pcnEoJmlwLT5zbG9jayk7CisKKwkJCQl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZpcC0+cG9ydCk7CiAKIAkJCQlpZiAoIXR0eSB8fCAhdHR5LT50ZXJtaW9zKSB7Ci0JCQkJCWNmbGFnID0gcG9ydC0+bm9ybWFsX3Rlcm1pb3MuY19jZmxhZzsKLQkJCQkJaWZsYWcgPSBwb3J0LT5ub3JtYWxfdGVybWlvcy5jX2lmbGFnOwotCQkJCQltZS0+YmF1ZHJhdGVbcF0gPSB0dHlfdGVybWlvc19iYXVkX3JhdGUoJnBvcnQtPm5vcm1hbF90ZXJtaW9zKTsKKwkJCQkJY2ZsYWcgPSBpcC0+bm9ybWFsX3Rlcm1pb3MuY19jZmxhZzsKKwkJCQkJaWZsYWcgPSBpcC0+bm9ybWFsX3Rlcm1pb3MuY19pZmxhZzsKKwkJCQkJbWUtPmJhdWRyYXRlW3BdID0gdHR5X3Rlcm1pb3NfYmF1ZF9yYXRlKCZpcC0+bm9ybWFsX3Rlcm1pb3MpOwogCQkJCX0gZWxzZSB7CiAJCQkJCWNmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOwogCQkJCQlpZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19pZmxhZzsKQEAgLTE2NDYsMTYgKzE2MTAsMTUgQEAKIAkJCQlpZiAoaWZsYWcgJiAoSVhPTiB8IElYT0ZGKSkKIAkJCQkJbWUtPmZsb3djdHJsW3BdIHw9IDB4MEM7CiAKLQkJCQlpZiAocG9ydC0+dHlwZSA9PSBQT1JUXzE2NTUwQSkKKwkJCQlpZiAoaXAtPnR5cGUgPT0gUE9SVF8xNjU1MEEpCiAJCQkJCW1lLT5maWZvW3BdID0gMTsKIAotCQkJCW9wbW9kZSA9IGluYihwb3J0LT5vcG1vZGVfaW9hZGRyKSA+PgotCQkJCQkJKChwICUgNCkgKiAyKTsKKwkJCQlvcG1vZGUgPSBpbmIoaXAtPm9wbW9kZV9pb2FkZHIpPj4oKHAgJSA0KSAqIDIpOwogCQkJCW9wbW9kZSAmPSBPUF9NT0RFX01BU0s7CiAJCQkJbWUtPmlmdHlwZVtwXSA9IG9wbW9kZTsKKwkJCQltdXRleF91bmxvY2soJnBvcnQtPm11dGV4KTsKIAkJCX0KIAkJfQotCQl1bmxvY2tfa2VybmVsKCk7CiAJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgbWUsIHNpemVvZigqbWUpKSkKIAkJCXJldCA9IC1FRkFVTFQ7CiAJCWtmcmVlKG1lKTsKQEAgLTE2OTIsNiArMTY1NSw3IEBACiAJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQgPSAmaW5mby0+cG9ydDsKIAlzdHJ1Y3QgYXN5bmNfaWNvdW50IGNub3c7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKQEAgLTE3MTYsMjAgKzE2ODAsMjAgQEAKIAkJCQkJb3Btb2RlICE9IFJTNDIyX01PREUgJiYKIAkJCQkJb3Btb2RlICE9IFJTNDg1XzRXSVJFX01PREUpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlsb2NrX2tlcm5lbCgpOwogCQkJbWFzayA9IE1vZGVNYXNrW3BdOwogCQkJc2hpZnRiaXQgPSBwICogMjsKKwkJCXNwaW5fbG9ja19pcnEoJmluZm8tPnNsb2NrKTsKIAkJCXZhbCA9IGluYihpbmZvLT5vcG1vZGVfaW9hZGRyKTsKIAkJCXZhbCAmPSBtYXNrOwogCQkJdmFsIHw9IChvcG1vZGUgPDwgc2hpZnRiaXQpOwogCQkJb3V0Yih2YWwsIGluZm8tPm9wbW9kZV9pb2FkZHIpOwotCQkJdW5sb2NrX2tlcm5lbCgpOworCQkJc3Bpbl91bmxvY2tfaXJxKCZpbmZvLT5zbG9jayk7CiAJCX0gZWxzZSB7Ci0JCQlsb2NrX2tlcm5lbCgpOwogCQkJc2hpZnRiaXQgPSBwICogMjsKKwkJCXNwaW5fbG9ja19pcnEoJmluZm8tPnNsb2NrKTsKIAkJCW9wbW9kZSA9IGluYihpbmZvLT5vcG1vZGVfaW9hZGRyKSA+PiBzaGlmdGJpdDsKKwkJCXNwaW5fdW5sb2NrX2lycSgmaW5mby0+c2xvY2spOwogCQkJb3Btb2RlICY9IE9QX01PREVfTUFTSzsKLQkJCXVubG9ja19rZXJuZWwoKTsKIAkJCWlmIChwdXRfdXNlcihvcG1vZGUsIChpbnQgX191c2VyICopYXJncCkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KQEAgLTE3NDIsMTQgKzE3MDYsMTQgQEAKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBUSU9DR1NFUklBTDoKLQkJbG9ja19rZXJuZWwoKTsKKwkJbXV0ZXhfbG9jaygmcG9ydC0+bXV0ZXgpOwogCQlyZXR2YWwgPSBteHNlcl9nZXRfc2VyaWFsX2luZm8odHR5LCBhcmdwKTsKLQkJdW5sb2NrX2tlcm5lbCgpOworCQltdXRleF91bmxvY2soJnBvcnQtPm11dGV4KTsKIAkJcmV0dXJuIHJldHZhbDsKIAljYXNlIFRJT0NTU0VSSUFMOgotCQlsb2NrX2tlcm5lbCgpOworCQltdXRleF9sb2NrKCZwb3J0LT5tdXRleCk7CiAJCXJldHZhbCA9IG14c2VyX3NldF9zZXJpYWxfaW5mbyh0dHksIGFyZ3ApOwotCQl1bmxvY2tfa2VybmVsKCk7CisJCW11dGV4X3VubG9jaygmcG9ydC0+bXV0ZXgpOwogCQlyZXR1cm4gcmV0dmFsOwogCWNhc2UgVElPQ1NFUkdFVExTUjoJLyogR2V0IGxpbmUgc3RhdHVzIHJlZ2lzdGVyICovCiAJCXJldHVybiAgbXhzZXJfZ2V0X2xzcl9pbmZvKGluZm8sIGFyZ3ApOwpAQCAtMTc5NSwzMSArMTc1OSwzMyBAQAogCWNhc2UgTU9YQV9IaWdoU3BlZWRPbjoKIAkJcmV0dXJuIHB1dF91c2VyKGluZm8tPmJhdWRfYmFzZSAhPSAxMTUyMDAgPyAxIDogMCwgKGludCBfX3VzZXIgKilhcmdwKTsKIAljYXNlIE1PWEFfU0RTX1JTVElDT1VOVEVSOgotCQlsb2NrX2tlcm5lbCgpOworCQlzcGluX2xvY2tfaXJxKCZpbmZvLT5zbG9jayk7CiAJCWluZm8tPm1vbl9kYXRhLnJ4Y250ID0gMDsKIAkJaW5mby0+bW9uX2RhdGEudHhjbnQgPSAwOwotCQl1bmxvY2tfa2VybmVsKCk7CisJCXNwaW5fdW5sb2NrX2lycSgmaW5mby0+c2xvY2spOwogCQlyZXR1cm4gMDsKIAogCWNhc2UgTU9YQV9BU1BQX09RVUVVRTp7CiAJCWludCBsZW4sIGxzcjsKIAotCQlsb2NrX2tlcm5lbCgpOwogCQlsZW4gPSBteHNlcl9jaGFyc19pbl9idWZmZXIodHR5KTsKKwkJc3Bpbl9sb2NrKCZpbmZvLT5zbG9jayk7CiAJCWxzciA9IGluYihpbmZvLT5pb2FkZHIgKyBVQVJUX0xTUikgJiBVQVJUX0xTUl9USFJFOworCQlzcGluX3VubG9ja19pcnEoJmluZm8tPnNsb2NrKTsKIAkJbGVuICs9IChsc3IgPyAwIDogMSk7Ci0JCXVubG9ja19rZXJuZWwoKTsKIAogCQlyZXR1cm4gcHV0X3VzZXIobGVuLCAoaW50IF9fdXNlciAqKWFyZ3ApOwogCX0KIAljYXNlIE1PWEFfQVNQUF9NT046IHsKIAkJaW50IG1jciwgc3RhdHVzOwogCi0JCWxvY2tfa2VybmVsKCk7CisJCXNwaW5fbG9jaygmaW5mby0+c2xvY2spOwogCQlzdGF0dXMgPSBteHNlcl9nZXRfbXNyKGluZm8tPmlvYWRkciwgMSwgdHR5LT5pbmRleCk7CiAJCW14c2VyX2NoZWNrX21vZGVtX3N0YXR1cyh0dHksIGluZm8sIHN0YXR1cyk7CiAKIAkJbWNyID0gaW5iKGluZm8tPmlvYWRkciArIFVBUlRfTUNSKTsKKwkJc3Bpbl91bmxvY2soJmluZm8tPnNsb2NrKTsKKwogCQlpZiAobWNyICYgTU9YQV9NVVNUX01DUl9YT05fRkxBRykKIAkJCWluZm8tPm1vbl9kYXRhLmhvbGRfcmVhc29uICY9IH5OUFBJX05PVElGWV9YT0ZGSE9MRDsKIAkJZWxzZQpAQCAtMTgzNCw3ICsxODAwLDcgQEAKIAkJCWluZm8tPm1vbl9kYXRhLmhvbGRfcmVhc29uIHw9IE5QUElfTk9USUZZX0NUU0hPTEQ7CiAJCWVsc2UKIAkJCWluZm8tPm1vbl9kYXRhLmhvbGRfcmVhc29uICY9IH5OUFBJX05PVElGWV9DVFNIT0xEOwotCQl1bmxvY2tfa2VybmVsKCk7CisKIAkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaW5mby0+bW9uX2RhdGEsCiAJCQkJc2l6ZW9mKHN0cnVjdCBteHNlcl9tb24pKSkKIAkJCXJldHVybiAtRUZBVUxUOwpAQCAtMTk5Myw2ICsxOTU5LDcgQEAKIHsKIAlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBvcmlnX2ppZmZpZXMsIGNoYXJfdGltZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBsc3I7CiAKIAlpZiAoaW5mby0+dHlwZSA9PSBQT1JUX1VOS05PV04pCkBAIC0yMDMyLDE5ICsxOTk5LDIxIEBACiAJCXRpbWVvdXQsIGNoYXJfdGltZSk7CiAJcHJpbnRrKCJqaWZmPSVsdS4uLiIsIGppZmZpZXMpOwogI2VuZGlmCi0JbG9ja19rZXJuZWwoKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIAl3aGlsZSAoISgobHNyID0gaW5iKGluZm8tPmlvYWRkciArIFVBUlRfTFNSKSkgJiBVQVJUX0xTUl9URU1UKSkgewogI2lmZGVmIFNFUklBTF9ERUJVR19SU19XQUlUX1VOVElMX1NFTlQKIAkJcHJpbnRrKCJsc3IgPSAlZCAoamlmZj0lbHUpLi4uIiwgbHNyLCBqaWZmaWVzKTsKICNlbmRpZgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwogCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoY2hhcl90aW1lKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CiAJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJCWJyZWFrOwogCQlpZiAodGltZW91dCAmJiB0aW1lX2FmdGVyKGppZmZpZXMsIG9yaWdfamlmZmllcyArIHRpbWVvdXQpKQogCQkJYnJlYWs7CiAJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQl1bmxvY2tfa2VybmVsKCk7CiAKICNpZmRlZiBTRVJJQUxfREVCVUdfUlNfV0FJVF9VTlRJTF9TRU5UCiAJcHJpbnRrKCJsc3IgPSAlZCAoamlmZj0lbHUpLi4uZG9uZVxuIiwgbHNyLCBqaWZmaWVzKTsKQEAgLTIwNTksNyArMjAyOCw2IEBACiAJc3RydWN0IG14c2VyX3BvcnQgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwogCiAJbXhzZXJfZmx1c2hfYnVmZmVyKHR0eSk7Ci0JbXhzZXJfc2h1dGRvd24odHR5KTsKIAl0dHlfcG9ydF9oYW5ndXAoJmluZm8tPnBvcnQpOwogfQogCkBAIC0yMzYzLDYgKzIzMzEsOCBAQAogc3RydWN0IHR0eV9wb3J0X29wZXJhdGlvbnMgbXhzZXJfcG9ydF9vcHMgPSB7CiAJLmNhcnJpZXJfcmFpc2VkID0gbXhzZXJfY2Fycmllcl9yYWlzZWQsCiAJLmR0cl9ydHMgPSBteHNlcl9kdHJfcnRzLAorCS5hY3RpdmF0ZSA9IG14c2VyX2FjdGl2YXRlLAorCS5zaHV0ZG93biA9IG14c2VyX3NodXRkb3duX3BvcnQsCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3BjbWNpYS9pcHdpcmVsZXNzL3R0eS5jIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9pcHdpcmVsZXNzL3R0eS5jCmluZGV4IDY3NGIzYWIuLjJiYjc4NzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9wY21jaWEvaXB3aXJlbGVzcy90dHkuYworKysgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL2lwd2lyZWxlc3MvdHR5LmMKQEAgLTYwMyw3ICs2MDMsNyBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyB0dHlfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0dHlfb3BlcmF0aW9ucyB0dHlfb3BzID0gewogCS5vcGVuID0gaXB3X29wZW4sCiAJLmNsb3NlID0gaXB3X2Nsb3NlLAogCS5oYW5ndXAgPSBpcHdfaGFuZ3VwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3B0eS5jIGIvZHJpdmVycy9jaGFyL3B0eS5jCmluZGV4IGQ4NmMwYmMuLjM4NWM0NGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9wdHkuYworKysgYi9kcml2ZXJzL2NoYXIvcHR5LmMKQEAgLTY1OSw3ICs2NTksNyBAQAogCWlmICghcmV0dmFsKQogCQlyZXR1cm4gMDsKIG91dDE6Ci0JdHR5X3JlbGVhc2VfZGV2KGZpbHApOworCXR0eV9yZWxlYXNlKGlub2RlLCBmaWxwKTsKIAlyZXR1cm4gcmV0dmFsOwogb3V0OgogCWRldnB0c19raWxsX2luZGV4KGlub2RlLCBpbmRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlzY29tOC5jIGIvZHJpdmVycy9jaGFyL3Jpc2NvbTguYwppbmRleCAzY2ZhMjJkLi4wYThkMWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmlzY29tOC5jCisrKyBiL2RyaXZlcnMvY2hhci9yaXNjb204LmMKQEAgLTc5MywyNiArNzkzLDIxIEBACiB9CiAKIC8qIE11c3QgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBlbmFibGVkICovCi1zdGF0aWMgaW50IHJjX3NldHVwX3BvcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHJpc2NvbV9ib2FyZCAqYnAsCi0JCQkJCQlzdHJ1Y3QgcmlzY29tX3BvcnQgKnBvcnQpCitzdGF0aWMgaW50IHJjX2FjdGl2YXRlX3BvcnQoc3RydWN0IHR0eV9wb3J0ICpwb3J0LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogeworCXN0cnVjdCByaXNjb21fcG9ydCAqcnAgPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IHJpc2NvbV9wb3J0LCBwb3J0KTsKKwlzdHJ1Y3QgcmlzY29tX2JvYXJkICpicCA9IHBvcnRfQm9hcmQocnApOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAocG9ydC0+cG9ydC5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKQotCQlyZXR1cm4gMDsKLQotCWlmICh0dHlfcG9ydF9hbGxvY194bWl0X2J1ZigmcG9ydC0+cG9ydCkgPCAwKQorCWlmICh0dHlfcG9ydF9hbGxvY194bWl0X2J1Zihwb3J0KSA8IDApCiAJCXJldHVybiAtRU5PTUVNOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJpc2NvbV9sb2NrLCBmbGFncyk7CiAKIAljbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncyk7Ci0JaWYgKHBvcnQtPnBvcnQuY291bnQgPT0gMSkKLQkJYnAtPmNvdW50Kys7Ci0JcG9ydC0+eG1pdF9jbnQgPSBwb3J0LT54bWl0X2hlYWQgPSBwb3J0LT54bWl0X3RhaWwgPSAwOwotCXJjX2NoYW5nZV9zcGVlZCh0dHksIGJwLCBwb3J0KTsKLQlwb3J0LT5wb3J0LmZsYWdzIHw9IEFTWU5DX0lOSVRJQUxJWkVEOwotCisJYnAtPmNvdW50Kys7CisJcnAtPnhtaXRfY250ID0gcnAtPnhtaXRfaGVhZCA9IHJwLT54bWl0X3RhaWwgPSAwOworCXJjX2NoYW5nZV9zcGVlZCh0dHksIGJwLCBycCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmlzY29tX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTgyMSw5ICs4MTYsNiBAQAogc3RhdGljIHZvaWQgcmNfc2h1dGRvd25fcG9ydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAogCQkJc3RydWN0IHJpc2NvbV9ib2FyZCAqYnAsIHN0cnVjdCByaXNjb21fcG9ydCAqcG9ydCkKIHsKLQlpZiAoIShwb3J0LT5wb3J0LmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKQotCQlyZXR1cm47Ci0KICNpZmRlZiBSQ19SRVBPUlRfT1ZFUlJVTgogCXByaW50ayhLRVJOX0lORk8gInJjJWQ6IHBvcnQgJWQ6IFRvdGFsICVsZCBvdmVycnVucyB3ZXJlIGRldGVjdGVkLlxuIiwKIAkgICAgICAgYm9hcmRfTm8oYnApLCBwb3J0X05vKHBvcnQpLCBwb3J0LT5vdmVycnVuKTsKQEAgLTg0MCwxMSArODMyLDYgQEAKIAl9CiAjZW5kaWYKIAl0dHlfcG9ydF9mcmVlX3htaXRfYnVmKCZwb3J0LT5wb3J0KTsKLQlpZiAoQ19IVVBDTCh0dHkpKSB7Ci0JCS8qIERyb3AgRFRSICovCi0JCWJwLT5EVFIgfD0gKDF1IDw8IHBvcnRfTm8ocG9ydCkpOwotCQlyY19vdXQoYnAsIFJDX0RUUiwgYnAtPkRUUik7Ci0JfQogCiAJLyogU2VsZWN0IHBvcnQgKi8KIAlyY19vdXQoYnAsIENEMTgwX0NBUiwgcG9ydF9Obyhwb3J0KSk7CkBAIC04NTYsNyArODQzLDYgQEAKIAlyY19vdXQoYnAsIENEMTgwX0lFUiwgcG9ydC0+SUVSKTsKIAogCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncyk7Ci0JcG9ydC0+cG9ydC5mbGFncyAmPSB+QVNZTkNfSU5JVElBTElaRUQ7CiAKIAlpZiAoLS1icC0+Y291bnQgPCAwKSAgewogCQlwcmludGsoS0VSTl9JTkZPICJyYyVkOiByY19zaHV0ZG93bl9wb3J0OiAiCkBAIC04ODksNiArODc1LDIwIEBACiAJcmV0dXJuIENEOwogfQogCitzdGF0aWMgdm9pZCBkdHJfcnRzKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCwgaW50IG9ub2ZmKQoreworCXN0cnVjdCByaXNjb21fcG9ydCAqcCA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3QgcmlzY29tX3BvcnQsIHBvcnQpOworCXN0cnVjdCByaXNjb21fYm9hcmQgKmJwID0gcG9ydF9Cb2FyZChwKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJpc2NvbV9sb2NrLCBmbGFncyk7CisJYnAtPkRUUiAmPSB+KDF1IDw8IHBvcnRfTm8ocCkpOworCWlmIChvbm9mZiA9PSAwKQorCQlicC0+RFRSIHw9ICgxdSA8PCBwb3J0X05vKHApKTsKKwlyY19vdXQoYnAsIFJDX0RUUiwgYnAtPkRUUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmlzY29tX2xvY2ssIGZsYWdzKTsKK30KKwogc3RhdGljIGludCByY19vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQogewogCWludCBib2FyZDsKQEAgLTkwOSwxNCArOTA5LDcgQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAotCXBvcnQtPnBvcnQuY291bnQrKzsKLQl0dHktPmRyaXZlcl9kYXRhID0gcG9ydDsKLQl0dHlfcG9ydF90dHlfc2V0KCZwb3J0LT5wb3J0LCB0dHkpOwotCi0JZXJyb3IgPSByY19zZXR1cF9wb3J0KHR0eSwgYnAsIHBvcnQpOwotCWlmIChlcnJvciA9PSAwKQotCQllcnJvciA9IHR0eV9wb3J0X2Jsb2NrX3RpbF9yZWFkeSgmcG9ydC0+cG9ydCwgdHR5LCBmaWxwKTsKLQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIHR0eV9wb3J0X29wZW4oJnBvcnQtPnBvcnQsIHR0eSwgZmlscCk7CiB9CiAKIHN0YXRpYyB2b2lkIHJjX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQpAQCAtOTUwLDI0ICs5NDMsMjMgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZyaXNjb21fbG9jaywgZmxhZ3MpOwogCXJwLT5JRVIgJj0gfklFUl9SWEQ7Ci0JaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsKLQkJcnAtPklFUiAmPSB+SUVSX1RYUkRZOwotCQlycC0+SUVSIHw9IElFUl9UWEVNUFRZOwotCQlyY19vdXQoYnAsIENEMTgwX0NBUiwgcG9ydF9ObyhycCkpOwotCQlyY19vdXQoYnAsIENEMTgwX0lFUiwgcnAtPklFUik7Ci0JCS8qCi0JCSAqIEJlZm9yZSB3ZSBkcm9wIERUUiwgbWFrZSBzdXJlIHRoZSBVQVJUIHRyYW5zbWl0dGVyCi0JCSAqIGhhcyBjb21wbGV0ZWx5IGRyYWluZWQ7IHRoaXMgaXMgZXNwZWNpYWxseQotCQkgKiBpbXBvcnRhbnQgaWYgdGhlcmUgaXMgYSB0cmFuc21pdCBGSUZPIQotCQkgKi8KLQkJdGltZW91dCA9IGppZmZpZXMgKyBIWjsKLQkJd2hpbGUgKHJwLT5JRVIgJiBJRVJfVFhFTVBUWSkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmlzY29tX2xvY2ssIGZsYWdzKTsKLQkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MocnAtPnRpbWVvdXQpKTsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZyaXNjb21fbG9jaywgZmxhZ3MpOwotCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCi0JCQkJYnJlYWs7Ci0JCX0KKworCXJwLT5JRVIgJj0gfklFUl9UWFJEWTsKKwlycC0+SUVSIHw9IElFUl9UWEVNUFRZOworCXJjX291dChicCwgQ0QxODBfQ0FSLCBwb3J0X05vKHJwKSk7CisJcmNfb3V0KGJwLCBDRDE4MF9JRVIsIHJwLT5JRVIpOworCS8qCisJICogQmVmb3JlIHdlIGRyb3AgRFRSLCBtYWtlIHN1cmUgdGhlIFVBUlQgdHJhbnNtaXR0ZXIKKwkgKiBoYXMgY29tcGxldGVseSBkcmFpbmVkOyB0aGlzIGlzIGVzcGVjaWFsbHkKKwkgKiBpbXBvcnRhbnQgaWYgdGhlcmUgaXMgYSB0cmFuc21pdCBGSUZPIQorCSAqLworCXRpbWVvdXQgPSBqaWZmaWVzICsgSFo7CisJd2hpbGUgKHJwLT5JRVIgJiBJRVJfVFhFTVBUWSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyaXNjb21fbG9jaywgZmxhZ3MpOworCQltc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKHJwLT50aW1lb3V0KSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZyaXNjb21fbG9jaywgZmxhZ3MpOworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCWJyZWFrOwogCX0KIAlyY19zaHV0ZG93bl9wb3J0KHBvcnQtPnR0eSwgYnAsIHJwKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyaXNjb21fbG9jaywgZmxhZ3MpOwpAQCAtMTM1NCw3ICsxMzQ2LDYgQEAKIAlpZiAocmNfcGFyYW5vaWFfY2hlY2socG9ydCwgdHR5LT5uYW1lLCAicmNfaGFuZ3VwIikpCiAJCXJldHVybjsKIAotCXJjX3NodXRkb3duX3BvcnQodHR5LCBwb3J0X0JvYXJkKHBvcnQpLCBwb3J0KTsKIAl0dHlfcG9ydF9oYW5ndXAoJnBvcnQtPnBvcnQpOwogfQogCkBAIC0xNDAxLDcgKzEzOTIsOSBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHR0eV9wb3J0X29wZXJhdGlvbnMgcmlzY29tX3BvcnRfb3BzID0gewogCS5jYXJyaWVyX3JhaXNlZCA9IGNhcnJpZXJfcmFpc2VkLAorCS5kdHJfcnRzID0gZHRyX3J0cywKIAkuc2h1dGRvd24gPSByY19jbG9zZV9wb3J0LAorCS5hY3RpdmF0ZSA9IHJjX2FjdGl2YXRlX3BvcnQsCiB9OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zdGFsbGlvbi5jIGIvZHJpdmVycy9jaGFyL3N0YWxsaW9uLmMKaW5kZXggZGI2ZGNmYS4uMGU1MTFkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3N0YWxsaW9uLmMKKysrIGIvZHJpdmVycy9jaGFyL3N0YWxsaW9uLmMKQEAgLTQwNyw3ICs0MDcsNyBAQAogICoJRGVjbGFyZSBhbGwgdGhvc2UgZnVuY3Rpb25zIGluIHRoaXMgZHJpdmVyIQogICovCiAKLXN0YXRpYyBpbnQJc3RsX21lbWlvY3RsKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBmaWxlICpmcCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGxvbmcJc3RsX21lbWlvY3RsKHN0cnVjdCBmaWxlICpmcCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogc3RhdGljIGludAlzdGxfYnJkaW5pdChzdHJ1Y3Qgc3RsYnJkICpicmRwKTsKIHN0YXRpYyBpbnQJc3RsX2dldHBvcnRzdGF0cyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIGNvbXN0YXRzX3QgX191c2VyICpjcCk7CiBzdGF0aWMgaW50CXN0bF9jbHJwb3J0c3RhdHMoc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBjb21zdGF0c190IF9fdXNlciAqY3ApOwpAQCAtNjA3LDcgKzYwNyw3IEBACiAgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zCXN0bF9mc2lvbWVtID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkuaW9jdGwJCT0gc3RsX21lbWlvY3RsLAorCS51bmxvY2tlZF9pb2N0bAk9IHN0bF9tZW1pb2N0bCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xhc3MgKnN0YWxsaW9uX2NsYXNzOwpAQCAtNzAyLDYgKzcwMiwyNCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKK3N0YXRpYyBpbnQgc3RsX2FjdGl2YXRlKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAgPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IHN0bHBvcnQsIHBvcnQpOworCWlmICghcG9ydHAtPnR4LmJ1ZikgeworCQlwb3J0cC0+dHguYnVmID0ga21hbGxvYyhTVExfVFhCVUZTSVpFLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwb3J0cC0+dHguYnVmKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXBvcnRwLT50eC5oZWFkID0gcG9ydHAtPnR4LmJ1ZjsKKwkJcG9ydHAtPnR4LnRhaWwgPSBwb3J0cC0+dHguYnVmOworCX0KKwlzdGxfc2V0cG9ydChwb3J0cCwgdHR5LT50ZXJtaW9zKTsKKwlwb3J0cC0+c2lncyA9IHN0bF9nZXRzaWduYWxzKHBvcnRwKTsKKwlzdGxfc2V0c2lnbmFscyhwb3J0cCwgMSwgMSk7CisJc3RsX2VuYWJsZXJ4dHgocG9ydHAsIDEsIDEpOworCXN0bF9zdGFydHJ4dHgocG9ydHAsIDEsIDApOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHN0bF9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQogewogCXN0cnVjdCBzdGxwb3J0CSpwb3J0cDsKQEAgLTczNywzMiArNzU1LDggQEAKIAlpZiAocG9ydHAgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJcG9ydCA9ICZwb3J0cC0+cG9ydDsKKwlyZXR1cm4gdHR5X3BvcnRfb3BlbigmcG9ydHAtPnBvcnQsIHR0eSwgZmlscCk7CiAKLS8qCi0gKglPbiB0aGUgZmlyc3Qgb3BlbiBvZiB0aGUgZGV2aWNlIHNldHVwIHRoZSBwb3J0IGhhcmR3YXJlLCBhbmQKLSAqCWluaXRpYWxpemUgdGhlIHBlciBwb3J0IGRhdGEgc3RydWN0dXJlLgotICovCi0JdHR5X3BvcnRfdHR5X3NldChwb3J0LCB0dHkpOwotCXR0eS0+ZHJpdmVyX2RhdGEgPSBwb3J0cDsKLQlwb3J0LT5jb3VudCsrOwotCi0JaWYgKChwb3J0LT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSA9PSAwKSB7Ci0JCWlmICghcG9ydHAtPnR4LmJ1ZikgewotCQkJcG9ydHAtPnR4LmJ1ZiA9IGttYWxsb2MoU1RMX1RYQlVGU0laRSwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIXBvcnRwLT50eC5idWYpCi0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQlwb3J0cC0+dHguaGVhZCA9IHBvcnRwLT50eC5idWY7Ci0JCQlwb3J0cC0+dHgudGFpbCA9IHBvcnRwLT50eC5idWY7Ci0JCX0KLQkJc3RsX3NldHBvcnQocG9ydHAsIHR0eS0+dGVybWlvcyk7Ci0JCXBvcnRwLT5zaWdzID0gc3RsX2dldHNpZ25hbHMocG9ydHApOwotCQlzdGxfc2V0c2lnbmFscyhwb3J0cCwgMSwgMSk7Ci0JCXN0bF9lbmFibGVyeHR4KHBvcnRwLCAxLCAxKTsKLQkJc3RsX3N0YXJ0cnh0eChwb3J0cCwgMSwgMCk7Ci0JCWNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKTsKLQkJcG9ydC0+ZmxhZ3MgfD0gQVNZTkNfSU5JVElBTElaRUQ7Ci0JfQotCXJldHVybiB0dHlfcG9ydF9ibG9ja190aWxfcmVhZHkocG9ydCwgdHR5LCBmaWxwKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtODI2LDM4ICs4MjAsMTIgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZCBzdGxfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgdm9pZCBzdGxfc2h1dGRvd24oc3RydWN0IHR0eV9wb3J0ICpwb3J0KQogewotCXN0cnVjdCBzdGxwb3J0CSpwb3J0cDsKLQlzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQ7Ci0JdW5zaWduZWQgbG9uZwlmbGFnczsKLQotCXByX2RlYnVnKCJzdGxfY2xvc2UodHR5PSVwLGZpbHA9JXApXG4iLCB0dHksIGZpbHApOwotCi0JcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOwotCUJVR19PTihwb3J0cCA9PSBOVUxMKTsKLQotCXBvcnQgPSAmcG9ydHAtPnBvcnQ7Ci0KLQlpZiAodHR5X3BvcnRfY2xvc2Vfc3RhcnQocG9ydCwgdHR5LCBmaWxwKSA9PSAwKQotCQlyZXR1cm47Ci0vKgotICoJTWF5IHdhbnQgdG8gd2FpdCBmb3IgYW55IGRhdGEgdG8gZHJhaW4gYmVmb3JlIGNsb3NpbmcuIFRoZSBCVVNZCi0gKglmbGFnIGtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgd2UgYXJlIHN0aWxsIHNlbmRpbmcgb3Igbm90IC0gaXQgaXMKLSAqCXZlcnkgYWNjdXJhdGUgZm9yIHRoZSBjZDE0MDAsIG5vdCBxdWl0ZSBzbyBmb3IgdGhlIHNjMjYxOTguCi0gKgkoVGhlIHNjMjYxOTggaGFzIG5vICJlbmQtb2YtZGF0YSIgaW50ZXJydXB0IG9ubHkgZW1wdHkgRklGTykKLSAqLwotCXN0bF93YWl0dW50aWxzZW50KHR0eSwgKEhaIC8gMikpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQlwb3J0cC0+cG9ydC5mbGFncyAmPSB+QVNZTkNfSU5JVElBTElaRUQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCisJc3RydWN0IHN0bHBvcnQgKnBvcnRwID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBzdGxwb3J0LCBwb3J0KTsKIAlzdGxfZGlzYWJsZWludHJzKHBvcnRwKTsKLQlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wpCi0JCXN0bF9zZXRzaWduYWxzKHBvcnRwLCAwLCAwKTsKIAlzdGxfZW5hYmxlcnh0eChwb3J0cCwgMCwgMCk7Ci0Jc3RsX2ZsdXNoYnVmZmVyKHR0eSk7CisJc3RsX2ZsdXNoKHBvcnRwKTsKIAlwb3J0cC0+aXN0YXRlID0gMDsKIAlpZiAocG9ydHAtPnR4LmJ1ZiAhPSBOVUxMKSB7CiAJCWtmcmVlKHBvcnRwLT50eC5idWYpOwpAQCAtODY1LDkgKzgzMywxNiBAQAogCQlwb3J0cC0+dHguaGVhZCA9IE5VTEw7CiAJCXBvcnRwLT50eC50YWlsID0gTlVMTDsKIAl9Cit9CiAKLQl0dHlfcG9ydF9jbG9zZV9lbmQocG9ydCwgdHR5KTsKLQl0dHlfcG9ydF90dHlfc2V0KHBvcnQsIE5VTEwpOworc3RhdGljIHZvaWQgc3RsX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBzdGxwb3J0KnBvcnRwOworCXByX2RlYnVnKCJzdGxfY2xvc2UodHR5PSVwLGZpbHA9JXApXG4iLCB0dHksIGZpbHApOworCisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCUJVR19PTihwb3J0cCA9PSBOVUxMKTsKKwl0dHlfcG9ydF9jbG9zZSgmcG9ydHAtPnBvcnQsIHR0eSwgZmlscCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEzMTQsMzUgKzEyODksMTIgQEAKIAogc3RhdGljIHZvaWQgc3RsX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0cnVjdCBzdGxwb3J0CSpwb3J0cDsKLQlzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQorCXN0cnVjdCBzdGxwb3J0CSpwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJcHJfZGVidWcoInN0bF9oYW5ndXAodHR5PSVwKVxuIiwgdHR5KTsKIAotCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlpZiAocG9ydHAgPT0gTlVMTCkKIAkJcmV0dXJuOwotCXBvcnQgPSAmcG9ydHAtPnBvcnQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCXBvcnQtPmZsYWdzICY9IH5BU1lOQ19JTklUSUFMSVpFRDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0KLQlzdGxfZGlzYWJsZWludHJzKHBvcnRwKTsKLQlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wpCi0JCXN0bF9zZXRzaWduYWxzKHBvcnRwLCAwLCAwKTsKLQlzdGxfZW5hYmxlcnh0eChwb3J0cCwgMCwgMCk7Ci0Jc3RsX2ZsdXNoYnVmZmVyKHR0eSk7Ci0JcG9ydHAtPmlzdGF0ZSA9IDA7Ci0Jc2V0X2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKTsKLQlpZiAocG9ydHAtPnR4LmJ1ZiAhPSBOVUxMKSB7Ci0JCWtmcmVlKHBvcnRwLT50eC5idWYpOwotCQlwb3J0cC0+dHguYnVmID0gTlVMTDsKLQkJcG9ydHAtPnR4LmhlYWQgPSBOVUxMOwotCQlwb3J0cC0+dHgudGFpbCA9IE5VTEw7Ci0JfQotCXR0eV9wb3J0X2hhbmd1cChwb3J0KTsKKwl0dHlfcG9ydF9oYW5ndXAoJnBvcnRwLT5wb3J0KTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjQ4NiwxOCArMjQzOCwxOSBAQAogICoJY29sbGVjdGlvbi4KICAqLwogCi1zdGF0aWMgaW50IHN0bF9tZW1pb2N0bChzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZmlsZSAqZnAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGxvbmcgc3RsX21lbWlvY3RsKHN0cnVjdCBmaWxlICpmcCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJaW50CWJyZG5yLCByYzsKIAl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAotCXByX2RlYnVnKCJzdGxfbWVtaW9jdGwoaXA9JXAsZnA9JXAsY21kPSV4LGFyZz0lbHgpXG4iLCBpcCwgZnAsIGNtZCxhcmcpOworCXByX2RlYnVnKCJzdGxfbWVtaW9jdGwoZnA9JXAsY21kPSV4LGFyZz0lbHgpXG4iLCBmcCwgY21kLGFyZyk7CiAKLQlicmRuciA9IGltaW5vcihpcCk7CisJYnJkbnIgPSBpbWlub3IoZnAtPmZfZGVudHJ5LT5kX2lub2RlKTsKIAlpZiAoYnJkbnIgPj0gU1RMX01BWEJSRFMpCiAJCXJldHVybiAtRU5PREVWOwogCXJjID0gMDsKIAorCWxvY2tfa2VybmVsKCk7CiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIENPTV9HRVRQT1JUU1RBVFM6CiAJCXJjID0gc3RsX2dldHBvcnRzdGF0cyhOVUxMLCBOVUxMLCBhcmdwKTsKQEAgLTI1MTgsNyArMjQ3MSw3IEBACiAJCXJjID0gLUVOT0lPQ1RMQ01EOwogCQlicmVhazsKIAl9Ci0KKwl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0yNTQ5LDYgKzI1MDIsOCBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCB0dHlfcG9ydF9vcGVyYXRpb25zIHN0bF9wb3J0X29wcyA9IHsKIAkuY2Fycmllcl9yYWlzZWQgPSBzdGxfY2Fycmllcl9yYWlzZWQsCiAJLmR0cl9ydHMgPSBzdGxfZHRyX3J0cywKKwkuYWN0aXZhdGUgPSBzdGxfYWN0aXZhdGUsCisJLnNodXRkb3duID0gc3RsX3NodXRkb3duLAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3R0eV9pby5jIGIvZHJpdmVycy9jaGFyL3R0eV9pby5jCmluZGV4IDU5NDk5ZWUuLmYxNWRmNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90dHlfaW8uYworKysgYi9kcml2ZXJzL2NoYXIvdHR5X2lvLmMKQEAgLTE0Miw3ICsxNDIsNiBAQAogCQkJCQkJCXNpemVfdCwgbG9mZl90ICopOwogc3RhdGljIHVuc2lnbmVkIGludCB0dHlfcG9sbChzdHJ1Y3QgZmlsZSAqLCBwb2xsX3RhYmxlICopOwogc3RhdGljIGludCB0dHlfb3BlbihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7Ci1zdGF0aWMgaW50IHR0eV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKIGxvbmcgdHR5X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiAjaWZkZWYgQ09ORklHX0NPTVBBVAogc3RhdGljIGxvbmcgdHR5X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKQEAgLTUwNiw4ICs1MDUsNiBAQAogCWlmICghdHR5KQogCQlyZXR1cm47CiAKLQkvKiBpbnVzZV9maWxwcyBpcyBwcm90ZWN0ZWQgYnkgdGhlIHNpbmdsZSBrZXJuZWwgbG9jayAqLwotCWxvY2tfa2VybmVsKCk7CiAKIAlzcGluX2xvY2soJnJlZGlyZWN0X2xvY2spOwogCWlmIChyZWRpcmVjdCAmJiByZWRpcmVjdC0+cHJpdmF0ZV9kYXRhID09IHR0eSkgewpAQCAtNTE2LDcgKzUxMywxMCBAQAogCX0KIAlzcGluX3VubG9jaygmcmVkaXJlY3RfbG9jayk7CiAKKwkvKiBpbnVzZV9maWxwcyBpcyBwcm90ZWN0ZWQgYnkgdGhlIHNpbmdsZSBrZXJuZWwgbG9jayAqLworCWxvY2tfa2VybmVsKCk7CiAJY2hlY2tfdHR5X2NvdW50KHR0eSwgImRvX3R0eV9oYW5ndXAiKTsKKwogCWZpbGVfbGlzdF9sb2NrKCk7CiAJLyogVGhpcyBicmVha3MgZm9yIGZpbGUgaGFuZGxlcyBiZWluZyBzZW50IG92ZXIgQUZfVU5JWCBzb2NrZXRzID8gKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZpbHAsICZ0dHktPnR0eV9maWxlcywgZl91LmZ1X2xpc3QpIHsKQEAgLTcwOCw2ICs3MDgsOCBAQAogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJc3RydWN0IHBpZCAqdHR5X3BncnAgPSBOVUxMOwogCisJaWYgKCFjdXJyZW50LT5zaWduYWwtPmxlYWRlcikKKwkJcmV0dXJuOwogCiAJdHR5ID0gZ2V0X2N1cnJlbnRfdHR5KCk7CiAJaWYgKHR0eSkgewpAQCAtNzczLDggKzc3NSw3IEBACiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwogCWxvY2tfa2VybmVsKCk7Ci0JaWYgKHRzay0+c2lnbmFsLT5sZWFkZXIpCi0JCWRpc2Fzc29jaWF0ZV9jdHR5KDApOworCWRpc2Fzc29jaWF0ZV9jdHR5KDApOwogCXVubG9ja19rZXJuZWwoKTsKIAlwcm9jX2NsZWFyX3R0eSh0c2spOwogfQpAQCAtMTAxNywxNCArMTAxOCwxNiBAQAogCiB2b2lkIHR0eV93cml0ZV9tZXNzYWdlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgKm1zZykKIHsKLQlsb2NrX2tlcm5lbCgpOwogCWlmICh0dHkpIHsKIAkJbXV0ZXhfbG9jaygmdHR5LT5hdG9taWNfd3JpdGVfbG9jayk7Ci0JCWlmICh0dHktPm9wcy0+d3JpdGUgJiYgIXRlc3RfYml0KFRUWV9DTE9TSU5HLCAmdHR5LT5mbGFncykpCisJCWxvY2tfa2VybmVsKCk7CisJCWlmICh0dHktPm9wcy0+d3JpdGUgJiYgIXRlc3RfYml0KFRUWV9DTE9TSU5HLCAmdHR5LT5mbGFncykpIHsKKwkJCXVubG9ja19rZXJuZWwoKTsKIAkJCXR0eS0+b3BzLT53cml0ZSh0dHksIG1zZywgc3RybGVuKG1zZykpOworCQl9IGVsc2UKKwkJCXVubG9ja19rZXJuZWwoKTsKIAkJdHR5X3dyaXRlX3VubG9jayh0dHkpOwogCX0KLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuOwogfQogCkBAIC0xMjAyLDE0ICsxMjA1LDIxIEBACiAJCQkJCQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCWludCBpZHggPSB0dHktPmluZGV4OworCWludCByZXQ7CiAKLQlpZiAoZHJpdmVyLT5vcHMtPmluc3RhbGwpCi0JCXJldHVybiBkcml2ZXItPm9wcy0+aW5zdGFsbChkcml2ZXIsIHR0eSk7CisJaWYgKGRyaXZlci0+b3BzLT5pbnN0YWxsKSB7CisJCWxvY2tfa2VybmVsKCk7CisJCXJldCA9IGRyaXZlci0+b3BzLT5pbnN0YWxsKGRyaXZlciwgdHR5KTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gcmV0OworCX0KIAogCWlmICh0dHlfaW5pdF90ZXJtaW9zKHR0eSkgPT0gMCkgeworCQlsb2NrX2tlcm5lbCgpOwogCQl0dHlfZHJpdmVyX2tyZWZfZ2V0KGRyaXZlcik7CiAJCXR0eS0+Y291bnQrKzsKIAkJZHJpdmVyLT50dHlzW2lkeF0gPSB0dHk7CisJCXVubG9ja19rZXJuZWwoKTsKIAkJcmV0dXJuIDA7CiAJfQogCXJldHVybiAtRU5PTUVNOwpAQCAtMTMwMiwxMCArMTMxMiwxNCBAQAogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJaW50IHJldHZhbDsKIAorCWxvY2tfa2VybmVsKCk7CiAJLyogQ2hlY2sgaWYgcHR5IG1hc3RlciBpcyBiZWluZyBvcGVuZWQgbXVsdGlwbGUgdGltZXMgKi8KIAlpZiAoZHJpdmVyLT5zdWJ0eXBlID09IFBUWV9UWVBFX01BU1RFUiAmJgotCQkoZHJpdmVyLT5mbGFncyAmIFRUWV9EUklWRVJfREVWUFRTX01FTSkgJiYgIWZpcnN0X29rKQorCQkoZHJpdmVyLT5mbGFncyAmIFRUWV9EUklWRVJfREVWUFRTX01FTSkgJiYgIWZpcnN0X29rKSB7CisJCXVubG9ja19rZXJuZWwoKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CisJfQorCXVubG9ja19rZXJuZWwoKTsKIAogCS8qCiAJICogRmlyc3QgdGltZSBvcGVuIGlzIGNvbXBsZXgsIGVzcGVjaWFsbHkgZm9yIFBUWSBkZXZpY2VzLgpAQCAtMTMzNSw3ICsxMzQ5LDYgQEAKIAkgKiBJZiB3ZSBmYWlsIGhlcmUganVzdCBjYWxsIHJlbGVhc2VfdHR5IHRvIGNsZWFuIHVwLiAgTm8gbmVlZAogCSAqIHRvIGRlY3JlbWVudCB0aGUgdXNlIGNvdW50cywgYXMgcmVsZWFzZV90dHkgZG9lc24ndCBjYXJlLgogCSAqLwotCiAJcmV0dmFsID0gdHR5X2xkaXNjX3NldHVwKHR0eSwgdHR5LT5saW5rKTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIHJlbGVhc2VfbWVtX291dDsKQEAgLTEzNTAsNyArMTM2Myw5IEBACiAJaWYgKHByaW50a19yYXRlbGltaXQoKSkKIAkJcHJpbnRrKEtFUk5fSU5GTyAidHR5X2luaXRfZGV2OiBsZGlzYyBvcGVuIGZhaWxlZCwgIgogCQkJCSAiY2xlYXJpbmcgc2xvdCAlZFxuIiwgaWR4KTsKKwlsb2NrX2tlcm5lbCgpOwogCXJlbGVhc2VfdHR5KHR0eSwgaWR4KTsKKwl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIEVSUl9QVFIocmV0dmFsKTsKIH0KIApAQCAtMTQ2NCw3ICsxNDc5LDE3IEBACiAJdHR5X2tyZWZfcHV0KHR0eSk7CiB9CiAKLS8qCisvKioKKyAqCXR0eV9yZWxlYXNlCQktCXZmcyBjYWxsYmFjayBmb3IgY2xvc2UKKyAqCUBpbm9kZTogaW5vZGUgb2YgdHR5CisgKglAZmlscDogZmlsZSBwb2ludGVyIGZvciBoYW5kbGUgdG8gdHR5CisgKgorICoJQ2FsbGVkIHRoZSBsYXN0IHRpbWUgZWFjaCBmaWxlIGhhbmRsZSBpcyBjbG9zZWQgdGhhdCByZWZlcmVuY2VzCisgKgl0aGlzIHR0eS4gVGhlcmUgbWF5IGhvd2V2ZXIgYmUgc2V2ZXJhbCBzdWNoIHJlZmVyZW5jZXMuCisgKgorICoJTG9ja2luZzoKKyAqCQlUYWtlcyBia2wuIFNlZSB0dHlfcmVsZWFzZV9kZXYKKyAqCiAgKiBFdmVuIHJlbGVhc2luZyB0aGUgdHR5IHN0cnVjdHVyZXMgaXMgYSB0cmlja3kgYnVzaW5lc3MuLiBXZSBoYXZlCiAgKiB0byBiZSB2ZXJ5IGNhcmVmdWwgdGhhdCB0aGUgc3RydWN0dXJlcyBhcmUgYWxsIHJlbGVhc2VkIGF0IHRoZQogICogc2FtZSB0aW1lLCBhcyBpbnRlcnJ1cHRzIG1pZ2h0IG90aGVyd2lzZSBnZXQgdGhlIHdyb25nIHBvaW50ZXJzLgpAQCAtMTQ3MiwyMCArMTQ5NywyMCBAQAogICogV1NIIDA5LzA5Lzk3OiByZXdyaXR0ZW4gdG8gYXZvaWQgc29tZSBuYXN0eSByYWNlIGNvbmRpdGlvbnMgdGhhdCBjb3VsZAogICogbGVhZCB0byBkb3VibGUgZnJlZXMgb3IgcmVsZWFzaW5nIG1lbW9yeSBzdGlsbCBpbiB1c2UuCiAgKi8KLXZvaWQgdHR5X3JlbGVhc2VfZGV2KHN0cnVjdCBmaWxlICpmaWxwKQorCitpbnQgdHR5X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgKm9fdHR5OwogCWludAlwdHlfbWFzdGVyLCB0dHlfY2xvc2luZywgb190dHlfY2xvc2luZywgZG9fc2xlZXA7CiAJaW50CWRldnB0czsKIAlpbnQJaWR4OwogCWNoYXIJYnVmWzY0XTsKLQlzdHJ1Y3QgCWlub2RlICppbm9kZTsKIAotCWlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAl0dHkgPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKilmaWxwLT5wcml2YXRlX2RhdGE7CiAJaWYgKHR0eV9wYXJhbm9pYV9jaGVjayh0dHksIGlub2RlLCAidHR5X3JlbGVhc2VfZGV2IikpCi0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAKKwlsb2NrX2tlcm5lbCgpOwogCWNoZWNrX3R0eV9jb3VudCh0dHksICJ0dHlfcmVsZWFzZV9kZXYiKTsKIAogCXR0eV9mYXN5bmMoLTEsIGZpbHAsIDApOwpAQCAtMTUwMCwxOSArMTUyNSwyMiBAQAogCWlmIChpZHggPCAwIHx8IGlkeCA+PSB0dHktPmRyaXZlci0+bnVtKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICJ0dHlfcmVsZWFzZV9kZXY6IGJhZCBpZHggd2hlbiB0cnlpbmcgdG8gIgogCQkJCSAgImZyZWUgKCVzKVxuIiwgdHR5LT5uYW1lKTsKLQkJcmV0dXJuOworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAwOwogCX0KIAlpZiAoIWRldnB0cykgewogCQlpZiAodHR5ICE9IHR0eS0+ZHJpdmVyLT50dHlzW2lkeF0pIHsKKwkJCXVubG9ja19rZXJuZWwoKTsKIAkJCXByaW50ayhLRVJOX0RFQlVHICJ0dHlfcmVsZWFzZV9kZXY6IGRyaXZlci50YWJsZVslZF0gbm90IHR0eSAiCiAJCQkgICAgICAgImZvciAoJXMpXG4iLCBpZHgsIHR0eS0+bmFtZSk7Ci0JCQlyZXR1cm47CisJCQlyZXR1cm4gMDsKIAkJfQogCQlpZiAodHR5LT50ZXJtaW9zICE9IHR0eS0+ZHJpdmVyLT50ZXJtaW9zW2lkeF0pIHsKKwkJCXVubG9ja19rZXJuZWwoKTsKIAkJCXByaW50ayhLRVJOX0RFQlVHICJ0dHlfcmVsZWFzZV9kZXY6IGRyaXZlci50ZXJtaW9zWyVkXSBub3QgdGVybWlvcyAiCiAJCQkgICAgICAgImZvciAoJXMpXG4iLAogCQkJICAgICAgIGlkeCwgdHR5LT5uYW1lKTsKLQkJCXJldHVybjsKKwkJCXJldHVybiAwOwogCQl9CiAJfQogI2VuZGlmCkBAIC0xNTI2LDI2ICsxNTU0LDMwIEBACiAJaWYgKHR0eS0+ZHJpdmVyLT5vdGhlciAmJgogCSAgICAgISh0dHktPmRyaXZlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX0RFVlBUU19NRU0pKSB7CiAJCWlmIChvX3R0eSAhPSB0dHktPmRyaXZlci0+b3RoZXItPnR0eXNbaWR4XSkgeworCQkJdW5sb2NrX2tlcm5lbCgpOwogCQkJcHJpbnRrKEtFUk5fREVCVUcgInR0eV9yZWxlYXNlX2Rldjogb3RoZXItPnRhYmxlWyVkXSAiCiAJCQkJCSAgIm5vdCBvX3R0eSBmb3IgKCVzKVxuIiwKIAkJCSAgICAgICBpZHgsIHR0eS0+bmFtZSk7Ci0JCQlyZXR1cm47CisJCQlyZXR1cm4gMCA7CiAJCX0KIAkJaWYgKG9fdHR5LT50ZXJtaW9zICE9IHR0eS0+ZHJpdmVyLT5vdGhlci0+dGVybWlvc1tpZHhdKSB7CisJCQl1bmxvY2tfa2VybmVsKCk7CiAJCQlwcmludGsoS0VSTl9ERUJVRyAidHR5X3JlbGVhc2VfZGV2OiBvdGhlci0+dGVybWlvc1slZF0gIgogCQkJCQkgICJub3Qgb190ZXJtaW9zIGZvciAoJXMpXG4iLAogCQkJICAgICAgIGlkeCwgdHR5LT5uYW1lKTsKLQkJCXJldHVybjsKKwkJCXJldHVybiAwOwogCQl9CiAJCWlmIChvX3R0eS0+bGluayAhPSB0dHkpIHsKKwkJCXVubG9ja19rZXJuZWwoKTsKIAkJCXByaW50ayhLRVJOX0RFQlVHICJ0dHlfcmVsZWFzZV9kZXY6IGJhZCBwdHkgcG9pbnRlcnNcbiIpOwotCQkJcmV0dXJuOworCQkJcmV0dXJuIDA7CiAJCX0KIAl9CiAjZW5kaWYKIAlpZiAodHR5LT5vcHMtPmNsb3NlKQogCQl0dHktPm9wcy0+Y2xvc2UodHR5LCBmaWxwKTsKIAorCXVubG9ja19rZXJuZWwoKTsKIAkvKgogCSAqIFNhbml0eSBjaGVjazogaWYgdHR5LT5jb3VudCBpcyBnb2luZyB0byB6ZXJvLCB0aGVyZSBzaG91bGRuJ3QgYmUKIAkgKiBhbnkgd2FpdGVycyBvbiB0dHktPnJlYWRfd2FpdCBvciB0dHktPndyaXRlX3dhaXQuICBXZSB0ZXN0IHRoZQpAQCAtMTU2OCw2ICsxNjAwLDcgQEAKIAkJICAgb3BlbnMgb24gL2Rldi90dHkgKi8KIAogCQltdXRleF9sb2NrKCZ0dHlfbXV0ZXgpOworCQlsb2NrX2tlcm5lbCgpOwogCQl0dHlfY2xvc2luZyA9IHR0eS0+Y291bnQgPD0gMTsKIAkJb190dHlfY2xvc2luZyA9IG9fdHR5ICYmCiAJCQkob190dHktPmNvdW50IDw9IChwdHlfbWFzdGVyID8gMSA6IDApKTsKQEAgLTE1OTgsNiArMTYzMSw3IEBACiAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAidHR5X3JlbGVhc2VfZGV2OiAlczogcmVhZC93cml0ZSB3YWl0IHF1ZXVlICIKIAkJCQkgICAgImFjdGl2ZSFcbiIsIHR0eV9uYW1lKHR0eSwgYnVmKSk7CisJCXVubG9ja19rZXJuZWwoKTsKIAkJbXV0ZXhfdW5sb2NrKCZ0dHlfbXV0ZXgpOwogCQlzY2hlZHVsZSgpOwogCX0KQEAgLTE2NjEsOCArMTY5NSwxMCBAQAogCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKIAogCS8qIGNoZWNrIHdoZXRoZXIgYm90aCBzaWRlcyBhcmUgY2xvc2luZyAuLi4gKi8KLQlpZiAoIXR0eV9jbG9zaW5nIHx8IChvX3R0eSAmJiAhb190dHlfY2xvc2luZykpCi0JCXJldHVybjsKKwlpZiAoIXR0eV9jbG9zaW5nIHx8IChvX3R0eSAmJiAhb190dHlfY2xvc2luZykpIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gMDsKKwl9CiAKICNpZmRlZiBUVFlfREVCVUdfSEFOR1VQCiAJcHJpbnRrKEtFUk5fREVCVUcgImZyZWVpbmcgdHR5IHN0cnVjdHVyZS4uLiIpOwpAQCAtMTY4MCwxMCArMTcxNiwxMiBAQAogCS8qIE1ha2UgdGhpcyBwdHkgbnVtYmVyIGF2YWlsYWJsZSBmb3IgcmVhbGxvY2F0aW9uICovCiAJaWYgKGRldnB0cykKIAkJZGV2cHRzX2tpbGxfaW5kZXgoaW5vZGUsIGlkeCk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOwogfQogCiAvKioKLSAqCV9fdHR5X29wZW4JCS0Jb3BlbiBhIHR0eSBkZXZpY2UKKyAqCXR0eV9vcGVuCQktCW9wZW4gYSB0dHkgZGV2aWNlCiAgKglAaW5vZGU6IGlub2RlIG9mIGRldmljZSBmaWxlCiAgKglAZmlscDogZmlsZSBwb2ludGVyIHRvIHR0eQogICoKQEAgLTE3MDMsNyArMTc0MSw3IEBACiAgKgkJIC0+c2lnbG9jayBwcm90ZWN0cyAtPnNpZ25hbC8tPnNpZ2hhbmQKICAqLwogCi1zdGF0aWMgaW50IF9fdHR5X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgaW50IHR0eV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBOVUxMOwogCWludCBub2N0dHksIHJldHZhbDsKQEAgLTE3MjAsMTAgKzE3NTgsMTIgQEAKIAlyZXR2YWwgPSAwOwogCiAJbXV0ZXhfbG9jaygmdHR5X211dGV4KTsKKwlsb2NrX2tlcm5lbCgpOwogCiAJaWYgKGRldmljZSA9PSBNS0RFVihUVFlBVVhfTUFKT1IsIDApKSB7CiAJCXR0eSA9IGdldF9jdXJyZW50X3R0eSgpOwogCQlpZiAoIXR0eSkgeworCQkJdW5sb2NrX2tlcm5lbCgpOwogCQkJbXV0ZXhfdW5sb2NrKCZ0dHlfbXV0ZXgpOwogCQkJcmV0dXJuIC1FTlhJTzsKIAkJfQpAQCAtMTc1NSwxMiArMTc5NSwxNCBAQAogCQkJCWdvdG8gZ290X2RyaXZlcjsKIAkJCX0KIAkJfQorCQl1bmxvY2tfa2VybmVsKCk7CiAJCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJZHJpdmVyID0gZ2V0X3R0eV9kcml2ZXIoZGV2aWNlLCAmaW5kZXgpOwogCWlmICghZHJpdmVyKSB7CisJCXVubG9ja19rZXJuZWwoKTsKIAkJbXV0ZXhfdW5sb2NrKCZ0dHlfbXV0ZXgpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC0xNzcwLDYgKzE4MTIsNyBAQAogCQl0dHkgPSB0dHlfZHJpdmVyX2xvb2t1cF90dHkoZHJpdmVyLCBpbm9kZSwgaW5kZXgpOwogCiAJCWlmIChJU19FUlIodHR5KSkgeworCQkJdW5sb2NrX2tlcm5lbCgpOwogCQkJbXV0ZXhfdW5sb2NrKCZ0dHlfbXV0ZXgpOwogCQkJcmV0dXJuIFBUUl9FUlIodHR5KTsKIAkJfQpAQCAtMTc4NCw4ICsxODI3LDEwIEBACiAKIAltdXRleF91bmxvY2soJnR0eV9tdXRleCk7CiAJdHR5X2RyaXZlcl9rcmVmX3B1dChkcml2ZXIpOwotCWlmIChJU19FUlIodHR5KSkKKwlpZiAoSVNfRVJSKHR0eSkpIHsKKwkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gUFRSX0VSUih0dHkpOworCX0KIAogCWZpbHAtPnByaXZhdGVfZGF0YSA9IHR0eTsKIAlmaWxlX21vdmUoZmlscCwgJnR0eS0+dHR5X2ZpbGVzKTsKQEAgLTE4MTMsMTEgKzE4NTgsMTUgQEAKIAkJcHJpbnRrKEtFUk5fREVCVUcgImVycm9yICVkIGluIG9wZW5pbmcgJXMuLi4iLCByZXR2YWwsCiAJCSAgICAgICB0dHktPm5hbWUpOwogI2VuZGlmCi0JCXR0eV9yZWxlYXNlX2RldihmaWxwKTsKLQkJaWYgKHJldHZhbCAhPSAtRVJFU1RBUlRTWVMpCisJCXR0eV9yZWxlYXNlKGlub2RlLCBmaWxwKTsKKwkJaWYgKHJldHZhbCAhPSAtRVJFU1RBUlRTWVMpIHsKKwkJCXVubG9ja19rZXJuZWwoKTsKIAkJCXJldHVybiByZXR2YWw7Ci0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJfQorCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXVubG9ja19rZXJuZWwoKTsKIAkJCXJldHVybiByZXR2YWw7CisJCX0KIAkJc2NoZWR1bGUoKTsKIAkJLyoKIAkJICogTmVlZCB0byByZXNldCBmX29wIGluIGNhc2UgYSBoYW5ndXAgaGFwcGVuZWQuCkBAIC0xODI2LDggKzE4NzUsMTEgQEAKIAkJCWZpbHAtPmZfb3AgPSAmdHR5X2ZvcHM7CiAJCWdvdG8gcmV0cnlfb3BlbjsKIAl9CisJdW5sb2NrX2tlcm5lbCgpOworCiAKIAltdXRleF9sb2NrKCZ0dHlfbXV0ZXgpOworCWxvY2tfa2VybmVsKCk7CiAJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CiAJaWYgKCFub2N0dHkgJiYKIAkgICAgY3VycmVudC0+c2lnbmFsLT5sZWFkZXIgJiYKQEAgLTE4MzUsNDMgKzE4ODcsMTIgQEAKIAkgICAgdHR5LT5zZXNzaW9uID09IE5VTEwpCiAJCV9fcHJvY19zZXRfdHR5KGN1cnJlbnQsIHR0eSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwl1bmxvY2tfa2VybmVsKCk7CiAJbXV0ZXhfdW5sb2NrKCZ0dHlfbXV0ZXgpOwogCXJldHVybiAwOwogfQogCi0vKiBCS0wgcHVzaGRvd246IHNjYXJ5IGNvZGUgYXZvaWRhbmNlIHdyYXBwZXIgKi8KLXN0YXRpYyBpbnQgdHR5X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCi17Ci0JaW50IHJldDsKIAotCWxvY2tfa2VybmVsKCk7Ci0JcmV0ID0gX190dHlfb3Blbihpbm9kZSwgZmlscCk7Ci0JdW5sb2NrX2tlcm5lbCgpOwotCXJldHVybiByZXQ7Ci19Ci0KLQotCi0KLS8qKgotICoJdHR5X3JlbGVhc2UJCS0JdmZzIGNhbGxiYWNrIGZvciBjbG9zZQotICoJQGlub2RlOiBpbm9kZSBvZiB0dHkKLSAqCUBmaWxwOiBmaWxlIHBvaW50ZXIgZm9yIGhhbmRsZSB0byB0dHkKLSAqCi0gKglDYWxsZWQgdGhlIGxhc3QgdGltZSBlYWNoIGZpbGUgaGFuZGxlIGlzIGNsb3NlZCB0aGF0IHJlZmVyZW5jZXMKLSAqCXRoaXMgdHR5LiBUaGVyZSBtYXkgaG93ZXZlciBiZSBzZXZlcmFsIHN1Y2ggcmVmZXJlbmNlcy4KLSAqCi0gKglMb2NraW5nOgotICoJCVRha2VzIGJrbC4gU2VlIHR0eV9yZWxlYXNlX2RldgotICovCi0KLXN0YXRpYyBpbnQgdHR5X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCi17Ci0JbG9ja19rZXJuZWwoKTsKLQl0dHlfcmVsZWFzZV9kZXYoZmlscCk7Ci0JdW5sb2NrX2tlcm5lbCgpOwotCXJldHVybiAwOwotfQogCiAvKioKICAqCXR0eV9wb2xsCS0JY2hlY2sgdHR5IHN0YXR1cwpAQCAtMjMxNyw5ICsyMzM4LDcgQEAKIAlpZiAoZ2V0X3VzZXIobGRpc2MsIHApKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWxvY2tfa2VybmVsKCk7CiAJcmV0ID0gdHR5X3NldF9sZGlzYyh0dHksIGxkaXNjKTsKLQl1bmxvY2tfa2VybmVsKCk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3R0eV9sZGlzYy5jIGIvZHJpdmVycy9jaGFyL3R0eV9sZGlzYy5jCmluZGV4IGZlYjU1MDcuLjNmNjUzZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90dHlfbGRpc2MuYworKysgYi9kcml2ZXJzL2NoYXIvdHR5X2xkaXNjLmMKQEAgLTM0LDYgKzM0LDggQEAKICNpbmNsdWRlIDxsaW51eC92dF9rZXJuLmg+CiAjaW5jbHVkZSA8bGludXgvc2VsZWN0aW9uLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgkvKiBGb3IgdGhlIG1vbWVudCAqLworCiAjaW5jbHVkZSA8bGludXgva21vZC5oPgogI2luY2x1ZGUgPGxpbnV4L25zcHJveHkuaD4KIApAQCAtNDQzLDggKzQ0NSwxNCBAQAogc3RhdGljIGludCB0dHlfbGRpc2Nfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdHR5X2xkaXNjICpsZCkKIHsKIAlXQVJOX09OKHRlc3RfYW5kX3NldF9iaXQoVFRZX0xESVNDX09QRU4sICZ0dHktPmZsYWdzKSk7Ci0JaWYgKGxkLT5vcHMtPm9wZW4pCi0JCXJldHVybiBsZC0+b3BzLT5vcGVuKHR0eSk7CisJaWYgKGxkLT5vcHMtPm9wZW4pIHsKKwkJaW50IHJldDsKKyAgICAgICAgICAgICAgICAvKiBCS0wgaGVyZSBsb2NrcyB2ZXJ1cyBhIGhhbmd1cCBldmVudCAqLworCQlsb2NrX2tlcm5lbCgpOworCQlyZXQgPSBsZC0+b3BzLT5vcGVuKHR0eSk7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIHJldDsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU0NSw2ICs1NTMsNyBAQAogCWlmIChJU19FUlIobmV3X2xkaXNjKSkKIAkJcmV0dXJuIFBUUl9FUlIobmV3X2xkaXNjKTsKIAorCWxvY2tfa2VybmVsKCk7CiAJLyoKIAkgKglXZSBuZWVkIHRvIGxvb2sgYXQgdGhlIHR0eSBsb2NraW5nIGhlcmUgZm9yIHB0eS90dHkgcGFpcnMKIAkgKgl3aGVuIGJvdGggc2lkZXMgdHJ5IHRvIGNoYW5nZSBpbiBwYXJhbGxlbC4KQEAgLTU1OCwxMCArNTY3LDEyIEBACiAJICovCiAKIAlpZiAodHR5LT5sZGlzYy0+b3BzLT5udW0gPT0gbGRpc2MpIHsKKwkJdW5sb2NrX2tlcm5lbCgpOwogCQl0dHlfbGRpc2NfcHV0KG5ld19sZGlzYyk7CiAJCXJldHVybiAwOwogCX0KIAorCXVubG9ja19rZXJuZWwoKTsKIAkvKgogCSAqCVByb2JsZW06IFdoYXQgZG8gd2UgZG8gaWYgdGhpcyBibG9ja3MgPwogCSAqCVdlIGNvdWxkIGRlYWRsb2NrIGhlcmUKQEAgLTU4Miw2ICs1OTMsOSBAQAogCQkJdGVzdF9iaXQoVFRZX0xESVNDX0NIQU5HSU5HLCAmdHR5LT5mbGFncykgPT0gMCk7CiAJCW11dGV4X2xvY2soJnR0eS0+bGRpc2NfbXV0ZXgpOwogCX0KKworCWxvY2tfa2VybmVsKCk7CisKIAlzZXRfYml0KFRUWV9MRElTQ19DSEFOR0lORywgJnR0eS0+ZmxhZ3MpOwogCiAJLyoKQEAgLTU5Miw2ICs2MDYsOCBAQAogCXR0eS0+cmVjZWl2ZV9yb29tID0gMDsKIAogCW9fbGRpc2MgPSB0dHktPmxkaXNjOworCisJdW5sb2NrX2tlcm5lbCgpOwogCS8qCiAJICoJTWFrZSBzdXJlIHdlIGRvbid0IGNoYW5nZSB3aGlsZSBzb21lb25lIGhvbGRzIGEKIAkgKglyZWZlcmVuY2UgdG8gdGhlIGxpbmUgZGlzY2lwbGluZS4gVGhlIFRUWV9MRElTQyBiaXQKQEAgLTYxNywxMiArNjMzLDE0IEBACiAJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKIAogCW11dGV4X2xvY2soJnR0eS0+bGRpc2NfbXV0ZXgpOworCWxvY2tfa2VybmVsKCk7CiAJaWYgKHRlc3RfYml0KFRUWV9IVVBQRUQsICZ0dHktPmZsYWdzKSkgewogCQkvKiBXZSB3ZXJlIHJhY2VkIGJ5IHRoZSBoYW5ndXAgbWV0aG9kLiBJdCB3aWxsIGhhdmUgc3RvbXBlZAogCQkgICB0aGUgbGRpc2MgZGF0YSBhbmQgY2xvc2VkIHRoZSBsZGlzYyBkb3duICovCiAJCWNsZWFyX2JpdChUVFlfTERJU0NfQ0hBTkdJTkcsICZ0dHktPmZsYWdzKTsKIAkJbXV0ZXhfdW5sb2NrKCZ0dHktPmxkaXNjX211dGV4KTsKIAkJdHR5X2xkaXNjX3B1dChuZXdfbGRpc2MpOworCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtNjY0LDYgKzY4Miw3IEBACiAJaWYgKG9fd29yaykKIAkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZvX3R0eS0+YnVmLndvcmssIDEpOwogCW11dGV4X3VubG9jaygmdHR5LT5sZGlzY19tdXRleCk7CisJdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiByZXR2YWw7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90dHlfcG9ydC5jIGIvZHJpdmVycy9jaGFyL3R0eV9wb3J0LmMKaW5kZXggYzYzZjNkMy4uYmU0OTJkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3R0eV9wb3J0LmMKKysrIGIvZHJpdmVycy9jaGFyL3R0eV9wb3J0LmMKQEAgLTI1LDE5ICsyNSwyMSBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBvcnQtPmNsb3NlX3dhaXQpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBvcnQtPmRlbHRhX21zcl93YWl0KTsKIAltdXRleF9pbml0KCZwb3J0LT5tdXRleCk7CisJbXV0ZXhfaW5pdCgmcG9ydC0+YnVmX211dGV4KTsKIAlzcGluX2xvY2tfaW5pdCgmcG9ydC0+bG9jayk7CiAJcG9ydC0+Y2xvc2VfZGVsYXkgPSAoNTAgKiBIWikgLyAxMDA7CiAJcG9ydC0+Y2xvc2luZ193YWl0ID0gKDMwMDAgKiBIWikgLyAxMDA7CisJa3JlZl9pbml0KCZwb3J0LT5rcmVmKTsKIH0KIEVYUE9SVF9TWU1CT0wodHR5X3BvcnRfaW5pdCk7CiAKIGludCB0dHlfcG9ydF9hbGxvY194bWl0X2J1ZihzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpCiB7CiAJLyogV2UgbWF5IHNsZWVwIGluIGdldF96ZXJvZWRfcGFnZSgpICovCi0JbXV0ZXhfbG9jaygmcG9ydC0+bXV0ZXgpOworCW11dGV4X2xvY2soJnBvcnQtPmJ1Zl9tdXRleCk7CiAJaWYgKHBvcnQtPnhtaXRfYnVmID09IE5VTEwpCiAJCXBvcnQtPnhtaXRfYnVmID0gKHVuc2lnbmVkIGNoYXIgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JbXV0ZXhfdW5sb2NrKCZwb3J0LT5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZwb3J0LT5idWZfbXV0ZXgpOwogCWlmIChwb3J0LT54bWl0X2J1ZiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAlyZXR1cm4gMDsKQEAgLTQ2LDE1ICs0OCwzMiBAQAogCiB2b2lkIHR0eV9wb3J0X2ZyZWVfeG1pdF9idWYoc3RydWN0IHR0eV9wb3J0ICpwb3J0KQogewotCW11dGV4X2xvY2soJnBvcnQtPm11dGV4KTsKKwltdXRleF9sb2NrKCZwb3J0LT5idWZfbXV0ZXgpOwogCWlmIChwb3J0LT54bWl0X2J1ZiAhPSBOVUxMKSB7CiAJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwb3J0LT54bWl0X2J1Zik7CiAJCXBvcnQtPnhtaXRfYnVmID0gTlVMTDsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZwb3J0LT5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZwb3J0LT5idWZfbXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTCh0dHlfcG9ydF9mcmVlX3htaXRfYnVmKTsKIAorc3RhdGljIHZvaWQgdHR5X3BvcnRfZGVzdHJ1Y3RvcihzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IHR0eV9wb3J0LCBrcmVmKTsKKwlpZiAocG9ydC0+eG1pdF9idWYpCisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwb3J0LT54bWl0X2J1Zik7CisJaWYgKHBvcnQtPm9wcy0+ZGVzdHJ1Y3QpCisJCXBvcnQtPm9wcy0+ZGVzdHJ1Y3QocG9ydCk7CisJZWxzZQorCQlrZnJlZShwb3J0KTsKK30KKwordm9pZCB0dHlfcG9ydF9wdXQoc3RydWN0IHR0eV9wb3J0ICpwb3J0KQoreworCWlmIChwb3J0KQorCQlrcmVmX3B1dCgmcG9ydC0+a3JlZiwgdHR5X3BvcnRfZGVzdHJ1Y3Rvcik7Cit9CitFWFBPUlRfU1lNQk9MKHR0eV9wb3J0X3B1dCk7CiAKIC8qKgogICoJdHR5X3BvcnRfdHR5X2dldAktCWdldCBhIHR0eSByZWZlcmVuY2UKQEAgLTk5LDEwICsxMTgsMTEgQEAKIAogc3RhdGljIHZvaWQgdHR5X3BvcnRfc2h1dGRvd24oc3RydWN0IHR0eV9wb3J0ICpwb3J0KQogeworCW11dGV4X2xvY2soJnBvcnQtPm11dGV4KTsKIAlpZiAocG9ydC0+b3BzLT5zaHV0ZG93biAmJgogCQl0ZXN0X2FuZF9jbGVhcl9iaXQoQVNZTkNCX0lOSVRJQUxJWkVELCAmcG9ydC0+ZmxhZ3MpKQogCQkJcG9ydC0+b3BzLT5zaHV0ZG93bihwb3J0KTsKLQorCW11dGV4X3VubG9jaygmcG9ydC0+bXV0ZXgpOwogfQogCiAvKioKQEAgLTEyMCw4ICsxNDAsMTAgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCXBvcnQtPmNvdW50ID0gMDsKIAlwb3J0LT5mbGFncyAmPSB+QVNZTkNfTk9STUFMX0FDVElWRTsKLQlpZiAocG9ydC0+dHR5KQorCWlmIChwb3J0LT50dHkpIHsKKwkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZwb3J0LT50dHktPmZsYWdzKTsKIAkJdHR5X2tyZWZfcHV0KHBvcnQtPnR0eSk7CisJfQogCXBvcnQtPnR0eSA9IE5VTEw7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+b3Blbl93YWl0KTsKQEAgLTE5OCw3ICsyMjAsNyBAQAogICoJbWFuYWdlbWVudCBvZiB0aGVzZSBsaW5lcy4gTm90ZSB0aGF0IHRoZSBkdHIvcnRzIHJhaXNlIGlzIGRvbmUgZWFjaAogICoJaXRlcmF0aW9uIGFzIGEgaGFuZ3VwIG1heSBoYXZlIHByZXZpb3VzbHkgZHJvcHBlZCB0aGVtIHdoaWxlIHdlIHdhaXQuCiAgKi8KLSAKKwogaW50IHR0eV9wb3J0X2Jsb2NrX3RpbF9yZWFkeShzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQsCiAJCQkJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CkBAIC0yNTMsNyArMjc1LDggQEAKIAkJCXR0eV9wb3J0X3JhaXNlX2R0cl9ydHMocG9ydCk7CiAKIAkJcHJlcGFyZV90b193YWl0KCZwb3J0LT5vcGVuX3dhaXQsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkvKiBDaGVjayBmb3IgYSBoYW5ndXAgb3IgdW5pbml0aWFsaXNlZCBwb3J0LiBSZXR1cm4gYWNjb3JkaW5nbHkgKi8KKwkJLyogQ2hlY2sgZm9yIGEgaGFuZ3VwIG9yIHVuaW5pdGlhbGlzZWQgcG9ydC4KKwkJCQkJCQlSZXR1cm4gYWNjb3JkaW5nbHkgKi8KIAkJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwgIShwb3J0LT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkgewogCQkJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkKIAkJCQlyZXR2YWwgPSAtRUFHQUlOOwpAQCAtMjg1LDExICszMDgsMTEgQEAKIAkJcG9ydC0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJldHZhbDsKLQkKIH0KIEVYUE9SVF9TWU1CT0wodHR5X3BvcnRfYmxvY2tfdGlsX3JlYWR5KTsKIAotaW50IHR0eV9wb3J0X2Nsb3NlX3N0YXJ0KHN0cnVjdCB0dHlfcG9ydCAqcG9ydCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCitpbnQgdHR5X3BvcnRfY2xvc2Vfc3RhcnQoc3RydWN0IHR0eV9wb3J0ICpwb3J0LAorCQkJCXN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTI5OSw3ICszMjIsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiggdHR5LT5jb3VudCA9PSAxICYmIHBvcnQtPmNvdW50ICE9IDEpIHsKKwlpZiAodHR5LT5jb3VudCA9PSAxICYmIHBvcnQtPmNvdW50ICE9IDEpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkgICAgInR0eV9wb3J0X2Nsb3NlX3N0YXJ0OiB0dHktPmNvdW50ID0gMSBwb3J0IGNvdW50ID0gJWQuXG4iLAogCQkJCQkJCQlwb3J0LT5jb3VudCk7CkBAIC0zMzEsMTIgKzM1NCwyMCBAQAogCQlsb25nIHRpbWVvdXQ7CiAKIAkJaWYgKGJwcyA+IDEyMDApCi0JCQl0aW1lb3V0ID0gbWF4X3QobG9uZywgKEhaICogMTAgKiBwb3J0LT5kcmFpbl9kZWxheSkgLyBicHMsCi0JCQkJCQkJCUhaIC8gMTApOworCQkJdGltZW91dCA9IG1heF90KGxvbmcsCisJCQkJKEhaICogMTAgKiBwb3J0LT5kcmFpbl9kZWxheSkgLyBicHMsIEhaIC8gMTApOwogCQllbHNlCiAJCQl0aW1lb3V0ID0gMiAqIEhaOwogCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZW91dCk7CiAJfQorCS8qIEZsdXNoIHRoZSBsZGlzYyBidWZmZXJpbmcgKi8KKwl0dHlfbGRpc2NfZmx1c2godHR5KTsKKworCS8qIERyb3AgRFRSL1JUUyBpZiBIVVBDTCBpcyBzZXQuIFRoaXMgY2F1c2VzIGFueSBhdHRhY2hlZCBtb2RlbSB0bworCSAgIGhhbmcgdXAgdGhlIGxpbmUgKi8KKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wpCisJCXR0eV9wb3J0X2xvd2VyX2R0cl9ydHMocG9ydCk7CisKIAkvKiBEb24ndCBjYWxsIHBvcnQtPmRyb3AgZm9yIHRoZSBsYXN0IHJlZmVyZW5jZS4gQ2FsbGVycyB3aWxsIHdhbnQKIAkgICB0byBkcm9wIHRoZSBsYXN0IGFjdGl2ZSByZWZlcmVuY2UgaW4gLT5zaHV0ZG93bigpIG9yIHRoZSB0dHkKIAkgICBzaHV0ZG93biBwYXRoICovCkBAIC0zNDgsMTEgKzM3OSw2IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXR0eV9sZGlzY19mbHVzaCh0dHkpOwotCi0JaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKQotCQl0dHlfcG9ydF9sb3dlcl9kdHJfcnRzKHBvcnQpOwotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIAl0dHktPmNsb3NpbmcgPSAwOwogCkBAIC0zNzcsNyArNDAzLDQyIEBACiAJaWYgKHR0eV9wb3J0X2Nsb3NlX3N0YXJ0KHBvcnQsIHR0eSwgZmlscCkgPT0gMCkKIAkJcmV0dXJuOwogCXR0eV9wb3J0X3NodXRkb3duKHBvcnQpOworCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncyk7CiAJdHR5X3BvcnRfY2xvc2VfZW5kKHBvcnQsIHR0eSk7CiAJdHR5X3BvcnRfdHR5X3NldChwb3J0LCBOVUxMKTsKIH0KIEVYUE9SVF9TWU1CT0wodHR5X3BvcnRfY2xvc2UpOworCitpbnQgdHR5X3BvcnRfb3BlbihzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCQkJCQkJc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3Bpbl9sb2NrX2lycSgmcG9ydC0+bG9jayk7CisJaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKQorCQkrK3BvcnQtPmNvdW50OworCXNwaW5fdW5sb2NrX2lycSgmcG9ydC0+bG9jayk7CisJdHR5X3BvcnRfdHR5X3NldChwb3J0LCB0dHkpOworCisJLyoKKwkgKiBEbyB0aGUgZGV2aWNlLXNwZWNpZmljIG9wZW4gb25seSBpZiB0aGUgaGFyZHdhcmUgaXNuJ3QKKwkgKiBhbHJlYWR5IGluaXRpYWxpemVkLiBTZXJpYWxpemUgb3BlbiBhbmQgc2h1dGRvd24gdXNpbmcgdGhlCisJICogcG9ydCBtdXRleC4KKwkgKi8KKworCW11dGV4X2xvY2soJnBvcnQtPm11dGV4KTsKKworCWlmICghdGVzdF9iaXQoQVNZTkNCX0lOSVRJQUxJWkVELCAmcG9ydC0+ZmxhZ3MpKSB7CisJCWNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKTsKKwkJaWYgKHBvcnQtPm9wcy0+YWN0aXZhdGUpIHsKKwkJCWludCByZXR2YWwgPSBwb3J0LT5vcHMtPmFjdGl2YXRlKHBvcnQsIHR0eSk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJbXV0ZXhfdW5sb2NrKCZwb3J0LT5tdXRleCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KKwkJfQorCQlzZXRfYml0KEFTWU5DQl9JTklUSUFMSVpFRCwgJnBvcnQtPmZsYWdzKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZwb3J0LT5tdXRleCk7CisJcmV0dXJuIHR0eV9wb3J0X2Jsb2NrX3RpbF9yZWFkeShwb3J0LCB0dHksIGZpbHApOworfQorCitFWFBPUlRfU1lNQk9MKHR0eV9wb3J0X29wZW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKaW5kZXggZmY1N2M0MC4uNjdiYzJlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCkBAIC02NCwxNCArNjQsMTQgQEAKICAqIC0gTG9jayBzaG91bGQgbm90IGJlIGhlbGQgYWNyb3NzCiAgKiAgICAgX19jcHVmcmVxX2dvdmVybm9yKGRhdGEsIENQVUZSRVFfR09WX1NUT1ApOwogICovCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBwb2xpY3lfY3B1KTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIGNwdWZyZXFfcG9saWN5X2NwdSk7CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHJ3X3NlbWFwaG9yZSwgY3B1X3BvbGljeV9yd3NlbSk7CiAKICNkZWZpbmUgbG9ja19wb2xpY3lfcndzZW0obW9kZSwgY3B1KQkJCQkJXAogaW50IGxvY2tfcG9saWN5X3J3c2VtXyMjbW9kZQkJCQkJCVwKIChpbnQgY3B1KQkJCQkJCQkJXAogewkJCQkJCQkJCVwKLQlpbnQgcG9saWN5X2NwdSA9IHBlcl9jcHUocG9saWN5X2NwdSwgY3B1KTsJCQlcCisJaW50IHBvbGljeV9jcHUgPSBwZXJfY3B1KGNwdWZyZXFfcG9saWN5X2NwdSwgY3B1KTsJCVwKIAlCVUdfT04ocG9saWN5X2NwdSA9PSAtMSk7CQkJCQlcCiAJZG93bl8jI21vZGUoJnBlcl9jcHUoY3B1X3BvbGljeV9yd3NlbSwgcG9saWN5X2NwdSkpOwkJXAogCWlmICh1bmxpa2VseSghY3B1X29ubGluZShjcHUpKSkgewkJCQlcCkBAIC05MCw3ICs5MCw3IEBACiAKIHZvaWQgdW5sb2NrX3BvbGljeV9yd3NlbV9yZWFkKGludCBjcHUpCiB7Ci0JaW50IHBvbGljeV9jcHUgPSBwZXJfY3B1KHBvbGljeV9jcHUsIGNwdSk7CisJaW50IHBvbGljeV9jcHUgPSBwZXJfY3B1KGNwdWZyZXFfcG9saWN5X2NwdSwgY3B1KTsKIAlCVUdfT04ocG9saWN5X2NwdSA9PSAtMSk7CiAJdXBfcmVhZCgmcGVyX2NwdShjcHVfcG9saWN5X3J3c2VtLCBwb2xpY3lfY3B1KSk7CiB9CkBAIC05OCw3ICs5OCw3IEBACiAKIHZvaWQgdW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZShpbnQgY3B1KQogewotCWludCBwb2xpY3lfY3B1ID0gcGVyX2NwdShwb2xpY3lfY3B1LCBjcHUpOworCWludCBwb2xpY3lfY3B1ID0gcGVyX2NwdShjcHVmcmVxX3BvbGljeV9jcHUsIGNwdSk7CiAJQlVHX09OKHBvbGljeV9jcHUgPT0gLTEpOwogCXVwX3dyaXRlKCZwZXJfY3B1KGNwdV9wb2xpY3lfcndzZW0sIHBvbGljeV9jcHUpKTsKIH0KQEAgLTY0Nyw2ICs2NDcsMjEgQEAKIAlyZXR1cm4gcG9saWN5LT5nb3Zlcm5vci0+c2hvd19zZXRzcGVlZChwb2xpY3ksIGJ1Zik7CiB9CiAKKy8qKgorICogc2hvd19zY2FsaW5nX2RyaXZlciAtIHNob3cgdGhlIGN1cnJlbnQgY3B1ZnJlcSBIVy9CSU9TIGxpbWl0YXRpb24KKyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19iaW9zX2xpbWl0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LCBjaGFyICpidWYpCit7CisJdW5zaWduZWQgaW50IGxpbWl0OworCWludCByZXQ7CisJaWYgKGNwdWZyZXFfZHJpdmVyLT5iaW9zX2xpbWl0KSB7CisJCXJldCA9IGNwdWZyZXFfZHJpdmVyLT5iaW9zX2xpbWl0KHBvbGljeS0+Y3B1LCAmbGltaXQpOworCQlpZiAoIXJldCkKKwkJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBsaW1pdCk7CisJfQorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBwb2xpY3ktPmNwdWluZm8ubWF4X2ZyZXEpOworfQorCiAjZGVmaW5lIGRlZmluZV9vbmVfcm8oX25hbWUpIFwKIHN0YXRpYyBzdHJ1Y3QgZnJlcV9hdHRyIF9uYW1lID0gXAogX19BVFRSKF9uYW1lLCAwNDQ0LCBzaG93XyMjX25hbWUsIE5VTEwpCkBAIC02NjYsNiArNjgxLDcgQEAKIGRlZmluZV9vbmVfcm8oc2NhbGluZ19hdmFpbGFibGVfZ292ZXJub3JzKTsKIGRlZmluZV9vbmVfcm8oc2NhbGluZ19kcml2ZXIpOwogZGVmaW5lX29uZV9ybyhzY2FsaW5nX2N1cl9mcmVxKTsKK2RlZmluZV9vbmVfcm8oYmlvc19saW1pdCk7CiBkZWZpbmVfb25lX3JvKHJlbGF0ZWRfY3B1cyk7CiBkZWZpbmVfb25lX3JvKGFmZmVjdGVkX2NwdXMpOwogZGVmaW5lX29uZV9ydyhzY2FsaW5nX21pbl9mcmVxKTsKQEAgLTc2Nyw4ICs3ODMsOSBAQAogICogICAwOiAgICAgICAgU3VjY2VzcwogICogICBQb3NpdGl2ZTogV2hlbiB3ZSBoYXZlIGEgbWFuYWdlZCBDUFUgYW5kIHRoZSBzeXNmcyBnb3Qgc3ltbGlua2VkCiAgKi8KLWludCBjcHVmcmVxX2FkZF9kZXZfcG9saWN5KHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAotCQlzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzX2RldikKK3N0YXRpYyBpbnQgY3B1ZnJlcV9hZGRfZGV2X3BvbGljeSh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCSAgc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCQkJICBzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzX2RldikKIHsKIAlpbnQgcmV0ID0gMDsKICNpZmRlZiBDT05GSUdfU01QCkBAIC04MDEsNyArODE4LDcgQEAKIAogCQkJLyogU2V0IHByb3BlciBwb2xpY3lfY3B1ICovCiAJCQl1bmxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKGNwdSk7Ci0JCQlwZXJfY3B1KHBvbGljeV9jcHUsIGNwdSkgPSBtYW5hZ2VkX3BvbGljeS0+Y3B1OworCQkJcGVyX2NwdShjcHVmcmVxX3BvbGljeV9jcHUsIGNwdSkgPSBtYW5hZ2VkX3BvbGljeS0+Y3B1OwogCiAJCQlpZiAobG9ja19wb2xpY3lfcndzZW1fd3JpdGUoY3B1KSA8IDApIHsKIAkJCQkvKiBTaG91bGQgbm90IGdvIHRocm91Z2ggcG9saWN5IHVubG9jayBwYXRoICovCkBAIC04NDIsNyArODU5LDggQEAKIAogCiAvKiBzeW1saW5rIGFmZmVjdGVkIENQVXMgKi8KLWludCBjcHVmcmVxX2FkZF9kZXZfc3ltbGluayh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3N0YXRpYyBpbnQgY3B1ZnJlcV9hZGRfZGV2X3N5bWxpbmsodW5zaWduZWQgaW50IGNwdSwKKwkJCQkgICBzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKIHsKIAl1bnNpZ25lZCBpbnQgajsKIAlpbnQgcmV0ID0gMDsKQEAgLTg2OSw4ICs4ODcsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBjcHVmcmVxX2FkZF9kZXZfaW50ZXJmYWNlKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAotCQlzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzX2RldikKK3N0YXRpYyBpbnQgY3B1ZnJlcV9hZGRfZGV2X2ludGVyZmFjZSh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCSAgICAgc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCQkJICAgICBzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzX2RldikKIHsKIAlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgbmV3X3BvbGljeTsKIAlzdHJ1Y3QgZnJlcV9hdHRyICoqZHJ2X2F0dHI7CkBAIC05MDIsMTMgKzkyMSwxOCBAQAogCQlpZiAocmV0KQogCQkJZ290byBlcnJfb3V0X2tvYmpfcHV0OwogCX0KKwlpZiAoY3B1ZnJlcV9kcml2ZXItPmJpb3NfbGltaXQpIHsKKwkJcmV0ID0gc3lzZnNfY3JlYXRlX2ZpbGUoJnBvbGljeS0+a29iaiwgJmJpb3NfbGltaXQuYXR0cik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9vdXRfa29ial9wdXQ7CisJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNwdWZyZXFfZHJpdmVyX2xvY2ssIGZsYWdzKTsKIAlmb3JfZWFjaF9jcHUoaiwgcG9saWN5LT5jcHVzKSB7CiAJaWYgKCFjcHVfb25saW5lKGopKQogCQljb250aW51ZTsKIAkJcGVyX2NwdShjcHVmcmVxX2NwdV9kYXRhLCBqKSA9IHBvbGljeTsKLQkJcGVyX2NwdShwb2xpY3lfY3B1LCBqKSA9IHBvbGljeS0+Y3B1OworCQlwZXJfY3B1KGNwdWZyZXFfcG9saWN5X2NwdSwgaikgPSBwb2xpY3ktPmNwdTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3B1ZnJlcV9kcml2ZXJfbG9jaywgZmxhZ3MpOwogCkBAIC05OTYsNyArMTAyMCw3IEBACiAJY3B1bWFza19jb3B5KHBvbGljeS0+Y3B1cywgY3B1bWFza19vZihjcHUpKTsKIAogCS8qIEluaXRpYWxseSBzZXQgQ1BVIGl0c2VsZiBhcyB0aGUgcG9saWN5X2NwdSAqLwotCXBlcl9jcHUocG9saWN5X2NwdSwgY3B1KSA9IGNwdTsKKwlwZXJfY3B1KGNwdWZyZXFfcG9saWN5X2NwdSwgY3B1KSA9IGNwdTsKIAlyZXQgPSAobG9ja19wb2xpY3lfcndzZW1fd3JpdGUoY3B1KSA8IDApOwogCVdBUk5fT04ocmV0KTsKIApAQCAtMTk3OCw3ICsyMDAyLDcgQEAKIAlpbnQgY3B1OwogCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewotCQlwZXJfY3B1KHBvbGljeV9jcHUsIGNwdSkgPSAtMTsKKwkJcGVyX2NwdShjcHVmcmVxX3BvbGljeV9jcHUsIGNwdSkgPSAtMTsKIAkJaW5pdF9yd3NlbSgmcGVyX2NwdShjcHVfcG9saWN5X3J3c2VtLCBjcHUpKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX2NvbnNlcnZhdGl2ZS5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfY29uc2VydmF0aXZlLmMKaW5kZXggYzdiMDgxYi4uNTk5YTQwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfY29uc2VydmF0aXZlLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfY29uc2VydmF0aXZlLmMKQEAgLTE2NCwyMCArMTY0LDIyIEBACiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiogc3lzZnMgaW50ZXJmYWNlICoqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBzc2l6ZV90IHNob3dfc2FtcGxpbmdfcmF0ZV9tYXgoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfc2FtcGxpbmdfcmF0ZV9tYXgoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXByaW50a19vbmNlKEtFUk5fSU5GTyAiQ1BVRlJFUTogY29uc2VydmF0aXZlIHNhbXBsaW5nX3JhdGVfbWF4ICIKIAkJICAgICJzeXNmcyBmaWxlIGlzIGRlcHJlY2F0ZWQgLSB1c2VkIGJ5OiAlc1xuIiwgY3VycmVudC0+Y29tbSk7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIC0xVSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfc2FtcGxpbmdfcmF0ZV9taW4oc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfc2FtcGxpbmdfcmF0ZV9taW4oc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBtaW5fc2FtcGxpbmdfcmF0ZSk7CiB9CiAKICNkZWZpbmUgZGVmaW5lX29uZV9ybyhfbmFtZSkJCVwKLXN0YXRpYyBzdHJ1Y3QgZnJlcV9hdHRyIF9uYW1lID0JCVwKK3N0YXRpYyBzdHJ1Y3QgZ2xvYmFsX2F0dHIgX25hbWUgPQlcCiBfX0FUVFIoX25hbWUsIDA0NDQsIHNob3dfIyNfbmFtZSwgTlVMTCkKIAogZGVmaW5lX29uZV9ybyhzYW1wbGluZ19yYXRlX21heCk7CkBAIC0xODYsNyArMTg4LDcgQEAKIC8qIGNwdWZyZXFfY29uc2VydmF0aXZlIEdvdmVybm9yIFR1bmFibGVzICovCiAjZGVmaW5lIHNob3dfb25lKGZpbGVfbmFtZSwgb2JqZWN0KQkJCQkJXAogc3RhdGljIHNzaXplX3Qgc2hvd18jI2ZpbGVfbmFtZQkJCQkJCVwKLShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnVudXNlZCwgY2hhciAqYnVmKQkJCQlcCisoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJCVwKIHsJCQkJCQkJCQlcCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRic190dW5lcnNfaW5zLm9iamVjdCk7CQlcCiB9CkBAIC0xOTcsOCArMTk5LDQwIEBACiBzaG93X29uZShpZ25vcmVfbmljZV9sb2FkLCBpZ25vcmVfbmljZSk7CiBzaG93X29uZShmcmVxX3N0ZXAsIGZyZXFfc3RlcCk7CiAKLXN0YXRpYyBzc2l6ZV90IHN0b3JlX3NhbXBsaW5nX2Rvd25fZmFjdG9yKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqdW51c2VkLAotCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKKy8qKiogZGVsZXRlIGFmdGVyIGRlcHJlY2F0aW9uIHRpbWUgKioqLworI2RlZmluZSBERVBSRUNBVElPTl9NU0coZmlsZV9uYW1lKQkJCQkJXAorCXByaW50a19vbmNlKEtFUk5fSU5GTyAiQ1BVRlJFUTogUGVyIGNvcmUgY29uc2VydmF0aXZlIHN5c2ZzICIJXAorCQkiaW50ZXJmYWNlIGlzIGRlcHJlY2F0ZWQgLSAiICNmaWxlX25hbWUgIlxuIik7CisKKyNkZWZpbmUgc2hvd19vbmVfb2xkKGZpbGVfbmFtZSkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjZmlsZV9uYW1lIyNfb2xkCQkJCQlcCisoc3RydWN0IGNwdWZyZXFfcG9saWN5ICp1bnVzZWQsIGNoYXIgKmJ1ZikJCQkJXAorewkJCQkJCQkJCVwKKwlwcmludGtfb25jZShLRVJOX0lORk8gIkNQVUZSRVE6IFBlciBjb3JlIGNvbnNlcnZhdGl2ZSBzeXNmcyAiCVwKKwkJImludGVyZmFjZSBpcyBkZXByZWNhdGVkIC0gIiAjZmlsZV9uYW1lICJcbiIpOwkJXAorCXJldHVybiBzaG93XyMjZmlsZV9uYW1lKE5VTEwsIE5VTEwsIGJ1Zik7CQkJXAorfQorc2hvd19vbmVfb2xkKHNhbXBsaW5nX3JhdGUpOworc2hvd19vbmVfb2xkKHNhbXBsaW5nX2Rvd25fZmFjdG9yKTsKK3Nob3dfb25lX29sZCh1cF90aHJlc2hvbGQpOworc2hvd19vbmVfb2xkKGRvd25fdGhyZXNob2xkKTsKK3Nob3dfb25lX29sZChpZ25vcmVfbmljZV9sb2FkKTsKK3Nob3dfb25lX29sZChmcmVxX3N0ZXApOworc2hvd19vbmVfb2xkKHNhbXBsaW5nX3JhdGVfbWluKTsKK3Nob3dfb25lX29sZChzYW1wbGluZ19yYXRlX21heCk7CisKKyNkZWZpbmUgZGVmaW5lX29uZV9yb19vbGQob2JqZWN0LCBfbmFtZSkJXAorc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIgb2JqZWN0ID0JCVwKK19fQVRUUihfbmFtZSwgMDQ0NCwgc2hvd18jI19uYW1lIyNfb2xkLCBOVUxMKQorCitkZWZpbmVfb25lX3JvX29sZChzYW1wbGluZ19yYXRlX21pbl9vbGQsIHNhbXBsaW5nX3JhdGVfbWluKTsKK2RlZmluZV9vbmVfcm9fb2xkKHNhbXBsaW5nX3JhdGVfbWF4X29sZCwgc2FtcGxpbmdfcmF0ZV9tYXgpOworCisvKioqIGRlbGV0ZSBhZnRlciBkZXByZWNhdGlvbiB0aW1lICoqKi8KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfc2FtcGxpbmdfZG93bl9mYWN0b3Ioc3RydWN0IGtvYmplY3QgKmEsCisJCQkJCSAgc3RydWN0IGF0dHJpYnV0ZSAqYiwKKwkJCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAl1bnNpZ25lZCBpbnQgaW5wdXQ7CiAJaW50IHJldDsKQEAgLTIxNCw4ICsyNDgsOCBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfc2FtcGxpbmdfcmF0ZShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnVudXNlZCwKLQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBzdG9yZV9zYW1wbGluZ19yYXRlKHN0cnVjdCBrb2JqZWN0ICphLCBzdHJ1Y3QgYXR0cmlidXRlICpiLAorCQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXVuc2lnbmVkIGludCBpbnB1dDsKIAlpbnQgcmV0OwpAQCAtMjMxLDggKzI2NSw4IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBzdG9yZV91cF90aHJlc2hvbGQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICp1bnVzZWQsCi0JCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3Qgc3RvcmVfdXBfdGhyZXNob2xkKHN0cnVjdCBrb2JqZWN0ICphLCBzdHJ1Y3QgYXR0cmlidXRlICpiLAorCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJdW5zaWduZWQgaW50IGlucHV0OwogCWludCByZXQ7CkBAIC0yNTEsOCArMjg1LDggQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHN0b3JlX2Rvd25fdGhyZXNob2xkKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqdW51c2VkLAotCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2Rvd25fdGhyZXNob2xkKHN0cnVjdCBrb2JqZWN0ICphLCBzdHJ1Y3QgYXR0cmlidXRlICpiLAorCQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAl1bnNpZ25lZCBpbnQgaW5wdXQ7CiAJaW50IHJldDsKQEAgLTI3Miw4ICszMDYsOCBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfaWdub3JlX25pY2VfbG9hZChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKLQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBzdG9yZV9pZ25vcmVfbmljZV9sb2FkKHN0cnVjdCBrb2JqZWN0ICphLCBzdHJ1Y3QgYXR0cmlidXRlICpiLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXVuc2lnbmVkIGludCBpbnB1dDsKIAlpbnQgcmV0OwpAQCAtMzA4LDggKzM0Miw4IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9mcmVxX3N0ZXAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCi0JCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3Qgc3RvcmVfZnJlcV9zdGVwKHN0cnVjdCBrb2JqZWN0ICphLCBzdHJ1Y3QgYXR0cmlidXRlICpiLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXVuc2lnbmVkIGludCBpbnB1dDsKIAlpbnQgcmV0OwpAQCAtMzMxLDcgKzM2NSw3IEBACiB9CiAKICNkZWZpbmUgZGVmaW5lX29uZV9ydyhfbmFtZSkgXAotc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIgX25hbWUgPSBcCitzdGF0aWMgc3RydWN0IGdsb2JhbF9hdHRyIF9uYW1lID0gXAogX19BVFRSKF9uYW1lLCAwNjQ0LCBzaG93XyMjX25hbWUsIHN0b3JlXyMjX25hbWUpCiAKIGRlZmluZV9vbmVfcncoc2FtcGxpbmdfcmF0ZSk7CkBAIC0zNTgsNiArMzkyLDUzIEBACiAJLm5hbWUgPSAiY29uc2VydmF0aXZlIiwKIH07CiAKKy8qKiogZGVsZXRlIGFmdGVyIGRlcHJlY2F0aW9uIHRpbWUgKioqLworCisjZGVmaW5lIHdyaXRlX29uZV9vbGQoZmlsZV9uYW1lKQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc3RvcmVfIyNmaWxlX25hbWUjI19vbGQJCQkJCVwKKyhzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnVudXNlZCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQlcCit7CQkJCQkJCQkJXAorCXByaW50a19vbmNlKEtFUk5fSU5GTyAiQ1BVRlJFUTogUGVyIGNvcmUgY29uc2VydmF0aXZlIHN5c2ZzICIJXAorCQkiaW50ZXJmYWNlIGlzIGRlcHJlY2F0ZWQgLSAiICNmaWxlX25hbWUgIlxuIik7CVwKKwlyZXR1cm4gc3RvcmVfIyNmaWxlX25hbWUoTlVMTCwgTlVMTCwgYnVmLCBjb3VudCk7CQlcCit9Cit3cml0ZV9vbmVfb2xkKHNhbXBsaW5nX3JhdGUpOword3JpdGVfb25lX29sZChzYW1wbGluZ19kb3duX2ZhY3Rvcik7Cit3cml0ZV9vbmVfb2xkKHVwX3RocmVzaG9sZCk7Cit3cml0ZV9vbmVfb2xkKGRvd25fdGhyZXNob2xkKTsKK3dyaXRlX29uZV9vbGQoaWdub3JlX25pY2VfbG9hZCk7Cit3cml0ZV9vbmVfb2xkKGZyZXFfc3RlcCk7CisKKyNkZWZpbmUgZGVmaW5lX29uZV9yd19vbGQob2JqZWN0LCBfbmFtZSkJXAorc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIgb2JqZWN0ID0JCVwKK19fQVRUUihfbmFtZSwgMDY0NCwgc2hvd18jI19uYW1lIyNfb2xkLCBzdG9yZV8jI19uYW1lIyNfb2xkKQorCitkZWZpbmVfb25lX3J3X29sZChzYW1wbGluZ19yYXRlX29sZCwgc2FtcGxpbmdfcmF0ZSk7CitkZWZpbmVfb25lX3J3X29sZChzYW1wbGluZ19kb3duX2ZhY3Rvcl9vbGQsIHNhbXBsaW5nX2Rvd25fZmFjdG9yKTsKK2RlZmluZV9vbmVfcndfb2xkKHVwX3RocmVzaG9sZF9vbGQsIHVwX3RocmVzaG9sZCk7CitkZWZpbmVfb25lX3J3X29sZChkb3duX3RocmVzaG9sZF9vbGQsIGRvd25fdGhyZXNob2xkKTsKK2RlZmluZV9vbmVfcndfb2xkKGlnbm9yZV9uaWNlX2xvYWRfb2xkLCBpZ25vcmVfbmljZV9sb2FkKTsKK2RlZmluZV9vbmVfcndfb2xkKGZyZXFfc3RlcF9vbGQsIGZyZXFfc3RlcCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpkYnNfYXR0cmlidXRlc19vbGRbXSA9IHsKKwkmc2FtcGxpbmdfcmF0ZV9tYXhfb2xkLmF0dHIsCisJJnNhbXBsaW5nX3JhdGVfbWluX29sZC5hdHRyLAorCSZzYW1wbGluZ19yYXRlX29sZC5hdHRyLAorCSZzYW1wbGluZ19kb3duX2ZhY3Rvcl9vbGQuYXR0ciwKKwkmdXBfdGhyZXNob2xkX29sZC5hdHRyLAorCSZkb3duX3RocmVzaG9sZF9vbGQuYXR0ciwKKwkmaWdub3JlX25pY2VfbG9hZF9vbGQuYXR0ciwKKwkmZnJlcV9zdGVwX29sZC5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGRic19hdHRyX2dyb3VwX29sZCA9IHsKKwkuYXR0cnMgPSBkYnNfYXR0cmlidXRlc19vbGQsCisJLm5hbWUgPSAiY29uc2VydmF0aXZlIiwKK307CisKKy8qKiogZGVsZXRlIGFmdGVyIGRlcHJlY2F0aW9uIHRpbWUgKioqLworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiogc3lzZnMgZW5kICoqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQgZGJzX2NoZWNrX2NwdShzdHJ1Y3QgY3B1X2Ric19pbmZvX3MgKnRoaXNfZGJzX2luZm8pCkBAIC01MzAsNyArNjExLDcgQEAKIAogCQltdXRleF9sb2NrKCZkYnNfbXV0ZXgpOwogCi0JCXJjID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZwb2xpY3ktPmtvYmosICZkYnNfYXR0cl9ncm91cCk7CisJCXJjID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZwb2xpY3ktPmtvYmosICZkYnNfYXR0cl9ncm91cF9vbGQpOwogCQlpZiAocmMpIHsKIAkJCW11dGV4X3VubG9jaygmZGJzX211dGV4KTsKIAkJCXJldHVybiByYzsKQEAgLTU2NCw2ICs2NDUsMTMgQEAKIAkJCWlmIChsYXRlbmN5ID09IDApCiAJCQkJbGF0ZW5jeSA9IDE7CiAKKwkJCXJjID0gc3lzZnNfY3JlYXRlX2dyb3VwKGNwdWZyZXFfZ2xvYmFsX2tvYmplY3QsCisJCQkJCQkmZGJzX2F0dHJfZ3JvdXApOworCQkJaWYgKHJjKSB7CisJCQkJbXV0ZXhfdW5sb2NrKCZkYnNfbXV0ZXgpOworCQkJCXJldHVybiByYzsKKwkJCX0KKwogCQkJLyoKIAkJCSAqIGNvbnNlcnZhdGl2ZSBkb2VzIG5vdCBpbXBsZW1lbnQgbWljcm8gbGlrZSBvbmRlbWFuZAogCQkJICogZ292ZXJub3IsIHRodXMgd2UgYXJlIGJvdW5kIHRvIGppZmZlcy9IWgpAQCAtNTkxLDcgKzY3OSw3IEBACiAJCWRic190aW1lcl9leGl0KHRoaXNfZGJzX2luZm8pOwogCiAJCW11dGV4X2xvY2soJmRic19tdXRleCk7Ci0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmcG9saWN5LT5rb2JqLCAmZGJzX2F0dHJfZ3JvdXApOworCQlzeXNmc19yZW1vdmVfZ3JvdXAoJnBvbGljeS0+a29iaiwgJmRic19hdHRyX2dyb3VwX29sZCk7CiAJCWRic19lbmFibGUtLTsKIAkJbXV0ZXhfZGVzdHJveSgmdGhpc19kYnNfaW5mby0+dGltZXJfbXV0ZXgpOwogCkBAIC02MDUsNiArNjkzLDkgQEAKIAkJCQkJQ1BVRlJFUV9UUkFOU0lUSU9OX05PVElGSUVSKTsKIAogCQltdXRleF91bmxvY2soJmRic19tdXRleCk7CisJCWlmICghZGJzX2VuYWJsZSkKKwkJCXN5c2ZzX3JlbW92ZV9ncm91cChjcHVmcmVxX2dsb2JhbF9rb2JqZWN0LAorCQkJCQkgICAmZGJzX2F0dHJfZ3JvdXApOwogCiAJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvZnJlcV90YWJsZS5jIGIvZHJpdmVycy9jcHVmcmVxL2ZyZXFfdGFibGUuYwppbmRleCBhOWJkM2EwLi4wNTQzMjIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvZnJlcV90YWJsZS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9mcmVxX3RhYmxlLmMKQEAgLTE3NCw3ICsxNzQsNyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdGFyZ2V0KTsKIAotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqLCBzaG93X3RhYmxlKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKiwgY3B1ZnJlcV9zaG93X3RhYmxlKTsKIC8qKgogICogc2hvd19hdmFpbGFibGVfZnJlcXMgLSBzaG93IGF2YWlsYWJsZSBmcmVxdWVuY2llcyBmb3IgdGhlIHNwZWNpZmllZCBDUFUKICAqLwpAQCAtMTg1LDEwICsxODUsMTAgQEAKIAlzc2l6ZV90IGNvdW50ID0gMDsKIAlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKnRhYmxlOwogCi0JaWYgKCFwZXJfY3B1KHNob3dfdGFibGUsIGNwdSkpCisJaWYgKCFwZXJfY3B1KGNwdWZyZXFfc2hvd190YWJsZSwgY3B1KSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQl0YWJsZSA9IHBlcl9jcHUoc2hvd190YWJsZSwgY3B1KTsKKwl0YWJsZSA9IHBlcl9jcHUoY3B1ZnJlcV9zaG93X3RhYmxlLCBjcHUpOwogCiAJZm9yIChpID0gMDsgKHRhYmxlW2ldLmZyZXF1ZW5jeSAhPSBDUFVGUkVRX1RBQkxFX0VORCk7IGkrKykgewogCQlpZiAodGFibGVbaV0uZnJlcXVlbmN5ID09IENQVUZSRVFfRU5UUllfSU5WQUxJRCkKQEAgLTIxNywyMCArMjE3LDIwIEBACiAJCQkJICAgICAgdW5zaWduZWQgaW50IGNwdSkKIHsKIAlkcHJpbnRrKCJzZXR0aW5nIHNob3dfdGFibGUgZm9yIGNwdSAldSB0byAlcFxuIiwgY3B1LCB0YWJsZSk7Ci0JcGVyX2NwdShzaG93X3RhYmxlLCBjcHUpID0gdGFibGU7CisJcGVyX2NwdShjcHVmcmVxX3Nob3dfdGFibGUsIGNwdSkgPSB0YWJsZTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2dldF9hdHRyKTsKIAogdm9pZCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9wdXRfYXR0cih1bnNpZ25lZCBpbnQgY3B1KQogewogCWRwcmludGsoImNsZWFyaW5nIHNob3dfdGFibGUgZm9yIGNwdSAldVxuIiwgY3B1KTsKLQlwZXJfY3B1KHNob3dfdGFibGUsIGNwdSkgPSBOVUxMOworCXBlcl9jcHUoY3B1ZnJlcV9zaG93X3RhYmxlLCBjcHUpID0gTlVMTDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3B1dF9hdHRyKTsKIAogc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpjcHVmcmVxX2ZyZXF1ZW5jeV9nZXRfdGFibGUodW5zaWduZWQgaW50IGNwdSkKIHsKLQlyZXR1cm4gcGVyX2NwdShzaG93X3RhYmxlLCBjcHUpOworCXJldHVybiBwZXJfY3B1KGNwdWZyZXFfc2hvd190YWJsZSwgY3B1KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNwdWZyZXFfZnJlcXVlbmN5X2dldF90YWJsZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3BhZGxvY2stYWVzLmMgYi9kcml2ZXJzL2NyeXB0by9wYWRsb2NrLWFlcy5jCmluZGV4IDg0YzUxZTEuLjhjMmYzNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL3BhZGxvY2stYWVzLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vcGFkbG9jay1hZXMuYwpAQCAtNjQsNyArNjQsNyBAQAogCXUzMiAqRDsKIH07CiAKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY3dvcmQgKiwgbGFzdF9jd29yZCk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGN3b3JkICosIHBhZXNfbGFzdF9jd29yZCk7CiAKIC8qIFRlbGxzIHdoZXRoZXIgdGhlIEFDRSBpcyBjYXBhYmxlIHRvIGdlbmVyYXRlCiAgICB0aGUgZXh0ZW5kZWQga2V5IGZvciBhIGdpdmVuIGtleV9sZW4uICovCkBAIC0xNTIsOSArMTUyLDkgQEAKIAogb2s6CiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCi0JCWlmICgmY3R4LT5jd29yZC5lbmNyeXB0ID09IHBlcl9jcHUobGFzdF9jd29yZCwgY3B1KSB8fAotCQkgICAgJmN0eC0+Y3dvcmQuZGVjcnlwdCA9PSBwZXJfY3B1KGxhc3RfY3dvcmQsIGNwdSkpCi0JCQlwZXJfY3B1KGxhc3RfY3dvcmQsIGNwdSkgPSBOVUxMOworCQlpZiAoJmN0eC0+Y3dvcmQuZW5jcnlwdCA9PSBwZXJfY3B1KHBhZXNfbGFzdF9jd29yZCwgY3B1KSB8fAorCQkgICAgJmN0eC0+Y3dvcmQuZGVjcnlwdCA9PSBwZXJfY3B1KHBhZXNfbGFzdF9jd29yZCwgY3B1KSkKKwkJCXBlcl9jcHUocGFlc19sYXN0X2N3b3JkLCBjcHUpID0gTlVMTDsKIAogCXJldHVybiAwOwogfQpAQCAtMTY2LDcgKzE2Niw3IEBACiB7CiAJaW50IGNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CiAKLQlpZiAoY3dvcmQgIT0gcGVyX2NwdShsYXN0X2N3b3JkLCBjcHUpKQorCWlmIChjd29yZCAhPSBwZXJfY3B1KHBhZXNfbGFzdF9jd29yZCwgY3B1KSkKICNpZm5kZWYgQ09ORklHX1g4Nl82NAogCQlhc20gdm9sYXRpbGUgKCJwdXNoZmw7IHBvcGZsIik7CiAjZWxzZQpAQCAtMTc2LDcgKzE3Niw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwYWRsb2NrX3N0b3JlX2N3b3JkKHN0cnVjdCBjd29yZCAqY3dvcmQpCiB7Ci0JcGVyX2NwdShsYXN0X2N3b3JkLCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKSA9IGN3b3JkOworCXBlcl9jcHUocGFlc19sYXN0X2N3b3JkLCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKSA9IGN3b3JkOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvZG1hZW5naW5lLmMgYi9kcml2ZXJzL2RtYS9kbWFlbmdpbmUuYwppbmRleCA4Zjk5MzU0Li42ZjUxYTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9kbWFlbmdpbmUuYworKysgYi9kcml2ZXJzL2RtYS9kbWFlbmdpbmUuYwpAQCAtMzI2LDE0ICszMjYsNyBAQAogICovCiBzdHJ1Y3QgZG1hX2NoYW4gKmRtYV9maW5kX2NoYW5uZWwoZW51bSBkbWFfdHJhbnNhY3Rpb25fdHlwZSB0eF90eXBlKQogewotCXN0cnVjdCBkbWFfY2hhbiAqY2hhbjsKLQlpbnQgY3B1OwotCi0JY3B1ID0gZ2V0X2NwdSgpOwotCWNoYW4gPSBwZXJfY3B1X3B0cihjaGFubmVsX3RhYmxlW3R4X3R5cGVdLCBjcHUpLT5jaGFuOwotCXB1dF9jcHUoKTsKLQotCXJldHVybiBjaGFuOworCXJldHVybiB0aGlzX2NwdV9yZWFkKGNoYW5uZWxfdGFibGVbdHhfdHlwZV0tPmNoYW4pOwogfQogRVhQT1JUX1NZTUJPTChkbWFfZmluZF9jaGFubmVsKTsKIApAQCAtODU3LDcgKzg1MCw2IEBACiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eDsKIAlkbWFfYWRkcl90IGRtYV9kZXN0LCBkbWFfc3JjOwogCWRtYV9jb29raWVfdCBjb29raWU7Ci0JaW50IGNwdTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJZG1hX3NyYyA9IGRtYV9tYXBfc2luZ2xlKGRldi0+ZGV2LCBzcmMsIGxlbiwgRE1BX1RPX0RFVklDRSk7CkBAIC04NzYsMTAgKzg2OCwxMCBAQAogCXR4LT5jYWxsYmFjayA9IE5VTEw7CiAJY29va2llID0gdHgtPnR4X3N1Ym1pdCh0eCk7CiAKLQljcHUgPSBnZXRfY3B1KCk7Ci0JcGVyX2NwdV9wdHIoY2hhbi0+bG9jYWwsIGNwdSktPmJ5dGVzX3RyYW5zZmVycmVkICs9IGxlbjsKLQlwZXJfY3B1X3B0cihjaGFuLT5sb2NhbCwgY3B1KS0+bWVtY3B5X2NvdW50Kys7Ci0JcHV0X2NwdSgpOworCXByZWVtcHRfZGlzYWJsZSgpOworCV9fdGhpc19jcHVfYWRkKGNoYW4tPmxvY2FsLT5ieXRlc190cmFuc2ZlcnJlZCwgbGVuKTsKKwlfX3RoaXNfY3B1X2luYyhjaGFuLT5sb2NhbC0+bWVtY3B5X2NvdW50KTsKKwlwcmVlbXB0X2VuYWJsZSgpOwogCiAJcmV0dXJuIGNvb2tpZTsKIH0KQEAgLTkwNiw3ICs4OTgsNiBAQAogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHg7CiAJZG1hX2FkZHJfdCBkbWFfZGVzdCwgZG1hX3NyYzsKIAlkbWFfY29va2llX3QgY29va2llOwotCWludCBjcHU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWRtYV9zcmMgPSBkbWFfbWFwX3NpbmdsZShkZXYtPmRldiwga2RhdGEsIGxlbiwgRE1BX1RPX0RFVklDRSk7CkBAIC05MjMsMTAgKzkxNCwxMCBAQAogCXR4LT5jYWxsYmFjayA9IE5VTEw7CiAJY29va2llID0gdHgtPnR4X3N1Ym1pdCh0eCk7CiAKLQljcHUgPSBnZXRfY3B1KCk7Ci0JcGVyX2NwdV9wdHIoY2hhbi0+bG9jYWwsIGNwdSktPmJ5dGVzX3RyYW5zZmVycmVkICs9IGxlbjsKLQlwZXJfY3B1X3B0cihjaGFuLT5sb2NhbCwgY3B1KS0+bWVtY3B5X2NvdW50Kys7Ci0JcHV0X2NwdSgpOworCXByZWVtcHRfZGlzYWJsZSgpOworCV9fdGhpc19jcHVfYWRkKGNoYW4tPmxvY2FsLT5ieXRlc190cmFuc2ZlcnJlZCwgbGVuKTsKKwlfX3RoaXNfY3B1X2luYyhjaGFuLT5sb2NhbC0+bWVtY3B5X2NvdW50KTsKKwlwcmVlbXB0X2VuYWJsZSgpOwogCiAJcmV0dXJuIGNvb2tpZTsKIH0KQEAgLTk1NSw3ICs5NDYsNiBAQAogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHg7CiAJZG1hX2FkZHJfdCBkbWFfZGVzdCwgZG1hX3NyYzsKIAlkbWFfY29va2llX3QgY29va2llOwotCWludCBjcHU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWRtYV9zcmMgPSBkbWFfbWFwX3BhZ2UoZGV2LT5kZXYsIHNyY19wZywgc3JjX29mZiwgbGVuLCBETUFfVE9fREVWSUNFKTsKQEAgLTk3MywxMCArOTYzLDEwIEBACiAJdHgtPmNhbGxiYWNrID0gTlVMTDsKIAljb29raWUgPSB0eC0+dHhfc3VibWl0KHR4KTsKIAotCWNwdSA9IGdldF9jcHUoKTsKLQlwZXJfY3B1X3B0cihjaGFuLT5sb2NhbCwgY3B1KS0+Ynl0ZXNfdHJhbnNmZXJyZWQgKz0gbGVuOwotCXBlcl9jcHVfcHRyKGNoYW4tPmxvY2FsLCBjcHUpLT5tZW1jcHlfY291bnQrKzsKLQlwdXRfY3B1KCk7CisJcHJlZW1wdF9kaXNhYmxlKCk7CisJX190aGlzX2NwdV9hZGQoY2hhbi0+bG9jYWwtPmJ5dGVzX3RyYW5zZmVycmVkLCBsZW4pOworCV9fdGhpc19jcHVfaW5jKGNoYW4tPmxvY2FsLT5tZW1jcHlfY291bnQpOworCXByZWVtcHRfZW5hYmxlKCk7CiAKIAlyZXR1cm4gY29va2llOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJld2lyZS9vaGNpLmMgYi9kcml2ZXJzL2ZpcmV3aXJlL29oY2kuYwppbmRleCBhZTQ1NTZmLi45Njc2OGUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZpcmV3aXJlL29oY2kuYworKysgYi9kcml2ZXJzL2ZpcmV3aXJlL29oY2kuYwpAQCAtMjIxOCw2ICsyMjE4LDEzIEBACiAJcGFnZSAgICAgPSBwYXlsb2FkID4+IFBBR0VfU0hJRlQ7CiAJb2Zmc2V0ICAgPSBwYXlsb2FkICYgflBBR0VfTUFTSzsKIAlyZXN0ICAgICA9IHAtPnBheWxvYWRfbGVuZ3RoOworCS8qCisJICogVGhlIGNvbnRyb2xsZXJzIEkndmUgdGVzdGVkIGhhdmUgbm90IHdvcmtlZCBjb3JyZWN0bHkgd2hlbgorCSAqIHNlY29uZF9yZXFfY291bnQgaXMgemVyby4gIFJhdGhlciB0aGFuIGRvIHNvbWV0aGluZyB3ZSBrbm93IHdvbid0CisJICogd29yaywgcmV0dXJuIGFuIGVycm9yCisJICovCisJaWYgKHJlc3QgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBGSVhNRTogbWFrZSBwYWNrZXQtcGVyLWJ1ZmZlci9kdWFsLWJ1ZmZlciBhIGNvbnRleHQgb3B0aW9uICovCiAJd2hpbGUgKHJlc3QgPiAwKSB7CkBAIC0yMjcxLDcgKzIyNzgsNyBAQAogCQkJCQl1bnNpZ25lZCBsb25nIHBheWxvYWQpCiB7CiAJc3RydWN0IGlzb19jb250ZXh0ICpjdHggPSBjb250YWluZXJfb2YoYmFzZSwgc3RydWN0IGlzb19jb250ZXh0LCBiYXNlKTsKLQlzdHJ1Y3QgZGVzY3JpcHRvciAqZCA9IE5VTEwsICpwZCA9IE5VTEw7CisJc3RydWN0IGRlc2NyaXB0b3IgKmQsICpwZDsKIAlzdHJ1Y3QgZndfaXNvX3BhY2tldCAqcCA9IHBhY2tldDsKIAlkbWFfYWRkcl90IGRfYnVzLCBwYWdlX2J1czsKIAl1MzIgeiwgaGVhZGVyX3osIHJlc3Q7CkBAIC0yMzA5LDggKzIzMTYsOSBAQAogCQlkLT5kYXRhX2FkZHJlc3MgPSBjcHVfdG9fbGUzMihkX2J1cyArICh6ICogc2l6ZW9mKCpkKSkpOwogCiAJCXJlc3QgPSBwYXlsb2FkX3Blcl9idWZmZXI7CisJCXBkID0gZDsKIAkJZm9yIChqID0gMTsgaiA8IHo7IGorKykgewotCQkJcGQgPSBkICsgajsKKwkJCXBkKys7CiAJCQlwZC0+Y29udHJvbCA9IGNwdV90b19sZTE2KERFU0NSSVBUT1JfU1RBVFVTIHwKIAkJCQkJCSAgREVTQ1JJUFRPUl9JTlBVVF9NT1JFKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9kZWxsX3JidS5jIGIvZHJpdmVycy9maXJtd2FyZS9kZWxsX3JidS5jCmluZGV4IGI0NzA0ZTEuLmIzYTBjZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZGVsbF9yYnUuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2RlbGxfcmJ1LmMKQEAgLTU0NCw5ICs1NDQsMTIgQEAKIHsKIAlyYnVfZGF0YS5lbnRyeV9jcmVhdGVkID0gMDsKIAotCWlmICghZncgfHwgIWZ3LT5zaXplKQorCWlmICghZncpCiAJCXJldHVybjsKIAorCWlmICghZnctPnNpemUpCisJCWdvdG8gb3V0OworCiAJc3Bpbl9sb2NrKCZyYnVfZGF0YS5sb2NrKTsKIAlpZiAoIXN0cmNtcChpbWFnZV90eXBlLCAibW9ubyIpKSB7CiAJCWlmICghaW1nX3VwZGF0ZV9yZWFsbG9jKGZ3LT5zaXplKSkKQEAgLTU2OCw2ICs1NzEsOCBAQAogCX0gZWxzZQogCQlwcl9kZWJ1ZygiaW52YWxpZCBpbWFnZSB0eXBlIHNwZWNpZmllZC5cbiIpOwogCXNwaW5fdW5sb2NrKCZyYnVfZGF0YS5sb2NrKTsKKyBvdXQ6CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHJlYWRfcmJ1X2ltYWdlX3R5cGUoc3RydWN0IGtvYmplY3QgKmtvYmosCkBAIC02MTUsNyArNjIwLDcgQEAKIAkJCXNwaW5fdW5sb2NrKCZyYnVfZGF0YS5sb2NrKTsKIAkJCXJlcV9maXJtX3JjID0gcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQoVEhJU19NT0RVTEUsCiAJCQkJRldfQUNUSU9OX05PSE9UUExVRywgImRlbGxfcmJ1IiwKLQkJCQkmcmJ1X2RldmljZS0+ZGV2LCAmY29udGV4dCwKKwkJCQkmcmJ1X2RldmljZS0+ZGV2LCBHRlBfS0VSTkVMLCAmY29udGV4dCwKIAkJCQljYWxsYmFja2ZuX3JidSk7CiAJCQlpZiAocmVxX2Zpcm1fcmMpIHsKIAkJCQlwcmludGsoS0VSTl9FUlIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9hZHA1NTIwLWdwaW8uYyBiL2RyaXZlcnMvZ3Bpby9hZHA1NTIwLWdwaW8uYwppbmRleCBhZDA1YmJjLi4wZjkzMTA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vYWRwNTUyMC1ncGlvLmMKKysrIGIvZHJpdmVycy9ncGlvL2FkcDU1MjAtZ3Bpby5jCkBAIC0zNCw5ICszNCw5IEBACiAJICovCiAKIAlpZiAodGVzdF9iaXQob2ZmLCAmZGV2LT5vdXRwdXQpKQotCQlhZHA1NTIwX3JlYWQoZGV2LT5tYXN0ZXIsIEdQSU9fT1VULCAmcmVnX3ZhbCk7CisJCWFkcDU1MjBfcmVhZChkZXYtPm1hc3RlciwgQURQNTUyMF9HUElPX09VVCwgJnJlZ192YWwpOwogCWVsc2UKLQkJYWRwNTUyMF9yZWFkKGRldi0+bWFzdGVyLCBHUElPX0lOLCAmcmVnX3ZhbCk7CisJCWFkcDU1MjBfcmVhZChkZXYtPm1hc3RlciwgQURQNTUyMF9HUElPX0lOLCAmcmVnX3ZhbCk7CiAKIAlyZXR1cm4gISEocmVnX3ZhbCAmIGRldi0+bHV0W29mZl0pOwogfQpAQCAtNDgsOSArNDgsOSBAQAogCWRldiA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgYWRwNTUyMF9ncGlvLCBncGlvX2NoaXApOwogCiAJaWYgKHZhbCkKLQkJYWRwNTUyMF9zZXRfYml0cyhkZXYtPm1hc3RlciwgR1BJT19PVVQsIGRldi0+bHV0W29mZl0pOworCQlhZHA1NTIwX3NldF9iaXRzKGRldi0+bWFzdGVyLCBBRFA1NTIwX0dQSU9fT1VULCBkZXYtPmx1dFtvZmZdKTsKIAllbHNlCi0JCWFkcDU1MjBfY2xyX2JpdHMoZGV2LT5tYXN0ZXIsIEdQSU9fT1VULCBkZXYtPmx1dFtvZmZdKTsKKwkJYWRwNTUyMF9jbHJfYml0cyhkZXYtPm1hc3RlciwgQURQNTUyMF9HUElPX09VVCwgZGV2LT5sdXRbb2ZmXSk7CiB9CiAKIHN0YXRpYyBpbnQgYWRwNTUyMF9ncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmYpCkBAIC02MCw3ICs2MCw4IEBACiAKIAljbGVhcl9iaXQob2ZmLCAmZGV2LT5vdXRwdXQpOwogCi0JcmV0dXJuIGFkcDU1MjBfY2xyX2JpdHMoZGV2LT5tYXN0ZXIsIEdQSU9fQ0ZHXzIsIGRldi0+bHV0W29mZl0pOworCXJldHVybiBhZHA1NTIwX2Nscl9iaXRzKGRldi0+bWFzdGVyLCBBRFA1NTIwX0dQSU9fQ0ZHXzIsCisJCQkJZGV2LT5sdXRbb2ZmXSk7CiB9CiAKIHN0YXRpYyBpbnQgYWRwNTUyMF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKQEAgLTczLDE4ICs3NCwyMSBAQAogCXNldF9iaXQob2ZmLCAmZGV2LT5vdXRwdXQpOwogCiAJaWYgKHZhbCkKLQkJcmV0IHw9IGFkcDU1MjBfc2V0X2JpdHMoZGV2LT5tYXN0ZXIsIEdQSU9fT1VULCBkZXYtPmx1dFtvZmZdKTsKKwkJcmV0IHw9IGFkcDU1MjBfc2V0X2JpdHMoZGV2LT5tYXN0ZXIsIEFEUDU1MjBfR1BJT19PVVQsCisJCQkJCWRldi0+bHV0W29mZl0pOwogCWVsc2UKLQkJcmV0IHw9IGFkcDU1MjBfY2xyX2JpdHMoZGV2LT5tYXN0ZXIsIEdQSU9fT1VULCBkZXYtPmx1dFtvZmZdKTsKKwkJcmV0IHw9IGFkcDU1MjBfY2xyX2JpdHMoZGV2LT5tYXN0ZXIsIEFEUDU1MjBfR1BJT19PVVQsCisJCQkJCWRldi0+bHV0W29mZl0pOwogCi0JcmV0IHw9IGFkcDU1MjBfc2V0X2JpdHMoZGV2LT5tYXN0ZXIsIEdQSU9fQ0ZHXzIsIGRldi0+bHV0W29mZl0pOworCXJldCB8PSBhZHA1NTIwX3NldF9iaXRzKGRldi0+bWFzdGVyLCBBRFA1NTIwX0dQSU9fQ0ZHXzIsCisJCQkJCWRldi0+bHV0W29mZl0pOwogCiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgYWRwNTUyMF9ncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IGFkcDU1MjBfZ3Bpb19wbGF0ZnJvbV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBhZHA1NTIwX2dwaW9fcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgYWRwNTUyMF9ncGlvICpkZXY7CiAJc3RydWN0IGdwaW9fY2hpcCAqZ2M7CiAJaW50IHJldCwgaSwgZ3Bpb3M7CkBAIC0xMjksMjAgKzEzMywyMCBAQAogCWdjLT5sYWJlbCA9IHBkZXYtPm5hbWU7CiAJZ2MtPm93bmVyID0gVEhJU19NT0RVTEU7CiAKLQlyZXQgPSBhZHA1NTIwX2Nscl9iaXRzKGRldi0+bWFzdGVyLCBHUElPX0NGR18xLAorCXJldCA9IGFkcDU1MjBfY2xyX2JpdHMoZGV2LT5tYXN0ZXIsIEFEUDU1MjBfR1BJT19DRkdfMSwKIAkJcGRhdGEtPmdwaW9fZW5fbWFzayk7CiAKLQlpZiAocGRhdGEtPmdwaW9fZW5fbWFzayAmIEdQSU9fQzMpCi0JCWN0bF9tYXNrIHw9IEMzX01PREU7CisJaWYgKHBkYXRhLT5ncGlvX2VuX21hc2sgJiBBRFA1NTIwX0dQSU9fQzMpCisJCWN0bF9tYXNrIHw9IEFEUDU1MjBfQzNfTU9ERTsKIAotCWlmIChwZGF0YS0+Z3Bpb19lbl9tYXNrICYgR1BJT19SMykKLQkJY3RsX21hc2sgfD0gUjNfTU9ERTsKKwlpZiAocGRhdGEtPmdwaW9fZW5fbWFzayAmIEFEUDU1MjBfR1BJT19SMykKKwkJY3RsX21hc2sgfD0gQURQNTUyMF9SM19NT0RFOwogCiAJaWYgKGN0bF9tYXNrKQotCQlyZXQgPSBhZHA1NTIwX3NldF9iaXRzKGRldi0+bWFzdGVyLCBMRURfQ09OVFJPTCwKKwkJcmV0ID0gYWRwNTUyMF9zZXRfYml0cyhkZXYtPm1hc3RlciwgQURQNTUyMF9MRURfQ09OVFJPTCwKIAkJCWN0bF9tYXNrKTsKIAotCXJldCB8PSBhZHA1NTIwX3NldF9iaXRzKGRldi0+bWFzdGVyLCBHUElPX1BVTExVUCwKKwlyZXQgfD0gYWRwNTUyMF9zZXRfYml0cyhkZXYtPm1hc3RlciwgQURQNTUyMF9HUElPX1BVTExVUCwKIAkJcGRhdGEtPmdwaW9fcHVsbHVwX21hc2spOwogCiAJaWYgKHJldCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL3R3bDQwMzAtZ3Bpby5jIGIvZHJpdmVycy9ncGlvL3R3bDQwMzAtZ3Bpby5jCmluZGV4IDQ5Mzg0YTcuLjdmZTg4MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby90d2w0MDMwLWdwaW8uYworKysgYi9kcml2ZXJzL2dwaW8vdHdsNDAzMC1ncGlvLmMKQEAgLTM0LDcgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKLSNpbmNsdWRlIDxsaW51eC9pMmMvdHdsNDAzMC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy90d2wuaD4KIAogCiAvKgpAQCAtODAsNyArODAsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIGludCBncGlvX3R3bDQwMzBfd3JpdGUodTggYWRkcmVzcywgdTggZGF0YSkKIHsKLQlyZXR1cm4gdHdsNDAzMF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfR1BJTywgZGF0YSwgYWRkcmVzcyk7CisJcmV0dXJuIHR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfR1BJTywgZGF0YSwgYWRkcmVzcyk7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0xMTcsNyArMTE3LDcgQEAKIAl1OCBkYXRhOwogCWludCByZXQgPSAwOwogCi0JcmV0ID0gdHdsNDAzMF9pMmNfcmVhZF91OChUV0w0MDMwX01PRFVMRV9HUElPLCAmZGF0YSwgYWRkcmVzcyk7CisJcmV0ID0gdHdsX2kyY19yZWFkX3U4KFRXTDQwMzBfTU9EVUxFX0dQSU8sICZkYXRhLCBhZGRyZXNzKTsKIAlyZXR1cm4gKHJldCA8IDApID8gcmV0IDogZGF0YTsKIH0KIApAQCAtMTQyLDcgKzE0Miw3IEBACiAJCWNhY2hlZF9sZWRlbiAmPSB+bWFzazsKIAllbHNlCiAJCWNhY2hlZF9sZWRlbiB8PSBtYXNrOwotCXN0YXR1cyA9IHR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX0xFRCwgY2FjaGVkX2xlZGVuLAorCXN0YXR1cyA9IHR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfTEVELCBjYWNoZWRfbGVkZW4sCiAJCQlUV0w0MDMwX0xFRF9MRURFTik7CiAJbXV0ZXhfdW5sb2NrKCZncGlvX2xvY2spOwogfQpAQCAtMjIzLDIzICsyMjMsMjMgQEAKIAkJfQogCiAJCS8qIGluaXRpYWxpemUgUFdNIHRvIGFsd2F5cy1kcml2ZSAqLwotCQlzdGF0dXMgPSB0d2w0MDMwX2kyY193cml0ZV91OChtb2R1bGUsIDB4N2YsCisJCXN0YXR1cyA9IHR3bF9pMmNfd3JpdGVfdTgobW9kdWxlLCAweDdmLAogCQkJCVRXTDQwMzBfUFdNeF9QV014T0ZGKTsKIAkJaWYgKHN0YXR1cyA8IDApCiAJCQlnb3RvIGRvbmU7Ci0JCXN0YXR1cyA9IHR3bDQwMzBfaTJjX3dyaXRlX3U4KG1vZHVsZSwgMHg3ZiwKKwkJc3RhdHVzID0gdHdsX2kyY193cml0ZV91OChtb2R1bGUsIDB4N2YsCiAJCQkJVFdMNDAzMF9QV014X1BXTXhPTik7CiAJCWlmIChzdGF0dXMgPCAwKQogCQkJZ290byBkb25lOwogCiAJCS8qIGluaXQgTEVEIHRvIG5vdC1kcml2ZW4gKGhpZ2gpICovCiAJCW1vZHVsZSA9IFRXTDQwMzBfTU9EVUxFX0xFRDsKLQkJc3RhdHVzID0gdHdsNDAzMF9pMmNfcmVhZF91OChtb2R1bGUsICZjYWNoZWRfbGVkZW4sCisJCXN0YXR1cyA9IHR3bF9pMmNfcmVhZF91OChtb2R1bGUsICZjYWNoZWRfbGVkZW4sCiAJCQkJVFdMNDAzMF9MRURfTEVERU4pOwogCQlpZiAoc3RhdHVzIDwgMCkKIAkJCWdvdG8gZG9uZTsKIAkJY2FjaGVkX2xlZGVuICY9IH5sZWRjbHJfbWFzazsKLQkJc3RhdHVzID0gdHdsNDAzMF9pMmNfd3JpdGVfdTgobW9kdWxlLCBjYWNoZWRfbGVkZW4sCisJCXN0YXR1cyA9IHR3bF9pMmNfd3JpdGVfdTgobW9kdWxlLCBjYWNoZWRfbGVkZW4sCiAJCQkJVFdMNDAzMF9MRURfTEVERU4pOwogCQlpZiAoc3RhdHVzIDwgMCkKIAkJCWdvdG8gZG9uZTsKQEAgLTM3MCw3ICszNzAsNyBAQAogCQltZXNzYWdlW2ldID0gYml0X21hc2s7CiAJfQogCi0JcmV0dXJuIHR3bDQwMzBfaTJjX3dyaXRlKFRXTDQwMzBfTU9EVUxFX0dQSU8sIG1lc3NhZ2UsCisJcmV0dXJuIHR3bF9pMmNfd3JpdGUoVFdMNDAzMF9NT0RVTEVfR1BJTywgbWVzc2FnZSwKIAkJCQlSRUdfR1BJT1BVUERDVFIxLCA1KTsKIH0KIApAQCAtMzg3LDcgKzM4Nyw3IEBACiAJZGVib3VuY2UgPj49IDg7CiAJbWVzc2FnZVszXSA9IChkZWJvdW5jZSAmIDB4MDMpOwogCi0JcmV0dXJuIHR3bDQwMzBfaTJjX3dyaXRlKFRXTDQwMzBfTU9EVUxFX0dQSU8sIG1lc3NhZ2UsCisJcmV0dXJuIHR3bF9pMmNfd3JpdGUoVFdMNDAzMF9NT0RVTEVfR1BJTywgbWVzc2FnZSwKIAkJCQlSRUdfR1BJT19ERUJFTjEsIDMpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vd204MzF4LWdwaW8uYyBiL2RyaXZlcnMvZ3Bpby93bTgzMXgtZ3Bpby5jCmluZGV4IGY5YzA5YTUuLmI0NDY4YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby93bTgzMXgtZ3Bpby5jCisrKyBiL2RyaXZlcnMvZ3Bpby93bTgzMXgtZ3Bpby5jCkBAIC0yMiw4ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbWZkL3dtODMxeC9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3dtODMxeC9wZGF0YS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzMXgvZ3Bpby5oPgotCi0jZGVmaW5lIFdNODMxWF9HUElPX01BWCAxNgorI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzMXgvaXJxLmg+CiAKIHN0cnVjdCB3bTgzMXhfZ3BpbyB7CiAJc3RydWN0IHdtODMxeCAqd204MzF4OwpAQCAtODAsNiArNzksMTcgQEAKIAkJCXZhbHVlIDw8IG9mZnNldCk7CiB9CiAKK3N0YXRpYyBpbnQgd204MzF4X2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3Qgd204MzF4X2dwaW8gKndtODMxeF9ncGlvID0gdG9fd204MzF4X2dwaW8oY2hpcCk7CisJc3RydWN0IHdtODMxeCAqd204MzF4ID0gd204MzF4X2dwaW8tPndtODMxeDsKKworCWlmICghd204MzF4LT5pcnFfYmFzZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gd204MzF4LT5pcnFfYmFzZSArIFdNODMxWF9JUlFfR1BJT18xICsgb2Zmc2V0OworfQorCiAjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCiBzdGF0aWMgdm9pZCB3bTgzMXhfZ3Bpb19kYmdfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHN0cnVjdCBncGlvX2NoaXAgKmNoaXApCiB7CkBAIC0xNzUsNiArMTg1LDcgQEAKIAkuZ2V0CQkJPSB3bTgzMXhfZ3Bpb19nZXQsCiAJLmRpcmVjdGlvbl9vdXRwdXQJPSB3bTgzMXhfZ3Bpb19kaXJlY3Rpb25fb3V0LAogCS5zZXQJCQk9IHdtODMxeF9ncGlvX3NldCwKKwkudG9faXJxCQkJPSB3bTgzMXhfZ3Bpb190b19pcnEsCiAJLmRiZ19zaG93CQk9IHdtODMxeF9ncGlvX2RiZ19zaG93LAogCS5jYW5fc2xlZXAJCT0gMSwKIH07CkBAIC0xOTIsNyArMjAzLDcgQEAKIAogCXdtODMxeF9ncGlvLT53bTgzMXggPSB3bTgzMXg7CiAJd204MzF4X2dwaW8tPmdwaW9fY2hpcCA9IHRlbXBsYXRlX2NoaXA7Ci0Jd204MzF4X2dwaW8tPmdwaW9fY2hpcC5uZ3BpbyA9IFdNODMxWF9HUElPX01BWDsKKwl3bTgzMXhfZ3Bpby0+Z3Bpb19jaGlwLm5ncGlvID0gd204MzF4LT5udW1fZ3BpbzsKIAl3bTgzMXhfZ3Bpby0+Z3Bpb19jaGlwLmRldiA9ICZwZGV2LT5kZXY7CiAJaWYgKHBkYXRhICYmIHBkYXRhLT5ncGlvX2Jhc2UpCiAJCXdtODMxeF9ncGlvLT5ncGlvX2NoaXAuYmFzZSA9IHBkYXRhLT5ncGlvX2Jhc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vTWFrZWZpbGUKaW5kZXggOTE1NjdhYy4uNDcwZWY2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZQpAQCAtMzEsMyArMzEsNSBAQAogb2JqLSQoQ09ORklHX0RSTV9TSVMpICAgKz0gc2lzLwogb2JqLSQoQ09ORklHX0RSTV9TQVZBR0UpKz0gc2F2YWdlLwogb2JqLSQoQ09ORklHX0RSTV9WSUEpCSs9dmlhLworb2JqLSQoQ09ORklHX0RSTV9OT1VWRUFVKSArPW5vdXZlYXUvCitvYmoteQkJCSs9IGkyYy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pMmMvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vaTJjL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMmFiYWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTJjL01ha2VmaWxlCkBAIC0wLDAgKzEsNCBAQAorY2NmbGFncy15IDo9IC1JaW5jbHVkZS9kcm0KKworY2g3MDA2LXkgOj0gY2g3MDA2X2Rydi5vIGNoNzAwNl9tb2RlLm8KK29iai0kKENPTkZJR19EUk1fSTJDX0NINzAwNikgKz0gY2g3MDA2Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pMmMvY2g3MDA2X2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2kyYy9jaDcwMDZfZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQyMmE3NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pMmMvY2g3MDA2X2Rydi5jCkBAIC0wLDAgKzEsNTMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEZyYW5jaXNjbyBKZXJlei4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlICJjaDcwMDZfcHJpdi5oIgorCisvKiBEUk0gZW5jb2RlciBmdW5jdGlvbnMgKi8KKworc3RhdGljIHZvaWQgY2g3MDA2X2VuY29kZXJfc2V0X2NvbmZpZyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJICAgICAgdm9pZCAqcGFyYW1zKQoreworCXN0cnVjdCBjaDcwMDZfcHJpdiAqcHJpdiA9IHRvX2NoNzAwNl9wcml2KGVuY29kZXIpOworCisJcHJpdi0+cGFyYW1zID0gcGFyYW1zOworfQorCitzdGF0aWMgdm9pZCBjaDcwMDZfZW5jb2Rlcl9kZXN0cm95KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgY2g3MDA2X3ByaXYgKnByaXYgPSB0b19jaDcwMDZfcHJpdihlbmNvZGVyKTsKKworCWRybV9wcm9wZXJ0eV9kZXN0cm95KGVuY29kZXItPmRldiwgcHJpdi0+c2NhbGVfcHJvcGVydHkpOworCisJa2ZyZWUocHJpdik7CisJdG9fZW5jb2Rlcl9zbGF2ZShlbmNvZGVyKS0+c2xhdmVfcHJpdiA9IE5VTEw7CisKKwlkcm1faTJjX2VuY29kZXJfZGVzdHJveShlbmNvZGVyKTsKK30KKworc3RhdGljIHZvaWQgIGNoNzAwNl9lbmNvZGVyX2RwbXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZHJtX2kyY19lbmNvZGVyX2dldF9jbGllbnQoZW5jb2Rlcik7CisJc3RydWN0IGNoNzAwNl9wcml2ICpwcml2ID0gdG9fY2g3MDA2X3ByaXYoZW5jb2Rlcik7CisJc3RydWN0IGNoNzAwNl9zdGF0ZSAqc3RhdGUgPSAmcHJpdi0+c3RhdGU7CisKKwljaDcwMDZfZGJnKGNsaWVudCwgIlxuIik7CisKKwlpZiAobW9kZSA9PSBwcml2LT5sYXN0X2RwbXMpCisJCXJldHVybjsKKwlwcml2LT5sYXN0X2RwbXMgPSBtb2RlOworCisJY2g3MDA2X3NldHVwX3Bvd2VyX3N0YXRlKGVuY29kZXIpOworCisJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9QT1dFUik7Cit9CisKK3N0YXRpYyB2b2lkIGNoNzAwNl9lbmNvZGVyX3NhdmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkcm1faTJjX2VuY29kZXJfZ2V0X2NsaWVudChlbmNvZGVyKTsKKwlzdHJ1Y3QgY2g3MDA2X3ByaXYgKnByaXYgPSB0b19jaDcwMDZfcHJpdihlbmNvZGVyKTsKKworCWNoNzAwNl9kYmcoY2xpZW50LCAiXG4iKTsKKworCWNoNzAwNl9zdGF0ZV9zYXZlKGNsaWVudCwgJnByaXYtPnNhdmVkX3N0YXRlKTsKK30KKworc3RhdGljIHZvaWQgY2g3MDA2X2VuY29kZXJfcmVzdG9yZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRybV9pMmNfZW5jb2Rlcl9nZXRfY2xpZW50KGVuY29kZXIpOworCXN0cnVjdCBjaDcwMDZfcHJpdiAqcHJpdiA9IHRvX2NoNzAwNl9wcml2KGVuY29kZXIpOworCisJY2g3MDA2X2RiZyhjbGllbnQsICJcbiIpOworCisJY2g3MDA2X3N0YXRlX2xvYWQoY2xpZW50LCAmcHJpdi0+c2F2ZWRfc3RhdGUpOworfQorCitzdGF0aWMgYm9vbCBjaDcwMDZfZW5jb2Rlcl9tb2RlX2ZpeHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCQkgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCQkgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwlzdHJ1Y3QgY2g3MDA2X3ByaXYgKnByaXYgPSB0b19jaDcwMDZfcHJpdihlbmNvZGVyKTsKKworCS8qIFRoZSBjaDcwMDYgaXMgcGFpbmZ1bGx5IHBpY2t5IHdpdGggdGhlIGlucHV0IHRpbWluZ3Mgc28gbm8KKwkgKiBjdXN0b20gbW9kZXMgZm9yIG5vdy4uLiAqLworCisJcHJpdi0+bW9kZSA9IGNoNzAwNl9sb29rdXBfbW9kZShlbmNvZGVyLCBtb2RlKTsKKworCXJldHVybiAhIXByaXYtPm1vZGU7Cit9CisKK3N0YXRpYyBpbnQgY2g3MDA2X2VuY29kZXJfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwlpZiAoY2g3MDA2X2xvb2t1cF9tb2RlKGVuY29kZXIsIG1vZGUpKQorCQlyZXR1cm4gTU9ERV9PSzsKKwllbHNlCisJCXJldHVybiBNT0RFX0JBRDsKK30KKworc3RhdGljIHZvaWQgY2g3MDA2X2VuY29kZXJfbW9kZV9zZXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJCSAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmRybV9tb2RlLAorCQkJCSAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRybV9pMmNfZW5jb2Rlcl9nZXRfY2xpZW50KGVuY29kZXIpOworCXN0cnVjdCBjaDcwMDZfcHJpdiAqcHJpdiA9IHRvX2NoNzAwNl9wcml2KGVuY29kZXIpOworCXN0cnVjdCBjaDcwMDZfZW5jb2Rlcl9wYXJhbXMgKnBhcmFtcyA9IHByaXYtPnBhcmFtczsKKwlzdHJ1Y3QgY2g3MDA2X3N0YXRlICpzdGF0ZSA9ICZwcml2LT5zdGF0ZTsKKwl1aW50OF90ICpyZWdzID0gc3RhdGUtPnJlZ3M7CisJc3RydWN0IGNoNzAwNl9tb2RlICptb2RlID0gcHJpdi0+bW9kZTsKKwlzdHJ1Y3QgY2g3MDA2X3R2X25vcm1faW5mbyAqbm9ybSA9ICZjaDcwMDZfdHZfbm9ybXNbcHJpdi0+bm9ybV07CisJaW50IHN0YXJ0X2FjdGl2ZTsKKworCWNoNzAwNl9kYmcoY2xpZW50LCAiXG4iKTsKKworCXJlZ3NbQ0g3MDA2X0RJU1BNT0RFXSA9IG5vcm0tPmRpc3Btb2RlIHwgbW9kZS0+ZGlzcG1vZGU7CisJcmVnc1tDSDcwMDZfQldJRFRIXSA9IDA7CisJcmVnc1tDSDcwMDZfSU5QVVRfRk9STUFUXSA9IGJpdGYoQ0g3MDA2X0lOUFVUX0ZPUk1BVF9GT1JNQVQsCisJCQkJCSBwYXJhbXMtPmlucHV0X2Zvcm1hdCk7CisKKwlyZWdzW0NINzAwNl9DTEtNT0RFXSA9IENINzAwNl9DTEtNT0RFX1NVQkNfTE9DSworCQl8IGJpdGYoQ0g3MDA2X0NMS01PREVfWENNLCBwYXJhbXMtPnhjbSkKKwkJfCBiaXRmKENINzAwNl9DTEtNT0RFX1BDTSwgcGFyYW1zLT5wY20pOworCWlmIChwYXJhbXMtPmNsb2NrX21vZGUpCisJCXJlZ3NbQ0g3MDA2X0NMS01PREVdIHw9IENINzAwNl9DTEtNT0RFX01BU1RFUjsKKwlpZiAocGFyYW1zLT5jbG9ja19lZGdlKQorCQlyZWdzW0NINzAwNl9DTEtNT0RFXSB8PSBDSDcwMDZfQ0xLTU9ERV9QT1NfRURHRTsKKworCXN0YXJ0X2FjdGl2ZSA9IChkcm1fbW9kZS0+aHRvdGFsICYgfjB4NykgLSAoZHJtX21vZGUtPmhzeW5jX3N0YXJ0ICYgfjB4Nyk7CisJcmVnc1tDSDcwMDZfUE9WXSA9IGJpdGYoQ0g3MDA2X1BPVl9TVEFSVF9BQ1RJVkVfOCwgc3RhcnRfYWN0aXZlKTsKKwlyZWdzW0NINzAwNl9TVEFSVF9BQ1RJVkVdID0gYml0ZihDSDcwMDZfU1RBUlRfQUNUSVZFXzAsIHN0YXJ0X2FjdGl2ZSk7CisKKwlyZWdzW0NINzAwNl9JTlBVVF9TWU5DXSA9IDA7CisJaWYgKHBhcmFtcy0+c3luY19kaXJlY3Rpb24pCisJCXJlZ3NbQ0g3MDA2X0lOUFVUX1NZTkNdIHw9IENINzAwNl9JTlBVVF9TWU5DX09VVFBVVDsKKwlpZiAocGFyYW1zLT5zeW5jX2VuY29kaW5nKQorCQlyZWdzW0NINzAwNl9JTlBVVF9TWU5DXSB8PSBDSDcwMDZfSU5QVVRfU1lOQ19FTUJFRERFRDsKKwlpZiAoZHJtX21vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19QVlNZTkMpCisJCXJlZ3NbQ0g3MDA2X0lOUFVUX1NZTkNdIHw9IENINzAwNl9JTlBVVF9TWU5DX1BWU1lOQzsKKwlpZiAoZHJtX21vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19QSFNZTkMpCisJCXJlZ3NbQ0g3MDA2X0lOUFVUX1NZTkNdIHw9IENINzAwNl9JTlBVVF9TWU5DX1BIU1lOQzsKKworCXJlZ3NbQ0g3MDA2X0RFVEVDVF0gPSAwOworCXJlZ3NbQ0g3MDA2X0JDTEtPVVRdID0gMDsKKworCXJlZ3NbQ0g3MDA2X1NVQkNfSU5DM10gPSAwOworCWlmIChwYXJhbXMtPnBvdXRfbGV2ZWwpCisJCXJlZ3NbQ0g3MDA2X1NVQkNfSU5DM10gfD0gQ0g3MDA2X1NVQkNfSU5DM19QT1VUXzNfM1Y7CisKKwlyZWdzW0NINzAwNl9TVUJDX0lOQzRdID0gMDsKKwlpZiAocGFyYW1zLT5hY3RpdmVfZGV0ZWN0KQorCQlyZWdzW0NINzAwNl9TVUJDX0lOQzRdIHw9IENINzAwNl9TVUJDX0lOQzRfRFNfSU5QVVQ7CisKKwlyZWdzW0NINzAwNl9QTExfQ09OVFJPTF0gPSBwcml2LT5zYXZlZF9zdGF0ZS5yZWdzW0NINzAwNl9QTExfQ09OVFJPTF07CisKKwljaDcwMDZfc2V0dXBfbGV2ZWxzKGVuY29kZXIpOworCWNoNzAwNl9zZXR1cF9zdWJjYXJyaWVyKGVuY29kZXIpOworCWNoNzAwNl9zZXR1cF9wbGwoZW5jb2Rlcik7CisJY2g3MDA2X3NldHVwX3Bvd2VyX3N0YXRlKGVuY29kZXIpOworCWNoNzAwNl9zZXR1cF9wcm9wZXJ0aWVzKGVuY29kZXIpOworCisJY2g3MDA2X3N0YXRlX2xvYWQoY2xpZW50LCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIGNoNzAwNl9lbmNvZGVyX2RldGVjdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJCQkgICAgICAgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZHJtX2kyY19lbmNvZGVyX2dldF9jbGllbnQoZW5jb2Rlcik7CisJc3RydWN0IGNoNzAwNl9wcml2ICpwcml2ID0gdG9fY2g3MDA2X3ByaXYoZW5jb2Rlcik7CisJc3RydWN0IGNoNzAwNl9zdGF0ZSAqc3RhdGUgPSAmcHJpdi0+c3RhdGU7CisJaW50IGRldDsKKworCWNoNzAwNl9kYmcoY2xpZW50LCAiXG4iKTsKKworCWNoNzAwNl9zYXZlX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfREVURUNUKTsKKwljaDcwMDZfc2F2ZV9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X1BPV0VSKTsKKwljaDcwMDZfc2F2ZV9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0NMS01PREUpOworCisJY2g3MDA2X3dyaXRlKGNsaWVudCwgQ0g3MDA2X1BPV0VSLCBDSDcwMDZfUE9XRVJfUkVTRVQgfAorCQkJCQkgICBiaXRmcyhDSDcwMDZfUE9XRVJfTEVWRUwsIE5PUk1BTCkpOworCWNoNzAwNl93cml0ZShjbGllbnQsIENINzAwNl9DTEtNT0RFLCBDSDcwMDZfQ0xLTU9ERV9NQVNURVIpOworCisJY2g3MDA2X3dyaXRlKGNsaWVudCwgQ0g3MDA2X0RFVEVDVCwgQ0g3MDA2X0RFVEVDVF9TRU5TRSk7CisKKwljaDcwMDZfd3JpdGUoY2xpZW50LCBDSDcwMDZfREVURUNULCAwKTsKKworCWRldCA9IGNoNzAwNl9yZWFkKGNsaWVudCwgQ0g3MDA2X0RFVEVDVCk7CisKKwljaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0NMS01PREUpOworCWNoNzAwNl9sb2FkX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfUE9XRVIpOworCWNoNzAwNl9sb2FkX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfREVURUNUKTsKKworCWlmICgoZGV0ICYgKENINzAwNl9ERVRFQ1RfU1ZJREVPX1lfVEVTVHwKKwkJICAgIENINzAwNl9ERVRFQ1RfU1ZJREVPX0NfVEVTVHwKKwkJICAgIENINzAwNl9ERVRFQ1RfQ1ZCU19URVNUKSkgPT0gMCkKKwkJcHJpdi0+c3ViY29ubmVjdG9yID0gRFJNX01PREVfU1VCQ09OTkVDVE9SX1NDQVJUOworCWVsc2UgaWYgKChkZXQgJiAoQ0g3MDA2X0RFVEVDVF9TVklERU9fWV9URVNUfAorCQkJIENINzAwNl9ERVRFQ1RfU1ZJREVPX0NfVEVTVCkpID09IDApCisJCXByaXYtPnN1YmNvbm5lY3RvciA9IERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9TVklERU87CisJZWxzZSBpZiAoKGRldCAmIENINzAwNl9ERVRFQ1RfQ1ZCU19URVNUKSA9PSAwKQorCQlwcml2LT5zdWJjb25uZWN0b3IgPSBEUk1fTU9ERV9TVUJDT05ORUNUT1JfQ29tcG9zaXRlOworCWVsc2UKKwkJcHJpdi0+c3ViY29ubmVjdG9yID0gRFJNX01PREVfU1VCQ09OTkVDVE9SX1Vua25vd247CisKKwlkcm1fY29ubmVjdG9yX3Byb3BlcnR5X3NldF92YWx1ZShjb25uZWN0b3IsCisJCQllbmNvZGVyLT5kZXYtPm1vZGVfY29uZmlnLnR2X3N1YmNvbm5lY3Rvcl9wcm9wZXJ0eSwKKwkJCQkJCQlwcml2LT5zdWJjb25uZWN0b3IpOworCisJcmV0dXJuIHByaXYtPnN1YmNvbm5lY3RvciA/IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkIDoKKwkJCQkJY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7Cit9CisKK3N0YXRpYyBpbnQgY2g3MDA2X2VuY29kZXJfZ2V0X21vZGVzKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCQkgICAgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgY2g3MDA2X3ByaXYgKnByaXYgPSB0b19jaDcwMDZfcHJpdihlbmNvZGVyKTsKKwlzdHJ1Y3QgY2g3MDA2X21vZGUgKm1vZGU7CisJaW50IG4gPSAwOworCisJZm9yIChtb2RlID0gY2g3MDA2X21vZGVzOyBtb2RlLT5tb2RlLmNsb2NrOyBtb2RlKyspIHsKKwkJaWYgKH5tb2RlLT52YWxpZF9zY2FsZXMgJiAxPDxwcml2LT5zY2FsZSB8fAorCQkgICAgfm1vZGUtPnZhbGlkX25vcm1zICYgMTw8cHJpdi0+bm9ybSkKKwkJCWNvbnRpbnVlOworCisJCWRybV9tb2RlX3Byb2JlZF9hZGQoY29ubmVjdG9yLAorCQkJCWRybV9tb2RlX2R1cGxpY2F0ZShlbmNvZGVyLT5kZXYsICZtb2RlLT5tb2RlKSk7CisKKwkJbisrOworCX0KKworCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IGNoNzAwNl9lbmNvZGVyX2NyZWF0ZV9yZXNvdXJjZXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJCQkgICBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBjaDcwMDZfcHJpdiAqcHJpdiA9IHRvX2NoNzAwNl9wcml2KGVuY29kZXIpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGRybV9tb2RlX2NvbmZpZyAqY29uZiA9ICZkZXYtPm1vZGVfY29uZmlnOworCisJZHJtX21vZGVfY3JlYXRlX3R2X3Byb3BlcnRpZXMoZGV2LCBOVU1fVFZfTk9STVMsIGNoNzAwNl90dl9ub3JtX25hbWVzKTsKKworCXByaXYtPnNjYWxlX3Byb3BlcnR5ID0gZHJtX3Byb3BlcnR5X2NyZWF0ZShkZXYsIERSTV9NT0RFX1BST1BfUkFOR0UsCisJCQkJCQkgICAic2NhbGUiLCAyKTsKKwlwcml2LT5zY2FsZV9wcm9wZXJ0eS0+dmFsdWVzWzBdID0gMDsKKwlwcml2LT5zY2FsZV9wcm9wZXJ0eS0+dmFsdWVzWzFdID0gMjsKKworCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KGNvbm5lY3RvciwgY29uZi0+dHZfc2VsZWN0X3N1YmNvbm5lY3Rvcl9wcm9wZXJ0eSwKKwkJCQkgICAgICBwcml2LT5zZWxlY3Rfc3ViY29ubmVjdG9yKTsKKwlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eShjb25uZWN0b3IsIGNvbmYtPnR2X3N1YmNvbm5lY3Rvcl9wcm9wZXJ0eSwKKwkJCQkgICAgICBwcml2LT5zdWJjb25uZWN0b3IpOworCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KGNvbm5lY3RvciwgY29uZi0+dHZfbGVmdF9tYXJnaW5fcHJvcGVydHksCisJCQkJICAgICAgcHJpdi0+aG1hcmdpbik7CisJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLCBjb25mLT50dl9ib3R0b21fbWFyZ2luX3Byb3BlcnR5LAorCQkJCSAgICAgIHByaXYtPnZtYXJnaW4pOworCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KGNvbm5lY3RvciwgY29uZi0+dHZfbW9kZV9wcm9wZXJ0eSwKKwkJCQkgICAgICBwcml2LT5ub3JtKTsKKwlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eShjb25uZWN0b3IsIGNvbmYtPnR2X2JyaWdodG5lc3NfcHJvcGVydHksCisJCQkJICAgICAgcHJpdi0+YnJpZ2h0bmVzcyk7CisJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLCBjb25mLT50dl9jb250cmFzdF9wcm9wZXJ0eSwKKwkJCQkgICAgICBwcml2LT5jb250cmFzdCk7CisJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLCBjb25mLT50dl9mbGlja2VyX3JlZHVjdGlvbl9wcm9wZXJ0eSwKKwkJCQkgICAgICBwcml2LT5mbGlja2VyKTsKKwlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eShjb25uZWN0b3IsIHByaXYtPnNjYWxlX3Byb3BlcnR5LAorCQkJCSAgICAgIHByaXYtPnNjYWxlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoNzAwNl9lbmNvZGVyX3NldF9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJICAgICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkJICAgICAgIHN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3BlcnR5LAorCQkJCSAgICAgICB1aW50NjRfdCB2YWwpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRybV9pMmNfZW5jb2Rlcl9nZXRfY2xpZW50KGVuY29kZXIpOworCXN0cnVjdCBjaDcwMDZfcHJpdiAqcHJpdiA9IHRvX2NoNzAwNl9wcml2KGVuY29kZXIpOworCXN0cnVjdCBjaDcwMDZfc3RhdGUgKnN0YXRlID0gJnByaXYtPnN0YXRlOworCXN0cnVjdCBkcm1fbW9kZV9jb25maWcgKmNvbmYgPSAmZW5jb2Rlci0+ZGV2LT5tb2RlX2NvbmZpZzsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGMgPSBlbmNvZGVyLT5jcnRjOworCWJvb2wgbW9kZXNfY2hhbmdlZCA9IGZhbHNlOworCisJY2g3MDA2X2RiZyhjbGllbnQsICJcbiIpOworCisJaWYgKHByb3BlcnR5ID09IGNvbmYtPnR2X3NlbGVjdF9zdWJjb25uZWN0b3JfcHJvcGVydHkpIHsKKwkJcHJpdi0+c2VsZWN0X3N1YmNvbm5lY3RvciA9IHZhbDsKKworCQljaDcwMDZfc2V0dXBfcG93ZXJfc3RhdGUoZW5jb2Rlcik7CisKKwkJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9QT1dFUik7CisKKwl9IGVsc2UgaWYgKHByb3BlcnR5ID09IGNvbmYtPnR2X2xlZnRfbWFyZ2luX3Byb3BlcnR5KSB7CisJCXByaXYtPmhtYXJnaW4gPSB2YWw7CisKKwkJY2g3MDA2X3NldHVwX3Byb3BlcnRpZXMoZW5jb2Rlcik7CisKKwkJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9QT1YpOworCQljaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0hQT1MpOworCisJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBjb25mLT50dl9ib3R0b21fbWFyZ2luX3Byb3BlcnR5KSB7CisJCXByaXYtPnZtYXJnaW4gPSB2YWw7CisKKwkJY2g3MDA2X3NldHVwX3Byb3BlcnRpZXMoZW5jb2Rlcik7CisKKwkJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9QT1YpOworCQljaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X1ZQT1MpOworCisJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBjb25mLT50dl9tb2RlX3Byb3BlcnR5KSB7CisJCWlmIChjb25uZWN0b3ItPmRwbXMgIT0gRFJNX01PREVfRFBNU19PRkYpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlwcml2LT5ub3JtID0gdmFsOworCisJCW1vZGVzX2NoYW5nZWQgPSB0cnVlOworCisJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBjb25mLT50dl9icmlnaHRuZXNzX3Byb3BlcnR5KSB7CisJCXByaXYtPmJyaWdodG5lc3MgPSB2YWw7CisKKwkJY2g3MDA2X3NldHVwX2xldmVscyhlbmNvZGVyKTsKKworCQljaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0JMQUNLX0xFVkVMKTsKKworCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gY29uZi0+dHZfY29udHJhc3RfcHJvcGVydHkpIHsKKwkJcHJpdi0+Y29udHJhc3QgPSB2YWw7CisKKwkJY2g3MDA2X3NldHVwX3Byb3BlcnRpZXMoZW5jb2Rlcik7CisKKwkJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9DT05UUkFTVCk7CisKKwl9IGVsc2UgaWYgKHByb3BlcnR5ID09IGNvbmYtPnR2X2ZsaWNrZXJfcmVkdWN0aW9uX3Byb3BlcnR5KSB7CisJCXByaXYtPmZsaWNrZXIgPSB2YWw7CisKKwkJY2g3MDA2X3NldHVwX3Byb3BlcnRpZXMoZW5jb2Rlcik7CisKKwkJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9GRklMVEVSKTsKKworCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gcHJpdi0+c2NhbGVfcHJvcGVydHkpIHsKKwkJaWYgKGNvbm5lY3Rvci0+ZHBtcyAhPSBEUk1fTU9ERV9EUE1TX09GRikKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXByaXYtPnNjYWxlID0gdmFsOworCisJCW1vZGVzX2NoYW5nZWQgPSB0cnVlOworCisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG1vZGVzX2NoYW5nZWQpIHsKKwkJZHJtX2hlbHBlcl9wcm9iZV9zaW5nbGVfY29ubmVjdG9yX21vZGVzKGNvbm5lY3RvciwgMCwgMCk7CisKKwkJLyogRGlzYWJsZSB0aGUgY3J0YyB0byBlbnN1cmUgYSBmdWxsIG1vZGVzZXQgaXMKKwkJICogcGVyZm9ybWVkIHdoZW5ldmVyIGl0J3MgdHVybmVkIG9uIGFnYWluLiAqLworCQlpZiAoY3J0YykgeworCQkJc3RydWN0IGRybV9tb2RlX3NldCBtb2Rlc2V0ID0geworCQkJCS5jcnRjID0gY3J0YywKKwkJCX07CisKKwkJCWNydGMtPmZ1bmNzLT5zZXRfY29uZmlnKCZtb2Rlc2V0KTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRybV9lbmNvZGVyX3NsYXZlX2Z1bmNzIGNoNzAwNl9lbmNvZGVyX2Z1bmNzID0geworCS5zZXRfY29uZmlnID0gY2g3MDA2X2VuY29kZXJfc2V0X2NvbmZpZywKKwkuZGVzdHJveSA9IGNoNzAwNl9lbmNvZGVyX2Rlc3Ryb3ksCisJLmRwbXMgPSBjaDcwMDZfZW5jb2Rlcl9kcG1zLAorCS5zYXZlID0gY2g3MDA2X2VuY29kZXJfc2F2ZSwKKwkucmVzdG9yZSA9IGNoNzAwNl9lbmNvZGVyX3Jlc3RvcmUsCisJLm1vZGVfZml4dXAgPSBjaDcwMDZfZW5jb2Rlcl9tb2RlX2ZpeHVwLAorCS5tb2RlX3ZhbGlkID0gY2g3MDA2X2VuY29kZXJfbW9kZV92YWxpZCwKKwkubW9kZV9zZXQgPSBjaDcwMDZfZW5jb2Rlcl9tb2RlX3NldCwKKwkuZGV0ZWN0ID0gY2g3MDA2X2VuY29kZXJfZGV0ZWN0LAorCS5nZXRfbW9kZXMgPSBjaDcwMDZfZW5jb2Rlcl9nZXRfbW9kZXMsCisJLmNyZWF0ZV9yZXNvdXJjZXMgPSBjaDcwMDZfZW5jb2Rlcl9jcmVhdGVfcmVzb3VyY2VzLAorCS5zZXRfcHJvcGVydHkgPSBjaDcwMDZfZW5jb2Rlcl9zZXRfcHJvcGVydHksCit9OworCisKKy8qIEkyQyBkcml2ZXIgZnVuY3Rpb25zICovCisKK3N0YXRpYyBpbnQgY2g3MDA2X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwl1aW50OF90IGFkZHIgPSBDSDcwMDZfVkVSU0lPTl9JRDsKKwl1aW50OF90IHZhbDsKKwlpbnQgcmV0OworCisJY2g3MDA2X2RiZyhjbGllbnQsICJcbiIpOworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgJmFkZHIsIHNpemVvZihhZGRyKSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZmFpbDsKKworCXJldCA9IGkyY19tYXN0ZXJfcmVjdihjbGllbnQsICZ2YWwsIHNpemVvZih2YWwpKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBmYWlsOworCisJY2g3MDA2X2luZm8oY2xpZW50LCAiRGV0ZWN0ZWQgdmVyc2lvbiBJRDogJXhcbiIsIHZhbCk7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwljaDcwMDZfZXJyKGNsaWVudCwgIkVycm9yICVkIHJlYWRpbmcgdmVyc2lvbiBJRFxuIiwgcmV0KTsKKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IGNoNzAwNl9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwljaDcwMDZfZGJnKGNsaWVudCwgIlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaDcwMDZfZW5jb2Rlcl9pbml0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgICAgICAgc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZHJtX2VuY29kZXJfc2xhdmUgKmVuY29kZXIpCit7CisJc3RydWN0IGNoNzAwNl9wcml2ICpwcml2OworCWludCBpOworCisJY2g3MDA2X2RiZyhjbGllbnQsICJcbiIpOworCisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVuY29kZXItPnNsYXZlX3ByaXYgPSBwcml2OworCWVuY29kZXItPnNsYXZlX2Z1bmNzID0gJmNoNzAwNl9lbmNvZGVyX2Z1bmNzOworCisJcHJpdi0+bm9ybSA9IFRWX05PUk1fUEFMOworCXByaXYtPnNlbGVjdF9zdWJjb25uZWN0b3IgPSBEUk1fTU9ERV9TVUJDT05ORUNUT1JfQXV0b21hdGljOworCXByaXYtPnN1YmNvbm5lY3RvciA9IERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9Vbmtub3duOworCXByaXYtPnNjYWxlID0gMTsKKwlwcml2LT5jb250cmFzdCA9IDUwOworCXByaXYtPmJyaWdodG5lc3MgPSA1MDsKKwlwcml2LT5mbGlja2VyID0gNTA7CisJcHJpdi0+aG1hcmdpbiA9IDUwOworCXByaXYtPnZtYXJnaW4gPSA1MDsKKwlwcml2LT5sYXN0X2RwbXMgPSAtMTsKKworCWlmIChjaDcwMDZfdHZfbm9ybSkgeworCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1RWX05PUk1TOyBpKyspIHsKKwkJCWlmICghc3RyY21wKGNoNzAwNl90dl9ub3JtX25hbWVzW2ldLCBjaDcwMDZfdHZfbm9ybSkpIHsKKwkJCQlwcml2LT5ub3JtID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChpID09IE5VTV9UVl9OT1JNUykKKwkJCWNoNzAwNl9lcnIoY2xpZW50LCAiSW52YWxpZCBUViBub3JtIHNldHRpbmcgXCIlc1wiLlxuIiwKKwkJCQkgICBjaDcwMDZfdHZfbm9ybSk7CisJfQorCisJaWYgKGNoNzAwNl9zY2FsZSA+PSAwICYmIGNoNzAwNl9zY2FsZSA8PSAyKQorCQlwcml2LT5zY2FsZSA9IGNoNzAwNl9zY2FsZTsKKwllbHNlCisJCWNoNzAwNl9lcnIoY2xpZW50LCAiSW52YWxpZCBzY2FsZSBzZXR0aW5nIFwiJWRcIi5cbiIsCisJCQkgICBjaDcwMDZfc2NhbGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RldmljZV9pZCBjaDcwMDZfaWRzW10gPSB7CisJeyAiY2g3MDA2IiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBjaDcwMDZfaWRzKTsKKworc3RhdGljIHN0cnVjdCBkcm1faTJjX2VuY29kZXJfZHJpdmVyIGNoNzAwNl9kcml2ZXIgPSB7CisJLmkyY19kcml2ZXIgPSB7CisJCS5wcm9iZSA9IGNoNzAwNl9wcm9iZSwKKwkJLnJlbW92ZSA9IGNoNzAwNl9yZW1vdmUsCisKKwkJLmRyaXZlciA9IHsKKwkJCS5uYW1lID0gImNoNzAwNiIsCisJCX0sCisKKwkJLmlkX3RhYmxlID0gY2g3MDA2X2lkcywKKwl9LAorCisJLmVuY29kZXJfaW5pdCA9IGNoNzAwNl9lbmNvZGVyX2luaXQsCit9OworCisKKy8qIE1vZHVsZSBpbml0aWFsaXphdGlvbiAqLworCitzdGF0aWMgaW50IF9faW5pdCBjaDcwMDZfaW5pdCh2b2lkKQoreworCXJldHVybiBkcm1faTJjX2VuY29kZXJfcmVnaXN0ZXIoVEhJU19NT0RVTEUsICZjaDcwMDZfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNoNzAwNl9leGl0KHZvaWQpCit7CisJZHJtX2kyY19lbmNvZGVyX3VucmVnaXN0ZXIoJmNoNzAwNl9kcml2ZXIpOworfQorCitpbnQgY2g3MDA2X2RlYnVnOworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBjaDcwMDZfZGVidWcsIGludCwgMDYwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRW5hYmxlIGRlYnVnIG91dHB1dC4iKTsKKworY2hhciAqY2g3MDA2X3R2X25vcm07Cittb2R1bGVfcGFyYW1fbmFtZWQodHZfbm9ybSwgY2g3MDA2X3R2X25vcm0sIGNoYXJwLCAwNjAwKTsKK01PRFVMRV9QQVJNX0RFU0ModHZfbm9ybSwgIkRlZmF1bHQgVFYgbm9ybS5cbiIKKwkJICJcdFx0U3VwcG9ydGVkOiBQQUwsIFBBTC1NLCBQQUwtTiwgUEFMLU5jLCBQQUwtNjAsIE5UU0MtTSwgTlRTQy1KLlxuIgorCQkgIlx0XHREZWZhdWx0OiBQQUwiKTsKKworaW50IGNoNzAwNl9zY2FsZSA9IDE7Cittb2R1bGVfcGFyYW1fbmFtZWQoc2NhbGUsIGNoNzAwNl9zY2FsZSwgaW50LCAwNjAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc2NhbGUsICJEZWZhdWx0IHNjYWxlLlxuIgorCQkgIlx0XHRTdXBwb3J0ZWQ6IDAgLT4gU2VsZWN0IHZpZGVvIG1vZGVzIHdpdGggYSBoaWdoZXIgYmxhbmtpbmcgcmF0aW8uXG4iCisJCSAiXHRcdFx0MSAtPiBTZWxlY3QgZGVmYXVsdCB2aWRlbyBtb2Rlcy5cbiIKKwkJICJcdFx0XHQyIC0+IFNlbGVjdCB2aWRlbyBtb2RlcyB3aXRoIGEgbG93ZXIgYmxhbmtpbmcgcmF0aW8uIik7CisKK01PRFVMRV9BVVRIT1IoIkZyYW5jaXNjbyBKZXJleiA8Y3Vycm9qZXJlekByaXNldXAubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDaHJvbnRlbCBjaDcwMDYgVFYgZW5jb2RlciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CisKK21vZHVsZV9pbml0KGNoNzAwNl9pbml0KTsKK21vZHVsZV9leGl0KGNoNzAwNl9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pMmMvY2g3MDA2X21vZGUuYyBiL2RyaXZlcnMvZ3B1L2RybS9pMmMvY2g3MDA2X21vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2Y1NDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2kyYy9jaDcwMDZfbW9kZS5jCkBAIC0wLDAgKzEsNDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEZyYW5jaXNjbyBKZXJlei4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlICJjaDcwMDZfcHJpdi5oIgorCitjaGFyICpjaDcwMDZfdHZfbm9ybV9uYW1lc1tdID0geworCVtUVl9OT1JNX1BBTF0gPSAiUEFMIiwKKwlbVFZfTk9STV9QQUxfTV0gPSAiUEFMLU0iLAorCVtUVl9OT1JNX1BBTF9OXSA9ICJQQUwtTiIsCisJW1RWX05PUk1fUEFMX05DXSA9ICJQQUwtTmMiLAorCVtUVl9OT1JNX1BBTF82MF0gPSAiUEFMLTYwIiwKKwlbVFZfTk9STV9OVFNDX01dID0gIk5UU0MtTSIsCisJW1RWX05PUk1fTlRTQ19KXSA9ICJOVFNDLUoiLAorfTsKKworI2RlZmluZSBOVFNDX0xJS0VfVElNSU5HUyAudnJlZnJlc2ggPSA2MCAqIGZpeGVkMS8xLjAwMSwJCVwKKwkJLnZkaXNwbGF5ID0gNDgwLAkJCQkJXAorCQkudnRvdGFsID0gNTI1LAkJCQkJCVwKKwkJLmh2aXJ0dWFsID0gNjYwCisKKyNkZWZpbmUgUEFMX0xJS0VfVElNSU5HUyAudnJlZnJlc2ggPSA1MCAqIGZpeGVkMSwJCVwKKwkJLnZkaXNwbGF5ID0gNTc2LAkJCQlcCisJCS52dG90YWwgPSA2MjUsCQkJCQlcCisJCS5odmlydHVhbCA9IDgxMAorCitzdHJ1Y3QgY2g3MDA2X3R2X25vcm1faW5mbyBjaDcwMDZfdHZfbm9ybXNbXSA9IHsKKwlbVFZfTk9STV9OVFNDX01dID0geworCQlOVFNDX0xJS0VfVElNSU5HUywKKwkJLmJsYWNrX2xldmVsID0gMC4zMzkgKiBmaXhlZDEsCisJCS5zdWJjX2ZyZXEgPSAzNTc5NTQ1ICogZml4ZWQxLAorCQkuZGlzcG1vZGUgPSBiaXRmcyhDSDcwMDZfRElTUE1PREVfT1VUUFVUX1NURCwgTlRTQyksCisJCS52b2Zmc2V0ID0gMCwKKwl9LAorCVtUVl9OT1JNX05UU0NfSl0gPSB7CisJCU5UU0NfTElLRV9USU1JTkdTLAorCQkuYmxhY2tfbGV2ZWwgPSAwLjI4NiAqIGZpeGVkMSwKKwkJLnN1YmNfZnJlcSA9IDM1Nzk1NDUgKiBmaXhlZDEsCisJCS5kaXNwbW9kZSA9IGJpdGZzKENINzAwNl9ESVNQTU9ERV9PVVRQVVRfU1RELCBOVFNDX0opLAorCQkudm9mZnNldCA9IDAsCisJfSwKKwlbVFZfTk9STV9QQUxdID0geworCQlQQUxfTElLRV9USU1JTkdTLAorCQkuYmxhY2tfbGV2ZWwgPSAwLjMgKiBmaXhlZDEsCisJCS5zdWJjX2ZyZXEgPSA0NDMzNjE4Ljc1ICogZml4ZWQxLAorCQkuZGlzcG1vZGUgPSBiaXRmcyhDSDcwMDZfRElTUE1PREVfT1VUUFVUX1NURCwgUEFMKSwKKwkJLnZvZmZzZXQgPSAwLAorCX0sCisJW1RWX05PUk1fUEFMX01dID0geworCQlOVFNDX0xJS0VfVElNSU5HUywKKwkJLmJsYWNrX2xldmVsID0gMC4zMzkgKiBmaXhlZDEsCisJCS5zdWJjX2ZyZXEgPSAzNTc1NjExLjQzMyAqIGZpeGVkMSwKKwkJLmRpc3Btb2RlID0gYml0ZnMoQ0g3MDA2X0RJU1BNT0RFX09VVFBVVF9TVEQsIFBBTF9NKSwKKwkJLnZvZmZzZXQgPSAxNiwKKwl9LAorCisJLyogVGhlIGZvbGxvd2luZyBtb2RlcyBzZWVtIHRvIHdvcmsgcmlnaHQgYnV0IHRoZXkncmUKKwkgKiB1bmRvY3VtZW50ZWQgKi8KKworCVtUVl9OT1JNX1BBTF9OXSA9IHsKKwkJUEFMX0xJS0VfVElNSU5HUywKKwkJLmJsYWNrX2xldmVsID0gMC4zMzkgKiBmaXhlZDEsCisJCS5zdWJjX2ZyZXEgPSA0NDMzNjE4Ljc1ICogZml4ZWQxLAorCQkuZGlzcG1vZGUgPSBiaXRmcyhDSDcwMDZfRElTUE1PREVfT1VUUFVUX1NURCwgUEFMKSwKKwkJLnZvZmZzZXQgPSAwLAorCX0sCisJW1RWX05PUk1fUEFMX05DXSA9IHsKKwkJUEFMX0xJS0VfVElNSU5HUywKKwkJLmJsYWNrX2xldmVsID0gMC4zICogZml4ZWQxLAorCQkuc3ViY19mcmVxID0gMzU4MjA1Ni4yNSAqIGZpeGVkMSwKKwkJLmRpc3Btb2RlID0gYml0ZnMoQ0g3MDA2X0RJU1BNT0RFX09VVFBVVF9TVEQsIFBBTCksCisJCS52b2Zmc2V0ID0gMCwKKwl9LAorCVtUVl9OT1JNX1BBTF82MF0gPSB7CisJCU5UU0NfTElLRV9USU1JTkdTLAorCQkuYmxhY2tfbGV2ZWwgPSAwLjMgKiBmaXhlZDEsCisJCS5zdWJjX2ZyZXEgPSA0NDMzNjE4Ljc1ICogZml4ZWQxLAorCQkuZGlzcG1vZGUgPSBiaXRmcyhDSDcwMDZfRElTUE1PREVfT1VUUFVUX1NURCwgUEFMX00pLAorCQkudm9mZnNldCA9IDE2LAorCX0sCit9OworCisjZGVmaW5lIF9fTU9ERShmLCBoZCwgdmQsIGh0LCB2dCwgaHN5bnAsIHZzeW5wLAkJCQlcCisJICAgICAgIHN1YmMsIHNjYWxlLCBzY2FsZV9tYXNrLCBub3JtX21hc2ssIGVfaGQsIGVfdmQpIHsJXAorCQkubW9kZSA9IHsJCQkJCQlcCisJCQkubmFtZSA9ICNoZCAieCIgI3ZkLAkJCQlcCisJCQkuc3RhdHVzID0gMCwJCQkJCVwKKwkJCS50eXBlID0gRFJNX01PREVfVFlQRV9EUklWRVIsCQkJXAorCQkJLmNsb2NrID0gZiwJCQkJCVwKKwkJCS5oZGlzcGxheSA9IGhkLAkJCQkJXAorCQkJLmhzeW5jX3N0YXJ0ID0gZV9oZCArIDE2LAkJCVwKKwkJCS5oc3luY19lbmQgPSBlX2hkICsgODAsCQkJCVwKKwkJCS5odG90YWwgPSBodCwJCQkJCVwKKwkJCS5oc2tldyA9IDAsCQkJCQlcCisJCQkudmRpc3BsYXkgPSB2ZCwJCQkJCVwKKwkJCS52c3luY19zdGFydCA9IHZkICsgMTAsCQkJCVwKKwkJCS52c3luY19lbmQgPSB2ZCArIDI2LAkJCQlcCisJCQkudnRvdGFsID0gdnQsCQkJCQlcCisJCQkudnNjYW4gPSAwLAkJCQkJXAorCQkJLmZsYWdzID0gRFJNX01PREVfRkxBR18jI2hzeW5wIyNIU1lOQyB8CQlcCisJCQkJRFJNX01PREVfRkxBR18jI3ZzeW5wIyNWU1lOQywJCVwKKwkJCS52cmVmcmVzaCA9IDAsCQkJCQlcCisJCX0sCQkJCQkJCVwKKwkJLmVuY19oZGlzcCA9IGVfaGQsCQkJCQlcCisJCS5lbmNfdmRpc3AgPSBlX3ZkLAkJCQkJXAorCQkuc3ViY19jb2VmZiA9IHN1YmMgKiBmaXhlZDEsCQkJCVwKKwkJLmRpc3Btb2RlID0gYml0ZnMoQ0g3MDA2X0RJU1BNT0RFX1NDQUxJTkdfUkFUSU8sIHNjYWxlKSB8IFwKKwkJCSAgICBiaXRmcyhDSDcwMDZfRElTUE1PREVfSU5QVVRfUkVTLCBlX2hkIyN4IyNlX3ZkKSwgXAorCQkudmFsaWRfc2NhbGVzID0gc2NhbGVfbWFzaywJCQkJXAorCQkudmFsaWRfbm9ybXMgPSBub3JtX21hc2sJCQkJXAorCSB9CisKKyNkZWZpbmUgTU9ERShmLCBoZCwgdmQsIGh0LCB2dCwgaHN5bnAsIHZzeW5wLAkJCQlcCisJICAgICBzdWJjLCBzY2FsZSwgc2NhbGVfbWFzaywgbm9ybV9tYXNrKQkJCVwKKwlfX01PREUoZiwgaGQsIHZkLCBodCwgdnQsIGhzeW5wLCB2c3lucCwgc3ViYywgc2NhbGUsCQlcCisJICAgICAgIHNjYWxlX21hc2ssIG5vcm1fbWFzaywgaGQsIHZkKQorCisjZGVmaW5lIE5UU0NfTElLRSAoMSA8PCBUVl9OT1JNX05UU0NfTSB8IDEgPDwgVFZfTk9STV9OVFNDX0ogfAkJXAorCQkgICAxIDw8IFRWX05PUk1fUEFMX00gfCAxIDw8IFRWX05PUk1fUEFMXzYwKQorCisjZGVmaW5lIFBBTF9MSUtFICgxIDw8IFRWX05PUk1fUEFMIHwgMSA8PCBUVl9OT1JNX1BBTF9OIHwgMSA8PCBUVl9OT1JNX1BBTF9OQykKKworc3RydWN0IGNoNzAwNl9tb2RlIGNoNzAwNl9tb2Rlc1tdID0geworCU1PREUoMjEwMDAsIDUxMiwgMzg0LCA4NDAsIDUwMCwgTiwgTiwgMTgxLjc5NzU1NzU4MiwgNV80LCAweDYsIFBBTF9MSUtFKSwKKwlNT0RFKDI2MjUwLCA1MTIsIDM4NCwgODQwLCA2MjUsIE4sIE4sIDE0NS40MzgwNDYwNjYsIDFfMSwgMHgxLCBQQUxfTElLRSksCisJTU9ERSgyMDE0MCwgNTEyLCAzODQsIDgwMCwgNDIwLCBOLCBOLCAyMTMuMjU3MDgzNzkxLCA1XzQsIDB4NCwgTlRTQ19MSUtFKSwKKwlNT0RFKDI0NjcxLCA1MTIsIDM4NCwgNzg0LCA1MjUsIE4sIE4sIDE3NC4wODc0MTUzLCAxXzEsIDB4MywgTlRTQ19MSUtFKSwKKwlNT0RFKDI4MTI1LCA3MjAsIDQwMCwgMTEyNSwgNTAwLCBOLCBOLCAxMzUuNzQyMTc2Mjk4LCA1XzQsIDB4NiwgUEFMX0xJS0UpLAorCU1PREUoMzQ4NzUsIDcyMCwgNDAwLCAxMTE2LCA2MjUsIE4sIE4sIDEwOS40Njk0OTY4OTgsIDFfMSwgMHgxLCBQQUxfTElLRSksCisJTU9ERSgyMzc5MCwgNzIwLCA0MDAsIDk0NSwgNDIwLCBOLCBOLCAxNjAuNDc1NjQyMDE2LCA1XzQsIDB4NCwgTlRTQ19MSUtFKSwKKwlNT0RFKDI5NDU1LCA3MjAsIDQwMCwgOTM2LCA1MjUsIE4sIE4sIDEyOS42MTQ5NDE4NDMsIDFfMSwgMHgzLCBOVFNDX0xJS0UpLAorCU1PREUoMjUwMDAsIDY0MCwgNDAwLCAxMDAwLCA1MDAsIE4sIE4sIDE1Mi43MDk5NDgyNzksIDVfNCwgMHg2LCBQQUxfTElLRSksCisJTU9ERSgzMTUwMCwgNjQwLCA0MDAsIDEwMDgsIDYyNSwgTiwgTiwgMTIxLjE5ODM3MTY0NiwgMV8xLCAweDEsIFBBTF9MSUtFKSwKKwlNT0RFKDIxMTQ3LCA2NDAsIDQwMCwgODQwLCA0MjAsIE4sIE4sIDE4MC41MzUwOTczMzgsIDVfNCwgMHg0LCBOVFNDX0xJS0UpLAorCU1PREUoMjY0MzQsIDY0MCwgNDAwLCA4NDAsIDUyNSwgTiwgTiwgMTQ0LjQyODA3Nzg3LCAxXzEsIDB4MiwgTlRTQ19MSUtFKSwKKwlNT0RFKDMwMjEwLCA2NDAsIDQwMCwgODQwLCA2MDAsIE4sIE4sIDEyNi4zNzQ1NjgyNzYsIDdfOCwgMHgxLCBOVFNDX0xJS0UpLAorCU1PREUoMjEwMDAsIDY0MCwgNDgwLCA4NDAsIDUwMCwgTiwgTiwgMTgxLjc5NzU1NzU4MiwgNV80LCAweDQsIFBBTF9MSUtFKSwKKwlNT0RFKDI2MjUwLCA2NDAsIDQ4MCwgODQwLCA2MjUsIE4sIE4sIDE0NS40MzgwNDYwNjYsIDFfMSwgMHgyLCBQQUxfTElLRSksCisJTU9ERSgzMTUwMCwgNjQwLCA0ODAsIDg0MCwgNzUwLCBOLCBOLCAxMjEuMTk4MzcxNjQ2LCA1XzYsIDB4MSwgUEFMX0xJS0UpLAorCU1PREUoMjQ2NzEsIDY0MCwgNDgwLCA3ODQsIDUyNSwgTiwgTiwgMTc0LjA4NzQxNTMsIDFfMSwgMHg0LCBOVFNDX0xJS0UpLAorCU1PREUoMjgxOTYsIDY0MCwgNDgwLCA3ODQsIDYwMCwgTiwgTiwgMTUyLjMyNjQ4ODQyMiwgN184LCAweDIsIE5UU0NfTElLRSksCisJTU9ERSgzMDIxMCwgNjQwLCA0ODAsIDgwMCwgNjMwLCBOLCBOLCAxNDIuMTcxMzg5MTAxLCA1XzYsIDB4MSwgTlRTQ19MSUtFKSwKKwlfX01PREUoMjk1MDAsIDcyMCwgNTc2LCA5NDQsIDYyNSwgUCwgUCwgMTQ1LjU5MjExMTYzNiwgMV8xLCAweDcsIFBBTF9MSUtFLCA4MDAsIDYwMCksCisJTU9ERSgzNjAwMCwgODAwLCA2MDAsIDk2MCwgNzUwLCBQLCBQLCAxMTkuMzA0NjQ3MDIyLCA1XzYsIDB4NiwgUEFMX0xJS0UpLAorCU1PREUoMzkwMDAsIDgwMCwgNjAwLCA5MzYsIDgzNiwgUCwgUCwgMTEwLjEyNzM2NjQ5OSwgM180LCAweDEsIFBBTF9MSUtFKSwKKwlNT0RFKDM5MjczLCA4MDAsIDYwMCwgMTA0MCwgNjMwLCBQLCBQLCAxNDUuODE2ODA5Mzk5LCA1XzYsIDB4NCwgTlRTQ19MSUtFKSwKKwlNT0RFKDQzNjM2LCA4MDAsIDYwMCwgMTA0MCwgNzAwLCBQLCBQLCAxMzEuMjM1MTI4NDg3LCAzXzQsIDB4MiwgTlRTQ19MSUtFKSwKKwlNT0RFKDQ3ODMyLCA4MDAsIDYwMCwgMTA2NCwgNzUwLCBQLCBQLCAxMTkuNzIzMjc1MTY1LCA3XzEwLCAweDEsIE5UU0NfTElLRSksCisJe30KK307CisKK3N0cnVjdCBjaDcwMDZfbW9kZSAqY2g3MDA2X2xvb2t1cF9tb2RlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmRybV9tb2RlKQoreworCXN0cnVjdCBjaDcwMDZfcHJpdiAqcHJpdiA9IHRvX2NoNzAwNl9wcml2KGVuY29kZXIpOworCXN0cnVjdCBjaDcwMDZfbW9kZSAqbW9kZTsKKworCWZvciAobW9kZSA9IGNoNzAwNl9tb2RlczsgbW9kZS0+bW9kZS5jbG9jazsgbW9kZSsrKSB7CisKKwkJaWYgKH5tb2RlLT52YWxpZF9ub3JtcyAmIDE8PHByaXYtPm5vcm0pCisJCQljb250aW51ZTsKKworCQlpZiAobW9kZS0+bW9kZS5oZGlzcGxheSAhPSBkcm1fbW9kZS0+aGRpc3BsYXkgfHwKKwkJICAgIG1vZGUtPm1vZGUudmRpc3BsYXkgIT0gZHJtX21vZGUtPnZkaXNwbGF5IHx8CisJCSAgICBtb2RlLT5tb2RlLnZ0b3RhbCAhPSBkcm1fbW9kZS0+dnRvdGFsIHx8CisJCSAgICBtb2RlLT5tb2RlLmh0b3RhbCAhPSBkcm1fbW9kZS0+aHRvdGFsIHx8CisJCSAgICBtb2RlLT5tb2RlLmNsb2NrICE9IGRybV9tb2RlLT5jbG9jaykKKwkJCWNvbnRpbnVlOworCisJCXJldHVybiBtb2RlOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKiBTb21lIGNvbW1vbiBIVyBzdGF0ZSBjYWxjdWxhdGlvbiBjb2RlICovCisKK3ZvaWQgY2g3MDA2X3NldHVwX2xldmVscyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRybV9pMmNfZW5jb2Rlcl9nZXRfY2xpZW50KGVuY29kZXIpOworCXN0cnVjdCBjaDcwMDZfcHJpdiAqcHJpdiA9IHRvX2NoNzAwNl9wcml2KGVuY29kZXIpOworCXVpbnQ4X3QgKnJlZ3MgPSBwcml2LT5zdGF0ZS5yZWdzOworCXN0cnVjdCBjaDcwMDZfdHZfbm9ybV9pbmZvICpub3JtID0gJmNoNzAwNl90dl9ub3Jtc1twcml2LT5ub3JtXTsKKwlpbnQgZ2FpbjsKKwlpbnQgYmxhY2tfbGV2ZWw7CisKKwkvKiBTZXQgREFDX0dBSU4gaWYgdGhlIHZvbHRhZ2UgZHJvcCBiZXR3ZWVuIHdoaXRlIGFuZCBibGFjayBpcworCSAqIGhpZ2ggZW5vdWdoLiAqLworCWlmIChub3JtLT5ibGFja19sZXZlbCA8IDMzOSpmaXhlZDEvMTAwMCkgeworCQlnYWluID0gNzY7CisKKwkJcmVnc1tDSDcwMDZfSU5QVVRfRk9STUFUXSB8PSBDSDcwMDZfSU5QVVRfRk9STUFUX0RBQ19HQUlOOworCX0gZWxzZSB7CisJCWdhaW4gPSA3MTsKKworCQlyZWdzW0NINzAwNl9JTlBVVF9GT1JNQVRdICY9IH5DSDcwMDZfSU5QVVRfRk9STUFUX0RBQ19HQUlOOworCX0KKworCWJsYWNrX2xldmVsID0gcm91bmRfZml4ZWQobm9ybS0+YmxhY2tfbGV2ZWwqMjY2MjUpL2dhaW47CisKKwkvKiBDb3JyZWN0IGl0IHdpdGggdGhlIHNwZWNpZmllZCBicmlnaHRuZXNzLiAqLworCWJsYWNrX2xldmVsID0gaW50ZXJwb2xhdGUoOTAsIGJsYWNrX2xldmVsLCAyMDgsIHByaXYtPmJyaWdodG5lc3MpOworCisJcmVnc1tDSDcwMDZfQkxBQ0tfTEVWRUxdID0gYml0ZihDSDcwMDZfQkxBQ0tfTEVWRUxfMCwgYmxhY2tfbGV2ZWwpOworCisJY2g3MDA2X2RiZyhjbGllbnQsICJibGFjayBsZXZlbDogJWRcbiIsIGJsYWNrX2xldmVsKTsKK30KKwordm9pZCBjaDcwMDZfc2V0dXBfc3ViY2FycmllcihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRybV9pMmNfZW5jb2Rlcl9nZXRfY2xpZW50KGVuY29kZXIpOworCXN0cnVjdCBjaDcwMDZfcHJpdiAqcHJpdiA9IHRvX2NoNzAwNl9wcml2KGVuY29kZXIpOworCXN0cnVjdCBjaDcwMDZfc3RhdGUgKnN0YXRlID0gJnByaXYtPnN0YXRlOworCXN0cnVjdCBjaDcwMDZfdHZfbm9ybV9pbmZvICpub3JtID0gJmNoNzAwNl90dl9ub3Jtc1twcml2LT5ub3JtXTsKKwlzdHJ1Y3QgY2g3MDA2X21vZGUgKm1vZGUgPSBwcml2LT5tb2RlOworCXVpbnQzMl90IHN1YmNfaW5jOworCisJc3ViY19pbmMgPSByb3VuZF9maXhlZCgobW9kZS0+c3ViY19jb2VmZiA+PiA4KQorCQkJICAgICAgICogKG5vcm0tPnN1YmNfZnJlcSA+PiAyNCkpOworCisJc2V0Yml0ZihzdGF0ZSwgQ0g3MDA2X1NVQkNfSU5DMCwgMjgsIHN1YmNfaW5jKTsKKwlzZXRiaXRmKHN0YXRlLCBDSDcwMDZfU1VCQ19JTkMxLCAyNCwgc3ViY19pbmMpOworCXNldGJpdGYoc3RhdGUsIENINzAwNl9TVUJDX0lOQzIsIDIwLCBzdWJjX2luYyk7CisJc2V0Yml0ZihzdGF0ZSwgQ0g3MDA2X1NVQkNfSU5DMywgMTYsIHN1YmNfaW5jKTsKKwlzZXRiaXRmKHN0YXRlLCBDSDcwMDZfU1VCQ19JTkM0LCAxMiwgc3ViY19pbmMpOworCXNldGJpdGYoc3RhdGUsIENINzAwNl9TVUJDX0lOQzUsIDgsIHN1YmNfaW5jKTsKKwlzZXRiaXRmKHN0YXRlLCBDSDcwMDZfU1VCQ19JTkM2LCA0LCBzdWJjX2luYyk7CisJc2V0Yml0ZihzdGF0ZSwgQ0g3MDA2X1NVQkNfSU5DNywgMCwgc3ViY19pbmMpOworCisJY2g3MDA2X2RiZyhjbGllbnQsICJzdWJjYXJyaWVyIGluYzogJXVcbiIsIHN1YmNfaW5jKTsKK30KKwordm9pZCBjaDcwMDZfc2V0dXBfcGxsKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZHJtX2kyY19lbmNvZGVyX2dldF9jbGllbnQoZW5jb2Rlcik7CisJc3RydWN0IGNoNzAwNl9wcml2ICpwcml2ID0gdG9fY2g3MDA2X3ByaXYoZW5jb2Rlcik7CisJdWludDhfdCAqcmVncyA9IHByaXYtPnN0YXRlLnJlZ3M7CisJc3RydWN0IGNoNzAwNl9tb2RlICptb2RlID0gcHJpdi0+bW9kZTsKKwlpbnQgbiwgYmVzdF9uID0gMDsKKwlpbnQgbSwgYmVzdF9tID0gMDsKKwlpbnQgZnJlcSwgYmVzdF9mcmVxID0gMDsKKworCWZvciAobiA9IDA7IG4gPCBDSDcwMDZfTUFYTjsgbisrKSB7CisJCWZvciAobSA9IDA7IG0gPCBDSDcwMDZfTUFYTTsgbSsrKSB7CisJCQlmcmVxID0gQ0g3MDA2X0ZSRVEwKihuKzIpLyhtKzIpOworCisJCQlpZiAoYWJzKGZyZXEgLSBtb2RlLT5tb2RlLmNsb2NrKSA8CisJCQkgICAgYWJzKGJlc3RfZnJlcSAtIG1vZGUtPm1vZGUuY2xvY2spKSB7CisJCQkJYmVzdF9mcmVxID0gZnJlcTsKKwkJCQliZXN0X24gPSBuOworCQkJCWJlc3RfbSA9IG07CisJCQl9CisJCX0KKwl9CisKKwlyZWdzW0NINzAwNl9QTExPVl0gPSBiaXRmKENINzAwNl9QTExPVl9OXzgsIGJlc3RfbikgfAorCQliaXRmKENINzAwNl9QTExPVl9NXzgsIGJlc3RfbSk7CisKKwlyZWdzW0NINzAwNl9QTExNXSA9IGJpdGYoQ0g3MDA2X1BMTE1fMCwgYmVzdF9tKTsKKwlyZWdzW0NINzAwNl9QTExOXSA9IGJpdGYoQ0g3MDA2X1BMTE5fMCwgYmVzdF9uKTsKKworCWlmIChiZXN0X24gPCAxMDgpCisJCXJlZ3NbQ0g3MDA2X1BMTF9DT05UUk9MXSB8PSBDSDcwMDZfUExMX0NPTlRST0xfQ0FQQUNJVE9SOworCWVsc2UKKwkJcmVnc1tDSDcwMDZfUExMX0NPTlRST0xdICY9IH5DSDcwMDZfUExMX0NPTlRST0xfQ0FQQUNJVE9SOworCisJY2g3MDA2X2RiZyhjbGllbnQsICJuPSVkIG09JWQgZj0lZCBjPSVkXG4iLAorCQkgICBiZXN0X24sIGJlc3RfbSwgYmVzdF9mcmVxLCBiZXN0X24gPCAxMDgpOworfQorCit2b2lkIGNoNzAwNl9zZXR1cF9wb3dlcl9zdGF0ZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGNoNzAwNl9wcml2ICpwcml2ID0gdG9fY2g3MDA2X3ByaXYoZW5jb2Rlcik7CisJdWludDhfdCAqcG93ZXIgPSAmcHJpdi0+c3RhdGUucmVnc1tDSDcwMDZfUE9XRVJdOworCWludCBzdWJjb25uZWN0b3I7CisKKwlzdWJjb25uZWN0b3IgPSBwcml2LT5zZWxlY3Rfc3ViY29ubmVjdG9yID8gcHJpdi0+c2VsZWN0X3N1YmNvbm5lY3RvciA6CisJCQkJCQkJcHJpdi0+c3ViY29ubmVjdG9yOworCisJKnBvd2VyID0gQ0g3MDA2X1BPV0VSX1JFU0VUOworCisJaWYgKHByaXYtPmxhc3RfZHBtcyA9PSBEUk1fTU9ERV9EUE1TX09OKSB7CisJCXN3aXRjaCAoc3ViY29ubmVjdG9yKSB7CisJCWNhc2UgRFJNX01PREVfU1VCQ09OTkVDVE9SX1NWSURFTzoKKwkJCSpwb3dlciB8PSBiaXRmcyhDSDcwMDZfUE9XRVJfTEVWRUwsIENWQlNfT0ZGKTsKKwkJCWJyZWFrOworCQljYXNlIERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9Db21wb3NpdGU6CisJCQkqcG93ZXIgfD0gYml0ZnMoQ0g3MDA2X1BPV0VSX0xFVkVMLCBTVklERU9fT0ZGKTsKKwkJCWJyZWFrOworCQljYXNlIERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9TQ0FSVDoKKwkJCSpwb3dlciB8PSBiaXRmcyhDSDcwMDZfUE9XRVJfTEVWRUwsIE5PUk1BTCkgfAorCQkJCUNINzAwNl9QT1dFUl9TQ0FSVDsKKwkJCWJyZWFrOworCQl9CisKKwl9IGVsc2UgeworCQkqcG93ZXIgfD0gYml0ZnMoQ0g3MDA2X1BPV0VSX0xFVkVMLCBGVUxMX1BPV0VSX09GRik7CisJfQorfQorCit2b2lkIGNoNzAwNl9zZXR1cF9wcm9wZXJ0aWVzKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZHJtX2kyY19lbmNvZGVyX2dldF9jbGllbnQoZW5jb2Rlcik7CisJc3RydWN0IGNoNzAwNl9wcml2ICpwcml2ID0gdG9fY2g3MDA2X3ByaXYoZW5jb2Rlcik7CisJc3RydWN0IGNoNzAwNl9zdGF0ZSAqc3RhdGUgPSAmcHJpdi0+c3RhdGU7CisJc3RydWN0IGNoNzAwNl90dl9ub3JtX2luZm8gKm5vcm0gPSAmY2g3MDA2X3R2X25vcm1zW3ByaXYtPm5vcm1dOworCXN0cnVjdCBjaDcwMDZfbW9kZSAqY2hfbW9kZSA9IHByaXYtPm1vZGU7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUgPSAmY2hfbW9kZS0+bW9kZTsKKwl1aW50OF90ICpyZWdzID0gc3RhdGUtPnJlZ3M7CisJaW50IGZsaWNrZXIsIGNvbnRyYXN0LCBocG9zLCB2cG9zOworCXVpbnQ2NF90IHNjYWxlLCBhc3BlY3Q7CisKKwlmbGlja2VyID0gaW50ZXJwb2xhdGUoMCwgMiwgMywgcHJpdi0+ZmxpY2tlcik7CisJcmVnc1tDSDcwMDZfRkZJTFRFUl0gPSBiaXRmKENINzAwNl9GRklMVEVSX1RFWFQsIGZsaWNrZXIpIHwKKwkJYml0ZihDSDcwMDZfRkZJTFRFUl9MVU1BLCBmbGlja2VyKSB8CisJCWJpdGYoQ0g3MDA2X0ZGSUxURVJfQ0hST01BLCAxKTsKKworCWNvbnRyYXN0ID0gaW50ZXJwb2xhdGUoMCwgNSwgNywgcHJpdi0+Y29udHJhc3QpOworCXJlZ3NbQ0g3MDA2X0NPTlRSQVNUXSA9IGJpdGYoQ0g3MDA2X0NPTlRSQVNUXzAsIGNvbnRyYXN0KTsKKworCXNjYWxlID0gbm9ybS0+dnRvdGFsKmZpeGVkMTsKKwlkb19kaXYoc2NhbGUsIG1vZGUtPnZ0b3RhbCk7CisKKwlhc3BlY3QgPSBjaF9tb2RlLT5lbmNfaGRpc3AqZml4ZWQxOworCWRvX2Rpdihhc3BlY3QsIGNoX21vZGUtPmVuY192ZGlzcCk7CisKKwlocG9zID0gcm91bmRfZml4ZWQoKG5vcm0tPmh2aXJ0dWFsICogYXNwZWN0IC0gbW9kZS0+aGRpc3BsYXkgKiBzY2FsZSkKKwkJCSAgICogcHJpdi0+aG1hcmdpbiAqIG1vZGUtPnZ0b3RhbCkgLyBub3JtLT52dG90YWwgLyAxMDAgLyA0OworCisJc2V0Yml0ZihzdGF0ZSwgQ0g3MDA2X1BPViwgSFBPU184LCBocG9zKTsKKwlzZXRiaXRmKHN0YXRlLCBDSDcwMDZfSFBPUywgMCwgaHBvcyk7CisKKwl2cG9zID0gbWF4KDAsIG5vcm0tPnZkaXNwbGF5IC0gcm91bmRfZml4ZWQobW9kZS0+dmRpc3BsYXkqc2NhbGUpCisJCSAgICsgbm9ybS0+dm9mZnNldCkgKiBwcml2LT52bWFyZ2luIC8gMTAwIC8gMjsKKworCXNldGJpdGYoc3RhdGUsIENINzAwNl9QT1YsIFZQT1NfOCwgdnBvcyk7CisJc2V0Yml0ZihzdGF0ZSwgQ0g3MDA2X1ZQT1MsIDAsIHZwb3MpOworCisJY2g3MDA2X2RiZyhjbGllbnQsICJocG9zOiAlZCwgdnBvczogJWRcbiIsIGhwb3MsIHZwb3MpOworfQorCisvKiBIVyBhY2Nlc3MgZnVuY3Rpb25zICovCisKK3ZvaWQgY2g3MDA2X3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVpbnQ4X3QgYWRkciwgdWludDhfdCB2YWwpCit7CisJdWludDhfdCBidWZbXSA9IHthZGRyLCB2YWx9OworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIEFSUkFZX1NJWkUoYnVmKSk7CisJaWYgKHJldCA8IDApCisJCWNoNzAwNl9lcnIoY2xpZW50LCAiRXJyb3IgJWQgd3JpdGluZyB0byBzdWJhZGRyZXNzIDB4JXhcbiIsCisJCQkgICByZXQsIGFkZHIpOworfQorCit1aW50OF90IGNoNzAwNl9yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVpbnQ4X3QgYWRkcikKK3sKKwl1aW50OF90IHZhbDsKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgJmFkZHIsIHNpemVvZihhZGRyKSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZmFpbDsKKworCXJldCA9IGkyY19tYXN0ZXJfcmVjdihjbGllbnQsICZ2YWwsIHNpemVvZih2YWwpKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBmYWlsOworCisJcmV0dXJuIHZhbDsKKworZmFpbDoKKwljaDcwMDZfZXJyKGNsaWVudCwgIkVycm9yICVkIHJlYWRpbmcgZnJvbSBzdWJhZGRyZXNzIDB4JXhcbiIsCisJCSAgIHJldCwgYWRkcik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2g3MDA2X3N0YXRlX2xvYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJICAgICAgIHN0cnVjdCBjaDcwMDZfc3RhdGUgKnN0YXRlKQoreworCWNoNzAwNl9sb2FkX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfUE9XRVIpOworCisJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9ESVNQTU9ERSk7CisJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9GRklMVEVSKTsKKwljaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0JXSURUSCk7CisJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9JTlBVVF9GT1JNQVQpOworCWNoNzAwNl9sb2FkX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfQ0xLTU9ERSk7CisJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9TVEFSVF9BQ1RJVkUpOworCWNoNzAwNl9sb2FkX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfUE9WKTsKKwljaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0JMQUNLX0xFVkVMKTsKKwljaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0hQT1MpOworCWNoNzAwNl9sb2FkX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfVlBPUyk7CisJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9JTlBVVF9TWU5DKTsKKwljaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0RFVEVDVCk7CisJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9DT05UUkFTVCk7CisJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9QTExPVik7CisJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9QTExNKTsKKwljaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X1BMTE4pOworCWNoNzAwNl9sb2FkX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfQkNMS09VVCk7CisJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9TVUJDX0lOQzApOworCWNoNzAwNl9sb2FkX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfU1VCQ19JTkMxKTsKKwljaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X1NVQkNfSU5DMik7CisJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9TVUJDX0lOQzMpOworCWNoNzAwNl9sb2FkX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfU1VCQ19JTkM0KTsKKwljaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X1NVQkNfSU5DNSk7CisJY2g3MDA2X2xvYWRfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9TVUJDX0lOQzYpOworCWNoNzAwNl9sb2FkX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfU1VCQ19JTkM3KTsKKwljaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X1BMTF9DT05UUk9MKTsKKwljaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0NBTENfU1VCQ19JTkMwKTsKKworCS8qIEkgZG9uJ3Qga25vdyB3aGF0IHRoaXMgaXMgZm9yLCBidXQgb3RoZXJ3aXNlIEkgZ2V0IG5vCisJICogc2lnbmFsLgorCSAqLworCWNoNzAwNl93cml0ZShjbGllbnQsIDB4M2QsIDB4MCk7Cit9CisKK3ZvaWQgY2g3MDA2X3N0YXRlX3NhdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJICAgICAgIHN0cnVjdCBjaDcwMDZfc3RhdGUgKnN0YXRlKQoreworCWNoNzAwNl9zYXZlX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfUE9XRVIpOworCisJY2g3MDA2X3NhdmVfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9ESVNQTU9ERSk7CisJY2g3MDA2X3NhdmVfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9GRklMVEVSKTsKKwljaDcwMDZfc2F2ZV9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0JXSURUSCk7CisJY2g3MDA2X3NhdmVfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9JTlBVVF9GT1JNQVQpOworCWNoNzAwNl9zYXZlX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfQ0xLTU9ERSk7CisJY2g3MDA2X3NhdmVfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9TVEFSVF9BQ1RJVkUpOworCWNoNzAwNl9zYXZlX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfUE9WKTsKKwljaDcwMDZfc2F2ZV9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0JMQUNLX0xFVkVMKTsKKwljaDcwMDZfc2F2ZV9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0hQT1MpOworCWNoNzAwNl9zYXZlX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfVlBPUyk7CisJY2g3MDA2X3NhdmVfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9JTlBVVF9TWU5DKTsKKwljaDcwMDZfc2F2ZV9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0RFVEVDVCk7CisJY2g3MDA2X3NhdmVfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9DT05UUkFTVCk7CisJY2g3MDA2X3NhdmVfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9QTExPVik7CisJY2g3MDA2X3NhdmVfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9QTExNKTsKKwljaDcwMDZfc2F2ZV9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X1BMTE4pOworCWNoNzAwNl9zYXZlX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfQkNMS09VVCk7CisJY2g3MDA2X3NhdmVfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9TVUJDX0lOQzApOworCWNoNzAwNl9zYXZlX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfU1VCQ19JTkMxKTsKKwljaDcwMDZfc2F2ZV9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X1NVQkNfSU5DMik7CisJY2g3MDA2X3NhdmVfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9TVUJDX0lOQzMpOworCWNoNzAwNl9zYXZlX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfU1VCQ19JTkM0KTsKKwljaDcwMDZfc2F2ZV9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X1NVQkNfSU5DNSk7CisJY2g3MDA2X3NhdmVfcmVnKGNsaWVudCwgc3RhdGUsIENINzAwNl9TVUJDX0lOQzYpOworCWNoNzAwNl9zYXZlX3JlZyhjbGllbnQsIHN0YXRlLCBDSDcwMDZfU1VCQ19JTkM3KTsKKwljaDcwMDZfc2F2ZV9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X1BMTF9DT05UUk9MKTsKKwljaDcwMDZfc2F2ZV9yZWcoY2xpZW50LCBzdGF0ZSwgQ0g3MDA2X0NBTENfU1VCQ19JTkMwKTsKKworCXN0YXRlLT5yZWdzW0NINzAwNl9GRklMVEVSXSA9IChzdGF0ZS0+cmVnc1tDSDcwMDZfRkZJTFRFUl0gJiAweGYwKSB8CisJCShzdGF0ZS0+cmVnc1tDSDcwMDZfRkZJTFRFUl0gJiAweDBjKSA+PiAyIHwKKwkJKHN0YXRlLT5yZWdzW0NINzAwNl9GRklMVEVSXSAmIDB4MDMpIDw8IDI7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTJjL2NoNzAwNl9wcml2LmggYi9kcml2ZXJzL2dwdS9kcm0vaTJjL2NoNzAwNl9wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA2ZDNkOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pMmMvY2g3MDA2X3ByaXYuaApAQCAtMCwwICsxLDM0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBGcmFuY2lzY28gSmVyZXouCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9fRFJNX0kyQ19DSDcwMDZfUFJJVl9IX18KKyNkZWZpbmUgX19EUk1fSTJDX0NINzAwNl9QUklWX0hfXworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybV9jcnRjX2hlbHBlci5oIgorI2luY2x1ZGUgImRybV9lbmNvZGVyX3NsYXZlLmgiCisjaW5jbHVkZSAiaTJjL2NoNzAwNi5oIgorCit0eXBlZGVmIGludDY0X3QgZml4ZWQ7CisjZGVmaW5lIGZpeGVkMSAoMUxMIDw8IDMyKQorCitlbnVtIGNoNzAwNl90dl9ub3JtIHsKKwlUVl9OT1JNX1BBTCwKKwlUVl9OT1JNX1BBTF9NLAorCVRWX05PUk1fUEFMX04sCisJVFZfTk9STV9QQUxfTkMsCisJVFZfTk9STV9QQUxfNjAsCisJVFZfTk9STV9OVFNDX00sCisJVFZfTk9STV9OVFNDX0osCisJTlVNX1RWX05PUk1TCit9OworCitzdHJ1Y3QgY2g3MDA2X3R2X25vcm1faW5mbyB7CisJZml4ZWQgdnJlZnJlc2g7CisJaW50IHZkaXNwbGF5OworCWludCB2dG90YWw7CisJaW50IGh2aXJ0dWFsOworCisJZml4ZWQgc3ViY19mcmVxOworCWZpeGVkIGJsYWNrX2xldmVsOworCisJdWludDMyX3QgZGlzcG1vZGU7CisJaW50IHZvZmZzZXQ7Cit9OworCitzdHJ1Y3QgY2g3MDA2X21vZGUgeworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlIG1vZGU7CisKKwlpbnQgZW5jX2hkaXNwOworCWludCBlbmNfdmRpc3A7CisKKwlmaXhlZCBzdWJjX2NvZWZmOworCXVpbnQzMl90IGRpc3Btb2RlOworCisJdWludDMyX3QgdmFsaWRfc2NhbGVzOworCXVpbnQzMl90IHZhbGlkX25vcm1zOworfTsKKworc3RydWN0IGNoNzAwNl9zdGF0ZSB7CisJdWludDhfdCByZWdzWzB4MjZdOworfTsKKworc3RydWN0IGNoNzAwNl9wcml2IHsKKwlzdHJ1Y3QgY2g3MDA2X2VuY29kZXJfcGFyYW1zICpwYXJhbXM7CisJc3RydWN0IGNoNzAwNl9tb2RlICptb2RlOworCisJc3RydWN0IGNoNzAwNl9zdGF0ZSBzdGF0ZTsKKwlzdHJ1Y3QgY2g3MDA2X3N0YXRlIHNhdmVkX3N0YXRlOworCisJc3RydWN0IGRybV9wcm9wZXJ0eSAqc2NhbGVfcHJvcGVydHk7CisKKwlpbnQgc2VsZWN0X3N1YmNvbm5lY3RvcjsKKwlpbnQgc3ViY29ubmVjdG9yOworCWludCBobWFyZ2luOworCWludCB2bWFyZ2luOworCWVudW0gY2g3MDA2X3R2X25vcm0gbm9ybTsKKwlpbnQgYnJpZ2h0bmVzczsKKwlpbnQgY29udHJhc3Q7CisJaW50IGZsaWNrZXI7CisJaW50IHNjYWxlOworCisJaW50IGxhc3RfZHBtczsKK307CisKKyNkZWZpbmUgdG9fY2g3MDA2X3ByaXYoeCkgXAorCSgoc3RydWN0IGNoNzAwNl9wcml2ICopdG9fZW5jb2Rlcl9zbGF2ZSh4KS0+c2xhdmVfcHJpdikKKworZXh0ZXJuIGludCBjaDcwMDZfZGVidWc7CitleHRlcm4gY2hhciAqY2g3MDA2X3R2X25vcm07CitleHRlcm4gaW50IGNoNzAwNl9zY2FsZTsKKworZXh0ZXJuIGNoYXIgKmNoNzAwNl90dl9ub3JtX25hbWVzW107CitleHRlcm4gc3RydWN0IGNoNzAwNl90dl9ub3JtX2luZm8gY2g3MDA2X3R2X25vcm1zW107CitleHRlcm4gc3RydWN0IGNoNzAwNl9tb2RlIGNoNzAwNl9tb2Rlc1tdOworCitzdHJ1Y3QgY2g3MDA2X21vZGUgKmNoNzAwNl9sb29rdXBfbW9kZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJICAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpkcm1fbW9kZSk7CisKK3ZvaWQgY2g3MDA2X3NldHVwX2xldmVscyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwordm9pZCBjaDcwMDZfc2V0dXBfc3ViY2FycmllcihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwordm9pZCBjaDcwMDZfc2V0dXBfcGxsKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7Cit2b2lkIGNoNzAwNl9zZXR1cF9wb3dlcl9zdGF0ZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwordm9pZCBjaDcwMDZfc2V0dXBfcHJvcGVydGllcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOworCit2b2lkIGNoNzAwNl93cml0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1aW50OF90IGFkZHIsIHVpbnQ4X3QgdmFsKTsKK3VpbnQ4X3QgY2g3MDA2X3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdWludDhfdCBhZGRyKTsKKwordm9pZCBjaDcwMDZfc3RhdGVfbG9hZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkgICAgICAgc3RydWN0IGNoNzAwNl9zdGF0ZSAqc3RhdGUpOwordm9pZCBjaDcwMDZfc3RhdGVfc2F2ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkgICAgICAgc3RydWN0IGNoNzAwNl9zdGF0ZSAqc3RhdGUpOworCisvKiBTb21lIGhlbHBlciBtYWNyb3MgKi8KKworI2RlZmluZSBjaDcwMDZfZGJnKGNsaWVudCwgZm9ybWF0LCAuLi4pIGRvIHsJCQkJXAorCQlpZiAoY2g3MDA2X2RlYnVnKQkJCQkJXAorCQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmY2xpZW50LT5kZXYsCQlcCisJCQkJICAgIiVzOiAiIGZvcm1hdCwgX19mdW5jX18sICMjIF9fVkFfQVJHU19fKTsgXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIGNoNzAwNl9pbmZvKGNsaWVudCwgZm9ybWF0LCAuLi4pIFwKKwkJCQlkZXZfaW5mbygmY2xpZW50LT5kZXYsIGZvcm1hdCwgX19WQV9BUkdTX18pCisjZGVmaW5lIGNoNzAwNl9lcnIoY2xpZW50LCBmb3JtYXQsIC4uLikgXAorCQkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCBmb3JtYXQsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIF9fbWFzayhzcmMsIGJpdGZpZWxkKSBcCisJCSgoKDIgPDwgKDEgPyBiaXRmaWVsZCkpIC0gMSkgJiB+KCgxIDw8ICgwID8gYml0ZmllbGQpKSAtIDEpKQorI2RlZmluZSBtYXNrKGJpdGZpZWxkKSBfX21hc2soYml0ZmllbGQpCisKKyNkZWZpbmUgX19iaXRmKHNyYywgYml0ZmllbGQsIHgpIFwKKwkJKCgoeCkgPj4gKHNyYykgPDwgKDAgPyBiaXRmaWVsZCkpICYgIF9fbWFzayhzcmMsIGJpdGZpZWxkKSkKKyNkZWZpbmUgYml0ZihiaXRmaWVsZCwgeCkgX19iaXRmKGJpdGZpZWxkLCB4KQorI2RlZmluZSBiaXRmcyhiaXRmaWVsZCwgcykgX19iaXRmKGJpdGZpZWxkLCBiaXRmaWVsZCMjXyMjcykKKyNkZWZpbmUgc2V0Yml0ZihzdGF0ZSwgcmVnLCBiaXRmaWVsZCwgeCkJCQkJXAorCXN0YXRlLT5yZWdzW3JlZ10gPSAoc3RhdGUtPnJlZ3NbcmVnXSAmIH5tYXNrKHJlZyMjXyMjYml0ZmllbGQpKQlcCisJCXwgYml0ZihyZWcjI18jI2JpdGZpZWxkLCB4KQorCisjZGVmaW5lIF9fdW5iaXRmKHNyYywgYml0ZmllbGQsIHgpIFwKKwkJKCh4ICYgX19tYXNrKHNyYywgYml0ZmllbGQpKSA+PiAoMCA/IGJpdGZpZWxkKSA8PCAoc3JjKSkKKyNkZWZpbmUgdW5iaXRmKGJpdGZpZWxkLCB4KSBfX3VuYml0ZihiaXRmaWVsZCwgeCkKKworc3RhdGljIGlubGluZSBpbnQgaW50ZXJwb2xhdGUoaW50IHkwLCBpbnQgeTEsIGludCB5MiwgaW50IHgpCit7CisJcmV0dXJuIHkxICsgKHggPCA1MCA/IHkxIC0geTAgOiB5MiAtIHkxKSAqICh4IC0gNTApIC8gNTA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50MzJfdCByb3VuZF9maXhlZChmaXhlZCB4KQoreworCXJldHVybiAoeCArIGZpeGVkMS8yKSA+PiAzMjsKK30KKworI2RlZmluZSBjaDcwMDZfbG9hZF9yZWcoY2xpZW50LCBzdGF0ZSwgcmVnKSBjaDcwMDZfd3JpdGUoY2xpZW50LCByZWcsIHN0YXRlLT5yZWdzW3JlZ10pCisjZGVmaW5lIGNoNzAwNl9zYXZlX3JlZyhjbGllbnQsIHN0YXRlLCByZWcpIHN0YXRlLT5yZWdzW3JlZ10gPSBjaDcwMDZfcmVhZChjbGllbnQsIHJlZykKKworLyogRml4ZWQgaGFyZHdhcmUgc3BlY3MgKi8KKworI2RlZmluZSBDSDcwMDZfRlJFUTAJCQkJMTQzMTgKKyNkZWZpbmUgQ0g3MDA2X01BWE4JCQkJNjUwCisjZGVmaW5lIENINzAwNl9NQVhNCQkJCTMxNQorCisvKiBSZWdpc3RlciBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIENINzAwNl9ESVNQTU9ERQkJCQkweDAwCisjZGVmaW5lIENINzAwNl9ESVNQTU9ERV9JTlBVVF9SRVMJCTAsIDc6NQorI2RlZmluZSBDSDcwMDZfRElTUE1PREVfSU5QVVRfUkVTXzUxMngzODQJMHgwCisjZGVmaW5lIENINzAwNl9ESVNQTU9ERV9JTlBVVF9SRVNfNzIweDQwMAkweDEKKyNkZWZpbmUgQ0g3MDA2X0RJU1BNT0RFX0lOUFVUX1JFU182NDB4NDAwCTB4MgorI2RlZmluZSBDSDcwMDZfRElTUE1PREVfSU5QVVRfUkVTXzY0MHg0ODAJMHgzCisjZGVmaW5lIENINzAwNl9ESVNQTU9ERV9JTlBVVF9SRVNfODAweDYwMAkweDQKKyNkZWZpbmUgQ0g3MDA2X0RJU1BNT0RFX0lOUFVUX1JFU19OQVRJVkUJMHg1CisjZGVmaW5lIENINzAwNl9ESVNQTU9ERV9PVVRQVVRfU1RECQkwLCA0OjMKKyNkZWZpbmUgQ0g3MDA2X0RJU1BNT0RFX09VVFBVVF9TVERfUEFMCQkweDAKKyNkZWZpbmUgQ0g3MDA2X0RJU1BNT0RFX09VVFBVVF9TVERfTlRTQwkJMHgxCisjZGVmaW5lIENINzAwNl9ESVNQTU9ERV9PVVRQVVRfU1REX1BBTF9NCTB4MgorI2RlZmluZSBDSDcwMDZfRElTUE1PREVfT1VUUFVUX1NURF9OVFNDX0oJMHgzCisjZGVmaW5lIENINzAwNl9ESVNQTU9ERV9TQ0FMSU5HX1JBVElPCQkwLCAyOjAKKyNkZWZpbmUgQ0g3MDA2X0RJU1BNT0RFX1NDQUxJTkdfUkFUSU9fNV80CTB4MAorI2RlZmluZSBDSDcwMDZfRElTUE1PREVfU0NBTElOR19SQVRJT18xXzEJMHgxCisjZGVmaW5lIENINzAwNl9ESVNQTU9ERV9TQ0FMSU5HX1JBVElPXzdfOAkweDIKKyNkZWZpbmUgQ0g3MDA2X0RJU1BNT0RFX1NDQUxJTkdfUkFUSU9fNV82CTB4MworI2RlZmluZSBDSDcwMDZfRElTUE1PREVfU0NBTElOR19SQVRJT18zXzQJMHg0CisjZGVmaW5lIENINzAwNl9ESVNQTU9ERV9TQ0FMSU5HX1JBVElPXzdfMTAJMHg1CisKKyNkZWZpbmUgQ0g3MDA2X0ZGSUxURVIJCQkJMHgwMQorI2RlZmluZSBDSDcwMDZfRkZJTFRFUl9URVhUCQkJMCwgNTo0CisjZGVmaW5lIENINzAwNl9GRklMVEVSX0xVTUEJCQkwLCAzOjIKKyNkZWZpbmUgQ0g3MDA2X0ZGSUxURVJfQ0hST01BCQkJMCwgMTowCisjZGVmaW5lIENINzAwNl9GRklMVEVSX0NIUk9NQV9OT19EQ1JBV0wJCTB4MworCisjZGVmaW5lIENINzAwNl9CV0lEVEgJCQkJMHgwMworI2RlZmluZSBDSDcwMDZfQldJRFRIXzVMX0ZGSUxFUgkJCSgxIDw8IDcpCisjZGVmaW5lIENINzAwNl9CV0lEVEhfQ1ZCU19OT19DSFJPTUEJCSgxIDw8IDYpCisjZGVmaW5lIENINzAwNl9CV0lEVEhfQ0hST01BCQkJMCwgNTo0CisjZGVmaW5lIENINzAwNl9CV0lEVEhfU1ZJREVPX1lQRUFLCQkoMSA8PCAzKQorI2RlZmluZSBDSDcwMDZfQldJRFRIX1NWSURFT19MVU1BCQkwLCAyOjEKKyNkZWZpbmUgQ0g3MDA2X0JXSURUSF9DVkJTX0xVTUEJCQkwLCAwOjAKKworI2RlZmluZSBDSDcwMDZfSU5QVVRfRk9STUFUCQkJMHgwNAorI2RlZmluZSBDSDcwMDZfSU5QVVRfRk9STUFUX0RBQ19HQUlOCQkoMSA8PCA2KQorI2RlZmluZSBDSDcwMDZfSU5QVVRfRk9STUFUX1JHQl9QQVNTX1RIUk9VR0gJKDEgPDwgNSkKKyNkZWZpbmUgQ0g3MDA2X0lOUFVUX0ZPUk1BVF9GT1JNQVQJCTAsIDM6MAorI2RlZmluZSBDSDcwMDZfSU5QVVRfRk9STUFUX0ZPUk1BVF9SR0IxNgkweDAKKyNkZWZpbmUgQ0g3MDA2X0lOUFVUX0ZPUk1BVF9GT1JNQVRfWUNyQ2IyNG0xNgkweDEKKyNkZWZpbmUgQ0g3MDA2X0lOUFVUX0ZPUk1BVF9GT1JNQVRfUkdCMjRtMTYJMHgyCisjZGVmaW5lIENINzAwNl9JTlBVVF9GT1JNQVRfRk9STUFUX1JHQjE1CTB4MworI2RlZmluZSBDSDcwMDZfSU5QVVRfRk9STUFUX0ZPUk1BVF9SR0IyNG0xMkMJMHg0CisjZGVmaW5lIENINzAwNl9JTlBVVF9GT1JNQVRfRk9STUFUX1JHQjI0bTEySQkweDUKKyNkZWZpbmUgQ0g3MDA2X0lOUFVUX0ZPUk1BVF9GT1JNQVRfUkdCMjRtOAkweDYKKyNkZWZpbmUgQ0g3MDA2X0lOUFVUX0ZPUk1BVF9GT1JNQVRfUkdCMTZtOAkweDcKKyNkZWZpbmUgQ0g3MDA2X0lOUFVUX0ZPUk1BVF9GT1JNQVRfUkdCMTVtOAkweDgKKyNkZWZpbmUgQ0g3MDA2X0lOUFVUX0ZPUk1BVF9GT1JNQVRfWUNyQ2IyNG04CTB4OQorCisjZGVmaW5lIENINzAwNl9DTEtNT0RFCQkJCTB4MDYKKyNkZWZpbmUgQ0g3MDA2X0NMS01PREVfU1VCQ19MT0NLCQkoMSA8PCA3KQorI2RlZmluZSBDSDcwMDZfQ0xLTU9ERV9NQVNURVIJCQkoMSA8PCA2KQorI2RlZmluZSBDSDcwMDZfQ0xLTU9ERV9QT1NfRURHRQkJCSgxIDw8IDQpCisjZGVmaW5lIENINzAwNl9DTEtNT0RFX1hDTQkJCTAsIDM6MgorI2RlZmluZSBDSDcwMDZfQ0xLTU9ERV9QQ00JCQkwLCAxOjAKKworI2RlZmluZSBDSDcwMDZfU1RBUlRfQUNUSVZFCQkJMHgwNworI2RlZmluZSBDSDcwMDZfU1RBUlRfQUNUSVZFXzAJCQkwLCA3OjAKKworI2RlZmluZSBDSDcwMDZfUE9WCQkJCTB4MDgKKyNkZWZpbmUgQ0g3MDA2X1BPVl9TVEFSVF9BQ1RJVkVfOAkJOCwgMjoyCisjZGVmaW5lIENINzAwNl9QT1ZfSFBPU184CQkJOCwgMToxCisjZGVmaW5lIENINzAwNl9QT1ZfVlBPU184CQkJOCwgMDowCisKKyNkZWZpbmUgQ0g3MDA2X0JMQUNLX0xFVkVMCQkJMHgwOQorI2RlZmluZSBDSDcwMDZfQkxBQ0tfTEVWRUxfMAkJCTAsIDc6MAorCisjZGVmaW5lIENINzAwNl9IUE9TCQkJCTB4MGEKKyNkZWZpbmUgQ0g3MDA2X0hQT1NfMAkJCQkwLCA3OjAKKworI2RlZmluZSBDSDcwMDZfVlBPUwkJCQkweDBiCisjZGVmaW5lIENINzAwNl9WUE9TXzAJCQkJMCwgNzowCisKKyNkZWZpbmUgQ0g3MDA2X0lOUFVUX1NZTkMJCQkweDBkCisjZGVmaW5lIENINzAwNl9JTlBVVF9TWU5DX0VNQkVEREVECQkoMSA8PCAzKQorI2RlZmluZSBDSDcwMDZfSU5QVVRfU1lOQ19PVVRQVVQJCSgxIDw8IDIpCisjZGVmaW5lIENINzAwNl9JTlBVVF9TWU5DX1BWU1lOQwkJKDEgPDwgMSkKKyNkZWZpbmUgQ0g3MDA2X0lOUFVUX1NZTkNfUEhTWU5DCQkoMSA8PCAwKQorCisjZGVmaW5lIENINzAwNl9QT1dFUgkJCQkweDBlCisjZGVmaW5lIENINzAwNl9QT1dFUl9TQ0FSVAkJCSgxIDw8IDQpCisjZGVmaW5lIENINzAwNl9QT1dFUl9SRVNFVAkJCSgxIDw8IDMpCisjZGVmaW5lIENINzAwNl9QT1dFUl9MRVZFTAkJCTAsIDI6MAorI2RlZmluZSBDSDcwMDZfUE9XRVJfTEVWRUxfQ1ZCU19PRkYJCTB4MAorI2RlZmluZSBDSDcwMDZfUE9XRVJfTEVWRUxfUE9XRVJfT0ZGCQkweDEKKyNkZWZpbmUgQ0g3MDA2X1BPV0VSX0xFVkVMX1NWSURFT19PRkYJCTB4MgorI2RlZmluZSBDSDcwMDZfUE9XRVJfTEVWRUxfTk9STUFMCQkweDMKKyNkZWZpbmUgQ0g3MDA2X1BPV0VSX0xFVkVMX0ZVTExfUE9XRVJfT0ZGCTB4NAorCisjZGVmaW5lIENINzAwNl9ERVRFQ1QJCQkJMHgxMAorI2RlZmluZSBDSDcwMDZfREVURUNUX1NWSURFT19ZX1RFU1QJCSgxIDw8IDMpCisjZGVmaW5lIENINzAwNl9ERVRFQ1RfU1ZJREVPX0NfVEVTVAkJKDEgPDwgMikKKyNkZWZpbmUgQ0g3MDA2X0RFVEVDVF9DVkJTX1RFU1QJCQkoMSA8PCAxKQorI2RlZmluZSBDSDcwMDZfREVURUNUX1NFTlNFCQkJKDEgPDwgMCkKKworI2RlZmluZSBDSDcwMDZfQ09OVFJBU1QJCQkJMHgxMQorI2RlZmluZSBDSDcwMDZfQ09OVFJBU1RfMAkJCTAsIDI6MAorCisjZGVmaW5lIENINzAwNl9QTExPVgkgCQkJMHgxMworI2RlZmluZSBDSDcwMDZfUExMT1ZfTl84CSAJCTgsIDI6MQorI2RlZmluZSBDSDcwMDZfUExMT1ZfTV84CSAJCTgsIDA6MAorCisjZGVmaW5lIENINzAwNl9QTExNCSAJCQkweDE0CisjZGVmaW5lIENINzAwNl9QTExNXzAJIAkJCTAsIDc6MAorCisjZGVmaW5lIENINzAwNl9QTExOCSAJCQkweDE1CisjZGVmaW5lIENINzAwNl9QTExOXzAJIAkJCTAsIDc6MAorCisjZGVmaW5lIENINzAwNl9CQ0xLT1VUCSAJCQkweDE3CisKKyNkZWZpbmUgQ0g3MDA2X1NVQkNfSU5DMAkJCTB4MTgKKyNkZWZpbmUgQ0g3MDA2X1NVQkNfSU5DMF8yOAkJCTI4LCAzOjAKKworI2RlZmluZSBDSDcwMDZfU1VCQ19JTkMxCQkJMHgxOQorI2RlZmluZSBDSDcwMDZfU1VCQ19JTkMxXzI0CQkJMjQsIDM6MAorCisjZGVmaW5lIENINzAwNl9TVUJDX0lOQzIJCQkweDFhCisjZGVmaW5lIENINzAwNl9TVUJDX0lOQzJfMjAJCQkyMCwgMzowCisKKyNkZWZpbmUgQ0g3MDA2X1NVQkNfSU5DMwkJCTB4MWIKKyNkZWZpbmUgQ0g3MDA2X1NVQkNfSU5DM19HUElPMV9WQUwJCSgxIDw8IDcpCisjZGVmaW5lIENINzAwNl9TVUJDX0lOQzNfR1BJTzBfVkFMCQkoMSA8PCA2KQorI2RlZmluZSBDSDcwMDZfU1VCQ19JTkMzX1BPVVRfM18zVgkJKDEgPDwgNSkKKyNkZWZpbmUgQ0g3MDA2X1NVQkNfSU5DM19QT1VUX0lOVgkJKDEgPDwgNCkKKyNkZWZpbmUgQ0g3MDA2X1NVQkNfSU5DM18xNgkJCTE2LCAzOjAKKworI2RlZmluZSBDSDcwMDZfU1VCQ19JTkM0CQkJMHgxYworI2RlZmluZSBDSDcwMDZfU1VCQ19JTkM0X0dQSU8xX0lOCQkoMSA8PCA3KQorI2RlZmluZSBDSDcwMDZfU1VCQ19JTkM0X0dQSU8wX0lOCQkoMSA8PCA2KQorI2RlZmluZSBDSDcwMDZfU1VCQ19JTkM0X0RTX0lOUFVUCQkoMSA8PCA0KQorI2RlZmluZSBDSDcwMDZfU1VCQ19JTkM0XzEyCQkJMTIsIDM6MAorCisjZGVmaW5lIENINzAwNl9TVUJDX0lOQzUJCQkweDFkCisjZGVmaW5lIENINzAwNl9TVUJDX0lOQzVfOAkJCTgsIDM6MAorCisjZGVmaW5lIENINzAwNl9TVUJDX0lOQzYJCQkweDFlCisjZGVmaW5lIENINzAwNl9TVUJDX0lOQzZfNAkJCTQsIDM6MAorCisjZGVmaW5lIENINzAwNl9TVUJDX0lOQzcJCQkweDFmCisjZGVmaW5lIENINzAwNl9TVUJDX0lOQzdfMAkJCTAsIDM6MAorCisjZGVmaW5lIENINzAwNl9QTExfQ09OVFJPTAkJCTB4MjAKKyNkZWZpbmUgQ0g3MDA2X1BMTF9DT05UUk9MX0NQSQkJCSgxIDw8IDUpCisjZGVmaW5lIENINzAwNl9QTExfQ09OVFJPTF9DQVBBQ0lUT1IJCSgxIDw8IDQpCisjZGVmaW5lIENINzAwNl9QTExfQ09OVFJPTF83U1RBR0VTCQkoMSA8PCAzKQorI2RlZmluZSBDSDcwMDZfUExMX0NPTlRST0xfRElHSVRBTF81VgkJKDEgPDwgMikKKyNkZWZpbmUgQ0g3MDA2X1BMTF9DT05UUk9MX0FOQUxPR181VgkJKDEgPDwgMSkKKyNkZWZpbmUgQ0g3MDA2X1BMTF9DT05UUk9MX01FTU9SWV81VgkJKDEgPDwgMCkKKworI2RlZmluZSBDSDcwMDZfQ0FMQ19TVUJDX0lOQzAJCQkweDIxCisjZGVmaW5lIENINzAwNl9DQUxDX1NVQkNfSU5DMF8yNAkJMjQsIDQ6MworI2RlZmluZSBDSDcwMDZfQ0FMQ19TVUJDX0lOQzBfSFlTVAkJMCwgMjoxCisjZGVmaW5lIENINzAwNl9DQUxDX1NVQkNfSU5DMF9BVVRPCQkoMSA8PCAwKQorCisjZGVmaW5lIENINzAwNl9DQUxDX1NVQkNfSU5DMQkJCTB4MjIKKyNkZWZpbmUgQ0g3MDA2X0NBTENfU1VCQ19JTkMxXzE2CQkxNiwgNzowCisKKyNkZWZpbmUgQ0g3MDA2X0NBTENfU1VCQ19JTkMyCQkJMHgyMworI2RlZmluZSBDSDcwMDZfQ0FMQ19TVUJDX0lOQzJfOAkJCTgsIDc6MAorCisjZGVmaW5lIENINzAwNl9DQUxDX1NVQkNfSU5DMwkJCTB4MjQKKyNkZWZpbmUgQ0g3MDA2X0NBTENfU1VCQ19JTkMzXzAJCQkwLCA3OjAKKworI2RlZmluZSBDSDcwMDZfVkVSU0lPTl9JRAkJCTB4MjUKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9LY29uZmlnIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODIzZTYzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvS2NvbmZpZwpAQCAtMCwwICsxLDQ0IEBACitjb25maWcgRFJNX05PVVZFQVUKKwl0cmlzdGF0ZSAiTm91dmVhdSAoblZpZGlhKSBjYXJkcyIKKwlkZXBlbmRzIG9uIERSTQorICAgICAgICBzZWxlY3QgRldfTE9BREVSCisJc2VsZWN0IERSTV9LTVNfSEVMUEVSCisJc2VsZWN0IERSTV9UVE0KKwlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCisJc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQorCXNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCisJc2VsZWN0IEZCCisJc2VsZWN0IEZSQU1FQlVGRkVSX0NPTlNPTEUgaWYgIUVNQkVEREVECisJc2VsZWN0IEZCX0JBQ0tMSUdIVCBpZiBEUk1fTk9VVkVBVV9CQUNLTElHSFQKKwloZWxwCisJICBDaG9vc2UgdGhpcyBvcHRpb24gZm9yIG9wZW4tc291cmNlIG5WaWRpYSBzdXBwb3J0LgorCitjb25maWcgRFJNX05PVVZFQVVfQkFDS0xJR0hUCisJYm9vbCAiU3VwcG9ydCBmb3IgYmFja2xpZ2h0IGNvbnRyb2wiCisJZGVwZW5kcyBvbiBEUk1fTk9VVkVBVQorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29udHJvbCB0aGUgYmFja2xpZ2h0IG9mIHlvdXIgZGlzcGxheQorCSAgKGUuZy4gYSBsYXB0b3AgcGFuZWwpLgorCitjb25maWcgRFJNX05PVVZFQVVfREVCVUcKKwlib29sICJCdWlsZCBpbiBOb3V2ZWF1J3MgZGVidWdmcyBzdXBwb3J0IgorCWRlcGVuZHMgb24gRFJNX05PVVZFQVUgJiYgREVCVUdfRlMKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IE5vdXZlYXUgdG8gb3V0cHV0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbgorCSAgdmlhIGRlYnVnZnMuCisKK21lbnUgIkkyQyBlbmNvZGVyIG9yIGhlbHBlciBjaGlwcyIKKyAgICAgZGVwZW5kcyBvbiBEUk0KKworY29uZmlnIERSTV9JMkNfQ0g3MDA2CisJdHJpc3RhdGUgIkNocm9udGVsIGNoNzAwNiBUViBlbmNvZGVyIgorCWRlZmF1bHQgbSBpZiBEUk1fTk9VVkVBVQorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIENocm9udGVsIGNoNzAwNiBhbmQgc2ltaWxhciBUViBlbmNvZGVycywgZm91bmQKKwkgIG9uIHNvbWUgblZpZGlhIHZpZGVvIGNhcmRzLgorCisJICBUaGlzIGRyaXZlciBpcyBjdXJyZW50bHkgb25seSB1c2VmdWwgaWYgeW91J3JlIGFsc28gdXNpbmcKKwkgIHRoZSBub3V2ZWF1IGRyaXZlci4KK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ5MGQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L01ha2VmaWxlCkBAIC0wLDAgKzEsMzEgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBkcm0gZGV2aWNlIGRyaXZlci4gIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZQorIyBEaXJlY3QgUmVuZGVyaW5nIEluZnJhc3RydWN0dXJlIChEUkkpIGluIFhGcmVlODYgNC4xLjAgYW5kIGhpZ2hlci4KKworY2NmbGFncy15IDo9IC1JaW5jbHVkZS9kcm0KK25vdXZlYXUteSA6PSBub3V2ZWF1X2Rydi5vIG5vdXZlYXVfc3RhdGUubyBub3V2ZWF1X2NoYW5uZWwubyBub3V2ZWF1X21lbS5vIFwKKyAgICAgICAgICAgICBub3V2ZWF1X29iamVjdC5vIG5vdXZlYXVfaXJxLm8gbm91dmVhdV9ub3RpZmllci5vIFwKKyAgICAgICAgICAgICBub3V2ZWF1X3NnZG1hLm8gbm91dmVhdV9kbWEubyBcCisgICAgICAgICAgICAgbm91dmVhdV9iby5vIG5vdXZlYXVfZmVuY2UubyBub3V2ZWF1X2dlbS5vIG5vdXZlYXVfdHRtLm8gXAorICAgICAgICAgICAgIG5vdXZlYXVfaHcubyBub3V2ZWF1X2NhbGMubyBub3V2ZWF1X2Jpb3MubyBub3V2ZWF1X2kyYy5vIFwKKwkgICAgIG5vdXZlYXVfZGlzcGxheS5vIG5vdXZlYXVfY29ubmVjdG9yLm8gbm91dmVhdV9mYmNvbi5vIFwKKwkgICAgIG5vdXZlYXVfZHAubyBcCisgICAgICAgICAgICAgbnYwNF90aW1lci5vIFwKKyAgICAgICAgICAgICBudjA0X21jLm8gbnY0MF9tYy5vIG52NTBfbWMubyBcCisgICAgICAgICAgICAgbnYwNF9mYi5vIG52MTBfZmIubyBudjQwX2ZiLm8gXAorICAgICAgICAgICAgIG52MDRfZmlmby5vIG52MTBfZmlmby5vIG52NDBfZmlmby5vIG52NTBfZmlmby5vIFwKKyAgICAgICAgICAgICBudjA0X2dyYXBoLm8gbnYxMF9ncmFwaC5vIG52MjBfZ3JhcGgubyBcCisgICAgICAgICAgICAgbnY0MF9ncmFwaC5vIG52NTBfZ3JhcGgubyBcCisgICAgICAgICAgICAgbnYwNF9pbnN0bWVtLm8gbnY1MF9pbnN0bWVtLm8gXAorICAgICAgICAgICAgIG52NTBfY3J0Yy5vIG52NTBfZGFjLm8gbnY1MF9zb3IubyBcCisgICAgICAgICAgICAgbnY1MF9jdXJzb3IubyBudjUwX2Rpc3BsYXkubyBudjUwX2ZiY29uLm8gXAorICAgICAgICAgICAgIG52MDRfZGFjLm8gbnYwNF9kZnAubyBudjA0X3R2Lm8gbnYxN190di5vIG52MTdfdHZfbW9kZXMubyBcCisgICAgICAgICAgICAgbnYwNF9jcnRjLm8gbnYwNF9kaXNwbGF5Lm8gbnYwNF9jdXJzb3IubyBudjA0X2ZiY29uLm8gXAorICAgICAgICAgICAgIG52MTdfZ3Bpby5vCisKK25vdXZlYXUtJChDT05GSUdfRFJNX05PVVZFQVVfREVCVUcpICs9IG5vdXZlYXVfZGVidWdmcy5vCitub3V2ZWF1LSQoQ09ORklHX0NPTVBBVCkgKz0gbm91dmVhdV9pb2MzMi5vCitub3V2ZWF1LSQoQ09ORklHX0RSTV9OT1VWRUFVX0JBQ0tMSUdIVCkgKz0gbm91dmVhdV9iYWNrbGlnaHQubworbm91dmVhdS0kKENPTkZJR19BQ1BJKSArPSBub3V2ZWF1X2FjcGkubworCitvYmotJChDT05GSUdfRFJNX05PVVZFQVUpKz0gbm91dmVhdS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2FjcGkuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYWNwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZjQ4ODIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2FjcGkuYwpAQCAtMCwwICsxLDEyNSBAQAorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgorI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJkcm1fc2FyZWEuaCIKKyNpbmNsdWRlICJkcm1fY3J0Y19oZWxwZXIuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCisjaW5jbHVkZSAibnY1MF9kaXNwbGF5LmgiCisKKyNkZWZpbmUgTk9VVkVBVV9EU01fU1VQUE9SVEVEIDB4MDAKKyNkZWZpbmUgTk9VVkVBVV9EU01fU1VQUE9SVEVEX0ZVTkNUSU9OUyAweDAwCisKKyNkZWZpbmUgTk9VVkVBVV9EU01fQUNUSVZFIDB4MDEKKyNkZWZpbmUgTk9VVkVBVV9EU01fQUNUSVZFX1FVRVJZIDB4MDAKKworI2RlZmluZSBOT1VWRUFVX0RTTV9MRUQgMHgwMgorI2RlZmluZSBOT1VWRUFVX0RTTV9MRURfU1RBVEUgMHgwMAorI2RlZmluZSBOT1VWRUFVX0RTTV9MRURfT0ZGIDB4MTAKKyNkZWZpbmUgTk9VVkVBVV9EU01fTEVEX1NUQU1JTkEgMHgxMQorI2RlZmluZSBOT1VWRUFVX0RTTV9MRURfU1BFRUQgMHgxMgorCisjZGVmaW5lIE5PVVZFQVVfRFNNX1BPV0VSIDB4MDMKKyNkZWZpbmUgTk9VVkVBVV9EU01fUE9XRVJfU1RBVEUgMHgwMAorI2RlZmluZSBOT1VWRUFVX0RTTV9QT1dFUl9TUEVFRCAweDAxCisjZGVmaW5lIE5PVVZFQVVfRFNNX1BPV0VSX1NUQU1JTkEgMHgwMgorCitzdGF0aWMgaW50IG5vdXZlYXVfZHNtKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBmdW5jLCBpbnQgYXJnLCBpbnQgKnJlc3VsdCkKK3sKKwlzdGF0aWMgY2hhciBtdWlkW10gPSB7CisJCTB4QTAsIDB4QTAsIDB4OTUsIDB4OUQsIDB4NjAsIDB4MDAsIDB4NDgsIDB4NEQsCisJCTB4QjMsIDB4NEQsIDB4N0UsIDB4NUYsIDB4RUEsIDB4MTIsIDB4OUYsIDB4RDQsCisJfTsKKworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2LT5wZGV2OworCXN0cnVjdCBhY3BpX2hhbmRsZSAqaGFuZGxlOworCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXRwdXQgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgaW5wdXQ7CisJdW5pb24gYWNwaV9vYmplY3QgcGFyYW1zWzRdOworCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7CisJaW50IGVycjsKKworCWhhbmRsZSA9IERFVklDRV9BQ1BJX0hBTkRMRSgmcGRldi0+ZGV2KTsKKworCWlmICghaGFuZGxlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlucHV0LmNvdW50ID0gNDsKKwlpbnB1dC5wb2ludGVyID0gcGFyYW1zOworCXBhcmFtc1swXS50eXBlID0gQUNQSV9UWVBFX0JVRkZFUjsKKwlwYXJhbXNbMF0uYnVmZmVyLmxlbmd0aCA9IHNpemVvZihtdWlkKTsKKwlwYXJhbXNbMF0uYnVmZmVyLnBvaW50ZXIgPSAoY2hhciAqKW11aWQ7CisJcGFyYW1zWzFdLnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUjsKKwlwYXJhbXNbMV0uaW50ZWdlci52YWx1ZSA9IDB4MDAwMDAxMDI7CisJcGFyYW1zWzJdLnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUjsKKwlwYXJhbXNbMl0uaW50ZWdlci52YWx1ZSA9IGZ1bmM7CisJcGFyYW1zWzNdLnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUjsKKwlwYXJhbXNbM10uaW50ZWdlci52YWx1ZSA9IGFyZzsKKworCWVyciA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgIl9EU00iLCAmaW5wdXQsICZvdXRwdXQpOworCWlmIChlcnIpIHsKKwkJTlZfSU5GTyhkZXYsICJmYWlsZWQgdG8gZXZhbHVhdGUgX0RTTTogJWRcbiIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJb2JqID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopb3V0cHV0LnBvaW50ZXI7CisKKwlpZiAob2JqLT50eXBlID09IEFDUElfVFlQRV9JTlRFR0VSKQorCQlpZiAob2JqLT5pbnRlZ2VyLnZhbHVlID09IDB4ODAwMDAwMDIpCisJCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChvYmotPnR5cGUgPT0gQUNQSV9UWVBFX0JVRkZFUikgeworCQlpZiAob2JqLT5idWZmZXIubGVuZ3RoID09IDQgJiYgcmVzdWx0KSB7CisJCQkqcmVzdWx0ID0gMDsKKwkJCSpyZXN1bHQgfD0gb2JqLT5idWZmZXIucG9pbnRlclswXTsKKwkJCSpyZXN1bHQgfD0gKG9iai0+YnVmZmVyLnBvaW50ZXJbMV0gPDwgOCk7CisJCQkqcmVzdWx0IHw9IChvYmotPmJ1ZmZlci5wb2ludGVyWzJdIDw8IDE2KTsKKwkJCSpyZXN1bHQgfD0gKG9iai0+YnVmZmVyLnBvaW50ZXJbM10gPDwgMjQpOworCQl9CisJfQorCisJa2ZyZWUob3V0cHV0LnBvaW50ZXIpOworCXJldHVybiAwOworfQorCitpbnQgbm91dmVhdV9oeWJyaWRfc2V0dXAoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmVzdWx0OworCisJaWYgKG5vdXZlYXVfZHNtKGRldiwgTk9VVkVBVV9EU01fQUNUSVZFLCBOT1VWRUFVX0RTTV9BQ1RJVkVfUVVFUlksCisJCQkJCQkJCSZyZXN1bHQpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCU5WX0lORk8oZGV2LCAiX0RTTSBoYXJkd2FyZSBzdGF0dXMgZ2F2ZSAweCV4XG4iLCByZXN1bHQpOworCisJaWYgKHJlc3VsdCAmIDB4MSkgewkvKiBTdGFtaW5hIG1vZGUgLSBkaXNhYmxlIHRoZSBleHRlcm5hbCBHUFUgKi8KKwkJbm91dmVhdV9kc20oZGV2LCBOT1VWRUFVX0RTTV9MRUQsIE5PVVZFQVVfRFNNX0xFRF9TVEFNSU5BLAorCQkJCQkJCQkJTlVMTCk7CisJCW5vdXZlYXVfZHNtKGRldiwgTk9VVkVBVV9EU01fUE9XRVIsIE5PVVZFQVVfRFNNX1BPV0VSX1NUQU1JTkEsCisJCQkJCQkJCQlOVUxMKTsKKwl9IGVsc2UgewkJLyogRW5zdXJlIHRoYXQgdGhlIGV4dGVybmFsIEdQVSBpcyBlbmFibGVkICovCisJCW5vdXZlYXVfZHNtKGRldiwgTk9VVkVBVV9EU01fTEVELCBOT1VWRUFVX0RTTV9MRURfU1BFRUQsIE5VTEwpOworCQlub3V2ZWF1X2RzbShkZXYsIE5PVVZFQVVfRFNNX1BPV0VSLCBOT1VWRUFVX0RTTV9QT1dFUl9TUEVFRCwKKwkJCQkJCQkJCU5VTEwpOworCX0KKworCXJldHVybiAwOworfQorCitib29sIG5vdXZlYXVfZHNtX3Byb2JlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJaW50IHN1cHBvcnQgPSAwOworCisJaWYgKG5vdXZlYXVfZHNtKGRldiwgTk9VVkVBVV9EU01fU1VQUE9SVEVELAorCQkJCU5PVVZFQVVfRFNNX1NVUFBPUlRFRF9GVU5DVElPTlMsICZzdXBwb3J0KSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKCFzdXBwb3J0KQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYmFja2xpZ2h0LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2JhY2tsaWdodC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNTY0ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2JhY2tsaWdodC5jCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFJlZCBIYXQgPG1qZ0ByZWRoYXQuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisvKgorICogQXV0aG9yczoKKyAqICBNYXR0aGV3IEdhcnJldHQgPG1qZ0ByZWRoYXQuY29tPgorICoKKyAqIFJlZ2lzdGVyIGxvY2F0aW9ucyBkZXJpdmVkIGZyb20gTlZDbG9jayBieSBSb2RlcmljayBDb2xlbmJyYW5kZXIKKyAqLworCisjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+CisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2RybS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfcmVnLmgiCisKK3N0YXRpYyBpbnQgbnY0MF9nZXRfaW50ZW5zaXR5KHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYmxfZ2V0X2RhdGEoYmQpOworCWludCB2YWwgPSAobnZfcmQzMihkZXYsIE5WNDBfUE1DX0JBQ0tMSUdIVCkgJiBOVjQwX1BNQ19CQUNLTElHSFRfTUFTSykKKwkJCQkJCQkJCT4+IDE2OworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludCBudjQwX3NldF9pbnRlbnNpdHkoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBibF9nZXRfZGF0YShiZCk7CisJaW50IHZhbCA9IGJkLT5wcm9wcy5icmlnaHRuZXNzOworCWludCByZWcgPSBudl9yZDMyKGRldiwgTlY0MF9QTUNfQkFDS0xJR0hUKTsKKworCW52X3dyMzIoZGV2LCBOVjQwX1BNQ19CQUNLTElHSFQsCisJCSAodmFsIDw8IDE2KSB8IChyZWcgJiB+TlY0MF9QTUNfQkFDS0xJR0hUX01BU0spKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9vcHMgbnY0MF9ibF9vcHMgPSB7CisJLm9wdGlvbnMgPSBCTF9DT1JFX1NVU1BFTkRSRVNVTUUsCisJLmdldF9icmlnaHRuZXNzID0gbnY0MF9nZXRfaW50ZW5zaXR5LAorCS51cGRhdGVfc3RhdHVzID0gbnY0MF9zZXRfaW50ZW5zaXR5LAorfTsKKworc3RhdGljIGludCBudjUwX2dldF9pbnRlbnNpdHkoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBibF9nZXRfZGF0YShiZCk7CisKKwlyZXR1cm4gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfU09SX0JBQ0tMSUdIVCk7Cit9CisKK3N0YXRpYyBpbnQgbnY1MF9zZXRfaW50ZW5zaXR5KHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYmxfZ2V0X2RhdGEoYmQpOworCWludCB2YWwgPSBiZC0+cHJvcHMuYnJpZ2h0bmVzczsKKworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX1NPUl9CQUNLTElHSFQsCisJCXZhbCB8IE5WNTBfUERJU1BMQVlfU09SX0JBQ0tMSUdIVF9FTkFCTEUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9vcHMgbnY1MF9ibF9vcHMgPSB7CisJLm9wdGlvbnMgPSBCTF9DT1JFX1NVU1BFTkRSRVNVTUUsCisJLmdldF9icmlnaHRuZXNzID0gbnY1MF9nZXRfaW50ZW5zaXR5LAorCS51cGRhdGVfc3RhdHVzID0gbnY1MF9zZXRfaW50ZW5zaXR5LAorfTsKKworc3RhdGljIGludCBub3V2ZWF1X252NDBfYmFja2xpZ2h0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZDsKKworCWlmICghKG52X3JkMzIoZGV2LCBOVjQwX1BNQ19CQUNLTElHSFQpICYgTlY0MF9QTUNfQkFDS0xJR0hUX01BU0spKQorCQlyZXR1cm4gMDsKKworCWJkID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcigibnZfYmFja2xpZ2h0IiwgJmRldi0+cGRldi0+ZGV2LCBkZXYsCisJCQkJICAgICAgICZudjQwX2JsX29wcyk7CisJaWYgKElTX0VSUihiZCkpCisJCXJldHVybiBQVFJfRVJSKGJkKTsKKworCWRldl9wcml2LT5iYWNrbGlnaHQgPSBiZDsKKwliZC0+cHJvcHMubWF4X2JyaWdodG5lc3MgPSAzMTsKKwliZC0+cHJvcHMuYnJpZ2h0bmVzcyA9IG52NDBfZ2V0X2ludGVuc2l0eShiZCk7CisJYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMoYmQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbm91dmVhdV9udjUwX2JhY2tsaWdodF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQ7CisKKwlpZiAoIW52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX1NPUl9CQUNLTElHSFQpKQorCQlyZXR1cm4gMDsKKworCWJkID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcigibnZfYmFja2xpZ2h0IiwgJmRldi0+cGRldi0+ZGV2LCBkZXYsCisJCQkJICAgICAgICZudjUwX2JsX29wcyk7CisJaWYgKElTX0VSUihiZCkpCisJCXJldHVybiBQVFJfRVJSKGJkKTsKKworCWRldl9wcml2LT5iYWNrbGlnaHQgPSBiZDsKKwliZC0+cHJvcHMubWF4X2JyaWdodG5lc3MgPSAxMDI1OworCWJkLT5wcm9wcy5icmlnaHRuZXNzID0gbnY1MF9nZXRfaW50ZW5zaXR5KGJkKTsKKwliYWNrbGlnaHRfdXBkYXRlX3N0YXR1cyhiZCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBub3V2ZWF1X2JhY2tsaWdodF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCXN3aXRjaCAoZGV2X3ByaXYtPmNhcmRfdHlwZSkgeworCWNhc2UgTlZfNDA6CisJCXJldHVybiBub3V2ZWF1X252NDBfYmFja2xpZ2h0X2luaXQoZGV2KTsKKwljYXNlIE5WXzUwOgorCQlyZXR1cm4gbm91dmVhdV9udjUwX2JhY2tsaWdodF9pbml0KGRldik7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbm91dmVhdV9iYWNrbGlnaHRfZXhpdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoZGV2X3ByaXYtPmJhY2tsaWdodCkgeworCQliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoZGV2X3ByaXYtPmJhY2tsaWdodCk7CisJCWRldl9wcml2LT5iYWNrbGlnaHQgPSBOVUxMOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYmlvcy5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iaW9zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVlYzVlZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYmlvcy5jCkBAIC0wLDAgKzEsNjA5NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgRXJpayBXYWxpbmcKKyAqIENvcHlyaWdodCAyMDA2IFN0ZXBoYW5lIE1hcmNoZXNpbgorICogQ29weXJpZ2h0IDIwMDctMjAwOSBTdHVhcnQgQmVubmV0dAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNkZWZpbmUgTlZfREVCVUdfTk9UUkFDRQorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9ody5oIgorCisvKiB0aGVzZSBkZWZpbmVzIGFyZSBtYWRlIHVwICovCisjZGVmaW5lIE5WX0NJT19DUkVfNDRfSEVBREEgMHgwCisjZGVmaW5lIE5WX0NJT19DUkVfNDRfSEVBREIgMHgzCisjZGVmaW5lIEZFQVRVUkVfTU9CSUxFIDB4MTAJLyogYWxzbyBGRUFUVVJFX1FVQURSTyBmb3IgQk1QICovCisjZGVmaW5lIExFR0FDWV9JMkNfQ1JUIDB4ODAKKyNkZWZpbmUgTEVHQUNZX0kyQ19QQU5FTCAweDgxCisjZGVmaW5lIExFR0FDWV9JMkNfVFYgMHg4MgorCisjZGVmaW5lIEVESUQxX0xFTiAxMjgKKworI2RlZmluZSBCSU9TTE9HKHNpcCwgZm10LCBhcmcuLi4pIE5WX0RFQlVHKHNpcC0+ZGV2LCBmbXQsICMjYXJnKQorI2RlZmluZSBMT0dfT0xEX1ZBTFVFKHgpCisKKyNkZWZpbmUgUk9NMTYoeCkgbGUxNl90b19jcHUoKih1aW50MTZfdCAqKSYoeCkpCisjZGVmaW5lIFJPTTMyKHgpIGxlMzJfdG9fY3B1KCoodWludDMyX3QgKikmKHgpKQorCitzdHJ1Y3QgaW5pdF9leGVjIHsKKwlib29sIGV4ZWN1dGU7CisJYm9vbCByZXBlYXQ7Cit9OworCitzdGF0aWMgYm9vbCBudl9ja3N1bShjb25zdCB1aW50OF90ICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworCS8qCisJICogVGhlcmUncyBhIGZldyBjaGVja3N1bXMgaW4gdGhlIEJJT1MsIHNvIGhlcmUncyBhIGdlbmVyaWMgY2hlY2tpbmcKKwkgKiBmdW5jdGlvbi4KKwkgKi8KKwlpbnQgaTsKKwl1aW50OF90IHN1bSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCXN1bSArPSBkYXRhW2ldOworCisJaWYgKHN1bSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQKK3Njb3JlX3ZiaW9zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIGNvbnN0IGJvb2wgd3JpdGVhYmxlKQoreworCWlmICghKGRhdGFbMF0gPT0gMHg1NSAmJiBkYXRhWzFdID09IDB4QUEpKSB7CisJCU5WX1RSQUNFV0FSTihkZXYsICIuLi4gQklPUyBzaWduYXR1cmUgbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG52X2Nrc3VtKGRhdGEsIGRhdGFbMl0gKiA1MTIpKSB7CisJCU5WX1RSQUNFV0FSTihkZXYsICIuLi4gQklPUyBjaGVja3N1bSBpbnZhbGlkXG4iKTsKKwkJLyogaWYgYSBybyBpbWFnZSBpcyBzb21ld2hhdCBiYWQsIGl0J3MgcHJvYmFibHkgYWxsIHJ1YmJpc2ggKi8KKwkJcmV0dXJuIHdyaXRlYWJsZSA/IDIgOiAxOworCX0gZWxzZQorCQlOVl9UUkFDRShkZXYsICIuLi4gYXBwZWFycyB0byBiZSB2YWxpZFxuIik7CisKKwlyZXR1cm4gMzsKK30KKworc3RhdGljIHZvaWQgbG9hZF92Ymlvc19wcm9tKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQ4X3QgKmRhdGEpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1aW50MzJfdCBwY2lfbnZfMjAsIHNhdmVfcGNpX252XzIwOworCWludCBwY2lyX3B0cjsKKwlpbnQgaTsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwKQorCQlwY2lfbnZfMjAgPSAweDg4MDUwOworCWVsc2UKKwkJcGNpX252XzIwID0gTlZfUEJVU19QQ0lfTlZfMjA7CisKKwkvKiBlbmFibGUgUk9NIGFjY2VzcyAqLworCXNhdmVfcGNpX252XzIwID0gbnZSZWFkTUMoZGV2LCBwY2lfbnZfMjApOworCW52V3JpdGVNQyhkZXYsIHBjaV9udl8yMCwKKwkJICBzYXZlX3BjaV9udl8yMCAmIH5OVl9QQlVTX1BDSV9OVl8yMF9ST01fU0hBRE9XX0VOQUJMRUQpOworCisJLyogYmFpbCBpZiBubyByb20gc2lnbmF0dXJlICovCisJaWYgKG52X3JkMDgoZGV2LCBOVl9QUk9NX09GRlNFVCkgIT0gMHg1NSB8fAorCSAgICBudl9yZDA4KGRldiwgTlZfUFJPTV9PRkZTRVQgKyAxKSAhPSAweGFhKQorCQlnb3RvIG91dDsKKworCS8qIGFkZGl0aW9uYWwgY2hlY2sgKHNlZSBub3RlIGJlbG93KSAtIHJlYWQgUENJIHJlY29yZCBoZWFkZXIgKi8KKwlwY2lyX3B0ciA9IG52X3JkMDgoZGV2LCBOVl9QUk9NX09GRlNFVCArIDB4MTgpIHwKKwkJICAgbnZfcmQwOChkZXYsIE5WX1BST01fT0ZGU0VUICsgMHgxOSkgPDwgODsKKwlpZiAobnZfcmQwOChkZXYsIE5WX1BST01fT0ZGU0VUICsgcGNpcl9wdHIpICE9ICdQJyB8fAorCSAgICBudl9yZDA4KGRldiwgTlZfUFJPTV9PRkZTRVQgKyBwY2lyX3B0ciArIDEpICE9ICdDJyB8fAorCSAgICBudl9yZDA4KGRldiwgTlZfUFJPTV9PRkZTRVQgKyBwY2lyX3B0ciArIDIpICE9ICdJJyB8fAorCSAgICBudl9yZDA4KGRldiwgTlZfUFJPTV9PRkZTRVQgKyBwY2lyX3B0ciArIDMpICE9ICdSJykKKwkJZ290byBvdXQ7CisKKwkvKiBvbiBzb21lIDY2MDBHVC82ODAwTEUgcHJvbSByZWFkcyBhcmUgbWVzc2VkIHVwLiAgbnZjbG9jayBhbGxlZ2VzIGEKKwkgKiBhIGdvb2QgcmVhZCBtYXkgYmUgb2J0YWluZWQgYnkgd2FpdGluZyBvciByZS1yZWFkaW5nIChjYXJnb2N1bHQ6IDV4KQorCSAqIGVhY2ggYnl0ZS4gIHdlJ2xsIGhvcGUgcHJhbWluIGhhcyBzb21ldGhpbmcgdXNhYmxlIGluc3RlYWQKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlZfUFJPTV9TSVpFOyBpKyspCisJCWRhdGFbaV0gPSBudl9yZDA4KGRldiwgTlZfUFJPTV9PRkZTRVQgKyBpKTsKKworb3V0OgorCS8qIGRpc2FibGUgUk9NIGFjY2VzcyAqLworCW52V3JpdGVNQyhkZXYsIHBjaV9udl8yMCwKKwkJICBzYXZlX3BjaV9udl8yMCB8IE5WX1BCVVNfUENJX05WXzIwX1JPTV9TSEFET1dfRU5BQkxFRCk7Cit9CisKK3N0YXRpYyB2b2lkIGxvYWRfdmJpb3NfcHJhbWluKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQ4X3QgKmRhdGEpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1aW50MzJfdCBvbGRfYmFyMF9wcmFtaW4gPSAwOworCWludCBpOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApIHsKKwkJdWludDMyX3QgdmJpb3NfdnJhbSA9IChudl9yZDMyKGRldiwgMHg2MTlmMDQpICYgfjB4ZmYpIDw8IDg7CisKKwkJaWYgKCF2Ymlvc192cmFtKQorCQkJdmJpb3NfdnJhbSA9IChudl9yZDMyKGRldiwgMHgxNzAwKSA8PCAxNikgKyAweGYwMDAwOworCisJCW9sZF9iYXIwX3ByYW1pbiA9IG52X3JkMzIoZGV2LCAweDE3MDApOworCQludl93cjMyKGRldiwgMHgxNzAwLCB2Ymlvc192cmFtID4+IDE2KTsKKwl9CisKKwkvKiBiYWlsIGlmIG5vIHJvbSBzaWduYXR1cmUgKi8KKwlpZiAobnZfcmQwOChkZXYsIE5WX1BSQU1JTl9PRkZTRVQpICE9IDB4NTUgfHwKKwkgICAgbnZfcmQwOChkZXYsIE5WX1BSQU1JTl9PRkZTRVQgKyAxKSAhPSAweGFhKQorCQlnb3RvIG91dDsKKworCWZvciAoaSA9IDA7IGkgPCBOVl9QUk9NX1NJWkU7IGkrKykKKwkJZGF0YVtpXSA9IG52X3JkMDgoZGV2LCBOVl9QUkFNSU5fT0ZGU0VUICsgaSk7CisKK291dDoKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkKKwkJbnZfd3IzMihkZXYsIDB4MTcwMCwgb2xkX2JhcjBfcHJhbWluKTsKK30KKworc3RhdGljIHZvaWQgbG9hZF92Ymlvc19wY2koc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDhfdCAqZGF0YSkKK3sKKwl2b2lkIF9faW9tZW0gKnJvbSA9IE5VTEw7CisJc2l6ZV90IHJvbV9sZW47CisJaW50IHJldDsKKworCXJldCA9IHBjaV9lbmFibGVfcm9tKGRldi0+cGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuOworCisJcm9tID0gcGNpX21hcF9yb20oZGV2LT5wZGV2LCAmcm9tX2xlbik7CisJaWYgKCFyb20pCisJCWdvdG8gb3V0OworCW1lbWNweV9mcm9taW8oZGF0YSwgcm9tLCByb21fbGVuKTsKKwlwY2lfdW5tYXBfcm9tKGRldi0+cGRldiwgcm9tKTsKKworb3V0OgorCXBjaV9kaXNhYmxlX3JvbShkZXYtPnBkZXYpOworfQorCitzdHJ1Y3QgbWV0aG9kcyB7CisJY29uc3QgY2hhciBkZXNjWzhdOworCXZvaWQgKCpsb2FkYmlvcykoc3RydWN0IGRybV9kZXZpY2UgKiwgdWludDhfdCAqKTsKKwljb25zdCBib29sIHJ3OworCWludCBzY29yZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWV0aG9kcyBudjA0X21ldGhvZHNbXSA9IHsKKwl7ICJQUk9NIiwgbG9hZF92Ymlvc19wcm9tLCBmYWxzZSB9LAorCXsgIlBSQU1JTiIsIGxvYWRfdmJpb3NfcHJhbWluLCB0cnVlIH0sCisJeyAiUENJUk9NIiwgbG9hZF92Ymlvc19wY2ksIHRydWUgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgbWV0aG9kcyBudjUwX21ldGhvZHNbXSA9IHsKKwl7ICJQUkFNSU4iLCBsb2FkX3ZiaW9zX3ByYW1pbiwgdHJ1ZSB9LAorCXsgIlBST00iLCBsb2FkX3ZiaW9zX3Byb20sIGZhbHNlIH0sCisJeyAiUENJUk9NIiwgbG9hZF92Ymlvc19wY2ksIHRydWUgfSwKKwl7IH0KK307CisKK3N0YXRpYyBib29sIE5WU2hhZG93VkJJT1Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDhfdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBtZXRob2RzICptZXRob2RzLCAqbWV0aG9kOworCWludCB0ZXN0c2NvcmUgPSAzOworCisJaWYgKG5vdXZlYXVfdmJpb3MpIHsKKwkJbWV0aG9kID0gbnYwNF9tZXRob2RzOworCQl3aGlsZSAobWV0aG9kLT5sb2FkYmlvcykgeworCQkJaWYgKCFzdHJjYXNlY21wKG5vdXZlYXVfdmJpb3MsIG1ldGhvZC0+ZGVzYykpCisJCQkJYnJlYWs7CisJCQltZXRob2QrKzsKKwkJfQorCisJCWlmIChtZXRob2QtPmxvYWRiaW9zKSB7CisJCQlOVl9JTkZPKGRldiwgIkF0dGVtcHRpbmcgdG8gdXNlIEJJT1MgaW1hZ2UgZnJvbSAlc1xuIiwKKwkJCQltZXRob2QtPmRlc2MpOworCisJCQltZXRob2QtPmxvYWRiaW9zKGRldiwgZGF0YSk7CisJCQlpZiAoc2NvcmVfdmJpb3MoZGV2LCBkYXRhLCBtZXRob2QtPnJ3KSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCU5WX0VSUk9SKGRldiwgIlZCSU9TIHNvdXJjZSBcJyVzXCcgaW52YWxpZFxuIiwgbm91dmVhdV92Ymlvcyk7CisJfQorCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkKKwkJbWV0aG9kcyA9IG52MDRfbWV0aG9kczsKKwllbHNlCisJCW1ldGhvZHMgPSBudjUwX21ldGhvZHM7CisKKwltZXRob2QgPSBtZXRob2RzOworCXdoaWxlIChtZXRob2QtPmxvYWRiaW9zKSB7CisJCU5WX1RSQUNFKGRldiwgIkF0dGVtcHRpbmcgdG8gbG9hZCBCSU9TIGltYWdlIGZyb20gJXNcbiIsCisJCQkgbWV0aG9kLT5kZXNjKTsKKwkJZGF0YVswXSA9IGRhdGFbMV0gPSAwOwkvKiBhdm9pZCByZXVzZSBvZiBwcmV2aW91cyBpbWFnZSAqLworCQltZXRob2QtPmxvYWRiaW9zKGRldiwgZGF0YSk7CisJCW1ldGhvZC0+c2NvcmUgPSBzY29yZV92YmlvcyhkZXYsIGRhdGEsIG1ldGhvZC0+cncpOworCQlpZiAobWV0aG9kLT5zY29yZSA9PSB0ZXN0c2NvcmUpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJbWV0aG9kKys7CisJfQorCisJd2hpbGUgKC0tdGVzdHNjb3JlID4gMCkgeworCQltZXRob2QgPSBtZXRob2RzOworCQl3aGlsZSAobWV0aG9kLT5sb2FkYmlvcykgeworCQkJaWYgKG1ldGhvZC0+c2NvcmUgPT0gdGVzdHNjb3JlKSB7CisJCQkJTlZfVFJBQ0UoZGV2LCAiVXNpbmcgQklPUyBpbWFnZSBmcm9tICVzXG4iLAorCQkJCQkgbWV0aG9kLT5kZXNjKTsKKwkJCQltZXRob2QtPmxvYWRiaW9zKGRldiwgZGF0YSk7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQltZXRob2QrKzsKKwkJfQorCX0KKworCU5WX0VSUk9SKGRldiwgIk5vIHZhbGlkIEJJT1MgaW1hZ2UgZm91bmRcbiIpOworCXJldHVybiBmYWxzZTsKK30KKworc3RydWN0IGluaXRfdGJsX2VudHJ5IHsKKwljaGFyICpuYW1lOworCXVpbnQ4X3QgaWQ7CisJaW50IGxlbmd0aDsKKwlpbnQgbGVuZ3RoX29mZnNldDsKKwlpbnQgbGVuZ3RoX211bHRpcGxpZXI7CisJYm9vbCAoKmhhbmRsZXIpKHN0cnVjdCBudmJpb3MgKiwgdWludDE2X3QsIHN0cnVjdCBpbml0X2V4ZWMgKik7Cit9OworCitzdHJ1Y3QgYml0X2VudHJ5IHsKKwl1aW50OF90IGlkWzJdOworCXVpbnQxNl90IGxlbmd0aDsKKwl1aW50MTZfdCBvZmZzZXQ7Cit9OworCitzdGF0aWMgaW50IHBhcnNlX2luaXRfdGFibGUoc3RydWN0IG52YmlvcyAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBpbml0X2V4ZWMgKik7CisKKyNkZWZpbmUgTUFDUk9fSU5ERVhfU0laRQkyCisjZGVmaW5lIE1BQ1JPX1NJWkUJCTgKKyNkZWZpbmUgQ09ORElUSU9OX1NJWkUJCTEyCisjZGVmaW5lIElPX0ZMQUdfQ09ORElUSU9OX1NJWkUJOQorI2RlZmluZSBJT19DT05ESVRJT05fU0laRQk1CisjZGVmaW5lIE1FTV9JTklUX1NJWkUJCTY2CisKK3N0YXRpYyB2b2lkIHN0aWxsX2FsaXZlKHZvaWQpCit7CisjaWYgMAorCXN5bmMoKTsKKwltc2xlZXAoMik7CisjZW5kaWYKK30KKworc3RhdGljIHVpbnQzMl90CittdW5nZV9yZWcoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDMyX3QgcmVnKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGJpb3MtPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRjYl9lbnRyeSAqZGNiZW50ID0gYmlvcy0+ZGlzcGxheS5vdXRwdXQ7CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKQorCQlyZXR1cm4gcmVnOworCisJaWYgKHJlZyAmIDB4NDAwMDAwMDApIHsKKwkJQlVHX09OKCFkY2JlbnQpOworCisJCXJlZyArPSAoZmZzKGRjYmVudC0+b3IpIC0gMSkgKiAweDgwMDsKKwkJaWYgKChyZWcgJiAweDIwMDAwMDAwKSAmJiAhKGRjYmVudC0+c29yY29uZi5saW5rICYgMSkpCisJCQlyZWcgKz0gMHgwMDAwMDA4MDsKKwl9CisKKwlyZWcgJj0gfjB4NjAwMDAwMDA7CisJcmV0dXJuIHJlZzsKK30KKworc3RhdGljIGludAordmFsaWRfcmVnKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQzMl90IHJlZykKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBiaW9zLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBiaW9zLT5kZXY7CisKKwkvKiBDNTEgaGFzIG1pc2FsaWduZWQgcmVncyBvbiBwdXJwb3NlLiBNYXJ2ZWxsb3VzICovCisJaWYgKHJlZyAmIDB4MiB8fCAocmVnICYgMHgxICYmIGRldl9wcml2LT5WQklPUy5wdWIuY2hpcF92ZXJzaW9uICE9IDB4NTEpKSB7CisJCU5WX0VSUk9SKGRldiwgIj09PT09PT09PT0gbWlzYWxpZ25lZCByZWcgMHglMDhYID09PT09PT09PT1cbiIsCisJCQkgcmVnKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogV2FybiBvbiBDNTEgcmVncyB0aGF0IGhhdmUgbm90IGJlZW4gdmVyaWZpZWQgYWNjZXNzaWJsZSBpbgorCSAqIG1taW90cmFjaW5nCisJICovCisJaWYgKHJlZyAmIDB4MSAmJiBkZXZfcHJpdi0+VkJJT1MucHViLmNoaXBfdmVyc2lvbiA9PSAweDUxICYmCisJICAgIHJlZyAhPSAweDEzMGQgJiYgcmVnICE9IDB4MTMxMSAmJiByZWcgIT0gMHg2MDA4MWQpCisJCU5WX1dBUk4oZGV2LCAiPT09IEM1MSBtaXNhbGlnbmVkIHJlZyAweCUwOFggbm90IHZlcmlmaWVkID09PVxuIiwKKwkJCXJlZyk7CisKKwkvKiBUcnVzdCB0aGUgaW5pdCBzY3JpcHRzIG9uIEc4MCAqLworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwKQorCQlyZXR1cm4gMTsKKworCSNkZWZpbmUgV0lUSElOKHgsIHksIHopICgoeCA+PSB5KSAmJiAoeCA8IHkgKyB6KSkKKwlpZiAoV0lUSElOKHJlZywgTlZfUE1DX09GRlNFVCwgTlZfUE1DX1NJWkUpKQorCQlyZXR1cm4gMTsKKwlpZiAoV0lUSElOKHJlZywgTlZfUEJVU19PRkZTRVQsIE5WX1BCVVNfU0laRSkpCisJCXJldHVybiAxOworCWlmIChXSVRISU4ocmVnLCBOVl9QRklGT19PRkZTRVQsIE5WX1BGSUZPX1NJWkUpKQorCQlyZXR1cm4gMTsKKwlpZiAoZGV2X3ByaXYtPlZCSU9TLnB1Yi5jaGlwX3ZlcnNpb24gPj0gMHgzMCAmJgorCSAgICAoV0lUSElOKHJlZywgMHg0MDAwLCAweDYwMCkgfHwgcmVnID09IDB4MDAwMDQ2MDApKQorCQlyZXR1cm4gMTsKKwlpZiAoZGV2X3ByaXYtPlZCSU9TLnB1Yi5jaGlwX3ZlcnNpb24gPj0gMHg0MCAmJgorCQkJCQkJV0lUSElOKHJlZywgMHhjMDAwLCAweDQ4KSkKKwkJcmV0dXJuIDE7CisJaWYgKGRldl9wcml2LT5WQklPUy5wdWIuY2hpcF92ZXJzaW9uID49IDB4MTcgJiYgcmVnID09IDB4MDAwMGQyMDQpCisJCXJldHVybiAxOworCWlmIChkZXZfcHJpdi0+VkJJT1MucHViLmNoaXBfdmVyc2lvbiA+PSAweDQwKSB7CisJCWlmIChyZWcgPT0gMHgwMDAxMTAxNCB8fCByZWcgPT0gMHgwMDAyMDMyOCkKKwkJCXJldHVybiAxOworCQlpZiAoV0lUSElOKHJlZywgMHg4ODAwMCwgTlZfUEJVU19TSVpFKSkgLyogbmV3IFBCVVMgKi8KKwkJCXJldHVybiAxOworCX0KKwlpZiAoV0lUSElOKHJlZywgTlZfUEZCX09GRlNFVCwgTlZfUEZCX1NJWkUpKQorCQlyZXR1cm4gMTsKKwlpZiAoV0lUSElOKHJlZywgTlZfUEVYVERFVl9PRkZTRVQsIE5WX1BFWFRERVZfU0laRSkpCisJCXJldHVybiAxOworCWlmIChXSVRISU4ocmVnLCBOVl9QQ1JUQzBfT0ZGU0VULCBOVl9QQ1JUQzBfU0laRSAqIDIpKQorCQlyZXR1cm4gMTsKKwlpZiAoV0lUSElOKHJlZywgTlZfUFJBTURBQzBfT0ZGU0VULCBOVl9QUkFNREFDMF9TSVpFICogMikpCisJCXJldHVybiAxOworCWlmIChkZXZfcHJpdi0+VkJJT1MucHViLmNoaXBfdmVyc2lvbiA+PSAweDE3ICYmIHJlZyA9PSAweDAwNzBmZmYwKQorCQlyZXR1cm4gMTsKKwlpZiAoZGV2X3ByaXYtPlZCSU9TLnB1Yi5jaGlwX3ZlcnNpb24gPT0gMHg1MSAmJgorCQkJCVdJVEhJTihyZWcsIE5WX1BSQU1JTl9PRkZTRVQsIE5WX1BSQU1JTl9TSVpFKSkKKwkJcmV0dXJuIDE7CisJI3VuZGVmIFdJVEhJTgorCisJTlZfRVJST1IoZGV2LCAiPT09PT09PT09PSB1bmtub3duIHJlZyAweCUwOFggPT09PT09PT09PVxuIiwgcmVnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgYm9vbAordmFsaWRfaWR4X3BvcnQoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3QgcG9ydCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBiaW9zLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBiaW9zLT5kZXY7CisKKwkvKgorCSAqIElmIGFkZGluZyBtb3JlIHBvcnRzIGhlcmUsIHRoZSByZWFkL3dyaXRlIGZ1bmN0aW9ucyBiZWxvdyB3aWxsIG5lZWQKKwkgKiB1cGRhdGluZyBzbyB0aGF0IHRoZSBjb3JyZWN0IG1taW8gcmFuZ2UgKFBSTUNJTywgUFJNRElPLCBQUk1WSU8pIGlzCisJICogdXNlZCBmb3IgdGhlIHBvcnQgaW4gcXVlc3Rpb24KKwkgKi8KKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7CisJCWlmIChwb3J0ID09IE5WX0NJT19DUlhfX0NPTE9SKQorCQkJcmV0dXJuIHRydWU7CisJCWlmIChwb3J0ID09IE5WX1ZJT19TUlgpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9IGVsc2UgeworCQlpZiAocG9ydCA9PSBOVl9DSU9fQ1JYX19DT0xPUikKKwkJCXJldHVybiB0cnVlOworCX0KKworCU5WX0VSUk9SKGRldiwgIj09PT09PT09PT0gdW5rbm93biBpbmRleGVkIGlvIHBvcnQgMHglMDRYID09PT09PT09PT1cbiIsCisJCSBwb3J0KTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wKK3ZhbGlkX3BvcnQoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3QgcG9ydCkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYmlvcy0+ZGV2OworCisJLyoKKwkgKiBJZiBhZGRpbmcgbW9yZSBwb3J0cyBoZXJlLCB0aGUgcmVhZC93cml0ZSBmdW5jdGlvbnMgYmVsb3cgd2lsbCBuZWVkCisJICogdXBkYXRpbmcgc28gdGhhdCB0aGUgY29ycmVjdCBtbWlvIHJhbmdlIChQUk1DSU8sIFBSTURJTywgUFJNVklPKSBpcworCSAqIHVzZWQgZm9yIHRoZSBwb3J0IGluIHF1ZXN0aW9uCisJICovCisJaWYgKHBvcnQgPT0gTlZfVklPX1ZTRTIpCisJCXJldHVybiB0cnVlOworCisJTlZfRVJST1IoZGV2LCAiPT09PT09PT09PSB1bmtub3duIGlvIHBvcnQgMHglMDRYID09PT09PT09PT1cbiIsIHBvcnQpOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdWludDMyX3QKK2Jpb3NfcmQzMihzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MzJfdCByZWcpCit7CisJdWludDMyX3QgZGF0YTsKKworCXJlZyA9IG11bmdlX3JlZyhiaW9zLCByZWcpOworCWlmICghdmFsaWRfcmVnKGJpb3MsIHJlZykpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBDNTEgc29tZXRpbWVzIHVzZXMgcmVncyB3aXRoIGJpdDAgc2V0IGluIHRoZSBhZGRyZXNzLiBGb3IgdGhlc2UKKwkgKiBjYXNlcyB0aGVyZSBzaG91bGQgZXhpc3QgYSB0cmFuc2xhdGlvbiBpbiBhIEJJT1MgdGFibGUgdG8gYW4gSU8KKwkgKiBwb3J0IGFkZHJlc3Mgd2hpY2ggdGhlIEJJT1MgdXNlcyBmb3IgYWNjZXNzaW5nIHRoZSByZWcKKwkgKgorCSAqIFRoZXNlIG9ubHkgc2VlbSB0byBhcHBlYXIgZm9yIHRoZSBwb3dlciBjb250cm9sIHJlZ3MgdG8gYSBmbGF0IHBhbmVsLAorCSAqIGFuZCB0aGUgR1BJTyByZWdzIGF0IDB4NjAwODEqLiAgSW4gQzUxIG1taW8gdHJhY2VzIHRoZSBub3JtYWwgcmVncworCSAqIGZvciAweDEzMDggYW5kIDB4MTMxMCBhcmUgdXNlZCAtIGhlbmNlIHRoZSBtYXNrIGJlbG93LiAgQW4gUzMKKwkgKiBzdXNwZW5kLXJlc3VtZSBtbWlvIHRyYWNlIGZyb20gYSBDNTEgd2lsbCBiZSByZXF1aXJlZCB0byBzZWUgaWYgdGhpcworCSAqIGlzIHRydWUgZm9yIHRoZSBwb3dlciBtaWNyb2NvZGUgaW4gMHgxNC4uLCBvciB3aGV0aGVyIHRoZSBkaXJlY3QgSU8KKwkgKiBwb3J0IGFjY2VzcyBtZXRob2QgaXMgbmVlZGVkCisJICovCisJaWYgKHJlZyAmIDB4MSkKKwkJcmVnICY9IH4weDE7CisKKwlkYXRhID0gbnZfcmQzMihiaW9zLT5kZXYsIHJlZyk7CisKKwlCSU9TTE9HKGJpb3MsICIJUmVhZDogIFJlZzogMHglMDhYLCBEYXRhOiAweCUwOFhcbiIsIHJlZywgZGF0YSk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHZvaWQKK2Jpb3Nfd3IzMihzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MzJfdCByZWcsIHVpbnQzMl90IGRhdGEpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gYmlvcy0+ZGV2LT5kZXZfcHJpdmF0ZTsKKworCXJlZyA9IG11bmdlX3JlZyhiaW9zLCByZWcpOworCWlmICghdmFsaWRfcmVnKGJpb3MsIHJlZykpCisJCXJldHVybjsKKworCS8qIHNlZSBub3RlIGluIGJpb3NfcmQzMiAqLworCWlmIChyZWcgJiAweDEpCisJCXJlZyAmPSAweGZmZmZmZmZlOworCisJTE9HX09MRF9WQUxVRShiaW9zX3JkMzIoYmlvcywgcmVnKSk7CisJQklPU0xPRyhiaW9zLCAiCVdyaXRlOiBSZWc6IDB4JTA4WCwgRGF0YTogMHglMDhYXG4iLCByZWcsIGRhdGEpOworCisJaWYgKGRldl9wcml2LT5WQklPUy5leGVjdXRlKSB7CisJCXN0aWxsX2FsaXZlKCk7CisJCW52X3dyMzIoYmlvcy0+ZGV2LCByZWcsIGRhdGEpOworCX0KK30KKworc3RhdGljIHVpbnQ4X3QKK2Jpb3NfaWR4cHJ0X3JkKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IHBvcnQsIHVpbnQ4X3QgaW5kZXgpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gYmlvcy0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYmlvcy0+ZGV2OworCXVpbnQ4X3QgZGF0YTsKKworCWlmICghdmFsaWRfaWR4X3BvcnQoYmlvcywgcG9ydCkpCisJCXJldHVybiAwOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgeworCQlpZiAocG9ydCA9PSBOVl9WSU9fU1JYKQorCQkJZGF0YSA9IE5WUmVhZFZnYVNlcShkZXYsIGJpb3MtPnN0YXRlLmNydGNoZWFkLCBpbmRleCk7CisJCWVsc2UJLyogYXNzdW1lIE5WX0NJT19DUlhfX0NPTE9SICovCisJCQlkYXRhID0gTlZSZWFkVmdhQ3J0YyhkZXYsIGJpb3MtPnN0YXRlLmNydGNoZWFkLCBpbmRleCk7CisJfSBlbHNlIHsKKwkJdWludDMyX3QgZGF0YTMyOworCisJCWRhdGEzMiA9IGJpb3NfcmQzMihiaW9zLCBOVjUwX1BESVNQTEFZX1ZHQUNSVEMoaW5kZXggJiB+MykpOworCQlkYXRhID0gKGRhdGEzMiA+PiAoKGluZGV4ICYgMykgPDwgMykpICYgMHhmZjsKKwl9CisKKwlCSU9TTE9HKGJpb3MsICIJSW5kZXhlZCBJTyByZWFkOiAgUG9ydDogMHglMDRYLCBJbmRleDogMHglMDJYLCAiCisJCSAgICAgICJIZWFkOiAweCUwMlgsIERhdGE6IDB4JTAyWFxuIiwKKwkJcG9ydCwgaW5kZXgsIGJpb3MtPnN0YXRlLmNydGNoZWFkLCBkYXRhKTsKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHZvaWQKK2Jpb3NfaWR4cHJ0X3dyKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IHBvcnQsIHVpbnQ4X3QgaW5kZXgsIHVpbnQ4X3QgZGF0YSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBiaW9zLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBiaW9zLT5kZXY7CisKKwlpZiAoIXZhbGlkX2lkeF9wb3J0KGJpb3MsIHBvcnQpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFRoZSBjdXJyZW50IGhlYWQgaXMgbWFpbnRhaW5lZCBpbiB0aGUgbnZiaW9zIG1lbWJlciAgc3RhdGUuY3J0Y2hlYWQuCisJICogV2UgdHJhcCBjaGFuZ2VzIHRvIENSNDQgYW5kIHVwZGF0ZSB0aGUgaGVhZCB2YXJpYWJsZSBhbmQgaGVuY2UgdGhlCisJICogcmVnaXN0ZXIgc2V0IHdyaXR0ZW4uCisJICogQXMgQ1I0NCBvbmx5IGV4aXN0cyBvbiBDUlRDMCwgd2UgdXBkYXRlIGNydGNoZWFkIHRvIGhlYWQwIGluIGFkdmFuY2UKKwkgKiBvZiB0aGUgd3JpdGUsIGFuZCB0byBoZWFkMSBhZnRlciB0aGUgd3JpdGUKKwkgKi8KKwlpZiAocG9ydCA9PSBOVl9DSU9fQ1JYX19DT0xPUiAmJiBpbmRleCA9PSBOVl9DSU9fQ1JFXzQ0ICYmCisJICAgIGRhdGEgIT0gTlZfQ0lPX0NSRV80NF9IRUFEQikKKwkJYmlvcy0+c3RhdGUuY3J0Y2hlYWQgPSAwOworCisJTE9HX09MRF9WQUxVRShiaW9zX2lkeHBydF9yZChiaW9zLCBwb3J0LCBpbmRleCkpOworCUJJT1NMT0coYmlvcywgIglJbmRleGVkIElPIHdyaXRlOiBQb3J0OiAweCUwNFgsIEluZGV4OiAweCUwMlgsICIKKwkJICAgICAgIkhlYWQ6IDB4JTAyWCwgRGF0YTogMHglMDJYXG4iLAorCQlwb3J0LCBpbmRleCwgYmlvcy0+c3RhdGUuY3J0Y2hlYWQsIGRhdGEpOworCisJaWYgKGJpb3MtPmV4ZWN1dGUgJiYgZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7CisJCXN0aWxsX2FsaXZlKCk7CisJCWlmIChwb3J0ID09IE5WX1ZJT19TUlgpCisJCQlOVldyaXRlVmdhU2VxKGRldiwgYmlvcy0+c3RhdGUuY3J0Y2hlYWQsIGluZGV4LCBkYXRhKTsKKwkJZWxzZQkvKiBhc3N1bWUgTlZfQ0lPX0NSWF9fQ09MT1IgKi8KKwkJCU5WV3JpdGVWZ2FDcnRjKGRldiwgYmlvcy0+c3RhdGUuY3J0Y2hlYWQsIGluZGV4LCBkYXRhKTsKKwl9IGVsc2UKKwlpZiAoYmlvcy0+ZXhlY3V0ZSkgeworCQl1aW50MzJfdCBkYXRhMzIsIHNoaWZ0ID0gKGluZGV4ICYgMykgPDwgMzsKKworCQlzdGlsbF9hbGl2ZSgpOworCisJCWRhdGEzMiAgPSBiaW9zX3JkMzIoYmlvcywgTlY1MF9QRElTUExBWV9WR0FDUlRDKGluZGV4ICYgfjMpKTsKKwkJZGF0YTMyICY9IH4oMHhmZiA8PCBzaGlmdCk7CisJCWRhdGEzMiB8PSAoZGF0YSA8PCBzaGlmdCk7CisJCWJpb3Nfd3IzMihiaW9zLCBOVjUwX1BESVNQTEFZX1ZHQUNSVEMoaW5kZXggJiB+MyksIGRhdGEzMik7CisJfQorCisJaWYgKHBvcnQgPT0gTlZfQ0lPX0NSWF9fQ09MT1IgJiYKKwkgICAgaW5kZXggPT0gTlZfQ0lPX0NSRV80NCAmJiBkYXRhID09IE5WX0NJT19DUkVfNDRfSEVBREIpCisJCWJpb3MtPnN0YXRlLmNydGNoZWFkID0gMTsKK30KKworc3RhdGljIHVpbnQ4X3QKK2Jpb3NfcG9ydF9yZChzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBwb3J0KQoreworCXVpbnQ4X3QgZGF0YSwgaGVhZCA9IGJpb3MtPnN0YXRlLmNydGNoZWFkOworCisJaWYgKCF2YWxpZF9wb3J0KGJpb3MsIHBvcnQpKQorCQlyZXR1cm4gMDsKKworCWRhdGEgPSBOVlJlYWRQUk1WSU8oYmlvcy0+ZGV2LCBoZWFkLCBOVl9QUk1WSU8wX09GRlNFVCArIHBvcnQpOworCisJQklPU0xPRyhiaW9zLCAiCUlPIHJlYWQ6ICBQb3J0OiAweCUwNFgsIEhlYWQ6IDB4JTAyWCwgRGF0YTogMHglMDJYXG4iLAorCQlwb3J0LCBoZWFkLCBkYXRhKTsKKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgdm9pZAorYmlvc19wb3J0X3dyKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IHBvcnQsIHVpbnQ4X3QgZGF0YSkKK3sKKwlpbnQgaGVhZCA9IGJpb3MtPnN0YXRlLmNydGNoZWFkOworCisJaWYgKCF2YWxpZF9wb3J0KGJpb3MsIHBvcnQpKQorCQlyZXR1cm47CisKKwlMT0dfT0xEX1ZBTFVFKGJpb3NfcG9ydF9yZChiaW9zLCBwb3J0KSk7CisJQklPU0xPRyhiaW9zLCAiCUlPIHdyaXRlOiBQb3J0OiAweCUwNFgsIEhlYWQ6IDB4JTAyWCwgRGF0YTogMHglMDJYXG4iLAorCQlwb3J0LCBoZWFkLCBkYXRhKTsKKworCWlmICghYmlvcy0+ZXhlY3V0ZSkKKwkJcmV0dXJuOworCisJc3RpbGxfYWxpdmUoKTsKKwlOVldyaXRlUFJNVklPKGJpb3MtPmRldiwgaGVhZCwgTlZfUFJNVklPMF9PRkZTRVQgKyBwb3J0LCBkYXRhKTsKK30KKworc3RhdGljIGJvb2wKK2lvX2ZsYWdfY29uZGl0aW9uX21ldChzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHVpbnQ4X3QgY29uZCkKK3sKKwkvKgorCSAqIFRoZSBJTyBmbGFnIGNvbmRpdGlvbiBlbnRyeSBoYXMgMiBieXRlcyBmb3IgdGhlIENSVEMgcG9ydDsgMSBieXRlCisJICogZm9yIHRoZSBDUlRDIGluZGV4OyAxIGJ5dGUgZm9yIHRoZSBtYXNrIHRvIGFwcGx5IHRvIHRoZSB2YWx1ZQorCSAqIHJldHJpZXZlZCBmcm9tIHRoZSBDUlRDOyAxIGJ5dGUgZm9yIHRoZSBzaGlmdCByaWdodCB0byBhcHBseSB0byB0aGUKKwkgKiBtYXNrZWQgQ1JUQyB2YWx1ZTsgMiBieXRlcyBmb3IgdGhlIG9mZnNldCB0byB0aGUgZmxhZyBhcnJheSwgdG8KKwkgKiB3aGljaCB0aGUgc2hpZnRlZCB2YWx1ZSBpcyBhZGRlZDsgMSBieXRlIGZvciB0aGUgbWFzayBhcHBsaWVkIHRvIHRoZQorCSAqIHZhbHVlIHJlYWQgZnJvbSB0aGUgZmxhZyBhcnJheTsgYW5kIDEgYnl0ZSBmb3IgdGhlIHZhbHVlIHRvIGNvbXBhcmUKKwkgKiBhZ2FpbnN0IHRoZSBtYXNrZWQgYnl0ZSBmcm9tIHRoZSBmbGFnIHRhYmxlLgorCSAqLworCisJdWludDE2X3QgY29uZHB0ciA9IGJpb3MtPmlvX2ZsYWdfY29uZGl0aW9uX3RibF9wdHIgKyBjb25kICogSU9fRkxBR19DT05ESVRJT05fU0laRTsKKwl1aW50MTZfdCBjcnRjcG9ydCA9IFJPTTE2KGJpb3MtPmRhdGFbY29uZHB0cl0pOworCXVpbnQ4X3QgY3J0Y2luZGV4ID0gYmlvcy0+ZGF0YVtjb25kcHRyICsgMl07CisJdWludDhfdCBtYXNrID0gYmlvcy0+ZGF0YVtjb25kcHRyICsgM107CisJdWludDhfdCBzaGlmdCA9IGJpb3MtPmRhdGFbY29uZHB0ciArIDRdOworCXVpbnQxNl90IGZsYWdhcnJheSA9IFJPTTE2KGJpb3MtPmRhdGFbY29uZHB0ciArIDVdKTsKKwl1aW50OF90IGZsYWdhcnJheW1hc2sgPSBiaW9zLT5kYXRhW2NvbmRwdHIgKyA3XTsKKwl1aW50OF90IGNtcHZhbCA9IGJpb3MtPmRhdGFbY29uZHB0ciArIDhdOworCXVpbnQ4X3QgZGF0YTsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogUG9ydDogMHglMDRYLCBJbmRleDogMHglMDJYLCBNYXNrOiAweCUwMlgsICIKKwkJICAgICAgIlNoaWZ0OiAweCUwMlgsIEZsYWdBcnJheTogMHglMDRYLCBGQU1hc2s6IDB4JTAyWCwgIgorCQkgICAgICAiQ21wdmFsOiAweCUwMlhcbiIsCisJCW9mZnNldCwgY3J0Y3BvcnQsIGNydGNpbmRleCwgbWFzaywgc2hpZnQsIGZsYWdhcnJheSwgZmxhZ2FycmF5bWFzaywgY21wdmFsKTsKKworCWRhdGEgPSBiaW9zX2lkeHBydF9yZChiaW9zLCBjcnRjcG9ydCwgY3J0Y2luZGV4KTsKKworCWRhdGEgPSBiaW9zLT5kYXRhW2ZsYWdhcnJheSArICgoZGF0YSAmIG1hc2spID4+IHNoaWZ0KV07CisJZGF0YSAmPSBmbGFnYXJyYXltYXNrOworCisJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBDaGVja2luZyBpZiAweCUwMlggZXF1YWxzIDB4JTAyWFxuIiwKKwkJb2Zmc2V0LCBkYXRhLCBjbXB2YWwpOworCisJcmV0dXJuIChkYXRhID09IGNtcHZhbCk7Cit9CisKK3N0YXRpYyBib29sCitiaW9zX2NvbmRpdGlvbl9tZXQoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LCB1aW50OF90IGNvbmQpCit7CisJLyoKKwkgKiBUaGUgY29uZGl0aW9uIHRhYmxlIGVudHJ5IGhhcyA0IGJ5dGVzIGZvciB0aGUgYWRkcmVzcyBvZiB0aGUKKwkgKiByZWdpc3RlciB0byBjaGVjaywgNCBieXRlcyBmb3IgYSBtYXNrIHRvIGFwcGx5IHRvIHRoZSByZWdpc3RlciBhbmQKKwkgKiA0IGZvciBhIHRlc3QgY29tcGFyaXNvbiB2YWx1ZQorCSAqLworCisJdWludDE2X3QgY29uZHB0ciA9IGJpb3MtPmNvbmRpdGlvbl90YmxfcHRyICsgY29uZCAqIENPTkRJVElPTl9TSVpFOworCXVpbnQzMl90IHJlZyA9IFJPTTMyKGJpb3MtPmRhdGFbY29uZHB0cl0pOworCXVpbnQzMl90IG1hc2sgPSBST00zMihiaW9zLT5kYXRhW2NvbmRwdHIgKyA0XSk7CisJdWludDMyX3QgY21wdmFsID0gUk9NMzIoYmlvcy0+ZGF0YVtjb25kcHRyICsgOF0pOworCXVpbnQzMl90IGRhdGE7CisKKwlCSU9TTE9HKGJpb3MsICIweCUwNFg6IENvbmQ6IDB4JTAyWCwgUmVnOiAweCUwOFgsIE1hc2s6IDB4JTA4WFxuIiwKKwkJb2Zmc2V0LCBjb25kLCByZWcsIG1hc2spOworCisJZGF0YSA9IGJpb3NfcmQzMihiaW9zLCByZWcpICYgbWFzazsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogQ2hlY2tpbmcgaWYgMHglMDhYIGVxdWFscyAweCUwOFhcbiIsCisJCW9mZnNldCwgZGF0YSwgY21wdmFsKTsKKworCXJldHVybiAoZGF0YSA9PSBjbXB2YWwpOworfQorCitzdGF0aWMgYm9vbAoraW9fY29uZGl0aW9uX21ldChzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHVpbnQ4X3QgY29uZCkKK3sKKwkvKgorCSAqIFRoZSBJTyBjb25kaXRpb24gZW50cnkgaGFzIDIgYnl0ZXMgZm9yIHRoZSBJTyBwb3J0IGFkZHJlc3M7IDEgYnl0ZQorCSAqIGZvciB0aGUgaW5kZXggdG8gd3JpdGUgdG8gaW9fcG9ydDsgMSBieXRlIGZvciB0aGUgbWFzayB0byBhcHBseSB0bworCSAqIHRoZSBieXRlIHJlYWQgZnJvbSBpb19wb3J0KzE7IGFuZCAxIGJ5dGUgZm9yIHRoZSB2YWx1ZSB0byBjb21wYXJlCisJICogYWdhaW5zdCB0aGUgbWFza2VkIGJ5dGUuCisJICovCisKKwl1aW50MTZfdCBjb25kcHRyID0gYmlvcy0+aW9fY29uZGl0aW9uX3RibF9wdHIgKyBjb25kICogSU9fQ09ORElUSU9OX1NJWkU7CisJdWludDE2X3QgaW9fcG9ydCA9IFJPTTE2KGJpb3MtPmRhdGFbY29uZHB0cl0pOworCXVpbnQ4X3QgcG9ydF9pbmRleCA9IGJpb3MtPmRhdGFbY29uZHB0ciArIDJdOworCXVpbnQ4X3QgbWFzayA9IGJpb3MtPmRhdGFbY29uZHB0ciArIDNdOworCXVpbnQ4X3QgY21wdmFsID0gYmlvcy0+ZGF0YVtjb25kcHRyICsgNF07CisKKwl1aW50OF90IGRhdGEgPSBiaW9zX2lkeHBydF9yZChiaW9zLCBpb19wb3J0LCBwb3J0X2luZGV4KSAmIG1hc2s7CisKKwlCSU9TTE9HKGJpb3MsICIweCUwNFg6IENoZWNraW5nIGlmIDB4JTAyWCBlcXVhbHMgMHglMDJYXG4iLAorCQlvZmZzZXQsIGRhdGEsIGNtcHZhbCk7CisKKwlyZXR1cm4gKGRhdGEgPT0gY21wdmFsKTsKK30KKworc3RhdGljIGludAorbnY1MF9wbGxfc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IHJlZywgdWludDMyX3QgY2xrKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdWludDMyX3QgcmVnMCA9IG52X3JkMzIoZGV2LCByZWcgKyAwKTsKKwl1aW50MzJfdCByZWcxID0gbnZfcmQzMihkZXYsIHJlZyArIDQpOworCXN0cnVjdCBub3V2ZWF1X3BsbF92YWxzIHBsbDsKKwlzdHJ1Y3QgcGxsX2xpbXMgcGxsX2xpbWl0czsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2V0X3BsbF9saW1pdHMoZGV2LCByZWcsICZwbGxfbGltaXRzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJY2xrID0gbm91dmVhdV9jYWxjX3BsbF9tbnAoZGV2LCAmcGxsX2xpbWl0cywgY2xrLCAmcGxsKTsKKwlpZiAoIWNsaykKKwkJcmV0dXJuIC1FUkFOR0U7CisKKwlyZWcwID0gKHJlZzAgJiAweGZmZjhmZmZmKSB8IChwbGwubG9nMlAgPDwgMTYpOworCXJlZzEgPSAocmVnMSAmIDB4ZmZmZjAwMDApIHwgKHBsbC5OMSA8PCA4KSB8IHBsbC5NMTsKKworCWlmIChkZXZfcHJpdi0+VkJJT1MuZXhlY3V0ZSkgeworCQlzdGlsbF9hbGl2ZSgpOworCQludl93cjMyKGRldiwgcmVnICsgNCwgcmVnMSk7CisJCW52X3dyMzIoZGV2LCByZWcgKyAwLCByZWcwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc2V0UExMKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQzMl90IHJlZywgdWludDMyX3QgY2xrKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBiaW9zLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwkvKiBjbGsgaW4ga0h6ICovCisJc3RydWN0IHBsbF9saW1zIHBsbF9saW07CisJc3RydWN0IG5vdXZlYXVfcGxsX3ZhbHMgcGxsdmFsczsKKwlpbnQgcmV0OworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApCisJCXJldHVybiBudjUwX3BsbF9zZXQoZGV2LCByZWcsIGNsayk7CisKKwkvKiBoaWdoIHJlZ3MgKHN1Y2ggYXMgaW4gdGhlIG1hYyBnNSB0YWJsZSkgYXJlIG5vdCAtPSA0ICovCisJcmV0ID0gZ2V0X3BsbF9saW1pdHMoZGV2LCByZWcgPiAweDQwNWMgPyByZWcgOiByZWcgLSA0LCAmcGxsX2xpbSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWNsayA9IG5vdXZlYXVfY2FsY19wbGxfbW5wKGRldiwgJnBsbF9saW0sIGNsaywgJnBsbHZhbHMpOworCWlmICghY2xrKQorCQlyZXR1cm4gLUVSQU5HRTsKKworCWlmIChiaW9zLT5leGVjdXRlKSB7CisJCXN0aWxsX2FsaXZlKCk7CisJCW5vdXZlYXVfaHdfc2V0cGxsKGRldiwgcmVnLCAmcGxsdmFscyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGNiX2VudHJ5X2lkeF9mcm9tX2NydGNoZWFkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnZiaW9zICpiaW9zID0gJmRldl9wcml2LT5WQklPUzsKKworCS8qCisJICogRm9yIHRoZSByZXN1bHRzIG9mIHRoaXMgZnVuY3Rpb24gdG8gYmUgY29ycmVjdCwgQ1I0NCBtdXN0IGhhdmUgYmVlbgorCSAqIHNldCAodXNpbmcgYmlvc19pZHhwcnRfd3IgdG8gc2V0IGNydGNoZWFkKSwgQ1I1OCBzZXQgZm9yIENSNTcgPSAwLAorCSAqIGFuZCB0aGUgRENCIHRhYmxlIHBhcnNlZCwgYmVmb3JlIHRoZSBzY3JpcHQgY2FsbGluZyB0aGUgZnVuY3Rpb24gaXMKKwkgKiBydW4uICBydW5fZGlnaXRhbF9vcF9zY3JpcHQgaXMgZXhhbXBsZSBvZiBob3cgdG8gZG8gc3VjaCBzZXR1cAorCSAqLworCisJdWludDhfdCBkY2JfZW50cnkgPSBOVlJlYWRWZ2FDcnRjNTc1OChkZXYsIGJpb3MtPnN0YXRlLmNydGNoZWFkLCAwKTsKKworCWlmIChkY2JfZW50cnkgPiBiaW9zLT5iZGNiLmRjYi5lbnRyaWVzKSB7CisJCU5WX0VSUk9SKGRldiwgIkNSNTggZG9lc24ndCBoYXZlIGEgdmFsaWQgRENCIGVudHJ5IGN1cnJlbnRseSAiCisJCQkJIiglMDJYKVxuIiwgZGNiX2VudHJ5KTsKKwkJZGNiX2VudHJ5ID0gMHg3ZjsJLyogdW51c2VkIC8gaW52YWxpZCBtYXJrZXIgKi8KKwl9CisKKwlyZXR1cm4gZGNiX2VudHJ5OworfQorCitzdGF0aWMgc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKgoraW5pdF9pMmNfZGV2aWNlX2ZpbmQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGkyY19pbmRleCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBiaW9zX3BhcnNlZF9kY2IgKmJkY2IgPSAmZGV2X3ByaXYtPlZCSU9TLmJkY2I7CisKKwlpZiAoaTJjX2luZGV4ID09IDB4ZmYpIHsKKwkJLyogbm90ZTogZGNiX2VudHJ5X2lkeF9mcm9tX2NydGNoZWFkIG5lZWRzIHByZS1zY3JpcHQgc2V0LXVwICovCisJCWludCBpZHggPSBkY2JfZW50cnlfaWR4X2Zyb21fY3J0Y2hlYWQoZGV2KSwgc2hpZnQgPSAwOworCQlpbnQgZGVmYXVsdF9pbmRpY2VzID0gYmRjYi0+aTJjX2RlZmF1bHRfaW5kaWNlczsKKworCQlpZiAoaWR4ICE9IDB4N2YgJiYgYmRjYi0+ZGNiLmVudHJ5W2lkeF0uaTJjX3VwcGVyX2RlZmF1bHQpCisJCQlzaGlmdCA9IDQ7CisKKwkJaTJjX2luZGV4ID0gKGRlZmF1bHRfaW5kaWNlcyA+PiBzaGlmdCkgJiAweGY7CisJfQorCWlmIChpMmNfaW5kZXggPT0gMHg4MCkJLyogZzgwKyAqLworCQlpMmNfaW5kZXggPSBiZGNiLT5pMmNfZGVmYXVsdF9pbmRpY2VzICYgMHhmOworCisJcmV0dXJuIG5vdXZlYXVfaTJjX2ZpbmQoZGV2LCBpMmNfaW5kZXgpOworfQorCitzdGF0aWMgdWludDMyX3QgZ2V0X3RtZHNfaW5kZXhfcmVnKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQ4X3QgbWx2KQoreworCS8qCisJICogRm9yIG1sdiA8IDB4ODAsIGl0IGlzIGFuIGluZGV4IGludG8gYSB0YWJsZSBvZiBUTURTIGJhc2UgYWRkcmVzc2VzLgorCSAqIEZvciBtbHYgPT0gMHg4MCB1c2UgdGhlICJvciIgdmFsdWUgb2YgdGhlIGRjYl9lbnRyeSBpbmRleGVkIGJ5CisJICogQ1I1OCBmb3IgQ1I1NyA9IDAgdG8gaW5kZXggYSB0YWJsZSBvZiBvZmZzZXRzIHRvIHRoZSBiYXNpYworCSAqIDB4NjgwOGIwIGFkZHJlc3MuCisJICogRm9yIG1sdiA9PSAweDgxIHVzZSB0aGUgIm9yIiB2YWx1ZSBvZiB0aGUgZGNiX2VudHJ5IGluZGV4ZWQgYnkKKwkgKiBDUjU4IGZvciBDUjU3ID0gMCB0byBpbmRleCBhIHRhYmxlIG9mIG9mZnNldHMgdG8gdGhlIGJhc2ljCisJICogMHg2ODA4YjAgYWRkcmVzcywgYW5kIHRoZW4gZmxpcCB0aGUgb2Zmc2V0IGJ5IDguCisJICovCisKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWNvbnN0IGludCBwcmFtZGFjX29mZnNldFsxM10gPSB7CisJCTAsIDAsIDB4OCwgMCwgMHgyMDAwLCAwLCAwLCAwLCAweDIwMDgsIDAsIDAsIDAsIDB4MjAwMCB9OworCWNvbnN0IHVpbnQzMl90IHByYW1kYWNfdGFibGVbNF0gPSB7CisJCTB4NjgwOGIwLCAweDY4MDhiOCwgMHg2ODI4YjAsIDB4NjgyOGI4IH07CisKKwlpZiAobWx2ID49IDB4ODApIHsKKwkJaW50IGRjYl9lbnRyeSwgZGFjb2Zmc2V0OworCisJCS8qIG5vdGU6IGRjYl9lbnRyeV9pZHhfZnJvbV9jcnRjaGVhZCBuZWVkcyBwcmUtc2NyaXB0IHNldC11cCAqLworCQlkY2JfZW50cnkgPSBkY2JfZW50cnlfaWR4X2Zyb21fY3J0Y2hlYWQoZGV2KTsKKwkJaWYgKGRjYl9lbnRyeSA9PSAweDdmKQorCQkJcmV0dXJuIDA7CisJCWRhY29mZnNldCA9IHByYW1kYWNfb2Zmc2V0WworCQkJCWRldl9wcml2LT5WQklPUy5iZGNiLmRjYi5lbnRyeVtkY2JfZW50cnldLm9yXTsKKwkJaWYgKG1sdiA9PSAweDgxKQorCQkJZGFjb2Zmc2V0IF49IDg7CisJCXJldHVybiAweDY4MDhiMCArIGRhY29mZnNldDsKKwl9IGVsc2UgeworCQlpZiAobWx2ID4gQVJSQVlfU0laRShwcmFtZGFjX3RhYmxlKSkgeworCQkJTlZfRVJST1IoZGV2LCAiTWFnaWMgTG9va3VwIFZhbHVlIHRvbyBiaWcgKCUwMlgpXG4iLAorCQkJCQkJCQkJbWx2KTsKKwkJCXJldHVybiAwOworCQl9CisJCXJldHVybiBwcmFtZGFjX3RhYmxlW21sdl07CisJfQorfQorCitzdGF0aWMgYm9vbAoraW5pdF9pb19yZXN0cmljdF9wcm9nKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwKKwkJICAgICAgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX0lPX1JFU1RSSUNUX1BST0cgICBvcGNvZGU6IDB4MzIgKCcyJykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4ICBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoMTYgYml0KTogQ1JUQyBwb3J0CisJICogb2Zmc2V0ICsgMyAgKDggIGJpdCk6IENSVEMgaW5kZXgKKwkgKiBvZmZzZXQgKyA0ICAoOCAgYml0KTogbWFzaworCSAqIG9mZnNldCArIDUgICg4ICBiaXQpOiBzaGlmdAorCSAqIG9mZnNldCArIDYgICg4ICBiaXQpOiBjb3VudAorCSAqIG9mZnNldCArIDcgICgzMiBiaXQpOiByZWdpc3RlcgorCSAqIG9mZnNldCArIDExICgzMiBiaXQpOiBjb25maWd1cmF0aW9uIDEKKwkgKiAuLi4KKwkgKgorCSAqIFN0YXJ0aW5nIGF0IG9mZnNldCArIDExIHRoZXJlIGFyZSAiY291bnQiIDMyIGJpdCB2YWx1ZXMuCisJICogVG8gZmluZCBvdXQgd2hpY2ggdmFsdWUgdG8gdXNlIHJlYWQgaW5kZXggIkNSVEMgaW5kZXgiIG9uICJDUlRDCisJICogcG9ydCIsIEFORCB0aGlzIHZhbHVlIHdpdGggIm1hc2siIGFuZCB0aGVuIGJpdCBzaGlmdCByaWdodCAic2hpZnQiCisJICogYml0cy4gIFJlYWQgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIHVzaW5nIHRoaXMgaW5kZXggYW5kIHdyaXRlIHRvCisJICogInJlZ2lzdGVyIgorCSAqLworCisJdWludDE2X3QgY3J0Y3BvcnQgPSBST00xNihiaW9zLT5kYXRhW29mZnNldCArIDFdKTsKKwl1aW50OF90IGNydGNpbmRleCA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgM107CisJdWludDhfdCBtYXNrID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyA0XTsKKwl1aW50OF90IHNoaWZ0ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyA1XTsKKwl1aW50OF90IGNvdW50ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyA2XTsKKwl1aW50MzJfdCByZWcgPSBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDddKTsKKwl1aW50OF90IGNvbmZpZzsKKwl1aW50MzJfdCBjb25maWd2YWw7CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogUG9ydDogMHglMDRYLCBJbmRleDogMHglMDJYLCBNYXNrOiAweCUwMlgsICIKKwkJICAgICAgIlNoaWZ0OiAweCUwMlgsIENvdW50OiAweCUwMlgsIFJlZzogMHglMDhYXG4iLAorCQlvZmZzZXQsIGNydGNwb3J0LCBjcnRjaW5kZXgsIG1hc2ssIHNoaWZ0LCBjb3VudCwgcmVnKTsKKworCWNvbmZpZyA9IChiaW9zX2lkeHBydF9yZChiaW9zLCBjcnRjcG9ydCwgY3J0Y2luZGV4KSAmIG1hc2spID4+IHNoaWZ0OworCWlmIChjb25maWcgPiBjb3VudCkgeworCQlOVl9FUlJPUihiaW9zLT5kZXYsCisJCQkgIjB4JTA0WDogQ29uZmlnIDB4JTAyWCBleGNlZWRzIG1heGltYWwgYm91bmQgMHglMDJYXG4iLAorCQkJIG9mZnNldCwgY29uZmlnLCBjb3VudCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwljb25maWd2YWwgPSBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDExICsgY29uZmlnICogNF0pOworCisJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBXcml0aW5nIGNvbmZpZyAlMDJYXG4iLCBvZmZzZXQsIGNvbmZpZyk7CisKKwliaW9zX3dyMzIoYmlvcywgcmVnLCBjb25maWd2YWwpOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X3JlcGVhdChzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9SRVBFQVQgICBvcGNvZGU6IDB4MzMgKCczJykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4IGJpdCk6IG9wY29kZQorCSAqIG9mZnNldCArIDEgICg4IGJpdCk6IGNvdW50CisJICoKKwkgKiBFeGVjdXRlIHNjcmlwdCBmb2xsb3dpbmcgdGhpcyBvcGNvZGUgdXAgdG8gSU5JVF9SRVBFQVRfRU5ECisJICogImNvdW50IiB0aW1lcworCSAqLworCisJdWludDhfdCBjb3VudCA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV07CisJdWludDhfdCBpOworCisJLyogbm8gaWV4ZWMtPmV4ZWN1dGUgY2hlY2sgYnkgZGVzaWduICovCisKKwlCSU9TTE9HKGJpb3MsICIweCUwNFg6IFJlcGVhdGluZyBmb2xsb3dpbmcgc2VnbWVudCAlZCB0aW1lc1xuIiwKKwkJb2Zmc2V0LCBjb3VudCk7CisKKwlpZXhlYy0+cmVwZWF0ID0gdHJ1ZTsKKworCS8qCisJICogY291bnQgLSAxLCBhcyB0aGUgc2NyaXB0IGJsb2NrIHdpbGwgZXhlY3V0ZSBvbmNlIHdoZW4gd2UgbGVhdmUgdGhpcworCSAqIG9wY29kZSAtLSB0aGlzIGlzIGNvbXBhdGlibGUgd2l0aCBiaW9zIGJlaGF2aW91ciBhczoKKwkgKiBhKSB0aGUgYmxvY2sgaXMgYWx3YXlzIGV4ZWN1dGVkIGF0IGxlYXN0IG9uY2UsIGV2ZW4gaWYgY291bnQgPT0gMAorCSAqIGIpIHRoZSBiaW9zIGludGVycHJldGVyIHNraXBzIHRvIHRoZSBvcCBmb2xsb3dpbmcgSU5JVF9FTkRfUkVQRUFULAorCSAqIHdoaWxlIHdlIGRvbid0CisJICovCisJZm9yIChpID0gMDsgaSA8IGNvdW50IC0gMTsgaSsrKQorCQlwYXJzZV9pbml0X3RhYmxlKGJpb3MsIG9mZnNldCArIDIsIGlleGVjKTsKKworCWlleGVjLT5yZXBlYXQgPSBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF9pb19yZXN0cmljdF9wbGwoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LAorCQkgICAgIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9JT19SRVNUUklDVF9QTEwgICBvcGNvZGU6IDB4MzQgKCc0JykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4ICBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoMTYgYml0KTogQ1JUQyBwb3J0CisJICogb2Zmc2V0ICsgMyAgKDggIGJpdCk6IENSVEMgaW5kZXgKKwkgKiBvZmZzZXQgKyA0ICAoOCAgYml0KTogbWFzaworCSAqIG9mZnNldCArIDUgICg4ICBiaXQpOiBzaGlmdAorCSAqIG9mZnNldCArIDYgICg4ICBiaXQpOiBJTyBmbGFnIGNvbmRpdGlvbiBpbmRleAorCSAqIG9mZnNldCArIDcgICg4ICBiaXQpOiBjb3VudAorCSAqIG9mZnNldCArIDggICgzMiBiaXQpOiByZWdpc3RlcgorCSAqIG9mZnNldCArIDEyICgxNiBiaXQpOiBmcmVxdWVuY3kgMQorCSAqIC4uLgorCSAqCisJICogU3RhcnRpbmcgYXQgb2Zmc2V0ICsgMTIgdGhlcmUgYXJlICJjb3VudCIgMTYgYml0IGZyZXF1ZW5jaWVzICgxMGtIeikuCisJICogU2V0IFBMTCByZWdpc3RlciAicmVnaXN0ZXIiIHRvIGNvZWZmaWNpZW50cyBmb3IgZnJlcXVlbmN5IG4sCisJICogc2VsZWN0ZWQgYnkgcmVhZGluZyBpbmRleCAiQ1JUQyBpbmRleCIgb2YgIkNSVEMgcG9ydCIgQU5EZWQgd2l0aAorCSAqICJtYXNrIiBhbmQgc2hpZnRlZCByaWdodCBieSAic2hpZnQiLgorCSAqCisJICogSWYgIklPIGZsYWcgY29uZGl0aW9uIGluZGV4IiA+IDAsIGFuZCBjb25kaXRpb24gbWV0LCBkb3VibGUKKwkgKiBmcmVxdWVuY3kgYmVmb3JlIHNldHRpbmcgaXQuCisJICovCisKKwl1aW50MTZfdCBjcnRjcG9ydCA9IFJPTTE2KGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV0pOworCXVpbnQ4X3QgY3J0Y2luZGV4ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAzXTsKKwl1aW50OF90IG1hc2sgPSBiaW9zLT5kYXRhW29mZnNldCArIDRdOworCXVpbnQ4X3Qgc2hpZnQgPSBiaW9zLT5kYXRhW29mZnNldCArIDVdOworCWludDhfdCBpb19mbGFnX2NvbmRpdGlvbl9pZHggPSBiaW9zLT5kYXRhW29mZnNldCArIDZdOworCXVpbnQ4X3QgY291bnQgPSBiaW9zLT5kYXRhW29mZnNldCArIDddOworCXVpbnQzMl90IHJlZyA9IFJPTTMyKGJpb3MtPmRhdGFbb2Zmc2V0ICsgOF0pOworCXVpbnQ4X3QgY29uZmlnOworCXVpbnQxNl90IGZyZXE7CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogUG9ydDogMHglMDRYLCBJbmRleDogMHglMDJYLCBNYXNrOiAweCUwMlgsICIKKwkJICAgICAgIlNoaWZ0OiAweCUwMlgsIElPIEZsYWcgQ29uZGl0aW9uOiAweCUwMlgsICIKKwkJICAgICAgIkNvdW50OiAweCUwMlgsIFJlZzogMHglMDhYXG4iLAorCQlvZmZzZXQsIGNydGNwb3J0LCBjcnRjaW5kZXgsIG1hc2ssIHNoaWZ0LAorCQlpb19mbGFnX2NvbmRpdGlvbl9pZHgsIGNvdW50LCByZWcpOworCisJY29uZmlnID0gKGJpb3NfaWR4cHJ0X3JkKGJpb3MsIGNydGNwb3J0LCBjcnRjaW5kZXgpICYgbWFzaykgPj4gc2hpZnQ7CisJaWYgKGNvbmZpZyA+IGNvdW50KSB7CisJCU5WX0VSUk9SKGJpb3MtPmRldiwKKwkJCSAiMHglMDRYOiBDb25maWcgMHglMDJYIGV4Y2VlZHMgbWF4aW1hbCBib3VuZCAweCUwMlhcbiIsCisJCQkgb2Zmc2V0LCBjb25maWcsIGNvdW50KTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWZyZXEgPSBST00xNihiaW9zLT5kYXRhW29mZnNldCArIDEyICsgY29uZmlnICogMl0pOworCisJaWYgKGlvX2ZsYWdfY29uZGl0aW9uX2lkeCA+IDApIHsKKwkJaWYgKGlvX2ZsYWdfY29uZGl0aW9uX21ldChiaW9zLCBvZmZzZXQsIGlvX2ZsYWdfY29uZGl0aW9uX2lkeCkpIHsKKwkJCUJJT1NMT0coYmlvcywgIjB4JTA0WDogQ29uZGl0aW9uIGZ1bGZpbGxlZCAtLSAiCisJCQkJICAgICAgImZyZXF1ZW5jeSBkb3VibGVkXG4iLCBvZmZzZXQpOworCQkJZnJlcSAqPSAyOworCQl9IGVsc2UKKwkJCUJJT1NMT0coYmlvcywgIjB4JTA0WDogQ29uZGl0aW9uIG5vdCBmdWxmaWxsZWQgLS0gIgorCQkJCSAgICAgICJmcmVxdWVuY3kgdW5jaGFuZ2VkXG4iLCBvZmZzZXQpOworCX0KKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogUmVnOiAweCUwOFgsIENvbmZpZzogMHglMDJYLCBGcmVxOiAlZDBrSHpcbiIsCisJCW9mZnNldCwgcmVnLCBjb25maWcsIGZyZXEpOworCisJc2V0UExMKGJpb3MsIHJlZywgZnJlcSAqIDEwKTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF9lbmRfcmVwZWF0KHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX0VORF9SRVBFQVQgICBvcGNvZGU6IDB4MzYgKCc2JykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4IGJpdCk6IG9wY29kZQorCSAqCisJICogTWFya3MgdGhlIGVuZCBvZiB0aGUgYmxvY2sgZm9yIElOSVRfUkVQRUFUIHRvIHJlcGVhdAorCSAqLworCisJLyogbm8gaWV4ZWMtPmV4ZWN1dGUgY2hlY2sgYnkgZGVzaWduICovCisKKwkvKgorCSAqIGlleGVjLT5yZXBlYXQgZmxhZyBuZWNlc3NhcnkgdG8gZ28gcGFzdCBJTklUX0VORF9SRVBFQVQgb3Bjb2RlIHdoZW4KKwkgKiB3ZSdyZSBub3QgaW4gcmVwZWF0IG1vZGUKKwkgKi8KKwlpZiAoaWV4ZWMtPnJlcGVhdCkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X2NvcHkoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LCBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfQ09QWSAgIG9wY29kZTogMHgzNyAoJzcnKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggIGJpdCk6IG9wY29kZQorCSAqIG9mZnNldCArIDEgICgzMiBiaXQpOiByZWdpc3RlcgorCSAqIG9mZnNldCArIDUgICg4ICBiaXQpOiBzaGlmdAorCSAqIG9mZnNldCArIDYgICg4ICBiaXQpOiBzcmNtYXNrCisJICogb2Zmc2V0ICsgNyAgKDE2IGJpdCk6IENSVEMgcG9ydAorCSAqIG9mZnNldCArIDkgICg4IGJpdCk6IENSVEMgaW5kZXgKKwkgKiBvZmZzZXQgKyAxMCAgKDggYml0KTogbWFzaworCSAqCisJICogUmVhZCBpbmRleCAiQ1JUQyBpbmRleCIgb24gIkNSVEMgcG9ydCIsIEFORCB3aXRoICJtYXNrIiwgT1Igd2l0aAorCSAqIChSRUdWQUwoInJlZ2lzdGVyIikgPj4gInNoaWZ0IiAmICJzcmNtYXNrIikgYW5kIHdyaXRlLWJhY2sgdG8gQ1JUQworCSAqIHBvcnQKKwkgKi8KKworCXVpbnQzMl90IHJlZyA9IFJPTTMyKGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV0pOworCXVpbnQ4X3Qgc2hpZnQgPSBiaW9zLT5kYXRhW29mZnNldCArIDVdOworCXVpbnQ4X3Qgc3JjbWFzayA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgNl07CisJdWludDE2X3QgY3J0Y3BvcnQgPSBST00xNihiaW9zLT5kYXRhW29mZnNldCArIDddKTsKKwl1aW50OF90IGNydGNpbmRleCA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgOV07CisJdWludDhfdCBtYXNrID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAxMF07CisJdWludDMyX3QgZGF0YTsKKwl1aW50OF90IGNydGNkYXRhOworCisJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwlCSU9TTE9HKGJpb3MsICIweCUwNFg6IFJlZzogMHglMDhYLCBTaGlmdDogMHglMDJYLCBTcmNNYXNrOiAweCUwMlgsICIKKwkJICAgICAgIlBvcnQ6IDB4JTA0WCwgSW5kZXg6IDB4JTAyWCwgTWFzazogMHglMDJYXG4iLAorCQlvZmZzZXQsIHJlZywgc2hpZnQsIHNyY21hc2ssIGNydGNwb3J0LCBjcnRjaW5kZXgsIG1hc2spOworCisJZGF0YSA9IGJpb3NfcmQzMihiaW9zLCByZWcpOworCisJaWYgKHNoaWZ0IDwgMHg4MCkKKwkJZGF0YSA+Pj0gc2hpZnQ7CisJZWxzZQorCQlkYXRhIDw8PSAoMHgxMDAgLSBzaGlmdCk7CisKKwlkYXRhICY9IHNyY21hc2s7CisKKwljcnRjZGF0YSAgPSBiaW9zX2lkeHBydF9yZChiaW9zLCBjcnRjcG9ydCwgY3J0Y2luZGV4KSAmIG1hc2s7CisJY3J0Y2RhdGEgfD0gKHVpbnQ4X3QpZGF0YTsKKwliaW9zX2lkeHBydF93cihiaW9zLCBjcnRjcG9ydCwgY3J0Y2luZGV4LCBjcnRjZGF0YSk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfbm90KHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX05PVCAgIG9wY29kZTogMHgzOCAoJzgnKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggIGJpdCk6IG9wY29kZQorCSAqCisJICogSW52ZXJ0IHRoZSBjdXJyZW50IGV4ZWN1dGUgLyBuby1leGVjdXRlIGNvbmRpdGlvbiAoaS5lLiAiZWxzZSIpCisJICovCisJaWYgKGlleGVjLT5leGVjdXRlKQorCQlCSU9TTE9HKGJpb3MsICIweCUwNFg6IC0tLS0tLSBTa2lwcGluZyBmb2xsb3dpbmcgY29tbWFuZHMgIC0tLS0tLVxuIiwgb2Zmc2V0KTsKKwllbHNlCisJCUJJT1NMT0coYmlvcywgIjB4JTA0WDogLS0tLS0tIEV4ZWN1dGluZyBmb2xsb3dpbmcgY29tbWFuZHMgLS0tLS0tXG4iLCBvZmZzZXQpOworCisJaWV4ZWMtPmV4ZWN1dGUgPSAhaWV4ZWMtPmV4ZWN1dGU7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X2lvX2ZsYWdfY29uZGl0aW9uKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwKKwkJICAgICAgIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9JT19GTEFHX0NPTkRJVElPTiAgIG9wY29kZTogMHgzOSAoJzknKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDggYml0KTogY29uZGl0aW9uIG51bWJlcgorCSAqCisJICogQ2hlY2sgY29uZGl0aW9uICJjb25kaXRpb24gbnVtYmVyIiBpbiB0aGUgSU8gZmxhZyBjb25kaXRpb24gdGFibGUuCisJICogSWYgY29uZGl0aW9uIG5vdCBtZXQgc2tpcCBzdWJzZXF1ZW50IG9wY29kZXMgdW50aWwgY29uZGl0aW9uIGlzCisJICogaW52ZXJ0ZWQgKElOSVRfTk9UKSwgb3Igd2UgaGl0IElOSVRfUkVTVU1FCisJICovCisKKwl1aW50OF90IGNvbmQgPSBiaW9zLT5kYXRhW29mZnNldCArIDFdOworCisJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoaW9fZmxhZ19jb25kaXRpb25fbWV0KGJpb3MsIG9mZnNldCwgY29uZCkpCisJCUJJT1NMT0coYmlvcywgIjB4JTA0WDogQ29uZGl0aW9uIGZ1bGZpbGxlZCAtLSBjb250aW51aW5nIHRvIGV4ZWN1dGVcbiIsIG9mZnNldCk7CisJZWxzZSB7CisJCUJJT1NMT0coYmlvcywgIjB4JTA0WDogQ29uZGl0aW9uIG5vdCBmdWxmaWxsZWQgLS0gc2tpcHBpbmcgZm9sbG93aW5nIGNvbW1hbmRzXG4iLCBvZmZzZXQpOworCQlpZXhlYy0+ZXhlY3V0ZSA9IGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF9pZHhfYWRkcl9sYXRjaGVkKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwKKwkJICAgICAgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX0lOREVYX0FERFJFU1NfTEFUQ0hFRCAgIG9wY29kZTogMHg0OSAoJ0knKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggIGJpdCk6IG9wY29kZQorCSAqIG9mZnNldCArIDEgICgzMiBiaXQpOiBjb250cm9sIHJlZ2lzdGVyCisJICogb2Zmc2V0ICsgNSAgKDMyIGJpdCk6IGRhdGEgcmVnaXN0ZXIKKwkgKiBvZmZzZXQgKyA5ICAoMzIgYml0KTogbWFzaworCSAqIG9mZnNldCArIDEzICgzMiBiaXQpOiBkYXRhCisJICogb2Zmc2V0ICsgMTcgKDggIGJpdCk6IGNvdW50CisJICogb2Zmc2V0ICsgMTggKDggIGJpdCk6IGFkZHJlc3MgMQorCSAqIG9mZnNldCArIDE5ICg4ICBiaXQpOiBkYXRhIDEKKwkgKiAuLi4KKwkgKgorCSAqIEZvciBlYWNoIG9mICJjb3VudCIgYWRkcmVzcyBhbmQgZGF0YSBwYWlycywgd3JpdGUgImRhdGEgbiIgdG8KKwkgKiAiZGF0YSByZWdpc3RlciIsIHJlYWQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgImNvbnRyb2wgcmVnaXN0ZXIiLAorCSAqIGFuZCB3cml0ZSBpdCBiYWNrIG9uY2UgQU5EZWQgd2l0aCAibWFzayIsIE9SZWQgd2l0aCAiZGF0YSIsCisJICogYW5kIE9SZWQgd2l0aCAiYWRkcmVzcyBuIgorCSAqLworCisJdWludDMyX3QgY29udHJvbHJlZyA9IFJPTTMyKGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV0pOworCXVpbnQzMl90IGRhdGFyZWcgPSBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDVdKTsKKwl1aW50MzJfdCBtYXNrID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyA5XSk7CisJdWludDMyX3QgZGF0YSA9IFJPTTMyKGJpb3MtPmRhdGFbb2Zmc2V0ICsgMTNdKTsKKwl1aW50OF90IGNvdW50ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAxN107CisJdWludDMyX3QgdmFsdWU7CisJaW50IGk7CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogQ29udHJvbFJlZzogMHglMDhYLCBEYXRhUmVnOiAweCUwOFgsICIKKwkJICAgICAgIk1hc2s6IDB4JTA4WCwgRGF0YTogMHglMDhYLCBDb3VudDogMHglMDJYXG4iLAorCQlvZmZzZXQsIGNvbnRyb2xyZWcsIGRhdGFyZWcsIG1hc2ssIGRhdGEsIGNvdW50KTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXVpbnQ4X3QgaW5zdGFkZHJlc3MgPSBiaW9zLT5kYXRhW29mZnNldCArIDE4ICsgaSAqIDJdOworCQl1aW50OF90IGluc3RkYXRhID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAxOSArIGkgKiAyXTsKKworCQlCSU9TTE9HKGJpb3MsICIweCUwNFg6IEFkZHJlc3M6IDB4JTAyWCwgRGF0YTogMHglMDJYXG4iLAorCQkJb2Zmc2V0LCBpbnN0YWRkcmVzcywgaW5zdGRhdGEpOworCisJCWJpb3Nfd3IzMihiaW9zLCBkYXRhcmVnLCBpbnN0ZGF0YSk7CisJCXZhbHVlICA9IGJpb3NfcmQzMihiaW9zLCBjb250cm9scmVnKSAmIG1hc2s7CisJCXZhbHVlIHw9IGRhdGE7CisJCXZhbHVlIHw9IGluc3RhZGRyZXNzOworCQliaW9zX3dyMzIoYmlvcywgY29udHJvbHJlZywgdmFsdWUpOworCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF9pb19yZXN0cmljdF9wbGwyKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwKKwkJICAgICAgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX0lPX1JFU1RSSUNUX1BMTDIgICBvcGNvZGU6IDB4NEEgKCdKJykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4ICBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoMTYgYml0KTogQ1JUQyBwb3J0CisJICogb2Zmc2V0ICsgMyAgKDggIGJpdCk6IENSVEMgaW5kZXgKKwkgKiBvZmZzZXQgKyA0ICAoOCAgYml0KTogbWFzaworCSAqIG9mZnNldCArIDUgICg4ICBiaXQpOiBzaGlmdAorCSAqIG9mZnNldCArIDYgICg4ICBiaXQpOiBjb3VudAorCSAqIG9mZnNldCArIDcgICgzMiBiaXQpOiByZWdpc3RlcgorCSAqIG9mZnNldCArIDExICgzMiBiaXQpOiBmcmVxdWVuY3kgMQorCSAqIC4uLgorCSAqCisJICogU3RhcnRpbmcgYXQgb2Zmc2V0ICsgMTEgdGhlcmUgYXJlICJjb3VudCIgMzIgYml0IGZyZXF1ZW5jaWVzIChrSHopLgorCSAqIFNldCBQTEwgcmVnaXN0ZXIgInJlZ2lzdGVyIiB0byBjb2VmZmljaWVudHMgZm9yIGZyZXF1ZW5jeSBuLAorCSAqIHNlbGVjdGVkIGJ5IHJlYWRpbmcgaW5kZXggIkNSVEMgaW5kZXgiIG9mICJDUlRDIHBvcnQiIEFORGVkIHdpdGgKKwkgKiAibWFzayIgYW5kIHNoaWZ0ZWQgcmlnaHQgYnkgInNoaWZ0Ii4KKwkgKi8KKworCXVpbnQxNl90IGNydGNwb3J0ID0gUk9NMTYoYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXSk7CisJdWludDhfdCBjcnRjaW5kZXggPSBiaW9zLT5kYXRhW29mZnNldCArIDNdOworCXVpbnQ4X3QgbWFzayA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgNF07CisJdWludDhfdCBzaGlmdCA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgNV07CisJdWludDhfdCBjb3VudCA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgNl07CisJdWludDMyX3QgcmVnID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyA3XSk7CisJdWludDhfdCBjb25maWc7CisJdWludDMyX3QgZnJlcTsKKworCWlmICghaWV4ZWMtPmV4ZWN1dGUpCisJCXJldHVybiB0cnVlOworCisJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBQb3J0OiAweCUwNFgsIEluZGV4OiAweCUwMlgsIE1hc2s6IDB4JTAyWCwgIgorCQkgICAgICAiU2hpZnQ6IDB4JTAyWCwgQ291bnQ6IDB4JTAyWCwgUmVnOiAweCUwOFhcbiIsCisJCW9mZnNldCwgY3J0Y3BvcnQsIGNydGNpbmRleCwgbWFzaywgc2hpZnQsIGNvdW50LCByZWcpOworCisJaWYgKCFyZWcpCisJCXJldHVybiB0cnVlOworCisJY29uZmlnID0gKGJpb3NfaWR4cHJ0X3JkKGJpb3MsIGNydGNwb3J0LCBjcnRjaW5kZXgpICYgbWFzaykgPj4gc2hpZnQ7CisJaWYgKGNvbmZpZyA+IGNvdW50KSB7CisJCU5WX0VSUk9SKGJpb3MtPmRldiwKKwkJCSAiMHglMDRYOiBDb25maWcgMHglMDJYIGV4Y2VlZHMgbWF4aW1hbCBib3VuZCAweCUwMlhcbiIsCisJCQkgb2Zmc2V0LCBjb25maWcsIGNvdW50KTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWZyZXEgPSBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDExICsgY29uZmlnICogNF0pOworCisJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBSZWc6IDB4JTA4WCwgQ29uZmlnOiAweCUwMlgsIEZyZXE6ICVka0h6XG4iLAorCQlvZmZzZXQsIHJlZywgY29uZmlnLCBmcmVxKTsKKworCXNldFBMTChiaW9zLCByZWcsIGZyZXEpOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X3BsbDIoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LCBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfUExMMiAgIG9wY29kZTogMHg0QiAoJ0snKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggIGJpdCk6IG9wY29kZQorCSAqIG9mZnNldCArIDEgICgzMiBiaXQpOiByZWdpc3RlcgorCSAqIG9mZnNldCArIDUgICgzMiBiaXQpOiBmcmVxCisJICoKKwkgKiBTZXQgUExMIHJlZ2lzdGVyICJyZWdpc3RlciIgdG8gY29lZmZpY2llbnRzIGZvciBmcmVxdWVuY3kgImZyZXEiCisJICovCisKKwl1aW50MzJfdCByZWcgPSBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDFdKTsKKwl1aW50MzJfdCBmcmVxID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyA1XSk7CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogUmVnOiAweCUwNFgsIEZyZXE6ICVka0h6XG4iLAorCQlvZmZzZXQsIHJlZywgZnJlcSk7CisKKwlzZXRQTEwoYmlvcywgcmVnLCBmcmVxKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfaTJjX2J5dGUoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LCBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfSTJDX0JZVEUgICBvcGNvZGU6IDB4NEMgKCdMJykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4IGJpdCk6IG9wY29kZQorCSAqIG9mZnNldCArIDEgICg4IGJpdCk6IERDQiBJMkMgdGFibGUgZW50cnkgaW5kZXgKKwkgKiBvZmZzZXQgKyAyICAoOCBiaXQpOiBJMkMgc2xhdmUgYWRkcmVzcworCSAqIG9mZnNldCArIDMgICg4IGJpdCk6IGNvdW50CisJICogb2Zmc2V0ICsgNCAgKDggYml0KTogSTJDIHJlZ2lzdGVyIDEKKwkgKiBvZmZzZXQgKyA1ICAoOCBiaXQpOiBtYXNrIDEKKwkgKiBvZmZzZXQgKyA2ICAoOCBiaXQpOiBkYXRhIDEKKwkgKiAuLi4KKwkgKgorCSAqIEZvciBlYWNoIG9mICJjb3VudCIgcmVnaXN0ZXJzIGdpdmVuIGJ5ICJJMkMgcmVnaXN0ZXIgbiIgb24gdGhlIGRldmljZQorCSAqIGFkZHJlc3NlZCBieSAiSTJDIHNsYXZlIGFkZHJlc3MiIG9uIHRoZSBJMkMgYnVzIGdpdmVuIGJ5CisJICogIkRDQiBJMkMgdGFibGUgZW50cnkgaW5kZXgiLCByZWFkIHRoZSByZWdpc3RlciwgQU5EIHRoZSByZXN1bHQgd2l0aAorCSAqICJtYXNrIG4iIGFuZCBPUiBpdCB3aXRoICJkYXRhIG4iIGJlZm9yZSB3cml0aW5nIGl0IGJhY2sgdG8gdGhlIGRldmljZQorCSAqLworCisJdWludDhfdCBpMmNfaW5kZXggPSBiaW9zLT5kYXRhW29mZnNldCArIDFdOworCXVpbnQ4X3QgaTJjX2FkZHJlc3MgPSBiaW9zLT5kYXRhW29mZnNldCArIDJdOworCXVpbnQ4X3QgY291bnQgPSBiaW9zLT5kYXRhW29mZnNldCArIDNdOworCXN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICpjaGFuOworCXN0cnVjdCBpMmNfbXNnIG1zZzsKKwlpbnQgaTsKKworCWlmICghaWV4ZWMtPmV4ZWN1dGUpCisJCXJldHVybiB0cnVlOworCisJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBEQ0JJMkNJbmRleDogMHglMDJYLCBJMkNBZGRyZXNzOiAweCUwMlgsICIKKwkJICAgICAgIkNvdW50OiAweCUwMlhcbiIsCisJCW9mZnNldCwgaTJjX2luZGV4LCBpMmNfYWRkcmVzcywgY291bnQpOworCisJY2hhbiA9IGluaXRfaTJjX2RldmljZV9maW5kKGJpb3MtPmRldiwgaTJjX2luZGV4KTsKKwlpZiAoIWNoYW4pCisJCXJldHVybiBmYWxzZTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXVpbnQ4X3QgaTJjX3JlZyA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgNCArIGkgKiAzXTsKKwkJdWludDhfdCBtYXNrID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyA1ICsgaSAqIDNdOworCQl1aW50OF90IGRhdGEgPSBiaW9zLT5kYXRhW29mZnNldCArIDYgKyBpICogM107CisJCXVpbnQ4X3QgdmFsdWU7CisKKwkJbXNnLmFkZHIgPSBpMmNfYWRkcmVzczsKKwkJbXNnLmZsYWdzID0gSTJDX01fUkQ7CisJCW1zZy5sZW4gPSAxOworCQltc2cuYnVmID0gJnZhbHVlOworCQlpZiAoaTJjX3RyYW5zZmVyKCZjaGFuLT5hZGFwdGVyLCAmbXNnLCAxKSAhPSAxKQorCQkJcmV0dXJuIGZhbHNlOworCisJCUJJT1NMT0coYmlvcywgIjB4JTA0WDogSTJDUmVnOiAweCUwMlgsIFZhbHVlOiAweCUwMlgsICIKKwkJCSAgICAgICJNYXNrOiAweCUwMlgsIERhdGE6IDB4JTAyWFxuIiwKKwkJCW9mZnNldCwgaTJjX3JlZywgdmFsdWUsIG1hc2ssIGRhdGEpOworCisJCXZhbHVlID0gKHZhbHVlICYgbWFzaykgfCBkYXRhOworCisJCWlmIChiaW9zLT5leGVjdXRlKSB7CisJCQltc2cuYWRkciA9IGkyY19hZGRyZXNzOworCQkJbXNnLmZsYWdzID0gMDsKKwkJCW1zZy5sZW4gPSAxOworCQkJbXNnLmJ1ZiA9ICZ2YWx1ZTsKKwkJCWlmIChpMmNfdHJhbnNmZXIoJmNoYW4tPmFkYXB0ZXIsICZtc2csIDEpICE9IDEpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X3ptX2kyY19ieXRlKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX1pNX0kyQ19CWVRFICAgb3Bjb2RlOiAweDREICgnTScpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoOCBiaXQpOiBEQ0IgSTJDIHRhYmxlIGVudHJ5IGluZGV4CisJICogb2Zmc2V0ICsgMiAgKDggYml0KTogSTJDIHNsYXZlIGFkZHJlc3MKKwkgKiBvZmZzZXQgKyAzICAoOCBiaXQpOiBjb3VudAorCSAqIG9mZnNldCArIDQgICg4IGJpdCk6IEkyQyByZWdpc3RlciAxCisJICogb2Zmc2V0ICsgNSAgKDggYml0KTogZGF0YSAxCisJICogLi4uCisJICoKKwkgKiBGb3IgZWFjaCBvZiAiY291bnQiIHJlZ2lzdGVycyBnaXZlbiBieSAiSTJDIHJlZ2lzdGVyIG4iIG9uIHRoZSBkZXZpY2UKKwkgKiBhZGRyZXNzZWQgYnkgIkkyQyBzbGF2ZSBhZGRyZXNzIiBvbiB0aGUgSTJDIGJ1cyBnaXZlbiBieQorCSAqICJEQ0IgSTJDIHRhYmxlIGVudHJ5IGluZGV4Iiwgc2V0IHRoZSByZWdpc3RlciB0byAiZGF0YSBuIgorCSAqLworCisJdWludDhfdCBpMmNfaW5kZXggPSBiaW9zLT5kYXRhW29mZnNldCArIDFdOworCXVpbnQ4X3QgaTJjX2FkZHJlc3MgPSBiaW9zLT5kYXRhW29mZnNldCArIDJdOworCXVpbnQ4X3QgY291bnQgPSBiaW9zLT5kYXRhW29mZnNldCArIDNdOworCXN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICpjaGFuOworCXN0cnVjdCBpMmNfbXNnIG1zZzsKKwlpbnQgaTsKKworCWlmICghaWV4ZWMtPmV4ZWN1dGUpCisJCXJldHVybiB0cnVlOworCisJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBEQ0JJMkNJbmRleDogMHglMDJYLCBJMkNBZGRyZXNzOiAweCUwMlgsICIKKwkJICAgICAgIkNvdW50OiAweCUwMlhcbiIsCisJCW9mZnNldCwgaTJjX2luZGV4LCBpMmNfYWRkcmVzcywgY291bnQpOworCisJY2hhbiA9IGluaXRfaTJjX2RldmljZV9maW5kKGJpb3MtPmRldiwgaTJjX2luZGV4KTsKKwlpZiAoIWNoYW4pCisJCXJldHVybiBmYWxzZTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXVpbnQ4X3QgaTJjX3JlZyA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgNCArIGkgKiAyXTsKKwkJdWludDhfdCBkYXRhID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyA1ICsgaSAqIDJdOworCisJCUJJT1NMT0coYmlvcywgIjB4JTA0WDogSTJDUmVnOiAweCUwMlgsIERhdGE6IDB4JTAyWFxuIiwKKwkJCW9mZnNldCwgaTJjX3JlZywgZGF0YSk7CisKKwkJaWYgKGJpb3MtPmV4ZWN1dGUpIHsKKwkJCW1zZy5hZGRyID0gaTJjX2FkZHJlc3M7CisJCQltc2cuZmxhZ3MgPSAwOworCQkJbXNnLmxlbiA9IDE7CisJCQltc2cuYnVmID0gJmRhdGE7CisJCQlpZiAoaTJjX3RyYW5zZmVyKCZjaGFuLT5hZGFwdGVyLCAmbXNnLCAxKSAhPSAxKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF96bV9pMmMoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LCBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfWk1fSTJDICAgb3Bjb2RlOiAweDRFICgnTicpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoOCBiaXQpOiBEQ0IgSTJDIHRhYmxlIGVudHJ5IGluZGV4CisJICogb2Zmc2V0ICsgMiAgKDggYml0KTogSTJDIHNsYXZlIGFkZHJlc3MKKwkgKiBvZmZzZXQgKyAzICAoOCBiaXQpOiBjb3VudAorCSAqIG9mZnNldCArIDQgICg4IGJpdCk6IGRhdGEgMQorCSAqIC4uLgorCSAqCisJICogU2VuZCAiY291bnQiIGJ5dGVzICgiZGF0YSBuIikgdG8gdGhlIGRldmljZSBhZGRyZXNzZWQgYnkgIkkyQyBzbGF2ZQorCSAqIGFkZHJlc3MiIG9uIHRoZSBJMkMgYnVzIGdpdmVuIGJ5ICJEQ0IgSTJDIHRhYmxlIGVudHJ5IGluZGV4IgorCSAqLworCisJdWludDhfdCBpMmNfaW5kZXggPSBiaW9zLT5kYXRhW29mZnNldCArIDFdOworCXVpbnQ4X3QgaTJjX2FkZHJlc3MgPSBiaW9zLT5kYXRhW29mZnNldCArIDJdOworCXVpbnQ4X3QgY291bnQgPSBiaW9zLT5kYXRhW29mZnNldCArIDNdOworCXN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICpjaGFuOworCXN0cnVjdCBpMmNfbXNnIG1zZzsKKwl1aW50OF90IGRhdGFbMjU2XTsKKwlpbnQgaTsKKworCWlmICghaWV4ZWMtPmV4ZWN1dGUpCisJCXJldHVybiB0cnVlOworCisJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBEQ0JJMkNJbmRleDogMHglMDJYLCBJMkNBZGRyZXNzOiAweCUwMlgsICIKKwkJICAgICAgIkNvdW50OiAweCUwMlhcbiIsCisJCW9mZnNldCwgaTJjX2luZGV4LCBpMmNfYWRkcmVzcywgY291bnQpOworCisJY2hhbiA9IGluaXRfaTJjX2RldmljZV9maW5kKGJpb3MtPmRldiwgaTJjX2luZGV4KTsKKwlpZiAoIWNoYW4pCisJCXJldHVybiBmYWxzZTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWRhdGFbaV0gPSBiaW9zLT5kYXRhW29mZnNldCArIDQgKyBpXTsKKworCQlCSU9TTE9HKGJpb3MsICIweCUwNFg6IERhdGE6IDB4JTAyWFxuIiwgb2Zmc2V0LCBkYXRhW2ldKTsKKwl9CisKKwlpZiAoYmlvcy0+ZXhlY3V0ZSkgeworCQltc2cuYWRkciA9IGkyY19hZGRyZXNzOworCQltc2cuZmxhZ3MgPSAwOworCQltc2cubGVuID0gY291bnQ7CisJCW1zZy5idWYgPSBkYXRhOworCQlpZiAoaTJjX3RyYW5zZmVyKCZjaGFuLT5hZGFwdGVyLCAmbXNnLCAxKSAhPSAxKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF90bWRzKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX1RNRFMgICBvcGNvZGU6IDB4NEYgKCdPJykJKG5vbi1jYW5vbiBuYW1lKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDggYml0KTogbWFnaWMgbG9va3VwIHZhbHVlCisJICogb2Zmc2V0ICsgMiAgKDggYml0KTogVE1EUyBhZGRyZXNzCisJICogb2Zmc2V0ICsgMyAgKDggYml0KTogbWFzaworCSAqIG9mZnNldCArIDQgICg4IGJpdCk6IGRhdGEKKwkgKgorCSAqIFJlYWQgdGhlIGRhdGEgcmVnIGZvciBUTURTIGFkZHJlc3MgIlRNRFMgYWRkcmVzcyIsIEFORCBpdCB3aXRoIG1hc2sKKwkgKiBhbmQgT1IgaXQgd2l0aCBkYXRhLCB0aGVuIHdyaXRlIGl0IGJhY2sKKwkgKiAibWFnaWMgbG9va3VwIHZhbHVlIiBkZXRlcm1pbmVzIHdoaWNoIFRNRFMgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIGlzCisJICogdXNlZCAtLSBzZWUgZ2V0X3RtZHNfaW5kZXhfcmVnKCkKKwkgKi8KKworCXVpbnQ4X3QgbWx2ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXTsKKwl1aW50MzJfdCB0bWRzYWRkciA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMl07CisJdWludDhfdCBtYXNrID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAzXTsKKwl1aW50OF90IGRhdGEgPSBiaW9zLT5kYXRhW29mZnNldCArIDRdOworCXVpbnQzMl90IHJlZywgdmFsdWU7CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogTWFnaWNMb29rdXBWYWx1ZTogMHglMDJYLCBUTURTQWRkcjogMHglMDJYLCAiCisJCSAgICAgICJNYXNrOiAweCUwMlgsIERhdGE6IDB4JTAyWFxuIiwKKwkJb2Zmc2V0LCBtbHYsIHRtZHNhZGRyLCBtYXNrLCBkYXRhKTsKKworCXJlZyA9IGdldF90bWRzX2luZGV4X3JlZyhiaW9zLT5kZXYsIG1sdik7CisJaWYgKCFyZWcpCisJCXJldHVybiBmYWxzZTsKKworCWJpb3Nfd3IzMihiaW9zLCByZWcsCisJCSAgdG1kc2FkZHIgfCBOVl9QUkFNREFDX0ZQX1RNRFNfQ09OVFJPTF9XUklURV9ESVNBQkxFKTsKKwl2YWx1ZSA9IChiaW9zX3JkMzIoYmlvcywgcmVnICsgNCkgJiBtYXNrKSB8IGRhdGE7CisJYmlvc193cjMyKGJpb3MsIHJlZyArIDQsIHZhbHVlKTsKKwliaW9zX3dyMzIoYmlvcywgcmVnLCB0bWRzYWRkcik7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfem1fdG1kc19ncm91cChzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsCisJCSAgIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9aTV9UTURTX0dST1VQICAgb3Bjb2RlOiAweDUwICgnUCcpCShub24tY2Fub24gbmFtZSkKKwkgKgorCSAqIG9mZnNldCAgICAgICg4IGJpdCk6IG9wY29kZQorCSAqIG9mZnNldCArIDEgICg4IGJpdCk6IG1hZ2ljIGxvb2t1cCB2YWx1ZQorCSAqIG9mZnNldCArIDIgICg4IGJpdCk6IGNvdW50CisJICogb2Zmc2V0ICsgMyAgKDggYml0KTogYWRkciAxCisJICogb2Zmc2V0ICsgNCAgKDggYml0KTogZGF0YSAxCisJICogLi4uCisJICoKKwkgKiBGb3IgZWFjaCBvZiAiY291bnQiIFRNRFMgYWRkcmVzcyBhbmQgZGF0YSBwYWlycyB3cml0ZSAiZGF0YSBuIiB0bworCSAqICJhZGRyIG4iLiAgIm1hZ2ljIGxvb2t1cCB2YWx1ZSIgZGV0ZXJtaW5lcyB3aGljaCBUTURTIGJhc2UgYWRkcmVzcworCSAqIHJlZ2lzdGVyIGlzIHVzZWQgLS0gc2VlIGdldF90bWRzX2luZGV4X3JlZygpCisJICovCisKKwl1aW50OF90IG1sdiA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV07CisJdWludDhfdCBjb3VudCA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMl07CisJdWludDMyX3QgcmVnOworCWludCBpOworCisJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwlCSU9TTE9HKGJpb3MsICIweCUwNFg6IE1hZ2ljTG9va3VwVmFsdWU6IDB4JTAyWCwgQ291bnQ6IDB4JTAyWFxuIiwKKwkJb2Zmc2V0LCBtbHYsIGNvdW50KTsKKworCXJlZyA9IGdldF90bWRzX2luZGV4X3JlZyhiaW9zLT5kZXYsIG1sdik7CisJaWYgKCFyZWcpCisJCXJldHVybiBmYWxzZTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXVpbnQ4X3QgdG1kc2FkZHIgPSBiaW9zLT5kYXRhW29mZnNldCArIDMgKyBpICogMl07CisJCXVpbnQ4X3QgdG1kc2RhdGEgPSBiaW9zLT5kYXRhW29mZnNldCArIDQgKyBpICogMl07CisKKwkJYmlvc193cjMyKGJpb3MsIHJlZyArIDQsIHRtZHNkYXRhKTsKKwkJYmlvc193cjMyKGJpb3MsIHJlZywgdG1kc2FkZHIpOworCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF9jcl9pZHhfYWRyX2xhdGNoKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwKKwkJICAgICAgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX0NSX0lOREVYX0FERFJFU1NfTEFUQ0hFRCAgIG9wY29kZTogMHg1MSAoJ1EnKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDggYml0KTogQ1JUQyBpbmRleDEKKwkgKiBvZmZzZXQgKyAyICAoOCBiaXQpOiBDUlRDIGluZGV4MgorCSAqIG9mZnNldCArIDMgICg4IGJpdCk6IGJhc2VhZGRyCisJICogb2Zmc2V0ICsgNCAgKDggYml0KTogY291bnQKKwkgKiBvZmZzZXQgKyA1ICAoOCBiaXQpOiBkYXRhIDEKKwkgKiAuLi4KKwkgKgorCSAqIEZvciBlYWNoIG9mICJjb3VudCIgYWRkcmVzcyBhbmQgZGF0YSBwYWlycywgd3JpdGUgImJhc2VhZGRyICsgbiIgdG8KKwkgKiAiQ1JUQyBpbmRleDEiIGFuZCAiZGF0YSBuIiB0byAiQ1JUQyBpbmRleDIiCisJICogT25jZSBjb21wbGV0ZSwgcmVzdG9yZSBpbml0aWFsIHZhbHVlIHJlYWQgZnJvbSAiQ1JUQyBpbmRleDEiCisJICovCisJdWludDhfdCBjcnRjaW5kZXgxID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXTsKKwl1aW50OF90IGNydGNpbmRleDIgPSBiaW9zLT5kYXRhW29mZnNldCArIDJdOworCXVpbnQ4X3QgYmFzZWFkZHIgPSBiaW9zLT5kYXRhW29mZnNldCArIDNdOworCXVpbnQ4X3QgY291bnQgPSBiaW9zLT5kYXRhW29mZnNldCArIDRdOworCXVpbnQ4X3Qgb2xkYWRkciwgZGF0YTsKKwlpbnQgaTsKKworCWlmICghaWV4ZWMtPmV4ZWN1dGUpCisJCXJldHVybiB0cnVlOworCisJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBJbmRleDE6IDB4JTAyWCwgSW5kZXgyOiAweCUwMlgsICIKKwkJICAgICAgIkJhc2VBZGRyOiAweCUwMlgsIENvdW50OiAweCUwMlhcbiIsCisJCW9mZnNldCwgY3J0Y2luZGV4MSwgY3J0Y2luZGV4MiwgYmFzZWFkZHIsIGNvdW50KTsKKworCW9sZGFkZHIgPSBiaW9zX2lkeHBydF9yZChiaW9zLCBOVl9DSU9fQ1JYX19DT0xPUiwgY3J0Y2luZGV4MSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQliaW9zX2lkeHBydF93cihiaW9zLCBOVl9DSU9fQ1JYX19DT0xPUiwgY3J0Y2luZGV4MSwKKwkJCQkgICAgIGJhc2VhZGRyICsgaSk7CisJCWRhdGEgPSBiaW9zLT5kYXRhW29mZnNldCArIDUgKyBpXTsKKwkJYmlvc19pZHhwcnRfd3IoYmlvcywgTlZfQ0lPX0NSWF9fQ09MT1IsIGNydGNpbmRleDIsIGRhdGEpOworCX0KKworCWJpb3NfaWR4cHJ0X3dyKGJpb3MsIE5WX0NJT19DUlhfX0NPTE9SLCBjcnRjaW5kZXgxLCBvbGRhZGRyKTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF9jcihzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9DUiAgIG9wY29kZTogMHg1MiAoJ1InKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggIGJpdCk6IG9wY29kZQorCSAqIG9mZnNldCArIDEgICg4ICBiaXQpOiBDUlRDIGluZGV4CisJICogb2Zmc2V0ICsgMiAgKDggIGJpdCk6IG1hc2sKKwkgKiBvZmZzZXQgKyAzICAoOCAgYml0KTogZGF0YQorCSAqCisJICogQXNzaWduIHRoZSB2YWx1ZSBvZiBhdCAiQ1JUQyBpbmRleCIgQU5EZWQgd2l0aCBtYXNrIGFuZCBPUmVkIHdpdGgKKwkgKiBkYXRhIGJhY2sgdG8gIkNSVEMgaW5kZXgiCisJICovCisKKwl1aW50OF90IGNydGNpbmRleCA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV07CisJdWludDhfdCBtYXNrID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAyXTsKKwl1aW50OF90IGRhdGEgPSBiaW9zLT5kYXRhW29mZnNldCArIDNdOworCXVpbnQ4X3QgdmFsdWU7CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogSW5kZXg6IDB4JTAyWCwgTWFzazogMHglMDJYLCBEYXRhOiAweCUwMlhcbiIsCisJCW9mZnNldCwgY3J0Y2luZGV4LCBtYXNrLCBkYXRhKTsKKworCXZhbHVlICA9IGJpb3NfaWR4cHJ0X3JkKGJpb3MsIE5WX0NJT19DUlhfX0NPTE9SLCBjcnRjaW5kZXgpICYgbWFzazsKKwl2YWx1ZSB8PSBkYXRhOworCWJpb3NfaWR4cHJ0X3dyKGJpb3MsIE5WX0NJT19DUlhfX0NPTE9SLCBjcnRjaW5kZXgsIHZhbHVlKTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF96bV9jcihzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9aTV9DUiAgIG9wY29kZTogMHg1MyAoJ1MnKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDggYml0KTogQ1JUQyBpbmRleAorCSAqIG9mZnNldCArIDIgICg4IGJpdCk6IHZhbHVlCisJICoKKwkgKiBBc3NpZ24gInZhbHVlIiB0byBDUlRDIHJlZ2lzdGVyIHdpdGggaW5kZXggIkNSVEMgaW5kZXgiLgorCSAqLworCisJdWludDhfdCBjcnRjaW5kZXggPSBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDFdKTsKKwl1aW50OF90IGRhdGEgPSBiaW9zLT5kYXRhW29mZnNldCArIDJdOworCisJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwliaW9zX2lkeHBydF93cihiaW9zLCBOVl9DSU9fQ1JYX19DT0xPUiwgY3J0Y2luZGV4LCBkYXRhKTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF96bV9jcl9ncm91cChzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9aTV9DUl9HUk9VUCAgIG9wY29kZTogMHg1NCAoJ1QnKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDggYml0KTogY291bnQKKwkgKiBvZmZzZXQgKyAyICAoOCBiaXQpOiBDUlRDIGluZGV4IDEKKwkgKiBvZmZzZXQgKyAzICAoOCBiaXQpOiB2YWx1ZSAxCisJICogLi4uCisJICoKKwkgKiBGb3IgImNvdW50IiwgYXNzaWduICJ2YWx1ZSBuIiB0byBDUlRDIHJlZ2lzdGVyIHdpdGggaW5kZXgKKwkgKiAiQ1JUQyBpbmRleCBuIi4KKwkgKi8KKworCXVpbnQ4X3QgY291bnQgPSBiaW9zLT5kYXRhW29mZnNldCArIDFdOworCWludCBpOworCisJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJaW5pdF96bV9jcihiaW9zLCBvZmZzZXQgKyAyICsgMiAqIGkgLSAxLCBpZXhlYyk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfY29uZGl0aW9uX3RpbWUoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LAorCQkgICAgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX0NPTkRJVElPTl9USU1FICAgb3Bjb2RlOiAweDU2ICgnVicpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoOCBiaXQpOiBjb25kaXRpb24gbnVtYmVyCisJICogb2Zmc2V0ICsgMiAgKDggYml0KTogcmV0cmllcyAvIDUwCisJICoKKwkgKiBDaGVjayBjb25kaXRpb24gImNvbmRpdGlvbiBudW1iZXIiIGluIHRoZSBjb25kaXRpb24gdGFibGUuCisJICogQmlvcyBjb2RlIHRoZW4gc2xlZXBzIGZvciAybXMgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgbWV0LCBhbmQKKwkgKiByZXBlYXRzIHVwIHRvICJyZXRyaWVzIiB0aW1lcywgYnV0IG9uIG9uZSBDNTEgdGhpcyBoYXMgcHJvdmVkCisJICogaW5zdWZmaWNpZW50LiAgSW4gbW1pb3RyYWNlcyB0aGUgZHJpdmVyIHNsZWVwcyBmb3IgMjBtcywgc28gd2UgZG8KKwkgKiB0aGlzLCBhbmQgYmFpbCBhZnRlciAicmV0cmllcyIgdGltZXMsIG9yIDJzLCB3aGljaGV2ZXIgaXMgbGVzcy4KKwkgKiBJZiBzdGlsbCBub3QgbWV0IGFmdGVyIHJldHJpZXMsIGNsZWFyIGV4ZWN1dGlvbiBmbGFnIGZvciB0aGlzIHRhYmxlLgorCSAqLworCisJdWludDhfdCBjb25kID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXTsKKwl1aW50MTZfdCByZXRyaWVzID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAyXSAqIDUwOworCXVuc2lnbmVkIGNudDsKKworCWlmICghaWV4ZWMtPmV4ZWN1dGUpCisJCXJldHVybiB0cnVlOworCisJaWYgKHJldHJpZXMgPiAxMDApCisJCXJldHJpZXMgPSAxMDA7CisKKwlCSU9TTE9HKGJpb3MsICIweCUwNFg6IENvbmRpdGlvbjogMHglMDJYLCBSZXRyaWVzOiAweCUwMlhcbiIsCisJCW9mZnNldCwgY29uZCwgcmV0cmllcyk7CisKKwlpZiAoIWJpb3MtPmV4ZWN1dGUpIC8qIGF2b2lkIDJzIGRlbGF5cyB3aGVuICJmYWtpbmciIGV4ZWN1dGlvbiAqLworCQlyZXRyaWVzID0gMTsKKworCWZvciAoY250ID0gMDsgY250IDwgcmV0cmllczsgY250KyspIHsKKwkJaWYgKGJpb3NfY29uZGl0aW9uX21ldChiaW9zLCBvZmZzZXQsIGNvbmQpKSB7CisJCQlCSU9TTE9HKGJpb3MsICIweCUwNFg6IENvbmRpdGlvbiBtZXQsIGNvbnRpbnVpbmdcbiIsCisJCQkJCQkJCW9mZnNldCk7CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCUJJT1NMT0coYmlvcywgIjB4JTA0WDogIgorCQkJCSJDb25kaXRpb24gbm90IG1ldCwgc2xlZXBpbmcgZm9yIDIwbXNcbiIsCisJCQkJCQkJCW9mZnNldCk7CisJCQltc2xlZXAoMjApOworCQl9CisJfQorCisJaWYgKCFiaW9zX2NvbmRpdGlvbl9tZXQoYmlvcywgb2Zmc2V0LCBjb25kKSkgeworCQlOVl9XQVJOKGJpb3MtPmRldiwKKwkJCSIweCUwNFg6IENvbmRpdGlvbiBzdGlsbCBub3QgbWV0IGFmdGVyICVkbXMsICIKKwkJCSJza2lwcGluZyBmb2xsb3dpbmcgb3Bjb2Rlc1xuIiwgb2Zmc2V0LCAyMCAqIHJldHJpZXMpOworCQlpZXhlYy0+ZXhlY3V0ZSA9IGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF96bV9yZWdfc2VxdWVuY2Uoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LAorCQkgICAgIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9aTV9SRUdfU0VRVUVOQ0UgICBvcGNvZGU6IDB4NTggKCdYJykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4ICBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoMzIgYml0KTogYmFzZSByZWdpc3RlcgorCSAqIG9mZnNldCArIDUgICg4ICBiaXQpOiBjb3VudAorCSAqIG9mZnNldCArIDYgICgzMiBiaXQpOiB2YWx1ZSAxCisJICogLi4uCisJICoKKwkgKiBTdGFydGluZyBhdCBvZmZzZXQgKyA2IHRoZXJlIGFyZSAiY291bnQiIDMyIGJpdCB2YWx1ZXMuCisJICogRm9yICJjb3VudCIgaXRlcmF0aW9ucyBzZXQgImJhc2UgcmVnaXN0ZXIiICsgNCAqIGN1cnJlbnRfaXRlcmF0aW9uCisJICogdG8gInZhbHVlIGN1cnJlbnRfaXRlcmF0aW9uIgorCSAqLworCisJdWludDMyX3QgYmFzZXJlZyA9IFJPTTMyKGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV0pOworCXVpbnQzMl90IGNvdW50ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyA1XTsKKwlpbnQgaTsKKworCWlmICghaWV4ZWMtPmV4ZWN1dGUpCisJCXJldHVybiB0cnVlOworCisJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBCYXNlUmVnOiAweCUwOFgsIENvdW50OiAweCUwMlhcbiIsCisJCW9mZnNldCwgYmFzZXJlZywgY291bnQpOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJdWludDMyX3QgcmVnID0gYmFzZXJlZyArIGkgKiA0OworCQl1aW50MzJfdCBkYXRhID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyA2ICsgaSAqIDRdKTsKKworCQliaW9zX3dyMzIoYmlvcywgcmVnLCBkYXRhKTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfc3ViX2RpcmVjdChzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9TVUJfRElSRUNUICAgb3Bjb2RlOiAweDVCICgnWycpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCAgYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDE2IGJpdCk6IHN1YnJvdXRpbmUgb2Zmc2V0IChpbiBiaW9zKQorCSAqCisJICogQ2FsbHMgYSBzdWJyb3V0aW5lIHRoYXQgd2lsbCBleGVjdXRlIGNvbW1hbmRzIHVudGlsIElOSVRfRE9ORQorCSAqIGlzIGZvdW5kLgorCSAqLworCisJdWludDE2X3Qgc3ViX29mZnNldCA9IFJPTTE2KGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV0pOworCisJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwlCSU9TTE9HKGJpb3MsICIweCUwNFg6IEV4ZWN1dGluZyBzdWJyb3V0aW5lIGF0IDB4JTA0WFxuIiwKKwkJb2Zmc2V0LCBzdWJfb2Zmc2V0KTsKKworCXBhcnNlX2luaXRfdGFibGUoYmlvcywgc3ViX29mZnNldCwgaWV4ZWMpOworCisJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBFbmQgb2YgMHglMDRYIHN1YnJvdXRpbmVcbiIsIG9mZnNldCwgc3ViX29mZnNldCk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfY29weV9udl9yZWcoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LCBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfQ09QWV9OVl9SRUcgICBvcGNvZGU6IDB4NUYgKCdfJykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4ICBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoMzIgYml0KTogc3JjIHJlZworCSAqIG9mZnNldCArIDUgICg4ICBiaXQpOiBzaGlmdAorCSAqIG9mZnNldCArIDYgICgzMiBiaXQpOiBzcmMgbWFzaworCSAqIG9mZnNldCArIDEwICgzMiBiaXQpOiB4b3IKKwkgKiBvZmZzZXQgKyAxNCAoMzIgYml0KTogZHN0IHJlZworCSAqIG9mZnNldCArIDE4ICgzMiBiaXQpOiBkc3QgbWFzaworCSAqCisJICogU2hpZnQgUkVHVkFMKCJzcmMgcmVnIikgcmlnaHQgYnkgKHNpZ25lZCkgInNoaWZ0IiwgQU5EIHJlc3VsdCB3aXRoCisJICogInNyYyBtYXNrIiwgdGhlbiBYT1Igd2l0aCAieG9yIi4gV3JpdGUgdGhpcyBPUidkIHdpdGgKKwkgKiAoUkVHVkFMKCJkc3QgcmVnIikgQU5EJ2Qgd2l0aCAiZHN0IG1hc2siKSB0byAiZHN0IHJlZyIKKwkgKi8KKworCXVpbnQzMl90IHNyY3JlZyA9ICooKHVpbnQzMl90ICopKCZiaW9zLT5kYXRhW29mZnNldCArIDFdKSk7CisJdWludDhfdCBzaGlmdCA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgNV07CisJdWludDMyX3Qgc3JjbWFzayA9ICooKHVpbnQzMl90ICopKCZiaW9zLT5kYXRhW29mZnNldCArIDZdKSk7CisJdWludDMyX3QgeG9yID0gKigodWludDMyX3QgKikoJmJpb3MtPmRhdGFbb2Zmc2V0ICsgMTBdKSk7CisJdWludDMyX3QgZHN0cmVnID0gKigodWludDMyX3QgKikoJmJpb3MtPmRhdGFbb2Zmc2V0ICsgMTRdKSk7CisJdWludDMyX3QgZHN0bWFzayA9ICooKHVpbnQzMl90ICopKCZiaW9zLT5kYXRhW29mZnNldCArIDE4XSkpOworCXVpbnQzMl90IHNyY3ZhbHVlLCBkc3R2YWx1ZTsKKworCWlmICghaWV4ZWMtPmV4ZWN1dGUpCisJCXJldHVybiB0cnVlOworCisJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBTcmNSZWc6IDB4JTA4WCwgU2hpZnQ6IDB4JTAyWCwgU3JjTWFzazogMHglMDhYLCAiCisJCSAgICAgICJYb3I6IDB4JTA4WCwgRHN0UmVnOiAweCUwOFgsIERzdE1hc2s6IDB4JTA4WFxuIiwKKwkJb2Zmc2V0LCBzcmNyZWcsIHNoaWZ0LCBzcmNtYXNrLCB4b3IsIGRzdHJlZywgZHN0bWFzayk7CisKKwlzcmN2YWx1ZSA9IGJpb3NfcmQzMihiaW9zLCBzcmNyZWcpOworCisJaWYgKHNoaWZ0IDwgMHg4MCkKKwkJc3JjdmFsdWUgPj49IHNoaWZ0OworCWVsc2UKKwkJc3JjdmFsdWUgPDw9ICgweDEwMCAtIHNoaWZ0KTsKKworCXNyY3ZhbHVlID0gKHNyY3ZhbHVlICYgc3JjbWFzaykgXiB4b3I7CisKKwlkc3R2YWx1ZSA9IGJpb3NfcmQzMihiaW9zLCBkc3RyZWcpICYgZHN0bWFzazsKKworCWJpb3Nfd3IzMihiaW9zLCBkc3RyZWcsIGRzdHZhbHVlIHwgc3JjdmFsdWUpOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X3ptX2luZGV4X2lvKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX1pNX0lOREVYX0lPICAgb3Bjb2RlOiAweDYyICgnYicpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCAgYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDE2IGJpdCk6IENSVEMgcG9ydAorCSAqIG9mZnNldCArIDMgICg4ICBiaXQpOiBDUlRDIGluZGV4CisJICogb2Zmc2V0ICsgNCAgKDggIGJpdCk6IGRhdGEKKwkgKgorCSAqIFdyaXRlICJkYXRhIiB0byBpbmRleCAiQ1JUQyBpbmRleCIgb2YgIkNSVEMgcG9ydCIKKwkgKi8KKwl1aW50MTZfdCBjcnRjcG9ydCA9IFJPTTE2KGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV0pOworCXVpbnQ4X3QgY3J0Y2luZGV4ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAzXTsKKwl1aW50OF90IGRhdGEgPSBiaW9zLT5kYXRhW29mZnNldCArIDRdOworCisJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwliaW9zX2lkeHBydF93cihiaW9zLCBjcnRjcG9ydCwgY3J0Y2luZGV4LCBkYXRhKTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF9jb21wdXRlX21lbShzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9DT01QVVRFX01FTSAgIG9wY29kZTogMHg2MyAoJ2MnKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggYml0KTogb3Bjb2RlCisJICoKKwkgKiBUaGlzIG9wY29kZSBpcyBtZWFudCB0byBzZXQgTlZfUEZCX0NGRzAgKDB4MTAwMjAwKSBhcHByb3ByaWF0ZWx5IHNvCisJICogdGhhdCB0aGUgaGFyZHdhcmUgY2FuIGNvcnJlY3RseSBjYWxjdWxhdGUgaG93IG11Y2ggVlJBTSBpdCBoYXMKKwkgKiAoYW5kIHN1YnNlcXVlbnRseSByZXBvcnQgdGhhdCB2YWx1ZSBpbiBOVl9QRkJfQ1NUQVRVUyAoMHgxMDAyMEMpKQorCSAqCisJICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgb3Bjb2RlIGluIGdlbmVyYWwgY29uc2lzdHMgb2YgdHdvIHBhcnRzOgorCSAqIDEpIGRldGVybWluYXRpb24gb2YgdGhlIG1lbW9yeSBidXMgd2lkdGgKKwkgKiAyKSBkZXRlcm1pbmF0aW9uIG9mIGhvdyBtYW55IG9mIHRoZSBjYXJkJ3MgUkFNIHBhZHMgaGF2ZSBJQ3MgYXR0YWNoZWQKKwkgKgorCSAqIDEpIGlzIGRvbmUgYnkgYSBjdW5uaW5nIGNvbWJpbmF0aW9uIG9mIHdyaXRlcyB0byBvZmZzZXRzIDB4MWMgYW5kCisJICogMHgzYyBpbiB0aGUgZnJhbWVidWZmZXIsIGFuZCBzZWVpbmcgd2hldGhlciB0aGUgd3JpdHRlbiB2YWx1ZXMgYXJlCisJICogcmVhZCBiYWNrIGNvcnJlY3RseS4gVGhpcyB0aGVuIGFmZmVjdHMgYml0cyA0LTcgb2YgTlZfUEZCX0NGRzAKKwkgKgorCSAqIDIpIGlzIGRvbmUgYnkgYSBjdW5uaW5nIGNvbWJpbmF0aW9uIG9mIHdyaXRlcyB0byBhbiBvZmZzZXQgc2xpZ2h0bHkKKwkgKiBsZXNzIHRoYW4gdGhlIG1heGltdW0gbWVtb3J5IHJlcG9ydGVkIGJ5IE5WX1BGQl9DU1RBVFVTLCB0aGVuIHNlZWluZworCSAqIGlmIHRoZSB0ZXN0IHBhdHRlcm4gY2FuIGJlIHJlYWQgYmFjay4gVGhpcyB0aGVuIGFmZmVjdHMgYml0cyAxMi0xNSBvZgorCSAqIE5WX1BGQl9DRkcwCisJICoKKwkgKiBJbiB0aGlzIGNvbnRleHQgYSAiY3VubmluZyBjb21iaW5hdGlvbiIgbWF5IGluY2x1ZGUgbXVsdGlwbGUgcmVhZHMKKwkgKiBhbmQgd3JpdGVzIHRvIHZhcnlpbmcgbG9jYXRpb25zLCBvZnRlbiBhbHRlcm5hdGluZyB0aGUgdGVzdCBwYXR0ZXJuCisJICogYW5kIDAsIGRvdWJ0bGVzcyB0byBtYWtlIHN1cmUgYnVmZmVycyBhcmUgZmlsbGVkLCByZXNpZHVhbCBjaGFyZ2VzCisJICogb24gdHJhY2tzIGFyZSByZW1vdmVkIGV0Yy4KKwkgKgorCSAqIFVuZm9ydHVuYXRlbHksIHRoZSAiY3VubmluZyBjb21iaW5hdGlvbiJzIG1lbnRpb25lZCBhYm92ZSwgYW5kIHRoZQorCSAqIGNoYW5nZXMgdG8gdGhlIGJpdHMgaW4gTlZfUEZCX0NGRzAgZGlmZmVyIHdpdGggbmVhcmx5IGV2ZXJ5IGJpb3MKKwkgKiB0cmFjZSBJIGhhdmUuCisJICoKKwkgKiBUaGVyZWZvcmUsIHdlIGNoZWF0IGFuZCBhc3N1bWUgdGhlIHZhbHVlIG9mIE5WX1BGQl9DRkcwIHdpdGggd2hpY2gKKwkgKiB3ZSBzdGFydGVkIHdhcyBjb3JyZWN0LCBhbmQgdXNlIHRoYXQgaW5zdGVhZAorCSAqLworCisJLyogbm8gaWV4ZWMtPmV4ZWN1dGUgY2hlY2sgYnkgZGVzaWduICovCisKKwkvKgorCSAqIFRoaXMgYXBwZWFycyB0byBiZSBhIE5PUCBvbiBHOHggY2hpcHNldHMsIGJvdGggaW8gbG9ncyBvZiB0aGUgVkJJT1MKKwkgKiBhbmQga21taW8gdHJhY2VzIG9mIHRoZSBiaW5hcnkgZHJpdmVyIFBPU1RpbmcgdGhlIGNhcmQgc2hvdyBub3RoaW5nCisJICogYmVpbmcgZG9uZSBmb3IgdGhpcyBvcGNvZGUuICB3aHkgaXMgaXQgc3RpbGwgbGlzdGVkIGluIHRoZSB0YWJsZT8hCisJICovCisKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBiaW9zLT5kZXYtPmRldl9wcml2YXRlOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApCisJCXJldHVybiB0cnVlOworCisJLyoKKwkgKiBPbiBldmVyeSBjYXJkIEkndmUgc2VlbiwgdGhpcyBzdGVwIGdldHMgZG9uZSBmb3IgdXMgZWFybGllciBpbgorCSAqIHRoZSBpbml0IHNjcmlwdHMKKwl1aW50OF90IGNyZGF0YSA9IGJpb3NfaWR4cHJ0X3JkKGRldiwgTlZfVklPX1NSWCwgMHgwMSk7CisJYmlvc19pZHhwcnRfd3IoZGV2LCBOVl9WSU9fU1JYLCAweDAxLCBjcmRhdGEgfCAweDIwKTsKKwkgKi8KKworCS8qCisJICogVGhpcyBhbHNvIGhhcyBwcm9iYWJseSBiZWVuIGRvbmUgaW4gdGhlIHNjcmlwdHMsIGJ1dCBhbiBtbWlvIHRyYWNlIG9mCisJICogczMgcmVzdW1lIHNob3dzIG52aWRpYSBkb2luZyBpdCBhbnl3YXkgKHVubGlrZSB0aGUgTlZfVklPX1NSWCB3cml0ZSkKKwkgKi8KKwliaW9zX3dyMzIoYmlvcywgTlZfUEZCX1JFRkNUUkwsIE5WX1BGQl9SRUZDVFJMX1ZBTElEXzEpOworCisJLyogd3JpdGUgYmFjayB0aGUgc2F2ZWQgY29uZmlndXJhdGlvbiB2YWx1ZSAqLworCWJpb3Nfd3IzMihiaW9zLCBOVl9QRkJfQ0ZHMCwgYmlvcy0+c3RhdGUuc2F2ZWRfbnZfcGZiX2NmZzApOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X3Jlc2V0KHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX1JFU0VUICAgb3Bjb2RlOiAweDY1ICgnZScpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCAgYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDMyIGJpdCk6IHJlZ2lzdGVyCisJICogb2Zmc2V0ICsgNSAgKDMyIGJpdCk6IHZhbHVlMQorCSAqIG9mZnNldCArIDkgICgzMiBiaXQpOiB2YWx1ZTIKKwkgKgorCSAqIEFzc2lnbiAidmFsdWUxIiB0byAicmVnaXN0ZXIiLCB0aGVuIGFzc2lnbiAidmFsdWUyIiB0byAicmVnaXN0ZXIiCisJICovCisKKwl1aW50MzJfdCByZWcgPSBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDFdKTsKKwl1aW50MzJfdCB2YWx1ZTEgPSBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDVdKTsKKwl1aW50MzJfdCB2YWx1ZTIgPSBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDldKTsKKwl1aW50MzJfdCBwY2lfbnZfMTksIHBjaV9udl8yMDsKKworCS8qIG5vIGlleGVjLT5leGVjdXRlIGNoZWNrIGJ5IGRlc2lnbiAqLworCisJcGNpX252XzE5ID0gYmlvc19yZDMyKGJpb3MsIE5WX1BCVVNfUENJX05WXzE5KTsKKwliaW9zX3dyMzIoYmlvcywgTlZfUEJVU19QQ0lfTlZfMTksIDApOworCWJpb3Nfd3IzMihiaW9zLCByZWcsIHZhbHVlMSk7CisKKwl1ZGVsYXkoMTApOworCisJYmlvc193cjMyKGJpb3MsIHJlZywgdmFsdWUyKTsKKwliaW9zX3dyMzIoYmlvcywgTlZfUEJVU19QQ0lfTlZfMTksIHBjaV9udl8xOSk7CisKKwlwY2lfbnZfMjAgPSBiaW9zX3JkMzIoYmlvcywgTlZfUEJVU19QQ0lfTlZfMjApOworCXBjaV9udl8yMCAmPSB+TlZfUEJVU19QQ0lfTlZfMjBfUk9NX1NIQURPV19FTkFCTEVEOwkvKiAweGZmZmZmZmZlICovCisJYmlvc193cjMyKGJpb3MsIE5WX1BCVVNfUENJX05WXzIwLCBwY2lfbnZfMjApOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X2NvbmZpZ3VyZV9tZW0oc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LAorCQkgICBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfQ09ORklHVVJFX01FTSAgIG9wY29kZTogMHg2NiAoJ2YnKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggYml0KTogb3Bjb2RlCisJICoKKwkgKiBFcXVpdmFsZW50IHRvIElOSVRfRE9ORSBvbiBiaW9zIHZlcnNpb24gMyBvciBncmVhdGVyLgorCSAqIEZvciBlYXJseSBiaW9zIHZlcnNpb25zLCBzZXRzIHVwIHRoZSBtZW1vcnkgcmVnaXN0ZXJzLCB1c2luZyB2YWx1ZXMKKwkgKiB0YWtlbiBmcm9tIHRoZSBtZW1vcnkgaW5pdCB0YWJsZQorCSAqLworCisJLyogbm8gaWV4ZWMtPmV4ZWN1dGUgY2hlY2sgYnkgZGVzaWduICovCisKKwl1aW50MTZfdCBtZW1pbml0b2ZmcyA9IGJpb3MtPmxlZ2FjeS5tZW1faW5pdF90YmxfcHRyICsgTUVNX0lOSVRfU0laRSAqIChiaW9zX2lkeHBydF9yZChiaW9zLCBOVl9DSU9fQ1JYX19DT0xPUiwgTlZfQ0lPX0NSRV9TQ1JBVENINF9fSU5ERVgpID4+IDQpOworCXVpbnQxNl90IHNlcXRibG9mZnMgPSBiaW9zLT5sZWdhY3kuc2RyX3NlcV90YmxfcHRyLCBtZW1pbml0ZGF0YSA9IG1lbWluaXRvZmZzICsgNjsKKwl1aW50MzJfdCByZWcsIGRhdGE7CisKKwlpZiAoYmlvcy0+bWFqb3JfdmVyc2lvbiA+IDIpCisJCXJldHVybiBmYWxzZTsKKworCWJpb3NfaWR4cHJ0X3dyKGJpb3MsIE5WX1ZJT19TUlgsIE5WX1ZJT19TUl9DTE9DS19JTkRFWCwgYmlvc19pZHhwcnRfcmQoCisJCSAgICAgICBiaW9zLCBOVl9WSU9fU1JYLCBOVl9WSU9fU1JfQ0xPQ0tfSU5ERVgpIHwgMHgyMCk7CisKKwlpZiAoYmlvcy0+ZGF0YVttZW1pbml0b2Zmc10gJiAxKQorCQlzZXF0YmxvZmZzID0gYmlvcy0+bGVnYWN5LmRkcl9zZXFfdGJsX3B0cjsKKworCWZvciAocmVnID0gUk9NMzIoYmlvcy0+ZGF0YVtzZXF0YmxvZmZzXSk7CisJICAgICByZWcgIT0gMHhmZmZmZmZmZjsKKwkgICAgIHJlZyA9IFJPTTMyKGJpb3MtPmRhdGFbc2VxdGJsb2ZmcyArPSA0XSkpIHsKKworCQlzd2l0Y2ggKHJlZykgeworCQljYXNlIE5WX1BGQl9QUkU6CisJCQlkYXRhID0gTlZfUEZCX1BSRV9DTURfUFJFQ0hBUkdFOworCQkJYnJlYWs7CisJCWNhc2UgTlZfUEZCX1BBRDoKKwkJCWRhdGEgPSBOVl9QRkJfUEFEX0NLRV9OT1JNQUw7CisJCQlicmVhazsKKwkJY2FzZSBOVl9QRkJfUkVGOgorCQkJZGF0YSA9IE5WX1BGQl9SRUZfQ01EX1JFRlJFU0g7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRhdGEgPSBST00zMihiaW9zLT5kYXRhW21lbWluaXRkYXRhXSk7CisJCQltZW1pbml0ZGF0YSArPSA0OworCQkJaWYgKGRhdGEgPT0gMHhmZmZmZmZmZikKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWJpb3Nfd3IzMihiaW9zLCByZWcsIGRhdGEpOworCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF9jb25maWd1cmVfY2xrKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwKKwkJICAgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX0NPTkZJR1VSRV9DTEsgICBvcGNvZGU6IDB4NjcgKCdnJykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4IGJpdCk6IG9wY29kZQorCSAqCisJICogRXF1aXZhbGVudCB0byBJTklUX0RPTkUgb24gYmlvcyB2ZXJzaW9uIDMgb3IgZ3JlYXRlci4KKwkgKiBGb3IgZWFybHkgYmlvcyB2ZXJzaW9ucywgc2V0cyB1cCB0aGUgTlZDbGsgYW5kIE1DbGsgUExMcywgdXNpbmcKKwkgKiB2YWx1ZXMgdGFrZW4gZnJvbSB0aGUgbWVtb3J5IGluaXQgdGFibGUKKwkgKi8KKworCS8qIG5vIGlleGVjLT5leGVjdXRlIGNoZWNrIGJ5IGRlc2lnbiAqLworCisJdWludDE2X3QgbWVtaW5pdG9mZnMgPSBiaW9zLT5sZWdhY3kubWVtX2luaXRfdGJsX3B0ciArIE1FTV9JTklUX1NJWkUgKiAoYmlvc19pZHhwcnRfcmQoYmlvcywgTlZfQ0lPX0NSWF9fQ09MT1IsIE5WX0NJT19DUkVfU0NSQVRDSDRfX0lOREVYKSA+PiA0KTsKKwlpbnQgY2xvY2s7CisKKwlpZiAoYmlvcy0+bWFqb3JfdmVyc2lvbiA+IDIpCisJCXJldHVybiBmYWxzZTsKKworCWNsb2NrID0gUk9NMTYoYmlvcy0+ZGF0YVttZW1pbml0b2ZmcyArIDRdKSAqIDEwOworCXNldFBMTChiaW9zLCBOVl9QUkFNREFDX05WUExMX0NPRUZGLCBjbG9jayk7CisKKwljbG9jayA9IFJPTTE2KGJpb3MtPmRhdGFbbWVtaW5pdG9mZnMgKyAyXSkgKiAxMDsKKwlpZiAoYmlvcy0+ZGF0YVttZW1pbml0b2Zmc10gJiAxKSAvKiBERFIgKi8KKwkJY2xvY2sgKj0gMjsKKwlzZXRQTEwoYmlvcywgTlZfUFJBTURBQ19NUExMX0NPRUZGLCBjbG9jayk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfY29uZmlndXJlX3ByZWluaXQoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LAorCQkgICAgICAgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX0NPTkZJR1VSRV9QUkVJTklUICAgb3Bjb2RlOiAweDY4ICgnaCcpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCBiaXQpOiBvcGNvZGUKKwkgKgorCSAqIEVxdWl2YWxlbnQgdG8gSU5JVF9ET05FIG9uIGJpb3MgdmVyc2lvbiAzIG9yIGdyZWF0ZXIuCisJICogRm9yIGVhcmx5IGJpb3MgdmVyc2lvbnMsIGRvZXMgZWFybHkgaW5pdCwgbG9hZGluZyByYW0gYW5kIGNyeXN0YWwKKwkgKiBjb25maWd1cmF0aW9uIGZyb20gc3RyYXBzIGludG8gQ1IzQworCSAqLworCisJLyogbm8gaWV4ZWMtPmV4ZWN1dGUgY2hlY2sgYnkgZGVzaWduICovCisKKwl1aW50MzJfdCBzdHJhcHMgPSBiaW9zX3JkMzIoYmlvcywgTlZfUEVYVERFVl9CT09UXzApOworCXVpbnQ4X3QgY3IzYyA9ICgoc3RyYXBzIDw8IDIpICYgMHhmMCkgfCAoc3RyYXBzICYgKDEgPDwgNikpOworCisJaWYgKGJpb3MtPm1ham9yX3ZlcnNpb24gPiAyKQorCQlyZXR1cm4gZmFsc2U7CisKKwliaW9zX2lkeHBydF93cihiaW9zLCBOVl9DSU9fQ1JYX19DT0xPUiwKKwkJCSAgICAgTlZfQ0lPX0NSRV9TQ1JBVENINF9fSU5ERVgsIGNyM2MpOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X2lvKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX0lPICAgb3Bjb2RlOiAweDY5ICgnaScpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCAgYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDE2IGJpdCk6IENSVEMgcG9ydAorCSAqIG9mZnNldCArIDMgICg4ICBiaXQpOiBtYXNrCisJICogb2Zmc2V0ICsgNCAgKDggIGJpdCk6IGRhdGEKKwkgKgorCSAqIEFzc2lnbiAoKElPVkFMKCJjcnRjIHBvcnQiKSAmICJtYXNrIikgfCAiZGF0YSIpIHRvICJjcnRjIHBvcnQiCisJICovCisKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBiaW9zLT5kZXYtPmRldl9wcml2YXRlOworCXVpbnQxNl90IGNydGNwb3J0ID0gUk9NMTYoYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXSk7CisJdWludDhfdCBtYXNrID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAzXTsKKwl1aW50OF90IGRhdGEgPSBiaW9zLT5kYXRhW29mZnNldCArIDRdOworCisJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwlCSU9TTE9HKGJpb3MsICIweCUwNFg6IFBvcnQ6IDB4JTA0WCwgTWFzazogMHglMDJYLCBEYXRhOiAweCUwMlhcbiIsCisJCW9mZnNldCwgY3J0Y3BvcnQsIG1hc2ssIGRhdGEpOworCisJLyoKKwkgKiBJIGhhdmUgbm8gaWRlYSB3aGF0IHRoaXMgZG9lcywgYnV0IE5WSURJQSBkbyB0aGlzIG1hZ2ljIHNlcXVlbmNlCisJICogaW4gdGhlIHBsYWNlcyB3aGVyZSB0aGlzIElOSVRfSU8gaGFwcGVucy4uCisJICovCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTAgJiYgY3J0Y3BvcnQgPT0gMHgzYzMgJiYgZGF0YSA9PSAxKSB7CisJCWludCBpOworCisJCWJpb3Nfd3IzMihiaW9zLCAweDYxNDEwMCwgKGJpb3NfcmQzMigKKwkJCSAgYmlvcywgMHg2MTQxMDApICYgMHgwZmZmZmZmZikgfCAweDAwODAwMDAwKTsKKworCQliaW9zX3dyMzIoYmlvcywgMHgwMGUxOGMsIGJpb3NfcmQzMigKKwkJCSAgYmlvcywgMHgwMGUxOGMpIHwgMHgwMDAyMDAwMCk7CisKKwkJYmlvc193cjMyKGJpb3MsIDB4NjE0OTAwLCAoYmlvc19yZDMyKAorCQkJICBiaW9zLCAweDYxNDkwMCkgJiAweDBmZmZmZmZmKSB8IDB4MDA4MDAwMDApOworCisJCWJpb3Nfd3IzMihiaW9zLCAweDAwMDIwMCwgYmlvc19yZDMyKAorCQkJICBiaW9zLCAweDAwMDIwMCkgJiB+MHg0MDAwMDAwMCk7CisKKwkJbWRlbGF5KDEwKTsKKworCQliaW9zX3dyMzIoYmlvcywgMHgwMGUxOGMsIGJpb3NfcmQzMigKKwkJCSAgYmlvcywgMHgwMGUxOGMpICYgfjB4MDAwMjAwMDApOworCisJCWJpb3Nfd3IzMihiaW9zLCAweDAwMDIwMCwgYmlvc19yZDMyKAorCQkJICBiaW9zLCAweDAwMDIwMCkgfCAweDQwMDAwMDAwKTsKKworCQliaW9zX3dyMzIoYmlvcywgMHg2MTQxMDAsIDB4MDA4MDAwMTgpOworCQliaW9zX3dyMzIoYmlvcywgMHg2MTQ5MDAsIDB4MDA4MDAwMTgpOworCisJCW1kZWxheSgxMCk7CisKKwkJYmlvc193cjMyKGJpb3MsIDB4NjE0MTAwLCAweDEwMDAwMDE4KTsKKwkJYmlvc193cjMyKGJpb3MsIDB4NjE0OTAwLCAweDEwMDAwMDE4KTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJYmlvc193cjMyKGJpb3MsIDB4NjE0MjgwICsgKGkqMHg4MDApLCBiaW9zX3JkMzIoCisJCQkJICBiaW9zLCAweDYxNDI4MCArIChpKjB4ODAwKSkgJiAweGYwZjBmMGYwKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQkJYmlvc193cjMyKGJpb3MsIDB4NjE0MzAwICsgKGkqMHg4MDApLCBiaW9zX3JkMzIoCisJCQkJICBiaW9zLCAweDYxNDMwMCArIChpKjB4ODAwKSkgJiAweGZmZmZmMGYwKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJYmlvc193cjMyKGJpb3MsIDB4NjE0MzgwICsgKGkqMHg4MDApLCBiaW9zX3JkMzIoCisJCQkJICBiaW9zLCAweDYxNDM4MCArIChpKjB4ODAwKSkgJiAweGZmZmZmMGYwKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQkJYmlvc193cjMyKGJpb3MsIDB4NjE0MjAwICsgKGkqMHg4MDApLCBiaW9zX3JkMzIoCisJCQkJICBiaW9zLCAweDYxNDIwMCArIChpKjB4ODAwKSkgJiAweGZmZmZmZmYwKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQkJYmlvc193cjMyKGJpb3MsIDB4NjE0MTA4ICsgKGkqMHg4MDApLCBiaW9zX3JkMzIoCisJCQkJICBiaW9zLCAweDYxNDEwOCArIChpKjB4ODAwKSkgJiAweDBmZmZmZmZmKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJYmlvc19wb3J0X3dyKGJpb3MsIGNydGNwb3J0LCAoYmlvc19wb3J0X3JkKGJpb3MsIGNydGNwb3J0KSAmIG1hc2spIHwKKwkJCQkJCQkJCWRhdGEpOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF9zdWIoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LCBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfU1VCICAgb3Bjb2RlOiAweDZCICgnaycpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoOCBiaXQpOiBzY3JpcHQgbnVtYmVyCisJICoKKwkgKiBFeGVjdXRlIHNjcmlwdCBudW1iZXIgInNjcmlwdCBudW1iZXIiLCBhcyBhIHN1YnJvdXRpbmUKKwkgKi8KKworCXVpbnQ4X3Qgc3ViID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXTsKKworCWlmICghaWV4ZWMtPmV4ZWN1dGUpCisJCXJldHVybiB0cnVlOworCisJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBDYWxsaW5nIHNjcmlwdCAlZFxuIiwgb2Zmc2V0LCBzdWIpOworCisJcGFyc2VfaW5pdF90YWJsZShiaW9zLAorCQkJIFJPTTE2KGJpb3MtPmRhdGFbYmlvcy0+aW5pdF9zY3JpcHRfdGJsc19wdHIgKyBzdWIgKiAyXSksCisJCQkgaWV4ZWMpOworCisJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBFbmQgb2Ygc2NyaXB0ICVkXG4iLCBvZmZzZXQsIHN1Yik7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfcmFtX2NvbmRpdGlvbihzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsCisJCSAgIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9SQU1fQ09ORElUSU9OICAgb3Bjb2RlOiAweDZEICgnbScpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoOCBiaXQpOiBtYXNrCisJICogb2Zmc2V0ICsgMiAgKDggYml0KTogY21wdmFsCisJICoKKwkgKiBUZXN0IGlmIChOVl9QRkJfQk9PVF8wICYgIm1hc2siKSBlcXVhbHMgImNtcHZhbCIuCisJICogSWYgY29uZGl0aW9uIG5vdCBtZXQgc2tpcCBzdWJzZXF1ZW50IG9wY29kZXMgdW50aWwgY29uZGl0aW9uIGlzCisJICogaW52ZXJ0ZWQgKElOSVRfTk9UKSwgb3Igd2UgaGl0IElOSVRfUkVTVU1FCisJICovCisKKwl1aW50OF90IG1hc2sgPSBiaW9zLT5kYXRhW29mZnNldCArIDFdOworCXVpbnQ4X3QgY21wdmFsID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAyXTsKKwl1aW50OF90IGRhdGE7CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCWRhdGEgPSBiaW9zX3JkMzIoYmlvcywgTlZfUEZCX0JPT1RfMCkgJiBtYXNrOworCisJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBDaGVja2luZyBpZiAweCUwOFggZXF1YWxzIDB4JTA4WFxuIiwKKwkJb2Zmc2V0LCBkYXRhLCBjbXB2YWwpOworCisJaWYgKGRhdGEgPT0gY21wdmFsKQorCQlCSU9TTE9HKGJpb3MsICIweCUwNFg6IENvbmRpdGlvbiBmdWxmaWxsZWQgLS0gY29udGludWluZyB0byBleGVjdXRlXG4iLCBvZmZzZXQpOworCWVsc2UgeworCQlCSU9TTE9HKGJpb3MsICIweCUwNFg6IENvbmRpdGlvbiBub3QgZnVsZmlsbGVkIC0tIHNraXBwaW5nIGZvbGxvd2luZyBjb21tYW5kc1xuIiwgb2Zmc2V0KTsKKwkJaWV4ZWMtPmV4ZWN1dGUgPSBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfbnZfcmVnKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX05WX1JFRyAgIG9wY29kZTogMHg2RSAoJ24nKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggIGJpdCk6IG9wY29kZQorCSAqIG9mZnNldCArIDEgICgzMiBiaXQpOiByZWdpc3RlcgorCSAqIG9mZnNldCArIDUgICgzMiBiaXQpOiBtYXNrCisJICogb2Zmc2V0ICsgOSAgKDMyIGJpdCk6IGRhdGEKKwkgKgorCSAqIEFzc2lnbiAoKFJFR1ZBTCgicmVnaXN0ZXIiKSAmICJtYXNrIikgfCAiZGF0YSIpIHRvICJyZWdpc3RlciIKKwkgKi8KKworCXVpbnQzMl90IHJlZyA9IFJPTTMyKGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV0pOworCXVpbnQzMl90IG1hc2sgPSBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDVdKTsKKwl1aW50MzJfdCBkYXRhID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyA5XSk7CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogUmVnOiAweCUwOFgsIE1hc2s6IDB4JTA4WCwgRGF0YTogMHglMDhYXG4iLAorCQlvZmZzZXQsIHJlZywgbWFzaywgZGF0YSk7CisKKwliaW9zX3dyMzIoYmlvcywgcmVnLCAoYmlvc19yZDMyKGJpb3MsIHJlZykgJiBtYXNrKSB8IGRhdGEpOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X21hY3JvKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX01BQ1JPICAgb3Bjb2RlOiAweDZGICgnbycpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoOCBiaXQpOiBtYWNybyBudW1iZXIKKwkgKgorCSAqIExvb2sgdXAgbWFjcm8gaW5kZXggIm1hY3JvIG51bWJlciIgaW4gdGhlIG1hY3JvIGluZGV4IHRhYmxlLgorCSAqIFRoZSBtYWNybyBpbmRleCB0YWJsZSBlbnRyeSBoYXMgMSBieXRlIGZvciB0aGUgaW5kZXggaW4gdGhlIG1hY3JvCisJICogdGFibGUsIGFuZCAxIGJ5dGUgZm9yIHRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBtYWNyby4KKwkgKiBUaGUgbWFjcm8gdGFibGUgZW50cnkgaGFzIDQgYnl0ZXMgZm9yIHRoZSByZWdpc3RlciBhZGRyZXNzIGFuZAorCSAqIDQgYnl0ZXMgZm9yIHRoZSB2YWx1ZSB0byB3cml0ZSB0byB0aGF0IHJlZ2lzdGVyCisJICovCisKKwl1aW50OF90IG1hY3JvX2luZGV4X3RibF9pZHggPSBiaW9zLT5kYXRhW29mZnNldCArIDFdOworCXVpbnQxNl90IHRtcCA9IGJpb3MtPm1hY3JvX2luZGV4X3RibF9wdHIgKyAobWFjcm9faW5kZXhfdGJsX2lkeCAqIE1BQ1JPX0lOREVYX1NJWkUpOworCXVpbnQ4X3QgbWFjcm9fdGJsX2lkeCA9IGJpb3MtPmRhdGFbdG1wXTsKKwl1aW50OF90IGNvdW50ID0gYmlvcy0+ZGF0YVt0bXAgKyAxXTsKKwl1aW50MzJfdCByZWcsIGRhdGE7CisJaW50IGk7CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogTWFjcm86IDB4JTAyWCwgTWFjcm9UYWJsZUluZGV4OiAweCUwMlgsICIKKwkJICAgICAgIkNvdW50OiAweCUwMlhcbiIsCisJCW9mZnNldCwgbWFjcm9faW5kZXhfdGJsX2lkeCwgbWFjcm9fdGJsX2lkeCwgY291bnQpOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJdWludDE2X3QgbWFjcm9lbnRyeXB0ciA9IGJpb3MtPm1hY3JvX3RibF9wdHIgKyAobWFjcm9fdGJsX2lkeCArIGkpICogTUFDUk9fU0laRTsKKworCQlyZWcgPSBST00zMihiaW9zLT5kYXRhW21hY3JvZW50cnlwdHJdKTsKKwkJZGF0YSA9IFJPTTMyKGJpb3MtPmRhdGFbbWFjcm9lbnRyeXB0ciArIDRdKTsKKworCQliaW9zX3dyMzIoYmlvcywgcmVnLCBkYXRhKTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfZG9uZShzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9ET05FICAgb3Bjb2RlOiAweDcxICgncScpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCAgYml0KTogb3Bjb2RlCisJICoKKwkgKiBFbmQgdGhlIGN1cnJlbnQgc2NyaXB0CisJICovCisKKwkvKiBtaWxkIHJldHZhbCBhYnVzZSB0byBzdG9wIHBhcnNpbmcgdGhpcyB0YWJsZSAqLworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfcmVzdW1lKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX1JFU1VNRSAgIG9wY29kZTogMHg3MiAoJ3InKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggIGJpdCk6IG9wY29kZQorCSAqCisJICogRW5kIHRoZSBjdXJyZW50IGV4ZWN1dGUgLyBuby1leGVjdXRlIGNvbmRpdGlvbgorCSAqLworCisJaWYgKGlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCWlleGVjLT5leGVjdXRlID0gdHJ1ZTsKKwlCSU9TTE9HKGJpb3MsICIweCUwNFg6IC0tLS0gRXhlY3V0aW5nIGZvbGxvd2luZyBjb21tYW5kcyAtLS0tXG4iLCBvZmZzZXQpOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X3RpbWUoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LCBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfVElNRSAgIG9wY29kZTogMHg3NCAoJ3QnKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggIGJpdCk6IG9wY29kZQorCSAqIG9mZnNldCArIDEgICgxNiBiaXQpOiB0aW1lCisJICoKKwkgKiBTbGVlcCBmb3IgInRpbWUiIG1pY3Jvc2Vjb25kcy4KKwkgKi8KKworCXVuc2lnbmVkIHRpbWUgPSBST00xNihiaW9zLT5kYXRhW29mZnNldCArIDFdKTsKKworCWlmICghaWV4ZWMtPmV4ZWN1dGUpCisJCXJldHVybiB0cnVlOworCisJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBTbGVlcGluZyBmb3IgMHglMDRYIG1pY3Jvc2Vjb25kc1xuIiwKKwkJb2Zmc2V0LCB0aW1lKTsKKworCWlmICh0aW1lIDwgMTAwMCkKKwkJdWRlbGF5KHRpbWUpOworCWVsc2UKKwkJbXNsZWVwKCh0aW1lICsgOTAwKSAvIDEwMDApOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X2NvbmRpdGlvbihzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9DT05ESVRJT04gICBvcGNvZGU6IDB4NzUgKCd1JykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4IGJpdCk6IG9wY29kZQorCSAqIG9mZnNldCArIDEgICg4IGJpdCk6IGNvbmRpdGlvbiBudW1iZXIKKwkgKgorCSAqIENoZWNrIGNvbmRpdGlvbiAiY29uZGl0aW9uIG51bWJlciIgaW4gdGhlIGNvbmRpdGlvbiB0YWJsZS4KKwkgKiBJZiBjb25kaXRpb24gbm90IG1ldCBza2lwIHN1YnNlcXVlbnQgb3Bjb2RlcyB1bnRpbCBjb25kaXRpb24gaXMKKwkgKiBpbnZlcnRlZCAoSU5JVF9OT1QpLCBvciB3ZSBoaXQgSU5JVF9SRVNVTUUKKwkgKi8KKworCXVpbnQ4X3QgY29uZCA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV07CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogQ29uZGl0aW9uOiAweCUwMlhcbiIsIG9mZnNldCwgY29uZCk7CisKKwlpZiAoYmlvc19jb25kaXRpb25fbWV0KGJpb3MsIG9mZnNldCwgY29uZCkpCisJCUJJT1NMT0coYmlvcywgIjB4JTA0WDogQ29uZGl0aW9uIGZ1bGZpbGxlZCAtLSBjb250aW51aW5nIHRvIGV4ZWN1dGVcbiIsIG9mZnNldCk7CisJZWxzZSB7CisJCUJJT1NMT0coYmlvcywgIjB4JTA0WDogQ29uZGl0aW9uIG5vdCBmdWxmaWxsZWQgLS0gc2tpcHBpbmcgZm9sbG93aW5nIGNvbW1hbmRzXG4iLCBvZmZzZXQpOworCQlpZXhlYy0+ZXhlY3V0ZSA9IGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF9pb19jb25kaXRpb24oc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LCBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfSU9fQ09ORElUSU9OICBvcGNvZGU6IDB4NzYKKwkgKgorCSAqIG9mZnNldCAgICAgICg4IGJpdCk6IG9wY29kZQorCSAqIG9mZnNldCArIDEgICg4IGJpdCk6IGNvbmRpdGlvbiBudW1iZXIKKwkgKgorCSAqIENoZWNrIGNvbmRpdGlvbiAiY29uZGl0aW9uIG51bWJlciIgaW4gdGhlIGlvIGNvbmRpdGlvbiB0YWJsZS4KKwkgKiBJZiBjb25kaXRpb24gbm90IG1ldCBza2lwIHN1YnNlcXVlbnQgb3Bjb2RlcyB1bnRpbCBjb25kaXRpb24gaXMKKwkgKiBpbnZlcnRlZCAoSU5JVF9OT1QpLCBvciB3ZSBoaXQgSU5JVF9SRVNVTUUKKwkgKi8KKworCXVpbnQ4X3QgY29uZCA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV07CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCUJJT1NMT0coYmlvcywgIjB4JTA0WDogSU8gY29uZGl0aW9uOiAweCUwMlhcbiIsIG9mZnNldCwgY29uZCk7CisKKwlpZiAoaW9fY29uZGl0aW9uX21ldChiaW9zLCBvZmZzZXQsIGNvbmQpKQorCQlCSU9TTE9HKGJpb3MsICIweCUwNFg6IENvbmRpdGlvbiBmdWxmaWxsZWQgLS0gY29udGludWluZyB0byBleGVjdXRlXG4iLCBvZmZzZXQpOworCWVsc2UgeworCQlCSU9TTE9HKGJpb3MsICIweCUwNFg6IENvbmRpdGlvbiBub3QgZnVsZmlsbGVkIC0tIHNraXBwaW5nIGZvbGxvd2luZyBjb21tYW5kc1xuIiwgb2Zmc2V0KTsKKwkJaWV4ZWMtPmV4ZWN1dGUgPSBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfaW5kZXhfaW8oc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LCBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfSU5ERVhfSU8gICBvcGNvZGU6IDB4NzggKCd4JykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4ICBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoMTYgYml0KTogQ1JUQyBwb3J0CisJICogb2Zmc2V0ICsgMyAgKDggIGJpdCk6IENSVEMgaW5kZXgKKwkgKiBvZmZzZXQgKyA0ICAoOCAgYml0KTogbWFzaworCSAqIG9mZnNldCArIDUgICg4ICBiaXQpOiBkYXRhCisJICoKKwkgKiBSZWFkIHZhbHVlIGF0IGluZGV4ICJDUlRDIGluZGV4IiBvbiAiQ1JUQyBwb3J0IiwgQU5EIHdpdGggIm1hc2siLAorCSAqIE9SIHdpdGggImRhdGEiLCB3cml0ZS1iYWNrCisJICovCisKKwl1aW50MTZfdCBjcnRjcG9ydCA9IFJPTTE2KGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV0pOworCXVpbnQ4X3QgY3J0Y2luZGV4ID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAzXTsKKwl1aW50OF90IG1hc2sgPSBiaW9zLT5kYXRhW29mZnNldCArIDRdOworCXVpbnQ4X3QgZGF0YSA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgNV07CisJdWludDhfdCB2YWx1ZTsKKworCWlmICghaWV4ZWMtPmV4ZWN1dGUpCisJCXJldHVybiB0cnVlOworCisJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBQb3J0OiAweCUwNFgsIEluZGV4OiAweCUwMlgsIE1hc2s6IDB4JTAyWCwgIgorCQkgICAgICAiRGF0YTogMHglMDJYXG4iLAorCQlvZmZzZXQsIGNydGNwb3J0LCBjcnRjaW5kZXgsIG1hc2ssIGRhdGEpOworCisJdmFsdWUgPSAoYmlvc19pZHhwcnRfcmQoYmlvcywgY3J0Y3BvcnQsIGNydGNpbmRleCkgJiBtYXNrKSB8IGRhdGE7CisJYmlvc19pZHhwcnRfd3IoYmlvcywgY3J0Y3BvcnQsIGNydGNpbmRleCwgdmFsdWUpOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X3BsbChzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9QTEwgICBvcGNvZGU6IDB4NzkgKCd5JykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4ICBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoMzIgYml0KTogcmVnaXN0ZXIKKwkgKiBvZmZzZXQgKyA1ICAoMTYgYml0KTogZnJlcQorCSAqCisJICogU2V0IFBMTCByZWdpc3RlciAicmVnaXN0ZXIiIHRvIGNvZWZmaWNpZW50cyBmb3IgZnJlcXVlbmN5ICgxMGtIeikKKwkgKiAiZnJlcSIKKwkgKi8KKworCXVpbnQzMl90IHJlZyA9IFJPTTMyKGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV0pOworCXVpbnQxNl90IGZyZXEgPSBST00xNihiaW9zLT5kYXRhW29mZnNldCArIDVdKTsKKworCWlmICghaWV4ZWMtPmV4ZWN1dGUpCisJCXJldHVybiB0cnVlOworCisJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBSZWc6IDB4JTA4WCwgRnJlcTogJWQwa0h6XG4iLCBvZmZzZXQsIHJlZywgZnJlcSk7CisKKwlzZXRQTEwoYmlvcywgcmVnLCBmcmVxICogMTApOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X3ptX3JlZyhzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9aTV9SRUcgICBvcGNvZGU6IDB4N0EgKCd6JykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4ICBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoMzIgYml0KTogcmVnaXN0ZXIKKwkgKiBvZmZzZXQgKyA1ICAoMzIgYml0KTogdmFsdWUKKwkgKgorCSAqIEFzc2lnbiAidmFsdWUiIHRvICJyZWdpc3RlciIKKwkgKi8KKworCXVpbnQzMl90IHJlZyA9IFJPTTMyKGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV0pOworCXVpbnQzMl90IHZhbHVlID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyA1XSk7CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCWlmIChyZWcgPT0gMHgwMDAyMDApCisJCXZhbHVlIHw9IDE7CisKKwliaW9zX3dyMzIoYmlvcywgcmVnLCB2YWx1ZSk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfcmFtX3Jlc3RyaWN0X3BsbChzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsCisJCSAgICAgIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9SQU1fUkVTVFJJQ1RfUExMICAgb3Bjb2RlOiAweDg3ICgnJykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4IGJpdCk6IG9wY29kZQorCSAqIG9mZnNldCArIDEgICg4IGJpdCk6IFBMTCB0eXBlCisJICogb2Zmc2V0ICsgMiAoMzIgYml0KTogZnJlcXVlbmN5IDAKKwkgKgorCSAqIFVzZXMgdGhlIFJBTUNGRyBzdHJhcCBvZiBQRVhUREVWX0JPT1QgYXMgYW4gaW5kZXggaW50byB0aGUgdGFibGUgYXQKKwkgKiByYW1fcmVzdHJpY3RfdGFibGVfcHRyLiAgVGhlIHZhbHVlIHJlYWQgZnJvbSB0aGVyZSBpcyB1c2VkIHRvIHNlbGVjdAorCSAqIGEgZnJlcXVlbmN5IGZyb20gdGhlIHRhYmxlIHN0YXJ0aW5nIGF0ICdmcmVxdWVuY3kgMCcgdG8gYmUKKwkgKiBwcm9ncmFtbWVkIGludG8gdGhlIFBMTCBjb3JyZXNwb25kaW5nIHRvICd0eXBlJy4KKwkgKgorCSAqIFRoZSBQTEwgbGltaXRzIHRhYmxlIG9uIGNhcmRzIHVzaW5nIHRoaXMgb3Bjb2RlIGhhcyBhIG1hcHBpbmcgb2YKKwkgKiAndHlwZScgdG8gdGhlIHJlbGV2YW50IHJlZ2lzdGVycy4KKwkgKi8KKworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBiaW9zLT5kZXY7CisJdWludDMyX3Qgc3RyYXAgPSAoYmlvc19yZDMyKGJpb3MsIE5WX1BFWFRERVZfQk9PVF8wKSAmIDB4MDAwMDAwM2MpID4+IDI7CisJdWludDhfdCBpbmRleCA9IGJpb3MtPmRhdGFbYmlvcy0+cmFtX3Jlc3RyaWN0X3RibF9wdHIgKyBzdHJhcF07CisJdWludDhfdCB0eXBlID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXTsKKwl1aW50MzJfdCBmcmVxID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyAyICsgKGluZGV4ICogNCldKTsKKwl1aW50OF90ICpwbGxfbGltaXRzID0gJmJpb3MtPmRhdGFbYmlvcy0+cGxsX2xpbWl0X3RibF9wdHJdLCAqZW50cnk7CisJaW50IGk7CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCWlmICghYmlvcy0+cGxsX2xpbWl0X3RibF9wdHIgfHwgKHBsbF9saW1pdHNbMF0gJiAweGYwKSAhPSAweDMwKSB7CisJCU5WX0VSUk9SKGRldiwgIlBMTCBsaW1pdHMgdGFibGUgbm90IHZlcnNpb24gMy54XG4iKTsKKwkJcmV0dXJuIHRydWU7IC8qIGRlbGliZXJhdGUsIGFsbG93IGRlZmF1bHQgY2xvY2tzIHRvIHJlbWFpbiAqLworCX0KKworCWVudHJ5ID0gcGxsX2xpbWl0cyArIHBsbF9saW1pdHNbMV07CisJZm9yIChpID0gMDsgaSA8IHBsbF9saW1pdHNbM107IGkrKywgZW50cnkgKz0gcGxsX2xpbWl0c1syXSkgeworCQlpZiAoZW50cnlbMF0gPT0gdHlwZSkgeworCQkJdWludDMyX3QgcmVnID0gUk9NMzIoZW50cnlbM10pOworCisJCQlCSU9TTE9HKGJpb3MsICIweCUwNFg6ICIKKwkJCQkgICAgICAiVHlwZSAlMDJ4IFJlZyAweCUwOHggRnJlcSAlZEtIelxuIiwKKwkJCQlvZmZzZXQsIHR5cGUsIHJlZywgZnJlcSk7CisKKwkJCXNldFBMTChiaW9zLCByZWcsIGZyZXEpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisKKwlOVl9FUlJPUihkZXYsICJQTEwgdHlwZSAweCUwMnggbm90IGZvdW5kIGluIFBMTCBsaW1pdHMgdGFibGUiLCB0eXBlKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfOGMoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LCBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfOEMgICBvcGNvZGU6IDB4OEMgKCcnKQorCSAqCisJICogTk9QIHNvIGZhci4uLi4KKwkgKgorCSAqLworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0XzhkKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUXzhEICAgb3Bjb2RlOiAweDhEICgnJykKKwkgKgorCSAqIE5PUCBzbyBmYXIuLi4uCisJICoKKwkgKi8KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF9ncGlvKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX0dQSU8gICBvcGNvZGU6IDB4OEUgKCcnKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggYml0KTogb3Bjb2RlCisJICoKKwkgKiBMb29wIG92ZXIgYWxsIGVudHJpZXMgaW4gdGhlIERDQiBHUElPIHRhYmxlLCBhbmQgaW5pdGlhbGlzZQorCSAqIGVhY2ggR1BJTyBhY2NvcmRpbmcgdG8gdmFyaW91cyB2YWx1ZXMgbGlzdGVkIGluIGVhY2ggZW50cnkKKwkgKi8KKworCWNvbnN0IHVpbnQzMl90IG52NTBfZ3Bpb19yZWdbNF0gPSB7IDB4ZTEwNCwgMHhlMTA4LCAweGUyODAsIDB4ZTI4NCB9OworCWNvbnN0IHVpbnQzMl90IG52NTBfZ3Bpb19jdGxbMl0gPSB7IDB4ZTEwMCwgMHhlMjhjIH07CisJY29uc3QgdWludDhfdCAqZ3Bpb190YWJsZSA9ICZiaW9zLT5kYXRhW2Jpb3MtPmJkY2IuZ3Bpb190YWJsZV9wdHJdOworCWNvbnN0IHVpbnQ4X3QgKmdwaW9fZW50cnk7CisJaW50IGk7CisKKwlpZiAoYmlvcy0+YmRjYi52ZXJzaW9uICE9IDB4NDApIHsKKwkJTlZfRVJST1IoYmlvcy0+ZGV2LCAiRENCIHRhYmxlIG5vdCB2ZXJzaW9uIDQuMFxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAoIWJpb3MtPmJkY2IuZ3Bpb190YWJsZV9wdHIpIHsKKwkJTlZfV0FSTihiaW9zLT5kZXYsICJJbnZhbGlkIHBvaW50ZXIgdG8gSU5JVF84RSB0YWJsZVxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlncGlvX2VudHJ5ID0gZ3Bpb190YWJsZSArIGdwaW9fdGFibGVbMV07CisJZm9yIChpID0gMDsgaSA8IGdwaW9fdGFibGVbMl07IGkrKywgZ3Bpb19lbnRyeSArPSBncGlvX3RhYmxlWzNdKSB7CisJCXVpbnQzMl90IGVudHJ5ID0gUk9NMzIoZ3Bpb19lbnRyeVswXSksIHIsIHMsIHY7CisJCWludCBsaW5lID0gKGVudHJ5ICYgMHgwMDAwMDAxZik7CisKKwkJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBFbnRyeTogMHglMDhYXG4iLCBvZmZzZXQsIGVudHJ5KTsKKworCQlpZiAoKGVudHJ5ICYgMHgwMDAwZmYwMCkgPT0gMHgwMDAwZmYwMCkKKwkJCWNvbnRpbnVlOworCisJCXIgPSBudjUwX2dwaW9fcmVnW2xpbmUgPj4gM107CisJCXMgPSAobGluZSAmIDB4MDcpIDw8IDI7CisJCXYgPSBiaW9zX3JkMzIoYmlvcywgcikgJiB+KDB4MDAwMDAwMDMgPDwgcyk7CisJCWlmIChlbnRyeSAmIDB4MDEwMDAwMDApCisJCQl2IHw9ICgoKGVudHJ5ICYgMHg2MDAwMDAwMCkgPj4gMjkpIF4gMikgPDwgczsKKwkJZWxzZQorCQkJdiB8PSAoKChlbnRyeSAmIDB4MTgwMDAwMDApID4+IDI3KSBeIDIpIDw8IHM7CisJCWJpb3Nfd3IzMihiaW9zLCByLCB2KTsKKworCQlyID0gbnY1MF9ncGlvX2N0bFtsaW5lID4+IDRdOworCQlzID0gKGxpbmUgJiAweDBmKTsKKwkJdiA9IGJpb3NfcmQzMihiaW9zLCByKSAmIH4oMHgwMDAxMDAwMSA8PCBzKTsKKwkJc3dpdGNoICgoZW50cnkgJiAweDA2MDAwMDAwKSA+PiAyNSkgeworCQljYXNlIDE6CisJCQl2IHw9ICgweDAwMDAwMDAxIDw8IHMpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXYgfD0gKDB4MDAwMTAwMDAgPDwgcyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWJpb3Nfd3IzMihiaW9zLCByLCB2KTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyogaGFjayB0byBhdm9pZCBtb3ZpbmcgdGhlIGl0YmxfZW50cnkgYXJyYXkgYmVmb3JlIHRoaXMgZnVuY3Rpb24gKi8KK2ludCBpbml0X3JhbV9yZXN0cmljdF96bV9yZWdfZ3JvdXBfYmxvY2tsZW47CisKK3N0YXRpYyBib29sCitpbml0X3JhbV9yZXN0cmljdF96bV9yZWdfZ3JvdXAoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LAorCQkJICAgICAgIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9SQU1fUkVTVFJJQ1RfWk1fUkVHX0dST1VQICAgb3Bjb2RlOiAweDhGICgnJykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4ICBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoMzIgYml0KTogcmVnCisJICogb2Zmc2V0ICsgNSAgKDggIGJpdCk6IHJlZ2luY3JlbWVudAorCSAqIG9mZnNldCArIDYgICg4ICBiaXQpOiBjb3VudAorCSAqIG9mZnNldCArIDcgICgzMiBiaXQpOiB2YWx1ZSAxLDEKKwkgKiAuLi4KKwkgKgorCSAqIFVzZSB0aGUgUkFNQ0ZHIHN0cmFwIG9mIFBFWFRERVZfQk9PVCBhcyBhbiBpbmRleCBpbnRvIHRoZSB0YWJsZSBhdAorCSAqIHJhbV9yZXN0cmljdF90YWJsZV9wdHIuIFRoZSB2YWx1ZSByZWFkIGZyb20gaGVyZSBpcyAnbicsIGFuZAorCSAqICJ2YWx1ZSAxLG4iIGdldHMgd3JpdHRlbiB0byAicmVnIi4gVGhpcyByZXBlYXRzICJjb3VudCIgdGltZXMgYW5kIG9uCisJICogZWFjaCBpdGVyYXRpb24gJ20nLCAicmVnIiBpbmNyZWFzZXMgYnkgInJlZ2luY3JlbWVudCIgYW5kCisJICogInZhbHVlIG0sbiIgaXMgdXNlZC4gVGhlIGV4dGVudCBvZiBuIGlzIGxpbWl0ZWQgYnkgYSBudW1iZXIgcmVhZAorCSAqIGZyb20gdGhlICdNJyBCSVQgdGFibGUsIGhlcmVpbiBjYWxsZWQgImJsb2NrbGVuIgorCSAqLworCisJdWludDMyX3QgcmVnID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXSk7CisJdWludDhfdCByZWdpbmNyZW1lbnQgPSBiaW9zLT5kYXRhW29mZnNldCArIDVdOworCXVpbnQ4X3QgY291bnQgPSBiaW9zLT5kYXRhW29mZnNldCArIDZdOworCXVpbnQzMl90IHN0cmFwX3JhbWNmZywgZGF0YTsKKwl1aW50MTZfdCBibG9ja2xlbjsKKwl1aW50OF90IGluZGV4OworCWludCBpOworCisJLyogcHJldmlvdXNseSBzZXQgYnkgJ00nIEJJVCB0YWJsZSAqLworCWJsb2NrbGVuID0gaW5pdF9yYW1fcmVzdHJpY3Rfem1fcmVnX2dyb3VwX2Jsb2NrbGVuOworCisJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoIWJsb2NrbGVuKSB7CisJCU5WX0VSUk9SKGJpb3MtPmRldiwKKwkJCSAiMHglMDRYOiBaZXJvIGJsb2NrIGxlbmd0aCAtIGhhcyB0aGUgTSB0YWJsZSAiCisJCQkgImJlZW4gcGFyc2VkP1xuIiwgb2Zmc2V0KTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXN0cmFwX3JhbWNmZyA9IChiaW9zX3JkMzIoYmlvcywgTlZfUEVYVERFVl9CT09UXzApID4+IDIpICYgMHhmOworCWluZGV4ID0gYmlvcy0+ZGF0YVtiaW9zLT5yYW1fcmVzdHJpY3RfdGJsX3B0ciArIHN0cmFwX3JhbWNmZ107CisKKwlCSU9TTE9HKGJpb3MsICIweCUwNFg6IFJlZzogMHglMDhYLCBSZWdJbmNyZW1lbnQ6IDB4JTAyWCwgIgorCQkgICAgICAiQ291bnQ6IDB4JTAyWCwgU3RyYXBSYW1DZmc6IDB4JTAyWCwgSW5kZXg6IDB4JTAyWFxuIiwKKwkJb2Zmc2V0LCByZWcsIHJlZ2luY3JlbWVudCwgY291bnQsIHN0cmFwX3JhbWNmZywgaW5kZXgpOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJZGF0YSA9IFJPTTMyKGJpb3MtPmRhdGFbb2Zmc2V0ICsgNyArIGluZGV4ICogNCArIGJsb2NrbGVuICogaV0pOworCisJCWJpb3Nfd3IzMihiaW9zLCByZWcsIGRhdGEpOworCisJCXJlZyArPSByZWdpbmNyZW1lbnQ7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X2NvcHlfem1fcmVnKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX0NPUFlfWk1fUkVHICAgb3Bjb2RlOiAweDkwICgnJykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4ICBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoMzIgYml0KTogc3JjIHJlZworCSAqIG9mZnNldCArIDUgICgzMiBiaXQpOiBkc3QgcmVnCisJICoKKwkgKiBQdXQgY29udGVudHMgb2YgInNyYyByZWciIGludG8gImRzdCByZWciCisJICovCisKKwl1aW50MzJfdCBzcmNyZWcgPSBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDFdKTsKKwl1aW50MzJfdCBkc3RyZWcgPSBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDVdKTsKKworCWlmICghaWV4ZWMtPmV4ZWN1dGUpCisJCXJldHVybiB0cnVlOworCisJYmlvc193cjMyKGJpb3MsIGRzdHJlZywgYmlvc19yZDMyKGJpb3MsIHNyY3JlZykpOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X3ptX3JlZ19ncm91cF9hZGRyX2xhdGNoZWQoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LAorCQkJICAgICAgIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9aTV9SRUdfR1JPVVBfQUREUkVTU19MQVRDSEVEICAgb3Bjb2RlOiAweDkxICgnJykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4ICBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoMzIgYml0KTogZHN0IHJlZworCSAqIG9mZnNldCArIDUgICg4ICBiaXQpOiBjb3VudAorCSAqIG9mZnNldCArIDYgICgzMiBiaXQpOiBkYXRhIDEKKwkgKiAuLi4KKwkgKgorCSAqIEZvciBlYWNoIG9mICJjb3VudCIgdmFsdWVzIHdyaXRlICJkYXRhIG4iIHRvICJkc3QgcmVnIgorCSAqLworCisJdWludDMyX3QgcmVnID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXSk7CisJdWludDhfdCBjb3VudCA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgNV07CisJaW50IGk7CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXVpbnQzMl90IGRhdGEgPSBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDYgKyA0ICogaV0pOworCQliaW9zX3dyMzIoYmlvcywgcmVnLCBkYXRhKTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfcmVzZXJ2ZWQoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LCBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfUkVTRVJWRUQgICBvcGNvZGU6IDB4OTIgKCcnKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggYml0KTogb3Bjb2RlCisJICoKKwkgKiBTZWVtaW5nbHkgZG9lcyBub3RoaW5nCisJICovCisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfOTYoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LCBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfOTYgICBvcGNvZGU6IDB4OTYgKCcnKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggIGJpdCk6IG9wY29kZQorCSAqIG9mZnNldCArIDEgICgzMiBiaXQpOiBzcmVnCisJICogb2Zmc2V0ICsgNSAgKDggIGJpdCk6IHNzaGlmdAorCSAqIG9mZnNldCArIDYgICg4ICBiaXQpOiBzbWFzaworCSAqIG9mZnNldCArIDcgICg4ICBiaXQpOiBpbmRleAorCSAqIG9mZnNldCArIDggICgzMiBiaXQpOiByZWcKKwkgKiBvZmZzZXQgKyAxMiAoMzIgYml0KTogbWFzaworCSAqIG9mZnNldCArIDE2ICg4ICBiaXQpOiBzaGlmdAorCSAqCisJICovCisKKwl1aW50MTZfdCB4bGF0cHRyID0gYmlvcy0+aW5pdDk2X3RibF9wdHIgKyAoYmlvcy0+ZGF0YVtvZmZzZXQgKyA3XSAqIDIpOworCXVpbnQzMl90IHJlZyA9IFJPTTMyKGJpb3MtPmRhdGFbb2Zmc2V0ICsgOF0pOworCXVpbnQzMl90IG1hc2sgPSBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDEyXSk7CisJdWludDMyX3QgdmFsOworCisJdmFsID0gYmlvc19yZDMyKGJpb3MsIFJPTTMyKGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV0pKTsKKwlpZiAoYmlvcy0+ZGF0YVtvZmZzZXQgKyA1XSA8IDB4ODApCisJCXZhbCA+Pj0gYmlvcy0+ZGF0YVtvZmZzZXQgKyA1XTsKKwllbHNlCisJCXZhbCA8PD0gKDB4MTAwIC0gYmlvcy0+ZGF0YVtvZmZzZXQgKyA1XSk7CisJdmFsICY9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgNl07CisKKwl2YWwgICA9IGJpb3MtPmRhdGFbUk9NMTYoYmlvcy0+ZGF0YVt4bGF0cHRyXSkgKyB2YWxdOworCXZhbCA8PD0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAxNl07CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCWJpb3Nfd3IzMihiaW9zLCByZWcsIChiaW9zX3JkMzIoYmlvcywgcmVnKSAmIG1hc2spIHwgdmFsKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2luaXRfOTcoc3RydWN0IG52YmlvcyAqYmlvcywgdWludDE2X3Qgb2Zmc2V0LCBzdHJ1Y3QgaW5pdF9leGVjICppZXhlYykKK3sKKwkvKgorCSAqIElOSVRfOTcgICBvcGNvZGU6IDB4OTcgKCcnKQorCSAqCisJICogb2Zmc2V0ICAgICAgKDggIGJpdCk6IG9wY29kZQorCSAqIG9mZnNldCArIDEgICgzMiBiaXQpOiByZWdpc3RlcgorCSAqIG9mZnNldCArIDUgICgzMiBiaXQpOiBtYXNrCisJICogb2Zmc2V0ICsgOSAgKDMyIGJpdCk6IHZhbHVlCisJICoKKwkgKiBBZGRzICJ2YWx1ZSIgdG8gInJlZ2lzdGVyIiBwcmVzZXJ2aW5nIHRoZSBmaWVsZHMgc3BlY2lmaWVkCisJICogYnkgIm1hc2siCisJICovCisKKwl1aW50MzJfdCByZWcgPSBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDFdKTsKKwl1aW50MzJfdCBtYXNrID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyA1XSk7CisJdWludDMyX3QgYWRkID0gUk9NMzIoYmlvcy0+ZGF0YVtvZmZzZXQgKyA5XSk7CisJdWludDMyX3QgdmFsOworCisJdmFsID0gYmlvc19yZDMyKGJpb3MsIHJlZyk7CisJdmFsID0gKHZhbCAmIG1hc2spIHwgKCh2YWwgKyBhZGQpICYgfm1hc2spOworCisJaWYgKCFpZXhlYy0+ZXhlY3V0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwliaW9zX3dyMzIoYmlvcywgcmVnLCB2YWwpOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAoraW5pdF9hdXhjaChzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogSU5JVF9BVVhDSCAgIG9wY29kZTogMHg5OCAoJycpCisJICoKKwkgKiBvZmZzZXQgICAgICAoOCAgYml0KTogb3Bjb2RlCisJICogb2Zmc2V0ICsgMSAgKDMyIGJpdCk6IGFkZHJlc3MKKwkgKiBvZmZzZXQgKyA1ICAoOCAgYml0KTogY291bnQKKwkgKiBvZmZzZXQgKyA2ICAoOCAgYml0KTogbWFzayAwCisJICogb2Zmc2V0ICsgNyAgKDggIGJpdCk6IGRhdGEgMAorCSAqICAuLi4KKwkgKgorCSAqLworCisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGJpb3MtPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqYXV4Y2g7CisJdWludDMyX3QgYWRkciA9IFJPTTMyKGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV0pOworCXVpbnQ4X3QgbGVuID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyA1XTsKKwlpbnQgcmV0LCBpOworCisJaWYgKCFiaW9zLT5kaXNwbGF5Lm91dHB1dCkgeworCQlOVl9FUlJPUihkZXYsICJJTklUX0FVWENIOiBubyBhY3RpdmUgb3V0cHV0XG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWF1eGNoID0gaW5pdF9pMmNfZGV2aWNlX2ZpbmQoZGV2LCBiaW9zLT5kaXNwbGF5Lm91dHB1dC0+aTJjX2luZGV4KTsKKwlpZiAoIWF1eGNoKSB7CisJCU5WX0VSUk9SKGRldiwgIklOSVRfQVVYQ0g6IGNvdWxkbid0IGdldCBhdXhjaCAlZFxuIiwKKwkJCSBiaW9zLT5kaXNwbGF5Lm91dHB1dC0+aTJjX2luZGV4KTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmICghaWV4ZWMtPmV4ZWN1dGUpCisJCXJldHVybiB0cnVlOworCisJb2Zmc2V0ICs9IDY7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrLCBvZmZzZXQgKz0gMikgeworCQl1aW50OF90IGRhdGE7CisKKwkJcmV0ID0gbm91dmVhdV9kcF9hdXhjaChhdXhjaCwgOSwgYWRkciwgJmRhdGEsIDEpOworCQlpZiAocmV0KSB7CisJCQlOVl9FUlJPUihkZXYsICJJTklUX0FVWENIOiByZCBhdXhjaCBmYWlsICVkXG4iLCByZXQpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJZGF0YSAmPSBiaW9zLT5kYXRhW29mZnNldCArIDBdOworCQlkYXRhIHw9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV07CisKKwkJcmV0ID0gbm91dmVhdV9kcF9hdXhjaChhdXhjaCwgOCwgYWRkciwgJmRhdGEsIDEpOworCQlpZiAocmV0KSB7CisJCQlOVl9FUlJPUihkZXYsICJJTklUX0FVWENIOiB3ciBhdXhjaCBmYWlsICVkXG4iLCByZXQpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sCitpbml0X3ptX2F1eGNoKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCwgc3RydWN0IGluaXRfZXhlYyAqaWV4ZWMpCit7CisJLyoKKwkgKiBJTklUX1pNX0FVWENIICAgb3Bjb2RlOiAweDk5ICgnJykKKwkgKgorCSAqIG9mZnNldCAgICAgICg4ICBiaXQpOiBvcGNvZGUKKwkgKiBvZmZzZXQgKyAxICAoMzIgYml0KTogYWRkcmVzcworCSAqIG9mZnNldCArIDUgICg4ICBiaXQpOiBjb3VudAorCSAqIG9mZnNldCArIDYgICg4ICBiaXQpOiBkYXRhIDAKKwkgKiAgLi4uCisJICoKKwkgKi8KKworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBiaW9zLT5kZXY7CisJc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKmF1eGNoOworCXVpbnQzMl90IGFkZHIgPSBST00zMihiaW9zLT5kYXRhW29mZnNldCArIDFdKTsKKwl1aW50OF90IGxlbiA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgNV07CisJaW50IHJldCwgaTsKKworCWlmICghYmlvcy0+ZGlzcGxheS5vdXRwdXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiSU5JVF9aTV9BVVhDSDogbm8gYWN0aXZlIG91dHB1dFxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlhdXhjaCA9IGluaXRfaTJjX2RldmljZV9maW5kKGRldiwgYmlvcy0+ZGlzcGxheS5vdXRwdXQtPmkyY19pbmRleCk7CisJaWYgKCFhdXhjaCkgeworCQlOVl9FUlJPUihkZXYsICJJTklUX1pNX0FVWENIOiBjb3VsZG4ndCBnZXQgYXV4Y2ggJWRcbiIsCisJCQkgYmlvcy0+ZGlzcGxheS5vdXRwdXQtPmkyY19pbmRleCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAoIWlleGVjLT5leGVjdXRlKQorCQlyZXR1cm4gdHJ1ZTsKKworCW9mZnNldCArPSA2OworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKywgb2Zmc2V0KyspIHsKKwkJcmV0ID0gbm91dmVhdV9kcF9hdXhjaChhdXhjaCwgOCwgYWRkciwgJmJpb3MtPmRhdGFbb2Zmc2V0XSwgMSk7CisJCWlmIChyZXQpIHsKKwkJCU5WX0VSUk9SKGRldiwgIklOSVRfWk1fQVVYQ0g6IHdyIGF1eGNoIGZhaWwgJWRcbiIsIHJldCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHN0cnVjdCBpbml0X3RibF9lbnRyeSBpdGJsX2VudHJ5W10gPSB7CisJLyogY29tbWFuZCBuYW1lICAgICAgICAgICAgICAgICAgICAgICAsIGlkICAsIGxlbmd0aCAgLCBvZmZzZXQgICwgbXVsdCAgICAsIGNvbW1hbmQgaGFuZGxlciAgICAgICAgICAgICAgICAgKi8KKwkvKiBJTklUX1BST0cgKDB4MzEsIDE1LCAxMCwgNCkgcmVtb3ZlZCBkdWUgdG8gbm8gZXhhbXBsZSBvZiB1c2UgKi8KKwl7ICJJTklUX0lPX1JFU1RSSUNUX1BST0ciICAgICAgICAgICAgICwgMHgzMiwgMTEgICAgICAsIDYgICAgICAgLCA0ICAgICAgICwgaW5pdF9pb19yZXN0cmljdF9wcm9nICAgICAgICAgICB9LAorCXsgIklOSVRfUkVQRUFUIiAgICAgICAgICAgICAgICAgICAgICAgLCAweDMzLCAyICAgICAgICwgMCAgICAgICAsIDAgICAgICAgLCBpbml0X3JlcGVhdCAgICAgICAgICAgICAgICAgICAgIH0sCisJeyAiSU5JVF9JT19SRVNUUklDVF9QTEwiICAgICAgICAgICAgICAsIDB4MzQsIDEyICAgICAgLCA3ICAgICAgICwgMiAgICAgICAsIGluaXRfaW9fcmVzdHJpY3RfcGxsICAgICAgICAgICAgfSwKKwl7ICJJTklUX0VORF9SRVBFQVQiICAgICAgICAgICAgICAgICAgICwgMHgzNiwgMSAgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF9lbmRfcmVwZWF0ICAgICAgICAgICAgICAgICB9LAorCXsgIklOSVRfQ09QWSIgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDM3LCAxMSAgICAgICwgMCAgICAgICAsIDAgICAgICAgLCBpbml0X2NvcHkgICAgICAgICAgICAgICAgICAgICAgIH0sCisJeyAiSU5JVF9OT1QiICAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4MzgsIDEgICAgICAgLCAwICAgICAgICwgMCAgICAgICAsIGluaXRfbm90ICAgICAgICAgICAgICAgICAgICAgICAgfSwKKwl7ICJJTklUX0lPX0ZMQUdfQ09ORElUSU9OIiAgICAgICAgICAgICwgMHgzOSwgMiAgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF9pb19mbGFnX2NvbmRpdGlvbiAgICAgICAgICB9LAorCXsgIklOSVRfSU5ERVhfQUREUkVTU19MQVRDSEVEIiAgICAgICAgLCAweDQ5LCAxOCAgICAgICwgMTcgICAgICAsIDIgICAgICAgLCBpbml0X2lkeF9hZGRyX2xhdGNoZWQgICAgICAgICAgIH0sCisJeyAiSU5JVF9JT19SRVNUUklDVF9QTEwyIiAgICAgICAgICAgICAsIDB4NEEsIDExICAgICAgLCA2ICAgICAgICwgNCAgICAgICAsIGluaXRfaW9fcmVzdHJpY3RfcGxsMiAgICAgICAgICAgfSwKKwl7ICJJTklUX1BMTDIiICAgICAgICAgICAgICAgICAgICAgICAgICwgMHg0QiwgOSAgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF9wbGwyICAgICAgICAgICAgICAgICAgICAgICB9LAorCXsgIklOSVRfSTJDX0JZVEUiICAgICAgICAgICAgICAgICAgICAgLCAweDRDLCA0ICAgICAgICwgMyAgICAgICAsIDMgICAgICAgLCBpbml0X2kyY19ieXRlICAgICAgICAgICAgICAgICAgIH0sCisJeyAiSU5JVF9aTV9JMkNfQllURSIgICAgICAgICAgICAgICAgICAsIDB4NEQsIDQgICAgICAgLCAzICAgICAgICwgMiAgICAgICAsIGluaXRfem1faTJjX2J5dGUgICAgICAgICAgICAgICAgfSwKKwl7ICJJTklUX1pNX0kyQyIgICAgICAgICAgICAgICAgICAgICAgICwgMHg0RSwgNCAgICAgICAsIDMgICAgICAgLCAxICAgICAgICwgaW5pdF96bV9pMmMgICAgICAgICAgICAgICAgICAgICB9LAorCXsgIklOSVRfVE1EUyIgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDRGLCA1ICAgICAgICwgMCAgICAgICAsIDAgICAgICAgLCBpbml0X3RtZHMgICAgICAgICAgICAgICAgICAgICAgIH0sCisJeyAiSU5JVF9aTV9UTURTX0dST1VQIiAgICAgICAgICAgICAgICAsIDB4NTAsIDMgICAgICAgLCAyICAgICAgICwgMiAgICAgICAsIGluaXRfem1fdG1kc19ncm91cCAgICAgICAgICAgICAgfSwKKwl7ICJJTklUX0NSX0lOREVYX0FERFJFU1NfTEFUQ0hFRCIgICAgICwgMHg1MSwgNSAgICAgICAsIDQgICAgICAgLCAxICAgICAgICwgaW5pdF9jcl9pZHhfYWRyX2xhdGNoICAgICAgICAgICB9LAorCXsgIklOSVRfQ1IiICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDUyLCA0ICAgICAgICwgMCAgICAgICAsIDAgICAgICAgLCBpbml0X2NyICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisJeyAiSU5JVF9aTV9DUiIgICAgICAgICAgICAgICAgICAgICAgICAsIDB4NTMsIDMgICAgICAgLCAwICAgICAgICwgMCAgICAgICAsIGluaXRfem1fY3IgICAgICAgICAgICAgICAgICAgICAgfSwKKwl7ICJJTklUX1pNX0NSX0dST1VQIiAgICAgICAgICAgICAgICAgICwgMHg1NCwgMiAgICAgICAsIDEgICAgICAgLCAyICAgICAgICwgaW5pdF96bV9jcl9ncm91cCAgICAgICAgICAgICAgICB9LAorCXsgIklOSVRfQ09ORElUSU9OX1RJTUUiICAgICAgICAgICAgICAgLCAweDU2LCAzICAgICAgICwgMCAgICAgICAsIDAgICAgICAgLCBpbml0X2NvbmRpdGlvbl90aW1lICAgICAgICAgICAgIH0sCisJeyAiSU5JVF9aTV9SRUdfU0VRVUVOQ0UiICAgICAgICAgICAgICAsIDB4NTgsIDYgICAgICAgLCA1ICAgICAgICwgNCAgICAgICAsIGluaXRfem1fcmVnX3NlcXVlbmNlICAgICAgICAgICAgfSwKKwkvKiBJTklUX0lORElSRUNUX1JFRyAoMHg1QSwgNywgMCwgMCkgcmVtb3ZlZCBkdWUgdG8gbm8gZXhhbXBsZSBvZiB1c2UgKi8KKwl7ICJJTklUX1NVQl9ESVJFQ1QiICAgICAgICAgICAgICAgICAgICwgMHg1QiwgMyAgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF9zdWJfZGlyZWN0ICAgICAgICAgICAgICAgICB9LAorCXsgIklOSVRfQ09QWV9OVl9SRUciICAgICAgICAgICAgICAgICAgLCAweDVGLCAyMiAgICAgICwgMCAgICAgICAsIDAgICAgICAgLCBpbml0X2NvcHlfbnZfcmVnICAgICAgICAgICAgICAgIH0sCisJeyAiSU5JVF9aTV9JTkRFWF9JTyIgICAgICAgICAgICAgICAgICAsIDB4NjIsIDUgICAgICAgLCAwICAgICAgICwgMCAgICAgICAsIGluaXRfem1faW5kZXhfaW8gICAgICAgICAgICAgICAgfSwKKwl7ICJJTklUX0NPTVBVVEVfTUVNIiAgICAgICAgICAgICAgICAgICwgMHg2MywgMSAgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF9jb21wdXRlX21lbSAgICAgICAgICAgICAgICB9LAorCXsgIklOSVRfUkVTRVQiICAgICAgICAgICAgICAgICAgICAgICAgLCAweDY1LCAxMyAgICAgICwgMCAgICAgICAsIDAgICAgICAgLCBpbml0X3Jlc2V0ICAgICAgICAgICAgICAgICAgICAgIH0sCisJeyAiSU5JVF9DT05GSUdVUkVfTUVNIiAgICAgICAgICAgICAgICAsIDB4NjYsIDEgICAgICAgLCAwICAgICAgICwgMCAgICAgICAsIGluaXRfY29uZmlndXJlX21lbSAgICAgICAgICAgICAgfSwKKwl7ICJJTklUX0NPTkZJR1VSRV9DTEsiICAgICAgICAgICAgICAgICwgMHg2NywgMSAgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF9jb25maWd1cmVfY2xrICAgICAgICAgICAgICB9LAorCXsgIklOSVRfQ09ORklHVVJFX1BSRUlOSVQiICAgICAgICAgICAgLCAweDY4LCAxICAgICAgICwgMCAgICAgICAsIDAgICAgICAgLCBpbml0X2NvbmZpZ3VyZV9wcmVpbml0ICAgICAgICAgIH0sCisJeyAiSU5JVF9JTyIgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4NjksIDUgICAgICAgLCAwICAgICAgICwgMCAgICAgICAsIGluaXRfaW8gICAgICAgICAgICAgICAgICAgICAgICAgfSwKKwl7ICJJTklUX1NVQiIgICAgICAgICAgICAgICAgICAgICAgICAgICwgMHg2QiwgMiAgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF9zdWIgICAgICAgICAgICAgICAgICAgICAgICB9LAorCXsgIklOSVRfUkFNX0NPTkRJVElPTiIgICAgICAgICAgICAgICAgLCAweDZELCAzICAgICAgICwgMCAgICAgICAsIDAgICAgICAgLCBpbml0X3JhbV9jb25kaXRpb24gICAgICAgICAgICAgIH0sCisJeyAiSU5JVF9OVl9SRUciICAgICAgICAgICAgICAgICAgICAgICAsIDB4NkUsIDEzICAgICAgLCAwICAgICAgICwgMCAgICAgICAsIGluaXRfbnZfcmVnICAgICAgICAgICAgICAgICAgICAgfSwKKwl7ICJJTklUX01BQ1JPIiAgICAgICAgICAgICAgICAgICAgICAgICwgMHg2RiwgMiAgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF9tYWNybyAgICAgICAgICAgICAgICAgICAgICB9LAorCXsgIklOSVRfRE9ORSIgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDcxLCAxICAgICAgICwgMCAgICAgICAsIDAgICAgICAgLCBpbml0X2RvbmUgICAgICAgICAgICAgICAgICAgICAgIH0sCisJeyAiSU5JVF9SRVNVTUUiICAgICAgICAgICAgICAgICAgICAgICAsIDB4NzIsIDEgICAgICAgLCAwICAgICAgICwgMCAgICAgICAsIGluaXRfcmVzdW1lICAgICAgICAgICAgICAgICAgICAgfSwKKwkvKiBJTklUX1JBTV9DT05ESVRJT04yICgweDczLCA5LCAwLCAwKSByZW1vdmVkIGR1ZSB0byBubyBleGFtcGxlIG9mIHVzZSAqLworCXsgIklOSVRfVElNRSIgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDc0LCAzICAgICAgICwgMCAgICAgICAsIDAgICAgICAgLCBpbml0X3RpbWUgICAgICAgICAgICAgICAgICAgICAgIH0sCisJeyAiSU5JVF9DT05ESVRJT04iICAgICAgICAgICAgICAgICAgICAsIDB4NzUsIDIgICAgICAgLCAwICAgICAgICwgMCAgICAgICAsIGluaXRfY29uZGl0aW9uICAgICAgICAgICAgICAgICAgfSwKKwl7ICJJTklUX0lPX0NPTkRJVElPTiIgICAgICAgICAgICAgICAgICwgMHg3NiwgMiAgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF9pb19jb25kaXRpb24gICAgICAgICAgICAgICB9LAorCXsgIklOSVRfSU5ERVhfSU8iICAgICAgICAgICAgICAgICAgICAgLCAweDc4LCA2ICAgICAgICwgMCAgICAgICAsIDAgICAgICAgLCBpbml0X2luZGV4X2lvICAgICAgICAgICAgICAgICAgIH0sCisJeyAiSU5JVF9QTEwiICAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4NzksIDcgICAgICAgLCAwICAgICAgICwgMCAgICAgICAsIGluaXRfcGxsICAgICAgICAgICAgICAgICAgICAgICAgfSwKKwl7ICJJTklUX1pNX1JFRyIgICAgICAgICAgICAgICAgICAgICAgICwgMHg3QSwgOSAgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF96bV9yZWcgICAgICAgICAgICAgICAgICAgICB9LAorCS8qIElOSVRfUkFNX1JFU1RSSUNUX1BMTCdzIGxlbmd0aCBpcyBhZGp1c3RlZCBieSB0aGUgQklUIE0gdGFibGUgKi8KKwl7ICJJTklUX1JBTV9SRVNUUklDVF9QTEwiICAgICAgICAgICAgICwgMHg4NywgMiAgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF9yYW1fcmVzdHJpY3RfcGxsICAgICAgICAgICB9LAorCXsgIklOSVRfOEMiICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDhDLCAxICAgICAgICwgMCAgICAgICAsIDAgICAgICAgLCBpbml0XzhjICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisJeyAiSU5JVF84RCIgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4OEQsIDEgICAgICAgLCAwICAgICAgICwgMCAgICAgICAsIGluaXRfOGQgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKwl7ICJJTklUX0dQSU8iICAgICAgICAgICAgICAgICAgICAgICAgICwgMHg4RSwgMSAgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF9ncGlvICAgICAgICAgICAgICAgICAgICAgICB9LAorCS8qIElOSVRfUkFNX1JFU1RSSUNUX1pNX1JFR19HUk9VUCdzIG11bHQgaXMgbG9hZGVkIGJ5IE0gdGFibGUgaW4gQklUICovCisJeyAiSU5JVF9SQU1fUkVTVFJJQ1RfWk1fUkVHX0dST1VQIiAgICAsIDB4OEYsIDcgICAgICAgLCA2ICAgICAgICwgMCAgICAgICAsIGluaXRfcmFtX3Jlc3RyaWN0X3ptX3JlZ19ncm91cCAgfSwKKwl7ICJJTklUX0NPUFlfWk1fUkVHIiAgICAgICAgICAgICAgICAgICwgMHg5MCwgOSAgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF9jb3B5X3ptX3JlZyAgICAgICAgICAgICAgICB9LAorCXsgIklOSVRfWk1fUkVHX0dST1VQX0FERFJFU1NfTEFUQ0hFRCIgLCAweDkxLCA2ICAgICAgICwgNSAgICAgICAsIDQgICAgICAgLCBpbml0X3ptX3JlZ19ncm91cF9hZGRyX2xhdGNoZWQgIH0sCisJeyAiSU5JVF9SRVNFUlZFRCIgICAgICAgICAgICAgICAgICAgICAsIDB4OTIsIDEgICAgICAgLCAwICAgICAgICwgMCAgICAgICAsIGluaXRfcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgfSwKKwl7ICJJTklUXzk2IiAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMHg5NiwgMTcgICAgICAsIDAgICAgICAgLCAwICAgICAgICwgaW5pdF85NiAgICAgICAgICAgICAgICAgICAgICAgICB9LAorCXsgIklOSVRfOTciICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDk3LCAxMyAgICAgICwgMCAgICAgICAsIDAgICAgICAgLCBpbml0Xzk3ICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisJeyAiSU5JVF9BVVhDSCIgICAgICAgICAgICAgICAgICAgICAgICAsIDB4OTgsIDYgICAgICAgLCA1ICAgICAgICwgMiAgICAgICAsIGluaXRfYXV4Y2ggICAgICAgICAgICAgICAgICAgICAgfSwKKwl7ICJJTklUX1pNX0FVWENIIiAgICAgICAgICAgICAgICAgICAgICwgMHg5OSwgNiAgICAgICAsIDUgICAgICAgLCAxICAgICAgICwgaW5pdF96bV9hdXhjaCAgICAgICAgICAgICAgICAgICB9LAorCXsgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAwICAgLCAwICAgICAgICwgMCAgICAgICAsIDAgICAgICAgLCBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X2luaXRfdGFibGVfZW50cnlfbGVuZ3RoKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVuc2lnbmVkIGludCBvZmZzZXQsIGludCBpKQoreworCS8qIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIGdpdmVuIGluaXQgdGFibGUgZW50cnkuICovCisJcmV0dXJuIGl0YmxfZW50cnlbaV0ubGVuZ3RoICsgYmlvcy0+ZGF0YVtvZmZzZXQgKyBpdGJsX2VudHJ5W2ldLmxlbmd0aF9vZmZzZXRdKml0YmxfZW50cnlbaV0ubGVuZ3RoX211bHRpcGxpZXI7Cit9CisKKyNkZWZpbmUgTUFYX1RBQkxFX09QUyAxMDAwCisKK3N0YXRpYyBpbnQKK3BhcnNlX2luaXRfdGFibGUoc3RydWN0IG52YmlvcyAqYmlvcywgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQoreworCS8qCisJICogUGFyc2VzIGFsbCBjb21tYW5kcyBpbiBhbiBpbml0IHRhYmxlLgorCSAqCisJICogV2Ugc3RhcnQgb3V0IGV4ZWN1dGluZyBhbGwgY29tbWFuZHMgZm91bmQgaW4gdGhlIGluaXQgdGFibGUuIFNvbWUKKwkgKiBvcGNvZGVzIG1heSBjaGFuZ2UgdGhlIHN0YXR1cyBvZiBpZXhlYy0+ZXhlY3V0ZSB0byBTS0lQLCB3aGljaCB3aWxsCisJICogY2F1c2UgdGhlIGZvbGxvd2luZyBvcGNvZGVzIHRvIHBlcmZvcm0gbm8gb3BlcmF0aW9uIHVudGlsIHRoZSB2YWx1ZQorCSAqIGlzIGNoYW5nZWQgYmFjayB0byBFWEVDVVRFLgorCSAqLworCisJaW50IGNvdW50ID0gMCwgaTsKKwl1aW50OF90IGlkOworCisJLyoKKwkgKiBMb29wIHVudGlsIElOSVRfRE9ORSBjYXVzZXMgdXMgdG8gYnJlYWsgb3V0IG9mIHRoZSBsb29wCisJICogKG9yIHVudGlsIG9mZnNldCA+IGJpb3MgbGVuZ3RoIGp1c3QgaW4gY2FzZS4uLiApCisJICogKGFuZCBubyBtb3JlIHRoYW4gTUFYX1RBQkxFX09QUyBpdGVyYXRpb25zLCBqdXN0IGluIGNhc2UuLi4gKQorCSAqLworCXdoaWxlICgob2Zmc2V0IDwgYmlvcy0+bGVuZ3RoKSAmJiAoY291bnQrKyA8IE1BWF9UQUJMRV9PUFMpKSB7CisJCWlkID0gYmlvcy0+ZGF0YVtvZmZzZXRdOworCisJCS8qIEZpbmQgbWF0Y2hpbmcgaWQgaW4gaXRibF9lbnRyeSAqLworCQlmb3IgKGkgPSAwOyBpdGJsX2VudHJ5W2ldLm5hbWUgJiYgKGl0YmxfZW50cnlbaV0uaWQgIT0gaWQpOyBpKyspCisJCQk7CisKKwkJaWYgKGl0YmxfZW50cnlbaV0ubmFtZSkgeworCQkJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBbICgweCUwMlgpIC0gJXMgXVxuIiwKKwkJCQlvZmZzZXQsIGl0YmxfZW50cnlbaV0uaWQsIGl0YmxfZW50cnlbaV0ubmFtZSk7CisKKwkJCS8qIGV4ZWN1dGUgZXZlbnR1YWwgY29tbWFuZCBoYW5kbGVyICovCisJCQlpZiAoaXRibF9lbnRyeVtpXS5oYW5kbGVyKQorCQkJCWlmICghKCppdGJsX2VudHJ5W2ldLmhhbmRsZXIpKGJpb3MsIG9mZnNldCwgaWV4ZWMpKQorCQkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCU5WX0VSUk9SKGJpb3MtPmRldiwKKwkJCQkgIjB4JTA0WDogSW5pdCB0YWJsZSBjb21tYW5kIG5vdCBmb3VuZDogIgorCQkJCSAiMHglMDJYXG4iLCBvZmZzZXQsIGlkKTsKKwkJCXJldHVybiAtRU5PRU5UOworCQl9CisKKwkJLyoKKwkJICogQWRkIHRoZSBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgY29tbWFuZCBpbmNsdWRpbmcgYWxsIGRhdGEKKwkJICogb2YgdGhhdCBjb21tYW5kLiBUaGUgb2Zmc2V0IHdpbGwgdGhlbiBiZSBwb2ludGluZyBvbiB0aGUKKwkJICogbmV4dCBvcCBjb2RlLgorCQkgKi8KKwkJb2Zmc2V0ICs9IGdldF9pbml0X3RhYmxlX2VudHJ5X2xlbmd0aChiaW9zLCBvZmZzZXQsIGkpOworCX0KKworCWlmIChvZmZzZXQgPj0gYmlvcy0+bGVuZ3RoKQorCQlOVl9XQVJOKGJpb3MtPmRldiwKKwkJCSJPZmZzZXQgMHglMDRYIGdyZWF0ZXIgdGhhbiBrbm93biBiaW9zIGltYWdlIGxlbmd0aC4gICIKKwkJCSJDb3JydXB0IGltYWdlP1xuIiwgb2Zmc2V0KTsKKwlpZiAoY291bnQgPj0gTUFYX1RBQkxFX09QUykKKwkJTlZfV0FSTihiaW9zLT5kZXYsCisJCQkiTW9yZSB0aGFuICVkIG9wY29kZXMgdG8gYSB0YWJsZSBpcyB1bmxpa2VseSwgIgorCQkJImlzIHRoZSBiaW9zIGltYWdlIGNvcnJ1cHQ/XG4iLCBNQVhfVEFCTEVfT1BTKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorcGFyc2VfaW5pdF90YWJsZXMoc3RydWN0IG52YmlvcyAqYmlvcykKK3sKKwkvKiBMb29wcyBhbmQgY2FsbHMgcGFyc2VfaW5pdF90YWJsZSgpIGZvciBlYWNoIHByZXNlbnQgdGFibGUuICovCisKKwlpbnQgaSA9IDA7CisJdWludDE2X3QgdGFibGU7CisJc3RydWN0IGluaXRfZXhlYyBpZXhlYyA9IHt0cnVlLCBmYWxzZX07CisKKwlpZiAoYmlvcy0+b2xkX3N0eWxlX2luaXQpIHsKKwkJaWYgKGJpb3MtPmluaXRfc2NyaXB0X3RibHNfcHRyKQorCQkJcGFyc2VfaW5pdF90YWJsZShiaW9zLCBiaW9zLT5pbml0X3NjcmlwdF90YmxzX3B0ciwgJmlleGVjKTsKKwkJaWYgKGJpb3MtPmV4dHJhX2luaXRfc2NyaXB0X3RibF9wdHIpCisJCQlwYXJzZV9pbml0X3RhYmxlKGJpb3MsIGJpb3MtPmV4dHJhX2luaXRfc2NyaXB0X3RibF9wdHIsICZpZXhlYyk7CisKKwkJcmV0dXJuOworCX0KKworCXdoaWxlICgodGFibGUgPSBST00xNihiaW9zLT5kYXRhW2Jpb3MtPmluaXRfc2NyaXB0X3RibHNfcHRyICsgaV0pKSkgeworCQlOVl9JTkZPKGJpb3MtPmRldiwKKwkJCSJQYXJzaW5nIFZCSU9TIGluaXQgdGFibGUgJWQgYXQgb2Zmc2V0IDB4JTA0WFxuIiwKKwkJCWkgLyAyLCB0YWJsZSk7CisJCUJJT1NMT0coYmlvcywgIjB4JTA0WDogLS0tLS0tIEV4ZWN1dGluZyBmb2xsb3dpbmcgY29tbWFuZHMgLS0tLS0tXG4iLCB0YWJsZSk7CisKKwkJcGFyc2VfaW5pdF90YWJsZShiaW9zLCB0YWJsZSwgJmlleGVjKTsKKwkJaSArPSAyOworCX0KK30KKworc3RhdGljIHVpbnQxNl90IGNsa2NtcHRhYmxlKHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IGNsa3RhYmxlLCBpbnQgcHhjbGspCit7CisJaW50IGNvbXBhcmVfcmVjb3JkX2xlbiwgaSA9IDA7CisJdWludDE2X3QgY29tcGFyZWNsaywgc2NyaXB0cHRyID0gMDsKKworCWlmIChiaW9zLT5tYWpvcl92ZXJzaW9uIDwgNSkgLyogcHJlIEJJVCAqLworCQljb21wYXJlX3JlY29yZF9sZW4gPSAzOworCWVsc2UKKwkJY29tcGFyZV9yZWNvcmRfbGVuID0gNDsKKworCWRvIHsKKwkJY29tcGFyZWNsayA9IFJPTTE2KGJpb3MtPmRhdGFbY2xrdGFibGUgKyBjb21wYXJlX3JlY29yZF9sZW4gKiBpXSk7CisJCWlmIChweGNsayA+PSBjb21wYXJlY2xrICogMTApIHsKKwkJCWlmIChiaW9zLT5tYWpvcl92ZXJzaW9uIDwgNSkgeworCQkJCXVpbnQ4X3QgdG1kc3N1YiA9IGJpb3MtPmRhdGFbY2xrdGFibGUgKyAyICsgY29tcGFyZV9yZWNvcmRfbGVuICogaV07CisJCQkJc2NyaXB0cHRyID0gUk9NMTYoYmlvcy0+ZGF0YVtiaW9zLT5pbml0X3NjcmlwdF90YmxzX3B0ciArIHRtZHNzdWIgKiAyXSk7CisJCQl9IGVsc2UKKwkJCQlzY3JpcHRwdHIgPSBST00xNihiaW9zLT5kYXRhW2Nsa3RhYmxlICsgMiArIGNvbXBhcmVfcmVjb3JkX2xlbiAqIGldKTsKKwkJCWJyZWFrOworCQl9CisJCWkrKzsKKwl9IHdoaWxlIChjb21wYXJlY2xrKTsKKworCXJldHVybiBzY3JpcHRwdHI7Cit9CisKK3N0YXRpYyB2b2lkCitydW5fZGlnaXRhbF9vcF9zY3JpcHQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDE2X3Qgc2NyaXB0cHRyLAorCQkgICAgICBzdHJ1Y3QgZGNiX2VudHJ5ICpkY2JlbnQsIGludCBoZWFkLCBib29sIGRsKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkZXZfcHJpdi0+VkJJT1M7CisJc3RydWN0IGluaXRfZXhlYyBpZXhlYyA9IHt0cnVlLCBmYWxzZX07CisKKwlOVl9UUkFDRShkZXYsICIweCUwNFg6IFBhcnNpbmcgZGlnaXRhbCBvdXRwdXQgc2NyaXB0IHRhYmxlXG4iLAorCQkgc2NyaXB0cHRyKTsKKwliaW9zX2lkeHBydF93cihiaW9zLCBOVl9DSU9fQ1JYX19DT0xPUiwgTlZfQ0lPX0NSRV80NCwKKwkJICAgICAgIGhlYWQgPyBOVl9DSU9fQ1JFXzQ0X0hFQURCIDogTlZfQ0lPX0NSRV80NF9IRUFEQSk7CisJLyogbm90ZTogaWYgZGNiIGVudHJpZXMgaGF2ZSBiZWVuIG1lcmdlZCwgaW5kZXggbWF5IGJlIG1pc2xlYWRpbmcgKi8KKwlOVldyaXRlVmdhQ3J0YzU3NTgoZGV2LCBoZWFkLCAwLCBkY2JlbnQtPmluZGV4KTsKKwlwYXJzZV9pbml0X3RhYmxlKGJpb3MsIHNjcmlwdHB0ciwgJmlleGVjKTsKKworCW52MDRfZGZwX2JpbmRfaGVhZChkZXYsIGRjYmVudCwgaGVhZCwgZGwpOworfQorCitzdGF0aWMgaW50IGNhbGxfbHZkc19tYW51ZmFjdHVyZXJfc2NyaXB0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfZW50cnkgKmRjYmVudCwgaW50IGhlYWQsIGVudW0gTFZEU19zY3JpcHQgc2NyaXB0KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkZXZfcHJpdi0+VkJJT1M7CisJdWludDhfdCBzdWIgPSBiaW9zLT5kYXRhW2Jpb3MtPmZwLnhsYXRlZF9lbnRyeSArIHNjcmlwdF0gKyAoYmlvcy0+ZnAubGlua19jX2luY3JlbWVudCAmJiBkY2JlbnQtPm9yICYgT1VUUFVUX0MgPyAxIDogMCk7CisJdWludDE2X3Qgc2NyaXB0b2ZzID0gUk9NMTYoYmlvcy0+ZGF0YVtiaW9zLT5pbml0X3NjcmlwdF90YmxzX3B0ciArIHN1YiAqIDJdKTsKKworCWlmICghYmlvcy0+ZnAueGxhdGVkX2VudHJ5IHx8ICFzdWIgfHwgIXNjcmlwdG9mcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlydW5fZGlnaXRhbF9vcF9zY3JpcHQoZGV2LCBzY3JpcHRvZnMsIGRjYmVudCwgaGVhZCwgYmlvcy0+ZnAuZHVhbF9saW5rKTsKKworCWlmIChzY3JpcHQgPT0gTFZEU19QQU5FTF9PRkYpIHsKKwkJLyogb2ZmLW9uIGRlbGF5IGluIG1zICovCisJCW1zbGVlcChST00xNihiaW9zLT5kYXRhW2Jpb3MtPmZwLnhsYXRlZF9lbnRyeSArIDddKSk7CisJfQorI2lmZGVmIF9fcG93ZXJwY19fCisJLyogUG93ZXJib29rIHNwZWNpZmljIHF1aXJrcyAqLworCWlmIChzY3JpcHQgPT0gTFZEU19SRVNFVCAmJiAoKGRldi0+cGNpX2RldmljZSAmIDB4ZmZmZikgPT0gMHgwMTc5IHx8IChkZXYtPnBjaV9kZXZpY2UgJiAweGZmZmYpID09IDB4MDMyOSkpCisJCW52X3dyaXRlX3RtZHMoZGV2LCBkY2JlbnQtPm9yLCAwLCAweDAyLCAweDcyKTsKKwlpZiAoKGRldi0+cGNpX2RldmljZSAmIDB4ZmZmZikgPT0gMHgwMTc5IHx8IChkZXYtPnBjaV9kZXZpY2UgJiAweGZmZmYpID09IDB4MDE4OSB8fCAoZGV2LT5wY2lfZGV2aWNlICYgMHhmZmZmKSA9PSAweDAzMjkpIHsKKwkJaWYgKHNjcmlwdCA9PSBMVkRTX1BBTkVMX09OKSB7CisJCQliaW9zX3dyMzIoYmlvcywgTlZfUEJVU19ERUJVR19EVUFMSEVBRF9DVEwsIGJpb3NfcmQzMihiaW9zLCBOVl9QQlVTX0RFQlVHX0RVQUxIRUFEX0NUTCkgfCAoMSA8PCAzMSkpOworCQkJYmlvc193cjMyKGJpb3MsIE5WX1BDUlRDX0dQSU9fRVhULCBiaW9zX3JkMzIoYmlvcywgTlZfUENSVENfR1BJT19FWFQpIHwgMSk7CisJCX0KKwkJaWYgKHNjcmlwdCA9PSBMVkRTX1BBTkVMX09GRikgeworCQkJYmlvc193cjMyKGJpb3MsIE5WX1BCVVNfREVCVUdfRFVBTEhFQURfQ1RMLCBiaW9zX3JkMzIoYmlvcywgTlZfUEJVU19ERUJVR19EVUFMSEVBRF9DVEwpICYgfigxIDw8IDMxKSk7CisJCQliaW9zX3dyMzIoYmlvcywgTlZfUENSVENfR1BJT19FWFQsIGJpb3NfcmQzMihiaW9zLCBOVl9QQ1JUQ19HUElPX0VYVCkgJiB+Myk7CisJCX0KKwl9CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ1bl9sdmRzX3RhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfZW50cnkgKmRjYmVudCwgaW50IGhlYWQsIGVudW0gTFZEU19zY3JpcHQgc2NyaXB0LCBpbnQgcHhjbGspCit7CisJLyoKKwkgKiBUaGUgQklUIExWRFMgdGFibGUncyBoZWFkZXIgaGFzIHRoZSBpbmZvcm1hdGlvbiB0byBzZXR1cCB0aGUKKwkgKiBuZWNlc3NhcnkgcmVnaXN0ZXJzLiBGb2xsb3dpbmcgdGhlIHN0YW5kYXJkIDQgYnl0ZSBoZWFkZXIgYXJlOgorCSAqIEEgYml0bWFzayBieXRlIGFuZCBhIGR1YWwtbGluayB0cmFuc2l0aW9uIHB4Y2xrIHZhbHVlIGZvciB1c2UgaW4KKwkgKiBzZWxlY3RpbmcgdGhlIGluaXQgc2NyaXB0IHdoZW4gbm90IHVzaW5nIHN0cmFwczsgNCBzY3JpcHQgcG9pbnRlcnMKKwkgKiBmb3IgcGFuZWwgcG93ZXIsIHNlbGVjdGVkIGJ5IG91dHB1dCBhbmQgb24vb2ZmOyBhbmQgOCB0YWJsZSBwb2ludGVycworCSAqIGZvciBwYW5lbCBpbml0LCB0aGUgbmVlZGVkIG9uZSBkZXRlcm1pbmVkIGJ5IG91dHB1dCwgYW5kIGJpdHMgaW4gdGhlCisJICogY29uZiBieXRlLiBUaGVzZSB0YWJsZXMgYXJlIHNpbWlsYXIgdG8gdGhlIFRNRFMgdGFibGVzLCBjb25zaXN0aW5nCisJICogb2YgYSBsaXN0IG9mIHB4Y2xrcyBhbmQgc2NyaXB0IHBvaW50ZXJzLgorCSAqLworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkZXZfcHJpdi0+VkJJT1M7CisJdW5zaWduZWQgaW50IG91dHB1dHNldCA9IChkY2JlbnQtPm9yID09IDQpID8gMSA6IDA7CisJdWludDE2X3Qgc2NyaXB0cHRyID0gMCwgY2xrdGFibGU7CisJdWludDhfdCBjbGt0YWJsZXB0ciA9IDA7CisKKwkvKgorCSAqIEZvciBub3cgd2UgYXNzdW1lIHZlcnNpb24gMy4wIHRhYmxlIC0gZzgwIHN1cHBvcnQgd2lsbCBuZWVkIHNvbWUKKwkgKiBjaGFuZ2VzCisJICovCisKKwlzd2l0Y2ggKHNjcmlwdCkgeworCWNhc2UgTFZEU19JTklUOgorCQlyZXR1cm4gLUVOT1NZUzsKKwljYXNlIExWRFNfQkFDS0xJR0hUX09OOgorCWNhc2UgTFZEU19QQU5FTF9PTjoKKwkJc2NyaXB0cHRyID0gUk9NMTYoYmlvcy0+ZGF0YVtiaW9zLT5mcC5sdmRzbWFudWZhY3R1cmVycG9pbnRlciArIDcgKyBvdXRwdXRzZXQgKiAyXSk7CisJCWJyZWFrOworCWNhc2UgTFZEU19CQUNLTElHSFRfT0ZGOgorCWNhc2UgTFZEU19QQU5FTF9PRkY6CisJCXNjcmlwdHB0ciA9IFJPTTE2KGJpb3MtPmRhdGFbYmlvcy0+ZnAubHZkc21hbnVmYWN0dXJlcnBvaW50ZXIgKyAxMSArIG91dHB1dHNldCAqIDJdKTsKKwkJYnJlYWs7CisJY2FzZSBMVkRTX1JFU0VUOgorCQlpZiAoZGNiZW50LT5sdmRzY29uZi51c2Vfc3RyYXBzX2Zvcl9tb2RlKSB7CisJCQlpZiAoYmlvcy0+ZnAuZHVhbF9saW5rKQorCQkJCWNsa3RhYmxlcHRyICs9IDI7CisJCQlpZiAoYmlvcy0+ZnAuQklUYml0MSkKKwkJCQljbGt0YWJsZXB0cisrOworCQl9IGVsc2UgeworCQkJLyogdXNpbmcgRURJRCAqLworCQkJdWludDhfdCBmYWxsYmFjayA9IGJpb3MtPmRhdGFbYmlvcy0+ZnAubHZkc21hbnVmYWN0dXJlcnBvaW50ZXIgKyA0XTsKKwkJCWludCBmYWxsYmFja2NtcHZhbCA9IChkY2JlbnQtPm9yID09IDQpID8gNCA6IDE7CisKKwkJCWlmIChiaW9zLT5mcC5kdWFsX2xpbmspIHsKKwkJCQljbGt0YWJsZXB0ciArPSAyOworCQkJCWZhbGxiYWNrY21wdmFsICo9IDI7CisJCQl9CisJCQlpZiAoZmFsbGJhY2tjbXB2YWwgJiBmYWxsYmFjaykKKwkJCQljbGt0YWJsZXB0cisrOworCQl9CisKKwkJLyogYWRkaW5nIG91dHB1dHNldCAqIDggbWF5IG5vdCBiZSBjb3JyZWN0ICovCisJCWNsa3RhYmxlID0gUk9NMTYoYmlvcy0+ZGF0YVtiaW9zLT5mcC5sdmRzbWFudWZhY3R1cmVycG9pbnRlciArIDE1ICsgY2xrdGFibGVwdHIgKiAyICsgb3V0cHV0c2V0ICogOF0pOworCQlpZiAoIWNsa3RhYmxlKSB7CisJCQlOVl9FUlJPUihkZXYsICJQaXhlbCBjbG9jayBjb21wYXJpc29uIHRhYmxlIG5vdCBmb3VuZFxuIik7CisJCQlyZXR1cm4gLUVOT0VOVDsKKwkJfQorCQlzY3JpcHRwdHIgPSBjbGtjbXB0YWJsZShiaW9zLCBjbGt0YWJsZSwgcHhjbGspOworCX0KKworCWlmICghc2NyaXB0cHRyKSB7CisJCU5WX0VSUk9SKGRldiwgIkxWRFMgb3V0cHV0IGluaXQgc2NyaXB0IG5vdCBmb3VuZFxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKwlydW5fZGlnaXRhbF9vcF9zY3JpcHQoZGV2LCBzY3JpcHRwdHIsIGRjYmVudCwgaGVhZCwgYmlvcy0+ZnAuZHVhbF9saW5rKTsKKworCXJldHVybiAwOworfQorCitpbnQgY2FsbF9sdmRzX3NjcmlwdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2VudHJ5ICpkY2JlbnQsIGludCBoZWFkLCBlbnVtIExWRFNfc2NyaXB0IHNjcmlwdCwgaW50IHB4Y2xrKQoreworCS8qCisJICogTFZEUyBvcGVyYXRpb25zIGFyZSBtdWx0aXBsZXhlZCBpbiBhbiBlZmZvcnQgdG8gcHJlc2VudCBhIHNpbmdsZSBBUEkKKwkgKiB3aGljaCB3b3JrcyB3aXRoIHR3byB2YXN0bHkgZGlmZmVyaW5nIHVuZGVybHlpbmcgc3RydWN0dXJlcy4KKwkgKiBUaGlzIGFjdHMgYXMgdGhlIGRlbXV4CisJICovCisKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudmJpb3MgKmJpb3MgPSAmZGV2X3ByaXYtPlZCSU9TOworCXVpbnQ4X3QgbHZkc192ZXIgPSBiaW9zLT5kYXRhW2Jpb3MtPmZwLmx2ZHNtYW51ZmFjdHVyZXJwb2ludGVyXTsKKwl1aW50MzJfdCBzZWxfY2xrX2JpbmRpbmcsIHNlbF9jbGs7CisJaW50IHJldDsKKworCWlmIChiaW9zLT5mcC5sYXN0X3NjcmlwdF9pbnZvYyA9PSAoc2NyaXB0IDw8IDEgfCBoZWFkKSB8fCAhbHZkc192ZXIgfHwKKwkgICAgKGx2ZHNfdmVyID49IDB4MzAgJiYgc2NyaXB0ID09IExWRFNfSU5JVCkpCisJCXJldHVybiAwOworCisJaWYgKCFiaW9zLT5mcC5sdmRzX2luaXRfcnVuKSB7CisJCWJpb3MtPmZwLmx2ZHNfaW5pdF9ydW4gPSB0cnVlOworCQljYWxsX2x2ZHNfc2NyaXB0KGRldiwgZGNiZW50LCBoZWFkLCBMVkRTX0lOSVQsIHB4Y2xrKTsKKwl9CisKKwlpZiAoc2NyaXB0ID09IExWRFNfUEFORUxfT04gJiYgYmlvcy0+ZnAucmVzZXRfYWZ0ZXJfcGNsa19jaGFuZ2UpCisJCWNhbGxfbHZkc19zY3JpcHQoZGV2LCBkY2JlbnQsIGhlYWQsIExWRFNfUkVTRVQsIHB4Y2xrKTsKKwlpZiAoc2NyaXB0ID09IExWRFNfUkVTRVQgJiYgYmlvcy0+ZnAucG93ZXJfb2ZmX2Zvcl9yZXNldCkKKwkJY2FsbF9sdmRzX3NjcmlwdChkZXYsIGRjYmVudCwgaGVhZCwgTFZEU19QQU5FTF9PRkYsIHB4Y2xrKTsKKworCU5WX1RSQUNFKGRldiwgIkNhbGxpbmcgTFZEUyBzY3JpcHQgJWQ6XG4iLCBzY3JpcHQpOworCisJLyogZG9uJ3QgbGV0IHNjcmlwdCBjaGFuZ2UgcGxsLT5oZWFkIGJpbmRpbmcgKi8KKwlzZWxfY2xrX2JpbmRpbmcgPSBiaW9zX3JkMzIoYmlvcywgTlZfUFJBTURBQ19TRUxfQ0xLKSAmIDB4NTAwMDA7CisKKwlpZiAobHZkc192ZXIgPCAweDMwKQorCQlyZXQgPSBjYWxsX2x2ZHNfbWFudWZhY3R1cmVyX3NjcmlwdChkZXYsIGRjYmVudCwgaGVhZCwgc2NyaXB0KTsKKwllbHNlCisJCXJldCA9IHJ1bl9sdmRzX3RhYmxlKGRldiwgZGNiZW50LCBoZWFkLCBzY3JpcHQsIHB4Y2xrKTsKKworCWJpb3MtPmZwLmxhc3Rfc2NyaXB0X2ludm9jID0gKHNjcmlwdCA8PCAxIHwgaGVhZCk7CisKKwlzZWxfY2xrID0gTlZSZWFkUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19TRUxfQ0xLKSAmIH4weDUwMDAwOworCU5WV3JpdGVSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDX1NFTF9DTEssIHNlbF9jbGsgfCBzZWxfY2xrX2JpbmRpbmcpOworCS8qIHNvbWUgc2NyaXB0cyBzZXQgYSB2YWx1ZSBpbiBOVl9QQlVTX1BPV0VSQ1RSTF8yIGFuZCBicmVhayB2aWRlbyBvdmVybGF5ICovCisJbnZXcml0ZU1DKGRldiwgTlZfUEJVU19QT1dFUkNUUkxfMiwgMCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdHJ1Y3QgbHZkc3RhYmxlaGVhZGVyIHsKKwl1aW50OF90IGx2ZHNfdmVyLCBoZWFkZXJsZW4sIHJlY29yZGxlbjsKK307CisKK3N0YXRpYyBpbnQgcGFyc2VfbHZkc19tYW51ZmFjdHVyZXJfdGFibGVfaGVhZGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBudmJpb3MgKmJpb3MsIHN0cnVjdCBsdmRzdGFibGVoZWFkZXIgKmx0aCkKK3sKKwkvKgorCSAqIEJNUCB2ZXJzaW9uICgweGEpIExWRFMgdGFibGUgaGFzIGEgc2ltcGxlIGhlYWRlciBvZiB2ZXJzaW9uIGFuZAorCSAqIHJlY29yZCBsZW5ndGguIFRoZSBCSVQgTFZEUyB0YWJsZSBoYXMgdGhlIHR5cGljYWwgQklUIHRhYmxlIGhlYWRlcjoKKwkgKiB2ZXJzaW9uIGJ5dGUsIGhlYWRlciBsZW5ndGggYnl0ZSwgcmVjb3JkIGxlbmd0aCBieXRlLCBhbmQgYSBieXRlIGZvcgorCSAqIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZWNvcmRzIHRoYXQgY2FuIGJlIGhlbGQgaW4gdGhlIHRhYmxlLgorCSAqLworCisJdWludDhfdCBsdmRzX3ZlciwgaGVhZGVybGVuLCByZWNvcmRsZW47CisKKwltZW1zZXQobHRoLCAwLCBzaXplb2Yoc3RydWN0IGx2ZHN0YWJsZWhlYWRlcikpOworCisJaWYgKGJpb3MtPmZwLmx2ZHNtYW51ZmFjdHVyZXJwb2ludGVyID09IDB4MCkgeworCQlOVl9FUlJPUihkZXYsICJQb2ludGVyIHRvIExWRFMgbWFudWZhY3R1cmVyIHRhYmxlIGludmFsaWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlsdmRzX3ZlciA9IGJpb3MtPmRhdGFbYmlvcy0+ZnAubHZkc21hbnVmYWN0dXJlcnBvaW50ZXJdOworCisJc3dpdGNoIChsdmRzX3ZlcikgeworCWNhc2UgMHgwYToJLyogcHJlIE5WNDAgKi8KKwkJaGVhZGVybGVuID0gMjsKKwkJcmVjb3JkbGVuID0gYmlvcy0+ZGF0YVtiaW9zLT5mcC5sdmRzbWFudWZhY3R1cmVycG9pbnRlciArIDFdOworCQlicmVhazsKKwljYXNlIDB4MzA6CS8qIE5WNHggKi8KKwkJaGVhZGVybGVuID0gYmlvcy0+ZGF0YVtiaW9zLT5mcC5sdmRzbWFudWZhY3R1cmVycG9pbnRlciArIDFdOworCQlpZiAoaGVhZGVybGVuIDwgMHgxZikgeworCQkJTlZfRVJST1IoZGV2LCAiTFZEUyB0YWJsZSBoZWFkZXIgbm90IHVuZGVyc3Rvb2RcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmVjb3JkbGVuID0gYmlvcy0+ZGF0YVtiaW9zLT5mcC5sdmRzbWFudWZhY3R1cmVycG9pbnRlciArIDJdOworCQlicmVhazsKKwljYXNlIDB4NDA6CS8qIEc4MC9HOTAgKi8KKwkJaGVhZGVybGVuID0gYmlvcy0+ZGF0YVtiaW9zLT5mcC5sdmRzbWFudWZhY3R1cmVycG9pbnRlciArIDFdOworCQlpZiAoaGVhZGVybGVuIDwgMHg3KSB7CisJCQlOVl9FUlJPUihkZXYsICJMVkRTIHRhYmxlIGhlYWRlciBub3QgdW5kZXJzdG9vZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyZWNvcmRsZW4gPSBiaW9zLT5kYXRhW2Jpb3MtPmZwLmx2ZHNtYW51ZmFjdHVyZXJwb2ludGVyICsgMl07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCU5WX0VSUk9SKGRldiwKKwkJCSAiTFZEUyB0YWJsZSByZXZpc2lvbiAlZC4lZCBub3QgY3VycmVudGx5IHN1cHBvcnRlZFxuIiwKKwkJCSBsdmRzX3ZlciA+PiA0LCBsdmRzX3ZlciAmIDB4Zik7CisJCXJldHVybiAtRU5PU1lTOworCX0KKworCWx0aC0+bHZkc192ZXIgPSBsdmRzX3ZlcjsKKwlsdGgtPmhlYWRlcmxlbiA9IGhlYWRlcmxlbjsKKwlsdGgtPnJlY29yZGxlbiA9IHJlY29yZGxlbjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitnZXRfZnBfc3RyYXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG52YmlvcyAqYmlvcykKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJLyoKKwkgKiBUaGUgZnAgc3RyYXAgaXMgbm9ybWFsbHkgZGljdGF0ZWQgYnkgdGhlICJVc2VyIFN0cmFwIiBpbgorCSAqIFBFWFRERVZfQk9PVF8wWzIwOjE2XSwgYnV0IG9uIEJNUCBjYXJkcyB3aGVuIGJpdCAyIG9mIHRoZQorCSAqIEludGVybmFsX0ZsYWdzIHN0cnVjdCBhdCAweDQ4IGlzIHNldCwgdGhlIHVzZXIgc3RyYXAgZ2V0cyBvdmVycmlkZW4KKwkgKiBieSB0aGUgUENJIHN1YnN5c3RlbSBJRCBkdXJpbmcgUE9TVCwgYnV0IG5vdCBiZWZvcmUgdGhlIHByZXZpb3VzIHVzZXIKKwkgKiBzdHJhcCBoYXMgYmVlbiBjb21taXR0ZWQgdG8gQ1I1OCBmb3IgQ1I1Nz0weGYgb24gaGVhZCBBLCB3aGljaCBtYXkgYmUKKwkgKiByZWFkIGFuZCB1c2VkIGluc3RlYWQKKwkgKi8KKworCWlmIChiaW9zLT5tYWpvcl92ZXJzaW9uIDwgNSAmJiBiaW9zLT5kYXRhWzB4NDhdICYgMHg0KQorCQlyZXR1cm4gTlZSZWFkVmdhQ3J0YzU3NTgoZGV2LCAwLCAweGYpICYgMHhmOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApCisJCXJldHVybiAoYmlvc19yZDMyKGJpb3MsIE5WX1BFWFRERVZfQk9PVF8wKSA+PiAyNCkgJiAweGY7CisJZWxzZQorCQlyZXR1cm4gKGJpb3NfcmQzMihiaW9zLCBOVl9QRVhUREVWX0JPT1RfMCkgPj4gMTYpICYgMHhmOworfQorCitzdGF0aWMgaW50IHBhcnNlX2ZwX21vZGVfdGFibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG52YmlvcyAqYmlvcykKK3sKKwl1aW50OF90ICpmcHRhYmxlOworCXVpbnQ4X3QgZnB0YWJsZV92ZXIsIGhlYWRlcmxlbiA9IDAsIHJlY29yZGxlbiwgZnBlbnRyaWVzID0gMHhmLCBmcGluZGV4OworCWludCByZXQsIG9mcywgZnBzdHJhcHBpbmc7CisJc3RydWN0IGx2ZHN0YWJsZWhlYWRlciBsdGg7CisKKwlpZiAoYmlvcy0+ZnAuZnB0YWJsZXBvaW50ZXIgPT0gMHgwKSB7CisJCS8qIEFwcGxlIGNhcmRzIGRvbid0IGhhdmUgdGhlIGZwIHRhYmxlOyB0aGUgbGFwdG9wcyB1c2UgRERDICovCisJCS8qIFRoZSB0YWJsZSBpcyBhbHNvIG1pc3Npbmcgb24gc29tZSB4ODYgSUdQcyAqLworI2lmbmRlZiBfX3Bvd2VycGNfXworCQlOVl9FUlJPUihkZXYsICJQb2ludGVyIHRvIGZsYXQgcGFuZWwgdGFibGUgaW52YWxpZFxuIik7CisjZW5kaWYKKwkJYmlvcy0+cHViLmRpZ2l0YWxfbWluX2Zyb250X3BvcmNoID0gMHg0YjsKKwkJcmV0dXJuIDA7CisJfQorCisJZnB0YWJsZSA9ICZiaW9zLT5kYXRhW2Jpb3MtPmZwLmZwdGFibGVwb2ludGVyXTsKKwlmcHRhYmxlX3ZlciA9IGZwdGFibGVbMF07CisKKwlzd2l0Y2ggKGZwdGFibGVfdmVyKSB7CisJLyoKKwkgKiBCTVAgdmVyc2lvbiAweDUuMHgxMSBCSU9TZW4gaGF2ZSB2ZXJzaW9uIDEgbGlrZSB0YWJsZXMsIGJ1dCBubworCSAqIHZlcnNpb24gZmllbGQsIGFuZCBtaXNzIG9uZSBvZiB0aGUgc3ByZWFkIHNwZWN0cnVtL1BXTSBieXRlcy4KKwkgKiBUaGlzIGNvdWxkIGFmZmVjdCBlYXJseSBHRjJHbyBwYXJ0cyAobm90IHNlZW4gYW55IGFwcHJvcHJpYXRlIFJPTXMKKwkgKiB0aG91Z2gpLiBIZXJlIHdlIGFzc3VtZSB0aGF0IGEgdmVyc2lvbiBvZiAweDA1IG1hdGNoZXMgdGhpcyBjYXNlCisJICogKGNvbWJpbmluZyB3aXRoIGEgQk1QIHZlcnNpb24gY2hlY2sgd291bGQgYmUgYmV0dGVyKSwgYXMgdGhlCisJICogY29tbW9uIGNhc2UgZm9yIHRoZSBwYW5lbCB0eXBlIGZpZWxkIGlzIDB4MDAwNSwgYW5kIHRoYXQgaXMgaW4KKwkgKiBmYWN0IHdoYXQgd2UgYXJlIHJlYWRpbmcgdGhlIGZpcnN0IGJ5dGUgb2YuCisJICovCisJY2FzZSAweDA1OgkvKiBzb21lIE5WMTAsIDExLCAxNSwgMTYgKi8KKwkJcmVjb3JkbGVuID0gNDI7CisJCW9mcyA9IC0xOworCQlicmVhazsKKwljYXNlIDB4MTA6CS8qIHNvbWUgTlYxNS8xNiwgYW5kIE5WMTErICovCisJCXJlY29yZGxlbiA9IDQ0OworCQlvZnMgPSAwOworCQlicmVhazsKKwljYXNlIDB4MjA6CS8qIE5WNDArICovCisJCWhlYWRlcmxlbiA9IGZwdGFibGVbMV07CisJCXJlY29yZGxlbiA9IGZwdGFibGVbMl07CisJCWZwZW50cmllcyA9IGZwdGFibGVbM107CisJCS8qCisJCSAqIGZwdGFibGVbNF0gaXMgdGhlIG1pbmltdW0KKwkJICogUkFNREFDX0ZQX0hDUlRDIC0+IFJBTURBQ19GUF9IU1lOQ19TVEFSVCBnYXAKKwkJICovCisJCWJpb3MtPnB1Yi5kaWdpdGFsX21pbl9mcm9udF9wb3JjaCA9IGZwdGFibGVbNF07CisJCW9mcyA9IC03OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlOVl9FUlJPUihkZXYsCisJCQkgIkZQIHRhYmxlIHJldmlzaW9uICVkLiVkIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkXG4iLAorCQkJIGZwdGFibGVfdmVyID4+IDQsIGZwdGFibGVfdmVyICYgMHhmKTsKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCisJaWYgKCFiaW9zLT5pc19tb2JpbGUpIC8qICFtb2JpbGUgb25seSBuZWVkcyBkaWdpdGFsX21pbl9mcm9udF9wb3JjaCAqLworCQlyZXR1cm4gMDsKKworCXJldCA9IHBhcnNlX2x2ZHNfbWFudWZhY3R1cmVyX3RhYmxlX2hlYWRlcihkZXYsIGJpb3MsICZsdGgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAobHRoLmx2ZHNfdmVyID09IDB4MzAgfHwgbHRoLmx2ZHNfdmVyID09IDB4NDApIHsKKwkJYmlvcy0+ZnAuZnB4bGF0ZXRhYmxlcHRyID0gYmlvcy0+ZnAubHZkc21hbnVmYWN0dXJlcnBvaW50ZXIgKworCQkJCQkJCWx0aC5oZWFkZXJsZW4gKyAxOworCQliaW9zLT5mcC54bGF0d2lkdGggPSBsdGgucmVjb3JkbGVuOworCX0KKwlpZiAoYmlvcy0+ZnAuZnB4bGF0ZXRhYmxlcHRyID09IDB4MCkgeworCQlOVl9FUlJPUihkZXYsICJQb2ludGVyIHRvIGZsYXQgcGFuZWwgeGxhdCB0YWJsZSBpbnZhbGlkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZnBzdHJhcHBpbmcgPSBnZXRfZnBfc3RyYXAoZGV2LCBiaW9zKTsKKworCWZwaW5kZXggPSBiaW9zLT5kYXRhW2Jpb3MtPmZwLmZweGxhdGV0YWJsZXB0ciArCisJCQkJCWZwc3RyYXBwaW5nICogYmlvcy0+ZnAueGxhdHdpZHRoXTsKKworCWlmIChmcGluZGV4ID4gZnBlbnRyaWVzKSB7CisJCU5WX0VSUk9SKGRldiwgIkJhZCBmbGF0IHBhbmVsIHRhYmxlIGluZGV4XG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJLyogbnY0eCBjYXJkcyBuZWVkIGJvdGggYSBzdHJhcCB2YWx1ZSBhbmQgZnBpbmRleCBvZiAweGYgdG8gdXNlIEREQyAqLworCWlmIChsdGgubHZkc192ZXIgPiAweDEwKQorCQliaW9zLT5wdWIuZnBfbm9fZGRjID0gZnBzdHJhcHBpbmcgIT0gMHhmIHx8IGZwaW5kZXggIT0gMHhmOworCisJLyoKKwkgKiBJZiBlaXRoZXIgdGhlIHN0cmFwIG9yIHhsYXRlZCBmcGluZGV4IHZhbHVlIGFyZSAweGYgdGhlcmUgaXMgbm8KKwkgKiBwYW5lbCB1c2luZyBhIHN0cmFwLWRlcml2ZWQgYmlvcyBtb2RlIHByZXNlbnQuICB0aGlzIGNvbmRpdGlvbgorCSAqIGluY2x1ZGVzLCBidXQgaXMgZGlmZmVyZW50IGZyb20sIHRoZSBEREMgcGFuZWwgaW5kaWNhdG9yIGFib3ZlCisJICovCisJaWYgKGZwc3RyYXBwaW5nID09IDB4ZiB8fCBmcGluZGV4ID09IDB4ZikKKwkJcmV0dXJuIDA7CisKKwliaW9zLT5mcC5tb2RlX3B0ciA9IGJpb3MtPmZwLmZwdGFibGVwb2ludGVyICsgaGVhZGVybGVuICsKKwkJCSAgICByZWNvcmRsZW4gKiBmcGluZGV4ICsgb2ZzOworCisJTlZfVFJBQ0UoZGV2LCAiQklPUyBGUCBtb2RlOiAlZHglZCAoJWRrSHogcGl4ZWwgY2xvY2spXG4iLAorCQkgUk9NMTYoYmlvcy0+ZGF0YVtiaW9zLT5mcC5tb2RlX3B0ciArIDExXSkgKyAxLAorCQkgUk9NMTYoYmlvcy0+ZGF0YVtiaW9zLT5mcC5tb2RlX3B0ciArIDI1XSkgKyAxLAorCQkgUk9NMTYoYmlvcy0+ZGF0YVtiaW9zLT5mcC5tb2RlX3B0ciArIDddKSAqIDEwKTsKKworCXJldHVybiAwOworfQorCitib29sIG5vdXZlYXVfYmlvc19mcF9tb2RlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkZXZfcHJpdi0+VkJJT1M7CisJdWludDhfdCAqbW9kZV9lbnRyeSA9ICZiaW9zLT5kYXRhW2Jpb3MtPmZwLm1vZGVfcHRyXTsKKworCWlmICghbW9kZSkJLyoganVzdCBjaGVja2luZyB3aGV0aGVyIHdlIGNhbiBwcm9kdWNlIGEgbW9kZSAqLworCQlyZXR1cm4gYmlvcy0+ZnAubW9kZV9wdHI7CisKKwltZW1zZXQobW9kZSwgMCwgc2l6ZW9mKHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlKSk7CisJLyoKKwkgKiBGb3IgdmVyc2lvbiAxLjAgKHZlcnNpb24gaW4gYnl0ZSAwKToKKwkgKiBieXRlcyAxLTIgYXJlICJwYW5lbCB0eXBlIiwgaW5jbHVkaW5nIGJpdHMgb24gd2hldGhlciBDb2xvdXIvbW9ubywKKwkgKiBzaW5nbGUvZHVhbCBsaW5rLCBhbmQgdHlwZSAoVEZUIGV0Yy4pCisJICogYnl0ZXMgMy02IGFyZSBiaXRzIHBlciBjb2xvdXIgaW4gUkdCWAorCSAqLworCW1vZGUtPmNsb2NrID0gUk9NMTYobW9kZV9lbnRyeVs3XSkgKiAxMDsKKwkvKiBieXRlcyA5LTEwIGlzIEhBY3RpdmUgKi8KKwltb2RlLT5oZGlzcGxheSA9IFJPTTE2KG1vZGVfZW50cnlbMTFdKSArIDE7CisJLyoKKwkgKiBieXRlcyAxMy0xNCBpcyBIVmFsaWQgU3RhcnQKKwkgKiBieXRlcyAxNS0xNiBpcyBIVmFsaWQgRW5kCisJICovCisJbW9kZS0+aHN5bmNfc3RhcnQgPSBST00xNihtb2RlX2VudHJ5WzE3XSkgKyAxOworCW1vZGUtPmhzeW5jX2VuZCA9IFJPTTE2KG1vZGVfZW50cnlbMTldKSArIDE7CisJbW9kZS0+aHRvdGFsID0gUk9NMTYobW9kZV9lbnRyeVsyMV0pICsgMTsKKwkvKiBieXRlcyAyMy0yNCwgMjctMzAgc2ltaWxhcmx5LCBidXQgdmVydGljYWwgKi8KKwltb2RlLT52ZGlzcGxheSA9IFJPTTE2KG1vZGVfZW50cnlbMjVdKSArIDE7CisJbW9kZS0+dnN5bmNfc3RhcnQgPSBST00xNihtb2RlX2VudHJ5WzMxXSkgKyAxOworCW1vZGUtPnZzeW5jX2VuZCA9IFJPTTE2KG1vZGVfZW50cnlbMzNdKSArIDE7CisJbW9kZS0+dnRvdGFsID0gUk9NMTYobW9kZV9lbnRyeVszNV0pICsgMTsKKwltb2RlLT5mbGFncyB8PSAobW9kZV9lbnRyeVszN10gJiAweDEwKSA/CisJCQlEUk1fTU9ERV9GTEFHX1BIU1lOQyA6IERSTV9NT0RFX0ZMQUdfTkhTWU5DOworCW1vZGUtPmZsYWdzIHw9IChtb2RlX2VudHJ5WzM3XSAmIDB4MSkgPworCQkJRFJNX01PREVfRkxBR19QVlNZTkMgOiBEUk1fTU9ERV9GTEFHX05WU1lOQzsKKwkvKgorCSAqIGJ5dGVzIDM4LTM5IHJlbGF0ZSB0byBzcHJlYWQgc3BlY3RydW0gc2V0dGluZ3MKKwkgKiBieXRlcyA0MC00MyBhcmUgc29tZXRoaW5nIHRvIGRvIHdpdGggUFdNCisJICovCisKKwltb2RlLT5zdGF0dXMgPSBNT0RFX09LOworCW1vZGUtPnR5cGUgPSBEUk1fTU9ERV9UWVBFX0RSSVZFUiB8IERSTV9NT0RFX1RZUEVfUFJFRkVSUkVEOworCWRybV9tb2RlX3NldF9uYW1lKG1vZGUpOworCXJldHVybiBiaW9zLT5mcC5tb2RlX3B0cjsKK30KKworaW50IG5vdXZlYXVfYmlvc19wYXJzZV9sdmRzX3RhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBweGNsaywgYm9vbCAqZGwsIGJvb2wgKmlmX2lzXzI0Yml0KQoreworCS8qCisJICogVGhlIExWRFMgdGFibGUgaGVhZGVyIGlzIChtb3N0bHkpIGRlc2NyaWJlZCBpbgorCSAqIHBhcnNlX2x2ZHNfbWFudWZhY3R1cmVyX3RhYmxlX2hlYWRlcigpOiB0aGUgQklUIGhlYWRlciBhZGRpdGlvbmFsbHkKKwkgKiBjb250YWlucyB0aGUgZHVhbC1saW5rIHRyYW5zaXRpb24gcHhjbGsgKGluIDEwcyBrSHopLCBhdCBieXRlIDUgLSBpZgorCSAqIHN0cmFwcyBhcmUgbm90IGJlaW5nIHVzZWQgZm9yIHRoZSBwYW5lbCwgdGhpcyBzcGVjaWZpZXMgdGhlIGZyZXF1ZW5jeQorCSAqIGF0IHdoaWNoIG1vZGVzIHNob3VsZCBiZSBzZXQgdXAgaW4gdGhlIGR1YWwgbGluayBzdHlsZS4KKwkgKgorCSAqIEZvbGxvd2luZyB0aGUgaGVhZGVyLCB0aGUgQk1QICh2ZXIgMHhhKSB0YWJsZSBoYXMgc2V2ZXJhbCByZWNvcmRzLAorCSAqIGluZGV4ZWQgYnkgYSBzZXBlcmF0ZSB4bGF0IHRhYmxlLCBpbmRleGVkIGluIHR1cm4gYnkgdGhlIGZwIHN0cmFwIGluCisJICogRVhUREVWX0JPT1QuIEVhY2ggcmVjb3JkIGhhZCBhIGNvbmZpZyBieXRlLCBmb2xsb3dlZCBieSA2IHNjcmlwdAorCSAqIG51bWJlcnMgZm9yIHVzZSBieSBJTklUX1NVQiB3aGljaCBjb250cm9sbGVkIHBhbmVsIGluaXQgYW5kIHBvd2VyLAorCSAqIGFuZCBmaW5hbGx5IGEgZHdvcmQgb2YgbXMgdG8gc2xlZXAgYmV0d2VlbiBwb3dlciBvZmYgYW5kIG9uCisJICogb3BlcmF0aW9ucy4KKwkgKgorCSAqIEluIHRoZSBCSVQgdmVyc2lvbnMsIHRoZSB0YWJsZSBmb2xsb3dpbmcgdGhlIGhlYWRlciBzZXJ2ZXMgYXMgYW4KKwkgKiBpbnRlZ3JhdGVkIGNvbmZpZyBhbmQgeGxhdCB0YWJsZTogdGhlIHJlY29yZHMgaW4gdGhlIHRhYmxlIGFyZQorCSAqIGluZGV4ZWQgYnkgdGhlIEZQIHN0cmFwIG5pYmJsZSBpbiBFWFRERVZfQk9PVCwgYW5kIGVhY2ggcmVjb3JkIGhhcworCSAqIHR3byBieXRlcyAtIHRoZSBmaXJzdCBhcyBhIGNvbmZpZyBieXRlLCB0aGUgc2Vjb25kIGZvciBpbmRleGluZyB0aGUKKwkgKiBmcCBtb2RlIHRhYmxlIHBvaW50ZWQgdG8gYnkgdGhlIEJJVCAnRCcgdGFibGUKKwkgKgorCSAqIEREQyBpcyBub3QgdXNlZCB1bnRpbCBhZnRlciBjYXJkIGluaXQsIHNvIHNlbGVjdGluZyB0aGUgY29ycmVjdCB0YWJsZQorCSAqIGVudHJ5IGFuZCBzZXR0aW5nIHRoZSBkdWFsIGxpbmsgZmxhZyBmb3IgRURJRCBlcXVpcHBlZCBwYW5lbHMsCisJICogcmVxdWlyaW5nIHRlc3RzIGFnYWluc3QgdGhlIG5hdGl2ZS1tb2RlIHBpeGVsIGNsb2NrLCBjYW5ub3QgYmUgZG9uZQorCSAqIHVudGlsIGxhdGVyLCB3aGVuIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aXRoIG5vbi16ZXJvIHB4Y2xrCisJICovCisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnZiaW9zICpiaW9zID0gJmRldl9wcml2LT5WQklPUzsKKwlpbnQgZnBzdHJhcHBpbmcgPSBnZXRfZnBfc3RyYXAoZGV2LCBiaW9zKSwgbHZkc21hbnVmYWN0dXJlcmluZGV4ID0gMDsKKwlzdHJ1Y3QgbHZkc3RhYmxlaGVhZGVyIGx0aDsKKwl1aW50MTZfdCBsdmRzb2ZzOworCWludCByZXQsIGNoaXBfdmVyc2lvbiA9IGJpb3MtPnB1Yi5jaGlwX3ZlcnNpb247CisKKwlyZXQgPSBwYXJzZV9sdmRzX21hbnVmYWN0dXJlcl90YWJsZV9oZWFkZXIoZGV2LCBiaW9zLCAmbHRoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc3dpdGNoIChsdGgubHZkc192ZXIpIHsKKwljYXNlIDB4MGE6CS8qIHByZSBOVjQwICovCisJCWx2ZHNtYW51ZmFjdHVyZXJpbmRleCA9IGJpb3MtPmRhdGFbCisJCQkJCWJpb3MtPmZwLmZweGxhdGVtYW51ZmFjdHVyZXJ0YWJsZXB0ciArCisJCQkJCWZwc3RyYXBwaW5nXTsKKworCQkvKiB3ZSdyZSBkb25lIGlmIHRoaXMgaXNuJ3QgdGhlIEVESUQgcGFuZWwgY2FzZSAqLworCQlpZiAoIXB4Y2xrKQorCQkJYnJlYWs7CisKKwkJaWYgKGNoaXBfdmVyc2lvbiA8IDB4MjUpIHsKKwkJCS8qIG52MTcgYmVoYXZpb3VyCisJCQkgKgorCQkJICogSXQgc2VlbXMgdGhlIG9sZCBzdHlsZSBsdmRzIHNjcmlwdCBwb2ludGVyIGlzIHJldXNlZAorCQkJICogdG8gc2VsZWN0IDE4LzI0IGJpdCBjb2xvdXIgZGVwdGggZm9yIEVESUQgcGFuZWxzLgorCQkJICovCisJCQlsdmRzbWFudWZhY3R1cmVyaW5kZXggPQorCQkJCShiaW9zLT5sZWdhY3kubHZkc19zaW5nbGVfYV9zY3JpcHRfcHRyICYgMSkgPworCQkJCQkJCQkJMiA6IDA7CisJCQlpZiAocHhjbGsgPj0gYmlvcy0+ZnAuZHVhbGxpbmtfdHJhbnNpdGlvbl9jbGspCisJCQkJbHZkc21hbnVmYWN0dXJlcmluZGV4Kys7CisJCX0gZWxzZSBpZiAoY2hpcF92ZXJzaW9uIDwgMHgzMCkgeworCQkJLyogbnYyOCBiZWhhdmlvdXIgKG9mZi1jaGlwIGVuY29kZXIpCisJCQkgKgorCQkJICogbnYyOCBkb2VzIGEgY29tcGxleCBkYW5jZSBvZiBmaXJzdCB1c2luZyBieXRlIDEyMSBvZgorCQkJICogdGhlIEVESUQgdG8gY2hvb3NlIHRoZSBsdmRzbWFudWZhY3R1cmVyaW5kZXgsIHRoZW4KKwkJCSAqIGxhdGVyIGF0dGVtcHRpbmcgdG8gbWF0Y2ggdGhlIEVESUQgbWFudWZhY3R1cmVyIGFuZAorCQkJICogcHJvZHVjdCBJRHMgaW4gYSB0YWJsZSAoc2lnbmF0dXJlICdwaWR0JyAocGFuZWwgaWQKKwkJCSAqIHRhYmxlPykpLCBzZXR0aW5nIGFuIGx2ZHNtYW51ZmFjdHVyZXJpbmRleCBvZiAwIGFuZAorCQkJICogYW4gZnAgc3RyYXAgb2YgdGhlIG1hdGNoIGluZGV4IChvciAweGYgaWYgbm9uZSkKKwkJCSAqLworCQkJbHZkc21hbnVmYWN0dXJlcmluZGV4ID0gMDsKKwkJfSBlbHNlIHsKKwkJCS8qIG52MzEsIG52MzQgYmVoYXZpb3VyICovCisJCQlsdmRzbWFudWZhY3R1cmVyaW5kZXggPSAwOworCQkJaWYgKHB4Y2xrID49IGJpb3MtPmZwLmR1YWxsaW5rX3RyYW5zaXRpb25fY2xrKQorCQkJCWx2ZHNtYW51ZmFjdHVyZXJpbmRleCA9IDI7CisJCQlpZiAocHhjbGsgPj0gMTQwMDAwKQorCQkJCWx2ZHNtYW51ZmFjdHVyZXJpbmRleCA9IDM7CisJCX0KKworCQkvKgorCQkgKiBudmlkaWEgc2V0IHRoZSBoaWdoIG5pYmJsZSBvZiAoY3I1Nz1mLCBjcjU4KSB0bworCQkgKiBsdmRzbWFudWZhY3R1cmVyaW5kZXggaW4gdGhpcyBjYXNlOyB3ZSBkb24ndAorCQkgKi8KKwkJYnJlYWs7CisJY2FzZSAweDMwOgkvKiBOVjR4ICovCisJY2FzZSAweDQwOgkvKiBHODAvRzkwICovCisJCWx2ZHNtYW51ZmFjdHVyZXJpbmRleCA9IGZwc3RyYXBwaW5nOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlOVl9FUlJPUihkZXYsICJMVkRTIHRhYmxlIHJldmlzaW9uIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCisJbHZkc29mcyA9IGJpb3MtPmZwLnhsYXRlZF9lbnRyeSA9IGJpb3MtPmZwLmx2ZHNtYW51ZmFjdHVyZXJwb2ludGVyICsgbHRoLmhlYWRlcmxlbiArIGx0aC5yZWNvcmRsZW4gKiBsdmRzbWFudWZhY3R1cmVyaW5kZXg7CisJc3dpdGNoIChsdGgubHZkc192ZXIpIHsKKwljYXNlIDB4MGE6CisJCWJpb3MtPmZwLnBvd2VyX29mZl9mb3JfcmVzZXQgPSBiaW9zLT5kYXRhW2x2ZHNvZnNdICYgMTsKKwkJYmlvcy0+ZnAucmVzZXRfYWZ0ZXJfcGNsa19jaGFuZ2UgPSBiaW9zLT5kYXRhW2x2ZHNvZnNdICYgMjsKKwkJYmlvcy0+ZnAuZHVhbF9saW5rID0gYmlvcy0+ZGF0YVtsdmRzb2ZzXSAmIDQ7CisJCWJpb3MtPmZwLmxpbmtfY19pbmNyZW1lbnQgPSBiaW9zLT5kYXRhW2x2ZHNvZnNdICYgODsKKwkJKmlmX2lzXzI0Yml0ID0gYmlvcy0+ZGF0YVtsdmRzb2ZzXSAmIDE2OworCQlicmVhazsKKwljYXNlIDB4MzA6CisJCS8qCisJCSAqIE15IG1vbmV5IHdvdWxkIGJlIG9uIHRoZXJlIGJlaW5nIGEgMjQgYml0IGludGVyZmFjZSBiaXQgaW4KKwkJICogdGhpcyB0YWJsZSwgYnV0IEkgaGF2ZSBubyBleGFtcGxlIG9mIGEgbGFwdG9wIGJpb3Mgd2l0aCBhCisJCSAqIDI0IGJpdCBwYW5lbCB0byBjb25maXJtIHRoYXQuIEhlbmNlIHdlIHNob3V0IGxvdWRseSBpZiBhbnkKKwkJICogYml0IG90aGVyIHRoYW4gYml0IDAgaXMgc2V0IChJJ3ZlIG5vdCBldmVuIHNlZW4gYml0IDEpCisJCSAqLworCQlpZiAoYmlvcy0+ZGF0YVtsdmRzb2ZzXSA+IDEpCisJCQlOVl9FUlJPUihkZXYsCisJCQkJICJZb3UgaGF2ZSBhIHZlcnkgdW51c3VhbCBsYXB0b3AgZGlzcGxheTsgcGxlYXNlIHJlcG9ydCBpdFxuIik7CisJCS8qCisJCSAqIE5vIHNpZ24gb2YgdGhlICJwb3dlciBvZmYgZm9yIHJlc2V0IiBvciAicmVzZXQgZm9yIHBhbmVsCisJCSAqIG9uIiBiaXRzLCBidXQgaXQncyBzYWZlciB0byBhc3N1bWUgd2Ugc2hvdWxkCisJCSAqLworCQliaW9zLT5mcC5wb3dlcl9vZmZfZm9yX3Jlc2V0ID0gdHJ1ZTsKKwkJYmlvcy0+ZnAucmVzZXRfYWZ0ZXJfcGNsa19jaGFuZ2UgPSB0cnVlOworCQkvKgorCQkgKiBJdCdzIG9rIGx2ZHNvZnMgaXMgd3JvbmcgZm9yIG52NHggZWRpZCBjYXNlOyBkdWFsX2xpbmsgaXMKKwkJICogb3Zlci13cml0dGVuLCBhbmQgQklUYml0MSBpc24ndCB1c2VkCisJCSAqLworCQliaW9zLT5mcC5kdWFsX2xpbmsgPSBiaW9zLT5kYXRhW2x2ZHNvZnNdICYgMTsKKwkJYmlvcy0+ZnAuQklUYml0MSA9IGJpb3MtPmRhdGFbbHZkc29mc10gJiAyOworCQliaW9zLT5mcC5kdWFsbGlua190cmFuc2l0aW9uX2NsayA9IFJPTTE2KGJpb3MtPmRhdGFbYmlvcy0+ZnAubHZkc21hbnVmYWN0dXJlcnBvaW50ZXIgKyA1XSkgKiAxMDsKKwkJYnJlYWs7CisJY2FzZSAweDQwOgorCQliaW9zLT5mcC5kdWFsX2xpbmsgPSBiaW9zLT5kYXRhW2x2ZHNvZnNdICYgMTsKKwkJYmlvcy0+ZnAuaWZfaXNfMjRiaXQgPSBiaW9zLT5kYXRhW2x2ZHNvZnNdICYgMjsKKwkJYmlvcy0+ZnAuc3RyYXBsZXNzX2lzXzI0Yml0ID0gYmlvcy0+ZGF0YVtiaW9zLT5mcC5sdmRzbWFudWZhY3R1cmVycG9pbnRlciArIDRdOworCQliaW9zLT5mcC5kdWFsbGlua190cmFuc2l0aW9uX2NsayA9IFJPTTE2KGJpb3MtPmRhdGFbYmlvcy0+ZnAubHZkc21hbnVmYWN0dXJlcnBvaW50ZXIgKyA1XSkgKiAxMDsKKwkJYnJlYWs7CisJfQorCisJLyogc2V0IGR1YWxfbGluayBmbGFnIGZvciBFRElEIGNhc2UgKi8KKwlpZiAocHhjbGsgJiYgKGNoaXBfdmVyc2lvbiA8IDB4MjUgfHwgY2hpcF92ZXJzaW9uID4gMHgyOCkpCisJCWJpb3MtPmZwLmR1YWxfbGluayA9IChweGNsayA+PSBiaW9zLT5mcC5kdWFsbGlua190cmFuc2l0aW9uX2Nsayk7CisKKwkqZGwgPSBiaW9zLT5mcC5kdWFsX2xpbms7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQ4X3QgKgorYmlvc19vdXRwdXRfY29uZmlnX21hdGNoKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfZW50cnkgKmRjYmVudCwKKwkJCSB1aW50MTZfdCByZWNvcmQsIGludCByZWNvcmRfbGVuLCBpbnQgcmVjb3JkX25yKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkZXZfcHJpdi0+VkJJT1M7CisJdWludDMyX3QgZW50cnk7CisJdWludDE2X3QgdGFibGU7CisJaW50IGksIHY7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVjb3JkX25yOyBpKyssIHJlY29yZCArPSByZWNvcmRfbGVuKSB7CisJCXRhYmxlID0gUk9NMTYoYmlvcy0+ZGF0YVtyZWNvcmRdKTsKKwkJaWYgKCF0YWJsZSkKKwkJCWNvbnRpbnVlOworCQllbnRyeSA9IFJPTTMyKGJpb3MtPmRhdGFbdGFibGVdKTsKKworCQl2ID0gKGVudHJ5ICYgMHgwMDBmMDAwMCkgPj4gMTY7CisJCWlmICghKHYgJiBkY2JlbnQtPm9yKSkKKwkJCWNvbnRpbnVlOworCisJCXYgPSAoZW50cnkgJiAweDAwMDAwMGYwKSA+PiA0OworCQlpZiAodiAhPSBkY2JlbnQtPmxvY2F0aW9uKQorCQkJY29udGludWU7CisKKwkJdiA9IChlbnRyeSAmIDB4MDAwMDAwMGYpOworCQlpZiAodiAhPSBkY2JlbnQtPnR5cGUpCisJCQljb250aW51ZTsKKworCQlyZXR1cm4gJmJpb3MtPmRhdGFbdGFibGVdOworCX0KKworCXJldHVybiBOVUxMOworfQorCit2b2lkICoKK25vdXZlYXVfYmlvc19kcF90YWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2VudHJ5ICpkY2JlbnQsCisJCSAgICAgIGludCAqbGVuZ3RoKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkZXZfcHJpdi0+VkJJT1M7CisJdWludDhfdCAqdGFibGU7CisKKwlpZiAoIWJpb3MtPmRpc3BsYXkuZHBfdGFibGVfcHRyKSB7CisJCU5WX0VSUk9SKGRldiwgIk5vIHBvaW50ZXIgdG8gRGlzcGxheVBvcnQgdGFibGVcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJdGFibGUgPSAmYmlvcy0+ZGF0YVtiaW9zLT5kaXNwbGF5LmRwX3RhYmxlX3B0cl07CisKKwlpZiAodGFibGVbMF0gIT0gMHgyMSkgeworCQlOVl9FUlJPUihkZXYsICJEaXNwbGF5UG9ydCB0YWJsZSB2ZXJzaW9uIDB4JTAyeCB1bmtub3duXG4iLAorCQkJIHRhYmxlWzBdKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJKmxlbmd0aCA9IHRhYmxlWzRdOworCXJldHVybiBiaW9zX291dHB1dF9jb25maWdfbWF0Y2goZGV2LCBkY2JlbnQsCisJCQkJCWJpb3MtPmRpc3BsYXkuZHBfdGFibGVfcHRyICsgdGFibGVbMV0sCisJCQkJCXRhYmxlWzJdLCB0YWJsZVszXSk7Cit9CisKK2ludAorbm91dmVhdV9iaW9zX3J1bl9kaXNwbGF5X3RhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfZW50cnkgKmRjYmVudCwKKwkJCSAgICAgICB1aW50MzJfdCBzdWIsIGludCBweGNsaykKK3sKKwkvKgorCSAqIFRoZSBkaXNwbGF5IHNjcmlwdCB0YWJsZSBpcyBsb2NhdGVkIGJ5IHRoZSBCSVQgJ1UnIHRhYmxlLgorCSAqCisJICogSXQgY29udGFpbnMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gdmFyaW91cyB0YWJsZXMgZGVzY3JpYmluZworCSAqIGEgcGFydGljdWxhciBvdXRwdXQgdHlwZS4gIFRoZSBmaXJzdCAzMi1iaXRzIG9mIHRoZSBvdXRwdXQKKwkgKiB0YWJsZXMgY29udGFpbnMgc2ltaWxhciBpbmZvcm1hdGlvbiB0byBhIERDQiBlbnRyeSwgYW5kIGlzCisJICogdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGF0IHBhcnRpY3VsYXIgdGFibGUgaXMgc3VpdGFibGUgZm9yCisJICogdGhlIG91dHB1dCB5b3Ugd2FudCB0byBhY2Nlc3MuCisJICoKKwkgKiBUaGUgInJlY29yZCBoZWFkZXIgbGVuZ3RoIiBmaWVsZCBoZXJlIHNlZW1zIHRvIGluZGljYXRlIHRoZQorCSAqIG9mZnNldCBvZiB0aGUgZmlyc3QgY29uZmlndXJhdGlvbiBlbnRyeSBpbiB0aGUgb3V0cHV0IHRhYmxlcy4KKwkgKiBUaGlzIGlzIDEwIG9uIG1vc3QgY2FyZHMgSSd2ZSBzZWVuLCBidXQgMTIgaGFzIGJlZW4gd2l0bmVzc2VkCisJICogb24gRFAgY2FyZHMsIGFuZCB0aGVyZSdzIGFub3RoZXIgc2NyaXB0IHBvaW50ZXIgd2l0aGluIHRoZQorCSAqIGhlYWRlci4KKwkgKgorCSAqIG9mZnNldCArIDAgICAoIDggYml0cyk6IHZlcnNpb24KKwkgKiBvZmZzZXQgKyAxICAgKCA4IGJpdHMpOiBoZWFkZXIgbGVuZ3RoCisJICogb2Zmc2V0ICsgMiAgICggOCBiaXRzKTogcmVjb3JkIGxlbmd0aAorCSAqIG9mZnNldCArIDMgICAoIDggYml0cyk6IG51bWJlciBvZiByZWNvcmRzCisJICogb2Zmc2V0ICsgNCAgICggOCBiaXRzKTogcmVjb3JkIGhlYWRlciBsZW5ndGgKKwkgKiBvZmZzZXQgKyA1ICAgKDE2IGJpdHMpOiBwb2ludGVyIHRvIGZpcnN0IG91dHB1dCBzY3JpcHQgdGFibGUKKwkgKi8KKworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGluaXRfZXhlYyBpZXhlYyA9IHt0cnVlLCBmYWxzZX07CisJc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkZXZfcHJpdi0+VkJJT1M7CisJdWludDhfdCAqdGFibGUgPSAmYmlvcy0+ZGF0YVtiaW9zLT5kaXNwbGF5LnNjcmlwdF90YWJsZV9wdHJdOworCXVpbnQ4X3QgKm90YWJsZSA9IE5VTEw7CisJdWludDE2X3Qgc2NyaXB0OworCWludCBpID0gMDsKKworCWlmICghYmlvcy0+ZGlzcGxheS5zY3JpcHRfdGFibGVfcHRyKSB7CisJCU5WX0VSUk9SKGRldiwgIk5vIHBvaW50ZXIgdG8gb3V0cHV0IHNjcmlwdCB0YWJsZVxuIik7CisJCXJldHVybiAxOworCX0KKworCS8qCisJICogTm90aGluZyB1c2VmdWwgaGFzIGJlZW4gaW4gYW55IG9mIHRoZSBwcmUtMi4wIHRhYmxlcyBJJ3ZlIHNlZW4sCisJICogc28gdW50aWwgdGhleSBhcmUsIHdlIHJlYWxseSBkb24ndCBuZWVkIHRvIGNhcmUuCisJICovCisJaWYgKHRhYmxlWzBdIDwgMHgyMCkKKwkJcmV0dXJuIDE7CisKKwlpZiAodGFibGVbMF0gIT0gMHgyMCAmJiB0YWJsZVswXSAhPSAweDIxKSB7CisJCU5WX0VSUk9SKGRldiwgIk91dHB1dCBzY3JpcHQgdGFibGUgdmVyc2lvbiAweCUwMnggdW5rbm93blxuIiwKKwkJCSB0YWJsZVswXSk7CisJCXJldHVybiAxOworCX0KKworCS8qCisJICogVGhlIG91dHB1dCBzY3JpcHQgdGFibGVzIGRlc2NyaWJpbmcgYSBwYXJ0aWN1bGFyIG91dHB1dCB0eXBlCisJICogbG9vayBhcyBmb2xsb3dzOgorCSAqCisJICogb2Zmc2V0ICsgMCAgICgzMiBiaXRzKTogb3V0cHV0IHRoaXMgdGFibGUgbWF0Y2hlcyAoaGFzaCBvZiBEQ0IpCisJICogb2Zmc2V0ICsgNCAgICggOCBiaXRzKTogdW5rbm93bgorCSAqIG9mZnNldCArIDUgICAoIDggYml0cyk6IG51bWJlciBvZiBjb25maWd1cmF0aW9ucworCSAqIG9mZnNldCArIDYgICAoMTYgYml0cyk6IHBvaW50ZXIgdG8gc29tZSBzY3JpcHQKKwkgKiBvZmZzZXQgKyA4ICAgKDE2IGJpdHMpOiBwb2ludGVyIHRvIHNvbWUgc2NyaXB0CisJICoKKwkgKiBoZWFkZXJsZW4gPT0gMTAKKwkgKiBvZmZzZXQgKyAxMCAgICAgICAgICAgOiBjb25maWd1cmF0aW9uIDAKKwkgKgorCSAqIGhlYWRlcmxlbiA9PSAxMgorCSAqIG9mZnNldCArIDEwICAgICAgICAgICA6IHBvaW50ZXIgdG8gc29tZSBzY3JpcHQKKwkgKiBvZmZzZXQgKyAxMiAgICAgICAgICAgOiBjb25maWd1cmF0aW9uIDAKKwkgKgorCSAqIEVhY2ggY29uZmlnIGVudHJ5IGlzIGFzIGZvbGxvd3M6CisJICoKKwkgKiBvZmZzZXQgKyAwICAgKDE2IGJpdHMpOiB1bmtub3duLCBhc3N1bWVkIHRvIGJlIGEgbWF0Y2ggdmFsdWUKKwkgKiBvZmZzZXQgKyAyICAgKDE2IGJpdHMpOiBwb2ludGVyIHRvIHNjcmlwdCB0YWJsZSAoY2xvY2sgc2V0PykKKwkgKiBvZmZzZXQgKyA0ICAgKDE2IGJpdHMpOiBwb2ludGVyIHRvIHNjcmlwdCB0YWJsZSAocmVzZXQ/KQorCSAqCisJICogVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSBjb3VudCB2YWx1ZSB0byBzYXkgaG93IG1hbnkKKwkgKiBlbnRyaWVzIGV4aXN0IGluIGVhY2ggc2NyaXB0IHRhYmxlLCBpbnN0ZWFkLCBhIDAgdmFsdWUgaW4KKwkgKiB0aGUgZmlyc3QgMTYtYml0IHdvcmQgc2VlbXMgdG8gaW5kaWNhdGUgYm90aCB0aGUgZW5kIG9mIHRoZQorCSAqIGxpc3QgYW5kIHRoZSBkZWZhdWx0IGVudHJ5LiAgVGhlIHNlY29uZCAxNi1iaXQgd29yZCBpbiB0aGUKKwkgKiBzY3JpcHQgdGFibGVzIGlzIGEgcG9pbnRlciB0byB0aGUgc2NyaXB0IHRvIGV4ZWN1dGUuCisJICovCisKKwlOVl9ERUJVRyhkZXYsICJTZWFyY2hpbmcgZm9yIG91dHB1dCBlbnRyeSBmb3IgJWQgJWQgJWRcbiIsCisJCQlkY2JlbnQtPnR5cGUsIGRjYmVudC0+bG9jYXRpb24sIGRjYmVudC0+b3IpOworCW90YWJsZSA9IGJpb3Nfb3V0cHV0X2NvbmZpZ19tYXRjaChkZXYsIGRjYmVudCwgdGFibGVbMV0gKworCQkJCQkgIGJpb3MtPmRpc3BsYXkuc2NyaXB0X3RhYmxlX3B0ciwKKwkJCQkJICB0YWJsZVsyXSwgdGFibGVbM10pOworCWlmICghb3RhYmxlKSB7CisJCU5WX0VSUk9SKGRldiwgIkNvdWxkbid0IGZpbmQgbWF0Y2hpbmcgb3V0cHV0IHNjcmlwdCB0YWJsZVxuIik7CisJCXJldHVybiAxOworCX0KKworCWlmIChweGNsayA8IC0yIHx8IHB4Y2xrID4gMCkgeworCQkvKiBUcnkgdG8gZmluZCBtYXRjaGluZyBzY3JpcHQgdGFibGUgZW50cnkgKi8KKwkJZm9yIChpID0gMDsgaSA8IG90YWJsZVs1XTsgaSsrKSB7CisJCQlpZiAoUk9NMTYob3RhYmxlW3RhYmxlWzRdICsgaSo2XSkgPT0gc3ViKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGkgPT0gb3RhYmxlWzVdKSB7CisJCQlOVl9FUlJPUihkZXYsICJUYWJsZSAweCUwNHggbm90IGZvdW5kIGZvciAlZC8lZCwgIgorCQkJCSAgICAgICJ1c2luZyBmaXJzdFxuIiwKKwkJCQkgc3ViLCBkY2JlbnQtPnR5cGUsIGRjYmVudC0+b3IpOworCQkJaSA9IDA7CisJCX0KKwl9CisKKwliaW9zLT5kaXNwbGF5Lm91dHB1dCA9IGRjYmVudDsKKworCWlmIChweGNsayA9PSAwKSB7CisJCXNjcmlwdCA9IFJPTTE2KG90YWJsZVs2XSk7CisJCWlmICghc2NyaXB0KSB7CisJCQlOVl9ERUJVRyhkZXYsICJvdXRwdXQgc2NyaXB0IDAgbm90IGZvdW5kXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJTlZfVFJBQ0UoZGV2LCAiMHglMDRYOiBwYXJzaW5nIG91dHB1dCBzY3JpcHQgMFxuIiwgc2NyaXB0KTsKKwkJcGFyc2VfaW5pdF90YWJsZShiaW9zLCBzY3JpcHQsICZpZXhlYyk7CisJfSBlbHNlCisJaWYgKHB4Y2xrID09IC0xKSB7CisJCXNjcmlwdCA9IFJPTTE2KG90YWJsZVs4XSk7CisJCWlmICghc2NyaXB0KSB7CisJCQlOVl9ERUJVRyhkZXYsICJvdXRwdXQgc2NyaXB0IDEgbm90IGZvdW5kXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJTlZfVFJBQ0UoZGV2LCAiMHglMDRYOiBwYXJzaW5nIG91dHB1dCBzY3JpcHQgMVxuIiwgc2NyaXB0KTsKKwkJcGFyc2VfaW5pdF90YWJsZShiaW9zLCBzY3JpcHQsICZpZXhlYyk7CisJfSBlbHNlCisJaWYgKHB4Y2xrID09IC0yKSB7CisJCWlmICh0YWJsZVs0XSA+PSAxMikKKwkJCXNjcmlwdCA9IFJPTTE2KG90YWJsZVsxMF0pOworCQllbHNlCisJCQlzY3JpcHQgPSAwOworCQlpZiAoIXNjcmlwdCkgeworCQkJTlZfREVCVUcoZGV2LCAib3V0cHV0IHNjcmlwdCAyIG5vdCBmb3VuZFxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCU5WX1RSQUNFKGRldiwgIjB4JTA0WDogcGFyc2luZyBvdXRwdXQgc2NyaXB0IDJcbiIsIHNjcmlwdCk7CisJCXBhcnNlX2luaXRfdGFibGUoYmlvcywgc2NyaXB0LCAmaWV4ZWMpOworCX0gZWxzZQorCWlmIChweGNsayA+IDApIHsKKwkJc2NyaXB0ID0gUk9NMTYob3RhYmxlW3RhYmxlWzRdICsgaSo2ICsgMl0pOworCQlpZiAoc2NyaXB0KQorCQkJc2NyaXB0ID0gY2xrY21wdGFibGUoYmlvcywgc2NyaXB0LCBweGNsayk7CisJCWlmICghc2NyaXB0KSB7CisJCQlOVl9FUlJPUihkZXYsICJjbG9jayBzY3JpcHQgMCBub3QgZm91bmRcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlOVl9UUkFDRShkZXYsICIweCUwNFg6IHBhcnNpbmcgY2xvY2sgc2NyaXB0IDBcbiIsIHNjcmlwdCk7CisJCXBhcnNlX2luaXRfdGFibGUoYmlvcywgc2NyaXB0LCAmaWV4ZWMpOworCX0gZWxzZQorCWlmIChweGNsayA8IDApIHsKKwkJc2NyaXB0ID0gUk9NMTYob3RhYmxlW3RhYmxlWzRdICsgaSo2ICsgNF0pOworCQlpZiAoc2NyaXB0KQorCQkJc2NyaXB0ID0gY2xrY21wdGFibGUoYmlvcywgc2NyaXB0LCAtcHhjbGspOworCQlpZiAoIXNjcmlwdCkgeworCQkJTlZfREVCVUcoZGV2LCAiY2xvY2sgc2NyaXB0IDEgbm90IGZvdW5kXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJTlZfVFJBQ0UoZGV2LCAiMHglMDRYOiBwYXJzaW5nIGNsb2NrIHNjcmlwdCAxXG4iLCBzY3JpcHQpOworCQlwYXJzZV9pbml0X3RhYmxlKGJpb3MsIHNjcmlwdCwgJmlleGVjKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgcnVuX3RtZHNfdGFibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9lbnRyeSAqZGNiZW50LCBpbnQgaGVhZCwgaW50IHB4Y2xrKQoreworCS8qCisJICogdGhlIHB4Y2xrIHBhcmFtZXRlciBpcyBpbiBrSHoKKwkgKgorCSAqIFRoaXMgcnVucyB0aGUgVE1EUyByZWdzIHNldHRpbmcgY29kZSBmb3VuZCBvbiBCSVQgYmlvcyBjYXJkcworCSAqCisJICogRm9yIGZmcyhvcikgPT0gMSB1c2UgdGhlIGZpcnN0IHRhYmxlLCBmb3IgZmZzKG9yKSA9PSAyIGFuZAorCSAqIGZmcyhvcikgPT0gMywgdXNlIHRoZSBzZWNvbmQuCisJICovCisKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudmJpb3MgKmJpb3MgPSAmZGV2X3ByaXYtPlZCSU9TOworCWludCBjdiA9IGJpb3MtPnB1Yi5jaGlwX3ZlcnNpb247CisJdWludDE2X3QgY2xrdGFibGUgPSAwLCBzY3JpcHRwdHI7CisJdWludDMyX3Qgc2VsX2Nsa19iaW5kaW5nLCBzZWxfY2xrOworCisJLyogcHJlLW52MTcgb2ZmLWNoaXAgdG1kcyB1c2VzIHNjcmlwdHMsIHBvc3QgbnYxNyBkb2Vzbid0ICovCisJaWYgKGN2ID49IDB4MTcgJiYgY3YgIT0gMHgxYSAmJiBjdiAhPSAweDIwICYmCisJICAgIGRjYmVudC0+bG9jYXRpb24gIT0gRENCX0xPQ19PTl9DSElQKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoZmZzKGRjYmVudC0+b3IpKSB7CisJY2FzZSAxOgorCQljbGt0YWJsZSA9IGJpb3MtPnRtZHMub3V0cHV0MF9zY3JpcHRfcHRyOworCQlicmVhazsKKwljYXNlIDI6CisJY2FzZSAzOgorCQljbGt0YWJsZSA9IGJpb3MtPnRtZHMub3V0cHV0MV9zY3JpcHRfcHRyOworCQlicmVhazsKKwl9CisKKwlpZiAoIWNsa3RhYmxlKSB7CisJCU5WX0VSUk9SKGRldiwgIlBpeGVsIGNsb2NrIGNvbXBhcmlzb24gdGFibGUgbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc2NyaXB0cHRyID0gY2xrY21wdGFibGUoYmlvcywgY2xrdGFibGUsIHB4Y2xrKTsKKworCWlmICghc2NyaXB0cHRyKSB7CisJCU5WX0VSUk9SKGRldiwgIlRNRFMgb3V0cHV0IGluaXQgc2NyaXB0IG5vdCBmb3VuZFxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCS8qIGRvbid0IGxldCBzY3JpcHQgY2hhbmdlIHBsbC0+aGVhZCBiaW5kaW5nICovCisJc2VsX2Nsa19iaW5kaW5nID0gYmlvc19yZDMyKGJpb3MsIE5WX1BSQU1EQUNfU0VMX0NMSykgJiAweDUwMDAwOworCXJ1bl9kaWdpdGFsX29wX3NjcmlwdChkZXYsIHNjcmlwdHB0ciwgZGNiZW50LCBoZWFkLCBweGNsayA+PSAxNjUwMDApOworCXNlbF9jbGsgPSBOVlJlYWRSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDX1NFTF9DTEspICYgfjB4NTAwMDA7CisJTlZXcml0ZVJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfU0VMX0NMSywgc2VsX2NsayB8IHNlbF9jbGtfYmluZGluZyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGdldF9wbGxfbGltaXRzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IGxpbWl0X21hdGNoLCBzdHJ1Y3QgcGxsX2xpbXMgKnBsbF9saW0pCit7CisJLyoKKwkgKiBQTEwgbGltaXRzIHRhYmxlCisJICoKKwkgKiBWZXJzaW9uIDB4MTA6IE5WMzAsIE5WMzEKKwkgKiBPbmUgYnl0ZSBoZWFkZXIgKHZlcnNpb24pLCBvbmUgcmVjb3JkIG9mIDI0IGJ5dGVzCisJICogVmVyc2lvbiAweDExOiBOVjM2IC0gTm90IGltcGxlbWVudGVkCisJICogU2VlbXMgdG8gaGF2ZSBzYW1lIHJlY29yZCBzdHlsZSBhcyAweDEwLCBidXQgMyByZWNvcmRzIHJhdGhlciB0aGFuIDEKKwkgKiBWZXJzaW9uIDB4MjA6IEZvdW5kIG9uIEdlZm9yY2UgNiBjYXJkcworCSAqIFRyaXZpYWwgNCBieXRlIEJJVCBoZWFkZXIuIDMxICgweDFmKSBieXRlIHJlY29yZCBsZW5ndGgKKwkgKiBWZXJzaW9uIDB4MjE6IEZvdW5kIG9uIEdlZm9yY2UgNywgOCBhbmQgc29tZSBHZWZvcmNlIDYgY2FyZHMKKwkgKiA1IGJ5dGUgaGVhZGVyLCBmaWZ0aCBieXRlIG9mIHVua25vd24gcHVycG9zZS4gMzUgKDB4MjMpIGJ5dGUgcmVjb3JkCisJICogbGVuZ3RoIGluIGdlbmVyYWwsIHNvbWUgKGludGVncmF0ZWQpIGhhdmUgYW4gZXh0cmEgY29uZmlndXJhdGlvbiBieXRlCisJICogVmVyc2lvbiAweDMwOiBGb3VuZCBvbiBHZWZvcmNlIDgsIHNlcGFyYXRlcyB0aGUgcmVnaXN0ZXIgbWFwcGluZworCSAqIGZyb20gdGhlIGxpbWl0cyB0YWJsZXMuCisJICovCisKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudmJpb3MgKmJpb3MgPSAmZGV2X3ByaXYtPlZCSU9TOworCWludCBjdiA9IGJpb3MtPnB1Yi5jaGlwX3ZlcnNpb24sIHBsbGluZGV4ID0gMDsKKwl1aW50OF90IHBsbF9saW1fdmVyID0gMCwgaGVhZGVybGVuID0gMCwgcmVjb3JkbGVuID0gMCwgZW50cmllcyA9IDA7CisJdWludDMyX3QgY3J5c3RhbF9zdHJhcF9tYXNrLCBjcnlzdGFsX3N0cmFwczsKKworCWlmICghYmlvcy0+cGxsX2xpbWl0X3RibF9wdHIpIHsKKwkJaWYgKGN2ID09IDB4MzAgfHwgY3YgPT0gMHgzMSB8fCBjdiA9PSAweDM1IHx8IGN2ID09IDB4MzYgfHwKKwkJICAgIGN2ID49IDB4NDApIHsKKwkJCU5WX0VSUk9SKGRldiwgIlBvaW50ZXIgdG8gUExMIGxpbWl0cyB0YWJsZSBpbnZhbGlkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlCisJCXBsbF9saW1fdmVyID0gYmlvcy0+ZGF0YVtiaW9zLT5wbGxfbGltaXRfdGJsX3B0cl07CisKKwljcnlzdGFsX3N0cmFwX21hc2sgPSAxIDw8IDY7CisJLyogb3BlbiBjb2RlZCBkZXYtPnR3b0hlYWRzIHRlc3QgKi8KKwlpZiAoY3YgPiAweDEwICYmIGN2ICE9IDB4MTUgJiYgY3YgIT0gMHgxYSAmJiBjdiAhPSAweDIwKQorCQljcnlzdGFsX3N0cmFwX21hc2sgfD0gMSA8PCAyMjsKKwljcnlzdGFsX3N0cmFwcyA9IG52UmVhZEVYVERFVihkZXYsIE5WX1BFWFRERVZfQk9PVF8wKSAmCisJCQkJCQkJY3J5c3RhbF9zdHJhcF9tYXNrOworCisJc3dpdGNoIChwbGxfbGltX3ZlcikgeworCS8qCisJICogV2UgdXNlIHZlcnNpb24gMCB0byBpbmRpY2F0ZSBhIHByZSBsaW1pdCB0YWJsZSBiaW9zIChzaW5nbGUgc3RhZ2UKKwkgKiBwbGwpIGFuZCBsb2FkIHRoZSBoYXJkIGNvZGVkIGxpbWl0cyBpbnN0ZWFkLgorCSAqLworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSAweDEwOgorCWNhc2UgMHgxMToKKwkJLyoKKwkJICogU3RyaWN0bHkgdjB4MTEgaGFzIDMgZW50cmllcywgYnV0IHRoZSBsYXN0IHR3byBkb24ndCBzZWVtCisJCSAqIHRvIGdldCB1c2VkLgorCQkgKi8KKwkJaGVhZGVybGVuID0gMTsKKwkJcmVjb3JkbGVuID0gMHgxODsKKwkJZW50cmllcyA9IDE7CisJCXBsbGluZGV4ID0gMDsKKwkJYnJlYWs7CisJY2FzZSAweDIwOgorCWNhc2UgMHgyMToKKwljYXNlIDB4MzA6CisJY2FzZSAweDQwOgorCQloZWFkZXJsZW4gPSBiaW9zLT5kYXRhW2Jpb3MtPnBsbF9saW1pdF90YmxfcHRyICsgMV07CisJCXJlY29yZGxlbiA9IGJpb3MtPmRhdGFbYmlvcy0+cGxsX2xpbWl0X3RibF9wdHIgKyAyXTsKKwkJZW50cmllcyA9IGJpb3MtPmRhdGFbYmlvcy0+cGxsX2xpbWl0X3RibF9wdHIgKyAzXTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTlZfRVJST1IoZGV2LCAiUExMIGxpbWl0cyB0YWJsZSByZXZpc2lvbiAweCVYIG5vdCBjdXJyZW50bHkgIgorCQkJCSJzdXBwb3J0ZWRcbiIsIHBsbF9saW1fdmVyKTsKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCisJLyogaW5pdGlhbGl6ZSBhbGwgbWVtYmVycyB0byB6ZXJvICovCisJbWVtc2V0KHBsbF9saW0sIDAsIHNpemVvZihzdHJ1Y3QgcGxsX2xpbXMpKTsKKworCWlmIChwbGxfbGltX3ZlciA9PSAweDEwIHx8IHBsbF9saW1fdmVyID09IDB4MTEpIHsKKwkJdWludDhfdCAqcGxsX3JlYyA9ICZiaW9zLT5kYXRhW2Jpb3MtPnBsbF9saW1pdF90YmxfcHRyICsgaGVhZGVybGVuICsgcmVjb3JkbGVuICogcGxsaW5kZXhdOworCisJCXBsbF9saW0tPnZjbzEubWluZnJlcSA9IFJPTTMyKHBsbF9yZWNbMF0pOworCQlwbGxfbGltLT52Y28xLm1heGZyZXEgPSBST00zMihwbGxfcmVjWzRdKTsKKwkJcGxsX2xpbS0+dmNvMi5taW5mcmVxID0gUk9NMzIocGxsX3JlY1s4XSk7CisJCXBsbF9saW0tPnZjbzIubWF4ZnJlcSA9IFJPTTMyKHBsbF9yZWNbMTJdKTsKKwkJcGxsX2xpbS0+dmNvMS5taW5faW5wdXRmcmVxID0gUk9NMzIocGxsX3JlY1sxNl0pOworCQlwbGxfbGltLT52Y28yLm1pbl9pbnB1dGZyZXEgPSBST00zMihwbGxfcmVjWzIwXSk7CisJCXBsbF9saW0tPnZjbzEubWF4X2lucHV0ZnJlcSA9IHBsbF9saW0tPnZjbzIubWF4X2lucHV0ZnJlcSA9IElOVF9NQVg7CisKKwkJLyogdGhlc2UgdmFsdWVzIHRha2VuIGZyb20gbnYzMC8zMS8zNiAqLworCQlwbGxfbGltLT52Y28xLm1pbl9uID0gMHgxOworCQlpZiAoY3YgPT0gMHgzNikKKwkJCXBsbF9saW0tPnZjbzEubWluX24gPSAweDU7CisJCXBsbF9saW0tPnZjbzEubWF4X24gPSAweGZmOworCQlwbGxfbGltLT52Y28xLm1pbl9tID0gMHgxOworCQlwbGxfbGltLT52Y28xLm1heF9tID0gMHhkOworCQlwbGxfbGltLT52Y28yLm1pbl9uID0gMHg0OworCQkvKgorCQkgKiBPbiBudjMwLCAzMSwgMzYgKGkuZS4gYWxsIGNhcmRzIHdpdGggdHdvIHN0YWdlIFBMTHMgd2l0aCB0aGlzCisJCSAqIHRhYmxlIHZlcnNpb24gKGFwYXJ0IGZyb20gbnYzNSkpLCBOMiBpcyBjb21wYXJlZCB0bworCQkgKiBtYXhOMiAoMHg0NikgYW5kIDEwICogbWF4TTIgKDB4NCksIHNvIHNldCBtYXhOMiB0byAweDI4IGFuZAorCQkgKiBzYXZlIGEgY29tcGFyaXNvbgorCQkgKi8KKwkJcGxsX2xpbS0+dmNvMi5tYXhfbiA9IDB4Mjg7CisJCWlmIChjdiA9PSAweDMwIHx8IGN2ID09IDB4MzUpCisJCQkvKiBvbmx5IDUgYml0cyBhdmFpbGFibGUgZm9yIE4yIG9uIG52MzAvMzUgKi8KKwkJCXBsbF9saW0tPnZjbzIubWF4X24gPSAweDFmOworCQlwbGxfbGltLT52Y28yLm1pbl9tID0gMHgxOworCQlwbGxfbGltLT52Y28yLm1heF9tID0gMHg0OworCQlwbGxfbGltLT5tYXhfbG9nMnAgPSAweDc7CisJCXBsbF9saW0tPm1heF91c2FibGVfbG9nMnAgPSAweDY7CisJfSBlbHNlIGlmIChwbGxfbGltX3ZlciA9PSAweDIwIHx8IHBsbF9saW1fdmVyID09IDB4MjEpIHsKKwkJdWludDE2X3QgcGxsb2ZmcyA9IGJpb3MtPnBsbF9saW1pdF90YmxfcHRyICsgaGVhZGVybGVuOworCQl1aW50MzJfdCByZWcgPSAwOyAvKiBkZWZhdWx0IG1hdGNoICovCisJCXVpbnQ4X3QgKnBsbF9yZWM7CisJCWludCBpOworCisJCS8qCisJCSAqIEZpcnN0IGVudHJ5IGlzIGRlZmF1bHQgbWF0Y2gsIGlmIG5vdGhpbmcgYmV0dGVyLiB3YXJuIGlmCisJCSAqIHJlZyBmaWVsZCBub256ZXJvCisJCSAqLworCQlpZiAoUk9NMzIoYmlvcy0+ZGF0YVtwbGxvZmZzXSkpCisJCQlOVl9XQVJOKGRldiwgIkRlZmF1bHQgUExMIGxpbWl0IGVudHJ5IGhhcyBub24temVybyAiCisJCQkJICAgICAgICJyZWdpc3RlciBmaWVsZFxuIik7CisKKwkJaWYgKGxpbWl0X21hdGNoID4gTUFYX1BMTF9UWVBFUykKKwkJCS8qIHdlJ3ZlIGJlZW4gcGFzc2VkIGEgcmVnIGFzIHRoZSBtYXRjaCAqLworCQkJcmVnID0gbGltaXRfbWF0Y2g7CisJCWVsc2UgLyogbGltaXQgbWF0Y2ggaXMgYSBwbGwgdHlwZSAqLworCQkJZm9yIChpID0gMTsgaSA8IGVudHJpZXMgJiYgIXJlZzsgaSsrKSB7CisJCQkJdWludDMyX3QgY21wcmVnID0gUk9NMzIoYmlvcy0+ZGF0YVtwbGxvZmZzICsgcmVjb3JkbGVuICogaV0pOworCisJCQkJaWYgKGxpbWl0X21hdGNoID09IE5WUExMICYmCisJCQkJICAgIChjbXByZWcgPT0gTlZfUFJBTURBQ19OVlBMTF9DT0VGRiB8fCBjbXByZWcgPT0gMHg0MDAwKSkKKwkJCQkJcmVnID0gY21wcmVnOworCQkJCWlmIChsaW1pdF9tYXRjaCA9PSBNUExMICYmCisJCQkJICAgIChjbXByZWcgPT0gTlZfUFJBTURBQ19NUExMX0NPRUZGIHx8IGNtcHJlZyA9PSAweDQwMjApKQorCQkJCQlyZWcgPSBjbXByZWc7CisJCQkJaWYgKGxpbWl0X21hdGNoID09IFZQTEwxICYmCisJCQkJICAgIChjbXByZWcgPT0gTlZfUFJBTURBQ19WUExMX0NPRUZGIHx8IGNtcHJlZyA9PSAweDQwMTApKQorCQkJCQlyZWcgPSBjbXByZWc7CisJCQkJaWYgKGxpbWl0X21hdGNoID09IFZQTEwyICYmCisJCQkJICAgIChjbXByZWcgPT0gTlZfUkFNREFDX1ZQTEwyIHx8IGNtcHJlZyA9PSAweDQwMTgpKQorCQkJCQlyZWcgPSBjbXByZWc7CisJCQl9CisKKwkJZm9yIChpID0gMTsgaSA8IGVudHJpZXM7IGkrKykKKwkJCWlmIChST00zMihiaW9zLT5kYXRhW3BsbG9mZnMgKyByZWNvcmRsZW4gKiBpXSkgPT0gcmVnKSB7CisJCQkJcGxsaW5kZXggPSBpOworCQkJCWJyZWFrOworCQkJfQorCisJCXBsbF9yZWMgPSAmYmlvcy0+ZGF0YVtwbGxvZmZzICsgcmVjb3JkbGVuICogcGxsaW5kZXhdOworCisJCUJJT1NMT0coYmlvcywgIkxvYWRpbmcgUExMIGxpbWl0cyBmb3IgcmVnIDB4JTA4eFxuIiwKKwkJCXBsbGluZGV4ID8gcmVnIDogMCk7CisKKwkJLyoKKwkJICogRnJlcXVlbmNpZXMgYXJlIHN0b3JlZCBpbiB0YWJsZXMgaW4gTUh6LCBrSHogYXJlIG1vcmUKKwkJICogdXNlZnVsLCBzbyB3ZSBjb252ZXJ0LgorCQkgKi8KKworCQkvKiBXaGF0IG91dHB1dCBmcmVxdWVuY2llcyBjYW4gZWFjaCBWQ08gZ2VuZXJhdGU/ICovCisJCXBsbF9saW0tPnZjbzEubWluZnJlcSA9IFJPTTE2KHBsbF9yZWNbNF0pICogMTAwMDsKKwkJcGxsX2xpbS0+dmNvMS5tYXhmcmVxID0gUk9NMTYocGxsX3JlY1s2XSkgKiAxMDAwOworCQlwbGxfbGltLT52Y28yLm1pbmZyZXEgPSBST00xNihwbGxfcmVjWzhdKSAqIDEwMDA7CisJCXBsbF9saW0tPnZjbzIubWF4ZnJlcSA9IFJPTTE2KHBsbF9yZWNbMTBdKSAqIDEwMDA7CisKKwkJLyogV2hhdCBpbnB1dCBmcmVxdWVuY2llcyB0aGV5IGFjY2VwdCAocGFzdCB0aGUgbS1kaXZpZGVyKT8gKi8KKwkJcGxsX2xpbS0+dmNvMS5taW5faW5wdXRmcmVxID0gUk9NMTYocGxsX3JlY1sxMl0pICogMTAwMDsKKwkJcGxsX2xpbS0+dmNvMi5taW5faW5wdXRmcmVxID0gUk9NMTYocGxsX3JlY1sxNF0pICogMTAwMDsKKwkJcGxsX2xpbS0+dmNvMS5tYXhfaW5wdXRmcmVxID0gUk9NMTYocGxsX3JlY1sxNl0pICogMTAwMDsKKwkJcGxsX2xpbS0+dmNvMi5tYXhfaW5wdXRmcmVxID0gUk9NMTYocGxsX3JlY1sxOF0pICogMTAwMDsKKworCQkvKiBXaGF0IHZhbHVlcyBhcmUgYWNjZXB0ZWQgYXMgbXVsdGlwbGllciBhbmQgZGl2aWRlcj8gKi8KKwkJcGxsX2xpbS0+dmNvMS5taW5fbiA9IHBsbF9yZWNbMjBdOworCQlwbGxfbGltLT52Y28xLm1heF9uID0gcGxsX3JlY1syMV07CisJCXBsbF9saW0tPnZjbzEubWluX20gPSBwbGxfcmVjWzIyXTsKKwkJcGxsX2xpbS0+dmNvMS5tYXhfbSA9IHBsbF9yZWNbMjNdOworCQlwbGxfbGltLT52Y28yLm1pbl9uID0gcGxsX3JlY1syNF07CisJCXBsbF9saW0tPnZjbzIubWF4X24gPSBwbGxfcmVjWzI1XTsKKwkJcGxsX2xpbS0+dmNvMi5taW5fbSA9IHBsbF9yZWNbMjZdOworCQlwbGxfbGltLT52Y28yLm1heF9tID0gcGxsX3JlY1syN107CisKKwkJcGxsX2xpbS0+bWF4X3VzYWJsZV9sb2cycCA9IHBsbF9saW0tPm1heF9sb2cycCA9IHBsbF9yZWNbMjldOworCQlpZiAocGxsX2xpbS0+bWF4X2xvZzJwID4gMHg3KQorCQkJLyogcGxsIGRlY29kaW5nIGluIG52X2h3LmMgYXNzdW1lcyBuZXZlciA+IDcgKi8KKwkJCU5WX1dBUk4oZGV2LCAiTWF4IGxvZzIgUCB2YWx1ZSBncmVhdGVyIHRoYW4gNyAoJWQpXG4iLAorCQkJCXBsbF9saW0tPm1heF9sb2cycCk7CisJCWlmIChjdiA8IDB4NjApCisJCQlwbGxfbGltLT5tYXhfdXNhYmxlX2xvZzJwID0gMHg2OworCQlwbGxfbGltLT5sb2cycF9iaWFzID0gcGxsX3JlY1szMF07CisKKwkJaWYgKHJlY29yZGxlbiA+IDB4MjIpCisJCQlwbGxfbGltLT5yZWZjbGsgPSBST00zMihwbGxfcmVjWzMxXSk7CisKKwkJaWYgKHJlY29yZGxlbiA+IDB4MjMgJiYgcGxsX3JlY1szNV0pCisJCQlOVl9XQVJOKGRldiwKKwkJCQkiQml0cyBzZXQgaW4gUExMIGNvbmZpZ3VyYXRpb24gYnl0ZSAoJXgpXG4iLAorCQkJCXBsbF9yZWNbMzVdKTsKKworCQkvKiBDNTEgc3BlY2lhbCBub3Qgc2VlbiBlbHNld2hlcmUgKi8KKwkJaWYgKGN2ID09IDB4NTEgJiYgIXBsbF9saW0tPnJlZmNsaykgeworCQkJdWludDMyX3Qgc2VsX2NsayA9IGJpb3NfcmQzMihiaW9zLCBOVl9QUkFNREFDX1NFTF9DTEspOworCisJCQlpZiAoKChsaW1pdF9tYXRjaCA9PSBOVl9QUkFNREFDX1ZQTExfQ09FRkYgfHwgbGltaXRfbWF0Y2ggPT0gVlBMTDEpICYmIHNlbF9jbGsgJiAweDIwKSB8fAorCQkJICAgICgobGltaXRfbWF0Y2ggPT0gTlZfUkFNREFDX1ZQTEwyIHx8IGxpbWl0X21hdGNoID09IFZQTEwyKSAmJiBzZWxfY2xrICYgMHg4MCkpIHsKKwkJCQlpZiAoYmlvc19pZHhwcnRfcmQoYmlvcywgTlZfQ0lPX0NSWF9fQ09MT1IsIE5WX0NJT19DUkVfQ0hJUF9JRF9JTkRFWCkgPCAweGEzKQorCQkJCQlwbGxfbGltLT5yZWZjbGsgPSAyMDAwMDA7CisJCQkJZWxzZQorCQkJCQlwbGxfbGltLT5yZWZjbGsgPSAyNTAwMDsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAocGxsX2xpbV92ZXIgPT0gMHgzMCkgeyAvKiB2ZXIgMHgzMCAqLworCQl1aW50OF90ICplbnRyeSA9ICZiaW9zLT5kYXRhW2Jpb3MtPnBsbF9saW1pdF90YmxfcHRyICsgaGVhZGVybGVuXTsKKwkJdWludDhfdCAqcmVjb3JkID0gTlVMTDsKKwkJaW50IGk7CisKKwkJQklPU0xPRyhiaW9zLCAiTG9hZGluZyBQTEwgbGltaXRzIGZvciByZWdpc3RlciAweCUwOHhcbiIsCisJCQlsaW1pdF9tYXRjaCk7CisKKwkJZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkrKywgZW50cnkgKz0gcmVjb3JkbGVuKSB7CisJCQlpZiAoUk9NMzIoZW50cnlbM10pID09IGxpbWl0X21hdGNoKSB7CisJCQkJcmVjb3JkID0gJmJpb3MtPmRhdGFbUk9NMTYoZW50cnlbMV0pXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmICghcmVjb3JkKSB7CisJCQlOVl9FUlJPUihkZXYsICJSZWdpc3RlciAweCUwOHggbm90IGZvdW5kIGluIFBMTCAiCisJCQkJICJsaW1pdHMgdGFibGUiLCBsaW1pdF9tYXRjaCk7CisJCQlyZXR1cm4gLUVOT0VOVDsKKwkJfQorCisJCXBsbF9saW0tPnZjbzEubWluZnJlcSA9IFJPTTE2KHJlY29yZFswXSkgKiAxMDAwOworCQlwbGxfbGltLT52Y28xLm1heGZyZXEgPSBST00xNihyZWNvcmRbMl0pICogMTAwMDsKKwkJcGxsX2xpbS0+dmNvMi5taW5mcmVxID0gUk9NMTYocmVjb3JkWzRdKSAqIDEwMDA7CisJCXBsbF9saW0tPnZjbzIubWF4ZnJlcSA9IFJPTTE2KHJlY29yZFs2XSkgKiAxMDAwOworCQlwbGxfbGltLT52Y28xLm1pbl9pbnB1dGZyZXEgPSBST00xNihyZWNvcmRbOF0pICogMTAwMDsKKwkJcGxsX2xpbS0+dmNvMi5taW5faW5wdXRmcmVxID0gUk9NMTYocmVjb3JkWzEwXSkgKiAxMDAwOworCQlwbGxfbGltLT52Y28xLm1heF9pbnB1dGZyZXEgPSBST00xNihyZWNvcmRbMTJdKSAqIDEwMDA7CisJCXBsbF9saW0tPnZjbzIubWF4X2lucHV0ZnJlcSA9IFJPTTE2KHJlY29yZFsxNF0pICogMTAwMDsKKwkJcGxsX2xpbS0+dmNvMS5taW5fbiA9IHJlY29yZFsxNl07CisJCXBsbF9saW0tPnZjbzEubWF4X24gPSByZWNvcmRbMTddOworCQlwbGxfbGltLT52Y28xLm1pbl9tID0gcmVjb3JkWzE4XTsKKwkJcGxsX2xpbS0+dmNvMS5tYXhfbSA9IHJlY29yZFsxOV07CisJCXBsbF9saW0tPnZjbzIubWluX24gPSByZWNvcmRbMjBdOworCQlwbGxfbGltLT52Y28yLm1heF9uID0gcmVjb3JkWzIxXTsKKwkJcGxsX2xpbS0+dmNvMi5taW5fbSA9IHJlY29yZFsyMl07CisJCXBsbF9saW0tPnZjbzIubWF4X20gPSByZWNvcmRbMjNdOworCQlwbGxfbGltLT5tYXhfdXNhYmxlX2xvZzJwID0gcGxsX2xpbS0+bWF4X2xvZzJwID0gcmVjb3JkWzI1XTsKKwkJcGxsX2xpbS0+bG9nMnBfYmlhcyA9IHJlY29yZFsyN107CisJCXBsbF9saW0tPnJlZmNsayA9IFJPTTMyKHJlY29yZFsyOF0pOworCX0gZWxzZSBpZiAocGxsX2xpbV92ZXIpIHsgLyogdmVyIDB4NDAgKi8KKwkJdWludDhfdCAqZW50cnkgPSAmYmlvcy0+ZGF0YVtiaW9zLT5wbGxfbGltaXRfdGJsX3B0ciArIGhlYWRlcmxlbl07CisJCXVpbnQ4X3QgKnJlY29yZCA9IE5VTEw7CisJCWludCBpOworCisJCUJJT1NMT0coYmlvcywgIkxvYWRpbmcgUExMIGxpbWl0cyBmb3IgcmVnaXN0ZXIgMHglMDh4XG4iLAorCQkJbGltaXRfbWF0Y2gpOworCisJCWZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyssIGVudHJ5ICs9IHJlY29yZGxlbikgeworCQkJaWYgKFJPTTMyKGVudHJ5WzNdKSA9PSBsaW1pdF9tYXRjaCkgeworCQkJCXJlY29yZCA9ICZiaW9zLT5kYXRhW1JPTTE2KGVudHJ5WzFdKV07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoIXJlY29yZCkgeworCQkJTlZfRVJST1IoZGV2LCAiUmVnaXN0ZXIgMHglMDh4IG5vdCBmb3VuZCBpbiBQTEwgIgorCQkJCSAibGltaXRzIHRhYmxlIiwgbGltaXRfbWF0Y2gpOworCQkJcmV0dXJuIC1FTk9FTlQ7CisJCX0KKworCQlwbGxfbGltLT52Y28xLm1pbmZyZXEgPSBST00xNihyZWNvcmRbMF0pICogMTAwMDsKKwkJcGxsX2xpbS0+dmNvMS5tYXhmcmVxID0gUk9NMTYocmVjb3JkWzJdKSAqIDEwMDA7CisJCXBsbF9saW0tPnZjbzEubWluX2lucHV0ZnJlcSA9IFJPTTE2KHJlY29yZFs0XSkgKiAxMDAwOworCQlwbGxfbGltLT52Y28xLm1heF9pbnB1dGZyZXEgPSBST00xNihyZWNvcmRbNl0pICogMTAwMDsKKwkJcGxsX2xpbS0+dmNvMS5taW5fbSA9IHJlY29yZFs4XTsKKwkJcGxsX2xpbS0+dmNvMS5tYXhfbSA9IHJlY29yZFs5XTsKKwkJcGxsX2xpbS0+dmNvMS5taW5fbiA9IHJlY29yZFsxMF07CisJCXBsbF9saW0tPnZjbzEubWF4X24gPSByZWNvcmRbMTFdOworCQlwbGxfbGltLT5taW5fcCA9IHJlY29yZFsxMl07CisJCXBsbF9saW0tPm1heF9wID0gcmVjb3JkWzEzXTsKKwkJLyogd2hlcmUgZGlkIHRoaXMgZ28gdG8/PyAqLworCQlpZiAobGltaXRfbWF0Y2ggPT0gMHgwMDYxNDEwMCB8fCBsaW1pdF9tYXRjaCA9PSAweDAwNjE0OTAwKQorCQkJcGxsX2xpbS0+cmVmY2xrID0gMjcwMDA7CisJCWVsc2UKKwkJCXBsbF9saW0tPnJlZmNsayA9IDEwMDAwMDsKKwl9CisKKwkvKgorCSAqIEJ5IG5vdyBhbnkgdmFsaWQgbGltaXQgdGFibGUgb3VnaHQgdG8gaGF2ZSBzZXQgYSBtYXggZnJlcXVlbmN5IGZvcgorCSAqIHZjbzEsIHNvIGlmIGl0J3MgemVybyBpdCdzIGVpdGhlciBhIHByZSBsaW1pdCB0YWJsZSBiaW9zLCBvciBvbmUKKwkgKiB3aXRoIGFuIGVtcHR5IGxpbWl0IHRhYmxlIChzZWVuIG9uIG52MTgpCisJICovCisJaWYgKCFwbGxfbGltLT52Y28xLm1heGZyZXEpIHsKKwkJcGxsX2xpbS0+dmNvMS5taW5mcmVxID0gYmlvcy0+Zm1pbnZjbzsKKwkJcGxsX2xpbS0+dmNvMS5tYXhmcmVxID0gYmlvcy0+Zm1heHZjbzsKKwkJcGxsX2xpbS0+dmNvMS5taW5faW5wdXRmcmVxID0gMDsKKwkJcGxsX2xpbS0+dmNvMS5tYXhfaW5wdXRmcmVxID0gSU5UX01BWDsKKwkJcGxsX2xpbS0+dmNvMS5taW5fbiA9IDB4MTsKKwkJcGxsX2xpbS0+dmNvMS5tYXhfbiA9IDB4ZmY7CisJCXBsbF9saW0tPnZjbzEubWluX20gPSAweDE7CisJCWlmIChjcnlzdGFsX3N0cmFwcyA9PSAwKSB7CisJCQkvKiBudjA1IGRvZXMgdGhpcywgbnYxMSBkb2Vzbid0LCBudjEwIHVua25vd24gKi8KKwkJCWlmIChjdiA8IDB4MTEpCisJCQkJcGxsX2xpbS0+dmNvMS5taW5fbSA9IDB4NzsKKwkJCXBsbF9saW0tPnZjbzEubWF4X20gPSAweGQ7CisJCX0gZWxzZSB7CisJCQlpZiAoY3YgPCAweDExKQorCQkJCXBsbF9saW0tPnZjbzEubWluX20gPSAweDg7CisJCQlwbGxfbGltLT52Y28xLm1heF9tID0gMHhlOworCQl9CisJCWlmIChjdiA8IDB4MTcgfHwgY3YgPT0gMHgxYSB8fCBjdiA9PSAweDIwKQorCQkJcGxsX2xpbS0+bWF4X2xvZzJwID0gNDsKKwkJZWxzZQorCQkJcGxsX2xpbS0+bWF4X2xvZzJwID0gNTsKKwkJcGxsX2xpbS0+bWF4X3VzYWJsZV9sb2cycCA9IHBsbF9saW0tPm1heF9sb2cycDsKKwl9CisKKwlpZiAoIXBsbF9saW0tPnJlZmNsaykKKwkJc3dpdGNoIChjcnlzdGFsX3N0cmFwcykgeworCQljYXNlIDA6CisJCQlwbGxfbGltLT5yZWZjbGsgPSAxMzUwMDsKKwkJCWJyZWFrOworCQljYXNlICgxIDw8IDYpOgorCQkJcGxsX2xpbS0+cmVmY2xrID0gMTQzMTg7CisJCQlicmVhazsKKwkJY2FzZSAoMSA8PCAyMik6CisJCQlwbGxfbGltLT5yZWZjbGsgPSAyNzAwMDsKKwkJCWJyZWFrOworCQljYXNlICgxIDw8IDIyIHwgMSA8PCA2KToKKwkJCXBsbF9saW0tPnJlZmNsayA9IDI1MDAwOworCQkJYnJlYWs7CisJCX0KKworI2lmIDAgLyogZm9yIGVhc3kgZGVidWdnaW5nICovCisJRXJyb3JGKCJwbGwudmNvMS5taW5mcmVxOiAlZFxuIiwgcGxsX2xpbS0+dmNvMS5taW5mcmVxKTsKKwlFcnJvckYoInBsbC52Y28xLm1heGZyZXE6ICVkXG4iLCBwbGxfbGltLT52Y28xLm1heGZyZXEpOworCUVycm9yRigicGxsLnZjbzIubWluZnJlcTogJWRcbiIsIHBsbF9saW0tPnZjbzIubWluZnJlcSk7CisJRXJyb3JGKCJwbGwudmNvMi5tYXhmcmVxOiAlZFxuIiwgcGxsX2xpbS0+dmNvMi5tYXhmcmVxKTsKKworCUVycm9yRigicGxsLnZjbzEubWluX2lucHV0ZnJlcTogJWRcbiIsIHBsbF9saW0tPnZjbzEubWluX2lucHV0ZnJlcSk7CisJRXJyb3JGKCJwbGwudmNvMS5tYXhfaW5wdXRmcmVxOiAlZFxuIiwgcGxsX2xpbS0+dmNvMS5tYXhfaW5wdXRmcmVxKTsKKwlFcnJvckYoInBsbC52Y28yLm1pbl9pbnB1dGZyZXE6ICVkXG4iLCBwbGxfbGltLT52Y28yLm1pbl9pbnB1dGZyZXEpOworCUVycm9yRigicGxsLnZjbzIubWF4X2lucHV0ZnJlcTogJWRcbiIsIHBsbF9saW0tPnZjbzIubWF4X2lucHV0ZnJlcSk7CisKKwlFcnJvckYoInBsbC52Y28xLm1pbl9uOiAlZFxuIiwgcGxsX2xpbS0+dmNvMS5taW5fbik7CisJRXJyb3JGKCJwbGwudmNvMS5tYXhfbjogJWRcbiIsIHBsbF9saW0tPnZjbzEubWF4X24pOworCUVycm9yRigicGxsLnZjbzEubWluX206ICVkXG4iLCBwbGxfbGltLT52Y28xLm1pbl9tKTsKKwlFcnJvckYoInBsbC52Y28xLm1heF9tOiAlZFxuIiwgcGxsX2xpbS0+dmNvMS5tYXhfbSk7CisJRXJyb3JGKCJwbGwudmNvMi5taW5fbjogJWRcbiIsIHBsbF9saW0tPnZjbzIubWluX24pOworCUVycm9yRigicGxsLnZjbzIubWF4X246ICVkXG4iLCBwbGxfbGltLT52Y28yLm1heF9uKTsKKwlFcnJvckYoInBsbC52Y28yLm1pbl9tOiAlZFxuIiwgcGxsX2xpbS0+dmNvMi5taW5fbSk7CisJRXJyb3JGKCJwbGwudmNvMi5tYXhfbTogJWRcbiIsIHBsbF9saW0tPnZjbzIubWF4X20pOworCisJRXJyb3JGKCJwbGwubWF4X2xvZzJwOiAlZFxuIiwgcGxsX2xpbS0+bWF4X2xvZzJwKTsKKwlFcnJvckYoInBsbC5sb2cycF9iaWFzOiAlZFxuIiwgcGxsX2xpbS0+bG9nMnBfYmlhcyk7CisKKwlFcnJvckYoInBsbC5yZWZjbGs6ICVkXG4iLCBwbGxfbGltLT5yZWZjbGspOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfYmlvc192ZXJzaW9uKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IG9mZnNldCkKK3sKKwkvKgorCSAqIG9mZnNldCArIDAgICg4IGJpdHMpOiBNaWNybyB2ZXJzaW9uCisJICogb2Zmc2V0ICsgMSAgKDggYml0cyk6IE1pbm9yIHZlcnNpb24KKwkgKiBvZmZzZXQgKyAyICAoOCBiaXRzKTogQ2hpcCB2ZXJzaW9uCisJICogb2Zmc2V0ICsgMyAgKDggYml0cyk6IE1ham9yIHZlcnNpb24KKwkgKi8KKworCWJpb3MtPm1ham9yX3ZlcnNpb24gPSBiaW9zLT5kYXRhW29mZnNldCArIDNdOworCWJpb3MtPnB1Yi5jaGlwX3ZlcnNpb24gPSBiaW9zLT5kYXRhW29mZnNldCArIDJdOworCU5WX1RSQUNFKGRldiwgIkJpb3MgdmVyc2lvbiAlMDJ4LiUwMnguJTAyeC4lMDJ4XG4iLAorCQkgYmlvcy0+ZGF0YVtvZmZzZXQgKyAzXSwgYmlvcy0+ZGF0YVtvZmZzZXQgKyAyXSwKKwkJIGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV0sIGJpb3MtPmRhdGFbb2Zmc2V0XSk7Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX3NjcmlwdF90YWJsZV9wb2ludGVycyhzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQpCit7CisJLyoKKwkgKiBQYXJzZXMgdGhlIGluaXQgdGFibGUgc2VnbWVudCBmb3IgcG9pbnRlcnMgdXNlZCBpbiBzY3JpcHQgZXhlY3V0aW9uLgorCSAqCisJICogb2Zmc2V0ICsgMCAgKDE2IGJpdHMpOiBpbml0IHNjcmlwdCB0YWJsZXMgcG9pbnRlcgorCSAqIG9mZnNldCArIDIgICgxNiBiaXRzKTogbWFjcm8gaW5kZXggdGFibGUgcG9pbnRlcgorCSAqIG9mZnNldCArIDQgICgxNiBiaXRzKTogbWFjcm8gdGFibGUgcG9pbnRlcgorCSAqIG9mZnNldCArIDYgICgxNiBiaXRzKTogY29uZGl0aW9uIHRhYmxlIHBvaW50ZXIKKwkgKiBvZmZzZXQgKyA4ICAoMTYgYml0cyk6IGlvIGNvbmRpdGlvbiB0YWJsZSBwb2ludGVyCisJICogb2Zmc2V0ICsgMTAgKDE2IGJpdHMpOiBpbyBmbGFnIGNvbmRpdGlvbiB0YWJsZSBwb2ludGVyCisJICogb2Zmc2V0ICsgMTIgKDE2IGJpdHMpOiBpbml0IGZ1bmN0aW9uIHRhYmxlIHBvaW50ZXIKKwkgKi8KKworCWJpb3MtPmluaXRfc2NyaXB0X3RibHNfcHRyID0gUk9NMTYoYmlvcy0+ZGF0YVtvZmZzZXRdKTsKKwliaW9zLT5tYWNyb19pbmRleF90YmxfcHRyID0gUk9NMTYoYmlvcy0+ZGF0YVtvZmZzZXQgKyAyXSk7CisJYmlvcy0+bWFjcm9fdGJsX3B0ciA9IFJPTTE2KGJpb3MtPmRhdGFbb2Zmc2V0ICsgNF0pOworCWJpb3MtPmNvbmRpdGlvbl90YmxfcHRyID0gUk9NMTYoYmlvcy0+ZGF0YVtvZmZzZXQgKyA2XSk7CisJYmlvcy0+aW9fY29uZGl0aW9uX3RibF9wdHIgPSBST00xNihiaW9zLT5kYXRhW29mZnNldCArIDhdKTsKKwliaW9zLT5pb19mbGFnX2NvbmRpdGlvbl90YmxfcHRyID0gUk9NMTYoYmlvcy0+ZGF0YVtvZmZzZXQgKyAxMF0pOworCWJpb3MtPmluaXRfZnVuY3Rpb25fdGJsX3B0ciA9IFJPTTE2KGJpb3MtPmRhdGFbb2Zmc2V0ICsgMTJdKTsKK30KKworc3RhdGljIGludCBwYXJzZV9iaXRfQV90YmxfZW50cnkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG52YmlvcyAqYmlvcywgc3RydWN0IGJpdF9lbnRyeSAqYml0ZW50cnkpCit7CisJLyoKKwkgKiBQYXJzZXMgdGhlIGxvYWQgZGV0ZWN0IHZhbHVlcyBmb3IgZzgwIGNhcmRzLgorCSAqCisJICogb2Zmc2V0ICsgMCAoMTYgYml0cyk6IGxvYWR2YWwgdGFibGUgcG9pbnRlcgorCSAqLworCisJdWludDE2X3QgbG9hZF90YWJsZV9wdHI7CisJdWludDhfdCB2ZXJzaW9uLCBoZWFkZXJsZW4sIGVudHJ5bGVuLCBudW1fZW50cmllczsKKworCWlmIChiaXRlbnRyeS0+bGVuZ3RoICE9IDMpIHsKKwkJTlZfRVJST1IoZGV2LCAiRG8gbm90IHVuZGVyc3RhbmQgQklUIEEgdGFibGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlsb2FkX3RhYmxlX3B0ciA9IFJPTTE2KGJpb3MtPmRhdGFbYml0ZW50cnktPm9mZnNldF0pOworCisJaWYgKGxvYWRfdGFibGVfcHRyID09IDB4MCkgeworCQlOVl9FUlJPUihkZXYsICJQb2ludGVyIHRvIEJJVCBsb2FkdmFsIHRhYmxlIGludmFsaWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl2ZXJzaW9uID0gYmlvcy0+ZGF0YVtsb2FkX3RhYmxlX3B0cl07CisKKwlpZiAodmVyc2lvbiAhPSAweDEwKSB7CisJCU5WX0VSUk9SKGRldiwgIkJJVCBsb2FkdmFsIHRhYmxlIHZlcnNpb24gJWQuJWQgbm90IHN1cHBvcnRlZFxuIiwKKwkJCSB2ZXJzaW9uID4+IDQsIHZlcnNpb24gJiAweEYpOworCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisKKwloZWFkZXJsZW4gPSBiaW9zLT5kYXRhW2xvYWRfdGFibGVfcHRyICsgMV07CisJZW50cnlsZW4gPSBiaW9zLT5kYXRhW2xvYWRfdGFibGVfcHRyICsgMl07CisJbnVtX2VudHJpZXMgPSBiaW9zLT5kYXRhW2xvYWRfdGFibGVfcHRyICsgM107CisKKwlpZiAoaGVhZGVybGVuICE9IDQgfHwgZW50cnlsZW4gIT0gNCB8fCBudW1fZW50cmllcyAhPSAyKSB7CisJCU5WX0VSUk9SKGRldiwgIkRvIG5vdCB1bmRlcnN0YW5kIEJJVCBsb2FkdmFsIHRhYmxlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogRmlyc3QgZW50cnkgaXMgbm9ybWFsIGRhYywgMm5kIHR2LW91dCBwZXJoYXBzPyAqLworCWJpb3MtPnB1Yi5kYWN0ZXN0dmFsID0gUk9NMzIoYmlvcy0+ZGF0YVtsb2FkX3RhYmxlX3B0ciArIGhlYWRlcmxlbl0pICYgMHgzZmY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9iaXRfQ190YmxfZW50cnkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG52YmlvcyAqYmlvcywgc3RydWN0IGJpdF9lbnRyeSAqYml0ZW50cnkpCit7CisJLyoKKwkgKiBvZmZzZXQgKyA4ICAoMTYgYml0cyk6IFBMTCBsaW1pdHMgdGFibGUgcG9pbnRlcgorCSAqCisJICogVGhlcmUncyBtb3JlIGluIGhlcmUsIGJ1dCB0aGF0J3MgdW5rbm93bi4KKwkgKi8KKworCWlmIChiaXRlbnRyeS0+bGVuZ3RoIDwgMTApIHsKKwkJTlZfRVJST1IoZGV2LCAiRG8gbm90IHVuZGVyc3RhbmQgQklUIEMgdGFibGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwliaW9zLT5wbGxfbGltaXRfdGJsX3B0ciA9IFJPTTE2KGJpb3MtPmRhdGFbYml0ZW50cnktPm9mZnNldCArIDhdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX2JpdF9kaXNwbGF5X3RibF9lbnRyeShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgbnZiaW9zICpiaW9zLCBzdHJ1Y3QgYml0X2VudHJ5ICpiaXRlbnRyeSkKK3sKKwkvKgorCSAqIFBhcnNlcyB0aGUgZmxhdCBwYW5lbCB0YWJsZSBzZWdtZW50IHRoYXQgdGhlIGJpdCBlbnRyeSBwb2ludHMgdG8uCisJICogU3RhcnRpbmcgYXQgYml0ZW50cnktPm9mZnNldDoKKwkgKgorCSAqIG9mZnNldCArIDAgICgxNiBiaXRzKTogPz8/IHRhYmxlIHBvaW50ZXIgLSBzZWVtcyB0byBoYXZlIDE4IGJ5dGUKKwkgKiByZWNvcmRzIGJlZ2lubmluZyB3aXRoIGEgZnJlcS4KKwkgKiBvZmZzZXQgKyAyICAoMTYgYml0cyk6IG1vZGUgdGFibGUgcG9pbnRlcgorCSAqLworCisJaWYgKGJpdGVudHJ5LT5sZW5ndGggIT0gNCkgeworCQlOVl9FUlJPUihkZXYsICJEbyBub3QgdW5kZXJzdGFuZCBCSVQgZGlzcGxheSB0YWJsZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJpb3MtPmZwLmZwdGFibGVwb2ludGVyID0gUk9NMTYoYmlvcy0+ZGF0YVtiaXRlbnRyeS0+b2Zmc2V0ICsgMl0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfYml0X2luaXRfdGJsX2VudHJ5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBudmJpb3MgKmJpb3MsIHN0cnVjdCBiaXRfZW50cnkgKmJpdGVudHJ5KQoreworCS8qCisJICogUGFyc2VzIHRoZSBpbml0IHRhYmxlIHNlZ21lbnQgdGhhdCB0aGUgYml0IGVudHJ5IHBvaW50cyB0by4KKwkgKgorCSAqIFNlZSBwYXJzZV9zY3JpcHRfdGFibGVfcG9pbnRlcnMgZm9yIGxheW91dAorCSAqLworCisJaWYgKGJpdGVudHJ5LT5sZW5ndGggPCAxNCkgeworCQlOVl9FUlJPUihkZXYsICJEbyBub3QgdW5kZXJzdGFuZCBpbml0IHRhYmxlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGFyc2Vfc2NyaXB0X3RhYmxlX3BvaW50ZXJzKGJpb3MsIGJpdGVudHJ5LT5vZmZzZXQpOworCisJaWYgKGJpdGVudHJ5LT5sZW5ndGggPj0gMTYpCisJCWJpb3MtPnNvbWVfc2NyaXB0X3B0ciA9IFJPTTE2KGJpb3MtPmRhdGFbYml0ZW50cnktPm9mZnNldCArIDE0XSk7CisJaWYgKGJpdGVudHJ5LT5sZW5ndGggPj0gMTgpCisJCWJpb3MtPmluaXQ5Nl90YmxfcHRyID0gUk9NMTYoYmlvcy0+ZGF0YVtiaXRlbnRyeS0+b2Zmc2V0ICsgMTZdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX2JpdF9pX3RibF9lbnRyeShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgbnZiaW9zICpiaW9zLCBzdHJ1Y3QgYml0X2VudHJ5ICpiaXRlbnRyeSkKK3sKKwkvKgorCSAqIEJJVCAnaScgKGluZm8/KSB0YWJsZQorCSAqCisJICogb2Zmc2V0ICsgMCAgKDMyIGJpdHMpOiBCSU9TIHZlcnNpb24gZHdvcmQgKGFzIGluIEIgdGFibGUpCisJICogb2Zmc2V0ICsgNSAgKDggIGJpdHMpOiBCSU9TIGZlYXR1cmUgYnl0ZSAoc2FtZSBhcyBmb3IgQk1QPykKKwkgKiBvZmZzZXQgKyAxMyAoMTYgYml0cyk6IHBvaW50ZXIgdG8gdGFibGUgY29udGFpbmluZyBEQUMgbG9hZAorCSAqIGRldGVjdGlvbiBjb21wYXJpc29uIHZhbHVlcworCSAqCisJICogVGhlcmUncyBvdGhlciB0aGluZ3MgaW4gdGhlIHRhYmxlLCBwdXJwb3NlIHVua25vd24KKwkgKi8KKworCXVpbnQxNl90IGRhY2NtcG9mZnNldDsKKwl1aW50OF90IGRhY3ZlciwgZGFjaGVhZGVybGVuOworCisJaWYgKGJpdGVudHJ5LT5sZW5ndGggPCA2KSB7CisJCU5WX0VSUk9SKGRldiwgIkJJVCBpIHRhYmxlIHRvbyBzaG9ydCBmb3IgbmVlZGVkIGluZm9ybWF0aW9uXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGFyc2VfYmlvc192ZXJzaW9uKGRldiwgYmlvcywgYml0ZW50cnktPm9mZnNldCk7CisKKwkvKgorCSAqIGJpdCA0IHNlZW1zIHRvIGluZGljYXRlIGEgbW9iaWxlIGJpb3MgKGRvZXNuJ3Qgc3VmZmVyIGZyb20gQk1QJ3MKKwkgKiBRdWFkcm8gaWRlbnRpdHkgY3Jpc2lzKSwgb3RoZXIgYml0cyBwb3NzaWJseSBhcyBmb3IgQk1QIGZlYXR1cmUgYnl0ZQorCSAqLworCWJpb3MtPmZlYXR1cmVfYnl0ZSA9IGJpb3MtPmRhdGFbYml0ZW50cnktPm9mZnNldCArIDVdOworCWJpb3MtPmlzX21vYmlsZSA9IGJpb3MtPmZlYXR1cmVfYnl0ZSAmIEZFQVRVUkVfTU9CSUxFOworCisJaWYgKGJpdGVudHJ5LT5sZW5ndGggPCAxNSkgeworCQlOVl9XQVJOKGRldiwgIkJJVCBpIHRhYmxlIG5vdCBsb25nIGVub3VnaCBmb3IgREFDIGxvYWQgIgorCQkJICAgICAgICJkZXRlY3Rpb24gY29tcGFyaXNvbiB0YWJsZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRhY2NtcG9mZnNldCA9IFJPTTE2KGJpb3MtPmRhdGFbYml0ZW50cnktPm9mZnNldCArIDEzXSk7CisKKwkvKiBkb2Vzbid0IGV4aXN0IG9uIGc4MCAqLworCWlmICghZGFjY21wb2Zmc2V0KQorCQlyZXR1cm4gMDsKKworCS8qCisJICogVGhlIGZpcnN0IHZhbHVlIGluIHRoZSB0YWJsZSwgZm9sbG93aW5nIHRoZSBoZWFkZXIsIGlzIHRoZQorCSAqIGNvbXBhcmlzb24gdmFsdWUsIHRoZSBzZWNvbmQgZW50cnkgaXMgYSBjb21wYXJpc29uIHZhbHVlIGZvcgorCSAqIFRWIGxvYWQgZGV0ZWN0aW9uLgorCSAqLworCisJZGFjdmVyID0gYmlvcy0+ZGF0YVtkYWNjbXBvZmZzZXRdOworCWRhY2hlYWRlcmxlbiA9IGJpb3MtPmRhdGFbZGFjY21wb2Zmc2V0ICsgMV07CisKKwlpZiAoZGFjdmVyICE9IDB4MDAgJiYgZGFjdmVyICE9IDB4MTApIHsKKwkJTlZfV0FSTihkZXYsICJEQUMgbG9hZCBkZXRlY3Rpb24gY29tcGFyaXNvbiB0YWJsZSB2ZXJzaW9uICIKKwkJCSAgICAgICAiJWQuJWQgbm90IGtub3duXG4iLCBkYWN2ZXIgPj4gNCwgZGFjdmVyICYgMHhmKTsKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCisJYmlvcy0+cHViLmRhY3Rlc3R2YWwgPSBST00zMihiaW9zLT5kYXRhW2RhY2NtcG9mZnNldCArIGRhY2hlYWRlcmxlbl0pOworCWJpb3MtPnB1Yi50dmRhY3Rlc3R2YWwgPSBST00zMihiaW9zLT5kYXRhW2RhY2NtcG9mZnNldCArIGRhY2hlYWRlcmxlbiArIDRdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX2JpdF9sdmRzX3RibF9lbnRyeShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgbnZiaW9zICpiaW9zLCBzdHJ1Y3QgYml0X2VudHJ5ICpiaXRlbnRyeSkKK3sKKwkvKgorCSAqIFBhcnNlcyB0aGUgTFZEUyB0YWJsZSBzZWdtZW50IHRoYXQgdGhlIGJpdCBlbnRyeSBwb2ludHMgdG8uCisJICogU3RhcnRpbmcgYXQgYml0ZW50cnktPm9mZnNldDoKKwkgKgorCSAqIG9mZnNldCArIDAgICgxNiBiaXRzKTogTFZEUyBzdHJhcCB4bGF0ZSB0YWJsZSBwb2ludGVyCisJICovCisKKwlpZiAoYml0ZW50cnktPmxlbmd0aCAhPSAyKSB7CisJCU5WX0VSUk9SKGRldiwgIkRvIG5vdCB1bmRlcnN0YW5kIEJJVCBMVkRTIHRhYmxlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBObyBpZGVhIGlmIGl0J3Mgc3RpbGwgY2FsbGVkIHRoZSBMVkRTIG1hbnVmYWN0dXJlciB0YWJsZSwgYnV0CisJICogdGhlIGNvbmNlcHQncyBjbG9zZSBlbm91Z2guCisJICovCisJYmlvcy0+ZnAubHZkc21hbnVmYWN0dXJlcnBvaW50ZXIgPSBST00xNihiaW9zLT5kYXRhW2JpdGVudHJ5LT5vZmZzZXRdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwYXJzZV9iaXRfTV90YmxfZW50cnkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG52YmlvcyAqYmlvcywKKwkJICAgICAgc3RydWN0IGJpdF9lbnRyeSAqYml0ZW50cnkpCit7CisJLyoKKwkgKiBvZmZzZXQgKyAyICAoOCAgYml0cyk6IG51bWJlciBvZiBvcHRpb25zIGluIGFuCisJICogCUlOSVRfUkFNX1JFU1RSSUNUX1pNX1JFR19HUk9VUCBvcGNvZGUgb3B0aW9uIHNldAorCSAqIG9mZnNldCArIDMgICgxNiBiaXRzKTogcG9pbnRlciB0byBzdHJhcCB4bGF0ZSB0YWJsZSBmb3IgUkFNCisJICogCXJlc3RyaWN0IG9wdGlvbiBzZWxlY3Rpb24KKwkgKgorCSAqIFRoZXJlJ3MgYSBidW5jaCBvZiBiaXRzIGluIHRoaXMgdGFibGUgb3RoZXIgdGhhbiB0aGUgUkFNIHJlc3RyaWN0CisJICogc3R1ZmYgdGhhdCB3ZSBkb24ndCB1c2UgLSB0aGVpciB1c2UgY3VycmVudGx5IHVua25vd24KKwkgKi8KKworCXVpbnQxNl90IHJyX3N0cmFwX3hsYXQ7CisJdWludDhfdCBycl9ncm91cF9jb3VudDsKKwlpbnQgaTsKKworCS8qCisJICogT2xkZXIgYmlvcyB2ZXJzaW9ucyBkb24ndCBoYXZlIGEgc3VmZmljaWVudGx5IGxvbmcgdGFibGUgZm9yCisJICogd2hhdCB3ZSB3YW50CisJICovCisJaWYgKGJpdGVudHJ5LT5sZW5ndGggPCAweDUpCisJCXJldHVybiAwOworCisJaWYgKGJpdGVudHJ5LT5pZFsxXSA8IDIpIHsKKwkJcnJfZ3JvdXBfY291bnQgPSBiaW9zLT5kYXRhW2JpdGVudHJ5LT5vZmZzZXQgKyAyXTsKKwkJcnJfc3RyYXBfeGxhdCA9IFJPTTE2KGJpb3MtPmRhdGFbYml0ZW50cnktPm9mZnNldCArIDNdKTsKKwl9IGVsc2UgeworCQlycl9ncm91cF9jb3VudCA9IGJpb3MtPmRhdGFbYml0ZW50cnktPm9mZnNldCArIDBdOworCQlycl9zdHJhcF94bGF0ID0gUk9NMTYoYmlvcy0+ZGF0YVtiaXRlbnRyeS0+b2Zmc2V0ICsgMV0pOworCX0KKworCS8qIGFkanVzdCBsZW5ndGggb2YgSU5JVF84NyAqLworCWZvciAoaSA9IDA7IGl0YmxfZW50cnlbaV0ubmFtZSAmJiAoaXRibF9lbnRyeVtpXS5pZCAhPSAweDg3KTsgaSsrKTsKKwlpdGJsX2VudHJ5W2ldLmxlbmd0aCArPSBycl9ncm91cF9jb3VudCAqIDQ7CisKKwkvKiBzZXQgdXAgbXVsdGlwbGllciBmb3IgSU5JVF9SQU1fUkVTVFJJQ1RfWk1fUkVHX0dST1VQICovCisJZm9yICg7IGl0YmxfZW50cnlbaV0ubmFtZSAmJiAoaXRibF9lbnRyeVtpXS5pZCAhPSAweDhmKTsgaSsrKTsKKwlpdGJsX2VudHJ5W2ldLmxlbmd0aF9tdWx0aXBsaWVyID0gcnJfZ3JvdXBfY291bnQgKiA0OworCisJaW5pdF9yYW1fcmVzdHJpY3Rfem1fcmVnX2dyb3VwX2Jsb2NrbGVuID0gaXRibF9lbnRyeVtpXS5sZW5ndGhfbXVsdGlwbGllcjsKKwliaW9zLT5yYW1fcmVzdHJpY3RfdGJsX3B0ciA9IHJyX3N0cmFwX3hsYXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9iaXRfdG1kc190YmxfZW50cnkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG52YmlvcyAqYmlvcywgc3RydWN0IGJpdF9lbnRyeSAqYml0ZW50cnkpCit7CisJLyoKKwkgKiBQYXJzZXMgdGhlIHBvaW50ZXIgdG8gdGhlIFRNRFMgdGFibGUKKwkgKgorCSAqIFN0YXJ0aW5nIGF0IGJpdGVudHJ5LT5vZmZzZXQ6CisJICoKKwkgKiBvZmZzZXQgKyAwICAoMTYgYml0cyk6IFRNRFMgdGFibGUgcG9pbnRlcgorCSAqCisJICogVGhlIFRNRFMgdGFibGUgaXMgdHlwaWNhbGx5IGZvdW5kIGp1c3QgYmVmb3JlIHRoZSBEQ0IgdGFibGUsIHdpdGggYQorCSAqIGNoYXJhY3RlcmlzdGljIHNpZ25hdHVyZSBvZiAweDExLDB4MTMgKDEuMSBiZWluZyB2ZXJzaW9uLCAweDEzIGJlaW5nCisJICogbGVuZ3RoPykKKwkgKgorCSAqIEF0IG9mZnNldCArNyBpcyBhIHBvaW50ZXIgdG8gYSBzY3JpcHQsIHdoaWNoIEkgZG9uJ3Qga25vdyBob3cgdG8KKwkgKiBydW4geWV0LgorCSAqIEF0IG9mZnNldCArOSBpcyBhIHBvaW50ZXIgdG8gYW5vdGhlciBzY3JpcHQsIGxpa2V3aXNlCisJICogT2Zmc2V0ICsxMSBoYXMgYSBwb2ludGVyIHRvIGEgdGFibGUgd2hlcmUgdGhlIGZpcnN0IHdvcmQgaXMgYSBweGNsaworCSAqIGZyZXF1ZW5jeSBhbmQgdGhlIHNlY29uZCB3b3JkIGEgcG9pbnRlciB0byBhIHNjcmlwdCwgd2hpY2ggc2hvdWxkIGJlCisJICogcnVuIGlmIHRoZSBjb21wYXJpc29uIHB4Y2xrIGZyZXF1ZW5jeSBpcyBsZXNzIHRoYW4gdGhlIHB4Y2xrIGRlc2lyZWQuCisJICogVGhpcyByZXBlYXRzIGZvciBkZWNyZWFzaW5nIGNvbXBhcmlzb24gZnJlcXVlbmNpZXMKKwkgKiBPZmZzZXQgKzEzIGhhcyBhIHBvaW50ZXIgdG8gYSBzaW1pbGFyIHRhYmxlCisJICogVGhlIHNlbGVjdGlvbiBvZiB0YWJsZSAoYW5kIHBvc3NpYmx5ICs3Lys5IHNjcmlwdCkgaXMgZGljdGF0ZWQgYnkKKwkgKiAib3IiIGZyb20gdGhlIERDQi4KKwkgKi8KKworCXVpbnQxNl90IHRtZHN0YWJsZXB0ciwgc2NyaXB0MSwgc2NyaXB0MjsKKworCWlmIChiaXRlbnRyeS0+bGVuZ3RoICE9IDIpIHsKKwkJTlZfRVJST1IoZGV2LCAiRG8gbm90IHVuZGVyc3RhbmQgQklUIFRNRFMgdGFibGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl0bWRzdGFibGVwdHIgPSBST00xNihiaW9zLT5kYXRhW2JpdGVudHJ5LT5vZmZzZXRdKTsKKworCWlmICh0bWRzdGFibGVwdHIgPT0gMHgwKSB7CisJCU5WX0VSUk9SKGRldiwgIlBvaW50ZXIgdG8gVE1EUyB0YWJsZSBpbnZhbGlkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogbnY1MCsgaGFzIHYyLjAsIGJ1dCB3ZSBkb24ndCBwYXJzZSBpdCBhdG0gKi8KKwlpZiAoYmlvcy0+ZGF0YVt0bWRzdGFibGVwdHJdICE9IDB4MTEpIHsKKwkJTlZfV0FSTihkZXYsCisJCQkiVE1EUyB0YWJsZSByZXZpc2lvbiAlZC4lZCBub3QgY3VycmVudGx5IHN1cHBvcnRlZFxuIiwKKwkJCWJpb3MtPmRhdGFbdG1kc3RhYmxlcHRyXSA+PiA0LCBiaW9zLT5kYXRhW3RtZHN0YWJsZXB0cl0gJiAweGYpOworCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisKKwkvKgorCSAqIFRoZXNlIHR3byBzY3JpcHRzIGFyZSBvZGQ6IHRoZXkgZG9uJ3Qgc2VlbSB0byBnZXQgcnVuIGV2ZW4gd2hlbgorCSAqIHRoZXkgYXJlIG5vdCBzdHViYmVkLgorCSAqLworCXNjcmlwdDEgPSBST00xNihiaW9zLT5kYXRhW3RtZHN0YWJsZXB0ciArIDddKTsKKwlzY3JpcHQyID0gUk9NMTYoYmlvcy0+ZGF0YVt0bWRzdGFibGVwdHIgKyA5XSk7CisJaWYgKGJpb3MtPmRhdGFbc2NyaXB0MV0gIT0gJ3EnIHx8IGJpb3MtPmRhdGFbc2NyaXB0Ml0gIT0gJ3EnKQorCQlOVl9XQVJOKGRldiwgIlRNRFMgdGFibGUgc2NyaXB0IHBvaW50ZXJzIG5vdCBzdHViYmVkXG4iKTsKKworCWJpb3MtPnRtZHMub3V0cHV0MF9zY3JpcHRfcHRyID0gUk9NMTYoYmlvcy0+ZGF0YVt0bWRzdGFibGVwdHIgKyAxMV0pOworCWJpb3MtPnRtZHMub3V0cHV0MV9zY3JpcHRfcHRyID0gUk9NMTYoYmlvcy0+ZGF0YVt0bWRzdGFibGVwdHIgKyAxM10pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3BhcnNlX2JpdF9VX3RibF9lbnRyeShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgbnZiaW9zICpiaW9zLAorCQkgICAgICBzdHJ1Y3QgYml0X2VudHJ5ICpiaXRlbnRyeSkKK3sKKwkvKgorCSAqIFBhcnNlcyB0aGUgcG9pbnRlciB0byB0aGUgRzgwIG91dHB1dCBzY3JpcHQgdGFibGVzCisJICoKKwkgKiBTdGFydGluZyBhdCBiaXRlbnRyeS0+b2Zmc2V0OgorCSAqCisJICogb2Zmc2V0ICsgMCAgKDE2IGJpdHMpOiBvdXRwdXQgc2NyaXB0IHRhYmxlIHBvaW50ZXIKKwkgKi8KKworCXVpbnQxNl90IG91dHB1dHNjcmlwdHRhYmxlcHRyOworCisJaWYgKGJpdGVudHJ5LT5sZW5ndGggIT0gMykgeworCQlOVl9FUlJPUihkZXYsICJEbyBub3QgdW5kZXJzdGFuZCBCSVQgVSB0YWJsZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW91dHB1dHNjcmlwdHRhYmxlcHRyID0gUk9NMTYoYmlvcy0+ZGF0YVtiaXRlbnRyeS0+b2Zmc2V0XSk7CisJYmlvcy0+ZGlzcGxheS5zY3JpcHRfdGFibGVfcHRyID0gb3V0cHV0c2NyaXB0dGFibGVwdHI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3BhcnNlX2JpdF9kaXNwbGF5cG9ydF90YmxfZW50cnkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG52YmlvcyAqYmlvcywKKwkJCQlzdHJ1Y3QgYml0X2VudHJ5ICpiaXRlbnRyeSkKK3sKKwliaW9zLT5kaXNwbGF5LmRwX3RhYmxlX3B0ciA9IFJPTTE2KGJpb3MtPmRhdGFbYml0ZW50cnktPm9mZnNldF0pOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgYml0X3RhYmxlIHsKKwljb25zdCBjaGFyIGlkOworCWludCAoKiBjb25zdCBwYXJzZV9mbikoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG52YmlvcyAqLCBzdHJ1Y3QgYml0X2VudHJ5ICopOworfTsKKworI2RlZmluZSBCSVRfVEFCTEUoaWQsIGZ1bmNpZCkgKChzdHJ1Y3QgYml0X3RhYmxlKXsgaWQsIHBhcnNlX2JpdF8jI2Z1bmNpZCMjX3RibF9lbnRyeSB9KQorCitzdGF0aWMgaW50CitwYXJzZV9iaXRfdGFibGUoc3RydWN0IG52YmlvcyAqYmlvcywgY29uc3QgdWludDE2X3QgYml0b2Zmc2V0LAorCQlzdHJ1Y3QgYml0X3RhYmxlICp0YWJsZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYmlvcy0+ZGV2OworCXVpbnQ4X3QgbWF4ZW50cmllcyA9IGJpb3MtPmRhdGFbYml0b2Zmc2V0ICsgNF07CisJaW50IGksIG9mZnNldDsKKwlzdHJ1Y3QgYml0X2VudHJ5IGJpdGVudHJ5OworCisJZm9yIChpID0gMCwgb2Zmc2V0ID0gYml0b2Zmc2V0ICsgNjsgaSA8IG1heGVudHJpZXM7IGkrKywgb2Zmc2V0ICs9IDYpIHsKKwkJYml0ZW50cnkuaWRbMF0gPSBiaW9zLT5kYXRhW29mZnNldF07CisKKwkJaWYgKGJpdGVudHJ5LmlkWzBdICE9IHRhYmxlLT5pZCkKKwkJCWNvbnRpbnVlOworCisJCWJpdGVudHJ5LmlkWzFdID0gYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXTsKKwkJYml0ZW50cnkubGVuZ3RoID0gUk9NMTYoYmlvcy0+ZGF0YVtvZmZzZXQgKyAyXSk7CisJCWJpdGVudHJ5Lm9mZnNldCA9IFJPTTE2KGJpb3MtPmRhdGFbb2Zmc2V0ICsgNF0pOworCisJCXJldHVybiB0YWJsZS0+cGFyc2VfZm4oZGV2LCBiaW9zLCAmYml0ZW50cnkpOworCX0KKworCU5WX0lORk8oZGV2LCAiQklUIHRhYmxlICclYycgbm90IGZvdW5kXG4iLCB0YWJsZS0+aWQpOworCXJldHVybiAtRU5PU1lTOworfQorCitzdGF0aWMgaW50CitwYXJzZV9iaXRfc3RydWN0dXJlKHN0cnVjdCBudmJpb3MgKmJpb3MsIGNvbnN0IHVpbnQxNl90IGJpdG9mZnNldCkKK3sKKwlpbnQgcmV0OworCisJLyoKKwkgKiBUaGUgb25seSByZXN0cmljdGlvbiBvbiBwYXJzaW5nIG9yZGVyIGN1cnJlbnRseSBpcyBoYXZpbmcgJ2knIGZpcnN0CisJICogZm9yIHVzZSBvZiBiaW9zLT4qX3ZlcnNpb24gb3IgYmlvcy0+ZmVhdHVyZV9ieXRlIHdoaWxlIHBhcnNpbmc7CisJICogZnVuY3Rpb25zIHNob3VsZG4ndCBiZSBhY3R1YWxseSAqZG9pbmcqIGFueXRoaW5nIGFwYXJ0IGZyb20gcHVsbGluZworCSAqIGRhdGEgZnJvbSB0aGUgaW1hZ2UgaW50byB0aGUgYmlvcyBzdHJ1Y3QsIHRodXMgbm8gaW50ZXJkZXBlbmRlbmNpZXMKKwkgKi8KKwlyZXQgPSBwYXJzZV9iaXRfdGFibGUoYmlvcywgYml0b2Zmc2V0LCAmQklUX1RBQkxFKCdpJywgaSkpOworCWlmIChyZXQpIC8qIGluZm8/ICovCisJCXJldHVybiByZXQ7CisJaWYgKGJpb3MtPm1ham9yX3ZlcnNpb24gPj0gMHg2MCkgLyogZzgwKyAqLworCQlwYXJzZV9iaXRfdGFibGUoYmlvcywgYml0b2Zmc2V0LCAmQklUX1RBQkxFKCdBJywgQSkpOworCXJldCA9IHBhcnNlX2JpdF90YWJsZShiaW9zLCBiaXRvZmZzZXQsICZCSVRfVEFCTEUoJ0MnLCBDKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlwYXJzZV9iaXRfdGFibGUoYmlvcywgYml0b2Zmc2V0LCAmQklUX1RBQkxFKCdEJywgZGlzcGxheSkpOworCXJldCA9IHBhcnNlX2JpdF90YWJsZShiaW9zLCBiaXRvZmZzZXQsICZCSVRfVEFCTEUoJ0knLCBpbml0KSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlwYXJzZV9iaXRfdGFibGUoYmlvcywgYml0b2Zmc2V0LCAmQklUX1RBQkxFKCdNJywgTSkpOyAvKiBtZW1vcnk/ICovCisJcGFyc2VfYml0X3RhYmxlKGJpb3MsIGJpdG9mZnNldCwgJkJJVF9UQUJMRSgnTCcsIGx2ZHMpKTsKKwlwYXJzZV9iaXRfdGFibGUoYmlvcywgYml0b2Zmc2V0LCAmQklUX1RBQkxFKCdUJywgdG1kcykpOworCXBhcnNlX2JpdF90YWJsZShiaW9zLCBiaXRvZmZzZXQsICZCSVRfVEFCTEUoJ1UnLCBVKSk7CisJcGFyc2VfYml0X3RhYmxlKGJpb3MsIGJpdG9mZnNldCwgJkJJVF9UQUJMRSgnZCcsIGRpc3BsYXlwb3J0KSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9ibXBfc3RydWN0dXJlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBudmJpb3MgKmJpb3MsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJLyoKKwkgKiBQYXJzZXMgdGhlIEJNUCBzdHJ1Y3R1cmUgZm9yIHVzZWZ1bCB0aGluZ3MsIGJ1dCBkb2VzIG5vdCBhY3Qgb24gdGhlbQorCSAqCisJICogb2Zmc2V0ICsgICA1OiBCTVAgbWFqb3IgdmVyc2lvbgorCSAqIG9mZnNldCArICAgNjogQk1QIG1pbm9yIHZlcnNpb24KKwkgKiBvZmZzZXQgKyAgIDk6IEJNUCBmZWF0dXJlIGJ5dGUKKwkgKiBvZmZzZXQgKyAgMTA6IEJDRCBlbmNvZGVkIEJJT1MgdmVyc2lvbgorCSAqCisJICogb2Zmc2V0ICsgIDE4OiBpbml0IHNjcmlwdCB0YWJsZSBwb2ludGVyIChmb3IgYmlvcyB2ZXJzaW9ucyA8IDUuMTBoKQorCSAqIG9mZnNldCArICAyMDogZXh0cmEgaW5pdCBzY3JpcHQgdGFibGUgcG9pbnRlciAoZm9yIGJpb3MKKwkgKiB2ZXJzaW9ucyA8IDUuMTBoKQorCSAqCisJICogb2Zmc2V0ICsgIDI0OiBtZW1vcnkgaW5pdCB0YWJsZSBwb2ludGVyICh1c2VkIG9uIGVhcmx5IGJpb3MgdmVyc2lvbnMpCisJICogb2Zmc2V0ICsgIDI2OiBTRFIgbWVtb3J5IHNlcXVlbmNpbmcgc2V0dXAgZGF0YSB0YWJsZQorCSAqIG9mZnNldCArICAyODogRERSIG1lbW9yeSBzZXF1ZW5jaW5nIHNldHVwIGRhdGEgdGFibGUKKwkgKgorCSAqIG9mZnNldCArICA1NDogaW5kZXggb2YgSTJDIENSVEMgcGFpciB0byB1c2UgZm9yIENSVCBvdXRwdXQKKwkgKiBvZmZzZXQgKyAgNTU6IGluZGV4IG9mIEkyQyBDUlRDIHBhaXIgdG8gdXNlIGZvciBUViBvdXRwdXQKKwkgKiBvZmZzZXQgKyAgNTY6IGluZGV4IG9mIEkyQyBDUlRDIHBhaXIgdG8gdXNlIGZvciBmbGF0IHBhbmVsIG91dHB1dAorCSAqIG9mZnNldCArICA1ODogd3JpdGUgQ1JUQyBpbmRleCBmb3IgSTJDIHBhaXIgMAorCSAqIG9mZnNldCArICA1OTogcmVhZCBDUlRDIGluZGV4IGZvciBJMkMgcGFpciAwCisJICogb2Zmc2V0ICsgIDYwOiB3cml0ZSBDUlRDIGluZGV4IGZvciBJMkMgcGFpciAxCisJICogb2Zmc2V0ICsgIDYxOiByZWFkIENSVEMgaW5kZXggZm9yIEkyQyBwYWlyIDEKKwkgKgorCSAqIG9mZnNldCArICA2NzogbWF4aW11bSBpbnRlcm5hbCBQTEwgZnJlcXVlbmN5IChzaW5nbGUgc3RhZ2UgUExMKQorCSAqIG9mZnNldCArICA3MTogbWluaW11bSBpbnRlcm5hbCBQTEwgZnJlcXVlbmN5IChzaW5nbGUgc3RhZ2UgUExMKQorCSAqCisJICogb2Zmc2V0ICsgIDc1OiBzY3JpcHQgdGFibGUgcG9pbnRlcnMsIGFzIGRlc2NyaWJlZCBpbgorCSAqIHBhcnNlX3NjcmlwdF90YWJsZV9wb2ludGVycworCSAqCisJICogb2Zmc2V0ICsgIDg5OiBUTURTIHNpbmdsZSBsaW5rIG91dHB1dCBBIHRhYmxlIHBvaW50ZXIKKwkgKiBvZmZzZXQgKyAgOTE6IFRNRFMgc2luZ2xlIGxpbmsgb3V0cHV0IEIgdGFibGUgcG9pbnRlcgorCSAqIG9mZnNldCArICA5NTogTFZEUyBzaW5nbGUgbGluayBvdXRwdXQgQSB0YWJsZSBwb2ludGVyCisJICogb2Zmc2V0ICsgMTA1OiBmbGF0IHBhbmVsIHRpbWluZ3MgdGFibGUgcG9pbnRlcgorCSAqIG9mZnNldCArIDEwNzogZmxhdCBwYW5lbCBzdHJhcHBpbmcgdHJhbnNsYXRpb24gdGFibGUgcG9pbnRlcgorCSAqIG9mZnNldCArIDExNzogTFZEUyBtYW51ZmFjdHVyZXIgcGFuZWwgY29uZmlnIHRhYmxlIHBvaW50ZXIKKwkgKiBvZmZzZXQgKyAxMTk6IExWRFMgbWFudWZhY3R1cmVyIHN0cmFwcGluZyB0cmFuc2xhdGlvbiB0YWJsZSBwb2ludGVyCisJICoKKwkgKiBvZmZzZXQgKyAxNDI6IFBMTCBsaW1pdHMgdGFibGUgcG9pbnRlcgorCSAqCisJICogb2Zmc2V0ICsgMTU2OiBtaW5pbXVtIHBpeGVsIGNsb2NrIGZvciBMVkRTIGR1YWwgbGluaworCSAqLworCisJdWludDhfdCAqYm1wID0gJmJpb3MtPmRhdGFbb2Zmc2V0XSwgYm1wX3ZlcnNpb25fbWFqb3IsIGJtcF92ZXJzaW9uX21pbm9yOworCXVpbnQxNl90IGJtcGxlbmd0aDsKKwl1aW50MTZfdCBsZWdhY3lfc2NyaXB0c19vZmZzZXQsIGxlZ2FjeV9pMmNfb2Zmc2V0OworCisJLyogbG9hZCBuZWVkZWQgZGVmYXVsdHMgaW4gY2FzZSB3ZSBjYW4ndCBwYXJzZSB0aGlzIGluZm8gKi8KKwliaW9zLT5iZGNiLmRjYi5pMmNbMF0ud3JpdGUgPSBOVl9DSU9fQ1JFX0REQ19XUl9fSU5ERVg7CisJYmlvcy0+YmRjYi5kY2IuaTJjWzBdLnJlYWQgPSBOVl9DSU9fQ1JFX0REQ19TVEFUVVNfX0lOREVYOworCWJpb3MtPmJkY2IuZGNiLmkyY1sxXS53cml0ZSA9IE5WX0NJT19DUkVfRERDMF9XUl9fSU5ERVg7CisJYmlvcy0+YmRjYi5kY2IuaTJjWzFdLnJlYWQgPSBOVl9DSU9fQ1JFX0REQzBfU1RBVFVTX19JTkRFWDsKKwliaW9zLT5wdWIuZGlnaXRhbF9taW5fZnJvbnRfcG9yY2ggPSAweDRiOworCWJpb3MtPmZtYXh2Y28gPSAyNTYwMDA7CisJYmlvcy0+Zm1pbnZjbyA9IDEyODAwMDsKKwliaW9zLT5mcC5kdWFsbGlua190cmFuc2l0aW9uX2NsayA9IDkwMDAwOworCisJYm1wX3ZlcnNpb25fbWFqb3IgPSBibXBbNV07CisJYm1wX3ZlcnNpb25fbWlub3IgPSBibXBbNl07CisKKwlOVl9UUkFDRShkZXYsICJCTVAgdmVyc2lvbiAlZC4lZFxuIiwKKwkJIGJtcF92ZXJzaW9uX21ham9yLCBibXBfdmVyc2lvbl9taW5vcik7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IDB4MzYgaXMgYmxhbmsgYW5kIGNhbid0IGJlIG1pc3Rha2VuIGZvciBhIERDQgorCSAqIHBvaW50ZXIgb24gZWFybHkgdmVyc2lvbnMKKwkgKi8KKwlpZiAoYm1wX3ZlcnNpb25fbWFqb3IgPCA1KQorCQkqKHVpbnQxNl90ICopJmJpb3MtPmRhdGFbMHgzNl0gPSAwOworCisJLyoKKwkgKiBTZWVtcyB0aGF0IHRoZSBtaW5vciB2ZXJzaW9uIHdhcyAxIGZvciBhbGwgbWFqb3IgdmVyc2lvbnMgcHJpb3IKKwkgKiB0byA1LiBWZXJzaW9uIDYgY291bGQgdGhlb3JldGljYWxseSBleGlzdCwgYnV0IEkgc3VzcGVjdCBCSVQKKwkgKiBoYXBwZW5lZCBpbnN0ZWFkLgorCSAqLworCWlmICgoYm1wX3ZlcnNpb25fbWFqb3IgPCA1ICYmIGJtcF92ZXJzaW9uX21pbm9yICE9IDEpIHx8IGJtcF92ZXJzaW9uX21ham9yID4gNSkgeworCQlOVl9FUlJPUihkZXYsICJZb3UgaGF2ZSBhbiB1bnN1cHBvcnRlZCBCTVAgdmVyc2lvbi4gIgorCQkJCSJQbGVhc2Ugc2VuZCBpbiB5b3VyIGJpb3NcbiIpOworCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisKKwlpZiAoYm1wX3ZlcnNpb25fbWFqb3IgPT0gMCkKKwkJLyogbm90aGluZyB0aGF0J3MgY3VycmVudGx5IHVzZWZ1bCBpbiB0aGlzIHZlcnNpb24gKi8KKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAoYm1wX3ZlcnNpb25fbWFqb3IgPT0gMSkKKwkJYm1wbGVuZ3RoID0gNDQ7IC8qIGV4YWN0IGZvciAxLjAxICovCisJZWxzZSBpZiAoYm1wX3ZlcnNpb25fbWFqb3IgPT0gMikKKwkJYm1wbGVuZ3RoID0gNDg7IC8qIGV4YWN0IGZvciAyLjAxICovCisJZWxzZSBpZiAoYm1wX3ZlcnNpb25fbWFqb3IgPT0gMykKKwkJYm1wbGVuZ3RoID0gNTQ7CisJCS8qIGd1ZXNzZWQgLSBtZW0gaW5pdCB0YWJsZXMgYWRkZWQgaW4gdGhpcyB2ZXJzaW9uICovCisJZWxzZSBpZiAoYm1wX3ZlcnNpb25fbWFqb3IgPT0gNCB8fCBibXBfdmVyc2lvbl9taW5vciA8IDB4MSkKKwkJLyogZG9uJ3Qga25vdyBpZiA1LjAgZXhpc3RzLi4uICovCisJCWJtcGxlbmd0aCA9IDYyOworCQkvKiBndWVzc2VkIC0gQk1QIEkyQyBpbmRpY2VzIGFkZGVkIGluIHZlcnNpb24gNCovCisJZWxzZSBpZiAoYm1wX3ZlcnNpb25fbWlub3IgPCAweDYpCisJCWJtcGxlbmd0aCA9IDY3OyAvKiBleGFjdCBmb3IgNS4wMSAqLworCWVsc2UgaWYgKGJtcF92ZXJzaW9uX21pbm9yIDwgMHgxMCkKKwkJYm1wbGVuZ3RoID0gNzU7IC8qIGV4YWN0IGZvciA1LjA2ICovCisJZWxzZSBpZiAoYm1wX3ZlcnNpb25fbWlub3IgPT0gMHgxMCkKKwkJYm1wbGVuZ3RoID0gODk7IC8qIGV4YWN0IGZvciA1LjEwaCAqLworCWVsc2UgaWYgKGJtcF92ZXJzaW9uX21pbm9yIDwgMHgxNCkKKwkJYm1wbGVuZ3RoID0gMTE4OyAvKiBleGFjdCBmb3IgNS4xMWggKi8KKwllbHNlIGlmIChibXBfdmVyc2lvbl9taW5vciA8IDB4MjQpCisJCS8qCisJCSAqIE5vdCBzdXJlIG9mIHZlcnNpb24gd2hlcmUgcGxsIGxpbWl0cyBjYW1lIGluOworCQkgKiBjZXJ0YWlubHkgZXhpc3QgYnkgMHgyNCB0aG91Z2guCisJCSAqLworCQkvKiBsZW5ndGggbm90IGV4YWN0OiB0aGlzIGlzIGxvbmcgZW5vdWdoIHRvIGdldCBsdmRzIG1lbWJlcnMgKi8KKwkJYm1wbGVuZ3RoID0gMTIzOworCWVsc2UgaWYgKGJtcF92ZXJzaW9uX21pbm9yIDwgMHgyNykKKwkJLyoKKwkJICogTGVuZ3RoIG5vdCBleGFjdDogdGhpcyBpcyBsb25nIGVub3VnaCB0byBnZXQgcGxsIGxpbWl0CisJCSAqIG1lbWJlcgorCQkgKi8KKwkJYm1wbGVuZ3RoID0gMTQ0OworCWVsc2UKKwkJLyoKKwkJICogTGVuZ3RoIG5vdCBleGFjdDogdGhpcyBpcyBsb25nIGVub3VnaCB0byBnZXQgZHVhbCBsaW5rCisJCSAqIHRyYW5zaXRpb24gY2xvY2suCisJCSAqLworCQlibXBsZW5ndGggPSAxNTg7CisKKwkvKiBjaGVja3N1bSAqLworCWlmIChudl9ja3N1bShibXAsIDgpKSB7CisJCU5WX0VSUk9SKGRldiwgIkJhZCBCTVAgY2hlY2tzdW1cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIEJpdCA0IHNlZW1zIHRvIGluZGljYXRlIGVpdGhlciBhIG1vYmlsZSBiaW9zIG9yIGEgcXVhZHJvIGNhcmQgLS0KKwkgKiBtb2JpbGUgYmVoYXZpb3VyIGNvbnNpc3RlbnQgKG52MTErKSwgcXVhZHJvIG9ubHkgc2VlbiBudjE4Z2wtbnYzNmdsCisJICogKG5vdCBudjEwZ2wpLCBiaXQgNSB0aGF0IHRoZSBmbGF0IHBhbmVsIHRhYmxlcyBhcmUgcHJlc2VudCwgYW5kCisJICogYml0IDYgYSB0diBiaW9zLgorCSAqLworCWJpb3MtPmZlYXR1cmVfYnl0ZSA9IGJtcFs5XTsKKworCXBhcnNlX2Jpb3NfdmVyc2lvbihkZXYsIGJpb3MsIG9mZnNldCArIDEwKTsKKworCWlmIChibXBfdmVyc2lvbl9tYWpvciA8IDUgfHwgYm1wX3ZlcnNpb25fbWlub3IgPCAweDEwKQorCQliaW9zLT5vbGRfc3R5bGVfaW5pdCA9IHRydWU7CisJbGVnYWN5X3NjcmlwdHNfb2Zmc2V0ID0gMTg7CisJaWYgKGJtcF92ZXJzaW9uX21ham9yIDwgMikKKwkJbGVnYWN5X3NjcmlwdHNfb2Zmc2V0IC09IDQ7CisJYmlvcy0+aW5pdF9zY3JpcHRfdGJsc19wdHIgPSBST00xNihibXBbbGVnYWN5X3NjcmlwdHNfb2Zmc2V0XSk7CisJYmlvcy0+ZXh0cmFfaW5pdF9zY3JpcHRfdGJsX3B0ciA9IFJPTTE2KGJtcFtsZWdhY3lfc2NyaXB0c19vZmZzZXQgKyAyXSk7CisKKwlpZiAoYm1wX3ZlcnNpb25fbWFqb3IgPiAyKSB7CS8qIGFwcGVhcnMgaW4gQk1QIDMgKi8KKwkJYmlvcy0+bGVnYWN5Lm1lbV9pbml0X3RibF9wdHIgPSBST00xNihibXBbMjRdKTsKKwkJYmlvcy0+bGVnYWN5LnNkcl9zZXFfdGJsX3B0ciA9IFJPTTE2KGJtcFsyNl0pOworCQliaW9zLT5sZWdhY3kuZGRyX3NlcV90YmxfcHRyID0gUk9NMTYoYm1wWzI4XSk7CisJfQorCisJbGVnYWN5X2kyY19vZmZzZXQgPSAweDQ4OwkvKiBCTVAgdmVyc2lvbiAyICYgMyAqLworCWlmIChibXBsZW5ndGggPiA2MSkKKwkJbGVnYWN5X2kyY19vZmZzZXQgPSBvZmZzZXQgKyA1NDsKKwliaW9zLT5sZWdhY3kuaTJjX2luZGljZXMuY3J0ID0gYmlvcy0+ZGF0YVtsZWdhY3lfaTJjX29mZnNldF07CisJYmlvcy0+bGVnYWN5LmkyY19pbmRpY2VzLnR2ID0gYmlvcy0+ZGF0YVtsZWdhY3lfaTJjX29mZnNldCArIDFdOworCWJpb3MtPmxlZ2FjeS5pMmNfaW5kaWNlcy5wYW5lbCA9IGJpb3MtPmRhdGFbbGVnYWN5X2kyY19vZmZzZXQgKyAyXTsKKwliaW9zLT5iZGNiLmRjYi5pMmNbMF0ud3JpdGUgPSBiaW9zLT5kYXRhW2xlZ2FjeV9pMmNfb2Zmc2V0ICsgNF07CisJYmlvcy0+YmRjYi5kY2IuaTJjWzBdLnJlYWQgPSBiaW9zLT5kYXRhW2xlZ2FjeV9pMmNfb2Zmc2V0ICsgNV07CisJYmlvcy0+YmRjYi5kY2IuaTJjWzFdLndyaXRlID0gYmlvcy0+ZGF0YVtsZWdhY3lfaTJjX29mZnNldCArIDZdOworCWJpb3MtPmJkY2IuZGNiLmkyY1sxXS5yZWFkID0gYmlvcy0+ZGF0YVtsZWdhY3lfaTJjX29mZnNldCArIDddOworCisJaWYgKGJtcGxlbmd0aCA+IDc0KSB7CisJCWJpb3MtPmZtYXh2Y28gPSBST00zMihibXBbNjddKTsKKwkJYmlvcy0+Zm1pbnZjbyA9IFJPTTMyKGJtcFs3MV0pOworCX0KKwlpZiAoYm1wbGVuZ3RoID4gODgpCisJCXBhcnNlX3NjcmlwdF90YWJsZV9wb2ludGVycyhiaW9zLCBvZmZzZXQgKyA3NSk7CisJaWYgKGJtcGxlbmd0aCA+IDk0KSB7CisJCWJpb3MtPnRtZHMub3V0cHV0MF9zY3JpcHRfcHRyID0gUk9NMTYoYm1wWzg5XSk7CisJCWJpb3MtPnRtZHMub3V0cHV0MV9zY3JpcHRfcHRyID0gUk9NMTYoYm1wWzkxXSk7CisJCS8qCisJCSAqIE5ldmVyIG9ic2VydmVkIGluIHVzZSB3aXRoIGx2ZHMgc2NyaXB0cywgYnV0IGlzIHJldXNlZCBmb3IKKwkJICogMTgvMjQgYml0IHBhbmVsIGludGVyZmFjZSBkZWZhdWx0IGZvciBFRElEIGVxdWlwcGVkIHBhbmVscworCQkgKiAoaWZfaXNfMjRiaXQgbm90IHNldCBkaXJlY3RseSB0byBhdm9pZCBhbnkgb3NjaWxsYXRpb24pLgorCQkgKi8KKwkJYmlvcy0+bGVnYWN5Lmx2ZHNfc2luZ2xlX2Ffc2NyaXB0X3B0ciA9IFJPTTE2KGJtcFs5NV0pOworCX0KKwlpZiAoYm1wbGVuZ3RoID4gMTA4KSB7CisJCWJpb3MtPmZwLmZwdGFibGVwb2ludGVyID0gUk9NMTYoYm1wWzEwNV0pOworCQliaW9zLT5mcC5mcHhsYXRldGFibGVwdHIgPSBST00xNihibXBbMTA3XSk7CisJCWJpb3MtPmZwLnhsYXR3aWR0aCA9IDE7CisJfQorCWlmIChibXBsZW5ndGggPiAxMjApIHsKKwkJYmlvcy0+ZnAubHZkc21hbnVmYWN0dXJlcnBvaW50ZXIgPSBST00xNihibXBbMTE3XSk7CisJCWJpb3MtPmZwLmZweGxhdGVtYW51ZmFjdHVyZXJ0YWJsZXB0ciA9IFJPTTE2KGJtcFsxMTldKTsKKwl9CisJaWYgKGJtcGxlbmd0aCA+IDE0MykKKwkJYmlvcy0+cGxsX2xpbWl0X3RibF9wdHIgPSBST00xNihibXBbMTQyXSk7CisKKwlpZiAoYm1wbGVuZ3RoID4gMTU3KQorCQliaW9zLT5mcC5kdWFsbGlua190cmFuc2l0aW9uX2NsayA9IFJPTTE2KGJtcFsxNTZdKSAqIDEwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1aW50MTZfdCBmaW5kc3RyKHVpbnQ4X3QgKmRhdGEsIGludCBuLCBjb25zdCB1aW50OF90ICpzdHIsIGludCBsZW4pCit7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDw9IChuIC0gbGVuKTsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBsZW47IGorKykKKwkJCWlmIChkYXRhW2kgKyBqXSAhPSBzdHJbal0pCisJCQkJYnJlYWs7CisJCWlmIChqID09IGxlbikKKwkJCXJldHVybiBpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CityZWFkX2RjYl9pMmNfZW50cnkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGRjYl92ZXJzaW9uLCB1aW50OF90ICppMmN0YWJsZSwgaW50IGluZGV4LCBzdHJ1Y3QgZGNiX2kyY19lbnRyeSAqaTJjKQoreworCXVpbnQ4X3QgZGNiX2kyY192ZXIgPSBkY2JfdmVyc2lvbiwgaGVhZGVybGVuID0gMCwgZW50cnlfbGVuID0gNDsKKwlpbnQgaTJjX2VudHJpZXMgPSBEQ0JfTUFYX05VTV9JMkNfRU5UUklFUzsKKwlpbnQgcmVjb3Jkb2Zmc2V0ID0gMCwgcmRvZnMgPSAxLCB3cm9mcyA9IDA7CisJdWludDhfdCBwb3J0X3R5cGUgPSAwOworCisJaWYgKCFpMmN0YWJsZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZGNiX3ZlcnNpb24gPj0gMHgzMCkgeworCQlpZiAoaTJjdGFibGVbMF0gIT0gZGNiX3ZlcnNpb24pIC8qIG5lY2Vzc2FyeT8gKi8KKwkJCU5WX1dBUk4oZGV2LAorCQkJCSJEQ0IgSTJDIHRhYmxlIHZlcnNpb24gbWlzbWF0Y2ggKCUwMlggdnMgJTAyWClcbiIsCisJCQkJaTJjdGFibGVbMF0sIGRjYl92ZXJzaW9uKTsKKwkJZGNiX2kyY192ZXIgPSBpMmN0YWJsZVswXTsKKwkJaGVhZGVybGVuID0gaTJjdGFibGVbMV07CisJCWlmIChpMmN0YWJsZVsyXSA8PSBEQ0JfTUFYX05VTV9JMkNfRU5UUklFUykKKwkJCWkyY19lbnRyaWVzID0gaTJjdGFibGVbMl07CisJCWVsc2UKKwkJCU5WX1dBUk4oZGV2LAorCQkJCSJEQ0IgSTJDIHRhYmxlIGhhcyBtb3JlIGVudHJpZXMgdGhhbiBpbmRleGFibGUgIgorCQkJCSIoJWQgZW50cmllcywgbWF4IGluZGV4IDE1KVxuIiwgaTJjdGFibGVbMl0pOworCQllbnRyeV9sZW4gPSBpMmN0YWJsZVszXTsKKwkJLyogWzRdIGlzIGkyY19kZWZhdWx0X2luZGljZXMsIHJlYWQgaW4gcGFyc2VfZGNiX3RhYmxlKCkgKi8KKwl9CisJLyoKKwkgKiBJdCdzIHlvdXIgb3duIGZhdWx0IGlmIHlvdSBjYWxsIHRoaXMgZnVuY3Rpb24gb24gYSBEQ0IgMS4xIEJJT1MgLS0KKwkgKiB0aGUgdGVzdCBiZWxvdyBpcyBmb3IgRENCIDEuMgorCSAqLworCWlmIChkY2JfdmVyc2lvbiA8IDB4MTQpIHsKKwkJcmVjb3Jkb2Zmc2V0ID0gMjsKKwkJcmRvZnMgPSAwOworCQl3cm9mcyA9IDE7CisJfQorCisJaWYgKGluZGV4ID09IDB4ZikKKwkJcmV0dXJuIDA7CisJaWYgKGluZGV4ID4gaTJjX2VudHJpZXMpIHsKKwkJTlZfRVJST1IoZGV2LCAiRENCIEkyQyBpbmRleCB0b28gYmlnICglZCA+ICVkKVxuIiwKKwkJCSBpbmRleCwgaTJjdGFibGVbMl0pOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJaWYgKGkyY3RhYmxlW2hlYWRlcmxlbiArIGVudHJ5X2xlbiAqIGluZGV4ICsgM10gPT0gMHhmZikgeworCQlOVl9FUlJPUihkZXYsICJEQ0IgSTJDIGVudHJ5IGludmFsaWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZGNiX2kyY192ZXIgPj0gMHgzMCkgeworCQlwb3J0X3R5cGUgPSBpMmN0YWJsZVtoZWFkZXJsZW4gKyByZWNvcmRvZmZzZXQgKyAzICsgZW50cnlfbGVuICogaW5kZXhdOworCisJCS8qCisJCSAqIEZpeHVwIGZvciBjaGlwcyB1c2luZyBzYW1lIGFkZHJlc3Mgb2Zmc2V0IGZvciByZWFkIGFuZAorCQkgKiB3cml0ZS4KKwkJICovCisJCWlmIChwb3J0X3R5cGUgPT0gNCkJLyogc2VlbiBvbiBDNTEgKi8KKwkJCXJkb2ZzID0gd3JvZnMgPSAxOworCQlpZiAocG9ydF90eXBlID49IDUpCS8qIEc4MCsgKi8KKwkJCXJkb2ZzID0gd3JvZnMgPSAwOworCX0KKworCWlmIChkY2JfaTJjX3ZlciA+PSAweDQwICYmIHBvcnRfdHlwZSAhPSA1ICYmIHBvcnRfdHlwZSAhPSA2KQorCQlOVl9XQVJOKGRldiwgIkRDQiBJMkMgdGFibGUgaGFzIHBvcnQgdHlwZSAlZFxuIiwgcG9ydF90eXBlKTsKKworCWkyYy0+cG9ydF90eXBlID0gcG9ydF90eXBlOworCWkyYy0+cmVhZCA9IGkyY3RhYmxlW2hlYWRlcmxlbiArIHJlY29yZG9mZnNldCArIHJkb2ZzICsgZW50cnlfbGVuICogaW5kZXhdOworCWkyYy0+d3JpdGUgPSBpMmN0YWJsZVtoZWFkZXJsZW4gKyByZWNvcmRvZmZzZXQgKyB3cm9mcyArIGVudHJ5X2xlbiAqIGluZGV4XTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRjYl9ncGlvX2VudHJ5ICoKK25ld19ncGlvX2VudHJ5KHN0cnVjdCBudmJpb3MgKmJpb3MpCit7CisJc3RydWN0IHBhcnNlZF9kY2JfZ3BpbyAqZ3BpbyA9ICZiaW9zLT5iZGNiLmdwaW87CisKKwlyZXR1cm4gJmdwaW8tPmVudHJ5W2dwaW8tPmVudHJpZXMrK107Cit9CisKK3N0cnVjdCBkY2JfZ3Bpb19lbnRyeSAqCitub3V2ZWF1X2Jpb3NfZ3Bpb19lbnRyeShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBlbnVtIGRjYl9ncGlvX3RhZyB0YWcpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnZiaW9zICpiaW9zID0gJmRldl9wcml2LT5WQklPUzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBiaW9zLT5iZGNiLmdwaW8uZW50cmllczsgaSsrKSB7CisJCWlmIChiaW9zLT5iZGNiLmdwaW8uZW50cnlbaV0udGFnICE9IHRhZykKKwkJCWNvbnRpbnVlOworCisJCXJldHVybiAmYmlvcy0+YmRjYi5ncGlvLmVudHJ5W2ldOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAorcGFyc2VfZGNiMzBfZ3Bpb19lbnRyeShzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQpCit7CisJc3RydWN0IGRjYl9ncGlvX2VudHJ5ICpncGlvOworCXVpbnQxNl90IGVudCA9IFJPTTE2KGJpb3MtPmRhdGFbb2Zmc2V0XSk7CisJdWludDhfdCBsaW5lID0gZW50ICYgMHgxZiwKKwkJdGFnID0gZW50ID4+IDUgJiAweDNmLAorCQlmbGFncyA9IGVudCA+PiAxMSAmIDB4MWY7CisKKwlpZiAodGFnID09IDB4M2YpCisJCXJldHVybjsKKworCWdwaW8gPSBuZXdfZ3Bpb19lbnRyeShiaW9zKTsKKworCWdwaW8tPnRhZyA9IHRhZzsKKwlncGlvLT5saW5lID0gbGluZTsKKwlncGlvLT5pbnZlcnQgPSBmbGFncyAhPSA0OworfQorCitzdGF0aWMgdm9pZAorcGFyc2VfZGNiNDBfZ3Bpb19lbnRyeShzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQpCit7CisJc3RydWN0IGRjYl9ncGlvX2VudHJ5ICpncGlvOworCXVpbnQzMl90IGVudCA9IFJPTTMyKGJpb3MtPmRhdGFbb2Zmc2V0XSk7CisJdWludDhfdCBsaW5lID0gZW50ICYgMHgxZiwKKwkJdGFnID0gZW50ID4+IDggJiAweGZmOworCisJaWYgKHRhZyA9PSAweGZmKQorCQlyZXR1cm47CisKKwlncGlvID0gbmV3X2dwaW9fZW50cnkoYmlvcyk7CisKKwkvKiBDdXJyZW50bHkgdW51c2VkLCB3ZSBtYXkgbmVlZCBtb3JlIGZpZWxkcyBwYXJzZWQgYXQgc29tZQorCSAqIHBvaW50LiAqLworCWdwaW8tPnRhZyA9IHRhZzsKKwlncGlvLT5saW5lID0gbGluZTsKK30KKworc3RhdGljIHZvaWQKK3BhcnNlX2RjYl9ncGlvX3RhYmxlKHN0cnVjdCBudmJpb3MgKmJpb3MpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGJpb3MtPmRldjsKKwl1aW50MTZfdCBncGlvX3RhYmxlX3B0ciA9IGJpb3MtPmJkY2IuZ3Bpb190YWJsZV9wdHI7CisJdWludDhfdCAqZ3Bpb190YWJsZSA9ICZiaW9zLT5kYXRhW2dwaW9fdGFibGVfcHRyXTsKKwlpbnQgaGVhZGVyX2xlbiA9IGdwaW9fdGFibGVbMV0sCisJICAgIGVudHJpZXMgPSBncGlvX3RhYmxlWzJdLAorCSAgICBlbnRyeV9sZW4gPSBncGlvX3RhYmxlWzNdOworCXZvaWQgKCpwYXJzZV9lbnRyeSkoc3RydWN0IG52YmlvcyAqLCB1aW50MTZfdCkgPSBOVUxMOworCWludCBpOworCisJaWYgKGJpb3MtPmJkY2IudmVyc2lvbiA+PSAweDQwKSB7CisJCWlmIChncGlvX3RhYmxlX3B0ciAmJiBlbnRyeV9sZW4gIT0gNCkgeworCQkJTlZfV0FSTihkZXYsICJJbnZhbGlkIERDQiBHUElPIHRhYmxlIGVudHJ5IGxlbmd0aC5cbiIpOworCQkJcmV0dXJuOworCQl9CisKKwkJcGFyc2VfZW50cnkgPSBwYXJzZV9kY2I0MF9ncGlvX2VudHJ5OworCisJfSBlbHNlIGlmIChiaW9zLT5iZGNiLnZlcnNpb24gPj0gMHgzMCkgeworCQlpZiAoZ3Bpb190YWJsZV9wdHIgJiYgZW50cnlfbGVuICE9IDIpIHsKKwkJCU5WX1dBUk4oZGV2LCAiSW52YWxpZCBEQ0IgR1BJTyB0YWJsZSBlbnRyeSBsZW5ndGguXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXBhcnNlX2VudHJ5ID0gcGFyc2VfZGNiMzBfZ3Bpb19lbnRyeTsKKworCX0gZWxzZSBpZiAoYmlvcy0+YmRjYi52ZXJzaW9uID49IDB4MjIpIHsKKwkJLyoKKwkJICogRENCcyBvbGRlciB0aGFuIHYzLjAgZG9uJ3QgcmVhbGx5IGhhdmUgYSBHUElPCisJCSAqIHRhYmxlLCBpbnN0ZWFkIHRoZXkga2VlcCBzb21lIEdQSU8gaW5mbyBhdCBmaXhlZAorCQkgKiBsb2NhdGlvbnMuCisJCSAqLworCQl1aW50MTZfdCBkY2JwdHIgPSBST00xNihiaW9zLT5kYXRhWzB4MzZdKTsKKwkJdWludDhfdCAqdHZkYWNfZ3BpbyA9ICZiaW9zLT5kYXRhW2RjYnB0ciAtIDVdOworCisJCWlmICh0dmRhY19ncGlvWzBdICYgMSkgeworCQkJc3RydWN0IGRjYl9ncGlvX2VudHJ5ICpncGlvID0gbmV3X2dwaW9fZW50cnkoYmlvcyk7CisKKwkJCWdwaW8tPnRhZyA9IERDQl9HUElPX1RWREFDMDsKKwkJCWdwaW8tPmxpbmUgPSB0dmRhY19ncGlvWzFdID4+IDQ7CisJCQlncGlvLT5pbnZlcnQgPSB0dmRhY19ncGlvWzBdICYgMjsKKwkJfQorCX0KKworCWlmICghZ3Bpb190YWJsZV9wdHIpCisJCXJldHVybjsKKworCWlmIChlbnRyaWVzID4gRENCX01BWF9OVU1fR1BJT19FTlRSSUVTKSB7CisJCU5WX1dBUk4oZGV2LCAiVG9vIG1hbnkgZW50cmllcyBpbiB0aGUgRENCIEdQSU8gdGFibGUuXG4iKTsKKwkJZW50cmllcyA9IERDQl9NQVhfTlVNX0dQSU9fRU5UUklFUzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKQorCQlwYXJzZV9lbnRyeShiaW9zLCBncGlvX3RhYmxlX3B0ciArIGhlYWRlcl9sZW4gKyBlbnRyeV9sZW4gKiBpKTsKK30KKworc3RydWN0IGRjYl9jb25uZWN0b3JfdGFibGVfZW50cnkgKgorbm91dmVhdV9iaW9zX2Nvbm5lY3Rvcl9lbnRyeShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaW5kZXgpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnZiaW9zICpiaW9zID0gJmRldl9wcml2LT5WQklPUzsKKwlzdHJ1Y3QgZGNiX2Nvbm5lY3Rvcl90YWJsZV9lbnRyeSAqY3RlOworCisJaWYgKGluZGV4ID49IGJpb3MtPmJkY2IuY29ubmVjdG9yLmVudHJpZXMpCisJCXJldHVybiBOVUxMOworCisJY3RlID0gJmJpb3MtPmJkY2IuY29ubmVjdG9yLmVudHJ5W2luZGV4XTsKKwlpZiAoY3RlLT50eXBlID09IDB4ZmYpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGN0ZTsKK30KKworc3RhdGljIHZvaWQKK3BhcnNlX2RjYl9jb25uZWN0b3JfdGFibGUoc3RydWN0IG52YmlvcyAqYmlvcykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYmlvcy0+ZGV2OworCXN0cnVjdCBkY2JfY29ubmVjdG9yX3RhYmxlICpjdCA9ICZiaW9zLT5iZGNiLmNvbm5lY3RvcjsKKwlzdHJ1Y3QgZGNiX2Nvbm5lY3Rvcl90YWJsZV9lbnRyeSAqY3RlOworCXVpbnQ4X3QgKmNvbm50YWIgPSAmYmlvcy0+ZGF0YVtiaW9zLT5iZGNiLmNvbm5lY3Rvcl90YWJsZV9wdHJdOworCXVpbnQ4X3QgKmVudHJ5OworCWludCBpOworCisJaWYgKCFiaW9zLT5iZGNiLmNvbm5lY3Rvcl90YWJsZV9wdHIpIHsKKwkJTlZfREVCVUcoZGV2LCAiTm8gRENCIGNvbm5lY3RvciB0YWJsZSBwcmVzZW50XG4iKTsKKwkJcmV0dXJuOworCX0KKworCU5WX0lORk8oZGV2LCAiRENCIGNvbm5lY3RvciB0YWJsZTogVkhFUiAweCUwMnggJWQgJWQgJWRcbiIsCisJCWNvbm50YWJbMF0sIGNvbm50YWJbMV0sIGNvbm50YWJbMl0sIGNvbm50YWJbM10pOworCWlmICgoY29ubnRhYlswXSAhPSAweDMwICYmIGNvbm50YWJbMF0gIT0gMHg0MCkgfHwKKwkgICAgKGNvbm50YWJbM10gIT0gMiAmJiBjb25udGFiWzNdICE9IDQpKSB7CisJCU5WX0VSUk9SKGRldiwgIiAgVW5rbm93biEgIFBsZWFzZSByZXBvcnQuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWN0LT5lbnRyaWVzID0gY29ubnRhYlsyXTsKKworCWVudHJ5ID0gY29ubnRhYiArIGNvbm50YWJbMV07CisJY3RlID0gJmN0LT5lbnRyeVswXTsKKwlmb3IgKGkgPSAwOyBpIDwgY29ubnRhYlsyXTsgaSsrLCBlbnRyeSArPSBjb25udGFiWzNdLCBjdGUrKykgeworCQlpZiAoY29ubnRhYlszXSA9PSAyKQorCQkJY3RlLT5lbnRyeSA9IFJPTTE2KGVudHJ5WzBdKTsKKwkJZWxzZQorCQkJY3RlLT5lbnRyeSA9IFJPTTMyKGVudHJ5WzBdKTsKKwkJY3RlLT50eXBlICA9IChjdGUtPmVudHJ5ICYgMHgwMDAwMDBmZikgPj4gMDsKKwkJY3RlLT5pbmRleCA9IChjdGUtPmVudHJ5ICYgMHgwMDAwMGYwMCkgPj4gODsKKwkJc3dpdGNoIChjdGUtPmVudHJ5ICYgMHgwMDAzMzAwMCkgeworCQljYXNlIDB4MDAwMDEwMDA6CisJCQljdGUtPmdwaW9fdGFnID0gMHgwNzsKKwkJCWJyZWFrOworCQljYXNlIDB4MDAwMDIwMDA6CisJCQljdGUtPmdwaW9fdGFnID0gMHgwODsKKwkJCWJyZWFrOworCQljYXNlIDB4MDAwMTAwMDA6CisJCQljdGUtPmdwaW9fdGFnID0gMHg1MTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDAwMjAwMDA6CisJCQljdGUtPmdwaW9fdGFnID0gMHg1MjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY3RlLT5ncGlvX3RhZyA9IDB4ZmY7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChjdGUtPnR5cGUgPT0gMHhmZikKKwkJCWNvbnRpbnVlOworCisJCU5WX0lORk8oZGV2LCAiICAlZDogMHglMDh4OiB0eXBlIDB4JTAyeCBpZHggJWQgdGFnIDB4JTAyeFxuIiwKKwkJCWksIGN0ZS0+ZW50cnksIGN0ZS0+dHlwZSwgY3RlLT5pbmRleCwgY3RlLT5ncGlvX3RhZyk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGRjYl9lbnRyeSAqbmV3X2RjYl9lbnRyeShzdHJ1Y3QgcGFyc2VkX2RjYiAqZGNiKQoreworCXN0cnVjdCBkY2JfZW50cnkgKmVudHJ5ID0gJmRjYi0+ZW50cnlbZGNiLT5lbnRyaWVzXTsKKworCW1lbXNldChlbnRyeSwgMCwgc2l6ZW9mKHN0cnVjdCBkY2JfZW50cnkpKTsKKwllbnRyeS0+aW5kZXggPSBkY2ItPmVudHJpZXMrKzsKKworCXJldHVybiBlbnRyeTsKK30KKworc3RhdGljIHZvaWQgZmFicmljYXRlX3ZnYV9vdXRwdXQoc3RydWN0IHBhcnNlZF9kY2IgKmRjYiwgaW50IGkyYywgaW50IGhlYWRzKQoreworCXN0cnVjdCBkY2JfZW50cnkgKmVudHJ5ID0gbmV3X2RjYl9lbnRyeShkY2IpOworCisJZW50cnktPnR5cGUgPSAwOworCWVudHJ5LT5pMmNfaW5kZXggPSBpMmM7CisJZW50cnktPmhlYWRzID0gaGVhZHM7CisJZW50cnktPmxvY2F0aW9uID0gRENCX0xPQ19PTl9DSElQOworCS8qICJvciIgbW9zdGx5IHVudXNlZCBpbiBlYXJseSBnZW4gY3J0IG1vZGVzZXR0aW5nLCAwIGlzIGZpbmUgKi8KK30KKworc3RhdGljIHZvaWQgZmFicmljYXRlX2R2aV9pX291dHB1dChzdHJ1Y3QgcGFyc2VkX2RjYiAqZGNiLCBib29sIHR3b0hlYWRzKQoreworCXN0cnVjdCBkY2JfZW50cnkgKmVudHJ5ID0gbmV3X2RjYl9lbnRyeShkY2IpOworCisJZW50cnktPnR5cGUgPSAyOworCWVudHJ5LT5pMmNfaW5kZXggPSBMRUdBQ1lfSTJDX1BBTkVMOworCWVudHJ5LT5oZWFkcyA9IHR3b0hlYWRzID8gMyA6IDE7CisJZW50cnktPmxvY2F0aW9uID0gIURDQl9MT0NfT05fQ0hJUDsJLyogaWUgT0ZGIENISVAgKi8KKwllbnRyeS0+b3IgPSAxOwkvKiBtZWFucyB8MHgxMCBnZXRzIHNldCBvbiBDUkVfTENEX19JTkRFWCAqLworCWVudHJ5LT5kdWFsbGlua19wb3NzaWJsZSA9IGZhbHNlOyAvKiBTaUkxNjQgYW5kIGNvLiBhcmUgc2luZ2xlIGxpbmsgKi8KKworI2lmIDAKKwkvKgorCSAqIEZvciBkdmktYSBlaXRoZXIgY3J0YyBwcm9iYWJseSB3b3JrcywgYnV0IG15IGNhcmQgYXBwZWFycyB0byBvbmx5CisJICogc3VwcG9ydCBkdmktZC4gICJudmlkaWEiIHN0aWxsIGF0dGVtcHRzIHRvIHByb2dyYW0gaXQgZm9yIGR2aS1hLAorCSAqIGRvaW5nIHRoZSBmdWxsIGZwIG91dHB1dCBzZXR1cCAocHJvZ3JhbSAweDY4MDguLiBmcCBkaW1lbnNpb24gcmVncywKKwkgKiBzZXR0aW5nIDB4NjgwODQ4IHRvIDB4MTAwMDAxMTEgdG8gZW5hYmxlLCBtYXliZSBzZXR0aW5nIDB4NjgwODgwKTsKKwkgKiB0aGUgbW9uaXRvciBwaWNrcyB1cCB0aGUgbW9kZSByZXMgb2sgYW5kIGxpZ2h0cyB1cCwgYnV0IG5vIHBpeGVsCisJICogZGF0YSBhcHBlYXJzLCBzbyB0aGUgYm9hcmQgbWFudWZhY3R1cmVyIHByb2JhYmx5IGNvbm5lY3RlZCB1cCB0aGUKKwkgKiBzeW5jIGxpbmVzLCBidXQgbWlzc2VkIHRoZSB2aWRlbyB0cmFjZXMgLyBjb21wb25lbnRzCisJICoKKwkgKiB3aXRoIHRoaXMgaW50cm9kdWN0aW9uLCBkdmktYSBsZWZ0IGFzIGFuIGV4ZXJjaXNlIGZvciB0aGUgcmVhZGVyLgorCSAqLworCWZhYnJpY2F0ZV92Z2Ffb3V0cHV0KGRjYiwgTEVHQUNZX0kyQ19QQU5FTCwgZW50cnktPmhlYWRzKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBmYWJyaWNhdGVfdHZfb3V0cHV0KHN0cnVjdCBwYXJzZWRfZGNiICpkY2IsIGJvb2wgdHdvSGVhZHMpCit7CisJc3RydWN0IGRjYl9lbnRyeSAqZW50cnkgPSBuZXdfZGNiX2VudHJ5KGRjYik7CisKKwllbnRyeS0+dHlwZSA9IDE7CisJZW50cnktPmkyY19pbmRleCA9IExFR0FDWV9JMkNfVFY7CisJZW50cnktPmhlYWRzID0gdHdvSGVhZHMgPyAzIDogMTsKKwllbnRyeS0+bG9jYXRpb24gPSAhRENCX0xPQ19PTl9DSElQOwkvKiBpZSBPRkYgQ0hJUCAqLworfQorCitzdGF0aWMgYm9vbAorcGFyc2VfZGNiMjBfZW50cnkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGJpb3NfcGFyc2VkX2RjYiAqYmRjYiwKKwkJICB1aW50MzJfdCBjb25uLCB1aW50MzJfdCBjb25mLCBzdHJ1Y3QgZGNiX2VudHJ5ICplbnRyeSkKK3sKKwllbnRyeS0+dHlwZSA9IGNvbm4gJiAweGY7CisJZW50cnktPmkyY19pbmRleCA9IChjb25uID4+IDQpICYgMHhmOworCWVudHJ5LT5oZWFkcyA9IChjb25uID4+IDgpICYgMHhmOworCWlmIChiZGNiLT52ZXJzaW9uID49IDB4NDApCisJCWVudHJ5LT5jb25uZWN0b3IgPSAoY29ubiA+PiAxMikgJiAweGY7CisJZW50cnktPmJ1cyA9IChjb25uID4+IDE2KSAmIDB4ZjsKKwllbnRyeS0+bG9jYXRpb24gPSAoY29ubiA+PiAyMCkgJiAweDM7CisJZW50cnktPm9yID0gKGNvbm4gPj4gMjQpICYgMHhmOworCS8qCisJICogTm9ybWFsIGVudHJpZXMgY29uc2lzdCBvZiBhIHNpbmdsZSBiaXQsIGJ1dCBkdWFsIGxpbmsgaGFzIHRoZQorCSAqIG5leHQgbW9zdCBzaWduaWZpY2FudCBiaXQgc2V0IHRvbworCSAqLworCWVudHJ5LT5kdWFsbGlua19wb3NzaWJsZSA9CisJCQkoKDEgPDwgKGZmcyhlbnRyeS0+b3IpIC0gMSkpICogMyA9PSBlbnRyeS0+b3IpOworCisJc3dpdGNoIChlbnRyeS0+dHlwZSkgeworCWNhc2UgT1VUUFVUX0FOQUxPRzoKKwkJLyoKKwkJICogQWx0aG91Z2ggdGhlIHJlc3Qgb2YgYSBDUlQgY29uZiBkd29yZCBpcyB1c3VhbGx5CisJCSAqIHplcm9zLCBtYWMgYmlvc2VuIGhhdmUgc3R1ZmYgdGhlcmUgc28gd2UgbXVzdCBtYXNrCisJCSAqLworCQllbnRyeS0+Y3J0Y29uZi5tYXhmcmVxID0gKGJkY2ItPnZlcnNpb24gPCAweDMwKSA/CisJCQkJCSAoY29uZiAmIDB4ZmZmZikgKiAxMCA6CisJCQkJCSAoY29uZiAmIDB4ZmYpICogMTAwMDA7CisJCWJyZWFrOworCWNhc2UgT1VUUFVUX0xWRFM6CisJCXsKKwkJdWludDMyX3QgbWFzazsKKwkJaWYgKGNvbmYgJiAweDEpCisJCQllbnRyeS0+bHZkc2NvbmYudXNlX3N0cmFwc19mb3JfbW9kZSA9IHRydWU7CisJCWlmIChiZGNiLT52ZXJzaW9uIDwgMHgyMikgeworCQkJbWFzayA9IH4weGQ7CisJCQkvKgorCQkJICogVGhlIGxhcHRvcCBpbiBidWcgMTQ1NjcgbGllcyBhbmQgY2xhaW1zIHRvIG5vdCB1c2UKKwkJCSAqIHN0cmFwcyB3aGVuIGl0IGRvZXMsIHNvIGFzc3VtZSBhbGwgRENCIDIuMCBsYXB0b3BzCisJCQkgKiB1c2Ugc3RyYXBzLCB1bnRpbCBhIGJyb2tlbiBFRElEIHVzaW5nIG9uZSBpcyBwcm9kdWNlZAorCQkJICovCisJCQllbnRyeS0+bHZkc2NvbmYudXNlX3N0cmFwc19mb3JfbW9kZSA9IHRydWU7CisJCQkvKgorCQkJICogQm90aCAweDQgYW5kIDB4OCBzaG93IHVwIGluIHYyLjAgdGFibGVzOyBhc3N1bWUgdGhleQorCQkJICogbWVhbiB0aGUgc2FtZSB0aGluZyAocHJvYmFibHkgd3JvbmcsIGJ1dCBtaWdodCB3b3JrKQorCQkJICovCisJCQlpZiAoY29uZiAmIDB4NCB8fCBjb25mICYgMHg4KQorCQkJCWVudHJ5LT5sdmRzY29uZi51c2VfcG93ZXJfc2NyaXB0cyA9IHRydWU7CisJCX0gZWxzZSB7CisJCQltYXNrID0gfjB4NTsKKwkJCWlmIChjb25mICYgMHg0KQorCQkJCWVudHJ5LT5sdmRzY29uZi51c2VfcG93ZXJfc2NyaXB0cyA9IHRydWU7CisJCX0KKwkJaWYgKGNvbmYgJiBtYXNrKSB7CisJCQkvKgorCQkJICogVW50aWwgd2UgZXZlbiB0cnkgdG8gdXNlIHRoZXNlIG9uIEc4eCwgaXQncworCQkJICogdXNlbGVzcyByZXBvcnRpbmcgdW5rbm93biBiaXRzLiAgVGhleSBhbGwgYXJlLgorCQkJICovCisJCQlpZiAoYmRjYi0+dmVyc2lvbiA+PSAweDQwKQorCQkJCWJyZWFrOworCisJCQlOVl9FUlJPUihkZXYsICJVbmtub3duIExWRFMgY29uZmlndXJhdGlvbiBiaXRzLCAiCisJCQkJICAgICAgInBsZWFzZSByZXBvcnRcbiIpOworCQl9CisJCWJyZWFrOworCQl9CisJY2FzZSBPVVRQVVRfVFY6CisJeworCQlpZiAoYmRjYi0+dmVyc2lvbiA+PSAweDMwKQorCQkJZW50cnktPnR2Y29uZi5oYXNfY29tcG9uZW50X291dHB1dCA9IGNvbmYgJiAoMHg4IDw8IDQpOworCQllbHNlCisJCQllbnRyeS0+dHZjb25mLmhhc19jb21wb25lbnRfb3V0cHV0ID0gZmFsc2U7CisKKwkJYnJlYWs7CisJfQorCWNhc2UgT1VUUFVUX0RQOgorCQllbnRyeS0+ZHBjb25mLnNvci5saW5rID0gKGNvbmYgJiAweDAwMDAwMDMwKSA+PiA0OworCQllbnRyeS0+ZHBjb25mLmxpbmtfYncgPSAoY29uZiAmIDB4MDBlMDAwMDApID4+IDIxOworCQlzd2l0Y2ggKChjb25mICYgMHgwZjAwMDAwMCkgPj4gMjQpIHsKKwkJY2FzZSAweGY6CisJCQllbnRyeS0+ZHBjb25mLmxpbmtfbnIgPSA0OworCQkJYnJlYWs7CisJCWNhc2UgMHgzOgorCQkJZW50cnktPmRwY29uZi5saW5rX25yID0gMjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZW50cnktPmRwY29uZi5saW5rX25yID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgT1VUUFVUX1RNRFM6CisJCWVudHJ5LT50bWRzY29uZi5zb3IubGluayA9IChjb25mICYgMHgwMDAwMDAzMCkgPj4gNDsKKwkJYnJlYWs7CisJY2FzZSAweGU6CisJCS8qIHdlaXJkIGc4MCBtb2JpbGUgdHlwZSB0aGF0ICJudiIgdHJlYXRzIGFzIGEgdGVybWluYXRvciAqLworCQliZGNiLT5kY2IuZW50cmllcy0tOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyogdW5zdXJlIHdoYXQgRENCIHZlcnNpb24gaW50cm9kdWNlcyB0aGlzLCAzLjA/ICovCisJaWYgKGNvbmYgJiAweDEwMDAwMCkKKwkJZW50cnktPmkyY191cHBlcl9kZWZhdWx0ID0gdHJ1ZTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbAorcGFyc2VfZGNiMTVfZW50cnkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IHBhcnNlZF9kY2IgKmRjYiwKKwkJICB1aW50MzJfdCBjb25uLCB1aW50MzJfdCBjb25mLCBzdHJ1Y3QgZGNiX2VudHJ5ICplbnRyeSkKK3sKKwlpZiAoY29ubiAhPSAweGYwMDAzZjAwICYmIGNvbm4gIT0gMHhmMjI0N2YxMCAmJiBjb25uICE9IDB4ZjIyMDQwMDEgJiYKKwkgICAgY29ubiAhPSAweGYyMjA0MzAxICYmIGNvbm4gIT0gMHhmMjIwNDMxMSAmJiBjb25uICE9IDB4ZjIyMDgwMDEgJiYKKwkgICAgY29ubiAhPSAweGYyMjQ0MDAxICYmIGNvbm4gIT0gMHhmMjI0NDMwMSAmJiBjb25uICE9IDB4ZjIyNDQzMTEgJiYKKwkgICAgY29ubiAhPSAweGY0MjA0MDExICYmIGNvbm4gIT0gMHhmNDIwODAxMSAmJiBjb25uICE9IDB4ZjQyNDgwMTEgJiYKKwkgICAgY29ubiAhPSAweGYyMDQ1ZmYyICYmIGNvbm4gIT0gMHhmMjA0NWYxNCAmJiBjb25uICE9IDB4ZjIwN2RmMTQgJiYKKwkgICAgY29ubiAhPSAweGYyMjA1MDA0ICYmIGNvbm4gIT0gMHhmMjIwOTAwNCkgeworCQlOVl9FUlJPUihkZXYsICJVbmtub3duIERDQiAxLjUgZW50cnksIHBsZWFzZSByZXBvcnRcbiIpOworCisJCS8qIGNhdXNlIG91dHB1dCBzZXR0aW5nIHRvIGZhaWwgZm9yICFUViwgc28gbWVzc2FnZSBpcyBzZWVuICovCisJCWlmICgoY29ubiAmIDB4ZikgIT0gMHgxKQorCQkJZGNiLT5lbnRyaWVzID0gMDsKKworCQlyZXR1cm4gZmFsc2U7CisJfQorCS8qIG1vc3Qgb2YgdGhlIGJlbG93IGlzIGEgImJlc3QgZ3Vlc3MiIGF0bSAqLworCWVudHJ5LT50eXBlID0gY29ubiAmIDB4ZjsKKwlpZiAoZW50cnktPnR5cGUgPT0gMikKKwkJLyogYW5vdGhlciB3YXkgb2Ygc3BlY2lmeWluZyBzdHJhcHMgYmFzZWQgbHZkcy4uLiAqLworCQllbnRyeS0+dHlwZSA9IE9VVFBVVF9MVkRTOworCWlmIChlbnRyeS0+dHlwZSA9PSA0KSB7IC8qIGRpZ2l0YWwgKi8KKwkJaWYgKGNvbm4gJiAweDEwKQorCQkJZW50cnktPnR5cGUgPSBPVVRQVVRfTFZEUzsKKwkJZWxzZQorCQkJZW50cnktPnR5cGUgPSBPVVRQVVRfVE1EUzsKKwl9CisJLyogd2hhdCdzIGluIGJpdHMgNS0xMz8gY291bGQgYmUgc29tZSBlbmNvZGVyIG1ha2VyIHRoaW5nLCBpbiB0diBjYXNlICovCisJZW50cnktPmkyY19pbmRleCA9IChjb25uID4+IDE0KSAmIDB4ZjsKKwkvKiByYXcgaGVhZHMgZmllbGQgaXMgaW4gcmFuZ2UgMC0xLCBzbyBtb3ZlIHRvIDEtMiAqLworCWVudHJ5LT5oZWFkcyA9ICgoY29ubiA+PiAxOCkgJiAweDcpICsgMTsKKwllbnRyeS0+bG9jYXRpb24gPSAoY29ubiA+PiAyMSkgJiAweGY7CisJLyogdW51c2VkOiBlbnRyeS0+YnVzID0gKGNvbm4gPj4gMjUpICYgMHg3OyAqLworCS8qIHNldCBvciB0byBiZSBzYW1lIGFzIGhlYWRzIC0tIGhvcGVmdWxseSBzYWZlIGVub3VnaCAqLworCWVudHJ5LT5vciA9IGVudHJ5LT5oZWFkczsKKwllbnRyeS0+ZHVhbGxpbmtfcG9zc2libGUgPSBmYWxzZTsKKworCXN3aXRjaCAoZW50cnktPnR5cGUpIHsKKwljYXNlIE9VVFBVVF9BTkFMT0c6CisJCWVudHJ5LT5jcnRjb25mLm1heGZyZXEgPSAoY29uZiAmIDB4ZmZmZikgKiAxMDsKKwkJYnJlYWs7CisJY2FzZSBPVVRQVVRfTFZEUzoKKwkJLyoKKwkJICogVGhpcyBpcyBwcm9iYWJseSBidXJpZWQgaW4gY29ubidzIHVua25vd24gYml0cy4KKwkJICogVGhpcyB3aWxsIHVwc2V0IEVESUQtZnVsIG1vZGVscywgaWYgdGhleSBleGlzdAorCQkgKi8KKwkJZW50cnktPmx2ZHNjb25mLnVzZV9zdHJhcHNfZm9yX21vZGUgPSB0cnVlOworCQllbnRyeS0+bHZkc2NvbmYudXNlX3Bvd2VyX3NjcmlwdHMgPSB0cnVlOworCQlicmVhazsKKwljYXNlIE9VVFBVVF9UTURTOgorCQkvKgorCQkgKiBJbnZlbnQgYSBEVkktQSBvdXRwdXQsIGJ5IGNvcHlpbmcgdGhlIGZpZWxkcyBvZiB0aGUgRFZJLUQKKwkJICogb3V0cHV0OyByZXBvcnRlZCB0byB3b3JrIGJ5IG1hdGhfYiBvbiBhbiBOVjIwKCEpLgorCQkgKi8KKwkJZmFicmljYXRlX3ZnYV9vdXRwdXQoZGNiLCBlbnRyeS0+aTJjX2luZGV4LCBlbnRyeS0+aGVhZHMpOworCQlicmVhazsKKwljYXNlIE9VVFBVVF9UVjoKKwkJZW50cnktPnR2Y29uZi5oYXNfY29tcG9uZW50X291dHB1dCA9IGZhbHNlOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgcGFyc2VfZGNiX2VudHJ5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBiaW9zX3BhcnNlZF9kY2IgKmJkY2IsCisJCQkgICAgdWludDMyX3QgY29ubiwgdWludDMyX3QgY29uZikKK3sKKwlzdHJ1Y3QgZGNiX2VudHJ5ICplbnRyeSA9IG5ld19kY2JfZW50cnkoJmJkY2ItPmRjYik7CisJYm9vbCByZXQ7CisKKwlpZiAoYmRjYi0+dmVyc2lvbiA+PSAweDIwKQorCQlyZXQgPSBwYXJzZV9kY2IyMF9lbnRyeShkZXYsIGJkY2IsIGNvbm4sIGNvbmYsIGVudHJ5KTsKKwllbHNlCisJCXJldCA9IHBhcnNlX2RjYjE1X2VudHJ5KGRldiwgJmJkY2ItPmRjYiwgY29ubiwgY29uZiwgZW50cnkpOworCWlmICghcmV0KQorCQlyZXR1cm4gcmV0OworCisJcmVhZF9kY2JfaTJjX2VudHJ5KGRldiwgYmRjYi0+dmVyc2lvbiwgYmRjYi0+aTJjX3RhYmxlLAorCQkJICAgZW50cnktPmkyY19pbmRleCwgJmJkY2ItPmRjYi5pMmNbZW50cnktPmkyY19pbmRleF0pOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYwordm9pZCBtZXJnZV9saWtlX2RjYl9lbnRyaWVzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBwYXJzZWRfZGNiICpkY2IpCit7CisJLyoKKwkgKiBEQ0IgdjIuMCBsaXN0cyBlYWNoIG91dHB1dCBjb21iaW5hdGlvbiBzZXBhcmF0ZWx5LgorCSAqIEhlcmUgd2UgbWVyZ2UgY29tcGF0aWJsZSBlbnRyaWVzIHRvIGhhdmUgZmV3ZXIgb3V0cHV0cywgd2l0aAorCSAqIG1vcmUgb3B0aW9ucworCSAqLworCisJaW50IGksIG5ld2VudHJpZXMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGRjYi0+ZW50cmllczsgaSsrKSB7CisJCXN0cnVjdCBkY2JfZW50cnkgKmllbnQgPSAmZGNiLT5lbnRyeVtpXTsKKwkJaW50IGo7CisKKwkJZm9yIChqID0gaSArIDE7IGogPCBkY2ItPmVudHJpZXM7IGorKykgeworCQkJc3RydWN0IGRjYl9lbnRyeSAqamVudCA9ICZkY2ItPmVudHJ5W2pdOworCisJCQlpZiAoamVudC0+dHlwZSA9PSAxMDApIC8qIGFscmVhZHkgbWVyZ2VkIGVudHJ5ICovCisJCQkJY29udGludWU7CisKKwkJCS8qIG1lcmdlIGhlYWRzIGZpZWxkIHdoZW4gYWxsIG90aGVyIGZpZWxkcyB0aGUgc2FtZSAqLworCQkJaWYgKGplbnQtPmkyY19pbmRleCA9PSBpZW50LT5pMmNfaW5kZXggJiYKKwkJCSAgICBqZW50LT50eXBlID09IGllbnQtPnR5cGUgJiYKKwkJCSAgICBqZW50LT5sb2NhdGlvbiA9PSBpZW50LT5sb2NhdGlvbiAmJgorCQkJICAgIGplbnQtPm9yID09IGllbnQtPm9yKSB7CisJCQkJTlZfVFJBQ0UoZGV2LCAiTWVyZ2luZyBEQ0IgZW50cmllcyAlZCBhbmQgJWRcbiIsCisJCQkJCSBpLCBqKTsKKwkJCQlpZW50LT5oZWFkcyB8PSBqZW50LT5oZWFkczsKKwkJCQlqZW50LT50eXBlID0gMTAwOyAvKiBkdW1teSB2YWx1ZSAqLworCQkJfQorCQl9CisJfQorCisJLyogQ29tcGFjdCBlbnRyaWVzIG1lcmdlZCBpbnRvIG90aGVycyBvdXQgb2YgZGNiICovCisJZm9yIChpID0gMDsgaSA8IGRjYi0+ZW50cmllczsgaSsrKSB7CisJCWlmIChkY2ItPmVudHJ5W2ldLnR5cGUgPT0gMTAwKQorCQkJY29udGludWU7CisKKwkJaWYgKG5ld2VudHJpZXMgIT0gaSkgeworCQkJZGNiLT5lbnRyeVtuZXdlbnRyaWVzXSA9IGRjYi0+ZW50cnlbaV07CisJCQlkY2ItPmVudHJ5W25ld2VudHJpZXNdLmluZGV4ID0gbmV3ZW50cmllczsKKwkJfQorCQluZXdlbnRyaWVzKys7CisJfQorCisJZGNiLT5lbnRyaWVzID0gbmV3ZW50cmllczsKK30KKworc3RhdGljIGludCBwYXJzZV9kY2JfdGFibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG52YmlvcyAqYmlvcywgYm9vbCB0d29IZWFkcykKK3sKKwlzdHJ1Y3QgYmlvc19wYXJzZWRfZGNiICpiZGNiID0gJmJpb3MtPmJkY2I7CisJc3RydWN0IHBhcnNlZF9kY2IgKmRjYjsKKwl1aW50MTZfdCBkY2JwdHIsIGkyY3RhYnB0ciA9IDA7CisJdWludDhfdCAqZGNidGFibGU7CisJdWludDhfdCBoZWFkZXJsZW4gPSAweDQsIGVudHJpZXMgPSBEQ0JfTUFYX05VTV9FTlRSSUVTOworCWJvb2wgY29uZmlnYmxvY2sgPSB0cnVlOworCWludCByZWNvcmRsZW5ndGggPSA4LCBjb25mb2ZzID0gNDsKKwlpbnQgaTsKKworCWRjYiA9IGJpb3MtPnB1Yi5kY2IgPSAmYmRjYi0+ZGNiOworCWRjYi0+ZW50cmllcyA9IDA7CisKKwkvKiBnZXQgdGhlIG9mZnNldCBmcm9tIDB4MzYgKi8KKwlkY2JwdHIgPSBST00xNihiaW9zLT5kYXRhWzB4MzZdKTsKKworCWlmIChkY2JwdHIgPT0gMHgwKSB7CisJCU5WX1dBUk4oZGV2LCAiTm8gb3V0cHV0IGRhdGEgKERDQikgZm91bmQgaW4gQklPUywgIgorCQkJICAgICAgICJhc3N1bWluZyBhIENSVCBvdXRwdXQgZXhpc3RzXG4iKTsKKwkJLyogdGhpcyBzaXR1YXRpb24gbGlrZWx5IG1lYW5zIGEgcmVhbGx5IG9sZCBjYXJkLCBwcmUgRENCICovCisJCWZhYnJpY2F0ZV92Z2Ffb3V0cHV0KGRjYiwgTEVHQUNZX0kyQ19DUlQsIDEpOworCisJCWlmIChudjA0X3R2X2lkZW50aWZ5KGRldiwKKwkJCQkgICAgIGJpb3MtPmxlZ2FjeS5pMmNfaW5kaWNlcy50dikgPj0gMCkKKwkJCWZhYnJpY2F0ZV90dl9vdXRwdXQoZGNiLCB0d29IZWFkcyk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJZGNidGFibGUgPSAmYmlvcy0+ZGF0YVtkY2JwdHJdOworCisJLyogZ2V0IERDQiB2ZXJzaW9uICovCisJYmRjYi0+dmVyc2lvbiA9IGRjYnRhYmxlWzBdOworCU5WX1RSQUNFKGRldiwgIkZvdW5kIERpc3BsYXkgQ29uZmlndXJhdGlvbiBCbG9jayB2ZXJzaW9uICVkLiVkXG4iLAorCQkgYmRjYi0+dmVyc2lvbiA+PiA0LCBiZGNiLT52ZXJzaW9uICYgMHhmKTsKKworCWlmIChiZGNiLT52ZXJzaW9uID49IDB4MjApIHsgLyogTlYxNysgKi8KKwkJdWludDMyX3Qgc2lnOworCisJCWlmIChiZGNiLT52ZXJzaW9uID49IDB4MzApIHsgLyogTlY0MCsgKi8KKwkJCWhlYWRlcmxlbiA9IGRjYnRhYmxlWzFdOworCQkJZW50cmllcyA9IGRjYnRhYmxlWzJdOworCQkJcmVjb3JkbGVuZ3RoID0gZGNidGFibGVbM107CisJCQlpMmN0YWJwdHIgPSBST00xNihkY2J0YWJsZVs0XSk7CisJCQlzaWcgPSBST00zMihkY2J0YWJsZVs2XSk7CisJCQliZGNiLT5ncGlvX3RhYmxlX3B0ciA9IFJPTTE2KGRjYnRhYmxlWzEwXSk7CisJCQliZGNiLT5jb25uZWN0b3JfdGFibGVfcHRyID0gUk9NMTYoZGNidGFibGVbMjBdKTsKKwkJfSBlbHNlIHsKKwkJCWkyY3RhYnB0ciA9IFJPTTE2KGRjYnRhYmxlWzJdKTsKKwkJCXNpZyA9IFJPTTMyKGRjYnRhYmxlWzRdKTsKKwkJCWhlYWRlcmxlbiA9IDg7CisJCX0KKworCQlpZiAoc2lnICE9IDB4NGVkY2JkY2IpIHsKKwkJCU5WX0VSUk9SKGRldiwgIkJhZCBEaXNwbGF5IENvbmZpZ3VyYXRpb24gQmxvY2sgIgorCQkJCQkic2lnbmF0dXJlICglMDhYKVxuIiwgc2lnKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIGlmIChiZGNiLT52ZXJzaW9uID49IDB4MTUpIHsgLyogc29tZSBOVjExIGFuZCBOVjIwICovCisJCWNoYXIgc2lnWzhdID0geyAwIH07CisKKwkJc3RybmNweShzaWcsIChjaGFyICopJmRjYnRhYmxlWy03XSwgNyk7CisJCWkyY3RhYnB0ciA9IFJPTTE2KGRjYnRhYmxlWzJdKTsKKwkJcmVjb3JkbGVuZ3RoID0gMTA7CisJCWNvbmZvZnMgPSA2OworCisJCWlmIChzdHJjbXAoc2lnLCAiREVWX1JFQyIpKSB7CisJCQlOVl9FUlJPUihkZXYsICJCYWQgRGlzcGxheSBDb25maWd1cmF0aW9uIEJsb2NrICIKKwkJCQkJInNpZ25hdHVyZSAoJXMpXG4iLCBzaWcpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiB2MS40IChzb21lIE5WMTUvMTYsIE5WMTErKSBzZWVtcyB0aGUgc2FtZSBhcyB2MS41LCBidXQgYWx3YXlzCisJCSAqIGhhcyB0aGUgc2FtZSBzaW5nbGUgKGNydCkgZW50cnksIGV2ZW4gd2hlbiB0di1vdXQgcHJlc2VudCwgc28KKwkJICogdGhlIGNvbmNsdXNpb24gaXMgdGhpcyB2ZXJzaW9uIGNhbm5vdCByZWFsbHkgYmUgdXNlZC4KKwkJICogdjEuMiB0YWJsZXMgKHNvbWUgTlY2LzEwLCBhbmQgTlYxNSspIG5vcm1hbGx5IGhhdmUgdGhlIHNhbWUKKwkJICogNSBlbnRyaWVzLCB3aGljaCBhcmUgbm90IHNwZWNpZmljIHRvIHRoZSBjYXJkIGFuZCBzbyBubyB1c2UuCisJCSAqIHYxLjIgZG9lcyBoYXZlIGFuIEkyQyB0YWJsZSB0aGF0IHJlYWRfZGNiX2kyY190YWJsZSBjYW4KKwkJICogaGFuZGxlLCBidXQgY2FyZHMgZXhpc3QgKG52MTEgaW4gIzE0ODIxKSB3aXRoIGEgYmFkIGkyYyB0YWJsZQorCQkgKiBwb2ludGVyLCBzbyB1c2UgdGhlIGluZGljZXMgcGFyc2VkIGluIHBhcnNlX2JtcF9zdHJ1Y3R1cmUuCisJCSAqIHYxLjEgKE5WNSssIG1heWJlIHNvbWUgTlY0KSBpcyBlbnRpcmVseSB1bmhlbHBmdWwKKwkJICovCisJCU5WX1RSQUNFV0FSTihkZXYsICJObyB1c2VmdWwgaW5mb3JtYXRpb24gaW4gQklPUyBvdXRwdXQgdGFibGU7ICIKKwkJCQkgICJhZGRpbmcgYWxsIHBvc3NpYmxlIG91dHB1dHNcbiIpOworCQlmYWJyaWNhdGVfdmdhX291dHB1dChkY2IsIExFR0FDWV9JMkNfQ1JULCAxKTsKKworCQkvKgorCQkgKiBBdHRlbXB0IHRvIGRldGVjdCBUViBiZWZvcmUgRFZJIGJlY2F1c2UgdGhlIHRlc3QKKwkJICogZm9yIHRoZSBmb3JtZXIgaXMgbW9yZSBhY2N1cmF0ZSBhbmQgaXQgcnVsZXMgdGhlCisJCSAqIGxhdHRlciBvdXQuCisJCSAqLworCQlpZiAobnYwNF90dl9pZGVudGlmeShkZXYsCisJCQkJICAgICBiaW9zLT5sZWdhY3kuaTJjX2luZGljZXMudHYpID49IDApCisJCQlmYWJyaWNhdGVfdHZfb3V0cHV0KGRjYiwgdHdvSGVhZHMpOworCisJCWVsc2UgaWYgKGJpb3MtPnRtZHMub3V0cHV0MF9zY3JpcHRfcHRyIHx8CisJCQkgYmlvcy0+dG1kcy5vdXRwdXQxX3NjcmlwdF9wdHIpCisJCQlmYWJyaWNhdGVfZHZpX2lfb3V0cHV0KGRjYiwgdHdvSGVhZHMpOworCisJCXJldHVybiAwOworCX0KKworCWlmICghaTJjdGFicHRyKQorCQlOVl9XQVJOKGRldiwgIk5vIHBvaW50ZXIgdG8gRENCIEkyQyBwb3J0IHRhYmxlXG4iKTsKKwllbHNlIHsKKwkJYmRjYi0+aTJjX3RhYmxlID0gJmJpb3MtPmRhdGFbaTJjdGFicHRyXTsKKwkJaWYgKGJkY2ItPnZlcnNpb24gPj0gMHgzMCkKKwkJCWJkY2ItPmkyY19kZWZhdWx0X2luZGljZXMgPSBiZGNiLT5pMmNfdGFibGVbNF07CisJfQorCisJcGFyc2VfZGNiX2dwaW9fdGFibGUoYmlvcyk7CisJcGFyc2VfZGNiX2Nvbm5lY3Rvcl90YWJsZShiaW9zKTsKKworCWlmIChlbnRyaWVzID4gRENCX01BWF9OVU1fRU5UUklFUykKKwkJZW50cmllcyA9IERDQl9NQVhfTlVNX0VOVFJJRVM7CisKKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7CisJCXVpbnQzMl90IGNvbm5lY3Rpb24sIGNvbmZpZyA9IDA7CisKKwkJY29ubmVjdGlvbiA9IFJPTTMyKGRjYnRhYmxlW2hlYWRlcmxlbiArIHJlY29yZGxlbmd0aCAqIGldKTsKKwkJaWYgKGNvbmZpZ2Jsb2NrKQorCQkJY29uZmlnID0gUk9NMzIoZGNidGFibGVbaGVhZGVybGVuICsgY29uZm9mcyArIHJlY29yZGxlbmd0aCAqIGldKTsKKworCQkvKiBzZWVuIG9uIGFuIE5WMTEgd2l0aCBEQ0IgdjEuNSAqLworCQlpZiAoY29ubmVjdGlvbiA9PSAweDAwMDAwMDAwKQorCQkJYnJlYWs7CisKKwkJLyogc2VlbiBvbiBhbiBOVjE3IHdpdGggRENCIHYyLjAgKi8KKwkJaWYgKGNvbm5lY3Rpb24gPT0gMHhmZmZmZmZmZikKKwkJCWJyZWFrOworCisJCWlmICgoY29ubmVjdGlvbiAmIDB4MDAwMDAwMGYpID09IDB4MDAwMDAwMGYpCisJCQljb250aW51ZTsKKworCQlOVl9UUkFDRVdBUk4oZGV2LCAiUmF3IERDQiBlbnRyeSAlZDogJTA4eCAlMDh4XG4iLAorCQkJICAgICBkY2ItPmVudHJpZXMsIGNvbm5lY3Rpb24sIGNvbmZpZyk7CisKKwkJaWYgKCFwYXJzZV9kY2JfZW50cnkoZGV2LCBiZGNiLCBjb25uZWN0aW9uLCBjb25maWcpKQorCQkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBhcGFydCBmb3IgdjIuMSsgbm90IGJlaW5nIGtub3duIGZvciByZXF1aXJpbmcgbWVyZ2luZywgdGhpcworCSAqIGd1YXJhbnRlZXMgZGNiZW50LT5pbmRleCBpcyB0aGUgaW5kZXggb2YgdGhlIGVudHJ5IGluIHRoZSByb20gaW1hZ2UKKwkgKi8KKwlpZiAoYmRjYi0+dmVyc2lvbiA8IDB4MjEpCisJCW1lcmdlX2xpa2VfZGNiX2VudHJpZXMoZGV2LCBkY2IpOworCisJcmV0dXJuIGRjYi0+ZW50cmllcyA/IDAgOiAtRU5YSU87Cit9CisKK3N0YXRpYyB2b2lkCitmaXh1cF9sZWdhY3lfY29ubmVjdG9yKHN0cnVjdCBudmJpb3MgKmJpb3MpCit7CisJc3RydWN0IGJpb3NfcGFyc2VkX2RjYiAqYmRjYiA9ICZiaW9zLT5iZGNiOworCXN0cnVjdCBwYXJzZWRfZGNiICpkY2IgPSAmYmRjYi0+ZGNiOworCWludCBoaWdoID0gMCwgaTsKKworCS8qCisJICogRENCIDMuMCBhbHNvIGhhcyB0aGUgdGFibGUgaW4gbW9zdCBjYXNlcywgYnV0IHRoZXJlIGFyZSBzb21lIGNhcmRzCisJICogd2hlcmUgdGhlIHRhYmxlIGlzIGZpbGxlZCB3aXRoIHN0dWIgZW50cmllcywgYW5kIHRoZSBEQ0IgZW50cml5CisJICogaW5kaWNlcyBhcmUgYWxsIDAuICBXZSBkb24ndCBuZWVkIHRoZSBjb25uZWN0b3IgaW5kaWNlcyBvbiBwcmUtRzgwCisJICogY2hpcHMgKHlldD8pIHNvIGxpbWl0IHRoZSB1c2UgdG8gRENCIDQuMCBhbmQgYWJvdmUuCisJICovCisJaWYgKGJkY2ItPnZlcnNpb24gPj0gMHg0MCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBObyBrbm93biBjb25uZWN0b3IgaW5mbyBiZWZvcmUgdjMuMCwgc28gbWFrZSBpdCB1cC4gIHRoZSBydWxlIGhlcmUKKwkgKiBpczogYW55dGhpbmcgb24gdGhlIHNhbWUgaTJjIGJ1cyBpcyBjb25zaWRlcmVkIHRvIGJlIG9uIHRoZSBzYW1lCisJICogY29ubmVjdG9yLiAgYW55IG91dHB1dCB3aXRob3V0IGFuIGFzc29jaWF0ZWQgaTJjIGJ1cyBpcyBhc3NpZ25lZAorCSAqIGl0cyBvd24gdW5pcXVlIGNvbm5lY3RvciBpbmRleC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGNiLT5lbnRyaWVzOyBpKyspIHsKKwkJaWYgKGRjYi0+ZW50cnlbaV0uaTJjX2luZGV4ID09IDB4ZikKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIElnbm9yZSB0aGUgSTJDIGluZGV4IGZvciBvbi1jaGlwIFRWLW91dCwgYXMgdGhlcmUKKwkJICogYXJlIGNhcmRzIHdpdGggYm9ndXMgdmFsdWVzIChudjMxbSBpbiBidWcgMjMyMTIpLAorCQkgKiBhbmQgaXQncyBvdGhlcndpc2UgdXNlbGVzcy4KKwkJICovCisJCWlmIChkY2ItPmVudHJ5W2ldLnR5cGUgPT0gT1VUUFVUX1RWICYmCisJCSAgICBkY2ItPmVudHJ5W2ldLmxvY2F0aW9uID09IERDQl9MT0NfT05fQ0hJUCkgeworCQkJZGNiLT5lbnRyeVtpXS5pMmNfaW5kZXggPSAweGY7CisJCQljb250aW51ZTsKKwkJfQorCisJCWRjYi0+ZW50cnlbaV0uY29ubmVjdG9yID0gZGNiLT5lbnRyeVtpXS5pMmNfaW5kZXg7CisJCWlmIChkY2ItPmVudHJ5W2ldLmNvbm5lY3RvciA+IGhpZ2gpCisJCQloaWdoID0gZGNiLT5lbnRyeVtpXS5jb25uZWN0b3I7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGRjYi0+ZW50cmllczsgaSsrKSB7CisJCWlmIChkY2ItPmVudHJ5W2ldLmkyY19pbmRleCAhPSAweGYpCisJCQljb250aW51ZTsKKworCQlkY2ItPmVudHJ5W2ldLmNvbm5lY3RvciA9ICsraGlnaDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitmaXh1cF9sZWdhY3lfaTJjKHN0cnVjdCBudmJpb3MgKmJpb3MpCit7CisJc3RydWN0IHBhcnNlZF9kY2IgKmRjYiA9ICZiaW9zLT5iZGNiLmRjYjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBkY2ItPmVudHJpZXM7IGkrKykgeworCQlpZiAoZGNiLT5lbnRyeVtpXS5pMmNfaW5kZXggPT0gTEVHQUNZX0kyQ19DUlQpCisJCQlkY2ItPmVudHJ5W2ldLmkyY19pbmRleCA9IGJpb3MtPmxlZ2FjeS5pMmNfaW5kaWNlcy5jcnQ7CisJCWlmIChkY2ItPmVudHJ5W2ldLmkyY19pbmRleCA9PSBMRUdBQ1lfSTJDX1BBTkVMKQorCQkJZGNiLT5lbnRyeVtpXS5pMmNfaW5kZXggPSBiaW9zLT5sZWdhY3kuaTJjX2luZGljZXMucGFuZWw7CisJCWlmIChkY2ItPmVudHJ5W2ldLmkyY19pbmRleCA9PSBMRUdBQ1lfSTJDX1RWKQorCQkJZGNiLT5lbnRyeVtpXS5pMmNfaW5kZXggPSBiaW9zLT5sZWdhY3kuaTJjX2luZGljZXMudHY7CisJfQorfQorCitzdGF0aWMgaW50IGxvYWRfbnYxN19od3NxX3Vjb2RlX2VudHJ5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBudmJpb3MgKmJpb3MsIHVpbnQxNl90IGh3c3Ffb2Zmc2V0LCBpbnQgZW50cnkpCit7CisJLyoKKwkgKiBUaGUgaGVhZGVyIGZvbGxvd2luZyB0aGUgIkhXU1EiIHNpZ25hdHVyZSBoYXMgdGhlIG51bWJlciBvZiBlbnRyaWVzLAorCSAqIGFuZCB0aGUgZW50cnkgc2l6ZQorCSAqCisJICogQW4gZW50cnkgY29uc2lzdHMgb2YgYSBkd29yZCB0byB3cml0ZSB0byB0aGUgc2VxdWVuY2VyIGNvbnRyb2wgcmVnCisJICogKDB4MDAwMDEzMDQpLCBmb2xsb3dlZCBieSB0aGUgdWNvZGUgYnl0ZXMsIHdyaXR0ZW4gc2VxdWVudGlhbGx5LAorCSAqIHN0YXJ0aW5nIGF0IHJlZyAweDAwMDAxNDAwCisJICovCisKKwl1aW50OF90IGJ5dGVzX3RvX3dyaXRlOworCXVpbnQxNl90IGh3c3FfZW50cnlfb2Zmc2V0OworCWludCBpOworCisJaWYgKGJpb3MtPmRhdGFbaHdzcV9vZmZzZXRdIDw9IGVudHJ5KSB7CisJCU5WX0VSUk9SKGRldiwgIlRvbyBmZXcgZW50cmllcyBpbiBIVyBzZXF1ZW5jZXIgdGFibGUgZm9yICIKKwkJCQkicmVxdWVzdGVkIGVudHJ5XG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJYnl0ZXNfdG9fd3JpdGUgPSBiaW9zLT5kYXRhW2h3c3Ffb2Zmc2V0ICsgMV07CisKKwlpZiAoYnl0ZXNfdG9fd3JpdGUgIT0gMzYpIHsKKwkJTlZfRVJST1IoZGV2LCAiVW5rbm93biBIVyBzZXF1ZW5jZXIgZW50cnkgc2l6ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCU5WX1RSQUNFKGRldiwgIkxvYWRpbmcgTlYxNyBwb3dlciBzZXF1ZW5jaW5nIG1pY3JvY29kZVxuIik7CisKKwlod3NxX2VudHJ5X29mZnNldCA9IGh3c3Ffb2Zmc2V0ICsgMiArIGVudHJ5ICogYnl0ZXNfdG9fd3JpdGU7CisKKwkvKiBzZXQgc2VxdWVuY2VyIGNvbnRyb2wgKi8KKwliaW9zX3dyMzIoYmlvcywgMHgwMDAwMTMwNCwgUk9NMzIoYmlvcy0+ZGF0YVtod3NxX2VudHJ5X29mZnNldF0pKTsKKwlieXRlc190b193cml0ZSAtPSA0OworCisJLyogd3JpdGUgdWNvZGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYnl0ZXNfdG9fd3JpdGU7IGkgKz0gNCkKKwkJYmlvc193cjMyKGJpb3MsIDB4MDAwMDE0MDAgKyBpLCBST00zMihiaW9zLT5kYXRhW2h3c3FfZW50cnlfb2Zmc2V0ICsgaSArIDRdKSk7CisKKwkvKiB0d2lkZGxlIE5WX1BCVVNfREVCVUdfNCAqLworCWJpb3Nfd3IzMihiaW9zLCBOVl9QQlVTX0RFQlVHXzQsIGJpb3NfcmQzMihiaW9zLCBOVl9QQlVTX0RFQlVHXzQpIHwgMHgxOCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsb2FkX252MTdfaHdfc2VxdWVuY2VyX3Vjb2RlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBudmJpb3MgKmJpb3MpCit7CisJLyoKKwkgKiBCTVAgYmFzZWQgY2FyZHMsIGZyb20gTlYxNywgbmVlZCBhIG1pY3JvY29kZSBsb2FkaW5nIHRvIGNvcnJlY3RseQorCSAqIGNvbnRyb2wgdGhlIEdQSU8gZXRjIGZvciBMVkRTIHBhbmVscworCSAqCisJICogQklUIGJhc2VkIGNhcmRzIHNlZW0gdG8gZG8gdGhpcyBkaXJlY3RseSBpbiB0aGUgaW5pdCBzY3JpcHRzCisJICoKKwkgKiBUaGUgbWljcm9jb2RlIGVudHJpZXMgYXJlIGZvdW5kIGJ5IHRoZSAiSFdTUSIgc2lnbmF0dXJlLgorCSAqLworCisJY29uc3QgdWludDhfdCBod3NxX3NpZ25hdHVyZVtdID0geyAnSCcsICdXJywgJ1MnLCAnUScgfTsKKwljb25zdCBpbnQgc3ogPSBzaXplb2YoaHdzcV9zaWduYXR1cmUpOworCWludCBod3NxX29mZnNldDsKKworCWh3c3Ffb2Zmc2V0ID0gZmluZHN0cihiaW9zLT5kYXRhLCBiaW9zLT5sZW5ndGgsIGh3c3Ffc2lnbmF0dXJlLCBzeik7CisJaWYgKCFod3NxX29mZnNldCkKKwkJcmV0dXJuIDA7CisKKwkvKiBhbHdheXMgdXNlIGVudHJ5IDA/ICovCisJcmV0dXJuIGxvYWRfbnYxN19od3NxX3Vjb2RlX2VudHJ5KGRldiwgYmlvcywgaHdzcV9vZmZzZXQgKyBzeiwgMCk7Cit9CisKK3VpbnQ4X3QgKm5vdXZlYXVfYmlvc19lbWJlZGRlZF9lZGlkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnZiaW9zICpiaW9zID0gJmRldl9wcml2LT5WQklPUzsKKwljb25zdCB1aW50OF90IGVkaWRfc2lnW10gPSB7CisJCQkweDAwLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAwIH07CisJdWludDE2X3Qgb2Zmc2V0ID0gMDsKKwl1aW50MTZfdCBuZXdvZmZzZXQ7CisJaW50IHNlYXJjaGxlbiA9IE5WX1BST01fU0laRTsKKworCWlmIChiaW9zLT5mcC5lZGlkKQorCQlyZXR1cm4gYmlvcy0+ZnAuZWRpZDsKKworCXdoaWxlIChzZWFyY2hsZW4pIHsKKwkJbmV3b2Zmc2V0ID0gZmluZHN0cigmYmlvcy0+ZGF0YVtvZmZzZXRdLCBzZWFyY2hsZW4sCisJCQkJCQkJCWVkaWRfc2lnLCA4KTsKKwkJaWYgKCFuZXdvZmZzZXQpCisJCQlyZXR1cm4gTlVMTDsKKwkJb2Zmc2V0ICs9IG5ld29mZnNldDsKKwkJaWYgKCFudl9ja3N1bSgmYmlvcy0+ZGF0YVtvZmZzZXRdLCBFRElEMV9MRU4pKQorCQkJYnJlYWs7CisKKwkJc2VhcmNobGVuIC09IG9mZnNldDsKKwkJb2Zmc2V0Kys7CisJfQorCisJTlZfVFJBQ0UoZGV2LCAiRm91bmQgRURJRCBpbiBCSU9TXG4iKTsKKworCXJldHVybiBiaW9zLT5mcC5lZGlkID0gJmJpb3MtPmRhdGFbb2Zmc2V0XTsKK30KKwordm9pZAorbm91dmVhdV9iaW9zX3J1bl9pbml0X3RhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQxNl90IHRhYmxlLAorCQkJICAgIHN0cnVjdCBkY2JfZW50cnkgKmRjYmVudCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudmJpb3MgKmJpb3MgPSAmZGV2X3ByaXYtPlZCSU9TOworCXN0cnVjdCBpbml0X2V4ZWMgaWV4ZWMgPSB7IHRydWUsIGZhbHNlIH07CisKKwliaW9zLT5kaXNwbGF5Lm91dHB1dCA9IGRjYmVudDsKKwlwYXJzZV9pbml0X3RhYmxlKGJpb3MsIHRhYmxlLCAmaWV4ZWMpOworCWJpb3MtPmRpc3BsYXkub3V0cHV0ID0gTlVMTDsKK30KKworc3RhdGljIGJvb2wgTlZJbml0VkJJT1Moc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudmJpb3MgKmJpb3MgPSAmZGV2X3ByaXYtPlZCSU9TOworCisJbWVtc2V0KGJpb3MsIDAsIHNpemVvZihzdHJ1Y3QgbnZiaW9zKSk7CisJYmlvcy0+ZGV2ID0gZGV2OworCisJaWYgKCFOVlNoYWRvd1ZCSU9TKGRldiwgYmlvcy0+ZGF0YSkpCisJCXJldHVybiBmYWxzZTsKKworCWJpb3MtPmxlbmd0aCA9IE5WX1BST01fU0laRTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludCBub3V2ZWF1X3BhcnNlX3ZiaW9zX3N0cnVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkZXZfcHJpdi0+VkJJT1M7CisJY29uc3QgdWludDhfdCBiaXRfc2lnbmF0dXJlW10gPSB7IDB4ZmYsIDB4YjgsICdCJywgJ0knLCAnVCcgfTsKKwljb25zdCB1aW50OF90IGJtcF9zaWduYXR1cmVbXSA9IHsgMHhmZiwgMHg3ZiwgJ04nLCAnVicsIDB4MCB9OworCWludCBvZmZzZXQ7CisKKwlvZmZzZXQgPSBmaW5kc3RyKGJpb3MtPmRhdGEsIGJpb3MtPmxlbmd0aCwKKwkJCQkJYml0X3NpZ25hdHVyZSwgc2l6ZW9mKGJpdF9zaWduYXR1cmUpKTsKKwlpZiAob2Zmc2V0KSB7CisJCU5WX1RSQUNFKGRldiwgIkJJVCBCSU9TIGZvdW5kXG4iKTsKKwkJcmV0dXJuIHBhcnNlX2JpdF9zdHJ1Y3R1cmUoYmlvcywgb2Zmc2V0ICsgNik7CisJfQorCisJb2Zmc2V0ID0gZmluZHN0cihiaW9zLT5kYXRhLCBiaW9zLT5sZW5ndGgsCisJCQkJCWJtcF9zaWduYXR1cmUsIHNpemVvZihibXBfc2lnbmF0dXJlKSk7CisJaWYgKG9mZnNldCkgeworCQlOVl9UUkFDRShkZXYsICJCTVAgQklPUyBmb3VuZFxuIik7CisJCXJldHVybiBwYXJzZV9ibXBfc3RydWN0dXJlKGRldiwgYmlvcywgb2Zmc2V0KTsKKwl9CisKKwlOVl9FUlJPUihkZXYsICJObyBrbm93biBCSU9TIHNpZ25hdHVyZSBmb3VuZFxuIik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK2ludAorbm91dmVhdV9ydW5fdmJpb3NfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkZXZfcHJpdi0+VkJJT1M7CisJaW50IGksIHJldCA9IDA7CisKKwlOVkxvY2tWZ2FDcnRjcyhkZXYsIGZhbHNlKTsKKwlpZiAobnZfdHdvX2hlYWRzKGRldikpCisJCU5WU2V0T3duZXIoZGV2LCBiaW9zLT5zdGF0ZS5jcnRjaGVhZCk7CisKKwlpZiAoYmlvcy0+bWFqb3JfdmVyc2lvbiA8IDUpCS8qIEJNUCBvbmx5ICovCisJCWxvYWRfbnYxN19od19zZXF1ZW5jZXJfdWNvZGUoZGV2LCBiaW9zKTsKKworCWlmIChiaW9zLT5leGVjdXRlKSB7CisJCWJpb3MtPmZwLmxhc3Rfc2NyaXB0X2ludm9jID0gMDsKKwkJYmlvcy0+ZnAubHZkc19pbml0X3J1biA9IGZhbHNlOworCX0KKworCXBhcnNlX2luaXRfdGFibGVzKGJpb3MpOworCisJLyoKKwkgKiBSdW5zIHNvbWUgYWRkaXRpb25hbCBzY3JpcHQgc2VlbiBvbiBHOHggVkJJT1Nlbi4gIFRoZSBWQklPUycKKwkgKiBwYXJzZXIgd2lsbCBydW4gdGhpcyByaWdodCBhZnRlciB0aGUgaW5pdCB0YWJsZXMsIHRoZSBiaW5hcnkKKwkgKiBkcml2ZXIgYXBwZWFycyB0byBydW4gaXQgYXQgc29tZSBwb2ludCBsYXRlci4KKwkgKi8KKwlpZiAoYmlvcy0+c29tZV9zY3JpcHRfcHRyKSB7CisJCXN0cnVjdCBpbml0X2V4ZWMgaWV4ZWMgPSB7dHJ1ZSwgZmFsc2V9OworCisJCU5WX0lORk8oZGV2LCAiUGFyc2luZyBWQklPUyBpbml0IHRhYmxlIGF0IG9mZnNldCAweCUwNFhcbiIsCisJCQliaW9zLT5zb21lX3NjcmlwdF9wdHIpOworCQlwYXJzZV9pbml0X3RhYmxlKGJpb3MsIGJpb3MtPnNvbWVfc2NyaXB0X3B0ciwgJmlleGVjKTsKKwl9CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkgeworCQlmb3IgKGkgPSAwOyBpIDwgYmlvcy0+YmRjYi5kY2IuZW50cmllczsgaSsrKSB7CisJCQlub3V2ZWF1X2Jpb3NfcnVuX2Rpc3BsYXlfdGFibGUoZGV2LAorCQkJCQkJICAgICAgICZiaW9zLT5iZGNiLmRjYi5lbnRyeVtpXSwKKwkJCQkJCSAgICAgICAwLCAwKTsKKwkJfQorCX0KKworCU5WTG9ja1ZnYUNydGNzKGRldiwgdHJ1ZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorbm91dmVhdV9iaW9zX2kyY19kZXZpY2VzX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnZiaW9zICpiaW9zID0gJmRldl9wcml2LT5WQklPUzsKKwlzdHJ1Y3QgZGNiX2kyY19lbnRyeSAqZW50cnk7CisJaW50IGk7CisKKwllbnRyeSA9ICZiaW9zLT5iZGNiLmRjYi5pMmNbMF07CisJZm9yIChpID0gMDsgaSA8IERDQl9NQVhfTlVNX0kyQ19FTlRSSUVTOyBpKyssIGVudHJ5KyspCisJCW5vdXZlYXVfaTJjX2ZpbmkoZGV2LCBlbnRyeSk7Cit9CisKK2ludAorbm91dmVhdV9iaW9zX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudmJpb3MgKmJpb3MgPSAmZGV2X3ByaXYtPlZCSU9TOworCXVpbnQzMl90IHNhdmVkX252X3BleHRkZXZfYm9vdF8wOworCWJvb2wgd2FzX2xvY2tlZDsKKwlpbnQgcmV0OworCisJZGV2X3ByaXYtPnZiaW9zID0gJmJpb3MtPnB1YjsKKworCWlmICghTlZJbml0VkJJT1MoZGV2KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSBub3V2ZWF1X3BhcnNlX3ZiaW9zX3N0cnVjdChkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBwYXJzZV9kY2JfdGFibGUoZGV2LCBiaW9zLCBudl90d29faGVhZHMoZGV2KSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWZpeHVwX2xlZ2FjeV9pMmMoYmlvcyk7CisJZml4dXBfbGVnYWN5X2Nvbm5lY3RvcihiaW9zKTsKKworCWlmICghYmlvcy0+bWFqb3JfdmVyc2lvbikJLyogd2UgZG9uJ3QgcnVuIHZlcnNpb24gMCBiaW9zICovCisJCXJldHVybiAwOworCisJLyogdGhlc2Ugd2lsbCBuZWVkIHJlbWVtYmVyaW5nIGFjcm9zcyBhIHN1c3BlbmQgKi8KKwlzYXZlZF9udl9wZXh0ZGV2X2Jvb3RfMCA9IGJpb3NfcmQzMihiaW9zLCBOVl9QRVhUREVWX0JPT1RfMCk7CisJYmlvcy0+c3RhdGUuc2F2ZWRfbnZfcGZiX2NmZzAgPSBiaW9zX3JkMzIoYmlvcywgTlZfUEZCX0NGRzApOworCisJLyogaW5pdCBzY3JpcHQgZXhlY3V0aW9uIGRpc2FibGVkICovCisJYmlvcy0+ZXhlY3V0ZSA9IGZhbHNlOworCisJLyogLi4uIHVubGVzcyBjYXJkIGlzbid0IFBPU1RlZCBhbHJlYWR5ICovCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfMTAgJiYKKwkgICAgTlZSZWFkVmdhQ3J0YyhkZXYsIDAsIDB4MDApID09IDAgJiYKKwkgICAgTlZSZWFkVmdhQ3J0YyhkZXYsIDAsIDB4MWEpID09IDApIHsKKwkJTlZfSU5GTyhkZXYsICJBZGFwdG9yIG5vdCBpbml0aWFsaXNlZFxuIik7CisJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApIHsKKwkJCU5WX0VSUk9SKGRldiwgIlVuYWJsZSB0byBQT1NUIHRoaXMgY2hpcHNldFxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCisJCU5WX0lORk8oZGV2LCAiUnVubmluZyBWQklPUyBpbml0IHRhYmxlc1xuIik7CisJCWJpb3MtPmV4ZWN1dGUgPSB0cnVlOworCX0KKworCWJpb3Nfd3IzMihiaW9zLCBOVl9QRVhUREVWX0JPT1RfMCwgc2F2ZWRfbnZfcGV4dGRldl9ib290XzApOworCisJcmV0ID0gbm91dmVhdV9ydW5fdmJpb3NfaW5pdChkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X3ByaXYtPnZiaW9zID0gTlVMTDsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBmZWF0dXJlX2J5dGUgb24gQk1QIGlzIHBvb3IsIGJ1dCBpbml0IGFsd2F5cyBzZXRzIENSNEIgKi8KKwl3YXNfbG9ja2VkID0gTlZMb2NrVmdhQ3J0Y3MoZGV2LCBmYWxzZSk7CisJaWYgKGJpb3MtPm1ham9yX3ZlcnNpb24gPCA1KQorCQliaW9zLT5pc19tb2JpbGUgPSBOVlJlYWRWZ2FDcnRjKGRldiwgMCwgTlZfQ0lPX0NSRV80QikgJiAweDQwOworCisJLyogYWxsIEJJVCBzeXN0ZW1zIG5lZWQgcF9mX21fdCBmb3IgZGlnaXRhbF9taW5fZnJvbnRfcG9yY2ggKi8KKwlpZiAoYmlvcy0+aXNfbW9iaWxlIHx8IGJpb3MtPm1ham9yX3ZlcnNpb24gPj0gNSkKKwkJcmV0ID0gcGFyc2VfZnBfbW9kZV90YWJsZShkZXYsIGJpb3MpOworCU5WTG9ja1ZnYUNydGNzKGRldiwgd2FzX2xvY2tlZCk7CisKKwkvKiBhbGxvdyBzdWJzZXF1ZW50IHNjcmlwdHMgdG8gZXhlY3V0ZSAqLworCWJpb3MtPmV4ZWN1dGUgPSB0cnVlOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK25vdXZlYXVfYmlvc190YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCW5vdXZlYXVfYmlvc19pMmNfZGV2aWNlc190YWtlZG93bihkZXYpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iaW9zLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Jpb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDVmMTBiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iaW9zLmgKQEAgLTAsMCArMSwyODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA4IE5vdXZlYXUgUHJvamVjdAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fTk9VVkVBVV9CSU9TX0hfXworI2RlZmluZSBfX05PVVZFQVVfQklPU19IX18KKworI2luY2x1ZGUgIm52cmVnLmgiCisjaW5jbHVkZSAibm91dmVhdV9pMmMuaCIKKworI2RlZmluZSBEQ0JfTUFYX05VTV9FTlRSSUVTIDE2CisjZGVmaW5lIERDQl9NQVhfTlVNX0kyQ19FTlRSSUVTIDE2CisjZGVmaW5lIERDQl9NQVhfTlVNX0dQSU9fRU5UUklFUyAzMgorI2RlZmluZSBEQ0JfTUFYX05VTV9DT05ORUNUT1JfRU5UUklFUyAxNgorCisjZGVmaW5lIERDQl9MT0NfT05fQ0hJUCAwCisKK3N0cnVjdCBkY2JfZW50cnkgeworCWludCBpbmRleDsJLyogbWF5IG5vdCBiZSByYXcgZGNiIGluZGV4IGlmIG1lcmdpbmcgaGFzIGhhcHBlbmVkICovCisJdWludDhfdCB0eXBlOworCXVpbnQ4X3QgaTJjX2luZGV4OworCXVpbnQ4X3QgaGVhZHM7CisJdWludDhfdCBjb25uZWN0b3I7CisJdWludDhfdCBidXM7CisJdWludDhfdCBsb2NhdGlvbjsKKwl1aW50OF90IG9yOworCWJvb2wgZHVhbGxpbmtfcG9zc2libGU7CisJdW5pb24geworCQlzdHJ1Y3Qgc29yX2NvbmYgeworCQkJaW50IGxpbms7CisJCX0gc29yY29uZjsKKwkJc3RydWN0IHsKKwkJCWludCBtYXhmcmVxOworCQl9IGNydGNvbmY7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3Qgc29yX2NvbmYgc29yOworCQkJYm9vbCB1c2Vfc3RyYXBzX2Zvcl9tb2RlOworCQkJYm9vbCB1c2VfcG93ZXJfc2NyaXB0czsKKwkJfSBsdmRzY29uZjsKKwkJc3RydWN0IHsKKwkJCWJvb2wgaGFzX2NvbXBvbmVudF9vdXRwdXQ7CisJCX0gdHZjb25mOworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHNvcl9jb25mIHNvcjsKKwkJCWludCBsaW5rX25yOworCQkJaW50IGxpbmtfYnc7CisJCX0gZHBjb25mOworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHNvcl9jb25mIHNvcjsKKwkJfSB0bWRzY29uZjsKKwl9OworCWJvb2wgaTJjX3VwcGVyX2RlZmF1bHQ7Cit9OworCitzdHJ1Y3QgZGNiX2kyY19lbnRyeSB7CisJdWludDhfdCBwb3J0X3R5cGU7CisJdWludDhfdCByZWFkLCB3cml0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqY2hhbjsKK307CisKK3N0cnVjdCBwYXJzZWRfZGNiIHsKKwlpbnQgZW50cmllczsKKwlzdHJ1Y3QgZGNiX2VudHJ5IGVudHJ5W0RDQl9NQVhfTlVNX0VOVFJJRVNdOworCXN0cnVjdCBkY2JfaTJjX2VudHJ5IGkyY1tEQ0JfTUFYX05VTV9JMkNfRU5UUklFU107Cit9OworCitlbnVtIGRjYl9ncGlvX3RhZyB7CisJRENCX0dQSU9fVFZEQUMwID0gMHhjLAorCURDQl9HUElPX1RWREFDMSA9IDB4MmQsCit9OworCitzdHJ1Y3QgZGNiX2dwaW9fZW50cnkgeworCWVudW0gZGNiX2dwaW9fdGFnIHRhZzsKKwlpbnQgbGluZTsKKwlib29sIGludmVydDsKK307CisKK3N0cnVjdCBwYXJzZWRfZGNiX2dwaW8geworCWludCBlbnRyaWVzOworCXN0cnVjdCBkY2JfZ3Bpb19lbnRyeSBlbnRyeVtEQ0JfTUFYX05VTV9HUElPX0VOVFJJRVNdOworfTsKKworc3RydWN0IGRjYl9jb25uZWN0b3JfdGFibGVfZW50cnkgeworCXVpbnQzMl90IGVudHJ5OworCXVpbnQ4X3QgdHlwZTsKKwl1aW50OF90IGluZGV4OworCXVpbnQ4X3QgZ3Bpb190YWc7Cit9OworCitzdHJ1Y3QgZGNiX2Nvbm5lY3Rvcl90YWJsZSB7CisJaW50IGVudHJpZXM7CisJc3RydWN0IGRjYl9jb25uZWN0b3JfdGFibGVfZW50cnkgZW50cnlbRENCX01BWF9OVU1fQ09OTkVDVE9SX0VOVFJJRVNdOworfTsKKworc3RydWN0IGJpb3NfcGFyc2VkX2RjYiB7CisJdWludDhfdCB2ZXJzaW9uOworCisJc3RydWN0IHBhcnNlZF9kY2IgZGNiOworCisJdWludDhfdCAqaTJjX3RhYmxlOworCXVpbnQ4X3QgaTJjX2RlZmF1bHRfaW5kaWNlczsKKworCXVpbnQxNl90IGdwaW9fdGFibGVfcHRyOworCXN0cnVjdCBwYXJzZWRfZGNiX2dwaW8gZ3BpbzsKKwl1aW50MTZfdCBjb25uZWN0b3JfdGFibGVfcHRyOworCXN0cnVjdCBkY2JfY29ubmVjdG9yX3RhYmxlIGNvbm5lY3RvcjsKK307CisKK2VudW0gbm91dmVhdV9lbmNvZGVyX3R5cGUgeworCU9VVFBVVF9BTkFMT0cgPSAwLAorCU9VVFBVVF9UViA9IDEsCisJT1VUUFVUX1RNRFMgPSAyLAorCU9VVFBVVF9MVkRTID0gMywKKwlPVVRQVVRfRFAgPSA2LAorCU9VVFBVVF9BTlkgPSAtMQorfTsKKworZW51bSBub3V2ZWF1X29yIHsKKwlPVVRQVVRfQSA9ICgxIDw8IDApLAorCU9VVFBVVF9CID0gKDEgPDwgMSksCisJT1VUUFVUX0MgPSAoMSA8PCAyKQorfTsKKworZW51bSBMVkRTX3NjcmlwdCB7CisJLyogT3JkZXIgKmRvZXMqIG1hdHRlciBoZXJlICovCisJTFZEU19JTklUID0gMSwKKwlMVkRTX1JFU0VULAorCUxWRFNfQkFDS0xJR0hUX09OLAorCUxWRFNfQkFDS0xJR0hUX09GRiwKKwlMVkRTX1BBTkVMX09OLAorCUxWRFNfUEFORUxfT0ZGCit9OworCisvKiBjaGFuZ2luZyB0aGVzZSByZXF1aXJlcyBtYXRjaGluZyBjaGFuZ2VzIHRvIHJlZyB0YWJsZXMgaW4gbnZfZ2V0X2Nsb2NrICovCisjZGVmaW5lIE1BWF9QTExfVFlQRVMJNAorZW51bSBwbGxfdHlwZXMgeworCU5WUExMLAorCU1QTEwsCisJVlBMTDEsCisJVlBMTDIKK307CisKK3N0cnVjdCBwbGxfbGltcyB7CisJc3RydWN0IHsKKwkJaW50IG1pbmZyZXE7CisJCWludCBtYXhmcmVxOworCQlpbnQgbWluX2lucHV0ZnJlcTsKKwkJaW50IG1heF9pbnB1dGZyZXE7CisKKwkJdWludDhfdCBtaW5fbTsKKwkJdWludDhfdCBtYXhfbTsKKwkJdWludDhfdCBtaW5fbjsKKwkJdWludDhfdCBtYXhfbjsKKwl9IHZjbzEsIHZjbzI7CisKKwl1aW50OF90IG1heF9sb2cycDsKKwkvKgorCSAqIGZvciBtb3N0IHByZSBudjUwIGNhcmRzIHNldHRpbmcgYSBsb2cyUCBvZiA3ICh0aGUgY29tbW9uIG1heF9sb2cycAorCSAqIHZhbHVlKSBpcyBubyBkaWZmZXJlbnQgdG8gNiAoYXQgbGVhc3QgZm9yIHZwbGxzKSBzbyBhbGxvd2luZyB0aGUgTU5QCisJICogY2FsYyB0byB1c2UgNyBjYXVzZXMgdGhlIGdlbmVyYXRlZCBjbG9jayB0byBiZSBvdXQgYnkgYSBmYWN0b3Igb2YgMi4KKwkgKiBob3dldmVyLCBtYXhfbG9nMnAgY2Fubm90IGJlIGZpeGVkLXVwIGR1cmluZyBwYXJzaW5nIGFzIHRoZQorCSAqIHVubW9kaWZpZWQgbWF4X2xvZzJwIHZhbHVlIGlzIHN0aWxsIG5lZWRlZCBmb3Igc2V0dGluZyBtcGxscywgaGVuY2UKKwkgKiBhbiBhZGRpdGlvbmFsIG1heF91c2FibGVfbG9nMnAgbWVtYmVyCisJICovCisJdWludDhfdCBtYXhfdXNhYmxlX2xvZzJwOworCXVpbnQ4X3QgbG9nMnBfYmlhczsKKworCXVpbnQ4X3QgbWluX3A7CisJdWludDhfdCBtYXhfcDsKKworCWludCByZWZjbGs7Cit9OworCitzdHJ1Y3Qgbm91dmVhdV9iaW9zX2luZm8geworCXN0cnVjdCBwYXJzZWRfZGNiICpkY2I7CisKKwl1aW50OF90IGNoaXBfdmVyc2lvbjsKKworCXVpbnQzMl90IGRhY3Rlc3R2YWw7CisJdWludDMyX3QgdHZkYWN0ZXN0dmFsOworCXVpbnQ4X3QgZGlnaXRhbF9taW5fZnJvbnRfcG9yY2g7CisJYm9vbCBmcF9ub19kZGM7Cit9OworCitzdHJ1Y3QgbnZiaW9zIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OworCXN0cnVjdCBub3V2ZWF1X2Jpb3NfaW5mbyBwdWI7CisKKwl1aW50OF90IGRhdGFbTlZfUFJPTV9TSVpFXTsKKwl1bnNpZ25lZCBpbnQgbGVuZ3RoOworCWJvb2wgZXhlY3V0ZTsKKworCXVpbnQ4X3QgbWFqb3JfdmVyc2lvbjsKKwl1aW50OF90IGZlYXR1cmVfYnl0ZTsKKwlib29sIGlzX21vYmlsZTsKKworCXVpbnQzMl90IGZtYXh2Y28sIGZtaW52Y287CisKKwlib29sIG9sZF9zdHlsZV9pbml0OworCXVpbnQxNl90IGluaXRfc2NyaXB0X3RibHNfcHRyOworCXVpbnQxNl90IGV4dHJhX2luaXRfc2NyaXB0X3RibF9wdHI7CisJdWludDE2X3QgbWFjcm9faW5kZXhfdGJsX3B0cjsKKwl1aW50MTZfdCBtYWNyb190YmxfcHRyOworCXVpbnQxNl90IGNvbmRpdGlvbl90YmxfcHRyOworCXVpbnQxNl90IGlvX2NvbmRpdGlvbl90YmxfcHRyOworCXVpbnQxNl90IGlvX2ZsYWdfY29uZGl0aW9uX3RibF9wdHI7CisJdWludDE2X3QgaW5pdF9mdW5jdGlvbl90YmxfcHRyOworCisJdWludDE2X3QgcGxsX2xpbWl0X3RibF9wdHI7CisJdWludDE2X3QgcmFtX3Jlc3RyaWN0X3RibF9wdHI7CisKKwl1aW50MTZfdCBzb21lX3NjcmlwdF9wdHI7IC8qIEJJVCBJICsgMTQgKi8KKwl1aW50MTZfdCBpbml0OTZfdGJsX3B0cjsgLyogQklUIEkgKyAxNiAqLworCisJc3RydWN0IGJpb3NfcGFyc2VkX2RjYiBiZGNiOworCisJc3RydWN0IHsKKwkJaW50IGNydGNoZWFkOworCQkvKiB0aGVzZSBuZWVkIHJlbWVtYmVyaW5nIGFjcm9zcyBzdXNwZW5kICovCisJCXVpbnQzMl90IHNhdmVkX252X3BmYl9jZmcwOworCX0gc3RhdGU7CisKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgZGNiX2VudHJ5ICpvdXRwdXQ7CisJCXVpbnQxNl90IHNjcmlwdF90YWJsZV9wdHI7CisJCXVpbnQxNl90IGRwX3RhYmxlX3B0cjsKKwl9IGRpc3BsYXk7CisKKwlzdHJ1Y3QgeworCQl1aW50MTZfdCBmcHRhYmxlcG9pbnRlcjsJLyogYWxzbyB1c2VkIGJ5IHRtZHMgKi8KKwkJdWludDE2X3QgZnB4bGF0ZXRhYmxlcHRyOworCQlpbnQgeGxhdHdpZHRoOworCQl1aW50MTZfdCBsdmRzbWFudWZhY3R1cmVycG9pbnRlcjsKKwkJdWludDE2X3QgZnB4bGF0ZW1hbnVmYWN0dXJlcnRhYmxlcHRyOworCQl1aW50MTZfdCBtb2RlX3B0cjsKKwkJdWludDE2X3QgeGxhdGVkX2VudHJ5OworCQlib29sIHBvd2VyX29mZl9mb3JfcmVzZXQ7CisJCWJvb2wgcmVzZXRfYWZ0ZXJfcGNsa19jaGFuZ2U7CisJCWJvb2wgZHVhbF9saW5rOworCQlib29sIGxpbmtfY19pbmNyZW1lbnQ7CisJCWJvb2wgQklUYml0MTsKKwkJYm9vbCBpZl9pc18yNGJpdDsKKwkJaW50IGR1YWxsaW5rX3RyYW5zaXRpb25fY2xrOworCQl1aW50OF90IHN0cmFwbGVzc19pc18yNGJpdDsKKwkJdWludDhfdCAqZWRpZDsKKworCQkvKiB3aWxsIG5lZWQgcmVzZXR0aW5nIGFmdGVyIHN1c3BlbmQgKi8KKwkJaW50IGxhc3Rfc2NyaXB0X2ludm9jOworCQlib29sIGx2ZHNfaW5pdF9ydW47CisJfSBmcDsKKworCXN0cnVjdCB7CisJCXVpbnQxNl90IG91dHB1dDBfc2NyaXB0X3B0cjsKKwkJdWludDE2X3Qgb3V0cHV0MV9zY3JpcHRfcHRyOworCX0gdG1kczsKKworCXN0cnVjdCB7CisJCXVpbnQxNl90IG1lbV9pbml0X3RibF9wdHI7CisJCXVpbnQxNl90IHNkcl9zZXFfdGJsX3B0cjsKKwkJdWludDE2X3QgZGRyX3NlcV90YmxfcHRyOworCisJCXN0cnVjdCB7CisJCQl1aW50OF90IGNydCwgdHYsIHBhbmVsOworCQl9IGkyY19pbmRpY2VzOworCisJCXVpbnQxNl90IGx2ZHNfc2luZ2xlX2Ffc2NyaXB0X3B0cjsKKwl9IGxlZ2FjeTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iby5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMGExNGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2JvLmMKQEAgLTAsMCArMSw2NzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNyBEYXZlIEFpcmxpZWQKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKy8qCisgKiBBdXRob3JzOiBEYXZlIEFpcmxpZWQgPGFpcmxpZWRAbGludXguaWU+CisgKgkgICAgQmVuIFNrZWdncyAgIDxkYXJrdGFtYUBpaW5ldC5uZXQuYXU+CisgKgkgICAgSmVyZW15IEtvbGIgIDxqa29sYkBicmFuZGVpcy5lZHU+CisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKworI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2RtYS5oIgorCitzdGF0aWMgdm9pZAorbm91dmVhdV9ib19kZWxfdHRtKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gbm91dmVhdV9iZGV2KGJvLT5iZGV2KTsKKwlzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibyA9IG5vdXZlYXVfYm8oYm8pOworCisJdHRtX2JvX2t1bm1hcCgmbnZiby0+a21hcCk7CisKKwlpZiAodW5saWtlbHkobnZiby0+Z2VtKSkKKwkJRFJNX0VSUk9SKCJibyAlcCBzdGlsbCBhdHRhY2hlZCB0byBHRU0gb2JqZWN0XG4iLCBibyk7CisKKwlzcGluX2xvY2soJmRldl9wcml2LT50dG0uYm9fbGlzdF9sb2NrKTsKKwlsaXN0X2RlbCgmbnZiby0+aGVhZCk7CisJc3Bpbl91bmxvY2soJmRldl9wcml2LT50dG0uYm9fbGlzdF9sb2NrKTsKKwlrZnJlZShudmJvKTsKK30KKworaW50Citub3V2ZWF1X2JvX25ldyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLAorCSAgICAgICBpbnQgc2l6ZSwgaW50IGFsaWduLCB1aW50MzJfdCBmbGFncywgdWludDMyX3QgdGlsZV9tb2RlLAorCSAgICAgICB1aW50MzJfdCB0aWxlX2ZsYWdzLCBib29sIG5vX3ZtLCBib29sIG1hcHBhYmxlLAorCSAgICAgICBzdHJ1Y3Qgbm91dmVhdV9ibyAqKnBudmJvKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym87CisJaW50IHJldCwgbiA9IDA7CisKKwludmJvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5vdXZlYXVfYm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW52Ym8pCisJCXJldHVybiAtRU5PTUVNOworCUlOSVRfTElTVF9IRUFEKCZudmJvLT5oZWFkKTsKKwlJTklUX0xJU1RfSEVBRCgmbnZiby0+ZW50cnkpOworCW52Ym8tPm1hcHBhYmxlID0gbWFwcGFibGU7CisJbnZiby0+bm9fdm0gPSBub192bTsKKwludmJvLT50aWxlX21vZGUgPSB0aWxlX21vZGU7CisJbnZiby0+dGlsZV9mbGFncyA9IHRpbGVfZmxhZ3M7CisKKwkvKgorCSAqIFNvbWUgb2YgdGhlIHRpbGVfZmxhZ3MgaGF2ZSBhIHBlcmlvZGljIHN0cnVjdHVyZSBvZiBOKjQwOTYgYnl0ZXMsCisJICogYWxpZ24gdG8gdG8gdGhhdCBhcyB3ZWxsIGFzIHRoZSBwYWdlIHNpemUuIE92ZXJhbGxvY2F0ZSBtZW1vcnkgdG8KKwkgKiBhdm9pZCBjb3JydXB0aW9uIG9mIG90aGVyIGJ1ZmZlciBvYmplY3RzLgorCSAqLworCXN3aXRjaCAodGlsZV9mbGFncykgeworCWNhc2UgMHgxODAwOgorCWNhc2UgMHgyODAwOgorCWNhc2UgMHg0ODAwOgorCWNhc2UgMHg3YTAwOgorCQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHhBMCkgeworCQkJLyogVGhpcyBpcyBiYXNlZCBvbiBoaWdoIGVuZCBjYXJkcyB3aXRoIDQ0OCBiaXRzCisJCQkgKiBtZW1vcnkgYnVzLCBjb3VsZCBiZSBkaWZmZXJlbnQgZWxzZXdoZXJlLiovCisJCQlzaXplICs9IDYgKiAyODY3MjsKKwkJCS8qIDggKiAyODY3MiBpcyB0aGUgYWN0dWFsIGFsaWdubWVudCByZXF1aXJlbWVudCwKKwkJCSAqIGJ1dCB3ZSBtdXN0IGFsc28gYWxpZ24gdG8gcGFnZSBzaXplLiAqLworCQkJYWxpZ24gPSAyICogOCAqIDI4NjcyOworCQl9IGVsc2UgaWYgKGRldl9wcml2LT5jaGlwc2V0ID49IDB4OTApIHsKKwkJCXNpemUgKz0gMyAqIDE2Mzg0OworCQkJYWxpZ24gPSAxMiAqIDE2ODM0OworCQl9IGVsc2UgeworCQkJc2l6ZSArPSAzICogODE5MjsKKwkJCS8qIDEyICogODE5MiBpcyB0aGUgYWN0dWFsIGFsaWdubWVudCByZXF1aXJlbWVudCwKKwkJCSAqIGJ1dCB3ZSBtdXN0IGFsc28gYWxpZ24gdG8gcGFnZSBzaXplLiAqLworCQkJYWxpZ24gPSAyICogMTIgKiA4MTkyOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWFsaWduID4+PSBQQUdFX1NISUZUOworCisJc2l6ZSA9IChzaXplICsgKFBBR0VfU0laRSAtIDEpKSAmIH4oUEFHRV9TSVpFIC0gMSk7CisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNTApIHsKKwkJc2l6ZSA9IChzaXplICsgNjU1MzUpICYgfjY1NTM1OworCQlpZiAoYWxpZ24gPCAoNjU1MzYgLyBQQUdFX1NJWkUpKQorCQkJYWxpZ24gPSAoNjU1MzYgLyBQQUdFX1NJWkUpOworCX0KKworCWlmIChmbGFncyAmIFRUTV9QTF9GTEFHX1ZSQU0pCisJCW52Ym8tPnBsYWNlbWVudHNbbisrXSA9IFRUTV9QTF9GTEFHX1ZSQU0gfCBUVE1fUExfTUFTS19DQUNISU5HOworCWlmIChmbGFncyAmIFRUTV9QTF9GTEFHX1RUKQorCQludmJvLT5wbGFjZW1lbnRzW24rK10gPSBUVE1fUExfRkxBR19UVCB8IFRUTV9QTF9NQVNLX0NBQ0hJTkc7CisJbnZiby0+cGxhY2VtZW50LmZwZm4gPSAwOworCW52Ym8tPnBsYWNlbWVudC5scGZuID0gbWFwcGFibGUgPyBkZXZfcHJpdi0+ZmJfbWFwcGFibGVfcGFnZXMgOiAwOworCW52Ym8tPnBsYWNlbWVudC5wbGFjZW1lbnQgPSBudmJvLT5wbGFjZW1lbnRzOworCW52Ym8tPnBsYWNlbWVudC5idXN5X3BsYWNlbWVudCA9IG52Ym8tPnBsYWNlbWVudHM7CisJbnZiby0+cGxhY2VtZW50Lm51bV9wbGFjZW1lbnQgPSBuOworCW52Ym8tPnBsYWNlbWVudC5udW1fYnVzeV9wbGFjZW1lbnQgPSBuOworCisJbnZiby0+Y2hhbm5lbCA9IGNoYW47CisJbm91dmVhdV9ib19wbGFjZW1lbnRfc2V0KG52Ym8sIGZsYWdzKTsKKwlyZXQgPSB0dG1fYm9faW5pdCgmZGV2X3ByaXYtPnR0bS5iZGV2LCAmbnZiby0+Ym8sIHNpemUsCisJCQkgIHR0bV9ib190eXBlX2RldmljZSwgJm52Ym8tPnBsYWNlbWVudCwgYWxpZ24sIDAsCisJCQkgIGZhbHNlLCBOVUxMLCBzaXplLCBub3V2ZWF1X2JvX2RlbF90dG0pOworCW52Ym8tPmNoYW5uZWwgPSBOVUxMOworCWlmIChyZXQpIHsKKwkJLyogdHRtIHdpbGwgY2FsbCBub3V2ZWF1X2JvX2RlbF90dG0gaWYgaXQgZmFpbHMuLiAqLworCQlyZXR1cm4gcmV0OworCX0KKworCXNwaW5fbG9jaygmZGV2X3ByaXYtPnR0bS5ib19saXN0X2xvY2spOworCWxpc3RfYWRkX3RhaWwoJm52Ym8tPmhlYWQsICZkZXZfcHJpdi0+dHRtLmJvX2xpc3QpOworCXNwaW5fdW5sb2NrKCZkZXZfcHJpdi0+dHRtLmJvX2xpc3RfbG9jayk7CisJKnBudmJvID0gbnZibzsKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbm91dmVhdV9ib19wbGFjZW1lbnRfc2V0KHN0cnVjdCBub3V2ZWF1X2JvICpudmJvLCB1aW50MzJfdCBtZW10eXBlKQoreworCWludCBuID0gMDsKKworCWlmIChtZW10eXBlICYgVFRNX1BMX0ZMQUdfVlJBTSkKKwkJbnZiby0+cGxhY2VtZW50c1tuKytdID0gVFRNX1BMX0ZMQUdfVlJBTSB8IFRUTV9QTF9NQVNLX0NBQ0hJTkc7CisJaWYgKG1lbXR5cGUgJiBUVE1fUExfRkxBR19UVCkKKwkJbnZiby0+cGxhY2VtZW50c1tuKytdID0gVFRNX1BMX0ZMQUdfVFQgfCBUVE1fUExfTUFTS19DQUNISU5HOworCWlmIChtZW10eXBlICYgVFRNX1BMX0ZMQUdfU1lTVEVNKQorCQludmJvLT5wbGFjZW1lbnRzW24rK10gPSBUVE1fUExfRkxBR19TWVNURU0gfCBUVE1fUExfTUFTS19DQUNISU5HOworCW52Ym8tPnBsYWNlbWVudC5wbGFjZW1lbnQgPSBudmJvLT5wbGFjZW1lbnRzOworCW52Ym8tPnBsYWNlbWVudC5idXN5X3BsYWNlbWVudCA9IG52Ym8tPnBsYWNlbWVudHM7CisJbnZiby0+cGxhY2VtZW50Lm51bV9wbGFjZW1lbnQgPSBuOworCW52Ym8tPnBsYWNlbWVudC5udW1fYnVzeV9wbGFjZW1lbnQgPSBuOworfQorCitpbnQKK25vdXZlYXVfYm9fcGluKHN0cnVjdCBub3V2ZWF1X2JvICpudmJvLCB1aW50MzJfdCBtZW10eXBlKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IG5vdXZlYXVfYmRldihudmJvLT5iby5iZGV2KTsKKwlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvID0gJm52Ym8tPmJvOworCWludCByZXQsIGk7CisKKwlpZiAobnZiby0+cGluX3JlZmNudCAmJiAhKG1lbXR5cGUgJiAoMSA8PCBiby0+bWVtLm1lbV90eXBlKSkpIHsKKwkJTlZfRVJST1Iobm91dmVhdV9iZGV2KGJvLT5iZGV2KS0+ZGV2LAorCQkJICJibyAlcCBwaW5uZWQgZWxzZXdoZXJlOiAweCUwOHggdnMgMHglMDh4XG4iLCBibywKKwkJCSAxIDw8IGJvLT5tZW0ubWVtX3R5cGUsIG1lbXR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobnZiby0+cGluX3JlZmNudCsrKQorCQlyZXR1cm4gMDsKKworCXJldCA9IHR0bV9ib19yZXNlcnZlKGJvLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCW5vdXZlYXVfYm9fcGxhY2VtZW50X3NldChudmJvLCBtZW10eXBlKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnZiby0+cGxhY2VtZW50Lm51bV9wbGFjZW1lbnQ7IGkrKykKKwkJbnZiby0+cGxhY2VtZW50c1tpXSB8PSBUVE1fUExfRkxBR19OT19FVklDVDsKKworCXJldCA9IHR0bV9ib192YWxpZGF0ZShibywgJm52Ym8tPnBsYWNlbWVudCwgZmFsc2UsIGZhbHNlKTsKKwlpZiAocmV0ID09IDApIHsKKwkJc3dpdGNoIChiby0+bWVtLm1lbV90eXBlKSB7CisJCWNhc2UgVFRNX1BMX1ZSQU06CisJCQlkZXZfcHJpdi0+ZmJfYXBlcl9mcmVlIC09IGJvLT5tZW0uc2l6ZTsKKwkJCWJyZWFrOworCQljYXNlIFRUTV9QTF9UVDoKKwkJCWRldl9wcml2LT5nYXJ0X2luZm8uYXBlcl9mcmVlIC09IGJvLT5tZW0uc2l6ZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJdHRtX2JvX3VucmVzZXJ2ZShibyk7CitvdXQ6CisJaWYgKHVubGlrZWx5KHJldCkpCisJCW52Ym8tPnBpbl9yZWZjbnQtLTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK25vdXZlYXVfYm9fdW5waW4oc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8pCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gbm91dmVhdV9iZGV2KG52Ym8tPmJvLmJkZXYpOworCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8gPSAmbnZiby0+Ym87CisJaW50IHJldCwgaTsKKworCWlmICgtLW52Ym8tPnBpbl9yZWZjbnQpCisJCXJldHVybiAwOworCisJcmV0ID0gdHRtX2JvX3Jlc2VydmUoYm8sIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnZiby0+cGxhY2VtZW50Lm51bV9wbGFjZW1lbnQ7IGkrKykKKwkJbnZiby0+cGxhY2VtZW50c1tpXSAmPSB+VFRNX1BMX0ZMQUdfTk9fRVZJQ1Q7CisKKwlyZXQgPSB0dG1fYm9fdmFsaWRhdGUoYm8sICZudmJvLT5wbGFjZW1lbnQsIGZhbHNlLCBmYWxzZSk7CisJaWYgKHJldCA9PSAwKSB7CisJCXN3aXRjaCAoYm8tPm1lbS5tZW1fdHlwZSkgeworCQljYXNlIFRUTV9QTF9WUkFNOgorCQkJZGV2X3ByaXYtPmZiX2FwZXJfZnJlZSArPSBiby0+bWVtLnNpemU7CisJCQlicmVhazsKKwkJY2FzZSBUVE1fUExfVFQ6CisJCQlkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfZnJlZSArPSBiby0+bWVtLnNpemU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCisJdHRtX2JvX3VucmVzZXJ2ZShibyk7CisJcmV0dXJuIHJldDsKK30KKworaW50Citub3V2ZWF1X2JvX21hcChzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gdHRtX2JvX3Jlc2VydmUoJm52Ym8tPmJvLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gdHRtX2JvX2ttYXAoJm52Ym8tPmJvLCAwLCBudmJvLT5iby5tZW0ubnVtX3BhZ2VzLCAmbnZiby0+a21hcCk7CisJdHRtX2JvX3VucmVzZXJ2ZSgmbnZiby0+Ym8pOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQKK25vdXZlYXVfYm9fdW5tYXAoc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8pCit7CisJdHRtX2JvX2t1bm1hcCgmbnZiby0+a21hcCk7Cit9CisKK3UxNgorbm91dmVhdV9ib19yZDE2KHN0cnVjdCBub3V2ZWF1X2JvICpudmJvLCB1bnNpZ25lZCBpbmRleCkKK3sKKwlib29sIGlzX2lvbWVtOworCXUxNiAqbWVtID0gdHRtX2ttYXBfb2JqX3ZpcnR1YWwoJm52Ym8tPmttYXAsICZpc19pb21lbSk7CisJbWVtID0gJm1lbVtpbmRleF07CisJaWYgKGlzX2lvbWVtKQorCQlyZXR1cm4gaW9yZWFkMTZfbmF0aXZlKCh2b2lkIF9fZm9yY2UgX19pb21lbSAqKW1lbSk7CisJZWxzZQorCQlyZXR1cm4gKm1lbTsKK30KKwordm9pZAorbm91dmVhdV9ib193cjE2KHN0cnVjdCBub3V2ZWF1X2JvICpudmJvLCB1bnNpZ25lZCBpbmRleCwgdTE2IHZhbCkKK3sKKwlib29sIGlzX2lvbWVtOworCXUxNiAqbWVtID0gdHRtX2ttYXBfb2JqX3ZpcnR1YWwoJm52Ym8tPmttYXAsICZpc19pb21lbSk7CisJbWVtID0gJm1lbVtpbmRleF07CisJaWYgKGlzX2lvbWVtKQorCQlpb3dyaXRlMTZfbmF0aXZlKHZhbCwgKHZvaWQgX19mb3JjZSBfX2lvbWVtICopbWVtKTsKKwllbHNlCisJCSptZW0gPSB2YWw7Cit9CisKK3UzMgorbm91dmVhdV9ib19yZDMyKHN0cnVjdCBub3V2ZWF1X2JvICpudmJvLCB1bnNpZ25lZCBpbmRleCkKK3sKKwlib29sIGlzX2lvbWVtOworCXUzMiAqbWVtID0gdHRtX2ttYXBfb2JqX3ZpcnR1YWwoJm52Ym8tPmttYXAsICZpc19pb21lbSk7CisJbWVtID0gJm1lbVtpbmRleF07CisJaWYgKGlzX2lvbWVtKQorCQlyZXR1cm4gaW9yZWFkMzJfbmF0aXZlKCh2b2lkIF9fZm9yY2UgX19pb21lbSAqKW1lbSk7CisJZWxzZQorCQlyZXR1cm4gKm1lbTsKK30KKwordm9pZAorbm91dmVhdV9ib193cjMyKHN0cnVjdCBub3V2ZWF1X2JvICpudmJvLCB1bnNpZ25lZCBpbmRleCwgdTMyIHZhbCkKK3sKKwlib29sIGlzX2lvbWVtOworCXUzMiAqbWVtID0gdHRtX2ttYXBfb2JqX3ZpcnR1YWwoJm52Ym8tPmttYXAsICZpc19pb21lbSk7CisJbWVtID0gJm1lbVtpbmRleF07CisJaWYgKGlzX2lvbWVtKQorCQlpb3dyaXRlMzJfbmF0aXZlKHZhbCwgKHZvaWQgX19mb3JjZSBfX2lvbWVtICopbWVtKTsKKwllbHNlCisJCSptZW0gPSB2YWw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHRtX2JhY2tlbmQgKgorbm91dmVhdV9ib19jcmVhdGVfdHRtX2JhY2tlbmRfZW50cnkoc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gbm91dmVhdV9iZGV2KGJkZXYpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkZXZfcHJpdi0+ZGV2OworCisJc3dpdGNoIChkZXZfcHJpdi0+Z2FydF9pbmZvLnR5cGUpIHsKKwljYXNlIE5PVVZFQVVfR0FSVF9BR1A6CisJCXJldHVybiB0dG1fYWdwX2JhY2tlbmRfaW5pdChiZGV2LCBkZXYtPmFncC0+YnJpZGdlKTsKKwljYXNlIE5PVVZFQVVfR0FSVF9TR0RNQToKKwkJcmV0dXJuIG5vdXZlYXVfc2dkbWFfaW5pdF90dG0oZGV2KTsKKwlkZWZhdWx0OgorCQlOVl9FUlJPUihkZXYsICJVbmtub3duIEdBUlQgdHlwZSAlZFxuIiwKKwkJCSBkZXZfcHJpdi0+Z2FydF9pbmZvLnR5cGUpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludAorbm91dmVhdV9ib19pbnZhbGlkYXRlX2NhY2hlcyhzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiwgdWludDMyX3QgZmxhZ3MpCit7CisJLyogV2UnbGwgZG8gdGhpcyBmcm9tIHVzZXIgc3BhY2UuICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfYm9faW5pdF9tZW1fdHlwZShzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiwgdWludDMyX3QgdHlwZSwKKwkJCSBzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXIgKm1hbikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBub3V2ZWF1X2JkZXYoYmRldik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFRUTV9QTF9TWVNURU06CisJCW1hbi0+ZmxhZ3MgPSBUVE1fTUVNVFlQRV9GTEFHX01BUFBBQkxFOworCQltYW4tPmF2YWlsYWJsZV9jYWNoaW5nID0gVFRNX1BMX01BU0tfQ0FDSElORzsKKwkJbWFuLT5kZWZhdWx0X2NhY2hpbmcgPSBUVE1fUExfRkxBR19DQUNIRUQ7CisJCWJyZWFrOworCWNhc2UgVFRNX1BMX1ZSQU06CisJCW1hbi0+ZmxhZ3MgPSBUVE1fTUVNVFlQRV9GTEFHX0ZJWEVEIHwKKwkJCSAgICAgVFRNX01FTVRZUEVfRkxBR19NQVBQQUJMRSB8CisJCQkgICAgIFRUTV9NRU1UWVBFX0ZMQUdfTkVFRFNfSU9SRU1BUDsKKwkJbWFuLT5hdmFpbGFibGVfY2FjaGluZyA9IFRUTV9QTF9GTEFHX1VOQ0FDSEVEIHwKKwkJCQkJIFRUTV9QTF9GTEFHX1dDOworCQltYW4tPmRlZmF1bHRfY2FjaGluZyA9IFRUTV9QTF9GTEFHX1dDOworCisJCW1hbi0+aW9fYWRkciA9IE5VTEw7CisJCW1hbi0+aW9fb2Zmc2V0ID0gZHJtX2dldF9yZXNvdXJjZV9zdGFydChkZXYsIDEpOworCQltYW4tPmlvX3NpemUgPSBkcm1fZ2V0X3Jlc291cmNlX2xlbihkZXYsIDEpOworCQlpZiAobWFuLT5pb19zaXplID4gbm91dmVhdV9tZW1fZmJfYW1vdW50KGRldikpCisJCQltYW4tPmlvX3NpemUgPSBub3V2ZWF1X21lbV9mYl9hbW91bnQoZGV2KTsKKworCQltYW4tPmdwdV9vZmZzZXQgPSBkZXZfcHJpdi0+dm1fdnJhbV9iYXNlOworCQlicmVhazsKKwljYXNlIFRUTV9QTF9UVDoKKwkJc3dpdGNoIChkZXZfcHJpdi0+Z2FydF9pbmZvLnR5cGUpIHsKKwkJY2FzZSBOT1VWRUFVX0dBUlRfQUdQOgorCQkJbWFuLT5mbGFncyA9IFRUTV9NRU1UWVBFX0ZMQUdfTUFQUEFCTEUgfAorCQkJCSAgICAgVFRNX01FTVRZUEVfRkxBR19ORUVEU19JT1JFTUFQOworCQkJbWFuLT5hdmFpbGFibGVfY2FjaGluZyA9IFRUTV9QTF9GTEFHX1VOQ0FDSEVEOworCQkJbWFuLT5kZWZhdWx0X2NhY2hpbmcgPSBUVE1fUExfRkxBR19VTkNBQ0hFRDsKKwkJCWJyZWFrOworCQljYXNlIE5PVVZFQVVfR0FSVF9TR0RNQToKKwkJCW1hbi0+ZmxhZ3MgPSBUVE1fTUVNVFlQRV9GTEFHX01BUFBBQkxFIHwKKwkJCQkgICAgIFRUTV9NRU1UWVBFX0ZMQUdfQ01BOworCQkJbWFuLT5hdmFpbGFibGVfY2FjaGluZyA9IFRUTV9QTF9NQVNLX0NBQ0hJTkc7CisJCQltYW4tPmRlZmF1bHRfY2FjaGluZyA9IFRUTV9QTF9GTEFHX0NBQ0hFRDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJTlZfRVJST1IoZGV2LCAiVW5rbm93biBHQVJUIHR5cGU6ICVkXG4iLAorCQkJCSBkZXZfcHJpdi0+Z2FydF9pbmZvLnR5cGUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQltYW4tPmlvX29mZnNldCAgPSBkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfYmFzZTsKKwkJbWFuLT5pb19zaXplICAgID0gZGV2X3ByaXYtPmdhcnRfaW5mby5hcGVyX3NpemU7CisJCW1hbi0+aW9fYWRkciAgID0gTlVMTDsKKwkJbWFuLT5ncHVfb2Zmc2V0ID0gZGV2X3ByaXYtPnZtX2dhcnRfYmFzZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTlZfRVJST1IoZGV2LCAiVW5zdXBwb3J0ZWQgbWVtb3J5IHR5cGUgJXVcbiIsICh1bnNpZ25lZCl0eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbm91dmVhdV9ib19ldmljdF9mbGFncyhzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLCBzdHJ1Y3QgdHRtX3BsYWNlbWVudCAqcGwpCit7CisJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8gPSBub3V2ZWF1X2JvKGJvKTsKKworCXN3aXRjaCAoYm8tPm1lbS5tZW1fdHlwZSkgeworCWRlZmF1bHQ6CisJCW5vdXZlYXVfYm9fcGxhY2VtZW50X3NldChudmJvLCBUVE1fUExfRkxBR19TWVNURU0pOworCQlicmVhazsKKwl9Cit9CisKKworLyogR1BVLWFzc2lzdGVkIGNvcHkgdXNpbmcgTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVQsIGNhbiBhY2Nlc3MKKyAqIFRUTV9QTF97VlJBTSxUVH0gZGlyZWN0bHkuCisgKi8KK3N0YXRpYyBpbnQKK25vdXZlYXVfYm9fbW92ZV9hY2NlbF9jbGVhbnVwKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCQkgICAgICBzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibywgYm9vbCBldmljdCwgYm9vbCBub193YWl0LAorCQkJICAgICAgc3RydWN0IHR0bV9tZW1fcmVnICpuZXdfbWVtKQoreworCXN0cnVjdCBub3V2ZWF1X2ZlbmNlICpmZW5jZSA9IE5VTEw7CisJaW50IHJldDsKKworCXJldCA9IG5vdXZlYXVfZmVuY2VfbmV3KGNoYW4sICZmZW5jZSwgdHJ1ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHR0bV9ib19tb3ZlX2FjY2VsX2NsZWFudXAoJm52Ym8tPmJvLCBmZW5jZSwgTlVMTCwKKwkJCQkJZXZpY3QsIG5vX3dhaXQsIG5ld19tZW0pOworCW5vdXZlYXVfZmVuY2VfdW5yZWYoKHZvaWQgKikmZmVuY2UpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QKK25vdXZlYXVfYm9fbWVtX2N0eGRtYShzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibywgc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJICAgICAgc3RydWN0IHR0bV9tZW1fcmVnICptZW0pCit7CisJaWYgKGNoYW4gPT0gbm91dmVhdV9iZGV2KG52Ym8tPmJvLmJkZXYpLT5jaGFubmVsKSB7CisJCWlmIChtZW0tPm1lbV90eXBlID09IFRUTV9QTF9UVCkKKwkJCXJldHVybiBOdkRtYUdBUlQ7CisJCXJldHVybiBOdkRtYVZSQU07CisJfQorCisJaWYgKG1lbS0+bWVtX3R5cGUgPT0gVFRNX1BMX1RUKQorCQlyZXR1cm4gY2hhbi0+Z2FydF9oYW5kbGU7CisJcmV0dXJuIGNoYW4tPnZyYW1faGFuZGxlOworfQorCitzdGF0aWMgaW50Citub3V2ZWF1X2JvX21vdmVfbTJtZihzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLCBpbnQgZXZpY3QsIGludCBub193YWl0LAorCQkgICAgIHN0cnVjdCB0dG1fbWVtX3JlZyAqb2xkX21lbSwgc3RydWN0IHR0bV9tZW1fcmVnICpuZXdfbWVtKQoreworCXN0cnVjdCBub3V2ZWF1X2JvICpudmJvID0gbm91dmVhdV9ibyhibyk7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gbm91dmVhdV9iZGV2KGJvLT5iZGV2KTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuOworCXVpbnQ2NF90IHNyY19vZmZzZXQsIGRzdF9vZmZzZXQ7CisJdWludDMyX3QgcGFnZV9jb3VudDsKKwlpbnQgcmV0OworCisJY2hhbiA9IG52Ym8tPmNoYW5uZWw7CisJaWYgKCFjaGFuIHx8IG52Ym8tPnRpbGVfZmxhZ3MgfHwgbnZiby0+bm9fdm0pIHsKKwkJY2hhbiA9IGRldl9wcml2LT5jaGFubmVsOworCQlpZiAoIWNoYW4pCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzcmNfb2Zmc2V0ID0gb2xkX21lbS0+bW1fbm9kZS0+c3RhcnQgPDwgUEFHRV9TSElGVDsKKwlkc3Rfb2Zmc2V0ID0gbmV3X21lbS0+bW1fbm9kZS0+c3RhcnQgPDwgUEFHRV9TSElGVDsKKwlpZiAoY2hhbiAhPSBkZXZfcHJpdi0+Y2hhbm5lbCkgeworCQlpZiAob2xkX21lbS0+bWVtX3R5cGUgPT0gVFRNX1BMX1RUKQorCQkJc3JjX29mZnNldCArPSBkZXZfcHJpdi0+dm1fZ2FydF9iYXNlOworCQllbHNlCisJCQlzcmNfb2Zmc2V0ICs9IGRldl9wcml2LT52bV92cmFtX2Jhc2U7CisKKwkJaWYgKG5ld19tZW0tPm1lbV90eXBlID09IFRUTV9QTF9UVCkKKwkJCWRzdF9vZmZzZXQgKz0gZGV2X3ByaXYtPnZtX2dhcnRfYmFzZTsKKwkJZWxzZQorCQkJZHN0X29mZnNldCArPSBkZXZfcHJpdi0+dm1fdnJhbV9iYXNlOworCX0KKworCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgMyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViTTJNRiwgTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVRfRE1BX1NPVVJDRSwgMik7CisJT1VUX1JJTkcoY2hhbiwgbm91dmVhdV9ib19tZW1fY3R4ZG1hKG52Ym8sIGNoYW4sIG9sZF9tZW0pKTsKKwlPVVRfUklORyhjaGFuLCBub3V2ZWF1X2JvX21lbV9jdHhkbWEobnZibywgY2hhbiwgbmV3X21lbSkpOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApIHsKKwkJcmV0ID0gUklOR19TUEFDRShjaGFuLCA0KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJNMk1GLCAweDAyMDAsIDEpOworCQlPVVRfUklORyhjaGFuLCAxKTsKKwkJQkVHSU5fUklORyhjaGFuLCBOdlN1Yk0yTUYsIDB4MDIxYywgMSk7CisJCU9VVF9SSU5HKGNoYW4sIDEpOworCX0KKworCXBhZ2VfY291bnQgPSBuZXdfbWVtLT5udW1fcGFnZXM7CisJd2hpbGUgKHBhZ2VfY291bnQpIHsKKwkJaW50IGxpbmVfY291bnQgPSAocGFnZV9jb3VudCA+IDIwNDcpID8gMjA0NyA6IHBhZ2VfY291bnQ7CisKKwkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApIHsKKwkJCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgMyk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCQlCRUdJTl9SSU5HKGNoYW4sIE52U3ViTTJNRiwgMHgwMjM4LCAyKTsKKwkJCU9VVF9SSU5HKGNoYW4sIHVwcGVyXzMyX2JpdHMoc3JjX29mZnNldCkpOworCQkJT1VUX1JJTkcoY2hhbiwgdXBwZXJfMzJfYml0cyhkc3Rfb2Zmc2V0KSk7CisJCX0KKwkJcmV0ID0gUklOR19TUEFDRShjaGFuLCAxMSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlCRUdJTl9SSU5HKGNoYW4sIE52U3ViTTJNRiwKKwkJCQkgTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVRfT0ZGU0VUX0lOLCA4KTsKKwkJT1VUX1JJTkcoY2hhbiwgbG93ZXJfMzJfYml0cyhzcmNfb2Zmc2V0KSk7CisJCU9VVF9SSU5HKGNoYW4sIGxvd2VyXzMyX2JpdHMoZHN0X29mZnNldCkpOworCQlPVVRfUklORyhjaGFuLCBQQUdFX1NJWkUpOyAvKiBzcmNfcGl0Y2ggKi8KKwkJT1VUX1JJTkcoY2hhbiwgUEFHRV9TSVpFKTsgLyogZHN0X3BpdGNoICovCisJCU9VVF9SSU5HKGNoYW4sIFBBR0VfU0laRSk7IC8qIGxpbmVfbGVuZ3RoICovCisJCU9VVF9SSU5HKGNoYW4sIGxpbmVfY291bnQpOworCQlPVVRfUklORyhjaGFuLCAoMTw8OCl8KDE8PDApKTsKKwkJT1VUX1JJTkcoY2hhbiwgMCk7CisJCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJNMk1GLCBOVl9NRU1PUllfVE9fTUVNT1JZX0ZPUk1BVF9OT1AsIDEpOworCQlPVVRfUklORyhjaGFuLCAwKTsKKworCQlwYWdlX2NvdW50IC09IGxpbmVfY291bnQ7CisJCXNyY19vZmZzZXQgKz0gKFBBR0VfU0laRSAqIGxpbmVfY291bnQpOworCQlkc3Rfb2Zmc2V0ICs9IChQQUdFX1NJWkUgKiBsaW5lX2NvdW50KTsKKwl9CisKKwlyZXR1cm4gbm91dmVhdV9ib19tb3ZlX2FjY2VsX2NsZWFudXAoY2hhbiwgbnZibywgZXZpY3QsIG5vX3dhaXQsIG5ld19tZW0pOworfQorCitzdGF0aWMgaW50Citub3V2ZWF1X2JvX21vdmVfZmxpcGQoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywgYm9vbCBldmljdCwgYm9vbCBpbnRyLAorCQkgICAgICBib29sIG5vX3dhaXQsIHN0cnVjdCB0dG1fbWVtX3JlZyAqbmV3X21lbSkKK3sKKwl1MzIgcGxhY2VtZW50X21lbXR5cGUgPSBUVE1fUExfRkxBR19UVCB8IFRUTV9QTF9NQVNLX0NBQ0hJTkc7CisJc3RydWN0IHR0bV9wbGFjZW1lbnQgcGxhY2VtZW50OworCXN0cnVjdCB0dG1fbWVtX3JlZyB0bXBfbWVtOworCWludCByZXQ7CisKKwlwbGFjZW1lbnQuZnBmbiA9IHBsYWNlbWVudC5scGZuID0gMDsKKwlwbGFjZW1lbnQubnVtX3BsYWNlbWVudCA9IHBsYWNlbWVudC5udW1fYnVzeV9wbGFjZW1lbnQgPSAxOworCXBsYWNlbWVudC5wbGFjZW1lbnQgPSAmcGxhY2VtZW50X21lbXR5cGU7CisKKwl0bXBfbWVtID0gKm5ld19tZW07CisJdG1wX21lbS5tbV9ub2RlID0gTlVMTDsKKwlyZXQgPSB0dG1fYm9fbWVtX3NwYWNlKGJvLCAmcGxhY2VtZW50LCAmdG1wX21lbSwgaW50ciwgbm9fd2FpdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHR0bV90dF9iaW5kKGJvLT50dG0sICZ0bXBfbWVtKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IG5vdXZlYXVfYm9fbW92ZV9tMm1mKGJvLCB0cnVlLCBub193YWl0LCAmYm8tPm1lbSwgJnRtcF9tZW0pOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gdHRtX2JvX21vdmVfdHRtKGJvLCBldmljdCwgbm9fd2FpdCwgbmV3X21lbSk7CitvdXQ6CisJaWYgKHRtcF9tZW0ubW1fbm9kZSkgeworCQlzcGluX2xvY2soJmJvLT5iZGV2LT5nbG9iLT5scnVfbG9jayk7CisJCWRybV9tbV9wdXRfYmxvY2sodG1wX21lbS5tbV9ub2RlKTsKKwkJc3Bpbl91bmxvY2soJmJvLT5iZGV2LT5nbG9iLT5scnVfbG9jayk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorbm91dmVhdV9ib19tb3ZlX2ZsaXBzKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sIGJvb2wgZXZpY3QsIGJvb2wgaW50ciwKKwkJICAgICAgYm9vbCBub193YWl0LCBzdHJ1Y3QgdHRtX21lbV9yZWcgKm5ld19tZW0pCit7CisJdTMyIHBsYWNlbWVudF9tZW10eXBlID0gVFRNX1BMX0ZMQUdfVFQgfCBUVE1fUExfTUFTS19DQUNISU5HOworCXN0cnVjdCB0dG1fcGxhY2VtZW50IHBsYWNlbWVudDsKKwlzdHJ1Y3QgdHRtX21lbV9yZWcgdG1wX21lbTsKKwlpbnQgcmV0OworCisJcGxhY2VtZW50LmZwZm4gPSBwbGFjZW1lbnQubHBmbiA9IDA7CisJcGxhY2VtZW50Lm51bV9wbGFjZW1lbnQgPSBwbGFjZW1lbnQubnVtX2J1c3lfcGxhY2VtZW50ID0gMTsKKwlwbGFjZW1lbnQucGxhY2VtZW50ID0gJnBsYWNlbWVudF9tZW10eXBlOworCisJdG1wX21lbSA9ICpuZXdfbWVtOworCXRtcF9tZW0ubW1fbm9kZSA9IE5VTEw7CisJcmV0ID0gdHRtX2JvX21lbV9zcGFjZShibywgJnBsYWNlbWVudCwgJnRtcF9tZW0sIGludHIsIG5vX3dhaXQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB0dG1fYm9fbW92ZV90dG0oYm8sIGV2aWN0LCBub193YWl0LCAmdG1wX21lbSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBub3V2ZWF1X2JvX21vdmVfbTJtZihibywgdHJ1ZSwgbm9fd2FpdCwgJmJvLT5tZW0sIG5ld19tZW0pOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCitvdXQ6CisJaWYgKHRtcF9tZW0ubW1fbm9kZSkgeworCQlzcGluX2xvY2soJmJvLT5iZGV2LT5nbG9iLT5scnVfbG9jayk7CisJCWRybV9tbV9wdXRfYmxvY2sodG1wX21lbS5tbV9ub2RlKTsKKwkJc3Bpbl91bmxvY2soJmJvLT5iZGV2LT5nbG9iLT5scnVfbG9jayk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorbm91dmVhdV9ib19tb3ZlKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sIGJvb2wgZXZpY3QsIGJvb2wgaW50ciwKKwkJYm9vbCBub193YWl0LCBzdHJ1Y3QgdHRtX21lbV9yZWcgKm5ld19tZW0pCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gbm91dmVhdV9iZGV2KGJvLT5iZGV2KTsKKwlzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibyA9IG5vdXZlYXVfYm8oYm8pOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkZXZfcHJpdi0+ZGV2OworCXN0cnVjdCB0dG1fbWVtX3JlZyAqb2xkX21lbSA9ICZiby0+bWVtOworCWludCByZXQ7CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl81MCAmJiBuZXdfbWVtLT5tZW1fdHlwZSA9PSBUVE1fUExfVlJBTSAmJgorCSAgICAhbnZiby0+bm9fdm0pIHsKKwkJdWludDY0X3Qgb2Zmc2V0ID0gbmV3X21lbS0+bW1fbm9kZS0+c3RhcnQgPDwgUEFHRV9TSElGVDsKKworCQlyZXQgPSBudjUwX21lbV92bV9iaW5kX2xpbmVhcihkZXYsCisJCQkJCSAgICAgIG9mZnNldCArIGRldl9wcml2LT52bV92cmFtX2Jhc2UsCisJCQkJCSAgICAgIG5ld19tZW0tPnNpemUsIG52Ym8tPnRpbGVfZmxhZ3MsCisJCQkJCSAgICAgIG9mZnNldCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChkZXZfcHJpdi0+aW5pdF9zdGF0ZSAhPSBOT1VWRUFVX0NBUkRfSU5JVF9ET05FKQorCQlyZXR1cm4gdHRtX2JvX21vdmVfbWVtY3B5KGJvLCBldmljdCwgbm9fd2FpdCwgbmV3X21lbSk7CisKKwlpZiAob2xkX21lbS0+bWVtX3R5cGUgPT0gVFRNX1BMX1NZU1RFTSAmJiAhYm8tPnR0bSkgeworCQlCVUdfT04oYm8tPm1lbS5tbV9ub2RlICE9IE5VTEwpOworCQliby0+bWVtID0gKm5ld19tZW07CisJCW5ld19tZW0tPm1tX25vZGUgPSBOVUxMOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobmV3X21lbS0+bWVtX3R5cGUgPT0gVFRNX1BMX1NZU1RFTSkgeworCQlpZiAob2xkX21lbS0+bWVtX3R5cGUgPT0gVFRNX1BMX1NZU1RFTSkKKwkJCXJldHVybiB0dG1fYm9fbW92ZV9tZW1jcHkoYm8sIGV2aWN0LCBub193YWl0LCBuZXdfbWVtKTsKKwkJaWYgKG5vdXZlYXVfYm9fbW92ZV9mbGlwZChibywgZXZpY3QsIGludHIsIG5vX3dhaXQsIG5ld19tZW0pKQorCQkJcmV0dXJuIHR0bV9ib19tb3ZlX21lbWNweShibywgZXZpY3QsIG5vX3dhaXQsIG5ld19tZW0pOworCX0gZWxzZSBpZiAob2xkX21lbS0+bWVtX3R5cGUgPT0gVFRNX1BMX1NZU1RFTSkgeworCQlpZiAobm91dmVhdV9ib19tb3ZlX2ZsaXBzKGJvLCBldmljdCwgaW50ciwgbm9fd2FpdCwgbmV3X21lbSkpCisJCQlyZXR1cm4gdHRtX2JvX21vdmVfbWVtY3B5KGJvLCBldmljdCwgbm9fd2FpdCwgbmV3X21lbSk7CisJfSBlbHNlIHsKKwkJaWYgKG5vdXZlYXVfYm9fbW92ZV9tMm1mKGJvLCBldmljdCwgbm9fd2FpdCwgb2xkX21lbSwgbmV3X21lbSkpCisJCQlyZXR1cm4gdHRtX2JvX21vdmVfbWVtY3B5KGJvLCBldmljdCwgbm9fd2FpdCwgbmV3X21lbSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfYm9fdmVyaWZ5X2FjY2VzcyhzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHR0bV9ib19kcml2ZXIgbm91dmVhdV9ib19kcml2ZXIgPSB7CisJLmNyZWF0ZV90dG1fYmFja2VuZF9lbnRyeSA9IG5vdXZlYXVfYm9fY3JlYXRlX3R0bV9iYWNrZW5kX2VudHJ5LAorCS5pbnZhbGlkYXRlX2NhY2hlcyA9IG5vdXZlYXVfYm9faW52YWxpZGF0ZV9jYWNoZXMsCisJLmluaXRfbWVtX3R5cGUgPSBub3V2ZWF1X2JvX2luaXRfbWVtX3R5cGUsCisJLmV2aWN0X2ZsYWdzID0gbm91dmVhdV9ib19ldmljdF9mbGFncywKKwkubW92ZSA9IG5vdXZlYXVfYm9fbW92ZSwKKwkudmVyaWZ5X2FjY2VzcyA9IG5vdXZlYXVfYm9fdmVyaWZ5X2FjY2VzcywKKwkuc3luY19vYmpfc2lnbmFsZWQgPSBub3V2ZWF1X2ZlbmNlX3NpZ25hbGxlZCwKKwkuc3luY19vYmpfd2FpdCA9IG5vdXZlYXVfZmVuY2Vfd2FpdCwKKwkuc3luY19vYmpfZmx1c2ggPSBub3V2ZWF1X2ZlbmNlX2ZsdXNoLAorCS5zeW5jX29ial91bnJlZiA9IG5vdXZlYXVfZmVuY2VfdW5yZWYsCisJLnN5bmNfb2JqX3JlZiA9IG5vdXZlYXVfZmVuY2VfcmVmLAorfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9jYWxjLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2NhbGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTJiODQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9jYWxjLmMKQEAgLTAsMCArMSw0NzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5My0yMDAzIE5WSURJQSwgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAyMDA3LTIwMDkgU3R1YXJ0IEJlbm5ldHQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2h3LmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIFRoZSB2aWRlbyBhcmJpdHJhdGlvbiByb3V0aW5lcyBjYWxjdWxhdGUgc29tZSAibWFnaWMiIG51bWJlcnMuICBGaXhlcyAgICAgICoKKyogdGhlIHNub3cgc2VlbiB3aGVuIGFjY2Vzc2luZyB0aGUgZnJhbWVidWZmZXIgd2l0aG91dCBpdC4gICAgICAgICAgICAgICAgICAgKgorKiBJdCBqdXN0IHdvcmtzIChJIGhvcGUpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgbnZfZmlmb19pbmZvIHsKKwlpbnQgbHdtOworCWludCBidXJzdDsKK307CisKK3N0cnVjdCBudl9zaW1fc3RhdGUgeworCWludCBwY2xrX2toejsKKwlpbnQgbWNsa19raHo7CisJaW50IG52Y2xrX2toejsKKwlpbnQgYnBwOworCWludCBtZW1fcGFnZV9taXNzOworCWludCBtZW1fbGF0ZW5jeTsKKwlpbnQgbWVtb3J5X3R5cGU7CisJaW50IG1lbW9yeV93aWR0aDsKKwlpbnQgdHdvX2hlYWRzOworfTsKKworc3RhdGljIHZvaWQKK252MDRfY2FsY19hcmIoc3RydWN0IG52X2ZpZm9faW5mbyAqZmlmbywgc3RydWN0IG52X3NpbV9zdGF0ZSAqYXJiKQoreworCWludCBwYWdlbWlzcywgY2FzLCB3aWR0aCwgYnBwOworCWludCBudmNsa3MsIG1jbGtzLCBwY2xrcywgY3J0cGFnZW1pc3M7CisJaW50IGZvdW5kLCBtY2xrX2V4dHJhLCBtY2xrX2xvb3AsIGNicywgbTEsIHAxOworCWludCBtY2xrX2ZyZXEsIHBjbGtfZnJlcSwgbnZjbGtfZnJlcTsKKwlpbnQgdXNfbSwgdXNfbiwgdXNfcCwgY3J0Y19kcmFpbl9yYXRlOworCWludCBjcG1fdXMsIHVzX2NydCwgY2x3bTsKKworCXBjbGtfZnJlcSA9IGFyYi0+cGNsa19raHo7CisJbWNsa19mcmVxID0gYXJiLT5tY2xrX2toejsKKwludmNsa19mcmVxID0gYXJiLT5udmNsa19raHo7CisJcGFnZW1pc3MgPSBhcmItPm1lbV9wYWdlX21pc3M7CisJY2FzID0gYXJiLT5tZW1fbGF0ZW5jeTsKKwl3aWR0aCA9IGFyYi0+bWVtb3J5X3dpZHRoID4+IDY7CisJYnBwID0gYXJiLT5icHA7CisJY2JzID0gMTI4OworCisJcGNsa3MgPSAyOworCW52Y2xrcyA9IDEwOworCW1jbGtzID0gMTMgKyBjYXM7CisJbWNsa19leHRyYSA9IDM7CisJZm91bmQgPSAwOworCisJd2hpbGUgKCFmb3VuZCkgeworCQlmb3VuZCA9IDE7CisKKwkJbWNsa19sb29wID0gbWNsa3MgKyBtY2xrX2V4dHJhOworCQl1c19tID0gbWNsa19sb29wICogMTAwMCAqIDEwMDAgLyBtY2xrX2ZyZXE7CisJCXVzX24gPSBudmNsa3MgKiAxMDAwICogMTAwMCAvIG52Y2xrX2ZyZXE7CisJCXVzX3AgPSBudmNsa3MgKiAxMDAwICogMTAwMCAvIHBjbGtfZnJlcTsKKworCQljcnRjX2RyYWluX3JhdGUgPSBwY2xrX2ZyZXEgKiBicHAgLyA4OworCQljcnRwYWdlbWlzcyA9IDI7CisJCWNydHBhZ2VtaXNzICs9IDE7CisJCWNwbV91cyA9IGNydHBhZ2VtaXNzICogcGFnZW1pc3MgKiAxMDAwICogMTAwMCAvIG1jbGtfZnJlcTsKKwkJdXNfY3J0ID0gY3BtX3VzICsgdXNfbSArIHVzX24gKyB1c19wOworCQljbHdtID0gdXNfY3J0ICogY3J0Y19kcmFpbl9yYXRlIC8gKDEwMDAgKiAxMDAwKTsKKwkJY2x3bSsrOworCisJCW0xID0gY2x3bSArIGNicyAtIDUxMjsKKwkJcDEgPSBtMSAqIHBjbGtfZnJlcSAvIG1jbGtfZnJlcTsKKwkJcDEgPSBwMSAqIGJwcCAvIDg7CisJCWlmICgocDEgPCBtMSAmJiBtMSA+IDApIHx8IGNsd20gPiA1MTkpIHsKKwkJCWZvdW5kID0gIW1jbGtfZXh0cmE7CisJCQltY2xrX2V4dHJhLS07CisJCX0KKwkJaWYgKGNsd20gPCAzODQpCisJCQljbHdtID0gMzg0OworCisJCWZpZm8tPmx3bSA9IGNsd207CisJCWZpZm8tPmJ1cnN0ID0gY2JzOworCX0KK30KKworc3RhdGljIHZvaWQKK252MTBfY2FsY19hcmIoc3RydWN0IG52X2ZpZm9faW5mbyAqZmlmbywgc3RydWN0IG52X3NpbV9zdGF0ZSAqYXJiKQoreworCWludCBmaWxsX3JhdGUsIGRyYWluX3JhdGU7CisJaW50IHBjbGtzLCBudmNsa3MsIG1jbGtzLCB4Y2xrczsKKwlpbnQgcGNsa19mcmVxLCBudmNsa19mcmVxLCBtY2xrX2ZyZXE7CisJaW50IGZpbGxfbGF0LCBleHRyYV9sYXQ7CisJaW50IG1heF9idXJzdF9vLCBtYXhfYnVyc3RfbDsKKwlpbnQgZmlmb19sZW4sIG1pbl9sd20sIG1heF9sd207CisJY29uc3QgaW50IGJ1cnN0X2xhdCA9IDgwOyAvKiBNYXhpbXVtIGFsbG93YWJsZSBsYXRlbmN5IGR1ZQorCQkJCSAgICogdG8gdGhlIENSVEMgRklGTyBidXJzdC4gKG5zKSAqLworCisJcGNsa19mcmVxID0gYXJiLT5wY2xrX2toejsKKwludmNsa19mcmVxID0gYXJiLT5udmNsa19raHo7CisJbWNsa19mcmVxID0gYXJiLT5tY2xrX2toejsKKworCWZpbGxfcmF0ZSA9IG1jbGtfZnJlcSAqIGFyYi0+bWVtb3J5X3dpZHRoIC8gODsgLyoga0IvcyAqLworCWRyYWluX3JhdGUgPSBwY2xrX2ZyZXEgKiBhcmItPmJwcCAvIDg7IC8qIGtCL3MgKi8KKworCWZpZm9fbGVuID0gYXJiLT50d29faGVhZHMgPyAxNTM2IDogMTAyNDsgLyogQiAqLworCisJLyogRml4ZWQgRklGTyByZWZpbGwgbGF0ZW5jeS4gKi8KKworCXBjbGtzID0gNDsJLyogbHdtIGRldGVjdC4gKi8KKworCW52Y2xrcyA9IDMJLyogbHdtIC0+IHN5bmMuICovCisJCSsgMgkvKiBmYmkgYnVzIGN5Y2xlcyAoMSByZXEgKyAxIGJ1c3kpICovCisJCSsgMQkvKiAyIGVkZ2Ugc3luYy4gIG1heSBiZSB2ZXJ5IGNsb3NlIHRvIGVkZ2Ugc28KKwkJCSAqIGp1c3QgcHV0IG9uZS4gKi8KKwkJKyAxCS8qIGZiaV9kX3Jkdl9uICovCisJCSsgMQkvKiBGYmlfZF9yZGF0YSAqLworCQkrIDE7CS8qIGNydGZpZm8gbG9hZCAqLworCisJbWNsa3MgPSAxCS8qIDIgZWRnZSBzeW5jLiAgbWF5IGJlIHZlcnkgY2xvc2UgdG8gZWRnZSBzbworCQkJICoganVzdCBwdXQgb25lLiAqLworCQkrIDEJLyogYXJiX2hwX3JlcSAqLworCQkrIDUJLyogdGlsaW5nIHBpcGVsaW5lICovCisJCSsgMgkvKiBsYXRlbmN5IGZpZm8gKi8KKwkJKyAyCS8qIG1lbW9yeSByZXF1ZXN0IHRvIGZiaW8gYmxvY2sgKi8KKwkJKyA3OwkvKiBkYXRhIHJldHVybmVkIGZyb20gZmJpbyBibG9jayAqLworCisJLyogTmVlZCB0byBhY2N1bXVsYXRlIDI1NiBiaXRzIGZvciByZWFkICovCisJbWNsa3MgKz0gKGFyYi0+bWVtb3J5X3R5cGUgPT0gMCA/IDIgOiAxKQorCQkqIGFyYi0+bWVtb3J5X3dpZHRoIC8gMzI7CisKKwlmaWxsX2xhdCA9IG1jbGtzICogMTAwMCAqIDEwMDAgLyBtY2xrX2ZyZXEgICAvKiBtaW5pbXVtIG1jbGsgbGF0ZW5jeSAqLworCQkrIG52Y2xrcyAqIDEwMDAgKiAxMDAwIC8gbnZjbGtfZnJlcSAgLyogbnZjbGsgbGF0ZW5jeSAqLworCQkrIHBjbGtzICogMTAwMCAqIDEwMDAgLyBwY2xrX2ZyZXE7ICAgLyogcGNsayBsYXRlbmN5ICovCisKKwkvKiBDb25kaXRpb25hbCBGSUZPIHJlZmlsbCBsYXRlbmN5LiAqLworCisJeGNsa3MgPSAyICogYXJiLT5tZW1fcGFnZV9taXNzICsgbWNsa3MgLyogRXh0cmEgbGF0ZW5jeSBkdWUgdG8KKwkJCQkJCSogdGhlIG92ZXJsYXkuICovCisJCSsgMiAqIGFyYi0+bWVtX3BhZ2VfbWlzcyAgICAgICAvKiBFeHRyYSBwYWdlbWlzcyBsYXRlbmN5LiAqLworCQkrIChhcmItPmJwcCA9PSAzMiA/IDggOiA0KTsgICAgLyogTWFyZ2luIG9mIGVycm9yLiAqLworCisJZXh0cmFfbGF0ID0geGNsa3MgKiAxMDAwICogMTAwMCAvIG1jbGtfZnJlcTsKKworCWlmIChhcmItPnR3b19oZWFkcykKKwkJLyogQWNjb3VudCBmb3IgYW5vdGhlciBDUlRDLiAqLworCQlleHRyYV9sYXQgKz0gZmlsbF9sYXQgKyBleHRyYV9sYXQgKyBidXJzdF9sYXQ7CisKKwkvKiBGSUZPIGJ1cnN0ICovCisKKwkvKiBNYXggYnVyc3Qgbm90IGxlYWRpbmcgdG8gb3ZlcmZsb3dzLiAqLworCW1heF9idXJzdF9vID0gKDEgKyBmaWZvX2xlbiAtIGV4dHJhX2xhdCAqIGRyYWluX3JhdGUgLyAoMTAwMCAqIDEwMDApKQorCQkqIChmaWxsX3JhdGUgLyAxMDAwKSAvICgoZmlsbF9yYXRlIC0gZHJhaW5fcmF0ZSkgLyAxMDAwKTsKKwlmaWZvLT5idXJzdCA9IG1pbihtYXhfYnVyc3RfbywgMTAyNCk7CisKKwkvKiBNYXggYnVyc3QgdmFsdWUgd2l0aCBhbiBhY2NlcHRhYmxlIGxhdGVuY3kuICovCisJbWF4X2J1cnN0X2wgPSBidXJzdF9sYXQgKiBmaWxsX3JhdGUgLyAoMTAwMCAqIDEwMDApOworCWZpZm8tPmJ1cnN0ID0gbWluKG1heF9idXJzdF9sLCBmaWZvLT5idXJzdCk7CisKKwlmaWZvLT5idXJzdCA9IHJvdW5kZG93bl9wb3dfb2ZfdHdvKGZpZm8tPmJ1cnN0KTsKKworCS8qIEZJRk8gbG93IHdhdGVybWFyayAqLworCisJbWluX2x3bSA9IChmaWxsX2xhdCArIGV4dHJhX2xhdCkgKiBkcmFpbl9yYXRlIC8gKDEwMDAgKiAxMDAwKSArIDE7CisJbWF4X2x3bSA9IGZpZm9fbGVuIC0gZmlmby0+YnVyc3QKKwkJKyBmaWxsX2xhdCAqIGRyYWluX3JhdGUgLyAoMTAwMCAqIDEwMDApCisJCSsgZmlmby0+YnVyc3QgKiBkcmFpbl9yYXRlIC8gZmlsbF9yYXRlOworCisJZmlmby0+bHdtID0gbWluX2x3bSArIDEwICogKG1heF9sd20gLSBtaW5fbHdtKSAvIDEwMDsgLyogRW1waXJpY2FsLiAqLworfQorCitzdGF0aWMgdm9pZAorbnYwNF91cGRhdGVfYXJiKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBWQ2xrLCBpbnQgYnBwLAorCQlpbnQgKmJ1cnN0LCBpbnQgKmx3bSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudl9maWZvX2luZm8gZmlmb19kYXRhOworCXN0cnVjdCBudl9zaW1fc3RhdGUgc2ltX2RhdGE7CisJaW50IE1DbGsgPSBub3V2ZWF1X2h3X2dldF9jbG9jayhkZXYsIE1QTEwpOworCWludCBOVkNsayA9IG5vdXZlYXVfaHdfZ2V0X2Nsb2NrKGRldiwgTlZQTEwpOworCXVpbnQzMl90IGNmZzEgPSBudlJlYWRGQihkZXYsIE5WX1BGQl9DRkcxKTsKKworCXNpbV9kYXRhLnBjbGtfa2h6ID0gVkNsazsKKwlzaW1fZGF0YS5tY2xrX2toeiA9IE1DbGs7CisJc2ltX2RhdGEubnZjbGtfa2h6ID0gTlZDbGs7CisJc2ltX2RhdGEuYnBwID0gYnBwOworCXNpbV9kYXRhLnR3b19oZWFkcyA9IG52X3R3b19oZWFkcyhkZXYpOworCWlmICgoZGV2LT5wY2lfZGV2aWNlICYgMHhmZmZmKSA9PSAweDAxYTAgLypDSElQU0VUX05GT1JDRSovIHx8CisJICAgIChkZXYtPnBjaV9kZXZpY2UgJiAweGZmZmYpID09IDB4MDFmMCAvKkNISVBTRVRfTkZPUkNFMiovKSB7CisJCXVpbnQzMl90IHR5cGU7CisKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9nZXRfYnVzX2FuZF9zbG90KDAsIDEpLCAweDdjLCAmdHlwZSk7CisKKwkJc2ltX2RhdGEubWVtb3J5X3R5cGUgPSAodHlwZSA+PiAxMikgJiAxOworCQlzaW1fZGF0YS5tZW1vcnlfd2lkdGggPSA2NDsKKwkJc2ltX2RhdGEubWVtX2xhdGVuY3kgPSAzOworCQlzaW1fZGF0YS5tZW1fcGFnZV9taXNzID0gMTA7CisJfSBlbHNlIHsKKwkJc2ltX2RhdGEubWVtb3J5X3R5cGUgPSBudlJlYWRGQihkZXYsIE5WX1BGQl9DRkcwKSAmIDB4MTsKKwkJc2ltX2RhdGEubWVtb3J5X3dpZHRoID0gKG52UmVhZEVYVERFVihkZXYsIE5WX1BFWFRERVZfQk9PVF8wKSAmIDB4MTApID8gMTI4IDogNjQ7CisJCXNpbV9kYXRhLm1lbV9sYXRlbmN5ID0gY2ZnMSAmIDB4ZjsKKwkJc2ltX2RhdGEubWVtX3BhZ2VfbWlzcyA9ICgoY2ZnMSA+PiA0KSAmIDB4ZikgKyAoKGNmZzEgPj4gMzEpICYgMHgxKTsKKwl9CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl8wNCkKKwkJbnYwNF9jYWxjX2FyYigmZmlmb19kYXRhLCAmc2ltX2RhdGEpOworCWVsc2UKKwkJbnYxMF9jYWxjX2FyYigmZmlmb19kYXRhLCAmc2ltX2RhdGEpOworCisJKmJ1cnN0ID0gaWxvZzIoZmlmb19kYXRhLmJ1cnN0ID4+IDQpOworCSpsd20gPSBmaWZvX2RhdGEubHdtID4+IDM7Cit9CisKK3N0YXRpYyB2b2lkCitudjMwX3VwZGF0ZV9hcmIoaW50ICpidXJzdCwgaW50ICpsd20pCit7CisJdW5zaWduZWQgaW50IGZpZm9fc2l6ZSwgYnVyc3Rfc2l6ZSwgZ3JhcGhpY3NfbHdtOworCisJZmlmb19zaXplID0gMjA0ODsKKwlidXJzdF9zaXplID0gNTEyOworCWdyYXBoaWNzX2x3bSA9IGZpZm9fc2l6ZSAtIGJ1cnN0X3NpemU7CisKKwkqYnVyc3QgPSBpbG9nMihidXJzdF9zaXplID4+IDUpOworCSpsd20gPSBncmFwaGljc19sd20gPj4gMzsKK30KKwordm9pZAorbm91dmVhdV9jYWxjX2FyYihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgdmNsaywgaW50IGJwcCwgaW50ICpidXJzdCwgaW50ICpsd20pCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfMzApCisJCW52MDRfdXBkYXRlX2FyYihkZXYsIHZjbGssIGJwcCwgYnVyc3QsIGx3bSk7CisJZWxzZSBpZiAoKGRldi0+cGNpX2RldmljZSAmIDB4ZmZmMCkgPT0gMHgwMjQwIC8qQ0hJUFNFVF9DNTEqLyB8fAorCQkgKGRldi0+cGNpX2RldmljZSAmIDB4ZmZmMCkgPT0gMHgwM2QwIC8qQ0hJUFNFVF9DNTEyKi8pIHsKKwkJKmJ1cnN0ID0gMTI4OworCQkqbHdtID0gMHgwNDgwOworCX0gZWxzZQorCQludjMwX3VwZGF0ZV9hcmIoYnVyc3QsIGx3bSk7Cit9CisKK3N0YXRpYyBpbnQKK2dldE1OUF9zaW5nbGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IHBsbF9saW1zICpwbGxfbGltLCBpbnQgY2xrLAorCSAgICAgIHN0cnVjdCBub3V2ZWF1X3BsbF92YWxzICpiZXN0cHYpCit7CisJLyogRmluZCBNLCBOIGFuZCBQIGZvciBhIHNpbmdsZSBzdGFnZSBQTEwKKwkgKgorCSAqIE5vdGUgdGhhdCBzb21lIGJpb3NlcyAoTlYzeCkgaGF2ZSBsb29rdXAgdGFibGVzIG9mIHByZWNvbXB1dGVkIE1OUAorCSAqIHZhbHVlcywgYnV0IHdlJ3JlIHRvbyBsYXp5IHRvIHVzZSB0aG9zZSBhdG0KKwkgKgorCSAqICJjbGsiIHBhcmFtZXRlciBpbiBrSHoKKwkgKiByZXR1cm5zIGNhbGN1bGF0ZWQgY2xvY2sKKwkgKi8KKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBjdiA9IGRldl9wcml2LT52Ymlvcy0+Y2hpcF92ZXJzaW9uOworCWludCBtaW52Y28gPSBwbGxfbGltLT52Y28xLm1pbmZyZXEsIG1heHZjbyA9IHBsbF9saW0tPnZjbzEubWF4ZnJlcTsKKwlpbnQgbWluTSA9IHBsbF9saW0tPnZjbzEubWluX20sIG1heE0gPSBwbGxfbGltLT52Y28xLm1heF9tOworCWludCBtaW5OID0gcGxsX2xpbS0+dmNvMS5taW5fbiwgbWF4TiA9IHBsbF9saW0tPnZjbzEubWF4X247CisJaW50IG1pblUgPSBwbGxfbGltLT52Y28xLm1pbl9pbnB1dGZyZXE7CisJaW50IG1heFUgPSBwbGxfbGltLT52Y28xLm1heF9pbnB1dGZyZXE7CisJaW50IG1pblAgPSBwbGxfbGltLT5tYXhfcCA/IHBsbF9saW0tPm1pbl9wIDogMDsKKwlpbnQgbWF4UCA9IHBsbF9saW0tPm1heF9wID8gcGxsX2xpbS0+bWF4X3AgOiBwbGxfbGltLT5tYXhfdXNhYmxlX2xvZzJwOworCWludCBjcnlzdGFsID0gcGxsX2xpbS0+cmVmY2xrOworCWludCBNLCBOLCB0aGlzUCwgUDsKKwlpbnQgY2xrUCwgY2FsY2NsazsKKwlpbnQgZGVsdGEsIGJlc3RkZWx0YSA9IElOVF9NQVg7CisJaW50IGJlc3RjbGsgPSAwOworCisJLyogdGhpcyBkaXZpc2lvbiB2ZXJpZmllZCBmb3IgbnYyMCwgbnYxOCwgbnYyOCAoSGFpa3UpLCBhbmQgbnYzNCAqLworCS8qIHBvc3NpYmx5IGNvcnJlbGF0ZWQgd2l0aCBpbnRyb2R1Y3Rpb24gb2YgMjdNSHogY3J5c3RhbCAqLworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApIHsKKwkJaWYgKGN2IDwgMHgxNyB8fCBjdiA9PSAweDFhIHx8IGN2ID09IDB4MjApIHsKKwkJCWlmIChjbGsgPiAyNTAwMDApCisJCQkJbWF4TSA9IDY7CisJCQlpZiAoY2xrID4gMzQwMDAwKQorCQkJCW1heE0gPSAyOworCQl9IGVsc2UgaWYgKGN2IDwgMHg0MCkgeworCQkJaWYgKGNsayA+IDE1MDAwMCkKKwkJCQltYXhNID0gNjsKKwkJCWlmIChjbGsgPiAyMDAwMDApCisJCQkJbWF4TSA9IDQ7CisJCQlpZiAoY2xrID4gMzQwMDAwKQorCQkJCW1heE0gPSAyOworCQl9CisJfQorCisJUCA9IHBsbF9saW0tPm1heF9wID8gbWF4UCA6ICgxIDw8IG1heFApOworCWlmICgoY2xrICogUCkgPCBtaW52Y28pIHsKKwkJbWludmNvID0gY2xrICogbWF4UDsKKwkJbWF4dmNvID0gbWludmNvICogMjsKKwl9CisKKwlpZiAoY2xrICsgY2xrLzIwMCA+IG1heHZjbykJLyogKzAuNSUgKi8KKwkJbWF4dmNvID0gY2xrICsgY2xrLzIwMDsKKworCS8qIE5WMzQgZ29lcyBtYXhsb2cyUC0+MCwgTlYyMCBnb2VzIDAtPm1heGxvZzJQICovCisJZm9yICh0aGlzUCA9IG1pblA7IHRoaXNQIDw9IG1heFA7IHRoaXNQKyspIHsKKwkJUCA9IHBsbF9saW0tPm1heF9wID8gdGhpc1AgOiAoMSA8PCB0aGlzUCk7CisJCWNsa1AgPSBjbGsgKiBQOworCisJCWlmIChjbGtQIDwgbWludmNvKQorCQkJY29udGludWU7CisJCWlmIChjbGtQID4gbWF4dmNvKQorCQkJcmV0dXJuIGJlc3RjbGs7CisKKwkJZm9yIChNID0gbWluTTsgTSA8PSBtYXhNOyBNKyspIHsKKwkJCWlmIChjcnlzdGFsL00gPCBtaW5VKQorCQkJCXJldHVybiBiZXN0Y2xrOworCQkJaWYgKGNyeXN0YWwvTSA+IG1heFUpCisJCQkJY29udGludWU7CisKKwkJCS8qIGFkZCBjcnlzdGFsLzIgdG8gcm91bmQgYmV0dGVyICovCisJCQlOID0gKGNsa1AgKiBNICsgY3J5c3RhbC8yKSAvIGNyeXN0YWw7CisKKwkJCWlmIChOIDwgbWluTikKKwkJCQljb250aW51ZTsKKwkJCWlmIChOID4gbWF4TikKKwkJCQlicmVhazsKKworCQkJLyogbW9yZSByb3VuZGluZyBhZGRpdGlvbnMgKi8KKwkJCWNhbGNjbGsgPSAoKE4gKiBjcnlzdGFsICsgUC8yKSAvIFAgKyBNLzIpIC8gTTsKKwkJCWRlbHRhID0gYWJzKGNhbGNjbGsgLSBjbGspOworCQkJLyogd2UgZG8gYW4gZXhoYXVzdGl2ZSBzZWFyY2ggcmF0aGVyIHRoYW4gdGVybWluYXRpbmcKKwkJCSAqIG9uIGFuIG9wdGltYWxpdHkgY29uZGl0aW9uLi4uCisJCQkgKi8KKwkJCWlmIChkZWx0YSA8IGJlc3RkZWx0YSkgeworCQkJCWJlc3RkZWx0YSA9IGRlbHRhOworCQkJCWJlc3RjbGsgPSBjYWxjY2xrOworCQkJCWJlc3Rwdi0+TjEgPSBOOworCQkJCWJlc3Rwdi0+TTEgPSBNOworCQkJCWJlc3Rwdi0+bG9nMlAgPSB0aGlzUDsKKwkJCQlpZiAoZGVsdGEgPT0gMCkJLyogZXhjZXB0IHRoaXMgb25lICovCisJCQkJCXJldHVybiBiZXN0Y2xrOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGJlc3RjbGs7Cit9CisKK3N0YXRpYyBpbnQKK2dldE1OUF9kb3VibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IHBsbF9saW1zICpwbGxfbGltLCBpbnQgY2xrLAorCSAgICAgIHN0cnVjdCBub3V2ZWF1X3BsbF92YWxzICpiZXN0cHYpCit7CisJLyogRmluZCBNLCBOIGFuZCBQIGZvciBhIHR3byBzdGFnZSBQTEwKKwkgKgorCSAqIE5vdGUgdGhhdCBzb21lIGJpb3NlcyAoTlYzMCspIGhhdmUgbG9va3VwIHRhYmxlcyBvZiBwcmVjb21wdXRlZCBNTlAKKwkgKiB2YWx1ZXMsIGJ1dCB3ZSdyZSB0b28gbGF6eSB0byB1c2UgdGhvc2UgYXRtCisJICoKKwkgKiAiY2xrIiBwYXJhbWV0ZXIgaW4ga0h6CisJICogcmV0dXJucyBjYWxjdWxhdGVkIGNsb2NrCisJICovCisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgY2hpcF92ZXJzaW9uID0gZGV2X3ByaXYtPnZiaW9zLT5jaGlwX3ZlcnNpb247CisJaW50IG1pbnZjbzEgPSBwbGxfbGltLT52Y28xLm1pbmZyZXEsIG1heHZjbzEgPSBwbGxfbGltLT52Y28xLm1heGZyZXE7CisJaW50IG1pbnZjbzIgPSBwbGxfbGltLT52Y28yLm1pbmZyZXEsIG1heHZjbzIgPSBwbGxfbGltLT52Y28yLm1heGZyZXE7CisJaW50IG1pblUxID0gcGxsX2xpbS0+dmNvMS5taW5faW5wdXRmcmVxLCBtaW5VMiA9IHBsbF9saW0tPnZjbzIubWluX2lucHV0ZnJlcTsKKwlpbnQgbWF4VTEgPSBwbGxfbGltLT52Y28xLm1heF9pbnB1dGZyZXEsIG1heFUyID0gcGxsX2xpbS0+dmNvMi5tYXhfaW5wdXRmcmVxOworCWludCBtaW5NMSA9IHBsbF9saW0tPnZjbzEubWluX20sIG1heE0xID0gcGxsX2xpbS0+dmNvMS5tYXhfbTsKKwlpbnQgbWluTjEgPSBwbGxfbGltLT52Y28xLm1pbl9uLCBtYXhOMSA9IHBsbF9saW0tPnZjbzEubWF4X247CisJaW50IG1pbk0yID0gcGxsX2xpbS0+dmNvMi5taW5fbSwgbWF4TTIgPSBwbGxfbGltLT52Y28yLm1heF9tOworCWludCBtaW5OMiA9IHBsbF9saW0tPnZjbzIubWluX24sIG1heE4yID0gcGxsX2xpbS0+dmNvMi5tYXhfbjsKKwlpbnQgbWF4bG9nMlAgPSBwbGxfbGltLT5tYXhfdXNhYmxlX2xvZzJwOworCWludCBjcnlzdGFsID0gcGxsX2xpbS0+cmVmY2xrOworCWJvb2wgZml4ZWRnYWluMiA9IChtaW5NMiA9PSBtYXhNMiAmJiBtaW5OMiA9PSBtYXhOMik7CisJaW50IE0xLCBOMSwgTTIsIE4yLCBsb2cyUDsKKwlpbnQgY2xrUCwgY2FsY2NsazEsIGNhbGNjbGsyLCBjYWxjY2xrb3V0OworCWludCBkZWx0YSwgYmVzdGRlbHRhID0gSU5UX01BWDsKKwlpbnQgYmVzdGNsayA9IDA7CisKKwlpbnQgdmNvMiA9IChtYXh2Y28yIC0gbWF4dmNvMi8yMDApIC8gMjsKKwlmb3IgKGxvZzJQID0gMDsgY2xrICYmIGxvZzJQIDwgbWF4bG9nMlAgJiYgY2xrIDw9ICh2Y28yID4+IGxvZzJQKTsgbG9nMlArKykKKwkJOworCWNsa1AgPSBjbGsgPDwgbG9nMlA7CisKKwlpZiAobWF4dmNvMiA8IGNsayArIGNsay8yMDApCS8qICswLjUlICovCisJCW1heHZjbzIgPSBjbGsgKyBjbGsvMjAwOworCisJZm9yIChNMSA9IG1pbk0xOyBNMSA8PSBtYXhNMTsgTTErKykgeworCQlpZiAoY3J5c3RhbC9NMSA8IG1pblUxKQorCQkJcmV0dXJuIGJlc3RjbGs7CisJCWlmIChjcnlzdGFsL00xID4gbWF4VTEpCisJCQljb250aW51ZTsKKworCQlmb3IgKE4xID0gbWluTjE7IE4xIDw9IG1heE4xOyBOMSsrKSB7CisJCQljYWxjY2xrMSA9IGNyeXN0YWwgKiBOMSAvIE0xOworCQkJaWYgKGNhbGNjbGsxIDwgbWludmNvMSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChjYWxjY2xrMSA+IG1heHZjbzEpCisJCQkJYnJlYWs7CisKKwkJCWZvciAoTTIgPSBtaW5NMjsgTTIgPD0gbWF4TTI7IE0yKyspIHsKKwkJCQlpZiAoY2FsY2NsazEvTTIgPCBtaW5VMikKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGNhbGNjbGsxL00yID4gbWF4VTIpCisJCQkJCWNvbnRpbnVlOworCisJCQkJLyogYWRkIGNhbGNjbGsxLzIgdG8gcm91bmQgYmV0dGVyICovCisJCQkJTjIgPSAoY2xrUCAqIE0yICsgY2FsY2NsazEvMikgLyBjYWxjY2xrMTsKKwkJCQlpZiAoTjIgPCBtaW5OMikKKwkJCQkJY29udGludWU7CisJCQkJaWYgKE4yID4gbWF4TjIpCisJCQkJCWJyZWFrOworCisJCQkJaWYgKCFmaXhlZGdhaW4yKSB7CisJCQkJCWlmIChjaGlwX3ZlcnNpb24gPCAweDYwKQorCQkJCQkJaWYgKE4yL00yIDwgNCB8fCBOMi9NMiA+IDEwKQorCQkJCQkJCWNvbnRpbnVlOworCisJCQkJCWNhbGNjbGsyID0gY2FsY2NsazEgKiBOMiAvIE0yOworCQkJCQlpZiAoY2FsY2NsazIgPCBtaW52Y28yKQorCQkJCQkJYnJlYWs7CisJCQkJCWlmIChjYWxjY2xrMiA+IG1heHZjbzIpCisJCQkJCQljb250aW51ZTsKKwkJCQl9IGVsc2UKKwkJCQkJY2FsY2NsazIgPSBjYWxjY2xrMTsKKworCQkJCWNhbGNjbGtvdXQgPSBjYWxjY2xrMiA+PiBsb2cyUDsKKwkJCQlkZWx0YSA9IGFicyhjYWxjY2xrb3V0IC0gY2xrKTsKKwkJCQkvKiB3ZSBkbyBhbiBleGhhdXN0aXZlIHNlYXJjaCByYXRoZXIgdGhhbiB0ZXJtaW5hdGluZworCQkJCSAqIG9uIGFuIG9wdGltYWxpdHkgY29uZGl0aW9uLi4uCisJCQkJICovCisJCQkJaWYgKGRlbHRhIDwgYmVzdGRlbHRhKSB7CisJCQkJCWJlc3RkZWx0YSA9IGRlbHRhOworCQkJCQliZXN0Y2xrID0gY2FsY2Nsa291dDsKKwkJCQkJYmVzdHB2LT5OMSA9IE4xOworCQkJCQliZXN0cHYtPk0xID0gTTE7CisJCQkJCWJlc3Rwdi0+TjIgPSBOMjsKKwkJCQkJYmVzdHB2LT5NMiA9IE0yOworCQkJCQliZXN0cHYtPmxvZzJQID0gbG9nMlA7CisJCQkJCWlmIChkZWx0YSA9PSAwKQkvKiBleGNlcHQgdGhpcyBvbmUgKi8KKwkJCQkJCXJldHVybiBiZXN0Y2xrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBiZXN0Y2xrOworfQorCitpbnQKK25vdXZlYXVfY2FsY19wbGxfbW5wKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBwbGxfbGltcyAqcGxsX2xpbSwgaW50IGNsaywKKwkJICAgICBzdHJ1Y3Qgbm91dmVhdV9wbGxfdmFscyAqcHYpCit7CisJaW50IG91dGNsazsKKworCWlmICghcGxsX2xpbS0+dmNvMi5tYXhmcmVxKQorCQlvdXRjbGsgPSBnZXRNTlBfc2luZ2xlKGRldiwgcGxsX2xpbSwgY2xrLCBwdik7CisJZWxzZQorCQlvdXRjbGsgPSBnZXRNTlBfZG91YmxlKGRldiwgcGxsX2xpbSwgY2xrLCBwdik7CisKKwlpZiAoIW91dGNsaykKKwkJTlZfRVJST1IoZGV2LCAiQ291bGQgbm90IGZpbmQgYSBjb21wYXRpYmxlIHNldCBvZiBQTEwgdmFsdWVzXG4iKTsKKworCXJldHVybiBvdXRjbGs7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2NoYW5uZWwuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY2hhbm5lbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYWE5NzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2NoYW5uZWwuYwpAQCAtMCwwICsxLDQ2OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDYgU3RlcGhhbmUgTWFyY2hlc2luCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9kcm0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X2RtYS5oIgorCitzdGF0aWMgaW50Citub3V2ZWF1X2NoYW5uZWxfcHVzaGJ1Zl9jdHhkbWFfaW5pdChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9ibyAqcGIgPSBjaGFuLT5wdXNoYnVmX2JvOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcHVzaGJ1ZiA9IE5VTEw7CisJdWludDMyX3Qgc3RhcnQgPSBwYi0+Ym8ubWVtLm1tX25vZGUtPnN0YXJ0IDw8IFBBR0VfU0hJRlQ7CisJaW50IHJldDsKKworCWlmIChwYi0+Ym8ubWVtLm1lbV90eXBlID09IFRUTV9QTF9UVCkgeworCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9nYXJ0X2RtYV9uZXcoY2hhbiwgMCwKKwkJCQkJCSAgZGV2X3ByaXYtPmdhcnRfaW5mby5hcGVyX3NpemUsCisJCQkJCQkgIE5WX0RNQV9BQ0NFU1NfUk8sICZwdXNoYnVmLAorCQkJCQkJICBOVUxMKTsKKwkJY2hhbi0+cHVzaGJ1Zl9iYXNlID0gc3RhcnQ7CisJfSBlbHNlCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgIT0gTlZfMDQpIHsKKwkJcmV0ID0gbm91dmVhdV9ncHVvYmpfZG1hX25ldyhjaGFuLCBOVl9DTEFTU19ETUFfSU5fTUVNT1JZLCAwLAorCQkJCQkgICAgIGRldl9wcml2LT5mYl9hdmFpbGFibGVfc2l6ZSwKKwkJCQkJICAgICBOVl9ETUFfQUNDRVNTX1JPLAorCQkJCQkgICAgIE5WX0RNQV9UQVJHRVRfVklETUVNLCAmcHVzaGJ1Zik7CisJCWNoYW4tPnB1c2hidWZfYmFzZSA9IHN0YXJ0OworCX0gZWxzZSB7CisJCS8qIE5WMDQgY21kYnVmIGhhY2ssIGZyb20gb3JpZ2luYWwgZGR4Li4gbm90IHN1cmUgb2YgaXQncworCQkgKiBleGFjdCByZWFzb24gZm9yIGV4aXN0aW5nIDopICBQQ0kgYWNjZXNzIHRvIGNtZGJ1ZiBpbgorCQkgKiBWUkFNLgorCQkgKi8KKwkJcmV0ID0gbm91dmVhdV9ncHVvYmpfZG1hX25ldyhjaGFuLCBOVl9DTEFTU19ETUFfSU5fTUVNT1JZLAorCQkJCQkgICAgIGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQoZGV2LCAxKSwKKwkJCQkJICAgICBkZXZfcHJpdi0+ZmJfYXZhaWxhYmxlX3NpemUsCisJCQkJCSAgICAgTlZfRE1BX0FDQ0VTU19STywKKwkJCQkJICAgICBOVl9ETUFfVEFSR0VUX1BDSSwgJnB1c2hidWYpOworCQljaGFuLT5wdXNoYnVmX2Jhc2UgPSBzdGFydDsKKwl9CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9yZWZfYWRkKGRldiwgY2hhbiwgMCwgcHVzaGJ1ZiwgJmNoYW4tPnB1c2hidWYpOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiRXJyb3IgcmVmZXJlbmNpbmcgcHVzaGJ1ZiBjdHhkbWE6ICVkXG4iLCByZXQpOworCQlpZiAocHVzaGJ1ZiAhPSBkZXZfcHJpdi0+Z2FydF9pbmZvLnNnX2N0eGRtYSkKKwkJCW5vdXZlYXVfZ3B1b2JqX2RlbChkZXYsICZwdXNoYnVmKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBub3V2ZWF1X2JvICoKK25vdXZlYXVfY2hhbm5lbF91c2VyX3B1c2hidWZfYWxsb2Moc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9ibyAqcHVzaGJ1ZiA9IE5VTEw7CisJaW50IGxvY2F0aW9uLCByZXQ7CisKKwlpZiAobm91dmVhdV92cmFtX3B1c2hidWYpCisJCWxvY2F0aW9uID0gVFRNX1BMX0ZMQUdfVlJBTTsKKwllbHNlCisJCWxvY2F0aW9uID0gVFRNX1BMX0ZMQUdfVFQ7CisKKwlyZXQgPSBub3V2ZWF1X2JvX25ldyhkZXYsIE5VTEwsIDY1NTM2LCAwLCBsb2NhdGlvbiwgMCwgMHgwMDAwLCBmYWxzZSwKKwkJCSAgICAgdHJ1ZSwgJnB1c2hidWYpOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiZXJyb3IgYWxsb2NhdGluZyBETUEgcHVzaCBidWZmZXI6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXQgPSBub3V2ZWF1X2JvX3BpbihwdXNoYnVmLCBsb2NhdGlvbik7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJlcnJvciBwaW5uaW5nIERNQSBwdXNoIGJ1ZmZlcjogJWRcbiIsIHJldCk7CisJCW5vdXZlYXVfYm9fcmVmKE5VTEwsICZwdXNoYnVmKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHB1c2hidWY7Cit9CisKKy8qIGFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBmaWZvIGZvciB1c2VyIHNwYWNlIGNvbnN1bXB0aW9uICovCitpbnQKK25vdXZlYXVfY2hhbm5lbF9hbGxvYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICoqY2hhbl9yZXQsCisJCSAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorCQkgICAgICB1aW50MzJfdCB2cmFtX2hhbmRsZSwgdWludDMyX3QgdHRfaGFuZGxlKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CisJc3RydWN0IG5vdXZlYXVfZmlmb19lbmdpbmUgKnBmaWZvID0gJmRldl9wcml2LT5lbmdpbmUuZmlmbzsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuOworCWludCBjaGFubmVsLCB1c2VyOworCWludCByZXQ7CisKKwkvKgorCSAqIEFscmlnaHQsIGhlcmUgaXMgdGhlIGZ1bGwgc3RvcnkKKwkgKiBOdmlkaWEgY2FyZHMgaGF2ZSBtdWx0aXBsZSBodyBmaWZvIGNvbnRleHRzIChwcmFpc2UgdGhlbSBmb3IgdGhhdCwKKwkgKiBubyBjb21wbGljYXRlZCBjcmFzaC1wcm9uZSBjb250ZXh0IHN3aXRjaGVzKQorCSAqIFdlIGFsbG9jYXRlIGEgbmV3IGNvbnRleHQgZm9yIGVhY2ggYXBwIGFuZCBsZXQgaXQgd3JpdGUgdG8gaXQKKwkgKiBkaXJlY3RseSAod29vLCBmdWxsIHVzZXJzcGFjZSBjb21tYW5kIHN1Ym1pc3Npb24gISkKKwkgKiBXaGVuIHRoZXJlIGFyZSBubyBtb3JlIGNvbnRleHRzLCB5b3UgbG9zdAorCSAqLworCWZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBwZmlmby0+Y2hhbm5lbHM7IGNoYW5uZWwrKykgeworCQlpZiAoZGV2X3ByaXYtPmZpZm9zW2NoYW5uZWxdID09IE5VTEwpCisJCQlicmVhazsKKwl9CisKKwkvKiBubyBtb3JlIGZpZm9zLiB5b3UgbG9zdC4gKi8KKwlpZiAoY2hhbm5lbCA9PSBwZmlmby0+Y2hhbm5lbHMpCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2X3ByaXYtPmZpZm9zW2NoYW5uZWxdID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCksCisJCQkJCSAgIEdGUF9LRVJORUwpOworCWlmICghZGV2X3ByaXYtPmZpZm9zW2NoYW5uZWxdKQorCQlyZXR1cm4gLUVOT01FTTsKKwlkZXZfcHJpdi0+Zmlmb19hbGxvY19jb3VudCsrOworCWNoYW4gPSBkZXZfcHJpdi0+Zmlmb3NbY2hhbm5lbF07CisJSU5JVF9MSVNUX0hFQUQoJmNoYW4tPm52c3cudmJsX3dhaXQpOworCUlOSVRfTElTVF9IRUFEKCZjaGFuLT5mZW5jZS5wZW5kaW5nKTsKKwljaGFuLT5kZXYgPSBkZXY7CisJY2hhbi0+aWQgPSBjaGFubmVsOworCWNoYW4tPmZpbGVfcHJpdiA9IGZpbGVfcHJpdjsKKwljaGFuLT52cmFtX2hhbmRsZSA9IHZyYW1faGFuZGxlOworCWNoYW4tPmdhcnRfaGFuZGxlID0gdHRfaGFuZGxlOworCisJTlZfSU5GTyhkZXYsICJBbGxvY2F0aW5nIEZJRk8gbnVtYmVyICVkXG4iLCBjaGFubmVsKTsKKworCS8qIEFsbG9jYXRlIERNQSBwdXNoIGJ1ZmZlciAqLworCWNoYW4tPnB1c2hidWZfYm8gPSBub3V2ZWF1X2NoYW5uZWxfdXNlcl9wdXNoYnVmX2FsbG9jKGRldik7CisJaWYgKCFjaGFuLT5wdXNoYnVmX2JvKSB7CisJCXJldCA9IC1FTk9NRU07CisJCU5WX0VSUk9SKGRldiwgInB1c2hidWYgJWRcbiIsIHJldCk7CisJCW5vdXZlYXVfY2hhbm5lbF9mcmVlKGNoYW4pOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIExvY2F0ZSBjaGFubmVsJ3MgdXNlciBjb250cm9sIHJlZ3MgKi8KKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzQwKQorCQl1c2VyID0gTlYwM19VU0VSKGNoYW5uZWwpOworCWVsc2UKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKQorCQl1c2VyID0gTlY0MF9VU0VSKGNoYW5uZWwpOworCWVsc2UKKwkJdXNlciA9IE5WNTBfVVNFUihjaGFubmVsKTsKKworCWNoYW4tPnVzZXIgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDApICsgdXNlciwKKwkJCQkJCQkJUEFHRV9TSVpFKTsKKwlpZiAoIWNoYW4tPnVzZXIpIHsKKwkJTlZfRVJST1IoZGV2LCAiaW9yZW1hcCBvZiByZWdzIGZhaWxlZC5cbiIpOworCQlub3V2ZWF1X2NoYW5uZWxfZnJlZShjaGFuKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWNoYW4tPnVzZXJfcHV0ID0gMHg0MDsKKwljaGFuLT51c2VyX2dldCA9IDB4NDQ7CisKKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgcGVyLWNoYW5uZWwgZml4ZWQgbm90aWZpZXIgbWVtb3J5ICovCisJcmV0ID0gbm91dmVhdV9ub3RpZmllcl9pbml0X2NoYW5uZWwoY2hhbik7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJudGZ5ICVkXG4iLCByZXQpOworCQlub3V2ZWF1X2NoYW5uZWxfZnJlZShjaGFuKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBTZXR1cCBjaGFubmVsJ3MgZGVmYXVsdCBvYmplY3RzICovCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfY2hhbm5lbF9pbml0KGNoYW4sIHZyYW1faGFuZGxlLCB0dF9oYW5kbGUpOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiZ3B1b2JqICVkXG4iLCByZXQpOworCQlub3V2ZWF1X2NoYW5uZWxfZnJlZShjaGFuKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBDcmVhdGUgYSBkbWEgb2JqZWN0IGZvciB0aGUgcHVzaCBidWZmZXIgKi8KKwlyZXQgPSBub3V2ZWF1X2NoYW5uZWxfcHVzaGJ1Zl9jdHhkbWFfaW5pdChjaGFuKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgInBiY3R4ZG1hICVkXG4iLCByZXQpOworCQlub3V2ZWF1X2NoYW5uZWxfZnJlZShjaGFuKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBkaXNhYmxlIHRoZSBmaWZvIGNhY2hlcyAqLworCXBmaWZvLT5yZWFzc2lnbihkZXYsIGZhbHNlKTsKKworCS8qIENyZWF0ZSBhIGdyYXBoaWNzIGNvbnRleHQgZm9yIG5ldyBjaGFubmVsICovCisJcmV0ID0gcGdyYXBoLT5jcmVhdGVfY29udGV4dChjaGFuKTsKKwlpZiAocmV0KSB7CisJCW5vdXZlYXVfY2hhbm5lbF9mcmVlKGNoYW4pOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIENvbnN0cnVjdCBpbml0YWwgUkFNRkMgZm9yIG5ldyBjaGFubmVsICovCisJcmV0ID0gcGZpZm8tPmNyZWF0ZV9jb250ZXh0KGNoYW4pOworCWlmIChyZXQpIHsKKwkJbm91dmVhdV9jaGFubmVsX2ZyZWUoY2hhbik7CisJCXJldHVybiByZXQ7CisJfQorCisJcGZpZm8tPnJlYXNzaWduKGRldiwgdHJ1ZSk7CisKKwlyZXQgPSBub3V2ZWF1X2RtYV9pbml0KGNoYW4pOworCWlmICghcmV0KQorCQlyZXQgPSBub3V2ZWF1X2ZlbmNlX2luaXQoY2hhbik7CisJaWYgKHJldCkgeworCQlub3V2ZWF1X2NoYW5uZWxfZnJlZShjaGFuKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlub3V2ZWF1X2RlYnVnZnNfY2hhbm5lbF9pbml0KGNoYW4pOworCisJTlZfSU5GTyhkZXYsICIlczogaW5pdGlhbGlzZWQgRklGTyAlZFxuIiwgX19mdW5jX18sIGNoYW5uZWwpOworCSpjaGFuX3JldCA9IGNoYW47CisJcmV0dXJuIDA7Cit9CisKK2ludAorbm91dmVhdV9jaGFubmVsX2lkbGUoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZW5naW5lICplbmdpbmUgPSAmZGV2X3ByaXYtPmVuZ2luZTsKKwl1aW50MzJfdCBjYWNoZXM7CisJaW50IGlkbGU7CisKKwlpZiAoIWNoYW4pIHsKKwkJTlZfRVJST1IoZGV2LCAibm8gY2hhbm5lbC4uLlxuIik7CisJCXJldHVybiAxOworCX0KKworCWNhY2hlcyA9IG52X3JkMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFUyk7CisJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEVTLCBjYWNoZXMgJiB+MSk7CisKKwlpZiAoZW5naW5lLT5maWZvLmNoYW5uZWxfaWQoZGV2KSAhPSBjaGFuLT5pZCkgeworCQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnJhbWZjID0KKwkJCWNoYW4tPnJhbWZjID8gY2hhbi0+cmFtZmMtPmdwdW9iaiA6IE5VTEw7CisKKwkJaWYgKCFyYW1mYykgeworCQkJTlZfRVJST1IoZGV2LCAiTm8gUkFNRkMgZm9yIGNoYW5uZWwgJWRcbiIsIGNoYW4tPmlkKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJZW5naW5lLT5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgZmFsc2UpOworCQlpZiAobnZfcm8zMihkZXYsIHJhbWZjLCAwKSAhPSBudl9ybzMyKGRldiwgcmFtZmMsIDEpKQorCQkJaWRsZSA9IDA7CisJCWVsc2UKKwkJCWlkbGUgPSAxOworCQllbmdpbmUtPmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCX0gZWxzZSB7CisJCWlkbGUgPSAobnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9HRVQpID09CisJCQludl9yZDMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX1BVVCkpOworCX0KKworCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFUywgY2FjaGVzKTsKKwlyZXR1cm4gaWRsZTsKK30KKworLyogc3RvcHMgYSBmaWZvICovCit2b2lkCitub3V2ZWF1X2NoYW5uZWxfZnJlZShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICpwZ3JhcGggPSAmZGV2X3ByaXYtPmVuZ2luZS5ncmFwaDsKKwlzdHJ1Y3Qgbm91dmVhdV9maWZvX2VuZ2luZSAqcGZpZm8gPSAmZGV2X3ByaXYtPmVuZ2luZS5maWZvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCU5WX0lORk8oZGV2LCAiJXM6IGZyZWVpbmcgZmlmbyAlZFxuIiwgX19mdW5jX18sIGNoYW4tPmlkKTsKKworCW5vdXZlYXVfZGVidWdmc19jaGFubmVsX2ZpbmkoY2hhbik7CisKKwkvKiBHaXZlIG91dHN0YW5kaW5nIHB1c2ggYnVmZmVycyBhIGNoYW5jZSB0byBjb21wbGV0ZSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFuLT5mZW5jZS5sb2NrLCBmbGFncyk7CisJbm91dmVhdV9mZW5jZV91cGRhdGUoY2hhbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbi0+ZmVuY2UubG9jaywgZmxhZ3MpOworCWlmIChjaGFuLT5mZW5jZS5zZXF1ZW5jZSAhPSBjaGFuLT5mZW5jZS5zZXF1ZW5jZV9hY2spIHsKKwkJc3RydWN0IG5vdXZlYXVfZmVuY2UgKmZlbmNlID0gTlVMTDsKKworCQlyZXQgPSBub3V2ZWF1X2ZlbmNlX25ldyhjaGFuLCAmZmVuY2UsIHRydWUpOworCQlpZiAocmV0ID09IDApIHsKKwkJCXJldCA9IG5vdXZlYXVfZmVuY2Vfd2FpdChmZW5jZSwgTlVMTCwgZmFsc2UsIGZhbHNlKTsKKwkJCW5vdXZlYXVfZmVuY2VfdW5yZWYoKHZvaWQgKikmZmVuY2UpOworCQl9CisKKwkJaWYgKHJldCkKKwkJCU5WX0VSUk9SKGRldiwgIkZhaWxlZCB0byBpZGxlIGNoYW5uZWwgJWQuXG4iLCBjaGFuLT5pZCk7CisJfQorCisJLyogRW5zdXJlIGFsbCBvdXRzdGFuZGluZyBmZW5jZXMgYXJlIHNpZ25hbGVkLiAgVGhleSBzaG91bGQgYmUgaWYgdGhlCisJICogYWJvdmUgYXR0ZW1wdHMgYXQgaWRsaW5nIHdlcmUgT0ssIGJ1dCBpZiB3ZSBmYWlsZWQgdGhpcydsbCB0ZWxsIFRUTQorCSAqIHdlJ3JlIGRvbmUgd2l0aCB0aGUgYnVmZmVycy4KKwkgKi8KKwlub3V2ZWF1X2ZlbmNlX2ZpbmkoY2hhbik7CisKKwkvKiBFbnN1cmUgdGhlIGNoYW5uZWwgaXMgbm8gbG9uZ2VyIGFjdGl2ZSBvbiB0aGUgR1BVICovCisJcGZpZm8tPnJlYXNzaWduKGRldiwgZmFsc2UpOworCisJaWYgKHBncmFwaC0+Y2hhbm5lbChkZXYpID09IGNoYW4pIHsKKwkJcGdyYXBoLT5maWZvX2FjY2VzcyhkZXYsIGZhbHNlKTsKKwkJcGdyYXBoLT51bmxvYWRfY29udGV4dChkZXYpOworCQlwZ3JhcGgtPmZpZm9fYWNjZXNzKGRldiwgdHJ1ZSk7CisJfQorCXBncmFwaC0+ZGVzdHJveV9jb250ZXh0KGNoYW4pOworCisJaWYgKHBmaWZvLT5jaGFubmVsX2lkKGRldikgPT0gY2hhbi0+aWQpIHsKKwkJcGZpZm8tPmRpc2FibGUoZGV2KTsKKwkJcGZpZm8tPnVubG9hZF9jb250ZXh0KGRldik7CisJCXBmaWZvLT5lbmFibGUoZGV2KTsKKwl9CisJcGZpZm8tPmRlc3Ryb3lfY29udGV4dChjaGFuKTsKKworCXBmaWZvLT5yZWFzc2lnbihkZXYsIHRydWUpOworCisJLyogUmVsZWFzZSB0aGUgY2hhbm5lbCdzIHJlc291cmNlcyAqLworCW5vdXZlYXVfZ3B1b2JqX3JlZl9kZWwoZGV2LCAmY2hhbi0+cHVzaGJ1Zik7CisJaWYgKGNoYW4tPnB1c2hidWZfYm8pIHsKKwkJbm91dmVhdV9ib191bnBpbihjaGFuLT5wdXNoYnVmX2JvKTsKKwkJbm91dmVhdV9ib19yZWYoTlVMTCwgJmNoYW4tPnB1c2hidWZfYm8pOworCX0KKwlub3V2ZWF1X2dwdW9ial9jaGFubmVsX3Rha2Vkb3duKGNoYW4pOworCW5vdXZlYXVfbm90aWZpZXJfdGFrZWRvd25fY2hhbm5lbChjaGFuKTsKKwlpZiAoY2hhbi0+dXNlcikKKwkJaW91bm1hcChjaGFuLT51c2VyKTsKKworCWRldl9wcml2LT5maWZvc1tjaGFuLT5pZF0gPSBOVUxMOworCWRldl9wcml2LT5maWZvX2FsbG9jX2NvdW50LS07CisJa2ZyZWUoY2hhbik7Cit9CisKKy8qIGNsZWFucyB1cCBhbGwgdGhlIGZpZm9zIGZyb20gZmlsZV9wcml2ICovCit2b2lkCitub3V2ZWF1X2NoYW5uZWxfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2VuZ2luZSAqZW5naW5lID0gJmRldl9wcml2LT5lbmdpbmU7CisJaW50IGk7CisKKwlOVl9ERUJVRyhkZXYsICJjbGVhcmluZyBGSUZPIGVuYWJsZXMgZnJvbSBmaWxlX3ByaXZcbiIpOworCWZvciAoaSA9IDA7IGkgPCBlbmdpbmUtPmZpZm8uY2hhbm5lbHM7IGkrKykgeworCQlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmZpZm9zW2ldOworCisJCWlmIChjaGFuICYmIGNoYW4tPmZpbGVfcHJpdiA9PSBmaWxlX3ByaXYpCisJCQlub3V2ZWF1X2NoYW5uZWxfZnJlZShjaGFuKTsKKwl9Cit9CisKK2ludAorbm91dmVhdV9jaGFubmVsX293bmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorCQkgICAgICBpbnQgY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2VuZ2luZSAqZW5naW5lID0gJmRldl9wcml2LT5lbmdpbmU7CisKKwlpZiAoY2hhbm5lbCA+PSBlbmdpbmUtPmZpZm8uY2hhbm5lbHMpCisJCXJldHVybiAwOworCWlmIChkZXZfcHJpdi0+Zmlmb3NbY2hhbm5lbF0gPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKGRldl9wcml2LT5maWZvc1tjaGFubmVsXS0+ZmlsZV9wcml2ID09IGZpbGVfcHJpdik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaW9jdGxzIHdyYXBwaW5nIHRoZSBmdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAorbm91dmVhdV9pb2N0bF9maWZvX2FsbG9jKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCQkgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfY2hhbm5lbF9hbGxvYyAqaW5pdCA9IGRhdGE7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbjsKKwlpbnQgcmV0OworCisJTk9VVkVBVV9DSEVDS19JTklUSUFMSVNFRF9XSVRIX1JFVFVSTjsKKworCWlmIChkZXZfcHJpdi0+ZW5naW5lLmdyYXBoLmFjY2VsX2Jsb2NrZWQpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKGluaXQtPmZiX2N0eGRtYV9oYW5kbGUgPT0gfjAgfHwgaW5pdC0+dHRfY3R4ZG1hX2hhbmRsZSA9PSB+MCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBub3V2ZWF1X2NoYW5uZWxfYWxsb2MoZGV2LCAmY2hhbiwgZmlsZV9wcml2LAorCQkJCSAgICBpbml0LT5mYl9jdHhkbWFfaGFuZGxlLAorCQkJCSAgICBpbml0LT50dF9jdHhkbWFfaGFuZGxlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWluaXQtPmNoYW5uZWwgID0gY2hhbi0+aWQ7CisKKwlpbml0LT5zdWJjaGFuWzBdLmhhbmRsZSA9IE52TTJNRjsKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKQorCQlpbml0LT5zdWJjaGFuWzBdLmdyY2xhc3MgPSAweDAwMzk7CisJZWxzZQorCQlpbml0LT5zdWJjaGFuWzBdLmdyY2xhc3MgPSAweDUwMzk7CisJaW5pdC0+bnJfc3ViY2hhbiA9IDE7CisKKwkvKiBOYW1lZCBtZW1vcnkgb2JqZWN0IGFyZWEgKi8KKwlyZXQgPSBkcm1fZ2VtX2hhbmRsZV9jcmVhdGUoZmlsZV9wcml2LCBjaGFuLT5ub3RpZmllcl9iby0+Z2VtLAorCQkJCSAgICAmaW5pdC0+bm90aWZpZXJfaGFuZGxlKTsKKwlpZiAocmV0KSB7CisJCW5vdXZlYXVfY2hhbm5lbF9mcmVlKGNoYW4pOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citub3V2ZWF1X2lvY3RsX2ZpZm9fZnJlZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X2NoYW5uZWxfZnJlZSAqY2ZyZWUgPSBkYXRhOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47CisKKwlOT1VWRUFVX0NIRUNLX0lOSVRJQUxJU0VEX1dJVEhfUkVUVVJOOworCU5PVVZFQVVfR0VUX1VTRVJfQ0hBTk5FTF9XSVRIX1JFVFVSTihjZnJlZS0+Y2hhbm5lbCwgZmlsZV9wcml2LCBjaGFuKTsKKworCW5vdXZlYXVfY2hhbm5lbF9mcmVlKGNoYW4pOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGZpbmFsbHksIHRoZSBpb2N0bCB0YWJsZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgZHJtX2lvY3RsX2Rlc2Mgbm91dmVhdV9pb2N0bHNbXSA9IHsKKwlEUk1fSU9DVExfREVGKERSTV9OT1VWRUFVX0NBUkRfSU5JVCwgbm91dmVhdV9pb2N0bF9jYXJkX2luaXQsIERSTV9BVVRIKSwKKwlEUk1fSU9DVExfREVGKERSTV9OT1VWRUFVX0dFVFBBUkFNLCBub3V2ZWF1X2lvY3RsX2dldHBhcmFtLCBEUk1fQVVUSCksCisJRFJNX0lPQ1RMX0RFRihEUk1fTk9VVkVBVV9TRVRQQVJBTSwgbm91dmVhdV9pb2N0bF9zZXRwYXJhbSwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZKSwKKwlEUk1fSU9DVExfREVGKERSTV9OT1VWRUFVX0NIQU5ORUxfQUxMT0MsIG5vdXZlYXVfaW9jdGxfZmlmb19hbGxvYywgRFJNX0FVVEgpLAorCURSTV9JT0NUTF9ERUYoRFJNX05PVVZFQVVfQ0hBTk5FTF9GUkVFLCBub3V2ZWF1X2lvY3RsX2ZpZm9fZnJlZSwgRFJNX0FVVEgpLAorCURSTV9JT0NUTF9ERUYoRFJNX05PVVZFQVVfR1JPQkpfQUxMT0MsIG5vdXZlYXVfaW9jdGxfZ3JvYmpfYWxsb2MsIERSTV9BVVRIKSwKKwlEUk1fSU9DVExfREVGKERSTV9OT1VWRUFVX05PVElGSUVST0JKX0FMTE9DLCBub3V2ZWF1X2lvY3RsX25vdGlmaWVyX2FsbG9jLCBEUk1fQVVUSCksCisJRFJNX0lPQ1RMX0RFRihEUk1fTk9VVkVBVV9HUFVPQkpfRlJFRSwgbm91dmVhdV9pb2N0bF9ncHVvYmpfZnJlZSwgRFJNX0FVVEgpLAorCURSTV9JT0NUTF9ERUYoRFJNX05PVVZFQVVfR0VNX05FVywgbm91dmVhdV9nZW1faW9jdGxfbmV3LCBEUk1fQVVUSCksCisJRFJNX0lPQ1RMX0RFRihEUk1fTk9VVkVBVV9HRU1fUFVTSEJVRiwgbm91dmVhdV9nZW1faW9jdGxfcHVzaGJ1ZiwgRFJNX0FVVEgpLAorCURSTV9JT0NUTF9ERUYoRFJNX05PVVZFQVVfR0VNX1BVU0hCVUZfQ0FMTCwgbm91dmVhdV9nZW1faW9jdGxfcHVzaGJ1Zl9jYWxsLCBEUk1fQVVUSCksCisJRFJNX0lPQ1RMX0RFRihEUk1fTk9VVkVBVV9HRU1fUElOLCBub3V2ZWF1X2dlbV9pb2N0bF9waW4sIERSTV9BVVRIKSwKKwlEUk1fSU9DVExfREVGKERSTV9OT1VWRUFVX0dFTV9VTlBJTiwgbm91dmVhdV9nZW1faW9jdGxfdW5waW4sIERSTV9BVVRIKSwKKwlEUk1fSU9DVExfREVGKERSTV9OT1VWRUFVX0dFTV9DUFVfUFJFUCwgbm91dmVhdV9nZW1faW9jdGxfY3B1X3ByZXAsIERSTV9BVVRIKSwKKwlEUk1fSU9DVExfREVGKERSTV9OT1VWRUFVX0dFTV9DUFVfRklOSSwgbm91dmVhdV9nZW1faW9jdGxfY3B1X2ZpbmksIERSTV9BVVRIKSwKKwlEUk1fSU9DVExfREVGKERSTV9OT1VWRUFVX0dFTV9JTkZPLCBub3V2ZWF1X2dlbV9pb2N0bF9pbmZvLCBEUk1fQVVUSCksCisJRFJNX0lPQ1RMX0RFRihEUk1fTk9VVkVBVV9HRU1fUFVTSEJVRl9DQUxMMiwgbm91dmVhdV9nZW1faW9jdGxfcHVzaGJ1Zl9jYWxsMiwgRFJNX0FVVEgpLAorfTsKKworaW50IG5vdXZlYXVfbWF4X2lvY3RsID0gRFJNX0FSUkFZX1NJWkUobm91dmVhdV9pb2N0bHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9jb25uZWN0b3IuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY29ubmVjdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMyY2YwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY29ubmVjdG9yLmMKQEAgLTAsMCArMSw4MjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWFhcnRlbiBNYWF0aHVpcy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtX2VkaWQuaCIKKyNpbmNsdWRlICJkcm1fY3J0Y19oZWxwZXIuaCIKKyNpbmNsdWRlICJub3V2ZWF1X3JlZy5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9lbmNvZGVyLmgiCisjaW5jbHVkZSAibm91dmVhdV9jcnRjLmgiCisjaW5jbHVkZSAibm91dmVhdV9jb25uZWN0b3IuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2h3LmgiCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRybV9lbmNvZGVyX3NsYXZlX2Z1bmNzICoKK2dldF9zbGF2ZV9mdW5jcyhzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICplbmMpCit7CisJcmV0dXJuIHRvX2VuY29kZXJfc2xhdmUodG9fZHJtX2VuY29kZXIoZW5jKSktPnNsYXZlX2Z1bmNzOworfQorCitzdGF0aWMgc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqCitmaW5kX2VuY29kZXJfYnlfdHlwZShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlcjsKKwlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpvYmo7CisJaW50IGksIGlkOworCisJZm9yIChpID0gMDsgaSA8IERSTV9DT05ORUNUT1JfTUFYX0VOQ09ERVI7IGkrKykgeworCQlpZCA9IGNvbm5lY3Rvci0+ZW5jb2Rlcl9pZHNbaV07CisJCWlmICghaWQpCisJCQlicmVhazsKKworCQlvYmogPSBkcm1fbW9kZV9vYmplY3RfZmluZChkZXYsIGlkLCBEUk1fTU9ERV9PQkpFQ1RfRU5DT0RFUik7CisJCWlmICghb2JqKQorCQkJY29udGludWU7CisJCW52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIob2JqX3RvX2VuY29kZXIob2JqKSk7CisKKwkJaWYgKHR5cGUgPT0gT1VUUFVUX0FOWSB8fCBudl9lbmNvZGVyLT5kY2ItPnR5cGUgPT0gdHlwZSkKKwkJCXJldHVybiBudl9lbmNvZGVyOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKgorbm91dmVhdV9lbmNvZGVyX2Nvbm5lY3Rvcl9nZXQoc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gdG9fZHJtX2VuY29kZXIoZW5jb2RlciktPmRldjsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqZHJtX2Nvbm5lY3RvcjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZHJtX2Nvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKKwkJaWYgKGRybV9jb25uZWN0b3ItPmVuY29kZXIgPT0gdG9fZHJtX2VuY29kZXIoZW5jb2RlcikpCisJCQlyZXR1cm4gbm91dmVhdV9jb25uZWN0b3IoZHJtX2Nvbm5lY3Rvcik7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIHZvaWQKK25vdXZlYXVfY29ubmVjdG9yX2Rlc3Ryb3koc3RydWN0IGRybV9jb25uZWN0b3IgKmRybV9jb25uZWN0b3IpCit7CisJc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpjb25uZWN0b3IgPSBub3V2ZWF1X2Nvbm5lY3Rvcihkcm1fY29ubmVjdG9yKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5iYXNlLmRldjsKKworCU5WX0RFQlVHKGRldiwgIlxuIik7CisKKwlpZiAoIWNvbm5lY3RvcikKKwkJcmV0dXJuOworCisJZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9yZW1vdmUoZHJtX2Nvbm5lY3Rvcik7CisJZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKGRybV9jb25uZWN0b3IpOworCWtmcmVlKGRybV9jb25uZWN0b3IpOworfQorCitzdGF0aWMgdm9pZAorbm91dmVhdV9jb25uZWN0b3JfZGRjX3ByZXBhcmUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwgaW50ICpmbGFncykKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjb25uZWN0b3ItPmRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkKKwkJcmV0dXJuOworCisJKmZsYWdzID0gMDsKKwlpZiAoTlZMb2NrVmdhQ3J0Y3MoZGV2X3ByaXYtPmRldiwgZmFsc2UpKQorCQkqZmxhZ3MgfD0gMTsKKwlpZiAobnZfaGVhZHNfdGllZChkZXZfcHJpdi0+ZGV2KSkKKwkJKmZsYWdzIHw9IDI7CisKKwlpZiAoKmZsYWdzICYgMikKKwkJTlZTZXRPd25lcihkZXZfcHJpdi0+ZGV2LCAwKTsgLyogbmVjZXNzYXJ5PyAqLworfQorCitzdGF0aWMgdm9pZAorbm91dmVhdV9jb25uZWN0b3JfZGRjX2ZpbmlzaChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gY29ubmVjdG9yLT5kZXYtPmRldl9wcml2YXRlOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApCisJCXJldHVybjsKKworCWlmIChmbGFncyAmIDIpCisJCU5WU2V0T3duZXIoZGV2X3ByaXYtPmRldiwgNCk7CisJaWYgKGZsYWdzICYgMSkKKwkJTlZMb2NrVmdhQ3J0Y3MoZGV2X3ByaXYtPmRldiwgdHJ1ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqCitub3V2ZWF1X2Nvbm5lY3Rvcl9kZGNfZGV0ZWN0KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkgICAgIHN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKipwbnZfZW5jb2RlcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisJdWludDhfdCBvdXRfYnVmW10gPSB7IDB4MCwgMHgwfSwgYnVmWzJdOworCWludCByZXQsIGZsYWdzLCBpOworCisJc3RydWN0IGkyY19tc2cgbXNnc1tdID0geworCQl7CisJCQkuYWRkciA9IDB4NTAsCisJCQkuZmxhZ3MgPSAwLAorCQkJLmxlbiA9IDEsCisJCQkuYnVmID0gb3V0X2J1ZiwKKwkJfSwKKwkJeworCQkJLmFkZHIgPSAweDUwLAorCQkJLmZsYWdzID0gSTJDX01fUkQsCisJCQkubGVuID0gMSwKKwkJCS5idWYgPSBidWYsCisJCX0KKwl9OworCisJZm9yIChpID0gMDsgaSA8IERSTV9DT05ORUNUT1JfTUFYX0VOQ09ERVI7IGkrKykgeworCQlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqaTJjID0gTlVMTDsKKwkJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlcjsKKwkJc3RydWN0IGRybV9tb2RlX29iamVjdCAqb2JqOworCQlpbnQgaWQ7CisKKwkJaWQgPSBjb25uZWN0b3ItPmVuY29kZXJfaWRzW2ldOworCQlpZiAoIWlkKQorCQkJYnJlYWs7CisKKwkJb2JqID0gZHJtX21vZGVfb2JqZWN0X2ZpbmQoZGV2LCBpZCwgRFJNX01PREVfT0JKRUNUX0VOQ09ERVIpOworCQlpZiAoIW9iaikKKwkJCWNvbnRpbnVlOworCQludl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKG9ial90b19lbmNvZGVyKG9iaikpOworCisJCWlmIChudl9lbmNvZGVyLT5kY2ItPmkyY19pbmRleCA8IDB4ZikKKwkJCWkyYyA9IG5vdXZlYXVfaTJjX2ZpbmQoZGV2LCBudl9lbmNvZGVyLT5kY2ItPmkyY19pbmRleCk7CisJCWlmICghaTJjKQorCQkJY29udGludWU7CisKKwkJbm91dmVhdV9jb25uZWN0b3JfZGRjX3ByZXBhcmUoY29ubmVjdG9yLCAmZmxhZ3MpOworCQlyZXQgPSBpMmNfdHJhbnNmZXIoJmkyYy0+YWRhcHRlciwgbXNncywgMik7CisJCW5vdXZlYXVfY29ubmVjdG9yX2RkY19maW5pc2goY29ubmVjdG9yLCBmbGFncyk7CisKKwkJaWYgKHJldCA9PSAyKSB7CisJCQkqcG52X2VuY29kZXIgPSBudl9lbmNvZGVyOworCQkJcmV0dXJuIGkyYzsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAorbm91dmVhdV9jb25uZWN0b3Jfc2V0X2VuY29kZXIoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCSAgICAgIHN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIpCit7CisJc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpudl9jb25uZWN0b3IgPSBub3V2ZWF1X2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGNvbm5lY3Rvci0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisKKwlpZiAobnZfY29ubmVjdG9yLT5kZXRlY3RlZF9lbmNvZGVyID09IG52X2VuY29kZXIpCisJCXJldHVybjsKKwludl9jb25uZWN0b3ItPmRldGVjdGVkX2VuY29kZXIgPSBudl9lbmNvZGVyOworCisJaWYgKG52X2VuY29kZXItPmRjYi0+dHlwZSA9PSBPVVRQVVRfTFZEUyB8fAorCSAgICBudl9lbmNvZGVyLT5kY2ItPnR5cGUgPT0gT1VUUFVUX1RNRFMpIHsKKwkJY29ubmVjdG9yLT5kb3VibGVzY2FuX2FsbG93ZWQgPSBmYWxzZTsKKwkJY29ubmVjdG9yLT5pbnRlcmxhY2VfYWxsb3dlZCA9IGZhbHNlOworCX0gZWxzZSB7CisJCWNvbm5lY3Rvci0+ZG91Ymxlc2Nhbl9hbGxvd2VkID0gdHJ1ZTsKKwkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfMjAgfHwKKwkJICAgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfMTAgJiYKKwkJICAgIChkZXYtPnBjaV9kZXZpY2UgJiAweDBmZjApICE9IDB4MDEwMCAmJgorCQkgICAgKGRldi0+cGNpX2RldmljZSAmIDB4MGZmMCkgIT0gMHgwMTUwKSkKKwkJCS8qIEhXIGlzIGJyb2tlbiAqLworCQkJY29ubmVjdG9yLT5pbnRlcmxhY2VfYWxsb3dlZCA9IGZhbHNlOworCQllbHNlCisJCQljb25uZWN0b3ItPmludGVybGFjZV9hbGxvd2VkID0gdHJ1ZTsKKwl9CisKKwlpZiAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJSSkgeworCQlkcm1fY29ubmVjdG9yX3Byb3BlcnR5X3NldF92YWx1ZShjb25uZWN0b3IsCisJCQlkZXYtPm1vZGVfY29uZmlnLmR2aV9pX3N1YmNvbm5lY3Rvcl9wcm9wZXJ0eSwKKwkJCW52X2VuY29kZXItPmRjYi0+dHlwZSA9PSBPVVRQVVRfVE1EUyA/CisJCQlEUk1fTU9ERV9TVUJDT05ORUNUT1JfRFZJRCA6CisJCQlEUk1fTU9ERV9TVUJDT05ORUNUT1JfRFZJQSk7CisJfQorfQorCitzdGF0aWMgZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cworbm91dmVhdV9jb25uZWN0b3JfZGV0ZWN0KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqbnZfY29ubmVjdG9yID0gbm91dmVhdV9jb25uZWN0b3IoY29ubmVjdG9yKTsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gTlVMTDsKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqaTJjOworCWludCB0eXBlLCBmbGFnczsKKworCWlmIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTKQorCQludl9lbmNvZGVyID0gZmluZF9lbmNvZGVyX2J5X3R5cGUoY29ubmVjdG9yLCBPVVRQVVRfTFZEUyk7CisJaWYgKG52X2VuY29kZXIgJiYgbnZfY29ubmVjdG9yLT5uYXRpdmVfbW9kZSkgeworCQlub3V2ZWF1X2Nvbm5lY3Rvcl9zZXRfZW5jb2Rlcihjb25uZWN0b3IsIG52X2VuY29kZXIpOworCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisJfQorCisJaTJjID0gbm91dmVhdV9jb25uZWN0b3JfZGRjX2RldGVjdChjb25uZWN0b3IsICZudl9lbmNvZGVyKTsKKwlpZiAoaTJjKSB7CisJCW5vdXZlYXVfY29ubmVjdG9yX2RkY19wcmVwYXJlKGNvbm5lY3RvciwgJmZsYWdzKTsKKwkJbnZfY29ubmVjdG9yLT5lZGlkID0gZHJtX2dldF9lZGlkKGNvbm5lY3RvciwgJmkyYy0+YWRhcHRlcik7CisJCW5vdXZlYXVfY29ubmVjdG9yX2RkY19maW5pc2goY29ubmVjdG9yLCBmbGFncyk7CisJCWRybV9tb2RlX2Nvbm5lY3Rvcl91cGRhdGVfZWRpZF9wcm9wZXJ0eShjb25uZWN0b3IsCisJCQkJCQkJbnZfY29ubmVjdG9yLT5lZGlkKTsKKwkJaWYgKCFudl9jb25uZWN0b3ItPmVkaWQpIHsKKwkJCU5WX0VSUk9SKGRldiwgIkREQyByZXNwb25kZWQsIGJ1dCBubyBFRElEIGZvciAlc1xuIiwKKwkJCQkgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKKwkJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKKwkJfQorCisJCWlmIChudl9lbmNvZGVyLT5kY2ItPnR5cGUgPT0gT1VUUFVUX0RQICYmCisJCSAgICAhbm91dmVhdV9kcF9kZXRlY3QodG9fZHJtX2VuY29kZXIobnZfZW5jb2RlcikpKSB7CisJCQlOVl9FUlJPUihkZXYsICJEZXRlY3RlZCAlcywgYnV0IGZhaWxlZCBpbml0XG4iLAorCQkJCSBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvcikpOworCQkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOworCQl9CisKKwkJLyogT3ZlcnJpZGUgZW5jb2RlciB0eXBlIGZvciBEVkktSSBiYXNlZCBvbiB3aGV0aGVyIEVESUQKKwkJICogc2F5cyB0aGUgZGlzcGxheSBpcyBkaWdpdGFsIG9yIGFuYWxvZywgYm90aCB1c2UgdGhlCisJCSAqIHNhbWUgaTJjIGNoYW5uZWwgc28gdGhlIHZhbHVlIHJldHVybmVkIGZyb20gZGRjX2RldGVjdAorCQkgKiBpc24ndCBuZWNlc3NhcmlseSBjb3JyZWN0LgorCQkgKi8KKwkJaWYgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0RWSUkpIHsKKwkJCWlmIChudl9jb25uZWN0b3ItPmVkaWQtPmlucHV0ICYgRFJNX0VESURfSU5QVVRfRElHSVRBTCkKKwkJCQl0eXBlID0gT1VUUFVUX1RNRFM7CisJCQllbHNlCisJCQkJdHlwZSA9IE9VVFBVVF9BTkFMT0c7CisKKwkJCW52X2VuY29kZXIgPSBmaW5kX2VuY29kZXJfYnlfdHlwZShjb25uZWN0b3IsIHR5cGUpOworCQkJaWYgKCFudl9lbmNvZGVyKSB7CisJCQkJTlZfRVJST1IoZGV2LCAiRGV0ZWN0ZWQgJWQgZW5jb2RlciBvbiAlcywgIgorCQkJCQkgICAgICAiYnV0IG5vIG9iamVjdCFcbiIsIHR5cGUsCisJCQkJCSBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvcikpOworCQkJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKKwkJCX0KKwkJfQorCisJCW5vdXZlYXVfY29ubmVjdG9yX3NldF9lbmNvZGVyKGNvbm5lY3RvciwgbnZfZW5jb2Rlcik7CisJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKKwl9CisKKwludl9lbmNvZGVyID0gZmluZF9lbmNvZGVyX2J5X3R5cGUoY29ubmVjdG9yLCBPVVRQVVRfQU5BTE9HKTsKKwlpZiAoIW52X2VuY29kZXIpCisJCW52X2VuY29kZXIgPSBmaW5kX2VuY29kZXJfYnlfdHlwZShjb25uZWN0b3IsIE9VVFBVVF9UVik7CisJaWYgKG52X2VuY29kZXIpIHsKKwkJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyID0gdG9fZHJtX2VuY29kZXIobnZfZW5jb2Rlcik7CisJCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmhlbHBlciA9CisJCQkJCQllbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKKworCQlpZiAoaGVscGVyLT5kZXRlY3QoZW5jb2RlciwgY29ubmVjdG9yKSA9PQorCQkJCQkJY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQpIHsKKwkJCW5vdXZlYXVfY29ubmVjdG9yX3NldF9lbmNvZGVyKGNvbm5lY3RvciwgbnZfZW5jb2Rlcik7CisJCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisJCX0KKworCX0KKworCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKK30KKworc3RhdGljIHZvaWQKK25vdXZlYXVfY29ubmVjdG9yX2ZvcmNlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXI7CisJaW50IHR5cGU7CisKKwlpZiAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJSSkgeworCQlpZiAoY29ubmVjdG9yLT5mb3JjZSA9PSBEUk1fRk9SQ0VfT05fRElHSVRBTCkKKwkJCXR5cGUgPSBPVVRQVVRfVE1EUzsKKwkJZWxzZQorCQkJdHlwZSA9IE9VVFBVVF9BTkFMT0c7CisJfSBlbHNlCisJCXR5cGUgPSBPVVRQVVRfQU5ZOworCisJbnZfZW5jb2RlciA9IGZpbmRfZW5jb2Rlcl9ieV90eXBlKGNvbm5lY3RvciwgdHlwZSk7CisJaWYgKCFudl9lbmNvZGVyKSB7CisJCU5WX0VSUk9SKGRldiwgImNhbid0IGZpbmQgZW5jb2RlciB0byBmb3JjZSAlcyBvbiFcbiIsCisJCQkgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKKwkJY29ubmVjdG9yLT5zdGF0dXMgPSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKKwkJcmV0dXJuOworCX0KKworCW5vdXZlYXVfY29ubmVjdG9yX3NldF9lbmNvZGVyKGNvbm5lY3RvciwgbnZfZW5jb2Rlcik7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfY29ubmVjdG9yX3NldF9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCQkJICAgICAgIHN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3BlcnR5LCB1aW50NjRfdCB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKm52X2Nvbm5lY3RvciA9IG5vdXZlYXVfY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG52X2Nvbm5lY3Rvci0+ZGV0ZWN0ZWRfZW5jb2RlcjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisJaW50IHJldDsKKworCS8qIFNjYWxpbmcgbW9kZSAqLworCWlmIChwcm9wZXJ0eSA9PSBkZXYtPm1vZGVfY29uZmlnLnNjYWxpbmdfbW9kZV9wcm9wZXJ0eSkgeworCQlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gTlVMTDsKKwkJYm9vbCBtb2Rlc2V0ID0gZmFsc2U7CisKKwkJc3dpdGNoICh2YWx1ZSkgeworCQljYXNlIERSTV9NT0RFX1NDQUxFX05PTkU6CisJCWNhc2UgRFJNX01PREVfU0NBTEVfRlVMTFNDUkVFTjoKKwkJY2FzZSBEUk1fTU9ERV9TQ0FMRV9DRU5URVI6CisJCWNhc2UgRFJNX01PREVfU0NBTEVfQVNQRUNUOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIExWRFMgYWx3YXlzIG5lZWRzIGdwdSBzY2FsaW5nICovCisJCWlmIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTICYmCisJCSAgICB2YWx1ZSA9PSBEUk1fTU9ERV9TQ0FMRV9OT05FKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogQ2hhbmdpbmcgYmV0d2VlbiBHUFUgYW5kIHBhbmVsIHNjYWxpbmcgcmVxdWlyZXMgYSBmdWxsCisJCSAqIG1vZGVzZXQKKwkJICovCisJCWlmICgobnZfY29ubmVjdG9yLT5zY2FsaW5nX21vZGUgPT0gRFJNX01PREVfU0NBTEVfTk9ORSkgfHwKKwkJICAgICh2YWx1ZSA9PSBEUk1fTU9ERV9TQ0FMRV9OT05FKSkKKwkJCW1vZGVzZXQgPSB0cnVlOworCQludl9jb25uZWN0b3ItPnNjYWxpbmdfbW9kZSA9IHZhbHVlOworCisJCWlmIChjb25uZWN0b3ItPmVuY29kZXIgJiYgY29ubmVjdG9yLT5lbmNvZGVyLT5jcnRjKQorCQkJbnZfY3J0YyA9IG5vdXZlYXVfY3J0Yyhjb25uZWN0b3ItPmVuY29kZXItPmNydGMpOworCQlpZiAoIW52X2NydGMpCisJCQlyZXR1cm4gMDsKKworCQlpZiAobW9kZXNldCB8fCAhbnZfY3J0Yy0+c2V0X3NjYWxlKSB7CisJCQlyZXQgPSBkcm1fY3J0Y19oZWxwZXJfc2V0X21vZGUoJm52X2NydGMtPmJhc2UsCisJCQkJCQkJJm52X2NydGMtPmJhc2UubW9kZSwKKwkJCQkJCQludl9jcnRjLT5iYXNlLngsCisJCQkJCQkJbnZfY3J0Yy0+YmFzZS55LCBOVUxMKTsKKwkJCWlmICghcmV0KQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9IGVsc2UgeworCQkJcmV0ID0gbnZfY3J0Yy0+c2V0X3NjYWxlKG52X2NydGMsIHZhbHVlLCB0cnVlKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXJldHVybiAwOworCX0KKworCS8qIERpdGhlcmluZyAqLworCWlmIChwcm9wZXJ0eSA9PSBkZXYtPm1vZGVfY29uZmlnLmRpdGhlcmluZ19tb2RlX3Byb3BlcnR5KSB7CisJCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBOVUxMOworCisJCWlmICh2YWx1ZSA9PSBEUk1fTU9ERV9ESVRIRVJJTkdfT04pCisJCQludl9jb25uZWN0b3ItPnVzZV9kaXRoZXJpbmcgPSB0cnVlOworCQllbHNlCisJCQludl9jb25uZWN0b3ItPnVzZV9kaXRoZXJpbmcgPSBmYWxzZTsKKworCQlpZiAoY29ubmVjdG9yLT5lbmNvZGVyICYmIGNvbm5lY3Rvci0+ZW5jb2Rlci0+Y3J0YykKKwkJCW52X2NydGMgPSBub3V2ZWF1X2NydGMoY29ubmVjdG9yLT5lbmNvZGVyLT5jcnRjKTsKKworCQlpZiAoIW52X2NydGMgfHwgIW52X2NydGMtPnNldF9kaXRoZXIpCisJCQlyZXR1cm4gMDsKKworCQlyZXR1cm4gbnZfY3J0Yy0+c2V0X2RpdGhlcihudl9jcnRjLCBudl9jb25uZWN0b3ItPnVzZV9kaXRoZXJpbmcsCisJCQkJCSAgIHRydWUpOworCX0KKworCWlmIChudl9lbmNvZGVyICYmIG52X2VuY29kZXItPmRjYi0+dHlwZSA9PSBPVVRQVVRfVFYpCisJCXJldHVybiBnZXRfc2xhdmVfZnVuY3MobnZfZW5jb2RlciktPgorCQkJc2V0X3Byb3BlcnR5KHRvX2RybV9lbmNvZGVyKG52X2VuY29kZXIpLCBjb25uZWN0b3IsIHByb3BlcnR5LCB2YWx1ZSk7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICoKK25vdXZlYXVfY29ubmVjdG9yX25hdGl2ZV9tb2RlKHN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmJhc2UuZGV2OworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLCAqbGFyZ2VzdCA9IE5VTEw7CisJaW50IGhpZ2hfdyA9IDAsIGhpZ2hfaCA9IDAsIGhpZ2hfdiA9IDA7CisKKwkvKiBVc2UgcHJlZmVycmVkIG1vZGUgaWYgdGhlcmUgaXMgb25lLi4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1vZGUsICZjb25uZWN0b3ItPmJhc2UucHJvYmVkX21vZGVzLCBoZWFkKSB7CisJCWlmIChtb2RlLT50eXBlICYgRFJNX01PREVfVFlQRV9QUkVGRVJSRUQpIHsKKwkJCU5WX0RFQlVHKGRldiwgIm5hdGl2ZSBtb2RlIGZyb20gcHJlZmVycmVkXG4iKTsKKwkJCXJldHVybiBkcm1fbW9kZV9kdXBsaWNhdGUoZGV2LCBtb2RlKTsKKwkJfQorCX0KKworCS8qIE90aGVyd2lzZSwgdGFrZSB0aGUgcmVzb2x1dGlvbiB3aXRoIHRoZSBsYXJnZXN0IHdpZHRoLCB0aGVuIGhlaWdodCwKKwkgKiB0aGVuIHZlcnRpY2FsIHJlZnJlc2gKKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1vZGUsICZjb25uZWN0b3ItPmJhc2UucHJvYmVkX21vZGVzLCBoZWFkKSB7CisJCWlmIChtb2RlLT5oZGlzcGxheSA8IGhpZ2hfdykKKwkJCWNvbnRpbnVlOworCisJCWlmIChtb2RlLT5oZGlzcGxheSA9PSBoaWdoX3cgJiYgbW9kZS0+dmRpc3BsYXkgPCBoaWdoX2gpCisJCQljb250aW51ZTsKKworCQlpZiAobW9kZS0+aGRpc3BsYXkgPT0gaGlnaF93ICYmIG1vZGUtPnZkaXNwbGF5ID09IGhpZ2hfaCAmJgorCQkgICAgbW9kZS0+dnJlZnJlc2ggPCBoaWdoX3YpCisJCQljb250aW51ZTsKKworCQloaWdoX3cgPSBtb2RlLT5oZGlzcGxheTsKKwkJaGlnaF9oID0gbW9kZS0+dmRpc3BsYXk7CisJCWhpZ2hfdiA9IG1vZGUtPnZyZWZyZXNoOworCQlsYXJnZXN0ID0gbW9kZTsKKwl9CisKKwlOVl9ERUJVRyhkZXYsICJuYXRpdmUgbW9kZSBmcm9tIGxhcmdlc3Q6ICVkeCVkQCVkXG4iLAorCQkgICAgICBoaWdoX3csIGhpZ2hfaCwgaGlnaF92KTsKKwlyZXR1cm4gbGFyZ2VzdCA/IGRybV9tb2RlX2R1cGxpY2F0ZShkZXYsIGxhcmdlc3QpIDogTlVMTDsKK30KKworc3RydWN0IG1vZGVyZWMgeworCWludCBoZGlzcGxheTsKKwlpbnQgdmRpc3BsYXk7Cit9OworCitzdGF0aWMgc3RydWN0IG1vZGVyZWMgc2NhbGVyX21vZGVzW10gPSB7CisJeyAxOTIwLCAxMjAwIH0sCisJeyAxOTIwLCAxMDgwIH0sCisJeyAxNjgwLCAxMDUwIH0sCisJeyAxNjAwLCAxMjAwIH0sCisJeyAxNDAwLCAxMDUwIH0sCisJeyAxMjgwLCAxMDI0IH0sCisJeyAxMjgwLCA5NjAgfSwKKwl7IDExNTIsIDg2NCB9LAorCXsgMTAyNCwgNzY4IH0sCisJeyA4MDAsIDYwMCB9LAorCXsgNzIwLCA0MDAgfSwKKwl7IDY0MCwgNDgwIH0sCisJeyA2NDAsIDQwMCB9LAorCXsgNjQwLCAzNTAgfSwKKwl7fQorfTsKKworc3RhdGljIGludAorbm91dmVhdV9jb25uZWN0b3Jfc2NhbGVyX21vZGVzX2FkZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqbnZfY29ubmVjdG9yID0gbm91dmVhdV9jb25uZWN0b3IoY29ubmVjdG9yKTsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbmF0aXZlID0gbnZfY29ubmVjdG9yLT5uYXRpdmVfbW9kZSwgKm07CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCXN0cnVjdCBtb2RlcmVjICptb2RlID0gJnNjYWxlcl9tb2Rlc1swXTsKKwlpbnQgbW9kZXMgPSAwOworCisJaWYgKCFuYXRpdmUpCisJCXJldHVybiAwOworCisJd2hpbGUgKG1vZGUtPmhkaXNwbGF5KSB7CisJCWlmIChtb2RlLT5oZGlzcGxheSA8PSBuYXRpdmUtPmhkaXNwbGF5ICYmCisJCSAgICBtb2RlLT52ZGlzcGxheSA8PSBuYXRpdmUtPnZkaXNwbGF5KSB7CisJCQltID0gZHJtX2N2dF9tb2RlKGRldiwgbW9kZS0+aGRpc3BsYXksIG1vZGUtPnZkaXNwbGF5LAorCQkJCQkgZHJtX21vZGVfdnJlZnJlc2gobmF0aXZlKSwgZmFsc2UsCisJCQkJCSBmYWxzZSwgZmFsc2UpOworCQkJaWYgKCFtKQorCQkJCWNvbnRpbnVlOworCisJCQltLT50eXBlIHw9IERSTV9NT0RFX1RZUEVfRFJJVkVSOworCisJCQlkcm1fbW9kZV9wcm9iZWRfYWRkKGNvbm5lY3RvciwgbSk7CisJCQltb2RlcysrOworCQl9CisKKwkJbW9kZSsrOworCX0KKworCXJldHVybiBtb2RlczsKK30KKworc3RhdGljIGludAorbm91dmVhdV9jb25uZWN0b3JfZ2V0X21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqbnZfY29ubmVjdG9yID0gbm91dmVhdV9jb25uZWN0b3IoY29ubmVjdG9yKTsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbnZfY29ubmVjdG9yLT5kZXRlY3RlZF9lbmNvZGVyOworCWludCByZXQgPSAwOworCisJLyogSWYgd2UncmUgbm90IExWRFMsIGRlc3Ryb3kgdGhlIHByZXZpb3VzIG5hdGl2ZSBtb2RlLCB0aGUgYXR0YWNoZWQKKwkgKiBtb25pdG9yIGNvdWxkIGhhdmUgY2hhbmdlZC4KKwkgKi8KKwlpZiAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSAhPSBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUyAmJgorCSAgICBudl9jb25uZWN0b3ItPm5hdGl2ZV9tb2RlKSB7CisJCWRybV9tb2RlX2Rlc3Ryb3koZGV2LCBudl9jb25uZWN0b3ItPm5hdGl2ZV9tb2RlKTsKKwkJbnZfY29ubmVjdG9yLT5uYXRpdmVfbW9kZSA9IE5VTEw7CisJfQorCisJaWYgKG52X2Nvbm5lY3Rvci0+ZWRpZCkKKwkJcmV0ID0gZHJtX2FkZF9lZGlkX21vZGVzKGNvbm5lY3RvciwgbnZfY29ubmVjdG9yLT5lZGlkKTsKKworCS8qIEZpbmQgdGhlIG5hdGl2ZSBtb2RlIGlmIHRoaXMgaXMgYSBkaWdpdGFsIHBhbmVsLCBpZiB3ZSBkaWRuJ3QKKwkgKiBmaW5kIGFueSBtb2RlcyB0aHJvdWdoIEREQyBwcmV2aW91c2x5IGFkZCB0aGUgbmF0aXZlIG1vZGUgdG8KKwkgKiB0aGUgbGlzdCBvZiBtb2Rlcy4KKwkgKi8KKwlpZiAoIW52X2Nvbm5lY3Rvci0+bmF0aXZlX21vZGUpCisJCW52X2Nvbm5lY3Rvci0+bmF0aXZlX21vZGUgPQorCQkJbm91dmVhdV9jb25uZWN0b3JfbmF0aXZlX21vZGUobnZfY29ubmVjdG9yKTsKKwlpZiAocmV0ID09IDAgJiYgbnZfY29ubmVjdG9yLT5uYXRpdmVfbW9kZSkgeworCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKKworCQltb2RlID0gZHJtX21vZGVfZHVwbGljYXRlKGRldiwgbnZfY29ubmVjdG9yLT5uYXRpdmVfbW9kZSk7CisJCWRybV9tb2RlX3Byb2JlZF9hZGQoY29ubmVjdG9yLCBtb2RlKTsKKwkJcmV0ID0gMTsKKwl9CisKKwlpZiAobnZfZW5jb2Rlci0+ZGNiLT50eXBlID09IE9VVFBVVF9UVikKKwkJcmV0ID0gZ2V0X3NsYXZlX2Z1bmNzKG52X2VuY29kZXIpLT4KKwkJCWdldF9tb2Rlcyh0b19kcm1fZW5jb2Rlcihudl9lbmNvZGVyKSwgY29ubmVjdG9yKTsKKworCWlmIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTKQorCQlyZXQgKz0gbm91dmVhdV9jb25uZWN0b3Jfc2NhbGVyX21vZGVzX2FkZChjb25uZWN0b3IpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorbm91dmVhdV9jb25uZWN0b3JfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCQkJICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjb25uZWN0b3ItPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpudl9jb25uZWN0b3IgPSBub3V2ZWF1X2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBudl9jb25uZWN0b3ItPmRldGVjdGVkX2VuY29kZXI7CisJdW5zaWduZWQgbWluX2Nsb2NrID0gMjUwMDAsIG1heF9jbG9jayA9IG1pbl9jbG9jazsKKwl1bnNpZ25lZCBjbG9jayA9IG1vZGUtPmNsb2NrOworCisJc3dpdGNoIChudl9lbmNvZGVyLT5kY2ItPnR5cGUpIHsKKwljYXNlIE9VVFBVVF9MVkRTOgorCQlCVUdfT04oIW52X2Nvbm5lY3Rvci0+bmF0aXZlX21vZGUpOworCQlpZiAobW9kZS0+aGRpc3BsYXkgPiBudl9jb25uZWN0b3ItPm5hdGl2ZV9tb2RlLT5oZGlzcGxheSB8fAorCQkgICAgbW9kZS0+dmRpc3BsYXkgPiBudl9jb25uZWN0b3ItPm5hdGl2ZV9tb2RlLT52ZGlzcGxheSkKKwkJCXJldHVybiBNT0RFX1BBTkVMOworCisJCW1pbl9jbG9jayA9IDA7CisJCW1heF9jbG9jayA9IDQwMDAwMDsKKwkJYnJlYWs7CisJY2FzZSBPVVRQVVRfVE1EUzoKKwkJaWYgKChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwICYmICFub3V2ZWF1X2R1YWxsaW5rKSB8fAorCQkgICAgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCAmJgorCQkgICAgICFudl9lbmNvZGVyLT5kY2ItPmR1YWxsaW5rX3Bvc3NpYmxlKSkKKwkJCW1heF9jbG9jayA9IDE2NTAwMDsKKwkJZWxzZQorCQkJbWF4X2Nsb2NrID0gMzMwMDAwOworCQlicmVhazsKKwljYXNlIE9VVFBVVF9BTkFMT0c6CisJCW1heF9jbG9jayA9IG52X2VuY29kZXItPmRjYi0+Y3J0Y29uZi5tYXhmcmVxOworCQlpZiAoIW1heF9jbG9jaykKKwkJCW1heF9jbG9jayA9IDM1MDAwMDsKKwkJYnJlYWs7CisJY2FzZSBPVVRQVVRfVFY6CisJCXJldHVybiBnZXRfc2xhdmVfZnVuY3MobnZfZW5jb2RlciktPgorCQkJbW9kZV92YWxpZCh0b19kcm1fZW5jb2Rlcihudl9lbmNvZGVyKSwgbW9kZSk7CisJY2FzZSBPVVRQVVRfRFA6CisJCWlmIChudl9lbmNvZGVyLT5kcC5saW5rX2J3ID09IERQX0xJTktfQldfMl83KQorCQkJbWF4X2Nsb2NrID0gbnZfZW5jb2Rlci0+ZHAubGlua19uciAqIDI3MDAwMDsKKwkJZWxzZQorCQkJbWF4X2Nsb2NrID0gbnZfZW5jb2Rlci0+ZHAubGlua19uciAqIDE2MjAwMDsKKworCQljbG9jayAqPSAzOworCQlicmVhazsKKwl9CisKKwlpZiAoY2xvY2sgPCBtaW5fY2xvY2spCisJCXJldHVybiBNT0RFX0NMT0NLX0xPVzsKKworCWlmIChjbG9jayA+IG1heF9jbG9jaykKKwkJcmV0dXJuIE1PREVfQ0xPQ0tfSElHSDsKKworCXJldHVybiBNT0RFX09LOworfQorCitzdGF0aWMgc3RydWN0IGRybV9lbmNvZGVyICoKK25vdXZlYXVfY29ubmVjdG9yX2Jlc3RfZW5jb2RlcihzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqbnZfY29ubmVjdG9yID0gbm91dmVhdV9jb25uZWN0b3IoY29ubmVjdG9yKTsKKworCWlmIChudl9jb25uZWN0b3ItPmRldGVjdGVkX2VuY29kZXIpCisJCXJldHVybiB0b19kcm1fZW5jb2Rlcihudl9jb25uZWN0b3ItPmRldGVjdGVkX2VuY29kZXIpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MKK25vdXZlYXVfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyA9IHsKKwkuZ2V0X21vZGVzID0gbm91dmVhdV9jb25uZWN0b3JfZ2V0X21vZGVzLAorCS5tb2RlX3ZhbGlkID0gbm91dmVhdV9jb25uZWN0b3JfbW9kZV92YWxpZCwKKwkuYmVzdF9lbmNvZGVyID0gbm91dmVhdV9jb25uZWN0b3JfYmVzdF9lbmNvZGVyLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX2Z1bmNzCitub3V2ZWF1X2Nvbm5lY3Rvcl9mdW5jcyA9IHsKKwkuZHBtcyA9IGRybV9oZWxwZXJfY29ubmVjdG9yX2RwbXMsCisJLnNhdmUgPSBOVUxMLAorCS5yZXN0b3JlID0gTlVMTCwKKwkuZGV0ZWN0ID0gbm91dmVhdV9jb25uZWN0b3JfZGV0ZWN0LAorCS5kZXN0cm95ID0gbm91dmVhdV9jb25uZWN0b3JfZGVzdHJveSwKKwkuZmlsbF9tb2RlcyA9IGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2RlcywKKwkuc2V0X3Byb3BlcnR5ID0gbm91dmVhdV9jb25uZWN0b3Jfc2V0X3Byb3BlcnR5LAorCS5mb3JjZSA9IG5vdXZlYXVfY29ubmVjdG9yX2ZvcmNlCit9OworCitzdGF0aWMgaW50Citub3V2ZWF1X2Nvbm5lY3Rvcl9jcmVhdGVfbHZkcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKm52X2Nvbm5lY3RvciA9IG5vdXZlYXVfY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqaTJjID0gTlVMTDsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlIG5hdGl2ZSwgKm1vZGUsICp0ZW1wOworCWJvb2wgZHVtbXksIGlmX2lzXzI0Yml0ID0gZmFsc2U7CisJaW50IHJldCwgZmxhZ3M7CisKKwludl9lbmNvZGVyID0gZmluZF9lbmNvZGVyX2J5X3R5cGUoY29ubmVjdG9yLCBPVVRQVVRfTFZEUyk7CisJaWYgKCFudl9lbmNvZGVyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldCA9IG5vdXZlYXVfYmlvc19wYXJzZV9sdmRzX3RhYmxlKGRldiwgMCwgJmR1bW15LCAmaWZfaXNfMjRiaXQpOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiRXJyb3IgcGFyc2luZyBMVkRTIHRhYmxlLCBkaXNhYmxpbmcgTFZEU1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCW52X2Nvbm5lY3Rvci0+dXNlX2RpdGhlcmluZyA9ICFpZl9pc18yNGJpdDsKKworCS8qIEZpcnN0bHkgdHJ5IGdldHRpbmcgRURJRCBvdmVyIEREQywgaWYgYWxsb3dlZCBhbmQgSTJDIGNoYW5uZWwKKwkgKiBpcyBhdmFpbGFibGUuCisJICovCisJaWYgKCFkZXZfcHJpdi0+VkJJT1MucHViLmZwX25vX2RkYyAmJiBudl9lbmNvZGVyLT5kY2ItPmkyY19pbmRleCA8IDB4ZikKKwkJaTJjID0gbm91dmVhdV9pMmNfZmluZChkZXYsIG52X2VuY29kZXItPmRjYi0+aTJjX2luZGV4KTsKKworCWlmIChpMmMpIHsKKwkJbm91dmVhdV9jb25uZWN0b3JfZGRjX3ByZXBhcmUoY29ubmVjdG9yLCAmZmxhZ3MpOworCQludl9jb25uZWN0b3ItPmVkaWQgPSBkcm1fZ2V0X2VkaWQoY29ubmVjdG9yLCAmaTJjLT5hZGFwdGVyKTsKKwkJbm91dmVhdV9jb25uZWN0b3JfZGRjX2ZpbmlzaChjb25uZWN0b3IsIGZsYWdzKTsKKwl9CisKKwkvKiBJZiBubyBFRElEIGZvdW5kIGFib3ZlLCBhbmQgdGhlIFZCSU9TIGluZGljYXRlcyBhIGhhcmRjb2RlZAorCSAqIG1vZGVsaW5lIGlzIGF2YWxpbGFibGUgZm9yIHRoZSBwYW5lbCwgc2V0IGl0IGFzIHRoZSBwYW5lbCdzCisJICogbmF0aXZlIG1vZGUgYW5kIGV4aXQuCisJICovCisJaWYgKCFudl9jb25uZWN0b3ItPmVkaWQgJiYgbm91dmVhdV9iaW9zX2ZwX21vZGUoZGV2LCAmbmF0aXZlKSAmJgorCSAgICAgKG52X2VuY29kZXItPmRjYi0+bHZkc2NvbmYudXNlX3N0cmFwc19mb3JfbW9kZSB8fAorCSAgICAgIGRldl9wcml2LT5WQklPUy5wdWIuZnBfbm9fZGRjKSkgeworCQludl9jb25uZWN0b3ItPm5hdGl2ZV9tb2RlID0gZHJtX21vZGVfZHVwbGljYXRlKGRldiwgJm5hdGl2ZSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFN0aWxsIG5vdGhpbmcsIHNvbWUgVkJJT1MgaW1hZ2VzIGhhdmUgYSBoYXJkY29kZWQgRURJRCBibG9jaworCSAqIHN0b3JlZCBmb3IgdGhlIHBhbmVsIHN0b3JlZCBpbiB0aGVtLgorCSAqLworCWlmICghbnZfY29ubmVjdG9yLT5lZGlkICYmICFudl9jb25uZWN0b3ItPm5hdGl2ZV9tb2RlICYmCisJICAgICFkZXZfcHJpdi0+VkJJT1MucHViLmZwX25vX2RkYykgeworCQludl9jb25uZWN0b3ItPmVkaWQgPQorCQkJKHN0cnVjdCBlZGlkICopbm91dmVhdV9iaW9zX2VtYmVkZGVkX2VkaWQoZGV2KTsKKwl9CisKKwlpZiAoIW52X2Nvbm5lY3Rvci0+ZWRpZCkKKwkJZ290byBvdXQ7CisKKwkvKiBXZSBkaWRuJ3QgZmluZC91c2UgYSBwYW5lbCBtb2RlIGZyb20gdGhlIFZCSU9TLCBzbyBwYXJzZSB0aGUgRURJRAorCSAqIGJsb2NrIGFuZCBsb29rIGZvciB0aGUgcHJlZmVycmVkIG1vZGUgdGhlcmUuCisJICovCisJcmV0ID0gZHJtX2FkZF9lZGlkX21vZGVzKGNvbm5lY3RvciwgbnZfY29ubmVjdG9yLT5lZGlkKTsKKwlpZiAocmV0ID09IDApCisJCWdvdG8gb3V0OworCW52X2Nvbm5lY3Rvci0+ZGV0ZWN0ZWRfZW5jb2RlciA9IG52X2VuY29kZXI7CisJbnZfY29ubmVjdG9yLT5uYXRpdmVfbW9kZSA9IG5vdXZlYXVfY29ubmVjdG9yX25hdGl2ZV9tb2RlKG52X2Nvbm5lY3Rvcik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1vZGUsIHRlbXAsICZjb25uZWN0b3ItPnByb2JlZF9tb2RlcywgaGVhZCkKKwkJZHJtX21vZGVfcmVtb3ZlKGNvbm5lY3RvciwgbW9kZSk7CisKK291dDoKKwlpZiAoIW52X2Nvbm5lY3Rvci0+bmF0aXZlX21vZGUpIHsKKwkJTlZfRVJST1IoZGV2LCAiTFZEUyBwcmVzZW50IGluIERDQiB0YWJsZSwgYnV0IGNvdWxkbid0ICIKKwkJCSAgICAgICJkZXRlcm1pbmUgaXRzIG5hdGl2ZSBtb2RlLiAgRGlzYWJsaW5nLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWRybV9tb2RlX2Nvbm5lY3Rvcl91cGRhdGVfZWRpZF9wcm9wZXJ0eShjb25uZWN0b3IsIG52X2Nvbm5lY3Rvci0+ZWRpZCk7CisJcmV0dXJuIDA7Cit9CisKK2ludAorbm91dmVhdV9jb25uZWN0b3JfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpbmRleCwgaW50IHR5cGUpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKm52X2Nvbm5lY3RvciA9IE5VTEw7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CisJaW50IHJldDsKKworCU5WX0RFQlVHKGRldiwgIlxuIik7CisKKwludl9jb25uZWN0b3IgPSBremFsbG9jKHNpemVvZigqbnZfY29ubmVjdG9yKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFudl9jb25uZWN0b3IpCisJCXJldHVybiAtRU5PTUVNOworCW52X2Nvbm5lY3Rvci0+ZGNiID0gbm91dmVhdV9iaW9zX2Nvbm5lY3Rvcl9lbnRyeShkZXYsIGluZGV4KTsKKwljb25uZWN0b3IgPSAmbnZfY29ubmVjdG9yLT5iYXNlOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfVkdBOgorCQlOVl9JTkZPKGRldiwgIkRldGVjdGVkIGEgVkdBIGNvbm5lY3RvclxuIik7CisJCWJyZWFrOworCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0RWSUQ6CisJCU5WX0lORk8oZGV2LCAiRGV0ZWN0ZWQgYSBEVkktRCBjb25uZWN0b3JcbiIpOworCQlicmVhazsKKwljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9EVklJOgorCQlOVl9JTkZPKGRldiwgIkRldGVjdGVkIGEgRFZJLUkgY29ubmVjdG9yXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUzoKKwkJTlZfSU5GTyhkZXYsICJEZXRlY3RlZCBhIExWRFMgY29ubmVjdG9yXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfVFY6CisJCU5WX0lORk8oZGV2LCAiRGV0ZWN0ZWQgYSBUViBjb25uZWN0b3JcbiIpOworCQlicmVhazsKKwljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9EaXNwbGF5UG9ydDoKKwkJTlZfSU5GTyhkZXYsICJEZXRlY3RlZCBhIERpc3BsYXlQb3J0IGNvbm5lY3RvclxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCU5WX0VSUk9SKGRldiwgIlVua25vd24gY29ubmVjdG9yLCB0aGlzIGlzIG5vdCBnb29kLlxuIik7CisJCWJyZWFrOworCX0KKworCS8qIGRlZmF1bHRzLCB3aWxsIGdldCBvdmVycmlkZGVuIGluIGRldGVjdCgpICovCisJY29ubmVjdG9yLT5pbnRlcmxhY2VfYWxsb3dlZCA9IGZhbHNlOworCWNvbm5lY3Rvci0+ZG91Ymxlc2Nhbl9hbGxvd2VkID0gZmFsc2U7CisKKwlkcm1fY29ubmVjdG9yX2luaXQoZGV2LCBjb25uZWN0b3IsICZub3V2ZWF1X2Nvbm5lY3Rvcl9mdW5jcywgdHlwZSk7CisJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKGNvbm5lY3RvciwgJm5vdXZlYXVfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyk7CisKKwkvKiBJbml0IERWSS1JIHNwZWNpZmljIHByb3BlcnRpZXMgKi8KKwlpZiAodHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJSSkgeworCQlkcm1fbW9kZV9jcmVhdGVfZHZpX2lfcHJvcGVydGllcyhkZXYpOworCQlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eShjb25uZWN0b3IsIGRldi0+bW9kZV9jb25maWcuZHZpX2lfc3ViY29ubmVjdG9yX3Byb3BlcnR5LCAwKTsKKwkJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLCBkZXYtPm1vZGVfY29uZmlnLmR2aV9pX3NlbGVjdF9zdWJjb25uZWN0b3JfcHJvcGVydHksIDApOworCX0KKworCWlmICh0eXBlICE9IERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTKQorCQludl9jb25uZWN0b3ItPnVzZV9kaXRoZXJpbmcgPSBmYWxzZTsKKworCWlmICh0eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9EVklEIHx8CisJICAgIHR5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0RWSUkgfHwKKwkgICAgdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUyB8fAorCSAgICB0eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9EaXNwbGF5UG9ydCkgeworCQludl9jb25uZWN0b3ItPnNjYWxpbmdfbW9kZSA9IERSTV9NT0RFX1NDQUxFX0ZVTExTQ1JFRU47CisKKwkJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLCBkZXYtPm1vZGVfY29uZmlnLnNjYWxpbmdfbW9kZV9wcm9wZXJ0eSwKKwkJCQkJICAgICAgbnZfY29ubmVjdG9yLT5zY2FsaW5nX21vZGUpOworCQlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eShjb25uZWN0b3IsIGRldi0+bW9kZV9jb25maWcuZGl0aGVyaW5nX21vZGVfcHJvcGVydHksCisJCQkJCSAgICAgIG52X2Nvbm5lY3Rvci0+dXNlX2RpdGhlcmluZyA/IERSTV9NT0RFX0RJVEhFUklOR19PTgorCQkJCQkgICAgICA6IERSTV9NT0RFX0RJVEhFUklOR19PRkYpOworCisJfSBlbHNlIHsKKwkJbnZfY29ubmVjdG9yLT5zY2FsaW5nX21vZGUgPSBEUk1fTU9ERV9TQ0FMRV9OT05FOworCisJCWlmICh0eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9WR0EgICYmCisJCQkJZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkgeworCQkJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLAorCQkJCQlkZXYtPm1vZGVfY29uZmlnLnNjYWxpbmdfbW9kZV9wcm9wZXJ0eSwKKwkJCQkJbnZfY29ubmVjdG9yLT5zY2FsaW5nX21vZGUpOworCQl9CisJfQorCisJLyogYXR0YWNoIGVuY29kZXJzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbmNvZGVyLCAmZGV2LT5tb2RlX2NvbmZpZy5lbmNvZGVyX2xpc3QsIGhlYWQpIHsKKwkJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKworCQlpZiAobnZfZW5jb2Rlci0+ZGNiLT5jb25uZWN0b3IgIT0gaW5kZXgpCisJCQljb250aW51ZTsKKworCQlpZiAoZ2V0X3NsYXZlX2Z1bmNzKG52X2VuY29kZXIpKQorCQkJZ2V0X3NsYXZlX2Z1bmNzKG52X2VuY29kZXIpLT5jcmVhdGVfcmVzb3VyY2VzKGVuY29kZXIsIGNvbm5lY3Rvcik7CisKKwkJZHJtX21vZGVfY29ubmVjdG9yX2F0dGFjaF9lbmNvZGVyKGNvbm5lY3RvciwgZW5jb2Rlcik7CisJfQorCisJZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9hZGQoY29ubmVjdG9yKTsKKworCWlmIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTKSB7CisJCXJldCA9IG5vdXZlYXVfY29ubmVjdG9yX2NyZWF0ZV9sdmRzKGRldiwgY29ubmVjdG9yKTsKKwkJaWYgKHJldCkgeworCQkJY29ubmVjdG9yLT5mdW5jcy0+ZGVzdHJveShjb25uZWN0b3IpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9jb25uZWN0b3IuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY29ubmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI4YjgwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY29ubmVjdG9yLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNYWFydGVuIE1hYXRodWlzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX05PVVZFQVVfQ09OTkVDVE9SX0hfXworI2RlZmluZSBfX05PVVZFQVVfQ09OTkVDVE9SX0hfXworCisjaW5jbHVkZSAiZHJtX2VkaWQuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2kyYy5oIgorCitzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgeworCXN0cnVjdCBkcm1fY29ubmVjdG9yIGJhc2U7CisKKwlzdHJ1Y3QgZGNiX2Nvbm5lY3Rvcl90YWJsZV9lbnRyeSAqZGNiOworCisJaW50IHNjYWxpbmdfbW9kZTsKKwlib29sIHVzZV9kaXRoZXJpbmc7CisKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpkZXRlY3RlZF9lbmNvZGVyOworCXN0cnVjdCBlZGlkICplZGlkOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpuYXRpdmVfbW9kZTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpub3V2ZWF1X2Nvbm5lY3RvcigKKwkJCQkJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb24pCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihjb24sIHN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciwgYmFzZSk7Cit9CisKK2ludCBub3V2ZWF1X2Nvbm5lY3Rvcl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGkyY19pbmRleCwgaW50IHR5cGUpOworCisjZW5kaWYgLyogX19OT1VWRUFVX0NPTk5FQ1RPUl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY3J0Yy5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9jcnRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmYTdiMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY3J0Yy5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWFhcnRlbiBNYWF0aHVpcy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX19OT1VWRUFVX0NSVENfSF9fCisjZGVmaW5lIF9fTk9VVkVBVV9DUlRDX0hfXworCitzdHJ1Y3Qgbm91dmVhdV9jcnRjIHsKKwlzdHJ1Y3QgZHJtX2NydGMgYmFzZTsKKworCWludCBpbmRleDsKKworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlOworCisJdWludDMyX3QgZHBtc19zYXZlZF9mcF9jb250cm9sOworCXVpbnQzMl90IGZwX3VzZXJzOworCWludCBzYXR1cmF0aW9uOworCWludCBzaGFycG5lc3M7CisJaW50IGxhc3RfZHBtczsKKworCXN0cnVjdCB7CisJCWludCBjcHA7CisJCWJvb2wgYmxhbmtlZDsKKwkJdWludDMyX3Qgb2Zmc2V0OworCQl1aW50MzJfdCB0aWxlX2ZsYWdzOworCX0gZmI7CisKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibzsKKwkJYm9vbCB2aXNpYmxlOworCQl1aW50MzJfdCBvZmZzZXQ7CisJCXZvaWQgKCpzZXRfb2Zmc2V0KShzdHJ1Y3Qgbm91dmVhdV9jcnRjICosIHVpbnQzMl90IG9mZnNldCk7CisJCXZvaWQgKCpzZXRfcG9zKShzdHJ1Y3Qgbm91dmVhdV9jcnRjICosIGludCB4LCBpbnQgeSk7CisJCXZvaWQgKCpoaWRlKShzdHJ1Y3Qgbm91dmVhdV9jcnRjICosIGJvb2wgdXBkYXRlKTsKKwkJdm9pZCAoKnNob3cpKHN0cnVjdCBub3V2ZWF1X2NydGMgKiwgYm9vbCB1cGRhdGUpOworCX0gY3Vyc29yOworCisJc3RydWN0IHsKKwkJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym87CisJCXVpbnQxNl90IHJbMjU2XTsKKwkJdWludDE2X3QgZ1syNTZdOworCQl1aW50MTZfdCBiWzI1Nl07CisJCWludCBkZXB0aDsKKwl9IGx1dDsKKworCWludCAoKnNldF9kaXRoZXIpKHN0cnVjdCBub3V2ZWF1X2NydGMgKmNydGMsIGJvb2wgb24sIGJvb2wgdXBkYXRlKTsKKwlpbnQgKCpzZXRfc2NhbGUpKHN0cnVjdCBub3V2ZWF1X2NydGMgKmNydGMsIGludCBtb2RlLCBib29sIHVwZGF0ZSk7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBub3V2ZWF1X2NydGMgKm5vdXZlYXVfY3J0YyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihjcnRjLCBzdHJ1Y3Qgbm91dmVhdV9jcnRjLCBiYXNlKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZHJtX2NydGMgKnRvX2RybV9jcnRjKHN0cnVjdCBub3V2ZWF1X2NydGMgKmNydGMpCit7CisJcmV0dXJuICZjcnRjLT5iYXNlOworfQorCitpbnQgbnY1MF9jcnRjX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaW5kZXgpOworaW50IG52NTBfY3Vyc29yX2luaXQoc3RydWN0IG5vdXZlYXVfY3J0YyAqKTsKK3ZvaWQgbnY1MF9jdXJzb3JfZmluaShzdHJ1Y3Qgbm91dmVhdV9jcnRjICopOworaW50IG52NTBfY3J0Y19jdXJzb3Jfc2V0KHN0cnVjdCBkcm1fY3J0YyAqZHJtX2NydGMsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorCQkJIHVpbnQzMl90IGJ1ZmZlcl9oYW5kbGUsIHVpbnQzMl90IHdpZHRoLAorCQkJIHVpbnQzMl90IGhlaWdodCk7CitpbnQgbnY1MF9jcnRjX2N1cnNvcl9tb3ZlKHN0cnVjdCBkcm1fY3J0YyAqZHJtX2NydGMsIGludCB4LCBpbnQgeSk7CisKK2ludCBudjA0X2N1cnNvcl9pbml0KHN0cnVjdCBub3V2ZWF1X2NydGMgKik7CisKK3N0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqCitub3V2ZWF1X2NydGNfY29ubmVjdG9yX2dldChzdHJ1Y3Qgbm91dmVhdV9jcnRjICpjcnRjKTsKKworI2VuZGlmIC8qIF9fTk9VVkVBVV9DUlRDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RlYnVnZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzlkYjM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kZWJ1Z2ZzLmMKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgUmVkIEhhdCA8YnNrZWdnc0ByZWRoYXQuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisvKgorICogQXV0aG9yczoKKyAqICBCZW4gU2tlZ2dzIDxic2tlZ2dzQHJlZGhhdC5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorCitzdGF0aWMgaW50Citub3V2ZWF1X2RlYnVnZnNfY2hhbm5lbF9pbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBub2RlLT5pbmZvX2VudC0+ZGF0YTsKKworCXNlcV9wcmludGYobSwgImNoYW5uZWwgaWQgICAgOiAlZFxuIiwgY2hhbi0+aWQpOworCisJc2VxX3ByaW50ZihtLCAiY3B1IGZpZm8gc3RhdGU6XG4iKTsKKwlzZXFfcHJpbnRmKG0sICIgICAgICAgICAgYmFzZTogMHglMDh4XG4iLCBjaGFuLT5wdXNoYnVmX2Jhc2UpOworCXNlcV9wcmludGYobSwgIiAgICAgICAgICAgbWF4OiAweCUwOHhcbiIsIGNoYW4tPmRtYS5tYXggPDwgMik7CisJc2VxX3ByaW50ZihtLCAiICAgICAgICAgICBjdXI6IDB4JTA4eFxuIiwgY2hhbi0+ZG1hLmN1ciA8PCAyKTsKKwlzZXFfcHJpbnRmKG0sICIgICAgICAgICAgIHB1dDogMHglMDh4XG4iLCBjaGFuLT5kbWEucHV0IDw8IDIpOworCXNlcV9wcmludGYobSwgIiAgICAgICAgICBmcmVlOiAweCUwOHhcbiIsIGNoYW4tPmRtYS5mcmVlIDw8IDIpOworCisJc2VxX3ByaW50ZihtLCAiZ3B1IGZpZm8gc3RhdGU6XG4iKTsKKwlzZXFfcHJpbnRmKG0sICIgICAgICAgICAgIGdldDogMHglMDh4XG4iLAorCQkJCQludmNoYW5fcmQzMihjaGFuLCBjaGFuLT51c2VyX2dldCkpOworCXNlcV9wcmludGYobSwgIiAgICAgICAgICAgcHV0OiAweCUwOHhcbiIsCisJCQkJCW52Y2hhbl9yZDMyKGNoYW4sIGNoYW4tPnVzZXJfcHV0KSk7CisKKwlzZXFfcHJpbnRmKG0sICJsYXN0IGZlbmNlICAgIDogJWRcbiIsIGNoYW4tPmZlbmNlLnNlcXVlbmNlKTsKKwlzZXFfcHJpbnRmKG0sICJsYXN0IHNpZ25hbGxlZDogJWRcbiIsIGNoYW4tPmZlbmNlLnNlcXVlbmNlX2Fjayk7CisJcmV0dXJuIDA7Cit9CisKK2ludAorbm91dmVhdV9kZWJ1Z2ZzX2NoYW5uZWxfaW5pdChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGNoYW4tPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9taW5vciAqbWlub3IgPSBjaGFuLT5kZXYtPnByaW1hcnk7CisJaW50IHJldDsKKworCWlmICghZGV2X3ByaXYtPmRlYnVnZnMuY2hhbm5lbF9yb290KSB7CisJCWRldl9wcml2LT5kZWJ1Z2ZzLmNoYW5uZWxfcm9vdCA9CisJCQlkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImNoYW5uZWwiLCBtaW5vci0+ZGVidWdmc19yb290KTsKKwkJaWYgKCFkZXZfcHJpdi0+ZGVidWdmcy5jaGFubmVsX3Jvb3QpCisJCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlzbnByaW50ZihjaGFuLT5kZWJ1Z2ZzLm5hbWUsIDMyLCAiJWQiLCBjaGFuLT5pZCk7CisJY2hhbi0+ZGVidWdmcy5pbmZvLm5hbWUgPSBjaGFuLT5kZWJ1Z2ZzLm5hbWU7CisJY2hhbi0+ZGVidWdmcy5pbmZvLnNob3cgPSBub3V2ZWF1X2RlYnVnZnNfY2hhbm5lbF9pbmZvOworCWNoYW4tPmRlYnVnZnMuaW5mby5kcml2ZXJfZmVhdHVyZXMgPSAwOworCWNoYW4tPmRlYnVnZnMuaW5mby5kYXRhID0gY2hhbjsKKworCXJldCA9IGRybV9kZWJ1Z2ZzX2NyZWF0ZV9maWxlcygmY2hhbi0+ZGVidWdmcy5pbmZvLCAxLAorCQkJCSAgICAgICBkZXZfcHJpdi0+ZGVidWdmcy5jaGFubmVsX3Jvb3QsCisJCQkJICAgICAgIGNoYW4tPmRldi0+cHJpbWFyeSk7CisJaWYgKHJldCA9PSAwKQorCQljaGFuLT5kZWJ1Z2ZzLmFjdGl2ZSA9IHRydWU7CisJcmV0dXJuIHJldDsKK30KKwordm9pZAorbm91dmVhdV9kZWJ1Z2ZzX2NoYW5uZWxfZmluaShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGNoYW4tPmRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoIWNoYW4tPmRlYnVnZnMuYWN0aXZlKQorCQlyZXR1cm47CisKKwlkcm1fZGVidWdmc19yZW1vdmVfZmlsZXMoJmNoYW4tPmRlYnVnZnMuaW5mbywgMSwgY2hhbi0+ZGV2LT5wcmltYXJ5KTsKKwljaGFuLT5kZWJ1Z2ZzLmFjdGl2ZSA9IGZhbHNlOworCisJaWYgKGNoYW4gPT0gZGV2X3ByaXYtPmNoYW5uZWwpIHsKKwkJZGVidWdmc19yZW1vdmUoZGV2X3ByaXYtPmRlYnVnZnMuY2hhbm5lbF9yb290KTsKKwkJZGV2X3ByaXYtPmRlYnVnZnMuY2hhbm5lbF9yb290ID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfZGVidWdmc19jaGlwc2V0X2luZm8oc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gKHN0cnVjdCBkcm1faW5mb19ub2RlICopIG0tPnByaXZhdGU7CisJc3RydWN0IGRybV9taW5vciAqbWlub3IgPSBub2RlLT5taW5vcjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbWlub3ItPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IHBwY2lfMDsKKworCXBwY2lfMCA9IG52X3JkMzIoZGV2LCBkZXZfcHJpdi0+Y2hpcHNldCA+PSAweDQwID8gMHg4ODAwMCA6IDB4MTgwMCk7CisKKwlzZXFfcHJpbnRmKG0sICJQTUNfQk9PVF8wOiAweCUwOHhcbiIsIG52X3JkMzIoZGV2LCBOVjAzX1BNQ19CT09UXzApKTsKKwlzZXFfcHJpbnRmKG0sICJQQ0kgSUQgICAgOiAweCUwNHg6MHglMDR4XG4iLAorCQkgICBwcGNpXzAgJiAweGZmZmYsIHBwY2lfMCA+PiAxNik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfZGVidWdmc19tZW1vcnlfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX21pbm9yICptaW5vciA9IG5vZGUtPm1pbm9yOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBtaW5vci0+ZGV2OworCisJc2VxX3ByaW50ZihtLCAiVlJBTSB0b3RhbDogJWRLaUJcbiIsCisJCSAgIChpbnQpKG5vdXZlYXVfbWVtX2ZiX2Ftb3VudChkZXYpID4+IDEwKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2luZm9fbGlzdCBub3V2ZWF1X2RlYnVnZnNfbGlzdFtdID0geworCXsgImNoaXBzZXQiLCBub3V2ZWF1X2RlYnVnZnNfY2hpcHNldF9pbmZvLCAwLCBOVUxMIH0sCisJeyAibWVtb3J5Iiwgbm91dmVhdV9kZWJ1Z2ZzX21lbW9yeV9pbmZvLCAwLCBOVUxMIH0sCit9OworI2RlZmluZSBOT1VWRUFVX0RFQlVHRlNfRU5UUklFUyBBUlJBWV9TSVpFKG5vdXZlYXVfZGVidWdmc19saXN0KQorCitpbnQKK25vdXZlYXVfZGVidWdmc19pbml0KHN0cnVjdCBkcm1fbWlub3IgKm1pbm9yKQoreworCWRybV9kZWJ1Z2ZzX2NyZWF0ZV9maWxlcyhub3V2ZWF1X2RlYnVnZnNfbGlzdCwgTk9VVkVBVV9ERUJVR0ZTX0VOVFJJRVMsCisJCQkJIG1pbm9yLT5kZWJ1Z2ZzX3Jvb3QsIG1pbm9yKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbm91dmVhdV9kZWJ1Z2ZzX3Rha2Vkb3duKHN0cnVjdCBkcm1fbWlub3IgKm1pbm9yKQoreworCWRybV9kZWJ1Z2ZzX3JlbW92ZV9maWxlcyhub3V2ZWF1X2RlYnVnZnNfbGlzdCwgTk9VVkVBVV9ERUJVR0ZTX0VOVFJJRVMsCisJCQkJIG1pbm9yKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZGlzcGxheS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kaXNwbGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZjOTQzOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZGlzcGxheS5jCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1hYXJ0ZW4gTWFhdGh1aXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybV9jcnRjX2hlbHBlci5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9mYi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZmJjb24uaCIKKworc3RhdGljIHZvaWQKK25vdXZlYXVfdXNlcl9mcmFtZWJ1ZmZlcl9kZXN0cm95KHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmRybV9mYikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9mcmFtZWJ1ZmZlciAqZmIgPSBub3V2ZWF1X2ZyYW1lYnVmZmVyKGRybV9mYik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRybV9mYi0+ZGV2OworCisJaWYgKGRybV9mYi0+ZmJkZXYpCisJCW5vdXZlYXVfZmJjb25fcmVtb3ZlKGRldiwgZHJtX2ZiKTsKKworCWlmIChmYi0+bnZibykgeworCQltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKGZiLT5udmJvLT5nZW0pOworCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwl9CisKKwlkcm1fZnJhbWVidWZmZXJfY2xlYW51cChkcm1fZmIpOworCWtmcmVlKGZiKTsKK30KKworc3RhdGljIGludAorbm91dmVhdV91c2VyX2ZyYW1lYnVmZmVyX2NyZWF0ZV9oYW5kbGUoc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZHJtX2ZiLAorCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50ICpoYW5kbGUpCit7CisJc3RydWN0IG5vdXZlYXVfZnJhbWVidWZmZXIgKmZiID0gbm91dmVhdV9mcmFtZWJ1ZmZlcihkcm1fZmIpOworCisJcmV0dXJuIGRybV9nZW1faGFuZGxlX2NyZWF0ZShmaWxlX3ByaXYsIGZiLT5udmJvLT5nZW0sIGhhbmRsZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyX2Z1bmNzIG5vdXZlYXVfZnJhbWVidWZmZXJfZnVuY3MgPSB7CisJLmRlc3Ryb3kgPSBub3V2ZWF1X3VzZXJfZnJhbWVidWZmZXJfZGVzdHJveSwKKwkuY3JlYXRlX2hhbmRsZSA9IG5vdXZlYXVfdXNlcl9mcmFtZWJ1ZmZlcl9jcmVhdGVfaGFuZGxlLAorfTsKKworc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqCitub3V2ZWF1X2ZyYW1lYnVmZmVyX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibywKKwkJCSAgIHN0cnVjdCBkcm1fbW9kZV9mYl9jbWQgKm1vZGVfY21kKQoreworCXN0cnVjdCBub3V2ZWF1X2ZyYW1lYnVmZmVyICpmYjsKKwlpbnQgcmV0OworCisJZmIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgbm91dmVhdV9mcmFtZWJ1ZmZlciksIEdGUF9LRVJORUwpOworCWlmICghZmIpCisJCXJldHVybiBOVUxMOworCisJcmV0ID0gZHJtX2ZyYW1lYnVmZmVyX2luaXQoZGV2LCAmZmItPmJhc2UsICZub3V2ZWF1X2ZyYW1lYnVmZmVyX2Z1bmNzKTsKKwlpZiAocmV0KSB7CisJCWtmcmVlKGZiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZHJtX2hlbHBlcl9tb2RlX2ZpbGxfZmJfc3RydWN0KCZmYi0+YmFzZSwgbW9kZV9jbWQpOworCisJZmItPm52Ym8gPSBudmJvOworCXJldHVybiAmZmItPmJhc2U7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICoKK25vdXZlYXVfdXNlcl9mcmFtZWJ1ZmZlcl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJCQlzdHJ1Y3QgZHJtX21vZGVfZmJfY21kICptb2RlX2NtZCkKK3sKKwlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYjsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmdlbTsKKworCWdlbSA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGVfcHJpdiwgbW9kZV9jbWQtPmhhbmRsZSk7CisJaWYgKCFnZW0pCisJCXJldHVybiBOVUxMOworCisJZmIgPSBub3V2ZWF1X2ZyYW1lYnVmZmVyX2NyZWF0ZShkZXYsIG5vdXZlYXVfZ2VtX29iamVjdChnZW0pLCBtb2RlX2NtZCk7CisJaWYgKCFmYikgeworCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShnZW0pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gZmI7Cit9CisKK2NvbnN0IHN0cnVjdCBkcm1fbW9kZV9jb25maWdfZnVuY3Mgbm91dmVhdV9tb2RlX2NvbmZpZ19mdW5jcyA9IHsKKwkuZmJfY3JlYXRlID0gbm91dmVhdV91c2VyX2ZyYW1lYnVmZmVyX2NyZWF0ZSwKKwkuZmJfY2hhbmdlZCA9IG5vdXZlYXVfZmJjb25fcHJvYmUsCit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RtYS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDM1NTM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kbWEuYwpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBCZW4gU2tlZ2dzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZG1hLmgiCisKK2ludAorbm91dmVhdV9kbWFfaW5pdChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKm0ybWYgPSBOVUxMOworCWludCByZXQsIGk7CisKKwkvKiBDcmVhdGUgTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVQgZm9yIGJ1ZmZlciBtb3ZlcyAqLworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2dyX25ldyhjaGFuLCBkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTAgPworCQkJCSAgICAweDAwMzkgOiAweDUwMzksICZtMm1mKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfcmVmX2FkZChkZXYsIGNoYW4sIE52TTJNRiwgbTJtZiwgTlVMTCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIE5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUIHJlcXVpcmVzIGEgbm90aWZpZXIgb2JqZWN0ICovCisJcmV0ID0gbm91dmVhdV9ub3RpZmllcl9hbGxvYyhjaGFuLCBOdk5vdGlmeTAsIDMyLCAmY2hhbi0+bTJtZl9udGZ5KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogTWFwIHB1c2ggYnVmZmVyICovCisJcmV0ID0gbm91dmVhdV9ib19tYXAoY2hhbi0+cHVzaGJ1Zl9ibyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIE1hcCBNMk1GIG5vdGlmaWVyIG9iamVjdCAtIGZiY29uLiAqLworCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKSB7CisJCXJldCA9IG5vdXZlYXVfYm9fbWFwKGNoYW4tPm5vdGlmaWVyX2JvKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJLyogSW5pdGlhbGlzZSBETUEgdmFycyAqLworCWNoYW4tPmRtYS5tYXggID0gKGNoYW4tPnB1c2hidWZfYm8tPmJvLm1lbS5zaXplID4+IDIpIC0gMjsKKwljaGFuLT5kbWEucHV0ICA9IDA7CisJY2hhbi0+ZG1hLmN1ciAgPSBjaGFuLT5kbWEucHV0OworCWNoYW4tPmRtYS5mcmVlID0gY2hhbi0+ZG1hLm1heCAtIGNoYW4tPmRtYS5jdXI7CisKKwkvKiBJbnNlcnQgTk9QUyBmb3IgTk9VVkVBVV9ETUFfU0tJUFMgKi8KKwlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIE5PVVZFQVVfRE1BX1NLSVBTKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IE5PVVZFQVVfRE1BX1NLSVBTOyBpKyspCisJCU9VVF9SSU5HKGNoYW4sIDApOworCisJLyogSW5pdGlhbGlzZSBOVl9NRU1PUllfVE9fTUVNT1JZX0ZPUk1BVCAqLworCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgNCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViTTJNRiwgTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVRfTkFNRSwgMSk7CisJT1VUX1JJTkcoY2hhbiwgTnZNMk1GKTsKKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViTTJNRiwgTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVRfRE1BX05PVElGWSwgMSk7CisJT1VUX1JJTkcoY2hhbiwgTnZOb3RpZnkwKTsKKworCS8qIFNpdCBiYWNrIGFuZCBwcmF5IHRoZSBjaGFubmVsIHdvcmtzLi4gKi8KKwlGSVJFX1JJTkcoY2hhbik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorT1VUX1JJTkdwKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIG5yX2R3b3JkcykKK3sKKwlib29sIGlzX2lvbWVtOworCXUzMiAqbWVtID0gdHRtX2ttYXBfb2JqX3ZpcnR1YWwoJmNoYW4tPnB1c2hidWZfYm8tPmttYXAsICZpc19pb21lbSk7CisJbWVtID0gJm1lbVtjaGFuLT5kbWEuY3VyXTsKKwlpZiAoaXNfaW9tZW0pCisJCW1lbWNweV90b2lvKCh2b2lkIF9fZm9yY2UgX19pb21lbSAqKW1lbSwgZGF0YSwgbnJfZHdvcmRzICogNCk7CisJZWxzZQorCQltZW1jcHkobWVtLCBkYXRhLCBucl9kd29yZHMgKiA0KTsKKwljaGFuLT5kbWEuY3VyICs9IG5yX2R3b3JkczsKK30KKworc3RhdGljIGlubGluZSBib29sCitSRUFEX0dFVChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCB1aW50MzJfdCAqZ2V0KQoreworCXVpbnQzMl90IHZhbDsKKworCXZhbCA9IG52Y2hhbl9yZDMyKGNoYW4sIGNoYW4tPnVzZXJfZ2V0KTsKKwlpZiAodmFsIDwgY2hhbi0+cHVzaGJ1Zl9iYXNlIHx8CisJICAgIHZhbCA+PSBjaGFuLT5wdXNoYnVmX2Jhc2UgKyBjaGFuLT5wdXNoYnVmX2JvLT5iby5tZW0uc2l6ZSkgeworCQkvKiBtZWFuaW5nbGVzcyB0byBkbWFfd2FpdCgpIGV4Y2VwdCB0byBrbm93IHdoZXRoZXIgdGhlCisJCSAqIEdQVSBoYXMgc3RhbGxlZCBvciBub3QKKwkJICovCisJCSpnZXQgPSB2YWw7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkqZ2V0ID0gKHZhbCAtIGNoYW4tPnB1c2hidWZfYmFzZSkgPj4gMjsKKwlyZXR1cm4gdHJ1ZTsKK30KKworaW50Citub3V2ZWF1X2RtYV93YWl0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBzaXplKQoreworCXVpbnQzMl90IGdldCwgcHJldl9nZXQgPSAwLCBjbnQgPSAwOworCWJvb2wgZ2V0X3ZhbGlkOworCisJd2hpbGUgKGNoYW4tPmRtYS5mcmVlIDwgc2l6ZSkgeworCQkvKiByZXNldCBjb3VudGVyIGFzIGxvbmcgYXMgR0VUIGlzIHN0aWxsIGFkdmFuY2luZywgdGhpcyBpcworCQkgKiB0byBhdm9pZCBtaXNkZXRlY3RpbmcgYSBHUFUgbG9ja3VwIGlmIHRoZSBHUFUgaGFwcGVucyB0bworCQkgKiBqdXN0IGJlIHByb2Nlc3NpbmcgYW4gb3BlcmF0aW9uIHRoYXQgdGFrZXMgYSBsb25nIHRpbWUKKwkJICovCisJCWdldF92YWxpZCA9IFJFQURfR0VUKGNoYW4sICZnZXQpOworCQlpZiAoZ2V0ICE9IHByZXZfZ2V0KSB7CisJCQlwcmV2X2dldCA9IGdldDsKKwkJCWNudCA9IDA7CisJCX0KKworCQlpZiAoKCsrY250ICYgMHhmZikgPT0gMCkgeworCQkJRFJNX1VERUxBWSgxKTsKKwkJCWlmIChjbnQgPiAxMDAwMDApCisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCisJCS8qIGxvb3AgdW50aWwgd2UgaGF2ZSBhIHVzYWJsZSBHRVQgcG9pbnRlci4gIHRoZSB2YWx1ZQorCQkgKiB3ZSByZWFkIGZyb20gdGhlIEdQVSBtYXkgYmUgb3V0c2lkZSB0aGUgbWFpbiByaW5nIGlmCisJCSAqIFBGSUZPIGlzIHByb2Nlc3NpbmcgYSBidWZmZXIgY2FsbGVkIGZyb20gdGhlIG1haW4gcmluZywKKwkJICogZGlzY2FyZCB0aGVzZSB2YWx1ZXMgdW50aWwgc29tZXRoaW5nIHNlbnNpYmxlIGlzIHNlZW4uCisJCSAqCisJCSAqIHRoZSBvdGhlciBjYXNlIHdlIGRpc2NhcmQgR0VUIGlzIHdoaWxlIHRoZSBHUFUgaXMgZmV0Y2hpbmcKKwkJICogZnJvbSB0aGUgU0tJUFMgYXJlYSwgc28gdGhlIGNvZGUgYmVsb3cgZG9lc24ndCBoYXZlIHRvIGRlYWwKKwkJICogd2l0aCBzb21lIGZ1biBjb3JuZXIgY2FzZXMuCisJCSAqLworCQlpZiAoIWdldF92YWxpZCB8fCBnZXQgPCBOT1VWRUFVX0RNQV9TS0lQUykKKwkJCWNvbnRpbnVlOworCisJCWlmIChnZXQgPD0gY2hhbi0+ZG1hLmN1cikgeworCQkJLyogZW5naW5lIGlzIGZldGNoaW5nIGJlaGluZCB1cywgb3IgaXMgY29tcGxldGVseQorCQkJICogaWRsZSAoR0VUID09IFBVVCkgc28gd2UgaGF2ZSBmcmVlIHNwYWNlIHVwIHVudGlsCisJCQkgKiB0aGUgZW5kIG9mIHRoZSBwdXNoIGJ1ZmZlcgorCQkJICoKKwkJCSAqIHdlIGNhbiBvbmx5IGhpdCB0aGF0IHBhdGggb25jZSBwZXIgY2FsbCBkdWUgdG8KKwkJCSAqIGxvb3BpbmcgYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwdXNoIGJ1ZmZlciwKKwkJCSAqIHdlJ2xsIGhpdCB0aGUgZmV0Y2hpbmctYWhlYWQtb2YtdXMgcGF0aCBmcm9tIHRoYXQKKwkJCSAqIHBvaW50IG9uLgorCQkJICoKKwkJCSAqIHRoZSAqb25lKiBleGNlcHRpb24gdG8gdGhhdCBydWxlIGlzIGlmIHdlIHJlYWQKKwkJCSAqIEdFVD09UFVULCBpbiB3aGljaCBjYXNlIHRoZSBiZWxvdyBjb25kaXRpb25hbCB3aWxsCisJCQkgKiBhbHdheXMgc3VjY2VlZCBhbmQgYnJlYWsgdXMgb3V0IG9mIHRoZSB3YWl0IGxvb3AuCisJCQkgKi8KKwkJCWNoYW4tPmRtYS5mcmVlID0gY2hhbi0+ZG1hLm1heCAtIGNoYW4tPmRtYS5jdXI7CisJCQlpZiAoY2hhbi0+ZG1hLmZyZWUgPj0gc2l6ZSkKKwkJCQlicmVhazsKKworCQkJLyogbm90IGVub3VnaCBzcGFjZSBsZWZ0IGF0IHRoZSBlbmQgb2YgdGhlIHB1c2ggYnVmZmVyLAorCQkJICogaW5zdHJ1Y3QgdGhlIEdQVSB0byBqdW1wIGJhY2sgdG8gdGhlIHN0YXJ0IHJpZ2h0CisJCQkgKiBhZnRlciBwcm9jZXNzaW5nIHRoZSBjdXJyZW50bHkgcGVuZGluZyBjb21tYW5kcy4KKwkJCSAqLworCQkJT1VUX1JJTkcoY2hhbiwgY2hhbi0+cHVzaGJ1Zl9iYXNlIHwgMHgyMDAwMDAwMCk7CisJCQlXUklURV9QVVQoTk9VVkVBVV9ETUFfU0tJUFMpOworCisJCQkvKiB3ZSdyZSBub3cgc3VibWl0dGluZyBjb21tYW5kcyBhdCB0aGUgc3RhcnQgb2YKKwkJCSAqIHRoZSBwdXNoIGJ1ZmZlci4KKwkJCSAqLworCQkJY2hhbi0+ZG1hLmN1ciAgPQorCQkJY2hhbi0+ZG1hLnB1dCAgPSBOT1VWRUFVX0RNQV9TS0lQUzsKKwkJfQorCisJCS8qIGVuZ2luZSBmZXRjaGluZyBhaGVhZCBvZiB1cywgd2UgaGF2ZSBzcGFjZSB1cCB1bnRpbCB0aGUKKwkJICogY3VycmVudCBHRVQgcG9pbnRlci4gIHRoZSAiLSAxIiBpcyB0byBlbnN1cmUgdGhlcmUncworCQkgKiBzcGFjZSBsZWZ0IHRvIGVtaXQgYSBqdW1wIGJhY2sgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUKKwkJICogcHVzaCBidWZmZXIgaWYgd2UgcmVxdWlyZSBpdC4gIHdlIGNhbiBuZXZlciBnZXQgR0VUID09IFBVVAorCQkgKiBoZXJlLCBzbyB0aGlzIGlzIHNhZmUuCisJCSAqLworCQljaGFuLT5kbWEuZnJlZSA9IGdldCAtIGNoYW4tPmRtYS5jdXIgLSAxOworCX0KKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RtYS5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kbWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGU4NWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kbWEuaApAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBCZW4gU2tlZ2dzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX05PVVZFQVVfRE1BX0hfXworI2RlZmluZSBfX05PVVZFQVVfRE1BX0hfXworCisjaWZuZGVmIE5PVVZFQVVfRE1BX0RFQlVHCisjZGVmaW5lIE5PVVZFQVVfRE1BX0RFQlVHIDAKKyNlbmRpZgorCisvKgorICogVGhlcmUncyBhIGh3IHJhY2UgY29uZGl0aW9uIHdoZXJlIHlvdSBjYW4ndCBqdW1wIHRvIHlvdXIgUFVUIG9mZnNldCwKKyAqIHRvIGF2b2lkIHRoaXMgd2UganVtcCB0byBvZmZzZXQgKyBTS0lQUyBhbmQgZmlsbCB0aGUgZGlmZmVyZW5jZSB3aXRoCisgKiBOT1BzLgorICoKKyAqIHhmODYtdmlkZW8tbnYgY29uZmlndXJlcyB0aGUgRE1BIGZldGNoIHNpemUgdG8gMzIgYnl0ZXMsIGFuZCB1c2VzCisgKiBhIFNLSVBTIHZhbHVlIG9mIDguICBMZXRzIGFzc3VtZSB0aGF0IHRoZSByYWNlIGNvbmRpdGlvbiBpcyB0byBkbworICogd2l0aCB3cml0aW5nIGludG8gdGhlIGZldGNoIGFyZWEsIHdlIGNvbmZpZ3VyZSBhIGZldGNoIHNpemUgb2YgMTI4CisgKiBieXRlcyBzbyB3ZSBuZWVkIGEgbGFyZ2VyIFNLSVBTIHZhbHVlLgorICovCisjZGVmaW5lIE5PVVZFQVVfRE1BX1NLSVBTICgxMjggLyA0KQorCisvKiBIYXJkY29kZWQgb2JqZWN0IGFzc2lnbm1lbnRzIHRvIHN1YmNoYW5uZWxzIChzdWJjaGFubmVsIGlkKS4gKi8KK2VudW0geworCU52U3ViTTJNRgk9IDAsCisJTnZTdWIyRAkJPSAxLAorCU52U3ViQ3R4U3VyZjJEICA9IDEsCisJTnZTdWJHZGlSZWN0ICAgID0gMiwKKwlOdlN1YkltYWdlQmxpdCAgPSAzCit9OworCisvKiBPYmplY3QgaGFuZGxlcy4gKi8KK2VudW0geworCU52TTJNRgkJPSAweDgwMDAwMDAxLAorCU52RG1hRkIJCT0gMHg4MDAwMDAwMiwKKwlOdkRtYVRUCQk9IDB4ODAwMDAwMDMsCisJTnZEbWFWUkFNCT0gMHg4MDAwMDAwNCwKKwlOdkRtYUdBUlQJPSAweDgwMDAwMDA1LAorCU52Tm90aWZ5MCAgICAgICA9IDB4ODAwMDAwMDYsCisJTnYyRAkJPSAweDgwMDAwMDA3LAorCU52Q3R4U3VyZjJECT0gMHg4MDAwMDAwOCwKKwlOdlJvcAkJPSAweDgwMDAwMDA5LAorCU52SW1hZ2VQYXR0CT0gMHg4MDAwMDAwYSwKKwlOdkNsaXBSZWN0CT0gMHg4MDAwMDAwYiwKKwlOdkdkaVJlY3QJPSAweDgwMDAwMDBjLAorCU52SW1hZ2VCbGl0CT0gMHg4MDAwMDAwZCwKKworCS8qIEc4MCsgZGlzcGxheSBvYmplY3RzICovCisJTnZFdm9WUkFNCT0gMHgwMTAwMDAwMCwKKwlOdkV2b0ZCMTYJPSAweDAxMDAwMDAxLAorCU52RXZvRkIzMgk9IDB4MDEwMDAwMDIKK307CisKKyNkZWZpbmUgTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDM5CisjZGVmaW5lIE5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBOVl9NRU1PUllfVE9fTUVNT1JZX0ZPUk1BVF9TRVRfUkVGICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNTAKKyNkZWZpbmUgTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVRfTk9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIE5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUX05PVElGWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwNAorI2RlZmluZSBOVl9NRU1PUllfVE9fTUVNT1JZX0ZPUk1BVF9OT1RJRllfU1RZTEVfV1JJVEUgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVRfTk9USUZZX1NUWUxFX1dSSVRFX0xFX0FXQUtFTiAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIE5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUX0RNQV9OT1RJRlkgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDE4MAorI2RlZmluZSBOVl9NRU1PUllfVE9fTUVNT1JZX0ZPUk1BVF9ETUFfU09VUkNFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxODQKKyNkZWZpbmUgTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVRfT0ZGU0VUX0lOICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzBjCisKKyNkZWZpbmUgTlY1MF9NRU1PUllfVE9fTUVNT1JZX0ZPUk1BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA1MDM5CisjZGVmaW5lIE5WNTBfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVRfVU5LMjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBOVjUwX01FTU9SWV9UT19NRU1PUllfRk9STUFUX1VOSzIxQyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMWMKKyNkZWZpbmUgTlY1MF9NRU1PUllfVE9fTUVNT1JZX0ZPUk1BVF9PRkZTRVRfSU5fSElHSCAgICAgICAgICAgICAgICAgICAweDAwMDAwMjM4CisjZGVmaW5lIE5WNTBfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVRfT0ZGU0VUX09VVF9ISUdIICAgICAgICAgICAgICAgICAgMHgwMDAwMDIzYworCitzdGF0aWMgX19tdXN0X2NoZWNrIGlubGluZSBpbnQKK1JJTkdfU1BBQ0Uoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IHNpemUpCit7CisJaWYgKGNoYW4tPmRtYS5mcmVlIDwgc2l6ZSkgeworCQlpbnQgcmV0OworCisJCXJldCA9IG5vdXZlYXVfZG1hX3dhaXQoY2hhbiwgc2l6ZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCWNoYW4tPmRtYS5mcmVlIC09IHNpemU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorT1VUX1JJTkcoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGRhdGEpCit7CisJaWYgKE5PVVZFQVVfRE1BX0RFQlVHKSB7CisJCU5WX0lORk8oY2hhbi0+ZGV2LCAiQ2glZC8weCUwOHg6IDB4JTA4eFxuIiwKKwkJCWNoYW4tPmlkLCBjaGFuLT5kbWEuY3VyIDw8IDIsIGRhdGEpOworCX0KKworCW5vdXZlYXVfYm9fd3IzMihjaGFuLT5wdXNoYnVmX2JvLCBjaGFuLT5kbWEuY3VyKyssIGRhdGEpOworfQorCitleHRlcm4gdm9pZAorT1VUX1JJTkdwKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIG5yX2R3b3Jkcyk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorQkVHSU5fUklORyhzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgc3ViYywgaW50IG10aGQsIGludCBzaXplKQoreworCU9VVF9SSU5HKGNoYW4sIChzdWJjIDw8IDEzKSB8IChzaXplIDw8IDE4KSB8IG10aGQpOworfQorCisjZGVmaW5lIFdSSVRFX1BVVCh2YWwpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCURSTV9NRU1PUllCQVJSSUVSKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCW5vdXZlYXVfYm9fcmQzMihjaGFuLT5wdXNoYnVmX2JvLCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCW52Y2hhbl93cjMyKGNoYW4sIGNoYW4tPnVzZXJfcHV0LCAoKHZhbCkgPDwgMikgKyBjaGFuLT5wdXNoYnVmX2Jhc2UpOyAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSB2b2lkCitGSVJFX1JJTkcoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlpZiAoTk9VVkVBVV9ETUFfREVCVUcpIHsKKwkJTlZfSU5GTyhjaGFuLT5kZXYsICJDaCVkLzB4JTA4eDogUFVTSCFcbiIsCisJCQljaGFuLT5pZCwgY2hhbi0+ZG1hLmN1ciA8PCAyKTsKKwl9CisKKwlpZiAoY2hhbi0+ZG1hLmN1ciA9PSBjaGFuLT5kbWEucHV0KQorCQlyZXR1cm47CisJY2hhbi0+YWNjZWxfZG9uZSA9IHRydWU7CisKKwlXUklURV9QVVQoY2hhbi0+ZG1hLmN1cik7CisJY2hhbi0+ZG1hLnB1dCA9IGNoYW4tPmRtYS5jdXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorV0lORF9SSU5HKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJY2hhbi0+ZG1hLmN1ciA9IGNoYW4tPmRtYS5wdXQ7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNjFmNDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RwLmMKQEAgLTAsMCArMSw1NjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfaTJjLmgiCisjaW5jbHVkZSAibm91dmVhdV9lbmNvZGVyLmgiCisKK3N0YXRpYyBpbnQKK2F1eGNoX3JkKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IGFkZHJlc3MsIHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICphdXhjaDsKKwlpbnQgcmV0OworCisJYXV4Y2ggPSBub3V2ZWF1X2kyY19maW5kKGRldiwgbnZfZW5jb2Rlci0+ZGNiLT5pMmNfaW5kZXgpOworCWlmICghYXV4Y2gpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0gbm91dmVhdV9kcF9hdXhjaChhdXhjaCwgOSwgYWRkcmVzcywgYnVmLCBzaXplKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2F1eGNoX3dyKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IGFkZHJlc3MsIHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICphdXhjaDsKKwlpbnQgcmV0OworCisJYXV4Y2ggPSBub3V2ZWF1X2kyY19maW5kKGRldiwgbnZfZW5jb2Rlci0+ZGNiLT5pMmNfaW5kZXgpOworCWlmICghYXV4Y2gpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0gbm91dmVhdV9kcF9hdXhjaChhdXhjaCwgOCwgYWRkcmVzcywgYnVmLCBzaXplKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50Citub3V2ZWF1X2RwX2xhbmVfY291bnRfc2V0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgdWludDhfdCBjbWQpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXVpbnQzMl90IHRtcDsKKwlpbnQgb3IgPSBudl9lbmNvZGVyLT5vciwgbGluayA9ICEobnZfZW5jb2Rlci0+ZGNiLT5zb3Jjb25mLmxpbmsgJiAxKTsKKworCXRtcCAgPSBudl9yZDMyKGRldiwgTlY1MF9TT1JfRFBfQ1RSTChvciwgbGluaykpOworCXRtcCAmPSB+KE5WNTBfU09SX0RQX0NUUkxfRU5IQU5DRURfRlJBTUVfRU5BQkxFRCB8CisJCSBOVjUwX1NPUl9EUF9DVFJMX0xBTkVfTUFTSyk7CisJdG1wIHw9ICgoMSA8PCAoY21kICYgRFBfTEFORV9DT1VOVF9NQVNLKSkgLSAxKSA8PCAxNjsKKwlpZiAoY21kICYgRFBfTEFORV9DT1VOVF9FTkhBTkNFRF9GUkFNRV9FTikKKwkJdG1wIHw9IE5WNTBfU09SX0RQX0NUUkxfRU5IQU5DRURfRlJBTUVfRU5BQkxFRDsKKwludl93cjMyKGRldiwgTlY1MF9TT1JfRFBfQ1RSTChvciwgbGluayksIHRtcCk7CisKKwlyZXR1cm4gYXV4Y2hfd3IoZW5jb2RlciwgRFBfTEFORV9DT1VOVF9TRVQsICZjbWQsIDEpOworfQorCitzdGF0aWMgaW50Citub3V2ZWF1X2RwX2xpbmtfYndfc2V0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgdWludDhfdCBjbWQpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXVpbnQzMl90IHRtcDsKKwlpbnQgcmVnID0gMHg2MTQzMDAgKyAobnZfZW5jb2Rlci0+b3IgKiAweDgwMCk7CisKKwl0bXAgID0gbnZfcmQzMihkZXYsIHJlZyk7CisJdG1wICY9IDB4ZmZmM2ZmZmY7CisJaWYgKGNtZCA9PSBEUF9MSU5LX0JXXzJfNykKKwkJdG1wIHw9IDB4MDAwNDAwMDA7CisJbnZfd3IzMihkZXYsIHJlZywgdG1wKTsKKworCXJldHVybiBhdXhjaF93cihlbmNvZGVyLCBEUF9MSU5LX0JXX1NFVCwgJmNtZCwgMSk7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfZHBfbGlua190cmFpbl9zZXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgcGF0dGVybikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisJdWludDMyX3QgdG1wOworCXVpbnQ4X3QgY21kOworCWludCBvciA9IG52X2VuY29kZXItPm9yLCBsaW5rID0gIShudl9lbmNvZGVyLT5kY2ItPnNvcmNvbmYubGluayAmIDEpOworCWludCByZXQ7CisKKwl0bXAgID0gbnZfcmQzMihkZXYsIE5WNTBfU09SX0RQX0NUUkwob3IsIGxpbmspKTsKKwl0bXAgJj0gfk5WNTBfU09SX0RQX0NUUkxfVFJBSU5JTkdfUEFUVEVSTjsKKwl0bXAgfD0gKHBhdHRlcm4gPDwgMjQpOworCW52X3dyMzIoZGV2LCBOVjUwX1NPUl9EUF9DVFJMKG9yLCBsaW5rKSwgdG1wKTsKKworCXJldCA9IGF1eGNoX3JkKGVuY29kZXIsIERQX1RSQUlOSU5HX1BBVFRFUk5fU0VULCAmY21kLCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWNtZCAmPSB+RFBfVFJBSU5JTkdfUEFUVEVSTl9NQVNLOworCWNtZCB8PSAocGF0dGVybiAmIERQX1RSQUlOSU5HX1BBVFRFUk5fTUFTSyk7CisJcmV0dXJuIGF1eGNoX3dyKGVuY29kZXIsIERQX1RSQUlOSU5HX1BBVFRFUk5fU0VULCAmY21kLCAxKTsKK30KKworc3RhdGljIGludAorbm91dmVhdV9kcF9tYXhfdm9sdGFnZV9zd2luZyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBiaXRfZGlzcGxheXBvcnRfZW5jb2Rlcl90YWJsZV9lbnRyeSAqZHBzZTsKKwlzdHJ1Y3QgYml0X2Rpc3BsYXlwb3J0X2VuY29kZXJfdGFibGUgKmRwZTsKKwlpbnQgaSwgZHBlX2hlYWRlcmxlbiwgbWF4X3ZzID0gMDsKKworCWRwZSA9IG5vdXZlYXVfYmlvc19kcF90YWJsZShkZXYsIG52X2VuY29kZXItPmRjYiwgJmRwZV9oZWFkZXJsZW4pOworCWlmICghZHBlKQorCQlyZXR1cm4gZmFsc2U7CisJZHBzZSA9ICh2b2lkICopKChjaGFyICopZHBlICsgZHBlX2hlYWRlcmxlbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgZHBlX2hlYWRlcmxlbjsgaSsrLCBkcHNlKyspIHsKKwkJaWYgKGRwc2UtPnZzX2xldmVsID4gbWF4X3ZzKQorCQkJbWF4X3ZzID0gZHBzZS0+dnNfbGV2ZWw7CisJfQorCisJcmV0dXJuIG1heF92czsKK30KKworc3RhdGljIGludAorbm91dmVhdV9kcF9tYXhfcHJlX2VtcGhhc2lzKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IHZzKQoreworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgYml0X2Rpc3BsYXlwb3J0X2VuY29kZXJfdGFibGVfZW50cnkgKmRwc2U7CisJc3RydWN0IGJpdF9kaXNwbGF5cG9ydF9lbmNvZGVyX3RhYmxlICpkcGU7CisJaW50IGksIGRwZV9oZWFkZXJsZW4sIG1heF9wcmUgPSAwOworCisJZHBlID0gbm91dmVhdV9iaW9zX2RwX3RhYmxlKGRldiwgbnZfZW5jb2Rlci0+ZGNiLCAmZHBlX2hlYWRlcmxlbik7CisJaWYgKCFkcGUpCisJCXJldHVybiBmYWxzZTsKKwlkcHNlID0gKHZvaWQgKikoKGNoYXIgKilkcGUgKyBkcGVfaGVhZGVybGVuKTsKKworCWZvciAoaSA9IDA7IGkgPCBkcGVfaGVhZGVybGVuOyBpKyssIGRwc2UrKykgeworCQlpZiAoZHBzZS0+dnNfbGV2ZWwgIT0gdnMpCisJCQljb250aW51ZTsKKworCQlpZiAoZHBzZS0+cHJlX2xldmVsID4gbWF4X3ByZSkKKwkJCW1heF9wcmUgPSBkcHNlLT5wcmVfbGV2ZWw7CisJfQorCisJcmV0dXJuIG1heF9wcmU7Cit9CisKK3N0YXRpYyBib29sCitub3V2ZWF1X2RwX2xpbmtfdHJhaW5fYWRqdXN0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgdWludDhfdCAqY29uZmlnKQoreworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgYml0X2Rpc3BsYXlwb3J0X2VuY29kZXJfdGFibGVfZW50cnkgKmRwc2U7CisJc3RydWN0IGJpdF9kaXNwbGF5cG9ydF9lbmNvZGVyX3RhYmxlICpkcGU7CisJaW50IHJldCwgaSwgZHBlX2hlYWRlcmxlbiwgdnMgPSAwLCBwcmUgPSAwOworCXVpbnQ4X3QgcmVxdWVzdFsyXTsKKworCWRwZSA9IG5vdXZlYXVfYmlvc19kcF90YWJsZShkZXYsIG52X2VuY29kZXItPmRjYiwgJmRwZV9oZWFkZXJsZW4pOworCWlmICghZHBlKQorCQlyZXR1cm4gZmFsc2U7CisJZHBzZSA9ICh2b2lkICopKChjaGFyICopZHBlICsgZHBlX2hlYWRlcmxlbik7CisKKwlyZXQgPSBhdXhjaF9yZChlbmNvZGVyLCBEUF9BREpVU1RfUkVRVUVTVF9MQU5FMF8xLCByZXF1ZXN0LCAyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gZmFsc2U7CisKKwlOVl9ERUJVRyhkZXYsICJcdFx0YWRqdXN0IDB4JTAyeCAweCUwMnhcbiIsIHJlcXVlc3RbMF0sIHJlcXVlc3RbMV0pOworCisJLyogS2VlcCBhbGwgbGFuZXMgYXQgdGhlIHNhbWUgbGV2ZWwuLiAqLworCWZvciAoaSA9IDA7IGkgPCBudl9lbmNvZGVyLT5kcC5saW5rX25yOyBpKyspIHsKKwkJaW50IGxhbmVfcmVxID0gKHJlcXVlc3RbaSA+PiAxXSA+PiAoKGkgJiAxKSA8PCAyKSkgJiAweGY7CisJCWludCBsYW5lX3ZzID0gbGFuZV9yZXEgJiAzOworCQlpbnQgbGFuZV9wcmUgPSAobGFuZV9yZXEgPj4gMikgJiAzOworCisJCWlmIChsYW5lX3ZzID4gdnMpCisJCQl2cyA9IGxhbmVfdnM7CisJCWlmIChsYW5lX3ByZSA+IHByZSkKKwkJCXByZSA9IGxhbmVfcHJlOworCX0KKworCWlmICh2cyA+PSBub3V2ZWF1X2RwX21heF92b2x0YWdlX3N3aW5nKGVuY29kZXIpKSB7CisJCXZzICA9IG5vdXZlYXVfZHBfbWF4X3ZvbHRhZ2Vfc3dpbmcoZW5jb2Rlcik7CisJCXZzIHw9IDQ7CisJfQorCisJaWYgKHByZSA+PSBub3V2ZWF1X2RwX21heF9wcmVfZW1waGFzaXMoZW5jb2RlciwgdnMgJiAzKSkgeworCQlwcmUgID0gbm91dmVhdV9kcF9tYXhfcHJlX2VtcGhhc2lzKGVuY29kZXIsIHZzICYgMyk7CisJCXByZSB8PSA0OworCX0KKworCS8qIFVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBmb3IgYWxsIGxhbmVzLi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnZfZW5jb2Rlci0+ZHAubGlua19ucjsgaSsrKQorCQljb25maWdbaV0gPSAocHJlIDw8IDMpIHwgdnM7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK25vdXZlYXVfZHBfbGlua190cmFpbl9jb21taXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCB1aW50OF90ICpjb25maWcpCit7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBiaXRfZGlzcGxheXBvcnRfZW5jb2Rlcl90YWJsZV9lbnRyeSAqZHBzZTsKKwlzdHJ1Y3QgYml0X2Rpc3BsYXlwb3J0X2VuY29kZXJfdGFibGUgKmRwZTsKKwlpbnQgb3IgPSBudl9lbmNvZGVyLT5vciwgbGluayA9ICEobnZfZW5jb2Rlci0+ZGNiLT5zb3Jjb25mLmxpbmsgJiAxKTsKKwlpbnQgZHBlX2hlYWRlcmxlbiwgcmV0LCBpOworCisJTlZfREVCVUcoZGV2LCAiXHRcdGNvbmZpZyAweCUwMnggMHglMDJ4IDB4JTAyeCAweCUwMnhcbiIsCisJCSBjb25maWdbMF0sIGNvbmZpZ1sxXSwgY29uZmlnWzJdLCBjb25maWdbM10pOworCisJZHBlID0gbm91dmVhdV9iaW9zX2RwX3RhYmxlKGRldiwgbnZfZW5jb2Rlci0+ZGNiLCAmZHBlX2hlYWRlcmxlbik7CisJaWYgKCFkcGUpCisJCXJldHVybiBmYWxzZTsKKwlkcHNlID0gKHZvaWQgKikoKGNoYXIgKilkcGUgKyBkcGVfaGVhZGVybGVuKTsKKworCWZvciAoaSA9IDA7IGkgPCBkcGUtPnJlY29yZF9ucjsgaSsrLCBkcHNlKyspIHsKKwkJaWYgKGRwc2UtPnZzX2xldmVsID09IChjb25maWdbMF0gJiAzKSAmJgorCQkgICAgZHBzZS0+cHJlX2xldmVsID09ICgoY29uZmlnWzBdID4+IDMpICYgMykpCisJCQlicmVhazsKKwl9CisJQlVHX09OKGkgPT0gZHBlLT5yZWNvcmRfbnIpOworCisJZm9yIChpID0gMDsgaSA8IG52X2VuY29kZXItPmRwLmxpbmtfbnI7IGkrKykgeworCQljb25zdCBpbnQgc2hpZnRbNF0gPSB7IDE2LCA4LCAwLCAyNCB9OworCQl1aW50MzJfdCBtYXNrID0gMHhmZiA8PCBzaGlmdFtpXTsKKwkJdWludDMyX3QgcmVnMCwgcmVnMSwgcmVnMjsKKworCQlyZWcwICA9IG52X3JkMzIoZGV2LCBOVjUwX1NPUl9EUF9VTksxMTgob3IsIGxpbmspKSAmIH5tYXNrOworCQlyZWcwIHw9IChkcHNlLT5yZWcwIDw8IHNoaWZ0W2ldKTsKKwkJcmVnMSAgPSBudl9yZDMyKGRldiwgTlY1MF9TT1JfRFBfVU5LMTIwKG9yLCBsaW5rKSkgJiB+bWFzazsKKwkJcmVnMSB8PSAoZHBzZS0+cmVnMSA8PCBzaGlmdFtpXSk7CisJCXJlZzIgID0gbnZfcmQzMihkZXYsIE5WNTBfU09SX0RQX1VOSzEzMChvciwgbGluaykpICYgMHhmZmZmMDBmZjsKKwkJcmVnMiB8PSAoZHBzZS0+cmVnMiA8PCA4KTsKKwkJbnZfd3IzMihkZXYsIE5WNTBfU09SX0RQX1VOSzExOChvciwgbGluayksIHJlZzApOworCQludl93cjMyKGRldiwgTlY1MF9TT1JfRFBfVU5LMTIwKG9yLCBsaW5rKSwgcmVnMSk7CisJCW52X3dyMzIoZGV2LCBOVjUwX1NPUl9EUF9VTksxMzAob3IsIGxpbmspLCByZWcyKTsKKwl9CisKKwlyZXQgPSBhdXhjaF93cihlbmNvZGVyLCBEUF9UUkFJTklOR19MQU5FMF9TRVQsIGNvbmZpZywgNCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wKK25vdXZlYXVfZHBfbGlua190cmFpbihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXVpbnQ4X3QgY29uZmlnWzRdOworCXVpbnQ4X3Qgc3RhdHVzWzNdOworCWJvb2wgY3JfZG9uZSwgY3JfbWF4X3ZzLCBlcV9kb25lOworCWludCByZXQgPSAwLCBpLCB0cmllcywgdm9sdGFnZTsKKworCU5WX0RFQlVHKGRldiwgImxpbmsgdHJhaW5pbmchIVxuIik7Cit0cmFpbjoKKwljcl9kb25lID0gZXFfZG9uZSA9IGZhbHNlOworCisJLyogc2V0IGxpbmsgY29uZmlndXJhdGlvbiAqLworCU5WX0RFQlVHKGRldiwgIlx0YmVnaW4gdHJhaW46IGJ3ICVkLCBsYW5lcyAlZFxuIiwKKwkJIG52X2VuY29kZXItPmRwLmxpbmtfYncsIG52X2VuY29kZXItPmRwLmxpbmtfbnIpOworCisJcmV0ID0gbm91dmVhdV9kcF9saW5rX2J3X3NldChlbmNvZGVyLCBudl9lbmNvZGVyLT5kcC5saW5rX2J3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gZmFsc2U7CisKKwljb25maWdbMF0gPSBudl9lbmNvZGVyLT5kcC5saW5rX25yOworCWlmIChudl9lbmNvZGVyLT5kcC5kcGNkX3ZlcnNpb24gPj0gMHgxMSkKKwkJY29uZmlnWzBdIHw9IERQX0xBTkVfQ09VTlRfRU5IQU5DRURfRlJBTUVfRU47CisKKwlyZXQgPSBub3V2ZWF1X2RwX2xhbmVfY291bnRfc2V0KGVuY29kZXIsIGNvbmZpZ1swXSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogY2xvY2sgcmVjb3ZlcnkgKi8KKwlOVl9ERUJVRyhkZXYsICJcdGJlZ2luIGNyXG4iKTsKKwlyZXQgPSBub3V2ZWF1X2RwX2xpbmtfdHJhaW5fc2V0KGVuY29kZXIsIERQX1RSQUlOSU5HX1BBVFRFUk5fMSk7CisJaWYgKHJldCkKKwkJZ290byBzdG9wOworCisJdHJpZXMgPSAwOworCXZvbHRhZ2UgPSAtMTsKKwltZW1zZXQoY29uZmlnLCAweDAwLCBzaXplb2YoY29uZmlnKSk7CisJZm9yICg7OykgeworCQlpZiAoIW5vdXZlYXVfZHBfbGlua190cmFpbl9jb21taXQoZW5jb2RlciwgY29uZmlnKSkKKwkJCWJyZWFrOworCisJCXVkZWxheSgxMDApOworCisJCXJldCA9IGF1eGNoX3JkKGVuY29kZXIsIERQX0xBTkUwXzFfU1RBVFVTLCBzdGF0dXMsIDIpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJCU5WX0RFQlVHKGRldiwgIlx0XHRzdGF0dXM6IDB4JTAyeCAweCUwMnhcbiIsCisJCQkgc3RhdHVzWzBdLCBzdGF0dXNbMV0pOworCisJCWNyX2RvbmUgPSB0cnVlOworCQljcl9tYXhfdnMgPSBmYWxzZTsKKwkJZm9yIChpID0gMDsgaSA8IG52X2VuY29kZXItPmRwLmxpbmtfbnI7IGkrKykgeworCQkJaW50IGxhbmUgPSAoc3RhdHVzW2kgPj4gMV0gPj4gKChpICYgMSkgKiA0KSkgJiAweGY7CisKKwkJCWlmICghKGxhbmUgJiBEUF9MQU5FX0NSX0RPTkUpKSB7CisJCQkJY3JfZG9uZSA9IGZhbHNlOworCQkJCWlmIChjb25maWdbaV0gJiBEUF9UUkFJTl9NQVhfUFJFX0VNUEhBU0lTX1JFQUNIRUQpCisJCQkJCWNyX21heF92cyA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoKGNvbmZpZ1swXSAmIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfTUFTSykgIT0gdm9sdGFnZSkgeworCQkJdm9sdGFnZSA9IGNvbmZpZ1swXSAmIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfTUFTSzsKKwkJCXRyaWVzID0gMDsKKwkJfQorCisJCWlmIChjcl9kb25lIHx8IGNyX21heF92cyB8fCAoKyt0cmllcyA9PSA1KSkKKwkJCWJyZWFrOworCisJCWlmICghbm91dmVhdV9kcF9saW5rX3RyYWluX2FkanVzdChlbmNvZGVyLCBjb25maWcpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKCFjcl9kb25lKQorCQlnb3RvIHN0b3A7CisKKwkvKiBjaGFubmVsIGVxdWFsaXNhdGlvbiAqLworCU5WX0RFQlVHKGRldiwgIlx0YmVnaW4gZXFcbiIpOworCXJldCA9IG5vdXZlYXVfZHBfbGlua190cmFpbl9zZXQoZW5jb2RlciwgRFBfVFJBSU5JTkdfUEFUVEVSTl8yKTsKKwlpZiAocmV0KQorCQlnb3RvIHN0b3A7CisKKwlmb3IgKHRyaWVzID0gMDsgdHJpZXMgPD0gNTsgdHJpZXMrKykgeworCQl1ZGVsYXkoNDAwKTsKKworCQlyZXQgPSBhdXhjaF9yZChlbmNvZGVyLCBEUF9MQU5FMF8xX1NUQVRVUywgc3RhdHVzLCAzKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCQlOVl9ERUJVRyhkZXYsICJcdFx0c3RhdHVzOiAweCUwMnggMHglMDJ4XG4iLAorCQkJIHN0YXR1c1swXSwgc3RhdHVzWzFdKTsKKworCQllcV9kb25lID0gdHJ1ZTsKKwkJaWYgKCEoc3RhdHVzWzJdICYgRFBfSU5URVJMQU5FX0FMSUdOX0RPTkUpKQorCQkJZXFfZG9uZSA9IGZhbHNlOworCisJCWZvciAoaSA9IDA7IGVxX2RvbmUgJiYgaSA8IG52X2VuY29kZXItPmRwLmxpbmtfbnI7IGkrKykgeworCQkJaW50IGxhbmUgPSAoc3RhdHVzW2kgPj4gMV0gPj4gKChpICYgMSkgKiA0KSkgJiAweGY7CisKKwkJCWlmICghKGxhbmUgJiBEUF9MQU5FX0NSX0RPTkUpKSB7CisJCQkJY3JfZG9uZSA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoIShsYW5lICYgRFBfTEFORV9DSEFOTkVMX0VRX0RPTkUpIHx8CisJCQkgICAgIShsYW5lICYgRFBfTEFORV9TWU1CT0xfTE9DS0VEKSkgeworCQkJCWVxX2RvbmUgPSBmYWxzZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChlcV9kb25lIHx8ICFjcl9kb25lKQorCQkJYnJlYWs7CisKKwkJaWYgKCFub3V2ZWF1X2RwX2xpbmtfdHJhaW5fYWRqdXN0KGVuY29kZXIsIGNvbmZpZykgfHwKKwkJICAgICFub3V2ZWF1X2RwX2xpbmtfdHJhaW5fY29tbWl0KGVuY29kZXIsIGNvbmZpZykpCisJCQlicmVhazsKKwl9CisKK3N0b3A6CisJLyogZW5kIGxpbmsgdHJhaW5pbmcgKi8KKwlyZXQgPSBub3V2ZWF1X2RwX2xpbmtfdHJhaW5fc2V0KGVuY29kZXIsIERQX1RSQUlOSU5HX1BBVFRFUk5fRElTQUJMRSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogcmV0cnkgYXQgYSBsb3dlciBzZXR0aW5nLCBpZiBwb3NzaWJsZSAqLworCWlmICghcmV0ICYmICEoZXFfZG9uZSAmJiBjcl9kb25lKSkgeworCQlOVl9ERUJVRyhkZXYsICJcdHdlIGZhaWxlZFxuIik7CisJCWlmIChudl9lbmNvZGVyLT5kcC5saW5rX2J3ICE9IERQX0xJTktfQldfMV82MikgeworCQkJTlZfREVCVUcoZGV2LCAicmV0cnkgbGluayB0cmFpbmluZyBhdCBsb3cgcmF0ZVxuIik7CisJCQludl9lbmNvZGVyLT5kcC5saW5rX2J3ID0gRFBfTElOS19CV18xXzYyOworCQkJZ290byB0cmFpbjsKKwkJfQorCX0KKworCXJldHVybiBlcV9kb25lOworfQorCitib29sCitub3V2ZWF1X2RwX2RldGVjdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXVpbnQ4X3QgZHBjZFs0XTsKKwlpbnQgcmV0OworCisJcmV0ID0gYXV4Y2hfcmQoZW5jb2RlciwgMHgwMDAwLCBkcGNkLCA0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gZmFsc2U7CisKKwlOVl9ERUJVRyhkZXYsICJlbmNvZGVyOiBsaW5rX2J3ICVkLCBsaW5rX25yICVkXG4iCisJCSAgICAgICJkaXNwbGF5OiBsaW5rX2J3ICVkLCBsaW5rX25yICVkIHZlcnNpb24gMHglMDJ4XG4iLAorCQkgbnZfZW5jb2Rlci0+ZGNiLT5kcGNvbmYubGlua19idywKKwkJIG52X2VuY29kZXItPmRjYi0+ZHBjb25mLmxpbmtfbnIsCisJCSBkcGNkWzFdLCBkcGNkWzJdICYgMHgwZiwgZHBjZFswXSk7CisKKwludl9lbmNvZGVyLT5kcC5kcGNkX3ZlcnNpb24gPSBkcGNkWzBdOworCisJbnZfZW5jb2Rlci0+ZHAubGlua19idyA9IGRwY2RbMV07CisJaWYgKG52X2VuY29kZXItPmRwLmxpbmtfYncgIT0gRFBfTElOS19CV18xXzYyICYmCisJICAgICFudl9lbmNvZGVyLT5kY2ItPmRwY29uZi5saW5rX2J3KQorCQludl9lbmNvZGVyLT5kcC5saW5rX2J3ID0gRFBfTElOS19CV18xXzYyOworCisJbnZfZW5jb2Rlci0+ZHAubGlua19uciA9IGRwY2RbMl0gJiAweGY7CisJaWYgKG52X2VuY29kZXItPmRwLmxpbmtfbnIgPiBudl9lbmNvZGVyLT5kY2ItPmRwY29uZi5saW5rX25yKQorCQludl9lbmNvZGVyLT5kcC5saW5rX25yID0gbnZfZW5jb2Rlci0+ZGNiLT5kcGNvbmYubGlua19ucjsKKworCXJldHVybiB0cnVlOworfQorCitpbnQKK25vdXZlYXVfZHBfYXV4Y2goc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKmF1eGNoLCBpbnQgY21kLCBpbnQgYWRkciwKKwkJIHVpbnQ4X3QgKmRhdGEsIGludCBkYXRhX25yKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBhdXhjaC0+ZGV2OworCXVpbnQzMl90IHRtcCwgY3RybCwgc3RhdCA9IDAsIGRhdGEzMls0XSA9IHt9OworCWludCByZXQgPSAwLCBpLCBpbmRleCA9IGF1eGNoLT5yZDsKKworCU5WX0RFQlVHKGRldiwgImNoICVkIGNtZCAlZCBhZGRyIDB4JXggbGVuICVkXG4iLCBpbmRleCwgY21kLCBhZGRyLCBkYXRhX25yKTsKKworCXRtcCA9IG52X3JkMzIoZGV2LCBOVjUwX0FVWENIX0NUUkwoYXV4Y2gtPnJkKSk7CisJbnZfd3IzMihkZXYsIE5WNTBfQVVYQ0hfQ1RSTChhdXhjaC0+cmQpLCB0bXAgfCAweDAwMTAwMDAwKTsKKwl0bXAgPSBudl9yZDMyKGRldiwgTlY1MF9BVVhDSF9DVFJMKGF1eGNoLT5yZCkpOworCWlmICghKHRtcCAmIDB4MDEwMDAwMDApKSB7CisJCU5WX0VSUk9SKGRldiwgImV4cGVjdGVkIGJpdCAyNCA9PSAxLCBnb3QgMHglMDh4XG4iLCB0bXApOworCQlyZXQgPSAtRUlPOworCQlnb3RvIG91dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXRtcCA9IG52X3JkMzIoZGV2LCBOVjUwX0FVWENIX1NUQVQoYXV4Y2gtPnJkKSk7CisJCWlmICh0bXAgJiBOVjUwX0FVWENIX1NUQVRfU1RBVEVfUkVBRFkpCisJCQlicmVhazsKKwkJdWRlbGF5KDEwMCk7CisJfQorCisJaWYgKGkgPT0gMykgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghKGNtZCAmIDEpKSB7CisJCW1lbWNweShkYXRhMzIsIGRhdGEsIGRhdGFfbnIpOworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQlOVl9ERUJVRyhkZXYsICJ3ciAlZDogMHglMDh4XG4iLCBpLCBkYXRhMzJbaV0pOworCQkJbnZfd3IzMihkZXYsIE5WNTBfQVVYQ0hfREFUQV9PVVQoaW5kZXgsIGkpLCBkYXRhMzJbaV0pOworCQl9CisJfQorCisJbnZfd3IzMihkZXYsIE5WNTBfQVVYQ0hfQUREUihpbmRleCksIGFkZHIpOworCWN0cmwgID0gbnZfcmQzMihkZXYsIE5WNTBfQVVYQ0hfQ1RSTChpbmRleCkpOworCWN0cmwgJj0gfihOVjUwX0FVWENIX0NUUkxfQ01EIHwgTlY1MF9BVVhDSF9DVFJMX0xFTik7CisJY3RybCB8PSAoY21kIDw8IE5WNTBfQVVYQ0hfQ1RSTF9DTURfU0hJRlQpOworCWN0cmwgfD0gKChkYXRhX25yIC0gMSkgPDwgTlY1MF9BVVhDSF9DVFJMX0xFTl9TSElGVCk7CisKKwlmb3IgKDs7KSB7CisJCW52X3dyMzIoZGV2LCBOVjUwX0FVWENIX0NUUkwoaW5kZXgpLCBjdHJsIHwgMHg4MDAwMDAwMCk7CisJCW52X3dyMzIoZGV2LCBOVjUwX0FVWENIX0NUUkwoaW5kZXgpLCBjdHJsKTsKKwkJbnZfd3IzMihkZXYsIE5WNTBfQVVYQ0hfQ1RSTChpbmRleCksIGN0cmwgfCAweDAwMDEwMDAwKTsKKwkJaWYgKCFudl93YWl0KE5WNTBfQVVYQ0hfQ1RSTChpbmRleCksIDB4MDAwMTAwMDAsIDB4MDAwMDAwMDApKSB7CisJCQlOVl9FUlJPUihkZXYsICJleHBlY3RlZCBiaXQgMTYgPT0gMCwgZ290IDB4JTA4eFxuIiwKKwkJCQkgbnZfcmQzMihkZXYsIE5WNTBfQVVYQ0hfQ1RSTChpbmRleCkpKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKworCQl1ZGVsYXkoNDAwKTsKKworCQlzdGF0ID0gbnZfcmQzMihkZXYsIE5WNTBfQVVYQ0hfU1RBVChpbmRleCkpOworCQlpZiAoKHN0YXQgJiBOVjUwX0FVWENIX1NUQVRfUkVQTFlfQVVYKSAhPQorCQkJICAgIE5WNTBfQVVYQ0hfU1RBVF9SRVBMWV9BVVhfREVGRVIpCisJCQlicmVhazsKKwl9CisKKwlpZiAoY21kICYgMSkgeworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQlkYXRhMzJbaV0gPSBudl9yZDMyKGRldiwgTlY1MF9BVVhDSF9EQVRBX0lOKGluZGV4LCBpKSk7CisJCQlOVl9ERUJVRyhkZXYsICJyZCAlZDogMHglMDh4XG4iLCBpLCBkYXRhMzJbaV0pOworCQl9CisJCW1lbWNweShkYXRhLCBkYXRhMzIsIGRhdGFfbnIpOworCX0KKworb3V0OgorCXRtcCA9IG52X3JkMzIoZGV2LCBOVjUwX0FVWENIX0NUUkwoYXV4Y2gtPnJkKSk7CisJbnZfd3IzMihkZXYsIE5WNTBfQVVYQ0hfQ1RSTChhdXhjaC0+cmQpLCB0bXAgJiB+MHgwMDEwMDAwMCk7CisJdG1wID0gbnZfcmQzMihkZXYsIE5WNTBfQVVYQ0hfQ1RSTChhdXhjaC0+cmQpKTsKKwlpZiAodG1wICYgMHgwMTAwMDAwMCkgeworCQlOVl9FUlJPUihkZXYsICJleHBlY3RlZCBiaXQgMjQgPT0gMCwgZ290IDB4JTA4eFxuIiwgdG1wKTsKKwkJcmV0ID0gLUVJTzsKKwl9CisKKwl1ZGVsYXkoNDAwKTsKKworCXJldHVybiByZXQgPyByZXQgOiAoc3RhdCAmIE5WNTBfQVVYQ0hfU1RBVF9SRVBMWSk7Cit9CisKK2ludAorbm91dmVhdV9kcF9pMmNfYXV4X2NoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IG1vZGUsCisJCSAgICAgIHVpbnQ4X3Qgd3JpdGVfYnl0ZSwgdWludDhfdCAqcmVhZF9ieXRlKQoreworCXN0cnVjdCBpMmNfYWxnb19kcF9hdXhfZGF0YSAqYWxnb19kYXRhID0gYWRhcHRlci0+YWxnb19kYXRhOworCXN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICphdXhjaCA9IChzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqKWFkYXB0ZXI7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGF1eGNoLT5kZXY7CisJaW50IHJldCA9IDAsIGNtZCwgYWRkciA9IGFsZ29fZGF0YS0+YWRkcmVzczsKKwl1aW50OF90ICpidWY7CisKKwlpZiAobW9kZSA9PSBNT0RFX0kyQ19SRUFEKSB7CisJCWNtZCA9IEFVWF9JMkNfUkVBRDsKKwkJYnVmID0gcmVhZF9ieXRlOworCX0gZWxzZSB7CisJCWNtZCA9IChtb2RlICYgTU9ERV9JMkNfUkVBRCkgPyBBVVhfSTJDX1JFQUQgOiBBVVhfSTJDX1dSSVRFOworCQlidWYgPSAmd3JpdGVfYnl0ZTsKKwl9CisKKwlpZiAoIShtb2RlICYgTU9ERV9JMkNfU1RPUCkpCisJCWNtZCB8PSBBVVhfSTJDX01PVDsKKworCWlmIChtb2RlICYgTU9ERV9JMkNfU1RBUlQpCisJCXJldHVybiAxOworCisJZm9yICg7OykgeworCQlyZXQgPSBub3V2ZWF1X2RwX2F1eGNoKGF1eGNoLCBjbWQsIGFkZHIsIGJ1ZiwgMSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlzd2l0Y2ggKHJldCAmIE5WNTBfQVVYQ0hfU1RBVF9SRVBMWV9JMkMpIHsKKwkJY2FzZSBOVjUwX0FVWENIX1NUQVRfUkVQTFlfSTJDX0FDSzoKKwkJCXJldHVybiAxOworCQljYXNlIE5WNTBfQVVYQ0hfU1RBVF9SRVBMWV9JMkNfTkFDSzoKKwkJCXJldHVybiAtRVJFTU9URUlPOworCQljYXNlIE5WNTBfQVVYQ0hfU1RBVF9SRVBMWV9JMkNfREVGRVI6CisJCQl1ZGVsYXkoMTAwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJTlZfRVJST1IoZGV2LCAiaW52YWxpZCBhdXhjaCBzdGF0dXM6IDB4JTA4eFxuIiwgcmV0KTsKKwkJCXJldHVybiAtRVJFTU9URUlPOworCQl9CisJfQorfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTI0OWMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcnYuYwpAQCAtMCwwICsxLDQwNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1IFN0ZXBoYW5lIE1hcmNoZXNpbi4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJkcm1fY3J0Y19oZWxwZXIuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfaHcuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2ZiLmgiCisjaW5jbHVkZSAibm91dmVhdV9mYmNvbi5oIgorI2luY2x1ZGUgIm52NTBfZGlzcGxheS5oIgorCisjaW5jbHVkZSAiZHJtX3BjaWlkcy5oIgorCitNT0RVTEVfUEFSTV9ERVNDKG5vYWdwLCAiRGlzYWJsZSBBR1AiKTsKK2ludCBub3V2ZWF1X25vYWdwOworbW9kdWxlX3BhcmFtX25hbWVkKG5vYWdwLCBub3V2ZWF1X25vYWdwLCBpbnQsIDA0MDApOworCitNT0RVTEVfUEFSTV9ERVNDKG1vZGVzZXQsICJFbmFibGUga2VybmVsIG1vZGVzZXR0aW5nIik7CitzdGF0aWMgaW50IG5vdXZlYXVfbW9kZXNldCA9IC0xOyAvKiBrbXMgKi8KK21vZHVsZV9wYXJhbV9uYW1lZChtb2Rlc2V0LCBub3V2ZWF1X21vZGVzZXQsIGludCwgMDQwMCk7CisKK01PRFVMRV9QQVJNX0RFU0ModmJpb3MsICJPdmVycmlkZSBkZWZhdWx0IFZCSU9TIGxvY2F0aW9uIik7CitjaGFyICpub3V2ZWF1X3ZiaW9zOworbW9kdWxlX3BhcmFtX25hbWVkKHZiaW9zLCBub3V2ZWF1X3ZiaW9zLCBjaGFycCwgMDQwMCk7CisKK01PRFVMRV9QQVJNX0RFU0ModnJhbV9wdXNoYnVmLCAiRm9yY2UgRE1BIHB1c2ggYnVmZmVycyB0byBiZSBpbiBWUkFNIik7CitpbnQgbm91dmVhdV92cmFtX3B1c2hidWY7Cittb2R1bGVfcGFyYW1fbmFtZWQodnJhbV9wdXNoYnVmLCBub3V2ZWF1X3ZyYW1fcHVzaGJ1ZiwgaW50LCAwNDAwKTsKKworTU9EVUxFX1BBUk1fREVTQyh2cmFtX25vdGlmeSwgIkZvcmNlIERNQSBub3RpZmllcnMgdG8gYmUgaW4gVlJBTSIpOworaW50IG5vdXZlYXVfdnJhbV9ub3RpZnk7Cittb2R1bGVfcGFyYW1fbmFtZWQodnJhbV9ub3RpZnksIG5vdXZlYXVfdnJhbV9ub3RpZnksIGludCwgMDQwMCk7CisKK01PRFVMRV9QQVJNX0RFU0MoZHVhbGxpbmssICJBbGxvdyBkdWFsLWxpbmsgVE1EUyAoPj1HZUZvcmNlIDgpIik7CitpbnQgbm91dmVhdV9kdWFsbGluayA9IDE7Cittb2R1bGVfcGFyYW1fbmFtZWQoZHVhbGxpbmssIG5vdXZlYXVfZHVhbGxpbmssIGludCwgMDQwMCk7CisKK01PRFVMRV9QQVJNX0RFU0ModXNjcmlwdF9sdmRzLCAiTFZEUyBvdXRwdXQgc2NyaXB0IHRhYmxlIElEICg+PUdlRm9yY2UgOCkiKTsKK2ludCBub3V2ZWF1X3VzY3JpcHRfbHZkcyA9IC0xOworbW9kdWxlX3BhcmFtX25hbWVkKHVzY3JpcHRfbHZkcywgbm91dmVhdV91c2NyaXB0X2x2ZHMsIGludCwgMDQwMCk7CisKK01PRFVMRV9QQVJNX0RFU0ModXNjcmlwdF90bWRzLCAiVE1EUyBvdXRwdXQgc2NyaXB0IHRhYmxlIElEICg+PUdlRm9yY2UgOCkiKTsKK2ludCBub3V2ZWF1X3VzY3JpcHRfdG1kcyA9IC0xOworbW9kdWxlX3BhcmFtX25hbWVkKHVzY3JpcHRfdG1kcywgbm91dmVhdV91c2NyaXB0X3RtZHMsIGludCwgMDQwMCk7CisKK01PRFVMRV9QQVJNX0RFU0ModHZfbm9ybSwgIkRlZmF1bHQgVFYgbm9ybS5cbiIKKwkJICJcdFx0U3VwcG9ydGVkOiBQQUwsIFBBTC1NLCBQQUwtTiwgUEFMLU5jLCBOVFNDLU0sIE5UU0MtSixcbiIKKwkJICJcdFx0XHRoZDQ4MGksIGhkNDgwcCwgaGQ1NzZpLCBoZDU3NnAsIGhkNzIwcCwgaGQxMDgwaS5cbiIKKwkJICJcdFx0RGVmYXVsdDogUEFMXG4iCisJCSAiXHRcdCpOT1RFKiBJZ25vcmVkIGZvciBjYXJkcyB3aXRoIGV4dGVybmFsIFRWIGVuY29kZXJzLiIpOworY2hhciAqbm91dmVhdV90dl9ub3JtOworbW9kdWxlX3BhcmFtX25hbWVkKHR2X25vcm0sIG5vdXZlYXVfdHZfbm9ybSwgY2hhcnAsIDA0MDApOworCitNT0RVTEVfUEFSTV9ERVNDKHJlZ19kZWJ1ZywgIlJlZ2lzdGVyIGFjY2VzcyBkZWJ1ZyBiaXRtYXNrOlxuIgorCQkiXHRcdDB4MSBtYywgMHgyIHZpZGVvLCAweDQgZmIsIDB4OCBleHRkZXYsXG4iCisJCSJcdFx0MHgxMCBjcnRjLCAweDIwIHJhbWRhYywgMHg0MCB2Z2FjcnRjLCAweDgwIHJtdmlvLFxuIgorCQkiXHRcdDB4MTAwIHZnYWF0dHIsIDB4MjAwIEVWTyAoRzgwKykuICIpOworaW50IG5vdXZlYXVfcmVnX2RlYnVnOworbW9kdWxlX3BhcmFtX25hbWVkKHJlZ19kZWJ1Zywgbm91dmVhdV9yZWdfZGVidWcsIGludCwgMDYwMCk7CisKK2ludCBub3V2ZWF1X2ZicGVyY3J0YzsKKyNpZiAwCittb2R1bGVfcGFyYW1fbmFtZWQoZmJwZXJjcnRjLCBub3V2ZWF1X2ZicGVyY3J0YywgaW50LCAwNDAwKTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpaWRsaXN0W10gPSB7CisJeworCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfQU5ZX0lEKSwKKwkJLmNsYXNzID0gUENJX0JBU0VfQ0xBU1NfRElTUExBWSA8PCAxNiwKKwkJLmNsYXNzX21hc2sgID0gMHhmZiA8PCAxNiwKKwl9LAorCXsKKwkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05WSURJQV9TR1MsIFBDSV9BTllfSUQpLAorCQkuY2xhc3MgPSBQQ0lfQkFTRV9DTEFTU19ESVNQTEFZIDw8IDE2LAorCQkuY2xhc3NfbWFzayAgPSAweGZmIDw8IDE2LAorCX0sCisJe30KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwY2lpZGxpc3QpOworCitzdGF0aWMgc3RydWN0IGRybV9kcml2ZXIgZHJpdmVyOworCitzdGF0aWMgaW50IF9fZGV2aW5pdAorbm91dmVhdV9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJcmV0dXJuIGRybV9nZXRfZGV2KHBkZXYsIGVudCwgJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkCitub3V2ZWF1X3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWRybV9wdXRfZGV2KGRldik7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfcGNpX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBwbV9zdGF0ZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfaW5zdG1lbV9lbmdpbmUgKnBpbnN0bWVtID0gJmRldl9wcml2LT5lbmdpbmUuaW5zdG1lbTsKKwlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICpwZ3JhcGggPSAmZGV2X3ByaXYtPmVuZ2luZS5ncmFwaDsKKwlzdHJ1Y3Qgbm91dmVhdV9maWZvX2VuZ2luZSAqcGZpZm8gPSAmZGV2X3ByaXYtPmVuZ2luZS5maWZvOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47CisJc3RydWN0IGRybV9jcnRjICpjcnRjOworCXVpbnQzMl90IGZiZGV2X2ZsYWdzOworCWludCByZXQsIGk7CisKKwlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHBtX3N0YXRlLmV2ZW50ID09IFBNX0VWRU5UX1BSRVRIQVcpCisJCXJldHVybiAwOworCisJZmJkZXZfZmxhZ3MgPSBkZXZfcHJpdi0+ZmJkZXZfaW5mby0+ZmxhZ3M7CisJZGV2X3ByaXYtPmZiZGV2X2luZm8tPmZsYWdzIHw9IEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKKwkJc3RydWN0IG5vdXZlYXVfZnJhbWVidWZmZXIgKm5vdXZlYXVfZmI7CisKKwkJbm91dmVhdV9mYiA9IG5vdXZlYXVfZnJhbWVidWZmZXIoY3J0Yy0+ZmIpOworCQlpZiAoIW5vdXZlYXVfZmIgfHwgIW5vdXZlYXVfZmItPm52Ym8pCisJCQljb250aW51ZTsKKworCQlub3V2ZWF1X2JvX3VucGluKG5vdXZlYXVfZmItPm52Ym8pOworCX0KKworCU5WX0lORk8oZGV2LCAiRXZpY3RpbmcgYnVmZmVycy4uLlxuIik7CisJdHRtX2JvX2V2aWN0X21tKCZkZXZfcHJpdi0+dHRtLmJkZXYsIFRUTV9QTF9WUkFNKTsKKworCU5WX0lORk8oZGV2LCAiSWRsaW5nIGNoYW5uZWxzLi4uXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGZpZm8tPmNoYW5uZWxzOyBpKyspIHsKKwkJc3RydWN0IG5vdXZlYXVfZmVuY2UgKmZlbmNlID0gTlVMTDsKKworCQljaGFuID0gZGV2X3ByaXYtPmZpZm9zW2ldOworCQlpZiAoIWNoYW4gfHwgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTAgJiYKKwkJCSAgICAgIGNoYW4gPT0gZGV2X3ByaXYtPmZpZm9zWzBdKSkKKwkJCWNvbnRpbnVlOworCisJCXJldCA9IG5vdXZlYXVfZmVuY2VfbmV3KGNoYW4sICZmZW5jZSwgdHJ1ZSk7CisJCWlmIChyZXQgPT0gMCkgeworCQkJcmV0ID0gbm91dmVhdV9mZW5jZV93YWl0KGZlbmNlLCBOVUxMLCBmYWxzZSwgZmFsc2UpOworCQkJbm91dmVhdV9mZW5jZV91bnJlZigodm9pZCAqKSZmZW5jZSk7CisJCX0KKworCQlpZiAocmV0KSB7CisJCQlOVl9FUlJPUihkZXYsICJGYWlsZWQgdG8gaWRsZSBjaGFubmVsICVkIGZvciBzdXNwZW5kXG4iLAorCQkJCSBjaGFuLT5pZCk7CisJCX0KKwl9CisKKwlwZ3JhcGgtPmZpZm9fYWNjZXNzKGRldiwgZmFsc2UpOworCW5vdXZlYXVfd2FpdF9mb3JfaWRsZShkZXYpOworCXBmaWZvLT5yZWFzc2lnbihkZXYsIGZhbHNlKTsKKwlwZmlmby0+ZGlzYWJsZShkZXYpOworCXBmaWZvLT51bmxvYWRfY29udGV4dChkZXYpOworCXBncmFwaC0+dW5sb2FkX2NvbnRleHQoZGV2KTsKKworCU5WX0lORk8oZGV2LCAiU3VzcGVuZGluZyBHUFUgb2JqZWN0cy4uLlxuIik7CisJcmV0ID0gbm91dmVhdV9ncHVvYmpfc3VzcGVuZChkZXYpOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiLi4uIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0X2Fib3J0OworCX0KKworCXJldCA9IHBpbnN0bWVtLT5zdXNwZW5kKGRldik7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICIuLi4gZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJbm91dmVhdV9ncHVvYmpfc3VzcGVuZF9jbGVhbnVwKGRldik7CisJCWdvdG8gb3V0X2Fib3J0OworCX0KKworCU5WX0lORk8oZGV2LCAiQW5kIHdlJ3JlIGdvbmUhXG4iKTsKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlpZiAocG1fc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfU1VTUEVORCkgeworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QzaG90KTsKKwl9CisKKwlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisJZmJfc2V0X3N1c3BlbmQoZGV2X3ByaXYtPmZiZGV2X2luZm8sIDEpOworCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKwlkZXZfcHJpdi0+ZmJkZXZfaW5mby0+ZmxhZ3MgPSBmYmRldl9mbGFnczsKKwlyZXR1cm4gMDsKKworb3V0X2Fib3J0OgorCU5WX0lORk8oZGV2LCAiUmUtZW5hYmxpbmcgYWNjZWxlcmF0aW9uLi5cbiIpOworCXBmaWZvLT5lbmFibGUoZGV2KTsKKwlwZmlmby0+cmVhc3NpZ24oZGV2LCB0cnVlKTsKKwlwZ3JhcGgtPmZpZm9fYWNjZXNzKGRldiwgdHJ1ZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorbm91dmVhdV9wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmdpbmUgKmVuZ2luZSA9ICZkZXZfcHJpdi0+ZW5naW5lOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKKwl1aW50MzJfdCBmYmRldl9mbGFnczsKKwlpbnQgcmV0LCBpOworCisJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWZiZGV2X2ZsYWdzID0gZGV2X3ByaXYtPmZiZGV2X2luZm8tPmZsYWdzOworCWRldl9wcml2LT5mYmRldl9pbmZvLT5mbGFncyB8PSBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRDsKKworCU5WX0lORk8oZGV2LCAiV2UncmUgYmFjaywgZW5hYmxpbmcgZGV2aWNlLi4uXG4iKTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlyZXR1cm4gLTE7CisJcGNpX3NldF9tYXN0ZXIoZGV2LT5wZGV2KTsKKworCU5WX0lORk8oZGV2LCAiUE9TVGluZyBkZXZpY2UuLi5cbiIpOworCXJldCA9IG5vdXZlYXVfcnVuX3ZiaW9zX2luaXQoZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGRldl9wcml2LT5nYXJ0X2luZm8udHlwZSA9PSBOT1VWRUFVX0dBUlRfQUdQKSB7CisJCXJldCA9IG5vdXZlYXVfbWVtX2luaXRfYWdwKGRldik7CisJCWlmIChyZXQpIHsKKwkJCU5WX0VSUk9SKGRldiwgImVycm9yIHJlaW5pdGlhbGlzaW5nIEFHUDogJWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJTlZfSU5GTyhkZXYsICJSZWluaXRpYWxpc2luZyBlbmdpbmVzLi4uXG4iKTsKKwllbmdpbmUtPmluc3RtZW0ucmVzdW1lKGRldik7CisJZW5naW5lLT5tYy5pbml0KGRldik7CisJZW5naW5lLT50aW1lci5pbml0KGRldik7CisJZW5naW5lLT5mYi5pbml0KGRldik7CisJZW5naW5lLT5ncmFwaC5pbml0KGRldik7CisJZW5naW5lLT5maWZvLmluaXQoZGV2KTsKKworCU5WX0lORk8oZGV2LCAiUmVzdG9yaW5nIEdQVSBvYmplY3RzLi4uXG4iKTsKKwlub3V2ZWF1X2dwdW9ial9yZXN1bWUoZGV2KTsKKworCW5vdXZlYXVfaXJxX3Bvc3RpbnN0YWxsKGRldik7CisKKwkvKiBSZS13cml0ZSBTS0lQUywgdGhleSdsbCBoYXZlIGJlZW4gbG9zdCBvdmVyIHRoZSBzdXNwZW5kICovCisJaWYgKG5vdXZlYXVfdnJhbV9wdXNoYnVmKSB7CisJCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47CisJCWludCBqOworCisJCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHM7IGkrKykgeworCQkJY2hhbiA9IGRldl9wcml2LT5maWZvc1tpXTsKKwkJCWlmICghY2hhbikKKwkJCQljb250aW51ZTsKKworCQkJZm9yIChqID0gMDsgaiA8IE5PVVZFQVVfRE1BX1NLSVBTOyBqKyspCisJCQkJbm91dmVhdV9ib193cjMyKGNoYW4tPnB1c2hidWZfYm8sIGksIDApOworCQl9CisJfQorCisJTlZfSU5GTyhkZXYsICJSZXN0b3JpbmcgbW9kZS4uLlxuIik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKKwkJc3RydWN0IG5vdXZlYXVfZnJhbWVidWZmZXIgKm5vdXZlYXVfZmI7CisKKwkJbm91dmVhdV9mYiA9IG5vdXZlYXVfZnJhbWVidWZmZXIoY3J0Yy0+ZmIpOworCQlpZiAoIW5vdXZlYXVfZmIgfHwgIW5vdXZlYXVfZmItPm52Ym8pCisJCQljb250aW51ZTsKKworCQlub3V2ZWF1X2JvX3Bpbihub3V2ZWF1X2ZiLT5udmJvLCBUVE1fUExfRkxBR19WUkFNKTsKKwl9CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7CisJCW52MDRfZGlzcGxheV9yZXN0b3JlKGRldik7CisJCU5WTG9ja1ZnYUNydGNzKGRldiwgZmFsc2UpOworCX0gZWxzZQorCQludjUwX2Rpc3BsYXlfaW5pdChkZXYpOworCisJLyogRm9yY2UgQ0xVVCB0byBnZXQgcmUtbG9hZGVkIGR1cmluZyBtb2Rlc2V0ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKKwkJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhjcnRjKTsKKworCQludl9jcnRjLT5sdXQuZGVwdGggPSAwOworCX0KKworCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKwlmYl9zZXRfc3VzcGVuZChkZXZfcHJpdi0+ZmJkZXZfaW5mbywgMCk7CisJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCisJbm91dmVhdV9mYmNvbl96ZmlsbChkZXYpOworCisJZHJtX2hlbHBlcl9yZXN1bWVfZm9yY2VfbW9kZShkZXYpOworCWRldl9wcml2LT5mYmRldl9pbmZvLT5mbGFncyA9IGZiZGV2X2ZsYWdzOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRybV9kcml2ZXIgZHJpdmVyID0geworCS5kcml2ZXJfZmVhdHVyZXMgPQorCQlEUklWRVJfVVNFX0FHUCB8IERSSVZFUl9QQ0lfRE1BIHwgRFJJVkVSX1NHIHwKKwkJRFJJVkVSX0hBVkVfSVJRIHwgRFJJVkVSX0lSUV9TSEFSRUQgfCBEUklWRVJfR0VNLAorCS5sb2FkID0gbm91dmVhdV9sb2FkLAorCS5maXJzdG9wZW4gPSBub3V2ZWF1X2ZpcnN0b3BlbiwKKwkubGFzdGNsb3NlID0gbm91dmVhdV9sYXN0Y2xvc2UsCisJLnVubG9hZCA9IG5vdXZlYXVfdW5sb2FkLAorCS5wcmVjbG9zZSA9IG5vdXZlYXVfcHJlY2xvc2UsCisjaWYgZGVmaW5lZChDT05GSUdfRFJNX05PVVZFQVVfREVCVUcpCisJLmRlYnVnZnNfaW5pdCA9IG5vdXZlYXVfZGVidWdmc19pbml0LAorCS5kZWJ1Z2ZzX2NsZWFudXAgPSBub3V2ZWF1X2RlYnVnZnNfdGFrZWRvd24sCisjZW5kaWYKKwkuaXJxX3ByZWluc3RhbGwgPSBub3V2ZWF1X2lycV9wcmVpbnN0YWxsLAorCS5pcnFfcG9zdGluc3RhbGwgPSBub3V2ZWF1X2lycV9wb3N0aW5zdGFsbCwKKwkuaXJxX3VuaW5zdGFsbCA9IG5vdXZlYXVfaXJxX3VuaW5zdGFsbCwKKwkuaXJxX2hhbmRsZXIgPSBub3V2ZWF1X2lycV9oYW5kbGVyLAorCS5yZWNsYWltX2J1ZmZlcnMgPSBkcm1fY29yZV9yZWNsYWltX2J1ZmZlcnMsCisJLmdldF9tYXBfb2ZzID0gZHJtX2NvcmVfZ2V0X21hcF9vZnMsCisJLmdldF9yZWdfb2ZzID0gZHJtX2NvcmVfZ2V0X3JlZ19vZnMsCisJLmlvY3RscyA9IG5vdXZlYXVfaW9jdGxzLAorCS5mb3BzID0geworCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9wZW4gPSBkcm1fb3BlbiwKKwkJLnJlbGVhc2UgPSBkcm1fcmVsZWFzZSwKKwkJLmlvY3RsID0gZHJtX2lvY3RsLAorCQkubW1hcCA9IG5vdXZlYXVfdHRtX21tYXAsCisJCS5wb2xsID0gZHJtX3BvbGwsCisJCS5mYXN5bmMgPSBkcm1fZmFzeW5jLAorI2lmIGRlZmluZWQoQ09ORklHX0NPTVBBVCkKKwkJLmNvbXBhdF9pb2N0bCA9IG5vdXZlYXVfY29tcGF0X2lvY3RsLAorI2VuZGlmCisJfSwKKwkucGNpX2RyaXZlciA9IHsKKwkJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkJLmlkX3RhYmxlID0gcGNpaWRsaXN0LAorCQkucHJvYmUgPSBub3V2ZWF1X3BjaV9wcm9iZSwKKwkJLnJlbW92ZSA9IG5vdXZlYXVfcGNpX3JlbW92ZSwKKwkJLnN1c3BlbmQgPSBub3V2ZWF1X3BjaV9zdXNwZW5kLAorCQkucmVzdW1lID0gbm91dmVhdV9wY2lfcmVzdW1lCisJfSwKKworCS5nZW1faW5pdF9vYmplY3QgPSBub3V2ZWF1X2dlbV9vYmplY3RfbmV3LAorCS5nZW1fZnJlZV9vYmplY3QgPSBub3V2ZWF1X2dlbV9vYmplY3RfZGVsLAorCisJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkuZGVzYyA9IERSSVZFUl9ERVNDLAorI2lmZGVmIEdJVF9SRVZJU0lPTgorCS5kYXRlID0gR0lUX1JFVklTSU9OLAorI2Vsc2UKKwkuZGF0ZSA9IERSSVZFUl9EQVRFLAorI2VuZGlmCisJLm1ham9yID0gRFJJVkVSX01BSk9SLAorCS5taW5vciA9IERSSVZFUl9NSU5PUiwKKwkucGF0Y2hsZXZlbCA9IERSSVZFUl9QQVRDSExFVkVMLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbm91dmVhdV9pbml0KHZvaWQpCit7CisJZHJpdmVyLm51bV9pb2N0bHMgPSBub3V2ZWF1X21heF9pb2N0bDsKKworCWlmIChub3V2ZWF1X21vZGVzZXQgPT0gLTEpIHsKKyNpZmRlZiBDT05GSUdfVkdBX0NPTlNPTEUKKwkJaWYgKHZnYWNvbl90ZXh0X2ZvcmNlKCkpCisJCQlub3V2ZWF1X21vZGVzZXQgPSAwOworCQllbHNlCisjZW5kaWYKKwkJCW5vdXZlYXVfbW9kZXNldCA9IDE7CisJfQorCisJaWYgKG5vdXZlYXVfbW9kZXNldCA9PSAxKQorCQlkcml2ZXIuZHJpdmVyX2ZlYXR1cmVzIHw9IERSSVZFUl9NT0RFU0VUOworCisJcmV0dXJuIGRybV9pbml0KCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbm91dmVhdV9leGl0KHZvaWQpCit7CisJZHJtX2V4aXQoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG5vdXZlYXVfaW5pdCk7Cittb2R1bGVfZXhpdChub3V2ZWF1X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGI0YzdiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcnYuaApAQCAtMCwwICsxLDEyODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNSBTdGVwaGFuZSBNYXJjaGVzaW4uCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19OT1VWRUFVX0RSVl9IX18KKyNkZWZpbmUgX19OT1VWRUFVX0RSVl9IX18KKworI2RlZmluZSBEUklWRVJfQVVUSE9SCQkiU3RlcGhhbmUgTWFyY2hlc2luIgorI2RlZmluZSBEUklWRVJfRU1BSUwJCSJkcmktZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0IgorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkibm91dmVhdSIKKyNkZWZpbmUgRFJJVkVSX0RFU0MJCSJuVmlkaWEgUml2YS9UTlQvR2VGb3JjZSIKKyNkZWZpbmUgRFJJVkVSX0RBVEUJCSIyMDA5MDQyMCIKKworI2RlZmluZSBEUklWRVJfTUFKT1IJCTAKKyNkZWZpbmUgRFJJVkVSX01JTk9SCQkwCisjZGVmaW5lIERSSVZFUl9QQVRDSExFVkVMCTE1CisKKyNkZWZpbmUgTk9VVkVBVV9GQU1JTFkgICAweDAwMDBGRkZGCisjZGVmaW5lIE5PVVZFQVVfRkxBR1MgICAgMHhGRkZGMDAwMAorCisjaW5jbHVkZSAidHRtL3R0bV9ib19hcGkuaCIKKyNpbmNsdWRlICJ0dG0vdHRtX2JvX2RyaXZlci5oIgorI2luY2x1ZGUgInR0bS90dG1fcGxhY2VtZW50LmgiCisjaW5jbHVkZSAidHRtL3R0bV9tZW1vcnkuaCIKKyNpbmNsdWRlICJ0dG0vdHRtX21vZHVsZS5oIgorCitzdHJ1Y3Qgbm91dmVhdV9mcHJpdiB7CisJc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGU7Cit9OworCisjZGVmaW5lIERSTV9GSUxFX1BBR0VfT0ZGU0VUICgweDEwMDAwMDAwMFVMTCA+PiBQQUdFX1NISUZUKQorCisjaW5jbHVkZSAibm91dmVhdV9kcm0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X3JlZy5oIgorI2luY2x1ZGUgIm5vdXZlYXVfYmlvcy5oIgorCisjZGVmaW5lIE1BWF9OVU1fRENCX0VOVFJJRVMgMTYKKworI2RlZmluZSBOT1VWRUFVX01BWF9DSEFOTkVMX05SIDEyOAorCisjZGVmaW5lIE5WNTBfVk1fTUFYX1ZSQU0gKDIqMTAyNCoxMDI0KjEwMjRVTEwpCisjZGVmaW5lIE5WNTBfVk1fQkxPQ0sgICAgKDUxMioxMDI0KjEwMjRVTEwpCisjZGVmaW5lIE5WNTBfVk1fVlJBTV9OUiAgKE5WNTBfVk1fTUFYX1ZSQU0gLyBOVjUwX1ZNX0JMT0NLKQorCitzdHJ1Y3Qgbm91dmVhdV9ibyB7CisJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0IGJvOworCXN0cnVjdCB0dG1fcGxhY2VtZW50IHBsYWNlbWVudDsKKwl1MzIgcGxhY2VtZW50c1szXTsKKwlzdHJ1Y3QgdHRtX2JvX2ttYXBfb2JqIGttYXA7CisJc3RydWN0IGxpc3RfaGVhZCBoZWFkOworCisJLyogcHJvdGVjdGVkIGJ5IHR0bV9ib19yZXNlcnZlKCkgKi8KKwlzdHJ1Y3QgZHJtX2ZpbGUgKnJlc2VydmVkX2J5OworCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CisJaW50IHBiYm9faW5kZXg7CisKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFubmVsOworCisJYm9vbCBtYXBwYWJsZTsKKwlib29sIG5vX3ZtOworCisJdWludDMyX3QgdGlsZV9tb2RlOworCXVpbnQzMl90IHRpbGVfZmxhZ3M7CisKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmdlbTsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKmNwdV9maWxwOworCWludCBwaW5fcmVmY250OworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgbm91dmVhdV9ibyAqCitub3V2ZWF1X2JvKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihibywgc3RydWN0IG5vdXZlYXVfYm8sIGJvKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgbm91dmVhdV9ibyAqCitub3V2ZWF1X2dlbV9vYmplY3Qoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpnZW0pCit7CisJcmV0dXJuIGdlbSA/IGdlbS0+ZHJpdmVyX3ByaXZhdGUgOiBOVUxMOworfQorCisvKiBUT0RPOiBzdWJtaXQgZXF1aXZhbGVudCB0byBUVE0gZ2VuZXJpYyBBUEkgdXBzdHJlYW0/ICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqCitudmJvX2ttYXBfb2JqX2lvdmlydHVhbChzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibykKK3sKKwlib29sIGlzX2lvbWVtOworCXZvaWQgX19pb21lbSAqaW9wdHIgPSAodm9pZCBfX2ZvcmNlIF9faW9tZW0gKil0dG1fa21hcF9vYmpfdmlydHVhbCgKKwkJCQkJCSZudmJvLT5rbWFwLCAmaXNfaW9tZW0pOworCVdBUk5fT05fT05DRShpb3B0ciAmJiAhaXNfaW9tZW0pOworCXJldHVybiBpb3B0cjsKK30KKworc3RydWN0IG1lbV9ibG9jayB7CisJc3RydWN0IG1lbV9ibG9jayAqbmV4dDsKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpwcmV2OworCXVpbnQ2NF90IHN0YXJ0OworCXVpbnQ2NF90IHNpemU7CisJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXY7IC8qIE5VTEw6IGZyZWUsIC0xOiBoZWFwLCBvdGhlcjogcmVhbCBmaWxlcyAqLworfTsKKworZW51bSBub3V2ZWF1X2ZsYWdzIHsKKwlOVl9ORk9SQ0UgICA9IDB4MTAwMDAwMDAsCisJTlZfTkZPUkNFMiAgPSAweDIwMDAwMDAwCit9OworCisjZGVmaW5lIE5WT0JKX0VOR0lORV9TVwkJMAorI2RlZmluZSBOVk9CSl9FTkdJTkVfR1IJCTEKKyNkZWZpbmUgTlZPQkpfRU5HSU5FX0RJU1BMQVkJMgorI2RlZmluZSBOVk9CSl9FTkdJTkVfSU5UCTB4ZGVhZGJlZWYKKworI2RlZmluZSBOVk9CSl9GTEFHX0FMTE9XX05PX1JFRlMJKDEgPDwgMCkKKyNkZWZpbmUgTlZPQkpfRkxBR19aRVJPX0FMTE9DCQkoMSA8PCAxKQorI2RlZmluZSBOVk9CSl9GTEFHX1pFUk9fRlJFRQkJKDEgPDwgMikKKyNkZWZpbmUgTlZPQkpfRkxBR19GQUtFCQkJKDEgPDwgMykKK3N0cnVjdCBub3V2ZWF1X2dwdW9iaiB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqaW1fY2hhbm5lbDsKKwlzdHJ1Y3QgbWVtX2Jsb2NrICppbV9wcmFtaW47CisJc3RydWN0IG5vdXZlYXVfYm8gKmltX2JhY2tpbmc7CisJdWludDMyX3QgaW1fYmFja2luZ19zdGFydDsKKwl1aW50MzJfdCAqaW1fYmFja2luZ19zdXNwZW5kOworCWludCBpbV9ib3VuZDsKKworCXVpbnQzMl90IGZsYWdzOworCWludCByZWZjb3VudDsKKworCXVpbnQzMl90IGVuZ2luZTsKKwl1aW50MzJfdCBjbGFzczsKKworCXZvaWQgKCpkdG9yKShzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKik7CisJdm9pZCAqcHJpdjsKK307CisKK3N0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqOworCXVpbnQzMl90IGluc3RhbmNlOworCisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbm5lbDsKKwlpbnQgaGFuZGxlOworfTsKKworc3RydWN0IG5vdXZlYXVfY2hhbm5lbCB7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKKwlpbnQgaWQ7CisKKwkvKiBvd25lciBvZiB0aGlzIGZpZm8gKi8KKwlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdjsKKwkvKiBtYXBwaW5nIG9mIHRoZSBmaWZvIGl0c2VsZiAqLworCXN0cnVjdCBkcm1fbG9jYWxfbWFwICptYXA7CisKKwkvKiBtYXBwaW5nIG9mIHRoZSByZWdzIGNvbnRyb2xpbmcgdGhlIGZpZm8gKi8KKwl2b2lkIF9faW9tZW0gKnVzZXI7CisJdWludDMyX3QgdXNlcl9nZXQ7CisJdWludDMyX3QgdXNlcl9wdXQ7CisKKwkvKiBGZW5jaW5nICovCisJc3RydWN0IHsKKwkJLyogbG9jayBwcm90ZWN0cyB0aGUgcGVuZGluZyBsaXN0IG9ubHkgKi8KKwkJc3BpbmxvY2tfdCBsb2NrOworCQlzdHJ1Y3QgbGlzdF9oZWFkIHBlbmRpbmc7CisJCXVpbnQzMl90IHNlcXVlbmNlOworCQl1aW50MzJfdCBzZXF1ZW5jZV9hY2s7CisJCXVpbnQzMl90IGxhc3Rfc2VxdWVuY2VfaXJxOworCX0gZmVuY2U7CisKKwkvKiBETUEgcHVzaCBidWZmZXIgKi8KKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfcmVmICpwdXNoYnVmOworCXN0cnVjdCBub3V2ZWF1X2JvICAgICAgICAgKnB1c2hidWZfYm87CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgcHVzaGJ1Zl9iYXNlOworCisJLyogTm90aWZpZXIgbWVtb3J5ICovCisJc3RydWN0IG5vdXZlYXVfYm8gKm5vdGlmaWVyX2JvOworCXN0cnVjdCBtZW1fYmxvY2sgKm5vdGlmaWVyX2hlYXA7CisKKwkvKiBQRklGTyBjb250ZXh0ICovCisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiAqcmFtZmM7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiAqY2FjaGU7CisKKwkvKiBQR1JBUEggY29udGV4dCAqLworCS8qIFhYWCBtYXkgYmUgbWVyZ2UgMiBwb2ludGVycyBhcyBwcml2YXRlIGRhdGEgPz8/ICovCisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiAqcmFtaW5fZ3JjdHg7CisJdm9pZCAqcGdyYXBoX2N0eDsKKworCS8qIE5WNTAgVk0gKi8KKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogICAgICp2bV9wZDsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfcmVmICp2bV9nYXJ0X3B0OworCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYgKnZtX3ZyYW1fcHRbTlY1MF9WTV9WUkFNX05SXTsKKworCS8qIE9iamVjdHMgKi8KKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfcmVmICpyYW1pbjsgLyogUHJpdmF0ZSBpbnN0bWVtICovCisJc3RydWN0IG1lbV9ibG9jayAgICAgICAgICAqcmFtaW5faGVhcDsgLyogUHJpdmF0ZSBQUkFNSU4gaGVhcCAqLworCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYgKnJhbWh0OyAvKiBIYXNoIHRhYmxlICovCisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICAgcmFtaHRfcmVmczsgLyogT2JqZWN0cyByZWZlcmVuY2VkIGJ5IFJBTUhUICovCisKKwkvKiBHUFUgb2JqZWN0IGluZm8gZm9yIHN0dWZmIHVzZWQgaW4ta2VybmVsIChtbV9lbmFibGVkKSAqLworCXVpbnQzMl90IG0ybWZfbnRmeTsKKwl1aW50MzJfdCB2cmFtX2hhbmRsZTsKKwl1aW50MzJfdCBnYXJ0X2hhbmRsZTsKKwlib29sIGFjY2VsX2RvbmU7CisKKwkvKiBQdXNoIGJ1ZmZlciBzdGF0ZSAob25seSBmb3IgZHJtJ3MgY2hhbm5lbCBvbiAhbW1fZW5hYmxlZCkgKi8KKwlzdHJ1Y3QgeworCQlpbnQgbWF4OworCQlpbnQgZnJlZTsKKwkJaW50IGN1cjsKKwkJaW50IHB1dDsKKwkJLyogYWNjZXNzIHZpYSBwdXNoYnVmX2JvICovCisJfSBkbWE7CisKKwl1aW50MzJfdCBzd19zdWJjaGFubmVsWzhdOworCisJc3RydWN0IHsKKwkJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICp2YmxzZW07CisJCXVpbnQzMl90IHZibHNlbV9vZmZzZXQ7CisJCXVpbnQzMl90IHZibHNlbV9ydmFsOworCQlzdHJ1Y3QgbGlzdF9oZWFkIHZibF93YWl0OworCX0gbnZzdzsKKworCXN0cnVjdCB7CisJCWJvb2wgYWN0aXZlOworCQljaGFyIG5hbWVbMzJdOworCQlzdHJ1Y3QgZHJtX2luZm9fbGlzdCBpbmZvOworCX0gZGVidWdmczsKK307CisKK3N0cnVjdCBub3V2ZWF1X2luc3RtZW1fZW5naW5lIHsKKwl2b2lkCSpwcml2OworCisJaW50CSgqaW5pdCkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisJdm9pZAkoKnRha2Vkb3duKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKwlpbnQJKCpzdXNwZW5kKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKwl2b2lkCSgqcmVzdW1lKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKworCWludAkoKnBvcHVsYXRlKShzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKiwKKwkJCSAgICB1aW50MzJfdCAqc2l6ZSk7CisJdm9pZAkoKmNsZWFyKShzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKik7CisJaW50CSgqYmluZCkoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICopOworCWludAkoKnVuYmluZCkoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICopOworCXZvaWQJKCpwcmVwYXJlX2FjY2Vzcykoc3RydWN0IGRybV9kZXZpY2UgKiwgYm9vbCB3cml0ZSk7CisJdm9pZAkoKmZpbmlzaF9hY2Nlc3MpKHN0cnVjdCBkcm1fZGV2aWNlICopOworfTsKKworc3RydWN0IG5vdXZlYXVfbWNfZW5naW5lIHsKKwlpbnQgICgqaW5pdCkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisJdm9pZCAoKnRha2Vkb3duKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK307CisKK3N0cnVjdCBub3V2ZWF1X3RpbWVyX2VuZ2luZSB7CisJaW50ICAgICAgKCppbml0KShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKwl2b2lkICAgICAoKnRha2Vkb3duKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKwl1aW50NjRfdCAoKnJlYWQpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworfTsKKworc3RydWN0IG5vdXZlYXVfZmJfZW5naW5lIHsKKwlpbnQgICgqaW5pdCkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisJdm9pZCAoKnRha2Vkb3duKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK307CisKK3N0cnVjdCBub3V2ZWF1X2ZpZm9fZW5naW5lIHsKKwl2b2lkICpwcml2OworCisJaW50ICBjaGFubmVsczsKKworCWludCAgKCppbml0KShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKwl2b2lkICgqdGFrZWRvd24pKHN0cnVjdCBkcm1fZGV2aWNlICopOworCisJdm9pZCAoKmRpc2FibGUpKHN0cnVjdCBkcm1fZGV2aWNlICopOworCXZvaWQgKCplbmFibGUpKHN0cnVjdCBkcm1fZGV2aWNlICopOworCWJvb2wgKCpyZWFzc2lnbikoc3RydWN0IGRybV9kZXZpY2UgKiwgYm9vbCBlbmFibGUpOworCisJaW50ICAoKmNoYW5uZWxfaWQpKHN0cnVjdCBkcm1fZGV2aWNlICopOworCisJaW50ICAoKmNyZWF0ZV9jb250ZXh0KShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworCXZvaWQgKCpkZXN0cm95X2NvbnRleHQpKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CisJaW50ICAoKmxvYWRfY29udGV4dCkoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKKwlpbnQgICgqdW5sb2FkX2NvbnRleHQpKHN0cnVjdCBkcm1fZGV2aWNlICopOworfTsKKworc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9tZXRob2QgeworCWludCBpZDsKKwlpbnQgKCpleGVjKShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgZ3JjbGFzcywgaW50IG10aGQsCisJCSAgICAgIHVpbnQzMl90IGRhdGEpOworfTsKKworc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9jbGFzcyB7CisJaW50IGlkOworCWJvb2wgc29mdHdhcmU7CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9tZXRob2QgKm1ldGhvZHM7Cit9OworCitzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lIHsKKwlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X2NsYXNzICpncmNsYXNzOworCWJvb2wgYWNjZWxfYmxvY2tlZDsKKwl2b2lkICpjdHhwcm9nOworCXZvaWQgKmN0eHZhbHM7CisKKwlpbnQgICgqaW5pdCkoc3RydWN0IGRybV9kZXZpY2UgKik7CisJdm9pZCAoKnRha2Vkb3duKShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKworCXZvaWQgKCpmaWZvX2FjY2Vzcykoc3RydWN0IGRybV9kZXZpY2UgKiwgYm9vbCk7CisKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICooKmNoYW5uZWwpKHN0cnVjdCBkcm1fZGV2aWNlICopOworCWludCAgKCpjcmVhdGVfY29udGV4dCkoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKKwl2b2lkICgqZGVzdHJveV9jb250ZXh0KShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworCWludCAgKCpsb2FkX2NvbnRleHQpKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CisJaW50ICAoKnVubG9hZF9jb250ZXh0KShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK307CisKK3N0cnVjdCBub3V2ZWF1X2VuZ2luZSB7CisJc3RydWN0IG5vdXZlYXVfaW5zdG1lbV9lbmdpbmUgaW5zdG1lbTsKKwlzdHJ1Y3Qgbm91dmVhdV9tY19lbmdpbmUgICAgICBtYzsKKwlzdHJ1Y3Qgbm91dmVhdV90aW1lcl9lbmdpbmUgICB0aW1lcjsKKwlzdHJ1Y3Qgbm91dmVhdV9mYl9lbmdpbmUgICAgICBmYjsKKwlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICBncmFwaDsKKwlzdHJ1Y3Qgbm91dmVhdV9maWZvX2VuZ2luZSAgICBmaWZvOworfTsKKworc3RydWN0IG5vdXZlYXVfcGxsX3ZhbHMgeworCXVuaW9uIHsKKwkJc3RydWN0IHsKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkJCXVpbnQ4X3QgTjEsIE0xLCBOMiwgTTI7CisjZWxzZQorCQkJdWludDhfdCBNMSwgTjEsIE0yLCBOMjsKKyNlbmRpZgorCQl9OworCQlzdHJ1Y3QgeworCQkJdWludDE2X3QgTk0xLCBOTTI7CisJCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisJfTsKKwlpbnQgbG9nMlA7CisKKwlpbnQgcmVmY2xrOworfTsKKworZW51bSBudjA0X2ZwX2Rpc3BsYXlfcmVncyB7CisJRlBfRElTUExBWV9FTkQsCisJRlBfVE9UQUwsCisJRlBfQ1JUQywKKwlGUF9TWU5DX1NUQVJULAorCUZQX1NZTkNfRU5ELAorCUZQX1ZBTElEX1NUQVJULAorCUZQX1ZBTElEX0VORAorfTsKKworc3RydWN0IG52MDRfY3J0Y19yZWcgeworCXVuc2lnbmVkIGNoYXIgTWlzY091dFJlZzsgICAgIC8qICovCisJdWludDhfdCBDUlRDWzB4OWZdOworCXVpbnQ4X3QgQ1I1OFsweDEwXTsKKwl1aW50OF90IFNlcXVlbmNlcls1XTsKKwl1aW50OF90IEdyYXBoaWNzWzldOworCXVpbnQ4X3QgQXR0cmlidXRlWzIxXTsKKwl1bnNpZ25lZCBjaGFyIERBQ1s3NjhdOyAgICAgICAvKiBJbnRlcm5hbCBDb2xvcmxvb2t1cHRhYmxlICovCisKKwkvKiBQQ1JUQyByZWdzICovCisJdWludDMyX3QgZmJfc3RhcnQ7CisJdWludDMyX3QgY3J0Y19jZmc7CisJdWludDMyX3QgY3Vyc29yX2NmZzsKKwl1aW50MzJfdCBncGlvX2V4dDsKKwl1aW50MzJfdCBjcnRjXzgzMDsKKwl1aW50MzJfdCBjcnRjXzgzNDsKKwl1aW50MzJfdCBjcnRjXzg1MDsKKwl1aW50MzJfdCBjcnRjX2VuZ19jdHJsOworCisJLyogUFJBTURBQyByZWdzICovCisJdWludDMyX3QgbnYxMF9jdXJzeW5jOworCXN0cnVjdCBub3V2ZWF1X3BsbF92YWxzIHBsbHZhbHM7CisJdWludDMyX3QgcmFtZGFjX2dlbl9jdHJsOworCXVpbnQzMl90IHJhbWRhY182MzA7CisJdWludDMyX3QgcmFtZGFjXzYzNDsKKwl1aW50MzJfdCB0dl9zZXR1cDsKKwl1aW50MzJfdCB0dl92dG90YWw7CisJdWludDMyX3QgdHZfdnNrZXc7CisJdWludDMyX3QgdHZfdnN5bmNfZGVsYXk7CisJdWludDMyX3QgdHZfaHRvdGFsOworCXVpbnQzMl90IHR2X2hza2V3OworCXVpbnQzMl90IHR2X2hzeW5jX2RlbGF5OworCXVpbnQzMl90IHR2X2hzeW5jX2RlbGF5MjsKKwl1aW50MzJfdCBmcF9ob3Jpel9yZWdzWzddOworCXVpbnQzMl90IGZwX3ZlcnRfcmVnc1s3XTsKKwl1aW50MzJfdCBkaXRoZXI7CisJdWludDMyX3QgZnBfY29udHJvbDsKKwl1aW50MzJfdCBkaXRoZXJfcmVnc1s2XTsKKwl1aW50MzJfdCBmcF9kZWJ1Z18wOworCXVpbnQzMl90IGZwX2RlYnVnXzE7CisJdWludDMyX3QgZnBfZGVidWdfMjsKKwl1aW50MzJfdCBmcF9tYXJnaW5fY29sb3I7CisJdWludDMyX3QgcmFtZGFjXzhjMDsKKwl1aW50MzJfdCByYW1kYWNfYTIwOworCXVpbnQzMl90IHJhbWRhY19hMjQ7CisJdWludDMyX3QgcmFtZGFjX2EzNDsKKwl1aW50MzJfdCBjdHZfcmVnc1szOF07Cit9OworCitzdHJ1Y3QgbnYwNF9vdXRwdXRfcmVnIHsKKwl1aW50MzJfdCBvdXRwdXQ7CisJaW50IGhlYWQ7Cit9OworCitzdHJ1Y3QgbnYwNF9tb2RlX3N0YXRlIHsKKwl1aW50MzJfdCBicHA7CisJdWludDMyX3Qgd2lkdGg7CisJdWludDMyX3QgaGVpZ2h0OworCXVpbnQzMl90IGludGVybGFjZTsKKwl1aW50MzJfdCByZXBhaW50MDsKKwl1aW50MzJfdCByZXBhaW50MTsKKwl1aW50MzJfdCBzY3JlZW47CisJdWludDMyX3Qgc2NhbGU7CisJdWludDMyX3QgZGl0aGVyOworCXVpbnQzMl90IGV4dHJhOworCXVpbnQzMl90IGZpZm87CisJdWludDMyX3QgcGl4ZWw7CisJdWludDMyX3QgaG9yaXo7CisJaW50IGFyYml0cmF0aW9uMDsKKwlpbnQgYXJiaXRyYXRpb24xOworCXVpbnQzMl90IHBsbDsKKwl1aW50MzJfdCBwbGxCOworCXVpbnQzMl90IHZwbGw7CisJdWludDMyX3QgdnBsbDI7CisJdWludDMyX3QgdnBsbEI7CisJdWludDMyX3QgdnBsbDJCOworCXVpbnQzMl90IHBsbHNlbDsKKwl1aW50MzJfdCBzZWxfY2xrOworCXVpbnQzMl90IGdlbmVyYWw7CisJdWludDMyX3QgY3J0Y093bmVyOworCXVpbnQzMl90IGhlYWQ7CisJdWludDMyX3QgaGVhZDI7CisJdWludDMyX3QgY3Vyc29yQ29uZmlnOworCXVpbnQzMl90IGN1cnNvcjA7CisJdWludDMyX3QgY3Vyc29yMTsKKwl1aW50MzJfdCBjdXJzb3IyOworCXVpbnQzMl90IHRpbWluZ0g7CisJdWludDMyX3QgdGltaW5nVjsKKwl1aW50MzJfdCBkaXNwbGF5VjsKKwl1aW50MzJfdCBjcnRjU3luYzsKKworCXN0cnVjdCBudjA0X2NydGNfcmVnIGNydGNfcmVnWzJdOworfTsKKworZW51bSBub3V2ZWF1X2NhcmRfdHlwZSB7CisJTlZfMDQgICAgICA9IDB4MDAsCisJTlZfMTAgICAgICA9IDB4MTAsCisJTlZfMjAgICAgICA9IDB4MjAsCisJTlZfMzAgICAgICA9IDB4MzAsCisJTlZfNDAgICAgICA9IDB4NDAsCisJTlZfNTAgICAgICA9IDB4NTAsCit9OworCitzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSB7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKKwllbnVtIHsKKwkJTk9VVkVBVV9DQVJEX0lOSVRfRE9XTiwKKwkJTk9VVkVBVV9DQVJEX0lOSVRfRE9ORSwKKwkJTk9VVkVBVV9DQVJEX0lOSVRfRkFJTEVECisJfSBpbml0X3N0YXRlOworCisJLyogdGhlIGNhcmQgdHlwZSwgdGFrZXMgTlZfKiBhcyB2YWx1ZXMgKi8KKwllbnVtIG5vdXZlYXVfY2FyZF90eXBlIGNhcmRfdHlwZTsKKwkvKiBleGFjdCBjaGlwc2V0LCBkZXJpdmVkIGZyb20gTlZfUE1DX0JPT1RfMCAqLworCWludCBjaGlwc2V0OworCWludCBmbGFnczsKKworCXZvaWQgX19pb21lbSAqbW1pbzsKKwl2b2lkIF9faW9tZW0gKnJhbWluOworCXVpbnQzMl90IHJhbWluX3NpemU7CisKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7CisJc3RydWN0IHdvcmtfc3RydWN0IGlycV93b3JrOworCisJc3RydWN0IGxpc3RfaGVhZCB2Ymxfd2FpdGluZzsKKworCXN0cnVjdCB7CisJCXN0cnVjdCB0dG1fZ2xvYmFsX3JlZmVyZW5jZSBtZW1fZ2xvYmFsX3JlZjsKKwkJc3RydWN0IHR0bV9ib19nbG9iYWxfcmVmIGJvX2dsb2JhbF9yZWY7CisJCXN0cnVjdCB0dG1fYm9fZGV2aWNlIGJkZXY7CisJCXNwaW5sb2NrX3QgYm9fbGlzdF9sb2NrOworCQlzdHJ1Y3QgbGlzdF9oZWFkIGJvX2xpc3Q7CisJCWF0b21pY190IHZhbGlkYXRlX3NlcXVlbmNlOworCX0gdHRtOworCisJc3RydWN0IGZiX2luZm8gKmZiZGV2X2luZm87CisKKwlpbnQgZmlmb19hbGxvY19jb3VudDsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpmaWZvc1tOT1VWRUFVX01BWF9DSEFOTkVMX05SXTsKKworCXN0cnVjdCBub3V2ZWF1X2VuZ2luZSBlbmdpbmU7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbm5lbDsKKworCS8qIFJBTUlOIGNvbmZpZ3VyYXRpb24sIFJBTUZDLCBSQU1IVCBhbmQgUkFNUk8gb2Zmc2V0cyAqLworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcmFtaHQ7CisJdWludDMyX3QgcmFtaW5fcnN2ZF92cmFtOworCXVpbnQzMl90IHJhbWh0X29mZnNldDsKKwl1aW50MzJfdCByYW1odF9zaXplOworCXVpbnQzMl90IHJhbWh0X2JpdHM7CisJdWludDMyX3QgcmFtZmNfb2Zmc2V0OworCXVpbnQzMl90IHJhbWZjX3NpemU7CisJdWludDMyX3QgcmFtcm9fb2Zmc2V0OworCXVpbnQzMl90IHJhbXJvX3NpemU7CisKKwkvKiBiYXNlIHBoeXNpY2FsIGFkcmVzc2VzICovCisJdWludDY0X3QgZmJfcGh5czsKKwl1aW50NjRfdCBmYl9hdmFpbGFibGVfc2l6ZTsKKwl1aW50NjRfdCBmYl9tYXBwYWJsZV9wYWdlczsKKwl1aW50NjRfdCBmYl9hcGVyX2ZyZWU7CisKKwlzdHJ1Y3QgeworCQllbnVtIHsKKwkJCU5PVVZFQVVfR0FSVF9OT05FID0gMCwKKwkJCU5PVVZFQVVfR0FSVF9BR1AsCisJCQlOT1VWRUFVX0dBUlRfU0dETUEKKwkJfSB0eXBlOworCQl1aW50NjRfdCBhcGVyX2Jhc2U7CisJCXVpbnQ2NF90IGFwZXJfc2l6ZTsKKwkJdWludDY0X3QgYXBlcl9mcmVlOworCisJCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqc2dfY3R4ZG1hOworCQlzdHJ1Y3QgcGFnZSAqc2dfZHVtbXlfcGFnZTsKKwkJZG1hX2FkZHJfdCBzZ19kdW1teV9idXM7CisKKwkJLyogbm90dG0gaGFjayAqLworCQlzdHJ1Y3QgZHJtX3R0bV9iYWNrZW5kICpzZ19iZTsKKwkJdW5zaWduZWQgbG9uZyBzZ19oYW5kbGU7CisJfSBnYXJ0X2luZm87CisKKwkvKiBHOHgvRzl4IHZpcnR1YWwgYWRkcmVzcyBzcGFjZSAqLworCXVpbnQ2NF90IHZtX2dhcnRfYmFzZTsKKwl1aW50NjRfdCB2bV9nYXJ0X3NpemU7CisJdWludDY0X3Qgdm1fdnJhbV9iYXNlOworCXVpbnQ2NF90IHZtX3ZyYW1fc2l6ZTsKKwl1aW50NjRfdCB2bV9lbmQ7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICp2bV92cmFtX3B0W05WNTBfVk1fVlJBTV9OUl07CisJaW50IHZtX3ZyYW1fcHRfbnI7CisKKwkvKiB0aGUgbXRyciBjb3ZlcmluZyB0aGUgRkIgKi8KKwlpbnQgZmJfbXRycjsKKworCXN0cnVjdCBtZW1fYmxvY2sgKnJhbWluX2hlYXA7CisKKwkvKiBjb250ZXh0IHRhYmxlIHBvaW50ZWQgdG8gYmUgTlZfUEdSQVBIX0NIQU5ORUxfQ1RYX1RBQkxFICgweDQwMDc4MCkgKi8KKwl1aW50MzJfdCBjdHhfdGFibGVfc2l6ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfcmVmICpjdHhfdGFibGU7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGdwdW9ial9saXN0OworCisJc3RydWN0IG52YmlvcyBWQklPUzsKKwlzdHJ1Y3Qgbm91dmVhdV9iaW9zX2luZm8gKnZiaW9zOworCisJc3RydWN0IG52MDRfbW9kZV9zdGF0ZSBtb2RlX3JlZzsKKwlzdHJ1Y3QgbnYwNF9tb2RlX3N0YXRlIHNhdmVkX3JlZzsKKwl1aW50MzJfdCBzYXZlZF92Z2FfZm9udFs0XVsxNjM4NF07CisJdWludDMyX3QgY3J0Y19vd25lcjsKKwl1aW50MzJfdCBkYWNfdXNlcnNbNF07CisKKwlzdHJ1Y3Qgbm91dmVhdV9zdXNwZW5kX3Jlc3VtZSB7CisJCXVpbnQzMl90IGZpZm9fbW9kZTsKKwkJdWludDMyX3QgZ3JhcGhfY3R4X2NvbnRyb2w7CisJCXVpbnQzMl90IGdyYXBoX3N0YXRlOworCQl1aW50MzJfdCAqcmFtaW5fY29weTsKKwkJdWludDY0X3QgcmFtaW5fc2l6ZTsKKwl9IHN1c3JlczsKKworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiYWNrbGlnaHQ7CisJYm9vbCBhY3BpX2RzbTsKKworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmV2bzsKKworCXN0cnVjdCB7CisJCXN0cnVjdCBkZW50cnkgKmNoYW5uZWxfcm9vdDsKKwl9IGRlYnVnZnM7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICoKK25vdXZlYXVfYmRldihzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmQpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihiZCwgc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUsIHR0bS5iZGV2KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK25vdXZlYXVfYm9fcmVmKHN0cnVjdCBub3V2ZWF1X2JvICpyZWYsIHN0cnVjdCBub3V2ZWF1X2JvICoqcG52Ym8pCit7CisJc3RydWN0IG5vdXZlYXVfYm8gKnByZXY7CisKKwlpZiAoIXBudmJvKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwcmV2ID0gKnBudmJvOworCisJKnBudmJvID0gcmVmID8gbm91dmVhdV9ibyh0dG1fYm9fcmVmZXJlbmNlKCZyZWYtPmJvKSkgOiBOVUxMOworCWlmIChwcmV2KSB7CisJCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8gPSAmcHJldi0+Ym87CisKKwkJdHRtX2JvX3VucmVmKCZibyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTk9VVkVBVV9DSEVDS19JTklUSUFMSVNFRF9XSVRIX1JFVFVSTiBkbyB7ICAgICAgICAgICAgXAorCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpudiA9IGRldi0+ZGV2X3ByaXZhdGU7ICAgIFwKKwlpZiAobnYtPmluaXRfc3RhdGUgIT0gTk9VVkVBVV9DQVJEX0lOSVRfRE9ORSkgeyAgICAgICBcCisJCU5WX0VSUk9SKGRldiwgImNhbGxlZCB3aXRob3V0IGluaXRcbiIpOyAgICAgICBcCisJCXJldHVybiAtRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBOT1VWRUFVX0dFVF9VU0VSX0NIQU5ORUxfV0lUSF9SRVRVUk4oaWQsIGNsLCBjaCkgZG8geyAgICBcCisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKm52ID0gZGV2LT5kZXZfcHJpdmF0ZTsgICAgICAgXAorCWlmICghbm91dmVhdV9jaGFubmVsX293bmVyKGRldiwgKGNsKSwgKGlkKSkpIHsgICAgICAgICAgIFwKKwkJTlZfRVJST1IoZGV2LCAicGlkICVkIGRvZXNuJ3Qgb3duIGNoYW5uZWwgJWRcbiIsIFwKKwkJCSBEUk1fQ1VSUkVOVFBJRCwgKGlkKSk7ICAgICAgICAgICAgICAgICAgXAorCQlyZXR1cm4gLUVQRVJNOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoY2gpID0gbnYtPmZpZm9zWyhpZCldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvKiBub3V2ZWF1X2Rydi5jICovCitleHRlcm4gaW50IG5vdXZlYXVfbm9hZ3A7CitleHRlcm4gaW50IG5vdXZlYXVfZHVhbGxpbms7CitleHRlcm4gaW50IG5vdXZlYXVfdXNjcmlwdF9sdmRzOworZXh0ZXJuIGludCBub3V2ZWF1X3VzY3JpcHRfdG1kczsKK2V4dGVybiBpbnQgbm91dmVhdV92cmFtX3B1c2hidWY7CitleHRlcm4gaW50IG5vdXZlYXVfdnJhbV9ub3RpZnk7CitleHRlcm4gaW50IG5vdXZlYXVfZmJwZXJjcnRjOworZXh0ZXJuIGNoYXIgKm5vdXZlYXVfdHZfbm9ybTsKK2V4dGVybiBpbnQgbm91dmVhdV9yZWdfZGVidWc7CitleHRlcm4gY2hhciAqbm91dmVhdV92YmlvczsKKworLyogbm91dmVhdV9zdGF0ZS5jICovCitleHRlcm4gdm9pZCBub3V2ZWF1X3ByZWNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqKTsKK2V4dGVybiBpbnQgIG5vdXZlYXVfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2V4dGVybiBpbnQgIG5vdXZlYXVfZmlyc3RvcGVuKHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbm91dmVhdV9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gaW50ICBub3V2ZWF1X3VubG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiBpbnQgIG5vdXZlYXVfaW9jdGxfZ2V0cGFyYW0oc3RydWN0IGRybV9kZXZpY2UgKiwgdm9pZCAqZGF0YSwKKwkJCQkgICBzdHJ1Y3QgZHJtX2ZpbGUgKik7CitleHRlcm4gaW50ICBub3V2ZWF1X2lvY3RsX3NldHBhcmFtKHN0cnVjdCBkcm1fZGV2aWNlICosIHZvaWQgKmRhdGEsCisJCQkJICAgc3RydWN0IGRybV9maWxlICopOworZXh0ZXJuIGJvb2wgbm91dmVhdV93YWl0X3VudGlsKHN0cnVjdCBkcm1fZGV2aWNlICosIHVpbnQ2NF90IHRpbWVvdXQsCisJCQkgICAgICAgdWludDMyX3QgcmVnLCB1aW50MzJfdCBtYXNrLCB1aW50MzJfdCB2YWwpOworZXh0ZXJuIGJvb2wgbm91dmVhdV93YWl0X2Zvcl9pZGxlKHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIGludCAgbm91dmVhdV9jYXJkX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gaW50ICBub3V2ZWF1X2lvY3RsX2NhcmRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqLCB2b2lkICpkYXRhLAorCQkJCSAgICBzdHJ1Y3QgZHJtX2ZpbGUgKik7CitleHRlcm4gaW50ICBub3V2ZWF1X2lvY3RsX3N1c3BlbmQoc3RydWN0IGRybV9kZXZpY2UgKiwgdm9pZCAqZGF0YSwKKwkJCQkgIHN0cnVjdCBkcm1fZmlsZSAqKTsKK2V4dGVybiBpbnQgIG5vdXZlYXVfaW9jdGxfcmVzdW1lKHN0cnVjdCBkcm1fZGV2aWNlICosIHZvaWQgKmRhdGEsCisJCQkJIHN0cnVjdCBkcm1fZmlsZSAqKTsKKworLyogbm91dmVhdV9tZW0uYyAqLworZXh0ZXJuIGludCAgbm91dmVhdV9tZW1faW5pdF9oZWFwKHN0cnVjdCBtZW1fYmxvY2sgKiosIHVpbnQ2NF90IHN0YXJ0LAorCQkJCSB1aW50NjRfdCBzaXplKTsKK2V4dGVybiBzdHJ1Y3QgbWVtX2Jsb2NrICpub3V2ZWF1X21lbV9hbGxvY19ibG9jayhzdHJ1Y3QgbWVtX2Jsb2NrICosCisJCQkJCQkgdWludDY0X3Qgc2l6ZSwgaW50IGFsaWduMiwKKwkJCQkJCSBzdHJ1Y3QgZHJtX2ZpbGUgKiwgaW50IHRhaWwpOworZXh0ZXJuIHZvaWQgbm91dmVhdV9tZW1fdGFrZWRvd24oc3RydWN0IG1lbV9ibG9jayAqKmhlYXApOworZXh0ZXJuIHZvaWQgbm91dmVhdV9tZW1fZnJlZV9ibG9jayhzdHJ1Y3QgbWVtX2Jsb2NrICopOworZXh0ZXJuIHVpbnQ2NF90IG5vdXZlYXVfbWVtX2ZiX2Ftb3VudChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG5vdXZlYXVfbWVtX3JlbGVhc2Uoc3RydWN0IGRybV9maWxlICosIHN0cnVjdCBtZW1fYmxvY2sgKmhlYXApOworZXh0ZXJuIGludCAgbm91dmVhdV9tZW1faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiBpbnQgIG5vdXZlYXVfbWVtX2luaXRfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbm91dmVhdV9tZW1fY2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gaW50ICBudjUwX21lbV92bV9iaW5kX2xpbmVhcihzdHJ1Y3QgZHJtX2RldmljZSAqLCB1aW50NjRfdCB2aXJ0LAorCQkJCSAgICB1aW50MzJfdCBzaXplLCB1aW50MzJfdCBmbGFncywKKwkJCQkgICAgdWludDY0X3QgcGh5cyk7CitleHRlcm4gdm9pZCBudjUwX21lbV92bV91bmJpbmQoc3RydWN0IGRybV9kZXZpY2UgKiwgdWludDY0X3QgdmlydCwKKwkJCSAgICAgICB1aW50MzJfdCBzaXplKTsKKworLyogbm91dmVhdV9ub3RpZmllci5jICovCitleHRlcm4gaW50ICBub3V2ZWF1X25vdGlmaWVyX2luaXRfY2hhbm5lbChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworZXh0ZXJuIHZvaWQgbm91dmVhdV9ub3RpZmllcl90YWtlZG93bl9jaGFubmVsKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CitleHRlcm4gaW50ICBub3V2ZWF1X25vdGlmaWVyX2FsbG9jKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKiwgdWludDMyX3QgaGFuZGxlLAorCQkJCSAgIGludCBjb3V0LCB1aW50MzJfdCAqb2Zmc2V0KTsKK2V4dGVybiBpbnQgIG5vdXZlYXVfbm90aWZpZXJfb2Zmc2V0KHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqLCB1aW50MzJfdCAqKTsKK2V4dGVybiBpbnQgIG5vdXZlYXVfaW9jdGxfbm90aWZpZXJfYWxsb2Moc3RydWN0IGRybV9kZXZpY2UgKiwgdm9pZCAqZGF0YSwKKwkJCQkJIHN0cnVjdCBkcm1fZmlsZSAqKTsKK2V4dGVybiBpbnQgIG5vdXZlYXVfaW9jdGxfbm90aWZpZXJfZnJlZShzdHJ1Y3QgZHJtX2RldmljZSAqLCB2b2lkICpkYXRhLAorCQkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKik7CisKKy8qIG5vdXZlYXVfY2hhbm5lbC5jICovCitleHRlcm4gc3RydWN0IGRybV9pb2N0bF9kZXNjIG5vdXZlYXVfaW9jdGxzW107CitleHRlcm4gaW50IG5vdXZlYXVfbWF4X2lvY3RsOworZXh0ZXJuIHZvaWQgbm91dmVhdV9jaGFubmVsX2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IGRybV9maWxlICopOworZXh0ZXJuIGludCAgbm91dmVhdV9jaGFubmVsX293bmVyKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBkcm1fZmlsZSAqLAorCQkJCSAgaW50IGNoYW5uZWwpOworZXh0ZXJuIGludCAgbm91dmVhdV9jaGFubmVsX2FsbG9jKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICoqY2hhbiwKKwkJCQkgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorCQkJCSAgdWludDMyX3QgZmJfY3R4ZG1hLCB1aW50MzJfdCB0dF9jdHhkbWEpOworZXh0ZXJuIHZvaWQgbm91dmVhdV9jaGFubmVsX2ZyZWUoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiBpbnQgIG5vdXZlYXVfY2hhbm5lbF9pZGxlKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pOworCisvKiBub3V2ZWF1X29iamVjdC5jICovCitleHRlcm4gaW50ICBub3V2ZWF1X2dwdW9ial9lYXJseV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIGludCAgbm91dmVhdV9ncHVvYmpfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG5vdXZlYXVfZ3B1b2JqX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbm91dmVhdV9ncHVvYmpfbGF0ZV90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiBpbnQgIG5vdXZlYXVfZ3B1b2JqX3N1c3BlbmQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBub3V2ZWF1X2dwdW9ial9zdXNwZW5kX2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBub3V2ZWF1X2dwdW9ial9yZXN1bWUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IG5vdXZlYXVfZ3B1b2JqX2NoYW5uZWxfaW5pdChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICosCisJCQkJICAgICAgIHVpbnQzMl90IHZyYW1faCwgdWludDMyX3QgdHRfaCk7CitleHRlcm4gdm9pZCBub3V2ZWF1X2dwdW9ial9jaGFubmVsX3Rha2Vkb3duKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CitleHRlcm4gaW50IG5vdXZlYXVfZ3B1b2JqX25ldyhzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICosCisJCQkgICAgICB1aW50MzJfdCBzaXplLCBpbnQgYWxpZ24sIHVpbnQzMl90IGZsYWdzLAorCQkJICAgICAgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICoqKTsKK2V4dGVybiBpbnQgbm91dmVhdV9ncHVvYmpfZGVsKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKik7CitleHRlcm4gaW50IG5vdXZlYXVfZ3B1b2JqX3JlZl9hZGQoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqLAorCQkJCSAgdWludDMyX3QgaGFuZGxlLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKiwKKwkJCQkgIHN0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYgKiopOworZXh0ZXJuIGludCBub3V2ZWF1X2dwdW9ial9yZWZfZGVsKHN0cnVjdCBkcm1fZGV2aWNlICosCisJCQkJICBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfcmVmICoqKTsKK2V4dGVybiBpbnQgbm91dmVhdV9ncHVvYmpfcmVmX2ZpbmQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqLCB1aW50MzJfdCBoYW5kbGUsCisJCQkJICAgc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiAqKnJlZl9yZXQpOworZXh0ZXJuIGludCBub3V2ZWF1X2dwdW9ial9uZXdfcmVmKHN0cnVjdCBkcm1fZGV2aWNlICosCisJCQkJICBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICphbGxvY19jaGFuLAorCQkJCSAgc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqcmVmX2NoYW4sCisJCQkJICB1aW50MzJfdCBoYW5kbGUsIHVpbnQzMl90IHNpemUsIGludCBhbGlnbiwKKwkJCQkgIHVpbnQzMl90IGZsYWdzLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfcmVmICoqKTsKK2V4dGVybiBpbnQgbm91dmVhdV9ncHVvYmpfbmV3X2Zha2Uoc3RydWN0IGRybV9kZXZpY2UgKiwKKwkJCQkgICB1aW50MzJfdCBwX29mZnNldCwgdWludDMyX3QgYl9vZmZzZXQsCisJCQkJICAgdWludDMyX3Qgc2l6ZSwgdWludDMyX3QgZmxhZ3MsCisJCQkJICAgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICoqLAorCQkJCSAgIHN0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYqKik7CitleHRlcm4gaW50IG5vdXZlYXVfZ3B1b2JqX2RtYV9uZXcoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqLCBpbnQgY2xhc3MsCisJCQkJICB1aW50NjRfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUsIGludCBhY2Nlc3MsCisJCQkJICBpbnQgdGFyZ2V0LCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKiopOworZXh0ZXJuIGludCBub3V2ZWF1X2dwdW9ial9nYXJ0X2RtYV9uZXcoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqLAorCQkJCSAgICAgICB1aW50NjRfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUsCisJCQkJICAgICAgIGludCBhY2Nlc3MsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKiwKKwkJCQkgICAgICAgdWludDMyX3QgKm9fcmV0KTsKK2V4dGVybiBpbnQgbm91dmVhdV9ncHVvYmpfZ3JfbmV3KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKiwgaW50IGNsYXNzLAorCQkJCSBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKiopOworZXh0ZXJuIGludCBub3V2ZWF1X2lvY3RsX2dyb2JqX2FsbG9jKHN0cnVjdCBkcm1fZGV2aWNlICosIHZvaWQgKmRhdGEsCisJCQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKik7CitleHRlcm4gaW50IG5vdXZlYXVfaW9jdGxfZ3B1b2JqX2ZyZWUoc3RydWN0IGRybV9kZXZpY2UgKiwgdm9pZCAqZGF0YSwKKwkJCQkgICAgIHN0cnVjdCBkcm1fZmlsZSAqKTsKKworLyogbm91dmVhdV9pcnEuYyAqLworZXh0ZXJuIGlycXJldHVybl90IG5vdXZlYXVfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKTsKK2V4dGVybiB2b2lkICAgICAgICBub3V2ZWF1X2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIGludCAgICAgICAgIG5vdXZlYXVfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgICAgICAgIG5vdXZlYXVfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKworLyogbm91dmVhdV9zZ2RtYS5jICovCitleHRlcm4gaW50IG5vdXZlYXVfc2dkbWFfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG5vdXZlYXVfc2dkbWFfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gaW50IG5vdXZlYXVfc2dkbWFfZ2V0X3BhZ2Uoc3RydWN0IGRybV9kZXZpY2UgKiwgdWludDMyX3Qgb2Zmc2V0LAorCQkJCSAgdWludDMyX3QgKnBhZ2UpOworZXh0ZXJuIHN0cnVjdCB0dG1fYmFja2VuZCAqbm91dmVhdV9zZ2RtYV9pbml0X3R0bShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKworLyogbm91dmVhdV9kZWJ1Z2ZzLmMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19EUk1fTk9VVkVBVV9ERUJVRykKK2V4dGVybiBpbnQgIG5vdXZlYXVfZGVidWdmc19pbml0KHN0cnVjdCBkcm1fbWlub3IgKik7CitleHRlcm4gdm9pZCBub3V2ZWF1X2RlYnVnZnNfdGFrZWRvd24oc3RydWN0IGRybV9taW5vciAqKTsKK2V4dGVybiBpbnQgIG5vdXZlYXVfZGVidWdmc19jaGFubmVsX2luaXQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiB2b2lkIG5vdXZlYXVfZGVidWdmc19jaGFubmVsX2Zpbmkoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludAorbm91dmVhdV9kZWJ1Z2ZzX2luaXQoc3RydWN0IGRybV9taW5vciAqbWlub3IpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBub3V2ZWF1X2RlYnVnZnNfdGFrZWRvd24oc3RydWN0IGRybV9taW5vciAqbWlub3IpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Citub3V2ZWF1X2RlYnVnZnNfY2hhbm5lbF9pbml0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorbm91dmVhdV9kZWJ1Z2ZzX2NoYW5uZWxfZmluaShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworfQorI2VuZGlmCisKKy8qIG5vdXZlYXVfZG1hLmMgKi8KK2V4dGVybiBpbnQgIG5vdXZlYXVfZG1hX2luaXQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiBpbnQgIG5vdXZlYXVfZG1hX3dhaXQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqLCBpbnQgc2l6ZSk7CisKKy8qIG5vdXZlYXVfYWNwaS5jICovCisjaWZkZWYgQ09ORklHX0FDUEkKK2V4dGVybiBpbnQgbm91dmVhdV9oeWJyaWRfc2V0dXAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gYm9vbCBub3V2ZWF1X2RzbV9wcm9iZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBub3V2ZWF1X2h5YnJpZF9zZXR1cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSBib29sIG5vdXZlYXVfZHNtX3Byb2JlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGZhbHNlOworfQorI2VuZGlmCisKKy8qIG5vdXZlYXVfYmFja2xpZ2h0LmMgKi8KKyNpZmRlZiBDT05GSUdfRFJNX05PVVZFQVVfQkFDS0xJR0hUCitleHRlcm4gaW50IG5vdXZlYXVfYmFja2xpZ2h0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBub3V2ZWF1X2JhY2tsaWdodF9leGl0KHN0cnVjdCBkcm1fZGV2aWNlICopOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IG5vdXZlYXVfYmFja2xpZ2h0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5vdXZlYXVfYmFja2xpZ2h0X2V4aXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikgeyB9CisjZW5kaWYKKworLyogbm91dmVhdV9iaW9zLmMgKi8KK2V4dGVybiBpbnQgbm91dmVhdV9iaW9zX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBub3V2ZWF1X2Jpb3NfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IG5vdXZlYXVfcnVuX3ZiaW9zX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBub3V2ZWF1X2Jpb3NfcnVuX2luaXRfdGFibGUoc3RydWN0IGRybV9kZXZpY2UgKiwgdWludDE2X3QgdGFibGUsCisJCQkJCXN0cnVjdCBkY2JfZW50cnkgKik7CitleHRlcm4gc3RydWN0IGRjYl9ncGlvX2VudHJ5ICpub3V2ZWF1X2Jpb3NfZ3Bpb19lbnRyeShzdHJ1Y3QgZHJtX2RldmljZSAqLAorCQkJCQkJICAgICAgZW51bSBkY2JfZ3Bpb190YWcpOworZXh0ZXJuIHN0cnVjdCBkY2JfY29ubmVjdG9yX3RhYmxlX2VudHJ5ICoKK25vdXZlYXVfYmlvc19jb25uZWN0b3JfZW50cnkoc3RydWN0IGRybV9kZXZpY2UgKiwgaW50IGluZGV4KTsKK2V4dGVybiBpbnQgZ2V0X3BsbF9saW1pdHMoc3RydWN0IGRybV9kZXZpY2UgKiwgdWludDMyX3QgbGltaXRfbWF0Y2gsCisJCQkgIHN0cnVjdCBwbGxfbGltcyAqKTsKK2V4dGVybiBpbnQgbm91dmVhdV9iaW9zX3J1bl9kaXNwbGF5X3RhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICosCisJCQkJCSAgc3RydWN0IGRjYl9lbnRyeSAqLAorCQkJCQkgIHVpbnQzMl90IHNjcmlwdCwgaW50IHB4Y2xrKTsKK2V4dGVybiB2b2lkICpub3V2ZWF1X2Jpb3NfZHBfdGFibGUoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IGRjYl9lbnRyeSAqLAorCQkJCSAgIGludCAqbGVuZ3RoKTsKK2V4dGVybiBib29sIG5vdXZlYXVfYmlvc19mcF9tb2RlKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICopOworZXh0ZXJuIHVpbnQ4X3QgKm5vdXZlYXVfYmlvc19lbWJlZGRlZF9lZGlkKHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIGludCBub3V2ZWF1X2Jpb3NfcGFyc2VfbHZkc190YWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQgcHhjbGssCisJCQkJCSBib29sICpkbCwgYm9vbCAqaWZfaXNfMjRiaXQpOworZXh0ZXJuIGludCBydW5fdG1kc190YWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3QgZGNiX2VudHJ5ICosCisJCQkgIGludCBoZWFkLCBpbnQgcHhjbGspOworZXh0ZXJuIGludCBjYWxsX2x2ZHNfc2NyaXB0KHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBkY2JfZW50cnkgKiwgaW50IGhlYWQsCisJCQkgICAgZW51bSBMVkRTX3NjcmlwdCwgaW50IHB4Y2xrKTsKKworLyogbm91dmVhdV90dG0uYyAqLworaW50IG5vdXZlYXVfdHRtX2dsb2JhbF9pbml0KHN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICopOwordm9pZCBub3V2ZWF1X3R0bV9nbG9iYWxfcmVsZWFzZShzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqKTsKK2ludCBub3V2ZWF1X3R0bV9tbWFwKHN0cnVjdCBmaWxlICosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKKworLyogbm91dmVhdV9kcC5jICovCitpbnQgbm91dmVhdV9kcF9hdXhjaChzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqYXV4Y2gsIGludCBjbWQsIGludCBhZGRyLAorCQkgICAgIHVpbnQ4X3QgKmRhdGEsIGludCBkYXRhX25yKTsKK2Jvb2wgbm91dmVhdV9kcF9kZXRlY3Qoc3RydWN0IGRybV9lbmNvZGVyICopOworYm9vbCBub3V2ZWF1X2RwX2xpbmtfdHJhaW4oc3RydWN0IGRybV9lbmNvZGVyICopOworCisvKiBudjA0X2ZiLmMgKi8KK2V4dGVybiBpbnQgIG52MDRfZmJfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG52MDRfZmJfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKik7CisKKy8qIG52MTBfZmIuYyAqLworZXh0ZXJuIGludCAgbnYxMF9mYl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbnYxMF9mYl90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKworLyogbnY0MF9mYi5jICovCitleHRlcm4gaW50ICBudjQwX2ZiX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBudjQwX2ZiX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICopOworCisvKiBudjA0X2ZpZm8uYyAqLworZXh0ZXJuIGludCAgbnYwNF9maWZvX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBudjA0X2ZpZm9fZGlzYWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG52MDRfZmlmb19lbmFibGUoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gYm9vbCBudjA0X2ZpZm9fcmVhc3NpZ24oc3RydWN0IGRybV9kZXZpY2UgKiwgYm9vbCk7CitleHRlcm4gaW50ICBudjA0X2ZpZm9fY2hhbm5lbF9pZChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiBpbnQgIG52MDRfZmlmb19jcmVhdGVfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworZXh0ZXJuIHZvaWQgbnYwNF9maWZvX2Rlc3Ryb3lfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworZXh0ZXJuIGludCAgbnYwNF9maWZvX2xvYWRfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworZXh0ZXJuIGludCAgbnYwNF9maWZvX3VubG9hZF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICopOworCisvKiBudjEwX2ZpZm8uYyAqLworZXh0ZXJuIGludCAgbnYxMF9maWZvX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gaW50ICBudjEwX2ZpZm9fY2hhbm5lbF9pZChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiBpbnQgIG52MTBfZmlmb19jcmVhdGVfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworZXh0ZXJuIHZvaWQgbnYxMF9maWZvX2Rlc3Ryb3lfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworZXh0ZXJuIGludCAgbnYxMF9maWZvX2xvYWRfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworZXh0ZXJuIGludCAgbnYxMF9maWZvX3VubG9hZF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICopOworCisvKiBudjQwX2ZpZm8uYyAqLworZXh0ZXJuIGludCAgbnY0MF9maWZvX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gaW50ICBudjQwX2ZpZm9fY3JlYXRlX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiB2b2lkIG52NDBfZmlmb19kZXN0cm95X2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiBpbnQgIG52NDBfZmlmb19sb2FkX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiBpbnQgIG52NDBfZmlmb191bmxvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKworLyogbnY1MF9maWZvLmMgKi8KK2V4dGVybiBpbnQgIG52NTBfZmlmb19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbnY1MF9maWZvX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIGludCAgbnY1MF9maWZvX2NoYW5uZWxfaWQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gaW50ICBudjUwX2ZpZm9fY3JlYXRlX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiB2b2lkIG52NTBfZmlmb19kZXN0cm95X2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiBpbnQgIG52NTBfZmlmb19sb2FkX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiBpbnQgIG52NTBfZmlmb191bmxvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKworLyogbnYwNF9ncmFwaC5jICovCitleHRlcm4gc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9jbGFzcyBudjA0X2dyYXBoX2dyY2xhc3NbXTsKK2V4dGVybiBpbnQgIG52MDRfZ3JhcGhfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG52MDRfZ3JhcGhfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBudjA0X2dyYXBoX2ZpZm9fYWNjZXNzKHN0cnVjdCBkcm1fZGV2aWNlICosIGJvb2wpOworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKm52MDRfZ3JhcGhfY2hhbm5lbChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiBpbnQgIG52MDRfZ3JhcGhfY3JlYXRlX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiB2b2lkIG52MDRfZ3JhcGhfZGVzdHJveV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CitleHRlcm4gaW50ICBudjA0X2dyYXBoX2xvYWRfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworZXh0ZXJuIGludCAgbnYwNF9ncmFwaF91bmxvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG52MDRfZ3JhcGhfY29udGV4dF9zd2l0Y2goc3RydWN0IGRybV9kZXZpY2UgKik7CisKKy8qIG52MTBfZ3JhcGguYyAqLworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfY2xhc3MgbnYxMF9ncmFwaF9ncmNsYXNzW107CitleHRlcm4gaW50ICBudjEwX2dyYXBoX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBudjEwX2dyYXBoX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKm52MTBfZ3JhcGhfY2hhbm5lbChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiBpbnQgIG52MTBfZ3JhcGhfY3JlYXRlX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiB2b2lkIG52MTBfZ3JhcGhfZGVzdHJveV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CitleHRlcm4gaW50ICBudjEwX2dyYXBoX2xvYWRfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworZXh0ZXJuIGludCAgbnYxMF9ncmFwaF91bmxvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG52MTBfZ3JhcGhfY29udGV4dF9zd2l0Y2goc3RydWN0IGRybV9kZXZpY2UgKik7CisKKy8qIG52MjBfZ3JhcGguYyAqLworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfY2xhc3MgbnYyMF9ncmFwaF9ncmNsYXNzW107CitleHRlcm4gc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9jbGFzcyBudjMwX2dyYXBoX2dyY2xhc3NbXTsKK2V4dGVybiBpbnQgIG52MjBfZ3JhcGhfY3JlYXRlX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiB2b2lkIG52MjBfZ3JhcGhfZGVzdHJveV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CitleHRlcm4gaW50ICBudjIwX2dyYXBoX2xvYWRfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworZXh0ZXJuIGludCAgbnYyMF9ncmFwaF91bmxvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiBpbnQgIG52MjBfZ3JhcGhfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG52MjBfZ3JhcGhfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gaW50ICBudjMwX2dyYXBoX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CisKKy8qIG52NDBfZ3JhcGguYyAqLworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfY2xhc3MgbnY0MF9ncmFwaF9ncmNsYXNzW107CitleHRlcm4gaW50ICBudjQwX2dyYXBoX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBudjQwX2dyYXBoX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKm52NDBfZ3JhcGhfY2hhbm5lbChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiBpbnQgIG52NDBfZ3JhcGhfY3JlYXRlX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiB2b2lkIG52NDBfZ3JhcGhfZGVzdHJveV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CitleHRlcm4gaW50ICBudjQwX2dyYXBoX2xvYWRfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworZXh0ZXJuIGludCAgbnY0MF9ncmFwaF91bmxvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiBpbnQgIG52NDBfZ3JjdHhfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG52NDBfZ3JjdHhfZmluaShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG52NDBfZ3JjdHhfdmFsc19sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKTsKKworLyogbnY1MF9ncmFwaC5jICovCitleHRlcm4gc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9jbGFzcyBudjUwX2dyYXBoX2dyY2xhc3NbXTsKK2V4dGVybiBpbnQgIG52NTBfZ3JhcGhfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG52NTBfZ3JhcGhfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBudjUwX2dyYXBoX2ZpZm9fYWNjZXNzKHN0cnVjdCBkcm1fZGV2aWNlICosIGJvb2wpOworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKm52NTBfZ3JhcGhfY2hhbm5lbChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiBpbnQgIG52NTBfZ3JhcGhfY3JlYXRlX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiB2b2lkIG52NTBfZ3JhcGhfZGVzdHJveV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CitleHRlcm4gaW50ICBudjUwX2dyYXBoX2xvYWRfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworZXh0ZXJuIGludCAgbnY1MF9ncmFwaF91bmxvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG52NTBfZ3JhcGhfY29udGV4dF9zd2l0Y2goc3RydWN0IGRybV9kZXZpY2UgKik7CisKKy8qIG52MDRfaW5zdG1lbS5jICovCitleHRlcm4gaW50ICBudjA0X2luc3RtZW1faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG52MDRfaW5zdG1lbV90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiBpbnQgIG52MDRfaW5zdG1lbV9zdXNwZW5kKHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbnYwNF9pbnN0bWVtX3Jlc3VtZShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiBpbnQgIG52MDRfaW5zdG1lbV9wb3B1bGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKiwKKwkJCQkgIHVpbnQzMl90ICpzaXplKTsKK2V4dGVybiB2b2lkIG52MDRfaW5zdG1lbV9jbGVhcihzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKik7CitleHRlcm4gaW50ICBudjA0X2luc3RtZW1fYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKik7CitleHRlcm4gaW50ICBudjA0X2luc3RtZW1fdW5iaW5kKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKTsKK2V4dGVybiB2b2lkIG52MDRfaW5zdG1lbV9wcmVwYXJlX2FjY2VzcyhzdHJ1Y3QgZHJtX2RldmljZSAqLCBib29sIHdyaXRlKTsKK2V4dGVybiB2b2lkIG52MDRfaW5zdG1lbV9maW5pc2hfYWNjZXNzKHN0cnVjdCBkcm1fZGV2aWNlICopOworCisvKiBudjUwX2luc3RtZW0uYyAqLworZXh0ZXJuIGludCAgbnY1MF9pbnN0bWVtX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBudjUwX2luc3RtZW1fdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gaW50ICBudjUwX2luc3RtZW1fc3VzcGVuZChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG52NTBfaW5zdG1lbV9yZXN1bWUoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gaW50ICBudjUwX2luc3RtZW1fcG9wdWxhdGUoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICosCisJCQkJICB1aW50MzJfdCAqc2l6ZSk7CitleHRlcm4gdm9pZCBudjUwX2luc3RtZW1fY2xlYXIoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICopOworZXh0ZXJuIGludCAgbnY1MF9pbnN0bWVtX2JpbmQoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICopOworZXh0ZXJuIGludCAgbnY1MF9pbnN0bWVtX3VuYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKik7CitleHRlcm4gdm9pZCBudjUwX2luc3RtZW1fcHJlcGFyZV9hY2Nlc3Moc3RydWN0IGRybV9kZXZpY2UgKiwgYm9vbCB3cml0ZSk7CitleHRlcm4gdm9pZCBudjUwX2luc3RtZW1fZmluaXNoX2FjY2VzcyhzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKworLyogbnYwNF9tYy5jICovCitleHRlcm4gaW50ICBudjA0X21jX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdm9pZCBudjA0X21jX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICopOworCisvKiBudjQwX21jLmMgKi8KK2V4dGVybiBpbnQgIG52NDBfbWNfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG52NDBfbWNfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKik7CisKKy8qIG52NTBfbWMuYyAqLworZXh0ZXJuIGludCAgbnY1MF9tY19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbnY1MF9tY190YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKworLyogbnYwNF90aW1lci5jICovCitleHRlcm4gaW50ICBudjA0X3RpbWVyX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gdWludDY0X3QgbnYwNF90aW1lcl9yZWFkKHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbnYwNF90aW1lcl90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKworZXh0ZXJuIGxvbmcgbm91dmVhdV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworLyogbnYwNF9kYWMuYyAqLworZXh0ZXJuIGludCBudjA0X2RhY19jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9lbnRyeSAqZW50cnkpOworZXh0ZXJuIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgbnYxN19kYWNfZGV0ZWN0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCQkJCSBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKK2V4dGVybiBpbnQgbnYwNF9kYWNfb3V0cHV0X29mZnNldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOworZXh0ZXJuIHZvaWQgbnYwNF9kYWNfdXBkYXRlX2RhY2NsayhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGJvb2wgZW5hYmxlKTsKKworLyogbnYwNF9kZnAuYyAqLworZXh0ZXJuIGludCBudjA0X2RmcF9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9lbnRyeSAqZW50cnkpOworZXh0ZXJuIGludCBudjA0X2RmcF9nZXRfYm91bmRfaGVhZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2VudHJ5ICpkY2JlbnQpOworZXh0ZXJuIHZvaWQgbnYwNF9kZnBfYmluZF9oZWFkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfZW50cnkgKmRjYmVudCwKKwkJCSAgICAgICBpbnQgaGVhZCwgYm9vbCBkbCk7CitleHRlcm4gdm9pZCBudjA0X2RmcF9kaXNhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBoZWFkKTsKK2V4dGVybiB2b2lkIG52MDRfZGZwX3VwZGF0ZV9mcF9jb250cm9sKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IG1vZGUpOworCisvKiBudjA0X3R2LmMgKi8KK2V4dGVybiBpbnQgbnYwNF90dl9pZGVudGlmeShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaTJjX2luZGV4KTsKK2V4dGVybiBpbnQgbnYwNF90dl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9lbnRyeSAqZW50cnkpOworCisvKiBudjE3X3R2LmMgKi8KK2V4dGVybiBpbnQgbnYxN190dl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9lbnRyeSAqZW50cnkpOworZXh0ZXJuIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgbnYxN190dl9kZXRlY3Qoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJCQkJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCQkJCXVpbnQzMl90IHBpbl9tYXNrKTsKKworLyogbnYwNF9kaXNwbGF5LmMgKi8KK2V4dGVybiBpbnQgbnYwNF9kaXNwbGF5X2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG52MDRfZGlzcGxheV9kZXN0cm95KHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbnYwNF9kaXNwbGF5X3Jlc3RvcmUoc3RydWN0IGRybV9kZXZpY2UgKik7CisKKy8qIG52MDRfY3J0Yy5jICovCitleHRlcm4gaW50IG52MDRfY3J0Y19jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKiwgaW50IGluZGV4KTsKKworLyogbm91dmVhdV9iby5jICovCitleHRlcm4gc3RydWN0IHR0bV9ib19kcml2ZXIgbm91dmVhdV9ib19kcml2ZXI7CitleHRlcm4gaW50IG5vdXZlYXVfYm9fbmV3KHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKiwKKwkJCSAgaW50IHNpemUsIGludCBhbGlnbiwgdWludDMyX3QgZmxhZ3MsCisJCQkgIHVpbnQzMl90IHRpbGVfbW9kZSwgdWludDMyX3QgdGlsZV9mbGFncywKKwkJCSAgYm9vbCBub192bSwgYm9vbCBtYXBwYWJsZSwgc3RydWN0IG5vdXZlYXVfYm8gKiopOworZXh0ZXJuIGludCBub3V2ZWF1X2JvX3BpbihzdHJ1Y3Qgbm91dmVhdV9ibyAqLCB1aW50MzJfdCBmbGFncyk7CitleHRlcm4gaW50IG5vdXZlYXVfYm9fdW5waW4oc3RydWN0IG5vdXZlYXVfYm8gKik7CitleHRlcm4gaW50IG5vdXZlYXVfYm9fbWFwKHN0cnVjdCBub3V2ZWF1X2JvICopOworZXh0ZXJuIHZvaWQgbm91dmVhdV9ib191bm1hcChzdHJ1Y3Qgbm91dmVhdV9ibyAqKTsKK2V4dGVybiB2b2lkIG5vdXZlYXVfYm9fcGxhY2VtZW50X3NldChzdHJ1Y3Qgbm91dmVhdV9ibyAqLCB1aW50MzJfdCBtZW10eXBlKTsKK2V4dGVybiB1MTYgbm91dmVhdV9ib19yZDE2KHN0cnVjdCBub3V2ZWF1X2JvICpudmJvLCB1bnNpZ25lZCBpbmRleCk7CitleHRlcm4gdm9pZCBub3V2ZWF1X2JvX3dyMTYoc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8sIHVuc2lnbmVkIGluZGV4LCB1MTYgdmFsKTsKK2V4dGVybiB1MzIgbm91dmVhdV9ib19yZDMyKHN0cnVjdCBub3V2ZWF1X2JvICpudmJvLCB1bnNpZ25lZCBpbmRleCk7CitleHRlcm4gdm9pZCBub3V2ZWF1X2JvX3dyMzIoc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8sIHVuc2lnbmVkIGluZGV4LCB1MzIgdmFsKTsKKworLyogbm91dmVhdV9mZW5jZS5jICovCitzdHJ1Y3Qgbm91dmVhdV9mZW5jZTsKK2V4dGVybiBpbnQgbm91dmVhdV9mZW5jZV9pbml0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CitleHRlcm4gdm9pZCBub3V2ZWF1X2ZlbmNlX2Zpbmkoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiB2b2lkIG5vdXZlYXVfZmVuY2VfdXBkYXRlKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CitleHRlcm4gaW50IG5vdXZlYXVfZmVuY2VfbmV3KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKiwgc3RydWN0IG5vdXZlYXVfZmVuY2UgKiosCisJCQkgICAgIGJvb2wgZW1pdCk7CitleHRlcm4gaW50IG5vdXZlYXVfZmVuY2VfZW1pdChzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqKTsKK3N0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKm5vdXZlYXVfZmVuY2VfY2hhbm5lbChzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqKTsKK2V4dGVybiBib29sIG5vdXZlYXVfZmVuY2Vfc2lnbmFsbGVkKHZvaWQgKm9iaiwgdm9pZCAqYXJnKTsKK2V4dGVybiBpbnQgbm91dmVhdV9mZW5jZV93YWl0KHZvaWQgKm9iaiwgdm9pZCAqYXJnLCBib29sIGxhenksIGJvb2wgaW50cik7CitleHRlcm4gaW50IG5vdXZlYXVfZmVuY2VfZmx1c2godm9pZCAqb2JqLCB2b2lkICphcmcpOworZXh0ZXJuIHZvaWQgbm91dmVhdV9mZW5jZV91bnJlZih2b2lkICoqb2JqKTsKK2V4dGVybiB2b2lkICpub3V2ZWF1X2ZlbmNlX3JlZih2b2lkICpvYmopOworZXh0ZXJuIHZvaWQgbm91dmVhdV9mZW5jZV9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjaGFubmVsKTsKKworLyogbm91dmVhdV9nZW0uYyAqLworZXh0ZXJuIGludCBub3V2ZWF1X2dlbV9uZXcoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqLAorCQkJICAgaW50IHNpemUsIGludCBhbGlnbiwgdWludDMyX3QgZmxhZ3MsCisJCQkgICB1aW50MzJfdCB0aWxlX21vZGUsIHVpbnQzMl90IHRpbGVfZmxhZ3MsCisJCQkgICBib29sIG5vX3ZtLCBib29sIG1hcHBhYmxlLCBzdHJ1Y3Qgbm91dmVhdV9ibyAqKik7CitleHRlcm4gaW50IG5vdXZlYXVfZ2VtX29iamVjdF9uZXcoc3RydWN0IGRybV9nZW1fb2JqZWN0ICopOworZXh0ZXJuIHZvaWQgbm91dmVhdV9nZW1fb2JqZWN0X2RlbChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKik7CitleHRlcm4gaW50IG5vdXZlYXVfZ2VtX2lvY3RsX25ldyhzdHJ1Y3QgZHJtX2RldmljZSAqLCB2b2lkICosCisJCQkJIHN0cnVjdCBkcm1fZmlsZSAqKTsKK2V4dGVybiBpbnQgbm91dmVhdV9nZW1faW9jdGxfcHVzaGJ1ZihzdHJ1Y3QgZHJtX2RldmljZSAqLCB2b2lkICosCisJCQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKik7CitleHRlcm4gaW50IG5vdXZlYXVfZ2VtX2lvY3RsX3B1c2hidWZfY2FsbChzdHJ1Y3QgZHJtX2RldmljZSAqLCB2b2lkICosCisJCQkJCSAgc3RydWN0IGRybV9maWxlICopOworZXh0ZXJuIGludCBub3V2ZWF1X2dlbV9pb2N0bF9wdXNoYnVmX2NhbGwyKHN0cnVjdCBkcm1fZGV2aWNlICosIHZvaWQgKiwKKwkJCQkJICAgc3RydWN0IGRybV9maWxlICopOworZXh0ZXJuIGludCBub3V2ZWF1X2dlbV9pb2N0bF9waW4oc3RydWN0IGRybV9kZXZpY2UgKiwgdm9pZCAqLAorCQkJCSBzdHJ1Y3QgZHJtX2ZpbGUgKik7CitleHRlcm4gaW50IG5vdXZlYXVfZ2VtX2lvY3RsX3VucGluKHN0cnVjdCBkcm1fZGV2aWNlICosIHZvaWQgKiwKKwkJCQkgICBzdHJ1Y3QgZHJtX2ZpbGUgKik7CitleHRlcm4gaW50IG5vdXZlYXVfZ2VtX2lvY3RsX3RpbGUoc3RydWN0IGRybV9kZXZpY2UgKiwgdm9pZCAqLAorCQkJCSAgc3RydWN0IGRybV9maWxlICopOworZXh0ZXJuIGludCBub3V2ZWF1X2dlbV9pb2N0bF9jcHVfcHJlcChzdHJ1Y3QgZHJtX2RldmljZSAqLCB2b2lkICosCisJCQkJICAgICAgc3RydWN0IGRybV9maWxlICopOworZXh0ZXJuIGludCBub3V2ZWF1X2dlbV9pb2N0bF9jcHVfZmluaShzdHJ1Y3QgZHJtX2RldmljZSAqLCB2b2lkICosCisJCQkJICAgICAgc3RydWN0IGRybV9maWxlICopOworZXh0ZXJuIGludCBub3V2ZWF1X2dlbV9pb2N0bF9pbmZvKHN0cnVjdCBkcm1fZGV2aWNlICosIHZvaWQgKiwKKwkJCQkgIHN0cnVjdCBkcm1fZmlsZSAqKTsKKworLyogbnYxN19ncGlvLmMgKi8KK2ludCBudjE3X2dwaW9fZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGVudW0gZGNiX2dwaW9fdGFnIHRhZyk7CitpbnQgbnYxN19ncGlvX3NldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBlbnVtIGRjYl9ncGlvX3RhZyB0YWcsIGludCBzdGF0ZSk7CisKKyNpZm5kZWYgaW9yZWFkMzJfbmF0aXZlCisjaWZkZWYgX19CSUdfRU5ESUFOCisjZGVmaW5lIGlvcmVhZDE2X25hdGl2ZSBpb3JlYWQxNmJlCisjZGVmaW5lIGlvd3JpdGUxNl9uYXRpdmUgaW93cml0ZTE2YmUKKyNkZWZpbmUgaW9yZWFkMzJfbmF0aXZlICBpb3JlYWQzMmJlCisjZGVmaW5lIGlvd3JpdGUzMl9uYXRpdmUgaW93cml0ZTMyYmUKKyNlbHNlIC8qIGRlZiBfX0JJR19FTkRJQU4gKi8KKyNkZWZpbmUgaW9yZWFkMTZfbmF0aXZlIGlvcmVhZDE2CisjZGVmaW5lIGlvd3JpdGUxNl9uYXRpdmUgaW93cml0ZTE2CisjZGVmaW5lIGlvcmVhZDMyX25hdGl2ZSAgaW9yZWFkMzIKKyNkZWZpbmUgaW93cml0ZTMyX25hdGl2ZSBpb3dyaXRlMzIKKyNlbmRpZiAvKiBkZWYgX19CSUdfRU5ESUFOIGVsc2UgKi8KKyNlbmRpZiAvKiAhaW9yZWFkMzJfbmF0aXZlICovCisKKy8qIGNoYW5uZWwgY29udHJvbCByZWcgYWNjZXNzICovCitzdGF0aWMgaW5saW5lIHUzMiBudmNoYW5fcmQzMihzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCB1bnNpZ25lZCByZWcpCit7CisJcmV0dXJuIGlvcmVhZDMyX25hdGl2ZShjaGFuLT51c2VyICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG52Y2hhbl93cjMyKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCQkJCQkJdW5zaWduZWQgcmVnLCB1MzIgdmFsKQoreworCWlvd3JpdGUzMl9uYXRpdmUodmFsLCBjaGFuLT51c2VyICsgcmVnKTsKK30KKworLyogcmVnaXN0ZXIgYWNjZXNzICovCitzdGF0aWMgaW5saW5lIHUzMiBudl9yZDMyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIHJlZykKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXJldHVybiBpb3JlYWQzMl9uYXRpdmUoZGV2X3ByaXYtPm1taW8gKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbnZfd3IzMihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCByZWcsIHUzMiB2YWwpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpb3dyaXRlMzJfbmF0aXZlKHZhbCwgZGV2X3ByaXYtPm1taW8gKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHU4IG52X3JkMDgoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgcmVnKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJcmV0dXJuIGlvcmVhZDgoZGV2X3ByaXYtPm1taW8gKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbnZfd3IwOChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCByZWcsIHU4IHZhbCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWlvd3JpdGU4KHZhbCwgZGV2X3ByaXYtPm1taW8gKyByZWcpOworfQorCisjZGVmaW5lIG52X3dhaXQocmVnLCBtYXNrLCB2YWwpIFwKKwlub3V2ZWF1X3dhaXRfdW50aWwoZGV2LCAyMDAwMDAwMDAwVUxMLCAocmVnKSwgKG1hc2spLCAodmFsKSkKKworLyogUFJBTUlOIGFjY2VzcyAqLworc3RhdGljIGlubGluZSB1MzIgbnZfcmkzMihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlyZXR1cm4gaW9yZWFkMzJfbmF0aXZlKGRldl9wcml2LT5yYW1pbiArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBudl93aTMyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIG9mZnNldCwgdTMyIHZhbCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWlvd3JpdGUzMl9uYXRpdmUodmFsLCBkZXZfcHJpdi0+cmFtaW4gKyBvZmZzZXQpOworfQorCisvKiBvYmplY3QgYWNjZXNzICovCitzdGF0aWMgaW5saW5lIHUzMiBudl9ybzMyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqb2JqLAorCQkJCXVuc2lnbmVkIGluZGV4KQoreworCXJldHVybiBudl9yaTMyKGRldiwgb2JqLT5pbV9wcmFtaW4tPnN0YXJ0ICsgaW5kZXggKiA0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG52X3dvMzIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpvYmosCisJCQkJdW5zaWduZWQgaW5kZXgsIHUzMiB2YWwpCit7CisJbnZfd2kzMihkZXYsIG9iai0+aW1fcHJhbWluLT5zdGFydCArIGluZGV4ICogNCwgdmFsKTsKK30KKworLyoKKyAqIExvZ2dpbmcKKyAqIEFyZ3VtZW50IGQgaXMgKHN0cnVjdCBkcm1fZGV2aWNlICopLgorICovCisjZGVmaW5lIE5WX1BSSU5USyhsZXZlbCwgZCwgZm10LCBhcmcuLi4pIFwKKwlwcmludGsobGV2ZWwgIlsiIERSTV9OQU1FICJdICIgRFJJVkVSX05BTUUgIiAlczogIiBmbXQsIFwKKwkJCQkJcGNpX25hbWUoZC0+cGRldiksICMjYXJnKQorI2lmbmRlZiBOVl9ERUJVR19OT1RSQUNFCisjZGVmaW5lIE5WX0RFQlVHKGQsIGZtdCwgYXJnLi4uKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmIChkcm1fZGVidWcpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlOVl9QUklOVEsoS0VSTl9ERUJVRywgZCwgIiVzOiVkIC0gIiBmbXQsIF9fZnVuY19fLCAgICAgICAgICAgICBcCisJCQkgIF9fTElORV9fLCAjI2FyZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIE5WX0RFQlVHKGQsIGZtdCwgYXJnLi4uKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmIChkcm1fZGVidWcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlOVl9QUklOVEsoS0VSTl9ERUJVRywgZCwgZm10LCAjI2FyZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2VuZGlmCisjZGVmaW5lIE5WX0VSUk9SKGQsIGZtdCwgYXJnLi4uKSBOVl9QUklOVEsoS0VSTl9FUlIsIGQsIGZtdCwgIyNhcmcpCisjZGVmaW5lIE5WX0lORk8oZCwgZm10LCBhcmcuLi4pIE5WX1BSSU5USyhLRVJOX0lORk8sIGQsIGZtdCwgIyNhcmcpCisjZGVmaW5lIE5WX1RSQUNFV0FSTihkLCBmbXQsIGFyZy4uLikgTlZfUFJJTlRLKEtFUk5fTk9USUNFLCBkLCBmbXQsICMjYXJnKQorI2RlZmluZSBOVl9UUkFDRShkLCBmbXQsIGFyZy4uLikgTlZfUFJJTlRLKEtFUk5fSU5GTywgZCwgZm10LCAjI2FyZykKKyNkZWZpbmUgTlZfV0FSTihkLCBmbXQsIGFyZy4uLikgTlZfUFJJTlRLKEtFUk5fV0FSTklORywgZCwgZm10LCAjI2FyZykKKworLyogbm91dmVhdV9yZWdfZGVidWcgYml0bWFzayAqLworZW51bSB7CisJTk9VVkVBVV9SRUdfREVCVUdfTUMgICAgICAgICAgICAgPSAweDEsCisJTk9VVkVBVV9SRUdfREVCVUdfVklERU8gICAgICAgICAgPSAweDIsCisJTk9VVkVBVV9SRUdfREVCVUdfRkIgICAgICAgICAgICAgPSAweDQsCisJTk9VVkVBVV9SRUdfREVCVUdfRVhUREVWICAgICAgICAgPSAweDgsCisJTk9VVkVBVV9SRUdfREVCVUdfQ1JUQyAgICAgICAgICAgPSAweDEwLAorCU5PVVZFQVVfUkVHX0RFQlVHX1JBTURBQyAgICAgICAgID0gMHgyMCwKKwlOT1VWRUFVX1JFR19ERUJVR19WR0FDUlRDICAgICAgICA9IDB4NDAsCisJTk9VVkVBVV9SRUdfREVCVUdfUk1WSU8gICAgICAgICAgPSAweDgwLAorCU5PVVZFQVVfUkVHX0RFQlVHX1ZHQUFUVFIgICAgICAgID0gMHgxMDAsCisJTk9VVkVBVV9SRUdfREVCVUdfRVZPICAgICAgICAgICAgPSAweDIwMCwKK307CisKKyNkZWZpbmUgTlZfUkVHX0RFQlVHKHR5cGUsIGRldiwgZm10LCBhcmcuLi4pIGRvIHsgXAorCWlmIChub3V2ZWF1X3JlZ19kZWJ1ZyAmIE5PVVZFQVVfUkVHX0RFQlVHXyMjdHlwZSkgXAorCQlOVl9QUklOVEsoS0VSTl9ERUJVRywgZGV2LCAiJXM6ICIgZm10LCBfX2Z1bmNfXywgIyNhcmcpOyBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIGJvb2wKK252X3R3b19oZWFkcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJY29uc3QgaW50IGltcGwgPSBkZXYtPnBjaV9kZXZpY2UgJiAweDBmZjA7CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl8xMCAmJiBpbXBsICE9IDB4MDEwMCAmJgorCSAgICBpbXBsICE9IDB4MDE1MCAmJiBpbXBsICE9IDB4MDFhMCAmJiBpbXBsICE9IDB4MDIwMCkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAorbnZfZ2Y0X2Rpc3BfYXJjaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXJldHVybiBudl90d29faGVhZHMoZGV2KSAmJiAoZGV2LT5wY2lfZGV2aWNlICYgMHgwZmYwKSAhPSAweDAxMTA7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAorbnZfdHdvX3JlZ19wbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWNvbnN0IGludCBpbXBsID0gZGV2LT5wY2lfZGV2aWNlICYgMHgwZmYwOworCisJaWYgKGltcGwgPT0gMHgwMzEwIHx8IGltcGwgPT0gMHgwMzQwIHx8IGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNDApCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworI2RlZmluZSBOVjUwX05WU1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNTA2ZQorI2RlZmluZSBOVjUwX05WU1dfRE1BX1NFTUFQSE9SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA2MAorI2RlZmluZSBOVjUwX05WU1dfU0VNQVBIT1JFX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA2NAorI2RlZmluZSBOVjUwX05WU1dfU0VNQVBIT1JFX0FDUVVJUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA2OAorI2RlZmluZSBOVjUwX05WU1dfU0VNQVBIT1JFX1JFTEVBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA2YworI2RlZmluZSBOVjUwX05WU1dfRE1BX1ZCTFNFTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDE4YworI2RlZmluZSBOVjUwX05WU1dfVkJMU0VNX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBOVjUwX05WU1dfVkJMU0VNX1JFTEVBU0VfVkFMVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwNAorI2RlZmluZSBOVjUwX05WU1dfVkJMU0VNX1JFTEVBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwOAorCisjZW5kaWYgLyogX19OT1VWRUFVX0RSVl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZW5jb2Rlci5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9lbmNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0YTI0MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZW5jb2Rlci5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWFhcnRlbiBNYWF0aHVpcy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX19OT1VWRUFVX0VOQ09ERVJfSF9fCisjZGVmaW5lIF9fTk9VVkVBVV9FTkNPREVSX0hfXworCisjaW5jbHVkZSAiZHJtX2VuY29kZXJfc2xhdmUuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorCisjZGVmaW5lIE5WX0RQTVNfQ0xFQVJFRCAweDgwCisKK3N0cnVjdCBub3V2ZWF1X2VuY29kZXIgeworCXN0cnVjdCBkcm1fZW5jb2Rlcl9zbGF2ZSBiYXNlOworCisJc3RydWN0IGRjYl9lbnRyeSAqZGNiOworCWludCBvcjsKKworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlIG1vZGU7CisJaW50IGxhc3RfZHBtczsKKworCXN0cnVjdCBudjA0X291dHB1dF9yZWcgcmVzdG9yZTsKKworCXZvaWQgKCpkaXNjb25uZWN0KShzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICplbmNvZGVyKTsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCWludCBkcGNkX3ZlcnNpb247CisJCQlpbnQgbGlua19ucjsKKwkJCWludCBsaW5rX2J3OworCQl9IGRwOworCX07Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm5vdXZlYXVfZW5jb2RlcihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuYykKK3sKKwlzdHJ1Y3QgZHJtX2VuY29kZXJfc2xhdmUgKnNsYXZlID0gdG9fZW5jb2Rlcl9zbGF2ZShlbmMpOworCisJcmV0dXJuIGNvbnRhaW5lcl9vZihzbGF2ZSwgc3RydWN0IG5vdXZlYXVfZW5jb2RlciwgYmFzZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRybV9lbmNvZGVyICp0b19kcm1fZW5jb2RlcihzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICplbmMpCit7CisJcmV0dXJuICZlbmMtPmJhc2UuYmFzZTsKK30KKworc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICoKK25vdXZlYXVfZW5jb2Rlcl9jb25uZWN0b3JfZ2V0KHN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKmVuY29kZXIpOworaW50IG52NTBfc29yX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2VudHJ5ICplbnRyeSk7CitpbnQgbnY1MF9kYWNfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfZW50cnkgKmVudHJ5KTsKKworc3RydWN0IGJpdF9kaXNwbGF5cG9ydF9lbmNvZGVyX3RhYmxlIHsKKwl1aW50MzJfdCBtYXRjaDsKKwl1aW50OF90ICByZWNvcmRfbnI7CisJdWludDhfdCAgdW5rbm93bjsKKwl1aW50MTZfdCBzY3JpcHQwOworCXVpbnQxNl90IHNjcmlwdDE7CisJdWludDE2X3QgdW5rbm93bl90YWJsZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgYml0X2Rpc3BsYXlwb3J0X2VuY29kZXJfdGFibGVfZW50cnkgeworCXVpbnQ4X3QgdnNfbGV2ZWw7CisJdWludDhfdCBwcmVfbGV2ZWw7CisJdWludDhfdCByZWcwOworCXVpbnQ4X3QgcmVnMTsKKwl1aW50OF90IHJlZzI7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2VuZGlmIC8qIF9fTk9VVkVBVV9FTkNPREVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mYi5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhM2YzMWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZiLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNYWFydGVuIE1hYXRodWlzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX05PVVZFQVVfRkJfSF9fCisjZGVmaW5lIF9fTk9VVkVBVV9GQl9IX18KKworc3RydWN0IG5vdXZlYXVfZnJhbWVidWZmZXIgeworCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgYmFzZTsKKwlzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibzsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5vdXZlYXVfZnJhbWVidWZmZXIgKgorbm91dmVhdV9mcmFtZWJ1ZmZlcihzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGZiLCBzdHJ1Y3Qgbm91dmVhdV9mcmFtZWJ1ZmZlciwgYmFzZSk7Cit9CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZHJtX21vZGVfY29uZmlnX2Z1bmNzIG5vdXZlYXVfbW9kZV9jb25maWdfZnVuY3M7CisKK3N0cnVjdCBkcm1fZnJhbWVidWZmZXIgKgorbm91dmVhdV9mcmFtZWJ1ZmZlcl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfYm8gKiwKKwkJCSAgIHN0cnVjdCBkcm1fbW9kZV9mYl9jbWQgKik7CisKKyNlbmRpZiAvKiBfX05PVVZFQVVfRkJfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZiY29uLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZiY29uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZlOGM1ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZmJjb24uYwpAQCAtMCwwICsxLDM4MCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA3IERhdmlkIEFpcmxpZQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgIERhdmlkIEFpcmxpZQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c3JxLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY3JlZW5faW5mby5oPgorCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImRybV9jcnRjLmgiCisjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCisjaW5jbHVkZSAiZHJtX2ZiX2hlbHBlci5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9kcm0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X2NydGMuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2ZiLmgiCisjaW5jbHVkZSAibm91dmVhdV9mYmNvbi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZG1hLmgiCisKK3N0YXRpYyBpbnQKK25vdXZlYXVfZmJjb25fc3luYyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9mYmNvbl9wYXIgKnBhciA9IGluZm8tPnBhcjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcGFyLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmNoYW5uZWw7CisJaW50IHJldCwgaTsKKworCWlmICghY2hhbi0+YWNjZWxfZG9uZSB8fAorCSAgICBpbmZvLT5zdGF0ZSAhPSBGQklORk9fU1RBVEVfUlVOTklORyB8fAorCSAgICBpbmZvLT5mbGFncyAmIEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEKQorCQlyZXR1cm4gMDsKKworCWlmIChSSU5HX1NQQUNFKGNoYW4sIDQpKSB7CisJCU5WX0VSUk9SKGRldiwgIkdQVSBsb2NrdXAgLSBzd2l0Y2hpbmcgdG8gc29mdHdhcmUgZmJjb25cbiIpOworCQlpbmZvLT5mbGFncyB8PSBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRDsKKwkJcmV0dXJuIDA7CisJfQorCisJQkVHSU5fUklORyhjaGFuLCAwLCAweDAxMDQsIDEpOworCU9VVF9SSU5HKGNoYW4sIDApOworCUJFR0lOX1JJTkcoY2hhbiwgMCwgMHgwMTAwLCAxKTsKKwlPVVRfUklORyhjaGFuLCAwKTsKKwlub3V2ZWF1X2JvX3dyMzIoY2hhbi0+bm90aWZpZXJfYm8sIGNoYW4tPm0ybWZfbnRmeSArIDMsIDB4ZmZmZmZmZmYpOworCUZJUkVfUklORyhjaGFuKTsKKworCXJldCA9IC1FQlVTWTsKKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDAwOyBpKyspIHsKKwkJaWYgKCFub3V2ZWF1X2JvX3JkMzIoY2hhbi0+bm90aWZpZXJfYm8sIGNoYW4tPm0ybWZfbnRmeSArIDMpKSB7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJRFJNX1VERUxBWSgxKTsKKwl9CisKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIkdQVSBsb2NrdXAgLSBzd2l0Y2hpbmcgdG8gc29mdHdhcmUgZmJjb25cbiIpOworCQlpbmZvLT5mbGFncyB8PSBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRDsKKwkJcmV0dXJuIDA7CisJfQorCisJY2hhbi0+YWNjZWxfZG9uZSA9IGZhbHNlOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZiX29wcyBub3V2ZWF1X2ZiY29uX29wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuZmJfY2hlY2tfdmFyID0gZHJtX2ZiX2hlbHBlcl9jaGVja192YXIsCisJLmZiX3NldF9wYXIgPSBkcm1fZmJfaGVscGVyX3NldF9wYXIsCisJLmZiX3NldGNvbHJlZyA9IGRybV9mYl9oZWxwZXJfc2V0Y29scmVnLAorCS5mYl9maWxscmVjdCA9IGNmYl9maWxscmVjdCwKKwkuZmJfY29weWFyZWEgPSBjZmJfY29weWFyZWEsCisJLmZiX2ltYWdlYmxpdCA9IGNmYl9pbWFnZWJsaXQsCisJLmZiX3N5bmMgPSBub3V2ZWF1X2ZiY29uX3N5bmMsCisJLmZiX3Bhbl9kaXNwbGF5ID0gZHJtX2ZiX2hlbHBlcl9wYW5fZGlzcGxheSwKKwkuZmJfYmxhbmsgPSBkcm1fZmJfaGVscGVyX2JsYW5rLAorCS5mYl9zZXRjbWFwID0gZHJtX2ZiX2hlbHBlcl9zZXRjbWFwLAorfTsKKworc3RhdGljIHZvaWQgbm91dmVhdV9mYmNvbl9nYW1tYV9zZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLCB1MTYgcmVkLCB1MTYgZ3JlZW4sCisJCQkJICAgIHUxNiBibHVlLCBpbnQgcmVnbm8pCit7CisJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhjcnRjKTsKKworCW52X2NydGMtPmx1dC5yW3JlZ25vXSA9IHJlZDsKKwludl9jcnRjLT5sdXQuZ1tyZWdub10gPSBncmVlbjsKKwludl9jcnRjLT5sdXQuYltyZWdub10gPSBibHVlOworfQorCitzdGF0aWMgdm9pZCBub3V2ZWF1X2ZiY29uX2dhbW1hX2dldChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHUxNiAqcmVkLCB1MTYgKmdyZWVuLAorCQkJCSAgICB1MTYgKmJsdWUsIGludCByZWdubykKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOworCisJKnJlZCA9IG52X2NydGMtPmx1dC5yW3JlZ25vXTsKKwkqZ3JlZW4gPSBudl9jcnRjLT5sdXQuZ1tyZWdub107CisJKmJsdWUgPSBudl9jcnRjLT5sdXQuYltyZWdub107Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2ZiX2hlbHBlcl9mdW5jcyBub3V2ZWF1X2ZiY29uX2hlbHBlcl9mdW5jcyA9IHsKKwkuZ2FtbWFfc2V0ID0gbm91dmVhdV9mYmNvbl9nYW1tYV9zZXQsCisJLmdhbW1hX2dldCA9IG5vdXZlYXVfZmJjb25fZ2FtbWFfZ2V0Cit9OworCisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorc3RhdGljIGJvb2wKK25vdXZlYXVfZmJjb25faGFzX3Zlc2FmYl9vcl9lZmlmYihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2LT5wZGV2OworCWludCByYW1pbjsKKworCWlmIChzY3JlZW5faW5mby5vcmlnX3ZpZGVvX2lzVkdBICE9IFZJREVPX1RZUEVfVkxGQiAmJgorCSAgICBzY3JlZW5faW5mby5vcmlnX3ZpZGVvX2lzVkdBICE9IFZJREVPX1RZUEVfRUZJKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoc2NyZWVuX2luZm8ubGZiX2Jhc2UgPCBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSkpCisJCWdvdG8gbm90X2ZiOworCisJaWYgKHNjcmVlbl9pbmZvLmxmYl9iYXNlICsgc2NyZWVuX2luZm8ubGZiX3NpemUgPj0KKwkgICAgcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpICsgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKSkKKwkJZ290byBub3RfZmI7CisKKwlyZXR1cm4gdHJ1ZTsKK25vdF9mYjoKKwlyYW1pbiA9IDI7CisJaWYgKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgcmFtaW4pID09IDApIHsKKwkJcmFtaW4gPSAzOworCQlpZiAocGNpX3Jlc291cmNlX2xlbihwZGV2LCByYW1pbikgPT0gMCkKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAoc2NyZWVuX2luZm8ubGZiX2Jhc2UgPCBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgcmFtaW4pKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoc2NyZWVuX2luZm8ubGZiX2Jhc2UgKyBzY3JlZW5faW5mby5sZmJfc2l6ZSA+PQorCSAgICBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgcmFtaW4pICsgcGNpX3Jlc291cmNlX2xlbihwZGV2LCByYW1pbikpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorI2VuZGlmCisKK3ZvaWQKK25vdXZlYXVfZmJjb25femZpbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gZGV2X3ByaXYtPmZiZGV2X2luZm87CisJc3RydWN0IGZiX2ZpbGxyZWN0IHJlY3Q7CisKKwkvKiBDbGVhciB0aGUgZW50aXJlIGZiY29uLiAgVGhlIGRybSB3aWxsIHByb2dyYW0gZXZlcnkgY29ubmVjdG9yCisJICogd2l0aCBpdCdzIHByZWZlcnJlZCBtb2RlLiAgSWYgdGhlIHNpemVzIGRpZmZlciwgb25lIGRpc3BsYXkgd2lsbAorCSAqIHF1aXRlIGxpa2VseSBoYXZlIGdhcmJhZ2UgYXJvdW5kIHRoZSBjb25zb2xlLgorCSAqLworCXJlY3QuZHggPSByZWN0LmR5ID0gMDsKKwlyZWN0LndpZHRoID0gaW5mby0+dmFyLnhyZXNfdmlydHVhbDsKKwlyZWN0LmhlaWdodCA9IGluZm8tPnZhci55cmVzX3ZpcnR1YWw7CisJcmVjdC5jb2xvciA9IDA7CisJcmVjdC5yb3AgPSBST1BfQ09QWTsKKwlpbmZvLT5mYm9wcy0+ZmJfZmlsbHJlY3QoaW5mbywgJnJlY3QpOworfQorCitzdGF0aWMgaW50Citub3V2ZWF1X2ZiY29uX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBmYl93aWR0aCwKKwkJICAgICB1aW50MzJfdCBmYl9oZWlnaHQsIHVpbnQzMl90IHN1cmZhY2Vfd2lkdGgsCisJCSAgICAgdWludDMyX3Qgc3VyZmFjZV9oZWlnaHQsIHVpbnQzMl90IHN1cmZhY2VfZGVwdGgsCisJCSAgICAgdWludDMyX3Qgc3VyZmFjZV9icHAsIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKipwZmIpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKKwlzdHJ1Y3Qgbm91dmVhdV9mYmNvbl9wYXIgKnBhcjsKKwlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYjsKKwlzdHJ1Y3Qgbm91dmVhdV9mcmFtZWJ1ZmZlciAqbm91dmVhdV9mYjsKKwlzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibzsKKwlzdHJ1Y3QgZHJtX21vZGVfZmJfY21kIG1vZGVfY21kOworCXN0cnVjdCBkZXZpY2UgKmRldmljZSA9ICZkZXYtPnBkZXYtPmRldjsKKwlpbnQgc2l6ZSwgcmV0OworCisJbW9kZV9jbWQud2lkdGggPSBzdXJmYWNlX3dpZHRoOworCW1vZGVfY21kLmhlaWdodCA9IHN1cmZhY2VfaGVpZ2h0OworCisJbW9kZV9jbWQuYnBwID0gc3VyZmFjZV9icHA7CisJbW9kZV9jbWQucGl0Y2ggPSBtb2RlX2NtZC53aWR0aCAqIChtb2RlX2NtZC5icHAgPj4gMyk7CisJbW9kZV9jbWQucGl0Y2ggPSBBTElHTihtb2RlX2NtZC5waXRjaCwgMjU2KTsKKwltb2RlX2NtZC5kZXB0aCA9IHN1cmZhY2VfZGVwdGg7CisKKwlzaXplID0gbW9kZV9jbWQucGl0Y2ggKiBtb2RlX2NtZC5oZWlnaHQ7CisJc2l6ZSA9IEFMSUdOKHNpemUsIFBBR0VfU0laRSk7CisKKwlyZXQgPSBub3V2ZWF1X2dlbV9uZXcoZGV2LCBkZXZfcHJpdi0+Y2hhbm5lbCwgc2l6ZSwgMCwgVFRNX1BMX0ZMQUdfVlJBTSwKKwkJCSAgICAgIDAsIDB4MDAwMCwgZmFsc2UsIHRydWUsICZudmJvKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBmcmFtZWJ1ZmZlclxuIik7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG5vdXZlYXVfYm9fcGluKG52Ym8sIFRUTV9QTF9GTEFHX1ZSQU0pOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiZmFpbGVkIHRvIHBpbiBmYjogJWRcbiIsIHJldCk7CisJCW5vdXZlYXVfYm9fcmVmKE5VTEwsICZudmJvKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gbm91dmVhdV9ib19tYXAobnZibyk7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJmYWlsZWQgdG8gbWFwIGZiOiAlZFxuIiwgcmV0KTsKKwkJbm91dmVhdV9ib191bnBpbihudmJvKTsKKwkJbm91dmVhdV9ib19yZWYoTlVMTCwgJm52Ym8pOworCQlnb3RvIG91dDsKKwl9CisKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisKKwlmYiA9IG5vdXZlYXVfZnJhbWVidWZmZXJfY3JlYXRlKGRldiwgbnZibywgJm1vZGVfY21kKTsKKwlpZiAoIWZiKSB7CisJCXJldCA9IC1FTk9NRU07CisJCU5WX0VSUk9SKGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBmYi5cbiIpOworCQlnb3RvIG91dF91bnJlZjsKKwl9CisKKwlsaXN0X2FkZCgmZmItPmZpbHBfaGVhZCwgJmRldi0+bW9kZV9jb25maWcuZmJfa2VybmVsX2xpc3QpOworCisJbm91dmVhdV9mYiA9IG5vdXZlYXVfZnJhbWVidWZmZXIoZmIpOworCSpwZmIgPSBmYjsKKworCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IG5vdXZlYXVfZmJjb25fcGFyKSwgZGV2aWNlKTsKKwlpZiAoIWluZm8pIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfdW5yZWY7CisJfQorCisJcGFyID0gaW5mby0+cGFyOworCXBhci0+aGVscGVyLmZ1bmNzID0gJm5vdXZlYXVfZmJjb25faGVscGVyX2Z1bmNzOworCXBhci0+aGVscGVyLmRldiA9IGRldjsKKwlyZXQgPSBkcm1fZmJfaGVscGVyX2luaXRfY3J0Y19jb3VudCgmcGFyLT5oZWxwZXIsIDIsIDQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3VucmVmOworCWRldl9wcml2LT5mYmRldl9pbmZvID0gaW5mbzsKKworCXN0cmNweShpbmZvLT5maXguaWQsICJub3V2ZWF1ZmIiKTsKKwlpbmZvLT5mbGFncyA9IEZCSU5GT19ERUZBVUxUIHwgRkJJTkZPX0hXQUNDRUxfQ09QWUFSRUEgfAorCQkgICAgICBGQklORk9fSFdBQ0NFTF9GSUxMUkVDVCB8IEZCSU5GT19IV0FDQ0VMX0lNQUdFQkxJVDsKKwlpbmZvLT5mYm9wcyA9ICZub3V2ZWF1X2ZiY29uX29wczsKKwlpbmZvLT5maXguc21lbV9zdGFydCA9IGRldi0+bW9kZV9jb25maWcuZmJfYmFzZSArIG52Ym8tPmJvLm9mZnNldCAtCisJCQkgICAgICAgZGV2X3ByaXYtPnZtX3ZyYW1fYmFzZTsKKwlpbmZvLT5maXguc21lbV9sZW4gPSBzaXplOworCisJaW5mby0+c2NyZWVuX2Jhc2UgPSBudmJvX2ttYXBfb2JqX2lvdmlydHVhbChub3V2ZWF1X2ZiLT5udmJvKTsKKwlpbmZvLT5zY3JlZW5fc2l6ZSA9IHNpemU7CisKKwlkcm1fZmJfaGVscGVyX2ZpbGxfZml4KGluZm8sIGZiLT5waXRjaCwgZmItPmRlcHRoKTsKKwlkcm1fZmJfaGVscGVyX2ZpbGxfdmFyKGluZm8sIGZiLCBmYl93aWR0aCwgZmJfaGVpZ2h0KTsKKworCS8qIEZJWE1FOiB3ZSByZWFsbHkgc2hvdWxkbid0IGV4cG9zZSBtbWlvIHNwYWNlIGF0IGFsbCAqLworCWluZm8tPmZpeC5tbWlvX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMSk7CisJaW5mby0+Zml4Lm1taW9fbGVuID0gcGNpX3Jlc291cmNlX2xlbihkZXYtPnBkZXYsIDEpOworCisJLyogU2V0IGFwZXJ0dXJlIGJhc2Uvc2l6ZSBmb3IgdmVzYWZiIHRha2VvdmVyICovCisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorCWlmIChub3V2ZWF1X2ZiY29uX2hhc192ZXNhZmJfb3JfZWZpZmIoZGV2KSkgeworCQkvKiBTb21lIE5WSURJQSBWQklPUycgYXJlIHN0dXBpZCBhbmQgZGVjaWRlIHRvIHB1dCB0aGUKKwkJICogZnJhbWVidWZmZXIgaW4gdGhlIG1pZGRsZSBvZiB0aGUgUFJBTUlOIEJBUiBmb3IKKwkJICogd2hhdGV2ZXIgcmVhc29uLiAgV2UgbmVlZCB0byBrbm93IHRoZSBleGFjdCBsZmJfYmFzZQorCQkgKiB0byBnZXQgdmVzYWZiIGtpY2tlZCBvZmYsIGFuZCB0aGUgb25seSByZWxpYWJsZSB3YXkKKwkJICogd2UgaGF2ZSBsZWZ0IGlzIHRvIGZpbmQgb3V0IGxmYl9iYXNlIHRoZSBzYW1lIHdheQorCQkgKiB2ZXNhZmIgZGlkLgorCQkgKi8KKwkJaW5mby0+YXBlcnR1cmVfYmFzZSA9IHNjcmVlbl9pbmZvLmxmYl9iYXNlOworCQlpbmZvLT5hcGVydHVyZV9zaXplID0gc2NyZWVuX2luZm8ubGZiX3NpemU7CisJCWlmIChzY3JlZW5faW5mby5vcmlnX3ZpZGVvX2lzVkdBID09IFZJREVPX1RZUEVfVkxGQikKKwkJCWluZm8tPmFwZXJ0dXJlX3NpemUgKj0gNjU1MzY7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCWluZm8tPmFwZXJ0dXJlX2Jhc2UgPSBpbmZvLT5maXgubW1pb19zdGFydDsKKwkJaW5mby0+YXBlcnR1cmVfc2l6ZSA9IGluZm8tPmZpeC5tbWlvX2xlbjsKKwl9CisKKwlpbmZvLT5waXhtYXAuc2l6ZSA9IDY0KjEwMjQ7CisJaW5mby0+cGl4bWFwLmJ1Zl9hbGlnbiA9IDg7CisJaW5mby0+cGl4bWFwLmFjY2Vzc19hbGlnbiA9IDMyOworCWluZm8tPnBpeG1hcC5mbGFncyA9IEZCX1BJWE1BUF9TWVNURU07CisJaW5mby0+cGl4bWFwLnNjYW5fYWxpZ24gPSAxOworCisJZmItPmZiZGV2ID0gaW5mbzsKKworCXBhci0+bm91dmVhdV9mYiA9IG5vdXZlYXVfZmI7CisJcGFyLT5kZXYgPSBkZXY7CisKKwlzd2l0Y2ggKGRldl9wcml2LT5jYXJkX3R5cGUpIHsKKwljYXNlIE5WXzUwOgorCQludjUwX2ZiY29uX2FjY2VsX2luaXQoaW5mbyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW52MDRfZmJjb25fYWNjZWxfaW5pdChpbmZvKTsKKwkJYnJlYWs7CisJfTsKKworCW5vdXZlYXVfZmJjb25femZpbGwoZGV2KTsKKworCS8qIFRvIGFsbG93IHJlc2l6ZWluZyB3aXRob3V0IHN3YXBwaW5nIGJ1ZmZlcnMgKi8KKwlOVl9JTkZPKGRldiwgImFsbG9jYXRlZCAlZHglZCBmYjogMHglbHgsIGJvICVwXG4iLAorCQkJCQkJbm91dmVhdV9mYi0+YmFzZS53aWR0aCwKKwkJCQkJCW5vdXZlYXVfZmItPmJhc2UuaGVpZ2h0LAorCQkJCQkJbnZiby0+Ym8ub2Zmc2V0LCBudmJvKTsKKworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCXJldHVybiAwOworCitvdXRfdW5yZWY6CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworaW50Citub3V2ZWF1X2ZiY29uX3Byb2JlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJTlZfREVCVUcoZGV2LCAiXG4iKTsKKworCXJldHVybiBkcm1fZmJfaGVscGVyX3NpbmdsZV9mYl9wcm9iZShkZXYsIDMyLCBub3V2ZWF1X2ZiY29uX2NyZWF0ZSk7Cit9CisKK2ludAorbm91dmVhdV9mYmNvbl9yZW1vdmUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIpCit7CisJc3RydWN0IG5vdXZlYXVfZnJhbWVidWZmZXIgKm5vdXZlYXVfZmIgPSBub3V2ZWF1X2ZyYW1lYnVmZmVyKGZiKTsKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKKworCWlmICghZmIpCisJCXJldHVybiAtRUlOVkFMOworCisJaW5mbyA9IGZiLT5mYmRldjsKKwlpZiAoaW5mbykgeworCQlzdHJ1Y3Qgbm91dmVhdV9mYmNvbl9wYXIgKnBhciA9IGluZm8tPnBhcjsKKworCQl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOworCQlub3V2ZWF1X2JvX3VubWFwKG5vdXZlYXVfZmItPm52Ym8pOworCQltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKG5vdXZlYXVfZmItPm52Ym8tPmdlbSk7CisJCW5vdXZlYXVfZmItPm52Ym8gPSBOVUxMOworCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwkJaWYgKHBhcikKKwkJCWRybV9mYl9oZWxwZXJfZnJlZSgmcGFyLT5oZWxwZXIpOworCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mYmNvbi5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mYmNvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MzExNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZiY29uLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNYWFydGVuIE1hYXRodWlzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX05PVVZFQVVfRkJDT05fSF9fCisjZGVmaW5lIF9fTk9VVkVBVV9GQkNPTl9IX18KKworI2luY2x1ZGUgImRybV9mYl9oZWxwZXIuaCIKKworc3RydWN0IG5vdXZlYXVfZmJjb25fcGFyIHsKKwlzdHJ1Y3QgZHJtX2ZiX2hlbHBlciBoZWxwZXI7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9mcmFtZWJ1ZmZlciAqbm91dmVhdV9mYjsKK307CisKK2ludCBub3V2ZWF1X2ZiY29uX3Byb2JlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworaW50IG5vdXZlYXVfZmJjb25fcmVtb3ZlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiKTsKK3ZvaWQgbm91dmVhdV9mYmNvbl9yZXN0b3JlKHZvaWQpOwordm9pZCBub3V2ZWF1X2ZiY29uX3pmaWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCitpbnQgbnYwNF9mYmNvbl9hY2NlbF9pbml0KHN0cnVjdCBmYl9pbmZvICppbmZvKTsKK2ludCBudjUwX2ZiY29uX2FjY2VsX2luaXQoc3RydWN0IGZiX2luZm8gKmluZm8pOworCisjZW5kaWYgLyogX19OVjUwX0ZCQ09OX0hfXyAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZlbmNlLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZlbmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNmZjdlYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZmVuY2UuYwpAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBCZW4gU2tlZ2dzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKworI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9kbWEuaCIKKworI2RlZmluZSBVU0VfUkVGQ05UIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzEwKQorCitzdHJ1Y3Qgbm91dmVhdV9mZW5jZSB7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbm5lbDsKKwlzdHJ1Y3Qga3JlZiByZWZjb3VudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJ5OworCisJdWludDMyX3Qgc2VxdWVuY2U7CisJYm9vbCBzaWduYWxsZWQ7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBub3V2ZWF1X2ZlbmNlICoKK25vdXZlYXVfZmVuY2Uodm9pZCAqc3luY19vYmopCit7CisJcmV0dXJuIChzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqKXN5bmNfb2JqOworfQorCitzdGF0aWMgdm9pZAorbm91dmVhdV9mZW5jZV9kZWwoc3RydWN0IGtyZWYgKnJlZikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqZmVuY2UgPQorCQljb250YWluZXJfb2YocmVmLCBzdHJ1Y3Qgbm91dmVhdV9mZW5jZSwgcmVmY291bnQpOworCisJa2ZyZWUoZmVuY2UpOworfQorCit2b2lkCitub3V2ZWF1X2ZlbmNlX3VwZGF0ZShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGNoYW4tPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnksICp0bXA7CisJc3RydWN0IG5vdXZlYXVfZmVuY2UgKmZlbmNlOworCXVpbnQzMl90IHNlcXVlbmNlOworCisJaWYgKFVTRV9SRUZDTlQpCisJCXNlcXVlbmNlID0gbnZjaGFuX3JkMzIoY2hhbiwgMHg0OCk7CisJZWxzZQorCQlzZXF1ZW5jZSA9IGNoYW4tPmZlbmNlLmxhc3Rfc2VxdWVuY2VfaXJxOworCisJaWYgKGNoYW4tPmZlbmNlLnNlcXVlbmNlX2FjayA9PSBzZXF1ZW5jZSkKKwkJcmV0dXJuOworCWNoYW4tPmZlbmNlLnNlcXVlbmNlX2FjayA9IHNlcXVlbmNlOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKGVudHJ5LCB0bXAsICZjaGFuLT5mZW5jZS5wZW5kaW5nKSB7CisJCWZlbmNlID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IG5vdXZlYXVfZmVuY2UsIGVudHJ5KTsKKworCQlzZXF1ZW5jZSA9IGZlbmNlLT5zZXF1ZW5jZTsKKwkJZmVuY2UtPnNpZ25hbGxlZCA9IHRydWU7CisJCWxpc3RfZGVsKCZmZW5jZS0+ZW50cnkpOworCQlrcmVmX3B1dCgmZmVuY2UtPnJlZmNvdW50LCBub3V2ZWF1X2ZlbmNlX2RlbCk7CisKKwkJaWYgKHNlcXVlbmNlID09IGNoYW4tPmZlbmNlLnNlcXVlbmNlX2FjaykKKwkJCWJyZWFrOworCX0KK30KKworaW50Citub3V2ZWF1X2ZlbmNlX25ldyhzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqKnBmZW5jZSwKKwkJICBib29sIGVtaXQpCit7CisJc3RydWN0IG5vdXZlYXVfZmVuY2UgKmZlbmNlOworCWludCByZXQgPSAwOworCisJZmVuY2UgPSBremFsbG9jKHNpemVvZigqZmVuY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZlbmNlKQorCQlyZXR1cm4gLUVOT01FTTsKKwlrcmVmX2luaXQoJmZlbmNlLT5yZWZjb3VudCk7CisJZmVuY2UtPmNoYW5uZWwgPSBjaGFuOworCisJaWYgKGVtaXQpCisJCXJldCA9IG5vdXZlYXVfZmVuY2VfZW1pdChmZW5jZSk7CisKKwlpZiAocmV0KQorCQlub3V2ZWF1X2ZlbmNlX3VucmVmKCh2b2lkICopJmZlbmNlKTsKKwkqcGZlbmNlID0gZmVuY2U7CisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqCitub3V2ZWF1X2ZlbmNlX2NoYW5uZWwoc3RydWN0IG5vdXZlYXVfZmVuY2UgKmZlbmNlKQoreworCXJldHVybiBmZW5jZSA/IGZlbmNlLT5jaGFubmVsIDogTlVMTDsKK30KKworaW50Citub3V2ZWF1X2ZlbmNlX2VtaXQoc3RydWN0IG5vdXZlYXVfZmVuY2UgKmZlbmNlKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGZlbmNlLT5jaGFubmVsLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBmZW5jZS0+Y2hhbm5lbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIDIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAodW5saWtlbHkoY2hhbi0+ZmVuY2Uuc2VxdWVuY2UgPT0gY2hhbi0+ZmVuY2Uuc2VxdWVuY2VfYWNrIC0gMSkpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW4tPmZlbmNlLmxvY2ssIGZsYWdzKTsKKwkJbm91dmVhdV9mZW5jZV91cGRhdGUoY2hhbik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPmZlbmNlLmxvY2ssIGZsYWdzKTsKKworCQlCVUdfT04oY2hhbi0+ZmVuY2Uuc2VxdWVuY2UgPT0KKwkJICAgICAgIGNoYW4tPmZlbmNlLnNlcXVlbmNlX2FjayAtIDEpOworCX0KKworCWZlbmNlLT5zZXF1ZW5jZSA9ICsrY2hhbi0+ZmVuY2Uuc2VxdWVuY2U7CisKKwlrcmVmX2dldCgmZmVuY2UtPnJlZmNvdW50KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+ZmVuY2UubG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJmZlbmNlLT5lbnRyeSwgJmNoYW4tPmZlbmNlLnBlbmRpbmcpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPmZlbmNlLmxvY2ssIGZsYWdzKTsKKworCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJNMk1GLCBVU0VfUkVGQ05UID8gMHgwMDUwIDogMHgwMTUwLCAxKTsKKwlPVVRfUklORyhjaGFuLCBmZW5jZS0+c2VxdWVuY2UpOworCUZJUkVfUklORyhjaGFuKTsKKworCXJldHVybiAwOworfQorCit2b2lkCitub3V2ZWF1X2ZlbmNlX3VucmVmKHZvaWQgKipzeW5jX29iaikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqZmVuY2UgPSBub3V2ZWF1X2ZlbmNlKCpzeW5jX29iaik7CisKKwlpZiAoZmVuY2UpCisJCWtyZWZfcHV0KCZmZW5jZS0+cmVmY291bnQsIG5vdXZlYXVfZmVuY2VfZGVsKTsKKwkqc3luY19vYmogPSBOVUxMOworfQorCit2b2lkICoKK25vdXZlYXVfZmVuY2VfcmVmKHZvaWQgKnN5bmNfb2JqKQoreworCXN0cnVjdCBub3V2ZWF1X2ZlbmNlICpmZW5jZSA9IG5vdXZlYXVfZmVuY2Uoc3luY19vYmopOworCisJa3JlZl9nZXQoJmZlbmNlLT5yZWZjb3VudCk7CisJcmV0dXJuIHN5bmNfb2JqOworfQorCitib29sCitub3V2ZWF1X2ZlbmNlX3NpZ25hbGxlZCh2b2lkICpzeW5jX29iaiwgdm9pZCAqc3luY19hcmcpCit7CisJc3RydWN0IG5vdXZlYXVfZmVuY2UgKmZlbmNlID0gbm91dmVhdV9mZW5jZShzeW5jX29iaik7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IGZlbmNlLT5jaGFubmVsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZmVuY2UtPnNpZ25hbGxlZCkKKwkJcmV0dXJuIHRydWU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+ZmVuY2UubG9jaywgZmxhZ3MpOworCW5vdXZlYXVfZmVuY2VfdXBkYXRlKGNoYW4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPmZlbmNlLmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gZmVuY2UtPnNpZ25hbGxlZDsKK30KKworaW50Citub3V2ZWF1X2ZlbmNlX3dhaXQodm9pZCAqc3luY19vYmosIHZvaWQgKnN5bmNfYXJnLCBib29sIGxhenksIGJvb2wgaW50cikKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgKDMgKiBEUk1fSFopOworCWludCByZXQgPSAwOworCisJX19zZXRfY3VycmVudF9zdGF0ZShpbnRyID8gVEFTS19JTlRFUlJVUFRJQkxFIDogVEFTS19VTklOVEVSUlVQVElCTEUpOworCisJd2hpbGUgKDEpIHsKKwkJaWYgKG5vdXZlYXVfZmVuY2Vfc2lnbmFsbGVkKHN5bmNfb2JqLCBzeW5jX2FyZykpCisJCQlicmVhazsKKworCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJcmV0ID0gLUVCVVNZOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAobGF6eSkKKwkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisKKwkJaWYgKGludHIgJiYgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldCA9IC1FUkVTVEFSVDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCisJcmV0dXJuIHJldDsKK30KKworaW50Citub3V2ZWF1X2ZlbmNlX2ZsdXNoKHZvaWQgKnN5bmNfb2JqLCB2b2lkICpzeW5jX2FyZykKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbm91dmVhdV9mZW5jZV9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjaGFubmVsKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IE5VTEw7CisKKwlpZiAoY2hhbm5lbCA+PSAwICYmIGNoYW5uZWwgPCBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHMpCisJCWNoYW4gPSBkZXZfcHJpdi0+Zmlmb3NbY2hhbm5lbF07CisKKwlpZiAoY2hhbikgeworCQlzcGluX2xvY2tfaXJxKCZjaGFuLT5mZW5jZS5sb2NrKTsKKwkJbm91dmVhdV9mZW5jZV91cGRhdGUoY2hhbik7CisJCXNwaW5fdW5sb2NrX2lycSgmY2hhbi0+ZmVuY2UubG9jayk7CisJfQorfQorCitpbnQKK25vdXZlYXVfZmVuY2VfaW5pdChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCUlOSVRfTElTVF9IRUFEKCZjaGFuLT5mZW5jZS5wZW5kaW5nKTsKKwlzcGluX2xvY2tfaW5pdCgmY2hhbi0+ZmVuY2UubG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK25vdXZlYXVfZmVuY2VfZmluaShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5LCAqdG1wOworCXN0cnVjdCBub3V2ZWF1X2ZlbmNlICpmZW5jZTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgdG1wLCAmY2hhbi0+ZmVuY2UucGVuZGluZykgeworCQlmZW5jZSA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBub3V2ZWF1X2ZlbmNlLCBlbnRyeSk7CisKKwkJZmVuY2UtPnNpZ25hbGxlZCA9IHRydWU7CisJCWxpc3RfZGVsKCZmZW5jZS0+ZW50cnkpOworCQlrcmVmX3B1dCgmZmVuY2UtPnJlZmNvdW50LCBub3V2ZWF1X2ZlbmNlX2RlbCk7CisJfQorfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9nZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWY4MzFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9nZW0uYwpAQCAtMCwwICsxLDk5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBCZW4gU2tlZ2dzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCisjaW5jbHVkZSAibm91dmVhdV9kbWEuaCIKKworI2RlZmluZSBub3V2ZWF1X2dlbV9wdXNoYnVmX3N5bmMoY2hhbikgMAorCitpbnQKK25vdXZlYXVfZ2VtX29iamVjdF9uZXcoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpnZW0pCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK25vdXZlYXVfZ2VtX29iamVjdF9kZWwoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpnZW0pCit7CisJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8gPSBnZW0tPmRyaXZlcl9wcml2YXRlOworCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8gPSAmbnZiby0+Ym87CisKKwlpZiAoIW52Ym8pCisJCXJldHVybjsKKwludmJvLT5nZW0gPSBOVUxMOworCisJaWYgKHVubGlrZWx5KG52Ym8tPmNwdV9maWxwKSkKKwkJdHRtX2JvX3N5bmNjcHVfd3JpdGVfcmVsZWFzZShibyk7CisKKwlpZiAodW5saWtlbHkobnZiby0+cGluX3JlZmNudCkpIHsKKwkJbnZiby0+cGluX3JlZmNudCA9IDE7CisJCW5vdXZlYXVfYm9fdW5waW4obnZibyk7CisJfQorCisJdHRtX2JvX3VucmVmKCZibyk7Cit9CisKK2ludAorbm91dmVhdV9nZW1fbmV3KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCWludCBzaXplLCBpbnQgYWxpZ24sIHVpbnQzMl90IGZsYWdzLCB1aW50MzJfdCB0aWxlX21vZGUsCisJCXVpbnQzMl90IHRpbGVfZmxhZ3MsIGJvb2wgbm9fdm0sIGJvb2wgbWFwcGFibGUsCisJCXN0cnVjdCBub3V2ZWF1X2JvICoqcG52Ym8pCit7CisJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym87CisJaW50IHJldDsKKworCXJldCA9IG5vdXZlYXVfYm9fbmV3KGRldiwgY2hhbiwgc2l6ZSwgYWxpZ24sIGZsYWdzLCB0aWxlX21vZGUsCisJCQkgICAgIHRpbGVfZmxhZ3MsIG5vX3ZtLCBtYXBwYWJsZSwgcG52Ym8pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJbnZibyA9ICpwbnZibzsKKworCW52Ym8tPmdlbSA9IGRybV9nZW1fb2JqZWN0X2FsbG9jKGRldiwgbnZiby0+Ym8ubWVtLnNpemUpOworCWlmICghbnZiby0+Z2VtKSB7CisJCW5vdXZlYXVfYm9fcmVmKE5VTEwsIHBudmJvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbnZiby0+Ym8ucGVyc2lzdGFudF9zd2FwX3N0b3JhZ2UgPSBudmJvLT5nZW0tPmZpbHA7CisJbnZiby0+Z2VtLT5kcml2ZXJfcHJpdmF0ZSA9IG52Ym87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfZ2VtX2luZm8oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpnZW0sIHN0cnVjdCBkcm1fbm91dmVhdV9nZW1faW5mbyAqcmVwKQoreworCXN0cnVjdCBub3V2ZWF1X2JvICpudmJvID0gbm91dmVhdV9nZW1fb2JqZWN0KGdlbSk7CisKKwlpZiAobnZiby0+Ym8ubWVtLm1lbV90eXBlID09IFRUTV9QTF9UVCkKKwkJcmVwLT5kb21haW4gPSBOT1VWRUFVX0dFTV9ET01BSU5fR0FSVDsKKwllbHNlCisJCXJlcC0+ZG9tYWluID0gTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU07CisKKwlyZXAtPnNpemUgPSBudmJvLT5iby5tZW0ubnVtX3BhZ2VzIDw8IFBBR0VfU0hJRlQ7CisJcmVwLT5vZmZzZXQgPSBudmJvLT5iby5vZmZzZXQ7CisJcmVwLT5tYXBfaGFuZGxlID0gbnZiby0+bWFwcGFibGUgPyBudmJvLT5iby5hZGRyX3NwYWNlX29mZnNldCA6IDA7CisJcmVwLT50aWxlX21vZGUgPSBudmJvLT50aWxlX21vZGU7CisJcmVwLT50aWxlX2ZsYWdzID0gbnZiby0+dGlsZV9mbGFnczsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2wKK25vdXZlYXVfZ2VtX3RpbGVfZmxhZ3NfdmFsaWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgdGlsZV9mbGFncykgeworCXN3aXRjaCAodGlsZV9mbGFncykgeworCWNhc2UgMHgwMDAwOgorCWNhc2UgMHgxODAwOgorCWNhc2UgMHgyODAwOgorCWNhc2UgMHg0ODAwOgorCWNhc2UgMHg3MDAwOgorCWNhc2UgMHg3NDAwOgorCWNhc2UgMHg3YTAwOgorCWNhc2UgMHhlMDAwOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlOVl9FUlJPUihkZXYsICJiYWQgcGFnZSBmbGFnczogMHglMDh4XG4iLCB0aWxlX2ZsYWdzKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCitpbnQKK25vdXZlYXVfZ2VtX2lvY3RsX25ldyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fbm91dmVhdV9nZW1fbmV3ICpyZXEgPSBkYXRhOworCXN0cnVjdCBub3V2ZWF1X2JvICpudmJvID0gTlVMTDsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gTlVMTDsKKwl1aW50MzJfdCBmbGFncyA9IDA7CisJaW50IHJldCA9IDA7CisKKwlOT1VWRUFVX0NIRUNLX0lOSVRJQUxJU0VEX1dJVEhfUkVUVVJOOworCisJaWYgKHVubGlrZWx5KGRldl9wcml2LT50dG0uYmRldi5kZXZfbWFwcGluZyA9PSBOVUxMKSkKKwkJZGV2X3ByaXYtPnR0bS5iZGV2LmRldl9tYXBwaW5nID0gZGV2X3ByaXYtPmRldi0+ZGV2X21hcHBpbmc7CisKKwlpZiAocmVxLT5jaGFubmVsX2hpbnQpIHsKKwkJTk9VVkVBVV9HRVRfVVNFUl9DSEFOTkVMX1dJVEhfUkVUVVJOKHJlcS0+Y2hhbm5lbF9oaW50LAorCQkJCQkJICAgICBmaWxlX3ByaXYsIGNoYW4pOworCX0KKworCWlmIChyZXEtPmluZm8uZG9tYWluICYgTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU0pCisJCWZsYWdzIHw9IFRUTV9QTF9GTEFHX1ZSQU07CisJaWYgKHJlcS0+aW5mby5kb21haW4gJiBOT1VWRUFVX0dFTV9ET01BSU5fR0FSVCkKKwkJZmxhZ3MgfD0gVFRNX1BMX0ZMQUdfVFQ7CisJaWYgKCFmbGFncyB8fCByZXEtPmluZm8uZG9tYWluICYgTk9VVkVBVV9HRU1fRE9NQUlOX0NQVSkKKwkJZmxhZ3MgfD0gVFRNX1BMX0ZMQUdfU1lTVEVNOworCisJaWYgKCFub3V2ZWF1X2dlbV90aWxlX2ZsYWdzX3ZhbGlkKGRldiwgcmVxLT5pbmZvLnRpbGVfZmxhZ3MpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IG5vdXZlYXVfZ2VtX25ldyhkZXYsIGNoYW4sIHJlcS0+aW5mby5zaXplLCByZXEtPmFsaWduLCBmbGFncywKKwkJCSAgICAgIHJlcS0+aW5mby50aWxlX21vZGUsIHJlcS0+aW5mby50aWxlX2ZsYWdzLCBmYWxzZSwKKwkJCSAgICAgIChyZXEtPmluZm8uZG9tYWluICYgTk9VVkVBVV9HRU1fRE9NQUlOX01BUFBBQkxFKSwKKwkJCSAgICAgICZudmJvKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbm91dmVhdV9nZW1faW5mbyhudmJvLT5nZW0sICZyZXEtPmluZm8pOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gZHJtX2dlbV9oYW5kbGVfY3JlYXRlKGZpbGVfcHJpdiwgbnZiby0+Z2VtLCAmcmVxLT5pbmZvLmhhbmRsZSk7CitvdXQ6CisJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCWRybV9nZW1fb2JqZWN0X2hhbmRsZV91bnJlZmVyZW5jZShudmJvLT5nZW0pOworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCisJaWYgKHJldCkKKwkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UobnZiby0+Z2VtKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50Citub3V2ZWF1X2dlbV9zZXRfZG9tYWluKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ2VtLCB1aW50MzJfdCByZWFkX2RvbWFpbnMsCisJCSAgICAgICB1aW50MzJfdCB3cml0ZV9kb21haW5zLCB1aW50MzJfdCB2YWxpZF9kb21haW5zKQoreworCXN0cnVjdCBub3V2ZWF1X2JvICpudmJvID0gZ2VtLT5kcml2ZXJfcHJpdmF0ZTsKKwlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvID0gJm52Ym8tPmJvOworCXVpbnQ2NF90IGZsYWdzOworCisJaWYgKCF2YWxpZF9kb21haW5zIHx8ICghcmVhZF9kb21haW5zICYmICF3cml0ZV9kb21haW5zKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAod3JpdGVfZG9tYWlucykgeworCQlpZiAoKHZhbGlkX2RvbWFpbnMgJiBOT1VWRUFVX0dFTV9ET01BSU5fVlJBTSkgJiYKKwkJICAgICh3cml0ZV9kb21haW5zICYgTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU0pKQorCQkJZmxhZ3MgPSBUVE1fUExfRkxBR19WUkFNOworCQllbHNlCisJCWlmICgodmFsaWRfZG9tYWlucyAmIE5PVVZFQVVfR0VNX0RPTUFJTl9HQVJUKSAmJgorCQkgICAgKHdyaXRlX2RvbWFpbnMgJiBOT1VWRUFVX0dFTV9ET01BSU5fR0FSVCkpCisJCQlmbGFncyA9IFRUTV9QTF9GTEFHX1RUOworCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlpZiAoKHZhbGlkX2RvbWFpbnMgJiBOT1VWRUFVX0dFTV9ET01BSU5fVlJBTSkgJiYKKwkJICAgIChyZWFkX2RvbWFpbnMgJiBOT1VWRUFVX0dFTV9ET01BSU5fVlJBTSkgJiYKKwkJICAgIGJvLT5tZW0ubWVtX3R5cGUgPT0gVFRNX1BMX1ZSQU0pCisJCQlmbGFncyA9IFRUTV9QTF9GTEFHX1ZSQU07CisJCWVsc2UKKwkJaWYgKCh2YWxpZF9kb21haW5zICYgTk9VVkVBVV9HRU1fRE9NQUlOX0dBUlQpICYmCisJCSAgICAocmVhZF9kb21haW5zICYgTk9VVkVBVV9HRU1fRE9NQUlOX0dBUlQpICYmCisJCSAgICBiby0+bWVtLm1lbV90eXBlID09IFRUTV9QTF9UVCkKKwkJCWZsYWdzID0gVFRNX1BMX0ZMQUdfVFQ7CisJCWVsc2UKKwkJaWYgKCh2YWxpZF9kb21haW5zICYgTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU0pICYmCisJCSAgICAocmVhZF9kb21haW5zICYgTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU0pKQorCQkJZmxhZ3MgPSBUVE1fUExfRkxBR19WUkFNOworCQllbHNlCisJCQlmbGFncyA9IFRUTV9QTF9GTEFHX1RUOworCX0KKworCW5vdXZlYXVfYm9fcGxhY2VtZW50X3NldChudmJvLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB2YWxpZGF0ZV9vcCB7CisJc3RydWN0IG5vdXZlYXVfZmVuY2UgKmZlbmNlOworCXN0cnVjdCBsaXN0X2hlYWQgdnJhbV9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgZ2FydF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgYm90aF9saXN0OworfTsKKworc3RhdGljIHZvaWQKK3ZhbGlkYXRlX2ZpbmlfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqZmVuY2UpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnksICp0bXA7CisJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym87CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIHRtcCwgbGlzdCkgeworCQludmJvID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IG5vdXZlYXVfYm8sIGVudHJ5KTsKKwkJaWYgKGxpa2VseShmZW5jZSkpIHsKKwkJCXN0cnVjdCBub3V2ZWF1X2ZlbmNlICpwcmV2X2ZlbmNlOworCisJCQlzcGluX2xvY2soJm52Ym8tPmJvLmxvY2spOworCQkJcHJldl9mZW5jZSA9IG52Ym8tPmJvLnN5bmNfb2JqOworCQkJbnZiby0+Ym8uc3luY19vYmogPSBub3V2ZWF1X2ZlbmNlX3JlZihmZW5jZSk7CisJCQlzcGluX3VubG9jaygmbnZiby0+Ym8ubG9jayk7CisJCQlub3V2ZWF1X2ZlbmNlX3VucmVmKCh2b2lkICopJnByZXZfZmVuY2UpOworCQl9CisKKwkJbGlzdF9kZWwoJm52Ym8tPmVudHJ5KTsKKwkJbnZiby0+cmVzZXJ2ZWRfYnkgPSBOVUxMOworCQl0dG1fYm9fdW5yZXNlcnZlKCZudmJvLT5ibyk7CisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKG52Ym8tPmdlbSk7CisJfQorfQorCitzdGF0aWMgdm9pZAordmFsaWRhdGVfZmluaShzdHJ1Y3QgdmFsaWRhdGVfb3AgKm9wLCBib29sIHN1Y2Nlc3MpCit7CisJc3RydWN0IG5vdXZlYXVfZmVuY2UgKmZlbmNlID0gb3AtPmZlbmNlOworCisJaWYgKHVubGlrZWx5KCFzdWNjZXNzKSkKKwkJb3AtPmZlbmNlID0gTlVMTDsKKworCXZhbGlkYXRlX2ZpbmlfbGlzdCgmb3AtPnZyYW1fbGlzdCwgb3AtPmZlbmNlKTsKKwl2YWxpZGF0ZV9maW5pX2xpc3QoJm9wLT5nYXJ0X2xpc3QsIG9wLT5mZW5jZSk7CisJdmFsaWRhdGVfZmluaV9saXN0KCZvcC0+Ym90aF9saXN0LCBvcC0+ZmVuY2UpOworCW5vdXZlYXVfZmVuY2VfdW5yZWYoKHZvaWQgKikmZmVuY2UpOworfQorCitzdGF0aWMgaW50Cit2YWxpZGF0ZV9pbml0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorCSAgICAgIHN0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1Zl9ibyAqcGJibywKKwkgICAgICBpbnQgbnJfYnVmZmVycywgc3RydWN0IHZhbGlkYXRlX29wICpvcCkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdWludDMyX3Qgc2VxdWVuY2U7CisJaW50IHRyeWNudCA9IDA7CisJaW50IHJldCwgaTsKKworCXNlcXVlbmNlID0gYXRvbWljX2FkZF9yZXR1cm4oMSwgJmRldl9wcml2LT50dG0udmFsaWRhdGVfc2VxdWVuY2UpOworcmV0cnk6CisJaWYgKCsrdHJ5Y250ID4gMTAwMDAwKSB7CisJCU5WX0VSUk9SKGRldiwgIiVzIGZhaWxlZCBhbmQgZ2F2ZSB1cC5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG5yX2J1ZmZlcnM7IGkrKykgeworCQlzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWZfYm8gKmIgPSAmcGJib1tpXTsKKwkJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpnZW07CisJCXN0cnVjdCBub3V2ZWF1X2JvICpudmJvOworCisJCWdlbSA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGVfcHJpdiwgYi0+aGFuZGxlKTsKKwkJaWYgKCFnZW0pIHsKKwkJCU5WX0VSUk9SKGRldiwgIlVua25vd24gaGFuZGxlIDB4JTA4eFxuIiwgYi0+aGFuZGxlKTsKKwkJCXZhbGlkYXRlX2Zpbmkob3AsIE5VTEwpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJbnZibyA9IGdlbS0+ZHJpdmVyX3ByaXZhdGU7CisKKwkJaWYgKG52Ym8tPnJlc2VydmVkX2J5ICYmIG52Ym8tPnJlc2VydmVkX2J5ID09IGZpbGVfcHJpdikgeworCQkJTlZfRVJST1IoZGV2LCAibXVsdGlwbGUgaW5zdGFuY2VzIG9mIGJ1ZmZlciAlZCBvbiAiCisJCQkJICAgICAgInZhbGlkYXRpb24gbGlzdFxuIiwgYi0+aGFuZGxlKTsKKwkJCXZhbGlkYXRlX2Zpbmkob3AsIE5VTEwpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlyZXQgPSB0dG1fYm9fcmVzZXJ2ZSgmbnZiby0+Ym8sIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgc2VxdWVuY2UpOworCQlpZiAocmV0KSB7CisJCQl2YWxpZGF0ZV9maW5pKG9wLCBOVUxMKTsKKwkJCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJCQlyZXQgPSB0dG1fYm9fd2FpdF91bnJlc2VydmVkKCZudmJvLT5ibywgZmFsc2UpOworCQkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoZ2VtKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKworCQludmJvLT5yZXNlcnZlZF9ieSA9IGZpbGVfcHJpdjsKKwkJbnZiby0+cGJib19pbmRleCA9IGk7CisJCWlmICgoYi0+dmFsaWRfZG9tYWlucyAmIE5PVVZFQVVfR0VNX0RPTUFJTl9WUkFNKSAmJgorCQkgICAgKGItPnZhbGlkX2RvbWFpbnMgJiBOT1VWRUFVX0dFTV9ET01BSU5fR0FSVCkpCisJCQlsaXN0X2FkZF90YWlsKCZudmJvLT5lbnRyeSwgJm9wLT5ib3RoX2xpc3QpOworCQllbHNlCisJCWlmIChiLT52YWxpZF9kb21haW5zICYgTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU0pCisJCQlsaXN0X2FkZF90YWlsKCZudmJvLT5lbnRyeSwgJm9wLT52cmFtX2xpc3QpOworCQllbHNlCisJCWlmIChiLT52YWxpZF9kb21haW5zICYgTk9VVkVBVV9HRU1fRE9NQUlOX0dBUlQpCisJCQlsaXN0X2FkZF90YWlsKCZudmJvLT5lbnRyeSwgJm9wLT5nYXJ0X2xpc3QpOworCQllbHNlIHsKKwkJCU5WX0VSUk9SKGRldiwgImludmFsaWQgdmFsaWQgZG9tYWluczogMHglMDh4XG4iLAorCQkJCSBiLT52YWxpZF9kb21haW5zKTsKKwkJCXZhbGlkYXRlX2Zpbmkob3AsIE5VTEwpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJm52Ym8tPmJvLmNwdV93cml0ZXJzKSA+IDApKSB7CisJCQl2YWxpZGF0ZV9maW5pKG9wLCBOVUxMKTsKKworCQkJaWYgKG52Ym8tPmNwdV9maWxwID09IGZpbGVfcHJpdikgeworCQkJCU5WX0VSUk9SKGRldiwgImJvICVwIG1hcHBlZCBieSBwcm9jZXNzIHRyeWluZyAiCisJCQkJCSAgICAgICJ0byB2YWxpZGF0ZSBpdCFcbiIsIG52Ym8pOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQlyZXQgPSB0dG1fYm9fd2FpdF9jcHUoJm52Ym8tPmJvLCBmYWxzZSk7CisJCQlpZiAocmV0ID09IC1FUkVTVEFSVCkKKwkJCQlyZXQgPSAtRUFHQUlOOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQkJZ290byByZXRyeTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit2YWxpZGF0ZV9saXN0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCisJICAgICAgc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX2JvICpwYmJvLCB1aW50NjRfdCB1c2VyX3BiYm9fcHRyKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1Zl9ibyBfX3VzZXIgKnVwYmJvID0KKwkJCQkodm9pZCBfX2ZvcmNlIF9fdXNlciAqKSh1aW50cHRyX3QpdXNlcl9wYmJvX3B0cjsKKwlzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibzsKKwlpbnQgcmV0LCByZWxvY3MgPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShudmJvLCBsaXN0LCBlbnRyeSkgeworCQlzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWZfYm8gKmIgPSAmcGJib1tudmJvLT5wYmJvX2luZGV4XTsKKwkJc3RydWN0IG5vdXZlYXVfZmVuY2UgKnByZXZfZmVuY2UgPSBudmJvLT5iby5zeW5jX29iajsKKworCQlpZiAocHJldl9mZW5jZSAmJiBub3V2ZWF1X2ZlbmNlX2NoYW5uZWwocHJldl9mZW5jZSkgIT0gY2hhbikgeworCQkJc3Bpbl9sb2NrKCZudmJvLT5iby5sb2NrKTsKKwkJCXJldCA9IHR0bV9ib193YWl0KCZudmJvLT5ibywgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisJCQlzcGluX3VubG9jaygmbnZiby0+Ym8ubG9jayk7CisJCQlpZiAodW5saWtlbHkocmV0KSkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcmV0ID0gbm91dmVhdV9nZW1fc2V0X2RvbWFpbihudmJvLT5nZW0sIGItPnJlYWRfZG9tYWlucywKKwkJCQkJICAgICBiLT53cml0ZV9kb21haW5zLAorCQkJCQkgICAgIGItPnZhbGlkX2RvbWFpbnMpOworCQlpZiAodW5saWtlbHkocmV0KSkKKwkJCXJldHVybiByZXQ7CisKKwkJbnZiby0+Y2hhbm5lbCA9IGNoYW47CisJCXJldCA9IHR0bV9ib192YWxpZGF0ZSgmbnZiby0+Ym8sICZudmJvLT5wbGFjZW1lbnQsCisJCQkJICAgICAgZmFsc2UsIGZhbHNlKTsKKwkJbnZiby0+Y2hhbm5lbCA9IE5VTEw7CisJCWlmICh1bmxpa2VseShyZXQpKQorCQkJcmV0dXJuIHJldDsKKworCQlpZiAobnZiby0+Ym8ub2Zmc2V0ID09IGItPnByZXN1bWVkX29mZnNldCAmJgorCQkgICAgKChudmJvLT5iby5tZW0ubWVtX3R5cGUgPT0gVFRNX1BMX1ZSQU0gJiYKKwkJICAgICAgYi0+cHJlc3VtZWRfZG9tYWluICYgTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU0pIHx8CisJCSAgICAgKG52Ym8tPmJvLm1lbS5tZW1fdHlwZSA9PSBUVE1fUExfVFQgJiYKKwkJICAgICAgYi0+cHJlc3VtZWRfZG9tYWluICYgTk9VVkVBVV9HRU1fRE9NQUlOX0dBUlQpKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChudmJvLT5iby5tZW0ubWVtX3R5cGUgPT0gVFRNX1BMX1RUKQorCQkJYi0+cHJlc3VtZWRfZG9tYWluID0gTk9VVkVBVV9HRU1fRE9NQUlOX0dBUlQ7CisJCWVsc2UKKwkJCWItPnByZXN1bWVkX2RvbWFpbiA9IE5PVVZFQVVfR0VNX0RPTUFJTl9WUkFNOworCQliLT5wcmVzdW1lZF9vZmZzZXQgPSBudmJvLT5iby5vZmZzZXQ7CisJCWItPnByZXN1bWVkX29rID0gMDsKKwkJcmVsb2NzKys7CisKKwkJaWYgKERSTV9DT1BZX1RPX1VTRVIoJnVwYmJvW252Ym8tPnBiYm9faW5kZXhdLCBiLCBzaXplb2YoKmIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiByZWxvY3M7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfZ2VtX3B1c2hidWZfdmFsaWRhdGUoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJCSAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCQkgICAgIHN0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1Zl9ibyAqcGJibywKKwkJCSAgICAgdWludDY0X3QgdXNlcl9idWZmZXJzLCBpbnQgbnJfYnVmZmVycywKKwkJCSAgICAgc3RydWN0IHZhbGlkYXRlX29wICpvcCwgaW50ICphcHBseV9yZWxvY3MpCit7CisJaW50IHJldCwgcmVsb2NzID0gMDsKKworCUlOSVRfTElTVF9IRUFEKCZvcC0+dnJhbV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmb3AtPmdhcnRfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJm9wLT5ib3RoX2xpc3QpOworCisJcmV0ID0gbm91dmVhdV9mZW5jZV9uZXcoY2hhbiwgJm9wLT5mZW5jZSwgZmFsc2UpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAobnJfYnVmZmVycyA9PSAwKQorCQlyZXR1cm4gMDsKKworCXJldCA9IHZhbGlkYXRlX2luaXQoY2hhbiwgZmlsZV9wcml2LCBwYmJvLCBucl9idWZmZXJzLCBvcCk7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB2YWxpZGF0ZV9saXN0KGNoYW4sICZvcC0+dnJhbV9saXN0LCBwYmJvLCB1c2VyX2J1ZmZlcnMpOworCWlmICh1bmxpa2VseShyZXQgPCAwKSkgeworCQl2YWxpZGF0ZV9maW5pKG9wLCBOVUxMKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmVsb2NzICs9IHJldDsKKworCXJldCA9IHZhbGlkYXRlX2xpc3QoY2hhbiwgJm9wLT5nYXJ0X2xpc3QsIHBiYm8sIHVzZXJfYnVmZmVycyk7CisJaWYgKHVubGlrZWx5KHJldCA8IDApKSB7CisJCXZhbGlkYXRlX2Zpbmkob3AsIE5VTEwpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZWxvY3MgKz0gcmV0OworCisJcmV0ID0gdmFsaWRhdGVfbGlzdChjaGFuLCAmb3AtPmJvdGhfbGlzdCwgcGJibywgdXNlcl9idWZmZXJzKTsKKwlpZiAodW5saWtlbHkocmV0IDwgMCkpIHsKKwkJdmFsaWRhdGVfZmluaShvcCwgTlVMTCk7CisJCXJldHVybiByZXQ7CisJfQorCXJlbG9jcyArPSByZXQ7CisKKwkqYXBwbHlfcmVsb2NzID0gcmVsb2NzOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKgordV9tZW1jcHlhKHVpbnQ2NF90IHVzZXIsIHVuc2lnbmVkIG5tZW1iLCB1bnNpZ25lZCBzaXplKQoreworCXZvaWQgKm1lbTsKKwl2b2lkIF9fdXNlciAqdXNlcnB0ciA9ICh2b2lkIF9fZm9yY2UgX191c2VyICopKHVpbnRwdHJfdCl1c2VyOworCisJbWVtID0ga21hbGxvYyhubWVtYiAqIHNpemUsIEdGUF9LRVJORUwpOworCWlmICghbWVtKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIobWVtLCB1c2VycHRyLCBubWVtYiAqIHNpemUpKSB7CisJCWtmcmVlKG1lbSk7CisJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOworCX0KKworCXJldHVybiBtZW07Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfZ2VtX3B1c2hidWZfcmVsb2NfYXBwbHkoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IG5yX2JvLAorCQkJCXN0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1Zl9ibyAqYm8sCisJCQkJaW50IG5yX3JlbG9jcywgdWludDY0X3QgcHRyX3JlbG9jcywKKwkJCQlpbnQgbnJfZHdvcmRzLCBpbnQgZmlyc3RfZHdvcmQsCisJCQkJdWludDMyX3QgKnB1c2hidWYsIGJvb2wgaXNfaW9tZW0pCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX3JlbG9jICpyZWxvYyA9IE5VTEw7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlpbnQgcmV0ID0gMCwgaTsKKworCXJlbG9jID0gdV9tZW1jcHlhKHB0cl9yZWxvY3MsIG5yX3JlbG9jcywgc2l6ZW9mKCpyZWxvYykpOworCWlmIChJU19FUlIocmVsb2MpKQorCQlyZXR1cm4gUFRSX0VSUihyZWxvYyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfcmVsb2NzOyBpKyspIHsKKwkJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX3JlbG9jICpyID0gJnJlbG9jW2ldOworCQlzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWZfYm8gKmI7CisJCXVpbnQzMl90IGRhdGE7CisKKwkJaWYgKHItPmJvX2luZGV4ID49IG5yX2JvIHx8IHItPnJlbG9jX2luZGV4IDwgZmlyc3RfZHdvcmQgfHwKKwkJICAgIHItPnJlbG9jX2luZGV4ID49IGZpcnN0X2R3b3JkICsgbnJfZHdvcmRzKSB7CisJCQlOVl9FUlJPUihkZXYsICJCYWQgcmVsb2NhdGlvbiAlZFxuIiwgaSk7CisJCQlOVl9FUlJPUihkZXYsICIgIGJvOiAlZCBtYXggJWRcbiIsIHItPmJvX2luZGV4LCBucl9ibyk7CisJCQlOVl9FUlJPUihkZXYsICIgIGlkOiAlZCBtYXggJWRcbiIsIHItPnJlbG9jX2luZGV4LCBucl9kd29yZHMpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJYiA9ICZib1tyLT5ib19pbmRleF07CisJCWlmIChiLT5wcmVzdW1lZF9vaykKKwkJCWNvbnRpbnVlOworCisJCWlmIChyLT5mbGFncyAmIE5PVVZFQVVfR0VNX1JFTE9DX0xPVykKKwkJCWRhdGEgPSBiLT5wcmVzdW1lZF9vZmZzZXQgKyByLT5kYXRhOworCQllbHNlCisJCWlmIChyLT5mbGFncyAmIE5PVVZFQVVfR0VNX1JFTE9DX0hJR0gpCisJCQlkYXRhID0gKGItPnByZXN1bWVkX29mZnNldCArIHItPmRhdGEpID4+IDMyOworCQllbHNlCisJCQlkYXRhID0gci0+ZGF0YTsKKworCQlpZiAoci0+ZmxhZ3MgJiBOT1VWRUFVX0dFTV9SRUxPQ19PUikgeworCQkJaWYgKGItPnByZXN1bWVkX2RvbWFpbiA9PSBOT1VWRUFVX0dFTV9ET01BSU5fR0FSVCkKKwkJCQlkYXRhIHw9IHItPnRvcjsKKwkJCWVsc2UKKwkJCQlkYXRhIHw9IHItPnZvcjsKKwkJfQorCisJCWlmIChpc19pb21lbSkKKwkJCWlvd3JpdGUzMl9uYXRpdmUoZGF0YSwgKHZvaWQgX19mb3JjZSBfX2lvbWVtICopCisJCQkJCQkmcHVzaGJ1ZltyLT5yZWxvY19pbmRleF0pOworCQllbHNlCisJCQlwdXNoYnVmW3ItPnJlbG9jX2luZGV4XSA9IGRhdGE7CisJfQorCisJa2ZyZWUocmVsb2MpOworCXJldHVybiByZXQ7Cit9CisKK2ludAorbm91dmVhdV9nZW1faW9jdGxfcHVzaGJ1ZihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWYgKnJlcSA9IGRhdGE7CisJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX2JvICpibyA9IE5VTEw7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbjsKKwlzdHJ1Y3QgdmFsaWRhdGVfb3Agb3A7CisJdWludDMyX3QgKnB1c2hidWYgPSBOVUxMOworCWludCByZXQgPSAwLCBkb19yZWxvYyA9IDAsIGk7CisKKwlOT1VWRUFVX0NIRUNLX0lOSVRJQUxJU0VEX1dJVEhfUkVUVVJOOworCU5PVVZFQVVfR0VUX1VTRVJfQ0hBTk5FTF9XSVRIX1JFVFVSTihyZXEtPmNoYW5uZWwsIGZpbGVfcHJpdiwgY2hhbik7CisKKwlpZiAocmVxLT5ucl9kd29yZHMgPj0gY2hhbi0+ZG1hLm1heCB8fAorCSAgICByZXEtPm5yX2J1ZmZlcnMgPiBOT1VWRUFVX0dFTV9NQVhfQlVGRkVSUyB8fAorCSAgICByZXEtPm5yX3JlbG9jcyA+IE5PVVZFQVVfR0VNX01BWF9SRUxPQ1MpIHsKKwkJTlZfRVJST1IoZGV2LCAiUHVzaGJ1ZiBjb25maWcgZXhjZWVkcyBsaW1pdHM6XG4iKTsKKwkJTlZfRVJST1IoZGV2LCAiICBkd29yZHMgOiAlZCBtYXggJWRcbiIsIHJlcS0+bnJfZHdvcmRzLAorCQkJIGNoYW4tPmRtYS5tYXggLSAxKTsKKwkJTlZfRVJST1IoZGV2LCAiICBidWZmZXJzOiAlZCBtYXggJWRcbiIsIHJlcS0+bnJfYnVmZmVycywKKwkJCSBOT1VWRUFVX0dFTV9NQVhfQlVGRkVSUyk7CisJCU5WX0VSUk9SKGRldiwgIiAgcmVsb2NzIDogJWQgbWF4ICVkXG4iLCByZXEtPm5yX3JlbG9jcywKKwkJCSBOT1VWRUFVX0dFTV9NQVhfUkVMT0NTKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHVzaGJ1ZiA9IHVfbWVtY3B5YShyZXEtPmR3b3JkcywgcmVxLT5ucl9kd29yZHMsIHNpemVvZih1aW50MzJfdCkpOworCWlmIChJU19FUlIocHVzaGJ1ZikpCisJCXJldHVybiBQVFJfRVJSKHB1c2hidWYpOworCisJYm8gPSB1X21lbWNweWEocmVxLT5idWZmZXJzLCByZXEtPm5yX2J1ZmZlcnMsIHNpemVvZigqYm8pKTsKKwlpZiAoSVNfRVJSKGJvKSkgeworCQlrZnJlZShwdXNoYnVmKTsKKwkJcmV0dXJuIFBUUl9FUlIoYm8pOworCX0KKworCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKworCS8qIFZhbGlkYXRlIGJ1ZmZlciBsaXN0ICovCisJcmV0ID0gbm91dmVhdV9nZW1fcHVzaGJ1Zl92YWxpZGF0ZShjaGFuLCBmaWxlX3ByaXYsIGJvLCByZXEtPmJ1ZmZlcnMsCisJCQkJCSAgIHJlcS0+bnJfYnVmZmVycywgJm9wLCAmZG9fcmVsb2MpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJLyogQXBwbHkgYW55IHJlbG9jYXRpb25zIHRoYXQgYXJlIHJlcXVpcmVkICovCisJaWYgKGRvX3JlbG9jKSB7CisJCXJldCA9IG5vdXZlYXVfZ2VtX3B1c2hidWZfcmVsb2NfYXBwbHkoY2hhbiwgcmVxLT5ucl9idWZmZXJzLAorCQkJCQkJICAgICAgYm8sIHJlcS0+bnJfcmVsb2NzLAorCQkJCQkJICAgICAgcmVxLT5yZWxvY3MsCisJCQkJCQkgICAgICByZXEtPm5yX2R3b3JkcywgMCwKKwkJCQkJCSAgICAgIHB1c2hidWYsIGZhbHNlKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKworCS8qIEVtaXQgcHVzaCBidWZmZXIgdG8gdGhlIGh3CisJICovCisJcmV0ID0gUklOR19TUEFDRShjaGFuLCByZXEtPm5yX2R3b3Jkcyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlPVVRfUklOR3AoY2hhbiwgcHVzaGJ1ZiwgcmVxLT5ucl9kd29yZHMpOworCisJcmV0ID0gbm91dmVhdV9mZW5jZV9lbWl0KG9wLmZlbmNlKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgImVycm9yIGZlbmNpbmcgcHVzaGJ1ZjogJWRcbiIsIHJldCk7CisJCVdJTkRfUklORyhjaGFuKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKG5vdXZlYXVfZ2VtX3B1c2hidWZfc3luYyhjaGFuKSkgeworCQlyZXQgPSBub3V2ZWF1X2ZlbmNlX3dhaXQob3AuZmVuY2UsIE5VTEwsIGZhbHNlLCBmYWxzZSk7CisJCWlmIChyZXQpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCByZXEtPm5yX2R3b3JkczsgaSsrKQorCQkJCU5WX0VSUk9SKGRldiwgIjB4JTA4eFxuIiwgcHVzaGJ1ZltpXSk7CisJCQlOVl9FUlJPUihkZXYsICJeXiBhYm92ZSBwdXNoIGJ1ZmZlciBpcyBmYWlsIDooXG4iKTsKKwkJfQorCX0KKworb3V0OgorCXZhbGlkYXRlX2ZpbmkoJm9wLCByZXQgPT0gMCk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJa2ZyZWUocHVzaGJ1Zik7CisJa2ZyZWUoYm8pOworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgUFVTSEJVRl9DQUwgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfMjApCisKK2ludAorbm91dmVhdV9nZW1faW9jdGxfcHVzaGJ1Zl9jYWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCQkgICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWZfY2FsbCAqcmVxID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWZfYm8gKmJvID0gTlVMTDsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuOworCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ2VtOworCXN0cnVjdCBub3V2ZWF1X2JvICpwYmJvOworCXN0cnVjdCB2YWxpZGF0ZV9vcCBvcDsKKwlpbnQgaSwgcmV0ID0gMCwgZG9fcmVsb2MgPSAwOworCisJTk9VVkVBVV9DSEVDS19JTklUSUFMSVNFRF9XSVRIX1JFVFVSTjsKKwlOT1VWRUFVX0dFVF9VU0VSX0NIQU5ORUxfV0lUSF9SRVRVUk4ocmVxLT5jaGFubmVsLCBmaWxlX3ByaXYsIGNoYW4pOworCisJaWYgKHVubGlrZWx5KHJlcS0+aGFuZGxlID09IDApKQorCQlnb3RvIG91dF9uZXh0OworCisJaWYgKHJlcS0+bnJfYnVmZmVycyA+IE5PVVZFQVVfR0VNX01BWF9CVUZGRVJTIHx8CisJICAgIHJlcS0+bnJfcmVsb2NzID4gTk9VVkVBVV9HRU1fTUFYX1JFTE9DUykgeworCQlOVl9FUlJPUihkZXYsICJQdXNoYnVmIGNvbmZpZyBleGNlZWRzIGxpbWl0czpcbiIpOworCQlOVl9FUlJPUihkZXYsICIgIGJ1ZmZlcnM6ICVkIG1heCAlZFxuIiwgcmVxLT5ucl9idWZmZXJzLAorCQkJIE5PVVZFQVVfR0VNX01BWF9CVUZGRVJTKTsKKwkJTlZfRVJST1IoZGV2LCAiICByZWxvY3MgOiAlZCBtYXggJWRcbiIsIHJlcS0+bnJfcmVsb2NzLAorCQkJIE5PVVZFQVVfR0VNX01BWF9SRUxPQ1MpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlibyA9IHVfbWVtY3B5YShyZXEtPmJ1ZmZlcnMsIHJlcS0+bnJfYnVmZmVycywgc2l6ZW9mKCpibykpOworCWlmIChJU19FUlIoYm8pKQorCQlyZXR1cm4gUFRSX0VSUihibyk7CisKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisKKwkvKiBWYWxpZGF0ZSBidWZmZXIgbGlzdCAqLworCXJldCA9IG5vdXZlYXVfZ2VtX3B1c2hidWZfdmFsaWRhdGUoY2hhbiwgZmlsZV9wcml2LCBibywgcmVxLT5idWZmZXJzLAorCQkJCQkgICByZXEtPm5yX2J1ZmZlcnMsICZvcCwgJmRvX3JlbG9jKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgInZhbGlkYXRlOiAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogVmFsaWRhdGUgRE1BIHB1c2ggYnVmZmVyICovCisJZ2VtID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZV9wcml2LCByZXEtPmhhbmRsZSk7CisJaWYgKCFnZW0pIHsKKwkJTlZfRVJST1IoZGV2LCAiVW5rbm93biBwYiBoYW5kbGUgMHglMDh4XG4iLCByZXEtPmhhbmRsZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwlwYmJvID0gbm91dmVhdV9nZW1fb2JqZWN0KGdlbSk7CisKKwlyZXQgPSB0dG1fYm9fcmVzZXJ2ZSgmcGJiby0+Ym8sIGZhbHNlLCBmYWxzZSwgdHJ1ZSwKKwkJCSAgICAgY2hhbi0+ZmVuY2Uuc2VxdWVuY2UpOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAicmVzdiBwYjogJWRcbiIsIHJldCk7CisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKGdlbSk7CisJCWdvdG8gb3V0OworCX0KKworCW5vdXZlYXVfYm9fcGxhY2VtZW50X3NldChwYmJvLCAxIDw8IGNoYW4tPnB1c2hidWZfYm8tPmJvLm1lbS5tZW1fdHlwZSk7CisJcmV0ID0gdHRtX2JvX3ZhbGlkYXRlKCZwYmJvLT5ibywgJnBiYm8tPnBsYWNlbWVudCwgZmFsc2UsIGZhbHNlKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgInZhbGlkYXRlIHBiOiAlZFxuIiwgcmV0KTsKKwkJdHRtX2JvX3VucmVzZXJ2ZSgmcGJiby0+Ym8pOworCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShnZW0pOworCQlnb3RvIG91dDsKKwl9CisKKwlsaXN0X2FkZF90YWlsKCZwYmJvLT5lbnRyeSwgJm9wLmJvdGhfbGlzdCk7CisKKwkvKiBJZiBwcmVzdW1lZCByZXR1cm4gYWRkcmVzcyBkb2Vzbid0IG1hdGNoLCB3ZSBuZWVkIHRvIG1hcCB0aGUKKwkgKiBwdXNoIGJ1ZmZlciBhbmQgZml4IGl0Li4KKwkgKi8KKwlpZiAoIVBVU0hCVUZfQ0FMKSB7CisJCXVpbnQzMl90IHJldGFkZHk7CisKKwkJaWYgKGNoYW4tPmRtYS5mcmVlIDwgNCArIE5PVVZFQVVfRE1BX1NLSVBTKSB7CisJCQlyZXQgPSBub3V2ZWF1X2RtYV93YWl0KGNoYW4sIDQgKyBOT1VWRUFVX0RNQV9TS0lQUyk7CisJCQlpZiAocmV0KSB7CisJCQkJTlZfRVJST1IoZGV2LCAiam1wX3NwYWNlOiAlZFxuIiwgcmV0KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCisJCXJldGFkZHkgID0gY2hhbi0+cHVzaGJ1Zl9iYXNlICsgKChjaGFuLT5kbWEuY3VyICsgMikgPDwgMik7CisJCXJldGFkZHkgfD0gMHgyMDAwMDAwMDsKKwkJaWYgKHJldGFkZHkgIT0gcmVxLT5zdWZmaXgwKSB7CisJCQlyZXEtPnN1ZmZpeDAgPSByZXRhZGR5OworCQkJZG9fcmVsb2MgPSAxOworCQl9CisJfQorCisJLyogQXBwbHkgYW55IHJlbG9jYXRpb25zIHRoYXQgYXJlIHJlcXVpcmVkICovCisJaWYgKGRvX3JlbG9jKSB7CisJCXZvaWQgKnBidmlydDsKKwkJYm9vbCBpc19pb21lbTsKKwkJcmV0ID0gdHRtX2JvX2ttYXAoJnBiYm8tPmJvLCAwLCBwYmJvLT5iby5tZW0ubnVtX3BhZ2VzLAorCQkJCSAgJnBiYm8tPmttYXApOworCQlpZiAocmV0KSB7CisJCQlOVl9FUlJPUihkZXYsICJrbWFwIHBiOiAlZFxuIiwgcmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJcGJ2aXJ0ID0gdHRtX2ttYXBfb2JqX3ZpcnR1YWwoJnBiYm8tPmttYXAsICZpc19pb21lbSk7CisJCXJldCA9IG5vdXZlYXVfZ2VtX3B1c2hidWZfcmVsb2NfYXBwbHkoY2hhbiwgcmVxLT5ucl9idWZmZXJzLCBibywKKwkJCQkJCSAgICAgIHJlcS0+bnJfcmVsb2NzLAorCQkJCQkJICAgICAgcmVxLT5yZWxvY3MsCisJCQkJCQkgICAgICByZXEtPm5yX2R3b3JkcywKKwkJCQkJCSAgICAgIHJlcS0+b2Zmc2V0IC8gNCwKKwkJCQkJCSAgICAgIHBidmlydCwgaXNfaW9tZW0pOworCisJCWlmICghUFVTSEJVRl9DQUwpIHsKKwkJCW5vdXZlYXVfYm9fd3IzMihwYmJvLAorCQkJCQlyZXEtPm9mZnNldCAvIDQgKyByZXEtPm5yX2R3b3JkcyAtIDIsCisJCQkJCXJlcS0+c3VmZml4MCk7CisJCX0KKworCQl0dG1fYm9fa3VubWFwKCZwYmJvLT5rbWFwKTsKKwkJaWYgKHJldCkgeworCQkJTlZfRVJST1IoZGV2LCAicmVsb2MgYXBwbHk6ICVkXG4iLCByZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAoUFVTSEJVRl9DQUwpIHsKKwkJcmV0ID0gUklOR19TUEFDRShjaGFuLCAyKTsKKwkJaWYgKHJldCkgeworCQkJTlZfRVJST1IoZGV2LCAiY2FsX3NwYWNlOiAlZFxuIiwgcmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJCU9VVF9SSU5HKGNoYW4sICgocGJiby0+Ym8ubWVtLm1tX25vZGUtPnN0YXJ0IDw8IFBBR0VfU0hJRlQpICsKKwkJCQkgIHJlcS0+b2Zmc2V0KSB8IDIpOworCQlPVVRfUklORyhjaGFuLCAwKTsKKwl9IGVsc2UgeworCQlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIDIgKyBOT1VWRUFVX0RNQV9TS0lQUyk7CisJCWlmIChyZXQpIHsKKwkJCU5WX0VSUk9SKGRldiwgImptcF9zcGFjZTogJWRcbiIsIHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlPVVRfUklORyhjaGFuLCAoKHBiYm8tPmJvLm1lbS5tbV9ub2RlLT5zdGFydCA8PCBQQUdFX1NISUZUKSArCisJCQkJICByZXEtPm9mZnNldCkgfCAweDIwMDAwMDAwKTsKKwkJT1VUX1JJTkcoY2hhbiwgMCk7CisKKwkJLyogU3BhY2UgdGhlIGp1bXBzIGFwYXJ0IHdpdGggTk9Qcy4gKi8KKwkJZm9yIChpID0gMDsgaSA8IE5PVVZFQVVfRE1BX1NLSVBTOyBpKyspCisJCQlPVVRfUklORyhjaGFuLCAwKTsKKwl9CisKKwlyZXQgPSBub3V2ZWF1X2ZlbmNlX2VtaXQob3AuZmVuY2UpOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiZXJyb3IgZmVuY2luZyBwdXNoYnVmOiAlZFxuIiwgcmV0KTsKKwkJV0lORF9SSU5HKGNoYW4pOworCQlnb3RvIG91dDsKKwl9CisKK291dDoKKwl2YWxpZGF0ZV9maW5pKCZvcCwgcmV0ID09IDApOworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCWtmcmVlKGJvKTsKKworb3V0X25leHQ6CisJaWYgKFBVU0hCVUZfQ0FMKSB7CisJCXJlcS0+c3VmZml4MCA9IDB4MDAwMjAwMDA7CisJCXJlcS0+c3VmZml4MSA9IDB4MDAwMDAwMDA7CisJfSBlbHNlIHsKKwkJcmVxLT5zdWZmaXgwID0gMHgyMDAwMDAwMCB8CisJCQkgICAgICAoY2hhbi0+cHVzaGJ1Zl9iYXNlICsgKChjaGFuLT5kbWEuY3VyICsgMikgPDwgMikpOworCQlyZXEtPnN1ZmZpeDEgPSAweDAwMDAwMDAwOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludAorbm91dmVhdV9nZW1faW9jdGxfcHVzaGJ1Zl9jYWxsMihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX2NhbGwgKnJlcSA9IGRhdGE7CisKKwlyZXEtPnZyYW1fYXZhaWxhYmxlID0gZGV2X3ByaXYtPmZiX2FwZXJfZnJlZTsKKwlyZXEtPmdhcnRfYXZhaWxhYmxlID0gZGV2X3ByaXYtPmdhcnRfaW5mby5hcGVyX2ZyZWU7CisKKwlyZXR1cm4gbm91dmVhdV9nZW1faW9jdGxfcHVzaGJ1Zl9jYWxsKGRldiwgZGF0YSwgZmlsZV9wcml2KTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdAorZG9tYWluX3RvX3R0bShzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibywgdWludDMyX3QgZG9tYWluKQoreworCXVpbnQzMl90IGZsYWdzID0gMDsKKworCWlmIChkb21haW4gJiBOT1VWRUFVX0dFTV9ET01BSU5fVlJBTSkKKwkJZmxhZ3MgfD0gVFRNX1BMX0ZMQUdfVlJBTTsKKwlpZiAoZG9tYWluICYgTk9VVkVBVV9HRU1fRE9NQUlOX0dBUlQpCisJCWZsYWdzIHw9IFRUTV9QTF9GTEFHX1RUOworCisJcmV0dXJuIGZsYWdzOworfQorCitpbnQKK25vdXZlYXVfZ2VtX2lvY3RsX3BpbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3BpbiAqcmVxID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmdlbTsKKwlzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibzsKKwlpbnQgcmV0ID0gMDsKKworCU5PVVZFQVVfQ0hFQ0tfSU5JVElBTElTRURfV0lUSF9SRVRVUk47CisKKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkgeworCQlOVl9FUlJPUihkZXYsICJwaW4gb25seSBhbGxvd2VkIHdpdGhvdXQga2VybmVsIG1vZGVzZXR0aW5nXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFEUk1fU1VTRVIoRFJNX0NVUlBST0MpKQorCQlyZXR1cm4gLUVQRVJNOworCisJZ2VtID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZV9wcml2LCByZXEtPmhhbmRsZSk7CisJaWYgKCFnZW0pCisJCXJldHVybiAtRUlOVkFMOworCW52Ym8gPSBub3V2ZWF1X2dlbV9vYmplY3QoZ2VtKTsKKworCXJldCA9IG5vdXZlYXVfYm9fcGluKG52Ym8sIGRvbWFpbl90b190dG0obnZibywgcmVxLT5kb21haW4pKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJlcS0+b2Zmc2V0ID0gbnZiby0+Ym8ub2Zmc2V0OworCWlmIChudmJvLT5iby5tZW0ubWVtX3R5cGUgPT0gVFRNX1BMX1RUKQorCQlyZXEtPmRvbWFpbiA9IE5PVVZFQVVfR0VNX0RPTUFJTl9HQVJUOworCWVsc2UKKwkJcmVxLT5kb21haW4gPSBOT1VWRUFVX0dFTV9ET01BSU5fVlJBTTsKKworb3V0OgorCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShnZW0pOworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworaW50Citub3V2ZWF1X2dlbV9pb2N0bF91bnBpbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9waW4gKnJlcSA9IGRhdGE7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpnZW07CisJaW50IHJldDsKKworCU5PVVZFQVVfQ0hFQ0tfSU5JVElBTElTRURfV0lUSF9SRVRVUk47CisKKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlnZW0gPSBkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlX3ByaXYsIHJlcS0+aGFuZGxlKTsKKwlpZiAoIWdlbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBub3V2ZWF1X2JvX3VucGluKG5vdXZlYXVfZ2VtX29iamVjdChnZW0pKTsKKworCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShnZW0pOworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworaW50Citub3V2ZWF1X2dlbV9pb2N0bF9jcHVfcHJlcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9jcHVfcHJlcCAqcmVxID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmdlbTsKKwlzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibzsKKwlib29sIG5vX3dhaXQgPSAhIShyZXEtPmZsYWdzICYgTk9VVkVBVV9HRU1fQ1BVX1BSRVBfTk9XQUlUKTsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCU5PVVZFQVVfQ0hFQ0tfSU5JVElBTElTRURfV0lUSF9SRVRVUk47CisKKwlnZW0gPSBkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlX3ByaXYsIHJlcS0+aGFuZGxlKTsKKwlpZiAoIWdlbSkKKwkJcmV0dXJuIHJldDsKKwludmJvID0gbm91dmVhdV9nZW1fb2JqZWN0KGdlbSk7CisKKwlpZiAobnZiby0+Y3B1X2ZpbHApIHsKKwkJaWYgKG52Ym8tPmNwdV9maWxwID09IGZpbGVfcHJpdikKKwkJCWdvdG8gb3V0OworCisJCXJldCA9IHR0bV9ib193YWl0X2NwdSgmbnZiby0+Ym8sIG5vX3dhaXQpOworCQlpZiAocmV0ID09IC1FUkVTVEFSVCkKKwkJCXJldCA9IC1FQUdBSU47CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocmVxLT5mbGFncyAmIE5PVVZFQVVfR0VNX0NQVV9QUkVQX05PQkxPQ0spIHsKKwkJcmV0ID0gdHRtX2JvX3dhaXQoJm52Ym8tPmJvLCBmYWxzZSwgZmFsc2UsIG5vX3dhaXQpOworCX0gZWxzZSB7CisJCXJldCA9IHR0bV9ib19zeW5jY3B1X3dyaXRlX2dyYWIoJm52Ym8tPmJvLCBub193YWl0KTsKKwkJaWYgKHJldCA9PSAtRVJFU1RBUlQpCisJCQlyZXQgPSAtRUFHQUlOOworCQllbHNlCisJCWlmIChyZXQgPT0gMCkKKwkJCW52Ym8tPmNwdV9maWxwID0gZmlsZV9wcml2OworCX0KKworb3V0OgorCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShnZW0pOworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK2ludAorbm91dmVhdV9nZW1faW9jdGxfY3B1X2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJCSAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9nZW1fY3B1X3ByZXAgKnJlcSA9IGRhdGE7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpnZW07CisJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym87CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlOT1VWRUFVX0NIRUNLX0lOSVRJQUxJU0VEX1dJVEhfUkVUVVJOOworCisJZ2VtID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZV9wcml2LCByZXEtPmhhbmRsZSk7CisJaWYgKCFnZW0pCisJCXJldHVybiByZXQ7CisJbnZibyA9IG5vdXZlYXVfZ2VtX29iamVjdChnZW0pOworCisJaWYgKG52Ym8tPmNwdV9maWxwICE9IGZpbGVfcHJpdikKKwkJZ290byBvdXQ7CisJbnZiby0+Y3B1X2ZpbHAgPSBOVUxMOworCisJdHRtX2JvX3N5bmNjcHVfd3JpdGVfcmVsZWFzZSgmbnZiby0+Ym8pOworCXJldCA9IDA7CisKK291dDoKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoZ2VtKTsKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK25vdXZlYXVfZ2VtX2lvY3RsX2luZm8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJICAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9nZW1faW5mbyAqcmVxID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmdlbTsKKwlpbnQgcmV0OworCisJTk9VVkVBVV9DSEVDS19JTklUSUFMSVNFRF9XSVRIX1JFVFVSTjsKKworCWdlbSA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGVfcHJpdiwgcmVxLT5oYW5kbGUpOworCWlmICghZ2VtKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IG5vdXZlYXVfZ2VtX2luZm8oZ2VtLCByZXEpOworCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShnZW0pOworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaHcuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaHcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzQ2NzkyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9ody5jCkBAIC0wLDAgKzEsMTA4MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA2IERhdmUgQWlybGllCisgKiBDb3B5cmlnaHQgMjAwNyBNYWFydGVuIE1hYXRodWlzCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA5IFN0dWFydCBCZW5uZXR0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9ody5oIgorCisjZGVmaW5lIENISVBTRVRfTkZPUkNFIDB4MDFhMAorI2RlZmluZSBDSElQU0VUX05GT1JDRTIgMHgwMWYwCisKKy8qCisgKiBtaXNjIGh3IGFjY2VzcyB3cmFwcGVycy9jb250cm9sIGZ1bmN0aW9ucworICovCisKK3ZvaWQKK05WV3JpdGVWZ2FTZXEoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGhlYWQsIHVpbnQ4X3QgaW5kZXgsIHVpbnQ4X3QgdmFsdWUpCit7CisJTlZXcml0ZVBSTVZJTyhkZXYsIGhlYWQsIE5WX1BSTVZJT19TUlgsIGluZGV4KTsKKwlOVldyaXRlUFJNVklPKGRldiwgaGVhZCwgTlZfUFJNVklPX1NSLCB2YWx1ZSk7Cit9CisKK3VpbnQ4X3QKK05WUmVhZFZnYVNlcShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaGVhZCwgdWludDhfdCBpbmRleCkKK3sKKwlOVldyaXRlUFJNVklPKGRldiwgaGVhZCwgTlZfUFJNVklPX1NSWCwgaW5kZXgpOworCXJldHVybiBOVlJlYWRQUk1WSU8oZGV2LCBoZWFkLCBOVl9QUk1WSU9fU1IpOworfQorCit2b2lkCitOVldyaXRlVmdhR3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGhlYWQsIHVpbnQ4X3QgaW5kZXgsIHVpbnQ4X3QgdmFsdWUpCit7CisJTlZXcml0ZVBSTVZJTyhkZXYsIGhlYWQsIE5WX1BSTVZJT19HUlgsIGluZGV4KTsKKwlOVldyaXRlUFJNVklPKGRldiwgaGVhZCwgTlZfUFJNVklPX0dYLCB2YWx1ZSk7Cit9CisKK3VpbnQ4X3QKK05WUmVhZFZnYUdyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBoZWFkLCB1aW50OF90IGluZGV4KQoreworCU5WV3JpdGVQUk1WSU8oZGV2LCBoZWFkLCBOVl9QUk1WSU9fR1JYLCBpbmRleCk7CisJcmV0dXJuIE5WUmVhZFBSTVZJTyhkZXYsIGhlYWQsIE5WX1BSTVZJT19HWCk7Cit9CisKKy8qIENSNDQgdGFrZXMgdmFsdWVzIDAgKGhlYWQgQSksIDMgKGhlYWQgQikgYW5kIDQgKGhlYWRzIHRpZWQpCisgKiBpdCBhZmZlY3RzIG9ubHkgdGhlIDggYml0IHZnYSBpbyByZWdzLCB3aGljaCB3ZSBhY2Nlc3MgdXNpbmcgbW1pbyBhdAorICogMHhjezAsMn0zYyosIDB4NjB7MSwzfTMqLCBhbmQgMHg2OHsxLDN9M2QqCisgKiBpbiBnZW5lcmFsLCB0aGUgc2V0IHZhbHVlIG9mIGNyNDQgZG9lcyBub3QgbWF0dGVyOiByZWcgYWNjZXNzIHdvcmtzIGFzCisgKiBleHBlY3RlZCBhbmQgdmFsdWVzIGNhbiBiZSBzZXQgZm9yIHRoZSBhcHByb3ByaWF0ZSBoZWFkIGJ5IHVzaW5nIGEgMHgyMDAwCisgKiBvZmZzZXQgYXMgcmVxdWlyZWQKKyAqIGhvd2V2ZXI6CisgKiBhKSBwcmUgbnY0MCwgdGhlIGhlYWQgQiByYW5nZSBvZiBQUk1WSU8gcmVncyBhdCAweGMyM2MqIHdhcyBub3QgZXhwb3NlZCBhbmQKKyAqICAgIGNyNDQgbXVzdCBiZSBzZXQgdG8gMCBvciAzIGZvciBhY2Nlc3NpbmcgdmFsdWVzIG9uIHRoZSBjb3JyZWN0IGhlYWQKKyAqICAgIHRocm91Z2ggdGhlIGNvbW1vbiAweGMwM2MqIGFkZHJlc3NlcworICogYikgaW4gdGllZCBtb2RlICg0KSBoZWFkIEIgaXMgcHJvZ3JhbW1lZCB0byB0aGUgdmFsdWVzIHNldCBvbiBoZWFkIEEsIGFuZAorICogICAgYWNjZXNzIHVzaW5nIHRoZSBoZWFkIEIgYWRkcmVzc2VzIGNhbiBoYXZlIHN0cmFuZ2UgcmVzdWx0cywgZXJnbyB3ZSBsZWF2ZQorICogICAgdGllZCBtb2RlIGluIGluaXQgb25jZSB3ZSBrbm93IHRvIHdoYXQgY3I0NCBzaG91bGQgYmUgcmVzdG9yZWQgb24gZXhpdAorICoKKyAqIHRoZSBvd25lciBwYXJhbWV0ZXIgaXMgc2xpZ2h0bHkgYWJ1c2VkOgorICogMCBhbmQgMSBhcmUgdHJlYXRlZCBhcyBoZWFkIHZhbHVlcyBhbmQgc28gdGhlIHNldCB2YWx1ZSBpcyAob3duZXIgKiAzKQorICogb3RoZXIgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIGxpdGVyYWwgdmFsdWVzIHRvIHNldAorICovCit2b2lkCitOVlNldE93bmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBvd25lcikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKG93bmVyID09IDEpCisJCW93bmVyICo9IDM7CisKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHgxMSkgeworCQkvKiBUaGlzIG1pZ2h0IHNlZW0gc3R1cGlkLCBidXQgdGhlIGJsb2IgZG9lcyBpdCBhbmQKKwkJICogb21pdHRpbmcgaXQgb2Z0ZW4gbG9ja3MgdGhlIHN5c3RlbSB1cC4KKwkJICovCisJCU5WUmVhZFZnYUNydGMoZGV2LCAwLCBOVl9DSU9fU1JfTE9DS19JTkRFWCk7CisJCU5WUmVhZFZnYUNydGMoZGV2LCAxLCBOVl9DSU9fU1JfTE9DS19JTkRFWCk7CisJfQorCisJLyogQ1I0NCBpcyBhbHdheXMgY2hhbmdlZCBvbiBDUlRDMCAqLworCU5WV3JpdGVWZ2FDcnRjKGRldiwgMCwgTlZfQ0lPX0NSRV80NCwgb3duZXIpOworCisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID09IDB4MTEpIHsJLyogc2V0IG1lIGhhcmRlciAqLworCQlOVldyaXRlVmdhQ3J0YyhkZXYsIDAsIE5WX0NJT19DUkVfMkUsIG93bmVyKTsKKwkJTlZXcml0ZVZnYUNydGMoZGV2LCAwLCBOVl9DSU9fQ1JFXzJFLCBvd25lcik7CisJfQorfQorCit2b2lkCitOVkJsYW5rU2NyZWVuKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBoZWFkLCBib29sIGJsYW5rKQoreworCXVuc2lnbmVkIGNoYXIgc2VxMTsKKworCWlmIChudl90d29faGVhZHMoZGV2KSkKKwkJTlZTZXRPd25lcihkZXYsIGhlYWQpOworCisJc2VxMSA9IE5WUmVhZFZnYVNlcShkZXYsIGhlYWQsIE5WX1ZJT19TUl9DTE9DS19JTkRFWCk7CisKKwlOVlZnYVNlcVJlc2V0KGRldiwgaGVhZCwgdHJ1ZSk7CisJaWYgKGJsYW5rKQorCQlOVldyaXRlVmdhU2VxKGRldiwgaGVhZCwgTlZfVklPX1NSX0NMT0NLX0lOREVYLCBzZXExIHwgMHgyMCk7CisJZWxzZQorCQlOVldyaXRlVmdhU2VxKGRldiwgaGVhZCwgTlZfVklPX1NSX0NMT0NLX0lOREVYLCBzZXExICYgfjB4MjApOworCU5WVmdhU2VxUmVzZXQoZGV2LCBoZWFkLCBmYWxzZSk7Cit9CisKKy8qCisgKiBQTEwgc2V0dGluZworICovCisKK3N0YXRpYyBpbnQKK3Bvd2VyY3RybF8xX3NoaWZ0KGludCBjaGlwX3ZlcnNpb24sIGludCByZWcpCit7CisJaW50IHNoaWZ0ID0gLTQ7CisKKwlpZiAoY2hpcF92ZXJzaW9uIDwgMHgxNyB8fCBjaGlwX3ZlcnNpb24gPT0gMHgxYSB8fCBjaGlwX3ZlcnNpb24gPT0gMHgyMCkKKwkJcmV0dXJuIHNoaWZ0OworCisJc3dpdGNoIChyZWcpIHsKKwljYXNlIE5WX1JBTURBQ19WUExMMjoKKwkJc2hpZnQgKz0gNDsKKwljYXNlIE5WX1BSQU1EQUNfVlBMTF9DT0VGRjoKKwkJc2hpZnQgKz0gNDsKKwljYXNlIE5WX1BSQU1EQUNfTVBMTF9DT0VGRjoKKwkJc2hpZnQgKz0gNDsKKwljYXNlIE5WX1BSQU1EQUNfTlZQTExfQ09FRkY6CisJCXNoaWZ0ICs9IDQ7CisJfQorCisJLyoKKwkgKiB0aGUgc2hpZnQgZm9yIHZwbGwgcmVncyBpcyBvbmx5IHVzZWQgZm9yIG52M3ggY2hpcHMgd2l0aCBhIHNpbmdsZQorCSAqIHN0YWdlIHBsbAorCSAqLworCWlmIChzaGlmdCA+IDQgJiYgKGNoaXBfdmVyc2lvbiA8IDB4MzIgfHwgY2hpcF92ZXJzaW9uID09IDB4MzUgfHwKKwkJCSAgY2hpcF92ZXJzaW9uID09IDB4MzYgfHwgY2hpcF92ZXJzaW9uID49IDB4NDApKQorCQlzaGlmdCA9IC00OworCisJcmV0dXJuIHNoaWZ0OworfQorCitzdGF0aWMgdm9pZAorc2V0UExMX3NpbmdsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCByZWcsIHN0cnVjdCBub3V2ZWF1X3BsbF92YWxzICpwdikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBjaGlwX3ZlcnNpb24gPSBkZXZfcHJpdi0+dmJpb3MtPmNoaXBfdmVyc2lvbjsKKwl1aW50MzJfdCBvbGRwbGwgPSBOVlJlYWRSQU1EQUMoZGV2LCAwLCByZWcpOworCWludCBvbGROID0gKG9sZHBsbCA+PiA4KSAmIDB4ZmYsIG9sZE0gPSBvbGRwbGwgJiAweGZmOworCXVpbnQzMl90IHBsbCA9IChvbGRwbGwgJiAweGZmZjgwMDAwKSB8IHB2LT5sb2cyUCA8PCAxNiB8IHB2LT5OTTE7CisJdWludDMyX3Qgc2F2ZWRfcG93ZXJjdHJsXzEgPSAwOworCWludCBzaGlmdF9wb3dlcmN0cmxfMSA9IHBvd2VyY3RybF8xX3NoaWZ0KGNoaXBfdmVyc2lvbiwgcmVnKTsKKworCWlmIChvbGRwbGwgPT0gcGxsKQorCQlyZXR1cm47CS8qIGFscmVhZHkgc2V0ICovCisKKwlpZiAoc2hpZnRfcG93ZXJjdHJsXzEgPj0gMCkgeworCQlzYXZlZF9wb3dlcmN0cmxfMSA9IG52UmVhZE1DKGRldiwgTlZfUEJVU19QT1dFUkNUUkxfMSk7CisJCW52V3JpdGVNQyhkZXYsIE5WX1BCVVNfUE9XRVJDVFJMXzEsCisJCQkoc2F2ZWRfcG93ZXJjdHJsXzEgJiB+KDB4ZiA8PCBzaGlmdF9wb3dlcmN0cmxfMSkpIHwKKwkJCTEgPDwgc2hpZnRfcG93ZXJjdHJsXzEpOworCX0KKworCWlmIChvbGRNICYmIHB2LT5NMSAmJiAob2xkTiAvIG9sZE0gPCBwdi0+TjEgLyBwdi0+TTEpKQorCQkvKiB1cGNsb2NrIC0tIHdyaXRlIG5ldyBwb3N0IGRpdmlkZXIgZmlyc3QgKi8KKwkJTlZXcml0ZVJBTURBQyhkZXYsIDAsIHJlZywgcHYtPmxvZzJQIDw8IDE2IHwgKG9sZHBsbCAmIDB4ZmZmZikpOworCWVsc2UKKwkJLyogZG93bmNsb2NrIC0tIHdyaXRlIG5ldyBOTSBmaXJzdCAqLworCQlOVldyaXRlUkFNREFDKGRldiwgMCwgcmVnLCAob2xkcGxsICYgMHhmZmZmMDAwMCkgfCBwdi0+Tk0xKTsKKworCWlmIChjaGlwX3ZlcnNpb24gPCAweDE3ICYmIGNoaXBfdmVyc2lvbiAhPSAweDExKQorCQkvKiB3YWl0IGEgYml0IG9uIG9sZGVyIGNoaXBzICovCisJCW1zbGVlcCg2NCk7CisJTlZSZWFkUkFNREFDKGRldiwgMCwgcmVnKTsKKworCS8qIHRoZW4gd3JpdGUgdGhlIG90aGVyIGhhbGYgYXMgd2VsbCAqLworCU5WV3JpdGVSQU1EQUMoZGV2LCAwLCByZWcsIHBsbCk7CisKKwlpZiAoc2hpZnRfcG93ZXJjdHJsXzEgPj0gMCkKKwkJbnZXcml0ZU1DKGRldiwgTlZfUEJVU19QT1dFUkNUUkxfMSwgc2F2ZWRfcG93ZXJjdHJsXzEpOworfQorCitzdGF0aWMgdWludDMyX3QKK25ld19yYW1kYWM1ODAodWludDMyX3QgcmVnMSwgYm9vbCBzcywgdWludDMyX3QgcmFtZGFjNTgwKQoreworCWJvb2wgaGVhZF9hID0gKHJlZzEgPT0gTlZfUFJBTURBQ19WUExMX0NPRUZGKTsKKworCWlmIChzcykJLyogc2luZ2xlIHN0YWdlIHBsbCBtb2RlICovCisJCXJhbWRhYzU4MCB8PSBoZWFkX2EgPyBOVl9SQU1EQUNfNTgwX1ZQTEwxX0FDVElWRSA6CisJCQkJICAgICAgTlZfUkFNREFDXzU4MF9WUExMMl9BQ1RJVkU7CisJZWxzZQorCQlyYW1kYWM1ODAgJj0gaGVhZF9hID8gfk5WX1JBTURBQ181ODBfVlBMTDFfQUNUSVZFIDoKKwkJCQkgICAgICB+TlZfUkFNREFDXzU4MF9WUExMMl9BQ1RJVkU7CisKKwlyZXR1cm4gcmFtZGFjNTgwOworfQorCitzdGF0aWMgdm9pZAorc2V0UExMX2RvdWJsZV9oaWdocmVncyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCByZWcxLAorCQkgICAgICAgc3RydWN0IG5vdXZlYXVfcGxsX3ZhbHMgKnB2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGNoaXBfdmVyc2lvbiA9IGRldl9wcml2LT52Ymlvcy0+Y2hpcF92ZXJzaW9uOworCWJvb2wgbnYzMDM1ID0gY2hpcF92ZXJzaW9uID09IDB4MzAgfHwgY2hpcF92ZXJzaW9uID09IDB4MzU7CisJdWludDMyX3QgcmVnMiA9IHJlZzEgKyAoKHJlZzEgPT0gTlZfUkFNREFDX1ZQTEwyKSA/IDB4NWMgOiAweDcwKTsKKwl1aW50MzJfdCBvbGRwbGwxID0gTlZSZWFkUkFNREFDKGRldiwgMCwgcmVnMSk7CisJdWludDMyX3Qgb2xkcGxsMiA9ICFudjMwMzUgPyBOVlJlYWRSQU1EQUMoZGV2LCAwLCByZWcyKSA6IDA7CisJdWludDMyX3QgcGxsMSA9IChvbGRwbGwxICYgMHhmZmY4MDAwMCkgfCBwdi0+bG9nMlAgPDwgMTYgfCBwdi0+Tk0xOworCXVpbnQzMl90IHBsbDIgPSAob2xkcGxsMiAmIDB4N2ZmZjAwMDApIHwgMSA8PCAzMSB8IHB2LT5OTTI7CisJdWludDMyX3Qgb2xkcmFtZGFjNTgwID0gMCwgcmFtZGFjNTgwID0gMDsKKwlib29sIHNpbmdsZV9zdGFnZSA9ICFwdi0+Tk0yIHx8IHB2LT5OMiA9PSBwdi0+TTI7CS8qIG52NDErIG9ubHkgKi8KKwl1aW50MzJfdCBzYXZlZF9wb3dlcmN0cmxfMSA9IDAsIHNhdmVkYzA0MCA9IDA7CisJaW50IHNoaWZ0X3Bvd2VyY3RybF8xID0gcG93ZXJjdHJsXzFfc2hpZnQoY2hpcF92ZXJzaW9uLCByZWcxKTsKKworCS8qIG1vZGVsIHNwZWNpZmljIGFkZGl0aW9ucyB0byBnZW5lcmljIHBsbDEgYW5kIHBsbDIgc2V0IHVwIGFib3ZlICovCisJaWYgKG52MzAzNSkgeworCQlwbGwxID0gKHBsbDEgJiAweGZjYzdmZmZmKSB8IChwdi0+TjIgJiAweDE4KSA8PCAyMSB8CisJCSAgICAgICAocHYtPk4yICYgMHg3KSA8PCAxOSB8IDggPDwgNCB8IChwdi0+TTIgJiA3KSA8PCA0OworCQlwbGwyID0gMDsKKwl9CisJaWYgKGNoaXBfdmVyc2lvbiA+IDB4NDAgJiYgcmVnMSA+PSBOVl9QUkFNREFDX1ZQTExfQ09FRkYpIHsgLyogIW52NDAgKi8KKwkJb2xkcmFtZGFjNTgwID0gTlZSZWFkUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ181ODApOworCQlyYW1kYWM1ODAgPSBuZXdfcmFtZGFjNTgwKHJlZzEsIHNpbmdsZV9zdGFnZSwgb2xkcmFtZGFjNTgwKTsKKwkJaWYgKG9sZHJhbWRhYzU4MCAhPSByYW1kYWM1ODApCisJCQlvbGRwbGwxID0gfjA7CS8qIGZvcmNlIG1pc21hdGNoICovCisJCWlmIChzaW5nbGVfc3RhZ2UpCisJCQkvKiBtYWdpYyB2YWx1ZSB1c2VkIGJ5IG52aWRpYSBpbiBzaW5nbGUgc3RhZ2UgbW9kZSAqLworCQkJcGxsMiB8PSAweDAxMWY7CisJfQorCWlmIChjaGlwX3ZlcnNpb24gPiAweDcwKQorCQkvKiBtYWdpYyBiaXRzIHNldCBieSB0aGUgYmxvYiAoYnV0IG5vdCB0aGUgYmlvcykgb24gZzcxLTczICovCisJCXBsbDEgPSAocGxsMSAmIDB4N2ZmZmZmZmYpIHwgKHNpbmdsZV9zdGFnZSA/IDB4NCA6IDB4YykgPDwgMjg7CisKKwlpZiAob2xkcGxsMSA9PSBwbGwxICYmIG9sZHBsbDIgPT0gcGxsMikKKwkJcmV0dXJuOwkvKiBhbHJlYWR5IHNldCAqLworCisJaWYgKHNoaWZ0X3Bvd2VyY3RybF8xID49IDApIHsKKwkJc2F2ZWRfcG93ZXJjdHJsXzEgPSBudlJlYWRNQyhkZXYsIE5WX1BCVVNfUE9XRVJDVFJMXzEpOworCQludldyaXRlTUMoZGV2LCBOVl9QQlVTX1BPV0VSQ1RSTF8xLAorCQkJKHNhdmVkX3Bvd2VyY3RybF8xICYgfigweGYgPDwgc2hpZnRfcG93ZXJjdHJsXzEpKSB8CisJCQkxIDw8IHNoaWZ0X3Bvd2VyY3RybF8xKTsKKwl9CisKKwlpZiAoY2hpcF92ZXJzaW9uID49IDB4NDApIHsKKwkJaW50IHNoaWZ0X2MwNDAgPSAxNDsKKworCQlzd2l0Y2ggKHJlZzEpIHsKKwkJY2FzZSBOVl9QUkFNREFDX01QTExfQ09FRkY6CisJCQlzaGlmdF9jMDQwICs9IDI7CisJCWNhc2UgTlZfUFJBTURBQ19OVlBMTF9DT0VGRjoKKwkJCXNoaWZ0X2MwNDAgKz0gMjsKKwkJY2FzZSBOVl9SQU1EQUNfVlBMTDI6CisJCQlzaGlmdF9jMDQwICs9IDI7CisJCWNhc2UgTlZfUFJBTURBQ19WUExMX0NPRUZGOgorCQkJc2hpZnRfYzA0MCArPSAyOworCQl9CisKKwkJc2F2ZWRjMDQwID0gbnZSZWFkTUMoZGV2LCAweGMwNDApOworCQlpZiAoc2hpZnRfYzA0MCAhPSAxNCkKKwkJCW52V3JpdGVNQyhkZXYsIDB4YzA0MCwgc2F2ZWRjMDQwICYgfigzIDw8IHNoaWZ0X2MwNDApKTsKKwl9CisKKwlpZiAob2xkcmFtZGFjNTgwICE9IHJhbWRhYzU4MCkKKwkJTlZXcml0ZVJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfNTgwLCByYW1kYWM1ODApOworCisJaWYgKCFudjMwMzUpCisJCU5WV3JpdGVSQU1EQUMoZGV2LCAwLCByZWcyLCBwbGwyKTsKKwlOVldyaXRlUkFNREFDKGRldiwgMCwgcmVnMSwgcGxsMSk7CisKKwlpZiAoc2hpZnRfcG93ZXJjdHJsXzEgPj0gMCkKKwkJbnZXcml0ZU1DKGRldiwgTlZfUEJVU19QT1dFUkNUUkxfMSwgc2F2ZWRfcG93ZXJjdHJsXzEpOworCWlmIChjaGlwX3ZlcnNpb24gPj0gMHg0MCkKKwkJbnZXcml0ZU1DKGRldiwgMHhjMDQwLCBzYXZlZGMwNDApOworfQorCitzdGF0aWMgdm9pZAorc2V0UExMX2RvdWJsZV9sb3dyZWdzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IE5NTk1yZWcsCisJCSAgICAgIHN0cnVjdCBub3V2ZWF1X3BsbF92YWxzICpwdikKK3sKKwkvKiBXaGVuIHNldHRpbmcgUExMcywgdGhlcmUgaXMgYSBtZXJyeSBnYW1lIG9mIGRpc2FibGluZyBhbmQgZW5hYmxpbmcKKwkgKiB2YXJpb3VzIGJpdHMgb2YgaGFyZHdhcmUgZHVyaW5nIHRoZSBwcm9jZXNzLiBUaGlzIGZ1bmN0aW9uIGlzIGEKKwkgKiBzeW50aGVzaXMgb2Ygc2l4IG52NHggdHJhY2VzLCBuZWFybHkgZWFjaCBjYXJkIGRvaW5nIGEgc3VidGx5CisJICogZGlmZmVyZW50IHRoaW5nLiBXaXRoIGx1Y2sgYWxsIHRoZSBuZWNlc3NhcnkgYml0cyBmb3IgZWFjaCBjYXJkIGFyZQorCSAqIGNvbWJpbmVkIGhlcmVpbi4gV2l0aG91dCBsdWNrIGl0IGRldmlhdGVzIGZyb20gZWFjaCBjYXJkJ3MgZm9ybXVsYQorCSAqIHNvIGFzIHRvIG5vdCB3b3JrIG9uIGFueSA6KQorCSAqLworCisJdWludDMyX3QgUHJlZyA9IE5NTk1yZWcgLSA0OworCWJvb2wgbXBsbCA9IFByZWcgPT0gMHg0MDIwOworCXVpbnQzMl90IG9sZFB2YWwgPSBudlJlYWRNQyhkZXYsIFByZWcpOworCXVpbnQzMl90IE5NTk0gPSBwdi0+Tk0yIDw8IDE2IHwgcHYtPk5NMTsKKwl1aW50MzJfdCBQdmFsID0gKG9sZFB2YWwgJiAobXBsbCA/IH4oMHgxMSA8PCAxNikgOiB+KDEgPDwgMTYpKSkgfAorCQkJMHhjIDw8IDI4IHwgcHYtPmxvZzJQIDw8IDE2OworCXVpbnQzMl90IHNhdmVkNDYwMCA9IDA7CisJLyogc29tZSBjYXJkcyBoYXZlIGRpZmZlcmVudCBtYXNrYzA0MHMgKi8KKwl1aW50MzJfdCBtYXNrYzA0MCA9IH4oMyA8PCAxNCksIHNhdmVkYzA0MDsKKwlib29sIHNpbmdsZV9zdGFnZSA9ICFwdi0+Tk0yIHx8IHB2LT5OMiA9PSBwdi0+TTI7CisKKwlpZiAobnZSZWFkTUMoZGV2LCBOTU5NcmVnKSA9PSBOTU5NICYmIChvbGRQdmFsICYgMHhjMDA3MDAwMCkgPT0gUHZhbCkKKwkJcmV0dXJuOworCisJaWYgKFByZWcgPT0gMHg0MDAwKQorCQltYXNrYzA0MCA9IH4weDMzMzsKKwlpZiAoUHJlZyA9PSAweDQwNTgpCisJCW1hc2tjMDQwID0gfigweGMgPDwgMjQpOworCisJaWYgKG1wbGwpIHsKKwkJc3RydWN0IHBsbF9saW1zIHBsbF9saW07CisJCXVpbnQ4X3QgUHZhbDI7CisKKwkJaWYgKGdldF9wbGxfbGltaXRzKGRldiwgUHJlZywgJnBsbF9saW0pKQorCQkJcmV0dXJuOworCisJCVB2YWwyID0gcHYtPmxvZzJQICsgcGxsX2xpbS5sb2cycF9iaWFzOworCQlpZiAoUHZhbDIgPiBwbGxfbGltLm1heF9sb2cycCkKKwkJCVB2YWwyID0gcGxsX2xpbS5tYXhfbG9nMnA7CisJCVB2YWwgfD0gMSA8PCAyOCB8IFB2YWwyIDw8IDIwOworCisJCXNhdmVkNDYwMCA9IG52UmVhZE1DKGRldiwgMHg0NjAwKTsKKwkJbnZXcml0ZU1DKGRldiwgMHg0NjAwLCBzYXZlZDQ2MDAgfCA4IDw8IDI4KTsKKwl9CisJaWYgKHNpbmdsZV9zdGFnZSkKKwkJUHZhbCB8PSBtcGxsID8gMSA8PCAxMiA6IDEgPDwgODsKKworCW52V3JpdGVNQyhkZXYsIFByZWcsIG9sZFB2YWwgfCAxIDw8IDI4KTsKKwludldyaXRlTUMoZGV2LCBQcmVnLCBQdmFsICYgfig0IDw8IDI4KSk7CisJaWYgKG1wbGwpIHsKKwkJUHZhbCB8PSA4IDw8IDIwOworCQludldyaXRlTUMoZGV2LCAweDQwMjAsIFB2YWwgJiB+KDB4YyA8PCAyOCkpOworCQludldyaXRlTUMoZGV2LCAweDQwMzgsIFB2YWwgJiB+KDB4YyA8PCAyOCkpOworCX0KKworCXNhdmVkYzA0MCA9IG52UmVhZE1DKGRldiwgMHhjMDQwKTsKKwludldyaXRlTUMoZGV2LCAweGMwNDAsIHNhdmVkYzA0MCAmIG1hc2tjMDQwKTsKKworCW52V3JpdGVNQyhkZXYsIE5NTk1yZWcsIE5NTk0pOworCWlmIChOTU5NcmVnID09IDB4NDAyNCkKKwkJbnZXcml0ZU1DKGRldiwgMHg0MDNjLCBOTU5NKTsKKworCW52V3JpdGVNQyhkZXYsIFByZWcsIFB2YWwpOworCWlmIChtcGxsKSB7CisJCVB2YWwgJj0gfig4IDw8IDIwKTsKKwkJbnZXcml0ZU1DKGRldiwgMHg0MDIwLCBQdmFsKTsKKwkJbnZXcml0ZU1DKGRldiwgMHg0MDM4LCBQdmFsKTsKKwkJbnZXcml0ZU1DKGRldiwgMHg0NjAwLCBzYXZlZDQ2MDApOworCX0KKworCW52V3JpdGVNQyhkZXYsIDB4YzA0MCwgc2F2ZWRjMDQwKTsKKworCWlmIChtcGxsKSB7CisJCW52V3JpdGVNQyhkZXYsIDB4NDAyMCwgUHZhbCAmIH4oMSA8PCAyOCkpOworCQludldyaXRlTUMoZGV2LCAweDQwMzgsIFB2YWwgJiB+KDEgPDwgMjgpKTsKKwl9Cit9CisKK3ZvaWQKK25vdXZlYXVfaHdfc2V0cGxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IHJlZzEsCisJCSAgc3RydWN0IG5vdXZlYXVfcGxsX3ZhbHMgKnB2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGN2ID0gZGV2X3ByaXYtPnZiaW9zLT5jaGlwX3ZlcnNpb247CisKKwlpZiAoY3YgPT0gMHgzMCB8fCBjdiA9PSAweDMxIHx8IGN2ID09IDB4MzUgfHwgY3YgPT0gMHgzNiB8fAorCSAgICBjdiA+PSAweDQwKSB7CisJCWlmIChyZWcxID4gMHg0MDVjKQorCQkJc2V0UExMX2RvdWJsZV9oaWdocmVncyhkZXYsIHJlZzEsIHB2KTsKKwkJZWxzZQorCQkJc2V0UExMX2RvdWJsZV9sb3dyZWdzKGRldiwgcmVnMSwgcHYpOworCX0gZWxzZQorCQlzZXRQTExfc2luZ2xlKGRldiwgcmVnMSwgcHYpOworfQorCisvKgorICogUExMIGdldHRpbmcKKyAqLworCitzdGF0aWMgdm9pZAorbm91dmVhdV9od19kZWNvZGVfcGxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IHJlZzEsIHVpbnQzMl90IHBsbDEsCisJCSAgICAgIHVpbnQzMl90IHBsbDIsIHN0cnVjdCBub3V2ZWF1X3BsbF92YWxzICpwbGx2YWxzKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwkvKiB0byBmb3JjZSBwYXJzaW5nIGFzIHNpbmdsZSBzdGFnZSAoaS5lLiBudjQwIHZwbGxzKSBwYXNzIHBsbDIgYXMgMCAqLworCisJLyogbG9nMlAgaXMgJiAweDcgYXMgbmV2ZXIgbW9yZSB0aGFuIDcsIGFuZCBudjMwLzM1IG9ubHkgdXNlcyAzIGJpdHMgKi8KKwlwbGx2YWxzLT5sb2cyUCA9IChwbGwxID4+IDE2KSAmIDB4NzsKKwlwbGx2YWxzLT5OMiA9IHBsbHZhbHMtPk0yID0gMTsKKworCWlmIChyZWcxIDw9IDB4NDA1YykgeworCQlwbGx2YWxzLT5OTTEgPSBwbGwyICYgMHhmZmZmOworCQkvKiBzaW5nbGUgc3RhZ2UgTlZQTEwgYW5kIFZQTExzIHVzZSAxIDw8IDgsIE1QTEwgdXNlcyAxIDw8IDEyICovCisJCWlmICghKHBsbDEgJiAweDExMDApKQorCQkJcGxsdmFscy0+Tk0yID0gcGxsMiA+PiAxNjsKKwl9IGVsc2UgeworCQlwbGx2YWxzLT5OTTEgPSBwbGwxICYgMHhmZmZmOworCQlpZiAobnZfdHdvX3JlZ19wbGwoZGV2KSAmJiBwbGwyICYgTlYzMV9SQU1EQUNfRU5BQkxFX1ZDTzIpCisJCQlwbGx2YWxzLT5OTTIgPSBwbGwyICYgMHhmZmZmOworCQllbHNlIGlmIChkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDMwIHx8IGRldl9wcml2LT5jaGlwc2V0ID09IDB4MzUpIHsKKwkJCXBsbHZhbHMtPk0xICY9IDB4ZjsgLyogb25seSA0IGJpdHMgKi8KKwkJCWlmIChwbGwxICYgTlYzMF9SQU1EQUNfRU5BQkxFX1ZDTzIpIHsKKwkJCQlwbGx2YWxzLT5NMiA9IChwbGwxID4+IDQpICYgMHg3OworCQkJCXBsbHZhbHMtPk4yID0gKChwbGwxID4+IDIxKSAmIDB4MTgpIHwKKwkJCQkJICAgICAgKChwbGwxID4+IDE5KSAmIDB4Nyk7CisJCQl9CisJCX0KKwl9Cit9CisKK2ludAorbm91dmVhdV9od19nZXRfcGxsdmFscyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBlbnVtIHBsbF90eXBlcyBwbGx0eXBlLAorCQkgICAgICAgc3RydWN0IG5vdXZlYXVfcGxsX3ZhbHMgKnBsbHZhbHMpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwljb25zdCB1aW50MzJfdCBudjA0X3JlZ3NbTUFYX1BMTF9UWVBFU10gPSB7IE5WX1BSQU1EQUNfTlZQTExfQ09FRkYsCisJCQkJCQkgICAgTlZfUFJBTURBQ19NUExMX0NPRUZGLAorCQkJCQkJICAgIE5WX1BSQU1EQUNfVlBMTF9DT0VGRiwKKwkJCQkJCSAgICBOVl9SQU1EQUNfVlBMTDIgfTsKKwljb25zdCB1aW50MzJfdCBudjQwX3JlZ3NbTUFYX1BMTF9UWVBFU10gPSB7IDB4NDAwMCwKKwkJCQkJCSAgICAweDQwMjAsCisJCQkJCQkgICAgTlZfUFJBTURBQ19WUExMX0NPRUZGLAorCQkJCQkJICAgIE5WX1JBTURBQ19WUExMMiB9OworCXVpbnQzMl90IHJlZzEsIHBsbDEsIHBsbDIgPSAwOworCXN0cnVjdCBwbGxfbGltcyBwbGxfbGltOworCWludCByZXQ7CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzQwKQorCQlyZWcxID0gbnYwNF9yZWdzW3BsbHR5cGVdOworCWVsc2UKKwkJcmVnMSA9IG52NDBfcmVnc1twbGx0eXBlXTsKKworCXBsbDEgPSBudlJlYWRNQyhkZXYsIHJlZzEpOworCisJaWYgKHJlZzEgPD0gMHg0MDVjKQorCQlwbGwyID0gbnZSZWFkTUMoZGV2LCByZWcxICsgNCk7CisJZWxzZSBpZiAobnZfdHdvX3JlZ19wbGwoZGV2KSkgeworCQl1aW50MzJfdCByZWcyID0gcmVnMSArIChyZWcxID09IE5WX1JBTURBQ19WUExMMiA/IDB4NWMgOiAweDcwKTsKKworCQlwbGwyID0gbnZSZWFkTUMoZGV2LCByZWcyKTsKKwl9CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSAweDQwICYmIHJlZzEgPj0gTlZfUFJBTURBQ19WUExMX0NPRUZGKSB7CisJCXVpbnQzMl90IHJhbWRhYzU4MCA9IE5WUmVhZFJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfNTgwKTsKKworCQkvKiBjaGVjayB3aGV0aGVyIHZwbGwgaGFzIGJlZW4gZm9yY2VkIGludG8gc2luZ2xlIHN0YWdlIG1vZGUgKi8KKwkJaWYgKHJlZzEgPT0gTlZfUFJBTURBQ19WUExMX0NPRUZGKSB7CisJCQlpZiAocmFtZGFjNTgwICYgTlZfUkFNREFDXzU4MF9WUExMMV9BQ1RJVkUpCisJCQkJcGxsMiA9IDA7CisJCX0gZWxzZQorCQkJaWYgKHJhbWRhYzU4MCAmIE5WX1JBTURBQ181ODBfVlBMTDJfQUNUSVZFKQorCQkJCXBsbDIgPSAwOworCX0KKworCW5vdXZlYXVfaHdfZGVjb2RlX3BsbChkZXYsIHJlZzEsIHBsbDEsIHBsbDIsIHBsbHZhbHMpOworCisJcmV0ID0gZ2V0X3BsbF9saW1pdHMoZGV2LCBwbGx0eXBlLCAmcGxsX2xpbSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXBsbHZhbHMtPnJlZmNsayA9IHBsbF9saW0ucmVmY2xrOworCisJcmV0dXJuIDA7Cit9CisKK2ludAorbm91dmVhdV9od19wbGx2YWxzX3RvX2NsayhzdHJ1Y3Qgbm91dmVhdV9wbGxfdmFscyAqcHYpCit7CisJLyogQXZvaWQgZGl2aWRlIGJ5IHplcm8gaWYgY2FsbGVkIGF0IGFuIGluYXBwcm9wcmlhdGUgdGltZSAqLworCWlmICghcHYtPk0xIHx8ICFwdi0+TTIpCisJCXJldHVybiAwOworCisJcmV0dXJuIHB2LT5OMSAqIHB2LT5OMiAqIHB2LT5yZWZjbGsgLyAocHYtPk0xICogcHYtPk0yKSA+PiBwdi0+bG9nMlA7Cit9CisKK2ludAorbm91dmVhdV9od19nZXRfY2xvY2soc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZW51bSBwbGxfdHlwZXMgcGxsdHlwZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9wbGxfdmFscyBwbGx2YWxzOworCisJaWYgKHBsbHR5cGUgPT0gTVBMTCAmJiAoZGV2LT5wY2lfZGV2aWNlICYgMHgwZmYwKSA9PSBDSElQU0VUX05GT1JDRSkgeworCQl1aW50MzJfdCBtcGxsUDsKKworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpX2dldF9idXNfYW5kX3Nsb3QoMCwgMyksIDB4NmMsICZtcGxsUCk7CisJCWlmICghbXBsbFApCisJCQltcGxsUCA9IDQ7CisKKwkJcmV0dXJuIDQwMDAwMCAvIG1wbGxQOworCX0gZWxzZQorCWlmIChwbGx0eXBlID09IE1QTEwgJiYgKGRldi0+cGNpX2RldmljZSAmIDB4ZmYwKSA9PSBDSElQU0VUX05GT1JDRTIpIHsKKwkJdWludDMyX3QgY2xvY2s7CisKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9nZXRfYnVzX2FuZF9zbG90KDAsIDUpLCAweDRjLCAmY2xvY2spOworCQlyZXR1cm4gY2xvY2s7CisJfQorCisJbm91dmVhdV9od19nZXRfcGxsdmFscyhkZXYsIHBsbHR5cGUsICZwbGx2YWxzKTsKKworCXJldHVybiBub3V2ZWF1X2h3X3BsbHZhbHNfdG9fY2xrKCZwbGx2YWxzKTsKK30KKworc3RhdGljIHZvaWQKK25vdXZlYXVfaHdfZml4X2JhZF92cGxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBoZWFkKQoreworCS8qIHRoZSB2cGxsIG9uIGFuIHVudXNlZCBoZWFkIGNhbiBjb21lIHVwIHdpdGggYSByYW5kb20gdmFsdWUsIHdheQorCSAqIGJleW9uZCB0aGUgcGxsIGxpbWl0cy4gIGZvciBzb21lIHJlYXNvbiB0aGlzIGNhdXNlcyB0aGUgY2hpcCB0bworCSAqIGxvY2sgdXAgd2hlbiByZWFkaW5nIHRoZSBkYWMgcGFsZXR0ZSByZWdzLCBzbyBzZXQgYSB2YWxpZCBwbGwgaGVyZQorCSAqIHdoZW4gc3VjaCBhIGNvbmRpdGlvbiBkZXRlY3RlZC4gIG9ubHkgc2VlbiBvbiBudjExIHRvIGRhdGUKKwkgKi8KKworCXN0cnVjdCBwbGxfbGltcyBwbGxfbGltOworCXN0cnVjdCBub3V2ZWF1X3BsbF92YWxzIHB2OworCXVpbnQzMl90IHBsbHJlZyA9IGhlYWQgPyBOVl9SQU1EQUNfVlBMTDIgOiBOVl9QUkFNREFDX1ZQTExfQ09FRkY7CisKKwlpZiAoZ2V0X3BsbF9saW1pdHMoZGV2LCBoZWFkID8gVlBMTDIgOiBWUExMMSwgJnBsbF9saW0pKQorCQlyZXR1cm47CisJbm91dmVhdV9od19nZXRfcGxsdmFscyhkZXYsIGhlYWQgPyBWUExMMiA6IFZQTEwxLCAmcHYpOworCisJaWYgKHB2Lk0xID49IHBsbF9saW0udmNvMS5taW5fbSAmJiBwdi5NMSA8PSBwbGxfbGltLnZjbzEubWF4X20gJiYKKwkgICAgcHYuTjEgPj0gcGxsX2xpbS52Y28xLm1pbl9uICYmIHB2Lk4xIDw9IHBsbF9saW0udmNvMS5tYXhfbiAmJgorCSAgICBwdi5sb2cyUCA8PSBwbGxfbGltLm1heF9sb2cycCkKKwkJcmV0dXJuOworCisJTlZfV0FSTihkZXYsICJWUExMICVkIG91dHdpdGggbGltaXRzLCBhdHRlbXB0aW5nIHRvIGZpeFxuIiwgaGVhZCArIDEpOworCisJLyogc2V0IGxvd2VzdCBjbG9jayB3aXRoaW4gc3RhdGljIGxpbWl0cyAqLworCXB2Lk0xID0gcGxsX2xpbS52Y28xLm1heF9tOworCXB2Lk4xID0gcGxsX2xpbS52Y28xLm1pbl9uOworCXB2LmxvZzJQID0gcGxsX2xpbS5tYXhfdXNhYmxlX2xvZzJwOworCW5vdXZlYXVfaHdfc2V0cGxsKGRldiwgcGxscmVnLCAmcHYpOworfQorCisvKgorICogdmdhIGZvbnQgc2F2ZS9yZXN0b3JlCisgKi8KKworc3RhdGljIHZvaWQgbm91dmVhdV92Z2FfZm9udF9pbyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCXZvaWQgX19pb21lbSAqaW92cmFtLAorCQkJCWJvb2wgc2F2ZSwgdW5zaWduZWQgcGxhbmUpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1bnNpZ25lZCBpOworCisJTlZXcml0ZVZnYVNlcShkZXYsIDAsIE5WX1ZJT19TUl9QTEFORV9NQVNLX0lOREVYLCAxIDw8IHBsYW5lKTsKKwlOVldyaXRlVmdhR3IoZGV2LCAwLCBOVl9WSU9fR1hfUkVBRF9NQVBfSU5ERVgsIHBsYW5lKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTYzODQ7IGkrKykgeworCQlpZiAoc2F2ZSkgeworCQkJZGV2X3ByaXYtPnNhdmVkX3ZnYV9mb250W3BsYW5lXVtpXSA9CisJCQkJCWlvcmVhZDMyX25hdGl2ZShpb3ZyYW0gKyBpICogNCk7CisJCX0gZWxzZSB7CisJCQlpb3dyaXRlMzJfbmF0aXZlKGRldl9wcml2LT5zYXZlZF92Z2FfZm9udFtwbGFuZV1baV0sCisJCQkJCQkJaW92cmFtICsgaSAqIDQpOworCQl9CisJfQorfQorCit2b2lkCitub3V2ZWF1X2h3X3NhdmVfdmdhX2ZvbnRzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGJvb2wgc2F2ZSkKK3sKKwl1aW50OF90IG1pc2MsIGdyNCwgZ3I1LCBncjYsIHNlcTIsIHNlcTQ7CisJYm9vbCBncmFwaGljc21vZGU7CisJdW5zaWduZWQgcGxhbmU7CisJdm9pZCBfX2lvbWVtICppb3ZyYW07CisKKwlpZiAobnZfdHdvX2hlYWRzKGRldikpCisJCU5WU2V0T3duZXIoZGV2LCAwKTsKKworCU5WU2V0RW5hYmxlUGFsZXR0ZShkZXYsIDAsIHRydWUpOworCWdyYXBoaWNzbW9kZSA9IE5WUmVhZFZnYUF0dHIoZGV2LCAwLCBOVl9DSU9fQVJfTU9ERV9JTkRFWCkgJiAxOworCU5WU2V0RW5hYmxlUGFsZXR0ZShkZXYsIDAsIGZhbHNlKTsKKworCWlmIChncmFwaGljc21vZGUpIC8qIGdyYXBoaWNzIG1vZGUgPT4gZnJhbWVidWZmZXIgPT4gbm8gbmVlZCB0byBzYXZlICovCisJCXJldHVybjsKKworCU5WX0lORk8oZGV2LCAiJXNpbmcgVkdBIGZvbnRzXG4iLCBzYXZlID8gIlNhdiIgOiAiUmVzdG9yIik7CisKKwkvKiBtYXAgZmlyc3QgNjRLaUIgb2YgVlJBTSwgaG9sZHMgVkdBIGZvbnRzIGV0YyAqLworCWlvdnJhbSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMSksIDY1NTM2KTsKKwlpZiAoIWlvdnJhbSkgeworCQlOVl9FUlJPUihkZXYsICJGYWlsZWQgdG8gbWFwIFZSQU0sICIKKwkJCQkJImNhbm5vdCBzYXZlL3Jlc3RvcmUgVkdBIGZvbnRzLlxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAobnZfdHdvX2hlYWRzKGRldikpCisJCU5WQmxhbmtTY3JlZW4oZGV2LCAxLCB0cnVlKTsKKwlOVkJsYW5rU2NyZWVuKGRldiwgMCwgdHJ1ZSk7CisKKwkvKiBzYXZlIGNvbnRyb2wgcmVncyAqLworCW1pc2MgPSBOVlJlYWRQUk1WSU8oZGV2LCAwLCBOVl9QUk1WSU9fTUlTQ19fUkVBRCk7CisJc2VxMiA9IE5WUmVhZFZnYVNlcShkZXYsIDAsIE5WX1ZJT19TUl9QTEFORV9NQVNLX0lOREVYKTsKKwlzZXE0ID0gTlZSZWFkVmdhU2VxKGRldiwgMCwgTlZfVklPX1NSX01FTV9NT0RFX0lOREVYKTsKKwlncjQgPSBOVlJlYWRWZ2FHcihkZXYsIDAsIE5WX1ZJT19HWF9SRUFEX01BUF9JTkRFWCk7CisJZ3I1ID0gTlZSZWFkVmdhR3IoZGV2LCAwLCBOVl9WSU9fR1hfTU9ERV9JTkRFWCk7CisJZ3I2ID0gTlZSZWFkVmdhR3IoZGV2LCAwLCBOVl9WSU9fR1hfTUlTQ19JTkRFWCk7CisKKwlOVldyaXRlUFJNVklPKGRldiwgMCwgTlZfUFJNVklPX01JU0NfX1dSSVRFLCAweDY3KTsKKwlOVldyaXRlVmdhU2VxKGRldiwgMCwgTlZfVklPX1NSX01FTV9NT0RFX0lOREVYLCAweDYpOworCU5WV3JpdGVWZ2FHcihkZXYsIDAsIE5WX1ZJT19HWF9NT0RFX0lOREVYLCAweDApOworCU5WV3JpdGVWZ2FHcihkZXYsIDAsIE5WX1ZJT19HWF9NSVNDX0lOREVYLCAweDUpOworCisJLyogc3RvcmUgZm9udCBpbiBwbGFuZXMgMC4uMyAqLworCWZvciAocGxhbmUgPSAwOyBwbGFuZSA8IDQ7IHBsYW5lKyspCisJCW5vdXZlYXVfdmdhX2ZvbnRfaW8oZGV2LCBpb3ZyYW0sIHNhdmUsIHBsYW5lKTsKKworCS8qIHJlc3RvcmUgY29udHJvbCByZWdzICovCisJTlZXcml0ZVBSTVZJTyhkZXYsIDAsIE5WX1BSTVZJT19NSVNDX19XUklURSwgbWlzYyk7CisJTlZXcml0ZVZnYUdyKGRldiwgMCwgTlZfVklPX0dYX1JFQURfTUFQX0lOREVYLCBncjQpOworCU5WV3JpdGVWZ2FHcihkZXYsIDAsIE5WX1ZJT19HWF9NT0RFX0lOREVYLCBncjUpOworCU5WV3JpdGVWZ2FHcihkZXYsIDAsIE5WX1ZJT19HWF9NSVNDX0lOREVYLCBncjYpOworCU5WV3JpdGVWZ2FTZXEoZGV2LCAwLCBOVl9WSU9fU1JfUExBTkVfTUFTS19JTkRFWCwgc2VxMik7CisJTlZXcml0ZVZnYVNlcShkZXYsIDAsIE5WX1ZJT19TUl9NRU1fTU9ERV9JTkRFWCwgc2VxNCk7CisKKwlpZiAobnZfdHdvX2hlYWRzKGRldikpCisJCU5WQmxhbmtTY3JlZW4oZGV2LCAxLCBmYWxzZSk7CisJTlZCbGFua1NjcmVlbihkZXYsIDAsIGZhbHNlKTsKKworCWlvdW5tYXAoaW92cmFtKTsKK30KKworLyoKKyAqIG1vZGUgc3RhdGUgc2F2ZS9sb2FkCisgKi8KKworc3RhdGljIHZvaWQKK3JkX2Npb19zdGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaGVhZCwKKwkgICAgIHN0cnVjdCBudjA0X2NydGNfcmVnICpjcnRjc3RhdGUsIGludCBpbmRleCkKK3sKKwljcnRjc3RhdGUtPkNSVENbaW5kZXhdID0gTlZSZWFkVmdhQ3J0YyhkZXYsIGhlYWQsIGluZGV4KTsKK30KKworc3RhdGljIHZvaWQKK3dyX2Npb19zdGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaGVhZCwKKwkgICAgIHN0cnVjdCBudjA0X2NydGNfcmVnICpjcnRjc3RhdGUsIGludCBpbmRleCkKK3sKKwlOVldyaXRlVmdhQ3J0YyhkZXYsIGhlYWQsIGluZGV4LCBjcnRjc3RhdGUtPkNSVENbaW5kZXhdKTsKK30KKworc3RhdGljIHZvaWQKK252X3NhdmVfc3RhdGVfcmFtZGFjKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBoZWFkLAorCQkgICAgIHN0cnVjdCBudjA0X21vZGVfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52MDRfY3J0Y19yZWcgKnJlZ3AgPSAmc3RhdGUtPmNydGNfcmVnW2hlYWRdOworCWludCBpOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfMTApCisJCXJlZ3AtPm52MTBfY3Vyc3luYyA9IE5WUmVhZFJBTURBQyhkZXYsIGhlYWQsIE5WX1JBTURBQ19OVjEwX0NVUlNZTkMpOworCisJbm91dmVhdV9od19nZXRfcGxsdmFscyhkZXYsIGhlYWQgPyBWUExMMiA6IFZQTEwxLCAmcmVncC0+cGxsdmFscyk7CisJc3RhdGUtPnBsbHNlbCA9IE5WUmVhZFJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfUExMX0NPRUZGX1NFTEVDVCk7CisJaWYgKG52X3R3b19oZWFkcyhkZXYpKQorCQlzdGF0ZS0+c2VsX2NsayA9IE5WUmVhZFJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfU0VMX0NMSyk7CisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID09IDB4MTEpCisJCXJlZ3AtPmRpdGhlciA9IE5WUmVhZFJBTURBQyhkZXYsIGhlYWQsIE5WX1JBTURBQ19ESVRIRVJfTlYxMSk7CisKKwlyZWdwLT5yYW1kYWNfZ2VuX2N0cmwgPSBOVlJlYWRSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX0dFTkVSQUxfQ09OVFJPTCk7CisKKwlpZiAobnZfZ2Y0X2Rpc3BfYXJjaChkZXYpKQorCQlyZWdwLT5yYW1kYWNfNjMwID0gTlZSZWFkUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ182MzApOworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA+PSAweDMwKQorCQlyZWdwLT5yYW1kYWNfNjM0ID0gTlZSZWFkUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ182MzQpOworCisJcmVncC0+dHZfc2V0dXAgPSBOVlJlYWRSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX1RWX1NFVFVQKTsKKwlyZWdwLT50dl92dG90YWwgPSBOVlJlYWRSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX1RWX1ZUT1RBTCk7CisJcmVncC0+dHZfdnNrZXcgPSBOVlJlYWRSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX1RWX1ZTS0VXKTsKKwlyZWdwLT50dl92c3luY19kZWxheSA9IE5WUmVhZFJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfVFZfVlNZTkNfREVMQVkpOworCXJlZ3AtPnR2X2h0b3RhbCA9IE5WUmVhZFJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfVFZfSFRPVEFMKTsKKwlyZWdwLT50dl9oc2tldyA9IE5WUmVhZFJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfVFZfSFNLRVcpOworCXJlZ3AtPnR2X2hzeW5jX2RlbGF5ID0gTlZSZWFkUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19UVl9IU1lOQ19ERUxBWSk7CisJcmVncC0+dHZfaHN5bmNfZGVsYXkyID0gTlZSZWFkUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19UVl9IU1lOQ19ERUxBWTIpOworCisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQl1aW50MzJfdCByYW1kYWNfcmVnID0gTlZfUFJBTURBQ19GUF9WRElTUExBWV9FTkQgKyAoaSAqIDQpOworCQlyZWdwLT5mcF92ZXJ0X3JlZ3NbaV0gPSBOVlJlYWRSQU1EQUMoZGV2LCBoZWFkLCByYW1kYWNfcmVnKTsKKwkJcmVncC0+ZnBfaG9yaXpfcmVnc1tpXSA9IE5WUmVhZFJBTURBQyhkZXYsIGhlYWQsIHJhbWRhY19yZWcgKyAweDIwKTsKKwl9CisKKwlpZiAobnZfZ2Y0X2Rpc3BfYXJjaChkZXYpKSB7CisJCXJlZ3AtPmRpdGhlciA9IE5WUmVhZFJBTURBQyhkZXYsIGhlYWQsIE5WX1JBTURBQ19GUF9ESVRIRVIpOworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlyZWdwLT5kaXRoZXJfcmVnc1tpXSA9IE5WUmVhZFJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfODUwICsgaSAqIDQpOworCQkJcmVncC0+ZGl0aGVyX3JlZ3NbaSArIDNdID0gTlZSZWFkUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ184NUMgKyBpICogNCk7CisJCX0KKwl9CisKKwlyZWdwLT5mcF9jb250cm9sID0gTlZSZWFkUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19GUF9UR19DT05UUk9MKTsKKwlyZWdwLT5mcF9kZWJ1Z18wID0gTlZSZWFkUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19GUF9ERUJVR18wKTsKKwlpZiAoIW52X2dmNF9kaXNwX2FyY2goZGV2KSAmJiBoZWFkID09IDApIHsKKwkJLyogZWFybHkgY2hpcHMgZG9uJ3QgYWxsb3cgYWNjZXNzIHRvIFBSQU1EQUNfVE1EU18qIHdpdGhvdXQKKwkJICogdGhlIGhlYWQgQSBGUENMSyBvbiAobnYxMSBldmVuIGxvY2tzIHVwKSAqLworCQlOVldyaXRlUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19GUF9ERUJVR18wLCByZWdwLT5mcF9kZWJ1Z18wICYKKwkJCSAgICAgIH5OVl9QUkFNREFDX0ZQX0RFQlVHXzBfUFdSRE9XTl9GUENMSyk7CisJfQorCXJlZ3AtPmZwX2RlYnVnXzEgPSBOVlJlYWRSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX0ZQX0RFQlVHXzEpOworCXJlZ3AtPmZwX2RlYnVnXzIgPSBOVlJlYWRSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX0ZQX0RFQlVHXzIpOworCisJcmVncC0+ZnBfbWFyZ2luX2NvbG9yID0gTlZSZWFkUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19GUF9NQVJHSU5fQ09MT1IpOworCisJaWYgKG52X2dmNF9kaXNwX2FyY2goZGV2KSkKKwkJcmVncC0+cmFtZGFjXzhjMCA9IE5WUmVhZFJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfOEMwKTsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzQwKSB7CisJCXJlZ3AtPnJhbWRhY19hMjAgPSBOVlJlYWRSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX0EyMCk7CisJCXJlZ3AtPnJhbWRhY19hMjQgPSBOVlJlYWRSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX0EyNCk7CisJCXJlZ3AtPnJhbWRhY19hMzQgPSBOVlJlYWRSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX0EzNCk7CisKKwkJZm9yIChpID0gMDsgaSA8IDM4OyBpKyspCisJCQlyZWdwLT5jdHZfcmVnc1tpXSA9IE5WUmVhZFJBTURBQyhkZXYsIGhlYWQsCisJCQkJCQkJIE5WX1BSQU1EQUNfQ1RWICsgNCppKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitudl9sb2FkX3N0YXRlX3JhbWRhYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaGVhZCwKKwkJICAgICBzdHJ1Y3QgbnYwNF9tb2RlX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudjA0X2NydGNfcmVnICpyZWdwID0gJnN0YXRlLT5jcnRjX3JlZ1toZWFkXTsKKwl1aW50MzJfdCBwbGxyZWcgPSBoZWFkID8gTlZfUkFNREFDX1ZQTEwyIDogTlZfUFJBTURBQ19WUExMX0NPRUZGOworCWludCBpOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfMTApCisJCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9SQU1EQUNfTlYxMF9DVVJTWU5DLCByZWdwLT5udjEwX2N1cnN5bmMpOworCisJbm91dmVhdV9od19zZXRwbGwoZGV2LCBwbGxyZWcsICZyZWdwLT5wbGx2YWxzKTsKKwlOVldyaXRlUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19QTExfQ09FRkZfU0VMRUNULCBzdGF0ZS0+cGxsc2VsKTsKKwlpZiAobnZfdHdvX2hlYWRzKGRldikpCisJCU5WV3JpdGVSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDX1NFTF9DTEssIHN0YXRlLT5zZWxfY2xrKTsKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHgxMSkKKwkJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1JBTURBQ19ESVRIRVJfTlYxMSwgcmVncC0+ZGl0aGVyKTsKKworCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX0dFTkVSQUxfQ09OVFJPTCwgcmVncC0+cmFtZGFjX2dlbl9jdHJsKTsKKworCWlmIChudl9nZjRfZGlzcF9hcmNoKGRldikpCisJCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDXzYzMCwgcmVncC0+cmFtZGFjXzYzMCk7CisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID49IDB4MzApCisJCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDXzYzNCwgcmVncC0+cmFtZGFjXzYzNCk7CisKKwlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19UVl9TRVRVUCwgcmVncC0+dHZfc2V0dXApOworCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX1RWX1ZUT1RBTCwgcmVncC0+dHZfdnRvdGFsKTsKKwlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19UVl9WU0tFVywgcmVncC0+dHZfdnNrZXcpOworCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX1RWX1ZTWU5DX0RFTEFZLCByZWdwLT50dl92c3luY19kZWxheSk7CisJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfVFZfSFRPVEFMLCByZWdwLT50dl9odG90YWwpOworCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX1RWX0hTS0VXLCByZWdwLT50dl9oc2tldyk7CisJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfVFZfSFNZTkNfREVMQVksIHJlZ3AtPnR2X2hzeW5jX2RlbGF5KTsKKwlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19UVl9IU1lOQ19ERUxBWTIsIHJlZ3AtPnR2X2hzeW5jX2RlbGF5Mik7CisKKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCXVpbnQzMl90IHJhbWRhY19yZWcgPSBOVl9QUkFNREFDX0ZQX1ZESVNQTEFZX0VORCArIChpICogNCk7CisKKwkJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIHJhbWRhY19yZWcsIHJlZ3AtPmZwX3ZlcnRfcmVnc1tpXSk7CisJCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCByYW1kYWNfcmVnICsgMHgyMCwgcmVncC0+ZnBfaG9yaXpfcmVnc1tpXSk7CisJfQorCisJaWYgKG52X2dmNF9kaXNwX2FyY2goZGV2KSkgeworCQlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwgTlZfUkFNREFDX0ZQX0RJVEhFUiwgcmVncC0+ZGl0aGVyKTsKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfODUwICsgaSAqIDQsIHJlZ3AtPmRpdGhlcl9yZWdzW2ldKTsKKwkJCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDXzg1QyArIGkgKiA0LCByZWdwLT5kaXRoZXJfcmVnc1tpICsgM10pOworCQl9CisJfQorCisJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfRlBfVEdfQ09OVFJPTCwgcmVncC0+ZnBfY29udHJvbCk7CisJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfRlBfREVCVUdfMCwgcmVncC0+ZnBfZGVidWdfMCk7CisJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfRlBfREVCVUdfMSwgcmVncC0+ZnBfZGVidWdfMSk7CisJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfRlBfREVCVUdfMiwgcmVncC0+ZnBfZGVidWdfMik7CisKKwlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19GUF9NQVJHSU5fQ09MT1IsIHJlZ3AtPmZwX21hcmdpbl9jb2xvcik7CisKKwlpZiAobnZfZ2Y0X2Rpc3BfYXJjaChkZXYpKQorCQlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ184QzAsIHJlZ3AtPnJhbWRhY184YzApOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNDApIHsKKwkJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfQTIwLCByZWdwLT5yYW1kYWNfYTIwKTsKKwkJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfQTI0LCByZWdwLT5yYW1kYWNfYTI0KTsKKwkJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfQTM0LCByZWdwLT5yYW1kYWNfYTM0KTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzg7IGkrKykKKwkJCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLAorCQkJCSAgICAgIE5WX1BSQU1EQUNfQ1RWICsgNCppLCByZWdwLT5jdHZfcmVnc1tpXSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorbnZfc2F2ZV9zdGF0ZV92Z2Eoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGhlYWQsCisJCSAgc3RydWN0IG52MDRfbW9kZV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IG52MDRfY3J0Y19yZWcgKnJlZ3AgPSAmc3RhdGUtPmNydGNfcmVnW2hlYWRdOworCWludCBpOworCisJcmVncC0+TWlzY091dFJlZyA9IE5WUmVhZFBSTVZJTyhkZXYsIGhlYWQsIE5WX1BSTVZJT19NSVNDX19SRUFEKTsKKworCWZvciAoaSA9IDA7IGkgPCAyNTsgaSsrKQorCQlyZF9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBpKTsKKworCU5WU2V0RW5hYmxlUGFsZXR0ZShkZXYsIGhlYWQsIHRydWUpOworCWZvciAoaSA9IDA7IGkgPCAyMTsgaSsrKQorCQlyZWdwLT5BdHRyaWJ1dGVbaV0gPSBOVlJlYWRWZ2FBdHRyKGRldiwgaGVhZCwgaSk7CisJTlZTZXRFbmFibGVQYWxldHRlKGRldiwgaGVhZCwgZmFsc2UpOworCisJZm9yIChpID0gMDsgaSA8IDk7IGkrKykKKwkJcmVncC0+R3JhcGhpY3NbaV0gPSBOVlJlYWRWZ2FHcihkZXYsIGhlYWQsIGkpOworCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJcmVncC0+U2VxdWVuY2VyW2ldID0gTlZSZWFkVmdhU2VxKGRldiwgaGVhZCwgaSk7Cit9CisKK3N0YXRpYyB2b2lkCitudl9sb2FkX3N0YXRlX3ZnYShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaGVhZCwKKwkJICBzdHJ1Y3QgbnYwNF9tb2RlX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgbnYwNF9jcnRjX3JlZyAqcmVncCA9ICZzdGF0ZS0+Y3J0Y19yZWdbaGVhZF07CisJaW50IGk7CisKKwlOVldyaXRlUFJNVklPKGRldiwgaGVhZCwgTlZfUFJNVklPX01JU0NfX1dSSVRFLCByZWdwLT5NaXNjT3V0UmVnKTsKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCU5WV3JpdGVWZ2FTZXEoZGV2LCBoZWFkLCBpLCByZWdwLT5TZXF1ZW5jZXJbaV0pOworCisJbnZfbG9ja192Z2FfY3J0Y19iYXNlKGRldiwgaGVhZCwgZmFsc2UpOworCWZvciAoaSA9IDA7IGkgPCAyNTsgaSsrKQorCQl3cl9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBpKTsKKwludl9sb2NrX3ZnYV9jcnRjX2Jhc2UoZGV2LCBoZWFkLCB0cnVlKTsKKworCWZvciAoaSA9IDA7IGkgPCA5OyBpKyspCisJCU5WV3JpdGVWZ2FHcihkZXYsIGhlYWQsIGksIHJlZ3AtPkdyYXBoaWNzW2ldKTsKKworCU5WU2V0RW5hYmxlUGFsZXR0ZShkZXYsIGhlYWQsIHRydWUpOworCWZvciAoaSA9IDA7IGkgPCAyMTsgaSsrKQorCQlOVldyaXRlVmdhQXR0cihkZXYsIGhlYWQsIGksIHJlZ3AtPkF0dHJpYnV0ZVtpXSk7CisJTlZTZXRFbmFibGVQYWxldHRlKGRldiwgaGVhZCwgZmFsc2UpOworfQorCitzdGF0aWMgdm9pZAorbnZfc2F2ZV9zdGF0ZV9leHQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGhlYWQsCisJCSAgc3RydWN0IG52MDRfbW9kZV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnYwNF9jcnRjX3JlZyAqcmVncCA9ICZzdGF0ZS0+Y3J0Y19yZWdbaGVhZF07CisJaW50IGk7CisKKwlyZF9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFX0xDRF9fSU5ERVgpOworCXJkX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfUlBDMF9JTkRFWCk7CisJcmRfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV9SUEMxX0lOREVYKTsKKwlyZF9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFX0xTUl9JTkRFWCk7CisJcmRfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV9QSVhFTF9JTkRFWCk7CisJcmRfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV9IRUJfX0lOREVYKTsKKwlyZF9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFX0VOSF9JTkRFWCk7CisKKwlyZF9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFX0ZGX0lOREVYKTsKKwlyZF9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFX0ZGTFdNX19JTkRFWCk7CisJcmRfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV8yMSk7CisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfMzApCisJCXJkX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfNDcpOworCXJkX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfNDkpOworCXJkX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfSENVUl9BRERSMF9JTkRFWCk7CisJcmRfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV9IQ1VSX0FERFIxX0lOREVYKTsKKwlyZF9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFX0hDVVJfQUREUjJfSU5ERVgpOworCXJkX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfSUxBQ0VfX0lOREVYKTsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzEwKSB7CisJCXJlZ3AtPmNydGNfODMwID0gTlZSZWFkQ1JUQyhkZXYsIGhlYWQsIE5WX1BDUlRDXzgzMCk7CisJCXJlZ3AtPmNydGNfODM0ID0gTlZSZWFkQ1JUQyhkZXYsIGhlYWQsIE5WX1BDUlRDXzgzNCk7CisKKwkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfMzApCisJCQlyZWdwLT5ncGlvX2V4dCA9IE5WUmVhZENSVEMoZGV2LCBoZWFkLCBOVl9QQ1JUQ19HUElPX0VYVCk7CisKKwkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNDApCisJCQlyZWdwLT5jcnRjXzg1MCA9IE5WUmVhZENSVEMoZGV2LCBoZWFkLCBOVl9QQ1JUQ184NTApOworCisJCWlmIChudl90d29faGVhZHMoZGV2KSkKKwkJCXJlZ3AtPmNydGNfZW5nX2N0cmwgPSBOVlJlYWRDUlRDKGRldiwgaGVhZCwgTlZfUENSVENfRU5HSU5FX0NUUkwpOworCQlyZWdwLT5jdXJzb3JfY2ZnID0gTlZSZWFkQ1JUQyhkZXYsIGhlYWQsIE5WX1BDUlRDX0NVUlNPUl9DT05GSUcpOworCX0KKworCXJlZ3AtPmNydGNfY2ZnID0gTlZSZWFkQ1JUQyhkZXYsIGhlYWQsIE5WX1BDUlRDX0NPTkZJRyk7CisKKwlyZF9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFX1NDUkFUQ0gzX19JTkRFWCk7CisJcmRfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV9TQ1JBVENINF9fSU5ERVgpOworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzEwKSB7CisJCXJkX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfRUJSX0lOREVYKTsKKwkJcmRfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV9DU0IpOworCQlyZF9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFXzRCKTsKKwkJcmRfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV9UVk9VVF9MQVRFTkNZKTsKKwl9CisJLyogTlYxMSBhbmQgTlYyMCBkb24ndCBoYXZlIHRoaXMsIHRoZXkgc3RvcCBhdCAweDUyLiAqLworCWlmIChudl9nZjRfZGlzcF9hcmNoKGRldikpIHsKKwkJcmRfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV81Myk7CisJCXJkX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfNTQpOworCisJCWZvciAoaSA9IDA7IGkgPCAweDEwOyBpKyspCisJCQlyZWdwLT5DUjU4W2ldID0gTlZSZWFkVmdhQ3J0YzU3NTgoZGV2LCBoZWFkLCBpKTsKKwkJcmRfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV81OSk7CisJCXJkX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfNUIpOworCisJCXJkX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfODUpOworCQlyZF9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFXzg2KTsKKwl9CisKKwlyZWdwLT5mYl9zdGFydCA9IE5WUmVhZENSVEMoZGV2LCBoZWFkLCBOVl9QQ1JUQ19TVEFSVCk7Cit9CisKK3N0YXRpYyB2b2lkCitudl9sb2FkX3N0YXRlX2V4dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaGVhZCwKKwkJICBzdHJ1Y3QgbnYwNF9tb2RlX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudjA0X2NydGNfcmVnICpyZWdwID0gJnN0YXRlLT5jcnRjX3JlZ1toZWFkXTsKKwl1aW50MzJfdCByZWc5MDA7CisJaW50IGk7CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl8xMCkgeworCQlpZiAobnZfdHdvX2hlYWRzKGRldikpCisJCQkvKiBzZXR0aW5nIEVOR0lORV9DVFJMIChFQykgKm11c3QqIGNvbWUgYmVmb3JlCisJCQkgKiBDSU9fQ1JFX0xDRCwgYXMgd3JpdGluZyBDUkVfTENEIHNldHMgYml0cyAxNiAmIDE3IGluCisJCQkgKiBFQyB0aGF0IHNob3VsZCBub3QgYmUgb3ZlcndyaXR0ZW4gYnkgd3JpdGluZyBzdGFsZSBFQworCQkJICovCisJCQlOVldyaXRlQ1JUQyhkZXYsIGhlYWQsIE5WX1BDUlRDX0VOR0lORV9DVFJMLCByZWdwLT5jcnRjX2VuZ19jdHJsKTsKKworCQludldyaXRlVklERU8oZGV2LCBOVl9QVklERU9fU1RPUCwgMSk7CisJCW52V3JpdGVWSURFTyhkZXYsIE5WX1BWSURFT19JTlRSX0VOLCAwKTsKKwkJbnZXcml0ZVZJREVPKGRldiwgTlZfUFZJREVPX09GRlNFVF9CVUZGKDApLCAwKTsKKwkJbnZXcml0ZVZJREVPKGRldiwgTlZfUFZJREVPX09GRlNFVF9CVUZGKDEpLCAwKTsKKwkJbnZXcml0ZVZJREVPKGRldiwgTlZfUFZJREVPX0xJTUlUKDApLCBkZXZfcHJpdi0+ZmJfYXZhaWxhYmxlX3NpemUgLSAxKTsKKwkJbnZXcml0ZVZJREVPKGRldiwgTlZfUFZJREVPX0xJTUlUKDEpLCBkZXZfcHJpdi0+ZmJfYXZhaWxhYmxlX3NpemUgLSAxKTsKKwkJbnZXcml0ZVZJREVPKGRldiwgTlZfUFZJREVPX1VWUExBTkVfTElNSVQoMCksIGRldl9wcml2LT5mYl9hdmFpbGFibGVfc2l6ZSAtIDEpOworCQludldyaXRlVklERU8oZGV2LCBOVl9QVklERU9fVVZQTEFORV9MSU1JVCgxKSwgZGV2X3ByaXYtPmZiX2F2YWlsYWJsZV9zaXplIC0gMSk7CisJCW52V3JpdGVNQyhkZXYsIE5WX1BCVVNfUE9XRVJDVFJMXzIsIDApOworCisJCU5WV3JpdGVDUlRDKGRldiwgaGVhZCwgTlZfUENSVENfQ1VSU09SX0NPTkZJRywgcmVncC0+Y3Vyc29yX2NmZyk7CisJCU5WV3JpdGVDUlRDKGRldiwgaGVhZCwgTlZfUENSVENfODMwLCByZWdwLT5jcnRjXzgzMCk7CisJCU5WV3JpdGVDUlRDKGRldiwgaGVhZCwgTlZfUENSVENfODM0LCByZWdwLT5jcnRjXzgzNCk7CisKKwkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfMzApCisJCQlOVldyaXRlQ1JUQyhkZXYsIGhlYWQsIE5WX1BDUlRDX0dQSU9fRVhULCByZWdwLT5ncGlvX2V4dCk7CisKKwkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNDApIHsKKwkJCU5WV3JpdGVDUlRDKGRldiwgaGVhZCwgTlZfUENSVENfODUwLCByZWdwLT5jcnRjXzg1MCk7CisKKwkJCXJlZzkwMCA9IE5WUmVhZFJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfOTAwKTsKKwkJCWlmIChyZWdwLT5jcnRjX2NmZyA9PSBOVl9QQ1JUQ19DT05GSUdfU1RBUlRfQUREUkVTU19IU1lOQykKKwkJCQlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ185MDAsIHJlZzkwMCB8IDB4MTAwMDApOworCQkJZWxzZQorCQkJCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDXzkwMCwgcmVnOTAwICYgfjB4MTAwMDApOworCQl9CisJfQorCisJTlZXcml0ZUNSVEMoZGV2LCBoZWFkLCBOVl9QQ1JUQ19DT05GSUcsIHJlZ3AtPmNydGNfY2ZnKTsKKworCXdyX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfUlBDMF9JTkRFWCk7CisJd3JfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV9SUEMxX0lOREVYKTsKKwl3cl9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFX0xTUl9JTkRFWCk7CisJd3JfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV9QSVhFTF9JTkRFWCk7CisJd3JfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV9MQ0RfX0lOREVYKTsKKwl3cl9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFX0hFQl9fSU5ERVgpOworCXdyX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfRU5IX0lOREVYKTsKKwl3cl9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFX0ZGX0lOREVYKTsKKwl3cl9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFX0ZGTFdNX19JTkRFWCk7CisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfMzApCisJCXdyX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfNDcpOworCisJd3JfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV80OSk7CisJd3JfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV9IQ1VSX0FERFIwX0lOREVYKTsKKwl3cl9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFX0hDVVJfQUREUjFfSU5ERVgpOworCXdyX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfSENVUl9BRERSMl9JTkRFWCk7CisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNDApCisJCW52X2ZpeF9udjQwX2h3X2N1cnNvcihkZXYsIGhlYWQpOworCXdyX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfSUxBQ0VfX0lOREVYKTsKKworCXdyX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfU0NSQVRDSDNfX0lOREVYKTsKKwl3cl9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFX1NDUkFUQ0g0X19JTkRFWCk7CisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfMTApIHsKKwkJd3JfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV9FQlJfSU5ERVgpOworCQl3cl9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFX0NTQik7CisJCXdyX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfNEIpOworCQl3cl9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFX1RWT1VUX0xBVEVOQ1kpOworCX0KKwkvKiBOVjExIGFuZCBOVjIwIHN0b3AgYXQgMHg1Mi4gKi8KKwlpZiAobnZfZ2Y0X2Rpc3BfYXJjaChkZXYpKSB7CisJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzEwKSB7CisJCQkvKiBOb3Qgd2FpdGluZyBmb3IgdmVydGljYWwgcmV0cmFjZSBiZWZvcmUgbW9kaWZ5aW5nCisJCQkgICBDUkVfNTMvQ1JFXzU0IGNhdXNlcyBsb2NrdXBzLiAqLworCQkJbm91dmVhdV93YWl0X3VudGlsKGRldiwgNjUwMDAwMDAwLCBOVl9QUk1DSU9fSU5QMF9fQ09MT1IsIDB4OCwgMHg4KTsKKwkJCW5vdXZlYXVfd2FpdF91bnRpbChkZXYsIDY1MDAwMDAwMCwgTlZfUFJNQ0lPX0lOUDBfX0NPTE9SLCAweDgsIDB4MCk7CisJCX0KKworCQl3cl9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFXzUzKTsKKwkJd3JfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV81NCk7CisKKwkJZm9yIChpID0gMDsgaSA8IDB4MTA7IGkrKykKKwkJCU5WV3JpdGVWZ2FDcnRjNTc1OChkZXYsIGhlYWQsIGksIHJlZ3AtPkNSNThbaV0pOworCQl3cl9jaW9fc3RhdGUoZGV2LCBoZWFkLCByZWdwLCBOVl9DSU9fQ1JFXzU5KTsKKwkJd3JfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV81Qik7CisKKwkJd3JfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV84NSk7CisJCXdyX2Npb19zdGF0ZShkZXYsIGhlYWQsIHJlZ3AsIE5WX0NJT19DUkVfODYpOworCX0KKworCU5WV3JpdGVDUlRDKGRldiwgaGVhZCwgTlZfUENSVENfU1RBUlQsIHJlZ3AtPmZiX3N0YXJ0KTsKKworCS8qIFNldHRpbmcgMSBvbiB0aGlzIHZhbHVlIGdpdmVzIHlvdSBpbnRlcnJ1cHRzIGZvciBldmVyeSB2YmxhbmsgcGVyaW9kLiAqLworCU5WV3JpdGVDUlRDKGRldiwgaGVhZCwgTlZfUENSVENfSU5UUl9FTl8wLCAwKTsKKwlOVldyaXRlQ1JUQyhkZXYsIGhlYWQsIE5WX1BDUlRDX0lOVFJfMCwgTlZfUENSVENfSU5UUl8wX1ZCTEFOSyk7Cit9CisKK3N0YXRpYyB2b2lkCitudl9zYXZlX3N0YXRlX3BhbGV0dGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGhlYWQsCisJCSAgICAgIHN0cnVjdCBudjA0X21vZGVfc3RhdGUgKnN0YXRlKQoreworCWludCBoZWFkX29mZnNldCA9IGhlYWQgKiBOVl9QUk1ESU9fU0laRSwgaTsKKworCW52X3dyMDgoZGV2LCBOVl9QUk1ESU9fUElYRUxfTUFTSyArIGhlYWRfb2Zmc2V0LAorCQkJCU5WX1BSTURJT19QSVhFTF9NQVNLX01BU0spOworCW52X3dyMDgoZGV2LCBOVl9QUk1ESU9fUkVBRF9NT0RFX0FERFJFU1MgKyBoZWFkX29mZnNldCwgMHgwKTsKKworCWZvciAoaSA9IDA7IGkgPCA3Njg7IGkrKykgeworCQlzdGF0ZS0+Y3J0Y19yZWdbaGVhZF0uREFDW2ldID0gbnZfcmQwOChkZXYsCisJCQkJTlZfUFJNRElPX1BBTEVUVEVfREFUQSArIGhlYWRfb2Zmc2V0KTsKKwl9CisKKwlOVlNldEVuYWJsZVBhbGV0dGUoZGV2LCBoZWFkLCBmYWxzZSk7Cit9CisKK3ZvaWQKK25vdXZlYXVfaHdfbG9hZF9zdGF0ZV9wYWxldHRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBoZWFkLAorCQkJICAgICAgc3RydWN0IG52MDRfbW9kZV9zdGF0ZSAqc3RhdGUpCit7CisJaW50IGhlYWRfb2Zmc2V0ID0gaGVhZCAqIE5WX1BSTURJT19TSVpFLCBpOworCisJbnZfd3IwOChkZXYsIE5WX1BSTURJT19QSVhFTF9NQVNLICsgaGVhZF9vZmZzZXQsCisJCQkJTlZfUFJNRElPX1BJWEVMX01BU0tfTUFTSyk7CisJbnZfd3IwOChkZXYsIE5WX1BSTURJT19XUklURV9NT0RFX0FERFJFU1MgKyBoZWFkX29mZnNldCwgMHgwKTsKKworCWZvciAoaSA9IDA7IGkgPCA3Njg7IGkrKykgeworCQludl93cjA4KGRldiwgTlZfUFJNRElPX1BBTEVUVEVfREFUQSArIGhlYWRfb2Zmc2V0LAorCQkJCXN0YXRlLT5jcnRjX3JlZ1toZWFkXS5EQUNbaV0pOworCX0KKworCU5WU2V0RW5hYmxlUGFsZXR0ZShkZXYsIGhlYWQsIGZhbHNlKTsKK30KKwordm9pZCBub3V2ZWF1X2h3X3NhdmVfc3RhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGhlYWQsCisJCQkgICBzdHJ1Y3QgbnYwNF9tb2RlX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID09IDB4MTEpCisJCS8qIE5COiBubyBhdHRlbXB0IGlzIG1hZGUgdG8gcmVzdG9yZSB0aGUgYmFkIHBsbCBsYXRlciBvbiAqLworCQlub3V2ZWF1X2h3X2ZpeF9iYWRfdnBsbChkZXYsIGhlYWQpOworCW52X3NhdmVfc3RhdGVfcmFtZGFjKGRldiwgaGVhZCwgc3RhdGUpOworCW52X3NhdmVfc3RhdGVfdmdhKGRldiwgaGVhZCwgc3RhdGUpOworCW52X3NhdmVfc3RhdGVfcGFsZXR0ZShkZXYsIGhlYWQsIHN0YXRlKTsKKwludl9zYXZlX3N0YXRlX2V4dChkZXYsIGhlYWQsIHN0YXRlKTsKK30KKwordm9pZCBub3V2ZWF1X2h3X2xvYWRfc3RhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGhlYWQsCisJCQkgICBzdHJ1Y3QgbnYwNF9tb2RlX3N0YXRlICpzdGF0ZSkKK3sKKwlOVlZnYVByb3RlY3QoZGV2LCBoZWFkLCB0cnVlKTsKKwludl9sb2FkX3N0YXRlX3JhbWRhYyhkZXYsIGhlYWQsIHN0YXRlKTsKKwludl9sb2FkX3N0YXRlX2V4dChkZXYsIGhlYWQsIHN0YXRlKTsKKwlub3V2ZWF1X2h3X2xvYWRfc3RhdGVfcGFsZXR0ZShkZXYsIGhlYWQsIHN0YXRlKTsKKwludl9sb2FkX3N0YXRlX3ZnYShkZXYsIGhlYWQsIHN0YXRlKTsKKwlOVlZnYVByb3RlY3QoZGV2LCBoZWFkLCBmYWxzZSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2h3LmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2h3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY5MTMwZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaHcuaApAQCAtMCwwICsxLDQ1NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4IFN0dWFydCBCZW5uZXR0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fTk9VVkVBVV9IV19IX18KKyNkZWZpbmUgX19OT1VWRUFVX0hXX0hfXworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisKKyNkZWZpbmUgTUFTSyhmaWVsZCkgKCBcCisJKDB4ZmZmZmZmZmYgPj4gKDMxIC0gKCgxID8gZmllbGQpIC0gKDAgPyBmaWVsZCkpKSkgPDwgKDAgPyBmaWVsZCkpCisKKyNkZWZpbmUgWExBVEUoc3JjLCBzcmNsb3diaXQsIG91dGZpZWxkKSAoIFwKKwkoKChzcmMpID4+IChzcmNsb3diaXQpKSA8PCAoMCA/IG91dGZpZWxkKSkgJiBNQVNLKG91dGZpZWxkKSkKKwordm9pZCBOVldyaXRlVmdhU2VxKHN0cnVjdCBkcm1fZGV2aWNlICosIGludCBoZWFkLCB1aW50OF90IGluZGV4LCB1aW50OF90IHZhbHVlKTsKK3VpbnQ4X3QgTlZSZWFkVmdhU2VxKHN0cnVjdCBkcm1fZGV2aWNlICosIGludCBoZWFkLCB1aW50OF90IGluZGV4KTsKK3ZvaWQgTlZXcml0ZVZnYUdyKHN0cnVjdCBkcm1fZGV2aWNlICosIGludCBoZWFkLCB1aW50OF90IGluZGV4LCB1aW50OF90IHZhbHVlKTsKK3VpbnQ4X3QgTlZSZWFkVmdhR3Ioc3RydWN0IGRybV9kZXZpY2UgKiwgaW50IGhlYWQsIHVpbnQ4X3QgaW5kZXgpOwordm9pZCBOVlNldE93bmVyKHN0cnVjdCBkcm1fZGV2aWNlICosIGludCBvd25lcik7Cit2b2lkIE5WQmxhbmtTY3JlZW4oc3RydWN0IGRybV9kZXZpY2UgKiwgaW50IGhlYWQsIGJvb2wgYmxhbmspOwordm9pZCBub3V2ZWF1X2h3X3NldHBsbChzdHJ1Y3QgZHJtX2RldmljZSAqLCB1aW50MzJfdCByZWcxLAorCQkgICAgICAgc3RydWN0IG5vdXZlYXVfcGxsX3ZhbHMgKnB2KTsKK2ludCBub3V2ZWF1X2h3X2dldF9wbGx2YWxzKHN0cnVjdCBkcm1fZGV2aWNlICosIGVudW0gcGxsX3R5cGVzIHBsbHR5cGUsCisJCQkgICBzdHJ1Y3Qgbm91dmVhdV9wbGxfdmFscyAqcGxsdmFscyk7CitpbnQgbm91dmVhdV9od19wbGx2YWxzX3RvX2NsayhzdHJ1Y3Qgbm91dmVhdV9wbGxfdmFscyAqcGxsdmFscyk7CitpbnQgbm91dmVhdV9od19nZXRfY2xvY2soc3RydWN0IGRybV9kZXZpY2UgKiwgZW51bSBwbGxfdHlwZXMgcGxsdHlwZSk7Cit2b2lkIG5vdXZlYXVfaHdfc2F2ZV92Z2FfZm9udHMoc3RydWN0IGRybV9kZXZpY2UgKiwgYm9vbCBzYXZlKTsKK3ZvaWQgbm91dmVhdV9od19zYXZlX3N0YXRlKHN0cnVjdCBkcm1fZGV2aWNlICosIGludCBoZWFkLAorCQkJICAgc3RydWN0IG52MDRfbW9kZV9zdGF0ZSAqc3RhdGUpOwordm9pZCBub3V2ZWF1X2h3X2xvYWRfc3RhdGUoc3RydWN0IGRybV9kZXZpY2UgKiwgaW50IGhlYWQsCisJCQkgICBzdHJ1Y3QgbnYwNF9tb2RlX3N0YXRlICpzdGF0ZSk7Cit2b2lkIG5vdXZlYXVfaHdfbG9hZF9zdGF0ZV9wYWxldHRlKHN0cnVjdCBkcm1fZGV2aWNlICosIGludCBoZWFkLAorCQkJCSAgIHN0cnVjdCBudjA0X21vZGVfc3RhdGUgKnN0YXRlKTsKKworLyogbm91dmVhdV9jYWxjLmMgKi8KK2V4dGVybiB2b2lkIG5vdXZlYXVfY2FsY19hcmIoc3RydWN0IGRybV9kZXZpY2UgKiwgaW50IHZjbGssIGludCBicHAsCisJCQkgICAgIGludCAqYnVyc3QsIGludCAqbHdtKTsKK2V4dGVybiBpbnQgbm91dmVhdV9jYWxjX3BsbF9tbnAoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IHBsbF9saW1zICpwbGxfbGltLAorCQkJCWludCBjbGssIHN0cnVjdCBub3V2ZWF1X3BsbF92YWxzICpwdik7CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QKK252UmVhZE1DKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IHJlZykKK3sKKwl1aW50MzJfdCB2YWwgPSBudl9yZDMyKGRldiwgcmVnKTsKKwlOVl9SRUdfREVCVUcoTUMsIGRldiwgInJlZyAlMDh4IHZhbCAlMDh4XG4iLCByZWcsIHZhbCk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitudldyaXRlTUMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgcmVnLCB1aW50MzJfdCB2YWwpCit7CisJTlZfUkVHX0RFQlVHKE1DLCBkZXYsICJyZWcgJTA4eCB2YWwgJTA4eFxuIiwgcmVnLCB2YWwpOworCW52X3dyMzIoZGV2LCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QKK252UmVhZFZJREVPKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IHJlZykKK3sKKwl1aW50MzJfdCB2YWwgPSBudl9yZDMyKGRldiwgcmVnKTsKKwlOVl9SRUdfREVCVUcoVklERU8sIGRldiwgInJlZyAlMDh4IHZhbCAlMDh4XG4iLCByZWcsIHZhbCk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitudldyaXRlVklERU8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgcmVnLCB1aW50MzJfdCB2YWwpCit7CisJTlZfUkVHX0RFQlVHKFZJREVPLCBkZXYsICJyZWcgJTA4eCB2YWwgJTA4eFxuIiwgcmVnLCB2YWwpOworCW52X3dyMzIoZGV2LCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QKK252UmVhZEZCKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IHJlZykKK3sKKwl1aW50MzJfdCB2YWwgPSBudl9yZDMyKGRldiwgcmVnKTsKKwlOVl9SRUdfREVCVUcoRkIsIGRldiwgInJlZyAlMDh4IHZhbCAlMDh4XG4iLCByZWcsIHZhbCk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitudldyaXRlRkIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgcmVnLCB1aW50MzJfdCB2YWwpCit7CisJTlZfUkVHX0RFQlVHKEZCLCBkZXYsICJyZWcgJTA4eCB2YWwgJTA4eFxuIiwgcmVnLCB2YWwpOworCW52X3dyMzIoZGV2LCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QKK252UmVhZEVYVERFVihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCByZWcpCit7CisJdWludDMyX3QgdmFsID0gbnZfcmQzMihkZXYsIHJlZyk7CisJTlZfUkVHX0RFQlVHKEVYVERFViwgZGV2LCAicmVnICUwOHggdmFsICUwOHhcbiIsIHJlZywgdmFsKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK252V3JpdGVFWFRERVYoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgcmVnLCB1aW50MzJfdCB2YWwpCit7CisJTlZfUkVHX0RFQlVHKEVYVERFViwgZGV2LCAicmVnICUwOHggdmFsICUwOHhcbiIsIHJlZywgdmFsKTsKKwludl93cjMyKGRldiwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IE5WUmVhZENSVEMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJaW50IGhlYWQsIHVpbnQzMl90IHJlZykKK3sKKwl1aW50MzJfdCB2YWw7CisJaWYgKGhlYWQpCisJCXJlZyArPSBOVl9QQ1JUQzBfU0laRTsKKwl2YWwgPSBudl9yZDMyKGRldiwgcmVnKTsKKwlOVl9SRUdfREVCVUcoQ1JUQywgZGV2LCAiaGVhZCAlZCByZWcgJTA4eCB2YWwgJTA4eFxuIiwgaGVhZCwgcmVnLCB2YWwpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBOVldyaXRlQ1JUQyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQlpbnQgaGVhZCwgdWludDMyX3QgcmVnLCB1aW50MzJfdCB2YWwpCit7CisJaWYgKGhlYWQpCisJCXJlZyArPSBOVl9QQ1JUQzBfU0laRTsKKwlOVl9SRUdfREVCVUcoQ1JUQywgZGV2LCAiaGVhZCAlZCByZWcgJTA4eCB2YWwgJTA4eFxuIiwgaGVhZCwgcmVnLCB2YWwpOworCW52X3dyMzIoZGV2LCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgTlZSZWFkUkFNREFDKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCWludCBoZWFkLCB1aW50MzJfdCByZWcpCit7CisJdWludDMyX3QgdmFsOworCWlmIChoZWFkKQorCQlyZWcgKz0gTlZfUFJBTURBQzBfU0laRTsKKwl2YWwgPSBudl9yZDMyKGRldiwgcmVnKTsKKwlOVl9SRUdfREVCVUcoUkFNREFDLCBkZXYsICJoZWFkICVkIHJlZyAlMDh4IHZhbCAlMDh4XG4iLAorCQkJCQkJCWhlYWQsIHJlZywgdmFsKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgTlZXcml0ZVJBTURBQyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQlpbnQgaGVhZCwgdWludDMyX3QgcmVnLCB1aW50MzJfdCB2YWwpCit7CisJaWYgKGhlYWQpCisJCXJlZyArPSBOVl9QUkFNREFDMF9TSVpFOworCU5WX1JFR19ERUJVRyhSQU1EQUMsIGRldiwgImhlYWQgJWQgcmVnICUwOHggdmFsICUwOHhcbiIsCisJCQkJCQkJaGVhZCwgcmVnLCB2YWwpOworCW52X3dyMzIoZGV2LCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCBudl9yZWFkX3RtZHMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJaW50IG9yLCBpbnQgZGwsIHVpbnQ4X3QgYWRkcmVzcykKK3sKKwlpbnQgcmFtZGFjID0gKG9yICYgT1VUUFVUX0MpID4+IDI7CisKKwlOVldyaXRlUkFNREFDKGRldiwgcmFtZGFjLCBOVl9QUkFNREFDX0ZQX1RNRFNfQ09OVFJPTCArIGRsICogOCwKKwlOVl9QUkFNREFDX0ZQX1RNRFNfQ09OVFJPTF9XUklURV9ESVNBQkxFIHwgYWRkcmVzcyk7CisJcmV0dXJuIE5WUmVhZFJBTURBQyhkZXYsIHJhbWRhYywgTlZfUFJBTURBQ19GUF9UTURTX0RBVEEgKyBkbCAqIDgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbnZfd3JpdGVfdG1kcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQlpbnQgb3IsIGludCBkbCwgdWludDhfdCBhZGRyZXNzLAorCQkJCQl1aW50OF90IGRhdGEpCit7CisJaW50IHJhbWRhYyA9IChvciAmIE9VVFBVVF9DKSA+PiAyOworCisJTlZXcml0ZVJBTURBQyhkZXYsIHJhbWRhYywgTlZfUFJBTURBQ19GUF9UTURTX0RBVEEgKyBkbCAqIDgsIGRhdGEpOworCU5WV3JpdGVSQU1EQUMoZGV2LCByYW1kYWMsIE5WX1BSQU1EQUNfRlBfVE1EU19DT05UUk9MICsgZGwgKiA4LCBhZGRyZXNzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIE5WV3JpdGVWZ2FDcnRjKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCWludCBoZWFkLCB1aW50OF90IGluZGV4LCB1aW50OF90IHZhbHVlKQoreworCU5WX1JFR19ERUJVRyhWR0FDUlRDLCBkZXYsICJoZWFkICVkIGluZGV4IDB4JTAyeCBkYXRhIDB4JTAyeFxuIiwKKwkJCQkJCQloZWFkLCBpbmRleCwgdmFsdWUpOworCW52X3dyMDgoZGV2LCBOVl9QUk1DSU9fQ1JYX19DT0xPUiArIGhlYWQgKiBOVl9QUk1DSU9fU0laRSwgaW5kZXgpOworCW52X3dyMDgoZGV2LCBOVl9QUk1DSU9fQ1JfX0NPTE9SICsgaGVhZCAqIE5WX1BSTUNJT19TSVpFLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCBOVlJlYWRWZ2FDcnRjKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCWludCBoZWFkLCB1aW50OF90IGluZGV4KQoreworCXVpbnQ4X3QgdmFsOworCW52X3dyMDgoZGV2LCBOVl9QUk1DSU9fQ1JYX19DT0xPUiArIGhlYWQgKiBOVl9QUk1DSU9fU0laRSwgaW5kZXgpOworCXZhbCA9IG52X3JkMDgoZGV2LCBOVl9QUk1DSU9fQ1JfX0NPTE9SICsgaGVhZCAqIE5WX1BSTUNJT19TSVpFKTsKKwlOVl9SRUdfREVCVUcoVkdBQ1JUQywgZGV2LCAiaGVhZCAlZCBpbmRleCAweCUwMnggZGF0YSAweCUwMnhcbiIsCisJCQkJCQkJaGVhZCwgaW5kZXgsIHZhbCk7CisJcmV0dXJuIHZhbDsKK30KKworLyogQ1I1NyBhbmQgQ1I1OCBhcmUgYSBmdW4gcGFpciBvZiByZWdzLiBDUjU3IHByb3ZpZGVzIGFuIGluZGV4ICgwLTB4ZikgZm9yIENSNTgKKyAqIEkgc3VzcGVjdCB0aGV5IGluIGZhY3QgZG8gbm90aGluZywgYnV0IGFyZSBtZXJlbHkgYSB3YXkgdG8gY2FycnkgdXNlZnVsCisgKiBwZXItaGVhZCB2YXJpYWJsZXMgYXJvdW5kCisgKgorICogS25vd24gdXNlczoKKyAqIENSNTcJCUNSNTgKKyAqIDB4MDAJCWluZGV4IHRvIHRoZSBhcHByb3ByaWF0ZSBkY2IgZW50cnkgKG9yIDdmIGZvciBpbmFjdGl2ZSkKKyAqIDB4MDIJCWRjYiBlbnRyeSdzICJvciIgdmFsdWUgKG9yIDAwIGZvciBpbmFjdGl2ZSkKKyAqIDB4MDMJCWJpdDAgc2V0IGZvciBkdWFsIGxpbmsgKExWRFMsIHBvc3NpYmx5IGVsc2V3aGVyZSB0b28pCisgKiAweDA4IG9yIDB4MDkJcHhjbGsgaW4gTUh6CisgKiAweDBmCQlsYXB0b3AgcGFuZWwgaW5mbyAtCWxvdyBuaWJibGUgZm9yIFBFWFRERVZfQk9PVF8wIHN0cmFwCisgKiAJCQkJCWhpZ2ggbmliYmxlIGZvciB4bGF0IHN0cmFwIHZhbHVlCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkCitOVldyaXRlVmdhQ3J0YzU3NTgoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGhlYWQsIHVpbnQ4X3QgaW5kZXgsIHVpbnQ4X3QgdmFsdWUpCit7CisJTlZXcml0ZVZnYUNydGMoZGV2LCBoZWFkLCBOVl9DSU9fQ1JFXzU3LCBpbmRleCk7CisJTlZXcml0ZVZnYUNydGMoZGV2LCBoZWFkLCBOVl9DSU9fQ1JFXzU4LCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCBOVlJlYWRWZ2FDcnRjNTc1OChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaGVhZCwgdWludDhfdCBpbmRleCkKK3sKKwlOVldyaXRlVmdhQ3J0YyhkZXYsIGhlYWQsIE5WX0NJT19DUkVfNTcsIGluZGV4KTsKKwlyZXR1cm4gTlZSZWFkVmdhQ3J0YyhkZXYsIGhlYWQsIE5WX0NJT19DUkVfNTgpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgTlZSZWFkUFJNVklPKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCWludCBoZWFkLCB1aW50MzJfdCByZWcpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1aW50OF90IHZhbDsKKworCS8qIE9ubHkgTlY0eCBoYXZlIHR3byBwdmlvIHJhbmdlczsgb3RoZXIgdHdvSGVhZHMgY2FyZHMgTVVTVCBjYWxsCisJICogTlZTZXRPd25lciBmb3IgdGhlIHJlbGV2YW50IGhlYWQgdG8gYmUgcHJvZ3JhbW1lZCAqLworCWlmIChoZWFkICYmIGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNDApCisJCXJlZyArPSBOVl9QUk1WSU9fU0laRTsKKworCXZhbCA9IG52X3JkMDgoZGV2LCByZWcpOworCU5WX1JFR19ERUJVRyhSTVZJTywgZGV2LCAiaGVhZCAlZCByZWcgJTA4eCB2YWwgJTAyeFxuIiwgaGVhZCwgcmVnLCB2YWwpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBOVldyaXRlUFJNVklPKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCWludCBoZWFkLCB1aW50MzJfdCByZWcsIHVpbnQ4X3QgdmFsdWUpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCS8qIE9ubHkgTlY0eCBoYXZlIHR3byBwdmlvIHJhbmdlczsgb3RoZXIgdHdvSGVhZHMgY2FyZHMgTVVTVCBjYWxsCisJICogTlZTZXRPd25lciBmb3IgdGhlIHJlbGV2YW50IGhlYWQgdG8gYmUgcHJvZ3JhbW1lZCAqLworCWlmIChoZWFkICYmIGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNDApCisJCXJlZyArPSBOVl9QUk1WSU9fU0laRTsKKworCU5WX1JFR19ERUJVRyhSTVZJTywgZGV2LCAiaGVhZCAlZCByZWcgJTA4eCB2YWwgJTAyeFxuIiwKKwkJCQkJCWhlYWQsIHJlZywgdmFsdWUpOworCW52X3dyMDgoZGV2LCByZWcsIHZhbHVlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIE5WU2V0RW5hYmxlUGFsZXR0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaGVhZCwgYm9vbCBlbmFibGUpCit7CisJbnZfcmQwOChkZXYsIE5WX1BSTUNJT19JTlAwX19DT0xPUiArIGhlYWQgKiBOVl9QUk1DSU9fU0laRSk7CisJbnZfd3IwOChkZXYsIE5WX1BSTUNJT19BUlggKyBoZWFkICogTlZfUFJNQ0lPX1NJWkUsIGVuYWJsZSA/IDAgOiAweDIwKTsKK30KKworc3RhdGljIGlubGluZSBib29sIE5WR2V0RW5hYmxlUGFsZXR0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaGVhZCkKK3sKKwludl9yZDA4KGRldiwgTlZfUFJNQ0lPX0lOUDBfX0NPTE9SICsgaGVhZCAqIE5WX1BSTUNJT19TSVpFKTsKKwlyZXR1cm4gIShudl9yZDA4KGRldiwgTlZfUFJNQ0lPX0FSWCArIGhlYWQgKiBOVl9QUk1DSU9fU0laRSkgJiAweDIwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIE5WV3JpdGVWZ2FBdHRyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCWludCBoZWFkLCB1aW50OF90IGluZGV4LCB1aW50OF90IHZhbHVlKQoreworCWlmIChOVkdldEVuYWJsZVBhbGV0dGUoZGV2LCBoZWFkKSkKKwkJaW5kZXggJj0gfjB4MjA7CisJZWxzZQorCQlpbmRleCB8PSAweDIwOworCisJbnZfcmQwOChkZXYsIE5WX1BSTUNJT19JTlAwX19DT0xPUiArIGhlYWQgKiBOVl9QUk1DSU9fU0laRSk7CisJTlZfUkVHX0RFQlVHKFZHQUFUVFIsIGRldiwgImhlYWQgJWQgaW5kZXggMHglMDJ4IGRhdGEgMHglMDJ4XG4iLAorCQkJCQkJCWhlYWQsIGluZGV4LCB2YWx1ZSk7CisJbnZfd3IwOChkZXYsIE5WX1BSTUNJT19BUlggKyBoZWFkICogTlZfUFJNQ0lPX1NJWkUsIGluZGV4KTsKKwludl93cjA4KGRldiwgTlZfUFJNQ0lPX0FSX19XUklURSArIGhlYWQgKiBOVl9QUk1DSU9fU0laRSwgdmFsdWUpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgTlZSZWFkVmdhQXR0cihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQlpbnQgaGVhZCwgdWludDhfdCBpbmRleCkKK3sKKwl1aW50OF90IHZhbDsKKwlpZiAoTlZHZXRFbmFibGVQYWxldHRlKGRldiwgaGVhZCkpCisJCWluZGV4ICY9IH4weDIwOworCWVsc2UKKwkJaW5kZXggfD0gMHgyMDsKKworCW52X3JkMDgoZGV2LCBOVl9QUk1DSU9fSU5QMF9fQ09MT1IgKyBoZWFkICogTlZfUFJNQ0lPX1NJWkUpOworCW52X3dyMDgoZGV2LCBOVl9QUk1DSU9fQVJYICsgaGVhZCAqIE5WX1BSTUNJT19TSVpFLCBpbmRleCk7CisJdmFsID0gbnZfcmQwOChkZXYsIE5WX1BSTUNJT19BUl9fUkVBRCArIGhlYWQgKiBOVl9QUk1DSU9fU0laRSk7CisJTlZfUkVHX0RFQlVHKFZHQUFUVFIsIGRldiwgImhlYWQgJWQgaW5kZXggMHglMDJ4IGRhdGEgMHglMDJ4XG4iLAorCQkJCQkJCWhlYWQsIGluZGV4LCB2YWwpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBOVlZnYVNlcVJlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBoZWFkLCBib29sIHN0YXJ0KQoreworCU5WV3JpdGVWZ2FTZXEoZGV2LCBoZWFkLCBOVl9WSU9fU1JfUkVTRVRfSU5ERVgsIHN0YXJ0ID8gMHgxIDogMHgzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIE5WVmdhUHJvdGVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaGVhZCwgYm9vbCBwcm90ZWN0KQoreworCXVpbnQ4X3Qgc2VxMSA9IE5WUmVhZFZnYVNlcShkZXYsIGhlYWQsIE5WX1ZJT19TUl9DTE9DS19JTkRFWCk7CisKKwlpZiAocHJvdGVjdCkgeworCQlOVlZnYVNlcVJlc2V0KGRldiwgaGVhZCwgdHJ1ZSk7CisJCU5WV3JpdGVWZ2FTZXEoZGV2LCBoZWFkLCBOVl9WSU9fU1JfQ0xPQ0tfSU5ERVgsIHNlcTEgfCAweDIwKTsKKwl9IGVsc2UgeworCQkvKiBSZWVuYWJsZSBzZXF1ZW5jZXIsIHRoZW4gdHVybiBvbiBzY3JlZW4gKi8KKwkJTlZXcml0ZVZnYVNlcShkZXYsIGhlYWQsIE5WX1ZJT19TUl9DTE9DS19JTkRFWCwgc2VxMSAmIH4weDIwKTsgICAvKiByZWVuYWJsZSBkaXNwbGF5ICovCisJCU5WVmdhU2VxUmVzZXQoZGV2LCBoZWFkLCBmYWxzZSk7CisJfQorCU5WU2V0RW5hYmxlUGFsZXR0ZShkZXYsIGhlYWQsIHByb3RlY3QpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK252X2hlYWRzX3RpZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID09IDB4MTEpCisJCXJldHVybiAhIShudlJlYWRNQyhkZXYsIE5WX1BCVVNfREVCVUdfMSkgJiAoMSA8PCAyOCkpOworCisJcmV0dXJuIE5WUmVhZFZnYUNydGMoZGV2LCAwLCBOVl9DSU9fQ1JFXzQ0KSAmIDB4NDsKK30KKworLyogbWFrZXMgY3IwLTcgb24gdGhlIHNwZWNpZmllZCBoZWFkIHJlYWQtb25seSAqLworc3RhdGljIGlubGluZSBib29sCitudl9sb2NrX3ZnYV9jcnRjX2Jhc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGhlYWQsIGJvb2wgbG9jaykKK3sKKwl1aW50OF90IGNyMTEgPSBOVlJlYWRWZ2FDcnRjKGRldiwgaGVhZCwgTlZfQ0lPX0NSX1ZSRV9JTkRFWCk7CisJYm9vbCB3YXNsb2NrZWQgPSBjcjExICYgMHg4MDsKKworCWlmIChsb2NrKQorCQljcjExIHw9IDB4ODA7CisJZWxzZQorCQljcjExICY9IH4weDgwOworCU5WV3JpdGVWZ2FDcnRjKGRldiwgaGVhZCwgTlZfQ0lPX0NSX1ZSRV9JTkRFWCwgY3IxMSk7CisKKwlyZXR1cm4gd2FzbG9ja2VkOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK252X2xvY2tfdmdhX2NydGNfc2hhZG93KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBoZWFkLCBpbnQgbG9jaykKK3sKKwkvKiBzaGFkb3cgbG9jazogY29ubmVjdHMgMHg2MD8zZD8gcmVncyB0byAicmVhbCIgMHgzZD8gcmVncworCSAqIGJpdDc6IHVubG9ja3MgSERULCBIQlMsIEhCRSwgSFJTLCBIUkUsIEhFQgorCSAqIGJpdDY6IHNlZW1zIHRvIGhhdmUgc29tZSBlZmZlY3Qgb24gQ1IwOSAoZG91YmxlIHNjYW4sIFZCU185KQorCSAqIGJpdDU6IHVubG9ja3MgSERFCisJICogYml0NDogdW5sb2NrcyBWREUKKwkgKiBiaXQzOiB1bmxvY2tzIFZEVCwgT1ZMLCBWUlMsID9WUkU/LCBWQlMsIFZCRSwgTFNSLCBFQlIKKwkgKiBiaXQyOiBzYW1lIGFzIGJpdCAxIG9mIDB4NjA/ODA0CisJICogYml0MDogc2FtZSBhcyBiaXQgMCBvZiAweDYwPzgwNAorCSAqLworCisJdWludDhfdCBjcjIxID0gbG9jazsKKworCWlmIChsb2NrIDwgMCkKKwkJLyogMHhmYSBpcyBnZW5lcmljICJ1bmxvY2sgYWxsIiBtYXNrICovCisJCWNyMjEgPSBOVlJlYWRWZ2FDcnRjKGRldiwgaGVhZCwgTlZfQ0lPX0NSRV8yMSkgfCAweGZhOworCisJTlZXcml0ZVZnYUNydGMoZGV2LCBoZWFkLCBOVl9DSU9fQ1JFXzIxLCBjcjIxKTsKK30KKworLyogcmVuZGVycyB0aGUgZXh0ZW5kZWQgY3J0YyByZWdzIChjcjE5Kykgb24gYWxsIGNydGNzIGltcGVydmlvdXM6CisgKiBpbW11dGFibGUgYW5kIHVucmVhZGFibGUKKyAqLworc3RhdGljIGlubGluZSBib29sCitOVkxvY2tWZ2FDcnRjcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBib29sIGxvY2spCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlib29sIHdhc2xvY2tlZCA9ICFOVlJlYWRWZ2FDcnRjKGRldiwgMCwgTlZfQ0lPX1NSX0xPQ0tfSU5ERVgpOworCisJTlZXcml0ZVZnYUNydGMoZGV2LCAwLCBOVl9DSU9fU1JfTE9DS19JTkRFWCwKKwkJICAgICAgIGxvY2sgPyBOVl9DSU9fU1JfTE9DS19WQUxVRSA6IE5WX0NJT19TUl9VTkxPQ0tfUldfVkFMVUUpOworCS8qIE5WMTEgaGFzIGluZGVwZW5kZW50bHkgbG9ja2FibGUgZXh0ZW5kZWQgY3J0Y3MsIGV4Y2VwdCB3aGVuIHRpZWQgKi8KKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHgxMSAmJiAhbnZfaGVhZHNfdGllZChkZXYpKQorCQlOVldyaXRlVmdhQ3J0YyhkZXYsIDEsIE5WX0NJT19TUl9MT0NLX0lOREVYLAorCQkJICAgICAgIGxvY2sgPyBOVl9DSU9fU1JfTE9DS19WQUxVRSA6CisJCQkJICAgICAgTlZfQ0lPX1NSX1VOTE9DS19SV19WQUxVRSk7CisKKwlyZXR1cm4gd2FzbG9ja2VkOworfQorCisvKiBudjA0IGN1cnNvciBtYXggZGltZW5zaW9ucyBvZiAzMngzMiAoQTFSNUc1QjUpICovCisjZGVmaW5lIE5WMDRfQ1VSU09SX1NJWkUgMzIKKy8qIGxpbWl0IG52MTAgY3Vyc29ycyB0byA2NHg2NCAoQVJHQjgpICh3ZSBjb3VsZCBnbyB0byA2NHgyNTUpICovCisjZGVmaW5lIE5WMTBfQ1VSU09SX1NJWkUgNjQKKworc3RhdGljIGlubGluZSBpbnQgbnZfY3Vyc29yX3dpZHRoKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCXJldHVybiBkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzEwID8gTlYxMF9DVVJTT1JfU0laRSA6IE5WMDRfQ1VSU09SX1NJWkU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorbnZfZml4X252NDBfaHdfY3Vyc29yKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBoZWFkKQoreworCS8qIG9uIHNvbWUgbnY0MCAoc3VjaCBhcyB0aGUgInRydWUiIChpbiB0aGUgTlZfUEZCX0JPT1RfMCBzZW5zZSkgbnY0MCwKKwkgKiB0aGUgZ2Y2ODAwZ3QpIGEgaGFyZHdhcmUgYnVnIHJlcXVpcmVzIGEgd3JpdGUgdG8gUFJBTURBQ19DVVJTT1JfUE9TCisJICogZm9yIGNoYW5nZXMgdG8gdGhlIENSVEMgQ1VSQ1RMIHJlZ3MgdG8gdGFrZSBlZmZlY3QsIHdoZXRoZXIgY2hhbmdpbmcKKwkgKiB0aGUgcGl4bWFwIGxvY2F0aW9uLCBvciBqdXN0IHNob3dpbmcvaGlkaW5nIHRoZSBjdXJzb3IKKwkgKi8KKwl1aW50MzJfdCBjdXJwb3MgPSBOVlJlYWRSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX0NVX1NUQVJUX1BPUyk7CisJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfQ1VfU1RBUlRfUE9TLCBjdXJwb3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK252X3Nob3dfY3Vyc29yKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBoZWFkLCBib29sIHNob3cpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1aW50OF90ICpjdXJjdGwxID0KKwkJJmRldl9wcml2LT5tb2RlX3JlZy5jcnRjX3JlZ1toZWFkXS5DUlRDW05WX0NJT19DUkVfSENVUl9BRERSMV9JTkRFWF07CisKKwlpZiAoc2hvdykKKwkJKmN1cmN0bDEgfD0gTUFTSyhOVl9DSU9fQ1JFX0hDVVJfQUREUjFfRU5BQkxFKTsKKwllbHNlCisJCSpjdXJjdGwxICY9IH5NQVNLKE5WX0NJT19DUkVfSENVUl9BRERSMV9FTkFCTEUpOworCU5WV3JpdGVWZ2FDcnRjKGRldiwgaGVhZCwgTlZfQ0lPX0NSRV9IQ1VSX0FERFIxX0lOREVYLCAqY3VyY3RsMSk7CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl80MCkKKwkJbnZfZml4X252NDBfaHdfY3Vyc29yKGRldiwgaGVhZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QKK252X3BpdGNoX2FsaWduKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IHdpZHRoLCBpbnQgYnBwKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IG1hc2s7CisKKwlpZiAoYnBwID09IDE1KQorCQlicHAgPSAxNjsKKwlpZiAoYnBwID09IDI0KQorCQlicHAgPSA4OworCisJLyogQWxpZ25tZW50IHJlcXVpcmVtZW50cyB0YWtlbiBmcm9tIHRoZSBIYWlrdSBkcml2ZXIgKi8KKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl8wNCkKKwkJbWFzayA9IDEyOCAvIGJwcCAtIDE7CisJZWxzZQorCQltYXNrID0gNTEyIC8gYnBwIC0gMTsKKworCXJldHVybiAod2lkdGggKyBtYXNrKSAmIH5tYXNrOworfQorCisjZW5kaWYJLyogX19OT1VWRUFVX0hXX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9pMmMuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaTJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBlOTk0ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaTJjLmMKQEAgLTAsMCArMSwyNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfaTJjLmgiCisjaW5jbHVkZSAibm91dmVhdV9ody5oIgorCitzdGF0aWMgdm9pZAorbnYwNF9pMmNfc2V0c2NsKHZvaWQgKmRhdGEsIGludCBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqaTJjID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaTJjLT5kZXY7CisJdWludDhfdCB2YWw7CisKKwl2YWwgPSAoTlZSZWFkVmdhQ3J0YyhkZXYsIDAsIGkyYy0+d3IpICYgMHhkMCkgfCAoc3RhdGUgPyAweDIwIDogMCk7CisJTlZXcml0ZVZnYUNydGMoZGV2LCAwLCBpMmMtPndyLCB2YWwgfCAweDAxKTsKK30KKworc3RhdGljIHZvaWQKK252MDRfaTJjX3NldHNkYSh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCit7CisJc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKmkyYyA9IGRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGkyYy0+ZGV2OworCXVpbnQ4X3QgdmFsOworCisJdmFsID0gKE5WUmVhZFZnYUNydGMoZGV2LCAwLCBpMmMtPndyKSAmIDB4ZTApIHwgKHN0YXRlID8gMHgxMCA6IDApOworCU5WV3JpdGVWZ2FDcnRjKGRldiwgMCwgaTJjLT53ciwgdmFsIHwgMHgwMSk7Cit9CisKK3N0YXRpYyBpbnQKK252MDRfaTJjX2dldHNjbCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICppMmMgPSBkYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBpMmMtPmRldjsKKworCXJldHVybiAhIShOVlJlYWRWZ2FDcnRjKGRldiwgMCwgaTJjLT5yZCkgJiA0KTsKK30KKworc3RhdGljIGludAorbnYwNF9pMmNfZ2V0c2RhKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKmkyYyA9IGRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGkyYy0+ZGV2OworCisJcmV0dXJuICEhKE5WUmVhZFZnYUNydGMoZGV2LCAwLCBpMmMtPnJkKSAmIDgpOworfQorCitzdGF0aWMgdm9pZAorbnY0ZV9pMmNfc2V0c2NsKHZvaWQgKmRhdGEsIGludCBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqaTJjID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaTJjLT5kZXY7CisJdWludDhfdCB2YWw7CisKKwl2YWwgPSAobnZfcmQzMihkZXYsIGkyYy0+d3IpICYgMHhkMCkgfCAoc3RhdGUgPyAweDIwIDogMCk7CisJbnZfd3IzMihkZXYsIGkyYy0+d3IsIHZhbCB8IDB4MDEpOworfQorCitzdGF0aWMgdm9pZAorbnY0ZV9pMmNfc2V0c2RhKHZvaWQgKmRhdGEsIGludCBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqaTJjID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaTJjLT5kZXY7CisJdWludDhfdCB2YWw7CisKKwl2YWwgPSAobnZfcmQzMihkZXYsIGkyYy0+d3IpICYgMHhlMCkgfCAoc3RhdGUgPyAweDEwIDogMCk7CisJbnZfd3IzMihkZXYsIGkyYy0+d3IsIHZhbCB8IDB4MDEpOworfQorCitzdGF0aWMgaW50CitudjRlX2kyY19nZXRzY2wodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqaTJjID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaTJjLT5kZXY7CisKKwlyZXR1cm4gISEoKG52X3JkMzIoZGV2LCBpMmMtPnJkKSA+PiAxNikgJiA0KTsKK30KKworc3RhdGljIGludAorbnY0ZV9pMmNfZ2V0c2RhKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKmkyYyA9IGRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGkyYy0+ZGV2OworCisJcmV0dXJuICEhKChudl9yZDMyKGRldiwgaTJjLT5yZCkgPj4gMTYpICYgOCk7Cit9CisKK3N0YXRpYyBpbnQKK252NTBfaTJjX2dldHNjbCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICppMmMgPSBkYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBpMmMtPmRldjsKKworCXJldHVybiAhIShudl9yZDMyKGRldiwgaTJjLT5yZCkgJiAxKTsKK30KKworCitzdGF0aWMgaW50CitudjUwX2kyY19nZXRzZGEodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqaTJjID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaTJjLT5kZXY7CisKKwlyZXR1cm4gISEobnZfcmQzMihkZXYsIGkyYy0+cmQpICYgMik7Cit9CisKK3N0YXRpYyB2b2lkCitudjUwX2kyY19zZXRzY2wodm9pZCAqZGF0YSwgaW50IHN0YXRlKQoreworCXN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICppMmMgPSBkYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBpMmMtPmRldjsKKworCW52X3dyMzIoZGV2LCBpMmMtPndyLCA0IHwgKGkyYy0+ZGF0YSA/IDIgOiAwKSB8IChzdGF0ZSA/IDEgOiAwKSk7Cit9CisKK3N0YXRpYyB2b2lkCitudjUwX2kyY19zZXRzZGEodm9pZCAqZGF0YSwgaW50IHN0YXRlKQoreworCXN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICppMmMgPSBkYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBpMmMtPmRldjsKKworCW52X3dyMzIoZGV2LCBpMmMtPndyLAorCQkJKG52X3JkMzIoZGV2LCBpMmMtPnJkKSAmIDEpIHwgNCB8IChzdGF0ZSA/IDIgOiAwKSk7CisJaTJjLT5kYXRhID0gc3RhdGU7Cit9CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBudjUwX2kyY19wb3J0W10gPSB7CisJMHgwMGUxMzgsIDB4MDBlMTUwLCAweDAwZTE2OCwgMHgwMGUxODAsCisJMHgwMGUyNTQsIDB4MDBlMjc0LCAweDAwZTc2NCwgMHgwMGU3ODAsCisJMHgwMGU3OWMsIDB4MDBlN2I4Cit9OworI2RlZmluZSBOVjUwX0kyQ19QT1JUUyBBUlJBWV9TSVpFKG52NTBfaTJjX3BvcnQpCisKK2ludAorbm91dmVhdV9pMmNfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2kyY19lbnRyeSAqZW50cnksIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICppMmM7CisJaW50IHJldDsKKworCWlmIChlbnRyeS0+Y2hhbikKKwkJcmV0dXJuIC1FRVhJU1Q7CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl81MCAmJiBlbnRyeS0+cmVhZCA+PSBOVjUwX0kyQ19QT1JUUykgeworCQlOVl9FUlJPUihkZXYsICJ1bmtub3duIGkyYyBwb3J0ICVkXG4iLCBlbnRyeS0+cmVhZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWkyYyA9IGt6YWxsb2Moc2l6ZW9mKCppMmMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoaTJjID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJc3dpdGNoIChlbnRyeS0+cG9ydF90eXBlKSB7CisJY2FzZSAwOgorCQlpMmMtPmFsZ28uYml0LnNldHNkYSA9IG52MDRfaTJjX3NldHNkYTsKKwkJaTJjLT5hbGdvLmJpdC5zZXRzY2wgPSBudjA0X2kyY19zZXRzY2w7CisJCWkyYy0+YWxnby5iaXQuZ2V0c2RhID0gbnYwNF9pMmNfZ2V0c2RhOworCQlpMmMtPmFsZ28uYml0LmdldHNjbCA9IG52MDRfaTJjX2dldHNjbDsKKwkJaTJjLT5yZCA9IGVudHJ5LT5yZWFkOworCQlpMmMtPndyID0gZW50cnktPndyaXRlOworCQlicmVhazsKKwljYXNlIDQ6CisJCWkyYy0+YWxnby5iaXQuc2V0c2RhID0gbnY0ZV9pMmNfc2V0c2RhOworCQlpMmMtPmFsZ28uYml0LnNldHNjbCA9IG52NGVfaTJjX3NldHNjbDsKKwkJaTJjLT5hbGdvLmJpdC5nZXRzZGEgPSBudjRlX2kyY19nZXRzZGE7CisJCWkyYy0+YWxnby5iaXQuZ2V0c2NsID0gbnY0ZV9pMmNfZ2V0c2NsOworCQlpMmMtPnJkID0gMHg2MDA4MDAgKyBlbnRyeS0+cmVhZDsKKwkJaTJjLT53ciA9IDB4NjAwODAwICsgZW50cnktPndyaXRlOworCQlicmVhazsKKwljYXNlIDU6CisJCWkyYy0+YWxnby5iaXQuc2V0c2RhID0gbnY1MF9pMmNfc2V0c2RhOworCQlpMmMtPmFsZ28uYml0LnNldHNjbCA9IG52NTBfaTJjX3NldHNjbDsKKwkJaTJjLT5hbGdvLmJpdC5nZXRzZGEgPSBudjUwX2kyY19nZXRzZGE7CisJCWkyYy0+YWxnby5iaXQuZ2V0c2NsID0gbnY1MF9pMmNfZ2V0c2NsOworCQlpMmMtPnJkID0gbnY1MF9pMmNfcG9ydFtlbnRyeS0+cmVhZF07CisJCWkyYy0+d3IgPSBpMmMtPnJkOworCQlicmVhazsKKwljYXNlIDY6CisJCWkyYy0+cmQgPSBlbnRyeS0+cmVhZDsKKwkJaTJjLT53ciA9IGVudHJ5LT53cml0ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTlZfRVJST1IoZGV2LCAiRENCIEkyQyBwb3J0IHR5cGUgJWQgdW5rbm93blxuIiwKKwkJCSBlbnRyeS0+cG9ydF90eXBlKTsKKwkJa2ZyZWUoaTJjKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc25wcmludGYoaTJjLT5hZGFwdGVyLm5hbWUsIHNpemVvZihpMmMtPmFkYXB0ZXIubmFtZSksCisJCSAibm91dmVhdS0lcy0lZCIsIHBjaV9uYW1lKGRldi0+cGRldiksIGluZGV4KTsKKwlpMmMtPmFkYXB0ZXIub3duZXIgPSBUSElTX01PRFVMRTsKKwlpMmMtPmFkYXB0ZXIuZGV2LnBhcmVudCA9ICZkZXYtPnBkZXYtPmRldjsKKwlpMmMtPmRldiA9IGRldjsKKwlpMmNfc2V0X2FkYXBkYXRhKCZpMmMtPmFkYXB0ZXIsIGkyYyk7CisKKwlpZiAoZW50cnktPnBvcnRfdHlwZSA8IDYpIHsKKwkJaTJjLT5hZGFwdGVyLmFsZ29fZGF0YSA9ICZpMmMtPmFsZ28uYml0OworCQlpMmMtPmFsZ28uYml0LnVkZWxheSA9IDQwOworCQlpMmMtPmFsZ28uYml0LnRpbWVvdXQgPSB1c2Vjc190b19qaWZmaWVzKDUwMDApOworCQlpMmMtPmFsZ28uYml0LmRhdGEgPSBpMmM7CisJCXJldCA9IGkyY19iaXRfYWRkX2J1cygmaTJjLT5hZGFwdGVyKTsKKwl9IGVsc2UgeworCQlpMmMtPmFkYXB0ZXIuYWxnb19kYXRhID0gJmkyYy0+YWxnby5kcDsKKwkJaTJjLT5hbGdvLmRwLnJ1bm5pbmcgPSBmYWxzZTsKKwkJaTJjLT5hbGdvLmRwLmFkZHJlc3MgPSAwOworCQlpMmMtPmFsZ28uZHAuYXV4X2NoID0gbm91dmVhdV9kcF9pMmNfYXV4X2NoOworCQlyZXQgPSBpMmNfZHBfYXV4X2FkZF9idXMoJmkyYy0+YWRhcHRlcik7CisJfQorCisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgaTJjICVkXG4iLCBpbmRleCk7CisJCWtmcmVlKGkyYyk7CisJCXJldHVybiByZXQ7CisJfQorCisJZW50cnktPmNoYW4gPSBpMmM7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK25vdXZlYXVfaTJjX2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9pMmNfZW50cnkgKmVudHJ5KQoreworCWlmICghZW50cnktPmNoYW4pCisJCXJldHVybjsKKworCWkyY19kZWxfYWRhcHRlcigmZW50cnktPmNoYW4tPmFkYXB0ZXIpOworCWtmcmVlKGVudHJ5LT5jaGFuKTsKKwllbnRyeS0+Y2hhbiA9IE5VTEw7Cit9CisKK3N0cnVjdCBub3V2ZWF1X2kyY19jaGFuICoKK25vdXZlYXVfaTJjX2ZpbmQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGluZGV4KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkZXZfcHJpdi0+VkJJT1M7CisKKwlpZiAoaW5kZXggPiBEQ0JfTUFYX05VTV9JMkNfRU5UUklFUykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIWJpb3MtPmJkY2IuZGNiLmkyY1tpbmRleF0uY2hhbikgeworCQlpZiAobm91dmVhdV9pMmNfaW5pdChkZXYsICZiaW9zLT5iZGNiLmRjYi5pMmNbaW5kZXhdLCBpbmRleCkpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gYmlvcy0+YmRjYi5kY2IuaTJjW2luZGV4XS5jaGFuOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2kyYy5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9pMmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGVhZjdhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9pMmMuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDkgUmVkIEhhdCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfX05PVVZFQVVfSTJDX0hfXworI2RlZmluZSBfX05PVVZFQVVfSTJDX0hfXworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWlkLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CisjaW5jbHVkZSAiZHJtX2RwX2hlbHBlci5oIgorCitzdHJ1Y3QgZGNiX2kyY19lbnRyeTsKKworc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4geworCXN0cnVjdCBpMmNfYWRhcHRlciBhZGFwdGVyOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CisJdW5pb24geworCQlzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgYml0OworCQlzdHJ1Y3QgaTJjX2FsZ29fZHBfYXV4X2RhdGEgZHA7CisJfSBhbGdvOworCXVuc2lnbmVkIHJkOworCXVuc2lnbmVkIHdyOworCXVuc2lnbmVkIGRhdGE7Cit9OworCitpbnQgbm91dmVhdV9pMmNfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3QgZGNiX2kyY19lbnRyeSAqLCBpbnQgaW5kZXgpOwordm9pZCBub3V2ZWF1X2kyY19maW5pKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBkY2JfaTJjX2VudHJ5ICopOworc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKm5vdXZlYXVfaTJjX2ZpbmQoc3RydWN0IGRybV9kZXZpY2UgKiwgaW50IGluZGV4KTsKKworaW50IG5vdXZlYXVfZHBfaTJjX2F1eF9jaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiwgaW50IG1vZGUsIHVpbnQ4X3Qgd3JpdGVfYnl0ZSwKKwkJCSAgdWludDhfdCAqcmVhZF9ieXRlKTsKKworI2VuZGlmIC8qIF9fTk9VVkVBVV9JMkNfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2lvYzMyLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2lvYzMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJjMzBmNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaW9jMzIuYwpAQCAtMCwwICsxLDcyIEBACisvKioKKyAqIFxmaWxlIG1nYV9pb2MzMi5jCisgKgorICogMzItYml0IGlvY3RsIGNvbXBhdGliaWxpdHkgcm91dGluZXMgZm9yIHRoZSBNR0EgRFJNLgorICoKKyAqIFxhdXRob3IgRGF2ZSBBaXJsaWUgPGFpcmxpZWRAbGludXguaWU+IHdpdGggY29kZSBmcm9tIHBhdGNoZXMgYnkgRWdiZXJ0IEVpY2gKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSBQYXVsIE1hY2tlcnJhcyAyMDA1CisgKiBDb3B5cmlnaHQgKEMpIEVnYmVydCBFaWNoIDIwMDMsMjAwNAorICogQ29weXJpZ2h0IChDKSBEYXZlIEFpcmxpZSAyMDA1CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKworI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisKKy8qKgorICogQ2FsbGVkIHdoZW5ldmVyIGEgMzItYml0IHByb2Nlc3MgcnVubmluZyB1bmRlciBhIDY0LWJpdCBrZXJuZWwKKyAqIHBlcmZvcm1zIGFuIGlvY3RsIG9uIC9kZXYvZHJpL2NhcmQ8bj4uCisgKgorICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGFyZyB1c2VyIGFyZ3VtZW50LgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCisgKi8KK2xvbmcgbm91dmVhdV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdW5zaWduZWQgaW50IG5yID0gRFJNX0lPQ1RMX05SKGNtZCk7CisJZHJtX2lvY3RsX2NvbXBhdF90ICpmbiA9IE5VTEw7CisJaW50IHJldDsKKworCWlmIChuciA8IERSTV9DT01NQU5EX0JBU0UpCisJCXJldHVybiBkcm1fY29tcGF0X2lvY3RsKGZpbHAsIGNtZCwgYXJnKTsKKworI2lmIDAKKwlpZiAobnIgPCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0FSUkFZX1NJWkUobWdhX2NvbXBhdF9pb2N0bHMpKQorCQlmbiA9IG5vdXZlYXVfY29tcGF0X2lvY3Rsc1tuciAtIERSTV9DT01NQU5EX0JBU0VdOworI2VuZGlmCisJbG9ja19rZXJuZWwoKTsJICAvKiBYWFggZm9yIG5vdyAqLworCWlmIChmbiAhPSBOVUxMKQorCQlyZXQgPSAoKmZuKShmaWxwLCBjbWQsIGFyZyk7CisJZWxzZQorCQlyZXQgPSBkcm1faW9jdGwoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbHAsIGNtZCwgYXJnKTsKKwl1bmxvY2tfa2VybmVsKCk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9pcnEuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcwYzcyYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaXJxLmMKQEAgLTAsMCArMSw3MDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQmVuIFNrZWdncy4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisvKgorICogQXV0aG9yczoKKyAqICAgQmVuIFNrZWdncyA8ZGFya3RhbWFAaWluZXQubmV0LmF1PgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcm0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfcmVnLmgiCisjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CisKKy8qIG5lZWRlZCBmb3IgaG90cGx1ZyBpcnEgKi8KKyNpbmNsdWRlICJub3V2ZWF1X2Nvbm5lY3Rvci5oIgorI2luY2x1ZGUgIm52NTBfZGlzcGxheS5oIgorCit2b2lkCitub3V2ZWF1X2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCS8qIE1hc3RlciBkaXNhYmxlICovCisJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0lOVFJfRU5fMCwgMCk7CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl81MCkgeworCQlJTklUX1dPUksoJmRldl9wcml2LT5pcnFfd29yaywgbnY1MF9kaXNwbGF5X2lycV9oYW5kbGVyX2JoKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmRldl9wcml2LT52Ymxfd2FpdGluZyk7CisJfQorfQorCitpbnQKK25vdXZlYXVfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJLyogTWFzdGVyIGVuYWJsZSAqLworCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19JTlRSX0VOXzAsIE5WX1BNQ19JTlRSX0VOXzBfTUFTVEVSX0VOQUJMRSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK25vdXZlYXVfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCS8qIE1hc3RlciBkaXNhYmxlICovCisJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0lOVFJfRU5fMCwgMCk7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfY2FsbF9tZXRob2Qoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGNsYXNzLCBpbnQgbXRoZCwgaW50IGRhdGEpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gY2hhbi0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X21ldGhvZCAqZ3JtOworCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfY2xhc3MgKmdyYzsKKworCWdyYyA9IGRldl9wcml2LT5lbmdpbmUuZ3JhcGguZ3JjbGFzczsKKwl3aGlsZSAoZ3JjLT5pZCkgeworCQlpZiAoZ3JjLT5pZCA9PSBjbGFzcykKKwkJCWJyZWFrOworCQlncmMrKzsKKwl9CisKKwlpZiAoZ3JjLT5pZCAhPSBjbGFzcyB8fCAhZ3JjLT5tZXRob2RzKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWdybSA9IGdyYy0+bWV0aG9kczsKKwl3aGlsZSAoZ3JtLT5pZCkgeworCQlpZiAoZ3JtLT5pZCA9PSBtdGhkKQorCQkJcmV0dXJuIGdybS0+ZXhlYyhjaGFuLCBjbGFzcywgbXRoZCwgZGF0YSk7CisJCWdybSsrOworCX0KKworCXJldHVybiAtRU5PRU5UOworfQorCitzdGF0aWMgYm9vbAorbm91dmVhdV9maWZvX3N3bXRoZChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCB1aW50MzJfdCBhZGRyLCB1aW50MzJfdCBkYXRhKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJY29uc3QgaW50IHN1YmMgPSAoYWRkciA+PiAxMykgJiAweDc7CisJY29uc3QgaW50IG10aGQgPSBhZGRyICYgMHgxZmZjOworCisJaWYgKG10aGQgPT0gMHgwMDAwKSB7CisJCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYgKnJlZiA9IE5VTEw7CisKKwkJaWYgKG5vdXZlYXVfZ3B1b2JqX3JlZl9maW5kKGNoYW4sIGRhdGEsICZyZWYpKQorCQkJcmV0dXJuIGZhbHNlOworCisJCWlmIChyZWYtPmdwdW9iai0+ZW5naW5lICE9IE5WT0JKX0VOR0lORV9TVykKKwkJCXJldHVybiBmYWxzZTsKKworCQljaGFuLT5zd19zdWJjaGFubmVsW3N1YmNdID0gcmVmLT5ncHVvYmotPmNsYXNzOworCQludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRU5HSU5FLCBudl9yZDMyKGRldiwKKwkJCU5WMDRfUEZJRk9fQ0FDSEUxX0VOR0lORSkgJiB+KDB4ZiA8PCBzdWJjICogNCkpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKiBodyBvYmplY3QgKi8KKwlpZiAobnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0VOR0lORSkgJiAoMSA8PCAoc3ViYyo0KSkpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChub3V2ZWF1X2NhbGxfbWV0aG9kKGNoYW4sIGNoYW4tPnN3X3N1YmNoYW5uZWxbc3ViY10sIG10aGQsIGRhdGEpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQKK25vdXZlYXVfZmlmb19pcnFfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZW5naW5lICplbmdpbmUgPSAmZGV2X3ByaXYtPmVuZ2luZTsKKwl1aW50MzJfdCBzdGF0dXMsIHJlYXNzaWduOworCWludCBjbnQgPSAwOworCisJcmVhc3NpZ24gPSBudl9yZDMyKGRldiwgTlYwM19QRklGT19DQUNIRVMpICYgMTsKKwl3aGlsZSAoKHN0YXR1cyA9IG52X3JkMzIoZGV2LCBOVjAzX1BGSUZPX0lOVFJfMCkpICYmIChjbnQrKyA8IDEwMCkpIHsKKwkJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IE5VTEw7CisJCXVpbnQzMl90IGNoaWQsIGdldDsKKworCQludl93cjMyKGRldiwgTlYwM19QRklGT19DQUNIRVMsIDApOworCisJCWNoaWQgPSBlbmdpbmUtPmZpZm8uY2hhbm5lbF9pZChkZXYpOworCQlpZiAoY2hpZCA+PSAwICYmIGNoaWQgPCBlbmdpbmUtPmZpZm8uY2hhbm5lbHMpCisJCQljaGFuID0gZGV2X3ByaXYtPmZpZm9zW2NoaWRdOworCQlnZXQgID0gbnZfcmQzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX0dFVCk7CisKKwkJaWYgKHN0YXR1cyAmIE5WX1BGSUZPX0lOVFJfQ0FDSEVfRVJST1IpIHsKKwkJCXVpbnQzMl90IG10aGQsIGRhdGE7CisJCQlpbnQgcHRyOworCisJCQkvKiBOVl9QRklGT19DQUNIRTFfR0VUIGFjdHVhbGx5IGdvZXMgdG8gMHhmZmMgYmVmb3JlCisJCQkgKiB3cmFwcGluZyBvbiBteSBHODAgY2hpcHMsIGJ1dCBDQUNIRTEgaXNuJ3QgYmlnCisJCQkgKiBlbm91Z2ggZm9yIHRoaXMgbXVjaCBkYXRhLi4gVGVzdHMgc2hvdyB0aGF0IGl0CisJCQkgKiB3cmFwcyBhcm91bmQgdG8gdGhlIHN0YXJ0IGF0IEdFVD0weDgwMC4uIE5vIGNsdWUKKwkJCSAqIGFzIHRvIHdoeS4uCisJCQkgKi8KKwkJCXB0ciA9IChnZXQgJiAweDdmZikgPj4gMjsKKworCQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl80MCkgeworCQkJCW10aGQgPSBudl9yZDMyKGRldiwKKwkJCQkJTlYwNF9QRklGT19DQUNIRTFfTUVUSE9EKHB0cikpOworCQkJCWRhdGEgPSBudl9yZDMyKGRldiwKKwkJCQkJTlYwNF9QRklGT19DQUNIRTFfREFUQShwdHIpKTsKKwkJCX0gZWxzZSB7CisJCQkJbXRoZCA9IG52X3JkMzIoZGV2LAorCQkJCQlOVjQwX1BGSUZPX0NBQ0hFMV9NRVRIT0QocHRyKSk7CisJCQkJZGF0YSA9IG52X3JkMzIoZGV2LAorCQkJCQlOVjQwX1BGSUZPX0NBQ0hFMV9EQVRBKHB0cikpOworCQkJfQorCisJCQlpZiAoIWNoYW4gfHwgIW5vdXZlYXVfZmlmb19zd210aGQoY2hhbiwgbXRoZCwgZGF0YSkpIHsKKwkJCQlOVl9JTkZPKGRldiwgIlBGSUZPX0NBQ0hFX0VSUk9SIC0gQ2ggJWQvJWQgIgorCQkJCQkgICAgICJNdGhkIDB4JTA0eCBEYXRhIDB4JTA4eFxuIiwKKwkJCQkJY2hpZCwgKG10aGQgPj4gMTMpICYgNywgbXRoZCAmIDB4MWZmYywKKwkJCQkJZGF0YSk7CisJCQl9CisKKwkJCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfUFVTSCwgMCk7CisJCQludl93cjMyKGRldiwgTlYwM19QRklGT19JTlRSXzAsCisJCQkJCQlOVl9QRklGT19JTlRSX0NBQ0hFX0VSUk9SKTsKKworCQkJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX1BVU0gwLAorCQkJCW52X3JkMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9QVVNIMCkgJiB+MSk7CisJCQludl93cjMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfR0VULCBnZXQgKyA0KTsKKwkJCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9QVVNIMCwKKwkJCQludl9yZDMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfUFVTSDApIHwgMSk7CisJCQludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfSEFTSCwgMCk7CisKKwkJCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfUFVTSCwKKwkJCQludl9yZDMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX1BVU0gpIHwgMSk7CisJCQludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfUFVMTDAsIDEpOworCisJCQlzdGF0dXMgJj0gfk5WX1BGSUZPX0lOVFJfQ0FDSEVfRVJST1I7CisJCX0KKworCQlpZiAoc3RhdHVzICYgTlZfUEZJRk9fSU5UUl9ETUFfUFVTSEVSKSB7CisJCQlOVl9JTkZPKGRldiwgIlBGSUZPX0RNQV9QVVNIRVIgLSBDaCAlZFxuIiwgY2hpZCk7CisKKwkJCXN0YXR1cyAmPSB+TlZfUEZJRk9fSU5UUl9ETUFfUFVTSEVSOworCQkJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fSU5UUl8wLAorCQkJCQkJTlZfUEZJRk9fSU5UUl9ETUFfUFVTSEVSKTsKKworCQkJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9TVEFURSwgMHgwMDAwMDAwMCk7CisJCQlpZiAobnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9QVVQpICE9IGdldCkKKwkJCQludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0dFVCwKKwkJCQkJCQkJZ2V0ICsgNCk7CisJCX0KKworCQlpZiAoc3RhdHVzKSB7CisJCQlOVl9JTkZPKGRldiwgIlBGSUZPX0lOVFIgMHglMDh4IC0gQ2ggJWRcbiIsCisJCQkJc3RhdHVzLCBjaGlkKTsKKwkJCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0lOVFJfMCwgc3RhdHVzKTsKKwkJCXN0YXR1cyA9IDA7CisJCX0KKworCQludl93cjMyKGRldiwgTlYwM19QRklGT19DQUNIRVMsIHJlYXNzaWduKTsKKwl9CisKKwlpZiAoc3RhdHVzKSB7CisJCU5WX0lORk8oZGV2LCAiUEZJRk8gc3RpbGwgYW5ncnkgYWZ0ZXIgJWQgc3BpbnMsIGhhbHRcbiIsIGNudCk7CisJCW52X3dyMzIoZGV2LCAweDIxNDAsIDApOworCQludl93cjMyKGRldiwgMHgxNDAsIDApOworCX0KKworCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19JTlRSXzAsIE5WX1BNQ19JTlRSXzBfUEZJRk9fUEVORElORyk7Cit9CisKK3N0cnVjdCBub3V2ZWF1X2JpdGZpZWxkX25hbWVzIHsKKwl1aW50MzJfdCBtYXNrOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCitzdGF0aWMgc3RydWN0IG5vdXZlYXVfYml0ZmllbGRfbmFtZXMgbnN0YXR1c19uYW1lc1tdID0KK3sKKwl7IE5WMDRfUEdSQVBIX05TVEFUVVNfU1RBVEVfSU5fVVNFLCAgICAgICAiU1RBVEVfSU5fVVNFIiB9LAorCXsgTlYwNF9QR1JBUEhfTlNUQVRVU19JTlZBTElEX1NUQVRFLCAgICAgICJJTlZBTElEX1NUQVRFIiB9LAorCXsgTlYwNF9QR1JBUEhfTlNUQVRVU19CQURfQVJHVU1FTlQsICAgICAgICJCQURfQVJHVU1FTlQiIH0sCisJeyBOVjA0X1BHUkFQSF9OU1RBVFVTX1BST1RFQ1RJT05fRkFVTFQsICAgIlBST1RFQ1RJT05fRkFVTFQiIH0KK307CisKK3N0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9iaXRmaWVsZF9uYW1lcyBuc3RhdHVzX25hbWVzX252MTBbXSA9Cit7CisJeyBOVjEwX1BHUkFQSF9OU1RBVFVTX1NUQVRFX0lOX1VTRSwgICAgICAgIlNUQVRFX0lOX1VTRSIgfSwKKwl7IE5WMTBfUEdSQVBIX05TVEFUVVNfSU5WQUxJRF9TVEFURSwgICAgICAiSU5WQUxJRF9TVEFURSIgfSwKKwl7IE5WMTBfUEdSQVBIX05TVEFUVVNfQkFEX0FSR1VNRU5ULCAgICAgICAiQkFEX0FSR1VNRU5UIiB9LAorCXsgTlYxMF9QR1JBUEhfTlNUQVRVU19QUk9URUNUSU9OX0ZBVUxULCAgICJQUk9URUNUSU9OX0ZBVUxUIiB9Cit9OworCitzdGF0aWMgc3RydWN0IG5vdXZlYXVfYml0ZmllbGRfbmFtZXMgbnNvdXJjZV9uYW1lc1tdID0KK3sKKwl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfTk9USUZJQ0FUSU9OLCAgICAgICAiTk9USUZJQ0FUSU9OIiB9LAorCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9EQVRBX0VSUk9SLCAgICAgICAgICJEQVRBX0VSUk9SIiB9LAorCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9QUk9URUNUSU9OX0VSUk9SLCAgICJQUk9URUNUSU9OX0VSUk9SIiB9LAorCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9SQU5HRV9FWENFUFRJT04sICAgICJSQU5HRV9FWENFUFRJT04iIH0sCisJeyBOVjAzX1BHUkFQSF9OU09VUkNFX0xJTUlUX0NPTE9SLCAgICAgICAgIkxJTUlUX0NPTE9SIiB9LAorCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9MSU1JVF9aRVRBLCAgICAgICAgICJMSU1JVF9aRVRBIiB9LAorCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9JTExFR0FMX01USEQsICAgICAgICJJTExFR0FMX01USEQiIH0sCisJeyBOVjAzX1BHUkFQSF9OU09VUkNFX0RNQV9SX1BST1RFQ1RJT04sICAgIkRNQV9SX1BST1RFQ1RJT04iIH0sCisJeyBOVjAzX1BHUkFQSF9OU09VUkNFX0RNQV9XX1BST1RFQ1RJT04sICAgIkRNQV9XX1BST1RFQ1RJT04iIH0sCisJeyBOVjAzX1BHUkFQSF9OU09VUkNFX0ZPUk1BVF9FWENFUFRJT04sICAgIkZPUk1BVF9FWENFUFRJT04iIH0sCisJeyBOVjAzX1BHUkFQSF9OU09VUkNFX1BBVENIX0VYQ0VQVElPTiwgICAgIlBBVENIX0VYQ0VQVElPTiIgfSwKKwl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfU1RBVEVfSU5WQUxJRCwgICAgICAiU1RBVEVfSU5WQUxJRCIgfSwKKwl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfRE9VQkxFX05PVElGWSwgICAgICAiRE9VQkxFX05PVElGWSIgfSwKKwl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfTk9USUZZX0lOX1VTRSwgICAgICAiTk9USUZZX0lOX1VTRSIgfSwKKwl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfTUVUSE9EX0NOVCwgICAgICAgICAiTUVUSE9EX0NOVCIgfSwKKwl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfQkZSX05PVElGSUNBVElPTiwgICAiQkZSX05PVElGSUNBVElPTiIgfSwKKwl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfRE1BX1ZUWF9QUk9URUNUSU9OLCAiRE1BX1ZUWF9QUk9URUNUSU9OIiB9LAorCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9ETUFfV0lEVEhfQSwgICAgICAgICJETUFfV0lEVEhfQSIgfSwKKwl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfRE1BX1dJRFRIX0IsICAgICAgICAiRE1BX1dJRFRIX0IiIH0sCit9OworCitzdGF0aWMgdm9pZAorbm91dmVhdV9wcmludF9iaXRmaWVsZF9uYW1lc18odWludDMyX3QgdmFsdWUsCisJCQkJY29uc3Qgc3RydWN0IG5vdXZlYXVfYml0ZmllbGRfbmFtZXMgKm5hbWVsaXN0LAorCQkJCWNvbnN0IGludCBuYW1lbGlzdF9sZW4pCit7CisJLyoKKwkgKiBDYWxsZXIgbXVzdCBoYXZlIGFscmVhZHkgcHJpbnRlZCB0aGUgS0VSTl8qIGxvZyBsZXZlbCBmb3IgdXMuCisJICogQWxzbyB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhZGRpbmcgdGhlIG5ld2xpbmUuCisJICovCisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IG5hbWVsaXN0X2xlbjsgKytpKSB7CisJCXVpbnQzMl90IG1hc2sgPSBuYW1lbGlzdFtpXS5tYXNrOworCQlpZiAodmFsdWUgJiBtYXNrKSB7CisJCQlwcmludGsoIiAlcyIsIG5hbWVsaXN0W2ldLm5hbWUpOworCQkJdmFsdWUgJj0gfm1hc2s7CisJCX0KKwl9CisJaWYgKHZhbHVlKQorCQlwcmludGsoIiAodW5rbm93biBiaXRzIDB4JTA4eCkiLCB2YWx1ZSk7Cit9CisjZGVmaW5lIG5vdXZlYXVfcHJpbnRfYml0ZmllbGRfbmFtZXModmFsLCBuYW1lbGlzdCkgXAorCW5vdXZlYXVfcHJpbnRfYml0ZmllbGRfbmFtZXNfKCh2YWwpLCAobmFtZWxpc3QpLCBBUlJBWV9TSVpFKG5hbWVsaXN0KSkKKworCitzdGF0aWMgaW50Citub3V2ZWF1X2dyYXBoX2NoaWRfZnJvbV9ncmN0eChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdWludDMyX3QgaW5zdDsKKwlpbnQgaTsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNDApCisJCXJldHVybiBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHM7CisJZWxzZQorCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApIHsKKwkJaW5zdCA9IChudl9yZDMyKGRldiwgMHg0MDAzMmMpICYgMHhmZmZmZikgPDwgNDsKKworCQlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzOyBpKyspIHsKKwkJCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Zmlmb3NbaV07CisKKwkJCWlmICghY2hhbiB8fCAhY2hhbi0+cmFtaW5fZ3JjdHgpCisJCQkJY29udGludWU7CisKKwkJCWlmIChpbnN0ID09IGNoYW4tPnJhbWluX2dyY3R4LT5pbnN0YW5jZSkKKwkJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCWluc3QgPSAobnZfcmQzMihkZXYsIDB4NDAwMzJjKSAmIDB4ZmZmZmYpIDw8IDEyOworCisJCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHM7IGkrKykgeworCQkJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IGRldl9wcml2LT5maWZvc1tpXTsKKworCQkJaWYgKCFjaGFuIHx8ICFjaGFuLT5yYW1pbikKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGluc3QgPT0gY2hhbi0+cmFtaW4tPmluc3RhbmNlKQorCQkJCWJyZWFrOworCQl9CisJfQorCisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludAorbm91dmVhdV9ncmFwaF90cmFwcGVkX2NoYW5uZWwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50ICpjaGFubmVsX3JldCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2VuZ2luZSAqZW5naW5lID0gJmRldl9wcml2LT5lbmdpbmU7CisJaW50IGNoYW5uZWw7CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzEwKQorCQljaGFubmVsID0gKG52X3JkMzIoZGV2LCBOVjA0X1BHUkFQSF9UUkFQUEVEX0FERFIpID4+IDI0KSAmIDB4ZjsKKwllbHNlCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl80MCkKKwkJY2hhbm5lbCA9IChudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfVFJBUFBFRF9BRERSKSA+PiAyMCkgJiAweDFmOworCWVsc2UKKwkJY2hhbm5lbCA9IG5vdXZlYXVfZ3JhcGhfY2hpZF9mcm9tX2dyY3R4KGRldik7CisKKwlpZiAoY2hhbm5lbCA+PSBlbmdpbmUtPmZpZm8uY2hhbm5lbHMgfHwgIWRldl9wcml2LT5maWZvc1tjaGFubmVsXSkgeworCQlOVl9FUlJPUihkZXYsICJBSUlJLCBpbnZhbGlkL2luYWN0aXZlIGNoYW5uZWwgaWQgJWRcbiIsIGNoYW5uZWwpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkqY2hhbm5lbF9yZXQgPSBjaGFubmVsOworCXJldHVybiAwOworfQorCitzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfdHJhcCB7CisJaW50IGNoYW5uZWw7CisJaW50IGNsYXNzOworCWludCBzdWJjLCBtdGhkLCBzaXplOworCXVpbnQzMl90IGRhdGEsIGRhdGEyOworCXVpbnQzMl90IG5zb3VyY2UsIG5zdGF0dXM7Cit9OworCitzdGF0aWMgdm9pZAorbm91dmVhdV9ncmFwaF90cmFwX2luZm8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBub3V2ZWF1X3BncmFwaF90cmFwICp0cmFwKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdWludDMyX3QgYWRkcmVzczsKKworCXRyYXAtPm5zb3VyY2UgPSB0cmFwLT5uc3RhdHVzID0gMDsKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7CisJCXRyYXAtPm5zb3VyY2UgPSBudl9yZDMyKGRldiwgTlYwM19QR1JBUEhfTlNPVVJDRSk7CisJCXRyYXAtPm5zdGF0dXMgPSBudl9yZDMyKGRldiwgTlYwM19QR1JBUEhfTlNUQVRVUyk7CisJfQorCisJaWYgKG5vdXZlYXVfZ3JhcGhfdHJhcHBlZF9jaGFubmVsKGRldiwgJnRyYXAtPmNoYW5uZWwpKQorCQl0cmFwLT5jaGFubmVsID0gLTE7CisJYWRkcmVzcyA9IG52X3JkMzIoZGV2LCBOVjA0X1BHUkFQSF9UUkFQUEVEX0FERFIpOworCisJdHJhcC0+bXRoZCA9IGFkZHJlc3MgJiAweDFGRkM7CisJdHJhcC0+ZGF0YSA9IG52X3JkMzIoZGV2LCBOVjA0X1BHUkFQSF9UUkFQUEVEX0RBVEEpOworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfMTApIHsKKwkJdHJhcC0+c3ViYyAgPSAoYWRkcmVzcyA+PiAxMykgJiAweDc7CisJfSBlbHNlIHsKKwkJdHJhcC0+c3ViYyAgPSAoYWRkcmVzcyA+PiAxNikgJiAweDc7CisJCXRyYXAtPmRhdGEyID0gbnZfcmQzMihkZXYsIE5WMTBfUEdSQVBIX1RSQVBQRURfREFUQV9ISUdIKTsKKwl9CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzEwKQorCQl0cmFwLT5jbGFzcyA9IG52X3JkMzIoZGV2LCAweDQwMDE4MCArIHRyYXAtPnN1YmMqNCkgJiAweEZGOworCWVsc2UgaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl80MCkKKwkJdHJhcC0+Y2xhc3MgPSBudl9yZDMyKGRldiwgMHg0MDAxNjAgKyB0cmFwLT5zdWJjKjQpICYgMHhGRkY7CisJZWxzZSBpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKQorCQl0cmFwLT5jbGFzcyA9IG52X3JkMzIoZGV2LCAweDQwMDE2MCArIHRyYXAtPnN1YmMqNCkgJiAweEZGRkY7CisJZWxzZQorCQl0cmFwLT5jbGFzcyA9IG52X3JkMzIoZGV2LCAweDQwMDgxNCk7Cit9CisKK3N0YXRpYyB2b2lkCitub3V2ZWF1X2dyYXBoX2R1bXBfdHJhcF9pbmZvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmlkLAorCQkJICAgICBzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfdHJhcCAqdHJhcCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IG5zb3VyY2UgPSB0cmFwLT5uc291cmNlLCBuc3RhdHVzID0gdHJhcC0+bnN0YXR1czsKKworCU5WX0lORk8oZGV2LCAiJXMgLSBuU291cmNlOiIsIGlkKTsKKwlub3V2ZWF1X3ByaW50X2JpdGZpZWxkX25hbWVzKG5zb3VyY2UsIG5zb3VyY2VfbmFtZXMpOworCXByaW50aygiLCBuU3RhdHVzOiIpOworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfMTApCisJCW5vdXZlYXVfcHJpbnRfYml0ZmllbGRfbmFtZXMobnN0YXR1cywgbnN0YXR1c19uYW1lcyk7CisJZWxzZQorCQlub3V2ZWF1X3ByaW50X2JpdGZpZWxkX25hbWVzKG5zdGF0dXMsIG5zdGF0dXNfbmFtZXNfbnYxMCk7CisJcHJpbnRrKCJcbiIpOworCisJTlZfSU5GTyhkZXYsICIlcyAtIENoICVkLyVkIENsYXNzIDB4JTA0eCBNdGhkIDB4JTA0eCAiCisJCQkJCSJEYXRhIDB4JTA4eDoweCUwOHhcbiIsCisJCQkJCWlkLCB0cmFwLT5jaGFubmVsLCB0cmFwLT5zdWJjLAorCQkJCQl0cmFwLT5jbGFzcywgdHJhcC0+bXRoZCwKKwkJCQkJdHJhcC0+ZGF0YTIsIHRyYXAtPmRhdGEpOworfQorCitzdGF0aWMgaW50Citub3V2ZWF1X3BncmFwaF9pbnRyX3N3bXRoZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IG5vdXZlYXVfcGdyYXBoX3RyYXAgKnRyYXApCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmICh0cmFwLT5jaGFubmVsIDwgMCB8fAorCSAgICB0cmFwLT5jaGFubmVsID49IGRldl9wcml2LT5lbmdpbmUuZmlmby5jaGFubmVscyB8fAorCSAgICAhZGV2X3ByaXYtPmZpZm9zW3RyYXAtPmNoYW5uZWxdKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiBub3V2ZWF1X2NhbGxfbWV0aG9kKGRldl9wcml2LT5maWZvc1t0cmFwLT5jaGFubmVsXSwKKwkJCQkgICB0cmFwLT5jbGFzcywgdHJhcC0+bXRoZCwgdHJhcC0+ZGF0YSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorbm91dmVhdV9wZ3JhcGhfaW50cl9ub3RpZnkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgbnNvdXJjZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfdHJhcCB0cmFwOworCWludCB1bmhhbmRsZWQgPSAwOworCisJbm91dmVhdV9ncmFwaF90cmFwX2luZm8oZGV2LCAmdHJhcCk7CisKKwlpZiAobnNvdXJjZSAmIE5WMDNfUEdSQVBIX05TT1VSQ0VfSUxMRUdBTF9NVEhEKSB7CisJCWlmIChub3V2ZWF1X3BncmFwaF9pbnRyX3N3bXRoZChkZXYsICZ0cmFwKSkKKwkJCXVuaGFuZGxlZCA9IDE7CisJfSBlbHNlIHsKKwkJdW5oYW5kbGVkID0gMTsKKwl9CisKKwlpZiAodW5oYW5kbGVkKQorCQlub3V2ZWF1X2dyYXBoX2R1bXBfdHJhcF9pbmZvKGRldiwgIlBHUkFQSF9OT1RJRlkiLCAmdHJhcCk7Cit9CisKK3N0YXRpYyBERUZJTkVfUkFURUxJTUlUX1NUQVRFKG5vdXZlYXVfcmF0ZWxpbWl0X3N0YXRlLCAzICogSFosIDIwKTsKKworc3RhdGljIGludCBub3V2ZWF1X3JhdGVsaW1pdCh2b2lkKQoreworCXJldHVybiBfX3JhdGVsaW1pdCgmbm91dmVhdV9yYXRlbGltaXRfc3RhdGUpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorbm91dmVhdV9wZ3JhcGhfaW50cl9lcnJvcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBuc291cmNlKQoreworCXN0cnVjdCBub3V2ZWF1X3BncmFwaF90cmFwIHRyYXA7CisJaW50IHVuaGFuZGxlZCA9IDA7CisKKwlub3V2ZWF1X2dyYXBoX3RyYXBfaW5mbyhkZXYsICZ0cmFwKTsKKwl0cmFwLm5zb3VyY2UgPSBuc291cmNlOworCisJaWYgKG5zb3VyY2UgJiBOVjAzX1BHUkFQSF9OU09VUkNFX0lMTEVHQUxfTVRIRCkgeworCQlpZiAobm91dmVhdV9wZ3JhcGhfaW50cl9zd210aGQoZGV2LCAmdHJhcCkpCisJCQl1bmhhbmRsZWQgPSAxOworCX0gZWxzZSB7CisJCXVuaGFuZGxlZCA9IDE7CisJfQorCisJaWYgKHVuaGFuZGxlZCAmJiBub3V2ZWF1X3JhdGVsaW1pdCgpKQorCQlub3V2ZWF1X2dyYXBoX2R1bXBfdHJhcF9pbmZvKGRldiwgIlBHUkFQSF9FUlJPUiIsICZ0cmFwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitub3V2ZWF1X3BncmFwaF9pbnRyX2NvbnRleHRfc3dpdGNoKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmdpbmUgKmVuZ2luZSA9ICZkZXZfcHJpdi0+ZW5naW5lOworCXVpbnQzMl90IGNoaWQ7CisKKwljaGlkID0gZW5naW5lLT5maWZvLmNoYW5uZWxfaWQoZGV2KTsKKwlOVl9ERUJVRyhkZXYsICJQR1JBUEggY29udGV4dCBzd2l0Y2ggaW50ZXJydXB0IGNoYW5uZWwgJXhcbiIsIGNoaWQpOworCisJc3dpdGNoIChkZXZfcHJpdi0+Y2FyZF90eXBlKSB7CisJY2FzZSBOVl8wNDoKKwkJbnYwNF9ncmFwaF9jb250ZXh0X3N3aXRjaChkZXYpOworCQlicmVhazsKKwljYXNlIE5WXzEwOgorCQludjEwX2dyYXBoX2NvbnRleHRfc3dpdGNoKGRldik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCU5WX0VSUk9SKGRldiwgIkNvbnRleHQgc3dpdGNoIG5vdCBpbXBsZW1lbnRlZFxuIik7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQKK25vdXZlYXVfcGdyYXBoX2lycV9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJdWludDMyX3Qgc3RhdHVzOworCisJd2hpbGUgKChzdGF0dXMgPSBudl9yZDMyKGRldiwgTlYwM19QR1JBUEhfSU5UUikpKSB7CisJCXVpbnQzMl90IG5zb3VyY2UgPSBudl9yZDMyKGRldiwgTlYwM19QR1JBUEhfTlNPVVJDRSk7CisKKwkJaWYgKHN0YXR1cyAmIE5WX1BHUkFQSF9JTlRSX05PVElGWSkgeworCQkJbm91dmVhdV9wZ3JhcGhfaW50cl9ub3RpZnkoZGV2LCBuc291cmNlKTsKKworCQkJc3RhdHVzICY9IH5OVl9QR1JBUEhfSU5UUl9OT1RJRlk7CisJCQludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUiwgTlZfUEdSQVBIX0lOVFJfTk9USUZZKTsKKwkJfQorCisJCWlmIChzdGF0dXMgJiBOVl9QR1JBUEhfSU5UUl9FUlJPUikgeworCQkJbm91dmVhdV9wZ3JhcGhfaW50cl9lcnJvcihkZXYsIG5zb3VyY2UpOworCisJCQlzdGF0dXMgJj0gfk5WX1BHUkFQSF9JTlRSX0VSUk9SOworCQkJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIsIE5WX1BHUkFQSF9JTlRSX0VSUk9SKTsKKwkJfQorCisJCWlmIChzdGF0dXMgJiBOVl9QR1JBUEhfSU5UUl9DT05URVhUX1NXSVRDSCkgeworCQkJbm91dmVhdV9wZ3JhcGhfaW50cl9jb250ZXh0X3N3aXRjaChkZXYpOworCisJCQlzdGF0dXMgJj0gfk5WX1BHUkFQSF9JTlRSX0NPTlRFWFRfU1dJVENIOworCQkJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIsCisJCQkJIE5WX1BHUkFQSF9JTlRSX0NPTlRFWFRfU1dJVENIKTsKKwkJfQorCisJCWlmIChzdGF0dXMpIHsKKwkJCU5WX0lORk8oZGV2LCAiVW5oYW5kbGVkIFBHUkFQSF9JTlRSIC0gMHglMDh4XG4iLCBzdGF0dXMpOworCQkJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIsIHN0YXR1cyk7CisJCX0KKworCQlpZiAoKG52X3JkMzIoZGV2LCBOVjA0X1BHUkFQSF9GSUZPKSAmICgxIDw8IDApKSA9PSAwKQorCQkJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0ZJRk8sIDEpOworCX0KKworCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19JTlRSXzAsIE5WX1BNQ19JTlRSXzBfUEdSQVBIX1BFTkRJTkcpOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9wZ3JhcGhfaXJxX2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwl1aW50MzJfdCBzdGF0dXMsIG5zb3VyY2U7CisKKwlzdGF0dXMgPSBudl9yZDMyKGRldiwgTlYwM19QR1JBUEhfSU5UUik7CisJbnNvdXJjZSA9IG52X3JkMzIoZGV2LCBOVjAzX1BHUkFQSF9OU09VUkNFKTsKKworCWlmIChzdGF0dXMgJiAweDAwMDAwMDAxKSB7CisJCW5vdXZlYXVfcGdyYXBoX2ludHJfbm90aWZ5KGRldiwgbnNvdXJjZSk7CisJCXN0YXR1cyAmPSB+MHgwMDAwMDAwMTsKKwkJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIsIDB4MDAwMDAwMDEpOworCX0KKworCWlmIChzdGF0dXMgJiAweDAwMDAwMDEwKSB7CisJCW5vdXZlYXVfcGdyYXBoX2ludHJfZXJyb3IoZGV2LCBuc291cmNlIHwKKwkJCQkJICBOVjAzX1BHUkFQSF9OU09VUkNFX0lMTEVHQUxfTVRIRCk7CisKKwkJc3RhdHVzICY9IH4weDAwMDAwMDEwOworCQludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUiwgMHgwMDAwMDAxMCk7CisJfQorCisJaWYgKHN0YXR1cyAmIDB4MDAwMDEwMDApIHsKKwkJbnZfd3IzMihkZXYsIDB4NDAwNTAwLCAweDAwMDAwMDAwKTsKKwkJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIsIE5WX1BHUkFQSF9JTlRSX0NPTlRFWFRfU1dJVENIKTsKKwkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX0lOVFJfRU4sIG52X3JkMzIoZGV2LAorCQkJTlY0MF9QR1JBUEhfSU5UUl9FTikgJiB+TlZfUEdSQVBIX0lOVFJfQ09OVEVYVF9TV0lUQ0gpOworCQludl93cjMyKGRldiwgMHg0MDA1MDAsIDB4MDAwMTAwMDEpOworCisJCW52NTBfZ3JhcGhfY29udGV4dF9zd2l0Y2goZGV2KTsKKworCQlzdGF0dXMgJj0gfk5WX1BHUkFQSF9JTlRSX0NPTlRFWFRfU1dJVENIOworCX0KKworCWlmIChzdGF0dXMgJiAweDAwMTAwMDAwKSB7CisJCW5vdXZlYXVfcGdyYXBoX2ludHJfZXJyb3IoZGV2LCBuc291cmNlIHwKKwkJCQkJICBOVjAzX1BHUkFQSF9OU09VUkNFX0RBVEFfRVJST1IpOworCisJCXN0YXR1cyAmPSB+MHgwMDEwMDAwMDsKKwkJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIsIDB4MDAxMDAwMDApOworCX0KKworCWlmIChzdGF0dXMgJiAweDAwMjAwMDAwKSB7CisJCWludCByOworCisJCW5vdXZlYXVfcGdyYXBoX2ludHJfZXJyb3IoZGV2LCBuc291cmNlIHwKKwkJCQkJICBOVjAzX1BHUkFQSF9OU09VUkNFX1BST1RFQ1RJT05fRVJST1IpOworCisJCU5WX0VSUk9SKGRldiwgIm1hZ2ljIHNldCAxOlxuIik7CisJCWZvciAociA9IDB4NDA4OTAwOyByIDw9IDB4NDA4OTEwOyByICs9IDQpCisJCQlOVl9FUlJPUihkZXYsICJcdDB4JTA4eDogMHglMDh4XG4iLCByLCBudl9yZDMyKGRldiwgcikpOworCQludl93cjMyKGRldiwgMHg0MDg5MDAsIG52X3JkMzIoZGV2LCAweDQwODkwNCkgfCAweGMwMDAwMDAwKTsKKwkJZm9yIChyID0gMHg0MDhlMDg7IHIgPD0gMHg0MDhlMjQ7IHIgKz0gNCkKKwkJCU5WX0VSUk9SKGRldiwgIlx0MHglMDh4OiAweCUwOHhcbiIsIHIsIG52X3JkMzIoZGV2LCByKSk7CisJCW52X3dyMzIoZGV2LCAweDQwOGUwOCwgbnZfcmQzMihkZXYsIDB4NDA4ZTA4KSB8IDB4YzAwMDAwMDApOworCisJCU5WX0VSUk9SKGRldiwgIm1hZ2ljIHNldCAyOlxuIik7CisJCWZvciAociA9IDB4NDA5OTAwOyByIDw9IDB4NDA5OTEwOyByICs9IDQpCisJCQlOVl9FUlJPUihkZXYsICJcdDB4JTA4eDogMHglMDh4XG4iLCByLCBudl9yZDMyKGRldiwgcikpOworCQludl93cjMyKGRldiwgMHg0MDk5MDAsIG52X3JkMzIoZGV2LCAweDQwOTkwNCkgfCAweGMwMDAwMDAwKTsKKwkJZm9yIChyID0gMHg0MDllMDg7IHIgPD0gMHg0MDllMjQ7IHIgKz0gNCkKKwkJCU5WX0VSUk9SKGRldiwgIlx0MHglMDh4OiAweCUwOHhcbiIsIHIsIG52X3JkMzIoZGV2LCByKSk7CisJCW52X3dyMzIoZGV2LCAweDQwOWUwOCwgbnZfcmQzMihkZXYsIDB4NDA5ZTA4KSB8IDB4YzAwMDAwMDApOworCisJCXN0YXR1cyAmPSB+MHgwMDIwMDAwMDsKKwkJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX05TT1VSQ0UsIG5zb3VyY2UpOworCQludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUiwgMHgwMDIwMDAwMCk7CisJfQorCisJaWYgKHN0YXR1cykgeworCQlOVl9JTkZPKGRldiwgIlVuaGFuZGxlZCBQR1JBUEhfSU5UUiAtIDB4JTA4eFxuIiwgc3RhdHVzKTsKKwkJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIsIHN0YXR1cyk7CisJfQorCisJeworCQljb25zdCBpbnQgaXNiID0gKDEgPDwgMTYpIHwgKDEgPDwgMCk7CisKKwkJaWYgKChudl9yZDMyKGRldiwgMHg0MDA1MDApICYgaXNiKSAhPSBpc2IpCisJCQludl93cjMyKGRldiwgMHg0MDA1MDAsIG52X3JkMzIoZGV2LCAweDQwMDUwMCkgfCBpc2IpOworCX0KKworCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19JTlRSXzAsIE5WX1BNQ19JTlRSXzBfUEdSQVBIX1BFTkRJTkcpOworfQorCitzdGF0aWMgdm9pZAorbm91dmVhdV9jcnRjX2lycV9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKQoreworCWlmIChjcnRjICYgMSkKKwkJbnZfd3IzMihkZXYsIE5WX0NSVEMwX0lOVFNUQVQsIE5WX0NSVENfSU5UUl9WQkxBTkspOworCisJaWYgKGNydGMgJiAyKQorCQludl93cjMyKGRldiwgTlZfQ1JUQzFfSU5UU1RBVCwgTlZfQ1JUQ19JTlRSX1ZCTEFOSyk7Cit9CisKK2lycXJldHVybl90Citub3V2ZWF1X2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopYXJnOworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdWludDMyX3Qgc3RhdHVzLCBmYmRldl9mbGFncyA9IDA7CisKKwlzdGF0dXMgPSBudl9yZDMyKGRldiwgTlYwM19QTUNfSU5UUl8wKTsKKwlpZiAoIXN0YXR1cykKKwkJcmV0dXJuIElSUV9OT05FOworCisJaWYgKGRldl9wcml2LT5mYmRldl9pbmZvKSB7CisJCWZiZGV2X2ZsYWdzID0gZGV2X3ByaXYtPmZiZGV2X2luZm8tPmZsYWdzOworCQlkZXZfcHJpdi0+ZmJkZXZfaW5mby0+ZmxhZ3MgfD0gRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQ7CisJfQorCisJaWYgKHN0YXR1cyAmIE5WX1BNQ19JTlRSXzBfUEZJRk9fUEVORElORykgeworCQlub3V2ZWF1X2ZpZm9faXJxX2hhbmRsZXIoZGV2KTsKKwkJc3RhdHVzICY9IH5OVl9QTUNfSU5UUl8wX1BGSUZPX1BFTkRJTkc7CisJfQorCisJaWYgKHN0YXR1cyAmIE5WX1BNQ19JTlRSXzBfUEdSQVBIX1BFTkRJTkcpIHsKKwkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApCisJCQludjUwX3BncmFwaF9pcnFfaGFuZGxlcihkZXYpOworCQllbHNlCisJCQlub3V2ZWF1X3BncmFwaF9pcnFfaGFuZGxlcihkZXYpOworCisJCXN0YXR1cyAmPSB+TlZfUE1DX0lOVFJfMF9QR1JBUEhfUEVORElORzsKKwl9CisKKwlpZiAoc3RhdHVzICYgTlZfUE1DX0lOVFJfMF9DUlRDbl9QRU5ESU5HKSB7CisJCW5vdXZlYXVfY3J0Y19pcnFfaGFuZGxlcihkZXYsIChzdGF0dXM+PjI0KSYzKTsKKwkJc3RhdHVzICY9IH5OVl9QTUNfSU5UUl8wX0NSVENuX1BFTkRJTkc7CisJfQorCisJaWYgKHN0YXR1cyAmIChOVl9QTUNfSU5UUl8wX05WNTBfRElTUExBWV9QRU5ESU5HIHwKKwkJICAgICAgTlZfUE1DX0lOVFJfMF9OVjUwX0kyQ19QRU5ESU5HKSkgeworCQludjUwX2Rpc3BsYXlfaXJxX2hhbmRsZXIoZGV2KTsKKwkJc3RhdHVzICY9IH4oTlZfUE1DX0lOVFJfMF9OVjUwX0RJU1BMQVlfUEVORElORyB8CisJCQkgICAgTlZfUE1DX0lOVFJfMF9OVjUwX0kyQ19QRU5ESU5HKTsKKwl9CisKKwlpZiAoc3RhdHVzKQorCQlOVl9FUlJPUihkZXYsICJVbmhhbmRsZWQgUE1DIElOVFIgc3RhdHVzIGJpdHMgMHglMDh4XG4iLCBzdGF0dXMpOworCisJaWYgKGRldl9wcml2LT5mYmRldl9pbmZvKQorCQlkZXZfcHJpdi0+ZmJkZXZfaW5mby0+ZmxhZ3MgPSBmYmRldl9mbGFnczsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbWVtLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X21lbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNzU1NzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X21lbS5jCkBAIC0wLDAgKzEsNTY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSBUaGUgV2VhdGhlciBDaGFubmVsLCBJbmMuICAyMDAyLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA1IFN0ZXBoYW5lIE1hcmNoZXNpbgorICoKKyAqIFRoZSBXZWF0aGVyIENoYW5uZWwgKFRNKSBmdW5kZWQgVHVuZ3N0ZW4gR3JhcGhpY3MgdG8gZGV2ZWxvcCB0aGUKKyAqIGluaXRpYWwgcmVsZWFzZSBvZiB0aGUgUmFkZW9uIDg1MDAgZHJpdmVyIHVuZGVyIHRoZSBYRnJlZTg2IGxpY2Vuc2UuCisgKiBUaGlzIG5vdGljZSBtdXN0IGJlIHByZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgQU5EL09SIFRIRUlSIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgS2VpdGggV2hpdHdlbGwgPGtlaXRoQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgorICovCisKKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJkcm1fc2FyZWEuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorCitzdGF0aWMgc3RydWN0IG1lbV9ibG9jayAqCitzcGxpdF9ibG9jayhzdHJ1Y3QgbWVtX2Jsb2NrICpwLCB1aW50NjRfdCBzdGFydCwgdWludDY0X3Qgc2l6ZSwKKwkgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJLyogTWF5YmUgY3V0IG9mZiB0aGUgc3RhcnQgb2YgYW4gZXhpc3RpbmcgYmxvY2sgKi8KKwlpZiAoc3RhcnQgPiBwLT5zdGFydCkgeworCQlzdHJ1Y3QgbWVtX2Jsb2NrICpuZXdibG9jayA9CisJCQlrbWFsbG9jKHNpemVvZigqbmV3YmxvY2spLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFuZXdibG9jaykKKwkJCWdvdG8gb3V0OworCQluZXdibG9jay0+c3RhcnQgPSBzdGFydDsKKwkJbmV3YmxvY2stPnNpemUgPSBwLT5zaXplIC0gKHN0YXJ0IC0gcC0+c3RhcnQpOworCQluZXdibG9jay0+ZmlsZV9wcml2ID0gTlVMTDsKKwkJbmV3YmxvY2stPm5leHQgPSBwLT5uZXh0OworCQluZXdibG9jay0+cHJldiA9IHA7CisJCXAtPm5leHQtPnByZXYgPSBuZXdibG9jazsKKwkJcC0+bmV4dCA9IG5ld2Jsb2NrOworCQlwLT5zaXplIC09IG5ld2Jsb2NrLT5zaXplOworCQlwID0gbmV3YmxvY2s7CisJfQorCisJLyogTWF5YmUgY3V0IG9mZiB0aGUgZW5kIG9mIGFuIGV4aXN0aW5nIGJsb2NrICovCisJaWYgKHNpemUgPCBwLT5zaXplKSB7CisJCXN0cnVjdCBtZW1fYmxvY2sgKm5ld2Jsb2NrID0KKwkJCWttYWxsb2Moc2l6ZW9mKCpuZXdibG9jayksIEdGUF9LRVJORUwpOworCQlpZiAoIW5ld2Jsb2NrKQorCQkJZ290byBvdXQ7CisJCW5ld2Jsb2NrLT5zdGFydCA9IHN0YXJ0ICsgc2l6ZTsKKwkJbmV3YmxvY2stPnNpemUgPSBwLT5zaXplIC0gc2l6ZTsKKwkJbmV3YmxvY2stPmZpbGVfcHJpdiA9IE5VTEw7CisJCW5ld2Jsb2NrLT5uZXh0ID0gcC0+bmV4dDsKKwkJbmV3YmxvY2stPnByZXYgPSBwOworCQlwLT5uZXh0LT5wcmV2ID0gbmV3YmxvY2s7CisJCXAtPm5leHQgPSBuZXdibG9jazsKKwkJcC0+c2l6ZSA9IHNpemU7CisJfQorCitvdXQ6CisJLyogT3VyIGJsb2NrIGlzIGluIHRoZSBtaWRkbGUgKi8KKwlwLT5maWxlX3ByaXYgPSBmaWxlX3ByaXY7CisJcmV0dXJuIHA7Cit9CisKK3N0cnVjdCBtZW1fYmxvY2sgKgorbm91dmVhdV9tZW1fYWxsb2NfYmxvY2soc3RydWN0IG1lbV9ibG9jayAqaGVhcCwgdWludDY0X3Qgc2l6ZSwKKwkJCWludCBhbGlnbjIsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LCBpbnQgdGFpbCkKK3sKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpwOworCXVpbnQ2NF90IG1hc2sgPSAoMSA8PCBhbGlnbjIpIC0gMTsKKworCWlmICghaGVhcCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAodGFpbCkgeworCQlsaXN0X2Zvcl9lYWNoX3ByZXYocCwgaGVhcCkgeworCQkJdWludDY0X3Qgc3RhcnQgPSAoKHAtPnN0YXJ0ICsgcC0+c2l6ZSkgLSBzaXplKSAmIH5tYXNrOworCisJCQlpZiAocC0+ZmlsZV9wcml2ID09IE5VTEwgJiYgc3RhcnQgPj0gcC0+c3RhcnQgJiYKKwkJCSAgICBzdGFydCArIHNpemUgPD0gcC0+c3RhcnQgKyBwLT5zaXplKQorCQkJCXJldHVybiBzcGxpdF9ibG9jayhwLCBzdGFydCwgc2l6ZSwgZmlsZV9wcml2KTsKKwkJfQorCX0gZWxzZSB7CisJCWxpc3RfZm9yX2VhY2gocCwgaGVhcCkgeworCQkJdWludDY0X3Qgc3RhcnQgPSAocC0+c3RhcnQgKyBtYXNrKSAmIH5tYXNrOworCisJCQlpZiAocC0+ZmlsZV9wcml2ID09IE5VTEwgJiYKKwkJCSAgICBzdGFydCArIHNpemUgPD0gcC0+c3RhcnQgKyBwLT5zaXplKQorCQkJCXJldHVybiBzcGxpdF9ibG9jayhwLCBzdGFydCwgc2l6ZSwgZmlsZV9wcml2KTsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCit2b2lkIG5vdXZlYXVfbWVtX2ZyZWVfYmxvY2soc3RydWN0IG1lbV9ibG9jayAqcCkKK3sKKwlwLT5maWxlX3ByaXYgPSBOVUxMOworCisJLyogQXNzdW1lcyBhIHNpbmdsZSBjb250aWd1b3VzIHJhbmdlLiAgTmVlZHMgYSBzcGVjaWFsIGZpbGVfcHJpdiBpbgorCSAqICdoZWFwJyB0byBzdG9wIGl0IGJlaW5nIHN1YnN1bWVkLgorCSAqLworCWlmIChwLT5uZXh0LT5maWxlX3ByaXYgPT0gTlVMTCkgeworCQlzdHJ1Y3QgbWVtX2Jsb2NrICpxID0gcC0+bmV4dDsKKwkJcC0+c2l6ZSArPSBxLT5zaXplOworCQlwLT5uZXh0ID0gcS0+bmV4dDsKKwkJcC0+bmV4dC0+cHJldiA9IHA7CisJCWtmcmVlKHEpOworCX0KKworCWlmIChwLT5wcmV2LT5maWxlX3ByaXYgPT0gTlVMTCkgeworCQlzdHJ1Y3QgbWVtX2Jsb2NrICpxID0gcC0+cHJldjsKKwkJcS0+c2l6ZSArPSBwLT5zaXplOworCQlxLT5uZXh0ID0gcC0+bmV4dDsKKwkJcS0+bmV4dC0+cHJldiA9IHE7CisJCWtmcmVlKHApOworCX0KK30KKworLyogSW5pdGlhbGl6ZS4gIEhvdyB0byBjaGVjayBmb3IgYW4gdW5pbml0aWFsaXplZCBoZWFwPworICovCitpbnQgbm91dmVhdV9tZW1faW5pdF9oZWFwKHN0cnVjdCBtZW1fYmxvY2sgKipoZWFwLCB1aW50NjRfdCBzdGFydCwKKwkJCSAgdWludDY0X3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpibG9ja3MgPSBrbWFsbG9jKHNpemVvZigqYmxvY2tzKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWJsb2NrcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkqaGVhcCA9IGttYWxsb2Moc2l6ZW9mKCoqaGVhcCksIEdGUF9LRVJORUwpOworCWlmICghKmhlYXApIHsKKwkJa2ZyZWUoYmxvY2tzKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYmxvY2tzLT5zdGFydCA9IHN0YXJ0OworCWJsb2Nrcy0+c2l6ZSA9IHNpemU7CisJYmxvY2tzLT5maWxlX3ByaXYgPSBOVUxMOworCWJsb2Nrcy0+bmV4dCA9IGJsb2Nrcy0+cHJldiA9ICpoZWFwOworCisJbWVtc2V0KCpoZWFwLCAwLCBzaXplb2YoKipoZWFwKSk7CisJKCpoZWFwKS0+ZmlsZV9wcml2ID0gKHN0cnVjdCBkcm1fZmlsZSAqKSAtMTsKKwkoKmhlYXApLT5uZXh0ID0gKCpoZWFwKS0+cHJldiA9IGJsb2NrczsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZyZWUgYWxsIGJsb2NrcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlbGVhc2luZyBmaWxlX3ByaXYKKyAqLwordm9pZCBub3V2ZWF1X21lbV9yZWxlYXNlKHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LCBzdHJ1Y3QgbWVtX2Jsb2NrICpoZWFwKQoreworCXN0cnVjdCBtZW1fYmxvY2sgKnA7CisKKwlpZiAoIWhlYXAgfHwgIWhlYXAtPm5leHQpCisJCXJldHVybjsKKworCWxpc3RfZm9yX2VhY2gocCwgaGVhcCkgeworCQlpZiAocC0+ZmlsZV9wcml2ID09IGZpbGVfcHJpdikKKwkJCXAtPmZpbGVfcHJpdiA9IE5VTEw7CisJfQorCisJLyogQXNzdW1lcyBhIHNpbmdsZSBjb250aWd1b3VzIHJhbmdlLiAgTmVlZHMgYSBzcGVjaWFsIGZpbGVfcHJpdiBpbgorCSAqICdoZWFwJyB0byBzdG9wIGl0IGJlaW5nIHN1YnN1bWVkLgorCSAqLworCWxpc3RfZm9yX2VhY2gocCwgaGVhcCkgeworCQl3aGlsZSAoKHAtPmZpbGVfcHJpdiA9PSBOVUxMKSAmJgorCQkJCQkocC0+bmV4dC0+ZmlsZV9wcml2ID09IE5VTEwpICYmCisJCQkJCShwLT5uZXh0ICE9IGhlYXApKSB7CisJCQlzdHJ1Y3QgbWVtX2Jsb2NrICpxID0gcC0+bmV4dDsKKwkJCXAtPnNpemUgKz0gcS0+c2l6ZTsKKwkJCXAtPm5leHQgPSBxLT5uZXh0OworCQkJcC0+bmV4dC0+cHJldiA9IHA7CisJCQlrZnJlZShxKTsKKwkJfQorCX0KK30KKworLyoKKyAqIE5WNTAgVk0gaGVscGVycworICovCitpbnQKK252NTBfbWVtX3ZtX2JpbmRfbGluZWFyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQ2NF90IHZpcnQsIHVpbnQzMl90IHNpemUsCisJCQl1aW50MzJfdCBmbGFncywgdWludDY0X3QgcGh5cykKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKnBndDsKKwl1bnNpZ25lZCBwc3osIHBmbCwgcGFnZXM7CisKKwlpZiAodmlydCA+PSBkZXZfcHJpdi0+dm1fZ2FydF9iYXNlICYmCisJICAgICh2aXJ0ICsgc2l6ZSkgPCAoZGV2X3ByaXYtPnZtX2dhcnRfYmFzZSArIGRldl9wcml2LT52bV9nYXJ0X3NpemUpKSB7CisJCXBzeiA9IDEyOworCQlwZ3QgPSAmZGV2X3ByaXYtPmdhcnRfaW5mby5zZ19jdHhkbWE7CisJCXBmbCA9IDB4MjE7CisJCXZpcnQgLT0gZGV2X3ByaXYtPnZtX2dhcnRfYmFzZTsKKwl9IGVsc2UKKwlpZiAodmlydCA+PSBkZXZfcHJpdi0+dm1fdnJhbV9iYXNlICYmCisJICAgICh2aXJ0ICsgc2l6ZSkgPCAoZGV2X3ByaXYtPnZtX3ZyYW1fYmFzZSArIGRldl9wcml2LT52bV92cmFtX3NpemUpKSB7CisJCXBzeiA9IDE2OworCQlwZ3QgPSBkZXZfcHJpdi0+dm1fdnJhbV9wdDsKKwkJcGZsID0gMHgwMTsKKwkJdmlydCAtPSBkZXZfcHJpdi0+dm1fdnJhbV9iYXNlOworCX0gZWxzZSB7CisJCU5WX0VSUk9SKGRldiwgIkludmFsaWQgYWRkcmVzczogMHglMTZsbHgtMHglMTZsbHhcbiIsCisJCQkgdmlydCwgdmlydCArIHNpemUgLSAxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGFnZXMgPSBzaXplID4+IHBzejsKKworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOworCWlmIChmbGFncyAmIDB4ODAwMDAwMDApIHsKKwkJd2hpbGUgKHBhZ2VzLS0pIHsKKwkJCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcHQgPSBwZ3RbdmlydCA+PiAyOV07CisJCQl1bnNpZ25lZCBwdGUgPSAoKHZpcnQgJiAweDFmZmZmZmZmVUxMKSA+PiBwc3opIDw8IDE7CisKKwkJCW52X3dvMzIoZGV2LCBwdCwgcHRlKyssIDB4MDAwMDAwMDApOworCQkJbnZfd28zMihkZXYsIHB0LCBwdGUrKywgMHgwMDAwMDAwMCk7CisKKwkJCXZpcnQgKz0gKDEgPDwgcHN6KTsKKwkJfQorCX0gZWxzZSB7CisJCXdoaWxlIChwYWdlcy0tKSB7CisJCQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnB0ID0gcGd0W3ZpcnQgPj4gMjldOworCQkJdW5zaWduZWQgcHRlID0gKCh2aXJ0ICYgMHgxZmZmZmZmZlVMTCkgPj4gcHN6KSA8PCAxOworCQkJdW5zaWduZWQgb2Zmc2V0X2ggPSB1cHBlcl8zMl9iaXRzKHBoeXMpICYgMHhmZjsKKwkJCXVuc2lnbmVkIG9mZnNldF9sID0gbG93ZXJfMzJfYml0cyhwaHlzKTsKKworCQkJbnZfd28zMihkZXYsIHB0LCBwdGUrKywgb2Zmc2V0X2wgfCBwZmwpOworCQkJbnZfd28zMihkZXYsIHB0LCBwdGUrKywgb2Zmc2V0X2ggfCBmbGFncyk7CisKKwkJCXBoeXMgKz0gKDEgPDwgcHN6KTsKKwkJCXZpcnQgKz0gKDEgPDwgcHN6KTsKKwkJfQorCX0KKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCisJbnZfd3IzMihkZXYsIDB4MTAwYzgwLCAweDAwMDUwMDAxKTsKKwlpZiAoIW52X3dhaXQoMHgxMDBjODAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApKSB7CisJCU5WX0VSUk9SKGRldiwgInRpbWVvdXQ6ICgweDEwMGM4MCAmIDEpID09IDAgKDIpXG4iKTsKKwkJTlZfRVJST1IoZGV2LCAiMHgxMDBjODAgPSAweCUwOHhcbiIsIG52X3JkMzIoZGV2LCAweDEwMGM4MCkpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCW52X3dyMzIoZGV2LCAweDEwMGM4MCwgMHgwMDAwMDAwMSk7CisJaWYgKCFudl93YWl0KDB4MTAwYzgwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKSkgeworCQlOVl9FUlJPUihkZXYsICJ0aW1lb3V0OiAoMHgxMDBjODAgJiAxKSA9PSAwICgyKVxuIik7CisJCU5WX0VSUk9SKGRldiwgIjB4MTAwYzgwID0gMHglMDh4XG4iLCBudl9yZDMyKGRldiwgMHgxMDBjODApKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbnY1MF9tZW1fdm1fdW5iaW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQ2NF90IHZpcnQsIHVpbnQzMl90IHNpemUpCit7CisJbnY1MF9tZW1fdm1fYmluZF9saW5lYXIoZGV2LCB2aXJ0LCBzaXplLCAweDgwMDAwMDAwLCAwKTsKK30KKworLyoKKyAqIENsZWFudXAgZXZlcnl0aGluZworICovCit2b2lkIG5vdXZlYXVfbWVtX3Rha2Vkb3duKHN0cnVjdCBtZW1fYmxvY2sgKipoZWFwKQoreworCXN0cnVjdCBtZW1fYmxvY2sgKnA7CisKKwlpZiAoISpoZWFwKQorCQlyZXR1cm47CisKKwlmb3IgKHAgPSAoKmhlYXApLT5uZXh0OyBwICE9ICpoZWFwOykgeworCQlzdHJ1Y3QgbWVtX2Jsb2NrICpxID0gcDsKKwkJcCA9IHAtPm5leHQ7CisJCWtmcmVlKHEpOworCX0KKworCWtmcmVlKCpoZWFwKTsKKwkqaGVhcCA9IE5VTEw7Cit9CisKK3ZvaWQgbm91dmVhdV9tZW1fY2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKGRldl9wcml2LT50dG0uYmRldi5tYW5bVFRNX1BMX1BSSVYwXS5oYXNfdHlwZSkKKwkJdHRtX2JvX2NsZWFuX21tKCZkZXZfcHJpdi0+dHRtLmJkZXYsIFRUTV9QTF9QUklWMCk7CisJdHRtX2JvX2NsZWFuX21tKCZkZXZfcHJpdi0+dHRtLmJkZXYsIFRUTV9QTF9WUkFNKTsKKworCXR0bV9ib19kZXZpY2VfcmVsZWFzZSgmZGV2X3ByaXYtPnR0bS5iZGV2KTsKKworCW5vdXZlYXVfdHRtX2dsb2JhbF9yZWxlYXNlKGRldl9wcml2KTsKKworCWlmIChkcm1fY29yZV9oYXNfQUdQKGRldikgJiYgZGV2LT5hZ3AgJiYKKwkgICAgZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkgeworCQlzdHJ1Y3QgZHJtX2FncF9tZW0gKmVudHJ5LCAqdGVtcGU7CisKKwkJLyogUmVtb3ZlIEFHUCByZXNvdXJjZXMsIGJ1dCBsZWF2ZSBkZXYtPmFncAorCQkgICBpbnRhY3QgdW50aWwgZHJ2X2NsZWFudXAgaXMgY2FsbGVkLiAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIHRlbXBlLCAmZGV2LT5hZ3AtPm1lbW9yeSwgaGVhZCkgeworCQkJaWYgKGVudHJ5LT5ib3VuZCkKKwkJCQlkcm1fdW5iaW5kX2FncChlbnRyeS0+bWVtb3J5KTsKKwkJCWRybV9mcmVlX2FncChlbnRyeS0+bWVtb3J5LCBlbnRyeS0+cGFnZXMpOworCQkJa2ZyZWUoZW50cnkpOworCQl9CisJCUlOSVRfTElTVF9IRUFEKCZkZXYtPmFncC0+bWVtb3J5KTsKKworCQlpZiAoZGV2LT5hZ3AtPmFjcXVpcmVkKQorCQkJZHJtX2FncF9yZWxlYXNlKGRldik7CisKKwkJZGV2LT5hZ3AtPmFjcXVpcmVkID0gMDsKKwkJZGV2LT5hZ3AtPmVuYWJsZWQgPSAwOworCX0KKworCWlmIChkZXZfcHJpdi0+ZmJfbXRycikgeworCQlkcm1fbXRycl9kZWwoZGV2X3ByaXYtPmZiX210cnIsIGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQoZGV2LCAxKSwKKwkJCSAgICAgZHJtX2dldF9yZXNvdXJjZV9sZW4oZGV2LCAxKSwgRFJNX01UUlJfV0MpOworCQlkZXZfcHJpdi0+ZmJfbXRyciA9IDA7CisJfQorfQorCisvKlhYWCB3b24ndCB3b3JrIG9uIEJTRCBiZWNhdXNlIG9mIHBjaV9yZWFkX2NvbmZpZ19kd29yZCAqLworc3RhdGljIHVpbnQzMl90Citub3V2ZWF1X21lbV9mYl9hbW91bnRfaWdwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgcGNpX2RldiAqYnJpZGdlOworCXVpbnQzMl90IG1lbTsKKworCWJyaWRnZSA9IHBjaV9nZXRfYnVzX2FuZF9zbG90KDAsIFBDSV9ERVZGTigwLCAxKSk7CisJaWYgKCFicmlkZ2UpIHsKKwkJTlZfRVJST1IoZGV2LCAibm8gYnJpZGdlIGRldmljZVxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChkZXZfcHJpdi0+ZmxhZ3MmTlZfTkZPUkNFKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChicmlkZ2UsIDB4N0MsICZtZW0pOworCQlyZXR1cm4gKHVpbnQ2NF90KSgoKG1lbSA+PiA2KSAmIDMxKSArIDEpKjEwMjQqMTAyNDsKKwl9IGVsc2UKKwlpZiAoZGV2X3ByaXYtPmZsYWdzJk5WX05GT1JDRTIpIHsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGJyaWRnZSwgMHg4NCwgJm1lbSk7CisJCXJldHVybiAodWludDY0X3QpKCgobWVtID4+IDQpICYgMTI3KSArIDEpKjEwMjQqMTAyNDsKKwl9CisKKwlOVl9FUlJPUihkZXYsICJpbXBvc3NpYmxlIVxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qIHJldHVybnMgdGhlIGFtb3VudCBvZiBGQiByYW0gaW4gYnl0ZXMgKi8KK3VpbnQ2NF90IG5vdXZlYXVfbWVtX2ZiX2Ftb3VudChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdWludDMyX3QgYm9vdDA7CisKKwlzd2l0Y2ggKGRldl9wcml2LT5jYXJkX3R5cGUpIHsKKwljYXNlIE5WXzA0OgorCQlib290MCA9IG52X3JkMzIoZGV2LCBOVjAzX0JPT1RfMCk7CisJCWlmIChib290MCAmIDB4MDAwMDAxMDApCisJCQlyZXR1cm4gKCgoYm9vdDAgPj4gMTIpICYgMHhmKSAqIDIgKyAyKSAqIDEwMjQgKiAxMDI0OworCisJCXN3aXRjaCAoYm9vdDAgJiBOVjAzX0JPT1RfMF9SQU1fQU1PVU5UKSB7CisJCWNhc2UgTlYwNF9CT09UXzBfUkFNX0FNT1VOVF8zMk1COgorCQkJcmV0dXJuIDMyICogMTAyNCAqIDEwMjQ7CisJCWNhc2UgTlYwNF9CT09UXzBfUkFNX0FNT1VOVF8xNk1COgorCQkJcmV0dXJuIDE2ICogMTAyNCAqIDEwMjQ7CisJCWNhc2UgTlYwNF9CT09UXzBfUkFNX0FNT1VOVF84TUI6CisJCQlyZXR1cm4gOCAqIDEwMjQgKiAxMDI0OworCQljYXNlIE5WMDRfQk9PVF8wX1JBTV9BTU9VTlRfNE1COgorCQkJcmV0dXJuIDQgKiAxMDI0ICogMTAyNDsKKwkJfQorCQlicmVhazsKKwljYXNlIE5WXzEwOgorCWNhc2UgTlZfMjA6CisJY2FzZSBOVl8zMDoKKwljYXNlIE5WXzQwOgorCWNhc2UgTlZfNTA6CisJZGVmYXVsdDoKKwkJaWYgKGRldl9wcml2LT5mbGFncyAmIChOVl9ORk9SQ0UgfCBOVl9ORk9SQ0UyKSkgeworCQkJcmV0dXJuIG5vdXZlYXVfbWVtX2ZiX2Ftb3VudF9pZ3AoZGV2KTsKKwkJfSBlbHNlIHsKKwkJCXVpbnQ2NF90IG1lbTsKKwkJCW1lbSA9IChudl9yZDMyKGRldiwgTlYwNF9GSUZPX0RBVEEpICYKKwkJCQkJTlYxMF9GSUZPX0RBVEFfUkFNX0FNT1VOVF9NQl9NQVNLKSA+PgorCQkJCQlOVjEwX0ZJRk9fREFUQV9SQU1fQU1PVU5UX01CX1NISUZUOworCQkJcmV0dXJuIG1lbSAqIDEwMjQgKiAxMDI0OworCQl9CisJCWJyZWFrOworCX0KKworCU5WX0VSUk9SKGRldiwKKwkJIlVuYWJsZSB0byBkZXRlY3QgdmlkZW8gcmFtIHNpemUuIFBsZWFzZSByZXBvcnQgeW91ciBzZXR1cCB0byAiCisJCQkJCQkJRFJJVkVSX0VNQUlMICJcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBub3V2ZWF1X21lbV9yZXNldF9hZ3Aoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwl1aW50MzJfdCBzYXZlZF9wY2lfbnZfMSwgc2F2ZWRfcGNpX252XzE5LCBwbWNfZW5hYmxlOworCisJc2F2ZWRfcGNpX252XzEgPSBudl9yZDMyKGRldiwgTlYwNF9QQlVTX1BDSV9OVl8xKTsKKwlzYXZlZF9wY2lfbnZfMTkgPSBudl9yZDMyKGRldiwgTlYwNF9QQlVTX1BDSV9OVl8xOSk7CisKKwkvKiBjbGVhciBidXNtYXN0ZXIgYml0ICovCisJbnZfd3IzMihkZXYsIE5WMDRfUEJVU19QQ0lfTlZfMSwgc2F2ZWRfcGNpX252XzEgJiB+MHg0KTsKKwkvKiBjbGVhciBTQkEgYW5kIEFHUCBiaXRzICovCisJbnZfd3IzMihkZXYsIE5WMDRfUEJVU19QQ0lfTlZfMTksIHNhdmVkX3BjaV9udl8xOSAmIDB4ZmZmZmYwZmYpOworCisJLyogcG93ZXIgY3ljbGUgcGdyYXBoLCBpZiBlbmFibGVkICovCisJcG1jX2VuYWJsZSA9IG52X3JkMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUpOworCWlmIChwbWNfZW5hYmxlICYgTlZfUE1DX0VOQUJMRV9QR1JBUEgpIHsKKwkJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSwKKwkJCQlwbWNfZW5hYmxlICYgfk5WX1BNQ19FTkFCTEVfUEdSQVBIKTsKKwkJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSwgbnZfcmQzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSkgfAorCQkJCU5WX1BNQ19FTkFCTEVfUEdSQVBIKTsKKwl9CisKKwkvKiBhbmQgcmVzdG9yZSAoZ2l2ZXMgZWZmZWN0IG9mIHJlc2V0dGluZyBBR1ApICovCisJbnZfd3IzMihkZXYsIE5WMDRfUEJVU19QQ0lfTlZfMTksIHNhdmVkX3BjaV9udl8xOSk7CisJbnZfd3IzMihkZXYsIE5WMDRfUEJVU19QQ0lfTlZfMSwgc2F2ZWRfcGNpX252XzEpOworfQorCitpbnQKK25vdXZlYXVfbWVtX2luaXRfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2FncF9pbmZvIGluZm87CisJc3RydWN0IGRybV9hZ3BfbW9kZSBtb2RlOworCWludCByZXQ7CisKKwlpZiAobm91dmVhdV9ub2FncCkKKwkJcmV0dXJuIDA7CisKKwlub3V2ZWF1X21lbV9yZXNldF9hZ3AoZGV2KTsKKworCWlmICghZGV2LT5hZ3AtPmFjcXVpcmVkKSB7CisJCXJldCA9IGRybV9hZ3BfYWNxdWlyZShkZXYpOworCQlpZiAocmV0KSB7CisJCQlOVl9FUlJPUihkZXYsICJVbmFibGUgdG8gYWNxdWlyZSBBR1A6ICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldCA9IGRybV9hZ3BfaW5mbyhkZXYsICZpbmZvKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIlVuYWJsZSB0byBnZXQgQUdQIGluZm86ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIHNlZSBhZ3AuaCBmb3IgdGhlIEFHUFNUQVRfKiBtb2RlcyBhdmFpbGFibGUgKi8KKwltb2RlLm1vZGUgPSBpbmZvLm1vZGU7CisJcmV0ID0gZHJtX2FncF9lbmFibGUoZGV2LCBtb2RlKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIlVuYWJsZSB0byBlbmFibGUgQUdQOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkZXZfcHJpdi0+Z2FydF9pbmZvLnR5cGUJPSBOT1VWRUFVX0dBUlRfQUdQOworCWRldl9wcml2LT5nYXJ0X2luZm8uYXBlcl9iYXNlCT0gaW5mby5hcGVydHVyZV9iYXNlOworCWRldl9wcml2LT5nYXJ0X2luZm8uYXBlcl9zaXplCT0gaW5mby5hcGVydHVyZV9zaXplOworCXJldHVybiAwOworfQorCitpbnQKK25vdXZlYXVfbWVtX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2ID0gJmRldl9wcml2LT50dG0uYmRldjsKKwlpbnQgcmV0LCBkbWFfYml0cyA9IDMyOworCisJZGV2X3ByaXYtPmZiX3BoeXMgPSBkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KGRldiwgMSk7CisJZGV2X3ByaXYtPmdhcnRfaW5mby50eXBlID0gTk9VVkVBVV9HQVJUX05PTkU7CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCAmJgorCSAgICBwY2lfZG1hX3N1cHBvcnRlZChkZXYtPnBkZXYsIERNQV9CSVRfTUFTSyg0MCkpKQorCQlkbWFfYml0cyA9IDQwOworCisJcmV0ID0gcGNpX3NldF9kbWFfbWFzayhkZXYtPnBkZXYsIERNQV9CSVRfTUFTSyhkbWFfYml0cykpOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiRXJyb3Igc2V0dGluZyBETUEgbWFzazogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gbm91dmVhdV90dG1fZ2xvYmFsX2luaXQoZGV2X3ByaXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB0dG1fYm9fZGV2aWNlX2luaXQoJmRldl9wcml2LT50dG0uYmRldiwKKwkJCQkgZGV2X3ByaXYtPnR0bS5ib19nbG9iYWxfcmVmLnJlZi5vYmplY3QsCisJCQkJICZub3V2ZWF1X2JvX2RyaXZlciwgRFJNX0ZJTEVfUEFHRV9PRkZTRVQsCisJCQkJIGRtYV9iaXRzIDw9IDMyID8gdHJ1ZSA6IGZhbHNlKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIkVycm9yIGluaXRpYWxpc2luZyBibyBkcml2ZXI6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCUlOSVRfTElTVF9IRUFEKCZkZXZfcHJpdi0+dHRtLmJvX2xpc3QpOworCXNwaW5fbG9ja19pbml0KCZkZXZfcHJpdi0+dHRtLmJvX2xpc3RfbG9jayk7CisKKwlkZXZfcHJpdi0+ZmJfYXZhaWxhYmxlX3NpemUgPSBub3V2ZWF1X21lbV9mYl9hbW91bnQoZGV2KTsKKworCWRldl9wcml2LT5mYl9tYXBwYWJsZV9wYWdlcyA9IGRldl9wcml2LT5mYl9hdmFpbGFibGVfc2l6ZTsKKwlpZiAoZGV2X3ByaXYtPmZiX21hcHBhYmxlX3BhZ2VzID4gZHJtX2dldF9yZXNvdXJjZV9sZW4oZGV2LCAxKSkKKwkJZGV2X3ByaXYtPmZiX21hcHBhYmxlX3BhZ2VzID0gZHJtX2dldF9yZXNvdXJjZV9sZW4oZGV2LCAxKTsKKwlkZXZfcHJpdi0+ZmJfbWFwcGFibGVfcGFnZXMgPj49IFBBR0VfU0hJRlQ7CisKKwlOVl9JTkZPKGRldiwgIiVkIE1pQiBWUkFNXG4iLCAoaW50KShkZXZfcHJpdi0+ZmJfYXZhaWxhYmxlX3NpemUgPj4gMjApKTsKKworCS8qIHJlbW92ZSByZXNlcnZlZCBzcGFjZSBhdCBlbmQgb2YgdnJhbSBmcm9tIGF2YWlsYWJsZSBhbW91bnQgKi8KKwlkZXZfcHJpdi0+ZmJfYXZhaWxhYmxlX3NpemUgLT0gZGV2X3ByaXYtPnJhbWluX3JzdmRfdnJhbTsKKwlkZXZfcHJpdi0+ZmJfYXBlcl9mcmVlID0gZGV2X3ByaXYtPmZiX2F2YWlsYWJsZV9zaXplOworCisJLyogbWFwcGFibGUgdnJhbSAqLworCXJldCA9IHR0bV9ib19pbml0X21tKGJkZXYsIFRUTV9QTF9WUkFNLAorCQkJICAgICBkZXZfcHJpdi0+ZmJfYXZhaWxhYmxlX3NpemUgPj4gUEFHRV9TSElGVCk7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJGYWlsZWQgVlJBTSBtbSBpbml0OiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBHQVJUICovCisjaWYgIWRlZmluZWQoX19wb3dlcnBjX18pICYmICFkZWZpbmVkKF9faWE2NF9fKQorCWlmIChkcm1fZGV2aWNlX2lzX2FncChkZXYpICYmIGRldi0+YWdwKSB7CisJCXJldCA9IG5vdXZlYXVfbWVtX2luaXRfYWdwKGRldik7CisJCWlmIChyZXQpCisJCQlOVl9FUlJPUihkZXYsICJFcnJvciBpbml0aWFsaXNpbmcgQUdQOiAlZFxuIiwgcmV0KTsKKwl9CisjZW5kaWYKKworCWlmIChkZXZfcHJpdi0+Z2FydF9pbmZvLnR5cGUgPT0gTk9VVkVBVV9HQVJUX05PTkUpIHsKKwkJcmV0ID0gbm91dmVhdV9zZ2RtYV9pbml0KGRldik7CisJCWlmIChyZXQpIHsKKwkJCU5WX0VSUk9SKGRldiwgIkVycm9yIGluaXRpYWxpc2luZyBQQ0koRSk6ICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCU5WX0lORk8oZGV2LCAiJWQgTWlCIEdBUlQgKGFwZXJ0dXJlKVxuIiwKKwkJKGludCkoZGV2X3ByaXYtPmdhcnRfaW5mby5hcGVyX3NpemUgPj4gMjApKTsKKwlkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfZnJlZSA9IGRldl9wcml2LT5nYXJ0X2luZm8uYXBlcl9zaXplOworCisJcmV0ID0gdHRtX2JvX2luaXRfbW0oYmRldiwgVFRNX1BMX1RULAorCQkJICAgICBkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfc2l6ZSA+PiBQQUdFX1NISUZUKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIkZhaWxlZCBUVCBtbSBpbml0OiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkZXZfcHJpdi0+ZmJfbXRyciA9IGRybV9tdHJyX2FkZChkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KGRldiwgMSksCisJCQkJCSBkcm1fZ2V0X3Jlc291cmNlX2xlbihkZXYsIDEpLAorCQkJCQkgRFJNX01UUlJfV0MpOworCXJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbm90aWZpZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbm90aWZpZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzY2YTM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9ub3RpZmllci5jCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEJlbiBTa2VnZ3MuCisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorCitpbnQKK25vdXZlYXVfbm90aWZpZXJfaW5pdF9jaGFubmVsKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9ibyAqbnRmeSA9IE5VTEw7CisJaW50IHJldDsKKworCXJldCA9IG5vdXZlYXVfZ2VtX25ldyhkZXYsIE5VTEwsIFBBR0VfU0laRSwgMCwgbm91dmVhdV92cmFtX25vdGlmeSA/CisJCQkgICAgICBUVE1fUExfRkxBR19WUkFNIDogVFRNX1BMX0ZMQUdfVFQsCisJCQkgICAgICAwLCAweDAwMDAsIGZhbHNlLCB0cnVlLCAmbnRmeSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG5vdXZlYXVfYm9fcGluKG50ZnksIFRUTV9QTF9GTEFHX1ZSQU0pOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2VycjsKKworCXJldCA9IG5vdXZlYXVfYm9fbWFwKG50ZnkpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2VycjsKKworCXJldCA9IG5vdXZlYXVfbWVtX2luaXRfaGVhcCgmY2hhbi0+bm90aWZpZXJfaGVhcCwgMCwgbnRmeS0+Ym8ubWVtLnNpemUpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2VycjsKKworCWNoYW4tPm5vdGlmaWVyX2JvID0gbnRmeTsKK291dF9lcnI6CisJaWYgKHJldCkgeworCQltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKG50ZnktPmdlbSk7CisJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQKK25vdXZlYXVfbm90aWZpZXJfdGFrZWRvd25fY2hhbm5lbChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisKKwlpZiAoIWNoYW4tPm5vdGlmaWVyX2JvKQorCQlyZXR1cm47CisKKwlub3V2ZWF1X2JvX3VubWFwKGNoYW4tPm5vdGlmaWVyX2JvKTsKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJbm91dmVhdV9ib191bnBpbihjaGFuLT5ub3RpZmllcl9ibyk7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoY2hhbi0+bm90aWZpZXJfYm8tPmdlbSk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJbm91dmVhdV9tZW1fdGFrZWRvd24oJmNoYW4tPm5vdGlmaWVyX2hlYXApOworfQorCitzdGF0aWMgdm9pZAorbm91dmVhdV9ub3RpZmllcl9ncHVvYmpfZHRvcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaikKK3sKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCisJaWYgKGdwdW9iai0+cHJpdikKKwkJbm91dmVhdV9tZW1fZnJlZV9ibG9jayhncHVvYmotPnByaXYpOworfQorCitpbnQKK25vdXZlYXVfbm90aWZpZXJfYWxsb2Moc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgdWludDMyX3QgaGFuZGxlLAorCQkgICAgICAgaW50IHNpemUsIHVpbnQzMl90ICpiX29mZnNldCkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpub2JqID0gTlVMTDsKKwlzdHJ1Y3QgbWVtX2Jsb2NrICptZW07CisJdWludDMyX3Qgb2Zmc2V0OworCWludCB0YXJnZXQsIHJldDsKKworCWlmICghY2hhbi0+bm90aWZpZXJfaGVhcCkgeworCQlOVl9FUlJPUihkZXYsICJDaGFubmVsICVkIGRvZXNuJ3QgaGF2ZSBhIG5vdGlmaWVyIGhlYXAhXG4iLAorCQkJIGNoYW4tPmlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWVtID0gbm91dmVhdV9tZW1fYWxsb2NfYmxvY2soY2hhbi0+bm90aWZpZXJfaGVhcCwgc2l6ZSwgMCwKKwkJCQkgICAgICAoc3RydWN0IGRybV9maWxlICopLTIsIDApOworCWlmICghbWVtKSB7CisJCU5WX0VSUk9SKGRldiwgIkNoYW5uZWwgJWQgbm90aWZpZXIgYmxvY2sgZnVsbFxuIiwgY2hhbi0+aWQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlvZmZzZXQgPSBjaGFuLT5ub3RpZmllcl9iby0+Ym8ubWVtLm1tX25vZGUtPnN0YXJ0IDw8IFBBR0VfU0hJRlQ7CisJaWYgKGNoYW4tPm5vdGlmaWVyX2JvLT5iby5tZW0ubWVtX3R5cGUgPT0gVFRNX1BMX1ZSQU0pIHsKKwkJdGFyZ2V0ID0gTlZfRE1BX1RBUkdFVF9WSURNRU07CisJfSBlbHNlCisJaWYgKGNoYW4tPm5vdGlmaWVyX2JvLT5iby5tZW0ubWVtX3R5cGUgPT0gVFRNX1BMX1RUKSB7CisJCWlmIChkZXZfcHJpdi0+Z2FydF9pbmZvLnR5cGUgPT0gTk9VVkVBVV9HQVJUX1NHRE1BICYmCisJCSAgICBkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApIHsKKwkJCXJldCA9IG5vdXZlYXVfc2dkbWFfZ2V0X3BhZ2UoZGV2LCBvZmZzZXQsICZvZmZzZXQpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQkJdGFyZ2V0ID0gTlZfRE1BX1RBUkdFVF9QQ0k7CisJCX0gZWxzZSB7CisJCQl0YXJnZXQgPSBOVl9ETUFfVEFSR0VUX0FHUDsKKwkJfQorCX0gZWxzZSB7CisJCU5WX0VSUk9SKGRldiwgIkJhZCBETUEgdGFyZ2V0LCBtZW1fdHlwZSAlZCFcbiIsCisJCQkgY2hhbi0+bm90aWZpZXJfYm8tPmJvLm1lbS5tZW1fdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlvZmZzZXQgKz0gbWVtLT5zdGFydDsKKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2RtYV9uZXcoY2hhbiwgTlZfQ0xBU1NfRE1BX0lOX01FTU9SWSwgb2Zmc2V0LAorCQkJCSAgICAgbWVtLT5zaXplLCBOVl9ETUFfQUNDRVNTX1JXLCB0YXJnZXQsCisJCQkJICAgICAmbm9iaik7CisJaWYgKHJldCkgeworCQlub3V2ZWF1X21lbV9mcmVlX2Jsb2NrKG1lbSk7CisJCU5WX0VSUk9SKGRldiwgIkVycm9yIGNyZWF0aW5nIG5vdGlmaWVyIGN0eGRtYTogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCW5vYmotPmR0b3IgICA9IG5vdXZlYXVfbm90aWZpZXJfZ3B1b2JqX2R0b3I7CisJbm9iai0+cHJpdiAgID0gbWVtOworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfcmVmX2FkZChkZXYsIGNoYW4sIGhhbmRsZSwgbm9iaiwgTlVMTCk7CisJaWYgKHJldCkgeworCQlub3V2ZWF1X2dwdW9ial9kZWwoZGV2LCAmbm9iaik7CisJCW5vdXZlYXVfbWVtX2ZyZWVfYmxvY2sobWVtKTsKKwkJTlZfRVJST1IoZGV2LCAiRXJyb3IgcmVmZXJlbmNpbmcgbm90aWZpZXIgY3R4ZG1hOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkqYl9vZmZzZXQgPSBtZW0tPnN0YXJ0OworCXJldHVybiAwOworfQorCitpbnQKK25vdXZlYXVfbm90aWZpZXJfb2Zmc2V0KHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqbm9iaiwgdWludDMyX3QgKnBvZmZzZXQpCit7CisJaWYgKCFub2JqIHx8IG5vYmotPmR0b3IgIT0gbm91dmVhdV9ub3RpZmllcl9ncHVvYmpfZHRvcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocG9mZnNldCkgeworCQlzdHJ1Y3QgbWVtX2Jsb2NrICptZW0gPSBub2JqLT5wcml2OworCisJCWlmICgqcG9mZnNldCA+PSBtZW0tPnNpemUpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJKnBvZmZzZXQgKz0gbWVtLT5zdGFydDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50Citub3V2ZWF1X2lvY3RsX25vdGlmaWVyX2FsbG9jKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCQkgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9ub3RpZmllcm9ial9hbGxvYyAqbmEgPSBkYXRhOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47CisJaW50IHJldDsKKworCU5PVVZFQVVfQ0hFQ0tfSU5JVElBTElTRURfV0lUSF9SRVRVUk47CisJTk9VVkVBVV9HRVRfVVNFUl9DSEFOTkVMX1dJVEhfUkVUVVJOKG5hLT5jaGFubmVsLCBmaWxlX3ByaXYsIGNoYW4pOworCisJcmV0ID0gbm91dmVhdV9ub3RpZmllcl9hbGxvYyhjaGFuLCBuYS0+aGFuZGxlLCBuYS0+c2l6ZSwgJm5hLT5vZmZzZXQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfb2JqZWN0LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X29iamVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMzc5YmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X29iamVjdC5jCkBAIC0wLDAgKzEsMTI5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBCZW4gU2tlZ2dzLgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKy8qCisgKiBBdXRob3JzOgorICogICBCZW4gU2tlZ2dzIDxkYXJrdGFtYUBpaW5ldC5uZXQuYXU+CisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCisKKy8qIE5WaWRpYSB1c2VzIGNvbnRleHQgb2JqZWN0cyB0byBkcml2ZSBkcmF3aW5nIG9wZXJhdGlvbnMuCisKKyAgIENvbnRleHQgb2JqZWN0cyBjYW4gYmUgc2VsZWN0ZWQgaW50byA4IHN1YmNoYW5uZWxzIGluIHRoZSBGSUZPLAorICAgYW5kIHRoZW4gdXNlZCB2aWEgRE1BIGNvbW1hbmQgYnVmZmVycy4KKworICAgQSBjb250ZXh0IG9iamVjdCBpcyByZWZlcmVuY2VkIGJ5IGEgdXNlciBkZWZpbmVkIGhhbmRsZSAoQ0FSRDMyKS4gVGhlIEhXCisgICBsb29rcyB1cCBncmFwaGljcyBvYmplY3RzIGluIGEgaGFzaCB0YWJsZSBpbiB0aGUgaW5zdGFuY2UgUkFNLgorCisgICBBbiBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZSBjb25zaXN0cyBvZiAyIENBUkQzMi4gVGhlIGZpcnN0IENBUkQzMiBjb250YWlucworICAgdGhlIGhhbmRsZSwgdGhlIHNlY29uZCBvbmUgYSBiaXRmaWVsZCwgdGhhdCBjb250YWlucyB0aGUgYWRkcmVzcyBvZiB0aGUKKyAgIG9iamVjdCBpbiBpbnN0YW5jZSBSQU0uCisKKyAgIFRoZSBmb3JtYXQgb2YgdGhlIHNlY29uZCBDQVJEMzIgc2VlbXMgdG8gYmU6CisKKyAgIE5WNCB0byBOVjMwOgorCisgICAxNTogMCAgaW5zdGFuY2VfYWRkciA+PiA0CisgICAxNzoxNiAgZW5naW5lIChoZXJlIHVzZXMgMSA9IGdyYXBoaWNzKQorICAgMjg6MjQgIGNoYW5uZWwgaWQgKGhlcmUgdXNlcyAwKQorICAgMzEJICB2YWxpZCAodXNlIDEpCisKKyAgIE5WNDA6CisKKyAgIDE1OiAwICBpbnN0YW5jZV9hZGRyID4+IDQgICAobWF5YmUgMTktMCkKKyAgIDIxOjIwICBlbmdpbmUgKGhlcmUgdXNlcyAxID0gZ3JhcGhpY3MpCisgICBJJ20gdW5zdXJlIGFib3V0IHRoZSBvdGhlciBiaXRzLCBidXQgdXNpbmcgMCBzZWVtcyB0byB3b3JrLgorCisgICBUaGUga2V5IGludG8gdGhlIGhhc2ggdGFibGUgZGVwZW5kcyBvbiB0aGUgb2JqZWN0IGhhbmRsZSBhbmQgY2hhbm5lbCBpZCBhbmQKKyAgIGlzIGdpdmVuIGFzOgorKi8KK3N0YXRpYyB1aW50MzJfdAorbm91dmVhdV9yYW1odF9oYXNoX2hhbmRsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY2hhbm5lbCwgdWludDMyX3QgaGFuZGxlKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdWludDMyX3QgaGFzaCA9IDA7CisJaW50IGk7CisKKwlOVl9ERUJVRyhkZXYsICJjaCVkIGhhbmRsZT0weCUwOHhcbiIsIGNoYW5uZWwsIGhhbmRsZSk7CisKKwlmb3IgKGkgPSAzMjsgaSA+IDA7IGkgLT0gZGV2X3ByaXYtPnJhbWh0X2JpdHMpIHsKKwkJaGFzaCBePSAoaGFuZGxlICYgKCgxIDw8IGRldl9wcml2LT5yYW1odF9iaXRzKSAtIDEpKTsKKwkJaGFuZGxlID4+PSBkZXZfcHJpdi0+cmFtaHRfYml0czsKKwl9CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKQorCQloYXNoIF49IGNoYW5uZWwgPDwgKGRldl9wcml2LT5yYW1odF9iaXRzIC0gNCk7CisJaGFzaCA8PD0gMzsKKworCU5WX0RFQlVHKGRldiwgImhhc2g9MHglMDh4XG4iLCBoYXNoKTsKKwlyZXR1cm4gaGFzaDsKK30KKworc3RhdGljIGludAorbm91dmVhdV9yYW1odF9lbnRyeV92YWxpZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnJhbWh0LAorCQkJICB1aW50MzJfdCBvZmZzZXQpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1aW50MzJfdCBjdHggPSBudl9ybzMyKGRldiwgcmFtaHQsIChvZmZzZXQgKyA0KS80KTsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNDApCisJCXJldHVybiAoKGN0eCAmIE5WX1JBTUhUX0NPTlRFWFRfVkFMSUQpICE9IDApOworCXJldHVybiAoY3R4ICE9IDApOworfQorCitzdGF0aWMgaW50Citub3V2ZWF1X3JhbWh0X2luc2VydChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfcmVmICpyZWYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9pbnN0bWVtX2VuZ2luZSAqaW5zdG1lbSA9ICZkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW07CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IHJlZi0+Y2hhbm5lbDsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnJhbWh0ID0gY2hhbi0+cmFtaHQgPyBjaGFuLT5yYW1odC0+Z3B1b2JqIDogTlVMTDsKKwl1aW50MzJfdCBjdHgsIGNvLCBobzsKKworCWlmICghcmFtaHQpIHsKKwkJTlZfRVJST1IoZGV2LCAiTm8gaGFzaCB0YWJsZSFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzQwKSB7CisJCWN0eCA9IE5WX1JBTUhUX0NPTlRFWFRfVkFMSUQgfCAocmVmLT5pbnN0YW5jZSA+PiA0KSB8CisJCSAgICAgIChjaGFuLT5pZCA8PCBOVl9SQU1IVF9DT05URVhUX0NIQU5ORUxfU0hJRlQpIHwKKwkJICAgICAgKHJlZi0+Z3B1b2JqLT5lbmdpbmUgPDwgTlZfUkFNSFRfQ09OVEVYVF9FTkdJTkVfU0hJRlQpOworCX0gZWxzZQorCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApIHsKKwkJY3R4ID0gKHJlZi0+aW5zdGFuY2UgPj4gNCkgfAorCQkgICAgICAoY2hhbi0+aWQgPDwgTlY0MF9SQU1IVF9DT05URVhUX0NIQU5ORUxfU0hJRlQpIHwKKwkJICAgICAgKHJlZi0+Z3B1b2JqLT5lbmdpbmUgPDwgTlY0MF9SQU1IVF9DT05URVhUX0VOR0lORV9TSElGVCk7CisJfSBlbHNlIHsKKwkJaWYgKHJlZi0+Z3B1b2JqLT5lbmdpbmUgPT0gTlZPQkpfRU5HSU5FX0RJU1BMQVkpIHsKKwkJCWN0eCA9IChyZWYtPmluc3RhbmNlIDw8IDEwKSB8IDI7CisJCX0gZWxzZSB7CisJCQljdHggPSAocmVmLT5pbnN0YW5jZSA+PiA0KSB8CisJCQkgICAgICAoKHJlZi0+Z3B1b2JqLT5lbmdpbmUgPDwKKwkJCQlOVjQwX1JBTUhUX0NPTlRFWFRfRU5HSU5FX1NISUZUKSk7CisJCX0KKwl9CisKKwlpbnN0bWVtLT5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOworCWNvID0gaG8gPSBub3V2ZWF1X3JhbWh0X2hhc2hfaGFuZGxlKGRldiwgY2hhbi0+aWQsIHJlZi0+aGFuZGxlKTsKKwlkbyB7CisJCWlmICghbm91dmVhdV9yYW1odF9lbnRyeV92YWxpZChkZXYsIHJhbWh0LCBjbykpIHsKKwkJCU5WX0RFQlVHKGRldiwKKwkJCQkgImluc2VydCBjaCVkIDB4JTA4eDogaD0weCUwOHgsIGM9MHglMDh4XG4iLAorCQkJCSBjaGFuLT5pZCwgY28sIHJlZi0+aGFuZGxlLCBjdHgpOworCQkJbnZfd28zMihkZXYsIHJhbWh0LCAoY28gKyAwKS80LCByZWYtPmhhbmRsZSk7CisJCQludl93bzMyKGRldiwgcmFtaHQsIChjbyArIDQpLzQsIGN0eCk7CisKKwkJCWxpc3RfYWRkX3RhaWwoJnJlZi0+bGlzdCwgJmNoYW4tPnJhbWh0X3JlZnMpOworCQkJaW5zdG1lbS0+ZmluaXNoX2FjY2VzcyhkZXYpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJTlZfREVCVUcoZGV2LCAiY29sbGlzaW9uIGNoJWQgMHglMDh4OiBoPTB4JTA4eFxuIiwKKwkJCSBjaGFuLT5pZCwgY28sIG52X3JvMzIoZGV2LCByYW1odCwgY28vNCkpOworCisJCWNvICs9IDg7CisJCWlmIChjbyA+PSBkZXZfcHJpdi0+cmFtaHRfc2l6ZSkKKwkJCWNvID0gMDsKKwl9IHdoaWxlIChjbyAhPSBobyk7CisJaW5zdG1lbS0+ZmluaXNoX2FjY2VzcyhkZXYpOworCisJTlZfRVJST1IoZGV2LCAiUkFNSFQgc3BhY2UgZXhoYXVzdGVkLiBjaD0lZFxuIiwgY2hhbi0+aWQpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZAorbm91dmVhdV9yYW1odF9yZW1vdmUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiAqcmVmKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfaW5zdG1lbV9lbmdpbmUgKmluc3RtZW0gPSAmZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSByZWYtPmNoYW5uZWw7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpyYW1odCA9IGNoYW4tPnJhbWh0ID8gY2hhbi0+cmFtaHQtPmdwdW9iaiA6IE5VTEw7CisJdWludDMyX3QgY28sIGhvOworCisJaWYgKCFyYW1odCkgeworCQlOVl9FUlJPUihkZXYsICJObyBoYXNoIHRhYmxlIVxuIik7CisJCXJldHVybjsKKwl9CisKKwlpbnN0bWVtLT5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOworCWNvID0gaG8gPSBub3V2ZWF1X3JhbWh0X2hhc2hfaGFuZGxlKGRldiwgY2hhbi0+aWQsIHJlZi0+aGFuZGxlKTsKKwlkbyB7CisJCWlmIChub3V2ZWF1X3JhbWh0X2VudHJ5X3ZhbGlkKGRldiwgcmFtaHQsIGNvKSAmJgorCQkgICAgKHJlZi0+aGFuZGxlID09IG52X3JvMzIoZGV2LCByYW1odCwgKGNvLzQpKSkpIHsKKwkJCU5WX0RFQlVHKGRldiwKKwkJCQkgInJlbW92ZSBjaCVkIDB4JTA4eDogaD0weCUwOHgsIGM9MHglMDh4XG4iLAorCQkJCSBjaGFuLT5pZCwgY28sIHJlZi0+aGFuZGxlLAorCQkJCSBudl9ybzMyKGRldiwgcmFtaHQsIChjbyArIDQpKSk7CisJCQludl93bzMyKGRldiwgcmFtaHQsIChjbyArIDApLzQsIDB4MDAwMDAwMDApOworCQkJbnZfd28zMihkZXYsIHJhbWh0LCAoY28gKyA0KS80LCAweDAwMDAwMDAwKTsKKworCQkJbGlzdF9kZWwoJnJlZi0+bGlzdCk7CisJCQlpbnN0bWVtLT5maW5pc2hfYWNjZXNzKGRldik7CisJCQlyZXR1cm47CisJCX0KKworCQljbyArPSA4OworCQlpZiAoY28gPj0gZGV2X3ByaXYtPnJhbWh0X3NpemUpCisJCQljbyA9IDA7CisJfSB3aGlsZSAoY28gIT0gaG8pOworCWxpc3RfZGVsKCZyZWYtPmxpc3QpOworCWluc3RtZW0tPmZpbmlzaF9hY2Nlc3MoZGV2KTsKKworCU5WX0VSUk9SKGRldiwgIlJBTUhUIGVudHJ5IG5vdCBmb3VuZC4gY2g9JWQsIGhhbmRsZT0weCUwOHhcbiIsCisJCSBjaGFuLT5pZCwgcmVmLT5oYW5kbGUpOworfQorCitpbnQKK25vdXZlYXVfZ3B1b2JqX25ldyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLAorCQkgICB1aW50MzJfdCBzaXplLCBpbnQgYWxpZ24sIHVpbnQzMl90IGZsYWdzLAorCQkgICBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKipncHVvYmpfcmV0KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZW5naW5lICplbmdpbmUgPSAmZGV2X3ByaXYtPmVuZ2luZTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iajsKKwlzdHJ1Y3QgbWVtX2Jsb2NrICpwcmFtaW4gPSBOVUxMOworCWludCByZXQ7CisKKwlOVl9ERUJVRyhkZXYsICJjaCVkIHNpemU9JXUgYWxpZ249JWQgZmxhZ3M9MHglMDh4XG4iLAorCQkgY2hhbiA/IGNoYW4tPmlkIDogLTEsIHNpemUsIGFsaWduLCBmbGFncyk7CisKKwlpZiAoIWRldl9wcml2IHx8ICFncHVvYmpfcmV0IHx8ICpncHVvYmpfcmV0ICE9IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJZ3B1b2JqID0ga3phbGxvYyhzaXplb2YoKmdwdW9iaiksIEdGUF9LRVJORUwpOworCWlmICghZ3B1b2JqKQorCQlyZXR1cm4gLUVOT01FTTsKKwlOVl9ERUJVRyhkZXYsICJncHVvYmogJXBcbiIsIGdwdW9iaik7CisJZ3B1b2JqLT5mbGFncyA9IGZsYWdzOworCWdwdW9iai0+aW1fY2hhbm5lbCA9IGNoYW47CisKKwlsaXN0X2FkZF90YWlsKCZncHVvYmotPmxpc3QsICZkZXZfcHJpdi0+Z3B1b2JqX2xpc3QpOworCisJLyogQ2hvb3NlIGJldHdlZW4gZ2xvYmFsIGluc3RtZW0gaGVhcCwgYW5kIHBlci1jaGFubmVsIHByaXZhdGUKKwkgKiBpbnN0bWVtIGhlYXAuICBPbiA8TlY1MCBhbGxvdyByZXF1ZXN0cyBmb3IgcHJpdmF0ZSBpbnN0bWVtCisJICogdG8gYmUgc2F0aXNmaWVkIGZyb20gZ2xvYmFsIGhlYXAgaWYgbm8gcGVyLWNoYW5uZWwgYXJlYQorCSAqIGF2YWlsYWJsZS4KKwkgKi8KKwlpZiAoY2hhbikgeworCQlpZiAoY2hhbi0+cmFtaW5faGVhcCkgeworCQkJTlZfREVCVUcoZGV2LCAicHJpdmF0ZSBoZWFwXG4iKTsKKwkJCXByYW1pbiA9IGNoYW4tPnJhbWluX2hlYXA7CisJCX0gZWxzZQorCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7CisJCQlOVl9ERUJVRyhkZXYsICJnbG9iYWwgaGVhcCBmYWxsYmFja1xuIik7CisJCQlwcmFtaW4gPSBkZXZfcHJpdi0+cmFtaW5faGVhcDsKKwkJfQorCX0gZWxzZSB7CisJCU5WX0RFQlVHKGRldiwgImdsb2JhbCBoZWFwXG4iKTsKKwkJcHJhbWluID0gZGV2X3ByaXYtPnJhbWluX2hlYXA7CisJfQorCisJaWYgKCFwcmFtaW4pIHsKKwkJTlZfRVJST1IoZGV2LCAiTm8gUFJBTUlOIGhlYXAhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFjaGFuKSB7CisJCXJldCA9IGVuZ2luZS0+aW5zdG1lbS5wb3B1bGF0ZShkZXYsIGdwdW9iaiwgJnNpemUpOworCQlpZiAocmV0KSB7CisJCQlub3V2ZWF1X2dwdW9ial9kZWwoZGV2LCAmZ3B1b2JqKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwkvKiBBbGxvY2F0ZSBhIGNodW5rIG9mIHRoZSBQUkFNSU4gYXBlcnR1cmUgKi8KKwlncHVvYmotPmltX3ByYW1pbiA9IG5vdXZlYXVfbWVtX2FsbG9jX2Jsb2NrKHByYW1pbiwgc2l6ZSwKKwkJCQkJCSAgICBkcm1fb3JkZXIoYWxpZ24pLAorCQkJCQkJICAgIChzdHJ1Y3QgZHJtX2ZpbGUgKiktMiwgMCk7CisJaWYgKCFncHVvYmotPmltX3ByYW1pbikgeworCQlub3V2ZWF1X2dwdW9ial9kZWwoZGV2LCAmZ3B1b2JqKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKCFjaGFuKSB7CisJCXJldCA9IGVuZ2luZS0+aW5zdG1lbS5iaW5kKGRldiwgZ3B1b2JqKTsKKwkJaWYgKHJldCkgeworCQkJbm91dmVhdV9ncHVvYmpfZGVsKGRldiwgJmdwdW9iaik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJaWYgKGdwdW9iai0+ZmxhZ3MgJiBOVk9CSl9GTEFHX1pFUk9fQUxMT0MpIHsKKwkJaW50IGk7CisKKwkJZW5naW5lLT5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgdHJ1ZSk7CisJCWZvciAoaSA9IDA7IGkgPCBncHVvYmotPmltX3ByYW1pbi0+c2l6ZTsgaSArPSA0KQorCQkJbnZfd28zMihkZXYsIGdwdW9iaiwgaS80LCAwKTsKKwkJZW5naW5lLT5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKKwl9CisKKwkqZ3B1b2JqX3JldCA9IGdwdW9iajsKKwlyZXR1cm4gMDsKK30KKworaW50Citub3V2ZWF1X2dwdW9ial9lYXJseV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCU5WX0RFQlVHKGRldiwgIlxuIik7CisKKwlJTklUX0xJU1RfSEVBRCgmZGV2X3ByaXYtPmdwdW9ial9saXN0KTsKKworCXJldHVybiAwOworfQorCitpbnQKK25vdXZlYXVfZ3B1b2JqX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCByZXQ7CisKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgeworCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXdfZmFrZShkZXYsCisJCQlkZXZfcHJpdi0+cmFtaHRfb2Zmc2V0LCB+MCwgZGV2X3ByaXYtPnJhbWh0X3NpemUsCisJCQlOVk9CSl9GTEFHX1pFUk9fQUxMT0MgfCBOVk9CSl9GTEFHX0FMTE9XX05PX1JFRlMsCisJCQkJCQkmZGV2X3ByaXYtPnJhbWh0LCBOVUxMKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK25vdXZlYXVfZ3B1b2JqX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCU5WX0RFQlVHKGRldiwgIlxuIik7CisKKwlub3V2ZWF1X2dwdW9ial9kZWwoZGV2LCAmZGV2X3ByaXYtPnJhbWh0KTsKK30KKwordm9pZAorbm91dmVhdV9ncHVvYmpfbGF0ZV90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmogPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5LCAqdG1wOworCisJTlZfREVCVUcoZGV2LCAiXG4iKTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgdG1wLCAmZGV2X3ByaXYtPmdwdW9ial9saXN0KSB7CisJCWdwdW9iaiA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiwgbGlzdCk7CisKKwkJTlZfRVJST1IoZGV2LCAiZ3B1b2JqICVwIHN0aWxsIGV4aXN0cyBhdCB0YWtlZG93biwgcmVmcz0lZFxuIiwKKwkJCSBncHVvYmosIGdwdW9iai0+cmVmY291bnQpOworCQlncHVvYmotPnJlZmNvdW50ID0gMDsKKwkJbm91dmVhdV9ncHVvYmpfZGVsKGRldiwgJmdwdW9iaik7CisJfQorfQorCitpbnQKK25vdXZlYXVfZ3B1b2JqX2RlbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKipwZ3B1b2JqKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZW5naW5lICplbmdpbmUgPSAmZGV2X3ByaXYtPmVuZ2luZTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iajsKKwlpbnQgaTsKKworCU5WX0RFQlVHKGRldiwgImdwdW9iaiAlcFxuIiwgcGdwdW9iaiA/ICpwZ3B1b2JqIDogTlVMTCk7CisKKwlpZiAoIWRldl9wcml2IHx8ICFwZ3B1b2JqIHx8ICEoKnBncHVvYmopKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlncHVvYmogPSAqcGdwdW9iajsKKworCWlmIChncHVvYmotPnJlZmNvdW50ICE9IDApIHsKKwkJTlZfRVJST1IoZGV2LCAiZ3B1b2JqIHJlZmNvdW50IGlzICVkXG4iLCBncHVvYmotPnJlZmNvdW50KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGdwdW9iai0+aW1fcHJhbWluICYmIChncHVvYmotPmZsYWdzICYgTlZPQkpfRkxBR19aRVJPX0ZSRUUpKSB7CisJCWVuZ2luZS0+aW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOworCQlmb3IgKGkgPSAwOyBpIDwgZ3B1b2JqLT5pbV9wcmFtaW4tPnNpemU7IGkgKz0gNCkKKwkJCW52X3dvMzIoZGV2LCBncHVvYmosIGkvNCwgMCk7CisJCWVuZ2luZS0+aW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisJfQorCisJaWYgKGdwdW9iai0+ZHRvcikKKwkJZ3B1b2JqLT5kdG9yKGRldiwgZ3B1b2JqKTsKKworCWlmIChncHVvYmotPmltX2JhY2tpbmcgJiYgIShncHVvYmotPmZsYWdzICYgTlZPQkpfRkxBR19GQUtFKSkKKwkJZW5naW5lLT5pbnN0bWVtLmNsZWFyKGRldiwgZ3B1b2JqKTsKKworCWlmIChncHVvYmotPmltX3ByYW1pbikgeworCQlpZiAoZ3B1b2JqLT5mbGFncyAmIE5WT0JKX0ZMQUdfRkFLRSkKKwkJCWtmcmVlKGdwdW9iai0+aW1fcHJhbWluKTsKKwkJZWxzZQorCQkJbm91dmVhdV9tZW1fZnJlZV9ibG9jayhncHVvYmotPmltX3ByYW1pbik7CisJfQorCisJbGlzdF9kZWwoJmdwdW9iai0+bGlzdCk7CisKKwkqcGdwdW9iaiA9IE5VTEw7CisJa2ZyZWUoZ3B1b2JqKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbm91dmVhdV9ncHVvYmpfaW5zdGFuY2VfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJCSAgICBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaiwgdWludDMyX3QgKmluc3QpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmNwcmFtaW47CisKKwkvKiA8TlY1MCB1c2UgUFJBTUlOIGFkZHJlc3MgZXZlcnl3aGVyZSAqLworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApIHsKKwkJKmluc3QgPSBncHVvYmotPmltX3ByYW1pbi0+c3RhcnQ7CisJCXJldHVybiAwOworCX0KKworCWlmIChjaGFuICYmIGdwdW9iai0+aW1fY2hhbm5lbCAhPSBjaGFuKSB7CisJCU5WX0VSUk9SKGRldiwgIkNoYW5uZWwgbWlzbWF0Y2g6IG9iaiAlZCwgcmVmICVkXG4iLAorCQkJIGdwdW9iai0+aW1fY2hhbm5lbC0+aWQsIGNoYW4tPmlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogTlY1MCBjaGFubmVsLWxvY2FsIGluc3RhbmNlICovCisJaWYgKGNoYW4pIHsKKwkJY3ByYW1pbiA9IGNoYW4tPnJhbWluLT5ncHVvYmo7CisJCSppbnN0ID0gZ3B1b2JqLT5pbV9wcmFtaW4tPnN0YXJ0IC0gY3ByYW1pbi0+aW1fcHJhbWluLT5zdGFydDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogTlY1MCBnbG9iYWwgKFZSQU0pIGluc3RhbmNlICovCisJaWYgKCFncHVvYmotPmltX2NoYW5uZWwpIHsKKwkJLyogLi4uZnJvbSBnbG9iYWwgaGVhcCAqLworCQlpZiAoIWdwdW9iai0+aW1fYmFja2luZykgeworCQkJTlZfRVJST1IoZGV2LCAiQUlJLCBubyBWUkFNIGJhY2tpbmcgZ3B1b2JqXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCSppbnN0ID0gZ3B1b2JqLT5pbV9iYWNraW5nX3N0YXJ0OworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKiAuLi5mcm9tIGxvY2FsIGhlYXAgKi8KKwkJY3ByYW1pbiA9IGdwdW9iai0+aW1fY2hhbm5lbC0+cmFtaW4tPmdwdW9iajsKKwkJKmluc3QgPSBjcHJhbWluLT5pbV9iYWNraW5nX3N0YXJ0ICsKKwkJCShncHVvYmotPmltX3ByYW1pbi0+c3RhcnQgLSBjcHJhbWluLT5pbV9wcmFtaW4tPnN0YXJ0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK2ludAorbm91dmVhdV9ncHVvYmpfcmVmX2FkZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLAorCQkgICAgICAgdWludDMyX3QgaGFuZGxlLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaiwKKwkJICAgICAgIHN0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYgKipyZWZfcmV0KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiAqcmVmOworCXVpbnQzMl90IGluc3RhbmNlOworCWludCByZXQ7CisKKwlOVl9ERUJVRyhkZXYsICJjaCVkIGg9MHglMDh4IGdwdW9iaj0lcFxuIiwKKwkJIGNoYW4gPyBjaGFuLT5pZCA6IC0xLCBoYW5kbGUsIGdwdW9iaik7CisKKwlpZiAoIWRldl9wcml2IHx8ICFncHVvYmogfHwgKHJlZl9yZXQgJiYgKnJlZl9yZXQgIT0gTlVMTCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFjaGFuICYmICFyZWZfcmV0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChncHVvYmotPmVuZ2luZSA9PSBOVk9CSl9FTkdJTkVfU1cgJiYgIWdwdW9iai0+aW1fcHJhbWluKSB7CisJCS8qIHN3IG9iamVjdCAqLworCQlpbnN0YW5jZSA9IDB4NDA7CisJfSBlbHNlIHsKKwkJcmV0ID0gbm91dmVhdV9ncHVvYmpfaW5zdGFuY2VfZ2V0KGRldiwgY2hhbiwgZ3B1b2JqLCAmaW5zdGFuY2UpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZWYgPSBremFsbG9jKHNpemVvZigqcmVmKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZWYpCisJCXJldHVybiAtRU5PTUVNOworCUlOSVRfTElTVF9IRUFEKCZyZWYtPmxpc3QpOworCXJlZi0+Z3B1b2JqICAgPSBncHVvYmo7CisJcmVmLT5jaGFubmVsICA9IGNoYW47CisJcmVmLT5pbnN0YW5jZSA9IGluc3RhbmNlOworCisJaWYgKCFyZWZfcmV0KSB7CisJCXJlZi0+aGFuZGxlID0gaGFuZGxlOworCisJCXJldCA9IG5vdXZlYXVfcmFtaHRfaW5zZXJ0KGRldiwgcmVmKTsKKwkJaWYgKHJldCkgeworCQkJa2ZyZWUocmVmKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9IGVsc2UgeworCQlyZWYtPmhhbmRsZSA9IH4wOworCQkqcmVmX3JldCA9IHJlZjsKKwl9CisKKwlyZWYtPmdwdW9iai0+cmVmY291bnQrKzsKKwlyZXR1cm4gMDsKK30KKworaW50IG5vdXZlYXVfZ3B1b2JqX3JlZl9kZWwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiAqKnByZWYpCit7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiAqcmVmOworCisJTlZfREVCVUcoZGV2LCAicmVmICVwXG4iLCBwcmVmID8gKnByZWYgOiBOVUxMKTsKKworCWlmICghZGV2IHx8ICFwcmVmIHx8ICpwcmVmID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCXJlZiA9ICpwcmVmOworCisJaWYgKHJlZi0+aGFuZGxlICE9IH4wKQorCQlub3V2ZWF1X3JhbWh0X3JlbW92ZShkZXYsIHJlZik7CisKKwlpZiAocmVmLT5ncHVvYmopIHsKKwkJcmVmLT5ncHVvYmotPnJlZmNvdW50LS07CisKKwkJaWYgKHJlZi0+Z3B1b2JqLT5yZWZjb3VudCA9PSAwKSB7CisJCQlpZiAoIShyZWYtPmdwdW9iai0+ZmxhZ3MgJiBOVk9CSl9GTEFHX0FMTE9XX05PX1JFRlMpKQorCQkJCW5vdXZlYXVfZ3B1b2JqX2RlbChkZXYsICZyZWYtPmdwdW9iaik7CisJCX0KKwl9CisKKwkqcHJlZiA9IE5VTEw7CisJa2ZyZWUocmVmKTsKKwlyZXR1cm4gMDsKK30KKworaW50Citub3V2ZWF1X2dwdW9ial9uZXdfcmVmKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpvYywgc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqcmMsCisJCSAgICAgICB1aW50MzJfdCBoYW5kbGUsIHVpbnQzMl90IHNpemUsIGludCBhbGlnbiwKKwkJICAgICAgIHVpbnQzMl90IGZsYWdzLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfcmVmICoqcmVmKQoreworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqID0gTlVMTDsKKwlpbnQgcmV0OworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgb2MsIHNpemUsIGFsaWduLCBmbGFncywgJmdwdW9iaik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX3JlZl9hZGQoZGV2LCByYywgaGFuZGxlLCBncHVvYmosIHJlZik7CisJaWYgKHJldCkgeworCQlub3V2ZWF1X2dwdW9ial9kZWwoZGV2LCAmZ3B1b2JqKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50Citub3V2ZWF1X2dwdW9ial9yZWZfZmluZChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCB1aW50MzJfdCBoYW5kbGUsCisJCQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfcmVmICoqcmVmX3JldCkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfcmVmICpyZWY7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnksICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIHRtcCwgJmNoYW4tPnJhbWh0X3JlZnMpIHsKKwkJcmVmID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiwgbGlzdCk7CisKKwkJaWYgKHJlZi0+aGFuZGxlID09IGhhbmRsZSkgeworCQkJaWYgKHJlZl9yZXQpCisJCQkJKnJlZl9yZXQgPSByZWY7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitpbnQKK25vdXZlYXVfZ3B1b2JqX25ld19mYWtlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IHBfb2Zmc2V0LAorCQkJdWludDMyX3QgYl9vZmZzZXQsIHVpbnQzMl90IHNpemUsCisJCQl1aW50MzJfdCBmbGFncywgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICoqcGdwdW9iaiwKKwkJCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYgKipwcmVmKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmogPSBOVUxMOworCWludCBpOworCisJTlZfREVCVUcoZGV2LAorCQkgInBfb2Zmc2V0PTB4JTA4eCBiX29mZnNldD0weCUwOHggc2l6ZT0weCUwOHggZmxhZ3M9MHglMDh4XG4iLAorCQkgcF9vZmZzZXQsIGJfb2Zmc2V0LCBzaXplLCBmbGFncyk7CisKKwlncHVvYmogPSBremFsbG9jKHNpemVvZigqZ3B1b2JqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFncHVvYmopCisJCXJldHVybiAtRU5PTUVNOworCU5WX0RFQlVHKGRldiwgImdwdW9iaiAlcFxuIiwgZ3B1b2JqKTsKKwlncHVvYmotPmltX2NoYW5uZWwgPSBOVUxMOworCWdwdW9iai0+ZmxhZ3MgICAgICA9IGZsYWdzIHwgTlZPQkpfRkxBR19GQUtFOworCisJbGlzdF9hZGRfdGFpbCgmZ3B1b2JqLT5saXN0LCAmZGV2X3ByaXYtPmdwdW9ial9saXN0KTsKKworCWlmIChwX29mZnNldCAhPSB+MCkgeworCQlncHVvYmotPmltX3ByYW1pbiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtZW1fYmxvY2spLAorCQkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghZ3B1b2JqLT5pbV9wcmFtaW4pIHsKKwkJCW5vdXZlYXVfZ3B1b2JqX2RlbChkZXYsICZncHVvYmopOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJZ3B1b2JqLT5pbV9wcmFtaW4tPnN0YXJ0ID0gcF9vZmZzZXQ7CisJCWdwdW9iai0+aW1fcHJhbWluLT5zaXplICA9IHNpemU7CisJfQorCisJaWYgKGJfb2Zmc2V0ICE9IH4wKSB7CisJCWdwdW9iai0+aW1fYmFja2luZyA9IChzdHJ1Y3Qgbm91dmVhdV9ibyAqKS0xOworCQlncHVvYmotPmltX2JhY2tpbmdfc3RhcnQgPSBiX29mZnNldDsKKwl9CisKKwlpZiAoZ3B1b2JqLT5mbGFncyAmIE5WT0JKX0ZMQUdfWkVST19BTExPQykgeworCQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKKwkJZm9yIChpID0gMDsgaSA8IGdwdW9iai0+aW1fcHJhbWluLT5zaXplOyBpICs9IDQpCisJCQludl93bzMyKGRldiwgZ3B1b2JqLCBpLzQsIDApOworCQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCX0KKworCWlmIChwcmVmKSB7CisJCWkgPSBub3V2ZWF1X2dwdW9ial9yZWZfYWRkKGRldiwgTlVMTCwgMCwgZ3B1b2JqLCBwcmVmKTsKKwkJaWYgKGkpIHsKKwkJCW5vdXZlYXVfZ3B1b2JqX2RlbChkZXYsICZncHVvYmopOworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisKKwlpZiAocGdwdW9iaikKKwkJKnBncHVvYmogPSBncHVvYmo7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHVpbnQzMl90Citub3V2ZWF1X2dwdW9ial9jbGFzc19pbnN0bWVtX3NpemUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNsYXNzKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwkvKlhYWDogZG9kZ3kgaGFjayBmb3Igbm93ICovCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApCisJCXJldHVybiAyNDsKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl80MCkKKwkJcmV0dXJuIDMyOworCXJldHVybiAxNjsKK30KKworLyoKKyAgIERNQSBvYmplY3RzIGFyZSB1c2VkIHRvIHJlZmVyZW5jZSBhIHBpZWNlIG9mIG1lbW9yeSBpbiB0aGUKKyAgIGZyYW1lYnVmZmVyLCBQQ0kgb3IgQUdQIGFkZHJlc3Mgc3BhY2UuIEVhY2ggb2JqZWN0IGlzIDE2IGJ5dGVzIGJpZworICAgYW5kIGxvb2tzIGFzIGZvbGxvd3M6CisKKyAgIGVudHJ5WzBdCisgICAxMTowICBjbGFzcyAoc2VlbXMgbGlrZSBJIGNhbiBhbHdheXMgdXNlIDAgaGVyZSkKKyAgIDEyICAgIHBhZ2UgdGFibGUgcHJlc2VudD8KKyAgIDEzICAgIHBhZ2UgZW50cnkgbGluZWFyPworICAgMTU6MTQgYWNjZXNzOiAwIHJ3LCAxIHJvLCAyIHdvCisgICAxNzoxNiB0YXJnZXQ6IDAgTlYgbWVtb3J5LCAxIE5WIG1lbW9yeSB0aWxlZCwgMiBQQ0ksIDMgQUdQCisgICAzMToyMCBkbWEgYWRqdXN0IChiaXRzIDAtMTEgb2YgdGhlIGFkZHJlc3MpCisgICBlbnRyeVsxXQorICAgZG1hIGxpbWl0IChzaXplIG9mIHRyYW5zZmVyKQorICAgZW50cnlbWF0KKyAgIDEgICAgIDAgcmVhZG9ubHksIDEgcmVhZHdyaXRlCisgICAzMToxMiBkbWEgZnJhbWUgYWRkcmVzcyBvZiB0aGUgcGFnZSAoYml0cyAxMi0zMSBvZiB0aGUgYWRkcmVzcykKKyAgIGVudHJ5W05dCisgICBwYWdlIHRhYmxlIHRlcm1pbmF0b3IsIHNhbWUgdmFsdWUgYXMgdGhlIGZpcnN0IHB0ZSwgYXMgZG9lcyBudmlkaWEKKyAgIHJpdmF0diB1c2VzIDB4ZmZmZmZmZmYKKworICAgTm9uIGxpbmVhciBwYWdlIHRhYmxlcyBuZWVkIGEgbGlzdCBvZiBmcmFtZSBhZGRyZXNzZXMgYWZ0ZXJ3YXJkcywKKyAgIHRoZSByaXZhdHYgcHJvamVjdCBoYXMgc29tZSBpbmZvIG9uIHRoaXMuCisKKyAgIFRoZSBtZXRob2QgYmVsb3cgY3JlYXRlcyBhIERNQSBvYmplY3QgaW4gaW5zdGFuY2UgUkFNIGFuZCByZXR1cm5zIGEgaGFuZGxlCisgICB0byBpdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldCB1cCBjb250ZXh0IG9iamVjdHMuCisqLworaW50Citub3V2ZWF1X2dwdW9ial9kbWFfbmV3KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBjbGFzcywKKwkJICAgICAgIHVpbnQ2NF90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSwgaW50IGFjY2VzcywKKwkJICAgICAgIGludCB0YXJnZXQsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKmdwdW9iaikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfaW5zdG1lbV9lbmdpbmUgKmluc3RtZW0gPSAmZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtOworCWludCByZXQ7CisKKwlOVl9ERUJVRyhkZXYsICJjaCVkIGNsYXNzPTB4JTA0eCBvZmZzZXQ9MHglbGx4IHNpemU9MHglbGx4XG4iLAorCQkgY2hhbi0+aWQsIGNsYXNzLCBvZmZzZXQsIHNpemUpOworCU5WX0RFQlVHKGRldiwgImFjY2Vzcz0lZCB0YXJnZXQ9JWRcbiIsIGFjY2VzcywgdGFyZ2V0KTsKKworCXN3aXRjaCAodGFyZ2V0KSB7CisJY2FzZSBOVl9ETUFfVEFSR0VUX0FHUDoKKwkJb2Zmc2V0ICs9IGRldl9wcml2LT5nYXJ0X2luZm8uYXBlcl9iYXNlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBjaGFuLAorCQkJCSBub3V2ZWF1X2dwdW9ial9jbGFzc19pbnN0bWVtX3NpemUoZGV2LCBjbGFzcyksCisJCQkJIDE2LCBOVk9CSl9GTEFHX1pFUk9fQUxMT0MgfAorCQkJCSBOVk9CSl9GTEFHX1pFUk9fRlJFRSwgZ3B1b2JqKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIkVycm9yIGNyZWF0aW5nIGdwdW9iajogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaW5zdG1lbS0+cHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApIHsKKwkJdWludDMyX3QgZnJhbWUsIGFkanVzdCwgcHRlX2ZsYWdzID0gMDsKKworCQlpZiAoYWNjZXNzICE9IE5WX0RNQV9BQ0NFU1NfUk8pCisJCQlwdGVfZmxhZ3MgfD0gKDE8PDEpOworCQlhZGp1c3QgPSBvZmZzZXQgJiAgMHgwMDAwMGZmZjsKKwkJZnJhbWUgID0gb2Zmc2V0ICYgfjB4MDAwMDBmZmY7CisKKwkJbnZfd28zMihkZXYsICpncHVvYmosIDAsICgoMTw8MTIpIHwgKDE8PDEzKSB8CisJCQkJKGFkanVzdCA8PCAyMCkgfAorCQkJCSAoYWNjZXNzIDw8IDE0KSB8CisJCQkJICh0YXJnZXQgPDwgMTYpIHwKKwkJCQkgIGNsYXNzKSk7CisJCW52X3dvMzIoZGV2LCAqZ3B1b2JqLCAxLCBzaXplIC0gMSk7CisJCW52X3dvMzIoZGV2LCAqZ3B1b2JqLCAyLCBmcmFtZSB8IHB0ZV9mbGFncyk7CisJCW52X3dvMzIoZGV2LCAqZ3B1b2JqLCAzLCBmcmFtZSB8IHB0ZV9mbGFncyk7CisJfSBlbHNlIHsKKwkJdWludDY0X3QgbGltaXQgPSBvZmZzZXQgKyBzaXplIC0gMTsKKwkJdWludDMyX3QgZmxhZ3MwLCBmbGFnczU7CisKKwkJaWYgKHRhcmdldCA9PSBOVl9ETUFfVEFSR0VUX1ZJRE1FTSkgeworCQkJZmxhZ3MwID0gMHgwMDE5MDAwMDsKKwkJCWZsYWdzNSA9IDB4MDAwMTAwMDA7CisJCX0gZWxzZSB7CisJCQlmbGFnczAgPSAweDdmYzAwMDAwOworCQkJZmxhZ3M1ID0gMHgwMDA4MDAwMDsKKwkJfQorCisJCW52X3dvMzIoZGV2LCAqZ3B1b2JqLCAwLCBmbGFnczAgfCBjbGFzcyk7CisJCW52X3dvMzIoZGV2LCAqZ3B1b2JqLCAxLCBsb3dlcl8zMl9iaXRzKGxpbWl0KSk7CisJCW52X3dvMzIoZGV2LCAqZ3B1b2JqLCAyLCBsb3dlcl8zMl9iaXRzKG9mZnNldCkpOworCQludl93bzMyKGRldiwgKmdwdW9iaiwgMywgKCh1cHBlcl8zMl9iaXRzKGxpbWl0KSAmIDB4ZmYpIDw8IDI0KSB8CisJCQkJCSh1cHBlcl8zMl9iaXRzKG9mZnNldCkgJiAweGZmKSk7CisJCW52X3dvMzIoZGV2LCAqZ3B1b2JqLCA1LCBmbGFnczUpOworCX0KKworCWluc3RtZW0tPmZpbmlzaF9hY2Nlc3MoZGV2KTsKKworCSgqZ3B1b2JqKS0+ZW5naW5lID0gTlZPQkpfRU5HSU5FX1NXOworCSgqZ3B1b2JqKS0+Y2xhc3MgID0gY2xhc3M7CisJcmV0dXJuIDA7Cit9CisKK2ludAorbm91dmVhdV9ncHVvYmpfZ2FydF9kbWFfbmV3KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCQkgICAgdWludDY0X3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplLCBpbnQgYWNjZXNzLAorCQkJICAgIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKmdwdW9iaiwKKwkJCSAgICB1aW50MzJfdCAqb19yZXQpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCByZXQ7CisKKwlpZiAoZGV2X3ByaXYtPmdhcnRfaW5mby50eXBlID09IE5PVVZFQVVfR0FSVF9BR1AgfHwKKwkgICAgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTAgJiYKKwkgICAgIGRldl9wcml2LT5nYXJ0X2luZm8udHlwZSA9PSBOT1VWRUFVX0dBUlRfU0dETUEpKSB7CisJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2RtYV9uZXcoY2hhbiwgTlZfQ0xBU1NfRE1BX0lOX01FTU9SWSwKKwkJCQkJICAgICBvZmZzZXQgKyBkZXZfcHJpdi0+dm1fZ2FydF9iYXNlLAorCQkJCQkgICAgIHNpemUsIGFjY2VzcywgTlZfRE1BX1RBUkdFVF9BR1AsCisJCQkJCSAgICAgZ3B1b2JqKTsKKwkJaWYgKG9fcmV0KQorCQkJKm9fcmV0ID0gMDsKKwl9IGVsc2UKKwlpZiAoZGV2X3ByaXYtPmdhcnRfaW5mby50eXBlID09IE5PVVZFQVVfR0FSVF9TR0RNQSkgeworCQkqZ3B1b2JqID0gZGV2X3ByaXYtPmdhcnRfaW5mby5zZ19jdHhkbWE7CisJCWlmIChvZmZzZXQgJiB+MHhmZmZmZmZmZlVMTCkgeworCQkJTlZfRVJST1IoZGV2LCAib2JqIG9mZnNldCBleGNlZWRzIDMyLWJpdHNcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKG9fcmV0KQorCQkJKm9fcmV0ID0gKHVpbnQzMl90KW9mZnNldDsKKwkJcmV0ID0gKCpncHVvYmogIT0gTlVMTCkgPyAwIDogLUVJTlZBTDsKKwl9IGVsc2UgeworCQlOVl9FUlJPUihkZXYsICJJbnZhbGlkIEdBUlQgdHlwZSAlZFxuIiwgZGV2X3ByaXYtPmdhcnRfaW5mby50eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogQ29udGV4dCBvYmplY3RzIGluIHRoZSBpbnN0YW5jZSBSQU0gaGF2ZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZS4KKyAqIE9uIE5WNDAgdGhleSBhcmUgMzIgYnl0ZSBsb25nLCBvbiBOVjMwIGFuZCBzbWFsbGVyIDE2IGJ5dGVzLgorCisgICBOVjQgLSBOVjMwOgorCisgICBlbnRyeVswXQorICAgMTE6MCBjbGFzcworICAgMTIgICBjaHJvbWEga2V5IGVuYWJsZQorICAgMTMgICB1c2VyIGNsaXAgZW5hYmxlCisgICAxNCAgIHN3aXp6bGUgZW5hYmxlCisgICAxNzoxNSBwYXRjaCBjb25maWc6CisgICAgICAgc2NyY29weV9hbmQsIHJvcF9hbmQsIGJsZW5kX2FuZCwgc2NyY29weSwgc3JjY29weV9wcmUsIGJsZW5kX3ByZQorICAgMTggICBzeW5jaHJvbml6ZSBlbmFibGUKKyAgIDE5ICAgZW5kaWFuOiAxIGJpZywgMCBsaXR0bGUKKyAgIDIxOjIwIGRpdGhlciBtb2RlCisgICAyMyAgICBzaW5nbGUgc3RlcCBlbmFibGUKKyAgIDI0ICAgIHBhdGNoIHN0YXR1czogMCBpbnZhbGlkLCAxIHZhbGlkCisgICAyNSAgICBjb250ZXh0X3N1cmZhY2UgMDogMSB2YWxpZAorICAgMjYgICAgY29udGV4dCBzdXJmYWNlIDE6IDEgdmFsaWQKKyAgIDI3ICAgIGNvbnRleHQgcGF0dGVybjogMSB2YWxpZAorICAgMjggICAgY29udGV4dCByb3A6IDEgdmFsaWQKKyAgIDI5LDMwIGNvbnRleHQgYmV0YSwgYmV0YTQKKyAgIGVudHJ5WzFdCisgICA3OjAgICBtb25vIGZvcm1hdAorICAgMTU6OCAgY29sb3IgZm9ybWF0CisgICAzMToxNiBub3RpZnkgaW5zdGFuY2UgYWRkcmVzcworICAgZW50cnlbMl0KKyAgIDE1OjAgIGRtYSAwIGluc3RhbmNlIGFkZHJlc3MKKyAgIDMxOjE2IGRtYSAxIGluc3RhbmNlIGFkZHJlc3MKKyAgIGVudHJ5WzNdCisgICBkbWEgbWV0aG9kIHRyYXBzCisKKyAgIE5WNDA6CisgICBObyBpZGVhIHdoYXQgdGhlIGV4YWN0IGZvcm1hdCBpcy4gSGVyZSdzIHdoYXQgY2FuIGJlIGRlZHVjdGVkOgorCisgICBlbnRyeVswXToKKyAgIDExOjAgIGNsYXNzICAobWF5YmUgdXNlcyBtb3JlIGJpdHMgaGVyZT8pCisgICAxNyAgICB1c2VyIGNsaXAgZW5hYmxlCisgICAyMToxOSBwYXRjaCBjb25maWcKKyAgIDI1ICAgIHBhdGNoIHN0YXR1cyB2YWxpZCA/CisgICBlbnRyeVsxXToKKyAgIDE1OjAgIERNQSBub3RpZmllciAgKG1heWJlIDIwOjApCisgICBlbnRyeVsyXToKKyAgIDE1OjAgIERNQSAwIGluc3RhbmNlIChtYXliZSAyMDowKQorICAgMjQgICAgYmlnIGVuZGlhbgorICAgZW50cnlbM106CisgICAxNTowICBETUEgMSBpbnN0YW5jZSAobWF5YmUgMjA6MCkKKyAgIGVudHJ5WzRdOgorICAgZW50cnlbNV06CisgICBzZXQgdG8gMD8KKyovCitpbnQKK25vdXZlYXVfZ3B1b2JqX2dyX25ldyhzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgY2xhc3MsCisJCSAgICAgIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKmdwdW9iaikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IHJldDsKKworCU5WX0RFQlVHKGRldiwgImNoJWQgY2xhc3M9MHglMDR4XG4iLCBjaGFuLT5pZCwgY2xhc3MpOworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgY2hhbiwKKwkJCQkgbm91dmVhdV9ncHVvYmpfY2xhc3NfaW5zdG1lbV9zaXplKGRldiwgY2xhc3MpLAorCQkJCSAxNiwKKwkJCQkgTlZPQkpfRkxBR19aRVJPX0FMTE9DIHwgTlZPQkpfRkxBR19aRVJPX0ZSRUUsCisJCQkJIGdwdW9iaik7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJFcnJvciBjcmVhdGluZyBncHVvYmo6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwKSB7CisJCW52X3dvMzIoZGV2LCAqZ3B1b2JqLCAwLCBjbGFzcyk7CisJCW52X3dvMzIoZGV2LCAqZ3B1b2JqLCA1LCAweDAwMDEwMDAwKTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKGNsYXNzKSB7CisJCWNhc2UgTlZfQ0xBU1NfTlVMTDoKKwkJCW52X3dvMzIoZGV2LCAqZ3B1b2JqLCAwLCAweDAwMDAxMDMwKTsKKwkJCW52X3dvMzIoZGV2LCAqZ3B1b2JqLCAxLCAweEZGRkZGRkZGKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNDApIHsKKwkJCQludl93bzMyKGRldiwgKmdwdW9iaiwgMCwgY2xhc3MpOworI2lmZGVmIF9fQklHX0VORElBTgorCQkJCW52X3dvMzIoZGV2LCAqZ3B1b2JqLCAyLCAweDAxMDAwMDAwKTsKKyNlbmRpZgorCQkJfSBlbHNlIHsKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkJCQludl93bzMyKGRldiwgKmdwdW9iaiwgMCwgY2xhc3MgfCAweDAwMDgwMDAwKTsKKyNlbHNlCisJCQkJbnZfd28zMihkZXYsICpncHVvYmosIDAsIGNsYXNzKTsKKyNlbmRpZgorCQkJfQorCQl9CisJfQorCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisKKwkoKmdwdW9iaiktPmVuZ2luZSA9IE5WT0JKX0VOR0lORV9HUjsKKwkoKmdwdW9iaiktPmNsYXNzICA9IGNsYXNzOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citub3V2ZWF1X2dwdW9ial9zd19uZXcoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGNsYXNzLAorCQkgICAgICBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKipncHVvYmpfcmV0KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGNoYW4tPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmo7CisKKwlpZiAoIWNoYW4gfHwgIWdwdW9ial9yZXQgfHwgKmdwdW9ial9yZXQgIT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlncHVvYmogPSBremFsbG9jKHNpemVvZigqZ3B1b2JqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFncHVvYmopCisJCXJldHVybiAtRU5PTUVNOworCWdwdW9iai0+ZW5naW5lID0gTlZPQkpfRU5HSU5FX1NXOworCWdwdW9iai0+Y2xhc3MgPSBjbGFzczsKKworCWxpc3RfYWRkX3RhaWwoJmdwdW9iai0+bGlzdCwgJmRldl9wcml2LT5ncHVvYmpfbGlzdCk7CisJKmdwdW9ial9yZXQgPSBncHVvYmo7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfZ3B1b2JqX2NoYW5uZWxfaW5pdF9wcmFtaW4oc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpwcmFtaW4gPSBOVUxMOworCXVpbnQzMl90IHNpemU7CisJdWludDMyX3QgYmFzZTsKKwlpbnQgcmV0OworCisJTlZfREVCVUcoZGV2LCAiY2glZFxuIiwgY2hhbi0+aWQpOworCisJLyogQmFzZSBhbW91bnQgZm9yIG9iamVjdCBzdG9yYWdlICg0S2lCIGVub3VnaD8pICovCisJc2l6ZSA9IDB4MTAwMDsKKwliYXNlID0gMDsKKworCS8qIFBHUkFQSCBjb250ZXh0ICovCisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl81MCkgeworCQkvKiBWYXJpb3VzIGZpeGVkIHRhYmxlIHRoaW5nb3MgKi8KKwkJc2l6ZSArPSAweDE0MDA7IC8qIG1vc3RseSB1bmtub3duIHN0dWZmICovCisJCXNpemUgKz0gMHg0MDAwOyAvKiB2bSBwZCAqLworCQliYXNlICA9IDB4NjAwMDsKKwkJLyogUkFNSFQsIG5vdCBzdXJlIGFib3V0IHNldHRpbmcgc2l6ZSB5ZXQsIDMyS2lCIHRvIGJlIHNhZmUgKi8KKwkJc2l6ZSArPSAweDgwMDA7CisJCS8qIFJBTUZDICovCisJCXNpemUgKz0gMHgxMDAwOworCQkvKiBQR1JBUEggY29udGV4dCAqLworCQlzaXplICs9IDB4NzAwMDA7CisJfQorCisJTlZfREVCVUcoZGV2LCAiY2glZCBQUkFNSU4gc2l6ZTogMHglMDh4IGJ5dGVzLCBiYXNlIGFsbG9jPTB4JTA4eFxuIiwKKwkJIGNoYW4tPmlkLCBzaXplLCBiYXNlKTsKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXdfcmVmKGRldiwgTlVMTCwgTlVMTCwgMCwgc2l6ZSwgMHgxMDAwLCAwLAorCQkJCSAgICAgJmNoYW4tPnJhbWluKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIkVycm9yIGFsbG9jYXRpbmcgY2hhbm5lbCBQUkFNSU46ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlwcmFtaW4gPSBjaGFuLT5yYW1pbi0+Z3B1b2JqOworCisJcmV0ID0gbm91dmVhdV9tZW1faW5pdF9oZWFwKCZjaGFuLT5yYW1pbl9oZWFwLAorCQkJCSAgICBwcmFtaW4tPmltX3ByYW1pbi0+c3RhcnQgKyBiYXNlLCBzaXplKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIkVycm9yIGNyZWF0aW5nIFBSQU1JTiBoZWFwOiAlZFxuIiwgcmV0KTsKKwkJbm91dmVhdV9ncHVvYmpfcmVmX2RlbChkZXYsICZjaGFuLT5yYW1pbik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludAorbm91dmVhdV9ncHVvYmpfY2hhbm5lbF9pbml0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCQkgICAgdWludDMyX3QgdnJhbV9oLCB1aW50MzJfdCB0dF9oKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9pbnN0bWVtX2VuZ2luZSAqaW5zdG1lbSA9ICZkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW07CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICp2cmFtID0gTlVMTCwgKnR0ID0gTlVMTDsKKwlpbnQgcmV0LCBpOworCisJSU5JVF9MSVNUX0hFQUQoJmNoYW4tPnJhbWh0X3JlZnMpOworCisJTlZfREVCVUcoZGV2LCAiY2glZCB2cmFtPTB4JTA4eCB0dD0weCUwOHhcbiIsIGNoYW4tPmlkLCB2cmFtX2gsIHR0X2gpOworCisJLyogUmVzZXJ2ZSBhIGJsb2NrIG9mIFBSQU1JTiBmb3IgdGhlIGNoYW5uZWwKKwkgKlhYWDogbWF5YmUgb24gPE5WNTAgdG9vIGF0IHNvbWUgcG9pbnQKKwkgKi8KKwlpZiAoMCB8fCBkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzUwKSB7CisJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2NoYW5uZWxfaW5pdF9wcmFtaW4oY2hhbik7CisJCWlmIChyZXQpIHsKKwkJCU5WX0VSUk9SKGRldiwgImluaXQgcHJhbWluXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwkvKiBOVjUwIFZNCisJICogIC0gQWxsb2NhdGUgcGVyLWNoYW5uZWwgcGFnZS1kaXJlY3RvcnkKKwkgKiAgLSBNYXAgR0FSVCBhbmQgVlJBTSBpbnRvIHRoZSBjaGFubmVsJ3MgYWRkcmVzcyBzcGFjZSBhdCB0aGUKKwkgKiAgICBsb2NhdGlvbnMgZGV0ZXJtaW5lZCBkdXJpbmcgaW5pdC4KKwkgKi8KKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkgeworCQl1aW50MzJfdCB2bV9vZmZzZXQsIHBkZTsKKworCQlpbnN0bWVtLT5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOworCisJCXZtX29mZnNldCA9IChkZXZfcHJpdi0+Y2hpcHNldCAmIDB4ZjApID09IDB4NTAgPyAweDE0MDAgOiAweDIwMDsKKwkJdm1fb2Zmc2V0ICs9IGNoYW4tPnJhbWluLT5ncHVvYmotPmltX3ByYW1pbi0+c3RhcnQ7CisKKwkJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3X2Zha2UoZGV2LCB2bV9vZmZzZXQsIH4wLCAweDQwMDAsCisJCQkJCQkJMCwgJmNoYW4tPnZtX3BkLCBOVUxMKTsKKwkJaWYgKHJldCkgeworCQkJaW5zdG1lbS0+ZmluaXNoX2FjY2VzcyhkZXYpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgMHg0MDAwOyBpICs9IDgpIHsKKwkJCW52X3dvMzIoZGV2LCBjaGFuLT52bV9wZCwgKGkrMCkvNCwgMHgwMDAwMDAwMCk7CisJCQludl93bzMyKGRldiwgY2hhbi0+dm1fcGQsIChpKzQpLzQsIDB4ZGVhZGNhZmUpOworCQl9CisKKwkJcGRlID0gKGRldl9wcml2LT52bV9nYXJ0X2Jhc2UgLyAoNTEyKjEwMjQqMTAyNCkpICogMjsKKwkJcmV0ID0gbm91dmVhdV9ncHVvYmpfcmVmX2FkZChkZXYsIE5VTEwsIDAsCisJCQkJCSAgICAgZGV2X3ByaXYtPmdhcnRfaW5mby5zZ19jdHhkbWEsCisJCQkJCSAgICAgJmNoYW4tPnZtX2dhcnRfcHQpOworCQlpZiAocmV0KSB7CisJCQlpbnN0bWVtLT5maW5pc2hfYWNjZXNzKGRldik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCW52X3dvMzIoZGV2LCBjaGFuLT52bV9wZCwgcGRlKyssCisJCQkgICAgY2hhbi0+dm1fZ2FydF9wdC0+aW5zdGFuY2UgfCAweDAzKTsKKwkJbnZfd28zMihkZXYsIGNoYW4tPnZtX3BkLCBwZGUrKywgMHgwMDAwMDAwMCk7CisKKwkJcGRlID0gKGRldl9wcml2LT52bV92cmFtX2Jhc2UgLyAoNTEyKjEwMjQqMTAyNCkpICogMjsKKwkJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT52bV92cmFtX3B0X25yOyBpKyspIHsKKwkJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX3JlZl9hZGQoZGV2LCBOVUxMLCAwLAorCQkJCQkJICAgICBkZXZfcHJpdi0+dm1fdnJhbV9wdFtpXSwKKwkJCQkJCSAgICAgJmNoYW4tPnZtX3ZyYW1fcHRbaV0pOworCQkJaWYgKHJldCkgeworCQkJCWluc3RtZW0tPmZpbmlzaF9hY2Nlc3MoZGV2KTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCisJCQludl93bzMyKGRldiwgY2hhbi0+dm1fcGQsIHBkZSsrLAorCQkJCSAgICBjaGFuLT52bV92cmFtX3B0W2ldLT5pbnN0YW5jZSB8IDB4NjEpOworCQkJbnZfd28zMihkZXYsIGNoYW4tPnZtX3BkLCBwZGUrKywgMHgwMDAwMDAwMCk7CisJCX0KKworCQlpbnN0bWVtLT5maW5pc2hfYWNjZXNzKGRldik7CisJfQorCisJLyogUkFNSFQgKi8KKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7CisJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX3JlZl9hZGQoZGV2LCBOVUxMLCAwLCBkZXZfcHJpdi0+cmFtaHQsCisJCQkJCSAgICAgJmNoYW4tPnJhbWh0KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKKwkJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3X3JlZihkZXYsIGNoYW4sIGNoYW4sIDAsCisJCQkJCSAgICAgMHg4MDAwLCAxNiwKKwkJCQkJICAgICBOVk9CSl9GTEFHX1pFUk9fQUxMT0MsCisJCQkJCSAgICAgJmNoYW4tPnJhbWh0KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJLyogVlJBTSBjdHhkbWEgKi8KKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkgeworCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9kbWFfbmV3KGNoYW4sIE5WX0NMQVNTX0RNQV9JTl9NRU1PUlksCisJCQkJCSAgICAgMCwgZGV2X3ByaXYtPnZtX2VuZCwKKwkJCQkJICAgICBOVl9ETUFfQUNDRVNTX1JXLAorCQkJCQkgICAgIE5WX0RNQV9UQVJHRVRfQUdQLCAmdnJhbSk7CisJCWlmIChyZXQpIHsKKwkJCU5WX0VSUk9SKGRldiwgIkVycm9yIGNyZWF0aW5nIFZSQU0gY3R4ZG1hOiAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9IGVsc2UgeworCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9kbWFfbmV3KGNoYW4sIE5WX0NMQVNTX0RNQV9JTl9NRU1PUlksCisJCQkJCQkwLCBkZXZfcHJpdi0+ZmJfYXZhaWxhYmxlX3NpemUsCisJCQkJCQlOVl9ETUFfQUNDRVNTX1JXLAorCQkJCQkJTlZfRE1BX1RBUkdFVF9WSURNRU0sICZ2cmFtKTsKKwkJaWYgKHJldCkgeworCQkJTlZfRVJST1IoZGV2LCAiRXJyb3IgY3JlYXRpbmcgVlJBTSBjdHhkbWE6ICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX3JlZl9hZGQoZGV2LCBjaGFuLCB2cmFtX2gsIHZyYW0sIE5VTEwpOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiRXJyb3IgcmVmZXJlbmNpbmcgVlJBTSBjdHhkbWE6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFRUIG1lbW9yeSBjdHhkbWEgKi8KKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkgeworCQl0dCA9IHZyYW07CisJfSBlbHNlCisJaWYgKGRldl9wcml2LT5nYXJ0X2luZm8udHlwZSAhPSBOT1VWRUFVX0dBUlRfTk9ORSkgeworCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9nYXJ0X2RtYV9uZXcoY2hhbiwgMCwKKwkJCQkJCSAgZGV2X3ByaXYtPmdhcnRfaW5mby5hcGVyX3NpemUsCisJCQkJCQkgIE5WX0RNQV9BQ0NFU1NfUlcsICZ0dCwgTlVMTCk7CisJfSBlbHNlIHsKKwkJTlZfRVJST1IoZGV2LCAiSW52YWxpZCBHQVJUIHR5cGUgJWRcbiIsIGRldl9wcml2LT5nYXJ0X2luZm8udHlwZSk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJFcnJvciBjcmVhdGluZyBUVCBjdHhkbWE6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX3JlZl9hZGQoZGV2LCBjaGFuLCB0dF9oLCB0dCwgTlVMTCk7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJFcnJvciByZWZlcmVuY2luZyBUVCBjdHhkbWE6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCit2b2lkCitub3V2ZWF1X2dwdW9ial9jaGFubmVsX3Rha2Vkb3duKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gY2hhbi0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5LCAqdG1wOworCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYgKnJlZjsKKwlpbnQgaTsKKworCU5WX0RFQlVHKGRldiwgImNoJWRcbiIsIGNoYW4tPmlkKTsKKworCWlmICghY2hhbi0+cmFtaHRfcmVmcy5uZXh0KQorCQlyZXR1cm47CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIHRtcCwgJmNoYW4tPnJhbWh0X3JlZnMpIHsKKwkJcmVmID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiwgbGlzdCk7CisKKwkJbm91dmVhdV9ncHVvYmpfcmVmX2RlbChkZXYsICZyZWYpOworCX0KKworCW5vdXZlYXVfZ3B1b2JqX3JlZl9kZWwoZGV2LCAmY2hhbi0+cmFtaHQpOworCisJbm91dmVhdV9ncHVvYmpfZGVsKGRldiwgJmNoYW4tPnZtX3BkKTsKKwlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGRldiwgJmNoYW4tPnZtX2dhcnRfcHQpOworCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+dm1fdnJhbV9wdF9ucjsgaSsrKQorCQlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGRldiwgJmNoYW4tPnZtX3ZyYW1fcHRbaV0pOworCisJaWYgKGNoYW4tPnJhbWluX2hlYXApCisJCW5vdXZlYXVfbWVtX3Rha2Vkb3duKCZjaGFuLT5yYW1pbl9oZWFwKTsKKwlpZiAoY2hhbi0+cmFtaW4pCisJCW5vdXZlYXVfZ3B1b2JqX3JlZl9kZWwoZGV2LCAmY2hhbi0+cmFtaW4pOworCit9CisKK2ludAorbm91dmVhdV9ncHVvYmpfc3VzcGVuZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmo7CisJaW50IGk7CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7CisJCWRldl9wcml2LT5zdXNyZXMucmFtaW5fY29weSA9IHZtYWxsb2MoZGV2X3ByaXYtPnJhbWluX3JzdmRfdnJhbSk7CisJCWlmICghZGV2X3ByaXYtPnN1c3Jlcy5yYW1pbl9jb3B5KQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT5yYW1pbl9yc3ZkX3ZyYW07IGkgKz0gNCkKKwkJCWRldl9wcml2LT5zdXNyZXMucmFtaW5fY29weVtpLzRdID0gbnZfcmkzMihkZXYsIGkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGdwdW9iaiwgJmRldl9wcml2LT5ncHVvYmpfbGlzdCwgbGlzdCkgeworCQlpZiAoIWdwdW9iai0+aW1fYmFja2luZyB8fCAoZ3B1b2JqLT5mbGFncyAmIE5WT0JKX0ZMQUdfRkFLRSkpCisJCQljb250aW51ZTsKKworCQlncHVvYmotPmltX2JhY2tpbmdfc3VzcGVuZCA9IHZtYWxsb2MoZ3B1b2JqLT5pbV9wcmFtaW4tPnNpemUpOworCQlpZiAoIWdwdW9iai0+aW1fYmFja2luZ19zdXNwZW5kKSB7CisJCQlub3V2ZWF1X2dwdW9ial9yZXN1bWUoZGV2KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgZmFsc2UpOworCQlmb3IgKGkgPSAwOyBpIDwgZ3B1b2JqLT5pbV9wcmFtaW4tPnNpemUgLyA0OyBpKyspCisJCQlncHVvYmotPmltX2JhY2tpbmdfc3VzcGVuZFtpXSA9IG52X3JvMzIoZGV2LCBncHVvYmosIGkpOworCQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkCitub3V2ZWF1X2dwdW9ial9zdXNwZW5kX2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgeworCQl2ZnJlZShkZXZfcHJpdi0+c3VzcmVzLnJhbWluX2NvcHkpOworCQlkZXZfcHJpdi0+c3VzcmVzLnJhbWluX2NvcHkgPSBOVUxMOworCQlyZXR1cm47CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShncHVvYmosICZkZXZfcHJpdi0+Z3B1b2JqX2xpc3QsIGxpc3QpIHsKKwkJaWYgKCFncHVvYmotPmltX2JhY2tpbmdfc3VzcGVuZCkKKwkJCWNvbnRpbnVlOworCisJCXZmcmVlKGdwdW9iai0+aW1fYmFja2luZ19zdXNwZW5kKTsKKwkJZ3B1b2JqLT5pbV9iYWNraW5nX3N1c3BlbmQgPSBOVUxMOworCX0KK30KKwordm9pZAorbm91dmVhdV9ncHVvYmpfcmVzdW1lKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iajsKKwlpbnQgaTsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApIHsKKwkJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT5yYW1pbl9yc3ZkX3ZyYW07IGkgKz0gNCkKKwkJCW52X3dpMzIoZGV2LCBpLCBkZXZfcHJpdi0+c3VzcmVzLnJhbWluX2NvcHlbaS80XSk7CisJCW5vdXZlYXVfZ3B1b2JqX3N1c3BlbmRfY2xlYW51cChkZXYpOworCQlyZXR1cm47CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShncHVvYmosICZkZXZfcHJpdi0+Z3B1b2JqX2xpc3QsIGxpc3QpIHsKKwkJaWYgKCFncHVvYmotPmltX2JhY2tpbmdfc3VzcGVuZCkKKwkJCWNvbnRpbnVlOworCisJCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOworCQlmb3IgKGkgPSAwOyBpIDwgZ3B1b2JqLT5pbV9wcmFtaW4tPnNpemUgLyA0OyBpKyspCisJCQludl93bzMyKGRldiwgZ3B1b2JqLCBpLCBncHVvYmotPmltX2JhY2tpbmdfc3VzcGVuZFtpXSk7CisJCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisJfQorCisJbm91dmVhdV9ncHVvYmpfc3VzcGVuZF9jbGVhbnVwKGRldik7Cit9CisKK2ludCBub3V2ZWF1X2lvY3RsX2dyb2JqX2FsbG9jKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCQkgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fbm91dmVhdV9ncm9ial9hbGxvYyAqaW5pdCA9IGRhdGE7CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9jbGFzcyAqZ3JjOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3IgPSBOVUxMOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47CisJaW50IHJldDsKKworCU5PVVZFQVVfQ0hFQ0tfSU5JVElBTElTRURfV0lUSF9SRVRVUk47CisJTk9VVkVBVV9HRVRfVVNFUl9DSEFOTkVMX1dJVEhfUkVUVVJOKGluaXQtPmNoYW5uZWwsIGZpbGVfcHJpdiwgY2hhbik7CisKKwlpZiAoaW5pdC0+aGFuZGxlID09IH4wKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWdyYyA9IHBncmFwaC0+Z3JjbGFzczsKKwl3aGlsZSAoZ3JjLT5pZCkgeworCQlpZiAoZ3JjLT5pZCA9PSBpbml0LT5jbGFzcykKKwkJCWJyZWFrOworCQlncmMrKzsKKwl9CisKKwlpZiAoIWdyYy0+aWQpIHsKKwkJTlZfRVJST1IoZGV2LCAiSWxsZWdhbCBvYmplY3QgY2xhc3M6IDB4JXhcbiIsIGluaXQtPmNsYXNzKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlpZiAobm91dmVhdV9ncHVvYmpfcmVmX2ZpbmQoY2hhbiwgaW5pdC0+aGFuZGxlLCBOVUxMKSA9PSAwKQorCQlyZXR1cm4gLUVFWElTVDsKKworCWlmICghZ3JjLT5zb2Z0d2FyZSkKKwkJcmV0ID0gbm91dmVhdV9ncHVvYmpfZ3JfbmV3KGNoYW4sIGdyYy0+aWQsICZncik7CisJZWxzZQorCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9zd19uZXcoY2hhbiwgZ3JjLT5pZCwgJmdyKTsKKworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiRXJyb3IgY3JlYXRpbmcgb2JqZWN0OiAlZCAoJWQvMHglMDh4KVxuIiwKKwkJCSByZXQsIGluaXQtPmNoYW5uZWwsIGluaXQtPmhhbmRsZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfcmVmX2FkZChkZXYsIGNoYW4sIGluaXQtPmhhbmRsZSwgZ3IsIE5VTEwpOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiRXJyb3IgcmVmZXJlbmNpbmcgb2JqZWN0OiAlZCAoJWQvMHglMDh4KVxuIiwKKwkJCSByZXQsIGluaXQtPmNoYW5uZWwsIGluaXQtPmhhbmRsZSk7CisJCW5vdXZlYXVfZ3B1b2JqX2RlbChkZXYsICZncik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBub3V2ZWF1X2lvY3RsX2dwdW9ial9mcmVlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCQkgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfZ3B1b2JqX2ZyZWUgKm9iamZyZWUgPSBkYXRhOworCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYgKnJlZjsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuOworCWludCByZXQ7CisKKwlOT1VWRUFVX0NIRUNLX0lOSVRJQUxJU0VEX1dJVEhfUkVUVVJOOworCU5PVVZFQVVfR0VUX1VTRVJfQ0hBTk5FTF9XSVRIX1JFVFVSTihvYmpmcmVlLT5jaGFubmVsLCBmaWxlX3ByaXYsIGNoYW4pOworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfcmVmX2ZpbmQoY2hhbiwgb2JqZnJlZS0+aGFuZGxlLCAmcmVmKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCW5vdXZlYXVfZ3B1b2JqX3JlZl9kZWwoZGV2LCAmcmVmKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9yZWcuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmExYjBlNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcmVnLmgKQEAgLTAsMCArMSw4MzYgQEAKKworCisjZGVmaW5lIE5WMDNfQk9PVF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKyMgICAgZGVmaW5lIE5WMDNfQk9PVF8wX1JBTV9BTU9VTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMworIyAgICBkZWZpbmUgTlYwM19CT09UXzBfUkFNX0FNT1VOVF84TUIgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjICAgIGRlZmluZSBOVjAzX0JPT1RfMF9SQU1fQU1PVU5UXzJNQiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyMgICAgZGVmaW5lIE5WMDNfQk9PVF8wX1JBTV9BTU9VTlRfNE1CICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorIyAgICBkZWZpbmUgTlYwM19CT09UXzBfUkFNX0FNT1VOVF84TUJfU0RSQU0gICAgICAgICAgICAgICAweDAwMDAwMDAzCisjICAgIGRlZmluZSBOVjA0X0JPT1RfMF9SQU1fQU1PVU5UXzMyTUIgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyMgICAgZGVmaW5lIE5WMDRfQk9PVF8wX1JBTV9BTU9VTlRfNE1CICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorIyAgICBkZWZpbmUgTlYwNF9CT09UXzBfUkFNX0FNT1VOVF84TUIgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjICAgIGRlZmluZSBOVjA0X0JPT1RfMF9SQU1fQU1PVU5UXzE2TUIgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKworI2RlZmluZSBOVjA0X0ZJRk9fREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMjBjCisjICAgIGRlZmluZSBOVjEwX0ZJRk9fREFUQV9SQU1fQU1PVU5UX01CX01BU0sgICAgICAgICAgICAgIDB4ZmZmMDAwMDAKKyMgICAgZGVmaW5lIE5WMTBfRklGT19EQVRBX1JBTV9BTU9VTlRfTUJfU0hJRlQgICAgICAgICAgICAgMjAKKworI2RlZmluZSBOVl9SQU1JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNzAwMDAwCisKKyNkZWZpbmUgTlZfUkFNSFRfSEFORExFX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBOVl9SQU1IVF9DT05URVhUX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjICAgIGRlZmluZSBOVl9SQU1IVF9DT05URVhUX1ZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICgxPDwzMSkKKyMgICAgZGVmaW5lIE5WX1JBTUhUX0NPTlRFWFRfQ0hBTk5FTF9TSElGVCAgICAgICAgICAgICAgICAgMjQKKyMgICAgZGVmaW5lIE5WX1JBTUhUX0NPTlRFWFRfRU5HSU5FX1NISUZUICAgICAgICAgICAgICAgICAgMTYKKyMgICAgICAgIGRlZmluZSBOVl9SQU1IVF9DT05URVhUX0VOR0lORV9TT0ZUV0FSRSAgICAgICAgICAgMAorIyAgICAgICAgZGVmaW5lIE5WX1JBTUhUX0NPTlRFWFRfRU5HSU5FX0dSQVBISUNTICAgICAgICAgICAxCisjICAgIGRlZmluZSBOVl9SQU1IVF9DT05URVhUX0lOU1RBTkNFX1NISUZUICAgICAgICAgICAgICAgIDAKKyMgICAgZGVmaW5lIE5WNDBfUkFNSFRfQ09OVEVYVF9DSEFOTkVMX1NISUZUICAgICAgICAgICAgICAgMjMKKyMgICAgZGVmaW5lIE5WNDBfUkFNSFRfQ09OVEVYVF9FTkdJTkVfU0hJRlQgICAgICAgICAgICAgICAgMjAKKyMgICAgZGVmaW5lIE5WNDBfUkFNSFRfQ09OVEVYVF9JTlNUQU5DRV9TSElGVCAgICAgICAgICAgICAgMAorCisvKiBETUEgb2JqZWN0IGRlZmluZXMgKi8KKyNkZWZpbmUgTlZfRE1BX0FDQ0VTU19SVyAwCisjZGVmaW5lIE5WX0RNQV9BQ0NFU1NfUk8gMQorI2RlZmluZSBOVl9ETUFfQUNDRVNTX1dPIDIKKyNkZWZpbmUgTlZfRE1BX1RBUkdFVF9WSURNRU0gMAorI2RlZmluZSBOVl9ETUFfVEFSR0VUX1BDSSAgICAyCisjZGVmaW5lIE5WX0RNQV9UQVJHRVRfQUdQICAgIDMKKy8qIFRoZSBmb2xsb3dpbmcgaXMgbm90IGEgcmVhbCB2YWx1ZSB1c2VkIGJ5IHRoZSBjYXJkLCBpdCdzIGNoYW5nZWQgYnkKKyAqIG5vdXZlYXVfb2JqZWN0X2RtYV9jcmVhdGUgKi8KKyNkZWZpbmUgTlZfRE1BX1RBUkdFVF9QQ0lfTk9OTElORUFSIDgKKworLyogU29tZSBvYmplY3QgY2xhc3NlcyB3ZSBjYXJlIGFib3V0IGluIHRoZSBkcm0gKi8KKyNkZWZpbmUgTlZfQ0xBU1NfRE1BX0ZST01fTUVNT1JZICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBOVl9DTEFTU19ETUFfVE9fTUVNT1JZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIE5WX0NMQVNTX05VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMzAKKyNkZWZpbmUgTlZfQ0xBU1NfRE1BX0lOX01FTU9SWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAzRAorCisjZGVmaW5lIE5WMDNfVVNFUihpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDA4MDAwMDArKGkqTlYwM19VU0VSX1NJWkUpKQorI2RlZmluZSBOVjAzX1VTRVJfX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgTlYxMF9VU0VSX19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIE5WMDNfVVNFUl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBOVjAzX1VTRVJfRE1BX1BVVChpKSAgICAgICAgICAgICAgICAgICAgICgweDAwODAwMDQwKyhpKk5WMDNfVVNFUl9TSVpFKSkKKyNkZWZpbmUgTlYwM19VU0VSX0RNQV9QVVRfX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIE5WMTBfVVNFUl9ETUFfUFVUX19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBOVjAzX1VTRVJfRE1BX0dFVChpKSAgICAgICAgICAgICAgICAgICAgICgweDAwODAwMDQ0KyhpKk5WMDNfVVNFUl9TSVpFKSkKKyNkZWZpbmUgTlYwM19VU0VSX0RNQV9HRVRfX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIE5WMTBfVVNFUl9ETUFfR0VUX19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBOVjAzX1VTRVJfUkVGX0NOVChpKSAgICAgICAgICAgICAgICAgICAgICgweDAwODAwMDQ4KyhpKk5WMDNfVVNFUl9TSVpFKSkKKyNkZWZpbmUgTlYwM19VU0VSX1JFRl9DTlRfX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIE5WMTBfVVNFUl9SRUZfQ05UX19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMgorCisjZGVmaW5lIE5WNDBfVVNFUihpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDBjMDAwMDArKGkqTlY0MF9VU0VSX1NJWkUpKQorI2RlZmluZSBOVjQwX1VTRVJfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgTlY0MF9VU0VSX0RNQV9QVVQoaSkgICAgICAgICAgICAgICAgICAgICAoMHgwMGMwMDA0MCsoaSpOVjQwX1VTRVJfU0laRSkpCisjZGVmaW5lIE5WNDBfVVNFUl9ETUFfUFVUX19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBOVjQwX1VTRVJfRE1BX0dFVChpKSAgICAgICAgICAgICAgICAgICAgICgweDAwYzAwMDQ0KyhpKk5WNDBfVVNFUl9TSVpFKSkKKyNkZWZpbmUgTlY0MF9VU0VSX0RNQV9HRVRfX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIE5WNDBfVVNFUl9SRUZfQ05UKGkpICAgICAgICAgICAgICAgICAgICAgKDB4MDBjMDAwNDgrKGkqTlY0MF9VU0VSX1NJWkUpKQorI2RlZmluZSBOVjQwX1VTRVJfUkVGX0NOVF9fU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIKKworI2RlZmluZSBOVjUwX1VTRVIoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwYzAwMDAwKyhpKk5WNTBfVVNFUl9TSVpFKSkKKyNkZWZpbmUgTlY1MF9VU0VSX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIE5WNTBfVVNFUl9ETUFfUFVUKGkpICAgICAgICAgICAgICAgICAgICAgKDB4MDBjMDAwNDArKGkqTlY1MF9VU0VSX1NJWkUpKQorI2RlZmluZSBOVjUwX1VTRVJfRE1BX1BVVF9fU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgKKyNkZWZpbmUgTlY1MF9VU0VSX0RNQV9HRVQoaSkgICAgICAgICAgICAgICAgICAgICAoMHgwMGMwMDA0NCsoaSpOVjUwX1VTRVJfU0laRSkpCisjZGVmaW5lIE5WNTBfVVNFUl9ETUFfR0VUX19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOAorI2RlZmluZSBOVjUwX1VTRVJfUkVGX0NOVChpKSAgICAgICAgICAgICAgICAgICAgICgweDAwYzAwMDQ4KyhpKk5WNTBfVVNFUl9TSVpFKSkKKyNkZWZpbmUgTlY1MF9VU0VSX1JFRl9DTlRfX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI4CisKKyNkZWZpbmUgTlYwM19GSUZPX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwVUwKKworI2RlZmluZSBOVjAzX1BNQ19CT09UXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIE5WMDNfUE1DX0JPT1RfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgTlYwM19QTUNfSU5UUl8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorIyAgICBkZWZpbmUgTlZfUE1DX0lOVFJfMF9QRklGT19QRU5ESU5HICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDgpCisjICAgIGRlZmluZSBOVl9QTUNfSU5UUl8wX1BHUkFQSF9QRU5ESU5HICAgICAgICAgICAgICAgICAgICAgICgxPDwxMikKKyMgICAgZGVmaW5lIE5WX1BNQ19JTlRSXzBfTlY1MF9JMkNfUEVORElORyAgICAgICAgICAgICAgICAgICAgKDE8PDIxKQorIyAgICBkZWZpbmUgTlZfUE1DX0lOVFJfMF9DUlRDMF9QRU5ESU5HICAgICAgICAgICAgICAgICAgICAgICAoMTw8MjQpCisjICAgIGRlZmluZSBOVl9QTUNfSU5UUl8wX0NSVEMxX1BFTkRJTkcgICAgICAgICAgICAgICAgICAgICAgICgxPDwyNSkKKyMgICAgZGVmaW5lIE5WX1BNQ19JTlRSXzBfTlY1MF9ESVNQTEFZX1BFTkRJTkcgICAgICAgICAgICAgICAgKDE8PDI2KQorIyAgICBkZWZpbmUgTlZfUE1DX0lOVFJfMF9DUlRDbl9QRU5ESU5HICAgICAgICAgICAgICAgICAgICAgICAoMzw8MjQpCisjZGVmaW5lIE5WMDNfUE1DX0lOVFJfRU5fMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxNDAKKyMgICAgZGVmaW5lIE5WX1BNQ19JTlRSX0VOXzBfTUFTVEVSX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICgxPDwwKQorI2RlZmluZSBOVjAzX1BNQ19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjICAgIGRlZmluZSBOVl9QTUNfRU5BQkxFX1BGSUZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8OCkKKyMgICAgZGVmaW5lIE5WX1BNQ19FTkFCTEVfUEdSQVBIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDEyKQorLyogRGlzYWJsaW5nIHRoZSBiZWxvdyBiaXQgYnJlYWtzIG5ld2VyIChHN1ggb25seT8pIG1vYmlsZSBjaGlwc2V0cywKKyAqIHRoZSBjYXJkIHdpbGwgaGFuZyBlYXJseSBvbiBpbiB0aGUgWCBpbml0IHByb2Nlc3MuCisgKi8KKyMgICAgZGVmaW5lIE5WX1BNQ19FTkFCTEVfVU5LMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDEzKQorI2RlZmluZSBOVjQwX1BNQ19CQUNLTElHSFQJCQkJICAgMHgwMDAwMTVmMAorIwlkZWZpbmUgTlY0MF9QTUNfQkFDS0xJR0hUX01BU0sJCQkgICAweDAwMWYwMDAwCisjZGVmaW5lIE5WNDBfUE1DXzE3MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDE3MDAKKyNkZWZpbmUgTlY0MF9QTUNfMTcwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTcwNAorI2RlZmluZSBOVjQwX1BNQ18xNzA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxNzA4CisjZGVmaW5lIE5WNDBfUE1DXzE3MEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDE3MEMKKworLyogcHJvYmFibHkgUE1DID8gKi8KKyNkZWZpbmUgTlY1MF9QVU5LX0JBUjBfUFJBTUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTcwMAorI2RlZmluZSBOVjUwX1BVTktfQkFSX0NGR19CQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxNzA0CisjZGVmaW5lIE5WNTBfUFVOS19CQVJfQ0ZHX0JBU0VfVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDwzMCkKKyNkZWZpbmUgTlY1MF9QVU5LX0JBUjFfQ1RYRE1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTcwOAorI2RlZmluZSBOVjUwX1BVTktfQkFSMV9DVFhETUFfVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8MzEpCisjZGVmaW5lIE5WNTBfUFVOS19CQVIzX0NUWERNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDE3MEMKKyNkZWZpbmUgTlY1MF9QVU5LX0JBUjNfQ1RYRE1BX1ZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDMxKQorI2RlZmluZSBOVjUwX1BVTktfVU5LMTcxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxNzEwCisKKyNkZWZpbmUgTlYwNF9QQlVTX1BDSV9OVl8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTgwNAorI2RlZmluZSBOVjA0X1BCVVNfUENJX05WXzE5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxODRDCisjZGVmaW5lIE5WMDRfUEJVU19QQ0lfTlZfMjAJCQkJMHgwMDAwMTg1MAorIwlkZWZpbmUgTlYwNF9QQlVTX1BDSV9OVl8yMF9ST01fU0hBRE9XX0RJU0FCTEVECQkoMCA8PCAwKQorIwlkZWZpbmUgTlYwNF9QQlVTX1BDSV9OVl8yMF9ST01fU0hBRE9XX0VOQUJMRUQJCSgxIDw8IDApCisKKyNkZWZpbmUgTlYwNF9QVElNRVJfSU5UUl8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwOTEwMAorI2RlZmluZSBOVjA0X1BUSU1FUl9JTlRSX0VOXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA5MTQwCisjZGVmaW5lIE5WMDRfUFRJTUVSX05VTUVSQVRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDkyMDAKKyNkZWZpbmUgTlYwNF9QVElNRVJfREVOT01JTkFUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwOTIxMAorI2RlZmluZSBOVjA0X1BUSU1FUl9USU1FXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA5NDAwCisjZGVmaW5lIE5WMDRfUFRJTUVSX1RJTUVfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDk0MTAKKyNkZWZpbmUgTlYwNF9QVElNRVJfQUxBUk1fMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwOTQyMAorCisjZGVmaW5lIE5WMDRfUEZCX0NGRzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAyMDAKKyNkZWZpbmUgTlYwNF9QRkJfQ0ZHMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDIwNAorI2RlZmluZSBOVjQwX1BGQl8wMjBDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMjBDCisjZGVmaW5lIE5WMTBfUEZCX1RJTEUoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMTAwMjQwICsgKGkqMTYpKQorI2RlZmluZSBOVjEwX1BGQl9USUxFX19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIE5WMTBfUEZCX1RMSU1JVChpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMTAwMjQ0ICsgKGkqMTYpKQorI2RlZmluZSBOVjEwX1BGQl9UU0laRShpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDEwMDI0OCArIChpKjE2KSkKKyNkZWZpbmUgTlYxMF9QRkJfVFNUQVRVUyhpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAxMDAyNEMgKyAoaSoxNikpCisjZGVmaW5lIE5WMTBfUEZCX0NMT1NFX1BBR0UyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAzM0MKKyNkZWZpbmUgTlY0MF9QRkJfVElMRShpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAxMDA2MDAgKyAoaSoxNikpCisjZGVmaW5lIE5WNDBfUEZCX1RJTEVfX1NJWkVfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIE5WNDBfUEZCX1RJTEVfX1NJWkVfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIE5WNDBfUEZCX1RMSU1JVChpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMTAwNjA0ICsgKGkqMTYpKQorI2RlZmluZSBOVjQwX1BGQl9UU0laRShpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDEwMDYwOCArIChpKjE2KSkKKyNkZWZpbmUgTlY0MF9QRkJfVFNUQVRVUyhpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAxMDA2MEMgKyAoaSoxNikpCisjZGVmaW5lIE5WNDBfUEZCX1VOS184MDAJCQkJCTB4MDAxMDA4MDAKKworI2RlZmluZSBOVjA0X1BHUkFQSF9ERUJVR18wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMDgwCisjZGVmaW5lIE5WMDRfUEdSQVBIX0RFQlVHXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwODQKKyNkZWZpbmUgTlYwNF9QR1JBUEhfREVCVUdfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDA4OAorI2RlZmluZSBOVjA0X1BHUkFQSF9ERUJVR18zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMDhjCisjZGVmaW5lIE5WMTBfUEdSQVBIX0RFQlVHXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwOTAKKyNkZWZpbmUgTlYwM19QR1JBUEhfSU5UUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDEwMAorI2RlZmluZSBOVjAzX1BHUkFQSF9OU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMTA0CisjICAgIGRlZmluZSBOVjA0X1BHUkFQSF9OU1RBVFVTX1NUQVRFX0lOX1VTRSAgICAgICAgICAgICAgICAgICgxPDwxMSkKKyMgICAgZGVmaW5lIE5WMDRfUEdSQVBIX05TVEFUVVNfSU5WQUxJRF9TVEFURSAgICAgICAgICAgICAgICAgKDE8PDEyKQorIyAgICBkZWZpbmUgTlYwNF9QR1JBUEhfTlNUQVRVU19CQURfQVJHVU1FTlQgICAgICAgICAgICAgICAgICAoMTw8MTMpCisjICAgIGRlZmluZSBOVjA0X1BHUkFQSF9OU1RBVFVTX1BST1RFQ1RJT05fRkFVTFQgICAgICAgICAgICAgICgxPDwxNCkKKyMgICAgZGVmaW5lIE5WMTBfUEdSQVBIX05TVEFUVVNfU1RBVEVfSU5fVVNFICAgICAgICAgICAgICAgICAgKDE8PDIzKQorIyAgICBkZWZpbmUgTlYxMF9QR1JBUEhfTlNUQVRVU19JTlZBTElEX1NUQVRFICAgICAgICAgICAgICAgICAoMTw8MjQpCisjICAgIGRlZmluZSBOVjEwX1BHUkFQSF9OU1RBVFVTX0JBRF9BUkdVTUVOVCAgICAgICAgICAgICAgICAgICgxPDwyNSkKKyMgICAgZGVmaW5lIE5WMTBfUEdSQVBIX05TVEFUVVNfUFJPVEVDVElPTl9GQVVMVCAgICAgICAgICAgICAgKDE8PDI2KQorI2RlZmluZSBOVjAzX1BHUkFQSF9OU09VUkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMTA4CisjICAgIGRlZmluZSBOVjAzX1BHUkFQSF9OU09VUkNFX05PVElGSUNBVElPTiAgICAgICAgICAgICAgICAgICAoMTw8MCkKKyMgICAgZGVmaW5lIE5WMDNfUEdSQVBIX05TT1VSQ0VfREFUQV9FUlJPUiAgICAgICAgICAgICAgICAgICAgICgxPDwxKQorIyAgICBkZWZpbmUgTlYwM19QR1JBUEhfTlNPVVJDRV9QUk9URUNUSU9OX0VSUk9SICAgICAgICAgICAgICAgKDE8PDIpCisjICAgIGRlZmluZSBOVjAzX1BHUkFQSF9OU09VUkNFX1JBTkdFX0VYQ0VQVElPTiAgICAgICAgICAgICAgICAoMTw8MykKKyMgICAgZGVmaW5lIE5WMDNfUEdSQVBIX05TT1VSQ0VfTElNSVRfQ09MT1IgICAgICAgICAgICAgICAgICAgICgxPDw0KQorIyAgICBkZWZpbmUgTlYwM19QR1JBUEhfTlNPVVJDRV9MSU1JVF9aRVRBICAgICAgICAgICAgICAgICAgICAgKDE8PDUpCisjICAgIGRlZmluZSBOVjAzX1BHUkFQSF9OU09VUkNFX0lMTEVHQUxfTVRIRCAgICAgICAgICAgICAgICAgICAoMTw8NikKKyMgICAgZGVmaW5lIE5WMDNfUEdSQVBIX05TT1VSQ0VfRE1BX1JfUFJPVEVDVElPTiAgICAgICAgICAgICAgICgxPDw3KQorIyAgICBkZWZpbmUgTlYwM19QR1JBUEhfTlNPVVJDRV9ETUFfV19QUk9URUNUSU9OICAgICAgICAgICAgICAgKDE8PDgpCisjICAgIGRlZmluZSBOVjAzX1BHUkFQSF9OU09VUkNFX0ZPUk1BVF9FWENFUFRJT04gICAgICAgICAgICAgICAoMTw8OSkKKyMgICAgZGVmaW5lIE5WMDNfUEdSQVBIX05TT1VSQ0VfUEFUQ0hfRVhDRVBUSU9OICAgICAgICAgICAgICAgKDE8PDEwKQorIyAgICBkZWZpbmUgTlYwM19QR1JBUEhfTlNPVVJDRV9TVEFURV9JTlZBTElEICAgICAgICAgICAgICAgICAoMTw8MTEpCisjICAgIGRlZmluZSBOVjAzX1BHUkFQSF9OU09VUkNFX0RPVUJMRV9OT1RJRlkgICAgICAgICAgICAgICAgICgxPDwxMikKKyMgICAgZGVmaW5lIE5WMDNfUEdSQVBIX05TT1VSQ0VfTk9USUZZX0lOX1VTRSAgICAgICAgICAgICAgICAgKDE8PDEzKQorIyAgICBkZWZpbmUgTlYwM19QR1JBUEhfTlNPVVJDRV9NRVRIT0RfQ05UICAgICAgICAgICAgICAgICAgICAoMTw8MTQpCisjICAgIGRlZmluZSBOVjAzX1BHUkFQSF9OU09VUkNFX0JGUl9OT1RJRklDQVRJT04gICAgICAgICAgICAgICgxPDwxNSkKKyMgICAgZGVmaW5lIE5WMDNfUEdSQVBIX05TT1VSQ0VfRE1BX1ZUWF9QUk9URUNUSU9OICAgICAgICAgICAgKDE8PDE2KQorIyAgICBkZWZpbmUgTlYwM19QR1JBUEhfTlNPVVJDRV9ETUFfV0lEVEhfQSAgICAgICAgICAgICAgICAgICAoMTw8MTcpCisjICAgIGRlZmluZSBOVjAzX1BHUkFQSF9OU09VUkNFX0RNQV9XSURUSF9CICAgICAgICAgICAgICAgICAgICgxPDwxOCkKKyNkZWZpbmUgTlYwM19QR1JBUEhfSU5UUl9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDE0MAorI2RlZmluZSBOVjQwX1BHUkFQSF9JTlRSX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMTNDCisjICAgIGRlZmluZSBOVl9QR1JBUEhfSU5UUl9OT1RJRlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8MCkKKyMgICAgZGVmaW5lIE5WX1BHUkFQSF9JTlRSX01JU1NJTkdfSFcgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDw0KQorIyAgICBkZWZpbmUgTlZfUEdSQVBIX0lOVFJfQ09OVEVYVF9TV0lUQ0ggICAgICAgICAgICAgICAgICAgICAoMTw8MTIpCisjICAgIGRlZmluZSBOVl9QR1JBUEhfSU5UUl9CVUZGRVJfTk9USUZZICAgICAgICAgICAgICAgICAgICAgICgxPDwxNikKKyMgICAgZGVmaW5lIE5WX1BHUkFQSF9JTlRSX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDIwKQorI2RlZmluZSBOVjEwX1BHUkFQSF9DVFhfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMTQ0CisjZGVmaW5lIE5WMTBfUEdSQVBIX0NUWF9VU0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAxNDgKKyNkZWZpbmUgTlYxMF9QR1JBUEhfQ1RYX1NXSVRDSDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDE0QworI2RlZmluZSBOVjEwX1BHUkFQSF9DVFhfU1dJVENIMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMTUwCisjZGVmaW5lIE5WMTBfUEdSQVBIX0NUWF9TV0lUQ0gzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAxNTQKKyNkZWZpbmUgTlYxMF9QR1JBUEhfQ1RYX1NXSVRDSDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDE1OAorI2RlZmluZSBOVjEwX1BHUkFQSF9DVFhfU1dJVENINSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMTVDCisjZGVmaW5lIE5WMDRfUEdSQVBIX0NUWF9TV0lUQ0gxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAxNjAKKyNkZWZpbmUgTlYxMF9QR1JBUEhfQ1RYX0NBQ0hFMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDE2MAorI2RlZmluZSBOVjA0X1BHUkFQSF9DVFhfU1dJVENIMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMTY0CisjZGVmaW5lIE5WMDRfUEdSQVBIX0NUWF9TV0lUQ0gzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAxNjgKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQ1RYX1NXSVRDSDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDE2QworI2RlZmluZSBOVjA0X1BHUkFQSF9DVFhfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMTcwCisjZGVmaW5lIE5WMDRfUEdSQVBIX0NUWF9VU0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAxNzQKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQ1RYX0NBQ0hFMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDE4MAorI2RlZmluZSBOVjEwX1BHUkFQSF9DVFhfQ0FDSEUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMTgwCisjZGVmaW5lIE5WMDNfUEdSQVBIX0NUWF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAxOTAKKyNkZWZpbmUgTlYwM19QR1JBUEhfQ1RYX1VTRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDE5NAorI2RlZmluZSBOVjA0X1BHUkFQSF9DVFhfQ0FDSEUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMUEwCisjZGVmaW5lIE5WMTBfUEdSQVBIX0NUWF9DQUNIRTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAxQTAKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQ1RYX0NBQ0hFMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDFDMAorI2RlZmluZSBOVjEwX1BHUkFQSF9DVFhfQ0FDSEU0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMUMwCisjZGVmaW5lIE5WMDRfUEdSQVBIX0NUWF9DQUNIRTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAxRTAKKyNkZWZpbmUgTlYxMF9QR1JBUEhfQ1RYX0NBQ0hFNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDFFMAorI2RlZmluZSBOVjQwX1BHUkFQSF9DVFhDVExfMDMwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMzA0CisjZGVmaW5lIE5WNDBfUEdSQVBIX0NUWENUTF8wMzA0X1hGRVJfQ1RYICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTlY0MF9QR1JBUEhfQ1RYQ1RMX1VDT0RFX1NUQVQgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDMwOAorI2RlZmluZSBOVjQwX1BHUkFQSF9DVFhDVExfVUNPREVfU1RBVF9JUF9NQVNLICAgICAgICAgICAgICAweGZmMDAwMDAwCisjZGVmaW5lIE5WNDBfUEdSQVBIX0NUWENUTF9VQ09ERV9TVEFUX0lQX1NISUZUICAgICAgICAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgTlY0MF9QR1JBUEhfQ1RYQ1RMX1VDT0RFX1NUQVRfT1BfTUFTSyAgICAgICAgICAgICAgMHgwMGZmZmZmZgorI2RlZmluZSBOVjQwX1BHUkFQSF9DVFhDVExfMDMxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMzEwCisjZGVmaW5lIE5WNDBfUEdSQVBIX0NUWENUTF8wMzEwX1hGRVJfU0FWRSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgTlY0MF9QR1JBUEhfQ1RYQ1RMXzAzMTBfWEZFUl9MT0FEICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBOVjQwX1BHUkFQSF9DVFhDVExfMDMwQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMzBjCisjZGVmaW5lIE5WNDBfUEdSQVBIX0NUWENUTF9VQ09ERV9JTkRFWCAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAzMjQKKyNkZWZpbmUgTlY0MF9QR1JBUEhfQ1RYQ1RMX1VDT0RFX0RBVEEgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDMyOAorI2RlZmluZSBOVjQwX1BHUkFQSF9DVFhDVExfQ1VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMzJjCisjZGVmaW5lIE5WNDBfUEdSQVBIX0NUWENUTF9DVVJfTE9BREVEICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgTlY0MF9QR1JBUEhfQ1RYQ1RMX0NVUl9JTlNUQU5DRSAgICAgICAgICAgICAgICAgICAgMHgwMDBGRkZGRgorI2RlZmluZSBOVjQwX1BHUkFQSF9DVFhDVExfTkVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMzMwCisjZGVmaW5lIE5WNDBfUEdSQVBIX0NUWENUTF9ORVhUX0lOU1RBTkNFICAgICAgICAgICAgICAgICAgIDB4MDAwZmZmZmYKKyNkZWZpbmUgTlY1MF9QR1JBUEhfQ1RYQ1RMX0NVUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDMyYworI2RlZmluZSBOVjUwX1BHUkFQSF9DVFhDVExfQ1VSX0xPQURFRCAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIE5WNTBfUEdSQVBIX0NUWENUTF9DVVJfSU5TVEFOQ0UgICAgICAgICAgICAgICAgICAgIDB4MDBmZmZmZmYKKyNkZWZpbmUgTlY1MF9QR1JBUEhfQ1RYQ1RMX05FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDMzMAorI2RlZmluZSBOVjUwX1BHUkFQSF9DVFhDVExfTkVYVF9JTlNUQU5DRSAgICAgICAgICAgICAgICAgICAweDAwZmZmZmZmCisjZGVmaW5lIE5WMDNfUEdSQVBIX0FCU19YX1JBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA0MDAKKyNkZWZpbmUgTlYwM19QR1JBUEhfQUJTX1lfUkFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDQ4MAorI2RlZmluZSBOVjAzX1BHUkFQSF9YX01JU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNTAwCisjZGVmaW5lIE5WMDNfUEdSQVBIX1lfTUlTQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA1MDQKKyNkZWZpbmUgTlYwNF9QR1JBUEhfVkFMSUQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDUwOAorI2RlZmluZSBOVjA0X1BHUkFQSF9TT1VSQ0VfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNTBDCisjZGVmaW5lIE5WMDRfUEdSQVBIX01JU0MyNF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA1MTAKKyNkZWZpbmUgTlYwM19QR1JBUEhfWFlfTE9HSUNfTUlTQzAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDUxNAorI2RlZmluZSBOVjAzX1BHUkFQSF9YWV9MT0dJQ19NSVNDMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNTE4CisjZGVmaW5lIE5WMDNfUEdSQVBIX1hZX0xPR0lDX01JU0MyICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA1MUMKKyNkZWZpbmUgTlYwM19QR1JBUEhfWFlfTE9HSUNfTUlTQzMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDUyMAorI2RlZmluZSBOVjAzX1BHUkFQSF9DTElQWF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNTI0CisjZGVmaW5lIE5WMDNfUEdSQVBIX0NMSVBYXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA1MjgKKyNkZWZpbmUgTlYwM19QR1JBUEhfQ0xJUFlfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDUyQworI2RlZmluZSBOVjAzX1BHUkFQSF9DTElQWV8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNTMwCisjZGVmaW5lIE5WMDNfUEdSQVBIX0FCU19JQ0xJUF9YTUFYICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA1MzQKKyNkZWZpbmUgTlYwM19QR1JBUEhfQUJTX0lDTElQX1lNQVggICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDUzOAorI2RlZmluZSBOVjAzX1BHUkFQSF9BQlNfVUNMSVBfWE1JTiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNTNDCisjZGVmaW5lIE5WMDNfUEdSQVBIX0FCU19VQ0xJUF9ZTUlOICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA1NDAKKyNkZWZpbmUgTlYwM19QR1JBUEhfQUJTX1VDTElQX1hNQVggICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDU0NAorI2RlZmluZSBOVjAzX1BHUkFQSF9BQlNfVUNMSVBfWU1BWCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNTQ4CisjZGVmaW5lIE5WMDNfUEdSQVBIX0FCU19VQ0xJUEFfWE1JTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA1NjAKKyNkZWZpbmUgTlYwM19QR1JBUEhfQUJTX1VDTElQQV9ZTUlOICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDU2NAorI2RlZmluZSBOVjAzX1BHUkFQSF9BQlNfVUNMSVBBX1hNQVggICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNTY4CisjZGVmaW5lIE5WMDNfUEdSQVBIX0FCU19VQ0xJUEFfWU1BWCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA1NkMKKyNkZWZpbmUgTlYwNF9QR1JBUEhfTUlTQzI0XzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDU3MAorI2RlZmluZSBOVjA0X1BHUkFQSF9NSVNDMjRfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNTc0CisjZGVmaW5lIE5WMDRfUEdSQVBIX1ZBTElEMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA1NzgKKyNkZWZpbmUgTlYwNF9QR1JBUEhfUEFTU1RIUlVfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDU3QworI2RlZmluZSBOVjA0X1BHUkFQSF9QQVNTVEhSVV8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNTgwCisjZGVmaW5lIE5WMDRfUEdSQVBIX1BBU1NUSFJVXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA1ODQKKyNkZWZpbmUgTlYxMF9QR1JBUEhfRElNWF9URVhUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDU4OAorI2RlZmluZSBOVjEwX1BHUkFQSF9XRElNWF9URVhUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNThDCisjZGVmaW5lIE5WMDRfUEdSQVBIX0NPTUJJTkVfMF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA1OTAKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQ09NQklORV8wX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDU5NAorI2RlZmluZSBOVjA0X1BHUkFQSF9DT01CSU5FXzFfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNTk4CisjZGVmaW5lIE5WMDRfUEdSQVBIX0NPTUJJTkVfMV9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA1OUMKKyNkZWZpbmUgTlYwNF9QR1JBUEhfRk9STUFUXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDVBOAorI2RlZmluZSBOVjA0X1BHUkFQSF9GT1JNQVRfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNUFDCisjZGVmaW5lIE5WMDRfUEdSQVBIX0ZJTFRFUl8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA1QjAKKyNkZWZpbmUgTlYwNF9QR1JBUEhfRklMVEVSXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDVCNAorI2RlZmluZSBOVjAzX1BHUkFQSF9NT05PX0NPTE9SMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNjAwCisjZGVmaW5lIE5WMDRfUEdSQVBIX1JPUDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA2MDQKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQkVUQV9BTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDYwOAorI2RlZmluZSBOVjA0X1BHUkFQSF9CRVRBX1BSRU1VTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNjBDCisjZGVmaW5lIE5WMDRfUEdSQVBIX0xJTUlUX1ZJT0xfUElYICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA2MTAKKyNkZWZpbmUgTlYwNF9QR1JBUEhfRk9STUFUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDYxOAorI2RlZmluZSBOVjEwX1BHUkFQSF9ERUJVR18yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNjIwCisjZGVmaW5lIE5WMDRfUEdSQVBIX0JPRkZTRVQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA2NDAKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQk9GRlNFVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDY0NAorI2RlZmluZSBOVjA0X1BHUkFQSF9CT0ZGU0VUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNjQ4CisjZGVmaW5lIE5WMDRfUEdSQVBIX0JPRkZTRVQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA2NEMKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQk9GRlNFVDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDY1MAorI2RlZmluZSBOVjA0X1BHUkFQSF9CT0ZGU0VUNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNjU0CisjZGVmaW5lIE5WMDRfUEdSQVBIX0JCQVNFMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA2NTgKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQkJBU0UxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDY1QworI2RlZmluZSBOVjA0X1BHUkFQSF9CQkFTRTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNjYwCisjZGVmaW5lIE5WMDRfUEdSQVBIX0JCQVNFMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA2NjQKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQkJBU0U0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDY2OAorI2RlZmluZSBOVjA0X1BHUkFQSF9CQkFTRTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNjZDCisjZGVmaW5lIE5WMDRfUEdSQVBIX0JQSVRDSDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA2NzAKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQlBJVENIMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDY3NAorI2RlZmluZSBOVjA0X1BHUkFQSF9CUElUQ0gyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNjc4CisjZGVmaW5lIE5WMDRfUEdSQVBIX0JQSVRDSDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA2N0MKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQlBJVENINCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDY4MAorI2RlZmluZSBOVjA0X1BHUkFQSF9CTElNSVQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNjg0CisjZGVmaW5lIE5WMDRfUEdSQVBIX0JMSU1JVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA2ODgKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQkxJTUlUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDY4QworI2RlZmluZSBOVjA0X1BHUkFQSF9CTElNSVQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNjkwCisjZGVmaW5lIE5WMDRfUEdSQVBIX0JMSU1JVDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA2OTQKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQkxJTUlUNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDY5OAorI2RlZmluZSBOVjA0X1BHUkFQSF9CU1dJWlpMRTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNjlDCisjZGVmaW5lIE5WMDRfUEdSQVBIX0JTV0laWkxFNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA2QTAKKyNkZWZpbmUgTlYwM19QR1JBUEhfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDZCMAorI2RlZmluZSBOVjA0X1BHUkFQSF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNzAwCisjZGVmaW5lIE5WMDRfUEdSQVBIX1RSQVBQRURfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA3MDQKKyNkZWZpbmUgTlYwNF9QR1JBUEhfVFJBUFBFRF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDcwOAorI2RlZmluZSBOVjA0X1BHUkFQSF9TVVJGQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNzBDCisjZGVmaW5lIE5WMTBfUEdSQVBIX1RSQVBQRURfREFUQV9ISUdIICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA3MEMKKyNkZWZpbmUgTlYwNF9QR1JBUEhfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDcxMAorI2RlZmluZSBOVjEwX1BHUkFQSF9TVVJGQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNzEwCisjZGVmaW5lIE5WMDRfUEdSQVBIX05PVElGWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA3MTQKKyNkZWZpbmUgTlYxMF9QR1JBUEhfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDcxNAorI2RlZmluZSBOVjEwX1BHUkFQSF9OT1RJRlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNzE4CisKKyNkZWZpbmUgTlYwNF9QR1JBUEhfRklGTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDcyMAorCisjZGVmaW5lIE5WMDRfUEdSQVBIX0JQSVhFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA3MjQKKyNkZWZpbmUgTlYxMF9QR1JBUEhfUkRJX0lOREVYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDc1MAorI2RlZmluZSBOVjA0X1BHUkFQSF9GRklOVEZDX1NUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNzU0CisjZGVmaW5lIE5WMTBfUEdSQVBIX1JESV9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA3NTQKKyNkZWZpbmUgTlYwNF9QR1JBUEhfRE1BX1BJVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDc2MAorI2RlZmluZSBOVjEwX1BHUkFQSF9GRklOVEZDX1NUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNzY0CisjZGVmaW5lIE5WMDRfUEdSQVBIX0RWRF9DT0xPUkZNVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA3NjQKKyNkZWZpbmUgTlYwNF9QR1JBUEhfU0NBTEVEX0ZPUk1BVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDc2OAorI2RlZmluZSBOVjEwX1BHUkFQSF9ETUFfUElUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNzcwCisjZGVmaW5lIE5WMTBfUEdSQVBIX0RWRF9DT0xPUkZNVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA3NzQKKyNkZWZpbmUgTlYxMF9QR1JBUEhfU0NBTEVEX0ZPUk1BVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDc3OAorI2RlZmluZSBOVjIwX1BHUkFQSF9DSEFOTkVMX0NUWF9UQUJMRSAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNzgwCisjZGVmaW5lIE5WMjBfUEdSQVBIX0NIQU5ORUxfQ1RYX1BPSU5URVIgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA3ODQKKyNkZWZpbmUgTlYyMF9QR1JBUEhfQ0hBTk5FTF9DVFhfWEZFUiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDc4OAorI2RlZmluZSBOVjIwX1BHUkFQSF9DSEFOTkVMX0NUWF9YRkVSX0xPQUQgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIE5WMjBfUEdSQVBIX0NIQU5ORUxfQ1RYX1hGRVJfU0FWRSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgTlYwNF9QR1JBUEhfUEFUVF9DT0xPUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDgwMAorI2RlZmluZSBOVjA0X1BHUkFQSF9QQVRUX0NPTE9SMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwODA0CisjZGVmaW5lIE5WMDRfUEdSQVBIX1BBVFRFUk4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA4MDgKKyNkZWZpbmUgTlYwNF9QR1JBUEhfUEFUVEVSTl9TSEFQRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDgxMAorI2RlZmluZSBOVjA0X1BHUkFQSF9DSFJPTUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwODE0CisjZGVmaW5lIE5WMDRfUEdSQVBIX0NPTlRST0wwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA4MTgKKyNkZWZpbmUgTlYwNF9QR1JBUEhfQ09OVFJPTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDgxQworI2RlZmluZSBOVjA0X1BHUkFQSF9DT05UUk9MMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwODIwCisjZGVmaW5lIE5WMDRfUEdSQVBIX0JMRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA4MjQKKyNkZWZpbmUgTlYwNF9QR1JBUEhfU1RPUkVEX0ZNVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDgzMAorI2RlZmluZSBOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwOTAwCisjZGVmaW5lIE5WNDBfUEdSQVBIX1RJTEUwKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwNDAwOTAwICsgKGkqMTYpKQorI2RlZmluZSBOVjQwX1BHUkFQSF9UTElNSVQwKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDQwMDkwNCArIChpKjE2KSkKKyNkZWZpbmUgTlY0MF9QR1JBUEhfVFNJWkUwKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDA0MDA5MDggKyAoaSoxNikpCisjZGVmaW5lIE5WNDBfUEdSQVBIX1RTVEFUVVMwKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwNDAwOTBDICsgKGkqMTYpKQorI2RlZmluZSBOVjEwX1BHUkFQSF9USUxFKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDQwMEIwMCArIChpKjE2KSkKKyNkZWZpbmUgTlYxMF9QR1JBUEhfVExJTUlUKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDA0MDBCMDQgKyAoaSoxNikpCisjZGVmaW5lIE5WMTBfUEdSQVBIX1RTSVpFKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwNDAwQjA4ICsgKGkqMTYpKQorI2RlZmluZSBOVjEwX1BHUkFQSF9UU1RBVFVTKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDQwMEIwQyArIChpKjE2KSkKKyNkZWZpbmUgTlYwNF9QR1JBUEhfVV9SQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMEQwMAorI2RlZmluZSBOVjQ3X1BHUkFQSF9USUxFMChpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDQwMEQwMCArIChpKjE2KSkKKyNkZWZpbmUgTlY0N19QR1JBUEhfVExJTUlUMChpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDA0MDBEMDQgKyAoaSoxNikpCisjZGVmaW5lIE5WNDdfUEdSQVBIX1RTSVpFMChpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwNDAwRDA4ICsgKGkqMTYpKQorI2RlZmluZSBOVjQ3X1BHUkFQSF9UU1RBVFVTMChpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDQwMEQwQyArIChpKjE2KSkKKyNkZWZpbmUgTlYwNF9QR1JBUEhfVl9SQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMEQ0MAorI2RlZmluZSBOVjA0X1BHUkFQSF9XX1JBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwRDgwCisjZGVmaW5lIE5WMTBfUEdSQVBIX0NPTUJJTkVSMF9JTl9BTFBIQSAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDBFNDAKKyNkZWZpbmUgTlYxMF9QR1JBUEhfQ09NQklORVIxX0lOX0FMUEhBICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMEU0NAorI2RlZmluZSBOVjEwX1BHUkFQSF9DT01CSU5FUjBfSU5fUkdCICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwRTQ4CisjZGVmaW5lIE5WMTBfUEdSQVBIX0NPTUJJTkVSMV9JTl9SR0IgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDBFNEMKKyNkZWZpbmUgTlYxMF9QR1JBUEhfQ09NQklORVJfQ09MT1IwICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMEU1MAorI2RlZmluZSBOVjEwX1BHUkFQSF9DT01CSU5FUl9DT0xPUjEgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwRTU0CisjZGVmaW5lIE5WMTBfUEdSQVBIX0NPTUJJTkVSMF9PVVRfQUxQSEEgICAgICAgICAgICAgICAgICAgIDB4MDA0MDBFNTgKKyNkZWZpbmUgTlYxMF9QR1JBUEhfQ09NQklORVIxX09VVF9BTFBIQSAgICAgICAgICAgICAgICAgICAgMHgwMDQwMEU1QworI2RlZmluZSBOVjEwX1BHUkFQSF9DT01CSU5FUjBfT1VUX1JHQiAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwRTYwCisjZGVmaW5lIE5WMTBfUEdSQVBIX0NPTUJJTkVSMV9PVVRfUkdCICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDBFNjQKKyNkZWZpbmUgTlYxMF9QR1JBUEhfQ09NQklORVJfRklOQUwwICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMEU2OAorI2RlZmluZSBOVjEwX1BHUkFQSF9DT01CSU5FUl9GSU5BTDEgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwRTZDCisjZGVmaW5lIE5WMTBfUEdSQVBIX1dJTkRPV0NMSVBfSE9SSVpPTlRBTCAgICAgICAgICAgICAgICAgIDB4MDA0MDBGMDAKKyNkZWZpbmUgTlYxMF9QR1JBUEhfV0lORE9XQ0xJUF9WRVJUSUNBTCAgICAgICAgICAgICAgICAgICAgMHgwMDQwMEYyMAorI2RlZmluZSBOVjEwX1BHUkFQSF9YRk1PREUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwRjQwCisjZGVmaW5lIE5WMTBfUEdSQVBIX1hGTU9ERTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDBGNDQKKyNkZWZpbmUgTlYxMF9QR1JBUEhfR0xPQkFMU1RBVEUwICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMEY0OAorI2RlZmluZSBOVjEwX1BHUkFQSF9HTE9CQUxTVEFURTEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwRjRDCisjZGVmaW5lIE5WMTBfUEdSQVBIX1BJUEVfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDBGNTAKKyNkZWZpbmUgTlYxMF9QR1JBUEhfUElQRV9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMEY1NAorI2RlZmluZSBOVjA0X1BHUkFQSF9ETUFfU1RBUlRfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAxMDAwCisjZGVmaW5lIE5WMDRfUEdSQVBIX0RNQV9TVEFSVF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDEwMDQKKyNkZWZpbmUgTlYwNF9QR1JBUEhfRE1BX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMTAwOAorI2RlZmluZSBOVjA0X1BHUkFQSF9ETUFfTUlTQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAxMDBDCisjZGVmaW5lIE5WMDRfUEdSQVBIX0RNQV9EQVRBXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDEwMjAKKyNkZWZpbmUgTlYwNF9QR1JBUEhfRE1BX0RBVEFfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMTAyNAorI2RlZmluZSBOVjA0X1BHUkFQSF9ETUFfUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAxMDMwCisjZGVmaW5lIE5WMDRfUEdSQVBIX0RNQV9BX1hMQVRFX0lOU1QgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDEwNDAKKyNkZWZpbmUgTlYwNF9QR1JBUEhfRE1BX0FfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMTA0NAorI2RlZmluZSBOVjA0X1BHUkFQSF9ETUFfQV9MSU1JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAxMDQ4CisjZGVmaW5lIE5WMDRfUEdSQVBIX0RNQV9BX1RMQl9QVEUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDEwNEMKKyNkZWZpbmUgTlYwNF9QR1JBUEhfRE1BX0FfVExCX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMTA1MAorI2RlZmluZSBOVjA0X1BHUkFQSF9ETUFfQV9BREpfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAxMDU0CisjZGVmaW5lIE5WMDRfUEdSQVBIX0RNQV9BX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDEwNTgKKyNkZWZpbmUgTlYwNF9QR1JBUEhfRE1BX0FfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMTA1QworI2RlZmluZSBOVjA0X1BHUkFQSF9ETUFfQV9ZX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAxMDYwCisjZGVmaW5lIE5WMDRfUEdSQVBIX0RNQV9CX1hMQVRFX0lOU1QgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDEwODAKKyNkZWZpbmUgTlYwNF9QR1JBUEhfRE1BX0JfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMTA4NAorI2RlZmluZSBOVjA0X1BHUkFQSF9ETUFfQl9MSU1JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAxMDg4CisjZGVmaW5lIE5WMDRfUEdSQVBIX0RNQV9CX1RMQl9QVEUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDEwOEMKKyNkZWZpbmUgTlYwNF9QR1JBUEhfRE1BX0JfVExCX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMTA5MAorI2RlZmluZSBOVjA0X1BHUkFQSF9ETUFfQl9BREpfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAxMDk0CisjZGVmaW5lIE5WMDRfUEdSQVBIX0RNQV9CX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDEwOTgKKyNkZWZpbmUgTlYwNF9QR1JBUEhfRE1BX0JfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMTA5QworI2RlZmluZSBOVjA0X1BHUkFQSF9ETUFfQl9ZX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAxMEEwCisjZGVmaW5lIE5WNDBfUEdSQVBIX1RJTEUxKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwNDA2OTAwICsgKGkqMTYpKQorI2RlZmluZSBOVjQwX1BHUkFQSF9UTElNSVQxKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDQwNjkwNCArIChpKjE2KSkKKyNkZWZpbmUgTlY0MF9QR1JBUEhfVFNJWkUxKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDA0MDY5MDggKyAoaSoxNikpCisjZGVmaW5lIE5WNDBfUEdSQVBIX1RTVEFUVVMxKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwNDA2OTBDICsgKGkqMTYpKQorCisKKy8qIEl0J3MgYSBndWVzcyB0aGF0IHRoaXMgd29ya3Mgb24gTlYwMy4gQ29uZmlybWVkIG9uIE5WMDQsIHRob3VnaCAqLworI2RlZmluZSBOVjA0X1BGSUZPX0RFTEFZXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDQwCisjZGVmaW5lIE5WMDRfUEZJRk9fRE1BX1RJTUVTTElDRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwNDQKKyNkZWZpbmUgTlYwNF9QRklGT19ORVhUX0NIQU5ORUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjA1MAorI2RlZmluZSBOVjAzX1BGSUZPX0lOVFJfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyMTAwCisjZGVmaW5lIE5WMDNfUEZJRk9fSU5UUl9FTl8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIxNDAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0lOVFJfQ0FDSEVfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDwwKQorIyAgICBkZWZpbmUgTlZfUEZJRk9fSU5UUl9SVU5PVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDQpCisjICAgIGRlZmluZSBOVl9QRklGT19JTlRSX1JVTk9VVF9PVkVSRkxPVyAgICAgICAgICAgICAgICAgICAgICAoMTw8OCkKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0lOVFJfRE1BX1BVU0hFUiAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDEyKQorIyAgICBkZWZpbmUgTlZfUEZJRk9fSU5UUl9ETUFfUFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8MTYpCisjICAgIGRlZmluZSBOVl9QRklGT19JTlRSX1NFTUFQSE9SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDwyMCkKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0lOVFJfQUNRVUlSRV9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgKDE8PDI0KQorI2RlZmluZSBOVjAzX1BGSUZPX1JBTUhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyMjEwCisjZGVmaW5lIE5WMDNfUEZJRk9fUkFNRkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIyMTQKKyNkZWZpbmUgTlYwM19QRklGT19SQU1STyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjIxOAorI2RlZmluZSBOVjQwX1BGSUZPX1JBTUZDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyMjIwCisjZGVmaW5lIE5WMDNfUEZJRk9fQ0FDSEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDI1MDAKKyNkZWZpbmUgTlYwNF9QRklGT19NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjUwNAorI2RlZmluZSBOVjA0X1BGSUZPX0RNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyNTA4CisjZGVmaW5lIE5WMDRfUEZJRk9fU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDI1MGMKKyNkZWZpbmUgTlY1MF9QRklGT19DVFhfVEFCTEUoYykgICAgICAgICAgICAgICAgICAgICAgICAoMHgyNjAwKyhjKSo0KQorI2RlZmluZSBOVjUwX1BGSUZPX0NUWF9UQUJMRV9fU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI4CisjZGVmaW5lIE5WNTBfUEZJRk9fQ1RYX1RBQkxFX0NIQU5ORUxfRU5BQkxFRCAgICAgICAgICAgICAgICAgICgxPDwzMSkKKyNkZWZpbmUgTlY1MF9QRklGT19DVFhfVEFCTEVfVU5LMzBfQkFEICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDMwKQorI2RlZmluZSBOVjUwX1BGSUZPX0NUWF9UQUJMRV9JTlNUQU5DRV9NQVNLX0c4MCAgICAgICAgICAgICAweDBGRkZGRkZGCisjZGVmaW5lIE5WNTBfUEZJRk9fQ1RYX1RBQkxFX0lOU1RBTkNFX01BU0tfRzg0ICAgICAgICAgICAgIDB4MDBGRkZGRkYKKyNkZWZpbmUgTlYwM19QRklGT19DQUNIRTBfUFVTSDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMzAwMAorI2RlZmluZSBOVjAzX1BGSUZPX0NBQ0hFMF9QVUxMMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAzMDQwCisjZGVmaW5lIE5WMDRfUEZJRk9fQ0FDSEUwX1BVTEwwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDMwNTAKKyNkZWZpbmUgTlYwNF9QRklGT19DQUNIRTBfUFVMTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMzA1NAorI2RlZmluZSBOVjAzX1BGSUZPX0NBQ0hFMV9QVVNIMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAzMjAwCisjZGVmaW5lIE5WMDNfUEZJRk9fQ0FDSEUxX1BVU0gxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDMyMDQKKyNkZWZpbmUgTlYwM19QRklGT19DQUNIRTFfUFVTSDFfRE1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDw4KQorI2RlZmluZSBOVjQwX1BGSUZPX0NBQ0hFMV9QVVNIMV9ETUEgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8MTYpCisjZGVmaW5lIE5WMDNfUEZJRk9fQ0FDSEUxX1BVU0gxX0NISURfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGYKKyNkZWZpbmUgTlYxMF9QRklGT19DQUNIRTFfUFVTSDFfQ0hJRF9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxZgorI2RlZmluZSBOVjUwX1BGSUZPX0NBQ0hFMV9QVVNIMV9DSElEX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDAwMDdmCisjZGVmaW5lIE5WMDNfUEZJRk9fQ0FDSEUxX1BVVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDMyMTAKKyNkZWZpbmUgTlYwNF9QRklGT19DQUNIRTFfRE1BX1BVU0ggICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMzIyMAorI2RlZmluZSBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0ggICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAzMjI0CisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1RSSUdfOF9CWVRFUyAgICAgICAgIDB4MDAwMDAwMDAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfVFJJR18xNl9CWVRFUyAgICAgICAgMHgwMDAwMDAwOAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9UUklHXzI0X0JZVEVTICAgICAgICAweDAwMDAwMDEwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1RSSUdfMzJfQllURVMgICAgICAgIDB4MDAwMDAwMTgKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfVFJJR180MF9CWVRFUyAgICAgICAgMHgwMDAwMDAyMAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9UUklHXzQ4X0JZVEVTICAgICAgICAweDAwMDAwMDI4CisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1RSSUdfNTZfQllURVMgICAgICAgIDB4MDAwMDAwMzAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfVFJJR182NF9CWVRFUyAgICAgICAgMHgwMDAwMDAzOAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9UUklHXzcyX0JZVEVTICAgICAgICAweDAwMDAwMDQwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1RSSUdfODBfQllURVMgICAgICAgIDB4MDAwMDAwNDgKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfVFJJR184OF9CWVRFUyAgICAgICAgMHgwMDAwMDA1MAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9UUklHXzk2X0JZVEVTICAgICAgICAweDAwMDAwMDU4CisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1RSSUdfMTA0X0JZVEVTICAgICAgIDB4MDAwMDAwNjAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfVFJJR18xMTJfQllURVMgICAgICAgMHgwMDAwMDA2OAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9UUklHXzEyMF9CWVRFUyAgICAgICAweDAwMDAwMDcwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1RSSUdfMTI4X0JZVEVTICAgICAgIDB4MDAwMDAwNzgKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfVFJJR18xMzZfQllURVMgICAgICAgMHgwMDAwMDA4MAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9UUklHXzE0NF9CWVRFUyAgICAgICAweDAwMDAwMDg4CisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1RSSUdfMTUyX0JZVEVTICAgICAgIDB4MDAwMDAwOTAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfVFJJR18xNjBfQllURVMgICAgICAgMHgwMDAwMDA5OAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9UUklHXzE2OF9CWVRFUyAgICAgICAweDAwMDAwMEEwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1RSSUdfMTc2X0JZVEVTICAgICAgIDB4MDAwMDAwQTgKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfVFJJR18xODRfQllURVMgICAgICAgMHgwMDAwMDBCMAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9UUklHXzE5Ml9CWVRFUyAgICAgICAweDAwMDAwMEI4CisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1RSSUdfMjAwX0JZVEVTICAgICAgIDB4MDAwMDAwQzAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfVFJJR18yMDhfQllURVMgICAgICAgMHgwMDAwMDBDOAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9UUklHXzIxNl9CWVRFUyAgICAgICAweDAwMDAwMEQwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1RSSUdfMjI0X0JZVEVTICAgICAgIDB4MDAwMDAwRDgKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfVFJJR18yMzJfQllURVMgICAgICAgMHgwMDAwMDBFMAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9UUklHXzI0MF9CWVRFUyAgICAgICAweDAwMDAwMEU4CisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1RSSUdfMjQ4X0JZVEVTICAgICAgIDB4MDAwMDAwRjAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfVFJJR18yNTZfQllURVMgICAgICAgMHgwMDAwMDBGOAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9TSVpFICAgICAgICAgICAgICAgICAweDAwMDBFMDAwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1NJWkVfMzJfQllURVMgICAgICAgIDB4MDAwMDAwMDAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfU0laRV82NF9CWVRFUyAgICAgICAgMHgwMDAwMjAwMAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9TSVpFXzk2X0JZVEVTICAgICAgICAweDAwMDA0MDAwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1NJWkVfMTI4X0JZVEVTICAgICAgIDB4MDAwMDYwMDAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfU0laRV8xNjBfQllURVMgICAgICAgMHgwMDAwODAwMAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9TSVpFXzE5Ml9CWVRFUyAgICAgICAweDAwMDBBMDAwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1NJWkVfMjI0X0JZVEVTICAgICAgIDB4MDAwMEMwMDAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfU0laRV8yNTZfQllURVMgICAgICAgMHgwMDAwRTAwMAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9NQVhfUkVRUyAgICAgICAgICAgICAweDAwMUYwMDAwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX01BWF9SRVFTXzAgICAgICAgICAgIDB4MDAwMDAwMDAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfTUFYX1JFUVNfMSAgICAgICAgICAgMHgwMDAxMDAwMAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9NQVhfUkVRU18yICAgICAgICAgICAweDAwMDIwMDAwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX01BWF9SRVFTXzMgICAgICAgICAgIDB4MDAwMzAwMDAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfTUFYX1JFUVNfNCAgICAgICAgICAgMHgwMDA0MDAwMAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9NQVhfUkVRU181ICAgICAgICAgICAweDAwMDUwMDAwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX01BWF9SRVFTXzYgICAgICAgICAgIDB4MDAwNjAwMDAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfTUFYX1JFUVNfNyAgICAgICAgICAgMHgwMDA3MDAwMAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9NQVhfUkVRU184ICAgICAgICAgICAweDAwMDgwMDAwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX01BWF9SRVFTXzkgICAgICAgICAgIDB4MDAwOTAwMDAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfTUFYX1JFUVNfMTAgICAgICAgICAgMHgwMDBBMDAwMAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9NQVhfUkVRU18xMSAgICAgICAgICAweDAwMEIwMDAwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX01BWF9SRVFTXzEyICAgICAgICAgIDB4MDAwQzAwMDAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfTUFYX1JFUVNfMTMgICAgICAgICAgMHgwMDBEMDAwMAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9NQVhfUkVRU18xNCAgICAgICAgICAweDAwMEUwMDAwCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX01BWF9SRVFTXzE1ICAgICAgICAgIDB4MDAwRjAwMDAKKyMgICAgZGVmaW5lIE5WX1BGSUZPX0NBQ0hFMV9FTkRJQU4gICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorIyAgICBkZWZpbmUgTlZfUEZJRk9fQ0FDSEUxX0xJVFRMRV9FTkRJQU4gICAgICAgICAgICAgICAgICAweDdGRkZGRkZGCisjICAgIGRlZmluZSBOVl9QRklGT19DQUNIRTFfQklHX0VORElBTiAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgTlYwNF9QRklGT19DQUNIRTFfRE1BX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMzIyOAorI2RlZmluZSBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfSU5TVEFOQ0UgICAgICAgICAgICAgICAgICAgICAweDAwMDAzMjJjCisjZGVmaW5lIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDMyMzAKKyNkZWZpbmUgTlYwNF9QRklGT19DQUNIRTFfRE1BX1BVVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMzI0MAorI2RlZmluZSBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfR0VUICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAzMjQ0CisjZGVmaW5lIE5WMTBfUEZJRk9fQ0FDSEUxX1JFRl9DTlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDMyNDgKKyNkZWZpbmUgTlYxMF9QRklGT19DQUNIRTFfRE1BX1NVQlJPVVRJTkUgICAgICAgICAgICAgICAgICAgMHgwMDAwMzI0QworI2RlZmluZSBOVjAzX1BGSUZPX0NBQ0hFMV9QVUxMMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAzMjQwCisjZGVmaW5lIE5WMDRfUEZJRk9fQ0FDSEUxX1BVTEwwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDMyNTAKKyNkZWZpbmUgTlYwM19QRklGT19DQUNIRTFfUFVMTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMzI1MAorI2RlZmluZSBOVjA0X1BGSUZPX0NBQ0hFMV9QVUxMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAzMjU0CisjZGVmaW5lIE5WMDRfUEZJRk9fQ0FDSEUxX0hBU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDMyNTgKKyNkZWZpbmUgTlYxMF9QRklGT19DQUNIRTFfQUNRVUlSRV9USU1FT1VUICAgICAgICAgICAgICAgICAgMHgwMDAwMzI2MAorI2RlZmluZSBOVjEwX1BGSUZPX0NBQ0hFMV9BQ1FVSVJFX1RJTUVTVEFNUCAgICAgICAgICAgICAgICAweDAwMDAzMjY0CisjZGVmaW5lIE5WMTBfUEZJRk9fQ0FDSEUxX0FDUVVJUkVfVkFMVUUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDMyNjgKKyNkZWZpbmUgTlYxMF9QRklGT19DQUNIRTFfU0VNQVBIT1JFICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMzI2QworI2RlZmluZSBOVjAzX1BGSUZPX0NBQ0hFMV9HRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAzMjcwCisjZGVmaW5lIE5WMDRfUEZJRk9fQ0FDSEUxX0VOR0lORSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDMyODAKKyNkZWZpbmUgTlYwNF9QRklGT19DQUNIRTFfRE1BX0RDT1VOVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMzJBMAorI2RlZmluZSBOVjQwX1BGSUZPX0dSQ1RYX0lOU1RBTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAzMkUwCisjZGVmaW5lIE5WNDBfUEZJRk9fVU5LMzJFNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDMyRTQKKyNkZWZpbmUgTlYwNF9QRklGT19DQUNIRTFfTUVUSE9EKGkpICAgICAgICAgICAgICAgICgweDAwMDAzODAwKyhpKjgpKQorI2RlZmluZSBOVjA0X1BGSUZPX0NBQ0hFMV9EQVRBKGkpICAgICAgICAgICAgICAgICAgKDB4MDAwMDM4MDQrKGkqOCkpCisjZGVmaW5lIE5WNDBfUEZJRk9fQ0FDSEUxX01FVEhPRChpKSAgICAgICAgICAgICAgICAoMHgwMDA5MDAwMCsoaSo4KSkKKyNkZWZpbmUgTlY0MF9QRklGT19DQUNIRTFfREFUQShpKSAgICAgICAgICAgICAgICAgICgweDAwMDkwMDA0KyhpKjgpKQorCisjZGVmaW5lIE5WX0NSVEMwX0lOVFNUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MDAxMDAKKyNkZWZpbmUgTlZfQ1JUQzBfSU5URU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYwMDE0MAorI2RlZmluZSBOVl9DUlRDMV9JTlRTVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjAyMTAwCisjZGVmaW5lIE5WX0NSVEMxX0lOVEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MDIxNDAKKyMgICAgZGVmaW5lIE5WX0NSVENfSU5UUl9WQkxBTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDwwKQorCisjZGVmaW5lIE5WMDRfUFJBTUlOCQkJCQkJMHgwMDcwMDAwMAorCisvKiBGaWZvIGNvbW1hbmRzLiBUaGVzZSBhcmUgbm90IHJlZ3MsIG5laXRoZXIgbWFza3MgKi8KKyNkZWZpbmUgTlYwM19GSUZPX0NNRF9KVU1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBOVjAzX0ZJRk9fQ01EX0pVTVBfT0ZGU0VUX01BU0sgICAgICAgICAgICAgICAgICAgICAweDFmZmZmZmZjCisjZGVmaW5lIE5WMDNfRklGT19DTURfUkVXSU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOVjAzX0ZJRk9fQ01EX0pVTVAgfCAoMCAmIE5WMDNfRklGT19DTURfSlVNUF9PRkZTRVRfTUFTSykpCisKKy8qIFRoaXMgaXMgYSBwYXJ0aWFsIGltcG9ydCBmcm9tIHJ1bGVzLW5nLCBhIGZldyB0aGluZ3MgbWF5IGJlIGR1cGxpY2F0ZWQuCisgKiBFdmVudHVhbGx5IHdlIHNob3VsZCBjb21wbGV0ZWx5IGltcG9ydCBldmVyeXRoaW5nIGZyb20gcnVsZXMtbmcuCisgKiBGb3IgdGhlIG1vbWVudCBjaGVjayBydWxlcy1uZyBmb3IgZG9jcy4KKyAgKi8KKworI2RlZmluZSBOVjUwX1BNQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBOVjUwX1BNQ19fTEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBOVjUwX1BNQ19fRVNJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorIyAgICBkZWZpbmUgTlY1MF9QTUNfQk9PVF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorIyAgICAgICAgZGVmaW5lIE5WNTBfUE1DX0JPT1RfMF9SRVZJU0lPTiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBmZgorIyAgICAgICAgZGVmaW5lIE5WNTBfUE1DX0JPT1RfMF9SRVZJU0lPTl9fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMAorIyAgICAgICAgZGVmaW5lIE5WNTBfUE1DX0JPT1RfMF9BUkNIICAgICAgICAgICAgICAgICAgICAgICAgMHgwZmYwMDAwMAorIyAgICAgICAgZGVmaW5lIE5WNTBfUE1DX0JPT1RfMF9BUkNIX19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAyMAorIyAgICBkZWZpbmUgTlY1MF9QTUNfSU5UUl8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorIyAgICAgICAgZGVmaW5lIE5WNTBfUE1DX0lOVFJfMF9QRklGTyAgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDw4KQorIyAgICAgICAgZGVmaW5lIE5WNTBfUE1DX0lOVFJfMF9QR1JBUEggICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDEyKQorIyAgICAgICAgZGVmaW5lIE5WNTBfUE1DX0lOVFJfMF9QVElNRVIgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDIwKQorIyAgICAgICAgZGVmaW5lIE5WNTBfUE1DX0lOVFJfMF9IT1RQTFVHICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDIxKQorIyAgICAgICAgZGVmaW5lIE5WNTBfUE1DX0lOVFJfMF9ESVNQTEFZICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDI2KQorIyAgICBkZWZpbmUgTlY1MF9QTUNfSU5UUl9FTl8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDE0MAorIyAgICAgICAgZGVmaW5lIE5WNTBfUE1DX0lOVFJfRU5fMF9NQVNURVIgICAgICAgICAgICAgICAgICAgICAgICgxPDwwKQorIyAgICAgICAgICAgIGRlZmluZSBOVjUwX1BNQ19JTlRSX0VOXzBfTUFTVEVSX0RJU0FCTEVEICAgICAgICAgICgwPDwwKQorIyAgICAgICAgICAgIGRlZmluZSBOVjUwX1BNQ19JTlRSX0VOXzBfTUFTVEVSX0VOQUJMRUQgICAgICAgICAgICgxPDwwKQorIyAgICBkZWZpbmUgTlY1MF9QTUNfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorIyAgICAgICAgZGVmaW5lIE5WNTBfUE1DX0VOQUJMRV9QRklGTyAgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDw4KQorIyAgICAgICAgZGVmaW5lIE5WNTBfUE1DX0VOQUJMRV9QR1JBUEggICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDEyKQorCisjZGVmaW5lIE5WNTBfUENPTk5FQ1RPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBlMDAwCisjZGVmaW5lIE5WNTBfUENPTk5FQ1RPUl9fTEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIE5WNTBfUENPTk5FQ1RPUl9fRVNJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjICAgIGRlZmluZSBOVjUwX1BDT05ORUNUT1JfSE9UUExVR19JTlRSICAgICAgICAgICAgICAgICAgICAweDAwMDBlMDUwCisjICAgICAgICBkZWZpbmUgTlY1MF9QQ09OTkVDVE9SX0hPVFBMVUdfSU5UUl9QTFVHX0kyQzAgICAgICAgICAgKDE8PDApCisjICAgICAgICBkZWZpbmUgTlY1MF9QQ09OTkVDVE9SX0hPVFBMVUdfSU5UUl9QTFVHX0kyQzEgICAgICAgICAgKDE8PDEpCisjICAgICAgICBkZWZpbmUgTlY1MF9QQ09OTkVDVE9SX0hPVFBMVUdfSU5UUl9QTFVHX0kyQzIgICAgICAgICAgKDE8PDIpCisjICAgICAgICBkZWZpbmUgTlY1MF9QQ09OTkVDVE9SX0hPVFBMVUdfSU5UUl9QTFVHX0kyQzMgICAgICAgICAgKDE8PDMpCisjICAgICAgICBkZWZpbmUgTlY1MF9QQ09OTkVDVE9SX0hPVFBMVUdfSU5UUl9VTlBMVUdfSTJDMCAgICAgICAoMTw8MTYpCisjICAgICAgICBkZWZpbmUgTlY1MF9QQ09OTkVDVE9SX0hPVFBMVUdfSU5UUl9VTlBMVUdfSTJDMSAgICAgICAoMTw8MTcpCisjICAgICAgICBkZWZpbmUgTlY1MF9QQ09OTkVDVE9SX0hPVFBMVUdfSU5UUl9VTlBMVUdfSTJDMiAgICAgICAoMTw8MTgpCisjICAgICAgICBkZWZpbmUgTlY1MF9QQ09OTkVDVE9SX0hPVFBMVUdfSU5UUl9VTlBMVUdfSTJDMyAgICAgICAoMTw8MTkpCisjICAgIGRlZmluZSBOVjUwX1BDT05ORUNUT1JfSE9UUExVR19DVFJMICAgICAgICAgICAgICAgICAgICAweDAwMDBlMDU0CisjICAgICAgICBkZWZpbmUgTlY1MF9QQ09OTkVDVE9SX0hPVFBMVUdfQ1RSTF9QTFVHX0kyQzAgICAgICAgICAgKDE8PDApCisjICAgICAgICBkZWZpbmUgTlY1MF9QQ09OTkVDVE9SX0hPVFBMVUdfQ1RSTF9QTFVHX0kyQzEgICAgICAgICAgKDE8PDEpCisjICAgICAgICBkZWZpbmUgTlY1MF9QQ09OTkVDVE9SX0hPVFBMVUdfQ1RSTF9QTFVHX0kyQzIgICAgICAgICAgKDE8PDIpCisjICAgICAgICBkZWZpbmUgTlY1MF9QQ09OTkVDVE9SX0hPVFBMVUdfQ1RSTF9QTFVHX0kyQzMgICAgICAgICAgKDE8PDMpCisjICAgICAgICBkZWZpbmUgTlY1MF9QQ09OTkVDVE9SX0hPVFBMVUdfQ1RSTF9VTlBMVUdfSTJDMCAgICAgICAoMTw8MTYpCisjICAgICAgICBkZWZpbmUgTlY1MF9QQ09OTkVDVE9SX0hPVFBMVUdfQ1RSTF9VTlBMVUdfSTJDMSAgICAgICAoMTw8MTcpCisjICAgICAgICBkZWZpbmUgTlY1MF9QQ09OTkVDVE9SX0hPVFBMVUdfQ1RSTF9VTlBMVUdfSTJDMiAgICAgICAoMTw8MTgpCisjICAgICAgICBkZWZpbmUgTlY1MF9QQ09OTkVDVE9SX0hPVFBMVUdfQ1RSTF9VTlBMVUdfSTJDMyAgICAgICAoMTw8MTkpCisjICAgIGRlZmluZSBOVjUwX1BDT05ORUNUT1JfSE9UUExVR19TVEFURSAgICAgICAgICAgICAgICAgICAweDAwMDBlMTA0CisjICAgICAgICBkZWZpbmUgTlY1MF9QQ09OTkVDVE9SX0hPVFBMVUdfU1RBVEVfUElOX0NPTk5FQ1RFRF9JMkMwICgxPDwyKQorIyAgICAgICAgZGVmaW5lIE5WNTBfUENPTk5FQ1RPUl9IT1RQTFVHX1NUQVRFX1BJTl9DT05ORUNURURfSTJDMSAoMTw8NikKKyMgICAgICAgIGRlZmluZSBOVjUwX1BDT05ORUNUT1JfSE9UUExVR19TVEFURV9QSU5fQ09OTkVDVEVEX0kyQzIgKDE8PDEwKQorIyAgICAgICAgZGVmaW5lIE5WNTBfUENPTk5FQ1RPUl9IT1RQTFVHX1NUQVRFX1BJTl9DT05ORUNURURfSTJDMyAoMTw8MTQpCisjICAgIGRlZmluZSBOVjUwX1BDT05ORUNUT1JfSTJDX1BPUlRfMCAgICAgICAgICAgICAgICAgICAgICAweDAwMDBlMTM4CisjICAgIGRlZmluZSBOVjUwX1BDT05ORUNUT1JfSTJDX1BPUlRfMSAgICAgICAgICAgICAgICAgICAgICAweDAwMDBlMTUwCisjICAgIGRlZmluZSBOVjUwX1BDT05ORUNUT1JfSTJDX1BPUlRfMiAgICAgICAgICAgICAgICAgICAgICAweDAwMDBlMTY4CisjICAgIGRlZmluZSBOVjUwX1BDT05ORUNUT1JfSTJDX1BPUlRfMyAgICAgICAgICAgICAgICAgICAgICAweDAwMDBlMTgwCisjICAgIGRlZmluZSBOVjUwX1BDT05ORUNUT1JfSTJDX1BPUlRfNCAgICAgICAgICAgICAgICAgICAgICAweDAwMDBlMjQwCisjICAgIGRlZmluZSBOVjUwX1BDT05ORUNUT1JfSTJDX1BPUlRfNSAgICAgICAgICAgICAgICAgICAgICAweDAwMDBlMjU4CisKKyNkZWZpbmUgTlY1MF9BVVhDSF9EQVRBX09VVChpLG4pICAgICAgICAgICAgICgobikgKiA0ICsgKGkpICogMHg1MCArIDB4MDAwMGU0YzApCisjZGVmaW5lIE5WNTBfQVVYQ0hfREFUQV9PVVRfX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE5WNTBfQVVYQ0hfREFUQV9JTihpLG4pICAgICAgICAgICAgICAoKG4pICogNCArIChpKSAqIDB4NTAgKyAweDAwMDBlNGQwKQorI2RlZmluZSBOVjUwX0FVWENIX0RBVEFfSU5fX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBOVjUwX0FVWENIX0FERFIoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaSkgKiAweDUwICsgMHgwMDAwZTRlMCkKKyNkZWZpbmUgTlY1MF9BVVhDSF9DVFJMKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGkpICogMHg1MCArIDB4MDAwMGU0ZTQpCisjZGVmaW5lIE5WNTBfQVVYQ0hfQ1RSTF9MSU5LU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIE5WNTBfQVVYQ0hfQ1RSTF9MSU5LU1RBVF9OT1RfUkVBRFkgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIE5WNTBfQVVYQ0hfQ1RSTF9MSU5LU1RBVF9SRUFEWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIE5WNTBfQVVYQ0hfQ1RSTF9MSU5LRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIE5WNTBfQVVYQ0hfQ1RSTF9MSU5LRU5fRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIE5WNTBfQVVYQ0hfQ1RSTF9MSU5LRU5fRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIE5WNTBfQVVYQ0hfQ1RSTF9FWEVDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIE5WNTBfQVVYQ0hfQ1RSTF9FWEVDX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIE5WNTBfQVVYQ0hfQ1RSTF9FWEVDX0lOX1BST0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIE5WNTBfQVVYQ0hfQ1RSTF9DTUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBmMDAwCisjZGVmaW5lIE5WNTBfQVVYQ0hfQ1RSTF9DTURfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIE5WNTBfQVVYQ0hfQ1RSTF9MRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIE5WNTBfQVVYQ0hfQ1RSTF9MRU5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE5WNTBfQVVYQ0hfU1RBVChpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpKSAqIDB4NTAgKyAweDAwMDBlNGU4KQorI2RlZmluZSBOVjUwX0FVWENIX1NUQVRfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBOVjUwX0FVWENIX1NUQVRfU1RBVEVfTk9UX1JFQURZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBOVjUwX0FVWENIX1NUQVRfU1RBVEVfUkVBRFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBOVjUwX0FVWENIX1NUQVRfUkVQTFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBmMDAwMAorI2RlZmluZSBOVjUwX0FVWENIX1NUQVRfUkVQTFlfQVVYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAwMAorI2RlZmluZSBOVjUwX0FVWENIX1NUQVRfUkVQTFlfQVVYX0FDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBOVjUwX0FVWENIX1NUQVRfUkVQTFlfQVVYX05BQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBOVjUwX0FVWENIX1NUQVRfUkVQTFlfQVVYX0RFRkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBOVjUwX0FVWENIX1NUQVRfUkVQTFlfSTJDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBjMDAwMAorI2RlZmluZSBOVjUwX0FVWENIX1NUQVRfUkVQTFlfSTJDX0FDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBOVjUwX0FVWENIX1NUQVRfUkVQTFlfSTJDX05BQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBOVjUwX0FVWENIX1NUQVRfUkVQTFlfSTJDX0RFRkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBOVjUwX0FVWENIX1NUQVRfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxZgorCisjZGVmaW5lIE5WNTBfUEJVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDg4MDAwCisjZGVmaW5lIE5WNTBfUEJVU19fTEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIE5WNTBfUEJVU19fRVNJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjICAgIGRlZmluZSBOVjUwX1BCVVNfUENJX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDg4MDAwCisjICAgICAgICBkZWZpbmUgTlY1MF9QQlVTX1BDSV9JRF9WRU5ET1JfSUQgICAgICAgICAgICAgICAgICAweDAwMDBmZmZmCisjICAgICAgICBkZWZpbmUgTlY1MF9QQlVTX1BDSV9JRF9WRU5ET1JfSURfX1NISUZUICAgICAgICAgICAgICAgICAgICAwCisjICAgICAgICBkZWZpbmUgTlY1MF9QQlVTX1BDSV9JRF9ERVZJQ0VfSUQgICAgICAgICAgICAgICAgICAweGZmZmYwMDAwCisjICAgICAgICBkZWZpbmUgTlY1MF9QQlVTX1BDSV9JRF9ERVZJQ0VfSURfX1NISUZUICAgICAgICAgICAgICAgICAgIDE2CisKKyNkZWZpbmUgTlY1MF9QRkIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgTlY1MF9QRkJfX0xFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgTlY1MF9QRkJfX0VTSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKKworI2RlZmluZSBOVjUwX1BFWFRERVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMTAwMAorI2RlZmluZSBOVjUwX1BFWFRERVZfX0xFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBOVjUwX1BFWFRERVZfX0VTSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorCisjZGVmaW5lIE5WNTBfUFJPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMzAwMDAwCisjZGVmaW5lIE5WNTBfUFJPTV9fTEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIE5WNTBfUFJPTV9fRVNJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwCisKKyNkZWZpbmUgTlY1MF9QR1JBUEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgTlY1MF9QR1JBUEhfX0xFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgTlY1MF9QR1JBUEhfX0VTSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAKKworI2RlZmluZSBOVjUwX1BESVNQTEFZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMDAwMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX09CSkVDVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMDAxMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0lOVFJfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMDAyMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0lOVFJfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMDAyNAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0lOVFJfMV9WQkxBTktfQ1JUQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwYworI2RlZmluZSBOVjUwX1BESVNQTEFZX0lOVFJfMV9WQkxBTktfQ1JUQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBOVjUwX1BESVNQTEFZX0lOVFJfMV9WQkxBTktfQ1JUQ18obikgICAgICAgICAgICAgICAgICAgKDEgPDwgKChuKSArIDIpKQorI2RlZmluZSBOVjUwX1BESVNQTEFZX0lOVFJfMV9WQkxBTktfQ1JUQ18wICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0lOVFJfMV9WQkxBTktfQ1JUQ18xICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0lOVFJfMV9DTEtfVU5LMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0lOVFJfMV9DTEtfVU5LMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0lOVFJfMV9DTEtfVU5LNDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0lOVFJfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMDAyYworI2RlZmluZSBOVjUwX1BESVNQTEFZX0lOVFJfRU5fVkJMQU5LX0NSVEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwYworI2RlZmluZSBOVjUwX1BESVNQTEFZX0lOVFJfRU5fVkJMQU5LX0NSVENfKG4pICAgICAgICAgICAgICAgICAgICgxIDw8ICgobikgKyAyKSkKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSX0VOX1ZCTEFOS19DUlRDXzAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSX0VOX1ZCTEFOS19DUlRDXzEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSX0VOX0NMS19VTksxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSX0VOX0NMS19VTksyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSX0VOX0NMS19VTks0MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9VTkszMF9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAwMzAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9VTkszMF9DVFJMX1VQREFURV9WQ0xLMCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9VTkszMF9DVFJMX1VQREFURV9WQ0xLMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9VTkszMF9DVFJMX1BFTkRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9UUkFQUEVEX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAwODAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9UUkFQUEVEX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAwODQKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9DSEFOTkVMX1NUQVQoaSkgICAgICAgICAgICAgICAgICAoKGkpICogMHgxMCArIDB4MDA2MTAyMDApCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUX0RNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUX0RNQV9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUX0RNQV9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9ETUFfQ0IoaSkgICAgICAgICAgICAgICAgKChpKSAqIDB4MTAgKyAweDAwNjEwMjA0KQorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NIQU5ORUxfRE1BX0NCX0xPQ0FUSU9OICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NIQU5ORUxfRE1BX0NCX0xPQ0FUSU9OX1ZSQU0gICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NIQU5ORUxfRE1BX0NCX0xPQ0FUSU9OX1NZU1RFTSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NIQU5ORUxfRE1BX0NCX1ZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NIQU5ORUxfVU5LMihpKSAgICAgICAgICAgICAgICAgICgoaSkgKiAweDEwICsgMHgwMDYxMDIwOCkKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9DSEFOTkVMX1VOSzMoaSkgICAgICAgICAgICAgICAgICAoKGkpICogMHgxMCArIDB4MDA2MTAyMGMpCisKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9DVVJTT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAyNzAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9DVVJTT1JfQ1VSU09SX0NUUkwyKGkpICAgICAgICAgICAoKGkpICogMHgxMCArIDB4MDA2MTAyNzApCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1VSU09SX0NVUlNPUl9DVFJMMl9PTiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1VSU09SX0NVUlNPUl9DVFJMMl9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAweDAwMDMwMDAwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1VSU09SX0NVUlNPUl9DVFJMMl9TVEFUVVNfQUNUSVZFICAgICAgICAgICAgICAweDAwMDEwMDAwCisKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9DVFJMX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAzMDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9DVFJMX1NUQVRFX1BFTkRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9DVFJMX1NUQVRFX01FVEhPRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDFmZmMKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9DVFJMX1NUQVRFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9DVFJMX1ZBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAzMDQKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9VTktfMzgwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAzODAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9SQU1fQU1PVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAzODQKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9VTktfMzg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAzODgKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9VTktfMzhDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAzOGMKKworI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfUChpLCByKSAgICAgICAgKChpKSAqIDB4NTQwICsgTlY1MF9QRElTUExBWV9DUlRDXyMjcikKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9DUlRDX0MoaSwgcikgICAgKDQgKyAoaSkgKiAweDU0MCArIE5WNTBfUERJU1BMQVlfQ1JUQ18jI3IpCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19VTktfMEExOCAvKiBtdGhkIDB4MDkwMCAqLyAgICAgICAgICAgICAgICAweDAwNjEwYTE4CisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19DTFVUX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwYTI0CisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19JTlRFUkxBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwYTQ4CisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19TQ0FMRV9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwYTUwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19DVVJTT1JfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwYTU4CisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19VTkswQTc4IC8qIG10aGQgMHgwOTA0ICovICAgICAgICAgICAgICAgICAweDAwNjEwYTc4CisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19VTkswQUI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwYWI4CisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19ERVBUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwYWM4CisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19DTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwYWQwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19DT0xPUl9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwYWUwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19TWU5DX1NUQVJUX1RPX0JMQU5LX0VORCAgICAgICAgICAgICAgICAgICAweDAwNjEwYWU4CisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19NT0RFX1VOSzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwYWYwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19ESVNQTEFZX1RPVEFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwYWY4CisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19TWU5DX0RVUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwYjAwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19NT0RFX1VOSzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwYjA4CisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19VTktfMEIxMCAvKiBtdGhkIDB4MDgyOCAqLyAgICAgICAgICAgICAgICAweDAwNjEwYjEwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19GQl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwYjE4CisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19GQl9QSVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwYjIwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19GQl9QSVRDSF9MSU5FQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19GQl9QT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwYjI4CisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19TQ0FMRV9DRU5URVJfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwYjM4CisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19SRUFMX1JFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwYjQwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19TQ0FMRV9SRVMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwYjQ4CisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19TQ0FMRV9SRVMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwYjUwCisKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9EQUNfTU9ERV9DVFJMX1AoaSkgICAgICAgICAgICAgICAgKDB4MDA2MTBiNTggKyAoaSkgKiAweDgpCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfREFDX01PREVfQ1RSTF9DKGkpICAgICAgICAgICAgICAgICgweDAwNjEwYjVjICsgKGkpICogMHg4KQorI2RlZmluZSBOVjUwX1BESVNQTEFZX1NPUl9NT0RFX0NUUkxfUChpKSAgICAgICAgICAgICAgICAoMHgwMDYxMGI3MCArIChpKSAqIDB4OCkKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9TT1JfTU9ERV9DVFJMX0MoaSkgICAgICAgICAgICAgICAgKDB4MDA2MTBiNzQgKyAoaSkgKiAweDgpCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfREFDX01PREVfQ1RSTDJfUChpKSAgICAgICAgICAgICAgICgweDAwNjEwYmRjICsgKGkpICogMHg4KQorI2RlZmluZSBOVjUwX1BESVNQTEFZX0RBQ19NT0RFX0NUUkwyX0MoaSkgICAgICAgICAgICAgICAoMHgwMDYxMGJlMCArIChpKSAqIDB4OCkKKworI2RlZmluZSBOVjkwX1BESVNQTEFZX1NPUl9NT0RFX0NUUkxfUChpKSAgICAgICAgICAgICAgICAoMHgwMDYxMDc5NCArIChpKSAqIDB4OCkKKyNkZWZpbmUgTlY5MF9QRElTUExBWV9TT1JfTU9ERV9DVFJMX0MoaSkgICAgICAgICAgICAgICAgKDB4MDA2MTA3OTggKyAoaSkgKiAweDgpCisjZGVmaW5lIE5WOTBfUERJU1BMQVlfREFDX01PREVfQ1RSTF9QKGkpICAgICAgICAgICAgICAgICgweDAwNjEwYjU4ICsgKGkpICogMHg4KQorI2RlZmluZSBOVjkwX1BESVNQTEFZX0RBQ19NT0RFX0NUUkxfQyhpKSAgICAgICAgICAgICAgICAoMHgwMDYxMGI1YyArIChpKSAqIDB4OCkKKyNkZWZpbmUgTlY5MF9QRElTUExBWV9EQUNfTU9ERV9DVFJMMl9QKGkpICAgICAgICAgICAgICAgKDB4MDA2MTBiODAgKyAoaSkgKiAweDgpCisjZGVmaW5lIE5WOTBfUERJU1BMQVlfREFDX01PREVfQ1RSTDJfQyhpKSAgICAgICAgICAgICAgICgweDAwNjEwYjg0ICsgKGkpICogMHg4KQorCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19DTEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjE0MDAwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19DTEtfQ1RSTDEoaSkgICAgICAgICAgICAgICAgICgoaSkgKiAweDgwMCArIDB4NjE0MTAwKQorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfQ0xLX0NUUkwxX0NPTk5FQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDYwMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfQ0xLX1ZQTExfQShpKSAgICAgICAgICAgICAgICAoKGkpICogMHg4MDAgKyAweDYxNDEwNCkKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9DUlRDX0NMS19WUExMX0IoaSkgICAgICAgICAgICAgICAgKChpKSAqIDB4ODAwICsgMHg2MTQxMDgpCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1JUQ19DTEtfQ1RSTDIoaSkgICAgICAgICAgICAgICAgICgoaSkgKiAweDgwMCArIDB4NjE0MjAwKQorCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfREFDX0NMSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjE0MDAwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfREFDX0NMS19DVFJMMihpKSAgICAgICAgICAgICAgICAgICgoaSkgKiAweDgwMCArIDB4NjE0MjgwKQorCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfU09SX0NMSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjE0MDAwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfU09SX0NMS19DVFJMMihpKSAgICAgICAgICAgICAgICAgICgoaSkgKiAweDgwMCArIDB4NjE0MzAwKQorCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfVkdBQ1JUQyhyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChyKSArIDB4NjE5NDAwKQorCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfREFDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjFhMDAwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfREFDX0RQTVNfQ1RSTChpKSAgICAgICAgICAgICAgICAoMHgwMDYxYTAwNCArIChpKSAqIDB4ODAwKQorI2RlZmluZSBOVjUwX1BESVNQTEFZX0RBQ19EUE1TX0NUUkxfSFNZTkNfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBOVjUwX1BESVNQTEFZX0RBQ19EUE1TX0NUUkxfVlNZTkNfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0RBQ19EUE1TX0NUUkxfQkxBTktFRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0RBQ19EUE1TX0NUUkxfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0RBQ19EUE1TX0NUUkxfUEVORElORyAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0RBQ19MT0FEX0NUUkwoaSkgICAgICAgICAgICAgICAgKDB4MDA2MWEwMGMgKyAoaSkgKiAweDgwMCkKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9EQUNfTE9BRF9DVFJMX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9EQUNfTE9BRF9DVFJMX1BSRVNFTlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwMDAwMDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9EQUNfTE9BRF9DVFJMX0RPTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9EQUNfQ0xLX0NUUkwxKGkpICAgICAgICAgICAgICAgICgweDAwNjFhMDEwICsgKGkpICogMHg4MDApCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfREFDX0NMS19DVFJMMV9DT05ORUNURUQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNjAwCisKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9TT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MWMwMDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9TT1JfRFBNU19DVFJMKGkpICAgICAgICAgICAgICAgICgweDAwNjFjMDA0ICsgKGkpICogMHg4MDApCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfU09SX0RQTVNfQ1RSTF9QRU5ESU5HICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfU09SX0RQTVNfQ1RSTF9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfU09SX0NMS19DVFJMMShpKSAgICAgICAgICAgICAgICAoMHgwMDYxYzAwOCArIChpKSAqIDB4ODAwKQorI2RlZmluZSBOVjUwX1BESVNQTEFZX1NPUl9DTEtfQ1RSTDFfQ09OTkVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDYwMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX1NPUl9EUE1TX1NUQVRFKGkpICAgICAgICAgICAgICAgKDB4MDA2MWMwMzAgKyAoaSkgKiAweDgwMCkKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9TT1JfRFBNU19TVEFURV9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9TT1JfRFBNU19TVEFURV9CTEFOS0VEICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9TT1JfRFBNU19TVEFURV9XQUlUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9TT1JfQkFDS0xJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MWMwODQKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9TT1JfQkFDS0xJR0hUX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9TT1JfQkFDS0xJR0hUX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDBmZmYKKyNkZWZpbmUgTlY1MF9TT1JfRFBfQ1RSTChpLGwpICAgICAgICAgICAgKDB4MDA2MWMxMGMgKyAoaSkgKiAweDgwMCArIChsKSAqIDB4ODApCisjZGVmaW5lIE5WNTBfU09SX0RQX0NUUkxfRU5IQU5DRURfRlJBTUVfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIE5WNTBfU09SX0RQX0NUUkxfTEFORV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMWYwMDAwCisjZGVmaW5lIE5WNTBfU09SX0RQX0NUUkxfTEFORV8wX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIE5WNTBfU09SX0RQX0NUUkxfTEFORV8xX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIE5WNTBfU09SX0RQX0NUUkxfTEFORV8yX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIE5WNTBfU09SX0RQX0NUUkxfTEFORV8zX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIE5WNTBfU09SX0RQX0NUUkxfVFJBSU5JTkdfUEFUVEVSTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBmMDAwMDAwCisjZGVmaW5lIE5WNTBfU09SX0RQX0NUUkxfVFJBSU5JTkdfUEFUVEVSTl9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIE5WNTBfU09SX0RQX0NUUkxfVFJBSU5JTkdfUEFUVEVSTl8xICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIE5WNTBfU09SX0RQX0NUUkxfVFJBSU5JTkdfUEFUVEVSTl8yICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIE5WNTBfU09SX0RQX1VOSzExOChpLGwpICAgICAgICAgICgweDAwNjFjMTE4ICsgKGkpICogMHg4MDAgKyAobCkgKiAweDgwKQorI2RlZmluZSBOVjUwX1NPUl9EUF9VTksxMjAoaSxsKSAgICAgICAgICAoMHgwMDYxYzEyMCArIChpKSAqIDB4ODAwICsgKGwpICogMHg4MCkKKyNkZWZpbmUgTlY1MF9TT1JfRFBfVU5LMTMwKGksbCkgICAgICAgICAgKDB4MDA2MWMxMzAgKyAoaSkgKiAweDgwMCArIChsKSAqIDB4ODApCisKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9VU0VSKGkpICAgICAgICAgICAgICAgICAgICAgICAgKChpKSAqIDB4MTAwMCArIDB4MDA2NDAwMDApCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfVVNFUl9QVVQoaSkgICAgICAgICAgICAgICAgICAgICgoaSkgKiAweDEwMDAgKyAweDAwNjQwMDAwKQorI2RlZmluZSBOVjUwX1BESVNQTEFZX1VTRVJfR0VUKGkpICAgICAgICAgICAgICAgICAgICAoKGkpICogMHgxMDAwICsgMHgwMDY0MDAwNCkKKworI2RlZmluZSBOVjUwX1BESVNQTEFZX0NVUlNPUl9VU0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDY0NzAwMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0NVUlNPUl9VU0VSX1BPU19DVFJMKGkpICAgICAgICAoKGkpICogMHgxMDAwICsgMHgwMDY0NzA4MCkKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9DVVJTT1JfVVNFUl9QT1MoaSkgICAgICAgICAgICAgKChpKSAqIDB4MTAwMCArIDB4MDA2NDcwODQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3NnZG1hLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3NnZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM3ZjFlNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc2dkbWEuYwpAQCAtMCwwICsxLDMyMSBAQAorI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKworI2RlZmluZSBOVl9DVFhETUFfUEFHRV9TSElGVCAxMgorI2RlZmluZSBOVl9DVFhETUFfUEFHRV9TSVpFICAoMSA8PCBOVl9DVFhETUFfUEFHRV9TSElGVCkKKyNkZWZpbmUgTlZfQ1RYRE1BX1BBR0VfTUFTSyAgKE5WX0NUWERNQV9QQUdFX1NJWkUgLSAxKQorCitzdHJ1Y3Qgbm91dmVhdV9zZ2RtYV9iZSB7CisJc3RydWN0IHR0bV9iYWNrZW5kIGJhY2tlbmQ7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKKworCWRtYV9hZGRyX3QgKnBhZ2VzOworCXVuc2lnbmVkIG5yX3BhZ2VzOworCisJdW5zaWduZWQgcHRlX3N0YXJ0OworCWJvb2wgYm91bmQ7Cit9OworCitzdGF0aWMgaW50Citub3V2ZWF1X3NnZG1hX3BvcHVsYXRlKHN0cnVjdCB0dG1fYmFja2VuZCAqYmUsIHVuc2lnbmVkIGxvbmcgbnVtX3BhZ2VzLAorCQkgICAgICAgc3RydWN0IHBhZ2UgKipwYWdlcywgc3RydWN0IHBhZ2UgKmR1bW15X3JlYWRfcGFnZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9zZ2RtYV9iZSAqbnZiZSA9IChzdHJ1Y3Qgbm91dmVhdV9zZ2RtYV9iZSAqKWJlOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBudmJlLT5kZXY7CisKKwlOVl9ERUJVRyhudmJlLT5kZXYsICJudW1fcGFnZXMgPSAlbGRcbiIsIG51bV9wYWdlcyk7CisKKwlpZiAobnZiZS0+cGFnZXMpCisJCXJldHVybiAtRUlOVkFMOworCisJbnZiZS0+cGFnZXMgPSBrbWFsbG9jKHNpemVvZihkbWFfYWRkcl90KSAqIG51bV9wYWdlcywgR0ZQX0tFUk5FTCk7CisJaWYgKCFudmJlLT5wYWdlcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwludmJlLT5ucl9wYWdlcyA9IDA7CisJd2hpbGUgKG51bV9wYWdlcy0tKSB7CisJCW52YmUtPnBhZ2VzW252YmUtPm5yX3BhZ2VzXSA9CisJCQlwY2lfbWFwX3BhZ2UoZGV2LT5wZGV2LCBwYWdlc1tudmJlLT5ucl9wYWdlc10sIDAsCisJCQkJICAgICBQQUdFX1NJWkUsIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IoZGV2LT5wZGV2LAorCQkJCQkgIG52YmUtPnBhZ2VzW252YmUtPm5yX3BhZ2VzXSkpIHsKKwkJCWJlLT5mdW5jLT5jbGVhcihiZSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCW52YmUtPm5yX3BhZ2VzKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitub3V2ZWF1X3NnZG1hX2NsZWFyKHN0cnVjdCB0dG1fYmFja2VuZCAqYmUpCit7CisJc3RydWN0IG5vdXZlYXVfc2dkbWFfYmUgKm52YmUgPSAoc3RydWN0IG5vdXZlYXVfc2dkbWFfYmUgKiliZTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbnZiZS0+ZGV2OworCisJTlZfREVCVUcobnZiZS0+ZGV2LCAiXG4iKTsKKworCWlmIChudmJlICYmIG52YmUtPnBhZ2VzKSB7CisJCWlmIChudmJlLT5ib3VuZCkKKwkJCWJlLT5mdW5jLT51bmJpbmQoYmUpOworCisJCXdoaWxlIChudmJlLT5ucl9wYWdlcy0tKSB7CisJCQlwY2lfdW5tYXBfcGFnZShkZXYtPnBkZXYsIG52YmUtPnBhZ2VzW252YmUtPm5yX3BhZ2VzXSwKKwkJCQkgICAgICAgUEFHRV9TSVpFLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCQl9CisJCWtmcmVlKG52YmUtPnBhZ2VzKTsKKwkJbnZiZS0+cGFnZXMgPSBOVUxMOworCQludmJlLT5ucl9wYWdlcyA9IDA7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkCitub3V2ZWF1X3NnZG1hX3B0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50NjRfdCBvZmZzZXQpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1bnNpZ25lZCBwdGUgPSAob2Zmc2V0ID4+IE5WX0NUWERNQV9QQUdFX1NISUZUKTsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApCisJCXJldHVybiBwdGUgKyAyOworCisJcmV0dXJuIHB0ZSA8PCAxOworfQorCitzdGF0aWMgaW50Citub3V2ZWF1X3NnZG1hX2JpbmQoc3RydWN0IHR0bV9iYWNrZW5kICpiZSwgc3RydWN0IHR0bV9tZW1fcmVnICptZW0pCit7CisJc3RydWN0IG5vdXZlYXVfc2dkbWFfYmUgKm52YmUgPSAoc3RydWN0IG5vdXZlYXVfc2dkbWFfYmUgKiliZTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbnZiZS0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmogPSBkZXZfcHJpdi0+Z2FydF9pbmZvLnNnX2N0eGRtYTsKKwl1bnNpZ25lZCBpLCBqLCBwdGU7CisKKwlOVl9ERUJVRyhkZXYsICJwZz0weCVseFxuIiwgbWVtLT5tbV9ub2RlLT5zdGFydCk7CisKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MobnZiZS0+ZGV2LCB0cnVlKTsKKwlwdGUgPSBub3V2ZWF1X3NnZG1hX3B0ZShudmJlLT5kZXYsIG1lbS0+bW1fbm9kZS0+c3RhcnQgPDwgUEFHRV9TSElGVCk7CisJbnZiZS0+cHRlX3N0YXJ0ID0gcHRlOworCWZvciAoaSA9IDA7IGkgPCBudmJlLT5ucl9wYWdlczsgaSsrKSB7CisJCWRtYV9hZGRyX3QgZG1hX29mZnNldCA9IG52YmUtPnBhZ2VzW2ldOworCQl1aW50MzJfdCBvZmZzZXRfbCA9IGxvd2VyXzMyX2JpdHMoZG1hX29mZnNldCk7CisJCXVpbnQzMl90IG9mZnNldF9oID0gdXBwZXJfMzJfYml0cyhkbWFfb2Zmc2V0KTsKKworCQlmb3IgKGogPSAwOyBqIDwgUEFHRV9TSVpFIC8gTlZfQ1RYRE1BX1BBR0VfU0laRTsgaisrKSB7CisJCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKQorCQkJCW52X3dvMzIoZGV2LCBncHVvYmosIHB0ZSsrLCBvZmZzZXRfbCB8IDMpOworCQkJZWxzZSB7CisJCQkJbnZfd28zMihkZXYsIGdwdW9iaiwgcHRlKyssIG9mZnNldF9sIHwgMHgyMSk7CisJCQkJbnZfd28zMihkZXYsIGdwdW9iaiwgcHRlKyssIG9mZnNldF9oICYgMHhmZik7CisJCQl9CisKKwkJCWRtYV9vZmZzZXQgKz0gTlZfQ1RYRE1BX1BBR0VfU0laRTsKKwkJfQorCX0KKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhudmJlLT5kZXYpOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNTApIHsKKwkJbnZfd3IzMihkZXYsIDB4MTAwYzgwLCAweDAwMDUwMDAxKTsKKwkJaWYgKCFudl93YWl0KDB4MTAwYzgwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKSkgeworCQkJTlZfRVJST1IoZGV2LCAidGltZW91dDogKDB4MTAwYzgwICYgMSkgPT0gMCAoMilcbiIpOworCQkJTlZfRVJST1IoZGV2LCAiMHgxMDBjODAgPSAweCUwOHhcbiIsCisJCQkJCQludl9yZDMyKGRldiwgMHgxMDBjODApKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKworCQludl93cjMyKGRldiwgMHgxMDBjODAsIDB4MDAwMDAwMDEpOworCQlpZiAoIW52X3dhaXQoMHgxMDBjODAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApKSB7CisJCQlOVl9FUlJPUihkZXYsICJ0aW1lb3V0OiAoMHgxMDBjODAgJiAxKSA9PSAwICgyKVxuIik7CisJCQlOVl9FUlJPUihkZXYsICIweDEwMGM4MCA9IDB4JTA4eFxuIiwKKwkJCQkJCW52X3JkMzIoZGV2LCAweDEwMGM4MCkpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKworCW52YmUtPmJvdW5kID0gdHJ1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbm91dmVhdV9zZ2RtYV91bmJpbmQoc3RydWN0IHR0bV9iYWNrZW5kICpiZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9zZ2RtYV9iZSAqbnZiZSA9IChzdHJ1Y3Qgbm91dmVhdV9zZ2RtYV9iZSAqKWJlOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBudmJlLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaiA9IGRldl9wcml2LT5nYXJ0X2luZm8uc2dfY3R4ZG1hOworCXVuc2lnbmVkIGksIGosIHB0ZTsKKworCU5WX0RFQlVHKGRldiwgIlxuIik7CisKKwlpZiAoIW52YmUtPmJvdW5kKQorCQlyZXR1cm4gMDsKKworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhudmJlLT5kZXYsIHRydWUpOworCXB0ZSA9IG52YmUtPnB0ZV9zdGFydDsKKwlmb3IgKGkgPSAwOyBpIDwgbnZiZS0+bnJfcGFnZXM7IGkrKykgeworCQlkbWFfYWRkcl90IGRtYV9vZmZzZXQgPSBkZXZfcHJpdi0+Z2FydF9pbmZvLnNnX2R1bW15X2J1czsKKworCQlmb3IgKGogPSAwOyBqIDwgUEFHRV9TSVpFIC8gTlZfQ1RYRE1BX1BBR0VfU0laRTsgaisrKSB7CisJCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKQorCQkJCW52X3dvMzIoZGV2LCBncHVvYmosIHB0ZSsrLCBkbWFfb2Zmc2V0IHwgMyk7CisJCQllbHNlIHsKKwkJCQludl93bzMyKGRldiwgZ3B1b2JqLCBwdGUrKywgZG1hX29mZnNldCB8IDB4MjEpOworCQkJCW52X3dvMzIoZGV2LCBncHVvYmosIHB0ZSsrLCAweDAwMDAwMDAwKTsKKwkJCX0KKworCQkJZG1hX29mZnNldCArPSBOVl9DVFhETUFfUEFHRV9TSVpFOworCQl9CisJfQorCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKG52YmUtPmRldik7CisKKwludmJlLT5ib3VuZCA9IGZhbHNlOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbm91dmVhdV9zZ2RtYV9kZXN0cm95KHN0cnVjdCB0dG1fYmFja2VuZCAqYmUpCit7CisJc3RydWN0IG5vdXZlYXVfc2dkbWFfYmUgKm52YmUgPSAoc3RydWN0IG5vdXZlYXVfc2dkbWFfYmUgKiliZTsKKworCWlmIChiZSkgeworCQlOVl9ERUJVRyhudmJlLT5kZXYsICJcbiIpOworCisJCWlmIChudmJlKSB7CisJCQlpZiAobnZiZS0+cGFnZXMpCisJCQkJYmUtPmZ1bmMtPmNsZWFyKGJlKTsKKwkJCWtmcmVlKG52YmUpOworCQl9CisJfQorfQorCitzdGF0aWMgc3RydWN0IHR0bV9iYWNrZW5kX2Z1bmMgbm91dmVhdV9zZ2RtYV9iYWNrZW5kID0geworCS5wb3B1bGF0ZQkJPSBub3V2ZWF1X3NnZG1hX3BvcHVsYXRlLAorCS5jbGVhcgkJCT0gbm91dmVhdV9zZ2RtYV9jbGVhciwKKwkuYmluZAkJCT0gbm91dmVhdV9zZ2RtYV9iaW5kLAorCS51bmJpbmQJCQk9IG5vdXZlYXVfc2dkbWFfdW5iaW5kLAorCS5kZXN0cm95CQk9IG5vdXZlYXVfc2dkbWFfZGVzdHJveQorfTsKKworc3RydWN0IHR0bV9iYWNrZW5kICoKK25vdXZlYXVfc2dkbWFfaW5pdF90dG0oc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X3NnZG1hX2JlICpudmJlOworCisJaWYgKCFkZXZfcHJpdi0+Z2FydF9pbmZvLnNnX2N0eGRtYSkKKwkJcmV0dXJuIE5VTEw7CisKKwludmJlID0ga3phbGxvYyhzaXplb2YoKm52YmUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW52YmUpCisJCXJldHVybiBOVUxMOworCisJbnZiZS0+ZGV2ID0gZGV2OworCisJbnZiZS0+YmFja2VuZC5mdW5jCT0gJm5vdXZlYXVfc2dkbWFfYmFja2VuZDsKKworCXJldHVybiAmbnZiZS0+YmFja2VuZDsKK30KKworaW50Citub3V2ZWF1X3NnZG1hX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqID0gTlVMTDsKKwl1aW50MzJfdCBhcGVyX3NpemUsIG9ial9zaXplOworCWludCBpLCByZXQ7CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7CisJCWFwZXJfc2l6ZSA9ICg2NCAqIDEwMjQgKiAxMDI0KTsKKwkJb2JqX3NpemUgID0gKGFwZXJfc2l6ZSA+PiBOVl9DVFhETUFfUEFHRV9TSElGVCkgKiA0OworCQlvYmpfc2l6ZSArPSA4OyAvKiBjdHhkbWEgaGVhZGVyICovCisJfSBlbHNlIHsKKwkJLyogMSBlbnRpcmUgVk0gcGFnZSB0YWJsZSAqLworCQlhcGVyX3NpemUgPSAoNTEyICogMTAyNCAqIDEwMjQpOworCQlvYmpfc2l6ZSAgPSAoYXBlcl9zaXplID4+IE5WX0NUWERNQV9QQUdFX1NISUZUKSAqIDg7CisJfQorCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgTlVMTCwgb2JqX3NpemUsIDE2LAorCQkJCSAgICAgIE5WT0JKX0ZMQUdfQUxMT1dfTk9fUkVGUyB8CisJCQkJICAgICAgTlZPQkpfRkxBR19aRVJPX0FMTE9DIHwKKwkJCQkgICAgICBOVk9CSl9GTEFHX1pFUk9fRlJFRSwgJmdwdW9iaik7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJFcnJvciBjcmVhdGluZyBzZ2RtYSBvYmplY3Q6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfcGFnZSA9CisJCWFsbG9jX3BhZ2UoR0ZQX0tFUk5FTHxfX0dGUF9ETUEzMik7CisJc2V0X2JpdChQR19sb2NrZWQsICZkZXZfcHJpdi0+Z2FydF9pbmZvLnNnX2R1bW15X3BhZ2UtPmZsYWdzKTsKKwlkZXZfcHJpdi0+Z2FydF9pbmZvLnNnX2R1bW15X2J1cyA9CisJCXBjaV9tYXBfcGFnZShkZXYtPnBkZXYsIGRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfcGFnZSwgMCwKKwkJCSAgICAgUEFHRV9TSVpFLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgdHJ1ZSk7CisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgeworCQkvKiBNYXliZSB1c2UgTlZfRE1BX1RBUkdFVF9BR1AgZm9yIFBDSUU/IE5WSURJQSBkbyB0aGlzLCBhbmQKKwkJICogY29uZmlybWVkIHRvIHdvcmsgb24gYzUxLiAgUGVyaGFwcyBtZWFucyBOVl9ETUFfVEFSR0VUX1BDSUUKKwkJICogb24gdGhvc2UgY2FyZHM/ICovCisJCW52X3dvMzIoZGV2LCBncHVvYmosIDAsIE5WX0NMQVNTX0RNQV9JTl9NRU1PUlkgfAorCQkJCSAgICAgICAoMSA8PCAxMikgLyogUFQgcHJlc2VudCAqLyB8CisJCQkJICAgICAgICgwIDw8IDEzKSAvKiBQVCAqbm90KiBsaW5lYXIgKi8gfAorCQkJCSAgICAgICAoTlZfRE1BX0FDQ0VTU19SVyAgPDwgMTQpIHwKKwkJCQkgICAgICAgKE5WX0RNQV9UQVJHRVRfUENJIDw8IDE2KSk7CisJCW52X3dvMzIoZGV2LCBncHVvYmosIDEsIGFwZXJfc2l6ZSAtIDEpOworCQlmb3IgKGkgPSAyOyBpIDwgMiArIChhcGVyX3NpemUgPj4gMTIpOyBpKyspIHsKKwkJCW52X3dvMzIoZGV2LCBncHVvYmosIGksCisJCQkJICAgIGRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfYnVzIHwgMyk7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgb2JqX3NpemU7IGkgKz0gOCkgeworCQkJbnZfd28zMihkZXYsIGdwdW9iaiwgKGkrMCkvNCwKKwkJCQkgICAgZGV2X3ByaXYtPmdhcnRfaW5mby5zZ19kdW1teV9idXMgfCAweDIxKTsKKwkJCW52X3dvMzIoZGV2LCBncHVvYmosIChpKzQpLzQsIDApOworCQl9CisJfQorCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisKKwlkZXZfcHJpdi0+Z2FydF9pbmZvLnR5cGUgICAgICA9IE5PVVZFQVVfR0FSVF9TR0RNQTsKKwlkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfYmFzZSA9IDA7CisJZGV2X3ByaXYtPmdhcnRfaW5mby5hcGVyX3NpemUgPSBhcGVyX3NpemU7CisJZGV2X3ByaXYtPmdhcnRfaW5mby5zZ19jdHhkbWEgPSBncHVvYmo7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK25vdXZlYXVfc2dkbWFfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKGRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfcGFnZSkgeworCQlwY2lfdW5tYXBfcGFnZShkZXYtPnBkZXYsIGRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfYnVzLAorCQkJICAgICAgIE5WX0NUWERNQV9QQUdFX1NJWkUsIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJCXVubG9ja19wYWdlKGRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfcGFnZSk7CisJCV9fZnJlZV9wYWdlKGRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfcGFnZSk7CisJCWRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfcGFnZSA9IE5VTEw7CisJCWRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfYnVzID0gMDsKKwl9CisKKwlub3V2ZWF1X2dwdW9ial9kZWwoZGV2LCAmZGV2X3ByaXYtPmdhcnRfaW5mby5zZ19jdHhkbWEpOworfQorCitpbnQKK25vdXZlYXVfc2dkbWFfZ2V0X3BhZ2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCAqcGFnZSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqID0gZGV2X3ByaXYtPmdhcnRfaW5mby5zZ19jdHhkbWE7CisJc3RydWN0IG5vdXZlYXVfaW5zdG1lbV9lbmdpbmUgKmluc3RtZW0gPSAmZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtOworCWludCBwdGU7CisKKwlwdGUgPSAob2Zmc2V0ID4+IE5WX0NUWERNQV9QQUdFX1NISUZUKTsKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7CisJCWluc3RtZW0tPnByZXBhcmVfYWNjZXNzKGRldiwgZmFsc2UpOworCQkqcGFnZSA9IG52X3JvMzIoZGV2LCBncHVvYmosIChwdGUgKyAyKSkgJiB+TlZfQ1RYRE1BX1BBR0VfTUFTSzsKKwkJaW5zdG1lbS0+ZmluaXNoX2FjY2VzcyhkZXYpOworCQlyZXR1cm4gMDsKKwl9CisKKwlOVl9FUlJPUihkZXYsICJVbmltcGxlbWVudGVkIG9uIE5WNTBcbiIpOworCXJldHVybiAtRUlOVkFMOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zdGF0ZS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zdGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZDQxZDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3N0YXRlLmMKQEAgLTAsMCArMSw4MTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNSBTdGVwaGFuZSBNYXJjaGVzaW4KKyAqIENvcHlyaWdodCAyMDA4IFN0dWFydCBCZW5uZXR0CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3dhYi5oPgorI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJkcm1fc2FyZWEuaCIKKyNpbmNsdWRlICJkcm1fY3J0Y19oZWxwZXIuaCIKKyNpbmNsdWRlIDxsaW51eC92Z2FhcmIuaD4KKworI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9kcm0uaCIKKyNpbmNsdWRlICJudjUwX2Rpc3BsYXkuaCIKKworc3RhdGljIGludCBub3V2ZWF1X3N0dWJfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KSB7IHJldHVybiAwOyB9CitzdGF0aWMgdm9pZCBub3V2ZWF1X3N0dWJfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKmRldikge30KKworc3RhdGljIGludCBub3V2ZWF1X2luaXRfZW5naW5lX3B0cnMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2VuZ2luZSAqZW5naW5lID0gJmRldl9wcml2LT5lbmdpbmU7CisKKwlzd2l0Y2ggKGRldl9wcml2LT5jaGlwc2V0ICYgMHhmMCkgeworCWNhc2UgMHgwMDoKKwkJZW5naW5lLT5pbnN0bWVtLmluaXQJCT0gbnYwNF9pbnN0bWVtX2luaXQ7CisJCWVuZ2luZS0+aW5zdG1lbS50YWtlZG93bgk9IG52MDRfaW5zdG1lbV90YWtlZG93bjsKKwkJZW5naW5lLT5pbnN0bWVtLnN1c3BlbmQJCT0gbnYwNF9pbnN0bWVtX3N1c3BlbmQ7CisJCWVuZ2luZS0+aW5zdG1lbS5yZXN1bWUJCT0gbnYwNF9pbnN0bWVtX3Jlc3VtZTsKKwkJZW5naW5lLT5pbnN0bWVtLnBvcHVsYXRlCT0gbnYwNF9pbnN0bWVtX3BvcHVsYXRlOworCQllbmdpbmUtPmluc3RtZW0uY2xlYXIJCT0gbnYwNF9pbnN0bWVtX2NsZWFyOworCQllbmdpbmUtPmluc3RtZW0uYmluZAkJPSBudjA0X2luc3RtZW1fYmluZDsKKwkJZW5naW5lLT5pbnN0bWVtLnVuYmluZAkJPSBudjA0X2luc3RtZW1fdW5iaW5kOworCQllbmdpbmUtPmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MJPSBudjA0X2luc3RtZW1fcHJlcGFyZV9hY2Nlc3M7CisJCWVuZ2luZS0+aW5zdG1lbS5maW5pc2hfYWNjZXNzCT0gbnYwNF9pbnN0bWVtX2ZpbmlzaF9hY2Nlc3M7CisJCWVuZ2luZS0+bWMuaW5pdAkJCT0gbnYwNF9tY19pbml0OworCQllbmdpbmUtPm1jLnRha2Vkb3duCQk9IG52MDRfbWNfdGFrZWRvd247CisJCWVuZ2luZS0+dGltZXIuaW5pdAkJPSBudjA0X3RpbWVyX2luaXQ7CisJCWVuZ2luZS0+dGltZXIucmVhZAkJPSBudjA0X3RpbWVyX3JlYWQ7CisJCWVuZ2luZS0+dGltZXIudGFrZWRvd24JCT0gbnYwNF90aW1lcl90YWtlZG93bjsKKwkJZW5naW5lLT5mYi5pbml0CQkJPSBudjA0X2ZiX2luaXQ7CisJCWVuZ2luZS0+ZmIudGFrZWRvd24JCT0gbnYwNF9mYl90YWtlZG93bjsKKwkJZW5naW5lLT5ncmFwaC5ncmNsYXNzCQk9IG52MDRfZ3JhcGhfZ3JjbGFzczsKKwkJZW5naW5lLT5ncmFwaC5pbml0CQk9IG52MDRfZ3JhcGhfaW5pdDsKKwkJZW5naW5lLT5ncmFwaC50YWtlZG93bgkJPSBudjA0X2dyYXBoX3Rha2Vkb3duOworCQllbmdpbmUtPmdyYXBoLmZpZm9fYWNjZXNzCT0gbnYwNF9ncmFwaF9maWZvX2FjY2VzczsKKwkJZW5naW5lLT5ncmFwaC5jaGFubmVsCQk9IG52MDRfZ3JhcGhfY2hhbm5lbDsKKwkJZW5naW5lLT5ncmFwaC5jcmVhdGVfY29udGV4dAk9IG52MDRfZ3JhcGhfY3JlYXRlX2NvbnRleHQ7CisJCWVuZ2luZS0+Z3JhcGguZGVzdHJveV9jb250ZXh0CT0gbnYwNF9ncmFwaF9kZXN0cm95X2NvbnRleHQ7CisJCWVuZ2luZS0+Z3JhcGgubG9hZF9jb250ZXh0CT0gbnYwNF9ncmFwaF9sb2FkX2NvbnRleHQ7CisJCWVuZ2luZS0+Z3JhcGgudW5sb2FkX2NvbnRleHQJPSBudjA0X2dyYXBoX3VubG9hZF9jb250ZXh0OworCQllbmdpbmUtPmZpZm8uY2hhbm5lbHMJCT0gMTY7CisJCWVuZ2luZS0+Zmlmby5pbml0CQk9IG52MDRfZmlmb19pbml0OworCQllbmdpbmUtPmZpZm8udGFrZWRvd24JCT0gbm91dmVhdV9zdHViX3Rha2Vkb3duOworCQllbmdpbmUtPmZpZm8uZGlzYWJsZQkJPSBudjA0X2ZpZm9fZGlzYWJsZTsKKwkJZW5naW5lLT5maWZvLmVuYWJsZQkJPSBudjA0X2ZpZm9fZW5hYmxlOworCQllbmdpbmUtPmZpZm8ucmVhc3NpZ24JCT0gbnYwNF9maWZvX3JlYXNzaWduOworCQllbmdpbmUtPmZpZm8uY2hhbm5lbF9pZAkJPSBudjA0X2ZpZm9fY2hhbm5lbF9pZDsKKwkJZW5naW5lLT5maWZvLmNyZWF0ZV9jb250ZXh0CT0gbnYwNF9maWZvX2NyZWF0ZV9jb250ZXh0OworCQllbmdpbmUtPmZpZm8uZGVzdHJveV9jb250ZXh0CT0gbnYwNF9maWZvX2Rlc3Ryb3lfY29udGV4dDsKKwkJZW5naW5lLT5maWZvLmxvYWRfY29udGV4dAk9IG52MDRfZmlmb19sb2FkX2NvbnRleHQ7CisJCWVuZ2luZS0+Zmlmby51bmxvYWRfY29udGV4dAk9IG52MDRfZmlmb191bmxvYWRfY29udGV4dDsKKwkJYnJlYWs7CisJY2FzZSAweDEwOgorCQllbmdpbmUtPmluc3RtZW0uaW5pdAkJPSBudjA0X2luc3RtZW1faW5pdDsKKwkJZW5naW5lLT5pbnN0bWVtLnRha2Vkb3duCT0gbnYwNF9pbnN0bWVtX3Rha2Vkb3duOworCQllbmdpbmUtPmluc3RtZW0uc3VzcGVuZAkJPSBudjA0X2luc3RtZW1fc3VzcGVuZDsKKwkJZW5naW5lLT5pbnN0bWVtLnJlc3VtZQkJPSBudjA0X2luc3RtZW1fcmVzdW1lOworCQllbmdpbmUtPmluc3RtZW0ucG9wdWxhdGUJPSBudjA0X2luc3RtZW1fcG9wdWxhdGU7CisJCWVuZ2luZS0+aW5zdG1lbS5jbGVhcgkJPSBudjA0X2luc3RtZW1fY2xlYXI7CisJCWVuZ2luZS0+aW5zdG1lbS5iaW5kCQk9IG52MDRfaW5zdG1lbV9iaW5kOworCQllbmdpbmUtPmluc3RtZW0udW5iaW5kCQk9IG52MDRfaW5zdG1lbV91bmJpbmQ7CisJCWVuZ2luZS0+aW5zdG1lbS5wcmVwYXJlX2FjY2Vzcwk9IG52MDRfaW5zdG1lbV9wcmVwYXJlX2FjY2VzczsKKwkJZW5naW5lLT5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MJPSBudjA0X2luc3RtZW1fZmluaXNoX2FjY2VzczsKKwkJZW5naW5lLT5tYy5pbml0CQkJPSBudjA0X21jX2luaXQ7CisJCWVuZ2luZS0+bWMudGFrZWRvd24JCT0gbnYwNF9tY190YWtlZG93bjsKKwkJZW5naW5lLT50aW1lci5pbml0CQk9IG52MDRfdGltZXJfaW5pdDsKKwkJZW5naW5lLT50aW1lci5yZWFkCQk9IG52MDRfdGltZXJfcmVhZDsKKwkJZW5naW5lLT50aW1lci50YWtlZG93bgkJPSBudjA0X3RpbWVyX3Rha2Vkb3duOworCQllbmdpbmUtPmZiLmluaXQJCQk9IG52MTBfZmJfaW5pdDsKKwkJZW5naW5lLT5mYi50YWtlZG93bgkJPSBudjEwX2ZiX3Rha2Vkb3duOworCQllbmdpbmUtPmdyYXBoLmdyY2xhc3MJCT0gbnYxMF9ncmFwaF9ncmNsYXNzOworCQllbmdpbmUtPmdyYXBoLmluaXQJCT0gbnYxMF9ncmFwaF9pbml0OworCQllbmdpbmUtPmdyYXBoLnRha2Vkb3duCQk9IG52MTBfZ3JhcGhfdGFrZWRvd247CisJCWVuZ2luZS0+Z3JhcGguY2hhbm5lbAkJPSBudjEwX2dyYXBoX2NoYW5uZWw7CisJCWVuZ2luZS0+Z3JhcGguY3JlYXRlX2NvbnRleHQJPSBudjEwX2dyYXBoX2NyZWF0ZV9jb250ZXh0OworCQllbmdpbmUtPmdyYXBoLmRlc3Ryb3lfY29udGV4dAk9IG52MTBfZ3JhcGhfZGVzdHJveV9jb250ZXh0OworCQllbmdpbmUtPmdyYXBoLmZpZm9fYWNjZXNzCT0gbnYwNF9ncmFwaF9maWZvX2FjY2VzczsKKwkJZW5naW5lLT5ncmFwaC5sb2FkX2NvbnRleHQJPSBudjEwX2dyYXBoX2xvYWRfY29udGV4dDsKKwkJZW5naW5lLT5ncmFwaC51bmxvYWRfY29udGV4dAk9IG52MTBfZ3JhcGhfdW5sb2FkX2NvbnRleHQ7CisJCWVuZ2luZS0+Zmlmby5jaGFubmVscwkJPSAzMjsKKwkJZW5naW5lLT5maWZvLmluaXQJCT0gbnYxMF9maWZvX2luaXQ7CisJCWVuZ2luZS0+Zmlmby50YWtlZG93bgkJPSBub3V2ZWF1X3N0dWJfdGFrZWRvd247CisJCWVuZ2luZS0+Zmlmby5kaXNhYmxlCQk9IG52MDRfZmlmb19kaXNhYmxlOworCQllbmdpbmUtPmZpZm8uZW5hYmxlCQk9IG52MDRfZmlmb19lbmFibGU7CisJCWVuZ2luZS0+Zmlmby5yZWFzc2lnbgkJPSBudjA0X2ZpZm9fcmVhc3NpZ247CisJCWVuZ2luZS0+Zmlmby5jaGFubmVsX2lkCQk9IG52MTBfZmlmb19jaGFubmVsX2lkOworCQllbmdpbmUtPmZpZm8uY3JlYXRlX2NvbnRleHQJPSBudjEwX2ZpZm9fY3JlYXRlX2NvbnRleHQ7CisJCWVuZ2luZS0+Zmlmby5kZXN0cm95X2NvbnRleHQJPSBudjEwX2ZpZm9fZGVzdHJveV9jb250ZXh0OworCQllbmdpbmUtPmZpZm8ubG9hZF9jb250ZXh0CT0gbnYxMF9maWZvX2xvYWRfY29udGV4dDsKKwkJZW5naW5lLT5maWZvLnVubG9hZF9jb250ZXh0CT0gbnYxMF9maWZvX3VubG9hZF9jb250ZXh0OworCQlicmVhazsKKwljYXNlIDB4MjA6CisJCWVuZ2luZS0+aW5zdG1lbS5pbml0CQk9IG52MDRfaW5zdG1lbV9pbml0OworCQllbmdpbmUtPmluc3RtZW0udGFrZWRvd24JPSBudjA0X2luc3RtZW1fdGFrZWRvd247CisJCWVuZ2luZS0+aW5zdG1lbS5zdXNwZW5kCQk9IG52MDRfaW5zdG1lbV9zdXNwZW5kOworCQllbmdpbmUtPmluc3RtZW0ucmVzdW1lCQk9IG52MDRfaW5zdG1lbV9yZXN1bWU7CisJCWVuZ2luZS0+aW5zdG1lbS5wb3B1bGF0ZQk9IG52MDRfaW5zdG1lbV9wb3B1bGF0ZTsKKwkJZW5naW5lLT5pbnN0bWVtLmNsZWFyCQk9IG52MDRfaW5zdG1lbV9jbGVhcjsKKwkJZW5naW5lLT5pbnN0bWVtLmJpbmQJCT0gbnYwNF9pbnN0bWVtX2JpbmQ7CisJCWVuZ2luZS0+aW5zdG1lbS51bmJpbmQJCT0gbnYwNF9pbnN0bWVtX3VuYmluZDsKKwkJZW5naW5lLT5pbnN0bWVtLnByZXBhcmVfYWNjZXNzCT0gbnYwNF9pbnN0bWVtX3ByZXBhcmVfYWNjZXNzOworCQllbmdpbmUtPmluc3RtZW0uZmluaXNoX2FjY2Vzcwk9IG52MDRfaW5zdG1lbV9maW5pc2hfYWNjZXNzOworCQllbmdpbmUtPm1jLmluaXQJCQk9IG52MDRfbWNfaW5pdDsKKwkJZW5naW5lLT5tYy50YWtlZG93bgkJPSBudjA0X21jX3Rha2Vkb3duOworCQllbmdpbmUtPnRpbWVyLmluaXQJCT0gbnYwNF90aW1lcl9pbml0OworCQllbmdpbmUtPnRpbWVyLnJlYWQJCT0gbnYwNF90aW1lcl9yZWFkOworCQllbmdpbmUtPnRpbWVyLnRha2Vkb3duCQk9IG52MDRfdGltZXJfdGFrZWRvd247CisJCWVuZ2luZS0+ZmIuaW5pdAkJCT0gbnYxMF9mYl9pbml0OworCQllbmdpbmUtPmZiLnRha2Vkb3duCQk9IG52MTBfZmJfdGFrZWRvd247CisJCWVuZ2luZS0+Z3JhcGguZ3JjbGFzcwkJPSBudjIwX2dyYXBoX2dyY2xhc3M7CisJCWVuZ2luZS0+Z3JhcGguaW5pdAkJPSBudjIwX2dyYXBoX2luaXQ7CisJCWVuZ2luZS0+Z3JhcGgudGFrZWRvd24JCT0gbnYyMF9ncmFwaF90YWtlZG93bjsKKwkJZW5naW5lLT5ncmFwaC5jaGFubmVsCQk9IG52MTBfZ3JhcGhfY2hhbm5lbDsKKwkJZW5naW5lLT5ncmFwaC5jcmVhdGVfY29udGV4dAk9IG52MjBfZ3JhcGhfY3JlYXRlX2NvbnRleHQ7CisJCWVuZ2luZS0+Z3JhcGguZGVzdHJveV9jb250ZXh0CT0gbnYyMF9ncmFwaF9kZXN0cm95X2NvbnRleHQ7CisJCWVuZ2luZS0+Z3JhcGguZmlmb19hY2Nlc3MJPSBudjA0X2dyYXBoX2ZpZm9fYWNjZXNzOworCQllbmdpbmUtPmdyYXBoLmxvYWRfY29udGV4dAk9IG52MjBfZ3JhcGhfbG9hZF9jb250ZXh0OworCQllbmdpbmUtPmdyYXBoLnVubG9hZF9jb250ZXh0CT0gbnYyMF9ncmFwaF91bmxvYWRfY29udGV4dDsKKwkJZW5naW5lLT5maWZvLmNoYW5uZWxzCQk9IDMyOworCQllbmdpbmUtPmZpZm8uaW5pdAkJPSBudjEwX2ZpZm9faW5pdDsKKwkJZW5naW5lLT5maWZvLnRha2Vkb3duCQk9IG5vdXZlYXVfc3R1Yl90YWtlZG93bjsKKwkJZW5naW5lLT5maWZvLmRpc2FibGUJCT0gbnYwNF9maWZvX2Rpc2FibGU7CisJCWVuZ2luZS0+Zmlmby5lbmFibGUJCT0gbnYwNF9maWZvX2VuYWJsZTsKKwkJZW5naW5lLT5maWZvLnJlYXNzaWduCQk9IG52MDRfZmlmb19yZWFzc2lnbjsKKwkJZW5naW5lLT5maWZvLmNoYW5uZWxfaWQJCT0gbnYxMF9maWZvX2NoYW5uZWxfaWQ7CisJCWVuZ2luZS0+Zmlmby5jcmVhdGVfY29udGV4dAk9IG52MTBfZmlmb19jcmVhdGVfY29udGV4dDsKKwkJZW5naW5lLT5maWZvLmRlc3Ryb3lfY29udGV4dAk9IG52MTBfZmlmb19kZXN0cm95X2NvbnRleHQ7CisJCWVuZ2luZS0+Zmlmby5sb2FkX2NvbnRleHQJPSBudjEwX2ZpZm9fbG9hZF9jb250ZXh0OworCQllbmdpbmUtPmZpZm8udW5sb2FkX2NvbnRleHQJPSBudjEwX2ZpZm9fdW5sb2FkX2NvbnRleHQ7CisJCWJyZWFrOworCWNhc2UgMHgzMDoKKwkJZW5naW5lLT5pbnN0bWVtLmluaXQJCT0gbnYwNF9pbnN0bWVtX2luaXQ7CisJCWVuZ2luZS0+aW5zdG1lbS50YWtlZG93bgk9IG52MDRfaW5zdG1lbV90YWtlZG93bjsKKwkJZW5naW5lLT5pbnN0bWVtLnN1c3BlbmQJCT0gbnYwNF9pbnN0bWVtX3N1c3BlbmQ7CisJCWVuZ2luZS0+aW5zdG1lbS5yZXN1bWUJCT0gbnYwNF9pbnN0bWVtX3Jlc3VtZTsKKwkJZW5naW5lLT5pbnN0bWVtLnBvcHVsYXRlCT0gbnYwNF9pbnN0bWVtX3BvcHVsYXRlOworCQllbmdpbmUtPmluc3RtZW0uY2xlYXIJCT0gbnYwNF9pbnN0bWVtX2NsZWFyOworCQllbmdpbmUtPmluc3RtZW0uYmluZAkJPSBudjA0X2luc3RtZW1fYmluZDsKKwkJZW5naW5lLT5pbnN0bWVtLnVuYmluZAkJPSBudjA0X2luc3RtZW1fdW5iaW5kOworCQllbmdpbmUtPmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MJPSBudjA0X2luc3RtZW1fcHJlcGFyZV9hY2Nlc3M7CisJCWVuZ2luZS0+aW5zdG1lbS5maW5pc2hfYWNjZXNzCT0gbnYwNF9pbnN0bWVtX2ZpbmlzaF9hY2Nlc3M7CisJCWVuZ2luZS0+bWMuaW5pdAkJCT0gbnYwNF9tY19pbml0OworCQllbmdpbmUtPm1jLnRha2Vkb3duCQk9IG52MDRfbWNfdGFrZWRvd247CisJCWVuZ2luZS0+dGltZXIuaW5pdAkJPSBudjA0X3RpbWVyX2luaXQ7CisJCWVuZ2luZS0+dGltZXIucmVhZAkJPSBudjA0X3RpbWVyX3JlYWQ7CisJCWVuZ2luZS0+dGltZXIudGFrZWRvd24JCT0gbnYwNF90aW1lcl90YWtlZG93bjsKKwkJZW5naW5lLT5mYi5pbml0CQkJPSBudjEwX2ZiX2luaXQ7CisJCWVuZ2luZS0+ZmIudGFrZWRvd24JCT0gbnYxMF9mYl90YWtlZG93bjsKKwkJZW5naW5lLT5ncmFwaC5ncmNsYXNzCQk9IG52MzBfZ3JhcGhfZ3JjbGFzczsKKwkJZW5naW5lLT5ncmFwaC5pbml0CQk9IG52MzBfZ3JhcGhfaW5pdDsKKwkJZW5naW5lLT5ncmFwaC50YWtlZG93bgkJPSBudjIwX2dyYXBoX3Rha2Vkb3duOworCQllbmdpbmUtPmdyYXBoLmZpZm9fYWNjZXNzCT0gbnYwNF9ncmFwaF9maWZvX2FjY2VzczsKKwkJZW5naW5lLT5ncmFwaC5jaGFubmVsCQk9IG52MTBfZ3JhcGhfY2hhbm5lbDsKKwkJZW5naW5lLT5ncmFwaC5jcmVhdGVfY29udGV4dAk9IG52MjBfZ3JhcGhfY3JlYXRlX2NvbnRleHQ7CisJCWVuZ2luZS0+Z3JhcGguZGVzdHJveV9jb250ZXh0CT0gbnYyMF9ncmFwaF9kZXN0cm95X2NvbnRleHQ7CisJCWVuZ2luZS0+Z3JhcGgubG9hZF9jb250ZXh0CT0gbnYyMF9ncmFwaF9sb2FkX2NvbnRleHQ7CisJCWVuZ2luZS0+Z3JhcGgudW5sb2FkX2NvbnRleHQJPSBudjIwX2dyYXBoX3VubG9hZF9jb250ZXh0OworCQllbmdpbmUtPmZpZm8uY2hhbm5lbHMJCT0gMzI7CisJCWVuZ2luZS0+Zmlmby5pbml0CQk9IG52MTBfZmlmb19pbml0OworCQllbmdpbmUtPmZpZm8udGFrZWRvd24JCT0gbm91dmVhdV9zdHViX3Rha2Vkb3duOworCQllbmdpbmUtPmZpZm8uZGlzYWJsZQkJPSBudjA0X2ZpZm9fZGlzYWJsZTsKKwkJZW5naW5lLT5maWZvLmVuYWJsZQkJPSBudjA0X2ZpZm9fZW5hYmxlOworCQllbmdpbmUtPmZpZm8ucmVhc3NpZ24JCT0gbnYwNF9maWZvX3JlYXNzaWduOworCQllbmdpbmUtPmZpZm8uY2hhbm5lbF9pZAkJPSBudjEwX2ZpZm9fY2hhbm5lbF9pZDsKKwkJZW5naW5lLT5maWZvLmNyZWF0ZV9jb250ZXh0CT0gbnYxMF9maWZvX2NyZWF0ZV9jb250ZXh0OworCQllbmdpbmUtPmZpZm8uZGVzdHJveV9jb250ZXh0CT0gbnYxMF9maWZvX2Rlc3Ryb3lfY29udGV4dDsKKwkJZW5naW5lLT5maWZvLmxvYWRfY29udGV4dAk9IG52MTBfZmlmb19sb2FkX2NvbnRleHQ7CisJCWVuZ2luZS0+Zmlmby51bmxvYWRfY29udGV4dAk9IG52MTBfZmlmb191bmxvYWRfY29udGV4dDsKKwkJYnJlYWs7CisJY2FzZSAweDQwOgorCWNhc2UgMHg2MDoKKwkJZW5naW5lLT5pbnN0bWVtLmluaXQJCT0gbnYwNF9pbnN0bWVtX2luaXQ7CisJCWVuZ2luZS0+aW5zdG1lbS50YWtlZG93bgk9IG52MDRfaW5zdG1lbV90YWtlZG93bjsKKwkJZW5naW5lLT5pbnN0bWVtLnN1c3BlbmQJCT0gbnYwNF9pbnN0bWVtX3N1c3BlbmQ7CisJCWVuZ2luZS0+aW5zdG1lbS5yZXN1bWUJCT0gbnYwNF9pbnN0bWVtX3Jlc3VtZTsKKwkJZW5naW5lLT5pbnN0bWVtLnBvcHVsYXRlCT0gbnYwNF9pbnN0bWVtX3BvcHVsYXRlOworCQllbmdpbmUtPmluc3RtZW0uY2xlYXIJCT0gbnYwNF9pbnN0bWVtX2NsZWFyOworCQllbmdpbmUtPmluc3RtZW0uYmluZAkJPSBudjA0X2luc3RtZW1fYmluZDsKKwkJZW5naW5lLT5pbnN0bWVtLnVuYmluZAkJPSBudjA0X2luc3RtZW1fdW5iaW5kOworCQllbmdpbmUtPmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MJPSBudjA0X2luc3RtZW1fcHJlcGFyZV9hY2Nlc3M7CisJCWVuZ2luZS0+aW5zdG1lbS5maW5pc2hfYWNjZXNzCT0gbnYwNF9pbnN0bWVtX2ZpbmlzaF9hY2Nlc3M7CisJCWVuZ2luZS0+bWMuaW5pdAkJCT0gbnY0MF9tY19pbml0OworCQllbmdpbmUtPm1jLnRha2Vkb3duCQk9IG52NDBfbWNfdGFrZWRvd247CisJCWVuZ2luZS0+dGltZXIuaW5pdAkJPSBudjA0X3RpbWVyX2luaXQ7CisJCWVuZ2luZS0+dGltZXIucmVhZAkJPSBudjA0X3RpbWVyX3JlYWQ7CisJCWVuZ2luZS0+dGltZXIudGFrZWRvd24JCT0gbnYwNF90aW1lcl90YWtlZG93bjsKKwkJZW5naW5lLT5mYi5pbml0CQkJPSBudjQwX2ZiX2luaXQ7CisJCWVuZ2luZS0+ZmIudGFrZWRvd24JCT0gbnY0MF9mYl90YWtlZG93bjsKKwkJZW5naW5lLT5ncmFwaC5ncmNsYXNzCQk9IG52NDBfZ3JhcGhfZ3JjbGFzczsKKwkJZW5naW5lLT5ncmFwaC5pbml0CQk9IG52NDBfZ3JhcGhfaW5pdDsKKwkJZW5naW5lLT5ncmFwaC50YWtlZG93bgkJPSBudjQwX2dyYXBoX3Rha2Vkb3duOworCQllbmdpbmUtPmdyYXBoLmZpZm9fYWNjZXNzCT0gbnYwNF9ncmFwaF9maWZvX2FjY2VzczsKKwkJZW5naW5lLT5ncmFwaC5jaGFubmVsCQk9IG52NDBfZ3JhcGhfY2hhbm5lbDsKKwkJZW5naW5lLT5ncmFwaC5jcmVhdGVfY29udGV4dAk9IG52NDBfZ3JhcGhfY3JlYXRlX2NvbnRleHQ7CisJCWVuZ2luZS0+Z3JhcGguZGVzdHJveV9jb250ZXh0CT0gbnY0MF9ncmFwaF9kZXN0cm95X2NvbnRleHQ7CisJCWVuZ2luZS0+Z3JhcGgubG9hZF9jb250ZXh0CT0gbnY0MF9ncmFwaF9sb2FkX2NvbnRleHQ7CisJCWVuZ2luZS0+Z3JhcGgudW5sb2FkX2NvbnRleHQJPSBudjQwX2dyYXBoX3VubG9hZF9jb250ZXh0OworCQllbmdpbmUtPmZpZm8uY2hhbm5lbHMJCT0gMzI7CisJCWVuZ2luZS0+Zmlmby5pbml0CQk9IG52NDBfZmlmb19pbml0OworCQllbmdpbmUtPmZpZm8udGFrZWRvd24JCT0gbm91dmVhdV9zdHViX3Rha2Vkb3duOworCQllbmdpbmUtPmZpZm8uZGlzYWJsZQkJPSBudjA0X2ZpZm9fZGlzYWJsZTsKKwkJZW5naW5lLT5maWZvLmVuYWJsZQkJPSBudjA0X2ZpZm9fZW5hYmxlOworCQllbmdpbmUtPmZpZm8ucmVhc3NpZ24JCT0gbnYwNF9maWZvX3JlYXNzaWduOworCQllbmdpbmUtPmZpZm8uY2hhbm5lbF9pZAkJPSBudjEwX2ZpZm9fY2hhbm5lbF9pZDsKKwkJZW5naW5lLT5maWZvLmNyZWF0ZV9jb250ZXh0CT0gbnY0MF9maWZvX2NyZWF0ZV9jb250ZXh0OworCQllbmdpbmUtPmZpZm8uZGVzdHJveV9jb250ZXh0CT0gbnY0MF9maWZvX2Rlc3Ryb3lfY29udGV4dDsKKwkJZW5naW5lLT5maWZvLmxvYWRfY29udGV4dAk9IG52NDBfZmlmb19sb2FkX2NvbnRleHQ7CisJCWVuZ2luZS0+Zmlmby51bmxvYWRfY29udGV4dAk9IG52NDBfZmlmb191bmxvYWRfY29udGV4dDsKKwkJYnJlYWs7CisJY2FzZSAweDUwOgorCWNhc2UgMHg4MDogLyogZ290dGEgbG92ZSBOVklESUEncyBjb25zaXN0ZW5jeS4uICovCisJY2FzZSAweDkwOgorCWNhc2UgMHhBMDoKKwkJZW5naW5lLT5pbnN0bWVtLmluaXQJCT0gbnY1MF9pbnN0bWVtX2luaXQ7CisJCWVuZ2luZS0+aW5zdG1lbS50YWtlZG93bgk9IG52NTBfaW5zdG1lbV90YWtlZG93bjsKKwkJZW5naW5lLT5pbnN0bWVtLnN1c3BlbmQJCT0gbnY1MF9pbnN0bWVtX3N1c3BlbmQ7CisJCWVuZ2luZS0+aW5zdG1lbS5yZXN1bWUJCT0gbnY1MF9pbnN0bWVtX3Jlc3VtZTsKKwkJZW5naW5lLT5pbnN0bWVtLnBvcHVsYXRlCT0gbnY1MF9pbnN0bWVtX3BvcHVsYXRlOworCQllbmdpbmUtPmluc3RtZW0uY2xlYXIJCT0gbnY1MF9pbnN0bWVtX2NsZWFyOworCQllbmdpbmUtPmluc3RtZW0uYmluZAkJPSBudjUwX2luc3RtZW1fYmluZDsKKwkJZW5naW5lLT5pbnN0bWVtLnVuYmluZAkJPSBudjUwX2luc3RtZW1fdW5iaW5kOworCQllbmdpbmUtPmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MJPSBudjUwX2luc3RtZW1fcHJlcGFyZV9hY2Nlc3M7CisJCWVuZ2luZS0+aW5zdG1lbS5maW5pc2hfYWNjZXNzCT0gbnY1MF9pbnN0bWVtX2ZpbmlzaF9hY2Nlc3M7CisJCWVuZ2luZS0+bWMuaW5pdAkJCT0gbnY1MF9tY19pbml0OworCQllbmdpbmUtPm1jLnRha2Vkb3duCQk9IG52NTBfbWNfdGFrZWRvd247CisJCWVuZ2luZS0+dGltZXIuaW5pdAkJPSBudjA0X3RpbWVyX2luaXQ7CisJCWVuZ2luZS0+dGltZXIucmVhZAkJPSBudjA0X3RpbWVyX3JlYWQ7CisJCWVuZ2luZS0+dGltZXIudGFrZWRvd24JCT0gbnYwNF90aW1lcl90YWtlZG93bjsKKwkJZW5naW5lLT5mYi5pbml0CQkJPSBub3V2ZWF1X3N0dWJfaW5pdDsKKwkJZW5naW5lLT5mYi50YWtlZG93bgkJPSBub3V2ZWF1X3N0dWJfdGFrZWRvd247CisJCWVuZ2luZS0+Z3JhcGguZ3JjbGFzcwkJPSBudjUwX2dyYXBoX2dyY2xhc3M7CisJCWVuZ2luZS0+Z3JhcGguaW5pdAkJPSBudjUwX2dyYXBoX2luaXQ7CisJCWVuZ2luZS0+Z3JhcGgudGFrZWRvd24JCT0gbnY1MF9ncmFwaF90YWtlZG93bjsKKwkJZW5naW5lLT5ncmFwaC5maWZvX2FjY2Vzcwk9IG52NTBfZ3JhcGhfZmlmb19hY2Nlc3M7CisJCWVuZ2luZS0+Z3JhcGguY2hhbm5lbAkJPSBudjUwX2dyYXBoX2NoYW5uZWw7CisJCWVuZ2luZS0+Z3JhcGguY3JlYXRlX2NvbnRleHQJPSBudjUwX2dyYXBoX2NyZWF0ZV9jb250ZXh0OworCQllbmdpbmUtPmdyYXBoLmRlc3Ryb3lfY29udGV4dAk9IG52NTBfZ3JhcGhfZGVzdHJveV9jb250ZXh0OworCQllbmdpbmUtPmdyYXBoLmxvYWRfY29udGV4dAk9IG52NTBfZ3JhcGhfbG9hZF9jb250ZXh0OworCQllbmdpbmUtPmdyYXBoLnVubG9hZF9jb250ZXh0CT0gbnY1MF9ncmFwaF91bmxvYWRfY29udGV4dDsKKwkJZW5naW5lLT5maWZvLmNoYW5uZWxzCQk9IDEyODsKKwkJZW5naW5lLT5maWZvLmluaXQJCT0gbnY1MF9maWZvX2luaXQ7CisJCWVuZ2luZS0+Zmlmby50YWtlZG93bgkJPSBudjUwX2ZpZm9fdGFrZWRvd247CisJCWVuZ2luZS0+Zmlmby5kaXNhYmxlCQk9IG52MDRfZmlmb19kaXNhYmxlOworCQllbmdpbmUtPmZpZm8uZW5hYmxlCQk9IG52MDRfZmlmb19lbmFibGU7CisJCWVuZ2luZS0+Zmlmby5yZWFzc2lnbgkJPSBudjA0X2ZpZm9fcmVhc3NpZ247CisJCWVuZ2luZS0+Zmlmby5jaGFubmVsX2lkCQk9IG52NTBfZmlmb19jaGFubmVsX2lkOworCQllbmdpbmUtPmZpZm8uY3JlYXRlX2NvbnRleHQJPSBudjUwX2ZpZm9fY3JlYXRlX2NvbnRleHQ7CisJCWVuZ2luZS0+Zmlmby5kZXN0cm95X2NvbnRleHQJPSBudjUwX2ZpZm9fZGVzdHJveV9jb250ZXh0OworCQllbmdpbmUtPmZpZm8ubG9hZF9jb250ZXh0CT0gbnY1MF9maWZvX2xvYWRfY29udGV4dDsKKwkJZW5naW5lLT5maWZvLnVubG9hZF9jb250ZXh0CT0gbnY1MF9maWZvX3VubG9hZF9jb250ZXh0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlOVl9FUlJPUihkZXYsICJOViUwMnggdW5zdXBwb3J0ZWRcbiIsIGRldl9wcml2LT5jaGlwc2V0KTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK25vdXZlYXVfdmdhX3NldF9kZWNvZGUodm9pZCAqcHJpdiwgYm9vbCBzdGF0ZSkKK3sKKwlpZiAoc3RhdGUpCisJCXJldHVybiBWR0FfUlNSQ19MRUdBQ1lfSU8gfCBWR0FfUlNSQ19MRUdBQ1lfTUVNIHwKKwkJICAgICAgIFZHQV9SU1JDX05PUk1BTF9JTyB8IFZHQV9SU1JDX05PUk1BTF9NRU07CisJZWxzZQorCQlyZXR1cm4gVkdBX1JTUkNfTk9STUFMX0lPIHwgVkdBX1JTUkNfTk9STUFMX01FTTsKK30KKworaW50Citub3V2ZWF1X2NhcmRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZW5naW5lICplbmdpbmU7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmo7CisJaW50IHJldDsKKworCU5WX0RFQlVHKGRldiwgInByZXYgc3RhdGUgPSAlZFxuIiwgZGV2X3ByaXYtPmluaXRfc3RhdGUpOworCisJaWYgKGRldl9wcml2LT5pbml0X3N0YXRlID09IE5PVVZFQVVfQ0FSRF9JTklUX0RPTkUpCisJCXJldHVybiAwOworCisJdmdhX2NsaWVudF9yZWdpc3RlcihkZXYtPnBkZXYsIGRldiwgTlVMTCwgbm91dmVhdV92Z2Ffc2V0X2RlY29kZSk7CisKKwkvKiBJbml0aWFsaXNlIGludGVybmFsIGRyaXZlciBBUEkgaG9va3MgKi8KKwlyZXQgPSBub3V2ZWF1X2luaXRfZW5naW5lX3B0cnMoZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWVuZ2luZSA9ICZkZXZfcHJpdi0+ZW5naW5lOworCWRldl9wcml2LT5pbml0X3N0YXRlID0gTk9VVkVBVV9DQVJEX0lOSVRfRkFJTEVEOworCisJLyogUGFyc2UgQklPUyB0YWJsZXMgLyBSdW4gaW5pdCB0YWJsZXMgaWYgY2FyZCBub3QgUE9TVGVkICovCisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpIHsKKwkJcmV0ID0gbm91dmVhdV9iaW9zX2luaXQoZGV2KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfZWFybHlfaW5pdChkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBJbml0aWFsaXNlIGluc3RhbmNlIG1lbW9yeSwgbXVzdCBoYXBwZW4gYmVmb3JlIG1lbV9pbml0IHNvIHdlCisJICoga25vdyBleGFjdGx5IGhvdyBtdWNoIFZSQU0gd2UncmUgYWJsZSB0byB1c2UgZm9yICJub3JtYWwiCisJICogcHVycG9zZXMuCisJICovCisJcmV0ID0gZW5naW5lLT5pbnN0bWVtLmluaXQoZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogU2V0dXAgdGhlIG1lbW9yeSBtYW5hZ2VyICovCisJcmV0ID0gbm91dmVhdV9tZW1faW5pdChkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9pbml0KGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFBNQyAqLworCXJldCA9IGVuZ2luZS0+bWMuaW5pdChkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBQVElNRVIgKi8KKwlyZXQgPSBlbmdpbmUtPnRpbWVyLmluaXQoZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogUEZCICovCisJcmV0ID0gZW5naW5lLT5mYi5pbml0KGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFBHUkFQSCAqLworCXJldCA9IGVuZ2luZS0+Z3JhcGguaW5pdChkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBQRklGTyAqLworCXJldCA9IGVuZ2luZS0+Zmlmby5pbml0KGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHRoaXMgY2FsbCBpcnFfcHJlaW5zdGFsbCwgcmVnaXN0ZXIgaXJxIGhhbmRsZXIgYW5kCisJICogY2FsbCBpcnFfcG9zdGluc3RhbGwKKwkgKi8KKwlyZXQgPSBkcm1faXJxX2luc3RhbGwoZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZHJtX3ZibGFua19pbml0KGRldiwgMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHdoYXQgYWJvdXQgUFZJREVPL1BDUlRDL1BSQU1EQUMgZXRjPyAqLworCisJcmV0ID0gbm91dmVhdV9jaGFubmVsX2FsbG9jKGRldiwgJmRldl9wcml2LT5jaGFubmVsLAorCQkJCSAgICAoc3RydWN0IGRybV9maWxlICopLTIsCisJCQkJICAgIE52RG1hRkIsIE52RG1hVFQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlncHVvYmogPSBOVUxMOworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2RtYV9uZXcoZGV2X3ByaXYtPmNoYW5uZWwsIE5WX0NMQVNTX0RNQV9JTl9NRU1PUlksCisJCQkJICAgICAwLCBub3V2ZWF1X21lbV9mYl9hbW91bnQoZGV2KSwKKwkJCQkgICAgIE5WX0RNQV9BQ0NFU1NfUlcsIE5WX0RNQV9UQVJHRVRfVklETUVNLAorCQkJCSAgICAgJmdwdW9iaik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX3JlZl9hZGQoZGV2LCBkZXZfcHJpdi0+Y2hhbm5lbCwgTnZEbWFWUkFNLAorCQkJCSAgICAgZ3B1b2JqLCBOVUxMKTsKKwlpZiAocmV0KSB7CisJCW5vdXZlYXVfZ3B1b2JqX2RlbChkZXYsICZncHVvYmopOworCQlyZXR1cm4gcmV0OworCX0KKworCWdwdW9iaiA9IE5VTEw7CisJcmV0ID0gbm91dmVhdV9ncHVvYmpfZ2FydF9kbWFfbmV3KGRldl9wcml2LT5jaGFubmVsLCAwLAorCQkJCQkgIGRldl9wcml2LT5nYXJ0X2luZm8uYXBlcl9zaXplLAorCQkJCQkgIE5WX0RNQV9BQ0NFU1NfUlcsICZncHVvYmosIE5VTEwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9yZWZfYWRkKGRldiwgZGV2X3ByaXYtPmNoYW5uZWwsIE52RG1hR0FSVCwKKwkJCQkgICAgIGdwdW9iaiwgTlVMTCk7CisJaWYgKHJldCkgeworCQlub3V2ZWF1X2dwdW9ial9kZWwoZGV2LCAmZ3B1b2JqKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkgeworCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkgeworCQkJcmV0ID0gbnY1MF9kaXNwbGF5X2NyZWF0ZShkZXYpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQl9IGVsc2UgeworCQkJcmV0ID0gbnYwNF9kaXNwbGF5X2NyZWF0ZShkZXYpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0ID0gbm91dmVhdV9iYWNrbGlnaHRfaW5pdChkZXYpOworCWlmIChyZXQpCisJCU5WX0VSUk9SKGRldiwgIkVycm9yICVkIHJlZ2lzdGVyaW5nIGJhY2tsaWdodFxuIiwgcmV0KTsKKworCWRldl9wcml2LT5pbml0X3N0YXRlID0gTk9VVkVBVV9DQVJEX0lOSVRfRE9ORTsKKworCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKQorCQlkcm1faGVscGVyX2luaXRpYWxfY29uZmlnKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbm91dmVhdV9jYXJkX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmdpbmUgKmVuZ2luZSA9ICZkZXZfcHJpdi0+ZW5naW5lOworCisJTlZfREVCVUcoZGV2LCAicHJldiBzdGF0ZSA9ICVkXG4iLCBkZXZfcHJpdi0+aW5pdF9zdGF0ZSk7CisKKwlpZiAoZGV2X3ByaXYtPmluaXRfc3RhdGUgIT0gTk9VVkVBVV9DQVJEX0lOSVRfRE9XTikgeworCQlub3V2ZWF1X2JhY2tsaWdodF9leGl0KGRldik7CisKKwkJaWYgKGRldl9wcml2LT5jaGFubmVsKSB7CisJCQlub3V2ZWF1X2NoYW5uZWxfZnJlZShkZXZfcHJpdi0+Y2hhbm5lbCk7CisJCQlkZXZfcHJpdi0+Y2hhbm5lbCA9IE5VTEw7CisJCX0KKworCQllbmdpbmUtPmZpZm8udGFrZWRvd24oZGV2KTsKKwkJZW5naW5lLT5ncmFwaC50YWtlZG93bihkZXYpOworCQllbmdpbmUtPmZiLnRha2Vkb3duKGRldik7CisJCWVuZ2luZS0+dGltZXIudGFrZWRvd24oZGV2KTsKKwkJZW5naW5lLT5tYy50YWtlZG93bihkZXYpOworCisJCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwkJdHRtX2JvX2NsZWFuX21tKCZkZXZfcHJpdi0+dHRtLmJkZXYsIFRUTV9QTF9UVCk7CisJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCQlub3V2ZWF1X3NnZG1hX3Rha2Vkb3duKGRldik7CisKKwkJbm91dmVhdV9ncHVvYmpfdGFrZWRvd24oZGV2KTsKKwkJbm91dmVhdV9tZW1fY2xvc2UoZGV2KTsKKwkJZW5naW5lLT5pbnN0bWVtLnRha2Vkb3duKGRldik7CisKKwkJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpCisJCQlkcm1faXJxX3VuaW5zdGFsbChkZXYpOworCisJCW5vdXZlYXVfZ3B1b2JqX2xhdGVfdGFrZWRvd24oZGV2KTsKKwkJbm91dmVhdV9iaW9zX3Rha2Vkb3duKGRldik7CisKKwkJdmdhX2NsaWVudF9yZWdpc3RlcihkZXYtPnBkZXYsIE5VTEwsIE5VTEwsIE5VTEwpOworCisJCWRldl9wcml2LT5pbml0X3N0YXRlID0gTk9VVkVBVV9DQVJEX0lOSVRfRE9XTjsKKwl9Cit9CisKKy8qIGhlcmUgYSBjbGllbnQgZGllcywgcmVsZWFzZSB0aGUgc3R1ZmYgdGhhdCB3YXMgYWxsb2NhdGVkIGZvciBpdHMKKyAqIGZpbGVfcHJpdiAqLwordm9pZCBub3V2ZWF1X3ByZWNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCW5vdXZlYXVfY2hhbm5lbF9jbGVhbnVwKGRldiwgZmlsZV9wcml2KTsKK30KKworLyogZmlyc3QgbW9kdWxlIGxvYWQsIHNldHVwIHRoZSBtbWlvL2ZiIG1hcHBpbmcgKi8KKy8qIEtNUzogd2UgbmVlZCBtbWlvIGF0IGxvYWQgdGltZSwgbm90IHdoZW4gdGhlIGZpcnN0IGRybSBjbGllbnQgb3BlbnMuICovCitpbnQgbm91dmVhdV9maXJzdG9wZW4oc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworLyogaWYgd2UgaGF2ZSBhbiBPRiBjYXJkLCBjb3B5IHZiaW9zIHRvIFJBTUlOICovCitzdGF0aWMgdm9pZCBub3V2ZWF1X09GX2NvcHlfdmJpb3NfdG9fcmFtaW4oc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKyNpZiBkZWZpbmVkKF9fcG93ZXJwY19fKQorCWludCBzaXplLCBpOworCWNvbnN0IHVpbnQzMl90ICpiaW9zOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4gPSBwY2lfZGV2aWNlX3RvX09GX25vZGUoZGV2LT5wZGV2KTsKKwlpZiAoIWRuKSB7CisJCU5WX0lORk8oZGV2LCAiVW5hYmxlIHRvIGdldCB0aGUgT0Ygbm9kZVxuIik7CisJCXJldHVybjsKKwl9CisKKwliaW9zID0gb2ZfZ2V0X3Byb3BlcnR5KGRuLCAiTlZEQSxCTVAiLCAmc2l6ZSk7CisJaWYgKGJpb3MpIHsKKwkJZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gNCkKKwkJCW52X3dpMzIoZGV2LCBpLCBiaW9zW2kvNF0pOworCQlOVl9JTkZPKGRldiwgIk9GIGJpb3Mgc3VjY2Vzc2Z1bGx5IGNvcGllZCAoJWQgYnl0ZXMpXG4iLCBzaXplKTsKKwl9IGVsc2UgeworCQlOVl9JTkZPKGRldiwgIlVuYWJsZSB0byBnZXQgdGhlIE9GIGJpb3NcbiIpOworCX0KKyNlbmRpZgorfQorCitpbnQgbm91dmVhdV9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2OworCXVpbnQzMl90IHJlZzA7CisJcmVzb3VyY2Vfc2l6ZV90IG1taW9fc3RhcnRfb2ZmczsKKworCWRldl9wcml2ID0ga3phbGxvYyhzaXplb2YoKmRldl9wcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXZfcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisJZGV2LT5kZXZfcHJpdmF0ZSA9IGRldl9wcml2OworCWRldl9wcml2LT5kZXYgPSBkZXY7CisKKwlkZXZfcHJpdi0+ZmxhZ3MgPSBmbGFncyAmIE5PVVZFQVVfRkxBR1M7CisJZGV2X3ByaXYtPmluaXRfc3RhdGUgPSBOT1VWRUFVX0NBUkRfSU5JVF9ET1dOOworCisJTlZfREVCVUcoZGV2LCAidmVuZG9yOiAweCVYIGRldmljZTogMHglWCBjbGFzczogMHglWFxuIiwKKwkJIGRldi0+cGNpX3ZlbmRvciwgZGV2LT5wY2lfZGV2aWNlLCBkZXYtPnBkZXYtPmNsYXNzKTsKKworCWRldl9wcml2LT5hY3BpX2RzbSA9IG5vdXZlYXVfZHNtX3Byb2JlKGRldik7CisKKwlpZiAoZGV2X3ByaXYtPmFjcGlfZHNtKQorCQlub3V2ZWF1X2h5YnJpZF9zZXR1cChkZXYpOworCisJZGV2X3ByaXYtPndxID0gY3JlYXRlX3dvcmtxdWV1ZSgibm91dmVhdSIpOworCWlmICghZGV2X3ByaXYtPndxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHJlc291cmNlIDAgaXMgbW1pbyByZWdzICovCisJLyogcmVzb3VyY2UgMSBpcyBsaW5lYXIgRkIgKi8KKwkvKiByZXNvdXJjZSAyIGlzIFJBTUlOIChtbWlvIHJlZ3MgKyAweDEwMDAwMDApICovCisJLyogcmVzb3VyY2UgNiBpcyBiaW9zICovCisKKwkvKiBtYXAgdGhlIG1taW8gcmVncyAqLworCW1taW9fc3RhcnRfb2ZmcyA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDApOworCWRldl9wcml2LT5tbWlvID0gaW9yZW1hcChtbWlvX3N0YXJ0X29mZnMsIDB4MDA4MDAwMDApOworCWlmICghZGV2X3ByaXYtPm1taW8pIHsKKwkJTlZfRVJST1IoZGV2LCAiVW5hYmxlIHRvIGluaXRpYWxpemUgdGhlIG1taW8gbWFwcGluZy4gIgorCQkJICJQbGVhc2UgcmVwb3J0IHlvdXIgc2V0dXAgdG8gIiBEUklWRVJfRU1BSUwgIlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlOVl9ERUJVRyhkZXYsICJyZWdzIG1hcHBlZCBvayBhdCAweCVsbHhcbiIsCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbW1pb19zdGFydF9vZmZzKTsKKworI2lmZGVmIF9fQklHX0VORElBTgorCS8qIFB1dCB0aGUgY2FyZCBpbiBCRSBtb2RlIGlmIGl0J3Mgbm90ICovCisJaWYgKG52X3JkMzIoZGV2LCBOVjAzX1BNQ19CT09UXzEpKQorCQludl93cjMyKGRldiwgTlYwM19QTUNfQk9PVF8xLCAweDAwMDAwMDAxKTsKKworCURSTV9NRU1PUllCQVJSSUVSKCk7CisjZW5kaWYKKworCS8qIFRpbWUgdG8gZGV0ZXJtaW5lIHRoZSBjYXJkIGFyY2hpdGVjdHVyZSAqLworCXJlZzAgPSBudl9yZDMyKGRldiwgTlYwM19QTUNfQk9PVF8wKTsKKworCS8qIFdlJ3JlIGRlYWxpbmcgd2l0aCA+PU5WMTAgKi8KKwlpZiAoKHJlZzAgJiAweDBmMDAwMDAwKSA+IDApIHsKKwkJLyogQml0IDI3LTIwIGNvbnRhaW4gdGhlIGFyY2hpdGVjdHVyZSBpbiBoZXggKi8KKwkJZGV2X3ByaXYtPmNoaXBzZXQgPSAocmVnMCAmIDB4ZmYwMDAwMCkgPj4gMjA7CisJLyogTlYwNCBvciBOVjA1ICovCisJfSBlbHNlIGlmICgocmVnMCAmIDB4ZmYwMGZmZjApID09IDB4MjAwMDQwMDApIHsKKwkJZGV2X3ByaXYtPmNoaXBzZXQgPSAweDA0OworCX0gZWxzZQorCQlkZXZfcHJpdi0+Y2hpcHNldCA9IDB4ZmY7CisKKwlzd2l0Y2ggKGRldl9wcml2LT5jaGlwc2V0ICYgMHhmMCkgeworCWNhc2UgMHgwMDoKKwljYXNlIDB4MTA6CisJY2FzZSAweDIwOgorCWNhc2UgMHgzMDoKKwkJZGV2X3ByaXYtPmNhcmRfdHlwZSA9IGRldl9wcml2LT5jaGlwc2V0ICYgMHhmMDsKKwkJYnJlYWs7CisJY2FzZSAweDQwOgorCWNhc2UgMHg2MDoKKwkJZGV2X3ByaXYtPmNhcmRfdHlwZSA9IE5WXzQwOworCQlicmVhazsKKwljYXNlIDB4NTA6CisJY2FzZSAweDgwOgorCWNhc2UgMHg5MDoKKwljYXNlIDB4YTA6CisJCWRldl9wcml2LT5jYXJkX3R5cGUgPSBOVl81MDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTlZfSU5GTyhkZXYsICJVbnN1cHBvcnRlZCBjaGlwc2V0IDB4JTA4eFxuIiwgcmVnMCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCU5WX0lORk8oZGV2LCAiRGV0ZWN0ZWQgYW4gTlYlMnggZ2VuZXJhdGlvbiBjYXJkICgweCUwOHgpXG4iLAorCQlkZXZfcHJpdi0+Y2FyZF90eXBlLCByZWcwKTsKKworCS8qIG1hcCBsYXJnZXIgUkFNSU4gYXBlcnR1cmUgb24gTlY0MCBjYXJkcyAqLworCWRldl9wcml2LT5yYW1pbiAgPSBOVUxMOworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzQwKSB7CisJCWludCByYW1pbl9iYXIgPSAyOworCQlpZiAocGNpX3Jlc291cmNlX2xlbihkZXYtPnBkZXYsIHJhbWluX2JhcikgPT0gMCkKKwkJCXJhbWluX2JhciA9IDM7CisKKwkJZGV2X3ByaXYtPnJhbWluX3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgcmFtaW5fYmFyKTsKKwkJZGV2X3ByaXYtPnJhbWluID0gaW9yZW1hcCgKKwkJCQlwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCByYW1pbl9iYXIpLAorCQkJCWRldl9wcml2LT5yYW1pbl9zaXplKTsKKwkJaWYgKCFkZXZfcHJpdi0+cmFtaW4pIHsKKwkJCU5WX0VSUk9SKGRldiwgIkZhaWxlZCB0byBpbml0IFJBTUlOIG1hcHBpbmcsICIKKwkJCQkgICAgICAibGltaXRlZCBpbnN0YW5jZSBtZW1vcnkgYXZhaWxhYmxlXG4iKTsKKwkJfQorCX0KKworCS8qIE9uIG9sZGVyIGNhcmRzIChvciBpZiB0aGUgYWJvdmUgZmFpbGVkKSwgY3JlYXRlIGEgbWFwIGNvdmVyaW5nCisJICogdGhlIEJBUjAgUFJBTUlOIGFwZXJ0dXJlICovCisJaWYgKCFkZXZfcHJpdi0+cmFtaW4pIHsKKwkJZGV2X3ByaXYtPnJhbWluX3NpemUgPSAxICogMTAyNCAqIDEwMjQ7CisJCWRldl9wcml2LT5yYW1pbiA9IGlvcmVtYXAobW1pb19zdGFydF9vZmZzICsgTlZfUkFNSU4sCisJCQkJCQkJZGV2X3ByaXYtPnJhbWluX3NpemUpOworCQlpZiAoIWRldl9wcml2LT5yYW1pbikgeworCQkJTlZfRVJST1IoZGV2LCAiRmFpbGVkIHRvIG1hcCBCQVIwIFBSQU1JTi5cbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKwlub3V2ZWF1X09GX2NvcHlfdmJpb3NfdG9fcmFtaW4oZGV2KTsKKworCS8qIFNwZWNpYWwgZmxhZ3MgKi8KKwlpZiAoZGV2LT5wY2lfZGV2aWNlID09IDB4MDFhMCkKKwkJZGV2X3ByaXYtPmZsYWdzIHw9IE5WX05GT1JDRTsKKwllbHNlIGlmIChkZXYtPnBjaV9kZXZpY2UgPT0gMHgwMWYwKQorCQlkZXZfcHJpdi0+ZmxhZ3MgfD0gTlZfTkZPUkNFMjsKKworCS8qIEZvciBrZXJuZWwgbW9kZXNldHRpbmcsIGluaXQgY2FyZCBub3cgYW5kIGJyaW5nIHVwIGZiY29uICovCisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpIHsKKwkJaW50IHJldCA9IG5vdXZlYXVfY2FyZF9pbml0KGRldik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBub3V2ZWF1X2Nsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCS8qIEluIHRoZSBjYXNlIG9mIGFuIGVycm9yIGRldl9wcml2IG1heSBub3QgYmUgYmUgYWxsb2NhdGVkIHlldCAqLworCWlmIChkZXZfcHJpdiAmJiBkZXZfcHJpdi0+Y2FyZF90eXBlKQorCQlub3V2ZWF1X2NhcmRfdGFrZWRvd24oZGV2KTsKK30KKworLyogS01TOiB3ZSBuZWVkIG1taW8gYXQgbG9hZCB0aW1lLCBub3Qgd2hlbiB0aGUgZmlyc3QgZHJtIGNsaWVudCBvcGVucy4gKi8KK3ZvaWQgbm91dmVhdV9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKKwkJcmV0dXJuOworCisJbm91dmVhdV9jbG9zZShkZXYpOworfQorCitpbnQgbm91dmVhdV91bmxvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpIHsKKwkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApCisJCQludjUwX2Rpc3BsYXlfZGVzdHJveShkZXYpOworCQllbHNlCisJCQludjA0X2Rpc3BsYXlfZGVzdHJveShkZXYpOworCQlub3V2ZWF1X2Nsb3NlKGRldik7CisJfQorCisJaW91bm1hcChkZXZfcHJpdi0+bW1pbyk7CisJaW91bm1hcChkZXZfcHJpdi0+cmFtaW4pOworCisJa2ZyZWUoZGV2X3ByaXYpOworCWRldi0+ZGV2X3ByaXZhdGUgPSBOVUxMOworCXJldHVybiAwOworfQorCitpbnQKK25vdXZlYXVfaW9jdGxfY2FyZF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlyZXR1cm4gbm91dmVhdV9jYXJkX2luaXQoZGV2KTsKK30KKworaW50IG5vdXZlYXVfaW9jdGxfZ2V0cGFyYW0oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJCQkJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9ub3V2ZWF1X2dldHBhcmFtICpnZXRwYXJhbSA9IGRhdGE7CisKKwlOT1VWRUFVX0NIRUNLX0lOSVRJQUxJU0VEX1dJVEhfUkVUVVJOOworCisJc3dpdGNoIChnZXRwYXJhbS0+cGFyYW0pIHsKKwljYXNlIE5PVVZFQVVfR0VUUEFSQU1fQ0hJUFNFVF9JRDoKKwkJZ2V0cGFyYW0tPnZhbHVlID0gZGV2X3ByaXYtPmNoaXBzZXQ7CisJCWJyZWFrOworCWNhc2UgTk9VVkVBVV9HRVRQQVJBTV9QQ0lfVkVORE9SOgorCQlnZXRwYXJhbS0+dmFsdWUgPSBkZXYtPnBjaV92ZW5kb3I7CisJCWJyZWFrOworCWNhc2UgTk9VVkVBVV9HRVRQQVJBTV9QQ0lfREVWSUNFOgorCQlnZXRwYXJhbS0+dmFsdWUgPSBkZXYtPnBjaV9kZXZpY2U7CisJCWJyZWFrOworCWNhc2UgTk9VVkVBVV9HRVRQQVJBTV9CVVNfVFlQRToKKwkJaWYgKGRybV9kZXZpY2VfaXNfYWdwKGRldikpCisJCQlnZXRwYXJhbS0+dmFsdWUgPSBOVl9BR1A7CisJCWVsc2UgaWYgKGRybV9kZXZpY2VfaXNfcGNpZShkZXYpKQorCQkJZ2V0cGFyYW0tPnZhbHVlID0gTlZfUENJRTsKKwkJZWxzZQorCQkJZ2V0cGFyYW0tPnZhbHVlID0gTlZfUENJOworCQlicmVhazsKKwljYXNlIE5PVVZFQVVfR0VUUEFSQU1fRkJfUEhZU0lDQUw6CisJCWdldHBhcmFtLT52YWx1ZSA9IGRldl9wcml2LT5mYl9waHlzOworCQlicmVhazsKKwljYXNlIE5PVVZFQVVfR0VUUEFSQU1fQUdQX1BIWVNJQ0FMOgorCQlnZXRwYXJhbS0+dmFsdWUgPSBkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfYmFzZTsKKwkJYnJlYWs7CisJY2FzZSBOT1VWRUFVX0dFVFBBUkFNX1BDSV9QSFlTSUNBTDoKKwkJaWYgKGRldi0+c2cpIHsKKwkJCWdldHBhcmFtLT52YWx1ZSA9ICh1bnNpZ25lZCBsb25nKWRldi0+c2ctPnZpcnR1YWw7CisJCX0gZWxzZSB7CisJCQlOVl9FUlJPUihkZXYsICJSZXF1ZXN0ZWQgUENJR0FSVCBhZGRyZXNzLCAiCisJCQkJCSJ3aGlsZSBubyBQQ0lHQVJUIHdhcyBjcmVhdGVkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWNhc2UgTk9VVkVBVV9HRVRQQVJBTV9GQl9TSVpFOgorCQlnZXRwYXJhbS0+dmFsdWUgPSBkZXZfcHJpdi0+ZmJfYXZhaWxhYmxlX3NpemU7CisJCWJyZWFrOworCWNhc2UgTk9VVkVBVV9HRVRQQVJBTV9BR1BfU0laRToKKwkJZ2V0cGFyYW0tPnZhbHVlID0gZGV2X3ByaXYtPmdhcnRfaW5mby5hcGVyX3NpemU7CisJCWJyZWFrOworCWNhc2UgTk9VVkVBVV9HRVRQQVJBTV9WTV9WUkFNX0JBU0U6CisJCWdldHBhcmFtLT52YWx1ZSA9IGRldl9wcml2LT52bV92cmFtX2Jhc2U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCU5WX0VSUk9SKGRldiwgInVua25vd24gcGFyYW1ldGVyICVsbGRcbiIsIGdldHBhcmFtLT5wYXJhbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitpbnQKK25vdXZlYXVfaW9jdGxfc2V0cGFyYW0oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJICAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9zZXRwYXJhbSAqc2V0cGFyYW0gPSBkYXRhOworCisJTk9VVkVBVV9DSEVDS19JTklUSUFMSVNFRF9XSVRIX1JFVFVSTjsKKworCXN3aXRjaCAoc2V0cGFyYW0tPnBhcmFtKSB7CisJZGVmYXVsdDoKKwkJTlZfRVJST1IoZGV2LCAidW5rbm93biBwYXJhbWV0ZXIgJWxsZFxuIiwgc2V0cGFyYW0tPnBhcmFtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFdhaXQgdW50aWwgKHZhbHVlKHJlZykgJiBtYXNrKSA9PSB2YWwsIHVwIHVudGlsIHRpbWVvdXQgaGFzIGhpdCAqLworYm9vbCBub3V2ZWF1X3dhaXRfdW50aWwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDY0X3QgdGltZW91dCwKKwkJCXVpbnQzMl90IHJlZywgdWludDMyX3QgbWFzaywgdWludDMyX3QgdmFsKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfdGltZXJfZW5naW5lICpwdGltZXIgPSAmZGV2X3ByaXYtPmVuZ2luZS50aW1lcjsKKwl1aW50NjRfdCBzdGFydCA9IHB0aW1lci0+cmVhZChkZXYpOworCisJZG8geworCQlpZiAoKG52X3JkMzIoZGV2LCByZWcpICYgbWFzaykgPT0gdmFsKQorCQkJcmV0dXJuIHRydWU7CisJfSB3aGlsZSAocHRpbWVyLT5yZWFkKGRldikgLSBzdGFydCA8IHRpbWVvdXQpOworCisJcmV0dXJuIGZhbHNlOworfQorCisvKiBXYWl0cyBmb3IgUEdSQVBIIHRvIGdvIGNvbXBsZXRlbHkgaWRsZSAqLworYm9vbCBub3V2ZWF1X3dhaXRfZm9yX2lkbGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlpZiAoIW52X3dhaXQoTlYwNF9QR1JBUEhfU1RBVFVTLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwKSkgeworCQlOVl9FUlJPUihkZXYsICJQR1JBUEggaWRsZSB0aW1lZCBvdXQgd2l0aCBzdGF0dXMgMHglMDh4XG4iLAorCQkJIG52X3JkMzIoZGV2LCBOVjA0X1BHUkFQSF9TVEFUVVMpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3R0bS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV90dG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODdlYjg0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV90dG0uYwpAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUWC4sIFVTQSwKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgVk13YXJlLCBJbmMuLCBQYWxvIEFsdG8sIENBLiwgVVNBLAorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQorICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKworc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBub3V2ZWF1X3R0bV92bV9vcHM7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0ICp0dG1fdm1fb3BzOworCitzdGF0aWMgaW50Citub3V2ZWF1X3R0bV9mYXVsdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHZtX2ZhdWx0ICp2bWYpCit7CisJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyA9IHZtYS0+dm1fcHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisKKwlpZiAodW5saWtlbHkoYm8gPT0gTlVMTCkpCisJCXJldHVybiBWTV9GQVVMVF9OT1BBR0U7CisKKwlyZXQgPSB0dG1fdm1fb3BzLT5mYXVsdCh2bWEsIHZtZik7CisJcmV0dXJuIHJldDsKK30KKworaW50Citub3V2ZWF1X3R0bV9tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPQorCQlmaWxlX3ByaXYtPm1pbm9yLT5kZXYtPmRldl9wcml2YXRlOworCWludCByZXQ7CisKKwlpZiAodW5saWtlbHkodm1hLT52bV9wZ29mZiA8IERSTV9GSUxFX1BBR0VfT0ZGU0VUKSkKKwkJcmV0dXJuIGRybV9tbWFwKGZpbHAsIHZtYSk7CisKKwlyZXQgPSB0dG1fYm9fbW1hcChmaWxwLCB2bWEsICZkZXZfcHJpdi0+dHRtLmJkZXYpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCXJldHVybiByZXQ7CisKKwlpZiAodW5saWtlbHkodHRtX3ZtX29wcyA9PSBOVUxMKSkgeworCQl0dG1fdm1fb3BzID0gdm1hLT52bV9vcHM7CisJCW5vdXZlYXVfdHRtX3ZtX29wcyA9ICp0dG1fdm1fb3BzOworCQlub3V2ZWF1X3R0bV92bV9vcHMuZmF1bHQgPSAmbm91dmVhdV90dG1fZmF1bHQ7CisJfQorCisJdm1hLT52bV9vcHMgPSAmbm91dmVhdV90dG1fdm1fb3BzOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citub3V2ZWF1X3R0bV9tZW1fZ2xvYmFsX2luaXQoc3RydWN0IHR0bV9nbG9iYWxfcmVmZXJlbmNlICpyZWYpCit7CisJcmV0dXJuIHR0bV9tZW1fZ2xvYmFsX2luaXQocmVmLT5vYmplY3QpOworfQorCitzdGF0aWMgdm9pZAorbm91dmVhdV90dG1fbWVtX2dsb2JhbF9yZWxlYXNlKHN0cnVjdCB0dG1fZ2xvYmFsX3JlZmVyZW5jZSAqcmVmKQoreworCXR0bV9tZW1fZ2xvYmFsX3JlbGVhc2UocmVmLT5vYmplY3QpOworfQorCitpbnQKK25vdXZlYXVfdHRtX2dsb2JhbF9pbml0KHN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwlzdHJ1Y3QgdHRtX2dsb2JhbF9yZWZlcmVuY2UgKmdsb2JhbF9yZWY7CisJaW50IHJldDsKKworCWdsb2JhbF9yZWYgPSAmZGV2X3ByaXYtPnR0bS5tZW1fZ2xvYmFsX3JlZjsKKwlnbG9iYWxfcmVmLT5nbG9iYWxfdHlwZSA9IFRUTV9HTE9CQUxfVFRNX01FTTsKKwlnbG9iYWxfcmVmLT5zaXplID0gc2l6ZW9mKHN0cnVjdCB0dG1fbWVtX2dsb2JhbCk7CisJZ2xvYmFsX3JlZi0+aW5pdCA9ICZub3V2ZWF1X3R0bV9tZW1fZ2xvYmFsX2luaXQ7CisJZ2xvYmFsX3JlZi0+cmVsZWFzZSA9ICZub3V2ZWF1X3R0bV9tZW1fZ2xvYmFsX3JlbGVhc2U7CisKKwlyZXQgPSB0dG1fZ2xvYmFsX2l0ZW1fcmVmKGdsb2JhbF9yZWYpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgc2V0dGluZyB1cCBUVE0gbWVtb3J5IGFjY291bnRpbmdcbiIpOworCQlkZXZfcHJpdi0+dHRtLm1lbV9nbG9iYWxfcmVmLnJlbGVhc2UgPSBOVUxMOworCQlyZXR1cm4gcmV0OworCX0KKworCWRldl9wcml2LT50dG0uYm9fZ2xvYmFsX3JlZi5tZW1fZ2xvYiA9IGdsb2JhbF9yZWYtPm9iamVjdDsKKwlnbG9iYWxfcmVmID0gJmRldl9wcml2LT50dG0uYm9fZ2xvYmFsX3JlZi5yZWY7CisJZ2xvYmFsX3JlZi0+Z2xvYmFsX3R5cGUgPSBUVE1fR0xPQkFMX1RUTV9CTzsKKwlnbG9iYWxfcmVmLT5zaXplID0gc2l6ZW9mKHN0cnVjdCB0dG1fYm9fZ2xvYmFsKTsKKwlnbG9iYWxfcmVmLT5pbml0ID0gJnR0bV9ib19nbG9iYWxfaW5pdDsKKwlnbG9iYWxfcmVmLT5yZWxlYXNlID0gJnR0bV9ib19nbG9iYWxfcmVsZWFzZTsKKworCXJldCA9IHR0bV9nbG9iYWxfaXRlbV9yZWYoZ2xvYmFsX3JlZik7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQlEUk1fRVJST1IoIkZhaWxlZCBzZXR0aW5nIHVwIFRUTSBCTyBzdWJzeXN0ZW1cbiIpOworCQl0dG1fZ2xvYmFsX2l0ZW1fdW5yZWYoJmRldl9wcml2LT50dG0ubWVtX2dsb2JhbF9yZWYpOworCQlkZXZfcHJpdi0+dHRtLm1lbV9nbG9iYWxfcmVmLnJlbGVhc2UgPSBOVUxMOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCit2b2lkCitub3V2ZWF1X3R0bV9nbG9iYWxfcmVsZWFzZShzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJaWYgKGRldl9wcml2LT50dG0ubWVtX2dsb2JhbF9yZWYucmVsZWFzZSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwl0dG1fZ2xvYmFsX2l0ZW1fdW5yZWYoJmRldl9wcml2LT50dG0uYm9fZ2xvYmFsX3JlZi5yZWYpOworCXR0bV9nbG9iYWxfaXRlbV91bnJlZigmZGV2X3ByaXYtPnR0bS5tZW1fZ2xvYmFsX3JlZik7CisJZGV2X3ByaXYtPnR0bS5tZW1fZ2xvYmFsX3JlZi5yZWxlYXNlID0gTlVMTDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2NydGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTEzNjM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9jcnRjLmMKQEAgLTAsMCArMSwxMDAyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTMtMjAwMyBOVklESUEsIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgMjAwNiBEYXZlIEFpcmxpZQorICogQ29weXJpZ2h0IDIwMDcgTWFhcnRlbiBNYWF0aHVpcworICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybV9jcnRjX2hlbHBlci5oIgorCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2VuY29kZXIuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Nvbm5lY3Rvci5oIgorI2luY2x1ZGUgIm5vdXZlYXVfY3J0Yy5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZmIuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2h3LmgiCisjaW5jbHVkZSAibnZyZWcuaCIKKworc3RhdGljIGludAorbnYwNF9jcnRjX21vZGVfc2V0X2Jhc2Uoc3RydWN0IGRybV9jcnRjICpjcnRjLCBpbnQgeCwgaW50IHksCisJCQlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpvbGRfZmIpOworCitzdGF0aWMgdm9pZAorY3J0Y193cl9jaW9fc3RhdGUoc3RydWN0IGRybV9jcnRjICpjcnRjLCBzdHJ1Y3QgbnYwNF9jcnRjX3JlZyAqY3J0Y3N0YXRlLCBpbnQgaW5kZXgpCit7CisJTlZXcml0ZVZnYUNydGMoY3J0Yy0+ZGV2LCBub3V2ZWF1X2NydGMoY3J0YyktPmluZGV4LCBpbmRleCwKKwkJICAgICAgIGNydGNzdGF0ZS0+Q1JUQ1tpbmRleF0pOworfQorCitzdGF0aWMgdm9pZCBudl9jcnRjX3NldF9kaWdpdGFsX3ZpYnJhbmNlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IGxldmVsKQoreworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gY3J0Yy0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnYwNF9jcnRjX3JlZyAqcmVncCA9ICZkZXZfcHJpdi0+bW9kZV9yZWcuY3J0Y19yZWdbbnZfY3J0Yy0+aW5kZXhdOworCisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JFX0NTQl0gPSBudl9jcnRjLT5zYXR1cmF0aW9uID0gbGV2ZWw7CisJaWYgKG52X2NydGMtPnNhdHVyYXRpb24gJiYgbnZfZ2Y0X2Rpc3BfYXJjaChjcnRjLT5kZXYpKSB7CisJCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV9DU0JdID0gMHg4MDsKKwkJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JFXzVCXSA9IG52X2NydGMtPnNhdHVyYXRpb24gPDwgMjsKKwkJY3J0Y193cl9jaW9fc3RhdGUoY3J0YywgcmVncCwgTlZfQ0lPX0NSRV81Qik7CisJfQorCWNydGNfd3JfY2lvX3N0YXRlKGNydGMsIHJlZ3AsIE5WX0NJT19DUkVfQ1NCKTsKK30KKworc3RhdGljIHZvaWQgbnZfY3J0Y19zZXRfaW1hZ2Vfc2hhcnBlbmluZyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCBsZXZlbCkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGNydGMtPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52MDRfY3J0Y19yZWcgKnJlZ3AgPSAmZGV2X3ByaXYtPm1vZGVfcmVnLmNydGNfcmVnW252X2NydGMtPmluZGV4XTsKKworCW52X2NydGMtPnNoYXJwbmVzcyA9IGxldmVsOworCWlmIChsZXZlbCA8IDApCS8qIGJsdXIgaXMgaW4gaHcgcmFuZ2UgMHgzZiAtPiAweDIwICovCisJCWxldmVsICs9IDB4NDA7CisJcmVncC0+cmFtZGFjXzYzNCA9IGxldmVsOworCU5WV3JpdGVSQU1EQUMoY3J0Yy0+ZGV2LCBudl9jcnRjLT5pbmRleCwgTlZfUFJBTURBQ182MzQsIHJlZ3AtPnJhbWRhY182MzQpOworfQorCisjZGVmaW5lIFBMTFNFTF9WUExMMV9NQVNLCQkJCVwKKwkoTlZfUFJBTURBQ19QTExfQ09FRkZfU0VMRUNUX1NPVVJDRV9QUk9HX1ZQTEwJXAorCSB8IE5WX1BSQU1EQUNfUExMX0NPRUZGX1NFTEVDVF9WQ0xLX1JBVElPX0RCMikKKyNkZWZpbmUgUExMU0VMX1ZQTEwyX01BU0sJCQkJXAorCShOVl9QUkFNREFDX1BMTF9DT0VGRl9TRUxFQ1RfUExMX1NPVVJDRV9WUExMMgkJXAorCSB8IE5WX1BSQU1EQUNfUExMX0NPRUZGX1NFTEVDVF9WQ0xLMl9SQVRJT19EQjIpCisjZGVmaW5lIFBMTFNFTF9UVl9NQVNLCQkJCQlcCisJKE5WX1BSQU1EQUNfUExMX0NPRUZGX1NFTEVDVF9UVl9WU0NMSzEJCVwKKwkgfCBOVl9QUkFNREFDX1BMTF9DT0VGRl9TRUxFQ1RfVFZfUENMSzEJCVwKKwkgfCBOVl9QUkFNREFDX1BMTF9DT0VGRl9TRUxFQ1RfVFZfVlNDTEsyCVwKKwkgfCBOVl9QUkFNREFDX1BMTF9DT0VGRl9TRUxFQ1RfVFZfUENMSzIpCisKKy8qIE5WNHggMHg0MC4uIHBsbCBub3RlczoKKyAqIGdwdSBwbGw6IDB4NDAwMCArIDB4NDAwNAorICogP2dwdT8gcGxsOiAweDQwMDggKyAweDQwMGMKKyAqIHZwbGwxOiAweDQwMTAgKyAweDQwMTQKKyAqIHZwbGwyOiAweDQwMTggKyAweDQwMWMKKyAqIG1wbGw6IDB4NDAyMCArIDB4NDAyNAorICogbXBsbDogMHg0MDM4ICsgMHg0MDNjCisgKgorICogdGhlIGZpcnN0IHJlZ2lzdGVyIG9mIGVhY2ggcGFpciBoYXMgc29tZSB1bmtub3duIGRldGFpbHM6CisgKiBiaXRzIDAtNzogcmVkaXJlY3RlZCB2YWx1ZXMgZnJvbSBlbHNld2hlcmU/IChzaW1pbGFyIHRvIFBMTF9TRVRVUF9DT05UUk9MPykKKyAqIGJpdHMgMjAtMjM6IChtcGxsKSBzb21ldGhpbmcgdG8gZG8gd2l0aCBwb3N0IGRpdmlkZXI/CisgKiBiaXRzIDI4LTMxOiByZWxhdGVkIHRvIHNpbmdsZSBzdGFnZSBtb2RlPyAoYml0IDgvMTIpCisgKi8KKworc3RhdGljIHZvaWQgbnZfY3J0Y19jYWxjX3N0YXRlX2V4dChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICogbW9kZSwgaW50IGRvdF9jbG9jaykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhjcnRjKTsKKwlzdHJ1Y3QgbnYwNF9tb2RlX3N0YXRlICpzdGF0ZSA9ICZkZXZfcHJpdi0+bW9kZV9yZWc7CisJc3RydWN0IG52MDRfY3J0Y19yZWcgKnJlZ3AgPSAmc3RhdGUtPmNydGNfcmVnW252X2NydGMtPmluZGV4XTsKKwlzdHJ1Y3Qgbm91dmVhdV9wbGxfdmFscyAqcHYgPSAmcmVncC0+cGxsdmFsczsKKwlzdHJ1Y3QgcGxsX2xpbXMgcGxsX2xpbTsKKworCWlmIChnZXRfcGxsX2xpbWl0cyhkZXYsIG52X2NydGMtPmluZGV4ID8gVlBMTDIgOiBWUExMMSwgJnBsbF9saW0pKQorCQlyZXR1cm47CisKKwkvKiBOTTIgPT0gMCBpcyB1c2VkIHRvIGRldGVybWluZSBzaW5nbGUgc3RhZ2UgbW9kZSBvbiB0d28gc3RhZ2UgcGxscyAqLworCXB2LT5OTTIgPSAwOworCisJLyogZm9yIG5ld2VyIG52NHggdGhlIGJsb2IgdXNlcyBvbmx5IHRoZSBmaXJzdCBzdGFnZSBvZiB0aGUgdnBsbCBiZWxvdyBhCisJICogY2VydGFpbiBjbG9jay4gIGZvciBhIGNlcnRhaW4gbnY0YiB0aGlzIGlzIDE1ME1Iei4gIHNpbmNlIHRoZSBtYXgKKwkgKiBvdXRwdXQgZnJlcXVlbmN5IG9mIHRoZSBmaXJzdCBzdGFnZSBmb3IgdGhpcyBjYXJkIGlzIDMwME1IeiwgaXQgaXMKKwkgKiBhc3N1bWVkIHRoZSB0aHJlc2hvbGQgaXMgZ2l2ZW4gYnkgdmNvMSBtYXhmcmVxLzIKKwkgKi8KKwkvKiBmb3IgZWFybHkgbnY0eCwgc3BlY2lmaWNhbGx5IG52NDAgYW5kICpzb21lKiBudjQzIChkZXZpZHMgMCBhbmQgNiwKKwkgKiBub3QgOCwgb3RoZXJzIHVua25vd24pLCB0aGUgYmxvYiBhbHdheXMgdXNlcyBib3RoIHBsbHMuICBubyBwcm9ibGVtCisJICogaGFzIHlldCBiZWVuIG9ic2VydmVkIGluIGFsbG93aW5nIHRoZSB1c2UgYSBzaW5nbGUgc3RhZ2UgcGxsIG9uIGFsbAorCSAqIG52NDMgaG93ZXZlci4gIHRoZSBiZWhhdmlvdXIgb2Ygc2luZ2xlIHN0YWdlIHVzZSBpcyB1bnRlc3RlZCBvbiBudjQwCisJICovCisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID4gMHg0MCAmJiBkb3RfY2xvY2sgPD0gKHBsbF9saW0udmNvMS5tYXhmcmVxIC8gMikpCisJCW1lbXNldCgmcGxsX2xpbS52Y28yLCAwLCBzaXplb2YocGxsX2xpbS52Y28yKSk7CisKKwlpZiAoIW5vdXZlYXVfY2FsY19wbGxfbW5wKGRldiwgJnBsbF9saW0sIGRvdF9jbG9jaywgcHYpKQorCQlyZXR1cm47CisKKwlzdGF0ZS0+cGxsc2VsICY9IFBMTFNFTF9WUExMMV9NQVNLIHwgUExMU0VMX1ZQTEwyX01BU0sgfCBQTExTRUxfVFZfTUFTSzsKKworCS8qIFRoZSBibG9iIHVzZXMgdGhpcyBhbHdheXMsIHNvIGxldCdzIGRvIHRoZSBzYW1lICovCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNDApCisJCXN0YXRlLT5wbGxzZWwgfD0gTlZfUFJBTURBQ19QTExfQ09FRkZfU0VMRUNUX1VTRV9WUExMMl9UUlVFOworCS8qIGFnYWluIG52NDAgYW5kIHNvbWUgbnY0MyBhY3QgbW9yZSBsaWtlIG52M3ggYXMgZGVzY3JpYmVkIGFib3ZlICovCisJaWYgKGRldl9wcml2LT5jaGlwc2V0IDwgMHg0MSkKKwkJc3RhdGUtPnBsbHNlbCB8PSBOVl9QUkFNREFDX1BMTF9DT0VGRl9TRUxFQ1RfU09VUkNFX1BST0dfTVBMTCB8CisJCQkJIE5WX1BSQU1EQUNfUExMX0NPRUZGX1NFTEVDVF9TT1VSQ0VfUFJPR19OVlBMTDsKKwlzdGF0ZS0+cGxsc2VsIHw9IG52X2NydGMtPmluZGV4ID8gUExMU0VMX1ZQTEwyX01BU0sgOiBQTExTRUxfVlBMTDFfTUFTSzsKKworCWlmIChwdi0+Tk0yKQorCQlOVl9UUkFDRShkZXYsICJ2cGxsOiBuMSAlZCBuMiAlZCBtMSAlZCBtMiAlZCBsb2cycCAlZFxuIiwKKwkJCSBwdi0+TjEsIHB2LT5OMiwgcHYtPk0xLCBwdi0+TTIsIHB2LT5sb2cyUCk7CisJZWxzZQorCQlOVl9UUkFDRShkZXYsICJ2cGxsOiBuICVkIG0gJWQgbG9nMnAgJWRcbiIsCisJCQkgcHYtPk4xLCBwdi0+TTEsIHB2LT5sb2cyUCk7CisKKwludl9jcnRjLT5jdXJzb3Iuc2V0X29mZnNldChudl9jcnRjLCBudl9jcnRjLT5jdXJzb3Iub2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQKK252X2NydGNfZHBtcyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCBtb2RlKQoreworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwl1bnNpZ25lZCBjaGFyIHNlcTEgPSAwLCBjcnRjMTcgPSAwOworCXVuc2lnbmVkIGNoYXIgY3J0YzFBOworCisJTlZfVFJBQ0UoZGV2LCAiU2V0dGluZyBkcG1zIG1vZGUgJWQgb24gQ1JUQyAlZFxuIiwgbW9kZSwKKwkJCQkJCQludl9jcnRjLT5pbmRleCk7CisKKwlpZiAobnZfY3J0Yy0+bGFzdF9kcG1zID09IG1vZGUpIC8qIERvbid0IGRvIHVubmVjZXNhcnkgbW9kZSBjaGFuZ2VzLiAqLworCQlyZXR1cm47CisKKwludl9jcnRjLT5sYXN0X2RwbXMgPSBtb2RlOworCisJaWYgKG52X3R3b19oZWFkcyhkZXYpKQorCQlOVlNldE93bmVyKGRldiwgbnZfY3J0Yy0+aW5kZXgpOworCisJLyogbnY0cmVmIGluZGljYXRlcyB0aGVzZSB0d28gUlBDMSBiaXRzIGluaGliaXQgaC92IHN5bmMgKi8KKwljcnRjMUEgPSBOVlJlYWRWZ2FDcnRjKGRldiwgbnZfY3J0Yy0+aW5kZXgsCisJCQkJCU5WX0NJT19DUkVfUlBDMV9JTkRFWCkgJiB+MHhDMDsKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIERSTV9NT0RFX0RQTVNfU1RBTkRCWToKKwkJLyogU2NyZWVuOiBPZmY7IEhTeW5jOiBPZmYsIFZTeW5jOiBPbiAtLSBOb3QgU3VwcG9ydGVkICovCisJCXNlcTEgPSAweDIwOworCQljcnRjMTcgPSAweDgwOworCQljcnRjMUEgfD0gMHg4MDsKKwkJYnJlYWs7CisJY2FzZSBEUk1fTU9ERV9EUE1TX1NVU1BFTkQ6CisJCS8qIFNjcmVlbjogT2ZmOyBIU3luYzogT24sIFZTeW5jOiBPZmYgLS0gTm90IFN1cHBvcnRlZCAqLworCQlzZXExID0gMHgyMDsKKwkJY3J0YzE3ID0gMHg4MDsKKwkJY3J0YzFBIHw9IDB4NDA7CisJCWJyZWFrOworCWNhc2UgRFJNX01PREVfRFBNU19PRkY6CisJCS8qIFNjcmVlbjogT2ZmOyBIU3luYzogT2ZmLCBWU3luYzogT2ZmICovCisJCXNlcTEgPSAweDIwOworCQljcnRjMTcgPSAweDAwOworCQljcnRjMUEgfD0gMHhDMDsKKwkJYnJlYWs7CisJY2FzZSBEUk1fTU9ERV9EUE1TX09OOgorCWRlZmF1bHQ6CisJCS8qIFNjcmVlbjogT247IEhTeW5jOiBPbiwgVlN5bmM6IE9uICovCisJCXNlcTEgPSAweDAwOworCQljcnRjMTcgPSAweDgwOworCQlicmVhazsKKwl9CisKKwlOVlZnYVNlcVJlc2V0KGRldiwgbnZfY3J0Yy0+aW5kZXgsIHRydWUpOworCS8qIEVhY2ggaGVhZCBoYXMgaXQncyBvd24gc2VxdWVuY2VyLCBzbyB3ZSBjYW4gdHVybiBpdCBvZmYgd2hlbiB3ZSB3YW50ICovCisJc2VxMSB8PSAoTlZSZWFkVmdhU2VxKGRldiwgbnZfY3J0Yy0+aW5kZXgsIE5WX1ZJT19TUl9DTE9DS19JTkRFWCkgJiB+MHgyMCk7CisJTlZXcml0ZVZnYVNlcShkZXYsIG52X2NydGMtPmluZGV4LCBOVl9WSU9fU1JfQ0xPQ0tfSU5ERVgsIHNlcTEpOworCWNydGMxNyB8PSAoTlZSZWFkVmdhQ3J0YyhkZXYsIG52X2NydGMtPmluZGV4LCBOVl9DSU9fQ1JfTU9ERV9JTkRFWCkgJiB+MHg4MCk7CisJbWRlbGF5KDEwKTsKKwlOVldyaXRlVmdhQ3J0YyhkZXYsIG52X2NydGMtPmluZGV4LCBOVl9DSU9fQ1JfTU9ERV9JTkRFWCwgY3J0YzE3KTsKKwlOVlZnYVNlcVJlc2V0KGRldiwgbnZfY3J0Yy0+aW5kZXgsIGZhbHNlKTsKKworCU5WV3JpdGVWZ2FDcnRjKGRldiwgbnZfY3J0Yy0+aW5kZXgsIE5WX0NJT19DUkVfUlBDMV9JTkRFWCwgY3J0YzFBKTsKK30KKworc3RhdGljIGJvb2wKK252X2NydGNfbW9kZV9maXh1cChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAorCQkgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQKK252X2NydGNfbW9kZV9zZXRfdmdhKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yywgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisJc3RydWN0IG52MDRfY3J0Y19yZWcgKnJlZ3AgPSAmZGV2X3ByaXYtPm1vZGVfcmVnLmNydGNfcmVnW252X2NydGMtPmluZGV4XTsKKwlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiA9IGNydGMtPmZiOworCisJLyogQ2FsY3VsYXRlIG91ciB0aW1pbmdzICovCisJaW50IGhvcml6RGlzcGxheQk9IChtb2RlLT5jcnRjX2hkaXNwbGF5ID4+IDMpIAktIDE7CisJaW50IGhvcml6U3RhcnQJCT0gKG1vZGUtPmNydGNfaHN5bmNfc3RhcnQgPj4gMykgCS0gMTsKKwlpbnQgaG9yaXpFbmQJCT0gKG1vZGUtPmNydGNfaHN5bmNfZW5kID4+IDMpIAktIDE7CisJaW50IGhvcml6VG90YWwJCT0gKG1vZGUtPmNydGNfaHRvdGFsID4+IDMpCQktIDU7CisJaW50IGhvcml6QmxhbmtTdGFydAk9IChtb2RlLT5jcnRjX2hkaXNwbGF5ID4+IDMpCQktIDE7CisJaW50IGhvcml6QmxhbmtFbmQJPSAobW9kZS0+Y3J0Y19odG90YWwgPj4gMykJCS0gMTsKKwlpbnQgdmVydERpc3BsYXkJCT0gbW9kZS0+Y3J0Y192ZGlzcGxheQkJCS0gMTsKKwlpbnQgdmVydFN0YXJ0CQk9IG1vZGUtPmNydGNfdnN5bmNfc3RhcnQgCQktIDE7CisJaW50IHZlcnRFbmQJCT0gbW9kZS0+Y3J0Y192c3luY19lbmQJCQktIDE7CisJaW50IHZlcnRUb3RhbAkJPSBtb2RlLT5jcnRjX3Z0b3RhbCAJCQktIDI7CisJaW50IHZlcnRCbGFua1N0YXJ0CT0gbW9kZS0+Y3J0Y192ZGlzcGxheSAJCQktIDE7CisJaW50IHZlcnRCbGFua0VuZAk9IG1vZGUtPmNydGNfdnRvdGFsCQkJLSAxOworCisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCWJvb2wgZnBfb3V0cHV0ID0gZmFsc2U7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuY29kZXIsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwgaGVhZCkgeworCQlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCisJCWlmIChlbmNvZGVyLT5jcnRjID09IGNydGMgJiYKKwkJICAgIChudl9lbmNvZGVyLT5kY2ItPnR5cGUgPT0gT1VUUFVUX0xWRFMgfHwKKwkJICAgICBudl9lbmNvZGVyLT5kY2ItPnR5cGUgPT0gT1VUUFVUX1RNRFMpKQorCQkJZnBfb3V0cHV0ID0gdHJ1ZTsKKwl9CisKKwlpZiAoZnBfb3V0cHV0KSB7CisJCXZlcnRTdGFydCA9IHZlcnRUb3RhbCAtIDM7CisJCXZlcnRFbmQgPSB2ZXJ0VG90YWwgLSAyOworCQl2ZXJ0QmxhbmtTdGFydCA9IHZlcnRTdGFydDsKKwkJaG9yaXpTdGFydCA9IGhvcml6VG90YWwgLSA1OworCQlob3JpekVuZCA9IGhvcml6VG90YWwgLSAyOworCQlob3JpekJsYW5rRW5kID0gaG9yaXpUb3RhbCArIDQ7CisjaWYgMAorCQlpZiAoZGV2LT5vdmVybGF5QWRhcHRvciAmJiBkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzEwKQorCQkJLyogVGhpcyByZXBvcnRlZGx5IHdvcmtzIGFyb3VuZCBzb21lIHZpZGVvIG92ZXJsYXkgYmFuZHdpZHRoIHByb2JsZW1zICovCisJCQlob3JpelRvdGFsICs9IDI7CisjZW5kaWYKKwl9CisKKwlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkKKwkJdmVydFRvdGFsIHw9IDE7CisKKyNpZiAwCisJRXJyb3JGKCJob3JpekRpc3BsYXk6IDB4JVggXG4iLCBob3JpekRpc3BsYXkpOworCUVycm9yRigiaG9yaXpTdGFydDogMHglWCBcbiIsIGhvcml6U3RhcnQpOworCUVycm9yRigiaG9yaXpFbmQ6IDB4JVggXG4iLCBob3JpekVuZCk7CisJRXJyb3JGKCJob3JpelRvdGFsOiAweCVYIFxuIiwgaG9yaXpUb3RhbCk7CisJRXJyb3JGKCJob3JpekJsYW5rU3RhcnQ6IDB4JVggXG4iLCBob3JpekJsYW5rU3RhcnQpOworCUVycm9yRigiaG9yaXpCbGFua0VuZDogMHglWCBcbiIsIGhvcml6QmxhbmtFbmQpOworCUVycm9yRigidmVydERpc3BsYXk6IDB4JVggXG4iLCB2ZXJ0RGlzcGxheSk7CisJRXJyb3JGKCJ2ZXJ0U3RhcnQ6IDB4JVggXG4iLCB2ZXJ0U3RhcnQpOworCUVycm9yRigidmVydEVuZDogMHglWCBcbiIsIHZlcnRFbmQpOworCUVycm9yRigidmVydFRvdGFsOiAweCVYIFxuIiwgdmVydFRvdGFsKTsKKwlFcnJvckYoInZlcnRCbGFua1N0YXJ0OiAweCVYIFxuIiwgdmVydEJsYW5rU3RhcnQpOworCUVycm9yRigidmVydEJsYW5rRW5kOiAweCVYIFxuIiwgdmVydEJsYW5rRW5kKTsKKyNlbmRpZgorCisJLyoKKwkqIGNvbXB1dGUgY29ycmVjdCBIc3luYyAmIFZzeW5jIHBvbGFyaXR5CisJKi8KKwlpZiAoKG1vZGUtPmZsYWdzICYgKERSTV9NT0RFX0ZMQUdfUEhTWU5DIHwgRFJNX01PREVfRkxBR19OSFNZTkMpKQorCQkmJiAobW9kZS0+ZmxhZ3MgJiAoRFJNX01PREVfRkxBR19QVlNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQykpKSB7CisKKwkJcmVncC0+TWlzY091dFJlZyA9IDB4MjM7CisJCWlmIChtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfTkhTWU5DKQorCQkJcmVncC0+TWlzY091dFJlZyB8PSAweDQwOworCQlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX05WU1lOQykKKwkJCXJlZ3AtPk1pc2NPdXRSZWcgfD0gMHg4MDsKKwl9IGVsc2UgeworCQlpbnQgdmRpc3BsYXkgPSBtb2RlLT52ZGlzcGxheTsKKwkJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19EQkxTQ0FOKQorCQkJdmRpc3BsYXkgKj0gMjsKKwkJaWYgKG1vZGUtPnZzY2FuID4gMSkKKwkJCXZkaXNwbGF5ICo9IG1vZGUtPnZzY2FuOworCQlpZiAodmRpc3BsYXkgPCA0MDApCisJCQlyZWdwLT5NaXNjT3V0UmVnID0gMHhBMzsJLyogK2hzeW5jIC12c3luYyAqLworCQllbHNlIGlmICh2ZGlzcGxheSA8IDQ4MCkKKwkJCXJlZ3AtPk1pc2NPdXRSZWcgPSAweDYzOwkvKiAtaHN5bmMgK3ZzeW5jICovCisJCWVsc2UgaWYgKHZkaXNwbGF5IDwgNzY4KQorCQkJcmVncC0+TWlzY091dFJlZyA9IDB4RTM7CS8qIC1oc3luYyAtdnN5bmMgKi8KKwkJZWxzZQorCQkJcmVncC0+TWlzY091dFJlZyA9IDB4MjM7CS8qICtoc3luYyArdnN5bmMgKi8KKwl9CisKKwlyZWdwLT5NaXNjT3V0UmVnIHw9IChtb2RlLT5jbG9ja19pbmRleCAmIDB4MDMpIDw8IDI7CisKKwkvKgorCSAqIFRpbWUgU2VxdWVuY2VyCisJICovCisJcmVncC0+U2VxdWVuY2VyW05WX1ZJT19TUl9SRVNFVF9JTkRFWF0gPSAweDAwOworCS8qIDB4MjAgZGlzYWJsZXMgdGhlIHNlcXVlbmNlciAqLworCWlmIChtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfQ0xLRElWMikKKwkJcmVncC0+U2VxdWVuY2VyW05WX1ZJT19TUl9DTE9DS19JTkRFWF0gPSAweDI5OworCWVsc2UKKwkJcmVncC0+U2VxdWVuY2VyW05WX1ZJT19TUl9DTE9DS19JTkRFWF0gPSAweDIxOworCXJlZ3AtPlNlcXVlbmNlcltOVl9WSU9fU1JfUExBTkVfTUFTS19JTkRFWF0gPSAweDBGOworCXJlZ3AtPlNlcXVlbmNlcltOVl9WSU9fU1JfQ0hBUl9NQVBfSU5ERVhdID0gMHgwMDsKKwlyZWdwLT5TZXF1ZW5jZXJbTlZfVklPX1NSX01FTV9NT0RFX0lOREVYXSA9IDB4MEU7CisKKwkvKgorCSAqIENSVEMKKwkgKi8KKwlyZWdwLT5DUlRDW05WX0NJT19DUl9IRFRfSU5ERVhdID0gaG9yaXpUb3RhbDsKKwlyZWdwLT5DUlRDW05WX0NJT19DUl9IREVfSU5ERVhdID0gaG9yaXpEaXNwbGF5OworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSX0hCU19JTkRFWF0gPSBob3JpekJsYW5rU3RhcnQ7CisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JfSEJFX0lOREVYXSA9ICgxIDw8IDcpIHwKKwkJCQkJICBYTEFURShob3JpekJsYW5rRW5kLCAwLCBOVl9DSU9fQ1JfSEJFXzRfMCk7CisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JfSFJTX0lOREVYXSA9IGhvcml6U3RhcnQ7CisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JfSFJFX0lOREVYXSA9IFhMQVRFKGhvcml6QmxhbmtFbmQsIDUsIE5WX0NJT19DUl9IUkVfSEJFXzUpIHwKKwkJCQkJICBYTEFURShob3JpekVuZCwgMCwgTlZfQ0lPX0NSX0hSRV80XzApOworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSX1ZEVF9JTkRFWF0gPSB2ZXJ0VG90YWw7CisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JfT1ZMX0lOREVYXSA9IFhMQVRFKHZlcnRTdGFydCwgOSwgTlZfQ0lPX0NSX09WTF9WUlNfOSkgfAorCQkJCQkgIFhMQVRFKHZlcnREaXNwbGF5LCA5LCBOVl9DSU9fQ1JfT1ZMX1ZERV85KSB8CisJCQkJCSAgWExBVEUodmVydFRvdGFsLCA5LCBOVl9DSU9fQ1JfT1ZMX1ZEVF85KSB8CisJCQkJCSAgKDEgPDwgNCkgfAorCQkJCQkgIFhMQVRFKHZlcnRCbGFua1N0YXJ0LCA4LCBOVl9DSU9fQ1JfT1ZMX1ZCU184KSB8CisJCQkJCSAgWExBVEUodmVydFN0YXJ0LCA4LCBOVl9DSU9fQ1JfT1ZMX1ZSU184KSB8CisJCQkJCSAgWExBVEUodmVydERpc3BsYXksIDgsIE5WX0NJT19DUl9PVkxfVkRFXzgpIHwKKwkJCQkJICBYTEFURSh2ZXJ0VG90YWwsIDgsIE5WX0NJT19DUl9PVkxfVkRUXzgpOworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSX1JTQUxfSU5ERVhdID0gMHgwMDsKKwlyZWdwLT5DUlRDW05WX0NJT19DUl9DRUxMX0hUX0lOREVYXSA9ICgobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0RCTFNDQU4pID8gTUFTSyhOVl9DSU9fQ1JfQ0VMTF9IVF9TQ0FOREJMKSA6IDApIHwKKwkJCQkJICAgICAgMSA8PCA2IHwKKwkJCQkJICAgICAgWExBVEUodmVydEJsYW5rU3RhcnQsIDksIE5WX0NJT19DUl9DRUxMX0hUX1ZCU185KTsKKwlyZWdwLT5DUlRDW05WX0NJT19DUl9DVVJTX1NUX0lOREVYXSA9IDB4MDA7CisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JfQ1VSU19FTkRfSU5ERVhdID0gMHgwMDsKKwlyZWdwLT5DUlRDW05WX0NJT19DUl9TQV9ISV9JTkRFWF0gPSAweDAwOworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSX1NBX0xPX0lOREVYXSA9IDB4MDA7CisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JfVENPRkZfSElfSU5ERVhdID0gMHgwMDsKKwlyZWdwLT5DUlRDW05WX0NJT19DUl9UQ09GRl9MT19JTkRFWF0gPSAweDAwOworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSX1ZSU19JTkRFWF0gPSB2ZXJ0U3RhcnQ7CisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JfVlJFX0lOREVYXSA9IDEgPDwgNSB8IFhMQVRFKHZlcnRFbmQsIDAsIE5WX0NJT19DUl9WUkVfM18wKTsKKwlyZWdwLT5DUlRDW05WX0NJT19DUl9WREVfSU5ERVhdID0gdmVydERpc3BsYXk7CisJLyogZnJhbWVidWZmZXIgY2FuIGJlIGxhcmdlciB0aGFuIGNydGMgc2Nhbm91dCBhcmVhLiAqLworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSX09GRlNFVF9JTkRFWF0gPSBmYi0+cGl0Y2ggLyA4OworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSX1VMSU5FX0lOREVYXSA9IDB4MDA7CisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JfVkJTX0lOREVYXSA9IHZlcnRCbGFua1N0YXJ0OworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSX1ZCRV9JTkRFWF0gPSB2ZXJ0QmxhbmtFbmQ7CisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JfTU9ERV9JTkRFWF0gPSAweDQzOworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSX0xDT01QX0lOREVYXSA9IDB4ZmY7CisKKwkvKgorCSAqIFNvbWUgZXh0ZW5kZWQgQ1JUQyByZWdpc3RlcnMgKHRoZXkgYXJlIG5vdCBzYXZlZCB3aXRoIHRoZSByZXN0IG9mIHRoZSB2Z2EgcmVncykuCisJICovCisKKwkvKiBmcmFtZWJ1ZmZlciBjYW4gYmUgbGFyZ2VyIHRoYW4gY3J0YyBzY2Fub3V0IGFyZWEuICovCisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JFX1JQQzBfSU5ERVhdID0gWExBVEUoZmItPnBpdGNoIC8gOCwgOCwgTlZfQ0lPX0NSRV9SUEMwX09GRlNFVF8xMF84KTsKKwlyZWdwLT5DUlRDW05WX0NJT19DUkVfUlBDMV9JTkRFWF0gPSBtb2RlLT5jcnRjX2hkaXNwbGF5IDwgMTI4MCA/CisJCQkJCSAgICBNQVNLKE5WX0NJT19DUkVfUlBDMV9MQVJHRSkgOiAweDAwOworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV9MU1JfSU5ERVhdID0gWExBVEUoaG9yaXpCbGFua0VuZCwgNiwgTlZfQ0lPX0NSRV9MU1JfSEJFXzYpIHwKKwkJCQkJICAgWExBVEUodmVydEJsYW5rU3RhcnQsIDEwLCBOVl9DSU9fQ1JFX0xTUl9WQlNfMTApIHwKKwkJCQkJICAgWExBVEUodmVydFN0YXJ0LCAxMCwgTlZfQ0lPX0NSRV9MU1JfVlJTXzEwKSB8CisJCQkJCSAgIFhMQVRFKHZlcnREaXNwbGF5LCAxMCwgTlZfQ0lPX0NSRV9MU1JfVkRFXzEwKSB8CisJCQkJCSAgIFhMQVRFKHZlcnRUb3RhbCwgMTAsIE5WX0NJT19DUkVfTFNSX1ZEVF8xMCk7CisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JFX0hFQl9fSU5ERVhdID0gWExBVEUoaG9yaXpTdGFydCwgOCwgTlZfQ0lPX0NSRV9IRUJfSFJTXzgpIHwKKwkJCQkJICAgIFhMQVRFKGhvcml6QmxhbmtTdGFydCwgOCwgTlZfQ0lPX0NSRV9IRUJfSEJTXzgpIHwKKwkJCQkJICAgIFhMQVRFKGhvcml6RGlzcGxheSwgOCwgTlZfQ0lPX0NSRV9IRUJfSERFXzgpIHwKKwkJCQkJICAgIFhMQVRFKGhvcml6VG90YWwsIDgsIE5WX0NJT19DUkVfSEVCX0hEVF84KTsKKwlyZWdwLT5DUlRDW05WX0NJT19DUkVfRUJSX0lOREVYXSA9IFhMQVRFKHZlcnRCbGFua1N0YXJ0LCAxMSwgTlZfQ0lPX0NSRV9FQlJfVkJTXzExKSB8CisJCQkJCSAgIFhMQVRFKHZlcnRTdGFydCwgMTEsIE5WX0NJT19DUkVfRUJSX1ZSU18xMSkgfAorCQkJCQkgICBYTEFURSh2ZXJ0RGlzcGxheSwgMTEsIE5WX0NJT19DUkVfRUJSX1ZERV8xMSkgfAorCQkJCQkgICBYTEFURSh2ZXJ0VG90YWwsIDExLCBOVl9DSU9fQ1JFX0VCUl9WRFRfMTEpOworCisJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpIHsKKwkJaG9yaXpUb3RhbCA9IChob3JpelRvdGFsID4+IDEpICYgfjE7CisJCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV9JTEFDRV9fSU5ERVhdID0gaG9yaXpUb3RhbDsKKwkJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JFX0hFQl9fSU5ERVhdIHw9IFhMQVRFKGhvcml6VG90YWwsIDgsIE5WX0NJT19DUkVfSEVCX0lMQ184KTsKKwl9IGVsc2UKKwkJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JFX0lMQUNFX19JTkRFWF0gPSAweGZmOyAgLyogaW50ZXJsYWNlIG9mZiAqLworCisJLyoKKwkqIEdyYXBoaWNzIERpc3BsYXkgQ29udHJvbGxlcgorCSovCisJcmVncC0+R3JhcGhpY3NbTlZfVklPX0dYX1NSX0lOREVYXSA9IDB4MDA7CisJcmVncC0+R3JhcGhpY3NbTlZfVklPX0dYX1NSRU5fSU5ERVhdID0gMHgwMDsKKwlyZWdwLT5HcmFwaGljc1tOVl9WSU9fR1hfQ0NPTVBfSU5ERVhdID0gMHgwMDsKKwlyZWdwLT5HcmFwaGljc1tOVl9WSU9fR1hfUk9QX0lOREVYXSA9IDB4MDA7CisJcmVncC0+R3JhcGhpY3NbTlZfVklPX0dYX1JFQURfTUFQX0lOREVYXSA9IDB4MDA7CisJcmVncC0+R3JhcGhpY3NbTlZfVklPX0dYX01PREVfSU5ERVhdID0gMHg0MDsgLyogMjU2IGNvbG9yIG1vZGUgKi8KKwlyZWdwLT5HcmFwaGljc1tOVl9WSU9fR1hfTUlTQ19JTkRFWF0gPSAweDA1OyAvKiBtYXAgNjRrIG1lbSArIGdyYXBoaWMgbW9kZSAqLworCXJlZ3AtPkdyYXBoaWNzW05WX1ZJT19HWF9ET05UX0NBUkVfSU5ERVhdID0gMHgwRjsKKwlyZWdwLT5HcmFwaGljc1tOVl9WSU9fR1hfQklUX01BU0tfSU5ERVhdID0gMHhGRjsKKworCXJlZ3AtPkF0dHJpYnV0ZVswXSAgPSAweDAwOyAvKiBzdGFuZGFyZCBjb2xvcm1hcCB0cmFuc2xhdGlvbiAqLworCXJlZ3AtPkF0dHJpYnV0ZVsxXSAgPSAweDAxOworCXJlZ3AtPkF0dHJpYnV0ZVsyXSAgPSAweDAyOworCXJlZ3AtPkF0dHJpYnV0ZVszXSAgPSAweDAzOworCXJlZ3AtPkF0dHJpYnV0ZVs0XSAgPSAweDA0OworCXJlZ3AtPkF0dHJpYnV0ZVs1XSAgPSAweDA1OworCXJlZ3AtPkF0dHJpYnV0ZVs2XSAgPSAweDA2OworCXJlZ3AtPkF0dHJpYnV0ZVs3XSAgPSAweDA3OworCXJlZ3AtPkF0dHJpYnV0ZVs4XSAgPSAweDA4OworCXJlZ3AtPkF0dHJpYnV0ZVs5XSAgPSAweDA5OworCXJlZ3AtPkF0dHJpYnV0ZVsxMF0gPSAweDBBOworCXJlZ3AtPkF0dHJpYnV0ZVsxMV0gPSAweDBCOworCXJlZ3AtPkF0dHJpYnV0ZVsxMl0gPSAweDBDOworCXJlZ3AtPkF0dHJpYnV0ZVsxM10gPSAweDBEOworCXJlZ3AtPkF0dHJpYnV0ZVsxNF0gPSAweDBFOworCXJlZ3AtPkF0dHJpYnV0ZVsxNV0gPSAweDBGOworCXJlZ3AtPkF0dHJpYnV0ZVtOVl9DSU9fQVJfTU9ERV9JTkRFWF0gPSAweDAxOyAvKiBFbmFibGUgZ3JhcGhpYyBtb2RlICovCisJLyogTm9uLXZnYSAqLworCXJlZ3AtPkF0dHJpYnV0ZVtOVl9DSU9fQVJfT1NDQU5fSU5ERVhdID0gMHgwMDsKKwlyZWdwLT5BdHRyaWJ1dGVbTlZfQ0lPX0FSX1BMQU5FX0lOREVYXSA9IDB4MEY7IC8qIGVuYWJsZSBhbGwgY29sb3IgcGxhbmVzICovCisJcmVncC0+QXR0cmlidXRlW05WX0NJT19BUl9IUFBfSU5ERVhdID0gMHgwMDsKKwlyZWdwLT5BdHRyaWJ1dGVbTlZfQ0lPX0FSX0NTRUxfSU5ERVhdID0gMHgwMDsKK30KKworLyoqCisgKiBTZXRzIHVwIHJlZ2lzdGVycyBmb3IgdGhlIGdpdmVuIG1vZGUvYWRqdXN0ZWRfbW9kZSBwYWlyLgorICoKKyAqIFRoZSBjbG9ja3MsIENSVENzIGFuZCBvdXRwdXRzIGF0dGFjaGVkIHRvIHRoaXMgQ1JUQyBtdXN0IGJlIG9mZi4KKyAqCisgKiBUaGlzIHNob3VsZG4ndCBlbmFibGUgYW55IGNsb2NrcywgQ1JUQ3MsIG9yIG91dHB1dHMsIGJ1dCB0aGV5IHNob3VsZAorICogYmUgZWFzaWx5IHR1cm5lZCBvbi9vZmYgYWZ0ZXIgdGhpcy4KKyAqLworc3RhdGljIHZvaWQKK252X2NydGNfbW9kZV9zZXRfcmVncyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICogbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhjcnRjKTsKKwlzdHJ1Y3QgbnYwNF9jcnRjX3JlZyAqcmVncCA9ICZkZXZfcHJpdi0+bW9kZV9yZWcuY3J0Y19yZWdbbnZfY3J0Yy0+aW5kZXhdOworCXN0cnVjdCBudjA0X2NydGNfcmVnICpzYXZlcCA9ICZkZXZfcHJpdi0+c2F2ZWRfcmVnLmNydGNfcmVnW252X2NydGMtPmluZGV4XTsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CisJYm9vbCBsdmRzX291dHB1dCA9IGZhbHNlLCB0bWRzX291dHB1dCA9IGZhbHNlLCB0dl9vdXRwdXQgPSBmYWxzZSwKKwkJb2ZmX2NoaXBfZGlnaXRhbCA9IGZhbHNlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbmNvZGVyLCAmZGV2LT5tb2RlX2NvbmZpZy5lbmNvZGVyX2xpc3QsIGhlYWQpIHsKKwkJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwkJYm9vbCBkaWdpdGFsID0gZmFsc2U7CisKKwkJaWYgKGVuY29kZXItPmNydGMgIT0gY3J0YykKKwkJCWNvbnRpbnVlOworCisJCWlmIChudl9lbmNvZGVyLT5kY2ItPnR5cGUgPT0gT1VUUFVUX0xWRFMpCisJCQlkaWdpdGFsID0gbHZkc19vdXRwdXQgPSB0cnVlOworCQlpZiAobnZfZW5jb2Rlci0+ZGNiLT50eXBlID09IE9VVFBVVF9UVikKKwkJCXR2X291dHB1dCA9IHRydWU7CisJCWlmIChudl9lbmNvZGVyLT5kY2ItPnR5cGUgPT0gT1VUUFVUX1RNRFMpCisJCQlkaWdpdGFsID0gdG1kc19vdXRwdXQgPSB0cnVlOworCQlpZiAobnZfZW5jb2Rlci0+ZGNiLT5sb2NhdGlvbiAhPSBEQ0JfTE9DX09OX0NISVAgJiYgZGlnaXRhbCkKKwkJCW9mZl9jaGlwX2RpZ2l0YWwgPSB0cnVlOworCX0KKworCS8qIFJlZ2lzdGVycyBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byB0aGUgKHMpdmdhIG1vZGUgKi8KKworCS8qIFdoYXQgaXMgdGhlIG1lYW5pbmcgb2YgdGhpcyByZWdpc3Rlcj8gKi8KKwkvKiBBIGZldyBwb3B1bGFyIHZhbHVlcyBhcmUgMHgxOCwgMHgxYywgMHgzOCwgMHgzYyAqLworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV9FTkhfSU5ERVhdID0gc2F2ZXAtPkNSVENbTlZfQ0lPX0NSRV9FTkhfSU5ERVhdICYgfigxPDw1KTsKKworCXJlZ3AtPmNydGNfZW5nX2N0cmwgPSAwOworCS8qIEV4Y2VwdCBmb3IgcmFyZSBjb25kaXRpb25zIEkyQyBpcyBlbmFibGVkIG9uIHRoZSBwcmltYXJ5IGNydGMgKi8KKwlpZiAobnZfY3J0Yy0+aW5kZXggPT0gMCkKKwkJcmVncC0+Y3J0Y19lbmdfY3RybCB8PSBOVl9DUlRDX0ZTRUxfSTJDOworI2lmIDAKKwkvKiBTZXQgb3ZlcmxheSB0byBkZXNpcmVkIGNydGMuICovCisJaWYgKGRldi0+b3ZlcmxheUFkYXB0b3IpIHsKKwkJTlZQb3J0UHJpdlB0ciBwUHJpdiA9IEdFVF9PVkVSTEFZX1BSSVZBVEUoZGV2KTsKKwkJaWYgKHBQcml2LT5vdmVybGF5Q1JUQyA9PSBudl9jcnRjLT5pbmRleCkKKwkJCXJlZ3AtPmNydGNfZW5nX2N0cmwgfD0gTlZfQ1JUQ19GU0VMX09WRVJMQVk7CisJfQorI2VuZGlmCisKKwkvKiBBRERSRVNTX1NQQUNFX1BOVk0gaXMgdGhlIHNhbWUgYXMgc2V0dGluZyBIQ1VSX0FTSSAqLworCXJlZ3AtPmN1cnNvcl9jZmcgPSBOVl9QQ1JUQ19DVVJTT1JfQ09ORklHX0NVUl9MSU5FU182NCB8CisJCQkgICAgIE5WX1BDUlRDX0NVUlNPUl9DT05GSUdfQ1VSX1BJWEVMU182NCB8CisJCQkgICAgIE5WX1BDUlRDX0NVUlNPUl9DT05GSUdfQUREUkVTU19TUEFDRV9QTlZNOworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA+PSAweDExKQorCQlyZWdwLT5jdXJzb3JfY2ZnIHw9IE5WX1BDUlRDX0NVUlNPUl9DT05GSUdfQ1VSX0JQUF8zMjsKKwlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0RCTFNDQU4pCisJCXJlZ3AtPmN1cnNvcl9jZmcgfD0gTlZfUENSVENfQ1VSU09SX0NPTkZJR19ET1VCTEVfU0NBTl9FTkFCTEU7CisKKwkvKiBVbmJsb2NrIHNvbWUgdGltaW5ncyAqLworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV81M10gPSAwOworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV81NF0gPSAwOworCisJLyogMHgwMCBpcyBkaXNhYmxlZCwgMHgxMSBpcyBsdmRzLCAweDIyIGNydCBhbmQgMHg4OCB0bWRzICovCisJaWYgKGx2ZHNfb3V0cHV0KQorCQlyZWdwLT5DUlRDW05WX0NJT19DUkVfU0NSQVRDSDNfX0lOREVYXSA9IDB4MTE7CisJZWxzZSBpZiAodG1kc19vdXRwdXQpCisJCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV9TQ1JBVENIM19fSU5ERVhdID0gMHg4ODsKKwllbHNlCisJCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV9TQ1JBVENIM19fSU5ERVhdID0gMHgyMjsKKworCS8qIFRoZXNlIHZhbHVlcyBzZWVtIHRvIHZhcnkgKi8KKwkvKiBUaGlzIHJlZ2lzdGVyIHNlZW1zIHRvIGJlIHVzZWQgYnkgdGhlIGJpb3MgdG8gbWFrZSBjZXJ0YWluIGRlY2lzaW9ucyBvbiBzb21lIEc3MCBjYXJkcz8gKi8KKwlyZWdwLT5DUlRDW05WX0NJT19DUkVfU0NSQVRDSDRfX0lOREVYXSA9IHNhdmVwLT5DUlRDW05WX0NJT19DUkVfU0NSQVRDSDRfX0lOREVYXTsKKworCW52X2NydGNfc2V0X2RpZ2l0YWxfdmlicmFuY2UoY3J0YywgbnZfY3J0Yy0+c2F0dXJhdGlvbik7CisKKwkvKiBwcm9iYWJseSBhIHNjcmF0Y2ggcmVnLCBidXQga2VwdCBmb3IgY2FyZ28tY3VsdCBwdXJwb3NlczoKKwkgKiBiaXQwOiBjcnRjMD8sIGhlYWQgQQorCSAqIGJpdDY6IGx2ZHMsIGhlYWQgQQorCSAqIGJpdDc6IChvbmx5IGluIFgpLCBoZWFkIEEKKwkgKi8KKwlpZiAobnZfY3J0Yy0+aW5kZXggPT0gMCkKKwkJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JFXzRCXSA9IHNhdmVwLT5DUlRDW05WX0NJT19DUkVfNEJdIHwgMHg4MDsKKworCS8qIFRoZSBibG9iIHNlZW1zIHRvIHRha2UgdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSBjcnRjIDAsIGFkZCA0IHRvIHRoYXQKKwkgKiBhbmQgcmV1c2UgdGhlIG9sZCB2YWx1ZSBmb3IgY3J0YyAxICovCisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JFX1RWT1VUX0xBVEVOQ1ldID0gZGV2X3ByaXYtPnNhdmVkX3JlZy5jcnRjX3JlZ1swXS5DUlRDW05WX0NJT19DUkVfVFZPVVRfTEFURU5DWV07CisJaWYgKCFudl9jcnRjLT5pbmRleCkKKwkJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JFX1RWT1VUX0xBVEVOQ1ldICs9IDQ7CisKKwkvKiB0aGUgYmxvYiBzb21ldGltZXMgc2V0cyB8PSAweDEwICh3aGljaCBpcyB0aGUgc2FtZSBhcyBzZXR0aW5nIHw9CisJICogMSA8PCAzMCBvbiAweDYwLjgzMCksIGZvciBubyBhcHBhcmVudCByZWFzb24gKi8KKwlyZWdwLT5DUlRDW05WX0NJT19DUkVfNTldID0gb2ZmX2NoaXBfZGlnaXRhbDsKKworCXJlZ3AtPmNydGNfODMwID0gbW9kZS0+Y3J0Y192ZGlzcGxheSAtIDM7CisJcmVncC0+Y3J0Y184MzQgPSBtb2RlLT5jcnRjX3ZkaXNwbGF5IC0gMTsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzQwKQorCQkvKiBUaGlzIGlzIHdoYXQgdGhlIGJsb2IgZG9lcyAqLworCQlyZWdwLT5jcnRjXzg1MCA9IE5WUmVhZENSVEMoZGV2LCAwLCBOVl9QQ1JUQ184NTApOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfMzApCisJCXJlZ3AtPmdwaW9fZXh0ID0gTlZSZWFkQ1JUQyhkZXYsIDAsIE5WX1BDUlRDX0dQSU9fRVhUKTsKKworCXJlZ3AtPmNydGNfY2ZnID0gTlZfUENSVENfQ09ORklHX1NUQVJUX0FERFJFU1NfSFNZTkM7CisKKwkvKiBTb21lIG1pc2MgcmVncyAqLworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzQwKSB7CisJCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV84NV0gPSAweEZGOworCQlyZWdwLT5DUlRDW05WX0NJT19DUkVfODZdID0gMHgxOworCX0KKworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV9QSVhFTF9JTkRFWF0gPSAoY3J0Yy0+ZmItPmRlcHRoICsgMSkgLyA4OworCS8qIEVuYWJsZSBzbGF2ZWQgbW9kZSAoY2FsbGVkIE1PREVfVFYgaW4gbnY0cmVmLmgpICovCisJaWYgKGx2ZHNfb3V0cHV0IHx8IHRtZHNfb3V0cHV0IHx8IHR2X291dHB1dCkKKwkJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JFX1BJWEVMX0lOREVYXSB8PSAoMSA8PCA3KTsKKworCS8qIEdlbmVyaWMgUFJBTURBQyByZWdzICovCisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl8xMCkKKwkJLyogT25seSBiaXQgdGhhdCBiaW9zIGFuZCBibG9iIHNldC4gKi8KKwkJcmVncC0+bnYxMF9jdXJzeW5jID0gKDEgPDwgMjUpOworCisJcmVncC0+cmFtZGFjX2dlbl9jdHJsID0gTlZfUFJBTURBQ19HRU5FUkFMX0NPTlRST0xfQlBDXzhCSVRTIHwKKwkJCQlOVl9QUkFNREFDX0dFTkVSQUxfQ09OVFJPTF9WR0FfU1RBVEVfU0VMIHwKKwkJCQlOVl9QUkFNREFDX0dFTkVSQUxfQ09OVFJPTF9QSVhNSVhfT047CisJaWYgKGNydGMtPmZiLT5kZXB0aCA9PSAxNikKKwkJcmVncC0+cmFtZGFjX2dlbl9jdHJsIHw9IE5WX1BSQU1EQUNfR0VORVJBTF9DT05UUk9MX0FMVF9NT0RFX1NFTDsKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHgxMSkKKwkJcmVncC0+cmFtZGFjX2dlbl9jdHJsIHw9IE5WX1BSQU1EQUNfR0VORVJBTF9DT05UUk9MX1BJUEVfTE9ORzsKKworCXJlZ3AtPnJhbWRhY182MzAgPSAwOyAvKiB0dXJuIG9mZiBncmVlbiBtb2RlICh0diB0ZXN0IHBhdHRlcm4/KSAqLworCXJlZ3AtPnR2X3NldHVwID0gMDsKKworCW52X2NydGNfc2V0X2ltYWdlX3NoYXJwZW5pbmcoY3J0YywgbnZfY3J0Yy0+c2hhcnBuZXNzKTsKKworCS8qIFNvbWUgdmFsdWVzIHRoZSBibG9iIHNldHMgKi8KKwlyZWdwLT5yYW1kYWNfOGMwID0gMHgxMDA7CisJcmVncC0+cmFtZGFjX2EyMCA9IDB4MDsKKwlyZWdwLT5yYW1kYWNfYTI0ID0gMHhmZmZmZjsKKwlyZWdwLT5yYW1kYWNfYTM0ID0gMHgxOworfQorCisvKioKKyAqIFNldHMgdXAgcmVnaXN0ZXJzIGZvciB0aGUgZ2l2ZW4gbW9kZS9hZGp1c3RlZF9tb2RlIHBhaXIuCisgKgorICogVGhlIGNsb2NrcywgQ1JUQ3MgYW5kIG91dHB1dHMgYXR0YWNoZWQgdG8gdGhpcyBDUlRDIG11c3QgYmUgb2ZmLgorICoKKyAqIFRoaXMgc2hvdWxkbid0IGVuYWJsZSBhbnkgY2xvY2tzLCBDUlRDcywgb3Igb3V0cHV0cywgYnV0IHRoZXkgc2hvdWxkCisgKiBiZSBlYXNpbHkgdHVybmVkIG9uL29mZiBhZnRlciB0aGlzLgorICovCitzdGF0aWMgaW50Citudl9jcnRjX21vZGVfc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0Yywgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCSBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSwKKwkJIGludCB4LCBpbnQgeSwgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqb2xkX2ZiKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhjcnRjKTsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJTlZfREVCVUcoZGV2LCAiQ1RSQyBtb2RlIG9uIENSVEMgJWQ6XG4iLCBudl9jcnRjLT5pbmRleCk7CisJZHJtX21vZGVfZGVidWdfcHJpbnRtb2RlbGluZShhZGp1c3RlZF9tb2RlKTsKKworCS8qIHVubG9jayBtdXN0IGNvbWUgYWZ0ZXIgdHVybmluZyBvZmYgRlBfVEdfQ09OVFJPTCBpbiBvdXRwdXRfcHJlcGFyZSAqLworCW52X2xvY2tfdmdhX2NydGNfc2hhZG93KGRldiwgbnZfY3J0Yy0+aW5kZXgsIC0xKTsKKworCW52X2NydGNfbW9kZV9zZXRfdmdhKGNydGMsIGFkanVzdGVkX21vZGUpOworCS8qIGNhbGN1bGF0ZWQgaW4gbnYwNF9kZnBfcHJlcGFyZSwgbnY0MCBuZWVkcyBpdCB3cml0dGVuIGJlZm9yZSBjYWxjdWxhdGluZyBQTExzICovCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNDApCisJCU5WV3JpdGVSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDX1NFTF9DTEssIGRldl9wcml2LT5tb2RlX3JlZy5zZWxfY2xrKTsKKwludl9jcnRjX21vZGVfc2V0X3JlZ3MoY3J0YywgYWRqdXN0ZWRfbW9kZSk7CisJbnZfY3J0Y19jYWxjX3N0YXRlX2V4dChjcnRjLCBtb2RlLCBhZGp1c3RlZF9tb2RlLT5jbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG52X2NydGNfc2F2ZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhjcnRjKTsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjcnRjLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudjA0X21vZGVfc3RhdGUgKnN0YXRlID0gJmRldl9wcml2LT5tb2RlX3JlZzsKKwlzdHJ1Y3QgbnYwNF9jcnRjX3JlZyAqY3J0Y19zdGF0ZSA9ICZzdGF0ZS0+Y3J0Y19yZWdbbnZfY3J0Yy0+aW5kZXhdOworCXN0cnVjdCBudjA0X21vZGVfc3RhdGUgKnNhdmVkID0gJmRldl9wcml2LT5zYXZlZF9yZWc7CisJc3RydWN0IG52MDRfY3J0Y19yZWcgKmNydGNfc2F2ZWQgPSAmc2F2ZWQtPmNydGNfcmVnW252X2NydGMtPmluZGV4XTsKKworCWlmIChudl90d29faGVhZHMoY3J0Yy0+ZGV2KSkKKwkJTlZTZXRPd25lcihjcnRjLT5kZXYsIG52X2NydGMtPmluZGV4KTsKKworCW5vdXZlYXVfaHdfc2F2ZV9zdGF0ZShjcnRjLT5kZXYsIG52X2NydGMtPmluZGV4LCBzYXZlZCk7CisKKwkvKiBpbml0IHNvbWUgc3RhdGUgdG8gc2F2ZWQgdmFsdWUgKi8KKwlzdGF0ZS0+c2VsX2NsayA9IHNhdmVkLT5zZWxfY2xrICYgfigweDUgPDwgMTYpOworCWNydGNfc3RhdGUtPkNSVENbTlZfQ0lPX0NSRV9MQ0RfX0lOREVYXSA9IGNydGNfc2F2ZWQtPkNSVENbTlZfQ0lPX0NSRV9MQ0RfX0lOREVYXTsKKwlzdGF0ZS0+cGxsc2VsID0gc2F2ZWQtPnBsbHNlbCAmIH4oUExMU0VMX1ZQTEwxX01BU0sgfCBQTExTRUxfVlBMTDJfTUFTSyB8IFBMTFNFTF9UVl9NQVNLKTsKKwljcnRjX3N0YXRlLT5ncGlvX2V4dCA9IGNydGNfc2F2ZWQtPmdwaW9fZXh0OworfQorCitzdGF0aWMgdm9pZCBudl9jcnRjX3Jlc3RvcmUoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gY3J0Yy0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaGVhZCA9IG52X2NydGMtPmluZGV4OworCXVpbnQ4X3Qgc2F2ZWRfY3IyMSA9IGRldl9wcml2LT5zYXZlZF9yZWcuY3J0Y19yZWdbaGVhZF0uQ1JUQ1tOVl9DSU9fQ1JFXzIxXTsKKworCWlmIChudl90d29faGVhZHMoY3J0Yy0+ZGV2KSkKKwkJTlZTZXRPd25lcihjcnRjLT5kZXYsIGhlYWQpOworCisJbm91dmVhdV9od19sb2FkX3N0YXRlKGNydGMtPmRldiwgaGVhZCwgJmRldl9wcml2LT5zYXZlZF9yZWcpOworCW52X2xvY2tfdmdhX2NydGNfc2hhZG93KGNydGMtPmRldiwgaGVhZCwgc2F2ZWRfY3IyMSk7CisKKwludl9jcnRjLT5sYXN0X2RwbXMgPSBOVl9EUE1TX0NMRUFSRUQ7Cit9CisKK3N0YXRpYyB2b2lkIG52X2NydGNfcHJlcGFyZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisJc3RydWN0IGRybV9jcnRjX2hlbHBlcl9mdW5jcyAqZnVuY3MgPSBjcnRjLT5oZWxwZXJfcHJpdmF0ZTsKKworCWlmIChudl90d29faGVhZHMoZGV2KSkKKwkJTlZTZXRPd25lcihkZXYsIG52X2NydGMtPmluZGV4KTsKKworCWZ1bmNzLT5kcG1zKGNydGMsIERSTV9NT0RFX0RQTVNfT0ZGKTsKKworCU5WQmxhbmtTY3JlZW4oZGV2LCBudl9jcnRjLT5pbmRleCwgdHJ1ZSk7CisKKwkvKiBTb21lIG1vcmUgcHJlcGVyYXRpb24uICovCisJTlZXcml0ZUNSVEMoZGV2LCBudl9jcnRjLT5pbmRleCwgTlZfUENSVENfQ09ORklHLCBOVl9QQ1JUQ19DT05GSUdfU1RBUlRfQUREUkVTU19OT05fVkdBKTsKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl80MCkgeworCQl1aW50MzJfdCByZWc5MDAgPSBOVlJlYWRSQU1EQUMoZGV2LCBudl9jcnRjLT5pbmRleCwgTlZfUFJBTURBQ185MDApOworCQlOVldyaXRlUkFNREFDKGRldiwgbnZfY3J0Yy0+aW5kZXgsIE5WX1BSQU1EQUNfOTAwLCByZWc5MDAgJiB+MHgxMDAwMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBudl9jcnRjX2NvbW1pdChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgZHJtX2NydGNfaGVscGVyX2Z1bmNzICpmdW5jcyA9IGNydGMtPmhlbHBlcl9wcml2YXRlOworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGNydGMtPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhjcnRjKTsKKworCW5vdXZlYXVfaHdfbG9hZF9zdGF0ZShkZXYsIG52X2NydGMtPmluZGV4LCAmZGV2X3ByaXYtPm1vZGVfcmVnKTsKKwludjA0X2NydGNfbW9kZV9zZXRfYmFzZShjcnRjLCBjcnRjLT54LCBjcnRjLT55LCBOVUxMKTsKKworI2lmZGVmIF9fQklHX0VORElBTgorCS8qIHR1cm4gb24gTEZCIHN3YXBwaW5nICovCisJeworCQl1aW50OF90IHRtcCA9IE5WUmVhZFZnYUNydGMoZGV2LCBudl9jcnRjLT5pbmRleCwgTlZfQ0lPX0NSRV9SQ1IpOworCQl0bXAgfD0gTUFTSyhOVl9DSU9fQ1JFX1JDUl9FTkRJQU5fQklHKTsKKwkJTlZXcml0ZVZnYUNydGMoZGV2LCBudl9jcnRjLT5pbmRleCwgTlZfQ0lPX0NSRV9SQ1IsIHRtcCk7CisJfQorI2VuZGlmCisKKwlmdW5jcy0+ZHBtcyhjcnRjLCBEUk1fTU9ERV9EUE1TX09OKTsKK30KKworc3RhdGljIHZvaWQgbnZfY3J0Y19kZXN0cm95KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOworCisJTlZfREVCVUcoY3J0Yy0+ZGV2LCAiXG4iKTsKKworCWlmICghbnZfY3J0YykKKwkJcmV0dXJuOworCisJZHJtX2NydGNfY2xlYW51cChjcnRjKTsKKworCW5vdXZlYXVfYm9fcmVmKE5VTEwsICZudl9jcnRjLT5jdXJzb3IubnZibyk7CisJa2ZyZWUobnZfY3J0Yyk7Cit9CisKK3N0YXRpYyB2b2lkCitudl9jcnRjX2dhbW1hX2xvYWQoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG52X2NydGMtPmJhc2UuZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IHJnYiB7IHVpbnQ4X3QgciwgZywgYjsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSAqcmdiczsKKwlpbnQgaTsKKworCXJnYnMgPSAoc3RydWN0IHJnYiAqKWRldl9wcml2LT5tb2RlX3JlZy5jcnRjX3JlZ1tudl9jcnRjLT5pbmRleF0uREFDOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlyZ2JzW2ldLnIgPSBudl9jcnRjLT5sdXQucltpXSA+PiA4OworCQlyZ2JzW2ldLmcgPSBudl9jcnRjLT5sdXQuZ1tpXSA+PiA4OworCQlyZ2JzW2ldLmIgPSBudl9jcnRjLT5sdXQuYltpXSA+PiA4OworCX0KKworCW5vdXZlYXVfaHdfbG9hZF9zdGF0ZV9wYWxldHRlKGRldiwgbnZfY3J0Yy0+aW5kZXgsICZkZXZfcHJpdi0+bW9kZV9yZWcpOworfQorCitzdGF0aWMgdm9pZAorbnZfY3J0Y19nYW1tYV9zZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLCB1MTYgKnIsIHUxNiAqZywgdTE2ICpiLCB1aW50MzJfdCBzaXplKQoreworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisJaW50IGk7CisKKwlpZiAoc2l6ZSAhPSAyNTYpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQludl9jcnRjLT5sdXQucltpXSA9IHJbaV07CisJCW52X2NydGMtPmx1dC5nW2ldID0gZ1tpXTsKKwkJbnZfY3J0Yy0+bHV0LmJbaV0gPSBiW2ldOworCX0KKworCS8qIFdlIG5lZWQgdG8ga25vdyB0aGUgZGVwdGggYmVmb3JlIHdlIHVwbG9hZCwgYnV0IGl0J3MgcG9zc2libGUgdG8KKwkgKiBnZXQgY2FsbGVkIGJlZm9yZSBhIGZyYW1lYnVmZmVyIGlzIGJvdW5kLiAgSWYgdGhpcyBpcyB0aGUgY2FzZSwKKwkgKiBtYXJrIHRoZSBsdXQgdmFsdWVzIGFzIGRpcnR5IGJ5IHNldHRpbmcgZGVwdGg9PTAsIGFuZCBpdCdsbCBiZQorCSAqIHVwbG9hZGVkIG9uIHRoZSBmaXJzdCBtb2RlX3NldF9iYXNlKCkKKwkgKi8KKwlpZiAoIW52X2NydGMtPmJhc2UuZmIpIHsKKwkJbnZfY3J0Yy0+bHV0LmRlcHRoID0gMDsKKwkJcmV0dXJuOworCX0KKworCW52X2NydGNfZ2FtbWFfbG9hZChjcnRjKTsKK30KKworc3RhdGljIGludAorbnYwNF9jcnRjX21vZGVfc2V0X2Jhc2Uoc3RydWN0IGRybV9jcnRjICpjcnRjLCBpbnQgeCwgaW50IHksCisJCQlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpvbGRfZmIpCit7CisJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhjcnRjKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52MDRfY3J0Y19yZWcgKnJlZ3AgPSAmZGV2X3ByaXYtPm1vZGVfcmVnLmNydGNfcmVnW252X2NydGMtPmluZGV4XTsKKwlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpkcm1fZmIgPSBudl9jcnRjLT5iYXNlLmZiOworCXN0cnVjdCBub3V2ZWF1X2ZyYW1lYnVmZmVyICpmYiA9IG5vdXZlYXVfZnJhbWVidWZmZXIoZHJtX2ZiKTsKKwlpbnQgYXJiX2J1cnN0LCBhcmJfbHdtOworCWludCByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X2JvX3BpbihmYi0+bnZibywgVFRNX1BMX0ZMQUdfVlJBTSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChvbGRfZmIpIHsKKwkJc3RydWN0IG5vdXZlYXVfZnJhbWVidWZmZXIgKm9mYiA9IG5vdXZlYXVfZnJhbWVidWZmZXIob2xkX2ZiKTsKKwkJbm91dmVhdV9ib191bnBpbihvZmItPm52Ym8pOworCX0KKworCW52X2NydGMtPmZiLm9mZnNldCA9IGZiLT5udmJvLT5iby5vZmZzZXQ7CisKKwlpZiAobnZfY3J0Yy0+bHV0LmRlcHRoICE9IGRybV9mYi0+ZGVwdGgpIHsKKwkJbnZfY3J0Yy0+bHV0LmRlcHRoID0gZHJtX2ZiLT5kZXB0aDsKKwkJbnZfY3J0Y19nYW1tYV9sb2FkKGNydGMpOworCX0KKworCS8qIFVwZGF0ZSB0aGUgZnJhbWVidWZmZXIgZm9ybWF0LiAqLworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV9QSVhFTF9JTkRFWF0gJj0gfjM7CisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JFX1BJWEVMX0lOREVYXSB8PSAoY3J0Yy0+ZmItPmRlcHRoICsgMSkgLyA4OworCXJlZ3AtPnJhbWRhY19nZW5fY3RybCAmPSB+TlZfUFJBTURBQ19HRU5FUkFMX0NPTlRST0xfQUxUX01PREVfU0VMOworCWlmIChjcnRjLT5mYi0+ZGVwdGggPT0gMTYpCisJCXJlZ3AtPnJhbWRhY19nZW5fY3RybCB8PSBOVl9QUkFNREFDX0dFTkVSQUxfQ09OVFJPTF9BTFRfTU9ERV9TRUw7CisJY3J0Y193cl9jaW9fc3RhdGUoY3J0YywgcmVncCwgTlZfQ0lPX0NSRV9QSVhFTF9JTkRFWCk7CisJTlZXcml0ZVJBTURBQyhkZXYsIG52X2NydGMtPmluZGV4LCBOVl9QUkFNREFDX0dFTkVSQUxfQ09OVFJPTCwKKwkJICAgICAgcmVncC0+cmFtZGFjX2dlbl9jdHJsKTsKKworCXJlZ3AtPkNSVENbTlZfQ0lPX0NSX09GRlNFVF9JTkRFWF0gPSBkcm1fZmItPnBpdGNoID4+IDM7CisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JFX1JQQzBfSU5ERVhdID0KKwkJWExBVEUoZHJtX2ZiLT5waXRjaCA+PiAzLCA4LCBOVl9DSU9fQ1JFX1JQQzBfT0ZGU0VUXzEwXzgpOworCWNydGNfd3JfY2lvX3N0YXRlKGNydGMsIHJlZ3AsIE5WX0NJT19DUkVfUlBDMF9JTkRFWCk7CisJY3J0Y193cl9jaW9fc3RhdGUoY3J0YywgcmVncCwgTlZfQ0lPX0NSX09GRlNFVF9JTkRFWCk7CisKKwkvKiBVcGRhdGUgdGhlIGZyYW1lYnVmZmVyIGxvY2F0aW9uLiAqLworCXJlZ3AtPmZiX3N0YXJ0ID0gbnZfY3J0Yy0+ZmIub2Zmc2V0ICYgfjM7CisJcmVncC0+ZmJfc3RhcnQgKz0gKHkgKiBkcm1fZmItPnBpdGNoKSArICh4ICogZHJtX2ZiLT5iaXRzX3Blcl9waXhlbCAvIDgpOworCU5WV3JpdGVDUlRDKGRldiwgbnZfY3J0Yy0+aW5kZXgsIE5WX1BDUlRDX1NUQVJULCByZWdwLT5mYl9zdGFydCk7CisKKwkvKiBVcGRhdGUgdGhlIGFyYml0cmF0aW9uIHBhcmFtZXRlcnMuICovCisJbm91dmVhdV9jYWxjX2FyYihkZXYsIGNydGMtPm1vZGUuY2xvY2ssIGRybV9mYi0+Yml0c19wZXJfcGl4ZWwsCisJCQkgJmFyYl9idXJzdCwgJmFyYl9sd20pOworCisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JFX0ZGX0lOREVYXSA9IGFyYl9idXJzdDsKKwlyZWdwLT5DUlRDW05WX0NJT19DUkVfRkZMV01fX0lOREVYXSA9IGFyYl9sd20gJiAweGZmOworCWNydGNfd3JfY2lvX3N0YXRlKGNydGMsIHJlZ3AsIE5WX0NJT19DUkVfRkZfSU5ERVgpOworCWNydGNfd3JfY2lvX3N0YXRlKGNydGMsIHJlZ3AsIE5WX0NJT19DUkVfRkZMV01fX0lOREVYKTsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzMwKSB7CisJCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV80N10gPSBhcmJfbHdtID4+IDg7CisJCWNydGNfd3JfY2lvX3N0YXRlKGNydGMsIHJlZ3AsIE5WX0NJT19DUkVfNDcpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBudjA0X2N1cnNvcl91cGxvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfYm8gKnNyYywKKwkJCSAgICAgICBzdHJ1Y3Qgbm91dmVhdV9ibyAqZHN0KQoreworCWludCB3aWR0aCA9IG52X2N1cnNvcl93aWR0aChkZXYpOworCXVpbnQzMl90IHBpeGVsOworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKwkJCXBpeGVsID0gbm91dmVhdV9ib19yZDMyKHNyYywgaSo2NCArIGopOworCisJCQlub3V2ZWF1X2JvX3dyMTYoZHN0LCBpKndpZHRoICsgaiwgKHBpeGVsICYgMHg4MDAwMDAwMCkgPj4gMTYKKwkJCQkgICAgIHwgKHBpeGVsICYgMHhmODAwMDApID4+IDkKKwkJCQkgICAgIHwgKHBpeGVsICYgMHhmODAwKSA+PiA2CisJCQkJICAgICB8IChwaXhlbCAmIDB4ZjgpID4+IDMpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBudjExX2N1cnNvcl91cGxvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfYm8gKnNyYywKKwkJCSAgICAgICBzdHJ1Y3Qgbm91dmVhdV9ibyAqZHN0KQoreworCXVpbnQzMl90IHBpeGVsOworCWludCBhbHBoYSwgaTsKKworCS8qIG52MTErIHN1cHBvcnRzIHByZW11bHRpcGxpZWQgKFBNKSwgb3Igbm9uLXByZW11bHRpcGxpZWQgKE5QTSkgYWxwaGEKKwkgKiBjdXJzb3JzICh0aG91Z2ggTlBNIGluIGNvbWJpbmF0aW9uIHdpdGggZnAgZGl0aGVyaW5nIG1heSBub3Qgd29yayBvbgorCSAqIG52MTEsIGZyb20gIm52IiBkcml2ZXIgaGlzdG9yeSkKKwkgKiBOUE0gbW9kZSBuZWVkcyBOVl9QQ1JUQ19DVVJTT1JfQ09ORklHX0FMUEhBX0JMRU5EIHNldCBhbmQgaXMgd2hhdCB0aGUKKwkgKiBibG9iIHVzZXMsIGhvd2V2ZXIgd2UgZ2V0IGdpdmVuIFBNIGN1cnNvcnMgc28gd2UgdXNlIFBNIG1vZGUKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjQgKiA2NDsgaSsrKSB7CisJCXBpeGVsID0gbm91dmVhdV9ib19yZDMyKHNyYywgaSk7CisKKwkJLyogaHcgZ2V0cyB1bmhhcHB5IGlmIGFscGhhIDw9IHJnYiB2YWx1ZXMuICBmb3IgYSBQTSBpbWFnZSAibGVzcworCQkgKiB0aGFuIiBzaG91bGRuJ3QgaGFwcGVuOyBmaXggImVxdWFsIHRvIiBjYXNlIGJ5IGFkZGluZyBvbmUgdG8KKwkJICogYWxwaGEgY2hhbm5lbCAoc2xpZ2h0bHkgaW5hY2N1cmF0ZSwgYnV0IHNvIGlzIGF0dGVtcHRpbmcgdG8KKwkJICogZ2V0IGJhY2sgdG8gTlBNIGltYWdlcywgZHVlIHRvIGxpbWl0cyBvZiBpbnRlZ2VyIHByZWNpc2lvbikKKwkJICovCisJCWFscGhhID0gcGl4ZWwgPj4gMjQ7CisJCWlmIChhbHBoYSA+IDAgJiYgYWxwaGEgPCAyNTUpCisJCQlwaXhlbCA9IChwaXhlbCAmIDB4MDBmZmZmZmYpIHwgKChhbHBoYSArIDEpIDw8IDI0KTsKKworI2lmZGVmIF9fQklHX0VORElBTgorCQl7CisJCQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJCQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHgxMSkgeworCQkJCXBpeGVsID0gKChwaXhlbCAmIDB4MDAwMDAwZmYpIDw8IDI0KSB8CisJCQkJCSgocGl4ZWwgJiAweDAwMDBmZjAwKSA8PCA4KSB8CisJCQkJCSgocGl4ZWwgJiAweDAwZmYwMDAwKSA+PiA4KSB8CisJCQkJCSgocGl4ZWwgJiAweGZmMDAwMDAwKSA+PiAyNCk7CisJCQl9CisJCX0KKyNlbmRpZgorCisJCW5vdXZlYXVfYm9fd3IzMihkc3QsIGksIHBpeGVsKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK252MDRfY3J0Y19jdXJzb3Jfc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0Yywgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCSAgICAgdWludDMyX3QgYnVmZmVyX2hhbmRsZSwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjcnRjLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkZXZfcHJpdi0+ZGV2OworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisJc3RydWN0IG5vdXZlYXVfYm8gKmN1cnNvciA9IE5VTEw7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpnZW07CisJaW50IHJldCA9IDA7CisKKwlpZiAod2lkdGggIT0gNjQgfHwgaGVpZ2h0ICE9IDY0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghYnVmZmVyX2hhbmRsZSkgeworCQludl9jcnRjLT5jdXJzb3IuaGlkZShudl9jcnRjLCB0cnVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZ2VtID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZV9wcml2LCBidWZmZXJfaGFuZGxlKTsKKwlpZiAoIWdlbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJY3Vyc29yID0gbm91dmVhdV9nZW1fb2JqZWN0KGdlbSk7CisKKwlyZXQgPSBub3V2ZWF1X2JvX21hcChjdXJzb3IpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID49IDB4MTEpCisJCW52MTFfY3Vyc29yX3VwbG9hZChkZXYsIGN1cnNvciwgbnZfY3J0Yy0+Y3Vyc29yLm52Ym8pOworCWVsc2UKKwkJbnYwNF9jdXJzb3JfdXBsb2FkKGRldiwgY3Vyc29yLCBudl9jcnRjLT5jdXJzb3IubnZibyk7CisKKwlub3V2ZWF1X2JvX3VubWFwKGN1cnNvcik7CisJbnZfY3J0Yy0+Y3Vyc29yLm9mZnNldCA9IG52X2NydGMtPmN1cnNvci5udmJvLT5iby5vZmZzZXQ7CisJbnZfY3J0Yy0+Y3Vyc29yLnNldF9vZmZzZXQobnZfY3J0YywgbnZfY3J0Yy0+Y3Vyc29yLm9mZnNldCk7CisJbnZfY3J0Yy0+Y3Vyc29yLnNob3cobnZfY3J0YywgdHJ1ZSk7CitvdXQ6CisJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKGdlbSk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorbnYwNF9jcnRjX2N1cnNvcl9tb3ZlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IHgsIGludCB5KQoreworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisKKwludl9jcnRjLT5jdXJzb3Iuc2V0X3Bvcyhudl9jcnRjLCB4LCB5KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY3J0Y19mdW5jcyBudjA0X2NydGNfZnVuY3MgPSB7CisJLnNhdmUgPSBudl9jcnRjX3NhdmUsCisJLnJlc3RvcmUgPSBudl9jcnRjX3Jlc3RvcmUsCisJLmN1cnNvcl9zZXQgPSBudjA0X2NydGNfY3Vyc29yX3NldCwKKwkuY3Vyc29yX21vdmUgPSBudjA0X2NydGNfY3Vyc29yX21vdmUsCisJLmdhbW1hX3NldCA9IG52X2NydGNfZ2FtbWFfc2V0LAorCS5zZXRfY29uZmlnID0gZHJtX2NydGNfaGVscGVyX3NldF9jb25maWcsCisJLmRlc3Ryb3kgPSBudl9jcnRjX2Rlc3Ryb3ksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jcnRjX2hlbHBlcl9mdW5jcyBudjA0X2NydGNfaGVscGVyX2Z1bmNzID0geworCS5kcG1zID0gbnZfY3J0Y19kcG1zLAorCS5wcmVwYXJlID0gbnZfY3J0Y19wcmVwYXJlLAorCS5jb21taXQgPSBudl9jcnRjX2NvbW1pdCwKKwkubW9kZV9maXh1cCA9IG52X2NydGNfbW9kZV9maXh1cCwKKwkubW9kZV9zZXQgPSBudl9jcnRjX21vZGVfc2V0LAorCS5tb2RlX3NldF9iYXNlID0gbnYwNF9jcnRjX21vZGVfc2V0X2Jhc2UsCisJLmxvYWRfbHV0ID0gbnZfY3J0Y19nYW1tYV9sb2FkLAorfTsKKworaW50CitudjA0X2NydGNfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjX251bSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjOworCWludCByZXQsIGk7CisKKwludl9jcnRjID0ga3phbGxvYyhzaXplb2YoKm52X2NydGMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW52X2NydGMpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCW52X2NydGMtPmx1dC5yW2ldID0gaSA8PCA4OworCQludl9jcnRjLT5sdXQuZ1tpXSA9IGkgPDwgODsKKwkJbnZfY3J0Yy0+bHV0LmJbaV0gPSBpIDw8IDg7CisJfQorCW52X2NydGMtPmx1dC5kZXB0aCA9IDA7CisKKwludl9jcnRjLT5pbmRleCA9IGNydGNfbnVtOworCW52X2NydGMtPmxhc3RfZHBtcyA9IE5WX0RQTVNfQ0xFQVJFRDsKKworCWRybV9jcnRjX2luaXQoZGV2LCAmbnZfY3J0Yy0+YmFzZSwgJm52MDRfY3J0Y19mdW5jcyk7CisJZHJtX2NydGNfaGVscGVyX2FkZCgmbnZfY3J0Yy0+YmFzZSwgJm52MDRfY3J0Y19oZWxwZXJfZnVuY3MpOworCWRybV9tb2RlX2NydGNfc2V0X2dhbW1hX3NpemUoJm52X2NydGMtPmJhc2UsIDI1Nik7CisKKwlyZXQgPSBub3V2ZWF1X2JvX25ldyhkZXYsIE5VTEwsIDY0KjY0KjQsIDB4MTAwLCBUVE1fUExfRkxBR19WUkFNLAorCQkJICAgICAwLCAweDAwMDAsIGZhbHNlLCB0cnVlLCAmbnZfY3J0Yy0+Y3Vyc29yLm52Ym8pOworCWlmICghcmV0KSB7CisJCXJldCA9IG5vdXZlYXVfYm9fcGluKG52X2NydGMtPmN1cnNvci5udmJvLCBUVE1fUExfRkxBR19WUkFNKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBub3V2ZWF1X2JvX21hcChudl9jcnRjLT5jdXJzb3IubnZibyk7CisJCWlmIChyZXQpCisJCQlub3V2ZWF1X2JvX3JlZihOVUxMLCAmbnZfY3J0Yy0+Y3Vyc29yLm52Ym8pOworCX0KKworCW52MDRfY3Vyc29yX2luaXQobnZfY3J0Yyk7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9jdXJzb3IuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfY3Vyc29yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlhOTFiOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfY3Vyc29yLmMKQEAgLTAsMCArMSw3MCBAQAorI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm1fbW9kZS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfcmVnLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2NydGMuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2h3LmgiCisKK3N0YXRpYyB2b2lkCitudjA0X2N1cnNvcl9zaG93KHN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMsIGJvb2wgdXBkYXRlKQoreworCW52X3Nob3dfY3Vyc29yKG52X2NydGMtPmJhc2UuZGV2LCBudl9jcnRjLT5pbmRleCwgdHJ1ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitudjA0X2N1cnNvcl9oaWRlKHN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMsIGJvb2wgdXBkYXRlKQoreworCW52X3Nob3dfY3Vyc29yKG52X2NydGMtPmJhc2UuZGV2LCBudl9jcnRjLT5pbmRleCwgZmFsc2UpOworfQorCitzdGF0aWMgdm9pZAorbnYwNF9jdXJzb3Jfc2V0X3BvcyhzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjLCBpbnQgeCwgaW50IHkpCit7CisJTlZXcml0ZVJBTURBQyhudl9jcnRjLT5iYXNlLmRldiwgbnZfY3J0Yy0+aW5kZXgsCisJCSAgICAgIE5WX1BSQU1EQUNfQ1VfU1RBUlRfUE9TLAorCQkgICAgICBYTEFURSh5LCAwLCBOVl9QUkFNREFDX0NVX1NUQVJUX1BPU19ZKSB8CisJCSAgICAgIFhMQVRFKHgsIDAsIE5WX1BSQU1EQUNfQ1VfU1RBUlRfUE9TX1gpKTsKK30KKworc3RhdGljIHZvaWQKK2NydGNfd3JfY2lvX3N0YXRlKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yywgc3RydWN0IG52MDRfY3J0Y19yZWcgKmNydGNzdGF0ZSwgaW50IGluZGV4KQoreworCU5WV3JpdGVWZ2FDcnRjKGNydGMtPmRldiwgbm91dmVhdV9jcnRjKGNydGMpLT5pbmRleCwgaW5kZXgsCisJCSAgICAgICBjcnRjc3RhdGUtPkNSVENbaW5kZXhdKTsKK30KKworc3RhdGljIHZvaWQKK252MDRfY3Vyc29yX3NldF9vZmZzZXQoc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YywgdWludDMyX3Qgb2Zmc2V0KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBudl9jcnRjLT5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudjA0X2NydGNfcmVnICpyZWdwID0gJmRldl9wcml2LT5tb2RlX3JlZy5jcnRjX3JlZ1tudl9jcnRjLT5pbmRleF07CisJc3RydWN0IGRybV9jcnRjICpjcnRjID0gJm52X2NydGMtPmJhc2U7CisKKwlyZWdwLT5DUlRDW05WX0NJT19DUkVfSENVUl9BRERSMF9JTkRFWF0gPQorCQlNQVNLKE5WX0NJT19DUkVfSENVUl9BU0kpIHwKKwkJWExBVEUob2Zmc2V0LCAxNywgTlZfQ0lPX0NSRV9IQ1VSX0FERFIwX0FEUik7CisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JFX0hDVVJfQUREUjFfSU5ERVhdID0KKwkJWExBVEUob2Zmc2V0LCAxMSwgTlZfQ0lPX0NSRV9IQ1VSX0FERFIxX0FEUik7CisJaWYgKGNydGMtPm1vZGUuZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0RCTFNDQU4pCisJCXJlZ3AtPkNSVENbTlZfQ0lPX0NSRV9IQ1VSX0FERFIxX0lOREVYXSB8PQorCQkJTUFTSyhOVl9DSU9fQ1JFX0hDVVJfQUREUjFfQ1VSX0RCTCk7CisJcmVncC0+Q1JUQ1tOVl9DSU9fQ1JFX0hDVVJfQUREUjJfSU5ERVhdID0gb2Zmc2V0ID4+IDI0OworCisJY3J0Y193cl9jaW9fc3RhdGUoY3J0YywgcmVncCwgTlZfQ0lPX0NSRV9IQ1VSX0FERFIwX0lOREVYKTsKKwljcnRjX3dyX2Npb19zdGF0ZShjcnRjLCByZWdwLCBOVl9DSU9fQ1JFX0hDVVJfQUREUjFfSU5ERVgpOworCWNydGNfd3JfY2lvX3N0YXRlKGNydGMsIHJlZ3AsIE5WX0NJT19DUkVfSENVUl9BRERSMl9JTkRFWCk7CisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNDApCisJCW52X2ZpeF9udjQwX2h3X2N1cnNvcihkZXYsIG52X2NydGMtPmluZGV4KTsKK30KKworaW50CitudjA0X2N1cnNvcl9pbml0KHN0cnVjdCBub3V2ZWF1X2NydGMgKmNydGMpCit7CisJY3J0Yy0+Y3Vyc29yLnNldF9vZmZzZXQgPSBudjA0X2N1cnNvcl9zZXRfb2Zmc2V0OworCWNydGMtPmN1cnNvci5zZXRfcG9zID0gbnYwNF9jdXJzb3Jfc2V0X3BvczsKKwljcnRjLT5jdXJzb3IuaGlkZSA9IG52MDRfY3Vyc29yX2hpZGU7CisJY3J0Yy0+Y3Vyc29yLnNob3cgPSBudjA0X2N1cnNvcl9zaG93OworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2RhYy5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9kYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWZhNTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9kYWMuYwpAQCAtMCwwICsxLDUyOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzIE5WSURJQSwgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAyMDA2IERhdmUgQWlybGllCisgKiBDb3B5cmlnaHQgMjAwNyBNYWFydGVuIE1hYXRodWlzCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA5IFN0dWFydCBCZW5uZXR0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCisKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZW5jb2Rlci5oIgorI2luY2x1ZGUgIm5vdXZlYXVfY29ubmVjdG9yLmgiCisjaW5jbHVkZSAibm91dmVhdV9jcnRjLmgiCisjaW5jbHVkZSAibm91dmVhdV9ody5oIgorI2luY2x1ZGUgIm52cmVnLmgiCisKK2ludCBudjA0X2RhY19vdXRwdXRfb2Zmc2V0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgZGNiX2VudHJ5ICpkY2IgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2RlciktPmRjYjsKKwlpbnQgb2Zmc2V0ID0gMDsKKworCWlmIChkY2ItPm9yICYgKDggfCBPVVRQVVRfQykpCisJCW9mZnNldCArPSAweDY4OworCWlmIChkY2ItPm9yICYgKDggfCBPVVRQVVRfQikpCisJCW9mZnNldCArPSAweDIwMDA7CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKgorICogYXJiaXRyYXJ5IGxpbWl0IHRvIG51bWJlciBvZiBzZW5zZSBvc2NpbGxhdGlvbnMgdG9sZXJhdGVkIGluIG9uZSBzYW1wbGUKKyAqIHBlcmlvZCAob2JzZXJ2ZWQgdG8gYmUgYXQgbGVhc3QgMTMgaW4gIm52aWRpYSIpCisgKi8KKyNkZWZpbmUgTUFYX0hCTEFOS19PU0MgMjAKKworLyoKKyAqIGFyYml0cmFyeSBsaW1pdCB0byBudW1iZXIgb2YgY29uZmxpY3Rpbmcgc2FtcGxlIHBhaXJzIHRvIHRvbGVyYXRlIGF0IGEKKyAqIHZvbHRhZ2Ugc3RlcCAob2JzZXJ2ZWQgdG8gYmUgYXQgbGVhc3QgNSBpbiAibnZpZGlhIikKKyAqLworI2RlZmluZSBNQVhfU0FNUExFX1BBSVJTIDEwCisKK3N0YXRpYyBpbnQgc2FtcGxlX2xvYWRfdHdpY2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgYm9vbCBzZW5zZVsyXSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJYm9vbCBzZW5zZV9hLCBzZW5zZV9iLCBzZW5zZV9iX3ByaW1lOworCQlpbnQgaiA9IDA7CisKKwkJLyoKKwkJICogd2FpdCBmb3IgYml0IDAgY2xlYXIgLS0gb3V0IG9mIGhibGFuayAtLSAoc2F5IHJlZyB2YWx1ZSAweDQpLAorCQkgKiB0aGVuIHdhaXQgZm9yIHRyYW5zaXRpb24gMHg0LT4weDUtPjB4NDogZW50ZXIgaGJsYW5rLCBsZWF2ZQorCQkgKiBoYmxhbmsgYWdhaW4KKwkJICogdXNlIGEgMTBtcyB0aW1lb3V0IChndWFyZHMgYWdhaW5zdCBjcnRjIGJlaW5nIGluYWN0aXZlLCBpbgorCQkgKiB3aGljaCBjYXNlIGJsYW5rIHN0YXRlIHdvdWxkIG5ldmVyIGNoYW5nZSkKKwkJICovCisJCWlmICghbm91dmVhdV93YWl0X3VudGlsKGRldiwgMTAwMDAwMDAsIE5WX1BSTUNJT19JTlAwX19DT0xPUiwKKwkJCQkJMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCkpCisJCQlyZXR1cm4gLUVCVVNZOworCQlpZiAoIW5vdXZlYXVfd2FpdF91bnRpbChkZXYsIDEwMDAwMDAwLCBOVl9QUk1DSU9fSU5QMF9fQ09MT1IsCisJCQkJCTB4MDAwMDAwMDEsIDB4MDAwMDAwMDEpKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJaWYgKCFub3V2ZWF1X3dhaXRfdW50aWwoZGV2LCAxMDAwMDAwMCwgTlZfUFJNQ0lPX0lOUDBfX0NPTE9SLAorCQkJCQkweDAwMDAwMDAxLCAweDAwMDAwMDAwKSkKKwkJCXJldHVybiAtRUJVU1k7CisKKwkJdWRlbGF5KDEwMCk7CisJCS8qIHdoZW4gbGV2ZWwgdHJpZ2dlcnMsIHNlbnNlIGlzIF9MT18gKi8KKwkJc2Vuc2VfYSA9IG52X3JkMDgoZGV2LCBOVl9QUk1DSU9fSU5QMCkgJiAweDEwOworCisJCS8qIHRha2UgYW5vdGhlciByZWFkaW5nIHVudGlsIGl0IGFncmVlcyB3aXRoIHNlbnNlX2EuLi4gKi8KKwkJZG8geworCQkJdWRlbGF5KDEwMCk7CisJCQlzZW5zZV9iID0gbnZfcmQwOChkZXYsIE5WX1BSTUNJT19JTlAwKSAmIDB4MTA7CisJCQlpZiAoc2Vuc2VfYSAhPSBzZW5zZV9iKSB7CisJCQkJc2Vuc2VfYl9wcmltZSA9CisJCQkJCW52X3JkMDgoZGV2LCBOVl9QUk1DSU9fSU5QMCkgJiAweDEwOworCQkJCWlmIChzZW5zZV9iID09IHNlbnNlX2JfcHJpbWUpIHsKKwkJCQkJLyogLi4uIHVubGVzcyB0d28gY29uc2VjdXRpdmUgc3Vic2VxdWVudAorCQkJCQkgKiBzYW1wbGVzIGFncmVlOyBzZW5zZV9hIGlzIHJlcGxhY2VkICovCisJCQkJCXNlbnNlX2EgPSBzZW5zZV9iOworCQkJCQkvKiBmb3JjZSBtaXMtbWF0Y2ggc28gd2UgbG9vcCAqLworCQkJCQlzZW5zZV9iID0gIXNlbnNlX2E7CisJCQkJfQorCQkJfQorCQl9IHdoaWxlICgoc2Vuc2VfYSAhPSBzZW5zZV9iKSAmJiArK2ogPCBNQVhfSEJMQU5LX09TQyk7CisKKwkJaWYgKGogPT0gTUFYX0hCTEFOS19PU0MpCisJCQkvKiB3aXRoIHNvIG11Y2ggb3NjaWxsYXRpb24sIGRlZmF1bHQgdG8gc2Vuc2U6TE8gKi8KKwkJCXNlbnNlW2ldID0gZmFsc2U7CisJCWVsc2UKKwkJCXNlbnNlW2ldID0gc2Vuc2VfYTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgbnYwNF9kYWNfZGV0ZWN0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCQkJCSBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJdWludDhfdCBzYXZlZF9zZXExLCBzYXZlZF9waSwgc2F2ZWRfcnBjMTsKKwl1aW50OF90IHNhdmVkX3BhbGV0dGUwWzNdLCBzYXZlZF9wYWxldHRlX21hc2s7CisJdWludDMyX3Qgc2F2ZWRfcnRlc3RfY3RybCwgc2F2ZWRfcmdlbl9jdHJsOworCWludCBpOworCXVpbnQ4X3QgYmx1ZTsKKwlib29sIHNlbnNlID0gdHJ1ZTsKKworCS8qCisJICogZm9yIHRoaXMgZGV0ZWN0aW9uIHRvIHdvcmssIHRoZXJlIG5lZWRzIHRvIGJlIGEgbW9kZSBzZXQgdXAgb24gdGhlCisJICogQ1JUQy4gIHRoaXMgaXMgcHJlc3VtZWQgdG8gYmUgdGhlIGNhc2UKKwkgKi8KKworCWlmIChudl90d29faGVhZHMoZGV2KSkKKwkJLyogb25seSBpbXBsZW1lbnRlZCBmb3IgaGVhZCBBIGZvciBub3cgKi8KKwkJTlZTZXRPd25lcihkZXYsIDApOworCisJc2F2ZWRfc2VxMSA9IE5WUmVhZFZnYVNlcShkZXYsIDAsIE5WX1ZJT19TUl9DTE9DS19JTkRFWCk7CisJTlZXcml0ZVZnYVNlcShkZXYsIDAsIE5WX1ZJT19TUl9DTE9DS19JTkRFWCwgc2F2ZWRfc2VxMSAmIH4weDIwKTsKKworCXNhdmVkX3J0ZXN0X2N0cmwgPSBOVlJlYWRSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDX1RFU1RfQ09OVFJPTCk7CisJTlZXcml0ZVJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfVEVTVF9DT05UUk9MLAorCQkgICAgICBzYXZlZF9ydGVzdF9jdHJsICYgfk5WX1BSQU1EQUNfVEVTVF9DT05UUk9MX1BXUkRXTl9EQUNfT0ZGKTsKKworCW1zbGVlcCgxMCk7CisKKwlzYXZlZF9waSA9IE5WUmVhZFZnYUNydGMoZGV2LCAwLCBOVl9DSU9fQ1JFX1BJWEVMX0lOREVYKTsKKwlOVldyaXRlVmdhQ3J0YyhkZXYsIDAsIE5WX0NJT19DUkVfUElYRUxfSU5ERVgsCisJCSAgICAgICBzYXZlZF9waSAmIH4oMHg4MCB8IE1BU0soTlZfQ0lPX0NSRV9QSVhFTF9GT1JNQVQpKSk7CisJc2F2ZWRfcnBjMSA9IE5WUmVhZFZnYUNydGMoZGV2LCAwLCBOVl9DSU9fQ1JFX1JQQzFfSU5ERVgpOworCU5WV3JpdGVWZ2FDcnRjKGRldiwgMCwgTlZfQ0lPX0NSRV9SUEMxX0lOREVYLCBzYXZlZF9ycGMxICYgfjB4YzApOworCisJbnZfd3IwOChkZXYsIE5WX1BSTURJT19SRUFEX01PREVfQUREUkVTUywgMHgwKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQlzYXZlZF9wYWxldHRlMFtpXSA9IG52X3JkMDgoZGV2LCBOVl9QUk1ESU9fUEFMRVRURV9EQVRBKTsKKwlzYXZlZF9wYWxldHRlX21hc2sgPSBudl9yZDA4KGRldiwgTlZfUFJNRElPX1BJWEVMX01BU0spOworCW52X3dyMDgoZGV2LCBOVl9QUk1ESU9fUElYRUxfTUFTSywgMCk7CisKKwlzYXZlZF9yZ2VuX2N0cmwgPSBOVlJlYWRSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDX0dFTkVSQUxfQ09OVFJPTCk7CisJTlZXcml0ZVJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfR0VORVJBTF9DT05UUk9MLAorCQkgICAgICAoc2F2ZWRfcmdlbl9jdHJsICYgfihOVl9QUkFNREFDX0dFTkVSQUxfQ09OVFJPTF9CUENfOEJJVFMgfAorCQkJCQkgICBOVl9QUkFNREFDX0dFTkVSQUxfQ09OVFJPTF9URVJNSU5BVElPTl83NU9ITSkpIHwKKwkJICAgICAgTlZfUFJBTURBQ19HRU5FUkFMX0NPTlRST0xfUElYTUlYX09OKTsKKworCWJsdWUgPSA4OwkvKiBzdGFydCBvZiB0ZXN0IHJhbmdlICovCisKKwlkbyB7CisJCWJvb2wgc2Vuc2VfcGFpclsyXTsKKworCQludl93cjA4KGRldiwgTlZfUFJNRElPX1dSSVRFX01PREVfQUREUkVTUywgMCk7CisJCW52X3dyMDgoZGV2LCBOVl9QUk1ESU9fUEFMRVRURV9EQVRBLCAwKTsKKwkJbnZfd3IwOChkZXYsIE5WX1BSTURJT19QQUxFVFRFX0RBVEEsIDApOworCQkvKiB0ZXN0aW5nIGJsdWUgd29uJ3QgZmluZCBtb25vY2hyb21lIG1vbml0b3JzLiAgSSBkb24ndCBjYXJlICovCisJCW52X3dyMDgoZGV2LCBOVl9QUk1ESU9fUEFMRVRURV9EQVRBLCBibHVlKTsKKworCQlpID0gMDsKKwkJLyogdGFrZSBzYW1wbGUgcGFpcnMgdW50aWwgYm90aCBzYW1wbGVzIGluIHRoZSBwYWlyIGFncmVlICovCisJCWRvIHsKKwkJCWlmIChzYW1wbGVfbG9hZF90d2ljZShkZXYsIHNlbnNlX3BhaXIpKQorCQkJCWdvdG8gb3V0OworCQl9IHdoaWxlICgoc2Vuc2VfcGFpclswXSAhPSBzZW5zZV9wYWlyWzFdKSAmJgorCQkJCQkJCSsraSA8IE1BWF9TQU1QTEVfUEFJUlMpOworCisJCWlmIChpID09IE1BWF9TQU1QTEVfUEFJUlMpCisJCQkvKiB0b28gbXVjaCBvc2NpbGxhdGlvbiBkZWZhdWx0cyB0byBMTyAqLworCQkJc2Vuc2UgPSBmYWxzZTsKKwkJZWxzZQorCQkJc2Vuc2UgPSBzZW5zZV9wYWlyWzBdOworCisJLyoKKwkgKiBpZiBzZW5zZSBnb2VzIExPIGJlZm9yZSBibHVlIHJhbXBzIHRvIDB4MTgsIG1vbml0b3IgaXMgbm90IGNvbm5lY3RlZC4KKwkgKiBlcmdvLCBpZiBibHVlIGdldHMgdG8gMHgxOCwgbW9uaXRvciBtdXN0IGJlIGNvbm5lY3RlZAorCSAqLworCX0gd2hpbGUgKCsrYmx1ZSA8IDB4MTggJiYgc2Vuc2UpOworCitvdXQ6CisJbnZfd3IwOChkZXYsIE5WX1BSTURJT19QSVhFTF9NQVNLLCBzYXZlZF9wYWxldHRlX21hc2spOworCU5WV3JpdGVSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDX0dFTkVSQUxfQ09OVFJPTCwgc2F2ZWRfcmdlbl9jdHJsKTsKKwludl93cjA4KGRldiwgTlZfUFJNRElPX1dSSVRFX01PREVfQUREUkVTUywgMCk7CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJbnZfd3IwOChkZXYsIE5WX1BSTURJT19QQUxFVFRFX0RBVEEsIHNhdmVkX3BhbGV0dGUwW2ldKTsKKwlOVldyaXRlUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19URVNUX0NPTlRST0wsIHNhdmVkX3J0ZXN0X2N0cmwpOworCU5WV3JpdGVWZ2FDcnRjKGRldiwgMCwgTlZfQ0lPX0NSRV9QSVhFTF9JTkRFWCwgc2F2ZWRfcGkpOworCU5WV3JpdGVWZ2FDcnRjKGRldiwgMCwgTlZfQ0lPX0NSRV9SUEMxX0lOREVYLCBzYXZlZF9ycGMxKTsKKwlOVldyaXRlVmdhU2VxKGRldiwgMCwgTlZfVklPX1NSX0NMT0NLX0lOREVYLCBzYXZlZF9zZXExKTsKKworCWlmIChibHVlID09IDB4MTgpIHsKKwkJTlZfVFJBQ0UoZGV2LCAiTG9hZCBkZXRlY3RlZCBvbiBoZWFkIEFcbiIpOworCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisJfQorCisJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOworfQorCitlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIG52MTdfZGFjX2RldGVjdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJCSAgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRjYl9lbnRyeSAqZGNiID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpLT5kY2I7CisJdWludDMyX3QgdGVzdHZhbCwgcmVnb2Zmc2V0ID0gbnYwNF9kYWNfb3V0cHV0X29mZnNldChlbmNvZGVyKTsKKwl1aW50MzJfdCBzYXZlZF9wb3dlcmN0cmxfMiA9IDAsIHNhdmVkX3Bvd2VyY3RybF80ID0gMCwgc2F2ZWRfcm91dHB1dCwKKwkJc2F2ZWRfcnRlc3RfY3RybCwgc2F2ZWRfZ3BpbzAsIHNhdmVkX2dwaW8xLCB0ZW1wLCByb3V0cHV0OworCWludCBoZWFkLCBwcmVzZW50ID0gMDsKKworI2RlZmluZSBSR0JfVEVTVF9EQVRBKHIsIGcsIGIpIChyIDw8IDAgfCBnIDw8IDEwIHwgYiA8PCAyMCkKKwlpZiAoZGNiLT50eXBlID09IE9VVFBVVF9UVikgeworCQl0ZXN0dmFsID0gUkdCX1RFU1RfREFUQSgweGEwLCAweGEwLCAweGEwKTsKKworCQlpZiAoZGV2X3ByaXYtPnZiaW9zLT50dmRhY3Rlc3R2YWwpCisJCQl0ZXN0dmFsID0gZGV2X3ByaXYtPnZiaW9zLT50dmRhY3Rlc3R2YWw7CisJfSBlbHNlIHsKKwkJdGVzdHZhbCA9IFJHQl9URVNUX0RBVEEoMHgxNDAsIDB4MTQwLCAweDE0MCk7IC8qIDB4OTQwNTAxNDAgKi8KKworCQlpZiAoZGV2X3ByaXYtPnZiaW9zLT5kYWN0ZXN0dmFsKQorCQkJdGVzdHZhbCA9IGRldl9wcml2LT52Ymlvcy0+ZGFjdGVzdHZhbDsKKwl9CisKKwlzYXZlZF9ydGVzdF9jdHJsID0gTlZSZWFkUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19URVNUX0NPTlRST0wgKyByZWdvZmZzZXQpOworCU5WV3JpdGVSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDX1RFU1RfQ09OVFJPTCArIHJlZ29mZnNldCwKKwkJICAgICAgc2F2ZWRfcnRlc3RfY3RybCAmIH5OVl9QUkFNREFDX1RFU1RfQ09OVFJPTF9QV1JEV05fREFDX09GRik7CisKKwlzYXZlZF9wb3dlcmN0cmxfMiA9IG52UmVhZE1DKGRldiwgTlZfUEJVU19QT1dFUkNUUkxfMik7CisKKwludldyaXRlTUMoZGV2LCBOVl9QQlVTX1BPV0VSQ1RSTF8yLCBzYXZlZF9wb3dlcmN0cmxfMiAmIDB4ZDdmZmZmZmYpOworCWlmIChyZWdvZmZzZXQgPT0gMHg2OCkgeworCQlzYXZlZF9wb3dlcmN0cmxfNCA9IG52UmVhZE1DKGRldiwgTlZfUEJVU19QT1dFUkNUUkxfNCk7CisJCW52V3JpdGVNQyhkZXYsIE5WX1BCVVNfUE9XRVJDVFJMXzQsIHNhdmVkX3Bvd2VyY3RybF80ICYgMHhmZmZmZmZjZik7CisJfQorCisJc2F2ZWRfZ3BpbzEgPSBudjE3X2dwaW9fZ2V0KGRldiwgRENCX0dQSU9fVFZEQUMxKTsKKwlzYXZlZF9ncGlvMCA9IG52MTdfZ3Bpb19nZXQoZGV2LCBEQ0JfR1BJT19UVkRBQzApOworCisJbnYxN19ncGlvX3NldChkZXYsIERDQl9HUElPX1RWREFDMSwgZGNiLT50eXBlID09IE9VVFBVVF9UVik7CisJbnYxN19ncGlvX3NldChkZXYsIERDQl9HUElPX1RWREFDMCwgZGNiLT50eXBlID09IE9VVFBVVF9UVik7CisKKwltc2xlZXAoNCk7CisKKwlzYXZlZF9yb3V0cHV0ID0gTlZSZWFkUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19EQUNDTEsgKyByZWdvZmZzZXQpOworCWhlYWQgPSAoc2F2ZWRfcm91dHB1dCAmIDB4MTAwKSA+PiA4OworI2lmIDAKKwkvKiBpZiB0aGVyZSdzIGEgc3BhcmUgY3J0YywgdXNpbmcgaXQgd2lsbCBtaW5pbWlzZSBmbGlja2VyIGZvciB0aGUgY2FzZQorCSAqIHdoZXJlIHRoZSBpbi11c2UgY3J0YyBpcyBpbiB1c2UgYnkgYW4gb2ZmLWNoaXAgdG1kcyBlbmNvZGVyICovCisJaWYgKHhmODZfY29uZmlnLT5jcnRjW2hlYWRdLT5lbmFibGVkICYmICF4Zjg2X2NvbmZpZy0+Y3J0Y1toZWFkIF4gMV0tPmVuYWJsZWQpCisJCWhlYWQgXj0gMTsKKyNlbmRpZgorCS8qIG52IGRyaXZlciBhbmQgbnYzMSB1c2UgMHhmZmZmZmVlZSwgbnYzNCBhbmQgNjYwMCB1c2UgMHhmZmZmZmVjZSAqLworCXJvdXRwdXQgPSAoc2F2ZWRfcm91dHB1dCAmIDB4ZmZmZmZlY2UpIHwgaGVhZCA8PCA4OworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNDApIHsKKwkJaWYgKGRjYi0+dHlwZSA9PSBPVVRQVVRfVFYpCisJCQlyb3V0cHV0IHw9IDB4MWEgPDwgMTY7CisJCWVsc2UKKwkJCXJvdXRwdXQgJj0gfigweDFhIDw8IDE2KTsKKwl9CisKKwlOVldyaXRlUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19EQUNDTEsgKyByZWdvZmZzZXQsIHJvdXRwdXQpOworCW1zbGVlcCgxKTsKKworCXRlbXAgPSBOVlJlYWRSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDX0RBQ0NMSyArIHJlZ29mZnNldCk7CisJTlZXcml0ZVJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfREFDQ0xLICsgcmVnb2Zmc2V0LCB0ZW1wIHwgMSk7CisKKwlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19URVNUUE9JTlRfREFUQSwKKwkJICAgICAgTlZfUFJBTURBQ19URVNUUE9JTlRfREFUQV9OT1RCTEFOSyB8IHRlc3R2YWwpOworCXRlbXAgPSBOVlJlYWRSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX1RFU1RfQ09OVFJPTCk7CisJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfVEVTVF9DT05UUk9MLAorCQkgICAgICB0ZW1wIHwgTlZfUFJBTURBQ19URVNUX0NPTlRST0xfVFBfSU5TX0VOX0FTU0VSVEVEKTsKKwltc2xlZXAoNSk7CisKKwl0ZW1wID0gTlZSZWFkUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19URVNUX0NPTlRST0wgKyByZWdvZmZzZXQpOworCisJaWYgKGRjYi0+dHlwZSA9PSBPVVRQVVRfVFYpCisJCXByZXNlbnQgPSAobnYxN190dl9kZXRlY3QoZW5jb2RlciwgY29ubmVjdG9yLCB0ZW1wKQorCQkJICAgPT0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQpOworCWVsc2UKKwkJcHJlc2VudCA9IHRlbXAgJiBOVl9QUkFNREFDX1RFU1RfQ09OVFJPTF9TRU5TRUJfQUxMSEk7CisKKwl0ZW1wID0gTlZSZWFkUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19URVNUX0NPTlRST0wpOworCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX1RFU1RfQ09OVFJPTCwKKwkJICAgICAgdGVtcCAmIH5OVl9QUkFNREFDX1RFU1RfQ09OVFJPTF9UUF9JTlNfRU5fQVNTRVJURUQpOworCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX1RFU1RQT0lOVF9EQVRBLCAwKTsKKworCS8qIGJpb3MgZG9lcyBzb21ldGhpbmcgbW9yZSBjb21wbGV4IGZvciByZXN0b3JpbmcsIGJ1dCBJIHRoaW5rIHRoaXMgaXMgZ29vZCBlbm91Z2ggKi8KKwlOVldyaXRlUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19EQUNDTEsgKyByZWdvZmZzZXQsIHNhdmVkX3JvdXRwdXQpOworCU5WV3JpdGVSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDX1RFU1RfQ09OVFJPTCArIHJlZ29mZnNldCwgc2F2ZWRfcnRlc3RfY3RybCk7CisJaWYgKHJlZ29mZnNldCA9PSAweDY4KQorCQludldyaXRlTUMoZGV2LCBOVl9QQlVTX1BPV0VSQ1RSTF80LCBzYXZlZF9wb3dlcmN0cmxfNCk7CisJbnZXcml0ZU1DKGRldiwgTlZfUEJVU19QT1dFUkNUUkxfMiwgc2F2ZWRfcG93ZXJjdHJsXzIpOworCisJbnYxN19ncGlvX3NldChkZXYsIERDQl9HUElPX1RWREFDMSwgc2F2ZWRfZ3BpbzEpOworCW52MTdfZ3Bpb19zZXQoZGV2LCBEQ0JfR1BJT19UVkRBQzAsIHNhdmVkX2dwaW8wKTsKKworCWlmIChwcmVzZW50KSB7CisJCU5WX0lORk8oZGV2LCAiTG9hZCBkZXRlY3RlZCBvbiBvdXRwdXQgJWNcbiIsICdAJyArIGZmcyhkY2ItPm9yKSk7CisJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKKwl9CisKKwlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7Cit9CisKKworc3RhdGljIGJvb2wgbnYwNF9kYWNfbW9kZV9maXh1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIG52MDRfZGFjX3ByZXBhcmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmhlbHBlciA9IGVuY29kZXItPmhlbHBlcl9wcml2YXRlOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaGVhZCA9IG5vdXZlYXVfY3J0YyhlbmNvZGVyLT5jcnRjKS0+aW5kZXg7CisJc3RydWN0IG52MDRfY3J0Y19yZWcgKmNydGNzdGF0ZSA9IGRldl9wcml2LT5tb2RlX3JlZy5jcnRjX3JlZzsKKworCWhlbHBlci0+ZHBtcyhlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09GRik7CisKKwludjA0X2RmcF9kaXNhYmxlKGRldiwgaGVhZCk7CisKKwkvKiBTb21lIE5WNHggaGF2ZSB1bmtub3duIHZhbHVlcyAoMHgzZiwgMHg1MCwgMHg1NCwgMHg2YiwgMHg3OSwgMHg3ZikKKwkgKiBhdCBMQ0RfX0lOREVYIHdoaWNoIHdlIGRvbid0IGFsdGVyCisJICovCisJaWYgKCEoY3J0Y3N0YXRlW2hlYWRdLkNSVENbTlZfQ0lPX0NSRV9MQ0RfX0lOREVYXSAmIDB4NDQpKQorCQljcnRjc3RhdGVbaGVhZF0uQ1JUQ1tOVl9DSU9fQ1JFX0xDRF9fSU5ERVhdID0gMDsKK30KKworCitzdGF0aWMgdm9pZCBudjA0X2RhY19tb2RlX3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCSAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQoreworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBoZWFkID0gbm91dmVhdV9jcnRjKGVuY29kZXItPmNydGMpLT5pbmRleDsKKworCU5WX1RSQUNFKGRldiwgIiVzIGNhbGxlZCBmb3IgZW5jb2RlciAlZFxuIiwgX19mdW5jX18sCisJCSAgICAgIG52X2VuY29kZXItPmRjYi0+aW5kZXgpOworCisJaWYgKG52X2dmNF9kaXNwX2FyY2goZGV2KSkgeworCQlzdHJ1Y3QgZHJtX2VuY29kZXIgKnJlYmluZDsKKwkJdWludDMyX3QgZGFjX29mZnNldCA9IG52MDRfZGFjX291dHB1dF9vZmZzZXQoZW5jb2Rlcik7CisJCXVpbnQzMl90IG90aGVyZGFjOworCisJCS8qIGJpdCAxNi0xOSBhcmUgYml0cyB0aGF0IGFyZSBzZXQgb24gc29tZSBHNzAgY2FyZHMsCisJCSAqIGJ1dCBkb24ndCBzZWVtIHRvIGhhdmUgbXVjaCBlZmZlY3QgKi8KKwkJTlZXcml0ZVJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfREFDQ0xLICsgZGFjX29mZnNldCwKKwkJCSAgICAgIGhlYWQgPDwgOCB8IE5WX1BSQU1EQUNfREFDQ0xLX1NFTF9EQUNDTEspOworCQkvKiBmb3JjZSBhbnkgb3RoZXIgdmdhIGVuY29kZXJzIHRvIGJpbmQgdG8gdGhlIG90aGVyIGNydGMgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZWJpbmQsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwgaGVhZCkgeworCQkJaWYgKHJlYmluZCA9PSBlbmNvZGVyCisJCQkgICAgfHwgbm91dmVhdV9lbmNvZGVyKHJlYmluZCktPmRjYi0+dHlwZSAhPSBPVVRQVVRfQU5BTE9HKQorCQkJCWNvbnRpbnVlOworCisJCQlkYWNfb2Zmc2V0ID0gbnYwNF9kYWNfb3V0cHV0X29mZnNldChyZWJpbmQpOworCQkJb3RoZXJkYWMgPSBOVlJlYWRSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDX0RBQ0NMSyArIGRhY19vZmZzZXQpOworCQkJTlZXcml0ZVJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfREFDQ0xLICsgZGFjX29mZnNldCwKKwkJCQkgICAgICAob3RoZXJkYWMgJiB+MHgwMTAwKSB8IChoZWFkIF4gMSkgPDwgOCk7CisJCX0KKwl9CisKKwkvKiBUaGlzIGNvdWxkIHVzZSByZWZpbmVtZW50IGZvciBmbGF0cGFuZWxzLCBidXQgaXQgc2hvdWxkIHdvcmsgdGhpcyB3YXkgKi8KKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPCAweDQ0KQorCQlOVldyaXRlUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19URVNUX0NPTlRST0wgKyBudjA0X2RhY19vdXRwdXRfb2Zmc2V0KGVuY29kZXIpLCAweGYwMDAwMDAwKTsKKwllbHNlCisJCU5WV3JpdGVSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDX1RFU1RfQ09OVFJPTCArIG52MDRfZGFjX291dHB1dF9vZmZzZXQoZW5jb2RlciksIDB4MDAxMDAwMDApOworfQorCitzdGF0aWMgdm9pZCBudjA0X2RhY19jb21taXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGVuY29kZXItPmNydGMpOworCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmhlbHBlciA9IGVuY29kZXItPmhlbHBlcl9wcml2YXRlOworCisJaGVscGVyLT5kcG1zKGVuY29kZXIsIERSTV9NT0RFX0RQTVNfT04pOworCisJTlZfSU5GTyhkZXYsICJPdXRwdXQgJXMgaXMgcnVubmluZyBvbiBDUlRDICVkIHVzaW5nIG91dHB1dCAlY1xuIiwKKwkJZHJtX2dldF9jb25uZWN0b3JfbmFtZSgmbm91dmVhdV9lbmNvZGVyX2Nvbm5lY3Rvcl9nZXQobnZfZW5jb2RlciktPmJhc2UpLAorCQludl9jcnRjLT5pbmRleCwgJ0AnICsgZmZzKG52X2VuY29kZXItPmRjYi0+b3IpKTsKK30KKwordm9pZCBudjA0X2RhY191cGRhdGVfZGFjY2xrKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgYm9vbCBlbmFibGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkY2JfZW50cnkgKmRjYiA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKS0+ZGNiOworCisJaWYgKG52X2dmNF9kaXNwX2FyY2goZGV2KSkgeworCQl1aW50MzJfdCAqZGFjX3VzZXJzID0gJmRldl9wcml2LT5kYWNfdXNlcnNbZmZzKGRjYi0+b3IpIC0gMV07CisJCWludCBkYWNjbGtfb2ZmID0gTlZfUFJBTURBQ19EQUNDTEsgKyBudjA0X2RhY19vdXRwdXRfb2Zmc2V0KGVuY29kZXIpOworCQl1aW50MzJfdCBkYWNjbGsgPSBOVlJlYWRSQU1EQUMoZGV2LCAwLCBkYWNjbGtfb2ZmKTsKKworCQlpZiAoZW5hYmxlKSB7CisJCQkqZGFjX3VzZXJzIHw9IDEgPDwgZGNiLT5pbmRleDsKKwkJCU5WV3JpdGVSQU1EQUMoZGV2LCAwLCBkYWNjbGtfb2ZmLCBkYWNjbGsgfCBOVl9QUkFNREFDX0RBQ0NMS19TRUxfREFDQ0xLKTsKKworCQl9IGVsc2UgeworCQkJKmRhY191c2VycyAmPSB+KDEgPDwgZGNiLT5pbmRleCk7CisJCQlpZiAoISpkYWNfdXNlcnMpCisJCQkJTlZXcml0ZVJBTURBQyhkZXYsIDAsIGRhY2Nsa19vZmYsCisJCQkJCWRhY2NsayAmIH5OVl9QUkFNREFDX0RBQ0NMS19TRUxfREFDQ0xLKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgbnYwNF9kYWNfZHBtcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBtb2RlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKworCWlmIChudl9lbmNvZGVyLT5sYXN0X2RwbXMgPT0gbW9kZSkKKwkJcmV0dXJuOworCW52X2VuY29kZXItPmxhc3RfZHBtcyA9IG1vZGU7CisKKwlOVl9JTkZPKGRldiwgIlNldHRpbmcgZHBtcyBtb2RlICVkIG9uIHZnYSBlbmNvZGVyIChvdXRwdXQgJWQpXG4iLAorCQkgICAgIG1vZGUsIG52X2VuY29kZXItPmRjYi0+aW5kZXgpOworCisJbnYwNF9kYWNfdXBkYXRlX2RhY2NsayhlbmNvZGVyLCBtb2RlID09IERSTV9NT0RFX0RQTVNfT04pOworfQorCitzdGF0aWMgdm9pZCBudjA0X2RhY19zYXZlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisKKwlpZiAobnZfZ2Y0X2Rpc3BfYXJjaChkZXYpKQorCQludl9lbmNvZGVyLT5yZXN0b3JlLm91dHB1dCA9IE5WUmVhZFJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfREFDQ0xLICsKKwkJCQkJCQkgIG52MDRfZGFjX291dHB1dF9vZmZzZXQoZW5jb2RlcikpOworfQorCitzdGF0aWMgdm9pZCBudjA0X2RhY19yZXN0b3JlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisKKwlpZiAobnZfZ2Y0X2Rpc3BfYXJjaChkZXYpKQorCQlOVldyaXRlUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19EQUNDTEsgKyBudjA0X2RhY19vdXRwdXRfb2Zmc2V0KGVuY29kZXIpLAorCQkJICAgICAgbnZfZW5jb2Rlci0+cmVzdG9yZS5vdXRwdXQpOworCisJbnZfZW5jb2Rlci0+bGFzdF9kcG1zID0gTlZfRFBNU19DTEVBUkVEOworfQorCitzdGF0aWMgdm9pZCBudjA0X2RhY19kZXN0cm95KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCisJTlZfREVCVUcoZW5jb2Rlci0+ZGV2LCAiXG4iKTsKKworCWRybV9lbmNvZGVyX2NsZWFudXAoZW5jb2Rlcik7CisJa2ZyZWUobnZfZW5jb2Rlcik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIG52MDRfZGFjX2hlbHBlcl9mdW5jcyA9IHsKKwkuZHBtcyA9IG52MDRfZGFjX2RwbXMsCisJLnNhdmUgPSBudjA0X2RhY19zYXZlLAorCS5yZXN0b3JlID0gbnYwNF9kYWNfcmVzdG9yZSwKKwkubW9kZV9maXh1cCA9IG52MDRfZGFjX21vZGVfZml4dXAsCisJLnByZXBhcmUgPSBudjA0X2RhY19wcmVwYXJlLAorCS5jb21taXQgPSBudjA0X2RhY19jb21taXQsCisJLm1vZGVfc2V0ID0gbnYwNF9kYWNfbW9kZV9zZXQsCisJLmRldGVjdCA9IG52MDRfZGFjX2RldGVjdAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgbnYxN19kYWNfaGVscGVyX2Z1bmNzID0geworCS5kcG1zID0gbnYwNF9kYWNfZHBtcywKKwkuc2F2ZSA9IG52MDRfZGFjX3NhdmUsCisJLnJlc3RvcmUgPSBudjA0X2RhY19yZXN0b3JlLAorCS5tb2RlX2ZpeHVwID0gbnYwNF9kYWNfbW9kZV9maXh1cCwKKwkucHJlcGFyZSA9IG52MDRfZGFjX3ByZXBhcmUsCisJLmNvbW1pdCA9IG52MDRfZGFjX2NvbW1pdCwKKwkubW9kZV9zZXQgPSBudjA0X2RhY19tb2RlX3NldCwKKwkuZGV0ZWN0ID0gbnYxN19kYWNfZGV0ZWN0Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2Z1bmNzIG52MDRfZGFjX2Z1bmNzID0geworCS5kZXN0cm95ID0gbnYwNF9kYWNfZGVzdHJveSwKK307CisKK2ludCBudjA0X2RhY19jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9lbnRyeSAqZW50cnkpCit7CisJY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyAqaGVscGVyOworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gTlVMTDsKKworCW52X2VuY29kZXIgPSBremFsbG9jKHNpemVvZigqbnZfZW5jb2RlciksIEdGUF9LRVJORUwpOworCWlmICghbnZfZW5jb2RlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllbmNvZGVyID0gdG9fZHJtX2VuY29kZXIobnZfZW5jb2Rlcik7CisKKwludl9lbmNvZGVyLT5kY2IgPSBlbnRyeTsKKwludl9lbmNvZGVyLT5vciA9IGZmcyhlbnRyeS0+b3IpIC0gMTsKKworCWlmIChudl9nZjRfZGlzcF9hcmNoKGRldikpCisJCWhlbHBlciA9ICZudjE3X2RhY19oZWxwZXJfZnVuY3M7CisJZWxzZQorCQloZWxwZXIgPSAmbnYwNF9kYWNfaGVscGVyX2Z1bmNzOworCisJZHJtX2VuY29kZXJfaW5pdChkZXYsIGVuY29kZXIsICZudjA0X2RhY19mdW5jcywgRFJNX01PREVfRU5DT0RFUl9EQUMpOworCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoZW5jb2RlciwgaGVscGVyKTsKKworCWVuY29kZXItPnBvc3NpYmxlX2NydGNzID0gZW50cnktPmhlYWRzOworCWVuY29kZXItPnBvc3NpYmxlX2Nsb25lcyA9IDA7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZGZwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2RmcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YjMzMzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2RmcC5jCkBAIC0wLDAgKzEsNjIxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMgTlZJRElBLCBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IDIwMDYgRGF2ZSBBaXJsaWUKKyAqIENvcHlyaWdodCAyMDA3IE1hYXJ0ZW4gTWFhdGh1aXMKKyAqIENvcHlyaWdodCAyMDA3LTIwMDkgU3R1YXJ0IEJlbm5ldHQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm1fY3J0Y19oZWxwZXIuaCIKKworI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9lbmNvZGVyLmgiCisjaW5jbHVkZSAibm91dmVhdV9jb25uZWN0b3IuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2NydGMuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2h3LmgiCisjaW5jbHVkZSAibnZyZWcuaCIKKworI2RlZmluZSBGUF9UR19DT05UUk9MX09OICAoTlZfUFJBTURBQ19GUF9UR19DT05UUk9MX0RJU1BFTl9QT1MgfAlcCisJCQkgICBOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0xfSFNZTkNfUE9TIHwJCVwKKwkJCSAgIE5WX1BSQU1EQUNfRlBfVEdfQ09OVFJPTF9WU1lOQ19QT1MpCisjZGVmaW5lIEZQX1RHX0NPTlRST0xfT0ZGIChOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0xfRElTUEVOX0RJU0FCTEUgfAlcCisJCQkgICBOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0xfSFNZTkNfRElTQUJMRSB8CVwKKwkJCSAgIE5WX1BSQU1EQUNfRlBfVEdfQ09OVFJPTF9WU1lOQ19ESVNBQkxFKQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfZnBjX29mZih1aW50MzJfdCBmcGMpCit7CisJcmV0dXJuICgoZnBjICYgKEZQX1RHX0NPTlRST0xfT04gfCBGUF9UR19DT05UUk9MX09GRikpID09CisJCQlGUF9UR19DT05UUk9MX09GRik7Cit9CisKK2ludCBudjA0X2RmcF9nZXRfYm91bmRfaGVhZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2VudHJ5ICpkY2JlbnQpCit7CisJLyogc3BlY2lhbCBjYXNlIG9mIG52X3JlYWRfdG1kcyB0byBmaW5kIGNydGMgYXNzb2NpYXRlZCB3aXRoIGFuIG91dHB1dC4KKwkgKiB0aGlzIGRvZXMgbm90IGdpdmUgYSBjb3JyZWN0IGFuc3dlciBmb3Igb2ZmLWNoaXAgZHZpLCBidXQgdGhlcmUncyBubworCSAqIHVzZSBmb3Igc3VjaCBhbiBhbnN3ZXIgYW55d2F5CisJICovCisJaW50IHJhbWRhYyA9IChkY2JlbnQtPm9yICYgT1VUUFVUX0MpID4+IDI7CisKKwlOVldyaXRlUkFNREFDKGRldiwgcmFtZGFjLCBOVl9QUkFNREFDX0ZQX1RNRFNfQ09OVFJPTCwKKwlOVl9QUkFNREFDX0ZQX1RNRFNfQ09OVFJPTF9XUklURV9ESVNBQkxFIHwgMHg0KTsKKwlyZXR1cm4gKChOVlJlYWRSQU1EQUMoZGV2LCByYW1kYWMsIE5WX1BSQU1EQUNfRlBfVE1EU19EQVRBKSAmIDB4OCkgPj4gMykgXiByYW1kYWM7Cit9CisKK3ZvaWQgbnYwNF9kZnBfYmluZF9oZWFkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfZW50cnkgKmRjYmVudCwKKwkJCWludCBoZWFkLCBib29sIGRsKQoreworCS8qIFRoZSBCSU9TIHNjcmlwdHMgZG9uJ3QgZG8gdGhpcyBmb3IgdXMsIHNhZGx5CisJICogTHVja2lseSB3ZSBkbyBrbm93IHRoZSB2YWx1ZXMgOy0pCisJICoKKwkgKiBoZWFkIDwgMCBpbmRpY2F0ZXMgd2Ugd2lzaCB0byBmb3JjZSBhIHNldHRpbmcgd2l0aCB0aGUgb3ZlcnJpZGV2YWwKKwkgKiAoZm9yIFZUIHJlc3RvcmUgZXRjLikKKwkgKi8KKworCWludCByYW1kYWMgPSAoZGNiZW50LT5vciAmIE9VVFBVVF9DKSA+PiAyOworCXVpbnQ4X3QgdG1kczA0ID0gMHg4MDsKKworCWlmIChoZWFkICE9IHJhbWRhYykKKwkJdG1kczA0ID0gMHg4ODsKKworCWlmIChkY2JlbnQtPnR5cGUgPT0gT1VUUFVUX0xWRFMpCisJCXRtZHMwNCB8PSAweDAxOworCisJbnZfd3JpdGVfdG1kcyhkZXYsIGRjYmVudC0+b3IsIDAsIDB4MDQsIHRtZHMwNCk7CisKKwlpZiAoZGwpCS8qIGR1YWwgbGluayAqLworCQludl93cml0ZV90bWRzKGRldiwgZGNiZW50LT5vciwgMSwgMHgwNCwgdG1kczA0IF4gMHgwOCk7Cit9CisKK3ZvaWQgbnYwNF9kZnBfZGlzYWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaGVhZCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudjA0X2NydGNfcmVnICpjcnRjc3RhdGUgPSBkZXZfcHJpdi0+bW9kZV9yZWcuY3J0Y19yZWc7CisKKwlpZiAoTlZSZWFkUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19GUF9UR19DT05UUk9MKSAmCisJICAgIEZQX1RHX0NPTlRST0xfT04pIHsKKwkJLyogZGlnaXRhbCByZW1uYW50cyBtdXN0IGJlIGNsZWFuZWQgYmVmb3JlIG5ldyBjcnRjCisJCSAqIHZhbHVlcyBwcm9ncmFtbWVkLiAgZGVsYXkgaXMgdGltZSBmb3IgdGhlIHZnYSBzdHVmZgorCQkgKiB0byByZWFsaXNlIGl0J3MgaW4gY29udHJvbCBhZ2FpbgorCQkgKi8KKwkJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfRlBfVEdfQ09OVFJPTCwKKwkJCSAgICAgIEZQX1RHX0NPTlRST0xfT0ZGKTsKKwkJbXNsZWVwKDUwKTsKKwl9CisJLyogZG9uJ3QgaW5hZHZlcnRlbnRseSB0dXJuIGl0IG9uIHdoZW4gc3RhdGUgd3JpdHRlbiBsYXRlciAqLworCWNydGNzdGF0ZVtoZWFkXS5mcF9jb250cm9sID0gRlBfVEdfQ09OVFJPTF9PRkY7Cit9CisKK3ZvaWQgbnYwNF9kZnBfdXBkYXRlX2ZwX2NvbnRyb2woc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9jcnRjICpjcnRjOworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGM7CisJdWludDMyX3QgKmZwYzsKKworCWlmIChtb2RlID09IERSTV9NT0RFX0RQTVNfT04pIHsKKwkJbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhlbmNvZGVyLT5jcnRjKTsKKwkJZnBjID0gJmRldl9wcml2LT5tb2RlX3JlZy5jcnRjX3JlZ1tudl9jcnRjLT5pbmRleF0uZnBfY29udHJvbDsKKworCQlpZiAoaXNfZnBjX29mZigqZnBjKSkgeworCQkJLyogdXNpbmcgc2F2ZWQgdmFsdWUgaXMgb2ssIGFzIChpc19kaWdpdGFsICYmIGRwbXNfb24gJiYKKwkJCSAqIGZwX2NvbnRyb2w9PU9GRikgaXMgKGF0IHByZXNlbnQpICpvbmx5KiB0cnVlIHdoZW4KKwkJCSAqIGZwYydzIG1vc3QgcmVjZW50IGNoYW5nZSB3YXMgYnkgYmVsb3cgIm9mZiIgY29kZQorCQkJICovCisJCQkqZnBjID0gbnZfY3J0Yy0+ZHBtc19zYXZlZF9mcF9jb250cm9sOworCQl9CisKKwkJbnZfY3J0Yy0+ZnBfdXNlcnMgfD0gMSA8PCBub3V2ZWF1X2VuY29kZXIoZW5jb2RlciktPmRjYi0+aW5kZXg7CisJCU5WV3JpdGVSQU1EQUMoZGV2LCBudl9jcnRjLT5pbmRleCwgTlZfUFJBTURBQ19GUF9UR19DT05UUk9MLCAqZnBjKTsKKwl9IGVsc2UgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkgeworCQkJbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhjcnRjKTsKKwkJCWZwYyA9ICZkZXZfcHJpdi0+bW9kZV9yZWcuY3J0Y19yZWdbbnZfY3J0Yy0+aW5kZXhdLmZwX2NvbnRyb2w7CisKKwkJCW52X2NydGMtPmZwX3VzZXJzICY9IH4oMSA8PCBub3V2ZWF1X2VuY29kZXIoZW5jb2RlciktPmRjYi0+aW5kZXgpOworCQkJaWYgKCFpc19mcGNfb2ZmKCpmcGMpICYmICFudl9jcnRjLT5mcF91c2VycykgeworCQkJCW52X2NydGMtPmRwbXNfc2F2ZWRfZnBfY29udHJvbCA9ICpmcGM7CisJCQkJLyogY3V0IHRoZSBGUCBvdXRwdXQgKi8KKwkJCQkqZnBjICY9IH5GUF9UR19DT05UUk9MX09OOworCQkJCSpmcGMgfD0gRlBfVEdfQ09OVFJPTF9PRkY7CisJCQkJTlZXcml0ZVJBTURBQyhkZXYsIG52X2NydGMtPmluZGV4LAorCQkJCQkgICAgICBOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0wsICpmcGMpOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgYm9vbCBudjA0X2RmcF9tb2RlX2ZpeHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqbnZfY29ubmVjdG9yID0gbm91dmVhdV9lbmNvZGVyX2Nvbm5lY3Rvcl9nZXQobnZfZW5jb2Rlcik7CisKKwkvKiBGb3IgaW50ZXJuYWwgcGFuZWxzIGFuZCBncHUgc2NhbGluZyBvbiBEVkkgd2UgbmVlZCB0aGUgbmF0aXZlIG1vZGUgKi8KKwlpZiAobnZfY29ubmVjdG9yLT5zY2FsaW5nX21vZGUgIT0gRFJNX01PREVfU0NBTEVfTk9ORSkgeworCQlpZiAoIW52X2Nvbm5lY3Rvci0+bmF0aXZlX21vZGUpCisJCQlyZXR1cm4gZmFsc2U7CisJCW52X2VuY29kZXItPm1vZGUgPSAqbnZfY29ubmVjdG9yLT5uYXRpdmVfbW9kZTsKKwkJYWRqdXN0ZWRfbW9kZS0+Y2xvY2sgPSBudl9jb25uZWN0b3ItPm5hdGl2ZV9tb2RlLT5jbG9jazsKKwl9IGVsc2UgeworCQludl9lbmNvZGVyLT5tb2RlID0gKmFkanVzdGVkX21vZGU7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIG52MDRfZGZwX3ByZXBhcmVfc2VsX2NsayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciwgaW50IGhlYWQpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnYwNF9tb2RlX3N0YXRlICpzdGF0ZSA9ICZkZXZfcHJpdi0+bW9kZV9yZWc7CisJdWludDMyX3QgYml0czE2MTggPSBudl9lbmNvZGVyLT5kY2ItPm9yICYgT1VUUFVUX0EgPyAweDEwMDAwIDogMHg0MDAwMDsKKworCWlmIChudl9lbmNvZGVyLT5kY2ItPmxvY2F0aW9uICE9IERDQl9MT0NfT05fQ0hJUCkKKwkJcmV0dXJuOworCisJLyogU0VMX0NMSyBpcyBvbmx5IHVzZWQgb24gdGhlIHByaW1hcnkgcmFtZGFjCisJICogSXQgdG9nZ2xlcyBzcHJlYWQgc3BlY3RydW0gUExMIG91dHB1dCBhbmQgc2V0cyB0aGUgYmluZGluZ3Mgb2YgUExMcworCSAqIHRvIGhlYWRzIG9uIGRpZ2l0YWwgb3V0cHV0cworCSAqLworCWlmIChoZWFkKQorCQlzdGF0ZS0+c2VsX2NsayB8PSBiaXRzMTYxODsKKwllbHNlCisJCXN0YXRlLT5zZWxfY2xrICY9IH5iaXRzMTYxODsKKworCS8qIG52MzA6CisJICoJYml0IDAJCU5WQ2xrIHNwcmVhZCBzcGVjdHJ1bSBvbi9vZmYKKwkgKgliaXQgMgkJTWVtQ2xrIHNwcmVhZCBzcGVjdHJ1bSBvbi9vZmYKKwkgKiAJYml0IDQJCVBpeENsazEgc3ByZWFkIHNwZWN0cnVtIG9uL29mZiB0b2dnbGUKKwkgKiAJYml0IDYJCVBpeENsazIgc3ByZWFkIHNwZWN0cnVtIG9uL29mZiB0b2dnbGUKKwkgKgorCSAqIG52NDAgKG9ic2VydmF0aW9ucyBmcm9tIGJpb3MgYmVoYXZpb3VyIGFuZCBtbWlvIHRyYWNlcyk6CisJICogCWJpdHMgNCY2CWFzIGZvciBudjMwCisJICogCWJpdHMgNSY3CWhlYWQgZGVwZW5kZW50IGFzIGZvciBiaXRzIDQmNiwgYnV0IGRvIG5vdCBhcHBlYXIgd2l0aCA0JjY7CisJICogCQkJbWF5YmUgYSBkaWZmZXJlbnQgc3ByZWFkIG1vZGUKKwkgKiAJYml0cyA4JjEwCXNlZW4gb24gZHVhbC1saW5rIGR2aSBvdXRwdXRzLCBwdXJwb3NlIHVua25vd24gKHNldCBieSBQT1NUIHNjcmlwdHMpCisJICogCVRoZSBsb2dpYyBiZWhpbmQgdHVybmluZyBzcHJlYWQgc3BlY3RydW0gb24vb2ZmIGluIHRoZSBmaXJzdCBwbGFjZSwKKwkgKiAJYW5kIHdoaWNoIGJpdC1wYWlyIHRvIHVzZSwgaXMgdW5jbGVhciBvbiBudjQwIChmb3IgZWFybGllciBjYXJkcywgdGhlIGZwIHRhYmxlCisJICogCWVudHJ5IGhhcyB0aGUgbmVjZXNzYXJ5IGluZm8pCisJICovCisJaWYgKG52X2VuY29kZXItPmRjYi0+dHlwZSA9PSBPVVRQVVRfTFZEUyAmJiBkZXZfcHJpdi0+c2F2ZWRfcmVnLnNlbF9jbGsgJiAweGYwKSB7CisJCWludCBzaGlmdCA9IChkZXZfcHJpdi0+c2F2ZWRfcmVnLnNlbF9jbGsgJiAweDUwKSA/IDAgOiAxOworCisJCXN0YXRlLT5zZWxfY2xrICY9IH4weGYwOworCQlzdGF0ZS0+c2VsX2NsayB8PSAoaGVhZCA/IDB4NDAgOiAweDEwKSA8PCBzaGlmdDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG52MDRfZGZwX3ByZXBhcmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyAqaGVscGVyID0gZW5jb2Rlci0+aGVscGVyX3ByaXZhdGU7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBoZWFkID0gbm91dmVhdV9jcnRjKGVuY29kZXItPmNydGMpLT5pbmRleDsKKwlzdHJ1Y3QgbnYwNF9jcnRjX3JlZyAqY3J0Y3N0YXRlID0gZGV2X3ByaXYtPm1vZGVfcmVnLmNydGNfcmVnOworCXVpbnQ4X3QgKmNyX2xjZCA9ICZjcnRjc3RhdGVbaGVhZF0uQ1JUQ1tOVl9DSU9fQ1JFX0xDRF9fSU5ERVhdOworCXVpbnQ4X3QgKmNyX2xjZF9vdGggPSAmY3J0Y3N0YXRlW2hlYWQgXiAxXS5DUlRDW05WX0NJT19DUkVfTENEX19JTkRFWF07CisKKwloZWxwZXItPmRwbXMoZW5jb2RlciwgRFJNX01PREVfRFBNU19PRkYpOworCisJbnYwNF9kZnBfcHJlcGFyZV9zZWxfY2xrKGRldiwgbnZfZW5jb2RlciwgaGVhZCk7CisKKwkvKiBTb21lIE5WNHggaGF2ZSB1bmtub3duIHZhbHVlcyAoMHgzZiwgMHg1MCwgMHg1NCwgMHg2YiwgMHg3OSwgMHg3ZikKKwkgKiBhdCBMQ0RfX0lOREVYIHdoaWNoIHdlIGRvbid0IGFsdGVyCisJICovCisJaWYgKCEoKmNyX2xjZCAmIDB4NDQpKSB7CisJCSpjcl9sY2QgPSAweDM7CisKKwkJaWYgKG52X3R3b19oZWFkcyhkZXYpKSB7CisJCQlpZiAobnZfZW5jb2Rlci0+ZGNiLT5sb2NhdGlvbiA9PSBEQ0JfTE9DX09OX0NISVApCisJCQkJKmNyX2xjZCB8PSBoZWFkID8gMHgwIDogMHg4OworCQkJZWxzZSB7CisJCQkJKmNyX2xjZCB8PSAobnZfZW5jb2Rlci0+ZGNiLT5vciA8PCA0KSAmIDB4MzA7CisJCQkJaWYgKG52X2VuY29kZXItPmRjYi0+dHlwZSA9PSBPVVRQVVRfTFZEUykKKwkJCQkJKmNyX2xjZCB8PSAweDMwOworCQkJCWlmICgoKmNyX2xjZCAmIDB4MzApID09ICgqY3JfbGNkX290aCAmIDB4MzApKSB7CisJCQkJCS8qIGF2b2lkIGJlaW5nIGNvbm5lY3RlZCB0byBib3RoIGNydGNzICovCisJCQkJCSpjcl9sY2Rfb3RoICY9IH4weDMwOworCQkJCQlOVldyaXRlVmdhQ3J0YyhkZXYsIGhlYWQgXiAxLAorCQkJCQkJICAgICAgIE5WX0NJT19DUkVfTENEX19JTkRFWCwKKwkJCQkJCSAgICAgICAqY3JfbGNkX290aCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCisKK3N0YXRpYyB2b2lkIG52MDRfZGZwX21vZGVfc2V0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCSAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAorCQkJICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoZW5jb2Rlci0+Y3J0Yyk7CisJc3RydWN0IG52MDRfY3J0Y19yZWcgKnJlZ3AgPSAmZGV2X3ByaXYtPm1vZGVfcmVnLmNydGNfcmVnW252X2NydGMtPmluZGV4XTsKKwlzdHJ1Y3QgbnYwNF9jcnRjX3JlZyAqc2F2ZXAgPSAmZGV2X3ByaXYtPnNhdmVkX3JlZy5jcnRjX3JlZ1tudl9jcnRjLT5pbmRleF07CisJc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpudl9jb25uZWN0b3IgPSBub3V2ZWF1X2NydGNfY29ubmVjdG9yX2dldChudl9jcnRjKTsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpvdXRwdXRfbW9kZSA9ICZudl9lbmNvZGVyLT5tb2RlOworCXVpbnQzMl90IG1vZGVfcmF0aW8sIHBhbmVsX3JhdGlvOworCisJTlZfREVCVUcoZGV2LCAiT3V0cHV0IG1vZGUgb24gQ1JUQyAlZDpcbiIsIG52X2NydGMtPmluZGV4KTsKKwlkcm1fbW9kZV9kZWJ1Z19wcmludG1vZGVsaW5lKG91dHB1dF9tb2RlKTsKKworCS8qIEluaXRpYWxpemUgdGhlIEZQIHJlZ2lzdGVycyBpbiB0aGlzIENSVEMuICovCisJcmVncC0+ZnBfaG9yaXpfcmVnc1tGUF9ESVNQTEFZX0VORF0gPSBvdXRwdXRfbW9kZS0+aGRpc3BsYXkgLSAxOworCXJlZ3AtPmZwX2hvcml6X3JlZ3NbRlBfVE9UQUxdID0gb3V0cHV0X21vZGUtPmh0b3RhbCAtIDE7CisJaWYgKCFudl9nZjRfZGlzcF9hcmNoKGRldikgfHwKKwkgICAgKG91dHB1dF9tb2RlLT5oc3luY19zdGFydCAtIG91dHB1dF9tb2RlLT5oZGlzcGxheSkgPj0KKwkJCQkJZGV2X3ByaXYtPnZiaW9zLT5kaWdpdGFsX21pbl9mcm9udF9wb3JjaCkKKwkJcmVncC0+ZnBfaG9yaXpfcmVnc1tGUF9DUlRDXSA9IG91dHB1dF9tb2RlLT5oZGlzcGxheTsKKwllbHNlCisJCXJlZ3AtPmZwX2hvcml6X3JlZ3NbRlBfQ1JUQ10gPSBvdXRwdXRfbW9kZS0+aHN5bmNfc3RhcnQgLSBkZXZfcHJpdi0+dmJpb3MtPmRpZ2l0YWxfbWluX2Zyb250X3BvcmNoIC0gMTsKKwlyZWdwLT5mcF9ob3Jpel9yZWdzW0ZQX1NZTkNfU1RBUlRdID0gb3V0cHV0X21vZGUtPmhzeW5jX3N0YXJ0IC0gMTsKKwlyZWdwLT5mcF9ob3Jpel9yZWdzW0ZQX1NZTkNfRU5EXSA9IG91dHB1dF9tb2RlLT5oc3luY19lbmQgLSAxOworCXJlZ3AtPmZwX2hvcml6X3JlZ3NbRlBfVkFMSURfU1RBUlRdID0gb3V0cHV0X21vZGUtPmhza2V3OworCXJlZ3AtPmZwX2hvcml6X3JlZ3NbRlBfVkFMSURfRU5EXSA9IG91dHB1dF9tb2RlLT5oZGlzcGxheSAtIDE7CisKKwlyZWdwLT5mcF92ZXJ0X3JlZ3NbRlBfRElTUExBWV9FTkRdID0gb3V0cHV0X21vZGUtPnZkaXNwbGF5IC0gMTsKKwlyZWdwLT5mcF92ZXJ0X3JlZ3NbRlBfVE9UQUxdID0gb3V0cHV0X21vZGUtPnZ0b3RhbCAtIDE7CisJcmVncC0+ZnBfdmVydF9yZWdzW0ZQX0NSVENdID0gb3V0cHV0X21vZGUtPnZ0b3RhbCAtIDUgLSAxOworCXJlZ3AtPmZwX3ZlcnRfcmVnc1tGUF9TWU5DX1NUQVJUXSA9IG91dHB1dF9tb2RlLT52c3luY19zdGFydCAtIDE7CisJcmVncC0+ZnBfdmVydF9yZWdzW0ZQX1NZTkNfRU5EXSA9IG91dHB1dF9tb2RlLT52c3luY19lbmQgLSAxOworCXJlZ3AtPmZwX3ZlcnRfcmVnc1tGUF9WQUxJRF9TVEFSVF0gPSAwOworCXJlZ3AtPmZwX3ZlcnRfcmVnc1tGUF9WQUxJRF9FTkRdID0gb3V0cHV0X21vZGUtPnZkaXNwbGF5IC0gMTsKKworCS8qIGJpdDI2OiBhIGJpdCBzZWVuIG9uIHNvbWUgZzd4LCBubyBhcyB5ZXQgZGlzY2VybmFibGUgcHVycG9zZSAqLworCXJlZ3AtPmZwX2NvbnRyb2wgPSBOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0xfRElTUEVOX1BPUyB8CisJCQkgICAoc2F2ZXAtPmZwX2NvbnRyb2wgJiAoMSA8PCAyNiB8IE5WX1BSQU1EQUNfRlBfVEdfQ09OVFJPTF9SRUFEX1BST0cpKTsKKwkvKiBEZWFsIHdpdGggdnN5bmMvaHN5bmMgcG9sYXJpdHkgKi8KKwkvKiBMVkRTIHNjcmVlbnMgZG8gc2V0IHRoaXMsIGJ1dCBtb2RlcyB3aXRoICt2ZSBzeW5jcyBhcmUgdmVyeSByYXJlICovCisJaWYgKG91dHB1dF9tb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfUFZTWU5DKQorCQlyZWdwLT5mcF9jb250cm9sIHw9IE5WX1BSQU1EQUNfRlBfVEdfQ09OVFJPTF9WU1lOQ19QT1M7CisJaWYgKG91dHB1dF9tb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfUEhTWU5DKQorCQlyZWdwLT5mcF9jb250cm9sIHw9IE5WX1BSQU1EQUNfRlBfVEdfQ09OVFJPTF9IU1lOQ19QT1M7CisJLyogcGFuZWwgc2NhbGluZyBmaXJzdCwgYXMgbmF0aXZlIHdvdWxkIGdldCBzZXQgb3RoZXJ3aXNlICovCisJaWYgKG52X2Nvbm5lY3Rvci0+c2NhbGluZ19tb2RlID09IERSTV9NT0RFX1NDQUxFX05PTkUgfHwKKwkgICAgbnZfY29ubmVjdG9yLT5zY2FsaW5nX21vZGUgPT0gRFJNX01PREVfU0NBTEVfQ0VOVEVSKQkvKiBwYW5lbCBoYW5kbGVzIGl0ICovCisJCXJlZ3AtPmZwX2NvbnRyb2wgfD0gTlZfUFJBTURBQ19GUF9UR19DT05UUk9MX01PREVfQ0VOVEVSOworCWVsc2UgaWYgKGFkanVzdGVkX21vZGUtPmhkaXNwbGF5ID09IG91dHB1dF9tb2RlLT5oZGlzcGxheSAmJgorCQkgYWRqdXN0ZWRfbW9kZS0+dmRpc3BsYXkgPT0gb3V0cHV0X21vZGUtPnZkaXNwbGF5KSAvKiBuYXRpdmUgbW9kZSAqLworCQlyZWdwLT5mcF9jb250cm9sIHw9IE5WX1BSQU1EQUNfRlBfVEdfQ09OVFJPTF9NT0RFX05BVElWRTsKKwllbHNlIC8qIGdwdSBuZWVkcyB0byBzY2FsZSAqLworCQlyZWdwLT5mcF9jb250cm9sIHw9IE5WX1BSQU1EQUNfRlBfVEdfQ09OVFJPTF9NT0RFX1NDQUxFOworCWlmIChudlJlYWRFWFRERVYoZGV2LCBOVl9QRVhUREVWX0JPT1RfMCkgJiBOVl9QRVhUREVWX0JPT1RfMF9TVFJBUF9GUF9JRkFDRV8xMkJJVCkKKwkJcmVncC0+ZnBfY29udHJvbCB8PSBOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0xfV0lEVEhfMTI7CisJaWYgKG52X2VuY29kZXItPmRjYi0+bG9jYXRpb24gIT0gRENCX0xPQ19PTl9DSElQICYmCisJICAgIG91dHB1dF9tb2RlLT5jbG9jayA+IDE2NTAwMCkKKwkJcmVncC0+ZnBfY29udHJvbCB8PSAoMiA8PCAyNCk7CisJaWYgKG52X2VuY29kZXItPmRjYi0+dHlwZSA9PSBPVVRQVVRfTFZEUykgeworCQlib29sIGR1YWxsaW5rLCBkdW1teTsKKworCQlub3V2ZWF1X2Jpb3NfcGFyc2VfbHZkc190YWJsZShkZXYsIG52X2Nvbm5lY3Rvci0+bmF0aXZlX21vZGUtPgorCQkJCQkgICAgICBjbG9jaywgJmR1YWxsaW5rLCAmZHVtbXkpOworCQlpZiAoZHVhbGxpbmspCisJCQlyZWdwLT5mcF9jb250cm9sIHw9ICg4IDw8IDI4KTsKKwl9IGVsc2UKKwlpZiAob3V0cHV0X21vZGUtPmNsb2NrID4gMTY1MDAwKQorCQlyZWdwLT5mcF9jb250cm9sIHw9ICg4IDw8IDI4KTsKKworCXJlZ3AtPmZwX2RlYnVnXzAgPSBOVl9QUkFNREFDX0ZQX0RFQlVHXzBfWVdFSUdIVF9ST1VORCB8CisJCQkgICBOVl9QUkFNREFDX0ZQX0RFQlVHXzBfWFdFSUdIVF9ST1VORCB8CisJCQkgICBOVl9QUkFNREFDX0ZQX0RFQlVHXzBfWUlOVEVSUF9CSUxJTkVBUiB8CisJCQkgICBOVl9QUkFNREFDX0ZQX0RFQlVHXzBfWElOVEVSUF9CSUxJTkVBUiB8CisJCQkgICBOVl9SQU1EQUNfRlBfREVCVUdfMF9UTURTX0VOQUJMRUQgfAorCQkJICAgTlZfUFJBTURBQ19GUF9ERUJVR18wX1lTQ0FMRV9FTkFCTEUgfAorCQkJICAgTlZfUFJBTURBQ19GUF9ERUJVR18wX1hTQ0FMRV9FTkFCTEU7CisKKwkvKiBXZSB3YW50IGF1dG9tYXRpYyBzY2FsaW5nICovCisJcmVncC0+ZnBfZGVidWdfMSA9IDA7CisJLyogVGhpcyBjYW4gb3ZlcnJpZGUgSFRPVEFMIGFuZCBWVE9UQUwgKi8KKwlyZWdwLT5mcF9kZWJ1Z18yID0gMDsKKworCS8qIFVzZSAyMC4xMiBmaXhlZCBwb2ludCBmb3JtYXQgdG8gYXZvaWQgZmxvYXRzICovCisJbW9kZV9yYXRpbyA9ICgxIDw8IDEyKSAqIGFkanVzdGVkX21vZGUtPmhkaXNwbGF5IC8gYWRqdXN0ZWRfbW9kZS0+dmRpc3BsYXk7CisJcGFuZWxfcmF0aW8gPSAoMSA8PCAxMikgKiBvdXRwdXRfbW9kZS0+aGRpc3BsYXkgLyBvdXRwdXRfbW9kZS0+dmRpc3BsYXk7CisJLyogaWYgcmF0aW9zIGFyZSBlcXVhbCwgU0NBTEVfQVNQRUNUIHdpbGwgYXV0b21hdGljYWxseSAoYW5kIGNvcnJlY3RseSkKKwkgKiBnZXQgdHJlYXRlZCB0aGUgc2FtZSBhcyBTQ0FMRV9GVUxMU0NSRUVOICovCisJaWYgKG52X2Nvbm5lY3Rvci0+c2NhbGluZ19tb2RlID09IERSTV9NT0RFX1NDQUxFX0FTUEVDVCAmJgorCSAgICBtb2RlX3JhdGlvICE9IHBhbmVsX3JhdGlvKSB7CisJCXVpbnQzMl90IGRpZmYsIHNjYWxlOworCQlib29sIGRpdmlkZV9ieV8yID0gbnZfZ2Y0X2Rpc3BfYXJjaChkZXYpOworCisJCWlmIChtb2RlX3JhdGlvIDwgcGFuZWxfcmF0aW8pIHsKKwkJCS8qIHZlcnRpY2FsIG5lZWRzIHRvIGV4cGFuZCB0byBnbGFzcyBzaXplIChhdXRvbWF0aWMpCisJCQkgKiBob3Jpem9udGFsIG5lZWRzIHRvIGJlIHNjYWxlZCBhdCB2ZXJ0aWNhbCBzY2FsZSBmYWN0b3IKKwkJCSAqIHRvIG1haW50YWluIGFzcGVjdCAqLworCisJCQlzY2FsZSA9ICgxIDw8IDEyKSAqIGFkanVzdGVkX21vZGUtPnZkaXNwbGF5IC8gb3V0cHV0X21vZGUtPnZkaXNwbGF5OworCQkJcmVncC0+ZnBfZGVidWdfMSA9IE5WX1BSQU1EQUNfRlBfREVCVUdfMV9YU0NBTEVfVEVTVE1PREVfRU5BQkxFIHwKKwkJCQkJICAgWExBVEUoc2NhbGUsIGRpdmlkZV9ieV8yLCBOVl9QUkFNREFDX0ZQX0RFQlVHXzFfWFNDQUxFX1ZBTFVFKTsKKworCQkJLyogcmVzdHJpY3QgYXJlYSBvZiBzY3JlZW4gdXNlZCwgaG9yaXpvbnRhbGx5ICovCisJCQlkaWZmID0gb3V0cHV0X21vZGUtPmhkaXNwbGF5IC0KKwkJCSAgICAgICBvdXRwdXRfbW9kZS0+dmRpc3BsYXkgKiBtb2RlX3JhdGlvIC8gKDEgPDwgMTIpOworCQkJcmVncC0+ZnBfaG9yaXpfcmVnc1tGUF9WQUxJRF9TVEFSVF0gKz0gZGlmZiAvIDI7CisJCQlyZWdwLT5mcF9ob3Jpel9yZWdzW0ZQX1ZBTElEX0VORF0gLT0gZGlmZiAvIDI7CisJCX0KKworCQlpZiAobW9kZV9yYXRpbyA+IHBhbmVsX3JhdGlvKSB7CisJCQkvKiBob3Jpem9udGFsIG5lZWRzIHRvIGV4cGFuZCB0byBnbGFzcyBzaXplIChhdXRvbWF0aWMpCisJCQkgKiB2ZXJ0aWNhbCBuZWVkcyB0byBiZSBzY2FsZWQgYXQgaG9yaXpvbnRhbCBzY2FsZSBmYWN0b3IKKwkJCSAqIHRvIG1haW50YWluIGFzcGVjdCAqLworCisJCQlzY2FsZSA9ICgxIDw8IDEyKSAqIGFkanVzdGVkX21vZGUtPmhkaXNwbGF5IC8gb3V0cHV0X21vZGUtPmhkaXNwbGF5OworCQkJcmVncC0+ZnBfZGVidWdfMSA9IE5WX1BSQU1EQUNfRlBfREVCVUdfMV9ZU0NBTEVfVEVTVE1PREVfRU5BQkxFIHwKKwkJCQkJICAgWExBVEUoc2NhbGUsIGRpdmlkZV9ieV8yLCBOVl9QUkFNREFDX0ZQX0RFQlVHXzFfWVNDQUxFX1ZBTFVFKTsKKworCQkJLyogcmVzdHJpY3QgYXJlYSBvZiBzY3JlZW4gdXNlZCwgdmVydGljYWxseSAqLworCQkJZGlmZiA9IG91dHB1dF9tb2RlLT52ZGlzcGxheSAtCisJCQkgICAgICAgKDEgPDwgMTIpICogb3V0cHV0X21vZGUtPmhkaXNwbGF5IC8gbW9kZV9yYXRpbzsKKwkJCXJlZ3AtPmZwX3ZlcnRfcmVnc1tGUF9WQUxJRF9TVEFSVF0gKz0gZGlmZiAvIDI7CisJCQlyZWdwLT5mcF92ZXJ0X3JlZ3NbRlBfVkFMSURfRU5EXSAtPSBkaWZmIC8gMjsKKwkJfQorCX0KKworCS8qIE91dHB1dCBwcm9wZXJ0eS4gKi8KKwlpZiAobnZfY29ubmVjdG9yLT51c2VfZGl0aGVyaW5nKSB7CisJCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDExKQorCQkJcmVncC0+ZGl0aGVyID0gc2F2ZXAtPmRpdGhlciB8IDB4MDAwMTAwMDA7CisJCWVsc2UgeworCQkJaW50IGk7CisJCQlyZWdwLT5kaXRoZXIgPSBzYXZlcC0+ZGl0aGVyIHwgMHgwMDAwMDAwMTsKKwkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCQlyZWdwLT5kaXRoZXJfcmVnc1tpXSA9IDB4ZTRlNGU0ZTQ7CisJCQkJcmVncC0+ZGl0aGVyX3JlZ3NbaSArIDNdID0gMHg0NDQ0NDQ0NDsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmIChkZXZfcHJpdi0+Y2hpcHNldCAhPSAweDExKSB7CisJCQkvKiByZXNldCB0aGVtICovCisJCQlpbnQgaTsKKwkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCQlyZWdwLT5kaXRoZXJfcmVnc1tpXSA9IHNhdmVwLT5kaXRoZXJfcmVnc1tpXTsKKwkJCQlyZWdwLT5kaXRoZXJfcmVnc1tpICsgM10gPSBzYXZlcC0+ZGl0aGVyX3JlZ3NbaSArIDNdOworCQkJfQorCQl9CisJCXJlZ3AtPmRpdGhlciA9IHNhdmVwLT5kaXRoZXI7CisJfQorCisJcmVncC0+ZnBfbWFyZ2luX2NvbG9yID0gMDsKK30KKworc3RhdGljIHZvaWQgbnYwNF9kZnBfY29tbWl0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyAqaGVscGVyID0gZW5jb2Rlci0+aGVscGVyX3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhlbmNvZGVyLT5jcnRjKTsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBkY2JfZW50cnkgKmRjYmUgPSBudl9lbmNvZGVyLT5kY2I7CisJaW50IGhlYWQgPSBub3V2ZWF1X2NydGMoZW5jb2Rlci0+Y3J0YyktPmluZGV4OworCisJTlZfVFJBQ0UoZGV2LCAiJXMgY2FsbGVkIGZvciBlbmNvZGVyICVkXG4iLCBfX2Z1bmNfXywgbnZfZW5jb2Rlci0+ZGNiLT5pbmRleCk7CisKKwlpZiAoZGNiZS0+dHlwZSA9PSBPVVRQVVRfVE1EUykKKwkJcnVuX3RtZHNfdGFibGUoZGV2LCBkY2JlLCBoZWFkLCBudl9lbmNvZGVyLT5tb2RlLmNsb2NrKTsKKwllbHNlIGlmIChkY2JlLT50eXBlID09IE9VVFBVVF9MVkRTKQorCQljYWxsX2x2ZHNfc2NyaXB0KGRldiwgZGNiZSwgaGVhZCwgTFZEU19SRVNFVCwgbnZfZW5jb2Rlci0+bW9kZS5jbG9jayk7CisKKwkvKiB1cGRhdGUgZnBfY29udHJvbCBzdGF0ZSBmb3IgYW55IGNoYW5nZXMgbWFkZSBieSBzY3JpcHRzLAorCSAqIHNvIGNvcnJlY3QgdmFsdWUgaXMgd3JpdHRlbiBhdCBEUE1TIG9uICovCisJZGV2X3ByaXYtPm1vZGVfcmVnLmNydGNfcmVnW2hlYWRdLmZwX2NvbnRyb2wgPQorCQlOVlJlYWRSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0wpOworCisJLyogVGhpcyBjb3VsZCB1c2UgcmVmaW5lbWVudCBmb3IgZmxhdHBhbmVscywgYnV0IGl0IHNob3VsZCB3b3JrIHRoaXMgd2F5ICovCisJaWYgKGRldl9wcml2LT5jaGlwc2V0IDwgMHg0NCkKKwkJTlZXcml0ZVJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfVEVTVF9DT05UUk9MICsgbnYwNF9kYWNfb3V0cHV0X29mZnNldChlbmNvZGVyKSwgMHhmMDAwMDAwMCk7CisJZWxzZQorCQlOVldyaXRlUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19URVNUX0NPTlRST0wgKyBudjA0X2RhY19vdXRwdXRfb2Zmc2V0KGVuY29kZXIpLCAweDAwMTAwMDAwKTsKKworCWhlbHBlci0+ZHBtcyhlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09OKTsKKworCU5WX0lORk8oZGV2LCAiT3V0cHV0ICVzIGlzIHJ1bm5pbmcgb24gQ1JUQyAlZCB1c2luZyBvdXRwdXQgJWNcbiIsCisJCWRybV9nZXRfY29ubmVjdG9yX25hbWUoJm5vdXZlYXVfZW5jb2Rlcl9jb25uZWN0b3JfZ2V0KG52X2VuY29kZXIpLT5iYXNlKSwKKwkJbnZfY3J0Yy0+aW5kZXgsICdAJyArIGZmcyhudl9lbmNvZGVyLT5kY2ItPm9yKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19wb3dlcnNhdmluZ19kcG1zKGludCBtb2RlKQoreworCXJldHVybiAobW9kZSAhPSBEUk1fTU9ERV9EUE1TX09OKTsKK30KKworc3RhdGljIHZvaWQgbnYwNF9sdmRzX2RwbXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IGVuY29kZXItPmNydGM7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCWJvb2wgd2FzX3Bvd2Vyc2F2aW5nID0gaXNfcG93ZXJzYXZpbmdfZHBtcyhudl9lbmNvZGVyLT5sYXN0X2RwbXMpOworCisJaWYgKG52X2VuY29kZXItPmxhc3RfZHBtcyA9PSBtb2RlKQorCQlyZXR1cm47CisJbnZfZW5jb2Rlci0+bGFzdF9kcG1zID0gbW9kZTsKKworCU5WX0lORk8oZGV2LCAiU2V0dGluZyBkcG1zIG1vZGUgJWQgb24gbHZkcyBlbmNvZGVyIChvdXRwdXQgJWQpXG4iLAorCQkgICAgIG1vZGUsIG52X2VuY29kZXItPmRjYi0+aW5kZXgpOworCisJaWYgKHdhc19wb3dlcnNhdmluZyAmJiBpc19wb3dlcnNhdmluZ19kcG1zKG1vZGUpKQorCQlyZXR1cm47CisKKwlpZiAobnZfZW5jb2Rlci0+ZGNiLT5sdmRzY29uZi51c2VfcG93ZXJfc2NyaXB0cykgeworCQlzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKm52X2Nvbm5lY3RvciA9IG5vdXZlYXVfZW5jb2Rlcl9jb25uZWN0b3JfZ2V0KG52X2VuY29kZXIpOworCisJCS8qIHdoZW4gcmVtb3ZpbmcgYW4gb3V0cHV0LCBjcnRjIG1heSBub3QgYmUgc2V0LCBidXQgUEFORUxfT0ZGCisJCSAqIG11c3Qgc3RpbGwgYmUgcnVuCisJCSAqLworCQlpbnQgaGVhZCA9IGNydGMgPyBub3V2ZWF1X2NydGMoY3J0YyktPmluZGV4IDoKKwkJCSAgIG52MDRfZGZwX2dldF9ib3VuZF9oZWFkKGRldiwgbnZfZW5jb2Rlci0+ZGNiKTsKKworCQlpZiAobW9kZSA9PSBEUk1fTU9ERV9EUE1TX09OKSB7CisJCQlpZiAoIW52X2Nvbm5lY3Rvci0+bmF0aXZlX21vZGUpIHsKKwkJCQlOVl9FUlJPUihkZXYsICJOb3QgdHVybmluZyBvbiBMVkRTIHdpdGhvdXQgbmF0aXZlIG1vZGVcbiIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWNhbGxfbHZkc19zY3JpcHQoZGV2LCBudl9lbmNvZGVyLT5kY2IsIGhlYWQsCisJCQkJCSBMVkRTX1BBTkVMX09OLCBudl9jb25uZWN0b3ItPm5hdGl2ZV9tb2RlLT5jbG9jayk7CisJCX0gZWxzZQorCQkJLyogcHhjbGsgb2YgMCBpcyBmaW5lIGZvciBQQU5FTF9PRkYsIGFuZCBmb3IgYQorCQkJICogZGlzY29ubmVjdGVkIExWRFMgZW5jb2RlciB0aGVyZSBpcyBubyBuYXRpdmVfbW9kZQorCQkJICovCisJCQljYWxsX2x2ZHNfc2NyaXB0KGRldiwgbnZfZW5jb2Rlci0+ZGNiLCBoZWFkLAorCQkJCQkgTFZEU19QQU5FTF9PRkYsIDApOworCX0KKworCW52MDRfZGZwX3VwZGF0ZV9mcF9jb250cm9sKGVuY29kZXIsIG1vZGUpOworCisJaWYgKG1vZGUgPT0gRFJNX01PREVfRFBNU19PTikKKwkJbnYwNF9kZnBfcHJlcGFyZV9zZWxfY2xrKGRldiwgbnZfZW5jb2Rlciwgbm91dmVhdV9jcnRjKGNydGMpLT5pbmRleCk7CisJZWxzZSB7CisJCWRldl9wcml2LT5tb2RlX3JlZy5zZWxfY2xrID0gTlZSZWFkUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19TRUxfQ0xLKTsKKwkJZGV2X3ByaXYtPm1vZGVfcmVnLnNlbF9jbGsgJj0gfjB4ZjA7CisJfQorCU5WV3JpdGVSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDX1NFTF9DTEssIGRldl9wcml2LT5tb2RlX3JlZy5zZWxfY2xrKTsKK30KKworc3RhdGljIHZvaWQgbnYwNF90bWRzX2RwbXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisKKwlpZiAobnZfZW5jb2Rlci0+bGFzdF9kcG1zID09IG1vZGUpCisJCXJldHVybjsKKwludl9lbmNvZGVyLT5sYXN0X2RwbXMgPSBtb2RlOworCisJTlZfSU5GTyhkZXYsICJTZXR0aW5nIGRwbXMgbW9kZSAlZCBvbiB0bWRzIGVuY29kZXIgKG91dHB1dCAlZClcbiIsCisJCSAgICAgbW9kZSwgbnZfZW5jb2Rlci0+ZGNiLT5pbmRleCk7CisKKwludjA0X2RmcF91cGRhdGVfZnBfY29udHJvbChlbmNvZGVyLCBtb2RlKTsKK30KKworc3RhdGljIHZvaWQgbnYwNF9kZnBfc2F2ZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCisJaWYgKG52X3R3b19oZWFkcyhkZXYpKQorCQludl9lbmNvZGVyLT5yZXN0b3JlLmhlYWQgPQorCQkJbnYwNF9kZnBfZ2V0X2JvdW5kX2hlYWQoZGV2LCBudl9lbmNvZGVyLT5kY2IpOworfQorCitzdGF0aWMgdm9pZCBudjA0X2RmcF9yZXN0b3JlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaGVhZCA9IG52X2VuY29kZXItPnJlc3RvcmUuaGVhZDsKKworCWlmIChudl9lbmNvZGVyLT5kY2ItPnR5cGUgPT0gT1VUUFVUX0xWRFMpIHsKKwkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm5hdGl2ZV9tb2RlID0gbm91dmVhdV9lbmNvZGVyX2Nvbm5lY3Rvcl9nZXQobnZfZW5jb2RlciktPm5hdGl2ZV9tb2RlOworCQlpZiAobmF0aXZlX21vZGUpCisJCQljYWxsX2x2ZHNfc2NyaXB0KGRldiwgbnZfZW5jb2Rlci0+ZGNiLCBoZWFkLCBMVkRTX1BBTkVMX09OLAorCQkJCQkgbmF0aXZlX21vZGUtPmNsb2NrKTsKKwkJZWxzZQorCQkJTlZfRVJST1IoZGV2LCAiTm90IHJlc3RvcmluZyBMVkRTIHdpdGhvdXQgbmF0aXZlIG1vZGVcbiIpOworCisJfSBlbHNlIGlmIChudl9lbmNvZGVyLT5kY2ItPnR5cGUgPT0gT1VUUFVUX1RNRFMpIHsKKwkJaW50IGNsb2NrID0gbm91dmVhdV9od19wbGx2YWxzX3RvX2NsaworCQkJCQkoJmRldl9wcml2LT5zYXZlZF9yZWcuY3J0Y19yZWdbaGVhZF0ucGxsdmFscyk7CisKKwkJcnVuX3RtZHNfdGFibGUoZGV2LCBudl9lbmNvZGVyLT5kY2IsIGhlYWQsIGNsb2NrKTsKKwl9CisKKwludl9lbmNvZGVyLT5sYXN0X2RwbXMgPSBOVl9EUE1TX0NMRUFSRUQ7Cit9CisKK3N0YXRpYyB2b2lkIG52MDRfZGZwX2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisKKwlOVl9ERUJVRyhlbmNvZGVyLT5kZXYsICJcbiIpOworCisJZHJtX2VuY29kZXJfY2xlYW51cChlbmNvZGVyKTsKKwlrZnJlZShudl9lbmNvZGVyKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgbnYwNF9sdmRzX2hlbHBlcl9mdW5jcyA9IHsKKwkuZHBtcyA9IG52MDRfbHZkc19kcG1zLAorCS5zYXZlID0gbnYwNF9kZnBfc2F2ZSwKKwkucmVzdG9yZSA9IG52MDRfZGZwX3Jlc3RvcmUsCisJLm1vZGVfZml4dXAgPSBudjA0X2RmcF9tb2RlX2ZpeHVwLAorCS5wcmVwYXJlID0gbnYwNF9kZnBfcHJlcGFyZSwKKwkuY29tbWl0ID0gbnYwNF9kZnBfY29tbWl0LAorCS5tb2RlX3NldCA9IG52MDRfZGZwX21vZGVfc2V0LAorCS5kZXRlY3QgPSBOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgbnYwNF90bWRzX2hlbHBlcl9mdW5jcyA9IHsKKwkuZHBtcyA9IG52MDRfdG1kc19kcG1zLAorCS5zYXZlID0gbnYwNF9kZnBfc2F2ZSwKKwkucmVzdG9yZSA9IG52MDRfZGZwX3Jlc3RvcmUsCisJLm1vZGVfZml4dXAgPSBudjA0X2RmcF9tb2RlX2ZpeHVwLAorCS5wcmVwYXJlID0gbnYwNF9kZnBfcHJlcGFyZSwKKwkuY29tbWl0ID0gbnYwNF9kZnBfY29tbWl0LAorCS5tb2RlX3NldCA9IG52MDRfZGZwX21vZGVfc2V0LAorCS5kZXRlY3QgPSBOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9mdW5jcyBudjA0X2RmcF9mdW5jcyA9IHsKKwkuZGVzdHJveSA9IG52MDRfZGZwX2Rlc3Ryb3ksCit9OworCitpbnQgbnYwNF9kZnBfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfZW50cnkgKmVudHJ5KQoreworCWNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmhlbHBlcjsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IE5VTEw7CisJaW50IHR5cGU7CisKKwlzd2l0Y2ggKGVudHJ5LT50eXBlKSB7CisJY2FzZSBPVVRQVVRfVE1EUzoKKwkJdHlwZSA9IERSTV9NT0RFX0VOQ09ERVJfVE1EUzsKKwkJaGVscGVyID0gJm52MDRfdG1kc19oZWxwZXJfZnVuY3M7CisJCWJyZWFrOworCWNhc2UgT1VUUFVUX0xWRFM6CisJCXR5cGUgPSBEUk1fTU9ERV9FTkNPREVSX0xWRFM7CisJCWhlbHBlciA9ICZudjA0X2x2ZHNfaGVscGVyX2Z1bmNzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwludl9lbmNvZGVyID0ga3phbGxvYyhzaXplb2YoKm52X2VuY29kZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW52X2VuY29kZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJZW5jb2RlciA9IHRvX2RybV9lbmNvZGVyKG52X2VuY29kZXIpOworCisJbnZfZW5jb2Rlci0+ZGNiID0gZW50cnk7CisJbnZfZW5jb2Rlci0+b3IgPSBmZnMoZW50cnktPm9yKSAtIDE7CisKKwlkcm1fZW5jb2Rlcl9pbml0KGRldiwgZW5jb2RlciwgJm52MDRfZGZwX2Z1bmNzLCB0eXBlKTsKKwlkcm1fZW5jb2Rlcl9oZWxwZXJfYWRkKGVuY29kZXIsIGhlbHBlcik7CisKKwllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9IGVudHJ5LT5oZWFkczsKKwllbmNvZGVyLT5wb3NzaWJsZV9jbG9uZXMgPSAwOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZGlzcGxheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0N2M3NTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2Rpc3BsYXkuYwpAQCAtMCwwICsxLDI4OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA5IFJlZCBIYXQgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcjogQmVuIFNrZWdncworICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCisKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZmIuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2h3LmgiCisjaW5jbHVkZSAibm91dmVhdV9lbmNvZGVyLmgiCisjaW5jbHVkZSAibm91dmVhdV9jb25uZWN0b3IuaCIKKworI2RlZmluZSBNVUxUSVBMRV9FTkNPREVSUyhlKSAoZSAmIChlIC0gMSkpCisKK3N0YXRpYyB2b2lkCitudjA0X2Rpc3BsYXlfc3RvcmVfaW5pdGlhbF9oZWFkX293bmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCAhPSAweDExKSB7CisJCWRldl9wcml2LT5jcnRjX293bmVyID0gTlZSZWFkVmdhQ3J0YyhkZXYsIDAsIE5WX0NJT19DUkVfNDQpOworCQlnb3RvIG93bmVya25vd247CisJfQorCisJLyogcmVhZGluZyBDUjQ0IGlzIGJyb2tlbiBvbiBudjExLCBzbyB3ZSBhdHRlbXB0IHRvIGluZmVyIGl0ICovCisJaWYgKG52UmVhZE1DKGRldiwgTlZfUEJVU19ERUJVR18xKSAmICgxIDw8IDI4KSkJLyogaGVhZHMgdGllZCwgcmVzdG9yZSBib3RoICovCisJCWRldl9wcml2LT5jcnRjX293bmVyID0gMHg0OworCWVsc2UgeworCQl1aW50OF90IHNsYXZlZF9vbl9BLCBzbGF2ZWRfb25fQjsKKwkJYm9vbCB0dkEgPSBmYWxzZTsKKwkJYm9vbCB0dkIgPSBmYWxzZTsKKworCQlOVkxvY2tWZ2FDcnRjcyhkZXYsIGZhbHNlKTsKKworCQlzbGF2ZWRfb25fQiA9IE5WUmVhZFZnYUNydGMoZGV2LCAxLCBOVl9DSU9fQ1JFX1BJWEVMX0lOREVYKSAmCisJCQkJCQkJCQkweDgwOworCQlpZiAoc2xhdmVkX29uX0IpCisJCQl0dkIgPSAhKE5WUmVhZFZnYUNydGMoZGV2LCAxLCBOVl9DSU9fQ1JFX0xDRF9fSU5ERVgpICYKKwkJCQkJTUFTSyhOVl9DSU9fQ1JFX0xDRF9MQ0RfU0VMRUNUKSk7CisKKwkJc2xhdmVkX29uX0EgPSBOVlJlYWRWZ2FDcnRjKGRldiwgMCwgTlZfQ0lPX0NSRV9QSVhFTF9JTkRFWCkgJgorCQkJCQkJCQkJMHg4MDsKKwkJaWYgKHNsYXZlZF9vbl9BKQorCQkJdHZBID0gIShOVlJlYWRWZ2FDcnRjKGRldiwgMCwgTlZfQ0lPX0NSRV9MQ0RfX0lOREVYKSAmCisJCQkJCU1BU0soTlZfQ0lPX0NSRV9MQ0RfTENEX1NFTEVDVCkpOworCisJCU5WTG9ja1ZnYUNydGNzKGRldiwgdHJ1ZSk7CisKKwkJaWYgKHNsYXZlZF9vbl9BICYmICF0dkEpCisJCQlkZXZfcHJpdi0+Y3J0Y19vd25lciA9IDB4MDsKKwkJZWxzZSBpZiAoc2xhdmVkX29uX0IgJiYgIXR2QikKKwkJCWRldl9wcml2LT5jcnRjX293bmVyID0gMHgzOworCQllbHNlIGlmIChzbGF2ZWRfb25fQSkKKwkJCWRldl9wcml2LT5jcnRjX293bmVyID0gMHgwOworCQllbHNlIGlmIChzbGF2ZWRfb25fQikKKwkJCWRldl9wcml2LT5jcnRjX293bmVyID0gMHgzOworCQllbHNlCisJCQlkZXZfcHJpdi0+Y3J0Y19vd25lciA9IDB4MDsKKwl9CisKK293bmVya25vd246CisJTlZfSU5GTyhkZXYsICJJbml0aWFsIENSVENfT1dORVIgaXMgJWRcbiIsIGRldl9wcml2LT5jcnRjX293bmVyKTsKKworCS8qIHdlIG5lZWQgdG8gZW5zdXJlIHRoZSBoZWFkcyBhcmUgbm90IHRpZWQgaGVuY2Vmb3J0aCwgb3IgcmVhZGluZyBhbnkKKwkgKiA4IGJpdCByZWcgb24gaGVhZCBCIHdpbGwgZmFpbAorCSAqIHNldHRpbmcgYSBzaW5nbGUgYXJiaXRyYXJ5IGhlYWQgc29sdmVzIHRoYXQgKi8KKwlOVlNldE93bmVyKGRldiwgMCk7Cit9CisKK2ludAorbnYwNF9kaXNwbGF5X2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IHBhcnNlZF9kY2IgKmRjYiA9IGRldl9wcml2LT52Ymlvcy0+ZGNiOworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CisJdWludDE2X3QgY29ubmVjdG9yWzE2XSA9IHsgMCB9OworCWludCBpLCByZXQ7CisKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCisJaWYgKG52X3R3b19oZWFkcyhkZXYpKQorCQludjA0X2Rpc3BsYXlfc3RvcmVfaW5pdGlhbF9oZWFkX293bmVyKGRldik7CisKKwlkcm1fbW9kZV9jb25maWdfaW5pdChkZXYpOworCWRybV9tb2RlX2NyZWF0ZV9zY2FsaW5nX21vZGVfcHJvcGVydHkoZGV2KTsKKwlkcm1fbW9kZV9jcmVhdGVfZGl0aGVyaW5nX3Byb3BlcnR5KGRldik7CisKKwlkZXYtPm1vZGVfY29uZmlnLmZ1bmNzID0gKHZvaWQgKikmbm91dmVhdV9tb2RlX2NvbmZpZ19mdW5jczsKKworCWRldi0+bW9kZV9jb25maWcubWluX3dpZHRoID0gMDsKKwlkZXYtPm1vZGVfY29uZmlnLm1pbl9oZWlnaHQgPSAwOworCXN3aXRjaCAoZGV2X3ByaXYtPmNhcmRfdHlwZSkgeworCWNhc2UgTlZfMDQ6CisJCWRldi0+bW9kZV9jb25maWcubWF4X3dpZHRoID0gMjA0ODsKKwkJZGV2LT5tb2RlX2NvbmZpZy5tYXhfaGVpZ2h0ID0gMjA0ODsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2LT5tb2RlX2NvbmZpZy5tYXhfd2lkdGggPSA0MDk2OworCQlkZXYtPm1vZGVfY29uZmlnLm1heF9oZWlnaHQgPSA0MDk2OworCQlicmVhazsKKwl9CisKKwlkZXYtPm1vZGVfY29uZmlnLmZiX2Jhc2UgPSBkZXZfcHJpdi0+ZmJfcGh5czsKKworCW52MDRfY3J0Y19jcmVhdGUoZGV2LCAwKTsKKwlpZiAobnZfdHdvX2hlYWRzKGRldikpCisJCW52MDRfY3J0Y19jcmVhdGUoZGV2LCAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBkY2ItPmVudHJpZXM7IGkrKykgeworCQlzdHJ1Y3QgZGNiX2VudHJ5ICpkY2JlbnQgPSAmZGNiLT5lbnRyeVtpXTsKKworCQlzd2l0Y2ggKGRjYmVudC0+dHlwZSkgeworCQljYXNlIE9VVFBVVF9BTkFMT0c6CisJCQlyZXQgPSBudjA0X2RhY19jcmVhdGUoZGV2LCBkY2JlbnQpOworCQkJYnJlYWs7CisJCWNhc2UgT1VUUFVUX0xWRFM6CisJCWNhc2UgT1VUUFVUX1RNRFM6CisJCQlyZXQgPSBudjA0X2RmcF9jcmVhdGUoZGV2LCBkY2JlbnQpOworCQkJYnJlYWs7CisJCWNhc2UgT1VUUFVUX1RWOgorCQkJaWYgKGRjYmVudC0+bG9jYXRpb24gPT0gRENCX0xPQ19PTl9DSElQKQorCQkJCXJldCA9IG52MTdfdHZfY3JlYXRlKGRldiwgZGNiZW50KTsKKwkJCWVsc2UKKwkJCQlyZXQgPSBudjA0X3R2X2NyZWF0ZShkZXYsIGRjYmVudCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCU5WX1dBUk4oZGV2LCAiRENCIHR5cGUgJWQgbm90IGtub3duXG4iLCBkY2JlbnQtPnR5cGUpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAocmV0KQorCQkJY29udGludWU7CisKKwkJY29ubmVjdG9yW2RjYmVudC0+Y29ubmVjdG9yXSB8PSAoMSA8PCBkY2JlbnQtPnR5cGUpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBkY2ItPmVudHJpZXM7IGkrKykgeworCQlzdHJ1Y3QgZGNiX2VudHJ5ICpkY2JlbnQgPSAmZGNiLT5lbnRyeVtpXTsKKwkJdWludDE2X3QgZW5jb2RlcnM7CisJCWludCB0eXBlOworCisJCWVuY29kZXJzID0gY29ubmVjdG9yW2RjYmVudC0+Y29ubmVjdG9yXTsKKwkJaWYgKCEoZW5jb2RlcnMgJiAoMSA8PCBkY2JlbnQtPnR5cGUpKSkKKwkJCWNvbnRpbnVlOworCQljb25uZWN0b3JbZGNiZW50LT5jb25uZWN0b3JdID0gMDsKKworCQlzd2l0Y2ggKGRjYmVudC0+dHlwZSkgeworCQljYXNlIE9VVFBVVF9BTkFMT0c6CisJCQlpZiAoIU1VTFRJUExFX0VOQ09ERVJTKGVuY29kZXJzKSkKKwkJCQl0eXBlID0gRFJNX01PREVfQ09OTkVDVE9SX1ZHQTsKKwkJCWVsc2UKKwkJCQl0eXBlID0gRFJNX01PREVfQ09OTkVDVE9SX0RWSUk7CisJCQlicmVhazsKKwkJY2FzZSBPVVRQVVRfVE1EUzoKKwkJCWlmICghTVVMVElQTEVfRU5DT0RFUlMoZW5jb2RlcnMpKQorCQkJCXR5cGUgPSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJRDsKKwkJCWVsc2UKKwkJCQl0eXBlID0gRFJNX01PREVfQ09OTkVDVE9SX0RWSUk7CisJCQlicmVhazsKKwkJY2FzZSBPVVRQVVRfTFZEUzoKKwkJCXR5cGUgPSBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUzsKKyNpZiAwCisJCQkvKiBkb24ndCBjcmVhdGUgaTJjIGFkYXB0ZXIgd2hlbiBsdmRzIGRkYyBub3QgYWxsb3dlZCAqLworCQkJaWYgKGRjYmVudC0+bHZkc2NvbmYudXNlX3N0cmFwc19mb3JfbW9kZSB8fAorCQkJICAgIGRldl9wcml2LT52Ymlvcy0+ZnBfbm9fZGRjKQorCQkJCWkyY19pbmRleCA9IDB4ZjsKKyNlbmRpZgorCQkJYnJlYWs7CisJCWNhc2UgT1VUUFVUX1RWOgorCQkJdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9UVjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9Vbmtub3duOworCQkJY29udGludWU7CisJCX0KKworCQlub3V2ZWF1X2Nvbm5lY3Rvcl9jcmVhdGUoZGV2LCBkY2JlbnQtPmNvbm5lY3RvciwgdHlwZSk7CisJfQorCisJLyogU2F2ZSBwcmV2aW91cyBzdGF0ZSAqLworCU5WTG9ja1ZnYUNydGNzKGRldiwgZmFsc2UpOworCisJbm91dmVhdV9od19zYXZlX3ZnYV9mb250cyhkZXYsIDEpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpCisJCWNydGMtPmZ1bmNzLT5zYXZlKGNydGMpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbmNvZGVyLCAmZGV2LT5tb2RlX2NvbmZpZy5lbmNvZGVyX2xpc3QsIGhlYWQpIHsKKwkJc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyAqZnVuYyA9IGVuY29kZXItPmhlbHBlcl9wcml2YXRlOworCisJCWZ1bmMtPnNhdmUoZW5jb2Rlcik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK252MDRfZGlzcGxheV9kZXN0cm95KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKKworCU5WX0RFQlVHKGRldiwgIlxuIik7CisKKwkvKiBUdXJuIGV2ZXJ5IENSVEMgb2ZmLiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKSB7CisJCXN0cnVjdCBkcm1fbW9kZV9zZXQgbW9kZXNldCA9IHsKKwkJCS5jcnRjID0gY3J0YywKKwkJfTsKKworCQljcnRjLT5mdW5jcy0+c2V0X2NvbmZpZygmbW9kZXNldCk7CisJfQorCisJLyogUmVzdG9yZSBzdGF0ZSAqLworCU5WTG9ja1ZnYUNydGNzKGRldiwgZmFsc2UpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbmNvZGVyLCAmZGV2LT5tb2RlX2NvbmZpZy5lbmNvZGVyX2xpc3QsIGhlYWQpIHsKKwkJc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyAqZnVuYyA9IGVuY29kZXItPmhlbHBlcl9wcml2YXRlOworCisJCWZ1bmMtPnJlc3RvcmUoZW5jb2Rlcik7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpCisJCWNydGMtPmZ1bmNzLT5yZXN0b3JlKGNydGMpOworCisJbm91dmVhdV9od19zYXZlX3ZnYV9mb250cyhkZXYsIDApOworCisJZHJtX21vZGVfY29uZmlnX2NsZWFudXAoZGV2KTsKK30KKwordm9pZAorbnYwNF9kaXNwbGF5X3Jlc3RvcmUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CisKKwlOVkxvY2tWZ2FDcnRjcyhkZXYsIGZhbHNlKTsKKworCS8qIG1laC4uIG1vZGVzZXQgYXBwYXJlbnRseSBkb2Vzbid0IHNldHVwIGFsbCB0aGUgcmVncyBhbmQgZGVwZW5kcworCSAqIG9uIHByZS1leGlzdGluZyBzdGF0ZSwgZm9yIG5vdyBsb2FkIHRoZSBzdGF0ZSBvZiB0aGUgY2FyZCAqYmVmb3JlKgorCSAqIG5vdXZlYXUgd2FzIGxvYWRlZCwgYW5kIHRoZW4gZG8gYSBtb2Rlc2V0LgorCSAqCisJICogYmVzdCB0aGluZyB0byBkbyBwcm9iYWJseSBpcyB0byBtYWtlIHNhdmUvcmVzdG9yZSByb3V0aW5lcyBub3QKKwkgKiBzYXZlL3Jlc3RvcmUgInByZS1sb2FkIiBzdGF0ZSwgYnV0IG1vcmUgZ2VuZXJhbCBzbyB3ZSBjYW4gc2F2ZQorCSAqIG9uIHN1c3BlbmQgdG9vLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jb2RlciwgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LCBoZWFkKSB7CisJCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmZ1bmMgPSBlbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKKworCQlmdW5jLT5yZXN0b3JlKGVuY29kZXIpOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKQorCQljcnRjLT5mdW5jcy0+cmVzdG9yZShjcnRjKTsKKworCWlmIChudl90d29faGVhZHMoZGV2KSkgeworCQlOVl9JTkZPKGRldiwgIlJlc3RvcmluZyBDUlRDX09XTkVSIHRvICVkLlxuIiwKKwkJCWRldl9wcml2LT5jcnRjX293bmVyKTsKKwkJTlZTZXRPd25lcihkZXYsIGRldl9wcml2LT5jcnRjX293bmVyKTsKKwl9CisKKwlOVkxvY2tWZ2FDcnRjcyhkZXYsIHRydWUpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2ZiLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2ZiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM4Y2Y2MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZmIuYwpAQCAtMCwwICsxLDIxIEBACisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9kcm0uaCIKKworaW50CitudjA0X2ZiX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwkvKiBUaGlzIGlzIHdoYXQgdGhlIEREWCBkaWQgZm9yIE5WX0FSQ0hfMDQsIGJ1dCBhIG1taW8tdHJhY2Ugc2hvd3MKKwkgKiBudmlkaWEgcmVhZGluZyBQRkJfQ0ZHXzAsIHRoZW4gd3JpdGluZyBiYWNrIGl0cyBvcmlnaW5hbCB2YWx1ZS4KKwkgKiAod2hpY2ggd2FzIDB4NzAxMTE0IGluIHRoaXMgY2FzZSkKKwkgKi8KKworCW52X3dyMzIoZGV2LCBOVjA0X1BGQl9DRkcwLCAweDExMTQpOworCXJldHVybiAwOworfQorCit2b2lkCitudjA0X2ZiX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2ZiY29uLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2ZiY29uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlhMzEwNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZmJjb24uYwpAQCAtMCwwICsxLDMxNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA5IEJlbiBTa2VnZ3MKKyAqIENvcHlyaWdodCAyMDA4IFN0dWFydCBCZW5uZXR0CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2RtYS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZmJjb24uaCIKKworc3RhdGljIHZvaWQKK252MDRfZmJjb25fY29weWFyZWEoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9jb3B5YXJlYSAqcmVnaW9uKQoreworCXN0cnVjdCBub3V2ZWF1X2ZiY29uX3BhciAqcGFyID0gaW5mby0+cGFyOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwYXItPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Y2hhbm5lbDsKKworCWlmIChpbmZvLT5zdGF0ZSAhPSBGQklORk9fU1RBVEVfUlVOTklORykKKwkJcmV0dXJuOworCisJaWYgKCEoaW5mby0+ZmxhZ3MgJiBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRCkgJiYgUklOR19TUEFDRShjaGFuLCA0KSkgeworCQlOVl9FUlJPUihkZXYsICJHUFUgbG9ja3VwIC0gc3dpdGNoaW5nIHRvIHNvZnR3YXJlIGZiY29uXG4iKTsKKwkJaW5mby0+ZmxhZ3MgfD0gRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQ7CisJfQorCisJaWYgKGluZm8tPmZsYWdzICYgRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQpIHsKKwkJY2ZiX2NvcHlhcmVhKGluZm8sIHJlZ2lvbik7CisJCXJldHVybjsKKwl9CisKKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViSW1hZ2VCbGl0LCAweDAzMDAsIDMpOworCU9VVF9SSU5HKGNoYW4sIChyZWdpb24tPnN5IDw8IDE2KSB8IHJlZ2lvbi0+c3gpOworCU9VVF9SSU5HKGNoYW4sIChyZWdpb24tPmR5IDw8IDE2KSB8IHJlZ2lvbi0+ZHgpOworCU9VVF9SSU5HKGNoYW4sIChyZWdpb24tPmhlaWdodCA8PCAxNikgfCByZWdpb24tPndpZHRoKTsKKwlGSVJFX1JJTkcoY2hhbik7Cit9CisKK3N0YXRpYyB2b2lkCitudjA0X2ZiY29uX2ZpbGxyZWN0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfZmlsbHJlY3QgKnJlY3QpCit7CisJc3RydWN0IG5vdXZlYXVfZmJjb25fcGFyICpwYXIgPSBpbmZvLT5wYXI7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHBhci0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IGRldl9wcml2LT5jaGFubmVsOworCXVpbnQzMl90IGNvbG9yID0gKCh1aW50MzJfdCAqKSBpbmZvLT5wc2V1ZG9fcGFsZXR0ZSlbcmVjdC0+Y29sb3JdOworCisJaWYgKGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HKQorCQlyZXR1cm47CisKKwlpZiAoIShpbmZvLT5mbGFncyAmIEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEKSAmJiBSSU5HX1NQQUNFKGNoYW4sIDcpKSB7CisJCU5WX0VSUk9SKGRldiwgIkdQVSBsb2NrdXAgLSBzd2l0Y2hpbmcgdG8gc29mdHdhcmUgZmJjb25cbiIpOworCQlpbmZvLT5mbGFncyB8PSBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRDsKKwl9CisKKwlpZiAoaW5mby0+ZmxhZ3MgJiBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRCkgeworCQljZmJfZmlsbHJlY3QoaW5mbywgcmVjdCk7CisJCXJldHVybjsKKwl9CisKKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViR2RpUmVjdCwgMHgwMmZjLCAxKTsKKwlPVVRfUklORyhjaGFuLCAocmVjdC0+cm9wICE9IFJPUF9DT1BZKSA/IDEgOiAzKTsKKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViR2RpUmVjdCwgMHgwM2ZjLCAxKTsKKwlPVVRfUklORyhjaGFuLCBjb2xvcik7CisJQkVHSU5fUklORyhjaGFuLCBOdlN1YkdkaVJlY3QsIDB4MDQwMCwgMik7CisJT1VUX1JJTkcoY2hhbiwgKHJlY3QtPmR4IDw8IDE2KSB8IHJlY3QtPmR5KTsKKwlPVVRfUklORyhjaGFuLCAocmVjdC0+d2lkdGggPDwgMTYpIHwgcmVjdC0+aGVpZ2h0KTsKKwlGSVJFX1JJTkcoY2hhbik7Cit9CisKK3N0YXRpYyB2b2lkCitudjA0X2ZiY29uX2ltYWdlYmxpdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFnZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9mYmNvbl9wYXIgKnBhciA9IGluZm8tPnBhcjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcGFyLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmNoYW5uZWw7CisJdWludDMyX3QgZmc7CisJdWludDMyX3QgYmc7CisJdWludDMyX3QgZHNpemU7CisJdWludDMyX3Qgd2lkdGg7CisJdWludDMyX3QgKmRhdGEgPSAodWludDMyX3QgKilpbWFnZS0+ZGF0YTsKKworCWlmIChpbmZvLT5zdGF0ZSAhPSBGQklORk9fU1RBVEVfUlVOTklORykKKwkJcmV0dXJuOworCisJaWYgKGltYWdlLT5kZXB0aCAhPSAxKSB7CisJCWNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworCQlyZXR1cm47CisJfQorCisJaWYgKCEoaW5mby0+ZmxhZ3MgJiBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRCkgJiYgUklOR19TUEFDRShjaGFuLCA4KSkgeworCQlOVl9FUlJPUihkZXYsICJHUFUgbG9ja3VwIC0gc3dpdGNoaW5nIHRvIHNvZnR3YXJlIGZiY29uXG4iKTsKKwkJaW5mby0+ZmxhZ3MgfD0gRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQ7CisJfQorCisJaWYgKGluZm8tPmZsYWdzICYgRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQpIHsKKwkJY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJCXJldHVybjsKKwl9CisKKwl3aWR0aCA9IChpbWFnZS0+d2lkdGggKyAzMSkgJiB+MzE7CisJZHNpemUgPSAod2lkdGggKiBpbWFnZS0+aGVpZ2h0KSA+PiA1OworCisJaWYgKGluZm8tPmZpeC52aXN1YWwgPT0gRkJfVklTVUFMX1RSVUVDT0xPUiB8fAorCSAgICBpbmZvLT5maXgudmlzdWFsID09IEZCX1ZJU1VBTF9ESVJFQ1RDT0xPUikgeworCQlmZyA9ICgodWludDMyX3QgKikgaW5mby0+cHNldWRvX3BhbGV0dGUpW2ltYWdlLT5mZ19jb2xvcl07CisJCWJnID0gKCh1aW50MzJfdCAqKSBpbmZvLT5wc2V1ZG9fcGFsZXR0ZSlbaW1hZ2UtPmJnX2NvbG9yXTsKKwl9IGVsc2UgeworCQlmZyA9IGltYWdlLT5mZ19jb2xvcjsKKwkJYmcgPSBpbWFnZS0+YmdfY29sb3I7CisJfQorCisJQkVHSU5fUklORyhjaGFuLCBOdlN1YkdkaVJlY3QsIDB4MGJlNCwgNyk7CisJT1VUX1JJTkcoY2hhbiwgKGltYWdlLT5keSA8PCAxNikgfCAoaW1hZ2UtPmR4ICYgMHhmZmZmKSk7CisJT1VUX1JJTkcoY2hhbiwgKChpbWFnZS0+ZHkgKyBpbWFnZS0+aGVpZ2h0KSA8PCAxNikgfAorCQkJICgoaW1hZ2UtPmR4ICsgaW1hZ2UtPndpZHRoKSAmIDB4ZmZmZikpOworCU9VVF9SSU5HKGNoYW4sIGJnKTsKKwlPVVRfUklORyhjaGFuLCBmZyk7CisJT1VUX1JJTkcoY2hhbiwgKGltYWdlLT5oZWlnaHQgPDwgMTYpIHwgaW1hZ2UtPndpZHRoKTsKKwlPVVRfUklORyhjaGFuLCAoaW1hZ2UtPmhlaWdodCA8PCAxNikgfCB3aWR0aCk7CisJT1VUX1JJTkcoY2hhbiwgKGltYWdlLT5keSA8PCAxNikgfCAoaW1hZ2UtPmR4ICYgMHhmZmZmKSk7CisKKwl3aGlsZSAoZHNpemUpIHsKKwkJaW50IGl0ZXJfbGVuID0gZHNpemUgPiAxMjggPyAxMjggOiBkc2l6ZTsKKworCQlpZiAoUklOR19TUEFDRShjaGFuLCBpdGVyX2xlbiArIDEpKSB7CisJCQlOVl9FUlJPUihkZXYsICJHUFUgbG9ja3VwIC0gc3dpdGNoaW5nIHRvIHNvZnR3YXJlIGZiY29uXG4iKTsKKwkJCWluZm8tPmZsYWdzIHw9IEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEOworCQkJY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJCQlyZXR1cm47CisJCX0KKworCQlCRUdJTl9SSU5HKGNoYW4sIE52U3ViR2RpUmVjdCwgMHgwYzAwLCBpdGVyX2xlbik7CisJCU9VVF9SSU5HcChjaGFuLCBkYXRhLCBpdGVyX2xlbik7CisJCWRhdGEgKz0gaXRlcl9sZW47CisJCWRzaXplIC09IGl0ZXJfbGVuOworCX0KKworCUZJUkVfUklORyhjaGFuKTsKK30KKworc3RhdGljIGludAorbnYwNF9mYmNvbl9ncm9ial9uZXcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNsYXNzLCB1aW50MzJfdCBoYW5kbGUpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKm9iaiA9IE5VTEw7CisJaW50IHJldDsKKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2dyX25ldyhkZXZfcHJpdi0+Y2hhbm5lbCwgY2xhc3MsICZvYmopOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9yZWZfYWRkKGRldiwgZGV2X3ByaXYtPmNoYW5uZWwsIGhhbmRsZSwgb2JqLCBOVUxMKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK2ludAorbnYwNF9mYmNvbl9hY2NlbF9pbml0KHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBub3V2ZWF1X2ZiY29uX3BhciAqcGFyID0gaW5mby0+cGFyOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwYXItPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Y2hhbm5lbDsKKwlpbnQgc3VyZmFjZV9mbXQsIHBhdHRlcm5fZm10LCByZWN0X2ZtdDsKKwlpbnQgcmV0OworCisJc3dpdGNoIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKKwljYXNlIDg6CisJCXN1cmZhY2VfZm10ID0gMTsKKwkJcGF0dGVybl9mbXQgPSAzOworCQlyZWN0X2ZtdCA9IDM7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCXN1cmZhY2VfZm10ID0gNDsKKwkJcGF0dGVybl9mbXQgPSAxOworCQlyZWN0X2ZtdCA9IDE7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCXN3aXRjaCAoaW5mby0+dmFyLnRyYW5zcC5sZW5ndGgpIHsKKwkJY2FzZSAwOiAvKiBkZXB0aCAyNCAqLworCQljYXNlIDg6IC8qIGRlcHRoIDMyICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJc3VyZmFjZV9mbXQgPSA2OworCQlwYXR0ZXJuX2ZtdCA9IDM7CisJCXJlY3RfZm10ID0gMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gbnYwNF9mYmNvbl9ncm9ial9uZXcoZGV2LCBkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzEwID8KKwkJCQkgICAweDAwNjIgOiAweDAwNDIsIE52Q3R4U3VyZjJEKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbnYwNF9mYmNvbl9ncm9ial9uZXcoZGV2LCAweDAwMTksIE52Q2xpcFJlY3QpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBudjA0X2ZiY29uX2dyb2JqX25ldyhkZXYsIDB4MDA0MywgTnZSb3ApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBudjA0X2ZiY29uX2dyb2JqX25ldyhkZXYsIDB4MDA0NCwgTnZJbWFnZVBhdHQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBudjA0X2ZiY29uX2dyb2JqX25ldyhkZXYsIDB4MDA0YSwgTnZHZGlSZWN0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbnYwNF9mYmNvbl9ncm9ial9uZXcoZGV2LCBkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzEwID8KKwkJCQkgICAweDAwOWYgOiAweDAwNWYsIE52SW1hZ2VCbGl0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKFJJTkdfU1BBQ0UoY2hhbiwgNDkpKSB7CisJCU5WX0VSUk9SKGRldiwgIkdQVSBsb2NrdXAgLSBzd2l0Y2hpbmcgdG8gc29mdHdhcmUgZmJjb25cbiIpOworCQlpbmZvLT5mbGFncyB8PSBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRDsKKwkJcmV0dXJuIDA7CisJfQorCisJQkVHSU5fUklORyhjaGFuLCAxLCAweDAwMDAsIDEpOworCU9VVF9SSU5HKGNoYW4sIE52Q3R4U3VyZjJEKTsKKwlCRUdJTl9SSU5HKGNoYW4sIDEsIDB4MDE4NCwgMik7CisJT1VUX1JJTkcoY2hhbiwgTnZEbWFGQik7CisJT1VUX1JJTkcoY2hhbiwgTnZEbWFGQik7CisJQkVHSU5fUklORyhjaGFuLCAxLCAweDAzMDAsIDQpOworCU9VVF9SSU5HKGNoYW4sIHN1cmZhY2VfZm10KTsKKwlPVVRfUklORyhjaGFuLCBpbmZvLT5maXgubGluZV9sZW5ndGggfCAoaW5mby0+Zml4LmxpbmVfbGVuZ3RoIDw8IDE2KSk7CisJT1VUX1JJTkcoY2hhbiwgaW5mby0+Zml4LnNtZW1fc3RhcnQgLSBkZXYtPm1vZGVfY29uZmlnLmZiX2Jhc2UpOworCU9VVF9SSU5HKGNoYW4sIGluZm8tPmZpeC5zbWVtX3N0YXJ0IC0gZGV2LT5tb2RlX2NvbmZpZy5mYl9iYXNlKTsKKworCUJFR0lOX1JJTkcoY2hhbiwgMSwgMHgwMDAwLCAxKTsKKwlPVVRfUklORyhjaGFuLCBOdlJvcCk7CisJQkVHSU5fUklORyhjaGFuLCAxLCAweDAzMDAsIDEpOworCU9VVF9SSU5HKGNoYW4sIDB4NTUpOworCisJQkVHSU5fUklORyhjaGFuLCAxLCAweDAwMDAsIDEpOworCU9VVF9SSU5HKGNoYW4sIE52SW1hZ2VQYXR0KTsKKwlCRUdJTl9SSU5HKGNoYW4sIDEsIDB4MDMwMCwgOCk7CisJT1VUX1JJTkcoY2hhbiwgcGF0dGVybl9mbXQpOworI2lmZGVmIF9fQklHX0VORElBTgorCU9VVF9SSU5HKGNoYW4sIDIpOworI2Vsc2UKKwlPVVRfUklORyhjaGFuLCAxKTsKKyNlbmRpZgorCU9VVF9SSU5HKGNoYW4sIDApOworCU9VVF9SSU5HKGNoYW4sIDEpOworCU9VVF9SSU5HKGNoYW4sIH4wKTsKKwlPVVRfUklORyhjaGFuLCB+MCk7CisJT1VUX1JJTkcoY2hhbiwgfjApOworCU9VVF9SSU5HKGNoYW4sIH4wKTsKKworCUJFR0lOX1JJTkcoY2hhbiwgMSwgMHgwMDAwLCAxKTsKKwlPVVRfUklORyhjaGFuLCBOdkNsaXBSZWN0KTsKKwlCRUdJTl9SSU5HKGNoYW4sIDEsIDB4MDMwMCwgMik7CisJT1VUX1JJTkcoY2hhbiwgMCk7CisJT1VUX1JJTkcoY2hhbiwgKGluZm8tPnZhci55cmVzX3ZpcnR1YWwgPDwgMTYpIHwgaW5mby0+dmFyLnhyZXNfdmlydHVhbCk7CisKKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViSW1hZ2VCbGl0LCAweDAwMDAsIDEpOworCU9VVF9SSU5HKGNoYW4sIE52SW1hZ2VCbGl0KTsKKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViSW1hZ2VCbGl0LCAweDAxOWMsIDEpOworCU9VVF9SSU5HKGNoYW4sIE52Q3R4U3VyZjJEKTsKKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViSW1hZ2VCbGl0LCAweDAyZmMsIDEpOworCU9VVF9SSU5HKGNoYW4sIDMpOworCisJQkVHSU5fUklORyhjaGFuLCBOdlN1YkdkaVJlY3QsIDB4MDAwMCwgMSk7CisJT1VUX1JJTkcoY2hhbiwgTnZHZGlSZWN0KTsKKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViR2RpUmVjdCwgMHgwMTk4LCAxKTsKKwlPVVRfUklORyhjaGFuLCBOdkN0eFN1cmYyRCk7CisJQkVHSU5fUklORyhjaGFuLCBOdlN1YkdkaVJlY3QsIDB4MDE4OCwgMik7CisJT1VUX1JJTkcoY2hhbiwgTnZJbWFnZVBhdHQpOworCU9VVF9SSU5HKGNoYW4sIE52Um9wKTsKKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViR2RpUmVjdCwgMHgwMzA0LCAxKTsKKwlPVVRfUklORyhjaGFuLCAxKTsKKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViR2RpUmVjdCwgMHgwMzAwLCAxKTsKKwlPVVRfUklORyhjaGFuLCByZWN0X2ZtdCk7CisJQkVHSU5fUklORyhjaGFuLCBOdlN1YkdkaVJlY3QsIDB4MDJmYywgMSk7CisJT1VUX1JJTkcoY2hhbiwgMyk7CisKKwlGSVJFX1JJTkcoY2hhbik7CisKKwlpbmZvLT5mYm9wcy0+ZmJfZmlsbHJlY3QgPSBudjA0X2ZiY29uX2ZpbGxyZWN0OworCWluZm8tPmZib3BzLT5mYl9jb3B5YXJlYSA9IG52MDRfZmJjb25fY29weWFyZWE7CisJaW5mby0+ZmJvcHMtPmZiX2ltYWdlYmxpdCA9IG52MDRfZmJjb25faW1hZ2VibGl0OworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2ZpZm8uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZmlmby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjM2NkNTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2ZpZm8uYwpAQCAtMCwwICsxLDI3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBCZW4gU2tlZ2dzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorCisjZGVmaW5lIE5WMDRfUkFNRkMoYykgKGRldl9wcml2LT5yYW1mY19vZmZzZXQgKyAoKGMpICogTlYwNF9SQU1GQ19fU0laRSkpCisjZGVmaW5lIE5WMDRfUkFNRkNfX1NJWkUgMzIKKyNkZWZpbmUgTlYwNF9SQU1GQ19ETUFfUFVUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBOVjA0X1JBTUZDX0RNQV9HRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIE5WMDRfUkFNRkNfRE1BX0lOU1RBTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgTlYwNF9SQU1GQ19ETUFfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQworI2RlZmluZSBOVjA0X1JBTUZDX0RNQV9GRVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIE5WMDRfUkFNRkNfRU5HSU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQKKyNkZWZpbmUgTlYwNF9SQU1GQ19QVUxMMV9FTkdJTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOAorCisjZGVmaW5lIFJBTUZDX1dSKG9mZnNldCwgdmFsKSBudl93bzMyKGRldiwgY2hhbi0+cmFtZmMtPmdwdW9iaiwgXAorCQkJCQkgTlYwNF9SQU1GQ18jI29mZnNldC80LCAodmFsKSkKKyNkZWZpbmUgUkFNRkNfUkQob2Zmc2V0KSAgICAgIG52X3JvMzIoZGV2LCBjaGFuLT5yYW1mYy0+Z3B1b2JqLCBcCisJCQkJCSBOVjA0X1JBTUZDXyMjb2Zmc2V0LzQpCisKK3ZvaWQKK252MDRfZmlmb19kaXNhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJdWludDMyX3QgdG1wOworCisJdG1wID0gbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9QVVNIKTsKKwludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX1BVU0gsIHRtcCAmIH4xKTsKKwludl93cjMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfUFVTSDAsIDApOworCXRtcCA9IG52X3JkMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9QVUxMMSk7CisJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX1BVTEwwLCB0bXAgJiB+MSk7Cit9CisKK3ZvaWQKK252MDRfZmlmb19lbmFibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwludl93cjMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfUFVTSDAsIDEpOworCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9QVUxMMCwgMSk7Cit9CisKK2Jvb2wKK252MDRfZmlmb19yZWFzc2lnbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBib29sIGVuYWJsZSkKK3sKKwl1aW50MzJfdCByZWFzc2lnbiA9IG52X3JkMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFUyk7CisKKwludl93cjMyKGRldiwgTlYwM19QRklGT19DQUNIRVMsIGVuYWJsZSA/IDEgOiAwKTsKKwlyZXR1cm4gKHJlYXNzaWduID09IDEpOworfQorCitpbnQKK252MDRfZmlmb19jaGFubmVsX2lkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIG52X3JkMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9QVVNIMSkgJgorCQkJTlYwM19QRklGT19DQUNIRTFfUFVTSDFfQ0hJRF9NQVNLOworfQorCitpbnQKK252MDRfZmlmb19jcmVhdGVfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgcmV0OworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3X2Zha2UoZGV2LCBOVjA0X1JBTUZDKGNoYW4tPmlkKSwgfjAsCisJCQkJCQlOVjA0X1JBTUZDX19TSVpFLAorCQkJCQkJTlZPQkpfRkxBR19aRVJPX0FMTE9DIHwKKwkJCQkJCU5WT0JKX0ZMQUdfWkVST19GUkVFLAorCQkJCQkJTlVMTCwgJmNoYW4tPnJhbWZjKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogU2V0dXAgaW5pdGlhbCBzdGF0ZSAqLworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOworCVJBTUZDX1dSKERNQV9QVVQsIGNoYW4tPnB1c2hidWZfYmFzZSk7CisJUkFNRkNfV1IoRE1BX0dFVCwgY2hhbi0+cHVzaGJ1Zl9iYXNlKTsKKwlSQU1GQ19XUihETUFfSU5TVEFOQ0UsIGNoYW4tPnB1c2hidWYtPmluc3RhbmNlID4+IDQpOworCVJBTUZDX1dSKERNQV9GRVRDSCwgKE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfVFJJR18xMjhfQllURVMgfAorCQkJICAgICBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1NJWkVfMTI4X0JZVEVTIHwKKwkJCSAgICAgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9NQVhfUkVRU184IHwKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkJCSAgICAgTlZfUEZJRk9fQ0FDSEUxX0JJR19FTkRJQU4gfAorI2VuZGlmCisJCQkgICAgIDApKTsKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCisJLyogZW5hYmxlIHRoZSBmaWZvIGRtYSBvcGVyYXRpb24gKi8KKwludl93cjMyKGRldiwgTlYwNF9QRklGT19NT0RFLAorCQludl9yZDMyKGRldiwgTlYwNF9QRklGT19NT0RFKSB8ICgxIDw8IGNoYW4tPmlkKSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK252MDRfZmlmb19kZXN0cm95X2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCisJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fTU9ERSwKKwkJbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fTU9ERSkgJiB+KDEgPDwgY2hhbi0+aWQpKTsKKworCW5vdXZlYXVfZ3B1b2JqX3JlZl9kZWwoZGV2LCAmY2hhbi0+cmFtZmMpOworfQorCitzdGF0aWMgdm9pZAorbnYwNF9maWZvX2RvX2xvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY2hpZCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IGZjID0gTlYwNF9SQU1GQyhjaGlkKSwgdG1wOworCisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgZmFsc2UpOworCisJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9QVVQsIG52X3JpMzIoZGV2LCBmYyArIDApKTsKKwludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0dFVCwgbnZfcmkzMihkZXYsIGZjICsgNCkpOworCXRtcCA9IG52X3JpMzIoZGV2LCBmYyArIDgpOworCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfSU5TVEFOQ0UsIHRtcCAmIDB4RkZGRik7CisJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9EQ09VTlQsIHRtcCA+PiAxNik7CisJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9TVEFURSwgbnZfcmkzMihkZXYsIGZjICsgMTIpKTsKKwludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0ZFVENILCBudl9yaTMyKGRldiwgZmMgKyAxNikpOworCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9FTkdJTkUsIG52X3JpMzIoZGV2LCBmYyArIDIwKSk7CisJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX1BVTEwxLCBudl9yaTMyKGRldiwgZmMgKyAyNCkpOworCisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKKworCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9HRVQsIDApOworCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9QVVQsIDApOworfQorCitpbnQKK252MDRfZmlmb19sb2FkX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwl1aW50MzJfdCB0bXA7CisKKwludl93cjMyKGNoYW4tPmRldiwgTlYwM19QRklGT19DQUNIRTFfUFVTSDEsCisJCQkgICBOVjAzX1BGSUZPX0NBQ0hFMV9QVVNIMV9ETUEgfCBjaGFuLT5pZCk7CisJbnYwNF9maWZvX2RvX2xvYWRfY29udGV4dChjaGFuLT5kZXYsIGNoYW4tPmlkKTsKKwludl93cjMyKGNoYW4tPmRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX1BVU0gsIDEpOworCisJLyogUmVzZXQgTlYwNF9QRklGT19DQUNIRTFfRE1BX0NUTF9BVF9JTkZPIHRvIElOVkFMSUQgKi8KKwl0bXAgPSBudl9yZDMyKGNoYW4tPmRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0NUTCkgJiB+KDEgPDwgMzEpOworCW52X3dyMzIoY2hhbi0+ZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfQ1RMLCB0bXApOworCisJcmV0dXJuIDA7Cit9CisKK2ludAorbnYwNF9maWZvX3VubG9hZF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9maWZvX2VuZ2luZSAqcGZpZm8gPSAmZGV2X3ByaXYtPmVuZ2luZS5maWZvOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBOVUxMOworCXVpbnQzMl90IHRtcDsKKwlpbnQgY2hpZDsKKworCWNoaWQgPSBwZmlmby0+Y2hhbm5lbF9pZChkZXYpOworCWlmIChjaGlkIDwgMCB8fCBjaGlkID49IGRldl9wcml2LT5lbmdpbmUuZmlmby5jaGFubmVscykKKwkJcmV0dXJuIDA7CisKKwljaGFuID0gZGV2X3ByaXYtPmZpZm9zW2NoaWRdOworCWlmICghY2hhbikgeworCQlOVl9FUlJPUihkZXYsICJJbmFjdGl2ZSBjaGFubmVsIG9uIFBGSUZPOiAlZFxuIiwgY2hpZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOworCVJBTUZDX1dSKERNQV9QVVQsIG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfUFVUKSk7CisJUkFNRkNfV1IoRE1BX0dFVCwgbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9HRVQpKTsKKwl0bXAgID0gbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9EQ09VTlQpIDw8IDE2OworCXRtcCB8PSBudl9yZDMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0lOU1RBTkNFKTsKKwlSQU1GQ19XUihETUFfSU5TVEFOQ0UsIHRtcCk7CisJUkFNRkNfV1IoRE1BX1NUQVRFLCBudl9yZDMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX1NUQVRFKSk7CisJUkFNRkNfV1IoRE1BX0ZFVENILCBudl9yZDMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0ZFVENIKSk7CisJUkFNRkNfV1IoRU5HSU5FLCBudl9yZDMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRU5HSU5FKSk7CisJUkFNRkNfV1IoUFVMTDFfRU5HSU5FLCBudl9yZDMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfUFVMTDEpKTsKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCisJbnYwNF9maWZvX2RvX2xvYWRfY29udGV4dChkZXYsIHBmaWZvLT5jaGFubmVscyAtIDEpOworCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9QVVNIMSwgcGZpZm8tPmNoYW5uZWxzIC0gMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitudjA0X2ZpZm9faW5pdF9yZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUsCisJCW52X3JkMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUpICYgfk5WX1BNQ19FTkFCTEVfUEZJRk8pOworCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUsCisJCW52X3JkMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUpIHwgIE5WX1BNQ19FTkFCTEVfUEZJRk8pOworCisJbnZfd3IzMihkZXYsIDB4MDAzMjI0LCAweDAwMGYwMDc4KTsKKwludl93cjMyKGRldiwgMHgwMDIwNDQsIDB4MDEwMWZmZmYpOworCW52X3dyMzIoZGV2LCAweDAwMjA0MCwgMHgwMDAwMDBmZik7CisJbnZfd3IzMihkZXYsIDB4MDAyNTAwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHgwMDMwMDAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDAwMzA1MCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4MDAzMjAwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHgwMDMyNTAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDAwMzIyMCwgMHgwMDAwMDAwMCk7CisKKwludl93cjMyKGRldiwgMHgwMDMyNTAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDAwMzI3MCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4MDAzMjEwLCAweDAwMDAwMDAwKTsKK30KKworc3RhdGljIHZvaWQKK252MDRfZmlmb19pbml0X3JhbXh4KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX1JBTUhULCAoMHgwMyA8PCAyNCkgLyogc2VhcmNoIDEyOCAqLyB8CisJCQkJICAgICAgICgoZGV2X3ByaXYtPnJhbWh0X2JpdHMgLSA5KSA8PCAxNikgfAorCQkJCSAgICAgICAoZGV2X3ByaXYtPnJhbWh0X29mZnNldCA+PiA4KSk7CisJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fUkFNUk8sIGRldl9wcml2LT5yYW1yb19vZmZzZXQ+PjgpOworCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX1JBTUZDLCBkZXZfcHJpdi0+cmFtZmNfb2Zmc2V0ID4+IDgpOworfQorCitzdGF0aWMgdm9pZAorbnYwNF9maWZvX2luaXRfaW50cihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCW52X3dyMzIoZGV2LCAweDAwMjEwMCwgMHhmZmZmZmZmZik7CisJbnZfd3IzMihkZXYsIDB4MDAyMTQwLCAweGZmZmZmZmZmKTsKK30KKworaW50CitudjA0X2ZpZm9faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZmlmb19lbmdpbmUgKnBmaWZvID0gJmRldl9wcml2LT5lbmdpbmUuZmlmbzsKKwlpbnQgaTsKKworCW52MDRfZmlmb19pbml0X3Jlc2V0KGRldik7CisJbnYwNF9maWZvX2luaXRfcmFteHgoZGV2KTsKKworCW52MDRfZmlmb19kb19sb2FkX2NvbnRleHQoZGV2LCBwZmlmby0+Y2hhbm5lbHMgLSAxKTsKKwludl93cjMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfUFVTSDEsIHBmaWZvLT5jaGFubmVscyAtIDEpOworCisJbnYwNF9maWZvX2luaXRfaW50cihkZXYpOworCXBmaWZvLT5lbmFibGUoZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHM7IGkrKykgeworCQlpZiAoZGV2X3ByaXYtPmZpZm9zW2ldKSB7CisJCQl1aW50MzJfdCBtb2RlID0gbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fTU9ERSk7CisJCQludl93cjMyKGRldiwgTlYwNF9QRklGT19NT0RFLCBtb2RlIHwgKDEgPDwgaSkpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZ3JhcGguYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZ3JhcGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTZlZTkyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9ncmFwaC5jCkBAIC0wLDAgKzEsNTc5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDcgU3RlcGhhbmUgTWFyY2hlc2luCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKworc3RhdGljIHVpbnQzMl90IG52MDRfZ3JhcGhfY3R4X3JlZ3NbXSA9IHsKKwlOVjA0X1BHUkFQSF9DVFhfU1dJVENIMSwKKwlOVjA0X1BHUkFQSF9DVFhfU1dJVENIMiwKKwlOVjA0X1BHUkFQSF9DVFhfU1dJVENIMywKKwlOVjA0X1BHUkFQSF9DVFhfU1dJVENINCwKKwlOVjA0X1BHUkFQSF9DVFhfQ0FDSEUxLAorCU5WMDRfUEdSQVBIX0NUWF9DQUNIRTIsCisJTlYwNF9QR1JBUEhfQ1RYX0NBQ0hFMywKKwlOVjA0X1BHUkFQSF9DVFhfQ0FDSEU0LAorCTB4MDA0MDAxODQsCisJMHgwMDQwMDFhNCwKKwkweDAwNDAwMWM0LAorCTB4MDA0MDAxZTQsCisJMHgwMDQwMDE4OCwKKwkweDAwNDAwMWE4LAorCTB4MDA0MDAxYzgsCisJMHgwMDQwMDFlOCwKKwkweDAwNDAwMThjLAorCTB4MDA0MDAxYWMsCisJMHgwMDQwMDFjYywKKwkweDAwNDAwMWVjLAorCTB4MDA0MDAxOTAsCisJMHgwMDQwMDFiMCwKKwkweDAwNDAwMWQwLAorCTB4MDA0MDAxZjAsCisJMHgwMDQwMDE5NCwKKwkweDAwNDAwMWI0LAorCTB4MDA0MDAxZDQsCisJMHgwMDQwMDFmNCwKKwkweDAwNDAwMTk4LAorCTB4MDA0MDAxYjgsCisJMHgwMDQwMDFkOCwKKwkweDAwNDAwMWY4LAorCTB4MDA0MDAxOWMsCisJMHgwMDQwMDFiYywKKwkweDAwNDAwMWRjLAorCTB4MDA0MDAxZmMsCisJMHgwMDQwMDE3NCwKKwlOVjA0X1BHUkFQSF9ETUFfU1RBUlRfMCwKKwlOVjA0X1BHUkFQSF9ETUFfU1RBUlRfMSwKKwlOVjA0X1BHUkFQSF9ETUFfTEVOR1RILAorCU5WMDRfUEdSQVBIX0RNQV9NSVNDLAorCU5WMDRfUEdSQVBIX0RNQV9QSVRDSCwKKwlOVjA0X1BHUkFQSF9CT0ZGU0VUMCwKKwlOVjA0X1BHUkFQSF9CQkFTRTAsCisJTlYwNF9QR1JBUEhfQkxJTUlUMCwKKwlOVjA0X1BHUkFQSF9CT0ZGU0VUMSwKKwlOVjA0X1BHUkFQSF9CQkFTRTEsCisJTlYwNF9QR1JBUEhfQkxJTUlUMSwKKwlOVjA0X1BHUkFQSF9CT0ZGU0VUMiwKKwlOVjA0X1BHUkFQSF9CQkFTRTIsCisJTlYwNF9QR1JBUEhfQkxJTUlUMiwKKwlOVjA0X1BHUkFQSF9CT0ZGU0VUMywKKwlOVjA0X1BHUkFQSF9CQkFTRTMsCisJTlYwNF9QR1JBUEhfQkxJTUlUMywKKwlOVjA0X1BHUkFQSF9CT0ZGU0VUNCwKKwlOVjA0X1BHUkFQSF9CQkFTRTQsCisJTlYwNF9QR1JBUEhfQkxJTUlUNCwKKwlOVjA0X1BHUkFQSF9CT0ZGU0VUNSwKKwlOVjA0X1BHUkFQSF9CQkFTRTUsCisJTlYwNF9QR1JBUEhfQkxJTUlUNSwKKwlOVjA0X1BHUkFQSF9CUElUQ0gwLAorCU5WMDRfUEdSQVBIX0JQSVRDSDEsCisJTlYwNF9QR1JBUEhfQlBJVENIMiwKKwlOVjA0X1BHUkFQSF9CUElUQ0gzLAorCU5WMDRfUEdSQVBIX0JQSVRDSDQsCisJTlYwNF9QR1JBUEhfU1VSRkFDRSwKKwlOVjA0X1BHUkFQSF9TVEFURSwKKwlOVjA0X1BHUkFQSF9CU1dJWlpMRTIsCisJTlYwNF9QR1JBUEhfQlNXSVpaTEU1LAorCU5WMDRfUEdSQVBIX0JQSVhFTCwKKwlOVjA0X1BHUkFQSF9OT1RJRlksCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUjAsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUjEsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDAwLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgwMSwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MDIsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDAzLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgwNCwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MDUsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDA2LAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgwNywKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MDgsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDA5LAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgwQSwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MEIsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDBDLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgwRCwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MEUsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDBGLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgxMCwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MTEsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDEyLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgxMywKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MTQsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDE1LAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgxNiwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MTcsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDE4LAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgxOSwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MUEsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDFCLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgxQywKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MUQsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDFFLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgxRiwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MjAsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDIxLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgyMiwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MjMsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDI0LAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgyNSwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MjYsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDI3LAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgyOCwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MjksCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDJBLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgyQiwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MkMsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDJELAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgyRSwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MkYsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDMwLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgzMSwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MzIsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDMzLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgzNCwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MzUsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDM2LAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgzNywKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4MzgsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDM5LAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgzQSwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4M0IsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDNDLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0rMHgzRCwKKwlOVjA0X1BHUkFQSF9QQVRUX0NPTE9SUkFNKzB4M0UsCisJTlYwNF9QR1JBUEhfUEFUVF9DT0xPUlJBTSsweDNGLAorCU5WMDRfUEdSQVBIX1BBVFRFUk4sCisJMHgwMDQwMDgwYywKKwlOVjA0X1BHUkFQSF9QQVRURVJOX1NIQVBFLAorCTB4MDA0MDA2MDAsCisJTlYwNF9QR1JBUEhfUk9QMywKKwlOVjA0X1BHUkFQSF9DSFJPTUEsCisJTlYwNF9QR1JBUEhfQkVUQV9BTkQsCisJTlYwNF9QR1JBUEhfQkVUQV9QUkVNVUxULAorCU5WMDRfUEdSQVBIX0NPTlRST0wwLAorCU5WMDRfUEdSQVBIX0NPTlRST0wxLAorCU5WMDRfUEdSQVBIX0NPTlRST0wyLAorCU5WMDRfUEdSQVBIX0JMRU5ELAorCU5WMDRfUEdSQVBIX1NUT1JFRF9GTVQsCisJTlYwNF9QR1JBUEhfU09VUkNFX0NPTE9SLAorCTB4MDA0MDA1NjAsCisJMHgwMDQwMDU2OCwKKwkweDAwNDAwNTY0LAorCTB4MDA0MDA1NmMsCisJMHgwMDQwMDQwMCwKKwkweDAwNDAwNDgwLAorCTB4MDA0MDA0MDQsCisJMHgwMDQwMDQ4NCwKKwkweDAwNDAwNDA4LAorCTB4MDA0MDA0ODgsCisJMHgwMDQwMDQwYywKKwkweDAwNDAwNDhjLAorCTB4MDA0MDA0MTAsCisJMHgwMDQwMDQ5MCwKKwkweDAwNDAwNDE0LAorCTB4MDA0MDA0OTQsCisJMHgwMDQwMDQxOCwKKwkweDAwNDAwNDk4LAorCTB4MDA0MDA0MWMsCisJMHgwMDQwMDQ5YywKKwkweDAwNDAwNDIwLAorCTB4MDA0MDA0YTAsCisJMHgwMDQwMDQyNCwKKwkweDAwNDAwNGE0LAorCTB4MDA0MDA0MjgsCisJMHgwMDQwMDRhOCwKKwkweDAwNDAwNDJjLAorCTB4MDA0MDA0YWMsCisJMHgwMDQwMDQzMCwKKwkweDAwNDAwNGIwLAorCTB4MDA0MDA0MzQsCisJMHgwMDQwMDRiNCwKKwkweDAwNDAwNDM4LAorCTB4MDA0MDA0YjgsCisJMHgwMDQwMDQzYywKKwkweDAwNDAwNGJjLAorCTB4MDA0MDA0NDAsCisJMHgwMDQwMDRjMCwKKwkweDAwNDAwNDQ0LAorCTB4MDA0MDA0YzQsCisJMHgwMDQwMDQ0OCwKKwkweDAwNDAwNGM4LAorCTB4MDA0MDA0NGMsCisJMHgwMDQwMDRjYywKKwkweDAwNDAwNDUwLAorCTB4MDA0MDA0ZDAsCisJMHgwMDQwMDQ1NCwKKwkweDAwNDAwNGQ0LAorCTB4MDA0MDA0NTgsCisJMHgwMDQwMDRkOCwKKwkweDAwNDAwNDVjLAorCTB4MDA0MDA0ZGMsCisJMHgwMDQwMDQ2MCwKKwkweDAwNDAwNGUwLAorCTB4MDA0MDA0NjQsCisJMHgwMDQwMDRlNCwKKwkweDAwNDAwNDY4LAorCTB4MDA0MDA0ZTgsCisJMHgwMDQwMDQ2YywKKwkweDAwNDAwNGVjLAorCTB4MDA0MDA0NzAsCisJMHgwMDQwMDRmMCwKKwkweDAwNDAwNDc0LAorCTB4MDA0MDA0ZjQsCisJMHgwMDQwMDQ3OCwKKwkweDAwNDAwNGY4LAorCTB4MDA0MDA0N2MsCisJMHgwMDQwMDRmYywKKwkweDAwNDAwNTNjLAorCTB4MDA0MDA1NDQsCisJMHgwMDQwMDU0MCwKKwkweDAwNDAwNTQ4LAorCTB4MDA0MDA1NjAsCisJMHgwMDQwMDU2OCwKKwkweDAwNDAwNTY0LAorCTB4MDA0MDA1NmMsCisJMHgwMDQwMDUzNCwKKwkweDAwNDAwNTM4LAorCTB4MDA0MDA1MTQsCisJMHgwMDQwMDUxOCwKKwkweDAwNDAwNTFjLAorCTB4MDA0MDA1MjAsCisJMHgwMDQwMDUyNCwKKwkweDAwNDAwNTI4LAorCTB4MDA0MDA1MmMsCisJMHgwMDQwMDUzMCwKKwkweDAwNDAwZDAwLAorCTB4MDA0MDBkNDAsCisJMHgwMDQwMGQ4MCwKKwkweDAwNDAwZDA0LAorCTB4MDA0MDBkNDQsCisJMHgwMDQwMGQ4NCwKKwkweDAwNDAwZDA4LAorCTB4MDA0MDBkNDgsCisJMHgwMDQwMGQ4OCwKKwkweDAwNDAwZDBjLAorCTB4MDA0MDBkNGMsCisJMHgwMDQwMGQ4YywKKwkweDAwNDAwZDEwLAorCTB4MDA0MDBkNTAsCisJMHgwMDQwMGQ5MCwKKwkweDAwNDAwZDE0LAorCTB4MDA0MDBkNTQsCisJMHgwMDQwMGQ5NCwKKwkweDAwNDAwZDE4LAorCTB4MDA0MDBkNTgsCisJMHgwMDQwMGQ5OCwKKwkweDAwNDAwZDFjLAorCTB4MDA0MDBkNWMsCisJMHgwMDQwMGQ5YywKKwkweDAwNDAwZDIwLAorCTB4MDA0MDBkNjAsCisJMHgwMDQwMGRhMCwKKwkweDAwNDAwZDI0LAorCTB4MDA0MDBkNjQsCisJMHgwMDQwMGRhNCwKKwkweDAwNDAwZDI4LAorCTB4MDA0MDBkNjgsCisJMHgwMDQwMGRhOCwKKwkweDAwNDAwZDJjLAorCTB4MDA0MDBkNmMsCisJMHgwMDQwMGRhYywKKwkweDAwNDAwZDMwLAorCTB4MDA0MDBkNzAsCisJMHgwMDQwMGRiMCwKKwkweDAwNDAwZDM0LAorCTB4MDA0MDBkNzQsCisJMHgwMDQwMGRiNCwKKwkweDAwNDAwZDM4LAorCTB4MDA0MDBkNzgsCisJMHgwMDQwMGRiOCwKKwkweDAwNDAwZDNjLAorCTB4MDA0MDBkN2MsCisJMHgwMDQwMGRiYywKKwkweDAwNDAwNTkwLAorCTB4MDA0MDA1OTQsCisJMHgwMDQwMDU5OCwKKwkweDAwNDAwNTljLAorCTB4MDA0MDA1YTgsCisJMHgwMDQwMDVhYywKKwkweDAwNDAwNWIwLAorCTB4MDA0MDA1YjQsCisJMHgwMDQwMDVjMCwKKwkweDAwNDAwNWM0LAorCTB4MDA0MDA1YzgsCisJMHgwMDQwMDVjYywKKwkweDAwNDAwNWQwLAorCTB4MDA0MDA1ZDQsCisJMHgwMDQwMDVkOCwKKwkweDAwNDAwNWRjLAorCTB4MDA0MDA1ZTAsCisJTlYwNF9QR1JBUEhfUEFTU1RIUlVfMCwKKwlOVjA0X1BHUkFQSF9QQVNTVEhSVV8xLAorCU5WMDRfUEdSQVBIX1BBU1NUSFJVXzIsCisJTlYwNF9QR1JBUEhfRFZEX0NPTE9SRk1ULAorCU5WMDRfUEdSQVBIX1NDQUxFRF9GT1JNQVQsCisJTlYwNF9QR1JBUEhfTUlTQzI0XzAsCisJTlYwNF9QR1JBUEhfTUlTQzI0XzEsCisJTlYwNF9QR1JBUEhfTUlTQzI0XzIsCisJMHgwMDQwMDUwMCwKKwkweDAwNDAwNTA0LAorCU5WMDRfUEdSQVBIX1ZBTElEMSwKKwlOVjA0X1BHUkFQSF9WQUxJRDIKKworCit9OworCitzdHJ1Y3QgZ3JhcGhfc3RhdGUgeworCWludCBudjA0W0FSUkFZX1NJWkUobnYwNF9ncmFwaF9jdHhfcmVncyldOworfTsKKworc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqCitudjA0X2dyYXBoX2NoYW5uZWwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBjaGlkID0gZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzOworCisJaWYgKG52X3JkMzIoZGV2LCBOVjA0X1BHUkFQSF9DVFhfQ09OVFJPTCkgJiAweDAwMDEwMDAwKQorCQljaGlkID0gbnZfcmQzMihkZXYsIE5WMDRfUEdSQVBIX0NUWF9VU0VSKSA+PiAyNDsKKworCWlmIChjaGlkID49IGRldl9wcml2LT5lbmdpbmUuZmlmby5jaGFubmVscykKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gZGV2X3ByaXYtPmZpZm9zW2NoaWRdOworfQorCit2b2lkCitudjA0X2dyYXBoX2NvbnRleHRfc3dpdGNoKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICpwZ3JhcGggPSAmZGV2X3ByaXYtPmVuZ2luZS5ncmFwaDsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gTlVMTDsKKwlpbnQgY2hpZDsKKworCXBncmFwaC0+Zmlmb19hY2Nlc3MoZGV2LCBmYWxzZSk7CisJbm91dmVhdV93YWl0X2Zvcl9pZGxlKGRldik7CisKKwkvKiBJZiBwcmV2aW91cyBjb250ZXh0IGlzIHZhbGlkLCB3ZSBuZWVkIHRvIHNhdmUgaXQgKi8KKwlwZ3JhcGgtPnVubG9hZF9jb250ZXh0KGRldik7CisKKwkvKiBMb2FkIGNvbnRleHQgZm9yIG5leHQgY2hhbm5lbCAqLworCWNoaWQgPSBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbF9pZChkZXYpOworCWNoYW4gPSBkZXZfcHJpdi0+Zmlmb3NbY2hpZF07CisJaWYgKGNoYW4pCisJCW52MDRfZ3JhcGhfbG9hZF9jb250ZXh0KGNoYW4pOworCisJcGdyYXBoLT5maWZvX2FjY2VzcyhkZXYsIHRydWUpOworfQorCitpbnQgbnYwNF9ncmFwaF9jcmVhdGVfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBncmFwaF9zdGF0ZSAqcGdyYXBoX2N0eDsKKwlOVl9ERUJVRyhjaGFuLT5kZXYsICJudjA0X2dyYXBoX2NvbnRleHRfY3JlYXRlICVkXG4iLCBjaGFuLT5pZCk7CisKKwljaGFuLT5wZ3JhcGhfY3R4ID0gcGdyYXBoX2N0eCA9IGt6YWxsb2Moc2l6ZW9mKCpwZ3JhcGhfY3R4KSwKKwkJCQkJCUdGUF9LRVJORUwpOworCWlmIChwZ3JhcGhfY3R4ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogZGV2X3ByaXYtPmZpZm9zW2NoYW5uZWxdLnBncmFwaF9jdHhfdXNlciA9IGNoYW5uZWwgPDwgMjQ7ICovCisJcGdyYXBoX2N0eC0+bnYwNFswXSA9IDB4MDAwMWZmZmY7CisJLyogaXMgaXQgcmVhbGx5IG5lZWRlZCA/Pz8gKi8KKyNpZiAwCisJZGV2X3ByaXYtPmZpZm9zW2NoYW5uZWxdLnBncmFwaF9jdHhbMV0gPQorCQkJCQludl9yZDMyKGRldiwgTlZfUEdSQVBIX0RFQlVHXzQpOworCWRldl9wcml2LT5maWZvc1tjaGFubmVsXS5wZ3JhcGhfY3R4WzJdID0KKwkJCQkJbnZfcmQzMihkZXYsIDB4MDA0MDA2YjApOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbnYwNF9ncmFwaF9kZXN0cm95X2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZ3JhcGhfc3RhdGUgKnBncmFwaF9jdHggPSBjaGFuLT5wZ3JhcGhfY3R4OworCisJa2ZyZWUocGdyYXBoX2N0eCk7CisJY2hhbi0+cGdyYXBoX2N0eCA9IE5VTEw7Cit9CisKK2ludCBudjA0X2dyYXBoX2xvYWRfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IGdyYXBoX3N0YXRlICpwZ3JhcGhfY3R4ID0gY2hhbi0+cGdyYXBoX2N0eDsKKwl1aW50MzJfdCB0bXA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShudjA0X2dyYXBoX2N0eF9yZWdzKTsgaSsrKQorCQludl93cjMyKGRldiwgbnYwNF9ncmFwaF9jdHhfcmVnc1tpXSwgcGdyYXBoX2N0eC0+bnYwNFtpXSk7CisKKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfQ1RYX0NPTlRST0wsIDB4MTAwMTAxMDApOworCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9DVFhfVVNFUiwgY2hhbi0+aWQgPDwgMjQpOworCXRtcCA9IG52X3JkMzIoZGV2LCBOVjA0X1BHUkFQSF9GRklOVEZDX1NUMik7CisJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0ZGSU5URkNfU1QyLCB0bXAgJiAweDAwMGZmZmZmKTsKKwlyZXR1cm4gMDsKK30KKworaW50CitudjA0X2dyYXBoX3VubG9hZF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICpwZ3JhcGggPSAmZGV2X3ByaXYtPmVuZ2luZS5ncmFwaDsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gTlVMTDsKKwlzdHJ1Y3QgZ3JhcGhfc3RhdGUgKmN0eDsKKwl1aW50MzJfdCB0bXA7CisJaW50IGk7CisKKwljaGFuID0gcGdyYXBoLT5jaGFubmVsKGRldik7CisJaWYgKCFjaGFuKQorCQlyZXR1cm4gMDsKKwljdHggPSBjaGFuLT5wZ3JhcGhfY3R4OworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobnYwNF9ncmFwaF9jdHhfcmVncyk7IGkrKykKKwkJY3R4LT5udjA0W2ldID0gbnZfcmQzMihkZXYsIG52MDRfZ3JhcGhfY3R4X3JlZ3NbaV0pOworCisJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0NUWF9DT05UUk9MLCAweDEwMDAwMDAwKTsKKwl0bXAgID0gbnZfcmQzMihkZXYsIE5WMDRfUEdSQVBIX0NUWF9VU0VSKSAmIDB4MDBmZmZmZmY7CisJdG1wIHw9IChkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHMgLSAxKSA8PCAyNDsKKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfQ1RYX1VTRVIsIHRtcCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBudjA0X2dyYXBoX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IHRtcDsKKworCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUsIG52X3JkMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUpICYKKwkJCX5OVl9QTUNfRU5BQkxFX1BHUkFQSCk7CisJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSwgbnZfcmQzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSkgfAorCQkJIE5WX1BNQ19FTkFCTEVfUEdSQVBIKTsKKworCS8qIEVuYWJsZSBQR1JBUEggaW50ZXJydXB0cyAqLworCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSLCAweEZGRkZGRkZGKTsKKwludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUl9FTiwgMHhGRkZGRkZGRik7CisKKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfVkFMSUQxLCAwKTsKKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfVkFMSUQyLCAwKTsKKwkvKm52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9ERUJVR18wLCAweDAwMDAwMUZGKTsKKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfREVCVUdfMCwgMHgwMDFGRkZGRik7Ki8KKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfREVCVUdfMCwgMHgxMjMxYzAwMCk7CisJLyoxMjMxQzAwMCBibG9iLCAwMDEgaGFpa3UqLworCS8vKlZfV1JJVEUoTlYwNF9QR1JBUEhfREVCVUdfMSwgMHhmMmQ5MTEwMCk7Ki8KKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfREVCVUdfMSwgMHg3MjExMTEwMCk7CisJLyoweDcyMTExMTAwIGJsb2IgLCAwMSBoYWlrdSovCisJLypudl93cjMyKGRldiwgTlYwNF9QR1JBUEhfREVCVUdfMiwgMHgxMWQ1Zjg3MCk7Ki8KKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfREVCVUdfMiwgMHgxMWQ1ZjA3MSk7CisJLypoYWlrdSBzYW1lKi8KKworCS8qbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0RFQlVHXzMsIDB4ZmFkNGZmMzEpOyovCisJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0RFQlVHXzMsIDB4ZjBkNGZmMzEpOworCS8qaGFpa3UgYW5kIGJsb2IgMTBkNCovCisKKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfU1RBVEUgICAgICAgICwgMHhGRkZGRkZGRik7CisJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0NUWF9DT05UUk9MICAsIDB4MTAwMDAxMDApOworCXRtcCAgPSBudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfQ1RYX1VTRVIpICYgMHgwMGZmZmZmZjsKKwl0bXAgfD0gZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzIDw8IDI0OworCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9DVFhfVVNFUiwgdG1wKTsKKworCS8qIFRoZXNlIGRvbid0IGJlbG9uZyBoZXJlLCB0aGV5J3JlIHBhcnQgb2YgYSBwZXItY2hhbm5lbCBjb250ZXh0ICovCisJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX1BBVFRFUk5fU0hBUEUsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9CRVRBX0FORCAgICAgLCAweEZGRkZGRkZGKTsKKworCXJldHVybiAwOworfQorCit2b2lkIG52MDRfZ3JhcGhfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKK30KKwordm9pZAorbnYwNF9ncmFwaF9maWZvX2FjY2VzcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBib29sIGVuYWJsZWQpCit7CisJaWYgKGVuYWJsZWQpCisJCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9GSUZPLAorCQkJCQludl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfRklGTykgfCAxKTsKKwllbHNlCisJCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9GSUZPLAorCQkJCQludl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfRklGTykgJiB+MSk7Cit9CisKK3N0YXRpYyBpbnQKK252MDRfZ3JhcGhfbXRoZF9zZXRfcmVmKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBncmNsYXNzLAorCQkJaW50IG10aGQsIHVpbnQzMl90IGRhdGEpCit7CisJY2hhbi0+ZmVuY2UubGFzdF9zZXF1ZW5jZV9pcnEgPSBkYXRhOworCW5vdXZlYXVfZmVuY2VfaGFuZGxlcihjaGFuLT5kZXYsIGNoYW4tPmlkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnYwNF9ncmFwaF9tdGhkX3NldF9vcGVyYXRpb24oc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGdyY2xhc3MsCisJCQkgICAgICBpbnQgbXRoZCwgdWludDMyX3QgZGF0YSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXVpbnQzMl90IGluc3RhbmNlID0gbnZfcmQzMihkZXYsIE5WMDRfUEdSQVBIX0NUWF9TV0lUQ0g0KSAmIDB4ZmZmZjsKKwlpbnQgc3ViYyA9IChudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfVFJBUFBFRF9BRERSKSA+PiAxMykgJiAweDc7CisJdWludDMyX3QgdG1wOworCisJdG1wICA9IG52X3JpMzIoZGV2LCBpbnN0YW5jZSk7CisJdG1wICY9IH4weDAwMDM4MDAwOworCXRtcCB8PSAoKGRhdGEgJiA3KSA8PCAxNSk7CisKKwludl93aTMyKGRldiwgaW5zdGFuY2UsIHRtcCk7CisJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0NUWF9TV0lUQ0gxLCB0bXApOworCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9DVFhfQ0FDSEUxICsgc3ViYywgdG1wKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfbWV0aG9kIG52MDRfZ3JhcGhfbXRoZHNfbTJtZltdID0geworCXsgMHgwMTUwLCBudjA0X2dyYXBoX210aGRfc2V0X3JlZiB9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9tZXRob2QgbnYwNF9ncmFwaF9tdGhkc19zZXRfb3BlcmF0aW9uW10gPSB7CisJeyAweDAyZmMsIG52MDRfZ3JhcGhfbXRoZF9zZXRfb3BlcmF0aW9uIH0sCisJe30sCit9OworCitzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X2NsYXNzIG52MDRfZ3JhcGhfZ3JjbGFzc1tdID0geworCXsgMHgwMDM5LCBmYWxzZSwgbnYwNF9ncmFwaF9tdGhkc19tMm1mIH0sCisJeyAweDAwNGEsIGZhbHNlLCBudjA0X2dyYXBoX210aGRzX3NldF9vcGVyYXRpb24gfSwgLyogZ2RpcmVjdCAqLworCXsgMHgwMDVmLCBmYWxzZSwgbnYwNF9ncmFwaF9tdGhkc19zZXRfb3BlcmF0aW9uIH0sIC8qIGltYWdlYmxpdCAqLworCXsgMHgwMDYxLCBmYWxzZSwgbnYwNF9ncmFwaF9tdGhkc19zZXRfb3BlcmF0aW9uIH0sIC8qIGlmYyAqLworCXsgMHgwMDc3LCBmYWxzZSwgbnYwNF9ncmFwaF9tdGhkc19zZXRfb3BlcmF0aW9uIH0sIC8qIHNpZm0gKi8KKwl7IDB4MDAzMCwgZmFsc2UsIE5VTEwgfSwgLyogbnVsbCAqLworCXsgMHgwMDQyLCBmYWxzZSwgTlVMTCB9LCAvKiBzdXJmMmQgKi8KKwl7IDB4MDA0MywgZmFsc2UsIE5VTEwgfSwgLyogcm9wICovCisJeyAweDAwMTIsIGZhbHNlLCBOVUxMIH0sIC8qIGJldGExICovCisJeyAweDAwNzIsIGZhbHNlLCBOVUxMIH0sIC8qIGJldGE0ICovCisJeyAweDAwMTksIGZhbHNlLCBOVUxMIH0sIC8qIGNsaXByZWN0ICovCisJeyAweDAwNDQsIGZhbHNlLCBOVUxMIH0sIC8qIHBhdHRlcm4gKi8KKwl7IDB4MDA1MiwgZmFsc2UsIE5VTEwgfSwgLyogc3d6c3VyZiAqLworCXsgMHgwMDUzLCBmYWxzZSwgTlVMTCB9LCAvKiBzdXJmM2QgKi8KKwl7IDB4MDA1NCwgZmFsc2UsIE5VTEwgfSwgLyogdGV4X3RyaSAqLworCXsgMHgwMDU1LCBmYWxzZSwgTlVMTCB9LCAvKiBtdWx0aXRleF90cmkgKi8KKwl7fQorfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9pbnN0bWVtLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2luc3RtZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjBjMjA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9pbnN0bWVtLmMKQEAgLTAsMCArMSwyMDggQEAKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKworLyogcmV0dXJucyB0aGUgc2l6ZSBvZiBmaWZvIGNvbnRleHQgKi8KK3N0YXRpYyBpbnQKK25vdXZlYXVfZmlmb19jdHhfc2l6ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHg0MCkKKwkJcmV0dXJuIDEyODsKKwllbHNlCisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID49IDB4MTcpCisJCXJldHVybiA2NDsKKworCXJldHVybiAzMjsKK30KKworc3RhdGljIHZvaWQKK252MDRfaW5zdG1lbV9kZXRlcm1pbmVfYW1vdW50KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaTsKKworCS8qIEZpZ3VyZSBvdXQgaG93IG11Y2ggaW5zdGFuY2UgbWVtb3J5IHdlIG5lZWQgKi8KKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl80MCkgeworCQkvKiBXZSdsbCB3YW50IG1vcmUgaW5zdGFuY2UgbWVtb3J5IHRoYW4gdGhpcyBvbiBzb21lIE5WNHggY2FyZHMuCisJCSAqIFRoZXJlJ3MgYSAxNk1CIGFwZXJ0dXJlIHRvIHBsYXkgd2l0aCB0aGF0IG1hcHMgb250byB0aGUgZW5kCisJCSAqIG9mIHZyYW0uICBGb3Igbm93LCBvbmx5IHJlc2VydmUgYSBzbWFsbCBwaWVjZSB1bnRpbCB3ZSBrbm93CisJCSAqIG1vcmUgYWJvdXQgd2hhdCBlYWNoIGNoaXBzZXQgcmVxdWlyZXMuCisJCSAqLworCQlzd2l0Y2ggKGRldl9wcml2LT5jaGlwc2V0ICYgMHhmMCkgeworCQljYXNlIDB4NDA6CisJCWNhc2UgMHg0NzoKKwkJY2FzZSAweDQ5OgorCQljYXNlIDB4NGI6CisJCQlkZXZfcHJpdi0+cmFtaW5fcnN2ZF92cmFtID0gKDIgKiAxMDI0ICogMTAyNCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9wcml2LT5yYW1pbl9yc3ZkX3ZyYW0gPSAoMSAqIDEwMjQgKiAxMDI0KTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJLypYWFg6IHdoYXQgKmFyZSogdGhlIGxpbWl0cyBvbiA8TlY0MCBjYXJkcz8KKwkJICovCisJCWRldl9wcml2LT5yYW1pbl9yc3ZkX3ZyYW0gPSAoNTEyICogMTAyNCk7CisJfQorCU5WX0RFQlVHKGRldiwgIlJBTUlOIHNpemU6ICVkS2lCXG4iLCBkZXZfcHJpdi0+cmFtaW5fcnN2ZF92cmFtID4+IDEwKTsKKworCS8qIENsZWFyIGFsbCBvZiBpdCwgZXhjZXB0IHRoZSBCSU9TIGltYWdlIHRoYXQncyBpbiB0aGUgZmlyc3QgNjRLaUIgKi8KKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKKwlmb3IgKGkgPSA2NCAqIDEwMjQ7IGkgPCBkZXZfcHJpdi0+cmFtaW5fcnN2ZF92cmFtOyBpICs9IDQpCisJCW52X3dpMzIoZGV2LCBpLCAweDAwMDAwMDAwKTsKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworfQorCitzdGF0aWMgdm9pZAorbnYwNF9pbnN0bWVtX2NvbmZpZ3VyZV9maXhlZF90YWJsZXMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2VuZ2luZSAqZW5naW5lID0gJmRldl9wcml2LT5lbmdpbmU7CisKKwkvKiBGSUZPIGhhc2ggdGFibGUgKFJBTUhUKQorCSAqICAgdXNlIDRrIGhhc2ggdGFibGUgYXQgUkFNSU4rMHgxMDAwMAorCSAqICAgVE9ETzogZXh0ZW5kIHRoZSBoYXNoIHRhYmxlCisJICovCisJZGV2X3ByaXYtPnJhbWh0X29mZnNldCA9IDB4MTAwMDA7CisJZGV2X3ByaXYtPnJhbWh0X2JpdHMgICA9IDk7CisJZGV2X3ByaXYtPnJhbWh0X3NpemUgICA9ICgxIDw8IGRldl9wcml2LT5yYW1odF9iaXRzKTsgLyogbnIgZW50cmllcyAqLworCWRldl9wcml2LT5yYW1odF9zaXplICAqPSA4OyAvKiAyIDMyLWJpdCB2YWx1ZXMgcGVyIGVudHJ5IGluIFJBTUhUICovCisJTlZfREVCVUcoZGV2LCAiUkFNSFQgb2Zmc2V0PTB4JXgsIHNpemU9JWRcbiIsIGRldl9wcml2LT5yYW1odF9vZmZzZXQsCisJCQkJCQkgICAgICBkZXZfcHJpdi0+cmFtaHRfc2l6ZSk7CisKKwkvKiBGSUZPIHJ1bm91dCB0YWJsZSAoUkFNUk8pIC0gNTEyayBhdCAweDExMjAwICovCisJZGV2X3ByaXYtPnJhbXJvX29mZnNldCA9IDB4MTEyMDA7CisJZGV2X3ByaXYtPnJhbXJvX3NpemUgICA9IDUxMjsKKwlOVl9ERUJVRyhkZXYsICJSQU1STyBvZmZzZXQ9MHgleCwgc2l6ZT0lZFxuIiwgZGV2X3ByaXYtPnJhbXJvX29mZnNldCwKKwkJCQkJCSAgICAgIGRldl9wcml2LT5yYW1yb19zaXplKTsKKworCS8qIEZJRk8gY29udGV4dCB0YWJsZSAoUkFNRkMpCisJICogICBOVjQwICA6IE5vdCBzdXJlIGV4YWN0bHkgaG93IHRvIHBvc2l0aW9uIFJBTUZDIG9uIHNvbWUgY2FyZHMsCisJICogICAgICAgICAgIDB4MzAwMDIgc2VlbXMgdG8gcG9zaXRpb24gaXQgYXQgUkFNSU4rMHgyMDAwMCBvbiB0aGVzZQorCSAqICAgICAgICAgICBjYXJkcy4gIFJBTUZDIGlzIDRrYiAoMzIgZmlmb3MsIDEyOGJ5dGUgZW50cmllcykuCisJICogICBPdGhlcnM6IFBvc2l0aW9uIFJBTUZDIGF0IFJBTUlOKzB4MTE0MDAKKwkgKi8KKwlkZXZfcHJpdi0+cmFtZmNfc2l6ZSA9IGVuZ2luZS0+Zmlmby5jaGFubmVscyAqCisJCQkJCQlub3V2ZWF1X2ZpZm9fY3R4X3NpemUoZGV2KTsKKwlzd2l0Y2ggKGRldl9wcml2LT5jYXJkX3R5cGUpIHsKKwljYXNlIE5WXzQwOgorCQlkZXZfcHJpdi0+cmFtZmNfb2Zmc2V0ID0gMHgyMDAwMDsKKwkJYnJlYWs7CisJY2FzZSBOVl8zMDoKKwljYXNlIE5WXzIwOgorCWNhc2UgTlZfMTA6CisJY2FzZSBOVl8wNDoKKwlkZWZhdWx0OgorCQlkZXZfcHJpdi0+cmFtZmNfb2Zmc2V0ID0gMHgxMTQwMDsKKwkJYnJlYWs7CisJfQorCU5WX0RFQlVHKGRldiwgIlJBTUZDIG9mZnNldD0weCV4LCBzaXplPSVkXG4iLCBkZXZfcHJpdi0+cmFtZmNfb2Zmc2V0LAorCQkJCQkJICAgICAgZGV2X3ByaXYtPnJhbWZjX3NpemUpOworfQorCitpbnQgbnYwNF9pbnN0bWVtX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IG9mZnNldDsKKwlpbnQgcmV0ID0gMDsKKworCW52MDRfaW5zdG1lbV9kZXRlcm1pbmVfYW1vdW50KGRldik7CisJbnYwNF9pbnN0bWVtX2NvbmZpZ3VyZV9maXhlZF90YWJsZXMoZGV2KTsKKworCS8qIENyZWF0ZSBhIGhlYXAgdG8gbWFuYWdlIFJBTUlOIGFsbG9jYXRpb25zLCB3ZSBkb24ndCBhbGxvY2F0ZQorCSAqIHRoZSBzcGFjZSB0aGF0IHdhcyByZXNlcnZlZCBmb3IgUkFNSFQvRkMvUk8uCisJICovCisJb2Zmc2V0ID0gZGV2X3ByaXYtPnJhbWZjX29mZnNldCArIGRldl9wcml2LT5yYW1mY19zaXplOworCisJLyogSXQgYXBwZWFycyBSQU1STyAob3Igc29tZXRoaW5nPykgaXMgY29udHJvbGxlZCBieSAweDIyMjAvMHgyMjMwCisJICogb24gY2VydGFpbiBOVjR4IGNoaXBzZXRzIGFzIHdlbGwgYXMgUkFNRkMuICBXaGVuIDB4MjIzMCA9PSAwCisJICogKCJuZXcgc3R5bGUiIGNvbnRyb2wpIHRoZSB1cHBlciAxNi1iaXRzIG9mIDB4MjIyMCBwb2ludHMgYXQgdGhpcworCSAqIG90aGVyIG15c3RlcmlvdXMgdGFibGUgdGhhdCdzIGNsb2JiZXJpbmcgaW1wb3J0YW50IHRoaW5ncy4KKwkgKgorCSAqIFdlJ3JlIG5vdyBwb2ludGluZyB0aGlzIGF0IFJBTUlOKzB4MzAwMDAgdG8gYXZvaWQgUkFNRkMgZ2V0dGluZworCSAqIHNtYXNoZWQgdG8gcGllY2VzIG9uIHVzLCBzbyByZXNlcnZlIDB4MzAwMDAtMHg0MDAwMCB0b28uLgorCSAqLworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzQwKSB7CisJCWlmIChvZmZzZXQgPCAweDQwMDAwKQorCQkJb2Zmc2V0ID0gMHg0MDAwMDsKKwl9CisKKwlyZXQgPSBub3V2ZWF1X21lbV9pbml0X2hlYXAoJmRldl9wcml2LT5yYW1pbl9oZWFwLAorCQkJCSAgICBvZmZzZXQsIGRldl9wcml2LT5yYW1pbl9yc3ZkX3ZyYW0gLSBvZmZzZXQpOworCWlmIChyZXQpIHsKKwkJZGV2X3ByaXYtPnJhbWluX2hlYXAgPSBOVUxMOworCQlOVl9FUlJPUihkZXYsICJGYWlsZWQgdG8gaW5pdCBSQU1JTiBoZWFwXG4iKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkCitudjA0X2luc3RtZW1fdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKK30KKworaW50CitudjA0X2luc3RtZW1fcG9wdWxhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmosIHVpbnQzMl90ICpzeikKK3sKKwlpZiAoZ3B1b2JqLT5pbV9iYWNraW5nKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCit2b2lkCitudjA0X2luc3RtZW1fY2xlYXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmopCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChncHVvYmogJiYgZ3B1b2JqLT5pbV9iYWNraW5nKSB7CisJCWlmIChncHVvYmotPmltX2JvdW5kKQorCQkJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnVuYmluZChkZXYsIGdwdW9iaik7CisJCWdwdW9iai0+aW1fYmFja2luZyA9IE5VTEw7CisJfQorfQorCitpbnQKK252MDRfaW5zdG1lbV9iaW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqKQoreworCWlmICghZ3B1b2JqLT5pbV9wcmFtaW4gfHwgZ3B1b2JqLT5pbV9ib3VuZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlncHVvYmotPmltX2JvdW5kID0gMTsKKwlyZXR1cm4gMDsKK30KKworaW50CitudjA0X2luc3RtZW1fdW5iaW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqKQoreworCWlmIChncHVvYmotPmltX2JvdW5kID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZ3B1b2JqLT5pbV9ib3VuZCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK252MDRfaW5zdG1lbV9wcmVwYXJlX2FjY2VzcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBib29sIHdyaXRlKQoreworfQorCit2b2lkCitudjA0X2luc3RtZW1fZmluaXNoX2FjY2VzcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworfQorCitpbnQKK252MDRfaW5zdG1lbV9zdXNwZW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK252MDRfaW5zdG1lbV9yZXN1bWUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9tYy5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9tYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxN2VkMWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X21jLmMKQEAgLTAsMCArMSwyMCBAQAorI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCisKK2ludAorbnYwNF9tY19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJLyogUG93ZXIgdXAgZXZlcnl0aGluZywgcmVzZXR0aW5nIGVhY2ggaW5kaXZpZHVhbCB1bml0IHdpbGwKKwkgKiBiZSBkb25lIGxhdGVyIGlmIG5lZWRlZC4KKwkgKi8KKworCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUsIDB4RkZGRkZGRkYpOworCXJldHVybiAwOworfQorCit2b2lkCitudjA0X21jX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X3RpbWVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X3RpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQwOWRkZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfdGltZXIuYwpAQCAtMCwwICsxLDUxIEBACisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9kcm0uaCIKKworaW50CitudjA0X3RpbWVyX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwludl93cjMyKGRldiwgTlYwNF9QVElNRVJfSU5UUl9FTl8wLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgTlYwNF9QVElNRVJfSU5UUl8wLCAweEZGRkZGRkZGKTsKKworCS8qIEp1c3QgdXNlIHRoZSBwcmUtZXhpc3RpbmcgdmFsdWVzIHdoZW4gcG9zc2libGUgZm9yIG5vdzsgdGhlc2UgcmVncworCSAqIGFyZSBub3Qgd3JpdHRlbiBpbiBudiAoZHJpdmVyIHdyaXRlciBtaXNzZWQgYSAvNCBvbiB0aGUgYWRkcmVzcyksIGFuZAorCSAqIHdyaXRpbmcgOCBhbmQgMyB0byB0aGUgY29ycmVjdCByZWdzIGJyZWFrcyB0aGUgdGltaW5ncyBvbiB0aGUgTFZEUworCSAqIGhhcmR3YXJlIHNlcXVlbmNpbmcgbWljcm9jb2RlLgorCSAqIEEgY29ycmVjdCBzb2x1dGlvbiAoaW52b2x2aW5nIGNhbGN1bGF0aW9ucyB3aXRoIHRoZSBHUFUgUExMKSBjYW4KKwkgKiBiZSBkb25lIHdoZW4ga2VybmVsIG1vZGVzZXR0aW5nIGxhbmRzCisJICovCisJaWYgKCFudl9yZDMyKGRldiwgTlYwNF9QVElNRVJfTlVNRVJBVE9SKSB8fAorCQkJCSFudl9yZDMyKGRldiwgTlYwNF9QVElNRVJfREVOT01JTkFUT1IpKSB7CisJCW52X3dyMzIoZGV2LCBOVjA0X1BUSU1FUl9OVU1FUkFUT1IsIDB4MDAwMDAwMDgpOworCQludl93cjMyKGRldiwgTlYwNF9QVElNRVJfREVOT01JTkFUT1IsIDB4MDAwMDAwMDMpOworCX0KKworCXJldHVybiAwOworfQorCit1aW50NjRfdAorbnYwNF90aW1lcl9yZWFkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJdWludDMyX3QgbG93OworCS8qIEZyb20ga21taW8gZHVtcHMgb24gbnYyOCB0aGlzIGxvb2tzIGxpa2UgaG93IHRoZSBibG9iIGRvZXMgdGhpcy4KKwkgKiBJdCByZWFkcyB0aGUgaGlnaCBkd29yZCB0d2ljZSwgYmVmb3JlIGFuZCBhZnRlci4KKwkgKiBUaGUgb25seSBleHBsYW5hdGlvbiBzZWVtcyB0byBiZSB0aGF0IHRoZSA2NC1iaXQgdGltZXIgY291bnRlcgorCSAqIGFkdmFuY2VzIGJldHdlZW4gaGlnaCBhbmQgbG93IGR3b3JkIHJlYWRzIGFuZCBtYXkgY29ycnVwdCB0aGUKKwkgKiByZXN1bHQuIE5vdCBjb25maXJtZWQuCisJICovCisJdWludDMyX3QgaGlnaDIgPSBudl9yZDMyKGRldiwgTlYwNF9QVElNRVJfVElNRV8xKTsKKwl1aW50MzJfdCBoaWdoMTsKKwlkbyB7CisJCWhpZ2gxID0gaGlnaDI7CisJCWxvdyA9IG52X3JkMzIoZGV2LCBOVjA0X1BUSU1FUl9USU1FXzApOworCQloaWdoMiA9IG52X3JkMzIoZGV2LCBOVjA0X1BUSU1FUl9USU1FXzEpOworCX0gd2hpbGUgKGhpZ2gxICE9IGhpZ2gyKTsKKwlyZXR1cm4gKCgodWludDY0X3QpaGlnaDIpIDw8IDMyKSB8ICh1aW50NjRfdClsb3c7Cit9CisKK3ZvaWQKK252MDRfdGltZXJfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfdHYuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfdHYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzYzMDk5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF90di5jCkBAIC0wLDAgKzEsMzA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEZyYW5jaXNjbyBKZXJlei4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2VuY29kZXIuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Nvbm5lY3Rvci5oIgorI2luY2x1ZGUgIm5vdXZlYXVfY3J0Yy5oIgorI2luY2x1ZGUgIm5vdXZlYXVfaHcuaCIKKyNpbmNsdWRlICJkcm1fY3J0Y19oZWxwZXIuaCIKKworI2luY2x1ZGUgImkyYy9jaDcwMDYuaCIKKworc3RhdGljIHN0cnVjdCB7CisJc3RydWN0IGkyY19ib2FyZF9pbmZvIGJvYXJkX2luZm87CisJc3RydWN0IGRybV9lbmNvZGVyX2Z1bmNzIGZ1bmNzOworCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgaGZ1bmNzOworCXZvaWQgKnBhcmFtczsKKworfSBudjA0X3R2X2VuY29kZXJfaW5mb1tdID0geworCXsKKwkJLmJvYXJkX2luZm8gPSB7IEkyQ19CT0FSRF9JTkZPKCJjaDcwMDYiLCAweDc1KSB9LAorCQkucGFyYW1zID0gJihzdHJ1Y3QgY2g3MDA2X2VuY29kZXJfcGFyYW1zKSB7CisJCQlDSDcwMDZfRk9STUFUX1JHQjI0bTEySSwgQ0g3MDA2X0NMT0NLX01BU1RFUiwKKwkJCTAsIDAsIDAsCisJCQlDSDcwMDZfU1lOQ19TTEFWRSwgQ0g3MDA2X1NZTkNfU0VQQVJBVEVELAorCQkJQ0g3MDA2X1BPVVRfM18zViwgQ0g3MDA2X0FDVElWRV9IU1lOQworCQl9LAorCX0sCit9OworCitzdGF0aWMgYm9vbCBwcm9iZV9pMmNfYWRkcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyKQoreworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsKKwkJLmFkZHIgPSBhZGRyLAorCQkubGVuID0gMCwKKwl9OworCisJcmV0dXJuIGkyY190cmFuc2ZlcihhZGFwdGVyLCAmbXNnLCAxKSA9PSAxOworfQorCitpbnQgbnYwNF90dl9pZGVudGlmeShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaTJjX2luZGV4KQoreworCXN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICppMmM7CisJYm9vbCB3YXNfbG9ja2VkOworCWludCBpLCByZXQ7CisKKwlOVl9UUkFDRShkZXYsICJQcm9iaW5nIFRWIGVuY29kZXJzIG9uIEkyQyBidXM6ICVkXG4iLCBpMmNfaW5kZXgpOworCisJaTJjID0gbm91dmVhdV9pMmNfZmluZChkZXYsIGkyY19pbmRleCk7CisJaWYgKCFpMmMpCisJCXJldHVybiAtRU5PREVWOworCisJd2FzX2xvY2tlZCA9IE5WTG9ja1ZnYUNydGNzKGRldiwgZmFsc2UpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobnYwNF90dl9lbmNvZGVyX2luZm8pOyBpKyspIHsKKwkJaWYgKHByb2JlX2kyY19hZGRyKCZpMmMtPmFkYXB0ZXIsCisJCQkJICAgbnYwNF90dl9lbmNvZGVyX2luZm9baV0uYm9hcmRfaW5mby5hZGRyKSkgeworCQkJcmV0ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGkgPCBBUlJBWV9TSVpFKG52MDRfdHZfZW5jb2Rlcl9pbmZvKSkgeworCQlOVl9UUkFDRShkZXYsICJEZXRlY3RlZCBUViBlbmNvZGVyOiAlc1xuIiwKKwkJCSBudjA0X3R2X2VuY29kZXJfaW5mb1tpXS5ib2FyZF9pbmZvLnR5cGUpOworCisJfSBlbHNlIHsKKwkJTlZfVFJBQ0UoZGV2LCAiTm8gVFYgZW5jb2RlcnMgZm91bmQuXG4iKTsKKwkJaSA9IC1FTk9ERVY7CisJfQorCisJTlZMb2NrVmdhQ3J0Y3MoZGV2LCB3YXNfbG9ja2VkKTsKKwlyZXR1cm4gaTsKK30KKworI2RlZmluZSBQTExTRUxfVFZfQ1JUQzFfTUFTSwkJCQlcCisJKE5WX1BSQU1EQUNfUExMX0NPRUZGX1NFTEVDVF9UVl9WU0NMSzEJCVwKKwkgfCBOVl9QUkFNREFDX1BMTF9DT0VGRl9TRUxFQ1RfVFZfUENMSzEpCisjZGVmaW5lIFBMTFNFTF9UVl9DUlRDMl9NQVNLCQkJCVwKKwkoTlZfUFJBTURBQ19QTExfQ09FRkZfU0VMRUNUX1RWX1ZTQ0xLMgkJXAorCSB8IE5WX1BSQU1EQUNfUExMX0NPRUZGX1NFTEVDVF9UVl9QQ0xLMikKKworc3RhdGljIHZvaWQgbnYwNF90dl9kcG1zKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IG1vZGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52MDRfbW9kZV9zdGF0ZSAqc3RhdGUgPSAmZGV2X3ByaXYtPm1vZGVfcmVnOworCXVpbnQ4X3QgY3J0YzFBOworCisJTlZfSU5GTyhkZXYsICJTZXR0aW5nIGRwbXMgbW9kZSAlZCBvbiBUViBlbmNvZGVyIChvdXRwdXQgJWQpXG4iLAorCQltb2RlLCBudl9lbmNvZGVyLT5kY2ItPmluZGV4KTsKKworCXN0YXRlLT5wbGxzZWwgJj0gfihQTExTRUxfVFZfQ1JUQzFfTUFTSyB8IFBMTFNFTF9UVl9DUlRDMl9NQVNLKTsKKworCWlmIChtb2RlID09IERSTV9NT0RFX0RQTVNfT04pIHsKKwkJaW50IGhlYWQgPSBub3V2ZWF1X2NydGMoZW5jb2Rlci0+Y3J0YyktPmluZGV4OworCQljcnRjMUEgPSBOVlJlYWRWZ2FDcnRjKGRldiwgaGVhZCwgTlZfQ0lPX0NSRV9SUEMxX0lOREVYKTsKKworCQlzdGF0ZS0+cGxsc2VsIHw9IGhlYWQgPyBQTExTRUxfVFZfQ1JUQzJfTUFTSyA6CisJCQkJCVBMTFNFTF9UVl9DUlRDMV9NQVNLOworCisJCS8qIEluaGliaXQgaHN5bmMgKi8KKwkJY3J0YzFBIHw9IDB4ODA7CisKKwkJTlZXcml0ZVZnYUNydGMoZGV2LCBoZWFkLCBOVl9DSU9fQ1JFX1JQQzFfSU5ERVgsIGNydGMxQSk7CisJfQorCisJTlZXcml0ZVJBTURBQyhkZXYsIDAsIE5WX1BSQU1EQUNfUExMX0NPRUZGX1NFTEVDVCwgc3RhdGUtPnBsbHNlbCk7CisKKwl0b19lbmNvZGVyX3NsYXZlKGVuY29kZXIpLT5zbGF2ZV9mdW5jcy0+ZHBtcyhlbmNvZGVyLCBtb2RlKTsKK30KKworc3RhdGljIHZvaWQgbnYwNF90dl9iaW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBoZWFkLCBib29sIGJpbmQpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnYwNF9jcnRjX3JlZyAqc3RhdGUgPSAmZGV2X3ByaXYtPm1vZGVfcmVnLmNydGNfcmVnW2hlYWRdOworCisJc3RhdGUtPnR2X3NldHVwID0gMDsKKworCWlmIChiaW5kKSB7CisJCXN0YXRlLT5DUlRDW05WX0NJT19DUkVfTENEX19JTkRFWF0gPSAwOworCQlzdGF0ZS0+Q1JUQ1tOVl9DSU9fQ1JFXzQ5XSB8PSAweDEwOworCX0gZWxzZSB7CisJCXN0YXRlLT5DUlRDW05WX0NJT19DUkVfNDldICY9IH4weDEwOworCX0KKworCU5WV3JpdGVWZ2FDcnRjKGRldiwgaGVhZCwgTlZfQ0lPX0NSRV9MQ0RfX0lOREVYLAorCQkgICAgICAgc3RhdGUtPkNSVENbTlZfQ0lPX0NSRV9MQ0RfX0lOREVYXSk7CisJTlZXcml0ZVZnYUNydGMoZGV2LCBoZWFkLCBOVl9DSU9fQ1JFXzQ5LAorCQkgICAgICAgc3RhdGUtPkNSVENbTlZfQ0lPX0NSRV80OV0pOworCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX1RWX1NFVFVQLAorCQkgICAgICBzdGF0ZS0+dHZfc2V0dXApOworfQorCitzdGF0aWMgdm9pZCBudjA0X3R2X3ByZXBhcmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJaW50IGhlYWQgPSBub3V2ZWF1X2NydGMoZW5jb2Rlci0+Y3J0YyktPmluZGV4OworCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmhlbHBlciA9IGVuY29kZXItPmhlbHBlcl9wcml2YXRlOworCisJaGVscGVyLT5kcG1zKGVuY29kZXIsIERSTV9NT0RFX0RQTVNfT0ZGKTsKKworCW52MDRfZGZwX2Rpc2FibGUoZGV2LCBoZWFkKTsKKworCWlmIChudl90d29faGVhZHMoZGV2KSkKKwkJbnYwNF90dl9iaW5kKGRldiwgaGVhZCBeIDEsIGZhbHNlKTsKKworCW52MDRfdHZfYmluZChkZXYsIGhlYWQsIHRydWUpOworfQorCitzdGF0aWMgdm9pZCBudjA0X3R2X21vZGVfc2V0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCSAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGVuY29kZXItPmNydGMpOworCXN0cnVjdCBudjA0X2NydGNfcmVnICpyZWdwID0gJmRldl9wcml2LT5tb2RlX3JlZy5jcnRjX3JlZ1tudl9jcnRjLT5pbmRleF07CisKKwlyZWdwLT50dl9odG90YWwgPSBhZGp1c3RlZF9tb2RlLT5odG90YWw7CisJcmVncC0+dHZfdnRvdGFsID0gYWRqdXN0ZWRfbW9kZS0+dnRvdGFsOworCisJLyogVGhlc2UgZGVsYXkgdGhlIFRWIHNpZ25hbHMgd2l0aCByZXNwZWN0IHRvIHRoZSBWR0EgcG9ydCwKKwkgKiB0aGV5IG1pZ2h0IGJlIHVzZWZ1bCBpZiB3ZSBldmVyIGFsbG93IGEgQ1JUQyB0byBkcml2ZQorCSAqIG11bHRpcGxlIG91dHB1dHMuCisJICovCisJcmVncC0+dHZfaHNrZXcgPSAxOworCXJlZ3AtPnR2X2hzeW5jX2RlbGF5ID0gMTsKKwlyZWdwLT50dl9oc3luY19kZWxheTIgPSA2NDsKKwlyZWdwLT50dl92c2tldyA9IDE7CisJcmVncC0+dHZfdnN5bmNfZGVsYXkgPSAxOworCisJdG9fZW5jb2Rlcl9zbGF2ZShlbmNvZGVyKS0+c2xhdmVfZnVuY3MtPm1vZGVfc2V0KGVuY29kZXIsIG1vZGUsIGFkanVzdGVkX21vZGUpOworfQorCitzdGF0aWMgdm9pZCBudjA0X3R2X2NvbW1pdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoZW5jb2Rlci0+Y3J0Yyk7CisJc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyAqaGVscGVyID0gZW5jb2Rlci0+aGVscGVyX3ByaXZhdGU7CisKKwloZWxwZXItPmRwbXMoZW5jb2RlciwgRFJNX01PREVfRFBNU19PTik7CisKKwlOVl9JTkZPKGRldiwgIk91dHB1dCAlcyBpcyBydW5uaW5nIG9uIENSVEMgJWQgdXNpbmcgb3V0cHV0ICVjXG4iLAorCQkgICAgICBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKCZub3V2ZWF1X2VuY29kZXJfY29ubmVjdG9yX2dldChudl9lbmNvZGVyKS0+YmFzZSksIG52X2NydGMtPmluZGV4LAorCQkgICAgICAnQCcgKyBmZnMobnZfZW5jb2Rlci0+ZGNiLT5vcikpOworfQorCitzdGF0aWMgdm9pZCBudjA0X3R2X2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisKKwl0b19lbmNvZGVyX3NsYXZlKGVuY29kZXIpLT5zbGF2ZV9mdW5jcy0+ZGVzdHJveShlbmNvZGVyKTsKKworCWRybV9lbmNvZGVyX2NsZWFudXAoZW5jb2Rlcik7CisKKwlrZnJlZShudl9lbmNvZGVyKTsKK30KKworaW50IG52MDRfdHZfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfZW50cnkgKmVudHJ5KQoreworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXI7CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwOworCXN0cnVjdCBkcm1fZW5jb2Rlcl9mdW5jcyAqZnVuY3MgPSBOVUxMOworCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmhmdW5jcyA9IE5VTEw7CisJc3RydWN0IGRybV9lbmNvZGVyX3NsYXZlX2Z1bmNzICpzZnVuY3MgPSBOVUxMOworCWludCBpMmNfaW5kZXggPSBlbnRyeS0+aTJjX2luZGV4OworCWludCB0eXBlLCByZXQ7CisJYm9vbCB3YXNfbG9ja2VkOworCisJLyogRW5zdXJlIHRoYXQgd2UgY2FuIHRhbGsgdG8gdGhpcyBlbmNvZGVyICovCisJdHlwZSA9IG52MDRfdHZfaWRlbnRpZnkoZGV2LCBpMmNfaW5kZXgpOworCWlmICh0eXBlIDwgMCkKKwkJcmV0dXJuIHR5cGU7CisKKwkvKiBBbGxvY2F0ZSB0aGUgbmVjZXNzYXJ5IG1lbW9yeSAqLworCW52X2VuY29kZXIgPSBremFsbG9jKHNpemVvZigqbnZfZW5jb2RlciksIEdGUF9LRVJORUwpOworCWlmICghbnZfZW5jb2RlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBJbml0aWFsaXplIHRoZSBjb21tb24gbWVtYmVycyAqLworCWVuY29kZXIgPSB0b19kcm1fZW5jb2Rlcihudl9lbmNvZGVyKTsKKworCWZ1bmNzID0gJm52MDRfdHZfZW5jb2Rlcl9pbmZvW3R5cGVdLmZ1bmNzOworCWhmdW5jcyA9ICZudjA0X3R2X2VuY29kZXJfaW5mb1t0eXBlXS5oZnVuY3M7CisKKwlkcm1fZW5jb2Rlcl9pbml0KGRldiwgZW5jb2RlciwgZnVuY3MsIERSTV9NT0RFX0VOQ09ERVJfVFZEQUMpOworCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoZW5jb2RlciwgaGZ1bmNzKTsKKworCWVuY29kZXItPnBvc3NpYmxlX2NydGNzID0gZW50cnktPmhlYWRzOworCWVuY29kZXItPnBvc3NpYmxlX2Nsb25lcyA9IDA7CisKKwludl9lbmNvZGVyLT5kY2IgPSBlbnRyeTsKKwludl9lbmNvZGVyLT5vciA9IGZmcyhlbnRyeS0+b3IpIC0gMTsKKworCS8qIFJ1biB0aGUgc2xhdmUtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gKi8KKwlhZGFwID0gJmRldl9wcml2LT52Ymlvcy0+ZGNiLT5pMmNbaTJjX2luZGV4XS5jaGFuLT5hZGFwdGVyOworCisJd2FzX2xvY2tlZCA9IE5WTG9ja1ZnYUNydGNzKGRldiwgZmFsc2UpOworCisJcmV0ID0gZHJtX2kyY19lbmNvZGVyX2luaXQoZW5jb2Rlci0+ZGV2LCB0b19lbmNvZGVyX3NsYXZlKGVuY29kZXIpLCBhZGFwLAorCQkJCSAgICZudjA0X3R2X2VuY29kZXJfaW5mb1t0eXBlXS5ib2FyZF9pbmZvKTsKKworCU5WTG9ja1ZnYUNydGNzKGRldiwgd2FzX2xvY2tlZCk7CisKKwlpZiAocmV0IDwgMCkKKwkJZ290byBmYWlsOworCisJLyogRmlsbCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKwlzZnVuY3MgPSB0b19lbmNvZGVyX3NsYXZlKGVuY29kZXIpLT5zbGF2ZV9mdW5jczsKKworCSpmdW5jcyA9IChzdHJ1Y3QgZHJtX2VuY29kZXJfZnVuY3MpIHsKKwkJLmRlc3Ryb3kgPSBudjA0X3R2X2Rlc3Ryb3ksCisJfTsKKworCSpoZnVuY3MgPSAoc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcykgeworCQkuZHBtcyA9IG52MDRfdHZfZHBtcywKKwkJLnNhdmUgPSBzZnVuY3MtPnNhdmUsCisJCS5yZXN0b3JlID0gc2Z1bmNzLT5yZXN0b3JlLAorCQkubW9kZV9maXh1cCA9IHNmdW5jcy0+bW9kZV9maXh1cCwKKwkJLnByZXBhcmUgPSBudjA0X3R2X3ByZXBhcmUsCisJCS5jb21taXQgPSBudjA0X3R2X2NvbW1pdCwKKwkJLm1vZGVfc2V0ID0gbnYwNF90dl9tb2RlX3NldCwKKwkJLmRldGVjdCA9IHNmdW5jcy0+ZGV0ZWN0LAorCX07CisKKwkvKiBTZXQgdGhlIHNsYXZlIGVuY29kZXIgY29uZmlndXJhdGlvbiAqLworCXNmdW5jcy0+c2V0X2NvbmZpZyhlbmNvZGVyLCBudjA0X3R2X2VuY29kZXJfaW5mb1t0eXBlXS5wYXJhbXMpOworCisJcmV0dXJuIDA7CisKK2ZhaWw6CisJZHJtX2VuY29kZXJfY2xlYW51cChlbmNvZGVyKTsKKworCWtmcmVlKG52X2VuY29kZXIpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjEwX2ZiLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjEwX2ZiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzllMmQxMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MTBfZmIuYwpAQCAtMCwwICsxLDI0IEBACisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9kcm0uaCIKKworaW50CitudjEwX2ZiX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwl1aW50MzJfdCBmYl9iYXJfc2l6ZTsKKwlpbnQgaTsKKworCWZiX2Jhcl9zaXplID0gZHJtX2dldF9yZXNvdXJjZV9sZW4oZGV2LCAwKSAtIDE7CisJZm9yIChpID0gMDsgaSA8IE5WMTBfUEZCX1RJTEVfX1NJWkU7IGkrKykgeworCQludl93cjMyKGRldiwgTlYxMF9QRkJfVElMRShpKSwgMCk7CisJCW52X3dyMzIoZGV2LCBOVjEwX1BGQl9UTElNSVQoaSksIGZiX2Jhcl9zaXplKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbnYxMF9mYl90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxMF9maWZvLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjEwX2ZpZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWVhYmYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxMF9maWZvLmMKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQmVuIFNrZWdncy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKworI2RlZmluZSBOVjEwX1JBTUZDKGMpIChkZXZfcHJpdi0+cmFtZmNfb2Zmc2V0ICsgKChjKSAqIE5WMTBfUkFNRkNfX1NJWkUpKQorI2RlZmluZSBOVjEwX1JBTUZDX19TSVpFICgoZGV2X3ByaXYtPmNoaXBzZXQpID49IDB4MTcgPyA2NCA6IDMyKQorCitpbnQKK252MTBfZmlmb19jaGFubmVsX2lkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIG52X3JkMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9QVVNIMSkgJgorCQkJTlYxMF9QRklGT19DQUNIRTFfUFVTSDFfQ0hJRF9NQVNLOworfQorCitpbnQKK252MTBfZmlmb19jcmVhdGVfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGNoYW4tPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwl1aW50MzJfdCBmYyA9IE5WMTBfUkFNRkMoY2hhbi0+aWQpOworCWludCByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXdfZmFrZShkZXYsIE5WMTBfUkFNRkMoY2hhbi0+aWQpLCB+MCwKKwkJCQkgICAgICBOVjEwX1JBTUZDX19TSVpFLCBOVk9CSl9GTEFHX1pFUk9fQUxMT0MgfAorCQkJCSAgICAgIE5WT0JKX0ZMQUdfWkVST19GUkVFLCBOVUxMLCAmY2hhbi0+cmFtZmMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBGaWxsIGVudHJpZXMgdGhhdCBhcmUgc2VlbiBmaWxsZWQgaW4gZHVtcHMgb2YgbnZpZGlhIGRyaXZlciBqdXN0CisJICogYWZ0ZXIgY2hhbm5lbCdzIGlzIHB1dCBpbnRvIERNQSBtb2RlCisJICovCisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgdHJ1ZSk7CisJbnZfd2kzMihkZXYsIGZjICsgIDAsIGNoYW4tPnB1c2hidWZfYmFzZSk7CisJbnZfd2kzMihkZXYsIGZjICsgIDQsIGNoYW4tPnB1c2hidWZfYmFzZSk7CisJbnZfd2kzMihkZXYsIGZjICsgMTIsIGNoYW4tPnB1c2hidWYtPmluc3RhbmNlID4+IDQpOworCW52X3dpMzIoZGV2LCBmYyArIDIwLCBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1RSSUdfMTI4X0JZVEVTIHwKKwkJCSAgICAgIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfU0laRV8xMjhfQllURVMgfAorCQkJICAgICAgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9NQVhfUkVRU184IHwKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkJCSAgICAgIE5WX1BGSUZPX0NBQ0hFMV9CSUdfRU5ESUFOIHwKKyNlbmRpZgorCQkJICAgICAgMCk7CisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKKworCS8qIGVuYWJsZSB0aGUgZmlmbyBkbWEgb3BlcmF0aW9uICovCisJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fTU9ERSwKKwkJbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fTU9ERSkgfCAoMSA8PCBjaGFuLT5pZCkpOworCXJldHVybiAwOworfQorCit2b2lkCitudjEwX2ZpZm9fZGVzdHJveV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKworCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX01PREUsCisJCQludl9yZDMyKGRldiwgTlYwNF9QRklGT19NT0RFKSAmIH4oMSA8PCBjaGFuLT5pZCkpOworCisJbm91dmVhdV9ncHVvYmpfcmVmX2RlbChkZXYsICZjaGFuLT5yYW1mYyk7Cit9CisKK3N0YXRpYyB2b2lkCitudjEwX2ZpZm9fZG9fbG9hZF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjaGlkKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdWludDMyX3QgZmMgPSBOVjEwX1JBTUZDKGNoaWQpLCB0bXA7CisKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCBmYWxzZSk7CisKKwludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX1BVVCwgbnZfcmkzMihkZXYsIGZjICsgMCkpOworCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfR0VULCBudl9yaTMyKGRldiwgZmMgKyA0KSk7CisJbnZfd3IzMihkZXYsIE5WMTBfUEZJRk9fQ0FDSEUxX1JFRl9DTlQsIG52X3JpMzIoZGV2LCBmYyArIDgpKTsKKworCXRtcCA9IG52X3JpMzIoZGV2LCBmYyArIDEyKTsKKwludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0lOU1RBTkNFLCB0bXAgJiAweEZGRkYpOworCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfRENPVU5ULCB0bXAgPj4gMTYpOworCisJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9TVEFURSwgbnZfcmkzMihkZXYsIGZjICsgMTYpKTsKKwludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0ZFVENILCBudl9yaTMyKGRldiwgZmMgKyAyMCkpOworCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9FTkdJTkUsIG52X3JpMzIoZGV2LCBmYyArIDI0KSk7CisJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX1BVTEwxLCBudl9yaTMyKGRldiwgZmMgKyAyOCkpOworCisJaWYgKGRldl9wcml2LT5jaGlwc2V0IDwgMHgxNykKKwkJZ290byBvdXQ7CisKKwludl93cjMyKGRldiwgTlYxMF9QRklGT19DQUNIRTFfQUNRVUlSRV9WQUxVRSwgbnZfcmkzMihkZXYsIGZjICsgMzIpKTsKKwl0bXAgPSBudl9yaTMyKGRldiwgZmMgKyAzNik7CisJbnZfd3IzMihkZXYsIE5WMTBfUEZJRk9fQ0FDSEUxX0FDUVVJUkVfVElNRVNUQU1QLCB0bXApOworCW52X3dyMzIoZGV2LCBOVjEwX1BGSUZPX0NBQ0hFMV9BQ1FVSVJFX1RJTUVPVVQsIG52X3JpMzIoZGV2LCBmYyArIDQwKSk7CisJbnZfd3IzMihkZXYsIE5WMTBfUEZJRk9fQ0FDSEUxX1NFTUFQSE9SRSwgbnZfcmkzMihkZXYsIGZjICsgNDQpKTsKKwludl93cjMyKGRldiwgTlYxMF9QRklGT19DQUNIRTFfRE1BX1NVQlJPVVRJTkUsIG52X3JpMzIoZGV2LCBmYyArIDQ4KSk7CisKK291dDoKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCisJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX0dFVCwgMCk7CisJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX1BVVCwgMCk7Cit9CisKK2ludAorbnYxMF9maWZvX2xvYWRfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJdWludDMyX3QgdG1wOworCisJbnYxMF9maWZvX2RvX2xvYWRfY29udGV4dChkZXYsIGNoYW4tPmlkKTsKKworCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9QVVNIMSwKKwkJICAgICBOVjAzX1BGSUZPX0NBQ0hFMV9QVVNIMV9ETUEgfCBjaGFuLT5pZCk7CisJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9QVVNILCAxKTsKKworCS8qIFJlc2V0IE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9DVExfQVRfSU5GTyB0byBJTlZBTElEICovCisJdG1wID0gbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9DVEwpICYgfigxIDw8IDMxKTsKKwludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0NUTCwgdG1wKTsKKworCXJldHVybiAwOworfQorCitpbnQKK252MTBfZmlmb191bmxvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZmlmb19lbmdpbmUgKnBmaWZvID0gJmRldl9wcml2LT5lbmdpbmUuZmlmbzsKKwl1aW50MzJfdCBmYywgdG1wOworCWludCBjaGlkOworCisJY2hpZCA9IHBmaWZvLT5jaGFubmVsX2lkKGRldik7CisJaWYgKGNoaWQgPCAwIHx8IGNoaWQgPj0gZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzKQorCQlyZXR1cm4gMDsKKwlmYyA9IE5WMTBfUkFNRkMoY2hpZCk7CisKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKKworCW52X3dpMzIoZGV2LCBmYyArICAwLCBudl9yZDMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX1BVVCkpOworCW52X3dpMzIoZGV2LCBmYyArICA0LCBudl9yZDMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0dFVCkpOworCW52X3dpMzIoZGV2LCBmYyArICA4LCBudl9yZDMyKGRldiwgTlYxMF9QRklGT19DQUNIRTFfUkVGX0NOVCkpOworCXRtcCAgPSBudl9yZDMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0lOU1RBTkNFKSAmIDB4RkZGRjsKKwl0bXAgfD0gKG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfRENPVU5UKSA8PCAxNik7CisJbnZfd2kzMihkZXYsIGZjICsgMTIsIHRtcCk7CisJbnZfd2kzMihkZXYsIGZjICsgMTYsIG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfU1RBVEUpKTsKKwludl93aTMyKGRldiwgZmMgKyAyMCwgbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSCkpOworCW52X3dpMzIoZGV2LCBmYyArIDI0LCBudl9yZDMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRU5HSU5FKSk7CisJbnZfd2kzMihkZXYsIGZjICsgMjgsIG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9QVUxMMSkpOworCisJaWYgKGRldl9wcml2LT5jaGlwc2V0IDwgMHgxNykKKwkJZ290byBvdXQ7CisKKwludl93aTMyKGRldiwgZmMgKyAzMiwgbnZfcmQzMihkZXYsIE5WMTBfUEZJRk9fQ0FDSEUxX0FDUVVJUkVfVkFMVUUpKTsKKwl0bXAgPSBudl9yZDMyKGRldiwgTlYxMF9QRklGT19DQUNIRTFfQUNRVUlSRV9USU1FU1RBTVApOworCW52X3dpMzIoZGV2LCBmYyArIDM2LCB0bXApOworCW52X3dpMzIoZGV2LCBmYyArIDQwLCBudl9yZDMyKGRldiwgTlYxMF9QRklGT19DQUNIRTFfQUNRVUlSRV9USU1FT1VUKSk7CisJbnZfd2kzMihkZXYsIGZjICsgNDQsIG52X3JkMzIoZGV2LCBOVjEwX1BGSUZPX0NBQ0hFMV9TRU1BUEhPUkUpKTsKKwludl93aTMyKGRldiwgZmMgKyA0OCwgbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9HRVQpKTsKKworb3V0OgorCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisKKwludjEwX2ZpZm9fZG9fbG9hZF9jb250ZXh0KGRldiwgcGZpZm8tPmNoYW5uZWxzIC0gMSk7CisJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX1BVU0gxLCBwZmlmby0+Y2hhbm5lbHMgLSAxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK252MTBfZmlmb19pbml0X3Jlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSwKKwkJbnZfcmQzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSkgJiB+TlZfUE1DX0VOQUJMRV9QRklGTyk7CisJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSwKKwkJbnZfcmQzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSkgfCAgTlZfUE1DX0VOQUJMRV9QRklGTyk7CisKKwludl93cjMyKGRldiwgMHgwMDMyMjQsIDB4MDAwZjAwNzgpOworCW52X3dyMzIoZGV2LCAweDAwMjA0NCwgMHgwMTAxZmZmZik7CisJbnZfd3IzMihkZXYsIDB4MDAyMDQwLCAweDAwMDAwMGZmKTsKKwludl93cjMyKGRldiwgMHgwMDI1MDAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDAwMzAwMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4MDAzMDUwLCAweDAwMDAwMDAwKTsKKworCW52X3dyMzIoZGV2LCAweDAwMzI1OCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4MDAzMjEwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHgwMDMyNzAsIDB4MDAwMDAwMDApOworfQorCitzdGF0aWMgdm9pZAorbnYxMF9maWZvX2luaXRfcmFteHgoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fUkFNSFQsICgweDAzIDw8IDI0KSAvKiBzZWFyY2ggMTI4ICovIHwKKwkJCQkgICAgICAgKChkZXZfcHJpdi0+cmFtaHRfYml0cyAtIDkpIDw8IDE2KSB8CisJCQkJICAgICAgIChkZXZfcHJpdi0+cmFtaHRfb2Zmc2V0ID4+IDgpKTsKKwludl93cjMyKGRldiwgTlYwM19QRklGT19SQU1STywgZGV2X3ByaXYtPnJhbXJvX29mZnNldD4+OCk7CisKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPCAweDE3KSB7CisJCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX1JBTUZDLCBkZXZfcHJpdi0+cmFtZmNfb2Zmc2V0ID4+IDgpOworCX0gZWxzZSB7CisJCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX1JBTUZDLCAoZGV2X3ByaXYtPnJhbWZjX29mZnNldCA+PiA4KSB8CisJCQkJCSAgICAgICAoMSA8PCAxNikgLyogNjQgQnl0ZXMgZW50cnkqLyk7CisJCS8qIFhYWCBudmlkaWEgYmxvYiBzZXQgYml0IDE4LCAyMSwyMyBmb3IgbnYyMCAmIG52MzAgKi8KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitudjEwX2ZpZm9faW5pdF9pbnRyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJbnZfd3IzMihkZXYsIDB4MDAyMTAwLCAweGZmZmZmZmZmKTsKKwludl93cjMyKGRldiwgMHgwMDIxNDAsIDB4ZmZmZmZmZmYpOworfQorCitpbnQKK252MTBfZmlmb19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9maWZvX2VuZ2luZSAqcGZpZm8gPSAmZGV2X3ByaXYtPmVuZ2luZS5maWZvOworCWludCBpOworCisJbnYxMF9maWZvX2luaXRfcmVzZXQoZGV2KTsKKwludjEwX2ZpZm9faW5pdF9yYW14eChkZXYpOworCisJbnYxMF9maWZvX2RvX2xvYWRfY29udGV4dChkZXYsIHBmaWZvLT5jaGFubmVscyAtIDEpOworCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9QVVNIMSwgcGZpZm8tPmNoYW5uZWxzIC0gMSk7CisKKwludjEwX2ZpZm9faW5pdF9pbnRyKGRldik7CisJcGZpZm8tPmVuYWJsZShkZXYpOworCXBmaWZvLT5yZWFzc2lnbihkZXYsIHRydWUpOworCisJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT5lbmdpbmUuZmlmby5jaGFubmVsczsgaSsrKSB7CisJCWlmIChkZXZfcHJpdi0+Zmlmb3NbaV0pIHsKKwkJCXVpbnQzMl90IG1vZGUgPSBudl9yZDMyKGRldiwgTlYwNF9QRklGT19NT0RFKTsKKwkJCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX01PREUsIG1vZGUgfCAoMSA8PCBpKSk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MTBfZ3JhcGguYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MTBfZ3JhcGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmY2ODA0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxMF9ncmFwaC5jCkBAIC0wLDAgKzEsODkyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDcgTWF0dGhpZXUgQ0FTVEVUIDxjYXN0ZXQubWF0dGhpZXVAZnJlZS5mcj4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcm0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorCisjZGVmaW5lIE5WMTBfRklGT19OVU1CRVIgMzIKKworc3RydWN0IHBpcGVfc3RhdGUgeworCXVpbnQzMl90IHBpcGVfMHgwMDAwWzB4MDQwLzRdOworCXVpbnQzMl90IHBpcGVfMHgwMDQwWzB4MDEwLzRdOworCXVpbnQzMl90IHBpcGVfMHgwMjAwWzB4MGMwLzRdOworCXVpbnQzMl90IHBpcGVfMHg0NDAwWzB4MDgwLzRdOworCXVpbnQzMl90IHBpcGVfMHg2NDAwWzB4M2IwLzRdOworCXVpbnQzMl90IHBpcGVfMHg2ODAwWzB4MmYwLzRdOworCXVpbnQzMl90IHBpcGVfMHg2YzAwWzB4MDMwLzRdOworCXVpbnQzMl90IHBpcGVfMHg3MDAwWzB4MTMwLzRdOworCXVpbnQzMl90IHBpcGVfMHg3NDAwWzB4MGMwLzRdOworCXVpbnQzMl90IHBpcGVfMHg3ODAwWzB4MGMwLzRdOworfTsKKworc3RhdGljIGludCBudjEwX2dyYXBoX2N0eF9yZWdzW10gPSB7CisJTlYxMF9QR1JBUEhfQ1RYX1NXSVRDSDEsCisJTlYxMF9QR1JBUEhfQ1RYX1NXSVRDSDIsCisJTlYxMF9QR1JBUEhfQ1RYX1NXSVRDSDMsCisJTlYxMF9QR1JBUEhfQ1RYX1NXSVRDSDQsCisJTlYxMF9QR1JBUEhfQ1RYX1NXSVRDSDUsCisJTlYxMF9QR1JBUEhfQ1RYX0NBQ0hFMSwJLyogOCB2YWx1ZXMgZnJvbSAweDQwMDE2MCB0byAweDQwMDE3YyAqLworCU5WMTBfUEdSQVBIX0NUWF9DQUNIRTIsCS8qIDggdmFsdWVzIGZyb20gMHg0MDAxODAgdG8gMHg0MDAxOWMgKi8KKwlOVjEwX1BHUkFQSF9DVFhfQ0FDSEUzLAkvKiA4IHZhbHVlcyBmcm9tIDB4NDAwMWEwIHRvIDB4NDAwMWJjICovCisJTlYxMF9QR1JBUEhfQ1RYX0NBQ0hFNCwJLyogOCB2YWx1ZXMgZnJvbSAweDQwMDFjMCB0byAweDQwMDFkYyAqLworCU5WMTBfUEdSQVBIX0NUWF9DQUNIRTUsCS8qIDggdmFsdWVzIGZyb20gMHg0MDAxZTAgdG8gMHg0MDAxZmMgKi8KKwkweDAwNDAwMTY0LAorCTB4MDA0MDAxODQsCisJMHgwMDQwMDFhNCwKKwkweDAwNDAwMWM0LAorCTB4MDA0MDAxZTQsCisJMHgwMDQwMDE2OCwKKwkweDAwNDAwMTg4LAorCTB4MDA0MDAxYTgsCisJMHgwMDQwMDFjOCwKKwkweDAwNDAwMWU4LAorCTB4MDA0MDAxNmMsCisJMHgwMDQwMDE4YywKKwkweDAwNDAwMWFjLAorCTB4MDA0MDAxY2MsCisJMHgwMDQwMDFlYywKKwkweDAwNDAwMTcwLAorCTB4MDA0MDAxOTAsCisJMHgwMDQwMDFiMCwKKwkweDAwNDAwMWQwLAorCTB4MDA0MDAxZjAsCisJMHgwMDQwMDE3NCwKKwkweDAwNDAwMTk0LAorCTB4MDA0MDAxYjQsCisJMHgwMDQwMDFkNCwKKwkweDAwNDAwMWY0LAorCTB4MDA0MDAxNzgsCisJMHgwMDQwMDE5OCwKKwkweDAwNDAwMWI4LAorCTB4MDA0MDAxZDgsCisJMHgwMDQwMDFmOCwKKwkweDAwNDAwMTdjLAorCTB4MDA0MDAxOWMsCisJMHgwMDQwMDFiYywKKwkweDAwNDAwMWRjLAorCTB4MDA0MDAxZmMsCisJTlYxMF9QR1JBUEhfQ1RYX1VTRVIsCisJTlYwNF9QR1JBUEhfRE1BX1NUQVJUXzAsCisJTlYwNF9QR1JBUEhfRE1BX1NUQVJUXzEsCisJTlYwNF9QR1JBUEhfRE1BX0xFTkdUSCwKKwlOVjA0X1BHUkFQSF9ETUFfTUlTQywKKwlOVjEwX1BHUkFQSF9ETUFfUElUQ0gsCisJTlYwNF9QR1JBUEhfQk9GRlNFVDAsCisJTlYwNF9QR1JBUEhfQkJBU0UwLAorCU5WMDRfUEdSQVBIX0JMSU1JVDAsCisJTlYwNF9QR1JBUEhfQk9GRlNFVDEsCisJTlYwNF9QR1JBUEhfQkJBU0UxLAorCU5WMDRfUEdSQVBIX0JMSU1JVDEsCisJTlYwNF9QR1JBUEhfQk9GRlNFVDIsCisJTlYwNF9QR1JBUEhfQkJBU0UyLAorCU5WMDRfUEdSQVBIX0JMSU1JVDIsCisJTlYwNF9QR1JBUEhfQk9GRlNFVDMsCisJTlYwNF9QR1JBUEhfQkJBU0UzLAorCU5WMDRfUEdSQVBIX0JMSU1JVDMsCisJTlYwNF9QR1JBUEhfQk9GRlNFVDQsCisJTlYwNF9QR1JBUEhfQkJBU0U0LAorCU5WMDRfUEdSQVBIX0JMSU1JVDQsCisJTlYwNF9QR1JBUEhfQk9GRlNFVDUsCisJTlYwNF9QR1JBUEhfQkJBU0U1LAorCU5WMDRfUEdSQVBIX0JMSU1JVDUsCisJTlYwNF9QR1JBUEhfQlBJVENIMCwKKwlOVjA0X1BHUkFQSF9CUElUQ0gxLAorCU5WMDRfUEdSQVBIX0JQSVRDSDIsCisJTlYwNF9QR1JBUEhfQlBJVENIMywKKwlOVjA0X1BHUkFQSF9CUElUQ0g0LAorCU5WMTBfUEdSQVBIX1NVUkZBQ0UsCisJTlYxMF9QR1JBUEhfU1RBVEUsCisJTlYwNF9QR1JBUEhfQlNXSVpaTEUyLAorCU5WMDRfUEdSQVBIX0JTV0laWkxFNSwKKwlOVjA0X1BHUkFQSF9CUElYRUwsCisJTlYxMF9QR1JBUEhfTk9USUZZLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1IwLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1IxLAorCU5WMDRfUEdSQVBIX1BBVFRfQ09MT1JSQU0sIC8qIDY0IHZhbHVlcyBmcm9tIDB4NDAwOTAwIHRvIDB4NDAwOWZjICovCisJMHgwMDQwMDkwNCwKKwkweDAwNDAwOTA4LAorCTB4MDA0MDA5MGMsCisJMHgwMDQwMDkxMCwKKwkweDAwNDAwOTE0LAorCTB4MDA0MDA5MTgsCisJMHgwMDQwMDkxYywKKwkweDAwNDAwOTIwLAorCTB4MDA0MDA5MjQsCisJMHgwMDQwMDkyOCwKKwkweDAwNDAwOTJjLAorCTB4MDA0MDA5MzAsCisJMHgwMDQwMDkzNCwKKwkweDAwNDAwOTM4LAorCTB4MDA0MDA5M2MsCisJMHgwMDQwMDk0MCwKKwkweDAwNDAwOTQ0LAorCTB4MDA0MDA5NDgsCisJMHgwMDQwMDk0YywKKwkweDAwNDAwOTUwLAorCTB4MDA0MDA5NTQsCisJMHgwMDQwMDk1OCwKKwkweDAwNDAwOTVjLAorCTB4MDA0MDA5NjAsCisJMHgwMDQwMDk2NCwKKwkweDAwNDAwOTY4LAorCTB4MDA0MDA5NmMsCisJMHgwMDQwMDk3MCwKKwkweDAwNDAwOTc0LAorCTB4MDA0MDA5NzgsCisJMHgwMDQwMDk3YywKKwkweDAwNDAwOTgwLAorCTB4MDA0MDA5ODQsCisJMHgwMDQwMDk4OCwKKwkweDAwNDAwOThjLAorCTB4MDA0MDA5OTAsCisJMHgwMDQwMDk5NCwKKwkweDAwNDAwOTk4LAorCTB4MDA0MDA5OWMsCisJMHgwMDQwMDlhMCwKKwkweDAwNDAwOWE0LAorCTB4MDA0MDA5YTgsCisJMHgwMDQwMDlhYywKKwkweDAwNDAwOWIwLAorCTB4MDA0MDA5YjQsCisJMHgwMDQwMDliOCwKKwkweDAwNDAwOWJjLAorCTB4MDA0MDA5YzAsCisJMHgwMDQwMDljNCwKKwkweDAwNDAwOWM4LAorCTB4MDA0MDA5Y2MsCisJMHgwMDQwMDlkMCwKKwkweDAwNDAwOWQ0LAorCTB4MDA0MDA5ZDgsCisJMHgwMDQwMDlkYywKKwkweDAwNDAwOWUwLAorCTB4MDA0MDA5ZTQsCisJMHgwMDQwMDllOCwKKwkweDAwNDAwOWVjLAorCTB4MDA0MDA5ZjAsCisJMHgwMDQwMDlmNCwKKwkweDAwNDAwOWY4LAorCTB4MDA0MDA5ZmMsCisJTlYwNF9QR1JBUEhfUEFUVEVSTiwJLyogMiB2YWx1ZXMgZnJvbSAweDQwMDgwOCB0byAweDQwMDgwYyAqLworCTB4MDA0MDA4MGMsCisJTlYwNF9QR1JBUEhfUEFUVEVSTl9TSEFQRSwKKwlOVjAzX1BHUkFQSF9NT05PX0NPTE9SMCwKKwlOVjA0X1BHUkFQSF9ST1AzLAorCU5WMDRfUEdSQVBIX0NIUk9NQSwKKwlOVjA0X1BHUkFQSF9CRVRBX0FORCwKKwlOVjA0X1BHUkFQSF9CRVRBX1BSRU1VTFQsCisJMHgwMDQwMGU3MCwKKwkweDAwNDAwZTc0LAorCTB4MDA0MDBlNzgsCisJMHgwMDQwMGU3YywKKwkweDAwNDAwZTgwLAorCTB4MDA0MDBlODQsCisJMHgwMDQwMGU4OCwKKwkweDAwNDAwZThjLAorCTB4MDA0MDBlYTAsCisJMHgwMDQwMGVhNCwKKwkweDAwNDAwZWE4LAorCTB4MDA0MDBlOTAsCisJMHgwMDQwMGU5NCwKKwkweDAwNDAwZTk4LAorCTB4MDA0MDBlOWMsCisJTlYxMF9QR1JBUEhfV0lORE9XQ0xJUF9IT1JJWk9OVEFMLCAvKiA4IHZhbHVlcyBmcm9tIDB4NDAwZjAwLTB4NDAwZjFjICovCisJTlYxMF9QR1JBUEhfV0lORE9XQ0xJUF9WRVJUSUNBTCwgICAvKiA4IHZhbHVlcyBmcm9tIDB4NDAwZjIwLTB4NDAwZjNjICovCisJMHgwMDQwMGYwNCwKKwkweDAwNDAwZjI0LAorCTB4MDA0MDBmMDgsCisJMHgwMDQwMGYyOCwKKwkweDAwNDAwZjBjLAorCTB4MDA0MDBmMmMsCisJMHgwMDQwMGYxMCwKKwkweDAwNDAwZjMwLAorCTB4MDA0MDBmMTQsCisJMHgwMDQwMGYzNCwKKwkweDAwNDAwZjE4LAorCTB4MDA0MDBmMzgsCisJMHgwMDQwMGYxYywKKwkweDAwNDAwZjNjLAorCU5WMTBfUEdSQVBIX1hGTU9ERTAsCisJTlYxMF9QR1JBUEhfWEZNT0RFMSwKKwlOVjEwX1BHUkFQSF9HTE9CQUxTVEFURTAsCisJTlYxMF9QR1JBUEhfR0xPQkFMU1RBVEUxLAorCU5WMDRfUEdSQVBIX1NUT1JFRF9GTVQsCisJTlYwNF9QR1JBUEhfU09VUkNFX0NPTE9SLAorCU5WMDNfUEdSQVBIX0FCU19YX1JBTSwJLyogMzIgdmFsdWVzIGZyb20gMHg0MDA0MDAgdG8gMHg0MDA0N2MgKi8KKwlOVjAzX1BHUkFQSF9BQlNfWV9SQU0sCS8qIDMyIHZhbHVlcyBmcm9tIDB4NDAwNDgwIHRvIDB4NDAwNGZjICovCisJMHgwMDQwMDQwNCwKKwkweDAwNDAwNDg0LAorCTB4MDA0MDA0MDgsCisJMHgwMDQwMDQ4OCwKKwkweDAwNDAwNDBjLAorCTB4MDA0MDA0OGMsCisJMHgwMDQwMDQxMCwKKwkweDAwNDAwNDkwLAorCTB4MDA0MDA0MTQsCisJMHgwMDQwMDQ5NCwKKwkweDAwNDAwNDE4LAorCTB4MDA0MDA0OTgsCisJMHgwMDQwMDQxYywKKwkweDAwNDAwNDljLAorCTB4MDA0MDA0MjAsCisJMHgwMDQwMDRhMCwKKwkweDAwNDAwNDI0LAorCTB4MDA0MDA0YTQsCisJMHgwMDQwMDQyOCwKKwkweDAwNDAwNGE4LAorCTB4MDA0MDA0MmMsCisJMHgwMDQwMDRhYywKKwkweDAwNDAwNDMwLAorCTB4MDA0MDA0YjAsCisJMHgwMDQwMDQzNCwKKwkweDAwNDAwNGI0LAorCTB4MDA0MDA0MzgsCisJMHgwMDQwMDRiOCwKKwkweDAwNDAwNDNjLAorCTB4MDA0MDA0YmMsCisJMHgwMDQwMDQ0MCwKKwkweDAwNDAwNGMwLAorCTB4MDA0MDA0NDQsCisJMHgwMDQwMDRjNCwKKwkweDAwNDAwNDQ4LAorCTB4MDA0MDA0YzgsCisJMHgwMDQwMDQ0YywKKwkweDAwNDAwNGNjLAorCTB4MDA0MDA0NTAsCisJMHgwMDQwMDRkMCwKKwkweDAwNDAwNDU0LAorCTB4MDA0MDA0ZDQsCisJMHgwMDQwMDQ1OCwKKwkweDAwNDAwNGQ4LAorCTB4MDA0MDA0NWMsCisJMHgwMDQwMDRkYywKKwkweDAwNDAwNDYwLAorCTB4MDA0MDA0ZTAsCisJMHgwMDQwMDQ2NCwKKwkweDAwNDAwNGU0LAorCTB4MDA0MDA0NjgsCisJMHgwMDQwMDRlOCwKKwkweDAwNDAwNDZjLAorCTB4MDA0MDA0ZWMsCisJMHgwMDQwMDQ3MCwKKwkweDAwNDAwNGYwLAorCTB4MDA0MDA0NzQsCisJMHgwMDQwMDRmNCwKKwkweDAwNDAwNDc4LAorCTB4MDA0MDA0ZjgsCisJMHgwMDQwMDQ3YywKKwkweDAwNDAwNGZjLAorCU5WMDNfUEdSQVBIX0FCU19VQ0xJUF9YTUlOLAorCU5WMDNfUEdSQVBIX0FCU19VQ0xJUF9YTUFYLAorCU5WMDNfUEdSQVBIX0FCU19VQ0xJUF9ZTUlOLAorCU5WMDNfUEdSQVBIX0FCU19VQ0xJUF9ZTUFYLAorCTB4MDA0MDA1NTAsCisJMHgwMDQwMDU1OCwKKwkweDAwNDAwNTU0LAorCTB4MDA0MDA1NWMsCisJTlYwM19QR1JBUEhfQUJTX1VDTElQQV9YTUlOLAorCU5WMDNfUEdSQVBIX0FCU19VQ0xJUEFfWE1BWCwKKwlOVjAzX1BHUkFQSF9BQlNfVUNMSVBBX1lNSU4sCisJTlYwM19QR1JBUEhfQUJTX1VDTElQQV9ZTUFYLAorCU5WMDNfUEdSQVBIX0FCU19JQ0xJUF9YTUFYLAorCU5WMDNfUEdSQVBIX0FCU19JQ0xJUF9ZTUFYLAorCU5WMDNfUEdSQVBIX1hZX0xPR0lDX01JU0MwLAorCU5WMDNfUEdSQVBIX1hZX0xPR0lDX01JU0MxLAorCU5WMDNfUEdSQVBIX1hZX0xPR0lDX01JU0MyLAorCU5WMDNfUEdSQVBIX1hZX0xPR0lDX01JU0MzLAorCU5WMDNfUEdSQVBIX0NMSVBYXzAsCisJTlYwM19QR1JBUEhfQ0xJUFhfMSwKKwlOVjAzX1BHUkFQSF9DTElQWV8wLAorCU5WMDNfUEdSQVBIX0NMSVBZXzEsCisJTlYxMF9QR1JBUEhfQ09NQklORVIwX0lOX0FMUEhBLAorCU5WMTBfUEdSQVBIX0NPTUJJTkVSMV9JTl9BTFBIQSwKKwlOVjEwX1BHUkFQSF9DT01CSU5FUjBfSU5fUkdCLAorCU5WMTBfUEdSQVBIX0NPTUJJTkVSMV9JTl9SR0IsCisJTlYxMF9QR1JBUEhfQ09NQklORVJfQ09MT1IwLAorCU5WMTBfUEdSQVBIX0NPTUJJTkVSX0NPTE9SMSwKKwlOVjEwX1BHUkFQSF9DT01CSU5FUjBfT1VUX0FMUEhBLAorCU5WMTBfUEdSQVBIX0NPTUJJTkVSMV9PVVRfQUxQSEEsCisJTlYxMF9QR1JBUEhfQ09NQklORVIwX09VVF9SR0IsCisJTlYxMF9QR1JBUEhfQ09NQklORVIxX09VVF9SR0IsCisJTlYxMF9QR1JBUEhfQ09NQklORVJfRklOQUwwLAorCU5WMTBfUEdSQVBIX0NPTUJJTkVSX0ZJTkFMMSwKKwkweDAwNDAwZTAwLAorCTB4MDA0MDBlMDQsCisJMHgwMDQwMGUwOCwKKwkweDAwNDAwZTBjLAorCTB4MDA0MDBlMTAsCisJMHgwMDQwMGUxNCwKKwkweDAwNDAwZTE4LAorCTB4MDA0MDBlMWMsCisJMHgwMDQwMGUyMCwKKwkweDAwNDAwZTI0LAorCTB4MDA0MDBlMjgsCisJMHgwMDQwMGUyYywKKwkweDAwNDAwZTMwLAorCTB4MDA0MDBlMzQsCisJMHgwMDQwMGUzOCwKKwkweDAwNDAwZTNjLAorCU5WMDRfUEdSQVBIX1BBU1NUSFJVXzAsCisJTlYwNF9QR1JBUEhfUEFTU1RIUlVfMSwKKwlOVjA0X1BHUkFQSF9QQVNTVEhSVV8yLAorCU5WMTBfUEdSQVBIX0RJTVhfVEVYVFVSRSwKKwlOVjEwX1BHUkFQSF9XRElNWF9URVhUVVJFLAorCU5WMTBfUEdSQVBIX0RWRF9DT0xPUkZNVCwKKwlOVjEwX1BHUkFQSF9TQ0FMRURfRk9STUFULAorCU5WMDRfUEdSQVBIX01JU0MyNF8wLAorCU5WMDRfUEdSQVBIX01JU0MyNF8xLAorCU5WMDRfUEdSQVBIX01JU0MyNF8yLAorCU5WMDNfUEdSQVBIX1hfTUlTQywKKwlOVjAzX1BHUkFQSF9ZX01JU0MsCisJTlYwNF9QR1JBUEhfVkFMSUQxLAorCU5WMDRfUEdSQVBIX1ZBTElEMiwKK307CisKK3N0YXRpYyBpbnQgbnYxN19ncmFwaF9jdHhfcmVnc1tdID0geworCU5WMTBfUEdSQVBIX0RFQlVHXzQsCisJMHgwMDQwMDZiMCwKKwkweDAwNDAwZWFjLAorCTB4MDA0MDBlYjAsCisJMHgwMDQwMGViNCwKKwkweDAwNDAwZWI4LAorCTB4MDA0MDBlYmMsCisJMHgwMDQwMGVjMCwKKwkweDAwNDAwZWM0LAorCTB4MDA0MDBlYzgsCisJMHgwMDQwMGVjYywKKwkweDAwNDAwZWQwLAorCTB4MDA0MDBlZDQsCisJMHgwMDQwMGVkOCwKKwkweDAwNDAwZWRjLAorCTB4MDA0MDBlZTAsCisJMHgwMDQwMGEwMCwKKwkweDAwNDAwYTA0LAorfTsKKworc3RydWN0IGdyYXBoX3N0YXRlIHsKKwlpbnQgbnYxMFtBUlJBWV9TSVpFKG52MTBfZ3JhcGhfY3R4X3JlZ3MpXTsKKwlpbnQgbnYxN1tBUlJBWV9TSVpFKG52MTdfZ3JhcGhfY3R4X3JlZ3MpXTsKKwlzdHJ1Y3QgcGlwZV9zdGF0ZSBwaXBlX3N0YXRlOworfTsKKworc3RhdGljIHZvaWQgbnYxMF9ncmFwaF9zYXZlX3BpcGUoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBncmFwaF9zdGF0ZSAqcGdyYXBoX2N0eCA9IGNoYW4tPnBncmFwaF9jdHg7CisJc3RydWN0IHBpcGVfc3RhdGUgKmZpZm9fcGlwZV9zdGF0ZSA9ICZwZ3JhcGhfY3R4LT5waXBlX3N0YXRlOworCWludCBpOworI2RlZmluZSBQSVBFX1NBVkUoYWRkcikgXAorCWRvIHsgXAorCQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUElQRV9BRERSRVNTLCBhZGRyKTsgXAorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmaWZvX3BpcGVfc3RhdGUtPnBpcGVfIyNhZGRyKTsgaSsrKSBcCisJCQlmaWZvX3BpcGVfc3RhdGUtPnBpcGVfIyNhZGRyW2ldID0gbnZfcmQzMihkZXYsIE5WMTBfUEdSQVBIX1BJUEVfREFUQSk7IFwKKwl9IHdoaWxlICgwKQorCisJUElQRV9TQVZFKDB4NDQwMCk7CisJUElQRV9TQVZFKDB4MDIwMCk7CisJUElQRV9TQVZFKDB4NjQwMCk7CisJUElQRV9TQVZFKDB4NjgwMCk7CisJUElQRV9TQVZFKDB4NmMwMCk7CisJUElQRV9TQVZFKDB4NzAwMCk7CisJUElQRV9TQVZFKDB4NzQwMCk7CisJUElQRV9TQVZFKDB4NzgwMCk7CisJUElQRV9TQVZFKDB4MDA0MCk7CisJUElQRV9TQVZFKDB4MDAwMCk7CisKKyN1bmRlZiBQSVBFX1NBVkUKK30KKworc3RhdGljIHZvaWQgbnYxMF9ncmFwaF9sb2FkX3BpcGUoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBncmFwaF9zdGF0ZSAqcGdyYXBoX2N0eCA9IGNoYW4tPnBncmFwaF9jdHg7CisJc3RydWN0IHBpcGVfc3RhdGUgKmZpZm9fcGlwZV9zdGF0ZSA9ICZwZ3JhcGhfY3R4LT5waXBlX3N0YXRlOworCWludCBpOworCXVpbnQzMl90IHhmbW9kZTAsIHhmbW9kZTE7CisjZGVmaW5lIFBJUEVfUkVTVE9SRShhZGRyKSBcCisJZG8geyBcCisJCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9QSVBFX0FERFJFU1MsIGFkZHIpOyBcCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZpZm9fcGlwZV9zdGF0ZS0+cGlwZV8jI2FkZHIpOyBpKyspIFwKKwkJCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9QSVBFX0RBVEEsIGZpZm9fcGlwZV9zdGF0ZS0+cGlwZV8jI2FkZHJbaV0pOyBcCisJfSB3aGlsZSAoMCkKKworCisJbm91dmVhdV93YWl0X2Zvcl9pZGxlKGRldik7CisJLyogWFhYIGNoZWNrIGhhaWt1IGNvbW1lbnRzICovCisJeGZtb2RlMCA9IG52X3JkMzIoZGV2LCBOVjEwX1BHUkFQSF9YRk1PREUwKTsKKwl4Zm1vZGUxID0gbnZfcmQzMihkZXYsIE5WMTBfUEdSQVBIX1hGTU9ERTEpOworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9YRk1PREUwLCAweDEwMDAwMDAwKTsKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfWEZNT0RFMSwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1BJUEVfQUREUkVTUywgMHgwMDAwNjRjMCk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1BJUEVfREFUQSwgMHgzZjgwMDAwMCk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1BJUEVfREFUQSwgMHgwMDAwMDAwMCk7CisKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUElQRV9BRERSRVNTLCAweDAwMDA2YWIwKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUElQRV9EQVRBLCAweDNmODAwMDAwKTsKKworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9QSVBFX0FERFJFU1MsIDB4MDAwMDZhODApOworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9QSVBFX0RBVEEsIDB4MDAwMDAwMDApOworCisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1BJUEVfQUREUkVTUywgMHgwMDAwMDA0MCk7CisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1BJUEVfREFUQSwgMHgwMDAwMDAwOCk7CisKKworCVBJUEVfUkVTVE9SRSgweDAyMDApOworCW5vdXZlYXVfd2FpdF9mb3JfaWRsZShkZXYpOworCisJLyogcmVzdG9yZSBYRk1PREUgKi8KKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfWEZNT0RFMCwgeGZtb2RlMCk7CisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1hGTU9ERTEsIHhmbW9kZTEpOworCVBJUEVfUkVTVE9SRSgweDY0MDApOworCVBJUEVfUkVTVE9SRSgweDY4MDApOworCVBJUEVfUkVTVE9SRSgweDZjMDApOworCVBJUEVfUkVTVE9SRSgweDcwMDApOworCVBJUEVfUkVTVE9SRSgweDc0MDApOworCVBJUEVfUkVTVE9SRSgweDc4MDApOworCVBJUEVfUkVTVE9SRSgweDQ0MDApOworCVBJUEVfUkVTVE9SRSgweDAwMDApOworCVBJUEVfUkVTVE9SRSgweDAwNDApOworCW5vdXZlYXVfd2FpdF9mb3JfaWRsZShkZXYpOworCisjdW5kZWYgUElQRV9SRVNUT1JFCit9CisKK3N0YXRpYyB2b2lkIG52MTBfZ3JhcGhfY3JlYXRlX3BpcGUoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBncmFwaF9zdGF0ZSAqcGdyYXBoX2N0eCA9IGNoYW4tPnBncmFwaF9jdHg7CisJc3RydWN0IHBpcGVfc3RhdGUgKmZpZm9fcGlwZV9zdGF0ZSA9ICZwZ3JhcGhfY3R4LT5waXBlX3N0YXRlOworCXVpbnQzMl90ICpmaWZvX3BpcGVfc3RhdGVfYWRkcjsKKwlpbnQgaTsKKyNkZWZpbmUgUElQRV9JTklUKGFkZHIpIFwKKwlkbyB7IFwKKwkJZmlmb19waXBlX3N0YXRlX2FkZHIgPSBmaWZvX3BpcGVfc3RhdGUtPnBpcGVfIyNhZGRyOyBcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgUElQRV9JTklUX0VORChhZGRyKSBcCisJZG8geyBcCisJCXVpbnQzMl90ICpfX2VuZF9hZGRyID0gZmlmb19waXBlX3N0YXRlLT5waXBlXyMjYWRkciArIFwKKwkJCQlBUlJBWV9TSVpFKGZpZm9fcGlwZV9zdGF0ZS0+cGlwZV8jI2FkZHIpOyBcCisJCWlmIChmaWZvX3BpcGVfc3RhdGVfYWRkciAhPSBfX2VuZF9hZGRyKSBcCisJCQlOVl9FUlJPUihkZXYsICJpbmNvbXBsZXRlIHBpcGUgaW5pdCBmb3IgMHgleCA6ICAlcC8lcFxuIiwgXAorCQkJCWFkZHIsIGZpZm9fcGlwZV9zdGF0ZV9hZGRyLCBfX2VuZF9hZGRyKTsgXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIE5WX1dSSVRFX1BJUEVfSU5JVCh2YWx1ZSkgKihmaWZvX3BpcGVfc3RhdGVfYWRkcisrKSA9IHZhbHVlCisKKwlQSVBFX0lOSVQoMHgwMjAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgNDg7IGkrKykKKwkJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCVBJUEVfSU5JVF9FTkQoMHgwMjAwKTsKKworCVBJUEVfSU5JVCgweDY0MDApOworCWZvciAoaSA9IDA7IGkgPCAyMTE7IGkrKykKKwkJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDNmODAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHg0MDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4NDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDQwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHg0MDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgzZjgwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDNmMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgzZjAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDNmODAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDNmODAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgzZjgwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4M2Y4MDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDNmODAwMDAwKTsKKwlQSVBFX0lOSVRfRU5EKDB4NjQwMCk7CisKKwlQSVBFX0lOSVQoMHg2ODAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTYyOyBpKyspCisJCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgzZjgwMDAwMCk7CisJZm9yIChpID0gMDsgaSA8IDI1OyBpKyspCisJCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlQSVBFX0lOSVRfRU5EKDB4NjgwMCk7CisKKwlQSVBFX0lOSVQoMHg2YzAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4YmY4MDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlQSVBFX0lOSVRfRU5EKDB4NmMwMCk7CisKKwlQSVBFX0lOSVQoMHg3MDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHg3MTQ5ZjJjYSk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4NzE0OWYyY2EpOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDcxNDlmMmNhKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHg3MTQ5ZjJjYSk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4NzE0OWYyY2EpOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDcxNDlmMmNhKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHg3MTQ5ZjJjYSk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJTlZfV1JJVEVfUElQRV9JTklUKDB4NzE0OWYyY2EpOworCWZvciAoaSA9IDA7IGkgPCAzNTsgaSsrKQorCQlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJUElQRV9JTklUX0VORCgweDcwMDApOworCisJUElQRV9JTklUKDB4NzQwMCk7CisJZm9yIChpID0gMDsgaSA8IDQ4OyBpKyspCisJCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlQSVBFX0lOSVRfRU5EKDB4NzQwMCk7CisKKwlQSVBFX0lOSVQoMHg3ODAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgNDg7IGkrKykKKwkJTlZfV1JJVEVfUElQRV9JTklUKDB4MDAwMDAwMDApOworCVBJUEVfSU5JVF9FTkQoMHg3ODAwKTsKKworCVBJUEVfSU5JVCgweDQ0MDApOworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJUElQRV9JTklUX0VORCgweDQ0MDApOworCisJUElQRV9JTklUKDB4MDAwMCk7CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCU5WX1dSSVRFX1BJUEVfSU5JVCgweDAwMDAwMDAwKTsKKwlQSVBFX0lOSVRfRU5EKDB4MDAwMCk7CisKKwlQSVBFX0lOSVQoMHgwMDQwKTsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQlOVl9XUklURV9QSVBFX0lOSVQoMHgwMDAwMDAwMCk7CisJUElQRV9JTklUX0VORCgweDAwNDApOworCisjdW5kZWYgUElQRV9JTklUCisjdW5kZWYgUElQRV9JTklUX0VORAorI3VuZGVmIE5WX1dSSVRFX1BJUEVfSU5JVAorfQorCitzdGF0aWMgaW50IG52MTBfZ3JhcGhfY3R4X3JlZ3NfZmluZF9vZmZzZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHJlZykKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShudjEwX2dyYXBoX2N0eF9yZWdzKTsgaSsrKSB7CisJCWlmIChudjEwX2dyYXBoX2N0eF9yZWdzW2ldID09IHJlZykKKwkJCXJldHVybiBpOworCX0KKwlOVl9FUlJPUihkZXYsICJ1bmtub3cgb2Zmc2V0IG52MTBfY3R4X3JlZ3MgJWRcbiIsIHJlZyk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IG52MTdfZ3JhcGhfY3R4X3JlZ3NfZmluZF9vZmZzZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHJlZykKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShudjE3X2dyYXBoX2N0eF9yZWdzKTsgaSsrKSB7CisJCWlmIChudjE3X2dyYXBoX2N0eF9yZWdzW2ldID09IHJlZykKKwkJCXJldHVybiBpOworCX0KKwlOVl9FUlJPUihkZXYsICJ1bmtub3cgb2Zmc2V0IG52MTdfY3R4X3JlZ3MgJWRcbiIsIHJlZyk7CisJcmV0dXJuIC0xOworfQorCitpbnQgbnYxMF9ncmFwaF9sb2FkX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGdyYXBoX3N0YXRlICpwZ3JhcGhfY3R4ID0gY2hhbi0+cGdyYXBoX2N0eDsKKwl1aW50MzJfdCB0bXA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShudjEwX2dyYXBoX2N0eF9yZWdzKTsgaSsrKQorCQludl93cjMyKGRldiwgbnYxMF9ncmFwaF9jdHhfcmVnc1tpXSwgcGdyYXBoX2N0eC0+bnYxMFtpXSk7CisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID49IDB4MTcpIHsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobnYxN19ncmFwaF9jdHhfcmVncyk7IGkrKykKKwkJCW52X3dyMzIoZGV2LCBudjE3X2dyYXBoX2N0eF9yZWdzW2ldLAorCQkJCQkJcGdyYXBoX2N0eC0+bnYxN1tpXSk7CisJfQorCisJbnYxMF9ncmFwaF9sb2FkX3BpcGUoY2hhbik7CisKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfQ1RYX0NPTlRST0wsIDB4MTAwMTAxMDApOworCXRtcCA9IG52X3JkMzIoZGV2LCBOVjEwX1BHUkFQSF9DVFhfVVNFUik7CisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX0NUWF9VU0VSLCAodG1wICYgMHhmZmZmZmYpIHwgY2hhbi0+aWQgPDwgMjQpOworCXRtcCA9IG52X3JkMzIoZGV2LCBOVjEwX1BHUkFQSF9GRklOVEZDX1NUMik7CisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX0ZGSU5URkNfU1QyLCB0bXAgJiAweGNmZmZmZmZmKTsKKwlyZXR1cm4gMDsKK30KKworaW50CitudjEwX2dyYXBoX3VubG9hZF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICpwZ3JhcGggPSAmZGV2X3ByaXYtPmVuZ2luZS5ncmFwaDsKKwlzdHJ1Y3Qgbm91dmVhdV9maWZvX2VuZ2luZSAqcGZpZm8gPSAmZGV2X3ByaXYtPmVuZ2luZS5maWZvOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47CisJc3RydWN0IGdyYXBoX3N0YXRlICpjdHg7CisJdWludDMyX3QgdG1wOworCWludCBpOworCisJY2hhbiA9IHBncmFwaC0+Y2hhbm5lbChkZXYpOworCWlmICghY2hhbikKKwkJcmV0dXJuIDA7CisJY3R4ID0gY2hhbi0+cGdyYXBoX2N0eDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG52MTBfZ3JhcGhfY3R4X3JlZ3MpOyBpKyspCisJCWN0eC0+bnYxMFtpXSA9IG52X3JkMzIoZGV2LCBudjEwX2dyYXBoX2N0eF9yZWdzW2ldKTsKKworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA+PSAweDE3KSB7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG52MTdfZ3JhcGhfY3R4X3JlZ3MpOyBpKyspCisJCQljdHgtPm52MTdbaV0gPSBudl9yZDMyKGRldiwgbnYxN19ncmFwaF9jdHhfcmVnc1tpXSk7CisJfQorCisJbnYxMF9ncmFwaF9zYXZlX3BpcGUoY2hhbik7CisKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfQ1RYX0NPTlRST0wsIDB4MTAwMDAwMDApOworCXRtcCAgPSBudl9yZDMyKGRldiwgTlYxMF9QR1JBUEhfQ1RYX1VTRVIpICYgMHgwMGZmZmZmZjsKKwl0bXAgfD0gKHBmaWZvLT5jaGFubmVscyAtIDEpIDw8IDI0OworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9DVFhfVVNFUiwgdG1wKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbnYxMF9ncmFwaF9jb250ZXh0X3N3aXRjaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IE5VTEw7CisJaW50IGNoaWQ7CisKKwlwZ3JhcGgtPmZpZm9fYWNjZXNzKGRldiwgZmFsc2UpOworCW5vdXZlYXVfd2FpdF9mb3JfaWRsZShkZXYpOworCisJLyogSWYgcHJldmlvdXMgY29udGV4dCBpcyB2YWxpZCwgd2UgbmVlZCB0byBzYXZlIGl0ICovCisJbnYxMF9ncmFwaF91bmxvYWRfY29udGV4dChkZXYpOworCisJLyogTG9hZCBjb250ZXh0IGZvciBuZXh0IGNoYW5uZWwgKi8KKwljaGlkID0gKG52X3JkMzIoZGV2LCBOVjA0X1BHUkFQSF9UUkFQUEVEX0FERFIpID4+IDIwKSAmIDB4MWY7CisJY2hhbiA9IGRldl9wcml2LT5maWZvc1tjaGlkXTsKKwlpZiAoY2hhbikKKwkJbnYxMF9ncmFwaF9sb2FkX2NvbnRleHQoY2hhbik7CisKKwlwZ3JhcGgtPmZpZm9fYWNjZXNzKGRldiwgdHJ1ZSk7Cit9CisKKyNkZWZpbmUgTlZfV1JJVEVfQ1RYKHJlZywgdmFsKSBkbyB7IFwKKwlpbnQgb2Zmc2V0ID0gbnYxMF9ncmFwaF9jdHhfcmVnc19maW5kX29mZnNldChkZXYsIHJlZyk7IFwKKwlpZiAob2Zmc2V0ID4gMCkgXAorCQlwZ3JhcGhfY3R4LT5udjEwW29mZnNldF0gPSB2YWw7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIE5WMTdfV1JJVEVfQ1RYKHJlZywgdmFsKSBkbyB7IFwKKwlpbnQgb2Zmc2V0ID0gbnYxN19ncmFwaF9jdHhfcmVnc19maW5kX29mZnNldChkZXYsIHJlZyk7IFwKKwlpZiAob2Zmc2V0ID4gMCkgXAorCQlwZ3JhcGhfY3R4LT5udjE3W29mZnNldF0gPSB2YWw7IFwKKwl9IHdoaWxlICgwKQorCitzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICoKK252MTBfZ3JhcGhfY2hhbm5lbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGNoaWQgPSBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHM7CisKKwlpZiAobnZfcmQzMihkZXYsIE5WMTBfUEdSQVBIX0NUWF9DT05UUk9MKSAmIDB4MDAwMTAwMDApCisJCWNoaWQgPSBudl9yZDMyKGRldiwgTlYxMF9QR1JBUEhfQ1RYX1VTRVIpID4+IDI0OworCisJaWYgKGNoaWQgPj0gZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBkZXZfcHJpdi0+Zmlmb3NbY2hpZF07Cit9CisKK2ludCBudjEwX2dyYXBoX2NyZWF0ZV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBncmFwaF9zdGF0ZSAqcGdyYXBoX2N0eDsKKworCU5WX0RFQlVHKGRldiwgIm52MTBfZ3JhcGhfY29udGV4dF9jcmVhdGUgJWRcbiIsIGNoYW4tPmlkKTsKKworCWNoYW4tPnBncmFwaF9jdHggPSBwZ3JhcGhfY3R4ID0ga3phbGxvYyhzaXplb2YoKnBncmFwaF9jdHgpLAorCQkJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKHBncmFwaF9jdHggPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKworCU5WX1dSSVRFX0NUWCgweDAwNDAwZTg4LCAweDA4MDAwMDAwKTsKKwlOVl9XUklURV9DVFgoMHgwMDQwMGU5YywgMHg0YjdmZmZmZik7CisJTlZfV1JJVEVfQ1RYKE5WMDNfUEdSQVBIX1hZX0xPR0lDX01JU0MwLCAweDAwMDFmZmZmKTsKKwlOVl9XUklURV9DVFgoMHgwMDQwMGUxMCwgMHgwMDAwMTAwMCk7CisJTlZfV1JJVEVfQ1RYKDB4MDA0MDBlMTQsIDB4MDAwMDEwMDApOworCU5WX1dSSVRFX0NUWCgweDAwNDAwZTMwLCAweDAwMDgwMDA4KTsKKwlOVl9XUklURV9DVFgoMHgwMDQwMGUzNCwgMHgwMDA4MDAwOCk7CisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID49IDB4MTcpIHsKKwkJLyogaXMgaXQgcmVhbGx5IG5lZWRlZCA/Pz8gKi8KKwkJTlYxN19XUklURV9DVFgoTlYxMF9QR1JBUEhfREVCVUdfNCwKKwkJCQkJbnZfcmQzMihkZXYsIE5WMTBfUEdSQVBIX0RFQlVHXzQpKTsKKwkJTlYxN19XUklURV9DVFgoMHgwMDQwMDZiMCwgbnZfcmQzMihkZXYsIDB4MDA0MDA2YjApKTsKKwkJTlYxN19XUklURV9DVFgoMHgwMDQwMGVhYywgMHgwZmZmMDAwMCk7CisJCU5WMTdfV1JJVEVfQ1RYKDB4MDA0MDBlYjAsIDB4MGZmZjAwMDApOworCQlOVjE3X1dSSVRFX0NUWCgweDAwNDAwZWMwLCAweDAwMDAwMDgwKTsKKwkJTlYxN19XUklURV9DVFgoMHgwMDQwMGVkMCwgMHgwMDAwMDA4MCk7CisJfQorCU5WX1dSSVRFX0NUWChOVjEwX1BHUkFQSF9DVFhfVVNFUiwgY2hhbi0+aWQgPDwgMjQpOworCisJbnYxMF9ncmFwaF9jcmVhdGVfcGlwZShjaGFuKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBudjEwX2dyYXBoX2Rlc3Ryb3lfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBncmFwaF9zdGF0ZSAqcGdyYXBoX2N0eCA9IGNoYW4tPnBncmFwaF9jdHg7CisKKwlrZnJlZShwZ3JhcGhfY3R4KTsKKwljaGFuLT5wZ3JhcGhfY3R4ID0gTlVMTDsKK30KKworaW50IG52MTBfZ3JhcGhfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdWludDMyX3QgdG1wOworCWludCBpOworCisJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSwgbnZfcmQzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSkgJgorCQkJfk5WX1BNQ19FTkFCTEVfUEdSQVBIKTsKKwludl93cjMyKGRldiwgTlYwM19QTUNfRU5BQkxFLCBudl9yZDMyKGRldiwgTlYwM19QTUNfRU5BQkxFKSB8CisJCQkgTlZfUE1DX0VOQUJMRV9QR1JBUEgpOworCisJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIgICAsIDB4RkZGRkZGRkYpOworCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSX0VOLCAweEZGRkZGRkZGKTsKKworCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9ERUJVR18wLCAweEZGRkZGRkZGKTsKKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfREVCVUdfMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0RFQlVHXzEsIDB4MDAxMTg3MDApOworCS8qIG52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9ERUJVR18yLCAweDI0RTAwODEwKTsgKi8gLyogMHgyNWY5MmFkOSAqLworCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9ERUJVR18yLCAweDI1ZjkyYWQ5KTsKKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfREVCVUdfMywgMHg1NURFMDgzMCB8CisJCQkJICAgICAgKDE8PDI5KSB8CisJCQkJICAgICAgKDE8PDMxKSk7CisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID49IDB4MTcpIHsKKwkJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX0RFQlVHXzQsIDB4MWYwMDAwMDApOworCQludl93cjMyKGRldiwgMHgwMDQwMDZiMCwgMHg0MDAwMDAyMCk7CisJfSBlbHNlCisJCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9ERUJVR180LCAweDAwMDAwMDAwKTsKKworCS8qIGNvcHkgdGlsZSBpbmZvIGZyb20gUEZCICovCisJZm9yIChpID0gMDsgaSA8IE5WMTBfUEZCX1RJTEVfX1NJWkU7IGkrKykgeworCQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfVElMRShpKSwKKwkJCQkJbnZfcmQzMihkZXYsIE5WMTBfUEZCX1RJTEUoaSkpKTsKKwkJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1RMSU1JVChpKSwKKwkJCQkJbnZfcmQzMihkZXYsIE5WMTBfUEZCX1RMSU1JVChpKSkpOworCQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfVFNJWkUoaSksCisJCQkJCW52X3JkMzIoZGV2LCBOVjEwX1BGQl9UU0laRShpKSkpOworCQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfVFNUQVRVUyhpKSwKKwkJCQkJbnZfcmQzMihkZXYsIE5WMTBfUEZCX1RTVEFUVVMoaSkpKTsKKwl9CisKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfQ1RYX1NXSVRDSDEsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9DVFhfU1dJVENIMiwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX0NUWF9TV0lUQ0gzLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfQ1RYX1NXSVRDSDQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9TVEFURSAgICAgICwgMHhGRkZGRkZGRik7CisKKwl0bXAgID0gbnZfcmQzMihkZXYsIE5WMTBfUEdSQVBIX0NUWF9VU0VSKSAmIDB4MDBmZmZmZmY7CisJdG1wIHw9IChkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHMgLSAxKSA8PCAyNDsKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfQ1RYX1VTRVIsIHRtcCk7CisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX0NUWF9DT05UUk9MLCAweDEwMDAwMTAwKTsKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfRkZJTlRGQ19TVDIsIDB4MDgwMDAwMDApOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbnYxMF9ncmFwaF90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworfQorCitzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X2NsYXNzIG52MTBfZ3JhcGhfZ3JjbGFzc1tdID0geworCXsgMHgwMDMwLCBmYWxzZSwgTlVMTCB9LCAvKiBudWxsICovCisJeyAweDAwMzksIGZhbHNlLCBOVUxMIH0sIC8qIG0ybWYgKi8KKwl7IDB4MDA0YSwgZmFsc2UsIE5VTEwgfSwgLyogZ2RpcmVjdCAqLworCXsgMHgwMDVmLCBmYWxzZSwgTlVMTCB9LCAvKiBpbWFnZWJsaXQgKi8KKwl7IDB4MDA5ZiwgZmFsc2UsIE5VTEwgfSwgLyogaW1hZ2VibGl0IChudjEyKSAqLworCXsgMHgwMDhhLCBmYWxzZSwgTlVMTCB9LCAvKiBpZmMgKi8KKwl7IDB4MDA4OSwgZmFsc2UsIE5VTEwgfSwgLyogc2lmbSAqLworCXsgMHgwMDYyLCBmYWxzZSwgTlVMTCB9LCAvKiBzdXJmMmQgKi8KKwl7IDB4MDA0MywgZmFsc2UsIE5VTEwgfSwgLyogcm9wICovCisJeyAweDAwMTIsIGZhbHNlLCBOVUxMIH0sIC8qIGJldGExICovCisJeyAweDAwNzIsIGZhbHNlLCBOVUxMIH0sIC8qIGJldGE0ICovCisJeyAweDAwMTksIGZhbHNlLCBOVUxMIH0sIC8qIGNsaXByZWN0ICovCisJeyAweDAwNDQsIGZhbHNlLCBOVUxMIH0sIC8qIHBhdHRlcm4gKi8KKwl7IDB4MDA1MiwgZmFsc2UsIE5VTEwgfSwgLyogc3d6c3VyZiAqLworCXsgMHgwMDkzLCBmYWxzZSwgTlVMTCB9LCAvKiBzdXJmM2QgKi8KKwl7IDB4MDA5NCwgZmFsc2UsIE5VTEwgfSwgLyogdGV4X3RyaSAqLworCXsgMHgwMDk1LCBmYWxzZSwgTlVMTCB9LCAvKiBtdWx0aXRleF90cmkgKi8KKwl7IDB4MDA1NiwgZmFsc2UsIE5VTEwgfSwgLyogY2VsY2l1cyAobnYxMCkgKi8KKwl7IDB4MDA5NiwgZmFsc2UsIE5VTEwgfSwgLyogY2VsY2l1cyAobnYxMSkgKi8KKwl7IDB4MDA5OSwgZmFsc2UsIE5VTEwgfSwgLyogY2VsY2l1cyAobnYxNykgKi8KKwl7fQorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MTdfZ3Bpby5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxN19ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU1OGMzMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MTdfZ3Bpby5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRnJhbmNpc2NvIEplcmV6LgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfaHcuaCIKKworc3RhdGljIGJvb2wKK2dldF9ncGlvX2xvY2F0aW9uKHN0cnVjdCBkY2JfZ3Bpb19lbnRyeSAqZW50LCB1aW50MzJfdCAqcmVnLCB1aW50MzJfdCAqc2hpZnQsCisJCSAgdWludDMyX3QgKm1hc2spCit7CisJaWYgKGVudC0+bGluZSA8IDIpIHsKKwkJKnJlZyA9IE5WX1BDUlRDX0dQSU87CisJCSpzaGlmdCA9IGVudC0+bGluZSAqIDE2OworCQkqbWFzayA9IDB4MTE7CisKKwl9IGVsc2UgaWYgKGVudC0+bGluZSA8IDEwKSB7CisJCSpyZWcgPSBOVl9QQ1JUQ19HUElPX0VYVDsKKwkJKnNoaWZ0ID0gKGVudC0+bGluZSAtIDIpICogNDsKKwkJKm1hc2sgPSAweDM7CisKKwl9IGVsc2UgaWYgKGVudC0+bGluZSA8IDE0KSB7CisJCSpyZWcgPSBOVl9QQ1JUQ184NTA7CisJCSpzaGlmdCA9IChlbnQtPmxpbmUgLSAxMCkgKiA0OworCQkqbWFzayA9IDB4MzsKKworCX0gZWxzZSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworaW50CitudjE3X2dwaW9fZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGVudW0gZGNiX2dwaW9fdGFnIHRhZykKK3sKKwlzdHJ1Y3QgZGNiX2dwaW9fZW50cnkgKmVudCA9IG5vdXZlYXVfYmlvc19ncGlvX2VudHJ5KGRldiwgdGFnKTsKKwl1aW50MzJfdCByZWcsIHNoaWZ0LCBtYXNrLCB2YWx1ZTsKKworCWlmICghZW50KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghZ2V0X2dwaW9fbG9jYXRpb24oZW50LCAmcmVnLCAmc2hpZnQsICZtYXNrKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl2YWx1ZSA9IE5WUmVhZENSVEMoZGV2LCAwLCByZWcpID4+IHNoaWZ0OworCisJcmV0dXJuIChlbnQtPmludmVydCA/IDEgOiAwKSBeICh2YWx1ZSAmIDEpOworfQorCitpbnQKK252MTdfZ3Bpb19zZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZW51bSBkY2JfZ3Bpb190YWcgdGFnLCBpbnQgc3RhdGUpCit7CisJc3RydWN0IGRjYl9ncGlvX2VudHJ5ICplbnQgPSBub3V2ZWF1X2Jpb3NfZ3Bpb19lbnRyeShkZXYsIHRhZyk7CisJdWludDMyX3QgcmVnLCBzaGlmdCwgbWFzaywgdmFsdWU7CisKKwlpZiAoIWVudCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIWdldF9ncGlvX2xvY2F0aW9uKGVudCwgJnJlZywgJnNoaWZ0LCAmbWFzaykpCisJCXJldHVybiAtRU5PREVWOworCisJdmFsdWUgPSAoKGVudC0+aW52ZXJ0ID8gMSA6IDApIF4gKHN0YXRlID8gMSA6IDApKSA8PCBzaGlmdDsKKwltYXNrID0gfihtYXNrIDw8IHNoaWZ0KTsKKworCU5WV3JpdGVDUlRDKGRldiwgMCwgcmVnLCB2YWx1ZSB8IChOVlJlYWRDUlRDKGRldiwgMCwgcmVnKSAmIG1hc2spKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxN190di5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxN190di5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2Y2ZkOWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjE3X3R2LmMKQEAgLTAsMCArMSw2ODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRnJhbmNpc2NvIEplcmV6LgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm1fY3J0Y19oZWxwZXIuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZW5jb2Rlci5oIgorI2luY2x1ZGUgIm5vdXZlYXVfY29ubmVjdG9yLmgiCisjaW5jbHVkZSAibm91dmVhdV9jcnRjLmgiCisjaW5jbHVkZSAibm91dmVhdV9ody5oIgorI2luY2x1ZGUgIm52MTdfdHYuaCIKKworZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBudjE3X3R2X2RldGVjdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJCSBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCQkJCQkgdWludDMyX3QgcGluX21hc2spCit7CisJc3RydWN0IG52MTdfdHZfZW5jb2RlciAqdHZfZW5jID0gdG9fdHZfZW5jKGVuY29kZXIpOworCisJdHZfZW5jLT5waW5fbWFzayA9IHBpbl9tYXNrID4+IDI4ICYgMHhlOworCisJc3dpdGNoICh0dl9lbmMtPnBpbl9tYXNrKSB7CisJY2FzZSAweDI6CisJY2FzZSAweDQ6CisJCXR2X2VuYy0+c3ViY29ubmVjdG9yID0gRFJNX01PREVfU1VCQ09OTkVDVE9SX0NvbXBvc2l0ZTsKKwkJYnJlYWs7CisJY2FzZSAweGM6CisJCXR2X2VuYy0+c3ViY29ubmVjdG9yID0gRFJNX01PREVfU1VCQ09OTkVDVE9SX1NWSURFTzsKKwkJYnJlYWs7CisJY2FzZSAweGU6CisJCWlmIChub3V2ZWF1X2VuY29kZXIoZW5jb2RlciktPmRjYi0+dHZjb25mLmhhc19jb21wb25lbnRfb3V0cHV0KQorCQkJdHZfZW5jLT5zdWJjb25uZWN0b3IgPSBEUk1fTU9ERV9TVUJDT05ORUNUT1JfQ29tcG9uZW50OworCQllbHNlCisJCQl0dl9lbmMtPnN1YmNvbm5lY3RvciA9IERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9TQ0FSVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdHZfZW5jLT5zdWJjb25uZWN0b3IgPSBEUk1fTU9ERV9TVUJDT05ORUNUT1JfVW5rbm93bjsKKwkJYnJlYWs7CisJfQorCisJZHJtX2Nvbm5lY3Rvcl9wcm9wZXJ0eV9zZXRfdmFsdWUoY29ubmVjdG9yLAorCQkJZW5jb2Rlci0+ZGV2LT5tb2RlX2NvbmZpZy50dl9zdWJjb25uZWN0b3JfcHJvcGVydHksCisJCQkJCQkJdHZfZW5jLT5zdWJjb25uZWN0b3IpOworCisJcmV0dXJuIHR2X2VuYy0+c3ViY29ubmVjdG9yID8gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQgOgorCQkJCQljb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJaW50IGhkaXNwbGF5OworCWludCB2ZGlzcGxheTsKK30gbW9kZXNbXSA9IHsKKwl7IDY0MCwgNDAwIH0sCisJeyA2NDAsIDQ4MCB9LAorCXsgNzIwLCA0ODAgfSwKKwl7IDcyMCwgNTc2IH0sCisJeyA4MDAsIDYwMCB9LAorCXsgMTAyNCwgNzY4IH0sCisJeyAxMjgwLCA3MjAgfSwKKwl7IDEyODAsIDEwMjQgfSwKKwl7IDE5MjAsIDEwODAgfQorfTsKKworc3RhdGljIGludCBudjE3X3R2X2dldF9tb2RlcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkgICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IG52MTdfdHZfbm9ybV9wYXJhbXMgKnR2X25vcm0gPSBnZXRfdHZfbm9ybShlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqb3V0cHV0X21vZGU7CisJaW50IG4gPSAwOworCWludCBpOworCisJaWYgKHR2X25vcm0tPmtpbmQgIT0gQ1RWX0VOQ19NT0RFKSB7CisJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICp0dl9tb2RlOworCisJCWZvciAodHZfbW9kZSA9IG52MTdfdHZfbW9kZXM7IHR2X21vZGUtPmhkaXNwbGF5OyB0dl9tb2RlKyspIHsKKwkJCW1vZGUgPSBkcm1fbW9kZV9kdXBsaWNhdGUoZW5jb2Rlci0+ZGV2LCB0dl9tb2RlKTsKKworCQkJbW9kZS0+Y2xvY2sgPSB0dl9ub3JtLT50dl9lbmNfbW9kZS52cmVmcmVzaCAqCisJCQkJCQltb2RlLT5odG90YWwgLyAxMDAwICoKKwkJCQkJCW1vZGUtPnZ0b3RhbCAvIDEwMDA7CisKKwkJCWlmIChtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfREJMU0NBTikKKwkJCQltb2RlLT5jbG9jayAqPSAyOworCisJCQlpZiAobW9kZS0+aGRpc3BsYXkgPT0gdHZfbm9ybS0+dHZfZW5jX21vZGUuaGRpc3BsYXkgJiYKKwkJCSAgICBtb2RlLT52ZGlzcGxheSA9PSB0dl9ub3JtLT50dl9lbmNfbW9kZS52ZGlzcGxheSkKKwkJCQltb2RlLT50eXBlIHw9IERSTV9NT0RFX1RZUEVfUFJFRkVSUkVEOworCisJCQlkcm1fbW9kZV9wcm9iZWRfYWRkKGNvbm5lY3RvciwgbW9kZSk7CisJCQluKys7CisJCX0KKwkJcmV0dXJuIG47CisJfQorCisJLyogdHZfbm9ybS0+a2luZCA9PSBDVFZfRU5DX01PREUgKi8KKwlvdXRwdXRfbW9kZSA9ICZ0dl9ub3JtLT5jdHZfZW5jX21vZGUubW9kZTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtb2Rlcyk7IGkrKykgeworCQlpZiAobW9kZXNbaV0uaGRpc3BsYXkgPiBvdXRwdXRfbW9kZS0+aGRpc3BsYXkgfHwKKwkJICAgIG1vZGVzW2ldLnZkaXNwbGF5ID4gb3V0cHV0X21vZGUtPnZkaXNwbGF5KQorCQkJY29udGludWU7CisKKwkJaWYgKG1vZGVzW2ldLmhkaXNwbGF5ID09IG91dHB1dF9tb2RlLT5oZGlzcGxheSAmJgorCQkgICAgbW9kZXNbaV0udmRpc3BsYXkgPT0gb3V0cHV0X21vZGUtPnZkaXNwbGF5KSB7CisJCQltb2RlID0gZHJtX21vZGVfZHVwbGljYXRlKGVuY29kZXItPmRldiwgb3V0cHV0X21vZGUpOworCQkJbW9kZS0+dHlwZSB8PSBEUk1fTU9ERV9UWVBFX1BSRUZFUlJFRDsKKwkJfSBlbHNlIHsKKwkJCW1vZGUgPSBkcm1fY3Z0X21vZGUoZW5jb2Rlci0+ZGV2LCBtb2Rlc1tpXS5oZGlzcGxheSwKKwkJCQltb2Rlc1tpXS52ZGlzcGxheSwgNjAsIGZhbHNlLAorCQkJCW91dHB1dF9tb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFLAorCQkJCWZhbHNlKTsKKwkJfQorCisJCS8qIENWVCBtb2RlcyBhcmUgc29tZXRpbWVzIHVuc3VpdGFibGUuLi4gKi8KKwkJaWYgKG91dHB1dF9tb2RlLT5oZGlzcGxheSA8PSA3MjAKKwkJICAgIHx8IG91dHB1dF9tb2RlLT5oZGlzcGxheSA+PSAxOTIwKSB7CisJCQltb2RlLT5odG90YWwgPSBvdXRwdXRfbW9kZS0+aHRvdGFsOworCQkJbW9kZS0+aHN5bmNfc3RhcnQgPSAobW9kZS0+aGRpc3BsYXkgKyAobW9kZS0+aHRvdGFsCisJCQkJCSAgICAgLSBtb2RlLT5oZGlzcGxheSkgKiA5IC8gMTApICYgfjc7CisJCQltb2RlLT5oc3luY19lbmQgPSBtb2RlLT5oc3luY19zdGFydCArIDg7CisJCX0KKwkJaWYgKG91dHB1dF9tb2RlLT52ZGlzcGxheSA+PSAxMDI0KSB7CisJCQltb2RlLT52dG90YWwgPSBvdXRwdXRfbW9kZS0+dnRvdGFsOworCQkJbW9kZS0+dnN5bmNfc3RhcnQgPSBvdXRwdXRfbW9kZS0+dnN5bmNfc3RhcnQ7CisJCQltb2RlLT52c3luY19lbmQgPSBvdXRwdXRfbW9kZS0+dnN5bmNfZW5kOworCQl9CisKKwkJbW9kZS0+dHlwZSB8PSBEUk1fTU9ERV9UWVBFX0RSSVZFUjsKKwkJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG1vZGUpOworCQluKys7CisJfQorCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IG52MTdfdHZfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwlzdHJ1Y3QgbnYxN190dl9ub3JtX3BhcmFtcyAqdHZfbm9ybSA9IGdldF90dl9ub3JtKGVuY29kZXIpOworCisJaWYgKHR2X25vcm0tPmtpbmQgPT0gQ1RWX0VOQ19NT0RFKSB7CisJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpvdXRwdXRfbW9kZSA9CisJCQkJCQkmdHZfbm9ybS0+Y3R2X2VuY19tb2RlLm1vZGU7CisKKwkJaWYgKG1vZGUtPmNsb2NrID4gNDAwMDAwKQorCQkJcmV0dXJuIE1PREVfQ0xPQ0tfSElHSDsKKworCQlpZiAobW9kZS0+aGRpc3BsYXkgPiBvdXRwdXRfbW9kZS0+aGRpc3BsYXkgfHwKKwkJICAgIG1vZGUtPnZkaXNwbGF5ID4gb3V0cHV0X21vZGUtPnZkaXNwbGF5KQorCQkJcmV0dXJuIE1PREVfQkFEOworCisJCWlmICgobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkgIT0KKwkJICAgIChvdXRwdXRfbW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkpCisJCQlyZXR1cm4gTU9ERV9OT19JTlRFUkxBQ0U7CisKKwkJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19EQkxTQ0FOKQorCQkJcmV0dXJuIE1PREVfTk9fREJMRVNDQU47CisKKwl9IGVsc2UgeworCQljb25zdCBpbnQgdnN5bmNfdG9sZXJhbmNlID0gNjAwOworCisJCWlmIChtb2RlLT5jbG9jayA+IDcwMDAwKQorCQkJcmV0dXJuIE1PREVfQ0xPQ0tfSElHSDsKKworCQlpZiAoYWJzKGRybV9tb2RlX3ZyZWZyZXNoKG1vZGUpICogMTAwMCAtCisJCQl0dl9ub3JtLT50dl9lbmNfbW9kZS52cmVmcmVzaCkgPiB2c3luY190b2xlcmFuY2UpCisJCQlyZXR1cm4gTU9ERV9WU1lOQzsKKworCQkvKiBUaGUgZW5jb2RlciB0YWtlcyBjYXJlIG9mIHRoZSBhY3R1YWwgaW50ZXJsYWNpbmcgKi8KKwkJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpCisJCQlyZXR1cm4gTU9ERV9OT19JTlRFUkxBQ0U7CisJfQorCisJcmV0dXJuIE1PREVfT0s7Cit9CisKK3N0YXRpYyBib29sIG52MTdfdHZfbW9kZV9maXh1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJc3RydWN0IG52MTdfdHZfbm9ybV9wYXJhbXMgKnR2X25vcm0gPSBnZXRfdHZfbm9ybShlbmNvZGVyKTsKKworCWlmICh0dl9ub3JtLT5raW5kID09IENUVl9FTkNfTU9ERSkKKwkJYWRqdXN0ZWRfbW9kZS0+Y2xvY2sgPSB0dl9ub3JtLT5jdHZfZW5jX21vZGUubW9kZS5jbG9jazsKKwllbHNlCisJCWFkanVzdGVkX21vZGUtPmNsb2NrID0gOTAwMDA7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgIG52MTdfdHZfZHBtcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBtb2RlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IG52MTdfdHZfc3RhdGUgKnJlZ3MgPSAmdG9fdHZfZW5jKGVuY29kZXIpLT5zdGF0ZTsKKwlzdHJ1Y3QgbnYxN190dl9ub3JtX3BhcmFtcyAqdHZfbm9ybSA9IGdldF90dl9ub3JtKGVuY29kZXIpOworCisJaWYgKG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKS0+bGFzdF9kcG1zID09IG1vZGUpCisJCXJldHVybjsKKwlub3V2ZWF1X2VuY29kZXIoZW5jb2RlciktPmxhc3RfZHBtcyA9IG1vZGU7CisKKwlOVl9UUkFDRShkZXYsICJTZXR0aW5nIGRwbXMgbW9kZSAlZCBvbiBUViBlbmNvZGVyIChvdXRwdXQgJWQpXG4iLAorCQkgbW9kZSwgbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpLT5kY2ItPmluZGV4KTsKKworCXJlZ3MtPnB0dl8yMDAgJj0gfjE7CisKKwlpZiAodHZfbm9ybS0+a2luZCA9PSBDVFZfRU5DX01PREUpIHsKKwkJbnYwNF9kZnBfdXBkYXRlX2ZwX2NvbnRyb2woZW5jb2RlciwgbW9kZSk7CisKKwl9IGVsc2UgeworCQludjA0X2RmcF91cGRhdGVfZnBfY29udHJvbChlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09GRik7CisKKwkJaWYgKG1vZGUgPT0gRFJNX01PREVfRFBNU19PTikKKwkJCXJlZ3MtPnB0dl8yMDAgfD0gMTsKKwl9CisKKwludl9sb2FkX3B0dihkZXYsIHJlZ3MsIDIwMCk7CisKKwludjE3X2dwaW9fc2V0KGRldiwgRENCX0dQSU9fVFZEQUMxLCBtb2RlID09IERSTV9NT0RFX0RQTVNfT04pOworCW52MTdfZ3Bpb19zZXQoZGV2LCBEQ0JfR1BJT19UVkRBQzAsIG1vZGUgPT0gRFJNX01PREVfRFBNU19PTik7CisKKwludjA0X2RhY191cGRhdGVfZGFjY2xrKGVuY29kZXIsIG1vZGUgPT0gRFJNX01PREVfRFBNU19PTik7Cit9CisKK3N0YXRpYyB2b2lkIG52MTdfdHZfcHJlcGFyZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmhlbHBlciA9IGVuY29kZXItPmhlbHBlcl9wcml2YXRlOworCXN0cnVjdCBudjE3X3R2X25vcm1fcGFyYW1zICp0dl9ub3JtID0gZ2V0X3R2X25vcm0oZW5jb2Rlcik7CisJaW50IGhlYWQgPSBub3V2ZWF1X2NydGMoZW5jb2Rlci0+Y3J0YyktPmluZGV4OworCXVpbnQ4X3QgKmNyX2xjZCA9ICZkZXZfcHJpdi0+bW9kZV9yZWcuY3J0Y19yZWdbaGVhZF0uQ1JUQ1sKKwkJCQkJCQlOVl9DSU9fQ1JFX0xDRF9fSU5ERVhdOworCXVpbnQzMl90IGRhY2Nsa19vZmYgPSBOVl9QUkFNREFDX0RBQ0NMSyArCisJCQkJCW52MDRfZGFjX291dHB1dF9vZmZzZXQoZW5jb2Rlcik7CisJdWludDMyX3QgZGFjY2xrOworCisJaGVscGVyLT5kcG1zKGVuY29kZXIsIERSTV9NT0RFX0RQTVNfT0ZGKTsKKworCW52MDRfZGZwX2Rpc2FibGUoZGV2LCBoZWFkKTsKKworCS8qIFVuYmluZCBhbnkgRlAgZW5jb2RlcnMgZnJvbSB0aGlzIGhlYWQgaWYgd2UgbmVlZCB0aGUgRlAKKwkgKiBzdHVmZiBlbmFibGVkLiAqLworCWlmICh0dl9ub3JtLT5raW5kID09IENUVl9FTkNfTU9ERSkgeworCQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuYzsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuYywgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LCBoZWFkKSB7CisJCQlzdHJ1Y3QgZGNiX2VudHJ5ICpkY2IgPSBub3V2ZWF1X2VuY29kZXIoZW5jKS0+ZGNiOworCisJCQlpZiAoKGRjYi0+dHlwZSA9PSBPVVRQVVRfVE1EUyB8fAorCQkJICAgICBkY2ItPnR5cGUgPT0gT1VUUFVUX0xWRFMpICYmCisJCQkgICAgICFlbmMtPmNydGMgJiYKKwkJCSAgICAgbnYwNF9kZnBfZ2V0X2JvdW5kX2hlYWQoZGV2LCBkY2IpID09IGhlYWQpIHsKKwkJCQludjA0X2RmcF9iaW5kX2hlYWQoZGV2LCBkY2IsIGhlYWQgXiAxLAorCQkJCQkJZGV2X3ByaXYtPlZCSU9TLmZwLmR1YWxfbGluayk7CisJCQl9CisJCX0KKworCX0KKworCS8qIFNvbWUgTlY0eCBoYXZlIHVua25vd24gdmFsdWVzICgweDNmLCAweDUwLCAweDU0LCAweDZiLCAweDc5LCAweDdmKQorCSAqIGF0IExDRF9fSU5ERVggd2hpY2ggd2UgZG9uJ3QgYWx0ZXIKKwkgKi8KKwlpZiAoISgqY3JfbGNkICYgMHg0NCkpIHsKKwkJaWYgKHR2X25vcm0tPmtpbmQgPT0gQ1RWX0VOQ19NT0RFKQorCQkJKmNyX2xjZCA9IDB4MSB8IChoZWFkID8gMHgwIDogMHg4KTsKKwkJZWxzZQorCQkJKmNyX2xjZCA9IDA7CisJfQorCisJLyogU2V0IHRoZSBEQUNDTEsgcmVnaXN0ZXIgKi8KKwlkYWNjbGsgPSAoTlZSZWFkUkFNREFDKGRldiwgMCwgZGFjY2xrX29mZikgJiB+MHgzMCkgfCAweDE7CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl80MCkKKwkJZGFjY2xrIHw9IDB4MWEgPDwgMTY7CisKKwlpZiAodHZfbm9ybS0+a2luZCA9PSBDVFZfRU5DX01PREUpIHsKKwkJZGFjY2xrIHw9ICAweDIwOworCisJCWlmIChoZWFkKQorCQkJZGFjY2xrIHw9IDB4MTAwOworCQllbHNlCisJCQlkYWNjbGsgJj0gfjB4MTAwOworCisJfSBlbHNlIHsKKwkJZGFjY2xrIHw9IDB4MTA7CisKKwl9CisKKwlOVldyaXRlUkFNREFDKGRldiwgMCwgZGFjY2xrX29mZiwgZGFjY2xrKTsKK30KKworc3RhdGljIHZvaWQgbnYxN190dl9tb2RlX3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpkcm1fbW9kZSwKKwkJCSAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBoZWFkID0gbm91dmVhdV9jcnRjKGVuY29kZXItPmNydGMpLT5pbmRleDsKKwlzdHJ1Y3QgbnYwNF9jcnRjX3JlZyAqcmVncyA9ICZkZXZfcHJpdi0+bW9kZV9yZWcuY3J0Y19yZWdbaGVhZF07CisJc3RydWN0IG52MTdfdHZfc3RhdGUgKnR2X3JlZ3MgPSAmdG9fdHZfZW5jKGVuY29kZXIpLT5zdGF0ZTsKKwlzdHJ1Y3QgbnYxN190dl9ub3JtX3BhcmFtcyAqdHZfbm9ybSA9IGdldF90dl9ub3JtKGVuY29kZXIpOworCWludCBpOworCisJcmVncy0+Q1JUQ1tOVl9DSU9fQ1JFXzUzXSA9IDB4NDA7IC8qIEZQX0hUSU1JTkcgKi8KKwlyZWdzLT5DUlRDW05WX0NJT19DUkVfNTRdID0gMDsgLyogRlBfVlRJTUlORyAqLworCXJlZ3MtPnJhbWRhY182MzAgPSAweDI7IC8qIHR1cm4gb2ZmIGdyZWVuIG1vZGUgKHR2IHRlc3QgcGF0dGVybj8pICovCisJcmVncy0+dHZfc2V0dXAgPSAxOworCXJlZ3MtPnJhbWRhY184YzAgPSAweDA7CisKKwlpZiAodHZfbm9ybS0+a2luZCA9PSBUVl9FTkNfTU9ERSkgeworCQl0dl9yZWdzLT5wdHZfMjAwID0gMHgxMzExMTEwMDsKKwkJaWYgKGhlYWQpCisJCQl0dl9yZWdzLT5wdHZfMjAwIHw9IDB4MTA7CisKKwkJdHZfcmVncy0+cHR2XzIwYyA9IDB4ODA4MDEwOworCQl0dl9yZWdzLT5wdHZfMzA0ID0gMHgyZDAwMDAwOworCQl0dl9yZWdzLT5wdHZfNjAwID0gMHgwOworCQl0dl9yZWdzLT5wdHZfNjBjID0gMHgwOworCQl0dl9yZWdzLT5wdHZfNjEwID0gMHgxZTAwMDAwOworCisJCWlmICh0dl9ub3JtLT50dl9lbmNfbW9kZS52ZGlzcGxheSA9PSA1NzYpIHsKKwkJCXR2X3JlZ3MtPnB0dl81MDggPSAweDEyMDAwMDA7CisJCQl0dl9yZWdzLT5wdHZfNjE0ID0gMHgzMzsKKworCQl9IGVsc2UgaWYgKHR2X25vcm0tPnR2X2VuY19tb2RlLnZkaXNwbGF5ID09IDQ4MCkgeworCQkJdHZfcmVncy0+cHR2XzUwOCA9IDB4ZjAwMDAwOworCQkJdHZfcmVncy0+cHR2XzYxNCA9IDB4MTM7CisJCX0KKworCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl8zMCkgeworCQkJdHZfcmVncy0+cHR2XzUwMCA9IDB4ZThlMDsKKwkJCXR2X3JlZ3MtPnB0dl81MDQgPSAweDE3MTA7CisJCQl0dl9yZWdzLT5wdHZfNjA0ID0gMHgwOworCQkJdHZfcmVncy0+cHR2XzYwOCA9IDB4MDsKKwkJfSBlbHNlIHsKKwkJCWlmICh0dl9ub3JtLT50dl9lbmNfbW9kZS52ZGlzcGxheSA9PSA1NzYpIHsKKwkJCQl0dl9yZWdzLT5wdHZfNjA0ID0gMHgyMDsKKwkJCQl0dl9yZWdzLT5wdHZfNjA4ID0gMHgxMDsKKwkJCQl0dl9yZWdzLT5wdHZfNTAwID0gMHgxOTcxMDsKKwkJCQl0dl9yZWdzLT5wdHZfNTA0ID0gMHg2OGYwOworCisJCQl9IGVsc2UgaWYgKHR2X25vcm0tPnR2X2VuY19tb2RlLnZkaXNwbGF5ID09IDQ4MCkgeworCQkJCXR2X3JlZ3MtPnB0dl82MDQgPSAweDEwOworCQkJCXR2X3JlZ3MtPnB0dl82MDggPSAweDIwOworCQkJCXR2X3JlZ3MtPnB0dl81MDAgPSAweDRiOTA7CisJCQkJdHZfcmVncy0+cHR2XzUwNCA9IDB4MWI0ODA7CisJCQl9CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgMHg0MDsgaSsrKQorCQkJdHZfcmVncy0+dHZfZW5jW2ldID0gdHZfbm9ybS0+dHZfZW5jX21vZGUudHZfZW5jW2ldOworCisJfSBlbHNlIHsKKwkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm91dHB1dF9tb2RlID0KKwkJCQkJCSZ0dl9ub3JtLT5jdHZfZW5jX21vZGUubW9kZTsKKworCQkvKiBUaGUgcmVnaXN0ZXJzIGluIFBSQU1EQUMrMHhjMDAgY29udHJvbCBzb21lIHRpbWluZ3MgYW5kIENTQworCQkgKiBwYXJhbWV0ZXJzIGZvciB0aGUgQ1RWIGVuY29kZXIgKEl0J3Mgb25seSB1c2VkIGZvciAiSEQiIFRWCisJCSAqIG1vZGVzLCBJIGRvbid0IHRoaW5rIEkgaGF2ZSBlbm91Z2ggd29ya2luZyB0byBndWVzcyB3aGF0CisJCSAqIHRoZXkgZXhhY3RseSBtZWFuLi4uKSwgaXQncyBwcm9iYWJseSBjb25uZWN0ZWQgYXQgdGhlCisJCSAqIG91dHB1dCBvZiB0aGUgRlAgZW5jb2RlciwgYnV0IGl0IGFsc28gbmVlZHMgdGhlIGFuYWxvZworCQkgKiBlbmNvZGVyIGluIGl0cyBPUiBlbmFibGVkIGFuZCByb3V0ZWQgdG8gdGhlIGhlYWQgaXQncworCQkgKiB1c2luZy4gSXQncyBlbmFibGVkIHdpdGggdGhlIERBQ0NMSyByZWdpc3RlciwgYml0cyBbNTo0XS4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCAzODsgaSsrKQorCQkJcmVncy0+Y3R2X3JlZ3NbaV0gPSB0dl9ub3JtLT5jdHZfZW5jX21vZGUuY3R2X3JlZ3NbaV07CisKKwkJcmVncy0+ZnBfaG9yaXpfcmVnc1tGUF9ESVNQTEFZX0VORF0gPSBvdXRwdXRfbW9kZS0+aGRpc3BsYXkgLSAxOworCQlyZWdzLT5mcF9ob3Jpel9yZWdzW0ZQX1RPVEFMXSA9IG91dHB1dF9tb2RlLT5odG90YWwgLSAxOworCQlyZWdzLT5mcF9ob3Jpel9yZWdzW0ZQX1NZTkNfU1RBUlRdID0KKwkJCQkJCW91dHB1dF9tb2RlLT5oc3luY19zdGFydCAtIDE7CisJCXJlZ3MtPmZwX2hvcml6X3JlZ3NbRlBfU1lOQ19FTkRdID0gb3V0cHV0X21vZGUtPmhzeW5jX2VuZCAtIDE7CisJCXJlZ3MtPmZwX2hvcml6X3JlZ3NbRlBfQ1JUQ10gPSBvdXRwdXRfbW9kZS0+aGRpc3BsYXkgKworCQkJbWF4KChvdXRwdXRfbW9kZS0+aGRpc3BsYXktNjAwKS80MCAtIDEsIDEpOworCisJCXJlZ3MtPmZwX3ZlcnRfcmVnc1tGUF9ESVNQTEFZX0VORF0gPSBvdXRwdXRfbW9kZS0+dmRpc3BsYXkgLSAxOworCQlyZWdzLT5mcF92ZXJ0X3JlZ3NbRlBfVE9UQUxdID0gb3V0cHV0X21vZGUtPnZ0b3RhbCAtIDE7CisJCXJlZ3MtPmZwX3ZlcnRfcmVnc1tGUF9TWU5DX1NUQVJUXSA9CisJCQkJCQlvdXRwdXRfbW9kZS0+dnN5bmNfc3RhcnQgLSAxOworCQlyZWdzLT5mcF92ZXJ0X3JlZ3NbRlBfU1lOQ19FTkRdID0gb3V0cHV0X21vZGUtPnZzeW5jX2VuZCAtIDE7CisJCXJlZ3MtPmZwX3ZlcnRfcmVnc1tGUF9DUlRDXSA9IG91dHB1dF9tb2RlLT52ZGlzcGxheSAtIDE7CisKKwkJcmVncy0+ZnBfY29udHJvbCA9IE5WX1BSQU1EQUNfRlBfVEdfQ09OVFJPTF9ESVNQRU5fUE9TIHwKKwkJCU5WX1BSQU1EQUNfRlBfVEdfQ09OVFJPTF9SRUFEX1BST0cgfAorCQkJTlZfUFJBTURBQ19GUF9UR19DT05UUk9MX1dJRFRIXzEyOworCisJCWlmIChvdXRwdXRfbW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX1BWU1lOQykKKwkJCXJlZ3MtPmZwX2NvbnRyb2wgfD0gTlZfUFJBTURBQ19GUF9UR19DT05UUk9MX1ZTWU5DX1BPUzsKKwkJaWYgKG91dHB1dF9tb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfUEhTWU5DKQorCQkJcmVncy0+ZnBfY29udHJvbCB8PSBOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0xfSFNZTkNfUE9TOworCisJCXJlZ3MtPmZwX2RlYnVnXzAgPSBOVl9QUkFNREFDX0ZQX0RFQlVHXzBfWVdFSUdIVF9ST1VORCB8CisJCQlOVl9QUkFNREFDX0ZQX0RFQlVHXzBfWFdFSUdIVF9ST1VORCB8CisJCQlOVl9QUkFNREFDX0ZQX0RFQlVHXzBfWUlOVEVSUF9CSUxJTkVBUiB8CisJCQlOVl9QUkFNREFDX0ZQX0RFQlVHXzBfWElOVEVSUF9CSUxJTkVBUiB8CisJCQlOVl9SQU1EQUNfRlBfREVCVUdfMF9UTURTX0VOQUJMRUQgfAorCQkJTlZfUFJBTURBQ19GUF9ERUJVR18wX1lTQ0FMRV9FTkFCTEUgfAorCQkJTlZfUFJBTURBQ19GUF9ERUJVR18wX1hTQ0FMRV9FTkFCTEU7CisKKwkJcmVncy0+ZnBfZGVidWdfMiA9IDA7CisKKwkJcmVncy0+ZnBfbWFyZ2luX2NvbG9yID0gMHg4MDEwODA7CisKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG52MTdfdHZfY29tbWl0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhlbmNvZGVyLT5jcnRjKTsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmhlbHBlciA9IGVuY29kZXItPmhlbHBlcl9wcml2YXRlOworCisJaWYgKGdldF90dl9ub3JtKGVuY29kZXIpLT5raW5kID09IFRWX0VOQ19NT0RFKSB7CisJCW52MTdfdHZfdXBkYXRlX3Jlc2NhbGVyKGVuY29kZXIpOworCQludjE3X3R2X3VwZGF0ZV9wcm9wZXJ0aWVzKGVuY29kZXIpOworCX0gZWxzZSB7CisJCW52MTdfY3R2X3VwZGF0ZV9yZXNjYWxlcihlbmNvZGVyKTsKKwl9CisKKwludjE3X3R2X3N0YXRlX2xvYWQoZGV2LCAmdG9fdHZfZW5jKGVuY29kZXIpLT5zdGF0ZSk7CisKKwkvKiBUaGlzIGNvdWxkIHVzZSByZWZpbmVtZW50IGZvciBmbGF0cGFuZWxzLCBidXQgaXQgc2hvdWxkIHdvcmsgKi8KKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPCAweDQ0KQorCQlOVldyaXRlUkFNREFDKGRldiwgMCwgTlZfUFJBTURBQ19URVNUX0NPTlRST0wgKworCQkJCQludjA0X2RhY19vdXRwdXRfb2Zmc2V0KGVuY29kZXIpLAorCQkJCQkweGYwMDAwMDAwKTsKKwllbHNlCisJCU5WV3JpdGVSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDX1RFU1RfQ09OVFJPTCArCisJCQkJCW52MDRfZGFjX291dHB1dF9vZmZzZXQoZW5jb2RlciksCisJCQkJCTB4MDAxMDAwMDApOworCisJaGVscGVyLT5kcG1zKGVuY29kZXIsIERSTV9NT0RFX0RQTVNfT04pOworCisJTlZfSU5GTyhkZXYsICJPdXRwdXQgJXMgaXMgcnVubmluZyBvbiBDUlRDICVkIHVzaW5nIG91dHB1dCAlY1xuIiwKKwkJZHJtX2dldF9jb25uZWN0b3JfbmFtZSgKKwkJCSZub3V2ZWF1X2VuY29kZXJfY29ubmVjdG9yX2dldChudl9lbmNvZGVyKS0+YmFzZSksCisJCW52X2NydGMtPmluZGV4LCAnQCcgKyBmZnMobnZfZW5jb2Rlci0+ZGNiLT5vcikpOworfQorCitzdGF0aWMgdm9pZCBudjE3X3R2X3NhdmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IG52MTdfdHZfZW5jb2RlciAqdHZfZW5jID0gdG9fdHZfZW5jKGVuY29kZXIpOworCisJbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpLT5yZXN0b3JlLm91dHB1dCA9CisJCQkJCU5WUmVhZFJBTURBQyhkZXYsIDAsCisJCQkJCU5WX1BSQU1EQUNfREFDQ0xLICsKKwkJCQkJbnYwNF9kYWNfb3V0cHV0X29mZnNldChlbmNvZGVyKSk7CisKKwludjE3X3R2X3N0YXRlX3NhdmUoZGV2LCAmdHZfZW5jLT5zYXZlZF9zdGF0ZSk7CisKKwl0dl9lbmMtPnN0YXRlLnB0dl8yMDAgPSB0dl9lbmMtPnNhdmVkX3N0YXRlLnB0dl8yMDA7Cit9CisKK3N0YXRpYyB2b2lkIG52MTdfdHZfcmVzdG9yZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKworCU5WV3JpdGVSQU1EQUMoZGV2LCAwLCBOVl9QUkFNREFDX0RBQ0NMSyArCisJCQkJbnYwNF9kYWNfb3V0cHV0X29mZnNldChlbmNvZGVyKSwKKwkJCQlub3V2ZWF1X2VuY29kZXIoZW5jb2RlciktPnJlc3RvcmUub3V0cHV0KTsKKworCW52MTdfdHZfc3RhdGVfbG9hZChkZXYsICZ0b190dl9lbmMoZW5jb2RlciktPnNhdmVkX3N0YXRlKTsKK30KKworc3RhdGljIGludCBudjE3X3R2X2NyZWF0ZV9yZXNvdXJjZXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJCSAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGRybV9tb2RlX2NvbmZpZyAqY29uZiA9ICZkZXYtPm1vZGVfY29uZmlnOworCXN0cnVjdCBudjE3X3R2X2VuY29kZXIgKnR2X2VuYyA9IHRvX3R2X2VuYyhlbmNvZGVyKTsKKwlzdHJ1Y3QgZGNiX2VudHJ5ICpkY2IgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2RlciktPmRjYjsKKwlpbnQgbnVtX3R2X25vcm1zID0gZGNiLT50dmNvbmYuaGFzX2NvbXBvbmVudF9vdXRwdXQgPyBOVU1fVFZfTk9STVMgOgorCQkJCQkJCU5VTV9MRF9UVl9OT1JNUzsKKwlpbnQgaTsKKworCWlmIChub3V2ZWF1X3R2X25vcm0pIHsKKwkJZm9yIChpID0gMDsgaSA8IG51bV90dl9ub3JtczsgaSsrKSB7CisJCQlpZiAoIXN0cmNtcChudjE3X3R2X25vcm1fbmFtZXNbaV0sIG5vdXZlYXVfdHZfbm9ybSkpIHsKKwkJCQl0dl9lbmMtPnR2X25vcm0gPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKGkgPT0gbnVtX3R2X25vcm1zKQorCQkJTlZfV0FSTihkZXYsICJJbnZhbGlkIFRWIG5vcm0gc2V0dGluZyBcIiVzXCJcbiIsCisJCQkJbm91dmVhdV90dl9ub3JtKTsKKwl9CisKKwlkcm1fbW9kZV9jcmVhdGVfdHZfcHJvcGVydGllcyhkZXYsIG51bV90dl9ub3JtcywgbnYxN190dl9ub3JtX25hbWVzKTsKKworCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KGNvbm5lY3RvciwKKwkJCQkJY29uZi0+dHZfc2VsZWN0X3N1YmNvbm5lY3Rvcl9wcm9wZXJ0eSwKKwkJCQkJdHZfZW5jLT5zZWxlY3Rfc3ViY29ubmVjdG9yKTsKKwlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eShjb25uZWN0b3IsCisJCQkJCWNvbmYtPnR2X3N1YmNvbm5lY3Rvcl9wcm9wZXJ0eSwKKwkJCQkJdHZfZW5jLT5zdWJjb25uZWN0b3IpOworCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KGNvbm5lY3RvciwKKwkJCQkJY29uZi0+dHZfbW9kZV9wcm9wZXJ0eSwKKwkJCQkJdHZfZW5jLT50dl9ub3JtKTsKKwlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eShjb25uZWN0b3IsCisJCQkJCWNvbmYtPnR2X2ZsaWNrZXJfcmVkdWN0aW9uX3Byb3BlcnR5LAorCQkJCQl0dl9lbmMtPmZsaWNrZXIpOworCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KGNvbm5lY3RvciwKKwkJCQkJY29uZi0+dHZfc2F0dXJhdGlvbl9wcm9wZXJ0eSwKKwkJCQkJdHZfZW5jLT5zYXR1cmF0aW9uKTsKKwlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eShjb25uZWN0b3IsCisJCQkJCWNvbmYtPnR2X2h1ZV9wcm9wZXJ0eSwKKwkJCQkJdHZfZW5jLT5odWUpOworCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KGNvbm5lY3RvciwKKwkJCQkJY29uZi0+dHZfb3ZlcnNjYW5fcHJvcGVydHksCisJCQkJCXR2X2VuYy0+b3ZlcnNjYW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnYxN190dl9zZXRfcHJvcGVydHkoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkJc3RydWN0IGRybV9wcm9wZXJ0eSAqcHJvcGVydHksCisJCQkJdWludDY0X3QgdmFsKQoreworCXN0cnVjdCBkcm1fbW9kZV9jb25maWcgKmNvbmYgPSAmZW5jb2Rlci0+ZGV2LT5tb2RlX2NvbmZpZzsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGMgPSBlbmNvZGVyLT5jcnRjOworCXN0cnVjdCBudjE3X3R2X2VuY29kZXIgKnR2X2VuYyA9IHRvX3R2X2VuYyhlbmNvZGVyKTsKKwlzdHJ1Y3QgbnYxN190dl9ub3JtX3BhcmFtcyAqdHZfbm9ybSA9IGdldF90dl9ub3JtKGVuY29kZXIpOworCWJvb2wgbW9kZXNfY2hhbmdlZCA9IGZhbHNlOworCisJaWYgKHByb3BlcnR5ID09IGNvbmYtPnR2X292ZXJzY2FuX3Byb3BlcnR5KSB7CisJCXR2X2VuYy0+b3ZlcnNjYW4gPSB2YWw7CisJCWlmIChlbmNvZGVyLT5jcnRjKSB7CisJCQlpZiAodHZfbm9ybS0+a2luZCA9PSBDVFZfRU5DX01PREUpCisJCQkJbnYxN19jdHZfdXBkYXRlX3Jlc2NhbGVyKGVuY29kZXIpOworCQkJZWxzZQorCQkJCW52MTdfdHZfdXBkYXRlX3Jlc2NhbGVyKGVuY29kZXIpOworCQl9CisKKwl9IGVsc2UgaWYgKHByb3BlcnR5ID09IGNvbmYtPnR2X3NhdHVyYXRpb25fcHJvcGVydHkpIHsKKwkJaWYgKHR2X25vcm0tPmtpbmQgIT0gVFZfRU5DX01PREUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl0dl9lbmMtPnNhdHVyYXRpb24gPSB2YWw7CisJCW52MTdfdHZfdXBkYXRlX3Byb3BlcnRpZXMoZW5jb2Rlcik7CisKKwl9IGVsc2UgaWYgKHByb3BlcnR5ID09IGNvbmYtPnR2X2h1ZV9wcm9wZXJ0eSkgeworCQlpZiAodHZfbm9ybS0+a2luZCAhPSBUVl9FTkNfTU9ERSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXR2X2VuYy0+aHVlID0gdmFsOworCQludjE3X3R2X3VwZGF0ZV9wcm9wZXJ0aWVzKGVuY29kZXIpOworCisJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBjb25mLT50dl9mbGlja2VyX3JlZHVjdGlvbl9wcm9wZXJ0eSkgeworCQlpZiAodHZfbm9ybS0+a2luZCAhPSBUVl9FTkNfTU9ERSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXR2X2VuYy0+ZmxpY2tlciA9IHZhbDsKKwkJaWYgKGVuY29kZXItPmNydGMpCisJCQludjE3X3R2X3VwZGF0ZV9yZXNjYWxlcihlbmNvZGVyKTsKKworCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gY29uZi0+dHZfbW9kZV9wcm9wZXJ0eSkgeworCQlpZiAoY29ubmVjdG9yLT5kcG1zICE9IERSTV9NT0RFX0RQTVNfT0ZGKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJdHZfZW5jLT50dl9ub3JtID0gdmFsOworCisJCW1vZGVzX2NoYW5nZWQgPSB0cnVlOworCisJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBjb25mLT50dl9zZWxlY3Rfc3ViY29ubmVjdG9yX3Byb3BlcnR5KSB7CisJCWlmICh0dl9ub3JtLT5raW5kICE9IFRWX0VOQ19NT0RFKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJdHZfZW5jLT5zZWxlY3Rfc3ViY29ubmVjdG9yID0gdmFsOworCQludjE3X3R2X3VwZGF0ZV9wcm9wZXJ0aWVzKGVuY29kZXIpOworCisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG1vZGVzX2NoYW5nZWQpIHsKKwkJZHJtX2hlbHBlcl9wcm9iZV9zaW5nbGVfY29ubmVjdG9yX21vZGVzKGNvbm5lY3RvciwgMCwgMCk7CisKKwkJLyogRGlzYWJsZSB0aGUgY3J0YyB0byBlbnN1cmUgYSBmdWxsIG1vZGVzZXQgaXMKKwkJICogcGVyZm9ybWVkIHdoZW5ldmVyIGl0J3MgdHVybmVkIG9uIGFnYWluLiAqLworCQlpZiAoY3J0YykgeworCQkJc3RydWN0IGRybV9tb2RlX3NldCBtb2Rlc2V0ID0geworCQkJCS5jcnRjID0gY3J0YywKKwkJCX07CisKKwkJCWNydGMtPmZ1bmNzLT5zZXRfY29uZmlnKCZtb2Rlc2V0KTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBudjE3X3R2X2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBudjE3X3R2X2VuY29kZXIgKnR2X2VuYyA9IHRvX3R2X2VuYyhlbmNvZGVyKTsKKworCU5WX0RFQlVHKGVuY29kZXItPmRldiwgIlxuIik7CisKKwlkcm1fZW5jb2Rlcl9jbGVhbnVwKGVuY29kZXIpOworCWtmcmVlKHR2X2VuYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIG52MTdfdHZfaGVscGVyX2Z1bmNzID0geworCS5kcG1zID0gbnYxN190dl9kcG1zLAorCS5zYXZlID0gbnYxN190dl9zYXZlLAorCS5yZXN0b3JlID0gbnYxN190dl9yZXN0b3JlLAorCS5tb2RlX2ZpeHVwID0gbnYxN190dl9tb2RlX2ZpeHVwLAorCS5wcmVwYXJlID0gbnYxN190dl9wcmVwYXJlLAorCS5jb21taXQgPSBudjE3X3R2X2NvbW1pdCwKKwkubW9kZV9zZXQgPSBudjE3X3R2X21vZGVfc2V0LAorCS5kZXRlY3QgPSBudjE3X2RhY19kZXRlY3QsCit9OworCitzdGF0aWMgc3RydWN0IGRybV9lbmNvZGVyX3NsYXZlX2Z1bmNzIG52MTdfdHZfc2xhdmVfZnVuY3MgPSB7CisJLmdldF9tb2RlcyA9IG52MTdfdHZfZ2V0X21vZGVzLAorCS5tb2RlX3ZhbGlkID0gbnYxN190dl9tb2RlX3ZhbGlkLAorCS5jcmVhdGVfcmVzb3VyY2VzID0gbnYxN190dl9jcmVhdGVfcmVzb3VyY2VzLAorCS5zZXRfcHJvcGVydHkgPSBudjE3X3R2X3NldF9wcm9wZXJ0eSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2VuY29kZXJfZnVuY3MgbnYxN190dl9mdW5jcyA9IHsKKwkuZGVzdHJveSA9IG52MTdfdHZfZGVzdHJveSwKK307CisKK2ludCBudjE3X3R2X2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2VudHJ5ICplbnRyeSkKK3sKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CisJc3RydWN0IG52MTdfdHZfZW5jb2RlciAqdHZfZW5jID0gTlVMTDsKKworCXR2X2VuYyA9IGt6YWxsb2Moc2l6ZW9mKCp0dl9lbmMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXR2X2VuYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0dl9lbmMtPm92ZXJzY2FuID0gNTA7CisJdHZfZW5jLT5mbGlja2VyID0gNTA7CisJdHZfZW5jLT5zYXR1cmF0aW9uID0gNTA7CisJdHZfZW5jLT5odWUgPSAwOworCXR2X2VuYy0+dHZfbm9ybSA9IFRWX05PUk1fUEFMOworCXR2X2VuYy0+c3ViY29ubmVjdG9yID0gRFJNX01PREVfU1VCQ09OTkVDVE9SX1Vua25vd247CisJdHZfZW5jLT5zZWxlY3Rfc3ViY29ubmVjdG9yID0gRFJNX01PREVfU1VCQ09OTkVDVE9SX0F1dG9tYXRpYzsKKwl0dl9lbmMtPnBpbl9tYXNrID0gMDsKKworCWVuY29kZXIgPSB0b19kcm1fZW5jb2RlcigmdHZfZW5jLT5iYXNlKTsKKworCXR2X2VuYy0+YmFzZS5kY2IgPSBlbnRyeTsKKwl0dl9lbmMtPmJhc2Uub3IgPSBmZnMoZW50cnktPm9yKSAtIDE7CisKKwlkcm1fZW5jb2Rlcl9pbml0KGRldiwgZW5jb2RlciwgJm52MTdfdHZfZnVuY3MsIERSTV9NT0RFX0VOQ09ERVJfVFZEQUMpOworCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoZW5jb2RlciwgJm52MTdfdHZfaGVscGVyX2Z1bmNzKTsKKwl0b19lbmNvZGVyX3NsYXZlKGVuY29kZXIpLT5zbGF2ZV9mdW5jcyA9ICZudjE3X3R2X3NsYXZlX2Z1bmNzOworCisJZW5jb2Rlci0+cG9zc2libGVfY3J0Y3MgPSBlbnRyeS0+aGVhZHM7CisJZW5jb2Rlci0+cG9zc2libGVfY2xvbmVzID0gMDsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxN190di5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxN190di5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMDk3N2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjE3X3R2LmgKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRnJhbmNpc2NvIEplcmV6LgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX05WMTdfVFZfSF9fCisjZGVmaW5lIF9fTlYxN19UVl9IX18KKworc3RydWN0IG52MTdfdHZfc3RhdGUgeworCXVpbnQ4X3QgdHZfZW5jWzB4NDBdOworCisJdWludDMyX3QgaGZpbHRlcls0XVs3XTsKKwl1aW50MzJfdCBoZmlsdGVyMls0XVs3XTsKKwl1aW50MzJfdCB2ZmlsdGVyWzRdWzddOworCisJdWludDMyX3QgcHR2XzIwMDsKKwl1aW50MzJfdCBwdHZfMjA0OworCXVpbnQzMl90IHB0dl8yMDg7CisJdWludDMyX3QgcHR2XzIwYzsKKwl1aW50MzJfdCBwdHZfMzA0OworCXVpbnQzMl90IHB0dl81MDA7CisJdWludDMyX3QgcHR2XzUwNDsKKwl1aW50MzJfdCBwdHZfNTA4OworCXVpbnQzMl90IHB0dl82MDA7CisJdWludDMyX3QgcHR2XzYwNDsKKwl1aW50MzJfdCBwdHZfNjA4OworCXVpbnQzMl90IHB0dl82MGM7CisJdWludDMyX3QgcHR2XzYxMDsKKwl1aW50MzJfdCBwdHZfNjE0OworfTsKKworZW51bSBudjE3X3R2X25vcm17CisJVFZfTk9STV9QQUwsCisJVFZfTk9STV9QQUxfTSwKKwlUVl9OT1JNX1BBTF9OLAorCVRWX05PUk1fUEFMX05DLAorCVRWX05PUk1fTlRTQ19NLAorCVRWX05PUk1fTlRTQ19KLAorCU5VTV9MRF9UVl9OT1JNUywKKwlUVl9OT1JNX0hENDgwSSA9IE5VTV9MRF9UVl9OT1JNUywKKwlUVl9OT1JNX0hENDgwUCwKKwlUVl9OT1JNX0hENTc2SSwKKwlUVl9OT1JNX0hENTc2UCwKKwlUVl9OT1JNX0hENzIwUCwKKwlUVl9OT1JNX0hEMTA4MEksCisJTlVNX1RWX05PUk1TCit9OworCitzdHJ1Y3QgbnYxN190dl9lbmNvZGVyIHsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyIGJhc2U7CisKKwlzdHJ1Y3QgbnYxN190dl9zdGF0ZSBzdGF0ZTsKKwlzdHJ1Y3QgbnYxN190dl9zdGF0ZSBzYXZlZF9zdGF0ZTsKKworCWludCBvdmVyc2NhbjsKKwlpbnQgZmxpY2tlcjsKKwlpbnQgc2F0dXJhdGlvbjsKKwlpbnQgaHVlOworCWVudW0gbnYxN190dl9ub3JtIHR2X25vcm07CisJaW50IHN1YmNvbm5lY3RvcjsKKwlpbnQgc2VsZWN0X3N1YmNvbm5lY3RvcjsKKwl1aW50MzJfdCBwaW5fbWFzazsKK307CisjZGVmaW5lIHRvX3R2X2VuYyh4KSBjb250YWluZXJfb2Yobm91dmVhdV9lbmNvZGVyKHgpLAkJXAorCQkJCSAgc3RydWN0IG52MTdfdHZfZW5jb2RlciwgYmFzZSkKKworZXh0ZXJuIGNoYXIgKm52MTdfdHZfbm9ybV9uYW1lc1tOVU1fVFZfTk9STVNdOworCitleHRlcm4gc3RydWN0IG52MTdfdHZfbm9ybV9wYXJhbXMgeworCWVudW0geworCQlUVl9FTkNfTU9ERSwKKwkJQ1RWX0VOQ19NT0RFLAorCX0ga2luZDsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCWludCBoZGlzcGxheTsKKwkJCWludCB2ZGlzcGxheTsKKwkJCWludCB2cmVmcmVzaDsgLyogbUh6ICovCisKKwkJCXVpbnQ4X3QgdHZfZW5jWzB4NDBdOworCQl9IHR2X2VuY19tb2RlOworCisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSBtb2RlOworCisJCQl1aW50MzJfdCBjdHZfcmVnc1szOF07CisJCX0gY3R2X2VuY19tb2RlOworCX07CisKK30gbnYxN190dl9ub3Jtc1tOVU1fVFZfTk9STVNdOworI2RlZmluZSBnZXRfdHZfbm9ybShlbmMpICgmbnYxN190dl9ub3Jtc1t0b190dl9lbmMoZW5jKS0+dHZfbm9ybV0pCisKK2V4dGVybiBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSBudjE3X3R2X21vZGVzW107CisKK3N0YXRpYyBpbmxpbmUgaW50IGludGVycG9sYXRlKGludCB5MCwgaW50IHkxLCBpbnQgeTIsIGludCB4KQoreworCXJldHVybiB5MSArICh4IDwgNTAgPyB5MSAtIHkwIDogeTIgLSB5MSkgKiAoeCAtIDUwKSAvIDUwOworfQorCit2b2lkIG52MTdfdHZfc3RhdGVfc2F2ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgbnYxN190dl9zdGF0ZSAqc3RhdGUpOwordm9pZCBudjE3X3R2X3N0YXRlX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG52MTdfdHZfc3RhdGUgKnN0YXRlKTsKK3ZvaWQgbnYxN190dl91cGRhdGVfcHJvcGVydGllcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwordm9pZCBudjE3X3R2X3VwZGF0ZV9yZXNjYWxlcihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwordm9pZCBudjE3X2N0dl91cGRhdGVfcmVzY2FsZXIoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKKworLyogVFYgaGFyZHdhcmUgYWNjZXNzIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgbnZfd3JpdGVfcHR2KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IHJlZywgdWludDMyX3QgdmFsKQoreworCW52X3dyMzIoZGV2LCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgbnZfcmVhZF9wdHYoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgcmVnKQoreworCXJldHVybiBudl9yZDMyKGRldiwgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG52X3dyaXRlX3R2X2VuYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50OF90IHJlZywgdWludDhfdCB2YWwpCit7CisJbnZfd3JpdGVfcHR2KGRldiwgTlZfUFRWX1RWX0lOREVYLCByZWcpOworCW52X3dyaXRlX3B0dihkZXYsIE5WX1BUVl9UVl9EQVRBLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgbnZfcmVhZF90dl9lbmMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDhfdCByZWcpCit7CisJbnZfd3JpdGVfcHR2KGRldiwgTlZfUFRWX1RWX0lOREVYLCByZWcpOworCXJldHVybiBudl9yZWFkX3B0dihkZXYsIE5WX1BUVl9UVl9EQVRBKTsKK30KKworI2RlZmluZSBudl9sb2FkX3B0dihkZXYsIHN0YXRlLCByZWcpIG52X3dyaXRlX3B0dihkZXYsIE5WX1BUVl9PRkZTRVQgKyAweCMjcmVnLCBzdGF0ZS0+cHR2XyMjcmVnKQorI2RlZmluZSBudl9zYXZlX3B0dihkZXYsIHN0YXRlLCByZWcpIHN0YXRlLT5wdHZfIyNyZWcgPSBudl9yZWFkX3B0dihkZXYsIE5WX1BUVl9PRkZTRVQgKyAweCMjcmVnKQorI2RlZmluZSBudl9sb2FkX3R2X2VuYyhkZXYsIHN0YXRlLCByZWcpIG52X3dyaXRlX3R2X2VuYyhkZXYsIDB4IyNyZWcsIHN0YXRlLT50dl9lbmNbMHgjI3JlZ10pCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxN190dl9tb2Rlcy5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxN190dl9tb2Rlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NDY4M2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjE3X3R2X21vZGVzLmMKQEAgLTAsMCArMSw1ODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRnJhbmNpc2NvIEplcmV6LgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm1fY3J0Y19oZWxwZXIuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZW5jb2Rlci5oIgorI2luY2x1ZGUgIm5vdXZlYXVfY3J0Yy5oIgorI2luY2x1ZGUgIm5vdXZlYXVfaHcuaCIKKyNpbmNsdWRlICJudjE3X3R2LmgiCisKK2NoYXIgKm52MTdfdHZfbm9ybV9uYW1lc1tOVU1fVFZfTk9STVNdID0geworCVtUVl9OT1JNX1BBTF0gPSAiUEFMIiwKKwlbVFZfTk9STV9QQUxfTV0gPSAiUEFMLU0iLAorCVtUVl9OT1JNX1BBTF9OXSA9ICJQQUwtTiIsCisJW1RWX05PUk1fUEFMX05DXSA9ICJQQUwtTmMiLAorCVtUVl9OT1JNX05UU0NfTV0gPSAiTlRTQy1NIiwKKwlbVFZfTk9STV9OVFNDX0pdID0gIk5UU0MtSiIsCisJW1RWX05PUk1fSEQ0ODBJXSA9ICJoZDQ4MGkiLAorCVtUVl9OT1JNX0hENDgwUF0gPSAiaGQ0ODBwIiwKKwlbVFZfTk9STV9IRDU3NkldID0gImhkNTc2aSIsCisJW1RWX05PUk1fSEQ1NzZQXSA9ICJoZDU3NnAiLAorCVtUVl9OT1JNX0hENzIwUF0gPSAiaGQ3MjBwIiwKKwlbVFZfTk9STV9IRDEwODBJXSA9ICJoZDEwODBpIgorfTsKKworLyogVFYgc3RhbmRhcmQgc3BlY2lmaWMgcGFyYW1ldGVycyAqLworCitzdHJ1Y3QgbnYxN190dl9ub3JtX3BhcmFtcyBudjE3X3R2X25vcm1zW05VTV9UVl9OT1JNU10gPSB7CisJW1RWX05PUk1fUEFMXSA9IHsgVFZfRU5DX01PREUsIHsKKwkJCS50dl9lbmNfbW9kZSA9IHsgNzIwLCA1NzYsIDUwMDAwLCB7CisJCQkJCTB4MmEsIDB4OSwgMHg4YSwgMHhjYiwgMHgwLCAweDAsIDB4YiwgMHgxOCwKKwkJCQkJMHg3ZSwgMHg0MCwgMHg4YSwgMHgzNSwgMHgyNywgMHgwLCAweDM0LCAweDMsCisJCQkJCTB4M2UsIDB4MywgMHgxNywgMHgyMSwgMHgxYiwgMHgxYiwgMHgyNCwgMHg5YywKKwkJCQkJMHgxLCAweDAsIDB4ZiwgMHhmLCAweDYwLCAweDUsIDB4ZDMsIDB4MywKKwkJCQkJMHhkMywgMHg0LCAweGQ0LCAweDEsIDB4MiwgMHgwLCAweGEsIDB4NSwKKwkJCQkJMHgwLCAweDFhLCAweGZmLCAweDMsIDB4MTgsIDB4ZiwgMHg3OCwgMHgwLAorCQkJCQkweDAsIDB4YjQsIDB4MCwgMHgxNSwgMHg0OSwgMHgxMCwgMHgwLCAweDliLAorCQkJCQkweGJkLCAweDE1LCAweDUsIDB4MTUsIDB4M2UsIDB4MywgMHgwLCAweDAKKwkJCQl9IH0gfSB9LAorCisJW1RWX05PUk1fUEFMX01dID0geyBUVl9FTkNfTU9ERSwgeworCQkJLnR2X2VuY19tb2RlID0geyA3MjAsIDQ4MCwgNTk5NDAsIHsKKwkJCQkJMHgyMSwgMHhlNiwgMHhlZiwgMHhlMywgMHgwLCAweDAsIDB4YiwgMHgxOCwKKwkJCQkJMHg3ZSwgMHg0NCwgMHg3NiwgMHgzMiwgMHgyNSwgMHgwLCAweDNjLCAweDAsCisJCQkJCTB4M2MsIDB4MCwgMHgxNywgMHgyMSwgMHgxYiwgMHgxYiwgMHgyNCwgMHg4MywKKwkJCQkJMHgxLCAweDAsIDB4ZiwgMHhmLCAweDYwLCAweDUsIDB4ZDMsIDB4MSwKKwkJCQkJMHhjNSwgMHg0LCAweGM1LCAweDEsIDB4MiwgMHgwLCAweGEsIDB4NSwKKwkJCQkJMHgwLCAweDE4LCAweGZmLCAweDMsIDB4MjAsIDB4ZiwgMHg3OCwgMHgwLAorCQkJCQkweDAsIDB4YjQsIDB4MCwgMHgxNSwgMHg0MCwgMHgxMCwgMHgwLCAweDljLAorCQkJCQkweGM4LCAweDE1LCAweDUsIDB4MTUsIDB4M2MsIDB4MCwgMHgwLCAweDAKKwkJCQl9IH0gfSB9LAorCisJW1RWX05PUk1fUEFMX05dID0geyBUVl9FTkNfTU9ERSwgeworCQkJLnR2X2VuY19tb2RlID0geyA3MjAsIDU3NiwgNTAwMDAsIHsKKwkJCQkJMHgyYSwgMHg5LCAweDhhLCAweGNiLCAweDAsIDB4MCwgMHhiLCAweDE4LAorCQkJCQkweDdlLCAweDQwLCAweDhhLCAweDMyLCAweDI1LCAweDAsIDB4M2MsIDB4MCwKKwkJCQkJMHgzYywgMHgwLCAweDE3LCAweDIxLCAweDFiLCAweDFiLCAweDI0LCAweDljLAorCQkJCQkweDEsIDB4MCwgMHhmLCAweGYsIDB4NjAsIDB4NSwgMHhkMywgMHgxLAorCQkJCQkweGM1LCAweDQsIDB4YzUsIDB4MSwgMHgyLCAweDAsIDB4YSwgMHg1LAorCQkJCQkweDAsIDB4MWEsIDB4ZmYsIDB4MywgMHgxOCwgMHhmLCAweDc4LCAweDAsCisJCQkJCTB4MCwgMHhiNCwgMHgwLCAweDE1LCAweDQ5LCAweDEwLCAweDAsIDB4OWIsCisJCQkJCTB4YmQsIDB4MTUsIDB4NSwgMHgxNSwgMHgzYywgMHgwLCAweDAsIDB4MAorCQkJCX0gfSB9IH0sCisKKwlbVFZfTk9STV9QQUxfTkNdID0geyBUVl9FTkNfTU9ERSwgeworCQkJLnR2X2VuY19tb2RlID0geyA3MjAsIDU3NiwgNTAwMDAsIHsKKwkJCQkJMHgyMSwgMHhmNiwgMHg5NCwgMHg0NiwgMHgwLCAweDAsIDB4YiwgMHgxOCwKKwkJCQkJMHg3ZSwgMHg0NCwgMHg4YSwgMHgzNSwgMHgyNywgMHgwLCAweDM0LCAweDMsCisJCQkJCTB4M2UsIDB4MywgMHgxNywgMHgyMSwgMHgxYiwgMHgxYiwgMHgyNCwgMHg5YywKKwkJCQkJMHgxLCAweDAsIDB4ZiwgMHhmLCAweDYwLCAweDUsIDB4ZDMsIDB4MywKKwkJCQkJMHhkMywgMHg0LCAweGQ0LCAweDEsIDB4MiwgMHgwLCAweGEsIDB4NSwKKwkJCQkJMHgwLCAweDFhLCAweGZmLCAweDMsIDB4MTgsIDB4ZiwgMHg3OCwgMHgwLAorCQkJCQkweDAsIDB4YjQsIDB4MCwgMHgxNSwgMHg0OSwgMHgxMCwgMHgwLCAweDliLAorCQkJCQkweGJkLCAweDE1LCAweDUsIDB4MTUsIDB4M2UsIDB4MywgMHgwLCAweDAKKwkJCQl9IH0gfSB9LAorCisJW1RWX05PUk1fTlRTQ19NXSA9IHsgVFZfRU5DX01PREUsIHsKKwkJCS50dl9lbmNfbW9kZSA9IHsgNzIwLCA0ODAsIDU5OTQwLCB7CisJCQkJCTB4MjEsIDB4ZjAsIDB4N2MsIDB4MWYsIDB4MCwgMHgwLCAweGIsIDB4MTgsCisJCQkJCTB4N2UsIDB4NDQsIDB4NzYsIDB4NDgsIDB4MCwgMHgwLCAweDNjLCAweDAsCisJCQkJCTB4M2MsIDB4MCwgMHgxNywgMHgyMSwgMHgxYiwgMHgxYiwgMHgyNCwgMHg4MywKKwkJCQkJMHgxLCAweDAsIDB4ZiwgMHhmLCAweDYwLCAweDUsIDB4ZDMsIDB4MSwKKwkJCQkJMHhjNSwgMHg0LCAweGM1LCAweDEsIDB4MiwgMHgwLCAweGEsIDB4NSwKKwkJCQkJMHgwLCAweDE2LCAweGZmLCAweDMsIDB4MjAsIDB4ZiwgMHg3OCwgMHgwLAorCQkJCQkweDAsIDB4YjQsIDB4MCwgMHgxNSwgMHg0LCAweDEwLCAweDAsIDB4OWMsCisJCQkJCTB4YzgsIDB4MTUsIDB4NSwgMHgxNSwgMHgzYywgMHgwLCAweDAsIDB4MAorCQkJCX0gfSB9IH0sCisKKwlbVFZfTk9STV9OVFNDX0pdID0geyBUVl9FTkNfTU9ERSwgeworCQkJLnR2X2VuY19tb2RlID0geyA3MjAsIDQ4MCwgNTk5NDAsIHsKKwkJCQkJMHgyMSwgMHhmMCwgMHg3YywgMHgxZiwgMHgwLCAweDAsIDB4YiwgMHgxOCwKKwkJCQkJMHg3ZSwgMHg0NCwgMHg3NiwgMHg0OCwgMHgwLCAweDAsIDB4MzIsIDB4MCwKKwkJCQkJMHgzYywgMHgwLCAweDE3LCAweDIxLCAweDFiLCAweDFiLCAweDI0LCAweDgzLAorCQkJCQkweDEsIDB4MCwgMHhmLCAweGYsIDB4NjAsIDB4NSwgMHhkMywgMHgxLAorCQkJCQkweGNmLCAweDQsIDB4Y2YsIDB4MSwgMHgyLCAweDAsIDB4YSwgMHg1LAorCQkJCQkweDAsIDB4MTYsIDB4ZmYsIDB4MywgMHgyMCwgMHhmLCAweDc4LCAweDAsCisJCQkJCTB4MCwgMHhiNCwgMHgwLCAweDE1LCAweDQsIDB4MTAsIDB4MCwgMHhhNCwKKwkJCQkJMHhjOCwgMHgxNSwgMHg1LCAweDE1LCAweDNjLCAweDAsIDB4MCwgMHgwCisJCQkJfSB9IH0gfSwKKworCVtUVl9OT1JNX0hENDgwSV0gPSB7IFRWX0VOQ19NT0RFLCB7CisJCQkudHZfZW5jX21vZGUgPSB7IDcyMCwgNDgwLCA1OTk0MCwgeworCQkJCQkweDIxLCAweGYwLCAweDdjLCAweDFmLCAweDAsIDB4MCwgMHhiLCAweDE4LAorCQkJCQkweDdlLCAweDQ0LCAweDc2LCAweDQ4LCAweDAsIDB4MCwgMHgzMiwgMHgwLAorCQkJCQkweDNjLCAweDAsIDB4MTcsIDB4MjEsIDB4MWIsIDB4MWIsIDB4MjQsIDB4ODMsCisJCQkJCTB4MSwgMHgwLCAweGYsIDB4ZiwgMHg2MCwgMHg1LCAweGQzLCAweDEsCisJCQkJCTB4Y2YsIDB4NCwgMHhjZiwgMHgxLCAweDIsIDB4MCwgMHhhLCAweDUsCisJCQkJCTB4MCwgMHgxNiwgMHhmZiwgMHgzLCAweDIwLCAweGYsIDB4NzgsIDB4MCwKKwkJCQkJMHgwLCAweGI0LCAweDAsIDB4MTUsIDB4NCwgMHgxMCwgMHgwLCAweGE0LAorCQkJCQkweGM4LCAweDE1LCAweDUsIDB4MTUsIDB4M2MsIDB4MCwgMHgwLCAweDAKKwkJCQl9IH0gfSB9LAorCisJW1RWX05PUk1fSEQ1NzZJXSA9IHsgVFZfRU5DX01PREUsIHsKKwkJCS50dl9lbmNfbW9kZSA9IHsgNzIwLCA1NzYsIDUwMDAwLCB7CisJCQkJCTB4MmEsIDB4OSwgMHg4YSwgMHhjYiwgMHgwLCAweDAsIDB4YiwgMHgxOCwKKwkJCQkJMHg3ZSwgMHg0MCwgMHg4YSwgMHgzNSwgMHgyNywgMHgwLCAweDM0LCAweDMsCisJCQkJCTB4M2UsIDB4MywgMHgxNywgMHgyMSwgMHgxYiwgMHgxYiwgMHgyNCwgMHg5YywKKwkJCQkJMHgxLCAweDAsIDB4ZiwgMHhmLCAweDYwLCAweDUsIDB4ZDMsIDB4MywKKwkJCQkJMHhkMywgMHg0LCAweGQ0LCAweDEsIDB4MiwgMHgwLCAweGEsIDB4NSwKKwkJCQkJMHgwLCAweDFhLCAweGZmLCAweDMsIDB4MTgsIDB4ZiwgMHg3OCwgMHgwLAorCQkJCQkweDAsIDB4YjQsIDB4MCwgMHgxNSwgMHg0OSwgMHgxMCwgMHgwLCAweDliLAorCQkJCQkweGJkLCAweDE1LCAweDUsIDB4MTUsIDB4M2UsIDB4MywgMHgwLCAweDAKKwkJCQl9IH0gfSB9LAorCisKKwlbVFZfTk9STV9IRDQ4MFBdID0geyBDVFZfRU5DX01PREUsIHsKKwkJCS5jdHZfZW5jX21vZGUgPSB7CisJCQkJLm1vZGUgPSB7IERSTV9NT0RFKCI3MjB4NDgwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDI3MDAwLAorCQkJCQkJICAgNzIwLCA3MzUsIDc0MywgODU4LCAwLCA0ODAsIDQ5MCwgNDk0LCA1MjUsIDAsCisJCQkJCQkgICBEUk1fTU9ERV9GTEFHX1BIU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DKSB9LAorCQkJCS5jdHZfcmVncyA9IHsgMHgzNTQwMDAwLCAweDAsIDB4MCwgMHgzMTQsCisJCQkJCSAgICAgIDB4MzU0MDAzYSwgMHg0MDAwMCwgMHg2ZjAzNDQsIDB4MTgxMDAwMDAsCisJCQkJCSAgICAgIDB4MTAxNjAwMDQsIDB4MTAwNjAwMDUsIDB4MTAwNjAwMGMsIDB4MTAwNjAwMjAsCisJCQkJCSAgICAgIDB4MTAwNjAwMjEsIDB4MTQwZTAwMjIsIDB4MTAwNjAyMDIsIDB4MTgwMjAyMGEsCisJCQkJCSAgICAgIDB4MTgxMDAyMGIsIDB4MTAwMDBmZmYsIDB4MTAwMDBmZmYsIDB4MTAwMDBmZmYsCisJCQkJCSAgICAgIDB4MTAwMDBmZmYsIDB4MTAwMDBmZmYsIDB4MTAwMDBmZmYsIDB4NzAsCisJCQkJCSAgICAgIDB4M2ZmMDAwMCwgMHg1NywgMHgyZTAwMWUsIDB4MjU4MDEyYywKKwkJCQkJICAgICAgMHhhMGFhMDRlYywgMHgzMCwgMHg4MDk2MDAxOSwgMHgxMmMwMzAwLAorCQkJCQkgICAgICAweDIwMTksIDB4NjAwLCAweDMyMDYwMDE5LCAweDAsIDB4MCwgMHg0MDAKKwkJCQl9IH0gfSB9LAorCisJW1RWX05PUk1fSEQ1NzZQXSA9IHsgQ1RWX0VOQ19NT0RFLCB7CisJCQkuY3R2X2VuY19tb2RlID0geworCQkJCS5tb2RlID0geyBEUk1fTU9ERSgiNzIweDU3NiIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAyNzAwMCwKKwkJCQkJCSAgIDcyMCwgNzMwLCA3MzgsIDg2NCwgMCwgNTc2LCA1ODEsIDU4NSwgNjI1LCAwLAorCQkJCQkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwKKwkJCQkuY3R2X3JlZ3MgPSB7IDB4MzU0MDAwMCwgMHgwLCAweDAsIDB4MzE0LAorCQkJCQkgICAgICAweDM1NDAwM2EsIDB4NDAwMDAsIDB4NmYwMzQ0LCAweDE4MTAwMDAwLAorCQkJCQkgICAgICAweDEwMDYwMDAxLCAweDEwMDYwMDA5LCAweDEwMDYwMDI2LCAweDEwMDYwMDI3LAorCQkJCQkgICAgICAweDE0MGUwMDI4LCAweDEwMDYwMjY4LCAweDE4MTAwMjZkLCAweDEwMDAwZmZmLAorCQkJCQkgICAgICAweDEwMDAwZmZmLCAweDEwMDAwZmZmLCAweDEwMDAwZmZmLCAweDEwMDAwZmZmLAorCQkJCQkgICAgICAweDEwMDAwZmZmLCAweDEwMDAwZmZmLCAweDEwMDAwZmZmLCAweDY5LAorCQkJCQkgICAgICAweDNmZjAwMDAsIDB4NTcsIDB4MmUwMDFlLCAweDI1ODAxMmMsCisJCQkJCSAgICAgIDB4YTBhYTA0ZWMsIDB4MzAsIDB4ODA5NjAwMTksIDB4MTJjMDMwMCwKKwkJCQkJICAgICAgMHgyMDE5LCAweDYwMCwgMHgzMjA2MDAxOSwgMHgwLCAweDAsIDB4NDAwCisJCQkJfSB9IH0gfSwKKworCVtUVl9OT1JNX0hENzIwUF0gPSB7IENUVl9FTkNfTU9ERSwgeworCQkJLmN0dl9lbmNfbW9kZSA9IHsKKwkJCQkubW9kZSA9IHsgRFJNX01PREUoIjEyODB4NzIwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDc0MjUwLAorCQkJCQkJICAgMTI4MCwgMTM0OSwgMTM1NywgMTY1MCwgMCwgNzIwLCA3MjUsIDczMCwgNzUwLCAwLAorCQkJCQkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwKKwkJCQkuY3R2X3JlZ3MgPSB7IDB4MTI2MDM5NCwgMHgwLCAweDAsIDB4NjIyLAorCQkJCQkgICAgICAweDY2YjAwMjEsIDB4NjAwNGEsIDB4MTIxMDYyNiwgMHg4MTcwMDAwLAorCQkJCQkgICAgICAweDcwMDA0LCAweDcwMDE2LCAweDcwMDE3LCAweDQwZjAwMTgsCisJCQkJCSAgICAgIDB4NzAyZTgsIDB4ODE3MDJlZCwgMHhmZmYsIDB4ZmZmLAorCQkJCQkgICAgICAweGZmZiwgMHhmZmYsIDB4ZmZmLCAweGZmZiwKKwkJCQkJICAgICAgMHhmZmYsIDB4ZmZmLCAweGZmZiwgMHgwLAorCQkJCQkgICAgICAweDJlNDAwMDEsIDB4NTgsIDB4MmUwMDFlLCAweDI1ODAxMmMsCisJCQkJCSAgICAgIDB4YTBhYTA0ZWMsIDB4MzAsIDB4ODEwYzAwMzksIDB4MTJjMDMwMCwKKwkJCQkJICAgICAgMHhjMDAwMjAzOSwgMHg2MDAsIDB4MzIwNjAwMzksIDB4MCwgMHgwLCAweDAKKwkJCQl9IH0gfSB9LAorCisJW1RWX05PUk1fSEQxMDgwSV0gPSB7IENUVl9FTkNfTU9ERSwgeworCQkJLmN0dl9lbmNfbW9kZSA9IHsKKwkJCQkubW9kZSA9IHsgRFJNX01PREUoIjE5MjB4MTA4MCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCA3NDI1MCwKKwkJCQkJCSAgIDE5MjAsIDE5NjEsIDIwNDksIDIyMDAsIDAsIDEwODAsIDEwODQsIDEwODgsIDExMjUsIDAsCisJCQkJCQkgICBEUk1fTU9ERV9GTEFHX1BIU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DCisJCQkJCQkgICB8IERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFKSB9LAorCQkJCS5jdHZfcmVncyA9IHsgMHhhYzA0MjAsIDB4NDRjMDQ3OCwgMHg0YTQsIDB4NGZjMDg2OCwKKwkJCQkJICAgICAgMHg4OTQwMDI4LCAweDYwMDU0LCAweGU4MDg3MCwgMHhiZjcwMDAwLAorCQkJCQkgICAgICAweGJjNzAwMDQsIDB4NzAwMDUsIDB4NzAwMTIsIDB4NzAwMTMsCisJCQkJCSAgICAgIDB4NDBmMDAxNCwgMHg3MDIzMCwgMHhiZjcwMjMyLCAweGJmNzAyMzMsCisJCQkJCSAgICAgIDB4MWM3MDIzNywgMHg3MDIzOCwgMHg3MDI0NCwgMHg3MDI0NSwKKwkJCQkJICAgICAgMHg0MGYwMjQ2LCAweDcwNDYyLCAweDFmNzA0NjQsIDB4MCwKKwkJCQkJICAgICAgMHgyZTQwMDAxLCAweDU4LCAweDJlMDAxZSwgMHgyNTgwMTJjLAorCQkJCQkgICAgICAweGEwYWEwNGVjLCAweDMwLCAweDgxNWYwMDRjLCAweDEyYzAzMDAsCisJCQkJCSAgICAgIDB4YzAwMDIwNGMsIDB4NjAwLCAweDMyMDYwMDRjLCAweDAsIDB4MCwgMHgwCisJCQkJfSB9IH0gfQorfTsKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgaXMgc29tZSBndWVzc3dvcmsgb24gaG93IHRoZSBUViBlbmNvZGVyIGZsaWNrZXIKKyAqIGZpbHRlci9yZXNjYWxlciB3b3JrczoKKyAqCisgKiBJdCBzZWVtcyB0byB1c2Ugc29tZSBzb3J0IG9mIHJlc2FtcGxpbmcgZmlsdGVyLCBpdCBpcyBjb250cm9sbGVkCisgKiB0aHJvdWdoIHRoZSByZWdpc3RlcnMgYXQgTlZfUFRWX0hGSUxURVIgYW5kIE5WX1BUVl9WRklMVEVSLCB0aGV5CisgKiBjb250cm9sIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBzdGFnZSByZXNwZWN0aXZlbHksIHRoZXJlIGlzCisgKiBhbHNvIE5WX1BUVl9IRklMVEVSMiB0aGUgYmxvYiBmaWxscyBpZGVudGljYWxseSB0byBOVl9QVFZfSEZJTFRFUiwKKyAqIGJ1dCB0aGV5IHNlZW0gdG8gZG8gbm90aGluZy4gQSByb3VnaCBndWVzcyBtaWdodCBiZSB0aGF0IHRoZXkgY291bGQKKyAqIGJlIHVzZWQgdG8gaW5kZXBlbmRlbnRseSBjb250cm9sIHRoZSBmaWx0ZXJpbmcgb2YgZWFjaCBpbnRlcmxhY2VkCisgKiBmaWVsZCwgYnV0IEkgZG9uJ3Qga25vdyBob3cgdGhleSBhcmUgZW5hYmxlZC4gVGhlIHdob2xlIGZpbHRlcmluZworICogcHJvY2VzcyBzZWVtcyB0byBiZSBkaXNhYmxlZCB3aXRoIGJpdHMgMjY6Mjcgb2YgUFRWXzIwMCwgYnV0IHdlCisgKiBhcmVuJ3QgZG9pbmcgdGhhdC4KKyAqCisgKiBUaGUgbGF5b3V0IG9mIGJvdGggcmVnaXN0ZXIgc2V0cyBpcyB0aGUgc2FtZToKKyAqCisgKiBBOiBbQkFTRSsweDE4XS4uLltCQVNFKzB4MF0gW0JBU0UrMHg1OF0uLltCQVNFKzB4NDBdCisgKiBCOiBbQkFTRSsweDM0XS4uLltCQVNFKzB4MWNdIFtCQVNFKzB4NzRdLi5bQkFTRSsweDVjXQorICoKKyAqIEVhY2ggY29lZmZpY2llbnQgaXMgc3RvcmVkIGluIGJpdHMgWzMxXSxbMTU6OV0gaW4gdHdvJ3MgY29tcGxlbWVudAorICogZm9ybWF0LiBUaGV5IHNlZW0gdG8gYmUgc29tZSBraW5kIG9mIHdlaWdodHMgdXNlZCBpbiBhIGxvdy1wYXNzCisgKiBmaWx0ZXIuIEJvdGggQSBhbmQgQiBjb2VmZmljaWVudHMgYXJlIGFwcGxpZWQgdG8gdGhlIDE0IG5lYXJlc3QKKyAqIHNhbXBsZXMgb24gZWFjaCBzaWRlIChMaXN0ZWQgZnJvbSBuZWFyZXN0IHRvIGZ1cnRoZXJtb3N0LiAgVGhleQorICogcm91Z2hseSBjb3ZlciAyIGZyYW1lYnVmZmVyIHBpeGVscyBvbiBlYWNoIHNpZGUpLiAgVGhleSBhcmUKKyAqIHByb2JhYmx5IG11bHRpcGxpZWQgd2l0aCBzb21lIG1vcmUgaGFyZHdpcmVkIHdlaWdodHMgYmVmb3JlIGJlaW5nCisgKiB1c2VkOiBCLWNvZWZmaWNpZW50cyBhcmUgYXBwbGllZCB0aGUgc2FtZSBvbiBib3RoIHNpZGVzLAorICogQS1jb2VmZmljaWVudHMgYXJlIGludmVydGVkIGJlZm9yZSBiZWluZyBhcHBsaWVkIHRvIHRoZSBvcHBvc2l0ZQorICogc2lkZS4KKyAqCisgKiBBZnRlciBhbGwgdGhlIGhhc3NsZSwgSSBnb3QgdGhlIGZvbGxvd2luZyBmb3JtdWxhIGJ5IGVtcGlyaWNhbAorICogbWVhbnMuLi4KKyAqLworCisjZGVmaW5lIGNhbGNfb3ZlcnNjYW4obykgaW50ZXJwb2xhdGUoMHgxMDAsIDB4ZTEsIDB4YzEsIG8pCisKKyNkZWZpbmUgaWQxICgxTEwgPDwgOCkKKyNkZWZpbmUgaWQyICgxTEwgPDwgMTYpCisjZGVmaW5lIGlkMyAoMUxMIDw8IDI0KQorI2RlZmluZSBpZDQgKDFMTCA8PCAzMikKKyNkZWZpbmUgaWQ1ICgxTEwgPDwgNDgpCisKK3N0YXRpYyBzdHJ1Y3QgZmlsdGVyX3BhcmFtc3sKKwlpbnQ2NF90IGsxOworCWludDY0X3Qga2k7CisJaW50NjRfdCBraTI7CisJaW50NjRfdCBraTM7CisJaW50NjRfdCBrcjsKKwlpbnQ2NF90IGtpcjsKKwlpbnQ2NF90IGtpMnI7CisJaW50NjRfdCBraTNyOworCWludDY0X3Qga2Y7CisJaW50NjRfdCBraWY7CisJaW50NjRfdCBraTJmOworCWludDY0X3Qga2kzZjsKKwlpbnQ2NF90IGtyZjsKKwlpbnQ2NF90IGtpcmY7CisJaW50NjRfdCBraTJyZjsKKwlpbnQ2NF90IGtpM3JmOworfSBmcGFyYW1zWzJdWzRdID0geworCS8qIEhvcml6b250YWwgZmlsdGVyIHBhcmFtZXRlcnMgKi8KKwl7CisJCXs2NC4zMTE2OTAgKiBpZDUsIC0zOS41MTY5MjQgKiBpZDUsIDYuNTg2MTQzICogaWQ1LCAwLjAwMDAwMiAqIGlkNSwKKwkJIDAuMDUxMjg1ICogaWQ0LCAyNi4xNjg3NDYgKiBpZDQsIC00LjM2MTQ0OSAqIGlkNCwgLTAuMDAwMDAxICogaWQ0LAorCQkgOS4zMDgxNjkgKiBpZDMsIDc4LjE4MDk2NSAqIGlkMywgLTEzLjAzMDE1OCAqIGlkMywgLTAuMDAwMDAxICogaWQzLAorCQkgLTguODAxNTQwICogaWQxLCAtNDYuNTcyODkwICogaWQxLCA3Ljc2MjE0NSAqIGlkMSwgLTAuMDAwMDAwICogaWQxfSwKKwkJey00NC41NjU1NjkgKiBpZDUsIC02OC4wODEyNDYgKiBpZDUsIDM5LjgxMjA3NCAqIGlkNSwgLTQuMDA5MzE2ICogaWQ1LAorCQkgMjkuODMyMjA3ICogaWQ0LCA1MC4wNDczMjIgKiBpZDQsIC0yNS4zODAwMTcgKiBpZDQsIDIuNTQ2NDIyICogaWQ0LAorCQkgMTA0LjYwNTYyMiAqIGlkMywgMTQxLjkwODY0MSAqIGlkMywgLTc0LjMyMjMxOSAqIGlkMywgNy40ODQzMTYgKiBpZDMsCisJCSAtMzcuMDgxNjIxICogaWQxLCAtOTAuMzk3NTEwICogaWQxLCA0Mi43ODQyMjkgKiBpZDEsIC00LjI4OTk1MiAqIGlkMX0sCisJCXstNTYuNzkzMjQ0ICogaWQ1LCAzMS4xNTM1ODQgKiBpZDUsIC01LjE5MjI0NyAqIGlkNSwgLTAuMDAwMDAzICogaWQ1LAorCQkgMzMuNTQxMTMxICogaWQ0LCAtMzQuMTQ5MzAyICogaWQ0LCA1LjY5MTUzNyAqIGlkNCwgMC4wMDAwMDIgKiBpZDQsCisJCSA4Ny4xOTY2MTAgKiBpZDMsIC04OC45OTUxNjkgKiBpZDMsIDE0LjgzMjQ1NiAqIGlkMywgMC4wMDAwMTIgKiBpZDMsCisJCSAxNy4yODgxMzggKiBpZDEsIDcxLjg2NDc4NiAqIGlkMSwgLTExLjk3NzQwOCAqIGlkMSwgLTAuMDAwMDA5ICogaWQxfSwKKwkJezUxLjc4Nzc5NiAqIGlkNSwgMjEuMjExNzcxICogaWQ1LCAtMTguOTkzNzMwICogaWQ1LCAxLjg1MzMxMCAqIGlkNSwKKwkJIC00MS40NzA3MjYgKiBpZDQsIC0xNy43NzU4MjMgKiBpZDQsIDEzLjA1NzgyMSAqIGlkNCwgLTEuMTU4MjMgKiBpZDQsCisJCSAtMTU0LjIzNTY3MyAqIGlkMywgLTQ0Ljg3ODY0MSAqIGlkMywgNDAuNjU2MDc3ICogaWQzLCAtMy42OTU1OTUgKiBpZDMsCisJCSAxMTIuMjAxMDY1ICogaWQxLCAzOS45OTIxNTUgKiBpZDEsIC0yNS4xNTU3MTQgKiBpZDEsIDIuMTEzOTg0ICogaWQxfSwKKwl9LAorCisJLyogVmVydGljYWwgZmlsdGVyIHBhcmFtZXRlcnMgKi8KKwl7CisJCXs2Ny42MDE5NzkgKiBpZDUsIDAuNDI4MzE5ICogaWQ1LCAtMC4wNzEzMTggKiBpZDUsIC0wLjAwMDAxMiAqIGlkNSwKKwkJIC0zLjQwMjMzOSAqIGlkNCwgMC4wMDAyMDkgKiBpZDQsIC0wLjAwMDA5MiAqIGlkNCwgMC4wMDAwMTAgKiBpZDQsCisJCSAtOS4xODA5OTYgKiBpZDMsIDYuMTExMjcwICogaWQzLCAtMS4wMjQ0NTcgKiBpZDMsIDAuMDAxMDQzICogaWQzLAorCQkgNi4wNjAzMTUgKiBpZDEsIC0wLjAxNzQyNSAqIGlkMSwgMC4wMDc4MzAgKiBpZDEsIC0wLjAwMDg2OSAqIGlkMX0sCisJCXs2Ljc1NTY0NyAqIGlkNSwgNS44NDEzNDggKiBpZDUsIDEuNDY5NzM0ICogaWQ1LCAtMC4xNDk2NTYgKiBpZDUsCisJCSA4LjI5MzEyMCAqIGlkNCwgLTEuMTkyODg4ICogaWQ0LCAtMC45NDc2NTIgKiBpZDQsIDAuMDk0NTA3ICogaWQ0LAorCQkgMzcuNTI2NjU1ICogaWQzLCAxMC4yNTc4NzUgKiBpZDMsIC0xMC44MjMyNzUgKiBpZDMsIDEuMDgxNDk3ICogaWQzLAorCQkgLTIuMzYxOTI4ICogaWQxLCAtMi4wNTk0MzIgKiBpZDEsIDEuODQwNjcxICogaWQxLCAtMC4xNjgxMDAgKiBpZDF9LAorCQl7LTE0Ljc4MDM5MSAqIGlkNSwgLTE2LjA0MjE0OCAqIGlkNSwgMi42NzM2OTIgKiBpZDUsIC0wLjAwMDAwMCAqIGlkNSwKKwkJIDM5LjU0MTk3OCAqIGlkNCwgNS42ODAwNTMgKiBpZDQsIC0wLjk0NjY3NiAqIGlkNCwgMC4wMDAwMDAgKiBpZDQsCisJCSAxNTIuOTk0NDg2ICogaWQzLCAxMi42MjU0MzkgKiBpZDMsIC0yLjExOTU3OSAqIGlkMywgMC4wMDI3MDggKiBpZDMsCisJCSAtMzguMTI1MDg5ICogaWQxLCAtMC44NTU4ODAgKiBpZDEsIDAuMTU1MzU5ICogaWQxLCAtMC4wMDIyNDUgKiBpZDF9LAorCQl7LTI3LjQ3NjE5MyAqIGlkNSwgLTEuNDU0OTc2ICogaWQ1LCAxLjI4NjU1NyAqIGlkNSwgMC4wMjUzNDYgKiBpZDUsCisJCSAyMC42ODczMDAgKiBpZDQsIDMuMDE0MDAzICogaWQ0LCAtMC41NTc3ODYgKiBpZDQsIC0wLjAxMzExICogaWQ0LAorCQkgNjAuMDA4NzM3ICogaWQzLCAtMC43MzgyNzMgKiBpZDMsIDUuNDA4MjE3ICogaWQzLCAtMC43OTY3OTggKiBpZDMsCisJCSAtMTcuMjk2ODM1ICogaWQxLCA0LjQzODU3NyAqIGlkMSwgLTIuODA5NDIwICogaWQxLCAwLjM4NTQ5MSAqIGlkMX0sCisJfQorfTsKKworc3RhdGljIHZvaWQgdHZfc2V0dXBfZmlsdGVyKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgbnYxN190dl9lbmNvZGVyICp0dl9lbmMgPSB0b190dl9lbmMoZW5jb2Rlcik7CisJc3RydWN0IG52MTdfdHZfbm9ybV9wYXJhbXMgKnR2X25vcm0gPSBnZXRfdHZfbm9ybShlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSA9ICZlbmNvZGVyLT5jcnRjLT5tb2RlOworCXVpbnQzMl90ICgqZmlsdGVyc1tdKVs0XVs3XSA9IHsmdHZfZW5jLT5zdGF0ZS5oZmlsdGVyLAorCQkJCSAgICAgICAmdHZfZW5jLT5zdGF0ZS52ZmlsdGVyfTsKKwlpbnQgaSwgaiwgazsKKwlpbnQzMl90IG92ZXJzY2FuID0gY2FsY19vdmVyc2Nhbih0dl9lbmMtPm92ZXJzY2FuKTsKKwlpbnQ2NF90IGZsaWNrZXIgPSAodHZfZW5jLT5mbGlja2VyIC0gNTApICogKGlkMyAvIDEwMCk7CisJdWludDY0X3QgcnNbXSA9IHttb2RlLT5oZGlzcGxheSAqIGlkMywKKwkJCSBtb2RlLT52ZGlzcGxheSAqIGlkM307CisKKwlkb19kaXYocnNbMF0sIG92ZXJzY2FuICogdHZfbm9ybS0+dHZfZW5jX21vZGUuaGRpc3BsYXkpOworCWRvX2Rpdihyc1sxXSwgb3ZlcnNjYW4gKiB0dl9ub3JtLT50dl9lbmNfbW9kZS52ZGlzcGxheSk7CisKKwlmb3IgKGsgPSAwOyBrIDwgMjsgaysrKSB7CisJCXJzW2tdID0gbWF4KChpbnQ2NF90KXJzW2tdLCBpZDIpOworCisJCWZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKwkJCXN0cnVjdCBmaWx0ZXJfcGFyYW1zICpwID0gJmZwYXJhbXNba11bal07CisKKwkJCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJCQlpbnQ2NF90IGMgPSAocC0+azEgKyBwLT5raSppICsgcC0+a2kyKmkqaSArIHAtPmtpMyppKmkqaSkKKwkJCQkJKyAocC0+a3IgKyBwLT5raXIqaSArIHAtPmtpMnIqaSppICsgcC0+a2kzcippKmkqaSkqcnNba10KKwkJCQkJKyAocC0+a2YgKyBwLT5raWYqaSArIHAtPmtpMmYqaSppICsgcC0+a2kzZippKmkqaSkqZmxpY2tlcgorCQkJCQkrIChwLT5rcmYgKyBwLT5raXJmKmkgKyBwLT5raTJyZippKmkgKyBwLT5raTNyZippKmkqaSkqZmxpY2tlcipyc1trXTsKKworCQkJCSgqZmlsdGVyc1trXSlbal1baV0gPSAoYyArIGlkNS8yKSA+PiAzOSAmICgweDEgPDwgMzEgfCAweDdmIDw8IDkpOworCQkJfQorCQl9CisJfQorfQorCisvKiBIYXJkd2FyZSBzdGF0ZSBzYXZpbmcvcmVzdG9yaW5nICovCisKK3N0YXRpYyB2b2lkIHR2X3NhdmVfZmlsdGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IGJhc2UsIHVpbnQzMl90IHJlZ3NbNF1bN10pCit7CisJaW50IGksIGo7CisJdWludDMyX3Qgb2Zmc2V0c1tdID0geyBiYXNlLCBiYXNlICsgMHgxYywgYmFzZSArIDB4NDAsIGJhc2UgKyAweDVjIH07CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCA3OyBqKyspCisJCQlyZWdzW2ldW2pdID0gbnZfcmVhZF9wdHYoZGV2LCBvZmZzZXRzW2ldKzQqaik7CisJfQorfQorCitzdGF0aWMgdm9pZCB0dl9sb2FkX2ZpbHRlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBiYXNlLCB1aW50MzJfdCByZWdzWzRdWzddKQoreworCWludCBpLCBqOworCXVpbnQzMl90IG9mZnNldHNbXSA9IHsgYmFzZSwgYmFzZSArIDB4MWMsIGJhc2UgKyAweDQwLCBiYXNlICsgMHg1YyB9OworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgNzsgaisrKQorCQkJbnZfd3JpdGVfcHR2KGRldiwgb2Zmc2V0c1tpXSs0KmosIHJlZ3NbaV1bal0pOworCX0KK30KKwordm9pZCBudjE3X3R2X3N0YXRlX3NhdmUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG52MTdfdHZfc3RhdGUgKnN0YXRlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDB4NDA7IGkrKykKKwkJc3RhdGUtPnR2X2VuY1tpXSA9IG52X3JlYWRfdHZfZW5jKGRldiwgaSk7CisKKwl0dl9zYXZlX2ZpbHRlcihkZXYsIE5WX1BUVl9IRklMVEVSLCBzdGF0ZS0+aGZpbHRlcik7CisJdHZfc2F2ZV9maWx0ZXIoZGV2LCBOVl9QVFZfSEZJTFRFUjIsIHN0YXRlLT5oZmlsdGVyMik7CisJdHZfc2F2ZV9maWx0ZXIoZGV2LCBOVl9QVFZfVkZJTFRFUiwgc3RhdGUtPnZmaWx0ZXIpOworCisJbnZfc2F2ZV9wdHYoZGV2LCBzdGF0ZSwgMjAwKTsKKwludl9zYXZlX3B0dihkZXYsIHN0YXRlLCAyMDQpOworCW52X3NhdmVfcHR2KGRldiwgc3RhdGUsIDIwOCk7CisJbnZfc2F2ZV9wdHYoZGV2LCBzdGF0ZSwgMjBjKTsKKwludl9zYXZlX3B0dihkZXYsIHN0YXRlLCAzMDQpOworCW52X3NhdmVfcHR2KGRldiwgc3RhdGUsIDUwMCk7CisJbnZfc2F2ZV9wdHYoZGV2LCBzdGF0ZSwgNTA0KTsKKwludl9zYXZlX3B0dihkZXYsIHN0YXRlLCA1MDgpOworCW52X3NhdmVfcHR2KGRldiwgc3RhdGUsIDYwMCk7CisJbnZfc2F2ZV9wdHYoZGV2LCBzdGF0ZSwgNjA0KTsKKwludl9zYXZlX3B0dihkZXYsIHN0YXRlLCA2MDgpOworCW52X3NhdmVfcHR2KGRldiwgc3RhdGUsIDYwYyk7CisJbnZfc2F2ZV9wdHYoZGV2LCBzdGF0ZSwgNjEwKTsKKwludl9zYXZlX3B0dihkZXYsIHN0YXRlLCA2MTQpOworfQorCit2b2lkIG52MTdfdHZfc3RhdGVfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgbnYxN190dl9zdGF0ZSAqc3RhdGUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMHg0MDsgaSsrKQorCQludl93cml0ZV90dl9lbmMoZGV2LCBpLCBzdGF0ZS0+dHZfZW5jW2ldKTsKKworCXR2X2xvYWRfZmlsdGVyKGRldiwgTlZfUFRWX0hGSUxURVIsIHN0YXRlLT5oZmlsdGVyKTsKKwl0dl9sb2FkX2ZpbHRlcihkZXYsIE5WX1BUVl9IRklMVEVSMiwgc3RhdGUtPmhmaWx0ZXIyKTsKKwl0dl9sb2FkX2ZpbHRlcihkZXYsIE5WX1BUVl9WRklMVEVSLCBzdGF0ZS0+dmZpbHRlcik7CisKKwludl9sb2FkX3B0dihkZXYsIHN0YXRlLCAyMDApOworCW52X2xvYWRfcHR2KGRldiwgc3RhdGUsIDIwNCk7CisJbnZfbG9hZF9wdHYoZGV2LCBzdGF0ZSwgMjA4KTsKKwludl9sb2FkX3B0dihkZXYsIHN0YXRlLCAyMGMpOworCW52X2xvYWRfcHR2KGRldiwgc3RhdGUsIDMwNCk7CisJbnZfbG9hZF9wdHYoZGV2LCBzdGF0ZSwgNTAwKTsKKwludl9sb2FkX3B0dihkZXYsIHN0YXRlLCA1MDQpOworCW52X2xvYWRfcHR2KGRldiwgc3RhdGUsIDUwOCk7CisJbnZfbG9hZF9wdHYoZGV2LCBzdGF0ZSwgNjAwKTsKKwludl9sb2FkX3B0dihkZXYsIHN0YXRlLCA2MDQpOworCW52X2xvYWRfcHR2KGRldiwgc3RhdGUsIDYwOCk7CisJbnZfbG9hZF9wdHYoZGV2LCBzdGF0ZSwgNjBjKTsKKwludl9sb2FkX3B0dihkZXYsIHN0YXRlLCA2MTApOworCW52X2xvYWRfcHR2KGRldiwgc3RhdGUsIDYxNCk7CisKKwkvKiBUaGlzIGlzIHJlcXVpcmVkIGZvciBzb21lIHNldHRpbmdzIHRvIGtpY2sgaW4uICovCisJbnZfd3JpdGVfdHZfZW5jKGRldiwgMHgzZSwgMSk7CisJbnZfd3JpdGVfdHZfZW5jKGRldiwgMHgzZSwgMCk7Cit9CisKKy8qIFRpbWluZ3Mgc2ltaWxhciB0byB0aGUgb25lcyB0aGUgYmxvYiBzZXRzICovCisKK3N0cnVjdCBkcm1fZGlzcGxheV9tb2RlIG52MTdfdHZfbW9kZXNbXSA9IHsKKwl7IERSTV9NT0RFKCIzMjB4MjAwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDAsCisJCSAgIDMyMCwgMzQ0LCAzOTIsIDU2MCwgMCwgMjAwLCAyMDAsIDIwMiwgMjIwLCAwLAorCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfTlZTWU5DCisJCSAgIHwgRFJNX01PREVfRkxBR19EQkxTQ0FOIHwgRFJNX01PREVfRkxBR19DTEtESVYyKSB9LAorCXsgRFJNX01PREUoIjMyMHgyNDAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMCwKKwkJICAgMzIwLCAzNDQsIDM5MiwgNTYwLCAwLCAyNDAsIDI0MCwgMjQ2LCAyNjMsIDAsCisJCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19OVlNZTkMKKwkJICAgfCBEUk1fTU9ERV9GTEFHX0RCTFNDQU4gfCBEUk1fTU9ERV9GTEFHX0NMS0RJVjIpIH0sCisJeyBEUk1fTU9ERSgiNDAweDMwMCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAwLAorCQkgICA0MDAsIDQzMiwgNDk2LCA2NDAsIDAsIDMwMCwgMzAwLCAzMDMsIDMxNCwgMCwKKwkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQworCQkgICB8IERSTV9NT0RFX0ZMQUdfREJMU0NBTiB8IERSTV9NT0RFX0ZMQUdfQ0xLRElWMikgfSwKKwl7IERSTV9NT0RFKCI2NDB4NDgwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDAsCisJCSAgIDY0MCwgNjcyLCA3NjgsIDg4MCwgMCwgNDgwLCA0ODAsIDQ5MiwgNTI1LCAwLAorCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfTlZTWU5DKSB9LAorCXsgRFJNX01PREUoIjcyMHg0ODAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMCwKKwkJICAgNzIwLCA3NTIsIDg3MiwgOTYwLCAwLCA0ODAsIDQ4MCwgNDkzLCA1MjUsIDAsCisJCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19OVlNZTkMpIH0sCisJeyBEUk1fTU9ERSgiNzIweDU3NiIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAwLAorCQkgICA3MjAsIDc3NiwgODU2LCA5NjAsIDAsIDU3NiwgNTc2LCA1ODgsIDU5NywgMCwKKwkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQykgfSwKKwl7IERSTV9NT0RFKCI4MDB4NjAwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDAsCisJCSAgIDgwMCwgODQwLCA5MjAsIDEwNDAsIDAsIDYwMCwgNjAwLCA2MDQsIDYxOCwgMCwKKwkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwKKwl7IERSTV9NT0RFKCIxMDI0eDc2OCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAwLAorCQkgICAxMDI0LCAxMDY0LCAxMjAwLCAxMzQ0LCAwLCA3NjgsIDc2OCwgNzc3LCA4MDYsIDAsCisJCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19OVlNZTkMpIH0sCisJe30KK307CisKK3ZvaWQgbnYxN190dl91cGRhdGVfcHJvcGVydGllcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgbnYxN190dl9lbmNvZGVyICp0dl9lbmMgPSB0b190dl9lbmMoZW5jb2Rlcik7CisJc3RydWN0IG52MTdfdHZfc3RhdGUgKnJlZ3MgPSAmdHZfZW5jLT5zdGF0ZTsKKwlzdHJ1Y3QgbnYxN190dl9ub3JtX3BhcmFtcyAqdHZfbm9ybSA9IGdldF90dl9ub3JtKGVuY29kZXIpOworCWludCBzdWJjb25uZWN0b3IgPSB0dl9lbmMtPnNlbGVjdF9zdWJjb25uZWN0b3IgPworCQkJCQkJdHZfZW5jLT5zZWxlY3Rfc3ViY29ubmVjdG9yIDoKKwkJCQkJCXR2X2VuYy0+c3ViY29ubmVjdG9yOworCisJc3dpdGNoIChzdWJjb25uZWN0b3IpIHsKKwljYXNlIERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9Db21wb3NpdGU6CisJeworCQlyZWdzLT5wdHZfMjA0ID0gMHgyOworCisJCS8qIFRoZSBjb21wb3NpdGUgY29ubmVjdG9yIG1heSBiZSBmb3VuZCBvbiBlaXRoZXIgcGluLiAqLworCQlpZiAodHZfZW5jLT5waW5fbWFzayAmIDB4NCkKKwkJCXJlZ3MtPnB0dl8yMDQgfD0gMHgwMTAwMDA7CisJCWVsc2UgaWYgKHR2X2VuYy0+cGluX21hc2sgJiAweDIpCisJCQlyZWdzLT5wdHZfMjA0IHw9IDB4MTAwMDAwOworCQllbHNlCisJCQlyZWdzLT5wdHZfMjA0IHw9IDB4MTEwMDAwOworCisJCXJlZ3MtPnR2X2VuY1sweDddID0gMHgxMDsKKwkJYnJlYWs7CisJfQorCWNhc2UgRFJNX01PREVfU1VCQ09OTkVDVE9SX1NWSURFTzoKKwkJcmVncy0+cHR2XzIwNCA9IDB4MTEwMTI7CisJCXJlZ3MtPnR2X2VuY1sweDddID0gMHgxODsKKwkJYnJlYWs7CisKKwljYXNlIERSTV9NT0RFX1NVQkNPTk5FQ1RPUl9Db21wb25lbnQ6CisJCXJlZ3MtPnB0dl8yMDQgPSAweDExMTMzMzsKKwkJcmVncy0+dHZfZW5jWzB4N10gPSAweDE0OworCQlicmVhazsKKworCWNhc2UgRFJNX01PREVfU1VCQ09OTkVDVE9SX1NDQVJUOgorCQlyZWdzLT5wdHZfMjA0ID0gMHgxMTEwMTI7CisJCXJlZ3MtPnR2X2VuY1sweDddID0gMHgxODsKKwkJYnJlYWs7CisJfQorCisJcmVncy0+dHZfZW5jWzB4MjBdID0gaW50ZXJwb2xhdGUoMCwgdHZfbm9ybS0+dHZfZW5jX21vZGUudHZfZW5jWzB4MjBdLCAyNTUsCisJCQkJCSB0dl9lbmMtPnNhdHVyYXRpb24pOworCXJlZ3MtPnR2X2VuY1sweDIyXSA9IGludGVycG9sYXRlKDAsIHR2X25vcm0tPnR2X2VuY19tb2RlLnR2X2VuY1sweDIyXSwgMjU1LAorCQkJCQkgdHZfZW5jLT5zYXR1cmF0aW9uKTsKKwlyZWdzLT50dl9lbmNbMHgyNV0gPSB0dl9lbmMtPmh1ZSAqIDI1NSAvIDEwMDsKKworCW52X2xvYWRfcHR2KGRldiwgcmVncywgMjA0KTsKKwludl9sb2FkX3R2X2VuYyhkZXYsIHJlZ3MsIDcpOworCW52X2xvYWRfdHZfZW5jKGRldiwgcmVncywgMjApOworCW52X2xvYWRfdHZfZW5jKGRldiwgcmVncywgMjIpOworCW52X2xvYWRfdHZfZW5jKGRldiwgcmVncywgMjUpOworfQorCit2b2lkIG52MTdfdHZfdXBkYXRlX3Jlc2NhbGVyKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBudjE3X3R2X2VuY29kZXIgKnR2X2VuYyA9IHRvX3R2X2VuYyhlbmNvZGVyKTsKKwlzdHJ1Y3QgbnYxN190dl9zdGF0ZSAqcmVncyA9ICZ0dl9lbmMtPnN0YXRlOworCisJcmVncy0+cHR2XzIwOCA9IDB4NDAgfCAoY2FsY19vdmVyc2Nhbih0dl9lbmMtPm92ZXJzY2FuKSA8PCA4KTsKKworCXR2X3NldHVwX2ZpbHRlcihlbmNvZGVyKTsKKworCW52X2xvYWRfcHR2KGRldiwgcmVncywgMjA4KTsKKwl0dl9sb2FkX2ZpbHRlcihkZXYsIE5WX1BUVl9IRklMVEVSLCByZWdzLT5oZmlsdGVyKTsKKwl0dl9sb2FkX2ZpbHRlcihkZXYsIE5WX1BUVl9IRklMVEVSMiwgcmVncy0+aGZpbHRlcjIpOworCXR2X2xvYWRfZmlsdGVyKGRldiwgTlZfUFRWX1ZGSUxURVIsIHJlZ3MtPnZmaWx0ZXIpOworfQorCit2b2lkIG52MTdfY3R2X3VwZGF0ZV9yZXNjYWxlcihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudjE3X3R2X2VuY29kZXIgKnR2X2VuYyA9IHRvX3R2X2VuYyhlbmNvZGVyKTsKKwlpbnQgaGVhZCA9IG5vdXZlYXVfY3J0YyhlbmNvZGVyLT5jcnRjKS0+aW5kZXg7CisJc3RydWN0IG52MDRfY3J0Y19yZWcgKnJlZ3MgPSAmZGV2X3ByaXYtPm1vZGVfcmVnLmNydGNfcmVnW2hlYWRdOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpjcnRjX21vZGUgPSAmZW5jb2Rlci0+Y3J0Yy0+bW9kZTsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqb3V0cHV0X21vZGUgPSAmZ2V0X3R2X25vcm0oZW5jb2RlciktPmN0dl9lbmNfbW9kZS5tb2RlOworCWludCBvdmVyc2NhbiwgaG1hcmdpbiwgdm1hcmdpbiwgaHJhdGlvLCB2cmF0aW87CisKKwkvKiBUaGUgcmVzY2FsZXIgZG9lc24ndCBkbyB0aGUgcmlnaHQgdGhpbmcgZm9yIGludGVybGFjZWQgbW9kZXMuICovCisJaWYgKG91dHB1dF9tb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFKQorCQlvdmVyc2NhbiA9IDEwMDsKKwllbHNlCisJCW92ZXJzY2FuID0gdHZfZW5jLT5vdmVyc2NhbjsKKworCWhtYXJnaW4gPSAob3V0cHV0X21vZGUtPmhkaXNwbGF5IC0gY3J0Y19tb2RlLT5oZGlzcGxheSkgLyAyOworCXZtYXJnaW4gPSAob3V0cHV0X21vZGUtPnZkaXNwbGF5IC0gY3J0Y19tb2RlLT52ZGlzcGxheSkgLyAyOworCisJaG1hcmdpbiA9IGludGVycG9sYXRlKDAsIG1pbihobWFyZ2luLCBvdXRwdXRfbW9kZS0+aGRpc3BsYXkvMjApLCBobWFyZ2luLAorCQkJICAgICAgb3ZlcnNjYW4pOworCXZtYXJnaW4gPSBpbnRlcnBvbGF0ZSgwLCBtaW4odm1hcmdpbiwgb3V0cHV0X21vZGUtPnZkaXNwbGF5LzIwKSwgdm1hcmdpbiwKKwkJCSAgICAgIG92ZXJzY2FuKTsKKworCWhyYXRpbyA9IGNydGNfbW9kZS0+aGRpc3BsYXkgKiAweDgwMCAvIChvdXRwdXRfbW9kZS0+aGRpc3BsYXkgLSAyKmhtYXJnaW4pOworCXZyYXRpbyA9IGNydGNfbW9kZS0+dmRpc3BsYXkgKiAweDgwMCAvIChvdXRwdXRfbW9kZS0+dmRpc3BsYXkgLSAyKnZtYXJnaW4pICYgfjM7CisKKwlyZWdzLT5mcF9ob3Jpel9yZWdzW0ZQX1ZBTElEX1NUQVJUXSA9IGhtYXJnaW47CisJcmVncy0+ZnBfaG9yaXpfcmVnc1tGUF9WQUxJRF9FTkRdID0gb3V0cHV0X21vZGUtPmhkaXNwbGF5IC0gaG1hcmdpbiAtIDE7CisJcmVncy0+ZnBfdmVydF9yZWdzW0ZQX1ZBTElEX1NUQVJUXSA9IHZtYXJnaW47CisJcmVncy0+ZnBfdmVydF9yZWdzW0ZQX1ZBTElEX0VORF0gPSBvdXRwdXRfbW9kZS0+dmRpc3BsYXkgLSB2bWFyZ2luIC0gMTsKKworCXJlZ3MtPmZwX2RlYnVnXzEgPSBOVl9QUkFNREFDX0ZQX0RFQlVHXzFfWVNDQUxFX1RFU1RNT0RFX0VOQUJMRSB8CisJCVhMQVRFKHZyYXRpbywgMCwgTlZfUFJBTURBQ19GUF9ERUJVR18xX1lTQ0FMRV9WQUxVRSkgfAorCQlOVl9QUkFNREFDX0ZQX0RFQlVHXzFfWFNDQUxFX1RFU1RNT0RFX0VOQUJMRSB8CisJCVhMQVRFKGhyYXRpbywgMCwgTlZfUFJBTURBQ19GUF9ERUJVR18xX1hTQ0FMRV9WQUxVRSk7CisKKwlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19GUF9IVkFMSURfU1RBUlQsCisJCSAgICAgIHJlZ3MtPmZwX2hvcml6X3JlZ3NbRlBfVkFMSURfU1RBUlRdKTsKKwlOVldyaXRlUkFNREFDKGRldiwgaGVhZCwgTlZfUFJBTURBQ19GUF9IVkFMSURfRU5ELAorCQkgICAgICByZWdzLT5mcF9ob3Jpel9yZWdzW0ZQX1ZBTElEX0VORF0pOworCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX0ZQX1ZWQUxJRF9TVEFSVCwKKwkJICAgICAgcmVncy0+ZnBfdmVydF9yZWdzW0ZQX1ZBTElEX1NUQVJUXSk7CisJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfRlBfVlZBTElEX0VORCwKKwkJICAgICAgcmVncy0+ZnBfdmVydF9yZWdzW0ZQX1ZBTElEX0VORF0pOworCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDX0ZQX0RFQlVHXzEsIHJlZ3MtPmZwX2RlYnVnXzEpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYyMF9ncmFwaC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYyMF9ncmFwaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YmE3NGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjIwX2dyYXBoLmMKQEAgLTAsMCArMSw3ODAgQEAKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2RybS5oIgorCisvKgorICogTlYyMAorICogLS0tLS0KKyAqIFRoZXJlIGFyZSAzIGZhbWlsaWVzIDoKKyAqIE5WMjAgaXMgMHgxMGRlOjB4MDIwKgorICogTlYyNS8yOCBpcyAweDEwZGU6MHgwMjUqIC8gMHgxMGRlOjB4MDI4KgorICogTlYyQSBpcyAweDEwZGU6MHgwMkEwCisgKgorICogTlYzMAorICogLS0tLS0KKyAqIFRoZXJlIGFyZSAzIGZhbWlsaWVzIDoKKyAqIE5WMzAvMzEgaXMgMHgxMGRlOjB4MDMwKiAvIDB4MTBkZToweDAzMSoKKyAqIE5WMzQgaXMgMHgxMGRlOjB4MDMyKgorICogTlYzNS8zNiBpcyAweDEwZGU6MHgwMzMqIC8gMHgxMGRlOjB4MDM0KgorICoKKyAqIE5vdCBzZWVuIGluIHRoZSB3aWxkLCBubyBkdW1wcyAocHJvYmFibHkgTlYzNSkgOgorICogTlYzNyBpcyAweDEwZGU6MHgwMGZjLCAweDEwZGU6MHgwMGZkCisgKiBOVjM4IGlzIDB4MTBkZToweDAzMzMsIDB4MTBkZToweDAwZmUKKyAqCisgKi8KKworI2RlZmluZSBOVjIwX0dSQ1RYX1NJWkUgKDM1ODAqNCkKKyNkZWZpbmUgTlYyNV9HUkNUWF9TSVpFICgzNTI5KjQpCisjZGVmaW5lIE5WMkFfR1JDVFhfU0laRSAoMzUwMCo0KQorCisjZGVmaW5lIE5WMzBfMzFfR1JDVFhfU0laRSAoMjQzOTIpCisjZGVmaW5lIE5WMzRfR1JDVFhfU0laRSAgICAoMTgxNDApCisjZGVmaW5lIE5WMzVfMzZfR1JDVFhfU0laRSAoMjIzOTYpCisKK3N0YXRpYyB2b2lkCitudjIwX2dyYXBoX2NvbnRleHRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmN0eCkKK3sKKwlpbnQgaTsKKworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDMzYy80LCAweGZmZmYwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDAzYTAvNCwgMHgwZmZmMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwM2E0LzQsIDB4MGZmZjAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDQ3Yy80LCAweDAwMDAwMTAxKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA0OTAvNCwgMHgwMDAwMDExMSk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNGE4LzQsIDB4NDQ0MDAwMDApOworCWZvciAoaSA9IDB4MDRkNDsgaSA8PSAweDA0ZTA7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDAwMDMwMzAzKTsKKwlmb3IgKGkgPSAweDA0ZjQ7IGkgPD0gMHgwNTAwOyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwMDA4MDAwMCk7CisJZm9yIChpID0gMHgwNTBjOyBpIDw9IDB4MDUxODsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDEwMTIwMDApOworCWZvciAoaSA9IDB4MDUxYzsgaSA8PSAweDA1Mjg7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDAwMDEwNWI4KTsKKwlmb3IgKGkgPSAweDA1MmM7IGkgPD0gMHgwNTM4OyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwMDA4MDAwOCk7CisJZm9yIChpID0gMHgwNTVjOyBpIDw9IDB4MDU5ODsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDdmZjAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDVhNC80LCAweDRiN2ZmZmZmKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA1ZmMvNCwgMHgwMDAwMDAwMSk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNjA0LzQsIDB4MDAwMDQwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDYxMC80LCAweDAwMDAwMDAxKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA2MTgvNCwgMHgwMDA0MDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNjFjLzQsIDB4MDAwMTAwMDApOworCWZvciAoaSA9IDB4MWMxYzsgaSA8PSAweDI0OGM7IGkgKz0gMTYpIHsKKwkJbnZfd28zMihkZXYsIGN0eCwgKGkgKyAwKS80LCAweDEwNzAwZmY5KTsKKwkJbnZfd28zMihkZXYsIGN0eCwgKGkgKyA0KS80LCAweDA0MzYwODZjKTsKKwkJbnZfd28zMihkZXYsIGN0eCwgKGkgKyA4KS80LCAweDAwMGMwMDFiKTsKKwl9CisJbnZfd28zMihkZXYsIGN0eCwgMHgyODFjLzQsIDB4M2Y4MDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MjgzMC80LCAweDNmODAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDI4NWMvNCwgMHg0MDAwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgyODYwLzQsIDB4M2Y4MDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4Mjg2NC80LCAweDNmMDAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDI4NmMvNCwgMHg0MDAwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgyODcwLzQsIDB4M2Y4MDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4Mjg3OC80LCAweGJmODAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDI4ODAvNCwgMHhiZjgwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgzNGE0LzQsIDB4MDAwZmUwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MzUzMC80LCAweDAwMDAwM2Y4KTsKKwludl93bzMyKGRldiwgY3R4LCAweDM1NDAvNCwgMHgwMDJmZTAwMCk7CisJZm9yIChpID0gMHgzNTVjOyBpIDw9IDB4MzU3ODsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDAxYzUyN2MpOworfQorCitzdGF0aWMgdm9pZAorbnYyNV9ncmFwaF9jb250ZXh0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpjdHgpCit7CisJaW50IGk7CisKKwludl93bzMyKGRldiwgY3R4LCAweDAzNWMvNCwgMHhmZmZmMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwM2MwLzQsIDB4MGZmZjAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDNjNC80LCAweDBmZmYwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA0OWMvNCwgMHgwMDAwMDEwMSk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNGIwLzQsIDB4MDAwMDAxMTEpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDRjOC80LCAweDAwMDAwMDgwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA0Y2MvNCwgMHhmZmZmMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNGQwLzQsIDB4MDAwMDAwMDEpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDRlNC80LCAweDQ0NDAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA0ZmMvNCwgMHg0YjgwMDAwMCk7CisJZm9yIChpID0gMHgwNTEwOyBpIDw9IDB4MDUxYzsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDAwMzAzMDMpOworCWZvciAoaSA9IDB4MDUzMDsgaSA8PSAweDA1M2M7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDAwMDgwMDAwKTsKKwlmb3IgKGkgPSAweDA1NDg7IGkgPD0gMHgwNTU0OyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwMTAxMjAwMCk7CisJZm9yIChpID0gMHgwNTU4OyBpIDw9IDB4MDU2NDsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDAwMTA1YjgpOworCWZvciAoaSA9IDB4MDU2ODsgaSA8PSAweDA1NzQ7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDAwMDgwMDA4KTsKKwlmb3IgKGkgPSAweDA1OTg7IGkgPD0gMHgwNWQ0OyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwN2ZmMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNWUwLzQsIDB4NGI3ZmZmZmYpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDYyMC80LCAweDAwMDAwMDgwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA2MjQvNCwgMHgzMDIwMTAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNjI4LzQsIDB4NzA2MDUwNDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDYyYy80LCAweGIwYTA5MDgwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA2MzAvNCwgMHhmMGUwZDBjMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNjY0LzQsIDB4MDAwMDAwMDEpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDY2Yy80LCAweDAwMDA0MDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA2NzgvNCwgMHgwMDAwMDAwMSk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNjgwLzQsIDB4MDAwNDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDY4NC80LCAweDAwMDEwMDAwKTsKKwlmb3IgKGkgPSAweDFiMDQ7IGkgPD0gMHgyMzc0OyBpICs9IDE2KSB7CisJCW52X3dvMzIoZGV2LCBjdHgsIChpICsgMCkvNCwgMHgxMDcwMGZmOSk7CisJCW52X3dvMzIoZGV2LCBjdHgsIChpICsgNCkvNCwgMHgwNDM2MDg2Yyk7CisJCW52X3dvMzIoZGV2LCBjdHgsIChpICsgOCkvNCwgMHgwMDBjMDAxYik7CisJfQorCW52X3dvMzIoZGV2LCBjdHgsIDB4MjcwNC80LCAweDNmODAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDI3MTgvNCwgMHgzZjgwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgyNzQ0LzQsIDB4NDAwMDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4Mjc0OC80LCAweDNmODAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDI3NGMvNCwgMHgzZjAwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgyNzU0LzQsIDB4NDAwMDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4Mjc1OC80LCAweDNmODAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDI3NjAvNCwgMHhiZjgwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgyNzY4LzQsIDB4YmY4MDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MzA4Yy80LCAweDAwMGZlMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDMxMDgvNCwgMHgwMDAwMDNmOCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgzNDY4LzQsIDB4MDAyZmUwMDApOworCWZvciAoaSA9IDB4MzQ4NDsgaSA8PSAweDM0YTA7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDAwMWM1MjdjKTsKK30KKworc3RhdGljIHZvaWQKK252MmFfZ3JhcGhfY29udGV4dF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqY3R4KQoreworCWludCBpOworCisJbnZfd28zMihkZXYsIGN0eCwgMHgwMzNjLzQsIDB4ZmZmZjAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDNhMC80LCAweDBmZmYwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDAzYTQvNCwgMHgwZmZmMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNDdjLzQsIDB4MDAwMDAxMDEpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDQ5MC80LCAweDAwMDAwMTExKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA0YTgvNCwgMHg0NDQwMDAwMCk7CisJZm9yIChpID0gMHgwNGQ0OyBpIDw9IDB4MDRlMDsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDAwMzAzMDMpOworCWZvciAoaSA9IDB4MDRmNDsgaSA8PSAweDA1MDA7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDAwMDgwMDAwKTsKKwlmb3IgKGkgPSAweDA1MGM7IGkgPD0gMHgwNTE4OyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwMTAxMjAwMCk7CisJZm9yIChpID0gMHgwNTFjOyBpIDw9IDB4MDUyODsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDAwMTA1YjgpOworCWZvciAoaSA9IDB4MDUyYzsgaSA8PSAweDA1Mzg7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDAwMDgwMDA4KTsKKwlmb3IgKGkgPSAweDA1NWM7IGkgPD0gMHgwNTk4OyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwN2ZmMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNWE0LzQsIDB4NGI3ZmZmZmYpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDVmYy80LCAweDAwMDAwMDAxKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA2MDQvNCwgMHgwMDAwNDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNjEwLzQsIDB4MDAwMDAwMDEpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDYxOC80LCAweDAwMDQwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA2MWMvNCwgMHgwMDAxMDAwMCk7CisJZm9yIChpID0gMHgxYTljOyBpIDw9IDB4MjJmYzsgaSArPSAxNikgeyAvKlhYWDogY2hlY2shISAqLworCQludl93bzMyKGRldiwgY3R4LCAoaSArIDApLzQsIDB4MTA3MDBmZjkpOworCQludl93bzMyKGRldiwgY3R4LCAoaSArIDQpLzQsIDB4MDQzNjA4NmMpOworCQludl93bzMyKGRldiwgY3R4LCAoaSArIDgpLzQsIDB4MDAwYzAwMWIpOworCX0KKwludl93bzMyKGRldiwgY3R4LCAweDI2OWMvNCwgMHgzZjgwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgyNmIwLzQsIDB4M2Y4MDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MjZkYy80LCAweDQwMDAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDI2ZTAvNCwgMHgzZjgwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgyNmU0LzQsIDB4M2YwMDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MjZlYy80LCAweDQwMDAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDI2ZjAvNCwgMHgzZjgwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgyNmY4LzQsIDB4YmY4MDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MjcwMC80LCAweGJmODAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDMwMjQvNCwgMHgwMDBmZTAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgzMGEwLzQsIDB4MDAwMDAzZjgpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MzNmYy80LCAweDAwMmZlMDAwKTsKKwlmb3IgKGkgPSAweDM0MWM7IGkgPD0gMHgzNDM4OyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwMDFjNTI3Yyk7Cit9CisKK3N0YXRpYyB2b2lkCitudjMwXzMxX2dyYXBoX2NvbnRleHRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmN0eCkKK3sKKwlpbnQgaTsKKworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDQxMC80LCAweDAwMDAwMTAxKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA0MjQvNCwgMHgwMDAwMDExMSk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNDI4LzQsIDB4MDAwMDAwNjApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDQ0NC80LCAweDAwMDAwMDgwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA0NDgvNCwgMHhmZmZmMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNDRjLzQsIDB4MDAwMDAwMDEpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDQ2MC80LCAweDQ0NDAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA0OGMvNCwgMHhmZmZmMDAwMCk7CisJZm9yIChpID0gMHgwNGUwOyBpIDwgMHgwNGU4OyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwZmZmMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNGVjLzQsIDB4MDAwMTExMDApOworCWZvciAoaSA9IDB4MDUwODsgaSA8IDB4MDU0ODsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDdmZjAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDU1MC80LCAweDRiN2ZmZmZmKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA1OGMvNCwgMHgwMDAwMDA4MCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNTkwLzQsIDB4MzAyMDEwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDU5NC80LCAweDcwNjA1MDQwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA1OTgvNCwgMHhiOGE4OTg4OCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNTljLzQsIDB4ZjhlOGQ4YzgpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDViMC80LCAweGIwMDAwMDAwKTsKKwlmb3IgKGkgPSAweDA2MDA7IGkgPCAweDA2NDA7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDAwMDEwNTg4KTsKKwlmb3IgKGkgPSAweDA2NDA7IGkgPCAweDA2ODA7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDAwMDMwMzAzKTsKKwlmb3IgKGkgPSAweDA2YzA7IGkgPCAweDA3MDA7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDAwMDhhYWU0KTsKKwlmb3IgKGkgPSAweDA3MDA7IGkgPCAweDA3NDA7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDAxMDEyMDAwKTsKKwlmb3IgKGkgPSAweDA3NDA7IGkgPCAweDA3ODA7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDAwMDgwMDA4KTsKKwludl93bzMyKGRldiwgY3R4LCAweDA4NWMvNCwgMHgwMDA0MDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwODYwLzQsIDB4MDAwMTAwMDApOworCWZvciAoaSA9IDB4MDg2NDsgaSA8IDB4MDg3NDsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDAwNDAwMDQpOworCWZvciAoaSA9IDB4MWYxODsgaSA8PSAweDMwODggOyBpICs9IDE2KSB7CisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCArIDAsIDB4MTA3MDBmZjkpOworCQludl93bzMyKGRldiwgY3R4LCBpLzQgKyAxLCAweDA0MzYwODZjKTsKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80ICsgMiwgMHgwMDBjMDAxYik7CisJfQorCWZvciAoaSA9IDB4MzBiODsgaSA8IDB4MzBjODsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDAwMGZmZmYpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MzQ0Yy80LCAweDNmODAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDM4MDgvNCwgMHgzZjgwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgzODFjLzQsIDB4M2Y4MDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4Mzg0OC80LCAweDQwMDAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDM4NGMvNCwgMHgzZjgwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgzODUwLzQsIDB4M2YwMDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4Mzg1OC80LCAweDQwMDAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDM4NWMvNCwgMHgzZjgwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgzODY0LzQsIDB4YmY4MDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4Mzg2Yy80LCAweGJmODAwMDAwKTsKK30KKworc3RhdGljIHZvaWQKK252MzRfZ3JhcGhfY29udGV4dF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqY3R4KQoreworCWludCBpOworCisJbnZfd28zMihkZXYsIGN0eCwgMHgwNDBjLzQsIDB4MDEwMDAxMDEpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDQyMC80LCAweDAwMDAwMTExKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA0MjQvNCwgMHgwMDAwMDA2MCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNDQwLzQsIDB4MDAwMDAwODApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDQ0NC80LCAweGZmZmYwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA0NDgvNCwgMHgwMDAwMDAwMSk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNDVjLzQsIDB4NDQ0MDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDQ4MC80LCAweGZmZmYwMDAwKTsKKwlmb3IgKGkgPSAweDA0ZDQ7IGkgPCAweDA0ZGM7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDBmZmYwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA0ZTAvNCwgMHgwMDAxMTEwMCk7CisJZm9yIChpID0gMHgwNGZjOyBpIDwgMHgwNTNjOyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwN2ZmMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNTQ0LzQsIDB4NGI3ZmZmZmYpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDU3Yy80LCAweDAwMDAwMDgwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA1ODAvNCwgMHgzMDIwMTAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNTg0LzQsIDB4NzA2MDUwNDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDU4OC80LCAweGI4YTg5ODg4KTsKKwludl93bzMyKGRldiwgY3R4LCAweDA1OGMvNCwgMHhmOGU4ZDhjOCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNWEwLzQsIDB4YjAwMDAwMDApOworCWZvciAoaSA9IDB4MDVmMDsgaSA8IDB4MDYzMDsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDAwMTA1ODgpOworCWZvciAoaSA9IDB4MDYzMDsgaSA8IDB4MDY3MDsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDAwMzAzMDMpOworCWZvciAoaSA9IDB4MDZiMDsgaSA8IDB4MDZmMDsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDAwOGFhZTQpOworCWZvciAoaSA9IDB4MDZmMDsgaSA8IDB4MDczMDsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDEwMTIwMDApOworCWZvciAoaSA9IDB4MDczMDsgaSA8IDB4MDc3MDsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MDAwODAwMDgpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDg1MC80LCAweDAwMDQwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA4NTQvNCwgMHgwMDAxMDAwMCk7CisJZm9yIChpID0gMHgwODU4OyBpIDwgMHgwODY4OyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwMDA0MDAwNCk7CisJZm9yIChpID0gMHgxNWFjOyBpIDw9IDB4MjcxYyA7IGkgKz0gMTYpIHsKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80ICsgMCwgMHgxMDcwMGZmOSk7CisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCArIDEsIDB4MDQzNjA4NmMpOworCQludl93bzMyKGRldiwgY3R4LCBpLzQgKyAyLCAweDAwMGMwMDFiKTsKKwl9CisJZm9yIChpID0gMHgyNzRjOyBpIDwgMHgyNzVjOyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwMDAwZmZmZik7CisJbnZfd28zMihkZXYsIGN0eCwgMHgyYWUwLzQsIDB4M2Y4MDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MmU5Yy80LCAweDNmODAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDJlYjAvNCwgMHgzZjgwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgyZWRjLzQsIDB4NDAwMDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MmVlMC80LCAweDNmODAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDJlZTQvNCwgMHgzZjAwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgyZWVjLzQsIDB4NDAwMDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MmVmMC80LCAweDNmODAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDJlZjgvNCwgMHhiZjgwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgyZjAwLzQsIDB4YmY4MDAwMDApOworfQorCitzdGF0aWMgdm9pZAorbnYzNV8zNl9ncmFwaF9jb250ZXh0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpjdHgpCit7CisJaW50IGk7CisKKwludl93bzMyKGRldiwgY3R4LCAweDA0MGMvNCwgMHgwMDAwMDEwMSk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNDIwLzQsIDB4MDAwMDAxMTEpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDQyNC80LCAweDAwMDAwMDYwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA0NDAvNCwgMHgwMDAwMDA4MCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNDQ0LzQsIDB4ZmZmZjAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDQ0OC80LCAweDAwMDAwMDAxKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA0NWMvNCwgMHg0NDQwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNDg4LzQsIDB4ZmZmZjAwMDApOworCWZvciAoaSA9IDB4MDRkYzsgaSA8IDB4MDRlNDsgaSArPSA0KQorCQludl93bzMyKGRldiwgY3R4LCBpLzQsIDB4MGZmZjAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDRlOC80LCAweDAwMDExMTAwKTsKKwlmb3IgKGkgPSAweDA1MDQ7IGkgPCAweDA1NDQ7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDA3ZmYwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA1NGMvNCwgMHg0YjdmZmZmZik7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNTg4LzQsIDB4MDAwMDAwODApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDU4Yy80LCAweDMwMjAxMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDA1OTAvNCwgMHg3MDYwNTA0MCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwNTk0LzQsIDB4YjhhODk4ODgpOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDU5OC80LCAweGY4ZThkOGM4KTsKKwludl93bzMyKGRldiwgY3R4LCAweDA1YWMvNCwgMHhiMDAwMDAwMCk7CisJZm9yIChpID0gMHgwNjA0OyBpIDwgMHgwNjQ0OyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwMDAxMDU4OCk7CisJZm9yIChpID0gMHgwNjQ0OyBpIDwgMHgwNjg0OyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwMDAzMDMwMyk7CisJZm9yIChpID0gMHgwNmM0OyBpIDwgMHgwNzA0OyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwMDA4YWFlNCk7CisJZm9yIChpID0gMHgwNzA0OyBpIDwgMHgwNzQ0OyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwMTAxMjAwMCk7CisJZm9yIChpID0gMHgwNzQ0OyBpIDwgMHgwNzg0OyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCwgMHgwMDA4MDAwOCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgwODYwLzQsIDB4MDAwNDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MDg2NC80LCAweDAwMDEwMDAwKTsKKwlmb3IgKGkgPSAweDA4Njg7IGkgPCAweDA4Nzg7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDAwMDQwMDA0KTsKKwlmb3IgKGkgPSAweDFmMWM7IGkgPD0gMHgzMDhjIDsgaSArPSAxNikgeworCQludl93bzMyKGRldiwgY3R4LCBpLzQgKyAwLCAweDEwNzAwZmY5KTsKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80ICsgMSwgMHgwNDM2MDg2Yyk7CisJCW52X3dvMzIoZGV2LCBjdHgsIGkvNCArIDIsIDB4MDAwYzAwMWIpOworCX0KKwlmb3IgKGkgPSAweDMwYmM7IGkgPCAweDMwY2M7IGkgKz0gNCkKKwkJbnZfd28zMihkZXYsIGN0eCwgaS80LCAweDAwMDBmZmZmKTsKKwludl93bzMyKGRldiwgY3R4LCAweDM0NTAvNCwgMHgzZjgwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgzODBjLzQsIDB4M2Y4MDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4MzgyMC80LCAweDNmODAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDM4NGMvNCwgMHg0MDAwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgzODUwLzQsIDB4M2Y4MDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4Mzg1NC80LCAweDNmMDAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDM4NWMvNCwgMHg0MDAwMDAwMCk7CisJbnZfd28zMihkZXYsIGN0eCwgMHgzODYwLzQsIDB4M2Y4MDAwMDApOworCW52X3dvMzIoZGV2LCBjdHgsIDB4Mzg2OC80LCAweGJmODAwMDAwKTsKKwludl93bzMyKGRldiwgY3R4LCAweDM4NzAvNCwgMHhiZjgwMDAwMCk7Cit9CisKK2ludAorbnYyMF9ncmFwaF9jcmVhdGVfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl2b2lkICgqY3R4X2luaXQpKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKTsKKwl1bnNpZ25lZCBpbnQgY3R4X3NpemU7CisJdW5zaWduZWQgaW50IGlkb2ZmcyA9IDB4MjgvNDsKKwlpbnQgcmV0OworCisJc3dpdGNoIChkZXZfcHJpdi0+Y2hpcHNldCkgeworCWNhc2UgMHgyMDoKKwkJY3R4X3NpemUgPSBOVjIwX0dSQ1RYX1NJWkU7CisJCWN0eF9pbml0ID0gbnYyMF9ncmFwaF9jb250ZXh0X2luaXQ7CisJCWlkb2ZmcyA9IDA7CisJCWJyZWFrOworCWNhc2UgMHgyNToKKwljYXNlIDB4Mjg6CisJCWN0eF9zaXplID0gTlYyNV9HUkNUWF9TSVpFOworCQljdHhfaW5pdCA9IG52MjVfZ3JhcGhfY29udGV4dF9pbml0OworCQlicmVhazsKKwljYXNlIDB4MmE6CisJCWN0eF9zaXplID0gTlYyQV9HUkNUWF9TSVpFOworCQljdHhfaW5pdCA9IG52MmFfZ3JhcGhfY29udGV4dF9pbml0OworCQlpZG9mZnMgPSAwOworCQlicmVhazsKKwljYXNlIDB4MzA6CisJY2FzZSAweDMxOgorCQljdHhfc2l6ZSA9IE5WMzBfMzFfR1JDVFhfU0laRTsKKwkJY3R4X2luaXQgPSBudjMwXzMxX2dyYXBoX2NvbnRleHRfaW5pdDsKKwkJYnJlYWs7CisJY2FzZSAweDM0OgorCQljdHhfc2l6ZSA9IE5WMzRfR1JDVFhfU0laRTsKKwkJY3R4X2luaXQgPSBudjM0X2dyYXBoX2NvbnRleHRfaW5pdDsKKwkJYnJlYWs7CisJY2FzZSAweDM1OgorCWNhc2UgMHgzNjoKKwkJY3R4X3NpemUgPSBOVjM1XzM2X0dSQ1RYX1NJWkU7CisJCWN0eF9pbml0ID0gbnYzNV8zNl9ncmFwaF9jb250ZXh0X2luaXQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWN0eF9zaXplID0gMDsKKwkJY3R4X2luaXQgPSBudjM1XzM2X2dyYXBoX2NvbnRleHRfaW5pdDsKKwkJTlZfRVJST1IoZGV2LCAiUGxlYXNlIGNvbnRhY3QgdGhlIGRldnMgaWYgeW91IHdhbnQgeW91ciBOViV4IgorCQkJICAgICAgIiBjYXJkIHRvIHdvcmtcbiIsIGRldl9wcml2LT5jaGlwc2V0KTsKKwkJcmV0dXJuIC1FTk9TWVM7CisJCWJyZWFrOworCX0KKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ld19yZWYoZGV2LCBjaGFuLCBOVUxMLCAwLCBjdHhfc2l6ZSwgMTYsCisJCQkJCSAgTlZPQkpfRkxBR19aRVJPX0FMTE9DLAorCQkJCQkgICZjaGFuLT5yYW1pbl9ncmN0eCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIEluaXRpYWxpc2UgZGVmYXVsdCBjb250ZXh0IHZhbHVlcyAqLworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOworCWN0eF9pbml0KGRldiwgY2hhbi0+cmFtaW5fZ3JjdHgtPmdwdW9iaik7CisKKwkvKiBudjIwOiBudl93bzMyKGRldiwgY2hhbi0+cmFtaW5fZ3JjdHgtPmdwdW9iaiwgMTAsIGNoYW4tPmlkPDwyNCk7ICovCisJbnZfd28zMihkZXYsIGNoYW4tPnJhbWluX2dyY3R4LT5ncHVvYmosIGlkb2ZmcywKKwkJCQkJKGNoYW4tPmlkIDw8IDI0KSB8IDB4MSk7IC8qIENUWF9VU0VSICovCisKKwludl93bzMyKGRldiwgZGV2X3ByaXYtPmN0eF90YWJsZS0+Z3B1b2JqLCBjaGFuLT5pZCwKKwkJCWNoYW4tPnJhbWluX2dyY3R4LT5pbnN0YW5jZSA+PiA0KTsKKworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK252MjBfZ3JhcGhfZGVzdHJveV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKGNoYW4tPnJhbWluX2dyY3R4KQorCQlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGRldiwgJmNoYW4tPnJhbWluX2dyY3R4KTsKKworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOworCW52X3dvMzIoZGV2LCBkZXZfcHJpdi0+Y3R4X3RhYmxlLT5ncHVvYmosIGNoYW4tPmlkLCAwKTsKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworfQorCitpbnQKK252MjBfZ3JhcGhfbG9hZF9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwl1aW50MzJfdCBpbnN0OworCisJaWYgKCFjaGFuLT5yYW1pbl9ncmN0eCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaW5zdCA9IGNoYW4tPnJhbWluX2dyY3R4LT5pbnN0YW5jZSA+PiA0OworCisJbnZfd3IzMihkZXYsIE5WMjBfUEdSQVBIX0NIQU5ORUxfQ1RYX1BPSU5URVIsIGluc3QpOworCW52X3dyMzIoZGV2LCBOVjIwX1BHUkFQSF9DSEFOTkVMX0NUWF9YRkVSLAorCQkgICAgIE5WMjBfUEdSQVBIX0NIQU5ORUxfQ1RYX1hGRVJfTE9BRCk7CisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX0NUWF9DT05UUk9MLCAweDEwMDEwMTAwKTsKKworCW5vdXZlYXVfd2FpdF9mb3JfaWRsZShkZXYpOworCXJldHVybiAwOworfQorCitpbnQKK252MjBfZ3JhcGhfdW5sb2FkX2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9lbmdpbmUgKnBncmFwaCA9ICZkZXZfcHJpdi0+ZW5naW5lLmdyYXBoOworCXN0cnVjdCBub3V2ZWF1X2ZpZm9fZW5naW5lICpwZmlmbyA9ICZkZXZfcHJpdi0+ZW5naW5lLmZpZm87CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbjsKKwl1aW50MzJfdCBpbnN0LCB0bXA7CisKKwljaGFuID0gcGdyYXBoLT5jaGFubmVsKGRldik7CisJaWYgKCFjaGFuKQorCQlyZXR1cm4gMDsKKwlpbnN0ID0gY2hhbi0+cmFtaW5fZ3JjdHgtPmluc3RhbmNlID4+IDQ7CisKKwludl93cjMyKGRldiwgTlYyMF9QR1JBUEhfQ0hBTk5FTF9DVFhfUE9JTlRFUiwgaW5zdCk7CisJbnZfd3IzMihkZXYsIE5WMjBfUEdSQVBIX0NIQU5ORUxfQ1RYX1hGRVIsCisJCSAgICAgTlYyMF9QR1JBUEhfQ0hBTk5FTF9DVFhfWEZFUl9TQVZFKTsKKworCW5vdXZlYXVfd2FpdF9mb3JfaWRsZShkZXYpOworCisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX0NUWF9DT05UUk9MLCAweDEwMDAwMDAwKTsKKwl0bXAgID0gbnZfcmQzMihkZXYsIE5WMTBfUEdSQVBIX0NUWF9VU0VSKSAmIDB4MDBmZmZmZmY7CisJdG1wIHw9IChwZmlmby0+Y2hhbm5lbHMgLSAxKSA8PCAyNDsKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfQ1RYX1VTRVIsIHRtcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitudjIwX2dyYXBoX3JkaShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGksIHdyaXRlY291bnQgPSAzMjsKKwl1aW50MzJfdCByZGlfaW5kZXggPSAweDJjODAwMDA7CisKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHgyMCkgeworCQlyZGlfaW5kZXggPSAweDNkMDAwMDsKKwkJd3JpdGVjb3VudCA9IDE1OworCX0KKworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfSU5ERVgsIHJkaV9pbmRleCk7CisJZm9yIChpID0gMDsgaSA8IHdyaXRlY291bnQ7IGkrKykKKwkJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9EQVRBLCAwKTsKKworCW5vdXZlYXVfd2FpdF9mb3JfaWRsZShkZXYpOworfQorCitpbnQKK252MjBfZ3JhcGhfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9CisJCShzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqKWRldi0+ZGV2X3ByaXZhdGU7CisJdWludDMyX3QgdG1wLCB2cmFtc3o7CisJaW50IHJldCwgaTsKKworCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUsCisJCW52X3JkMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUpICYgfk5WX1BNQ19FTkFCTEVfUEdSQVBIKTsKKwludl93cjMyKGRldiwgTlYwM19QTUNfRU5BQkxFLAorCQludl9yZDMyKGRldiwgTlYwM19QTUNfRU5BQkxFKSB8ICBOVl9QTUNfRU5BQkxFX1BHUkFQSCk7CisKKwlpZiAoIWRldl9wcml2LT5jdHhfdGFibGUpIHsKKwkJLyogQ3JlYXRlIENvbnRleHQgUG9pbnRlciBUYWJsZSAqLworCQlkZXZfcHJpdi0+Y3R4X3RhYmxlX3NpemUgPSAzMiAqIDQ7CisJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ld19yZWYoZGV2LCBOVUxMLCBOVUxMLCAwLAorCQkJCQkJICBkZXZfcHJpdi0+Y3R4X3RhYmxlX3NpemUsIDE2LAorCQkJCQkJICBOVk9CSl9GTEFHX1pFUk9fQUxMT0MsCisJCQkJCQkgICZkZXZfcHJpdi0+Y3R4X3RhYmxlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJbnZfd3IzMihkZXYsIE5WMjBfUEdSQVBIX0NIQU5ORUxfQ1RYX1RBQkxFLAorCQkgZGV2X3ByaXYtPmN0eF90YWJsZS0+aW5zdGFuY2UgPj4gNCk7CisKKwludjIwX2dyYXBoX3JkaShkZXYpOworCisJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIgICAsIDB4RkZGRkZGRkYpOworCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSX0VOLCAweEZGRkZGRkZGKTsKKworCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9ERUJVR18wLCAweEZGRkZGRkZGKTsKKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfREVCVUdfMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0RFQlVHXzEsIDB4MDAxMTg3MDApOworCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9ERUJVR18zLCAweEYzQ0UwNDc1KTsgLyogMHg0ID0gYXV0byBjdHggc3dpdGNoICovCisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX0RFQlVHXzQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwMDA5QyAgICAgICAgICAgLCAweDAwMDAwMDQwKTsKKworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA+PSAweDI1KSB7CisJCW52X3dyMzIoZGV2LCAweDQwMDg5MCwgMHgwMDA4MDAwMCk7CisJCW52X3dyMzIoZGV2LCAweDQwMDYxMCwgMHgzMDRCMUZCNik7CisJCW52X3dyMzIoZGV2LCAweDQwMEI4MCwgMHgxOEI4Mjg4MCk7CisJCW52X3dyMzIoZGV2LCAweDQwMEI4NCwgMHg0NDAwMDAwMCk7CisJCW52X3dyMzIoZGV2LCAweDQwMDA5OCwgMHg0MDAwMDA4MCk7CisJCW52X3dyMzIoZGV2LCAweDQwMEI4OCwgMHgwMDAwMDBmZik7CisJfSBlbHNlIHsKKwkJbnZfd3IzMihkZXYsIDB4NDAwODgwLCAweDAwMDgwMDAwKTsgLyogMHgwMDA4YzdkZiAqLworCQludl93cjMyKGRldiwgMHg0MDAwOTQsIDB4MDAwMDAwMDUpOworCQludl93cjMyKGRldiwgMHg0MDBCODAsIDB4NDVDQUEyMDgpOyAvKiAweDQ1ZWFlMjBlICovCisJCW52X3dyMzIoZGV2LCAweDQwMEI4NCwgMHgyNDAwMDAwMCk7CisJCW52X3dyMzIoZGV2LCAweDQwMDA5OCwgMHgwMDAwMDA0MCk7CisJCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfSU5ERVgsIDB4MDBFMDAwMzgpOworCQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0RBVEEgLCAweDAwMDAwMDMwKTsKKwkJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9JTkRFWCwgMHgwMEUxMDAzOCk7CisJCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfREFUQSAsIDB4MDAwMDAwMzApOworCX0KKworCS8qIGNvcHkgdGlsZSBpbmZvIGZyb20gUEZCICovCisJZm9yIChpID0gMDsgaSA8IE5WMTBfUEZCX1RJTEVfX1NJWkU7IGkrKykgeworCQludl93cjMyKGRldiwgMHgwMDQwMDkwNCArIGkgKiAweDEwLAorCQkJCQludl9yZDMyKGRldiwgTlYxMF9QRkJfVExJTUlUKGkpKSk7CisJCQkvKiB3aGljaCBpcyBOVjQwX1BHUkFQSF9UTElNSVQwKGkpID8/ICovCisJCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfSU5ERVgsIDB4MDBFQTAwMzAgKyBpICogNCk7CisJCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfREFUQSwKKwkJCQkJbnZfcmQzMihkZXYsIE5WMTBfUEZCX1RMSU1JVChpKSkpOworCQludl93cjMyKGRldiwgMHgwMDQwMDkwOCArIGkgKiAweDEwLAorCQkJCQludl9yZDMyKGRldiwgTlYxMF9QRkJfVFNJWkUoaSkpKTsKKwkJCS8qIHdoaWNoIGlzIE5WNDBfUEdSQVBIX1RTSVpFMChpKSA/PyAqLworCQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0lOREVYLCAweDAwRUEwMDUwICsgaSAqIDQpOworCQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0RBVEEsCisJCQkJCW52X3JkMzIoZGV2LCBOVjEwX1BGQl9UU0laRShpKSkpOworCQludl93cjMyKGRldiwgMHgwMDQwMDkwMCArIGkgKiAweDEwLAorCQkJCQludl9yZDMyKGRldiwgTlYxMF9QRkJfVElMRShpKSkpOworCQkJLyogd2hpY2ggaXMgTlY0MF9QR1JBUEhfVElMRTAoaSkgPz8gKi8KKwkJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9JTkRFWCwgMHgwMEVBMDAxMCArIGkgKiA0KTsKKwkJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9EQVRBLAorCQkJCQludl9yZDMyKGRldiwgTlYxMF9QRkJfVElMRShpKSkpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCW52X3dyMzIoZGV2LCAweDQwMDk4MCArIGkgKiA0LCBudl9yZDMyKGRldiwgMHgxMDAzMDAgKyBpICogNCkpOworCQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0lOREVYLCAweDAwRUEwMDkwICsgaSAqIDQpOworCQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0RBVEEsCisJCQkJCW52X3JkMzIoZGV2LCAweDEwMDMwMCArIGkgKiA0KSk7CisJfQorCW52X3dyMzIoZGV2LCAweDQwMDlhMCwgbnZfcmQzMihkZXYsIDB4MTAwMzI0KSk7CisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9JTkRFWCwgMHgwMEVBMDAwQyk7CisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9EQVRBLCBudl9yZDMyKGRldiwgMHgxMDAzMjQpKTsKKworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9DVFhfQ09OVFJPTCwgMHgxMDAwMDEwMCk7CisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1NUQVRFICAgICAgLCAweEZGRkZGRkZGKTsKKworCXRtcCA9IG52X3JkMzIoZGV2LCBOVjEwX1BHUkFQSF9TVVJGQUNFKSAmIDB4MDAwN2ZmMDA7CisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1NVUkZBQ0UsIHRtcCk7CisJdG1wID0gbnZfcmQzMihkZXYsIE5WMTBfUEdSQVBIX1NVUkZBQ0UpIHwgMHgwMDAyMDEwMDsKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfU1VSRkFDRSwgdG1wKTsKKworCS8qIGJlZ2luIFJBTSBjb25maWcgKi8KKwl2cmFtc3ogPSBkcm1fZ2V0X3Jlc291cmNlX2xlbihkZXYsIDApIC0gMTsKKwludl93cjMyKGRldiwgMHg0MDA5QTQsIG52X3JkMzIoZGV2LCBOVjA0X1BGQl9DRkcwKSk7CisJbnZfd3IzMihkZXYsIDB4NDAwOUE4LCBudl9yZDMyKGRldiwgTlYwNF9QRkJfQ0ZHMSkpOworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfSU5ERVgsIDB4MDBFQTAwMDApOworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfREFUQSAsIG52X3JkMzIoZGV2LCBOVjA0X1BGQl9DRkcwKSk7CisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9JTkRFWCwgMHgwMEVBMDAwNCk7CisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9EQVRBICwgbnZfcmQzMihkZXYsIE5WMDRfUEZCX0NGRzEpKTsKKwludl93cjMyKGRldiwgMHg0MDA4MjAsIDApOworCW52X3dyMzIoZGV2LCAweDQwMDgyNCwgMCk7CisJbnZfd3IzMihkZXYsIDB4NDAwODY0LCB2cmFtc3ogLSAxKTsKKwludl93cjMyKGRldiwgMHg0MDA4NjgsIHZyYW1zeiAtIDEpOworCisJLyogaW50ZXJlc3RpbmcuLiB0aGUgYmVsb3cgb3ZlcndyaXRlcyBzb21lIG9mIHRoZSB0aWxlIHNldHVwIGFib3ZlLi4gKi8KKwludl93cjMyKGRldiwgMHg0MDBCMjAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwMEIwNCwgMHhGRkZGRkZGRik7CisKKwludl93cjMyKGRldiwgTlYwM19QR1JBUEhfQUJTX1VDTElQX1hNSU4sIDApOworCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9BQlNfVUNMSVBfWU1JTiwgMCk7CisJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0FCU19VQ0xJUF9YTUFYLCAweDdmZmYpOworCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9BQlNfVUNMSVBfWU1BWCwgMHg3ZmZmKTsKKworCXJldHVybiAwOworfQorCit2b2lkCitudjIwX2dyYXBoX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCW5vdXZlYXVfZ3B1b2JqX3JlZl9kZWwoZGV2LCAmZGV2X3ByaXYtPmN0eF90YWJsZSk7Cit9CisKK2ludAorbnYzMF9ncmFwaF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgcmV0LCBpOworCisJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSwKKwkJbnZfcmQzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSkgJiB+TlZfUE1DX0VOQUJMRV9QR1JBUEgpOworCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUsCisJCW52X3JkMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUpIHwgIE5WX1BNQ19FTkFCTEVfUEdSQVBIKTsKKworCWlmICghZGV2X3ByaXYtPmN0eF90YWJsZSkgeworCQkvKiBDcmVhdGUgQ29udGV4dCBQb2ludGVyIFRhYmxlICovCisJCWRldl9wcml2LT5jdHhfdGFibGVfc2l6ZSA9IDMyICogNDsKKwkJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3X3JlZihkZXYsIE5VTEwsIE5VTEwsIDAsCisJCQkJCQkgIGRldl9wcml2LT5jdHhfdGFibGVfc2l6ZSwgMTYsCisJCQkJCQkgIE5WT0JKX0ZMQUdfWkVST19BTExPQywKKwkJCQkJCSAgJmRldl9wcml2LT5jdHhfdGFibGUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwludl93cjMyKGRldiwgTlYyMF9QR1JBUEhfQ0hBTk5FTF9DVFhfVEFCTEUsCisJCQlkZXZfcHJpdi0+Y3R4X3RhYmxlLT5pbnN0YW5jZSA+PiA0KTsKKworCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSICAgLCAweEZGRkZGRkZGKTsKKwludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUl9FTiwgMHhGRkZGRkZGRik7CisKKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfREVCVUdfMCwgMHhGRkZGRkZGRik7CisJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0RFQlVHXzAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9ERUJVR18xLCAweDQwMTI4N2MwKTsKKwludl93cjMyKGRldiwgMHg0MDA4OTAsIDB4MDFiNDYzZmYpOworCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9ERUJVR18zLCAweGYyZGUwNDc1KTsKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfREVCVUdfNCwgMHgwMDAwODAwMCk7CisJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0xJTUlUX1ZJT0xfUElYLCAweGYwNGJkZmY2KTsKKwludl93cjMyKGRldiwgMHg0MDBCODAsIDB4MTAwM2Q4ODgpOworCW52X3dyMzIoZGV2LCAweDQwMEI4NCwgMHgwYzAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDAwMDk4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDAwOUMsIDB4MDAwNWFkMDApOworCW52X3dyMzIoZGV2LCAweDQwMEI4OCwgMHg2MmZmMDBmZik7IC8qIHN1c3BpY2lvdXNseSBsaWtlIFBHUkFQSF9ERUJVR18yICovCisJbnZfd3IzMihkZXYsIDB4NDAwMGEwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDAwYTQsIDB4MDAwMDAwMDgpOworCW52X3dyMzIoZGV2LCAweDQwMDhhOCwgMHhiNzg0YTQwMCk7CisJbnZfd3IzMihkZXYsIDB4NDAwYmEwLCAweDAwMmY4Njg1KTsKKwludl93cjMyKGRldiwgMHg0MDBiYTQsIDB4MDAyMzFmM2YpOworCW52X3dyMzIoZGV2LCAweDQwMDhhNCwgMHg0MDAwMDAyMCk7CisKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHgzNCkgeworCQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0lOREVYLCAweDAwRUEwMDA0KTsKKwkJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9EQVRBICwgMHgwMDIwMDIwMSk7CisJCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfSU5ERVgsIDB4MDBFQTAwMDgpOworCQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0RBVEEgLCAweDAwMDAwMDA4KTsKKwkJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9JTkRFWCwgMHgwMEVBMDAwMCk7CisJCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfREFUQSAsIDB4MDAwMDAwMzIpOworCQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0lOREVYLCAweDAwRTAwMDA0KTsKKwkJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9EQVRBICwgMHgwMDAwMDAwMik7CisJfQorCisJbnZfd3IzMihkZXYsIDB4NDAwMGMwLCAweDAwMDAwMDE2KTsKKworCS8qIGNvcHkgdGlsZSBpbmZvIGZyb20gUEZCICovCisJZm9yIChpID0gMDsgaSA8IE5WMTBfUEZCX1RJTEVfX1NJWkU7IGkrKykgeworCQludl93cjMyKGRldiwgMHgwMDQwMDkwNCArIGkgKiAweDEwLAorCQkJCQludl9yZDMyKGRldiwgTlYxMF9QRkJfVExJTUlUKGkpKSk7CisJCQkvKiB3aGljaCBpcyBOVjQwX1BHUkFQSF9UTElNSVQwKGkpID8/ICovCisJCW52X3dyMzIoZGV2LCAweDAwNDAwOTA4ICsgaSAqIDB4MTAsCisJCQkJCW52X3JkMzIoZGV2LCBOVjEwX1BGQl9UU0laRShpKSkpOworCQkJLyogd2hpY2ggaXMgTlY0MF9QR1JBUEhfVFNJWkUwKGkpID8/ICovCisJCW52X3dyMzIoZGV2LCAweDAwNDAwOTAwICsgaSAqIDB4MTAsCisJCQkJCW52X3JkMzIoZGV2LCBOVjEwX1BGQl9USUxFKGkpKSk7CisJCQkvKiB3aGljaCBpcyBOVjQwX1BHUkFQSF9USUxFMChpKSA/PyAqLworCX0KKworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9DVFhfQ09OVFJPTCwgMHgxMDAwMDEwMCk7CisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1NUQVRFICAgICAgLCAweEZGRkZGRkZGKTsKKwludl93cjMyKGRldiwgMHgwMDQwMDc1YyAgICAgICAgICAgICAsIDB4MDAwMDAwMDEpOworCisJLyogYmVnaW4gUkFNIGNvbmZpZyAqLworCS8qIHZyYW1zeiA9IGRybV9nZXRfcmVzb3VyY2VfbGVuKGRldiwgMCkgLSAxOyAqLworCW52X3dyMzIoZGV2LCAweDQwMDlBNCwgbnZfcmQzMihkZXYsIE5WMDRfUEZCX0NGRzApKTsKKwludl93cjMyKGRldiwgMHg0MDA5QTgsIG52X3JkMzIoZGV2LCBOVjA0X1BGQl9DRkcxKSk7CisJaWYgKGRldl9wcml2LT5jaGlwc2V0ICE9IDB4MzQpIHsKKwkJbnZfd3IzMihkZXYsIDB4NDAwNzUwLCAweDAwRUEwMDAwKTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwNzU0LCBudl9yZDMyKGRldiwgTlYwNF9QRkJfQ0ZHMCkpOworCQludl93cjMyKGRldiwgMHg0MDA3NTAsIDB4MDBFQTAwMDQpOworCQludl93cjMyKGRldiwgMHg0MDA3NTQsIG52X3JkMzIoZGV2LCBOVjA0X1BGQl9DRkcxKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfY2xhc3MgbnYyMF9ncmFwaF9ncmNsYXNzW10gPSB7CisJeyAweDAwMzAsIGZhbHNlLCBOVUxMIH0sIC8qIG51bGwgKi8KKwl7IDB4MDAzOSwgZmFsc2UsIE5VTEwgfSwgLyogbTJtZiAqLworCXsgMHgwMDRhLCBmYWxzZSwgTlVMTCB9LCAvKiBnZGlyZWN0ICovCisJeyAweDAwOWYsIGZhbHNlLCBOVUxMIH0sIC8qIGltYWdlYmxpdCAobnYxMikgKi8KKwl7IDB4MDA4YSwgZmFsc2UsIE5VTEwgfSwgLyogaWZjICovCisJeyAweDAwODksIGZhbHNlLCBOVUxMIH0sIC8qIHNpZm0gKi8KKwl7IDB4MDA2MiwgZmFsc2UsIE5VTEwgfSwgLyogc3VyZjJkICovCisJeyAweDAwNDMsIGZhbHNlLCBOVUxMIH0sIC8qIHJvcCAqLworCXsgMHgwMDEyLCBmYWxzZSwgTlVMTCB9LCAvKiBiZXRhMSAqLworCXsgMHgwMDcyLCBmYWxzZSwgTlVMTCB9LCAvKiBiZXRhNCAqLworCXsgMHgwMDE5LCBmYWxzZSwgTlVMTCB9LCAvKiBjbGlwcmVjdCAqLworCXsgMHgwMDQ0LCBmYWxzZSwgTlVMTCB9LCAvKiBwYXR0ZXJuICovCisJeyAweDAwOWUsIGZhbHNlLCBOVUxMIH0sIC8qIHN3enN1cmYgKi8KKwl7IDB4MDA5NiwgZmFsc2UsIE5VTEwgfSwgLyogY2VsY2l1cyAqLworCXsgMHgwMDk3LCBmYWxzZSwgTlVMTCB9LCAvKiBrZWx2aW4gKG52MjApICovCisJeyAweDA1OTcsIGZhbHNlLCBOVUxMIH0sIC8qIGtlbHZpbiAobnYyNSkgKi8KKwl7fQorfTsKKworc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9jbGFzcyBudjMwX2dyYXBoX2dyY2xhc3NbXSA9IHsKKwl7IDB4MDAzMCwgZmFsc2UsIE5VTEwgfSwgLyogbnVsbCAqLworCXsgMHgwMDM5LCBmYWxzZSwgTlVMTCB9LCAvKiBtMm1mICovCisJeyAweDAwNGEsIGZhbHNlLCBOVUxMIH0sIC8qIGdkaXJlY3QgKi8KKwl7IDB4MDA5ZiwgZmFsc2UsIE5VTEwgfSwgLyogaW1hZ2VibGl0IChudjEyKSAqLworCXsgMHgwMDhhLCBmYWxzZSwgTlVMTCB9LCAvKiBpZmMgKi8KKwl7IDB4MDM4YSwgZmFsc2UsIE5VTEwgfSwgLyogaWZjIChudjMwKSAqLworCXsgMHgwMDg5LCBmYWxzZSwgTlVMTCB9LCAvKiBzaWZtICovCisJeyAweDAzODksIGZhbHNlLCBOVUxMIH0sIC8qIHNpZm0gKG52MzApICovCisJeyAweDAwNjIsIGZhbHNlLCBOVUxMIH0sIC8qIHN1cmYyZCAqLworCXsgMHgwMzYyLCBmYWxzZSwgTlVMTCB9LCAvKiBzdXJmMmQgKG52MzApICovCisJeyAweDAwNDMsIGZhbHNlLCBOVUxMIH0sIC8qIHJvcCAqLworCXsgMHgwMDEyLCBmYWxzZSwgTlVMTCB9LCAvKiBiZXRhMSAqLworCXsgMHgwMDcyLCBmYWxzZSwgTlVMTCB9LCAvKiBiZXRhNCAqLworCXsgMHgwMDE5LCBmYWxzZSwgTlVMTCB9LCAvKiBjbGlwcmVjdCAqLworCXsgMHgwMDQ0LCBmYWxzZSwgTlVMTCB9LCAvKiBwYXR0ZXJuICovCisJeyAweDAzOWUsIGZhbHNlLCBOVUxMIH0sIC8qIHN3enN1cmYgKi8KKwl7IDB4MDM5NywgZmFsc2UsIE5VTEwgfSwgLyogcmFua2luZSAobnYzMCkgKi8KKwl7IDB4MDQ5NywgZmFsc2UsIE5VTEwgfSwgLyogcmFua2luZSAobnYzNSkgKi8KKwl7IDB4MDY5NywgZmFsc2UsIE5VTEwgfSwgLyogcmFua2luZSAobnYzNCkgKi8KKwl7fQorfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY0MF9mYi5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY0MF9mYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMWQyNzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjQwX2ZiLmMKQEAgLTAsMCArMSw2MiBAQAorI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCisKK2ludAorbnY0MF9mYl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1aW50MzJfdCBmYl9iYXJfc2l6ZSwgdG1wOworCWludCBudW1fdGlsZXM7CisJaW50IGk7CisKKwkvKiBUaGlzIGlzIHN0cmljdGx5IGEgTlY0eCByZWdpc3RlciAoZG9uJ3Qga25vdyBhYm91dCBOVjV4KS4gKi8KKwkvKiBUaGUgYmxvYiBzZXRzIHRoZXNlIHRvIGFsbCBraW5kcyBvZiB2YWx1ZXMsIGFuZCB0aGV5IG1lc3MgdXAgb3VyIHNldHVwLiAqLworCS8qIEkgZ290IHZhbHVlIDB4NTI4MDIgaW5zdGVhZC4gRm9yIHNvbWUgY2FyZHMgdGhlIGJsb2IgZXZlbiBzZXRzIGl0IGJhY2sgdG8gMHgxLiAqLworCS8qIE5vdGU6IHRoZSBibG9iIGRvZXNuJ3QgcmVhZCB0aGlzIHZhbHVlLCBzbyBpJ20gcHJldHR5IHN1cmUgdGhpcyBpcyBzYWZlIGZvciBhbGwgY2FyZHMuICovCisJLyogQW55IGlkZWEgd2hhdCB0aGlzIGlzPyAqLworCW52X3dyMzIoZGV2LCBOVjQwX1BGQl9VTktfODAwLCAweDEpOworCisJc3dpdGNoIChkZXZfcHJpdi0+Y2hpcHNldCkgeworCWNhc2UgMHg0MDoKKwljYXNlIDB4NDU6CisJCXRtcCA9IG52X3JkMzIoZGV2LCBOVjEwX1BGQl9DTE9TRV9QQUdFMik7CisJCW52X3dyMzIoZGV2LCBOVjEwX1BGQl9DTE9TRV9QQUdFMiwgdG1wICYgfigxIDw8IDE1KSk7CisJCW51bV90aWxlcyA9IE5WMTBfUEZCX1RJTEVfX1NJWkU7CisJCWJyZWFrOworCWNhc2UgMHg0NjogLyogRzcyICovCisJY2FzZSAweDQ3OiAvKiBHNzAgKi8KKwljYXNlIDB4NDk6IC8qIEc3MSAqLworCWNhc2UgMHg0YjogLyogRzczICovCisJY2FzZSAweDRjOiAvKiBDNTEgKEc3WCB2ZXJzaW9uKSAqLworCQludW1fdGlsZXMgPSBOVjQwX1BGQl9USUxFX19TSVpFXzE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW51bV90aWxlcyA9IE5WNDBfUEZCX1RJTEVfX1NJWkVfMDsKKwkJYnJlYWs7CisJfQorCisJZmJfYmFyX3NpemUgPSBkcm1fZ2V0X3Jlc291cmNlX2xlbihkZXYsIDApIC0gMTsKKwlzd2l0Y2ggKGRldl9wcml2LT5jaGlwc2V0KSB7CisJY2FzZSAweDQwOgorCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3RpbGVzOyBpKyspIHsKKwkJCW52X3dyMzIoZGV2LCBOVjEwX1BGQl9USUxFKGkpLCAwKTsKKwkJCW52X3dyMzIoZGV2LCBOVjEwX1BGQl9UTElNSVQoaSksIGZiX2Jhcl9zaXplKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3RpbGVzOyBpKyspIHsKKwkJCW52X3dyMzIoZGV2LCBOVjQwX1BGQl9USUxFKGkpLCAwKTsKKwkJCW52X3dyMzIoZGV2LCBOVjQwX1BGQl9UTElNSVQoaSksIGZiX2Jhcl9zaXplKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbnY0MF9mYl90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY0MF9maWZvLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjQwX2ZpZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGYxOWNjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY0MF9maWZvLmMKQEAgLTAsMCArMSwzMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQmVuIFNrZWdncy4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2RybS5oIgorCisjZGVmaW5lIE5WNDBfUkFNRkMoYykgKGRldl9wcml2LT5yYW1mY19vZmZzZXQgKyAoKGMpICogTlY0MF9SQU1GQ19fU0laRSkpCisjZGVmaW5lIE5WNDBfUkFNRkNfX1NJWkUgMTI4CisKK2ludAorbnY0MF9maWZvX2NyZWF0ZV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IGZjID0gTlY0MF9SQU1GQyhjaGFuLT5pZCk7CisJaW50IHJldDsKKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ld19mYWtlKGRldiwgTlY0MF9SQU1GQyhjaGFuLT5pZCksIH4wLAorCQkJCSAgICAgIE5WNDBfUkFNRkNfX1NJWkUsIE5WT0JKX0ZMQUdfWkVST19BTExPQyB8CisJCQkJICAgICAgTlZPQkpfRkxBR19aRVJPX0ZSRUUsIE5VTEwsICZjaGFuLT5yYW1mYyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOworCW52X3dpMzIoZGV2LCBmYyArICAwLCBjaGFuLT5wdXNoYnVmX2Jhc2UpOworCW52X3dpMzIoZGV2LCBmYyArICA0LCBjaGFuLT5wdXNoYnVmX2Jhc2UpOworCW52X3dpMzIoZGV2LCBmYyArIDEyLCBjaGFuLT5wdXNoYnVmLT5pbnN0YW5jZSA+PiA0KTsKKwludl93aTMyKGRldiwgZmMgKyAyNCwgTlZfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSF9UUklHXzEyOF9CWVRFUyB8CisJCQkgICAgICBOVl9QRklGT19DQUNIRTFfRE1BX0ZFVENIX1NJWkVfMTI4X0JZVEVTIHwKKwkJCSAgICAgIE5WX1BGSUZPX0NBQ0hFMV9ETUFfRkVUQ0hfTUFYX1JFUVNfOCB8CisjaWZkZWYgX19CSUdfRU5ESUFOCisJCQkgICAgICBOVl9QRklGT19DQUNIRTFfQklHX0VORElBTiB8CisjZW5kaWYKKwkJCSAgICAgIDB4MzAwMDAwMDAgLyogbm8gaWRlYS4uICovKTsKKwludl93aTMyKGRldiwgZmMgKyA1NiwgY2hhbi0+cmFtaW5fZ3JjdHgtPmluc3RhbmNlID4+IDQpOworCW52X3dpMzIoZGV2LCBmYyArIDYwLCAweDAwMDFGRkZGKTsKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCisJLyogZW5hYmxlIHRoZSBmaWZvIGRtYSBvcGVyYXRpb24gKi8KKwludl93cjMyKGRldiwgTlYwNF9QRklGT19NT0RFLAorCQludl9yZDMyKGRldiwgTlYwNF9QRklGT19NT0RFKSB8ICgxIDw8IGNoYW4tPmlkKSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK252NDBfZmlmb19kZXN0cm95X2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCisJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fTU9ERSwKKwkJbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fTU9ERSkgJiB+KDEgPDwgY2hhbi0+aWQpKTsKKworCWlmIChjaGFuLT5yYW1mYykKKwkJbm91dmVhdV9ncHVvYmpfcmVmX2RlbChkZXYsICZjaGFuLT5yYW1mYyk7Cit9CisKK3N0YXRpYyB2b2lkCitudjQwX2ZpZm9fZG9fbG9hZF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjaGlkKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdWludDMyX3QgZmMgPSBOVjQwX1JBTUZDKGNoaWQpLCB0bXAsIHRtcDI7CisKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCBmYWxzZSk7CisKKwludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX1BVVCwgbnZfcmkzMihkZXYsIGZjICsgMCkpOworCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfR0VULCBudl9yaTMyKGRldiwgZmMgKyA0KSk7CisJbnZfd3IzMihkZXYsIE5WMTBfUEZJRk9fQ0FDSEUxX1JFRl9DTlQsIG52X3JpMzIoZGV2LCBmYyArIDgpKTsKKwludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0lOU1RBTkNFLCBudl9yaTMyKGRldiwgZmMgKyAxMikpOworCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfRENPVU5ULCBudl9yaTMyKGRldiwgZmMgKyAxNikpOworCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfU1RBVEUsIG52X3JpMzIoZGV2LCBmYyArIDIwKSk7CisKKwkvKiBObyBpZGVhIHdoYXQgMHgyMDU4IGlzLi4gKi8KKwl0bXAgICA9IG52X3JpMzIoZGV2LCBmYyArIDI0KTsKKwl0bXAyICA9IG52X3JkMzIoZGV2LCAweDIwNTgpICYgMHhGRkY7CisJdG1wMiB8PSAodG1wICYgMHgzMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4MjA1OCwgdG1wMik7CisJdG1wICAmPSB+MHgzMDAwMDAwMDsKKwludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0ZFVENILCB0bXApOworCisJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0VOR0lORSwgbnZfcmkzMihkZXYsIGZjICsgMjgpKTsKKwludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfUFVMTDEsIG52X3JpMzIoZGV2LCBmYyArIDMyKSk7CisJbnZfd3IzMihkZXYsIE5WMTBfUEZJRk9fQ0FDSEUxX0FDUVVJUkVfVkFMVUUsIG52X3JpMzIoZGV2LCBmYyArIDM2KSk7CisJdG1wID0gbnZfcmkzMihkZXYsIGZjICsgNDApOworCW52X3dyMzIoZGV2LCBOVjEwX1BGSUZPX0NBQ0hFMV9BQ1FVSVJFX1RJTUVTVEFNUCwgdG1wKTsKKwludl93cjMyKGRldiwgTlYxMF9QRklGT19DQUNIRTFfQUNRVUlSRV9USU1FT1VULCBudl9yaTMyKGRldiwgZmMgKyA0NCkpOworCW52X3dyMzIoZGV2LCBOVjEwX1BGSUZPX0NBQ0hFMV9TRU1BUEhPUkUsIG52X3JpMzIoZGV2LCBmYyArIDQ4KSk7CisJbnZfd3IzMihkZXYsIE5WMTBfUEZJRk9fQ0FDSEUxX0RNQV9TVUJST1VUSU5FLCBudl9yaTMyKGRldiwgZmMgKyA1MikpOworCW52X3dyMzIoZGV2LCBOVjQwX1BGSUZPX0dSQ1RYX0lOU1RBTkNFLCBudl9yaTMyKGRldiwgZmMgKyA1NikpOworCisJLyogRG9uJ3QgY2xvYmJlciB0aGUgVElNRU9VVF9FTkFCTEVEIGZsYWcgd2hlbiByZXN0b3JpbmcgZnJvbSBSQU1GQyAqLworCXRtcCAgPSBudl9yZDMyKGRldiwgTlYwNF9QRklGT19ETUFfVElNRVNMSUNFKSAmIH4weDFGRkZGOworCXRtcCB8PSBudl9yaTMyKGRldiwgZmMgKyA2MCkgJiAweDFGRkZGOworCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0RNQV9USU1FU0xJQ0UsIHRtcCk7CisKKwludl93cjMyKGRldiwgMHgzMmU0LCBudl9yaTMyKGRldiwgZmMgKyA2NCkpOworCS8qIE5WSURJQSBkb2VzIHRoaXMgbmV4dCBsaW5lIHR3aWNlLi4uICovCisJbnZfd3IzMihkZXYsIDB4MzJlOCwgbnZfcmkzMihkZXYsIGZjICsgNjgpKTsKKwludl93cjMyKGRldiwgMHgyMDg4LCBudl9yaTMyKGRldiwgZmMgKyA3NikpOworCW52X3dyMzIoZGV2LCAweDMzMDAsIG52X3JpMzIoZGV2LCBmYyArIDgwKSk7CisKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCisJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX0dFVCwgMCk7CisJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX1BVVCwgMCk7Cit9CisKK2ludAorbnY0MF9maWZvX2xvYWRfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJdWludDMyX3QgdG1wOworCisJbnY0MF9maWZvX2RvX2xvYWRfY29udGV4dChkZXYsIGNoYW4tPmlkKTsKKworCS8qIFNldCBjaGFubmVsIGFjdGl2ZSwgYW5kIGluIERNQSBtb2RlICovCisJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX1BVU0gxLAorCQkgICAgIE5WNDBfUEZJRk9fQ0FDSEUxX1BVU0gxX0RNQSB8IGNoYW4tPmlkKTsKKwludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX1BVU0gsIDEpOworCisJLyogUmVzZXQgRE1BX0NUTF9BVF9JTkZPIHRvIElOVkFMSUQgKi8KKwl0bXAgPSBudl9yZDMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0NUTCkgJiB+KDEgPDwgMzEpOworCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfQ1RMLCB0bXApOworCisJcmV0dXJuIDA7Cit9CisKK2ludAorbnY0MF9maWZvX3VubG9hZF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9maWZvX2VuZ2luZSAqcGZpZm8gPSAmZGV2X3ByaXYtPmVuZ2luZS5maWZvOworCXVpbnQzMl90IGZjLCB0bXA7CisJaW50IGNoaWQ7CisKKwljaGlkID0gcGZpZm8tPmNoYW5uZWxfaWQoZGV2KTsKKwlpZiAoY2hpZCA8IDAgfHwgY2hpZCA+PSBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHMpCisJCXJldHVybiAwOworCWZjID0gTlY0MF9SQU1GQyhjaGlkKTsKKworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOworCW52X3dpMzIoZGV2LCBmYyArIDAsIG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfUFVUKSk7CisJbnZfd2kzMihkZXYsIGZjICsgNCwgbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9HRVQpKTsKKwludl93aTMyKGRldiwgZmMgKyA4LCBudl9yZDMyKGRldiwgTlYxMF9QRklGT19DQUNIRTFfUkVGX0NOVCkpOworCW52X3dpMzIoZGV2LCBmYyArIDEyLCBudl9yZDMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX0lOU1RBTkNFKSk7CisJbnZfd2kzMihkZXYsIGZjICsgMTYsIG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfRENPVU5UKSk7CisJbnZfd2kzMihkZXYsIGZjICsgMjAsIG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfU1RBVEUpKTsKKwl0bXAgID0gbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9GRVRDSCk7CisJdG1wIHw9IG52X3JkMzIoZGV2LCAweDIwNTgpICYgMHgzMDAwMDAwMDsKKwludl93aTMyKGRldiwgZmMgKyAyNCwgdG1wKTsKKwludl93aTMyKGRldiwgZmMgKyAyOCwgbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0VOR0lORSkpOworCW52X3dpMzIoZGV2LCBmYyArIDMyLCBudl9yZDMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfUFVMTDEpKTsKKwludl93aTMyKGRldiwgZmMgKyAzNiwgbnZfcmQzMihkZXYsIE5WMTBfUEZJRk9fQ0FDSEUxX0FDUVVJUkVfVkFMVUUpKTsKKwl0bXAgPSBudl9yZDMyKGRldiwgTlYxMF9QRklGT19DQUNIRTFfQUNRVUlSRV9USU1FU1RBTVApOworCW52X3dpMzIoZGV2LCBmYyArIDQwLCB0bXApOworCW52X3dpMzIoZGV2LCBmYyArIDQ0LCBudl9yZDMyKGRldiwgTlYxMF9QRklGT19DQUNIRTFfQUNRVUlSRV9USU1FT1VUKSk7CisJbnZfd2kzMihkZXYsIGZjICsgNDgsIG52X3JkMzIoZGV2LCBOVjEwX1BGSUZPX0NBQ0hFMV9TRU1BUEhPUkUpKTsKKwkvKiBOVklESUEgcmVhZCAweDMyMjggZmlyc3QsIHRoZW4gd3JpdGUgRE1BX0dFVCBoZXJlLi4gbWF5YmUgc29tZXRoaW5nCisJICogbW9yZSBpbnZvbHZlZCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIDB4MzIyOD8KKwkgKi8KKwludl93aTMyKGRldiwgZmMgKyA1MiwgbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9HRVQpKTsKKwludl93aTMyKGRldiwgZmMgKyA1NiwgbnZfcmQzMihkZXYsIE5WNDBfUEZJRk9fR1JDVFhfSU5TVEFOQ0UpKTsKKwludl93aTMyKGRldiwgZmMgKyA2MCwgbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fRE1BX1RJTUVTTElDRSkgJiAweDFmZmZmKTsKKwkvKiBObyBpZGVhIHdoYXQgdGhlIGJlbG93IGlzIGZvciBleGFjdGx5LCByaXBwZWQgZnJvbSBhIG1taW8tdHJhY2UgKi8KKwludl93aTMyKGRldiwgZmMgKyA2NCwgbnZfcmQzMihkZXYsIE5WNDBfUEZJRk9fVU5LMzJFNCkpOworCS8qIE5WSURJQSBkbyB0aGlzIG5leHQgbGluZSB0d2ljZS4uIGJ1Zz8gKi8KKwludl93aTMyKGRldiwgZmMgKyA2OCwgbnZfcmQzMihkZXYsIDB4MzJlOCkpOworCW52X3dpMzIoZGV2LCBmYyArIDc2LCBudl9yZDMyKGRldiwgMHgyMDg4KSk7CisJbnZfd2kzMihkZXYsIGZjICsgODAsIG52X3JkMzIoZGV2LCAweDMzMDApKTsKKyNpZiAwIC8qIG5vIHJlYWwgaWRlYSB3aGljaCBpcyBQVVQvR0VUIGluIFVOS180OC4uICovCisJdG1wICA9IG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9HRVQpOworCXRtcCB8PSAobnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX1BVVCkgPDwgMTYpOworCW52X3dpMzIoZGV2LCBmYyArIDcyLCB0bXApOworI2VuZGlmCisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKKworCW52NDBfZmlmb19kb19sb2FkX2NvbnRleHQoZGV2LCBwZmlmby0+Y2hhbm5lbHMgLSAxKTsKKwludl93cjMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfUFVTSDEsCisJCSAgICAgTlY0MF9QRklGT19DQUNIRTFfUFVTSDFfRE1BIHwgKHBmaWZvLT5jaGFubmVscyAtIDEpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK252NDBfZmlmb19pbml0X3Jlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisKKwludl93cjMyKGRldiwgTlYwM19QTUNfRU5BQkxFLAorCQludl9yZDMyKGRldiwgTlYwM19QTUNfRU5BQkxFKSAmIH5OVl9QTUNfRU5BQkxFX1BGSUZPKTsKKwludl93cjMyKGRldiwgTlYwM19QTUNfRU5BQkxFLAorCQludl9yZDMyKGRldiwgTlYwM19QTUNfRU5BQkxFKSB8ICBOVl9QTUNfRU5BQkxFX1BGSUZPKTsKKworCW52X3dyMzIoZGV2LCAweDAwMzIyNCwgMHgwMDBmMDA3OCk7CisJbnZfd3IzMihkZXYsIDB4MDAzMjEwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHgwMDMyNzAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDAwMzI0MCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4MDAzMjQ0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHgwMDMyNTgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDAwMjUwNCwgMHgwMDAwMDAwMCk7CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCW52X3dyMzIoZGV2LCAweDAwMjUxMCArIChpICogNCksIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDAwMjUwYywgMHgwMDAwZmZmZik7CisJbnZfd3IzMihkZXYsIDB4MDAyMDQ4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHgwMDMyMjgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDAwMzJlOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4MDAyNDEwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHgwMDI0MjAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDAwMjA1OCwgMHgwMDAwMDAwMSk7CisJbnZfd3IzMihkZXYsIDB4MDAyMjFjLCAweDAwMDAwMDAwKTsKKwkvKiBzb21ldGhpbmcgd2l0aCAweDIwODQsIHJlYWQvbW9kaWZ5L3dyaXRlLCBubyBjaGFuZ2UgKi8KKwludl93cjMyKGRldiwgMHgwMDIwNDAsIDB4MDAwMDAwZmYpOworCW52X3dyMzIoZGV2LCAweDAwMjUwMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4MDAzMjAwLCAweDAwMDAwMDAwKTsKKworCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0RNQV9USU1FU0xJQ0UsIDB4MjEwMWZmZmYpOworfQorCitzdGF0aWMgdm9pZAorbnY0MF9maWZvX2luaXRfcmFteHgoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fUkFNSFQsICgweDAzIDw8IDI0KSAvKiBzZWFyY2ggMTI4ICovIHwKKwkJCQkgICAgICAgKChkZXZfcHJpdi0+cmFtaHRfYml0cyAtIDkpIDw8IDE2KSB8CisJCQkJICAgICAgIChkZXZfcHJpdi0+cmFtaHRfb2Zmc2V0ID4+IDgpKTsKKwludl93cjMyKGRldiwgTlYwM19QRklGT19SQU1STywgZGV2X3ByaXYtPnJhbXJvX29mZnNldD4+OCk7CisKKwlzd2l0Y2ggKGRldl9wcml2LT5jaGlwc2V0KSB7CisJY2FzZSAweDQ3OgorCWNhc2UgMHg0OToKKwljYXNlIDB4NGI6CisJCW52X3dyMzIoZGV2LCAweDIyMzAsIDEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKGRldl9wcml2LT5jaGlwc2V0KSB7CisJY2FzZSAweDQwOgorCWNhc2UgMHg0MToKKwljYXNlIDB4NDI6CisJY2FzZSAweDQzOgorCWNhc2UgMHg0NToKKwljYXNlIDB4NDc6CisJY2FzZSAweDQ4OgorCWNhc2UgMHg0OToKKwljYXNlIDB4NGI6CisJCW52X3dyMzIoZGV2LCBOVjQwX1BGSUZPX1JBTUZDLCAweDMwMDAyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbnZfd3IzMihkZXYsIDB4MjIzMCwgMCk7CisJCW52X3dyMzIoZGV2LCBOVjQwX1BGSUZPX1JBTUZDLAorCQkJKChub3V2ZWF1X21lbV9mYl9hbW91bnQoZGV2KSAtIDUxMiAqIDEwMjQgKworCQkJICBkZXZfcHJpdi0+cmFtZmNfb2Zmc2V0KSA+PiAxNikgfCAoMyA8PCAxNikpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitudjQwX2ZpZm9faW5pdF9pbnRyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJbnZfd3IzMihkZXYsIDB4MDAyMTAwLCAweGZmZmZmZmZmKTsKKwludl93cjMyKGRldiwgMHgwMDIxNDAsIDB4ZmZmZmZmZmYpOworfQorCitpbnQKK252NDBfZmlmb19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9maWZvX2VuZ2luZSAqcGZpZm8gPSAmZGV2X3ByaXYtPmVuZ2luZS5maWZvOworCWludCBpOworCisJbnY0MF9maWZvX2luaXRfcmVzZXQoZGV2KTsKKwludjQwX2ZpZm9faW5pdF9yYW14eChkZXYpOworCisJbnY0MF9maWZvX2RvX2xvYWRfY29udGV4dChkZXYsIHBmaWZvLT5jaGFubmVscyAtIDEpOworCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9QVVNIMSwgcGZpZm8tPmNoYW5uZWxzIC0gMSk7CisKKwludjQwX2ZpZm9faW5pdF9pbnRyKGRldik7CisJcGZpZm8tPmVuYWJsZShkZXYpOworCXBmaWZvLT5yZWFzc2lnbihkZXYsIHRydWUpOworCisJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT5lbmdpbmUuZmlmby5jaGFubmVsczsgaSsrKSB7CisJCWlmIChkZXZfcHJpdi0+Zmlmb3NbaV0pIHsKKwkJCXVpbnQzMl90IG1vZGUgPSBudl9yZDMyKGRldiwgTlYwNF9QRklGT19NT0RFKTsKKwkJCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX01PREUsIG1vZGUgfCAoMSA8PCBpKSk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NDBfZ3JhcGguYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NDBfZ3JhcGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2UwYTJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY0MF9ncmFwaC5jCkBAIC0wLDAgKzEsNTYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEJlbiBTa2VnZ3MuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorCitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY0MC5jdHhwcm9nIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY0MC5jdHh2YWxzIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY0MS5jdHhwcm9nIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY0MS5jdHh2YWxzIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY0Mi5jdHhwcm9nIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY0Mi5jdHh2YWxzIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY0My5jdHhwcm9nIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY0My5jdHh2YWxzIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY0NC5jdHhwcm9nIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY0NC5jdHh2YWxzIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY0Ni5jdHhwcm9nIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY0Ni5jdHh2YWxzIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY0Ny5jdHhwcm9nIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY0Ny5jdHh2YWxzIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY0OS5jdHhwcm9nIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY0OS5jdHh2YWxzIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY0YS5jdHhwcm9nIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY0YS5jdHh2YWxzIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY0Yi5jdHhwcm9nIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY0Yi5jdHh2YWxzIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY0Yy5jdHhwcm9nIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY0Yy5jdHh2YWxzIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY0ZS5jdHhwcm9nIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY0ZS5jdHh2YWxzIik7CisKK3N0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKgorbnY0MF9ncmFwaF9jaGFubmVsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1aW50MzJfdCBpbnN0OworCWludCBpOworCisJaW5zdCA9IG52X3JkMzIoZGV2LCBOVjQwX1BHUkFQSF9DVFhDVExfQ1VSKTsKKwlpZiAoIShpbnN0ICYgTlY0MF9QR1JBUEhfQ1RYQ1RMX0NVUl9MT0FERUQpKQorCQlyZXR1cm4gTlVMTDsKKwlpbnN0ID0gKGluc3QgJiBOVjQwX1BHUkFQSF9DVFhDVExfQ1VSX0lOU1RBTkNFKSA8PCA0OworCisJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT5lbmdpbmUuZmlmby5jaGFubmVsczsgaSsrKSB7CisJCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Zmlmb3NbaV07CisKKwkJaWYgKGNoYW4gJiYgY2hhbi0+cmFtaW5fZ3JjdHggJiYKKwkJICAgIGNoYW4tPnJhbWluX2dyY3R4LT5pbnN0YW5jZSA9PSBpbnN0KQorCQkJcmV0dXJuIGNoYW47CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK2ludAorbnY0MF9ncmFwaF9jcmVhdGVfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmN0eDsKKwlpbnQgcmV0OworCisJLyogQWxsb2NhdGUgYSAxNzVLaUIgYmxvY2sgb2YgUFJBTUlOIHRvIHN0b3JlIHRoZSBjb250ZXh0LiAgVGhpcworCSAqIGlzIG1hc3NpdmUgb3ZlcmtpbGwgZm9yIGEgbG90IG9mIGNoaXBzZXRzLCBidXQgaXQgc2hvdWxkIGJlIHNhZmUKKwkgKiB1bnRpbCB3ZSdyZSBhYmxlIHRvIGltcGxlbWVudCB0aGlzIHByb3Blcmx5ICh3aWxsIGhhcHBlbiBhdCBtb3JlCisJICogb3IgbGVzcyB0aGUgc2FtZSB0aW1lIHdlJ3JlIGFibGUgdG8gd3JpdGUgb3VyIG93biBjb250ZXh0IHByb2dyYW1zLgorCSAqLworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ld19yZWYoZGV2LCBjaGFuLCBOVUxMLCAwLCAxNzUqMTAyNCwgMTYsCisJCQkJCSAgTlZPQkpfRkxBR19aRVJPX0FMTE9DLAorCQkJCQkgICZjaGFuLT5yYW1pbl9ncmN0eCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwljdHggPSBjaGFuLT5yYW1pbl9ncmN0eC0+Z3B1b2JqOworCisJLyogSW5pdGlhbGlzZSBkZWZhdWx0IGNvbnRleHQgdmFsdWVzICovCisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgdHJ1ZSk7CisJbnY0MF9ncmN0eF92YWxzX2xvYWQoZGV2LCBjdHgpOworCW52X3dvMzIoZGV2LCBjdHgsIDAsIGN0eC0+aW1fcHJhbWluLT5zdGFydCk7CisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKKworCXJldHVybiAwOworfQorCit2b2lkCitudjQwX2dyYXBoX2Rlc3Ryb3lfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCW5vdXZlYXVfZ3B1b2JqX3JlZl9kZWwoY2hhbi0+ZGV2LCAmY2hhbi0+cmFtaW5fZ3JjdHgpOworfQorCitzdGF0aWMgaW50CitudjQwX2dyYXBoX3RyYW5zZmVyX2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgaW5zdCwgaW50IHNhdmUpCit7CisJdWludDMyX3Qgb2xkX2NwLCB0diA9IDEwMDAsIHRtcDsKKwlpbnQgaTsKKworCW9sZF9jcCA9IG52X3JkMzIoZGV2LCBOVjIwX1BHUkFQSF9DSEFOTkVMX0NUWF9QT0lOVEVSKTsKKwludl93cjMyKGRldiwgTlYyMF9QR1JBUEhfQ0hBTk5FTF9DVFhfUE9JTlRFUiwgaW5zdCk7CisKKwl0bXAgID0gbnZfcmQzMihkZXYsIE5WNDBfUEdSQVBIX0NUWENUTF8wMzEwKTsKKwl0bXAgfD0gc2F2ZSA/IE5WNDBfUEdSQVBIX0NUWENUTF8wMzEwX1hGRVJfU0FWRSA6CisJCSAgICAgIE5WNDBfUEdSQVBIX0NUWENUTF8wMzEwX1hGRVJfTE9BRDsKKwludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfQ1RYQ1RMXzAzMTAsIHRtcCk7CisKKwl0bXAgID0gbnZfcmQzMihkZXYsIE5WNDBfUEdSQVBIX0NUWENUTF8wMzA0KTsKKwl0bXAgfD0gTlY0MF9QR1JBUEhfQ1RYQ1RMXzAzMDRfWEZFUl9DVFg7CisJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX0NUWENUTF8wMzA0LCB0bXApOworCisJbm91dmVhdV93YWl0X2Zvcl9pZGxlKGRldik7CisKKwlmb3IgKGkgPSAwOyBpIDwgdHY7IGkrKykgeworCQlpZiAobnZfcmQzMihkZXYsIE5WNDBfUEdSQVBIX0NUWENUTF8wMzBDKSA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJbnZfd3IzMihkZXYsIE5WMjBfUEdSQVBIX0NIQU5ORUxfQ1RYX1BPSU5URVIsIG9sZF9jcCk7CisKKwlpZiAoaSA9PSB0dikgeworCQl1aW50MzJfdCB1Y3N0YXQgPSBudl9yZDMyKGRldiwgTlY0MF9QR1JBUEhfQ1RYQ1RMX1VDT0RFX1NUQVQpOworCQlOVl9FUlJPUihkZXYsICJGYWlsZWQ6IEluc3RhbmNlPTB4JTA4eCBTYXZlPSVkXG4iLCBpbnN0LCBzYXZlKTsKKwkJTlZfRVJST1IoZGV2LCAiSVA6IDB4JTAyeCwgT3Bjb2RlOiAweCUwOHhcbiIsCisJCQkgdWNzdGF0ID4+IE5WNDBfUEdSQVBIX0NUWENUTF9VQ09ERV9TVEFUX0lQX1NISUZULAorCQkJIHVjc3RhdCAgJiBOVjQwX1BHUkFQSF9DVFhDVExfVUNPREVfU1RBVF9PUF9NQVNLKTsKKwkJTlZfRVJST1IoZGV2LCAiMHg0MDAzMEMgPSAweCUwOHhcbiIsCisJCQkgbnZfcmQzMihkZXYsIE5WNDBfUEdSQVBIX0NUWENUTF8wMzBDKSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFJlc3RvcmUgdGhlIGNvbnRleHQgZm9yIGEgc3BlY2lmaWMgY2hhbm5lbCBpbnRvIFBHUkFQSCAqLworaW50CitudjQwX2dyYXBoX2xvYWRfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJdWludDMyX3QgaW5zdDsKKwlpbnQgcmV0OworCisJaWYgKCFjaGFuLT5yYW1pbl9ncmN0eCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaW5zdCA9IGNoYW4tPnJhbWluX2dyY3R4LT5pbnN0YW5jZSA+PiA0OworCisJcmV0ID0gbnY0MF9ncmFwaF90cmFuc2Zlcl9jb250ZXh0KGRldiwgaW5zdCwgMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIDB4NDAwMzJDLCBubyBpZGVhIG9mIGl0J3MgZXhhY3QgZnVuY3Rpb24uICBDb3VsZCBzaW1wbHkgYmUgYQorCSAqIHJlY29yZCBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBQR1JBUEggY29udGV4dC4gIEl0J3MgY3VycmVudGx5CisJICogdW5rbm93biBhcyB0byB3aGF0IGJpdCAyNCBkb2VzLiAgVGhlIG52IGRkeCBoYXMgaXQgc2V0LCBzbyB3ZSB3aWxsCisJICogc2V0IGl0IGhlcmUgdG9vLgorCSAqLworCW52X3dyMzIoZGV2LCBOVjIwX1BHUkFQSF9DSEFOTkVMX0NUWF9QT0lOVEVSLCBpbnN0KTsKKwludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfQ1RYQ1RMX0NVUiwKKwkJIChpbnN0ICYgTlY0MF9QR1JBUEhfQ1RYQ1RMX0NVUl9JTlNUQU5DRSkgfAorCQkgIE5WNDBfUEdSQVBIX0NUWENUTF9DVVJfTE9BREVEKTsKKwkvKiAweDMyRTAgcmVjb3JkcyB0aGUgaW5zdGFuY2UgYWRkcmVzcyBvZiB0aGUgYWN0aXZlIEZJRk8ncyBQR1JBUEgKKwkgKiBjb250ZXh0LiAgSWYgYXQgYW55IHRpbWUgdGhpcyBkb2Vzbid0IG1hdGNoIDB4NDAwMzJDLCB5b3Ugd2lsbAorCSAqIHJlY2lldmUgUEdSQVBIX0lOVFJfQ09OVEVYVF9TV0lUQ0gKKwkgKi8KKwludl93cjMyKGRldiwgTlY0MF9QRklGT19HUkNUWF9JTlNUQU5DRSwgaW5zdCk7CisJcmV0dXJuIDA7Cit9CisKK2ludAorbnY0MF9ncmFwaF91bmxvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXVpbnQzMl90IGluc3Q7CisJaW50IHJldDsKKworCWluc3QgPSBudl9yZDMyKGRldiwgTlY0MF9QR1JBUEhfQ1RYQ1RMX0NVUik7CisJaWYgKCEoaW5zdCAmIE5WNDBfUEdSQVBIX0NUWENUTF9DVVJfTE9BREVEKSkKKwkJcmV0dXJuIDA7CisJaW5zdCAmPSBOVjQwX1BHUkFQSF9DVFhDVExfQ1VSX0lOU1RBTkNFOworCisJcmV0ID0gbnY0MF9ncmFwaF90cmFuc2Zlcl9jb250ZXh0KGRldiwgaW5zdCwgMSk7CisKKwludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfQ1RYQ1RMX0NVUiwgaW5zdCk7CisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IG5vdXZlYXVfY3R4cHJvZyB7CisJdWludDMyX3Qgc2lnbmF0dXJlOworCXVpbnQ4X3QgIHZlcnNpb247CisJdWludDE2X3QgbGVuZ3RoOworCXVpbnQzMl90IGRhdGFbXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3Qgbm91dmVhdV9jdHh2YWxzIHsKKwl1aW50MzJfdCBzaWduYXR1cmU7CisJdWludDhfdCAgdmVyc2lvbjsKKwl1aW50MzJfdCBsZW5ndGg7CisJc3RydWN0IHsKKwkJdWludDMyX3Qgb2Zmc2V0OworCQl1aW50MzJfdCB2YWx1ZTsKKwl9IGRhdGFbXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitpbnQKK252NDBfZ3JjdHhfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CisJY29uc3QgaW50IGNoaXBzZXQgPSBkZXZfcHJpdi0+Y2hpcHNldDsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCWNvbnN0IHN0cnVjdCBub3V2ZWF1X2N0eHByb2cgKmNwOworCWNvbnN0IHN0cnVjdCBub3V2ZWF1X2N0eHZhbHMgKmN2OworCWNoYXIgbmFtZVszMl07CisJaW50IHJldCwgaTsKKworCXBncmFwaC0+YWNjZWxfYmxvY2tlZCA9IHRydWU7CisKKwlpZiAoIXBncmFwaC0+Y3R4cHJvZykgeworCQlzcHJpbnRmKG5hbWUsICJub3V2ZWF1L252JTAyeC5jdHhwcm9nIiwgY2hpcHNldCk7CisJCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBuYW1lLCAmZGV2LT5wZGV2LT5kZXYpOworCQlpZiAocmV0KSB7CisJCQlOVl9FUlJPUihkZXYsICJObyBjdHhwcm9nIGZvciBOViUwMnhcbiIsIGNoaXBzZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXBncmFwaC0+Y3R4cHJvZyA9IGttYWxsb2MoZnctPnNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIXBncmFwaC0+Y3R4cHJvZykgeworCQkJTlZfRVJST1IoZGV2LCAiT09NIGNvcHlpbmcgY3R4cHJvZ1xuIik7CisJCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCW1lbWNweShwZ3JhcGgtPmN0eHByb2csIGZ3LT5kYXRhLCBmdy0+c2l6ZSk7CisKKwkJY3AgPSBwZ3JhcGgtPmN0eHByb2c7CisJCWlmIChjcC0+c2lnbmF0dXJlICE9IDB4NTA0MzU2NGUgfHwgY3AtPnZlcnNpb24gIT0gMCB8fAorCQkgICAgY3AtPmxlbmd0aCAhPSAoKGZ3LT5zaXplIC0gNykgLyA0KSkgeworCQkJTlZfRVJST1IoZGV2LCAiY3R4cHJvZyBpbnZhbGlkXG4iKTsKKwkJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCQkJbnY0MF9ncmN0eF9maW5pKGRldik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwl9CisKKwlpZiAoIXBncmFwaC0+Y3R4dmFscykgeworCQlzcHJpbnRmKG5hbWUsICJub3V2ZWF1L252JTAyeC5jdHh2YWxzIiwgY2hpcHNldCk7CisJCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBuYW1lLCAmZGV2LT5wZGV2LT5kZXYpOworCQlpZiAocmV0KSB7CisJCQlOVl9FUlJPUihkZXYsICJObyBjdHh2YWxzIGZvciBOViUwMnhcbiIsIGNoaXBzZXQpOworCQkJbnY0MF9ncmN0eF9maW5pKGRldik7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcGdyYXBoLT5jdHh2YWxzID0ga21hbGxvYyhmdy0+c2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcGdyYXBoLT5jdHhwcm9nKSB7CisJCQlOVl9FUlJPUihkZXYsICJPT00gY29weWluZyBjdHhwcm9nXG4iKTsKKwkJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCQkJbnY0MF9ncmN0eF9maW5pKGRldik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQltZW1jcHkocGdyYXBoLT5jdHh2YWxzLCBmdy0+ZGF0YSwgZnctPnNpemUpOworCisJCWN2ID0gKHZvaWQgKilwZ3JhcGgtPmN0eHZhbHM7CisJCWlmIChjdi0+c2lnbmF0dXJlICE9IDB4NTY0MzU2NGUgfHwgY3YtPnZlcnNpb24gIT0gMCB8fAorCQkgICAgY3YtPmxlbmd0aCAhPSAoKGZ3LT5zaXplIC0gOSkgLyA4KSkgeworCQkJTlZfRVJST1IoZGV2LCAiY3R4dmFscyBpbnZhbGlkXG4iKTsKKwkJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCQkJbnY0MF9ncmN0eF9maW5pKGRldik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwl9CisKKwljcCA9IHBncmFwaC0+Y3R4cHJvZzsKKworCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9DVFhDVExfVUNPREVfSU5ERVgsIDApOworCWZvciAoaSA9IDA7IGkgPCBjcC0+bGVuZ3RoOyBpKyspCisJCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9DVFhDVExfVUNPREVfREFUQSwgY3AtPmRhdGFbaV0pOworCisJcGdyYXBoLT5hY2NlbF9ibG9ja2VkID0gZmFsc2U7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK252NDBfZ3JjdHhfZmluaShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CisKKwlpZiAocGdyYXBoLT5jdHhwcm9nKSB7CisJCWtmcmVlKHBncmFwaC0+Y3R4cHJvZyk7CisJCXBncmFwaC0+Y3R4cHJvZyA9IE5VTEw7CisJfQorCisJaWYgKHBncmFwaC0+Y3R4dmFscykgeworCQlrZnJlZShwZ3JhcGgtPmN0eHByb2cpOworCQlwZ3JhcGgtPmN0eHZhbHMgPSBOVUxMOworCX0KK30KKwordm9pZAorbnY0MF9ncmN0eF92YWxzX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpjdHgpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICpwZ3JhcGggPSAmZGV2X3ByaXYtPmVuZ2luZS5ncmFwaDsKKwlzdHJ1Y3Qgbm91dmVhdV9jdHh2YWxzICpjdiA9IHBncmFwaC0+Y3R4dmFsczsKKwlpbnQgaTsKKworCWlmICghY3YpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBjdi0+bGVuZ3RoOyBpKyspCisJCW52X3dvMzIoZGV2LCBjdHgsIGN2LT5kYXRhW2ldLm9mZnNldCwgY3YtPmRhdGFbaV0udmFsdWUpOworfQorCisvKgorICogRzcwCQkweDQ3CisgKiBHNzEJCTB4NDkKKyAqIE5WNDUJCTB4NDgKKyAqIEc3MltNXQkweDQ2CisgKiBHNzMJCTB4NGIKKyAqIEM1MV9HN1gJMHg0YworICogQzUxCQkweDRlCisgKi8KK2ludAorbnY0MF9ncmFwaF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0KKwkJKHN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICopZGV2LT5kZXZfcHJpdmF0ZTsKKwl1aW50MzJfdCB2cmFtc3osIHRtcDsKKwlpbnQgaSwgajsKKworCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUsIG52X3JkMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUpICYKKwkJCX5OVl9QTUNfRU5BQkxFX1BHUkFQSCk7CisJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSwgbnZfcmQzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSkgfAorCQkJIE5WX1BNQ19FTkFCTEVfUEdSQVBIKTsKKworCW52NDBfZ3JjdHhfaW5pdChkZXYpOworCisJLyogTm8gY29udGV4dCBwcmVzZW50IGN1cnJlbnRseSAqLworCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9DVFhDVExfQ1VSLCAweDAwMDAwMDAwKTsKKworCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSICAgLCAweEZGRkZGRkZGKTsKKwludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfSU5UUl9FTiwgMHhGRkZGRkZGRik7CisKKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfREVCVUdfMCwgMHhGRkZGRkZGRik7CisJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0RFQlVHXzAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9ERUJVR18xLCAweDQwMTI4N2MwKTsKKwludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfREVCVUdfMywgMHhlMGRlODA1NSk7CisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX0RFQlVHXzQsIDB4MDAwMDgwMDApOworCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9MSU1JVF9WSU9MX1BJWCwgMHgwMGJlM2M1Zik7CisKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfQ1RYX0NPTlRST0wsIDB4MTAwMTAxMDApOworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9TVEFURSAgICAgICwgMHhGRkZGRkZGRik7CisKKwlqID0gbnZfcmQzMihkZXYsIDB4MTU0MCkgJiAweGZmOworCWlmIChqKSB7CisJCWZvciAoaSA9IDA7ICEoaiAmIDEpOyBqID4+PSAxLCBpKyspCisJCQk7CisJCW52X3dyMzIoZGV2LCAweDQwNTAwMCwgaSk7CisJfQorCisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID09IDB4NDApIHsKKwkJbnZfd3IzMihkZXYsIDB4NDAwOWIwLCAweDgzMjgwZmZmKTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwOWI0LCAweDAwMDAwMGEwKTsKKwl9IGVsc2UgeworCQludl93cjMyKGRldiwgMHg0MDA4MjAsIDB4ODMyODBlZmYpOworCQludl93cjMyKGRldiwgMHg0MDA4MjQsIDB4MDAwMDAwYTApOworCX0KKworCXN3aXRjaCAoZGV2X3ByaXYtPmNoaXBzZXQpIHsKKwljYXNlIDB4NDA6CisJY2FzZSAweDQ1OgorCQludl93cjMyKGRldiwgMHg0MDA5YjgsIDB4MDA3OGUzNjYpOworCQludl93cjMyKGRldiwgMHg0MDA5YmMsIDB4MDAwMDAxNGMpOworCQlicmVhazsKKwljYXNlIDB4NDE6CisJY2FzZSAweDQyOiAvKiBwY2lpZCBhbHNvIDB4MDBDeCAqLworCS8qIGNhc2UgMHgwMTIwOiBYWFggKHBjaWlkKSAqLworCQludl93cjMyKGRldiwgMHg0MDA4MjgsIDB4MDA3NTk2ZmYpOworCQludl93cjMyKGRldiwgMHg0MDA4MmMsIDB4MDAwMDAxMDgpOworCQlicmVhazsKKwljYXNlIDB4NDM6CisJCW52X3dyMzIoZGV2LCAweDQwMDgyOCwgMHgwMDcyY2I3Nyk7CisJCW52X3dyMzIoZGV2LCAweDQwMDgyYywgMHgwMDAwMDEwOCk7CisJCWJyZWFrOworCWNhc2UgMHg0NDoKKwljYXNlIDB4NDY6IC8qIEc3MiAqLworCWNhc2UgMHg0YToKKwljYXNlIDB4NGM6IC8qIEc3eC1iYXNlZCBDNTEgKi8KKwljYXNlIDB4NGU6CisJCW52X3dyMzIoZGV2LCAweDQwMDg2MCwgMCk7CisJCW52X3dyMzIoZGV2LCAweDQwMDg2NCwgMCk7CisJCWJyZWFrOworCWNhc2UgMHg0NzogLyogRzcwICovCisJY2FzZSAweDQ5OiAvKiBHNzEgKi8KKwljYXNlIDB4NGI6IC8qIEc3MyAqLworCQludl93cjMyKGRldiwgMHg0MDA4MjgsIDB4MDc4MzA2MTApOworCQludl93cjMyKGRldiwgMHg0MDA4MmMsIDB4MDAwMDAxNkEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwludl93cjMyKGRldiwgMHg0MDBiMzgsIDB4MmZmZmY4MDApOworCW52X3dyMzIoZGV2LCAweDQwMGIzYywgMHgwMDAwNjAwMCk7CisKKwkvKiBjb3B5IHRpbGUgaW5mbyBmcm9tIFBGQiAqLworCXN3aXRjaCAoZGV2X3ByaXYtPmNoaXBzZXQpIHsKKwljYXNlIDB4NDA6IC8qIHZhbmlsbGEgTlY0MCAqLworCQlmb3IgKGkgPSAwOyBpIDwgTlYxMF9QRkJfVElMRV9fU0laRTsgaSsrKSB7CisJCQl0bXAgPSBudl9yZDMyKGRldiwgTlYxMF9QRkJfVElMRShpKSk7CisJCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfVElMRTAoaSksIHRtcCk7CisJCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfVElMRTEoaSksIHRtcCk7CisJCQl0bXAgPSBudl9yZDMyKGRldiwgTlYxMF9QRkJfVExJTUlUKGkpKTsKKwkJCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9UTElNSVQwKGkpLCB0bXApOworCQkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX1RMSU1JVDEoaSksIHRtcCk7CisJCQl0bXAgPSBudl9yZDMyKGRldiwgTlYxMF9QRkJfVFNJWkUoaSkpOworCQkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX1RTSVpFMChpKSwgdG1wKTsKKwkJCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9UU0laRTEoaSksIHRtcCk7CisJCQl0bXAgPSBudl9yZDMyKGRldiwgTlYxMF9QRkJfVFNUQVRVUyhpKSk7CisJCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfVFNUQVRVUzAoaSksIHRtcCk7CisJCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfVFNUQVRVUzEoaSksIHRtcCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAweDQ0OgorCWNhc2UgMHg0YToKKwljYXNlIDB4NGU6IC8qIE5WNDQtYmFzZWQgY29yZXMgZG9uJ3QgaGF2ZSAweDQwNjkwMD8gKi8KKwkJZm9yIChpID0gMDsgaSA8IE5WNDBfUEZCX1RJTEVfX1NJWkVfMDsgaSsrKSB7CisJCQl0bXAgPSBudl9yZDMyKGRldiwgTlY0MF9QRkJfVElMRShpKSk7CisJCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfVElMRTAoaSksIHRtcCk7CisJCQl0bXAgPSBudl9yZDMyKGRldiwgTlY0MF9QRkJfVExJTUlUKGkpKTsKKwkJCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9UTElNSVQwKGkpLCB0bXApOworCQkJdG1wID0gbnZfcmQzMihkZXYsIE5WNDBfUEZCX1RTSVpFKGkpKTsKKwkJCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9UU0laRTAoaSksIHRtcCk7CisJCQl0bXAgPSBudl9yZDMyKGRldiwgTlY0MF9QRkJfVFNUQVRVUyhpKSk7CisJCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfVFNUQVRVUzAoaSksIHRtcCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAweDQ2OgorCWNhc2UgMHg0NzoKKwljYXNlIDB4NDk6CisJY2FzZSAweDRiOiAvKiBHN1gtYmFzZWQgY29yZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IE5WNDBfUEZCX1RJTEVfX1NJWkVfMTsgaSsrKSB7CisJCQl0bXAgPSBudl9yZDMyKGRldiwgTlY0MF9QRkJfVElMRShpKSk7CisJCQludl93cjMyKGRldiwgTlY0N19QR1JBUEhfVElMRTAoaSksIHRtcCk7CisJCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfVElMRTEoaSksIHRtcCk7CisJCQl0bXAgPSBudl9yZDMyKGRldiwgTlY0MF9QRkJfVExJTUlUKGkpKTsKKwkJCW52X3dyMzIoZGV2LCBOVjQ3X1BHUkFQSF9UTElNSVQwKGkpLCB0bXApOworCQkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX1RMSU1JVDEoaSksIHRtcCk7CisJCQl0bXAgPSBudl9yZDMyKGRldiwgTlY0MF9QRkJfVFNJWkUoaSkpOworCQkJbnZfd3IzMihkZXYsIE5WNDdfUEdSQVBIX1RTSVpFMChpKSwgdG1wKTsKKwkJCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9UU0laRTEoaSksIHRtcCk7CisJCQl0bXAgPSBudl9yZDMyKGRldiwgTlY0MF9QRkJfVFNUQVRVUyhpKSk7CisJCQludl93cjMyKGRldiwgTlY0N19QR1JBUEhfVFNUQVRVUzAoaSksIHRtcCk7CisJCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfVFNUQVRVUzEoaSksIHRtcCk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDogLyogZXZlcnl0aGluZyBlbHNlICovCisJCWZvciAoaSA9IDA7IGkgPCBOVjQwX1BGQl9USUxFX19TSVpFXzA7IGkrKykgeworCQkJdG1wID0gbnZfcmQzMihkZXYsIE5WNDBfUEZCX1RJTEUoaSkpOworCQkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX1RJTEUwKGkpLCB0bXApOworCQkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX1RJTEUxKGkpLCB0bXApOworCQkJdG1wID0gbnZfcmQzMihkZXYsIE5WNDBfUEZCX1RMSU1JVChpKSk7CisJCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfVExJTUlUMChpKSwgdG1wKTsKKwkJCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9UTElNSVQxKGkpLCB0bXApOworCQkJdG1wID0gbnZfcmQzMihkZXYsIE5WNDBfUEZCX1RTSVpFKGkpKTsKKwkJCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9UU0laRTAoaSksIHRtcCk7CisJCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfVFNJWkUxKGkpLCB0bXApOworCQkJdG1wID0gbnZfcmQzMihkZXYsIE5WNDBfUEZCX1RTVEFUVVMoaSkpOworCQkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX1RTVEFUVVMwKGkpLCB0bXApOworCQkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX1RTVEFUVVMxKGkpLCB0bXApOworCQl9CisJCWJyZWFrOworCX0KKworCS8qIGJlZ2luIFJBTSBjb25maWcgKi8KKwl2cmFtc3ogPSBkcm1fZ2V0X3Jlc291cmNlX2xlbihkZXYsIDApIC0gMTsKKwlzd2l0Y2ggKGRldl9wcml2LT5jaGlwc2V0KSB7CisJY2FzZSAweDQwOgorCQludl93cjMyKGRldiwgMHg0MDA5QTQsIG52X3JkMzIoZGV2LCBOVjA0X1BGQl9DRkcwKSk7CisJCW52X3dyMzIoZGV2LCAweDQwMDlBOCwgbnZfcmQzMihkZXYsIE5WMDRfUEZCX0NGRzEpKTsKKwkJbnZfd3IzMihkZXYsIDB4NDA2OUE0LCBudl9yZDMyKGRldiwgTlYwNF9QRkJfQ0ZHMCkpOworCQludl93cjMyKGRldiwgMHg0MDY5QTgsIG52X3JkMzIoZGV2LCBOVjA0X1BGQl9DRkcxKSk7CisJCW52X3dyMzIoZGV2LCAweDQwMDgyMCwgMCk7CisJCW52X3dyMzIoZGV2LCAweDQwMDgyNCwgMCk7CisJCW52X3dyMzIoZGV2LCAweDQwMDg2NCwgdnJhbXN6KTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwODY4LCB2cmFtc3opOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzd2l0Y2ggKGRldl9wcml2LT5jaGlwc2V0KSB7CisJCWNhc2UgMHg0NjoKKwkJY2FzZSAweDQ3OgorCQljYXNlIDB4NDk6CisJCWNhc2UgMHg0YjoKKwkJCW52X3dyMzIoZGV2LCAweDQwMERGMCwgbnZfcmQzMihkZXYsIE5WMDRfUEZCX0NGRzApKTsKKwkJCW52X3dyMzIoZGV2LCAweDQwMERGNCwgbnZfcmQzMihkZXYsIE5WMDRfUEZCX0NGRzEpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbnZfd3IzMihkZXYsIDB4NDAwOUYwLCBudl9yZDMyKGRldiwgTlYwNF9QRkJfQ0ZHMCkpOworCQkJbnZfd3IzMihkZXYsIDB4NDAwOUY0LCBudl9yZDMyKGRldiwgTlYwNF9QRkJfQ0ZHMSkpOworCQkJYnJlYWs7CisJCX0KKwkJbnZfd3IzMihkZXYsIDB4NDA2OUYwLCBudl9yZDMyKGRldiwgTlYwNF9QRkJfQ0ZHMCkpOworCQludl93cjMyKGRldiwgMHg0MDY5RjQsIG52X3JkMzIoZGV2LCBOVjA0X1BGQl9DRkcxKSk7CisJCW52X3dyMzIoZGV2LCAweDQwMDg0MCwgMCk7CisJCW52X3dyMzIoZGV2LCAweDQwMDg0NCwgMCk7CisJCW52X3dyMzIoZGV2LCAweDQwMDhBMCwgdnJhbXN6KTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwOEE0LCB2cmFtc3opOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBudjQwX2dyYXBoX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7Cit9CisKK3N0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfY2xhc3MgbnY0MF9ncmFwaF9ncmNsYXNzW10gPSB7CisJeyAweDAwMzAsIGZhbHNlLCBOVUxMIH0sIC8qIG51bGwgKi8KKwl7IDB4MDAzOSwgZmFsc2UsIE5VTEwgfSwgLyogbTJtZiAqLworCXsgMHgwMDRhLCBmYWxzZSwgTlVMTCB9LCAvKiBnZGlyZWN0ICovCisJeyAweDAwOWYsIGZhbHNlLCBOVUxMIH0sIC8qIGltYWdlYmxpdCAobnYxMikgKi8KKwl7IDB4MDA4YSwgZmFsc2UsIE5VTEwgfSwgLyogaWZjICovCisJeyAweDAwODksIGZhbHNlLCBOVUxMIH0sIC8qIHNpZm0gKi8KKwl7IDB4MzA4OSwgZmFsc2UsIE5VTEwgfSwgLyogc2lmbSAobnY0MCkgKi8KKwl7IDB4MDA2MiwgZmFsc2UsIE5VTEwgfSwgLyogc3VyZjJkICovCisJeyAweDMwNjIsIGZhbHNlLCBOVUxMIH0sIC8qIHN1cmYyZCAobnY0MCkgKi8KKwl7IDB4MDA0MywgZmFsc2UsIE5VTEwgfSwgLyogcm9wICovCisJeyAweDAwMTIsIGZhbHNlLCBOVUxMIH0sIC8qIGJldGExICovCisJeyAweDAwNzIsIGZhbHNlLCBOVUxMIH0sIC8qIGJldGE0ICovCisJeyAweDAwMTksIGZhbHNlLCBOVUxMIH0sIC8qIGNsaXByZWN0ICovCisJeyAweDAwNDQsIGZhbHNlLCBOVUxMIH0sIC8qIHBhdHRlcm4gKi8KKwl7IDB4MzA5ZSwgZmFsc2UsIE5VTEwgfSwgLyogc3d6c3VyZiAqLworCXsgMHg0MDk3LCBmYWxzZSwgTlVMTCB9LCAvKiBjdXJpZSAobnY0MCkgKi8KKwl7IDB4NDQ5NywgZmFsc2UsIE5VTEwgfSwgLyogY3VyaWUgKG52NDQpICovCisJe30KK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NDBfbWMuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NDBfbWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTM0OTVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY0MF9tYy5jCkBAIC0wLDAgKzEsMzggQEAKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2RybS5oIgorCitpbnQKK252NDBfbWNfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdWludDMyX3QgdG1wOworCisJLyogUG93ZXIgdXAgZXZlcnl0aGluZywgcmVzZXR0aW5nIGVhY2ggaW5kaXZpZHVhbCB1bml0IHdpbGwKKwkgKiBiZSBkb25lIGxhdGVyIGlmIG5lZWRlZC4KKwkgKi8KKwludl93cjMyKGRldiwgTlYwM19QTUNfRU5BQkxFLCAweEZGRkZGRkZGKTsKKworCXN3aXRjaCAoZGV2X3ByaXYtPmNoaXBzZXQpIHsKKwljYXNlIDB4NDQ6CisJY2FzZSAweDQ2OiAvKiBHNzIgKi8KKwljYXNlIDB4NGU6CisJY2FzZSAweDRjOiAvKiBDNTFfRzdYICovCisJCXRtcCA9IG52X3JkMzIoZGV2LCBOVjQwX1BGQl8wMjBDKTsKKwkJbnZfd3IzMihkZXYsIE5WNDBfUE1DXzE3MDAsIHRtcCk7CisJCW52X3dyMzIoZGV2LCBOVjQwX1BNQ18xNzA0LCAwKTsKKwkJbnZfd3IzMihkZXYsIE5WNDBfUE1DXzE3MDgsIDApOworCQludl93cjMyKGRldiwgTlY0MF9QTUNfMTcwQywgdG1wKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK252NDBfbWNfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9jcnRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhlMjhhMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfY3J0Yy5jCkBAIC0wLDAgKzEsNzY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1hYXJ0ZW4gTWFhdGh1aXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybV9tb2RlLmgiCisjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCisKKyNkZWZpbmUgTk9VVkVBVV9ETUFfREVCVUcgKG5vdXZlYXVfcmVnX2RlYnVnICYgTk9VVkVBVV9SRUdfREVCVUdfRVZPKQorI2luY2x1ZGUgIm5vdXZlYXVfcmVnLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2h3LmgiCisjaW5jbHVkZSAibm91dmVhdV9lbmNvZGVyLmgiCisjaW5jbHVkZSAibm91dmVhdV9jcnRjLmgiCisjaW5jbHVkZSAibm91dmVhdV9mYi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfY29ubmVjdG9yLmgiCisjaW5jbHVkZSAibnY1MF9kaXNwbGF5LmgiCisKK3N0YXRpYyB2b2lkCitudjUwX2NydGNfbHV0X2xvYWQoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisJdm9pZCBfX2lvbWVtICpsdXQgPSBudmJvX2ttYXBfb2JqX2lvdmlydHVhbChudl9jcnRjLT5sdXQubnZibyk7CisJaW50IGk7CisKKwlOVl9ERUJVRyhjcnRjLT5kZXYsICJcbiIpOworCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCXdyaXRldyhudl9jcnRjLT5sdXQucltpXSA+PiAyLCBsdXQgKyA4KmkgKyAwKTsKKwkJd3JpdGV3KG52X2NydGMtPmx1dC5nW2ldID4+IDIsIGx1dCArIDgqaSArIDIpOworCQl3cml0ZXcobnZfY3J0Yy0+bHV0LmJbaV0gPj4gMiwgbHV0ICsgOCppICsgNCk7CisJfQorCisJaWYgKG52X2NydGMtPmx1dC5kZXB0aCA9PSAzMCkgeworCQl3cml0ZXcobnZfY3J0Yy0+bHV0LnJbaSAtIDFdID4+IDIsIGx1dCArIDgqaSArIDApOworCQl3cml0ZXcobnZfY3J0Yy0+bHV0LmdbaSAtIDFdID4+IDIsIGx1dCArIDgqaSArIDIpOworCQl3cml0ZXcobnZfY3J0Yy0+bHV0LmJbaSAtIDFdID4+IDIsIGx1dCArIDgqaSArIDQpOworCX0KK30KKworaW50CitudjUwX2NydGNfYmxhbmsoc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YywgYm9vbCBibGFua2VkKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBudl9jcnRjLT5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmV2byA9IGRldl9wcml2LT5ldm87CisJaW50IGluZGV4ID0gbnZfY3J0Yy0+aW5kZXgsIHJldDsKKworCU5WX0RFQlVHKGRldiwgImluZGV4ICVkXG4iLCBudl9jcnRjLT5pbmRleCk7CisJTlZfREVCVUcoZGV2LCAiJXNcbiIsIGJsYW5rZWQgPyAiYmxhbmtlZCIgOiAidW5ibGFua2VkIik7CisKKwlpZiAoYmxhbmtlZCkgeworCQludl9jcnRjLT5jdXJzb3IuaGlkZShudl9jcnRjLCBmYWxzZSk7CisKKwkJcmV0ID0gUklOR19TUEFDRShldm8sIGRldl9wcml2LT5jaGlwc2V0ICE9IDB4NTAgPyA3IDogNSk7CisJCWlmIChyZXQpIHsKKwkJCU5WX0VSUk9SKGRldiwgIm5vIHNwYWNlIHdoaWxlIGJsYW5raW5nIGNydGNcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fQ1JUQyhpbmRleCwgQ0xVVF9NT0RFKSwgMik7CisJCU9VVF9SSU5HKGV2bywgTlY1MF9FVk9fQ1JUQ19DTFVUX01PREVfQkxBTkspOworCQlPVVRfUklORyhldm8sIDApOworCQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgIT0gMHg1MCkgeworCQkJQkVHSU5fUklORyhldm8sIDAsIE5WODRfRVZPX0NSVEMoaW5kZXgsIENMVVRfRE1BKSwgMSk7CisJCQlPVVRfUklORyhldm8sIE5WODRfRVZPX0NSVENfQ0xVVF9ETUFfSEFORExFX05PTkUpOworCQl9CisKKwkJQkVHSU5fUklORyhldm8sIDAsIE5WNTBfRVZPX0NSVEMoaW5kZXgsIEZCX0RNQSksIDEpOworCQlPVVRfUklORyhldm8sIE5WNTBfRVZPX0NSVENfRkJfRE1BX0hBTkRMRV9OT05FKTsKKwl9IGVsc2UgeworCQlpZiAobnZfY3J0Yy0+Y3Vyc29yLnZpc2libGUpCisJCQludl9jcnRjLT5jdXJzb3Iuc2hvdyhudl9jcnRjLCBmYWxzZSk7CisJCWVsc2UKKwkJCW52X2NydGMtPmN1cnNvci5oaWRlKG52X2NydGMsIGZhbHNlKTsKKworCQlyZXQgPSBSSU5HX1NQQUNFKGV2bywgZGV2X3ByaXYtPmNoaXBzZXQgIT0gMHg1MCA/IDEwIDogOCk7CisJCWlmIChyZXQpIHsKKwkJCU5WX0VSUk9SKGRldiwgIm5vIHNwYWNlIHdoaWxlIHVuYmxhbmtpbmcgY3J0Y1xuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19DUlRDKGluZGV4LCBDTFVUX01PREUpLCAyKTsKKwkJT1VUX1JJTkcoZXZvLCBudl9jcnRjLT5sdXQuZGVwdGggPT0gOCA/CisJCQkJTlY1MF9FVk9fQ1JUQ19DTFVUX01PREVfT0ZGIDoKKwkJCQlOVjUwX0VWT19DUlRDX0NMVVRfTU9ERV9PTik7CisJCU9VVF9SSU5HKGV2bywgKG52X2NydGMtPmx1dC5udmJvLT5iby5tZW0ubW1fbm9kZS0+c3RhcnQgPDwKKwkJCQkgUEFHRV9TSElGVCkgPj4gOCk7CisJCWlmIChkZXZfcHJpdi0+Y2hpcHNldCAhPSAweDUwKSB7CisJCQlCRUdJTl9SSU5HKGV2bywgMCwgTlY4NF9FVk9fQ1JUQyhpbmRleCwgQ0xVVF9ETUEpLCAxKTsKKwkJCU9VVF9SSU5HKGV2bywgTnZFdm9WUkFNKTsKKwkJfQorCisJCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19DUlRDKGluZGV4LCBGQl9PRkZTRVQpLCAyKTsKKwkJT1VUX1JJTkcoZXZvLCBudl9jcnRjLT5mYi5vZmZzZXQgPj4gOCk7CisJCU9VVF9SSU5HKGV2bywgMCk7CisJCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19DUlRDKGluZGV4LCBGQl9ETUEpLCAxKTsKKwkJaWYgKGRldl9wcml2LT5jaGlwc2V0ICE9IDB4NTApCisJCQlpZiAobnZfY3J0Yy0+ZmIudGlsZV9mbGFncyA9PSAweDdhMDApCisJCQkJT1VUX1JJTkcoZXZvLCBOdkV2b0ZCMzIpOworCQkJZWxzZQorCQkJaWYgKG52X2NydGMtPmZiLnRpbGVfZmxhZ3MgPT0gMHg3MDAwKQorCQkJCU9VVF9SSU5HKGV2bywgTnZFdm9GQjE2KTsKKwkJCWVsc2UKKwkJCQlPVVRfUklORyhldm8sIE52RXZvVlJBTSk7CisJCWVsc2UKKwkJCU9VVF9SSU5HKGV2bywgTnZFdm9WUkFNKTsKKwl9CisKKwludl9jcnRjLT5mYi5ibGFua2VkID0gYmxhbmtlZDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnY1MF9jcnRjX3NldF9kaXRoZXIoc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YywgYm9vbCBvbiwgYm9vbCB1cGRhdGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG52X2NydGMtPmJhc2UuZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqZXZvID0gZGV2X3ByaXYtPmV2bzsKKwlpbnQgcmV0OworCisJTlZfREVCVUcoZGV2LCAiXG4iKTsKKworCXJldCA9IFJJTkdfU1BBQ0UoZXZvLCAyICsgKHVwZGF0ZSA/IDIgOiAwKSk7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJubyBzcGFjZSB3aGlsZSBzZXR0aW5nIGRpdGhlclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJQkVHSU5fUklORyhldm8sIDAsIE5WNTBfRVZPX0NSVEMobnZfY3J0Yy0+aW5kZXgsIERJVEhFUl9DVFJMKSwgMSk7CisJaWYgKG9uKQorCQlPVVRfUklORyhldm8sIE5WNTBfRVZPX0NSVENfRElUSEVSX0NUUkxfT04pOworCWVsc2UKKwkJT1VUX1JJTkcoZXZvLCBOVjUwX0VWT19DUlRDX0RJVEhFUl9DVFJMX09GRik7CisKKwlpZiAodXBkYXRlKSB7CisJCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19VUERBVEUsIDEpOworCQlPVVRfUklORyhldm8sIDApOworCQlGSVJFX1JJTkcoZXZvKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICoKK25vdXZlYXVfY3J0Y19jb25uZWN0b3JfZ2V0KHN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG52X2NydGMtPmJhc2UuZGV2OworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJc3RydWN0IGRybV9jcnRjICpjcnRjID0gdG9fZHJtX2NydGMobnZfY3J0Yyk7CisKKwkvKiBUaGUgc2FmZXN0IGFwcHJvYWNoIGlzIHRvIGZpbmQgYW4gZW5jb2RlciB3aXRoIHRoZSByaWdodCBjcnRjLCB0aGF0CisJICogaXMgYWxzbyBsaW5rZWQgdG8gYSBjb25uZWN0b3IuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7CisJCWlmIChjb25uZWN0b3ItPmVuY29kZXIpCisJCQlpZiAoY29ubmVjdG9yLT5lbmNvZGVyLT5jcnRjID09IGNydGMpCisJCQkJcmV0dXJuIG5vdXZlYXVfY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQKK252NTBfY3J0Y19zZXRfc2NhbGUoc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YywgaW50IHNjYWxpbmdfbW9kZSwgYm9vbCB1cGRhdGUpCit7CisJc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpudl9jb25uZWN0b3IgPQorCQlub3V2ZWF1X2NydGNfY29ubmVjdG9yX2dldChudl9jcnRjKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbnZfY3J0Yy0+YmFzZS5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpldm8gPSBkZXZfcHJpdi0+ZXZvOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpuYXRpdmVfbW9kZSA9IE5VTEw7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUgPSAmbnZfY3J0Yy0+YmFzZS5tb2RlOworCXVpbnQzMl90IG91dFgsIG91dFksIGhvcml6LCB2ZXJ0OworCWludCByZXQ7CisKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCisJc3dpdGNoIChzY2FsaW5nX21vZGUpIHsKKwljYXNlIERSTV9NT0RFX1NDQUxFX05PTkU6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmICghbnZfY29ubmVjdG9yIHx8ICFudl9jb25uZWN0b3ItPm5hdGl2ZV9tb2RlKSB7CisJCQlOVl9FUlJPUihkZXYsICJObyBuYXRpdmUgbW9kZSwgZm9yY2luZyBwYW5lbCBzY2FsaW5nXG4iKTsKKwkJCXNjYWxpbmdfbW9kZSA9IERSTV9NT0RFX1NDQUxFX05PTkU7CisJCX0gZWxzZSB7CisJCQluYXRpdmVfbW9kZSA9IG52X2Nvbm5lY3Rvci0+bmF0aXZlX21vZGU7CisJCX0KKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChzY2FsaW5nX21vZGUpIHsKKwljYXNlIERSTV9NT0RFX1NDQUxFX0FTUEVDVDoKKwkJaG9yaXogPSAobmF0aXZlX21vZGUtPmhkaXNwbGF5IDw8IDE5KSAvIG1vZGUtPmhkaXNwbGF5OworCQl2ZXJ0ID0gKG5hdGl2ZV9tb2RlLT52ZGlzcGxheSA8PCAxOSkgLyBtb2RlLT52ZGlzcGxheTsKKworCQlpZiAodmVydCA+IGhvcml6KSB7CisJCQlvdXRYID0gKG1vZGUtPmhkaXNwbGF5ICogaG9yaXopID4+IDE5OworCQkJb3V0WSA9IChtb2RlLT52ZGlzcGxheSAqIGhvcml6KSA+PiAxOTsKKwkJfSBlbHNlIHsKKwkJCW91dFggPSAobW9kZS0+aGRpc3BsYXkgKiB2ZXJ0KSA+PiAxOTsKKwkJCW91dFkgPSAobW9kZS0+dmRpc3BsYXkgKiB2ZXJ0KSA+PiAxOTsKKwkJfQorCQlicmVhazsKKwljYXNlIERSTV9NT0RFX1NDQUxFX0ZVTExTQ1JFRU46CisJCW91dFggPSBuYXRpdmVfbW9kZS0+aGRpc3BsYXk7CisJCW91dFkgPSBuYXRpdmVfbW9kZS0+dmRpc3BsYXk7CisJCWJyZWFrOworCWNhc2UgRFJNX01PREVfU0NBTEVfQ0VOVEVSOgorCWNhc2UgRFJNX01PREVfU0NBTEVfTk9ORToKKwlkZWZhdWx0OgorCQlvdXRYID0gbW9kZS0+aGRpc3BsYXk7CisJCW91dFkgPSBtb2RlLT52ZGlzcGxheTsKKwkJYnJlYWs7CisJfQorCisJcmV0ID0gUklOR19TUEFDRShldm8sIHVwZGF0ZSA/IDcgOiA1KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogR290IGEgYmV0dGVyIG5hbWUgZm9yIFNDQUxFUl9BQ1RJVkU/ICovCisJLyogT25lIGRheSBpJ3ZlIGdvdCB0byByZWFsbHkgZmlndXJlIG91dCB3aHkgdGhpcyBpcyBuZWVkZWQuICovCisJQkVHSU5fUklORyhldm8sIDAsIE5WNTBfRVZPX0NSVEMobnZfY3J0Yy0+aW5kZXgsIFNDQUxFX0NUUkwpLCAxKTsKKwlpZiAoKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19EQkxTQ0FOKSB8fAorCSAgICAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkgfHwKKwkgICAgbW9kZS0+aGRpc3BsYXkgIT0gb3V0WCB8fCBtb2RlLT52ZGlzcGxheSAhPSBvdXRZKSB7CisJCU9VVF9SSU5HKGV2bywgTlY1MF9FVk9fQ1JUQ19TQ0FMRV9DVFJMX0FDVElWRSk7CisJfSBlbHNlIHsKKwkJT1VUX1JJTkcoZXZvLCBOVjUwX0VWT19DUlRDX1NDQUxFX0NUUkxfSU5BQ1RJVkUpOworCX0KKworCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19DUlRDKG52X2NydGMtPmluZGV4LCBTQ0FMRV9SRVMxKSwgMik7CisJT1VUX1JJTkcoZXZvLCBvdXRZIDw8IDE2IHwgb3V0WCk7CisJT1VUX1JJTkcoZXZvLCBvdXRZIDw8IDE2IHwgb3V0WCk7CisKKwlpZiAodXBkYXRlKSB7CisJCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19VUERBVEUsIDEpOworCQlPVVRfUklORyhldm8sIDApOworCQlGSVJFX1JJTkcoZXZvKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50CitudjUwX2NydGNfc2V0X2Nsb2NrKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBoZWFkLCBpbnQgcGNsaykKK3sKKwl1aW50MzJfdCBwbGxfcmVnID0gTlY1MF9QRElTUExBWV9DUlRDX0NMS19DVFJMMShoZWFkKTsKKwlzdHJ1Y3Qgbm91dmVhdV9wbGxfdmFscyBwbGw7CisJc3RydWN0IHBsbF9saW1zIGxpbWl0czsKKwl1aW50MzJfdCByZWcxLCByZWcyOworCWludCByZXQ7CisKKwlyZXQgPSBnZXRfcGxsX2xpbWl0cyhkZXYsIHBsbF9yZWcsICZsaW1pdHMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X2NhbGNfcGxsX21ucChkZXYsICZsaW1pdHMsIHBjbGssICZwbGwpOworCWlmIChyZXQgPD0gMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChsaW1pdHMudmNvMi5tYXhmcmVxKSB7CisJCXJlZzEgPSBudl9yZDMyKGRldiwgcGxsX3JlZyArIDQpICYgMHhmZjAwZmYwMDsKKwkJcmVnMiA9IG52X3JkMzIoZGV2LCBwbGxfcmVnICsgOCkgJiAweDgwMDBmZjAwOworCQludl93cjMyKGRldiwgcGxsX3JlZywgMHgxMDAwMDYxMSk7CisJCW52X3dyMzIoZGV2LCBwbGxfcmVnICsgNCwgcmVnMSB8IChwbGwuTTEgPDwgMTYpIHwgcGxsLk4xKTsKKwkJbnZfd3IzMihkZXYsIHBsbF9yZWcgKyA4LAorCQkJcmVnMiB8IChwbGwubG9nMlAgPDwgMjgpIHwgKHBsbC5NMiA8PCAxNikgfCBwbGwuTjIpOworCX0gZWxzZSB7CisJCXJlZzEgPSBudl9yZDMyKGRldiwgcGxsX3JlZyArIDQpICYgMHhmZmMwMDAwMDsKKwkJbnZfd3IzMihkZXYsIHBsbF9yZWcsIDB4NTAwMDA2MTApOworCQludl93cjMyKGRldiwgcGxsX3JlZyArIDQsIHJlZzEgfAorCQkJKHBsbC5sb2cyUCA8PCAxNikgfCAocGxsLk0xIDw8IDgpIHwgcGxsLk4xKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK252NTBfY3J0Y19kZXN0cm95KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCisJaWYgKCFjcnRjKQorCQlyZXR1cm47CisKKwlkcm1fY3J0Y19jbGVhbnVwKCZudl9jcnRjLT5iYXNlKTsKKworCW52NTBfY3Vyc29yX2ZpbmkobnZfY3J0Yyk7CisKKwlub3V2ZWF1X2JvX3JlZihOVUxMLCAmbnZfY3J0Yy0+bHV0Lm52Ym8pOworCW5vdXZlYXVfYm9fcmVmKE5VTEwsICZudl9jcnRjLT5jdXJzb3IubnZibyk7CisJa2ZyZWUobnZfY3J0Yy0+bW9kZSk7CisJa2ZyZWUobnZfY3J0Yyk7Cit9CisKK2ludAorbnY1MF9jcnRjX2N1cnNvcl9zZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJICAgICB1aW50MzJfdCBidWZmZXJfaGFuZGxlLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOworCXN0cnVjdCBub3V2ZWF1X2JvICpjdXJzb3IgPSBOVUxMOworCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ2VtOworCWludCByZXQgPSAwLCBpOworCisJaWYgKHdpZHRoICE9IDY0IHx8IGhlaWdodCAhPSA2NCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWJ1ZmZlcl9oYW5kbGUpIHsKKwkJbnZfY3J0Yy0+Y3Vyc29yLmhpZGUobnZfY3J0YywgdHJ1ZSk7CisJCXJldHVybiAwOworCX0KKworCWdlbSA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGVfcHJpdiwgYnVmZmVyX2hhbmRsZSk7CisJaWYgKCFnZW0pCisJCXJldHVybiAtRUlOVkFMOworCWN1cnNvciA9IG5vdXZlYXVfZ2VtX29iamVjdChnZW0pOworCisJcmV0ID0gbm91dmVhdV9ib19tYXAoY3Vyc29yKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCS8qIFRoZSBzaW1wbGUgd2lsbCBkbyBmb3Igbm93LiAqLworCWZvciAoaSA9IDA7IGkgPCA2NCAqIDY0OyBpKyspCisJCW5vdXZlYXVfYm9fd3IzMihudl9jcnRjLT5jdXJzb3IubnZibywgaSwgbm91dmVhdV9ib19yZDMyKGN1cnNvciwgaSkpOworCisJbm91dmVhdV9ib191bm1hcChjdXJzb3IpOworCisJbnZfY3J0Yy0+Y3Vyc29yLnNldF9vZmZzZXQobnZfY3J0YywgbnZfY3J0Yy0+Y3Vyc29yLm52Ym8tPmJvLm9mZnNldCAtCisJCQkJCSAgICBkZXZfcHJpdi0+dm1fdnJhbV9iYXNlKTsKKwludl9jcnRjLT5jdXJzb3Iuc2hvdyhudl9jcnRjLCB0cnVlKTsKKworb3V0OgorCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShnZW0pOworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK2ludAorbnY1MF9jcnRjX2N1cnNvcl9tb3ZlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IHgsIGludCB5KQoreworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisKKwludl9jcnRjLT5jdXJzb3Iuc2V0X3Bvcyhudl9jcnRjLCB4LCB5KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK252NTBfY3J0Y19nYW1tYV9zZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLCB1MTYgKnIsIHUxNiAqZywgdTE2ICpiLAorCQkgICAgdWludDMyX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOworCWludCBpOworCisJaWYgKHNpemUgIT0gMjU2KQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJbnZfY3J0Yy0+bHV0LnJbaV0gPSByW2ldOworCQludl9jcnRjLT5sdXQuZ1tpXSA9IGdbaV07CisJCW52X2NydGMtPmx1dC5iW2ldID0gYltpXTsKKwl9CisKKwkvKiBXZSBuZWVkIHRvIGtub3cgdGhlIGRlcHRoIGJlZm9yZSB3ZSB1cGxvYWQsIGJ1dCBpdCdzIHBvc3NpYmxlIHRvCisJICogZ2V0IGNhbGxlZCBiZWZvcmUgYSBmcmFtZWJ1ZmZlciBpcyBib3VuZC4gIElmIHRoaXMgaXMgdGhlIGNhc2UsCisJICogbWFyayB0aGUgbHV0IHZhbHVlcyBhcyBkaXJ0eSBieSBzZXR0aW5nIGRlcHRoPT0wLCBhbmQgaXQnbGwgYmUKKwkgKiB1cGxvYWRlZCBvbiB0aGUgZmlyc3QgbW9kZV9zZXRfYmFzZSgpCisJICovCisJaWYgKCFudl9jcnRjLT5iYXNlLmZiKSB7CisJCW52X2NydGMtPmx1dC5kZXB0aCA9IDA7CisJCXJldHVybjsKKwl9CisKKwludjUwX2NydGNfbHV0X2xvYWQoY3J0Yyk7Cit9CisKK3N0YXRpYyB2b2lkCitudjUwX2NydGNfc2F2ZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJTlZfRVJST1IoY3J0Yy0+ZGV2LCAiISFcbiIpOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9jcnRjX3Jlc3RvcmUoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCU5WX0VSUk9SKGNydGMtPmRldiwgIiEhXG4iKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY3J0Y19mdW5jcyBudjUwX2NydGNfZnVuY3MgPSB7CisJLnNhdmUgPSBudjUwX2NydGNfc2F2ZSwKKwkucmVzdG9yZSA9IG52NTBfY3J0Y19yZXN0b3JlLAorCS5jdXJzb3Jfc2V0ID0gbnY1MF9jcnRjX2N1cnNvcl9zZXQsCisJLmN1cnNvcl9tb3ZlID0gbnY1MF9jcnRjX2N1cnNvcl9tb3ZlLAorCS5nYW1tYV9zZXQgPSBudjUwX2NydGNfZ2FtbWFfc2V0LAorCS5zZXRfY29uZmlnID0gZHJtX2NydGNfaGVscGVyX3NldF9jb25maWcsCisJLmRlc3Ryb3kgPSBudjUwX2NydGNfZGVzdHJveSwKK307CisKK3N0YXRpYyB2b2lkCitudjUwX2NydGNfZHBtcyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCBtb2RlKQoreworfQorCitzdGF0aWMgdm9pZAorbnY1MF9jcnRjX3ByZXBhcmUoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CisKKwlOVl9ERUJVRyhkZXYsICJpbmRleCAlZFxuIiwgbnZfY3J0Yy0+aW5kZXgpOworCisJLyogRGlzY29ubmVjdCBhbGwgdW51c2VkIGVuY29kZXJzLiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jb2RlciwgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LCBoZWFkKSB7CisJCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisKKwkJaWYgKGRybV9oZWxwZXJfZW5jb2Rlcl9pbl91c2UoZW5jb2RlcikpCisJCQljb250aW51ZTsKKworCQludl9lbmNvZGVyLT5kaXNjb25uZWN0KG52X2VuY29kZXIpOworCX0KKworCW52NTBfY3J0Y19ibGFuayhudl9jcnRjLCB0cnVlKTsKK30KKworc3RhdGljIHZvaWQKK252NTBfY3J0Y19jb21taXQoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzI7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmV2byA9IGRldl9wcml2LT5ldm87CisJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhjcnRjKTsKKwlpbnQgcmV0OworCisJTlZfREVCVUcoZGV2LCAiaW5kZXggJWRcbiIsIG52X2NydGMtPmluZGV4KTsKKworCW52NTBfY3J0Y19ibGFuayhudl9jcnRjLCBmYWxzZSk7CisKKwkvKiBFeHBsaWNpdGx5IGJsYW5rIGFsbCB1bnVzZWQgY3J0YydzLiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YzIsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkgeworCQlpZiAoIWRybV9oZWxwZXJfY3J0Y19pbl91c2UoY3J0YzIpKQorCQkJbnY1MF9jcnRjX2JsYW5rKG5vdXZlYXVfY3J0YyhjcnRjMiksIHRydWUpOworCX0KKworCXJldCA9IFJJTkdfU1BBQ0UoZXZvLCAyKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIm5vIHNwYWNlIHdoaWxlIGNvbW1pdHRpbmcgY3J0Y1xuIik7CisJCXJldHVybjsKKwl9CisJQkVHSU5fUklORyhldm8sIDAsIE5WNTBfRVZPX1VQREFURSwgMSk7CisJT1VUX1JJTkcoZXZvLCAwKTsKKwlGSVJFX1JJTkcoZXZvKTsKK30KKworc3RhdGljIGJvb2wKK252NTBfY3J0Y19tb2RlX2ZpeHVwKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yywgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCSAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQKK252NTBfY3J0Y19kb19tb2RlX3NldF9iYXNlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IHgsIGludCB5LAorCQkJICAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqb2xkX2ZiLCBib29sIHVwZGF0ZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBudl9jcnRjLT5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmV2byA9IGRldl9wcml2LT5ldm87CisJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZHJtX2ZiID0gbnZfY3J0Yy0+YmFzZS5mYjsKKwlzdHJ1Y3Qgbm91dmVhdV9mcmFtZWJ1ZmZlciAqZmIgPSBub3V2ZWF1X2ZyYW1lYnVmZmVyKGRybV9mYik7CisJaW50IHJldCwgZm9ybWF0OworCisJTlZfREVCVUcoZGV2LCAiaW5kZXggJWRcbiIsIG52X2NydGMtPmluZGV4KTsKKworCXN3aXRjaCAoZHJtX2ZiLT5kZXB0aCkgeworCWNhc2UgIDg6CisJCWZvcm1hdCA9IE5WNTBfRVZPX0NSVENfRkJfREVQVEhfODsKKwkJYnJlYWs7CisJY2FzZSAxNToKKwkJZm9ybWF0ID0gTlY1MF9FVk9fQ1JUQ19GQl9ERVBUSF8xNTsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJZm9ybWF0ID0gTlY1MF9FVk9fQ1JUQ19GQl9ERVBUSF8xNjsKKwkJYnJlYWs7CisJY2FzZSAyNDoKKwljYXNlIDMyOgorCQlmb3JtYXQgPSBOVjUwX0VWT19DUlRDX0ZCX0RFUFRIXzI0OworCQlicmVhazsKKwljYXNlIDMwOgorCQlmb3JtYXQgPSBOVjUwX0VWT19DUlRDX0ZCX0RFUFRIXzMwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkgTlZfRVJST1IoZGV2LCAidW5rbm93biBkZXB0aCAlZFxuIiwgZHJtX2ZiLT5kZXB0aCk7CisJCSByZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBub3V2ZWF1X2JvX3BpbihmYi0+bnZibywgVFRNX1BMX0ZMQUdfVlJBTSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChvbGRfZmIpIHsKKwkJc3RydWN0IG5vdXZlYXVfZnJhbWVidWZmZXIgKm9mYiA9IG5vdXZlYXVfZnJhbWVidWZmZXIob2xkX2ZiKTsKKwkJbm91dmVhdV9ib191bnBpbihvZmItPm52Ym8pOworCX0KKworCW52X2NydGMtPmZiLm9mZnNldCA9IGZiLT5udmJvLT5iby5vZmZzZXQgLSBkZXZfcHJpdi0+dm1fdnJhbV9iYXNlOworCW52X2NydGMtPmZiLnRpbGVfZmxhZ3MgPSBmYi0+bnZiby0+dGlsZV9mbGFnczsKKwludl9jcnRjLT5mYi5jcHAgPSBkcm1fZmItPmJpdHNfcGVyX3BpeGVsIC8gODsKKwlpZiAoIW52X2NydGMtPmZiLmJsYW5rZWQgJiYgZGV2X3ByaXYtPmNoaXBzZXQgIT0gMHg1MCkgeworCQlyZXQgPSBSSU5HX1NQQUNFKGV2bywgMik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19DUlRDKG52X2NydGMtPmluZGV4LCBGQl9ETUEpLCAxKTsKKwkJaWYgKG52X2NydGMtPmZiLnRpbGVfZmxhZ3MgPT0gMHg3YTAwKQorCQkJT1VUX1JJTkcoZXZvLCBOdkV2b0ZCMzIpOworCQllbHNlCisJCWlmIChudl9jcnRjLT5mYi50aWxlX2ZsYWdzID09IDB4NzAwMCkKKwkJCU9VVF9SSU5HKGV2bywgTnZFdm9GQjE2KTsKKwkJZWxzZQorCQkJT1VUX1JJTkcoZXZvLCBOdkV2b1ZSQU0pOworCX0KKworCXJldCA9IFJJTkdfU1BBQ0UoZXZvLCAxMik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19DUlRDKG52X2NydGMtPmluZGV4LCBGQl9PRkZTRVQpLCA1KTsKKwlPVVRfUklORyhldm8sIG52X2NydGMtPmZiLm9mZnNldCA+PiA4KTsKKwlPVVRfUklORyhldm8sIDApOworCU9VVF9SSU5HKGV2bywgKGRybV9mYi0+aGVpZ2h0IDw8IDE2KSB8IGRybV9mYi0+d2lkdGgpOworCWlmICghbnZfY3J0Yy0+ZmIudGlsZV9mbGFncykgeworCQlPVVRfUklORyhldm8sIGRybV9mYi0+cGl0Y2ggfCAoMSA8PCAyMCkpOworCX0gZWxzZSB7CisJCU9VVF9SSU5HKGV2bywgKChkcm1fZmItPnBpdGNoIC8gNCkgPDwgNCkgfAorCQkJCSAgZmItPm52Ym8tPnRpbGVfbW9kZSk7CisJfQorCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDUwKQorCQlPVVRfUklORyhldm8sIChmYi0+bnZiby0+dGlsZV9mbGFncyA8PCA4KSB8IGZvcm1hdCk7CisJZWxzZQorCQlPVVRfUklORyhldm8sIGZvcm1hdCk7CisKKwlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fQ1JUQyhudl9jcnRjLT5pbmRleCwgQ0xVVF9NT0RFKSwgMSk7CisJT1VUX1JJTkcoZXZvLCBmYi0+YmFzZS5kZXB0aCA9PSA4ID8KKwkJIE5WNTBfRVZPX0NSVENfQ0xVVF9NT0RFX09GRiA6IE5WNTBfRVZPX0NSVENfQ0xVVF9NT0RFX09OKTsKKworCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19DUlRDKG52X2NydGMtPmluZGV4LCBDT0xPUl9DVFJMKSwgMSk7CisJT1VUX1JJTkcoZXZvLCBOVjUwX0VWT19DUlRDX0NPTE9SX0NUUkxfQ09MT1IpOworCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19DUlRDKG52X2NydGMtPmluZGV4LCBGQl9QT1MpLCAxKTsKKwlPVVRfUklORyhldm8sICh5IDw8IDE2KSB8IHgpOworCisJaWYgKG52X2NydGMtPmx1dC5kZXB0aCAhPSBmYi0+YmFzZS5kZXB0aCkgeworCQludl9jcnRjLT5sdXQuZGVwdGggPSBmYi0+YmFzZS5kZXB0aDsKKwkJbnY1MF9jcnRjX2x1dF9sb2FkKGNydGMpOworCX0KKworCWlmICh1cGRhdGUpIHsKKwkJcmV0ID0gUklOR19TUEFDRShldm8sIDIpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJQkVHSU5fUklORyhldm8sIDAsIE5WNTBfRVZPX1VQREFURSwgMSk7CisJCU9VVF9SSU5HKGV2bywgMCk7CisJCUZJUkVfUklORyhldm8pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitudjUwX2NydGNfbW9kZV9zZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUsIGludCB4LCBpbnQgeSwKKwkJICAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqb2xkX2ZiKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpldm8gPSBkZXZfcHJpdi0+ZXZvOworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisJc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpudl9jb25uZWN0b3IgPSBOVUxMOworCXVpbnQzMl90IGhzeW5jX2R1ciwgIHZzeW5jX2R1ciwgaHN5bmNfc3RhcnRfdG9fZW5kLCB2c3luY19zdGFydF90b19lbmQ7CisJdWludDMyX3QgaHVuazEsIHZ1bmsxLCB2dW5rMmEsIHZ1bmsyYjsKKwlpbnQgcmV0OworCisJLyogRmluZCB0aGUgY29ubmVjdG9yIGF0dGFjaGVkIHRvIHRoaXMgQ1JUQyAqLworCW52X2Nvbm5lY3RvciA9IG5vdXZlYXVfY3J0Y19jb25uZWN0b3JfZ2V0KG52X2NydGMpOworCisJKm52X2NydGMtPm1vZGUgPSAqYWRqdXN0ZWRfbW9kZTsKKworCU5WX0RFQlVHKGRldiwgImluZGV4ICVkXG4iLCBudl9jcnRjLT5pbmRleCk7CisKKwloc3luY19kdXIgPSBhZGp1c3RlZF9tb2RlLT5oc3luY19lbmQgLSBhZGp1c3RlZF9tb2RlLT5oc3luY19zdGFydDsKKwl2c3luY19kdXIgPSBhZGp1c3RlZF9tb2RlLT52c3luY19lbmQgLSBhZGp1c3RlZF9tb2RlLT52c3luY19zdGFydDsKKwloc3luY19zdGFydF90b19lbmQgPSBhZGp1c3RlZF9tb2RlLT5odG90YWwgLSBhZGp1c3RlZF9tb2RlLT5oc3luY19zdGFydDsKKwl2c3luY19zdGFydF90b19lbmQgPSBhZGp1c3RlZF9tb2RlLT52dG90YWwgLSBhZGp1c3RlZF9tb2RlLT52c3luY19zdGFydDsKKwkvKiBJIGNhbid0IGdpdmUgdGhpcyBhIHByb3BlciBuYW1lLCBhbnlvbmUgZWxzZSBjYW4/ICovCisJaHVuazEgPSBhZGp1c3RlZF9tb2RlLT5odG90YWwgLQorCQlhZGp1c3RlZF9tb2RlLT5oc3luY19zdGFydCArIGFkanVzdGVkX21vZGUtPmhkaXNwbGF5OworCXZ1bmsxID0gYWRqdXN0ZWRfbW9kZS0+dnRvdGFsIC0KKwkJYWRqdXN0ZWRfbW9kZS0+dnN5bmNfc3RhcnQgKyBhZGp1c3RlZF9tb2RlLT52ZGlzcGxheTsKKwkvKiBBbm90aGVyIHN0cmFuZ2UgdmFsdWUsIHRoaXMgdGltZSBvbmx5IGZvciBpbnRlcmxhY2VkIGFkanVzdGVkX21vZGVzLiAqLworCXZ1bmsyYSA9IDIgKiBhZGp1c3RlZF9tb2RlLT52dG90YWwgLQorCQkgYWRqdXN0ZWRfbW9kZS0+dnN5bmNfc3RhcnQgKyBhZGp1c3RlZF9tb2RlLT52ZGlzcGxheTsKKwl2dW5rMmIgPSBhZGp1c3RlZF9tb2RlLT52dG90YWwgLQorCQkgYWRqdXN0ZWRfbW9kZS0+dnN5bmNfc3RhcnQgKyBhZGp1c3RlZF9tb2RlLT52dG90YWw7CisKKwlpZiAoYWRqdXN0ZWRfbW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkgeworCQl2c3luY19kdXIgLz0gMjsKKwkJdnN5bmNfc3RhcnRfdG9fZW5kICAvPSAyOworCQl2dW5rMSAvPSAyOworCQl2dW5rMmEgLz0gMjsKKwkJdnVuazJiIC89IDI7CisJCS8qIG1hZ2ljICovCisJCWlmIChhZGp1c3RlZF9tb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfREJMU0NBTikgeworCQkJdnN5bmNfc3RhcnRfdG9fZW5kIC09IDE7CisJCQl2dW5rMSAtPSAxOworCQkJdnVuazJhIC09IDE7CisJCQl2dW5rMmIgLT0gMTsKKwkJfQorCX0KKworCXJldCA9IFJJTkdfU1BBQ0UoZXZvLCAxNyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19DUlRDKG52X2NydGMtPmluZGV4LCBDTE9DSyksIDIpOworCU9VVF9SSU5HKGV2bywgYWRqdXN0ZWRfbW9kZS0+Y2xvY2sgfCAweDgwMDAwMCk7CisJT1VUX1JJTkcoZXZvLCAoYWRqdXN0ZWRfbW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkgPyAyIDogMCk7CisKKwlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fQ1JUQyhudl9jcnRjLT5pbmRleCwgRElTUExBWV9TVEFSVCksIDUpOworCU9VVF9SSU5HKGV2bywgMCk7CisJT1VUX1JJTkcoZXZvLCAoYWRqdXN0ZWRfbW9kZS0+dnRvdGFsIDw8IDE2KSB8IGFkanVzdGVkX21vZGUtPmh0b3RhbCk7CisJT1VUX1JJTkcoZXZvLCAodnN5bmNfZHVyIC0gMSkgPDwgMTYgfCAoaHN5bmNfZHVyIC0gMSkpOworCU9VVF9SSU5HKGV2bywgKHZzeW5jX3N0YXJ0X3RvX2VuZCAtIDEpIDw8IDE2IHwKKwkJCShoc3luY19zdGFydF90b19lbmQgLSAxKSk7CisJT1VUX1JJTkcoZXZvLCAodnVuazEgLSAxKSA8PCAxNiB8IChodW5rMSAtIDEpKTsKKworCWlmIChhZGp1c3RlZF9tb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFKSB7CisJCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19DUlRDKG52X2NydGMtPmluZGV4LCBVTkswODI0KSwgMSk7CisJCU9VVF9SSU5HKGV2bywgKHZ1bmsyYiAtIDEpIDw8IDE2IHwgKHZ1bmsyYSAtIDEpKTsKKwl9IGVsc2UgeworCQlPVVRfUklORyhldm8sIDApOworCQlPVVRfUklORyhldm8sIDApOworCX0KKworCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19DUlRDKG52X2NydGMtPmluZGV4LCBVTkswODJDKSwgMSk7CisJT1VUX1JJTkcoZXZvLCAwKTsKKworCS8qIFRoaXMgaXMgdGhlIGFjdHVhbCByZXNvbHV0aW9uIG9mIHRoZSBtb2RlLiAqLworCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19DUlRDKG52X2NydGMtPmluZGV4LCBSRUFMX1JFUyksIDEpOworCU9VVF9SSU5HKGV2bywgKG1vZGUtPnZkaXNwbGF5IDw8IDE2KSB8IG1vZGUtPmhkaXNwbGF5KTsKKwlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fQ1JUQyhudl9jcnRjLT5pbmRleCwgU0NBTEVfQ0VOVEVSX09GRlNFVCksIDEpOworCU9VVF9SSU5HKGV2bywgTlY1MF9FVk9fQ1JUQ19TQ0FMRV9DRU5URVJfT0ZGU0VUX1ZBTCgwLCAwKSk7CisKKwludl9jcnRjLT5zZXRfZGl0aGVyKG52X2NydGMsIG52X2Nvbm5lY3Rvci0+dXNlX2RpdGhlcmluZywgZmFsc2UpOworCW52X2NydGMtPnNldF9zY2FsZShudl9jcnRjLCBudl9jb25uZWN0b3ItPnNjYWxpbmdfbW9kZSwgZmFsc2UpOworCisJcmV0dXJuIG52NTBfY3J0Y19kb19tb2RlX3NldF9iYXNlKGNydGMsIHgsIHksIG9sZF9mYiwgZmFsc2UpOworfQorCitzdGF0aWMgaW50CitudjUwX2NydGNfbW9kZV9zZXRfYmFzZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCB4LCBpbnQgeSwKKwkJCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKm9sZF9mYikKK3sKKwlyZXR1cm4gbnY1MF9jcnRjX2RvX21vZGVfc2V0X2Jhc2UoY3J0YywgeCwgeSwgb2xkX2ZiLCB0cnVlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY3J0Y19oZWxwZXJfZnVuY3MgbnY1MF9jcnRjX2hlbHBlcl9mdW5jcyA9IHsKKwkuZHBtcyA9IG52NTBfY3J0Y19kcG1zLAorCS5wcmVwYXJlID0gbnY1MF9jcnRjX3ByZXBhcmUsCisJLmNvbW1pdCA9IG52NTBfY3J0Y19jb21taXQsCisJLm1vZGVfZml4dXAgPSBudjUwX2NydGNfbW9kZV9maXh1cCwKKwkubW9kZV9zZXQgPSBudjUwX2NydGNfbW9kZV9zZXQsCisJLm1vZGVfc2V0X2Jhc2UgPSBudjUwX2NydGNfbW9kZV9zZXRfYmFzZSwKKwkubG9hZF9sdXQgPSBudjUwX2NydGNfbHV0X2xvYWQsCit9OworCitpbnQKK252NTBfY3J0Y19jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGluZGV4KQoreworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBOVUxMOworCWludCByZXQsIGk7CisKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCisJbnZfY3J0YyA9IGt6YWxsb2Moc2l6ZW9mKCpudl9jcnRjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFudl9jcnRjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW52X2NydGMtPm1vZGUgPSBremFsbG9jKHNpemVvZigqbnZfY3J0Yy0+bW9kZSksIEdGUF9LRVJORUwpOworCWlmICghbnZfY3J0Yy0+bW9kZSkgeworCQlrZnJlZShudl9jcnRjKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogRGVmYXVsdCBDTFVUIHBhcmFtZXRlcnMsIHdpbGwgYmUgYWN0aXZhdGVkIG9uIHRoZSBodyB1cG9uCisJICogZmlyc3QgbW9kZSBzZXQuCisJICovCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCW52X2NydGMtPmx1dC5yW2ldID0gaSA8PCA4OworCQludl9jcnRjLT5sdXQuZ1tpXSA9IGkgPDwgODsKKwkJbnZfY3J0Yy0+bHV0LmJbaV0gPSBpIDw8IDg7CisJfQorCW52X2NydGMtPmx1dC5kZXB0aCA9IDA7CisKKwlyZXQgPSBub3V2ZWF1X2JvX25ldyhkZXYsIE5VTEwsIDQwOTYsIDB4MTAwLCBUVE1fUExfRkxBR19WUkFNLAorCQkJICAgICAwLCAweDAwMDAsIGZhbHNlLCB0cnVlLCAmbnZfY3J0Yy0+bHV0Lm52Ym8pOworCWlmICghcmV0KSB7CisJCXJldCA9IG5vdXZlYXVfYm9fcGluKG52X2NydGMtPmx1dC5udmJvLCBUVE1fUExfRkxBR19WUkFNKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBub3V2ZWF1X2JvX21hcChudl9jcnRjLT5sdXQubnZibyk7CisJCWlmIChyZXQpCisJCQlub3V2ZWF1X2JvX3JlZihOVUxMLCAmbnZfY3J0Yy0+bHV0Lm52Ym8pOworCX0KKworCWlmIChyZXQpIHsKKwkJa2ZyZWUobnZfY3J0Yy0+bW9kZSk7CisJCWtmcmVlKG52X2NydGMpOworCQlyZXR1cm4gcmV0OworCX0KKworCW52X2NydGMtPmluZGV4ID0gaW5kZXg7CisKKwkvKiBzZXQgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKwludl9jcnRjLT5zZXRfZGl0aGVyID0gbnY1MF9jcnRjX3NldF9kaXRoZXI7CisJbnZfY3J0Yy0+c2V0X3NjYWxlID0gbnY1MF9jcnRjX3NldF9zY2FsZTsKKworCWRybV9jcnRjX2luaXQoZGV2LCAmbnZfY3J0Yy0+YmFzZSwgJm52NTBfY3J0Y19mdW5jcyk7CisJZHJtX2NydGNfaGVscGVyX2FkZCgmbnZfY3J0Yy0+YmFzZSwgJm52NTBfY3J0Y19oZWxwZXJfZnVuY3MpOworCWRybV9tb2RlX2NydGNfc2V0X2dhbW1hX3NpemUoJm52X2NydGMtPmJhc2UsIDI1Nik7CisKKwlyZXQgPSBub3V2ZWF1X2JvX25ldyhkZXYsIE5VTEwsIDY0KjY0KjQsIDB4MTAwLCBUVE1fUExfRkxBR19WUkFNLAorCQkJICAgICAwLCAweDAwMDAsIGZhbHNlLCB0cnVlLCAmbnZfY3J0Yy0+Y3Vyc29yLm52Ym8pOworCWlmICghcmV0KSB7CisJCXJldCA9IG5vdXZlYXVfYm9fcGluKG52X2NydGMtPmN1cnNvci5udmJvLCBUVE1fUExfRkxBR19WUkFNKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBub3V2ZWF1X2JvX21hcChudl9jcnRjLT5jdXJzb3IubnZibyk7CisJCWlmIChyZXQpCisJCQlub3V2ZWF1X2JvX3JlZihOVUxMLCAmbnZfY3J0Yy0+Y3Vyc29yLm52Ym8pOworCX0KKworCW52NTBfY3Vyc29yX2luaXQobnZfY3J0Yyk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2N1cnNvci5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9jdXJzb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmU3OWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9jdXJzb3IuYwpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNYWFydGVuIE1hYXRodWlzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm1fbW9kZS5oIgorCisjZGVmaW5lIE5PVVZFQVVfRE1BX0RFQlVHIChub3V2ZWF1X3JlZ19kZWJ1ZyAmIE5PVVZFQVVfUkVHX0RFQlVHX0VWTykKKyNpbmNsdWRlICJub3V2ZWF1X3JlZy5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9jcnRjLmgiCisjaW5jbHVkZSAibnY1MF9kaXNwbGF5LmgiCisKK3N0YXRpYyB2b2lkCitudjUwX2N1cnNvcl9zaG93KHN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMsIGJvb2wgdXBkYXRlKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IG52X2NydGMtPmJhc2UuZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpldm8gPSBkZXZfcHJpdi0+ZXZvOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBudl9jcnRjLT5iYXNlLmRldjsKKwlpbnQgcmV0OworCisJTlZfREVCVUcoZGV2LCAiXG4iKTsKKworCWlmICh1cGRhdGUgJiYgbnZfY3J0Yy0+Y3Vyc29yLnZpc2libGUpCisJCXJldHVybjsKKworCXJldCA9IFJJTkdfU1BBQ0UoZXZvLCAoZGV2X3ByaXYtPmNoaXBzZXQgIT0gMHg1MCA/IDUgOiAzKSArIHVwZGF0ZSAqIDIpOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAibm8gc3BhY2Ugd2hpbGUgdW5oaWRpbmcgY3Vyc29yXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCAhPSAweDUwKSB7CisJCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjg0X0VWT19DUlRDKG52X2NydGMtPmluZGV4LCBDVVJTT1JfRE1BKSwgMSk7CisJCU9VVF9SSU5HKGV2bywgTnZFdm9WUkFNKTsKKwl9CisJQkVHSU5fUklORyhldm8sIDAsIE5WNTBfRVZPX0NSVEMobnZfY3J0Yy0+aW5kZXgsIENVUlNPUl9DVFJMKSwgMik7CisJT1VUX1JJTkcoZXZvLCBOVjUwX0VWT19DUlRDX0NVUlNPUl9DVFJMX1NIT1cpOworCU9VVF9SSU5HKGV2bywgbnZfY3J0Yy0+Y3Vyc29yLm9mZnNldCA+PiA4KTsKKworCWlmICh1cGRhdGUpIHsKKwkJQkVHSU5fUklORyhldm8sIDAsIE5WNTBfRVZPX1VQREFURSwgMSk7CisJCU9VVF9SSU5HKGV2bywgMCk7CisJCUZJUkVfUklORyhldm8pOworCQludl9jcnRjLT5jdXJzb3IudmlzaWJsZSA9IHRydWU7CisJfQorfQorCitzdGF0aWMgdm9pZAorbnY1MF9jdXJzb3JfaGlkZShzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjLCBib29sIHVwZGF0ZSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBudl9jcnRjLT5iYXNlLmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqZXZvID0gZGV2X3ByaXYtPmV2bzsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbnZfY3J0Yy0+YmFzZS5kZXY7CisJaW50IHJldDsKKworCU5WX0RFQlVHKGRldiwgIlxuIik7CisKKwlpZiAodXBkYXRlICYmICFudl9jcnRjLT5jdXJzb3IudmlzaWJsZSkKKwkJcmV0dXJuOworCisJcmV0ID0gUklOR19TUEFDRShldm8sIChkZXZfcHJpdi0+Y2hpcHNldCAhPSAweDUwID8gNSA6IDMpICsgdXBkYXRlICogMik7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJubyBzcGFjZSB3aGlsZSBoaWRpbmcgY3Vyc29yXG4iKTsKKwkJcmV0dXJuOworCX0KKwlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fQ1JUQyhudl9jcnRjLT5pbmRleCwgQ1VSU09SX0NUUkwpLCAyKTsKKwlPVVRfUklORyhldm8sIE5WNTBfRVZPX0NSVENfQ1VSU09SX0NUUkxfSElERSk7CisJT1VUX1JJTkcoZXZvLCAwKTsKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgIT0gMHg1MCkgeworCQlCRUdJTl9SSU5HKGV2bywgMCwgTlY4NF9FVk9fQ1JUQyhudl9jcnRjLT5pbmRleCwgQ1VSU09SX0RNQSksIDEpOworCQlPVVRfUklORyhldm8sIE5WODRfRVZPX0NSVENfQ1VSU09SX0RNQV9IQU5ETEVfTk9ORSk7CisJfQorCisJaWYgKHVwZGF0ZSkgeworCQlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fVVBEQVRFLCAxKTsKKwkJT1VUX1JJTkcoZXZvLCAwKTsKKwkJRklSRV9SSU5HKGV2byk7CisJCW52X2NydGMtPmN1cnNvci52aXNpYmxlID0gZmFsc2U7CisJfQorfQorCitzdGF0aWMgdm9pZAorbnY1MF9jdXJzb3Jfc2V0X3BvcyhzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjLCBpbnQgeCwgaW50IHkpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG52X2NydGMtPmJhc2UuZGV2OworCisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfQ1VSU09SX1VTRVJfUE9TKG52X2NydGMtPmluZGV4KSwKKwkJKCh5ICYgMHhGRkZGKSA8PCAxNikgfCAoeCAmIDB4RkZGRikpOworCS8qIE5lZWRlZCB0byBtYWtlIHRoZSBjdXJzb3IgbW92ZS4gKi8KKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9DVVJTT1JfVVNFUl9QT1NfQ1RSTChudl9jcnRjLT5pbmRleCksIDApOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9jdXJzb3Jfc2V0X29mZnNldChzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjLCB1aW50MzJfdCBvZmZzZXQpCit7CisJTlZfREVCVUcobnZfY3J0Yy0+YmFzZS5kZXYsICJcbiIpOworCWlmIChvZmZzZXQgPT0gbnZfY3J0Yy0+Y3Vyc29yLm9mZnNldCkKKwkJcmV0dXJuOworCisJbnZfY3J0Yy0+Y3Vyc29yLm9mZnNldCA9IG9mZnNldDsKKwlpZiAobnZfY3J0Yy0+Y3Vyc29yLnZpc2libGUpIHsKKwkJbnZfY3J0Yy0+Y3Vyc29yLnZpc2libGUgPSBmYWxzZTsKKwkJbnZfY3J0Yy0+Y3Vyc29yLnNob3cobnZfY3J0YywgdHJ1ZSk7CisJfQorfQorCitpbnQKK252NTBfY3Vyc29yX2luaXQoc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YykKK3sKKwludl9jcnRjLT5jdXJzb3Iuc2V0X29mZnNldCA9IG52NTBfY3Vyc29yX3NldF9vZmZzZXQ7CisJbnZfY3J0Yy0+Y3Vyc29yLnNldF9wb3MgPSBudjUwX2N1cnNvcl9zZXRfcG9zOworCW52X2NydGMtPmN1cnNvci5oaWRlID0gbnY1MF9jdXJzb3JfaGlkZTsKKwludl9jcnRjLT5jdXJzb3Iuc2hvdyA9IG52NTBfY3Vyc29yX3Nob3c7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK252NTBfY3Vyc29yX2Zpbmkoc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbnZfY3J0Yy0+YmFzZS5kZXY7CisJaW50IGlkeCA9IG52X2NydGMtPmluZGV4OworCisJTlZfREVCVUcoZGV2LCAiXG4iKTsKKworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NVUlNPUl9DVVJTT1JfQ1RSTDIoaWR4KSwgMCk7CisJaWYgKCFudl93YWl0KE5WNTBfUERJU1BMQVlfQ1VSU09SX0NVUlNPUl9DVFJMMihpZHgpLAorCQkgICAgIE5WNTBfUERJU1BMQVlfQ1VSU09SX0NVUlNPUl9DVFJMMl9TVEFUVVMsIDApKSB7CisJCU5WX0VSUk9SKGRldiwgInRpbWVvdXQ6IENVUlNPUl9DVFJMMl9TVEFUVVMgPT0gMFxuIik7CisJCU5WX0VSUk9SKGRldiwgIkNVUlNPUl9DVFJMMiA9IDB4JTA4eFxuIiwKKwkJCSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9DVVJTT1JfQ1VSU09SX0NUUkwyKGlkeCkpKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZGFjLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2RhYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNTgzOGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2RhYy5jCkBAIC0wLDAgKzEsMzA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1hYXJ0ZW4gTWFhdGh1aXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybV9jcnRjX2hlbHBlci5oIgorCisjZGVmaW5lIE5PVVZFQVVfRE1BX0RFQlVHIChub3V2ZWF1X3JlZ19kZWJ1ZyAmIE5PVVZFQVVfUkVHX0RFQlVHX0VWTykKKyNpbmNsdWRlICJub3V2ZWF1X3JlZy5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9kbWEuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2VuY29kZXIuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Nvbm5lY3Rvci5oIgorI2luY2x1ZGUgIm5vdXZlYXVfY3J0Yy5oIgorI2luY2x1ZGUgIm52NTBfZGlzcGxheS5oIgorCitzdGF0aWMgdm9pZAorbnY1MF9kYWNfZGlzY29ubmVjdChzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSB0b19kcm1fZW5jb2Rlcihudl9lbmNvZGVyKS0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqZXZvID0gZGV2X3ByaXYtPmV2bzsKKwlpbnQgcmV0OworCisJTlZfREVCVUcoZGV2LCAiRGlzY29ubmVjdGluZyBEQUMgJWRcbiIsIG52X2VuY29kZXItPm9yKTsKKworCXJldCA9IFJJTkdfU1BBQ0UoZXZvLCAyKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIm5vIHNwYWNlIHdoaWxlIGRpc2Nvbm5lY3RpbmcgREFDXG4iKTsKKwkJcmV0dXJuOworCX0KKwlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fREFDKG52X2VuY29kZXItPm9yLCBNT0RFX0NUUkwpLCAxKTsKKwlPVVRfUklORyhldm8sIDApOworfQorCitzdGF0aWMgZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cworbnY1MF9kYWNfZGV0ZWN0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlciwgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwllbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIHN0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOworCXVpbnQzMl90IGRwbXNfc3RhdGUsIGxvYWRfcGF0dGVybiwgbG9hZF9zdGF0ZTsKKwlpbnQgb3IgPSBudl9lbmNvZGVyLT5vcjsKKworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0RBQ19DTEtfQ1RSTDEob3IpLCAweDAwMDAwMDAxKTsKKwlkcG1zX3N0YXRlID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfREFDX0RQTVNfQ1RSTChvcikpOworCisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfREFDX0RQTVNfQ1RSTChvciksCisJCTB4MDAxNTAwMDAgfCBOVjUwX1BESVNQTEFZX0RBQ19EUE1TX0NUUkxfUEVORElORyk7CisJaWYgKCFudl93YWl0KE5WNTBfUERJU1BMQVlfREFDX0RQTVNfQ1RSTChvciksCisJCSAgICAgTlY1MF9QRElTUExBWV9EQUNfRFBNU19DVFJMX1BFTkRJTkcsIDApKSB7CisJCU5WX0VSUk9SKGRldiwgInRpbWVvdXQ6IERBQ19EUE1TX0NUUkxfUEVORElORyglZCkgPT0gMFxuIiwgb3IpOworCQlOVl9FUlJPUihkZXYsICJEQUNfRFBNU19DVFJMKCVkKSA9IDB4JTA4eFxuIiwgb3IsCisJCQkgIG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX0RBQ19EUE1TX0NUUkwob3IpKSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJLyogVXNlIGJpb3MgcHJvdmlkZWQgdmFsdWUgaWYgcG9zc2libGUuICovCisJaWYgKGRldl9wcml2LT52Ymlvcy0+ZGFjdGVzdHZhbCkgeworCQlsb2FkX3BhdHRlcm4gPSBkZXZfcHJpdi0+dmJpb3MtPmRhY3Rlc3R2YWw7CisJCU5WX0RFQlVHKGRldiwgIlVzaW5nIGJpb3MgcHJvdmlkZWQgbG9hZF9wYXR0ZXJuIG9mICVkXG4iLAorCQkJICBsb2FkX3BhdHRlcm4pOworCX0gZWxzZSB7CisJCWxvYWRfcGF0dGVybiA9IDM0MDsKKwkJTlZfREVCVUcoZGV2LCAiVXNpbmcgZGVmYXVsdCBsb2FkX3BhdHRlcm4gb2YgJWRcbiIsCisJCQkgbG9hZF9wYXR0ZXJuKTsKKwl9CisKKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9EQUNfTE9BRF9DVFJMKG9yKSwKKwkJTlY1MF9QRElTUExBWV9EQUNfTE9BRF9DVFJMX0FDVElWRSB8IGxvYWRfcGF0dGVybik7CisJbWRlbGF5KDQ1KTsgLyogZ2l2ZSBpdCBzb21lIHRpbWUgdG8gcHJvY2VzcyAqLworCWxvYWRfc3RhdGUgPSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9EQUNfTE9BRF9DVFJMKG9yKSk7CisKKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9EQUNfTE9BRF9DVFJMKG9yKSwgMCk7CisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfREFDX0RQTVNfQ1RSTChvciksIGRwbXNfc3RhdGUgfAorCQlOVjUwX1BESVNQTEFZX0RBQ19EUE1TX0NUUkxfUEVORElORyk7CisKKwlpZiAoKGxvYWRfc3RhdGUgJiBOVjUwX1BESVNQTEFZX0RBQ19MT0FEX0NUUkxfUFJFU0VOVCkgPT0KKwkJCSAgTlY1MF9QRElTUExBWV9EQUNfTE9BRF9DVFJMX1BSRVNFTlQpCisJCXN0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOworCisJaWYgKHN0YXR1cyA9PSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZCkKKwkJTlZfREVCVUcoZGV2LCAiTG9hZCB3YXMgZGV0ZWN0ZWQgb24gb3V0cHV0IHdpdGggb3IgJWRcbiIsIG9yKTsKKwllbHNlCisJCU5WX0RFQlVHKGRldiwgIkxvYWQgd2FzIG5vdCBkZXRlY3RlZCBvbiBvdXRwdXQgd2l0aCBvciAlZFxuIiwgb3IpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQKK252NTBfZGFjX2RwbXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisJdWludDMyX3QgdmFsOworCWludCBvciA9IG52X2VuY29kZXItPm9yOworCisJTlZfREVCVUcoZGV2LCAib3IgJWQgbW9kZSAlZFxuIiwgb3IsIG1vZGUpOworCisJLyogd2FpdCBmb3IgaXQgdG8gYmUgZG9uZSAqLworCWlmICghbnZfd2FpdChOVjUwX1BESVNQTEFZX0RBQ19EUE1TX0NUUkwob3IpLAorCQkgICAgIE5WNTBfUERJU1BMQVlfREFDX0RQTVNfQ1RSTF9QRU5ESU5HLCAwKSkgeworCQlOVl9FUlJPUihkZXYsICJ0aW1lb3V0OiBEQUNfRFBNU19DVFJMX1BFTkRJTkcoJWQpID09IDBcbiIsIG9yKTsKKwkJTlZfRVJST1IoZGV2LCAiREFDX0RQTVNfQ1RSTCglZCkgPSAweCUwOHhcbiIsIG9yLAorCQkJIG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX0RBQ19EUE1TX0NUUkwob3IpKSk7CisJCXJldHVybjsKKwl9CisKKwl2YWwgPSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9EQUNfRFBNU19DVFJMKG9yKSkgJiB+MHg3RjsKKworCWlmIChtb2RlICE9IERSTV9NT0RFX0RQTVNfT04pCisJCXZhbCB8PSBOVjUwX1BESVNQTEFZX0RBQ19EUE1TX0NUUkxfQkxBTktFRDsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgRFJNX01PREVfRFBNU19TVEFOREJZOgorCQl2YWwgfD0gTlY1MF9QRElTUExBWV9EQUNfRFBNU19DVFJMX0hTWU5DX09GRjsKKwkJYnJlYWs7CisJY2FzZSBEUk1fTU9ERV9EUE1TX1NVU1BFTkQ6CisJCXZhbCB8PSBOVjUwX1BESVNQTEFZX0RBQ19EUE1TX0NUUkxfVlNZTkNfT0ZGOworCQlicmVhazsKKwljYXNlIERSTV9NT0RFX0RQTVNfT0ZGOgorCQl2YWwgfD0gTlY1MF9QRElTUExBWV9EQUNfRFBNU19DVFJMX09GRjsKKwkJdmFsIHw9IE5WNTBfUERJU1BMQVlfREFDX0RQTVNfQ1RSTF9IU1lOQ19PRkY7CisJCXZhbCB8PSBOVjUwX1BESVNQTEFZX0RBQ19EUE1TX0NUUkxfVlNZTkNfT0ZGOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9EQUNfRFBNU19DVFJMKG9yKSwgdmFsIHwKKwkJTlY1MF9QRElTUExBWV9EQUNfRFBNU19DVFJMX1BFTkRJTkcpOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9kYWNfc2F2ZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJTlZfRVJST1IoZW5jb2Rlci0+ZGV2LCAiISFcbiIpOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9kYWNfcmVzdG9yZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJTlZfRVJST1IoZW5jb2Rlci0+ZGV2LCAiISFcbiIpOworfQorCitzdGF0aWMgYm9vbAorbnY1MF9kYWNfbW9kZV9maXh1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAorCQkgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKworCU5WX0RFQlVHKGVuY29kZXItPmRldiwgIm9yICVkXG4iLCBudl9lbmNvZGVyLT5vcik7CisKKwljb25uZWN0b3IgPSBub3V2ZWF1X2VuY29kZXJfY29ubmVjdG9yX2dldChudl9lbmNvZGVyKTsKKwlpZiAoIWNvbm5lY3RvcikgeworCQlOVl9FUlJPUihlbmNvZGVyLT5kZXYsICJFbmNvZGVyIGhhcyBubyBjb25uZWN0b3JcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKGNvbm5lY3Rvci0+c2NhbGluZ19tb2RlICE9IERSTV9NT0RFX1NDQUxFX05PTkUgJiYKKwkgICAgIGNvbm5lY3Rvci0+bmF0aXZlX21vZGUpIHsKKwkJaW50IGlkID0gYWRqdXN0ZWRfbW9kZS0+YmFzZS5pZDsKKwkJKmFkanVzdGVkX21vZGUgPSAqY29ubmVjdG9yLT5uYXRpdmVfbW9kZTsKKwkJYWRqdXN0ZWRfbW9kZS0+YmFzZS5pZCA9IGlkOworCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9kYWNfcHJlcGFyZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7Cit9CisKK3N0YXRpYyB2b2lkCitudjUwX2RhY19jb21taXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworfQorCitzdGF0aWMgdm9pZAorbnY1MF9kYWNfbW9kZV9zZXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpldm8gPSBkZXZfcHJpdi0+ZXZvOworCXN0cnVjdCBub3V2ZWF1X2NydGMgKmNydGMgPSBub3V2ZWF1X2NydGMoZW5jb2Rlci0+Y3J0Yyk7CisJdWludDMyX3QgbW9kZV9jdGwgPSAwLCBtb2RlX2N0bDIgPSAwOworCWludCByZXQ7CisKKwlOVl9ERUJVRyhkZXYsICJvciAlZFxuIiwgbnZfZW5jb2Rlci0+b3IpOworCisJbnY1MF9kYWNfZHBtcyhlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09OKTsKKworCWlmIChjcnRjLT5pbmRleCA9PSAxKQorCQltb2RlX2N0bCB8PSBOVjUwX0VWT19EQUNfTU9ERV9DVFJMX0NSVEMxOworCWVsc2UKKwkJbW9kZV9jdGwgfD0gTlY1MF9FVk9fREFDX01PREVfQ1RSTF9DUlRDMDsKKworCS8qIExhY2tpbmcgYSB3b3JraW5nIHR2LW91dCwgdGhpcyBpcyBub3QgYSAxMDAlIHN1cmUuICovCisJaWYgKG52X2VuY29kZXItPmRjYi0+dHlwZSA9PSBPVVRQVVRfQU5BTE9HKQorCQltb2RlX2N0bCB8PSAweDQwOworCWVsc2UKKwlpZiAobnZfZW5jb2Rlci0+ZGNiLT50eXBlID09IE9VVFBVVF9UVikKKwkJbW9kZV9jdGwgfD0gMHgxMDA7CisKKwlpZiAoYWRqdXN0ZWRfbW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX05IU1lOQykKKwkJbW9kZV9jdGwyIHw9IE5WNTBfRVZPX0RBQ19NT0RFX0NUUkwyX05IU1lOQzsKKworCWlmIChhZGp1c3RlZF9tb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfTlZTWU5DKQorCQltb2RlX2N0bDIgfD0gTlY1MF9FVk9fREFDX01PREVfQ1RSTDJfTlZTWU5DOworCisJcmV0ID0gUklOR19TUEFDRShldm8sIDMpOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAibm8gc3BhY2Ugd2hpbGUgY29ubmVjdGluZyBEQUNcbiIpOworCQlyZXR1cm47CisJfQorCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19EQUMobnZfZW5jb2Rlci0+b3IsIE1PREVfQ1RSTCksIDIpOworCU9VVF9SSU5HKGV2bywgbW9kZV9jdGwpOworCU9VVF9SSU5HKGV2bywgbW9kZV9jdGwyKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgbnY1MF9kYWNfaGVscGVyX2Z1bmNzID0geworCS5kcG1zID0gbnY1MF9kYWNfZHBtcywKKwkuc2F2ZSA9IG52NTBfZGFjX3NhdmUsCisJLnJlc3RvcmUgPSBudjUwX2RhY19yZXN0b3JlLAorCS5tb2RlX2ZpeHVwID0gbnY1MF9kYWNfbW9kZV9maXh1cCwKKwkucHJlcGFyZSA9IG52NTBfZGFjX3ByZXBhcmUsCisJLmNvbW1pdCA9IG52NTBfZGFjX2NvbW1pdCwKKwkubW9kZV9zZXQgPSBudjUwX2RhY19tb2RlX3NldCwKKwkuZGV0ZWN0ID0gbnY1MF9kYWNfZGV0ZWN0Cit9OworCitzdGF0aWMgdm9pZAorbnY1MF9kYWNfZGVzdHJveShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKworCWlmICghZW5jb2RlcikKKwkJcmV0dXJuOworCisJTlZfREVCVUcoZW5jb2Rlci0+ZGV2LCAiXG4iKTsKKworCWRybV9lbmNvZGVyX2NsZWFudXAoZW5jb2Rlcik7CisJa2ZyZWUobnZfZW5jb2Rlcik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfZnVuY3MgbnY1MF9kYWNfZW5jb2Rlcl9mdW5jcyA9IHsKKwkuZGVzdHJveSA9IG52NTBfZGFjX2Rlc3Ryb3ksCit9OworCitpbnQKK252NTBfZGFjX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2VudHJ5ICplbnRyeSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyOworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKworCU5WX0RFQlVHKGRldiwgIlxuIik7CisJTlZfSU5GTyhkZXYsICJEZXRlY3RlZCBhIERBQyBvdXRwdXRcbiIpOworCisJbnZfZW5jb2RlciA9IGt6YWxsb2Moc2l6ZW9mKCpudl9lbmNvZGVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFudl9lbmNvZGVyKQorCQlyZXR1cm4gLUVOT01FTTsKKwllbmNvZGVyID0gdG9fZHJtX2VuY29kZXIobnZfZW5jb2Rlcik7CisKKwludl9lbmNvZGVyLT5kY2IgPSBlbnRyeTsKKwludl9lbmNvZGVyLT5vciA9IGZmcyhlbnRyeS0+b3IpIC0gMTsKKworCW52X2VuY29kZXItPmRpc2Nvbm5lY3QgPSBudjUwX2RhY19kaXNjb25uZWN0OworCisJZHJtX2VuY29kZXJfaW5pdChkZXYsIGVuY29kZXIsICZudjUwX2RhY19lbmNvZGVyX2Z1bmNzLAorCQkJIERSTV9NT0RFX0VOQ09ERVJfREFDKTsKKwlkcm1fZW5jb2Rlcl9oZWxwZXJfYWRkKGVuY29kZXIsICZudjUwX2RhY19oZWxwZXJfZnVuY3MpOworCisJZW5jb2Rlci0+cG9zc2libGVfY3J0Y3MgPSBlbnRyeS0+aGVhZHM7CisJZW5jb2Rlci0+cG9zc2libGVfY2xvbmVzID0gMDsKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9kaXNwbGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2Rpc3BsYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmM1ZWU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9kaXNwbGF5LmMKQEAgLTAsMCArMSwxMDE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1hYXJ0ZW4gTWFhdGh1aXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSAibnY1MF9kaXNwbGF5LmgiCisjaW5jbHVkZSAibm91dmVhdV9jcnRjLmgiCisjaW5jbHVkZSAibm91dmVhdV9lbmNvZGVyLmgiCisjaW5jbHVkZSAibm91dmVhdV9jb25uZWN0b3IuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2ZiLmgiCisjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCisKK3N0YXRpYyB2b2lkCitudjUwX2V2b19jaGFubmVsX2RlbChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICoqcGNoYW4pCit7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9ICpwY2hhbjsKKworCWlmICghY2hhbikKKwkJcmV0dXJuOworCSpwY2hhbiA9IE5VTEw7CisKKwlub3V2ZWF1X2dwdW9ial9jaGFubmVsX3Rha2Vkb3duKGNoYW4pOworCW5vdXZlYXVfYm9fcmVmKE5VTEwsICZjaGFuLT5wdXNoYnVmX2JvKTsKKworCWlmIChjaGFuLT51c2VyKQorCQlpb3VubWFwKGNoYW4tPnVzZXIpOworCisJa2ZyZWUoY2hhbik7Cit9CisKK3N0YXRpYyBpbnQKK252NTBfZXZvX2RtYW9ial9uZXcoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqZXZvLCB1aW50MzJfdCBjbGFzcywgdWludDMyX3QgbmFtZSwKKwkJICAgIHVpbnQzMl90IHRpbGVfZmxhZ3MsIHVpbnQzMl90IG1hZ2ljX2ZsYWdzLAorCQkgICAgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBsaW1pdCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBldm8tPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGV2by0+ZGV2OworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqb2JqID0gTlVMTDsKKwlpbnQgcmV0OworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgZXZvLCA2KjQsIDMyLCAwLCAmb2JqKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCW9iai0+ZW5naW5lID0gTlZPQkpfRU5HSU5FX0RJU1BMQVk7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9yZWZfYWRkKGRldiwgZXZvLCBuYW1lLCBvYmosIE5VTEwpOworCWlmIChyZXQpIHsKKwkJbm91dmVhdV9ncHVvYmpfZGVsKGRldiwgJm9iaik7CisJCXJldHVybiByZXQ7CisJfQorCisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgdHJ1ZSk7CisJbnZfd28zMihkZXYsIG9iaiwgMCwgKHRpbGVfZmxhZ3MgPDwgMjIpIHwgKG1hZ2ljX2ZsYWdzIDw8IDE2KSB8IGNsYXNzKTsKKwludl93bzMyKGRldiwgb2JqLCAxLCBsaW1pdCk7CisJbnZfd28zMihkZXYsIG9iaiwgMiwgb2Zmc2V0KTsKKwludl93bzMyKGRldiwgb2JqLCAzLCAweDAwMDAwMDAwKTsKKwludl93bzMyKGRldiwgb2JqLCA0LCAweDAwMDAwMDAwKTsKKwludl93bzMyKGRldiwgb2JqLCA1LCAweDAwMDEwMDAwKTsKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK252NTBfZXZvX2NoYW5uZWxfbmV3KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKipwY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47CisJaW50IHJldDsKKworCWNoYW4gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaGFuKQorCQlyZXR1cm4gLUVOT01FTTsKKwkqcGNoYW4gPSBjaGFuOworCisJY2hhbi0+aWQgPSAtMTsKKwljaGFuLT5kZXYgPSBkZXY7CisJY2hhbi0+dXNlcl9nZXQgPSA0OworCWNoYW4tPnVzZXJfcHV0ID0gMDsKKworCUlOSVRfTElTVF9IRUFEKCZjaGFuLT5yYW1odF9yZWZzKTsKKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ld19yZWYoZGV2LCBOVUxMLCBOVUxMLCAwLCAzMjc2OCwgMHgxMDAwLAorCQkJCSAgICAgTlZPQkpfRkxBR19aRVJPX0FMTE9DLCAmY2hhbi0+cmFtaW4pOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiRXJyb3IgYWxsb2NhdGluZyBFVk8gY2hhbm5lbCBtZW1vcnk6ICVkXG4iLCByZXQpOworCQludjUwX2V2b19jaGFubmVsX2RlbChwY2hhbik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gbm91dmVhdV9tZW1faW5pdF9oZWFwKCZjaGFuLT5yYW1pbl9oZWFwLCBjaGFuLT5yYW1pbi0+Z3B1b2JqLT4KKwkJCQkgICAgaW1fcHJhbWluLT5zdGFydCwgMzI3NjgpOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiRXJyb3IgaW5pdGlhbGlzaW5nIEVWTyBQUkFNSU4gaGVhcDogJWRcbiIsIHJldCk7CisJCW52NTBfZXZvX2NoYW5uZWxfZGVsKHBjaGFuKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXdfcmVmKGRldiwgY2hhbiwgY2hhbiwgMCwgNDA5NiwgMTYsCisJCQkJICAgICAwLCAmY2hhbi0+cmFtaHQpOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIEVWTyBSQU1IVDogJWRcbiIsIHJldCk7CisJCW52NTBfZXZvX2NoYW5uZWxfZGVsKHBjaGFuKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgIT0gMHg1MCkgeworCQlyZXQgPSBudjUwX2V2b19kbWFvYmpfbmV3KGNoYW4sIDB4M2QsIE52RXZvRkIxNiwgMHg3MCwgMHgxOSwKKwkJCQkJICAwLCAweGZmZmZmZmZmKTsKKwkJaWYgKHJldCkgeworCQkJbnY1MF9ldm9fY2hhbm5lbF9kZWwocGNoYW4pOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisKKwkJcmV0ID0gbnY1MF9ldm9fZG1hb2JqX25ldyhjaGFuLCAweDNkLCBOdkV2b0ZCMzIsIDB4N2EsIDB4MTksCisJCQkJCSAgMCwgMHhmZmZmZmZmZik7CisJCWlmIChyZXQpIHsKKwkJCW52NTBfZXZvX2NoYW5uZWxfZGVsKHBjaGFuKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXQgPSBudjUwX2V2b19kbWFvYmpfbmV3KGNoYW4sIDB4M2QsIE52RXZvVlJBTSwgMCwgMHgxOSwKKwkJCQkgIDAsIG5vdXZlYXVfbWVtX2ZiX2Ftb3VudChkZXYpKTsKKwlpZiAocmV0KSB7CisJCW52NTBfZXZvX2NoYW5uZWxfZGVsKHBjaGFuKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBub3V2ZWF1X2JvX25ldyhkZXYsIE5VTEwsIDQwOTYsIDAsIFRUTV9QTF9GTEFHX1ZSQU0sIDAsIDAsCisJCQkgICAgIGZhbHNlLCB0cnVlLCAmY2hhbi0+cHVzaGJ1Zl9ibyk7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBub3V2ZWF1X2JvX3BpbihjaGFuLT5wdXNoYnVmX2JvLCBUVE1fUExfRkxBR19WUkFNKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIkVycm9yIGNyZWF0aW5nIEVWTyBETUEgcHVzaCBidWZmZXI6ICVkXG4iLCByZXQpOworCQludjUwX2V2b19jaGFubmVsX2RlbChwY2hhbik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gbm91dmVhdV9ib19tYXAoY2hhbi0+cHVzaGJ1Zl9ibyk7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJFcnJvciBtYXBwaW5nIEVWTyBETUEgcHVzaCBidWZmZXI6ICVkXG4iLCByZXQpOworCQludjUwX2V2b19jaGFubmVsX2RlbChwY2hhbik7CisJCXJldHVybiByZXQ7CisJfQorCisJY2hhbi0+dXNlciA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMCkgKworCQkJCQlOVjUwX1BESVNQTEFZX1VTRVIoMCksIFBBR0VfU0laRSk7CisJaWYgKCFjaGFuLT51c2VyKSB7CisJCU5WX0VSUk9SKGRldiwgIkVycm9yIG1hcHBpbmcgRVZPIGNvbnRyb2wgcmVncy5cbiIpOworCQludjUwX2V2b19jaGFubmVsX2RlbChwY2hhbik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCitpbnQKK252NTBfZGlzcGxheV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV90aW1lcl9lbmdpbmUgKnB0aW1lciA9ICZkZXZfcHJpdi0+ZW5naW5lLnRpbWVyOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmV2byA9IGRldl9wcml2LT5ldm87CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKwl1aW50MzJfdCB2YWwsIHJhbV9hbW91bnQsIGhwZF9lblsyXTsKKwl1aW50NjRfdCBzdGFydDsKKwlpbnQgcmV0LCBpOworCisJTlZfREVCVUcoZGV2LCAiXG4iKTsKKworCW52X3dyMzIoZGV2LCAweDAwNjEwMTg0LCBudl9yZDMyKGRldiwgMHgwMDYxNDAwNCkpOworCS8qCisJICogSSB0aGluayB0aGUgMHgwMDYxMDFYWCByYW5nZSBpcyBzb21lIGtpbmQgb2YgbWFpbiBjb250cm9sIGFyZWEKKwkgKiB0aGF0IGVuYWJsZXMgdGhpbmdzLgorCSAqLworCS8qIENSVEM/ICovCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQl2YWwgPSBudl9yZDMyKGRldiwgMHgwMDYxNjEwMCArIChpICogMHg4MDApKTsKKwkJbnZfd3IzMihkZXYsIDB4MDA2MTAxOTAgKyAoaSAqIDB4MTApLCB2YWwpOworCQl2YWwgPSBudl9yZDMyKGRldiwgMHgwMDYxNjEwNCArIChpICogMHg4MDApKTsKKwkJbnZfd3IzMihkZXYsIDB4MDA2MTAxOTQgKyAoaSAqIDB4MTApLCB2YWwpOworCQl2YWwgPSBudl9yZDMyKGRldiwgMHgwMDYxNjEwOCArIChpICogMHg4MDApKTsKKwkJbnZfd3IzMihkZXYsIDB4MDA2MTAxOTggKyAoaSAqIDB4MTApLCB2YWwpOworCQl2YWwgPSBudl9yZDMyKGRldiwgMHgwMDYxNjEwYyArIChpICogMHg4MDApKTsKKwkJbnZfd3IzMihkZXYsIDB4MDA2MTAxOWMgKyAoaSAqIDB4MTApLCB2YWwpOworCX0KKwkvKiBEQUMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXZhbCA9IG52X3JkMzIoZGV2LCAweDAwNjFhMDAwICsgKGkgKiAweDgwMCkpOworCQludl93cjMyKGRldiwgMHgwMDYxMDFkMCArIChpICogMHgwNCksIHZhbCk7CisJfQorCS8qIFNPUiAqLworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJdmFsID0gbnZfcmQzMihkZXYsIDB4MDA2MWMwMDAgKyAoaSAqIDB4ODAwKSk7CisJCW52X3dyMzIoZGV2LCAweDAwNjEwMWUwICsgKGkgKiAweDA0KSwgdmFsKTsKKwl9CisJLyogU29tZXRoaW5nIG5vdCB5ZXQgaW4gdXNlLCB0di1vdXQgbWF5YmUuICovCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQl2YWwgPSBudl9yZDMyKGRldiwgMHgwMDYxZTAwMCArIChpICogMHg4MDApKTsKKwkJbnZfd3IzMihkZXYsIDB4MDA2MTAxZjAgKyAoaSAqIDB4MDQpLCB2YWwpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfREFDX0RQTVNfQ1RSTChpKSwgMHgwMDU1MDAwMCB8CisJCQlOVjUwX1BESVNQTEFZX0RBQ19EUE1TX0NUUkxfUEVORElORyk7CisJCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0RBQ19DTEtfQ1RSTDEoaSksIDB4MDAwMDAwMDEpOworCX0KKworCS8qIFRoaXMgdXNlZCB0byBiZSBpbiBjcnRjIHVuYmxhbmssIGJ1dCBzZWVtcyBvdXQgb2YgcGxhY2UgdGhlcmUuICovCisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfVU5LXzM4MCwgMCk7CisJLyogUkFNIGlzIGNsYW1wZWQgdG8gMjU2IE1pQi4gKi8KKwlyYW1fYW1vdW50ID0gbm91dmVhdV9tZW1fZmJfYW1vdW50KGRldik7CisJTlZfREVCVUcoZGV2LCAicmFtX2Ftb3VudCAlZFxuIiwgcmFtX2Ftb3VudCk7CisJaWYgKHJhbV9hbW91bnQgPiAyNTYqMTAyNCoxMDI0KQorCQlyYW1fYW1vdW50ID0gMjU2KjEwMjQqMTAyNDsKKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9SQU1fQU1PVU5ULCByYW1fYW1vdW50IC0gMSk7CisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfVU5LXzM4OCwgMHgxNTAwMDApOworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX1VOS18zOEMsIDApOworCisJLyogVGhlIHByZWNpc2UgcHVycG9zZSBpcyB1bmtub3duLCBpIHN1c3BlY3QgaXQgaGFzIHNvbWV0aGluZyB0byBkbworCSAqIHdpdGggdGV4dCBtb2RlLgorCSAqLworCWlmIChudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSXzEpICYgMHgxMDApIHsKKwkJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfSU5UUl8xLCAweDEwMCk7CisJCW52X3dyMzIoZGV2LCAweDAwNjE5NGU4LCBudl9yZDMyKGRldiwgMHgwMDYxOTRlOCkgJiB+MSk7CisJCWlmICghbnZfd2FpdCgweDAwNjE5NGU4LCAyLCAwKSkgeworCQkJTlZfRVJST1IoZGV2LCAidGltZW91dDogKDB4NjE5NGU4ICYgMikgIT0gMFxuIik7CisJCQlOVl9FUlJPUihkZXYsICIweDYxOTRlOCA9IDB4JTA4eFxuIiwKKwkJCQkJCW52X3JkMzIoZGV2LCAweDYxOTRlOCkpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKworCS8qIHRha2VuIGZyb20gbnYgYnVnICMxMjYzNywgYXR0ZW1wdHMgdG8gdW4td2VkZ2UgdGhlIGh3IGlmIGl0J3MKKwkgKiBzdHVjayBpbiBzb21lIHVuc3BlY2lmaWVkIHN0YXRlCisJICovCisJc3RhcnQgPSBwdGltZXItPnJlYWQoZGV2KTsKKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9DSEFOTkVMX1NUQVQoMCksIDB4MmIwMCk7CisJd2hpbGUgKCh2YWwgPSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9DSEFOTkVMX1NUQVQoMCkpKSAmIDB4MWUwMDAwKSB7CisJCWlmICgodmFsICYgMHg5ZjAwMDApID09IDB4MjAwMDApCisJCQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9DSEFOTkVMX1NUQVQoMCksCisJCQkJCQkJdmFsIHwgMHg4MDAwMDApOworCisJCWlmICgodmFsICYgMHgzZjAwMDApID09IDB4MzAwMDApCisJCQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9DSEFOTkVMX1NUQVQoMCksCisJCQkJCQkJdmFsIHwgMHgyMDAwMDApOworCisJCWlmIChwdGltZXItPnJlYWQoZGV2KSAtIHN0YXJ0ID4gMTAwMDAwMDAwMFVMTCkgeworCQkJTlZfRVJST1IoZGV2LCAidGltZW91dDogKDB4NjEwMjAwICYgMHgxZTAwMDApICE9IDBcbiIpOworCQkJTlZfRVJST1IoZGV2LCAiMHg2MTAyMDAgPSAweCUwOHhcbiIsIHZhbCk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfQorCisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfQ1RSTF9TVEFURSwgTlY1MF9QRElTUExBWV9DVFJMX1NUQVRFX0VOQUJMRSk7CisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUKDApLCAweDEwMDBiMDMpOworCWlmICghbnZfd2FpdChOVjUwX1BESVNQTEFZX0NIQU5ORUxfU1RBVCgwKSwgMHg0MDAwMDAwMCwgMHg0MDAwMDAwMCkpIHsKKwkJTlZfRVJST1IoZGV2LCAidGltZW91dDogKDB4NjEwMjAwICYgMHg0MDAwMDAwMCkgPT0gMHg0MDAwMDAwMFxuIik7CisJCU5WX0VSUk9SKGRldiwgIjB4NjEwMjAwID0gMHglMDh4XG4iLAorCQkJICBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9DSEFOTkVMX1NUQVQoMCkpKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NVUlNPUl9DVVJTT1JfQ1RSTDIoaSksIDB4MjAwMCk7CisJCWlmICghbnZfd2FpdChOVjUwX1BESVNQTEFZX0NVUlNPUl9DVVJTT1JfQ1RSTDIoaSksCisJCQkgICAgIE5WNTBfUERJU1BMQVlfQ1VSU09SX0NVUlNPUl9DVFJMMl9TVEFUVVMsIDApKSB7CisJCQlOVl9FUlJPUihkZXYsICJ0aW1lb3V0OiBDVVJTT1JfQ1RSTDJfU1RBVFVTID09IDBcbiIpOworCQkJTlZfRVJST1IoZGV2LCAiQ1VSU09SX0NUUkwyID0gMHglMDh4XG4iLAorCQkJCSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9DVVJTT1JfQ1VSU09SX0NUUkwyKGkpKSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwkJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfQ1VSU09SX0NVUlNPUl9DVFJMMihpKSwKKwkJCU5WNTBfUERJU1BMQVlfQ1VSU09SX0NVUlNPUl9DVFJMMl9PTik7CisJCWlmICghbnZfd2FpdChOVjUwX1BESVNQTEFZX0NVUlNPUl9DVVJTT1JfQ1RSTDIoaSksCisJCQkgICAgIE5WNTBfUERJU1BMQVlfQ1VSU09SX0NVUlNPUl9DVFJMMl9TVEFUVVMsCisJCQkgICAgIE5WNTBfUERJU1BMQVlfQ1VSU09SX0NVUlNPUl9DVFJMMl9TVEFUVVNfQUNUSVZFKSkgeworCQkJTlZfRVJST1IoZGV2LCAidGltZW91dDogIgorCQkJCSAgICAgICJDVVJTT1JfQ1RSTDJfU1RBVFVTX0FDVElWRSglZClcbiIsIGkpOworCQkJTlZfRVJST1IoZGV2LCAiQ1VSU09SX0NUUkwyKCVkKSA9IDB4JTA4eFxuIiwgaSwKKwkJCQkgbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfQ1VSU09SX0NVUlNPUl9DVFJMMihpKSkpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX09CSkVDVFMsIChldm8tPnJhbWluLT5pbnN0YW5jZSA+PiA4KSB8IDkpOworCisJLyogaW5pdGlhbGlzZSBmaWZvICovCisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9ETUFfQ0IoMCksCisJCSgoZXZvLT5wdXNoYnVmX2JvLT5iby5tZW0ubW1fbm9kZS0+c3RhcnQgPDwgUEFHRV9TSElGVCkgPj4gOCkgfAorCQlOVjUwX1BESVNQTEFZX0NIQU5ORUxfRE1BX0NCX0xPQ0FUSU9OX1ZSQU0gfAorCQlOVjUwX1BESVNQTEFZX0NIQU5ORUxfRE1BX0NCX1ZBTElEKTsKKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9DSEFOTkVMX1VOSzIoMCksIDB4MDAwMTAwMDApOworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NIQU5ORUxfVU5LMygwKSwgMHgwMDAwMDAwMik7CisJaWYgKCFudl93YWl0KDB4NjEwMjAwLCAweDgwMDAwMDAwLCAweDAwMDAwMDAwKSkgeworCQlOVl9FUlJPUihkZXYsICJ0aW1lb3V0OiAoMHg2MTAyMDAgJiAweDgwMDAwMDAwKSA9PSAwXG4iKTsKKwkJTlZfRVJST1IoZGV2LCAiMHg2MTAyMDAgPSAweCUwOHhcbiIsIG52X3JkMzIoZGV2LCAweDYxMDIwMCkpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9DSEFOTkVMX1NUQVQoMCksCisJCShudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9DSEFOTkVMX1NUQVQoMCkpICYgfjB4MDAwMDAwMDMpIHwKKwkJIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUX0RNQV9FTkFCTEVEKTsKKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9VU0VSX1BVVCgwKSwgMCk7CisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUKDApLCAweDAxMDAwMDAzIHwKKwkJTlY1MF9QRElTUExBWV9DSEFOTkVMX1NUQVRfRE1BX0VOQUJMRUQpOworCW52X3dyMzIoZGV2LCAweDYxMDMwMCwgbnZfcmQzMihkZXYsIDB4NjEwMzAwKSAmIH4xKTsKKworCWV2by0+ZG1hLm1heCA9ICg0MDk2LzQpIC0gMjsKKwlldm8tPmRtYS5wdXQgPSAwOworCWV2by0+ZG1hLmN1ciA9IGV2by0+ZG1hLnB1dDsKKwlldm8tPmRtYS5mcmVlID0gZXZvLT5kbWEubWF4IC0gZXZvLT5kbWEuY3VyOworCisJcmV0ID0gUklOR19TUEFDRShldm8sIE5PVVZFQVVfRE1BX1NLSVBTKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IE5PVVZFQVVfRE1BX1NLSVBTOyBpKyspCisJCU9VVF9SSU5HKGV2bywgMCk7CisKKwlyZXQgPSBSSU5HX1NQQUNFKGV2bywgMTEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJQkVHSU5fUklORyhldm8sIDAsIE5WNTBfRVZPX1VOSzg0LCAyKTsKKwlPVVRfUklORyhldm8sIE5WNTBfRVZPX1VOSzg0X05PVElGWV9ESVNBQkxFRCk7CisJT1VUX1JJTkcoZXZvLCBOVjUwX0VWT19ETUFfTk9USUZZX0hBTkRMRV9OT05FKTsKKwlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fQ1JUQygwLCBGQl9ETUEpLCAxKTsKKwlPVVRfUklORyhldm8sIE5WNTBfRVZPX0NSVENfRkJfRE1BX0hBTkRMRV9OT05FKTsKKwlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fQ1JUQygwLCBVTkswODAwKSwgMSk7CisJT1VUX1JJTkcoZXZvLCAwKTsKKwlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fQ1JUQygwLCBESVNQTEFZX1NUQVJUKSwgMSk7CisJT1VUX1JJTkcoZXZvLCAwKTsKKwlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fQ1JUQygwLCBVTkswODJDKSwgMSk7CisJT1VUX1JJTkcoZXZvLCAwKTsKKwlGSVJFX1JJTkcoZXZvKTsKKwlpZiAoIW52X3dhaXQoMHg2NDAwMDQsIDB4ZmZmZmZmZmYsIGV2by0+ZG1hLnB1dCA8PCAyKSkKKwkJTlZfRVJST1IoZGV2LCAiZXZvIHB1c2hidWYgc3RhbGxlZFxuIik7CisKKwkvKiBlbmFibGUgY2xvY2sgY2hhbmdlIGludGVycnVwdHMuICovCisJbnZfd3IzMihkZXYsIDB4NjEwMDI4LCAweDAwMDEwMDAxKTsKKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSX0VOLCAoTlY1MF9QRElTUExBWV9JTlRSX0VOX0NMS19VTksxMCB8CisJCQkJCSAgICAgTlY1MF9QRElTUExBWV9JTlRSX0VOX0NMS19VTksyMCB8CisJCQkJCSAgICAgTlY1MF9QRElTUExBWV9JTlRSX0VOX0NMS19VTks0MCkpOworCisJLyogZW5hYmxlIGhvdHBsdWcgaW50ZXJydXB0cyAqLworCWhwZF9lblswXSA9IGhwZF9lblsxXSA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7CisJCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqY29ubiA9IG5vdXZlYXVfY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJCXN0cnVjdCBkY2JfZ3Bpb19lbnRyeSAqZ3BpbzsKKworCQlpZiAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSAhPSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJSSAmJgorCQkgICAgY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSAhPSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJRCAmJgorCQkgICAgY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSAhPSBEUk1fTU9ERV9DT05ORUNUT1JfRGlzcGxheVBvcnQpCisJCQljb250aW51ZTsKKworCQlncGlvID0gbm91dmVhdV9iaW9zX2dwaW9fZW50cnkoZGV2LCBjb25uLT5kY2ItPmdwaW9fdGFnKTsKKwkJaWYgKCFncGlvKQorCQkJY29udGludWU7CisKKwkJaHBkX2VuW2dwaW8tPmxpbmUgPj4gNF0gfD0gKDB4MDAwMTAwMDEgPDwgKGdwaW8tPmxpbmUgJiAweGYpKTsKKwl9CisKKwludl93cjMyKGRldiwgMHhlMDU0LCAweGZmZmZmZmZmKTsKKwludl93cjMyKGRldiwgMHhlMDUwLCBocGRfZW5bMF0pOworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA+PSAweDkwKSB7CisJCW52X3dyMzIoZGV2LCAweGUwNzQsIDB4ZmZmZmZmZmYpOworCQludl93cjMyKGRldiwgMHhlMDcwLCBocGRfZW5bMV0pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG52NTBfZGlzcGxheV9kaXNhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2NydGMgKmRybV9jcnRjOworCWludCByZXQsIGk7CisKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkcm1fY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKSB7CisJCXN0cnVjdCBub3V2ZWF1X2NydGMgKmNydGMgPSBub3V2ZWF1X2NydGMoZHJtX2NydGMpOworCisJCW52NTBfY3J0Y19ibGFuayhjcnRjLCB0cnVlKTsKKwl9CisKKwlyZXQgPSBSSU5HX1NQQUNFKGRldl9wcml2LT5ldm8sIDIpOworCWlmIChyZXQgPT0gMCkgeworCQlCRUdJTl9SSU5HKGRldl9wcml2LT5ldm8sIDAsIE5WNTBfRVZPX1VQREFURSwgMSk7CisJCU9VVF9SSU5HKGRldl9wcml2LT5ldm8sIDApOworCX0KKwlGSVJFX1JJTkcoZGV2X3ByaXYtPmV2byk7CisKKwkvKiBBbG1vc3QgbGlrZSBhY2snaW5nIGEgdmJsYW5rIGludGVycnVwdCwgbWF5YmUgaW4gdGhlIHNwaXJpdCBvZgorCSAqIGNsZWFuaW5nIHVwPworCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoZHJtX2NydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkgeworCQlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpjcnRjID0gbm91dmVhdV9jcnRjKGRybV9jcnRjKTsKKwkJdWludDMyX3QgbWFzayA9IE5WNTBfUERJU1BMQVlfSU5UUl8xX1ZCTEFOS19DUlRDXyhjcnRjLT5pbmRleCk7CisKKwkJaWYgKCFjcnRjLT5iYXNlLmVuYWJsZWQpCisJCQljb250aW51ZTsKKworCQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSXzEsIG1hc2spOworCQlpZiAoIW52X3dhaXQoTlY1MF9QRElTUExBWV9JTlRSXzEsIG1hc2ssIG1hc2spKSB7CisJCQlOVl9FUlJPUihkZXYsICJ0aW1lb3V0OiAoMHg2MTAwMjQgJiAweCUwOHgpID09ICIKKwkJCQkgICAgICAiMHglMDh4XG4iLCBtYXNrLCBtYXNrKTsKKwkJCU5WX0VSUk9SKGRldiwgIjB4NjEwMDI0ID0gMHglMDh4XG4iLAorCQkJCSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSXzEpKTsKKwkJfQorCX0KKworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NIQU5ORUxfU1RBVCgwKSwgMCk7CisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfQ1RSTF9TVEFURSwgMCk7CisJaWYgKCFudl93YWl0KE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUKDApLCAweDFlMDAwMCwgMCkpIHsKKwkJTlZfRVJST1IoZGV2LCAidGltZW91dDogKDB4NjEwMjAwICYgMHgxZTAwMDApID09IDBcbiIpOworCQlOVl9FUlJPUihkZXYsICIweDYxMDIwMCA9IDB4JTA4eFxuIiwKKwkJCSAgbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUKDApKSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlpZiAoIW52X3dhaXQoTlY1MF9QRElTUExBWV9TT1JfRFBNU19TVEFURShpKSwKKwkJCSAgICAgTlY1MF9QRElTUExBWV9TT1JfRFBNU19TVEFURV9XQUlULCAwKSkgeworCQkJTlZfRVJST1IoZGV2LCAidGltZW91dDogU09SX0RQTVNfU1RBVEVfV0FJVCglZCkgPT0gMFxuIiwgaSk7CisJCQlOVl9FUlJPUihkZXYsICJTT1JfRFBNU19TVEFURSglZCkgPSAweCUwOHhcbiIsIGksCisJCQkJICBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9TT1JfRFBNU19TVEFURShpKSkpOworCQl9CisJfQorCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzLiAqLworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfRU4sIDB4MDAwMDAwMDApOworCisJLyogZGlzYWJsZSBob3RwbHVnIGludGVycnVwdHMgKi8KKwludl93cjMyKGRldiwgMHhlMDU0LCAweGZmZmZmZmZmKTsKKwludl93cjMyKGRldiwgMHhlMDUwLCAweDAwMDAwMDAwKTsKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHg5MCkgeworCQludl93cjMyKGRldiwgMHhlMDc0LCAweGZmZmZmZmZmKTsKKwkJbnZfd3IzMihkZXYsIDB4ZTA3MCwgMHgwMDAwMDAwMCk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgbnY1MF9kaXNwbGF5X2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IHBhcnNlZF9kY2IgKmRjYiA9IGRldl9wcml2LT52Ymlvcy0+ZGNiOworCXVpbnQzMl90IGNvbm5lY3RvclsxNl0gPSB7fTsKKwlpbnQgcmV0LCBpOworCisJTlZfREVCVUcoZGV2LCAiXG4iKTsKKworCS8qIGluaXQgYmFzaWMga2VybmVsIG1vZGVzZXR0aW5nICovCisJZHJtX21vZGVfY29uZmlnX2luaXQoZGV2KTsKKworCS8qIEluaXRpYWxpc2Ugc29tZSBvcHRpb25hbCBjb25uZWN0b3IgcHJvcGVydGllcy4gKi8KKwlkcm1fbW9kZV9jcmVhdGVfc2NhbGluZ19tb2RlX3Byb3BlcnR5KGRldik7CisJZHJtX21vZGVfY3JlYXRlX2RpdGhlcmluZ19wcm9wZXJ0eShkZXYpOworCisJZGV2LT5tb2RlX2NvbmZpZy5taW5fd2lkdGggPSAwOworCWRldi0+bW9kZV9jb25maWcubWluX2hlaWdodCA9IDA7CisKKwlkZXYtPm1vZGVfY29uZmlnLmZ1bmNzID0gKHZvaWQgKikmbm91dmVhdV9tb2RlX2NvbmZpZ19mdW5jczsKKworCWRldi0+bW9kZV9jb25maWcubWF4X3dpZHRoID0gODE5MjsKKwlkZXYtPm1vZGVfY29uZmlnLm1heF9oZWlnaHQgPSA4MTkyOworCisJZGV2LT5tb2RlX2NvbmZpZy5mYl9iYXNlID0gZGV2X3ByaXYtPmZiX3BoeXM7CisKKwkvKiBDcmVhdGUgRVZPIGNoYW5uZWwgKi8KKwlyZXQgPSBudjUwX2V2b19jaGFubmVsX25ldyhkZXYsICZkZXZfcHJpdi0+ZXZvKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIkVycm9yIGNyZWF0aW5nIEVWTyBjaGFubmVsOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBDcmVhdGUgQ1JUQyBvYmplY3RzICovCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkJbnY1MF9jcnRjX2NyZWF0ZShkZXYsIGkpOworCisJLyogV2Ugc2V0dXAgdGhlIGVuY29kZXJzIGZyb20gdGhlIEJJT1MgdGFibGUgKi8KKwlmb3IgKGkgPSAwIDsgaSA8IGRjYi0+ZW50cmllczsgaSsrKSB7CisJCXN0cnVjdCBkY2JfZW50cnkgKmVudHJ5ID0gJmRjYi0+ZW50cnlbaV07CisKKwkJaWYgKGVudHJ5LT5sb2NhdGlvbiAhPSBEQ0JfTE9DX09OX0NISVApIHsKKwkJCU5WX1dBUk4oZGV2LCAiT2ZmLWNoaXAgZW5jb2RlciAlZC8lZCB1bnN1cHBvcnRlZFxuIiwKKwkJCQllbnRyeS0+dHlwZSwgZmZzKGVudHJ5LT5vcikgLSAxKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3dpdGNoIChlbnRyeS0+dHlwZSkgeworCQljYXNlIE9VVFBVVF9UTURTOgorCQljYXNlIE9VVFBVVF9MVkRTOgorCQljYXNlIE9VVFBVVF9EUDoKKwkJCW52NTBfc29yX2NyZWF0ZShkZXYsIGVudHJ5KTsKKwkJCWJyZWFrOworCQljYXNlIE9VVFBVVF9BTkFMT0c6CisJCQludjUwX2RhY19jcmVhdGUoZGV2LCBlbnRyeSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCU5WX1dBUk4oZGV2LCAiRENCIGVuY29kZXIgJWQgdW5rbm93blxuIiwgZW50cnktPnR5cGUpOworCQkJY29udGludWU7CisJCX0KKworCQljb25uZWN0b3JbZW50cnktPmNvbm5lY3Rvcl0gfD0gKDEgPDwgZW50cnktPnR5cGUpOworCX0KKworCS8qIEl0IGFwcGVhcnMgdGhhdCBEQ0IgMy4wKyBWQklPUyBoYXMgYSBjb25uZWN0b3IgdGFibGUsIGhvd2V2ZXIsCisJICogSSdtIG5vdCAxMDAlIGNlcnRhaW4gaG93IHRvIGRlY29kZSBpdCBjb3JyZWN0bHkgeWV0IHNvIGp1c3QKKwkgKiBsb29rIGF0IHdoYXQgZW5jb2RlcnMgYXJlIHByZXNlbnQgb24gZWFjaCBjb25uZWN0b3IgaW5kZXggYW5kCisJICogYXR0ZW1wdCB0byBkZXJpdmUgdGhlIGNvbm5lY3RvciB0eXBlIGZyb20gdGhhdC4KKwkgKi8KKwlmb3IgKGkgPSAwIDsgaSA8IGRjYi0+ZW50cmllczsgaSsrKSB7CisJCXN0cnVjdCBkY2JfZW50cnkgKmVudHJ5ID0gJmRjYi0+ZW50cnlbaV07CisJCXVpbnQxNl90IGVuY29kZXJzOworCQlpbnQgdHlwZTsKKworCQllbmNvZGVycyA9IGNvbm5lY3RvcltlbnRyeS0+Y29ubmVjdG9yXTsKKwkJaWYgKCEoZW5jb2RlcnMgJiAoMSA8PCBlbnRyeS0+dHlwZSkpKQorCQkJY29udGludWU7CisJCWNvbm5lY3RvcltlbnRyeS0+Y29ubmVjdG9yXSA9IDA7CisKKwkJaWYgKGVuY29kZXJzICYgKDEgPDwgT1VUUFVUX0RQKSkgeworCQkJdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9EaXNwbGF5UG9ydDsKKwkJfSBlbHNlIGlmIChlbmNvZGVycyAmICgxIDw8IE9VVFBVVF9UTURTKSkgeworCQkJaWYgKGVuY29kZXJzICYgKDEgPDwgT1VUUFVUX0FOQUxPRykpCisJCQkJdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9EVklJOworCQkJZWxzZQorCQkJCXR5cGUgPSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJRDsKKwkJfSBlbHNlIGlmIChlbmNvZGVycyAmICgxIDw8IE9VVFBVVF9BTkFMT0cpKSB7CisJCQl0eXBlID0gRFJNX01PREVfQ09OTkVDVE9SX1ZHQTsKKwkJfSBlbHNlIGlmIChlbmNvZGVycyAmICgxIDw8IE9VVFBVVF9MVkRTKSkgeworCQkJdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTOworCQl9IGVsc2UgeworCQkJdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9Vbmtub3duOworCQl9CisKKwkJaWYgKHR5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX1Vua25vd24pCisJCQljb250aW51ZTsKKworCQlub3V2ZWF1X2Nvbm5lY3Rvcl9jcmVhdGUoZGV2LCBlbnRyeS0+Y29ubmVjdG9yLCB0eXBlKTsKKwl9CisKKwlyZXQgPSBudjUwX2Rpc3BsYXlfaW5pdChkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG52NTBfZGlzcGxheV9kZXN0cm95KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCU5WX0RFQlVHKGRldiwgIlxuIik7CisKKwlkcm1fbW9kZV9jb25maWdfY2xlYW51cChkZXYpOworCisJbnY1MF9kaXNwbGF5X2Rpc2FibGUoZGV2KTsKKwludjUwX2V2b19jaGFubmVsX2RlbCgmZGV2X3ByaXYtPmV2byk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdAorbnY1MF9kaXNwbGF5X21vZGVfY3RybChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBib29sIHNvciwgaW50IG9yKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdWludDMyX3QgbWM7CisKKwlpZiAoc29yKSB7CisJCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA8IDB4OTAgfHwKKwkJICAgIGRldl9wcml2LT5jaGlwc2V0ID09IDB4OTIgfHwgZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHhhMCkKKwkJCW1jID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfU09SX01PREVfQ1RSTF9QKG9yKSk7CisJCWVsc2UKKwkJCW1jID0gbnZfcmQzMihkZXYsIE5WOTBfUERJU1BMQVlfU09SX01PREVfQ1RSTF9QKG9yKSk7CisJfSBlbHNlIHsKKwkJbWMgPSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9EQUNfTU9ERV9DVFJMX1Aob3IpKTsKKwl9CisKKwlyZXR1cm4gbWM7Cit9CisKK3N0YXRpYyBpbnQKK252NTBfZGlzcGxheV9pcnFfaGVhZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgKnBoZWFkLAorCQkgICAgICBzdHJ1Y3QgZGNiX2VudHJ5ICoqcGRjYmVudCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IHVuazMwID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfVU5LMzBfQ1RSTCk7CisJdWludDMyX3QgZGFjID0gMCwgc29yID0gMDsKKwlpbnQgaGVhZCwgaSwgb3IgPSAwLCB0eXBlID0gT1VUUFVUX0FOWTsKKworCS8qIFdlJ3JlIGFzc3VtaW5nIHRoYXQgaGVhZCAwICpvciogaGVhZCAxIHdpbGwgYmUgYWN0aXZlIGhlcmUsCisJICogYW5kIG5vdCBib3RoLiAgSSdtIG5vdCBzdXJlIGlmIHRoZSBodyB3aWxsIGV2ZW4gc2lnbmFsIGJvdGgKKwkgKiBldmVyLCBidXQgaXQgZGVmaW5pdGVseSBzaG91bGRuJ3QgZm9yIHVzIGFzIHdlIGNvbW1pdCBlYWNoCisJICogQ1JUQyBzZXBhcmF0ZWx5LCBhbmQgc3VibWlzc2lvbiB3aWxsIGJlIGJsb2NrZWQgYnkgdGhlIEdQVQorCSAqIHVudGlsIHdlIGhhbmRsZSBlYWNoIGluIHR1cm4uCisJICovCisJTlZfREVCVUcoZGV2LCAiMHg2MTAwMzA6IDB4JTA4eFxuIiwgdW5rMzApOworCWhlYWQgPSBmZnMoKHVuazMwID4+IDkpICYgMykgLSAxOworCWlmIChoZWFkIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBUaGlzIGFzc3VtZXMgQ1JUQ3MgYXJlIG5ldmVyIGJvdW5kIHRvIG11bHRpcGxlIGVuY29kZXJzLCB3aGljaAorCSAqIHNob3VsZCBiZSB0aGUgY2FzZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMyAmJiB0eXBlID09IE9VVFBVVF9BTlk7IGkrKykgeworCQl1aW50MzJfdCBtYyA9IG52NTBfZGlzcGxheV9tb2RlX2N0cmwoZGV2LCBmYWxzZSwgaSk7CisJCWlmICghKG1jICYgKDEgPDwgaGVhZCkpKQorCQkJY29udGludWU7CisKKwkJc3dpdGNoICgobWMgPj4gOCkgJiAweGYpIHsKKwkJY2FzZSAwOiB0eXBlID0gT1VUUFVUX0FOQUxPRzsgYnJlYWs7CisJCWNhc2UgMTogdHlwZSA9IE9VVFBVVF9UVjsgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlOVl9FUlJPUihkZXYsICJ1bmtub3duIGRhYyBtb2RlX2N0cmw6IDB4JTA4eFxuIiwgZGFjKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCW9yID0gaTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNCAmJiB0eXBlID09IE9VVFBVVF9BTlk7IGkrKykgeworCQl1aW50MzJfdCBtYyA9IG52NTBfZGlzcGxheV9tb2RlX2N0cmwoZGV2LCB0cnVlLCBpKTsKKwkJaWYgKCEobWMgJiAoMSA8PCBoZWFkKSkpCisJCQljb250aW51ZTsKKworCQlzd2l0Y2ggKChtYyA+PiA4KSAmIDB4ZikgeworCQljYXNlIDA6IHR5cGUgPSBPVVRQVVRfTFZEUzsgYnJlYWs7CisJCWNhc2UgMTogdHlwZSA9IE9VVFBVVF9UTURTOyBicmVhazsKKwkJY2FzZSAyOiB0eXBlID0gT1VUUFVUX1RNRFM7IGJyZWFrOworCQljYXNlIDU6IHR5cGUgPSBPVVRQVVRfVE1EUzsgYnJlYWs7CisJCWNhc2UgODogdHlwZSA9IE9VVFBVVF9EUDsgYnJlYWs7CisJCWNhc2UgOTogdHlwZSA9IE9VVFBVVF9EUDsgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlOVl9FUlJPUihkZXYsICJ1bmtub3duIHNvciBtb2RlX2N0cmw6IDB4JTA4eFxuIiwgc29yKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCW9yID0gaTsKKwl9CisKKwlOVl9ERUJVRyhkZXYsICJ0eXBlICVkLCBvciAlZFxuIiwgdHlwZSwgb3IpOworCWlmICh0eXBlID09IE9VVFBVVF9BTlkpIHsKKwkJTlZfRVJST1IoZGV2LCAidW5rbm93biBlbmNvZGVyISFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT52Ymlvcy0+ZGNiLT5lbnRyaWVzOyBpKyspIHsKKwkJc3RydWN0IGRjYl9lbnRyeSAqZGNiZW50ID0gJmRldl9wcml2LT52Ymlvcy0+ZGNiLT5lbnRyeVtpXTsKKworCQlpZiAoZGNiZW50LT50eXBlICE9IHR5cGUpCisJCQljb250aW51ZTsKKworCQlpZiAoIShkY2JlbnQtPm9yICYgKDEgPDwgb3IpKSkKKwkJCWNvbnRpbnVlOworCisJCSpwaGVhZCA9IGhlYWQ7CisJCSpwZGNiZW50ID0gZGNiZW50OworCQlyZXR1cm4gMDsKKwl9CisKKwlOVl9FUlJPUihkZXYsICJubyBEQ0IgZW50cnkgZm9yICVkICVkXG4iLCBkYWMgIT0gMCwgb3IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdWludDMyX3QKK252NTBfZGlzcGxheV9zY3JpcHRfc2VsZWN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfZW50cnkgKmRjYmVudCwKKwkJCSAgIGludCBweGNsaykKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudmJpb3MgKmJpb3MgPSAmZGV2X3ByaXYtPlZCSU9TOworCXVpbnQzMl90IG1jLCBzY3JpcHQgPSAwLCBvcjsKKworCW9yID0gZmZzKGRjYmVudC0+b3IpIC0gMTsKKwltYyA9IG52NTBfZGlzcGxheV9tb2RlX2N0cmwoZGV2LCBkY2JlbnQtPnR5cGUgIT0gT1VUUFVUX0FOQUxPRywgb3IpOworCXN3aXRjaCAoZGNiZW50LT50eXBlKSB7CisJY2FzZSBPVVRQVVRfTFZEUzoKKwkJc2NyaXB0ID0gKG1jID4+IDgpICYgMHhmOworCQlpZiAoYmlvcy0+cHViLmZwX25vX2RkYykgeworCQkJaWYgKGJpb3MtPmZwLmR1YWxfbGluaykKKwkJCQlzY3JpcHQgfD0gMHgwMTAwOworCQkJaWYgKGJpb3MtPmZwLmlmX2lzXzI0Yml0KQorCQkJCXNjcmlwdCB8PSAweDAyMDA7CisJCX0gZWxzZSB7CisJCQlpZiAocHhjbGsgPj0gYmlvcy0+ZnAuZHVhbGxpbmtfdHJhbnNpdGlvbl9jbGspIHsKKwkJCQlzY3JpcHQgfD0gMHgwMTAwOworCQkJCWlmIChiaW9zLT5mcC5zdHJhcGxlc3NfaXNfMjRiaXQgJiAyKQorCQkJCQlzY3JpcHQgfD0gMHgwMjAwOworCQkJfSBlbHNlCisJCQlpZiAoYmlvcy0+ZnAuc3RyYXBsZXNzX2lzXzI0Yml0ICYgMSkKKwkJCQlzY3JpcHQgfD0gMHgwMjAwOworCQl9CisKKwkJaWYgKG5vdXZlYXVfdXNjcmlwdF9sdmRzID49IDApIHsKKwkJCU5WX0lORk8oZGV2LCAib3ZlcnJpZGUgc2NyaXB0IDB4JTA0eCB3aXRoIDB4JTA0eCAiCisJCQkJICAgICAiZm9yIG91dHB1dCBMVkRTLSVkXG4iLCBzY3JpcHQsCisJCQkJICAgICBub3V2ZWF1X3VzY3JpcHRfbHZkcywgb3IpOworCQkJc2NyaXB0ID0gbm91dmVhdV91c2NyaXB0X2x2ZHM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBPVVRQVVRfVE1EUzoKKwkJc2NyaXB0ID0gKG1jID4+IDgpICYgMHhmOworCQlpZiAocHhjbGsgPj0gMTY1MDAwKQorCQkJc2NyaXB0IHw9IDB4MDEwMDsKKworCQlpZiAobm91dmVhdV91c2NyaXB0X3RtZHMgPj0gMCkgeworCQkJTlZfSU5GTyhkZXYsICJvdmVycmlkZSBzY3JpcHQgMHglMDR4IHdpdGggMHglMDR4ICIKKwkJCQkgICAgICJmb3Igb3V0cHV0IFRNRFMtJWRcbiIsIHNjcmlwdCwKKwkJCQkgICAgIG5vdXZlYXVfdXNjcmlwdF90bWRzLCBvcik7CisJCQlzY3JpcHQgPSBub3V2ZWF1X3VzY3JpcHRfdG1kczsKKwkJfQorCQlicmVhazsKKwljYXNlIE9VVFBVVF9EUDoKKwkJc2NyaXB0ID0gKG1jID4+IDgpICYgMHhmOworCQlicmVhazsKKwljYXNlIE9VVFBVVF9BTkFMT0c6CisJCXNjcmlwdCA9IDB4ZmY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCU5WX0VSUk9SKGRldiwgIm1vZGVzZXQgb24gdW5zdXBwb3J0ZWQgb3V0cHV0IHR5cGUhXG4iKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHNjcmlwdDsKK30KKworc3RhdGljIHZvaWQKK252NTBfZGlzcGxheV92YmxhbmtfY3J0Y19oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSwgKnRtcDsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgdG1wLCAmZGV2X3ByaXYtPnZibF93YWl0aW5nKSB7CisJCWNoYW4gPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsLCBudnN3LnZibF93YWl0KTsKKworCQlub3V2ZWF1X2JvX3dyMzIoY2hhbi0+bm90aWZpZXJfYm8sIGNoYW4tPm52c3cudmJsc2VtX29mZnNldCwKKwkJCQkJCWNoYW4tPm52c3cudmJsc2VtX3J2YWwpOworCQlsaXN0X2RlbCgmY2hhbi0+bnZzdy52Ymxfd2FpdCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorbnY1MF9kaXNwbGF5X3ZibGFua19oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IGludHIpCit7CisJaW50ciAmPSBOVjUwX1BESVNQTEFZX0lOVFJfMV9WQkxBTktfQ1JUQzsKKworCWlmIChpbnRyICYgTlY1MF9QRElTUExBWV9JTlRSXzFfVkJMQU5LX0NSVENfMCkKKwkJbnY1MF9kaXNwbGF5X3ZibGFua19jcnRjX2hhbmRsZXIoZGV2LCAwKTsKKworCWlmIChpbnRyICYgTlY1MF9QRElTUExBWV9JTlRSXzFfVkJMQU5LX0NSVENfMSkKKwkJbnY1MF9kaXNwbGF5X3ZibGFua19jcnRjX2hhbmRsZXIoZGV2LCAxKTsKKworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfRU4sIG52X3JkMzIoZGV2LAorCQkgICAgIE5WNTBfUERJU1BMQVlfSU5UUl9FTikgJiB+aW50cik7CisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfSU5UUl8xLCBpbnRyKTsKK30KKworc3RhdGljIHZvaWQKK252NTBfZGlzcGxheV91bmsxMF9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRjYl9lbnRyeSAqZGNiZW50OworCWludCBoZWFkLCByZXQ7CisKKwlyZXQgPSBudjUwX2Rpc3BsYXlfaXJxX2hlYWQoZGV2LCAmaGVhZCwgJmRjYmVudCk7CisJaWYgKHJldCkKKwkJZ290byBhY2s7CisKKwludl93cjMyKGRldiwgMHg2MTk0OTQsIG52X3JkMzIoZGV2LCAweDYxOTQ5NCkgJiB+OCk7CisKKwlub3V2ZWF1X2Jpb3NfcnVuX2Rpc3BsYXlfdGFibGUoZGV2LCBkY2JlbnQsIDAsIC0xKTsKKworYWNrOgorCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfMSwgTlY1MF9QRElTUExBWV9JTlRSXzFfQ0xLX1VOSzEwKTsKKwludl93cjMyKGRldiwgMHg2MTAwMzAsIDB4ODAwMDAwMDApOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9kaXNwbGF5X3VuazIwX2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGNiX2VudHJ5ICpkY2JlbnQ7CisJdWludDMyX3QgdG1wLCBwY2xrLCBzY3JpcHQ7CisJaW50IGhlYWQsIG9yLCByZXQ7CisKKwlyZXQgPSBudjUwX2Rpc3BsYXlfaXJxX2hlYWQoZGV2LCAmaGVhZCwgJmRjYmVudCk7CisJaWYgKHJldCkKKwkJZ290byBhY2s7CisJb3IgPSBmZnMoZGNiZW50LT5vcikgLSAxOworCXBjbGsgPSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9DUlRDX1AoaGVhZCwgQ0xPQ0spKSAmIDB4M2ZmZmZmOworCXNjcmlwdCA9IG52NTBfZGlzcGxheV9zY3JpcHRfc2VsZWN0KGRldiwgZGNiZW50LCBwY2xrKTsKKworCU5WX0RFQlVHKGRldiwgImhlYWQgJWQgcHhjbGs6ICVkS0h6XG4iLCBoZWFkLCBwY2xrKTsKKworCWlmIChkY2JlbnQtPnR5cGUgIT0gT1VUUFVUX0RQKQorCQlub3V2ZWF1X2Jpb3NfcnVuX2Rpc3BsYXlfdGFibGUoZGV2LCBkY2JlbnQsIDAsIC0yKTsKKworCW52NTBfY3J0Y19zZXRfY2xvY2soZGV2LCBoZWFkLCBwY2xrKTsKKworCW5vdXZlYXVfYmlvc19ydW5fZGlzcGxheV90YWJsZShkZXYsIGRjYmVudCwgc2NyaXB0LCBwY2xrKTsKKworCXRtcCA9IG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NSVENfQ0xLX0NUUkwyKGhlYWQpKTsKKwl0bXAgJj0gfjB4MDAwMDAwZjsKKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9DUlRDX0NMS19DVFJMMihoZWFkKSwgdG1wKTsKKworCWlmIChkY2JlbnQtPnR5cGUgIT0gT1VUUFVUX0FOQUxPRykgeworCQl0bXAgPSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9TT1JfQ0xLX0NUUkwyKG9yKSk7CisJCXRtcCAmPSB+MHgwMDAwMGYwZjsKKwkJaWYgKHNjcmlwdCAmIDB4MDEwMCkKKwkJCXRtcCB8PSAweDAwMDAwMTAxOworCQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9TT1JfQ0xLX0NUUkwyKG9yKSwgdG1wKTsKKwl9IGVsc2UgeworCQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9EQUNfQ0xLX0NUUkwyKG9yKSwgMCk7CisJfQorCithY2s6CisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfSU5UUl8xLCBOVjUwX1BESVNQTEFZX0lOVFJfMV9DTEtfVU5LMjApOworCW52X3dyMzIoZGV2LCAweDYxMDAzMCwgMHg4MDAwMDAwMCk7Cit9CisKK3N0YXRpYyB2b2lkCitudjUwX2Rpc3BsYXlfdW5rNDBfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkY2JfZW50cnkgKmRjYmVudDsKKwlpbnQgaGVhZCwgcGNsaywgc2NyaXB0LCByZXQ7CisKKwlyZXQgPSBudjUwX2Rpc3BsYXlfaXJxX2hlYWQoZGV2LCAmaGVhZCwgJmRjYmVudCk7CisJaWYgKHJldCkKKwkJZ290byBhY2s7CisJcGNsayA9IG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NSVENfUChoZWFkLCBDTE9DSykpICYgMHgzZmZmZmY7CisJc2NyaXB0ID0gbnY1MF9kaXNwbGF5X3NjcmlwdF9zZWxlY3QoZGV2LCBkY2JlbnQsIHBjbGspOworCisJbm91dmVhdV9iaW9zX3J1bl9kaXNwbGF5X3RhYmxlKGRldiwgZGNiZW50LCBzY3JpcHQsIC1wY2xrKTsKKworYWNrOgorCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfMSwgTlY1MF9QRElTUExBWV9JTlRSXzFfQ0xLX1VOSzQwKTsKKwludl93cjMyKGRldiwgMHg2MTAwMzAsIDB4ODAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDYxOTQ5NCwgbnZfcmQzMihkZXYsIDB4NjE5NDk0KSB8IDgpOworfQorCit2b2lkCitudjUwX2Rpc3BsYXlfaXJxX2hhbmRsZXJfYmgoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSwgaXJxX3dvcmspOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkZXZfcHJpdi0+ZGV2OworCisJZm9yICg7OykgeworCQl1aW50MzJfdCBpbnRyMCA9IG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfMCk7CisJCXVpbnQzMl90IGludHIxID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfSU5UUl8xKTsKKworCQlOVl9ERUJVRyhkZXYsICJQRElTUExBWV9JTlRSX0JIIDB4JTA4eCAweCUwOHhcbiIsIGludHIwLCBpbnRyMSk7CisKKwkJaWYgKGludHIxICYgTlY1MF9QRElTUExBWV9JTlRSXzFfQ0xLX1VOSzEwKQorCQkJbnY1MF9kaXNwbGF5X3VuazEwX2hhbmRsZXIoZGV2KTsKKwkJZWxzZQorCQlpZiAoaW50cjEgJiBOVjUwX1BESVNQTEFZX0lOVFJfMV9DTEtfVU5LMjApCisJCQludjUwX2Rpc3BsYXlfdW5rMjBfaGFuZGxlcihkZXYpOworCQllbHNlCisJCWlmIChpbnRyMSAmIE5WNTBfUERJU1BMQVlfSU5UUl8xX0NMS19VTks0MCkKKwkJCW52NTBfZGlzcGxheV91bms0MF9oYW5kbGVyKGRldik7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKworCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19JTlRSX0VOXzAsIDEpOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9kaXNwbGF5X2Vycm9yX2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwl1aW50MzJfdCBhZGRyLCBkYXRhOworCisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfSU5UUl8wLCAweDAwMDEwMDAwKTsKKwlhZGRyID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfVFJBUFBFRF9BRERSKTsKKwlkYXRhID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfVFJBUFBFRF9EQVRBKTsKKworCU5WX0VSUk9SKGRldiwgIkV2b0NoICVkIE10aGQgMHglMDR4IERhdGEgMHglMDh4ICgweCUwNHggMHglMDJ4KVxuIiwKKwkJIDAsIGFkZHIgJiAweGZmYywgZGF0YSwgYWRkciA+PiAxNiwgKGFkZHIgPj4gMTIpICYgMHhmKTsKKworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX1RSQVBQRURfQUREUiwgMHg5MDAwMDAwMCk7Cit9CisKK3N0YXRpYyB2b2lkCitudjUwX2Rpc3BsYXlfaXJxX2hvdHBsdWcoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJY29uc3QgdWludDMyX3QgZ3Bpb19yZWdbNF0gPSB7IDB4ZTEwNCwgMHhlMTA4LCAweGUyODAsIDB4ZTI4NCB9OworCXVpbnQzMl90IHVucGx1Z19tYXNrLCBwbHVnX21hc2ssIGNoYW5nZV9tYXNrOworCXVpbnQzMl90IGhwZDAsIGhwZDEgPSAwOworCisJaHBkMCA9IG52X3JkMzIoZGV2LCAweGUwNTQpICYgbnZfcmQzMihkZXYsIDB4ZTA1MCk7CisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID49IDB4OTApCisJCWhwZDEgPSBudl9yZDMyKGRldiwgMHhlMDc0KSAmIG52X3JkMzIoZGV2LCAweGUwNzApOworCisJcGx1Z19tYXNrICAgPSAoaHBkMCAmIDB4MDAwMGZmZmYpIHwgKGhwZDEgPDwgMTYpOworCXVucGx1Z19tYXNrID0gKGhwZDAgPj4gMTYpIHwgKGhwZDEgJiAweGZmZmYwMDAwKTsKKwljaGFuZ2VfbWFzayA9IHBsdWdfbWFzayB8IHVucGx1Z19tYXNrOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7CisJCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmhlbHBlcjsKKwkJc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpudl9jb25uZWN0b3IgPQorCQkJbm91dmVhdV9jb25uZWN0b3IoY29ubmVjdG9yKTsKKwkJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlcjsKKwkJc3RydWN0IGRjYl9ncGlvX2VudHJ5ICpncGlvOworCQl1aW50MzJfdCByZWc7CisJCWJvb2wgcGx1Z2dlZDsKKworCQlpZiAoIW52X2Nvbm5lY3Rvci0+ZGNiKQorCQkJY29udGludWU7CisKKwkJZ3BpbyA9IG5vdXZlYXVfYmlvc19ncGlvX2VudHJ5KGRldiwgbnZfY29ubmVjdG9yLT5kY2ItPmdwaW9fdGFnKTsKKwkJaWYgKCFncGlvIHx8ICEoY2hhbmdlX21hc2sgJiAoMSA8PCBncGlvLT5saW5lKSkpCisJCQljb250aW51ZTsKKworCQlyZWcgPSBudl9yZDMyKGRldiwgZ3Bpb19yZWdbZ3Bpby0+bGluZSA+PiAzXSk7CisJCXBsdWdnZWQgPSAhIShyZWcgJiAoNCA8PCAoKGdwaW8tPmxpbmUgJiA3KSA8PCAyKSkpOworCQlOVl9JTkZPKGRldiwgIiVzcGx1Z2dlZCAlc1xuIiwgcGx1Z2dlZCA/ICIiIDogInVuIiwKKwkJCWRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSkgOworCisJCWlmICghY29ubmVjdG9yLT5lbmNvZGVyIHx8ICFjb25uZWN0b3ItPmVuY29kZXItPmNydGMgfHwKKwkJICAgICFjb25uZWN0b3ItPmVuY29kZXItPmNydGMtPmVuYWJsZWQpCisJCQljb250aW51ZTsKKwkJbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2Rlcihjb25uZWN0b3ItPmVuY29kZXIpOworCQloZWxwZXIgPSBjb25uZWN0b3ItPmVuY29kZXItPmhlbHBlcl9wcml2YXRlOworCisJCWlmIChudl9lbmNvZGVyLT5kY2ItPnR5cGUgIT0gT1VUUFVUX0RQKQorCQkJY29udGludWU7CisKKwkJaWYgKHBsdWdnZWQpCisJCQloZWxwZXItPmRwbXMoY29ubmVjdG9yLT5lbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09OKTsKKwkJZWxzZQorCQkJaGVscGVyLT5kcG1zKGNvbm5lY3Rvci0+ZW5jb2RlciwgRFJNX01PREVfRFBNU19PRkYpOworCX0KKworCW52X3dyMzIoZGV2LCAweGUwNTQsIG52X3JkMzIoZGV2LCAweGUwNTQpKTsKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHg5MCkKKwkJbnZfd3IzMihkZXYsIDB4ZTA3NCwgbnZfcmQzMihkZXYsIDB4ZTA3NCkpOworfQorCit2b2lkCitudjUwX2Rpc3BsYXlfaXJxX2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IGRlbGF5ZWQgPSAwOworCisJd2hpbGUgKG52X3JkMzIoZGV2LCBOVjUwX1BNQ19JTlRSXzApICYgTlY1MF9QTUNfSU5UUl8wX0hPVFBMVUcpCisJCW52NTBfZGlzcGxheV9pcnFfaG90cGx1ZyhkZXYpOworCisJd2hpbGUgKG52X3JkMzIoZGV2LCBOVjUwX1BNQ19JTlRSXzApICYgTlY1MF9QTUNfSU5UUl8wX0RJU1BMQVkpIHsKKwkJdWludDMyX3QgaW50cjAgPSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSXzApOworCQl1aW50MzJfdCBpbnRyMSA9IG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfMSk7CisJCXVpbnQzMl90IGNsb2NrOworCisJCU5WX0RFQlVHKGRldiwgIlBESVNQTEFZX0lOVFIgMHglMDh4IDB4JTA4eFxuIiwgaW50cjAsIGludHIxKTsKKworCQlpZiAoIWludHIwICYmICEoaW50cjEgJiB+ZGVsYXllZCkpCisJCQlicmVhazsKKworCQlpZiAoaW50cjAgJiAweDAwMDEwMDAwKSB7CisJCQludjUwX2Rpc3BsYXlfZXJyb3JfaGFuZGxlcihkZXYpOworCQkJaW50cjAgJj0gfjB4MDAwMTAwMDA7CisJCX0KKworCQlpZiAoaW50cjEgJiBOVjUwX1BESVNQTEFZX0lOVFJfMV9WQkxBTktfQ1JUQykgeworCQkJbnY1MF9kaXNwbGF5X3ZibGFua19oYW5kbGVyKGRldiwgaW50cjEpOworCQkJaW50cjEgJj0gfk5WNTBfUERJU1BMQVlfSU5UUl8xX1ZCTEFOS19DUlRDOworCQl9CisKKwkJY2xvY2sgPSAoaW50cjEgJiAoTlY1MF9QRElTUExBWV9JTlRSXzFfQ0xLX1VOSzEwIHwKKwkJCQkgIE5WNTBfUERJU1BMQVlfSU5UUl8xX0NMS19VTksyMCB8CisJCQkJICBOVjUwX1BESVNQTEFZX0lOVFJfMV9DTEtfVU5LNDApKTsKKwkJaWYgKGNsb2NrKSB7CisJCQludl93cjMyKGRldiwgTlYwM19QTUNfSU5UUl9FTl8wLCAwKTsKKwkJCWlmICghd29ya19wZW5kaW5nKCZkZXZfcHJpdi0+aXJxX3dvcmspKQorCQkJCXF1ZXVlX3dvcmsoZGV2X3ByaXYtPndxLCAmZGV2X3ByaXYtPmlycV93b3JrKTsKKwkJCWRlbGF5ZWQgfD0gY2xvY2s7CisJCQlpbnRyMSAmPSB+Y2xvY2s7CisJCX0KKworCQlpZiAoaW50cjApIHsKKwkJCU5WX0VSUk9SKGRldiwgInVua25vd24gUERJU1BMQVlfSU5UUl8wOiAweCUwOHhcbiIsIGludHIwKTsKKwkJCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfMCwgaW50cjApOworCQl9CisKKwkJaWYgKGludHIxKSB7CisJCQlOVl9FUlJPUihkZXYsCisJCQkJICJ1bmtub3duIFBESVNQTEFZX0lOVFJfMTogMHglMDh4XG4iLCBpbnRyMSk7CisJCQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSXzEsIGludHIxKTsKKwkJfQorCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9kaXNwbGF5LmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2Rpc3BsYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWU4ZDA3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9kaXNwbGF5LmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNYWFydGVuIE1hYXRodWlzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX05WNTBfRElTUExBWV9IX18KKyNkZWZpbmUgX19OVjUwX0RJU1BMQVlfSF9fCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2RtYS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfcmVnLmgiCisjaW5jbHVkZSAibm91dmVhdV9jcnRjLmgiCisjaW5jbHVkZSAibnY1MF9ldm8uaCIKKwordm9pZCBudjUwX2Rpc3BsYXlfaXJxX2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Cit2b2lkIG52NTBfZGlzcGxheV9pcnFfaGFuZGxlcl9iaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworaW50IG52NTBfZGlzcGxheV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworaW50IG52NTBfZGlzcGxheV9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitpbnQgbnY1MF9kaXNwbGF5X2Rlc3Ryb3koc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitpbnQgbnY1MF9jcnRjX2JsYW5rKHN0cnVjdCBub3V2ZWF1X2NydGMgKiwgYm9vbCBibGFuayk7CitpbnQgbnY1MF9jcnRjX3NldF9jbG9jayhzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQgaGVhZCwgaW50IHBjbGspOworCisjZW5kaWYgLyogX19OVjUwX0RJU1BMQVlfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2V2by5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ldm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWUxMzM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ldm8uaApAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNYWFydGVuIE1hYXRodWlzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2RlZmluZSBOVjUwX0VWT19VUERBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBOVjUwX0VWT19VTks4NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4NAorI2RlZmluZSBOVjUwX0VWT19VTks4NF9OT1RJRlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBOVjUwX0VWT19VTks4NF9OT1RJRllfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBOVjUwX0VWT19VTks4NF9OT1RJRllfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBOVjUwX0VWT19ETUFfTk9USUZZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4OAorI2RlZmluZSBOVjUwX0VWT19ETUFfTk9USUZZX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBOVjUwX0VWT19ETUFfTk9USUZZX0hBTkRMRV9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBOVjUwX0VWT19VTks4QyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4QworCisjZGVmaW5lIE5WNTBfRVZPX0RBQyhuLCByKSAgICAgICAgICAgICAgICAgICAgICAgKChuKSAqIDB4ODAgKyBOVjUwX0VWT19EQUNfIyNyKQorI2RlZmluZSBOVjUwX0VWT19EQUNfTU9ERV9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBOVjUwX0VWT19EQUNfTU9ERV9DVFJMX0NSVEMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBOVjUwX0VWT19EQUNfTU9ERV9DVFJMX0NSVEMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBOVjUwX0VWT19EQUNfTU9ERV9DVFJMMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwNAorI2RlZmluZSBOVjUwX0VWT19EQUNfTU9ERV9DVFJMMl9OSFNZTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBOVjUwX0VWT19EQUNfTU9ERV9DVFJMMl9OVlNZTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorCisjZGVmaW5lIE5WNTBfRVZPX1NPUihuLCByKSAgICAgICAgICAgICAgICAgICAgICAgKChuKSAqIDB4NDAgKyBOVjUwX0VWT19TT1JfIyNyKQorI2RlZmluZSBOVjUwX0VWT19TT1JfTU9ERV9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDYwMAorI2RlZmluZSBOVjUwX0VWT19TT1JfTU9ERV9DVFJMX0NSVEMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBOVjUwX0VWT19TT1JfTU9ERV9DVFJMX0NSVEMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBOVjUwX0VWT19TT1JfTU9ERV9DVFJMX1RNRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBOVjUwX0VWT19TT1JfTU9ERV9DVFJMX1RNRFNfRFVBTF9MSU5LICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBOVjUwX0VWT19TT1JfTU9ERV9DVFJMX05IU1lOQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBOVjUwX0VWT19TT1JfTU9ERV9DVFJMX05WU1lOQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAorCisjZGVmaW5lIE5WNTBfRVZPX0NSVEMobiwgcikgICAgICAgICAgICAgICAgICAgICgobikgKiAweDQwMCArIE5WNTBfRVZPX0NSVENfIyNyKQorI2RlZmluZSBOVjg0X0VWT19DUlRDKG4sIHIpICAgICAgICAgICAgICAgICAgICAoKG4pICogMHg0MDAgKyBOVjg0X0VWT19DUlRDXyMjcikKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19VTkswODAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19DTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDQKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19JTlRFUkxBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDgKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19ESVNQTEFZX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MTAKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19ESVNQTEFZX1RPVEFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MTQKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19TWU5DX0RVUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MTgKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19TWU5DX1NUQVJUX1RPX0JMQU5LX0VORCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MWMKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19VTkswODIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MjAKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19VTkswODI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MjQKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19VTkswODJDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MmMKKyNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19DTFVUX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4NDAKKy8qIFlvdSBjYW4ndCBoYXZlIGEgcGFsZXR0ZSBpbiA4IGJpdCBtb2RlICg9T0ZGKSAqLworI2RlZmluZSBOVjUwX0VWT19DUlRDX0NMVVRfTU9ERV9CTEFOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBOVjUwX0VWT19DUlRDX0NMVVRfTU9ERV9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBOVjUwX0VWT19DUlRDX0NMVVRfTU9ERV9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhDMDAwMDAwMAorI2RlZmluZSBOVjUwX0VWT19DUlRDX0NMVVRfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDg0NAorI2RlZmluZSBOVjg0X0VWT19DUlRDX0NMVVRfRE1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDg1QworI2RlZmluZSBOVjg0X0VWT19DUlRDX0NMVVRfRE1BX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBOVjg0X0VWT19DUlRDX0NMVVRfRE1BX0hBTkRMRV9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBOVjUwX0VWT19DUlRDX0ZCX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDg2MAorI2RlZmluZSBOVjUwX0VWT19DUlRDX0ZCX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDg2OAorI2RlZmluZSBOVjUwX0VWT19DUlRDX0ZCX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDg2YworI2RlZmluZSBOVjUwX0VWT19DUlRDX0ZCX0NPTkZJR19NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBOVjUwX0VWT19DUlRDX0ZCX0NPTkZJR19NT0RFX1RJTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBOVjUwX0VWT19DUlRDX0ZCX0NPTkZJR19NT0RFX1BJVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBOVjUwX0VWT19DUlRDX0ZCX0RFUFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDg3MAorI2RlZmluZSBOVjUwX0VWT19DUlRDX0ZCX0RFUFRIXzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMWUwMAorI2RlZmluZSBOVjUwX0VWT19DUlRDX0ZCX0RFUFRIXzE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwZTkwMAorI2RlZmluZSBOVjUwX0VWT19DUlRDX0ZCX0RFUFRIXzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwZTgwMAorI2RlZmluZSBOVjUwX0VWT19DUlRDX0ZCX0RFUFRIXzI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwY2YwMAorI2RlZmluZSBOVjUwX0VWT19DUlRDX0ZCX0RFUFRIXzMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwZDEwMAorI2RlZmluZSBOVjUwX0VWT19DUlRDX0ZCX0RNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDg3NAorI2RlZmluZSBOVjUwX0VWT19DUlRDX0ZCX0RNQV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBOVjUwX0VWT19DUlRDX0ZCX0RNQV9IQU5ETEVfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBOVjUwX0VWT19DUlRDX0NVUlNPUl9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDg4MAorI2RlZmluZSBOVjUwX0VWT19DUlRDX0NVUlNPUl9DVFJMX0hJREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNTAwMDAwMAorI2RlZmluZSBOVjUwX0VWT19DUlRDX0NVUlNPUl9DVFJMX1NIT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NTAwMDAwMAorI2RlZmluZSBOVjUwX0VWT19DUlRDX0NVUlNPUl9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDg4NAorI2RlZmluZSBOVjg0X0VWT19DUlRDX0NVUlNPUl9ETUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDg5YworI2RlZmluZSBOVjg0X0VWT19DUlRDX0NVUlNPUl9ETUFfSEFORExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmZmZmZgorI2RlZmluZSBOVjg0X0VWT19DUlRDX0NVUlNPUl9ETUFfSEFORExFX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBOVjUwX0VWT19DUlRDX0RJVEhFUl9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDhhMAorI2RlZmluZSBOVjUwX0VWT19DUlRDX0RJVEhFUl9DVFJMX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBOVjUwX0VWT19DUlRDX0RJVEhFUl9DVFJMX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMQorI2RlZmluZSBOVjUwX0VWT19DUlRDX1NDQUxFX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDhhNAorI2RlZmluZSBOVjUwX0VWT19DUlRDX1NDQUxFX0NUUkxfSU5BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBOVjUwX0VWT19DUlRDX1NDQUxFX0NUUkxfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOQorI2RlZmluZSBOVjUwX0VWT19DUlRDX0NPTE9SX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDhhOAorI2RlZmluZSBOVjUwX0VWT19DUlRDX0NPTE9SX0NUUkxfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBOVjUwX0VWT19DUlRDX0ZCX1BPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDhjMAorI2RlZmluZSBOVjUwX0VWT19DUlRDX1JFQUxfUkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDhjOAorI2RlZmluZSBOVjUwX0VWT19DUlRDX1NDQUxFX0NFTlRFUl9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDhkNAorI2RlZmluZSBOVjUwX0VWT19DUlRDX1NDQUxFX0NFTlRFUl9PRkZTRVRfVkFMKHgsIHkpIFwKKwkoKCgodW5zaWduZWQpeSA8PCAxNikgJiAweEZGRkYwMDAwKSB8ICgoKHVuc2lnbmVkKXgpICYgMHgwMDAwRkZGRikpCisvKiBCb3RoIG9mIHRoZXNlIGFyZSBuZWVkZWQsIG90aGVyd2lzZSBub3RoaW5nIGhhcHBlbnMuICovCisjZGVmaW5lIE5WNTBfRVZPX0NSVENfU0NBTEVfUkVTMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwOGQ4CisjZGVmaW5lIE5WNTBfRVZPX0NSVENfU0NBTEVfUkVTMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwOGRjCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZmJjb24uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZmJjb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmNjNmQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9mYmNvbi5jCkBAIC0wLDAgKzEsMjczIEBACisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9kbWEuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2ZiY29uLmgiCisKK3N0YXRpYyB2b2lkCitudjUwX2ZiY29uX2ZpbGxyZWN0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfZmlsbHJlY3QgKnJlY3QpCit7CisJc3RydWN0IG5vdXZlYXVfZmJjb25fcGFyICpwYXIgPSBpbmZvLT5wYXI7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHBhci0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IGRldl9wcml2LT5jaGFubmVsOworCisJaWYgKGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HKQorCQlyZXR1cm47CisKKwlpZiAoIShpbmZvLT5mbGFncyAmIEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEKSAmJgorCSAgICAgUklOR19TUEFDRShjaGFuLCByZWN0LT5yb3AgPT0gUk9QX0NPUFkgPyA3IDogMTEpKSB7CisJCU5WX0VSUk9SKGRldiwgIkdQVSBsb2NrdXAgLSBzd2l0Y2hpbmcgdG8gc29mdHdhcmUgZmJjb25cbiIpOworCisJCWluZm8tPmZsYWdzIHw9IEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEOworCX0KKworCWlmIChpbmZvLT5mbGFncyAmIEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEKSB7CisJCWNmYl9maWxscmVjdChpbmZvLCByZWN0KTsKKwkJcmV0dXJuOworCX0KKworCWlmIChyZWN0LT5yb3AgIT0gUk9QX0NPUFkpIHsKKwkJQkVHSU5fUklORyhjaGFuLCBOdlN1YjJELCAweDAyYWMsIDEpOworCQlPVVRfUklORyhjaGFuLCAxKTsKKwl9CisJQkVHSU5fUklORyhjaGFuLCBOdlN1YjJELCAweDA1ODgsIDEpOworCU9VVF9SSU5HKGNoYW4sIHJlY3QtPmNvbG9yKTsKKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViMkQsIDB4MDYwMCwgNCk7CisJT1VUX1JJTkcoY2hhbiwgcmVjdC0+ZHgpOworCU9VVF9SSU5HKGNoYW4sIHJlY3QtPmR5KTsKKwlPVVRfUklORyhjaGFuLCByZWN0LT5keCArIHJlY3QtPndpZHRoKTsKKwlPVVRfUklORyhjaGFuLCByZWN0LT5keSArIHJlY3QtPmhlaWdodCk7CisJaWYgKHJlY3QtPnJvcCAhPSBST1BfQ09QWSkgeworCQlCRUdJTl9SSU5HKGNoYW4sIE52U3ViMkQsIDB4MDJhYywgMSk7CisJCU9VVF9SSU5HKGNoYW4sIDMpOworCX0KKwlGSVJFX1JJTkcoY2hhbik7Cit9CisKK3N0YXRpYyB2b2lkCitudjUwX2ZiY29uX2NvcHlhcmVhKHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfY29weWFyZWEgKnJlZ2lvbikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9mYmNvbl9wYXIgKnBhciA9IGluZm8tPnBhcjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcGFyLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmNoYW5uZWw7CisKKwlpZiAoaW5mby0+c3RhdGUgIT0gRkJJTkZPX1NUQVRFX1JVTk5JTkcpCisJCXJldHVybjsKKworCWlmICghKGluZm8tPmZsYWdzICYgRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQpICYmIFJJTkdfU1BBQ0UoY2hhbiwgMTIpKSB7CisJCU5WX0VSUk9SKGRldiwgIkdQVSBsb2NrdXAgLSBzd2l0Y2hpbmcgdG8gc29mdHdhcmUgZmJjb25cbiIpOworCisJCWluZm8tPmZsYWdzIHw9IEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEOworCX0KKworCWlmIChpbmZvLT5mbGFncyAmIEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEKSB7CisJCWNmYl9jb3B5YXJlYShpbmZvLCByZWdpb24pOworCQlyZXR1cm47CisJfQorCisJQkVHSU5fUklORyhjaGFuLCBOdlN1YjJELCAweDAxMTAsIDEpOworCU9VVF9SSU5HKGNoYW4sIDApOworCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWIyRCwgMHgwOGIwLCA0KTsKKwlPVVRfUklORyhjaGFuLCByZWdpb24tPmR4KTsKKwlPVVRfUklORyhjaGFuLCByZWdpb24tPmR5KTsKKwlPVVRfUklORyhjaGFuLCByZWdpb24tPndpZHRoKTsKKwlPVVRfUklORyhjaGFuLCByZWdpb24tPmhlaWdodCk7CisJQkVHSU5fUklORyhjaGFuLCBOdlN1YjJELCAweDA4ZDAsIDQpOworCU9VVF9SSU5HKGNoYW4sIDApOworCU9VVF9SSU5HKGNoYW4sIHJlZ2lvbi0+c3gpOworCU9VVF9SSU5HKGNoYW4sIDApOworCU9VVF9SSU5HKGNoYW4sIHJlZ2lvbi0+c3kpOworCUZJUkVfUklORyhjaGFuKTsKK30KKworc3RhdGljIHZvaWQKK252NTBfZmJjb25faW1hZ2VibGl0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfaW1hZ2UgKmltYWdlKQoreworCXN0cnVjdCBub3V2ZWF1X2ZiY29uX3BhciAqcGFyID0gaW5mby0+cGFyOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwYXItPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Y2hhbm5lbDsKKwl1aW50MzJfdCB3aWR0aCwgZHdvcmRzLCAqZGF0YSA9ICh1aW50MzJfdCAqKWltYWdlLT5kYXRhOworCXVpbnQzMl90IG1hc2sgPSB+KH4wID4+ICgzMiAtIGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkpOworCXVpbnQzMl90ICpwYWxldHRlID0gaW5mby0+cHNldWRvX3BhbGV0dGU7CisKKwlpZiAoaW5mby0+c3RhdGUgIT0gRkJJTkZPX1NUQVRFX1JVTk5JTkcpCisJCXJldHVybjsKKworCWlmIChpbWFnZS0+ZGVwdGggIT0gMSkgeworCQljZmJfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghKGluZm8tPmZsYWdzICYgRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQpICYmIFJJTkdfU1BBQ0UoY2hhbiwgMTEpKSB7CisJCU5WX0VSUk9SKGRldiwgIkdQVSBsb2NrdXAgLSBzd2l0Y2hpbmcgdG8gc29mdHdhcmUgZmJjb25cbiIpOworCQlpbmZvLT5mbGFncyB8PSBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRDsKKwl9CisKKwlpZiAoaW5mby0+ZmxhZ3MgJiBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRCkgeworCQljZmJfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKKwkJcmV0dXJuOworCX0KKworCXdpZHRoID0gKGltYWdlLT53aWR0aCArIDMxKSAmIH4zMTsKKwlkd29yZHMgPSAod2lkdGggKiBpbWFnZS0+aGVpZ2h0KSA+PiA1OworCisJQkVHSU5fUklORyhjaGFuLCBOdlN1YjJELCAweDA4MTQsIDIpOworCWlmIChpbmZvLT5maXgudmlzdWFsID09IEZCX1ZJU1VBTF9UUlVFQ09MT1IgfHwKKwkgICAgaW5mby0+Zml4LnZpc3VhbCA9PSBGQl9WSVNVQUxfRElSRUNUQ09MT1IpIHsKKwkJT1VUX1JJTkcoY2hhbiwgcGFsZXR0ZVtpbWFnZS0+YmdfY29sb3JdIHwgbWFzayk7CisJCU9VVF9SSU5HKGNoYW4sIHBhbGV0dGVbaW1hZ2UtPmZnX2NvbG9yXSB8IG1hc2spOworCX0gZWxzZSB7CisJCU9VVF9SSU5HKGNoYW4sIGltYWdlLT5iZ19jb2xvcik7CisJCU9VVF9SSU5HKGNoYW4sIGltYWdlLT5mZ19jb2xvcik7CisJfQorCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWIyRCwgMHgwODM4LCAyKTsKKwlPVVRfUklORyhjaGFuLCBpbWFnZS0+d2lkdGgpOworCU9VVF9SSU5HKGNoYW4sIGltYWdlLT5oZWlnaHQpOworCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWIyRCwgMHgwODUwLCA0KTsKKwlPVVRfUklORyhjaGFuLCAwKTsKKwlPVVRfUklORyhjaGFuLCBpbWFnZS0+ZHgpOworCU9VVF9SSU5HKGNoYW4sIDApOworCU9VVF9SSU5HKGNoYW4sIGltYWdlLT5keSk7CisKKwl3aGlsZSAoZHdvcmRzKSB7CisJCWludCBwdXNoID0gZHdvcmRzID4gMjA0NyA/IDIwNDcgOiBkd29yZHM7CisKKwkJaWYgKFJJTkdfU1BBQ0UoY2hhbiwgcHVzaCArIDEpKSB7CisJCQlOVl9FUlJPUihkZXYsCisJCQkJICJHUFUgbG9ja3VwIC0gc3dpdGNoaW5nIHRvIHNvZnR3YXJlIGZiY29uXG4iKTsKKwkJCWluZm8tPmZsYWdzIHw9IEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEOworCQkJY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJCQlyZXR1cm47CisJCX0KKworCQlkd29yZHMgLT0gcHVzaDsKKworCQlCRUdJTl9SSU5HKGNoYW4sIE52U3ViMkQsIDB4NDAwMDA4NjAsIHB1c2gpOworCQlPVVRfUklOR3AoY2hhbiwgZGF0YSwgcHVzaCk7CisJCWRhdGEgKz0gcHVzaDsKKwl9CisKKwlGSVJFX1JJTkcoY2hhbik7Cit9CisKK2ludAorbnY1MF9mYmNvbl9hY2NlbF9pbml0KHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBub3V2ZWF1X2ZiY29uX3BhciAqcGFyID0gaW5mby0+cGFyOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwYXItPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Y2hhbm5lbDsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmVuZzJkID0gTlVMTDsKKwlpbnQgcmV0LCBmb3JtYXQ7CisKKwlzd2l0Y2ggKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgeworCWNhc2UgODoKKwkJZm9ybWF0ID0gMHhmMzsKKwkJYnJlYWs7CisJY2FzZSAxNToKKwkJZm9ybWF0ID0gMHhmODsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJZm9ybWF0ID0gMHhlODsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwkJc3dpdGNoIChpbmZvLT52YXIudHJhbnNwLmxlbmd0aCkgeworCQljYXNlIDA6IC8qIGRlcHRoIDI0ICovCisJCWNhc2UgODogLyogZGVwdGggMzIsIGp1c3QgdXNlIDI0Li4gKi8KKwkJCWZvcm1hdCA9IDB4ZTY7CisJCQlicmVhazsKKwkJY2FzZSAyOiAvKiBkZXB0aCAzMCAqLworCQkJZm9ybWF0ID0gMHhkMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfZ3JfbmV3KGRldl9wcml2LT5jaGFubmVsLCAweDUwMmQsICZlbmcyZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX3JlZl9hZGQoZGV2LCBkZXZfcHJpdi0+Y2hhbm5lbCwgTnYyRCwgZW5nMmQsIE5VTEwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIDU5KTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIkdQVSBsb2NrdXAgLSBzd2l0Y2hpbmcgdG8gc29mdHdhcmUgZmJjb25cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWIyRCwgMHgwMDAwLCAxKTsKKwlPVVRfUklORyhjaGFuLCBOdjJEKTsKKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViMkQsIDB4MDE4MCwgNCk7CisJT1VUX1JJTkcoY2hhbiwgTnZOb3RpZnkwKTsKKwlPVVRfUklORyhjaGFuLCBjaGFuLT52cmFtX2hhbmRsZSk7CisJT1VUX1JJTkcoY2hhbiwgY2hhbi0+dnJhbV9oYW5kbGUpOworCU9VVF9SSU5HKGNoYW4sIGNoYW4tPnZyYW1faGFuZGxlKTsKKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViMkQsIDB4MDI5MCwgMSk7CisJT1VUX1JJTkcoY2hhbiwgMCk7CisJQkVHSU5fUklORyhjaGFuLCBOdlN1YjJELCAweDA4ODgsIDEpOworCU9VVF9SSU5HKGNoYW4sIDEpOworCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWIyRCwgMHgwMmFjLCAxKTsKKwlPVVRfUklORyhjaGFuLCAzKTsKKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViMkQsIDB4MDJhMCwgMSk7CisJT1VUX1JJTkcoY2hhbiwgMHg1NSk7CisJQkVHSU5fUklORyhjaGFuLCBOdlN1YjJELCAweDA4YzAsIDQpOworCU9VVF9SSU5HKGNoYW4sIDApOworCU9VVF9SSU5HKGNoYW4sIDEpOworCU9VVF9SSU5HKGNoYW4sIDApOworCU9VVF9SSU5HKGNoYW4sIDEpOworCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWIyRCwgMHgwNTgwLCAyKTsKKwlPVVRfUklORyhjaGFuLCA0KTsKKwlPVVRfUklORyhjaGFuLCBmb3JtYXQpOworCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWIyRCwgMHgwMmU4LCAyKTsKKwlPVVRfUklORyhjaGFuLCAyKTsKKwlPVVRfUklORyhjaGFuLCAxKTsKKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViMkQsIDB4MDgwNCwgMSk7CisJT1VUX1JJTkcoY2hhbiwgZm9ybWF0KTsKKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViMkQsIDB4MDgwMCwgMSk7CisJT1VUX1JJTkcoY2hhbiwgMSk7CisJQkVHSU5fUklORyhjaGFuLCBOdlN1YjJELCAweDA4MDgsIDMpOworCU9VVF9SSU5HKGNoYW4sIDApOworCU9VVF9SSU5HKGNoYW4sIDApOworCU9VVF9SSU5HKGNoYW4sIDApOworCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWIyRCwgMHgwODFjLCAxKTsKKwlPVVRfUklORyhjaGFuLCAxKTsKKwlCRUdJTl9SSU5HKGNoYW4sIE52U3ViMkQsIDB4MDg0MCwgNCk7CisJT1VUX1JJTkcoY2hhbiwgMCk7CisJT1VUX1JJTkcoY2hhbiwgMSk7CisJT1VUX1JJTkcoY2hhbiwgMCk7CisJT1VUX1JJTkcoY2hhbiwgMSk7CisJQkVHSU5fUklORyhjaGFuLCBOdlN1YjJELCAweDAyMDAsIDIpOworCU9VVF9SSU5HKGNoYW4sIGZvcm1hdCk7CisJT1VUX1JJTkcoY2hhbiwgMSk7CisJQkVHSU5fUklORyhjaGFuLCBOdlN1YjJELCAweDAyMTQsIDUpOworCU9VVF9SSU5HKGNoYW4sIGluZm8tPmZpeC5saW5lX2xlbmd0aCk7CisJT1VUX1JJTkcoY2hhbiwgaW5mby0+dmFyLnhyZXNfdmlydHVhbCk7CisJT1VUX1JJTkcoY2hhbiwgaW5mby0+dmFyLnlyZXNfdmlydHVhbCk7CisJT1VUX1JJTkcoY2hhbiwgMCk7CisJT1VUX1JJTkcoY2hhbiwgaW5mby0+Zml4LnNtZW1fc3RhcnQgLSBkZXZfcHJpdi0+ZmJfcGh5cyArCisJCQkgZGV2X3ByaXYtPnZtX3ZyYW1fYmFzZSk7CisJQkVHSU5fUklORyhjaGFuLCBOdlN1YjJELCAweDAyMzAsIDIpOworCU9VVF9SSU5HKGNoYW4sIGZvcm1hdCk7CisJT1VUX1JJTkcoY2hhbiwgMSk7CisJQkVHSU5fUklORyhjaGFuLCBOdlN1YjJELCAweDAyNDQsIDUpOworCU9VVF9SSU5HKGNoYW4sIGluZm8tPmZpeC5saW5lX2xlbmd0aCk7CisJT1VUX1JJTkcoY2hhbiwgaW5mby0+dmFyLnhyZXNfdmlydHVhbCk7CisJT1VUX1JJTkcoY2hhbiwgaW5mby0+dmFyLnlyZXNfdmlydHVhbCk7CisJT1VUX1JJTkcoY2hhbiwgMCk7CisJT1VUX1JJTkcoY2hhbiwgaW5mby0+Zml4LnNtZW1fc3RhcnQgLSBkZXZfcHJpdi0+ZmJfcGh5cyArCisJCQkgZGV2X3ByaXYtPnZtX3ZyYW1fYmFzZSk7CisKKwlpbmZvLT5mYm9wcy0+ZmJfZmlsbHJlY3QgPSBudjUwX2ZiY29uX2ZpbGxyZWN0OworCWluZm8tPmZib3BzLT5mYl9jb3B5YXJlYSA9IG52NTBfZmJjb25fY29weWFyZWE7CisJaW5mby0+ZmJvcHMtPmZiX2ltYWdlYmxpdCA9IG52NTBfZmJjb25faW1hZ2VibGl0OworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2ZpZm8uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZmlmby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YWUxYWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2ZpZm8uYwpAQCAtMCwwICsxLDQ5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBCZW4gU2tlZ2dzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorCitzdHJ1Y3QgbnY1MF9maWZvX3ByaXYgeworCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9yZWYgKnRoaW5nb1syXTsKKwlpbnQgY3VyX3RoaW5nbzsKK307CisKKyNkZWZpbmUgSVNfRzgwICgoZGV2X3ByaXYtPmNoaXBzZXQgJiAweGYwKSA9PSAweDUwKQorCitzdGF0aWMgdm9pZAorbnY1MF9maWZvX2luaXRfdGhpbmdvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnY1MF9maWZvX3ByaXYgKnByaXYgPSBkZXZfcHJpdi0+ZW5naW5lLmZpZm8ucHJpdjsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfcmVmICpjdXI7CisJaW50IGksIG5yOworCisJTlZfREVCVUcoZGV2LCAiXG4iKTsKKworCWN1ciA9IHByaXYtPnRoaW5nb1twcml2LT5jdXJfdGhpbmdvXTsKKwlwcml2LT5jdXJfdGhpbmdvID0gIXByaXYtPmN1cl90aGluZ287CisKKwkvKiBXZSBuZXZlciBzY2hlZHVsZSBjaGFubmVsIDAgb3IgMTI3ICovCisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgdHJ1ZSk7CisJZm9yIChpID0gMSwgbnIgPSAwOyBpIDwgMTI3OyBpKyspIHsKKwkJaWYgKGRldl9wcml2LT5maWZvc1tpXSAmJiBkZXZfcHJpdi0+Zmlmb3NbaV0tPnJhbWZjKQorCQkJbnZfd28zMihkZXYsIGN1ci0+Z3B1b2JqLCBucisrLCBpKTsKKwl9CisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKKworCW52X3dyMzIoZGV2LCAweDMyZjQsIGN1ci0+aW5zdGFuY2UgPj4gMTIpOworCW52X3dyMzIoZGV2LCAweDMyZWMsIG5yKTsKKwludl93cjMyKGRldiwgMHgyNTAwLCAweDEwMSk7Cit9CisKK3N0YXRpYyBpbnQKK252NTBfZmlmb19jaGFubmVsX2VuYWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY2hhbm5lbCwgYm9vbCBudCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Zmlmb3NbY2hhbm5lbF07CisJdWludDMyX3QgaW5zdDsKKworCU5WX0RFQlVHKGRldiwgImNoJWRcbiIsIGNoYW5uZWwpOworCisJaWYgKCFjaGFuLT5yYW1mYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoSVNfRzgwKQorCQlpbnN0ID0gY2hhbi0+cmFtZmMtPmluc3RhbmNlID4+IDEyOworCWVsc2UKKwkJaW5zdCA9IGNoYW4tPnJhbWZjLT5pbnN0YW5jZSA+PiA4OworCW52X3dyMzIoZGV2LCBOVjUwX1BGSUZPX0NUWF9UQUJMRShjaGFubmVsKSwKKwkJIGluc3QgfCBOVjUwX1BGSUZPX0NUWF9UQUJMRV9DSEFOTkVMX0VOQUJMRUQpOworCisJaWYgKCFudCkKKwkJbnY1MF9maWZvX2luaXRfdGhpbmdvKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitudjUwX2ZpZm9fY2hhbm5lbF9kaXNhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjaGFubmVsLCBib29sIG50KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdWludDMyX3QgaW5zdDsKKworCU5WX0RFQlVHKGRldiwgImNoJWQsIG50PSVkXG4iLCBjaGFubmVsLCBudCk7CisKKwlpZiAoSVNfRzgwKQorCQlpbnN0ID0gTlY1MF9QRklGT19DVFhfVEFCTEVfSU5TVEFOQ0VfTUFTS19HODA7CisJZWxzZQorCQlpbnN0ID0gTlY1MF9QRklGT19DVFhfVEFCTEVfSU5TVEFOQ0VfTUFTS19HODQ7CisJbnZfd3IzMihkZXYsIE5WNTBfUEZJRk9fQ1RYX1RBQkxFKGNoYW5uZWwpLCBpbnN0KTsKKworCWlmICghbnQpCisJCW52NTBfZmlmb19pbml0X3RoaW5nbyhkZXYpOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9maWZvX2luaXRfcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwl1aW50MzJfdCBwbWNfZSA9IE5WX1BNQ19FTkFCTEVfUEZJRk87CisKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCisJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSwgbnZfcmQzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSkgJiB+cG1jX2UpOworCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUsIG52X3JkMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUpIHwgIHBtY19lKTsKK30KKworc3RhdGljIHZvaWQKK252NTBfZmlmb19pbml0X2ludHIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCisJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fSU5UUl8wLCAweEZGRkZGRkZGKTsKKwludl93cjMyKGRldiwgTlYwM19QRklGT19JTlRSX0VOXzAsIDB4RkZGRkZGRkYpOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9maWZvX2luaXRfY29udGV4dF90YWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGk7CisKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCisJZm9yIChpID0gMDsgaSA8IE5WNTBfUEZJRk9fQ1RYX1RBQkxFX19TSVpFOyBpKyspIHsKKwkJaWYgKGRldl9wcml2LT5maWZvc1tpXSkKKwkJCW52NTBfZmlmb19jaGFubmVsX2VuYWJsZShkZXYsIGksIHRydWUpOworCQllbHNlCisJCQludjUwX2ZpZm9fY2hhbm5lbF9kaXNhYmxlKGRldiwgaSwgdHJ1ZSk7CisJfQorCisJbnY1MF9maWZvX2luaXRfdGhpbmdvKGRldik7Cit9CisKK3N0YXRpYyB2b2lkCitudjUwX2ZpZm9faW5pdF9yZWdzX19udihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCU5WX0RFQlVHKGRldiwgIlxuIik7CisKKwludl93cjMyKGRldiwgMHgyNTBjLCAweDZmM2NmYzM0KTsKK30KKworc3RhdGljIHZvaWQKK252NTBfZmlmb19pbml0X3JlZ3Moc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCisJbnZfd3IzMihkZXYsIDB4MjUwMCwgMCk7CisJbnZfd3IzMihkZXYsIDB4MzI1MCwgMCk7CisJbnZfd3IzMihkZXYsIDB4MzIyMCwgMCk7CisJbnZfd3IzMihkZXYsIDB4MzIwNCwgMCk7CisJbnZfd3IzMihkZXYsIDB4MzIxMCwgMCk7CisJbnZfd3IzMihkZXYsIDB4MzI3MCwgMCk7CisKKwkvKiBFbmFibGUgZHVtbXkgY2hhbm5lbHMgc2V0dXAgYnkgbnY1MF9pbnN0bWVtLmMgKi8KKwludjUwX2ZpZm9fY2hhbm5lbF9lbmFibGUoZGV2LCAwLCB0cnVlKTsKKwludjUwX2ZpZm9fY2hhbm5lbF9lbmFibGUoZGV2LCAxMjcsIHRydWUpOworfQorCitpbnQKK252NTBfZmlmb19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnY1MF9maWZvX3ByaXYgKnByaXY7CisJaW50IHJldDsKKworCU5WX0RFQlVHKGRldiwgIlxuIik7CisKKwlwcml2ID0gZGV2X3ByaXYtPmVuZ2luZS5maWZvLnByaXY7CisJaWYgKHByaXYpIHsKKwkJcHJpdi0+Y3VyX3RoaW5nbyA9ICFwcml2LT5jdXJfdGhpbmdvOworCQlnb3RvIGp1c3RfcmVzZXQ7CisJfQorCisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKwlkZXZfcHJpdi0+ZW5naW5lLmZpZm8ucHJpdiA9IHByaXY7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXdfcmVmKGRldiwgTlVMTCwgTlVMTCwgMCwgMTI4KjQsIDB4MTAwMCwKKwkJCQkgICAgIE5WT0JKX0ZMQUdfWkVST19BTExPQywgJnByaXYtPnRoaW5nb1swXSk7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJlcnJvciBjcmVhdGluZyB0aGluZ28wOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXdfcmVmKGRldiwgTlVMTCwgTlVMTCwgMCwgMTI4KjQsIDB4MTAwMCwKKwkJCQkgICAgIE5WT0JKX0ZMQUdfWkVST19BTExPQywgJnByaXYtPnRoaW5nb1sxXSk7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJlcnJvciBjcmVhdGluZyB0aGluZ28xOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKK2p1c3RfcmVzZXQ6CisJbnY1MF9maWZvX2luaXRfcmVzZXQoZGV2KTsKKwludjUwX2ZpZm9faW5pdF9pbnRyKGRldik7CisJbnY1MF9maWZvX2luaXRfY29udGV4dF90YWJsZShkZXYpOworCW52NTBfZmlmb19pbml0X3JlZ3NfX252KGRldik7CisJbnY1MF9maWZvX2luaXRfcmVncyhkZXYpOworCWRldl9wcml2LT5lbmdpbmUuZmlmby5lbmFibGUoZGV2KTsKKwlkZXZfcHJpdi0+ZW5naW5lLmZpZm8ucmVhc3NpZ24oZGV2LCB0cnVlKTsKKworCXJldHVybiAwOworfQorCit2b2lkCitudjUwX2ZpZm9fdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudjUwX2ZpZm9fcHJpdiAqcHJpdiA9IGRldl9wcml2LT5lbmdpbmUuZmlmby5wcml2OworCisJTlZfREVCVUcoZGV2LCAiXG4iKTsKKworCWlmICghcHJpdikKKwkJcmV0dXJuOworCisJbm91dmVhdV9ncHVvYmpfcmVmX2RlbChkZXYsICZwcml2LT50aGluZ29bMF0pOworCW5vdXZlYXVfZ3B1b2JqX3JlZl9kZWwoZGV2LCAmcHJpdi0+dGhpbmdvWzFdKTsKKworCWRldl9wcml2LT5lbmdpbmUuZmlmby5wcml2ID0gTlVMTDsKKwlrZnJlZShwcml2KTsKK30KKworaW50CitudjUwX2ZpZm9fY2hhbm5lbF9pZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXJldHVybiBudl9yZDMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfUFVTSDEpICYKKwkJCU5WNTBfUEZJRk9fQ0FDSEUxX1BVU0gxX0NISURfTUFTSzsKK30KKworaW50CitudjUwX2ZpZm9fY3JlYXRlX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpyYW1mYyA9IE5VTEw7CisJaW50IHJldDsKKworCU5WX0RFQlVHKGRldiwgImNoJWRcbiIsIGNoYW4tPmlkKTsKKworCWlmIChJU19HODApIHsKKwkJdWludDMyX3QgcmFtaW5fcG9mZnNldCA9IGNoYW4tPnJhbWluLT5ncHVvYmotPmltX3ByYW1pbi0+c3RhcnQ7CisJCXVpbnQzMl90IHJhbWluX3ZvZmZzZXQgPSBjaGFuLT5yYW1pbi0+Z3B1b2JqLT5pbV9iYWNraW5nX3N0YXJ0OworCisJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ld19mYWtlKGRldiwgcmFtaW5fcG9mZnNldCwgcmFtaW5fdm9mZnNldCwKKwkJCQkJICAgICAgMHgxMDAsIE5WT0JKX0ZMQUdfWkVST19BTExPQyB8CisJCQkJCSAgICAgIE5WT0JKX0ZMQUdfWkVST19GUkVFLCAmcmFtZmMsCisJCQkJCSAgICAgICZjaGFuLT5yYW1mYyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ld19mYWtlKGRldiwgcmFtaW5fcG9mZnNldCArIDB4MDQwMCwKKwkJCQkJICAgICAgcmFtaW5fdm9mZnNldCArIDB4MDQwMCwgNDA5NiwKKwkJCQkJICAgICAgMCwgTlVMTCwgJmNoYW4tPmNhY2hlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKKwkJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3X3JlZihkZXYsIGNoYW4sIE5VTEwsIDAsIDB4MTAwLCAyNTYsCisJCQkJCSAgICAgTlZPQkpfRkxBR19aRVJPX0FMTE9DIHwKKwkJCQkJICAgICBOVk9CSl9GTEFHX1pFUk9fRlJFRSwKKwkJCQkJICAgICAmY2hhbi0+cmFtZmMpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJcmFtZmMgPSBjaGFuLT5yYW1mYy0+Z3B1b2JqOworCisJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ld19yZWYoZGV2LCBjaGFuLCBOVUxMLCAwLCA0MDk2LCAyNTYsCisJCQkJCSAgICAgMCwgJmNoYW4tPmNhY2hlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgdHJ1ZSk7CisKKwludl93bzMyKGRldiwgcmFtZmMsIDB4MDgvNCwgY2hhbi0+cHVzaGJ1Zl9iYXNlKTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4MTAvNCwgY2hhbi0+cHVzaGJ1Zl9iYXNlKTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4NDgvNCwgY2hhbi0+cHVzaGJ1Zi0+aW5zdGFuY2UgPj4gNCk7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDgwLzQsICgweGMgPDwgMjQpIHwgKGNoYW4tPnJhbWh0LT5pbnN0YW5jZSA+PiA0KSk7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDNjLzQsIDB4MDAwODYwNzgpOworCW52X3dvMzIoZGV2LCByYW1mYywgMHg0NC80LCAweDIxMDFmZmZmKTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4NjAvNCwgMHg3ZmZmZmZmZik7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDQwLzQsIDB4MDAwMDAwMDApOworCW52X3dvMzIoZGV2LCByYW1mYywgMHg3Yy80LCAweDMwMDAwMDAxKTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4NzgvNCwgMHgwMDAwMDAwMCk7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDRjLzQsIDB4ZmZmZmZmZmYpOworCisJaWYgKCFJU19HODApIHsKKwkJbnZfd28zMihkZXYsIGNoYW4tPnJhbWluLT5ncHVvYmosIDAsIGNoYW4tPmlkKTsKKwkJbnZfd28zMihkZXYsIGNoYW4tPnJhbWluLT5ncHVvYmosIDEsCisJCQkJCQljaGFuLT5yYW1mYy0+aW5zdGFuY2UgPj4gOCk7CisKKwkJbnZfd28zMihkZXYsIHJhbWZjLCAweDg4LzQsIGNoYW4tPmNhY2hlLT5pbnN0YW5jZSA+PiAxMCk7CisJCW52X3dvMzIoZGV2LCByYW1mYywgMHg5OC80LCBjaGFuLT5yYW1pbi0+aW5zdGFuY2UgPj4gMTIpOworCX0KKworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisKKwlyZXQgPSBudjUwX2ZpZm9fY2hhbm5lbF9lbmFibGUoZGV2LCBjaGFuLT5pZCwgZmFsc2UpOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiZXJyb3IgZW5hYmxpbmcgY2glZDogJWRcbiIsIGNoYW4tPmlkLCByZXQpOworCQlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGRldiwgJmNoYW4tPnJhbWZjKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbnY1MF9maWZvX2Rlc3Ryb3lfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisKKwlOVl9ERUJVRyhkZXYsICJjaCVkXG4iLCBjaGFuLT5pZCk7CisKKwlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGRldiwgJmNoYW4tPnJhbWZjKTsKKwlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGRldiwgJmNoYW4tPmNhY2hlKTsKKworCW52NTBfZmlmb19jaGFubmVsX2Rpc2FibGUoZGV2LCBjaGFuLT5pZCwgZmFsc2UpOworCisJLyogRHVtbXkgY2hhbm5lbCwgYWxzbyB1c2VkIG9uIGNoIDEyNyAqLworCWlmIChjaGFuLT5pZCA9PSAwKQorCQludjUwX2ZpZm9fY2hhbm5lbF9kaXNhYmxlKGRldiwgMTI3LCBmYWxzZSk7Cit9CisKK2ludAorbnY1MF9maWZvX2xvYWRfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnJhbWZjID0gY2hhbi0+cmFtZmMtPmdwdW9iajsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmNhY2hlID0gY2hhbi0+Y2FjaGUtPmdwdW9iajsKKwlpbnQgcHRyLCBjbnQ7CisKKwlOVl9ERUJVRyhkZXYsICJjaCVkXG4iLCBjaGFuLT5pZCk7CisKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCBmYWxzZSk7CisKKwludl93cjMyKGRldiwgMHgzMzMwLCBudl9ybzMyKGRldiwgcmFtZmMsIDB4MDAvNCkpOworCW52X3dyMzIoZGV2LCAweDMzMzQsIG52X3JvMzIoZGV2LCByYW1mYywgMHgwNC80KSk7CisJbnZfd3IzMihkZXYsIDB4MzI0MCwgbnZfcm8zMihkZXYsIHJhbWZjLCAweDA4LzQpKTsKKwludl93cjMyKGRldiwgMHgzMzIwLCBudl9ybzMyKGRldiwgcmFtZmMsIDB4MGMvNCkpOworCW52X3dyMzIoZGV2LCAweDMyNDQsIG52X3JvMzIoZGV2LCByYW1mYywgMHgxMC80KSk7CisJbnZfd3IzMihkZXYsIDB4MzMyOCwgbnZfcm8zMihkZXYsIHJhbWZjLCAweDE0LzQpKTsKKwludl93cjMyKGRldiwgMHgzMzY4LCBudl9ybzMyKGRldiwgcmFtZmMsIDB4MTgvNCkpOworCW52X3dyMzIoZGV2LCAweDMzNmMsIG52X3JvMzIoZGV2LCByYW1mYywgMHgxYy80KSk7CisJbnZfd3IzMihkZXYsIDB4MzM3MCwgbnZfcm8zMihkZXYsIHJhbWZjLCAweDIwLzQpKTsKKwludl93cjMyKGRldiwgMHgzMzc0LCBudl9ybzMyKGRldiwgcmFtZmMsIDB4MjQvNCkpOworCW52X3dyMzIoZGV2LCAweDMzNzgsIG52X3JvMzIoZGV2LCByYW1mYywgMHgyOC80KSk7CisJbnZfd3IzMihkZXYsIDB4MzM3YywgbnZfcm8zMihkZXYsIHJhbWZjLCAweDJjLzQpKTsKKwludl93cjMyKGRldiwgMHgzMjI4LCBudl9ybzMyKGRldiwgcmFtZmMsIDB4MzAvNCkpOworCW52X3dyMzIoZGV2LCAweDMzNjQsIG52X3JvMzIoZGV2LCByYW1mYywgMHgzNC80KSk7CisJbnZfd3IzMihkZXYsIDB4MzJhMCwgbnZfcm8zMihkZXYsIHJhbWZjLCAweDM4LzQpKTsKKwludl93cjMyKGRldiwgMHgzMjI0LCBudl9ybzMyKGRldiwgcmFtZmMsIDB4M2MvNCkpOworCW52X3dyMzIoZGV2LCAweDMyNGMsIG52X3JvMzIoZGV2LCByYW1mYywgMHg0MC80KSk7CisJbnZfd3IzMihkZXYsIDB4MjA0NCwgbnZfcm8zMihkZXYsIHJhbWZjLCAweDQ0LzQpKTsKKwludl93cjMyKGRldiwgMHgzMjJjLCBudl9ybzMyKGRldiwgcmFtZmMsIDB4NDgvNCkpOworCW52X3dyMzIoZGV2LCAweDMyMzQsIG52X3JvMzIoZGV2LCByYW1mYywgMHg0Yy80KSk7CisJbnZfd3IzMihkZXYsIDB4MzM0MCwgbnZfcm8zMihkZXYsIHJhbWZjLCAweDUwLzQpKTsKKwludl93cjMyKGRldiwgMHgzMzQ0LCBudl9ybzMyKGRldiwgcmFtZmMsIDB4NTQvNCkpOworCW52X3dyMzIoZGV2LCAweDMyODAsIG52X3JvMzIoZGV2LCByYW1mYywgMHg1OC80KSk7CisJbnZfd3IzMihkZXYsIDB4MzI1NCwgbnZfcm8zMihkZXYsIHJhbWZjLCAweDVjLzQpKTsKKwludl93cjMyKGRldiwgMHgzMjYwLCBudl9ybzMyKGRldiwgcmFtZmMsIDB4NjAvNCkpOworCW52X3dyMzIoZGV2LCAweDMyNjQsIG52X3JvMzIoZGV2LCByYW1mYywgMHg2NC80KSk7CisJbnZfd3IzMihkZXYsIDB4MzI2OCwgbnZfcm8zMihkZXYsIHJhbWZjLCAweDY4LzQpKTsKKwludl93cjMyKGRldiwgMHgzMjZjLCBudl9ybzMyKGRldiwgcmFtZmMsIDB4NmMvNCkpOworCW52X3dyMzIoZGV2LCAweDMyZTQsIG52X3JvMzIoZGV2LCByYW1mYywgMHg3MC80KSk7CisJbnZfd3IzMihkZXYsIDB4MzI0OCwgbnZfcm8zMihkZXYsIHJhbWZjLCAweDc0LzQpKTsKKwludl93cjMyKGRldiwgMHgyMDg4LCBudl9ybzMyKGRldiwgcmFtZmMsIDB4NzgvNCkpOworCW52X3dyMzIoZGV2LCAweDIwNTgsIG52X3JvMzIoZGV2LCByYW1mYywgMHg3Yy80KSk7CisJbnZfd3IzMihkZXYsIDB4MjIxMCwgbnZfcm8zMihkZXYsIHJhbWZjLCAweDgwLzQpKTsKKworCWNudCA9IG52X3JvMzIoZGV2LCByYW1mYywgMHg4NC80KTsKKwlmb3IgKHB0ciA9IDA7IHB0ciA8IGNudDsgcHRyKyspIHsKKwkJbnZfd3IzMihkZXYsIE5WNDBfUEZJRk9fQ0FDSEUxX01FVEhPRChwdHIpLAorCQkJbnZfcm8zMihkZXYsIGNhY2hlLCAocHRyICogMikgKyAwKSk7CisJCW52X3dyMzIoZGV2LCBOVjQwX1BGSUZPX0NBQ0hFMV9EQVRBKHB0ciksCisJCQludl9ybzMyKGRldiwgY2FjaGUsIChwdHIgKiAyKSArIDEpKTsKKwl9CisJbnZfd3IzMihkZXYsIDB4MzIxMCwgY250IDw8IDIpOworCW52X3dyMzIoZGV2LCAweDMyNzAsIDApOworCisJLyogZ3Vlc3NpbmcgdGhhdCBhbGwgdGhlIDB4MzR4eCByZWdzIGFyZW4ndCBvbiBOVjUwICovCisJaWYgKCFJU19HODApIHsKKwkJbnZfd3IzMihkZXYsIDB4MzQwYywgbnZfcm8zMihkZXYsIHJhbWZjLCAweDg4LzQpKTsKKwkJbnZfd3IzMihkZXYsIDB4MzQwMCwgbnZfcm8zMihkZXYsIHJhbWZjLCAweDhjLzQpKTsKKwkJbnZfd3IzMihkZXYsIDB4MzQwNCwgbnZfcm8zMihkZXYsIHJhbWZjLCAweDkwLzQpKTsKKwkJbnZfd3IzMihkZXYsIDB4MzQwOCwgbnZfcm8zMihkZXYsIHJhbWZjLCAweDk0LzQpKTsKKwkJbnZfd3IzMihkZXYsIDB4MzQxMCwgbnZfcm8zMihkZXYsIHJhbWZjLCAweDk4LzQpKTsKKwl9CisKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmluaXNoX2FjY2VzcyhkZXYpOworCisJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX0dFVCwgMCk7CisJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX1BVVCwgMCk7CisJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX1BVU0gxLCBjaGFuLT5pZCB8ICgxPDwxNikpOworCXJldHVybiAwOworfQorCitpbnQKK252NTBfZmlmb191bmxvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZmlmb19lbmdpbmUgKnBmaWZvID0gJmRldl9wcml2LT5lbmdpbmUuZmlmbzsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnJhbWZjLCAqY2FjaGU7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IE5VTEw7CisJaW50IGNoaWQsIGdldCwgcHV0LCBwdHI7CisKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCisJY2hpZCA9IHBmaWZvLT5jaGFubmVsX2lkKGRldik7CisJaWYgKGNoaWQgPCAwIHx8IGNoaWQgPj0gZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzKQorCQlyZXR1cm4gMDsKKworCWNoYW4gPSBkZXZfcHJpdi0+Zmlmb3NbY2hpZF07CisJaWYgKCFjaGFuKSB7CisJCU5WX0VSUk9SKGRldiwgIkluYWN0aXZlIGNoYW5uZWwgb24gUEZJRk86ICVkXG4iLCBjaGlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCU5WX0RFQlVHKGRldiwgImNoJWRcbiIsIGNoYW4tPmlkKTsKKwlyYW1mYyA9IGNoYW4tPnJhbWZjLT5ncHVvYmo7CisJY2FjaGUgPSBjaGFuLT5jYWNoZS0+Z3B1b2JqOworCisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgdHJ1ZSk7CisKKwludl93bzMyKGRldiwgcmFtZmMsIDB4MDAvNCwgbnZfcmQzMihkZXYsIDB4MzMzMCkpOworCW52X3dvMzIoZGV2LCByYW1mYywgMHgwNC80LCBudl9yZDMyKGRldiwgMHgzMzM0KSk7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDA4LzQsIG52X3JkMzIoZGV2LCAweDMyNDApKTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4MGMvNCwgbnZfcmQzMihkZXYsIDB4MzMyMCkpOworCW52X3dvMzIoZGV2LCByYW1mYywgMHgxMC80LCBudl9yZDMyKGRldiwgMHgzMjQ0KSk7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDE0LzQsIG52X3JkMzIoZGV2LCAweDMzMjgpKTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4MTgvNCwgbnZfcmQzMihkZXYsIDB4MzM2OCkpOworCW52X3dvMzIoZGV2LCByYW1mYywgMHgxYy80LCBudl9yZDMyKGRldiwgMHgzMzZjKSk7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDIwLzQsIG52X3JkMzIoZGV2LCAweDMzNzApKTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4MjQvNCwgbnZfcmQzMihkZXYsIDB4MzM3NCkpOworCW52X3dvMzIoZGV2LCByYW1mYywgMHgyOC80LCBudl9yZDMyKGRldiwgMHgzMzc4KSk7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDJjLzQsIG52X3JkMzIoZGV2LCAweDMzN2MpKTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4MzAvNCwgbnZfcmQzMihkZXYsIDB4MzIyOCkpOworCW52X3dvMzIoZGV2LCByYW1mYywgMHgzNC80LCBudl9yZDMyKGRldiwgMHgzMzY0KSk7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDM4LzQsIG52X3JkMzIoZGV2LCAweDMyYTApKTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4M2MvNCwgbnZfcmQzMihkZXYsIDB4MzIyNCkpOworCW52X3dvMzIoZGV2LCByYW1mYywgMHg0MC80LCBudl9yZDMyKGRldiwgMHgzMjRjKSk7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDQ0LzQsIG52X3JkMzIoZGV2LCAweDIwNDQpKTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4NDgvNCwgbnZfcmQzMihkZXYsIDB4MzIyYykpOworCW52X3dvMzIoZGV2LCByYW1mYywgMHg0Yy80LCBudl9yZDMyKGRldiwgMHgzMjM0KSk7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDUwLzQsIG52X3JkMzIoZGV2LCAweDMzNDApKTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4NTQvNCwgbnZfcmQzMihkZXYsIDB4MzM0NCkpOworCW52X3dvMzIoZGV2LCByYW1mYywgMHg1OC80LCBudl9yZDMyKGRldiwgMHgzMjgwKSk7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDVjLzQsIG52X3JkMzIoZGV2LCAweDMyNTQpKTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4NjAvNCwgbnZfcmQzMihkZXYsIDB4MzI2MCkpOworCW52X3dvMzIoZGV2LCByYW1mYywgMHg2NC80LCBudl9yZDMyKGRldiwgMHgzMjY0KSk7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDY4LzQsIG52X3JkMzIoZGV2LCAweDMyNjgpKTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4NmMvNCwgbnZfcmQzMihkZXYsIDB4MzI2YykpOworCW52X3dvMzIoZGV2LCByYW1mYywgMHg3MC80LCBudl9yZDMyKGRldiwgMHgzMmU0KSk7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDc0LzQsIG52X3JkMzIoZGV2LCAweDMyNDgpKTsKKwludl93bzMyKGRldiwgcmFtZmMsIDB4NzgvNCwgbnZfcmQzMihkZXYsIDB4MjA4OCkpOworCW52X3dvMzIoZGV2LCByYW1mYywgMHg3Yy80LCBudl9yZDMyKGRldiwgMHgyMDU4KSk7CisJbnZfd28zMihkZXYsIHJhbWZjLCAweDgwLzQsIG52X3JkMzIoZGV2LCAweDIyMTApKTsKKworCXB1dCA9IChudl9yZDMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfUFVUKSAmIDB4N2ZmKSA+PiAyOworCWdldCA9IChudl9yZDMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfR0VUKSAmIDB4N2ZmKSA+PiAyOworCXB0ciA9IDA7CisJd2hpbGUgKHB1dCAhPSBnZXQpIHsKKwkJbnZfd28zMihkZXYsIGNhY2hlLCBwdHIrKywKKwkJCSAgICBudl9yZDMyKGRldiwgTlY0MF9QRklGT19DQUNIRTFfTUVUSE9EKGdldCkpKTsKKwkJbnZfd28zMihkZXYsIGNhY2hlLCBwdHIrKywKKwkJCSAgICBudl9yZDMyKGRldiwgTlY0MF9QRklGT19DQUNIRTFfREFUQShnZXQpKSk7CisJCWdldCA9IChnZXQgKyAxKSAmIDB4MWZmOworCX0KKworCS8qIGd1ZXNzaW5nIHRoYXQgYWxsIHRoZSAweDM0eHggcmVncyBhcmVuJ3Qgb24gTlY1MCAqLworCWlmICghSVNfRzgwKSB7CisJCW52X3dvMzIoZGV2LCByYW1mYywgMHg4NC80LCBwdHIgPj4gMSk7CisJCW52X3dvMzIoZGV2LCByYW1mYywgMHg4OC80LCBudl9yZDMyKGRldiwgMHgzNDBjKSk7CisJCW52X3dvMzIoZGV2LCByYW1mYywgMHg4Yy80LCBudl9yZDMyKGRldiwgMHgzNDAwKSk7CisJCW52X3dvMzIoZGV2LCByYW1mYywgMHg5MC80LCBudl9yZDMyKGRldiwgMHgzNDA0KSk7CisJCW52X3dvMzIoZGV2LCByYW1mYywgMHg5NC80LCBudl9yZDMyKGRldiwgMHgzNDA4KSk7CisJCW52X3dvMzIoZGV2LCByYW1mYywgMHg5OC80LCBudl9yZDMyKGRldiwgMHgzNDEwKSk7CisJfQorCisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKKworCS8qWFhYOiBwcm9iYWJseSByZWxvYWQgY2gxMjcgKE5VTEwpIHN0YXRlIGJhY2sgdG9vICovCisJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX1BVU0gxLCAxMjcpOworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2dyYXBoLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2dyYXBoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc3ZDgyMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZ3JhcGguYwpAQCAtMCwwICsxLDM4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBCZW4gU2tlZ2dzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorCitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY1MC5jdHhwcm9nIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY1MC5jdHh2YWxzIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY4NC5jdHhwcm9nIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY4NC5jdHh2YWxzIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY4Ni5jdHhwcm9nIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY4Ni5jdHh2YWxzIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY5Mi5jdHhwcm9nIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY5Mi5jdHh2YWxzIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY5NC5jdHhwcm9nIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY5NC5jdHh2YWxzIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY5Ni5jdHhwcm9nIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY5Ni5jdHh2YWxzIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY5OC5jdHhwcm9nIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnY5OC5jdHh2YWxzIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnZhMC5jdHhwcm9nIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnZhMC5jdHh2YWxzIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnZhNS5jdHhwcm9nIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnZhNS5jdHh2YWxzIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnZhOC5jdHhwcm9nIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnZhOC5jdHh2YWxzIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnZhYS5jdHhwcm9nIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnZhYS5jdHh2YWxzIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnZhYy5jdHhwcm9nIik7CitNT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvbnZhYy5jdHh2YWxzIik7CisKKyNkZWZpbmUgSVNfRzgwICgoZGV2X3ByaXYtPmNoaXBzZXQgJiAweGYwKSA9PSAweDUwKQorCitzdGF0aWMgdm9pZAorbnY1MF9ncmFwaF9pbml0X3Jlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJdWludDMyX3QgcG1jX2UgPSBOVl9QTUNfRU5BQkxFX1BHUkFQSCB8ICgxIDw8IDIxKTsKKworCU5WX0RFQlVHKGRldiwgIlxuIik7CisKKwludl93cjMyKGRldiwgTlYwM19QTUNfRU5BQkxFLCBudl9yZDMyKGRldiwgTlYwM19QTUNfRU5BQkxFKSAmIH5wbWNfZSk7CisJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSwgbnZfcmQzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSkgfCAgcG1jX2UpOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9ncmFwaF9pbml0X2ludHIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCisJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIsIDB4ZmZmZmZmZmYpOworCW52X3dyMzIoZGV2LCAweDQwMDEzOCwgMHhmZmZmZmZmZik7CisJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX0lOVFJfRU4sIDB4ZmZmZmZmZmYpOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9ncmFwaF9pbml0X3JlZ3NfX252KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJTlZfREVCVUcoZGV2LCAiXG4iKTsKKworCW52X3dyMzIoZGV2LCAweDQwMDgwNCwgMHhjMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA2ODAwLCAweGMwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDBjMDQsIDB4YzAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwMTgwNCwgMHhjMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA1MDE4LCAweGMwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDIwMDAsIDB4YzAwMDAwMDApOworCisJbnZfd3IzMihkZXYsIDB4NDAwMTA4LCAweGZmZmZmZmZmKTsKKworCW52X3dyMzIoZGV2LCAweDQwMDgyNCwgMHgwMDAwNDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDAwNTAwLCAweDAwMDEwMDAxKTsKK30KKworc3RhdGljIHZvaWQKK252NTBfZ3JhcGhfaW5pdF9yZWdzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJTlZfREVCVUcoZGV2LCAiXG4iKTsKKworCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9ERUJVR18zLAorCQkJCSgxIDw8IDIpIC8qIEhXX0NPTlRFWFRfU1dJVENIX0VOQUJMRUQgKi8pOworCW52X3dyMzIoZGV2LCAweDQwMmNhOCwgMHg4MDApOworfQorCitzdGF0aWMgaW50CitudjUwX2dyYXBoX2luaXRfY3R4Y3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJTlZfREVCVUcoZGV2LCAiXG4iKTsKKworCW52NDBfZ3JjdHhfaW5pdChkZXYpOworCisJbnZfd3IzMihkZXYsIDB4NDAwMzIwLCA0KTsKKwludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfQ1RYQ1RMX0NVUiwgMCk7CisJbnZfd3IzMihkZXYsIE5WMjBfUEdSQVBIX0NIQU5ORUxfQ1RYX1BPSU5URVIsIDApOworCXJldHVybiAwOworfQorCitpbnQKK252NTBfZ3JhcGhfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCWludCByZXQ7CisKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCisJbnY1MF9ncmFwaF9pbml0X3Jlc2V0KGRldik7CisJbnY1MF9ncmFwaF9pbml0X3JlZ3NfX252KGRldik7CisJbnY1MF9ncmFwaF9pbml0X3JlZ3MoZGV2KTsKKwludjUwX2dyYXBoX2luaXRfaW50cihkZXYpOworCisJcmV0ID0gbnY1MF9ncmFwaF9pbml0X2N0eGN0bChkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbnY1MF9ncmFwaF90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCU5WX0RFQlVHKGRldiwgIlxuIik7CisJbnY0MF9ncmN0eF9maW5pKGRldik7Cit9CisKK3ZvaWQKK252NTBfZ3JhcGhfZmlmb19hY2Nlc3Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgYm9vbCBlbmFibGVkKQoreworCWNvbnN0IHVpbnQzMl90IG1hc2sgPSAweDAwMDEwMDAxOworCisJaWYgKGVuYWJsZWQpCisJCW52X3dyMzIoZGV2LCAweDQwMDUwMCwgbnZfcmQzMihkZXYsIDB4NDAwNTAwKSB8IG1hc2spOworCWVsc2UKKwkJbnZfd3IzMihkZXYsIDB4NDAwNTAwLCBudl9yZDMyKGRldiwgMHg0MDA1MDApICYgfm1hc2spOworfQorCitzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICoKK252NTBfZ3JhcGhfY2hhbm5lbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdWludDMyX3QgaW5zdDsKKwlpbnQgaTsKKworCWluc3QgPSBudl9yZDMyKGRldiwgTlY1MF9QR1JBUEhfQ1RYQ1RMX0NVUik7CisJaWYgKCEoaW5zdCAmIE5WNTBfUEdSQVBIX0NUWENUTF9DVVJfTE9BREVEKSkKKwkJcmV0dXJuIE5VTEw7CisJaW5zdCA9IChpbnN0ICYgTlY1MF9QR1JBUEhfQ1RYQ1RMX0NVUl9JTlNUQU5DRSkgPDwgMTI7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzOyBpKyspIHsKKwkJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IGRldl9wcml2LT5maWZvc1tpXTsKKworCQlpZiAoY2hhbiAmJiBjaGFuLT5yYW1pbiAmJiBjaGFuLT5yYW1pbi0+aW5zdGFuY2UgPT0gaW5zdCkKKwkJCXJldHVybiBjaGFuOworCX0KKworCXJldHVybiBOVUxMOworfQorCitpbnQKK252NTBfZ3JhcGhfY3JlYXRlX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpyYW1pbiA9IGNoYW4tPnJhbWluLT5ncHVvYmo7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpjdHg7CisJdWludDMyX3QgZ3JjdHhfc2l6ZSA9IDB4NzAwMDA7CisJaW50IGhkciwgcmV0OworCisJTlZfREVCVUcoZGV2LCAiY2glZFxuIiwgY2hhbi0+aWQpOworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3X3JlZihkZXYsIGNoYW4sIE5VTEwsIDAsIGdyY3R4X3NpemUsIDB4MTAwMCwKKwkJCQkgICAgIE5WT0JKX0ZMQUdfWkVST19BTExPQyB8CisJCQkJICAgICBOVk9CSl9GTEFHX1pFUk9fRlJFRSwgJmNoYW4tPnJhbWluX2dyY3R4KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWN0eCA9IGNoYW4tPnJhbWluX2dyY3R4LT5ncHVvYmo7CisKKwloZHIgPSBJU19HODAgPyAweDIwMCA6IDB4MjA7CisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgdHJ1ZSk7CisJbnZfd28zMihkZXYsIHJhbWluLCAoaGRyICsgMHgwMCkvNCwgMHgwMDE5MDAwMik7CisJbnZfd28zMihkZXYsIHJhbWluLCAoaGRyICsgMHgwNCkvNCwgY2hhbi0+cmFtaW5fZ3JjdHgtPmluc3RhbmNlICsKKwkJCQkJICAgZ3JjdHhfc2l6ZSAtIDEpOworCW52X3dvMzIoZGV2LCByYW1pbiwgKGhkciArIDB4MDgpLzQsIGNoYW4tPnJhbWluX2dyY3R4LT5pbnN0YW5jZSk7CisJbnZfd28zMihkZXYsIHJhbWluLCAoaGRyICsgMHgwYykvNCwgMCk7CisJbnZfd28zMihkZXYsIHJhbWluLCAoaGRyICsgMHgxMCkvNCwgMCk7CisJbnZfd28zMihkZXYsIHJhbWluLCAoaGRyICsgMHgxNCkvNCwgMHgwMDAxMDAwMCk7CisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKKworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOworCW52NDBfZ3JjdHhfdmFsc19sb2FkKGRldiwgY3R4KTsKKwludl93bzMyKGRldiwgY3R4LCAweDAwMDAwLzQsIGNoYW4tPnJhbWluLT5pbnN0YW5jZSA+PiAxMik7CisJaWYgKChkZXZfcHJpdi0+Y2hpcHNldCAmIDB4ZjApID09IDB4YTApCisJCW52X3dvMzIoZGV2LCBjdHgsIDB4MDAwMDQvNCwgMHgwMDAwMDAwMCk7CisJZWxzZQorCQludl93bzMyKGRldiwgY3R4LCAweDAwMTFjLzQsIDB4MDAwMDAwMDApOworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbnY1MF9ncmFwaF9kZXN0cm95X2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGksIGhkciA9IElTX0c4MCA/IDB4MjAwIDogMHgyMDsKKworCU5WX0RFQlVHKGRldiwgImNoJWRcbiIsIGNoYW4tPmlkKTsKKworCWlmICghY2hhbi0+cmFtaW4gfHwgIWNoYW4tPnJhbWluLT5ncHVvYmopCisJCXJldHVybjsKKworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOworCWZvciAoaSA9IGhkcjsgaSA8IGhkciArIDI0OyBpICs9IDQpCisJCW52X3dvMzIoZGV2LCBjaGFuLT5yYW1pbi0+Z3B1b2JqLCBpLzQsIDApOworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisKKwlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGRldiwgJmNoYW4tPnJhbWluX2dyY3R4KTsKK30KKworc3RhdGljIGludAorbnY1MF9ncmFwaF9kb19sb2FkX2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgaW5zdCkKK3sKKwl1aW50MzJfdCBmaWZvID0gbnZfcmQzMihkZXYsIDB4NDAwNTAwKTsKKworCW52X3dyMzIoZGV2LCAweDQwMDUwMCwgZmlmbyAmIH4xKTsKKwludl93cjMyKGRldiwgMHg0MDA3ODQsIGluc3QpOworCW52X3dyMzIoZGV2LCAweDQwMDgyNCwgbnZfcmQzMihkZXYsIDB4NDAwODI0KSB8IDB4NDApOworCW52X3dyMzIoZGV2LCAweDQwMDMyMCwgbnZfcmQzMihkZXYsIDB4NDAwMzIwKSB8IDB4MTEpOworCW52X3dyMzIoZGV2LCAweDQwMDA0MCwgMHhmZmZmZmZmZik7CisJKHZvaWQpbnZfcmQzMihkZXYsIDB4NDAwMDQwKTsKKwludl93cjMyKGRldiwgMHg0MDAwNDAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwMDMwNCwgbnZfcmQzMihkZXYsIDB4NDAwMzA0KSB8IDEpOworCisJaWYgKG5vdXZlYXVfd2FpdF9mb3JfaWRsZShkZXYpKQorCQludl93cjMyKGRldiwgMHg0MDAzMmMsIGluc3QgfCAoMTw8MzEpKTsKKwludl93cjMyKGRldiwgMHg0MDA1MDAsIGZpZm8pOworCisJcmV0dXJuIDA7Cit9CisKK2ludAorbnY1MF9ncmFwaF9sb2FkX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwl1aW50MzJfdCBpbnN0ID0gY2hhbi0+cmFtaW4tPmluc3RhbmNlID4+IDEyOworCisJTlZfREVCVUcoY2hhbi0+ZGV2LCAiY2glZFxuIiwgY2hhbi0+aWQpOworCXJldHVybiBudjUwX2dyYXBoX2RvX2xvYWRfY29udGV4dChjaGFuLT5kZXYsIGluc3QpOworfQorCitpbnQKK252NTBfZ3JhcGhfdW5sb2FkX2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwl1aW50MzJfdCBpbnN0LCBmaWZvID0gbnZfcmQzMihkZXYsIDB4NDAwNTAwKTsKKworCWluc3QgID0gbnZfcmQzMihkZXYsIE5WNTBfUEdSQVBIX0NUWENUTF9DVVIpOworCWlmICghKGluc3QgJiBOVjUwX1BHUkFQSF9DVFhDVExfQ1VSX0xPQURFRCkpCisJCXJldHVybiAwOworCWluc3QgJj0gTlY1MF9QR1JBUEhfQ1RYQ1RMX0NVUl9JTlNUQU5DRTsKKworCW52X3dyMzIoZGV2LCAweDQwMDUwMCwgZmlmbyAmIH4xKTsKKwludl93cjMyKGRldiwgMHg0MDA3ODQsIGluc3QpOworCW52X3dyMzIoZGV2LCAweDQwMDgyNCwgbnZfcmQzMihkZXYsIDB4NDAwODI0KSB8IDB4MjApOworCW52X3dyMzIoZGV2LCAweDQwMDMwNCwgbnZfcmQzMihkZXYsIDB4NDAwMzA0KSB8IDB4MDEpOworCW5vdXZlYXVfd2FpdF9mb3JfaWRsZShkZXYpOworCW52X3dyMzIoZGV2LCAweDQwMDUwMCwgZmlmbyk7CisKKwludl93cjMyKGRldiwgTlY1MF9QR1JBUEhfQ1RYQ1RMX0NVUiwgaW5zdCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK252NTBfZ3JhcGhfY29udGV4dF9zd2l0Y2goc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwl1aW50MzJfdCBpbnN0OworCisJbnY1MF9ncmFwaF91bmxvYWRfY29udGV4dChkZXYpOworCisJaW5zdCAgPSBudl9yZDMyKGRldiwgTlY1MF9QR1JBUEhfQ1RYQ1RMX05FWFQpOworCWluc3QgJj0gTlY1MF9QR1JBUEhfQ1RYQ1RMX05FWFRfSU5TVEFOQ0U7CisJbnY1MF9ncmFwaF9kb19sb2FkX2NvbnRleHQoZGV2LCBpbnN0KTsKKworCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9JTlRSX0VOLCBudl9yZDMyKGRldiwKKwkJTlY0MF9QR1JBUEhfSU5UUl9FTikgfCBOVl9QR1JBUEhfSU5UUl9DT05URVhUX1NXSVRDSCk7Cit9CisKK3N0YXRpYyBpbnQKK252NTBfZ3JhcGhfbnZzd19kbWFfdmJsc2VtKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBncmNsYXNzLAorCQkJICAgaW50IG10aGQsIHVpbnQzMl90IGRhdGEpCit7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiAqcmVmID0gTlVMTDsKKworCWlmIChub3V2ZWF1X2dwdW9ial9yZWZfZmluZChjaGFuLCBkYXRhLCAmcmVmKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlpZiAobm91dmVhdV9ub3RpZmllcl9vZmZzZXQocmVmLT5ncHVvYmosIE5VTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNoYW4tPm52c3cudmJsc2VtID0gcmVmLT5ncHVvYmo7CisJY2hhbi0+bnZzdy52YmxzZW1fb2Zmc2V0ID0gfjA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK252NTBfZ3JhcGhfbnZzd192YmxzZW1fb2Zmc2V0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBncmNsYXNzLAorCQkJICAgICAgaW50IG10aGQsIHVpbnQzMl90IGRhdGEpCit7CisJaWYgKG5vdXZlYXVfbm90aWZpZXJfb2Zmc2V0KGNoYW4tPm52c3cudmJsc2VtLCAmZGF0YSkpCisJCXJldHVybiAtRVJBTkdFOworCisJY2hhbi0+bnZzdy52YmxzZW1fb2Zmc2V0ID0gZGF0YSA+PiAyOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitudjUwX2dyYXBoX252c3dfdmJsc2VtX3JlbGVhc2VfdmFsKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBncmNsYXNzLAorCQkJCSAgIGludCBtdGhkLCB1aW50MzJfdCBkYXRhKQoreworCWNoYW4tPm52c3cudmJsc2VtX3J2YWwgPSBkYXRhOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitudjUwX2dyYXBoX252c3dfdmJsc2VtX3JlbGVhc2Uoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGdyY2xhc3MsCisJCQkgICAgICAgaW50IG10aGQsIHVpbnQzMl90IGRhdGEpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKCFjaGFuLT5udnN3LnZibHNlbSB8fCBjaGFuLT5udnN3LnZibHNlbV9vZmZzZXQgPT0gfjAgfHwgZGF0YSA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCEobnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfSU5UUl9FTikgJgorCQkgICAgICBOVjUwX1BESVNQTEFZX0lOVFJfRU5fVkJMQU5LX0NSVENfKGRhdGEpKSkgeworCQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSXzEsCisJCQlOVjUwX1BESVNQTEFZX0lOVFJfMV9WQkxBTktfQ1JUQ18oZGF0YSkpOworCQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSX0VOLCBudl9yZDMyKGRldiwKKwkJCU5WNTBfUERJU1BMQVlfSU5UUl9FTikgfAorCQkJTlY1MF9QRElTUExBWV9JTlRSX0VOX1ZCTEFOS19DUlRDXyhkYXRhKSk7CisJfQorCisJbGlzdF9hZGQoJmNoYW4tPm52c3cudmJsX3dhaXQsICZkZXZfcHJpdi0+dmJsX3dhaXRpbmcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9tZXRob2QgbnY1MF9ncmFwaF9udnN3X21ldGhvZHNbXSA9IHsKKwl7IDB4MDE4YywgbnY1MF9ncmFwaF9udnN3X2RtYV92YmxzZW0gfSwKKwl7IDB4MDQwMCwgbnY1MF9ncmFwaF9udnN3X3ZibHNlbV9vZmZzZXQgfSwKKwl7IDB4MDQwNCwgbnY1MF9ncmFwaF9udnN3X3ZibHNlbV9yZWxlYXNlX3ZhbCB9LAorCXsgMHgwNDA4LCBudjUwX2dyYXBoX252c3dfdmJsc2VtX3JlbGVhc2UgfSwKKwl7fQorfTsKKworc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9jbGFzcyBudjUwX2dyYXBoX2dyY2xhc3NbXSA9IHsKKwl7IDB4NTA2ZSwgdHJ1ZSwgbnY1MF9ncmFwaF9udnN3X21ldGhvZHMgfSwgLyogbnZzdyAqLworCXsgMHgwMDMwLCBmYWxzZSwgTlVMTCB9LCAvKiBudWxsICovCisJeyAweDUwMzksIGZhbHNlLCBOVUxMIH0sIC8qIG0ybWYgKi8KKwl7IDB4NTAyZCwgZmFsc2UsIE5VTEwgfSwgLyogMmQgKi8KKwl7IDB4NTBjMCwgZmFsc2UsIE5VTEwgfSwgLyogY29tcHV0ZSAqLworCXsgMHg1MDk3LCBmYWxzZSwgTlVMTCB9LCAvKiB0ZXNsYSAobnY1MCkgKi8KKwl7IDB4ODI5NywgZmFsc2UsIE5VTEwgfSwgLyogdGVzbGEgKG52ODAvbnY5MCkgKi8KKwl7IDB4ODM5NywgZmFsc2UsIE5VTEwgfSwgLyogdGVzbGEgKG52YTApICovCisJeyAweDg1OTcsIGZhbHNlLCBOVUxMIH0sIC8qIHRlc2xhIChudmE4KSAqLworCXt9Cit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9pbnN0bWVtLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2luc3RtZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDQwMGY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9pbnN0bWVtLmMKQEAgLTAsMCArMSw1MDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQmVuIFNrZWdncy4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisKK3N0cnVjdCBudjUwX2luc3RtZW1fcHJpdiB7CisJdWludDMyX3Qgc2F2ZTE3MDBbNV07IC8qIDB4MTcwMC0+MHgxNzEwICovCisKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfcmVmICpwcmFtaW5fcHQ7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqX3JlZiAqcHJhbWluX2JhcjsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfcmVmICpmYl9iYXI7CisKKwlib29sIGxhc3RfYWNjZXNzX3dyOworfTsKKworI2RlZmluZSBOVjUwX0lOU1RNRU1fUEFHRV9TSElGVCAxMgorI2RlZmluZSBOVjUwX0lOU1RNRU1fUEFHRV9TSVpFICAoMSA8PCBOVjUwX0lOU1RNRU1fUEFHRV9TSElGVCkKKyNkZWZpbmUgTlY1MF9JTlNUTUVNX1BUX1NJWkUoYSkJKCgoYSkgPj4gMTIpIDw8IDMpCisKKy8qTk9URTogLSBBc3N1bWVzIDB4MTcwMCBhbHJlYWR5IGNvdmVycyB0aGUgY29ycmVjdCBNaUIgb2YgUFJBTUlOCisgKi8KKyNkZWZpbmUgQkFSMF9XSTMyKGcsIG8sIHYpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl1aW50MzJfdCBvZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmICgoZyktPmltX2JhY2tpbmcpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCW9mZnNldCA9IChnKS0+aW1fYmFja2luZ19zdGFydDsgICAgICAgICAgICAgICAgICAgXAorCX0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCW9mZnNldCAgPSBjaGFuLT5yYW1pbi0+Z3B1b2JqLT5pbV9iYWNraW5nX3N0YXJ0OyAgXAorCQlvZmZzZXQgKz0gKGcpLT5pbV9wcmFtaW4tPnN0YXJ0OyAgICAgICAgICAgICAgICAgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCW9mZnNldCArPSAobyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJbnZfd3IzMihkZXYsIE5WX1JBTUlOICsgKG9mZnNldCAmIDB4ZmZmZmYpLCAodikpOyAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworaW50CitudjUwX2luc3RtZW1faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbjsKKwl1aW50MzJfdCBjX29mZnNldCwgY19zaXplLCBjX3JhbWZjLCBjX3ZtcGQsIGNfYmFzZSwgcHRfc2l6ZTsKKwlzdHJ1Y3QgbnY1MF9pbnN0bWVtX3ByaXYgKnByaXY7CisJaW50IHJldCwgaTsKKwl1aW50MzJfdCB2LCBzYXZlX252MDAxNzAwOworCisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJpdiA9IHByaXY7CisKKwkvKiBTYXZlIHN0YXRlLCB3aWxsIHJlc3RvcmUgYXQgdGFrZWRvd24uICovCisJZm9yIChpID0gMHgxNzAwOyBpIDw9IDB4MTcxMDsgaSArPSA0KQorCQlwcml2LT5zYXZlMTcwMFsoaS0weDE3MDApLzRdID0gbnZfcmQzMihkZXYsIGkpOworCisJLyogUmVzZXJ2ZSB0aGUgbGFzdCBNaUIgb2YgVlJBTSwgd2Ugc2hvdWxkIHByb2JhYmx5IHRyeSB0byBhdm9pZAorCSAqIHNldHRpbmcgdXAgdGhlIGJlbG93IHRhYmxlcyBvdmVyIHRoZSB0b3Agb2YgdGhlIFZCSU9TIGltYWdlIGF0CisJICogc29tZSBwb2ludC4KKwkgKi8KKwlkZXZfcHJpdi0+cmFtaW5fcnN2ZF92cmFtID0gMSA8PCAyMDsKKwljX29mZnNldCA9IG5vdXZlYXVfbWVtX2ZiX2Ftb3VudChkZXYpIC0gZGV2X3ByaXYtPnJhbWluX3JzdmRfdnJhbTsKKwljX3NpemUgICA9IDEyOCA8PCAxMDsKKwljX3ZtcGQgICA9ICgoZGV2X3ByaXYtPmNoaXBzZXQgJiAweGYwKSA9PSAweDUwKSA/IDB4MTQwMCA6IDB4MjAwOworCWNfcmFtZmMgID0gKChkZXZfcHJpdi0+Y2hpcHNldCAmIDB4ZjApID09IDB4NTApID8gMHgwIDogMHgyMDsKKwljX2Jhc2UgICA9IGNfdm1wZCArIDB4NDAwMDsKKwlwdF9zaXplICA9IE5WNTBfSU5TVE1FTV9QVF9TSVpFKGRldl9wcml2LT5yYW1pbl9zaXplKTsKKworCU5WX0RFQlVHKGRldiwgIiBSc3ZkIFZSQU0gYmFzZTogMHglMDh4XG4iLCBjX29mZnNldCk7CisJTlZfREVCVUcoZGV2LCAiICAgIFZCSU9TIGltYWdlOiAweCUwOHhcbiIsCisJCQkJKG52X3JkMzIoZGV2LCAweDYxOWYwNCkgJiB+MHhmZikgPDwgOCk7CisJTlZfREVCVUcoZGV2LCAiICBBcGVydHVyZSBzaXplOiAlZCBNaUJcbiIsIGRldl9wcml2LT5yYW1pbl9zaXplID4+IDIwKTsKKwlOVl9ERUJVRyhkZXYsICIgICAgICAgIFBUIHNpemU6ICVkIEtpQlxuIiwgcHRfc2l6ZSA+PiAxMCk7CisKKwkvKiBEZXRlcm1pbmUgVk0gbGF5b3V0LCB3ZSBuZWVkIHRvIGRvIHRoaXMgZmlyc3QgdG8gbWFrZSBzdXJlCisJICogd2UgYWxsb2NhdGUgZW5vdWdoIG1lbW9yeSBmb3IgYWxsIHRoZSBwYWdlIHRhYmxlcy4KKwkgKi8KKwlkZXZfcHJpdi0+dm1fZ2FydF9iYXNlID0gcm91bmR1cChOVjUwX1ZNX0JMT0NLLCBOVjUwX1ZNX0JMT0NLKTsKKwlkZXZfcHJpdi0+dm1fZ2FydF9zaXplID0gTlY1MF9WTV9CTE9DSzsKKworCWRldl9wcml2LT52bV92cmFtX2Jhc2UgPSBkZXZfcHJpdi0+dm1fZ2FydF9iYXNlICsgZGV2X3ByaXYtPnZtX2dhcnRfc2l6ZTsKKwlkZXZfcHJpdi0+dm1fdnJhbV9zaXplID0gbm91dmVhdV9tZW1fZmJfYW1vdW50KGRldik7CisJaWYgKGRldl9wcml2LT52bV92cmFtX3NpemUgPiBOVjUwX1ZNX01BWF9WUkFNKQorCQlkZXZfcHJpdi0+dm1fdnJhbV9zaXplID0gTlY1MF9WTV9NQVhfVlJBTTsKKwlkZXZfcHJpdi0+dm1fdnJhbV9zaXplID0gcm91bmR1cChkZXZfcHJpdi0+dm1fdnJhbV9zaXplLCBOVjUwX1ZNX0JMT0NLKTsKKwlkZXZfcHJpdi0+dm1fdnJhbV9wdF9uciA9IGRldl9wcml2LT52bV92cmFtX3NpemUgLyBOVjUwX1ZNX0JMT0NLOworCisJZGV2X3ByaXYtPnZtX2VuZCA9IGRldl9wcml2LT52bV92cmFtX2Jhc2UgKyBkZXZfcHJpdi0+dm1fdnJhbV9zaXplOworCisJTlZfREVCVUcoZGV2LCAiTlY1MFZNOiBHQVJUIDB4JTAxNmxseC0weCUwMTZsbHhcbiIsCisJCSBkZXZfcHJpdi0+dm1fZ2FydF9iYXNlLAorCQkgZGV2X3ByaXYtPnZtX2dhcnRfYmFzZSArIGRldl9wcml2LT52bV9nYXJ0X3NpemUgLSAxKTsKKwlOVl9ERUJVRyhkZXYsICJOVjUwVk06IFZSQU0gMHglMDE2bGx4LTB4JTAxNmxseFxuIiwKKwkJIGRldl9wcml2LT52bV92cmFtX2Jhc2UsCisJCSBkZXZfcHJpdi0+dm1fdnJhbV9iYXNlICsgZGV2X3ByaXYtPnZtX3ZyYW1fc2l6ZSAtIDEpOworCisJY19zaXplICs9IGRldl9wcml2LT52bV92cmFtX3B0X25yICogKE5WNTBfVk1fQkxPQ0sgLyA2NTUzNiAqIDgpOworCisJLyogTWFwIEJBUjAgUFJBTUlOIGFwZXJ0dXJlIG92ZXIgdGhlIG1lbW9yeSB3ZSB3YW50IHRvIHVzZSAqLworCXNhdmVfbnYwMDE3MDAgPSBudl9yZDMyKGRldiwgTlY1MF9QVU5LX0JBUjBfUFJBTUlOKTsKKwludl93cjMyKGRldiwgTlY1MF9QVU5LX0JBUjBfUFJBTUlOLCAoY19vZmZzZXQgPj4gMTYpKTsKKworCS8qIENyZWF0ZSBhIGZha2UgY2hhbm5lbCwgYW5kIHVzZSBpdCBhcyBvdXIgImR1bW15IiBjaGFubmVscyAwLzEyNy4KKwkgKiBUaGUgbWFpbiByZWFzb24gZm9yIGNyZWF0aW5nIGEgY2hhbm5lbCBpcyBzbyB3ZSBjYW4gdXNlIHRoZSBncHVvYmoKKwkgKiBjb2RlLiAgSG93ZXZlciwgaXQncyBwcm9iYWJseSB3b3J0aCBub3RpbmcgdGhhdCBOVklESUEgYWxzbyBzZXR1cAorCSAqIHRoZWlyIGNoYW5uZWxzIDAvMTI3IHdpdGggdGhlIHNhbWUgdmFsdWVzIHRoZXkgY29uZmlndXJlIGhlcmUuCisJICogU28sIHRoZXJlIG1heSBiZSBzb21lIG90aGVyIHJlYXNvbiBmb3IgZG9pbmcgdGhpcy4KKwkgKgorCSAqIEhhdmUgdG8gY3JlYXRlIHRoZSBlbnRpcmUgY2hhbm5lbCBtYW51YWxseSwgYXMgdGhlIHJlYWwgY2hhbm5lbAorCSAqIGNyZWF0aW9uIGNvZGUgYXNzdW1lcyB3ZSBoYXZlIFBSQU1JTiBhY2Nlc3MsIGFuZCB3ZSBkb24ndCB1bnRpbAorCSAqIHdlJ3JlIGRvbmUgaGVyZS4KKwkgKi8KKwljaGFuID0ga3phbGxvYyhzaXplb2YoKmNoYW4pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoYW4pCisJCXJldHVybiAtRU5PTUVNOworCWNoYW4tPmlkID0gMDsKKwljaGFuLT5kZXYgPSBkZXY7CisJY2hhbi0+ZmlsZV9wcml2ID0gKHN0cnVjdCBkcm1fZmlsZSAqKS0yOworCWRldl9wcml2LT5maWZvc1swXSA9IGRldl9wcml2LT5maWZvc1sxMjddID0gY2hhbjsKKworCS8qIENoYW5uZWwncyBQUkFNSU4gb2JqZWN0ICsgaGVhcCAqLworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ld19mYWtlKGRldiwgMCwgY19vZmZzZXQsIGNfc2l6ZSwgMCwKKwkJCQkJCQlOVUxMLCAmY2hhbi0+cmFtaW4pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAobm91dmVhdV9tZW1faW5pdF9oZWFwKCZjaGFuLT5yYW1pbl9oZWFwLCBjX2Jhc2UsIGNfc2l6ZSAtIGNfYmFzZSkpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogUkFNRkMgKyB6ZXJvIGNoYW5uZWwncyBQUkFNSU4gdXAgdG8gc3RhcnQgb2YgVk0gcGFnZWRpciAqLworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ld19mYWtlKGRldiwgY19yYW1mYywgY19vZmZzZXQgKyBjX3JhbWZjLAorCQkJCQkJMHg0MDAwLCAwLCBOVUxMLCAmY2hhbi0+cmFtZmMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgY192bXBkOyBpICs9IDQpCisJCUJBUjBfV0kzMihjaGFuLT5yYW1pbi0+Z3B1b2JqLCBpLCAwKTsKKworCS8qIFZNIHBhZ2UgZGlyZWN0b3J5ICovCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3X2Zha2UoZGV2LCBjX3ZtcGQsIGNfb2Zmc2V0ICsgY192bXBkLAorCQkJCQkgICAweDQwMDAsIDAsICZjaGFuLT52bV9wZCwgTlVMTCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlmb3IgKGkgPSAwOyBpIDwgMHg0MDAwOyBpICs9IDgpIHsKKwkJQkFSMF9XSTMyKGNoYW4tPnZtX3BkLCBpICsgMHgwMCwgMHgwMDAwMDAwMCk7CisJCUJBUjBfV0kzMihjaGFuLT52bV9wZCwgaSArIDB4MDQsIDB4MDAwMDAwMDApOworCX0KKworCS8qIFBSQU1JTiBwYWdlIHRhYmxlLCBjaGVhdCBhbmQgbWFwIGludG8gVk0gYXQgMHgwMDAwMDAwMDAwLgorCSAqIFdlIG1hcCB0aGUgZW50aXJlIGZha2UgY2hhbm5lbCBpbnRvIHRoZSBzdGFydCBvZiB0aGUgUFJBTUlOIEJBUgorCSAqLworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ld19yZWYoZGV2LCBjaGFuLCBOVUxMLCAwLCBwdF9zaXplLCAweDEwMDAsCisJCQkJCQkJMCwgJnByaXYtPnByYW1pbl9wdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWZvciAoaSA9IDAsIHYgPSBjX29mZnNldDsgaSA8IHB0X3NpemU7IGkgKz0gOCwgdiArPSAweDEwMDApIHsKKwkJaWYgKHYgPCAoY19vZmZzZXQgKyBjX3NpemUpKQorCQkJQkFSMF9XSTMyKHByaXYtPnByYW1pbl9wdC0+Z3B1b2JqLCBpICsgMCwgdiB8IDEpOworCQllbHNlCisJCQlCQVIwX1dJMzIocHJpdi0+cHJhbWluX3B0LT5ncHVvYmosIGkgKyAwLCAweDAwMDAwMDA5KTsKKwkJQkFSMF9XSTMyKHByaXYtPnByYW1pbl9wdC0+Z3B1b2JqLCBpICsgNCwgMHgwMDAwMDAwMCk7CisJfQorCisJQkFSMF9XSTMyKGNoYW4tPnZtX3BkLCAweDAwLCBwcml2LT5wcmFtaW5fcHQtPmluc3RhbmNlIHwgMHg2Myk7CisJQkFSMF9XSTMyKGNoYW4tPnZtX3BkLCAweDA0LCAweDAwMDAwMDAwKTsKKworCS8qIFZSQU0gcGFnZSB0YWJsZShzKSwgbWFwcGVkIGludG8gVk0gYXQgKzFHaUIgICovCisJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT52bV92cmFtX3B0X25yOyBpKyspIHsKKwkJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3X3JlZihkZXYsIGNoYW4sIE5VTEwsIDAsCisJCQkJCSAgICAgTlY1MF9WTV9CTE9DSy82NTUzNio4LCAwLCAwLAorCQkJCQkgICAgICZjaGFuLT52bV92cmFtX3B0W2ldKTsKKwkJaWYgKHJldCkgeworCQkJTlZfRVJST1IoZGV2LCAiRXJyb3IgY3JlYXRpbmcgVlJBTSBwYWdlIHRhYmxlczogJWRcbiIsCisJCQkJCQkJCQlyZXQpOworCQkJZGV2X3ByaXYtPnZtX3ZyYW1fcHRfbnIgPSBpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlkZXZfcHJpdi0+dm1fdnJhbV9wdFtpXSA9IGNoYW4tPnZtX3ZyYW1fcHRbaV0tPmdwdW9iajsKKworCQlmb3IgKHYgPSAwOyB2IDwgZGV2X3ByaXYtPnZtX3ZyYW1fcHRbaV0tPmltX3ByYW1pbi0+c2l6ZTsKKwkJCQkJCQkJdiArPSA0KQorCQkJQkFSMF9XSTMyKGRldl9wcml2LT52bV92cmFtX3B0W2ldLCB2LCAwKTsKKworCQlCQVIwX1dJMzIoY2hhbi0+dm1fcGQsIDB4MTAgKyAoaSo4KSwKKwkJCSAgY2hhbi0+dm1fdnJhbV9wdFtpXS0+aW5zdGFuY2UgfCAweDYxKTsKKwkJQkFSMF9XSTMyKGNoYW4tPnZtX3BkLCAweDE0ICsgKGkqOCksIDApOworCX0KKworCS8qIERNQSBvYmplY3QgZm9yIFBSQU1JTiBCQVIgKi8KKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXdfcmVmKGRldiwgY2hhbiwgY2hhbiwgMCwgNio0LCAxNiwgMCwKKwkJCQkJCQkmcHJpdi0+cHJhbWluX2Jhcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlCQVIwX1dJMzIocHJpdi0+cHJhbWluX2Jhci0+Z3B1b2JqLCAweDAwLCAweDdmYzAwMDAwKTsKKwlCQVIwX1dJMzIocHJpdi0+cHJhbWluX2Jhci0+Z3B1b2JqLCAweDA0LCBkZXZfcHJpdi0+cmFtaW5fc2l6ZSAtIDEpOworCUJBUjBfV0kzMihwcml2LT5wcmFtaW5fYmFyLT5ncHVvYmosIDB4MDgsIDB4MDAwMDAwMDApOworCUJBUjBfV0kzMihwcml2LT5wcmFtaW5fYmFyLT5ncHVvYmosIDB4MGMsIDB4MDAwMDAwMDApOworCUJBUjBfV0kzMihwcml2LT5wcmFtaW5fYmFyLT5ncHVvYmosIDB4MTAsIDB4MDAwMDAwMDApOworCUJBUjBfV0kzMihwcml2LT5wcmFtaW5fYmFyLT5ncHVvYmosIDB4MTQsIDB4MDAwMDAwMDApOworCisJLyogRE1BIG9iamVjdCBmb3IgRkIgQkFSICovCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3X3JlZihkZXYsIGNoYW4sIGNoYW4sIDAsIDYqNCwgMTYsIDAsCisJCQkJCQkJJnByaXYtPmZiX2Jhcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlCQVIwX1dJMzIocHJpdi0+ZmJfYmFyLT5ncHVvYmosIDB4MDAsIDB4N2ZjMDAwMDApOworCUJBUjBfV0kzMihwcml2LT5mYl9iYXItPmdwdW9iaiwgMHgwNCwgMHg0MDAwMDAwMCArCisJCQkJCSAgICAgIGRybV9nZXRfcmVzb3VyY2VfbGVuKGRldiwgMSkgLSAxKTsKKwlCQVIwX1dJMzIocHJpdi0+ZmJfYmFyLT5ncHVvYmosIDB4MDgsIDB4NDAwMDAwMDApOworCUJBUjBfV0kzMihwcml2LT5mYl9iYXItPmdwdW9iaiwgMHgwYywgMHgwMDAwMDAwMCk7CisJQkFSMF9XSTMyKHByaXYtPmZiX2Jhci0+Z3B1b2JqLCAweDEwLCAweDAwMDAwMDAwKTsKKwlCQVIwX1dJMzIocHJpdi0+ZmJfYmFyLT5ncHVvYmosIDB4MTQsIDB4MDAwMDAwMDApOworCisJLyogUG9rZSB0aGUgcmVsZXZhbnQgcmVncywgYW5kIHByYXkgaXQgd29ya3MgOikgKi8KKwludl93cjMyKGRldiwgTlY1MF9QVU5LX0JBUl9DRkdfQkFTRSwgKGNoYW4tPnJhbWluLT5pbnN0YW5jZSA+PiAxMikpOworCW52X3dyMzIoZGV2LCBOVjUwX1BVTktfVU5LMTcxMCwgMCk7CisJbnZfd3IzMihkZXYsIE5WNTBfUFVOS19CQVJfQ0ZHX0JBU0UsIChjaGFuLT5yYW1pbi0+aW5zdGFuY2UgPj4gMTIpIHwKKwkJCQkJIE5WNTBfUFVOS19CQVJfQ0ZHX0JBU0VfVkFMSUQpOworCW52X3dyMzIoZGV2LCBOVjUwX1BVTktfQkFSMV9DVFhETUEsIChwcml2LT5mYl9iYXItPmluc3RhbmNlID4+IDQpIHwKKwkJCQkJTlY1MF9QVU5LX0JBUjFfQ1RYRE1BX1ZBTElEKTsKKwludl93cjMyKGRldiwgTlY1MF9QVU5LX0JBUjNfQ1RYRE1BLCAocHJpdi0+cHJhbWluX2Jhci0+aW5zdGFuY2UgPj4gNCkgfAorCQkJCQlOVjUwX1BVTktfQkFSM19DVFhETUFfVkFMSUQpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJbnZfd3IzMihkZXYsIDB4MTkwMCArIChpKjQpLCAwKTsKKworCS8qIEFzc3VtZSB0aGF0IHByYXlpbmcgaXNuJ3QgZW5vdWdoLCBjaGVjayB0aGF0IHdlIGNhbiByZS1yZWFkIHRoZQorCSAqIGVudGlyZSBmYWtlIGNoYW5uZWwgYmFjayBmcm9tIHRoZSBQUkFNSU4gQkFSICovCisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByZXBhcmVfYWNjZXNzKGRldiwgZmFsc2UpOworCWZvciAoaSA9IDA7IGkgPCBjX3NpemU7IGkgKz0gNCkgeworCQlpZiAobnZfcmQzMihkZXYsIE5WX1JBTUlOICsgaSkgIT0gbnZfcmkzMihkZXYsIGkpKSB7CisJCQlOVl9FUlJPUihkZXYsICJFcnJvciByZWFkaW5nIGJhY2sgUFJBTUlOIGF0IDB4JTA4eFxuIiwKKwkJCQkJCQkJCWkpOworCQkJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZpbmlzaF9hY2Nlc3MoZGV2KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisKKwludl93cjMyKGRldiwgTlY1MF9QVU5LX0JBUjBfUFJBTUlOLCBzYXZlX252MDAxNzAwKTsKKworCS8qIEdsb2JhbCBQUkFNSU4gaGVhcCAqLworCWlmIChub3V2ZWF1X21lbV9pbml0X2hlYXAoJmRldl9wcml2LT5yYW1pbl9oZWFwLAorCQkJCSAgY19zaXplLCBkZXZfcHJpdi0+cmFtaW5fc2l6ZSAtIGNfc2l6ZSkpIHsKKwkJZGV2X3ByaXYtPnJhbWluX2hlYXAgPSBOVUxMOworCQlOVl9FUlJPUihkZXYsICJGYWlsZWQgdG8gaW5pdCBSQU1JTiBoZWFwXG4iKTsKKwl9CisKKwkvKlhYWDogaW5jb3JyZWN0LCBidXQgbmVlZGVkIHRvIG1ha2UgaGFzaCBmdW5jICJ3b3JrIiAqLworCWRldl9wcml2LT5yYW1odF9vZmZzZXQgPSAweDEwMDAwOworCWRldl9wcml2LT5yYW1odF9iaXRzICAgPSA5OworCWRldl9wcml2LT5yYW1odF9zaXplICAgPSAoMSA8PCBkZXZfcHJpdi0+cmFtaHRfYml0cyk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK252NTBfaW5zdG1lbV90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52NTBfaW5zdG1lbV9wcml2ICpwcml2ID0gZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByaXY7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IGRldl9wcml2LT5maWZvc1swXTsKKwlpbnQgaTsKKworCU5WX0RFQlVHKGRldiwgIlxuIik7CisKKwlpZiAoIXByaXYpCisJCXJldHVybjsKKworCS8qIFJlc3RvcmUgc3RhdGUgZnJvbSBiZWZvcmUgaW5pdCAqLworCWZvciAoaSA9IDB4MTcwMDsgaSA8PSAweDE3MTA7IGkgKz0gNCkKKwkJbnZfd3IzMihkZXYsIGksIHByaXYtPnNhdmUxNzAwWyhpIC0gMHgxNzAwKSAvIDRdKTsKKworCW5vdXZlYXVfZ3B1b2JqX3JlZl9kZWwoZGV2LCAmcHJpdi0+ZmJfYmFyKTsKKwlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGRldiwgJnByaXYtPnByYW1pbl9iYXIpOworCW5vdXZlYXVfZ3B1b2JqX3JlZl9kZWwoZGV2LCAmcHJpdi0+cHJhbWluX3B0KTsKKworCS8qIERlc3Ryb3kgZHVtbXkgY2hhbm5lbCAqLworCWlmIChjaGFuKSB7CisJCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+dm1fdnJhbV9wdF9ucjsgaSsrKSB7CisJCQlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGRldiwgJmNoYW4tPnZtX3ZyYW1fcHRbaV0pOworCQkJZGV2X3ByaXYtPnZtX3ZyYW1fcHRbaV0gPSBOVUxMOworCQl9CisJCWRldl9wcml2LT52bV92cmFtX3B0X25yID0gMDsKKworCQlub3V2ZWF1X2dwdW9ial9kZWwoZGV2LCAmY2hhbi0+dm1fcGQpOworCQlub3V2ZWF1X2dwdW9ial9yZWZfZGVsKGRldiwgJmNoYW4tPnJhbWZjKTsKKwkJbm91dmVhdV9ncHVvYmpfcmVmX2RlbChkZXYsICZjaGFuLT5yYW1pbik7CisJCW5vdXZlYXVfbWVtX3Rha2Vkb3duKCZjaGFuLT5yYW1pbl9oZWFwKTsKKworCQlkZXZfcHJpdi0+Zmlmb3NbMF0gPSBkZXZfcHJpdi0+Zmlmb3NbMTI3XSA9IE5VTEw7CisJCWtmcmVlKGNoYW4pOworCX0KKworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcml2ID0gTlVMTDsKKwlrZnJlZShwcml2KTsKK30KKworaW50CitudjUwX2luc3RtZW1fc3VzcGVuZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IGRldl9wcml2LT5maWZvc1swXTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnJhbWluID0gY2hhbi0+cmFtaW4tPmdwdW9iajsKKwlpbnQgaTsKKworCXJhbWluLT5pbV9iYWNraW5nX3N1c3BlbmQgPSB2bWFsbG9jKHJhbWluLT5pbV9wcmFtaW4tPnNpemUpOworCWlmICghcmFtaW4tPmltX2JhY2tpbmdfc3VzcGVuZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgcmFtaW4tPmltX3ByYW1pbi0+c2l6ZTsgaSArPSA0KQorCQlyYW1pbi0+aW1fYmFja2luZ19zdXNwZW5kW2kvNF0gPSBudl9yaTMyKGRldiwgaSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK252NTBfaW5zdG1lbV9yZXN1bWUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudjUwX2luc3RtZW1fcHJpdiAqcHJpdiA9IGRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcml2OworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Zmlmb3NbMF07CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpyYW1pbiA9IGNoYW4tPnJhbWluLT5ncHVvYmo7CisJaW50IGk7CisKKwludl93cjMyKGRldiwgTlY1MF9QVU5LX0JBUjBfUFJBTUlOLCAocmFtaW4tPmltX2JhY2tpbmdfc3RhcnQgPj4gMTYpKTsKKwlmb3IgKGkgPSAwOyBpIDwgcmFtaW4tPmltX3ByYW1pbi0+c2l6ZTsgaSArPSA0KQorCQlCQVIwX1dJMzIocmFtaW4sIGksIHJhbWluLT5pbV9iYWNraW5nX3N1c3BlbmRbaS80XSk7CisJdmZyZWUocmFtaW4tPmltX2JhY2tpbmdfc3VzcGVuZCk7CisJcmFtaW4tPmltX2JhY2tpbmdfc3VzcGVuZCA9IE5VTEw7CisKKwkvKiBQb2tlIHRoZSByZWxldmFudCByZWdzLCBhbmQgcHJheSBpdCB3b3JrcyA6KSAqLworCW52X3dyMzIoZGV2LCBOVjUwX1BVTktfQkFSX0NGR19CQVNFLCAoY2hhbi0+cmFtaW4tPmluc3RhbmNlID4+IDEyKSk7CisJbnZfd3IzMihkZXYsIE5WNTBfUFVOS19VTksxNzEwLCAwKTsKKwludl93cjMyKGRldiwgTlY1MF9QVU5LX0JBUl9DRkdfQkFTRSwgKGNoYW4tPnJhbWluLT5pbnN0YW5jZSA+PiAxMikgfAorCQkJCQkgTlY1MF9QVU5LX0JBUl9DRkdfQkFTRV9WQUxJRCk7CisJbnZfd3IzMihkZXYsIE5WNTBfUFVOS19CQVIxX0NUWERNQSwgKHByaXYtPmZiX2Jhci0+aW5zdGFuY2UgPj4gNCkgfAorCQkJCQlOVjUwX1BVTktfQkFSMV9DVFhETUFfVkFMSUQpOworCW52X3dyMzIoZGV2LCBOVjUwX1BVTktfQkFSM19DVFhETUEsIChwcml2LT5wcmFtaW5fYmFyLT5pbnN0YW5jZSA+PiA0KSB8CisJCQkJCU5WNTBfUFVOS19CQVIzX0NUWERNQV9WQUxJRCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQludl93cjMyKGRldiwgMHgxOTAwICsgKGkqNCksIDApOworfQorCitpbnQKK252NTBfaW5zdG1lbV9wb3B1bGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaiwKKwkJICAgICAgdWludDMyX3QgKnN6KQoreworCWludCByZXQ7CisKKwlpZiAoZ3B1b2JqLT5pbV9iYWNraW5nKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSpzeiA9ICgqc3ogKyAoTlY1MF9JTlNUTUVNX1BBR0VfU0laRS0xKSkgJiB+KE5WNTBfSU5TVE1FTV9QQUdFX1NJWkUtMSk7CisJaWYgKCpzeiA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IG5vdXZlYXVfYm9fbmV3KGRldiwgTlVMTCwgKnN6LCAwLCBUVE1fUExfRkxBR19WUkFNLCAwLCAweDAwMDAsCisJCQkgICAgIHRydWUsIGZhbHNlLCAmZ3B1b2JqLT5pbV9iYWNraW5nKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgImVycm9yIGdldHRpbmcgUFJBTUlOIGJhY2tpbmcgcGFnZXM6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IG5vdXZlYXVfYm9fcGluKGdwdW9iai0+aW1fYmFja2luZywgVFRNX1BMX0ZMQUdfVlJBTSk7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJlcnJvciBwaW5uaW5nIFBSQU1JTiBiYWNraW5nIFZSQU06ICVkXG4iLCByZXQpOworCQlub3V2ZWF1X2JvX3JlZihOVUxMLCAmZ3B1b2JqLT5pbV9iYWNraW5nKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlncHVvYmotPmltX2JhY2tpbmdfc3RhcnQgPSBncHVvYmotPmltX2JhY2tpbmctPmJvLm1lbS5tbV9ub2RlLT5zdGFydDsKKwlncHVvYmotPmltX2JhY2tpbmdfc3RhcnQgPDw9IFBBR0VfU0hJRlQ7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbnY1MF9pbnN0bWVtX2NsZWFyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoZ3B1b2JqICYmIGdwdW9iai0+aW1fYmFja2luZykgeworCQlpZiAoZ3B1b2JqLT5pbV9ib3VuZCkKKwkJCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS51bmJpbmQoZGV2LCBncHVvYmopOworCQlub3V2ZWF1X2JvX3VucGluKGdwdW9iai0+aW1fYmFja2luZyk7CisJCW5vdXZlYXVfYm9fcmVmKE5VTEwsICZncHVvYmotPmltX2JhY2tpbmcpOworCQlncHVvYmotPmltX2JhY2tpbmcgPSBOVUxMOworCX0KK30KKworaW50CitudjUwX2luc3RtZW1fYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudjUwX2luc3RtZW1fcHJpdiAqcHJpdiA9IGRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcml2OworCXVpbnQzMl90IHB0ZSwgcHRlX2VuZCwgdnJhbTsKKworCWlmICghZ3B1b2JqLT5pbV9iYWNraW5nIHx8ICFncHVvYmotPmltX3ByYW1pbiB8fCBncHVvYmotPmltX2JvdW5kKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCU5WX0RFQlVHKGRldiwgInN0PTB4JTBsbHggc3o9MHglMGxseFxuIiwKKwkJIGdwdW9iai0+aW1fcHJhbWluLT5zdGFydCwgZ3B1b2JqLT5pbV9wcmFtaW4tPnNpemUpOworCisJcHRlICAgICA9IChncHVvYmotPmltX3ByYW1pbi0+c3RhcnQgPj4gMTIpIDw8IDM7CisJcHRlX2VuZCA9ICgoZ3B1b2JqLT5pbV9wcmFtaW4tPnNpemUgPj4gMTIpIDw8IDMpICsgcHRlOworCXZyYW0gICAgPSBncHVvYmotPmltX2JhY2tpbmdfc3RhcnQ7CisKKwlOVl9ERUJVRyhkZXYsICJwcmFtaW49MHglbGx4LCBwdGU9JWQsIHB0ZV9lbmQ9JWRcbiIsCisJCSBncHVvYmotPmltX3ByYW1pbi0+c3RhcnQsIHB0ZSwgcHRlX2VuZCk7CisJTlZfREVCVUcoZGV2LCAiZmlyc3QgdnJhbSBwYWdlOiAweCUwOHhcbiIsIGdwdW9iai0+aW1fYmFja2luZ19zdGFydCk7CisKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJlcGFyZV9hY2Nlc3MoZGV2LCB0cnVlKTsKKwl3aGlsZSAocHRlIDwgcHRlX2VuZCkgeworCQludl93bzMyKGRldiwgcHJpdi0+cHJhbWluX3B0LT5ncHVvYmosIChwdGUgKyAwKS80LCB2cmFtIHwgMSk7CisJCW52X3dvMzIoZGV2LCBwcml2LT5wcmFtaW5fcHQtPmdwdW9iaiwgKHB0ZSArIDQpLzQsIDB4MDAwMDAwMDApOworCisJCXB0ZSArPSA4OworCQl2cmFtICs9IE5WNTBfSU5TVE1FTV9QQUdFX1NJWkU7CisJfQorCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisKKwludl93cjMyKGRldiwgMHgxMDBjODAsIDB4MDAwNDAwMDEpOworCWlmICghbnZfd2FpdCgweDEwMGM4MCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCkpIHsKKwkJTlZfRVJST1IoZGV2LCAidGltZW91dDogKDB4MTAwYzgwICYgMSkgPT0gMCAoMSlcbiIpOworCQlOVl9FUlJPUihkZXYsICIweDEwMGM4MCA9IDB4JTA4eFxuIiwgbnZfcmQzMihkZXYsIDB4MTAwYzgwKSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJbnZfd3IzMihkZXYsIDB4MTAwYzgwLCAweDAwMDYwMDAxKTsKKwlpZiAoIW52X3dhaXQoMHgxMDBjODAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApKSB7CisJCU5WX0VSUk9SKGRldiwgInRpbWVvdXQ6ICgweDEwMGM4MCAmIDEpID09IDAgKDIpXG4iKTsKKwkJTlZfRVJST1IoZGV2LCAiMHgxMDBjODAgPSAweCUwOHhcbiIsIG52X3JkMzIoZGV2LCAweDEwMGM4MCkpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWdwdW9iai0+aW1fYm91bmQgPSAxOworCXJldHVybiAwOworfQorCitpbnQKK252NTBfaW5zdG1lbV91bmJpbmQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmopCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnY1MF9pbnN0bWVtX3ByaXYgKnByaXYgPSBkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJpdjsKKwl1aW50MzJfdCBwdGUsIHB0ZV9lbmQ7CisKKwlpZiAoZ3B1b2JqLT5pbV9ib3VuZCA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXB0ZSAgICAgPSAoZ3B1b2JqLT5pbV9wcmFtaW4tPnN0YXJ0ID4+IDEyKSA8PCAzOworCXB0ZV9lbmQgPSAoKGdwdW9iai0+aW1fcHJhbWluLT5zaXplID4+IDEyKSA8PCAzKSArIHB0ZTsKKworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcmVwYXJlX2FjY2VzcyhkZXYsIHRydWUpOworCXdoaWxlIChwdGUgPCBwdGVfZW5kKSB7CisJCW52X3dvMzIoZGV2LCBwcml2LT5wcmFtaW5fcHQtPmdwdW9iaiwgKHB0ZSArIDApLzQsIDB4MDAwMDAwMDkpOworCQludl93bzMyKGRldiwgcHJpdi0+cHJhbWluX3B0LT5ncHVvYmosIChwdGUgKyA0KS80LCAweDAwMDAwMDAwKTsKKwkJcHRlICs9IDg7CisJfQorCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5maW5pc2hfYWNjZXNzKGRldik7CisKKwlncHVvYmotPmltX2JvdW5kID0gMDsKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbnY1MF9pbnN0bWVtX3ByZXBhcmVfYWNjZXNzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGJvb2wgd3JpdGUpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnY1MF9pbnN0bWVtX3ByaXYgKnByaXYgPSBkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJpdjsKKworCXByaXYtPmxhc3RfYWNjZXNzX3dyID0gd3JpdGU7Cit9CisKK3ZvaWQKK252NTBfaW5zdG1lbV9maW5pc2hfYWNjZXNzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnY1MF9pbnN0bWVtX3ByaXYgKnByaXYgPSBkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJpdjsKKworCWlmIChwcml2LT5sYXN0X2FjY2Vzc193cikgeworCQludl93cjMyKGRldiwgMHgwNzAwMDAsIDB4MDAwMDAwMDEpOworCQlpZiAoIW52X3dhaXQoMHgwNzAwMDAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApKQorCQkJTlZfRVJST1IoZGV2LCAiUFJBTUlOIGZsdXNoIHRpbWVvdXRcbiIpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9tYy5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9tYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYTljM2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX21jLmMKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBCZW4gU2tlZ2dzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorCitpbnQKK252NTBfbWNfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUsIDB4RkZGRkZGRkYpOworCXJldHVybiAwOworfQorCit2b2lkIG52NTBfbWNfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfc29yLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX3Nvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMjgwNDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX3Nvci5jCkBAIC0wLDAgKzEsMzA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1hYXJ0ZW4gTWFhdGh1aXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybV9jcnRjX2hlbHBlci5oIgorCisjZGVmaW5lIE5PVVZFQVVfRE1BX0RFQlVHIChub3V2ZWF1X3JlZ19kZWJ1ZyAmIE5PVVZFQVVfUkVHX0RFQlVHX0VWTykKKyNpbmNsdWRlICJub3V2ZWF1X3JlZy5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9kbWEuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2VuY29kZXIuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Nvbm5lY3Rvci5oIgorI2luY2x1ZGUgIm5vdXZlYXVfY3J0Yy5oIgorI2luY2x1ZGUgIm52NTBfZGlzcGxheS5oIgorCitzdGF0aWMgdm9pZAorbnY1MF9zb3JfZGlzY29ubmVjdChzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSB0b19kcm1fZW5jb2Rlcihudl9lbmNvZGVyKS0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqZXZvID0gZGV2X3ByaXYtPmV2bzsKKwlpbnQgcmV0OworCisJTlZfREVCVUcoZGV2LCAiRGlzY29ubmVjdGluZyBTT1IgJWRcbiIsIG52X2VuY29kZXItPm9yKTsKKworCXJldCA9IFJJTkdfU1BBQ0UoZXZvLCAyKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIm5vIHNwYWNlIHdoaWxlIGRpc2Nvbm5lY3RpbmcgU09SXG4iKTsKKwkJcmV0dXJuOworCX0KKwlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fU09SKG52X2VuY29kZXItPm9yLCBNT0RFX0NUUkwpLCAxKTsKKwlPVVRfUklORyhldm8sIDApOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9zb3JfZHBfbGlua190cmFpbihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBiaXRfZGlzcGxheXBvcnRfZW5jb2Rlcl90YWJsZSAqZHBlOworCWludCBkcGVfaGVhZGVybGVuOworCisJZHBlID0gbm91dmVhdV9iaW9zX2RwX3RhYmxlKGRldiwgbnZfZW5jb2Rlci0+ZGNiLCAmZHBlX2hlYWRlcmxlbik7CisJaWYgKCFkcGUpIHsKKwkJTlZfRVJST1IoZGV2LCAiU09SLSVkOiBubyBEUCBlbmNvZGVyIHRhYmxlIVxuIiwgbnZfZW5jb2Rlci0+b3IpOworCQlyZXR1cm47CisJfQorCisJaWYgKGRwZS0+c2NyaXB0MCkgeworCQlOVl9ERUJVRyhkZXYsICJTT1ItJWQ6IHJ1bm5pbmcgRFAgc2NyaXB0IDBcbiIsIG52X2VuY29kZXItPm9yKTsKKwkJbm91dmVhdV9iaW9zX3J1bl9pbml0X3RhYmxlKGRldiwgbGUxNl90b19jcHUoZHBlLT5zY3JpcHQwKSwKKwkJCQkJICAgIG52X2VuY29kZXItPmRjYik7CisJfQorCisJaWYgKCFub3V2ZWF1X2RwX2xpbmtfdHJhaW4oZW5jb2RlcikpCisJCU5WX0VSUk9SKGRldiwgIlNPUi0lZDogbGluayB0cmFpbmluZyBmYWlsZWRcbiIsIG52X2VuY29kZXItPm9yKTsKKworCWlmIChkcGUtPnNjcmlwdDEpIHsKKwkJTlZfREVCVUcoZGV2LCAiU09SLSVkOiBydW5uaW5nIERQIHNjcmlwdCAxXG4iLCBudl9lbmNvZGVyLT5vcik7CisJCW5vdXZlYXVfYmlvc19ydW5faW5pdF90YWJsZShkZXYsIGxlMTZfdG9fY3B1KGRwZS0+c2NyaXB0MSksCisJCQkJCSAgICBudl9lbmNvZGVyLT5kY2IpOworCX0KK30KKworc3RhdGljIHZvaWQKK252NTBfc29yX2RwbXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisJdWludDMyX3QgdmFsOworCWludCBvciA9IG52X2VuY29kZXItPm9yOworCisJTlZfREVCVUcoZGV2LCAib3IgJWQgbW9kZSAlZFxuIiwgb3IsIG1vZGUpOworCisJLyogd2FpdCBmb3IgaXQgdG8gYmUgZG9uZSAqLworCWlmICghbnZfd2FpdChOVjUwX1BESVNQTEFZX1NPUl9EUE1TX0NUUkwob3IpLAorCQkgICAgIE5WNTBfUERJU1BMQVlfU09SX0RQTVNfQ1RSTF9QRU5ESU5HLCAwKSkgeworCQlOVl9FUlJPUihkZXYsICJ0aW1lb3V0OiBTT1JfRFBNU19DVFJMX1BFTkRJTkcoJWQpID09IDBcbiIsIG9yKTsKKwkJTlZfRVJST1IoZGV2LCAiU09SX0RQTVNfQ1RSTCglZCkgPSAweCUwOHhcbiIsIG9yLAorCQkJIG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX1NPUl9EUE1TX0NUUkwob3IpKSk7CisJfQorCisJdmFsID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfU09SX0RQTVNfQ1RSTChvcikpOworCisJaWYgKG1vZGUgPT0gRFJNX01PREVfRFBNU19PTikKKwkJdmFsIHw9IE5WNTBfUERJU1BMQVlfU09SX0RQTVNfQ1RSTF9PTjsKKwllbHNlCisJCXZhbCAmPSB+TlY1MF9QRElTUExBWV9TT1JfRFBNU19DVFJMX09OOworCisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfU09SX0RQTVNfQ1RSTChvciksIHZhbCB8CisJCU5WNTBfUERJU1BMQVlfU09SX0RQTVNfQ1RSTF9QRU5ESU5HKTsKKwlpZiAoIW52X3dhaXQoTlY1MF9QRElTUExBWV9TT1JfRFBNU19TVEFURShvciksCisJCSAgICAgTlY1MF9QRElTUExBWV9TT1JfRFBNU19TVEFURV9XQUlULCAwKSkgeworCQlOVl9FUlJPUihkZXYsICJ0aW1lb3V0OiBTT1JfRFBNU19TVEFURV9XQUlUKCVkKSA9PSAwXG4iLCBvcik7CisJCU5WX0VSUk9SKGRldiwgIlNPUl9EUE1TX1NUQVRFKCVkKSA9IDB4JTA4eFxuIiwgb3IsCisJCQkgbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfU09SX0RQTVNfU1RBVEUob3IpKSk7CisJfQorCisJaWYgKG52X2VuY29kZXItPmRjYi0+dHlwZSA9PSBPVVRQVVRfRFAgJiYgbW9kZSA9PSBEUk1fTU9ERV9EUE1TX09OKQorCQludjUwX3Nvcl9kcF9saW5rX3RyYWluKGVuY29kZXIpOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9zb3Jfc2F2ZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJTlZfRVJST1IoZW5jb2Rlci0+ZGV2LCAiISFcbiIpOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9zb3JfcmVzdG9yZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJTlZfRVJST1IoZW5jb2Rlci0+ZGV2LCAiISFcbiIpOworfQorCitzdGF0aWMgYm9vbAorbnY1MF9zb3JfbW9kZV9maXh1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAorCQkgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKworCU5WX0RFQlVHKGVuY29kZXItPmRldiwgIm9yICVkXG4iLCBudl9lbmNvZGVyLT5vcik7CisKKwljb25uZWN0b3IgPSBub3V2ZWF1X2VuY29kZXJfY29ubmVjdG9yX2dldChudl9lbmNvZGVyKTsKKwlpZiAoIWNvbm5lY3RvcikgeworCQlOVl9FUlJPUihlbmNvZGVyLT5kZXYsICJFbmNvZGVyIGhhcyBubyBjb25uZWN0b3JcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKGNvbm5lY3Rvci0+c2NhbGluZ19tb2RlICE9IERSTV9NT0RFX1NDQUxFX05PTkUgJiYKKwkgICAgIGNvbm5lY3Rvci0+bmF0aXZlX21vZGUpIHsKKwkJaW50IGlkID0gYWRqdXN0ZWRfbW9kZS0+YmFzZS5pZDsKKwkJKmFkanVzdGVkX21vZGUgPSAqY29ubmVjdG9yLT5uYXRpdmVfbW9kZTsKKwkJYWRqdXN0ZWRfbW9kZS0+YmFzZS5pZCA9IGlkOworCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9zb3JfcHJlcGFyZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7Cit9CisKK3N0YXRpYyB2b2lkCitudjUwX3Nvcl9jb21taXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworfQorCitzdGF0aWMgdm9pZAorbnY1MF9zb3JfbW9kZV9zZXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBlbmNvZGVyLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmV2byA9IGRldl9wcml2LT5ldm87CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBub3V2ZWF1X2NydGMgKmNydGMgPSBub3V2ZWF1X2NydGMoZW5jb2Rlci0+Y3J0Yyk7CisJdWludDMyX3QgbW9kZV9jdGwgPSAwOworCWludCByZXQ7CisKKwlOVl9ERUJVRyhkZXYsICJvciAlZFxuIiwgbnZfZW5jb2Rlci0+b3IpOworCisJbnY1MF9zb3JfZHBtcyhlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09OKTsKKworCXN3aXRjaCAobnZfZW5jb2Rlci0+ZGNiLT50eXBlKSB7CisJY2FzZSBPVVRQVVRfVE1EUzoKKwkJaWYgKG52X2VuY29kZXItPmRjYi0+c29yY29uZi5saW5rICYgMSkgeworCQkJaWYgKGFkanVzdGVkX21vZGUtPmNsb2NrIDwgMTY1MDAwKQorCQkJCW1vZGVfY3RsID0gMHgwMTAwOworCQkJZWxzZQorCQkJCW1vZGVfY3RsID0gMHgwNTAwOworCQl9IGVsc2UKKwkJCW1vZGVfY3RsID0gMHgwMjAwOworCQlicmVhazsKKwljYXNlIE9VVFBVVF9EUDoKKwkJbW9kZV9jdGwgfD0gMHgwMDA1MDAwMDsKKwkJaWYgKG52X2VuY29kZXItPmRjYi0+c29yY29uZi5saW5rICYgMSkKKwkJCW1vZGVfY3RsIHw9IDB4MDAwMDA4MDA7CisJCWVsc2UKKwkJCW1vZGVfY3RsIHw9IDB4MDAwMDA5MDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWlmIChjcnRjLT5pbmRleCA9PSAxKQorCQltb2RlX2N0bCB8PSBOVjUwX0VWT19TT1JfTU9ERV9DVFJMX0NSVEMxOworCWVsc2UKKwkJbW9kZV9jdGwgfD0gTlY1MF9FVk9fU09SX01PREVfQ1RSTF9DUlRDMDsKKworCWlmIChhZGp1c3RlZF9tb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfTkhTWU5DKQorCQltb2RlX2N0bCB8PSBOVjUwX0VWT19TT1JfTU9ERV9DVFJMX05IU1lOQzsKKworCWlmIChhZGp1c3RlZF9tb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfTlZTWU5DKQorCQltb2RlX2N0bCB8PSBOVjUwX0VWT19TT1JfTU9ERV9DVFJMX05WU1lOQzsKKworCXJldCA9IFJJTkdfU1BBQ0UoZXZvLCAyKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIm5vIHNwYWNlIHdoaWxlIGNvbm5lY3RpbmcgU09SXG4iKTsKKwkJcmV0dXJuOworCX0KKwlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fU09SKG52X2VuY29kZXItPm9yLCBNT0RFX0NUUkwpLCAxKTsKKwlPVVRfUklORyhldm8sIG1vZGVfY3RsKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgbnY1MF9zb3JfaGVscGVyX2Z1bmNzID0geworCS5kcG1zID0gbnY1MF9zb3JfZHBtcywKKwkuc2F2ZSA9IG52NTBfc29yX3NhdmUsCisJLnJlc3RvcmUgPSBudjUwX3Nvcl9yZXN0b3JlLAorCS5tb2RlX2ZpeHVwID0gbnY1MF9zb3JfbW9kZV9maXh1cCwKKwkucHJlcGFyZSA9IG52NTBfc29yX3ByZXBhcmUsCisJLmNvbW1pdCA9IG52NTBfc29yX2NvbW1pdCwKKwkubW9kZV9zZXQgPSBudjUwX3Nvcl9tb2RlX3NldCwKKwkuZGV0ZWN0ID0gTlVMTAorfTsKKworc3RhdGljIHZvaWQKK252NTBfc29yX2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisKKwlpZiAoIWVuY29kZXIpCisJCXJldHVybjsKKworCU5WX0RFQlVHKGVuY29kZXItPmRldiwgIlxuIik7CisKKwlkcm1fZW5jb2Rlcl9jbGVhbnVwKGVuY29kZXIpOworCisJa2ZyZWUobnZfZW5jb2Rlcik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfZnVuY3MgbnY1MF9zb3JfZW5jb2Rlcl9mdW5jcyA9IHsKKwkuZGVzdHJveSA9IG52NTBfc29yX2Rlc3Ryb3ksCit9OworCitpbnQKK252NTBfc29yX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2VudHJ5ICplbnRyeSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CisJYm9vbCBkdW07CisJaW50IHR5cGU7CisKKwlOVl9ERUJVRyhkZXYsICJcbiIpOworCisJc3dpdGNoIChlbnRyeS0+dHlwZSkgeworCWNhc2UgT1VUUFVUX1RNRFM6CisJCU5WX0lORk8oZGV2LCAiRGV0ZWN0ZWQgYSBUTURTIG91dHB1dFxuIik7CisJCXR5cGUgPSBEUk1fTU9ERV9FTkNPREVSX1RNRFM7CisJCWJyZWFrOworCWNhc2UgT1VUUFVUX0xWRFM6CisJCU5WX0lORk8oZGV2LCAiRGV0ZWN0ZWQgYSBMVkRTIG91dHB1dFxuIik7CisJCXR5cGUgPSBEUk1fTU9ERV9FTkNPREVSX0xWRFM7CisKKwkJaWYgKG5vdXZlYXVfYmlvc19wYXJzZV9sdmRzX3RhYmxlKGRldiwgMCwgJmR1bSwgJmR1bSkpIHsKKwkJCU5WX0VSUk9SKGRldiwgIkZhaWxlZCBwYXJzaW5nIExWRFMgdGFibGVcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBPVVRQVVRfRFA6CisJCU5WX0lORk8oZGV2LCAiRGV0ZWN0ZWQgYSBEUCBvdXRwdXRcbiIpOworCQl0eXBlID0gRFJNX01PREVfRU5DT0RFUl9UTURTOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwludl9lbmNvZGVyID0ga3phbGxvYyhzaXplb2YoKm52X2VuY29kZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW52X2VuY29kZXIpCisJCXJldHVybiAtRU5PTUVNOworCWVuY29kZXIgPSB0b19kcm1fZW5jb2Rlcihudl9lbmNvZGVyKTsKKworCW52X2VuY29kZXItPmRjYiA9IGVudHJ5OworCW52X2VuY29kZXItPm9yID0gZmZzKGVudHJ5LT5vcikgLSAxOworCisJbnZfZW5jb2Rlci0+ZGlzY29ubmVjdCA9IG52NTBfc29yX2Rpc2Nvbm5lY3Q7CisKKwlkcm1fZW5jb2Rlcl9pbml0KGRldiwgZW5jb2RlciwgJm52NTBfc29yX2VuY29kZXJfZnVuY3MsIHR5cGUpOworCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoZW5jb2RlciwgJm52NTBfc29yX2hlbHBlcl9mdW5jcyk7CisKKwllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9IGVudHJ5LT5oZWFkczsKKwllbmNvZGVyLT5wb3NzaWJsZV9jbG9uZXMgPSAwOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udnJlZy5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZyZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTk4YzM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZyZWcuaApAQCAtMCwwICsxLDUzNSBAQAorLyogJFhDb25zb3J0aXVtOiBudnJlZy5oIC9tYWluLzIgMTk5Ni8xMC8yOCAwNToxMzo0MSBrYWxlYiAkICovCisvKgorICogQ29weXJpZ2h0IDE5OTYtMTk5NyAgRGF2aWQgSi4gTWNLYXkKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIERBVklEIEouIE1DS0FZIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKy8qICRYRnJlZTg2OiB4Yy9wcm9ncmFtcy9Yc2VydmVyL2h3L3hmcmVlODYvZHJpdmVycy9udi9udnJlZy5oLHYgMS42IDIwMDIvMDEvMjUgMjE6NTY6MDYgdHNpIEV4cCAkICovCisKKyNpZm5kZWYgX19OVlJFR19IXworI2RlZmluZSBfX05WUkVHX0hfCisKKyNkZWZpbmUgTlZfUE1DX09GRlNFVCAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgTlZfUE1DX1NJWkUgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKworI2RlZmluZSBOVl9QQlVTX09GRlNFVCAgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBOVl9QQlVTX1NJWkUgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorCisjZGVmaW5lIE5WX1BGSUZPX09GRlNFVCAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIE5WX1BGSUZPX1NJWkUgICAgICAgICAgICAgICAweDAwMDAyMDAwCisKKyNkZWZpbmUgTlZfSERJQUdfT0ZGU0VUICAgICAgICAgICAgIDB4MDAwMDUwMDAKKyNkZWZpbmUgTlZfSERJQUdfU0laRSAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKworI2RlZmluZSBOVl9QUkFNX09GRlNFVCAgICAgICAgICAgICAgMHgwMDAwNjAwMAorI2RlZmluZSBOVl9QUkFNX1NJWkUgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorCisjZGVmaW5lIE5WX1BWSURFT19PRkZTRVQgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIE5WX1BWSURFT19TSVpFICAgICAgICAgICAgICAweDAwMDAxMDAwCisKKyNkZWZpbmUgTlZfUFRJTUVSX09GRlNFVCAgICAgICAgICAgIDB4MDAwMDkwMDAKKyNkZWZpbmUgTlZfUFRJTUVSX1NJWkUgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKworI2RlZmluZSBOVl9QUE1fT0ZGU0VUICAgICAgICAgICAgICAgMHgwMDAwQTAwMAorI2RlZmluZSBOVl9QUE1fU0laRSAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorCisjZGVmaW5lIE5WX1BUVl9PRkZTRVQgICAgICAgICAgICAgICAweDAwMDBEMDAwCisjZGVmaW5lIE5WX1BUVl9TSVpFICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCisKKyNkZWZpbmUgTlZfUFJNVkdBX09GRlNFVCAgICAgICAgICAgIDB4MDAwQTAwMDAKKyNkZWZpbmUgTlZfUFJNVkdBX1NJWkUgICAgICAgICAgICAgIDB4MDAwMjAwMDAKKworI2RlZmluZSBOVl9QUk1WSU8wX09GRlNFVCAgICAgICAgICAgMHgwMDBDMDAwMAorI2RlZmluZSBOVl9QUk1WSU9fU0laRSAgICAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBOVl9QUk1WSU8xX09GRlNFVCAgICAgICAgICAgMHgwMDBDMjAwMAorCisjZGVmaW5lIE5WX1BGQl9PRkZTRVQgICAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIE5WX1BGQl9TSVpFICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCisKKyNkZWZpbmUgTlZfUEVYVERFVl9PRkZTRVQgICAgICAgICAgIDB4MDAxMDEwMDAKKyNkZWZpbmUgTlZfUEVYVERFVl9TSVpFICAgICAgICAgICAgIDB4MDAwMDEwMDAKKworI2RlZmluZSBOVl9QTUVfT0ZGU0VUICAgICAgICAgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBOVl9QTUVfU0laRSAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorCisjZGVmaW5lIE5WX1BST01fT0ZGU0VUICAgICAgICAgICAgICAweDAwMzAwMDAwCisjZGVmaW5lIE5WX1BST01fU0laRSAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisKKyNkZWZpbmUgTlZfUEdSQVBIX09GRlNFVCAgICAgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgTlZfUEdSQVBIX1NJWkUgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKworI2RlZmluZSBOVl9QQ1JUQzBfT0ZGU0VUICAgICAgICAgICAgMHgwMDYwMDAwMAorI2RlZmluZSBOVl9QQ1JUQzBfU0laRSAgICAgICAgICAgICAgMHgwMDAwMjAwMCAvKiBlbXBpcmljYWwgKi8KKworI2RlZmluZSBOVl9QUk1DSU8wX09GRlNFVCAgICAgICAgICAgMHgwMDYwMTAwMAorI2RlZmluZSBOVl9QUk1DSU9fU0laRSAgICAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBOVl9QUk1DSU8xX09GRlNFVCAgICAgICAgICAgMHgwMDYwMzAwMAorCisjZGVmaW5lIE5WNTBfRElTUExBWV9PRkZTRVQgICAgICAgICAgIDB4MDA2MTAwMDAKKyNkZWZpbmUgTlY1MF9ESVNQTEFZX1NJWkUgICAgICAgICAgICAgMHgwMDAwRkZGRgorCisjZGVmaW5lIE5WX1BSQU1EQUMwX09GRlNFVCAgICAgICAgICAweDAwNjgwMDAwCisjZGVmaW5lIE5WX1BSQU1EQUMwX1NJWkUgICAgICAgICAgICAweDAwMDAyMDAwCisKKyNkZWZpbmUgTlZfUFJNRElPMF9PRkZTRVQgICAgICAgICAgIDB4MDA2ODEwMDAKKyNkZWZpbmUgTlZfUFJNRElPX1NJWkUgICAgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgTlZfUFJNRElPMV9PRkZTRVQgICAgICAgICAgIDB4MDA2ODMwMDAKKworI2RlZmluZSBOVl9QUkFNSU5fT0ZGU0VUICAgICAgICAgICAgMHgwMDcwMDAwMAorI2RlZmluZSBOVl9QUkFNSU5fU0laRSAgICAgICAgICAgICAgMHgwMDEwMDAwMAorCisjZGVmaW5lIE5WX0ZJRk9fT0ZGU0VUICAgICAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIE5WX0ZJRk9fU0laRSAgICAgICAgICAgICAgICAweDAwODAwMDAwCisKKyNkZWZpbmUgTlZfUE1DX0JPT1RfMAkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTlZfUE1DX0VOQUJMRQkJCTB4MDAwMDAyMDAKKworI2RlZmluZSBOVl9WSU9fVlNFMgkJCTB4MDAwMDAzYzMKKyNkZWZpbmUgTlZfVklPX1NSWAkJCTB4MDAwMDAzYzQKKworI2RlZmluZSBOVl9DSU9fQ1JYX19DT0xPUgkJMHgwMDAwMDNkNAorI2RlZmluZSBOVl9DSU9fQ1JfX0NPTE9SCQkweDAwMDAwM2Q1CisKKyNkZWZpbmUgTlZfUEJVU19ERUJVR18xCQkJMHgwMDAwMTA4NAorI2RlZmluZSBOVl9QQlVTX0RFQlVHXzQJCQkweDAwMDAxMDk4CisjZGVmaW5lIE5WX1BCVVNfREVCVUdfRFVBTEhFQURfQ1RMCTB4MDAwMDEwZjAKKyNkZWZpbmUgTlZfUEJVU19QT1dFUkNUUkxfMQkJMHgwMDAwMTU4NAorI2RlZmluZSBOVl9QQlVTX1BPV0VSQ1RSTF8yCQkweDAwMDAxNTg4CisjZGVmaW5lIE5WX1BCVVNfUE9XRVJDVFJMXzQJCTB4MDAwMDE1OTAKKyNkZWZpbmUgTlZfUEJVU19QQ0lfTlZfMTkJCTB4MDAwMDE4NEMKKyNkZWZpbmUgTlZfUEJVU19QQ0lfTlZfMjAJCTB4MDAwMDE4NTAKKyMJZGVmaW5lIE5WX1BCVVNfUENJX05WXzIwX1JPTV9TSEFET1dfRElTQUJMRUQJKDAgPDwgMCkKKyMJZGVmaW5lIE5WX1BCVVNfUENJX05WXzIwX1JPTV9TSEFET1dfRU5BQkxFRAkoMSA8PCAwKQorCisjZGVmaW5lIE5WX1BGSUZPX1JBTUhUCQkJMHgwMDAwMjIxMAorCisjZGVmaW5lIE5WX1BUVl9UVl9JTkRFWAkJCTB4MDAwMGQyMjAKKyNkZWZpbmUgTlZfUFRWX1RWX0RBVEEJCQkweDAwMDBkMjI0CisjZGVmaW5lIE5WX1BUVl9IRklMVEVSCQkJMHgwMDAwZDMxMAorI2RlZmluZSBOVl9QVFZfSEZJTFRFUjIJCQkweDAwMDBkMzkwCisjZGVmaW5lIE5WX1BUVl9WRklMVEVSCQkJMHgwMDAwZDUxMAorCisjZGVmaW5lIE5WX1BSTVZJT19NSVNDX19XUklURQkJMHgwMDBjMDNjMgorI2RlZmluZSBOVl9QUk1WSU9fU1JYCQkJMHgwMDBjMDNjNAorI2RlZmluZSBOVl9QUk1WSU9fU1IJCQkweDAwMGMwM2M1CisjCWRlZmluZSBOVl9WSU9fU1JfUkVTRVRfSU5ERVgJCTB4MDAKKyMJZGVmaW5lIE5WX1ZJT19TUl9DTE9DS19JTkRFWAkJMHgwMQorIwlkZWZpbmUgTlZfVklPX1NSX1BMQU5FX01BU0tfSU5ERVgJMHgwMgorIwlkZWZpbmUgTlZfVklPX1NSX0NIQVJfTUFQX0lOREVYCQkweDAzCisjCWRlZmluZSBOVl9WSU9fU1JfTUVNX01PREVfSU5ERVgJCTB4MDQKKyNkZWZpbmUgTlZfUFJNVklPX01JU0NfX1JFQUQJCTB4MDAwYzAzY2MKKyNkZWZpbmUgTlZfUFJNVklPX0dSWAkJCTB4MDAwYzAzY2UKKyNkZWZpbmUgTlZfUFJNVklPX0dYCQkJMHgwMDBjMDNjZgorIwlkZWZpbmUgTlZfVklPX0dYX1NSX0lOREVYCQkweDAwCisjCWRlZmluZSBOVl9WSU9fR1hfU1JFTl9JTkRFWAkJMHgwMQorIwlkZWZpbmUgTlZfVklPX0dYX0NDT01QX0lOREVYCQkweDAyCisjCWRlZmluZSBOVl9WSU9fR1hfUk9QX0lOREVYCQkweDAzCisjCWRlZmluZSBOVl9WSU9fR1hfUkVBRF9NQVBfSU5ERVgJCTB4MDQKKyMJZGVmaW5lIE5WX1ZJT19HWF9NT0RFX0lOREVYCQkweDA1CisjCWRlZmluZSBOVl9WSU9fR1hfTUlTQ19JTkRFWAkJMHgwNgorIwlkZWZpbmUgTlZfVklPX0dYX0RPTlRfQ0FSRV9JTkRFWAkweDA3CisjCWRlZmluZSBOVl9WSU9fR1hfQklUX01BU0tfSU5ERVgJCTB4MDgKKworI2RlZmluZSBOVl9QRkJfQk9PVF8wCQkJMHgwMDEwMDAwMAorI2RlZmluZSBOVl9QRkJfQ0ZHMAkJCTB4MDAxMDAyMDAKKyNkZWZpbmUgTlZfUEZCX0NGRzEJCQkweDAwMTAwMjA0CisjZGVmaW5lIE5WX1BGQl9DU1RBVFVTCQkJMHgwMDEwMDIwQworI2RlZmluZSBOVl9QRkJfUkVGQ1RSTAkJCTB4MDAxMDAyMTAKKyMJZGVmaW5lIE5WX1BGQl9SRUZDVFJMX1ZBTElEXzEJCQkoMSA8PCAzMSkKKyNkZWZpbmUgTlZfUEZCX1BBRAkJCTB4MDAxMDAyMUMKKyMJZGVmaW5lIE5WX1BGQl9QQURfQ0tFX05PUk1BTAkJCSgxIDw8IDApCisjZGVmaW5lIE5WX1BGQl9USUxFX05WMTAJCTB4MDAxMDAyNDAKKyNkZWZpbmUgTlZfUEZCX1RJTEVfU0laRV9OVjEwCQkweDAwMTAwMjQ0CisjZGVmaW5lIE5WX1BGQl9SRUYJCQkweDAwMTAwMkQwCisjCWRlZmluZSBOVl9QRkJfUkVGX0NNRF9SRUZSRVNICQkJKDEgPDwgMCkKKyNkZWZpbmUgTlZfUEZCX1BSRQkJCTB4MDAxMDAyRDQKKyMJZGVmaW5lIE5WX1BGQl9QUkVfQ01EX1BSRUNIQVJHRQkJCSgxIDw8IDApCisjZGVmaW5lIE5WX1BGQl9DTE9TRV9QQUdFMgkJMHgwMDEwMDMzQworI2RlZmluZSBOVl9QRkJfVElMRV9OVjQwCQkweDAwMTAwNjAwCisjZGVmaW5lIE5WX1BGQl9USUxFX1NJWkVfTlY0MAkJMHgwMDEwMDYwNAorCisjZGVmaW5lIE5WX1BFWFRERVZfQk9PVF8wCQkweDAwMTAxMDAwCisjCWRlZmluZSBOVl9QRVhUREVWX0JPT1RfMF9TVFJBUF9GUF9JRkFDRV8xMkJJVAkoOCA8PCAxMikKKyNkZWZpbmUgTlZfUEVYVERFVl9CT09UXzMJCTB4MDAxMDEwMGMKKworI2RlZmluZSBOVl9QQ1JUQ19JTlRSXzAJCQkJCTB4MDA2MDAxMDAKKyMJZGVmaW5lIE5WX1BDUlRDX0lOVFJfMF9WQkxBTksJCQkJKDEgPDwgMCkKKyNkZWZpbmUgTlZfUENSVENfSU5UUl9FTl8wCQkJCTB4MDA2MDAxNDAKKyNkZWZpbmUgTlZfUENSVENfU1RBUlQJCQkJCTB4MDA2MDA4MDAKKyNkZWZpbmUgTlZfUENSVENfQ09ORklHCQkJCQkweDAwNjAwODA0CisjCWRlZmluZSBOVl9QQ1JUQ19DT05GSUdfU1RBUlRfQUREUkVTU19OT05fVkdBCQkoMSA8PCAwKQorIwlkZWZpbmUgTlZfUENSVENfQ09ORklHX1NUQVJUX0FERFJFU1NfSFNZTkMJCSgyIDw8IDApCisjZGVmaW5lIE5WX1BDUlRDX0NVUlNPUl9DT05GSUcJCQkJMHgwMDYwMDgxMAorIwlkZWZpbmUgTlZfUENSVENfQ1VSU09SX0NPTkZJR19FTkFCTEVfRU5BQkxFCQkoMSA8PCAwKQorIwlkZWZpbmUgTlZfUENSVENfQ1VSU09SX0NPTkZJR19ET1VCTEVfU0NBTl9FTkFCTEUJKDEgPDwgNCkKKyMJZGVmaW5lIE5WX1BDUlRDX0NVUlNPUl9DT05GSUdfQUREUkVTU19TUEFDRV9QTlZNCSgxIDw8IDgpCisjCWRlZmluZSBOVl9QQ1JUQ19DVVJTT1JfQ09ORklHX0NVUl9CUFBfMzIJCSgxIDw8IDEyKQorIwlkZWZpbmUgTlZfUENSVENfQ1VSU09SX0NPTkZJR19DVVJfUElYRUxTXzY0CQkoMSA8PCAxNikKKyMJZGVmaW5lIE5WX1BDUlRDX0NVUlNPUl9DT05GSUdfQ1VSX0xJTkVTXzMyCQkoMiA8PCAyNCkKKyMJZGVmaW5lIE5WX1BDUlRDX0NVUlNPUl9DT05GSUdfQ1VSX0xJTkVTXzY0CQkoNCA8PCAyNCkKKyMJZGVmaW5lIE5WX1BDUlRDX0NVUlNPUl9DT05GSUdfQ1VSX0JMRU5EX0FMUEhBCQkoMSA8PCAyOCkKKworLyogbm90ZTogUENSVENfR1BJTyBpcyBub3QgYXZhaWxhYmxlIG9uIG52MTAsIGFuZCBpbiBmYWN0IGFsaWFzZXMgMHg2MDA4MTAgKi8KKyNkZWZpbmUgTlZfUENSVENfR1BJTwkJCQkJMHgwMDYwMDgxOAorI2RlZmluZSBOVl9QQ1JUQ19HUElPX0VYVAkJCQkweDAwNjAwODFjCisjZGVmaW5lIE5WX1BDUlRDXzgzMAkJCQkJMHgwMDYwMDgzMAorI2RlZmluZSBOVl9QQ1JUQ184MzQJCQkJCTB4MDA2MDA4MzQKKyNkZWZpbmUgTlZfUENSVENfODUwCQkJCQkweDAwNjAwODUwCisjZGVmaW5lIE5WX1BDUlRDX0VOR0lORV9DVFJMCQkJCTB4MDA2MDA4NjAKKyMJZGVmaW5lIE5WX0NSVENfRlNFTF9JMkMJCQkJCSgxIDw8IDQpCisjCWRlZmluZSBOVl9DUlRDX0ZTRUxfT1ZFUkxBWQkJCQkoMSA8PCAxMikKKworI2RlZmluZSBOVl9QUk1DSU9fQVJYCQkJMHgwMDYwMTNjMAorI2RlZmluZSBOVl9QUk1DSU9fQVJfX1dSSVRFCQkweDAwNjAxM2MwCisjZGVmaW5lIE5WX1BSTUNJT19BUl9fUkVBRAkJMHgwMDYwMTNjMQorIwlkZWZpbmUgTlZfQ0lPX0FSX01PREVfSU5ERVgJCTB4MTAKKyMJZGVmaW5lIE5WX0NJT19BUl9PU0NBTl9JTkRFWAkJMHgxMQorIwlkZWZpbmUgTlZfQ0lPX0FSX1BMQU5FX0lOREVYCQkweDEyCisjCWRlZmluZSBOVl9DSU9fQVJfSFBQX0lOREVYCQkweDEzCisjCWRlZmluZSBOVl9DSU9fQVJfQ1NFTF9JTkRFWAkJMHgxNAorI2RlZmluZSBOVl9QUk1DSU9fSU5QMAkJCTB4MDA2MDEzYzIKKyNkZWZpbmUgTlZfUFJNQ0lPX0NSWF9fQ09MT1IJCTB4MDA2MDEzZDQKKyNkZWZpbmUgTlZfUFJNQ0lPX0NSX19DT0xPUgkJMHgwMDYwMTNkNQorCS8qIFN0YW5kYXJkIFZHQSBDUlRDIHJlZ2lzdGVycyAqLworIwlkZWZpbmUgTlZfQ0lPX0NSX0hEVF9JTkRFWAkJMHgwMAkvKiBob3Jpem9udGFsIGRpc3BsYXkgdG90YWwgKi8KKyMJZGVmaW5lIE5WX0NJT19DUl9IREVfSU5ERVgJCTB4MDEJLyogaG9yaXpvbnRhbCBkaXNwbGF5IGVuZCAqLworIwlkZWZpbmUgTlZfQ0lPX0NSX0hCU19JTkRFWAkJMHgwMgkvKiBob3Jpem9udGFsIGJsYW5raW5nIHN0YXJ0ICovCisjCWRlZmluZSBOVl9DSU9fQ1JfSEJFX0lOREVYCQkweDAzCS8qIGhvcml6b250YWwgYmxhbmtpbmcgZW5kICovCisjCQlkZWZpbmUgTlZfQ0lPX0NSX0hCRV80XzAJCTQ6MAorIwlkZWZpbmUgTlZfQ0lPX0NSX0hSU19JTkRFWAkJMHgwNAkvKiBob3Jpem9udGFsIHJldHJhY2Ugc3RhcnQgKi8KKyMJZGVmaW5lIE5WX0NJT19DUl9IUkVfSU5ERVgJCTB4MDUJLyogaG9yaXpvbnRhbCByZXRyYWNlIGVuZCAqLworIwkJZGVmaW5lIE5WX0NJT19DUl9IUkVfNF8wCQk0OjAKKyMJCWRlZmluZSBOVl9DSU9fQ1JfSFJFX0hCRV81CQk3OjcKKyMJZGVmaW5lIE5WX0NJT19DUl9WRFRfSU5ERVgJCTB4MDYJLyogdmVydGljYWwgZGlzcGxheSB0b3RhbCAqLworIwlkZWZpbmUgTlZfQ0lPX0NSX09WTF9JTkRFWAkJMHgwNwkvKiBvdmVyZmxvdyBiaXRzICovCisjCQlkZWZpbmUgTlZfQ0lPX0NSX09WTF9WRFRfOAkJMDowCisjCQlkZWZpbmUgTlZfQ0lPX0NSX09WTF9WREVfOAkJMToxCisjCQlkZWZpbmUgTlZfQ0lPX0NSX09WTF9WUlNfOAkJMjoyCisjCQlkZWZpbmUgTlZfQ0lPX0NSX09WTF9WQlNfOAkJMzozCisjCQlkZWZpbmUgTlZfQ0lPX0NSX09WTF9WRFRfOQkJNTo1CisjCQlkZWZpbmUgTlZfQ0lPX0NSX09WTF9WREVfOQkJNjo2CisjCQlkZWZpbmUgTlZfQ0lPX0NSX09WTF9WUlNfOQkJNzo3CisjCWRlZmluZSBOVl9DSU9fQ1JfUlNBTF9JTkRFWAkJMHgwOAkvKiBub3JtYWxseSAicHJlc2V0IHJvdyBzY2FuIiAqLworIwlkZWZpbmUgTlZfQ0lPX0NSX0NFTExfSFRfSU5ERVgJCTB4MDkJLyogY2VsbCBoZWlnaHQ/ISBub3JtYWxseSAibWF4IHNjYW4gbGluZSIgKi8KKyMJCWRlZmluZSBOVl9DSU9fQ1JfQ0VMTF9IVF9WQlNfOQkJNTo1CisjCQlkZWZpbmUgTlZfQ0lPX0NSX0NFTExfSFRfU0NBTkRCTAk3OjcKKyMJZGVmaW5lIE5WX0NJT19DUl9DVVJTX1NUX0lOREVYCQkweDBhCS8qIGN1cnNvciBzdGFydCAqLworIwlkZWZpbmUgTlZfQ0lPX0NSX0NVUlNfRU5EX0lOREVYCQkweDBiCS8qIGN1cnNvciBlbmQgKi8KKyMJZGVmaW5lIE5WX0NJT19DUl9TQV9ISV9JTkRFWAkJMHgwYwkvKiBzY3JlZW4gc3RhcnQgYWRkcmVzcyBoaWdoICovCisjCWRlZmluZSBOVl9DSU9fQ1JfU0FfTE9fSU5ERVgJCTB4MGQJLyogc2NyZWVuIHN0YXJ0IGFkZHJlc3MgbG93ICovCisjCWRlZmluZSBOVl9DSU9fQ1JfVENPRkZfSElfSU5ERVgJCTB4MGUJLyogY3Vyc29yIG9mZnNldCBoaWdoICovCisjCWRlZmluZSBOVl9DSU9fQ1JfVENPRkZfTE9fSU5ERVgJCTB4MGYJLyogY3Vyc29yIG9mZnNldCBsb3cgKi8KKyMJZGVmaW5lIE5WX0NJT19DUl9WUlNfSU5ERVgJCTB4MTAJLyogdmVydGljYWwgcmV0cmFjZSBzdGFydCAqLworIwlkZWZpbmUgTlZfQ0lPX0NSX1ZSRV9JTkRFWAkJMHgxMQkvKiB2ZXJ0aWNhbCByZXRyYWNlIGVuZCAqLworIwkJZGVmaW5lIE5WX0NJT19DUl9WUkVfM18wCQkzOjAKKyMJZGVmaW5lIE5WX0NJT19DUl9WREVfSU5ERVgJCTB4MTIJLyogdmVydGljYWwgZGlzcGxheSBlbmQgKi8KKyMJZGVmaW5lIE5WX0NJT19DUl9PRkZTRVRfSU5ERVgJCTB4MTMJLyogc2V0cyBzY3JlZW4gcGl0Y2ggKi8KKyMJZGVmaW5lIE5WX0NJT19DUl9VTElORV9JTkRFWAkJMHgxNAkvKiB1bmRlcmxpbmUgbG9jYXRpb24gKi8KKyMJZGVmaW5lIE5WX0NJT19DUl9WQlNfSU5ERVgJCTB4MTUJLyogdmVydGljYWwgYmxhbmsgc3RhcnQgKi8KKyMJZGVmaW5lIE5WX0NJT19DUl9WQkVfSU5ERVgJCTB4MTYJLyogdmVydGljYWwgYmxhbmsgZW5kICovCisjCWRlZmluZSBOVl9DSU9fQ1JfTU9ERV9JTkRFWAkJMHgxNwkvKiBjcnRjIG1vZGUgY29udHJvbCAqLworIwlkZWZpbmUgTlZfQ0lPX0NSX0xDT01QX0lOREVYCQkweDE4CS8qIGxpbmUgY29tcGFyZSAqLworCS8qIEV4dGVuZGVkIFZHQSBDUlRDIHJlZ2lzdGVycyAqLworIwlkZWZpbmUgTlZfQ0lPX0NSRV9SUEMwX0lOREVYCQkweDE5CS8qIHJlcGFpbnQgY29udHJvbCAwICovCisjCQlkZWZpbmUgTlZfQ0lPX0NSRV9SUEMwX09GRlNFVF8xMF84CTc6NQorIwlkZWZpbmUgTlZfQ0lPX0NSRV9SUEMxX0lOREVYCQkweDFhCS8qIHJlcGFpbnQgY29udHJvbCAxICovCisjCQlkZWZpbmUgTlZfQ0lPX0NSRV9SUEMxX0xBUkdFCQkyOjIKKyMJZGVmaW5lIE5WX0NJT19DUkVfRkZfSU5ERVgJCTB4MWIJLyogZmlmbyBjb250cm9sICovCisjCWRlZmluZSBOVl9DSU9fQ1JFX0VOSF9JTkRFWAkJMHgxYwkvKiBlbmhhbmNlZD8gKi8KKyMJZGVmaW5lIE5WX0NJT19TUl9MT0NLX0lOREVYCQkweDFmCS8qIGNydGMgbG9jayAqLworIwkJZGVmaW5lIE5WX0NJT19TUl9VTkxPQ0tfUldfVkFMVUUJMHg1NworIwkJZGVmaW5lIE5WX0NJT19TUl9MT0NLX1ZBTFVFCQkweDk5CisjCWRlZmluZSBOVl9DSU9fQ1JFX0ZGTFdNX19JTkRFWAkJMHgyMAkvKiBmaWZvIGxvdyB3YXRlciBtYXJrICovCisjCWRlZmluZSBOVl9DSU9fQ1JFXzIxCQkJMHgyMQkvKiB2Z2Egc2hhZG93IGNydGMgbG9jayAqLworIwlkZWZpbmUgTlZfQ0lPX0NSRV9MU1JfSU5ERVgJCTB4MjUJLyogPyAqLworIwkJZGVmaW5lIE5WX0NJT19DUkVfTFNSX1ZEVF8xMAkJMDowCisjCQlkZWZpbmUgTlZfQ0lPX0NSRV9MU1JfVkRFXzEwCQkxOjEKKyMJCWRlZmluZSBOVl9DSU9fQ1JFX0xTUl9WUlNfMTAJCTI6MgorIwkJZGVmaW5lIE5WX0NJT19DUkVfTFNSX1ZCU18xMAkJMzozCisjCQlkZWZpbmUgTlZfQ0lPX0NSRV9MU1JfSEJFXzYJCTQ6NAorIwlkZWZpbmUgTlZfQ0lPX0NSX0FSWF9JTkRFWAkJMHgyNgkvKiBhdHRyaWJ1dGUgaW5kZXggLS0gcm8gY29weSBvZiAweDYwLjNjMCAqLworIwlkZWZpbmUgTlZfQ0lPX0NSRV9DSElQX0lEX0lOREVYCQkweDI3CS8qIGNoaXAgcmV2aXNpb24gKi8KKyMJZGVmaW5lIE5WX0NJT19DUkVfUElYRUxfSU5ERVgJCTB4MjgKKyMJCWRlZmluZSBOVl9DSU9fQ1JFX1BJWEVMX0ZPUk1BVAkJMTowCisjCWRlZmluZSBOVl9DSU9fQ1JFX0hFQl9fSU5ERVgJCTB4MmQJLyogaG9yaXpvbnRhbCBleHRyYSBiaXRzPyAqLworIwkJZGVmaW5lIE5WX0NJT19DUkVfSEVCX0hEVF84CQkwOjAKKyMJCWRlZmluZSBOVl9DSU9fQ1JFX0hFQl9IREVfOAkJMToxCisjCQlkZWZpbmUgTlZfQ0lPX0NSRV9IRUJfSEJTXzgJCTI6MgorIwkJZGVmaW5lIE5WX0NJT19DUkVfSEVCX0hSU184CQkzOjMKKyMJCWRlZmluZSBOVl9DSU9fQ1JFX0hFQl9JTENfOAkJNDo0CisjCWRlZmluZSBOVl9DSU9fQ1JFXzJFCQkJMHgyZQkvKiBzb21lIHNjcmF0Y2ggb3IgZHVtbXkgcmVnIHRvIGZvcmNlIHdyaXRlcyB0byBzaW5rIGluICovCisjCWRlZmluZSBOVl9DSU9fQ1JFX0hDVVJfQUREUjJfSU5ERVgJMHgyZgkvKiBjdXJzb3IgKi8KKyMJZGVmaW5lIE5WX0NJT19DUkVfSENVUl9BRERSMF9JTkRFWAkweDMwCQkvKiBwaXhtYXAgKi8KKyMJCWRlZmluZSBOVl9DSU9fQ1JFX0hDVVJfQUREUjBfQURSCTY6MAorIwkJZGVmaW5lIE5WX0NJT19DUkVfSENVUl9BU0kJCTc6NworIwlkZWZpbmUgTlZfQ0lPX0NSRV9IQ1VSX0FERFIxX0lOREVYCTB4MzEJCQkvKiBhZGRyZXNzICovCisjCQlkZWZpbmUgTlZfQ0lPX0NSRV9IQ1VSX0FERFIxX0VOQUJMRQkwOjAKKyMJCWRlZmluZSBOVl9DSU9fQ1JFX0hDVVJfQUREUjFfQ1VSX0RCTAkxOjEKKyMJCWRlZmluZSBOVl9DSU9fQ1JFX0hDVVJfQUREUjFfQURSCTc6MgorIwlkZWZpbmUgTlZfQ0lPX0NSRV9MQ0RfX0lOREVYCQkweDMzCisjCQlkZWZpbmUgTlZfQ0lPX0NSRV9MQ0RfTENEX1NFTEVDVAkwOjAKKyMJZGVmaW5lIE5WX0NJT19DUkVfRERDMF9TVEFUVVNfX0lOREVYCTB4MzYKKyMJZGVmaW5lIE5WX0NJT19DUkVfRERDMF9XUl9fSU5ERVgJMHgzNworIwlkZWZpbmUgTlZfQ0lPX0NSRV9JTEFDRV9fSU5ERVgJCTB4MzkJLyogaW50ZXJsYWNlICovCisjCWRlZmluZSBOVl9DSU9fQ1JFX1NDUkFUQ0gzX19JTkRFWAkweDNiCisjCWRlZmluZSBOVl9DSU9fQ1JFX1NDUkFUQ0g0X19JTkRFWAkweDNjCisjCWRlZmluZSBOVl9DSU9fQ1JFX0REQ19TVEFUVVNfX0lOREVYCTB4M2UKKyMJZGVmaW5lIE5WX0NJT19DUkVfRERDX1dSX19JTkRFWAkJMHgzZgorIwlkZWZpbmUgTlZfQ0lPX0NSRV9FQlJfSU5ERVgJCTB4NDEJLyogZXh0cmEgYml0cyA/ICh2ZXJ0aWNhbCkgKi8KKyMJCWRlZmluZSBOVl9DSU9fQ1JFX0VCUl9WRFRfMTEJCTA6MAorIwkJZGVmaW5lIE5WX0NJT19DUkVfRUJSX1ZERV8xMQkJMjoyCisjCQlkZWZpbmUgTlZfQ0lPX0NSRV9FQlJfVlJTXzExCQk0OjQKKyMJCWRlZmluZSBOVl9DSU9fQ1JFX0VCUl9WQlNfMTEJCTY6NgorIwlkZWZpbmUgTlZfQ0lPX0NSRV80MwkJCTB4NDMKKyMJZGVmaW5lIE5WX0NJT19DUkVfNDQJCQkweDQ0CS8qIGhlYWQgY29udHJvbCAqLworIwlkZWZpbmUgTlZfQ0lPX0NSRV9DU0IJCQkweDQ1CS8qIGNvbG91ciBzYXR1cmF0aW9uIGJvb3N0ICovCisjCWRlZmluZSBOVl9DSU9fQ1JFX1JDUgkJCTB4NDYKKyMJCWRlZmluZSBOVl9DSU9fQ1JFX1JDUl9FTkRJQU5fQklHCTc6NworIwlkZWZpbmUgTlZfQ0lPX0NSRV80NwkJCTB4NDcJLyogZXh0ZW5kZWQgZmlmbyBsd20sIHVzZWQgb24gbnYzMCsgKi8KKyMJZGVmaW5lIE5WX0NJT19DUkVfNDkJCQkweDQ5CisjCWRlZmluZSBOVl9DSU9fQ1JFXzRCCQkJMHg0YgkvKiBnaXZlbiBwYXR0ZXJucyBpbiAweFsyLTNdW2EtY10gcmVncywgcHJvYmFibHkgc2NyYXRjaCA2ICovCisjCWRlZmluZSBOVl9DSU9fQ1JFX1RWT1VUX0xBVEVOQ1kJCTB4NTIKKyMJZGVmaW5lIE5WX0NJT19DUkVfNTMJCQkweDUzCS8qIGBmcF9odGltaW5nJyBhY2NvcmRpbmcgdG8gSGFpa3UgKi8KKyMJZGVmaW5lIE5WX0NJT19DUkVfNTQJCQkweDU0CS8qIGBmcF92dGltaW5nJyBhY2NvcmRpbmcgdG8gSGFpa3UgKi8KKyMJZGVmaW5lIE5WX0NJT19DUkVfNTcJCQkweDU3CS8qIGluZGV4IHJlZyBmb3IgY3I1OCAqLworIwlkZWZpbmUgTlZfQ0lPX0NSRV81OAkJCTB4NTgJLyogZGF0YSByZWcgZm9yIGNyNTcgKi8KKyMJZGVmaW5lIE5WX0NJT19DUkVfNTkJCQkweDU5CS8qIHJlbGF0ZWQgdG8gb24vb2ZmLWNoaXAtbmVzcyBvZiBkaWdpdGFsIG91dHB1dHMgKi8KKyMJZGVmaW5lIE5WX0NJT19DUkVfNUIJCQkweDVCCS8qIG5ld2VyIGNvbG91ciBzYXR1cmF0aW9uIHJlZyAqLworIwlkZWZpbmUgTlZfQ0lPX0NSRV84NQkJCTB4ODUKKyMJZGVmaW5lIE5WX0NJT19DUkVfODYJCQkweDg2CisjZGVmaW5lIE5WX1BSTUNJT19JTlAwX19DT0xPUgkJMHgwMDYwMTNkYQorCisjZGVmaW5lIE5WX1BSQU1EQUNfQ1VfU1RBUlRfUE9TCQkJCTB4MDA2ODAzMDAKKyMJZGVmaW5lIE5WX1BSQU1EQUNfQ1VfU1RBUlRfUE9TX1gJCQkxNTowCisjCWRlZmluZSBOVl9QUkFNREFDX0NVX1NUQVJUX1BPU19ZCQkJMzE6MTYKKyNkZWZpbmUgTlZfUkFNREFDX05WMTBfQ1VSU1lOQwkJCQkweDAwNjgwNDA0CisKKyNkZWZpbmUgTlZfUFJBTURBQ19OVlBMTF9DT0VGRgkJCQkweDAwNjgwNTAwCisjZGVmaW5lIE5WX1BSQU1EQUNfTVBMTF9DT0VGRgkJCQkweDAwNjgwNTA0CisjZGVmaW5lIE5WX1BSQU1EQUNfVlBMTF9DT0VGRgkJCQkweDAwNjgwNTA4CisjCWRlZmluZSBOVjMwX1JBTURBQ19FTkFCTEVfVkNPMgkJCQkoOCA8PCA0KQorCisjZGVmaW5lIE5WX1BSQU1EQUNfUExMX0NPRUZGX1NFTEVDVAkJCTB4MDA2ODA1MGMKKyMJZGVmaW5lIE5WX1BSQU1EQUNfUExMX0NPRUZGX1NFTEVDVF9VU0VfVlBMTDJfVFJVRQkoNCA8PCAwKQorIwlkZWZpbmUgTlZfUFJBTURBQ19QTExfQ09FRkZfU0VMRUNUX1NPVVJDRV9QUk9HX01QTEwJKDEgPDwgOCkKKyMJZGVmaW5lIE5WX1BSQU1EQUNfUExMX0NPRUZGX1NFTEVDVF9TT1VSQ0VfUFJPR19WUExMCSgyIDw8IDgpCisjCWRlZmluZSBOVl9QUkFNREFDX1BMTF9DT0VGRl9TRUxFQ1RfU09VUkNFX1BST0dfTlZQTEwJKDQgPDwgOCkKKyMJZGVmaW5lIE5WX1BSQU1EQUNfUExMX0NPRUZGX1NFTEVDVF9QTExfU09VUkNFX1ZQTEwyCSg4IDw8IDgpCisjCWRlZmluZSBOVl9QUkFNREFDX1BMTF9DT0VGRl9TRUxFQ1RfVFZfVlNDTEsxCQkoMSA8PCAxNikKKyMJZGVmaW5lIE5WX1BSQU1EQUNfUExMX0NPRUZGX1NFTEVDVF9UVl9QQ0xLMQkJKDIgPDwgMTYpCisjCWRlZmluZSBOVl9QUkFNREFDX1BMTF9DT0VGRl9TRUxFQ1RfVFZfVlNDTEsyCQkoNCA8PCAxNikKKyMJZGVmaW5lIE5WX1BSQU1EQUNfUExMX0NPRUZGX1NFTEVDVF9UVl9QQ0xLMgkJKDggPDwgMTYpCisjCWRlZmluZSBOVl9QUkFNREFDX1BMTF9DT0VGRl9TRUxFQ1RfVFZfQ0xLX1NPVVJDRV9WSVAJKDEgPDwgMjApCisjCWRlZmluZSBOVl9QUkFNREFDX1BMTF9DT0VGRl9TRUxFQ1RfVkNMS19SQVRJT19EQjIJKDEgPDwgMjgpCisjCWRlZmluZSBOVl9QUkFNREFDX1BMTF9DT0VGRl9TRUxFQ1RfVkNMSzJfUkFUSU9fREIyCSgyIDw8IDI4KQorCisjZGVmaW5lIE5WX1BSQU1EQUNfUExMX1NFVFVQX0NPTlRST0wJCQkweDAwNjgwNTEwCisjZGVmaW5lIE5WX1JBTURBQ19WUExMMgkJCQkJMHgwMDY4MDUyMAorI2RlZmluZSBOVl9QUkFNREFDX1NFTF9DTEsJCQkJMHgwMDY4MDUyNAorI2RlZmluZSBOVl9SQU1EQUNfRElUSEVSX05WMTEJCQkJMHgwMDY4MDUyOAorI2RlZmluZSBOVl9QUkFNREFDX0RBQ0NMSwkJCQkweDAwNjgwNTJjCisjCWRlZmluZSBOVl9QUkFNREFDX0RBQ0NMS19TRUxfREFDQ0xLCQkJKDEgPDwgMCkKKworI2RlZmluZSBOVl9SQU1EQUNfTlZQTExfQgkJCQkweDAwNjgwNTcwCisjZGVmaW5lIE5WX1JBTURBQ19NUExMX0IJCQkJMHgwMDY4MDU3NAorI2RlZmluZSBOVl9SQU1EQUNfVlBMTF9CCQkJCTB4MDA2ODA1NzgKKyNkZWZpbmUgTlZfUkFNREFDX1ZQTEwyX0IJCQkJMHgwMDY4MDU3YworIwlkZWZpbmUgTlYzMV9SQU1EQUNfRU5BQkxFX1ZDTzIJCQkJKDggPDwgMjgpCisjZGVmaW5lIE5WX1BSQU1EQUNfNTgwCQkJCQkweDAwNjgwNTgwCisjCWRlZmluZSBOVl9SQU1EQUNfNTgwX1ZQTEwxX0FDVElWRQkJCSgxIDw8IDgpCisjCWRlZmluZSBOVl9SQU1EQUNfNTgwX1ZQTEwyX0FDVElWRQkJCSgxIDw8IDI4KQorCisjZGVmaW5lIE5WX1BSQU1EQUNfR0VORVJBTF9DT05UUk9MCQkJMHgwMDY4MDYwMAorIwlkZWZpbmUgTlZfUFJBTURBQ19HRU5FUkFMX0NPTlRST0xfUElYTUlYX09OCQkoMyA8PCA0KQorIwlkZWZpbmUgTlZfUFJBTURBQ19HRU5FUkFMX0NPTlRST0xfVkdBX1NUQVRFX1NFTAkJKDEgPDwgOCkKKyMJZGVmaW5lIE5WX1BSQU1EQUNfR0VORVJBTF9DT05UUk9MX0FMVF9NT0RFX1NFTAkJKDEgPDwgMTIpCisjCWRlZmluZSBOVl9QUkFNREFDX0dFTkVSQUxfQ09OVFJPTF9URVJNSU5BVElPTl83NU9ITQkoMiA8PCAxNikKKyMJZGVmaW5lIE5WX1BSQU1EQUNfR0VORVJBTF9DT05UUk9MX0JQQ184QklUUwkJKDEgPDwgMjApCisjCWRlZmluZSBOVl9QUkFNREFDX0dFTkVSQUxfQ09OVFJPTF9QSVBFX0xPTkcJCSgyIDw8IDI4KQorI2RlZmluZSBOVl9QUkFNREFDX1RFU1RfQ09OVFJPTAkJCQkweDAwNjgwNjA4CisjCWRlZmluZSBOVl9QUkFNREFDX1RFU1RfQ09OVFJPTF9UUF9JTlNfRU5fQVNTRVJURUQJKDEgPDwgMTIpCisjCWRlZmluZSBOVl9QUkFNREFDX1RFU1RfQ09OVFJPTF9QV1JEV05fREFDX09GRgkJKDEgPDwgMTYpCisjCWRlZmluZSBOVl9QUkFNREFDX1RFU1RfQ09OVFJPTF9TRU5TRUJfQUxMSEkJCSgxIDw8IDI4KQorI2RlZmluZSBOVl9QUkFNREFDX1RFU1RQT0lOVF9EQVRBCQkJMHgwMDY4MDYxMAorIwlkZWZpbmUgTlZfUFJBTURBQ19URVNUUE9JTlRfREFUQV9OT1RCTEFOSwkJKDggPDwgMjgpCisjZGVmaW5lIE5WX1BSQU1EQUNfNjMwCQkJCQkweDAwNjgwNjMwCisjZGVmaW5lIE5WX1BSQU1EQUNfNjM0CQkJCQkweDAwNjgwNjM0CisKKyNkZWZpbmUgTlZfUFJBTURBQ19UVl9TRVRVUAkJCQkweDAwNjgwNzAwCisjZGVmaW5lIE5WX1BSQU1EQUNfVFZfVlRPVEFMCQkJCTB4MDA2ODA3MjAKKyNkZWZpbmUgTlZfUFJBTURBQ19UVl9WU0tFVwkJCQkweDAwNjgwNzI0CisjZGVmaW5lIE5WX1BSQU1EQUNfVFZfVlNZTkNfREVMQVkJCQkweDAwNjgwNzI4CisjZGVmaW5lIE5WX1BSQU1EQUNfVFZfSFRPVEFMCQkJCTB4MDA2ODA3MmMKKyNkZWZpbmUgTlZfUFJBTURBQ19UVl9IU0tFVwkJCQkweDAwNjgwNzMwCisjZGVmaW5lIE5WX1BSQU1EQUNfVFZfSFNZTkNfREVMQVkJCQkweDAwNjgwNzM0CisjZGVmaW5lIE5WX1BSQU1EQUNfVFZfSFNZTkNfREVMQVkyCQkJMHgwMDY4MDczOAorCisjZGVmaW5lIE5WX1BSQU1EQUNfVFZfU0VUVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2ODA3MDAKKworI2RlZmluZSBOVl9QUkFNREFDX0ZQX1ZESVNQTEFZX0VORAkJCTB4MDA2ODA4MDAKKyNkZWZpbmUgTlZfUFJBTURBQ19GUF9WVE9UQUwJCQkJMHgwMDY4MDgwNAorI2RlZmluZSBOVl9QUkFNREFDX0ZQX1ZDUlRDCQkJCTB4MDA2ODA4MDgKKyNkZWZpbmUgTlZfUFJBTURBQ19GUF9WU1lOQ19TVEFSVAkJCTB4MDA2ODA4MGMKKyNkZWZpbmUgTlZfUFJBTURBQ19GUF9WU1lOQ19FTkQJCQkJMHgwMDY4MDgxMAorI2RlZmluZSBOVl9QUkFNREFDX0ZQX1ZWQUxJRF9TVEFSVAkJCTB4MDA2ODA4MTQKKyNkZWZpbmUgTlZfUFJBTURBQ19GUF9WVkFMSURfRU5ECQkJMHgwMDY4MDgxOAorI2RlZmluZSBOVl9QUkFNREFDX0ZQX0hESVNQTEFZX0VORAkJCTB4MDA2ODA4MjAKKyNkZWZpbmUgTlZfUFJBTURBQ19GUF9IVE9UQUwJCQkJMHgwMDY4MDgyNAorI2RlZmluZSBOVl9QUkFNREFDX0ZQX0hDUlRDCQkJCTB4MDA2ODA4MjgKKyNkZWZpbmUgTlZfUFJBTURBQ19GUF9IU1lOQ19TVEFSVAkJCTB4MDA2ODA4MmMKKyNkZWZpbmUgTlZfUFJBTURBQ19GUF9IU1lOQ19FTkQJCQkJMHgwMDY4MDgzMAorI2RlZmluZSBOVl9QUkFNREFDX0ZQX0hWQUxJRF9TVEFSVAkJCTB4MDA2ODA4MzQKKyNkZWZpbmUgTlZfUFJBTURBQ19GUF9IVkFMSURfRU5ECQkJMHgwMDY4MDgzOAorCisjZGVmaW5lIE5WX1JBTURBQ19GUF9ESVRIRVIJCQkJMHgwMDY4MDgzYworI2RlZmluZSBOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0wJCQkweDAwNjgwODQ4CisjCWRlZmluZSBOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0xfVlNZTkNfUE9TCQkoMSA8PCAwKQorIwlkZWZpbmUgTlZfUFJBTURBQ19GUF9UR19DT05UUk9MX1ZTWU5DX0RJU0FCTEUJCSgyIDw8IDApCisjCWRlZmluZSBOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0xfSFNZTkNfUE9TCQkoMSA8PCA0KQorIwlkZWZpbmUgTlZfUFJBTURBQ19GUF9UR19DT05UUk9MX0hTWU5DX0RJU0FCTEUJCSgyIDw8IDQpCisjCWRlZmluZSBOVl9QUkFNREFDX0ZQX1RHX0NPTlRST0xfTU9ERV9TQ0FMRQkJKDAgPDwgOCkKKyMJZGVmaW5lIE5WX1BSQU1EQUNfRlBfVEdfQ09OVFJPTF9NT0RFX0NFTlRFUgkJKDEgPDwgOCkKKyMJZGVmaW5lIE5WX1BSQU1EQUNfRlBfVEdfQ09OVFJPTF9NT0RFX05BVElWRQkJKDIgPDwgOCkKKyMJZGVmaW5lIE5WX1BSQU1EQUNfRlBfVEdfQ09OVFJPTF9SRUFEX1BST0cJCSgxIDw8IDIwKQorIwlkZWZpbmUgTlZfUFJBTURBQ19GUF9UR19DT05UUk9MX1dJRFRIXzEyCQkoMSA8PCAyNCkKKyMJZGVmaW5lIE5WX1BSQU1EQUNfRlBfVEdfQ09OVFJPTF9ESVNQRU5fUE9TCQkoMSA8PCAyOCkKKyMJZGVmaW5lIE5WX1BSQU1EQUNfRlBfVEdfQ09OVFJPTF9ESVNQRU5fRElTQUJMRQkJKDIgPDwgMjgpCisjZGVmaW5lIE5WX1BSQU1EQUNfRlBfTUFSR0lOX0NPTE9SCQkJMHgwMDY4MDg0YworI2RlZmluZSBOVl9QUkFNREFDXzg1MAkJCQkJMHgwMDY4MDg1MAorI2RlZmluZSBOVl9QUkFNREFDXzg1QwkJCQkJMHgwMDY4MDg1YworI2RlZmluZSBOVl9QUkFNREFDX0ZQX0RFQlVHXzAJCQkJMHgwMDY4MDg4MAorIwlkZWZpbmUgTlZfUFJBTURBQ19GUF9ERUJVR18wX1hTQ0FMRV9FTkFCTEUJCSgxIDw8IDApCisjCWRlZmluZSBOVl9QUkFNREFDX0ZQX0RFQlVHXzBfWVNDQUxFX0VOQUJMRQkJKDEgPDwgNCkKKy8qIFRoaXMgZG9lc24ndCBzZWVtIHRvIGJlIGVzc2VudGlhbCBmb3IgdG1kcywgYnV0IHN0aWxsIG9mdGVuIHNldCAqLworIwlkZWZpbmUgTlZfUkFNREFDX0ZQX0RFQlVHXzBfVE1EU19FTkFCTEVECQkoOCA8PCA0KQorIwlkZWZpbmUgTlZfUFJBTURBQ19GUF9ERUJVR18wX1hJTlRFUlBfQklMSU5FQVIJCSgxIDw8IDgpCisjCWRlZmluZSBOVl9QUkFNREFDX0ZQX0RFQlVHXzBfWUlOVEVSUF9CSUxJTkVBUgkJKDEgPDwgMTIpCisjCWRlZmluZSBOVl9QUkFNREFDX0ZQX0RFQlVHXzBfWFdFSUdIVF9ST1VORAkJKDEgPDwgMjApCisjCWRlZmluZSBOVl9QUkFNREFDX0ZQX0RFQlVHXzBfWVdFSUdIVF9ST1VORAkJKDEgPDwgMjQpCisjICAgICAgIGRlZmluZSBOVl9QUkFNREFDX0ZQX0RFQlVHXzBfUFdSRE9XTl9GUENMSyAgICAgICAgICAgICAgKDEgPDwgMjgpCisjZGVmaW5lIE5WX1BSQU1EQUNfRlBfREVCVUdfMQkJCQkweDAwNjgwODg0CisjCWRlZmluZSBOVl9QUkFNREFDX0ZQX0RFQlVHXzFfWFNDQUxFX1ZBTFVFCQkxMTowCisjCWRlZmluZSBOVl9QUkFNREFDX0ZQX0RFQlVHXzFfWFNDQUxFX1RFU1RNT0RFX0VOQUJMRQkoMSA8PCAxMikKKyMJZGVmaW5lIE5WX1BSQU1EQUNfRlBfREVCVUdfMV9ZU0NBTEVfVkFMVUUJCTI3OjE2CisjCWRlZmluZSBOVl9QUkFNREFDX0ZQX0RFQlVHXzFfWVNDQUxFX1RFU1RNT0RFX0VOQUJMRQkoMSA8PCAyOCkKKyNkZWZpbmUgTlZfUFJBTURBQ19GUF9ERUJVR18yCQkJCTB4MDA2ODA4ODgKKyNkZWZpbmUgTlZfUFJBTURBQ19GUF9ERUJVR18zCQkJCTB4MDA2ODA4OEMKKworLyogc2VlIE5WX1BSQU1EQUNfSU5ESVJfVE1EUyBpbiBydWxlcy54bWwgKi8KKyNkZWZpbmUgTlZfUFJBTURBQ19GUF9UTURTX0NPTlRST0wJCQkweDAwNjgwOGIwCisjCWRlZmluZSBOVl9QUkFNREFDX0ZQX1RNRFNfQ09OVFJPTF9XUklURV9ESVNBQkxFCQkoMSA8PCAxNikKKyNkZWZpbmUgTlZfUFJBTURBQ19GUF9UTURTX0RBVEEJCQkJMHgwMDY4MDhiNAorCisjZGVmaW5lIE5WX1BSQU1EQUNfOEMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2ODA4YzAKKworLyogU29tZSBraW5kIG9mIHN3aXRjaCAqLworI2RlZmluZSBOVl9QUkFNREFDXzkwMAkJCQkJMHgwMDY4MDkwMAorI2RlZmluZSBOVl9QUkFNREFDX0EyMAkJCQkJMHgwMDY4MEEyMAorI2RlZmluZSBOVl9QUkFNREFDX0EyNAkJCQkJMHgwMDY4MEEyNAorI2RlZmluZSBOVl9QUkFNREFDX0EzNAkJCQkJMHgwMDY4MEEzNAorCisjZGVmaW5lIE5WX1BSQU1EQUNfQ1RWCQkJCQkweDAwNjgwYzAwCisKKy8qIG5hbWVzIGZhYnJpY2F0ZWQgZnJvbSBOVl9VU0VSX0RBQyBpbmZvICovCisjZGVmaW5lIE5WX1BSTURJT19QSVhFTF9NQVNLCQkweDAwNjgxM2M2CisjCWRlZmluZSBOVl9QUk1ESU9fUElYRUxfTUFTS19NQVNLCTB4ZmYKKyNkZWZpbmUgTlZfUFJNRElPX1JFQURfTU9ERV9BRERSRVNTCTB4MDA2ODEzYzcKKyNkZWZpbmUgTlZfUFJNRElPX1dSSVRFX01PREVfQUREUkVTUwkweDAwNjgxM2M4CisjZGVmaW5lIE5WX1BSTURJT19QQUxFVFRFX0RBVEEJCTB4MDA2ODEzYzkKKworI2RlZmluZSBOVl9QR1JBUEhfREVCVUdfMAkJMHgwMDQwMDA4MAorI2RlZmluZSBOVl9QR1JBUEhfREVCVUdfMQkJMHgwMDQwMDA4NAorI2RlZmluZSBOVl9QR1JBUEhfREVCVUdfMl9OVjA0CQkweDAwNDAwMDg4CisjZGVmaW5lIE5WX1BHUkFQSF9ERUJVR18yCQkweDAwNDAwNjIwCisjZGVmaW5lIE5WX1BHUkFQSF9ERUJVR18zCQkweDAwNDAwMDhjCisjZGVmaW5lIE5WX1BHUkFQSF9ERUJVR180CQkweDAwNDAwMDkwCisjZGVmaW5lIE5WX1BHUkFQSF9JTlRSCQkJMHgwMDQwMDEwMAorI2RlZmluZSBOVl9QR1JBUEhfSU5UUl9FTgkJMHgwMDQwMDE0MAorI2RlZmluZSBOVl9QR1JBUEhfQ1RYX0NPTlRST0wJCTB4MDA0MDAxNDQKKyNkZWZpbmUgTlZfUEdSQVBIX0NUWF9DT05UUk9MX05WMDQJMHgwMDQwMDE3MAorI2RlZmluZSBOVl9QR1JBUEhfQUJTX1VDTElQX1hNSU4JMHgwMDQwMDUzQworI2RlZmluZSBOVl9QR1JBUEhfQUJTX1VDTElQX1lNSU4JMHgwMDQwMDU0MAorI2RlZmluZSBOVl9QR1JBUEhfQUJTX1VDTElQX1hNQVgJMHgwMDQwMDU0NAorI2RlZmluZSBOVl9QR1JBUEhfQUJTX1VDTElQX1lNQVgJMHgwMDQwMDU0OAorI2RlZmluZSBOVl9QR1JBUEhfQkVUQV9BTkQJCTB4MDA0MDA2MDgKKyNkZWZpbmUgTlZfUEdSQVBIX0xJTUlUX1ZJT0xfUElYCTB4MDA0MDA2MTAKKyNkZWZpbmUgTlZfUEdSQVBIX0JPRkZTRVQwCQkweDAwNDAwNjQwCisjZGVmaW5lIE5WX1BHUkFQSF9CT0ZGU0VUMQkJMHgwMDQwMDY0NAorI2RlZmluZSBOVl9QR1JBUEhfQk9GRlNFVDIJCTB4MDA0MDA2NDgKKyNkZWZpbmUgTlZfUEdSQVBIX0JMSU1JVDAJCTB4MDA0MDA2ODQKKyNkZWZpbmUgTlZfUEdSQVBIX0JMSU1JVDEJCTB4MDA0MDA2ODgKKyNkZWZpbmUgTlZfUEdSQVBIX0JMSU1JVDIJCTB4MDA0MDA2OGMKKyNkZWZpbmUgTlZfUEdSQVBIX1NUQVRVUwkJMHgwMDQwMDcwMAorI2RlZmluZSBOVl9QR1JBUEhfU1VSRkFDRQkJMHgwMDQwMDcxMAorI2RlZmluZSBOVl9QR1JBUEhfU1RBVEUJCQkweDAwNDAwNzE0CisjZGVmaW5lIE5WX1BHUkFQSF9GSUZPCQkJMHgwMDQwMDcyMAorI2RlZmluZSBOVl9QR1JBUEhfUEFUVEVSTl9TSEFQRQkJMHgwMDQwMDgxMAorI2RlZmluZSBOVl9QR1JBUEhfVElMRQkJCTB4MDA0MDBiMDAKKworI2RlZmluZSBOVl9QVklERU9fSU5UUl9FTgkJMHgwMDAwODE0MAorI2RlZmluZSBOVl9QVklERU9fQlVGRkVSCQkweDAwMDA4NzAwCisjZGVmaW5lIE5WX1BWSURFT19TVE9QCQkJMHgwMDAwODcwNAorI2RlZmluZSBOVl9QVklERU9fVVZQTEFORV9CQVNFKGJ1ZmYpCSgweDAwMDA4ODAwKyhidWZmKSo0KQorI2RlZmluZSBOVl9QVklERU9fVVZQTEFORV9MSU1JVChidWZmKQkoMHgwMDAwODgwOCsoYnVmZikqNCkKKyNkZWZpbmUgTlZfUFZJREVPX1VWUExBTkVfT0ZGU0VUX0JVRkYoYnVmZikJKDB4MDAwMDg4MjArKGJ1ZmYpKjQpCisjZGVmaW5lIE5WX1BWSURFT19CQVNFKGJ1ZmYpCQkoMHgwMDAwODkwMCsoYnVmZikqNCkKKyNkZWZpbmUgTlZfUFZJREVPX0xJTUlUKGJ1ZmYpCQkoMHgwMDAwODkwOCsoYnVmZikqNCkKKyNkZWZpbmUgTlZfUFZJREVPX0xVTUlOQU5DRShidWZmKQkoMHgwMDAwODkxMCsoYnVmZikqNCkKKyNkZWZpbmUgTlZfUFZJREVPX0NIUk9NSU5BTkNFKGJ1ZmYpCSgweDAwMDA4OTE4KyhidWZmKSo0KQorI2RlZmluZSBOVl9QVklERU9fT0ZGU0VUX0JVRkYoYnVmZikJKDB4MDAwMDg5MjArKGJ1ZmYpKjQpCisjZGVmaW5lIE5WX1BWSURFT19TSVpFX0lOKGJ1ZmYpCQkoMHgwMDAwODkyOCsoYnVmZikqNCkKKyNkZWZpbmUgTlZfUFZJREVPX1BPSU5UX0lOKGJ1ZmYpCSgweDAwMDA4OTMwKyhidWZmKSo0KQorI2RlZmluZSBOVl9QVklERU9fRFNfRFgoYnVmZikJCSgweDAwMDA4OTM4KyhidWZmKSo0KQorI2RlZmluZSBOVl9QVklERU9fRFRfRFkoYnVmZikJCSgweDAwMDA4OTQwKyhidWZmKSo0KQorI2RlZmluZSBOVl9QVklERU9fUE9JTlRfT1VUKGJ1ZmYpCSgweDAwMDA4OTQ4KyhidWZmKSo0KQorI2RlZmluZSBOVl9QVklERU9fU0laRV9PVVQoYnVmZikJKDB4MDAwMDg5NTArKGJ1ZmYpKjQpCisjZGVmaW5lIE5WX1BWSURFT19GT1JNQVQoYnVmZikJCSgweDAwMDA4OTU4KyhidWZmKSo0KQorIwlkZWZpbmUgTlZfUFZJREVPX0ZPUk1BVF9QTEFOQVIJCQkoMSA8PCAwKQorIwlkZWZpbmUgTlZfUFZJREVPX0ZPUk1BVF9DT0xPUl9MRV9DUjhZQjhDQjhZQTgJKDEgPDwgMTYpCisjCWRlZmluZSBOVl9QVklERU9fRk9STUFUX0RJU1BMQVlfQ09MT1JfS0VZCSgxIDw8IDIwKQorIwlkZWZpbmUgTlZfUFZJREVPX0ZPUk1BVF9NQVRSSVhfSVRVUkJUNzA5CSgxIDw8IDI0KQorI2RlZmluZSBOVl9QVklERU9fQ09MT1JfS0VZCQkweDAwMDA4QjAwCisKKy8qIE5WMDQgb3ZlcmxheSBkZWZpbmVzIGZyb20gVklESVggJiBIYWlrdSAqLworI2RlZmluZSBOVl9QVklERU9fSU5UUl9FTl8wCQkweDAwNjgwMTQwCisjZGVmaW5lIE5WX1BWSURFT19TVEVQX1NJWkUJCTB4MDA2ODAyMDAKKyNkZWZpbmUgTlZfUFZJREVPX0NPTlRST0xfWQkJMHgwMDY4MDIwNAorI2RlZmluZSBOVl9QVklERU9fQ09OVFJPTF9YCQkweDAwNjgwMjA4CisjZGVmaW5lIE5WX1BWSURFT19CVUZGMF9TVEFSVF9BRERSRVNTCTB4MDA2ODAyMGMKKyNkZWZpbmUgTlZfUFZJREVPX0JVRkYwX1BJVENIX0xFTkdUSAkweDAwNjgwMjE0CisjZGVmaW5lIE5WX1BWSURFT19CVUZGMF9PRkZTRVQJCTB4MDA2ODAyMWMKKyNkZWZpbmUgTlZfUFZJREVPX0JVRkYxX1NUQVJUX0FERFJFU1MJMHgwMDY4MDIxMAorI2RlZmluZSBOVl9QVklERU9fQlVGRjFfUElUQ0hfTEVOR1RICTB4MDA2ODAyMTgKKyNkZWZpbmUgTlZfUFZJREVPX0JVRkYxX09GRlNFVAkJMHgwMDY4MDIyMAorI2RlZmluZSBOVl9QVklERU9fT0VfU1RBVEUJCTB4MDA2ODAyMjQKKyNkZWZpbmUgTlZfUFZJREVPX1NVX1NUQVRFCQkweDAwNjgwMjI4CisjZGVmaW5lIE5WX1BWSURFT19STV9TVEFURQkJMHgwMDY4MDIyYworI2RlZmluZSBOVl9QVklERU9fV0lORE9XX1NUQVJUCQkweDAwNjgwMjMwCisjZGVmaW5lIE5WX1BWSURFT19XSU5ET1dfU0laRQkJMHgwMDY4MDIzNAorI2RlZmluZSBOVl9QVklERU9fRklGT19USFJFU19TSVpFCTB4MDA2ODAyMzgKKyNkZWZpbmUgTlZfUFZJREVPX0ZJRk9fQlVSU1RfTEVOR1RICTB4MDA2ODAyM2MKKyNkZWZpbmUgTlZfUFZJREVPX0tFWQkJCTB4MDA2ODAyNDAKKyNkZWZpbmUgTlZfUFZJREVPX09WRVJMQVkJCTB4MDA2ODAyNDQKKyNkZWZpbmUgTlZfUFZJREVPX1JFRF9DU0NfT0ZGU0VUCTB4MDA2ODAyODAKKyNkZWZpbmUgTlZfUFZJREVPX0dSRUVOX0NTQ19PRkZTRVQJMHgwMDY4MDI4NAorI2RlZmluZSBOVl9QVklERU9fQkxVRV9DU0NfT0ZGU0VUCTB4MDA2ODAyODgKKyNkZWZpbmUgTlZfUFZJREVPX0NTQ19BREpVU1QJCTB4MDA2ODAyOGMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5jCmluZGV4IDI4MDc3MjQuLmM1YzQ1ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5jCkBAIC0xMjEsNyArMTIxLDcgQEAKIE1PRFVMRV9QQVJNX0RFU0ModHYsICJUViBlbmFibGUgKDAgPSBkaXNhYmxlKSIpOwogbW9kdWxlX3BhcmFtX25hbWVkKHR2LCByYWRlb25fdHYsIGludCwgMDQ0NCk7CiAKLU1PRFVMRV9QQVJNX0RFU0MocjR4eF9hdG9tLCAiU2VsZWN0IG5ldyBQTEwgY29kZSBmb3IgQVZJVk8gY2hpcHMiKTsKK01PRFVMRV9QQVJNX0RFU0MobmV3X3BsbCwgIlNlbGVjdCBuZXcgUExMIGNvZGUgZm9yIEFWSVZPIGNoaXBzIik7CiBtb2R1bGVfcGFyYW1fbmFtZWQobmV3X3BsbCwgcmFkZW9uX25ld19wbGwsIGludCwgMDQ0NCk7CiAKIHN0YXRpYyBpbnQgcmFkZW9uX3N1c3BlbmQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9vYmplY3QuYwppbmRleCAyMDQwOTM3Li41NDRlMThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9vYmplY3QuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9vYmplY3QuYwpAQCAtNTYsMjUgKzU2LDYgQEAKIAlrZnJlZShibyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyIHJhZGVvbl90dG1fZmxhZ3NfZnJvbV9kb21haW4odTMyIGRvbWFpbikKLXsKLQl1MzIgZmxhZ3MgPSAwOwotCi0JaWYgKGRvbWFpbiAmIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0pIHsKLQkJZmxhZ3MgfD0gVFRNX1BMX0ZMQUdfVlJBTSB8IFRUTV9QTF9GTEFHX1dDIHwgVFRNX1BMX0ZMQUdfVU5DQUNIRUQ7Ci0JfQotCWlmIChkb21haW4gJiBSQURFT05fR0VNX0RPTUFJTl9HVFQpIHsKLQkJZmxhZ3MgfD0gVFRNX1BMX0ZMQUdfVFQgfCBUVE1fUExfTUFTS19DQUNISU5HOwotCX0KLQlpZiAoZG9tYWluICYgUkFERU9OX0dFTV9ET01BSU5fQ1BVKSB7Ci0JCWZsYWdzIHw9IFRUTV9QTF9GTEFHX1NZU1RFTSB8IFRUTV9QTF9NQVNLX0NBQ0hJTkc7Ci0JfQotCWlmICghZmxhZ3MpIHsKLQkJZmxhZ3MgfD0gVFRNX1BMX0ZMQUdfU1lTVEVNIHwgVFRNX1BMX01BU0tfQ0FDSElORzsKLQl9Ci0JcmV0dXJuIGZsYWdzOwotfQotCiB2b2lkIHJhZGVvbl90dG1fcGxhY2VtZW50X2Zyb21fZG9tYWluKHN0cnVjdCByYWRlb25fYm8gKnJibywgdTMyIGRvbWFpbikKIHsKIAl1MzIgYyA9IDA7CkBAIC0xMDAsNyArODEsNiBAQAogewogCXN0cnVjdCByYWRlb25fYm8gKmJvOwogCWVudW0gdHRtX2JvX3R5cGUgdHlwZTsKLQl1MzIgZmxhZ3M7CiAJaW50IHI7CiAKIAlpZiAodW5saWtlbHkocmRldi0+bW1hbi5iZGV2LmRldl9tYXBwaW5nID09IE5VTEwpKSB7CkBAIC0xMjAsMTYgKzEwMCwxNiBAQAogCWJvLT5zdXJmYWNlX3JlZyA9IC0xOwogCUlOSVRfTElTVF9IRUFEKCZiby0+bGlzdCk7CiAKLQlmbGFncyA9IHJhZGVvbl90dG1fZmxhZ3NfZnJvbV9kb21haW4oZG9tYWluKTsKKwlyYWRlb25fdHRtX3BsYWNlbWVudF9mcm9tX2RvbWFpbihibywgZG9tYWluKTsKIAkvKiBLZXJuZWwgYWxsb2NhdGlvbiBhcmUgdW5pbnRlcnJ1cHRpYmxlICovCi0JciA9IHR0bV9idWZmZXJfb2JqZWN0X2luaXQoJnJkZXYtPm1tYW4uYmRldiwgJmJvLT50Ym8sIHNpemUsIHR5cGUsCi0JCQkJCWZsYWdzLCAwLCAwLCAha2VybmVsLCBOVUxMLCBzaXplLAotCQkJCQkmcmFkZW9uX3R0bV9ib19kZXN0cm95KTsKKwlyID0gdHRtX2JvX2luaXQoJnJkZXYtPm1tYW4uYmRldiwgJmJvLT50Ym8sIHNpemUsIHR5cGUsCisJCQkmYm8tPnBsYWNlbWVudCwgMCwgMCwgIWtlcm5lbCwgTlVMTCwgc2l6ZSwKKwkJCSZyYWRlb25fdHRtX2JvX2Rlc3Ryb3kpOwogCWlmICh1bmxpa2VseShyICE9IDApKSB7CiAJCWlmIChyICE9IC1FUkVTVEFSVFNZUykKIAkJCWRldl9lcnIocmRldi0+ZGV2LAotCQkJCSJvYmplY3RfaW5pdCBmYWlsZWQgZm9yICglbGQsIDB4JTA4WClcbiIsCi0JCQkJc2l6ZSwgZmxhZ3MpOworCQkJCSJvYmplY3RfaW5pdCBmYWlsZWQgZm9yICglbHUsIDB4JTA4WClcbiIsCisJCQkJc2l6ZSwgZG9tYWluKTsKIAkJcmV0dXJuIHI7CiAJfQogCSpib19wdHIgPSBibzsKQEAgLTE5OSw3ICsxNzksNyBAQAogCXJhZGVvbl90dG1fcGxhY2VtZW50X2Zyb21fZG9tYWluKGJvLCBkb21haW4pOwogCWZvciAoaSA9IDA7IGkgPCBiby0+cGxhY2VtZW50Lm51bV9wbGFjZW1lbnQ7IGkrKykKIAkJYm8tPnBsYWNlbWVudHNbaV0gfD0gVFRNX1BMX0ZMQUdfTk9fRVZJQ1Q7Ci0JciA9IHR0bV9idWZmZXJfb2JqZWN0X3ZhbGlkYXRlKCZiby0+dGJvLCAmYm8tPnBsYWNlbWVudCwgZmFsc2UsIGZhbHNlKTsKKwlyID0gdHRtX2JvX3ZhbGlkYXRlKCZiby0+dGJvLCAmYm8tPnBsYWNlbWVudCwgZmFsc2UsIGZhbHNlKTsKIAlpZiAobGlrZWx5KHIgPT0gMCkpIHsKIAkJYm8tPnBpbl9jb3VudCA9IDE7CiAJCWlmIChncHVfYWRkciAhPSBOVUxMKQpAQCAtMjIzLDcgKzIwMyw3IEBACiAJCXJldHVybiAwOwogCWZvciAoaSA9IDA7IGkgPCBiby0+cGxhY2VtZW50Lm51bV9wbGFjZW1lbnQ7IGkrKykKIAkJYm8tPnBsYWNlbWVudHNbaV0gJj0gflRUTV9QTF9GTEFHX05PX0VWSUNUOwotCXIgPSB0dG1fYnVmZmVyX29iamVjdF92YWxpZGF0ZSgmYm8tPnRibywgJmJvLT5wbGFjZW1lbnQsIGZhbHNlLCBmYWxzZSk7CisJciA9IHR0bV9ib192YWxpZGF0ZSgmYm8tPnRibywgJmJvLT5wbGFjZW1lbnQsIGZhbHNlLCBmYWxzZSk7CiAJaWYgKHVubGlrZWx5KHIgIT0gMCkpCiAJCWRldl9lcnIoYm8tPnJkZXYtPmRldiwgIiVwIHZhbGlkYXRlIGZhaWxlZCBmb3IgdW5waW5cbiIsIGJvKTsKIAlyZXR1cm4gcjsKQEAgLTMzNiw4ICszMTYsNyBAQAogCQkJCXJhZGVvbl90dG1fcGxhY2VtZW50X2Zyb21fZG9tYWluKGJvLAogCQkJCQkJCQlsb2JqLT5yZG9tYWluKTsKIAkJCX0KLQkJCXIgPSB0dG1fYnVmZmVyX29iamVjdF92YWxpZGF0ZSgmYm8tPnRibywKLQkJCQkJCSZiby0+cGxhY2VtZW50LAorCQkJciA9IHR0bV9ib192YWxpZGF0ZSgmYm8tPnRibywgJmJvLT5wbGFjZW1lbnQsCiAJCQkJCQl0cnVlLCBmYWxzZSk7CiAJCQlpZiAodW5saWtlbHkocikpCiAJCQkJcmV0dXJuIHI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9iby5jIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm8uYwppbmRleCBhODM1YjZmLi4xZmJiMmVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9iby5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvLmMKQEAgLTE4NSw2ICsxODUsNyBAQAogCX0KIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0wodHRtX2JvX3dhaXRfdW5yZXNlcnZlZCk7CiAKIHN0YXRpYyB2b2lkIHR0bV9ib19hZGRfdG9fbHJ1KHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pCiB7CkBAIC05NDYsNiArOTQ3LDcgQEAKIAlyZXR1cm4gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGJvLT5ldmVudF9xdWV1ZSwKIAkJCQkJYXRvbWljX3JlYWQoJmJvLT5jcHVfd3JpdGVycykgPT0gMCk7CiB9CitFWFBPUlRfU1lNQk9MKHR0bV9ib193YWl0X2NwdSk7CiAKIGludCB0dG1fYm9fbW92ZV9idWZmZXIoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywKIAkJCXN0cnVjdCB0dG1fcGxhY2VtZW50ICpwbGFjZW1lbnQsCkBAIC0xMDAyLDkgKzEwMDQsOSBAQAogCXJldHVybiAtMTsKIH0KIAotaW50IHR0bV9idWZmZXJfb2JqZWN0X3ZhbGlkYXRlKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sCi0JCQkJc3RydWN0IHR0bV9wbGFjZW1lbnQgKnBsYWNlbWVudCwKLQkJCQlib29sIGludGVycnVwdGlibGUsIGJvb2wgbm9fd2FpdCkKK2ludCB0dG1fYm9fdmFsaWRhdGUoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywKKwkJCXN0cnVjdCB0dG1fcGxhY2VtZW50ICpwbGFjZW1lbnQsCisJCQlib29sIGludGVycnVwdGlibGUsIGJvb2wgbm9fd2FpdCkKIHsKIAlpbnQgcmV0OwogCkBAIC0xMDQwLDU1ICsxMDQyLDU3IEBACiAJfQogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTCh0dG1fYnVmZmVyX29iamVjdF92YWxpZGF0ZSk7CitFWFBPUlRfU1lNQk9MKHR0bV9ib192YWxpZGF0ZSk7CiAKLWludAotdHRtX2JvX2NoZWNrX3BsYWNlbWVudChzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAotCQkgICAgICAgdWludDMyX3Qgc2V0X2ZsYWdzLCB1aW50MzJfdCBjbHJfZmxhZ3MpCitpbnQgdHRtX2JvX2NoZWNrX3BsYWNlbWVudChzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAorCQkJCXN0cnVjdCB0dG1fcGxhY2VtZW50ICpwbGFjZW1lbnQpCiB7Ci0JdWludDMyX3QgbmV3X21hc2sgPSBzZXRfZmxhZ3MgfCBjbHJfZmxhZ3M7CisJaW50IGk7CiAKLQlpZiAoKGJvLT50eXBlID09IHR0bV9ib190eXBlX3VzZXIpICYmCi0JICAgIChjbHJfZmxhZ3MgJiBUVE1fUExfRkxBR19DQUNIRUQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBUVE1fUEZYCi0JCSAgICAgICAiVXNlciBidWZmZXJzIHJlcXVpcmUgY2FjaGUtY29oZXJlbnQgbWVtb3J5LlxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgewotCQlpZiAobmV3X21hc2sgJiBUVE1fUExfRkxBR19OT19FVklDVCkgewotCQkJcHJpbnRrKEtFUk5fRVJSIFRUTV9QRlggIk5lZWQgdG8gYmUgcm9vdCB0byBtb2RpZnkiCi0JCQkgICAgICAgIiBOT19FVklDVCBzdGF0dXMuXG4iKTsKKwlpZiAocGxhY2VtZW50LT5mcGZuIHx8IHBsYWNlbWVudC0+bHBmbikgeworCQlpZiAoYm8tPm1lbS5udW1fcGFnZXMgPiAocGxhY2VtZW50LT5scGZuIC0gcGxhY2VtZW50LT5mcGZuKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFRUTV9QRlggIlBhZ2UgbnVtYmVyIHJhbmdlIHRvIHNtYWxsICIKKwkJCQkiTmVlZCAlbHUgcGFnZXMsIHJhbmdlIGlzIFsldSwgJXVdXG4iLAorCQkJCWJvLT5tZW0ubnVtX3BhZ2VzLCBwbGFjZW1lbnQtPmZwZm4sCisJCQkJcGxhY2VtZW50LT5scGZuKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0KLQkJaWYgKChjbHJfZmxhZ3MgJiBiby0+bWVtLnBsYWNlbWVudCAmIFRUTV9QTF9NQVNLX01FTVRZUEUpICYmCi0JCSAgICAoYm8tPm1lbS5wbGFjZW1lbnQgJiBUVE1fUExfRkxBR19OT19FVklDVCkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiBUVE1fUEZYCi0JCQkgICAgICAgIkluY29tcGF0aWJsZSBtZW1vcnkgc3BlY2lmaWNhdGlvbiIKLQkJCSAgICAgICAiIGZvciBOT19FVklDVCBidWZmZXIuXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgcGxhY2VtZW50LT5udW1fcGxhY2VtZW50OyBpKyspIHsKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CisJCQlpZiAocGxhY2VtZW50LT5wbGFjZW1lbnRbaV0gJiBUVE1fUExfRkxBR19OT19FVklDVCkgeworCQkJCXByaW50ayhLRVJOX0VSUiBUVE1fUEZYICJOZWVkIHRvIGJlIHJvb3QgdG8gIgorCQkJCQkibW9kaWZ5IE5PX0VWSUNUIHN0YXR1cy5cbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBwbGFjZW1lbnQtPm51bV9idXN5X3BsYWNlbWVudDsgaSsrKSB7CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQkJaWYgKHBsYWNlbWVudC0+YnVzeV9wbGFjZW1lbnRbaV0gJiBUVE1fUExfRkxBR19OT19FVklDVCkgeworCQkJCXByaW50ayhLRVJOX0VSUiBUVE1fUEZYICJOZWVkIHRvIGJlIHJvb3QgdG8gIgorCQkJCQkibW9kaWZ5IE5PX0VWSUNUIHN0YXR1cy5cbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQogCQl9CiAJfQogCXJldHVybiAwOwogfQogCi1pbnQgdHRtX2J1ZmZlcl9vYmplY3RfaW5pdChzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiwKLQkJCSAgIHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sCi0JCQkgICB1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkgICBlbnVtIHR0bV9ib190eXBlIHR5cGUsCi0JCQkgICB1aW50MzJfdCBmbGFncywKLQkJCSAgIHVpbnQzMl90IHBhZ2VfYWxpZ25tZW50LAotCQkJICAgdW5zaWduZWQgbG9uZyBidWZmZXJfc3RhcnQsCi0JCQkgICBib29sIGludGVycnVwdGlibGUsCi0JCQkgICBzdHJ1Y3QgZmlsZSAqcGVyc2lzdGFudF9zd2FwX3N0b3JhZ2UsCi0JCQkgICBzaXplX3QgYWNjX3NpemUsCi0JCQkgICB2b2lkICgqZGVzdHJveSkgKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqKSkKK2ludCB0dG1fYm9faW5pdChzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiwKKwkJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywKKwkJdW5zaWduZWQgbG9uZyBzaXplLAorCQllbnVtIHR0bV9ib190eXBlIHR5cGUsCisJCXN0cnVjdCB0dG1fcGxhY2VtZW50ICpwbGFjZW1lbnQsCisJCXVpbnQzMl90IHBhZ2VfYWxpZ25tZW50LAorCQl1bnNpZ25lZCBsb25nIGJ1ZmZlcl9zdGFydCwKKwkJYm9vbCBpbnRlcnJ1cHRpYmxlLAorCQlzdHJ1Y3QgZmlsZSAqcGVyc2lzdGFudF9zd2FwX3N0b3JhZ2UsCisJCXNpemVfdCBhY2Nfc2l6ZSwKKwkJdm9pZCAoKmRlc3Ryb3kpIChzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKikpCiB7Ci0JaW50IGksIGMsIHJldCA9IDA7CisJaW50IHJldCA9IDA7CiAJdW5zaWduZWQgbG9uZyBudW1fcGFnZXM7Ci0JdWludDMyX3QgcGxhY2VtZW50c1s4XTsKLQlzdHJ1Y3QgdHRtX3BsYWNlbWVudCBwbGFjZW1lbnQ7CiAKIAlzaXplICs9IGJ1ZmZlcl9zdGFydCAmIH5QQUdFX01BU0s7CiAJbnVtX3BhZ2VzID0gKHNpemUgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOwpAQCAtMTEyMywzOCArMTEyNywyMSBAQAogCWJvLT5hY2Nfc2l6ZSA9IGFjY19zaXplOwogCWF0b21pY19pbmMoJmJvLT5nbG9iLT5ib19jb3VudCk7CiAKLQlyZXQgPSB0dG1fYm9fY2hlY2tfcGxhY2VtZW50KGJvLCBmbGFncywgMFVMTCk7CisJcmV0ID0gdHRtX2JvX2NoZWNrX3BsYWNlbWVudChibywgcGxhY2VtZW50KTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQogCQlnb3RvIG91dF9lcnI7CiAKIAkvKgotCSAqIElmIG5vIGNhY2hpbmcgYXR0cmlidXRlcyBhcmUgc2V0LCBhY2NlcHQgYW55IGZvcm0gb2YgY2FjaGluZy4KLQkgKi8KLQotCWlmICgoZmxhZ3MgJiBUVE1fUExfTUFTS19DQUNISU5HKSA9PSAwKQotCQlmbGFncyB8PSBUVE1fUExfTUFTS19DQUNISU5HOwotCi0JLyoKIAkgKiBGb3IgdHRtX2JvX3R5cGVfZGV2aWNlIGJ1ZmZlcnMsIGFsbG9jYXRlCiAJICogYWRkcmVzcyBzcGFjZSBmcm9tIHRoZSBkZXZpY2UuCiAJICovCi0KIAlpZiAoYm8tPnR5cGUgPT0gdHRtX2JvX3R5cGVfZGV2aWNlKSB7CiAJCXJldCA9IHR0bV9ib19zZXR1cF92bShibyk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIG91dF9lcnI7CiAJfQogCi0JcGxhY2VtZW50LmZwZm4gPSAwOwotCXBsYWNlbWVudC5scGZuID0gMDsKLQlmb3IgKGkgPSAwLCBjID0gMDsgaSA8PSBUVE1fUExfUFJJVjU7IGkrKykKLQkJaWYgKGZsYWdzICYgKDEgPDwgaSkpCi0JCQlwbGFjZW1lbnRzW2MrK10gPSAoZmxhZ3MgJiB+VFRNX1BMX01BU0tfTUVNKSB8ICgxIDw8IGkpOwotCXBsYWNlbWVudC5wbGFjZW1lbnQgPSBwbGFjZW1lbnRzOwotCXBsYWNlbWVudC5udW1fcGxhY2VtZW50ID0gYzsKLQlwbGFjZW1lbnQuYnVzeV9wbGFjZW1lbnQgPSBwbGFjZW1lbnRzOwotCXBsYWNlbWVudC5udW1fYnVzeV9wbGFjZW1lbnQgPSBjOwotCXJldCA9IHR0bV9idWZmZXJfb2JqZWN0X3ZhbGlkYXRlKGJvLCAmcGxhY2VtZW50LCBpbnRlcnJ1cHRpYmxlLCBmYWxzZSk7CisJcmV0ID0gdHRtX2JvX3ZhbGlkYXRlKGJvLCBwbGFjZW1lbnQsIGludGVycnVwdGlibGUsIGZhbHNlKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dF9lcnI7CiAKQEAgLTExNjcsNyArMTE1NCw3IEBACiAKIAlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTCh0dG1fYnVmZmVyX29iamVjdF9pbml0KTsKK0VYUE9SVF9TWU1CT0wodHRtX2JvX2luaXQpOwogCiBzdGF0aWMgaW5saW5lIHNpemVfdCB0dG1fYm9fc2l6ZShzdHJ1Y3QgdHRtX2JvX2dsb2JhbCAqZ2xvYiwKIAkJCQkgdW5zaWduZWQgbG9uZyBudW1fcGFnZXMpCkBAIC0xMTc4LDE1ICsxMTY1LDE1IEBACiAJcmV0dXJuIGdsb2ItPnR0bV9ib19zaXplICsgMiAqIHBhZ2VfYXJyYXlfc2l6ZTsKIH0KIAotaW50IHR0bV9idWZmZXJfb2JqZWN0X2NyZWF0ZShzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiwKLQkJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLAotCQkJICAgICBlbnVtIHR0bV9ib190eXBlIHR5cGUsCi0JCQkgICAgIHVpbnQzMl90IGZsYWdzLAotCQkJICAgICB1aW50MzJfdCBwYWdlX2FsaWdubWVudCwKLQkJCSAgICAgdW5zaWduZWQgbG9uZyBidWZmZXJfc3RhcnQsCi0JCQkgICAgIGJvb2wgaW50ZXJydXB0aWJsZSwKLQkJCSAgICAgc3RydWN0IGZpbGUgKnBlcnNpc3RhbnRfc3dhcF9zdG9yYWdlLAotCQkJICAgICBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKipwX2JvKQoraW50IHR0bV9ib19jcmVhdGUoc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYsCisJCQl1bnNpZ25lZCBsb25nIHNpemUsCisJCQllbnVtIHR0bV9ib190eXBlIHR5cGUsCisJCQlzdHJ1Y3QgdHRtX3BsYWNlbWVudCAqcGxhY2VtZW50LAorCQkJdWludDMyX3QgcGFnZV9hbGlnbm1lbnQsCisJCQl1bnNpZ25lZCBsb25nIGJ1ZmZlcl9zdGFydCwKKwkJCWJvb2wgaW50ZXJydXB0aWJsZSwKKwkJCXN0cnVjdCBmaWxlICpwZXJzaXN0YW50X3N3YXBfc3RvcmFnZSwKKwkJCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqKnBfYm8pCiB7CiAJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibzsKIAlzdHJ1Y3QgdHRtX21lbV9nbG9iYWwgKm1lbV9nbG9iID0gYmRldi0+Z2xvYi0+bWVtX2dsb2I7CkBAIC0xMjA1LDEwICsxMTkyLDkgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JcmV0ID0gdHRtX2J1ZmZlcl9vYmplY3RfaW5pdChiZGV2LCBibywgc2l6ZSwgdHlwZSwgZmxhZ3MsCi0JCQkJICAgICBwYWdlX2FsaWdubWVudCwgYnVmZmVyX3N0YXJ0LAotCQkJCSAgICAgaW50ZXJydXB0aWJsZSwKLQkJCQkgICAgIHBlcnNpc3RhbnRfc3dhcF9zdG9yYWdlLCBhY2Nfc2l6ZSwgTlVMTCk7CisJcmV0ID0gdHRtX2JvX2luaXQoYmRldiwgYm8sIHNpemUsIHR5cGUsIHBsYWNlbWVudCwgcGFnZV9hbGlnbm1lbnQsCisJCQkJYnVmZmVyX3N0YXJ0LCBpbnRlcnJ1cHRpYmxlLAorCQkJCXBlcnNpc3RhbnRfc3dhcF9zdG9yYWdlLCBhY2Nfc2l6ZSwgTlVMTCk7CiAJaWYgKGxpa2VseShyZXQgPT0gMCkpCiAJCSpwX2JvID0gYm87CiAKQEAgLTE3NDMsMTIgKzE3MjksMTQgQEAKIAl0dG1fYm9fdW5yZXNlcnZlKGJvKTsKIAlyZXR1cm4gcmV0OwogfQorRVhQT1JUX1NZTUJPTCh0dG1fYm9fc3luY2NwdV93cml0ZV9ncmFiKTsKIAogdm9pZCB0dG1fYm9fc3luY2NwdV93cml0ZV9yZWxlYXNlKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pCiB7CiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmJvLT5jcHVfd3JpdGVycykpCiAJCXdha2VfdXBfYWxsKCZiby0+ZXZlbnRfcXVldWUpOwogfQorRVhQT1JUX1NZTUJPTCh0dG1fYm9fc3luY2NwdV93cml0ZV9yZWxlYXNlKTsKIAogLyoqCiAgKiBBIGJ1ZmZlciBvYmplY3Qgc2hyaW5rIG1ldGhvZCB0aGF0IHRyaWVzIHRvIHN3YXAgb3V0IHRoZSBmaXJzdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1jb3JlLmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLWNvcmUuYwppbmRleCAwMjU4Mjg5Li5lMjk5N2E4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLWNvcmUuYworKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLWNvcmUuYwpAQCAtMTI1MywxMCArMTI1Myw5IEBACiB7CiAJc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwogCWludCBzdGF0dXM7CiAKLQlpZiAodWRldi0+YXV0b19wbSkgeworCWlmIChtZXNzYWdlLmV2ZW50ICYgUE1fRVZFTlRfQVVUTykgewogCQlzcGluX2xvY2tfaXJxKCZ1c2JoaWQtPmxvY2spOwkvKiBTeW5jIHdpdGggZXJyb3IgaGFuZGxlciAqLwogCQlpZiAoIXRlc3RfYml0KEhJRF9SRVNFVF9QRU5ESU5HLCAmdXNiaGlkLT5pb2ZsKQogCQkgICAgJiYgIXRlc3RfYml0KEhJRF9DTEVBUl9IQUxULCAmdXNiaGlkLT5pb2ZsKQpAQCAtMTI4MSw3ICsxMjgwLDcgQEAKIAkJCXJldHVybiAtRUlPOwogCX0KIAotCWlmICghaWdub3JlbGVkICYmIHVkZXYtPmF1dG9fcG0pIHsKKwlpZiAoIWlnbm9yZWxlZCAmJiAobWVzc2FnZS5ldmVudCAmIFBNX0VWRU5UX0FVVE8pKSB7CiAJCXNwaW5fbG9ja19pcnEoJnVzYmhpZC0+bG9jayk7CiAJCWlmICh0ZXN0X2JpdChISURfTEVEX09OLCAmdXNiaGlkLT5pb2ZsKSkgewogCQkJc3Bpbl91bmxvY2tfaXJxKCZ1c2JoaWQtPmxvY2spOwpAQCAtMTI5NCw3ICsxMjkzLDggQEAKIAloaWRfY2FuY2VsX2RlbGF5ZWRfc3R1ZmYodXNiaGlkKTsKIAloaWRfY2Vhc2VfaW8odXNiaGlkKTsKIAotCWlmICh1ZGV2LT5hdXRvX3BtICYmIHRlc3RfYml0KEhJRF9LRVlTX1BSRVNTRUQsICZ1c2JoaWQtPmlvZmwpKSB7CisJaWYgKChtZXNzYWdlLmV2ZW50ICYgUE1fRVZFTlRfQVVUTykgJiYKKwkJCXRlc3RfYml0KEhJRF9LRVlTX1BSRVNTRUQsICZ1c2JoaWQtPmlvZmwpKSB7CiAJCS8qIGxvc3QgcmFjZSBhZ2FpbnN0IGtleXByZXNzZXMgKi8KIAkJc3RhdHVzID0gaGlkX3N0YXJ0X2luKGhpZCk7CiAJCWlmIChzdGF0dXMgPCAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcG1hYy5jIGIvZHJpdmVycy9pZGUvcG1hYy5jCmluZGV4IDk3NjQyYTdhLi43YTRlNzg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wbWFjLmMKKysrIGIvZHJpdmVycy9pZGUvcG1hYy5jCkBAIC00MywxMCArNDMsNyBAQAogI2luY2x1ZGUgPGFzbS9wbWFjX2ZlYXR1cmUuaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+Ci0KLSNpZm5kZWYgQ09ORklHX1BQQzY0CiAjaW5jbHVkZSA8YXNtL21lZGlhYmF5Lmg+Ci0jZW5kaWYKIAogI2RlZmluZSBEUlZfTkFNRSAiaWRlLXBtYWMiCiAKQEAgLTU5LDEzICs1NiwxNCBAQAogCWludAkJCQlpcnE7CiAJaW50CQkJCWtpbmQ7CiAJaW50CQkJCWFhcGxfYnVzX2lkOwotCXVuc2lnbmVkCQkJbWVkaWFiYXkgOiAxOwogCXVuc2lnbmVkCQkJYnJva2VuX2RtYSA6IDE7CiAJdW5zaWduZWQJCQlicm9rZW5fZG1hX3dhcm4gOiAxOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSoJCW5vZGU7CiAJc3RydWN0IG1hY2lvX2RldgkJKm1kZXY7CiAJdTMyCQkJCXRpbWluZ3NbNF07CiAJdm9sYXRpbGUgdTMyIF9faW9tZW0gKgkJKmthdWFpX2ZjcjsKKwlpZGVfaHdpZl90CQkJKmh3aWY7CisKIAkvKiBUaG9zZSBmaWVsZHMgYXJlIGR1cGxpY2F0aW5nIHdoYXQgaXMgaW4gaHdpZi4gV2UgY3VycmVudGx5CiAJICogY2FuJ3QgdXNlIHRoZSBod2lmIG9uZXMgYmVjYXVzZSBvZiBzb21lIGFzc3VtcHRpb25zIHRoYXQgYXJlCiAJICogYmVlaW5nIGRvbmUgYnkgdGhlIGdlbmVyaWMgY29kZSBhYm91dCB0aGUga2luZCBvZiBkbWEgY29udHJvbGxlcgpAQCAtODU0LDYgKzg1MiwxMSBAQAogCXBtaWYtPnRpbWluZ3NbMl0gPSBwbWlmLT50aW1pbmdzWzNdID0gdmFsdWUyOwogfQogCitzdGF0aWMgaW50IG9uX21lZGlhX2JheShwbWFjX2lkZV9od2lmX3QgKnBtaWYpCit7CisJcmV0dXJuIHBtaWYtPm1kZXYgJiYgcG1pZi0+bWRldi0+bWVkaWFfYmF5ICE9IE5VTEw7Cit9CisKIC8qIFN1c3BlbmQgY2FsbCBiYWNrLCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHRoZSBjaGlsZCBkZXZpY2VzCiAgKiBoYXZlIGFjdHVhbGx5IGJlZW4gc3VzcGVuZGVkCiAgKi8KQEAgLTg2Niw3ICs4NjksNyBAQAogCWRpc2FibGVfaXJxKHBtaWYtPmlycSk7CiAKIAkvKiBUaGUgbWVkaWEgYmF5IHdpbGwgaGFuZGxlIGl0c2VsZiBqdXN0IGZpbmUgKi8KLQlpZiAocG1pZi0+bWVkaWFiYXkpCisJaWYgKG9uX21lZGlhX2JheShwbWlmKSkKIAkJcmV0dXJuIDA7CiAJCiAJLyogS2F1YWkgaGFzIGJ1cyBjb250cm9sIEZDUnMgZGlyZWN0bHkgaGVyZSAqLwpAQCAtODg5LDcgKzg5Miw3IEBACiBzdGF0aWMgaW50IHBtYWNfaWRlX2RvX3Jlc3VtZShwbWFjX2lkZV9od2lmX3QgKnBtaWYpCiB7CiAJLyogSGFyZCByZXNldCAmIHJlLWVuYWJsZSBjb250cm9sbGVyIChkbyB3ZSByZWFsbHkgbmVlZCB0byByZXNldCA/IC1CZW5IKSAqLwotCWlmICghcG1pZi0+bWVkaWFiYXkpIHsKKwlpZiAoIW9uX21lZGlhX2JheShwbWlmKSkgewogCQlwcGNfbWQuZmVhdHVyZV9jYWxsKFBNQUNfRlRSX0lERV9SRVNFVCwgcG1pZi0+bm9kZSwgcG1pZi0+YWFwbF9idXNfaWQsIDEpOwogCQlwcGNfbWQuZmVhdHVyZV9jYWxsKFBNQUNfRlRSX0lERV9FTkFCTEUsIHBtaWYtPm5vZGUsIHBtaWYtPmFhcGxfYnVzX2lkLCAxKTsKIAkJbXNsZWVwKDEwKTsKQEAgLTk1MCwxMyArOTUzLDExIEBACiAJcG1hY19pZGVfaHdpZl90ICpwbWlmID0KIAkJKHBtYWNfaWRlX2h3aWZfdCAqKWRldl9nZXRfZHJ2ZGF0YShod2lmLT5nZW5kZXYucGFyZW50KTsKIAotCWlmIChwbWlmLT5tZWRpYWJheSkgewotI2lmZGVmIENPTkZJR19QTUFDX01FRElBQkFZCi0JCWlmIChjaGVja19tZWRpYV9iYXlfYnlfYmFzZShwbWlmLT5yZWdiYXNlLCBNQl9DRCkgPT0gMCkgeworCWlmIChvbl9tZWRpYV9iYXkocG1pZikpIHsKKwkJaWYgKGNoZWNrX21lZGlhX2JheShwbWlmLT5tZGV2LT5tZWRpYV9iYXkpID09IE1CX0NEKSB7CiAJCQlkcml2ZS0+ZGV2X2ZsYWdzICY9IH5JREVfREZMQUdfTk9QUk9CRTsKIAkJCXJldHVybjsKIAkJfQotI2VuZGlmCiAJCWRyaXZlLT5kZXZfZmxhZ3MgfD0gSURFX0RGTEFHX05PUFJPQkU7CiAJfQogfQpAQCAtMTA3MiwyNiArMTA3MywyMyBAQAogCQl3cml0ZWwoS0FVQUlfRkNSX1VBVEFfTUFHSUMgfAogCQkgICAgICAgS0FVQUlfRkNSX1VBVEFfUkVTRVRfTiB8CiAJCSAgICAgICBLQVVBSV9GQ1JfVUFUQV9FTkFCTEUsIHBtaWYtPmthdWFpX2Zjcik7Ci0KLQlwbWlmLT5tZWRpYWJheSA9IDA7CiAJCiAJLyogTWFrZSBzdXJlIHdlIGhhdmUgc2FuZSB0aW1pbmdzICovCiAJc2FuaXRpemVfdGltaW5ncyhwbWlmKTsKIAotCWhvc3QgPSBpZGVfaG9zdF9hbGxvYygmZCwgaHdzLCAxKTsKLQlpZiAoaG9zdCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQlod2lmID0gaG9zdC0+cG9ydHNbMF07CisJLyogSWYgd2UgYXJlIG9uIGEgbWVkaWEgYmF5LCB3YWl0IGZvciBpdCB0byBzZXR0bGUgYW5kIGxvY2sgaXQgKi8KKwlpZiAocG1pZi0+bWRldikKKwkJbG9ja19tZWRpYV9iYXkocG1pZi0+bWRldi0+bWVkaWFfYmF5KTsKIAotI2lmbmRlZiBDT05GSUdfUFBDNjQKLQkvKiBYWFggRklYTUU6IE1lZGlhIGJheSBzdHVmZiBuZWVkIHJlLW9yZ2FuaXppbmcgKi8KLQlpZiAobnAtPnBhcmVudCAmJiBucC0+cGFyZW50LT5uYW1lCi0JICAgICYmIHN0cmNhc2VjbXAobnAtPnBhcmVudC0+bmFtZSwgIm1lZGlhLWJheSIpID09IDApIHsKLSNpZmRlZiBDT05GSUdfUE1BQ19NRURJQUJBWQotCQltZWRpYV9iYXlfc2V0X2lkZV9pbmZvcyhucC0+cGFyZW50LCBwbWlmLT5yZWdiYXNlLCBwbWlmLT5pcnEsCi0JCQkJCWh3aWYpOwotI2VuZGlmIC8qIENPTkZJR19QTUFDX01FRElBQkFZICovCi0JCXBtaWYtPm1lZGlhYmF5ID0gMTsKKwlob3N0ID0gaWRlX2hvc3RfYWxsb2MoJmQsIGh3cywgMSk7CisJaWYgKGhvc3QgPT0gTlVMTCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gYmFpbDsKKwl9CisJaHdpZiA9IHBtaWYtPmh3aWYgPSBob3N0LT5wb3J0c1swXTsKKworCWlmIChvbl9tZWRpYV9iYXkocG1pZikpIHsKKwkJLyogRml4dXAgYnVzIElEIGZvciBtZWRpYSBiYXkgKi8KIAkJaWYgKCFiaWRwKQogCQkJcG1pZi0+YWFwbF9idXNfaWQgPSAxOwogCX0gZWxzZSBpZiAocG1pZi0+a2luZCA9PSBjb250cm9sbGVyX29oYXJlKSB7CkBAIC0xMTAwLDkgKzEwOTgsNyBAQAogCQkgKiB1bml0cywgSSBrZWVwIHRoZSBvbGQgd2F5CiAJCSAqLwogCQlwcGNfbWQuZmVhdHVyZV9jYWxsKFBNQUNfRlRSX0lERV9FTkFCTEUsIG5wLCAwLCAxKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKKwl9IGVsc2UgewogIAkJLyogVGhpcyBpcyBuZWNlc3NhcnkgdG8gZW5hYmxlIElERSB3aGVuIG5ldC1ib290aW5nICovCiAJCXBwY19tZC5mZWF0dXJlX2NhbGwoUE1BQ19GVFJfSURFX1JFU0VULCBucCwgcG1pZi0+YWFwbF9idXNfaWQsIDEpOwogCQlwcGNfbWQuZmVhdHVyZV9jYWxsKFBNQUNfRlRSX0lERV9FTkFCTEUsIG5wLCBwbWlmLT5hYXBsX2J1c19pZCwgMSk7CkBAIC0xMTEyLDE3ICsxMTA4LDIxIEBACiAJfQogCiAJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRSAiOiBGb3VuZCBBcHBsZSAlcyBjb250cm9sbGVyICglcyksICIKLQkJCSAiYnVzIElEICVkJXMsIGlycSAlZFxuIiwgbW9kZWxfbmFtZVtwbWlmLT5raW5kXSwKLQkJCSBwbWlmLT5tZGV2ID8gIm1hY2lvIiA6ICJQQ0kiLCBwbWlmLT5hYXBsX2J1c19pZCwKLQkJCSBwbWlmLT5tZWRpYWJheSA/ICIgKG1lZGlhYmF5KSIgOiAiIiwgaHctPmlycSk7CisJICAgICAgICJidXMgSUQgJWQlcywgaXJxICVkXG4iLCBtb2RlbF9uYW1lW3BtaWYtPmtpbmRdLAorCSAgICAgICBwbWlmLT5tZGV2ID8gIm1hY2lvIiA6ICJQQ0kiLCBwbWlmLT5hYXBsX2J1c19pZCwKKwkgICAgICAgb25fbWVkaWFfYmF5KHBtaWYpID8gIiAobWVkaWFiYXkpIiA6ICIiLCBody0+aXJxKTsKIAogCXJjID0gaWRlX2hvc3RfcmVnaXN0ZXIoaG9zdCwgJmQsIGh3cyk7Ci0JaWYgKHJjKSB7Ci0JCWlkZV9ob3N0X2ZyZWUoaG9zdCk7Ci0JCXJldHVybiByYzsKLQl9CisJaWYgKHJjKQorCQlwbWlmLT5od2lmID0gTlVMTDsKIAotCXJldHVybiAwOworCWlmIChwbWlmLT5tZGV2KQorCQl1bmxvY2tfbWVkaWFfYmF5KHBtaWYtPm1kZXYtPm1lZGlhX2JheSk7CisKKyBiYWlsOgorCWlmIChyYyAmJiBob3N0KQorCQlpZGVfaG9zdF9mcmVlKGhvc3QpOworCXJldHVybiByYzsKIH0KIAogc3RhdGljIHZvaWQgX19kZXZpbml0IHBtYWNfaWRlX2luaXRfcG9ydHMoc3RydWN0IGlkZV9odyAqaHcsIHVuc2lnbmVkIGxvbmcgYmFzZSkKQEAgLTEzNjIsNiArMTM2MiwyNSBAQAogCXJldHVybiByYzsKIH0KIAorI2lmZGVmIENPTkZJR19QTUFDX01FRElBQkFZCitzdGF0aWMgdm9pZCBwbWFjX2lkZV9tYWNpb19tYl9ldmVudChzdHJ1Y3QgbWFjaW9fZGV2KiBtZGV2LCBpbnQgbWJfc3RhdGUpCit7CisJcG1hY19pZGVfaHdpZl90ICpwbWlmID0KKwkJKHBtYWNfaWRlX2h3aWZfdCAqKWRldl9nZXRfZHJ2ZGF0YSgmbWRldi0+b2ZkZXYuZGV2KTsKKworCXN3aXRjaChtYl9zdGF0ZSkgeworCWNhc2UgTUJfQ0Q6CisJCWlmICghcG1pZi0+aHdpZi0+cHJlc2VudCkKKwkJCWlkZV9wb3J0X3NjYW4ocG1pZi0+aHdpZik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmIChwbWlmLT5od2lmLT5wcmVzZW50KQorCQkJaWRlX3BvcnRfdW5yZWdpc3Rlcl9kZXZpY2VzKHBtaWYtPmh3aWYpOworCX0KK30KKyNlbmRpZiAvKiBDT05GSUdfUE1BQ19NRURJQUJBWSAqLworCisKIHN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBtYWNfaWRlX21hY2lvX21hdGNoW10gPSAKIHsKIAl7CkBAIC0xMzg2LDYgKzE0MDUsOSBAQAogCS5wcm9iZQkJPSBwbWFjX2lkZV9tYWNpb19hdHRhY2gsCiAJLnN1c3BlbmQJPSBwbWFjX2lkZV9tYWNpb19zdXNwZW5kLAogCS5yZXN1bWUJCT0gcG1hY19pZGVfbWFjaW9fcmVzdW1lLAorI2lmZGVmIENPTkZJR19QTUFDX01FRElBQkFZCisJLm1lZGlhYmF5X2V2ZW50CT0gcG1hY19pZGVfbWFjaW9fbWJfZXZlbnQsCisjZW5kaWYKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwbWFjX2lkZV9wY2lfbWF0Y2hbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfaXJxLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2lycS5jCmluZGV4IDRiODliNzkuLjQyYmUwYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfaXJxLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9pcnEuYwpAQCAtODI2LDggKzgyNiw3IEBACiAJCWNxID0gbGlzdF9lbnRyeShjY3QtPmNxX2xpc3QubmV4dCwgc3RydWN0IGVoY2FfY3EsIGVudHJ5KTsKIAogCQlsaXN0X2RlbCgmY3EtPmVudHJ5KTsKLQkJX19xdWV1ZV9jb21wX3Rhc2soY3EsIHBlcl9jcHVfcHRyKHBvb2wtPmNwdV9jb21wX3Rhc2tzLAotCQkJCQkJICBzbXBfcHJvY2Vzc29yX2lkKCkpKTsKKwkJX19xdWV1ZV9jb21wX3Rhc2soY3EsIHRoaXNfY3B1X3B0cihwb29sLT5jcHVfY29tcF90YXNrcykpOwogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNjdC0+dGFza19sb2NrLCBmbGFnc19jY3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9LY29uZmlnIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9LY29uZmlnCmluZGV4IDIwM2I4OGEuLjAyYzgzNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvS2NvbmZpZworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL0tjb25maWcKQEAgLTI0LDYgKzI0LDE2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhYWVkMjAwMF9rYmQuCiAKK2NvbmZpZyBLRVlCT0FSRF9BRFA1NTIwCisJdHJpc3RhdGUgIktleXBhZCBTdXBwb3J0IGZvciBBRFA1NTIwIFBNSUMiCisJZGVwZW5kcyBvbiBQTUlDX0FEUDU1MjAKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBrZXlwYWQgc2NhbiBtYXRyaXgKKwkgIG9uIEFuYWxvZyBEZXZpY2VzIEFEUDU1MjAgUE1JQ3MuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIGFkcDU1MjAta2V5cy4KKwogY29uZmlnIEtFWUJPQVJEX0FEUDU1ODgKIAl0cmlzdGF0ZSAiQURQNTU4OCBJMkMgUVdFUlRZIEtleXBhZCBhbmQgSU8gRXhwYW5kZXIiCiAJZGVwZW5kcyBvbiBJMkMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvTWFrZWZpbGUgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL01ha2VmaWxlCmluZGV4IDY4YzAxNzIuLjc4NjU0ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9NYWtlZmlsZQpAQCAtNSw2ICs1LDcgQEAKICMgRWFjaCBjb25maWd1cmF0aW9uIG9wdGlvbiBlbmFibGVzIGEgbGlzdCBvZiBmaWxlcy4KIAogb2JqLSQoQ09ORklHX0tFWUJPQVJEX0FBRUQyMDAwKQkJKz0gYWFlZDIwMDBfa2JkLm8KK29iai0kKENPTkZJR19LRVlCT0FSRF9BRFA1NTIwKQkJKz0gYWRwNTUyMC1rZXlzLm8KIG9iai0kKENPTkZJR19LRVlCT0FSRF9BRFA1NTg4KQkJKz0gYWRwNTU4OC1rZXlzLm8KIG9iai0kKENPTkZJR19LRVlCT0FSRF9BTUlHQSkJCSs9IGFtaWtiZC5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfQVRBUkkpCQkrPSBhdGFrYmQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hZHA1NTIwLWtleXMuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYWRwNTUyMC1rZXlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdiYTI3ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYWRwNTUyMC1rZXlzLmMKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKiBLZXlwYWQgZHJpdmVyIGZvciBBbmFsb2cgRGV2aWNlcyBBRFA1NTIwIE1GRCBQTUlDcworICoKKyAqIENvcHlyaWdodCAyMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9hZHA1NTIwLmg+CisKK3N0cnVjdCBhZHA1NTIwX2tleXMgeworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0OworCXN0cnVjdCBub3RpZmllcl9ibG9jayBub3RpZmllcjsKKwlzdHJ1Y3QgZGV2aWNlICptYXN0ZXI7CisJdW5zaWduZWQgc2hvcnQga2V5Y29kZVtBRFA1NTIwX0tFWU1BUFNJWkVdOworfTsKKworc3RhdGljIHZvaWQgYWRwNTUyMF9rZXlzX3JlcG9ydF9ldmVudChzdHJ1Y3QgYWRwNTUyMF9rZXlzICpkZXYsCisJCQkJCXVuc2lnbmVkIHNob3J0IGtleW1hc2ssIGludCB2YWx1ZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBRFA1NTIwX01BWEtFWVM7IGkrKykKKwkJaWYgKGtleW1hc2sgJiAoMSA8PCBpKSkKKwkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LT5pbnB1dCwgZGV2LT5rZXljb2RlW2ldLCB2YWx1ZSk7CisKKwlpbnB1dF9zeW5jKGRldi0+aW5wdXQpOworfQorCitzdGF0aWMgaW50IGFkcDU1MjBfa2V5c19ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJCSB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBhZHA1NTIwX2tleXMgKmRldjsKKwl1aW50OF90IHJlZ192YWxfbG8sIHJlZ192YWxfaGk7CisJdW5zaWduZWQgc2hvcnQga2V5bWFzazsKKworCWRldiA9IGNvbnRhaW5lcl9vZihuYiwgc3RydWN0IGFkcDU1MjBfa2V5cywgbm90aWZpZXIpOworCisJaWYgKGV2ZW50ICYgQURQNTUyMF9LUF9JTlQpIHsKKwkJYWRwNTUyMF9yZWFkKGRldi0+bWFzdGVyLCBBRFA1NTIwX0tQX0lOVF9TVEFUXzEsICZyZWdfdmFsX2xvKTsKKwkJYWRwNTUyMF9yZWFkKGRldi0+bWFzdGVyLCBBRFA1NTIwX0tQX0lOVF9TVEFUXzIsICZyZWdfdmFsX2hpKTsKKworCQlrZXltYXNrID0gKHJlZ192YWxfaGkgPDwgOCkgfCByZWdfdmFsX2xvOworCQkvKiBSZWFkIHR3aWNlIHRvIGNsZWFyICovCisJCWFkcDU1MjBfcmVhZChkZXYtPm1hc3RlciwgQURQNTUyMF9LUF9JTlRfU1RBVF8xLCAmcmVnX3ZhbF9sbyk7CisJCWFkcDU1MjBfcmVhZChkZXYtPm1hc3RlciwgQURQNTUyMF9LUF9JTlRfU1RBVF8yLCAmcmVnX3ZhbF9oaSk7CisJCWtleW1hc2sgfD0gKHJlZ192YWxfaGkgPDwgOCkgfCByZWdfdmFsX2xvOworCQlhZHA1NTIwX2tleXNfcmVwb3J0X2V2ZW50KGRldiwga2V5bWFzaywgMSk7CisJfQorCisJaWYgKGV2ZW50ICYgQURQNTUyMF9LUl9JTlQpIHsKKwkJYWRwNTUyMF9yZWFkKGRldi0+bWFzdGVyLCBBRFA1NTIwX0tSX0lOVF9TVEFUXzEsICZyZWdfdmFsX2xvKTsKKwkJYWRwNTUyMF9yZWFkKGRldi0+bWFzdGVyLCBBRFA1NTIwX0tSX0lOVF9TVEFUXzIsICZyZWdfdmFsX2hpKTsKKworCQlrZXltYXNrID0gKHJlZ192YWxfaGkgPDwgOCkgfCByZWdfdmFsX2xvOworCQkvKiBSZWFkIHR3aWNlIHRvIGNsZWFyICovCisJCWFkcDU1MjBfcmVhZChkZXYtPm1hc3RlciwgQURQNTUyMF9LUl9JTlRfU1RBVF8xLCAmcmVnX3ZhbF9sbyk7CisJCWFkcDU1MjBfcmVhZChkZXYtPm1hc3RlciwgQURQNTUyMF9LUl9JTlRfU1RBVF8yLCAmcmVnX3ZhbF9oaSk7CisJCWtleW1hc2sgfD0gKHJlZ192YWxfaGkgPDwgOCkgfCByZWdfdmFsX2xvOworCQlhZHA1NTIwX2tleXNfcmVwb3J0X2V2ZW50KGRldiwga2V5bWFzaywgMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkcDU1MjBfa2V5c19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhZHA1NTIwX2tleXNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dDsKKwlzdHJ1Y3QgYWRwNTUyMF9rZXlzICpkZXY7CisJaW50IHJldCwgaTsKKwl1bnNpZ25lZCBjaGFyIGVuX21hc2ssIGN0bF9tYXNrID0gMDsKKworCWlmIChwZGV2LT5pZCAhPSBJRF9BRFA1NTIwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm9ubHkgQURQNTUyMCBzdXBwb3J0cyBLZXlwYWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocGRhdGEgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJtaXNzaW5nIHBsYXRmb3JtIGRhdGFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIShwZGF0YS0+cm93c19lbl9tYXNrICYmIHBkYXRhLT5jb2xzX2VuX21hc2spKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlucHV0ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCFpbnB1dCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwlkZXYtPm1hc3RlciA9IHBkZXYtPmRldi5wYXJlbnQ7CisJZGV2LT5pbnB1dCA9IGlucHV0OworCisJaW5wdXQtPm5hbWUgPSBwZGV2LT5uYW1lOworCWlucHV0LT5waHlzID0gImFkcDU1MjAta2V5cy9pbnB1dDAiOworCWlucHV0LT5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKKworCWlucHV0X3NldF9kcnZkYXRhKGlucHV0LCBkZXYpOworCisJaW5wdXQtPmlkLmJ1c3R5cGUgPSBCVVNfSTJDOworCWlucHV0LT5pZC52ZW5kb3IgPSAweDAwMDE7CisJaW5wdXQtPmlkLnByb2R1Y3QgPSAweDU1MjA7CisJaW5wdXQtPmlkLnZlcnNpb24gPSAweDAwMDE7CisKKwlpbnB1dC0+a2V5Y29kZXNpemUgPSBzaXplb2YoZGV2LT5rZXljb2RlWzBdKTsKKwlpbnB1dC0+a2V5Y29kZW1heCA9IHBkYXRhLT5rZXltYXBzaXplOworCWlucHV0LT5rZXljb2RlID0gZGV2LT5rZXljb2RlOworCisJbWVtY3B5KGRldi0+a2V5Y29kZSwgcGRhdGEtPmtleW1hcCwKKwkJcGRhdGEtPmtleW1hcHNpemUgKiBpbnB1dC0+a2V5Y29kZXNpemUpOworCisJLyogc2V0dXAgaW5wdXQgZGV2aWNlICovCisJX19zZXRfYml0KEVWX0tFWSwgaW5wdXQtPmV2Yml0KTsKKworCWlmIChwZGF0YS0+cmVwZWF0KQorCQlfX3NldF9iaXQoRVZfUkVQLCBpbnB1dC0+ZXZiaXQpOworCisJZm9yIChpID0gMDsgaSA8IGlucHV0LT5rZXljb2RlbWF4OyBpKyspCisJCV9fc2V0X2JpdChkZXYtPmtleWNvZGVbaV0sIGlucHV0LT5rZXliaXQpOworCV9fY2xlYXJfYml0KEtFWV9SRVNFUlZFRCwgaW5wdXQtPmtleWJpdCk7CisKKwlyZXQgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyIGlucHV0IGRldmljZVxuIik7CisJCWdvdG8gZXJyOworCX0KKworCWVuX21hc2sgPSBwZGF0YS0+cm93c19lbl9tYXNrIHwgcGRhdGEtPmNvbHNfZW5fbWFzazsKKworCXJldCA9IGFkcDU1MjBfc2V0X2JpdHMoZGV2LT5tYXN0ZXIsIEFEUDU1MjBfR1BJT19DRkdfMSwgZW5fbWFzayk7CisKKwlpZiAoZW5fbWFzayAmIEFEUDU1MjBfQ09MX0MzKQorCQljdGxfbWFzayB8PSBBRFA1NTIwX0MzX01PREU7CisKKwlpZiAoZW5fbWFzayAmIEFEUDU1MjBfUk9XX1IzKQorCQljdGxfbWFzayB8PSBBRFA1NTIwX1IzX01PREU7CisKKwlpZiAoY3RsX21hc2spCisJCXJldCB8PSBhZHA1NTIwX3NldF9iaXRzKGRldi0+bWFzdGVyLCBBRFA1NTIwX0xFRF9DT05UUk9MLAorCQkJY3RsX21hc2spOworCisJcmV0IHw9IGFkcDU1MjBfc2V0X2JpdHMoZGV2LT5tYXN0ZXIsIEFEUDU1MjBfR1BJT19QVUxMVVAsCisJCXBkYXRhLT5yb3dzX2VuX21hc2spOworCisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gd3JpdGVcbiIpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycjE7CisJfQorCisJZGV2LT5ub3RpZmllci5ub3RpZmllcl9jYWxsID0gYWRwNTUyMF9rZXlzX25vdGlmaWVyOworCXJldCA9IGFkcDU1MjBfcmVnaXN0ZXJfbm90aWZpZXIoZGV2LT5tYXN0ZXIsICZkZXYtPm5vdGlmaWVyLAorCQkJQURQNTUyMF9LUF9JRU4gfCBBRFA1NTIwX0tSX0lFTik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgbm90aWZpZXJcbiIpOworCQlnb3RvIGVycjE7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKwlyZXR1cm4gMDsKKworZXJyMToKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShpbnB1dCk7CisJaW5wdXQgPSBOVUxMOworZXJyOgorCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0KTsKKwlrZnJlZShkZXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkcDU1MjBfa2V5c19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYWRwNTUyMF9rZXlzICpkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWFkcDU1MjBfdW5yZWdpc3Rlcl9ub3RpZmllcihkZXYtPm1hc3RlciwgJmRldi0+bm90aWZpZXIsCisJCQkJQURQNTUyMF9LUF9JRU4gfCBBRFA1NTIwX0tSX0lFTik7CisKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShkZXYtPmlucHV0KTsKKwlrZnJlZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhZHA1NTIwX2tleXNfZHJpdmVyID0geworCS5kcml2ZXIJPSB7CisJCS5uYW1lCT0gImFkcDU1MjAta2V5cyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IGFkcDU1MjBfa2V5c19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGFkcDU1MjBfa2V5c19yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWRwNTUyMF9rZXlzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhZHA1NTIwX2tleXNfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkcDU1MjBfa2V5c19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGFkcDU1MjBfa2V5c19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFkcDU1MjBfa2V5c19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYWRwNTUyMF9rZXlzX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEhlbm5lcmljaCA8aGVubmVyaWNoQGJsYWNrZmluLnVjbGludXgub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJLZXlzIEFEUDU1MjAgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmFkcDU1MjAta2V5cyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC90d2w0MDMwX2tleXBhZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC90d2w0MDMwX2tleXBhZC5jCmluZGV4IDlhMjk3N2MuLmVlYWE3YWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvdHdsNDAzMF9rZXlwYWQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3R3bDQwMzBfa2V5cGFkLmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy90d2w0MDMwLmg+CisjaW5jbHVkZSA8bGludXgvaTJjL3R3bC5oPgogCiAKIC8qCkBAIC0xMzMsNyArMTMzLDcgQEAKIHN0YXRpYyBpbnQgdHdsNDAzMF9rcHJlYWQoc3RydWN0IHR3bDQwMzBfa2V5cGFkICprcCwKIAkJdTggKmRhdGEsIHUzMiByZWcsIHU4IG51bV9ieXRlcykKIHsKLQlpbnQgcmV0ID0gdHdsNDAzMF9pMmNfcmVhZChUV0w0MDMwX01PRFVMRV9LRVlQQUQsIGRhdGEsIHJlZywgbnVtX2J5dGVzKTsKKwlpbnQgcmV0ID0gdHdsX2kyY19yZWFkKFRXTDQwMzBfTU9EVUxFX0tFWVBBRCwgZGF0YSwgcmVnLCBudW1fYnl0ZXMpOwogCiAJaWYgKHJldCA8IDApCiAJCWRldl93YXJuKGtwLT5kYmdfZGV2LApAQCAtMTQ1LDcgKzE0NSw3IEBACiAKIHN0YXRpYyBpbnQgdHdsNDAzMF9rcHdyaXRlX3U4KHN0cnVjdCB0d2w0MDMwX2tleXBhZCAqa3AsIHU4IGRhdGEsIHUzMiByZWcpCiB7Ci0JaW50IHJldCA9IHR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX0tFWVBBRCwgZGF0YSwgcmVnKTsKKwlpbnQgcmV0ID0gdHdsX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9LRVlQQUQsIGRhdGEsIHJlZyk7CiAKIAlpZiAocmV0IDwgMCkKIAkJZGV2X3dhcm4oa3AtPmRiZ19kZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvcGNmNTA2MzMtaW5wdXQuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9wY2Y1MDYzMy1pbnB1dC5jCmluZGV4IDAzOWRjYjAuLjAwOGRlMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9wY2Y1MDYzMy1pbnB1dC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9wY2Y1MDYzMy1pbnB1dC5jCkBAIC01NSw3ICs1NSw2IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBwY2Y1MDYzM19pbnB1dF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBwY2Y1MDYzM19pbnB1dCAqaW5wdXQ7Ci0Jc3RydWN0IHBjZjUwNjMzX3N1YmRldl9wZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CiAJaW50IHJldDsKIApAQCAtNzEsNyArNzAsNyBAQAogCX0KIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGlucHV0KTsKLQlpbnB1dC0+cGNmID0gcGRhdGEtPnBjZjsKKwlpbnB1dC0+cGNmID0gZGV2X3RvX3BjZjUwNjMzKHBkZXYtPmRldi5wYXJlbnQpOwogCWlucHV0LT5pbnB1dF9kZXYgPSBpbnB1dF9kZXY7CiAKIAlpbnB1dF9kZXYtPm5hbWUgPSAiUENGNTA2MzMgUE1VIGV2ZW50cyI7CkBAIC04NSw5ICs4NCw5IEBACiAJCWtmcmVlKGlucHV0KTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0JcGNmNTA2MzNfcmVnaXN0ZXJfaXJxKHBkYXRhLT5wY2YsIFBDRjUwNjMzX0lSUV9PTktFWVIsCisJcGNmNTA2MzNfcmVnaXN0ZXJfaXJxKGlucHV0LT5wY2YsIFBDRjUwNjMzX0lSUV9PTktFWVIsCiAJCQkJcGNmNTA2MzNfaW5wdXRfaXJxLCBpbnB1dCk7Ci0JcGNmNTA2MzNfcmVnaXN0ZXJfaXJxKHBkYXRhLT5wY2YsIFBDRjUwNjMzX0lSUV9PTktFWUYsCisJcGNmNTA2MzNfcmVnaXN0ZXJfaXJxKGlucHV0LT5wY2YsIFBDRjUwNjMzX0lSUV9PTktFWUYsCiAJCQkJcGNmNTA2MzNfaW5wdXRfaXJxLCBpbnB1dCk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy90d2w0MDMwLXB3cmJ1dHRvbi5jIGIvZHJpdmVycy9pbnB1dC9taXNjL3R3bDQwMzAtcHdyYnV0dG9uLmMKaW5kZXggZjVmYzk5Ny4uYmRkZTVjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL3R3bDQwMzAtcHdyYnV0dG9uLmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL3R3bDQwMzAtcHdyYnV0dG9uLmMKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy90d2w0MDMwLmg+CisjaW5jbHVkZSA8bGludXgvaTJjL3R3bC5oPgogCiAjZGVmaW5lIFBXUl9QV1JPTl9JUlEgKDEgPDwgMCkKIApAQCAtNDksNyArNDksNyBAQAogCWxvY2FsX2lycV9lbmFibGUoKTsKICNlbmRpZgogCi0JZXJyID0gdHdsNDAzMF9pMmNfcmVhZF91OChUV0w0MDMwX01PRFVMRV9QTV9NQVNURVIsICZ2YWx1ZSwKKwllcnIgPSB0d2xfaTJjX3JlYWRfdTgoVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSLCAmdmFsdWUsCiAJCQkJICBTVFNfSFdfQ09ORElUSU9OUyk7CiAJaWYgKCFlcnIpICB7CiAJCWlucHV0X3JlcG9ydF9rZXkocHdyLCBLRVlfUE9XRVIsIHZhbHVlICYgUFdSX1BXUk9OX0lSUSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3hlbi1rYmRmcm9udC5jIGIvZHJpdmVycy9pbnB1dC94ZW4ta2JkZnJvbnQuYwppbmRleCBiMTE1NzI2Li5jNzIxYzBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3hlbi1rYmRmcm9udC5jCisrKyBiL2RyaXZlcnMvaW5wdXQveGVuLWtiZGZyb250LmMKQEAgLTIxLDcgKzIxLDEwIEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorCiAjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcnZpc29yLmg+CisKKyNpbmNsdWRlIDx4ZW4veGVuLmg+CiAjaW5jbHVkZSA8eGVuL2V2ZW50cy5oPgogI2luY2x1ZGUgPHhlbi9wYWdlLmg+CiAjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS9pby9mYmlmLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9jb21tb24uYyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2NvbW1vbi5jCmluZGV4IDgyZWQxY2QuLjY2NGIwYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2NvbW1vbi5jCkBAIC0yOSw3ICsyOSw3IEBACiAjZW5kaWYKIAogLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KLWludCBnaWdhc2V0X2RlYnVnbGV2ZWwgPSBERUJVR19ERUZBVUxUOworaW50IGdpZ2FzZXRfZGVidWdsZXZlbDsKIEVYUE9SVF9TWU1CT0xfR1BMKGdpZ2FzZXRfZGVidWdsZXZlbCk7CiBtb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGdpZ2FzZXRfZGVidWdsZXZlbCwgaW50LCBTX0lSVUdPfFNfSVdVU1IpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImRlYnVnIGxldmVsIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL2F2bV9jcy5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS9hdm1fY3MuYwppbmRleCA1YTZhZTY0Li45NGI3OTZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL2F2bV9jcy5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9hdm0vYXZtX2NzLmMKQEAgLTEwOCw4ICsxMDgsNyBAQAogICAgIHBfZGV2LT5pby5OdW1Qb3J0czIgPSAwOwogCiAgICAgLyogSW50ZXJydXB0IHNldHVwICovCi0gICAgcF9kZXYtPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFOwotICAgIHBfZGV2LT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0RZTkFNSUNfU0hBUklOR3xJUlFfRklSU1RfU0hBUkVEOworICAgIHBfZGV2LT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0RZTkFNSUNfU0hBUklORzsKIAogICAgIC8qIEdlbmVyYWwgc29ja2V0IGNvbmZpZ3VyYXRpb24gKi8KICAgICBwX2Rldi0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2F2bWExX2NzLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvYXZtYTFfY3MuYwppbmRleCBmOWJkZmYzLi5lNWRlYjE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvYXZtYTFfY3MuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvYXZtYTFfY3MuYwpAQCAtMTIwLDggKzEyMCw3IEBACiAgICAgcF9kZXYtPmlvLklPQWRkckxpbmVzID0gNTsKIAogICAgIC8qIEludGVycnVwdCBzZXR1cCAqLwotICAgIHBfZGV2LT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRTsKLSAgICBwX2Rldi0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9EWU5BTUlDX1NIQVJJTkd8SVJRX0ZJUlNUX1NIQVJFRDsKKyAgICBwX2Rldi0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9EWU5BTUlDX1NIQVJJTkc7CiAKICAgICAvKiBHZW5lcmFsIHNvY2tldCBjb25maWd1cmF0aW9uICovCiAgICAgcF9kZXYtPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9lbHNhX2NzLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvZWxzYV9jcy5jCmluZGV4IGEyZjcwOWYuLmM5YTMwYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9lbHNhX2NzLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2Vsc2FfY3MuYwpAQCAtMTM3LDcgKzEzNyw3IEBACiAgICAgbG9jYWwtPmNhcmRuciA9IC0xOwogCiAgICAgLyogSW50ZXJydXB0IHNldHVwICovCi0gICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9EWU5BTUlDX1NIQVJJTkd8SVJRX0ZJUlNUX1NIQVJFRDsKKyAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0RZTkFNSUNfU0hBUklORzsKICAgICBsaW5rLT5pcnEuSGFuZGxlciA9IE5VTEw7CiAKICAgICAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L3NlZGxiYXVlcl9jcy5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L3NlZGxiYXVlcl9jcy5jCmluZGV4IGFmNWQzOTMuLjc4MzZlYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9zZWRsYmF1ZXJfY3MuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvc2VkbGJhdWVyX2NzLmMKQEAgLTE0NCw3ICsxNDQsNyBAQAogICAgIGxpbmstPnByaXYgPSBsb2NhbDsKIAogICAgIC8qIEludGVycnVwdCBzZXR1cCAqLwotICAgIGxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRFlOQU1JQ19TSEFSSU5HfElSUV9GSVJTVF9TSEFSRUQ7CisgICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9EWU5BTUlDX1NIQVJJTkc7CiAgICAgbGluay0+aXJxLkhhbmRsZXIgPSBOVUxMOwogCiAgICAgLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC90ZWxlc19jcy5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L3RlbGVzX2NzLmMKaW5kZXggZWE3MDUzOS4uYjBjNTk3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L3RlbGVzX2NzLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L3RlbGVzX2NzLmMKQEAgLTEyNyw3ICsxMjcsNyBAQAogICAgIGxpbmstPnByaXYgPSBsb2NhbDsKIAogICAgIC8qIEludGVycnVwdCBzZXR1cCAqLwotICAgIGxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRFlOQU1JQ19TSEFSSU5HfElSUV9GSVJTVF9TSEFSRUQ7CisgICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9EWU5BTUlDX1NIQVJJTkc7CiAgICAgbGluay0+aXJxLkhhbmRsZXIgPSBOVUxMOwogCiAgICAgLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLWZzZy5jIGIvZHJpdmVycy9sZWRzL2xlZHMtZnNnLmMKaW5kZXggNWY3YzljNS4uZDExZDA1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtZnNnLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtZnNnLmMKQEAgLTIyLDYgKzIyLDEzIEBACiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCisjZGVmaW5lIEZTR19MRURfV0xBTl9CSVQJMAorI2RlZmluZSBGU0dfTEVEX1dBTl9CSVQJCTEKKyNkZWZpbmUgRlNHX0xFRF9TQVRBX0JJVAkyCisjZGVmaW5lIEZTR19MRURfVVNCX0JJVAkJNAorI2RlZmluZSBGU0dfTEVEX1JJTkdfQklUCTUKKyNkZWZpbmUgRlNHX0xFRF9TWU5DX0JJVAk3CisKIHN0YXRpYyBzaG9ydCBfX2lvbWVtICpsYXRjaF9hZGRyZXNzOwogc3RhdGljIHVuc2lnbmVkIHNob3J0IGxhdGNoX3ZhbHVlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xndWVzdC94ODYvY29yZS5jIGIvZHJpdmVycy9sZ3Vlc3QveDg2L2NvcmUuYwppbmRleCA2YWUzODg4Li5mYjJiN2VmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xndWVzdC94ODYvY29yZS5jCisrKyBiL2RyaXZlcnMvbGd1ZXN0L3g4Ni9jb3JlLmMKQEAgLTY5LDcgKzY5LDcgQEAKIAkJICAoU1dJVENIRVJfQUREUiArIFNIQVJFRF9TV0lUQ0hFUl9QQUdFUypQQUdFX1NJWkUpKVtjcHVdKTsKIH0KIAotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBsZ19jcHUgKiwgbGFzdF9jcHUpOworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBsZ19jcHUgKiwgbGdfbGFzdF9jcHUpOwogCiAvKlM6MDEwCiAgKiBXZSBhcHByb2FjaCB0aGUgU3dpdGNoZXIuCkBAIC05MCw4ICs5MCw4IEBACiAJICogbWVhbndoaWxlKS4gIElmIHRoYXQncyBub3QgdGhlIGNhc2UsIHdlIHByZXRlbmQgZXZlcnl0aGluZyBpbiB0aGUKIAkgKiBHdWVzdCBoYXMgY2hhbmdlZC4KIAkgKi8KLQlpZiAoX19nZXRfY3B1X3ZhcihsYXN0X2NwdSkgIT0gY3B1IHx8IGNwdS0+bGFzdF9wYWdlcyAhPSBwYWdlcykgewotCQlfX2dldF9jcHVfdmFyKGxhc3RfY3B1KSA9IGNwdTsKKwlpZiAoX19nZXRfY3B1X3ZhcihsZ19sYXN0X2NwdSkgIT0gY3B1IHx8IGNwdS0+bGFzdF9wYWdlcyAhPSBwYWdlcykgeworCQlfX2dldF9jcHVfdmFyKGxnX2xhc3RfY3B1KSA9IGNwdTsKIAkJY3B1LT5sYXN0X3BhZ2VzID0gcGFnZXM7CiAJCWNwdS0+Y2hhbmdlZCA9IENIQU5HRURfQUxMOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX2FzaWMuYyBiL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX2FzaWMuYwppbmRleCA1ODhhNWIwLi4yNmEzMDNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9tYWNpb19hc2ljLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW9fYXNpYy5jCkBAIC0zNzksNiArMzc5LDExIEBACiAJZGV2LT5vZmRldi5kZXYucGFyZW50ID0gcGFyZW50OwogCWRldi0+b2ZkZXYuZGV2LmJ1cyA9ICZtYWNpb19idXNfdHlwZTsKIAlkZXYtPm9mZGV2LmRldi5yZWxlYXNlID0gbWFjaW9fcmVsZWFzZV9kZXY7CisJZGV2LT5vZmRldi5kZXYuZG1hX3Bhcm1zID0gJmRldi0+ZG1hX3Bhcm1zOworCisJLyogU3RhbmRhcmQgRE1BIHBhcmVtZXRlcnMgKi8KKwlkbWFfc2V0X21heF9zZWdfc2l6ZSgmZGV2LT5vZmRldi5kZXYsIDY1NTM2KTsKKwlkbWFfc2V0X3NlZ19ib3VuZGFyeSgmZGV2LT5vZmRldi5kZXYsIDB4ZmZmZmZmZmYpOwogCiAjaWZkZWYgQ09ORklHX1BDSQogCS8qIFNldCB0aGUgRE1BIG9wcyB0byB0aGUgb25lcyBmcm9tIHRoZSBQQ0kgZGV2aWNlLCB0aGlzIGNvdWxkIGJlCkBAIC01MzgsNiArNTQzLDQyIEBACiAJZHJpdmVyX3VucmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKIH0KIAorLyogTWFuYWdlZCBNYWNJTyByZXNvdXJjZXMgKi8KK3N0cnVjdCBtYWNpb19kZXZyZXMgeworCXUzMglyZXNfbWFzazsKK307CisKK3N0YXRpYyB2b2lkIG1hY2lvbV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmdlbmRldiwgdm9pZCAqcmVzKQoreworCXN0cnVjdCBtYWNpb19kZXYgKmRldiA9IHRvX21hY2lvX2RldmljZShnZW5kZXYpOworCXN0cnVjdCBtYWNpb19kZXZyZXMgKmRyID0gcmVzOworCWludCBpLCBtYXg7CisKKwltYXggPSBtaW4oZGV2LT5uX3Jlc291cmNlcywgMzIpOworCWZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykgeworCQlpZiAoZHItPnJlc19tYXNrICYgKDEgPDwgaSkpCisJCQltYWNpb19yZWxlYXNlX3Jlc291cmNlKGRldiwgaSk7CisJfQorfQorCitpbnQgbWFjaW9fZW5hYmxlX2RldnJlcyhzdHJ1Y3QgbWFjaW9fZGV2ICpkZXYpCit7CisJc3RydWN0IG1hY2lvX2RldnJlcyAqZHI7CisKKwlkciA9IGRldnJlc19maW5kKCZkZXYtPm9mZGV2LmRldiwgbWFjaW9tX3JlbGVhc2UsIE5VTEwsIE5VTEwpOworCWlmICghZHIpIHsKKwkJZHIgPSBkZXZyZXNfYWxsb2MobWFjaW9tX3JlbGVhc2UsIHNpemVvZigqZHIpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFkcikKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXR1cm4gZGV2cmVzX2dldCgmZGV2LT5vZmRldi5kZXYsIGRyLCBOVUxMLCBOVUxMKSAhPSBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IG1hY2lvX2RldnJlcyAqIGZpbmRfbWFjaW9fZHIoc3RydWN0IG1hY2lvX2RldiAqZGV2KQoreworCXJldHVybiBkZXZyZXNfZmluZCgmZGV2LT5vZmRldi5kZXYsIG1hY2lvbV9yZWxlYXNlLCBOVUxMLCBOVUxMKTsKK30KKwogLyoqCiAgKgltYWNpb19yZXF1ZXN0X3Jlc291cmNlIC0gUmVxdWVzdCBhbiBNTUlPIHJlc291cmNlCiAgKiAJQGRldjogcG9pbnRlciB0byB0aGUgZGV2aWNlIGhvbGRpbmcgdGhlIHJlc291cmNlCkBAIC01NTUsNiArNTk2LDggQEAKIGludCBtYWNpb19yZXF1ZXN0X3Jlc291cmNlKHN0cnVjdCBtYWNpb19kZXYgKmRldiwgaW50IHJlc291cmNlX25vLAogCQkJICAgY29uc3QgY2hhciAqbmFtZSkKIHsKKwlzdHJ1Y3QgbWFjaW9fZGV2cmVzICpkciA9IGZpbmRfbWFjaW9fZHIoZGV2KTsKKwogCWlmIChtYWNpb19yZXNvdXJjZV9sZW4oZGV2LCByZXNvdXJjZV9ubykgPT0gMCkKIAkJcmV0dXJuIDA7CiAJCQpAQCAtNTYyLDYgKzYwNSw5IEBACiAJCQkJbWFjaW9fcmVzb3VyY2VfbGVuKGRldiwgcmVzb3VyY2Vfbm8pLAogCQkJCW5hbWUpKQogCQlnb3RvIGVycl9vdXQ7CisKKwlpZiAoZHIgJiYgcmVzb3VyY2Vfbm8gPCAzMikKKwkJZHItPnJlc19tYXNrIHw9IDEgPDwgcmVzb3VyY2Vfbm87CiAJCiAJcmV0dXJuIDA7CiAKQEAgLTU4MiwxMCArNjI4LDE0IEBACiAgKi8KIHZvaWQgbWFjaW9fcmVsZWFzZV9yZXNvdXJjZShzdHJ1Y3QgbWFjaW9fZGV2ICpkZXYsIGludCByZXNvdXJjZV9ubykKIHsKKwlzdHJ1Y3QgbWFjaW9fZGV2cmVzICpkciA9IGZpbmRfbWFjaW9fZHIoZGV2KTsKKwogCWlmIChtYWNpb19yZXNvdXJjZV9sZW4oZGV2LCByZXNvdXJjZV9ubykgPT0gMCkKIAkJcmV0dXJuOwogCXJlbGVhc2VfbWVtX3JlZ2lvbihtYWNpb19yZXNvdXJjZV9zdGFydChkZXYsIHJlc291cmNlX25vKSwKIAkJCSAgIG1hY2lvX3Jlc291cmNlX2xlbihkZXYsIHJlc291cmNlX25vKSk7CisJaWYgKGRyICYmIHJlc291cmNlX25vIDwgMzIpCisJCWRyLT5yZXNfbWFzayAmPSB+KDEgPDwgcmVzb3VyY2Vfbm8pOwogfQogCiAvKioKQEAgLTc0NCwzICs3OTQsNSBAQAogRVhQT1JUX1NZTUJPTChtYWNpb19yZWxlYXNlX3Jlc291cmNlKTsKIEVYUE9SVF9TWU1CT0wobWFjaW9fcmVxdWVzdF9yZXNvdXJjZXMpOwogRVhQT1JUX1NZTUJPTChtYWNpb19yZWxlYXNlX3Jlc291cmNlcyk7CitFWFBPUlRfU1lNQk9MKG1hY2lvX2VuYWJsZV9kZXZyZXMpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9tZWRpYWJheS5jIGIvZHJpdmVycy9tYWNpbnRvc2gvbWVkaWFiYXkuYwppbmRleCAwMjlhZDhjLi4wODAwMmI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9tZWRpYWJheS5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL21lZGlhYmF5LmMKQEAgLTMzLDE1ICszMyw2IEBACiAjaW5jbHVkZSA8bGludXgvYWRiLmg+CiAjaW5jbHVkZSA8bGludXgvcG11Lmg+CiAKLQotI2RlZmluZSBNQl9ERUJVRwotCi0jaWZkZWYgTUJfREVCVUcKLSNkZWZpbmUgTUJEQkcoZm10LCBhcmcuLi4pCXByaW50ayhLRVJOX0lORk8gZm10ICwgIyMgYXJnKQotI2Vsc2UKLSNkZWZpbmUgTUJEQkcoZm10LCBhcmcuLi4pCWRvIHsgfSB3aGlsZSAoMCkKLSNlbmRpZgotCiAjZGVmaW5lIE1CX0ZDUjMyKGJheSwgcikJKChiYXkpLT5iYXNlICsgKChyKSA+PiAyKSkKICNkZWZpbmUgTUJfRkNSOChiYXksIHIpCQkoKCh2b2xhdGlsZSB1OCBfX2lvbWVtICopKChiYXkpLT5iYXNlKSkgKyAocikpCiAKQEAgLTc2LDI4ICs2NywxNCBAQAogCWludAkJCQlpbmRleDsKIAlpbnQJCQkJY2FjaGVkX2dwaW87CiAJaW50CQkJCXNsZWVwaW5nOworCWludAkJCQl1c2VyX2xvY2s7CiAJc3RydWN0IG11dGV4CQkJbG9jazsKLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVfUE1BQwotCWlkZV9od2lmX3QJCQkqY2RfcG9ydDsKLQl2b2lkIF9faW9tZW0JCQkqY2RfYmFzZTsKLQlpbnQJCQkJY2RfaXJxOwotCWludAkJCQljZF9yZXRyeTsKLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0JMS19ERVZfSURFX1BNQUMpCi0JaW50IAkJCQljZF9pbmRleDsKLSNlbmRpZgogfTsKIAogI2RlZmluZSBNQVhfQkFZUwkyCiAKIHN0YXRpYyBzdHJ1Y3QgbWVkaWFfYmF5X2luZm8gbWVkaWFfYmF5c1tNQVhfQkFZU107Ci1pbnQgbWVkaWFfYmF5X2NvdW50ID0gMDsKLQotI2lmZGVmIENPTkZJR19CTEtfREVWX0lERV9QTUFDCi0vKiBjaGVjayB0aGUgYnVzeSBiaXQgaW4gdGhlIG1lZGlhLWJheSBpZGUgaW50ZXJmYWNlCi0gICAoYXNzdW1lcyB0aGUgbWVkaWEtYmF5IGNvbnRhaW5zIGFuIGlkZSBkZXZpY2UpICovCi0jZGVmaW5lIE1CX0lERV9SRUFEWShpKQkoKHJlYWRiKG1lZGlhX2JheXNbaV0uY2RfYmFzZSArIDB4NzApICYgMHg4MCkgPT0gMCkKLSNlbmRpZgorc3RhdGljIGludCBtZWRpYV9iYXlfY291bnQgPSAwOwogCiAvKgogICogV2FpdCB0aGF0IG51bWJlciBvZiBtcyBiZXR3ZWVuIGVhY2ggc3RlcCBpbiBub3JtYWwgcG9sbGluZyBtb2RlCkBAIC0xMzAsMjEgKzEwNywxMSBAQAogCiAvKgogICogV2FpdCB0aGlzIG1hbnkgdGlja3MgYWZ0ZXIgYW4gSURFIGRldmljZSAoZS5nLiBDRC1ST00pIGlzIGluc2VydGVkCi0gKiAob3IgdW50aWwgdGhlIGRldmljZSBpcyByZWFkeSkgYmVmb3JlIHdhaXRpbmcgZm9yIGJ1c3kgYml0IHRvIGRpc2FwcGVhcgorICogKG9yIHVudGlsIHRoZSBkZXZpY2UgaXMgcmVhZHkpIGJlZm9yZSBjYWxsaW5nIGludG8gdGhlIGRyaXZlcgogICovCiAjZGVmaW5lIE1CX0lERV9XQUlUCTEwMDAKIAogLyoKLSAqIFRpbWVvdXQgd2FpdGluZyBmb3IgYnVzeSBiaXQgb2YgYW4gSURFIGRldmljZSB0byBnbyBkb3duCi0gKi8KLSNkZWZpbmUgTUJfSURFX1RJTUVPVVQJNTAwMAotCi0vKgotICogTWF4IHJldHJpZXMgb2YgdGhlIGZ1bGwgcG93ZXIgdXAvZG93biBzZXF1ZW5jZSBmb3IgYW4gSURFIGRldmljZQotICovCi0jZGVmaW5lIE1BWF9DRF9SRVRSSUVTCTMKLQotLyoKICAqIFN0YXRlcyBvZiBhIG1lZGlhIGJheQogICovCiBlbnVtIHsKQEAgLTE1Myw3ICsxMjAsNiBAQAogCW1iX2VuYWJsaW5nX2JheSwJLyogZW5hYmxlIGJpdHMgc2V0LCB3YWl0aW5nIE1CX1JFU0VUX0RFTEFZICovCiAJbWJfcmVzZXR0aW5nLAkJLyogcmVzZXQgYml0IHVuc2V0LCB3YWl0aW5nIE1CX1NFVFVQX0RFTEFZICovCiAJbWJfaWRlX3Jlc2V0dGluZywJLyogSURFIHJlc2V0IGJpdCB1bnNlciwgd2FpdGluZyBNQl9JREVfV0FJVCAqLwotCW1iX2lkZV93YWl0aW5nLAkJLyogV2FpdGluZyBmb3IgQlVTWSBiaXQgdG8gZ28gYXdheSB1bnRpbCBNQl9JREVfVElNRU9VVCAqLwogCW1iX3VwLAkJCS8qIE1lZGlhIGJheSBmdWxsICovCiAJbWJfcG93ZXJpbmdfZG93bgkvKiBQb3dlcmluZyBkb3duIChhdm9pZCB0b28gZmFzdCBkb3duL3VwKSAqLwogfTsKQEAgLTM3MywxMiArMzM5LDEyIEBACiAJaWYgKG9ub2ZmKSB7CiAJCWJheS0+b3BzLT5wb3dlcihiYXksIDEpOwogCQliYXktPnN0YXRlID0gbWJfcG93ZXJpbmdfdXA7Ci0JCU1CREJHKCJtZWRpYWJheSVkOiBwb3dlcmluZyB1cFxuIiwgYmF5LT5pbmRleCk7CisJCXByX2RlYnVnKCJtZWRpYWJheSVkOiBwb3dlcmluZyB1cFxuIiwgYmF5LT5pbmRleCk7CiAJfSBlbHNlIHsgCiAJCS8qIE1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIHBvd2VyZWQgZG93biAmIGRpc2FibGVkICovCiAJCWJheS0+b3BzLT5wb3dlcihiYXksIDApOwogCQliYXktPnN0YXRlID0gbWJfcG93ZXJpbmdfZG93bjsKLQkJTUJEQkcoIm1lZGlhYmF5JWQ6IHBvd2VyaW5nIGRvd25cbiIsIGJheS0+aW5kZXgpOworCQlwcl9kZWJ1ZygibWVkaWFiYXklZDogcG93ZXJpbmcgZG93blxuIiwgYmF5LT5pbmRleCk7CiAJfQogCWJheS0+dGltZXIgPSBtc2Vjc190b19qaWZmaWVzKE1CX1BPV0VSX0RFTEFZKTsKIH0KQEAgLTM4NywxMDcgKzM1MywxMTggQEAKIHsKIAlpbnQgaWQgPSBiYXktPm9wcy0+Y29udGVudChiYXkpOwogCi0JaWYgKGlkID09IGJheS0+bGFzdF92YWx1ZSkgewotCQlpZiAoaWQgIT0gYmF5LT5jb250ZW50X2lkKSB7Ci0JCQliYXktPnZhbHVlX2NvdW50ICs9IG1zZWNzX3RvX2ppZmZpZXMoTUJfUE9MTF9ERUxBWSk7Ci0JCQlpZiAoYmF5LT52YWx1ZV9jb3VudCA+PSBtc2Vjc190b19qaWZmaWVzKE1CX1NUQUJMRV9ERUxBWSkpIHsKLQkJCQkvKiBJZiB0aGUgZGV2aWNlIHR5cGUgY2hhbmdlcyB3aXRob3V0IGdvaW5nIHRocnUKLQkJCQkgKiAiTUJfTk8iLCB3ZSBmb3JjZSBhIHBhc3MgYnkgIk1CX05PIiB0byBtYWtlIHN1cmUKLQkJCQkgKiB0aGluZ3MgYXJlIHByb3Blcmx5IHJlc2V0Ci0JCQkJICovCi0JCQkJaWYgKChpZCAhPSBNQl9OTykgJiYgKGJheS0+Y29udGVudF9pZCAhPSBNQl9OTykpIHsKLQkJCQkJaWQgPSBNQl9OTzsKLQkJCQkJTUJEQkcoIm1lZGlhYmF5JWQ6IGZvcmNpbmcgTUJfTk9cbiIsIGJheS0+aW5kZXgpOwotCQkJCX0KLQkJCQlNQkRCRygibWVkaWFiYXklZDogc3dpdGNoaW5nIHRvICVkXG4iLCBiYXktPmluZGV4LCBpZCk7Ci0JCQkJc2V0X21iX3Bvd2VyKGJheSwgaWQgIT0gTUJfTk8pOwotCQkJCWJheS0+Y29udGVudF9pZCA9IGlkOwotCQkJCWlmIChpZCA9PSBNQl9OTykgewotI2lmZGVmIENPTkZJR19CTEtfREVWX0lERV9QTUFDCi0JCQkJCWJheS0+Y2RfcmV0cnkgPSAwOwotI2VuZGlmCi0JCQkJCXByaW50ayhLRVJOX0lORk8gIm1lZGlhIGJheSAlZCBpcyBlbXB0eVxuIiwgYmF5LT5pbmRleCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSBlbHNlIHsKKwlzdGF0aWMgY2hhciAqbWJfY29udGVudF90eXBlc1tdID0geworCQkiYSBmbG9wcHkgZHJpdmUiLAorCQkiYSBmbG9wcHkgZHJpdmUiLAorCQkiYW4gdW5zdXBvcnRlZCBhdWRpbyBkZXZpY2UiLAorCQkiYW4gQVRBIGRldmljZSIsCisJCSJhbiB1bnN1cHBvcnRlZCBQQ0kgZGV2aWNlIiwKKwkJImFuIHVua25vd24gZGV2aWNlIiwKKwl9OworCisJaWYgKGlkICE9IGJheS0+bGFzdF92YWx1ZSkgewogCQliYXktPmxhc3RfdmFsdWUgPSBpZDsKIAkJYmF5LT52YWx1ZV9jb3VudCA9IDA7CisJCXJldHVybjsKKwl9CisJaWYgKGlkID09IGJheS0+Y29udGVudF9pZCkKKwkJcmV0dXJuOworCisJYmF5LT52YWx1ZV9jb3VudCArPSBtc2Vjc190b19qaWZmaWVzKE1CX1BPTExfREVMQVkpOworCWlmIChiYXktPnZhbHVlX2NvdW50ID49IG1zZWNzX3RvX2ppZmZpZXMoTUJfU1RBQkxFX0RFTEFZKSkgeworCQkvKiBJZiB0aGUgZGV2aWNlIHR5cGUgY2hhbmdlcyB3aXRob3V0IGdvaW5nIHRocnUKKwkJICogIk1CX05PIiwgd2UgZm9yY2UgYSBwYXNzIGJ5ICJNQl9OTyIgdG8gbWFrZSBzdXJlCisJCSAqIHRoaW5ncyBhcmUgcHJvcGVybHkgcmVzZXQKKwkJICovCisJCWlmICgoaWQgIT0gTUJfTk8pICYmIChiYXktPmNvbnRlbnRfaWQgIT0gTUJfTk8pKSB7CisJCQlpZCA9IE1CX05POworCQkJcHJfZGVidWcoIm1lZGlhYmF5JWQ6IGZvcmNpbmcgTUJfTk9cbiIsIGJheS0+aW5kZXgpOworCQl9CisJCXByX2RlYnVnKCJtZWRpYWJheSVkOiBzd2l0Y2hpbmcgdG8gJWRcbiIsIGJheS0+aW5kZXgsIGlkKTsKKwkJc2V0X21iX3Bvd2VyKGJheSwgaWQgIT0gTUJfTk8pOworCQliYXktPmNvbnRlbnRfaWQgPSBpZDsKKwkJaWYgKGlkID49IE1CX05PIHx8IGlkIDwgMCkKKwkJCXByaW50ayhLRVJOX0lORk8gIm1lZGlhYmF5JWQ6IEJheSBpcyBub3cgZW1wdHlcbiIsIGJheS0+aW5kZXgpOworCQllbHNlCisJCQlwcmludGsoS0VSTl9JTkZPICJtZWRpYWJheSVkOiBCYXkgY29udGFpbnMgJXNcbiIsCisJCQkgICAgICAgYmF5LT5pbmRleCwgbWJfY29udGVudF90eXBlc1tpZF0pOwogCX0KIH0KIAotI2lmZGVmIENPTkZJR19CTEtfREVWX0lERV9QTUFDCi1pbnQgY2hlY2tfbWVkaWFfYmF5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqd2hpY2hfYmF5LCBpbnQgd2hhdCkKK2ludCBjaGVja19tZWRpYV9iYXkoc3RydWN0IG1hY2lvX2RldiAqYmF5ZGV2KQogewotCWludAlpOworCXN0cnVjdCBtZWRpYV9iYXlfaW5mbyogYmF5OworCWludCBpZDsKIAotCWZvciAoaT0wOyBpPG1lZGlhX2JheV9jb3VudDsgaSsrKQotCQlpZiAobWVkaWFfYmF5c1tpXS5tZGV2ICYmIHdoaWNoX2JheSA9PSBtZWRpYV9iYXlzW2ldLm1kZXYtPm9mZGV2Lm5vZGUpIHsKLQkJCWlmICgod2hhdCA9PSBtZWRpYV9iYXlzW2ldLmNvbnRlbnRfaWQpICYmIG1lZGlhX2JheXNbaV0uc3RhdGUgPT0gbWJfdXApCi0JCQkJcmV0dXJuIDA7Ci0JCQltZWRpYV9iYXlzW2ldLmNkX2luZGV4ID0gLTE7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCXJldHVybiAtRU5PREVWOworCWlmIChiYXlkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIE1CX05POworCisJLyogVGhpcyByZXR1cm5zIGFuIGluc3RhbnQgc25hcHNob3QsIG5vdCBsb2NraW5nLCBzaW5lCisJICogd2UgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZSBiYXkgbG9jayBoZWxkLiBUaGUgcmVzdWx0aW5nCisJICogZnV6enluZXNzIG9mIHRoZSByZXN1bHQgaWYgY2FsbGVkIGF0IHRoZSB3cm9uZyB0aW1lIGlzCisJICogbm90IGFjdHVhbGx5IGEgaHVnZSBkZWFsCisJICovCisJYmF5ID0gbWFjaW9fZ2V0X2RydmRhdGEoYmF5ZGV2KTsKKwlpZiAoYmF5ID09IE5VTEwpCisJCXJldHVybiBNQl9OTzsKKwlpZCA9IGJheS0+Y29udGVudF9pZDsKKwlpZiAoYmF5LT5zdGF0ZSAhPSBtYl91cCkKKwkJcmV0dXJuIE1CX05POworCWlmIChpZCA9PSBNQl9GRDEpCisJCXJldHVybiBNQl9GRDsKKwlyZXR1cm4gaWQ7CiB9Ci1FWFBPUlRfU1lNQk9MKGNoZWNrX21lZGlhX2JheSk7CitFWFBPUlRfU1lNQk9MX0dQTChjaGVja19tZWRpYV9iYXkpOwogCi1pbnQgY2hlY2tfbWVkaWFfYmF5X2J5X2Jhc2UodW5zaWduZWQgbG9uZyBiYXNlLCBpbnQgd2hhdCkKK3ZvaWQgbG9ja19tZWRpYV9iYXkoc3RydWN0IG1hY2lvX2RldiAqYmF5ZGV2KQogewotCWludAlpOworCXN0cnVjdCBtZWRpYV9iYXlfaW5mbyogYmF5OwogCi0JZm9yIChpPTA7IGk8bWVkaWFfYmF5X2NvdW50OyBpKyspCi0JCWlmIChtZWRpYV9iYXlzW2ldLm1kZXYgJiYgYmFzZSA9PSAodW5zaWduZWQgbG9uZykgbWVkaWFfYmF5c1tpXS5jZF9iYXNlKSB7Ci0JCQlpZiAoKHdoYXQgPT0gbWVkaWFfYmF5c1tpXS5jb250ZW50X2lkKSAmJiBtZWRpYV9iYXlzW2ldLnN0YXRlID09IG1iX3VwKQotCQkJCXJldHVybiAwOwotCQkJbWVkaWFfYmF5c1tpXS5jZF9pbmRleCA9IC0xOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0gCi0KLQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoYmF5ZGV2ID09IE5VTEwpCisJCXJldHVybjsKKwliYXkgPSBtYWNpb19nZXRfZHJ2ZGF0YShiYXlkZXYpOworCWlmIChiYXkgPT0gTlVMTCkKKwkJcmV0dXJuOworCW11dGV4X2xvY2soJmJheS0+bG9jayk7CisJYmF5LT51c2VyX2xvY2sgPSAxOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoY2hlY2tfbWVkaWFfYmF5X2J5X2Jhc2UpOworRVhQT1JUX1NZTUJPTF9HUEwobG9ja19tZWRpYV9iYXkpOwogCi1pbnQgbWVkaWFfYmF5X3NldF9pZGVfaW5mb3Moc3RydWN0IGRldmljZV9ub2RlKiB3aGljaF9iYXksIHVuc2lnbmVkIGxvbmcgYmFzZSwKLQkJCSAgICBpbnQgaXJxLCBpZGVfaHdpZl90ICpod2lmKQordm9pZCB1bmxvY2tfbWVkaWFfYmF5KHN0cnVjdCBtYWNpb19kZXYgKmJheWRldikKIHsKLQlpbnQJaTsKKwlzdHJ1Y3QgbWVkaWFfYmF5X2luZm8qIGJheTsKIAotCWZvciAoaT0wOyBpPG1lZGlhX2JheV9jb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCBtZWRpYV9iYXlfaW5mbyogYmF5ID0gJm1lZGlhX2JheXNbaV07Ci0KLQkJaWYgKGJheS0+bWRldiAmJiB3aGljaF9iYXkgPT0gYmF5LT5tZGV2LT5vZmRldi5ub2RlKSB7Ci0JCQlpbnQgdGltZW91dCA9IDUwMDAsIGluZGV4ID0gaHdpZi0+aW5kZXg7Ci0JCQkKLQkJCW11dGV4X2xvY2soJmJheS0+bG9jayk7Ci0KLQkJCWJheS0+Y2RfcG9ydAk9IGh3aWY7Ci0gCQkJYmF5LT5jZF9iYXNlCT0gKHZvaWQgX19pb21lbSAqKSBiYXNlOwotCQkJYmF5LT5jZF9pcnEJPSBpcnE7Ci0KLQkJCWlmICgoTUJfQ0QgIT0gYmF5LT5jb250ZW50X2lkKSB8fCBiYXktPnN0YXRlICE9IG1iX3VwKSB7Ci0JCQkJbXV0ZXhfdW5sb2NrKCZiYXktPmxvY2spOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJcHJpbnRrKEtFUk5fREVCVUcgIlJlZ2lzdGVyZWQgaWRlJWQgZm9yIG1lZGlhIGJheSAlZFxuIiwgaW5kZXgsIGkpOwotCQkJZG8gewotCQkJCWlmIChNQl9JREVfUkVBRFkoaSkpIHsKLQkJCQkJYmF5LT5jZF9pbmRleAk9IGluZGV4OwotCQkJCQltdXRleF91bmxvY2soJmJheS0+bG9jayk7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCQltZGVsYXkoMSk7Ci0JCQl9IHdoaWxlKC0tdGltZW91dCk7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiVGltZW91bnQgd2FpdGluZyBJREUgaW4gYmF5ICVkXG4iLCBpKTsKLQkJCW11dGV4X3VubG9jaygmYmF5LT5sb2NrKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9CisJaWYgKGJheWRldiA9PSBOVUxMKQorCQlyZXR1cm47CisJYmF5ID0gbWFjaW9fZ2V0X2RydmRhdGEoYmF5ZGV2KTsKKwlpZiAoYmF5ID09IE5VTEwpCisJCXJldHVybjsKKwlpZiAoYmF5LT51c2VyX2xvY2spIHsKKwkJYmF5LT51c2VyX2xvY2sgPSAwOworCQltdXRleF91bmxvY2soJmJheS0+bG9jayk7CiAJfQotCi0JcmV0dXJuIC1FTk9ERVY7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChtZWRpYV9iYXlfc2V0X2lkZV9pbmZvcyk7Ci0jZW5kaWYgLyogQ09ORklHX0JMS19ERVZfSURFX1BNQUMgKi8KK0VYUE9SVF9TWU1CT0xfR1BMKHVubG9ja19tZWRpYV9iYXkpOworCitzdGF0aWMgaW50IG1iX2Jyb2FkY2FzdF9ob3RwbHVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbWVkaWFfYmF5X2luZm8qIGJheSA9IGRhdGE7CisJc3RydWN0IG1hY2lvX2RldiAqbWRldjsKKwlzdHJ1Y3QgbWFjaW9fZHJpdmVyICpkcnY7CisJaW50IHN0YXRlOworCisJaWYgKGRldi0+YnVzICE9ICZtYWNpb19idXNfdHlwZSkKKwkJcmV0dXJuIDA7CisKKwlzdGF0ZSA9IGJheS0+c3RhdGUgPT0gbWJfdXAgPyBiYXktPmNvbnRlbnRfaWQgOiBNQl9OTzsKKwlpZiAoc3RhdGUgPT0gTUJfRkQxKQorCQlzdGF0ZSA9IE1CX0ZEOworCW1kZXYgPSB0b19tYWNpb19kZXZpY2UoZGV2KTsKKwlkcnYgPSB0b19tYWNpb19kcml2ZXIoZGV2LT5kcml2ZXIpOworCWlmIChkZXYtPmRyaXZlciAmJiBkcnYtPm1lZGlhYmF5X2V2ZW50KQorCQlkcnYtPm1lZGlhYmF5X2V2ZW50KG1kZXYsIHN0YXRlKTsKKwlyZXR1cm4gMDsKK30KIAogc3RhdGljIHZvaWQgbWVkaWFfYmF5X3N0ZXAoaW50IGkpCiB7CkBAIC00OTcsOCArNDc0LDggQEAKIAlpZiAoYmF5LT5zdGF0ZSAhPSBtYl9wb3dlcmluZ19kb3duKQogCSAgICBwb2xsX21lZGlhX2JheShiYXkpOwogCi0JLyogSWYgdGltZXIgZXhwaXJlZCBvciBwb2xsaW5nIElERSBidXN5LCBydW4gc3RhdGUgbWFjaGluZSAqLwotCWlmICgoYmF5LT5zdGF0ZSAhPSBtYl9pZGVfd2FpdGluZykgJiYgKGJheS0+dGltZXIgIT0gMCkpIHsKKwkvKiBJZiB0aW1lciBleHBpcmVkIHJ1biBzdGF0ZSBtYWNoaW5lICovCisJaWYgKGJheS0+dGltZXIgIT0gMCkgewogCQliYXktPnRpbWVyIC09IG1zZWNzX3RvX2ppZmZpZXMoTUJfUE9MTF9ERUxBWSk7CiAJCWlmIChiYXktPnRpbWVyID4gMCkKIAkJCXJldHVybjsKQEAgLTUwOCwxMDAgKzQ4NSw1MCBAQAogCXN3aXRjaChiYXktPnN0YXRlKSB7CiAJY2FzZSBtYl9wb3dlcmluZ191cDoKIAkgICAgCWlmIChiYXktPm9wcy0+c2V0dXBfYnVzKGJheSwgYmF5LT5sYXN0X3ZhbHVlKSA8IDApIHsKLQkJCU1CREJHKCJtZWRpYWJheSVkOiBkZXZpY2Ugbm90IHN1cHBvcnRlZCAoa2luZDolZClcbiIsIGksIGJheS0+Y29udGVudF9pZCk7CisJCQlwcl9kZWJ1ZygibWVkaWFiYXklZDogZGV2aWNlIG5vdCBzdXBwb3J0ZWQgKGtpbmQ6JWQpXG4iLAorCQkJCSBpLCBiYXktPmNvbnRlbnRfaWQpOwogCSAgICAJCXNldF9tYl9wb3dlcihiYXksIDApOwogCSAgICAJCWJyZWFrOwogCSAgICAJfQogCSAgICAJYmF5LT50aW1lciA9IG1zZWNzX3RvX2ppZmZpZXMoTUJfUkVTRVRfREVMQVkpOwogCSAgICAJYmF5LT5zdGF0ZSA9IG1iX2VuYWJsaW5nX2JheTsKLQkJTUJEQkcoIm1lZGlhYmF5JWQ6IGVuYWJsaW5nIChraW5kOiVkKVxuIiwgaSwgYmF5LT5jb250ZW50X2lkKTsKKwkJcHJfZGVidWcoIm1lZGlhYmF5JWQ6IGVuYWJsaW5nIChraW5kOiVkKVxuIiwgaSwgYmF5LT5jb250ZW50X2lkKTsKIAkJYnJlYWs7CiAJY2FzZSBtYl9lbmFibGluZ19iYXk6CiAJCWJheS0+b3BzLT51bl9yZXNldChiYXkpOwogCSAgICAJYmF5LT50aW1lciA9IG1zZWNzX3RvX2ppZmZpZXMoTUJfU0VUVVBfREVMQVkpOwogCSAgICAJYmF5LT5zdGF0ZSA9IG1iX3Jlc2V0dGluZzsKLQkJTUJEQkcoIm1lZGlhYmF5JWQ6IHdhaXRpbmcgcmVzZXQgKGtpbmQ6JWQpXG4iLCBpLCBiYXktPmNvbnRlbnRfaWQpOworCQlwcl9kZWJ1ZygibWVkaWFiYXklZDogcmVsZWFzaW5nIGJheSByZXNldCAoa2luZDolZClcbiIsCisJCQkgaSwgYmF5LT5jb250ZW50X2lkKTsKIAkgICAgCWJyZWFrOwogCWNhc2UgbWJfcmVzZXR0aW5nOgogCQlpZiAoYmF5LT5jb250ZW50X2lkICE9IE1CX0NEKSB7Ci0JCQlNQkRCRygibWVkaWFiYXklZDogYmF5IGlzIHVwIChraW5kOiVkKVxuIiwgaSwgYmF5LT5jb250ZW50X2lkKTsKKwkJCXByX2RlYnVnKCJtZWRpYWJheSVkOiBiYXkgaXMgdXAgKGtpbmQ6JWQpXG4iLCBpLAorCQkJCSBiYXktPmNvbnRlbnRfaWQpOwogCQkJYmF5LT5zdGF0ZSA9IG1iX3VwOworCQkJZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKCZiYXktPm1kZXYtPm9mZGV2LmRldiwKKwkJCQkJICAgICAgYmF5LCBtYl9icm9hZGNhc3RfaG90cGx1Zyk7CiAJCQlicmVhazsKIAkgICAgCX0KLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVfUE1BQwotCQlNQkRCRygibWVkaWFiYXklZDogd2FpdGluZyBJREUgcmVzZXQgKGtpbmQ6JWQpXG4iLCBpLCBiYXktPmNvbnRlbnRfaWQpOworCQlwcl9kZWJ1ZygibWVkaWFiYXklZDogcmVsZWFzaW5nIEFUQSByZXNldCAoa2luZDolZClcbiIsCisJCQkgaSwgYmF5LT5jb250ZW50X2lkKTsKIAkJYmF5LT5vcHMtPnVuX3Jlc2V0X2lkZShiYXkpOwogCSAgICAJYmF5LT50aW1lciA9IG1zZWNzX3RvX2ppZmZpZXMoTUJfSURFX1dBSVQpOwogCSAgICAJYmF5LT5zdGF0ZSA9IG1iX2lkZV9yZXNldHRpbmc7Ci0jZWxzZQotCQlwcmludGsoS0VSTl9ERUJVRyAibWVkaWEtYmF5ICVkIGlzIGlkZSAobm90IGNvbXBpbGVkIGluIGtlcm5lbClcbiIsIGkpOwotCQlzZXRfbWJfcG93ZXIoYmF5LCAwKTsKLSNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JREVfUE1BQyAqLwogCSAgICAJYnJlYWs7Ci0jaWZkZWYgQ09ORklHX0JMS19ERVZfSURFX1BNQUMKKwogCWNhc2UgbWJfaWRlX3Jlc2V0dGluZzoKLQkgICAgCWJheS0+dGltZXIgPSBtc2Vjc190b19qaWZmaWVzKE1CX0lERV9USU1FT1VUKTsKLQkgICAgCWJheS0+c3RhdGUgPSBtYl9pZGVfd2FpdGluZzsKLQkJTUJEQkcoIm1lZGlhYmF5JWQ6IHdhaXRpbmcgSURFIHJlYWR5IChraW5kOiVkKVxuIiwgaSwgYmF5LT5jb250ZW50X2lkKTsKKwkJcHJfZGVidWcoIm1lZGlhYmF5JWQ6IGJheSBpcyB1cCAoa2luZDolZClcbiIsIGksIGJheS0+Y29udGVudF9pZCk7CisJCWJheS0+c3RhdGUgPSBtYl91cDsKKwkJZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKCZiYXktPm1kZXYtPm9mZGV2LmRldiwKKwkJCQkgICAgICBiYXksIG1iX2Jyb2FkY2FzdF9ob3RwbHVnKTsKIAkgICAgCWJyZWFrOwotCWNhc2UgbWJfaWRlX3dhaXRpbmc6Ci0JCWlmIChiYXktPmNkX2Jhc2UgPT0gTlVMTCkgewotCQkJYmF5LT50aW1lciA9IDA7Ci0JCQliYXktPnN0YXRlID0gbWJfdXA7Ci0JCQlNQkRCRygibWVkaWFiYXklZDogdXAgYmVmb3JlIElERSBpbml0XG4iLCBpKTsKLQkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKE1CX0lERV9SRUFEWShpKSkgewotCQkJYmF5LT50aW1lciA9IDA7Ci0JCQliYXktPnN0YXRlID0gbWJfdXA7Ci0JCQlpZiAoYmF5LT5jZF9pbmRleCA8IDApIHsKLQkJCQlwcmludGsoIm1lZGlhYmF5ICVkLCByZWdpc3RlcmluZyBJREUuLi5cbiIsIGkpOwotCQkJCXBtdV9zdXNwZW5kKCk7Ci0JCQkJaWRlX3BvcnRfc2NhbihiYXktPmNkX3BvcnQpOwotCQkJCWlmIChiYXktPmNkX3BvcnQtPnByZXNlbnQpCi0JCQkJCWJheS0+Y2RfaW5kZXggPSBiYXktPmNkX3BvcnQtPmluZGV4OwotCQkJCXBtdV9yZXN1bWUoKTsKLQkJCX0KLQkJCWlmIChiYXktPmNkX2luZGV4ID09IC0xKSB7Ci0JCQkJLyogV2UgZXZlbnR1YWxseSBkbyBhIHJldHJ5ICovCi0JCQkJYmF5LT5jZF9yZXRyeSsrOwotCQkJCXByaW50aygiSURFIHJlZ2lzdGVyIGVycm9yXG4iKTsKLQkJCQlzZXRfbWJfcG93ZXIoYmF5LCAwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJpbnRrKEtFUk5fREVCVUcgIm1lZGlhLWJheSAlZCBpcyBpZGUlZFxuIiwgaSwgYmF5LT5jZF9pbmRleCk7Ci0JCQkJTUJEQkcoIm1lZGlhYmF5ICVkIElERSByZWFkeVxuIiwgaSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkgICAgCX0gZWxzZSBpZiAoYmF5LT50aW1lciA+IDApCi0JCQliYXktPnRpbWVyIC09IG1zZWNzX3RvX2ppZmZpZXMoTUJfUE9MTF9ERUxBWSk7Ci0JICAgIAlpZiAoYmF5LT50aW1lciA8PSAwKSB7Ci0JCQlwcmludGsoIlxuSURFIFRpbWVvdXQgaW4gYmF5ICVkICEsIElERSBzdGF0ZSBpczogMHglMDJ4XG4iLAotCQkJICAgICAgIGksIHJlYWRiKGJheS0+Y2RfYmFzZSArIDB4NzApKTsKLQkJCU1CREJHKCJtZWRpYWJheSVkOiBuSURFIFRpbWVvdXQgIVxuIiwgaSk7Ci0JCQlzZXRfbWJfcG93ZXIoYmF5LCAwKTsKLQkJCWJheS0+dGltZXIgPSAwOwotCSAgICAJfQotCQlicmVhazsKLSNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JREVfUE1BQyAqLworCiAJY2FzZSBtYl9wb3dlcmluZ19kb3duOgogCSAgICAJYmF5LT5zdGF0ZSA9IG1iX2VtcHR5OwotI2lmZGVmIENPTkZJR19CTEtfREVWX0lERV9QTUFDCi0gICAgCSAgICAgICAgaWYgKGJheS0+Y2RfaW5kZXggPj0gMCkgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgIlVucmVnaXN0ZXJpbmcgbWIgJWQgaWRlLCBpbmRleDolZFxuIiwgaSwKLQkJCSAgICAgICBiYXktPmNkX2luZGV4KTsKLQkJCWlkZV9wb3J0X3VucmVnaXN0ZXJfZGV2aWNlcyhiYXktPmNkX3BvcnQpOwotCQkJYmF5LT5jZF9pbmRleCA9IC0xOwotCQl9Ci0JICAgIAlpZiAoYmF5LT5jZF9yZXRyeSkgewotCQkJaWYgKGJheS0+Y2RfcmV0cnkgPiBNQVhfQ0RfUkVUUklFUykgewotCQkJCS8qIFNob3VsZCBhZGQgYW4gZXJyb3Igc291bmQgKHNvcnQgb2YgYmVlcCBpbiBkbWFzb3VuZCkgKi8KLQkJCQlwcmludGsoIlxubWVkaWEtYmF5ICVkLCBJREUgZGV2aWNlIGJhZGx5IGluc2VydGVkIG9yIHVucmVjb2duaXNlZFxuIiwgaSk7Ci0JCQl9IGVsc2UgewotCQkJCS8qIEZvcmNlIGEgbmV3IHBvd2VyIGRvd24vdXAgc2VxdWVuY2UgKi8KLQkJCQliYXktPmNvbnRlbnRfaWQgPSBNQl9OTzsKLQkJCX0KLQkgICAgCX0KLSNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JREVfUE1BQyAqLwotCQlNQkRCRygibWVkaWFiYXklZDogZW5kIG9mIHBvd2VyIGRvd25cbiIsIGkpOworCQlkZXZpY2VfZm9yX2VhY2hfY2hpbGQoJmJheS0+bWRldi0+b2ZkZXYuZGV2LAorCQkJCSAgICAgIGJheSwgbWJfYnJvYWRjYXN0X2hvdHBsdWcpOworCQlwcl9kZWJ1ZygibWVkaWFiYXklZDogZW5kIG9mIHBvd2VyIGRvd25cbiIsIGkpOwogCSAgICAJYnJlYWs7CiAJfQogfQpAQCAtNjc2LDExICs2MDMsNiBAQAogCWJheS0+bGFzdF92YWx1ZSA9IGJheS0+b3BzLT5jb250ZW50KGJheSk7CiAJYmF5LT52YWx1ZV9jb3VudCA9IG1zZWNzX3RvX2ppZmZpZXMoTUJfU1RBQkxFX0RFTEFZKTsKIAliYXktPnN0YXRlID0gbWJfZW1wdHk7Ci0JZG8gewotCQltc2xlZXAoTUJfUE9MTF9ERUxBWSk7Ci0JCW1lZGlhX2JheV9zdGVwKGkpOwotCX0gd2hpbGUoKGJheS0+c3RhdGUgIT0gbWJfZW1wdHkpICYmCi0JCShiYXktPnN0YXRlICE9IG1iX3VwKSk7CiAKIAkvKiBNYXJrIHVzIHJlYWR5IGJ5IGZpbGxpbmcgb3VyIG1kZXYgZGF0YSAqLwogCW1hY2lvX3NldF9kcnZkYXRhKG1kZXYsIGJheSk7CkBAIC03MjUsNyArNjQ3LDcgQEAKIAkgICAgICAgCXNldF9tYl9wb3dlcihiYXksIDApOwogCQltc2xlZXAoTUJfUE9XRVJfREVMQVkpOwogCSAgICAgICAJaWYgKGJheS0+b3BzLT5jb250ZW50KGJheSkgIT0gYmF5LT5jb250ZW50X2lkKSB7Ci0JCQlwcmludGsoIm1lZGlhYmF5JWQ6IGNvbnRlbnQgY2hhbmdlZCBkdXJpbmcgc2xlZXAuLi5cbiIsIGJheS0+aW5kZXgpOworCQkJcHJpbnRrKCJtZWRpYWJheSVkOiBDb250ZW50IGNoYW5nZWQgZHVyaW5nIHNsZWVwLi4uXG4iLCBiYXktPmluZGV4KTsKIAkJCW11dGV4X3VubG9jaygmYmF5LT5sb2NrKTsKIAkgICAgICAgCQlyZXR1cm4gMDsKIAkJfQpAQCAtNzMzLDkgKzY1NSw2IEBACiAJICAgICAgIAliYXktPmxhc3RfdmFsdWUgPSBiYXktPmNvbnRlbnRfaWQ7CiAJICAgICAgIAliYXktPnZhbHVlX2NvdW50ID0gbXNlY3NfdG9famlmZmllcyhNQl9TVEFCTEVfREVMQVkpOwogCSAgICAgICAJYmF5LT50aW1lciA9IG1zZWNzX3RvX2ppZmZpZXMoTUJfUE9XRVJfREVMQVkpOwotI2lmZGVmIENPTkZJR19CTEtfREVWX0lERV9QTUFDCi0JICAgICAgIAliYXktPmNkX3JldHJ5ID0gMDsKLSNlbmRpZgogCSAgICAgICAJZG8gewogCQkJbXNsZWVwKE1CX1BPTExfREVMQVkpOwogCSAgICAgICAJCW1lZGlhX2JheV9zdGVwKGJheS0+aW5kZXgpOwpAQCAtODIzLDkgKzc0Miw2IEBACiAJZm9yIChpPTA7IGk8TUFYX0JBWVM7IGkrKykgewogCQltZW1zZXQoKGNoYXIgKikmbWVkaWFfYmF5c1tpXSwgMCwgc2l6ZW9mKHN0cnVjdCBtZWRpYV9iYXlfaW5mbykpOwogCQltZWRpYV9iYXlzW2ldLmNvbnRlbnRfaWQJPSAtMTsKLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVfUE1BQwotCQltZWRpYV9iYXlzW2ldLmNkX2luZGV4CQk9IC0xOwotI2VuZGlmCiAJfQogCWlmICghbWFjaGluZV9pcyhwb3dlcm1hYykpCiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvbnZyYW0uYyBiL2RyaXZlcnMvbWFjaW50b3NoL252cmFtLmMKaW5kZXggYjE5NWQ3NS4uYzg3NjM0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvbnZyYW0uYworKysgYi9kcml2ZXJzL21hY2ludG9zaC9udnJhbS5jCkBAIC0xMyw3ICsxMyw2IEBACiAjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KICNpbmNsdWRlIDxsaW51eC9udnJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL252cmFtLmg+CiAKQEAgLTIxLDcgKzIwLDYgQEAKIAogc3RhdGljIGxvZmZfdCBudnJhbV9sbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnaW4pCiB7Ci0JbG9ja19rZXJuZWwoKTsKIAlzd2l0Y2ggKG9yaWdpbikgewogCWNhc2UgMToKIAkJb2Zmc2V0ICs9IGZpbGUtPmZfcG9zOwpAQCAtMzAsMTIgKzI4LDEwIEBACiAJCW9mZnNldCArPSBOVlJBTV9TSVpFOwogCQlicmVhazsKIAl9Ci0JaWYgKG9mZnNldCA8IDApIHsKLQkJdW5sb2NrX2tlcm5lbCgpOworCWlmIChvZmZzZXQgPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisKIAlmaWxlLT5mX3BvcyA9IG9mZnNldDsKLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIGZpbGUtPmZfcG9zOwogfQogCkBAIC03Niw4ICs3Miw3IEBACiAJcmV0dXJuIHAgLSBidWY7CiB9CiAKLXN0YXRpYyBpbnQgbnZyYW1faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgbG9uZyBudnJhbV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3dpdGNoKGNtZCkgewogCQljYXNlIFBNQUNfTlZSQU1fR0VUX09GRlNFVDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX2FkdDc0NnguYyBiL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX2FkdDc0NnguYwppbmRleCA1NTZmMGZlLi41ZmY0N2JhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC90aGVybV9hZHQ3NDZ4LmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fYWR0NzQ2eC5jCkBAIC03OSw2ICs3OSw3IEBACiAJdTgJCQlsaW1pdHNbM107CiAJaW50CQkJbGFzdF9zcGVlZFsyXTsKIAlpbnQJCQlsYXN0X3ZhclsyXTsKKwlpbnQJCQlwd21faW52WzJdOwogfTsKIAogc3RhdGljIGVudW0ge0FEVDc0NjAsIEFEVDc0Njd9IHRoZXJtX3R5cGU7CkBAIC0yMjksMTkgKzIzMCwyMyBAQAogCQogCWlmIChzcGVlZCA+PSAwKSB7CiAJCW1hbnVhbCA9IHJlYWRfcmVnKHRoLCBNQU5VQUxfTU9ERVtmYW5dKTsKKwkJbWFudWFsICY9IH5JTlZFUlRfTUFTSzsKIAkJd3JpdGVfcmVnKHRoLCBNQU5VQUxfTU9ERVtmYW5dLAotCQkJKG1hbnVhbHxNQU5VQUxfTUFTSykgJiAofklOVkVSVF9NQVNLKSk7CisJCQltYW51YWwgfCBNQU5VQUxfTUFTSyB8IHRoLT5wd21faW52W2Zhbl0pOwogCQl3cml0ZV9yZWcodGgsIEZBTl9TUERfU0VUW2Zhbl0sIHNwZWVkKTsKIAl9IGVsc2UgewogCQkvKiBiYWNrIHRvIGF1dG9tYXRpYyAqLwogCQlpZih0aGVybV90eXBlID09IEFEVDc0NjApIHsKIAkJCW1hbnVhbCA9IHJlYWRfcmVnKHRoLAogCQkJCU1BTlVBTF9NT0RFW2Zhbl0pICYgKH5NQU5VQUxfTUFTSyk7Ci0KKwkJCW1hbnVhbCAmPSB+SU5WRVJUX01BU0s7CisJCQltYW51YWwgfD0gdGgtPnB3bV9pbnZbZmFuXTsKIAkJCXdyaXRlX3JlZyh0aCwKIAkJCQlNQU5VQUxfTU9ERVtmYW5dLCBtYW51YWx8UkVNX0NPTlRST0xbZmFuXSk7CiAJCX0gZWxzZSB7CiAJCQltYW51YWwgPSByZWFkX3JlZyh0aCwgTUFOVUFMX01PREVbZmFuXSk7CisJCQltYW51YWwgJj0gfklOVkVSVF9NQVNLOworCQkJbWFudWFsIHw9IHRoLT5wd21faW52W2Zhbl07CiAJCQl3cml0ZV9yZWcodGgsIE1BTlVBTF9NT0RFW2Zhbl0sIG1hbnVhbCYofkFVVE9fTUFTSykpOwogCQl9CiAJfQpAQCAtMzg3LDcgKzM5Miw3IEBACiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgdGgpOwogCXRoLT5jbHQgPSBjbGllbnQ7CiAKLQlyYyA9IHJlYWRfcmVnKHRoLCAwKTsKKwlyYyA9IHJlYWRfcmVnKHRoLCBDT05GSUdfUkVHKTsKIAlpZiAocmMgPCAwKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiVGhlcm1vc3RhdCBmYWlsZWQgdG8gcmVhZCBjb25maWchXG4iKTsKIAkJa2ZyZWUodGgpOwpAQCAtNDE4LDYgKzQyMywxMCBAQAogCiAJdGhlcm1vc3RhdCA9IHRoOwogCisJLyogcmVjb3JkIGludmVydCBiaXQgc3RhdHVzIGJlY2F1c2UgZncgY2FuIGNvcnJ1cHQgaXQgYWZ0ZXIgc3VzcGVuZCAqLworCXRoLT5wd21faW52WzBdID0gcmVhZF9yZWcodGgsIE1BTlVBTF9NT0RFWzBdKSAmIElOVkVSVF9NQVNLOworCXRoLT5wd21faW52WzFdID0gcmVhZF9yZWcodGgsIE1BTlVBTF9NT0RFWzFdKSAmIElOVkVSVF9NQVNLOworCiAJLyogYmUgc3VyZSB0byByZWFsbHkgd3JpdGUgZmFuIHNwZWVkIHRoZSBmaXJzdCB0aW1lICovCiAJdGgtPmxhc3Rfc3BlZWRbMF0gPSAtMjsKIAl0aC0+bGFzdF9zcGVlZFsxXSA9IC0yOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvdmlhLXBtdS5jIGIvZHJpdmVycy9tYWNpbnRvc2gvdmlhLXBtdS5jCmluZGV4IDZmMzA4YTQuLmRiMzc5YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXUuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11LmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpAQCAtMTg2LDE3ICsxODcsMTEgQEAKIHN0YXRpYyB2b2lkIHBtdV9zdGFydCh2b2lkKTsKIHN0YXRpYyBpcnFyZXR1cm5fdCB2aWFfcG11X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICphcmcpOwogc3RhdGljIGlycXJldHVybl90IGdwaW8xX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICphcmcpOwotc3RhdGljIGludCBwcm9jX2dldF9pbmZvKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAotCQkJICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLXN0YXRpYyBpbnQgcHJvY19nZXRfaXJxc3RhdHMoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCi0JCQkgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcG11X2luZm9fcHJvY19mb3BzOworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcG11X2lycXN0YXRzX3Byb2NfZm9wczsKIHN0YXRpYyB2b2lkIHBtdV9wYXNzX2ludHIodW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbik7Ci1zdGF0aWMgaW50IHByb2NfZ2V0X2JhdHQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCi0JCQlpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLXN0YXRpYyBpbnQgcHJvY19yZWFkX29wdGlvbnMoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCi0JCQlpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLXN0YXRpYyBpbnQgcHJvY193cml0ZV9vcHRpb25zKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAotCQkJdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSk7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwbXVfYmF0dGVyeV9wcm9jX2ZvcHM7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwbXVfb3B0aW9uc19wcm9jX2ZvcHM7CiAKICNpZmRlZiBDT05GSUdfQURCCiBzdHJ1Y3QgYWRiX2RyaXZlciB2aWFfcG11X2RyaXZlciA9IHsKQEAgLTUwNywxOSArNTAyLDE1IEBACiAJCWZvciAoaT0wOyBpPHBtdV9iYXR0ZXJ5X2NvdW50OyBpKyspIHsKIAkJCWNoYXIgdGl0bGVbMTZdOwogCQkJc3ByaW50Zih0aXRsZSwgImJhdHRlcnlfJWxkIiwgaSk7Ci0JCQlwcm9jX3BtdV9iYXR0W2ldID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSh0aXRsZSwgMCwgcHJvY19wbXVfcm9vdCwKLQkJCQkJCXByb2NfZ2V0X2JhdHQsICh2b2lkICopaSk7CisJCQlwcm9jX3BtdV9iYXR0W2ldID0gcHJvY19jcmVhdGVfZGF0YSh0aXRsZSwgMCwgcHJvY19wbXVfcm9vdCwKKwkJCQkJJnBtdV9iYXR0ZXJ5X3Byb2NfZm9wcywgKHZvaWQgKilpKTsKIAkJfQogCi0JCXByb2NfcG11X2luZm8gPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJpbmZvIiwgMCwgcHJvY19wbXVfcm9vdCwKLQkJCQkJcHJvY19nZXRfaW5mbywgTlVMTCk7Ci0JCXByb2NfcG11X2lycXN0YXRzID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiaW50ZXJydXB0cyIsIDAsIHByb2NfcG11X3Jvb3QsCi0JCQkJCXByb2NfZ2V0X2lycXN0YXRzLCBOVUxMKTsKLQkJcHJvY19wbXVfb3B0aW9ucyA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJvcHRpb25zIiwgMDYwMCwgcHJvY19wbXVfcm9vdCk7Ci0JCWlmIChwcm9jX3BtdV9vcHRpb25zKSB7Ci0JCQlwcm9jX3BtdV9vcHRpb25zLT5yZWFkX3Byb2MgPSBwcm9jX3JlYWRfb3B0aW9uczsKLQkJCXByb2NfcG11X29wdGlvbnMtPndyaXRlX3Byb2MgPSBwcm9jX3dyaXRlX29wdGlvbnM7Ci0JCX0KKwkJcHJvY19wbXVfaW5mbyA9IHByb2NfY3JlYXRlKCJpbmZvIiwgMCwgcHJvY19wbXVfcm9vdCwgJnBtdV9pbmZvX3Byb2NfZm9wcyk7CisJCXByb2NfcG11X2lycXN0YXRzID0gcHJvY19jcmVhdGUoImludGVycnVwdHMiLCAwLCBwcm9jX3BtdV9yb290LAorCQkJCQkJJnBtdV9pcnFzdGF0c19wcm9jX2ZvcHMpOworCQlwcm9jX3BtdV9vcHRpb25zID0gcHJvY19jcmVhdGUoIm9wdGlvbnMiLCAwNjAwLCBwcm9jX3BtdV9yb290LAorCQkJCQkJJnBtdV9vcHRpb25zX3Byb2NfZm9wcyk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtNzk5LDI3ICs3OTAsMzMgQEAKIAkJCTIsIFBNVV9TTUFSVF9CQVRURVJZX1NUQVRFLCBwbXVfY3VyX2JhdHRlcnkrMSk7CiB9CiAKLXN0YXRpYyBpbnQKLXByb2NfZ2V0X2luZm8oY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCi0JCWludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IHBtdV9pbmZvX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7Ci0JY2hhciogcCA9IHBhZ2U7Ci0KLQlwICs9IHNwcmludGYocCwgIlBNVSBkcml2ZXIgdmVyc2lvbiAgICAgOiAlZFxuIiwgUE1VX0RSSVZFUl9WRVJTSU9OKTsKLQlwICs9IHNwcmludGYocCwgIlBNVSBmaXJtd2FyZSB2ZXJzaW9uICAgOiAlMDJ4XG4iLCBwbXVfdmVyc2lvbik7Ci0JcCArPSBzcHJpbnRmKHAsICJBQyBQb3dlciAgICAgICAgICAgICAgIDogJWRcbiIsCisJc2VxX3ByaW50ZihtLCAiUE1VIGRyaXZlciB2ZXJzaW9uICAgICA6ICVkXG4iLCBQTVVfRFJJVkVSX1ZFUlNJT04pOworCXNlcV9wcmludGYobSwgIlBNVSBmaXJtd2FyZSB2ZXJzaW9uICAgOiAlMDJ4XG4iLCBwbXVfdmVyc2lvbik7CisJc2VxX3ByaW50ZihtLCAiQUMgUG93ZXIgICAgICAgICAgICAgICA6ICVkXG4iLAogCQkoKHBtdV9wb3dlcl9mbGFncyAmIFBNVV9QV1JfQUNfUFJFU0VOVCkgIT0gMCkgfHwgcG11X2JhdHRlcnlfY291bnQgPT0gMCk7Ci0JcCArPSBzcHJpbnRmKHAsICJCYXR0ZXJ5IGNvdW50ICAgICAgICAgIDogJWRcbiIsIHBtdV9iYXR0ZXJ5X2NvdW50KTsKKwlzZXFfcHJpbnRmKG0sICJCYXR0ZXJ5IGNvdW50ICAgICAgICAgIDogJWRcbiIsIHBtdV9iYXR0ZXJ5X2NvdW50KTsKIAotCXJldHVybiBwIC0gcGFnZTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAotcHJvY19nZXRfaXJxc3RhdHMoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCi0JCSAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgcG11X2luZm9fcHJvY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBwbXVfaW5mb19wcm9jX3Nob3csIE5VTEwpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwbXVfaW5mb19wcm9jX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHBtdV9pbmZvX3Byb2Nfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBwbXVfaXJxc3RhdHNfcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKIAlpbnQgaTsKLQljaGFyKiBwID0gcGFnZTsKIAlzdGF0aWMgY29uc3QgY2hhciAqaXJxX25hbWVzW10gPSB7CiAJCSJUb3RhbCBDQjEgdHJpZ2dlcmVkIGV2ZW50cyIsCiAJCSJUb3RhbCBHUElPMSB0cmlnZ2VyZWQgZXZlbnRzIiwKQEAgLTgzNSw2MCArODMyLDc2IEBACiAgICAgICAgIH07CiAKIAlmb3IgKGk9MDsgaTwxMTsgaSsrKSB7Ci0JCXAgKz0gc3ByaW50ZihwLCAiICUydTogJTEwdSAoJXMpXG4iLAorCQlzZXFfcHJpbnRmKG0sICIgJTJ1OiAlMTB1ICglcylcbiIsCiAJCQkgICAgIGksIHBtdV9pcnFfc3RhdHNbaV0sIGlycV9uYW1lc1tpXSk7CiAJfQotCXJldHVybiBwIC0gcGFnZTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAotcHJvY19nZXRfYmF0dChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKLQkJaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgcG11X2lycXN0YXRzX3Byb2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlsb25nIGJhdG51bSA9IChsb25nKWRhdGE7Ci0JY2hhciAqcCA9IHBhZ2U7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHBtdV9pcnFzdGF0c19wcm9jX3Nob3csIE5VTEwpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwbXVfaXJxc3RhdHNfcHJvY19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBwbXVfaXJxc3RhdHNfcHJvY19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IHBtdV9iYXR0ZXJ5X3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJbG9uZyBiYXRudW0gPSAobG9uZyltLT5wcml2YXRlOwogCQotCXAgKz0gc3ByaW50ZihwLCAiXG4iKTsKLQlwICs9IHNwcmludGYocCwgImZsYWdzICAgICAgOiAlMDh4XG4iLAotCQlwbXVfYmF0dGVyaWVzW2JhdG51bV0uZmxhZ3MpOwotCXAgKz0gc3ByaW50ZihwLCAiY2hhcmdlICAgICA6ICVkXG4iLAotCQlwbXVfYmF0dGVyaWVzW2JhdG51bV0uY2hhcmdlKTsKLQlwICs9IHNwcmludGYocCwgIm1heF9jaGFyZ2UgOiAlZFxuIiwKLQkJcG11X2JhdHRlcmllc1tiYXRudW1dLm1heF9jaGFyZ2UpOwotCXAgKz0gc3ByaW50ZihwLCAiY3VycmVudCAgICA6ICVkXG4iLAotCQlwbXVfYmF0dGVyaWVzW2JhdG51bV0uYW1wZXJhZ2UpOwotCXAgKz0gc3ByaW50ZihwLCAidm9sdGFnZSAgICA6ICVkXG4iLAotCQlwbXVfYmF0dGVyaWVzW2JhdG51bV0udm9sdGFnZSk7Ci0JcCArPSBzcHJpbnRmKHAsICJ0aW1lIHJlbS4gIDogJWRcbiIsCi0JCXBtdV9iYXR0ZXJpZXNbYmF0bnVtXS50aW1lX3JlbWFpbmluZyk7Ci0KLQlyZXR1cm4gcCAtIHBhZ2U7CisJc2VxX3B1dGMobSwgJ1xuJyk7CisJc2VxX3ByaW50ZihtLCAiZmxhZ3MgICAgICA6ICUwOHhcbiIsIHBtdV9iYXR0ZXJpZXNbYmF0bnVtXS5mbGFncyk7CisJc2VxX3ByaW50ZihtLCAiY2hhcmdlICAgICA6ICVkXG4iLCBwbXVfYmF0dGVyaWVzW2JhdG51bV0uY2hhcmdlKTsKKwlzZXFfcHJpbnRmKG0sICJtYXhfY2hhcmdlIDogJWRcbiIsIHBtdV9iYXR0ZXJpZXNbYmF0bnVtXS5tYXhfY2hhcmdlKTsKKwlzZXFfcHJpbnRmKG0sICJjdXJyZW50ICAgIDogJWRcbiIsIHBtdV9iYXR0ZXJpZXNbYmF0bnVtXS5hbXBlcmFnZSk7CisJc2VxX3ByaW50ZihtLCAidm9sdGFnZSAgICA6ICVkXG4iLCBwbXVfYmF0dGVyaWVzW2JhdG51bV0udm9sdGFnZSk7CisJc2VxX3ByaW50ZihtLCAidGltZSByZW0uICA6ICVkXG4iLCBwbXVfYmF0dGVyaWVzW2JhdG51bV0udGltZV9yZW1haW5pbmcpOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci1wcm9jX3JlYWRfb3B0aW9ucyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKLQkJCWludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IHBtdV9iYXR0ZXJ5X3Byb2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQljaGFyICpwID0gcGFnZTsKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcG11X2JhdHRlcnlfcHJvY19zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKK30KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcG11X2JhdHRlcnlfcHJvY19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBwbXVfYmF0dGVyeV9wcm9jX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgcG11X29wdGlvbnNfcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKICNpZiBkZWZpbmVkKENPTkZJR19TVVNQRU5EKSAmJiBkZWZpbmVkKENPTkZJR19QUEMzMikKIAlpZiAocG11X2tpbmQgPT0gUE1VX0tFWUxBUkdPX0JBU0VEICYmCiAJICAgIHBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1NMRUVQX1NUQVRFLE5VTEwsMCwtMSkgPj0gMCkKLQkJcCArPSBzcHJpbnRmKHAsICJsaWRfd2FrZXVwPSVkXG4iLCBvcHRpb25fbGlkX3dha2V1cCk7CisJCXNlcV9wcmludGYobSwgImxpZF93YWtldXA9JWRcbiIsIG9wdGlvbl9saWRfd2FrZXVwKTsKICNlbmRpZgogCWlmIChwbXVfa2luZCA9PSBQTVVfS0VZTEFSR09fQkFTRUQpCi0JCXAgKz0gc3ByaW50ZihwLCAic2VydmVyX21vZGU9JWRcbiIsIG9wdGlvbl9zZXJ2ZXJfbW9kZSk7CisJCXNlcV9wcmludGYobSwgInNlcnZlcl9tb2RlPSVkXG4iLCBvcHRpb25fc2VydmVyX21vZGUpOwogCi0JcmV0dXJuIHAgLSBwYWdlOworCXJldHVybiAwOwogfQotCQkJCi1zdGF0aWMgaW50Ci1wcm9jX3dyaXRlX29wdGlvbnMoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCi0JCQl1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQorCitzdGF0aWMgaW50IHBtdV9vcHRpb25zX3Byb2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcG11X29wdGlvbnNfcHJvY19zaG93LCBOVUxMKTsKK30KKworc3RhdGljIHNzaXplX3QgcG11X29wdGlvbnNfcHJvY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKIHsKIAljaGFyIHRtcFszM107CiAJY2hhciAqbGFiZWwsICp2YWw7Ci0JdW5zaWduZWQgbG9uZyBmY291bnQgPSBjb3VudDsKKwlzaXplX3QgZmNvdW50ID0gY291bnQ7CiAJCiAJaWYgKCFjb3VudCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC05MjcsNiArOTQwLDE1IEBACiAJcmV0dXJuIGZjb3VudDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcG11X29wdGlvbnNfcHJvY19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBwbXVfb3B0aW9uc19wcm9jX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkud3JpdGUJCT0gcG11X29wdGlvbnNfcHJvY193cml0ZSwKK307CisKICNpZmRlZiBDT05GSUdfQURCCiAvKiBTZW5kIGFuIEFEQiBjb21tYW5kICovCiBzdGF0aWMgaW50IHBtdV9zZW5kX3JlcXVlc3Qoc3RydWN0IGFkYl9yZXF1ZXN0ICpyZXEsIGludCBzeW5jKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fc211X2NvbnRyb2xzLmMgYi9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9zbXVfY29udHJvbHMuYwppbmRleCA5NjFmYTBlLi42YzY4YjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9zbXVfY29udHJvbHMuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9zbXVfY29udHJvbHMuYwpAQCAtMjAyLDYgKzIwMiw4IEBACiAJCWZjdC0+Y3RybC5uYW1lID0gImNwdS1mcm9udC1mYW4tMSI7CiAJZWxzZSBpZiAoIXN0cmNtcChsLCAiQ1BVIEEgUFVNUCIpKQogCQlmY3QtPmN0cmwubmFtZSA9ICJjcHUtcHVtcC0wIjsKKwllbHNlIGlmICghc3RyY21wKGwsICJDUFUgQiBQVU1QIikpCisJCWZjdC0+Y3RybC5uYW1lID0gImNwdS1wdW1wLTEiOwogCWVsc2UgaWYgKCFzdHJjbXAobCwgIlNsb3RzIEZhbiIpIHx8ICFzdHJjbXAobCwgIlNsb3RzIGZhbiIpIHx8CiAJCSAhc3RyY21wKGwsICJFWFBBTlNJT04gU0xPVFMgSU5UQUtFIikpCiAJCWZjdC0+Y3RybC5uYW1lID0gInNsb3RzLWZhbiI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL0tjb25maWcgYi9kcml2ZXJzL21kL0tjb25maWcKaW5kZXggMjE1ODM3Ny4uYWNiM2E0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWQvS2NvbmZpZwpAQCAtMTg1LDExICsxODUsMTAgQEAKIAl0cmlzdGF0ZSAiTXVsdGlwYXRoIEkvTyBzdXBwb3J0IgogCWRlcGVuZHMgb24gQkxLX0RFVl9NRAogCWhlbHAKLQkgIE11bHRpcGF0aC1JTyBpcyB0aGUgYWJpbGl0eSBvZiBjZXJ0YWluIGRldmljZXMgdG8gYWRkcmVzcyB0aGUgc2FtZQotCSAgcGh5c2ljYWwgZGlzayBvdmVyIG11bHRpcGxlICdJTyBwYXRocycuIFRoZSBjb2RlIGVuc3VyZXMgdGhhdCBzdWNoCi0JICBwYXRocyBjYW4gYmUgZGVmaW5lZCBhbmQgaGFuZGxlZCBhdCBydW50aW1lLCBhbmQgZW5zdXJlcyB0aGF0IGEKLQkgIHRyYW5zcGFyZW50IGZhaWxvdmVyIHRvIHRoZSBiYWNrdXAgcGF0aChzKSBoYXBwZW5zIGlmIGEgSU8gZXJyb3JzCi0JICBhcnJpdmVzIG9uIHRoZSBwcmltYXJ5IHBhdGguCisJICBNRF9NVUxUSVBBVEggcHJvdmlkZXMgYSBzaW1wbGUgbXVsdGktcGF0aCBwZXJzb25hbGl0eSBmb3IgdXNlCisJICB0aGUgTUQgZnJhbWV3b3JrLiAgSXQgaXMgbm90IHVuZGVyIGFjdGl2ZSBkZXZlbG9wbWVudC4gIE5ldworCSAgcHJvamVjdHMgc2hvdWxkIGNvbnNpZGVyIHVzaW5nIERNX01VTFRJUEFUSCB3aGljaCBoYXMgbW9yZQorCSAgZmVhdHVyZXMgYW5kIG1vcmUgdGVzdGluZy4KIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iaXRtYXAuYyBiL2RyaXZlcnMvbWQvYml0bWFwLmMKaW5kZXggNjBlMmIzMi4uMjZhYzhhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iaXRtYXAuYworKysgYi9kcml2ZXJzL21kL2JpdG1hcC5jCkBAIC0yMTIsNyArMjEyLDcgQEAKICAqLwogCiAvKiBJTyBvcGVyYXRpb25zIHdoZW4gYml0bWFwIGlzIHN0b3JlZCBuZWFyIGFsbCBzdXBlcmJsb2NrcyAqLwotc3RhdGljIHN0cnVjdCBwYWdlICpyZWFkX3NiX3BhZ2UobWRkZXZfdCAqbWRkZXYsIGxvbmcgb2Zmc2V0LAorc3RhdGljIHN0cnVjdCBwYWdlICpyZWFkX3NiX3BhZ2UobWRkZXZfdCAqbWRkZXYsIGxvZmZfdCBvZmZzZXQsCiAJCQkJIHN0cnVjdCBwYWdlICpwYWdlLAogCQkJCSB1bnNpZ25lZCBsb25nIGluZGV4LCBpbnQgc2l6ZSkKIHsKQEAgLTI4NywyNyArMjg3LDM2IEBACiAKIAl3aGlsZSAoKHJkZXYgPSBuZXh0X2FjdGl2ZV9yZGV2KHJkZXYsIG1kZGV2KSkgIT0gTlVMTCkgewogCQkJaW50IHNpemUgPSBQQUdFX1NJWkU7CisJCQlsb2ZmX3Qgb2Zmc2V0ID0gbWRkZXYtPmJpdG1hcF9pbmZvLm9mZnNldDsKIAkJCWlmIChwYWdlLT5pbmRleCA9PSBiaXRtYXAtPmZpbGVfcGFnZXMtMSkKIAkJCQlzaXplID0gcm91bmR1cChiaXRtYXAtPmxhc3RfcGFnZV9zaXplLAogCQkJCQkgICAgICAgYmRldl9sb2dpY2FsX2Jsb2NrX3NpemUocmRldi0+YmRldikpOwogCQkJLyogSnVzdCBtYWtlIHN1cmUgd2UgYXJlbid0IGNvcnJ1cHRpbmcgZGF0YSBvcgogCQkJICogbWV0YWRhdGEKIAkJCSAqLwotCQkJaWYgKGJpdG1hcC0+b2Zmc2V0IDwgMCkgeworCQkJaWYgKG1kZGV2LT5leHRlcm5hbCkgeworCQkJCS8qIEJpdG1hcCBjb3VsZCBiZSBhbnl3aGVyZS4gKi8KKwkJCQlpZiAocmRldi0+c2Jfc3RhcnQgKyBvZmZzZXQgKyAocGFnZS0+aW5kZXggKihQQUdFX1NJWkUvNTEyKSkgPgorCQkJCSAgICByZGV2LT5kYXRhX29mZnNldCAmJgorCQkJCSAgICByZGV2LT5zYl9zdGFydCArIG9mZnNldCA8IAorCQkJCSAgICByZGV2LT5kYXRhX29mZnNldCArIG1kZGV2LT5kZXZfc2VjdG9ycyArCisJCQkJICAgIChQQUdFX1NJWkUvNTEyKSkKKwkJCQkJZ290byBiYWRfYWxpZ25tZW50OworCQkJfSBlbHNlIGlmIChvZmZzZXQgPCAwKSB7CiAJCQkJLyogREFUQSAgQklUTUFQIE1FVEFEQVRBICAqLwotCQkJCWlmIChiaXRtYXAtPm9mZnNldAorCQkJCWlmIChvZmZzZXQKIAkJCQkgICAgKyAobG9uZykocGFnZS0+aW5kZXggKiAoUEFHRV9TSVpFLzUxMikpCiAJCQkJICAgICsgc2l6ZS81MTIgPiAwKQogCQkJCQkvKiBiaXRtYXAgcnVucyBpbiB0byBtZXRhZGF0YSAqLwogCQkJCQlnb3RvIGJhZF9hbGlnbm1lbnQ7CiAJCQkJaWYgKHJkZXYtPmRhdGFfb2Zmc2V0ICsgbWRkZXYtPmRldl9zZWN0b3JzCi0JCQkJICAgID4gcmRldi0+c2Jfc3RhcnQgKyBiaXRtYXAtPm9mZnNldCkKKwkJCQkgICAgPiByZGV2LT5zYl9zdGFydCArIG9mZnNldCkKIAkJCQkJLyogZGF0YSBydW5zIGluIHRvIGJpdG1hcCAqLwogCQkJCQlnb3RvIGJhZF9hbGlnbm1lbnQ7CiAJCQl9IGVsc2UgaWYgKHJkZXYtPnNiX3N0YXJ0IDwgcmRldi0+ZGF0YV9vZmZzZXQpIHsKIAkJCQkvKiBNRVRBREFUQSBCSVRNQVAgREFUQSAqLwogCQkJCWlmIChyZGV2LT5zYl9zdGFydAotCQkJCSAgICArIGJpdG1hcC0+b2Zmc2V0CisJCQkJICAgICsgb2Zmc2V0CiAJCQkJICAgICsgcGFnZS0+aW5kZXgqKFBBR0VfU0laRS81MTIpICsgc2l6ZS81MTIKIAkJCQkgICAgPiByZGV2LT5kYXRhX29mZnNldCkKIAkJCQkJLyogYml0bWFwIHJ1bnMgaW4gdG8gZGF0YSAqLwpAQCAtMzE2LDcgKzMyNSw3IEBACiAJCQkJLyogREFUQSBNRVRBREFUQSBCSVRNQVAgLSBubyBwcm9ibGVtcyAqLwogCQkJfQogCQkJbWRfc3VwZXJfd3JpdGUobWRkZXYsIHJkZXYsCi0JCQkJICAgICAgIHJkZXYtPnNiX3N0YXJ0ICsgYml0bWFwLT5vZmZzZXQKKwkJCQkgICAgICAgcmRldi0+c2Jfc3RhcnQgKyBvZmZzZXQKIAkJCQkgICAgICAgKyBwYWdlLT5pbmRleCAqIChQQUdFX1NJWkUvNTEyKSwKIAkJCQkgICAgICAgc2l6ZSwKIAkJCQkgICAgICAgcGFnZSk7CkBAIC00ODgsNiArNDk3LDggQEAKIAogCWlmICghYml0bWFwIHx8ICFiaXRtYXAtPm1kZGV2KSAvKiBubyBiaXRtYXAgZm9yIHRoaXMgYXJyYXkgKi8KIAkJcmV0dXJuOworCWlmIChiaXRtYXAtPm1kZGV2LT5iaXRtYXBfaW5mby5leHRlcm5hbCkKKwkJcmV0dXJuOwogCXNwaW5fbG9ja19pcnFzYXZlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKIAlpZiAoIWJpdG1hcC0+c2JfcGFnZSkgeyAvKiBubyBzdXBlcmJsb2NrICovCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwpAQCAtNTAxLDYgKzUxMiw5IEBACiAJCWJpdG1hcC0+ZXZlbnRzX2NsZWFyZWQgPSBiaXRtYXAtPm1kZGV2LT5ldmVudHM7CiAJCXNiLT5ldmVudHNfY2xlYXJlZCA9IGNwdV90b19sZTY0KGJpdG1hcC0+ZXZlbnRzX2NsZWFyZWQpOwogCX0KKwkvKiBKdXN0IGluIGNhc2UgdGhlc2UgaGF2ZSBiZWVuIGNoYW5nZWQgdmlhIHN5c2ZzOiAqLworCXNiLT5kYWVtb25fc2xlZXAgPSBjcHVfdG9fbGUzMihiaXRtYXAtPm1kZGV2LT5iaXRtYXBfaW5mby5kYWVtb25fc2xlZXAvSFopOworCXNiLT53cml0ZV9iZWhpbmQgPSBjcHVfdG9fbGUzMihiaXRtYXAtPm1kZGV2LT5iaXRtYXBfaW5mby5tYXhfd3JpdGVfYmVoaW5kKTsKIAlrdW5tYXBfYXRvbWljKHNiLCBLTV9VU0VSMCk7CiAJd3JpdGVfcGFnZShiaXRtYXAsIGJpdG1hcC0+c2JfcGFnZSwgMSk7CiB9CkBAIC01NTAsNyArNTY0LDggQEAKIAogCQliaXRtYXAtPnNiX3BhZ2UgPSByZWFkX3BhZ2UoYml0bWFwLT5maWxlLCAwLCBiaXRtYXAsIGJ5dGVzKTsKIAl9IGVsc2UgewotCQliaXRtYXAtPnNiX3BhZ2UgPSByZWFkX3NiX3BhZ2UoYml0bWFwLT5tZGRldiwgYml0bWFwLT5vZmZzZXQsCisJCWJpdG1hcC0+c2JfcGFnZSA9IHJlYWRfc2JfcGFnZShiaXRtYXAtPm1kZGV2LAorCQkJCQkgICAgICAgYml0bWFwLT5tZGRldi0+Yml0bWFwX2luZm8ub2Zmc2V0LAogCQkJCQkgICAgICAgTlVMTCwKIAkJCQkJICAgICAgIDAsIHNpemVvZihiaXRtYXBfc3VwZXJfdCkpOwogCX0KQEAgLTU2Myw3ICs1NzgsNyBAQAogCXNiID0gKGJpdG1hcF9zdXBlcl90ICopa21hcF9hdG9taWMoYml0bWFwLT5zYl9wYWdlLCBLTV9VU0VSMCk7CiAKIAljaHVua3NpemUgPSBsZTMyX3RvX2NwdShzYi0+Y2h1bmtzaXplKTsKLQlkYWVtb25fc2xlZXAgPSBsZTMyX3RvX2NwdShzYi0+ZGFlbW9uX3NsZWVwKTsKKwlkYWVtb25fc2xlZXAgPSBsZTMyX3RvX2NwdShzYi0+ZGFlbW9uX3NsZWVwKSAqIEhaOwogCXdyaXRlX2JlaGluZCA9IGxlMzJfdG9fY3B1KHNiLT53cml0ZV9iZWhpbmQpOwogCiAJLyogdmVyaWZ5IHRoYXQgdGhlIGJpdG1hcC1zcGVjaWZpYyBmaWVsZHMgYXJlIHZhbGlkICovCkBAIC01NzYsNyArNTkxLDcgQEAKIAkJcmVhc29uID0gImJpdG1hcCBjaHVua3NpemUgdG9vIHNtYWxsIjsKIAllbHNlIGlmICgoMSA8PCBmZnoofmNodW5rc2l6ZSkpICE9IGNodW5rc2l6ZSkKIAkJcmVhc29uID0gImJpdG1hcCBjaHVua3NpemUgbm90IGEgcG93ZXIgb2YgMiI7Ci0JZWxzZSBpZiAoZGFlbW9uX3NsZWVwIDwgMSB8fCBkYWVtb25fc2xlZXAgPiBNQVhfU0NIRURVTEVfVElNRU9VVCAvIEhaKQorCWVsc2UgaWYgKGRhZW1vbl9zbGVlcCA8IDEgfHwgZGFlbW9uX3NsZWVwID4gTUFYX1NDSEVEVUxFX1RJTUVPVVQpCiAJCXJlYXNvbiA9ICJkYWVtb24gc2xlZXAgcGVyaW9kIG91dCBvZiByYW5nZSI7CiAJZWxzZSBpZiAod3JpdGVfYmVoaW5kID4gQ09VTlRFUl9NQVgpCiAJCXJlYXNvbiA9ICJ3cml0ZS1iZWhpbmQgbGltaXQgb3V0IG9mIHJhbmdlICgwIC0gMTYzODMpIjsKQEAgLTYxMCwxMCArNjI1LDkgQEAKIAl9CiBzdWNjZXNzOgogCS8qIGFzc2lnbiBmaWVsZHMgdXNpbmcgdmFsdWVzIGZyb20gc3VwZXJibG9jayAqLwotCWJpdG1hcC0+Y2h1bmtzaXplID0gY2h1bmtzaXplOwotCWJpdG1hcC0+ZGFlbW9uX3NsZWVwID0gZGFlbW9uX3NsZWVwOwotCWJpdG1hcC0+ZGFlbW9uX2xhc3RydW4gPSBqaWZmaWVzOwotCWJpdG1hcC0+bWF4X3dyaXRlX2JlaGluZCA9IHdyaXRlX2JlaGluZDsKKwliaXRtYXAtPm1kZGV2LT5iaXRtYXBfaW5mby5jaHVua3NpemUgPSBjaHVua3NpemU7CisJYml0bWFwLT5tZGRldi0+Yml0bWFwX2luZm8uZGFlbW9uX3NsZWVwID0gZGFlbW9uX3NsZWVwOworCWJpdG1hcC0+bWRkZXYtPmJpdG1hcF9pbmZvLm1heF93cml0ZV9iZWhpbmQgPSB3cml0ZV9iZWhpbmQ7CiAJYml0bWFwLT5mbGFncyB8PSBsZTMyX3RvX2NwdShzYi0+c3RhdGUpOwogCWlmIChsZTMyX3RvX2NwdShzYi0+dmVyc2lvbikgPT0gQklUTUFQX01BSk9SX0hPU1RFTkRJQU4pCiAJCWJpdG1hcC0+ZmxhZ3MgfD0gQklUTUFQX0hPU1RFTkRJQU47CkBAIC02NjQsMTYgKzY3OCwyNiBAQAogICogZ2VuZXJhbCBiaXRtYXAgZmlsZSBvcGVyYXRpb25zCiAgKi8KIAorLyoKKyAqIG9uLWRpc2sgYml0bWFwOgorICoKKyAqIFVzZSBvbmUgYml0IHBlciAiY2h1bmsiIChibG9jayBzZXQpLiBXZSBkbyB0aGUgZGlzayBJL08gb24gdGhlIGJpdG1hcAorICogZmlsZSBhIHBhZ2UgYXQgYSB0aW1lLiBUaGVyZSdzIGEgc3VwZXJibG9jayBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCisgKi8KIC8qIGNhbGN1bGF0ZSB0aGUgaW5kZXggb2YgdGhlIHBhZ2UgdGhhdCBjb250YWlucyB0aGlzIGJpdCAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGZpbGVfcGFnZV9pbmRleCh1bnNpZ25lZCBsb25nIGNodW5rKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGZpbGVfcGFnZV9pbmRleChzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHVuc2lnbmVkIGxvbmcgY2h1bmspCiB7Ci0JcmV0dXJuIENIVU5LX0JJVF9PRkZTRVQoY2h1bmspID4+IFBBR0VfQklUX1NISUZUOworCWlmICghYml0bWFwLT5tZGRldi0+Yml0bWFwX2luZm8uZXh0ZXJuYWwpCisJCWNodW5rICs9IHNpemVvZihiaXRtYXBfc3VwZXJfdCkgPDwgMzsKKwlyZXR1cm4gY2h1bmsgPj4gUEFHRV9CSVRfU0hJRlQ7CiB9CiAKIC8qIGNhbGN1bGF0ZSB0aGUgKGJpdCkgb2Zmc2V0IG9mIHRoaXMgYml0IHdpdGhpbiBhIHBhZ2UgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBmaWxlX3BhZ2Vfb2Zmc2V0KHVuc2lnbmVkIGxvbmcgY2h1bmspCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZmlsZV9wYWdlX29mZnNldChzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHVuc2lnbmVkIGxvbmcgY2h1bmspCiB7Ci0JcmV0dXJuIENIVU5LX0JJVF9PRkZTRVQoY2h1bmspICYgKFBBR0VfQklUUyAtIDEpOworCWlmICghYml0bWFwLT5tZGRldi0+Yml0bWFwX2luZm8uZXh0ZXJuYWwpCisJCWNodW5rICs9IHNpemVvZihiaXRtYXBfc3VwZXJfdCkgPDwgMzsKKwlyZXR1cm4gY2h1bmsgJiAoUEFHRV9CSVRTIC0gMSk7CiB9CiAKIC8qCkBAIC02ODYsOCArNzEwLDkgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKmZpbGVtYXBfZ2V0X3BhZ2Uoc3RydWN0IGJpdG1hcCAqYml0bWFwLAogCQkJCQl1bnNpZ25lZCBsb25nIGNodW5rKQogewotCWlmIChmaWxlX3BhZ2VfaW5kZXgoY2h1bmspID49IGJpdG1hcC0+ZmlsZV9wYWdlcykgcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGJpdG1hcC0+ZmlsZW1hcFtmaWxlX3BhZ2VfaW5kZXgoY2h1bmspIC0gZmlsZV9wYWdlX2luZGV4KDApXTsKKwlpZiAoZmlsZV9wYWdlX2luZGV4KGJpdG1hcCwgY2h1bmspID49IGJpdG1hcC0+ZmlsZV9wYWdlcykgcmV0dXJuIE5VTEw7CisJcmV0dXJuIGJpdG1hcC0+ZmlsZW1hcFtmaWxlX3BhZ2VfaW5kZXgoYml0bWFwLCBjaHVuaykKKwkJCSAgICAgICAtIGZpbGVfcGFnZV9pbmRleChiaXRtYXAsIDApXTsKIH0KIAogCkBAIC03MTAsNyArNzM1LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKIAogCXdoaWxlIChwYWdlcy0tKQotCQlpZiAobWFwW3BhZ2VzXS0+aW5kZXggIT0gMCkgLyogMCBpcyBzYl9wYWdlLCByZWxlYXNlIGl0IGJlbG93ICovCisJCWlmIChtYXBbcGFnZXNdICE9IHNiX3BhZ2UpIC8qIDAgaXMgc2JfcGFnZSwgcmVsZWFzZSBpdCBiZWxvdyAqLwogCQkJZnJlZV9idWZmZXJzKG1hcFtwYWdlc10pOwogCWtmcmVlKG1hcCk7CiAJa2ZyZWUoYXR0cik7CkBAIC04MjEsNyArODQ2LDcgQEAKIAogCXBhZ2UgPSBmaWxlbWFwX2dldF9wYWdlKGJpdG1hcCwgY2h1bmspOwogCWlmICghcGFnZSkgcmV0dXJuOwotCWJpdCA9IGZpbGVfcGFnZV9vZmZzZXQoY2h1bmspOworCWJpdCA9IGZpbGVfcGFnZV9vZmZzZXQoYml0bWFwLCBjaHVuayk7CiAKICAJLyogc2V0IHRoZSBiaXQgKi8KIAlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKQEAgLTkwNyw3ICs5MzIsNyBAQAogCWNodW5rcyA9IGJpdG1hcC0+Y2h1bmtzOwogCWZpbGUgPSBiaXRtYXAtPmZpbGU7CiAKLQlCVUdfT04oIWZpbGUgJiYgIWJpdG1hcC0+b2Zmc2V0KTsKKwlCVUdfT04oIWZpbGUgJiYgIWJpdG1hcC0+bWRkZXYtPmJpdG1hcF9pbmZvLm9mZnNldCk7CiAKICNpZmRlZiBJTkpFQ1RfRkFVTFRTXzMKIAlvdXRvZmRhdGUgPSAxOwpAQCAtOTE5LDE0ICs5NDQsMTcgQEAKIAkJCSJyZWNvdmVyeVxuIiwgYm1uYW1lKGJpdG1hcCkpOwogCiAJYnl0ZXMgPSAoY2h1bmtzICsgNykgLyA4OworCWlmICghYml0bWFwLT5tZGRldi0+Yml0bWFwX2luZm8uZXh0ZXJuYWwpCisJCWJ5dGVzICs9IHNpemVvZihiaXRtYXBfc3VwZXJfdCk7CiAKLQludW1fcGFnZXMgPSAoYnl0ZXMgKyBzaXplb2YoYml0bWFwX3N1cGVyX3QpICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkU7CisJCisJbnVtX3BhZ2VzID0gKGJ5dGVzICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkU7CiAKLQlpZiAoZmlsZSAmJiBpX3NpemVfcmVhZChmaWxlLT5mX21hcHBpbmctPmhvc3QpIDwgYnl0ZXMgKyBzaXplb2YoYml0bWFwX3N1cGVyX3QpKSB7CisJaWYgKGZpbGUgJiYgaV9zaXplX3JlYWQoZmlsZS0+Zl9tYXBwaW5nLT5ob3N0KSA8IGJ5dGVzKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIiVzOiBiaXRtYXAgZmlsZSB0b28gc2hvcnQgJWx1IDwgJWx1XG4iLAogCQkJYm1uYW1lKGJpdG1hcCksCiAJCQkodW5zaWduZWQgbG9uZykgaV9zaXplX3JlYWQoZmlsZS0+Zl9tYXBwaW5nLT5ob3N0KSwKLQkJCWJ5dGVzICsgc2l6ZW9mKGJpdG1hcF9zdXBlcl90KSk7CisJCQlieXRlcyk7CiAJCWdvdG8gZXJyOwogCX0KIApAQCAtOTQ3LDE3ICs5NzUsMTYgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBjaHVua3M7IGkrKykgewogCQlpbnQgYjsKLQkJaW5kZXggPSBmaWxlX3BhZ2VfaW5kZXgoaSk7Ci0JCWJpdCA9IGZpbGVfcGFnZV9vZmZzZXQoaSk7CisJCWluZGV4ID0gZmlsZV9wYWdlX2luZGV4KGJpdG1hcCwgaSk7CisJCWJpdCA9IGZpbGVfcGFnZV9vZmZzZXQoYml0bWFwLCBpKTsKIAkJaWYgKGluZGV4ICE9IG9sZGluZGV4KSB7IC8qIHRoaXMgaXMgYSBuZXcgcGFnZSwgcmVhZCBpdCBpbiAqLwogCQkJaW50IGNvdW50OwogCQkJLyogdW5tYXAgdGhlIG9sZCBwYWdlLCB3ZSdyZSBkb25lIHdpdGggaXQgKi8KIAkJCWlmIChpbmRleCA9PSBudW1fcGFnZXMtMSkKLQkJCQljb3VudCA9IGJ5dGVzICsgc2l6ZW9mKGJpdG1hcF9zdXBlcl90KQotCQkJCQktIGluZGV4ICogUEFHRV9TSVpFOworCQkJCWNvdW50ID0gYnl0ZXMgLSBpbmRleCAqIFBBR0VfU0laRTsKIAkJCWVsc2UKIAkJCQljb3VudCA9IFBBR0VfU0laRTsKLQkJCWlmIChpbmRleCA9PSAwKSB7CisJCQlpZiAoaW5kZXggPT0gMCAmJiBiaXRtYXAtPnNiX3BhZ2UpIHsKIAkJCQkvKgogCQkJCSAqIGlmIHdlJ3JlIGhlcmUgdGhlbiB0aGUgc3VwZXJibG9jayBwYWdlCiAJCQkJICogY29udGFpbnMgc29tZSBiaXRzIChQQUdFX1NJWkUgIT0gc2l6ZW9mIHNiKQpAQCAtOTY3LDE0ICs5OTQsMTUgQEAKIAkJCQlvZmZzZXQgPSBzaXplb2YoYml0bWFwX3N1cGVyX3QpOwogCQkJCWlmICghZmlsZSkKIAkJCQkJcmVhZF9zYl9wYWdlKGJpdG1hcC0+bWRkZXYsCi0JCQkJCQkgICAgIGJpdG1hcC0+b2Zmc2V0LAorCQkJCQkJICAgICBiaXRtYXAtPm1kZGV2LT5iaXRtYXBfaW5mby5vZmZzZXQsCiAJCQkJCQkgICAgIHBhZ2UsCiAJCQkJCQkgICAgIGluZGV4LCBjb3VudCk7CiAJCQl9IGVsc2UgaWYgKGZpbGUpIHsKIAkJCQlwYWdlID0gcmVhZF9wYWdlKGZpbGUsIGluZGV4LCBiaXRtYXAsIGNvdW50KTsKIAkJCQlvZmZzZXQgPSAwOwogCQkJfSBlbHNlIHsKLQkJCQlwYWdlID0gcmVhZF9zYl9wYWdlKGJpdG1hcC0+bWRkZXYsIGJpdG1hcC0+b2Zmc2V0LAorCQkJCXBhZ2UgPSByZWFkX3NiX3BhZ2UoYml0bWFwLT5tZGRldiwKKwkJCQkJCSAgICBiaXRtYXAtPm1kZGV2LT5iaXRtYXBfaW5mby5vZmZzZXQsCiAJCQkJCQkgICAgTlVMTCwKIAkJCQkJCSAgICBpbmRleCwgY291bnQpOwogCQkJCW9mZnNldCA9IDA7CkBAIC0xMDc4LDIzICsxMTA2LDMyIEBACiAgKgkJCW91dCB0byBkaXNrCiAgKi8KIAotdm9pZCBiaXRtYXBfZGFlbW9uX3dvcmsoc3RydWN0IGJpdG1hcCAqYml0bWFwKQordm9pZCBiaXRtYXBfZGFlbW9uX3dvcmsobWRkZXZfdCAqbWRkZXYpCiB7CisJc3RydWN0IGJpdG1hcCAqYml0bWFwOwogCXVuc2lnbmVkIGxvbmcgajsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTCwgKmxhc3RwYWdlID0gTlVMTDsKIAlpbnQgYmxvY2tzOwogCXZvaWQgKnBhZGRyOwogCi0JaWYgKGJpdG1hcCA9PSBOVUxMKQorCS8qIFVzZSBhIG11dGV4IHRvIGd1YXJkIGRhZW1vbl93b3JrIGFnYWluc3QKKwkgKiBiaXRtYXBfZGVzdHJveS4KKwkgKi8KKwltdXRleF9sb2NrKCZtZGRldi0+Yml0bWFwX2luZm8ubXV0ZXgpOworCWJpdG1hcCA9IG1kZGV2LT5iaXRtYXA7CisJaWYgKGJpdG1hcCA9PSBOVUxMKSB7CisJCW11dGV4X3VubG9jaygmbWRkZXYtPmJpdG1hcF9pbmZvLm11dGV4KTsKIAkJcmV0dXJuOwotCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBiaXRtYXAtPmRhZW1vbl9sYXN0cnVuICsgYml0bWFwLT5kYWVtb25fc2xlZXAqSFopKQorCX0KKwlpZiAodGltZV9iZWZvcmUoamlmZmllcywgYml0bWFwLT5kYWVtb25fbGFzdHJ1bgorCQkJKyBiaXRtYXAtPm1kZGV2LT5iaXRtYXBfaW5mby5kYWVtb25fc2xlZXApKQogCQlnb3RvIGRvbmU7CiAKIAliaXRtYXAtPmRhZW1vbl9sYXN0cnVuID0gamlmZmllczsKIAlpZiAoYml0bWFwLT5hbGxjbGVhbikgewogCQliaXRtYXAtPm1kZGV2LT50aHJlYWQtPnRpbWVvdXQgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKLQkJcmV0dXJuOworCQlnb3RvIGRvbmU7CiAJfQogCWJpdG1hcC0+YWxsY2xlYW4gPSAxOwogCkBAIC0xMTQyLDcgKzExNzksOCBAQAogCQkJLyogV2UgYXJlIHBvc3NpYmx5IGdvaW5nIHRvIGNsZWFyIHNvbWUgYml0cywgc28gbWFrZQogCQkJICogc3VyZSB0aGF0IGV2ZW50c19jbGVhcmVkIGlzIHVwLXRvLWRhdGUuCiAJCQkgKi8KLQkJCWlmIChiaXRtYXAtPm5lZWRfc3luYykgeworCQkJaWYgKGJpdG1hcC0+bmVlZF9zeW5jICYmCisJCQkgICAgYml0bWFwLT5tZGRldi0+Yml0bWFwX2luZm8uZXh0ZXJuYWwgPT0gMCkgewogCQkJCWJpdG1hcF9zdXBlcl90ICpzYjsKIAkJCQliaXRtYXAtPm5lZWRfc3luYyA9IDA7CiAJCQkJc2IgPSBrbWFwX2F0b21pYyhiaXRtYXAtPnNiX3BhZ2UsIEtNX1VTRVIwKTsKQEAgLTExNTIsNyArMTE5MCw4IEBACiAJCQkJd3JpdGVfcGFnZShiaXRtYXAsIGJpdG1hcC0+c2JfcGFnZSwgMSk7CiAJCQl9CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7Ci0JCQljbGVhcl9wYWdlX2F0dHIoYml0bWFwLCBwYWdlLCBCSVRNQVBfUEFHRV9DTEVBTik7CisJCQlpZiAoIWJpdG1hcC0+bmVlZF9zeW5jKQorCQkJCWNsZWFyX3BhZ2VfYXR0cihiaXRtYXAsIHBhZ2UsIEJJVE1BUF9QQUdFX0NMRUFOKTsKIAkJfQogCQlibWMgPSBiaXRtYXBfZ2V0X2NvdW50ZXIoYml0bWFwLAogCQkJCQkgKHNlY3Rvcl90KWogPDwgQ0hVTktfQkxPQ0tfU0hJRlQoYml0bWFwKSwKQEAgLTExNjcsNyArMTIwNiw3IEBACiAJCQlpZiAoKmJtYyA9PSAyKSB7CiAJCQkJKmJtYz0xOyAvKiBtYXliZSBjbGVhciB0aGUgYml0IG5leHQgdGltZSAqLwogCQkJCXNldF9wYWdlX2F0dHIoYml0bWFwLCBwYWdlLCBCSVRNQVBfUEFHRV9DTEVBTik7Ci0JCQl9IGVsc2UgaWYgKCpibWMgPT0gMSkgeworCQkJfSBlbHNlIGlmICgqYm1jID09IDEgJiYgIWJpdG1hcC0+bmVlZF9zeW5jKSB7CiAJCQkJLyogd2UgY2FuIGNsZWFyIHRoZSBiaXQgKi8KIAkJCQkqYm1jID0gMDsKIAkJCQliaXRtYXBfY291bnRfcGFnZShiaXRtYXAsCkBAIC0xMTc3LDkgKzEyMTYsMTEgQEAKIAkJCQkvKiBjbGVhciB0aGUgYml0ICovCiAJCQkJcGFkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CiAJCQkJaWYgKGJpdG1hcC0+ZmxhZ3MgJiBCSVRNQVBfSE9TVEVORElBTikKLQkJCQkJY2xlYXJfYml0KGZpbGVfcGFnZV9vZmZzZXQoaiksIHBhZGRyKTsKKwkJCQkJY2xlYXJfYml0KGZpbGVfcGFnZV9vZmZzZXQoYml0bWFwLCBqKSwKKwkJCQkJCSAgcGFkZHIpOwogCQkJCWVsc2UKLQkJCQkJZXh0Ml9jbGVhcl9iaXQoZmlsZV9wYWdlX29mZnNldChqKSwgcGFkZHIpOworCQkJCQlleHQyX2NsZWFyX2JpdChmaWxlX3BhZ2Vfb2Zmc2V0KGJpdG1hcCwgaiksCisJCQkJCQkgICAgICAgcGFkZHIpOwogCQkJCWt1bm1hcF9hdG9taWMocGFkZHIsIEtNX1VTRVIwKTsKIAkJCX0KIAkJfSBlbHNlCkBAIC0xMjAyLDcgKzEyNDMsOSBAQAogCiAgZG9uZToKIAlpZiAoYml0bWFwLT5hbGxjbGVhbiA9PSAwKQotCQliaXRtYXAtPm1kZGV2LT50aHJlYWQtPnRpbWVvdXQgPSBiaXRtYXAtPmRhZW1vbl9zbGVlcCAqIEhaOworCQliaXRtYXAtPm1kZGV2LT50aHJlYWQtPnRpbWVvdXQgPSAKKwkJCWJpdG1hcC0+bWRkZXYtPmJpdG1hcF9pbmZvLmRhZW1vbl9zbGVlcDsKKwltdXRleF91bmxvY2soJm1kZGV2LT5iaXRtYXBfaW5mby5tdXRleCk7CiB9CiAKIHN0YXRpYyBiaXRtYXBfY291bnRlcl90ICpiaXRtYXBfZ2V0X2NvdW50ZXIoc3RydWN0IGJpdG1hcCAqYml0bWFwLApAQCAtMTMzMiw2ICsxMzc1LDcgQEAKIAkJICAgIGJpdG1hcC0+ZXZlbnRzX2NsZWFyZWQgPCBiaXRtYXAtPm1kZGV2LT5ldmVudHMpIHsKIAkJCWJpdG1hcC0+ZXZlbnRzX2NsZWFyZWQgPSBiaXRtYXAtPm1kZGV2LT5ldmVudHM7CiAJCQliaXRtYXAtPm5lZWRfc3luYyA9IDE7CisJCQlzeXNmc19ub3RpZnlfZGlyZW50KGJpdG1hcC0+c3lzZnNfY2FuX2NsZWFyKTsKIAkJfQogCiAJCWlmICghc3VjY2VzcyAmJiAhICgqYm1jICYgTkVFREVEX01BU0spKQpAQCAtMTQ3MCw3ICsxNTE0LDcgQEAKIAkJcmV0dXJuOwogCX0KIAlpZiAodGltZV9iZWZvcmUoamlmZmllcywgKGJpdG1hcC0+bGFzdF9lbmRfc3luYwotCQkJCSAgKyBiaXRtYXAtPmRhZW1vbl9zbGVlcCAqIEhaKSkpCisJCQkJICArIGJpdG1hcC0+bWRkZXYtPmJpdG1hcF9pbmZvLmRhZW1vbl9zbGVlcCkpKQogCQlyZXR1cm47CiAJd2FpdF9ldmVudChiaXRtYXAtPm1kZGV2LT5yZWNvdmVyeV93YWl0LAogCQkgICBhdG9taWNfcmVhZCgmYml0bWFwLT5tZGRldi0+cmVjb3ZlcnlfYWN0aXZlKSA9PSAwKTsKQEAgLTE1MjIsNiArMTU2NiwxMiBAQAogCQlzZWN0b3JfdCBzZWMgPSAoc2VjdG9yX3QpY2h1bmsgPDwgQ0hVTktfQkxPQ0tfU0hJRlQoYml0bWFwKTsKIAkJYml0bWFwX3NldF9tZW1vcnlfYml0cyhiaXRtYXAsIHNlYywgMSk7CiAJCWJpdG1hcF9maWxlX3NldF9iaXQoYml0bWFwLCBzZWMpOworCQlpZiAoc2VjIDwgYml0bWFwLT5tZGRldi0+cmVjb3ZlcnlfY3ApCisJCQkvKiBXZSBhcmUgYXNzZXJ0aW5nIHRoYXQgdGhlIGFycmF5IGlzIGRpcnR5LAorCQkJICogc28gbW92ZSB0aGUgcmVjb3ZlcnlfY3AgYWRkcmVzcyBiYWNrIHNvCisJCQkgKiB0aGF0IGl0IGlzIG9idmlvdXMgdGhhdCBpdCBpcyBkaXJ0eQorCQkJICovCisJCQliaXRtYXAtPm1kZGV2LT5yZWNvdmVyeV9jcCA9IHNlYzsKIAl9CiB9CiAKQEAgLTE1MzEsNyArMTU4MSw3IEBACiB2b2lkIGJpdG1hcF9mbHVzaChtZGRldl90ICptZGRldikKIHsKIAlzdHJ1Y3QgYml0bWFwICpiaXRtYXAgPSBtZGRldi0+Yml0bWFwOwotCWludCBzbGVlcDsKKwlsb25nIHNsZWVwOwogCiAJaWYgKCFiaXRtYXApIC8qIHRoZXJlIHdhcyBubyBiaXRtYXAgKi8KIAkJcmV0dXJuOwpAQCAtMTUzOSwxMiArMTU4OSwxMyBAQAogCS8qIHJ1biB0aGUgZGFlbW9uX3dvcmsgdGhyZWUgdGltZSB0byBlbnN1cmUgZXZlcnl0aGluZyBpcyBmbHVzaGVkCiAJICogdGhhdCBjYW4gYmUKIAkgKi8KLQlzbGVlcCA9IGJpdG1hcC0+ZGFlbW9uX3NsZWVwOwotCWJpdG1hcC0+ZGFlbW9uX3NsZWVwID0gMDsKLQliaXRtYXBfZGFlbW9uX3dvcmsoYml0bWFwKTsKLQliaXRtYXBfZGFlbW9uX3dvcmsoYml0bWFwKTsKLQliaXRtYXBfZGFlbW9uX3dvcmsoYml0bWFwKTsKLQliaXRtYXAtPmRhZW1vbl9zbGVlcCA9IHNsZWVwOworCXNsZWVwID0gbWRkZXYtPmJpdG1hcF9pbmZvLmRhZW1vbl9zbGVlcCAqIDI7CisJYml0bWFwLT5kYWVtb25fbGFzdHJ1biAtPSBzbGVlcDsKKwliaXRtYXBfZGFlbW9uX3dvcmsobWRkZXYpOworCWJpdG1hcC0+ZGFlbW9uX2xhc3RydW4gLT0gc2xlZXA7CisJYml0bWFwX2RhZW1vbl93b3JrKG1kZGV2KTsKKwliaXRtYXAtPmRhZW1vbl9sYXN0cnVuIC09IHNsZWVwOworCWJpdG1hcF9kYWVtb25fd29yayhtZGRldik7CiAJYml0bWFwX3VwZGF0ZV9zYihiaXRtYXApOwogfQogCkBAIC0xNTc0LDYgKzE2MjUsNyBAQAogCWtmcmVlKGJwKTsKIAlrZnJlZShiaXRtYXApOwogfQorCiB2b2lkIGJpdG1hcF9kZXN0cm95KG1kZGV2X3QgKm1kZGV2KQogewogCXN0cnVjdCBiaXRtYXAgKmJpdG1hcCA9IG1kZGV2LT5iaXRtYXA7CkBAIC0xNTgxLDEwICsxNjMzLDE1IEBACiAJaWYgKCFiaXRtYXApIC8qIHRoZXJlIHdhcyBubyBiaXRtYXAgKi8KIAkJcmV0dXJuOwogCisJbXV0ZXhfbG9jaygmbWRkZXYtPmJpdG1hcF9pbmZvLm11dGV4KTsKIAltZGRldi0+Yml0bWFwID0gTlVMTDsgLyogZGlzY29ubmVjdCBmcm9tIHRoZSBtZCBkZXZpY2UgKi8KKwltdXRleF91bmxvY2soJm1kZGV2LT5iaXRtYXBfaW5mby5tdXRleCk7CiAJaWYgKG1kZGV2LT50aHJlYWQpCiAJCW1kZGV2LT50aHJlYWQtPnRpbWVvdXQgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKIAorCWlmIChiaXRtYXAtPnN5c2ZzX2Nhbl9jbGVhcikKKwkJc3lzZnNfcHV0KGJpdG1hcC0+c3lzZnNfY2FuX2NsZWFyKTsKKwogCWJpdG1hcF9mcmVlKGJpdG1hcCk7CiB9CiAKQEAgLTE1OTgsMTYgKzE2NTUsMTcgQEAKIAlzZWN0b3JfdCBibG9ja3MgPSBtZGRldi0+cmVzeW5jX21heF9zZWN0b3JzOwogCXVuc2lnbmVkIGxvbmcgY2h1bmtzOwogCXVuc2lnbmVkIGxvbmcgcGFnZXM7Ci0Jc3RydWN0IGZpbGUgKmZpbGUgPSBtZGRldi0+Yml0bWFwX2ZpbGU7CisJc3RydWN0IGZpbGUgKmZpbGUgPSBtZGRldi0+Yml0bWFwX2luZm8uZmlsZTsKIAlpbnQgZXJyOwogCXNlY3Rvcl90IHN0YXJ0OworCXN0cnVjdCBzeXNmc19kaXJlbnQgKmJtOwogCiAJQlVJTERfQlVHX09OKHNpemVvZihiaXRtYXBfc3VwZXJfdCkgIT0gMjU2KTsKIAotCWlmICghZmlsZSAmJiAhbWRkZXYtPmJpdG1hcF9vZmZzZXQpIC8qIGJpdG1hcCBkaXNhYmxlZCwgbm90aGluZyB0byBkbyAqLworCWlmICghZmlsZSAmJiAhbWRkZXYtPmJpdG1hcF9pbmZvLm9mZnNldCkgLyogYml0bWFwIGRpc2FibGVkLCBub3RoaW5nIHRvIGRvICovCiAJCXJldHVybiAwOwogCi0JQlVHX09OKGZpbGUgJiYgbWRkZXYtPmJpdG1hcF9vZmZzZXQpOworCUJVR19PTihmaWxlICYmIG1kZGV2LT5iaXRtYXBfaW5mby5vZmZzZXQpOwogCiAJYml0bWFwID0ga3phbGxvYyhzaXplb2YoKmJpdG1hcCksIEdGUF9LRVJORUwpOwogCWlmICghYml0bWFwKQpAQCAtMTYyMCw4ICsxNjc4LDE0IEBACiAKIAliaXRtYXAtPm1kZGV2ID0gbWRkZXY7CiAKKwlibSA9IHN5c2ZzX2dldF9kaXJlbnQobWRkZXYtPmtvYmouc2QsICJiaXRtYXAiKTsKKwlpZiAoYm0pIHsKKwkJYml0bWFwLT5zeXNmc19jYW5fY2xlYXIgPSBzeXNmc19nZXRfZGlyZW50KGJtLCAiY2FuX2NsZWFyIik7CisJCXN5c2ZzX3B1dChibSk7CisJfSBlbHNlCisJCWJpdG1hcC0+c3lzZnNfY2FuX2NsZWFyID0gTlVMTDsKKwogCWJpdG1hcC0+ZmlsZSA9IGZpbGU7Ci0JYml0bWFwLT5vZmZzZXQgPSBtZGRldi0+Yml0bWFwX29mZnNldDsKIAlpZiAoZmlsZSkgewogCQlnZXRfZmlsZShmaWxlKTsKIAkJLyogQXMgZnV0dXJlIGFjY2Vzc2VzIHRvIHRoaXMgZmlsZSB3aWxsIHVzZSBibWFwLApAQCAtMTYzMCwxMiArMTY5NCwyMiBAQAogCQkgKi8KIAkJdmZzX2ZzeW5jKGZpbGUsIGZpbGUtPmZfZGVudHJ5LCAxKTsKIAl9Ci0JLyogcmVhZCBzdXBlcmJsb2NrIGZyb20gYml0bWFwIGZpbGUgKHRoaXMgc2V0cyBiaXRtYXAtPmNodW5rc2l6ZSkgKi8KLQllcnIgPSBiaXRtYXBfcmVhZF9zYihiaXRtYXApOworCS8qIHJlYWQgc3VwZXJibG9jayBmcm9tIGJpdG1hcCBmaWxlICh0aGlzIHNldHMgbWRkZXYtPmJpdG1hcF9pbmZvLmNodW5rc2l6ZSkgKi8KKwlpZiAoIW1kZGV2LT5iaXRtYXBfaW5mby5leHRlcm5hbCkKKwkJZXJyID0gYml0bWFwX3JlYWRfc2IoYml0bWFwKTsKKwllbHNlIHsKKwkJZXJyID0gMDsKKwkJaWYgKG1kZGV2LT5iaXRtYXBfaW5mby5jaHVua3NpemUgPT0gMCB8fAorCQkgICAgbWRkZXYtPmJpdG1hcF9pbmZvLmRhZW1vbl9zbGVlcCA9PSAwKQorCQkJLyogY2h1bmtzaXplIGFuZCB0aW1lX2Jhc2UgbmVlZCB0byBiZQorCQkJICogc2V0IGZpcnN0LiAqLworCQkJZXJyID0gLUVJTlZBTDsKKwl9CiAJaWYgKGVycikKIAkJZ290byBlcnJvcjsKIAotCWJpdG1hcC0+Y2h1bmtzaGlmdCA9IGZmeih+Yml0bWFwLT5jaHVua3NpemUpOworCWJpdG1hcC0+ZGFlbW9uX2xhc3RydW4gPSBqaWZmaWVzOworCWJpdG1hcC0+Y2h1bmtzaGlmdCA9IGZmeih+bWRkZXYtPmJpdG1hcF9pbmZvLmNodW5rc2l6ZSk7CiAKIAkvKiBub3cgdGhhdCBjaHVua3NpemUgYW5kIGNodW5rc2hpZnQgYXJlIHNldCwgd2UgY2FuIHVzZSB0aGVzZSBtYWNyb3MgKi8KICAJY2h1bmtzID0gKGJsb2NrcyArIENIVU5LX0JMT0NLX1JBVElPKGJpdG1hcCkgLSAxKSA+PgpAQCAtMTY3Nyw3ICsxNzUxLDggQEAKIAogCW1kZGV2LT5iaXRtYXAgPSBiaXRtYXA7CiAKLQltZGRldi0+dGhyZWFkLT50aW1lb3V0ID0gYml0bWFwLT5kYWVtb25fc2xlZXAgKiBIWjsKKwltZGRldi0+dGhyZWFkLT50aW1lb3V0ID0gbWRkZXYtPmJpdG1hcF9pbmZvLmRhZW1vbl9zbGVlcDsKKwltZF93YWtldXBfdGhyZWFkKG1kZGV2LT50aHJlYWQpOwogCiAJYml0bWFwX3VwZGF0ZV9zYihiaXRtYXApOwogCkBAIC0xNjg4LDYgKzE3NjMsMjY0IEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIHNzaXplX3QKK2xvY2F0aW9uX3Nob3cobWRkZXZfdCAqbWRkZXYsIGNoYXIgKnBhZ2UpCit7CisJc3NpemVfdCBsZW47CisJaWYgKG1kZGV2LT5iaXRtYXBfaW5mby5maWxlKSB7CisJCWxlbiA9IHNwcmludGYocGFnZSwgImZpbGUiKTsKKwl9IGVsc2UgaWYgKG1kZGV2LT5iaXRtYXBfaW5mby5vZmZzZXQpIHsKKwkJbGVuID0gc3ByaW50ZihwYWdlLCAiJStsbGQiLCAobG9uZyBsb25nKW1kZGV2LT5iaXRtYXBfaW5mby5vZmZzZXQpOworCX0gZWxzZQorCQlsZW4gPSBzcHJpbnRmKHBhZ2UsICJub25lIik7CisJbGVuICs9IHNwcmludGYocGFnZStsZW4sICJcbiIpOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90Citsb2NhdGlvbl9zdG9yZShtZGRldl90ICptZGRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCisJaWYgKG1kZGV2LT5wZXJzKSB7CisJCWlmICghbWRkZXYtPnBlcnMtPnF1aWVzY2UpCisJCQlyZXR1cm4gLUVCVVNZOworCQlpZiAobWRkZXYtPnJlY292ZXJ5IHx8IG1kZGV2LT5zeW5jX3RocmVhZCkKKwkJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKG1kZGV2LT5iaXRtYXAgfHwgbWRkZXYtPmJpdG1hcF9pbmZvLmZpbGUgfHwKKwkgICAgbWRkZXYtPmJpdG1hcF9pbmZvLm9mZnNldCkgeworCQkvKiBiaXRtYXAgYWxyZWFkeSBjb25maWd1cmVkLiAgT25seSBvcHRpb24gaXMgdG8gY2xlYXIgaXQgKi8KKwkJaWYgKHN0cm5jbXAoYnVmLCAibm9uZSIsIDQpICE9IDApCisJCQlyZXR1cm4gLUVCVVNZOworCQlpZiAobWRkZXYtPnBlcnMpIHsKKwkJCW1kZGV2LT5wZXJzLT5xdWllc2NlKG1kZGV2LCAxKTsKKwkJCWJpdG1hcF9kZXN0cm95KG1kZGV2KTsKKwkJCW1kZGV2LT5wZXJzLT5xdWllc2NlKG1kZGV2LCAwKTsKKwkJfQorCQltZGRldi0+Yml0bWFwX2luZm8ub2Zmc2V0ID0gMDsKKwkJaWYgKG1kZGV2LT5iaXRtYXBfaW5mby5maWxlKSB7CisJCQlzdHJ1Y3QgZmlsZSAqZiA9IG1kZGV2LT5iaXRtYXBfaW5mby5maWxlOworCQkJbWRkZXYtPmJpdG1hcF9pbmZvLmZpbGUgPSBOVUxMOworCQkJcmVzdG9yZV9iaXRtYXBfd3JpdGVfYWNjZXNzKGYpOworCQkJZnB1dChmKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIE5vIGJpdG1hcCwgT0sgdG8gc2V0IGEgbG9jYXRpb24gKi8KKwkJbG9uZyBsb25nIG9mZnNldDsKKwkJaWYgKHN0cm5jbXAoYnVmLCAibm9uZSIsIDQpID09IDApCisJCQkvKiBub3RoaW5nIHRvIGJlIGRvbmUgKi87CisJCWVsc2UgaWYgKHN0cm5jbXAoYnVmLCAiZmlsZToiLCA1KSA9PSAwKSB7CisJCQkvKiBOb3Qgc3VwcG9ydGVkIHlldCAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSB7CisJCQlpbnQgcnY7CisJCQlpZiAoYnVmWzBdID09ICcrJykKKwkJCQlydiA9IHN0cmljdF9zdHJ0b2xsKGJ1ZisxLCAxMCwgJm9mZnNldCk7CisJCQllbHNlCisJCQkJcnYgPSBzdHJpY3Rfc3RydG9sbChidWYsIDEwLCAmb2Zmc2V0KTsKKwkJCWlmIChydikKKwkJCQlyZXR1cm4gcnY7CisJCQlpZiAob2Zmc2V0ID09IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAobWRkZXYtPmJpdG1hcF9pbmZvLmV4dGVybmFsID09IDAgJiYKKwkJCSAgICBtZGRldi0+bWFqb3JfdmVyc2lvbiA9PSAwICYmCisJCQkgICAgb2Zmc2V0ICE9IG1kZGV2LT5iaXRtYXBfaW5mby5kZWZhdWx0X29mZnNldCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCW1kZGV2LT5iaXRtYXBfaW5mby5vZmZzZXQgPSBvZmZzZXQ7CisJCQlpZiAobWRkZXYtPnBlcnMpIHsKKwkJCQltZGRldi0+cGVycy0+cXVpZXNjZShtZGRldiwgMSk7CisJCQkJcnYgPSBiaXRtYXBfY3JlYXRlKG1kZGV2KTsKKwkJCQlpZiAocnYpIHsKKwkJCQkJYml0bWFwX2Rlc3Ryb3kobWRkZXYpOworCQkJCQltZGRldi0+Yml0bWFwX2luZm8ub2Zmc2V0ID0gMDsKKwkJCQl9CisJCQkJbWRkZXYtPnBlcnMtPnF1aWVzY2UobWRkZXYsIDApOworCQkJCWlmIChydikKKwkJCQkJcmV0dXJuIHJ2OworCQkJfQorCQl9CisJfQorCWlmICghbWRkZXYtPmV4dGVybmFsKSB7CisJCS8qIEVuc3VyZSBuZXcgYml0bWFwIGluZm8gaXMgc3RvcmVkIGluCisJCSAqIG1ldGFkYXRhIHByb21wdGx5LgorCQkgKi8KKwkJc2V0X2JpdChNRF9DSEFOR0VfREVWUywgJm1kZGV2LT5mbGFncyk7CisJCW1kX3dha2V1cF90aHJlYWQobWRkZXYtPnRocmVhZCk7CisJfQorCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWRfc3lzZnNfZW50cnkgYml0bWFwX2xvY2F0aW9uID0KK19fQVRUUihsb2NhdGlvbiwgU19JUlVHT3xTX0lXVVNSLCBsb2NhdGlvbl9zaG93LCBsb2NhdGlvbl9zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90Cit0aW1lb3V0X3Nob3cobWRkZXZfdCAqbWRkZXYsIGNoYXIgKnBhZ2UpCit7CisJc3NpemVfdCBsZW47CisJdW5zaWduZWQgbG9uZyBzZWNzID0gbWRkZXYtPmJpdG1hcF9pbmZvLmRhZW1vbl9zbGVlcCAvIEhaOworCXVuc2lnbmVkIGxvbmcgamlmcyA9IG1kZGV2LT5iaXRtYXBfaW5mby5kYWVtb25fc2xlZXAgJSBIWjsKKwkKKwlsZW4gPSBzcHJpbnRmKHBhZ2UsICIlbHUiLCBzZWNzKTsKKwlpZiAoamlmcykKKwkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIuJTAzdSIsIGppZmZpZXNfdG9fbXNlY3MoamlmcykpOworCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiXG4iKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdAordGltZW91dF9zdG9yZShtZGRldl90ICptZGRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCS8qIHRpbWVvdXQgY2FuIGJlIHNldCBhdCBhbnkgdGltZSAqLworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlpbnQgcnYgPSBzdHJpY3Rfc3RydG91bF9zY2FsZWQoYnVmLCAmdGltZW91dCwgNCk7CisJaWYgKHJ2KQorCQlyZXR1cm4gcnY7CisKKwkvKiBqdXN0IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBvdmVyZmxvdy4uLiAqLworCWlmICh0aW1lb3V0ID49IExPTkdfTUFYIC8gSFopCisJCXJldHVybiAtRUlOVkFMOworCisJdGltZW91dCA9IHRpbWVvdXQgKiBIWiAvIDEwMDAwOworCisJaWYgKHRpbWVvdXQgPj0gTUFYX1NDSEVEVUxFX1RJTUVPVVQpCisJCXRpbWVvdXQgPSBNQVhfU0NIRURVTEVfVElNRU9VVC0xOworCWlmICh0aW1lb3V0IDwgMSkKKwkJdGltZW91dCA9IDE7CisJbWRkZXYtPmJpdG1hcF9pbmZvLmRhZW1vbl9zbGVlcCA9IHRpbWVvdXQ7CisJaWYgKG1kZGV2LT50aHJlYWQpIHsKKwkJLyogaWYgdGhyZWFkLT50aW1lb3V0IGlzIE1BWF9TQ0hFRFVMRV9USU1FT1VULCB0aGVuCisJCSAqIHRoZSBiaXRtYXAgaXMgYWxsIGNsZWFuIGFuZCB3ZSBkb24ndCBuZWVkIHRvCisJCSAqIGFkanVzdCB0aGUgdGltZW91dCByaWdodCBub3cKKwkJICovCisJCWlmIChtZGRldi0+dGhyZWFkLT50aW1lb3V0IDwgTUFYX1NDSEVEVUxFX1RJTUVPVVQpIHsKKwkJCW1kZGV2LT50aHJlYWQtPnRpbWVvdXQgPSB0aW1lb3V0OworCQkJbWRfd2FrZXVwX3RocmVhZChtZGRldi0+dGhyZWFkKTsKKwkJfQorCX0KKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3RydWN0IG1kX3N5c2ZzX2VudHJ5IGJpdG1hcF90aW1lb3V0ID0KK19fQVRUUih0aW1lX2Jhc2UsIFNfSVJVR098U19JV1VTUiwgdGltZW91dF9zaG93LCB0aW1lb3V0X3N0b3JlKTsKKworc3RhdGljIHNzaXplX3QKK2JhY2tsb2dfc2hvdyhtZGRldl90ICptZGRldiwgY2hhciAqcGFnZSkKK3sKKwlyZXR1cm4gc3ByaW50ZihwYWdlLCAiJWx1XG4iLCBtZGRldi0+Yml0bWFwX2luZm8ubWF4X3dyaXRlX2JlaGluZCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitiYWNrbG9nX3N0b3JlKG1kZGV2X3QgKm1kZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJdW5zaWduZWQgbG9uZyBiYWNrbG9nOworCWludCBydiA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZiYWNrbG9nKTsKKwlpZiAocnYpCisJCXJldHVybiBydjsKKwlpZiAoYmFja2xvZyA+IENPVU5URVJfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKwltZGRldi0+Yml0bWFwX2luZm8ubWF4X3dyaXRlX2JlaGluZCA9IGJhY2tsb2c7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHN0cnVjdCBtZF9zeXNmc19lbnRyeSBiaXRtYXBfYmFja2xvZyA9CitfX0FUVFIoYmFja2xvZywgU19JUlVHT3xTX0lXVVNSLCBiYWNrbG9nX3Nob3csIGJhY2tsb2dfc3RvcmUpOworCitzdGF0aWMgc3NpemVfdAorY2h1bmtzaXplX3Nob3cobWRkZXZfdCAqbWRkZXYsIGNoYXIgKnBhZ2UpCit7CisJcmV0dXJuIHNwcmludGYocGFnZSwgIiVsdVxuIiwgbWRkZXYtPmJpdG1hcF9pbmZvLmNodW5rc2l6ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitjaHVua3NpemVfc3RvcmUobWRkZXZfdCAqbWRkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwkvKiBDYW4gb25seSBiZSBjaGFuZ2VkIHdoZW4gbm8gYml0bWFwIGlzIGFjdGl2ZSAqLworCWludCBydjsKKwl1bnNpZ25lZCBsb25nIGNzaXplOworCWlmIChtZGRldi0+Yml0bWFwKQorCQlyZXR1cm4gLUVCVVNZOworCXJ2ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmNzaXplKTsKKwlpZiAocnYpCisJCXJldHVybiBydjsKKwlpZiAoY3NpemUgPCA1MTIgfHwKKwkgICAgIWlzX3Bvd2VyX29mXzIoY3NpemUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwltZGRldi0+Yml0bWFwX2luZm8uY2h1bmtzaXplID0gY3NpemU7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHN0cnVjdCBtZF9zeXNmc19lbnRyeSBiaXRtYXBfY2h1bmtzaXplID0KK19fQVRUUihjaHVua3NpemUsIFNfSVJVR098U19JV1VTUiwgY2h1bmtzaXplX3Nob3csIGNodW5rc2l6ZV9zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IG1ldGFkYXRhX3Nob3cobWRkZXZfdCAqbWRkZXYsIGNoYXIgKnBhZ2UpCit7CisJcmV0dXJuIHNwcmludGYocGFnZSwgIiVzXG4iLCAobWRkZXYtPmJpdG1hcF9pbmZvLmV4dGVybmFsCisJCQkJICAgICAgPyAiZXh0ZXJuYWwiIDogImludGVybmFsIikpOworfQorCitzdGF0aWMgc3NpemVfdCBtZXRhZGF0YV9zdG9yZShtZGRldl90ICptZGRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCWlmIChtZGRldi0+Yml0bWFwIHx8CisJICAgIG1kZGV2LT5iaXRtYXBfaW5mby5maWxlIHx8CisJICAgIG1kZGV2LT5iaXRtYXBfaW5mby5vZmZzZXQpCisJCXJldHVybiAtRUJVU1k7CisJaWYgKHN0cm5jbXAoYnVmLCAiZXh0ZXJuYWwiLCA4KSA9PSAwKQorCQltZGRldi0+Yml0bWFwX2luZm8uZXh0ZXJuYWwgPSAxOworCWVsc2UgaWYgKHN0cm5jbXAoYnVmLCAiaW50ZXJuYWwiLCA4KSA9PSAwKQorCQltZGRldi0+Yml0bWFwX2luZm8uZXh0ZXJuYWwgPSAwOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHN0cnVjdCBtZF9zeXNmc19lbnRyeSBiaXRtYXBfbWV0YWRhdGEgPQorX19BVFRSKG1ldGFkYXRhLCBTX0lSVUdPfFNfSVdVU1IsIG1ldGFkYXRhX3Nob3csIG1ldGFkYXRhX3N0b3JlKTsKKworc3RhdGljIHNzaXplX3QgY2FuX2NsZWFyX3Nob3cobWRkZXZfdCAqbWRkZXYsIGNoYXIgKnBhZ2UpCit7CisJaW50IGxlbjsKKwlpZiAobWRkZXYtPmJpdG1hcCkKKwkJbGVuID0gc3ByaW50ZihwYWdlLCAiJXNcbiIsIChtZGRldi0+Yml0bWFwLT5uZWVkX3N5bmMgPworCQkJCQkgICAgICJmYWxzZSIgOiAidHJ1ZSIpKTsKKwllbHNlCisJCWxlbiA9IHNwcmludGYocGFnZSwgIlxuIik7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgY2FuX2NsZWFyX3N0b3JlKG1kZGV2X3QgKm1kZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJaWYgKG1kZGV2LT5iaXRtYXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJaWYgKHN0cm5jbXAoYnVmLCAiZmFsc2UiLCA1KSA9PSAwKQorCQltZGRldi0+Yml0bWFwLT5uZWVkX3N5bmMgPSAxOworCWVsc2UgaWYgKHN0cm5jbXAoYnVmLCAidHJ1ZSIsIDQpID09IDApIHsKKwkJaWYgKG1kZGV2LT5kZWdyYWRlZCkKKwkJCXJldHVybiAtRUJVU1k7CisJCW1kZGV2LT5iaXRtYXAtPm5lZWRfc3luYyA9IDA7CisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWRfc3lzZnNfZW50cnkgYml0bWFwX2Nhbl9jbGVhciA9CitfX0FUVFIoY2FuX2NsZWFyLCBTX0lSVUdPfFNfSVdVU1IsIGNhbl9jbGVhcl9zaG93LCBjYW5fY2xlYXJfc3RvcmUpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbWRfYml0bWFwX2F0dHJzW10gPSB7CisJJmJpdG1hcF9sb2NhdGlvbi5hdHRyLAorCSZiaXRtYXBfdGltZW91dC5hdHRyLAorCSZiaXRtYXBfYmFja2xvZy5hdHRyLAorCSZiaXRtYXBfY2h1bmtzaXplLmF0dHIsCisJJmJpdG1hcF9tZXRhZGF0YS5hdHRyLAorCSZiaXRtYXBfY2FuX2NsZWFyLmF0dHIsCisJTlVMTAorfTsKK3N0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbWRfYml0bWFwX2dyb3VwID0geworCS5uYW1lID0gImJpdG1hcCIsCisJLmF0dHJzID0gbWRfYml0bWFwX2F0dHJzLAorfTsKKworCiAvKiB0aGUgYml0bWFwIEFQSSAtLSBmb3IgcmFpZCBwZXJzb25hbGl0aWVzICovCiBFWFBPUlRfU1lNQk9MKGJpdG1hcF9zdGFydHdyaXRlKTsKIEVYUE9SVF9TWU1CT0woYml0bWFwX2VuZHdyaXRlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYml0bWFwLmggYi9kcml2ZXJzL21kL2JpdG1hcC5oCmluZGV4IGU5ODkwMDYuLmNiODIxZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYml0bWFwLmgKKysrIGIvZHJpdmVycy9tZC9iaXRtYXAuaApAQCAtMTA2LDcgKzEwNiw3IEBACiAjZGVmaW5lIEJJVE1BUF9CTE9DS19TSElGVCA5CiAKIC8qIGhvdyBtYW55IGJsb2NrcyBwZXIgY2h1bms/ICh0aGlzIGlzIHZhcmlhYmxlKSAqLwotI2RlZmluZSBDSFVOS19CTE9DS19SQVRJTyhiaXRtYXApICgoYml0bWFwKS0+Y2h1bmtzaXplID4+IEJJVE1BUF9CTE9DS19TSElGVCkKKyNkZWZpbmUgQ0hVTktfQkxPQ0tfUkFUSU8oYml0bWFwKSAoKGJpdG1hcCktPm1kZGV2LT5iaXRtYXBfaW5mby5jaHVua3NpemUgPj4gQklUTUFQX0JMT0NLX1NISUZUKQogI2RlZmluZSBDSFVOS19CTE9DS19TSElGVChiaXRtYXApICgoYml0bWFwKS0+Y2h1bmtzaGlmdCAtIEJJVE1BUF9CTE9DS19TSElGVCkKICNkZWZpbmUgQ0hVTktfQkxPQ0tfTUFTSyhiaXRtYXApIChDSFVOS19CTE9DS19SQVRJTyhiaXRtYXApIC0gMSkKIApAQCAtMTE4LDE2ICsxMTgsNiBAQAogCQkJKENIVU5LX0JMT0NLX1NISUZUKGJpdG1hcCkgKyBQQUdFX0NPVU5URVJfU0hJRlQgLSAxKQogI2RlZmluZSBQQUdFUFRSX0JMT0NLX01BU0soYml0bWFwKSAoUEFHRVBUUl9CTE9DS19SQVRJTyhiaXRtYXApIC0gMSkKIAotLyoKLSAqIG9uLWRpc2sgYml0bWFwOgotICoKLSAqIFVzZSBvbmUgYml0IHBlciAiY2h1bmsiIChibG9jayBzZXQpLiBXZSBkbyB0aGUgZGlzayBJL08gb24gdGhlIGJpdG1hcAotICogZmlsZSBhIHBhZ2UgYXQgYSB0aW1lLiBUaGVyZSdzIGEgc3VwZXJibG9jayBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCi0gKi8KLQotLyogbWFwIGNodW5rcyAoYml0cykgdG8gZmlsZSBwYWdlcyAtIG9mZnNldCBieSB0aGUgc2l6ZSBvZiB0aGUgc3VwZXJibG9jayAqLwotI2RlZmluZSBDSFVOS19CSVRfT0ZGU0VUKGNodW5rKSAoKGNodW5rKSArIChzaXplb2YoYml0bWFwX3N1cGVyX3QpIDw8IDMpKQotCiAjZW5kaWYKIAogLyoKQEAgLTIwOSw3ICsxOTksNiBAQAogCWludCBjb3VudGVyX2JpdHM7IC8qIGhvdyBtYW55IGJpdHMgcGVyIGJsb2NrIGNvdW50ZXIgKi8KIAogCS8qIGJpdG1hcCBjaHVua3NpemUgLS0gaG93IG11Y2ggZGF0YSBkb2VzIGVhY2ggYml0IHJlcHJlc2VudD8gKi8KLQl1bnNpZ25lZCBsb25nIGNodW5rc2l6ZTsKIAl1bnNpZ25lZCBsb25nIGNodW5rc2hpZnQ7IC8qIGNodW5rc2l6ZSA9IDJeY2h1bmtzaGlmdCAoZm9yIGJpdG9wcykgKi8KIAl1bnNpZ25lZCBsb25nIGNodW5rczsgLyogdG90YWwgbnVtYmVyIG9mIGRhdGEgY2h1bmtzIGZvciB0aGUgYXJyYXkgKi8KIApAQCAtMjI2LDcgKzIxNSw2IEBACiAJLyogYml0bWFwIHNwaW5sb2NrICovCiAJc3BpbmxvY2tfdCBsb2NrOwogCi0JbG9uZyBvZmZzZXQ7IC8qIG9mZnNldCBmcm9tIHN1cGVyYmxvY2sgaWYgZmlsZSBpcyBOVUxMICovCiAJc3RydWN0IGZpbGUgKmZpbGU7IC8qIGJhY2tpbmcgZGlzayBmaWxlICovCiAJc3RydWN0IHBhZ2UgKnNiX3BhZ2U7IC8qIGNhY2hlZCBjb3B5IG9mIHRoZSBiaXRtYXAgZmlsZSBzdXBlcmJsb2NrICovCiAJc3RydWN0IHBhZ2UgKipmaWxlbWFwOyAvKiBsaXN0IG9mIGNhY2hlIHBhZ2VzIGZvciB0aGUgZmlsZSAqLwpAQCAtMjM4LDcgKzIyNiw2IEBACiAKIAlpbnQgYWxsY2xlYW47CiAKLQl1bnNpZ25lZCBsb25nIG1heF93cml0ZV9iZWhpbmQ7IC8qIHdyaXRlLWJlaGluZCBtb2RlICovCiAJYXRvbWljX3QgYmVoaW5kX3dyaXRlczsKIAogCS8qCkBAIC0yNDYsNyArMjMzLDYgQEAKIAkgKiBmaWxlLCBjbGVhbmluZyB1cCBiaXRzIGFuZCBmbHVzaGluZyBvdXQgcGFnZXMgdG8gZGlzayBhcyBuZWNlc3NhcnkKIAkgKi8KIAl1bnNpZ25lZCBsb25nIGRhZW1vbl9sYXN0cnVuOyAvKiBqaWZmaWVzIG9mIGxhc3QgcnVuICovCi0JdW5zaWduZWQgbG9uZyBkYWVtb25fc2xlZXA7IC8qIGhvdyBtYW55IHNlY29uZHMgYmV0d2VlbiB1cGRhdGVzPyAqLwogCXVuc2lnbmVkIGxvbmcgbGFzdF9lbmRfc3luYzsgLyogd2hlbiB3ZSBsYXN0ZWQgY2FsbGVkIGVuZF9zeW5jIHRvCiAJCQkJICAgICAgKiB1cGRhdGUgYml0bWFwIHdpdGggcmVzeW5jIHByb2dyZXNzICovCiAKQEAgLTI1NCw2ICsyNDAsNyBAQAogCXdhaXRfcXVldWVfaGVhZF90IHdyaXRlX3dhaXQ7CiAJd2FpdF9xdWV1ZV9oZWFkX3Qgb3ZlcmZsb3dfd2FpdDsKIAorCXN0cnVjdCBzeXNmc19kaXJlbnQgKnN5c2ZzX2Nhbl9jbGVhcjsKIH07CiAKIC8qIHRoZSBiaXRtYXAgQVBJICovCkBAIC0yODIsNyArMjY5LDcgQEAKIHZvaWQgYml0bWFwX2NvbmRfZW5kX3N5bmMoc3RydWN0IGJpdG1hcCAqYml0bWFwLCBzZWN0b3JfdCBzZWN0b3IpOwogCiB2b2lkIGJpdG1hcF91bnBsdWcoc3RydWN0IGJpdG1hcCAqYml0bWFwKTsKLXZvaWQgYml0bWFwX2RhZW1vbl93b3JrKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCk7Cit2b2lkIGJpdG1hcF9kYWVtb25fd29yayhtZGRldl90ICptZGRldik7CiAjZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2ZhdWx0eS5jIGIvZHJpdmVycy9tZC9mYXVsdHkuYwppbmRleCA4N2Q4OGRiLi43MTNhY2QwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2ZhdWx0eS5jCisrKyBiL2RyaXZlcnMvbWQvZmF1bHR5LmMKQEAgLTM2MCw2ICszNjAsNyBAQAogbW9kdWxlX2luaXQocmFpZF9pbml0KTsKIG1vZHVsZV9leGl0KHJhaWRfZXhpdCk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkZhdWx0IGluamVjdGlvbiBwZXJzb25hbGl0eSBmb3IgTUQiKTsKIE1PRFVMRV9BTElBUygibWQtcGVyc29uYWxpdHktMTAiKTsgLyogZmF1bHR5ICovCiBNT0RVTEVfQUxJQVMoIm1kLWZhdWx0eSIpOwogTU9EVUxFX0FMSUFTKCJtZC1sZXZlbC0tNSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9saW5lYXIuYyBiL2RyaXZlcnMvbWQvbGluZWFyLmMKaW5kZXggMWNlY2ViMy4uMDA0MzViZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9saW5lYXIuYworKysgYi9kcml2ZXJzL21kL2xpbmVhci5jCkBAIC0yOTIsNyArMjkyLDcgQEAKIAlpbnQgY3B1OwogCiAJaWYgKHVubGlrZWx5KGJpb19yd19mbGFnZ2VkKGJpbywgQklPX1JXX0JBUlJJRVIpKSkgewotCQliaW9fZW5kaW8oYmlvLCAtRU9QTk9UU1VQUCk7CisJCW1kX2JhcnJpZXJfcmVxdWVzdChtZGRldiwgYmlvKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0zODMsNiArMzgzLDcgQEAKIG1vZHVsZV9pbml0KGxpbmVhcl9pbml0KTsKIG1vZHVsZV9leGl0KGxpbmVhcl9leGl0KTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTGluZWFyIGRldmljZSBjb25jYXRlbmF0aW9uIHBlcnNvbmFsaXR5IGZvciBNRCIpOwogTU9EVUxFX0FMSUFTKCJtZC1wZXJzb25hbGl0eS0xIik7IC8qIExJTkVBUiAtIGRlcHJlY2F0ZWQqLwogTU9EVUxFX0FMSUFTKCJtZC1saW5lYXIiKTsKIE1PRFVMRV9BTElBUygibWQtbGV2ZWwtLTEiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbWQuYyBiL2RyaXZlcnMvbWQvbWQuYwppbmRleCA1ZjE1NGVmLi5lMWYzYzE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL21kLmMKKysrIGIvZHJpdmVycy9tZC9tZC5jCkBAIC00NCw2ICs0NCw3IEBACiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcmFpZC9tZF9wLmg+CiAjaW5jbHVkZSA8bGludXgvcmFpZC9tZF91Lmg+CkBAIC02OCw2ICs2OSwxMiBAQAogI2RlZmluZSBNRF9CVUcoeC4uLikgeyBwcmludGsoIm1kOiBidWcgaW4gZmlsZSAlcywgbGluZSAlZFxuIiwgX19GSUxFX18sIF9fTElORV9fKTsgbWRfcHJpbnRfZGV2aWNlcygpOyB9CiAKIC8qCisgKiBEZWZhdWx0IG51bWJlciBvZiByZWFkIGNvcnJlY3Rpb25zIHdlJ2xsIGF0dGVtcHQgb24gYW4gcmRldgorICogYmVmb3JlIGVqZWN0aW5nIGl0IGZyb20gdGhlIGFycmF5LiBXZSBkaXZpZGUgdGhlIHJlYWQgZXJyb3IKKyAqIGNvdW50IGJ5IDIgZm9yIGV2ZXJ5IGhvdXIgZWxhcHNlZCBiZXR3ZWVuIHJlYWQgZXJyb3JzLgorICovCisjZGVmaW5lIE1EX0RFRkFVTFRfTUFYX0NPUlJFQ1RFRF9SRUFEX0VSUk9SUyAyMAorLyoKICAqIEN1cnJlbnQgUkFJRC0xLDQsNSBwYXJhbGxlbCByZWNvbnN0cnVjdGlvbiAnZ3VhcmFudGVlZCBzcGVlZCBsaW1pdCcKICAqIGlzIDEwMDAgS0Ivc2VjLCBzbyB0aGUgZXh0cmEgc3lzdGVtIGxvYWQgZG9lcyBub3Qgc2hvdyB1cCB0aGF0IG11Y2guCiAgKiBJbmNyZWFzZSBpdCBpZiB5b3Ugd2FudCB0byBoYXZlIG1vcmUgX2d1YXJhbnRlZWRfIHNwZWVkLiBOb3RlIHRoYXQKQEAgLTIxMywxMiArMjIwLDEyIEBACiAJCXJldHVybiAwOwogCX0KIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWYgKG1kZGV2LT5zdXNwZW5kZWQpIHsKKwlpZiAobWRkZXYtPnN1c3BlbmRlZCB8fCBtZGRldi0+YmFycmllcikgewogCQlERUZJTkVfV0FJVChfX3dhaXQpOwogCQlmb3IgKDs7KSB7CiAJCQlwcmVwYXJlX3RvX3dhaXQoJm1kZGV2LT5zYl93YWl0LCAmX193YWl0LAogCQkJCQlUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCQlpZiAoIW1kZGV2LT5zdXNwZW5kZWQpCisJCQlpZiAoIW1kZGV2LT5zdXNwZW5kZWQgJiYgIW1kZGV2LT5iYXJyaWVyKQogCQkJCWJyZWFrOwogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlzY2hlZHVsZSgpOwpAQCAtMjYwLDEwICsyNjcsMTEwIEBACiAKIGludCBtZGRldl9jb25nZXN0ZWQobWRkZXZfdCAqbWRkZXYsIGludCBiaXRzKQogeworCWlmIChtZGRldi0+YmFycmllcikKKwkJcmV0dXJuIDE7CiAJcmV0dXJuIG1kZGV2LT5zdXNwZW5kZWQ7CiB9CiBFWFBPUlRfU1lNQk9MKG1kZGV2X2Nvbmdlc3RlZCk7CiAKKy8qCisgKiBHZW5lcmljIGJhcnJpZXIgaGFuZGxpbmcgZm9yIG1kCisgKi8KKworI2RlZmluZSBQT1NUX1JFUVVFU1RfQkFSUklFUiAoKHZvaWQqKTEpCisKK3N0YXRpYyB2b2lkIG1kX2VuZF9iYXJyaWVyKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycikKK3sKKwltZGtfcmRldl90ICpyZGV2ID0gYmlvLT5iaV9wcml2YXRlOworCW1kZGV2X3QgKm1kZGV2ID0gcmRldi0+bWRkZXY7CisJaWYgKGVyciA9PSAtRU9QTk9UU1VQUCAmJiBtZGRldi0+YmFycmllciAhPSBQT1NUX1JFUVVFU1RfQkFSUklFUikKKwkJc2V0X2JpdChCSU9fRU9QTk9UU1VQUCwgJm1kZGV2LT5iYXJyaWVyLT5iaV9mbGFncyk7CisKKwlyZGV2X2RlY19wZW5kaW5nKHJkZXYsIG1kZGV2KTsKKworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZtZGRldi0+Zmx1c2hfcGVuZGluZykpIHsKKwkJaWYgKG1kZGV2LT5iYXJyaWVyID09IFBPU1RfUkVRVUVTVF9CQVJSSUVSKSB7CisJCQkvKiBUaGlzIHdhcyBhIHBvc3QtcmVxdWVzdCBiYXJyaWVyICovCisJCQltZGRldi0+YmFycmllciA9IE5VTEw7CisJCQl3YWtlX3VwKCZtZGRldi0+c2Jfd2FpdCk7CisJCX0gZWxzZQorCQkJLyogVGhlIHByZS1yZXF1ZXN0IGJhcnJpZXIgaGFzIGZpbmlzaGVkICovCisJCQlzY2hlZHVsZV93b3JrKCZtZGRldi0+YmFycmllcl93b3JrKTsKKwl9CisJYmlvX3B1dChiaW8pOworfQorCitzdGF0aWMgdm9pZCBzdWJtaXRfYmFycmllcnMobWRkZXZfdCAqbWRkZXYpCit7CisJbWRrX3JkZXZfdCAqcmRldjsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkKKwkJaWYgKHJkZXYtPnJhaWRfZGlzayA+PSAwICYmCisJCSAgICAhdGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpKSB7CisJCQkvKiBUYWtlIHR3byByZWZlcmVuY2VzLCBvbmUgaXMgZHJvcHBlZAorCQkJICogd2hlbiByZXF1ZXN0IGZpbmlzaGVzLCBvbmUgYWZ0ZXIKKwkJCSAqIHdlIHJlY2xhaW0gcmN1X3JlYWRfbG9jaworCQkJICovCisJCQlzdHJ1Y3QgYmlvICpiaTsKKwkJCWF0b21pY19pbmMoJnJkZXYtPm5yX3BlbmRpbmcpOworCQkJYXRvbWljX2luYygmcmRldi0+bnJfcGVuZGluZyk7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCWJpID0gYmlvX2FsbG9jKEdGUF9LRVJORUwsIDApOworCQkJYmktPmJpX2VuZF9pbyA9IG1kX2VuZF9iYXJyaWVyOworCQkJYmktPmJpX3ByaXZhdGUgPSByZGV2OworCQkJYmktPmJpX2JkZXYgPSByZGV2LT5iZGV2OworCQkJYXRvbWljX2luYygmbWRkZXYtPmZsdXNoX3BlbmRpbmcpOworCQkJc3VibWl0X2JpbyhXUklURV9CQVJSSUVSLCBiaSk7CisJCQlyY3VfcmVhZF9sb2NrKCk7CisJCQlyZGV2X2RlY19wZW5kaW5nKHJkZXYsIG1kZGV2KTsKKwkJfQorCXJjdV9yZWFkX3VubG9jaygpOworfQorCitzdGF0aWMgdm9pZCBtZF9zdWJtaXRfYmFycmllcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndzKQoreworCW1kZGV2X3QgKm1kZGV2ID0gY29udGFpbmVyX29mKHdzLCBtZGRldl90LCBiYXJyaWVyX3dvcmspOworCXN0cnVjdCBiaW8gKmJpbyA9IG1kZGV2LT5iYXJyaWVyOworCisJYXRvbWljX3NldCgmbWRkZXYtPmZsdXNoX3BlbmRpbmcsIDEpOworCisJaWYgKHRlc3RfYml0KEJJT19FT1BOT1RTVVBQLCAmYmlvLT5iaV9mbGFncykpCisJCWJpb19lbmRpbyhiaW8sIC1FT1BOT1RTVVBQKTsKKwllbHNlIGlmIChiaW8tPmJpX3NpemUgPT0gMCkKKwkJLyogYW4gZW1wdHkgYmFycmllciAtIGFsbCBkb25lICovCisJCWJpb19lbmRpbyhiaW8sIDApOworCWVsc2UgeworCQliaW8tPmJpX3J3ICY9IH4oMTw8QklPX1JXX0JBUlJJRVIpOworCQlpZiAobWRkZXYtPnBlcnMtPm1ha2VfcmVxdWVzdChtZGRldi0+cXVldWUsIGJpbykpCisJCQlnZW5lcmljX21ha2VfcmVxdWVzdChiaW8pOworCQltZGRldi0+YmFycmllciA9IFBPU1RfUkVRVUVTVF9CQVJSSUVSOworCQlzdWJtaXRfYmFycmllcnMobWRkZXYpOworCX0KKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmbWRkZXYtPmZsdXNoX3BlbmRpbmcpKSB7CisJCW1kZGV2LT5iYXJyaWVyID0gTlVMTDsKKwkJd2FrZV91cCgmbWRkZXYtPnNiX3dhaXQpOworCX0KK30KKwordm9pZCBtZF9iYXJyaWVyX3JlcXVlc3QobWRkZXZfdCAqbWRkZXYsIHN0cnVjdCBiaW8gKmJpbykKK3sKKwlzcGluX2xvY2tfaXJxKCZtZGRldi0+d3JpdGVfbG9jayk7CisJd2FpdF9ldmVudF9sb2NrX2lycShtZGRldi0+c2Jfd2FpdCwKKwkJCSAgICAhbWRkZXYtPmJhcnJpZXIsCisJCQkgICAgbWRkZXYtPndyaXRlX2xvY2ssIC8qbm90aGluZyovKTsKKwltZGRldi0+YmFycmllciA9IGJpbzsKKwlzcGluX3VubG9ja19pcnEoJm1kZGV2LT53cml0ZV9sb2NrKTsKKworCWF0b21pY19zZXQoJm1kZGV2LT5mbHVzaF9wZW5kaW5nLCAxKTsKKwlJTklUX1dPUksoJm1kZGV2LT5iYXJyaWVyX3dvcmssIG1kX3N1Ym1pdF9iYXJyaWVyKTsKKworCXN1Ym1pdF9iYXJyaWVycyhtZGRldik7CisKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmbWRkZXYtPmZsdXNoX3BlbmRpbmcpKQorCQlzY2hlZHVsZV93b3JrKCZtZGRldi0+YmFycmllcl93b3JrKTsKK30KK0VYUE9SVF9TWU1CT0wobWRfYmFycmllcl9yZXF1ZXN0KTsKIAogc3RhdGljIGlubGluZSBtZGRldl90ICptZGRldl9nZXQobWRkZXZfdCAqbWRkZXYpCiB7CkBAIC0zNjMsNiArNDcwLDcgQEAKIAogCW11dGV4X2luaXQoJm5ldy0+b3Blbl9tdXRleCk7CiAJbXV0ZXhfaW5pdCgmbmV3LT5yZWNvbmZpZ19tdXRleCk7CisJbXV0ZXhfaW5pdCgmbmV3LT5iaXRtYXBfaW5mby5tdXRleCk7CiAJSU5JVF9MSVNUX0hFQUQoJm5ldy0+ZGlza3MpOwogCUlOSVRfTElTVF9IRUFEKCZuZXctPmFsbF9tZGRldnMpOwogCWluaXRfdGltZXIoJm5ldy0+c2FmZW1vZGVfdGltZXIpOwpAQCAtMzcwLDYgKzQ3OCw3IEBACiAJYXRvbWljX3NldCgmbmV3LT5vcGVuZXJzLCAwKTsKIAlhdG9taWNfc2V0KCZuZXctPmFjdGl2ZV9pbywgMCk7CiAJc3Bpbl9sb2NrX2luaXQoJm5ldy0+d3JpdGVfbG9jayk7CisJYXRvbWljX3NldCgmbmV3LT5mbHVzaF9wZW5kaW5nLCAwKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZuZXctPnNiX3dhaXQpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm5ldy0+cmVjb3Zlcnlfd2FpdCk7CiAJbmV3LT5yZXNoYXBlX3Bvc2l0aW9uID0gTWF4U2VjdG9yOwpAQCAtNzQ4LDcgKzg1Nyw3IEBACiAgKi8KIGludCBtZF9jaGVja19ub19iaXRtYXAobWRkZXZfdCAqbWRkZXYpCiB7Ci0JaWYgKCFtZGRldi0+Yml0bWFwX2ZpbGUgJiYgIW1kZGV2LT5iaXRtYXBfb2Zmc2V0KQorCWlmICghbWRkZXYtPmJpdG1hcF9pbmZvLmZpbGUgJiYgIW1kZGV2LT5iaXRtYXBfaW5mby5vZmZzZXQpCiAJCXJldHVybiAwOwogCXByaW50ayhLRVJOX0VSUiAiJXM6IGJpdG1hcHMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yICVzXG4iLAogCQltZG5hbWUobWRkZXYpLCBtZGRldi0+cGVycy0+bmFtZSk7CkBAIC04NzYsOCArOTg1LDggQEAKIAkJbWRkZXYtPnJhaWRfZGlza3MgPSBzYi0+cmFpZF9kaXNrczsKIAkJbWRkZXYtPmRldl9zZWN0b3JzID0gc2ItPnNpemUgKiAyOwogCQltZGRldi0+ZXZlbnRzID0gZXYxOwotCQltZGRldi0+Yml0bWFwX29mZnNldCA9IDA7Ci0JCW1kZGV2LT5kZWZhdWx0X2JpdG1hcF9vZmZzZXQgPSBNRF9TQl9CWVRFUyA+PiA5OworCQltZGRldi0+Yml0bWFwX2luZm8ub2Zmc2V0ID0gMDsKKwkJbWRkZXYtPmJpdG1hcF9pbmZvLmRlZmF1bHRfb2Zmc2V0ID0gTURfU0JfQllURVMgPj4gOTsKIAogCQlpZiAobWRkZXYtPm1pbm9yX3ZlcnNpb24gPj0gOTEpIHsKIAkJCW1kZGV2LT5yZXNoYXBlX3Bvc2l0aW9uID0gc2ItPnJlc2hhcGVfcG9zaXRpb247CkBAIC05MTEsOCArMTAyMCw5IEBACiAJCW1kZGV2LT5tYXhfZGlza3MgPSBNRF9TQl9ESVNLUzsKIAogCQlpZiAoc2ItPnN0YXRlICYgKDE8PE1EX1NCX0JJVE1BUF9QUkVTRU5UKSAmJgotCQkgICAgbWRkZXYtPmJpdG1hcF9maWxlID09IE5VTEwpCi0JCQltZGRldi0+Yml0bWFwX29mZnNldCA9IG1kZGV2LT5kZWZhdWx0X2JpdG1hcF9vZmZzZXQ7CisJCSAgICBtZGRldi0+Yml0bWFwX2luZm8uZmlsZSA9PSBOVUxMKQorCQkJbWRkZXYtPmJpdG1hcF9pbmZvLm9mZnNldCA9CisJCQkJbWRkZXYtPmJpdG1hcF9pbmZvLmRlZmF1bHRfb2Zmc2V0OwogCiAJfSBlbHNlIGlmIChtZGRldi0+cGVycyA9PSBOVUxMKSB7CiAJCS8qIEluc2lzdCBvbiBnb29kIGV2ZW50IGNvdW50ZXIgd2hpbGUgYXNzZW1ibGluZyAqLwpAQCAtMTAyOSw3ICsxMTM5LDcgQEAKIAlzYi0+bGF5b3V0ID0gbWRkZXYtPmxheW91dDsKIAlzYi0+Y2h1bmtfc2l6ZSA9IG1kZGV2LT5jaHVua19zZWN0b3JzIDw8IDk7CiAKLQlpZiAobWRkZXYtPmJpdG1hcCAmJiBtZGRldi0+Yml0bWFwX2ZpbGUgPT0gTlVMTCkKKwlpZiAobWRkZXYtPmJpdG1hcCAmJiBtZGRldi0+Yml0bWFwX2luZm8uZmlsZSA9PSBOVUxMKQogCQlzYi0+c3RhdGUgfD0gKDE8PE1EX1NCX0JJVE1BUF9QUkVTRU5UKTsKIAogCXNiLT5kaXNrc1swXS5zdGF0ZSA9ICgxPDxNRF9ESVNLX1JFTU9WRUQpOwpAQCAtMTEwNyw3ICsxMjE3LDcgQEAKIHsKIAlpZiAobnVtX3NlY3RvcnMgJiYgbnVtX3NlY3RvcnMgPCByZGV2LT5tZGRldi0+ZGV2X3NlY3RvcnMpCiAJCXJldHVybiAwOyAvKiBjb21wb25lbnQgbXVzdCBmaXQgZGV2aWNlICovCi0JaWYgKHJkZXYtPm1kZGV2LT5iaXRtYXBfb2Zmc2V0KQorCWlmIChyZGV2LT5tZGRldi0+Yml0bWFwX2luZm8ub2Zmc2V0KQogCQlyZXR1cm4gMDsgLyogY2FuJ3QgbW92ZSBiaXRtYXAgKi8KIAlyZGV2LT5zYl9zdGFydCA9IGNhbGNfZGV2X3Nib2Zmc2V0KHJkZXYtPmJkZXYpOwogCWlmICghbnVtX3NlY3RvcnMgfHwgbnVtX3NlY3RvcnMgPiByZGV2LT5zYl9zdGFydCkKQEAgLTEyODYsOCArMTM5Niw4IEBACiAJCW1kZGV2LT5yYWlkX2Rpc2tzID0gbGUzMl90b19jcHUoc2ItPnJhaWRfZGlza3MpOwogCQltZGRldi0+ZGV2X3NlY3RvcnMgPSBsZTY0X3RvX2NwdShzYi0+c2l6ZSk7CiAJCW1kZGV2LT5ldmVudHMgPSBldjE7Ci0JCW1kZGV2LT5iaXRtYXBfb2Zmc2V0ID0gMDsKLQkJbWRkZXYtPmRlZmF1bHRfYml0bWFwX29mZnNldCA9IDEwMjQgPj4gOTsKKwkJbWRkZXYtPmJpdG1hcF9pbmZvLm9mZnNldCA9IDA7CisJCW1kZGV2LT5iaXRtYXBfaW5mby5kZWZhdWx0X29mZnNldCA9IDEwMjQgPj4gOTsKIAkJCiAJCW1kZGV2LT5yZWNvdmVyeV9jcCA9IGxlNjRfdG9fY3B1KHNiLT5yZXN5bmNfb2Zmc2V0KTsKIAkJbWVtY3B5KG1kZGV2LT51dWlkLCBzYi0+c2V0X3V1aWQsIDE2KTsKQEAgLTEyOTUsOCArMTQwNSw5IEBACiAJCW1kZGV2LT5tYXhfZGlza3MgPSAgKDQwOTYtMjU2KS8yOwogCiAJCWlmICgobGUzMl90b19jcHUoc2ItPmZlYXR1cmVfbWFwKSAmIE1EX0ZFQVRVUkVfQklUTUFQX09GRlNFVCkgJiYKLQkJICAgIG1kZGV2LT5iaXRtYXBfZmlsZSA9PSBOVUxMICkKLQkJCW1kZGV2LT5iaXRtYXBfb2Zmc2V0ID0gKF9fczMyKWxlMzJfdG9fY3B1KHNiLT5iaXRtYXBfb2Zmc2V0KTsKKwkJICAgIG1kZGV2LT5iaXRtYXBfaW5mby5maWxlID09IE5VTEwgKQorCQkJbWRkZXYtPmJpdG1hcF9pbmZvLm9mZnNldCA9CisJCQkJKF9fczMyKWxlMzJfdG9fY3B1KHNiLT5iaXRtYXBfb2Zmc2V0KTsKIAogCQlpZiAoKGxlMzJfdG9fY3B1KHNiLT5mZWF0dXJlX21hcCkgJiBNRF9GRUFUVVJFX1JFU0hBUEVfQUNUSVZFKSkgewogCQkJbWRkZXYtPnJlc2hhcGVfcG9zaXRpb24gPSBsZTY0X3RvX2NwdShzYi0+cmVzaGFwZV9wb3NpdGlvbik7CkBAIC0xMzkwLDE5ICsxNTAxLDE3IEBACiAJc2ItPmxldmVsID0gY3B1X3RvX2xlMzIobWRkZXYtPmxldmVsKTsKIAlzYi0+bGF5b3V0ID0gY3B1X3RvX2xlMzIobWRkZXYtPmxheW91dCk7CiAKLQlpZiAobWRkZXYtPmJpdG1hcCAmJiBtZGRldi0+Yml0bWFwX2ZpbGUgPT0gTlVMTCkgewotCQlzYi0+Yml0bWFwX29mZnNldCA9IGNwdV90b19sZTMyKChfX3UzMiltZGRldi0+Yml0bWFwX29mZnNldCk7CisJaWYgKG1kZGV2LT5iaXRtYXAgJiYgbWRkZXYtPmJpdG1hcF9pbmZvLmZpbGUgPT0gTlVMTCkgeworCQlzYi0+Yml0bWFwX29mZnNldCA9IGNwdV90b19sZTMyKChfX3UzMiltZGRldi0+Yml0bWFwX2luZm8ub2Zmc2V0KTsKIAkJc2ItPmZlYXR1cmVfbWFwID0gY3B1X3RvX2xlMzIoTURfRkVBVFVSRV9CSVRNQVBfT0ZGU0VUKTsKIAl9CiAKIAlpZiAocmRldi0+cmFpZF9kaXNrID49IDAgJiYKIAkgICAgIXRlc3RfYml0KEluX3N5bmMsICZyZGV2LT5mbGFncykpIHsKLQkJaWYgKHJkZXYtPnJlY292ZXJ5X29mZnNldCA+IDApIHsKLQkJCXNiLT5mZWF0dXJlX21hcCB8PQotCQkJCWNwdV90b19sZTMyKE1EX0ZFQVRVUkVfUkVDT1ZFUllfT0ZGU0VUKTsKLQkJCXNiLT5yZWNvdmVyeV9vZmZzZXQgPQotCQkJCWNwdV90b19sZTY0KHJkZXYtPnJlY292ZXJ5X29mZnNldCk7Ci0JCX0KKwkJc2ItPmZlYXR1cmVfbWFwIHw9CisJCQljcHVfdG9fbGUzMihNRF9GRUFUVVJFX1JFQ09WRVJZX09GRlNFVCk7CisJCXNiLT5yZWNvdmVyeV9vZmZzZXQgPQorCQkJY3B1X3RvX2xlNjQocmRldi0+cmVjb3Zlcnlfb2Zmc2V0KTsKIAl9CiAKIAlpZiAobWRkZXYtPnJlc2hhcGVfcG9zaXRpb24gIT0gTWF4U2VjdG9yKSB7CkBAIC0xNDM2LDcgKzE1NDUsNyBAQAogCQkJc2ItPmRldl9yb2xlc1tpXSA9IGNwdV90b19sZTE2KDB4ZmZmZSk7CiAJCWVsc2UgaWYgKHRlc3RfYml0KEluX3N5bmMsICZyZGV2Mi0+ZmxhZ3MpKQogCQkJc2ItPmRldl9yb2xlc1tpXSA9IGNwdV90b19sZTE2KHJkZXYyLT5yYWlkX2Rpc2spOwotCQllbHNlIGlmIChyZGV2Mi0+cmFpZF9kaXNrID49IDAgJiYgcmRldjItPnJlY292ZXJ5X29mZnNldCA+IDApCisJCWVsc2UgaWYgKHJkZXYyLT5yYWlkX2Rpc2sgPj0gMCkKIAkJCXNiLT5kZXZfcm9sZXNbaV0gPSBjcHVfdG9fbGUxNihyZGV2Mi0+cmFpZF9kaXNrKTsKIAkJZWxzZQogCQkJc2ItPmRldl9yb2xlc1tpXSA9IGNwdV90b19sZTE2KDB4ZmZmZik7CkBAIC0xNDU4LDcgKzE1NjcsNyBAQAogCQltYXhfc2VjdG9ycyAtPSByZGV2LT5kYXRhX29mZnNldDsKIAkJaWYgKCFudW1fc2VjdG9ycyB8fCBudW1fc2VjdG9ycyA+IG1heF9zZWN0b3JzKQogCQkJbnVtX3NlY3RvcnMgPSBtYXhfc2VjdG9yczsKLQl9IGVsc2UgaWYgKHJkZXYtPm1kZGV2LT5iaXRtYXBfb2Zmc2V0KSB7CisJfSBlbHNlIGlmIChyZGV2LT5tZGRldi0+Yml0bWFwX2luZm8ub2Zmc2V0KSB7CiAJCS8qIG1pbm9yIHZlcnNpb24gMCB3aXRoIGJpdG1hcCB3ZSBjYW4ndCBtb3ZlICovCiAJCXJldHVybiAwOwogCX0gZWxzZSB7CkBAIC0yNDQyLDEyICsyNTUxLDQ5IEBACiBzdGF0aWMgc3RydWN0IHJkZXZfc3lzZnNfZW50cnkgcmRldl9zaXplID0KIF9fQVRUUihzaXplLCBTX0lSVUdPfFNfSVdVU1IsIHJkZXZfc2l6ZV9zaG93LCByZGV2X3NpemVfc3RvcmUpOwogCisKK3N0YXRpYyBzc2l6ZV90IHJlY292ZXJ5X3N0YXJ0X3Nob3cobWRrX3JkZXZfdCAqcmRldiwgY2hhciAqcGFnZSkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgcmVjb3Zlcnlfc3RhcnQgPSByZGV2LT5yZWNvdmVyeV9vZmZzZXQ7CisKKwlpZiAodGVzdF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKSB8fAorCSAgICByZWNvdmVyeV9zdGFydCA9PSBNYXhTZWN0b3IpCisJCXJldHVybiBzcHJpbnRmKHBhZ2UsICJub25lXG4iKTsKKworCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlbGx1XG4iLCByZWNvdmVyeV9zdGFydCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJlY292ZXJ5X3N0YXJ0X3N0b3JlKG1ka19yZGV2X3QgKnJkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgcmVjb3Zlcnlfc3RhcnQ7CisKKwlpZiAoY21kX21hdGNoKGJ1ZiwgIm5vbmUiKSkKKwkJcmVjb3Zlcnlfc3RhcnQgPSBNYXhTZWN0b3I7CisJZWxzZSBpZiAoc3RyaWN0X3N0cnRvdWxsKGJ1ZiwgMTAsICZyZWNvdmVyeV9zdGFydCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHJkZXYtPm1kZGV2LT5wZXJzICYmCisJICAgIHJkZXYtPnJhaWRfZGlzayA+PSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmRldi0+cmVjb3Zlcnlfb2Zmc2V0ID0gcmVjb3Zlcnlfc3RhcnQ7CisJaWYgKHJlY292ZXJ5X3N0YXJ0ID09IE1heFNlY3RvcikKKwkJc2V0X2JpdChJbl9zeW5jLCAmcmRldi0+ZmxhZ3MpOworCWVsc2UKKwkJY2xlYXJfYml0KEluX3N5bmMsICZyZGV2LT5mbGFncyk7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHN0cnVjdCByZGV2X3N5c2ZzX2VudHJ5IHJkZXZfcmVjb3Zlcnlfc3RhcnQgPQorX19BVFRSKHJlY292ZXJ5X3N0YXJ0LCBTX0lSVUdPfFNfSVdVU1IsIHJlY292ZXJ5X3N0YXJ0X3Nob3csIHJlY292ZXJ5X3N0YXJ0X3N0b3JlKTsKKwogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnJkZXZfZGVmYXVsdF9hdHRyc1tdID0gewogCSZyZGV2X3N0YXRlLmF0dHIsCiAJJnJkZXZfZXJyb3JzLmF0dHIsCiAJJnJkZXZfc2xvdC5hdHRyLAogCSZyZGV2X29mZnNldC5hdHRyLAogCSZyZGV2X3NpemUuYXR0ciwKKwkmcmRldl9yZWNvdmVyeV9zdGFydC5hdHRyLAogCU5VTEwsCiB9Owogc3RhdGljIHNzaXplX3QKQEAgLTI1NDksNiArMjY5NSw4IEBACiAJcmRldi0+ZmxhZ3MgPSAwOwogCXJkZXYtPmRhdGFfb2Zmc2V0ID0gMDsKIAlyZGV2LT5zYl9ldmVudHMgPSAwOworCXJkZXYtPmxhc3RfcmVhZF9lcnJvci50dl9zZWMgID0gMDsKKwlyZGV2LT5sYXN0X3JlYWRfZXJyb3IudHZfbnNlYyA9IDA7CiAJYXRvbWljX3NldCgmcmRldi0+bnJfcGVuZGluZywgMCk7CiAJYXRvbWljX3NldCgmcmRldi0+cmVhZF9lcnJvcnMsIDApOwogCWF0b21pY19zZXQoJnJkZXYtPmNvcnJlY3RlZF9lcnJvcnMsIDApOwpAQCAtMjY1OSw2ICsyODA3LDQ3IEBACiAJfQogfQogCisvKiBSZWFkIGEgZml4ZWQtcG9pbnQgbnVtYmVyLgorICogTnVtYmVycyBpbiBzeXNmcyBhdHRyaWJ1dGVzIHNob3VsZCBiZSBpbiAic3RhbmRhcmQiIHVuaXRzIHdoZXJlCisgKiBwb3NzaWJsZSwgc28gdGltZSBzaG91bGQgYmUgaW4gc2Vjb25kcy4KKyAqIEhvd2V2ZXIgd2UgaW50ZXJuYWxseSB1c2UgYSBhIG11Y2ggc21hbGxlciB1bml0IHN1Y2ggYXMgCisgKiBtaWxsaXNlY29uZHMgb3IgamlmZmllcy4KKyAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBkZWNpbWFsIG51bWJlciB3aXRoIGEgcG9zc2libGUgZnJhY3Rpb25hbAorICogY29tcG9uZW50LCBhbmQgcHJvZHVjZXMgYW4gaW50ZWdlciB3aGljaCBpcyB0aGUgcmVzdWx0IG9mCisgKiBtdWx0aXBseWluZyB0aGF0IG51bWJlciBieSAxMF4nc2NhbGUnLgorICogYWxsIHdpdGhvdXQgYW55IGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMuCisgKi8KK2ludCBzdHJpY3Rfc3RydG91bF9zY2FsZWQoY29uc3QgY2hhciAqY3AsIHVuc2lnbmVkIGxvbmcgKnJlcywgaW50IHNjYWxlKQoreworCXVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gMDsKKwlsb25nIGRlY2ltYWxzID0gLTE7CisJd2hpbGUgKGlzZGlnaXQoKmNwKSB8fCAoKmNwID09ICcuJyAmJiBkZWNpbWFscyA8IDApKSB7CisJCWlmICgqY3AgPT0gJy4nKQorCQkJZGVjaW1hbHMgPSAwOworCQllbHNlIGlmIChkZWNpbWFscyA8IHNjYWxlKSB7CisJCQl1bnNpZ25lZCBpbnQgdmFsdWU7CisJCQl2YWx1ZSA9ICpjcCAtICcwJzsKKwkJCXJlc3VsdCA9IHJlc3VsdCAqIDEwICsgdmFsdWU7CisJCQlpZiAoZGVjaW1hbHMgPj0gMCkKKwkJCQlkZWNpbWFscysrOworCQl9CisJCWNwKys7CisJfQorCWlmICgqY3AgPT0gJ1xuJykKKwkJY3ArKzsKKwlpZiAoKmNwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZGVjaW1hbHMgPCAwKQorCQlkZWNpbWFscyA9IDA7CisJd2hpbGUgKGRlY2ltYWxzIDwgc2NhbGUpIHsKKwkJcmVzdWx0ICo9IDEwOworCQlkZWNpbWFscyArKzsKKwl9CisJKnJlcyA9IHJlc3VsdDsKKwlyZXR1cm4gMDsKK30KKworCiBzdGF0aWMgdm9pZCBtZF9zYWZlbW9kZV90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKIHN0YXRpYyBzc2l6ZV90CkBAIC0yNjcwLDMxICsyODU5LDEwIEBACiBzdGF0aWMgc3NpemVfdAogc2FmZV9kZWxheV9zdG9yZShtZGRldl90ICptZGRldiwgY29uc3QgY2hhciAqY2J1Ziwgc2l6ZV90IGxlbikKIHsKLQlpbnQgc2NhbGU9MTsKLQlpbnQgZG90PTA7Ci0JaW50IGk7CiAJdW5zaWduZWQgbG9uZyBtc2VjOwotCWNoYXIgYnVmWzMwXTsKIAotCS8qIHJlbW92ZSBhIHBlcmlvZCwgYW5kIGNvdW50IGRpZ2l0cyBhZnRlciBpdCAqLwotCWlmIChsZW4gPj0gc2l6ZW9mKGJ1ZikpCisJaWYgKHN0cmljdF9zdHJ0b3VsX3NjYWxlZChjYnVmLCAmbXNlYywgMykgPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlzdHJsY3B5KGJ1ZiwgY2J1Ziwgc2l6ZW9mKGJ1ZikpOwotCWZvciAoaT0wOyBpPGxlbjsgaSsrKSB7Ci0JCWlmIChkb3QpIHsKLQkJCWlmIChpc2RpZ2l0KGJ1ZltpXSkpIHsKLQkJCQlidWZbaS0xXSA9IGJ1ZltpXTsKLQkJCQlzY2FsZSAqPSAxMDsKLQkJCX0KLQkJCWJ1ZltpXSA9IDA7Ci0JCX0gZWxzZSBpZiAoYnVmW2ldID09ICcuJykgewotCQkJZG90PTE7Ci0JCQlidWZbaV0gPSAwOwotCQl9Ci0JfQotCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmbXNlYykgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQltc2VjID0gKG1zZWMgKiAxMDAwKSAvIHNjYWxlOwogCWlmIChtc2VjID09IDApCiAJCW1kZGV2LT5zYWZlbW9kZV9kZWxheSA9IDA7CiAJZWxzZSB7CkBAIC0yOTcwLDcgKzMxMzgsOSBAQAogCiAJaWYgKG1kZGV2LT5wZXJzKQogCQlyZXR1cm4gLUVCVVNZOwotCWlmICghKmJ1ZiB8fCAoKmUgJiYgKmUgIT0gJ1xuJykpCisJaWYgKGNtZF9tYXRjaChidWYsICJub25lIikpCisJCW4gPSBNYXhTZWN0b3I7CisJZWxzZSBpZiAoISpidWYgfHwgKCplICYmICplICE9ICdcbicpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW1kZGV2LT5yZWNvdmVyeV9jcCA9IG47CkBAIC0zMTY2LDYgKzMzMzYsMjkgQEAKIF9fQVRUUihhcnJheV9zdGF0ZSwgU19JUlVHT3xTX0lXVVNSLCBhcnJheV9zdGF0ZV9zaG93LCBhcnJheV9zdGF0ZV9zdG9yZSk7CiAKIHN0YXRpYyBzc2l6ZV90CittYXhfY29ycmVjdGVkX3JlYWRfZXJyb3JzX3Nob3cobWRkZXZfdCAqbWRkZXYsIGNoYXIgKnBhZ2UpIHsKKwlyZXR1cm4gc3ByaW50ZihwYWdlLCAiJWRcbiIsCisJCSAgICAgICBhdG9taWNfcmVhZCgmbWRkZXYtPm1heF9jb3JyX3JlYWRfZXJyb3JzKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CittYXhfY29ycmVjdGVkX3JlYWRfZXJyb3JzX3N0b3JlKG1kZGV2X3QgKm1kZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJY2hhciAqZTsKKwl1bnNpZ25lZCBsb25nIG4gPSBzaW1wbGVfc3RydG91bChidWYsICZlLCAxMCk7CisKKwlpZiAoKmJ1ZiAmJiAoKmUgPT0gMCB8fCAqZSA9PSAnXG4nKSkgeworCQlhdG9taWNfc2V0KCZtZGRldi0+bWF4X2NvcnJfcmVhZF9lcnJvcnMsIG4pOworCQlyZXR1cm4gbGVuOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0cnVjdCBtZF9zeXNmc19lbnRyeSBtYXhfY29ycl9yZWFkX2Vycm9ycyA9CitfX0FUVFIobWF4X3JlYWRfZXJyb3JzLCBTX0lSVUdPfFNfSVdVU1IsIG1heF9jb3JyZWN0ZWRfcmVhZF9lcnJvcnNfc2hvdywKKwltYXhfY29ycmVjdGVkX3JlYWRfZXJyb3JzX3N0b3JlKTsKKworc3RhdGljIHNzaXplX3QKIG51bGxfc2hvdyhtZGRldl90ICptZGRldiwgY2hhciAqcGFnZSkKIHsKIAlyZXR1cm4gLUVJTlZBTDsKQEAgLTM3OTAsNiArMzk4Myw3IEBACiAJJm1kX2FycmF5X3N0YXRlLmF0dHIsCiAJJm1kX3Jlc2hhcGVfcG9zaXRpb24uYXR0ciwKIAkmbWRfYXJyYXlfc2l6ZS5hdHRyLAorCSZtYXhfY29ycl9yZWFkX2Vycm9ycy5hdHRyLAogCU5VTEwsCiB9OwogCkBAIC0zODk0LDYgKzQwODgsNyBAQAogCQltZGRldi0+c3lzZnNfYWN0aW9uID0gTlVMTDsKIAkJbWRkZXYtPnByaXZhdGUgPSBOVUxMOwogCX0KKwlzeXNmc19yZW1vdmVfZ3JvdXAoJm1kZGV2LT5rb2JqLCAmbWRfYml0bWFwX2dyb3VwKTsKIAlrb2JqZWN0X2RlbCgmbWRkZXYtPmtvYmopOwogCWtvYmplY3RfcHV0KCZtZGRldi0+a29iaik7CiB9CkBAIC0zOTg1LDYgKzQxODAsOCBAQAogCQkgICAgICAgZGlzay0+ZGlza19uYW1lKTsKIAkJZXJyb3IgPSAwOwogCX0KKwlpZiAoc3lzZnNfY3JlYXRlX2dyb3VwKCZtZGRldi0+a29iaiwgJm1kX2JpdG1hcF9ncm91cCkpCisJCXByaW50ayhLRVJOX0RFQlVHICJwb2ludGxlc3Mgd2FybmluZ1xuIik7CiAgYWJvcnQ6CiAJbXV0ZXhfdW5sb2NrKCZkaXNrc19tdXRleCk7CiAJaWYgKCFlcnJvcikgewpAQCAtNDIwNiw2ICs0NDAzLDggQEAKIAkJbWRkZXYtPnJvID0gMDsKIAogIAlhdG9taWNfc2V0KCZtZGRldi0+d3JpdGVzX3BlbmRpbmcsMCk7CisJYXRvbWljX3NldCgmbWRkZXYtPm1heF9jb3JyX3JlYWRfZXJyb3JzLAorCQkgICBNRF9ERUZBVUxUX01BWF9DT1JSRUNURURfUkVBRF9FUlJPUlMpOwogCW1kZGV2LT5zYWZlbW9kZSA9IDA7CiAJbWRkZXYtPnNhZmVtb2RlX3RpbWVyLmZ1bmN0aW9uID0gbWRfc2FmZW1vZGVfdGltZW91dDsKIAltZGRldi0+c2FmZW1vZGVfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBtZGRldjsKQEAgLTQzMTAsNyArNDUwOSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHJlc3RvcmVfYml0bWFwX3dyaXRlX2FjY2VzcyhzdHJ1Y3QgZmlsZSAqZmlsZSkKK3ZvaWQgcmVzdG9yZV9iaXRtYXBfd3JpdGVfYWNjZXNzKHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CiAKQEAgLTQ0MDUsMTIgKzQ2MDQsMTIgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAibWQ6ICVzIHN0b3BwZWQuXG4iLCBtZG5hbWUobWRkZXYpKTsKIAogCQliaXRtYXBfZGVzdHJveShtZGRldik7Ci0JCWlmIChtZGRldi0+Yml0bWFwX2ZpbGUpIHsKLQkJCXJlc3RvcmVfYml0bWFwX3dyaXRlX2FjY2VzcyhtZGRldi0+Yml0bWFwX2ZpbGUpOwotCQkJZnB1dChtZGRldi0+Yml0bWFwX2ZpbGUpOwotCQkJbWRkZXYtPmJpdG1hcF9maWxlID0gTlVMTDsKKwkJaWYgKG1kZGV2LT5iaXRtYXBfaW5mby5maWxlKSB7CisJCQlyZXN0b3JlX2JpdG1hcF93cml0ZV9hY2Nlc3MobWRkZXYtPmJpdG1hcF9pbmZvLmZpbGUpOworCQkJZnB1dChtZGRldi0+Yml0bWFwX2luZm8uZmlsZSk7CisJCQltZGRldi0+Yml0bWFwX2luZm8uZmlsZSA9IE5VTEw7CiAJCX0KLQkJbWRkZXYtPmJpdG1hcF9vZmZzZXQgPSAwOworCQltZGRldi0+Yml0bWFwX2luZm8ub2Zmc2V0ID0gMDsKIAogCQkvKiBtYWtlIHN1cmUgYWxsIG1kX2RlbGF5ZWRfZGVsZXRlIGNhbGxzIGhhdmUgZmluaXNoZWQgKi8KIAkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKQEAgLTQ0NTEsNiArNDY1MCwxMSBAQAogCQltZGRldi0+ZGVncmFkZWQgPSAwOwogCQltZGRldi0+YmFycmllcnNfd29yayA9IDA7CiAJCW1kZGV2LT5zYWZlbW9kZSA9IDA7CisJCW1kZGV2LT5iaXRtYXBfaW5mby5vZmZzZXQgPSAwOworCQltZGRldi0+Yml0bWFwX2luZm8uZGVmYXVsdF9vZmZzZXQgPSAwOworCQltZGRldi0+Yml0bWFwX2luZm8uY2h1bmtzaXplID0gMDsKKwkJbWRkZXYtPmJpdG1hcF9pbmZvLmRhZW1vbl9zbGVlcCA9IDA7CisJCW1kZGV2LT5iaXRtYXBfaW5mby5tYXhfd3JpdGVfYmVoaW5kID0gMDsKIAkJa29iamVjdF91ZXZlbnQoJmRpc2tfdG9fZGV2KG1kZGV2LT5nZW5kaXNrKS0+a29iaiwgS09CSl9DSEFOR0UpOwogCQlpZiAobWRkZXYtPmhvbGRfYWN0aXZlID09IFVOVElMX1NUT1ApCiAJCQltZGRldi0+aG9sZF9hY3RpdmUgPSAwOwpAQCAtNDYzNiw3ICs0ODQwLDcgQEAKIAlpbmZvLnN0YXRlICAgICAgICAgPSAwOwogCWlmIChtZGRldi0+aW5fc3luYykKIAkJaW5mby5zdGF0ZSA9ICgxPDxNRF9TQl9DTEVBTik7Ci0JaWYgKG1kZGV2LT5iaXRtYXAgJiYgbWRkZXYtPmJpdG1hcF9vZmZzZXQpCisJaWYgKG1kZGV2LT5iaXRtYXAgJiYgbWRkZXYtPmJpdG1hcF9pbmZvLm9mZnNldCkKIAkJaW5mby5zdGF0ZSA9ICgxPDxNRF9TQl9CSVRNQVBfUFJFU0VOVCk7CiAJaW5mby5hY3RpdmVfZGlza3MgID0gaW5zeW5jOwogCWluZm8ud29ya2luZ19kaXNrcyA9IHdvcmtpbmc7CkBAIC00OTk0LDIzICs1MTk4LDIzIEBACiAJaWYgKGZkID49IDApIHsKIAkJaWYgKG1kZGV2LT5iaXRtYXApCiAJCQlyZXR1cm4gLUVFWElTVDsgLyogY2Fubm90IGFkZCB3aGVuIGJpdG1hcCBpcyBwcmVzZW50ICovCi0JCW1kZGV2LT5iaXRtYXBfZmlsZSA9IGZnZXQoZmQpOworCQltZGRldi0+Yml0bWFwX2luZm8uZmlsZSA9IGZnZXQoZmQpOwogCi0JCWlmIChtZGRldi0+Yml0bWFwX2ZpbGUgPT0gTlVMTCkgeworCQlpZiAobWRkZXYtPmJpdG1hcF9pbmZvLmZpbGUgPT0gTlVMTCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3I6IGZhaWxlZCB0byBnZXQgYml0bWFwIGZpbGVcbiIsCiAJCQkgICAgICAgbWRuYW1lKG1kZGV2KSk7CiAJCQlyZXR1cm4gLUVCQURGOwogCQl9CiAKLQkJZXJyID0gZGVueV9iaXRtYXBfd3JpdGVfYWNjZXNzKG1kZGV2LT5iaXRtYXBfZmlsZSk7CisJCWVyciA9IGRlbnlfYml0bWFwX3dyaXRlX2FjY2VzcyhtZGRldi0+Yml0bWFwX2luZm8uZmlsZSk7CiAJCWlmIChlcnIpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yOiBiaXRtYXAgZmlsZSBpcyBhbHJlYWR5IGluIHVzZVxuIiwKIAkJCSAgICAgICBtZG5hbWUobWRkZXYpKTsKLQkJCWZwdXQobWRkZXYtPmJpdG1hcF9maWxlKTsKLQkJCW1kZGV2LT5iaXRtYXBfZmlsZSA9IE5VTEw7CisJCQlmcHV0KG1kZGV2LT5iaXRtYXBfaW5mby5maWxlKTsKKwkJCW1kZGV2LT5iaXRtYXBfaW5mby5maWxlID0gTlVMTDsKIAkJCXJldHVybiBlcnI7CiAJCX0KLQkJbWRkZXYtPmJpdG1hcF9vZmZzZXQgPSAwOyAvKiBmaWxlIG92ZXJyaWRlcyBvZmZzZXQgKi8KKwkJbWRkZXYtPmJpdG1hcF9pbmZvLm9mZnNldCA9IDA7IC8qIGZpbGUgb3ZlcnJpZGVzIG9mZnNldCAqLwogCX0gZWxzZSBpZiAobWRkZXYtPmJpdG1hcCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0VOVDsgLyogY2Fubm90IHJlbW92ZSB3aGF0IGlzbid0IHRoZXJlICovCiAJZXJyID0gMDsKQEAgLTUwMjUsMTEgKzUyMjksMTEgQEAKIAkJbWRkZXYtPnBlcnMtPnF1aWVzY2UobWRkZXYsIDApOwogCX0KIAlpZiAoZmQgPCAwKSB7Ci0JCWlmIChtZGRldi0+Yml0bWFwX2ZpbGUpIHsKLQkJCXJlc3RvcmVfYml0bWFwX3dyaXRlX2FjY2VzcyhtZGRldi0+Yml0bWFwX2ZpbGUpOwotCQkJZnB1dChtZGRldi0+Yml0bWFwX2ZpbGUpOworCQlpZiAobWRkZXYtPmJpdG1hcF9pbmZvLmZpbGUpIHsKKwkJCXJlc3RvcmVfYml0bWFwX3dyaXRlX2FjY2VzcyhtZGRldi0+Yml0bWFwX2luZm8uZmlsZSk7CisJCQlmcHV0KG1kZGV2LT5iaXRtYXBfaW5mby5maWxlKTsKIAkJfQotCQltZGRldi0+Yml0bWFwX2ZpbGUgPSBOVUxMOworCQltZGRldi0+Yml0bWFwX2luZm8uZmlsZSA9IE5VTEw7CiAJfQogCiAJcmV0dXJuIGVycjsKQEAgLTUwOTYsOCArNTMwMCw4IEBACiAJCW1kZGV2LT5mbGFncyAgICAgICAgID0gMDsKIAlzZXRfYml0KE1EX0NIQU5HRV9ERVZTLCAmbWRkZXYtPmZsYWdzKTsKIAotCW1kZGV2LT5kZWZhdWx0X2JpdG1hcF9vZmZzZXQgPSBNRF9TQl9CWVRFUyA+PiA5OwotCW1kZGV2LT5iaXRtYXBfb2Zmc2V0ID0gMDsKKwltZGRldi0+Yml0bWFwX2luZm8uZGVmYXVsdF9vZmZzZXQgPSBNRF9TQl9CWVRFUyA+PiA5OworCW1kZGV2LT5iaXRtYXBfaW5mby5vZmZzZXQgPSAwOwogCiAJbWRkZXYtPnJlc2hhcGVfcG9zaXRpb24gPSBNYXhTZWN0b3I7CiAKQEAgLTUxOTcsNyArNTQwMSw3IEBACiAJaW50IHN0YXRlID0gMDsKIAogCS8qIGNhbGN1bGF0ZSBleHBlY3RlZCBzdGF0ZSxpZ25vcmluZyBsb3cgYml0cyAqLwotCWlmIChtZGRldi0+Yml0bWFwICYmIG1kZGV2LT5iaXRtYXBfb2Zmc2V0KQorCWlmIChtZGRldi0+Yml0bWFwICYmIG1kZGV2LT5iaXRtYXBfaW5mby5vZmZzZXQpCiAJCXN0YXRlIHw9ICgxIDw8IE1EX1NCX0JJVE1BUF9QUkVTRU5UKTsKIAogCWlmIChtZGRldi0+bWFqb3JfdmVyc2lvbiAhPSBpbmZvLT5tYWpvcl92ZXJzaW9uIHx8CkBAIC01MjU2LDkgKzU0NjAsMTAgQEAKIAkJCS8qIGFkZCB0aGUgYml0bWFwICovCiAJCQlpZiAobWRkZXYtPmJpdG1hcCkKIAkJCQlyZXR1cm4gLUVFWElTVDsKLQkJCWlmIChtZGRldi0+ZGVmYXVsdF9iaXRtYXBfb2Zmc2V0ID09IDApCisJCQlpZiAobWRkZXYtPmJpdG1hcF9pbmZvLmRlZmF1bHRfb2Zmc2V0ID09IDApCiAJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQltZGRldi0+Yml0bWFwX29mZnNldCA9IG1kZGV2LT5kZWZhdWx0X2JpdG1hcF9vZmZzZXQ7CisJCQltZGRldi0+Yml0bWFwX2luZm8ub2Zmc2V0ID0KKwkJCQltZGRldi0+Yml0bWFwX2luZm8uZGVmYXVsdF9vZmZzZXQ7CiAJCQltZGRldi0+cGVycy0+cXVpZXNjZShtZGRldiwgMSk7CiAJCQlydiA9IGJpdG1hcF9jcmVhdGUobWRkZXYpOwogCQkJaWYgKHJ2KQpAQCAtNTI3Myw3ICs1NDc4LDcgQEAKIAkJCW1kZGV2LT5wZXJzLT5xdWllc2NlKG1kZGV2LCAxKTsKIAkJCWJpdG1hcF9kZXN0cm95KG1kZGV2KTsKIAkJCW1kZGV2LT5wZXJzLT5xdWllc2NlKG1kZGV2LCAwKTsKLQkJCW1kZGV2LT5iaXRtYXBfb2Zmc2V0ID0gMDsKKwkJCW1kZGV2LT5iaXRtYXBfaW5mby5vZmZzZXQgPSAwOwogCQl9CiAJfQogCW1kX3VwZGF0ZV9zYihtZGRldiwgMSk7CkBAIC01NTI0LDYgKzU3MjksMjUgQEAKIGFib3J0OgogCXJldHVybiBlcnI7CiB9CisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RhdGljIGludCBtZF9jb21wYXRfaW9jdGwoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgZm1vZGVfdCBtb2RlLAorCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEhPVF9SRU1PVkVfRElTSzoKKwljYXNlIEhPVF9BRERfRElTSzoKKwljYXNlIFNFVF9ESVNLX0ZBVUxUWToKKwljYXNlIFNFVF9CSVRNQVBfRklMRToKKwkJLyogVGhlc2UgdGFrZSBpbiBpbnRlZ2VyIGFyZywgZG8gbm90IGNvbnZlcnQgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYXJnID0gKHVuc2lnbmVkIGxvbmcpY29tcGF0X3B0cihhcmcpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gbWRfaW9jdGwoYmRldiwgbW9kZSwgY21kLCBhcmcpOworfQorI2VuZGlmIC8qIENPTkZJR19DT01QQVQgKi8KIAogc3RhdGljIGludCBtZF9vcGVuKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGZtb2RlX3QgbW9kZSkKIHsKQEAgLTU1ODksNiArNTgxMyw5IEBACiAJLm9wZW4JCT0gbWRfb3BlbiwKIAkucmVsZWFzZQk9IG1kX3JlbGVhc2UsCiAJLmlvY3RsCQk9IG1kX2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsCT0gbWRfY29tcGF0X2lvY3RsLAorI2VuZGlmCiAJLmdldGdlbwkJPSBtZF9nZXRnZW8sCiAJLm1lZGlhX2NoYW5nZWQJPSBtZF9tZWRpYV9jaGFuZ2VkLAogCS5yZXZhbGlkYXRlX2Rpc2s9IG1kX3JldmFsaWRhdGUsCkBAIC01OTgyLDE0ICs2MjA5LDE0IEBACiAJCQl1bnNpZ25lZCBsb25nIGNodW5rX2tiOwogCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKLQkJCWNodW5rX2tiID0gYml0bWFwLT5jaHVua3NpemUgPj4gMTA7CisJCQljaHVua19rYiA9IG1kZGV2LT5iaXRtYXBfaW5mby5jaHVua3NpemUgPj4gMTA7CiAJCQlzZXFfcHJpbnRmKHNlcSwgImJpdG1hcDogJWx1LyVsdSBwYWdlcyBbJWx1S0JdLCAiCiAJCQkJIiVsdSVzIGNodW5rIiwKIAkJCQliaXRtYXAtPnBhZ2VzIC0gYml0bWFwLT5taXNzaW5nX3BhZ2VzLAogCQkJCWJpdG1hcC0+cGFnZXMsCiAJCQkJKGJpdG1hcC0+cGFnZXMgLSBiaXRtYXAtPm1pc3NpbmdfcGFnZXMpCiAJCQkJCTw8IChQQUdFX1NISUZUIC0gMTApLAotCQkJCWNodW5rX2tiID8gY2h1bmtfa2IgOiBiaXRtYXAtPmNodW5rc2l6ZSwKKwkJCQljaHVua19rYiA/IGNodW5rX2tiIDogbWRkZXYtPmJpdG1hcF9pbmZvLmNodW5rc2l6ZSwKIAkJCQljaHVua19rYiA/ICJLQiIgOiAiQiIpOwogCQkJaWYgKGJpdG1hcC0+ZmlsZSkgewogCQkJCXNlcV9wcmludGYoc2VxLCAiLCBmaWxlOiAiKTsKQEAgLTYzMzgsMTIgKzY1NjUsMTQgQEAKIAkJLyogcmVjb3ZlcnkgZm9sbG93cyB0aGUgcGh5c2ljYWwgc2l6ZSBvZiBkZXZpY2VzICovCiAJCW1heF9zZWN0b3JzID0gbWRkZXYtPmRldl9zZWN0b3JzOwogCQlqID0gTWF4U2VjdG9yOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KQorCQlyY3VfcmVhZF9sb2NrKCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KQogCQkJaWYgKHJkZXYtPnJhaWRfZGlzayA+PSAwICYmCiAJCQkgICAgIXRlc3RfYml0KEZhdWx0eSwgJnJkZXYtPmZsYWdzKSAmJgogCQkJICAgICF0ZXN0X2JpdChJbl9zeW5jLCAmcmRldi0+ZmxhZ3MpICYmCiAJCQkgICAgcmRldi0+cmVjb3Zlcnlfb2Zmc2V0IDwgaikKIAkJCQlqID0gcmRldi0+cmVjb3Zlcnlfb2Zmc2V0OworCQlyY3VfcmVhZF91bmxvY2soKTsKIAl9CiAKIAlwcmludGsoS0VSTl9JTkZPICJtZDogJXMgb2YgUkFJRCBhcnJheSAlc1xuIiwgZGVzYywgbWRuYW1lKG1kZGV2KSk7CkBAIC02MzgwLDYgKzY2MDksNyBAQAogCQkgICAgICAgZGVzYywgbWRuYW1lKG1kZGV2KSk7CiAJCW1kZGV2LT5jdXJyX3Jlc3luYyA9IGo7CiAJfQorCW1kZGV2LT5jdXJyX3Jlc3luY19jb21wbGV0ZWQgPSBtZGRldi0+Y3Vycl9yZXN5bmM7CiAKIAl3aGlsZSAoaiA8IG1heF9zZWN0b3JzKSB7CiAJCXNlY3Rvcl90IHNlY3RvcnM7CkBAIC02NTEyLDIyICs2NzQyLDI5IEBACiAJCX0gZWxzZSB7CiAJCQlpZiAoIXRlc3RfYml0KE1EX1JFQ09WRVJZX0lOVFIsICZtZGRldi0+cmVjb3ZlcnkpKQogCQkJCW1kZGV2LT5jdXJyX3Jlc3luYyA9IE1heFNlY3RvcjsKLQkJCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpCisJCQlyY3VfcmVhZF9sb2NrKCk7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkKIAkJCQlpZiAocmRldi0+cmFpZF9kaXNrID49IDAgJiYKIAkJCQkgICAgIXRlc3RfYml0KEZhdWx0eSwgJnJkZXYtPmZsYWdzKSAmJgogCQkJCSAgICAhdGVzdF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKSAmJgogCQkJCSAgICByZGV2LT5yZWNvdmVyeV9vZmZzZXQgPCBtZGRldi0+Y3Vycl9yZXN5bmMpCiAJCQkJCXJkZXYtPnJlY292ZXJ5X29mZnNldCA9IG1kZGV2LT5jdXJyX3Jlc3luYzsKKwkJCXJjdV9yZWFkX3VubG9jaygpOwogCQl9CiAJfQogCXNldF9iaXQoTURfQ0hBTkdFX0RFVlMsICZtZGRldi0+ZmxhZ3MpOwogCiAgc2tpcDoKLQltZGRldi0+Y3Vycl9yZXN5bmMgPSAwOwotCW1kZGV2LT5jdXJyX3Jlc3luY19jb21wbGV0ZWQgPSAwOwotCWlmICghdGVzdF9iaXQoTURfUkVDT1ZFUllfSU5UUiwgJm1kZGV2LT5yZWNvdmVyeSkpCi0JCS8qIFdlIGNvbXBsZXRlZCBzbyBtYXggc2V0dGluZyBjYW4gYmUgZm9yZ290dGVuLiAqLworCWlmICghdGVzdF9iaXQoTURfUkVDT1ZFUllfSU5UUiwgJm1kZGV2LT5yZWNvdmVyeSkpIHsKKwkJLyogV2UgY29tcGxldGVkIHNvIG1pbi9tYXggc2V0dGluZyBjYW4gYmUgZm9yZ290dGVuIGlmIHVzZWQuICovCisJCWlmICh0ZXN0X2JpdChNRF9SRUNPVkVSWV9SRVFVRVNURUQsICZtZGRldi0+cmVjb3ZlcnkpKQorCQkJbWRkZXYtPnJlc3luY19taW4gPSAwOwogCQltZGRldi0+cmVzeW5jX21heCA9IE1heFNlY3RvcjsKKwl9IGVsc2UgaWYgKHRlc3RfYml0KE1EX1JFQ09WRVJZX1JFUVVFU1RFRCwgJm1kZGV2LT5yZWNvdmVyeSkpCisJCW1kZGV2LT5yZXN5bmNfbWluID0gbWRkZXYtPmN1cnJfcmVzeW5jX2NvbXBsZXRlZDsKKwltZGRldi0+Y3Vycl9yZXN5bmMgPSAwOworCWlmICghdGVzdF9iaXQoTURfUkVDT1ZFUllfSU5UUiwgJm1kZGV2LT5yZWNvdmVyeSkpCisJCW1kZGV2LT5jdXJyX3Jlc3luY19jb21wbGV0ZWQgPSAwOwogCXN5c2ZzX25vdGlmeSgmbWRkZXYtPmtvYmosIE5VTEwsICJzeW5jX2NvbXBsZXRlZCIpOwogCXdha2VfdXAoJnJlc3luY193YWl0KTsKIAlzZXRfYml0KE1EX1JFQ09WRVJZX0RPTkUsICZtZGRldi0+cmVjb3ZlcnkpOwpAQCAtNjU5MCw2ICs2ODI3LDcgQEAKIAkJCQkJCSAgICAgICBubSwgbWRuYW1lKG1kZGV2KSk7CiAJCQkJCXNwYXJlcysrOwogCQkJCQltZF9uZXdfZXZlbnQobWRkZXYpOworCQkJCQlzZXRfYml0KE1EX0NIQU5HRV9ERVZTLCAmbWRkZXYtPmZsYWdzKTsKIAkJCQl9IGVsc2UKIAkJCQkJYnJlYWs7CiAJCQl9CkBAIC02NjI1LDcgKzY4NjMsNyBAQAogCiAKIAlpZiAobWRkZXYtPmJpdG1hcCkKLQkJYml0bWFwX2RhZW1vbl93b3JrKG1kZGV2LT5iaXRtYXApOworCQliaXRtYXBfZGFlbW9uX3dvcmsobWRkZXYpOwogCiAJaWYgKG1kZGV2LT5ybykKIAkJcmV0dXJuOwpAQCAtNjk5NSw1ICs3MjMzLDYgQEAKIEVYUE9SVF9TWU1CT0wobWRfd2FrZXVwX3RocmVhZCk7CiBFWFBPUlRfU1lNQk9MKG1kX2NoZWNrX3JlY292ZXJ5KTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTUQgUkFJRCBmcmFtZXdvcmsiKTsKIE1PRFVMRV9BTElBUygibWQiKTsKIE1PRFVMRV9BTElBU19CTE9DS0RFVl9NQUpPUihNRF9NQUpPUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL21kLmggYi9kcml2ZXJzL21kL21kLmgKaW5kZXggZjE4NGI2OS4uOGU0Yzc1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9tZC5oCisrKyBiL2RyaXZlcnMvbWQvbWQuaApAQCAtOTcsNiArOTcsOSBAQAogCWF0b21pY190CXJlYWRfZXJyb3JzOwkvKiBudW1iZXIgb2YgY29uc2VjdXRpdmUgcmVhZCBlcnJvcnMgdGhhdAogCQkJCQkgKiB3ZSBoYXZlIHRyaWVkIHRvIGlnbm9yZS4KIAkJCQkJICovCisJc3RydWN0IHRpbWVzcGVjIGxhc3RfcmVhZF9lcnJvcjsJLyogbW9ub3RvbmljIHRpbWUgc2luY2Ugb3VyCisJCQkJCQkgKiBsYXN0IHJlYWQgZXJyb3IKKwkJCQkJCSAqLwogCWF0b21pY190CWNvcnJlY3RlZF9lcnJvcnM7IC8qIG51bWJlciBvZiBjb3JyZWN0ZWQgcmVhZCBlcnJvcnMsCiAJCQkJCSAgICogZm9yIHJlcG9ydGluZyB0byB1c2Vyc3BhY2UgYW5kIHN0b3JpbmcKIAkJCQkJICAgKiBpbiBzdXBlcmJsb2NrLgpAQCAtMjgwLDE3ICsyODMsMzggQEAKIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgIG1heF93cml0ZV9iZWhpbmQ7IC8qIDAgPSBzeW5jICovCiAKIAlzdHJ1Y3QgYml0bWFwICAgICAgICAgICAgICAgICAgICpiaXRtYXA7IC8qIHRoZSBiaXRtYXAgZm9yIHRoZSBkZXZpY2UgKi8KLQlzdHJ1Y3QgZmlsZQkJCSpiaXRtYXBfZmlsZTsgLyogdGhlIGJpdG1hcCBmaWxlICovCi0JbG9uZwkJCQliaXRtYXBfb2Zmc2V0OyAvKiBvZmZzZXQgZnJvbSBzdXBlcmJsb2NrIG9mCi0JCQkJCQkJKiBzdGFydCBvZiBiaXRtYXAuIE1heSBiZQotCQkJCQkJCSogbmVnYXRpdmUsIGJ1dCBub3QgJzAnCi0JCQkJCQkJKi8KLQlsb25nCQkJCWRlZmF1bHRfYml0bWFwX29mZnNldDsgLyogdGhpcyBpcyB0aGUgb2Zmc2V0IHRvIHVzZSB3aGVuCi0JCQkJCQkJCSogaG90LWFkZGluZyBhIGJpdG1hcC4gIEl0IHNob3VsZAotCQkJCQkJCQkqIGV2ZW50dWFsbHkgYmUgc2V0dGFibGUgYnkgc3lzZnMuCi0JCQkJCQkJCSovCisJc3RydWN0IHsKKwkJc3RydWN0IGZpbGUJCSpmaWxlOyAvKiB0aGUgYml0bWFwIGZpbGUgKi8KKwkJbG9mZl90CQkJb2Zmc2V0OyAvKiBvZmZzZXQgZnJvbSBzdXBlcmJsb2NrIG9mCisJCQkJCQkgKiBzdGFydCBvZiBiaXRtYXAuIE1heSBiZQorCQkJCQkJICogbmVnYXRpdmUsIGJ1dCBub3QgJzAnCisJCQkJCQkgKiBGb3IgZXh0ZXJuYWwgbWV0YWRhdGEsIG9mZnNldAorCQkJCQkJICogZnJvbSBzdGFydCBvZiBkZXZpY2UuIAorCQkJCQkJICovCisJCWxvZmZfdAkJCWRlZmF1bHRfb2Zmc2V0OyAvKiB0aGlzIGlzIHRoZSBvZmZzZXQgdG8gdXNlIHdoZW4KKwkJCQkJCQkgKiBob3QtYWRkaW5nIGEgYml0bWFwLiAgSXQgc2hvdWxkCisJCQkJCQkJICogZXZlbnR1YWxseSBiZSBzZXR0YWJsZSBieSBzeXNmcy4KKwkJCQkJCQkgKi8KKwkJc3RydWN0IG11dGV4CQltdXRleDsKKwkJdW5zaWduZWQgbG9uZwkJY2h1bmtzaXplOworCQl1bnNpZ25lZCBsb25nCQlkYWVtb25fc2xlZXA7IC8qIGhvdyBtYW55IHNlY29uZHMgYmV0d2VlbiB1cGRhdGVzPyAqLworCQl1bnNpZ25lZCBsb25nCQltYXhfd3JpdGVfYmVoaW5kOyAvKiB3cml0ZS1iZWhpbmQgbW9kZSAqLworCQlpbnQJCQlleHRlcm5hbDsKKwl9IGJpdG1hcF9pbmZvOwogCisJYXRvbWljX3QgCQkJbWF4X2NvcnJfcmVhZF9lcnJvcnM7IC8qIG1heCByZWFkIHJldHJpZXMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCQlhbGxfbWRkZXZzOworCisJLyogR2VuZXJpYyBiYXJyaWVyIGhhbmRsaW5nLgorCSAqIElmIHRoZXJlIGlzIGEgcGVuZGluZyBiYXJyaWVyIHJlcXVlc3QsIGFsbCBvdGhlcgorCSAqIHdyaXRlcyBhcmUgYmxvY2tlZCB3aGlsZSB0aGUgZGV2aWNlcyBhcmUgZmx1c2hlZC4KKwkgKiBUaGUgbGFzdCB0byBmaW5pc2ggYSBmbHVzaCBzY2hlZHVsZXMgYSB3b3JrZXIgdG8KKwkgKiBzdWJtaXQgdGhlIGJhcnJpZXIgcmVxdWVzdCAod2l0aG91dCB0aGUgYmFycmllciBmbGFnKSwKKwkgKiB0aGVuIHN1Ym1pdCBtb3JlIGZsdXNoIHJlcXVlc3RzLgorCSAqLworCXN0cnVjdCBiaW8gKmJhcnJpZXI7CisJYXRvbWljX3QgZmx1c2hfcGVuZGluZzsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYmFycmllcl93b3JrOwogfTsKIAogCkBAIC0zNTMsNyArMzc3LDcgQEAKIAlzc2l6ZV90ICgqc2hvdykobWRkZXZfdCAqLCBjaGFyICopOwogCXNzaXplX3QgKCpzdG9yZSkobWRkZXZfdCAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CiB9OwotCitleHRlcm4gc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBtZF9iaXRtYXBfZ3JvdXA7CiAKIHN0YXRpYyBpbmxpbmUgY2hhciAqIG1kbmFtZSAobWRkZXZfdCAqIG1kZGV2KQogewpAQCAtNDMxLDYgKzQ1NSw3IEBACiBleHRlcm4gdm9pZCBtZF9lcnJvcihtZGRldl90ICptZGRldiwgbWRrX3JkZXZfdCAqcmRldik7CiAKIGV4dGVybiBpbnQgbWRkZXZfY29uZ2VzdGVkKG1kZGV2X3QgKm1kZGV2LCBpbnQgYml0cyk7CitleHRlcm4gdm9pZCBtZF9iYXJyaWVyX3JlcXVlc3QobWRkZXZfdCAqbWRkZXYsIHN0cnVjdCBiaW8gKmJpbyk7CiBleHRlcm4gdm9pZCBtZF9zdXBlcl93cml0ZShtZGRldl90ICptZGRldiwgbWRrX3JkZXZfdCAqcmRldiwKIAkJCSAgIHNlY3Rvcl90IHNlY3RvciwgaW50IHNpemUsIHN0cnVjdCBwYWdlICpwYWdlKTsKIGV4dGVybiB2b2lkIG1kX3N1cGVyX3dhaXQobWRkZXZfdCAqbWRkZXYpOwpAQCAtNDQzLDYgKzQ2OCw4IEBACiBleHRlcm4gdm9pZCBtZF9zZXRfYXJyYXlfc2VjdG9ycyhtZGRldl90ICptZGRldiwgc2VjdG9yX3QgYXJyYXlfc2VjdG9ycyk7CiBleHRlcm4gaW50IG1kX2NoZWNrX25vX2JpdG1hcChtZGRldl90ICptZGRldik7CiBleHRlcm4gaW50IG1kX2ludGVncml0eV9yZWdpc3RlcihtZGRldl90ICptZGRldik7Ci12b2lkIG1kX2ludGVncml0eV9hZGRfcmRldihtZGtfcmRldl90ICpyZGV2LCBtZGRldl90ICptZGRldik7CitleHRlcm4gdm9pZCBtZF9pbnRlZ3JpdHlfYWRkX3JkZXYobWRrX3JkZXZfdCAqcmRldiwgbWRkZXZfdCAqbWRkZXYpOworZXh0ZXJuIGludCBzdHJpY3Rfc3RydG91bF9zY2FsZWQoY29uc3QgY2hhciAqY3AsIHVuc2lnbmVkIGxvbmcgKnJlcywgaW50IHNjYWxlKTsKK2V4dGVybiB2b2lkIHJlc3RvcmVfYml0bWFwX3dyaXRlX2FjY2VzcyhzdHJ1Y3QgZmlsZSAqZmlsZSk7CiAKICNlbmRpZiAvKiBfTURfTURfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9tdWx0aXBhdGguYyBiL2RyaXZlcnMvbWQvbXVsdGlwYXRoLmMKaW5kZXggZWU3NjQ2Zi4uMzJhNjYyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9tdWx0aXBhdGguYworKysgYi9kcml2ZXJzL21kL211bHRpcGF0aC5jCkBAIC0xNDUsNyArMTQ1LDcgQEAKIAlpbnQgY3B1OwogCiAJaWYgKHVubGlrZWx5KGJpb19yd19mbGFnZ2VkKGJpbywgQklPX1JXX0JBUlJJRVIpKSkgewotCQliaW9fZW5kaW8oYmlvLCAtRU9QTk9UU1VQUCk7CisJCW1kX2JhcnJpZXJfcmVxdWVzdChtZGRldiwgYmlvKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC01ODEsNiArNTgxLDcgQEAKIG1vZHVsZV9pbml0KG11bHRpcGF0aF9pbml0KTsKIG1vZHVsZV9leGl0KG11bHRpcGF0aF9leGl0KTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigic2ltcGxlIG11bHRpLXBhdGggcGVyc29uYWxpdHkgZm9yIE1EIik7CiBNT0RVTEVfQUxJQVMoIm1kLXBlcnNvbmFsaXR5LTciKTsgLyogTVVMVElQQVRIICovCiBNT0RVTEVfQUxJQVMoIm1kLW11bHRpcGF0aCIpOwogTU9EVUxFX0FMSUFTKCJtZC1sZXZlbC0tNCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkMC5jIGIvZHJpdmVycy9tZC9yYWlkMC5jCmluZGV4IGQzYTRjZTAuLjc3NjA1Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDAuYworKysgYi9kcml2ZXJzL21kL3JhaWQwLmMKQEAgLTQ1Myw3ICs0NTMsNyBAQAogCWludCBjcHU7CiAKIAlpZiAodW5saWtlbHkoYmlvX3J3X2ZsYWdnZWQoYmlvLCBCSU9fUldfQkFSUklFUikpKSB7Ci0JCWJpb19lbmRpbyhiaW8sIC1FT1BOT1RTVVBQKTsKKwkJbWRfYmFycmllcl9yZXF1ZXN0KG1kZGV2LCBiaW8pOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTU2Nyw2ICs1NjcsNyBAQAogbW9kdWxlX2luaXQocmFpZDBfaW5pdCk7CiBtb2R1bGVfZXhpdChyYWlkMF9leGl0KTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUkFJRDAgKHN0cmlwaW5nKSBwZXJzb25hbGl0eSBmb3IgTUQiKTsKIE1PRFVMRV9BTElBUygibWQtcGVyc29uYWxpdHktMiIpOyAvKiBSQUlEMCAqLwogTU9EVUxFX0FMSUFTKCJtZC1yYWlkMCIpOwogTU9EVUxFX0FMSUFTKCJtZC1sZXZlbC0wIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQxLmMgYi9kcml2ZXJzL21kL3JhaWQxLmMKaW5kZXggZTA3Y2UyZS4uODU5YmQzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDEuYwpAQCAtNjc3LDYgKzY3Nyw3IEBACiBzdGF0aWMgdm9pZCBsb3dlcl9iYXJyaWVyKGNvbmZfdCAqY29uZikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCUJVR19PTihjb25mLT5iYXJyaWVyIDw9IDApOwogCXNwaW5fbG9ja19pcnFzYXZlKCZjb25mLT5yZXN5bmNfbG9jaywgZmxhZ3MpOwogCWNvbmYtPmJhcnJpZXItLTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25mLT5yZXN5bmNfbG9jaywgZmxhZ3MpOwpAQCAtODAxLDYgKzgwMiwyNSBAQAogCiAJbWRfd3JpdGVfc3RhcnQobWRkZXYsIGJpbyk7IC8qIHdhaXQgb24gc3VwZXJibG9jayB1cGRhdGUgZWFybHkgKi8KIAorCWlmIChiaW9fZGF0YV9kaXIoYmlvKSA9PSBXUklURSAmJgorCSAgICBiaW8tPmJpX3NlY3RvciArIGJpby0+Ymlfc2l6ZS81MTIgPiBtZGRldi0+c3VzcGVuZF9sbyAmJgorCSAgICBiaW8tPmJpX3NlY3RvciA8IG1kZGV2LT5zdXNwZW5kX2hpKSB7CisJCS8qIEFzIHRoZSBzdXNwZW5kXyogcmFuZ2UgaXMgY29udHJvbGxlZCBieQorCQkgKiB1c2Vyc3BhY2UsIHdlIHdhbnQgYW4gaW50ZXJydXB0aWJsZQorCQkgKiB3YWl0LgorCQkgKi8KKwkJREVGSU5FX1dBSVQodyk7CisJCWZvciAoOzspIHsKKwkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CisJCQlwcmVwYXJlX3RvX3dhaXQoJmNvbmYtPndhaXRfYmFycmllciwKKwkJCQkJJncsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlpZiAoYmlvLT5iaV9zZWN0b3IgKyBiaW8tPmJpX3NpemUvNTEyIDw9IG1kZGV2LT5zdXNwZW5kX2xvIHx8CisJCQkgICAgYmlvLT5iaV9zZWN0b3IgPj0gbWRkZXYtPnN1c3BlbmRfaGkpCisJCQkJYnJlYWs7CisJCQlzY2hlZHVsZSgpOworCQl9CisJCWZpbmlzaF93YWl0KCZjb25mLT53YWl0X2JhcnJpZXIsICZ3KTsKKwl9CiAJaWYgKHVubGlrZWx5KCFtZGRldi0+YmFycmllcnNfd29yayAmJgogCQkgICAgIGJpb19yd19mbGFnZ2VkKGJpbywgQklPX1JXX0JBUlJJRVIpKSkgewogCQlpZiAocncgPT0gV1JJVEUpCkBAIC05MjMsNyArOTQzLDggQEAKIAogCS8qIGRvIGJlaGluZCBJL08gPyAqLwogCWlmIChiaXRtYXAgJiYKLQkgICAgYXRvbWljX3JlYWQoJmJpdG1hcC0+YmVoaW5kX3dyaXRlcykgPCBiaXRtYXAtPm1heF93cml0ZV9iZWhpbmQgJiYKKwkgICAgKGF0b21pY19yZWFkKCZiaXRtYXAtPmJlaGluZF93cml0ZXMpCisJICAgICA8IG1kZGV2LT5iaXRtYXBfaW5mby5tYXhfd3JpdGVfYmVoaW5kKSAmJgogCSAgICAoYmVoaW5kX3BhZ2VzID0gYWxsb2NfYmVoaW5kX3BhZ2VzKGJpbykpICE9IE5VTEwpCiAJCXNldF9iaXQoUjFCSU9fQmVoaW5kSU8sICZyMV9iaW8tPnN0YXRlKTsKIApAQCAtMTk0MSw3NCArMTk2Miw0OCBAQAogCXJldHVybiBtZGRldi0+ZGV2X3NlY3RvcnM7CiB9CiAKLXN0YXRpYyBpbnQgcnVuKG1kZGV2X3QgKm1kZGV2KQorc3RhdGljIGNvbmZfdCAqc2V0dXBfY29uZihtZGRldl90ICptZGRldikKIHsKIAljb25mX3QgKmNvbmY7Ci0JaW50IGksIGosIGRpc2tfaWR4OworCWludCBpOwogCW1pcnJvcl9pbmZvX3QgKmRpc2s7CiAJbWRrX3JkZXZfdCAqcmRldjsKKwlpbnQgZXJyID0gLUVOT01FTTsKIAotCWlmIChtZGRldi0+bGV2ZWwgIT0gMSkgewotCQlwcmludGsoInJhaWQxOiAlczogcmFpZCBsZXZlbCBub3Qgc2V0IHRvIG1pcnJvcmluZyAoJWQpXG4iLAotCQkgICAgICAgbWRuYW1lKG1kZGV2KSwgbWRkZXYtPmxldmVsKTsKLQkJZ290byBvdXQ7Ci0JfQotCWlmIChtZGRldi0+cmVzaGFwZV9wb3NpdGlvbiAhPSBNYXhTZWN0b3IpIHsKLQkJcHJpbnRrKCJyYWlkMTogJXM6IHJlc2hhcGVfcG9zaXRpb24gc2V0IGJ1dCBub3Qgc3VwcG9ydGVkXG4iLAotCQkgICAgICAgbWRuYW1lKG1kZGV2KSk7Ci0JCWdvdG8gb3V0OwotCX0KLQkvKgotCSAqIGNvcHkgdGhlIGFscmVhZHkgdmVyaWZpZWQgZGV2aWNlcyBpbnRvIG91ciBwcml2YXRlIFJBSUQxCi0JICogYm9va2tlZXBpbmcgYXJlYS4gW3doYXRldmVyIHdlIGFsbG9jYXRlIGluIHJ1bigpLAotCSAqIHNob3VsZCBiZSBmcmVlZCBpbiBzdG9wKCldCi0JICovCiAJY29uZiA9IGt6YWxsb2Moc2l6ZW9mKGNvbmZfdCksIEdGUF9LRVJORUwpOwotCW1kZGV2LT5wcml2YXRlID0gY29uZjsKIAlpZiAoIWNvbmYpCi0JCWdvdG8gb3V0X25vX21lbTsKKwkJZ290byBhYm9ydDsKIAogCWNvbmYtPm1pcnJvcnMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWlycm9yX2luZm8pKm1kZGV2LT5yYWlkX2Rpc2tzLAogCQkJCSBHRlBfS0VSTkVMKTsKIAlpZiAoIWNvbmYtPm1pcnJvcnMpCi0JCWdvdG8gb3V0X25vX21lbTsKKwkJZ290byBhYm9ydDsKIAogCWNvbmYtPnRtcHBhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOwogCWlmICghY29uZi0+dG1wcGFnZSkKLQkJZ290byBvdXRfbm9fbWVtOworCQlnb3RvIGFib3J0OwogCi0JY29uZi0+cG9vbGluZm8gPSBrbWFsbG9jKHNpemVvZigqY29uZi0+cG9vbGluZm8pLCBHRlBfS0VSTkVMKTsKKwljb25mLT5wb29saW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCpjb25mLT5wb29saW5mbyksIEdGUF9LRVJORUwpOwogCWlmICghY29uZi0+cG9vbGluZm8pCi0JCWdvdG8gb3V0X25vX21lbTsKLQljb25mLT5wb29saW5mby0+bWRkZXYgPSBOVUxMOworCQlnb3RvIGFib3J0OwogCWNvbmYtPnBvb2xpbmZvLT5yYWlkX2Rpc2tzID0gbWRkZXYtPnJhaWRfZGlza3M7CiAJY29uZi0+cjFiaW9fcG9vbCA9IG1lbXBvb2xfY3JlYXRlKE5SX1JBSUQxX0JJT1MsIHIxYmlvX3Bvb2xfYWxsb2MsCiAJCQkJCSAgcjFiaW9fcG9vbF9mcmVlLAogCQkJCQkgIGNvbmYtPnBvb2xpbmZvKTsKIAlpZiAoIWNvbmYtPnIxYmlvX3Bvb2wpCi0JCWdvdG8gb3V0X25vX21lbTsKKwkJZ290byBhYm9ydDsKKwogCWNvbmYtPnBvb2xpbmZvLT5tZGRldiA9IG1kZGV2OwogCiAJc3Bpbl9sb2NrX2luaXQoJmNvbmYtPmRldmljZV9sb2NrKTsKLQltZGRldi0+cXVldWUtPnF1ZXVlX2xvY2sgPSAmY29uZi0+ZGV2aWNlX2xvY2s7Ci0KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KSB7Ci0JCWRpc2tfaWR4ID0gcmRldi0+cmFpZF9kaXNrOworCQlpbnQgZGlza19pZHggPSByZGV2LT5yYWlkX2Rpc2s7CiAJCWlmIChkaXNrX2lkeCA+PSBtZGRldi0+cmFpZF9kaXNrcwogCQkgICAgfHwgZGlza19pZHggPCAwKQogCQkJY29udGludWU7CiAJCWRpc2sgPSBjb25mLT5taXJyb3JzICsgZGlza19pZHg7CiAKIAkJZGlzay0+cmRldiA9IHJkZXY7Ci0JCWRpc2tfc3RhY2tfbGltaXRzKG1kZGV2LT5nZW5kaXNrLCByZGV2LT5iZGV2LAotCQkJCSAgcmRldi0+ZGF0YV9vZmZzZXQgPDwgOSk7Ci0JCS8qIGFzIHdlIGRvbid0IGhvbm91ciBtZXJnZV9idmVjX2ZuLCB3ZSBtdXN0IG5ldmVyIHJpc2sKLQkJICogdmlvbGF0aW5nIGl0LCBzbyBsaW1pdCAtPm1heF9zZWN0b3IgdG8gb25lIFBBR0UsIGFzCi0JCSAqIGEgb25lIHBhZ2UgcmVxdWVzdCBpcyBuZXZlciBpbiB2aW9sYXRpb24uCi0JCSAqLwotCQlpZiAocmRldi0+YmRldi0+YmRfZGlzay0+cXVldWUtPm1lcmdlX2J2ZWNfZm4gJiYKLQkJICAgIHF1ZXVlX21heF9zZWN0b3JzKG1kZGV2LT5xdWV1ZSkgPiAoUEFHRV9TSVpFPj45KSkKLQkJCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyhtZGRldi0+cXVldWUsIFBBR0VfU0laRT4+OSk7CiAKIAkJZGlzay0+aGVhZF9wb3NpdGlvbiA9IDA7CiAJfQpAQCAtMjAyMiw4ICsyMDE3LDcgQEAKIAliaW9fbGlzdF9pbml0KCZjb25mLT5wZW5kaW5nX2Jpb19saXN0KTsKIAliaW9fbGlzdF9pbml0KCZjb25mLT5mbHVzaGluZ19iaW9fbGlzdCk7CiAKLQotCW1kZGV2LT5kZWdyYWRlZCA9IDA7CisJY29uZi0+bGFzdF91c2VkID0gLTE7CiAJZm9yIChpID0gMDsgaSA8IGNvbmYtPnJhaWRfZGlza3M7IGkrKykgewogCiAJCWRpc2sgPSBjb25mLT5taXJyb3JzICsgaTsKQEAgLTIwMzEsMzggKzIwMjUsOTcgQEAKIAkJaWYgKCFkaXNrLT5yZGV2IHx8CiAJCSAgICAhdGVzdF9iaXQoSW5fc3luYywgJmRpc2stPnJkZXYtPmZsYWdzKSkgewogCQkJZGlzay0+aGVhZF9wb3NpdGlvbiA9IDA7Ci0JCQltZGRldi0+ZGVncmFkZWQrKzsKIAkJCWlmIChkaXNrLT5yZGV2KQogCQkJCWNvbmYtPmZ1bGxzeW5jID0gMTsKLQkJfQorCQl9IGVsc2UgaWYgKGNvbmYtPmxhc3RfdXNlZCA8IDApCisJCQkvKgorCQkJICogVGhlIGZpcnN0IHdvcmtpbmcgZGV2aWNlIGlzIHVzZWQgYXMgYQorCQkJICogc3RhcnRpbmcgcG9pbnQgdG8gcmVhZCBiYWxhbmNpbmcuCisJCQkgKi8KKwkJCWNvbmYtPmxhc3RfdXNlZCA9IGk7CiAJfQotCWlmIChtZGRldi0+ZGVncmFkZWQgPT0gY29uZi0+cmFpZF9kaXNrcykgeworCisJZXJyID0gLUVJTzsKKwlpZiAoY29uZi0+bGFzdF91c2VkIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgInJhaWQxOiBubyBvcGVyYXRpb25hbCBtaXJyb3JzIGZvciAlc1xuIiwKLQkJCW1kbmFtZShtZGRldikpOwotCQlnb3RvIG91dF9mcmVlX2NvbmY7CisJCSAgICAgICBtZG5hbWUobWRkZXYpKTsKKwkJZ290byBhYm9ydDsKIAl9Ci0JaWYgKGNvbmYtPnJhaWRfZGlza3MgLSBtZGRldi0+ZGVncmFkZWQgPT0gMSkKLQkJbWRkZXYtPnJlY292ZXJ5X2NwID0gTWF4U2VjdG9yOwotCi0JLyoKLQkgKiBmaW5kIHRoZSBmaXJzdCB3b3JraW5nIG9uZSBhbmQgdXNlIGl0IGFzIGEgc3RhcnRpbmcgcG9pbnQKLQkgKiB0byByZWFkIGJhbGFuY2luZy4KLQkgKi8KLQlmb3IgKGogPSAwOyBqIDwgY29uZi0+cmFpZF9kaXNrcyAmJgotCQkgICAgICghY29uZi0+bWlycm9yc1tqXS5yZGV2IHx8Ci0JCSAgICAgICF0ZXN0X2JpdChJbl9zeW5jLCAmY29uZi0+bWlycm9yc1tqXS5yZGV2LT5mbGFncykpIDsgaisrKQotCQkvKiBub3RoaW5nICovOwotCWNvbmYtPmxhc3RfdXNlZCA9IGo7Ci0KLQotCW1kZGV2LT50aHJlYWQgPSBtZF9yZWdpc3Rlcl90aHJlYWQocmFpZDFkLCBtZGRldiwgTlVMTCk7Ci0JaWYgKCFtZGRldi0+dGhyZWFkKSB7CisJZXJyID0gLUVOT01FTTsKKwljb25mLT50aHJlYWQgPSBtZF9yZWdpc3Rlcl90aHJlYWQocmFpZDFkLCBtZGRldiwgTlVMTCk7CisJaWYgKCFjb25mLT50aHJlYWQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCiAJCSAgICAgICAicmFpZDE6IGNvdWxkbid0IGFsbG9jYXRlIHRocmVhZCBmb3IgJXNcbiIsCiAJCSAgICAgICBtZG5hbWUobWRkZXYpKTsKLQkJZ290byBvdXRfZnJlZV9jb25mOworCQlnb3RvIGFib3J0OwogCX0KIAorCXJldHVybiBjb25mOworCisgYWJvcnQ6CisJaWYgKGNvbmYpIHsKKwkJaWYgKGNvbmYtPnIxYmlvX3Bvb2wpCisJCQltZW1wb29sX2Rlc3Ryb3koY29uZi0+cjFiaW9fcG9vbCk7CisJCWtmcmVlKGNvbmYtPm1pcnJvcnMpOworCQlzYWZlX3B1dF9wYWdlKGNvbmYtPnRtcHBhZ2UpOworCQlrZnJlZShjb25mLT5wb29saW5mbyk7CisJCWtmcmVlKGNvbmYpOworCX0KKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCitzdGF0aWMgaW50IHJ1bihtZGRldl90ICptZGRldikKK3sKKwljb25mX3QgKmNvbmY7CisJaW50IGk7CisJbWRrX3JkZXZfdCAqcmRldjsKKworCWlmIChtZGRldi0+bGV2ZWwgIT0gMSkgeworCQlwcmludGsoInJhaWQxOiAlczogcmFpZCBsZXZlbCBub3Qgc2V0IHRvIG1pcnJvcmluZyAoJWQpXG4iLAorCQkgICAgICAgbWRuYW1lKG1kZGV2KSwgbWRkZXYtPmxldmVsKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmIChtZGRldi0+cmVzaGFwZV9wb3NpdGlvbiAhPSBNYXhTZWN0b3IpIHsKKwkJcHJpbnRrKCJyYWlkMTogJXM6IHJlc2hhcGVfcG9zaXRpb24gc2V0IGJ1dCBub3Qgc3VwcG9ydGVkXG4iLAorCQkgICAgICAgbWRuYW1lKG1kZGV2KSk7CisJCXJldHVybiAtRUlPOworCX0KKwkvKgorCSAqIGNvcHkgdGhlIGFscmVhZHkgdmVyaWZpZWQgZGV2aWNlcyBpbnRvIG91ciBwcml2YXRlIFJBSUQxCisJICogYm9va2tlZXBpbmcgYXJlYS4gW3doYXRldmVyIHdlIGFsbG9jYXRlIGluIHJ1bigpLAorCSAqIHNob3VsZCBiZSBmcmVlZCBpbiBzdG9wKCldCisJICovCisJaWYgKG1kZGV2LT5wcml2YXRlID09IE5VTEwpCisJCWNvbmYgPSBzZXR1cF9jb25mKG1kZGV2KTsKKwllbHNlCisJCWNvbmYgPSBtZGRldi0+cHJpdmF0ZTsKKworCWlmIChJU19FUlIoY29uZikpCisJCXJldHVybiBQVFJfRVJSKGNvbmYpOworCisJbWRkZXYtPnF1ZXVlLT5xdWV1ZV9sb2NrID0gJmNvbmYtPmRldmljZV9sb2NrOworCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpIHsKKwkJZGlza19zdGFja19saW1pdHMobWRkZXYtPmdlbmRpc2ssIHJkZXYtPmJkZXYsCisJCQkJICByZGV2LT5kYXRhX29mZnNldCA8PCA5KTsKKwkJLyogYXMgd2UgZG9uJ3QgaG9ub3VyIG1lcmdlX2J2ZWNfZm4sIHdlIG11c3QgbmV2ZXIgcmlzaworCQkgKiB2aW9sYXRpbmcgaXQsIHNvIGxpbWl0IC0+bWF4X3NlY3RvciB0byBvbmUgUEFHRSwgYXMKKwkJICogYSBvbmUgcGFnZSByZXF1ZXN0IGlzIG5ldmVyIGluIHZpb2xhdGlvbi4KKwkJICovCisJCWlmIChyZGV2LT5iZGV2LT5iZF9kaXNrLT5xdWV1ZS0+bWVyZ2VfYnZlY19mbiAmJgorCQkgICAgcXVldWVfbWF4X3NlY3RvcnMobWRkZXYtPnF1ZXVlKSA+IChQQUdFX1NJWkU+PjkpKQorCQkJYmxrX3F1ZXVlX21heF9zZWN0b3JzKG1kZGV2LT5xdWV1ZSwgUEFHRV9TSVpFPj45KTsKKwl9CisKKwltZGRldi0+ZGVncmFkZWQgPSAwOworCWZvciAoaT0wOyBpIDwgY29uZi0+cmFpZF9kaXNrczsgaSsrKQorCQlpZiAoY29uZi0+bWlycm9yc1tpXS5yZGV2ID09IE5VTEwgfHwKKwkJICAgICF0ZXN0X2JpdChJbl9zeW5jLCAmY29uZi0+bWlycm9yc1tpXS5yZGV2LT5mbGFncykgfHwKKwkJICAgIHRlc3RfYml0KEZhdWx0eSwgJmNvbmYtPm1pcnJvcnNbaV0ucmRldi0+ZmxhZ3MpKQorCQkJbWRkZXYtPmRlZ3JhZGVkKys7CisKKwlpZiAoY29uZi0+cmFpZF9kaXNrcyAtIG1kZGV2LT5kZWdyYWRlZCA9PSAxKQorCQltZGRldi0+cmVjb3ZlcnlfY3AgPSBNYXhTZWN0b3I7CisKIAlpZiAobWRkZXYtPnJlY292ZXJ5X2NwICE9IE1heFNlY3RvcikKIAkJcHJpbnRrKEtFUk5fTk9USUNFICJyYWlkMTogJXMgaXMgbm90IGNsZWFuIgogCQkgICAgICAgIiAtLSBzdGFydGluZyBiYWNrZ3JvdW5kIHJlY29uc3RydWN0aW9uXG4iLApAQCAtMjA3MSw5ICsyMTI0LDE0IEBACiAJCSJyYWlkMTogcmFpZCBzZXQgJXMgYWN0aXZlIHdpdGggJWQgb3V0IG9mICVkIG1pcnJvcnNcbiIsCiAJCW1kbmFtZShtZGRldiksIG1kZGV2LT5yYWlkX2Rpc2tzIC0gbWRkZXYtPmRlZ3JhZGVkLCAKIAkJbWRkZXYtPnJhaWRfZGlza3MpOworCiAJLyoKIAkgKiBPaywgZXZlcnl0aGluZyBpcyBqdXN0IGZpbmUgbm93CiAJICovCisJbWRkZXYtPnRocmVhZCA9IGNvbmYtPnRocmVhZDsKKwljb25mLT50aHJlYWQgPSBOVUxMOworCW1kZGV2LT5wcml2YXRlID0gY29uZjsKKwogCW1kX3NldF9hcnJheV9zZWN0b3JzKG1kZGV2LCByYWlkMV9zaXplKG1kZGV2LCAwLCAwKSk7CiAKIAltZGRldi0+cXVldWUtPnVucGx1Z19mbiA9IHJhaWQxX3VucGx1ZzsKQEAgLTIwODEsMjMgKzIxMzksNiBAQAogCW1kZGV2LT5xdWV1ZS0+YmFja2luZ19kZXZfaW5mby5jb25nZXN0ZWRfZGF0YSA9IG1kZGV2OwogCW1kX2ludGVncml0eV9yZWdpc3RlcihtZGRldik7CiAJcmV0dXJuIDA7Ci0KLW91dF9ub19tZW06Ci0JcHJpbnRrKEtFUk5fRVJSICJyYWlkMTogY291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciAlc1xuIiwKLQkgICAgICAgbWRuYW1lKG1kZGV2KSk7Ci0KLW91dF9mcmVlX2NvbmY6Ci0JaWYgKGNvbmYpIHsKLQkJaWYgKGNvbmYtPnIxYmlvX3Bvb2wpCi0JCQltZW1wb29sX2Rlc3Ryb3koY29uZi0+cjFiaW9fcG9vbCk7Ci0JCWtmcmVlKGNvbmYtPm1pcnJvcnMpOwotCQlzYWZlX3B1dF9wYWdlKGNvbmYtPnRtcHBhZ2UpOwotCQlrZnJlZShjb25mLT5wb29saW5mbyk7Ci0JCWtmcmVlKGNvbmYpOwotCQltZGRldi0+cHJpdmF0ZSA9IE5VTEw7Ci0JfQotb3V0OgotCXJldHVybiAtRUlPOwogfQogCiBzdGF0aWMgaW50IHN0b3AobWRkZXZfdCAqbWRkZXYpCkBAIC0yMjcxLDYgKzIzMTIsOSBAQAogCWNvbmZfdCAqY29uZiA9IG1kZGV2LT5wcml2YXRlOwogCiAJc3dpdGNoKHN0YXRlKSB7CisJY2FzZSAyOiAvKiB3YWtlIGZvciBzdXNwZW5kICovCisJCXdha2VfdXAoJmNvbmYtPndhaXRfYmFycmllcik7CisJCWJyZWFrOwogCWNhc2UgMToKIAkJcmFpc2VfYmFycmllcihjb25mKTsKIAkJYnJlYWs7CkBAIC0yMjgwLDYgKzIzMjQsMjMgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkICpyYWlkMV90YWtlb3ZlcihtZGRldl90ICptZGRldikKK3sKKwkvKiByYWlkMSBjYW4gdGFrZSBvdmVyOgorCSAqICByYWlkNSB3aXRoIDIgZGV2aWNlcywgYW55IGxheW91dCBvciBjaHVuayBzaXplCisJICovCisJaWYgKG1kZGV2LT5sZXZlbCA9PSA1ICYmIG1kZGV2LT5yYWlkX2Rpc2tzID09IDIpIHsKKwkJY29uZl90ICpjb25mOworCQltZGRldi0+bmV3X2xldmVsID0gMTsKKwkJbWRkZXYtPm5ld19sYXlvdXQgPSAwOworCQltZGRldi0+bmV3X2NodW5rX3NlY3RvcnMgPSAwOworCQljb25mID0gc2V0dXBfY29uZihtZGRldik7CisJCWlmICghSVNfRVJSKGNvbmYpKQorCQkJY29uZi0+YmFycmllciA9IDE7CisJCXJldHVybiBjb25mOworCX0KKwlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKK30KIAogc3RhdGljIHN0cnVjdCBtZGtfcGVyc29uYWxpdHkgcmFpZDFfcGVyc29uYWxpdHkgPQogewpAQCAtMjI5OSw2ICsyMzYwLDcgQEAKIAkuc2l6ZQkJPSByYWlkMV9zaXplLAogCS5jaGVja19yZXNoYXBlCT0gcmFpZDFfcmVzaGFwZSwKIAkucXVpZXNjZQk9IHJhaWQxX3F1aWVzY2UsCisJLnRha2VvdmVyCT0gcmFpZDFfdGFrZW92ZXIsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCByYWlkX2luaXQodm9pZCkKQEAgLTIzMTQsNiArMjM3Niw3IEBACiBtb2R1bGVfaW5pdChyYWlkX2luaXQpOwogbW9kdWxlX2V4aXQocmFpZF9leGl0KTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUkFJRDEgKG1pcnJvcmluZykgcGVyc29uYWxpdHkgZm9yIE1EIik7CiBNT0RVTEVfQUxJQVMoIm1kLXBlcnNvbmFsaXR5LTMiKTsgLyogUkFJRDEgKi8KIE1PRFVMRV9BTElBUygibWQtcmFpZDEiKTsKIE1PRFVMRV9BTElBUygibWQtbGV2ZWwtMSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkMS5oIGIvZHJpdmVycy9tZC9yYWlkMS5oCmluZGV4IGU4N2I4NGQuLjVmMmQ0NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDEuaAorKysgYi9kcml2ZXJzL21kL3JhaWQxLmgKQEAgLTU5LDYgKzU5LDExIEBACiAKIAltZW1wb29sX3QgKnIxYmlvX3Bvb2w7CiAJbWVtcG9vbF90ICpyMWJ1Zl9wb29sOworCisJLyogV2hlbiB0YWtpbmcgb3ZlciBhbiBhcnJheSBmcm9tIGEgZGlmZmVyZW50IHBlcnNvbmFsaXR5LCB3ZSBzdG9yZQorCSAqIHRoZSBuZXcgdGhyZWFkIGhlcmUgdW50aWwgd2UgZnVsbHkgYWN0aXZhdGUgdGhlIGFycmF5LgorCSAqLworCXN0cnVjdCBtZGtfdGhyZWFkX3MJKnRocmVhZDsKIH07CiAKIHR5cGVkZWYgc3RydWN0IHIxX3ByaXZhdGVfZGF0YV9zIGNvbmZfdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDEwLmMgYi9kcml2ZXJzL21kL3JhaWQxMC5jCmluZGV4IGMyY2I3YjguLmQxMTliN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDEwLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkMTAuYwpAQCAtODA0LDcgKzgwNCw3IEBACiAJbWRrX3JkZXZfdCAqYmxvY2tlZF9yZGV2OwogCiAJaWYgKHVubGlrZWx5KGJpb19yd19mbGFnZ2VkKGJpbywgQklPX1JXX0JBUlJJRVIpKSkgewotCQliaW9fZW5kaW8oYmlvLCAtRU9QTk9UU1VQUCk7CisJCW1kX2JhcnJpZXJfcmVxdWVzdChtZGRldiwgYmlvKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xNDMyLDYgKzE0MzIsNDMgQEAKIAogCiAvKgorICogVXNlZCBieSBmaXhfcmVhZF9lcnJvcigpIHRvIGRlY2F5IHRoZSBwZXIgcmRldiByZWFkX2Vycm9ycy4KKyAqIFdlIGhhbHZlIHRoZSByZWFkIGVycm9yIGNvdW50IGZvciBldmVyeSBob3VyIHRoYXQgaGFzIGVsYXBzZWQKKyAqIHNpbmNlIHRoZSBsYXN0IHJlY29yZGVkIHJlYWQgZXJyb3IuCisgKgorICovCitzdGF0aWMgdm9pZCBjaGVja19kZWNheV9yZWFkX2Vycm9ycyhtZGRldl90ICptZGRldiwgbWRrX3JkZXZfdCAqcmRldikKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgY3VyX3RpbWVfbW9uOworCXVuc2lnbmVkIGxvbmcgaG91cnNfc2luY2VfbGFzdDsKKwl1bnNpZ25lZCBpbnQgcmVhZF9lcnJvcnMgPSBhdG9taWNfcmVhZCgmcmRldi0+cmVhZF9lcnJvcnMpOworCisJa3RpbWVfZ2V0X3RzKCZjdXJfdGltZV9tb24pOworCisJaWYgKHJkZXYtPmxhc3RfcmVhZF9lcnJvci50dl9zZWMgPT0gMCAmJgorCSAgICByZGV2LT5sYXN0X3JlYWRfZXJyb3IudHZfbnNlYyA9PSAwKSB7CisJCS8qIGZpcnN0IHRpbWUgd2UndmUgc2VlbiBhIHJlYWQgZXJyb3IgKi8KKwkJcmRldi0+bGFzdF9yZWFkX2Vycm9yID0gY3VyX3RpbWVfbW9uOworCQlyZXR1cm47CisJfQorCisJaG91cnNfc2luY2VfbGFzdCA9IChjdXJfdGltZV9tb24udHZfc2VjIC0KKwkJCSAgICByZGV2LT5sYXN0X3JlYWRfZXJyb3IudHZfc2VjKSAvIDM2MDA7CisKKwlyZGV2LT5sYXN0X3JlYWRfZXJyb3IgPSBjdXJfdGltZV9tb247CisKKwkvKgorCSAqIGlmIGhvdXJzX3NpbmNlX2xhc3QgaXMgPiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gcmVhZF9lcnJvcnMKKwkgKiBqdXN0IHNldCByZWFkIGVycm9ycyB0byAwLiBXZSBkbyB0aGlzIHRvIGF2b2lkCisJICogb3ZlcmZsb3dpbmcgdGhlIHNoaWZ0IG9mIHJlYWRfZXJyb3JzIGJ5IGhvdXJzX3NpbmNlX2xhc3QuCisJICovCisJaWYgKGhvdXJzX3NpbmNlX2xhc3QgPj0gOCAqIHNpemVvZihyZWFkX2Vycm9ycykpCisJCWF0b21pY19zZXQoJnJkZXYtPnJlYWRfZXJyb3JzLCAwKTsKKwllbHNlCisJCWF0b21pY19zZXQoJnJkZXYtPnJlYWRfZXJyb3JzLCByZWFkX2Vycm9ycyA+PiBob3Vyc19zaW5jZV9sYXN0KTsKK30KKworLyoKICAqIFRoaXMgaXMgYSBrZXJuZWwgdGhyZWFkIHdoaWNoOgogICoKICAqCTEuCVJldHJpZXMgZmFpbGVkIHJlYWQgb3BlcmF0aW9ucyBvbiB3b3JraW5nIG1pcnJvcnMuCkBAIC0xNDQ0LDYgKzE0ODEsNDMgQEAKIAlpbnQgc2VjdCA9IDA7IC8qIE9mZnNldCBmcm9tIHIxMF9iaW8tPnNlY3RvciAqLwogCWludCBzZWN0b3JzID0gcjEwX2Jpby0+c2VjdG9yczsKIAltZGtfcmRldl90KnJkZXY7CisJaW50IG1heF9yZWFkX2Vycm9ycyA9IGF0b21pY19yZWFkKCZtZGRldi0+bWF4X2NvcnJfcmVhZF9lcnJvcnMpOworCisJcmN1X3JlYWRfbG9jaygpOworCXsKKwkJaW50IGQgPSByMTBfYmlvLT5kZXZzW3IxMF9iaW8tPnJlYWRfc2xvdF0uZGV2bnVtOworCQljaGFyIGJbQkRFVk5BTUVfU0laRV07CisJCWludCBjdXJfcmVhZF9lcnJvcl9jb3VudCA9IDA7CisKKwkJcmRldiA9IHJjdV9kZXJlZmVyZW5jZShjb25mLT5taXJyb3JzW2RdLnJkZXYpOworCQliZGV2bmFtZShyZGV2LT5iZGV2LCBiKTsKKworCQlpZiAodGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpKSB7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCS8qIGRyaXZlIGhhcyBhbHJlYWR5IGJlZW4gZmFpbGVkLCBqdXN0IGlnbm9yZSBhbnkKKwkJCSAgIG1vcmUgZml4X3JlYWRfZXJyb3IoKSBhdHRlbXB0cyAqLworCQkJcmV0dXJuOworCQl9CisKKwkJY2hlY2tfZGVjYXlfcmVhZF9lcnJvcnMobWRkZXYsIHJkZXYpOworCQlhdG9taWNfaW5jKCZyZGV2LT5yZWFkX2Vycm9ycyk7CisJCWN1cl9yZWFkX2Vycm9yX2NvdW50ID0gYXRvbWljX3JlYWQoJnJkZXYtPnJlYWRfZXJyb3JzKTsKKwkJaWYgKGN1cl9yZWFkX2Vycm9yX2NvdW50ID4gbWF4X3JlYWRfZXJyb3JzKSB7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCXByaW50ayhLRVJOX05PVElDRQorCQkJICAgICAgICJyYWlkMTA6ICVzOiBSYWlkIGRldmljZSBleGNlZWRlZCAiCisJCQkgICAgICAgInJlYWRfZXJyb3IgdGhyZXNob2xkICIKKwkJCSAgICAgICAiW2N1ciAlZDptYXggJWRdXG4iLAorCQkJICAgICAgIGIsIGN1cl9yZWFkX2Vycm9yX2NvdW50LCBtYXhfcmVhZF9lcnJvcnMpOworCQkJcHJpbnRrKEtFUk5fTk9USUNFCisJCQkgICAgICAgInJhaWQxMDogJXM6IEZhaWxpbmcgcmFpZCAiCisJCQkgICAgICAgImRldmljZVxuIiwgYik7CisJCQltZF9lcnJvcihtZGRldiwgY29uZi0+bWlycm9yc1tkXS5yZGV2KTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKwogCXdoaWxlKHNlY3RvcnMpIHsKIAkJaW50IHMgPSBzZWN0b3JzOwogCQlpbnQgc2wgPSByMTBfYmlvLT5yZWFkX3Nsb3Q7CkBAIC0xNDg4LDYgKzE1NjIsNyBAQAogCQkvKiB3cml0ZSBpdCBiYWNrIGFuZCByZS1yZWFkICovCiAJCXJjdV9yZWFkX2xvY2soKTsKIAkJd2hpbGUgKHNsICE9IHIxMF9iaW8tPnJlYWRfc2xvdCkgeworCQkJY2hhciBiW0JERVZOQU1FX1NJWkVdOwogCQkJaW50IGQ7CiAJCQlpZiAoc2w9PTApCiAJCQkJc2wgPSBjb25mLT5jb3BpZXM7CkBAIC0xNTAzLDkgKzE1NzgsMjEgQEAKIAkJCQkJCSByMTBfYmlvLT5kZXZzW3NsXS5hZGRyICsKIAkJCQkJCSBzZWN0ICsgcmRldi0+ZGF0YV9vZmZzZXQsCiAJCQkJCQkgczw8OSwgY29uZi0+dG1wcGFnZSwgV1JJVEUpCi0JCQkJICAgID09IDApCisJCQkJICAgID09IDApIHsKIAkJCQkJLyogV2VsbCwgdGhpcyBkZXZpY2UgaXMgZGVhZCAqLworCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UKKwkJCQkJICAgICAgICJyYWlkMTA6JXM6IHJlYWQgY29ycmVjdGlvbiAiCisJCQkJCSAgICAgICAid3JpdGUgZmFpbGVkIgorCQkJCQkgICAgICAgIiAoJWQgc2VjdG9ycyBhdCAlbGx1IG9uICVzKVxuIiwKKwkJCQkJICAgICAgIG1kbmFtZShtZGRldiksIHMsCisJCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKShzZWN0KworCQkJCQkgICAgICAgcmRldi0+ZGF0YV9vZmZzZXQpLAorCQkJCQkgICAgICAgYmRldm5hbWUocmRldi0+YmRldiwgYikpOworCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgInJhaWQxMDolczogZmFpbGluZyAiCisJCQkJCSAgICAgICAiZHJpdmVcbiIsCisJCQkJCSAgICAgICBiZGV2bmFtZShyZGV2LT5iZGV2LCBiKSk7CiAJCQkJCW1kX2Vycm9yKG1kZGV2LCByZGV2KTsKKwkJCQl9CiAJCQkJcmRldl9kZWNfcGVuZGluZyhyZGV2LCBtZGRldik7CiAJCQkJcmN1X3JlYWRfbG9jaygpOwogCQkJfQpAQCAtMTUyNiwxMCArMTYxMywyMiBAQAogCQkJCWlmIChzeW5jX3BhZ2VfaW8ocmRldi0+YmRldiwKIAkJCQkJCSByMTBfYmlvLT5kZXZzW3NsXS5hZGRyICsKIAkJCQkJCSBzZWN0ICsgcmRldi0+ZGF0YV9vZmZzZXQsCi0JCQkJCQkgczw8OSwgY29uZi0+dG1wcGFnZSwgUkVBRCkgPT0gMCkKKwkJCQkJCSBzPDw5LCBjb25mLT50bXBwYWdlLAorCQkJCQkJIFJFQUQpID09IDApIHsKIAkJCQkJLyogV2VsbCwgdGhpcyBkZXZpY2UgaXMgZGVhZCAqLworCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UKKwkJCQkJICAgICAgICJyYWlkMTA6JXM6IHVuYWJsZSB0byByZWFkIGJhY2sgIgorCQkJCQkgICAgICAgImNvcnJlY3RlZCBzZWN0b3JzIgorCQkJCQkgICAgICAgIiAoJWQgc2VjdG9ycyBhdCAlbGx1IG9uICVzKVxuIiwKKwkJCQkJICAgICAgIG1kbmFtZShtZGRldiksIHMsCisJCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKShzZWN0KworCQkJCQkJICAgIHJkZXYtPmRhdGFfb2Zmc2V0KSwKKwkJCQkJICAgICAgIGJkZXZuYW1lKHJkZXYtPmJkZXYsIGIpKTsKKwkJCQkJcHJpbnRrKEtFUk5fTk9USUNFICJyYWlkMTA6JXM6IGZhaWxpbmcgZHJpdmVcbiIsCisJCQkJCSAgICAgICBiZGV2bmFtZShyZGV2LT5iZGV2LCBiKSk7CisKIAkJCQkJbWRfZXJyb3IobWRkZXYsIHJkZXYpOwotCQkJCWVsc2UKKwkJCQl9IGVsc2UgewogCQkJCQlwcmludGsoS0VSTl9JTkZPCiAJCQkJCSAgICAgICAicmFpZDEwOiVzOiByZWFkIGVycm9yIGNvcnJlY3RlZCIKIAkJCQkJICAgICAgICIgKCVkIHNlY3RvcnMgYXQgJWxsdSBvbiAlcylcbiIsCkBAIC0xNTM3LDYgKzE2MzYsNyBAQAogCQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykoc2VjdCsKIAkJCQkJICAgICAgICAgICAgcmRldi0+ZGF0YV9vZmZzZXQpLAogCQkJCQkgICAgICAgYmRldm5hbWUocmRldi0+YmRldiwgYikpOworCQkJCX0KIAogCQkJCXJkZXZfZGVjX3BlbmRpbmcocmRldiwgbWRkZXYpOwogCQkJCXJjdV9yZWFkX2xvY2soKTsKQEAgLTIyNzUsMTMgKzIzNzUsNiBAQAogCQlsb3dlcl9iYXJyaWVyKGNvbmYpOwogCQlicmVhazsKIAl9Ci0JaWYgKG1kZGV2LT50aHJlYWQpIHsKLQkJaWYgKG1kZGV2LT5iaXRtYXApCi0JCQltZGRldi0+dGhyZWFkLT50aW1lb3V0ID0gbWRkZXYtPmJpdG1hcC0+ZGFlbW9uX3NsZWVwICogSFo7Ci0JCWVsc2UKLQkJCW1kZGV2LT50aHJlYWQtPnRpbWVvdXQgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKLQkJbWRfd2FrZXVwX3RocmVhZChtZGRldi0+dGhyZWFkKTsKLQl9CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbWRrX3BlcnNvbmFsaXR5IHJhaWQxMF9wZXJzb25hbGl0eSA9CkBAIC0yMzE1LDYgKzI0MDgsNyBAQAogbW9kdWxlX2luaXQocmFpZF9pbml0KTsKIG1vZHVsZV9leGl0KHJhaWRfZXhpdCk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJBSUQxMCAoc3RyaXBlZCBtaXJyb3IpIHBlcnNvbmFsaXR5IGZvciBNRCIpOwogTU9EVUxFX0FMSUFTKCJtZC1wZXJzb25hbGl0eS05Iik7IC8qIFJBSUQxMCAqLwogTU9EVUxFX0FMSUFTKCJtZC1yYWlkMTAiKTsKIE1PRFVMRV9BTElBUygibWQtbGV2ZWwtMTAiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDUuYyBiL2RyaXZlcnMvbWQvcmFpZDUuYwppbmRleCBkMjkyMTVkLi5lODQyMDRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQ1LmMKKysrIGIvZHJpdmVycy9tZC9yYWlkNS5jCkBAIC0yOTQ3LDYgKzI5NDcsNyBAQAogCXN0cnVjdCByNWRldiAqZGV2OwogCW1ka19yZGV2X3QgKmJsb2NrZWRfcmRldiA9IE5VTEw7CiAJaW50IHByZXhvcjsKKwlpbnQgZGVjX3ByZXJlYWRfYWN0aXZlID0gMDsKIAogCW1lbXNldCgmcywgMCwgc2l6ZW9mKHMpKTsKIAlwcl9kZWJ1ZygiaGFuZGxpbmcgc3RyaXBlICVsbHUsIHN0YXRlPSUjbHggY250PSVkLCBwZF9pZHg9JWQgY2hlY2s6JWQgIgpAQCAtMzA5NiwxMiArMzA5Nyw4IEBACiAJCQkJCXNldF9iaXQoU1RSSVBFX0lOU1lOQywgJnNoLT5zdGF0ZSk7CiAJCQl9CiAJCX0KLQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTVFJJUEVfUFJFUkVBRF9BQ1RJVkUsICZzaC0+c3RhdGUpKSB7Ci0JCQlhdG9taWNfZGVjKCZjb25mLT5wcmVyZWFkX2FjdGl2ZV9zdHJpcGVzKTsKLQkJCWlmIChhdG9taWNfcmVhZCgmY29uZi0+cHJlcmVhZF9hY3RpdmVfc3RyaXBlcykgPAotCQkJCUlPX1RIUkVTSE9MRCkKLQkJCQltZF93YWtldXBfdGhyZWFkKGNvbmYtPm1kZGV2LT50aHJlYWQpOwotCQl9CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU1RSSVBFX1BSRVJFQURfQUNUSVZFLCAmc2gtPnN0YXRlKSkKKwkJCWRlY19wcmVyZWFkX2FjdGl2ZSA9IDE7CiAJfQogCiAJLyogTm93IHRvIGNvbnNpZGVyIG5ldyB3cml0ZSByZXF1ZXN0cyBhbmQgd2hhdCBlbHNlLCBpZiBhbnl0aGluZwpAQCAtMzIwOCw2ICszMjA1LDE2IEBACiAKIAlvcHNfcnVuX2lvKHNoLCAmcyk7CiAKKwlpZiAoZGVjX3ByZXJlYWRfYWN0aXZlKSB7CisJCS8qIFdlIGRlbGF5IHRoaXMgdW50aWwgYWZ0ZXIgb3BzX3J1bl9pbyBzbyB0aGF0IGlmIG1ha2VfcmVxdWVzdAorCQkgKiBpcyB3YWl0aW5nIG9uIGEgYmFycmllciwgaXQgd29uJ3QgY29udGludWUgdW50aWwgdGhlIHdyaXRlcworCQkgKiBoYXZlIGFjdHVhbGx5IGJlZW4gc3VibWl0dGVkLgorCQkgKi8KKwkJYXRvbWljX2RlYygmY29uZi0+cHJlcmVhZF9hY3RpdmVfc3RyaXBlcyk7CisJCWlmIChhdG9taWNfcmVhZCgmY29uZi0+cHJlcmVhZF9hY3RpdmVfc3RyaXBlcykgPAorCQkgICAgSU9fVEhSRVNIT0xEKQorCQkJbWRfd2FrZXVwX3RocmVhZChjb25mLT5tZGRldi0+dGhyZWFkKTsKKwl9CiAJcmV0dXJuX2lvKHJldHVybl9iaSk7CiB9CiAKQEAgLTMyMjEsNiArMzIyOCw3IEBACiAJc3RydWN0IHI2X3N0YXRlIHI2czsKIAlzdHJ1Y3QgcjVkZXYgKmRldiwgKnBkZXYsICpxZGV2OwogCW1ka19yZGV2X3QgKmJsb2NrZWRfcmRldiA9IE5VTEw7CisJaW50IGRlY19wcmVyZWFkX2FjdGl2ZSA9IDA7CiAKIAlwcl9kZWJ1ZygiaGFuZGxpbmcgc3RyaXBlICVsbHUsIHN0YXRlPSUjbHggY250PSVkLCAiCiAJCSJwZF9pZHg9JWQsIHFkX2lkeD0lZFxuLCBjaGVjazolZCwgcmVjb25zdHJ1Y3Q6JWRcbiIsCkBAIC0zMzU4LDcgKzMzNjYsNiBAQAogCSAqIGNvbXBsZXRlZAogCSAqLwogCWlmIChzaC0+cmVjb25zdHJ1Y3Rfc3RhdGUgPT0gcmVjb25zdHJ1Y3Rfc3RhdGVfZHJhaW5fcmVzdWx0KSB7Ci0JCWludCBxZF9pZHggPSBzaC0+cWRfaWR4OwogCiAJCXNoLT5yZWNvbnN0cnVjdF9zdGF0ZSA9IHJlY29uc3RydWN0X3N0YXRlX2lkbGU7CiAJCS8qIEFsbCB0aGUgJ3dyaXR0ZW4nIGJ1ZmZlcnMgYW5kIHRoZSBwYXJpdHkgYmxvY2tzIGFyZSByZWFkeSB0bwpAQCAtMzM4MCwxMiArMzM4Nyw4IEBACiAJCQkJCXNldF9iaXQoU1RSSVBFX0lOU1lOQywgJnNoLT5zdGF0ZSk7CiAJCQl9CiAJCX0KLQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTVFJJUEVfUFJFUkVBRF9BQ1RJVkUsICZzaC0+c3RhdGUpKSB7Ci0JCQlhdG9taWNfZGVjKCZjb25mLT5wcmVyZWFkX2FjdGl2ZV9zdHJpcGVzKTsKLQkJCWlmIChhdG9taWNfcmVhZCgmY29uZi0+cHJlcmVhZF9hY3RpdmVfc3RyaXBlcykgPAotCQkJCUlPX1RIUkVTSE9MRCkKLQkJCQltZF93YWtldXBfdGhyZWFkKGNvbmYtPm1kZGV2LT50aHJlYWQpOwotCQl9CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU1RSSVBFX1BSRVJFQURfQUNUSVZFLCAmc2gtPnN0YXRlKSkKKwkJCWRlY19wcmVyZWFkX2FjdGl2ZSA9IDE7CiAJfQogCiAJLyogTm93IHRvIGNvbnNpZGVyIG5ldyB3cml0ZSByZXF1ZXN0cyBhbmQgd2hhdCBlbHNlLCBpZiBhbnl0aGluZwpAQCAtMzQ5NCw2ICszNDk3LDE4IEBACiAKIAlvcHNfcnVuX2lvKHNoLCAmcyk7CiAKKworCWlmIChkZWNfcHJlcmVhZF9hY3RpdmUpIHsKKwkJLyogV2UgZGVsYXkgdGhpcyB1bnRpbCBhZnRlciBvcHNfcnVuX2lvIHNvIHRoYXQgaWYgbWFrZV9yZXF1ZXN0CisJCSAqIGlzIHdhaXRpbmcgb24gYSBiYXJyaWVyLCBpdCB3b24ndCBjb250aW51ZSB1bnRpbCB0aGUgd3JpdGVzCisJCSAqIGhhdmUgYWN0dWFsbHkgYmVlbiBzdWJtaXR0ZWQuCisJCSAqLworCQlhdG9taWNfZGVjKCZjb25mLT5wcmVyZWFkX2FjdGl2ZV9zdHJpcGVzKTsKKwkJaWYgKGF0b21pY19yZWFkKCZjb25mLT5wcmVyZWFkX2FjdGl2ZV9zdHJpcGVzKSA8CisJCSAgICBJT19USFJFU0hPTEQpCisJCQltZF93YWtldXBfdGhyZWFkKGNvbmYtPm1kZGV2LT50aHJlYWQpOworCX0KKwogCXJldHVybl9pbyhyZXR1cm5fYmkpOwogfQogCkBAIC0zNzQxLDcgKzM3NTYsNyBAQAogewogCW1kZGV2X3QgKm1kZGV2ID0gcS0+cXVldWVkYXRhOwogCXJhaWQ1X2NvbmZfdCAqY29uZiA9IG1kZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGludCBkZF9pZHg7CisJaW50IGRkX2lkeDsKIAlzdHJ1Y3QgYmlvKiBhbGlnbl9iaTsKIAltZGtfcmRldl90ICpyZGV2OwogCkBAIC0zODY2LDcgKzM4ODEsMTMgQEAKIAlpbnQgY3B1LCByZW1haW5pbmc7CiAKIAlpZiAodW5saWtlbHkoYmlvX3J3X2ZsYWdnZWQoYmksIEJJT19SV19CQVJSSUVSKSkpIHsKLQkJYmlvX2VuZGlvKGJpLCAtRU9QTk9UU1VQUCk7CisJCS8qIERyYWluIGFsbCBwZW5kaW5nIHdyaXRlcy4gIFdlIG9ubHkgcmVhbGx5IG5lZWQKKwkJICogdG8gZW5zdXJlIHRoZXkgaGF2ZSBiZWVuIHN1Ym1pdHRlZCwgYnV0IHRoaXMgaXMKKwkJICogZWFzaWVyLgorCQkgKi8KKwkJbWRkZXYtPnBlcnMtPnF1aWVzY2UobWRkZXYsIDEpOworCQltZGRldi0+cGVycy0+cXVpZXNjZShtZGRldiwgMCk7CisJCW1kX2JhcnJpZXJfcmVxdWVzdChtZGRldiwgYmkpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTM5OTAsNiArNDAxMSw5IEBACiAJCQlmaW5pc2hfd2FpdCgmY29uZi0+d2FpdF9mb3Jfb3ZlcmxhcCwgJncpOwogCQkJc2V0X2JpdChTVFJJUEVfSEFORExFLCAmc2gtPnN0YXRlKTsKIAkJCWNsZWFyX2JpdChTVFJJUEVfREVMQVlFRCwgJnNoLT5zdGF0ZSk7CisJCQlpZiAobWRkZXYtPmJhcnJpZXIgJiYgCisJCQkgICAgIXRlc3RfYW5kX3NldF9iaXQoU1RSSVBFX1BSRVJFQURfQUNUSVZFLCAmc2gtPnN0YXRlKSkKKwkJCQlhdG9taWNfaW5jKCZjb25mLT5wcmVyZWFkX2FjdGl2ZV9zdHJpcGVzKTsKIAkJCXJlbGVhc2Vfc3RyaXBlKHNoKTsKIAkJfSBlbHNlIHsKIAkJCS8qIGNhbm5vdCBnZXQgc3RyaXBlIGZvciByZWFkLWFoZWFkLCBqdXN0IGdpdmUtdXAgKi8KQEAgLTQwMDksNiArNDAzMywxNCBAQAogCiAJCWJpb19lbmRpbyhiaSwgMCk7CiAJfQorCisJaWYgKG1kZGV2LT5iYXJyaWVyKSB7CisJCS8qIFdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIHN0cmlwZXMgdG8gYWxsIGJlIGhhbmRsZWQuCisJCSAqIFNvOiB3YWl0IGZvciBwcmVyZWFkX2FjdGl2ZV9zdHJpcGVzIHRvIGRyb3AgdG8gMC4KKwkJICovCisJCXdhaXRfZXZlbnQobWRkZXYtPnRocmVhZC0+d3F1ZXVlLAorCQkJICAgYXRvbWljX3JlYWQoJmNvbmYtPnByZXJlYWRfYWN0aXZlX3N0cmlwZXMpID09IDApOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNTg2MCw2ICs1ODkyLDcgQEAKIG1vZHVsZV9pbml0KHJhaWQ1X2luaXQpOwogbW9kdWxlX2V4aXQocmFpZDVfZXhpdCk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJBSUQ0LzUvNiAoc3RyaXBpbmcgd2l0aCBwYXJpdHkpIHBlcnNvbmFsaXR5IGZvciBNRCIpOwogTU9EVUxFX0FMSUFTKCJtZC1wZXJzb25hbGl0eS00Iik7IC8qIFJBSUQ1ICovCiBNT0RVTEVfQUxJQVMoIm1kLXJhaWQ1Iik7CiBNT0RVTEVfQUxJQVMoIm1kLXJhaWQ0Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQ2YWxnb3MuYyBiL2RyaXZlcnMvbWQvcmFpZDZhbGdvcy5jCmluZGV4IDg2NjIxNWEuLmJmZmM2MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDZhbGdvcy5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDZhbGdvcy5jCkBAIC0zMSwyNSArMzEsNiBAQAogc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X2NhbGw7CiBFWFBPUlRfU1lNQk9MX0dQTChyYWlkNl9jYWxsKTsKIAotLyogVmFyaW91cyByb3V0aW5lIHNldHMgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcmFpZDZfY2FsbHMgcmFpZDZfaW50eDE7Ci1leHRlcm4gY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X2ludHgyOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCByYWlkNl9jYWxscyByYWlkNl9pbnR4NDsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgcmFpZDZfY2FsbHMgcmFpZDZfaW50eDg7Ci1leHRlcm4gY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X2ludHgxNjsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgcmFpZDZfY2FsbHMgcmFpZDZfaW50eDMyOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCByYWlkNl9jYWxscyByYWlkNl9tbXh4MTsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgcmFpZDZfY2FsbHMgcmFpZDZfbW14eDI7Ci1leHRlcm4gY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X3NzZTF4MTsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgcmFpZDZfY2FsbHMgcmFpZDZfc3NlMXgyOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCByYWlkNl9jYWxscyByYWlkNl9zc2UyeDE7Ci1leHRlcm4gY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X3NzZTJ4MjsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgcmFpZDZfY2FsbHMgcmFpZDZfc3NlMng0OwotZXh0ZXJuIGNvbnN0IHN0cnVjdCByYWlkNl9jYWxscyByYWlkNl9hbHRpdmVjMTsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgcmFpZDZfY2FsbHMgcmFpZDZfYWx0aXZlYzI7Ci1leHRlcm4gY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X2FsdGl2ZWM0OwotZXh0ZXJuIGNvbnN0IHN0cnVjdCByYWlkNl9jYWxscyByYWlkNl9hbHRpdmVjODsKLQogY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzICogY29uc3QgcmFpZDZfYWxnb3NbXSA9IHsKIAkmcmFpZDZfaW50eDEsCiAJJnJhaWQ2X2ludHgyLApAQCAtMTY5LDMgKzE1MCw0IEBACiBzdWJzeXNfaW5pdGNhbGwocmFpZDZfc2VsZWN0X2FsZ28pOwogbW9kdWxlX2V4aXQocmFpZDZfZXhpdCk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJBSUQ2IFEtc3luZHJvbWUgY2FsY3VsYXRpb25zIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC84OHBtODYwNy5jIGIvZHJpdmVycy9tZmQvODhwbTg2MDcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTNmNjU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZmQvODhwbTg2MDcuYwpAQCAtMCwwICsxLDMwMiBAQAorLyoKKyAqIEJhc2UgZHJpdmVyIGZvciBNYXJ2ZWxsIDg4UE04NjA3CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuCisgKiAJSGFvamlhbiBaaHVhbmcgPGhhb2ppYW4uemh1YW5nQG1hcnZlbGwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkLzg4cG04NjA3Lmg+CisKKworI2RlZmluZSBQTTg2MDdfUkVHX1JFU09VUkNFKF9zdGFydCwgX2VuZCkJCVwKK3sJCQkJCQkJXAorCS5zdGFydAk9IFBNODYwN18jI19zdGFydCwJCQlcCisJLmVuZAk9IFBNODYwN18jI19lbmQsCQkJXAorCS5mbGFncwk9IElPUkVTT1VSQ0VfSU8sCQkJXAorfQorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHBtODYwN19yZWd1bGF0b3JfcmVzb3VyY2VzW10gPSB7CisJUE04NjA3X1JFR19SRVNPVVJDRShCVUNLMSwgQlVDSzEpLAorCVBNODYwN19SRUdfUkVTT1VSQ0UoQlVDSzIsIEJVQ0syKSwKKwlQTTg2MDdfUkVHX1JFU09VUkNFKEJVQ0szLCBCVUNLMyksCisJUE04NjA3X1JFR19SRVNPVVJDRShMRE8xLCAgTERPMSksCisJUE04NjA3X1JFR19SRVNPVVJDRShMRE8yLCAgTERPMiksCisJUE04NjA3X1JFR19SRVNPVVJDRShMRE8zLCAgTERPMyksCisJUE04NjA3X1JFR19SRVNPVVJDRShMRE80LCAgTERPNCksCisJUE04NjA3X1JFR19SRVNPVVJDRShMRE81LCAgTERPNSksCisJUE04NjA3X1JFR19SRVNPVVJDRShMRE82LCAgTERPNiksCisJUE04NjA3X1JFR19SRVNPVVJDRShMRE83LCAgTERPNyksCisJUE04NjA3X1JFR19SRVNPVVJDRShMRE84LCAgTERPOCksCisJUE04NjA3X1JFR19SRVNPVVJDRShMRE85LCAgTERPOSksCisJUE04NjA3X1JFR19SRVNPVVJDRShMRE8xMCwgTERPMTApLAorCVBNODYwN19SRUdfUkVTT1VSQ0UoTERPMTIsIExETzEyKSwKKwlQTTg2MDdfUkVHX1JFU09VUkNFKExETzE0LCBMRE8xNCksCit9OworCisjZGVmaW5lIFBNODYwN19SRUdfREVWUyhfbmFtZSwgX2lkKQkJCQkJXAorewkJCQkJCQkJCVwKKwkubmFtZQkJPSAiODhwbTg2MDctIiAjX25hbWUsCQkJCVwKKwkubnVtX3Jlc291cmNlcwk9IDEsCQkJCQkJXAorCS5yZXNvdXJjZXMJPSAmcG04NjA3X3JlZ3VsYXRvcl9yZXNvdXJjZXNbUE04NjA3X0lEXyMjX2lkXSwJXAorfQorCitzdGF0aWMgc3RydWN0IG1mZF9jZWxsIHBtODYwN19kZXZzW10gPSB7CisJUE04NjA3X1JFR19ERVZTKGJ1Y2sxLCBCVUNLMSksCisJUE04NjA3X1JFR19ERVZTKGJ1Y2syLCBCVUNLMiksCisJUE04NjA3X1JFR19ERVZTKGJ1Y2szLCBCVUNLMyksCisJUE04NjA3X1JFR19ERVZTKGxkbzEsICBMRE8xKSwKKwlQTTg2MDdfUkVHX0RFVlMobGRvMiwgIExETzIpLAorCVBNODYwN19SRUdfREVWUyhsZG8zLCAgTERPMyksCisJUE04NjA3X1JFR19ERVZTKGxkbzQsICBMRE80KSwKKwlQTTg2MDdfUkVHX0RFVlMobGRvNSwgIExETzUpLAorCVBNODYwN19SRUdfREVWUyhsZG82LCAgTERPNiksCisJUE04NjA3X1JFR19ERVZTKGxkbzcsICBMRE83KSwKKwlQTTg2MDdfUkVHX0RFVlMobGRvOCwgIExETzgpLAorCVBNODYwN19SRUdfREVWUyhsZG85LCAgTERPOSksCisJUE04NjA3X1JFR19ERVZTKGxkbzEwLCBMRE8xMCksCisJUE04NjA3X1JFR19ERVZTKGxkbzEyLCBMRE8xMiksCisJUE04NjA3X1JFR19ERVZTKGxkbzE0LCBMRE8xNCksCit9OworCitzdGF0aWMgaW5saW5lIGludCBwbTg2MDdfcmVhZF9kZXZpY2Uoc3RydWN0IHBtODYwN19jaGlwICpjaGlwLAorCQkJCSAgICAgaW50IHJlZywgaW50IGJ5dGVzLCB2b2lkICpkZXN0KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICppMmMgPSBjaGlwLT5jbGllbnQ7CisJdW5zaWduZWQgY2hhciBkYXRhOworCWludCByZXQ7CisKKwlkYXRhID0gKHVuc2lnbmVkIGNoYXIpcmVnOworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChpMmMsICZkYXRhLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGkyY19tYXN0ZXJfcmVjdihpMmMsIGRlc3QsIGJ5dGVzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcG04NjA3X3dyaXRlX2RldmljZShzdHJ1Y3QgcG04NjA3X2NoaXAgKmNoaXAsCisJCQkJICAgICAgaW50IHJlZywgaW50IGJ5dGVzLCB2b2lkICpzcmMpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmkyYyA9IGNoaXAtPmNsaWVudDsKKwl1bnNpZ25lZCBjaGFyIGJ1ZltieXRlcyArIDFdOworCWludCByZXQ7CisKKwlidWZbMF0gPSAodW5zaWduZWQgY2hhcilyZWc7CisJbWVtY3B5KCZidWZbMV0sIHNyYywgYnl0ZXMpOworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGkyYywgYnVmLCBieXRlcyArIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldHVybiAwOworfQorCitpbnQgcG04NjA3X3JlZ19yZWFkKHN0cnVjdCBwbTg2MDdfY2hpcCAqY2hpcCwgaW50IHJlZykKK3sKKwl1bnNpZ25lZCBjaGFyIGRhdGE7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNoaXAtPmlvX2xvY2spOworCXJldCA9IGNoaXAtPnJlYWQoY2hpcCwgcmVnLCAxLCAmZGF0YSk7CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5pb19sb2NrKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWVsc2UKKwkJcmV0dXJuIChpbnQpZGF0YTsKK30KK0VYUE9SVF9TWU1CT0wocG04NjA3X3JlZ19yZWFkKTsKKworaW50IHBtODYwN19yZWdfd3JpdGUoc3RydWN0IHBtODYwN19jaGlwICpjaGlwLCBpbnQgcmVnLAorCQkgICAgIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2hpcC0+aW9fbG9jayk7CisJcmV0ID0gY2hpcC0+d3JpdGUoY2hpcCwgcmVnLCAxLCAmZGF0YSk7CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5pb19sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHBtODYwN19yZWdfd3JpdGUpOworCitpbnQgcG04NjA3X2J1bGtfcmVhZChzdHJ1Y3QgcG04NjA3X2NoaXAgKmNoaXAsIGludCByZWcsCisJCSAgICAgaW50IGNvdW50LCB1bnNpZ25lZCBjaGFyICpidWYpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNoaXAtPmlvX2xvY2spOworCXJldCA9IGNoaXAtPnJlYWQoY2hpcCwgcmVnLCBjb3VudCwgYnVmKTsKKwltdXRleF91bmxvY2soJmNoaXAtPmlvX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wocG04NjA3X2J1bGtfcmVhZCk7CisKK2ludCBwbTg2MDdfYnVsa193cml0ZShzdHJ1Y3QgcG04NjA3X2NoaXAgKmNoaXAsIGludCByZWcsCisJCSAgICAgIGludCBjb3VudCwgdW5zaWduZWQgY2hhciAqYnVmKQoreworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjaGlwLT5pb19sb2NrKTsKKwlyZXQgPSBjaGlwLT53cml0ZShjaGlwLCByZWcsIGNvdW50LCBidWYpOworCW11dGV4X3VubG9jaygmY2hpcC0+aW9fbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChwbTg2MDdfYnVsa193cml0ZSk7CisKK2ludCBwbTg2MDdfc2V0X2JpdHMoc3RydWN0IHBtODYwN19jaGlwICpjaGlwLCBpbnQgcmVnLAorCQkgICAgdW5zaWduZWQgY2hhciBtYXNrLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJdW5zaWduZWQgY2hhciB2YWx1ZTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2hpcC0+aW9fbG9jayk7CisJcmV0ID0gY2hpcC0+cmVhZChjaGlwLCByZWcsIDEsICZ2YWx1ZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCXZhbHVlICY9IH5tYXNrOworCXZhbHVlIHw9IGRhdGE7CisJcmV0ID0gY2hpcC0+d3JpdGUoY2hpcCwgcmVnLCAxLCAmdmFsdWUpOworb3V0OgorCW11dGV4X3VubG9jaygmY2hpcC0+aW9fbG9jayk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wocG04NjA3X3NldF9iaXRzKTsKKworCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgcG04NjA3X2lkX3RhYmxlW10gPSB7CisJeyAiODhQTTg2MDciLCAwIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgcG04NjA3X2lkX3RhYmxlKTsKKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwbTg2MDdfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCQkgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgcG04NjA3X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgcG04NjA3X2NoaXAgKmNoaXA7CisJaW50IGksIGNvdW50OworCWludCByZXQ7CisKKwljaGlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBtODYwN19jaGlwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNoaXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljaGlwLT5jbGllbnQgPSBjbGllbnQ7CisJY2hpcC0+ZGV2ID0gJmNsaWVudC0+ZGV2OworCWNoaXAtPnJlYWQgPSBwbTg2MDdfcmVhZF9kZXZpY2U7CisJY2hpcC0+d3JpdGUgPSBwbTg2MDdfd3JpdGVfZGV2aWNlOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGNoaXApOworCisJbXV0ZXhfaW5pdCgmY2hpcC0+aW9fbG9jayk7CisJZGV2X3NldF9kcnZkYXRhKGNoaXAtPmRldiwgY2hpcCk7CisKKwlyZXQgPSBwbTg2MDdfcmVnX3JlYWQoY2hpcCwgUE04NjA3X0NISVBfSUQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY2hpcC0+ZGV2LCAiRmFpbGVkIHRvIHJlYWQgQ0hJUCBJRDogJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoKHJldCAmIENISVBfSURfTUFTSykgPT0gQ0hJUF9JRCkKKwkJZGV2X2luZm8oY2hpcC0+ZGV2LCAiTWFydmVsbCA4OFBNODYwNyAoSUQ6ICUwMngpIGRldGVjdGVkXG4iLAorCQkJIHJldCk7CisJZWxzZSB7CisJCWRldl9lcnIoY2hpcC0+ZGV2LCAiRmFpbGVkIHRvIGRldGVjdCBNYXJ2ZWxsIDg4UE04NjA3LiAiCisJCQkiQ2hpcCBJRDogJTAyeFxuIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCWNoaXAtPmNoaXBfaWQgPSByZXQ7CisKKwlyZXQgPSBwbTg2MDdfcmVnX3JlYWQoY2hpcCwgUE04NjA3X0JVQ0szKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGNoaXAtPmRldiwgIkZhaWxlZCB0byByZWFkIEJVQ0szIHJlZ2lzdGVyOiAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChyZXQgJiBQTTg2MDdfQlVDSzNfRE9VQkxFKQorCQljaGlwLT5idWNrM19kb3VibGUgPSAxOworCisJcmV0ID0gcG04NjA3X3JlZ19yZWFkKGNoaXAsIFBNODYwN19NSVNDMSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihjaGlwLT5kZXYsICJGYWlsZWQgdG8gcmVhZCBNSVNDMSByZWdpc3RlcjogJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAocGRhdGEtPmkyY19wb3J0ID09IFBJMkNfUE9SVCkKKwkJcmV0IHw9IFBNODYwN19NSVNDMV9QSTJDOworCWVsc2UKKwkJcmV0ICY9IH5QTTg2MDdfTUlTQzFfUEkyQzsKKwlyZXQgPSBwbTg2MDdfcmVnX3dyaXRlKGNoaXAsIFBNODYwN19NSVNDMSwgcmV0KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGNoaXAtPmRldiwgIkZhaWxlZCB0byB3cml0ZSBNSVNDMSByZWdpc3RlcjogJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCisJY291bnQgPSBBUlJBWV9TSVpFKHBtODYwN19kZXZzKTsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlyZXQgPSBtZmRfYWRkX2RldmljZXMoY2hpcC0+ZGV2LCBpLCAmcG04NjA3X2RldnNbaV0sCisJCQkJICAgICAgMSwgTlVMTCwgMCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2VycihjaGlwLT5kZXYsICJGYWlsZWQgdG8gYWRkIHN1YmRldnNcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworb3V0OgorCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIE5VTEwpOworCWtmcmVlKGNoaXApOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHBtODYwN19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgcG04NjA3X2NoaXAgKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCW1mZF9yZW1vdmVfZGV2aWNlcyhjaGlwLT5kZXYpOworCWtmcmVlKGNoaXApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgcG04NjA3X2RyaXZlciA9IHsKKwkuZHJpdmVyCT0geworCQkubmFtZQk9ICI4OFBNODYwNyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IHBtODYwN19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHBtODYwN19yZW1vdmUpLAorCS5pZF90YWJsZQk9IHBtODYwN19pZF90YWJsZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBtODYwN19pbml0KHZvaWQpCit7CisJaW50IHJldDsKKwlyZXQgPSBpMmNfYWRkX2RyaXZlcigmcG04NjA3X2RyaXZlcik7CisJaWYgKHJldCAhPSAwKQorCQlwcl9lcnIoIkZhaWxlZCB0byByZWdpc3RlciA4OFBNODYwNyBJMkMgZHJpdmVyOiAlZFxuIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorc3Vic3lzX2luaXRjYWxsKHBtODYwN19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHBtODYwN19leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJnBtODYwN19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQocG04NjA3X2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlBNSUMgRHJpdmVyIGZvciBNYXJ2ZWxsIDg4UE04NjA3Iik7CitNT0RVTEVfQVVUSE9SKCJIYW9qaWFuIFpodWFuZyA8aGFvamlhbi56aHVhbmdAbWFydmVsbC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9LY29uZmlnIGIvZHJpdmVycy9tZmQvS2NvbmZpZwppbmRleCBhMjk2ZTcxLi44NzgyOTc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWZkL0tjb25maWcKQEAgLTEwMywxMCArMTAzLDEwIEBACiAJICBjZWxsIHBob25lcyBhbmQgUERBcy4KIAogY29uZmlnIFRXTDQwMzBfQ09SRQotCWJvb2wgIlRleGFzIEluc3RydW1lbnRzIFRXTDQwMzAvVFBTNjU5eDAgU3VwcG9ydCIKKwlib29sICJUZXhhcyBJbnN0cnVtZW50cyBUV0w0MDMwL1RXTDUwMzAvVFdMNjAzMC9UUFM2NTl4MCBTdXBwb3J0IgogCWRlcGVuZHMgb24gSTJDPXkgJiYgR0VORVJJQ19IQVJESVJRUwogCWhlbHAKLQkgIFNheSB5ZXMgaGVyZSBpZiB5b3UgaGF2ZSBUV0w0MDMwIGZhbWlseSBjaGlwIG9uIHlvdXIgYm9hcmQuCisJICBTYXkgeWVzIGhlcmUgaWYgeW91IGhhdmUgVFdMNDAzMCAvIFRXTDYwMzAgZmFtaWx5IGNoaXAgb24geW91ciBib2FyZC4KIAkgIFRoaXMgY29yZSBkcml2ZXIgcHJvdmlkZXMgcmVnaXN0ZXIgYWNjZXNzIGFuZCBJUlEgaGFuZGxpbmcKIAkgIGZhY2lsaXRpZXMsIGFuZCByZWdpc3RlcnMgZGV2aWNlcyBmb3IgdGhlIHZhcmlvdXMgZnVuY3Rpb25zCiAJICBzbyB0aGF0IGZ1bmN0aW9uLXNwZWNpZmljIGRyaXZlcnMgY2FuIGJpbmQgdG8gdGhlbS4KQEAgLTE3NCw2ICsxNzQsMTYgQEAKIAkgIGluZGl2aWR1YWwgY29tcG9uZW50cyBsaWtlIExDRCBiYWNrbGlnaHQsIHZvbHRhZ2UgcmVndWxhdG9ycywKIAkgIExFRHMgYW5kIGJhdHRlcnktY2hhcmdlciB1bmRlciB0aGUgY29ycmVzcG9uZGluZyBtZW51cy4KIAorY29uZmlnIFBNSUNfQURQNTUyMAorCWJvb2wgIkFuYWxvZyBEZXZpY2VzIEFEUDU1MjAvMDEgTUZEIFBNSUMgQ29yZSBTdXBwb3J0IgorCWRlcGVuZHMgb24gSTJDPXkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYWRkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFENTUyMCBhbmQgQURQNTUwMSwKKwkgIE11bHRpZnVuY3Rpb24gUG93ZXIgTWFuYWdlbWVudCBJQy4gVGhpcyBpbmNsdWRlcworCSAgdGhlIEkyQyBkcml2ZXIgYW5kIHRoZSBjb3JlIEFQSXMgX29ubHlfLCB5b3UgaGF2ZSB0byBzZWxlY3QKKwkgIGluZGl2aWR1YWwgY29tcG9uZW50cyBsaWtlIExDRCBiYWNrbGlnaHQsIExFRHMsIEdQSU9zIGFuZCBLZXBhZAorCSAgdW5kZXIgdGhlIGNvcnJlc3BvbmRpbmcgbWVudXMuCisKIGNvbmZpZyBNRkRfV004NDAwCiAJdHJpc3RhdGUgIlN1cHBvcnQgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODQwMCIKIAlzZWxlY3QgTUZEX0NPUkUKQEAgLTE4NSwxMiArMTk1LDEyIEBACiAJICB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgZGV2aWNlLgogCiBjb25maWcgTUZEX1dNODMxWAotCXRyaXN0YXRlICJTdXBwb3J0IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTgzMXggUE1JQ3MiCisJYm9vbCAiU3VwcG9ydCBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgV004MzF4LzJ4IFBNSUNzIgogCXNlbGVjdCBNRkRfQ09SRQotCWRlcGVuZHMgb24gSTJDCisJZGVwZW5kcyBvbiBJMkM9eQogCWhlbHAKLQkgIFN1cHBvcnQgZm9yIHRoZSBXb2xmc29uIE1pY3JvZWxlY3JvbmljcyBXTTgzMXggUE1JQ3MuICBUaGlzCi0JICBkcml2ZXIgcHJvdmlkZXMgY29tbW9uIHN1cHBvcnQgZm9yIGFjY2Vzc2luZyB0aGUgZGV2aWNlLAorCSAgU3VwcG9ydCBmb3IgdGhlIFdvbGZzb24gTWljcm9lbGVjcm9uaWNzIFdNODMxeCBhbmQgV004MzJ4IFBNSUNzLgorCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgY29tbW9uIHN1cHBvcnQgZm9yIGFjY2Vzc2luZyB0aGUgZGV2aWNlLAogCSAgYWRkaXRpb25hbCBkcml2ZXJzIG11c3QgYmUgZW5hYmxlZCBpbiBvcmRlciB0byB1c2UgdGhlCiAJICBmdW5jdGlvbmFsaXR5IG9mIHRoZSBkZXZpY2UuCiAKQEAgLTMxOSw2ICszMjksMjUgQEAKIAkgIFRoaXMgZW5hYmxlcyB0aGUgUENBUCBBU0lDIHByZXNlbnQgb24gRVpYIFBob25lcy4gVGhpcyBpcwogCSAgbmVlZGVkIGZvciBNTUMsIFRvdWNoU2NyZWVuLCBTb3VuZCwgVVNCLCBldGMuLgogCitjb25maWcgTUZEXzg4UE04NjA3CisJYm9vbCAiU3VwcG9ydCBNYXJ2ZWxsIDg4UE04NjA3IgorCWRlcGVuZHMgb24gSTJDPXkKKwlzZWxlY3QgTUZEX0NPUkUKKwloZWxwCisJICBUaGlzIHN1cHBvcnRzIGZvciBNYXJ2ZWxsIDg4UE04NjA3IFBvd2VyIE1hbmFnZW1lbnQgSUMuIFRoaXMgaW5jbHVkZXMKKwkgIHRoZSBJMkMgZHJpdmVyIGFuZCB0aGUgY29yZSBBUElzIF9vbmx5XywgeW91IGhhdmUgdG8gc2VsZWN0CisJICBpbmRpdmlkdWFsIGNvbXBvbmVudHMgbGlrZSB2b2x0YWdlIHJlZ3VsYXRvcnMsIFJUQyBhbmQKKwkgIGJhdHRlcnktY2hhcmdlciB1bmRlciB0aGUgY29ycmVzcG9uZGluZyBtZW51cy4KKworY29uZmlnIEFCNDUwMF9DT1JFCisJdHJpc3RhdGUgIlNULUVyaWNzc29uJ3MgQUI0NTAwIE1peGVkIFNpZ25hbCBQb3dlciBtYW5hZ2VtZW50IGNoaXAiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTZWxlY3QgdGhpcyBvcHRpb24gdG8gZW5hYmxlIGFjY2VzcyB0byBBQjQ1MDAgcG93ZXIgbWFuYWdlbWVudAorCSAgY2hpcC4gVGhpcyBjb25uZWN0cyB0byBVODUwMCBvbiB0aGUgU1NQL1NQSSBidXMgYW5kIGV4cG9ydHMKKwkgIHJlYWQvd3JpdGUgZnVuY3Rpb25zIGZvciB0aGUgZGV2aWNlcyB0byBnZXQgYWNjZXNzIHRvIHRoaXMgY2hpcC4KKwkgIFRoaXMgY2hpcCBlbWJlZHMgdmFyaW91cyBvdGhlciBtdWx0aW1lZGlhIGZ1bnRpb25hbGl0aWVzIGFzIHdlbGwuCisKIGVuZG1lbnUKIAogbWVudSAiTXVsdGltZWRpYSBDYXBhYmlsaXRpZXMgUG9ydCBkcml2ZXJzIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvTWFrZWZpbGUgYi9kcml2ZXJzL21mZC9NYWtlZmlsZQppbmRleCAxMTM1MGMxLi5jYTJmMmM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21mZC9NYWtlZmlsZQpAQCAtMTksMTMgKzE5LDE0IEBACiB3bTgzMXgtb2JqcwkJCTo9IHdtODMxeC1jb3JlLm8gd204MzF4LWlycS5vIHdtODMxeC1vdHAubwogb2JqLSQoQ09ORklHX01GRF9XTTgzMVgpCSs9IHdtODMxeC5vCiB3bTgzNTAtb2JqcwkJCTo9IHdtODM1MC1jb3JlLm8gd204MzUwLXJlZ21hcC5vIHdtODM1MC1ncGlvLm8KK3dtODM1MC1vYmpzCQkJKz0gd204MzUwLWlycS5vCiBvYmotJChDT05GSUdfTUZEX1dNODM1MCkJKz0gd204MzUwLm8KIG9iai0kKENPTkZJR19NRkRfV004MzUwX0kyQykJKz0gd204MzUwLWkyYy5vCiAKIG9iai0kKENPTkZJR19UUFM2NTAxMCkJCSs9IHRwczY1MDEwLm8KIG9iai0kKENPTkZJR19NRU5FTEFVUykJCSs9IG1lbmVsYXVzLm8KIAotb2JqLSQoQ09ORklHX1RXTDQwMzBfQ09SRSkJKz0gdHdsNDAzMC1jb3JlLm8gdHdsNDAzMC1pcnEubworb2JqLSQoQ09ORklHX1RXTDQwMzBfQ09SRSkJKz0gdHdsLWNvcmUubyB0d2w0MDMwLWlycS5vIHR3bDYwMzAtaXJxLm8KIG9iai0kKENPTkZJR19UV0w0MDMwX1BPV0VSKSAgICArPSB0d2w0MDMwLXBvd2VyLm8KIG9iai0kKENPTkZJR19UV0w0MDMwX0NPREVDKQkrPSB0d2w0MDMwLWNvZGVjLm8KIApAQCAtNTIsMyArNTMsNiBAQAogb2JqLSQoQ09ORklHX1BDRjUwNjMzX0dQSU8pCSs9IHBjZjUwNjMzLWdwaW8ubwogb2JqLSQoQ09ORklHX0FCMzEwMF9DT1JFKQkrPSBhYjMxMDAtY29yZS5vCiBvYmotJChDT05GSUdfQUIzMTAwX09UUCkJKz0gYWIzMTAwLW90cC5vCitvYmotJChDT05GSUdfQUI0NTAwX0NPUkUpCSs9IGFiNDUwMC1jb3JlLm8KK29iai0kKENPTkZJR19NRkRfODhQTTg2MDcpCSs9IDg4cG04NjA3Lm8KK29iai0kKENPTkZJR19QTUlDX0FEUDU1MjApCSs9IGFkcDU1MjAubwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2FiMzEwMC1jb3JlLmMgYi9kcml2ZXJzL21mZC9hYjMxMDAtY29yZS5jCmluZGV4IDYxMzQ4MTAuLmZkNDJhODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2FiMzEwMC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvYWIzMTAwLWNvcmUuYwpAQCAtOTAwLDkgKzkwMCw2IEBACiAJCWdvdG8gZXhpdF9ub190ZXN0cmVnX2NsaWVudDsKIAl9CiAKLQlzdHJsY3B5KGFiMzEwMC0+dGVzdHJlZ19jbGllbnQtPm5hbWUsIGlkLT5uYW1lLAotCQlzaXplb2YoYWIzMTAwLT50ZXN0cmVnX2NsaWVudC0+bmFtZSkpOwotCiAJZXJyID0gYWIzMTAwX3NldHVwKGFiMzEwMCk7CiAJaWYgKGVycikKIAkJZ290byBleGl0X25vX3NldHVwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvYWI0NTAwLWNvcmUuYyBiL2RyaXZlcnMvbWZkL2FiNDUwMC1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM0NGMxOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWZkL2FiNDUwMC1jb3JlLmMKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU1QtRXJpY3Nzb24KKyAqCisgKiBBdXRob3I6IFNyaW5pZGhpIEtBU0FHQVIgPHNyaW5pZGhpLmthc2FnYXJAc3Rlcmljc3Nvbi5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CisgKiBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogQUI0NTAwIGlzIGEgY29tcGFuaW9uIHBvd2VyIG1hbmFnZW1lbnQgY2hpcCB1c2VkIHdpdGggVTg1MDAuCisgKiBPbiB0aGlzIHBsYXRmb3JtLCB0aGlzIGlzIGludGVyZmFjZWQgd2l0aCBTU1AwIGNvbnRyb2xsZXIKKyAqIHdoaWNoIGlzIGEgQVJNIHByaW1lY2VsbCBwbDAyMi4KKyAqCisgKiBBdCB0aGUgbW9tZW50IHRoZSBtb2R1bGUganVzdCBleHBvcnRzIHJlYWQvd3JpdGUgZmVhdHVyZXMuCisgKiBJbnRlcnJ1cHQgbWFuYWdlbWVudCB0byBiZSBhZGRlZCAtIFRPRE8uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9hYjQ1MDAuaD4KKworLyoganVzdCByZXF1aXJlZCBpZiBwcm9iZSBmYWlscywgd2UgbmVlZCB0bworICogdW5yZWdpc3RlciB0aGUgZGV2aWNlCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhYjQ1MDBfZHJpdmVyOworCisvKgorICogVGhpcyBmdW50aW9uIHdyaXRlcyB0byBhbnkgQUI0NTAwIHJlZ2lzdGVycyB1c2luZworICogU1BJIHByb3RvY29sICYgIGJlZm9yZSBpdCB3cml0ZXMgaXQgcGFja3MgdGhlIGRhdGEKKyAqIGluIHRoZSBiZWxvdyAyNCBiaXQgZnJhbWUgZm9ybWF0CisgKgorICoJICp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICoJICp8IDIzfDIyLi4uMTh8MTcuLi4uLi4uMTB8OXw4fDcuLi4uLi4wfAorICoJICp8IHIvdyAgYmFuayAgICAgICBhZHIgICAgICAgICAgZGF0YSAgfAorICoJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGRuJ3QgYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0CisgKiBjb250ZXh0CisgKi8KK2ludCBhYjQ1MDBfd3JpdGUoc3RydWN0IGFiNDUwMCAqYWI0NTAwLCB1bnNpZ25lZCBjaGFyIGJsb2NrLAorCQl1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXI7CisJc3RydWN0IHNwaV9tZXNzYWdlCW1zZzsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgc3BpX2RhdGEgPQorCQlibG9jayA8PCAxOCB8IGFkZHIgPDwgMTAgfCBkYXRhOworCisJbXV0ZXhfbG9jaygmYWI0NTAwLT5sb2NrKTsKKwlhYjQ1MDAtPnR4X2J1ZlswXSA9IHNwaV9kYXRhOworCWFiNDUwMC0+cnhfYnVmWzBdID0gMDsKKworCXhmZXIudHhfYnVmCT0gYWI0NTAwLT50eF9idWY7CisJeGZlci5yeF9idWYgCT0gTlVMTDsKKwl4ZmVyLmxlbgk9IHNpemVvZih1bnNpZ25lZCBsb25nKTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCisJZXJyID0gc3BpX3N5bmMoYWI0NTAwLT5zcGksICZtc2cpOworCW11dGV4X3VubG9jaygmYWI0NTAwLT5sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGFiNDUwMF93cml0ZSk7CisKK2ludCBhYjQ1MDBfcmVhZChzdHJ1Y3QgYWI0NTAwICphYjQ1MDAsIHVuc2lnbmVkIGNoYXIgYmxvY2ssCisJCXVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXI7CisJc3RydWN0IHNwaV9tZXNzYWdlCW1zZzsKKwl1bnNpZ25lZCBsb25nIHNwaV9kYXRhID0KKwkJMSA8PCAyMyB8IGJsb2NrIDw8IDE4IHwgYWRkciA8PCAxMDsKKworCW11dGV4X2xvY2soJmFiNDUwMC0+bG9jayk7CisJYWI0NTAwLT50eF9idWZbMF0gPSBzcGlfZGF0YTsKKwlhYjQ1MDAtPnJ4X2J1ZlswXSA9IDA7CisKKwl4ZmVyLnR4X2J1Zgk9IGFiNDUwMC0+dHhfYnVmOworCXhmZXIucnhfYnVmIAk9IGFiNDUwMC0+cnhfYnVmOworCXhmZXIubGVuCT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisKKwlzcGlfc3luYyhhYjQ1MDAtPnNwaSwgJm1zZyk7CisJbXV0ZXhfdW5sb2NrKCZhYjQ1MDAtPmxvY2spOworCisJcmV0dXJuICBhYjQ1MDAtPnJ4X2J1ZlswXTsKK30KK0VYUE9SVF9TWU1CT0woYWI0NTAwX3JlYWQpOworCisvKiByZWY6IGFiMzEwMCBjb3JlICovCisjZGVmaW5lIEFCNDUwMF9ERVZJQ0UoZGV2bmFtZSwgZGV2aWQpCQkJCVwKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGFiNDUwMF8jI2Rldm5hbWUjI19kZXZpY2UgPSB7CVwKKwkubmFtZQk9IGRldmlkLAkJCQkJXAorCS5pZAk9IC0xLAkJCQkJCVwKK30KKworLyogbGlzdCBvZiBjaGlsZGVybiBkZXZpY2VzIG9mIGFiNDUwMCAtIGFsbCBhcmUKKyAqIG5vdCBwb3B1bGF0ZWQgaGVyZSAtIFRPRE8KKyAqLworQUI0NTAwX0RFVklDRShjaGFyZ2VyLCAiYWI0NTAwLWNoYXJnZXIiKTsKK0FCNDUwMF9ERVZJQ0UoYXVkaW8sICJhYjQ1MDAtYXVkaW8iKTsKK0FCNDUwMF9ERVZJQ0UodXNiLCAiYWI0NTAwLXVzYiIpOworQUI0NTAwX0RFVklDRSh0dm91dCwgImFiNDUwMC10dm91dCIpOworQUI0NTAwX0RFVklDRShzaW0sICJhYjQ1MDAtc2ltIik7CitBQjQ1MDBfREVWSUNFKGdwYWRjLCAiYWI0NTAwLWdwYWRjIik7CitBQjQ1MDBfREVWSUNFKGNsa21ndCwgImFiNDUwMC1jbGttZ3QiKTsKK0FCNDUwMF9ERVZJQ0UobWlzYywgImFiNDUwMC1taXNjIik7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICphYjQ1MDBfcGxhdGZvcm1fZGV2c1tdID0geworCSZhYjQ1MDBfY2hhcmdlcl9kZXZpY2UsCisJJmFiNDUwMF9hdWRpb19kZXZpY2UsCisJJmFiNDUwMF91c2JfZGV2aWNlLAorCSZhYjQ1MDBfdHZvdXRfZGV2aWNlLAorCSZhYjQ1MDBfc2ltX2RldmljZSwKKwkmYWI0NTAwX2dwYWRjX2RldmljZSwKKwkmYWI0NTAwX2Nsa21ndF9kZXZpY2UsCisJJmFiNDUwMF9taXNjX2RldmljZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFiNDUwMF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhYjQ1MDAJKmFiNDUwMDsKKwl1bnNpZ25lZCBjaGFyIHJldmlzaW9uOworCWludCBlcnIgPSAwOworCWludCBpOworCisJYWI0NTAwID0ga3phbGxvYyhzaXplb2YgKmFiNDUwMCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhYjQ1MDApIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJjb3VsZCBub3QgYWxsb2NhdGUgQUI0NTAwXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBub3RfZGV0ZWN0OworCX0KKworCWFiNDUwMC0+c3BpID0gc3BpOworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIGFiNDUwMCk7CisKKwltdXRleF9pbml0KCZhYjQ1MDAtPmxvY2spOworCisJLyogcmVhZCB0aGUgcmV2aXNpb24gcmVnaXN0ZXIgKi8KKwlyZXZpc2lvbiA9IGFiNDUwMF9yZWFkKGFiNDUwMCwgQUI0NTAwX01JU0MsIEFCNDUwMF9SRVZfUkVHKTsKKworCS8qIHJldmlzaW9uIGlkIDB4MCBpcyBmb3IgZWFybHkgZHJvcCwgMHgxMCBpcyBmb3IgY3V0MS4wICovCisJaWYgKHJldmlzaW9uID09IDB4MCB8fCByZXZpc2lvbiA9PSAweDEwKQorCQlkZXZfaW5mbygmc3BpLT5kZXYsICJEZXRlY3RlZCBjaGlwOiAlcywgcmV2aXNpb24gPSAleFxuIiwKKwkJCWFiNDUwMF9kcml2ZXIuZHJpdmVyLm5hbWUsIHJldmlzaW9uKTsKKwllbHNlCXsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJ1bmtub3duIGNoaXA6IDB4JXhcbiIsIHJldmlzaW9uKTsKKwkJZ290byBub3RfZGV0ZWN0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFiNDUwMF9wbGF0Zm9ybV9kZXZzKTsgaSsrKQl7CisJCWFiNDUwMF9wbGF0Zm9ybV9kZXZzW2ldLT5kZXYucGFyZW50ID0KKwkJCSZzcGktPmRldjsKKwkJcGxhdGZvcm1fc2V0X2RydmRhdGEoYWI0NTAwX3BsYXRmb3JtX2RldnNbaV0sIGFiNDUwMCk7CisJfQorCisJLyogcmVnaXN0ZXIgdGhlIGFiNDUwMCBwbGF0Zm9ybSBkZXZpY2VzICovCisJcGxhdGZvcm1fYWRkX2RldmljZXMoYWI0NTAwX3BsYXRmb3JtX2RldnMsCisJCQlBUlJBWV9TSVpFKGFiNDUwMF9wbGF0Zm9ybV9kZXZzKSk7CisKKwlyZXR1cm4gZXJyOworCisgbm90X2RldGVjdDoKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFiNDUwMF9kcml2ZXIpOworCWtmcmVlKGFiNDUwMCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWI0NTAwX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhYjQ1MDAgKmFiNDUwMCA9CisJCXNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCisJa2ZyZWUoYWI0NTAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWI0NTAwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhYjQ1MDAiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFiNDUwMF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWI0NTAwX3JlbW92ZSkKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFiNDUwMF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFiNDUwMF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWI0NTAwX2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFiNDUwMF9kcml2ZXIpOworfQorCitzdWJzeXNfaW5pdGNhbGwoYWI0NTAwX2luaXQpOworbW9kdWxlX2V4aXQoYWI0NTAwX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJTcmluaWRoaSBLQVNBR0FSIDxzcmluaWRoaS5rYXNhZ2FyQHN0ZXJpY3Nzb24uY29tIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFCNDUwMCBjb3JlIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvYWRwNTUyMC5jIGIvZHJpdmVycy9tZmQvYWRwNTUyMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNjY0NDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC9hZHA1NTIwLmMKQEAgLTAsMCArMSwzNzkgQEAKKy8qCisgKiBCYXNlIGRyaXZlciBmb3IgQW5hbG9nIERldmljZXMgQURQNTUyMC9BRFA1NTAxIE1GRCBQTUlDcworICogTENEIEJhY2tsaWdodDogZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYWRwNTUyMF9ibAorICogTEVEcwkJOiBkcml2ZXJzL2xlZC9sZWRzLWFkcDU1MjAKKyAqIEdQSU8JCTogZHJpdmVycy9ncGlvL2FkcDU1MjAtZ3BpbyAoQURQNTUyMCBvbmx5KQorICogS2V5cwkJOiBkcml2ZXJzL2lucHV0L2tleWJvYXJkL2FkcDU1MjAta2V5cyAoQURQNTUyMCBvbmx5KQorICoKKyAqIENvcHlyaWdodCAyMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBEZXJpdmVkIGZyb20gZGE5MDN4OgorICogQ29weXJpZ2h0IChDKSAyMDA4IENvbXB1bGFiLCBMdGQuCisgKiAJTWlrZSBSYXBvcG9ydCA8bWlrZUBjb21wdWxhYi5jby5pbD4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLgorICogCUVyaWMgTWlhbyA8ZXJpYy5taWFvQG1hcnZlbGwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorCisjaW5jbHVkZSA8bGludXgvbWZkL2FkcDU1MjAuaD4KKworc3RydWN0IGFkcDU1MjBfY2hpcCB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IG11dGV4IGxvY2s7CisJc3RydWN0IGJsb2NraW5nX25vdGlmaWVyX2hlYWQgbm90aWZpZXJfbGlzdDsKKwlpbnQgaXJxOworCXVuc2lnbmVkIGxvbmcgaWQ7Cit9OworCitzdGF0aWMgaW50IF9fYWRwNTUyMF9yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJaW50IHJlZywgdWludDhfdCAqdmFsKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHJlYWRpbmcgYXQgMHglMDJ4XG4iLCByZWcpOworCQlyZXR1cm4gcmV0OworCX0KKworCSp2YWwgPSAodWludDhfdClyZXQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19hZHA1NTIwX3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJIGludCByZWcsIHVpbnQ4X3QgdmFsKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWwpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHdyaXRpbmcgMHglMDJ4IHRvIDB4JTAyeFxuIiwKKwkJCQl2YWwsIHJlZyk7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fYWRwNTUyMF9hY2tfYml0cyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcmVnLAorCQkJICAgICAgdWludDhfdCBiaXRfbWFzaykKK3sKKwlzdHJ1Y3QgYWRwNTUyMF9jaGlwICpjaGlwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdWludDhfdCByZWdfdmFsOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjaGlwLT5sb2NrKTsKKworCXJldCA9IF9fYWRwNTUyMF9yZWFkKGNsaWVudCwgcmVnLCAmcmVnX3ZhbCk7CisKKwlpZiAoIXJldCkgeworCQlyZWdfdmFsIHw9IGJpdF9tYXNrOworCQlyZXQgPSBfX2FkcDU1MjBfd3JpdGUoY2xpZW50LCByZWcsIHJlZ192YWwpOworCX0KKworCW11dGV4X3VubG9jaygmY2hpcC0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGFkcDU1MjBfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgcmVnLCB1aW50OF90IHZhbCkKK3sKKwlyZXR1cm4gX19hZHA1NTIwX3dyaXRlKHRvX2kyY19jbGllbnQoZGV2KSwgcmVnLCB2YWwpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWRwNTUyMF93cml0ZSk7CisKK2ludCBhZHA1NTIwX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgcmVnLCB1aW50OF90ICp2YWwpCit7CisJcmV0dXJuIF9fYWRwNTUyMF9yZWFkKHRvX2kyY19jbGllbnQoZGV2KSwgcmVnLCB2YWwpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWRwNTUyMF9yZWFkKTsKKworaW50IGFkcDU1MjBfc2V0X2JpdHMoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgcmVnLCB1aW50OF90IGJpdF9tYXNrKQoreworCXN0cnVjdCBhZHA1NTIwX2NoaXAgKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1aW50OF90IHJlZ192YWw7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNoaXAtPmxvY2spOworCisJcmV0ID0gX19hZHA1NTIwX3JlYWQoY2hpcC0+Y2xpZW50LCByZWcsICZyZWdfdmFsKTsKKworCWlmICghcmV0ICYmICgocmVnX3ZhbCAmIGJpdF9tYXNrKSA9PSAwKSkgeworCQlyZWdfdmFsIHw9IGJpdF9tYXNrOworCQlyZXQgPSBfX2FkcDU1MjBfd3JpdGUoY2hpcC0+Y2xpZW50LCByZWcsIHJlZ192YWwpOworCX0KKworCW11dGV4X3VubG9jaygmY2hpcC0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFkcDU1MjBfc2V0X2JpdHMpOworCitpbnQgYWRwNTUyMF9jbHJfYml0cyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCByZWcsIHVpbnQ4X3QgYml0X21hc2spCit7CisJc3RydWN0IGFkcDU1MjBfY2hpcCAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVpbnQ4X3QgcmVnX3ZhbDsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2hpcC0+bG9jayk7CisKKwlyZXQgPSBfX2FkcDU1MjBfcmVhZChjaGlwLT5jbGllbnQsIHJlZywgJnJlZ192YWwpOworCisJaWYgKCFyZXQgJiYgKHJlZ192YWwgJiBiaXRfbWFzaykpIHsKKwkJcmVnX3ZhbCAmPSB+Yml0X21hc2s7CisJCXJldCA9IF9fYWRwNTUyMF93cml0ZShjaGlwLT5jbGllbnQsIHJlZywgcmVnX3ZhbCk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWRwNTUyMF9jbHJfYml0cyk7CisKK2ludCBhZHA1NTIwX3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQl1bnNpZ25lZCBpbnQgZXZlbnRzKQoreworCXN0cnVjdCBhZHA1NTIwX2NoaXAgKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChjaGlwLT5pcnEpIHsKKwkJYWRwNTUyMF9zZXRfYml0cyhjaGlwLT5kZXYsIEFEUDU1MjBfSU5URVJSVVBUX0VOQUJMRSwKKwkJCWV2ZW50cyAmIChBRFA1NTIwX0tQX0lFTiB8IEFEUDU1MjBfS1JfSUVOIHwKKwkJCUFEUDU1MjBfT1ZQX0lFTiB8IEFEUDU1MjBfQ01QUl9JRU4pKTsKKworCQlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJmNoaXAtPm5vdGlmaWVyX2xpc3QsCisJCQkgbmIpOworCX0KKworCXJldHVybiAtRU5PREVWOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWRwNTUyMF9yZWdpc3Rlcl9ub3RpZmllcik7CisKK2ludCBhZHA1NTIwX3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJCXVuc2lnbmVkIGludCBldmVudHMpCit7CisJc3RydWN0IGFkcDU1MjBfY2hpcCAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJYWRwNTUyMF9jbHJfYml0cyhjaGlwLT5kZXYsIEFEUDU1MjBfSU5URVJSVVBUX0VOQUJMRSwKKwkJZXZlbnRzICYgKEFEUDU1MjBfS1BfSUVOIHwgQURQNTUyMF9LUl9JRU4gfAorCQlBRFA1NTIwX09WUF9JRU4gfCBBRFA1NTIwX0NNUFJfSUVOKSk7CisKKwlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmY2hpcC0+bm90aWZpZXJfbGlzdCwgbmIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWRwNTUyMF91bnJlZ2lzdGVyX25vdGlmaWVyKTsKKworc3RhdGljIGlycXJldHVybl90IGFkcDU1MjBfaXJxX3RocmVhZChpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBhZHA1NTIwX2NoaXAgKmNoaXAgPSBkYXRhOworCXVuc2lnbmVkIGludCBldmVudHM7CisJdWludDhfdCByZWdfdmFsOworCWludCByZXQ7CisKKwlyZXQgPSBfX2FkcDU1MjBfcmVhZChjaGlwLT5jbGllbnQsIEFEUDU1MjBfTU9ERV9TVEFUVVMsICZyZWdfdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWV2ZW50cyA9ICByZWdfdmFsICYgKEFEUDU1MjBfT1ZQX0lOVCB8IEFEUDU1MjBfQ01QUl9JTlQgfAorCQlBRFA1NTIwX0dQSV9JTlQgfCBBRFA1NTIwX0tSX0lOVCB8IEFEUDU1MjBfS1BfSU5UKTsKKworCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmNoaXAtPm5vdGlmaWVyX2xpc3QsIGV2ZW50cywgTlVMTCk7CisJLyogQUNLLCBTdGlja3kgYml0cyBhcmUgVzFDICovCisJX19hZHA1NTIwX2Fja19iaXRzKGNoaXAtPmNsaWVudCwgQURQNTUyMF9NT0RFX1NUQVRVUywgZXZlbnRzKTsKKworb3V0OgorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBfX3JlbW92ZV9zdWJkZXYoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICp1bnVzZWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIodG9fcGxhdGZvcm1fZGV2aWNlKGRldikpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkcDU1MjBfcmVtb3ZlX3N1YmRldnMoc3RydWN0IGFkcDU1MjBfY2hpcCAqY2hpcCkKK3sKKwlyZXR1cm4gZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKGNoaXAtPmRldiwgTlVMTCwgX19yZW1vdmVfc3ViZGV2KTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYWRwNTUyMF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGFkcDU1MjBfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IGFkcDU1MjBfY2hpcCAqY2hpcDsKKwlpbnQgcmV0OworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsCisJCQkJCUkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJTTUJVUyBXb3JkIERhdGEgbm90IFN1cHBvcnRlZFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChwZGF0YSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAibWlzc2luZyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKCpjaGlwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaGlwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGNoaXApOworCWNoaXAtPmNsaWVudCA9IGNsaWVudDsKKworCWNoaXAtPmRldiA9ICZjbGllbnQtPmRldjsKKwljaGlwLT5pcnEgPSBjbGllbnQtPmlycTsKKwljaGlwLT5pZCA9IGlkLT5kcml2ZXJfZGF0YTsKKwltdXRleF9pbml0KCZjaGlwLT5sb2NrKTsKKworCWlmIChjaGlwLT5pcnEpIHsKKwkJQkxPQ0tJTkdfSU5JVF9OT1RJRklFUl9IRUFEKCZjaGlwLT5ub3RpZmllcl9saXN0KTsKKworCQlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShjaGlwLT5pcnEsIE5VTEwsIGFkcDU1MjBfaXJxX3RocmVhZCwKKwkJCQlJUlFGX1RSSUdHRVJfTE9XIHwgSVJRRl9PTkVTSE9ULAorCQkJCSJhZHA1NTIwIiwgY2hpcCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgaXJxICVkXG4iLAorCQkJCQljaGlwLT5pcnEpOworCQkJZ290byBvdXRfZnJlZV9jaGlwOworCQl9CisJfQorCisJcmV0ID0gYWRwNTUyMF93cml0ZShjaGlwLT5kZXYsIEFEUDU1MjBfTU9ERV9TVEFUVVMsIEFEUDU1MjBfblNUTkJZKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIHdyaXRlXG4iKTsKKwkJZ290byBvdXRfZnJlZV9pcnE7CisJfQorCisJaWYgKHBkYXRhLT5rZXlzKSB7CisJCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfZGF0YShjaGlwLT5kZXYsICJhZHA1NTIwLWtleXMiLAorCQkJCWNoaXAtPmlkLCBwZGF0YS0+a2V5cywgc2l6ZW9mKCpwZGF0YS0+a2V5cykpOworCQlpZiAoSVNfRVJSKHBkZXYpKSB7CisJCQlyZXQgPSBQVFJfRVJSKHBkZXYpOworCQkJZ290byBvdXRfcmVtb3ZlX3N1YmRldnM7CisJCX0KKwl9CisKKwlpZiAocGRhdGEtPmdwaW8pIHsKKwkJcGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9kYXRhKGNoaXAtPmRldiwgImFkcDU1MjAtZ3BpbyIsCisJCQkJY2hpcC0+aWQsIHBkYXRhLT5ncGlvLCBzaXplb2YoKnBkYXRhLT5ncGlvKSk7CisJCWlmIChJU19FUlIocGRldikpIHsKKwkJCXJldCA9IFBUUl9FUlIocGRldik7CisJCQlnb3RvIG91dF9yZW1vdmVfc3ViZGV2czsKKwkJfQorCX0KKworCWlmIChwZGF0YS0+bGVkcykgeworCQlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX2RhdGEoY2hpcC0+ZGV2LCAiYWRwNTUyMC1sZWQiLAorCQkJCWNoaXAtPmlkLCBwZGF0YS0+bGVkcywgc2l6ZW9mKCpwZGF0YS0+bGVkcykpOworCQlpZiAoSVNfRVJSKHBkZXYpKSB7CisJCQlyZXQgPSBQVFJfRVJSKHBkZXYpOworCQkJZ290byBvdXRfcmVtb3ZlX3N1YmRldnM7CisJCX0KKwl9CisKKwlpZiAocGRhdGEtPmJhY2tsaWdodCkgeworCQlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX2RhdGEoY2hpcC0+ZGV2LAorCQkJCQkJImFkcDU1MjAtYmFja2xpZ2h0IiwKKwkJCQkJCWNoaXAtPmlkLAorCQkJCQkJcGRhdGEtPmJhY2tsaWdodCwKKwkJCQkJCXNpemVvZigqcGRhdGEtPmJhY2tsaWdodCkpOworCQlpZiAoSVNfRVJSKHBkZXYpKSB7CisJCQlyZXQgPSBQVFJfRVJSKHBkZXYpOworCQkJZ290byBvdXRfcmVtb3ZlX3N1YmRldnM7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworb3V0X3JlbW92ZV9zdWJkZXZzOgorCWFkcDU1MjBfcmVtb3ZlX3N1YmRldnMoY2hpcCk7CisKK291dF9mcmVlX2lycToKKwlpZiAoY2hpcC0+aXJxKQorCQlmcmVlX2lycShjaGlwLT5pcnEsIGNoaXApOworCitvdXRfZnJlZV9jaGlwOgorCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIE5VTEwpOworCWtmcmVlKGNoaXApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWRwNTUyMF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYWRwNTUyMF9jaGlwICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKCZjbGllbnQtPmRldik7CisKKwlpZiAoY2hpcC0+aXJxKQorCQlmcmVlX2lycShjaGlwLT5pcnEsIGNoaXApOworCisJYWRwNTUyMF9yZW1vdmVfc3ViZGV2cyhjaGlwKTsKKwlhZHA1NTIwX3dyaXRlKGNoaXAtPmRldiwgQURQNTUyMF9NT0RFX1NUQVRVUywgMCk7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgTlVMTCk7CisJa2ZyZWUoY2hpcCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYWRwNTUyMF9zdXNwZW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgYWRwNTUyMF9jaGlwICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKCZjbGllbnQtPmRldik7CisKKwlhZHA1NTIwX2Nscl9iaXRzKGNoaXAtPmRldiwgQURQNTUyMF9NT0RFX1NUQVRVUywgQURQNTUyMF9uU1ROQlkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkcDU1MjBfcmVzdW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGFkcDU1MjBfY2hpcCAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YSgmY2xpZW50LT5kZXYpOworCisJYWRwNTUyMF9zZXRfYml0cyhjaGlwLT5kZXYsIEFEUDU1MjBfTU9ERV9TVEFUVVMsIEFEUDU1MjBfblNUTkJZKTsKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIGFkcDU1MjBfc3VzcGVuZAlOVUxMCisjZGVmaW5lIGFkcDU1MjBfcmVzdW1lCU5VTEwKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWRwNTUyMF9pZFtdID0geworCXsgInBtaWMtYWRwNTUyMCIsIElEX0FEUDU1MjAgfSwKKwl7ICJwbWljLWFkcDU1MDEiLCBJRF9BRFA1NTAxIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGFkcDU1MjBfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWRwNTUyMF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAiYWRwNTUyMCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IGFkcDU1MjBfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhZHA1NTIwX3JlbW92ZSksCisJLnN1c3BlbmQJPSBhZHA1NTIwX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBhZHA1NTIwX3Jlc3VtZSwKKwkuaWRfdGFibGUgCT0gYWRwNTUyMF9pZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFkcDU1MjBfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYWRwNTUyMF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWRwNTUyMF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGFkcDU1MjBfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZhZHA1NTIwX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZHA1NTIwX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEhlbm5lcmljaCA8aGVubmVyaWNoQGJsYWNrZmluLnVjbGludXgub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBRFA1NTIwKDAxKSBQTUlDLU1GRCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2FzaWMzLmMgYi9kcml2ZXJzL21mZC9hc2ljMy5jCmluZGV4IDYzYTJhNjYuLmUyMjEyOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2FzaWMzLmMKKysrIGIvZHJpdmVycy9tZmQvYXNpYzMuYwpAQCAtOTA4LDcgKzkwOCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBhc2ljM19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFzaWMzX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCWludCByZXQ7CiAJc3RydWN0IGFzaWMzICphc2ljID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9lengtcGNhcC5jIGIvZHJpdmVycy9tZmQvZXp4LXBjYXAuYwppbmRleCA4NzYyODg5MS4uZGY0MDVhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvZXp4LXBjYXAuYworKysgYi9kcml2ZXJzL21mZC9lengtcGNhcC5jCkBAIC0zODcsNyArMzg3LDYgQEAKIAlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKHN1YmRldi0+bmFtZSwgc3ViZGV2LT5pZCk7CiAJcGRldi0+ZGV2LnBhcmVudCA9ICZwY2FwLT5zcGktPmRldjsKIAlwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9IHN1YmRldi0+cGxhdGZvcm1fZGF0YTsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwY2FwKTsKIAogCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvbWMxMzc4My1jb3JlLmMgYi9kcml2ZXJzL21mZC9tYzEzNzgzLWNvcmUuYwppbmRleCBlMzU0ZDI5Li5hMWFkZTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9tYzEzNzgzLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC9tYzEzNzgzLWNvcmUuYwpAQCAtMSwyODYgKzEsNTQ5IEBACiAvKgorICogQ29weXJpZ2h0IDIwMDkgUGVuZ3V0cm9uaXgKKyAqIFV3ZSBLbGVpbmUtS29lbmlnIDx1LmtsZWluZS1rb2VuaWdAcGVuZ3V0cm9uaXguZGU+CisgKgorICogbG9vc2VseSBiYXNlZCBvbiBhbiBlYXJsaWVyIGRyaXZlciB0aGF0IGhhcwogICogQ29weXJpZ2h0IDIwMDkgUGVuZ3V0cm9uaXgsIFNhc2NoYSBIYXVlciA8cy5oYXVlckBwZW5ndXRyb25peC5kZT4KICAqCi0gKiBUaGlzIGNvZGUgaXMgaW4gcGFydHMgYmFzZWQgb24gd204MzUwLWNvcmUuYyBhbmQgcGNmNTA2MzMtY29yZS5jCi0gKgotICogSW5pdGlhbCBkZXZlbG9wbWVudCBvZiB0aGlzIGNvZGUgd2FzIGZ1bmRlZCBieQotICogUGh5dGVjIE1lc3N0ZWNobmlrIEdtYkgsIGh0dHA6Ly93d3cucGh5dGVjLmRlCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KLSNpbmNsdWRlIDxsaW51eC9tZmQvbWMxMzc4My1wcml2YXRlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL21jMTM3ODMuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL21jMTM3ODMtcHJpdmF0ZS5oPgogCi0jZGVmaW5lIE1DMTM3ODNfTUFYX1JFR19OVU0JMHgzZgotI2RlZmluZSBNQzEzNzgzX0ZSQU1FX01BU0sJMHgwMGZmZmZmZgotI2RlZmluZSBNQzEzNzgzX01BWF9SRUdfTlVNCTB4M2YKLSNkZWZpbmUgTUMxMzc4M19SRUdfTlVNX1NISUZUCTB4MTkKLSNkZWZpbmUgTUMxMzc4M19XUklURV9CSVRfU0hJRlQJMzEKKyNkZWZpbmUgTUMxMzc4M19JUlFTVEFUMAkwCisjZGVmaW5lIE1DMTM3ODNfSVJRU1RBVDBfQURDRE9ORUkJKDEgPDwgMCkKKyNkZWZpbmUgTUMxMzc4M19JUlFTVEFUMF9BRENCSVNET05FSQkoMSA8PCAxKQorI2RlZmluZSBNQzEzNzgzX0lSUVNUQVQwX1RTSQkJKDEgPDwgMikKKyNkZWZpbmUgTUMxMzc4M19JUlFTVEFUMF9XSElHSEkJCSgxIDw8IDMpCisjZGVmaW5lIE1DMTM3ODNfSVJRU1RBVDBfV0xPV0kJCSgxIDw8IDQpCisjZGVmaW5lIE1DMTM3ODNfSVJRU1RBVDBfQ0hHREVUSQkoMSA8PCA2KQorI2RlZmluZSBNQzEzNzgzX0lSUVNUQVQwX0NIR09WSQkJKDEgPDwgNykKKyNkZWZpbmUgTUMxMzc4M19JUlFTVEFUMF9DSEdSRVZJCSgxIDw8IDgpCisjZGVmaW5lIE1DMTM3ODNfSVJRU1RBVDBfQ0hHU0hPUlRJCSgxIDw8IDkpCisjZGVmaW5lIE1DMTM3ODNfSVJRU1RBVDBfQ0NDVkkJCSgxIDw8IDEwKQorI2RlZmluZSBNQzEzNzgzX0lSUVNUQVQwX0NIR0NVUlJJCSgxIDw8IDExKQorI2RlZmluZSBNQzEzNzgzX0lSUVNUQVQwX0JQT05JCQkoMSA8PCAxMikKKyNkZWZpbmUgTUMxMzc4M19JUlFTVEFUMF9MT0JBVExJCSgxIDw8IDEzKQorI2RlZmluZSBNQzEzNzgzX0lSUVNUQVQwX0xPQkFUSEkJKDEgPDwgMTQpCisjZGVmaW5lIE1DMTM3ODNfSVJRU1RBVDBfVURQSQkJKDEgPDwgMTUpCisjZGVmaW5lIE1DMTM3ODNfSVJRU1RBVDBfVVNCSQkJKDEgPDwgMTYpCisjZGVmaW5lIE1DMTM3ODNfSVJRU1RBVDBfSURJCQkoMSA8PCAxOSkKKyNkZWZpbmUgTUMxMzc4M19JUlFTVEFUMF9TRTFJCQkoMSA8PCAyMSkKKyNkZWZpbmUgTUMxMzc4M19JUlFTVEFUMF9DS0RFVEkJCSgxIDw8IDIyKQorI2RlZmluZSBNQzEzNzgzX0lSUVNUQVQwX1VETUkJCSgxIDw8IDIzKQogCi1zdGF0aWMgaW5saW5lIGludCBzcGlfcncoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTggKiBidWYsIHNpemVfdCBsZW4pCisjZGVmaW5lIE1DMTM3ODNfSVJRTUFTSzAJMQorI2RlZmluZSBNQzEzNzgzX0lSUU1BU0swX0FEQ0RPTkVNCU1DMTM3ODNfSVJRU1RBVDBfQURDRE9ORUkKKyNkZWZpbmUgTUMxMzc4M19JUlFNQVNLMF9BRENCSVNET05FTQlNQzEzNzgzX0lSUVNUQVQwX0FEQ0JJU0RPTkVJCisjZGVmaW5lIE1DMTM3ODNfSVJRTUFTSzBfVFNNCQlNQzEzNzgzX0lSUVNUQVQwX1RTSQorI2RlZmluZSBNQzEzNzgzX0lSUU1BU0swX1dISUdITQkJTUMxMzc4M19JUlFTVEFUMF9XSElHSEkKKyNkZWZpbmUgTUMxMzc4M19JUlFNQVNLMF9XTE9XTQkJTUMxMzc4M19JUlFTVEFUMF9XTE9XSQorI2RlZmluZSBNQzEzNzgzX0lSUU1BU0swX0NIR0RFVE0JTUMxMzc4M19JUlFTVEFUMF9DSEdERVRJCisjZGVmaW5lIE1DMTM3ODNfSVJRTUFTSzBfQ0hHT1ZNCQlNQzEzNzgzX0lSUVNUQVQwX0NIR09WSQorI2RlZmluZSBNQzEzNzgzX0lSUU1BU0swX0NIR1JFVk0JTUMxMzc4M19JUlFTVEFUMF9DSEdSRVZJCisjZGVmaW5lIE1DMTM3ODNfSVJRTUFTSzBfQ0hHU0hPUlRNCU1DMTM3ODNfSVJRU1RBVDBfQ0hHU0hPUlRJCisjZGVmaW5lIE1DMTM3ODNfSVJRTUFTSzBfQ0NDVk0JCU1DMTM3ODNfSVJRU1RBVDBfQ0NDVkkKKyNkZWZpbmUgTUMxMzc4M19JUlFNQVNLMF9DSEdDVVJSTQlNQzEzNzgzX0lSUVNUQVQwX0NIR0NVUlJJCisjZGVmaW5lIE1DMTM3ODNfSVJRTUFTSzBfQlBPTk0JCU1DMTM3ODNfSVJRU1RBVDBfQlBPTkkKKyNkZWZpbmUgTUMxMzc4M19JUlFNQVNLMF9MT0JBVExNCU1DMTM3ODNfSVJRU1RBVDBfTE9CQVRMSQorI2RlZmluZSBNQzEzNzgzX0lSUU1BU0swX0xPQkFUSE0JTUMxMzc4M19JUlFTVEFUMF9MT0JBVEhJCisjZGVmaW5lIE1DMTM3ODNfSVJRTUFTSzBfVURQTQkJTUMxMzc4M19JUlFTVEFUMF9VRFBJCisjZGVmaW5lIE1DMTM3ODNfSVJRTUFTSzBfVVNCTQkJTUMxMzc4M19JUlFTVEFUMF9VU0JJCisjZGVmaW5lIE1DMTM3ODNfSVJRTUFTSzBfSURNCQlNQzEzNzgzX0lSUVNUQVQwX0lESQorI2RlZmluZSBNQzEzNzgzX0lSUU1BU0swX1NFMU0JCU1DMTM3ODNfSVJRU1RBVDBfU0UxSQorI2RlZmluZSBNQzEzNzgzX0lSUU1BU0swX0NLREVUTQkJTUMxMzc4M19JUlFTVEFUMF9DS0RFVEkKKyNkZWZpbmUgTUMxMzc4M19JUlFNQVNLMF9VRE1NCQlNQzEzNzgzX0lSUVNUQVQwX1VETUkKKworI2RlZmluZSBNQzEzNzgzX0lSUVNUQVQxCTMKKyNkZWZpbmUgTUMxMzc4M19JUlFTVEFUMV8xSFpJCQkoMSA8PCAwKQorI2RlZmluZSBNQzEzNzgzX0lSUVNUQVQxX1RPREFJCQkoMSA8PCAxKQorI2RlZmluZSBNQzEzNzgzX0lSUVNUQVQxX09OT0ZEMUkJKDEgPDwgMykKKyNkZWZpbmUgTUMxMzc4M19JUlFTVEFUMV9PTk9GRDJJCSgxIDw8IDQpCisjZGVmaW5lIE1DMTM3ODNfSVJRU1RBVDFfT05PRkQzSQkoMSA8PCA1KQorI2RlZmluZSBNQzEzNzgzX0lSUVNUQVQxX1NZU1JTVEkJKDEgPDwgNikKKyNkZWZpbmUgTUMxMzc4M19JUlFTVEFUMV9SVENSU1RJCSgxIDw8IDcpCisjZGVmaW5lIE1DMTM3ODNfSVJRU1RBVDFfUENJCQkoMSA8PCA4KQorI2RlZmluZSBNQzEzNzgzX0lSUVNUQVQxX1dBUk1JCQkoMSA8PCA5KQorI2RlZmluZSBNQzEzNzgzX0lSUVNUQVQxX01FTUhMREkJKDEgPDwgMTApCisjZGVmaW5lIE1DMTM3ODNfSVJRU1RBVDFfUFdSUkRZSQkoMSA8PCAxMSkKKyNkZWZpbmUgTUMxMzc4M19JUlFTVEFUMV9USFdBUk5MSQkoMSA8PCAxMikKKyNkZWZpbmUgTUMxMzc4M19JUlFTVEFUMV9USFdBUk5ISQkoMSA8PCAxMykKKyNkZWZpbmUgTUMxMzc4M19JUlFTVEFUMV9DTEtJCQkoMSA8PCAxNCkKKyNkZWZpbmUgTUMxMzc4M19JUlFTVEFUMV9TRU1BRkkJCSgxIDw8IDE1KQorI2RlZmluZSBNQzEzNzgzX0lSUVNUQVQxX01DMkJJCQkoMSA8PCAxNykKKyNkZWZpbmUgTUMxMzc4M19JUlFTVEFUMV9IU0RFVEkJCSgxIDw8IDE4KQorI2RlZmluZSBNQzEzNzgzX0lSUVNUQVQxX0hTTEkJCSgxIDw8IDE5KQorI2RlZmluZSBNQzEzNzgzX0lSUVNUQVQxX0FMU1BUSEkJKDEgPDwgMjApCisjZGVmaW5lIE1DMTM3ODNfSVJRU1RBVDFfQUhTU0hPUlRJCSgxIDw8IDIxKQorCisjZGVmaW5lIE1DMTM3ODNfSVJRTUFTSzEJNAorI2RlZmluZSBNQzEzNzgzX0lSUU1BU0sxXzFIWk0JCU1DMTM3ODNfSVJRU1RBVDFfMUhaSQorI2RlZmluZSBNQzEzNzgzX0lSUU1BU0sxX1RPREFNCQlNQzEzNzgzX0lSUVNUQVQxX1RPREFJCisjZGVmaW5lIE1DMTM3ODNfSVJRTUFTSzFfT05PRkQxTQlNQzEzNzgzX0lSUVNUQVQxX09OT0ZEMUkKKyNkZWZpbmUgTUMxMzc4M19JUlFNQVNLMV9PTk9GRDJNCU1DMTM3ODNfSVJRU1RBVDFfT05PRkQySQorI2RlZmluZSBNQzEzNzgzX0lSUU1BU0sxX09OT0ZEM00JTUMxMzc4M19JUlFTVEFUMV9PTk9GRDNJCisjZGVmaW5lIE1DMTM3ODNfSVJRTUFTSzFfU1lTUlNUTQlNQzEzNzgzX0lSUVNUQVQxX1NZU1JTVEkKKyNkZWZpbmUgTUMxMzc4M19JUlFNQVNLMV9SVENSU1RNCU1DMTM3ODNfSVJRU1RBVDFfUlRDUlNUSQorI2RlZmluZSBNQzEzNzgzX0lSUU1BU0sxX1BDTQkJTUMxMzc4M19JUlFTVEFUMV9QQ0kKKyNkZWZpbmUgTUMxMzc4M19JUlFNQVNLMV9XQVJNTQkJTUMxMzc4M19JUlFTVEFUMV9XQVJNSQorI2RlZmluZSBNQzEzNzgzX0lSUU1BU0sxX01FTUhMRE0JTUMxMzc4M19JUlFTVEFUMV9NRU1ITERJCisjZGVmaW5lIE1DMTM3ODNfSVJRTUFTSzFfUFdSUkRZTQlNQzEzNzgzX0lSUVNUQVQxX1BXUlJEWUkKKyNkZWZpbmUgTUMxMzc4M19JUlFNQVNLMV9USFdBUk5MTQlNQzEzNzgzX0lSUVNUQVQxX1RIV0FSTkxJCisjZGVmaW5lIE1DMTM3ODNfSVJRTUFTSzFfVEhXQVJOSE0JTUMxMzc4M19JUlFTVEFUMV9USFdBUk5ISQorI2RlZmluZSBNQzEzNzgzX0lSUU1BU0sxX0NMS00JCU1DMTM3ODNfSVJRU1RBVDFfQ0xLSQorI2RlZmluZSBNQzEzNzgzX0lSUU1BU0sxX1NFTUFGTQkJTUMxMzc4M19JUlFTVEFUMV9TRU1BRkkKKyNkZWZpbmUgTUMxMzc4M19JUlFNQVNLMV9NQzJCTQkJTUMxMzc4M19JUlFTVEFUMV9NQzJCSQorI2RlZmluZSBNQzEzNzgzX0lSUU1BU0sxX0hTREVUTQkJTUMxMzc4M19JUlFTVEFUMV9IU0RFVEkKKyNkZWZpbmUgTUMxMzc4M19JUlFNQVNLMV9IU0xNCQlNQzEzNzgzX0lSUVNUQVQxX0hTTEkKKyNkZWZpbmUgTUMxMzc4M19JUlFNQVNLMV9BTFNQVEhNCU1DMTM3ODNfSVJRU1RBVDFfQUxTUFRISQorI2RlZmluZSBNQzEzNzgzX0lSUU1BU0sxX0FIU1NIT1JUTQlNQzEzNzgzX0lSUVNUQVQxX0FIU1NIT1JUSQorCisjZGVmaW5lIE1DMTM3ODNfQURDMQkJNDQKKyNkZWZpbmUgTUMxMzc4M19BREMxX0FERU4JCSgxIDw8IDApCisjZGVmaW5lIE1DMTM3ODNfQURDMV9SQU5ECQkoMSA8PCAxKQorI2RlZmluZSBNQzEzNzgzX0FEQzFfQURTRUwJCSgxIDw8IDMpCisjZGVmaW5lIE1DMTM3ODNfQURDMV9BU0MJCSgxIDw8IDIwKQorI2RlZmluZSBNQzEzNzgzX0FEQzFfQURUUklHSUdOCQkoMSA8PCAyMSkKKworI2RlZmluZSBNQzEzNzgzX05VTVJFR1MgMHgzZgorCit2b2lkIG1jMTM3ODNfbG9jayhzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MykKIHsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHQgPSB7Ci0JCS50eF9idWYgPSAoY29uc3Qgdm9pZCAqKWJ1ZiwKLQkJLnJ4X2J1ZiA9IGJ1ZiwKLQkJLmxlbiA9IGxlbiwKLQkJLmNzX2NoYW5nZSA9IDAsCi0JCS5kZWxheV91c2VjcyA9IDAsCi0JfTsKKwlpZiAoIW11dGV4X3RyeWxvY2soJm1jMTM3ODMtPmxvY2spKSB7CisJCWRldl9kYmcoJm1jMTM3ODMtPnNwaWRldi0+ZGV2LCAid2FpdCBmb3IgJXMgZnJvbSAlcGZcbiIsCisJCQkJX19mdW5jX18sIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CisKKwkJbXV0ZXhfbG9jaygmbWMxMzc4My0+bG9jayk7CisJfQorCWRldl9kYmcoJm1jMTM3ODMtPnNwaWRldi0+ZGV2LCAiJXMgZnJvbSAlcGZcbiIsCisJCQlfX2Z1bmNfXywgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKK30KK0VYUE9SVF9TWU1CT0wobWMxMzc4M19sb2NrKTsKKwordm9pZCBtYzEzNzgzX3VubG9jayhzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MykKK3sKKwlkZXZfZGJnKCZtYzEzNzgzLT5zcGlkZXYtPmRldiwgIiVzIGZyb20gJXBmXG4iLAorCQkJX19mdW5jX18sIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CisJbXV0ZXhfdW5sb2NrKCZtYzEzNzgzLT5sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0wobWMxMzc4M191bmxvY2spOworCisjZGVmaW5lIE1DMTM3ODNfUkVHT0ZGU0VUX1NISUZUIDI1CitpbnQgbWMxMzc4M19yZWdfcmVhZChzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MywgdW5zaWduZWQgaW50IG9mZnNldCwgdTMyICp2YWwpCit7CisJc3RydWN0IHNwaV90cmFuc2ZlciB0OwogCXN0cnVjdCBzcGlfbWVzc2FnZSBtOworCWludCByZXQ7CisKKwlCVUdfT04oIW11dGV4X2lzX2xvY2tlZCgmbWMxMzc4My0+bG9jaykpOworCisJaWYgKG9mZnNldCA+IE1DMTM3ODNfTlVNUkVHUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqdmFsID0gb2Zmc2V0IDw8IE1DMTM3ODNfUkVHT0ZGU0VUX1NISUZUOworCisJbWVtc2V0KCZ0LCAwLCBzaXplb2YodCkpOworCisJdC50eF9idWYgPSB2YWw7CisJdC5yeF9idWYgPSB2YWw7CisJdC5sZW4gPSBzaXplb2YodTMyKTsKIAogCXNwaV9tZXNzYWdlX2luaXQoJm0pOwogCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0LCAmbSk7Ci0JaWYgKHNwaV9zeW5jKHNwaSwgJm0pICE9IDAgfHwgbS5zdGF0dXMgIT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIGxlbiAtIG0uYWN0dWFsX2xlbmd0aDsKKworCXJldCA9IHNwaV9zeW5jKG1jMTM3ODMtPnNwaWRldiwgJm0pOworCisJLyogZXJyb3IgaW4gbWVzc2FnZS5zdGF0dXMgaW1wbGllcyBlcnJvciByZXR1cm4gZnJvbSBzcGlfc3luYyAqLworCUJVR19PTighcmV0ICYmIG0uc3RhdHVzKTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkqdmFsICY9IDB4ZmZmZmZmOworCisJZGV2X3ZkYmcoJm1jMTM3ODMtPnNwaWRldi0+ZGV2LCAiWzB4JTAyeF0gLT4gMHglMDZ4XG4iLCBvZmZzZXQsICp2YWwpOworCisJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKG1jMTM3ODNfcmVnX3JlYWQpOwogCi1zdGF0aWMgaW50IG1jMTM3ODNfcmVhZChzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MywgaW50IHJlZ19udW0sIHUzMiAqcmVnX3ZhbCkKK2ludCBtYzEzNzgzX3JlZ193cml0ZShzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MywgdW5zaWduZWQgaW50IG9mZnNldCwgdTMyIHZhbCkKIHsKLQl1bnNpZ25lZCBpbnQgZnJhbWUgPSAwOwotCWludCByZXQgPSAwOwotCi0JaWYgKHJlZ19udW0gPiBNQzEzNzgzX01BWF9SRUdfTlVNKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWZyYW1lIHw9IHJlZ19udW0gPDwgTUMxMzc4M19SRUdfTlVNX1NISUZUOwotCi0JcmV0ID0gc3BpX3J3KG1jMTM3ODMtPnNwaV9kZXZpY2UsICh1OCAqKSZmcmFtZSwgNCk7Ci0KLQkqcmVnX3ZhbCA9IGZyYW1lICYgTUMxMzc4M19GUkFNRV9NQVNLOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtYzEzNzgzX3dyaXRlKHN0cnVjdCBtYzEzNzgzICptYzEzNzgzLCBpbnQgcmVnX251bSwgdTMyIHJlZ192YWwpCi17Ci0JdW5zaWduZWQgaW50IGZyYW1lID0gMDsKLQotCWlmIChyZWdfbnVtID4gTUMxMzc4M19NQVhfUkVHX05VTSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlmcmFtZSB8PSAoMSA8PCBNQzEzNzgzX1dSSVRFX0JJVF9TSElGVCk7Ci0JZnJhbWUgfD0gcmVnX251bSA8PCBNQzEzNzgzX1JFR19OVU1fU0hJRlQ7Ci0JZnJhbWUgfD0gcmVnX3ZhbCAmIE1DMTM3ODNfRlJBTUVfTUFTSzsKLQotCXJldHVybiBzcGlfcncobWMxMzc4My0+c3BpX2RldmljZSwgKHU4ICopJmZyYW1lLCA0KTsKLX0KLQotaW50IG1jMTM3ODNfcmVnX3JlYWQoc3RydWN0IG1jMTM3ODMgKm1jMTM3ODMsIGludCByZWdfbnVtLCB1MzIgKnJlZ192YWwpCi17CisJdTMyIGJ1ZjsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHQ7CisJc3RydWN0IHNwaV9tZXNzYWdlIG07CiAJaW50IHJldDsKIAotCW11dGV4X2xvY2soJm1jMTM3ODMtPmlvX2xvY2spOwotCXJldCA9IG1jMTM3ODNfcmVhZChtYzEzNzgzLCByZWdfbnVtLCByZWdfdmFsKTsKLQltdXRleF91bmxvY2soJm1jMTM3ODMtPmlvX2xvY2spOworCUJVR19PTighbXV0ZXhfaXNfbG9ja2VkKCZtYzEzNzgzLT5sb2NrKSk7CiAKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTF9HUEwobWMxMzc4M19yZWdfcmVhZCk7CisJZGV2X3ZkYmcoJm1jMTM3ODMtPnNwaWRldi0+ZGV2LCAiWzB4JTAyeF0gPC0gMHglMDZ4XG4iLCBvZmZzZXQsIHZhbCk7CiAKLWludCBtYzEzNzgzX3JlZ193cml0ZShzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MywgaW50IHJlZ19udW0sIHUzMiByZWdfdmFsKQotewotCWludCByZXQ7Ci0KLQltdXRleF9sb2NrKCZtYzEzNzgzLT5pb19sb2NrKTsKLQlyZXQgPSBtYzEzNzgzX3dyaXRlKG1jMTM3ODMsIHJlZ19udW0sIHJlZ192YWwpOwotCW11dGV4X3VubG9jaygmbWMxMzc4My0+aW9fbG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTF9HUEwobWMxMzc4M19yZWdfd3JpdGUpOwotCi0vKioKLSAqIG1jMTM3ODNfc2V0X2JpdHMgLSBCaXRtYXNrIHdyaXRlCi0gKgotICogQG1jMTM3ODM6IFBvaW50ZXIgdG8gbWMxMzc4MyBjb250cm9sIHN0cnVjdHVyZQotICogQHJlZzogICAgUmVnaXN0ZXIgdG8gYWNjZXNzCi0gKiBAbWFzazogICBNYXNrIG9mIGJpdHMgdG8gY2hhbmdlCi0gKiBAdmFsOiAgICBWYWx1ZSB0byBzZXQgZm9yIG1hc2tlZCBiaXRzCi0gKi8KLWludCBtYzEzNzgzX3NldF9iaXRzKHN0cnVjdCBtYzEzNzgzICptYzEzNzgzLCBpbnQgcmVnLCB1MzIgbWFzaywgdTMyIHZhbCkKLXsKLQl1MzIgdG1wOwotCWludCByZXQ7Ci0KLQltdXRleF9sb2NrKCZtYzEzNzgzLT5pb19sb2NrKTsKLQotCXJldCA9IG1jMTM3ODNfcmVhZChtYzEzNzgzLCByZWcsICZ0bXApOwotCXRtcCA9ICh0bXAgJiB+bWFzaykgfCB2YWw7Ci0JaWYgKHJldCA9PSAwKQotCQlyZXQgPSBtYzEzNzgzX3dyaXRlKG1jMTM3ODMsIHJlZywgdG1wKTsKLQotCW11dGV4X3VubG9jaygmbWMxMzc4My0+aW9fbG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTF9HUEwobWMxMzc4M19zZXRfYml0cyk7Ci0KLWludCBtYzEzNzgzX3JlZ2lzdGVyX2lycShzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MywgaW50IGlycSwKLQkJdm9pZCAoKmhhbmRsZXIpIChpbnQsIHZvaWQgKiksIHZvaWQgKmRhdGEpCi17Ci0JaWYgKGlycSA8IDAgfHwgaXJxID4gTUMxMzc4M19OVU1fSVJRIHx8ICFoYW5kbGVyKQorCWlmIChvZmZzZXQgPiBNQzEzNzgzX05VTVJFR1MgfHwgdmFsID4gMHhmZmZmZmYpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKFdBUk5fT04obWMxMzc4My0+aXJxX2hhbmRsZXJbaXJxXS5oYW5kbGVyKSkKKwlidWYgPSAxIDw8IDMxIHwgb2Zmc2V0IDw8IE1DMTM3ODNfUkVHT0ZGU0VUX1NISUZUIHwgdmFsOworCisJbWVtc2V0KCZ0LCAwLCBzaXplb2YodCkpOworCisJdC50eF9idWYgPSAmYnVmOworCXQucnhfYnVmID0gJmJ1ZjsKKwl0LmxlbiA9IHNpemVvZih1MzIpOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbSk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnQsICZtKTsKKworCXJldCA9IHNwaV9zeW5jKG1jMTM3ODMtPnNwaWRldiwgJm0pOworCisJQlVHX09OKCFyZXQgJiYgbS5zdGF0dXMpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChtYzEzNzgzX3JlZ193cml0ZSk7CisKK2ludCBtYzEzNzgzX3JlZ19ybXcoc3RydWN0IG1jMTM3ODMgKm1jMTM3ODMsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCXUzMiBtYXNrLCB1MzIgdmFsKQoreworCWludCByZXQ7CisJdTMyIHZhbHJlYWQ7CisKKwlCVUdfT04odmFsICYgfm1hc2spOworCisJcmV0ID0gbWMxMzc4M19yZWdfcmVhZChtYzEzNzgzLCBvZmZzZXQsICZ2YWxyZWFkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdmFscmVhZCA9ICh2YWxyZWFkICYgfm1hc2spIHwgdmFsOworCisJcmV0dXJuIG1jMTM3ODNfcmVnX3dyaXRlKG1jMTM3ODMsIG9mZnNldCwgdmFscmVhZCk7Cit9CitFWFBPUlRfU1lNQk9MKG1jMTM3ODNfcmVnX3Jtdyk7CisKK2ludCBtYzEzNzgzX21hc2soc3RydWN0IG1jMTM3ODMgKm1jMTM3ODMsIGludCBpcnEpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgb2ZmbWFzayA9IGlycSA8IDI0ID8gTUMxMzc4M19JUlFNQVNLMCA6IE1DMTM3ODNfSVJRTUFTSzE7CisJdTMyIGlycWJpdCA9IDEgPDwgKGlycSA8IDI0ID8gaXJxIDogaXJxIC0gMjQpOworCXUzMiBtYXNrOworCisJaWYgKGlycSA8IDAgfHwgaXJxID49IE1DMTM3ODNfTlVNX0lSUSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBtYzEzNzgzX3JlZ19yZWFkKG1jMTM3ODMsIG9mZm1hc2ssICZtYXNrKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKG1hc2sgJiBpcnFiaXQpCisJCS8qIGFscmVhZHkgbWFza2VkICovCisJCXJldHVybiAwOworCisJcmV0dXJuIG1jMTM3ODNfcmVnX3dyaXRlKG1jMTM3ODMsIG9mZm1hc2ssIG1hc2sgfCBpcnFiaXQpOworfQorRVhQT1JUX1NZTUJPTChtYzEzNzgzX21hc2spOworCitpbnQgbWMxMzc4M191bm1hc2soc3RydWN0IG1jMTM3ODMgKm1jMTM3ODMsIGludCBpcnEpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgb2ZmbWFzayA9IGlycSA8IDI0ID8gTUMxMzc4M19JUlFNQVNLMCA6IE1DMTM3ODNfSVJRTUFTSzE7CisJdTMyIGlycWJpdCA9IDEgPDwgKGlycSA8IDI0ID8gaXJxIDogaXJxIC0gMjQpOworCXUzMiBtYXNrOworCisJaWYgKGlycSA8IDAgfHwgaXJxID49IE1DMTM3ODNfTlVNX0lSUSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBtYzEzNzgzX3JlZ19yZWFkKG1jMTM3ODMsIG9mZm1hc2ssICZtYXNrKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKCEobWFzayAmIGlycWJpdCkpCisJCS8qIGFscmVhZHkgdW5tYXNrZWQgKi8KKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gbWMxMzc4M19yZWdfd3JpdGUobWMxMzc4Mywgb2ZmbWFzaywgbWFzayAmIH5pcnFiaXQpOworfQorRVhQT1JUX1NZTUJPTChtYzEzNzgzX3VubWFzayk7CisKK2ludCBtYzEzNzgzX2lycV9yZXF1ZXN0X25vdW5tYXNrKHN0cnVjdCBtYzEzNzgzICptYzEzNzgzLCBpbnQgaXJxLAorCQlpcnFfaGFuZGxlcl90IGhhbmRsZXIsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRldikKK3sKKwlCVUdfT04oIW11dGV4X2lzX2xvY2tlZCgmbWMxMzc4My0+bG9jaykpOworCUJVR19PTighaGFuZGxlcik7CisKKwlpZiAoaXJxIDwgMCB8fCBpcnEgPj0gTUMxMzc4M19OVU1fSVJRKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChtYzEzNzgzLT5pcnFoYW5kbGVyW2lycV0pCiAJCXJldHVybiAtRUJVU1k7CiAKLQltdXRleF9sb2NrKCZtYzEzNzgzLT5pb19sb2NrKTsKLQltYzEzNzgzLT5pcnFfaGFuZGxlcltpcnFdLmhhbmRsZXIgPSBoYW5kbGVyOwotCW1jMTM3ODMtPmlycV9oYW5kbGVyW2lycV0uZGF0YSA9IGRhdGE7Ci0JbXV0ZXhfdW5sb2NrKCZtYzEzNzgzLT5pb19sb2NrKTsKKwltYzEzNzgzLT5pcnFoYW5kbGVyW2lycV0gPSBoYW5kbGVyOworCW1jMTM3ODMtPmlycWRhdGFbaXJxXSA9IGRldjsKIAogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTF9HUEwobWMxMzc4M19yZWdpc3Rlcl9pcnEpOworRVhQT1JUX1NZTUJPTChtYzEzNzgzX2lycV9yZXF1ZXN0X25vdW5tYXNrKTsKIAotaW50IG1jMTM3ODNfZnJlZV9pcnEoc3RydWN0IG1jMTM3ODMgKm1jMTM3ODMsIGludCBpcnEpCitpbnQgbWMxMzc4M19pcnFfcmVxdWVzdChzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MywgaW50IGlycSwKKwkJaXJxX2hhbmRsZXJfdCBoYW5kbGVyLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpkZXYpCiB7Ci0JaWYgKGlycSA8IDAgfHwgaXJxID4gTUMxMzc4M19OVU1fSVJRKQorCWludCByZXQ7CisKKwlyZXQgPSBtYzEzNzgzX2lycV9yZXF1ZXN0X25vdW5tYXNrKG1jMTM3ODMsIGlycSwgaGFuZGxlciwgbmFtZSwgZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbWMxMzc4M191bm1hc2sobWMxMzc4MywgaXJxKTsKKwlpZiAocmV0KSB7CisJCW1jMTM3ODMtPmlycWhhbmRsZXJbaXJxXSA9IE5VTEw7CisJCW1jMTM3ODMtPmlycWRhdGFbaXJxXSA9IE5VTEw7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKG1jMTM3ODNfaXJxX3JlcXVlc3QpOworCitpbnQgbWMxMzc4M19pcnFfZnJlZShzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MywgaW50IGlycSwgdm9pZCAqZGV2KQoreworCWludCByZXQ7CisJQlVHX09OKCFtdXRleF9pc19sb2NrZWQoJm1jMTM3ODMtPmxvY2spKTsKKworCWlmIChpcnEgPCAwIHx8IGlycSA+PSBNQzEzNzgzX05VTV9JUlEgfHwgIW1jMTM3ODMtPmlycWhhbmRsZXJbaXJxXSB8fAorCQkJbWMxMzc4My0+aXJxZGF0YVtpcnFdICE9IGRldikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQltdXRleF9sb2NrKCZtYzEzNzgzLT5pb19sb2NrKTsKLQltYzEzNzgzLT5pcnFfaGFuZGxlcltpcnFdLmhhbmRsZXIgPSBOVUxMOwotCW11dGV4X3VubG9jaygmbWMxMzc4My0+aW9fbG9jayk7CisJcmV0ID0gbWMxMzc4M19tYXNrKG1jMTM3ODMsIGlycSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW1jMTM3ODMtPmlycWhhbmRsZXJbaXJxXSA9IE5VTEw7CisJbWMxMzc4My0+aXJxZGF0YVtpcnFdID0gTlVMTDsKIAogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTF9HUEwobWMxMzc4M19mcmVlX2lycSk7CitFWFBPUlRfU1lNQk9MKG1jMTM3ODNfaXJxX2ZyZWUpOwogCi1zdGF0aWMgdm9pZCBtYzEzNzgzX2lycV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyBpbmxpbmUgaXJxcmV0dXJuX3QgbWMxMzc4M19pcnFoYW5kbGVyKHN0cnVjdCBtYzEzNzgzICptYzEzNzgzLCBpbnQgaXJxKQogewotCXN0cnVjdCBtYzEzNzgzICptYzEzNzgzID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBtYzEzNzgzLCB3b3JrKTsKLQlpbnQgaTsKLQl1bnNpZ25lZCBpbnQgYWRjX3N0czsKLQotCS8qIGNoZWNrIGlmIHRoZSBhZGMgaGFzIGZpbmlzaGVkIGFueSBjb21wbGV0aW9uICovCi0JbWMxMzc4M19yZWdfcmVhZChtYzEzNzgzLCBNQzEzNzgzX1JFR19JTlRFUlJVUFRfU1RBVFVTXzAsICZhZGNfc3RzKTsKLQltYzEzNzgzX3JlZ193cml0ZShtYzEzNzgzLCBNQzEzNzgzX1JFR19JTlRFUlJVUFRfU1RBVFVTXzAsCi0JCQlhZGNfc3RzICYgTUMxMzc4M19JTlRfU1RBVF9BRENET05FSSk7Ci0KLQlpZiAoYWRjX3N0cyAmIE1DMTM3ODNfSU5UX1NUQVRfQURDRE9ORUkpCi0JCWNvbXBsZXRlX2FsbCgmbWMxMzc4My0+YWRjX2RvbmUpOwotCi0JZm9yIChpID0gMDsgaSA8IE1DMTM3ODNfTlVNX0lSUTsgaSsrKQotCQlpZiAobWMxMzc4My0+aXJxX2hhbmRsZXJbaV0uaGFuZGxlcikKLQkJCW1jMTM3ODMtPmlycV9oYW5kbGVyW2ldLmhhbmRsZXIoaSwKLQkJCQkJbWMxMzc4My0+aXJxX2hhbmRsZXJbaV0uZGF0YSk7Ci0JZW5hYmxlX2lycShtYzEzNzgzLT5pcnEpOworCXJldHVybiBtYzEzNzgzLT5pcnFoYW5kbGVyW2lycV0oaXJxLCBtYzEzNzgzLT5pcnFkYXRhW2lycV0pOwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QgbWMxMzc4M19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoraW50IG1jMTM3ODNfYWNraXJxKHN0cnVjdCBtYzEzNzgzICptYzEzNzgzLCBpbnQgaXJxKQogewotCXN0cnVjdCBtYzEzNzgzICptYzEzNzgzID0gZGV2X2lkOworCXVuc2lnbmVkIGludCBvZmZzdGF0ID0gaXJxIDwgMjQgPyBNQzEzNzgzX0lSUVNUQVQwIDogTUMxMzc4M19JUlFTVEFUMTsKKwl1bnNpZ25lZCBpbnQgdmFsID0gMSA8PCAoaXJxIDwgMjQgPyBpcnEgOiBpcnEgLSAyNCk7CiAKLQlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKKwlCVUdfT04oaXJxIDwgMCB8fCBpcnEgPj0gTUMxMzc4M19OVU1fSVJRKTsKIAotCXNjaGVkdWxlX3dvcmsoJm1jMTM3ODMtPndvcmspOworCXJldHVybiBtYzEzNzgzX3JlZ193cml0ZShtYzEzNzgzLCBvZmZzdGF0LCB2YWwpOworfQorRVhQT1JUX1NZTUJPTChtYzEzNzgzX2Fja2lycSk7CisKKy8qCisgKiByZXR1cm5zOiBudW1iZXIgb2YgaGFuZGxlZCBpcnFzIG9yIG5lZ2F0aXZlIGVycm9yCisgKiBsb2NraW5nOiBob2xkcyBtYzEzNzgzLT5sb2NrCisgKi8KK3N0YXRpYyBpbnQgbWMxMzc4M19pcnFfaGFuZGxlKHN0cnVjdCBtYzEzNzgzICptYzEzNzgzLAorCQl1bnNpZ25lZCBpbnQgb2Zmc3RhdCwgdW5zaWduZWQgaW50IG9mZm1hc2ssIGludCBiYXNlaXJxKQoreworCXUzMiBzdGF0LCBtYXNrOworCWludCByZXQgPSBtYzEzNzgzX3JlZ19yZWFkKG1jMTM3ODMsIG9mZnN0YXQsICZzdGF0KTsKKwlpbnQgbnVtX2hhbmRsZWQgPSAwOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG1jMTM3ODNfcmVnX3JlYWQobWMxMzc4Mywgb2ZmbWFzaywgJm1hc2spOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl3aGlsZSAoc3RhdCAmIH5tYXNrKSB7CisJCWludCBpcnEgPSBfX2ZmcyhzdGF0ICYgfm1hc2spOworCisJCXN0YXQgJj0gfigxIDw8IGlycSk7CisKKwkJaWYgKGxpa2VseShtYzEzNzgzLT5pcnFoYW5kbGVyW2Jhc2VpcnEgKyBpcnFdKSkgeworCQkJaXJxcmV0dXJuX3QgaGFuZGxlZDsKKworCQkJaGFuZGxlZCA9IG1jMTM3ODNfaXJxaGFuZGxlcihtYzEzNzgzLCBiYXNlaXJxICsgaXJxKTsKKwkJCWlmIChoYW5kbGVkID09IElSUV9IQU5ETEVEKQorCQkJCW51bV9oYW5kbGVkKys7CisJCX0gZWxzZSB7CisJCQlkZXZfZXJyKCZtYzEzNzgzLT5zcGlkZXYtPmRldiwKKwkJCQkJIkJVRzogaXJxICV1IGJ1dCBubyBoYW5kbGVyXG4iLAorCQkJCQliYXNlaXJxICsgaXJxKTsKKworCQkJbWFzayB8PSAxIDw8IGlycTsKKworCQkJcmV0ID0gbWMxMzc4M19yZWdfd3JpdGUobWMxMzc4Mywgb2ZmbWFzaywgbWFzayk7CisJCX0KKwl9CisKKwlyZXR1cm4gbnVtX2hhbmRsZWQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBtYzEzNzgzX2lycV90aHJlYWQoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MyA9IGRhdGE7CisJaXJxcmV0dXJuX3QgcmV0OworCWludCBoYW5kbGVkID0gMDsKKworCW1jMTM3ODNfbG9jayhtYzEzNzgzKTsKKworCXJldCA9IG1jMTM3ODNfaXJxX2hhbmRsZShtYzEzNzgzLCBNQzEzNzgzX0lSUVNUQVQwLAorCQkJTUMxMzc4M19JUlFNQVNLMCwgTUMxMzc4M19JUlFfQURDRE9ORSk7CisJaWYgKHJldCA+IDApCisJCWhhbmRsZWQgPSAxOworCisJcmV0ID0gbWMxMzc4M19pcnFfaGFuZGxlKG1jMTM3ODMsIE1DMTM3ODNfSVJRU1RBVDEsCisJCQlNQzEzNzgzX0lSUU1BU0sxLCBNQzEzNzgzX0lSUV8xSFopOworCWlmIChyZXQgPiAwKQorCQloYW5kbGVkID0gMTsKKworCW1jMTM3ODNfdW5sb2NrKG1jMTM3ODMpOworCisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKyNkZWZpbmUgTUMxMzc4M19BREMxX0NIQU4wX1NISUZUCTUKKyNkZWZpbmUgTUMxMzc4M19BREMxX0NIQU4xX1NISUZUCTgKKworc3RydWN0IG1jMTM3ODNfYWRjZG9uZV9kYXRhIHsKKwlzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MzsKKwlzdHJ1Y3QgY29tcGxldGlvbiBkb25lOworfTsKKworc3RhdGljIGlycXJldHVybl90IG1jMTM3ODNfaGFuZGxlcl9hZGNkb25lKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG1jMTM3ODNfYWRjZG9uZV9kYXRhICphZGNkb25lX2RhdGEgPSBkYXRhOworCisJbWMxMzc4M19hY2tpcnEoYWRjZG9uZV9kYXRhLT5tYzEzNzgzLCBpcnEpOworCisJY29tcGxldGVfYWxsKCZhZGNkb25lX2RhdGEtPmRvbmUpOworCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi0vKiBzZXQgYWRjIHRvIHRzIGludGVycnVwdCBtb2RlLCB3aGljaCBnZW5lcmF0ZXMgdG91Y2hzY3JlZW4gd2FrZXVwIGludGVycnVwdCAqLwotc3RhdGljIGlubGluZSB2b2lkIG1jMTM3ODNfYWRjX3NldF90c19pcnFfbW9kZShzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MykKLXsKLQl1bnNpZ25lZCBpbnQgcmVnX2FkYzAsIHJlZ19hZGMxOwotCi0JcmVnX2FkYzAgPSBNQzEzNzgzX0FEQzBfQURSRUZFTiB8IE1DMTM3ODNfQURDMF9BRFJFRk1PREUKLQkJCXwgTUMxMzc4M19BREMwX1RTTU9EMDsKLQlyZWdfYWRjMSA9IE1DMTM3ODNfQURDMV9BREVOIHwgTUMxMzc4M19BREMxX0FEVFJJR0lHTjsKLQotCW1jMTM3ODNfcmVnX3dyaXRlKG1jMTM3ODMsIE1DMTM3ODNfUkVHX0FEQ18wLCByZWdfYWRjMCk7Ci0JbWMxMzc4M19yZWdfd3JpdGUobWMxMzc4MywgTUMxMzc4M19SRUdfQURDXzEsIHJlZ19hZGMxKTsKLX0KKyNkZWZpbmUgTUMxMzc4M19BRENfV09SS0lORyAoMSA8PCAxNikKIAogaW50IG1jMTM3ODNfYWRjX2RvX2NvbnZlcnNpb24oc3RydWN0IG1jMTM3ODMgKm1jMTM3ODMsIHVuc2lnbmVkIGludCBtb2RlLAogCQl1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50ICpzYW1wbGUpCiB7Ci0JdW5zaWduZWQgaW50IHJlZ19hZGMwLCByZWdfYWRjMTsKLQlpbnQgaTsKKwl1MzIgYWRjMCwgYWRjMSwgb2xkX2FkYzA7CisJaW50IGksIHJldDsKKwlzdHJ1Y3QgbWMxMzc4M19hZGNkb25lX2RhdGEgYWRjZG9uZV9kYXRhID0geworCQkubWMxMzc4MyA9IG1jMTM3ODMsCisJfTsKKwlpbml0X2NvbXBsZXRpb24oJmFkY2RvbmVfZGF0YS5kb25lKTsKIAotCW11dGV4X2xvY2soJm1jMTM3ODMtPmFkY19jb252X2xvY2spOworCWRldl9kYmcoJm1jMTM3ODMtPnNwaWRldi0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAotCS8qIHNldCB1cCBhdXRvIGluY3JlbWVudGluZyBhbnl3YXkgdG8gbWFrZSBxdWljayByZWFkICovCi0JcmVnX2FkYzAgPSAgTUMxMzc4M19BREMwX0FESU5DMSB8IE1DMTM3ODNfQURDMF9BRElOQzI7Ci0JLyogZW5hYmxlIHRoZSBhZGMsIGlnbm9yZSBleHRlcm5hbCB0cmlnZ2VyaW5nIGFuZCBzZXQgQVNDIHRvIHRyaWdnZXIKLQkgKiBjb252ZXJzaW9uICovCi0JcmVnX2FkYzEgPSAgTUMxMzc4M19BREMxX0FERU4gfCBNQzEzNzgzX0FEQzFfQURUUklHSUdOCi0JCXwgTUMxMzc4M19BREMxX0FTQzsKKwltYzEzNzgzX2xvY2sobWMxMzc4Myk7CiAKLQkvKiBzZXR1cCBjaGFubmVsIG51bWJlciAqLworCWlmIChtYzEzNzgzLT5mbGFncyAmIE1DMTM3ODNfQURDX1dPUktJTkcpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwltYzEzNzgzLT5mbGFncyB8PSBNQzEzNzgzX0FEQ19XT1JLSU5HOworCisJbWMxMzc4M19yZWdfcmVhZChtYzEzNzgzLCBNQzEzNzgzX0FEQzAsICZvbGRfYWRjMCk7CisKKwlhZGMwID0gTUMxMzc4M19BREMwX0FESU5DMSB8IE1DMTM3ODNfQURDMF9BRElOQzI7CisJYWRjMSA9IE1DMTM3ODNfQURDMV9BREVOIHwgTUMxMzc4M19BREMxX0FEVFJJR0lHTiB8IE1DMTM3ODNfQURDMV9BU0M7CisKIAlpZiAoY2hhbm5lbCA+IDcpCi0JCXJlZ19hZGMxIHw9IE1DMTM3ODNfQURDMV9BRFNFTDsKKwkJYWRjMSB8PSBNQzEzNzgzX0FEQzFfQURTRUw7CiAKIAlzd2l0Y2ggKG1vZGUpIHsKIAljYXNlIE1DMTM3ODNfQURDX01PREVfVFM6Ci0JCS8qIGVuYWJsZXMgdG91Y2ggc2NyZWVuIHJlZmVyZW5jZSBtb2RlIGFuZCBzZXQgdG91Y2hzY3JlZW4gbW9kZQotCQkgKiB0byBwb3NpdGlvbiBtb2RlICovCi0JCXJlZ19hZGMwIHw9IE1DMTM3ODNfQURDMF9BRFJFRkVOIHwgTUMxMzc4M19BREMwX0FEUkVGTU9ERQotCQkJfCBNQzEzNzgzX0FEQzBfVFNNT0QwIHwgTUMxMzc4M19BREMwX1RTTU9EMTsKLQkJcmVnX2FkYzEgfD0gNCA8PCBNQzEzNzgzX0FEQzFfQ0hBTjFfU0hJRlQ7CisJCWFkYzAgfD0gTUMxMzc4M19BREMwX0FEUkVGRU4gfCBNQzEzNzgzX0FEQzBfVFNNT0QwIHwKKwkJCU1DMTM3ODNfQURDMF9UU01PRDE7CisJCWFkYzEgfD0gNCA8PCBNQzEzNzgzX0FEQzFfQ0hBTjFfU0hJRlQ7CiAJCWJyZWFrOworCiAJY2FzZSBNQzEzNzgzX0FEQ19NT0RFX1NJTkdMRV9DSEFOOgotCQlyZWdfYWRjMSB8PSAoY2hhbm5lbCAmIDB4NykgPDwgTUMxMzc4M19BREMxX0NIQU4wX1NISUZUOwotCQlyZWdfYWRjMSB8PSBNQzEzNzgzX0FEQzFfUkFORDsKKwkJYWRjMCB8PSBvbGRfYWRjMCAmIE1DMTM3ODNfQURDMF9UU01PRF9NQVNLOworCQlhZGMxIHw9IChjaGFubmVsICYgMHg3KSA8PCBNQzEzNzgzX0FEQzFfQ0hBTjBfU0hJRlQ7CisJCWFkYzEgfD0gTUMxMzc4M19BREMxX1JBTkQ7CiAJCWJyZWFrOworCiAJY2FzZSBNQzEzNzgzX0FEQ19NT0RFX01VTFRfQ0hBTjoKLQkJcmVnX2FkYzEgfD0gNCA8PCBNQzEzNzgzX0FEQzFfQ0hBTjFfU0hJRlQ7CisJCWFkYzAgfD0gb2xkX2FkYzAgJiBNQzEzNzgzX0FEQzBfVFNNT0RfTUFTSzsKKwkJYWRjMSB8PSA0IDw8IE1DMTM3ODNfQURDMV9DSEFOMV9TSElGVDsKIAkJYnJlYWs7CisKIAlkZWZhdWx0OgorCQltYzEzNzgzX3VubG9jayhtYzEzNzgzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbWMxMzc4M19yZWdfd3JpdGUobWMxMzc4MywgTUMxMzc4M19SRUdfQURDXzAsIHJlZ19hZGMwKTsKLQltYzEzNzgzX3JlZ193cml0ZShtYzEzNzgzLCBNQzEzNzgzX1JFR19BRENfMSwgcmVnX2FkYzEpOworCWRldl9kYmcoJm1jMTM3ODMtPnNwaWRldi0+ZGV2LCAiJXM6IHJlcXVlc3QgaXJxXG4iLCBfX2Z1bmNfXyk7CisJbWMxMzc4M19pcnFfcmVxdWVzdChtYzEzNzgzLCBNQzEzNzgzX0lSUV9BRENET05FLAorCQkJbWMxMzc4M19oYW5kbGVyX2FkY2RvbmUsIF9fZnVuY19fLCAmYWRjZG9uZV9kYXRhKTsKKwltYzEzNzgzX2Fja2lycShtYzEzNzgzLCBNQzEzNzgzX0lSUV9BRENET05FKTsKIAotCXdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmbWMxMzc4My0+YWRjX2RvbmUpOworCW1jMTM3ODNfcmVnX3dyaXRlKG1jMTM3ODMsIE1DMTM3ODNfUkVHX0FEQ18wLCBhZGMwKTsKKwltYzEzNzgzX3JlZ193cml0ZShtYzEzNzgzLCBNQzEzNzgzX1JFR19BRENfMSwgYWRjMSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCQltYzEzNzgzX3JlZ19yZWFkKG1jMTM3ODMsIE1DMTM3ODNfUkVHX0FEQ18yLCAmc2FtcGxlW2ldKTsKKwltYzEzNzgzX3VubG9jayhtYzEzNzgzKTsKIAotCWlmIChtYzEzNzgzLT50c19hY3RpdmUpCi0JCW1jMTM3ODNfYWRjX3NldF90c19pcnFfbW9kZShtYzEzNzgzKTsKKwlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmYWRjZG9uZV9kYXRhLmRvbmUsIEhaKTsKIAotCW11dGV4X3VubG9jaygmbWMxMzc4My0+YWRjX2NvbnZfbG9jayk7CisJaWYgKCFyZXQpCisJCXJldCA9IC1FVElNRURPVVQ7CiAKLQlyZXR1cm4gMDsKKwltYzEzNzgzX2xvY2sobWMxMzc4Myk7CisKKwltYzEzNzgzX2lycV9mcmVlKG1jMTM3ODMsIE1DMTM3ODNfSVJRX0FEQ0RPTkUsICZhZGNkb25lX2RhdGEpOworCisJaWYgKHJldCA+IDApCisJCWZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKwkJCXJldCA9IG1jMTM3ODNfcmVnX3JlYWQobWMxMzc4MywKKwkJCQkJTUMxMzc4M19SRUdfQURDXzIsICZzYW1wbGVbaV0pOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJfQorCisJaWYgKG1vZGUgPT0gTUMxMzc4M19BRENfTU9ERV9UUykKKwkJLyogcmVzdG9yZSBUU01PRCAqLworCQltYzEzNzgzX3JlZ193cml0ZShtYzEzNzgzLCBNQzEzNzgzX1JFR19BRENfMCwgb2xkX2FkYzApOworCisJbWMxMzc4My0+ZmxhZ3MgJj0gfk1DMTM3ODNfQURDX1dPUktJTkc7CitvdXQ6CisJbWMxMzc4M191bmxvY2sobWMxMzc4Myk7CisKKwlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwobWMxMzc4M19hZGNfZG9fY29udmVyc2lvbik7CiAKLXZvaWQgbWMxMzc4M19hZGNfc2V0X3RzX3N0YXR1cyhzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MywgdW5zaWduZWQgaW50IHN0YXR1cykKK3N0YXRpYyBpbnQgbWMxMzc4M19hZGRfc3ViZGV2aWNlX3BkYXRhKHN0cnVjdCBtYzEzNzgzICptYzEzNzgzLAorCQljb25zdCBjaGFyICpuYW1lLCB2b2lkICpwZGF0YSwgc2l6ZV90IHBkYXRhX3NpemUpCiB7Ci0JbWMxMzc4My0+dHNfYWN0aXZlID0gc3RhdHVzOworCXN0cnVjdCBtZmRfY2VsbCBjZWxsID0geworCQkubmFtZSA9IG5hbWUsCisJCS5wbGF0Zm9ybV9kYXRhID0gcGRhdGEsCisJCS5kYXRhX3NpemUgPSBwZGF0YV9zaXplLAorCX07CisKKwlyZXR1cm4gbWZkX2FkZF9kZXZpY2VzKCZtYzEzNzgzLT5zcGlkZXYtPmRldiwgLTEsICZjZWxsLCAxLCBOVUxMLCAwKTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKG1jMTM3ODNfYWRjX3NldF90c19zdGF0dXMpOworCitzdGF0aWMgaW50IG1jMTM3ODNfYWRkX3N1YmRldmljZShzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MywgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gbWMxMzc4M19hZGRfc3ViZGV2aWNlX3BkYXRhKG1jMTM3ODMsIG5hbWUsIE5VTEwsIDApOworfQogCiBzdGF0aWMgaW50IG1jMTM3ODNfY2hlY2tfcmV2aXNpb24oc3RydWN0IG1jMTM3ODMgKm1jMTM3ODMpCiB7CiAJdTMyIHJldl9pZCwgcmV2MSwgcmV2MiwgZmluaWQsIGljaWQ7CiAKLQltYzEzNzgzX3JlYWQobWMxMzc4MywgTUMxMzc4M19SRUdfUkVWSVNJT04sICZyZXZfaWQpOworCW1jMTM3ODNfcmVnX3JlYWQobWMxMzc4MywgTUMxMzc4M19SRUdfUkVWSVNJT04sICZyZXZfaWQpOwogCiAJcmV2MSA9IChyZXZfaWQgJiAweDAxOCkgPj4gMzsKIAlyZXYyID0gKHJldl9pZCAmIDB4MDA3KTsKQEAgLTI5MiwzOCArNTU1LDI0IEBACiAJCXJldjEgPSAzOwogCiAJaWYgKHJldjEgPT0gMCB8fCBpY2lkICE9IDIpIHsKLQkJZGV2X2VycihtYzEzNzgzLT5kZXYsICJObyBNQzEzNzgzIGRldGVjdGVkLlxuIik7CisJCWRldl9lcnIoJm1jMTM3ODMtPnNwaWRldi0+ZGV2LCAiTm8gTUMxMzc4MyBkZXRlY3RlZC5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQltYzEzNzgzLT5yZXZpc2lvbiA9ICgocmV2MSAqIDEwKSArIHJldjIpOwotCWRldl9pbmZvKG1jMTM3ODMtPmRldiwgIk1DMTM3ODMgUmV2ICVkLiVkIEZpblZlciAleCBkZXRlY3RlZFxuIiwgcmV2MSwKLQkgICAgICAgcmV2MiwgZmluaWQpOworCWRldl9pbmZvKCZtYzEzNzgzLT5zcGlkZXYtPmRldiwKKwkJCSJNQzEzNzgzIFJldiAlZC4lZCBGaW5WZXIgJXggZGV0ZWN0ZWRcbiIsCisJCQlyZXYxLCByZXYyLCBmaW5pZCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIFJlZ2lzdGVyIGEgY2xpZW50IGRldmljZS4gIFRoaXMgaXMgbm9uLWZhdGFsIHNpbmNlIHRoZXJlIGlzIG5vIG5lZWQgdG8KLSAqIGZhaWwgdGhlIGVudGlyZSBkZXZpY2UgaW5pdCBkdWUgdG8gYSBzaW5nbGUgcGxhdGZvcm0gZGV2aWNlIGZhaWxpbmcuCi0gKi8KLXN0YXRpYyB2b2lkIG1jMTM3ODNfY2xpZW50X2Rldl9yZWdpc3RlcihzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MywKLQkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgbWZkX2NlbGwgY2VsbCA9IHt9OwotCi0JY2VsbC5uYW1lID0gbmFtZTsKLQotCW1mZF9hZGRfZGV2aWNlcyhtYzEzNzgzLT5kZXYsIC0xLCAmY2VsbCwgMSwgTlVMTCwgMCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IG1jMTM3ODNfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3N0YXRpYyBpbnQgbWMxMzc4M19wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCXN0cnVjdCBtYzEzNzgzICptYzEzNzgzOwotCXN0cnVjdCBtYzEzNzgzX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgbWMxMzc4M19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnNwaS0+ZGV2KTsKIAlpbnQgcmV0OwogCi0JbWMxMzc4MyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtYzEzNzgzKSwgR0ZQX0tFUk5FTCk7CisJbWMxMzc4MyA9IGt6YWxsb2Moc2l6ZW9mKCptYzEzNzgzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtYzEzNzgzKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMzMyLDk2ICs1ODEsMTA0IEBACiAJc3BpLT5iaXRzX3Blcl93b3JkID0gMzI7CiAJc3BpX3NldHVwKHNwaSk7CiAKLQltYzEzNzgzLT5zcGlfZGV2aWNlID0gc3BpOwotCW1jMTM3ODMtPmRldiA9ICZzcGktPmRldjsKLQltYzEzNzgzLT5pcnEgPSBzcGktPmlycTsKKwltYzEzNzgzLT5zcGlkZXYgPSBzcGk7CiAKLQlJTklUX1dPUksoJm1jMTM3ODMtPndvcmssIG1jMTM3ODNfaXJxX3dvcmspOwotCW11dGV4X2luaXQoJm1jMTM3ODMtPmlvX2xvY2spOwotCW11dGV4X2luaXQoJm1jMTM3ODMtPmFkY19jb252X2xvY2spOwotCWluaXRfY29tcGxldGlvbigmbWMxMzc4My0+YWRjX2RvbmUpOworCW11dGV4X2luaXQoJm1jMTM3ODMtPmxvY2spOworCW1jMTM3ODNfbG9jayhtYzEzNzgzKTsKIAorCXJldCA9IG1jMTM3ODNfY2hlY2tfcmV2aXNpb24obWMxMzc4Myk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcmV2aXNpb247CisKKwkvKiBtYXNrIGFsbCBpcnFzICovCisJcmV0ID0gbWMxMzc4M19yZWdfd3JpdGUobWMxMzc4MywgTUMxMzc4M19JUlFNQVNLMCwgMHgwMGZmZmZmZik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfbWFzazsKKworCXJldCA9IG1jMTM3ODNfcmVnX3dyaXRlKG1jMTM3ODMsIE1DMTM3ODNfSVJRTUFTSzEsIDB4MDBmZmZmZmYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX21hc2s7CisKKwlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShzcGktPmlycSwgTlVMTCwgbWMxMzc4M19pcnFfdGhyZWFkLAorCQkJSVJRRl9PTkVTSE9UIHwgSVJRRl9UUklHR0VSX0hJR0gsICJtYzEzNzgzIiwgbWMxMzc4Myk7CisKKwlpZiAocmV0KSB7CitlcnJfbWFzazoKK2Vycl9yZXZpc2lvbjoKKwkJbXV0ZXhfdW5sb2NrKCZtYzEzNzgzLT5sb2NrKTsKKwkJZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgTlVMTCk7CisJCWtmcmVlKG1jMTM3ODMpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFRoaXMgc2hvdWxkIGdvIGF3YXkgKEJFR0lOKSAqLwogCWlmIChwZGF0YSkgewogCQltYzEzNzgzLT5mbGFncyA9IHBkYXRhLT5mbGFnczsKIAkJbWMxMzc4My0+cmVndWxhdG9ycyA9IHBkYXRhLT5yZWd1bGF0b3JzOwogCQltYzEzNzgzLT5udW1fcmVndWxhdG9ycyA9IHBkYXRhLT5udW1fcmVndWxhdG9yczsKIAl9CisJLyogVGhpcyBzaG91bGQgZ28gYXdheSAoRU5EKSAqLwogCi0JaWYgKG1jMTM3ODNfY2hlY2tfcmV2aXNpb24obWMxMzc4MykpIHsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBlcnJfb3V0OworCWlmIChwZGF0YS0+ZmxhZ3MgJiBNQzEzNzgzX1VTRV9BREMpCisJCW1jMTM3ODNfYWRkX3N1YmRldmljZShtYzEzNzgzLCAibWMxMzc4My1hZGMiKTsKKworCWlmIChwZGF0YS0+ZmxhZ3MgJiBNQzEzNzgzX1VTRV9DT0RFQykKKwkJbWMxMzc4M19hZGRfc3ViZGV2aWNlKG1jMTM3ODMsICJtYzEzNzgzLWNvZGVjIik7CisKKwlpZiAocGRhdGEtPmZsYWdzICYgTUMxMzc4M19VU0VfUkVHVUxBVE9SKSB7CisJCXN0cnVjdCBtYzEzNzgzX3JlZ3VsYXRvcl9wbGF0Zm9ybV9kYXRhIHJlZ3VsYXRvcl9wZGF0YSA9IHsKKwkJCS5udW1fcmVndWxhdG9ycyA9IHBkYXRhLT5udW1fcmVndWxhdG9ycywKKwkJCS5yZWd1bGF0b3JzID0gcGRhdGEtPnJlZ3VsYXRvcnMsCisJCX07CisKKwkJbWMxMzc4M19hZGRfc3ViZGV2aWNlX3BkYXRhKG1jMTM3ODMsICJtYzEzNzgzLXJlZ3VsYXRvciIsCisJCQkJJnJlZ3VsYXRvcl9wZGF0YSwgc2l6ZW9mKHJlZ3VsYXRvcl9wZGF0YSkpOwogCX0KIAotCS8qIGNsZWFyIGFuZCBtYXNrIGFsbCBpbnRlcnJ1cHRzICovCi0JbWMxMzc4M19yZWdfd3JpdGUobWMxMzc4MywgTUMxMzc4M19SRUdfSU5URVJSVVBUX1NUQVRVU18wLCAweDAwZmZmZmZmKTsKLQltYzEzNzgzX3JlZ193cml0ZShtYzEzNzgzLCBNQzEzNzgzX1JFR19JTlRFUlJVUFRfTUFTS18wLCAweDAwZmZmZmZmKTsKLQltYzEzNzgzX3JlZ193cml0ZShtYzEzNzgzLCBNQzEzNzgzX1JFR19JTlRFUlJVUFRfU1RBVFVTXzEsIDB4MDBmZmZmZmYpOwotCW1jMTM3ODNfcmVnX3dyaXRlKG1jMTM3ODMsIE1DMTM3ODNfUkVHX0lOVEVSUlVQVF9NQVNLXzEsIDB4MDBmZmZmZmYpOworCWlmIChwZGF0YS0+ZmxhZ3MgJiBNQzEzNzgzX1VTRV9SVEMpCisJCW1jMTM3ODNfYWRkX3N1YmRldmljZShtYzEzNzgzLCAibWMxMzc4My1ydGMiKTsKIAotCS8qIHVubWFzayBhZGNkb25lIGludGVycnVwdHMgKi8KLQltYzEzNzgzX3NldF9iaXRzKG1jMTM3ODMsIE1DMTM3ODNfUkVHX0lOVEVSUlVQVF9NQVNLXzAsCi0JCQlNQzEzNzgzX0lOVF9NQVNLX0FEQ0RPTkVNLCAwKTsKKwlpZiAocGRhdGEtPmZsYWdzICYgTUMxMzc4M19VU0VfVE9VQ0hTQ1JFRU4pCisJCW1jMTM3ODNfYWRkX3N1YmRldmljZShtYzEzNzgzLCAibWMxMzc4My10cyIpOwogCi0JcmV0ID0gcmVxdWVzdF9pcnEobWMxMzc4My0+aXJxLCBtYzEzNzgzX2ludGVycnVwdCwKLQkJCUlSUUZfRElTQUJMRUQgfCBJUlFGX1RSSUdHRVJfSElHSCwgIm1jMTM3ODMiLAotCQkJbWMxMzc4Myk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfb3V0OwotCi0JaWYgKG1jMTM3ODMtPmZsYWdzICYgTUMxMzc4M19VU0VfQ09ERUMpCi0JCW1jMTM3ODNfY2xpZW50X2Rldl9yZWdpc3RlcihtYzEzNzgzLCAibWMxMzc4My1jb2RlYyIpOwotCWlmIChtYzEzNzgzLT5mbGFncyAmIE1DMTM3ODNfVVNFX0FEQykKLQkJbWMxMzc4M19jbGllbnRfZGV2X3JlZ2lzdGVyKG1jMTM3ODMsICJtYzEzNzgzLWFkYyIpOwotCWlmIChtYzEzNzgzLT5mbGFncyAmIE1DMTM3ODNfVVNFX1JUQykKLQkJbWMxMzc4M19jbGllbnRfZGV2X3JlZ2lzdGVyKG1jMTM3ODMsICJtYzEzNzgzLXJ0YyIpOwotCWlmIChtYzEzNzgzLT5mbGFncyAmIE1DMTM3ODNfVVNFX1JFR1VMQVRPUikKLQkJbWMxMzc4M19jbGllbnRfZGV2X3JlZ2lzdGVyKG1jMTM3ODMsICJtYzEzNzgzLXJlZ3VsYXRvciIpOwotCWlmIChtYzEzNzgzLT5mbGFncyAmIE1DMTM3ODNfVVNFX1RPVUNIU0NSRUVOKQotCQltYzEzNzgzX2NsaWVudF9kZXZfcmVnaXN0ZXIobWMxMzc4MywgIm1jMTM3ODMtdHMiKTsKKwltYzEzNzgzX3VubG9jayhtYzEzNzgzKTsKIAogCXJldHVybiAwOwotCi1lcnJfb3V0OgotCWtmcmVlKG1jMTM3ODMpOwotCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IG1jMTM3ODNfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7Ci0Jc3RydWN0IG1jMTM3ODMgKm1jMTM3ODM7CisJc3RydWN0IG1jMTM3ODMgKm1jMTM3ODMgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKIAotCW1jMTM3ODMgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKLQotCWZyZWVfaXJxKG1jMTM3ODMtPmlycSwgbWMxMzc4Myk7CisJZnJlZV9pcnEobWMxMzc4My0+c3BpZGV2LT5pcnEsIG1jMTM3ODMpOwogCiAJbWZkX3JlbW92ZV9kZXZpY2VzKCZzcGktPmRldik7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHBtaWNfZHJpdmVyID0geworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIG1jMTM3ODNfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7Ci0JCSAgIC5uYW1lID0gIm1jMTM3ODMiLAotCQkgICAuYnVzID0gJnNwaV9idXNfdHlwZSwKLQkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5uYW1lID0gIm1jMTM3ODMiLAorCQkuYnVzID0gJnNwaV9idXNfdHlwZSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJfSwKIAkucHJvYmUgPSBtYzEzNzgzX3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChtYzEzNzgzX3JlbW92ZSksCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBwbWljX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IG1jMTM3ODNfaW5pdCh2b2lkKQogewotCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZwbWljX2RyaXZlcik7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJm1jMTM3ODNfZHJpdmVyKTsKIH0KLXN1YnN5c19pbml0Y2FsbChwbWljX2luaXQpOworc3Vic3lzX2luaXRjYWxsKG1jMTM3ODNfaW5pdCk7CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBwbWljX2V4aXQodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBtYzEzNzgzX2V4aXQodm9pZCkKIHsKLQlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJnBtaWNfZHJpdmVyKTsKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJm1jMTM3ODNfZHJpdmVyKTsKIH0KLW1vZHVsZV9leGl0KHBtaWNfZXhpdCk7Cittb2R1bGVfZXhpdChtYzEzNzgzX2V4aXQpOwogCi1NT0RVTEVfREVTQ1JJUFRJT04oIkNvcmUvUHJvdG9jb2wgZHJpdmVyIGZvciBGcmVlc2NhbGUgTUMxMzc4MyBQTUlDIik7Ci1NT0RVTEVfQVVUSE9SKCJTYXNjaGEgSGF1ZXIgPHMuaGF1ZXJAcGVuZ3V0cm9uaXguZGU+Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KK01PRFVMRV9ERVNDUklQVElPTigiQ29yZSBkcml2ZXIgZm9yIEZyZWVzY2FsZSBNQzEzNzgzIFBNSUMiKTsKK01PRFVMRV9BVVRIT1IoIlV3ZSBLbGVpbmUtS29lbmlnIDx1LmtsZWluZS1rb2VuaWdAcGVuZ3V0cm9uaXguZGU+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9wY2Y1MDYzMy1hZGMuYyBiL2RyaXZlcnMvbWZkL3BjZjUwNjMzLWFkYy5jCmluZGV4IDNkMzFlOTcuLjZkMmU4NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3BjZjUwNjMzLWFkYy5jCisrKyBiL2RyaXZlcnMvbWZkL3BjZjUwNjMzLWFkYy5jCkBAIC0yMDksMTcgKzIwOSwxNiBAQAogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBwY2Y1MDYzM19hZGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgcGNmNTA2MzNfc3ViZGV2X3BkYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCBwY2Y1MDYzM19hZGMgKmFkYzsKIAogCWFkYyA9IGt6YWxsb2Moc2l6ZW9mKCphZGMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWFkYykKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlhZGMtPnBjZiA9IHBkYXRhLT5wY2Y7CisJYWRjLT5wY2YgPSBkZXZfdG9fcGNmNTA2MzMocGRldi0+ZGV2LnBhcmVudCk7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgYWRjKTsKIAotCXBjZjUwNjMzX3JlZ2lzdGVyX2lycShwZGF0YS0+cGNmLCBQQ0Y1MDYzM19JUlFfQURDUkRZLAorCXBjZjUwNjMzX3JlZ2lzdGVyX2lycShhZGMtPnBjZiwgUENGNTA2MzNfSVJRX0FEQ1JEWSwKIAkJCQkJcGNmNTA2MzNfYWRjX2lycSwgYWRjKTsKIAogCW11dGV4X2luaXQoJmFkYy0+cXVldWVfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvcGNmNTA2MzMtY29yZS5jIGIvZHJpdmVycy9tZmQvcGNmNTA2MzMtY29yZS5jCmluZGV4IGQyNmQ3NzQuLjAzZGNjOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3BjZjUwNjMzLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC9wY2Y1MDYzMy1jb3JlLmMKQEAgLTI5MCw3ICsyOTAsNyBAQAogCiBpbnQgcGNmNTA2MzNfaXJxX21hc2soc3RydWN0IHBjZjUwNjMzICpwY2YsIGludCBpcnEpCiB7Ci0JZGV2X2luZm8ocGNmLT5kZXYsICJNYXNraW5nIElSUSAlZFxuIiwgaXJxKTsKKwlkZXZfZGJnKHBjZi0+ZGV2LCAiTWFza2luZyBJUlEgJWRcbiIsIGlycSk7CiAKIAlyZXR1cm4gX19wY2Y1MDYzM19pcnFfbWFza19zZXQocGNmLCBpcnEsIDEpOwogfQpAQCAtMjk4LDcgKzI5OCw3IEBACiAKIGludCBwY2Y1MDYzM19pcnFfdW5tYXNrKHN0cnVjdCBwY2Y1MDYzMyAqcGNmLCBpbnQgaXJxKQogewotCWRldl9pbmZvKHBjZi0+ZGV2LCAiVW5tYXNraW5nIElSUSAlZFxuIiwgaXJxKTsKKwlkZXZfZGJnKHBjZi0+ZGV2LCAiVW5tYXNraW5nIElSUSAlZFxuIiwgaXJxKTsKIAogCXJldHVybiBfX3BjZjUwNjMzX2lycV9tYXNrX3NldChwY2YsIGlycSwgMCk7CiB9CkBAIC0zNDUsNiArMzQ1LDkgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJLyogZGVmZWF0IDhzIGRlYXRoIGZyb20gbG93c3lzIG9uIEE1ICovCisJcGNmNTA2MzNfcmVnX3dyaXRlKHBjZiwgUENGNTA2MzNfUkVHX09PQ1NIRFdOLCAgMHgwNCk7CisKIAkvKiBXZSBpbW1lZGlhdGVseSByZWFkIHRoZSB1c2IgYW5kIGFkYXB0ZXIgc3RhdHVzLiBXZSB0aHVzIG1ha2Ugc3VyZQogCSAqIG9ubHkgb2YgVVNCSU5TL1VTQlJFTSBJUlEgaGFuZGxlcnMgYXJlIGNhbGxlZCAqLwogCWlmIChwY2ZfaW50WzBdICYgKFBDRjUwNjMzX0lOVDFfVVNCSU5TIHwgUENGNTA2MzNfSU5UMV9VU0JSRU0pKSB7CkBAIC00NTMsNyArNDU2LDYgQEAKIHBjZjUwNjMzX2NsaWVudF9kZXZfcmVnaXN0ZXIoc3RydWN0IHBjZjUwNjMzICpwY2YsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICoqcGRldikKIHsKLQlzdHJ1Y3QgcGNmNTA2MzNfc3ViZGV2X3BkYXRhICpzdWJkZXZfcGRhdGE7CiAJaW50IHJldDsKIAogCSpwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKG5hbWUsIC0xKTsKQEAgLTQ2MiwxNSArNDY0LDYgQEAKIAkJcmV0dXJuOwogCX0KIAotCXN1YmRldl9wZGF0YSA9IGttYWxsb2Moc2l6ZW9mKCpzdWJkZXZfcGRhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXN1YmRldl9wZGF0YSkgewotCQlkZXZfZXJyKHBjZi0+ZGV2LCAiRXJyb3IgYWxsb2NhdGluZyBzdWJkZXYgcGRhdGFcbiIpOwotCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KCpwZGV2KTsKLQl9Ci0KLQlzdWJkZXZfcGRhdGEtPnBjZiA9IHBjZjsKLQlwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEoKnBkZXYsIHN1YmRldl9wZGF0YSwgc2l6ZW9mKCpzdWJkZXZfcGRhdGEpKTsKLQogCSgqcGRldiktPmRldi5wYXJlbnQgPSBwY2YtPmRldjsKIAogCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQoKnBkZXYpOwpAQCAtNDgyLDEzICs0NzUsMTMgQEAKIH0KIAogI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBwY2Y1MDYzM19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBwY2Y1MDYzM19zdXNwZW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlzdHJ1Y3QgcGNmNTA2MzMgKnBjZjsKIAlpbnQgcmV0ID0gMCwgaTsKIAl1OCByZXNbNV07CiAKLQlwY2YgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlwY2YgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAogCS8qIE1ha2Ugc3VyZSBvdXIgaW50ZXJydXB0IGhhbmRsZXJzIGFyZSBub3QgY2FsbGVkCiAJICogaGVuY2Vmb3J0aCAqLwpAQCAtNTIzLDEyICs1MTYsMTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHBjZjUwNjMzX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHBjZjUwNjMzX3Jlc3VtZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBwY2Y1MDYzMyAqcGNmOwogCWludCByZXQ7CiAKLQlwY2YgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlwY2YgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAogCS8qIFdyaXRlIHRoZSBzYXZlZCBtYXNrIHJlZ2lzdGVycyAqLwogCXJldCA9IHBjZjUwNjMzX3dyaXRlX2Jsb2NrKHBjZiwgUENGNTA2MzNfUkVHX0lOVDFNLApAQCAtNTYwLDkgKzU1MywxNCBAQAogewogCXN0cnVjdCBwY2Y1MDYzMyAqcGNmOwogCXN0cnVjdCBwY2Y1MDYzM19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaW50IGksIHJldCA9IDA7CisJaW50IGksIHJldDsKIAlpbnQgdmVyc2lvbiwgdmFyaWFudDsKIAorCWlmICghY2xpZW50LT5pcnEpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJNaXNzaW5nIElSUVxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKwogCXBjZiA9IGt6YWxsb2Moc2l6ZW9mKCpwY2YpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBjZikKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC01NzcsNiArNTc1LDEyIEBACiAJcGNmLT5pcnEgPSBjbGllbnQtPmlycTsKIAlwY2YtPndvcmtfcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgicGNmNTA2MzMiKTsKIAorCWlmICghcGNmLT53b3JrX3F1ZXVlKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jIHdvcmtxdWV1ZVxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCiAJSU5JVF9XT1JLKCZwY2YtPmlycV93b3JrLCBwY2Y1MDYzM19pcnFfd29ya2VyKTsKIAogCXZlcnNpb24gPSBwY2Y1MDYzM19yZWdfcmVhZChwY2YsIDApOwpAQCAtNTg0LDcgKzU4OCw3IEBACiAJaWYgKHZlcnNpb24gPCAwIHx8IHZhcmlhbnQgPCAwKSB7CiAJCWRldl9lcnIocGNmLT5kZXYsICJVbmFibGUgdG8gcHJvYmUgcGNmNTA2MzNcbiIpOwogCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGVycjsKKwkJZ290byBlcnJfZGVzdHJveV93b3JrcXVldWU7CiAJfQogCiAJZGV2X2luZm8ocGNmLT5kZXYsICJQcm9iZWQgZGV2aWNlIHZlcnNpb24gJWQgdmFyaWFudCAlZFxuIiwKQEAgLTU5OCw2ICs2MDIsMTQgQEAKIAlwY2Y1MDYzM19yZWdfd3JpdGUocGNmLCBQQ0Y1MDYzM19SRUdfSU5UNE0sIDB4MDApOwogCXBjZjUwNjMzX3JlZ193cml0ZShwY2YsIFBDRjUwNjMzX1JFR19JTlQ1TSwgMHgwMCk7CiAKKwlyZXQgPSByZXF1ZXN0X2lycShjbGllbnQtPmlycSwgcGNmNTA2MzNfaXJxLAorCQkJCQlJUlFGX1RSSUdHRVJfTE9XLCAicGNmNTA2MzMiLCBwY2YpOworCisJaWYgKHJldCkgeworCQlkZXZfZXJyKHBjZi0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgSVJRICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9kZXN0cm95X3dvcmtxdWV1ZTsKKwl9CisKIAkvKiBDcmVhdGUgc3ViIGRldmljZXMgKi8KIAlwY2Y1MDYzM19jbGllbnRfZGV2X3JlZ2lzdGVyKHBjZiwgInBjZjUwNjMzLWlucHV0IiwKIAkJCQkJCSZwY2YtPmlucHV0X3BkZXYpOwpAQCAtNjEzLDMxICs2MjUsMTggQEAKIAogCQlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJwY2Y1MDYzMy1yZWdsdHIiLCBpKTsKIAkJaWYgKCFwZGV2KSB7Ci0JCQlkZXZfZXJyKHBjZi0+ZGV2LCAiQ2Fubm90IGNyZWF0ZSByZWd1bGF0b3JcbiIpOworCQkJZGV2X2VycihwY2YtPmRldiwgIkNhbm5vdCBjcmVhdGUgcmVndWxhdG9yICVkXG4iLCBpKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKIAkJcGRldi0+ZGV2LnBhcmVudCA9IHBjZi0+ZGV2OwotCQlwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9ICZwZGF0YS0+cmVnX2luaXRfZGF0YVtpXTsKLQkJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIHBjZik7CisJCXBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShwZGV2LCAmcGRhdGEtPnJlZ19pbml0X2RhdGFbaV0sCisJCQkJCXNpemVvZihwZGF0YS0+cmVnX2luaXRfZGF0YVtpXSkpOwogCQlwY2YtPnJlZ3VsYXRvcl9wZGV2W2ldID0gcGRldjsKIAogCQlwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOwogCX0KIAotCWlmIChjbGllbnQtPmlycSkgewotCQlyZXQgPSByZXF1ZXN0X2lycShjbGllbnQtPmlycSwgcGNmNTA2MzNfaXJxLAotCQkJCUlSUUZfVFJJR0dFUl9MT1csICJwY2Y1MDYzMyIsIHBjZik7Ci0KLQkJaWYgKHJldCkgewotCQkJZGV2X2VycihwY2YtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IElSUSAlZFxuIiwgcmV0KTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfSBlbHNlIHsKLQkJZGV2X2VycihwY2YtPmRldiwgIk5vIElSUSBjb25maWd1cmVkXG4iKTsKLQkJZ290byBlcnI7Ci0JfQotCiAJaWYgKGVuYWJsZV9pcnFfd2FrZShjbGllbnQtPmlycSkgPCAwKQogCQlkZXZfZXJyKHBjZi0+ZGV2LCAiSVJRICV1IGNhbm5vdCBiZSBlbmFibGVkIGFzIHdha2UtdXAgc291cmNlIgogCQkJImluIHRoaXMgaGFyZHdhcmUgcmV2aXNpb24iLCBjbGllbnQtPmlycSk7CkBAIC02NTEsOSArNjUwLDEyIEBACiAKIAlyZXR1cm4gMDsKIAotZXJyOgorZXJyX2Rlc3Ryb3lfd29ya3F1ZXVlOgogCWRlc3Ryb3lfd29ya3F1ZXVlKHBjZi0+d29ya19xdWV1ZSk7CitlcnJfZnJlZToKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBOVUxMKTsKIAlrZnJlZShwY2YpOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNjg2LDEyICs2ODgsMTIgQEAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBwY2Y1MDYzM19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUJPSAicGNmNTA2MzMiLAotCQkuc3VzcGVuZCA9IHBjZjUwNjMzX3N1c3BlbmQsCi0JCS5yZXN1bWUJPSBwY2Y1MDYzM19yZXN1bWUsCiAJfSwKIAkuaWRfdGFibGUgPSBwY2Y1MDYzM19pZF90YWJsZSwKIAkucHJvYmUgPSBwY2Y1MDYzM19wcm9iZSwKIAkucmVtb3ZlID0gX19kZXZleGl0X3AocGNmNTA2MzNfcmVtb3ZlKSwKKwkuc3VzcGVuZCA9IHBjZjUwNjMzX3N1c3BlbmQsCisJLnJlc3VtZQk9IHBjZjUwNjMzX3Jlc3VtZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHBjZjUwNjMzX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3RwczY1MDEwLmMgYi9kcml2ZXJzL21mZC90cHM2NTAxMC5jCmluZGV4IGFjZjhiOWQuLmU1OTU1MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3RwczY1MDEwLmMKKysrIGIvZHJpdmVycy9tZmQvdHBzNjUwMTAuYwpAQCAtNjM3LDcgKzYzNyw3IEBACiAJCQkJdHBzLCBERUJVR19GT1BTKTsKIAogCS8qIG9wdGlvbmFsbHkgcmVnaXN0ZXIgR1BJT3MgKi8KLQlpZiAoYm9hcmQgJiYgYm9hcmQtPmJhc2UgPiAwKSB7CisJaWYgKGJvYXJkICYmIGJvYXJkLT5iYXNlICE9IDApIHsKIAkJdHBzLT5vdXRtYXNrID0gYm9hcmQtPm91dG1hc2s7CiAKIAkJdHBzLT5jaGlwLmxhYmVsID0gY2xpZW50LT5uYW1lOwpAQCAtOTY0LDYgKzk2NCwzNCBAQAogfQogRVhQT1JUX1NZTUJPTCh0cHM2NTAxMF9jb25maWdfdnJlZ3MxKTsKIAoraW50IHRwczY1MDEwX2NvbmZpZ192ZGNkYzIodW5zaWduZWQgdmFsdWUpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmM7CisJaW50CSBzdGF0dXM7CisKKwlpZiAoIXRoZV90cHMpCisJCXJldHVybiAtRU5PREVWOworCisJYyA9IHRoZV90cHMtPmNsaWVudDsKKwltdXRleF9sb2NrKCZ0aGVfdHBzLT5sb2NrKTsKKworCXByX2RlYnVnKCIlczogdmRjZGMyIDB4JTAyeFxuIiwgRFJJVkVSX05BTUUsCisJCSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoYywgVFBTX1ZEQ0RDMikpOworCisJc3RhdHVzID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjLCBUUFNfVkRDREMyLCB2YWx1ZSk7CisKKwlpZiAoc3RhdHVzICE9IDApCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEZhaWxlZCB0byB3cml0ZSB2ZGNkYzIgcmVnaXN0ZXJcbiIsCisJCQlEUklWRVJfTkFNRSk7CisJZWxzZQorCQlwcl9kZWJ1ZygiJXM6IHZyZWdzMSAweCUwMnhcbiIsIERSSVZFUl9OQU1FLAorCQkJIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjLCBUUFNfVkRDREMyKSk7CisKKwltdXRleF91bmxvY2soJnRoZV90cHMtPmxvY2spOworCXJldHVybiBzdGF0dXM7Cit9CitFWFBPUlRfU1lNQk9MKHRwczY1MDEwX2NvbmZpZ192ZGNkYzIpOworCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogdHBzNjUwMTNfc2V0X2xvd19wd3IgcGFyYW1ldGVyOgogICogbW9kZTogT04gb3IgT0ZGCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90d2wtY29yZS5jIGIvZHJpdmVycy9tZmQvdHdsLWNvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTc2MDY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZmQvdHdsLWNvcmUuYwpAQCAtMCwwICsxLDEwNzYgQEAKKy8qCisgKiB0d2xfY29yZS5jIC0gZHJpdmVyIGZvciBUV0w0MDMwL1RXTDUwMzAvVFdMNjBYMC9UUFM2NTl4MCBQTQorICogYW5kIGF1ZGlvIENPREVDIGRldmljZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIE1vZGlmaWNhdGlvbnMgdG8gZGVmZXIgaW50ZXJydXB0IGhhbmRsaW5nIHRvIGEga2VybmVsIHRocmVhZDoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKgorICogQmFzZWQgb24gdGx2MzIwYWljMjMuYzoKKyAqIENvcHlyaWdodCAoYykgYnkgS2FpIFN2YWhuIDxrYWkuc3ZhaG5Abm9raWEuY29tPgorICoKKyAqIENvZGUgY2xlYW51cCBhbmQgbW9kaWZpY2F0aW9ucyB0byBJUlEgaGFuZGxlci4KKyAqIGJ5IHN5ZWQga2hhc2ltIDx4MGtoYXNpbUB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorCisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy90d2wuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDIpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDMpCisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKyNlbmRpZgorCisvKgorICogVGhlIFRXTDQwMzAgIlRyaXRvbiAyIiBpcyBvbmUgb2YgYSBmYW1pbHkgb2YgYSBtdWx0aS1mdW5jdGlvbiAiUG93ZXIKKyAqIE1hbmFnZW1lbnQgYW5kIFN5c3RlbSBDb21wYW5pb24gRGV2aWNlIiBjaGlwcyBvcmlnaW5hbGx5IGRlc2lnbmVkIGZvcgorICogdXNlIGluIE9NQVAyIGFuZCBPTUFQIDMgYmFzZWQgc3lzdGVtcy4gIEl0cyBjb250cm9sIGludGVyZmFjZXMgdXNlIEkyQywKKyAqIG9mdGVuIGF0IGFyb3VuZCAzIE1iaXQvc2VjLCBpbmNsdWRpbmcgZm9yIGludGVycnVwdCBoYW5kbGluZy4KKyAqCisgKiBUaGlzIGRyaXZlciBjb3JlIHByb3ZpZGVzIGdlbmlycSBzdXBwb3J0IGZvciB0aGUgaW50ZXJydXB0cyBlbWl0dGVkLAorICogYnkgdGhlIHZhcmlvdXMgbW9kdWxlcywgYW5kIGV4cG9ydHMgcmVnaXN0ZXIgYWNjZXNzIHByaW1pdGl2ZXMuCisgKgorICogRklYTUUgdGhpcyBkcml2ZXIgY3VycmVudGx5IHJlcXVpcmVzIHVzZSBvZiB0aGUgZmlyc3QgaW50ZXJydXB0IGxpbmUKKyAqIChhbmQgYXNzb2NpYXRlZCByZWdpc3RlcnMpLgorICovCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCQkidHdsIgorCisjaWYgZGVmaW5lZChDT05GSUdfVFdMNDAzMF9CQ0lfQkFUVEVSWSkgfHwgXAorCWRlZmluZWQoQ09ORklHX1RXTDQwMzBfQkNJX0JBVFRFUllfTU9EVUxFKQorI2RlZmluZSB0d2xfaGFzX2JjaSgpCQl0cnVlCisjZWxzZQorI2RlZmluZSB0d2xfaGFzX2JjaSgpCQlmYWxzZQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9UV0w0MDMwKSB8fCBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9UV0w0MDMwX01PRFVMRSkKKyNkZWZpbmUgdHdsX2hhc19rZXlwYWQoKQl0cnVlCisjZWxzZQorI2RlZmluZSB0d2xfaGFzX2tleXBhZCgpCWZhbHNlCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0dQSU9fVFdMNDAzMCkgfHwgZGVmaW5lZChDT05GSUdfR1BJT19UV0w0MDMwX01PRFVMRSkKKyNkZWZpbmUgdHdsX2hhc19ncGlvKCkJdHJ1ZQorI2Vsc2UKKyNkZWZpbmUgdHdsX2hhc19ncGlvKCkJZmFsc2UKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfUkVHVUxBVE9SX1RXTDQwMzApIFwKKwl8fCBkZWZpbmVkKENPTkZJR19SRUdVTEFUT1JfVFdMNDAzMF9NT0RVTEUpCisjZGVmaW5lIHR3bF9oYXNfcmVndWxhdG9yKCkJdHJ1ZQorI2Vsc2UKKyNkZWZpbmUgdHdsX2hhc19yZWd1bGF0b3IoKQlmYWxzZQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19UV0w0MDMwX01BREMpIHx8IGRlZmluZWQoQ09ORklHX1RXTDQwMzBfTUFEQ19NT0RVTEUpCisjZGVmaW5lIHR3bF9oYXNfbWFkYygpCXRydWUKKyNlbHNlCisjZGVmaW5lIHR3bF9oYXNfbWFkYygpCWZhbHNlCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19UV0w0MDMwX1BPV0VSCisjZGVmaW5lIHR3bF9oYXNfcG93ZXIoKSAgICAgICAgdHJ1ZQorI2Vsc2UKKyNkZWZpbmUgdHdsX2hhc19wb3dlcigpICAgICAgICBmYWxzZQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfRFJWX1RXTDQwMzApIHx8IGRlZmluZWQoQ09ORklHX1JUQ19EUlZfVFdMNDAzMF9NT0RVTEUpCisjZGVmaW5lIHR3bF9oYXNfcnRjKCkJdHJ1ZQorI2Vsc2UKKyNkZWZpbmUgdHdsX2hhc19ydGMoKQlmYWxzZQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19UV0w0MDMwX1VTQikgfHwgZGVmaW5lZChDT05GSUdfVFdMNDAzMF9VU0JfTU9EVUxFKQorI2RlZmluZSB0d2xfaGFzX3VzYigpCXRydWUKKyNlbHNlCisjZGVmaW5lIHR3bF9oYXNfdXNiKCkJZmFsc2UKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfVFdMNDAzMF9XQVRDSERPRykgfHwgXAorCWRlZmluZWQoQ09ORklHX1RXTDQwMzBfV0FUQ0hET0dfTU9EVUxFKQorI2RlZmluZSB0d2xfaGFzX3dhdGNoZG9nKCkgICAgICAgIHRydWUKKyNlbHNlCisjZGVmaW5lIHR3bF9oYXNfd2F0Y2hkb2coKSAgICAgICAgZmFsc2UKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfVFdMNDAzMF9DT0RFQykgfHwgZGVmaW5lZChDT05GSUdfVFdMNDAzMF9DT0RFQ19NT0RVTEUpCisjZGVmaW5lIHR3bF9oYXNfY29kZWMoKQl0cnVlCisjZWxzZQorI2RlZmluZSB0d2xfaGFzX2NvZGVjKCkJZmFsc2UKKyNlbmRpZgorCisvKiBUcml0b24gQ29yZSBpbnRlcm5hbCBpbmZvcm1hdGlvbiAoQkVHSU4pICovCisKKy8qIExhc3QgLSBmb3IgaW5kZXggbWF4Ki8KKyNkZWZpbmUgVFdMNDAzMF9NT0RVTEVfTEFTVAkJVFdMNDAzMF9NT0RVTEVfU0VDVVJFRF9SRUcKKworI2RlZmluZSBUV0xfTlVNX1NMQVZFUwkJNAorCisjaWYgZGVmaW5lZChDT05GSUdfSU5QVVRfVFdMNDAzMF9QV1JCVVRUT04pIFwKKwl8fCBkZWZpbmVkKENPTkZJR19JTlBVVF9UV0w0MDMwX1BXQlVUVE9OX01PRFVMRSkKKyNkZWZpbmUgdHdsX2hhc19wd3JidXR0b24oKQl0cnVlCisjZWxzZQorI2RlZmluZSB0d2xfaGFzX3B3cmJ1dHRvbigpCWZhbHNlCisjZW5kaWYKKworI2RlZmluZSBTVUJfQ0hJUF9JRDAgMAorI2RlZmluZSBTVUJfQ0hJUF9JRDEgMQorI2RlZmluZSBTVUJfQ0hJUF9JRDIgMgorI2RlZmluZSBTVUJfQ0hJUF9JRDMgMworCisjZGVmaW5lIFRXTF9NT0RVTEVfTEFTVCBUV0w0MDMwX01PRFVMRV9MQVNUCisKKy8qIEJhc2UgQWRkcmVzcyBkZWZucyBmb3IgdHdsNDAzMF9tYXBbXSAqLworCisvKiBzdWJjaGlwL3NsYXZlIDAgLSBVU0IgSUQgKi8KKyNkZWZpbmUgVFdMNDAzMF9CQVNFQUREX1VTQgkJMHgwMDAwCisKKy8qIHN1YmNoaXAvc2xhdmUgMSAtIEFVRCBJRCAqLworI2RlZmluZSBUV0w0MDMwX0JBU0VBRERfQVVESU9fVk9JQ0UJMHgwMDAwCisjZGVmaW5lIFRXTDQwMzBfQkFTRUFERF9HUElPCQkweDAwOTgKKyNkZWZpbmUgVFdMNDAzMF9CQVNFQUREX0lOVEJSCQkweDAwODUKKyNkZWZpbmUgVFdMNDAzMF9CQVNFQUREX1BJSAkJMHgwMDgwCisjZGVmaW5lIFRXTDQwMzBfQkFTRUFERF9URVNUCQkweDAwNEMKKworLyogc3ViY2hpcC9zbGF2ZSAyIC0gQVVYIElEICovCisjZGVmaW5lIFRXTDQwMzBfQkFTRUFERF9JTlRFUlJVUFRTCTB4MDBCOQorI2RlZmluZSBUV0w0MDMwX0JBU0VBRERfTEVECQkweDAwRUUKKyNkZWZpbmUgVFdMNDAzMF9CQVNFQUREX01BREMJCTB4MDAwMAorI2RlZmluZSBUV0w0MDMwX0JBU0VBRERfTUFJTl9DSEFSR0UJMHgwMDc0CisjZGVmaW5lIFRXTDQwMzBfQkFTRUFERF9QUkVDSEFSR0UJMHgwMEFBCisjZGVmaW5lIFRXTDQwMzBfQkFTRUFERF9QV00wCQkweDAwRjgKKyNkZWZpbmUgVFdMNDAzMF9CQVNFQUREX1BXTTEJCTB4MDBGQgorI2RlZmluZSBUV0w0MDMwX0JBU0VBRERfUFdNQQkJMHgwMEVGCisjZGVmaW5lIFRXTDQwMzBfQkFTRUFERF9QV01CCQkweDAwRjEKKyNkZWZpbmUgVFdMNDAzMF9CQVNFQUREX0tFWVBBRAkJMHgwMEQyCisKKyNkZWZpbmUgVFdMNTAzMV9CQVNFQUREX0FDQ0VTU09SWQkweDAwNzQgLyogUmVwbGFjZXMgTWFpbiBDaGFyZ2UgKi8KKyNkZWZpbmUgVFdMNTAzMV9CQVNFQUREX0lOVEVSUlVQVFMJMHgwMEI5IC8qIERpZmZlcmVudCB0aGFuIFRXTDQwMzAncworCQkJCQkJICBvbmUgKi8KKworLyogc3ViY2hpcC9zbGF2ZSAzIC0gUE9XRVIgSUQgKi8KKyNkZWZpbmUgVFdMNDAzMF9CQVNFQUREX0JBQ0tVUAkJMHgwMDE0CisjZGVmaW5lIFRXTDQwMzBfQkFTRUFERF9JTlQJCTB4MDAyRQorI2RlZmluZSBUV0w0MDMwX0JBU0VBRERfUE1fTUFTVEVSCTB4MDAzNgorI2RlZmluZSBUV0w0MDMwX0JBU0VBRERfUE1fUkVDRUlWRVIJMHgwMDVCCisjZGVmaW5lIFRXTDQwMzBfQkFTRUFERF9SVEMJCTB4MDAxQworI2RlZmluZSBUV0w0MDMwX0JBU0VBRERfU0VDVVJFRF9SRUcJMHgwMDAwCisKKy8qIFRyaXRvbiBDb3JlIGludGVybmFsIGluZm9ybWF0aW9uIChFTkQpICovCisKKworLyogc3ViY2hpcC9zbGF2ZSAwIDB4NDggLSBQT1dFUiAqLworI2RlZmluZSBUV0w2MDMwX0JBU0VBRERfUlRDCQkweDAwMDAKKyNkZWZpbmUgVFdMNjAzMF9CQVNFQUREX01FTQkJMHgwMDE3CisjZGVmaW5lIFRXTDYwMzBfQkFTRUFERF9QTV9NQVNURVIJMHgwMDFGCisjZGVmaW5lIFRXTDYwMzBfQkFTRUFERF9QTV9TTEFWRV9NSVNDCTB4MDAzMCAvKiBQTV9SRUNFSVZFUiAqLworI2RlZmluZSBUV0w2MDMwX0JBU0VBRERfUE1fTUlTQwkJMHgwMEUyCisjZGVmaW5lIFRXTDYwMzBfQkFTRUFERF9QTV9QVVBECQkweDAwRjAKKworLyogc3ViY2hpcC9zbGF2ZSAxIDB4NDkgLSBGRUFUVVJFICovCisjZGVmaW5lIFRXTDYwMzBfQkFTRUFERF9VU0IJCTB4MDAwMAorI2RlZmluZSBUV0w2MDMwX0JBU0VBRERfR1BBRENfQ1RSTAkweDAwMkUKKyNkZWZpbmUgVFdMNjAzMF9CQVNFQUREX0FVWAkJMHgwMDkwCisjZGVmaW5lIFRXTDYwMzBfQkFTRUFERF9QV00JCTB4MDBCQQorI2RlZmluZSBUV0w2MDMwX0JBU0VBRERfR0FTR0FVR0UJMHgwMEMwCisjZGVmaW5lIFRXTDYwMzBfQkFTRUFERF9QSUgJCTB4MDBEMAorI2RlZmluZSBUV0w2MDMwX0JBU0VBRERfQ0hBUkdFUgkJMHgwMEUwCisKKy8qIHN1YmNoaXAvc2xhdmUgMiAweDRBIC0gREZUICovCisjZGVmaW5lIFRXTDYwMzBfQkFTRUFERF9ESUVJRAkJMHgwMEMwCisKKy8qIHN1YmNoaXAvc2xhdmUgMyAweDRCIC0gQVVESU8gKi8KKyNkZWZpbmUgVFdMNjAzMF9CQVNFQUREX0FVRElPCQkweDAwMDAKKyNkZWZpbmUgVFdMNjAzMF9CQVNFQUREX1JTVgkJMHgwMDAwCisKKy8qIEZldyBwb3dlciB2YWx1ZXMgKi8KKyNkZWZpbmUgUl9DRkdfQk9PVAkJCTB4MDUKKyNkZWZpbmUgUl9QUk9URUNUX0tFWQkJCTB4MEUKKworLyogYWNjZXNzIGNvbnRyb2wgdmFsdWVzIGZvciBSX1BST1RFQ1RfS0VZICovCisjZGVmaW5lIEtFWV9VTkxPQ0sxCQkJMHhjZQorI2RlZmluZSBLRVlfVU5MT0NLMgkJCTB4ZWMKKyNkZWZpbmUgS0VZX0xPQ0sJCQkweDAwCisKKy8qIHNvbWUgZmllbGRzIGluIFJfQ0ZHX0JPT1QgKi8KKyNkZWZpbmUgSEZDTEtfRlJFUV8xOXAyX01IWgkJKDEgPDwgMCkKKyNkZWZpbmUgSEZDTEtfRlJFUV8yNl9NSFoJCSgyIDw8IDApCisjZGVmaW5lIEhGQ0xLX0ZSRVFfMzhwNF9NSFoJCSgzIDw8IDApCisjZGVmaW5lIEhJR0hfUEVSRl9TUQkJCSgxIDw8IDMpCisjZGVmaW5lIENLMzJLX0xPV1BXUl9FTgkJCSgxIDw8IDcpCisKKworLyogY2hpcC1zcGVjaWZpYyBmZWF0dXJlIGZsYWdzLCBmb3IgaTJjX2RldmljZV9pZC5kcml2ZXJfZGF0YSAqLworI2RlZmluZSBUV0w0MDMwX1ZBVVgyCQlCSVQoMCkJLyogcHJlLTUwMzAgdm9sdGFnZSByYW5nZXMgKi8KKyNkZWZpbmUgVFBTX1NVQlNFVAkJQklUKDEpCS8qIHRwczY1OVsyM10wIGhhdmUgZmV3ZXIgTERPcyAqLworI2RlZmluZSBUV0w1MDMxCQkJQklUKDIpICAvKiB0d2w1MDMxIGhhcyBkaWZmZXJlbnQgcmVnaXN0ZXJzICovCisjZGVmaW5lIFRXTDYwMzBfQ0xBU1MJCUJJVCgzKQkvKiBUV0w2MDMwIGNsYXNzICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGlzIGRyaXZlciBhY3RpdmUsIGJvdW5kIHRvIGEgY2hpcD8gKi8KK3N0YXRpYyBib29sIGludXNlOworCitzdGF0aWMgdW5zaWduZWQgaW50IHR3bF9pZDsKK3Vuc2lnbmVkIGludCB0d2xfcmV2KHZvaWQpCit7CisJcmV0dXJuIHR3bF9pZDsKK30KK0VYUE9SVF9TWU1CT0wodHdsX3Jldik7CisKKy8qIFN0cnVjdHVyZSBmb3IgZWFjaCBUV0w0MDMwL1RXTDYwMzAgU2xhdmUgKi8KK3N0cnVjdCB0d2xfY2xpZW50IHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXU4IGFkZHJlc3M7CisKKwkvKiBtYXggbnVtYiBvZiBpMmNfbXNnIHJlcXVpcmVkIGlzIGZvciByZWFkID0yICovCisJc3RydWN0IGkyY19tc2cgeGZlcl9tc2dbMl07CisKKwkvKiBUbyBsb2NrIGFjY2VzcyB0byB4ZmVyX21zZyAqLworCXN0cnVjdCBtdXRleCB4ZmVyX2xvY2s7Cit9OworCitzdGF0aWMgc3RydWN0IHR3bF9jbGllbnQgdHdsX21vZHVsZXNbVFdMX05VTV9TTEFWRVNdOworCisKKy8qIG1hcHBpbmcgdGhlIG1vZHVsZSBpZCB0byBzbGF2ZSBpZCBhbmQgYmFzZSBhZGRyZXNzICovCitzdHJ1Y3QgdHdsX21hcHBpbmcgeworCXVuc2lnbmVkIGNoYXIgc2lkOwkvKiBTbGF2ZSBJRCAqLworCXVuc2lnbmVkIGNoYXIgYmFzZTsJLyogYmFzZSBhZGRyZXNzICovCit9Oworc3RydWN0IHR3bF9tYXBwaW5nICp0d2xfbWFwOworCitzdGF0aWMgc3RydWN0IHR3bF9tYXBwaW5nIHR3bDQwMzBfbWFwW1RXTDQwMzBfTU9EVUxFX0xBU1QgKyAxXSA9IHsKKwkvKgorCSAqIE5PVEU6ICBkb24ndCBjaGFuZ2UgdGhpcyB0YWJsZSB3aXRob3V0IHVwZGF0aW5nIHRoZQorCSAqIDxsaW51eC9pMmMvdHdsLmg+IGRlZmluZXMgZm9yIFRXTDQwMzBfTU9EVUxFXyoKKwkgKiBzbyB0aGV5IGNvbnRpbnVlIHRvIG1hdGNoIHRoZSBvcmRlciBpbiB0aGlzIHRhYmxlLgorCSAqLworCisJeyAwLCBUV0w0MDMwX0JBU0VBRERfVVNCIH0sCisKKwl7IDEsIFRXTDQwMzBfQkFTRUFERF9BVURJT19WT0lDRSB9LAorCXsgMSwgVFdMNDAzMF9CQVNFQUREX0dQSU8gfSwKKwl7IDEsIFRXTDQwMzBfQkFTRUFERF9JTlRCUiB9LAorCXsgMSwgVFdMNDAzMF9CQVNFQUREX1BJSCB9LAorCXsgMSwgVFdMNDAzMF9CQVNFQUREX1RFU1QgfSwKKworCXsgMiwgVFdMNDAzMF9CQVNFQUREX0tFWVBBRCB9LAorCXsgMiwgVFdMNDAzMF9CQVNFQUREX01BREMgfSwKKwl7IDIsIFRXTDQwMzBfQkFTRUFERF9JTlRFUlJVUFRTIH0sCisJeyAyLCBUV0w0MDMwX0JBU0VBRERfTEVEIH0sCisJeyAyLCBUV0w0MDMwX0JBU0VBRERfTUFJTl9DSEFSR0UgfSwKKwl7IDIsIFRXTDQwMzBfQkFTRUFERF9QUkVDSEFSR0UgfSwKKwl7IDIsIFRXTDQwMzBfQkFTRUFERF9QV00wIH0sCisJeyAyLCBUV0w0MDMwX0JBU0VBRERfUFdNMSB9LAorCXsgMiwgVFdMNDAzMF9CQVNFQUREX1BXTUEgfSwKKwl7IDIsIFRXTDQwMzBfQkFTRUFERF9QV01CIH0sCisJeyAyLCBUV0w1MDMxX0JBU0VBRERfQUNDRVNTT1JZIH0sCisJeyAyLCBUV0w1MDMxX0JBU0VBRERfSU5URVJSVVBUUyB9LAorCisJeyAzLCBUV0w0MDMwX0JBU0VBRERfQkFDS1VQIH0sCisJeyAzLCBUV0w0MDMwX0JBU0VBRERfSU5UIH0sCisJeyAzLCBUV0w0MDMwX0JBU0VBRERfUE1fTUFTVEVSIH0sCisJeyAzLCBUV0w0MDMwX0JBU0VBRERfUE1fUkVDRUlWRVIgfSwKKwl7IDMsIFRXTDQwMzBfQkFTRUFERF9SVEMgfSwKKwl7IDMsIFRXTDQwMzBfQkFTRUFERF9TRUNVUkVEX1JFRyB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0d2xfbWFwcGluZyB0d2w2MDMwX21hcFtdID0geworCS8qCisJICogTk9URTogIGRvbid0IGNoYW5nZSB0aGlzIHRhYmxlIHdpdGhvdXQgdXBkYXRpbmcgdGhlCisJICogPGxpbnV4L2kyYy90d2wuaD4gZGVmaW5lcyBmb3IgVFdMNDAzMF9NT0RVTEVfKgorCSAqIHNvIHRoZXkgY29udGludWUgdG8gbWF0Y2ggdGhlIG9yZGVyIGluIHRoaXMgdGFibGUuCisJICovCisJeyBTVUJfQ0hJUF9JRDEsIFRXTDYwMzBfQkFTRUFERF9VU0IgfSwKKwl7IFNVQl9DSElQX0lEMywgVFdMNjAzMF9CQVNFQUREX0FVRElPIH0sCisJeyBTVUJfQ0hJUF9JRDIsIFRXTDYwMzBfQkFTRUFERF9ESUVJRCB9LAorCXsgU1VCX0NISVBfSUQyLCBUV0w2MDMwX0JBU0VBRERfUlNWIH0sCisJeyBTVUJfQ0hJUF9JRDEsIFRXTDYwMzBfQkFTRUFERF9QSUggfSwKKworCXsgU1VCX0NISVBfSUQyLCBUV0w2MDMwX0JBU0VBRERfUlNWIH0sCisJeyBTVUJfQ0hJUF9JRDIsIFRXTDYwMzBfQkFTRUFERF9SU1YgfSwKKwl7IFNVQl9DSElQX0lEMSwgVFdMNjAzMF9CQVNFQUREX0dQQURDX0NUUkwgfSwKKwl7IFNVQl9DSElQX0lEMiwgVFdMNjAzMF9CQVNFQUREX1JTViB9LAorCXsgU1VCX0NISVBfSUQyLCBUV0w2MDMwX0JBU0VBRERfUlNWIH0sCisKKwl7IFNVQl9DSElQX0lEMSwgVFdMNjAzMF9CQVNFQUREX0NIQVJHRVIgfSwKKwl7IFNVQl9DSElQX0lEMSwgVFdMNjAzMF9CQVNFQUREX0dBU0dBVUdFIH0sCisJeyBTVUJfQ0hJUF9JRDEsIFRXTDYwMzBfQkFTRUFERF9QV00gfSwKKwl7IFNVQl9DSElQX0lEMiwgVFdMNjAzMF9CQVNFQUREX1JTViB9LAorCXsgU1VCX0NISVBfSUQyLCBUV0w2MDMwX0JBU0VBRERfUlNWIH0sCisKKwl7IFNVQl9DSElQX0lEMiwgVFdMNjAzMF9CQVNFQUREX1JTViB9LAorCXsgU1VCX0NISVBfSUQyLCBUV0w2MDMwX0JBU0VBRERfUlNWIH0sCisJeyBTVUJfQ0hJUF9JRDIsIFRXTDYwMzBfQkFTRUFERF9SU1YgfSwKKwl7IFNVQl9DSElQX0lEMCwgVFdMNjAzMF9CQVNFQUREX1BNX01BU1RFUiB9LAorCXsgU1VCX0NISVBfSUQwLCBUV0w2MDMwX0JBU0VBRERfUE1fU0xBVkVfTUlTQyB9LAorCisJeyBTVUJfQ0hJUF9JRDAsIFRXTDYwMzBfQkFTRUFERF9SVEMgfSwKKwl7IFNVQl9DSElQX0lEMCwgVFdMNjAzMF9CQVNFQUREX01FTSB9LAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXhwb3J0ZWQgRnVuY3Rpb25zICovCisKKy8qKgorICogdHdsX2kyY193cml0ZSAtIFdyaXRlcyBhIG4gYml0IHJlZ2lzdGVyIGluIFRXTDQwMzAvVFdMNTAzMC9UV0w2MFgwCisgKiBAbW9kX25vOiBtb2R1bGUgbnVtYmVyCisgKiBAdmFsdWU6IGFuIGFycmF5IG9mIG51bV9ieXRlcysxIGNvbnRhaW5pbmcgZGF0YSB0byB3cml0ZQorICogQHJlZzogcmVnaXN0ZXIgYWRkcmVzcyAoanVzdCBvZmZzZXQgd2lsbCBkbykKKyAqIEBudW1fYnl0ZXM6IG51bWJlciBvZiBieXRlcyB0byB0cmFuc2ZlcgorICoKKyAqIElNUE9SVEFOVDogZm9yICd2YWx1ZScgcGFyYW1ldGVyOiBBbGxvY2F0ZSB2YWx1ZSBudW1fYnl0ZXMrMSBhbmQKKyAqIHZhbGlkIGRhdGEgc3RhcnRzIGF0IE9mZnNldCAxLgorICoKKyAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBvcGVyYXRpb24gLSAwIGlzIHN1Y2Nlc3MKKyAqLworaW50IHR3bF9pMmNfd3JpdGUodTggbW9kX25vLCB1OCAqdmFsdWUsIHU4IHJlZywgdW5zaWduZWQgbnVtX2J5dGVzKQoreworCWludCByZXQ7CisJaW50IHNpZDsKKwlzdHJ1Y3QgdHdsX2NsaWVudCAqdHdsOworCXN0cnVjdCBpMmNfbXNnICptc2c7CisKKwlpZiAodW5saWtlbHkobW9kX25vID4gVFdMX01PRFVMRV9MQVNUKSkgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIG1vZHVsZSBudW1iZXIgJWRcbiIsIERSSVZFUl9OQU1FLCBtb2Rfbm8pOworCQlyZXR1cm4gLUVQRVJNOworCX0KKwlzaWQgPSB0d2xfbWFwW21vZF9ub10uc2lkOworCXR3bCA9ICZ0d2xfbW9kdWxlc1tzaWRdOworCisJaWYgKHVubGlrZWx5KCFpbnVzZSkpIHsKKwkJcHJfZXJyKCIlczogY2xpZW50ICVkIGlzIG5vdCBpbml0aWFsaXplZFxuIiwgRFJJVkVSX05BTUUsIHNpZCk7CisJCXJldHVybiAtRVBFUk07CisJfQorCW11dGV4X2xvY2soJnR3bC0+eGZlcl9sb2NrKTsKKwkvKgorCSAqIFtNU0cxXTogZmlsbCB0aGUgcmVnaXN0ZXIgYWRkcmVzcyBkYXRhCisJICogZmlsbCB0aGUgZGF0YSBUeCBidWZmZXIKKwkgKi8KKwltc2cgPSAmdHdsLT54ZmVyX21zZ1swXTsKKwltc2ctPmFkZHIgPSB0d2wtPmFkZHJlc3M7CisJbXNnLT5sZW4gPSBudW1fYnl0ZXMgKyAxOworCW1zZy0+ZmxhZ3MgPSAwOworCW1zZy0+YnVmID0gdmFsdWU7CisJLyogb3ZlciB3cml0ZSB0aGUgZmlyc3QgYnl0ZSBvZiBidWZmZXIgd2l0aCB0aGUgcmVnaXN0ZXIgYWRkcmVzcyAqLworCSp2YWx1ZSA9IHR3bF9tYXBbbW9kX25vXS5iYXNlICsgcmVnOworCXJldCA9IGkyY190cmFuc2Zlcih0d2wtPmNsaWVudC0+YWRhcHRlciwgdHdsLT54ZmVyX21zZywgMSk7CisJbXV0ZXhfdW5sb2NrKCZ0d2wtPnhmZXJfbG9jayk7CisKKwkvKiBpMmNfdHJhbnNmZXIgcmV0dXJucyBudW1iZXIgb2YgbWVzc2FnZXMgdHJhbnNmZXJyZWQgKi8KKwlpZiAocmV0ICE9IDEpIHsKKwkJcHJfZXJyKCIlczogaTJjX3dyaXRlIGZhaWxlZCB0byB0cmFuc2ZlciBhbGwgbWVzc2FnZXNcbiIsCisJCQlEUklWRVJfTkFNRSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJZWxzZQorCQkJcmV0dXJuIC1FSU87CisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorfQorRVhQT1JUX1NZTUJPTCh0d2xfaTJjX3dyaXRlKTsKKworLyoqCisgKiB0d2xfaTJjX3JlYWQgLSBSZWFkcyBhIG4gYml0IHJlZ2lzdGVyIGluIFRXTDQwMzAvVFdMNTAzMC9UV0w2MFgwCisgKiBAbW9kX25vOiBtb2R1bGUgbnVtYmVyCisgKiBAdmFsdWU6IGFuIGFycmF5IG9mIG51bV9ieXRlcyBjb250YWluaW5nIGRhdGEgdG8gYmUgcmVhZAorICogQHJlZzogcmVnaXN0ZXIgYWRkcmVzcyAoanVzdCBvZmZzZXQgd2lsbCBkbykKKyAqIEBudW1fYnl0ZXM6IG51bWJlciBvZiBieXRlcyB0byB0cmFuc2ZlcgorICoKKyAqIFJldHVybnMgcmVzdWx0IG9mIG9wZXJhdGlvbiAtIG51bV9ieXRlcyBpcyBzdWNjZXNzIGVsc2UgZmFpbHVyZS4KKyAqLworaW50IHR3bF9pMmNfcmVhZCh1OCBtb2Rfbm8sIHU4ICp2YWx1ZSwgdTggcmVnLCB1bnNpZ25lZCBudW1fYnl0ZXMpCit7CisJaW50IHJldDsKKwl1OCB2YWw7CisJaW50IHNpZDsKKwlzdHJ1Y3QgdHdsX2NsaWVudCAqdHdsOworCXN0cnVjdCBpMmNfbXNnICptc2c7CisKKwlpZiAodW5saWtlbHkobW9kX25vID4gVFdMX01PRFVMRV9MQVNUKSkgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIG1vZHVsZSBudW1iZXIgJWRcbiIsIERSSVZFUl9OQU1FLCBtb2Rfbm8pOworCQlyZXR1cm4gLUVQRVJNOworCX0KKwlzaWQgPSB0d2xfbWFwW21vZF9ub10uc2lkOworCXR3bCA9ICZ0d2xfbW9kdWxlc1tzaWRdOworCisJaWYgKHVubGlrZWx5KCFpbnVzZSkpIHsKKwkJcHJfZXJyKCIlczogY2xpZW50ICVkIGlzIG5vdCBpbml0aWFsaXplZFxuIiwgRFJJVkVSX05BTUUsIHNpZCk7CisJCXJldHVybiAtRVBFUk07CisJfQorCW11dGV4X2xvY2soJnR3bC0+eGZlcl9sb2NrKTsKKwkvKiBbTVNHMV0gZmlsbCB0aGUgcmVnaXN0ZXIgYWRkcmVzcyBkYXRhICovCisJbXNnID0gJnR3bC0+eGZlcl9tc2dbMF07CisJbXNnLT5hZGRyID0gdHdsLT5hZGRyZXNzOworCW1zZy0+bGVuID0gMTsKKwltc2ctPmZsYWdzID0gMDsJLyogUmVhZCB0aGUgcmVnaXN0ZXIgdmFsdWUgKi8KKwl2YWwgPSB0d2xfbWFwW21vZF9ub10uYmFzZSArIHJlZzsKKwltc2ctPmJ1ZiA9ICZ2YWw7CisJLyogW01TRzJdIGZpbGwgdGhlIGRhdGEgcnggYnVmZmVyICovCisJbXNnID0gJnR3bC0+eGZlcl9tc2dbMV07CisJbXNnLT5hZGRyID0gdHdsLT5hZGRyZXNzOworCW1zZy0+ZmxhZ3MgPSBJMkNfTV9SRDsJLyogUmVhZCB0aGUgcmVnaXN0ZXIgdmFsdWUgKi8KKwltc2ctPmxlbiA9IG51bV9ieXRlczsJLyogb25seSBuIGJ5dGVzICovCisJbXNnLT5idWYgPSB2YWx1ZTsKKwlyZXQgPSBpMmNfdHJhbnNmZXIodHdsLT5jbGllbnQtPmFkYXB0ZXIsIHR3bC0+eGZlcl9tc2csIDIpOworCW11dGV4X3VubG9jaygmdHdsLT54ZmVyX2xvY2spOworCisJLyogaTJjX3RyYW5zZmVyIHJldHVybnMgbnVtYmVyIG9mIG1lc3NhZ2VzIHRyYW5zZmVycmVkICovCisJaWYgKHJldCAhPSAyKSB7CisJCXByX2VycigiJXM6IGkyY19yZWFkIGZhaWxlZCB0byB0cmFuc2ZlciBhbGwgbWVzc2FnZXNcbiIsCisJCQlEUklWRVJfTkFNRSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJZWxzZQorCQkJcmV0dXJuIC1FSU87CisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorfQorRVhQT1JUX1NZTUJPTCh0d2xfaTJjX3JlYWQpOworCisvKioKKyAqIHR3bF9pMmNfd3JpdGVfdTggLSBXcml0ZXMgYSA4IGJpdCByZWdpc3RlciBpbiBUV0w0MDMwL1RXTDUwMzAvVFdMNjBYMAorICogQG1vZF9ubzogbW9kdWxlIG51bWJlcgorICogQHZhbHVlOiB0aGUgdmFsdWUgdG8gYmUgd3JpdHRlbiA4IGJpdAorICogQHJlZzogcmVnaXN0ZXIgYWRkcmVzcyAoanVzdCBvZmZzZXQgd2lsbCBkbykKKyAqCisgKiBSZXR1cm5zIHJlc3VsdCBvZiBvcGVyYXRpb24gLSAwIGlzIHN1Y2Nlc3MKKyAqLworaW50IHR3bF9pMmNfd3JpdGVfdTgodTggbW9kX25vLCB1OCB2YWx1ZSwgdTggcmVnKQoreworCisJLyogMiBieXRlcyBvZmZzZXQgMSBjb250YWlucyB0aGUgZGF0YSBvZmZzZXQgMCBpcyB1c2VkIGJ5IGkyY193cml0ZSAqLworCXU4IHRlbXBfYnVmZmVyWzJdID0geyAwIH07CisJLyogb2Zmc2V0IDEgY29udGFpbnMgdGhlIGRhdGEgKi8KKwl0ZW1wX2J1ZmZlclsxXSA9IHZhbHVlOworCXJldHVybiB0d2xfaTJjX3dyaXRlKG1vZF9ubywgdGVtcF9idWZmZXIsIHJlZywgMSk7Cit9CitFWFBPUlRfU1lNQk9MKHR3bF9pMmNfd3JpdGVfdTgpOworCisvKioKKyAqIHR3bF9pMmNfcmVhZF91OCAtIFJlYWRzIGEgOCBiaXQgcmVnaXN0ZXIgZnJvbSBUV0w0MDMwL1RXTDUwMzAvVFdMNjBYMAorICogQG1vZF9ubzogbW9kdWxlIG51bWJlcgorICogQHZhbHVlOiB0aGUgdmFsdWUgcmVhZCA4IGJpdAorICogQHJlZzogcmVnaXN0ZXIgYWRkcmVzcyAoanVzdCBvZmZzZXQgd2lsbCBkbykKKyAqCisgKiBSZXR1cm5zIHJlc3VsdCBvZiBvcGVyYXRpb24gLSAwIGlzIHN1Y2Nlc3MKKyAqLworaW50IHR3bF9pMmNfcmVhZF91OCh1OCBtb2Rfbm8sIHU4ICp2YWx1ZSwgdTggcmVnKQoreworCXJldHVybiB0d2xfaTJjX3JlYWQobW9kX25vLCB2YWx1ZSwgcmVnLCAxKTsKK30KK0VYUE9SVF9TWU1CT0wodHdsX2kyY19yZWFkX3U4KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHN0cnVjdCBkZXZpY2UgKgorYWRkX251bWJlcmVkX2NoaWxkKHVuc2lnbmVkIGNoaXAsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBudW0sCisJCXZvaWQgKnBkYXRhLCB1bnNpZ25lZCBwZGF0YV9sZW4sCisJCWJvb2wgY2FuX3dha2V1cCwgaW50IGlycTAsIGludCBpcnExKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXY7CisJc3RydWN0IHR3bF9jbGllbnQJKnR3bCA9ICZ0d2xfbW9kdWxlc1tjaGlwXTsKKwlpbnQJCQlzdGF0dXM7CisKKwlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKG5hbWUsIG51bSk7CisJaWYgKCFwZGV2KSB7CisJCWRldl9kYmcoJnR3bC0+Y2xpZW50LT5kZXYsICJjYW4ndCBhbGxvYyBkZXZcbiIpOworCQlzdGF0dXMgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgY2FuX3dha2V1cCk7CisJcGRldi0+ZGV2LnBhcmVudCA9ICZ0d2wtPmNsaWVudC0+ZGV2OworCisJaWYgKHBkYXRhKSB7CisJCXN0YXR1cyA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShwZGV2LCBwZGF0YSwgcGRhdGFfbGVuKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCWRldl9kYmcoJnBkZXYtPmRldiwgImNhbid0IGFkZCBwbGF0Zm9ybV9kYXRhXG4iKTsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCisJaWYgKGlycTApIHsKKwkJc3RydWN0IHJlc291cmNlIHJbMl0gPSB7CisJCQl7IC5zdGFydCA9IGlycTAsIC5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLCB9LAorCQkJeyAuc3RhcnQgPSBpcnExLCAuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwgfSwKKwkJfTsKKworCQlzdGF0dXMgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhwZGV2LCByLCBpcnExID8gMiA6IDEpOworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY2FuJ3QgYWRkIGlycXNcbiIpOworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwlzdGF0dXMgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOworCitlcnI6CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsKKwkJZGV2X2VycigmdHdsLT5jbGllbnQtPmRldiwgImNhbid0IGFkZCAlcyBkZXZcbiIsIG5hbWUpOworCQlyZXR1cm4gRVJSX1BUUihzdGF0dXMpOworCX0KKwlyZXR1cm4gJnBkZXYtPmRldjsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlICphZGRfY2hpbGQodW5zaWduZWQgY2hpcCwgY29uc3QgY2hhciAqbmFtZSwKKwkJdm9pZCAqcGRhdGEsIHVuc2lnbmVkIHBkYXRhX2xlbiwKKwkJYm9vbCBjYW5fd2FrZXVwLCBpbnQgaXJxMCwgaW50IGlycTEpCit7CisJcmV0dXJuIGFkZF9udW1iZXJlZF9jaGlsZChjaGlwLCBuYW1lLCAtMSwgcGRhdGEsIHBkYXRhX2xlbiwKKwkJY2FuX3dha2V1cCwgaXJxMCwgaXJxMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICoKK2FkZF9yZWd1bGF0b3JfbGlua2VkKGludCBudW0sIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICpwZGF0YSwKKwkJc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgKmNvbnN1bWVycywKKwkJdW5zaWduZWQgbnVtX2NvbnN1bWVycykKK3sKKwl1bnNpZ25lZCBzdWJfY2hpcF9pZDsKKwkvKiByZWd1bGF0b3IgZnJhbWV3b3JrIGRlbWFuZHMgaW5pdF9kYXRhIC4uLiAqLworCWlmICghcGRhdGEpCisJCXJldHVybiBOVUxMOworCisJaWYgKGNvbnN1bWVycykgeworCQlwZGF0YS0+Y29uc3VtZXJfc3VwcGxpZXMgPSBjb25zdW1lcnM7CisJCXBkYXRhLT5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSBudW1fY29uc3VtZXJzOworCX0KKworCS8qIE5PVEU6ICB3ZSBjdXJyZW50bHkgaWdub3JlIHJlZ3VsYXRvciBJUlFzLCBlLmcuIGZvciBzaG9ydCBjaXJjdWl0cyAqLworCXN1Yl9jaGlwX2lkID0gdHdsX21hcFtUV0xfTU9EVUxFX1BNX01BU1RFUl0uc2lkOworCXJldHVybiBhZGRfbnVtYmVyZWRfY2hpbGQoc3ViX2NoaXBfaWQsICJ0d2xfcmVnIiwgbnVtLAorCQlwZGF0YSwgc2l6ZW9mKCpwZGF0YSksIGZhbHNlLCAwLCAwKTsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2UgKgorYWRkX3JlZ3VsYXRvcihpbnQgbnVtLCBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqcGRhdGEpCit7CisJcmV0dXJuIGFkZF9yZWd1bGF0b3JfbGlua2VkKG51bSwgcGRhdGEsIE5VTEwsIDApOworfQorCisvKgorICogTk9URTogIFdlIGtub3cgdGhlIGZpcnN0IDggSVJRcyBhZnRlciBwZGF0YS0+YmFzZV9pcnEgYXJlCisgKiBmb3IgdGhlIFBJSCwgYW5kIHRoZSBuZXh0IGFyZSBmb3IgdGhlIFBXUl9JTlQgU0lILCBzaW5jZQorICogdGhhdCdzIGhvdyB0d2xfaW5pdF9pcnEoKSBzZXRzIHRoaW5ncyB1cC4KKyAqLworCitzdGF0aWMgaW50CithZGRfY2hpbGRyZW4oc3RydWN0IHR3bDQwMzBfcGxhdGZvcm1fZGF0YSAqcGRhdGEsIHVuc2lnbmVkIGxvbmcgZmVhdHVyZXMpCit7CisJc3RydWN0IGRldmljZQkqY2hpbGQ7CisJdW5zaWduZWQgc3ViX2NoaXBfaWQ7CisKKwlpZiAodHdsX2hhc19iY2koKSAmJiBwZGF0YS0+YmNpICYmCisJICAgICEoZmVhdHVyZXMgJiAoVFBTX1NVQlNFVCB8IFRXTDUwMzEpKSkgeworCQljaGlsZCA9IGFkZF9jaGlsZCgzLCAidHdsNDAzMF9iY2kiLAorCQkJCXBkYXRhLT5iY2ksIHNpemVvZigqcGRhdGEtPmJjaSksCisJCQkJZmFsc2UsCisJCQkJLyogaXJxMCA9IENIR19QUkVTLCBpcnExID0gQkNJICovCisJCQkJcGRhdGEtPmlycV9iYXNlICsgQkNJX1BSRVNfSU5UUl9PRkZTRVQsCisJCQkJcGRhdGEtPmlycV9iYXNlICsgQkNJX0lOVFJfT0ZGU0VUKTsKKwkJaWYgKElTX0VSUihjaGlsZCkpCisJCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7CisJfQorCisJaWYgKHR3bF9oYXNfZ3BpbygpICYmIHBkYXRhLT5ncGlvKSB7CisJCWNoaWxkID0gYWRkX2NoaWxkKFNVQl9DSElQX0lEMSwgInR3bDQwMzBfZ3BpbyIsCisJCQkJcGRhdGEtPmdwaW8sIHNpemVvZigqcGRhdGEtPmdwaW8pLAorCQkJCWZhbHNlLCBwZGF0YS0+aXJxX2Jhc2UgKyBHUElPX0lOVFJfT0ZGU0VULCAwKTsKKwkJaWYgKElTX0VSUihjaGlsZCkpCisJCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7CisJfQorCisJaWYgKHR3bF9oYXNfa2V5cGFkKCkgJiYgcGRhdGEtPmtleXBhZCkgeworCQljaGlsZCA9IGFkZF9jaGlsZChTVUJfQ0hJUF9JRDIsICJ0d2w0MDMwX2tleXBhZCIsCisJCQkJcGRhdGEtPmtleXBhZCwgc2l6ZW9mKCpwZGF0YS0+a2V5cGFkKSwKKwkJCQl0cnVlLCBwZGF0YS0+aXJxX2Jhc2UgKyBLRVlQQURfSU5UUl9PRkZTRVQsIDApOworCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKKwl9CisKKwlpZiAodHdsX2hhc19tYWRjKCkgJiYgcGRhdGEtPm1hZGMpIHsKKwkJY2hpbGQgPSBhZGRfY2hpbGQoMiwgInR3bDQwMzBfbWFkYyIsCisJCQkJcGRhdGEtPm1hZGMsIHNpemVvZigqcGRhdGEtPm1hZGMpLAorCQkJCXRydWUsIHBkYXRhLT5pcnFfYmFzZSArIE1BRENfSU5UUl9PRkZTRVQsIDApOworCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKKwl9CisKKwlpZiAodHdsX2hhc19ydGMoKSkgeworCQkvKgorCQkgKiBSRVZJU0lUIHBsYXRmb3JtX2RhdGEgaGVyZSBjdXJyZW50bHkgbWlnaHQgZXhwb3NlIHRoZQorCQkgKiAibXNlY3VyZSIgbGluZSAuLi4gYnV0IGZvciBub3cgd2UganVzdCBleHBlY3QgYm9hcmQKKwkJICogc2V0dXAgdG8gdGVsbCB0aGUgY2hpcCAiaXQncyBhbHdheXMgb2sgdG8gU0VUX1RJTUUiLgorCQkgKiBFdmVudHVhbGx5LCBMaW51eCBtaWdodCBiZWNvbWUgbW9yZSBhd2FyZSBvZiBzdWNoCisJCSAqIEhXIHNlY3VyaXR5IGNvbmNlcm5zLCBhbmQgImxlYXN0IHByaXZpbGVnZSIuCisJCSAqLworCQlzdWJfY2hpcF9pZCA9IHR3bF9tYXBbVFdMX01PRFVMRV9SVENdLnNpZDsKKwkJY2hpbGQgPSBhZGRfY2hpbGQoc3ViX2NoaXBfaWQsICJ0d2xfcnRjIiwKKwkJCQlOVUxMLCAwLAorCQkJCXRydWUsIHBkYXRhLT5pcnFfYmFzZSArIFJUQ19JTlRSX09GRlNFVCwgMCk7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOworCX0KKworCWlmICh0d2xfaGFzX3VzYigpICYmIHBkYXRhLT51c2IgJiYgdHdsX2NsYXNzX2lzXzQwMzAoKSkgeworCisJCXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB1c2IxdjUgPSB7CisJCQkuc3VwcGx5ID0JInVzYjF2NSIsCisJCX07CisJCXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB1c2IxdjggPSB7CisJCQkuc3VwcGx5ID0JInVzYjF2OCIsCisJCX07CisJCXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB1c2IzdjEgPSB7CisJCQkuc3VwcGx5ID0JInVzYjN2MSIsCisJCX07CisKKwkvKiBGaXJzdCBhZGQgdGhlIHJlZ3VsYXRvcnMgc28gdGhhdCB0aGV5IGNhbiBiZSB1c2VkIGJ5IHRyYW5zY2VpdmVyICovCisJCWlmICh0d2xfaGFzX3JlZ3VsYXRvcigpKSB7CisJCQkvKiB0aGlzIGlzIGEgdGVtcGxhdGUgdGhhdCBnZXRzIGNvcGllZCAqLworCQkJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgdXNiX2ZpeGVkID0geworCQkJCS5jb25zdHJhaW50cy52YWxpZF9tb2Rlc19tYXNrID0KKwkJCQkJUkVHVUxBVE9SX01PREVfTk9STUFMCisJCQkJCXwgUkVHVUxBVE9SX01PREVfU1RBTkRCWSwKKwkJCQkuY29uc3RyYWludHMudmFsaWRfb3BzX21hc2sgPQorCQkJCQlSRUdVTEFUT1JfQ0hBTkdFX01PREUKKwkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJCX07CisKKwkJCWNoaWxkID0gYWRkX3JlZ3VsYXRvcl9saW5rZWQoVFdMNDAzMF9SRUdfVlVTQjFWNSwKKwkJCQkJCSAgICAgICZ1c2JfZml4ZWQsICZ1c2IxdjUsIDEpOworCQkJaWYgKElTX0VSUihjaGlsZCkpCisJCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOworCisJCQljaGlsZCA9IGFkZF9yZWd1bGF0b3JfbGlua2VkKFRXTDQwMzBfUkVHX1ZVU0IxVjgsCisJCQkJCQkgICAgICAmdXNiX2ZpeGVkLCAmdXNiMXY4LCAxKTsKKwkJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKKworCQkJY2hpbGQgPSBhZGRfcmVndWxhdG9yX2xpbmtlZChUV0w0MDMwX1JFR19WVVNCM1YxLAorCQkJCQkJICAgICAgJnVzYl9maXhlZCwgJnVzYjN2MSwgMSk7CisJCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7CisKKwkJfQorCisJCWNoaWxkID0gYWRkX2NoaWxkKDAsICJ0d2w0MDMwX3VzYiIsCisJCQkJcGRhdGEtPnVzYiwgc2l6ZW9mKCpwZGF0YS0+dXNiKSwKKwkJCQl0cnVlLAorCQkJCS8qIGlycTAgPSBVU0JfUFJFUywgaXJxMSA9IFVTQiAqLworCQkJCXBkYXRhLT5pcnFfYmFzZSArIFVTQl9QUkVTX0lOVFJfT0ZGU0VULAorCQkJCXBkYXRhLT5pcnFfYmFzZSArIFVTQl9JTlRSX09GRlNFVCk7CisKKwkJaWYgKElTX0VSUihjaGlsZCkpCisJCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7CisKKwkJLyogd2UgbmVlZCB0byBjb25uZWN0IHJlZ3VsYXRvcnMgdG8gdGhpcyB0cmFuc2NlaXZlciAqLworCQlpZiAodHdsX2hhc19yZWd1bGF0b3IoKSAmJiBjaGlsZCkgeworCQkJdXNiMXY1LmRldiA9IGNoaWxkOworCQkJdXNiMXY4LmRldiA9IGNoaWxkOworCQkJdXNiM3YxLmRldiA9IGNoaWxkOworCQl9CisJfQorCisJaWYgKHR3bF9oYXNfd2F0Y2hkb2coKSkgeworCQljaGlsZCA9IGFkZF9jaGlsZCgwLCAidHdsNDAzMF93ZHQiLCBOVUxMLCAwLCBmYWxzZSwgMCwgMCk7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOworCX0KKworCWlmICh0d2xfaGFzX3B3cmJ1dHRvbigpKSB7CisJCWNoaWxkID0gYWRkX2NoaWxkKDEsICJ0d2w0MDMwX3B3cmJ1dHRvbiIsCisJCQkJTlVMTCwgMCwgdHJ1ZSwgcGRhdGEtPmlycV9iYXNlICsgOCArIDAsIDApOworCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKKwl9CisKKwlpZiAodHdsX2hhc19jb2RlYygpICYmIHBkYXRhLT5jb2RlYykgeworCQljaGlsZCA9IGFkZF9jaGlsZCgxLCAidHdsNDAzMF9jb2RlYyIsCisJCQkJcGRhdGEtPmNvZGVjLCBzaXplb2YoKnBkYXRhLT5jb2RlYyksCisJCQkJZmFsc2UsIDAsIDApOworCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKKwl9CisKKwkvKiB0d2w0MDMwIHJlZ3VsYXRvcnMgKi8KKwlpZiAodHdsX2hhc19yZWd1bGF0b3IoKSAmJiB0d2xfY2xhc3NfaXNfNDAzMCgpKSB7CisJCWNoaWxkID0gYWRkX3JlZ3VsYXRvcihUV0w0MDMwX1JFR19WUExMMSwgcGRhdGEtPnZwbGwxKTsKKwkJaWYgKElTX0VSUihjaGlsZCkpCisJCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7CisKKwkJY2hpbGQgPSBhZGRfcmVndWxhdG9yKFRXTDQwMzBfUkVHX1ZJTywgcGRhdGEtPnZpbyk7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOworCisJCWNoaWxkID0gYWRkX3JlZ3VsYXRvcihUV0w0MDMwX1JFR19WREQxLCBwZGF0YS0+dmRkMSk7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOworCisJCWNoaWxkID0gYWRkX3JlZ3VsYXRvcihUV0w0MDMwX1JFR19WREQyLCBwZGF0YS0+dmRkMik7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOworCisJCWNoaWxkID0gYWRkX3JlZ3VsYXRvcihUV0w0MDMwX1JFR19WTU1DMSwgcGRhdGEtPnZtbWMxKTsKKwkJaWYgKElTX0VSUihjaGlsZCkpCisJCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7CisKKwkJY2hpbGQgPSBhZGRfcmVndWxhdG9yKFRXTDQwMzBfUkVHX1ZEQUMsIHBkYXRhLT52ZGFjKTsKKwkJaWYgKElTX0VSUihjaGlsZCkpCisJCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7CisKKwkJY2hpbGQgPSBhZGRfcmVndWxhdG9yKChmZWF0dXJlcyAmIFRXTDQwMzBfVkFVWDIpCisJCQkJCT8gVFdMNDAzMF9SRUdfVkFVWDJfNDAzMAorCQkJCQk6IFRXTDQwMzBfUkVHX1ZBVVgyLAorCQkJCXBkYXRhLT52YXV4Mik7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOworCisJCWNoaWxkID0gYWRkX3JlZ3VsYXRvcihUV0w0MDMwX1JFR19WSU5UQU5BMSwgcGRhdGEtPnZpbnRhbmExKTsKKwkJaWYgKElTX0VSUihjaGlsZCkpCisJCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7CisKKwkJY2hpbGQgPSBhZGRfcmVndWxhdG9yKFRXTDQwMzBfUkVHX1ZJTlRBTkEyLCBwZGF0YS0+dmludGFuYTIpOworCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKKworCQljaGlsZCA9IGFkZF9yZWd1bGF0b3IoVFdMNDAzMF9SRUdfVklOVERJRywgcGRhdGEtPnZpbnRkaWcpOworCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKKwl9CisKKwkvKiBtYXliZSBhZGQgTERPcyB0aGF0IGFyZSBvbWl0dGVkIG9uIGNvc3QtcmVkdWNlZCBwYXJ0cyAqLworCWlmICh0d2xfaGFzX3JlZ3VsYXRvcigpICYmICEoZmVhdHVyZXMgJiBUUFNfU1VCU0VUKQorCSAgJiYgdHdsX2NsYXNzX2lzXzQwMzAoKSkgeworCQljaGlsZCA9IGFkZF9yZWd1bGF0b3IoVFdMNDAzMF9SRUdfVlBMTDIsIHBkYXRhLT52cGxsMik7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOworCisJCWNoaWxkID0gYWRkX3JlZ3VsYXRvcihUV0w0MDMwX1JFR19WTU1DMiwgcGRhdGEtPnZtbWMyKTsKKwkJaWYgKElTX0VSUihjaGlsZCkpCisJCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7CisKKwkJY2hpbGQgPSBhZGRfcmVndWxhdG9yKFRXTDQwMzBfUkVHX1ZTSU0sIHBkYXRhLT52c2ltKTsKKwkJaWYgKElTX0VSUihjaGlsZCkpCisJCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7CisKKwkJY2hpbGQgPSBhZGRfcmVndWxhdG9yKFRXTDQwMzBfUkVHX1ZBVVgxLCBwZGF0YS0+dmF1eDEpOworCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKKworCQljaGlsZCA9IGFkZF9yZWd1bGF0b3IoVFdMNDAzMF9SRUdfVkFVWDMsIHBkYXRhLT52YXV4Myk7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOworCisJCWNoaWxkID0gYWRkX3JlZ3VsYXRvcihUV0w0MDMwX1JFR19WQVVYNCwgcGRhdGEtPnZhdXg0KTsKKwkJaWYgKElTX0VSUihjaGlsZCkpCisJCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7CisJfQorCisJLyogdHdsNjAzMCByZWd1bGF0b3JzICovCisJaWYgKHR3bF9oYXNfcmVndWxhdG9yKCkgJiYgdHdsX2NsYXNzX2lzXzYwMzAoKSkgeworCQljaGlsZCA9IGFkZF9yZWd1bGF0b3IoVFdMNjAzMF9SRUdfVk1NQywgcGRhdGEtPnZtbWMpOworCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKKworCQljaGlsZCA9IGFkZF9yZWd1bGF0b3IoVFdMNjAzMF9SRUdfVlBQLCBwZGF0YS0+dnBwKTsKKwkJaWYgKElTX0VSUihjaGlsZCkpCisJCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7CisKKwkJY2hpbGQgPSBhZGRfcmVndWxhdG9yKFRXTDYwMzBfUkVHX1ZVU0lNLCBwZGF0YS0+dnVzaW0pOworCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKKworCQljaGlsZCA9IGFkZF9yZWd1bGF0b3IoVFdMNjAzMF9SRUdfVkFOQSwgcGRhdGEtPnZhbmEpOworCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKKworCQljaGlsZCA9IGFkZF9yZWd1bGF0b3IoVFdMNjAzMF9SRUdfVkNYSU8sIHBkYXRhLT52Y3hpbyk7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOworCisJCWNoaWxkID0gYWRkX3JlZ3VsYXRvcihUV0w2MDMwX1JFR19WREFDLCBwZGF0YS0+dmRhYyk7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOworCisJCWNoaWxkID0gYWRkX3JlZ3VsYXRvcihUV0w2MDMwX1JFR19WVVNCLCBwZGF0YS0+dnVzYik7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOworCisJCWNoaWxkID0gYWRkX3JlZ3VsYXRvcihUV0w2MDMwX1JFR19WQVVYMV82MDMwLCBwZGF0YS0+dmF1eDEpOworCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKKworCQljaGlsZCA9IGFkZF9yZWd1bGF0b3IoVFdMNjAzMF9SRUdfVkFVWDJfNjAzMCwgcGRhdGEtPnZhdXgyKTsKKwkJaWYgKElTX0VSUihjaGlsZCkpCisJCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7CisKKwkJY2hpbGQgPSBhZGRfcmVndWxhdG9yKFRXTDYwMzBfUkVHX1ZBVVgzXzYwMzAsIHBkYXRhLT52YXV4Myk7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOworCX0KKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogVGhlc2UgdGhyZWUgZnVuY3Rpb25zIGluaXRpYWxpemUgdGhlIG9uLWNoaXAgY2xvY2sgZnJhbWV3b3JrLAorICogbGV0dGluZyBpdCBnZW5lcmF0ZSB0aGUgcmlnaHQgZnJlcXVlbmNpZXMgZm9yIFVTQiwgTUFEQywgYW5kCisgKiBvdGhlciBwdXJwb3Nlcy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgX19pbml0IHByb3RlY3RfcG1fbWFzdGVyKHZvaWQpCit7CisJaW50IGUgPSAwOworCisJZSA9IHR3bF9pMmNfd3JpdGVfdTgoVFdMX01PRFVMRV9QTV9NQVNURVIsIEtFWV9MT0NLLAorCQkJUl9QUk9URUNUX0tFWSk7CisJcmV0dXJuIGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9faW5pdCB1bnByb3RlY3RfcG1fbWFzdGVyKHZvaWQpCit7CisJaW50IGUgPSAwOworCisJZSB8PSB0d2xfaTJjX3dyaXRlX3U4KFRXTF9NT0RVTEVfUE1fTUFTVEVSLCBLRVlfVU5MT0NLMSwKKwkJCVJfUFJPVEVDVF9LRVkpOworCWUgfD0gdHdsX2kyY193cml0ZV91OChUV0xfTU9EVUxFX1BNX01BU1RFUiwgS0VZX1VOTE9DSzIsCisJCQlSX1BST1RFQ1RfS0VZKTsKKwlyZXR1cm4gZTsKK30KKworc3RhdGljIHZvaWQgY2xvY2tzX2luaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IHR3bDQwMzBfY2xvY2tfaW5pdF9kYXRhICpjbG9jaykKK3sKKwlpbnQgZSA9IDA7CisJc3RydWN0IGNsayAqb3NjOworCXUzMiByYXRlOworCXU4IGN0cmwgPSBIRkNMS19GUkVRXzI2X01IWjsKKworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDIpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDMpCisJaWYgKGNwdV9pc19vbWFwMjQzMCgpKQorCQlvc2MgPSBjbGtfZ2V0KGRldiwgIm9zY19jayIpOworCWVsc2UKKwkJb3NjID0gY2xrX2dldChkZXYsICJvc2Nfc3lzX2NrIik7CisKKwlpZiAoSVNfRVJSKG9zYykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiU2tpcHBpbmcgdHdsIGludGVybmFsIGNsb2NrIGluaXQgYW5kICIKKwkJCQkidXNpbmcgYm9vdGxvYWRlciB2YWx1ZSAodW5rbm93biBvc2MgcmF0ZSlcbiIpOworCQlyZXR1cm47CisJfQorCisJcmF0ZSA9IGNsa19nZXRfcmF0ZShvc2MpOworCWNsa19wdXQob3NjKTsKKworI2Vsc2UKKwkvKiBSRVZJU0lUIGZvciBub24tT01BUCBzeXN0ZW1zLCBwYXNzIHRoZSBjbG9jayByYXRlIGZyb20KKwkgKiBib2FyZCBpbml0IGNvZGUsIHVzaW5nIHBsYXRmb3JtX2RhdGEuCisJICovCisJb3NjID0gRVJSX1BUUigtRUlPKTsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIlNraXBwaW5nIHR3bCBpbnRlcm5hbCBjbG9jayBpbml0IGFuZCAiCisJICAgICAgICJ1c2luZyBib290bG9hZGVyIHZhbHVlICh1bmtub3duIG9zYyByYXRlKVxuIik7CisKKwlyZXR1cm47CisjZW5kaWYKKworCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgMTkyMDAwMDA6CisJCWN0cmwgPSBIRkNMS19GUkVRXzE5cDJfTUhaOworCQlicmVhazsKKwljYXNlIDI2MDAwMDAwOgorCQljdHJsID0gSEZDTEtfRlJFUV8yNl9NSFo7CisJCWJyZWFrOworCWNhc2UgMzg0MDAwMDA6CisJCWN0cmwgPSBIRkNMS19GUkVRXzM4cDRfTUhaOworCQlicmVhazsKKwl9CisKKwljdHJsIHw9IEhJR0hfUEVSRl9TUTsKKwlpZiAoY2xvY2sgJiYgY2xvY2stPmNrMzJrX2xvd3B3cl9lbmFibGUpCisJCWN0cmwgfD0gQ0szMktfTE9XUFdSX0VOOworCisJZSB8PSB1bnByb3RlY3RfcG1fbWFzdGVyKCk7CisJLyogZWZmZWN0LT5NQURDK1VTQiBjayBlbiAqLworCWUgfD0gdHdsX2kyY193cml0ZV91OChUV0xfTU9EVUxFX1BNX01BU1RFUiwgY3RybCwgUl9DRkdfQk9PVCk7CisJZSB8PSBwcm90ZWN0X3BtX21hc3RlcigpOworCisJaWYgKGUgPCAwKQorCQlwcl9lcnIoIiVzOiBjbG9jayBpbml0IGVyciBbJWRdXG4iLCBEUklWRVJfTkFNRSwgZSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2ludCB0d2w0MDMwX2luaXRfaXJxKGludCBpcnFfbnVtLCB1bnNpZ25lZCBpcnFfYmFzZSwgdW5zaWduZWQgaXJxX2VuZCk7CitpbnQgdHdsNDAzMF9leGl0X2lycSh2b2lkKTsKK2ludCB0d2w0MDMwX2luaXRfY2hpcF9pcnEoY29uc3QgY2hhciAqY2hpcCk7CitpbnQgdHdsNjAzMF9pbml0X2lycShpbnQgaXJxX251bSwgdW5zaWduZWQgaXJxX2Jhc2UsIHVuc2lnbmVkIGlycV9lbmQpOworaW50IHR3bDYwMzBfZXhpdF9pcnEodm9pZCk7CisKK3N0YXRpYyBpbnQgdHdsX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXVuc2lnbmVkIGk7CisJaW50IHN0YXR1czsKKworCWlmICh0d2xfY2xhc3NfaXNfNDAzMCgpKQorCQlzdGF0dXMgPSB0d2w0MDMwX2V4aXRfaXJxKCk7CisJZWxzZQorCQlzdGF0dXMgPSB0d2w2MDMwX2V4aXRfaXJxKCk7CisKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCWZvciAoaSA9IDA7IGkgPCBUV0xfTlVNX1NMQVZFUzsgaSsrKSB7CisJCXN0cnVjdCB0d2xfY2xpZW50CSp0d2wgPSAmdHdsX21vZHVsZXNbaV07CisKKwkJaWYgKHR3bC0+Y2xpZW50ICYmIHR3bC0+Y2xpZW50ICE9IGNsaWVudCkKKwkJCWkyY191bnJlZ2lzdGVyX2RldmljZSh0d2wtPmNsaWVudCk7CisJCXR3bF9tb2R1bGVzW2ldLmNsaWVudCA9IE5VTEw7CisJfQorCWludXNlID0gZmFsc2U7CisJcmV0dXJuIDA7Cit9CisKKy8qIE5PVEU6ICB0aGlzIGRyaXZlciBvbmx5IGhhbmRsZXMgYSBzaW5nbGUgdHdsNDAzMC90cHM2NTl4MCBjaGlwICovCitzdGF0aWMgaW50IF9faW5pdAordHdsX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQJCQkJc3RhdHVzOworCXVuc2lnbmVkCQkJaTsKKwlzdHJ1Y3QgdHdsNDAzMF9wbGF0Zm9ybV9kYXRhCSpwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAoIXBkYXRhKSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAibm8gcGxhdGZvcm0gZGF0YT9cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMpID09IDApIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJjYW4ndCB0YWxrIEkyQz9cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoaW51c2UpIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJkcml2ZXIgaXMgYWxyZWFkeSBpbiB1c2VcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBUV0xfTlVNX1NMQVZFUzsgaSsrKSB7CisJCXN0cnVjdCB0d2xfY2xpZW50CSp0d2wgPSAmdHdsX21vZHVsZXNbaV07CisKKwkJdHdsLT5hZGRyZXNzID0gY2xpZW50LT5hZGRyICsgaTsKKwkJaWYgKGkgPT0gMCkKKwkJCXR3bC0+Y2xpZW50ID0gY2xpZW50OworCQllbHNlIHsKKwkJCXR3bC0+Y2xpZW50ID0gaTJjX25ld19kdW1teShjbGllbnQtPmFkYXB0ZXIsCisJCQkJCXR3bC0+YWRkcmVzcyk7CisJCQlpZiAoIXR3bC0+Y2xpZW50KSB7CisJCQkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkJCSJjYW4ndCBhdHRhY2ggY2xpZW50ICVkXG4iLCBpKTsKKwkJCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJfQorCQltdXRleF9pbml0KCZ0d2wtPnhmZXJfbG9jayk7CisJfQorCWludXNlID0gdHJ1ZTsKKwlpZiAoKGlkLT5kcml2ZXJfZGF0YSkgJiBUV0w2MDMwX0NMQVNTKSB7CisJCXR3bF9pZCA9IFRXTDYwMzBfQ0xBU1NfSUQ7CisJCXR3bF9tYXAgPSAmdHdsNjAzMF9tYXBbMF07CisJfSBlbHNlIHsKKwkJdHdsX2lkID0gVFdMNDAzMF9DTEFTU19JRDsKKwkJdHdsX21hcCA9ICZ0d2w0MDMwX21hcFswXTsKKwl9CisKKwkvKiBzZXR1cCBjbG9jayBmcmFtZXdvcmsgKi8KKwljbG9ja3NfaW5pdCgmY2xpZW50LT5kZXYsIHBkYXRhLT5jbG9jayk7CisKKwkvKiBsb2FkIHBvd2VyIGV2ZW50IHNjcmlwdHMgKi8KKwlpZiAodHdsX2hhc19wb3dlcigpICYmIHBkYXRhLT5wb3dlcikKKwkJdHdsNDAzMF9wb3dlcl9pbml0KHBkYXRhLT5wb3dlcik7CisKKwkvKiBNYXliZSBpbml0IHRoZSBUMiBJbnRlcnJ1cHQgc3Vic3lzdGVtICovCisJaWYgKGNsaWVudC0+aXJxCisJCQkmJiBwZGF0YS0+aXJxX2Jhc2UKKwkJCSYmIHBkYXRhLT5pcnFfZW5kID4gcGRhdGEtPmlycV9iYXNlKSB7CisJCWlmICh0d2xfY2xhc3NfaXNfNDAzMCgpKSB7CisJCQl0d2w0MDMwX2luaXRfY2hpcF9pcnEoaWQtPm5hbWUpOworCQkJc3RhdHVzID0gdHdsNDAzMF9pbml0X2lycShjbGllbnQtPmlycSwgcGRhdGEtPmlycV9iYXNlLAorCQkJcGRhdGEtPmlycV9lbmQpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gdHdsNjAzMF9pbml0X2lycShjbGllbnQtPmlycSwgcGRhdGEtPmlycV9iYXNlLAorCQkJcGRhdGEtPmlycV9lbmQpOworCQl9CisKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGZhaWw7CisJfQorCisJc3RhdHVzID0gYWRkX2NoaWxkcmVuKHBkYXRhLCBpZC0+ZHJpdmVyX2RhdGEpOworZmFpbDoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJdHdsX3JlbW92ZShjbGllbnQpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB0d2xfaWRzW10gPSB7CisJeyAidHdsNDAzMCIsIFRXTDQwMzBfVkFVWDIgfSwJLyogIlRyaXRvbiAyIiAqLworCXsgInR3bDUwMzAiLCAwIH0sCQkvKiBUMiB1cGRhdGVkICovCisJeyAidHdsNTAzMSIsIFRXTDUwMzEgfSwJCS8qIFRXTDUwMzAgdXBkYXRlZCAqLworCXsgInRwczY1OTUwIiwgMCB9LAkJLyogY2F0YWxvZyB2ZXJzaW9uIG9mIHR3bDUwMzAgKi8KKwl7ICJ0cHM2NTkzMCIsIFRQU19TVUJTRVQgfSwJLyogZmV3ZXIgTERPcyBhbmQgREFDczsgbm8gY2hhcmdlciAqLworCXsgInRwczY1OTIwIiwgVFBTX1NVQlNFVCB9LAkvKiBmZXdlciBMRE9zOyBubyBjb2RlYyBvciBjaGFyZ2VyICovCisJeyAidHdsNjAzMCIsIFRXTDYwMzBfQ0xBU1MgfSwJLyogIlBob2VuaXggcG93ZXIgY2hpcCIgKi8KKwl7IC8qIGVuZCBvZiBsaXN0ICovIH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHR3bF9pZHMpOworCisvKiBPbmUgQ2xpZW50IERyaXZlciAsIDQgQ2xpZW50cyAqLworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHR3bF9kcml2ZXIgPSB7CisJLmRyaXZlci5uYW1lCT0gRFJJVkVSX05BTUUsCisJLmlkX3RhYmxlCT0gdHdsX2lkcywKKwkucHJvYmUJCT0gdHdsX3Byb2JlLAorCS5yZW1vdmUJCT0gdHdsX3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHR3bF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZ0d2xfZHJpdmVyKTsKK30KK3N1YnN5c19pbml0Y2FsbCh0d2xfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0d2xfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZ0d2xfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHR3bF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSTJDIENvcmUgaW50ZXJmYWNlIGZvciBUV0wiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3R3bDQwMzAtY29yZS5jIGIvZHJpdmVycy9tZmQvdHdsNDAzMC1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNDQ5Y2QuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZmQvdHdsNDAzMC1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NzkgKzAsMCBAQAotLyoKLSAqIHR3bDQwMzBfY29yZS5jIC0gZHJpdmVyIGZvciBUV0w0MDMwL1RQUzY1OXgwIFBNIGFuZCBhdWRpbyBDT0RFQyBkZXZpY2VzCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KLSAqCi0gKiBNb2RpZmljYXRpb25zIHRvIGRlZmVyIGludGVycnVwdCBoYW5kbGluZyB0byBhIGtlcm5lbCB0aHJlYWQ6Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgotICoKLSAqIEJhc2VkIG9uIHRsdjMyMGFpYzIzLmM6Ci0gKiBDb3B5cmlnaHQgKGMpIGJ5IEthaSBTdmFobiA8a2FpLnN2YWhuQG5va2lhLmNvbT4KLSAqCi0gKiBDb2RlIGNsZWFudXAgYW5kIG1vZGlmaWNhdGlvbnMgdG8gSVJRIGhhbmRsZXIuCi0gKiBieSBzeWVkIGtoYXNpbSA8eDBraGFzaW1AdGkuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMvdHdsNDAzMC5oPgotCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMikgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMykKLSNpbmNsdWRlIDxwbGF0L2NwdS5oPgotI2VuZGlmCi0KLS8qCi0gKiBUaGUgVFdMNDAzMCAiVHJpdG9uIDIiIGlzIG9uZSBvZiBhIGZhbWlseSBvZiBhIG11bHRpLWZ1bmN0aW9uICJQb3dlcgotICogTWFuYWdlbWVudCBhbmQgU3lzdGVtIENvbXBhbmlvbiBEZXZpY2UiIGNoaXBzIG9yaWdpbmFsbHkgZGVzaWduZWQgZm9yCi0gKiB1c2UgaW4gT01BUDIgYW5kIE9NQVAgMyBiYXNlZCBzeXN0ZW1zLiAgSXRzIGNvbnRyb2wgaW50ZXJmYWNlcyB1c2UgSTJDLAotICogb2Z0ZW4gYXQgYXJvdW5kIDMgTWJpdC9zZWMsIGluY2x1ZGluZyBmb3IgaW50ZXJydXB0IGhhbmRsaW5nLgotICoKLSAqIFRoaXMgZHJpdmVyIGNvcmUgcHJvdmlkZXMgZ2VuaXJxIHN1cHBvcnQgZm9yIHRoZSBpbnRlcnJ1cHRzIGVtaXR0ZWQsCi0gKiBieSB0aGUgdmFyaW91cyBtb2R1bGVzLCBhbmQgZXhwb3J0cyByZWdpc3RlciBhY2Nlc3MgcHJpbWl0aXZlcy4KLSAqCi0gKiBGSVhNRSB0aGlzIGRyaXZlciBjdXJyZW50bHkgcmVxdWlyZXMgdXNlIG9mIHRoZSBmaXJzdCBpbnRlcnJ1cHQgbGluZQotICogKGFuZCBhc3NvY2lhdGVkIHJlZ2lzdGVycykuCi0gKi8KLQotI2RlZmluZSBEUklWRVJfTkFNRQkJCSJ0d2w0MDMwIgotCi0jaWYgZGVmaW5lZChDT05GSUdfVFdMNDAzMF9CQ0lfQkFUVEVSWSkgfHwgXAotCWRlZmluZWQoQ09ORklHX1RXTDQwMzBfQkNJX0JBVFRFUllfTU9EVUxFKQotI2RlZmluZSB0d2xfaGFzX2JjaSgpCQl0cnVlCi0jZWxzZQotI2RlZmluZSB0d2xfaGFzX2JjaSgpCQlmYWxzZQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9UV0w0MDMwKSB8fCBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9UV0w0MDMwX01PRFVMRSkKLSNkZWZpbmUgdHdsX2hhc19rZXlwYWQoKQl0cnVlCi0jZWxzZQotI2RlZmluZSB0d2xfaGFzX2tleXBhZCgpCWZhbHNlCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0dQSU9fVFdMNDAzMCkgfHwgZGVmaW5lZChDT05GSUdfR1BJT19UV0w0MDMwX01PRFVMRSkKLSNkZWZpbmUgdHdsX2hhc19ncGlvKCkJdHJ1ZQotI2Vsc2UKLSNkZWZpbmUgdHdsX2hhc19ncGlvKCkJZmFsc2UKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfUkVHVUxBVE9SX1RXTDQwMzApIFwKLQl8fCBkZWZpbmVkKENPTkZJR19SRUdVTEFUT1JfVFdMNDAzMF9NT0RVTEUpCi0jZGVmaW5lIHR3bF9oYXNfcmVndWxhdG9yKCkJdHJ1ZQotI2Vsc2UKLSNkZWZpbmUgdHdsX2hhc19yZWd1bGF0b3IoKQlmYWxzZQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19UV0w0MDMwX01BREMpIHx8IGRlZmluZWQoQ09ORklHX1RXTDQwMzBfTUFEQ19NT0RVTEUpCi0jZGVmaW5lIHR3bF9oYXNfbWFkYygpCXRydWUKLSNlbHNlCi0jZGVmaW5lIHR3bF9oYXNfbWFkYygpCWZhbHNlCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19UV0w0MDMwX1BPV0VSCi0jZGVmaW5lIHR3bF9oYXNfcG93ZXIoKSAgICAgICAgdHJ1ZQotI2Vsc2UKLSNkZWZpbmUgdHdsX2hhc19wb3dlcigpICAgICAgICBmYWxzZQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19SVENfRFJWX1RXTDQwMzApIHx8IGRlZmluZWQoQ09ORklHX1JUQ19EUlZfVFdMNDAzMF9NT0RVTEUpCi0jZGVmaW5lIHR3bF9oYXNfcnRjKCkJdHJ1ZQotI2Vsc2UKLSNkZWZpbmUgdHdsX2hhc19ydGMoKQlmYWxzZQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19UV0w0MDMwX1VTQikgfHwgZGVmaW5lZChDT05GSUdfVFdMNDAzMF9VU0JfTU9EVUxFKQotI2RlZmluZSB0d2xfaGFzX3VzYigpCXRydWUKLSNlbHNlCi0jZGVmaW5lIHR3bF9oYXNfdXNiKCkJZmFsc2UKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfVFdMNDAzMF9XQVRDSERPRykgfHwgXAotCWRlZmluZWQoQ09ORklHX1RXTDQwMzBfV0FUQ0hET0dfTU9EVUxFKQotI2RlZmluZSB0d2xfaGFzX3dhdGNoZG9nKCkgICAgICAgIHRydWUKLSNlbHNlCi0jZGVmaW5lIHR3bF9oYXNfd2F0Y2hkb2coKSAgICAgICAgZmFsc2UKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfVFdMNDAzMF9DT0RFQykgfHwgZGVmaW5lZChDT05GSUdfVFdMNDAzMF9DT0RFQ19NT0RVTEUpCi0jZGVmaW5lIHR3bF9oYXNfY29kZWMoKQl0cnVlCi0jZWxzZQotI2RlZmluZSB0d2xfaGFzX2NvZGVjKCkJZmFsc2UKLSNlbmRpZgotCi0vKiBUcml0b24gQ29yZSBpbnRlcm5hbCBpbmZvcm1hdGlvbiAoQkVHSU4pICovCi0KLS8qIExhc3QgLSBmb3IgaW5kZXggbWF4Ki8KLSNkZWZpbmUgVFdMNDAzMF9NT0RVTEVfTEFTVAkJVFdMNDAzMF9NT0RVTEVfU0VDVVJFRF9SRUcKLQotI2RlZmluZSBUV0w0MDMwX05VTV9TTEFWRVMJCTQKLQotI2lmIGRlZmluZWQoQ09ORklHX0lOUFVUX1RXTDQwMzBfUFdSQlVUVE9OKSBcCi0JfHwgZGVmaW5lZChDT05GSUdfSU5QVVRfVFdMNDAzMF9QV0JVVFRPTl9NT0RVTEUpCi0jZGVmaW5lIHR3bF9oYXNfcHdyYnV0dG9uKCkJdHJ1ZQotI2Vsc2UKLSNkZWZpbmUgdHdsX2hhc19wd3JidXR0b24oKQlmYWxzZQotI2VuZGlmCi0KLS8qIEJhc2UgQWRkcmVzcyBkZWZucyBmb3IgdHdsNDAzMF9tYXBbXSAqLwotCi0vKiBzdWJjaGlwL3NsYXZlIDAgLSBVU0IgSUQgKi8KLSNkZWZpbmUgVFdMNDAzMF9CQVNFQUREX1VTQgkJMHgwMDAwCi0KLS8qIHN1YmNoaXAvc2xhdmUgMSAtIEFVRCBJRCAqLwotI2RlZmluZSBUV0w0MDMwX0JBU0VBRERfQVVESU9fVk9JQ0UJMHgwMDAwCi0jZGVmaW5lIFRXTDQwMzBfQkFTRUFERF9HUElPCQkweDAwOTgKLSNkZWZpbmUgVFdMNDAzMF9CQVNFQUREX0lOVEJSCQkweDAwODUKLSNkZWZpbmUgVFdMNDAzMF9CQVNFQUREX1BJSAkJMHgwMDgwCi0jZGVmaW5lIFRXTDQwMzBfQkFTRUFERF9URVNUCQkweDAwNEMKLQotLyogc3ViY2hpcC9zbGF2ZSAyIC0gQVVYIElEICovCi0jZGVmaW5lIFRXTDQwMzBfQkFTRUFERF9JTlRFUlJVUFRTCTB4MDBCOQotI2RlZmluZSBUV0w0MDMwX0JBU0VBRERfTEVECQkweDAwRUUKLSNkZWZpbmUgVFdMNDAzMF9CQVNFQUREX01BREMJCTB4MDAwMAotI2RlZmluZSBUV0w0MDMwX0JBU0VBRERfTUFJTl9DSEFSR0UJMHgwMDc0Ci0jZGVmaW5lIFRXTDQwMzBfQkFTRUFERF9QUkVDSEFSR0UJMHgwMEFBCi0jZGVmaW5lIFRXTDQwMzBfQkFTRUFERF9QV00wCQkweDAwRjgKLSNkZWZpbmUgVFdMNDAzMF9CQVNFQUREX1BXTTEJCTB4MDBGQgotI2RlZmluZSBUV0w0MDMwX0JBU0VBRERfUFdNQQkJMHgwMEVGCi0jZGVmaW5lIFRXTDQwMzBfQkFTRUFERF9QV01CCQkweDAwRjEKLSNkZWZpbmUgVFdMNDAzMF9CQVNFQUREX0tFWVBBRAkJMHgwMEQyCi0KLS8qIHN1YmNoaXAvc2xhdmUgMyAtIFBPV0VSIElEICovCi0jZGVmaW5lIFRXTDQwMzBfQkFTRUFERF9CQUNLVVAJCTB4MDAxNAotI2RlZmluZSBUV0w0MDMwX0JBU0VBRERfSU5UCQkweDAwMkUKLSNkZWZpbmUgVFdMNDAzMF9CQVNFQUREX1BNX01BU1RFUgkweDAwMzYKLSNkZWZpbmUgVFdMNDAzMF9CQVNFQUREX1BNX1JFQ0VJVkVSCTB4MDA1QgotI2RlZmluZSBUV0w0MDMwX0JBU0VBRERfUlRDCQkweDAwMUMKLSNkZWZpbmUgVFdMNDAzMF9CQVNFQUREX1NFQ1VSRURfUkVHCTB4MDAwMAotCi0vKiBUcml0b24gQ29yZSBpbnRlcm5hbCBpbmZvcm1hdGlvbiAoRU5EKSAqLwotCi0KLS8qIEZldyBwb3dlciB2YWx1ZXMgKi8KLSNkZWZpbmUgUl9DRkdfQk9PVAkJCTB4MDUKLSNkZWZpbmUgUl9QUk9URUNUX0tFWQkJCTB4MEUKLQotLyogYWNjZXNzIGNvbnRyb2wgdmFsdWVzIGZvciBSX1BST1RFQ1RfS0VZICovCi0jZGVmaW5lIEtFWV9VTkxPQ0sxCQkJMHhjZQotI2RlZmluZSBLRVlfVU5MT0NLMgkJCTB4ZWMKLSNkZWZpbmUgS0VZX0xPQ0sJCQkweDAwCi0KLS8qIHNvbWUgZmllbGRzIGluIFJfQ0ZHX0JPT1QgKi8KLSNkZWZpbmUgSEZDTEtfRlJFUV8xOXAyX01IWgkJKDEgPDwgMCkKLSNkZWZpbmUgSEZDTEtfRlJFUV8yNl9NSFoJCSgyIDw8IDApCi0jZGVmaW5lIEhGQ0xLX0ZSRVFfMzhwNF9NSFoJCSgzIDw8IDApCi0jZGVmaW5lIEhJR0hfUEVSRl9TUQkJCSgxIDw8IDMpCi0KLQotLyogY2hpcC1zcGVjaWZpYyBmZWF0dXJlIGZsYWdzLCBmb3IgaTJjX2RldmljZV9pZC5kcml2ZXJfZGF0YSAqLwotI2RlZmluZSBUV0w0MDMwX1ZBVVgyCQlCSVQoMCkJLyogcHJlLTUwMzAgdm9sdGFnZSByYW5nZXMgKi8KLSNkZWZpbmUgVFBTX1NVQlNFVAkJQklUKDEpCS8qIHRwczY1OVsyM10wIGhhdmUgZmV3ZXIgTERPcyAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBpcyBkcml2ZXIgYWN0aXZlLCBib3VuZCB0byBhIGNoaXA/ICovCi1zdGF0aWMgYm9vbCBpbnVzZTsKLQotLyogU3RydWN0dXJlIGZvciBlYWNoIFRXTDQwMzAgU2xhdmUgKi8KLXN0cnVjdCB0d2w0MDMwX2NsaWVudCB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKLQl1OCBhZGRyZXNzOwotCi0JLyogbWF4IG51bWIgb2YgaTJjX21zZyByZXF1aXJlZCBpcyBmb3IgcmVhZCA9MiAqLwotCXN0cnVjdCBpMmNfbXNnIHhmZXJfbXNnWzJdOwotCi0JLyogVG8gbG9jayBhY2Nlc3MgdG8geGZlcl9tc2cgKi8KLQlzdHJ1Y3QgbXV0ZXggeGZlcl9sb2NrOwotfTsKLQotc3RhdGljIHN0cnVjdCB0d2w0MDMwX2NsaWVudCB0d2w0MDMwX21vZHVsZXNbVFdMNDAzMF9OVU1fU0xBVkVTXTsKLQotCi0vKiBtYXBwaW5nIHRoZSBtb2R1bGUgaWQgdG8gc2xhdmUgaWQgYW5kIGJhc2UgYWRkcmVzcyAqLwotc3RydWN0IHR3bDQwMzBtYXBwaW5nIHsKLQl1bnNpZ25lZCBjaGFyIHNpZDsJLyogU2xhdmUgSUQgKi8KLQl1bnNpZ25lZCBjaGFyIGJhc2U7CS8qIGJhc2UgYWRkcmVzcyAqLwotfTsKLQotc3RhdGljIHN0cnVjdCB0d2w0MDMwbWFwcGluZyB0d2w0MDMwX21hcFtUV0w0MDMwX01PRFVMRV9MQVNUICsgMV0gPSB7Ci0JLyoKLQkgKiBOT1RFOiAgZG9uJ3QgY2hhbmdlIHRoaXMgdGFibGUgd2l0aG91dCB1cGRhdGluZyB0aGUKLQkgKiA8bGludXgvaTJjL3R3bDQwMzAuaD4gZGVmaW5lcyBmb3IgVFdMNDAzMF9NT0RVTEVfKgotCSAqIHNvIHRoZXkgY29udGludWUgdG8gbWF0Y2ggdGhlIG9yZGVyIGluIHRoaXMgdGFibGUuCi0JICovCi0KLQl7IDAsIFRXTDQwMzBfQkFTRUFERF9VU0IgfSwKLQotCXsgMSwgVFdMNDAzMF9CQVNFQUREX0FVRElPX1ZPSUNFIH0sCi0JeyAxLCBUV0w0MDMwX0JBU0VBRERfR1BJTyB9LAotCXsgMSwgVFdMNDAzMF9CQVNFQUREX0lOVEJSIH0sCi0JeyAxLCBUV0w0MDMwX0JBU0VBRERfUElIIH0sCi0JeyAxLCBUV0w0MDMwX0JBU0VBRERfVEVTVCB9LAotCi0JeyAyLCBUV0w0MDMwX0JBU0VBRERfS0VZUEFEIH0sCi0JeyAyLCBUV0w0MDMwX0JBU0VBRERfTUFEQyB9LAotCXsgMiwgVFdMNDAzMF9CQVNFQUREX0lOVEVSUlVQVFMgfSwKLQl7IDIsIFRXTDQwMzBfQkFTRUFERF9MRUQgfSwKLQl7IDIsIFRXTDQwMzBfQkFTRUFERF9NQUlOX0NIQVJHRSB9LAotCXsgMiwgVFdMNDAzMF9CQVNFQUREX1BSRUNIQVJHRSB9LAotCXsgMiwgVFdMNDAzMF9CQVNFQUREX1BXTTAgfSwKLQl7IDIsIFRXTDQwMzBfQkFTRUFERF9QV00xIH0sCi0JeyAyLCBUV0w0MDMwX0JBU0VBRERfUFdNQSB9LAotCXsgMiwgVFdMNDAzMF9CQVNFQUREX1BXTUIgfSwKLQotCXsgMywgVFdMNDAzMF9CQVNFQUREX0JBQ0tVUCB9LAotCXsgMywgVFdMNDAzMF9CQVNFQUREX0lOVCB9LAotCXsgMywgVFdMNDAzMF9CQVNFQUREX1BNX01BU1RFUiB9LAotCXsgMywgVFdMNDAzMF9CQVNFQUREX1BNX1JFQ0VJVkVSIH0sCi0JeyAzLCBUV0w0MDMwX0JBU0VBRERfUlRDIH0sCi0JeyAzLCBUV0w0MDMwX0JBU0VBRERfU0VDVVJFRF9SRUcgfSwKLX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEV4cG9ydGVkIEZ1bmN0aW9ucyAqLwotCi0vKioKLSAqIHR3bDQwMzBfaTJjX3dyaXRlIC0gV3JpdGVzIGEgbiBiaXQgcmVnaXN0ZXIgaW4gVFdMNDAzMAotICogQG1vZF9ubzogbW9kdWxlIG51bWJlcgotICogQHZhbHVlOiBhbiBhcnJheSBvZiBudW1fYnl0ZXMrMSBjb250YWluaW5nIGRhdGEgdG8gd3JpdGUKLSAqIEByZWc6IHJlZ2lzdGVyIGFkZHJlc3MgKGp1c3Qgb2Zmc2V0IHdpbGwgZG8pCi0gKiBAbnVtX2J5dGVzOiBudW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNmZXIKLSAqCi0gKiBJTVBPUlRBTlQ6IGZvciAndmFsdWUnIHBhcmFtZXRlcjogQWxsb2NhdGUgdmFsdWUgbnVtX2J5dGVzKzEgYW5kCi0gKiB2YWxpZCBkYXRhIHN0YXJ0cyBhdCBPZmZzZXQgMS4KLSAqCi0gKiBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygb3BlcmF0aW9uIC0gMCBpcyBzdWNjZXNzCi0gKi8KLWludCB0d2w0MDMwX2kyY193cml0ZSh1OCBtb2Rfbm8sIHU4ICp2YWx1ZSwgdTggcmVnLCB1bnNpZ25lZCBudW1fYnl0ZXMpCi17Ci0JaW50IHJldDsKLQlpbnQgc2lkOwotCXN0cnVjdCB0d2w0MDMwX2NsaWVudCAqdHdsOwotCXN0cnVjdCBpMmNfbXNnICptc2c7Ci0KLQlpZiAodW5saWtlbHkobW9kX25vID4gVFdMNDAzMF9NT0RVTEVfTEFTVCkpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBtb2R1bGUgbnVtYmVyICVkXG4iLCBEUklWRVJfTkFNRSwgbW9kX25vKTsKLQkJcmV0dXJuIC1FUEVSTTsKLQl9Ci0Jc2lkID0gdHdsNDAzMF9tYXBbbW9kX25vXS5zaWQ7Ci0JdHdsID0gJnR3bDQwMzBfbW9kdWxlc1tzaWRdOwotCi0JaWYgKHVubGlrZWx5KCFpbnVzZSkpIHsKLQkJcHJfZXJyKCIlczogY2xpZW50ICVkIGlzIG5vdCBpbml0aWFsaXplZFxuIiwgRFJJVkVSX05BTUUsIHNpZCk7Ci0JCXJldHVybiAtRVBFUk07Ci0JfQotCW11dGV4X2xvY2soJnR3bC0+eGZlcl9sb2NrKTsKLQkvKgotCSAqIFtNU0cxXTogZmlsbCB0aGUgcmVnaXN0ZXIgYWRkcmVzcyBkYXRhCi0JICogZmlsbCB0aGUgZGF0YSBUeCBidWZmZXIKLQkgKi8KLQltc2cgPSAmdHdsLT54ZmVyX21zZ1swXTsKLQltc2ctPmFkZHIgPSB0d2wtPmFkZHJlc3M7Ci0JbXNnLT5sZW4gPSBudW1fYnl0ZXMgKyAxOwotCW1zZy0+ZmxhZ3MgPSAwOwotCW1zZy0+YnVmID0gdmFsdWU7Ci0JLyogb3ZlciB3cml0ZSB0aGUgZmlyc3QgYnl0ZSBvZiBidWZmZXIgd2l0aCB0aGUgcmVnaXN0ZXIgYWRkcmVzcyAqLwotCSp2YWx1ZSA9IHR3bDQwMzBfbWFwW21vZF9ub10uYmFzZSArIHJlZzsKLQlyZXQgPSBpMmNfdHJhbnNmZXIodHdsLT5jbGllbnQtPmFkYXB0ZXIsIHR3bC0+eGZlcl9tc2csIDEpOwotCW11dGV4X3VubG9jaygmdHdsLT54ZmVyX2xvY2spOwotCi0JLyogaTJjVHJhbnNmZXIgcmV0dXJucyBudW0gbWVzc2FnZXMudHJhbnNsYXRlIGl0IHBscy4uICovCi0JaWYgKHJldCA+PSAwKQotCQlyZXQgPSAwOwotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKHR3bDQwMzBfaTJjX3dyaXRlKTsKLQotLyoqCi0gKiB0d2w0MDMwX2kyY19yZWFkIC0gUmVhZHMgYSBuIGJpdCByZWdpc3RlciBpbiBUV0w0MDMwCi0gKiBAbW9kX25vOiBtb2R1bGUgbnVtYmVyCi0gKiBAdmFsdWU6IGFuIGFycmF5IG9mIG51bV9ieXRlcyBjb250YWluaW5nIGRhdGEgdG8gYmUgcmVhZAotICogQHJlZzogcmVnaXN0ZXIgYWRkcmVzcyAoanVzdCBvZmZzZXQgd2lsbCBkbykKLSAqIEBudW1fYnl0ZXM6IG51bWJlciBvZiBieXRlcyB0byB0cmFuc2ZlcgotICoKLSAqIFJldHVybnMgcmVzdWx0IG9mIG9wZXJhdGlvbiAtIG51bV9ieXRlcyBpcyBzdWNjZXNzIGVsc2UgZmFpbHVyZS4KLSAqLwotaW50IHR3bDQwMzBfaTJjX3JlYWQodTggbW9kX25vLCB1OCAqdmFsdWUsIHU4IHJlZywgdW5zaWduZWQgbnVtX2J5dGVzKQotewotCWludCByZXQ7Ci0JdTggdmFsOwotCWludCBzaWQ7Ci0Jc3RydWN0IHR3bDQwMzBfY2xpZW50ICp0d2w7Ci0Jc3RydWN0IGkyY19tc2cgKm1zZzsKLQotCWlmICh1bmxpa2VseShtb2Rfbm8gPiBUV0w0MDMwX01PRFVMRV9MQVNUKSkgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIG1vZHVsZSBudW1iZXIgJWRcbiIsIERSSVZFUl9OQU1FLCBtb2Rfbm8pOwotCQlyZXR1cm4gLUVQRVJNOwotCX0KLQlzaWQgPSB0d2w0MDMwX21hcFttb2Rfbm9dLnNpZDsKLQl0d2wgPSAmdHdsNDAzMF9tb2R1bGVzW3NpZF07Ci0KLQlpZiAodW5saWtlbHkoIWludXNlKSkgewotCQlwcl9lcnIoIiVzOiBjbGllbnQgJWQgaXMgbm90IGluaXRpYWxpemVkXG4iLCBEUklWRVJfTkFNRSwgc2lkKTsKLQkJcmV0dXJuIC1FUEVSTTsKLQl9Ci0JbXV0ZXhfbG9jaygmdHdsLT54ZmVyX2xvY2spOwotCS8qIFtNU0cxXSBmaWxsIHRoZSByZWdpc3RlciBhZGRyZXNzIGRhdGEgKi8KLQltc2cgPSAmdHdsLT54ZmVyX21zZ1swXTsKLQltc2ctPmFkZHIgPSB0d2wtPmFkZHJlc3M7Ci0JbXNnLT5sZW4gPSAxOwotCW1zZy0+ZmxhZ3MgPSAwOwkvKiBSZWFkIHRoZSByZWdpc3RlciB2YWx1ZSAqLwotCXZhbCA9IHR3bDQwMzBfbWFwW21vZF9ub10uYmFzZSArIHJlZzsKLQltc2ctPmJ1ZiA9ICZ2YWw7Ci0JLyogW01TRzJdIGZpbGwgdGhlIGRhdGEgcnggYnVmZmVyICovCi0JbXNnID0gJnR3bC0+eGZlcl9tc2dbMV07Ci0JbXNnLT5hZGRyID0gdHdsLT5hZGRyZXNzOwotCW1zZy0+ZmxhZ3MgPSBJMkNfTV9SRDsJLyogUmVhZCB0aGUgcmVnaXN0ZXIgdmFsdWUgKi8KLQltc2ctPmxlbiA9IG51bV9ieXRlczsJLyogb25seSBuIGJ5dGVzICovCi0JbXNnLT5idWYgPSB2YWx1ZTsKLQlyZXQgPSBpMmNfdHJhbnNmZXIodHdsLT5jbGllbnQtPmFkYXB0ZXIsIHR3bC0+eGZlcl9tc2csIDIpOwotCW11dGV4X3VubG9jaygmdHdsLT54ZmVyX2xvY2spOwotCi0JLyogaTJjVHJhbnNmZXIgcmV0dXJucyBudW0gbWVzc2FnZXMudHJhbnNsYXRlIGl0IHBscy4uICovCi0JaWYgKHJldCA+PSAwKQotCQlyZXQgPSAwOwotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKHR3bDQwMzBfaTJjX3JlYWQpOwotCi0vKioKLSAqIHR3bDQwMzBfaTJjX3dyaXRlX3U4IC0gV3JpdGVzIGEgOCBiaXQgcmVnaXN0ZXIgaW4gVFdMNDAzMAotICogQG1vZF9ubzogbW9kdWxlIG51bWJlcgotICogQHZhbHVlOiB0aGUgdmFsdWUgdG8gYmUgd3JpdHRlbiA4IGJpdAotICogQHJlZzogcmVnaXN0ZXIgYWRkcmVzcyAoanVzdCBvZmZzZXQgd2lsbCBkbykKLSAqCi0gKiBSZXR1cm5zIHJlc3VsdCBvZiBvcGVyYXRpb24gLSAwIGlzIHN1Y2Nlc3MKLSAqLwotaW50IHR3bDQwMzBfaTJjX3dyaXRlX3U4KHU4IG1vZF9ubywgdTggdmFsdWUsIHU4IHJlZykKLXsKLQotCS8qIDIgYnl0ZXMgb2Zmc2V0IDEgY29udGFpbnMgdGhlIGRhdGEgb2Zmc2V0IDAgaXMgdXNlZCBieSBpMmNfd3JpdGUgKi8KLQl1OCB0ZW1wX2J1ZmZlclsyXSA9IHsgMCB9OwotCS8qIG9mZnNldCAxIGNvbnRhaW5zIHRoZSBkYXRhICovCi0JdGVtcF9idWZmZXJbMV0gPSB2YWx1ZTsKLQlyZXR1cm4gdHdsNDAzMF9pMmNfd3JpdGUobW9kX25vLCB0ZW1wX2J1ZmZlciwgcmVnLCAxKTsKLX0KLUVYUE9SVF9TWU1CT0wodHdsNDAzMF9pMmNfd3JpdGVfdTgpOwotCi0vKioKLSAqIHR3bDQwMzBfaTJjX3JlYWRfdTggLSBSZWFkcyBhIDggYml0IHJlZ2lzdGVyIGZyb20gVFdMNDAzMAotICogQG1vZF9ubzogbW9kdWxlIG51bWJlcgotICogQHZhbHVlOiB0aGUgdmFsdWUgcmVhZCA4IGJpdAotICogQHJlZzogcmVnaXN0ZXIgYWRkcmVzcyAoanVzdCBvZmZzZXQgd2lsbCBkbykKLSAqCi0gKiBSZXR1cm5zIHJlc3VsdCBvZiBvcGVyYXRpb24gLSAwIGlzIHN1Y2Nlc3MKLSAqLwotaW50IHR3bDQwMzBfaTJjX3JlYWRfdTgodTggbW9kX25vLCB1OCAqdmFsdWUsIHU4IHJlZykKLXsKLQlyZXR1cm4gdHdsNDAzMF9pMmNfcmVhZChtb2Rfbm8sIHZhbHVlLCByZWcsIDEpOwotfQotRVhQT1JUX1NZTUJPTCh0d2w0MDMwX2kyY19yZWFkX3U4KTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHN0cnVjdCBkZXZpY2UgKgotYWRkX251bWJlcmVkX2NoaWxkKHVuc2lnbmVkIGNoaXAsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBudW0sCi0JCXZvaWQgKnBkYXRhLCB1bnNpZ25lZCBwZGF0YV9sZW4sCi0JCWJvb2wgY2FuX3dha2V1cCwgaW50IGlycTAsIGludCBpcnExKQotewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXY7Ci0Jc3RydWN0IHR3bDQwMzBfY2xpZW50CSp0d2wgPSAmdHdsNDAzMF9tb2R1bGVzW2NoaXBdOwotCWludAkJCXN0YXR1czsKLQotCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MobmFtZSwgbnVtKTsKLQlpZiAoIXBkZXYpIHsKLQkJZGV2X2RiZygmdHdsLT5jbGllbnQtPmRldiwgImNhbid0IGFsbG9jIGRldlxuIik7Ci0JCXN0YXR1cyA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyOwotCX0KLQotCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCBjYW5fd2FrZXVwKTsKLQlwZGV2LT5kZXYucGFyZW50ID0gJnR3bC0+Y2xpZW50LT5kZXY7Ci0KLQlpZiAocGRhdGEpIHsKLQkJc3RhdHVzID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHBkZXYsIHBkYXRhLCBwZGF0YV9sZW4pOwotCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY2FuJ3QgYWRkIHBsYXRmb3JtX2RhdGFcbiIpOwotCQkJZ290byBlcnI7Ci0JCX0KLQl9Ci0KLQlpZiAoaXJxMCkgewotCQlzdHJ1Y3QgcmVzb3VyY2UgclsyXSA9IHsKLQkJCXsgLnN0YXJ0ID0gaXJxMCwgLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsIH0sCi0JCQl7IC5zdGFydCA9IGlycTEsIC5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLCB9LAotCQl9OwotCi0JCXN0YXR1cyA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsIHIsIGlycTEgPyAyIDogMSk7Ci0JCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjYW4ndCBhZGQgaXJxc1xuIik7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0KLQotCXN0YXR1cyA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldik7Ci0KLWVycjoKLQlpZiAoc3RhdHVzIDwgMCkgewotCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHBkZXYpOwotCQlkZXZfZXJyKCZ0d2wtPmNsaWVudC0+ZGV2LCAiY2FuJ3QgYWRkICVzIGRldlxuIiwgbmFtZSk7Ci0JCXJldHVybiBFUlJfUFRSKHN0YXR1cyk7Ci0JfQotCXJldHVybiAmcGRldi0+ZGV2OwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZpY2UgKmFkZF9jaGlsZCh1bnNpZ25lZCBjaGlwLCBjb25zdCBjaGFyICpuYW1lLAotCQl2b2lkICpwZGF0YSwgdW5zaWduZWQgcGRhdGFfbGVuLAotCQlib29sIGNhbl93YWtldXAsIGludCBpcnEwLCBpbnQgaXJxMSkKLXsKLQlyZXR1cm4gYWRkX251bWJlcmVkX2NoaWxkKGNoaXAsIG5hbWUsIC0xLCBwZGF0YSwgcGRhdGFfbGVuLAotCQljYW5fd2FrZXVwLCBpcnEwLCBpcnExKTsKLX0KLQotc3RhdGljIHN0cnVjdCBkZXZpY2UgKgotYWRkX3JlZ3VsYXRvcl9saW5rZWQoaW50IG51bSwgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgKnBkYXRhLAotCQlzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSAqY29uc3VtZXJzLAotCQl1bnNpZ25lZCBudW1fY29uc3VtZXJzKQotewotCS8qIHJlZ3VsYXRvciBmcmFtZXdvcmsgZGVtYW5kcyBpbml0X2RhdGEgLi4uICovCi0JaWYgKCFwZGF0YSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoY29uc3VtZXJzKSB7Ci0JCXBkYXRhLT5jb25zdW1lcl9zdXBwbGllcyA9IGNvbnN1bWVyczsKLQkJcGRhdGEtPm51bV9jb25zdW1lcl9zdXBwbGllcyA9IG51bV9jb25zdW1lcnM7Ci0JfQotCi0JLyogTk9URTogIHdlIGN1cnJlbnRseSBpZ25vcmUgcmVndWxhdG9yIElSUXMsIGUuZy4gZm9yIHNob3J0IGNpcmN1aXRzICovCi0JcmV0dXJuIGFkZF9udW1iZXJlZF9jaGlsZCgzLCAidHdsNDAzMF9yZWciLCBudW0sCi0JCXBkYXRhLCBzaXplb2YoKnBkYXRhKSwgZmFsc2UsIDAsIDApOwotfQotCi1zdGF0aWMgc3RydWN0IGRldmljZSAqCi1hZGRfcmVndWxhdG9yKGludCBudW0sIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICpwZGF0YSkKLXsKLQlyZXR1cm4gYWRkX3JlZ3VsYXRvcl9saW5rZWQobnVtLCBwZGF0YSwgTlVMTCwgMCk7Ci19Ci0KLS8qCi0gKiBOT1RFOiAgV2Uga25vdyB0aGUgZmlyc3QgOCBJUlFzIGFmdGVyIHBkYXRhLT5iYXNlX2lycSBhcmUKLSAqIGZvciB0aGUgUElILCBhbmQgdGhlIG5leHQgYXJlIGZvciB0aGUgUFdSX0lOVCBTSUgsIHNpbmNlCi0gKiB0aGF0J3MgaG93IHR3bF9pbml0X2lycSgpIHNldHMgdGhpbmdzIHVwLgotICovCi0KLXN0YXRpYyBpbnQKLWFkZF9jaGlsZHJlbihzdHJ1Y3QgdHdsNDAzMF9wbGF0Zm9ybV9kYXRhICpwZGF0YSwgdW5zaWduZWQgbG9uZyBmZWF0dXJlcykKLXsKLQlzdHJ1Y3QgZGV2aWNlCSpjaGlsZDsKLQotCWlmICh0d2xfaGFzX2JjaSgpICYmIHBkYXRhLT5iY2kgJiYgIShmZWF0dXJlcyAmIFRQU19TVUJTRVQpKSB7Ci0JCWNoaWxkID0gYWRkX2NoaWxkKDMsICJ0d2w0MDMwX2JjaSIsCi0JCQkJcGRhdGEtPmJjaSwgc2l6ZW9mKCpwZGF0YS0+YmNpKSwKLQkJCQlmYWxzZSwKLQkJCQkvKiBpcnEwID0gQ0hHX1BSRVMsIGlycTEgPSBCQ0kgKi8KLQkJCQlwZGF0YS0+aXJxX2Jhc2UgKyA4ICsgMSwgcGRhdGEtPmlycV9iYXNlICsgMik7Ci0JCWlmIChJU19FUlIoY2hpbGQpKQotCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOwotCX0KLQotCWlmICh0d2xfaGFzX2dwaW8oKSAmJiBwZGF0YS0+Z3BpbykgewotCQljaGlsZCA9IGFkZF9jaGlsZCgxLCAidHdsNDAzMF9ncGlvIiwKLQkJCQlwZGF0YS0+Z3Bpbywgc2l6ZW9mKCpwZGF0YS0+Z3BpbyksCi0JCQkJZmFsc2UsIHBkYXRhLT5pcnFfYmFzZSArIDAsIDApOwotCQlpZiAoSVNfRVJSKGNoaWxkKSkKLQkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKLQl9Ci0KLQlpZiAodHdsX2hhc19rZXlwYWQoKSAmJiBwZGF0YS0+a2V5cGFkKSB7Ci0JCWNoaWxkID0gYWRkX2NoaWxkKDIsICJ0d2w0MDMwX2tleXBhZCIsCi0JCQkJcGRhdGEtPmtleXBhZCwgc2l6ZW9mKCpwZGF0YS0+a2V5cGFkKSwKLQkJCQl0cnVlLCBwZGF0YS0+aXJxX2Jhc2UgKyAxLCAwKTsKLQkJaWYgKElTX0VSUihjaGlsZCkpCi0JCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7Ci0JfQotCi0JaWYgKHR3bF9oYXNfbWFkYygpICYmIHBkYXRhLT5tYWRjKSB7Ci0JCWNoaWxkID0gYWRkX2NoaWxkKDIsICJ0d2w0MDMwX21hZGMiLAotCQkJCXBkYXRhLT5tYWRjLCBzaXplb2YoKnBkYXRhLT5tYWRjKSwKLQkJCQl0cnVlLCBwZGF0YS0+aXJxX2Jhc2UgKyAzLCAwKTsKLQkJaWYgKElTX0VSUihjaGlsZCkpCi0JCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7Ci0JfQotCi0JaWYgKHR3bF9oYXNfcnRjKCkpIHsKLQkJLyoKLQkJICogUkVWSVNJVCBwbGF0Zm9ybV9kYXRhIGhlcmUgY3VycmVudGx5IG1pZ2h0IGV4cG9zZSB0aGUKLQkJICogIm1zZWN1cmUiIGxpbmUgLi4uIGJ1dCBmb3Igbm93IHdlIGp1c3QgZXhwZWN0IGJvYXJkCi0JCSAqIHNldHVwIHRvIHRlbGwgdGhlIGNoaXAgIml0J3MgYWx3YXlzIG9rIHRvIFNFVF9USU1FIi4KLQkJICogRXZlbnR1YWxseSwgTGludXggbWlnaHQgYmVjb21lIG1vcmUgYXdhcmUgb2Ygc3VjaAotCQkgKiBIVyBzZWN1cml0eSBjb25jZXJucywgYW5kICJsZWFzdCBwcml2aWxlZ2UiLgotCQkgKi8KLQkJY2hpbGQgPSBhZGRfY2hpbGQoMywgInR3bDQwMzBfcnRjIiwKLQkJCQlOVUxMLCAwLAotCQkJCXRydWUsIHBkYXRhLT5pcnFfYmFzZSArIDggKyAzLCAwKTsKLQkJaWYgKElTX0VSUihjaGlsZCkpCi0JCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7Ci0JfQotCi0JaWYgKHR3bF9oYXNfdXNiKCkgJiYgcGRhdGEtPnVzYikgewotCi0JCXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB1c2IxdjUgPSB7Ci0JCQkuc3VwcGx5ID0JInVzYjF2NSIsCi0JCX07Ci0JCXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB1c2IxdjggPSB7Ci0JCQkuc3VwcGx5ID0JInVzYjF2OCIsCi0JCX07Ci0JCXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB1c2IzdjEgPSB7Ci0JCQkuc3VwcGx5ID0JInVzYjN2MSIsCi0JCX07Ci0KLQkvKiBGaXJzdCBhZGQgdGhlIHJlZ3VsYXRvcnMgc28gdGhhdCB0aGV5IGNhbiBiZSB1c2VkIGJ5IHRyYW5zY2VpdmVyICovCi0JCWlmICh0d2xfaGFzX3JlZ3VsYXRvcigpKSB7Ci0JCQkvKiB0aGlzIGlzIGEgdGVtcGxhdGUgdGhhdCBnZXRzIGNvcGllZCAqLwotCQkJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgdXNiX2ZpeGVkID0gewotCQkJCS5jb25zdHJhaW50cy52YWxpZF9tb2Rlc19tYXNrID0KLQkJCQkJUkVHVUxBVE9SX01PREVfTk9STUFMCi0JCQkJCXwgUkVHVUxBVE9SX01PREVfU1RBTkRCWSwKLQkJCQkuY29uc3RyYWludHMudmFsaWRfb3BzX21hc2sgPQotCQkJCQlSRUdVTEFUT1JfQ0hBTkdFX01PREUKLQkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQkJCX07Ci0KLQkJCWNoaWxkID0gYWRkX3JlZ3VsYXRvcl9saW5rZWQoVFdMNDAzMF9SRUdfVlVTQjFWNSwKLQkJCQkJCSAgICAgICZ1c2JfZml4ZWQsICZ1c2IxdjUsIDEpOwotCQkJaWYgKElTX0VSUihjaGlsZCkpCi0JCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOwotCi0JCQljaGlsZCA9IGFkZF9yZWd1bGF0b3JfbGlua2VkKFRXTDQwMzBfUkVHX1ZVU0IxVjgsCi0JCQkJCQkgICAgICAmdXNiX2ZpeGVkLCAmdXNiMXY4LCAxKTsKLQkJCWlmIChJU19FUlIoY2hpbGQpKQotCQkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKLQotCQkJY2hpbGQgPSBhZGRfcmVndWxhdG9yX2xpbmtlZChUV0w0MDMwX1JFR19WVVNCM1YxLAotCQkJCQkJICAgICAgJnVzYl9maXhlZCwgJnVzYjN2MSwgMSk7Ci0JCQlpZiAoSVNfRVJSKGNoaWxkKSkKLQkJCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7Ci0KLQkJfQotCi0JCWNoaWxkID0gYWRkX2NoaWxkKDAsICJ0d2w0MDMwX3VzYiIsCi0JCQkJcGRhdGEtPnVzYiwgc2l6ZW9mKCpwZGF0YS0+dXNiKSwKLQkJCQl0cnVlLAotCQkJCS8qIGlycTAgPSBVU0JfUFJFUywgaXJxMSA9IFVTQiAqLwotCQkJCXBkYXRhLT5pcnFfYmFzZSArIDggKyAyLCBwZGF0YS0+aXJxX2Jhc2UgKyA0KTsKLQotCQlpZiAoSVNfRVJSKGNoaWxkKSkKLQkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKLQotCQkvKiB3ZSBuZWVkIHRvIGNvbm5lY3QgcmVndWxhdG9ycyB0byB0aGlzIHRyYW5zY2VpdmVyICovCi0JCWlmICh0d2xfaGFzX3JlZ3VsYXRvcigpICYmIGNoaWxkKSB7Ci0JCQl1c2IxdjUuZGV2ID0gY2hpbGQ7Ci0JCQl1c2IxdjguZGV2ID0gY2hpbGQ7Ci0JCQl1c2IzdjEuZGV2ID0gY2hpbGQ7Ci0JCX0KLQl9Ci0KLQlpZiAodHdsX2hhc193YXRjaGRvZygpKSB7Ci0JCWNoaWxkID0gYWRkX2NoaWxkKDAsICJ0d2w0MDMwX3dkdCIsIE5VTEwsIDAsIGZhbHNlLCAwLCAwKTsKLQkJaWYgKElTX0VSUihjaGlsZCkpCi0JCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7Ci0JfQotCi0JaWYgKHR3bF9oYXNfcHdyYnV0dG9uKCkpIHsKLQkJY2hpbGQgPSBhZGRfY2hpbGQoMSwgInR3bDQwMzBfcHdyYnV0dG9uIiwKLQkJCQlOVUxMLCAwLCB0cnVlLCBwZGF0YS0+aXJxX2Jhc2UgKyA4ICsgMCwgMCk7Ci0JCWlmIChJU19FUlIoY2hpbGQpKQotCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOwotCX0KLQotCWlmICh0d2xfaGFzX2NvZGVjKCkgJiYgcGRhdGEtPmNvZGVjKSB7Ci0JCWNoaWxkID0gYWRkX2NoaWxkKDEsICJ0d2w0MDMwX2NvZGVjIiwKLQkJCQlwZGF0YS0+Y29kZWMsIHNpemVvZigqcGRhdGEtPmNvZGVjKSwKLQkJCQlmYWxzZSwgMCwgMCk7Ci0JCWlmIChJU19FUlIoY2hpbGQpKQotCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOwotCX0KLQotCWlmICh0d2xfaGFzX3JlZ3VsYXRvcigpKSB7Ci0JCS8qCi0JCWNoaWxkID0gYWRkX3JlZ3VsYXRvcihUV0w0MDMwX1JFR19WUExMMSwgcGRhdGEtPnZwbGwxKTsKLQkJaWYgKElTX0VSUihjaGlsZCkpCi0JCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7Ci0JCSovCi0KLQkJY2hpbGQgPSBhZGRfcmVndWxhdG9yKFRXTDQwMzBfUkVHX1ZNTUMxLCBwZGF0YS0+dm1tYzEpOwotCQlpZiAoSVNfRVJSKGNoaWxkKSkKLQkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKLQotCQljaGlsZCA9IGFkZF9yZWd1bGF0b3IoVFdMNDAzMF9SRUdfVkRBQywgcGRhdGEtPnZkYWMpOwotCQlpZiAoSVNfRVJSKGNoaWxkKSkKLQkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKLQotCQljaGlsZCA9IGFkZF9yZWd1bGF0b3IoKGZlYXR1cmVzICYgVFdMNDAzMF9WQVVYMikKLQkJCQkJPyBUV0w0MDMwX1JFR19WQVVYMl80MDMwCi0JCQkJCTogVFdMNDAzMF9SRUdfVkFVWDIsCi0JCQkJcGRhdGEtPnZhdXgyKTsKLQkJaWYgKElTX0VSUihjaGlsZCkpCi0JCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7Ci0JfQotCi0JLyogbWF5YmUgYWRkIExET3MgdGhhdCBhcmUgb21pdHRlZCBvbiBjb3N0LXJlZHVjZWQgcGFydHMgKi8KLQlpZiAodHdsX2hhc19yZWd1bGF0b3IoKSAmJiAhKGZlYXR1cmVzICYgVFBTX1NVQlNFVCkpIHsKLQkJY2hpbGQgPSBhZGRfcmVndWxhdG9yKFRXTDQwMzBfUkVHX1ZQTEwyLCBwZGF0YS0+dnBsbDIpOwotCQlpZiAoSVNfRVJSKGNoaWxkKSkKLQkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKLQotCQljaGlsZCA9IGFkZF9yZWd1bGF0b3IoVFdMNDAzMF9SRUdfVk1NQzIsIHBkYXRhLT52bW1jMik7Ci0JCWlmIChJU19FUlIoY2hpbGQpKQotCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOwotCi0JCWNoaWxkID0gYWRkX3JlZ3VsYXRvcihUV0w0MDMwX1JFR19WU0lNLCBwZGF0YS0+dnNpbSk7Ci0JCWlmIChJU19FUlIoY2hpbGQpKQotCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOwotCi0JCWNoaWxkID0gYWRkX3JlZ3VsYXRvcihUV0w0MDMwX1JFR19WQVVYMSwgcGRhdGEtPnZhdXgxKTsKLQkJaWYgKElTX0VSUihjaGlsZCkpCi0JCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7Ci0KLQkJY2hpbGQgPSBhZGRfcmVndWxhdG9yKFRXTDQwMzBfUkVHX1ZBVVgzLCBwZGF0YS0+dmF1eDMpOwotCQlpZiAoSVNfRVJSKGNoaWxkKSkKLQkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKLQotCQljaGlsZCA9IGFkZF9yZWd1bGF0b3IoVFdMNDAzMF9SRUdfVkFVWDQsIHBkYXRhLT52YXV4NCk7Ci0JCWlmIChJU19FUlIoY2hpbGQpKQotCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotICogVGhlc2UgdGhyZWUgZnVuY3Rpb25zIGluaXRpYWxpemUgdGhlIG9uLWNoaXAgY2xvY2sgZnJhbWV3b3JrLAotICogbGV0dGluZyBpdCBnZW5lcmF0ZSB0aGUgcmlnaHQgZnJlcXVlbmNpZXMgZm9yIFVTQiwgTUFEQywgYW5kCi0gKiBvdGhlciBwdXJwb3Nlcy4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgX19pbml0IHByb3RlY3RfcG1fbWFzdGVyKHZvaWQpCi17Ci0JaW50IGUgPSAwOwotCi0JZSA9IHR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX01BU1RFUiwgS0VZX0xPQ0ssCi0JCQlSX1BST1RFQ1RfS0VZKTsKLQlyZXR1cm4gZTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgX19pbml0IHVucHJvdGVjdF9wbV9tYXN0ZXIodm9pZCkKLXsKLQlpbnQgZSA9IDA7Ci0KLQllIHw9IHR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX01BU1RFUiwgS0VZX1VOTE9DSzEsCi0JCQlSX1BST1RFQ1RfS0VZKTsKLQllIHw9IHR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX01BU1RFUiwgS0VZX1VOTE9DSzIsCi0JCQlSX1BST1RFQ1RfS0VZKTsKLQlyZXR1cm4gZTsKLX0KLQotc3RhdGljIHZvaWQgY2xvY2tzX2luaXQoc3RydWN0IGRldmljZSAqZGV2KQotewotCWludCBlID0gMDsKLQlzdHJ1Y3QgY2xrICpvc2M7Ci0JdTMyIHJhdGU7Ci0JdTggY3RybCA9IEhGQ0xLX0ZSRVFfMjZfTUhaOwotCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMikgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMykKLQlpZiAoY3B1X2lzX29tYXAyNDMwKCkpCi0JCW9zYyA9IGNsa19nZXQoZGV2LCAib3NjX2NrIik7Ci0JZWxzZQotCQlvc2MgPSBjbGtfZ2V0KGRldiwgIm9zY19zeXNfY2siKTsKLQotCWlmIChJU19FUlIob3NjKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJTa2lwcGluZyB0d2w0MDMwIGludGVybmFsIGNsb2NrIGluaXQgYW5kICIKLQkJCQkidXNpbmcgYm9vdGxvYWRlciB2YWx1ZSAodW5rbm93biBvc2MgcmF0ZSlcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JcmF0ZSA9IGNsa19nZXRfcmF0ZShvc2MpOwotCWNsa19wdXQob3NjKTsKLQotI2Vsc2UKLQkvKiBSRVZJU0lUIGZvciBub24tT01BUCBzeXN0ZW1zLCBwYXNzIHRoZSBjbG9jayByYXRlIGZyb20KLQkgKiBib2FyZCBpbml0IGNvZGUsIHVzaW5nIHBsYXRmb3JtX2RhdGEuCi0JICovCi0Jb3NjID0gRVJSX1BUUigtRUlPKTsKLQotCXByaW50ayhLRVJOX1dBUk5JTkcgIlNraXBwaW5nIHR3bDQwMzAgaW50ZXJuYWwgY2xvY2sgaW5pdCBhbmQgIgotCSAgICAgICAidXNpbmcgYm9vdGxvYWRlciB2YWx1ZSAodW5rbm93biBvc2MgcmF0ZSlcbiIpOwotCi0JcmV0dXJuOwotI2VuZGlmCi0KLQlzd2l0Y2ggKHJhdGUpIHsKLQljYXNlIDE5MjAwMDAwOgotCQljdHJsID0gSEZDTEtfRlJFUV8xOXAyX01IWjsKLQkJYnJlYWs7Ci0JY2FzZSAyNjAwMDAwMDoKLQkJY3RybCA9IEhGQ0xLX0ZSRVFfMjZfTUhaOwotCQlicmVhazsKLQljYXNlIDM4NDAwMDAwOgotCQljdHJsID0gSEZDTEtfRlJFUV8zOHA0X01IWjsKLQkJYnJlYWs7Ci0JfQotCi0JY3RybCB8PSBISUdIX1BFUkZfU1E7Ci0JZSB8PSB1bnByb3RlY3RfcG1fbWFzdGVyKCk7Ci0JLyogZWZmZWN0LT5NQURDK1VTQiBjayBlbiAqLwotCWUgfD0gdHdsNDAzMF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSLCBjdHJsLCBSX0NGR19CT09UKTsKLQllIHw9IHByb3RlY3RfcG1fbWFzdGVyKCk7Ci0KLQlpZiAoZSA8IDApCi0JCXByX2VycigiJXM6IGNsb2NrIGluaXQgZXJyIFslZF1cbiIsIERSSVZFUl9OQU1FLCBlKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotaW50IHR3bF9pbml0X2lycShpbnQgaXJxX251bSwgdW5zaWduZWQgaXJxX2Jhc2UsIHVuc2lnbmVkIGlycV9lbmQpOwotaW50IHR3bF9leGl0X2lycSh2b2lkKTsKLQotc3RhdGljIGludCB0d2w0MDMwX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXVuc2lnbmVkIGk7Ci0JaW50IHN0YXR1czsKLQotCXN0YXR1cyA9IHR3bF9leGl0X2lycSgpOwotCWlmIChzdGF0dXMgPCAwKQotCQlyZXR1cm4gc3RhdHVzOwotCi0JZm9yIChpID0gMDsgaSA8IFRXTDQwMzBfTlVNX1NMQVZFUzsgaSsrKSB7Ci0JCXN0cnVjdCB0d2w0MDMwX2NsaWVudAkqdHdsID0gJnR3bDQwMzBfbW9kdWxlc1tpXTsKLQotCQlpZiAodHdsLT5jbGllbnQgJiYgdHdsLT5jbGllbnQgIT0gY2xpZW50KQotCQkJaTJjX3VucmVnaXN0ZXJfZGV2aWNlKHR3bC0+Y2xpZW50KTsKLQkJdHdsNDAzMF9tb2R1bGVzW2ldLmNsaWVudCA9IE5VTEw7Ci0JfQotCWludXNlID0gZmFsc2U7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIE5PVEU6ICB0aGlzIGRyaXZlciBvbmx5IGhhbmRsZXMgYSBzaW5nbGUgdHdsNDAzMC90cHM2NTl4MCBjaGlwICovCi1zdGF0aWMgaW50IF9faW5pdAotdHdsNDAzMF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCi17Ci0JaW50CQkJCXN0YXR1czsKLQl1bnNpZ25lZAkJCWk7Ci0Jc3RydWN0IHR3bDQwMzBfcGxhdGZvcm1fZGF0YQkqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCi0JaWYgKCFwZGF0YSkgewotCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIm5vIHBsYXRmb3JtIGRhdGE/XG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSA9PSAwKSB7Ci0JCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiY2FuJ3QgdGFsayBJMkM/XG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JaWYgKGludXNlKSB7Ci0JCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiZHJpdmVyIGlzIGFscmVhZHkgaW4gdXNlXG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgVFdMNDAzMF9OVU1fU0xBVkVTOyBpKyspIHsKLQkJc3RydWN0IHR3bDQwMzBfY2xpZW50CSp0d2wgPSAmdHdsNDAzMF9tb2R1bGVzW2ldOwotCi0JCXR3bC0+YWRkcmVzcyA9IGNsaWVudC0+YWRkciArIGk7Ci0JCWlmIChpID09IDApCi0JCQl0d2wtPmNsaWVudCA9IGNsaWVudDsKLQkJZWxzZSB7Ci0JCQl0d2wtPmNsaWVudCA9IGkyY19uZXdfZHVtbXkoY2xpZW50LT5hZGFwdGVyLAotCQkJCQl0d2wtPmFkZHJlc3MpOwotCQkJaWYgKCF0d2wtPmNsaWVudCkgewotCQkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAotCQkJCQkiY2FuJ3QgYXR0YWNoIGNsaWVudCAlZFxuIiwgaSk7Ci0JCQkJc3RhdHVzID0gLUVOT01FTTsKLQkJCQlnb3RvIGZhaWw7Ci0JCQl9Ci0JCQlzdHJsY3B5KHR3bC0+Y2xpZW50LT5uYW1lLCBpZC0+bmFtZSwKLQkJCQkJc2l6ZW9mKHR3bC0+Y2xpZW50LT5uYW1lKSk7Ci0JCX0KLQkJbXV0ZXhfaW5pdCgmdHdsLT54ZmVyX2xvY2spOwotCX0KLQlpbnVzZSA9IHRydWU7Ci0KLQkvKiBzZXR1cCBjbG9jayBmcmFtZXdvcmsgKi8KLQljbG9ja3NfaW5pdCgmY2xpZW50LT5kZXYpOwotCi0JLyogbG9hZCBwb3dlciBldmVudCBzY3JpcHRzICovCi0JaWYgKHR3bF9oYXNfcG93ZXIoKSAmJiBwZGF0YS0+cG93ZXIpCi0JCXR3bDQwMzBfcG93ZXJfaW5pdChwZGF0YS0+cG93ZXIpOwotCi0JLyogTWF5YmUgaW5pdCB0aGUgVDIgSW50ZXJydXB0IHN1YnN5c3RlbSAqLwotCWlmIChjbGllbnQtPmlycQotCQkJJiYgcGRhdGEtPmlycV9iYXNlCi0JCQkmJiBwZGF0YS0+aXJxX2VuZCA+IHBkYXRhLT5pcnFfYmFzZSkgewotCQlzdGF0dXMgPSB0d2xfaW5pdF9pcnEoY2xpZW50LT5pcnEsIHBkYXRhLT5pcnFfYmFzZSwgcGRhdGEtPmlycV9lbmQpOwotCQlpZiAoc3RhdHVzIDwgMCkKLQkJCWdvdG8gZmFpbDsKLQl9Ci0KLQlzdGF0dXMgPSBhZGRfY2hpbGRyZW4ocGRhdGEsIGlkLT5kcml2ZXJfZGF0YSk7Ci1mYWlsOgotCWlmIChzdGF0dXMgPCAwKQotCQl0d2w0MDMwX3JlbW92ZShjbGllbnQpOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB0d2w0MDMwX2lkc1tdID0gewotCXsgInR3bDQwMzAiLCBUV0w0MDMwX1ZBVVgyIH0sCS8qICJUcml0b24gMiIgKi8KLQl7ICJ0d2w1MDMwIiwgMCB9LAkJLyogVDIgdXBkYXRlZCAqLwotCXsgInRwczY1OTUwIiwgMCB9LAkJLyogY2F0YWxvZyB2ZXJzaW9uIG9mIHR3bDUwMzAgKi8KLQl7ICJ0cHM2NTkzMCIsIFRQU19TVUJTRVQgfSwJLyogZmV3ZXIgTERPcyBhbmQgREFDczsgbm8gY2hhcmdlciAqLwotCXsgInRwczY1OTIwIiwgVFBTX1NVQlNFVCB9LAkvKiBmZXdlciBMRE9zOyBubyBjb2RlYyBvciBjaGFyZ2VyICovCi0JeyAvKiBlbmQgb2YgbGlzdCAqLyB9LAotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCB0d2w0MDMwX2lkcyk7Ci0KLS8qIE9uZSBDbGllbnQgRHJpdmVyICwgNCBDbGllbnRzICovCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdHdsNDAzMF9kcml2ZXIgPSB7Ci0JLmRyaXZlci5uYW1lCT0gRFJJVkVSX05BTUUsCi0JLmlkX3RhYmxlCT0gdHdsNDAzMF9pZHMsCi0JLnByb2JlCQk9IHR3bDQwMzBfcHJvYmUsCi0JLnJlbW92ZQkJPSB0d2w0MDMwX3JlbW92ZSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHR3bDQwMzBfaW5pdCh2b2lkKQotewotCXJldHVybiBpMmNfYWRkX2RyaXZlcigmdHdsNDAzMF9kcml2ZXIpOwotfQotc3Vic3lzX2luaXRjYWxsKHR3bDQwMzBfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB0d2w0MDMwX2V4aXQodm9pZCkKLXsKLQlpMmNfZGVsX2RyaXZlcigmdHdsNDAzMF9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQodHdsNDAzMF9leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiSTJDIENvcmUgaW50ZXJmYWNlIGZvciBUV0w0MDMwIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90d2w0MDMwLWlycS5jIGIvZHJpdmVycy9tZmQvdHdsNDAzMC1pcnEuYwppbmRleCBmYjE5NGZlLi4yMGQyOWJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC90d2w0MDMwLWlycS5jCisrKyBiL2RyaXZlcnMvbWZkL3R3bDQwMzAtaXJxLmMKQEAgLTMyLDcgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAKLSNpbmNsdWRlIDxsaW51eC9pMmMvdHdsNDAzMC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy90d2wuaD4KIAogCiAvKgpAQCAtNzQsNiArNzQsOCBAQAogCXU4CWVkcl9vZmZzZXQ7CiAJdTgJYnl0ZXNfZWRyOwkJLyogYnl0ZWxlbiBvZiBFRFIgKi8KIAorCXU4CWlycV9saW5lczsJCS8qIG51bWJlciBvZiBzdXBwb3J0ZWQgaXJxIGxpbmVzICovCisKIAkvKiBTSVIgaWdub3JlZCAtLSBzZXQgaW50ZXJydXB0LCBmb3IgdGVzdGluZyBvbmx5ICovCiAJc3RydWN0IGlycV9kYXRhIHsKIAkJdTgJaXNyX29mZnNldDsKQEAgLTgyLDYgKzg0LDkgQEAKIAkvKiArIDIgYnl0ZXMgcGFkZGluZyAqLwogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBzaWggKnNpaF9tb2R1bGVzOworc3RhdGljIGludCBucl9zaWhfbW9kdWxlczsKKwogI2RlZmluZSBTSUhfSU5JVElBTElaRVIobW9kbmFtZSwgbmJpdHMpIFwKIAkubW9kdWxlCQk9IFRXTDQwMzBfTU9EVUxFXyAjIyBtb2RuYW1lLCBcCiAJLmNvbnRyb2xfb2Zmc2V0ID0gVFdMNDAzMF8gIyMgbW9kbmFtZSAjIyBfU0lIX0NUUkwsIFwKQEAgLTg5LDYgKzk0LDcgQEAKIAkuYnl0ZXNfaXhyCT0gRElWX1JPVU5EX1VQKG5iaXRzLCA4KSwgXAogCS5lZHJfb2Zmc2V0CT0gVFdMNDAzMF8gIyMgbW9kbmFtZSAjIyBfRURSLCBcCiAJLmJ5dGVzX2Vkcgk9IERJVl9ST1VORF9VUCgoMioobmJpdHMpKSwgOCksIFwKKwkuaXJxX2xpbmVzCT0gMiwgXAogCS5tYXNrID0geyB7IFwKIAkJLmlzcl9vZmZzZXQJPSBUV0w0MDMwXyAjIyBtb2RuYW1lICMjIF9JU1IxLCBcCiAJCS5pbXJfb2Zmc2V0CT0gVFdMNDAzMF8gIyMgbW9kbmFtZSAjIyBfSU1SMSwgXApAQCAtMTA3LDcgKzExMyw4IEBACiAvKiBPcmRlciBpbiB0aGlzIHRhYmxlIG1hdGNoZXMgb3JkZXIgaW4gUElIX0lTUi4gIFRoYXQgaXMsCiAgKiBCSVQobikgaW4gUElIX0lTUiBpcyBzaWhfbW9kdWxlc1tuXS4KICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzaWggc2loX21vZHVsZXNbNl0gPSB7CisvKiBzaWhfbW9kdWxlc190d2w0MDMwIGlzIHVzZWQgYm90aCBpbiB0d2w0MDMwIGFuZCB0d2w1MDMwICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNpaCBzaWhfbW9kdWxlc190d2w0MDMwWzZdID0gewogCVswXSA9IHsKIAkJLm5hbWUJCT0gImdwaW8iLAogCQkubW9kdWxlCQk9IFRXTDQwMzBfTU9EVUxFX0dQSU8sCkBAIC0xMTgsNiArMTI1LDcgQEAKIAkJLyogTm90ZTogKmFsbCogb2YgdGhlc2UgSVJRcyBkZWZhdWx0IHRvIG5vLXRyaWdnZXIgKi8KIAkJLmVkcl9vZmZzZXQJPSBSRUdfR1BJT19FRFIxLAogCQkuYnl0ZXNfZWRyCT0gNSwKKwkJLmlycV9saW5lcwk9IDIsCiAJCS5tYXNrID0geyB7CiAJCQkuaXNyX29mZnNldAk9IFJFR19HUElPX0lTUjFBLAogCQkJLmltcl9vZmZzZXQJPSBSRUdfR1BJT19JTVIxQSwKQEAgLTE0MCw2ICsxNDgsNyBAQAogCQkuZWRyX29mZnNldAk9IFRXTDQwMzBfSU5URVJSVVBUU19CQ0lFRFIxLAogCQkvKiBOb3RlOiBtb3N0IG9mIHRoZXNlIElSUXMgZGVmYXVsdCB0byBuby10cmlnZ2VyICovCiAJCS5ieXRlc19lZHIJPSAzLAorCQkuaXJxX2xpbmVzCT0gMiwKIAkJLm1hc2sgPSB7IHsKIAkJCS5pc3Jfb2Zmc2V0CT0gVFdMNDAzMF9JTlRFUlJVUFRTX0JDSUlTUjFBLAogCQkJLmltcl9vZmZzZXQJPSBUV0w0MDMwX0lOVEVSUlVQVFNfQkNJSU1SMUEsCkBAIC0xNjQsNiArMTczLDk5IEBACiAJCS8qIHRoZXJlIGFyZSBubyBTSUggbW9kdWxlcyAjNiBvciAjNyAuLi4gKi8KIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2loIHNpaF9tb2R1bGVzX3R3bDUwMzFbOF0gPSB7CisJWzBdID0geworCQkubmFtZQkJPSAiZ3BpbyIsCisJCS5tb2R1bGUJCT0gVFdMNDAzMF9NT0RVTEVfR1BJTywKKwkJLmNvbnRyb2xfb2Zmc2V0CT0gUkVHX0dQSU9fU0lIX0NUUkwsCisJCS5zZXRfY29yCT0gdHJ1ZSwKKwkJLmJpdHMJCT0gVFdMNDAzMF9HUElPX01BWCwKKwkJLmJ5dGVzX2l4cgk9IDMsCisJCS8qIE5vdGU6ICphbGwqIG9mIHRoZXNlIElSUXMgZGVmYXVsdCB0byBuby10cmlnZ2VyICovCisJCS5lZHJfb2Zmc2V0CT0gUkVHX0dQSU9fRURSMSwKKwkJLmJ5dGVzX2Vkcgk9IDUsCisJCS5pcnFfbGluZXMJPSAyLAorCQkubWFzayA9IHsgeworCQkJLmlzcl9vZmZzZXQJPSBSRUdfR1BJT19JU1IxQSwKKwkJCS5pbXJfb2Zmc2V0CT0gUkVHX0dQSU9fSU1SMUEsCisJCX0sIHsKKwkJCS5pc3Jfb2Zmc2V0CT0gUkVHX0dQSU9fSVNSMUIsCisJCQkuaW1yX29mZnNldAk9IFJFR19HUElPX0lNUjFCLAorCQl9LCB9LAorCX0sCisJWzFdID0geworCQkubmFtZQkJPSAia2V5cGFkIiwKKwkJLnNldF9jb3IJPSB0cnVlLAorCQlTSUhfSU5JVElBTElaRVIoS0VZUEFEX0tFWVAsIDQpCisJfSwKKwlbMl0gPSB7CisJCS5uYW1lCQk9ICJiY2kiLAorCQkubW9kdWxlCQk9IFRXTDUwMzFfTU9EVUxFX0lOVEVSUlVQVFMsCisJCS5jb250cm9sX29mZnNldAk9IFRXTDUwMzFfSU5URVJSVVBUU19CQ0lTSUhDVFJMLAorCQkuYml0cwkJPSA3LAorCQkuYnl0ZXNfaXhyCT0gMSwKKwkJLmVkcl9vZmZzZXQJPSBUV0w1MDMxX0lOVEVSUlVQVFNfQkNJRURSMSwKKwkJLyogTm90ZTogbW9zdCBvZiB0aGVzZSBJUlFzIGRlZmF1bHQgdG8gbm8tdHJpZ2dlciAqLworCQkuYnl0ZXNfZWRyCT0gMiwKKwkJLmlycV9saW5lcwk9IDIsCisJCS5tYXNrID0geyB7CisJCQkuaXNyX29mZnNldAk9IFRXTDUwMzFfSU5URVJSVVBUU19CQ0lJU1IxLAorCQkJLmltcl9vZmZzZXQJPSBUV0w1MDMxX0lOVEVSUlVQVFNfQkNJSU1SMSwKKwkJfSwgeworCQkJLmlzcl9vZmZzZXQJPSBUV0w1MDMxX0lOVEVSUlVQVFNfQkNJSVNSMiwKKwkJCS5pbXJfb2Zmc2V0CT0gVFdMNTAzMV9JTlRFUlJVUFRTX0JDSUlNUjIsCisJCX0sIH0sCisJfSwKKwlbM10gPSB7CisJCS5uYW1lCQk9ICJtYWRjIiwKKwkJU0lIX0lOSVRJQUxJWkVSKE1BREMsIDQpCisJfSwKKwlbNF0gPSB7CisJCS8qIFVTQiBkb2Vzbid0IHVzZSB0aGUgc2FtZSBTSUggb3JnYW5pemF0aW9uICovCisJCS5uYW1lCQk9ICJ1c2IiLAorCX0sCisJWzVdID0geworCQkubmFtZQkJPSAicG93ZXIiLAorCQkuc2V0X2Nvcgk9IHRydWUsCisJCVNJSF9JTklUSUFMSVpFUihJTlRfUFdSLCA4KQorCX0sCisJWzZdID0geworCQkvKgorCQkgKiBBQ0kgZG9lc24ndCB1c2UgdGhlIHNhbWUgU0lIIG9yZ2FuaXphdGlvbi4KKwkJICogRm9yIGV4YW1wbGUsIGl0IHN1cHBvcnRzIG9ubHkgb25lIGludGVycnVwdCBsaW5lCisJCSAqLworCQkubmFtZQkJPSAiYWNpIiwKKwkJLm1vZHVsZQkJPSBUV0w1MDMxX01PRFVMRV9BQ0NFU1NPUlksCisJCS5iaXRzCQk9IDksCisJCS5ieXRlc19peHIJPSAyLAorCQkuaXJxX2xpbmVzCT0gMSwKKwkJLm1hc2sgPSB7IHsKKwkJCS5pc3Jfb2Zmc2V0CT0gVFdMNTAzMV9BQ0lJRFJfTFNCLAorCQkJLmltcl9vZmZzZXQJPSBUV0w1MDMxX0FDSUlNUl9MU0IsCisJCX0sIH0sCisKKwl9LAorCVs3XSA9IHsKKwkJLyogQWNjZXNzb3J5ICovCisJCS5uYW1lCQk9ICJhY2MiLAorCQkubW9kdWxlCQk9IFRXTDUwMzFfTU9EVUxFX0FDQ0VTU09SWSwKKwkJLmNvbnRyb2xfb2Zmc2V0CT0gVFdMNTAzMV9BQ0NTSUhDVFJMLAorCQkuYml0cwkJPSAyLAorCQkuYnl0ZXNfaXhyCT0gMSwKKwkJLmVkcl9vZmZzZXQJPSBUV0w1MDMxX0FDQ0VEUjEsCisJCS8qIE5vdGU6IG1vc3Qgb2YgdGhlc2UgSVJRcyBkZWZhdWx0IHRvIG5vLXRyaWdnZXIgKi8KKwkJLmJ5dGVzX2Vkcgk9IDEsCisJCS5pcnFfbGluZXMJPSAyLAorCQkubWFzayA9IHsgeworCQkJLmlzcl9vZmZzZXQJPSBUV0w1MDMxX0FDQ0lTUjEsCisJCQkuaW1yX29mZnNldAk9IFRXTDUwMzFfQUNDSU1SMSwKKwkJfSwgeworCQkJLmlzcl9vZmZzZXQJPSBUV0w1MDMxX0FDQ0lTUjIsCisJCQkuaW1yX29mZnNldAk9IFRXTDUwMzFfQUNDSU1SMiwKKwkJfSwgfSwKKwl9LAorfTsKKwogI3VuZGVmIFRXTDQwMzBfTU9EVUxFX0tFWVBBRF9LRVlQCiAjdW5kZWYgVFdMNDAzMF9NT0RVTEVfSU5UX1BXUgogI3VuZGVmIFRXTDQwMzBfSU5UX1BXUl9FRFIKQEAgLTE5NCw3ICsyOTYsNyBAQAogCQkvKiBXYWl0IGZvciBJUlEsIHRoZW4gcmVhZCBQSUggaXJxIHN0YXR1cyAoYWxzbyBibG9ja2luZykgKi8KIAkJd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZpcnFfZXZlbnQpOwogCi0JCXJldCA9IHR3bDQwMzBfaTJjX3JlYWRfdTgoVFdMNDAzMF9NT0RVTEVfUElILCAmcGloX2lzciwKKwkJcmV0ID0gdHdsX2kyY19yZWFkX3U4KFRXTDQwMzBfTU9EVUxFX1BJSCwgJnBpaF9pc3IsCiAJCQkJCSAgUkVHX1BJSF9JU1JfUDEpOwogCQlpZiAocmV0KSB7CiAJCQlwcl93YXJuaW5nKCJ0d2w0MDMwOiBJMkMgZXJyb3IgJWQgcmVhZGluZyBQSUggSVNSXG4iLApAQCAtMjg0LDEzICszODYsMTcgQEAKIAkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIG9uIG91ciBsaW5lICovCiAJbWVtc2V0KGJ1ZiwgMHhmZiwgc2l6ZW9mIGJ1Zik7CiAJc2loID0gc2loX21vZHVsZXM7Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2loX21vZHVsZXMpOyBpKyssIHNpaCsrKSB7CisJZm9yIChpID0gMDsgaSA8IG5yX3NpaF9tb2R1bGVzOyBpKyssIHNpaCsrKSB7CiAKIAkJLyogc2tpcCBVU0IgLS0gaXQncyBmdW5reSAqLwogCQlpZiAoIXNpaC0+Ynl0ZXNfaXhyKQogCQkJY29udGludWU7CiAKLQkJc3RhdHVzID0gdHdsNDAzMF9pMmNfd3JpdGUoc2loLT5tb2R1bGUsIGJ1ZiwKKwkJLyogTm90IGFsbCB0aGUgU0lIIG1vZHVsZXMgc3VwcG9ydCBtdWx0aXBsZSBpbnRlcnJ1cHQgbGluZXMgKi8KKwkJaWYgKHNpaC0+aXJxX2xpbmVzIDw9IGxpbmUpCisJCQljb250aW51ZTsKKworCQlzdGF0dXMgPSB0d2xfaTJjX3dyaXRlKHNpaC0+bW9kdWxlLCBidWYsCiAJCQkJc2loLT5tYXNrW2xpbmVdLmltcl9vZmZzZXQsIHNpaC0+Ynl0ZXNfaXhyKTsKIAkJaWYgKHN0YXR1cyA8IDApCiAJCQlwcl9lcnIoInR3bDQwMzA6IGVyciAlZCBpbml0aWFsaXppbmcgJXMgJXNcbiIsCkBAIC0zMDQsNyArNDEwLDcgQEAKIAkJICogQW5kIGZvciBQV1JfSU5UIGl0J3Mgbm90IGRvY3VtZW50ZWQuLi4KIAkJICovCiAJCWlmIChzaWgtPnNldF9jb3IpIHsKLQkJCXN0YXR1cyA9IHR3bDQwMzBfaTJjX3dyaXRlX3U4KHNpaC0+bW9kdWxlLAorCQkJc3RhdHVzID0gdHdsX2kyY193cml0ZV91OChzaWgtPm1vZHVsZSwKIAkJCQkJVFdMNDAzMF9TSUhfQ1RSTF9DT1JfTUFTSywKIAkJCQkJc2loLT5jb250cm9sX29mZnNldCk7CiAJCQlpZiAoc3RhdHVzIDwgMCkKQEAgLTMxNCw3ICs0MjAsNyBAQAogCX0KIAogCXNpaCA9IHNpaF9tb2R1bGVzOwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNpaF9tb2R1bGVzKTsgaSsrLCBzaWgrKykgeworCWZvciAoaSA9IDA7IGkgPCBucl9zaWhfbW9kdWxlczsgaSsrLCBzaWgrKykgewogCQl1OCByeGJ1Zls0XTsKIAkJaW50IGo7CiAKQEAgLTMyMiwyMCArNDI4LDI0IEBACiAJCWlmICghc2loLT5ieXRlc19peHIpCiAJCQljb250aW51ZTsKIAorCQkvKiBOb3QgYWxsIHRoZSBTSUggbW9kdWxlcyBzdXBwb3J0IG11bHRpcGxlIGludGVycnVwdCBsaW5lcyAqLworCQlpZiAoc2loLT5pcnFfbGluZXMgPD0gbGluZSkKKwkJCWNvbnRpbnVlOworCiAJCS8qIENsZWFyIHBlbmRpbmcgaW50ZXJydXB0IHN0YXR1cy4gIEVpdGhlciB0aGUgcmVhZCB3YXMKIAkJICogZW5vdWdoLCBvciB3ZSBuZWVkIHRvIHdyaXRlIHRob3NlIGJpdHMuICBSZXBlYXQsIGluCiAJCSAqIGNhc2UgYW4gSVJRIGlzIHBlbmRpbmcgKFBFTkRESVM9MCkgLi4uIHRoYXQncyBub3QKIAkJICogdW5jb21tb24gd2l0aCBQV1JfSU5ULlBXUk9OLgogCQkgKi8KIAkJZm9yIChqID0gMDsgaiA8IDI7IGorKykgewotCQkJc3RhdHVzID0gdHdsNDAzMF9pMmNfcmVhZChzaWgtPm1vZHVsZSwgcnhidWYsCisJCQlzdGF0dXMgPSB0d2xfaTJjX3JlYWQoc2loLT5tb2R1bGUsIHJ4YnVmLAogCQkJCXNpaC0+bWFza1tsaW5lXS5pc3Jfb2Zmc2V0LCBzaWgtPmJ5dGVzX2l4cik7CiAJCQlpZiAoc3RhdHVzIDwgMCkKIAkJCQlwcl9lcnIoInR3bDQwMzA6IGVyciAlZCBpbml0aWFsaXppbmcgJXMgJXNcbiIsCiAJCQkJCXN0YXR1cywgc2loLT5uYW1lLCAiSVNSIik7CiAKIAkJCWlmICghc2loLT5zZXRfY29yKQotCQkJCXN0YXR1cyA9IHR3bDQwMzBfaTJjX3dyaXRlKHNpaC0+bW9kdWxlLCBidWYsCisJCQkJc3RhdHVzID0gdHdsX2kyY193cml0ZShzaWgtPm1vZHVsZSwgYnVmLAogCQkJCQlzaWgtPm1hc2tbbGluZV0uaXNyX29mZnNldCwKIAkJCQkJc2loLT5ieXRlc19peHIpOwogCQkJLyogZWxzZSBDT1I9MSBtZWFucyByZWFkIHN1ZmZpY2VkLgpAQCAtNDA0LDcgKzUxNCw3IEBACiAJCXJldHVybjsKIAogCS8qIHdyaXRlIHRoZSB3aG9sZSBtYXNrIC4uLiBzaW1wbGVyIHRoYW4gc3Vic2V0dGluZyBpdCAqLwotCXN0YXR1cyA9IHR3bDQwMzBfaTJjX3dyaXRlKHNpaC0+bW9kdWxlLCBpbXIuYnl0ZXMsCisJc3RhdHVzID0gdHdsX2kyY193cml0ZShzaWgtPm1vZHVsZSwgaW1yLmJ5dGVzLAogCQkJc2loLT5tYXNrW2lycV9saW5lXS5pbXJfb2Zmc2V0LCBzaWgtPmJ5dGVzX2l4cik7CiAJaWYgKHN0YXR1cykKIAkJcHJfZXJyKCJ0d2w0MDMwOiAlcywgJXMgLS0+ICVkXG4iLCBfX2Z1bmNfXywKQEAgLTQzNSw3ICs1NDUsNyBAQAogCSAqIGFueSBwcm9jZXNzb3Igb24gdGhlIG90aGVyIElSUSBsaW5lLCBFRFIgcmVnaXN0ZXJzIGFyZQogCSAqIHNoYXJlZC4KIAkgKi8KLQlzdGF0dXMgPSB0d2w0MDMwX2kyY19yZWFkKHNpaC0+bW9kdWxlLCBieXRlcyArIDEsCisJc3RhdHVzID0gdHdsX2kyY19yZWFkKHNpaC0+bW9kdWxlLCBieXRlcyArIDEsCiAJCQlzaWgtPmVkcl9vZmZzZXQsIHNpaC0+Ynl0ZXNfZWRyKTsKIAlpZiAoc3RhdHVzKSB7CiAJCXByX2VycigidHdsNDAzMDogJXMsICVzIC0tPiAlZFxuIiwgX19mdW5jX18sCkBAIC00NjksNyArNTc5LDcgQEAKIAl9CiAKIAkvKiBXcml0ZSAqLwotCXN0YXR1cyA9IHR3bDQwMzBfaTJjX3dyaXRlKHNpaC0+bW9kdWxlLCBieXRlcywKKwlzdGF0dXMgPSB0d2xfaTJjX3dyaXRlKHNpaC0+bW9kdWxlLCBieXRlcywKIAkJCXNpaC0+ZWRyX29mZnNldCwgc2loLT5ieXRlc19lZHIpOwogCWlmIChzdGF0dXMpCiAJCXByX2VycigidHdsNDAzMDogJXMsICVzIC0tPiAlZFxuIiwgX19mdW5jX18sCkBAIC01NTQsNyArNjY0LDcgQEAKIAkvKiBGSVhNRSBuZWVkIHJldHJ5LW9uLWVycm9yIC4uLiAqLwogCiAJaXNyLndvcmQgPSAwOwotCXN0YXR1cyA9IHR3bDQwMzBfaTJjX3JlYWQoc2loLT5tb2R1bGUsIGlzci5ieXRlcywKKwlzdGF0dXMgPSB0d2xfaTJjX3JlYWQoc2loLT5tb2R1bGUsIGlzci5ieXRlcywKIAkJCXNpaC0+bWFza1tpcnFfbGluZV0uaXNyX29mZnNldCwgc2loLT5ieXRlc19peHIpOwogCiAJcmV0dXJuIChzdGF0dXMgPCAwKSA/IHN0YXR1cyA6IGxlMzJfdG9fY3B1KGlzci53b3JkKTsKQEAgLTYxMSw3ICs3MjEsNyBAQAogCiAJLyogb25seSBzdXBwb3J0IG1vZHVsZXMgd2l0aCBzdGFuZGFyZCBjbGVhci1vbi1yZWFkIGZvciBub3cgKi8KIAlmb3IgKHNpaF9tb2QgPSAwLCBzaWggPSBzaWhfbW9kdWxlczsKLQkJCXNpaF9tb2QgPCBBUlJBWV9TSVpFKHNpaF9tb2R1bGVzKTsKKwkJCXNpaF9tb2QgPCBucl9zaWhfbW9kdWxlczsKIAkJCXNpaF9tb2QrKywgc2loKyspIHsKIAkJaWYgKHNpaC0+bW9kdWxlID09IG1vZHVsZSAmJiBzaWgtPnNldF9jb3IpIHsKIAkJCWlmICghV0FSTigoaXJxX2Jhc2UgKyBzaWgtPmJpdHMpID4gTlJfSVJRUywKQEAgLTY2OCw3ICs3NzgsNyBAQAogLyogRklYTUUgcGFzcyBpbiB3aGljaCBpbnRlcnJ1cHQgbGluZSB3ZSdsbCB1c2UgLi4uICovCiAjZGVmaW5lIHR3bF9pcnFfbGluZQkwCiAKLWludCB0d2xfaW5pdF9pcnEoaW50IGlycV9udW0sIHVuc2lnbmVkIGlycV9iYXNlLCB1bnNpZ25lZCBpcnFfZW5kKQoraW50IHR3bDQwMzBfaW5pdF9pcnEoaW50IGlycV9udW0sIHVuc2lnbmVkIGlycV9iYXNlLCB1bnNpZ25lZCBpcnFfZW5kKQogewogCXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAJdHdsNDAzMF9pcnFfY2hpcDsKIApAQCAtNzI4LDcgKzgzOCw4IEBACiAJCWdvdG8gZmFpbF9ycWlycTsKIAl9CiAKLQl0YXNrID0ga3RocmVhZF9ydW4odHdsNDAzMF9pcnFfdGhyZWFkLCAodm9pZCAqKWlycV9udW0sICJ0d2w0MDMwLWlycSIpOworCXRhc2sgPSBrdGhyZWFkX3J1bih0d2w0MDMwX2lycV90aHJlYWQsICh2b2lkICopKGxvbmcpaXJxX251bSwKKwkJCQkJCQkJInR3bDQwMzAtaXJxIik7CiAJaWYgKElTX0VSUih0YXNrKSkgewogCQlwcl9lcnIoInR3bDQwMzA6IGNvdWxkIG5vdCBjcmVhdGUgaXJxICVkIHRocmVhZCFcbiIsIGlycV9udW0pOwogCQlzdGF0dXMgPSBQVFJfRVJSKHRhc2spOwpAQCAtNzQ3LDcgKzg1OCw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotaW50IHR3bF9leGl0X2lycSh2b2lkKQoraW50IHR3bDQwMzBfZXhpdF9pcnEodm9pZCkKIHsKIAkvKiBGSVhNRSB1bmRvIHR3bF9pbml0X2lycSgpICovCiAJaWYgKHR3bDQwMzBfaXJxX2Jhc2UpIHsKQEAgLTc1NiwzICs4NjcsMTYgQEAKIAl9CiAJcmV0dXJuIDA7CiB9CisKK2ludCB0d2w0MDMwX2luaXRfY2hpcF9pcnEoY29uc3QgY2hhciAqY2hpcCkKK3sKKwlpZiAoIXN0cmNtcChjaGlwLCAidHdsNTAzMSIpKSB7CisJCXNpaF9tb2R1bGVzID0gc2loX21vZHVsZXNfdHdsNTAzMTsKKwkJbnJfc2loX21vZHVsZXMgPSBBUlJBWV9TSVpFKHNpaF9tb2R1bGVzX3R3bDUwMzEpOworCX0gZWxzZSB7CisJCXNpaF9tb2R1bGVzID0gc2loX21vZHVsZXNfdHdsNDAzMDsKKwkJbnJfc2loX21vZHVsZXMgPSBBUlJBWV9TSVpFKHNpaF9tb2R1bGVzX3R3bDQwMzApOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdHdsNDAzMC1wb3dlci5jIGIvZHJpdmVycy9tZmQvdHdsNDAzMC1wb3dlci5jCmluZGV4IGQ0MjNlMGMuLjA4MTUyOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3R3bDQwMzAtcG93ZXIuYworKysgYi9kcml2ZXJzL21mZC90d2w0MDMwLXBvd2VyLmMKQEAgLTI2LDcgKzI2LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjL3R3bDQwMzAuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvdHdsLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgpAQCAtNjcsMTkgKzY3LDM1IEBACiAjZGVmaW5lIFJfS0VZXzEJCQkweEMwCiAjZGVmaW5lIFJfS0VZXzIJCQkweDBDCiAKLS8qIHJlc291cmNlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgREVWR1JPVVBfT0ZGU0VUCQkwCisvKiByZXNvdXJjZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycworICAgPFJFU09VUkNFPl9ERVZfR1JQICAgYXQgYWRkcmVzcyAnbiswJworICAgPFJFU09VUkNFPl9UWVBFICAgICAgYXQgYWRkcmVzcyAnbisxJworICAgPFJFU09VUkNFPl9SRU1BUCAgICAgYXQgYWRkcmVzcyAnbisyJworICAgPFJFU09VUkNFPl9ERURJQ0FURUQgYXQgYWRkcmVzcyAnbiszJworKi8KKyNkZWZpbmUgREVWX0dSUF9PRkZTRVQJCTAKICNkZWZpbmUgVFlQRV9PRkZTRVQJCTEKKyNkZWZpbmUgUkVNQVBfT0ZGU0VUCQkyCisjZGVmaW5lIERFRElDQVRFRF9PRkZTRVQJMwogCi0vKiBCaXQgcG9zaXRpb25zICovCi0jZGVmaW5lIERFVkdST1VQX1NISUZUCQk1Ci0jZGVmaW5lIERFVkdST1VQX01BU0sJCSg3IDw8IERFVkdST1VQX1NISUZUKQorLyogQml0IHBvc2l0aW9ucyBpbiB0aGUgcmVnaXN0ZXJzICovCisKKy8qIDxSRVNPVVJDRT5fREVWX0dSUCAqLworI2RlZmluZSBERVZfR1JQX1NISUZUCQk1CisjZGVmaW5lIERFVl9HUlBfTUFTSwkJKDcgPDwgREVWX0dSUF9TSElGVCkKKworLyogPFJFU09VUkNFPl9UWVBFICovCiAjZGVmaW5lIFRZUEVfU0hJRlQJCTAKICNkZWZpbmUgVFlQRV9NQVNLCQkoNyA8PCBUWVBFX1NISUZUKQogI2RlZmluZSBUWVBFMl9TSElGVAkJMwogI2RlZmluZSBUWVBFMl9NQVNLCQkoMyA8PCBUWVBFMl9TSElGVCkKIAorLyogPFJFU09VUkNFPl9SRU1BUCAqLworI2RlZmluZSBTTEVFUF9TVEFURV9TSElGVAkwCisjZGVmaW5lIFNMRUVQX1NUQVRFX01BU0sJKDB4ZiA8PCBTTEVFUF9TVEFURV9TSElGVCkKKyNkZWZpbmUgT0ZGX1NUQVRFX1NISUZUCQk0CisjZGVmaW5lIE9GRl9TVEFURV9NQVNLCQkoMHhmIDw8IE9GRl9TVEFURV9TSElGVCkKKwogc3RhdGljIHU4IHJlc19jb25maWdfYWRkcnNbXSA9IHsKIAlbUkVTX1ZBVVgxXQk9IDB4MTcsCiAJW1JFU19WQVVYMl0JPSAweDFiLApAQCAtMTE1LDExICsxMzEsMTEgQEAKIHsKIAlpbnQgZXJyOwogCi0JZXJyID0gdHdsNDAzMF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSLCBhZGRyZXNzLAorCWVyciA9IHR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSLCBhZGRyZXNzLAogCQkJCVJfTUVNT1JZX0FERFJFU1MpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwotCWVyciA9IHR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX01BU1RFUiwgYnl0ZSwKKwllcnIgPSB0d2xfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX01BU1RFUiwgYnl0ZSwKIAkJCQlSX01FTU9SWV9EQVRBKTsKIG91dDoKIAlyZXR1cm4gZXJyOwpAQCAtMTc2LDE4ICsxOTIsMTggQEAKIAl1OCBkYXRhOwogCiAJLyogU2V0IFNMRUVQIHRvIEFDVElWRSBTRVEgYWRkcmVzcyBmb3IgUDMgKi8KLQllcnIgPSB0d2w0MDMwX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9NQVNURVIsIGFkZHJlc3MsCisJZXJyID0gdHdsX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9NQVNURVIsIGFkZHJlc3MsCiAJCQkJUl9TRVFfQUREX1MyQTMpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCiAJLyogUDMgTFZMX1dBS0VVUCBzaG91bGQgYmUgb24gTEVWRUwgKi8KLQllcnIgPSB0d2w0MDMwX2kyY19yZWFkX3U4KFRXTDQwMzBfTU9EVUxFX1BNX01BU1RFUiwgJmRhdGEsCisJZXJyID0gdHdsX2kyY19yZWFkX3U4KFRXTDQwMzBfTU9EVUxFX1BNX01BU1RFUiwgJmRhdGEsCiAJCQkJUl9QM19TV19FVkVOVFMpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCWRhdGEgfD0gTFZMX1dBS0VVUDsKLQllcnIgPSB0d2w0MDMwX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9NQVNURVIsIGRhdGEsCisJZXJyID0gdHdsX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9NQVNURVIsIGRhdGEsCiAJCQkJUl9QM19TV19FVkVOVFMpOwogb3V0OgogCWlmIChlcnIpCkBAIC0yMDEsNDIgKzIxNyw0MiBAQAogCXU4IGRhdGE7CiAKIAkvKiBTZXQgU0xFRVAgdG8gQUNUSVZFIFNFUSBhZGRyZXNzIGZvciBQMSBhbmQgUDIgKi8KLQllcnIgPSB0d2w0MDMwX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9NQVNURVIsIGFkZHJlc3MsCisJZXJyID0gdHdsX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9NQVNURVIsIGFkZHJlc3MsCiAJCQkJUl9TRVFfQUREX1MyQTEyKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAogCS8qIFAxL1AyIExWTF9XQUtFVVAgc2hvdWxkIGJlIG9uIExFVkVMICovCi0JZXJyID0gdHdsNDAzMF9pMmNfcmVhZF91OChUV0w0MDMwX01PRFVMRV9QTV9NQVNURVIsICZkYXRhLAorCWVyciA9IHR3bF9pMmNfcmVhZF91OChUV0w0MDMwX01PRFVMRV9QTV9NQVNURVIsICZkYXRhLAogCQkJCVJfUDFfU1dfRVZFTlRTKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAogCWRhdGEgfD0gTFZMX1dBS0VVUDsKLQllcnIgPSB0d2w0MDMwX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9NQVNURVIsIGRhdGEsCisJZXJyID0gdHdsX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9NQVNURVIsIGRhdGEsCiAJCQkJUl9QMV9TV19FVkVOVFMpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCi0JZXJyID0gdHdsNDAzMF9pMmNfcmVhZF91OChUV0w0MDMwX01PRFVMRV9QTV9NQVNURVIsICZkYXRhLAorCWVyciA9IHR3bF9pMmNfcmVhZF91OChUV0w0MDMwX01PRFVMRV9QTV9NQVNURVIsICZkYXRhLAogCQkJCVJfUDJfU1dfRVZFTlRTKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAogCWRhdGEgfD0gTFZMX1dBS0VVUDsKLQllcnIgPSB0d2w0MDMwX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9NQVNURVIsIGRhdGEsCisJZXJyID0gdHdsX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9NQVNURVIsIGRhdGEsCiAJCQkJUl9QMl9TV19FVkVOVFMpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCiAJaWYgKG1hY2hpbmVfaXNfb21hcF8zNDMwc2RwKCkgfHwgbWFjaGluZV9pc19vbWFwX2xkcCgpKSB7CiAJCS8qIERpc2FibGluZyBBQyBjaGFyZ2VyIGVmZmVjdCBvbiBzbGVlcC1hY3RpdmUgdHJhbnNpdGlvbnMgKi8KLQkJZXJyID0gdHdsNDAzMF9pMmNfcmVhZF91OChUV0w0MDMwX01PRFVMRV9QTV9NQVNURVIsICZkYXRhLAorCQllcnIgPSB0d2xfaTJjX3JlYWRfdTgoVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSLCAmZGF0YSwKIAkJCQkJUl9DRkdfUDFfVFJBTlNJVElPTik7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIAkJZGF0YSAmPSB+KDE8PDEpOwotCQllcnIgPSB0d2w0MDMwX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9NQVNURVIsIGRhdGEgLAorCQllcnIgPSB0d2xfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX01BU1RFUiwgZGF0YSAsCiAJCQkJCVJfQ0ZHX1AxX1RSQU5TSVRJT04pOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CkBAIC0yNTQsNyArMjcwLDcgQEAKIAlpbnQgZXJyOwogCiAJLyogU2V0IEFDVElWRSB0byBTTEVFUCBTRVEgYWRkcmVzcyBpbiBUMiBtZW1vcnkqLwotCWVyciA9IHR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX01BU1RFUiwgYWRkcmVzcywKKwllcnIgPSB0d2xfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX01BU1RFUiwgYWRkcmVzcywKIAkJCQlSX1NFUV9BRERfQTJTKTsKIAogCWlmIChlcnIpCkBAIC0yNjksNDEgKzI4NSw0MSBAQAogCXU4IHJkX2RhdGE7CiAKIAkvKiBTZXQgV0FSTSBSRVNFVCBTRVEgYWRkcmVzcyBmb3IgUDEgKi8KLQllcnIgPSB0d2w0MDMwX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9NQVNURVIsIGFkZHJlc3MsCisJZXJyID0gdHdsX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9NQVNURVIsIGFkZHJlc3MsCiAJCQkJUl9TRVFfQUREX1dBUk0pOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCiAJLyogUDEvUDIvUDMgZW5hYmxlIFdBUk1SRVNFVCAqLwotCWVyciA9IHR3bDQwMzBfaTJjX3JlYWRfdTgoVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSLCAmcmRfZGF0YSwKKwllcnIgPSB0d2xfaTJjX3JlYWRfdTgoVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSLCAmcmRfZGF0YSwKIAkJCQlSX1AxX1NXX0VWRU5UUyk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKIAlyZF9kYXRhIHw9IEVOQUJMRV9XQVJNUkVTRVQ7Ci0JZXJyID0gdHdsNDAzMF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSLCByZF9kYXRhLAorCWVyciA9IHR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSLCByZF9kYXRhLAogCQkJCVJfUDFfU1dfRVZFTlRTKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAotCWVyciA9IHR3bDQwMzBfaTJjX3JlYWRfdTgoVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSLCAmcmRfZGF0YSwKKwllcnIgPSB0d2xfaTJjX3JlYWRfdTgoVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSLCAmcmRfZGF0YSwKIAkJCQlSX1AyX1NXX0VWRU5UUyk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKIAlyZF9kYXRhIHw9IEVOQUJMRV9XQVJNUkVTRVQ7Ci0JZXJyID0gdHdsNDAzMF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSLCByZF9kYXRhLAorCWVyciA9IHR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSLCByZF9kYXRhLAogCQkJCVJfUDJfU1dfRVZFTlRTKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAotCWVyciA9IHR3bDQwMzBfaTJjX3JlYWRfdTgoVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSLCAmcmRfZGF0YSwKKwllcnIgPSB0d2xfaTJjX3JlYWRfdTgoVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSLCAmcmRfZGF0YSwKIAkJCQlSX1AzX1NXX0VWRU5UUyk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKIAlyZF9kYXRhIHw9IEVOQUJMRV9XQVJNUkVTRVQ7Ci0JZXJyID0gdHdsNDAzMF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSLCByZF9kYXRhLAorCWVyciA9IHR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSLCByZF9kYXRhLAogCQkJCVJfUDNfU1dfRVZFTlRTKTsKIG91dDoKIAlpZiAoZXJyKQpAQCAtMzE3LDYgKzMzMyw3IEBACiAJaW50IGVycjsKIAl1OCB0eXBlOwogCXU4IGdycDsKKwl1OCByZW1hcDsKIAogCWlmIChyY29uZmlnLT5yZXNvdXJjZSA+IFRPVEFMX1JFU09VUkNFUykgewogCQlwcl9lcnIoIlRXTDQwMzAgUmVzb3VyY2UgJWQgZG9lcyBub3QgZXhpc3RcbiIsCkBAIC0zMjcsMTkgKzM0NCwxOSBAQAogCXJjb25maWdfYWRkciA9IHJlc19jb25maWdfYWRkcnNbcmNvbmZpZy0+cmVzb3VyY2VdOwogCiAJLyogU2V0IHJlc291cmNlIGdyb3VwICovCi0JZXJyID0gdHdsNDAzMF9pMmNfcmVhZF91OChUV0w0MDMwX01PRFVMRV9QTV9SRUNFSVZFUiwgJmdycCwKLQkJCQlyY29uZmlnX2FkZHIgKyBERVZHUk9VUF9PRkZTRVQpOworCWVyciA9IHR3bF9pMmNfcmVhZF91OChUV0w0MDMwX01PRFVMRV9QTV9SRUNFSVZFUiwgJmdycCwKKwkJCSAgICAgIHJjb25maWdfYWRkciArIERFVl9HUlBfT0ZGU0VUKTsKIAlpZiAoZXJyKSB7CiAJCXByX2VycigiVFdMNDAzMCBSZXNvdXJjZSAlZCBncm91cCBjb3VsZCBub3QgYmUgcmVhZFxuIiwKIAkJCXJjb25maWctPnJlc291cmNlKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlpZiAocmNvbmZpZy0+ZGV2Z3JvdXAgPj0gMCkgewotCQlncnAgJj0gfkRFVkdST1VQX01BU0s7Ci0JCWdycCB8PSByY29uZmlnLT5kZXZncm91cCA8PCBERVZHUk9VUF9TSElGVDsKLQkJZXJyID0gdHdsNDAzMF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fUkVDRUlWRVIsCi0JCQkJCWdycCwgcmNvbmZpZ19hZGRyICsgREVWR1JPVVBfT0ZGU0VUKTsKKwlpZiAocmNvbmZpZy0+ZGV2Z3JvdXAgIT0gVFdMNDAzMF9SRVNDT05GSUdfVU5ERUYpIHsKKwkJZ3JwICY9IH5ERVZfR1JQX01BU0s7CisJCWdycCB8PSByY29uZmlnLT5kZXZncm91cCA8PCBERVZfR1JQX1NISUZUOworCQllcnIgPSB0d2xfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSLAorCQkJCSAgICAgICBncnAsIHJjb25maWdfYWRkciArIERFVl9HUlBfT0ZGU0VUKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCXByX2VycigiVFdMNDAzMCBmYWlsZWQgdG8gcHJvZ3JhbSBkZXZncm91cFxuIik7CiAJCQlyZXR1cm4gZXJyOwpAQCAtMzQ3LDcgKzM2NCw3IEBACiAJfQogCiAJLyogU2V0IHJlc291cmNlIHR5cGVzICovCi0JZXJyID0gdHdsNDAzMF9pMmNfcmVhZF91OChUV0w0MDMwX01PRFVMRV9QTV9SRUNFSVZFUiwgJnR5cGUsCisJZXJyID0gdHdsX2kyY19yZWFkX3U4KFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSLCAmdHlwZSwKIAkJCQlyY29uZmlnX2FkZHIgKyBUWVBFX09GRlNFVCk7CiAJaWYgKGVyciA8IDApIHsKIAkJcHJfZXJyKCJUV0w0MDMwIFJlc291cmNlICVkIHR5cGUgY291bGQgbm90IGJlIHJlYWRcbiIsCkBAIC0zNTUsMjMgKzM3Miw1MCBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCWlmIChyY29uZmlnLT50eXBlID49IDApIHsKKwlpZiAocmNvbmZpZy0+dHlwZSAhPSBUV0w0MDMwX1JFU0NPTkZJR19VTkRFRikgewogCQl0eXBlICY9IH5UWVBFX01BU0s7CiAJCXR5cGUgfD0gcmNvbmZpZy0+dHlwZSA8PCBUWVBFX1NISUZUOwogCX0KIAotCWlmIChyY29uZmlnLT50eXBlMiA+PSAwKSB7CisJaWYgKHJjb25maWctPnR5cGUyICE9IFRXTDQwMzBfUkVTQ09ORklHX1VOREVGKSB7CiAJCXR5cGUgJj0gflRZUEUyX01BU0s7CiAJCXR5cGUgfD0gcmNvbmZpZy0+dHlwZTIgPDwgVFlQRTJfU0hJRlQ7CiAJfQogCi0JZXJyID0gdHdsNDAzMF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fUkVDRUlWRVIsCisJZXJyID0gdHdsX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9SRUNFSVZFUiwKIAkJCQl0eXBlLCByY29uZmlnX2FkZHIgKyBUWVBFX09GRlNFVCk7CiAJaWYgKGVyciA8IDApIHsKIAkJcHJfZXJyKCJUV0w0MDMwIGZhaWxlZCB0byBwcm9ncmFtIHJlc291cmNlIHR5cGVcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAorCS8qIFNldCByZW1hcCBzdGF0ZXMgKi8KKwllcnIgPSB0d2xfaTJjX3JlYWRfdTgoVFdMNDAzMF9NT0RVTEVfUE1fUkVDRUlWRVIsICZyZW1hcCwKKwkJCSAgICAgIHJjb25maWdfYWRkciArIFJFTUFQX09GRlNFVCk7CisJaWYgKGVyciA8IDApIHsKKwkJcHJfZXJyKCJUV0w0MDMwIFJlc291cmNlICVkIHJlbWFwIGNvdWxkIG5vdCBiZSByZWFkXG4iLAorCQkJcmNvbmZpZy0+cmVzb3VyY2UpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChyY29uZmlnLT5yZW1hcF9vZmYgIT0gVFdMNDAzMF9SRVNDT05GSUdfVU5ERUYpIHsKKwkJcmVtYXAgJj0gfk9GRl9TVEFURV9NQVNLOworCQlyZW1hcCB8PSByY29uZmlnLT5yZW1hcF9vZmYgPDwgT0ZGX1NUQVRFX1NISUZUOworCX0KKworCWlmIChyY29uZmlnLT5yZW1hcF9zbGVlcCAhPSBUV0w0MDMwX1JFU0NPTkZJR19VTkRFRikgeworCQlyZW1hcCAmPSB+U0xFRVBfU1RBVEVfTUFTSzsKKwkJcmVtYXAgfD0gcmNvbmZpZy0+cmVtYXBfb2ZmIDw8IFNMRUVQX1NUQVRFX1NISUZUOworCX0KKworCWVyciA9IHR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fUkVDRUlWRVIsCisJCQkgICAgICAgcmVtYXAsCisJCQkgICAgICAgcmNvbmZpZ19hZGRyICsgUkVNQVBfT0ZGU0VUKTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcl9lcnIoIlRXTDQwMzAgZmFpbGVkIHRvIHByb2dyYW0gcmVtYXBcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC00MjQsMTIgKzQ2OCwxMiBAQAogCXN0cnVjdCB0d2w0MDMwX3Jlc2NvbmZpZyAqcmVzY29uZmlnOwogCXU4IGFkZHJlc3MgPSB0d2w0MDMwX3N0YXJ0X3NjcmlwdF9hZGRyZXNzOwogCi0JZXJyID0gdHdsNDAzMF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSLCBSX0tFWV8xLAorCWVyciA9IHR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSLCBSX0tFWV8xLAogCQkJCVJfUFJPVEVDVF9LRVkpOwogCWlmIChlcnIpCiAJCWdvdG8gdW5sb2NrOwogCi0JZXJyID0gdHdsNDAzMF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSLCBSX0tFWV8yLAorCWVyciA9IHR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSLCBSX0tFWV8yLAogCQkJCVJfUFJPVEVDVF9LRVkpOwogCWlmIChlcnIpCiAJCWdvdG8gdW5sb2NrOwpAQCAtNDUyLDcgKzQ5Niw3IEBACiAJCX0KIAl9CiAKLQllcnIgPSB0d2w0MDMwX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9NQVNURVIsIDAsIFJfUFJPVEVDVF9LRVkpOworCWVyciA9IHR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSLCAwLCBSX1BST1RFQ1RfS0VZKTsKIAlpZiAoZXJyKQogCQlwcl9lcnIoIlRXTDQwMzAgVW5hYmxlIHRvIHJlbG9jayByZWdpc3RlcnNcbiIpOwogCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3R3bDYwMzAtaXJxLmMgYi9kcml2ZXJzL21mZC90d2w2MDMwLWlycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYmYyMjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC90d2w2MDMwLWlycS5jCkBAIC0wLDAgKzEsMjk5IEBACisvKgorICogdHdsNjAzMC1pcnEuYyAtIFRXTDYwMzAgaXJxIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIE1vZGlmaWNhdGlvbnMgdG8gZGVmZXIgaW50ZXJydXB0IGhhbmRsaW5nIHRvIGEga2VybmVsIHRocmVhZDoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKgorICogQmFzZWQgb24gdGx2MzIwYWljMjMuYzoKKyAqIENvcHlyaWdodCAoYykgYnkgS2FpIFN2YWhuIDxrYWkuc3ZhaG5Abm9raWEuY29tPgorICoKKyAqIENvZGUgY2xlYW51cCBhbmQgbW9kaWZpY2F0aW9ucyB0byBJUlEgaGFuZGxlci4KKyAqIGJ5IHN5ZWQga2hhc2ltIDx4MGtoYXNpbUB0aS5jb20+CisgKgorICogVFdMNjAzMCBzcGVjaWZpYyBjb2RlIGFuZCBJUlEgaGFuZGxpbmcgY2hhbmdlcyBieQorICogSmFnYWRlZXNoIEJoYXNrYXIgUGFrYXJhdm9vciA8ai1wYWthcmF2b29yQHRpLmNvbT4KKyAqIEJhbGFqaSBUIEsgPGJhbGFqaXRrQHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvdHdsLmg+CisKKy8qCisgKiBUV0w2MDMwICh1bmxpa2UgaXRzIHByZWRlY2Vzc29ycywgd2hpY2ggaGFkIHR3byBsZXZlbCBpbnRlcnJ1cHQgaGFuZGxpbmcpCisgKiB0aHJlZSBpbnRlcnJ1cHQgcmVnaXN0ZXJzIElOVF9TVFNfQSwgSU5UX1NUU19CIGFuZCBJTlRfU1RTX0MuCisgKiBJdCBleHBvc2VzIHN0YXR1cyBiaXRzIHNheWluZyB3aG8gaGFzIHJhaXNlZCBhbiBpbnRlcnJ1cHQuIFRoZXJlIGFyZQorICogdGhyZWUgbWFzayByZWdpc3RlcnMgdGhhdCBjb3JyZXNwb25kcyB0byB0aGVzZSBzdGF0dXMgcmVnaXN0ZXJzLCB0aGF0CisgKiBlbmFibGVzL2Rpc2FibGVzIHRoZXNlIGludGVycnVwdHMuCisgKgorICogV2Ugc2V0IHVwIElSUXMgc3RhcnRpbmcgYXQgYSBwbGF0Zm9ybS1zcGVjaWZpZWQgYmFzZS4gQW4gaW50ZXJydXB0IG1hcCB0YWJsZSwKKyAqIHNwZWNpZmllcyBtYXBwaW5nIGJldHdlZW4gaW50ZXJydXB0IG51bWJlciBhbmQgdGhlIGFzc29jaWF0ZWQgbW9kdWxlLgorICoKKyAqLworCitzdGF0aWMgaW50IHR3bDYwMzBfaW50ZXJydXB0X21hcHBpbmdbMjRdID0geworCVBXUl9JTlRSX09GRlNFVCwJLyogQml0IDAJUFdST04JCQkqLworCVBXUl9JTlRSX09GRlNFVCwJLyogQml0IDEJUlBXUk9OCQkJKi8KKwlQV1JfSU5UUl9PRkZTRVQsCS8qIEJpdCAyCUJBVF9WTE9XCQkqLworCVJUQ19JTlRSX09GRlNFVCwJLyogQml0IDMJUlRDX0FMQVJNCQkqLworCVJUQ19JTlRSX09GRlNFVCwJLyogQml0IDQJUlRDX1BFUklPRAkJKi8KKwlIT1RESUVfSU5UUl9PRkZTRVQsCS8qIEJpdCA1CUhPVF9ESUUJCQkqLworCVNNUFNMRE9fSU5UUl9PRkZTRVQsCS8qIEJpdCA2CVZYWFhfU0hPUlQJCSovCisJU01QU0xET19JTlRSX09GRlNFVCwJLyogQml0IDcJVk1NQ19TSE9SVAkJKi8KKworCVNNUFNMRE9fSU5UUl9PRkZTRVQsCS8qIEJpdCA4CVZVU0lNX1NIT1JUCQkqLworCUJBVERFVEVDVF9JTlRSX09GRlNFVCwJLyogQml0IDkJQkFUCQkJKi8KKwlTSU1ERVRFQ1RfSU5UUl9PRkZTRVQsCS8qIEJpdCAxMAlTSU0JCQkqLworCU1NQ0RFVEVDVF9JTlRSX09GRlNFVCwJLyogQml0IDExCU1NQwkJCSovCisJUlNWX0lOVFJfT0ZGU0VULCAgCS8qIEJpdCAxMglSZXNlcnZlZAkJKi8KKwlNQURDX0lOVFJfT0ZGU0VULAkvKiBCaXQgMTMJR1BBRENfUlRfRU9DCQkqLworCU1BRENfSU5UUl9PRkZTRVQsCS8qIEJpdCAxNAlHUEFEQ19TV19FT0MJCSovCisJR0FTR0FVR0VfSU5UUl9PRkZTRVQsCS8qIEJpdCAxNQlDQ19BVVRPQ0FMCQkqLworCisJVVNCT1RHX0lOVFJfT0ZGU0VULAkvKiBCaXQgMTYJSURfV0tVUAkJCSovCisJVVNCT1RHX0lOVFJfT0ZGU0VULAkvKiBCaXQgMTcJVkJVU19XS1VQCQkqLworCVVTQk9UR19JTlRSX09GRlNFVCwJLyogQml0IDE4CUlECQkJKi8KKwlVU0JPVEdfSU5UUl9PRkZTRVQsCS8qIEJpdCAxOQlWQlVTCQkJKi8KKwlDSEFSR0VSX0lOVFJfT0ZGU0VULAkvKiBCaXQgMjAJQ0hSR19DVFJMCQkqLworCUNIQVJHRVJfSU5UUl9PRkZTRVQsCS8qIEJpdCAyMQlFWFRfQ0hSRwkJKi8KKwlDSEFSR0VSX0lOVFJfT0ZGU0VULAkvKiBCaXQgMjIJSU5UX0NIUkcJCSovCisJUlNWX0lOVFJfT0ZGU0VULAkvKiBCaXQgMjMJUmVzZXJ2ZWQJCSovCit9OworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHVuc2lnbmVkIHR3bDYwMzBfaXJxX2Jhc2U7CisKK3N0YXRpYyBzdHJ1Y3QgY29tcGxldGlvbiBpcnFfZXZlbnQ7CisKKy8qCisgKiBUaGlzIHRocmVhZCBwcm9jZXNzZXMgaW50ZXJydXB0cyByZXBvcnRlZCBieSB0aGUgUHJpbWFyeSBJbnRlcnJ1cHQgSGFuZGxlci4KKyAqLworc3RhdGljIGludCB0d2w2MDMwX2lycV90aHJlYWQodm9pZCAqZGF0YSkKK3sKKwlsb25nIGlycSA9IChsb25nKWRhdGE7CisJc3RhdGljIHVuc2lnbmVkIGkyY19lcnJvcnM7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1heF9pMmNfZXJyb3JzID0gMTAwOworCWludCByZXQ7CisKKwljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKKworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCWludCBpOworCQl1bmlvbiB7CisJCXU4IGJ5dGVzWzRdOworCQl1MzIgaW50X3N0czsKKwkJfSBzdHM7CisKKwkJLyogV2FpdCBmb3IgSVJRLCB0aGVuIHJlYWQgUElIIGlycSBzdGF0dXMgKGFsc28gYmxvY2tpbmcpICovCisJCXdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmaXJxX2V2ZW50KTsKKworCQkvKiByZWFkIElOVF9TVFNfQSwgQiBhbmQgQyBpbiBvbmUgc2hvdCB1c2luZyBhIGJ1cnN0IHJlYWQgKi8KKwkJcmV0ID0gdHdsX2kyY19yZWFkKFRXTF9NT0RVTEVfUElILCBzdHMuYnl0ZXMsCisJCQkJUkVHX0lOVF9TVFNfQSwgMyk7CisJCWlmIChyZXQpIHsKKwkJCXByX3dhcm5pbmcoInR3bDYwMzA6IEkyQyBlcnJvciAlZCByZWFkaW5nIFBJSCBJU1JcbiIsCisJCQkJCXJldCk7CisJCQlpZiAoKytpMmNfZXJyb3JzID49IG1heF9pMmNfZXJyb3JzKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJNYXhpbXVtIEkyQyBlcnJvciBjb3VudCIKKwkJCQkJCSIgZXhjZWVkZWQuICBUZXJtaW5hdGluZyAlcy5cbiIsCisJCQkJCQlfX2Z1bmNfXyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljb21wbGV0ZSgmaXJxX2V2ZW50KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKworCisJCXN0cy5ieXRlc1szXSA9IDA7IC8qIE9ubHkgMjQgYml0cyBhcmUgdmFsaWQqLworCisJCWZvciAoaSA9IDA7IHN0cy5pbnRfc3RzOyBzdHMuaW50X3N0cyA+Pj0gMSwgaSsrKSB7CisJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQkJaWYgKHN0cy5pbnRfc3RzICYgMHgxKSB7CisJCQkJaW50IG1vZHVsZV9pcnEgPSB0d2w2MDMwX2lycV9iYXNlICsKKwkJCQkJdHdsNjAzMF9pbnRlcnJ1cHRfbWFwcGluZ1tpXTsKKwkJCQlzdHJ1Y3QgaXJxX2Rlc2MgKmQgPSBpcnFfdG9fZGVzYyhtb2R1bGVfaXJxKTsKKworCQkJCWlmICghZCkgeworCQkJCQlwcl9lcnIoInR3bDYwMzA6IEludmFsaWQgU0lIIElSUTogJWRcbiIsCisJCQkJCSAgICAgICBtb2R1bGVfaXJxKTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCisJCQkJLyogVGhlc2UgY2FuJ3QgYmUgbWFza2VkIC4uLiBhbHdheXMgd2FybgorCQkJCSAqIGlmIHdlIGdldCBhbnkgc3VycHJpc2VzLgorCQkJCSAqLworCQkJCWlmIChkLT5zdGF0dXMgJiBJUlFfRElTQUJMRUQpCisJCQkJCW5vdGVfaW50ZXJydXB0KG1vZHVsZV9pcnEsIGQsCisJCQkJCQkJSVJRX05PTkUpOworCQkJCWVsc2UKKwkJCQkJZC0+aGFuZGxlX2lycShtb2R1bGVfaXJxLCBkKTsKKworCQkJfQorCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCX0KKwkJcmV0ID0gdHdsX2kyY193cml0ZShUV0xfTU9EVUxFX1BJSCwgc3RzLmJ5dGVzLAorCQkJCVJFR19JTlRfU1RTX0EsIDMpOyAvKiBjbGVhciBJTlRfU1RTX0EgKi8KKwkJaWYgKHJldCkKKwkJCXByX3dhcm5pbmcoInR3bDYwMzA6IEkyQyBlcnJvciBpbiBjbGVhcmluZyBQSUggSVNSXG4iKTsKKworCQllbmFibGVfaXJxKGlycSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBoYW5kbGVfdHdsNjAzMF9pbnQoKSBpcyB0aGUgZGVzYy0+aGFuZGxlIG1ldGhvZCBmb3IgdGhlIHR3bDYwMzAgaW50ZXJydXB0LgorICogVGhpcyBpcyBhIGNoYWluZWQgaW50ZXJydXB0LCBzbyB0aGVyZSBpcyBubyBkZXNjLT5hY3Rpb24gbWV0aG9kIGZvciBpdC4KKyAqIE5vdyB3ZSBuZWVkIHRvIHF1ZXJ5IHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciBpbiB0aGUgdHdsNjAzMCB0byBkZXRlcm1pbmUKKyAqIHdoaWNoIG1vZHVsZSBpcyBnZW5lcmF0aW5nIHRoZSBpbnRlcnJ1cHQgcmVxdWVzdC4gIEhvd2V2ZXIsIHdlIGNhbid0IGRvIGkyYworICogdHJhbnNhY3Rpb25zIGluIGludGVycnVwdCBjb250ZXh0LCBzbyB3ZSBtdXN0IGRlZmVyIHRoYXQgd29yayB0byBhIGtlcm5lbAorICogdGhyZWFkLiAgQWxsIHdlIGRvIGhlcmUgaXMgYWNrbm93bGVkZ2UgYW5kIG1hc2sgdGhlIGludGVycnVwdCBhbmQgd2FrZXVwCisgKiB0aGUga2VybmVsIHRocmVhZC4KKyAqLworc3RhdGljIGlycXJldHVybl90IGhhbmRsZV90d2w2MDMwX3BpaChpbnQgaXJxLCB2b2lkICpkZXZpZCkKK3sKKwlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKKwljb21wbGV0ZShkZXZpZCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIHZvaWQgYWN0aXZhdGVfaXJxKGludCBpcnEpCit7CisjaWZkZWYgQ09ORklHX0FSTQorCS8qIEFSTSByZXF1aXJlcyBhbiBleHRyYSBzdGVwIHRvIGNsZWFyIElSUV9OT1JFUVVFU1QsIHdoaWNoIGl0CisJICogc2V0cyBvbiBiZWhhbGYgb2YgZXZlcnkgaXJxX2NoaXAuICBBbHNvIHNldHMgSVJRX05PUFJPQkUuCisJICovCisJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQpOworI2Vsc2UKKwkvKiBzYW1lIGVmZmVjdCBvbiBvdGhlciBhcmNoaXRlY3R1cmVzICovCisJc2V0X2lycV9ub3Byb2JlKGlycSk7CisjZW5kaWYKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHVuc2lnbmVkIHR3bDYwMzBfaXJxX25leHQ7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgdHdsNjAzMF9pbnRlcnJ1cHRfdW5tYXNrKHU4IGJpdF9tYXNrLCB1OCBvZmZzZXQpCit7CisJaW50IHJldDsKKwl1OCB1bm1hc2tfdmFsdWU7CisJcmV0ID0gdHdsX2kyY19yZWFkX3U4KFRXTF9NT0RVTEVfUElILCAmdW5tYXNrX3ZhbHVlLAorCQkJUkVHX0lOVF9TVFNfQSArIG9mZnNldCk7CisJdW5tYXNrX3ZhbHVlICY9ICh+KGJpdF9tYXNrKSk7CisJcmV0IHw9IHR3bF9pMmNfd3JpdGVfdTgoVFdMX01PRFVMRV9QSUgsIHVubWFza192YWx1ZSwKKwkJCVJFR19JTlRfU1RTX0EgKyBvZmZzZXQpOyAvKiB1bm1hc2sgSU5UX01TS19BL0IvQyAqLworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHR3bDYwMzBfaW50ZXJydXB0X3VubWFzayk7CisKK2ludCB0d2w2MDMwX2ludGVycnVwdF9tYXNrKHU4IGJpdF9tYXNrLCB1OCBvZmZzZXQpCit7CisJaW50IHJldDsKKwl1OCBtYXNrX3ZhbHVlOworCXJldCA9IHR3bF9pMmNfcmVhZF91OChUV0xfTU9EVUxFX1BJSCwgJm1hc2tfdmFsdWUsCisJCQlSRUdfSU5UX1NUU19BICsgb2Zmc2V0KTsKKwltYXNrX3ZhbHVlIHw9IChiaXRfbWFzayk7CisJcmV0IHw9IHR3bF9pMmNfd3JpdGVfdTgoVFdMX01PRFVMRV9QSUgsIG1hc2tfdmFsdWUsCisJCQlSRUdfSU5UX1NUU19BICsgb2Zmc2V0KTsgLyogbWFzayBJTlRfTVNLX0EvQi9DICovCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wodHdsNjAzMF9pbnRlcnJ1cHRfbWFzayk7CisKK2ludCB0d2w2MDMwX2luaXRfaXJxKGludCBpcnFfbnVtLCB1bnNpZ25lZCBpcnFfYmFzZSwgdW5zaWduZWQgaXJxX2VuZCkKK3sKKworCWludAlzdGF0dXMgPSAwOworCWludAlpOworCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGFzazsKKwlpbnQgcmV0OworCXU4IG1hc2tbNF07CisKKwlzdGF0aWMgc3RydWN0IGlycV9jaGlwCXR3bDYwMzBfaXJxX2NoaXA7CisJbWFza1sxXSA9IDB4RkY7CisJbWFza1syXSA9IDB4RkY7CisJbWFza1szXSA9IDB4RkY7CisJcmV0ID0gdHdsX2kyY193cml0ZShUV0xfTU9EVUxFX1BJSCwgJm1hc2tbMF0sCisJCQlSRUdfSU5UX01TS19MSU5FX0EsIDMpOyAvKiBNQVNLIEFMTCBJTlQgTElORVMgKi8KKwlyZXQgPSB0d2xfaTJjX3dyaXRlKFRXTF9NT0RVTEVfUElILCAmbWFza1swXSwKKwkJCVJFR19JTlRfTVNLX1NUU19BLCAzKTsgLyogTUFTSyBBTEwgSU5UIFNUUyAqLworCXJldCA9IHR3bF9pMmNfd3JpdGUoVFdMX01PRFVMRV9QSUgsICZtYXNrWzBdLAorCQkJUkVHX0lOVF9TVFNfQSwgMyk7IC8qIGNsZWFyIElOVF9TVFNfQSxCLEMgKi8KKworCXR3bDYwMzBfaXJxX2Jhc2UgPSBpcnFfYmFzZTsKKworCS8qIGluc3RhbGwgYW4gaXJxIGhhbmRsZXIgZm9yIGVhY2ggb2YgdGhlIG1vZHVsZXM7CisJICogY2xvbmUgZHVtbXkgaXJxX2NoaXAgc2luY2UgUElIIGNhbid0ICpkbyogYW55dGhpbmcKKwkgKi8KKwl0d2w2MDMwX2lycV9jaGlwID0gZHVtbXlfaXJxX2NoaXA7CisJdHdsNjAzMF9pcnFfY2hpcC5uYW1lID0gInR3bDYwMzAiOworCXR3bDYwMzBfaXJxX2NoaXAuc2V0X3R5cGUgPSBOVUxMOworCisJZm9yIChpID0gaXJxX2Jhc2U7IGkgPCBpcnFfZW5kOyBpKyspIHsKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGksICZ0d2w2MDMwX2lycV9jaGlwLAorCQkJCWhhbmRsZV9zaW1wbGVfaXJxKTsKKwkJYWN0aXZhdGVfaXJxKGkpOworCX0KKworCXR3bDYwMzBfaXJxX25leHQgPSBpOworCXByX2luZm8oInR3bDYwMzA6ICVzIChpcnEgJWQpIGNoYWluaW5nIElSUXMgJWQuLiVkXG4iLCAiUElIIiwKKwkJCWlycV9udW0sIGlycV9iYXNlLCB0d2w2MDMwX2lycV9uZXh0IC0gMSk7CisKKwkvKiBpbnN0YWxsIGFuIGlycSBoYW5kbGVyIHRvIGRlbXVsdGlwbGV4IHRoZSBUV0w2MDMwIGludGVycnVwdCAqLworCWluaXRfY29tcGxldGlvbigmaXJxX2V2ZW50KTsKKwl0YXNrID0ga3RocmVhZF9ydW4odHdsNjAzMF9pcnFfdGhyZWFkLCAodm9pZCAqKWlycV9udW0sICJ0d2w2MDMwLWlycSIpOworCWlmIChJU19FUlIodGFzaykpIHsKKwkJcHJfZXJyKCJ0d2w2MDMwOiBjb3VsZCBub3QgY3JlYXRlIGlycSAlZCB0aHJlYWQhXG4iLCBpcnFfbnVtKTsKKwkJc3RhdHVzID0gUFRSX0VSUih0YXNrKTsKKwkJZ290byBmYWlsX2t0aHJlYWQ7CisJfQorCisJc3RhdHVzID0gcmVxdWVzdF9pcnEoaXJxX251bSwgaGFuZGxlX3R3bDYwMzBfcGloLCBJUlFGX0RJU0FCTEVELAorCQkJCSJUV0w2MDMwLVBJSCIsICZpcnFfZXZlbnQpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCXByX2VycigidHdsNjAzMDogY291bGQgbm90IGNsYWltIGlycSVkOiAlZFxuIiwgaXJxX251bSwgc3RhdHVzKTsKKwkJZ290byBmYWlsX2lycTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK2ZhaWxfaXJxOgorCWZyZWVfaXJxKGlycV9udW0sICZpcnFfZXZlbnQpOworCitmYWlsX2t0aHJlYWQ6CisJZm9yIChpID0gaXJxX2Jhc2U7IGkgPCBpcnFfZW5kOyBpKyspCisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCBOVUxMLCBOVUxMKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgdHdsNjAzMF9leGl0X2lycSh2b2lkKQoreworCisJaWYgKHR3bDYwMzBfaXJxX2Jhc2UpIHsKKwkJcHJfZXJyKCJ0d2w2MDMwOiBjYW4ndCB5ZXQgY2xlYW4gdXAgSVJRcz9cbiIpOworCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3dtODMxeC1jb3JlLmMgYi9kcml2ZXJzL21mZC93bTgzMXgtY29yZS5jCmluZGV4IDdmMjc1NzYuLjIyM2E5MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3dtODMxeC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvd204MzF4LWNvcmUuYwpAQCAtOTAsOSArOTAsMTAgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHdtODMxeF9pc2lua3ZfdmFsdWVzKTsKIAogZW51bSB3bTgzMXhfcGFyZW50IHsKLQlXTTgzMTAgPSAwLAotCVdNODMxMSA9IDEsCi0JV004MzEyID0gMiwKKwlXTTgzMTAgPSAweDgzMTAsCisJV004MzExID0gMHg4MzExLAorCVdNODMxMiA9IDB4ODMxMiwKKwlXTTgzMjAgPSAweDgzMjAsCiB9OwogCiBzdGF0aWMgaW50IHdtODMxeF9yZWdfbG9ja2VkKHN0cnVjdCB3bTgzMXggKndtODMxeCwgdW5zaWduZWQgc2hvcnQgcmVnKQpAQCAtNDc4LDYgKzQ3OSwyMCBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHdtODMyMF9kY2RjNF9idWNrX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0ID0gV004MzFYX0RDNF9DT05UUk9MLAorCQkuZW5kICAgPSBXTTgzMlhfREM0X1NMRUVQX0NPTlRST0wsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSU8sCisJfSwKKwl7CisJCS5uYW1lICA9ICJVViIsCisJCS5zdGFydCA9IFdNODMxWF9JUlFfVVZfREM0LAorCQkuZW5kICAgPSBXTTgzMVhfSVJRX1VWX0RDNCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugd204MzF4X2dwaW9fcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSBXTTgzMVhfSVJRX0dQSU9fMSwKQEAgLTEyMzcsNiArMTI1MiwxMzcgQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBtZmRfY2VsbCB3bTgzMjBfZGV2c1tdID0geworCXsKKwkJLm5hbWUgPSAid204MzF4LWJhY2t1cCIsCisJfSwKKwl7CisJCS5uYW1lID0gIndtODMxeC1idWNrdiIsCisJCS5pZCA9IDEsCisJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfZGNkYzFfcmVzb3VyY2VzKSwKKwkJLnJlc291cmNlcyA9IHdtODMxeF9kY2RjMV9yZXNvdXJjZXMsCisJfSwKKwl7CisJCS5uYW1lID0gIndtODMxeC1idWNrdiIsCisJCS5pZCA9IDIsCisJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfZGNkYzJfcmVzb3VyY2VzKSwKKwkJLnJlc291cmNlcyA9IHdtODMxeF9kY2RjMl9yZXNvdXJjZXMsCisJfSwKKwl7CisJCS5uYW1lID0gIndtODMxeC1idWNrcCIsCisJCS5pZCA9IDMsCisJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfZGNkYzNfcmVzb3VyY2VzKSwKKwkJLnJlc291cmNlcyA9IHdtODMxeF9kY2RjM19yZXNvdXJjZXMsCisJfSwKKwl7CisJCS5uYW1lID0gIndtODMxeC1idWNrcCIsCisJCS5pZCA9IDQsCisJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMjBfZGNkYzRfYnVja19yZXNvdXJjZXMpLAorCQkucmVzb3VyY2VzID0gd204MzIwX2RjZGM0X2J1Y2tfcmVzb3VyY2VzLAorCX0sCisJeworCQkubmFtZSA9ICJ3bTgzMXgtZ3BpbyIsCisJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfZ3Bpb19yZXNvdXJjZXMpLAorCQkucmVzb3VyY2VzID0gd204MzF4X2dwaW9fcmVzb3VyY2VzLAorCX0sCisJeworCQkubmFtZSA9ICJ3bTgzMXgtaHdtb24iLAorCX0sCisJeworCQkubmFtZSA9ICJ3bTgzMXgtbGRvIiwKKwkJLmlkID0gMSwKKwkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHdtODMxeF9sZG8xX3Jlc291cmNlcyksCisJCS5yZXNvdXJjZXMgPSB3bTgzMXhfbGRvMV9yZXNvdXJjZXMsCisJfSwKKwl7CisJCS5uYW1lID0gIndtODMxeC1sZG8iLAorCQkuaWQgPSAyLAorCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUod204MzF4X2xkbzJfcmVzb3VyY2VzKSwKKwkJLnJlc291cmNlcyA9IHdtODMxeF9sZG8yX3Jlc291cmNlcywKKwl9LAorCXsKKwkJLm5hbWUgPSAid204MzF4LWxkbyIsCisJCS5pZCA9IDMsCisJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfbGRvM19yZXNvdXJjZXMpLAorCQkucmVzb3VyY2VzID0gd204MzF4X2xkbzNfcmVzb3VyY2VzLAorCX0sCisJeworCQkubmFtZSA9ICJ3bTgzMXgtbGRvIiwKKwkJLmlkID0gNCwKKwkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHdtODMxeF9sZG80X3Jlc291cmNlcyksCisJCS5yZXNvdXJjZXMgPSB3bTgzMXhfbGRvNF9yZXNvdXJjZXMsCisJfSwKKwl7CisJCS5uYW1lID0gIndtODMxeC1sZG8iLAorCQkuaWQgPSA1LAorCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUod204MzF4X2xkbzVfcmVzb3VyY2VzKSwKKwkJLnJlc291cmNlcyA9IHdtODMxeF9sZG81X3Jlc291cmNlcywKKwl9LAorCXsKKwkJLm5hbWUgPSAid204MzF4LWxkbyIsCisJCS5pZCA9IDYsCisJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfbGRvNl9yZXNvdXJjZXMpLAorCQkucmVzb3VyY2VzID0gd204MzF4X2xkbzZfcmVzb3VyY2VzLAorCX0sCisJeworCQkubmFtZSA9ICJ3bTgzMXgtYWxkbyIsCisJCS5pZCA9IDcsCisJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfbGRvN19yZXNvdXJjZXMpLAorCQkucmVzb3VyY2VzID0gd204MzF4X2xkbzdfcmVzb3VyY2VzLAorCX0sCisJeworCQkubmFtZSA9ICJ3bTgzMXgtYWxkbyIsCisJCS5pZCA9IDgsCisJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfbGRvOF9yZXNvdXJjZXMpLAorCQkucmVzb3VyY2VzID0gd204MzF4X2xkbzhfcmVzb3VyY2VzLAorCX0sCisJeworCQkubmFtZSA9ICJ3bTgzMXgtYWxkbyIsCisJCS5pZCA9IDksCisJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfbGRvOV9yZXNvdXJjZXMpLAorCQkucmVzb3VyY2VzID0gd204MzF4X2xkbzlfcmVzb3VyY2VzLAorCX0sCisJeworCQkubmFtZSA9ICJ3bTgzMXgtYWxkbyIsCisJCS5pZCA9IDEwLAorCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUod204MzF4X2xkbzEwX3Jlc291cmNlcyksCisJCS5yZXNvdXJjZXMgPSB3bTgzMXhfbGRvMTBfcmVzb3VyY2VzLAorCX0sCisJeworCQkubmFtZSA9ICJ3bTgzMXgtYWxpdmUtbGRvIiwKKwkJLmlkID0gMTEsCisJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfbGRvMTFfcmVzb3VyY2VzKSwKKwkJLnJlc291cmNlcyA9IHdtODMxeF9sZG8xMV9yZXNvdXJjZXMsCisJfSwKKwl7CisJCS5uYW1lID0gIndtODMxeC1vbiIsCisJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfb25fcmVzb3VyY2VzKSwKKwkJLnJlc291cmNlcyA9IHdtODMxeF9vbl9yZXNvdXJjZXMsCisJfSwKKwl7CisJCS5uYW1lID0gIndtODMxeC1ydGMiLAorCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUod204MzF4X3J0Y19yZXNvdXJjZXMpLAorCQkucmVzb3VyY2VzID0gd204MzF4X3J0Y19yZXNvdXJjZXMsCisJfSwKKwl7CisJCS5uYW1lID0gIndtODMxeC1zdGF0dXMiLAorCQkuaWQgPSAxLAorCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUod204MzF4X3N0YXR1czFfcmVzb3VyY2VzKSwKKwkJLnJlc291cmNlcyA9IHdtODMxeF9zdGF0dXMxX3Jlc291cmNlcywKKwl9LAorCXsKKwkJLm5hbWUgPSAid204MzF4LXN0YXR1cyIsCisJCS5pZCA9IDIsCisJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfc3RhdHVzMl9yZXNvdXJjZXMpLAorCQkucmVzb3VyY2VzID0gd204MzF4X3N0YXR1czJfcmVzb3VyY2VzLAorCX0sCisJeworCQkubmFtZSA9ICJ3bTgzMXgtd2F0Y2hkb2ciLAorCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUod204MzF4X3dkdF9yZXNvdXJjZXMpLAorCQkucmVzb3VyY2VzID0gd204MzF4X3dkdF9yZXNvdXJjZXMsCisJfSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgbWZkX2NlbGwgYmFja2xpZ2h0X2RldnNbXSA9IHsKIAl7CiAJCS5uYW1lID0gIndtODMxeC1iYWNrbGlnaHQiLApAQCAtMTI4Miw1MCArMTQyOCwzNyBAQAogCQlnb3RvIGVycjsKIAl9CiAKKwkvKiBTb21lIGVuZ2luZWVyaW5nIHNhbXBsZXMgZG8gbm90IGhhdmUgdGhlIElEIHNldCwgcmVseSBvbgorCSAqIHRoZSBkZXZpY2UgYmVpbmcgcmVnaXN0ZXJlZCBjb3JyZWN0bHkuCisJICovCisJaWYgKHJldCA9PSAwKSB7CisJCWRldl9pbmZvKHdtODMxeC0+ZGV2LCAiRGV2aWNlIGlzIGFuIGVuZ2luZWVyaW5nIHNhbXBsZVxuIik7CisJCXJldCA9IGlkOworCX0KKwogCXN3aXRjaCAocmV0KSB7Ci0JY2FzZSAweDgzMTA6CisJY2FzZSBXTTgzMTA6CiAJCXBhcmVudCA9IFdNODMxMDsKLQkJc3dpdGNoIChyZXYpIHsKLQkJY2FzZSAwOgotCQkJZGV2X2luZm8od204MzF4LT5kZXYsICJXTTgzMTAgcmV2aXNpb24gJWNcbiIsCi0JCQkJICdBJyArIHJldik7Ci0JCQlicmVhazsKLQkJfQorCQl3bTgzMXgtPm51bV9ncGlvID0gMTY7CisJCWRldl9pbmZvKHdtODMxeC0+ZGV2LCAiV004MzEwIHJldmlzaW9uICVjXG4iLCAnQScgKyByZXYpOwogCQlicmVhazsKIAotCWNhc2UgMHg4MzExOgorCWNhc2UgV004MzExOgogCQlwYXJlbnQgPSBXTTgzMTE7Ci0JCXN3aXRjaCAocmV2KSB7Ci0JCWNhc2UgMDoKLQkJCWRldl9pbmZvKHdtODMxeC0+ZGV2LCAiV004MzExIHJldmlzaW9uICVjXG4iLAotCQkJCSAnQScgKyByZXYpOwotCQkJYnJlYWs7Ci0JCX0KKwkJd204MzF4LT5udW1fZ3BpbyA9IDE2OworCQlkZXZfaW5mbyh3bTgzMXgtPmRldiwgIldNODMxMSByZXZpc2lvbiAlY1xuIiwgJ0EnICsgcmV2KTsKIAkJYnJlYWs7CiAKLQljYXNlIDB4ODMxMjoKKwljYXNlIFdNODMxMjoKIAkJcGFyZW50ID0gV004MzEyOwotCQlzd2l0Y2ggKHJldikgewotCQljYXNlIDA6Ci0JCQlkZXZfaW5mbyh3bTgzMXgtPmRldiwgIldNODMxMiByZXZpc2lvbiAlY1xuIiwKLQkJCQkgJ0EnICsgcmV2KTsKLQkJCWJyZWFrOwotCQl9CisJCXdtODMxeC0+bnVtX2dwaW8gPSAxNjsKKwkJZGV2X2luZm8od204MzF4LT5kZXYsICJXTTgzMTIgcmV2aXNpb24gJWNcbiIsICdBJyArIHJldik7CiAJCWJyZWFrOwogCi0JY2FzZSAwOgotCQkvKiBTb21lIGVuZ2luZWVyaW5nIHNhbXBsZXMgZG8gbm90IGhhdmUgdGhlIElEIHNldCwKLQkJICogcmVseSBvbiB0aGUgZGV2aWNlIGJlaW5nIHJlZ2lzdGVyZWQgY29ycmVjdGx5LgotCQkgKiBUaGlzIHdpbGwgbmVlZCByZXZpc2l0aW5nIGZvciBmdXR1cmUgZGV2aWNlcyB3aXRoCi0JCSAqIG11bHRpcGxlIGRpZXMuCi0JCSAqLwotCQlwYXJlbnQgPSBpZDsKLQkJc3dpdGNoIChyZXYpIHsKLQkJY2FzZSAwOgotCQkJZGV2X2luZm8od204MzF4LT5kZXYsICJXTTgzMSVkIEVTIHJldmlzaW9uICVjXG4iLAotCQkJCSBwYXJlbnQsICdBJyArIHJldik7Ci0JCQlicmVhazsKLQkJfQorCWNhc2UgV004MzIwOgorCQlwYXJlbnQgPSBXTTgzMjA7CisJCXdtODMxeC0+bnVtX2dwaW8gPSAxMjsKKwkJZGV2X2luZm8od204MzF4LT5kZXYsICJXTTgzMjAgcmV2aXNpb24gJWNcbiIsICdBJyArIHJldik7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTEzMzgsNyArMTQ3MSw3IEBACiAJICogY3VycmVudCBwYXJ0cy4KIAkgKi8KIAlpZiAocGFyZW50ICE9IGlkKQotCQlkZXZfd2Fybih3bTgzMXgtPmRldiwgIkRldmljZSB3YXMgcmVnaXN0ZXJlZCBhcyBhIFdNODMxJWx1XG4iLAorCQlkZXZfd2Fybih3bTgzMXgtPmRldiwgIkRldmljZSB3YXMgcmVnaXN0ZXJlZCBhcyBhIFdNJWx4XG4iLAogCQkJIGlkKTsKIAogCS8qIEJvb3RzdHJhcCB0aGUgdXNlciBrZXkgKi8KQEAgLTEzNzEsMTggKzE1MDQsMjQgQEAKIAljYXNlIFdNODMxMDoKIAkJcmV0ID0gbWZkX2FkZF9kZXZpY2VzKHdtODMxeC0+ZGV2LCAtMSwKIAkJCQkgICAgICB3bTgzMTBfZGV2cywgQVJSQVlfU0laRSh3bTgzMTBfZGV2cyksCi0JCQkJICAgICAgTlVMTCwgMCk7CisJCQkJICAgICAgTlVMTCwgd204MzF4LT5pcnFfYmFzZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBXTTgzMTE6CiAJCXJldCA9IG1mZF9hZGRfZGV2aWNlcyh3bTgzMXgtPmRldiwgLTEsCiAJCQkJICAgICAgd204MzExX2RldnMsIEFSUkFZX1NJWkUod204MzExX2RldnMpLAotCQkJCSAgICAgIE5VTEwsIDApOworCQkJCSAgICAgIE5VTEwsIHdtODMxeC0+aXJxX2Jhc2UpOwogCQlicmVhazsKIAogCWNhc2UgV004MzEyOgogCQlyZXQgPSBtZmRfYWRkX2RldmljZXMod204MzF4LT5kZXYsIC0xLAogCQkJCSAgICAgIHdtODMxMl9kZXZzLCBBUlJBWV9TSVpFKHdtODMxMl9kZXZzKSwKKwkJCQkgICAgICBOVUxMLCB3bTgzMXgtPmlycV9iYXNlKTsKKwkJYnJlYWs7CisKKwljYXNlIFdNODMyMDoKKwkJcmV0ID0gbWZkX2FkZF9kZXZpY2VzKHdtODMxeC0+ZGV2LCAtMSwKKwkJCQkgICAgICB3bTgzMjBfZGV2cywgQVJSQVlfU0laRSh3bTgzMjBfZGV2cyksCiAJCQkJICAgICAgTlVMTCwgMCk7CiAJCWJyZWFrOwogCkBAIC0xMzk5LDcgKzE1MzgsOCBAQAogCWlmIChwZGF0YSAmJiBwZGF0YS0+YmFja2xpZ2h0KSB7CiAJCS8qIFRyZWF0IGVycm9ycyBhcyBub24tY3JpdGljYWwgKi8KIAkJcmV0ID0gbWZkX2FkZF9kZXZpY2VzKHdtODMxeC0+ZGV2LCAtMSwgYmFja2xpZ2h0X2RldnMsCi0JCQkJICAgICAgQVJSQVlfU0laRShiYWNrbGlnaHRfZGV2cyksIE5VTEwsIDApOworCQkJCSAgICAgIEFSUkFZX1NJWkUoYmFja2xpZ2h0X2RldnMpLCBOVUxMLAorCQkJCSAgICAgIHdtODMxeC0+aXJxX2Jhc2UpOwogCQlpZiAocmV0IDwgMCkKIAkJCWRldl9lcnIod204MzF4LT5kZXYsICJGYWlsZWQgdG8gYWRkIGJhY2tsaWdodDogJWRcbiIsCiAJCQkJcmV0KTsKQEAgLTE1MTEsNiArMTY1MSw3IEBACiAJeyAid204MzEwIiwgV004MzEwIH0sCiAJeyAid204MzExIiwgV004MzExIH0sCiAJeyAid204MzEyIiwgV004MzEyIH0sCisJeyAid204MzIwIiwgV004MzIwIH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHdtODMxeF9pMmNfaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvd204MzF4LWlycS5jIGIvZHJpdmVycy9tZmQvd204MzF4LWlycS5jCmluZGV4IGFjMDU2ZWEuLjMwMTMyNzY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC93bTgzMXgtaXJxLmMKKysrIGIvZHJpdmVycy9tZmQvd204MzF4LWlycS5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIApAQCAtMzM5LDExMCArMzQwLDcxIEBACiAJcmV0dXJuIFdNODMxWF9JTlRFUlJVUFRfU1RBVFVTXzFfTUFTSyAtIDEgKyBpcnFfZGF0YS0+cmVnOwogfQogCi1zdGF0aWMgdm9pZCBfX3dtODMxeF9lbmFibGVfaXJxKHN0cnVjdCB3bTgzMXggKndtODMxeCwgaW50IGlycSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHdtODMxeF9pcnFfZGF0YSAqaXJxX3RvX3dtODMxeF9pcnEoc3RydWN0IHdtODMxeCAqd204MzF4LAorCQkJCQkJCWludCBpcnEpCiB7Ci0Jc3RydWN0IHdtODMxeF9pcnFfZGF0YSAqaXJxX2RhdGEgPSAmd204MzF4X2lycXNbaXJxXTsKLQotCXdtODMxeC0+aXJxX21hc2tzW2lycV9kYXRhLT5yZWcgLSAxXSAmPSB+aXJxX2RhdGEtPm1hc2s7Ci0Jd204MzF4X3JlZ193cml0ZSh3bTgzMXgsIGlycV9kYXRhX3RvX21hc2tfcmVnKGlycV9kYXRhKSwKLQkJCSB3bTgzMXgtPmlycV9tYXNrc1tpcnFfZGF0YS0+cmVnIC0gMV0pOworCXJldHVybiAmd204MzF4X2lycXNbaXJxIC0gd204MzF4LT5pcnFfYmFzZV07CiB9CiAKLXZvaWQgd204MzF4X2VuYWJsZV9pcnEoc3RydWN0IHdtODMxeCAqd204MzF4LCBpbnQgaXJxKQorc3RhdGljIHZvaWQgd204MzF4X2lycV9sb2NrKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JbXV0ZXhfbG9jaygmd204MzF4LT5pcnFfbG9jayk7Ci0JX193bTgzMXhfZW5hYmxlX2lycSh3bTgzMXgsIGlycSk7Ci0JbXV0ZXhfdW5sb2NrKCZ3bTgzMXgtPmlycV9sb2NrKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHdtODMxeF9lbmFibGVfaXJxKTsKLQotc3RhdGljIHZvaWQgX193bTgzMXhfZGlzYWJsZV9pcnEoc3RydWN0IHdtODMxeCAqd204MzF4LCBpbnQgaXJxKQotewotCXN0cnVjdCB3bTgzMXhfaXJxX2RhdGEgKmlycV9kYXRhID0gJndtODMxeF9pcnFzW2lycV07Ci0KLQl3bTgzMXgtPmlycV9tYXNrc1tpcnFfZGF0YS0+cmVnIC0gMV0gfD0gaXJxX2RhdGEtPm1hc2s7Ci0Jd204MzF4X3JlZ193cml0ZSh3bTgzMXgsIGlycV9kYXRhX3RvX21hc2tfcmVnKGlycV9kYXRhKSwKLQkJCSB3bTgzMXgtPmlycV9tYXNrc1tpcnFfZGF0YS0+cmVnIC0gMV0pOwotfQotCi12b2lkIHdtODMxeF9kaXNhYmxlX2lycShzdHJ1Y3Qgd204MzF4ICp3bTgzMXgsIGludCBpcnEpCi17Ci0JbXV0ZXhfbG9jaygmd204MzF4LT5pcnFfbG9jayk7Ci0JX193bTgzMXhfZGlzYWJsZV9pcnEod204MzF4LCBpcnEpOwotCW11dGV4X3VubG9jaygmd204MzF4LT5pcnFfbG9jayk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh3bTgzMXhfZGlzYWJsZV9pcnEpOwotCi1pbnQgd204MzF4X3JlcXVlc3RfaXJxKHN0cnVjdCB3bTgzMXggKndtODMxeCwKLQkJICAgICAgIHVuc2lnbmVkIGludCBpcnEsIGlycV9oYW5kbGVyX3QgaGFuZGxlciwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCSAgICAgICB2b2lkICpkZXYpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoaXJxIDwgMCB8fCBpcnEgPj0gV004MzFYX05VTV9JUlFTKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwogCiAJbXV0ZXhfbG9jaygmd204MzF4LT5pcnFfbG9jayk7Cit9CiAKLQlpZiAod204MzF4X2lycXNbaXJxXS5oYW5kbGVyKSB7Ci0JCWRldl9lcnIod204MzF4LT5kZXYsICJBbHJlYWR5IGhhdmUgaGFuZGxlciBmb3IgSVJRICVkXG4iLCBpcnEpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKK3N0YXRpYyB2b2lkIHdtODMxeF9pcnFfc3luY191bmxvY2sodW5zaWduZWQgaW50IGlycSkKK3sKKwlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204MzF4LT5pcnFfbWFza3NfY3VyKTsgaSsrKSB7CisJCS8qIElmIHRoZXJlJ3MgYmVlbiBhIGNoYW5nZSBpbiB0aGUgbWFzayB3cml0ZSBpdCBiYWNrCisJCSAqIHRvIHRoZSBoYXJkd2FyZS4gKi8KKwkJaWYgKHdtODMxeC0+aXJxX21hc2tzX2N1cltpXSAhPSB3bTgzMXgtPmlycV9tYXNrc19jYWNoZVtpXSkgeworCQkJd204MzF4LT5pcnFfbWFza3NfY2FjaGVbaV0gPSB3bTgzMXgtPmlycV9tYXNrc19jdXJbaV07CisJCQl3bTgzMXhfcmVnX3dyaXRlKHdtODMxeCwKKwkJCQkJIFdNODMxWF9JTlRFUlJVUFRfU1RBVFVTXzFfTUFTSyArIGksCisJCQkJCSB3bTgzMXgtPmlycV9tYXNrc19jdXJbaV0pOworCQl9CiAJfQogCi0Jd204MzF4X2lycXNbaXJxXS5oYW5kbGVyID0gaGFuZGxlcjsKLQl3bTgzMXhfaXJxc1tpcnFdLmhhbmRsZXJfZGF0YSA9IGRldjsKLQotCV9fd204MzF4X2VuYWJsZV9pcnEod204MzF4LCBpcnEpOwotCi1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZ3bTgzMXgtPmlycV9sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh3bTgzMXhfcmVxdWVzdF9pcnEpOwotCi12b2lkIHdtODMxeF9mcmVlX2lycShzdHJ1Y3Qgd204MzF4ICp3bTgzMXgsIHVuc2lnbmVkIGludCBpcnEsIHZvaWQgKmRhdGEpCi17Ci0JaWYgKGlycSA8IDAgfHwgaXJxID49IFdNODMxWF9OVU1fSVJRUykKLQkJcmV0dXJuOwotCi0JbXV0ZXhfbG9jaygmd204MzF4LT5pcnFfbG9jayk7Ci0KLQl3bTgzMXhfaXJxc1tpcnFdLmhhbmRsZXIgPSBOVUxMOwotCXdtODMxeF9pcnFzW2lycV0uaGFuZGxlcl9kYXRhID0gTlVMTDsKLQotCV9fd204MzF4X2Rpc2FibGVfaXJxKHdtODMxeCwgaXJxKTsKLQogCW11dGV4X3VubG9jaygmd204MzF4LT5pcnFfbG9jayk7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTCh3bTgzMXhfZnJlZV9pcnEpOwogCi0KLXN0YXRpYyB2b2lkIHdtODMxeF9oYW5kbGVfaXJxKHN0cnVjdCB3bTgzMXggKndtODMxeCwgaW50IGlycSwgaW50IHN0YXR1cykKK3N0YXRpYyB2b2lkIHdtODMxeF9pcnFfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0Jc3RydWN0IHdtODMxeF9pcnFfZGF0YSAqaXJxX2RhdGEgPSAmd204MzF4X2lycXNbaXJxXTsKKwlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXN0cnVjdCB3bTgzMXhfaXJxX2RhdGEgKmlycV9kYXRhID0gaXJxX3RvX3dtODMxeF9pcnEod204MzF4LCBpcnEpOwogCi0JaWYgKGlycV9kYXRhLT5oYW5kbGVyKSB7Ci0JCWlycV9kYXRhLT5oYW5kbGVyKGlycSwgaXJxX2RhdGEtPmhhbmRsZXJfZGF0YSk7Ci0JCXdtODMxeF9yZWdfd3JpdGUod204MzF4LCBpcnFfZGF0YV90b19zdGF0dXNfcmVnKGlycV9kYXRhKSwKLQkJCQkgaXJxX2RhdGEtPm1hc2spOwotCX0gZWxzZSB7Ci0JCWRldl9lcnIod204MzF4LT5kZXYsICJVbmhhbmRsZWQgSVJRICVkLCBtYXNraW5nXG4iLCBpcnEpOwotCQlfX3dtODMxeF9kaXNhYmxlX2lycSh3bTgzMXgsIGlycSk7Ci0JfQorCXdtODMxeC0+aXJxX21hc2tzX2N1cltpcnFfZGF0YS0+cmVnIC0gMV0gJj0gfmlycV9kYXRhLT5tYXNrOwogfQogCi0vKiBNYWluIGludGVycnVwdCBoYW5kbGluZyBvY2N1cnMgaW4gYSB3b3JrcXVldWUgc2luY2Ugd2UgbmVlZAotICogaW50ZXJydXB0cyBlbmFibGVkIHRvIGludGVyYWN0IHdpdGggdGhlIGNoaXAuICovCi1zdGF0aWMgdm9pZCB3bTgzMXhfaXJxX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgdm9pZCB3bTgzMXhfaXJxX21hc2sodW5zaWduZWQgaW50IGlycSkKIHsKLQlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHdtODMxeCwgaXJxX3dvcmspOworCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJc3RydWN0IHdtODMxeF9pcnFfZGF0YSAqaXJxX2RhdGEgPSBpcnFfdG9fd204MzF4X2lycSh3bTgzMXgsIGlycSk7CisKKwl3bTgzMXgtPmlycV9tYXNrc19jdXJbaXJxX2RhdGEtPnJlZyAtIDFdIHw9IGlycV9kYXRhLT5tYXNrOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHdtODMxeF9pcnFfY2hpcCA9IHsKKwkubmFtZSA9ICJ3bTgzMXgiLAorCS5idXNfbG9jayA9IHdtODMxeF9pcnFfbG9jaywKKwkuYnVzX3N5bmNfdW5sb2NrID0gd204MzF4X2lycV9zeW5jX3VubG9jaywKKwkubWFzayA9IHdtODMxeF9pcnFfbWFzaywKKwkudW5tYXNrID0gd204MzF4X2lycV91bm1hc2ssCit9OworCisvKiBUaGUgcHJvY2Vzc2luZyBvZiB0aGUgcHJpbWFyeSBpbnRlcnJ1cHQgb2NjdXJzIGluIGEgdGhyZWFkIHNvIHRoYXQKKyAqIHdlIGNhbiBpbnRlcmFjdCB3aXRoIHRoZSBkZXZpY2Ugb3ZlciBJMkMgb3IgU1BJLiAqLworc3RhdGljIGlycXJldHVybl90IHdtODMxeF9pcnFfdGhyZWFkKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHdtODMxeCAqd204MzF4ID0gZGF0YTsKIAl1bnNpZ25lZCBpbnQgaTsKIAlpbnQgcHJpbWFyeTsKLQlpbnQgc3RhdHVzX3JlZ3NbNV07Ci0JaW50IHJlYWRbNV0gPSB7IDAgfTsKKwlpbnQgc3RhdHVzX3JlZ3NbV004MzFYX05VTV9JUlFfUkVHU10gPSB7IDAgfTsKKwlpbnQgcmVhZFtXTTgzMVhfTlVNX0lSUV9SRUdTXSA9IHsgMCB9OwogCWludCAqc3RhdHVzOwogCiAJcHJpbWFyeSA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsIFdNODMxWF9TWVNURU1fSU5URVJSVVBUUyk7CkBAIC00NTIsOCArNDE0LDYgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JbXV0ZXhfbG9jaygmd204MzF4LT5pcnFfbG9jayk7Ci0KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTgzMXhfaXJxcyk7IGkrKykgewogCQlpbnQgb2Zmc2V0ID0gd204MzF4X2lycXNbaV0ucmVnIC0gMTsKIApAQCAtNDcxLDQxICs0MzEsMzQgQEAKIAkJCQlkZXZfZXJyKHdtODMxeC0+ZGV2LAogCQkJCQkiRmFpbGVkIHRvIHJlYWQgSVJRIHN0YXR1czogJWRcbiIsCiAJCQkJCSpzdGF0dXMpOwotCQkJCWdvdG8gb3V0X2xvY2s7CisJCQkJZ290byBvdXQ7CiAJCQl9CiAKLQkJCS8qIE1hc2sgb3V0IHRoZSBkaXNhYmxlZCBJUlFzICovCi0JCQkqc3RhdHVzICY9IH53bTgzMXgtPmlycV9tYXNrc1tvZmZzZXRdOwogCQkJcmVhZFtvZmZzZXRdID0gMTsKIAkJfQogCi0JCWlmICgqc3RhdHVzICYgd204MzF4X2lycXNbaV0ubWFzaykKLQkJCXdtODMxeF9oYW5kbGVfaXJxKHdtODMxeCwgaSwgKnN0YXR1cyk7CisJCS8qIFJlcG9ydCBpdCBpZiBpdCBpc24ndCBtYXNrZWQsIG9yIGZvcmdldCB0aGUgc3RhdHVzLiAqLworCQlpZiAoKCpzdGF0dXMgJiB+d204MzF4LT5pcnFfbWFza3NfY3VyW29mZnNldF0pCisJCSAgICAmIHdtODMxeF9pcnFzW2ldLm1hc2spCisJCQloYW5kbGVfbmVzdGVkX2lycSh3bTgzMXgtPmlycV9iYXNlICsgaSk7CisJCWVsc2UKKwkJCSpzdGF0dXMgJj0gfndtODMxeF9pcnFzW2ldLm1hc2s7CiAJfQogCi1vdXRfbG9jazoKLQltdXRleF91bmxvY2soJndtODMxeC0+aXJxX2xvY2spOwogb3V0OgotCWVuYWJsZV9pcnEod204MzF4LT5pcnEpOwotfQotCi0KLXN0YXRpYyBpcnFyZXR1cm5fdCB3bTgzMXhfY3B1X2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IGRhdGE7Ci0KLQkvKiBTaHV0IHRoZSBpbnRlcnJ1cHQgdG8gdGhlIENQVSB1cCBhbmQgc2NoZWR1bGUgdGhlIGFjdHVhbAotCSAqIGhhbmRsZXI7IHdlIGNhbid0IGNoZWNrIHRoYXQgdGhlIElSUSBpcyBhc3NlcnRlZC4gKi8KLQlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKLQotCXF1ZXVlX3dvcmsod204MzF4LT5pcnFfd3EsICZ3bTgzMXgtPmlycV93b3JrKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdGF0dXNfcmVncyk7IGkrKykgeworCQlpZiAoc3RhdHVzX3JlZ3NbaV0pCisJCQl3bTgzMXhfcmVnX3dyaXRlKHdtODMxeCwgV004MzFYX0lOVEVSUlVQVF9TVEFUVVNfMSArIGksCisJCQkJCSBzdGF0dXNfcmVnc1tpXSk7CisJfQogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCiBpbnQgd204MzF4X2lycV9pbml0KHN0cnVjdCB3bTgzMXggKndtODMxeCwgaW50IGlycSkKIHsKLQlpbnQgaSwgcmV0OworCXN0cnVjdCB3bTgzMXhfcGRhdGEgKnBkYXRhID0gd204MzF4LT5kZXYtPnBsYXRmb3JtX2RhdGE7CisJaW50IGksIGN1cl9pcnEsIHJldDsKIAogCW11dGV4X2luaXQoJndtODMxeC0+aXJxX2xvY2spOwogCkBAIC01MTUsNDEgKzQ2OCw1MyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQotCXdtODMxeC0+aXJxX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoIndtODMxeC1pcnEiKTsKLQlpZiAoIXdtODMxeC0+aXJxX3dxKSB7Ci0JCWRldl9lcnIod204MzF4LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgSVJRIHdvcmtlclxuIik7Ci0JCXJldHVybiAtRVNSQ0g7CisJaWYgKCFwZGF0YSB8fCAhcGRhdGEtPmlycV9iYXNlKSB7CisJCWRldl9lcnIod204MzF4LT5kZXYsCisJCQkiTm8gaW50ZXJydXB0IGJhc2Ugc3BlY2lmaWVkLCBubyBpbnRlcnJ1cHRzXG4iKTsKKwkJcmV0dXJuIDA7CiAJfQogCiAJd204MzF4LT5pcnEgPSBpcnE7Ci0JSU5JVF9XT1JLKCZ3bTgzMXgtPmlycV93b3JrLCB3bTgzMXhfaXJxX3dvcmtlcik7CisJd204MzF4LT5pcnFfYmFzZSA9IHBkYXRhLT5pcnFfYmFzZTsKIAogCS8qIE1hc2sgdGhlIGluZGl2aWR1YWwgaW50ZXJydXB0IHNvdXJjZXMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTgzMXgtPmlycV9tYXNrcyk7IGkrKykgewotCQl3bTgzMXgtPmlycV9tYXNrc1tpXSA9IDB4ZmZmZjsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTgzMXgtPmlycV9tYXNrc19jdXIpOyBpKyspIHsKKwkJd204MzF4LT5pcnFfbWFza3NfY3VyW2ldID0gMHhmZmZmOworCQl3bTgzMXgtPmlycV9tYXNrc19jYWNoZVtpXSA9IDB4ZmZmZjsKIAkJd204MzF4X3JlZ193cml0ZSh3bTgzMXgsIFdNODMxWF9JTlRFUlJVUFRfU1RBVFVTXzFfTUFTSyArIGksCiAJCQkJIDB4ZmZmZik7CiAJfQogCi0JLyogRW5hYmxlIHRvcCBsZXZlbCBpbnRlcnJ1cHRzLCB3ZSBtYXNrIGF0IHNlY29uZGFyeSBsZXZlbCAqLwotCXdtODMxeF9yZWdfd3JpdGUod204MzF4LCBXTTgzMVhfU1lTVEVNX0lOVEVSUlVQVFNfTUFTSywgMCk7CisJLyogUmVnaXN0ZXIgdGhlbSB3aXRoIGdlbmlycSAqLworCWZvciAoY3VyX2lycSA9IHdtODMxeC0+aXJxX2Jhc2U7CisJICAgICBjdXJfaXJxIDwgQVJSQVlfU0laRSh3bTgzMXhfaXJxcykgKyB3bTgzMXgtPmlycV9iYXNlOworCSAgICAgY3VyX2lycSsrKSB7CisJCXNldF9pcnFfY2hpcF9kYXRhKGN1cl9pcnEsIHdtODMxeCk7CisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihjdXJfaXJxLCAmd204MzF4X2lycV9jaGlwLAorCQkJCQkgaGFuZGxlX2VkZ2VfaXJxKTsKKwkJc2V0X2lycV9uZXN0ZWRfdGhyZWFkKGN1cl9pcnEsIDEpOwogCi0JLyogV2UncmUgZ29vZCB0byBnby4gIFdlIHNldCBJUlFGX1NIQVJFRCBzaW5jZSB0aGVyZSdzIGEKLQkgKiBjaGFuY2UgdGhlIGRyaXZlciB3aWxsIGludGVyb3BlcmF0ZSB3aXRoIGFub3RoZXIgZHJpdmVyIGJ1dAotCSAqIHRoZSBuZWVkIHRvIGRpc2FibGUgdGhlIElSUSB3aGlsZSBoYW5kaW5nIHZpYSBJMkMvU1BJIG1lYW5zCi0JICogdGhhdCB0aGlzIG1heSBicmVhayBhbmQgcGVyZm9ybWFuY2Ugd2lsbCBiZSBpbXBhY3RlZC4gIElmCi0JICogdGhpcyBkb2VzIGhhcHBlbiBpdCdzIGEgaGFyZHdhcmUgZGVzaWduIGlzc3VlIGFuZCB0aGUgb25seQotCSAqIG90aGVyIGFsdGVybmF0aXZlIHdvdWxkIGJlIHBvbGxpbmcuCi0JICovCi0JcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCB3bTgzMXhfY3B1X2lycSwgSVJRRl9UUklHR0VSX0xPVyB8IElSUUZfU0hBUkVELAotCQkJICAid204MzF4Iiwgd204MzF4KTsKKwkJLyogQVJNIG5lZWRzIHVzIHRvIGV4cGxpY2l0bHkgZmxhZyB0aGUgSVJRIGFzIHZhbGlkCisJCSAqIGFuZCB3aWxsIHNldCB0aGVtIG5vcHJvYmUgd2hlbiB3ZSBkbyBzby4gKi8KKyNpZmRlZiBDT05GSUdfQVJNCisJCXNldF9pcnFfZmxhZ3MoY3VyX2lycSwgSVJRRl9WQUxJRCk7CisjZWxzZQorCQlzZXRfaXJxX25vcHJvYmUoY3VyX2lycSk7CisjZW5kaWYKKwl9CisKKwlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShpcnEsIE5VTEwsIHdtODMxeF9pcnFfdGhyZWFkLAorCQkJCSAgIElSUUZfVFJJR0dFUl9MT1cgfCBJUlFGX09ORVNIT1QsCisJCQkJICAgIndtODMxeCIsIHdtODMxeCk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCWRldl9lcnIod204MzF4LT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBJUlEgJWQ6ICVkXG4iLAogCQkJaXJxLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAorCS8qIEVuYWJsZSB0b3AgbGV2ZWwgaW50ZXJydXB0cywgd2UgbWFzayBhdCBzZWNvbmRhcnkgbGV2ZWwgKi8KKwl3bTgzMXhfcmVnX3dyaXRlKHdtODMxeCwgV004MzFYX1NZU1RFTV9JTlRFUlJVUFRTX01BU0ssIDApOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3dtODM1MC1jb3JlLmMgYi9kcml2ZXJzL21mZC93bTgzNTAtY29yZS5jCmluZGV4IGJhMjdjOWQuLjg0ODVhNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3dtODM1MC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvd204MzUwLWNvcmUuYwpAQCAtMzM3LDczMyArMzM3LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHdtODM1MF9yZWdfdW5sb2NrKTsKIAotc3RhdGljIHZvaWQgd204MzUwX2lycV9jYWxsX2hhbmRsZXIoc3RydWN0IHdtODM1MCAqd204MzUwLCBpbnQgaXJxKQotewotCW11dGV4X2xvY2soJndtODM1MC0+aXJxX211dGV4KTsKLQotCWlmICh3bTgzNTAtPmlycVtpcnFdLmhhbmRsZXIpCi0JCXdtODM1MC0+aXJxW2lycV0uaGFuZGxlcih3bTgzNTAsIGlycSwgd204MzUwLT5pcnFbaXJxXS5kYXRhKTsKLQllbHNlIHsKLQkJZGV2X2Vycih3bTgzNTAtPmRldiwgImlycSAlZCBub2JvZHkgY2FyZWQuIG5vdyBtYXNrZWQuXG4iLAotCQkJaXJxKTsKLQkJd204MzUwX21hc2tfaXJxKHdtODM1MCwgaXJxKTsKLQl9Ci0KLQltdXRleF91bmxvY2soJndtODM1MC0+aXJxX211dGV4KTsKLX0KLQotLyoKLSAqIFRoaXMgaXMgYSB0aHJlYWRlZCBJUlEgaGFuZGxlciBzbyBjYW4gYWNjZXNzIEkyQy9TUEkuICBTaW5jZSBhbGwKLSAqIGludGVycnVwdHMgYXJlIGNsZWFyIG9uIHJlYWQgdGhlIElSUSBsaW5lIHdpbGwgYmUgcmVhc3NlcnRlZCBhbmQKLSAqIHRoZSBwaHlzaWNhbCBJUlEgd2lsbCBiZSBoYW5kbGVkIGFnYWluIGlmIGFub3RoZXIgaW50ZXJydXB0IGlzCi0gKiBhc3NlcnRlZCB3aGlsZSB3ZSBydW4gLSBpbiB0aGUgbm9ybWFsIGNvdXJzZSBvZiBldmVudHMgdGhpcyBpcyBhCi0gKiByYXJlIG9jY3VycmVuY2Ugc28gd2Ugc2F2ZSBJMkMvU1BJIHJlYWRzLgotICovCi1zdGF0aWMgaXJxcmV0dXJuX3Qgd204MzUwX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IGRhdGE7Ci0JdTE2IGxldmVsX29uZSwgc3RhdHVzMSwgc3RhdHVzMiwgY29tcDsKLQotCS8qIFRPRE86IFVzZSBibG9jayByZWFkcyB0byBpbXByb3ZlIHBlcmZvcm1hbmNlPyAqLwotCWxldmVsX29uZSA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIFdNODM1MF9TWVNURU1fSU5URVJSVVBUUykKLQkJJiB+d204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX1NZU1RFTV9JTlRFUlJVUFRTX01BU0spOwotCXN0YXR1czEgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18xKQotCQkmIH53bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18xX01BU0spOwotCXN0YXR1czIgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18yKQotCQkmIH53bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18yX01BU0spOwotCWNvbXAgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfQ09NUEFSQVRPUl9JTlRfU1RBVFVTKQotCQkmIH53bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfQ09NUEFSQVRPUl9JTlRfU1RBVFVTX01BU0spOwotCi0JLyogb3ZlciBjdXJyZW50ICovCi0JaWYgKGxldmVsX29uZSAmIFdNODM1MF9PQ19JTlQpIHsKLQkJdTE2IG9jOwotCi0JCW9jID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX09WRVJfQ1VSUkVOVF9JTlRfU1RBVFVTKTsKLQkJb2MgJj0gfndtODM1MF9yZWdfcmVhZCh3bTgzNTAsCi0JCQkJICAgICAgIFdNODM1MF9PVkVSX0NVUlJFTlRfSU5UX1NUQVRVU19NQVNLKTsKLQotCQlpZiAob2MgJiBXTTgzNTBfT0NfTFNfRUlOVCkJLyogbGltaXQgc3dpdGNoICovCi0JCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsIFdNODM1MF9JUlFfT0NfTFMpOwotCX0KLQotCS8qIHVuZGVyIHZvbHRhZ2UgKi8KLQlpZiAobGV2ZWxfb25lICYgV004MzUwX1VWX0lOVCkgewotCQl1MTYgdXY7Ci0KLQkJdXYgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfVU5ERVJfVk9MVEFHRV9JTlRfU1RBVFVTKTsKLQkJdXYgJj0gfndtODM1MF9yZWdfcmVhZCh3bTgzNTAsCi0JCQkJICAgICAgIFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9TVEFUVVNfTUFTSyk7Ci0KLQkJaWYgKHV2ICYgV004MzUwX1VWX0RDMV9FSU5UKQotCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLCBXTTgzNTBfSVJRX1VWX0RDMSk7Ci0JCWlmICh1diAmIFdNODM1MF9VVl9EQzJfRUlOVCkKLQkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwgV004MzUwX0lSUV9VVl9EQzIpOwotCQlpZiAodXYgJiBXTTgzNTBfVVZfREMzX0VJTlQpCi0JCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsIFdNODM1MF9JUlFfVVZfREMzKTsKLQkJaWYgKHV2ICYgV004MzUwX1VWX0RDNF9FSU5UKQotCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLCBXTTgzNTBfSVJRX1VWX0RDNCk7Ci0JCWlmICh1diAmIFdNODM1MF9VVl9EQzVfRUlOVCkKLQkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwgV004MzUwX0lSUV9VVl9EQzUpOwotCQlpZiAodXYgJiBXTTgzNTBfVVZfREM2X0VJTlQpCi0JCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsIFdNODM1MF9JUlFfVVZfREM2KTsKLQkJaWYgKHV2ICYgV004MzUwX1VWX0xETzFfRUlOVCkKLQkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwgV004MzUwX0lSUV9VVl9MRE8xKTsKLQkJaWYgKHV2ICYgV004MzUwX1VWX0xETzJfRUlOVCkKLQkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwgV004MzUwX0lSUV9VVl9MRE8yKTsKLQkJaWYgKHV2ICYgV004MzUwX1VWX0xETzNfRUlOVCkKLQkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwgV004MzUwX0lSUV9VVl9MRE8zKTsKLQkJaWYgKHV2ICYgV004MzUwX1VWX0xETzRfRUlOVCkKLQkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwgV004MzUwX0lSUV9VVl9MRE80KTsKLQl9Ci0KLQkvKiBjaGFyZ2VyLCBSVEMgKi8KLQlpZiAoc3RhdHVzMSkgewotCQlpZiAoc3RhdHVzMSAmIFdNODM1MF9DSEdfQkFUX0hPVF9FSU5UKQotCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLAotCQkJCQkJV004MzUwX0lSUV9DSEdfQkFUX0hPVCk7Ci0JCWlmIChzdGF0dXMxICYgV004MzUwX0NIR19CQVRfQ09MRF9FSU5UKQotCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLAotCQkJCQkJV004MzUwX0lSUV9DSEdfQkFUX0NPTEQpOwotCQlpZiAoc3RhdHVzMSAmIFdNODM1MF9DSEdfQkFUX0ZBSUxfRUlOVCkKLQkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwKLQkJCQkJCVdNODM1MF9JUlFfQ0hHX0JBVF9GQUlMKTsKLQkJaWYgKHN0YXR1czEgJiBXTTgzNTBfQ0hHX1RPX0VJTlQpCi0JCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX1RPKTsKLQkJaWYgKHN0YXR1czEgJiBXTTgzNTBfQ0hHX0VORF9FSU5UKQotCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLCBXTTgzNTBfSVJRX0NIR19FTkQpOwotCQlpZiAoc3RhdHVzMSAmIFdNODM1MF9DSEdfU1RBUlRfRUlOVCkKLQkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwgV004MzUwX0lSUV9DSEdfU1RBUlQpOwotCQlpZiAoc3RhdHVzMSAmIFdNODM1MF9DSEdfRkFTVF9SRFlfRUlOVCkKLQkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwKLQkJCQkJCVdNODM1MF9JUlFfQ0hHX0ZBU1RfUkRZKTsKLQkJaWYgKHN0YXR1czEgJiBXTTgzNTBfQ0hHX1ZCQVRUX0xUXzNQOV9FSU5UKQotCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLAotCQkJCQkJV004MzUwX0lSUV9DSEdfVkJBVFRfTFRfM1A5KTsKLQkJaWYgKHN0YXR1czEgJiBXTTgzNTBfQ0hHX1ZCQVRUX0xUXzNQMV9FSU5UKQotCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLAotCQkJCQkJV004MzUwX0lSUV9DSEdfVkJBVFRfTFRfM1AxKTsKLQkJaWYgKHN0YXR1czEgJiBXTTgzNTBfQ0hHX1ZCQVRUX0xUXzJQODVfRUlOVCkKLQkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwKLQkJCQkJCVdNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzJQODUpOwotCQlpZiAoc3RhdHVzMSAmIFdNODM1MF9SVENfQUxNX0VJTlQpCi0JCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsIFdNODM1MF9JUlFfUlRDX0FMTSk7Ci0JCWlmIChzdGF0dXMxICYgV004MzUwX1JUQ19TRUNfRUlOVCkKLQkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwgV004MzUwX0lSUV9SVENfU0VDKTsKLQkJaWYgKHN0YXR1czEgJiBXTTgzNTBfUlRDX1BFUl9FSU5UKQotCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLCBXTTgzNTBfSVJRX1JUQ19QRVIpOwotCX0KLQotCS8qIGN1cnJlbnQgc2luaywgc3lzdGVtLCBhdXggYWRjICovCi0JaWYgKHN0YXR1czIpIHsKLQkJaWYgKHN0YXR1czIgJiBXTTgzNTBfQ1MxX0VJTlQpCi0JCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsIFdNODM1MF9JUlFfQ1MxKTsKLQkJaWYgKHN0YXR1czIgJiBXTTgzNTBfQ1MyX0VJTlQpCi0JCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsIFdNODM1MF9JUlFfQ1MyKTsKLQotCQlpZiAoc3RhdHVzMiAmIFdNODM1MF9TWVNfSFlTVF9DT01QX0ZBSUxfRUlOVCkKLQkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwKLQkJCQkJCVdNODM1MF9JUlFfU1lTX0hZU1RfQ09NUF9GQUlMKTsKLQkJaWYgKHN0YXR1czIgJiBXTTgzNTBfU1lTX0NISVBfR1QxMTVfRUlOVCkKLQkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwKLQkJCQkJCVdNODM1MF9JUlFfU1lTX0NISVBfR1QxMTUpOwotCQlpZiAoc3RhdHVzMiAmIFdNODM1MF9TWVNfQ0hJUF9HVDE0MF9FSU5UKQotCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLAotCQkJCQkJV004MzUwX0lSUV9TWVNfQ0hJUF9HVDE0MCk7Ci0JCWlmIChzdGF0dXMyICYgV004MzUwX1NZU19XRE9HX1RPX0VJTlQpCi0JCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsCi0JCQkJCQlXTTgzNTBfSVJRX1NZU19XRE9HX1RPKTsKLQotCQlpZiAoc3RhdHVzMiAmIFdNODM1MF9BVVhBRENfREFUQVJEWV9FSU5UKQotCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLAotCQkJCQkJV004MzUwX0lSUV9BVVhBRENfREFUQVJEWSk7Ci0JCWlmIChzdGF0dXMyICYgV004MzUwX0FVWEFEQ19EQ09NUDRfRUlOVCkKLQkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwKLQkJCQkJCVdNODM1MF9JUlFfQVVYQURDX0RDT01QNCk7Ci0JCWlmIChzdGF0dXMyICYgV004MzUwX0FVWEFEQ19EQ09NUDNfRUlOVCkKLQkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwKLQkJCQkJCVdNODM1MF9JUlFfQVVYQURDX0RDT01QMyk7Ci0JCWlmIChzdGF0dXMyICYgV004MzUwX0FVWEFEQ19EQ09NUDJfRUlOVCkKLQkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwKLQkJCQkJCVdNODM1MF9JUlFfQVVYQURDX0RDT01QMik7Ci0JCWlmIChzdGF0dXMyICYgV004MzUwX0FVWEFEQ19EQ09NUDFfRUlOVCkKLQkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwKLQkJCQkJCVdNODM1MF9JUlFfQVVYQURDX0RDT01QMSk7Ci0KLQkJaWYgKHN0YXR1czIgJiBXTTgzNTBfVVNCX0xJTUlUX0VJTlQpCi0JCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsIFdNODM1MF9JUlFfVVNCX0xJTUlUKTsKLQl9Ci0KLQkvKiB3YWtlLCBjb2RlYywgZXh0ICovCi0JaWYgKGNvbXApIHsKLQkJaWYgKGNvbXAgJiBXTTgzNTBfV0tVUF9PRkZfU1RBVEVfRUlOVCkKLQkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwKLQkJCQkJCVdNODM1MF9JUlFfV0tVUF9PRkZfU1RBVEUpOwotCQlpZiAoY29tcCAmIFdNODM1MF9XS1VQX0hJQl9TVEFURV9FSU5UKQotCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLAotCQkJCQkJV004MzUwX0lSUV9XS1VQX0hJQl9TVEFURSk7Ci0JCWlmIChjb21wICYgV004MzUwX1dLVVBfQ09OVl9GQVVMVF9FSU5UKQotCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLAotCQkJCQkJV004MzUwX0lSUV9XS1VQX0NPTlZfRkFVTFQpOwotCQlpZiAoY29tcCAmIFdNODM1MF9XS1VQX1dET0dfUlNUX0VJTlQpCi0JCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsCi0JCQkJCQlXTTgzNTBfSVJRX1dLVVBfV0RPR19SU1QpOwotCQlpZiAoY29tcCAmIFdNODM1MF9XS1VQX0dQX1BXUl9PTl9FSU5UKQotCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLAotCQkJCQkJV004MzUwX0lSUV9XS1VQX0dQX1BXUl9PTik7Ci0JCWlmIChjb21wICYgV004MzUwX1dLVVBfT05LRVlfRUlOVCkKLQkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwgV004MzUwX0lSUV9XS1VQX09OS0VZKTsKLQkJaWYgKGNvbXAgJiBXTTgzNTBfV0tVUF9HUF9XQUtFVVBfRUlOVCkKLQkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwKLQkJCQkJCVdNODM1MF9JUlFfV0tVUF9HUF9XQUtFVVApOwotCi0JCWlmIChjb21wICYgV004MzUwX0NPREVDX0pDS19ERVRfTF9FSU5UKQotCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLAotCQkJCQkJV004MzUwX0lSUV9DT0RFQ19KQ0tfREVUX0wpOwotCQlpZiAoY29tcCAmIFdNODM1MF9DT0RFQ19KQ0tfREVUX1JfRUlOVCkKLQkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwKLQkJCQkJCVdNODM1MF9JUlFfQ09ERUNfSkNLX0RFVF9SKTsKLQkJaWYgKGNvbXAgJiBXTTgzNTBfQ09ERUNfTUlDU0NEX0VJTlQpCi0JCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsCi0JCQkJCQlXTTgzNTBfSVJRX0NPREVDX01JQ1NDRCk7Ci0JCWlmIChjb21wICYgV004MzUwX0NPREVDX01JQ0RfRUlOVCkKLQkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwgV004MzUwX0lSUV9DT0RFQ19NSUNEKTsKLQotCQlpZiAoY29tcCAmIFdNODM1MF9FWFRfVVNCX0ZCX0VJTlQpCi0JCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsIFdNODM1MF9JUlFfRVhUX1VTQl9GQik7Ci0JCWlmIChjb21wICYgV004MzUwX0VYVF9XQUxMX0ZCX0VJTlQpCi0JCQl3bTgzNTBfaXJxX2NhbGxfaGFuZGxlcih3bTgzNTAsCi0JCQkJCQlXTTgzNTBfSVJRX0VYVF9XQUxMX0ZCKTsKLQkJaWYgKGNvbXAgJiBXTTgzNTBfRVhUX0JBVF9GQl9FSU5UKQotCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLCBXTTgzNTBfSVJRX0VYVF9CQVRfRkIpOwotCX0KLQotCWlmIChsZXZlbF9vbmUgJiBXTTgzNTBfR1BfSU5UKSB7Ci0JCWludCBpOwotCQl1MTYgZ3BpbzsKLQotCQlncGlvID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0dQSU9fSU5UX1NUQVRVUyk7Ci0JCWdwaW8gJj0gfndtODM1MF9yZWdfcmVhZCh3bTgzNTAsCi0JCQkJCSBXTTgzNTBfR1BJT19JTlRfU1RBVFVTX01BU0spOwotCi0JCWZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7Ci0JCQlpZiAoZ3BpbyAmICgxIDw8IGkpKQotCQkJCXdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHdtODM1MCwKLQkJCQkJCQlXTTgzNTBfSVJRX0dQSU8oaSkpOwotCQl9Ci0JfQotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1pbnQgd204MzUwX3JlZ2lzdGVyX2lycShzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBpcnEsCi0JCQl2b2lkICgqaGFuZGxlcikgKHN0cnVjdCB3bTgzNTAgKiwgaW50LCB2b2lkICopLAotCQkJdm9pZCAqZGF0YSkKLXsKLQlpZiAoaXJxIDwgMCB8fCBpcnEgPiBXTTgzNTBfTlVNX0lSUSB8fCAhaGFuZGxlcikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAod204MzUwLT5pcnFbaXJxXS5oYW5kbGVyKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JbXV0ZXhfbG9jaygmd204MzUwLT5pcnFfbXV0ZXgpOwotCXdtODM1MC0+aXJxW2lycV0uaGFuZGxlciA9IGhhbmRsZXI7Ci0Jd204MzUwLT5pcnFbaXJxXS5kYXRhID0gZGF0YTsKLQltdXRleF91bmxvY2soJndtODM1MC0+aXJxX211dGV4KTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwod204MzUwX3JlZ2lzdGVyX2lycSk7Ci0KLWludCB3bTgzNTBfZnJlZV9pcnEoc3RydWN0IHdtODM1MCAqd204MzUwLCBpbnQgaXJxKQotewotCWlmIChpcnEgPCAwIHx8IGlycSA+IFdNODM1MF9OVU1fSVJRKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJndtODM1MC0+aXJxX211dGV4KTsKLQl3bTgzNTAtPmlycVtpcnFdLmhhbmRsZXIgPSBOVUxMOwotCW11dGV4X3VubG9jaygmd204MzUwLT5pcnFfbXV0ZXgpOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwod204MzUwX2ZyZWVfaXJxKTsKLQotaW50IHdtODM1MF9tYXNrX2lycShzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBpcnEpCi17Ci0Jc3dpdGNoIChpcnEpIHsKLQljYXNlIFdNODM1MF9JUlFfQ0hHX0JBVF9IT1Q6Ci0JCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18xX01BU0ssCi0JCQkJICAgICAgIFdNODM1MF9JTV9DSEdfQkFUX0hPVF9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfQ0hHX0JBVF9DT0xEOgotCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMV9NQVNLLAotCQkJCSAgICAgICBXTTgzNTBfSU1fQ0hHX0JBVF9DT0xEX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9DSEdfQkFUX0ZBSUw6Ci0JCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18xX01BU0ssCi0JCQkJICAgICAgIFdNODM1MF9JTV9DSEdfQkFUX0ZBSUxfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX0NIR19UTzoKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzFfTUFTSywKLQkJCQkgICAgICAgV004MzUwX0lNX0NIR19UT19FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfQ0hHX0VORDoKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzFfTUFTSywKLQkJCQkgICAgICAgV004MzUwX0lNX0NIR19FTkRfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX0NIR19TVEFSVDoKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzFfTUFTSywKLQkJCQkgICAgICAgV004MzUwX0lNX0NIR19TVEFSVF9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfQ0hHX0ZBU1RfUkRZOgotCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMV9NQVNLLAotCQkJCSAgICAgICBXTTgzNTBfSU1fQ0hHX0ZBU1RfUkRZX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9SVENfUEVSOgotCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMV9NQVNLLAotCQkJCSAgICAgICBXTTgzNTBfSU1fUlRDX1BFUl9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfUlRDX1NFQzoKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzFfTUFTSywKLQkJCQkgICAgICAgV004MzUwX0lNX1JUQ19TRUNfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX1JUQ19BTE06Ci0JCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18xX01BU0ssCi0JCQkJICAgICAgIFdNODM1MF9JTV9SVENfQUxNX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9DSEdfVkJBVFRfTFRfM1A5OgotCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMV9NQVNLLAotCQkJCSAgICAgICBXTTgzNTBfSU1fQ0hHX1ZCQVRUX0xUXzNQOV9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzNQMToKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzFfTUFTSywKLQkJCQkgICAgICAgV004MzUwX0lNX0NIR19WQkFUVF9MVF8zUDFfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX0NIR19WQkFUVF9MVF8yUDg1OgotCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMV9NQVNLLAotCQkJCSAgICAgICBXTTgzNTBfSU1fQ0hHX1ZCQVRUX0xUXzJQODVfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX0NTMToKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzJfTUFTSywKLQkJCQkgICAgICAgV004MzUwX0lNX0NTMV9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfQ1MyOgotCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMl9NQVNLLAotCQkJCSAgICAgICBXTTgzNTBfSU1fQ1MyX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9VU0JfTElNSVQ6Ci0JCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18yX01BU0ssCi0JCQkJICAgICAgIFdNODM1MF9JTV9VU0JfTElNSVRfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX0FVWEFEQ19EQVRBUkRZOgotCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMl9NQVNLLAotCQkJCSAgICAgICBXTTgzNTBfSU1fQVVYQURDX0RBVEFSRFlfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX0FVWEFEQ19EQ09NUDQ6Ci0JCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18yX01BU0ssCi0JCQkJICAgICAgIFdNODM1MF9JTV9BVVhBRENfRENPTVA0X0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9BVVhBRENfRENPTVAzOgotCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMl9NQVNLLAotCQkJCSAgICAgICBXTTgzNTBfSU1fQVVYQURDX0RDT01QM19FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfQVVYQURDX0RDT01QMjoKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzJfTUFTSywKLQkJCQkgICAgICAgV004MzUwX0lNX0FVWEFEQ19EQ09NUDJfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX0FVWEFEQ19EQ09NUDE6Ci0JCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18yX01BU0ssCi0JCQkJICAgICAgIFdNODM1MF9JTV9BVVhBRENfRENPTVAxX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9TWVNfSFlTVF9DT01QX0ZBSUw6Ci0JCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18yX01BU0ssCi0JCQkJICAgICAgIFdNODM1MF9JTV9TWVNfSFlTVF9DT01QX0ZBSUxfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX1NZU19DSElQX0dUMTE1OgotCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMl9NQVNLLAotCQkJCSAgICAgICBXTTgzNTBfSU1fU1lTX0NISVBfR1QxMTVfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX1NZU19DSElQX0dUMTQwOgotCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMl9NQVNLLAotCQkJCSAgICAgICBXTTgzNTBfSU1fU1lTX0NISVBfR1QxNDBfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX1NZU19XRE9HX1RPOgotCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMl9NQVNLLAotCQkJCSAgICAgICBXTTgzNTBfSU1fU1lTX1dET0dfVE9fRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX1VWX0xETzQ6Ci0JCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLAotCQkJCSAgICAgICBXTTgzNTBfVU5ERVJfVk9MVEFHRV9JTlRfU1RBVFVTX01BU0ssCi0JCQkJICAgICAgIFdNODM1MF9JTV9VVl9MRE80X0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9VVl9MRE8zOgotCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwKLQkJCQkgICAgICAgV004MzUwX1VOREVSX1ZPTFRBR0VfSU5UX1NUQVRVU19NQVNLLAotCQkJCSAgICAgICBXTTgzNTBfSU1fVVZfTERPM19FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfVVZfTERPMjoKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCi0JCQkJICAgICAgIFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkgICAgICAgV004MzUwX0lNX1VWX0xETzJfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX1VWX0xETzE6Ci0JCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLAotCQkJCSAgICAgICBXTTgzNTBfVU5ERVJfVk9MVEFHRV9JTlRfU1RBVFVTX01BU0ssCi0JCQkJICAgICAgIFdNODM1MF9JTV9VVl9MRE8xX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9VVl9EQzY6Ci0JCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLAotCQkJCSAgICAgICBXTTgzNTBfVU5ERVJfVk9MVEFHRV9JTlRfU1RBVFVTX01BU0ssCi0JCQkJICAgICAgIFdNODM1MF9JTV9VVl9EQzZfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX1VWX0RDNToKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCi0JCQkJICAgICAgIFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkgICAgICAgV004MzUwX0lNX1VWX0RDNV9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfVVZfREM0OgotCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwKLQkJCQkgICAgICAgV004MzUwX1VOREVSX1ZPTFRBR0VfSU5UX1NUQVRVU19NQVNLLAotCQkJCSAgICAgICBXTTgzNTBfSU1fVVZfREM0X0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9VVl9EQzM6Ci0JCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLAotCQkJCSAgICAgICBXTTgzNTBfVU5ERVJfVk9MVEFHRV9JTlRfU1RBVFVTX01BU0ssCi0JCQkJICAgICAgIFdNODM1MF9JTV9VVl9EQzNfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX1VWX0RDMjoKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCi0JCQkJICAgICAgIFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkgICAgICAgV004MzUwX0lNX1VWX0RDMl9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfVVZfREMxOgotCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwKLQkJCQkgICAgICAgV004MzUwX1VOREVSX1ZPTFRBR0VfSU5UX1NUQVRVU19NQVNLLAotCQkJCSAgICAgICBXTTgzNTBfSU1fVVZfREMxX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9PQ19MUzoKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCi0JCQkJICAgICAgIFdNODM1MF9PVkVSX0NVUlJFTlRfSU5UX1NUQVRVU19NQVNLLAotCQkJCSAgICAgICBXTTgzNTBfSU1fT0NfTFNfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX0VYVF9VU0JfRkI6Ci0JCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLAotCQkJCSAgICAgICBXTTgzNTBfQ09NUEFSQVRPUl9JTlRfU1RBVFVTX01BU0ssCi0JCQkJICAgICAgIFdNODM1MF9JTV9FWFRfVVNCX0ZCX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9FWFRfV0FMTF9GQjoKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCi0JCQkJICAgICAgIFdNODM1MF9DT01QQVJBVE9SX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkgICAgICAgV004MzUwX0lNX0VYVF9XQUxMX0ZCX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9FWFRfQkFUX0ZCOgotCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwKLQkJCQkgICAgICAgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVU19NQVNLLAotCQkJCSAgICAgICBXTTgzNTBfSU1fRVhUX0JBVF9GQl9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfQ09ERUNfSkNLX0RFVF9MOgotCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwKLQkJCQkgICAgICAgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVU19NQVNLLAotCQkJCSAgICAgICBXTTgzNTBfSU1fQ09ERUNfSkNLX0RFVF9MX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9DT0RFQ19KQ0tfREVUX1I6Ci0JCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLAotCQkJCSAgICAgICBXTTgzNTBfQ09NUEFSQVRPUl9JTlRfU1RBVFVTX01BU0ssCi0JCQkJICAgICAgIFdNODM1MF9JTV9DT0RFQ19KQ0tfREVUX1JfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX0NPREVDX01JQ1NDRDoKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCi0JCQkJICAgICAgIFdNODM1MF9DT01QQVJBVE9SX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkgICAgICAgV004MzUwX0lNX0NPREVDX01JQ1NDRF9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfQ09ERUNfTUlDRDoKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCi0JCQkJICAgICAgIFdNODM1MF9DT01QQVJBVE9SX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkgICAgICAgV004MzUwX0lNX0NPREVDX01JQ0RfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX1dLVVBfT0ZGX1NUQVRFOgotCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwKLQkJCQkgICAgICAgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVU19NQVNLLAotCQkJCSAgICAgICBXTTgzNTBfSU1fV0tVUF9PRkZfU1RBVEVfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX1dLVVBfSElCX1NUQVRFOgotCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwKLQkJCQkgICAgICAgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVU19NQVNLLAotCQkJCSAgICAgICBXTTgzNTBfSU1fV0tVUF9ISUJfU1RBVEVfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX1dLVVBfQ09OVl9GQVVMVDoKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCi0JCQkJICAgICAgIFdNODM1MF9DT01QQVJBVE9SX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkgICAgICAgV004MzUwX0lNX1dLVVBfQ09OVl9GQVVMVF9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfV0tVUF9XRE9HX1JTVDoKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCi0JCQkJICAgICAgIFdNODM1MF9DT01QQVJBVE9SX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkgICAgICAgV004MzUwX0lNX1dLVVBfT0ZGX1NUQVRFX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9XS1VQX0dQX1BXUl9PTjoKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCi0JCQkJICAgICAgIFdNODM1MF9DT01QQVJBVE9SX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkgICAgICAgV004MzUwX0lNX1dLVVBfR1BfUFdSX09OX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9XS1VQX09OS0VZOgotCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwKLQkJCQkgICAgICAgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVU19NQVNLLAotCQkJCSAgICAgICBXTTgzNTBfSU1fV0tVUF9PTktFWV9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfV0tVUF9HUF9XQUtFVVA6Ci0JCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLAotCQkJCSAgICAgICBXTTgzNTBfQ09NUEFSQVRPUl9JTlRfU1RBVFVTX01BU0ssCi0JCQkJICAgICAgIFdNODM1MF9JTV9XS1VQX0dQX1dBS0VVUF9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfR1BJTygwKToKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCi0JCQkJICAgICAgIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkgICAgICAgV004MzUwX0lNX0dQMF9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfR1BJTygxKToKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCi0JCQkJICAgICAgIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkgICAgICAgV004MzUwX0lNX0dQMV9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfR1BJTygyKToKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCi0JCQkJICAgICAgIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkgICAgICAgV004MzUwX0lNX0dQMl9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfR1BJTygzKToKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCi0JCQkJICAgICAgIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkgICAgICAgV004MzUwX0lNX0dQM19FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfR1BJTyg0KToKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCi0JCQkJICAgICAgIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkgICAgICAgV004MzUwX0lNX0dQNF9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfR1BJTyg1KToKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCi0JCQkJICAgICAgIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkgICAgICAgV004MzUwX0lNX0dQNV9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfR1BJTyg2KToKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCi0JCQkJICAgICAgIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkgICAgICAgV004MzUwX0lNX0dQNl9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfR1BJTyg3KToKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCi0JCQkJICAgICAgIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkgICAgICAgV004MzUwX0lNX0dQN19FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfR1BJTyg4KToKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCi0JCQkJICAgICAgIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkgICAgICAgV004MzUwX0lNX0dQOF9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfR1BJTyg5KToKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCi0JCQkJICAgICAgIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkgICAgICAgV004MzUwX0lNX0dQOV9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfR1BJTygxMCk6Ci0JCXJldHVybiB3bTgzNTBfc2V0X2JpdHMod204MzUwLAotCQkJCSAgICAgICBXTTgzNTBfR1BJT19JTlRfU1RBVFVTX01BU0ssCi0JCQkJICAgICAgIFdNODM1MF9JTV9HUDEwX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9HUElPKDExKToKLQkJcmV0dXJuIHdtODM1MF9zZXRfYml0cyh3bTgzNTAsCi0JCQkJICAgICAgIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkgICAgICAgV004MzUwX0lNX0dQMTFfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX0dQSU8oMTIpOgotCQlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwKLQkJCQkgICAgICAgV004MzUwX0dQSU9fSU5UX1NUQVRVU19NQVNLLAotCQkJCSAgICAgICBXTTgzNTBfSU1fR1AxMl9FSU5UKTsKLQlkZWZhdWx0OgotCQlkZXZfd2Fybih3bTgzNTAtPmRldiwgIkF0dGVtcHRpbmcgdG8gbWFzayB1bmtub3duIElSUSAlZFxuIiwKLQkJCSBpcnEpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh3bTgzNTBfbWFza19pcnEpOwotCi1pbnQgd204MzUwX3VubWFza19pcnEoc3RydWN0IHdtODM1MCAqd204MzUwLCBpbnQgaXJxKQotewotCXN3aXRjaCAoaXJxKSB7Ci0JY2FzZSBXTTgzNTBfSVJRX0NIR19CQVRfSE9UOgotCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18xX01BU0ssCi0JCQkJCSBXTTgzNTBfSU1fQ0hHX0JBVF9IT1RfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX0NIR19CQVRfQ09MRDoKLQkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMV9NQVNLLAotCQkJCQkgV004MzUwX0lNX0NIR19CQVRfQ09MRF9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfQ0hHX0JBVF9GQUlMOgotCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18xX01BU0ssCi0JCQkJCSBXTTgzNTBfSU1fQ0hHX0JBVF9GQUlMX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9DSEdfVE86Ci0JCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzFfTUFTSywKLQkJCQkJIFdNODM1MF9JTV9DSEdfVE9fRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX0NIR19FTkQ6Ci0JCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzFfTUFTSywKLQkJCQkJIFdNODM1MF9JTV9DSEdfRU5EX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9DSEdfU1RBUlQ6Ci0JCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzFfTUFTSywKLQkJCQkJIFdNODM1MF9JTV9DSEdfU1RBUlRfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX0NIR19GQVNUX1JEWToKLQkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMV9NQVNLLAotCQkJCQkgV004MzUwX0lNX0NIR19GQVNUX1JEWV9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfUlRDX1BFUjoKLQkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMV9NQVNLLAotCQkJCQkgV004MzUwX0lNX1JUQ19QRVJfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX1JUQ19TRUM6Ci0JCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzFfTUFTSywKLQkJCQkJIFdNODM1MF9JTV9SVENfU0VDX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9SVENfQUxNOgotCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18xX01BU0ssCi0JCQkJCSBXTTgzNTBfSU1fUlRDX0FMTV9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzNQOToKLQkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMV9NQVNLLAotCQkJCQkgV004MzUwX0lNX0NIR19WQkFUVF9MVF8zUDlfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX0NIR19WQkFUVF9MVF8zUDE6Ci0JCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzFfTUFTSywKLQkJCQkJIFdNODM1MF9JTV9DSEdfVkJBVFRfTFRfM1AxX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9DSEdfVkJBVFRfTFRfMlA4NToKLQkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMV9NQVNLLAotCQkJCQkgV004MzUwX0lNX0NIR19WQkFUVF9MVF8yUDg1X0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9DUzE6Ci0JCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzJfTUFTSywKLQkJCQkJIFdNODM1MF9JTV9DUzFfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX0NTMjoKLQkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMl9NQVNLLAotCQkJCQkgV004MzUwX0lNX0NTMl9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfVVNCX0xJTUlUOgotCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18yX01BU0ssCi0JCQkJCSBXTTgzNTBfSU1fVVNCX0xJTUlUX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9BVVhBRENfREFUQVJEWToKLQkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMl9NQVNLLAotCQkJCQkgV004MzUwX0lNX0FVWEFEQ19EQVRBUkRZX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9BVVhBRENfRENPTVA0OgotCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18yX01BU0ssCi0JCQkJCSBXTTgzNTBfSU1fQVVYQURDX0RDT01QNF9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfQVVYQURDX0RDT01QMzoKLQkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMl9NQVNLLAotCQkJCQkgV004MzUwX0lNX0FVWEFEQ19EQ09NUDNfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX0FVWEFEQ19EQ09NUDI6Ci0JCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzJfTUFTSywKLQkJCQkJIFdNODM1MF9JTV9BVVhBRENfRENPTVAyX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9BVVhBRENfRENPTVAxOgotCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18yX01BU0ssCi0JCQkJCSBXTTgzNTBfSU1fQVVYQURDX0RDT01QMV9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfU1lTX0hZU1RfQ09NUF9GQUlMOgotCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18yX01BU0ssCi0JCQkJCSBXTTgzNTBfSU1fU1lTX0hZU1RfQ09NUF9GQUlMX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9TWVNfQ0hJUF9HVDExNToKLQkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMl9NQVNLLAotCQkJCQkgV004MzUwX0lNX1NZU19DSElQX0dUMTE1X0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9TWVNfQ0hJUF9HVDE0MDoKLQkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMl9NQVNLLAotCQkJCQkgV004MzUwX0lNX1NZU19DSElQX0dUMTQwX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9TWVNfV0RPR19UTzoKLQkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMl9NQVNLLAotCQkJCQkgV004MzUwX0lNX1NZU19XRE9HX1RPX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9VVl9MRE80OgotCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAotCQkJCQkgV004MzUwX1VOREVSX1ZPTFRBR0VfSU5UX1NUQVRVU19NQVNLLAotCQkJCQkgV004MzUwX0lNX1VWX0xETzRfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX1VWX0xETzM6Ci0JCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsCi0JCQkJCSBXTTgzNTBfVU5ERVJfVk9MVEFHRV9JTlRfU1RBVFVTX01BU0ssCi0JCQkJCSBXTTgzNTBfSU1fVVZfTERPM19FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfVVZfTERPMjoKLQkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwKLQkJCQkJIFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkJIFdNODM1MF9JTV9VVl9MRE8yX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9VVl9MRE8xOgotCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAotCQkJCQkgV004MzUwX1VOREVSX1ZPTFRBR0VfSU5UX1NUQVRVU19NQVNLLAotCQkJCQkgV004MzUwX0lNX1VWX0xETzFfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX1VWX0RDNjoKLQkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwKLQkJCQkJIFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkJIFdNODM1MF9JTV9VVl9EQzZfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX1VWX0RDNToKLQkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwKLQkJCQkJIFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkJIFdNODM1MF9JTV9VVl9EQzVfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX1VWX0RDNDoKLQkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwKLQkJCQkJIFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkJIFdNODM1MF9JTV9VVl9EQzRfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX1VWX0RDMzoKLQkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwKLQkJCQkJIFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkJIFdNODM1MF9JTV9VVl9EQzNfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX1VWX0RDMjoKLQkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwKLQkJCQkJIFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkJIFdNODM1MF9JTV9VVl9EQzJfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX1VWX0RDMToKLQkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwKLQkJCQkJIFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkJIFdNODM1MF9JTV9VVl9EQzFfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX09DX0xTOgotCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAotCQkJCQkgV004MzUwX09WRVJfQ1VSUkVOVF9JTlRfU1RBVFVTX01BU0ssCi0JCQkJCSBXTTgzNTBfSU1fT0NfTFNfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX0VYVF9VU0JfRkI6Ci0JCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsCi0JCQkJCSBXTTgzNTBfQ09NUEFSQVRPUl9JTlRfU1RBVFVTX01BU0ssCi0JCQkJCSBXTTgzNTBfSU1fRVhUX1VTQl9GQl9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfRVhUX1dBTExfRkI6Ci0JCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsCi0JCQkJCSBXTTgzNTBfQ09NUEFSQVRPUl9JTlRfU1RBVFVTX01BU0ssCi0JCQkJCSBXTTgzNTBfSU1fRVhUX1dBTExfRkJfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX0VYVF9CQVRfRkI6Ci0JCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsCi0JCQkJCSBXTTgzNTBfQ09NUEFSQVRPUl9JTlRfU1RBVFVTX01BU0ssCi0JCQkJCSBXTTgzNTBfSU1fRVhUX0JBVF9GQl9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfQ09ERUNfSkNLX0RFVF9MOgotCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAotCQkJCQkgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVU19NQVNLLAotCQkJCQkgV004MzUwX0lNX0NPREVDX0pDS19ERVRfTF9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfQ09ERUNfSkNLX0RFVF9SOgotCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAotCQkJCQkgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVU19NQVNLLAotCQkJCQkgV004MzUwX0lNX0NPREVDX0pDS19ERVRfUl9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfQ09ERUNfTUlDU0NEOgotCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAotCQkJCQkgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVU19NQVNLLAotCQkJCQkgV004MzUwX0lNX0NPREVDX01JQ1NDRF9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfQ09ERUNfTUlDRDoKLQkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwKLQkJCQkJIFdNODM1MF9DT01QQVJBVE9SX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkJIFdNODM1MF9JTV9DT0RFQ19NSUNEX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9XS1VQX09GRl9TVEFURToKLQkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwKLQkJCQkJIFdNODM1MF9DT01QQVJBVE9SX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkJIFdNODM1MF9JTV9XS1VQX09GRl9TVEFURV9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfV0tVUF9ISUJfU1RBVEU6Ci0JCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsCi0JCQkJCSBXTTgzNTBfQ09NUEFSQVRPUl9JTlRfU1RBVFVTX01BU0ssCi0JCQkJCSBXTTgzNTBfSU1fV0tVUF9ISUJfU1RBVEVfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX1dLVVBfQ09OVl9GQVVMVDoKLQkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwKLQkJCQkJIFdNODM1MF9DT01QQVJBVE9SX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkJIFdNODM1MF9JTV9XS1VQX0NPTlZfRkFVTFRfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX1dLVVBfV0RPR19SU1Q6Ci0JCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsCi0JCQkJCSBXTTgzNTBfQ09NUEFSQVRPUl9JTlRfU1RBVFVTX01BU0ssCi0JCQkJCSBXTTgzNTBfSU1fV0tVUF9PRkZfU1RBVEVfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX1dLVVBfR1BfUFdSX09OOgotCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAotCQkJCQkgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVU19NQVNLLAotCQkJCQkgV004MzUwX0lNX1dLVVBfR1BfUFdSX09OX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9XS1VQX09OS0VZOgotCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAotCQkJCQkgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVU19NQVNLLAotCQkJCQkgV004MzUwX0lNX1dLVVBfT05LRVlfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX1dLVVBfR1BfV0FLRVVQOgotCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAotCQkJCQkgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVU19NQVNLLAotCQkJCQkgV004MzUwX0lNX1dLVVBfR1BfV0FLRVVQX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9HUElPKDApOgotCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAotCQkJCQkgV004MzUwX0dQSU9fSU5UX1NUQVRVU19NQVNLLAotCQkJCQkgV004MzUwX0lNX0dQMF9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfR1BJTygxKToKLQkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwKLQkJCQkJIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkJIFdNODM1MF9JTV9HUDFfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX0dQSU8oMik6Ci0JCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsCi0JCQkJCSBXTTgzNTBfR1BJT19JTlRfU1RBVFVTX01BU0ssCi0JCQkJCSBXTTgzNTBfSU1fR1AyX0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9HUElPKDMpOgotCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAotCQkJCQkgV004MzUwX0dQSU9fSU5UX1NUQVRVU19NQVNLLAotCQkJCQkgV004MzUwX0lNX0dQM19FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfR1BJTyg0KToKLQkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwKLQkJCQkJIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkJIFdNODM1MF9JTV9HUDRfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX0dQSU8oNSk6Ci0JCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsCi0JCQkJCSBXTTgzNTBfR1BJT19JTlRfU1RBVFVTX01BU0ssCi0JCQkJCSBXTTgzNTBfSU1fR1A1X0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9HUElPKDYpOgotCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAotCQkJCQkgV004MzUwX0dQSU9fSU5UX1NUQVRVU19NQVNLLAotCQkJCQkgV004MzUwX0lNX0dQNl9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfR1BJTyg3KToKLQkJcmV0dXJuIHdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwKLQkJCQkJIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywKLQkJCQkJIFdNODM1MF9JTV9HUDdfRUlOVCk7Ci0JY2FzZSBXTTgzNTBfSVJRX0dQSU8oOCk6Ci0JCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsCi0JCQkJCSBXTTgzNTBfR1BJT19JTlRfU1RBVFVTX01BU0ssCi0JCQkJCSBXTTgzNTBfSU1fR1A4X0VJTlQpOwotCWNhc2UgV004MzUwX0lSUV9HUElPKDkpOgotCQlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLAotCQkJCQkgV004MzUwX0dQSU9fSU5UX1NUQVRVU19NQVNLLAotCQkJCQkgV004MzUwX0lNX0dQOV9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfR1BJTygxMCk6Ci0JCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsCi0JCQkJCSBXTTgzNTBfR1BJT19JTlRfU1RBVFVTX01BU0ssCi0JCQkJCSBXTTgzNTBfSU1fR1AxMF9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfR1BJTygxMSk6Ci0JCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsCi0JCQkJCSBXTTgzNTBfR1BJT19JTlRfU1RBVFVTX01BU0ssCi0JCQkJCSBXTTgzNTBfSU1fR1AxMV9FSU5UKTsKLQljYXNlIFdNODM1MF9JUlFfR1BJTygxMik6Ci0JCXJldHVybiB3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsCi0JCQkJCSBXTTgzNTBfR1BJT19JTlRfU1RBVFVTX01BU0ssCi0JCQkJCSBXTTgzNTBfSU1fR1AxMl9FSU5UKTsKLQlkZWZhdWx0OgotCQlkZXZfd2Fybih3bTgzNTAtPmRldiwgIkF0dGVtcHRpbmcgdG8gdW5tYXNrIHVua25vd24gSVJRICVkXG4iLAotCQkJIGlycSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHdtODM1MF91bm1hc2tfaXJxKTsKLQogaW50IHdtODM1MF9yZWFkX2F1eGFkYyhzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBjaGFubmVsLCBpbnQgc2NhbGUsIGludCB2cmVmKQogewogCXUxNiByZWcsIHJlc3VsdCA9IDA7CkBAIC0xMjY0LDcgKzUzNyw3IEBACiAJaW50IHJldDsKIAogCSpwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKG5hbWUsIC0xKTsKLQlpZiAocGRldiA9PSBOVUxMKSB7CisJaWYgKCpwZGV2ID09IE5VTEwpIHsKIAkJZGV2X2Vycih3bTgzNTAtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSAlc1xuIiwgbmFtZSk7CiAJCXJldHVybjsKIAl9CkBAIC0xNDA5LDQ5ICs2ODIsMTggQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQl3bTgzNTBfcmVnX3dyaXRlKHdtODM1MCwgV004MzUwX1NZU1RFTV9JTlRFUlJVUFRTX01BU0ssIDB4RkZGRik7Ci0Jd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzFfTUFTSywgMHhGRkZGKTsKLQl3bTgzNTBfcmVnX3dyaXRlKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMl9NQVNLLCAweEZGRkYpOwotCXdtODM1MF9yZWdfd3JpdGUod204MzUwLCBXTTgzNTBfVU5ERVJfVk9MVEFHRV9JTlRfU1RBVFVTX01BU0ssIDB4RkZGRik7Ci0Jd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSywgMHhGRkZGKTsKLQl3bTgzNTBfcmVnX3dyaXRlKHdtODM1MCwgV004MzUwX0NPTVBBUkFUT1JfSU5UX1NUQVRVU19NQVNLLCAweEZGRkYpOwotCiAJbXV0ZXhfaW5pdCgmd204MzUwLT5hdXhhZGNfbXV0ZXgpOwotCW11dGV4X2luaXQoJndtODM1MC0+aXJxX211dGV4KTsKLQlpZiAoaXJxKSB7Ci0JCWludCBmbGFncyA9IElSUUZfT05FU0hPVDsKIAotCQlpZiAocGRhdGEgJiYgcGRhdGEtPmlycV9oaWdoKSB7Ci0JCQlmbGFncyB8PSBJUlFGX1RSSUdHRVJfSElHSDsKLQotCQkJd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX1NZU1RFTV9DT05UUk9MXzEsCi0JCQkJCVdNODM1MF9JUlFfUE9MKTsKLQkJfSBlbHNlIHsKLQkJCWZsYWdzIHw9IElSUUZfVFJJR0dFUl9MT1c7Ci0KLQkJCXdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX1NZU1RFTV9DT05UUk9MXzEsCi0JCQkJCSAgV004MzUwX0lSUV9QT0wpOwotCQl9Ci0KLQkJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoaXJxLCBOVUxMLCB3bTgzNTBfaXJxLCBmbGFncywKLQkJCQkJICAgIndtODM1MCIsIHdtODM1MCk7Ci0JCWlmIChyZXQgIT0gMCkgewotCQkJZGV2X2Vycih3bTgzNTAtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IElSUTogJWRcbiIsCi0JCQkJcmV0KTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfSBlbHNlIHsKLQkJZGV2X2Vycih3bTgzNTAtPmRldiwgIk5vIElSUSBjb25maWd1cmVkXG4iKTsKKwlyZXQgPSB3bTgzNTBfaXJxX2luaXQod204MzUwLCBpcnEsIHBkYXRhKTsKKwlpZiAocmV0IDwgMCkKIAkJZ290byBlcnI7Ci0JfQotCXdtODM1MC0+Y2hpcF9pcnEgPSBpcnE7CiAKIAlpZiAocGRhdGEgJiYgcGRhdGEtPmluaXQpIHsKIAkJcmV0ID0gcGRhdGEtPmluaXQod204MzUwKTsKIAkJaWYgKHJldCAhPSAwKSB7CiAJCQlkZXZfZXJyKHdtODM1MC0+ZGV2LCAiUGxhdGZvcm0gaW5pdCgpIGZhaWxlZDogJWRcbiIsCiAJCQkJcmV0KTsKLQkJCWdvdG8gZXJyOworCQkJZ290byBlcnJfaXJxOwogCQl9CiAJfQogCkBAIC0xNDcwLDYgKzcxMiw4IEBACiAKIAlyZXR1cm4gMDsKIAorZXJyX2lycToKKwl3bTgzNTBfaXJxX2V4aXQod204MzUwKTsKIGVycjoKIAlrZnJlZSh3bTgzNTAtPnJlZ19jYWNoZSk7CiAJcmV0dXJuIHJldDsKQEAgLTE0OTMsNyArNzM3LDggQEAKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcih3bTgzNTAtPmdwaW8ucGRldik7CiAJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIod204MzUwLT5jb2RlYy5wZGV2KTsKIAotCWZyZWVfaXJxKHdtODM1MC0+Y2hpcF9pcnEsIHdtODM1MCk7CisJd204MzUwX2lycV9leGl0KHdtODM1MCk7CisKIAlrZnJlZSh3bTgzNTAtPnJlZ19jYWNoZSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh3bTgzNTBfZGV2aWNlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvd204MzUwLWlycS5jIGIvZHJpdmVycy9tZmQvd204MzUwLWlycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZGY1NDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC93bTgzNTAtaXJxLmMKQEAgLTAsMCArMSw1MjkgQEAKKy8qCisgKiB3bTgzNTAtaXJxLmMgIC0tICBJUlEgc3VwcG9ydCBmb3IgV29sZnNvbiBXTTgzNTAKKyAqCisgKiBDb3B5cmlnaHQgMjAwNywgMjAwOCwgMjAwOSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgorICoKKyAqIEF1dGhvcjogTGlhbSBHaXJkd29vZCwgTWFyayBCcm93bgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSA8bGludXgvbWZkL3dtODM1MC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3dtODM1MC9hdWRpby5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzNTAvY29tcGFyYXRvci5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzNTAvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzNTAvcG1pYy5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzNTAvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3dtODM1MC9zdXBwbHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzUwL3dkdC5oPgorCisjZGVmaW5lIFdNODM1MF9OVU1fSVJRX1JFR1MgNworCisjZGVmaW5lIFdNODM1MF9JTlRfT0ZGU0VUXzEgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODM1MF9JTlRfT0ZGU0VUXzIgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFdNODM1MF9QT1dFUl9VUF9JTlRfT0ZGU0VUICAgICAgICAgICAgICAyCisjZGVmaW5lIFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9PRkZTRVQgICAgICAgICAzCisjZGVmaW5lIFdNODM1MF9PVkVSX0NVUlJFTlRfSU5UX09GRlNFVCAgICAgICAgICA0CisjZGVmaW5lIFdNODM1MF9HUElPX0lOVF9PRkZTRVQgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFdNODM1MF9DT01QQVJBVE9SX0lOVF9PRkZTRVQgICAgICAgICAgICA2CisKK3N0cnVjdCB3bTgzNTBfaXJxX2RhdGEgeworCWludCBwcmltYXJ5OworCWludCByZWc7CisJaW50IG1hc2s7CisJaW50IHByaW1hcnlfb25seTsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgd204MzUwX2lycV9kYXRhIHdtODM1MF9pcnFzW10gPSB7CisJW1dNODM1MF9JUlFfT0NfTFNdID0geworCQkucHJpbWFyeSA9IFdNODM1MF9PQ19JTlQsCisJCS5yZWcgPSBXTTgzNTBfT1ZFUl9DVVJSRU5UX0lOVF9PRkZTRVQsCisJCS5tYXNrID0gV004MzUwX09DX0xTX0VJTlQsCisJCS5wcmltYXJ5X29ubHkgPSAxLAorCX0sCisJW1dNODM1MF9JUlFfVVZfREMxXSA9IHsKKwkJLnByaW1hcnkgPSBXTTgzNTBfVVZfSU5ULAorCQkucmVnID0gV004MzUwX1VOREVSX1ZPTFRBR0VfSU5UX09GRlNFVCwKKwkJLm1hc2sgPSBXTTgzNTBfVVZfREMxX0VJTlQsCisJfSwKKwlbV004MzUwX0lSUV9VVl9EQzJdID0geworCQkucHJpbWFyeSA9IFdNODM1MF9VVl9JTlQsCisJCS5yZWcgPSBXTTgzNTBfVU5ERVJfVk9MVEFHRV9JTlRfT0ZGU0VULAorCQkubWFzayA9IFdNODM1MF9VVl9EQzJfRUlOVCwKKwl9LAorCVtXTTgzNTBfSVJRX1VWX0RDM10gPSB7CisJCS5wcmltYXJ5ID0gV004MzUwX1VWX0lOVCwKKwkJLnJlZyA9IFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9PRkZTRVQsCisJCS5tYXNrID0gV004MzUwX1VWX0RDM19FSU5ULAorCX0sCisJW1dNODM1MF9JUlFfVVZfREM0XSA9IHsKKwkJLnByaW1hcnkgPSBXTTgzNTBfVVZfSU5ULAorCQkucmVnID0gV004MzUwX1VOREVSX1ZPTFRBR0VfSU5UX09GRlNFVCwKKwkJLm1hc2sgPSBXTTgzNTBfVVZfREM0X0VJTlQsCisJfSwKKwlbV004MzUwX0lSUV9VVl9EQzVdID0geworCQkucHJpbWFyeSA9IFdNODM1MF9VVl9JTlQsCisJCS5yZWcgPSBXTTgzNTBfVU5ERVJfVk9MVEFHRV9JTlRfT0ZGU0VULAorCQkubWFzayA9IFdNODM1MF9VVl9EQzVfRUlOVCwKKwl9LAorCVtXTTgzNTBfSVJRX1VWX0RDNl0gPSB7CisJCS5wcmltYXJ5ID0gV004MzUwX1VWX0lOVCwKKwkJLnJlZyA9IFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9PRkZTRVQsCisJCS5tYXNrID0gV004MzUwX1VWX0RDNl9FSU5ULAorCX0sCisJW1dNODM1MF9JUlFfVVZfTERPMV0gPSB7CisJCS5wcmltYXJ5ID0gV004MzUwX1VWX0lOVCwKKwkJLnJlZyA9IFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9PRkZTRVQsCisJCS5tYXNrID0gV004MzUwX1VWX0xETzFfRUlOVCwKKwl9LAorCVtXTTgzNTBfSVJRX1VWX0xETzJdID0geworCQkucHJpbWFyeSA9IFdNODM1MF9VVl9JTlQsCisJCS5yZWcgPSBXTTgzNTBfVU5ERVJfVk9MVEFHRV9JTlRfT0ZGU0VULAorCQkubWFzayA9IFdNODM1MF9VVl9MRE8yX0VJTlQsCisJfSwKKwlbV004MzUwX0lSUV9VVl9MRE8zXSA9IHsKKwkJLnByaW1hcnkgPSBXTTgzNTBfVVZfSU5ULAorCQkucmVnID0gV004MzUwX1VOREVSX1ZPTFRBR0VfSU5UX09GRlNFVCwKKwkJLm1hc2sgPSBXTTgzNTBfVVZfTERPM19FSU5ULAorCX0sCisJW1dNODM1MF9JUlFfVVZfTERPNF0gPSB7CisJCS5wcmltYXJ5ID0gV004MzUwX1VWX0lOVCwKKwkJLnJlZyA9IFdNODM1MF9VTkRFUl9WT0xUQUdFX0lOVF9PRkZTRVQsCisJCS5tYXNrID0gV004MzUwX1VWX0xETzRfRUlOVCwKKwl9LAorCVtXTTgzNTBfSVJRX0NIR19CQVRfSE9UXSA9IHsKKwkJLnByaW1hcnkgPSBXTTgzNTBfQ0hHX0lOVCwKKwkJLnJlZyA9IFdNODM1MF9JTlRfT0ZGU0VUXzEsCisJCS5tYXNrID0gV004MzUwX0NIR19CQVRfSE9UX0VJTlQsCisJfSwKKwlbV004MzUwX0lSUV9DSEdfQkFUX0NPTERdID0geworCQkucHJpbWFyeSA9IFdNODM1MF9DSEdfSU5ULAorCQkucmVnID0gV004MzUwX0lOVF9PRkZTRVRfMSwKKwkJLm1hc2sgPSBXTTgzNTBfQ0hHX0JBVF9DT0xEX0VJTlQsCisJfSwKKwlbV004MzUwX0lSUV9DSEdfQkFUX0ZBSUxdID0geworCQkucHJpbWFyeSA9IFdNODM1MF9DSEdfSU5ULAorCQkucmVnID0gV004MzUwX0lOVF9PRkZTRVRfMSwKKwkJLm1hc2sgPSBXTTgzNTBfQ0hHX0JBVF9GQUlMX0VJTlQsCisJfSwKKwlbV004MzUwX0lSUV9DSEdfVE9dID0geworCQkucHJpbWFyeSA9IFdNODM1MF9DSEdfSU5ULAorCQkucmVnID0gV004MzUwX0lOVF9PRkZTRVRfMSwKKwkJLm1hc2sgPSBXTTgzNTBfQ0hHX1RPX0VJTlQsCisJfSwKKwlbV004MzUwX0lSUV9DSEdfRU5EXSA9IHsKKwkJLnByaW1hcnkgPSBXTTgzNTBfQ0hHX0lOVCwKKwkJLnJlZyA9IFdNODM1MF9JTlRfT0ZGU0VUXzEsCisJCS5tYXNrID0gV004MzUwX0NIR19FTkRfRUlOVCwKKwl9LAorCVtXTTgzNTBfSVJRX0NIR19TVEFSVF0gPSB7CisJCS5wcmltYXJ5ID0gV004MzUwX0NIR19JTlQsCisJCS5yZWcgPSBXTTgzNTBfSU5UX09GRlNFVF8xLAorCQkubWFzayA9IFdNODM1MF9DSEdfU1RBUlRfRUlOVCwKKwl9LAorCVtXTTgzNTBfSVJRX0NIR19GQVNUX1JEWV0gPSB7CisJCS5wcmltYXJ5ID0gV004MzUwX0NIR19JTlQsCisJCS5yZWcgPSBXTTgzNTBfSU5UX09GRlNFVF8xLAorCQkubWFzayA9IFdNODM1MF9DSEdfRkFTVF9SRFlfRUlOVCwKKwl9LAorCVtXTTgzNTBfSVJRX0NIR19WQkFUVF9MVF8zUDldID0geworCQkucHJpbWFyeSA9IFdNODM1MF9DSEdfSU5ULAorCQkucmVnID0gV004MzUwX0lOVF9PRkZTRVRfMSwKKwkJLm1hc2sgPSBXTTgzNTBfQ0hHX1ZCQVRUX0xUXzNQOV9FSU5ULAorCX0sCisJW1dNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzNQMV0gPSB7CisJCS5wcmltYXJ5ID0gV004MzUwX0NIR19JTlQsCisJCS5yZWcgPSBXTTgzNTBfSU5UX09GRlNFVF8xLAorCQkubWFzayA9IFdNODM1MF9DSEdfVkJBVFRfTFRfM1AxX0VJTlQsCisJfSwKKwlbV004MzUwX0lSUV9DSEdfVkJBVFRfTFRfMlA4NV0gPSB7CisJCS5wcmltYXJ5ID0gV004MzUwX0NIR19JTlQsCisJCS5yZWcgPSBXTTgzNTBfSU5UX09GRlNFVF8xLAorCQkubWFzayA9IFdNODM1MF9DSEdfVkJBVFRfTFRfMlA4NV9FSU5ULAorCX0sCisJW1dNODM1MF9JUlFfUlRDX0FMTV0gPSB7CisJCS5wcmltYXJ5ID0gV004MzUwX1JUQ19JTlQsCisJCS5yZWcgPSBXTTgzNTBfSU5UX09GRlNFVF8xLAorCQkubWFzayA9IFdNODM1MF9SVENfQUxNX0VJTlQsCisJfSwKKwlbV004MzUwX0lSUV9SVENfU0VDXSA9IHsKKwkJLnByaW1hcnkgPSBXTTgzNTBfUlRDX0lOVCwKKwkJLnJlZyA9IFdNODM1MF9JTlRfT0ZGU0VUXzEsCisJCS5tYXNrID0gV004MzUwX1JUQ19TRUNfRUlOVCwKKwl9LAorCVtXTTgzNTBfSVJRX1JUQ19QRVJdID0geworCQkucHJpbWFyeSA9IFdNODM1MF9SVENfSU5ULAorCQkucmVnID0gV004MzUwX0lOVF9PRkZTRVRfMSwKKwkJLm1hc2sgPSBXTTgzNTBfUlRDX1BFUl9FSU5ULAorCX0sCisJW1dNODM1MF9JUlFfQ1MxXSA9IHsKKwkJLnByaW1hcnkgPSBXTTgzNTBfQ1NfSU5ULAorCQkucmVnID0gV004MzUwX0lOVF9PRkZTRVRfMiwKKwkJLm1hc2sgPSBXTTgzNTBfQ1MxX0VJTlQsCisJfSwKKwlbV004MzUwX0lSUV9DUzJdID0geworCQkucHJpbWFyeSA9IFdNODM1MF9DU19JTlQsCisJCS5yZWcgPSBXTTgzNTBfSU5UX09GRlNFVF8yLAorCQkubWFzayA9IFdNODM1MF9DUzJfRUlOVCwKKwl9LAorCVtXTTgzNTBfSVJRX1NZU19IWVNUX0NPTVBfRkFJTF0gPSB7CisJCS5wcmltYXJ5ID0gV004MzUwX1NZU19JTlQsCisJCS5yZWcgPSBXTTgzNTBfSU5UX09GRlNFVF8yLAorCQkubWFzayA9IFdNODM1MF9TWVNfSFlTVF9DT01QX0ZBSUxfRUlOVCwKKwl9LAorCVtXTTgzNTBfSVJRX1NZU19DSElQX0dUMTE1XSA9IHsKKwkJLnByaW1hcnkgPSBXTTgzNTBfU1lTX0lOVCwKKwkJLnJlZyA9IFdNODM1MF9JTlRfT0ZGU0VUXzIsCisJCS5tYXNrID0gV004MzUwX1NZU19DSElQX0dUMTE1X0VJTlQsCisJfSwKKwlbV004MzUwX0lSUV9TWVNfQ0hJUF9HVDE0MF0gPSB7CisJCS5wcmltYXJ5ID0gV004MzUwX1NZU19JTlQsCisJCS5yZWcgPSBXTTgzNTBfSU5UX09GRlNFVF8yLAorCQkubWFzayA9IFdNODM1MF9TWVNfQ0hJUF9HVDE0MF9FSU5ULAorCX0sCisJW1dNODM1MF9JUlFfU1lTX1dET0dfVE9dID0geworCQkucHJpbWFyeSA9IFdNODM1MF9TWVNfSU5ULAorCQkucmVnID0gV004MzUwX0lOVF9PRkZTRVRfMiwKKwkJLm1hc2sgPSBXTTgzNTBfU1lTX1dET0dfVE9fRUlOVCwKKwl9LAorCVtXTTgzNTBfSVJRX0FVWEFEQ19EQVRBUkRZXSA9IHsKKwkJLnByaW1hcnkgPSBXTTgzNTBfQVVYQURDX0lOVCwKKwkJLnJlZyA9IFdNODM1MF9JTlRfT0ZGU0VUXzIsCisJCS5tYXNrID0gV004MzUwX0FVWEFEQ19EQVRBUkRZX0VJTlQsCisJfSwKKwlbV004MzUwX0lSUV9BVVhBRENfRENPTVA0XSA9IHsKKwkJLnByaW1hcnkgPSBXTTgzNTBfQVVYQURDX0lOVCwKKwkJLnJlZyA9IFdNODM1MF9JTlRfT0ZGU0VUXzIsCisJCS5tYXNrID0gV004MzUwX0FVWEFEQ19EQ09NUDRfRUlOVCwKKwl9LAorCVtXTTgzNTBfSVJRX0FVWEFEQ19EQ09NUDNdID0geworCQkucHJpbWFyeSA9IFdNODM1MF9BVVhBRENfSU5ULAorCQkucmVnID0gV004MzUwX0lOVF9PRkZTRVRfMiwKKwkJLm1hc2sgPSBXTTgzNTBfQVVYQURDX0RDT01QM19FSU5ULAorCX0sCisJW1dNODM1MF9JUlFfQVVYQURDX0RDT01QMl0gPSB7CisJCS5wcmltYXJ5ID0gV004MzUwX0FVWEFEQ19JTlQsCisJCS5yZWcgPSBXTTgzNTBfSU5UX09GRlNFVF8yLAorCQkubWFzayA9IFdNODM1MF9BVVhBRENfRENPTVAyX0VJTlQsCisJfSwKKwlbV004MzUwX0lSUV9BVVhBRENfRENPTVAxXSA9IHsKKwkJLnByaW1hcnkgPSBXTTgzNTBfQVVYQURDX0lOVCwKKwkJLnJlZyA9IFdNODM1MF9JTlRfT0ZGU0VUXzIsCisJCS5tYXNrID0gV004MzUwX0FVWEFEQ19EQ09NUDFfRUlOVCwKKwl9LAorCVtXTTgzNTBfSVJRX1VTQl9MSU1JVF0gPSB7CisJCS5wcmltYXJ5ID0gV004MzUwX1VTQl9JTlQsCisJCS5yZWcgPSBXTTgzNTBfSU5UX09GRlNFVF8yLAorCQkubWFzayA9IFdNODM1MF9VU0JfTElNSVRfRUlOVCwKKwkJLnByaW1hcnlfb25seSA9IDEsCisJfSwKKwlbV004MzUwX0lSUV9XS1VQX09GRl9TVEFURV0gPSB7CisJCS5wcmltYXJ5ID0gV004MzUwX1dLVVBfSU5ULAorCQkucmVnID0gV004MzUwX0NPTVBBUkFUT1JfSU5UX09GRlNFVCwKKwkJLm1hc2sgPSBXTTgzNTBfV0tVUF9PRkZfU1RBVEVfRUlOVCwKKwl9LAorCVtXTTgzNTBfSVJRX1dLVVBfSElCX1NUQVRFXSA9IHsKKwkJLnByaW1hcnkgPSBXTTgzNTBfV0tVUF9JTlQsCisJCS5yZWcgPSBXTTgzNTBfQ09NUEFSQVRPUl9JTlRfT0ZGU0VULAorCQkubWFzayA9IFdNODM1MF9XS1VQX0hJQl9TVEFURV9FSU5ULAorCX0sCisJW1dNODM1MF9JUlFfV0tVUF9DT05WX0ZBVUxUXSA9IHsKKwkJLnByaW1hcnkgPSBXTTgzNTBfV0tVUF9JTlQsCisJCS5yZWcgPSBXTTgzNTBfQ09NUEFSQVRPUl9JTlRfT0ZGU0VULAorCQkubWFzayA9IFdNODM1MF9XS1VQX0NPTlZfRkFVTFRfRUlOVCwKKwl9LAorCVtXTTgzNTBfSVJRX1dLVVBfV0RPR19SU1RdID0geworCQkucHJpbWFyeSA9IFdNODM1MF9XS1VQX0lOVCwKKwkJLnJlZyA9IFdNODM1MF9DT01QQVJBVE9SX0lOVF9PRkZTRVQsCisJCS5tYXNrID0gV004MzUwX1dLVVBfV0RPR19SU1RfRUlOVCwKKwl9LAorCVtXTTgzNTBfSVJRX1dLVVBfR1BfUFdSX09OXSA9IHsKKwkJLnByaW1hcnkgPSBXTTgzNTBfV0tVUF9JTlQsCisJCS5yZWcgPSBXTTgzNTBfQ09NUEFSQVRPUl9JTlRfT0ZGU0VULAorCQkubWFzayA9IFdNODM1MF9XS1VQX0dQX1BXUl9PTl9FSU5ULAorCX0sCisJW1dNODM1MF9JUlFfV0tVUF9PTktFWV0gPSB7CisJCS5wcmltYXJ5ID0gV004MzUwX1dLVVBfSU5ULAorCQkucmVnID0gV004MzUwX0NPTVBBUkFUT1JfSU5UX09GRlNFVCwKKwkJLm1hc2sgPSBXTTgzNTBfV0tVUF9PTktFWV9FSU5ULAorCX0sCisJW1dNODM1MF9JUlFfV0tVUF9HUF9XQUtFVVBdID0geworCQkucHJpbWFyeSA9IFdNODM1MF9XS1VQX0lOVCwKKwkJLnJlZyA9IFdNODM1MF9DT01QQVJBVE9SX0lOVF9PRkZTRVQsCisJCS5tYXNrID0gV004MzUwX1dLVVBfR1BfV0FLRVVQX0VJTlQsCisJfSwKKwlbV004MzUwX0lSUV9DT0RFQ19KQ0tfREVUX0xdID0geworCQkucHJpbWFyeSA9IFdNODM1MF9DT0RFQ19JTlQsCisJCS5yZWcgPSBXTTgzNTBfQ09NUEFSQVRPUl9JTlRfT0ZGU0VULAorCQkubWFzayA9IFdNODM1MF9DT0RFQ19KQ0tfREVUX0xfRUlOVCwKKwl9LAorCVtXTTgzNTBfSVJRX0NPREVDX0pDS19ERVRfUl0gPSB7CisJCS5wcmltYXJ5ID0gV004MzUwX0NPREVDX0lOVCwKKwkJLnJlZyA9IFdNODM1MF9DT01QQVJBVE9SX0lOVF9PRkZTRVQsCisJCS5tYXNrID0gV004MzUwX0NPREVDX0pDS19ERVRfUl9FSU5ULAorCX0sCisJW1dNODM1MF9JUlFfQ09ERUNfTUlDU0NEXSA9IHsKKwkJLnByaW1hcnkgPSBXTTgzNTBfQ09ERUNfSU5ULAorCQkucmVnID0gV004MzUwX0NPTVBBUkFUT1JfSU5UX09GRlNFVCwKKwkJLm1hc2sgPSBXTTgzNTBfQ09ERUNfTUlDU0NEX0VJTlQsCisJfSwKKwlbV004MzUwX0lSUV9DT0RFQ19NSUNEXSA9IHsKKwkJLnByaW1hcnkgPSBXTTgzNTBfQ09ERUNfSU5ULAorCQkucmVnID0gV004MzUwX0NPTVBBUkFUT1JfSU5UX09GRlNFVCwKKwkJLm1hc2sgPSBXTTgzNTBfQ09ERUNfTUlDRF9FSU5ULAorCX0sCisJW1dNODM1MF9JUlFfRVhUX1VTQl9GQl0gPSB7CisJCS5wcmltYXJ5ID0gV004MzUwX0VYVF9JTlQsCisJCS5yZWcgPSBXTTgzNTBfQ09NUEFSQVRPUl9JTlRfT0ZGU0VULAorCQkubWFzayA9IFdNODM1MF9FWFRfVVNCX0ZCX0VJTlQsCisJfSwKKwlbV004MzUwX0lSUV9FWFRfV0FMTF9GQl0gPSB7CisJCS5wcmltYXJ5ID0gV004MzUwX0VYVF9JTlQsCisJCS5yZWcgPSBXTTgzNTBfQ09NUEFSQVRPUl9JTlRfT0ZGU0VULAorCQkubWFzayA9IFdNODM1MF9FWFRfV0FMTF9GQl9FSU5ULAorCX0sCisJW1dNODM1MF9JUlFfRVhUX0JBVF9GQl0gPSB7CisJCS5wcmltYXJ5ID0gV004MzUwX0VYVF9JTlQsCisJCS5yZWcgPSBXTTgzNTBfQ09NUEFSQVRPUl9JTlRfT0ZGU0VULAorCQkubWFzayA9IFdNODM1MF9FWFRfQkFUX0ZCX0VJTlQsCisJfSwKKwlbV004MzUwX0lSUV9HUElPKDApXSA9IHsKKwkJLnByaW1hcnkgPSBXTTgzNTBfR1BfSU5ULAorCQkucmVnID0gV004MzUwX0dQSU9fSU5UX09GRlNFVCwKKwkJLm1hc2sgPSBXTTgzNTBfR1AwX0VJTlQsCisJfSwKKwlbV004MzUwX0lSUV9HUElPKDEpXSA9IHsKKwkJLnByaW1hcnkgPSBXTTgzNTBfR1BfSU5ULAorCQkucmVnID0gV004MzUwX0dQSU9fSU5UX09GRlNFVCwKKwkJLm1hc2sgPSBXTTgzNTBfR1AxX0VJTlQsCisJfSwKKwlbV004MzUwX0lSUV9HUElPKDIpXSA9IHsKKwkJLnByaW1hcnkgPSBXTTgzNTBfR1BfSU5ULAorCQkucmVnID0gV004MzUwX0dQSU9fSU5UX09GRlNFVCwKKwkJLm1hc2sgPSBXTTgzNTBfR1AyX0VJTlQsCisJfSwKKwlbV004MzUwX0lSUV9HUElPKDMpXSA9IHsKKwkJLnByaW1hcnkgPSBXTTgzNTBfR1BfSU5ULAorCQkucmVnID0gV004MzUwX0dQSU9fSU5UX09GRlNFVCwKKwkJLm1hc2sgPSBXTTgzNTBfR1AzX0VJTlQsCisJfSwKKwlbV004MzUwX0lSUV9HUElPKDQpXSA9IHsKKwkJLnByaW1hcnkgPSBXTTgzNTBfR1BfSU5ULAorCQkucmVnID0gV004MzUwX0dQSU9fSU5UX09GRlNFVCwKKwkJLm1hc2sgPSBXTTgzNTBfR1A0X0VJTlQsCisJfSwKKwlbV004MzUwX0lSUV9HUElPKDUpXSA9IHsKKwkJLnByaW1hcnkgPSBXTTgzNTBfR1BfSU5ULAorCQkucmVnID0gV004MzUwX0dQSU9fSU5UX09GRlNFVCwKKwkJLm1hc2sgPSBXTTgzNTBfR1A1X0VJTlQsCisJfSwKKwlbV004MzUwX0lSUV9HUElPKDYpXSA9IHsKKwkJLnByaW1hcnkgPSBXTTgzNTBfR1BfSU5ULAorCQkucmVnID0gV004MzUwX0dQSU9fSU5UX09GRlNFVCwKKwkJLm1hc2sgPSBXTTgzNTBfR1A2X0VJTlQsCisJfSwKKwlbV004MzUwX0lSUV9HUElPKDcpXSA9IHsKKwkJLnByaW1hcnkgPSBXTTgzNTBfR1BfSU5ULAorCQkucmVnID0gV004MzUwX0dQSU9fSU5UX09GRlNFVCwKKwkJLm1hc2sgPSBXTTgzNTBfR1A3X0VJTlQsCisJfSwKKwlbV004MzUwX0lSUV9HUElPKDgpXSA9IHsKKwkJLnByaW1hcnkgPSBXTTgzNTBfR1BfSU5ULAorCQkucmVnID0gV004MzUwX0dQSU9fSU5UX09GRlNFVCwKKwkJLm1hc2sgPSBXTTgzNTBfR1A4X0VJTlQsCisJfSwKKwlbV004MzUwX0lSUV9HUElPKDkpXSA9IHsKKwkJLnByaW1hcnkgPSBXTTgzNTBfR1BfSU5ULAorCQkucmVnID0gV004MzUwX0dQSU9fSU5UX09GRlNFVCwKKwkJLm1hc2sgPSBXTTgzNTBfR1A5X0VJTlQsCisJfSwKKwlbV004MzUwX0lSUV9HUElPKDEwKV0gPSB7CisJCS5wcmltYXJ5ID0gV004MzUwX0dQX0lOVCwKKwkJLnJlZyA9IFdNODM1MF9HUElPX0lOVF9PRkZTRVQsCisJCS5tYXNrID0gV004MzUwX0dQMTBfRUlOVCwKKwl9LAorCVtXTTgzNTBfSVJRX0dQSU8oMTEpXSA9IHsKKwkJLnByaW1hcnkgPSBXTTgzNTBfR1BfSU5ULAorCQkucmVnID0gV004MzUwX0dQSU9fSU5UX09GRlNFVCwKKwkJLm1hc2sgPSBXTTgzNTBfR1AxMV9FSU5ULAorCX0sCisJW1dNODM1MF9JUlFfR1BJTygxMildID0geworCQkucHJpbWFyeSA9IFdNODM1MF9HUF9JTlQsCisJCS5yZWcgPSBXTTgzNTBfR1BJT19JTlRfT0ZGU0VULAorCQkubWFzayA9IFdNODM1MF9HUDEyX0VJTlQsCisJfSwKK307CisKK3N0YXRpYyB2b2lkIHdtODM1MF9pcnFfY2FsbF9oYW5kbGVyKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IGlycSkKK3sKKwltdXRleF9sb2NrKCZ3bTgzNTAtPmlycV9tdXRleCk7CisKKwlpZiAod204MzUwLT5pcnFbaXJxXS5oYW5kbGVyKQorCQl3bTgzNTAtPmlycVtpcnFdLmhhbmRsZXIoaXJxLCB3bTgzNTAtPmlycVtpcnFdLmRhdGEpOworCWVsc2UgeworCQlkZXZfZXJyKHdtODM1MC0+ZGV2LCAiaXJxICVkIG5vYm9keSBjYXJlZC4gbm93IG1hc2tlZC5cbiIsCisJCQlpcnEpOworCQl3bTgzNTBfbWFza19pcnEod204MzUwLCBpcnEpOworCX0KKworCW11dGV4X3VubG9jaygmd204MzUwLT5pcnFfbXV0ZXgpOworfQorCisvKgorICogVGhpcyBpcyBhIHRocmVhZGVkIElSUSBoYW5kbGVyIHNvIGNhbiBhY2Nlc3MgSTJDL1NQSS4gIFNpbmNlIGFsbAorICogaW50ZXJydXB0cyBhcmUgY2xlYXIgb24gcmVhZCB0aGUgSVJRIGxpbmUgd2lsbCBiZSByZWFzc2VydGVkIGFuZAorICogdGhlIHBoeXNpY2FsIElSUSB3aWxsIGJlIGhhbmRsZWQgYWdhaW4gaWYgYW5vdGhlciBpbnRlcnJ1cHQgaXMKKyAqIGFzc2VydGVkIHdoaWxlIHdlIHJ1biAtIGluIHRoZSBub3JtYWwgY291cnNlIG9mIGV2ZW50cyB0aGlzIGlzIGEKKyAqIHJhcmUgb2NjdXJyZW5jZSBzbyB3ZSBzYXZlIEkyQy9TUEkgcmVhZHMuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB3bTgzNTBfaXJxKGludCBpcnEsIHZvaWQgKmlycV9kYXRhKQoreworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IGlycV9kYXRhOworCXUxNiBsZXZlbF9vbmU7CisJdTE2IHN1Yl9yZWdbV004MzUwX05VTV9JUlFfUkVHU107CisJaW50IHJlYWRfZG9uZVtXTTgzNTBfTlVNX0lSUV9SRUdTXTsKKwlzdHJ1Y3Qgd204MzUwX2lycV9kYXRhICpkYXRhOworCWludCBpOworCisJLyogVE9ETzogVXNlIGJsb2NrIHJlYWRzIHRvIGltcHJvdmUgcGVyZm9ybWFuY2U/ICovCisJbGV2ZWxfb25lID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX1NZU1RFTV9JTlRFUlJVUFRTKQorCQkmIH53bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfU1lTVEVNX0lOVEVSUlVQVFNfTUFTSyk7CisKKwlpZiAoIWxldmVsX29uZSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJbWVtc2V0KCZyZWFkX2RvbmUsIDAsIHNpemVvZihyZWFkX2RvbmUpKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODM1MF9pcnFzKTsgaSsrKSB7CisJCWRhdGEgPSAmd204MzUwX2lycXNbaV07CisKKwkJaWYgKCEobGV2ZWxfb25lICYgZGF0YS0+cHJpbWFyeSkpCisJCQljb250aW51ZTsKKworCQlpZiAoIXJlYWRfZG9uZVtkYXRhLT5yZWddKSB7CisJCQlzdWJfcmVnW2RhdGEtPnJlZ10gPQorCQkJCXdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzEgKworCQkJCQkJZGF0YS0+cmVnKTsKKwkJCXN1Yl9yZWdbZGF0YS0+cmVnXSAmPQorCQkJCX53bTgzNTBfcmVnX3JlYWQod204MzUwLAorCQkJCQkJIFdNODM1MF9JTlRfU1RBVFVTXzFfTUFTSyArCisJCQkJCQkgZGF0YS0+cmVnKTsKKwkJCXJlYWRfZG9uZVtkYXRhLT5yZWddID0gMTsKKwkJfQorCisJCWlmIChzdWJfcmVnW2RhdGEtPnJlZ10gJiBkYXRhLT5tYXNrKQorCQkJd204MzUwX2lycV9jYWxsX2hhbmRsZXIod204MzUwLCBpKTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK2ludCB3bTgzNTBfcmVnaXN0ZXJfaXJxKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IGlycSwKKwkJCWlycV9oYW5kbGVyX3QgaGFuZGxlciwgdW5zaWduZWQgbG9uZyBmbGFncywKKwkJCWNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEpCit7CisJaWYgKGlycSA8IDAgfHwgaXJxID4gV004MzUwX05VTV9JUlEgfHwgIWhhbmRsZXIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHdtODM1MC0+aXJxW2lycV0uaGFuZGxlcikKKwkJcmV0dXJuIC1FQlVTWTsKKworCW11dGV4X2xvY2soJndtODM1MC0+aXJxX211dGV4KTsKKwl3bTgzNTAtPmlycVtpcnFdLmhhbmRsZXIgPSBoYW5kbGVyOworCXdtODM1MC0+aXJxW2lycV0uZGF0YSA9IGRhdGE7CisJbXV0ZXhfdW5sb2NrKCZ3bTgzNTAtPmlycV9tdXRleCk7CisKKwl3bTgzNTBfdW5tYXNrX2lycSh3bTgzNTAsIGlycSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdtODM1MF9yZWdpc3Rlcl9pcnEpOworCitpbnQgd204MzUwX2ZyZWVfaXJxKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IGlycSkKK3sKKwlpZiAoaXJxIDwgMCB8fCBpcnEgPiBXTTgzNTBfTlVNX0lSUSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3bTgzNTBfbWFza19pcnEod204MzUwLCBpcnEpOworCisJbXV0ZXhfbG9jaygmd204MzUwLT5pcnFfbXV0ZXgpOworCXdtODM1MC0+aXJxW2lycV0uaGFuZGxlciA9IE5VTEw7CisJbXV0ZXhfdW5sb2NrKCZ3bTgzNTAtPmlycV9tdXRleCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3bTgzNTBfZnJlZV9pcnEpOworCitpbnQgd204MzUwX21hc2tfaXJxKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IGlycSkKK3sKKwlyZXR1cm4gd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0lOVF9TVEFUVVNfMV9NQVNLICsKKwkJCSAgICAgICB3bTgzNTBfaXJxc1tpcnFdLnJlZywKKwkJCSAgICAgICB3bTgzNTBfaXJxc1tpcnFdLm1hc2spOworfQorRVhQT1JUX1NZTUJPTF9HUEwod204MzUwX21hc2tfaXJxKTsKKworaW50IHdtODM1MF91bm1hc2tfaXJxKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IGlycSkKK3sKKwlyZXR1cm4gd204MzUwX2NsZWFyX2JpdHMod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18xX01BU0sgKworCQkJCSB3bTgzNTBfaXJxc1tpcnFdLnJlZywKKwkJCQkgd204MzUwX2lycXNbaXJxXS5tYXNrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdtODM1MF91bm1hc2tfaXJxKTsKKworaW50IHdtODM1MF9pcnFfaW5pdChzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBpcnEsCisJCSAgICBzdHJ1Y3Qgd204MzUwX3BsYXRmb3JtX2RhdGEgKnBkYXRhKQoreworCWludCByZXQ7CisJaW50IGZsYWdzID0gSVJRRl9PTkVTSE9UOworCisJaWYgKCFpcnEpIHsKKwkJZGV2X2Vycih3bTgzNTAtPmRldiwgIk5vIElSUSBjb25maWd1cmVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIFdNODM1MF9TWVNURU1fSU5URVJSVVBUU19NQVNLLCAweEZGRkYpOworCXdtODM1MF9yZWdfd3JpdGUod204MzUwLCBXTTgzNTBfSU5UX1NUQVRVU18xX01BU0ssIDB4RkZGRik7CisJd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIFdNODM1MF9JTlRfU1RBVFVTXzJfTUFTSywgMHhGRkZGKTsKKwl3bTgzNTBfcmVnX3dyaXRlKHdtODM1MCwgV004MzUwX1VOREVSX1ZPTFRBR0VfSU5UX1NUQVRVU19NQVNLLCAweEZGRkYpOworCXdtODM1MF9yZWdfd3JpdGUod204MzUwLCBXTTgzNTBfR1BJT19JTlRfU1RBVFVTX01BU0ssIDB4RkZGRik7CisJd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIFdNODM1MF9DT01QQVJBVE9SX0lOVF9TVEFUVVNfTUFTSywgMHhGRkZGKTsKKworCW11dGV4X2luaXQoJndtODM1MC0+aXJxX211dGV4KTsKKwl3bTgzNTAtPmNoaXBfaXJxID0gaXJxOworCisJaWYgKHBkYXRhICYmIHBkYXRhLT5pcnFfaGlnaCkgeworCQlmbGFncyB8PSBJUlFGX1RSSUdHRVJfSElHSDsKKworCQl3bTgzNTBfc2V0X2JpdHMod204MzUwLCBXTTgzNTBfU1lTVEVNX0NPTlRST0xfMSwKKwkJCQlXTTgzNTBfSVJRX1BPTCk7CisJfSBlbHNlIHsKKwkJZmxhZ3MgfD0gSVJRRl9UUklHR0VSX0xPVzsKKworCQl3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsIFdNODM1MF9TWVNURU1fQ09OVFJPTF8xLAorCQkJCSAgV004MzUwX0lSUV9QT0wpOworCX0KKworCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGlycSwgTlVMTCwgd204MzUwX2lycSwgZmxhZ3MsCisJCQkJICAgIndtODM1MCIsIHdtODM1MCk7CisJaWYgKHJldCAhPSAwKQorCQlkZXZfZXJyKHdtODM1MC0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgSVJROiAlZFxuIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCB3bTgzNTBfaXJxX2V4aXQoc3RydWN0IHdtODM1MCAqd204MzUwKQoreworCWZyZWVfaXJxKHdtODM1MC0+Y2hpcF9pcnEsIHdtODM1MCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC93bTgzNTAtcmVnbWFwLmMgYi9kcml2ZXJzL21mZC93bTgzNTAtcmVnbWFwLmMKaW5kZXggN2NjYzFlYS4uZTk2NTEzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvd204MzUwLXJlZ21hcC5jCisrKyBiL2RyaXZlcnMvbWZkL3dtODM1MC1yZWdtYXAuYwpAQCAtMzE3MCwxNCArMzE3MCw2IEBACiB9OwogI2VuZGlmCiAKLS8qIFRoZSByZWdpc3RlciBkZWZhdWx0cyBmb3IgdGhlIGNvbmZpZyBtb2RlIHVzZWQgbXVzdCBiZSBjb21waWxlZCBpbiBidXQKLSAqIGR1ZSB0byB0aGUgaW1wYWN0IG9uIGtlcm5lbCBzaXplIGl0IGlzIHBvc3NpYmxlIHRvIGRpc2FibGUKLSAqLwotI2lmbmRlZiBXTTgzNTBfSEFWRV9DT05GSUdfTU9ERQotI3dhcm5pbmcgTm8gV004MzUwIGNvbmZpZyBtb2RlcyBzdXBwb3J0ZWQgLSBzZWxlY3QgYXQgbGVhc3Qgb25lIG9mIHRoZQotI3dhcm5pbmcgTUZEX1dNODM1MF9DT05GSUdfTU9ERV9uIG9wdGlvbnMgZnJvbSB0aGUgYm9hcmQgZHJpdmVyLgotI2VuZGlmCi0KIC8qCiAgKiBBY2Nlc3MgbWFza3MuCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9ocGlsby5oIGIvZHJpdmVycy9taXNjL2hwaWxvLmgKaW5kZXggMzg1NzYwNS4uMjQ3ZWIzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2hwaWxvLmgKKysrIGIvZHJpdmVycy9taXNjL2hwaWxvLmgKQEAgLTQ0LDkgKzQ0LDIwIEBACiAKIAlzdHJ1Y3QgcGNpX2RldiAqaWxvX2RldjsKIAorCS8qCisJICogb3Blbl9sb2NrICAgICAgc2VyaWFsaXplcyBjY2JfY250IGR1cmluZyBvcGVuIGFuZCBjbG9zZQorCSAqIFsgaXJxIGRpc2FibGVkIF0KKwkgKiAtPiBhbGxvY19sb2NrICB1c2VkIHdoZW4gYWRkaW5nL3JlbW92aW5nL3NlYXJjaGluZyBjY2JfYWxsb2MsCisJICogICAgICAgICAgICAgICAgd2hpY2ggcmVwcmVzZW50cyBhbGwgY2NicyBvcGVuIG9uIHRoZSBkZXZpY2UKKwkgKiAtLT4gZmlmb19sb2NrICBjb250cm9scyBhY2Nlc3MgdG8gZmlmbyBxdWV1ZXMgc2hhcmVkIHdpdGggaHcKKwkgKgorCSAqIExvY2tzIG11c3QgYmUgdGFrZW4gaW4gdGhpcyBvcmRlciwgYnV0IG9wZW5fbG9jayBhbmQgYWxsb2NfbG9jaworCSAqIGFyZSBvcHRpb25hbCwgdGhleSBkbyBub3QgbmVlZCB0byBiZSBoZWxkIGluIG9yZGVyIHRvIHRha2UgYQorCSAqIGxvd2VyIGxldmVsIGxvY2suCisJICovCisJc3BpbmxvY2tfdCBvcGVuX2xvY2s7CiAJc3BpbmxvY2tfdCBhbGxvY19sb2NrOwogCXNwaW5sb2NrX3QgZmlmb19sb2NrOwotCXNwaW5sb2NrX3Qgb3Blbl9sb2NrOwogCiAJc3RydWN0IGNkZXYgY2RldjsKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2Mva2dkYnRzLmMgYi9kcml2ZXJzL21pc2Mva2dkYnRzLmMKaW5kZXggZTRmZjUwYi4uZmNiNmVjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2tnZGJ0cy5jCisrKyBiL2RyaXZlcnMvbWlzYy9rZ2RidHMuYwpAQCAtNzEyLDYgKzcxMiwxMiBAQAogCiAJLyogRW5kIG9mIHBhY2tldCA9PSAjWFggc28gbG9vayBmb3IgdGhlICcjJyAqLwogCWlmIChwdXRfYnVmX2NudCA+IDMgJiYgcHV0X2J1ZltwdXRfYnVmX2NudCAtIDNdID09ICcjJykgeworCQlpZiAocHV0X2J1Zl9jbnQgPj0gQlVGTUFYKSB7CisJCQllcHJpbnRrKCJrZ2RidHM6IEVSUk9SOiBwdXQgYnVmZmVyIG92ZXJmbG93IG9uIgorCQkJCSIgJyVzJyBsaW5lICVpXG4iLCB0cy5uYW1lLCB0cy5pZHgpOworCQkJcHV0X2J1Zl9jbnQgPSAwOworCQkJcmV0dXJuIDA7CisJCX0KIAkJcHV0X2J1ZltwdXRfYnVmX2NudF0gPSAnXDAnOwogCQl2MnByaW50aygicHV0JWk6ICVzXG4iLCB0cy5pZHgsIHB1dF9idWYpOwogCQkvKiBUcmlnZ2VyIGNoZWNrIGhlcmUgKi8KQEAgLTg4NSwxNiArODkxLDE2IEBACiAJaW50IG5taV9zbGVlcCA9IDA7CiAJaW50IGk7CiAKLQlwdHIgPSBzdHJzdHIoY29uZmlnLCAiRiIpOworCXB0ciA9IHN0cmNocihjb25maWcsICdGJyk7CiAJaWYgKHB0cikKIAkJZm9ya190ZXN0ID0gc2ltcGxlX3N0cnRvbChwdHIgKyAxLCBOVUxMLCAxMCk7Ci0JcHRyID0gc3Ryc3RyKGNvbmZpZywgIlMiKTsKKwlwdHIgPSBzdHJjaHIoY29uZmlnLCAnUycpOwogCWlmIChwdHIpCiAJCWRvX3N5c19vcGVuX3Rlc3QgPSBzaW1wbGVfc3RydG9sKHB0ciArIDEsIE5VTEwsIDEwKTsKLQlwdHIgPSBzdHJzdHIoY29uZmlnLCAiTiIpOworCXB0ciA9IHN0cmNocihjb25maWcsICdOJyk7CiAJaWYgKHB0cikKIAkJbm1pX3NsZWVwID0gc2ltcGxlX3N0cnRvbChwdHIrMSwgTlVMTCwgMTApOwotCXB0ciA9IHN0cnN0cihjb25maWcsICJJIik7CisJcHRyID0gc3RyY2hyKGNvbmZpZywgJ0knKTsKIAlpZiAocHRyKQogCQlzc3RlcF90ZXN0ID0gc2ltcGxlX3N0cnRvbChwdHIrMSwgTlVMTCwgMTApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jYXJkL3NkaW9fdWFydC5jIGIvZHJpdmVycy9tbWMvY2FyZC9zZGlvX3VhcnQuYwppbmRleCBiOGU3YzVhLi5mNTM3NTU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jYXJkL3NkaW9fdWFydC5jCisrKyBiL2RyaXZlcnMvbW1jL2NhcmQvc2Rpb191YXJ0LmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgpAQCAtNzMsMTEgKzc0LDEwIEBACiB9OwogCiBzdHJ1Y3Qgc2Rpb191YXJ0X3BvcnQgeworCXN0cnVjdCB0dHlfcG9ydAkJcG9ydDsKIAlzdHJ1Y3Qga3JlZgkJa3JlZjsKIAlzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OwogCXVuc2lnbmVkIGludAkJaW5kZXg7Ci0JdW5zaWduZWQgaW50CQlvcGVuZWQ7Ci0Jc3RydWN0IG11dGV4CQlvcGVuX2xvY2s7CiAJc3RydWN0IHNkaW9fZnVuYwkqZnVuYzsKIAlzdHJ1Y3QgbXV0ZXgJCWZ1bmNfbG9jazsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QJKmluX3NkaW9fdWFydF9pcnE7CkBAIC04Nyw2ICs4Nyw3IEBACiAJc3RydWN0IHVhcnRfaWNvdW50CWljb3VudDsKIAl1bnNpZ25lZCBpbnQJCXVhcnRjbGs7CiAJdW5zaWduZWQgaW50CQltY3RybDsKKwl1bnNpZ25lZCBpbnQJCXJ4X21jdHJsOwogCXVuc2lnbmVkIGludAkJcmVhZF9zdGF0dXNfbWFzazsKIAl1bnNpZ25lZCBpbnQJCWlnbm9yZV9zdGF0dXNfbWFzazsKIAl1bnNpZ25lZCBjaGFyCQl4X2NoYXI7CkBAIC0xMDIsNyArMTAzLDYgQEAKIAlpbnQgaW5kZXgsIHJldCA9IC1FQlVTWTsKIAogCWtyZWZfaW5pdCgmcG9ydC0+a3JlZik7Ci0JbXV0ZXhfaW5pdCgmcG9ydC0+b3Blbl9sb2NrKTsKIAltdXRleF9pbml0KCZwb3J0LT5mdW5jX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZwb3J0LT53cml0ZV9sb2NrKTsKIApAQCAtMTUxLDYgKzE1MSw3IEBACiBzdGF0aWMgdm9pZCBzZGlvX3VhcnRfcG9ydF9yZW1vdmUoc3RydWN0IHNkaW9fdWFydF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmM7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAogCUJVR19PTihzZGlvX3VhcnRfdGFibGVbcG9ydC0+aW5kZXhdICE9IHBvcnQpOwogCkBAIC0xNjUsMTUgKzE2NiwxOSBAQAogCSAqIGdpdmUgdXAgb24gdGhhdCBwb3J0IEFTQVAuCiAJICogQmV3YXJlOiB0aGUgbG9jayBvcmRlcmluZyBpcyBjcml0aWNhbC4KIAkgKi8KLQltdXRleF9sb2NrKCZwb3J0LT5vcGVuX2xvY2spOworCW11dGV4X2xvY2soJnBvcnQtPnBvcnQubXV0ZXgpOwogCW11dGV4X2xvY2soJnBvcnQtPmZ1bmNfbG9jayk7CiAJZnVuYyA9IHBvcnQtPmZ1bmM7CiAJc2Rpb19jbGFpbV9ob3N0KGZ1bmMpOwogCXBvcnQtPmZ1bmMgPSBOVUxMOwogCW11dGV4X3VubG9jaygmcG9ydC0+ZnVuY19sb2NrKTsKLQlpZiAocG9ydC0+b3BlbmVkKQotCQl0dHlfaGFuZ3VwKHBvcnQtPnR0eSk7Ci0JbXV0ZXhfdW5sb2NrKCZwb3J0LT5vcGVuX2xvY2spOworCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnQtPnBvcnQpOworCS8qIHR0eV9oYW5ndXAgaXMgYXN5bmMgc28gaXMgdGhpcyBzYWZlIGFzIGlzID8/ICovCisJaWYgKHR0eSkgeworCQl0dHlfaGFuZ3VwKHR0eSk7CisJCXR0eV9rcmVmX3B1dCh0dHkpOworCX0KKwltdXRleF91bmxvY2soJnBvcnQtPnBvcnQubXV0ZXgpOwogCXNkaW9fcmVsZWFzZV9pcnEoZnVuYyk7CiAJc2Rpb19kaXNhYmxlX2Z1bmMoZnVuYyk7CiAJc2Rpb19yZWxlYXNlX2hvc3QoZnVuYyk7CkBAIC0yMTcsNiArMjIyLDggQEAKIAl1bnNpZ25lZCBjaGFyIHN0YXR1czsKIAl1bnNpZ25lZCBpbnQgcmV0OwogCisJLyogRklYTUU6IFdoYXQgc3RvcHMgdGhpcyBsb3NpbmcgdGhlIGRlbHRhIGJpdHMgYW5kIGJyZWFraW5nCisJICAgc2Rpb191YXJ0X2NoZWNrX21vZGVtX3N0YXR1cyA/ICovCiAJc3RhdHVzID0gc2Rpb19pbihwb3J0LCBVQVJUX01TUik7CiAKIAlyZXQgPSAwOwpAQCAtMzkxLDcgKzM5OCw3IEBACiBzdGF0aWMgdm9pZCBzZGlvX3VhcnRfcmVjZWl2ZV9jaGFycyhzdHJ1Y3Qgc2Rpb191YXJ0X3BvcnQgKnBvcnQsCiAJCQkJICAgIHVuc2lnbmVkIGludCAqc3RhdHVzKQogewotCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBwb3J0LT50dHk7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnQtPnBvcnQpOwogCXVuc2lnbmVkIGludCBjaCwgZmxhZzsKIAlpbnQgbWF4X2NvdW50ID0gMjU2OwogCkBAIC00MjgsMjQgKzQzNSwzMCBAQAogCQl9CiAKIAkJaWYgKCgqc3RhdHVzICYgcG9ydC0+aWdub3JlX3N0YXR1c19tYXNrICYgflVBUlRfTFNSX09FKSA9PSAwKQotCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjaCwgZmxhZyk7CisJCQlpZiAodHR5KQorCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgY2gsIGZsYWcpOwogCiAJCS8qCiAJCSAqIE92ZXJydW4gaXMgc3BlY2lhbC4gIFNpbmNlIGl0J3MgcmVwb3J0ZWQgaW1tZWRpYXRlbHksCiAJCSAqIGl0IGRvZXNuJ3QgYWZmZWN0IHRoZSBjdXJyZW50IGNoYXJhY3Rlci4KIAkJICovCiAJCWlmICgqc3RhdHVzICYgfnBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzayAmIFVBUlRfTFNSX09FKQotCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfT1ZFUlJVTik7CisJCQlpZiAodHR5KQorCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX09WRVJSVU4pOwogCiAJCSpzdGF0dXMgPSBzZGlvX2luKHBvcnQsIFVBUlRfTFNSKTsKIAl9IHdoaWxlICgoKnN0YXR1cyAmIFVBUlRfTFNSX0RSKSAmJiAobWF4X2NvdW50LS0gPiAwKSk7Ci0JdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKKwlpZiAodHR5KSB7CisJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CisJCXR0eV9rcmVmX3B1dCh0dHkpOworCX0KIH0KIAogc3RhdGljIHZvaWQgc2Rpb191YXJ0X3RyYW5zbWl0X2NoYXJzKHN0cnVjdCBzZGlvX3VhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmcG9ydC0+eG1pdDsKIAlpbnQgY291bnQ7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAogCWlmIChwb3J0LT54X2NoYXIpIHsKIAkJc2Rpb19vdXQocG9ydCwgVUFSVF9UWCwgcG9ydC0+eF9jaGFyKTsKQEAgLTQ1Myw4ICs0NjYsMTMgQEAKIAkJcG9ydC0+eF9jaGFyID0gMDsKIAkJcmV0dXJuOwogCX0KLQlpZiAoY2lyY19lbXB0eSh4bWl0KSB8fCBwb3J0LT50dHktPnN0b3BwZWQgfHwgcG9ydC0+dHR5LT5od19zdG9wcGVkKSB7CisKKwl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKKworCWlmICh0dHkgPT0gTlVMTCB8fCBjaXJjX2VtcHR5KHhtaXQpIHx8CisJCQkJdHR5LT5zdG9wcGVkIHx8IHR0eS0+aHdfc3RvcHBlZCkgewogCQlzZGlvX3VhcnRfc3RvcF90eChwb3J0KTsKKwkJdHR5X2tyZWZfcHV0KHR0eSk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTQ2OCwxNSArNDg2LDE3IEBACiAJfSB3aGlsZSAoLS1jb3VudCA+IDApOwogCiAJaWYgKGNpcmNfY2hhcnNfcGVuZGluZyh4bWl0KSA8IFdBS0VVUF9DSEFSUykKLQkJdHR5X3dha2V1cChwb3J0LT50dHkpOworCQl0dHlfd2FrZXVwKHR0eSk7CiAKIAlpZiAoY2lyY19lbXB0eSh4bWl0KSkKIAkJc2Rpb191YXJ0X3N0b3BfdHgocG9ydCk7CisJdHR5X2tyZWZfcHV0KHR0eSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNkaW9fdWFydF9jaGVja19tb2RlbV9zdGF0dXMoc3RydWN0IHNkaW9fdWFydF9wb3J0ICpwb3J0KQogewogCWludCBzdGF0dXM7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAogCXN0YXR1cyA9IHNkaW9faW4ocG9ydCwgVUFSVF9NU1IpOwogCkBAIC00ODcsMjUgKzUwNywzOSBAQAogCQlwb3J0LT5pY291bnQucm5nKys7CiAJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0REU1IpCiAJCXBvcnQtPmljb3VudC5kc3IrKzsKLQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRERDRCkKKwlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRERDRCkgewogCQlwb3J0LT5pY291bnQuZGNkKys7CisJCS8qIERDRCByYWlzZSAtIHdha2UgZm9yIG9wZW4gKi8KKwkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDRCkKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+cG9ydC5vcGVuX3dhaXQpOworCQllbHNlIHsKKwkJCS8qIERDRCBkcm9wIC0gaGFuZyB1cCBpZiB0dHkgYXR0YWNoZWQgKi8KKwkJCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnQtPnBvcnQpOworCQkJaWYgKHR0eSkgeworCQkJCXR0eV9oYW5ndXAodHR5KTsKKwkJCQl0dHlfa3JlZl9wdXQodHR5KTsKKwkJCX0KKwkJfQorCX0KIAlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRENUUykgewogCQlwb3J0LT5pY291bnQuY3RzKys7Ci0JCWlmIChwb3J0LT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnQtPnBvcnQpOworCQlpZiAodHR5ICYmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSkgewogCQkJaW50IGN0cyA9IChzdGF0dXMgJiBVQVJUX01TUl9DVFMpOwotCQkJaWYgKHBvcnQtPnR0eS0+aHdfc3RvcHBlZCkgeworCQkJaWYgKHR0eS0+aHdfc3RvcHBlZCkgewogCQkJCWlmIChjdHMpIHsKLQkJCQkJcG9ydC0+dHR5LT5od19zdG9wcGVkID0gMDsKKwkJCQkJdHR5LT5od19zdG9wcGVkID0gMDsKIAkJCQkJc2Rpb191YXJ0X3N0YXJ0X3R4KHBvcnQpOwotCQkJCQl0dHlfd2FrZXVwKHBvcnQtPnR0eSk7CisJCQkJCXR0eV93YWtldXAodHR5KTsKIAkJCQl9CiAJCQl9IGVsc2UgewogCQkJCWlmICghY3RzKSB7Ci0JCQkJCXBvcnQtPnR0eS0+aHdfc3RvcHBlZCA9IDE7CisJCQkJCXR0eS0+aHdfc3RvcHBlZCA9IDE7CiAJCQkJCXNkaW9fdWFydF9zdG9wX3R4KHBvcnQpOwogCQkJCX0KIAkJCX0KIAkJfQorCQl0dHlfa3JlZl9wdXQodHR5KTsKIAl9CiB9CiAKQEAgLTU0Miw4ICs1NzYsNjIgQEAKIAlwb3J0LT5pbl9zZGlvX3VhcnRfaXJxID0gTlVMTDsKIH0KIAotc3RhdGljIGludCBzZGlvX3VhcnRfc3RhcnR1cChzdHJ1Y3Qgc2Rpb191YXJ0X3BvcnQgKnBvcnQpCitzdGF0aWMgaW50IHVhcnRfY2Fycmllcl9yYWlzZWQoc3RydWN0IHR0eV9wb3J0ICp0cG9ydCkKIHsKKwlzdHJ1Y3Qgc2Rpb191YXJ0X3BvcnQgKnBvcnQgPQorCQkJY29udGFpbmVyX29mKHRwb3J0LCBzdHJ1Y3Qgc2Rpb191YXJ0X3BvcnQsIHBvcnQpOworCXVuc2lnbmVkIGludCByZXQgPSBzZGlvX3VhcnRfY2xhaW1fZnVuYyhwb3J0KTsKKwlpZiAocmV0KQkvKiBNaXNzaW5nIGhhcmR3YXJlIHNob3Vkbid0IGJsb2NrIGZvciBjYXJyaWVyICovCisJCXJldHVybiAxOworCXJldCA9IHNkaW9fdWFydF9nZXRfbWN0cmwocG9ydCk7CisJc2Rpb191YXJ0X3JlbGVhc2VfZnVuYyhwb3J0KTsKKwlpZiAocmV0ICYgVElPQ01fQ0FSKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl1YXJ0X2R0cl9ydHMJCS0JIHBvcnQgaGVscGVyIHRvIHNldCB1YXJ0IHNpZ25hbHMKKyAqCUB0cG9ydDogdHR5IHBvcnQgdG8gYmUgdXBkYXRlZAorICoJQG9ub2ZmOiBzZXQgdG8gdHVybiBvbiBEVFIvUlRTCisgKgorICoJQ2FsbGVkIGJ5IHRoZSB0dHkgcG9ydCBoZWxwZXJzIHdoZW4gdGhlIG1vZGVtIHNpZ25hbHMgbmVlZCB0byBiZQorICoJYWRqdXN0ZWQgZHVyaW5nIGFuIG9wZW4sIGNsb3NlIGFuZCBoYW5ndXAuCisgKi8KKworc3RhdGljIHZvaWQgdWFydF9kdHJfcnRzKHN0cnVjdCB0dHlfcG9ydCAqdHBvcnQsIGludCBvbm9mZikKK3sKKwlzdHJ1Y3Qgc2Rpb191YXJ0X3BvcnQgKnBvcnQgPQorCQkJY29udGFpbmVyX29mKHRwb3J0LCBzdHJ1Y3Qgc2Rpb191YXJ0X3BvcnQsIHBvcnQpOworCWludCByZXQgPSBzZGlvX3VhcnRfY2xhaW1fZnVuYyhwb3J0KTsKKwlpZiAocmV0KQorCQlyZXR1cm47CisJaWYgKG9ub2ZmID09IDApCisJCXNkaW9fdWFydF9jbGVhcl9tY3RybChwb3J0LCBUSU9DTV9EVFIgfCBUSU9DTV9SVFMpOworCWVsc2UKKwkJc2Rpb191YXJ0X3NldF9tY3RybChwb3J0LCBUSU9DTV9EVFIgfCBUSU9DTV9SVFMpOworCXNkaW9fdWFydF9yZWxlYXNlX2Z1bmMocG9ydCk7Cit9CisKKy8qKgorICoJc2Rpb191YXJ0X2FjdGl2YXRlCS0Jc3RhcnQgdXAgaGFyZHdhcmUKKyAqCUB0cG9ydDogdHR5IHBvcnQgdG8gYWN0aXZhdGUKKyAqCUB0dHk6IHR0eSBib3VuZCB0byB0aGlzIHBvcnQKKyAqCisgKglBY3RpdmF0ZSBhIHR0eSBwb3J0LiBUaGUgcG9ydCBsb2NraW5nIGd1YXJhbnRlZXMgdXMgdGhpcyB3aWxsIGJlCisgKglydW4gZXhhY3RseSBvbmNlIHBlciBzZXQgb2Ygb3BlbnMsIGFuZCBpZiBzdWNjZXNzZnVsIHdpbGwgc2VlIHRoZQorICoJc2h1dGRvd24gbWV0aG9kIHJ1biBleGFjdGx5IG9uY2UgdG8gbWF0Y2guIFN0YXJ0IHVwIGFuZCBzaHV0ZG93biBhcmUKKyAqCXByb3RlY3RlZCBmcm9tIGVhY2ggb3RoZXIgYnkgdGhlIGludGVybmFsIGxvY2tpbmcgYW5kIHdpbGwgbm90IHJ1bgorICoJYXQgdGhlIHNhbWUgdGltZSBldmVuIGR1cmluZyBhIGhhbmd1cCBldmVudC4KKyAqCisgKglJZiB3ZSBzdWNjZXNzZnVsbHkgc3RhcnQgdXAgdGhlIHBvcnQgd2UgdGFrZSBhbiBleHRyYSBrcmVmIGFzIHdlCisgKgl3aWxsIGtlZXAgaXQgYXJvdW5kIHVudGlsIHNodXRkb3duIHdoZW4gdGhlIGtyZWYgaXMgZHJvcHBlZC4KKyAqLworCitzdGF0aWMgaW50IHNkaW9fdWFydF9hY3RpdmF0ZShzdHJ1Y3QgdHR5X3BvcnQgKnRwb3J0LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBzZGlvX3VhcnRfcG9ydCAqcG9ydCA9CisJCQljb250YWluZXJfb2YodHBvcnQsIHN0cnVjdCBzZGlvX3VhcnRfcG9ydCwgcG9ydCk7CiAJdW5zaWduZWQgbG9uZyBwYWdlOwogCWludCByZXQ7CiAKQEAgLTU1MSw3ICs2MzksNyBAQAogCSAqIFNldCB0aGUgVFRZIElPIGVycm9yIG1hcmtlciAtIHdlIHdpbGwgb25seSBjbGVhciB0aGlzCiAJICogb25jZSB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBvcGVuZWQgdGhlIHBvcnQuCiAJICovCi0Jc2V0X2JpdChUVFlfSU9fRVJST1IsICZwb3J0LT50dHktPmZsYWdzKTsKKwlzZXRfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpOwogCiAJLyogSW5pdGlhbGlzZSBhbmQgYWxsb2NhdGUgdGhlIHRyYW5zbWl0IGJ1ZmZlci4gKi8KIAlwYWdlID0gX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwpAQCAtNTkyLDE5ICs2ODAsMTkgQEAKIAkgKi8KIAlzZGlvX291dChwb3J0LCBVQVJUX0xDUiwgVUFSVF9MQ1JfV0xFTjgpOwogCi0JcG9ydC0+aWVyID0gVUFSVF9JRVJfUkxTSSB8IFVBUlRfSUVSX1JESSB8IFVBUlRfSUVSX1JUT0lFIHwgVUFSVF9JRVJfVVVFOworCXBvcnQtPmllciA9IFVBUlRfSUVSX1JMU0l8VUFSVF9JRVJfUkRJfFVBUlRfSUVSX1JUT0lFfFVBUlRfSUVSX1VVRTsKIAlwb3J0LT5tY3RybCA9IFRJT0NNX09VVDI7CiAKLQlzZGlvX3VhcnRfY2hhbmdlX3NwZWVkKHBvcnQsIHBvcnQtPnR0eS0+dGVybWlvcywgTlVMTCk7CisJc2Rpb191YXJ0X2NoYW5nZV9zcGVlZChwb3J0LCB0dHktPnRlcm1pb3MsIE5VTEwpOwogCi0JaWYgKHBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKQorCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkKIAkJc2Rpb191YXJ0X3NldF9tY3RybChwb3J0LCBUSU9DTV9SVFMgfCBUSU9DTV9EVFIpOwogCi0JaWYgKHBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpCisJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpCiAJCWlmICghKHNkaW9fdWFydF9nZXRfbWN0cmwocG9ydCkgJiBUSU9DTV9DVFMpKQotCQkJcG9ydC0+dHR5LT5od19zdG9wcGVkID0gMTsKKwkJCXR0eS0+aHdfc3RvcHBlZCA9IDE7CiAKLQljbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmcG9ydC0+dHR5LT5mbGFncyk7CisJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpOwogCiAJLyogS2ljayB0aGUgSVJRIGhhbmRsZXIgb25jZSB3aGlsZSB3ZSdyZSBzdGlsbCBob2xkaW5nIHRoZSBob3N0IGxvY2sgKi8KIAlzZGlvX3VhcnRfaXJxKHBvcnQtPmZ1bmMpOwpAQCAtNjIxLDggKzcwOSwyMCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIHNkaW9fdWFydF9zaHV0ZG93bihzdHJ1Y3Qgc2Rpb191YXJ0X3BvcnQgKnBvcnQpCisvKioKKyAqCXNkaW9fdWFydF9zaHV0ZG93bgktCXN0b3AgaGFyZHdhcmUKKyAqCUB0cG9ydDogdHR5IHBvcnQgdG8gc2h1dCBkb3duCisgKgorICoJRGVhY3RpdmF0ZSBhIHR0eSBwb3J0LiBUaGUgcG9ydCBsb2NraW5nIGd1YXJhbnRlZXMgdXMgdGhpcyB3aWxsIGJlCisgKglydW4gb25seSBpZiBhIHN1Y2Nlc3NmdWwgbWF0Y2hpbmcgYWN0aXZhdGUgYWxyZWFkeSByYW4uIFRoZSB0d28gYXJlCisgKglwcm90ZWN0ZWQgZnJvbSBlYWNoIG90aGVyIGJ5IHRoZSBpbnRlcm5hbCBsb2NraW5nIGFuZCB3aWxsIG5vdCBydW4KKyAqCWF0IHRoZSBzYW1lIHRpbWUgZXZlbiBkdXJpbmcgYSBoYW5ndXAgZXZlbnQuCisgKi8KKworc3RhdGljIHZvaWQgc2Rpb191YXJ0X3NodXRkb3duKHN0cnVjdCB0dHlfcG9ydCAqdHBvcnQpCiB7CisJc3RydWN0IHNkaW9fdWFydF9wb3J0ICpwb3J0ID0KKwkJCWNvbnRhaW5lcl9vZih0cG9ydCwgc3RydWN0IHNkaW9fdWFydF9wb3J0LCBwb3J0KTsKIAlpbnQgcmV0OwogCiAJcmV0ID0gc2Rpb191YXJ0X2NsYWltX2Z1bmMocG9ydCk7CkBAIC02MzEsMTIgKzczMSw2IEBACiAKIAlzZGlvX3VhcnRfc3RvcF9yeChwb3J0KTsKIAotCS8qIFRPRE86IHdhaXQgaGVyZSBmb3IgVFggRklGTyB0byBkcmFpbiAqLwotCi0JLyogVHVybiBvZmYgRFRSIGFuZCBSVFMgZWFybHkuICovCi0JaWYgKHBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKQotCQlzZGlvX3VhcnRfY2xlYXJfbWN0cmwocG9ydCwgVElPQ01fRFRSIHwgVElPQ01fUlRTKTsKLQogCS8qIERpc2FibGUgaW50ZXJydXB0cyBmcm9tIHRoaXMgcG9ydCAqLwogCXNkaW9fcmVsZWFzZV9pcnEocG9ydC0+ZnVuYyk7CiAJcG9ydC0+aWVyID0gMDsKQEAgLTY2MSw3NyArNzU1LDcwIEBACiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBvcnQtPnhtaXQuYnVmKTsKIH0KIAorLyoqCisgKglzZGlvX3VhcnRfaW5zdGFsbAktCWluc3RhbGwgbWV0aG9kCisgKglAZHJpdmVyOiB0aGUgZHJpdmVyIGluIHVzZSAoc2Rpb191YXJ0IGluIG91ciBjYXNlKQorICoJQHR0eTogdGhlIHR0eSBiZWluZyBib3VuZAorICoKKyAqCUxvb2sgdXAgYW5kIGJpbmQgdGhlIHR0eSBhbmQgdGhlIGRyaXZlciB0b2dldGhlci4gSW5pdGlhbGl6ZQorICoJYW55IG5lZWRlZCBwcml2YXRlIGRhdGEgKGluIG91ciBjYXNlIHRoZSB0ZXJtaW9zKQorICovCisKK3N0YXRpYyBpbnQgc2Rpb191YXJ0X2luc3RhbGwoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpbnQgaWR4ID0gdHR5LT5pbmRleDsKKwlzdHJ1Y3Qgc2Rpb191YXJ0X3BvcnQgKnBvcnQgPSBzZGlvX3VhcnRfcG9ydF9nZXQoaWR4KTsKKwlpbnQgcmV0ID0gdHR5X2luaXRfdGVybWlvcyh0dHkpOworCisJaWYgKHJldCA9PSAwKSB7CisJCXR0eV9kcml2ZXJfa3JlZl9nZXQoZHJpdmVyKTsKKwkJdHR5LT5jb3VudCsrOworCQkvKiBUaGlzIGlzIHRoZSByZWYgc2Rpb191YXJ0X3BvcnQgZ2V0IHByb3ZpZGVkICovCisJCXR0eS0+ZHJpdmVyX2RhdGEgPSBwb3J0OworCQlkcml2ZXItPnR0eXNbaWR4XSA9IHR0eTsKKwl9IGVsc2UKKwkJc2Rpb191YXJ0X3BvcnRfcHV0KHBvcnQpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICoJc2Rpb191YXJ0X2NsZWFudXAJLQljYWxsZWQgb24gdGhlIGxhc3QgdHR5IGtyZWYgZHJvcAorICoJQHR0eTogdGhlIHR0eSBiZWluZyBkZXN0cm95ZWQKKyAqCisgKglDYWxsZWQgYXN5bmNocm9ub3VzbHkgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UgdG8gdGhlIHR0eSBpcyBkcm9wcGVkLgorICoJV2UgY2Fubm90IGRlc3Ryb3kgdGhlIHR0eS0+ZHJpdmVyX2RhdGEgcG9ydCBrcmVmIHVudGlsIHRoaXMgcG9pbnQKKyAqLworCitzdGF0aWMgdm9pZCBzZGlvX3VhcnRfY2xlYW51cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBzZGlvX3VhcnRfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7CS8qIEJ1ZyB0cmFwICovCisJc2Rpb191YXJ0X3BvcnRfcHV0KHBvcnQpOworfQorCisvKgorICoJT3Blbi9jbG9zZS9oYW5ndXAgaXMgbm93IGVudGlyZWx5IGJvaWxlcnBsYXRlCisgKi8KKwogc3RhdGljIGludCBzZGlvX3VhcnRfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlzdHJ1Y3Qgc2Rpb191YXJ0X3BvcnQgKnBvcnQ7Ci0JaW50IHJldDsKLQotCXBvcnQgPSBzZGlvX3VhcnRfcG9ydF9nZXQodHR5LT5pbmRleCk7Ci0JaWYgKCFwb3J0KQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCW11dGV4X2xvY2soJnBvcnQtPm9wZW5fbG9jayk7Ci0KLQkvKgotCSAqIE1ha2Ugc3VyZSBub3QgdG8gbWVzcyB1cCB3aXRoIGEgZGVhZCBwb3J0Ci0JICogd2hpY2ggaGFzIG5vdCBiZWVuIGNsb3NlZCB5ZXQuCi0JICovCi0JaWYgKHR0eS0+ZHJpdmVyX2RhdGEgJiYgdHR5LT5kcml2ZXJfZGF0YSAhPSBwb3J0KSB7Ci0JCW11dGV4X3VubG9jaygmcG9ydC0+b3Blbl9sb2NrKTsKLQkJc2Rpb191YXJ0X3BvcnRfcHV0KHBvcnQpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCWlmICghcG9ydC0+b3BlbmVkKSB7Ci0JCXR0eS0+ZHJpdmVyX2RhdGEgPSBwb3J0OwotCQlwb3J0LT50dHkgPSB0dHk7Ci0JCXJldCA9IHNkaW9fdWFydF9zdGFydHVwKHBvcnQpOwotCQlpZiAocmV0KSB7Ci0JCQl0dHktPmRyaXZlcl9kYXRhID0gTlVMTDsKLQkJCXBvcnQtPnR0eSA9IE5VTEw7Ci0JCQltdXRleF91bmxvY2soJnBvcnQtPm9wZW5fbG9jayk7Ci0JCQlzZGlvX3VhcnRfcG9ydF9wdXQocG9ydCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCXBvcnQtPm9wZW5lZCsrOwotCW11dGV4X3VubG9jaygmcG9ydC0+b3Blbl9sb2NrKTsKLQlyZXR1cm4gMDsKKwlzdHJ1Y3Qgc2Rpb191YXJ0X3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOworCXJldHVybiB0dHlfcG9ydF9vcGVuKCZwb3J0LT5wb3J0LCB0dHksIGZpbHApOwogfQogCiBzdGF0aWMgdm9pZCBzZGlvX3VhcnRfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQogewogCXN0cnVjdCBzZGlvX3VhcnRfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0KLQlpZiAoIXBvcnQpCi0JCXJldHVybjsKLQotCW11dGV4X2xvY2soJnBvcnQtPm9wZW5fbG9jayk7Ci0JQlVHX09OKCFwb3J0LT5vcGVuZWQpOwotCi0JLyoKLQkgKiBUaGlzIGlzIG1lc3N5LiAgVGhlIHR0eSBsYXllciBjYWxscyB1cyBldmVuIHdoZW4gb3BlbigpCi0JICogcmV0dXJuZWQgYW4gZXJyb3IuICBJZ25vcmUgdGhpcyBjbG9zZSByZXF1ZXN0IGlmIHR0eS0+Y291bnQKLQkgKiBpcyBsYXJnZXIgdGhhbiBwb3J0LT5jb3VudC4KLQkgKi8KLQlpZiAodHR5LT5jb3VudCA+IHBvcnQtPm9wZW5lZCkgewotCQltdXRleF91bmxvY2soJnBvcnQtPm9wZW5fbG9jayk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoLS1wb3J0LT5vcGVuZWQgPT0gMCkgewotCQl0dHktPmNsb3NpbmcgPSAxOwotCQlzZGlvX3VhcnRfc2h1dGRvd24ocG9ydCk7Ci0JCXR0eV9sZGlzY19mbHVzaCh0dHkpOwotCQlwb3J0LT50dHkgPSBOVUxMOwotCQl0dHktPmRyaXZlcl9kYXRhID0gTlVMTDsKLQkJdHR5LT5jbG9zaW5nID0gMDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZwb3J0LT5vcGVuX2xvY2spOwotCXNkaW9fdWFydF9wb3J0X3B1dChwb3J0KTsKKwl0dHlfcG9ydF9jbG9zZSgmcG9ydC0+cG9ydCwgdHR5LCBmaWxwKTsKIH0KIAotc3RhdGljIGludCBzZGlvX3VhcnRfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKK3N0YXRpYyB2b2lkIHNkaW9fdWFydF9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3Qgc2Rpb191YXJ0X3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOworCXR0eV9wb3J0X2hhbmd1cCgmcG9ydC0+cG9ydCk7Cit9CisKK3N0YXRpYyBpbnQgc2Rpb191YXJ0X3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKIAkJCSAgIGludCBjb3VudCkKIHsKIAlzdHJ1Y3Qgc2Rpb191YXJ0X3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwpAQCAtNzU2LDcgKzg0Myw3IEBACiAJfQogCXNwaW5fdW5sb2NrKCZwb3J0LT53cml0ZV9sb2NrKTsKIAotCWlmICggIShwb3J0LT5pZXIgJiBVQVJUX0lFUl9USFJJKSkgeworCWlmICghKHBvcnQtPmllciAmIFVBUlRfSUVSX1RIUkkpKSB7CiAJCWludCBlcnIgPSBzZGlvX3VhcnRfY2xhaW1fZnVuYyhwb3J0KTsKIAkJaWYgKCFlcnIpIHsKIAkJCXNkaW9fdWFydF9zdGFydF90eChwb3J0KTsKQEAgLTg0MywxNyArOTMwLDEyIEBACiAJc2Rpb191YXJ0X3JlbGVhc2VfZnVuYyhwb3J0KTsKIH0KIAotc3RhdGljIHZvaWQgc2Rpb191YXJ0X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCitzdGF0aWMgdm9pZCBzZGlvX3VhcnRfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCQkJCXN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJc3RydWN0IHNkaW9fdWFydF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBpbnQgY2ZsYWcgPSB0dHktPnRlcm1pb3MtPmNfY2ZsYWc7CiAKLSNkZWZpbmUgUkVMRVZBTlRfSUZMQUcoaWZsYWcpCSgoaWZsYWcpICYgKElHTkJSS3xCUktJTlR8SUdOUEFSfFBBUk1SS3xJTlBDSykpCi0KLQlpZiAoKGNmbGFnIF4gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcpID09IDAgJiYKLQkgICAgUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLT5jX2lmbGFnIF4gb2xkX3Rlcm1pb3MtPmNfaWZsYWcpID09IDApCi0JCXJldHVybjsKLQogCWlmIChzZGlvX3VhcnRfY2xhaW1fZnVuYyhwb3J0KSAhPSAwKQogCQlyZXR1cm47CiAKQEAgLTkyOCw3ICsxMDEwLDcgQEAKIAlpbnQgcmVzdWx0OwogCiAJcmVzdWx0ID0gc2Rpb191YXJ0X2NsYWltX2Z1bmMocG9ydCk7Ci0JaWYoIXJlc3VsdCkgeworCWlmICghcmVzdWx0KSB7CiAJCXNkaW9fdWFydF91cGRhdGVfbWN0cmwocG9ydCwgc2V0LCBjbGVhcik7CiAJCXNkaW9fdWFydF9yZWxlYXNlX2Z1bmMocG9ydCk7CiAJfQpAQCAtOTQ2LDcgKzEwMjgsNyBAQAogCQlzdHJ1Y3Qgc2Rpb191YXJ0X3BvcnQgKnBvcnQgPSBzZGlvX3VhcnRfcG9ydF9nZXQoaSk7CiAJCWlmIChwb3J0KSB7CiAJCQlzZXFfcHJpbnRmKG0sICIlZDogdWFydDpTRElPIiwgaSk7Ci0JCQlpZihjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CisJCQlpZiAoY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgewogCQkJCXNlcV9wcmludGYobSwgIiB0eDolZCByeDolZCIsCiAJCQkJCSAgICAgIHBvcnQtPmljb3VudC50eCwgcG9ydC0+aWNvdW50LnJ4KTsKIAkJCQlpZiAocG9ydC0+aWNvdW50LmZyYW1lKQpAQCAtOTk0LDYgKzEwNzYsMTMgQEAKIAkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCB0dHlfcG9ydF9vcGVyYXRpb25zIHNkaW9fdWFydF9wb3J0X29wcyA9IHsKKwkuZHRyX3J0cyA9IHVhcnRfZHRyX3J0cywKKwkuY2Fycmllcl9yYWlzZWQgPSB1YXJ0X2NhcnJpZXJfcmFpc2VkLAorCS5zaHV0ZG93biA9IHNkaW9fdWFydF9zaHV0ZG93biwKKwkuYWN0aXZhdGUgPSBzZGlvX3VhcnRfYWN0aXZhdGUsCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHR0eV9vcGVyYXRpb25zIHNkaW9fdWFydF9vcHMgPSB7CiAJLm9wZW4JCQk9IHNkaW9fdWFydF9vcGVuLAogCS5jbG9zZQkJCT0gc2Rpb191YXJ0X2Nsb3NlLApAQCAtMTAwNCw5ICsxMDkzLDEyIEBACiAJLnRocm90dGxlCQk9IHNkaW9fdWFydF90aHJvdHRsZSwKIAkudW50aHJvdHRsZQkJPSBzZGlvX3VhcnRfdW50aHJvdHRsZSwKIAkuc2V0X3Rlcm1pb3MJCT0gc2Rpb191YXJ0X3NldF90ZXJtaW9zLAorCS5oYW5ndXAJCQk9IHNkaW9fdWFydF9oYW5ndXAsCiAJLmJyZWFrX2N0bAkJPSBzZGlvX3VhcnRfYnJlYWtfY3RsLAogCS50aW9jbWdldAkJPSBzZGlvX3VhcnRfdGlvY21nZXQsCiAJLnRpb2Ntc2V0CQk9IHNkaW9fdWFydF90aW9jbXNldCwKKwkuaW5zdGFsbAkJPSBzZGlvX3VhcnRfaW5zdGFsbCwKKwkuY2xlYW51cAkJPSBzZGlvX3VhcnRfY2xlYW51cCwKIAkucHJvY19mb3BzCQk9ICZzZGlvX3VhcnRfcHJvY19mb3BzLAogfTsKIApAQCAtMTA0Myw3ICsxMTM1LDcgQEAKIAkJfQogCQlpZiAoIXRwbCkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgICIlczogY2FuJ3QgZmluZCB0dXBsZSAweDkxIHN1YnR1cGxlIDAgKFNVQlRQTF9TSU9SRUcpIGZvciBHUFMgY2xhc3NcbiIsCisgICAgICAgIiVzOiBjYW4ndCBmaW5kIHR1cGxlIDB4OTEgc3VidHVwbGUgMCAoU1VCVFBMX1NJT1JFRykgZm9yIEdQUyBjbGFzc1xuIiwKIAkJCSAgICAgICBzZGlvX2Z1bmNfaWQoZnVuYykpOwogCQkJa2ZyZWUocG9ydCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEwNjgsMTMgKzExNjAsMTYgQEAKIAogCXBvcnQtPmZ1bmMgPSBmdW5jOwogCXNkaW9fc2V0X2RydmRhdGEoZnVuYywgcG9ydCk7CisJdHR5X3BvcnRfaW5pdCgmcG9ydC0+cG9ydCk7CisJcG9ydC0+cG9ydC5vcHMgPSAmc2Rpb191YXJ0X3BvcnRfb3BzOwogCiAJcmV0ID0gc2Rpb191YXJ0X2FkZF9wb3J0KHBvcnQpOwogCWlmIChyZXQpIHsKIAkJa2ZyZWUocG9ydCk7CiAJfSBlbHNlIHsKIAkJc3RydWN0IGRldmljZSAqZGV2OwotCQlkZXYgPSB0dHlfcmVnaXN0ZXJfZGV2aWNlKHNkaW9fdWFydF90dHlfZHJpdmVyLCBwb3J0LT5pbmRleCwgJmZ1bmMtPmRldik7CisJCWRldiA9IHR0eV9yZWdpc3Rlcl9kZXZpY2Uoc2Rpb191YXJ0X3R0eV9kcml2ZXIsCisJCQkJCQlwb3J0LT5pbmRleCwgJmZ1bmMtPmRldik7CiAJCWlmIChJU19FUlIoZGV2KSkgewogCQkJc2Rpb191YXJ0X3BvcnRfcmVtb3ZlKHBvcnQpOwogCQkJcmV0ID0gUFRSX0VSUihkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9tc21fc2RjYy5jIGIvZHJpdmVycy9tbWMvaG9zdC9tc21fc2RjYy5jCmluZGV4IGRiYTQ2MDAuLmIzMTk0NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvbXNtX3NkY2MuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L21zbV9zZGNjLmMKQEAgLTM4LDEwICszOCw5IEBACiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSA8YXNtL3NpemVzLmg+CiAKLSNpbmNsdWRlIDxhc20vbWFjaC9tbWMuaD4KKyNpbmNsdWRlIDxtYWNoL21tYy5oPgogI2luY2x1ZGUgPG1hY2gvbXNtX2lvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9kbWEuaD4KLSNpbmNsdWRlIDxtYWNoL2h0Y19wd3JzaW5rLmg+CiAKICNpbmNsdWRlICJtc21fc2RjYy5oIgogCkBAIC03NzUsMTMgKzc3NCwxMSBAQAogCiAJc3dpdGNoIChpb3MtPnBvd2VyX21vZGUpIHsKIAljYXNlIE1NQ19QT1dFUl9PRkY6Ci0JCWh0Y19wd3JzaW5rX3NldChQV1JTSU5LX1NEQ0FSRCwgMCk7CiAJCWJyZWFrOwogCWNhc2UgTU1DX1BPV0VSX1VQOgogCQlwd3IgfD0gTUNJX1BXUl9VUDsKIAkJYnJlYWs7CiAJY2FzZSBNTUNfUE9XRVJfT046Ci0JCWh0Y19wd3JzaW5rX3NldChQV1JTSU5LX1NEQ0FSRCwgMTAwKTsKIAkJcHdyIHw9IE1DSV9QV1JfT047CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvb2ZfbW1jX3NwaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9vZl9tbWNfc3BpLmMKaW5kZXggMGM0NGQ1Ni4uMGM3YTYzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9vZl9tbWNfc3BpLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9vZl9tbWNfc3BpLmMKQEAgLTIyLDYgKzIyLDggQEAKICNpbmNsdWRlIDxsaW51eC9tbWMvY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CiAKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwogZW51bSB7CiAJQ0RfR1BJTyA9IDAsCiAJV1BfR1BJTywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L0tjb25maWcgYi9kcml2ZXJzL25ldC9LY29uZmlnCmluZGV4IDBiYmQ1YWUuLmE1YmU5YWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvS2NvbmZpZwpAQCAtMjY5Niw2ICsyNjk2LDcgQEAKIGNvbmZpZyBOSVUKIAl0cmlzdGF0ZSAiU3VuIE5lcHR1bmUgMTBHYml0IEV0aGVybmV0IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQQ0kKKwlzZWxlY3QgQ1JDMzIKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgY2FyZHMgYmFzZWQgdXBvbiBTdW4ncwogCSAgTmVwdHVuZSBjaGlwc2V0LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJtL2l4cDR4eF9ldGguYyBiL2RyaXZlcnMvbmV0L2FybS9peHA0eHhfZXRoLmMKaW5kZXggNjkxYjgxZS4uYzNkZmJkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJtL2l4cDR4eF9ldGguYworKysgYi9kcml2ZXJzL25ldC9hcm0vaXhwNHh4X2V0aC5jCkBAIC0zMjIsNyArMzIyLDcgQEAKIAlyZXQgPSBpeHA0eHhfbWRpb19jbWQoYnVzLCBwaHlfaWQsIGxvY2F0aW9uLCAxLCB2YWwpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kaW9fbG9jaywgZmxhZ3MpOwogI2lmIERFQlVHX01ESU8KLQlwcmludGsoS0VSTl9ERUJVRyAiJXMgIyVpOiBNSUkgcmVhZCBbJWldIDwtIDB4JVgsIGVyciA9ICVpXG4iLAorCXByaW50ayhLRVJOX0RFQlVHICIlcyAjJWk6IE1JSSB3cml0ZSBbJWldIDwtIDB4JVgsIGVyciA9ICVpXG4iLAogCSAgICAgICBidXMtPm5hbWUsIHBoeV9pZCwgbG9jYXRpb24sIHZhbCwgcmV0KTsKICNlbmRpZgogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGwxYy9hdGwxYy5oIGIvZHJpdmVycy9uZXQvYXRsMWMvYXRsMWMuaAppbmRleCBhMzQ4YTIyLi5lZmU1NDM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdGwxYy9hdGwxYy5oCisrKyBiL2RyaXZlcnMvbmV0L2F0bDFjL2F0bDFjLmgKQEAgLTQ3OSw2ICs0NzksOSBAQAogI2RlZmluZSBBVEwxQ19QQ0lNQVBfUEFHRQkJMHgwMDA4CiAjZGVmaW5lIEFUTDFDX1BDSU1BUF9UWVBFX01BU0sJCTB4MDAwQwogCisjZGVmaW5lIEFUTDFDX1BDSU1BUF9UT0RFVklDRQkJMHgwMDEwCisjZGVmaW5lIEFUTDFDX1BDSU1BUF9GUk9NREVWSUNFCQkweDAwMjAKKyNkZWZpbmUgQVRMMUNfUENJTUFQX0RJUkVDVElPTl9NQVNLCTB4MDAzMAogCWRtYV9hZGRyX3QgZG1hOwogfTsKIApAQCAtNDg3LDkgKzQ5MCwxMSBAQAogCSgoYnVmZiktPmZsYWdzKSB8PSAoc3RhdGUpOwkJCVwKIAl9IHdoaWxlICgwKQogCi0jZGVmaW5lIEFUTDFDX1NFVF9QQ0lNQVBfVFlQRShidWZmLCB0eXBlKSBkbyB7CQlcCi0JKChidWZmKS0+ZmxhZ3MpICY9IH5BVEwxQ19QQ0lNQVBfVFlQRV9NQVNLOwlcCi0JKChidWZmKS0+ZmxhZ3MpIHw9ICh0eXBlKTsJCQlcCisjZGVmaW5lIEFUTDFDX1NFVF9QQ0lNQVBfVFlQRShidWZmLCB0eXBlLCBkaXJlY3Rpb24pIGRvIHsJXAorCSgoYnVmZiktPmZsYWdzKSAmPSB+QVRMMUNfUENJTUFQX1RZUEVfTUFTSzsJCVwKKwkoKGJ1ZmYpLT5mbGFncykgfD0gKHR5cGUpOwkJCQlcCisJKChidWZmKS0+ZmxhZ3MpICY9IH5BVEwxQ19QQ0lNQVBfRElSRUNUSU9OX01BU0s7CVwKKwkoKGJ1ZmYpLT5mbGFncykgfD0gKGRpcmVjdGlvbik7CQkJCVwKIAl9IHdoaWxlICgwKQogCiAvKiB0cmFuc2ltaXQgcGFja2V0IGRlc2NyaXB0b3IgKHRwZCkgcmluZyAqLwpAQCAtNTUwLDYgKzU1NSw5IEBACiAjZGVmaW5lIF9fQVRfVEVTVElORyAgICAgICAgMHgwMDAxCiAjZGVmaW5lIF9fQVRfUkVTRVRUSU5HICAgICAgMHgwMDAyCiAjZGVmaW5lIF9fQVRfRE9XTiAgICAgICAgICAgMHgwMDAzCisJdTggd29ya19ldmVudDsKKyNkZWZpbmUgQVRMMUNfV09SS19FVkVOVF9SRVNFVCAJCTB4MDEKKyNkZWZpbmUgQVRMMUNfV09SS19FVkVOVF9MSU5LX0NIQU5HRQkweDAyCiAJdTMyIG1zZ19lbmFibGU7CiAKIAlib29sIGhhdmVfbXNpOwpAQCAtNTYxLDggKzU2OSw3IEBACiAJc3BpbmxvY2tfdCB0eF9sb2NrOwogCWF0b21pY190IGlycV9zZW07CiAKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzZXRfdGFzazsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbGlua19jaGdfdGFzazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY29tbW9uX3Rhc2s7CiAJc3RydWN0IHRpbWVyX2xpc3Qgd2F0Y2hkb2dfdGltZXI7CiAJc3RydWN0IHRpbWVyX2xpc3QgcGh5X2NvbmZpZ190aW1lcjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXRsMWMvYXRsMWNfbWFpbi5jIGIvZHJpdmVycy9uZXQvYXRsMWMvYXRsMWNfbWFpbi5jCmluZGV4IDZlYjkyNDEuLjJmNGJlNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2F0bDFjL2F0bDFjX21haW4uYworKysgYi9kcml2ZXJzL25ldC9hdGwxYy9hdGwxY19tYWluLmMKQEAgLTE5OCwyNyArMTk4LDEyIEBACiAKIHZvaWQgYXRsMWNfcmVpbml0X2xvY2tlZChzdHJ1Y3QgYXRsMWNfYWRhcHRlciAqYWRhcHRlcikKIHsKLQogCVdBUk5fT04oaW5faW50ZXJydXB0KCkpOwogCWF0bDFjX2Rvd24oYWRhcHRlcik7CiAJYXRsMWNfdXAoYWRhcHRlcik7CiAJY2xlYXJfYml0KF9fQVRfUkVTRVRUSU5HLCAmYWRhcHRlci0+ZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCBhdGwxY19yZXNldF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgYXRsMWNfYWRhcHRlciAqYWRhcHRlcjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwotCi0JYWRhcHRlciA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXRsMWNfYWRhcHRlciwgcmVzZXRfdGFzayk7Ci0JbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwotCi0JbmV0aWZfZGV2aWNlX2RldGFjaChuZXRkZXYpOwotCWF0bDFjX2Rvd24oYWRhcHRlcik7Ci0JYXRsMWNfdXAoYWRhcHRlcik7Ci0JbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRkZXYpOwotfQotCiBzdGF0aWMgdm9pZCBhdGwxY19jaGVja19saW5rX3N0YXR1cyhzdHJ1Y3QgYXRsMWNfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlzdHJ1Y3QgYXRsMWNfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwpAQCAtMjc1LDE4ICsyNjAsNiBAQAogCX0KIH0KIAotLyoKLSAqIGF0bDFjX2xpbmtfY2hnX3Rhc2sgLSBkZWFsIHdpdGggbGluayBjaGFuZ2UgZXZlbnQgT3V0IG9mIGludGVycnVwdCBjb250ZXh0Ci0gKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCi0gKi8KLXN0YXRpYyB2b2lkIGF0bDFjX2xpbmtfY2hnX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhdGwxY19hZGFwdGVyICphZGFwdGVyOwotCi0JYWRhcHRlciA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXRsMWNfYWRhcHRlciwgbGlua19jaGdfdGFzayk7Ci0JYXRsMWNfY2hlY2tfbGlua19zdGF0dXMoYWRhcHRlcik7Ci19Ci0KIHN0YXRpYyB2b2lkIGF0bDFjX2xpbmtfY2hnX2V2ZW50KHN0cnVjdCBhdGwxY19hZGFwdGVyICphZGFwdGVyKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CkBAIC0zMTEsMTkgKzI4NCwzOSBAQAogCQkJYWRhcHRlci0+bGlua19zcGVlZCA9IFNQRUVEXzA7CiAJCX0KIAl9Ci0Jc2NoZWR1bGVfd29yaygmYWRhcHRlci0+bGlua19jaGdfdGFzayk7CisKKwlhZGFwdGVyLT53b3JrX2V2ZW50IHw9IEFUTDFDX1dPUktfRVZFTlRfTElOS19DSEFOR0U7CisJc2NoZWR1bGVfd29yaygmYWRhcHRlci0+Y29tbW9uX3Rhc2spOwogfQogCitzdGF0aWMgdm9pZCBhdGwxY19jb21tb25fdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGF0bDFjX2FkYXB0ZXIgKmFkYXB0ZXI7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKworCWFkYXB0ZXIgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0bDFjX2FkYXB0ZXIsIGNvbW1vbl90YXNrKTsKKwluZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisKKwlpZiAoYWRhcHRlci0+d29ya19ldmVudCAmIEFUTDFDX1dPUktfRVZFTlRfUkVTRVQpIHsKKwkJbmV0aWZfZGV2aWNlX2RldGFjaChuZXRkZXYpOworCQlhdGwxY19kb3duKGFkYXB0ZXIpOworCQlhdGwxY191cChhZGFwdGVyKTsKKwkJbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRkZXYpOworCQlyZXR1cm47CisJfQorCisJaWYgKGFkYXB0ZXItPndvcmtfZXZlbnQgJiBBVEwxQ19XT1JLX0VWRU5UX0xJTktfQ0hBTkdFKQorCQlhdGwxY19jaGVja19saW5rX3N0YXR1cyhhZGFwdGVyKTsKKworCXJldHVybjsKK30KKworCiBzdGF0aWMgdm9pZCBhdGwxY19kZWxfdGltZXIoc3RydWN0IGF0bDFjX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPnBoeV9jb25maWdfdGltZXIpOwogfQogCi1zdGF0aWMgdm9pZCBhdGwxY19jYW5jZWxfd29yayhzdHJ1Y3QgYXRsMWNfYWRhcHRlciAqYWRhcHRlcikKLXsKLQljYW5jZWxfd29ya19zeW5jKCZhZGFwdGVyLT5yZXNldF90YXNrKTsKLQljYW5jZWxfd29ya19zeW5jKCZhZGFwdGVyLT5saW5rX2NoZ190YXNrKTsKLX0KIAogLyoKICAqIGF0bDFjX3R4X3RpbWVvdXQgLSBSZXNwb25kIHRvIGEgVHggSGFuZwpAQCAtMzM0LDcgKzMyNyw4IEBACiAJc3RydWN0IGF0bDFjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCiAJLyogRG8gdGhlIHJlc2V0IG91dHNpZGUgb2YgaW50ZXJydXB0IGNvbnRleHQgKi8KLQlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT5yZXNldF90YXNrKTsKKwlhZGFwdGVyLT53b3JrX2V2ZW50IHw9IEFUTDFDX1dPUktfRVZFTlRfUkVTRVQ7CisJc2NoZWR1bGVfd29yaygmYWRhcHRlci0+Y29tbW9uX3Rhc2spOwogfQogCiAvKgpAQCAtNzEzLDE1ICs3MDcsMjEgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhdGwxY19jbGVhbl9idWZmZXIoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJc3RydWN0IGF0bDFjX2J1ZmZlciAqYnVmZmVyX2luZm8sIGludCBpbl9pcnEpCiB7CisJdTE2IHBjaV9kcmllY3Rpb247CiAJaWYgKGJ1ZmZlcl9pbmZvLT5mbGFncyAmIEFUTDFDX0JVRkZFUl9GUkVFKQogCQlyZXR1cm47CiAJaWYgKGJ1ZmZlcl9pbmZvLT5kbWEpIHsKKwkJaWYgKGJ1ZmZlcl9pbmZvLT5mbGFncyAmIEFUTDFDX1BDSU1BUF9GUk9NREVWSUNFKQorCQkJcGNpX2RyaWVjdGlvbiA9IFBDSV9ETUFfRlJPTURFVklDRTsKKwkJZWxzZQorCQkJcGNpX2RyaWVjdGlvbiA9IFBDSV9ETUFfVE9ERVZJQ0U7CisKIAkJaWYgKGJ1ZmZlcl9pbmZvLT5mbGFncyAmIEFUTDFDX1BDSU1BUF9TSU5HTEUpCiAJCQlwY2lfdW5tYXBfc2luZ2xlKHBkZXYsIGJ1ZmZlcl9pbmZvLT5kbWEsCi0JCQkJCWJ1ZmZlcl9pbmZvLT5sZW5ndGgsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCQlidWZmZXJfaW5mby0+bGVuZ3RoLCBwY2lfZHJpZWN0aW9uKTsKIAkJZWxzZSBpZiAoYnVmZmVyX2luZm8tPmZsYWdzICYgQVRMMUNfUENJTUFQX1BBR0UpCiAJCQlwY2lfdW5tYXBfcGFnZShwZGV2LCBidWZmZXJfaW5mby0+ZG1hLAotCQkJCQlidWZmZXJfaW5mby0+bGVuZ3RoLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQkJYnVmZmVyX2luZm8tPmxlbmd0aCwgcGNpX2RyaWVjdGlvbik7CiAJfQogCWlmIChidWZmZXJfaW5mby0+c2tiKSB7CiAJCWlmIChpbl9pcnEpCkBAIC0xNTMzLDcgKzE1MzMsOCBAQAogCQkJLyogcmVzZXQgTUFDICovCiAJCQlody0+aW50cl9tYXNrICY9IH5JU1JfRVJST1I7CiAJCQlBVF9XUklURV9SRUcoaHcsIFJFR19JTVIsIGh3LT5pbnRyX21hc2spOwotCQkJc2NoZWR1bGVfd29yaygmYWRhcHRlci0+cmVzZXRfdGFzayk7CisJCQlhZGFwdGVyLT53b3JrX2V2ZW50IHw9IEFUTDFDX1dPUktfRVZFTlRfUkVTRVQ7CisJCQlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT5jb21tb25fdGFzayk7CiAJCQlicmVhazsKIAkJfQogCkBAIC0xNjA2LDcgKzE2MDcsOCBAQAogCQlidWZmZXJfaW5mby0+ZG1hID0gcGNpX21hcF9zaW5nbGUocGRldiwgdmlyX2FkZHIsCiAJCQkJCQlidWZmZXJfaW5mby0+bGVuZ3RoLAogCQkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJQVRMMUNfU0VUX1BDSU1BUF9UWVBFKGJ1ZmZlcl9pbmZvLCBBVEwxQ19QQ0lNQVBfU0lOR0xFKTsKKwkJQVRMMUNfU0VUX1BDSU1BUF9UWVBFKGJ1ZmZlcl9pbmZvLCBBVEwxQ19QQ0lNQVBfU0lOR0xFLAorCQkJQVRMMUNfUENJTUFQX0ZST01ERVZJQ0UpOwogCQlyZmRfZGVzYy0+YnVmZmVyX2FkZHIgPSBjcHVfdG9fbGU2NChidWZmZXJfaW5mby0+ZG1hKTsKIAkJcmZkX25leHRfdG9fdXNlID0gbmV4dF9uZXh0OwogCQlpZiAoKytuZXh0X25leHQgPT0gcmZkX3JpbmctPmNvdW50KQpAQCAtMTk2Nyw3ICsxOTY5LDggQEAKIAkJYnVmZmVyX2luZm8tPmRtYSA9IHBjaV9tYXBfc2luZ2xlKGFkYXB0ZXItPnBkZXYsCiAJCQkJCXNrYi0+ZGF0YSwgaGRyX2xlbiwgUENJX0RNQV9UT0RFVklDRSk7CiAJCUFUTDFDX1NFVF9CVUZGRVJfU1RBVEUoYnVmZmVyX2luZm8sIEFUTDFDX0JVRkZFUl9CVVNZKTsKLQkJQVRMMUNfU0VUX1BDSU1BUF9UWVBFKGJ1ZmZlcl9pbmZvLCBBVEwxQ19QQ0lNQVBfU0lOR0xFKTsKKwkJQVRMMUNfU0VUX1BDSU1BUF9UWVBFKGJ1ZmZlcl9pbmZvLCBBVEwxQ19QQ0lNQVBfU0lOR0xFLAorCQkJQVRMMUNfUENJTUFQX1RPREVWSUNFKTsKIAkJbWFwcGVkX2xlbiArPSBtYXBfbGVuOwogCQl1c2VfdHBkLT5idWZmZXJfYWRkciA9IGNwdV90b19sZTY0KGJ1ZmZlcl9pbmZvLT5kbWEpOwogCQl1c2VfdHBkLT5idWZmZXJfbGVuID0gY3B1X3RvX2xlMTYoYnVmZmVyX2luZm8tPmxlbmd0aCk7CkBAIC0xOTg4LDcgKzE5OTEsOCBAQAogCQkJcGNpX21hcF9zaW5nbGUoYWRhcHRlci0+cGRldiwgc2tiLT5kYXRhICsgbWFwcGVkX2xlbiwKIAkJCQkJYnVmZmVyX2luZm8tPmxlbmd0aCwgUENJX0RNQV9UT0RFVklDRSk7CiAJCUFUTDFDX1NFVF9CVUZGRVJfU1RBVEUoYnVmZmVyX2luZm8sIEFUTDFDX0JVRkZFUl9CVVNZKTsKLQkJQVRMMUNfU0VUX1BDSU1BUF9UWVBFKGJ1ZmZlcl9pbmZvLCBBVEwxQ19QQ0lNQVBfU0lOR0xFKTsKKwkJQVRMMUNfU0VUX1BDSU1BUF9UWVBFKGJ1ZmZlcl9pbmZvLCBBVEwxQ19QQ0lNQVBfU0lOR0xFLAorCQkJQVRMMUNfUENJTUFQX1RPREVWSUNFKTsKIAkJdXNlX3RwZC0+YnVmZmVyX2FkZHIgPSBjcHVfdG9fbGU2NChidWZmZXJfaW5mby0+ZG1hKTsKIAkJdXNlX3RwZC0+YnVmZmVyX2xlbiAgPSBjcHVfdG9fbGUxNihidWZmZXJfaW5mby0+bGVuZ3RoKTsKIAl9CkBAIC0yMDA5LDcgKzIwMTMsOCBAQAogCQkJCQlidWZmZXJfaW5mby0+bGVuZ3RoLAogCQkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKIAkJQVRMMUNfU0VUX0JVRkZFUl9TVEFURShidWZmZXJfaW5mbywgQVRMMUNfQlVGRkVSX0JVU1kpOwotCQlBVEwxQ19TRVRfUENJTUFQX1RZUEUoYnVmZmVyX2luZm8sIEFUTDFDX1BDSU1BUF9QQUdFKTsKKwkJQVRMMUNfU0VUX1BDSU1BUF9UWVBFKGJ1ZmZlcl9pbmZvLCBBVEwxQ19QQ0lNQVBfUEFHRSwKKwkJCUFUTDFDX1BDSU1BUF9UT0RFVklDRSk7CiAJCXVzZV90cGQtPmJ1ZmZlcl9hZGRyID0gY3B1X3RvX2xlNjQoYnVmZmVyX2luZm8tPmRtYSk7CiAJCXVzZV90cGQtPmJ1ZmZlcl9sZW4gID0gY3B1X3RvX2xlMTYoYnVmZmVyX2luZm8tPmxlbmd0aCk7CiAJfQpAQCAtMjE5OCw4ICsyMjAzLDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwogCiAJYXRsMWNfZGVsX3RpbWVyKGFkYXB0ZXIpOwotCWF0bDFjX2NhbmNlbF93b3JrKGFkYXB0ZXIpOwotCisJYWRhcHRlci0+d29ya19ldmVudCA9IDA7IC8qIGNsZWFyIGFsbCBldmVudCAqLwogCS8qIHNpZ25hbCB0aGF0IHdlJ3JlIGRvd24gc28gdGhlIGludGVycnVwdCBoYW5kbGVyIGRvZXMgbm90CiAJICogcmVzY2hlZHVsZSBvdXIgd2F0Y2hkb2cgdGltZXIgKi8KIAlzZXRfYml0KF9fQVRfRE9XTiwgJmFkYXB0ZXItPmZsYWdzKTsKQEAgLTI1OTksOCArMjYwMyw4IEBACiAJCQlhZGFwdGVyLT5ody5tYWNfYWRkcls0XSwgYWRhcHRlci0+aHcubWFjX2FkZHJbNV0pOwogCiAJYXRsMWNfaHdfc2V0X21hY19hZGRyKCZhZGFwdGVyLT5odyk7Ci0JSU5JVF9XT1JLKCZhZGFwdGVyLT5yZXNldF90YXNrLCBhdGwxY19yZXNldF90YXNrKTsKLQlJTklUX1dPUksoJmFkYXB0ZXItPmxpbmtfY2hnX3Rhc2ssIGF0bDFjX2xpbmtfY2hnX3Rhc2spOworCUlOSVRfV09SSygmYWRhcHRlci0+Y29tbW9uX3Rhc2ssIGF0bDFjX2NvbW1vbl90YXNrKTsKKwlhZGFwdGVyLT53b3JrX2V2ZW50ID0gMDsKIAllcnIgPSByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgInJlZ2lzdGVyIG5ldGRldmljZSBmYWlsZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYjQ0LmMgYi9kcml2ZXJzL25ldC9iNDQuYwppbmRleCAyYTkxMzIzLi40ODY5YWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9iNDQuYworKysgYi9kcml2ZXJzL25ldC9iNDQuYwpAQCAtMTUwNSw4ICsxNTA1LDcgQEAKIAkJZm9yIChrID0gMDsgazwgZXRoYWRkcl9ieXRlczsgaysrKSB7CiAJCQlwcGF0dGVybltvZmZzZXQgKyBtYWdpY3N5bmMgKwogCQkJCShqICogRVRIX0FMRU4pICsga10gPSBtYWNhZGRyW2tdOwotCQkJbGVuKys7Ci0JCQlzZXRfYml0KGxlbiwgKHVuc2lnbmVkIGxvbmcgKikgcG1hc2spOworCQkJc2V0X2JpdChsZW4rKywgKHVuc2lnbmVkIGxvbmcgKikgcG1hc2spOwogCQl9CiAJfQogCXJldHVybiBsZW4gLSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYmVuZXQvYmVfbWFpbi5jIGIvZHJpdmVycy9uZXQvYmVuZXQvYmVfbWFpbi5jCmluZGV4IDI0YzdkOTkuLjNhMWY3OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JlbmV0L2JlX21haW4uYworKysgYi9kcml2ZXJzL25ldC9iZW5ldC9iZV9tYWluLmMKQEAgLTc1OSw3ICs3NTksNyBAQAogCiAJLyogdmxhbmYgY291bGQgYmUgd3JvbmdseSBzZXQgaW4gc29tZSBjYXJkcy4KIAkgKiBpZ25vcmUgaWYgdnRtIGlzIG5vdCBzZXQgKi8KLQlpZiAoKGFkYXB0ZXItPmNhcCA9PSAweDQwMCkgJiYgIXZ0bSkKKwlpZiAoKGFkYXB0ZXItPmNhcCAmIDB4NDAwKSAmJiAhdnRtKQogCQl2bGFuZiA9IDA7CiAKIAlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiX2lwX2FsaWduKGFkYXB0ZXItPm5ldGRldiwgQkVfSERSX0xFTik7CkBAIC04MTYsNyArODE2LDcgQEAKIAogCS8qIHZsYW5mIGNvdWxkIGJlIHdyb25nbHkgc2V0IGluIHNvbWUgY2FyZHMuCiAJICogaWdub3JlIGlmIHZ0bSBpcyBub3Qgc2V0ICovCi0JaWYgKChhZGFwdGVyLT5jYXAgPT0gMHg0MDApICYmICF2dG0pCisJaWYgKChhZGFwdGVyLT5jYXAgJiAweDQwMCkgJiYgIXZ0bSkKIAkJdmxhbmYgPSAwOwogCiAJc2tiID0gbmFwaV9nZXRfZnJhZ3MoJmVxX29iai0+bmFwaSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2Nhbi9LY29uZmlnCmluZGV4IGJiODAzZmEuLjhjNDg1YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi9LY29uZmlnCkBAIC01NCw2ICs1NCwxNSBAQAogCS0tLWhlbHAtLS0KIAkgIERyaXZlciBmb3IgdGhlIE1pY3JvY2hpcCBNQ1AyNTF4IFNQSSBDQU4gY29udHJvbGxlcnMuCiAKK2NvbmZpZyBDQU5fQkZJTgorCWRlcGVuZHMgb24gQ0FOX0RFViAmJiAoQkY1MzQgfHwgQkY1MzYgfHwgQkY1MzcgfHwgQkY1MzggfHwgQkY1MzkgfHwgQkY1NHgpCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEJsYWNrZmluIG9uLWNoaXAgQ0FOIgorCS0tLWhlbHAtLS0KKwkgIERyaXZlciBmb3IgdGhlIEFuYWxvZyBEZXZpY2VzIEJsYWNrZmluIG9uLWNoaXAgQ0FOIGNvbnRyb2xsZXJzCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGJmaW5fY2FuLgorCiBzb3VyY2UgImRyaXZlcnMvbmV0L2Nhbi9tc2Nhbi9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvbmV0L2Nhbi9zamExMDAwL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9jYW4vTWFrZWZpbGUKaW5kZXggNTY4OTlmZS4uN2E3MDJmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi9NYWtlZmlsZQpAQCAtMTQsNSArMTQsNiBAQAogb2JqLSQoQ09ORklHX0NBTl9BVDkxKQkJKz0gYXQ5MV9jYW4ubwogb2JqLSQoQ09ORklHX0NBTl9USV9IRUNDKQkrPSB0aV9oZWNjLm8KIG9iai0kKENPTkZJR19DQU5fTUNQMjUxWCkJKz0gbWNwMjUxeC5vCitvYmotJChDT05GSUdfQ0FOX0JGSU4pCQkrPSBiZmluX2Nhbi5vCiAKIGNjZmxhZ3MtJChDT05GSUdfQ0FOX0RFQlVHX0RFVklDRVMpIDo9IC1EREVCVUcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9iZmluX2Nhbi5jIGIvZHJpdmVycy9uZXQvY2FuL2JmaW5fY2FuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdmYzFkZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi9iZmluX2Nhbi5jCkBAIC0wLDAgKzEsNzgzIEBACisvKgorICogQmxhY2tmaW4gT24tQ2hpcCBDQU4gRHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Nhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nhbi9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jYW4vZXJyb3IuaD4KKworI2luY2x1ZGUgPGFzbS9wb3J0bXV4Lmg+CisKKyNkZWZpbmUgRFJWX05BTUUgImJmaW5fY2FuIgorI2RlZmluZSBCRklOX0NBTl9USU1FT1VUIDEwMAorCisvKgorICogdHJhbnNtaXQgYW5kIHJlY2VpdmUgY2hhbm5lbHMKKyAqLworI2RlZmluZSBUUkFOU01JVF9DSEwgICAgICAgICAgICAyNAorI2RlZmluZSBSRUNFSVZFX1NURF9DSEwgICAgICAgICAwCisjZGVmaW5lIFJFQ0VJVkVfRVhUX0NITCAgICAgICAgIDQKKyNkZWZpbmUgUkVDRUlWRV9SVFJfQ0hMICAgICAgICAgOAorI2RlZmluZSBSRUNFSVZFX0VYVF9SVFJfQ0hMICAgICAxMgorI2RlZmluZSBNQVhfQ0hMX05VTUJFUiAgICAgICAgICAzMgorCisvKgorICogYmZpbiBjYW4gcmVnaXN0ZXJzIGxheW91dAorICovCitzdHJ1Y3QgYmZpbl9jYW5fbWFza19yZWdzIHsKKwl1MTYgYW1sOworCXUxNiBkdW1teTE7CisJdTE2IGFtaDsKKwl1MTYgZHVtbXkyOworfTsKKworc3RydWN0IGJmaW5fY2FuX2NoYW5uZWxfcmVncyB7CisJdTE2IGRhdGFbOF07CisJdTE2IGRsYzsKKwl1MTYgZHVtbXkxOworCXUxNiB0c3Y7CisJdTE2IGR1bW15MjsKKwl1MTYgaWQwOworCXUxNiBkdW1teTM7CisJdTE2IGlkMTsKKwl1MTYgZHVtbXk0OworfTsKKworc3RydWN0IGJmaW5fY2FuX3JlZ3MgeworCS8qCisJICogZ2xvYmFsIGNvbnRyb2wgYW5kIHN0YXR1cyByZWdpc3RlcnMKKwkgKi8KKwl1MTYgbWMxOyAgICAgICAgICAgLyogb2Zmc2V0IDAgKi8KKwl1MTYgZHVtbXkxOworCXUxNiBtZDE7ICAgICAgICAgICAvKiBvZmZzZXQgNCAqLworCXUxNiByc3YxWzEzXTsKKwl1MTYgbWJ0aWYxOyAgICAgICAgLyogb2Zmc2V0IDB4MjAgKi8KKwl1MTYgZHVtbXkyOworCXUxNiBtYnJpZjE7ICAgICAgICAvKiBvZmZzZXQgMHgyNCAqLworCXUxNiBkdW1teTM7CisJdTE2IG1iaW0xOyAgICAgICAgIC8qIG9mZnNldCAweDI4ICovCisJdTE2IHJzdjJbMTFdOworCXUxNiBtYzI7ICAgICAgICAgICAvKiBvZmZzZXQgMHg0MCAqLworCXUxNiBkdW1teTQ7CisJdTE2IG1kMjsgICAgICAgICAgIC8qIG9mZnNldCAweDQ0ICovCisJdTE2IGR1bW15NTsKKwl1MTYgdHJzMjsgICAgICAgICAgLyogb2Zmc2V0IDB4NDggKi8KKwl1MTYgcnN2M1sxMV07CisJdTE2IG1idGlmMjsgICAgICAgIC8qIG9mZnNldCAweDYwICovCisJdTE2IGR1bW15NjsKKwl1MTYgbWJyaWYyOyAgICAgICAgLyogb2Zmc2V0IDB4NjQgKi8KKwl1MTYgZHVtbXk3OworCXUxNiBtYmltMjsgICAgICAgICAvKiBvZmZzZXQgMHg2OCAqLworCXUxNiByc3Y0WzExXTsKKwl1MTYgY2xrOyAgICAgICAgICAgLyogb2Zmc2V0IDB4ODAgKi8KKwl1MTYgZHVtbXk4OworCXUxNiB0aW1pbmc7ICAgICAgICAvKiBvZmZzZXQgMHg4NCAqLworCXUxNiByc3Y1WzNdOworCXUxNiBzdGF0dXM7ICAgICAgICAvKiBvZmZzZXQgMHg4YyAqLworCXUxNiBkdW1teTk7CisJdTE2IGNlYzsgICAgICAgICAgIC8qIG9mZnNldCAweDkwICovCisJdTE2IGR1bW15MTA7CisJdTE2IGdpczsgICAgICAgICAgIC8qIG9mZnNldCAweDk0ICovCisJdTE2IGR1bW15MTE7CisJdTE2IGdpbTsgICAgICAgICAgIC8qIG9mZnNldCAweDk4ICovCisJdTE2IHJzdjZbM107CisJdTE2IGN0cmw7ICAgICAgICAgIC8qIG9mZnNldCAweGEwICovCisJdTE2IGR1bW15MTI7CisJdTE2IGludHI7ICAgICAgICAgIC8qIG9mZnNldCAweGE0ICovCisJdTE2IHJzdjdbN107CisJdTE2IGVzcjsgICAgICAgICAgIC8qIG9mZnNldCAweGI0ICovCisJdTE2IHJzdjhbMzddOworCisJLyoKKwkgKiBjaGFubmVsKG1haWxib3gpIG1hc2sgYW5kIG1lc3NhZ2UgcmVnaXN0ZXJzCisJICovCisJc3RydWN0IGJmaW5fY2FuX21hc2tfcmVncyBtc2tbTUFYX0NITF9OVU1CRVJdOyAgICAvKiBvZmZzZXQgMHgxMDAgKi8KKwlzdHJ1Y3QgYmZpbl9jYW5fY2hhbm5lbF9yZWdzIGNobFtNQVhfQ0hMX05VTUJFUl07IC8qIG9mZnNldCAweDIwMCAqLworfTsKKworLyoKKyAqIGJmaW4gY2FuIHByaXZhdGUgZGF0YQorICovCitzdHJ1Y3QgYmZpbl9jYW5fcHJpdiB7CisJc3RydWN0IGNhbl9wcml2IGNhbjsJLyogbXVzdCBiZSB0aGUgZmlyc3QgbWVtYmVyICovCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl2b2lkIF9faW9tZW0gKm1lbWJhc2U7CisJaW50IHJ4X2lycTsKKwlpbnQgdHhfaXJxOworCWludCBlcnJfaXJxOworCXVuc2lnbmVkIHNob3J0ICpwaW5fbGlzdDsKK307CisKKy8qCisgKiBiZmluIGNhbiB0aW1pbmcgcGFyYW1ldGVycworICovCitzdGF0aWMgc3RydWN0IGNhbl9iaXR0aW1pbmdfY29uc3QgYmZpbl9jYW5fYml0dGltaW5nX2NvbnN0ID0geworCS5uYW1lID0gRFJWX05BTUUsCisJLnRzZWcxX21pbiA9IDEsCisJLnRzZWcxX21heCA9IDE2LAorCS50c2VnMl9taW4gPSAxLAorCS50c2VnMl9tYXggPSA4LAorCS5zandfbWF4ID0gNCwKKwkvKgorCSAqIEFsdGhvdWdoIHRoZSBCUlAgZmllbGQgY2FuIGJlIHNldCB0byBhbnkgdmFsdWUsIGl0IGlzIHJlY29tbWVuZGVkCisJICogdGhhdCB0aGUgdmFsdWUgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDQsIGFzIHJlc3RyaWN0aW9ucworCSAqIGFwcGx5IHRvIHRoZSBiaXQgdGltaW5nIGNvbmZpZ3VyYXRpb24gd2hlbiBCUlAgaXMgbGVzcyB0aGFuIDQuCisJICovCisJLmJycF9taW4gPSA0LAorCS5icnBfbWF4ID0gMTAyNCwKKwkuYnJwX2luYyA9IDEsCit9OworCitzdGF0aWMgaW50IGJmaW5fY2FuX3NldF9iaXR0aW1pbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmZpbl9jYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGJmaW5fY2FuX3JlZ3MgX19pb21lbSAqcmVnID0gcHJpdi0+bWVtYmFzZTsKKwlzdHJ1Y3QgY2FuX2JpdHRpbWluZyAqYnQgPSAmcHJpdi0+Y2FuLmJpdHRpbWluZzsKKwl1MTYgY2xrLCB0aW1pbmc7CisKKwljbGsgPSBidC0+YnJwIC0gMTsKKwl0aW1pbmcgPSAoKGJ0LT5zancgLSAxKSA8PCA4KSB8IChidC0+cHJvcF9zZWcgKyBidC0+cGhhc2Vfc2VnMSAtIDEpIHwKKwkJKChidC0+cGhhc2Vfc2VnMiAtIDEpIDw8IDQpOworCisJLyoKKwkgKiBJZiB0aGUgU0FNIGJpdCBpcyBzZXQsIHRoZSBpbnB1dCBzaWduYWwgaXMgb3ZlcnNhbXBsZWQgdGhyZWUgdGltZXMKKwkgKiBhdCB0aGUgU0NMSyByYXRlLgorCSAqLworCWlmIChwcml2LT5jYW4uY3RybG1vZGUgJiBDQU5fQ1RSTE1PREVfM19TQU1QTEVTKQorCQl0aW1pbmcgfD0gU0FNOworCisJYmZpbl93cml0ZTE2KCZyZWctPmNsaywgY2xrKTsKKwliZmluX3dyaXRlMTYoJnJlZy0+dGltaW5nLCB0aW1pbmcpOworCisJZGV2X2luZm8oZGV2LT5kZXYucGFyZW50LCAic2V0dGluZyBDTE9DSz0weCUwNHggVElNSU5HPTB4JTA0eFxuIiwKKwkJCWNsaywgdGltaW5nKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiZmluX2Nhbl9zZXRfcmVzZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiZmluX2Nhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYmZpbl9jYW5fcmVncyBfX2lvbWVtICpyZWcgPSBwcml2LT5tZW1iYXNlOworCWludCB0aW1lb3V0ID0gQkZJTl9DQU5fVElNRU9VVDsKKwlpbnQgaTsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCWJmaW5fd3JpdGUxNigmcmVnLT5tYmltMSwgMCk7CisJYmZpbl93cml0ZTE2KCZyZWctPm1iaW0yLCAwKTsKKwliZmluX3dyaXRlMTYoJnJlZy0+Z2ltLCAwKTsKKworCS8qIHJlc2V0IGNhbiBhbmQgZW50ZXIgY29uZmlndXJhdGlvbiBtb2RlICovCisJYmZpbl93cml0ZTE2KCZyZWctPmN0cmwsIFNSUyB8IENDUik7CisJU1NZTkMoKTsKKwliZmluX3dyaXRlMTYoJnJlZy0+Y3RybCwgQ0NSKTsKKwlTU1lOQygpOworCXdoaWxlICghKGJmaW5fcmVhZDE2KCZyZWctPmN0cmwpICYgQ0NBKSkgeworCQl1ZGVsYXkoMTApOworCQlpZiAoLS10aW1lb3V0ID09IDApIHsKKwkJCWRldl9lcnIoZGV2LT5kZXYucGFyZW50LAorCQkJCQkiZmFpbCB0byBlbnRlciBjb25maWd1cmF0aW9uIG1vZGVcbiIpOworCQkJQlVHKCk7CisJCX0KKwl9CisKKwkvKgorCSAqIEFsbCBtYWlsYm94IGNvbmZpZ3VyYXRpb25zIGFyZSBtYXJrZWQgYXMgaW5hY3RpdmUKKwkgKiBieSB3cml0aW5nIHRvIENBTiBNYWlsYm94IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXJzIDEgYW5kIDIKKwkgKiBGb3IgYWxsIGJpdHM6IDAgLSBNYWlsYm94IGRpc2FibGVkLCAxIC0gTWFpbGJveCBlbmFibGVkCisJICovCisJYmZpbl93cml0ZTE2KCZyZWctPm1jMSwgMCk7CisJYmZpbl93cml0ZTE2KCZyZWctPm1jMiwgMCk7CisKKwkvKiBTZXQgTWFpbGJveCBEaXJlY3Rpb24gKi8KKwliZmluX3dyaXRlMTYoJnJlZy0+bWQxLCAweEZGRkYpOyAgIC8qIG1haWxib3ggMS0xNiBhcmUgUlggKi8KKwliZmluX3dyaXRlMTYoJnJlZy0+bWQyLCAwKTsgICAvKiBtYWlsYm94IDE3LTMyIGFyZSBUWCAqLworCisJLyogUkVDRUlWRV9TVERfQ0hMICovCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQliZmluX3dyaXRlMTYoJnJlZy0+Y2hsW1JFQ0VJVkVfU1REX0NITCArIGldLmlkMCwgMCk7CisJCWJmaW5fd3JpdGUxNigmcmVnLT5jaGxbUkVDRUlWRV9TVERfQ0hMICsgaV0uaWQxLCBBTUUpOworCQliZmluX3dyaXRlMTYoJnJlZy0+Y2hsW1JFQ0VJVkVfU1REX0NITCArIGldLmRsYywgMCk7CisJCWJmaW5fd3JpdGUxNigmcmVnLT5tc2tbUkVDRUlWRV9TVERfQ0hMICsgaV0uYW1oLCAweDFGRkYpOworCQliZmluX3dyaXRlMTYoJnJlZy0+bXNrW1JFQ0VJVkVfU1REX0NITCArIGldLmFtbCwgMHhGRkZGKTsKKwl9CisKKwkvKiBSRUNFSVZFX0VYVF9DSEwgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCWJmaW5fd3JpdGUxNigmcmVnLT5jaGxbUkVDRUlWRV9FWFRfQ0hMICsgaV0uaWQwLCAwKTsKKwkJYmZpbl93cml0ZTE2KCZyZWctPmNobFtSRUNFSVZFX0VYVF9DSEwgKyBpXS5pZDEsIEFNRSB8IElERSk7CisJCWJmaW5fd3JpdGUxNigmcmVnLT5jaGxbUkVDRUlWRV9FWFRfQ0hMICsgaV0uZGxjLCAwKTsKKwkJYmZpbl93cml0ZTE2KCZyZWctPm1za1tSRUNFSVZFX0VYVF9DSEwgKyBpXS5hbWgsIDB4MUZGRik7CisJCWJmaW5fd3JpdGUxNigmcmVnLT5tc2tbUkVDRUlWRV9FWFRfQ0hMICsgaV0uYW1sLCAweEZGRkYpOworCX0KKworCWJmaW5fd3JpdGUxNigmcmVnLT5tYzIsIEJJVChUUkFOU01JVF9DSEwgLSAxNikpOworCWJmaW5fd3JpdGUxNigmcmVnLT5tYzEsIEJJVChSRUNFSVZFX1NURF9DSEwpICsgQklUKFJFQ0VJVkVfRVhUX0NITCkpOworCVNTWU5DKCk7CisKKwlwcml2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfU1RPUFBFRDsKK30KKworc3RhdGljIHZvaWQgYmZpbl9jYW5fc2V0X25vcm1hbF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJmaW5fY2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBiZmluX2Nhbl9yZWdzIF9faW9tZW0gKnJlZyA9IHByaXYtPm1lbWJhc2U7CisJaW50IHRpbWVvdXQgPSBCRklOX0NBTl9USU1FT1VUOworCisJLyoKKwkgKiBsZWF2ZSBjb25maWd1cmF0aW9uIG1vZGUKKwkgKi8KKwliZmluX3dyaXRlMTYoJnJlZy0+Y3RybCwgYmZpbl9yZWFkMTYoJnJlZy0+Y3RybCkgJiB+Q0NSKTsKKworCXdoaWxlIChiZmluX3JlYWQxNigmcmVnLT5zdGF0dXMpICYgQ0NBKSB7CisJCXVkZWxheSgxMCk7CisJCWlmICgtLXRpbWVvdXQgPT0gMCkgeworCQkJZGV2X2VycihkZXYtPmRldi5wYXJlbnQsCisJCQkJCSJmYWlsIHRvIGxlYXZlIGNvbmZpZ3VyYXRpb24gbW9kZVxuIik7CisJCQlCVUcoKTsKKwkJfQorCX0KKworCS8qCisJICogY2xlYXIgX0FsbF8gIHR4IGFuZCByeCBpbnRlcnJ1cHRzCisJICovCisJYmZpbl93cml0ZTE2KCZyZWctPm1idGlmMSwgMHhGRkZGKTsKKwliZmluX3dyaXRlMTYoJnJlZy0+bWJ0aWYyLCAweEZGRkYpOworCWJmaW5fd3JpdGUxNigmcmVnLT5tYnJpZjEsIDB4RkZGRik7CisJYmZpbl93cml0ZTE2KCZyZWctPm1icmlmMiwgMHhGRkZGKTsKKworCS8qCisJICogY2xlYXIgZ2xvYmFsIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIKKwkgKi8KKwliZmluX3dyaXRlMTYoJnJlZy0+Z2lzLCAweDdGRik7IC8qIG92ZXJ3cml0ZXMgd2l0aCAnMScgKi8KKworCS8qCisJICogSW5pdGlhbGl6ZSBJbnRlcnJ1cHRzCisJICogLSBzZXQgYml0cyBpbiB0aGUgbWFpbGJveCBpbnRlcnJ1cHQgbWFzayByZWdpc3RlcgorCSAqIC0gZ2xvYmFsIGludGVycnVwdCBtYXNrCisJICovCisJYmZpbl93cml0ZTE2KCZyZWctPm1iaW0xLCBCSVQoUkVDRUlWRV9TVERfQ0hMKSArIEJJVChSRUNFSVZFX0VYVF9DSEwpKTsKKwliZmluX3dyaXRlMTYoJnJlZy0+bWJpbTIsIEJJVChUUkFOU01JVF9DSEwgLSAxNikpOworCisJYmZpbl93cml0ZTE2KCZyZWctPmdpbSwgRVBJTSB8IEJPSU0gfCBSTUxJTSk7CisJU1NZTkMoKTsKK30KKworc3RhdGljIHZvaWQgYmZpbl9jYW5fc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmZpbl9jYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBlbnRlciByZXNldCBtb2RlICovCisJaWYgKHByaXYtPmNhbi5zdGF0ZSAhPSBDQU5fU1RBVEVfU1RPUFBFRCkKKwkJYmZpbl9jYW5fc2V0X3Jlc2V0X21vZGUoZGV2KTsKKworCS8qIGxlYXZlIHJlc2V0IG1vZGUgKi8KKwliZmluX2Nhbl9zZXRfbm9ybWFsX21vZGUoZGV2KTsKK30KKworc3RhdGljIGludCBiZmluX2Nhbl9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBlbnVtIGNhbl9tb2RlIG1vZGUpCit7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBDQU5fTU9ERV9TVEFSVDoKKwkJYmZpbl9jYW5fc3RhcnQoZGV2KTsKKwkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmZpbl9jYW5fc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiZmluX2Nhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYmZpbl9jYW5fcmVncyBfX2lvbWVtICpyZWcgPSBwcml2LT5tZW1iYXNlOworCXN0cnVjdCBjYW5fZnJhbWUgKmNmID0gKHN0cnVjdCBjYW5fZnJhbWUgKilza2ItPmRhdGE7CisJdTggZGxjID0gY2YtPmNhbl9kbGM7CisJY2FuaWRfdCBpZCA9IGNmLT5jYW5faWQ7CisJdTggKmRhdGEgPSBjZi0+ZGF0YTsKKwl1MTYgdmFsOworCWludCBpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogZmlsbCBpZCAqLworCWlmIChpZCAmIENBTl9FRkZfRkxBRykgeworCQliZmluX3dyaXRlMTYoJnJlZy0+Y2hsW1RSQU5TTUlUX0NITF0uaWQwLCBpZCk7CisJCWlmIChpZCAmIENBTl9SVFJfRkxBRykKKwkJCXdyaXRldygoKGlkICYgMHgxRkZGMDAwMCkgPj4gMTYpIHwgSURFIHwgQU1FIHwgUlRSLAorCQkJCQkmcmVnLT5jaGxbVFJBTlNNSVRfQ0hMXS5pZDEpOworCQllbHNlCisJCQl3cml0ZXcoKChpZCAmIDB4MUZGRjAwMDApID4+IDE2KSB8IElERSB8IEFNRSwKKwkJCQkJJnJlZy0+Y2hsW1RSQU5TTUlUX0NITF0uaWQxKTsKKworCX0gZWxzZSB7CisJCWlmIChpZCAmIENBTl9SVFJfRkxBRykKKwkJCXdyaXRldygoaWQgPDwgMikgfCBBTUUgfCBSVFIsCisJCQkJJnJlZy0+Y2hsW1RSQU5TTUlUX0NITF0uaWQxKTsKKwkJZWxzZQorCQkJYmZpbl93cml0ZTE2KCZyZWctPmNobFtUUkFOU01JVF9DSExdLmlkMSwKKwkJCQkJKGlkIDw8IDIpIHwgQU1FKTsKKwl9CisKKwkvKiBmaWxsIHBheWxvYWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSArPSAyKSB7CisJCXZhbCA9ICgoNyAtIGkpIDwgZGxjID8gKGRhdGFbNyAtIGldKSA6IDApICsKKwkJCSgoNiAtIGkpIDwgZGxjID8gKGRhdGFbNiAtIGldIDw8IDgpIDogMCk7CisJCWJmaW5fd3JpdGUxNigmcmVnLT5jaGxbVFJBTlNNSVRfQ0hMXS5kYXRhW2ldLCB2YWwpOworCX0KKworCS8qIGZpbGwgZGF0YSBsZW5ndGggY29kZSAqLworCWJmaW5fd3JpdGUxNigmcmVnLT5jaGxbVFJBTlNNSVRfQ0hMXS5kbGMsIGRsYyk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCWNhbl9wdXRfZWNob19za2Ioc2tiLCBkZXYsIDApOworCisJLyogc2V0IHRyYW5zbWl0IHJlcXVlc3QgKi8KKwliZmluX3dyaXRlMTYoJnJlZy0+dHJzMiwgQklUKFRSQU5TTUlUX0NITCAtIDE2KSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmZpbl9jYW5fcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGlzcmMpCit7CisJc3RydWN0IGJmaW5fY2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZkZXYtPnN0YXRzOworCXN0cnVjdCBiZmluX2Nhbl9yZWdzIF9faW9tZW0gKnJlZyA9IHByaXYtPm1lbWJhc2U7CisJc3RydWN0IGNhbl9mcmFtZSAqY2Y7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgb2JqOworCWludCBpOworCXUxNiB2YWw7CisKKwlza2IgPSBhbGxvY19jYW5fc2tiKGRldiwgJmNmKTsKKwlpZiAoc2tiID09IE5VTEwpCisJCXJldHVybjsKKworCS8qIGdldCBpZCAqLworCWlmIChpc3JjICYgQklUKFJFQ0VJVkVfRVhUX0NITCkpIHsKKwkJLyogZXh0ZW5kZWQgZnJhbWUgZm9ybWF0IChFRkYpICovCisJCWNmLT5jYW5faWQgPSAoKGJmaW5fcmVhZDE2KCZyZWctPmNobFtSRUNFSVZFX0VYVF9DSExdLmlkMSkKKwkJCSAgICAgJiAweDFGRkYpIDw8IDE2KQorCQkJICAgICArIGJmaW5fcmVhZDE2KCZyZWctPmNobFtSRUNFSVZFX0VYVF9DSExdLmlkMCk7CisJCWNmLT5jYW5faWQgfD0gQ0FOX0VGRl9GTEFHOworCQlvYmogPSBSRUNFSVZFX0VYVF9DSEw7CisJfSBlbHNlIHsKKwkJLyogc3RhbmRhcmQgZnJhbWUgZm9ybWF0IChTRkYpICovCisJCWNmLT5jYW5faWQgPSAoYmZpbl9yZWFkMTYoJnJlZy0+Y2hsW1JFQ0VJVkVfU1REX0NITF0uaWQxKQorCQkJICAgICAmIDB4MWZmYykgPj4gMjsKKwkJb2JqID0gUkVDRUlWRV9TVERfQ0hMOworCX0KKwlpZiAoYmZpbl9yZWFkMTYoJnJlZy0+Y2hsW29ial0uaWQxKSAmIFJUUikKKwkJY2YtPmNhbl9pZCB8PSBDQU5fUlRSX0ZMQUc7CisKKwkvKiBnZXQgZGF0YSBsZW5ndGggY29kZSAqLworCWNmLT5jYW5fZGxjID0gYmZpbl9yZWFkMTYoJnJlZy0+Y2hsW29ial0uZGxjKTsKKworCS8qIGdldCBwYXlsb2FkICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkgKz0gMikgeworCQl2YWwgPSBiZmluX3JlYWQxNigmcmVnLT5jaGxbb2JqXS5kYXRhW2ldKTsKKwkJY2YtPmRhdGFbNyAtIGldID0gKDcgLSBpKSA8IGNmLT5jYW5fZGxjID8gdmFsIDogMDsKKwkJY2YtPmRhdGFbNiAtIGldID0gKDYgLSBpKSA8IGNmLT5jYW5fZGxjID8gKHZhbCA+PiA4KSA6IDA7CisJfQorCisJbmV0aWZfcngoc2tiKTsKKworCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJc3RhdHMtPnJ4X2J5dGVzICs9IGNmLT5jYW5fZGxjOworfQorCitzdGF0aWMgaW50IGJmaW5fY2FuX2VycihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgaXNyYywgdTE2IHN0YXR1cykKK3sKKwlzdHJ1Y3QgYmZpbl9jYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGJmaW5fY2FuX3JlZ3MgX19pb21lbSAqcmVnID0gcHJpdi0+bWVtYmFzZTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmZGV2LT5zdGF0czsKKwlzdHJ1Y3QgY2FuX2ZyYW1lICpjZjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWVudW0gY2FuX3N0YXRlIHN0YXRlID0gcHJpdi0+Y2FuLnN0YXRlOworCisJc2tiID0gYWxsb2NfY2FuX2Vycl9za2IoZGV2LCAmY2YpOworCWlmIChza2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoaXNyYyAmIFJNTElTKSB7CisJCS8qIGRhdGEgb3ZlcnJ1biBpbnRlcnJ1cHQgKi8KKwkJZGV2X2RiZyhkZXYtPmRldi5wYXJlbnQsICJkYXRhIG92ZXJydW4gaW50ZXJydXB0XG4iKTsKKwkJY2YtPmNhbl9pZCB8PSBDQU5fRVJSX0NSVEw7CisJCWNmLT5kYXRhWzFdID0gQ0FOX0VSUl9DUlRMX1JYX09WRVJGTE9XOworCQlzdGF0cy0+cnhfb3Zlcl9lcnJvcnMrKzsKKwkJc3RhdHMtPnJ4X2Vycm9ycysrOworCX0KKworCWlmIChpc3JjICYgQk9JUykgeworCQlkZXZfZGJnKGRldi0+ZGV2LnBhcmVudCwgImJ1cy1vZmYgbW9kZSBpbnRlcnJ1cHRcbiIpOworCQlzdGF0ZSA9IENBTl9TVEFURV9CVVNfT0ZGOworCQljZi0+Y2FuX2lkIHw9IENBTl9FUlJfQlVTT0ZGOworCQljYW5fYnVzX29mZihkZXYpOworCX0KKworCWlmIChpc3JjICYgRVBJUykgeworCQkvKiBlcnJvciBwYXNzaXZlIGludGVycnVwdCAqLworCQlkZXZfZGJnKGRldi0+ZGV2LnBhcmVudCwgImVycm9yIHBhc3NpdmUgaW50ZXJydXB0XG4iKTsKKwkJc3RhdGUgPSBDQU5fU1RBVEVfRVJST1JfUEFTU0lWRTsKKwl9CisKKwlpZiAoKGlzcmMgJiBFV1RJUykgfHwgKGlzcmMgJiBFV1JJUykpIHsKKwkJZGV2X2RiZyhkZXYtPmRldi5wYXJlbnQsCisJCQkJIkVycm9yIFdhcm5pbmcgVHJhbnNtaXQvUmVjZWl2ZSBJbnRlcnJ1cHRcbiIpOworCQlzdGF0ZSA9IENBTl9TVEFURV9FUlJPUl9XQVJOSU5HOworCX0KKworCWlmIChzdGF0ZSAhPSBwcml2LT5jYW4uc3RhdGUgJiYgKHN0YXRlID09IENBTl9TVEFURV9FUlJPUl9XQVJOSU5HIHx8CisJCQkJc3RhdGUgPT0gQ0FOX1NUQVRFX0VSUk9SX1BBU1NJVkUpKSB7CisJCXUxNiBjZWMgPSBiZmluX3JlYWQxNigmcmVnLT5jZWMpOworCQl1OCByeGVyciA9IGNlYzsKKwkJdTggdHhlcnIgPSBjZWMgPj4gODsKKworCQljZi0+Y2FuX2lkIHw9IENBTl9FUlJfQ1JUTDsKKwkJaWYgKHN0YXRlID09IENBTl9TVEFURV9FUlJPUl9XQVJOSU5HKSB7CisJCQlwcml2LT5jYW4uY2FuX3N0YXRzLmVycm9yX3dhcm5pbmcrKzsKKwkJCWNmLT5kYXRhWzFdID0gKHR4ZXJyID4gcnhlcnIpID8KKwkJCQlDQU5fRVJSX0NSVExfVFhfV0FSTklORyA6CisJCQkJQ0FOX0VSUl9DUlRMX1JYX1dBUk5JTkc7CisJCX0gZWxzZSB7CisJCQlwcml2LT5jYW4uY2FuX3N0YXRzLmVycm9yX3Bhc3NpdmUrKzsKKwkJCWNmLT5kYXRhWzFdID0gKHR4ZXJyID4gcnhlcnIpID8KKwkJCQlDQU5fRVJSX0NSVExfVFhfUEFTU0lWRSA6CisJCQkJQ0FOX0VSUl9DUlRMX1JYX1BBU1NJVkU7CisJCX0KKwl9CisKKwlpZiAoc3RhdHVzKSB7CisJCXByaXYtPmNhbi5jYW5fc3RhdHMuYnVzX2Vycm9yKys7CisKKwkJY2YtPmNhbl9pZCB8PSBDQU5fRVJSX1BST1QgfCBDQU5fRVJSX0JVU0VSUk9SOworCisJCWlmIChzdGF0dXMgJiBCRUYpCisJCQljZi0+ZGF0YVsyXSB8PSBDQU5fRVJSX1BST1RfQklUOworCQllbHNlIGlmIChzdGF0dXMgJiBGRVIpCisJCQljZi0+ZGF0YVsyXSB8PSBDQU5fRVJSX1BST1RfRk9STTsKKwkJZWxzZSBpZiAoc3RhdHVzICYgU0VSKQorCQkJY2YtPmRhdGFbMl0gfD0gQ0FOX0VSUl9QUk9UX1NUVUZGOworCQllbHNlCisJCQljZi0+ZGF0YVsyXSB8PSBDQU5fRVJSX1BST1RfVU5TUEVDOworCX0KKworCXByaXYtPmNhbi5zdGF0ZSA9IHN0YXRlOworCisJbmV0aWZfcngoc2tiKTsKKworCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJc3RhdHMtPnJ4X2J5dGVzICs9IGNmLT5jYW5fZGxjOworCisJcmV0dXJuIDA7Cit9CisKK2lycXJldHVybl90IGJmaW5fY2FuX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgYmZpbl9jYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGJmaW5fY2FuX3JlZ3MgX19pb21lbSAqcmVnID0gcHJpdi0+bWVtYmFzZTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmZGV2LT5zdGF0czsKKwl1MTYgc3RhdHVzLCBpc3JjOworCisJaWYgKChpcnEgPT0gcHJpdi0+dHhfaXJxKSAmJiBiZmluX3JlYWQxNigmcmVnLT5tYnRpZjIpKSB7CisJCS8qIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQgKi8KKwkJYmZpbl93cml0ZTE2KCZyZWctPm1idGlmMiwgMHhGRkZGKTsKKwkJc3RhdHMtPnR4X3BhY2tldHMrKzsKKwkJc3RhdHMtPnR4X2J5dGVzICs9IGJmaW5fcmVhZDE2KCZyZWctPmNobFtUUkFOU01JVF9DSExdLmRsYyk7CisJCWNhbl9nZXRfZWNob19za2IoZGV2LCAwKTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0gZWxzZSBpZiAoKGlycSA9PSBwcml2LT5yeF9pcnEpICYmIGJmaW5fcmVhZDE2KCZyZWctPm1icmlmMSkpIHsKKwkJLyogcmVjZWl2ZSBpbnRlcnJ1cHQgKi8KKwkJaXNyYyA9IGJmaW5fcmVhZDE2KCZyZWctPm1icmlmMSk7CisJCWJmaW5fd3JpdGUxNigmcmVnLT5tYnJpZjEsIDB4RkZGRik7CisJCWJmaW5fY2FuX3J4KGRldiwgaXNyYyk7CisJfSBlbHNlIGlmICgoaXJxID09IHByaXYtPmVycl9pcnEpICYmIGJmaW5fcmVhZDE2KCZyZWctPmdpcykpIHsKKwkJLyogZXJyb3IgaW50ZXJydXB0ICovCisJCWlzcmMgPSBiZmluX3JlYWQxNigmcmVnLT5naXMpOworCQlzdGF0dXMgPSBiZmluX3JlYWQxNigmcmVnLT5lc3IpOworCQliZmluX3dyaXRlMTYoJnJlZy0+Z2lzLCAweDdGRik7CisJCWJmaW5fY2FuX2VycihkZXYsIGlzcmMsIHN0YXR1cyk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBiZmluX2Nhbl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJmaW5fY2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnI7CisKKwkvKiBzZXQgY2hpcCBpbnRvIHJlc2V0IG1vZGUgKi8KKwliZmluX2Nhbl9zZXRfcmVzZXRfbW9kZShkZXYpOworCisJLyogY29tbW9uIG9wZW4gKi8KKwllcnIgPSBvcGVuX2NhbmRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdF9vcGVuOworCisJLyogcmVnaXN0ZXIgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwllcnIgPSByZXF1ZXN0X2lycShwcml2LT5yeF9pcnEsICZiZmluX2Nhbl9pbnRlcnJ1cHQsIDAsCisJCQkiYmZpbi1jYW4tcngiLCBkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdF9yeF9pcnE7CisJZXJyID0gcmVxdWVzdF9pcnEocHJpdi0+dHhfaXJxLCAmYmZpbl9jYW5faW50ZXJydXB0LCAwLAorCQkJImJmaW4tY2FuLXR4IiwgZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfdHhfaXJxOworCWVyciA9IHJlcXVlc3RfaXJxKHByaXYtPmVycl9pcnEsICZiZmluX2Nhbl9pbnRlcnJ1cHQsIDAsCisJCQkiYmZpbi1jYW4tZXJyIiwgZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfZXJyX2lycTsKKworCWJmaW5fY2FuX3N0YXJ0KGRldik7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7CisKK2V4aXRfZXJyX2lycToKKwlmcmVlX2lycShwcml2LT50eF9pcnEsIGRldik7CitleGl0X3R4X2lycToKKwlmcmVlX2lycShwcml2LT5yeF9pcnEsIGRldik7CitleGl0X3J4X2lycToKKwljbG9zZV9jYW5kZXYoZGV2KTsKK2V4aXRfb3BlbjoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGJmaW5fY2FuX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJmaW5fY2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCWJmaW5fY2FuX3NldF9yZXNldF9tb2RlKGRldik7CisKKwljbG9zZV9jYW5kZXYoZGV2KTsKKworCWZyZWVfaXJxKHByaXYtPnJ4X2lycSwgZGV2KTsKKwlmcmVlX2lycShwcml2LT50eF9pcnEsIGRldik7CisJZnJlZV9pcnEocHJpdi0+ZXJyX2lycSwgZGV2KTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfYmZpbl9jYW5kZXYodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBiZmluX2Nhbl9wcml2ICpwcml2OworCisJZGV2ID0gYWxsb2NfY2FuZGV2KHNpemVvZigqcHJpdikpOworCWlmICghZGV2KQorCQlyZXR1cm4gTlVMTDsKKworCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcHJpdi0+ZGV2ID0gZGV2OworCXByaXYtPmNhbi5iaXR0aW1pbmdfY29uc3QgPSAmYmZpbl9jYW5fYml0dGltaW5nX2NvbnN0OworCXByaXYtPmNhbi5kb19zZXRfYml0dGltaW5nID0gYmZpbl9jYW5fc2V0X2JpdHRpbWluZzsKKwlwcml2LT5jYW4uZG9fc2V0X21vZGUgPSBiZmluX2Nhbl9zZXRfbW9kZTsKKworCXJldHVybiBkZXY7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgYmZpbl9jYW5fbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4gICAgICAgICAgICAgICA9IGJmaW5fY2FuX29wZW4sCisJLm5kb19zdG9wICAgICAgICAgICAgICAgPSBiZmluX2Nhbl9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQgICAgICAgICA9IGJmaW5fY2FuX3N0YXJ0X3htaXQsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBiZmluX2Nhbl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCBlcnI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgYmZpbl9jYW5fcHJpdiAqcHJpdjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlc19tZW0sICpyeF9pcnEsICp0eF9pcnEsICplcnJfaXJxOworCXVuc2lnbmVkIHNob3J0ICpwZGF0YTsKKworCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaWYgKCFwZGF0YSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBwbGF0Zm9ybSBkYXRhIHByb3ZpZGVkIVxuIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlyZXNfbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlyeF9pcnEgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOworCXR4X2lycSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lSUSwgMSk7CisJZXJyX2lycSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lSUSwgMik7CisJaWYgKCFyZXNfbWVtIHx8ICFyeF9pcnEgfHwgIXR4X2lycSB8fCAhZXJyX2lycSkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzX21lbS0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzX21lbSksCisJCQkJZGV2X25hbWUoJnBkZXYtPmRldikpKSB7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBleGl0OworCX0KKworCS8qIHJlcXVlc3QgcGVyaXBoZXJhbCBwaW5zICovCisJZXJyID0gcGVyaXBoZXJhbF9yZXF1ZXN0X2xpc3QocGRhdGEsIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfbWVtX3JlbGVhc2U7CisKKwlkZXYgPSBhbGxvY19iZmluX2NhbmRldigpOworCWlmICghZGV2KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdF9wZXJpX3Bpbl9mcmVlOworCX0KKworCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXByaXYtPm1lbWJhc2UgPSAodm9pZCBfX2lvbWVtICopcmVzX21lbS0+c3RhcnQ7CisJcHJpdi0+cnhfaXJxID0gcnhfaXJxLT5zdGFydDsKKwlwcml2LT50eF9pcnEgPSB0eF9pcnEtPnN0YXJ0OworCXByaXYtPmVycl9pcnEgPSBlcnJfaXJxLT5zdGFydDsKKwlwcml2LT5waW5fbGlzdCA9IHBkYXRhOworCXByaXYtPmNhbi5jbG9jay5mcmVxID0gZ2V0X3NjbGsoKTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlkZXYtPmZsYWdzIHw9IElGRl9FQ0hPOwkvKiB3ZSBzdXBwb3J0IGxvY2FsIGVjaG8gKi8KKwlkZXYtPm5ldGRldl9vcHMgPSAmYmZpbl9jYW5fbmV0ZGV2X29wczsKKworCWJmaW5fY2FuX3NldF9yZXNldF9tb2RlKGRldik7CisKKwllcnIgPSByZWdpc3Rlcl9jYW5kZXYoZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInJlZ2lzdGVyaW5nIGZhaWxlZCAoZXJyPSVkKVxuIiwgZXJyKTsKKwkJZ290byBleGl0X2NhbmRldl9mcmVlOworCX0KKworCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCSIlcyBkZXZpY2UgcmVnaXN0ZXJlZCIKKwkJIigmcmVnX2Jhc2U9JXAsIHJ4X2lycT0lZCwgdHhfaXJxPSVkLCBlcnJfaXJxPSVkLCBzY2xrPSVkKVxuIiwKKwkJRFJWX05BTUUsICh2b2lkICopcHJpdi0+bWVtYmFzZSwgcHJpdi0+cnhfaXJxLAorCQlwcml2LT50eF9pcnEsIHByaXYtPmVycl9pcnEsIHByaXYtPmNhbi5jbG9jay5mcmVxKTsKKwlyZXR1cm4gMDsKKworZXhpdF9jYW5kZXZfZnJlZToKKwlmcmVlX2NhbmRldihkZXYpOworZXhpdF9wZXJpX3Bpbl9mcmVlOgorCXBlcmlwaGVyYWxfZnJlZV9saXN0KHBkYXRhKTsKK2V4aXRfbWVtX3JlbGVhc2U6CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlc19tZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlc19tZW0pKTsKK2V4aXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYmZpbl9jYW5fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgYmZpbl9jYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisKKwliZmluX2Nhbl9zZXRfcmVzZXRfbW9kZShkZXYpOworCisJdW5yZWdpc3Rlcl9jYW5kZXYoZGV2KTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBOVUxMKTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisKKwlwZXJpcGhlcmFsX2ZyZWVfbGlzdChwcml2LT5waW5fbGlzdCk7CisKKwlmcmVlX2NhbmRldihkZXYpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGJmaW5fY2FuX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgYmZpbl9jYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGJmaW5fY2FuX3JlZ3MgX19pb21lbSAqcmVnID0gcHJpdi0+bWVtYmFzZTsKKwlpbnQgdGltZW91dCA9IEJGSU5fQ0FOX1RJTUVPVVQ7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCS8qIGVudGVyIHNsZWVwIG1vZGUgKi8KKwkJYmZpbl93cml0ZTE2KCZyZWctPmN0cmwsIGJmaW5fcmVhZDE2KCZyZWctPmN0cmwpIHwgU01SKTsKKwkJU1NZTkMoKTsKKwkJd2hpbGUgKCEoYmZpbl9yZWFkMTYoJnJlZy0+aW50cikgJiBTTUFDSykpIHsKKwkJCXVkZWxheSgxMCk7CisJCQlpZiAoLS10aW1lb3V0ID09IDApIHsKKwkJCQlkZXZfZXJyKGRldi0+ZGV2LnBhcmVudCwKKwkJCQkJCSJmYWlsIHRvIGVudGVyIHNsZWVwIG1vZGVcbiIpOworCQkJCUJVRygpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmZpbl9jYW5fcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgYmZpbl9jYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGJmaW5fY2FuX3JlZ3MgX19pb21lbSAqcmVnID0gcHJpdi0+bWVtYmFzZTsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJLyogbGVhdmUgc2xlZXAgbW9kZSAqLworCQliZmluX3dyaXRlMTYoJnJlZy0+aW50ciwgMCk7CisJCVNTWU5DKCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBiZmluX2Nhbl9zdXNwZW5kIE5VTEwKKyNkZWZpbmUgYmZpbl9jYW5fcmVzdW1lIE5VTEwKKyNlbmRpZgkvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYmZpbl9jYW5fZHJpdmVyID0geworCS5wcm9iZSA9IGJmaW5fY2FuX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChiZmluX2Nhbl9yZW1vdmUpLAorCS5zdXNwZW5kID0gYmZpbl9jYW5fc3VzcGVuZCwKKwkucmVzdW1lID0gYmZpbl9jYW5fcmVzdW1lLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJWX05BTUUsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBiZmluX2Nhbl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYmZpbl9jYW5fZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGJmaW5fY2FuX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYmZpbl9jYW5fZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZiZmluX2Nhbl9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYmZpbl9jYW5fZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkJhcnJ5IFNvbmcgPDIxY25iYW9AZ21haWwuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCbGFja2ZpbiBvbi1jaGlwIENBTiBuZXRkZXZpY2UgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL3NnZS5jIGIvZHJpdmVycy9uZXQvY2hlbHNpby9zZ2UuYwppbmRleCA4YzY1OGNmLi4xMDlkMjc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jaGVsc2lvL3NnZS5jCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vc2dlLmMKQEAgLTEzNzgsNyArMTM3OCw3IEBACiAJfQogCV9fc2tiX3B1bGwoc2tiLCBzaXplb2YoKnApKTsKIAotCXN0ID0gcGVyX2NwdV9wdHIoc2dlLT5wb3J0X3N0YXRzW3AtPmlmZl0sIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJc3QgPSB0aGlzX2NwdV9wdHIoc2dlLT5wb3J0X3N0YXRzW3AtPmlmZl0pOwogCiAJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgYWRhcHRlci0+cG9ydFtwLT5pZmZdLmRldik7CiAJaWYgKChhZGFwdGVyLT5mbGFncyAmIFJYX0NTVU1fRU5BQkxFRCkgJiYgcC0+Y3N1bSA9PSAweGZmZmYgJiYKQEAgLTE3ODAsOCArMTc4MCw3IEBACiB7CiAJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CiAJc3RydWN0IHNnZSAqc2dlID0gYWRhcHRlci0+c2dlOwotCXN0cnVjdCBzZ2VfcG9ydF9zdGF0cyAqc3QgPSBwZXJfY3B1X3B0cihzZ2UtPnBvcnRfc3RhdHNbZGV2LT5pZl9wb3J0XSwKLQkJCQkJCXNtcF9wcm9jZXNzb3JfaWQoKSk7CisJc3RydWN0IHNnZV9wb3J0X3N0YXRzICpzdCA9IHRoaXNfY3B1X3B0cihzZ2UtPnBvcnRfc3RhdHNbZGV2LT5pZl9wb3J0XSk7CiAJc3RydWN0IGNwbF90eF9wa3QgKmNwbDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqb3JpZ19za2IgPSBza2I7CiAJaW50IHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NuaWMuYyBiL2RyaXZlcnMvbmV0L2NuaWMuYwppbmRleCBkNGM2ZTdmLi40MzMyYjNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jbmljLmMKKysrIGIvZHJpdmVycy9uZXQvY25pYy5jCkBAIC0xMTA0LDYgKzExMDQsOCBAQAogCWNwLT5ibngyeF9zdGF0dXNfYmxrID0gY3AtPnN0YXR1c19ibGs7CiAJY3AtPmJueDJ4X2RlZl9zdGF0dXNfYmxrID0gY3AtPmV0aGRldi0+aXJxX2FyclsxXS5zdGF0dXNfYmxrOwogCisJbWVtc2V0KGNwLT5ibngyeF9zdGF0dXNfYmxrLCAwLCBzaXplb2Yoc3RydWN0IGhvc3Rfc3RhdHVzX2Jsb2NrKSk7CisKIAljcC0+bDJfcnhfcmluZ19zaXplID0gMTU7CiAKIAlyZXQgPSBjbmljX2FsbG9jX2wyX3JpbmdzKGRldiwgNCk7CkBAIC00MTgzLDYgKzQxODUsMTIgQEAKIAkJY25pY19zdWJtaXRfa3dxZV8xNihkZXYsIFJBTVJPRF9DTURfSURfRVRIX0hBTFQsCiAJCQlCTlgyWF9JU0NTSV9MMl9DSUQsIEVUSF9DT05ORUNUSU9OX1RZUEUsICZsNV9kYXRhKTsKIAkJbXNsZWVwKDEwKTsKKworCQltZW1zZXQoJmw1X2RhdGEsIDAsIHNpemVvZihsNV9kYXRhKSk7CisJCWNuaWNfc3VibWl0X2t3cWVfMTYoZGV2LCBSQU1ST0RfQ01EX0lEX0VUSF9DRkNfREVMLAorCQkJQk5YMlhfSVNDU0lfTDJfQ0lELCBFVEhfQ09OTkVDVElPTl9UWVBFIHwKKwkJCSgxIDw8IFNQRV9IRFJfQ09NTU9OX1JBTVJPRF9TSElGVCksICZsNV9kYXRhKTsKKwkJbXNsZWVwKDEwKTsKIAl9CiB9CiAKQEAgLTQyODksNiArNDI5Nyw5IEBACiAJCSAgb2Zmc2V0b2Yoc3RydWN0IGNzdG9ybV9zdGF0dXNfYmxvY2tfYywKIAkJCSAgIGluZGV4X3ZhbHVlc1tIQ19JTkRFWF9DX0lTQ1NJX0VRX0NPTlNdKSwKIAkJICAwKTsKKwlDTklDX1dSKGRldiwgQkFSX0NTVFJPUk1fSU5UTUVNICsKKwkJQ1NUT1JNX0lTQ1NJX0VRX0NPTlNfT0ZGU0VUKGNwLT5mdW5jLCAwKSwgMCk7CisJQ05JQ19XUjE2KGRldiwgY3AtPmtjcV9pb19hZGRyLCAwKTsKIAljbmljX2ZyZWVfcmVzYyhkZXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19tYWluLmMgYi9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19tYWluLmMKaW5kZXggY2VmM2Y4OC4uODliZWM5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX21haW4uYwpAQCAtMjg2MCw2ICsyODYwLDcgQEAKIAl9CiAJcGNpX3NldF9tYXN0ZXIoYWRhcHRlci0+cGRldik7CiAJcGNpX3Jlc3RvcmVfc3RhdGUoYWRhcHRlci0+cGRldik7CisJcGNpX3NhdmVfc3RhdGUoYWRhcHRlci0+cGRldik7CiAKIAkvKiBGcmVlIHNnZSByZXNvdXJjZXMgKi8KIAl0M19mcmVlX3NnZV9yZXNvdXJjZXMoYWRhcHRlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMGUvZGVmaW5lcy5oIGIvZHJpdmVycy9uZXQvZTEwMDBlL2RlZmluZXMuaAppbmRleCA4NmQyODA5Li5lMDJlMzgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMGUvZGVmaW5lcy5oCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9kZWZpbmVzLmgKQEAgLTc0LDcgKzc0LDcgQEAKICNkZWZpbmUgRTEwMDBfV1VTX0JDICAgICAgICAgICBFMTAwMF9XVUZDX0JDCiAKIC8qIEV4dGVuZGVkIERldmljZSBDb250cm9sICovCi0jZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1NEUDdfREFUQSAweDAwMDAwMDgwIC8qIFZhbHVlIG9mIFNXIERlZmluYWJsZSBQaW4gNyAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9TRFAzX0RBVEEgMHgwMDAwMDA4MCAvKiBWYWx1ZSBvZiBTVyBEZWZpbmFibGUgUGluIDMgKi8KICNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfRUVfUlNUICAgIDB4MDAwMDIwMDAgLyogUmVpbml0aWFsaXplIGZyb20gRUVQUk9NICovCiAjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1NQRF9CWVBTICAweDAwMDA4MDAwIC8qIFNwZWVkIFNlbGVjdCBCeXBhc3MgKi8KICNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfUk9fRElTICAgIDB4MDAwMjAwMDAgLyogUmVsYXhlZCBPcmRlcmluZyBkaXNhYmxlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMGUvZXMybGFuLmMgYi9kcml2ZXJzL25ldC9lMTAwMGUvZXMybGFuLmMKaW5kZXggZDJhMTA0Ny4uMzAyOGYyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDBlL2VzMmxhbi5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9lczJsYW4uYwpAQCAtNDYsNiArNDYsOSBAQAogI2RlZmluZSBFMTAwMF9LTVJOQ1RSTFNUQV9IRF9DVFJMXzEwMDBfREVGQVVMVAkgMHgwMDAwCiAjZGVmaW5lIEUxMDAwX0tNUk5DVFJMU1RBX09QTU9ERV9FX0lETEUJCSAweDIwMDAKIAorI2RlZmluZSBFMTAwMF9LTVJOQ1RSTFNUQV9PUE1PREVfTUFTSwkJIDB4MDAwQworI2RlZmluZSBFMTAwMF9LTVJOQ1RSTFNUQV9PUE1PREVfSU5CQU5EX01ESU8JIDB4MDAwNAorCiAjZGVmaW5lIEUxMDAwX1RDVExfRVhUX0dDRVhfTUFTSyAweDAwMEZGQzAwIC8qIEdpZ2FiaXQgQ2FycnkgRXh0ZW5kIFBhZGRpbmcgKi8KICNkZWZpbmUgREVGQVVMVF9UQ1RMX0VYVF9HQ0VYXzgwMDAzRVMyTEFOCSAweDAwMDEwMDAwCiAKQEAgLTQ2MiwyOCArNDY1LDM2IEBACiAJCXJldHVybiByZXRfdmFsOwogCX0KIAotCS8qCi0JICogVGhlICJyZWFkeSIgYml0IGluIHRoZSBNRElDIHJlZ2lzdGVyIG1heSBiZSBpbmNvcnJlY3RseSBzZXQKLQkgKiBiZWZvcmUgdGhlIGRldmljZSBoYXMgY29tcGxldGVkIHRoZSAiUGFnZSBTZWxlY3QiIE1ESQotCSAqIHRyYW5zYWN0aW9uLiAgU28gd2Ugd2FpdCAyMDB1cyBhZnRlciBlYWNoIE1ESSBjb21tYW5kLi4uCi0JICovCi0JdWRlbGF5KDIwMCk7CisJaWYgKGh3LT5kZXZfc3BlYy5lODAwMDNlczJsYW4ubWRpY193YV9lbmFibGUgPT0gdHJ1ZSkgeworCQkvKgorCQkgKiBUaGUgInJlYWR5IiBiaXQgaW4gdGhlIE1ESUMgcmVnaXN0ZXIgbWF5IGJlIGluY29ycmVjdGx5IHNldAorCQkgKiBiZWZvcmUgdGhlIGRldmljZSBoYXMgY29tcGxldGVkIHRoZSAiUGFnZSBTZWxlY3QiIE1ESQorCQkgKiB0cmFuc2FjdGlvbi4gIFNvIHdlIHdhaXQgMjAwdXMgYWZ0ZXIgZWFjaCBNREkgY29tbWFuZC4uLgorCQkgKi8KKwkJdWRlbGF5KDIwMCk7CiAKLQkvKiAuLi5hbmQgdmVyaWZ5IHRoZSBjb21tYW5kIHdhcyBzdWNjZXNzZnVsLiAqLwotCXJldF92YWwgPSBlMTAwMGVfcmVhZF9waHlfcmVnX21kaWMoaHcsIHBhZ2Vfc2VsZWN0LCAmdGVtcCk7CisJCS8qIC4uLmFuZCB2ZXJpZnkgdGhlIGNvbW1hbmQgd2FzIHN1Y2Nlc3NmdWwuICovCisJCXJldF92YWwgPSBlMTAwMGVfcmVhZF9waHlfcmVnX21kaWMoaHcsIHBhZ2Vfc2VsZWN0LCAmdGVtcCk7CiAKLQlpZiAoKCh1MTYpb2Zmc2V0ID4+IEdHODI1NjNfUEFHRV9TSElGVCkgIT0gdGVtcCkgewotCQlyZXRfdmFsID0gLUUxMDAwX0VSUl9QSFk7Ci0JCWUxMDAwX3JlbGVhc2VfcGh5XzgwMDAzZXMybGFuKGh3KTsKLQkJcmV0dXJuIHJldF92YWw7CisJCWlmICgoKHUxNilvZmZzZXQgPj4gR0c4MjU2M19QQUdFX1NISUZUKSAhPSB0ZW1wKSB7CisJCQlyZXRfdmFsID0gLUUxMDAwX0VSUl9QSFk7CisJCQllMTAwMF9yZWxlYXNlX3BoeV84MDAwM2VzMmxhbihodyk7CisJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJfQorCisJCXVkZWxheSgyMDApOworCisJCXJldF92YWwgPSBlMTAwMGVfcmVhZF9waHlfcmVnX21kaWMoaHcsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfUEhZX1JFR19BRERSRVNTICYgb2Zmc2V0LAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSk7CisKKwkJdWRlbGF5KDIwMCk7CisJfSBlbHNlIHsKKwkJcmV0X3ZhbCA9IGUxMDAwZV9yZWFkX3BoeV9yZWdfbWRpYyhodywKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9QSFlfUkVHX0FERFJFU1MgJiBvZmZzZXQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhKTsKIAl9CiAKLQl1ZGVsYXkoMjAwKTsKLQotCXJldF92YWwgPSBlMTAwMGVfcmVhZF9waHlfcmVnX21kaWMoaHcsIE1BWF9QSFlfUkVHX0FERFJFU1MgJiBvZmZzZXQsCi0JCQkJCSAgIGRhdGEpOwotCi0JdWRlbGF5KDIwMCk7CiAJZTEwMDBfcmVsZWFzZV9waHlfODAwMDNlczJsYW4oaHcpOwogCiAJcmV0dXJuIHJldF92YWw7CkBAIC01MjYsMjggKzUzNywzNSBAQAogCQlyZXR1cm4gcmV0X3ZhbDsKIAl9CiAKKwlpZiAoaHctPmRldl9zcGVjLmU4MDAwM2VzMmxhbi5tZGljX3dhX2VuYWJsZSA9PSB0cnVlKSB7CisJCS8qCisJCSAqIFRoZSAicmVhZHkiIGJpdCBpbiB0aGUgTURJQyByZWdpc3RlciBtYXkgYmUgaW5jb3JyZWN0bHkgc2V0CisJCSAqIGJlZm9yZSB0aGUgZGV2aWNlIGhhcyBjb21wbGV0ZWQgdGhlICJQYWdlIFNlbGVjdCIgTURJCisJCSAqIHRyYW5zYWN0aW9uLiAgU28gd2Ugd2FpdCAyMDB1cyBhZnRlciBlYWNoIE1ESSBjb21tYW5kLi4uCisJCSAqLworCQl1ZGVsYXkoMjAwKTsKIAotCS8qCi0JICogVGhlICJyZWFkeSIgYml0IGluIHRoZSBNRElDIHJlZ2lzdGVyIG1heSBiZSBpbmNvcnJlY3RseSBzZXQKLQkgKiBiZWZvcmUgdGhlIGRldmljZSBoYXMgY29tcGxldGVkIHRoZSAiUGFnZSBTZWxlY3QiIE1ESQotCSAqIHRyYW5zYWN0aW9uLiAgU28gd2Ugd2FpdCAyMDB1cyBhZnRlciBlYWNoIE1ESSBjb21tYW5kLi4uCi0JICovCi0JdWRlbGF5KDIwMCk7CisJCS8qIC4uLmFuZCB2ZXJpZnkgdGhlIGNvbW1hbmQgd2FzIHN1Y2Nlc3NmdWwuICovCisJCXJldF92YWwgPSBlMTAwMGVfcmVhZF9waHlfcmVnX21kaWMoaHcsIHBhZ2Vfc2VsZWN0LCAmdGVtcCk7CiAKLQkvKiAuLi5hbmQgdmVyaWZ5IHRoZSBjb21tYW5kIHdhcyBzdWNjZXNzZnVsLiAqLwotCXJldF92YWwgPSBlMTAwMGVfcmVhZF9waHlfcmVnX21kaWMoaHcsIHBhZ2Vfc2VsZWN0LCAmdGVtcCk7CisJCWlmICgoKHUxNilvZmZzZXQgPj4gR0c4MjU2M19QQUdFX1NISUZUKSAhPSB0ZW1wKSB7CisJCQllMTAwMF9yZWxlYXNlX3BoeV84MDAwM2VzMmxhbihodyk7CisJCQlyZXR1cm4gLUUxMDAwX0VSUl9QSFk7CisJCX0KIAotCWlmICgoKHUxNilvZmZzZXQgPj4gR0c4MjU2M19QQUdFX1NISUZUKSAhPSB0ZW1wKSB7Ci0JCWUxMDAwX3JlbGVhc2VfcGh5XzgwMDAzZXMybGFuKGh3KTsKLQkJcmV0dXJuIC1FMTAwMF9FUlJfUEhZOworCQl1ZGVsYXkoMjAwKTsKKworCQlyZXRfdmFsID0gZTEwMDBlX3dyaXRlX3BoeV9yZWdfbWRpYyhodywKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9QSFlfUkVHX0FERFJFU1MgJiBvZmZzZXQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhKTsKKworCQl1ZGVsYXkoMjAwKTsKKwl9IGVsc2UgeworCQlyZXRfdmFsID0gZTEwMDBlX3dyaXRlX3BoeV9yZWdfbWRpYyhodywKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9QSFlfUkVHX0FERFJFU1MgJiBvZmZzZXQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhKTsKIAl9CiAKLQl1ZGVsYXkoMjAwKTsKLQotCXJldF92YWwgPSBlMTAwMGVfd3JpdGVfcGh5X3JlZ19tZGljKGh3LCBNQVhfUEhZX1JFR19BRERSRVNTICYgb2Zmc2V0LAotCQkJCQkgICAgZGF0YSk7Ci0KLQl1ZGVsYXkoMjAwKTsKIAllMTAwMF9yZWxlYXNlX3BoeV84MDAwM2VzMmxhbihodyk7CiAKIAlyZXR1cm4gcmV0X3ZhbDsKQEAgLTg2Niw2ICs4ODQsMTkgQEAKIAlyZWdfZGF0YSAmPSB+MHgwMDEwMDAwMDsKIAlFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIEUxMDAwX0ZGTFQsIDB4MDAwMSwgcmVnX2RhdGEpOwogCisJLyogZGVmYXVsdCB0byB0cnVlIHRvIGVuYWJsZSB0aGUgTURJQyBXL0EgKi8KKwlody0+ZGV2X3NwZWMuZTgwMDAzZXMybGFuLm1kaWNfd2FfZW5hYmxlID0gdHJ1ZTsKKworCXJldF92YWwgPSBlMTAwMF9yZWFkX2ttcm5fcmVnXzgwMDAzZXMybGFuKGh3LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX0tNUk5DVFJMU1RBX09GRlNFVCA+PgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX0tNUk5DVFJMU1RBX09GRlNFVF9TSElGVCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaSk7CisJaWYgKCFyZXRfdmFsKSB7CisJCWlmICgoaSAmIEUxMDAwX0tNUk5DVFJMU1RBX09QTU9ERV9NQVNLKSA9PQorCQkgICAgIEUxMDAwX0tNUk5DVFJMU1RBX09QTU9ERV9JTkJBTkRfTURJTykKKwkJCWh3LT5kZXZfc3BlYy5lODAwMDNlczJsYW4ubWRpY193YV9lbmFibGUgPSBmYWxzZTsKKwl9CisKIAkvKgogCSAqIENsZWFyIGFsbCBvZiB0aGUgc3RhdGlzdGljcyByZWdpc3RlcnMgKGNsZWFyIG9uIHJlYWQpLiAgSXQgaXMKIAkgKiBpbXBvcnRhbnQgdGhhdCB3ZSBkbyB0aGlzIGFmdGVyIHdlIGhhdmUgdHJpZWQgdG8gZXN0YWJsaXNoIGxpbmsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwZS9ody5oIGIvZHJpdmVycy9uZXQvZTEwMDBlL2h3LmgKaW5kZXggYTdkMDhkYS4uMjc4NGNmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDBlL2h3LmgKKysrIGIvZHJpdmVycy9uZXQvZTEwMDBlL2h3LmgKQEAgLTMwMiw2ICszMDIsOCBAQAogI2RlZmluZSBFMTAwMF9LTVJOQ1RSTFNUQV9PRkZTRVRfU0hJRlQJMTYKICNkZWZpbmUgRTEwMDBfS01STkNUUkxTVEFfUkVOCQkweDAwMjAwMDAwCiAjZGVmaW5lIEUxMDAwX0tNUk5DVFJMU1RBX0RJQUdfT0ZGU0VUCTB4MyAgICAvKiBLdW1lcmFuIERpYWdub3N0aWMgKi8KKyNkZWZpbmUgRTEwMDBfS01STkNUUkxTVEFfVElNRU9VVFMJMHg0ICAgIC8qIEt1bWVyYW4gVGltZW91dHMgKi8KKyNkZWZpbmUgRTEwMDBfS01STkNUUkxTVEFfSU5CQU5EX1BBUkFNCTB4OSAgICAvKiBLdW1lcmFuIEluQmFuZCBQYXJhbWV0ZXJzICovCiAjZGVmaW5lIEUxMDAwX0tNUk5DVFJMU1RBX0RJQUdfTkVMUEJLCTB4MTAwMCAvKiBOZWFyZW5kIExvb3BiYWNrIG1vZGUgKi8KICNkZWZpbmUgRTEwMDBfS01STkNUUkxTVEFfSzFfQ09ORklHCTB4NwogI2RlZmluZSBFMTAwMF9LTVJOQ1RSTFNUQV9LMV9FTkFCTEUJMHgxNDBFCkBAIC04OTgsNiArOTAwLDEwIEBACiAJdTMyIHNtYl9jb3VudGVyOwogfTsKIAorc3RydWN0IGUxMDAwX2Rldl9zcGVjXzgwMDAzZXMybGFuIHsKKwlib29sICBtZGljX3dhX2VuYWJsZTsKK307CisKIHN0cnVjdCBlMTAwMF9zaGFkb3dfcmFtIHsKIAl1MTYgIHZhbHVlOwogCWJvb2wgbW9kaWZpZWQ7CkBAIC05MjYsNiArOTMyLDcgQEAKIAogCXVuaW9uIHsKIAkJc3RydWN0IGUxMDAwX2Rldl9zcGVjXzgyNTcxCWU4MjU3MTsKKwkJc3RydWN0IGUxMDAwX2Rldl9zcGVjXzgwMDAzZXMybGFuIGU4MDAwM2VzMmxhbjsKIAkJc3RydWN0IGUxMDAwX2Rldl9zcGVjX2ljaDhsYW4JaWNoOGxhbjsKIAl9IGRldl9zcGVjOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwZS9pY2g4bGFuLmMgYi9kcml2ZXJzL25ldC9lMTAwMGUvaWNoOGxhbi5jCmluZGV4IDdiMzNiZTkuLjliMDkyNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwZS9pY2g4bGFuLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDBlL2ljaDhsYW4uYwpAQCAtMjc1NSwxNCArMjc1NSwxNiBAQAogCSAqIGFuZCBpbmNyZWFzZSB0aGUgbWF4IGl0ZXJhdGlvbnMgd2hlbiBwb2xsaW5nIHRoZSBwaHk7CiAJICogdGhpcyBmaXhlcyBlcnJvbmVvdXMgdGltZW91dHMgYXQgMTBNYnBzLgogCSAqLwotCXJldF92YWwgPSBlMTAwMGVfd3JpdGVfa21ybl9yZWcoaHcsIEdHODI1NjNfUkVHKDB4MzQsIDQpLCAweEZGRkYpOworCXJldF92YWwgPSBlMTAwMGVfd3JpdGVfa21ybl9yZWcoaHcsIEUxMDAwX0tNUk5DVFJMU1RBX1RJTUVPVVRTLCAweEZGRkYpOwogCWlmIChyZXRfdmFsKQogCQlyZXR1cm4gcmV0X3ZhbDsKLQlyZXRfdmFsID0gZTEwMDBlX3JlYWRfa21ybl9yZWcoaHcsIEdHODI1NjNfUkVHKDB4MzQsIDkpLCAmcmVnX2RhdGEpOworCXJldF92YWwgPSBlMTAwMGVfcmVhZF9rbXJuX3JlZyhodywgRTEwMDBfS01STkNUUkxTVEFfSU5CQU5EX1BBUkFNLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVnX2RhdGEpOwogCWlmIChyZXRfdmFsKQogCQlyZXR1cm4gcmV0X3ZhbDsKIAlyZWdfZGF0YSB8PSAweDNGOwotCXJldF92YWwgPSBlMTAwMGVfd3JpdGVfa21ybl9yZWcoaHcsIEdHODI1NjNfUkVHKDB4MzQsIDkpLCByZWdfZGF0YSk7CisJcmV0X3ZhbCA9IGUxMDAwZV93cml0ZV9rbXJuX3JlZyhodywgRTEwMDBfS01STkNUUkxTVEFfSU5CQU5EX1BBUkFNLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnX2RhdGEpOwogCWlmIChyZXRfdmFsKQogCQlyZXR1cm4gcmV0X3ZhbDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDBlL25ldGRldi5jIGIvZHJpdmVycy9uZXQvZTEwMDBlL25ldGRldi5jCmluZGV4IGMzMTA1YzUuLjc2MmI2OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwZS9uZXRkZXYuYworKysgYi9kcml2ZXJzL25ldC9lMTAwMGUvbmV0ZGV2LmMKQEAgLTQ1NDEsNyArNDU0MSw3IEBACiAJCSAgICBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykgewogCQkJLyoga2VlcCB0aGUgbGFzZXIgcnVubmluZyBpbiBEMyAqLwogCQkJY3RybF9leHQgPSBlcjMyKENUUkxfRVhUKTsKLQkJCWN0cmxfZXh0IHw9IEUxMDAwX0NUUkxfRVhUX1NEUDdfREFUQTsKKwkJCWN0cmxfZXh0IHw9IEUxMDAwX0NUUkxfRVhUX1NEUDNfREFUQTsKIAkJCWV3MzIoQ1RSTF9FWFQsIGN0cmxfZXh0KTsKIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfaGNhbGwuaCBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9oY2FsbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTdkMWMzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9oY2FsbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqICBsaW51eC9kcml2ZXJzL25ldC9laGVhL2VoZWFfaGNhbGwuaAotICoKLSAqICBlSEVBIGV0aGVybmV0IGRldmljZSBkcml2ZXIgZm9yIElCTSBlU2VydmVyIFN5c3RlbSBwCi0gKgotICogIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDYKLSAqCi0gKiAgQXV0aG9yczoKLSAqICAgICAgIENocmlzdG9waCBSYWlzY2ggPHJhaXNjaEBkZS5pYm0uY29tPgotICogICAgICAgSmFuLUJlcm5kIFRoZW1hbm4gPHRoZW1hbm5AZGUuaWJtLmNvbT4KLSAqICAgICAgIFRob21hcyBLbGVpbiA8dGtsZWluQGRlLmlibS5jb20+Ci0gKgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpZm5kZWYgX19FSEVBX0hDQUxMX0hfXwotI2RlZmluZSBfX0VIRUFfSENBTExfSF9fCi0KLS8qKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIEhDQUxMIGRlZmluZXMgdGhhdCBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gKiBrZXJuZWwgZmlsZXMgbGF0ZXIKLSAqLwotCi0jZGVmaW5lIEhfQUxMT0NfSEVBX1JFU09VUkNFICAgMHgyNzgKLSNkZWZpbmUgSF9NT0RJRllfSEVBX1FQICAgICAgICAweDI1MAotI2RlZmluZSBIX1FVRVJZX0hFQV9RUCAgICAgICAgIDB4MjU0Ci0jZGVmaW5lIEhfUVVFUllfSEVBICAgICAgICAgICAgMHgyNTgKLSNkZWZpbmUgSF9RVUVSWV9IRUFfUE9SVCAgICAgICAweDI1QwotI2RlZmluZSBIX01PRElGWV9IRUFfUE9SVCAgICAgIDB4MjYwCi0jZGVmaW5lIEhfUkVHX0JDTUMgICAgICAgICAgICAgMHgyNjQKLSNkZWZpbmUgSF9ERVJFR19CQ01DICAgICAgICAgICAweDI2OAotI2RlZmluZSBIX1JFR0lTVEVSX0hFQV9SUEFHRVMgIDB4MjZDCi0jZGVmaW5lIEhfRElTQUJMRV9BTkRfR0VUX0hFQSAgMHgyNzAKLSNkZWZpbmUgSF9HRVRfSEVBX0lORk8gICAgICAgICAweDI3NAotI2RlZmluZSBIX0FERF9DT05OICAgICAgICAgICAgIDB4Mjg0Ci0jZGVmaW5lIEhfREVMX0NPTk4gICAgICAgICAgICAgMHgyODgKLQotI2VuZGlmCS8qIF9fRUhFQV9IQ0FMTF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9waHlwLmggYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfcGh5cC5oCmluZGV4IGYzNjI4YzguLjJmODE3NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9waHlwLmgKKysrIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX3BoeXAuaApAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1ZGUgPGFzbS9odmNhbGwuaD4KICNpbmNsdWRlICJlaGVhLmgiCiAjaW5jbHVkZSAiZWhlYV9ody5oIgotI2luY2x1ZGUgImVoZWFfaGNhbGwuaCIKIAogLyogU29tZSBhYmJyZXZpYXRpb25zIHVzZWQgaGVyZToKICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mZWNfbXBjNTJ4eC5jIGIvZHJpdmVycy9uZXQvZmVjX21wYzUyeHguYwppbmRleCA2NDA3NjcyLi44NDhlODQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mZWNfbXBjNTJ4eC5jCisrKyBiL2RyaXZlcnMvbmV0L2ZlY19tcGM1Mnh4LmMKQEAgLTg1LDExICs4NSwxNSBAQAogCiBzdGF0aWMgdm9pZCBtcGM1Mnh4X2ZlY190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IG1wYzUyeHhfZmVjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKIAlkZXZfd2FybigmZGV2LT5kZXYsICJ0cmFuc21pdCB0aW1lZCBvdXRcbiIpOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAltcGM1Mnh4X2ZlY19yZXNldChkZXYpOwotCiAJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKIAluZXRpZl93YWtlX3F1ZXVlKGRldik7CiB9CkBAIC0xMzUsMjggKzEzOSwzMiBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQKK21wYzUyeHhfZmVjX3J4X3N1Ym1pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqcnNrYikKK3sKKwlzdHJ1Y3QgbXBjNTJ4eF9mZWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGJjb21fZmVjX2JkICpiZDsKKworCWJkID0gKHN0cnVjdCBiY29tX2ZlY19iZCAqKSBiY29tX3ByZXBhcmVfbmV4dF9idWZmZXIocHJpdi0+cnhfZG1hdHNrKTsKKwliZC0+c3RhdHVzID0gRkVDX1JYX0JVRkZFUl9TSVpFOworCWJkLT5za2JfcGEgPSBkbWFfbWFwX3NpbmdsZShkZXYtPmRldi5wYXJlbnQsIHJza2ItPmRhdGEsCisJCQkJICAgIEZFQ19SWF9CVUZGRVJfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwliY29tX3N1Ym1pdF9uZXh0X2J1ZmZlcihwcml2LT5yeF9kbWF0c2ssIHJza2IpOworfQorCiBzdGF0aWMgaW50IG1wYzUyeHhfZmVjX2FsbG9jX3J4X2J1ZmZlcnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGJjb21fdGFzayAqcnh0c2spCiB7Ci0Jd2hpbGUgKCFiY29tX3F1ZXVlX2Z1bGwocnh0c2spKSB7Ci0JCXN0cnVjdCBza19idWZmICpza2I7Ci0JCXN0cnVjdCBiY29tX2ZlY19iZCAqYmQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAorCXdoaWxlICghYmNvbV9xdWV1ZV9mdWxsKHJ4dHNrKSkgewogCQlza2IgPSBkZXZfYWxsb2Nfc2tiKEZFQ19SWF9CVUZGRVJfU0laRSk7Ci0JCWlmIChza2IgPT0gTlVMTCkKKwkJaWYgKCFza2IpCiAJCQlyZXR1cm4gLUVBR0FJTjsKIAogCQkvKiB6ZXJvIG91dCB0aGUgaW5pdGlhbCByZWNlaXZlIGJ1ZmZlcnMgdG8gYWlkIGRlYnVnZ2luZyAqLwogCQltZW1zZXQoc2tiLT5kYXRhLCAwLCBGRUNfUlhfQlVGRkVSX1NJWkUpOwotCi0JCWJkID0gKHN0cnVjdCBiY29tX2ZlY19iZCAqKWJjb21fcHJlcGFyZV9uZXh0X2J1ZmZlcihyeHRzayk7Ci0KLQkJYmQtPnN0YXR1cyA9IEZFQ19SWF9CVUZGRVJfU0laRTsKLQkJYmQtPnNrYl9wYSA9IGRtYV9tYXBfc2luZ2xlKGRldi0+ZGV2LnBhcmVudCwgc2tiLT5kYXRhLAotCQkJCUZFQ19SWF9CVUZGRVJfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKLQotCQliY29tX3N1Ym1pdF9uZXh0X2J1ZmZlcihyeHRzaywgc2tiKTsKKwkJbXBjNTJ4eF9mZWNfcnhfc3VibWl0KGRldiwgc2tiKTsKIAl9Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMzI4LDEzICszMzYsMTIgQEAKIAkJCQkgICAgRE1BX1RPX0RFVklDRSk7CiAKIAliY29tX3N1Ym1pdF9uZXh0X2J1ZmZlcihwcml2LT50eF9kbWF0c2ssIHNrYik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKGJjb21fcXVldWVfZnVsbChwcml2LT50eF9kbWF0c2spKSB7CiAJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIAl9CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KIAlyZXR1cm4gTkVUREVWX1RYX09LOwogfQogCkBAIC0zNTksOSArMzY2LDkgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOwogCXN0cnVjdCBtcGM1Mnh4X2ZlY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKLQorCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJd2hpbGUgKGJjb21fYnVmZmVyX2RvbmUocHJpdi0+dHhfZG1hdHNrKSkgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCQlzdHJ1Y3QgYmNvbV9mZWNfYmQgKmJkOwpAQCAtMzcyLDExICszNzksMTAgQEAKIAogCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOwogCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKIAluZXRpZl93YWtlX3F1ZXVlKGRldik7CiAKLQlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7Ci0KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKQEAgLTM4NCw2NyArMzkwLDYwIEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKIAlzdHJ1Y3QgbXBjNTJ4eF9mZWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNrX2J1ZmYgKnJza2I7IC8qIHJlY2VpdmVkIHNrX2J1ZmYgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOyAgLyogbmV3IHNrX2J1ZmYgdG8gZW5xdWV1ZSBpbiBpdHMgcGxhY2UgKi8KKwlzdHJ1Y3QgYmNvbV9mZWNfYmQgKmJkOworCXUzMiBzdGF0dXMsIHBoeXNhZGRyOworCWludCBsZW5ndGg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKIAl3aGlsZSAoYmNvbV9idWZmZXJfZG9uZShwcml2LT5yeF9kbWF0c2spKSB7Ci0JCXN0cnVjdCBza19idWZmICpza2I7Ci0JCXN0cnVjdCBza19idWZmICpyc2tiOwotCQlzdHJ1Y3QgYmNvbV9mZWNfYmQgKmJkOwotCQl1MzIgc3RhdHVzOwogCiAJCXJza2IgPSBiY29tX3JldHJpZXZlX2J1ZmZlcihwcml2LT5yeF9kbWF0c2ssICZzdGF0dXMsCi0JCQkJKHN0cnVjdCBiY29tX2JkICoqKSZiZCk7Ci0JCWRtYV91bm1hcF9zaW5nbGUoZGV2LT5kZXYucGFyZW50LCBiZC0+c2tiX3BhLCByc2tiLT5sZW4sCi0JCQkJIERNQV9GUk9NX0RFVklDRSk7CisJCQkJCSAgICAoc3RydWN0IGJjb21fYmQgKiopJmJkKTsKKwkJcGh5c2FkZHIgPSBiZC0+c2tiX3BhOwogCiAJCS8qIFRlc3QgZm9yIGVycm9ycyBpbiByZWNlaXZlZCBmcmFtZSAqLwogCQlpZiAoc3RhdHVzICYgQkNPTV9GRUNfUlhfQkRfRVJST1JTKSB7CiAJCQkvKiBEcm9wIHBhY2tldCBhbmQgcmV1c2UgdGhlIGJ1ZmZlciAqLwotCQkJYmQgPSAoc3RydWN0IGJjb21fZmVjX2JkICopCi0JCQkJYmNvbV9wcmVwYXJlX25leHRfYnVmZmVyKHByaXYtPnJ4X2RtYXRzayk7Ci0KLQkJCWJkLT5zdGF0dXMgPSBGRUNfUlhfQlVGRkVSX1NJWkU7Ci0JCQliZC0+c2tiX3BhID0gZG1hX21hcF9zaW5nbGUoZGV2LT5kZXYucGFyZW50LAotCQkJCQlyc2tiLT5kYXRhLAotCQkJCQlGRUNfUlhfQlVGRkVSX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7Ci0KLQkJCWJjb21fc3VibWl0X25leHRfYnVmZmVyKHByaXYtPnJ4X2RtYXRzaywgcnNrYik7Ci0KKwkJCW1wYzUyeHhfZmVjX3J4X3N1Ym1pdChkZXYsIHJza2IpOwogCQkJZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7Ci0KIAkJCWNvbnRpbnVlOwogCQl9CiAKIAkJLyogc2ticyBhcmUgYWxsb2NhdGVkIG9uIG9wZW4sIHNvIG5vdyB3ZSBhbGxvY2F0ZSBhIG5ldyBvbmUsCiAJCSAqIGFuZCByZW1vdmUgdGhlIG9sZCAod2l0aCB0aGUgcGFja2V0KSAqLwogCQlza2IgPSBkZXZfYWxsb2Nfc2tiKEZFQ19SWF9CVUZGRVJfU0laRSk7Ci0JCWlmIChza2IpIHsKLQkJCS8qIFByb2Nlc3MgdGhlIHJlY2VpdmVkIHNrYiAqLwotCQkJaW50IGxlbmd0aCA9IHN0YXR1cyAmIEJDT01fRkVDX1JYX0JEX0xFTl9NQVNLOwotCi0JCQlza2JfcHV0KHJza2IsIGxlbmd0aCAtIDQpOwkvKiBsZW5ndGggd2l0aG91dCBDUkMzMiAqLwotCi0JCQlyc2tiLT5kZXYgPSBkZXY7Ci0JCQlyc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHJza2IsIGRldik7Ci0KLQkJCW5ldGlmX3J4KHJza2IpOwotCQl9IGVsc2UgeworCQlpZiAoIXNrYikgewogCQkJLyogQ2FuJ3QgZ2V0IGEgbmV3IG9uZSA6IHJldXNlIHRoZSBzYW1lICYgZHJvcCBwa3QgKi8KLQkJCWRldl9ub3RpY2UoJmRldi0+ZGV2LCAiTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIpOworCQkJZGV2X25vdGljZSgmZGV2LT5kZXYsICJMb3cgbWVtb3J5IC0gZHJvcHBlZCBwYWNrZXQuXG4iKTsKKwkJCW1wYzUyeHhfZmVjX3J4X3N1Ym1pdChkZXYsIHJza2IpOwogCQkJZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7Ci0KLQkJCXNrYiA9IHJza2I7CisJCQljb250aW51ZTsKIAkJfQogCi0JCWJkID0gKHN0cnVjdCBiY29tX2ZlY19iZCAqKQotCQkJYmNvbV9wcmVwYXJlX25leHRfYnVmZmVyKHByaXYtPnJ4X2RtYXRzayk7CisJCS8qIEVucXVldWUgdGhlIG5ldyBza19idWZmIGJhY2sgb24gdGhlIGhhcmR3YXJlICovCisJCW1wYzUyeHhfZmVjX3J4X3N1Ym1pdChkZXYsIHNrYik7CiAKLQkJYmQtPnN0YXR1cyA9IEZFQ19SWF9CVUZGRVJfU0laRTsKLQkJYmQtPnNrYl9wYSA9IGRtYV9tYXBfc2luZ2xlKGRldi0+ZGV2LnBhcmVudCwgc2tiLT5kYXRhLAotCQkJCUZFQ19SWF9CVUZGRVJfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwkJLyogUHJvY2VzcyB0aGUgcmVjZWl2ZWQgc2tiIC0gRHJvcCB0aGUgc3BpbiBsb2NrIHdoaWxlCisJCSAqIGNhbGxpbmcgaW50byB0aGUgbmV0d29yayBzdGFjayAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKLQkJYmNvbV9zdWJtaXRfbmV4dF9idWZmZXIocHJpdi0+cnhfZG1hdHNrLCBza2IpOworCQlkbWFfdW5tYXBfc2luZ2xlKGRldi0+ZGV2LnBhcmVudCwgcGh5c2FkZHIsIHJza2ItPmxlbiwKKwkJCQkgRE1BX0ZST01fREVWSUNFKTsKKwkJbGVuZ3RoID0gc3RhdHVzICYgQkNPTV9GRUNfUlhfQkRfTEVOX01BU0s7CisJCXNrYl9wdXQocnNrYiwgbGVuZ3RoIC0gNCk7CS8qIGxlbmd0aCB3aXRob3V0IENSQzMyICovCisJCXJza2ItPmRldiA9IGRldjsKKwkJcnNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhyc2tiLCBkZXYpOworCQluZXRpZl9yeChyc2tiKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCX0KIAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtNDU0LDYgKzQ1Myw3IEBACiAJc3RydWN0IG1wYzUyeHhfZmVjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBtcGM1Mnh4X2ZlYyBfX2lvbWVtICpmZWMgPSBwcml2LT5mZWM7CiAJdTMyIGlldmVudDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWV2ZW50ID0gaW5fYmUzMigmZmVjLT5pZXZlbnQpOwogCkBAIC00NzEsOSArNDcxLDEwIEBACiAJCWlmIChuZXRfcmF0ZWxpbWl0KCkgJiYgKGlldmVudCAmIEZFQ19JRVZFTlRfWEZJRk9fRVJST1IpKQogCQkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiRkVDX0lFVkVOVF9YRklGT19FUlJPUlxuIik7CiAKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAkJbXBjNTJ4eF9mZWNfcmVzZXQoZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCi0JCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCX0KIApAQCAtNzY4LDYgKzc2OSw4IEBACiAJYmNvbV9lbmFibGUocHJpdi0+dHhfZG1hdHNrKTsKIAogCW1wYzUyeHhfZmVjX3N0YXJ0KGRldik7CisKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZ2lhbmZhci5jIGIvZHJpdmVycy9uZXQvZ2lhbmZhci5jCmluZGV4IDE2ZGVmMTMuLjY4NTBkYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2dpYW5mYXIuYworKysgYi9kcml2ZXJzL25ldC9naWFuZmFyLmMKQEAgLTI2NDQsNiArMjY0NCw3IEBACiAJCQlnZmFyX2ludGVycnVwdChwcml2LT5nZmFyZ3JwW2ldLmludGVycnVwdFRyYW5zbWl0LAogCQkJCQkJJnByaXYtPmdmYXJncnBbaV0pOwogCQkJZW5hYmxlX2lycShwcml2LT5nZmFyZ3JwW2ldLmludGVycnVwdFRyYW5zbWl0KTsKKwkJfQogCX0KIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWdiL2lnYl9tYWluLmMgYi9kcml2ZXJzL25ldC9pZ2IvaWdiX21haW4uYwppbmRleCAxNjM0OWJhLi43ODk2M2EwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pZ2IvaWdiX21haW4uYworKysgYi9kcml2ZXJzL25ldC9pZ2IvaWdiX21haW4uYwpAQCAtNDYwOCw4ICs0NjA4LDE0IEBACiAKIAlyZXR2YWwgPSBpZ2JfcmVhZF9tYngoaHcsIG1zZ2J1ZiwgRTEwMDBfVkZNQUlMQk9YX1NJWkUsIHZmKTsKIAotCWlmIChyZXR2YWwpCisJaWYgKHJldHZhbCkgeworCQkvKiBpZiByZWNlaXZlIGZhaWxlZCByZXZva2UgVkYgQ1RTIHN0YXRzIGFuZCByZXN0YXJ0IGluaXQgKi8KIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiRXJyb3IgcmVjZWl2aW5nIG1lc3NhZ2UgZnJvbSBWRlxuIik7CisJCXZmX2RhdGEtPmZsYWdzICY9IH5JR0JfVkZfRkxBR19DVFM7CisJCWlmICghdGltZV9hZnRlcihqaWZmaWVzLCB2Zl9kYXRhLT5sYXN0X25hY2sgKyAoMiAqIEhaKSkpCisJCQlyZXR1cm47CisJCWdvdG8gb3V0OworCX0KIAogCS8qIHRoaXMgaXMgYSBtZXNzYWdlIHdlIGFscmVhZHkgcHJvY2Vzc2VkLCBkbyBub3RoaW5nICovCiAJaWYgKG1zZ2J1ZlswXSAmIChFMTAwMF9WVF9NU0dUWVBFX0FDSyB8IEUxMDAwX1ZUX01TR1RZUEVfTkFDSykpCkBAIC00NjI2LDEyICs0NjMyLDEwIEBACiAJfQogCiAJaWYgKCEodmZfZGF0YS0+ZmxhZ3MgJiBJR0JfVkZfRkxBR19DVFMpKSB7Ci0JCW1zZ2J1ZlswXSA9IEUxMDAwX1ZUX01TR1RZUEVfTkFDSzsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdmZfZGF0YS0+bGFzdF9uYWNrICsgKDIgKiBIWikpKSB7Ci0JCQlpZ2Jfd3JpdGVfbWJ4KGh3LCBtc2didWYsIDEsIHZmKTsKLQkJCXZmX2RhdGEtPmxhc3RfbmFjayA9IGppZmZpZXM7Ci0JCX0KLQkJcmV0dXJuOworCQlpZiAoIXRpbWVfYWZ0ZXIoamlmZmllcywgdmZfZGF0YS0+bGFzdF9uYWNrICsgKDIgKiBIWikpKQorCQkJcmV0dXJuOworCQlyZXR2YWwgPSAtMTsKKwkJZ290byBvdXQ7CiAJfQogCiAJc3dpdGNoICgobXNnYnVmWzBdICYgMHhGRkZGKSkgewpAQCAtNDY1NiwxNCArNDY2MCwxNCBAQAogCQlicmVhazsKIAl9CiAKKwltc2didWZbMF0gfD0gRTEwMDBfVlRfTVNHVFlQRV9DVFM7CitvdXQ6CiAJLyogbm90aWZ5IHRoZSBWRiBvZiB0aGUgcmVzdWx0cyBvZiB3aGF0IGl0IHNlbnQgdXMgKi8KIAlpZiAocmV0dmFsKQogCQltc2didWZbMF0gfD0gRTEwMDBfVlRfTVNHVFlQRV9OQUNLOwogCWVsc2UKIAkJbXNnYnVmWzBdIHw9IEUxMDAwX1ZUX01TR1RZUEVfQUNLOwogCi0JbXNnYnVmWzBdIHw9IEUxMDAwX1ZUX01TR1RZUEVfQ1RTOwotCiAJaWdiX3dyaXRlX21ieChodywgbXNnYnVmLCAxLCB2Zik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lnYnZmL2lnYnZmLmggYi9kcml2ZXJzL25ldC9pZ2J2Zi9pZ2J2Zi5oCmluZGV4IDNkMWVlN2EuLmExNzc0YjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lnYnZmL2lnYnZmLmgKKysrIGIvZHJpdmVycy9uZXQvaWdidmYvaWdidmYuaApAQCAtMjc2LDYgKzI3Niw3IEBACiAJdW5zaWduZWQgbG9uZyBsZWRfc3RhdHVzOwogCiAJdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGxvbmcgbGFzdF9yZXNldDsKIH07CiAKIHN0cnVjdCBpZ2J2Zl9pbmZvIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lnYnZmL25ldGRldi5jIGIvZHJpdmVycy9uZXQvaWdidmYvbmV0ZGV2LmMKaW5kZXggYTEyNzYyMC4uZTlkZDk1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWdidmYvbmV0ZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvaWdidmYvbmV0ZGV2LmMKQEAgLTE0NjksNiArMTQ2OSw4IEBACiAJCW1lbWNweShuZXRkZXYtPnBlcm1fYWRkciwgYWRhcHRlci0+aHcubWFjLmFkZHIsCiAJCSAgICAgICBuZXRkZXYtPmFkZHJfbGVuKTsKIAl9CisKKwlhZGFwdGVyLT5sYXN0X3Jlc2V0ID0gamlmZmllczsKIH0KIAogaW50IGlnYnZmX3VwKHN0cnVjdCBpZ2J2Zl9hZGFwdGVyICphZGFwdGVyKQpAQCAtMTgxMiwxMSArMTgxNCwxNSBAQAogCXMzMiByZXRfdmFsID0gRTEwMDBfU1VDQ0VTUzsKIAlib29sIGxpbmtfYWN0aXZlOwogCisJLyogSWYgaW50ZXJmYWNlIGlzIGRvd24sIHN0YXkgbGluayBkb3duICovCisJaWYgKHRlc3RfYml0KF9fSUdCVkZfRE9XTiwgJmFkYXB0ZXItPnN0YXRlKSkKKwkJcmV0dXJuIGZhbHNlOworCiAJcmV0X3ZhbCA9IGh3LT5tYWMub3BzLmNoZWNrX2Zvcl9saW5rKGh3KTsKIAlsaW5rX2FjdGl2ZSA9ICFody0+bWFjLmdldF9saW5rX3N0YXR1czsKIAogCS8qIGlmIGNoZWNrIGZvciBsaW5rIHJldHVybnMgZXJyb3Igd2Ugd2lsbCBuZWVkIHRvIHJlc2V0ICovCi0JaWYgKHJldF92YWwpCisJaWYgKHJldF92YWwgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBhZGFwdGVyLT5sYXN0X3Jlc2V0ICsgKDEwICogSFopKSkKIAkJc2NoZWR1bGVfd29yaygmYWRhcHRlci0+cmVzZXRfdGFzayk7CiAKIAlyZXR1cm4gbGlua19hY3RpdmU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV84MjU5OS5jIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfODI1OTkuYwppbmRleCA3MjEwNjg5Li41MzgzNDA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV84MjU5OS5jCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlXzgyNTk5LmMKQEAgLTM0Miw2ICszNDIsNyBAQAogCWNhc2UgSVhHQkVfREVWX0lEXzgyNTk5X0tYNDoKIAljYXNlIElYR0JFX0RFVl9JRF84MjU5OV9LWDRfTUVaWjoKIAljYXNlIElYR0JFX0RFVl9JRF84MjU5OV9DT01CT19CQUNLUExBTkU6CisJY2FzZSBJWEdCRV9ERVZfSURfODI1OTlfS1I6CiAJY2FzZSBJWEdCRV9ERVZfSURfODI1OTlfWEFVSV9MT006CiAJCS8qIERlZmF1bHQgZGV2aWNlIElEIGlzIG1lenphbmluZSBjYXJkIEtYL0tYNCAqLwogCQltZWRpYV90eXBlID0gaXhnYmVfbWVkaWFfdHlwZV9iYWNrcGxhbmU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9ldGh0b29sLmMKaW5kZXggMDZhOWQxOC4uMGJkNDlkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2V0aHRvb2wuYwpAQCAtOTkwLDYgKzk5MCw3IEBACiAJY2hhciAqcCA9IE5VTEw7CiAKIAlpeGdiZV91cGRhdGVfc3RhdHMoYWRhcHRlcik7CisJZGV2X2dldF9zdGF0cyhuZXRkZXYpOwogCWZvciAoaSA9IDA7IGkgPCBJWEdCRV9HTE9CQUxfU1RBVFNfTEVOOyBpKyspIHsKIAkJc3dpdGNoIChpeGdiZV9nc3RyaW5nc19zdGF0c1tpXS50eXBlKSB7CiAJCWNhc2UgTkVUREVWX1NUQVRTOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfbWFpbi5jIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfbWFpbi5jCmluZGV4IDI0N2VkMmEuLjM1ZWE4YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX21haW4uYworKysgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9tYWluLmMKQEAgLTk2LDYgKzk2LDggQEAKIAkgYm9hcmRfODI1OTkgfSwKIAl7UENJX1ZERVZJQ0UoSU5URUwsIElYR0JFX0RFVl9JRF84MjU5OV9YQVVJX0xPTSksCiAJIGJvYXJkXzgyNTk5IH0sCisJe1BDSV9WREVWSUNFKElOVEVMLCBJWEdCRV9ERVZfSURfODI1OTlfS1IpLAorCSBib2FyZF84MjU5OSB9LAogCXtQQ0lfVkRFVklDRShJTlRFTCwgSVhHQkVfREVWX0lEXzgyNTk5X1NGUCksCiAJIGJvYXJkXzgyNTk5IH0sCiAJe1BDSV9WREVWSUNFKElOVEVMLCBJWEdCRV9ERVZfSURfODI1OTlfU0ZQX0VNKSwKQEAgLTQzNSw4ICs0MzcsNiBAQAogCXR4X3JpbmctPnRvdGFsX3BhY2tldHMgKz0gdG90YWxfcGFja2V0czsKIAl0eF9yaW5nLT5zdGF0cy5wYWNrZXRzICs9IHRvdGFsX3BhY2tldHM7CiAJdHhfcmluZy0+c3RhdHMuYnl0ZXMgKz0gdG90YWxfYnl0ZXM7Ci0JbmV0ZGV2LT5zdGF0cy50eF9ieXRlcyArPSB0b3RhbF9ieXRlczsKLQluZXRkZXYtPnN0YXRzLnR4X3BhY2tldHMgKz0gdG90YWxfcGFja2V0czsKIAlyZXR1cm4gKGNvdW50IDwgdHhfcmluZy0+d29ya19saW1pdCk7CiB9CiAKQEAgLTUzMjcsNiArNTMyNyw3IEBACiB7CiAJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBpeGdiZV9yaW5nICp0eF9yaW5nOworCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cTsKIAl1bnNpZ25lZCBpbnQgZmlyc3Q7CiAJdW5zaWduZWQgaW50IHR4X2ZsYWdzID0gMDsKIAl1OCBoZHJfbGVuID0gMDsKQEAgLTU0MjQsNiArNTQyNSw5IEBACiAJCQkJdHhfcmluZy0+YXRyX2NvdW50ID0gMDsKIAkJCX0KIAkJfQorCQl0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKG5ldGRldiwgdHhfcmluZy0+cXVldWVfaW5kZXgpOworCQl0eHEtPnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQl0eHEtPnR4X3BhY2tldHMrKzsKIAkJaXhnYmVfdHhfcXVldWUoYWRhcHRlciwgdHhfcmluZywgdHhfZmxhZ3MsIGNvdW50LCBza2ItPmxlbiwKIAkJICAgICAgICAgICAgICAgaGRyX2xlbik7CiAJCWl4Z2JlX21heWJlX3N0b3BfdHgobmV0ZGV2LCB0eF9yaW5nLCBERVNDX05FRURFRCk7CkBAIC01NDM4LDE5ICs1NDQyLDYgQEAKIH0KIAogLyoqCi0gKiBpeGdiZV9nZXRfc3RhdHMgLSBHZXQgU3lzdGVtIE5ldHdvcmsgU3RhdGlzdGljcwotICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQotICoKLSAqIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBzdGF0aXN0aWNzIHN0cnVjdHVyZS4KLSAqIFRoZSBzdGF0aXN0aWNzIGFyZSBhY3R1YWxseSB1cGRhdGVkIGZyb20gdGhlIHRpbWVyIGNhbGxiYWNrLgotICoqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppeGdiZV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQkvKiBvbmx5IHJldHVybiB0aGUgY3VycmVudCBzdGF0cyAqLwotCXJldHVybiAmbmV0ZGV2LT5zdGF0czsKLX0KLQotLyoqCiAgKiBpeGdiZV9zZXRfbWFjIC0gQ2hhbmdlIHRoZSBFdGhlcm5ldCBBZGRyZXNzIG9mIHRoZSBOSUMKICAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKICAqIEBwOiBwb2ludGVyIHRvIGFuIGFkZHJlc3Mgc3RydWN0dXJlCkBAIC01NTgwLDcgKzU1NzEsNiBAQAogCS5uZG9fc3RvcAkJPSBpeGdiZV9jbG9zZSwKIAkubmRvX3N0YXJ0X3htaXQJCT0gaXhnYmVfeG1pdF9mcmFtZSwKIAkubmRvX3NlbGVjdF9xdWV1ZQk9IGl4Z2JlX3NlbGVjdF9xdWV1ZSwKLQkubmRvX2dldF9zdGF0cwkJPSBpeGdiZV9nZXRfc3RhdHMsCiAJLm5kb19zZXRfcnhfbW9kZSAgICAgICAgPSBpeGdiZV9zZXRfcnhfbW9kZSwKIAkubmRvX3NldF9tdWx0aWNhc3RfbGlzdAk9IGl4Z2JlX3NldF9yeF9tb2RlLAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfdHlwZS5oIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfdHlwZS5oCmluZGV4IDIxYjY2MzNkYS4uZjNlOGQ1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfdHlwZS5oCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX3R5cGUuaApAQCAtNTAsNiArNTAsNyBAQAogI2RlZmluZSBJWEdCRV9ERVZfSURfODI1OThFQl9YRl9MUiAgICAgICAweDEwRjQKICNkZWZpbmUgSVhHQkVfREVWX0lEXzgyNTk5X0tYNCAgICAgICAgICAgMHgxMEY3CiAjZGVmaW5lIElYR0JFX0RFVl9JRF84MjU5OV9LWDRfTUVaWiAgICAgIDB4MTUxNAorI2RlZmluZSBJWEdCRV9ERVZfSURfODI1OTlfS1IgICAgICAgICAgICAweDE1MTcKICNkZWZpbmUgSVhHQkVfREVWX0lEXzgyNTk5X0NYNCAgICAgICAgICAgMHgxMEY5CiAjZGVmaW5lIElYR0JFX0RFVl9JRF84MjU5OV9TRlAgICAgICAgICAgIDB4MTBGQgogI2RlZmluZSBJWEdCRV9ERVZfSURfODI1OTlfU0ZQX0VNICAgICAgICAweDE1MDcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2xvb3BiYWNrLmMgYi9kcml2ZXJzL25ldC9sb29wYmFjay5jCmluZGV4IGVhZTRhZDcuLmI5ZmNjOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2xvb3BiYWNrLmMKKysrIGIvZHJpdmVycy9uZXQvbG9vcGJhY2suYwpAQCAtODEsNyArODEsNyBAQAogCiAJLyogaXQncyBPSyB0byB1c2UgcGVyX2NwdV9wdHIoKSBiZWNhdXNlIEJIcyBhcmUgb2ZmICovCiAJcGNwdV9sc3RhdHMgPSBkZXYtPm1sX3ByaXY7Ci0JbGJfc3RhdHMgPSBwZXJfY3B1X3B0cihwY3B1X2xzdGF0cywgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlsYl9zdGF0cyA9IHRoaXNfY3B1X3B0cihwY3B1X2xzdGF0cyk7CiAKIAlsZW4gPSBza2ItPmxlbjsKIAlpZiAobGlrZWx5KG5ldGlmX3J4KHNrYikgPT0gTkVUX1JYX1NVQ0NFU1MpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5jIGIvZHJpdmVycy9uZXQvbXY2NDN4eF9ldGguYwppbmRleCA3OTZhNDkzLi4xNDA1YTE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L212NjQzeHhfZXRoLmMKQEAgLTE4MjcsNiArMTgyNyw5IEBACiB7CiAJc3RydWN0IHNvY2thZGRyICpzYSA9IGFkZHI7CiAKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoc2EtPnNhX2RhdGEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCW1lbWNweShkZXYtPmRldl9hZGRyLCBzYS0+c2FfZGF0YSwgRVRIX0FMRU4pOwogCiAJbmV0aWZfYWRkcl9sb2NrX2JoKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jIGIvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYwppbmRleCBkMzg5MjE5Li4zZmNiMWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jCisrKyBiL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlLmMKQEAgLTc1LDcgKzc1LDcgQEAKICNpbmNsdWRlICJteXJpMTBnZV9tY3AuaCIKICNpbmNsdWRlICJteXJpMTBnZV9tY3BfZ2VuX2hlYWRlci5oIgogCi0jZGVmaW5lIE1ZUkkxMEdFX1ZFUlNJT05fU1RSICIxLjUuMS0xLjQ1MSIKKyNkZWZpbmUgTVlSSTEwR0VfVkVSU0lPTl9TVFIgIjEuNS4xLTEuNDUzIgogCiBNT0RVTEVfREVTQ1JJUFRJT04oIk15cmljb20gMTBHIGRyaXZlciAoMTBHYkUpIik7CiBNT0RVTEVfQVVUSE9SKCJNYWludGFpbmVyOiBoZWxwQG15cmkuY29tIik7CkBAIC0zNDcsNyArMzQ3LDcgQEAKIG1vZHVsZV9wYXJhbShteXJpMTBnZV9tYXhfc2xpY2VzLCBpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhteXJpMTBnZV9tYXhfc2xpY2VzLCAiTWF4IHR4L3J4IHF1ZXVlcyIpOwogCi1zdGF0aWMgaW50IG15cmkxMGdlX3Jzc19oYXNoID0gTVhHRUZXX1JTU19IQVNIX1RZUEVfU1JDX1BPUlQ7CitzdGF0aWMgaW50IG15cmkxMGdlX3Jzc19oYXNoID0gTVhHRUZXX1JTU19IQVNIX1RZUEVfU1JDX0RTVF9QT1JUOwogbW9kdWxlX3BhcmFtKG15cmkxMGdlX3Jzc19oYXNoLCBpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhteXJpMTBnZV9yc3NfaGFzaCwgIlR5cGUgb2YgUlNTIGhhc2hpbmcgdG8gZG8iKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaW5pdC5jIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaW5pdC5jCmluZGV4IDgwYTY2NzQuLjAyZjhkNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2luaXQuYworKysgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19pbml0LmMKQEAgLTYxOSwxNyArNjE5LDIwIEBACiAJdWludDMyX3QgaTsKIAlfX2xlMzIgZW50cmllczsKIAorCWludCBtbl9wcmVzZW50ID0gKE5YX0lTX1JFVklTSU9OX1AyKGFkYXB0ZXItPmFody5yZXZpc2lvbl9pZCkpID8KKwkJCTEgOiBuZXR4ZW5fcDNfaGFzX21uKGFkYXB0ZXIpOworCiAJcHRhYl9kZXNjciA9IG54X2dldF90YWJsZV9kZXNjKHVuaXJvbSwgTlhfVU5JX0RJUl9TRUNUX1BST0RVQ1RfVEJMKTsKIAlpZiAocHRhYl9kZXNjciA9PSBOVUxMKQogCQlyZXR1cm4gLTE7CiAKIAllbnRyaWVzID0gY3B1X3RvX2xlMzIocHRhYl9kZXNjci0+bnVtX2VudHJpZXMpOwogCitub21uOgogCWZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspIHsKIAogCQlfX2xlMzIgZmxhZ3MsIGZpbGVfY2hpcHJldiwgb2ZmczsKIAkJdTggY2hpcHJldiA9IGFkYXB0ZXItPmFody5yZXZpc2lvbl9pZDsKLQkJaW50IG1uX3ByZXNlbnQgPSBuZXR4ZW5fcDNfaGFzX21uKGFkYXB0ZXIpOwogCQl1aW50MzJfdCBmbGFnYml0OwogCiAJCW9mZnMgPSBjcHVfdG9fbGUzMihwdGFiX2Rlc2NyLT5maW5kZXgpICsKQEAgLTY0Nyw2ICs2NTAsMTEgQEAKIAkJfQogCX0KIAorCWlmIChtbl9wcmVzZW50ICYmIE5YX0lTX1JFVklTSU9OX1AzKGFkYXB0ZXItPmFody5yZXZpc2lvbl9pZCkpIHsKKwkJbW5fcHJlc2VudCA9IDA7CisJCWdvdG8gbm9tbjsKKwl9CisKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTEwMjEsNiArMTAyOSwxMCBAQAogCXUzMiBjYXBhYmlsaXR5LCBmbGFzaGVkX3ZlcjsKIAljYXBhYmlsaXR5ID0gMDsKIAorCS8qIE5YMjAzMSBhbHdheXMgaGFkIE1OICovCisJaWYgKE5YX0lTX1JFVklTSU9OX1AyKGFkYXB0ZXItPmFody5yZXZpc2lvbl9pZCkpCisJCXJldHVybiAxOworCiAJbmV0eGVuX3JvbV9mYXN0X3JlYWQoYWRhcHRlciwKIAkJCU5YX0ZXX1ZFUlNJT05fT0ZGU0VULCAoaW50ICopJmZsYXNoZWRfdmVyKTsKIAlmbGFzaGVkX3ZlciA9IE5FVFhFTl9ERUNPREVfVkVSU0lPTihmbGFzaGVkX3Zlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19tYWluLmMgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19tYWluLmMKaW5kZXggZTVkMTg3Zi4uZjQ5OTY4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX21haW4uYwpAQCAtOTQ2LDggKzk0Niw5IEBACiAJCU5FVFhFTl9ERUZBVUxUX0lOVFJfQ09BTEVTQ0VfVFhfUEFDS0VUUzsKIH0KIAorLyogd2l0aCBydG5sX2xvY2sgKi8KIHN0YXRpYyBpbnQKLW5ldHhlbl9uaWNfdXAoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQorX19uZXR4ZW5fbmljX3VwKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKIAlpbnQgZXJyOwogCkBAIC05ODgsMTQgKzk4OSwzMiBAQAogCXJldHVybiAwOwogfQogCisvKiBVc2FnZTogRHVyaW5nIHJlc3VtZSBhbmQgZmlybXdhcmUgcmVjb3ZlcnkgbW9kdWxlLiovCisKK3N0YXRpYyBpbmxpbmUgaW50CituZXR4ZW5fbmljX3VwKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlpbnQgZXJyID0gMDsKKworCXJ0bmxfbG9jaygpOworCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJCWVyciA9IF9fbmV0eGVuX25pY191cChhZGFwdGVyLCBuZXRkZXYpOworCXJ0bmxfdW5sb2NrKCk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKiB3aXRoIHJ0bmxfbG9jayAqLwogc3RhdGljIHZvaWQKLW5ldHhlbl9uaWNfZG93bihzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCitfX25ldHhlbl9uaWNfZG93bihzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJaWYgKGFkYXB0ZXItPmlzX3VwICE9IE5FVFhFTl9BREFQVEVSX1VQX01BR0lDKQogCQlyZXR1cm47CiAKLQljbGVhcl9iaXQoX19OWF9ERVZfVVAsICZhZGFwdGVyLT5zdGF0ZSk7CisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoX19OWF9ERVZfVVAsICZhZGFwdGVyLT5zdGF0ZSkpCisJCXJldHVybjsKIAorCXNtcF9tYigpOwogCXNwaW5fbG9jaygmYWRhcHRlci0+dHhfY2xlYW5fbG9jayk7CiAJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKIAluZXRpZl90eF9kaXNhYmxlKG5ldGRldik7CkBAIC0xMDE0LDYgKzEwMzMsMTcgQEAKIAlzcGluX3VubG9jaygmYWRhcHRlci0+dHhfY2xlYW5fbG9jayk7CiB9CiAKKy8qIFVzYWdlOiBEdXJpbmcgc3VzcGVuZCBhbmQgZmlybXdhcmUgcmVjb3ZlcnkgbW9kdWxlICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorbmV0eGVuX25pY19kb3duKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlydG5sX2xvY2soKTsKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQlfX25ldHhlbl9uaWNfZG93bihhZGFwdGVyLCBuZXRkZXYpOworCXJ0bmxfdW5sb2NrKCk7CisKK30KIAogc3RhdGljIGludAogbmV0eGVuX25pY19hdHRhY2goc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKQpAQCAtMTEyMiwxNCArMTE1MiwxNCBAQAogCQluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldGRldik7CiAKIAkJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKLQkJCW5ldHhlbl9uaWNfZG93bihhZGFwdGVyLCBuZXRkZXYpOworCQkJX19uZXR4ZW5fbmljX2Rvd24oYWRhcHRlciwgbmV0ZGV2KTsKIAogCQluZXR4ZW5fbmljX2RldGFjaChhZGFwdGVyKTsKIAogCQlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CiAJCQllcnIgPSBuZXR4ZW5fbmljX2F0dGFjaChhZGFwdGVyKTsKIAkJCWlmICghZXJyKQotCQkJCWVyciA9IG5ldHhlbl9uaWNfdXAoYWRhcHRlciwgbmV0ZGV2KTsKKwkJCQllcnIgPSBfX25ldHhlbl9uaWNfdXAoYWRhcHRlciwgbmV0ZGV2KTsKIAogCQkJaWYgKGVycikKIAkJCQlnb3RvIGRvbmU7CkBAIC0xNDk5LDcgKzE1MjksNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQllcnIgPSBuZXR4ZW5fbmljX3VwKGFkYXB0ZXIsIG5ldGRldik7CisJZXJyID0gX19uZXR4ZW5fbmljX3VwKGFkYXB0ZXIsIG5ldGRldik7CiAJaWYgKGVycikKIAkJZ290byBlcnJfb3V0OwogCkBAIC0xNTE5LDcgKzE1NDksNyBAQAogewogCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKLQluZXR4ZW5fbmljX2Rvd24oYWRhcHRlciwgbmV0ZGV2KTsKKwlfX25ldHhlbl9uaWNfZG93bihhZGFwdGVyLCBuZXRkZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0yMDI1LDcgKzIwNTUsNyBAQAogCiAJaWYgKCh3b3JrX2RvbmUgPCBidWRnZXQpICYmIHR4X2NvbXBsZXRlKSB7CiAJCW5hcGlfY29tcGxldGUoJnNkc19yaW5nLT5uYXBpKTsKLQkJaWYgKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkKKwkJaWYgKHRlc3RfYml0KF9fTlhfREVWX1VQLCAmYWRhcHRlci0+c3RhdGUpKQogCQkJbmV0eGVuX25pY19lbmFibGVfaW50KHNkc19yaW5nKTsKIAl9CiAKQEAgLTIyMTAsOCArMjI0MCw3IEBACiAKIAluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldGRldik7CiAKLQlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQotCQluZXR4ZW5fbmljX2Rvd24oYWRhcHRlciwgbmV0ZGV2KTsKKwluZXR4ZW5fbmljX2Rvd24oYWRhcHRlciwgbmV0ZGV2KTsKIAogCW5ldHhlbl9uaWNfZGV0YWNoKGFkYXB0ZXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvYXhuZXRfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9heG5ldF9jcy5jCmluZGV4IDgxYmFmZDUuLmQ0MzFiNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS9heG5ldF9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9heG5ldF9jcy5jCkBAIC0yNzAsNyArMjcwLDcgQEAKIAkgICAgLyogZm9yIG1hc3Rlci9zbGF2ZSBtdWx0aWZ1bmN0aW9uIGNhcmRzICovCiAJICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMyID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CiAJICAgIGxpbmstPmlycS5BdHRyaWJ1dGVzID0KLQkJSVJRX1RZUEVfRFlOQU1JQ19TSEFSSU5HfElSUV9GSVJTVF9TSEFSRUQ7CisJCUlSUV9UWVBFX0RZTkFNSUNfU0hBUklORzsKIAl9CiAgICAgfSBlbHNlIHsKIAkvKiBUaGlzIHNob3VsZCBiZSB0d28gMTYtcG9ydCB3aW5kb3dzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvZm12ajE4eF9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL2ZtdmoxOHhfY3MuYwppbmRleCA4YWQ4Mzg0Li44MTNhY2EzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEvZm12ajE4eF9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9mbXZqMTh4X2NzLmMKQEAgLTQyNiw3ICs0MjYsNyBAQAogCiAgICAgaWYgKGxpbmstPmlvLk51bVBvcnRzMiAhPSAwKSB7CiAgICAgCWxpbmstPmlycS5BdHRyaWJ1dGVzID0KLQkJSVJRX1RZUEVfRFlOQU1JQ19TSEFSSU5HfElSUV9GSVJTVF9TSEFSRUQ7CisJCUlSUV9UWVBFX0RZTkFNSUNfU0hBUklORzsKIAlyZXQgPSBtZmNfdHJ5X2lvX3BvcnQobGluayk7CiAJaWYgKHJldCAhPSAwKSBnb3RvIGZhaWxlZDsKICAgICB9IGVsc2UgaWYgKGNhcmR0eXBlID09IFVOR0VSTUFOTikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL3BjbmV0X2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvcGNuZXRfY3MuYwppbmRleCAyZDI2YjZjLi45MmVkM2ZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEvcGNuZXRfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEvcGNuZXRfY3MuYwpAQCAtNDkwLDcgKzQ5MCw3IEBACiAJICAgIC8qIGZvciBtYXN0ZXIvc2xhdmUgbXVsdGlmdW5jdGlvbiBjYXJkcyAqLwogCSAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IElPX0RBVEFfUEFUSF9XSURUSF84OwogCSAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9Ci0JCUlSUV9UWVBFX0RZTkFNSUNfU0hBUklOR3xJUlFfRklSU1RfU0hBUkVEOworCQlJUlFfVFlQRV9EWU5BTUlDX1NIQVJJTkc7CiAJfQogICAgIH0gZWxzZSB7CiAJLyogVGhpcyBzaG91bGQgYmUgdHdvIDE2LXBvcnQgd2luZG93cyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL3NtYzkxYzkyX2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvc21jOTFjOTJfY3MuYwppbmRleCBjYzQ4NTNiYy4uNmRkNDg2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL3NtYzkxYzkyX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL3NtYzkxYzkyX2NzLmMKQEAgLTQ1NCw3ICs0NTQsNyBAQAogICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9TUEtSOwogICAgIGxpbmstPmNvbmYuU3RhdHVzID0gQ0NTUl9BVURJT19FTkE7CiAgICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPQotCUlSUV9UWVBFX0RZTkFNSUNfU0hBUklOR3xJUlFfRklSU1RfU0hBUkVEOworCUlSUV9UWVBFX0RZTkFNSUNfU0hBUklORzsKICAgICBsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDE2OwogICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMyID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CiAgICAgbGluay0+aW8uTnVtUG9ydHMyID0gODsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS94aXJjMnBzX2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEveGlyYzJwc19jcy5jCmluZGV4IGEyZWRhMjguLjQ2NmZjNzI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEveGlyYzJwc19jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS94aXJjMnBzX2NzLmMKQEAgLTg0MSw3ICs4NDEsNyBAQAogCSAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfU1BLUjsKIAkgICAgbGluay0+Y29uZi5TdGF0dXMgfD0gQ0NTUl9BVURJT19FTkE7CiAJfQotCWxpbmstPmlycS5BdHRyaWJ1dGVzIHw9IElSUV9UWVBFX0RZTkFNSUNfU0hBUklOR3xJUlFfRklSU1RfU0hBUkVEIDsKKwlsaW5rLT5pcnEuQXR0cmlidXRlcyB8PSBJUlFfVFlQRV9EWU5BTUlDX1NIQVJJTkc7CiAJbGluay0+aW8uTnVtUG9ydHMyID0gODsKIAlsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IElPX0RBVEFfUEFUSF9XSURUSF84OwogCWlmIChsb2NhbC0+ZGluZ28pIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NreTIuYyBiL2RyaXZlcnMvbmV0L3NreTIuYwppbmRleCAwNDRlNjgxLi44OWEwNWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za3kyLmMKKysrIGIvZHJpdmVycy9uZXQvc2t5Mi5jCkBAIC0yMTUyLDcgKzIxNTIsOSBAQAogCiAJLyogcmVzZXQgUEhZIExpbmsgRGV0ZWN0ICovCiAJcGh5ID0gc2t5Ml9wY2lfcmVhZDE2KGh3LCBQU01fQ09ORklHX1JFRzQpOworCXNreTJfd3JpdGU4KGh3LCBCMl9UU1RfQ1RSTDEsIFRTVF9DRkdfV1JJVEVfT04pOwogCXNreTJfcGNpX3dyaXRlMTYoaHcsIFBTTV9DT05GSUdfUkVHNCwgcGh5IHwgMSk7CisJc2t5Ml93cml0ZTgoaHcsIEIyX1RTVF9DVFJMMSwgVFNUX0NGR19XUklURV9PRkYpOwogCiAJc2t5Ml9saW5rX3VwKHNreTIpOwogfQpAQCAtMjk2OCw4ICsyOTcwLDEzIEBACiAJCWJyZWFrOwogCiAJY2FzZSBDSElQX0lEX1lVS09OX1VMXzI6CisJCWh3LT5mbGFncyA9IFNLWTJfSFdfR0lHQUJJVAorCQkJfCBTS1kyX0hXX0FEVl9QT1dFUl9DVEw7CisJCWJyZWFrOworCiAJY2FzZSBDSElQX0lEX1lVS09OX09QVDoKIAkJaHctPmZsYWdzID0gU0tZMl9IV19HSUdBQklUCisJCQl8IFNLWTJfSFdfTkVXX0xFCiAJCQl8IFNLWTJfSFdfQURWX1BPV0VSX0NUTDsKIAkJYnJlYWs7CiAKQEAgLTMwNzcsNiArMzA4NCw3IEBACiAJCXJlZyA8PD0gUFNNX0NPTkZJR19SRUc0X1RJTUVSX1BIWV9MSU5LX0RFVEVDVF9CQVNFOwogCiAJCS8qIHJlc2V0IFBIWSBMaW5rIERldGVjdCAqLworCQlza3kyX3dyaXRlOChodywgQjJfVFNUX0NUUkwxLCBUU1RfQ0ZHX1dSSVRFX09OKTsKIAkJc2t5Ml9wY2lfd3JpdGUxNihodywgUFNNX0NPTkZJR19SRUc0LAogCQkJCSByZWcgfCBQU01fQ09ORklHX1JFRzRfUlNUX1BIWV9MSU5LX0RFVEVDVCk7CiAJCXNreTJfcGNpX3dyaXRlMTYoaHcsIFBTTV9DT05GSUdfUkVHNCwgcmVnKTsKQEAgLTMwOTQsNiArMzEwMiw3IEBACiAJCQkvKiByZXN0b3JlIHRoZSBQQ0llIExpbmsgQ29udHJvbCByZWdpc3RlciAqLwogCQkJc2t5Ml9wY2lfd3JpdGUxNihodywgY2FwICsgUENJX0VYUF9MTktDVEwsIHJlZyk7CiAJCX0KKwkJc2t5Ml93cml0ZTgoaHcsIEIyX1RTVF9DVFJMMSwgVFNUX0NGR19XUklURV9PRkYpOwogCiAJCS8qIHJlLWVuYWJsZSBQRVggUE0gaW4gUEVYIFBIWSBkZWJ1ZyByZWcuIDggKGNsZWFyIGJpdCAxMikgKi8KIAkJc2t5Ml93cml0ZTMyKGh3LCBZMl9QRVhfUEhZX0RBVEEsIFBFWF9EQl9BQ0NFU1MgfCAoMHgwOFVMIDw8IDE2KSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWM5MXguYyBiL2RyaXZlcnMvbmV0L3NtYzkxeC5jCmluZGV4IGFlNDk4M2EuLmVhNGZhZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NtYzkxeC5jCisrKyBiL2RyaXZlcnMvbmV0L3NtYzkxeC5jCkBAIC01MzQsOSArNTM0LDkgQEAKICNkZWZpbmUgc21jX3NwZWNpYWxfbG9jayhsb2NrLCBmbGFncykJCXNwaW5fbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKQogI2RlZmluZSBzbWNfc3BlY2lhbF91bmxvY2sobG9jaywgZmxhZ3MpIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssIGZsYWdzKQogI2Vsc2UKLSNkZWZpbmUgc21jX3NwZWNpYWxfdHJ5bG9jayhsb2NrLCBmbGFncykJKDEpCi0jZGVmaW5lIHNtY19zcGVjaWFsX2xvY2sobG9jaywgZmxhZ3MpICAgCWRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgc21jX3NwZWNpYWxfdW5sb2NrKGxvY2ssIGZsYWdzKQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHNtY19zcGVjaWFsX3RyeWxvY2sobG9jaywgZmxhZ3MpCShmbGFncyA9PSBmbGFncykKKyNkZWZpbmUgc21jX3NwZWNpYWxfbG9jayhsb2NrLCBmbGFncykgICAJZG8geyBmbGFncyA9IDA7IH0gd2hpbGUgKDApCisjZGVmaW5lIHNtY19zcGVjaWFsX3VubG9jayhsb2NrLCBmbGFncykJZG8geyBmbGFncyA9IDA7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAogLyoKQEAgLTIzODcsNyArMjM4Nyw3IEBACiAKIAlpZiAobmRldikgewogCQlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KG5kZXYpOwotCQlzbWNfZW5hYmxlX2RldmljZShkZXYpOworCQlzbWNfZW5hYmxlX2RldmljZShwZGV2KTsKIAkJaWYgKG5ldGlmX3J1bm5pbmcobmRldikpIHsKIAkJCXNtY19yZXNldChuZGV2KTsKIAkJCXNtY19lbmFibGUobmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWM5MXguaCBiL2RyaXZlcnMvbmV0L3NtYzkxeC5oCmluZGV4IDc4MTViZmMuLjU0Nzk5NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NtYzkxeC5oCisrKyBiL2RyaXZlcnMvbmV0L3NtYzkxeC5oCkBAIC0yMDYsMjEgKzIwNiw2IEBACiAJfQogfQogCi0jZWxpZglkZWZpbmVkKENPTkZJR19BUkNIX09NQVApCi0KLS8qIFdlIGNhbiBvbmx5IGRvIDE2LWJpdCByZWFkcyBhbmQgd3JpdGVzIGluIHRoZSBzdGF0aWMgbWVtb3J5IHNwYWNlLiAqLwotI2RlZmluZSBTTUNfQ0FOX1VTRV84QklUCTAKLSNkZWZpbmUgU01DX0NBTl9VU0VfMTZCSVQJMQotI2RlZmluZSBTTUNfQ0FOX1VTRV8zMkJJVAkwCi0jZGVmaW5lIFNNQ19JT19TSElGVAkJMAotI2RlZmluZSBTTUNfTk9XQUlUCQkxCi0KLSNkZWZpbmUgU01DX2ludyhhLCByKQkJcmVhZHcoKGEpICsgKHIpKQotI2RlZmluZSBTTUNfb3V0dyh2LCBhLCByKQl3cml0ZXcodiwgKGEpICsgKHIpKQotI2RlZmluZSBTTUNfaW5zdyhhLCByLCBwLCBsKQlyZWFkc3coKGEpICsgKHIpLCBwLCBsKQotI2RlZmluZSBTTUNfb3V0c3coYSwgciwgcCwgbCkJd3JpdGVzdygoYSkgKyAociksIHAsIGwpCi0jZGVmaW5lCVNNQ19JUlFfRkxBR1MJCSgtMSkJLyogZnJvbSByZXNvdXJjZSAqLwotCiAjZWxpZglkZWZpbmVkKENPTkZJR19TSF9TSDQyMDJfTUlDUk9ERVYpCiAKICNkZWZpbmUgU01DX0NBTl9VU0VfOEJJVAkwCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2Iva2F3ZXRoLmMgYi9kcml2ZXJzL25ldC91c2Iva2F3ZXRoLmMKaW5kZXggM2I4MGU4ZC4uZjFkNjRlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL2thd2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9rYXdldGguYwpAQCAtNzE2LDcgKzcxNiw3IEBACiAJcmV0dXJuIDA7CiAKIGVycl9vdXQ6Ci0JdXNiX2F1dG9wbV9lbmFibGUoa2F3ZXRoLT5pbnRmKTsKKwl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2Uoa2F3ZXRoLT5pbnRmKTsKIAlyZXR1cm4gLUVJTzsKIH0KIApAQCAtNzUzLDcgKzc1Myw3IEBACiAKIAlrYXdldGgtPnN0YXR1cyAmPSB+S0FXRVRIX1NUQVRVU19DTE9TSU5HOwogCi0JdXNiX2F1dG9wbV9lbmFibGUoa2F3ZXRoLT5pbnRmKTsKKwl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2Uoa2F3ZXRoLT5pbnRmKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdmV0aC5jIGIvZHJpdmVycy9uZXQvdmV0aC5jCmluZGV4IDYzMDk5YzUuLjNhMTVkZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3ZldGguYworKysgYi9kcml2ZXJzL25ldC92ZXRoLmMKQEAgLTE1MywxNSArMTUzLDE0IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKnJjdiA9IE5VTEw7CiAJc3RydWN0IHZldGhfcHJpdiAqcHJpdiwgKnJjdl9wcml2OwogCXN0cnVjdCB2ZXRoX25ldF9zdGF0cyAqc3RhdHMsICpyY3Zfc3RhdHM7Ci0JaW50IGxlbmd0aCwgY3B1OworCWludCBsZW5ndGg7CiAKIAlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlyY3YgPSBwcml2LT5wZWVyOwogCXJjdl9wcml2ID0gbmV0ZGV2X3ByaXYocmN2KTsKIAotCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlzdGF0cyA9IHBlcl9jcHVfcHRyKHByaXYtPnN0YXRzLCBjcHUpOwotCXJjdl9zdGF0cyA9IHBlcl9jcHVfcHRyKHJjdl9wcml2LT5zdGF0cywgY3B1KTsKKwlzdGF0cyA9IHRoaXNfY3B1X3B0cihwcml2LT5zdGF0cyk7CisJcmN2X3N0YXRzID0gdGhpc19jcHVfcHRyKHJjdl9wcml2LT5zdGF0cyk7CiAKIAlpZiAoIShyY3YtPmZsYWdzICYgSUZGX1VQKSkKIAkJZ290byB0eF9kcm9wOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi5jIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi5jCmluZGV4IDQ3ZTg0ZWYuLjNiNDg2ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2IuYworKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLmMKQEAgLTU3OSw3ICs1NzksNyBAQAogICoKICAqICAgIEFzIHdlbGwsIHRoZSBkZXZpY2UgbWlnaHQgcmVmdXNlIGdvaW5nIHRvIHNsZWVwIGZvciB3aGljaGV2ZXIKICAqICAgIHJlYXNvbi4gSW4gdGhpcyBjYXNlIHdlIGp1c3QgZmFpbC4gRm9yIHN5c3RlbSBzdXNwZW5kL2hpYmVybmF0ZSwKLSAqICAgIHdlICpjYW4ndCogZmFpbC4gV2UgbG9vayBhdCB1c2JfZGV2LT5hdXRvX3BtIHRvIHNlZSBpZiB0aGUKKyAqICAgIHdlICpjYW4ndCogZmFpbC4gV2UgY2hlY2sgUE1fRVZFTlRfQVVUTyB0byBzZWUgaWYgdGhlCiAgKiAgICBzdXNwZW5kIGNhbGwgY29tZXMgZnJvbSB0aGUgVVNCIHN0YWNrIG9yIGZyb20gdGhlIHN5c3RlbSBhbmQgYWN0CiAgKiAgICBpbiBjb25zZXF1ZW5jZS4KICAqCkBAIC01OTEsMTQgKzU5MSwxMSBAQAogCWludCByZXN1bHQgPSAwOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpZmFjZS0+ZGV2OwogCXN0cnVjdCBpMjQwMG11ICppMjQwMG11ID0gdXNiX2dldF9pbnRmZGF0YShpZmFjZSk7Ci0jaWZkZWYgQ09ORklHX1BNCi0Jc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSBpMjQwMG11LT51c2JfZGV2OwotI2VuZGlmCiAJdW5zaWduZWQgaXNfYXV0b3N1c3BlbmQgPSAwOwogCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9ICZpMjQwMG11LT5pMjQwMG07CiAKICNpZmRlZiBDT05GSUdfUE0KLQlpZiAodXNiX2Rldi0+YXV0b19wbSA+IDApCisJaWYgKHBtX21zZy5ldmVudCAmIFBNX0VWRU5UX0FVVE8pCiAJCWlzX2F1dG9zdXNwZW5kID0gMTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZWVwcm9tLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZWVwcm9tLmMKaW5kZXggODFlYTUyYy4uNWQxYzg2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2VlcHJvbS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9lZXByb20uYwpAQCAtOTcsNiArOTcsNyBAQAogCXN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWUgPSAmYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tOwogCWludCByZXQ7CiAJdTE2IHZhbDsKKwl1MzIgY2tzdW0sIG9mZnNldDsKIAogCS8qCiAJICogUmVhZCB2YWx1ZXMgZnJvbSBFRVBST00gYW5kIHN0b3JlIHRoZW0gaW4gdGhlIGNhcGFiaWxpdHkgc3RydWN0dXJlCkBAIC0xMTEsNyArMTEyLDYgQEAKIAlpZiAoYWgtPmFoX2VlX3ZlcnNpb24gPCBBUjVLX0VFUFJPTV9WRVJTSU9OXzNfMCkKIAkJcmV0dXJuIDA7CiAKLSNpZmRlZiBub3R5ZXQKIAkvKgogCSAqIFZhbGlkYXRlIHRoZSBjaGVja3N1bSBvZiB0aGUgRUVQUk9NIGRhdGUuIFRoZXJlIGFyZSBzb21lCiAJICogZGV2aWNlcyB3aXRoIGludmFsaWQgRUVQUk9Ncy4KQEAgLTEyNCw3ICsxMjQsNiBAQAogCQlBVEg1S19FUlIoYWgtPmFoX3NjLCAiSW52YWxpZCBFRVBST00gY2hlY2tzdW0gMHglMDR4XG4iLCBja3N1bSk7CiAJCXJldHVybiAtRUlPOwogCX0KLSNlbmRpZgogCiAJQVI1S19FRVBST01fUkVBRF9IRFIoQVI1S19FRVBST01fQU5UX0dBSU4oYWgtPmFoX2VlX3ZlcnNpb24pLAogCSAgICBlZV9hbnRfZ2Fpbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvbGVkLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvbGVkLmMKaW5kZXggZDQ5NTg5MC4uNjBmNTQ3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2xlZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9sZWQuYwpAQCAtNzksNiArNzksOCBAQAogCXsgQVRIX1NERVZJQ0UoUENJX1ZFTkRPUl9JRF9IUCwgMHgwMTM3YiksIEFUSF9MRUQoMywgMSkgfSwKIAkvKiBJQk0tc3BlY2lmaWMgQVI1MjEyIChhbGwgb3RoZXJzKSAqLwogCXsgUENJX1ZERVZJQ0UoQVRIRVJPUywgUENJX0RFVklDRV9JRF9BVEhFUk9TX0FSNTIxMl9JQk0pLCBBVEhfTEVEKDAsIDApIH0sCisJLyogRGVsbCBWb3N0cm8gQTg2MCAoc2hhaGFyQHNoYWhhci1vci5jby5pbCkgKi8KKwl7IEFUSF9TREVWSUNFKFBDSV9WRU5ET1JfSURfUU1JLCAweDAxMTIpLCBBVEhfTEVEKDMsIDApIH0sCiAJeyB9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsveG1pdC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3htaXQuYwppbmRleCA1NjRjNmNiLi4yYTExY2M1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsveG1pdC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay94bWl0LmMKQEAgLTIwNzgsNyArMjA3OCw3IEBACiAJCQkJJnR4cS0+YXhxX3EsIGxhc3RiZi0+bGlzdC5wcmV2KTsKIAogCQl0eHEtPmF4cV9kZXB0aC0tOwotCQl0eG9rID0gKGRzLT5kc190eHN0YXQudHNfc3RhdHVzID09IDApOworCQl0eG9rID0gIShkcy0+ZHNfdHhzdGF0LnRzX3N0YXR1cyAmIEFUSDlLX1RYRVJSX0ZJTFQpOwogCQl0eHEtPmF4cV90eF9pbnByb2dyZXNzID0gZmFsc2U7CiAJCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9tYWluLmMKaW5kZXggNzFlNWM5OS4uNGM0MWNmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbWFpbi5jCkBAIC0xNzg0LDcgKzE3ODQsMTAgQEAKIAkJCSAgICAgICBkbWFfcmVhc29uWzBdLCBkbWFfcmVhc29uWzFdLAogCQkJICAgICAgIGRtYV9yZWFzb25bMl0sIGRtYV9yZWFzb25bM10sCiAJCQkgICAgICAgZG1hX3JlYXNvbls0XSwgZG1hX3JlYXNvbls1XSk7Ci0JCQliNDNfY29udHJvbGxlcl9yZXN0YXJ0KGRldiwgIkRNQSBlcnJvciIpOworCQkJYjQzZXJyKGRldi0+d2wsICJUaGlzIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IERNQSAiCisJCQkgICAgICAgIm9uIHlvdXIgc3lzdGVtLiBQbGVhc2UgdXNlIFBJTyBpbnN0ZWFkLlxuIik7CisJCQliNDNlcnIoZGV2LT53bCwgIkNPTkZJR19CNDNfRk9SQ0VfUElPIG11c3QgYmUgc2V0IGluICIKKwkJCSAgICAgICAieW91ciBrZXJuZWwgY29uZmlndXJhdGlvbi5cbiIpOwogCQkJcmV0dXJuOwogCQl9CiAJCWlmIChtZXJnZWRfZG1hX3JlYXNvbiAmIEI0M19ETUFJUlFfTk9ORkFUQUxNQVNLKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHguYwppbmRleCA1OGIxMzJmLi4wMGRhNWUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10eC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXR4LmMKQEAgLTEzNTMsNyArMTM1Myw3IEBACiAJaWYgKHByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uYWdnLnN0YXRlID09CiAJCQkJSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0FEREJBKSB7CiAJCUlXTF9ERUJVR19IVChwcml2LCAiQUdHIHN0b3AgYmVmb3JlIHNldHVwIGRvbmVcbiIpOwotCQlpZWVlODAyMTFfc3RvcF90eF9iYV9jYl9pcnFzYWZlKHByaXYtPmh3LCByYSwgdGlkKTsKKwkJaWVlZTgwMjExX3N0b3BfdHhfYmFfY2JfaXJxc2FmZShwcml2LT52aWYsIHJhLCB0aWQpOwogCQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLmFnZy5zdGF0ZSA9IElXTF9BR0dfT0ZGOwogCQlyZXR1cm4gMDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2w4ay5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdsOGsuYwppbmRleCAwY2I1ZWNjLi41OWQ0OTE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2w4ay5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213bDhrLmMKQEAgLTg0LDcgKzg0LDggQEAKIAlpbnQgcnhkX3NpemU7CiAJdm9pZCAoKnJ4ZF9pbml0KSh2b2lkICpyeGQsIGRtYV9hZGRyX3QgbmV4dF9kbWFfYWRkcik7CiAJdm9pZCAoKnJ4ZF9yZWZpbGwpKHZvaWQgKnJ4ZCwgZG1hX2FkZHJfdCBhZGRyLCBpbnQgbGVuKTsKLQlpbnQgKCpyeGRfcHJvY2Vzcykodm9pZCAqcnhkLCBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHVzKTsKKwlpbnQgKCpyeGRfcHJvY2Vzcykodm9pZCAqcnhkLCBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHVzLAorCQkJICAgX19sZTE2ICpxb3MpOwogfTsKIAogc3RydWN0IG13bDhrX2RldmljZV9pbmZvIHsKQEAgLTE4NCw3ICsxODUsNyBAQAogCS8qIFBIWSBwYXJhbWV0ZXJzICovCiAJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCBiYW5kOwogCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCBjaGFubmVsc1sxNF07Ci0Jc3RydWN0IGllZWU4MDIxMV9yYXRlIHJhdGVzWzEzXTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgcmF0ZXNbMTRdOwogCiAJYm9vbCByYWRpb19vbjsKIAlib29sIHJhZGlvX3Nob3J0X3ByZWFtYmxlOwpAQCAtMjIwLDE1ICsyMjEsNiBAQAogCXU4CWJzc2lkW0VUSF9BTEVOXTsKIAl1OAltYWNfYWRkcltFVEhfQUxFTl07CiAKLQkvKgotCSAqIFN1YnNldCBvZiBzdXBwb3J0ZWQgbGVnYWN5IHJhdGVzLgotCSAqIEludGVyc2VjdGlvbiBvZiBBUCBhbmQgU1RBIHN1cHBvcnRlZCByYXRlcy4KLQkgKi8KLQlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgbGVnYWN5X3JhdGVzWzEzXTsKLQotCS8qIG51bWJlciBvZiBzdXBwb3J0ZWQgbGVnYWN5IHJhdGVzICovCi0JdTgJbGVnYWN5X25yYXRlczsKLQogCSAvKiBJbmRleCBpbnRvIHN0YXRpb24gZGF0YWJhc2UuUmV0dXJuZWQgYnkgdXBkYXRlX3N0YV9kYiBjYWxsICovCiAJdTgJcGVlcl9pZDsKIApAQCAtMjY2LDYgKzI1OCwxMSBAQAogCXsgLmJpdHJhdGUgPSAzNjAsIC5od192YWx1ZSA9IDcyLCB9LAogCXsgLmJpdHJhdGUgPSA0ODAsIC5od192YWx1ZSA9IDk2LCB9LAogCXsgLmJpdHJhdGUgPSA1NDAsIC5od192YWx1ZSA9IDEwOCwgfSwKKwl7IC5iaXRyYXRlID0gNzIwLCAuaHdfdmFsdWUgPSAxNDQsIH0sCit9OworCitzdGF0aWMgY29uc3QgdTggbXdsOGtfcmF0ZWlkc1sxMl0gPSB7CisJMiwgNCwgMTEsIDIyLCAxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4LAogfTsKIAogLyogU2V0IG9yIGdldCBpbmZvIGZyb20gRmlybXdhcmUgKi8KQEAgLTU3NCw3ICs1NzEsNyBAQAogCQkJICAgICAgICJoZWxwZXIgaW1hZ2VcbiIsIHBjaV9uYW1lKHByaXYtPnBkZXYpKTsKIAkJCXJldHVybiByYzsKIAkJfQotCQltc2xlZXAoMSk7CisJCW1zbGVlcCg1KTsKIAogCQlyYyA9IG13bDhrX2ZlZWRfZndfaW1hZ2UocHJpdiwgZnctPmRhdGEsIGZ3LT5zaXplKTsKIAl9IGVsc2UgewpAQCAtNTkxLDkgKzU4OCw4IEBACiAJCWlvd3JpdGUzMihNV0w4S19NT0RFX0FQLCBwcml2LT5yZWdzICsgTVdMOEtfSElVX0dFTl9QVFIpOwogCWVsc2UKIAkJaW93cml0ZTMyKE1XTDhLX01PREVfU1RBLCBwcml2LT5yZWdzICsgTVdMOEtfSElVX0dFTl9QVFIpOwotCW1zbGVlcCgxKTsKIAotCWxvb3BzID0gMjAwMDAwOworCWxvb3BzID0gNTAwMDAwOwogCWRvIHsKIAkJdTMyIHJlYWR5X2NvZGU7CiAKQEAgLTYzMyw5ICs2MjksNiBAQAogLyogUGVlciBFbnRyeSBmbGFncyAtIHVzZWQgdG8gZGVmaW5lIHRoZSB0eXBlIG9mIHRoZSBwZWVyIG5vZGUgKi8KICNkZWZpbmUgTVdMOEtfUEVFUl9UWVBFX0FDQ0VTU1BPSU5UCTIKIAotI2RlZmluZSBNV0w4S19JRUVFX0xFR0FDWV9EQVRBX1JBVEVTCTEzCi0jZGVmaW5lIE1XTDhLX01DU19CSVRNQVBfU0laRQkJMTYKLQogc3RydWN0IHBlZXJfY2FwYWJpbGl0eV9pbmZvIHsKIAkvKiBQZWVyIHR5cGUgLSBBUCB2cy4gU1RBLiAgKi8KIAlfX3U4CXBlZXJfdHlwZTsKQEAgLTY1MiwxMCArNjQ1LDEwIEBACiAJc3RydWN0IGV3Y19odF9pbmZvCWV3Y19pbmZvOwogCiAJLyogTGVnYWN5IHJhdGUgdGFibGUuIEludGVyc2VjdGlvbiBvZiBvdXIgcmF0ZXMgYW5kIHBlZXIgcmF0ZXMuICAqLwotCV9fdTgJbGVnYWN5X3JhdGVzW01XTDhLX0lFRUVfTEVHQUNZX0RBVEFfUkFURVNdOworCV9fdTgJbGVnYWN5X3JhdGVzWzEyXTsKIAogCS8qIEhUIHJhdGUgdGFibGUuIEludGVyc2VjdGlvbiBvZiBvdXIgcmF0ZXMgYW5kIHBlZXIgcmF0ZXMuICAqLwotCV9fdTgJaHRfcmF0ZXNbTVdMOEtfTUNTX0JJVE1BUF9TSVpFXTsKKwlfX3U4CWh0X3JhdGVzWzE2XTsKIAlfX3U4CXBhZFsxNl07CiAKIAkvKiBJZiBzZXQsIGludGVyb3BlcmFiaWxpdHkgbW9kZSwgbm8gcHJvcHJpZXRhcnkgZXh0ZW5zaW9ucy4gICovCkBAIC03MDYsNTUgKzY5OSw2NCBAQAogc3RydWN0IG13bDhrX2RtYV9kYXRhIHsKIAlfX2xlMTYgZndsZW47CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgd2g7CisJY2hhciBkYXRhWzBdOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyogUm91dGluZXMgdG8gYWRkL3JlbW92ZSBETUEgaGVhZGVyIGZyb20gc2tiLiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBtd2w4a19yZW1vdmVfZG1hX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGlubGluZSB2b2lkIG13bDhrX3JlbW92ZV9kbWFfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIF9fbGUxNiBxb3MpCiB7Ci0Jc3RydWN0IG13bDhrX2RtYV9kYXRhICp0ciA9IChzdHJ1Y3QgbXdsOGtfZG1hX2RhdGEgKilza2ItPmRhdGE7Ci0Jdm9pZCAqZHN0LCAqc3JjID0gJnRyLT53aDsKLQlpbnQgaGRybGVuID0gaWVlZTgwMjExX2hkcmxlbih0ci0+d2guZnJhbWVfY29udHJvbCk7Ci0JdTE2IHNwYWNlID0gc2l6ZW9mKHN0cnVjdCBtd2w4a19kbWFfZGF0YSkgLSBoZHJsZW47CisJc3RydWN0IG13bDhrX2RtYV9kYXRhICp0cjsKKwlpbnQgaGRybGVuOwogCi0JZHN0ID0gKHZvaWQgKil0ciArIHNwYWNlOwotCWlmIChkc3QgIT0gc3JjKSB7Ci0JCW1lbW1vdmUoZHN0LCBzcmMsIGhkcmxlbik7Ci0JCXNrYl9wdWxsKHNrYiwgc3BhY2UpOworCXRyID0gKHN0cnVjdCBtd2w4a19kbWFfZGF0YSAqKXNrYi0+ZGF0YTsKKwloZHJsZW4gPSBpZWVlODAyMTFfaGRybGVuKHRyLT53aC5mcmFtZV9jb250cm9sKTsKKworCWlmIChoZHJsZW4gIT0gc2l6ZW9mKHRyLT53aCkpIHsKKwkJaWYgKGllZWU4MDIxMV9pc19kYXRhX3Fvcyh0ci0+d2guZnJhbWVfY29udHJvbCkpIHsKKwkJCW1lbW1vdmUodHItPmRhdGEgLSBoZHJsZW4sICZ0ci0+d2gsIGhkcmxlbiAtIDIpOworCQkJKigoX19sZTE2ICopKHRyLT5kYXRhIC0gMikpID0gcW9zOworCQl9IGVsc2UgeworCQkJbWVtbW92ZSh0ci0+ZGF0YSAtIGhkcmxlbiwgJnRyLT53aCwgaGRybGVuKTsKKwkJfQogCX0KKworCWlmIChoZHJsZW4gIT0gc2l6ZW9mKCp0cikpCisJCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKCp0cikgLSBoZHJsZW4pOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbXdsOGtfYWRkX2RtYV9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqd2g7Ci0JdTMyIGhkcmxlbiwgcGt0bGVuOworCWludCBoZHJsZW47CiAJc3RydWN0IG13bDhrX2RtYV9kYXRhICp0cjsKIAotCXdoID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOwotCWhkcmxlbiA9IGllZWU4MDIxMV9oZHJsZW4od2gtPmZyYW1lX2NvbnRyb2wpOwotCXBrdGxlbiA9IHNrYi0+bGVuOwotCiAJLyoKLQkgKiBDb3B5IHVwL2Rvd24gdGhlIDgwMi4xMSBoZWFkZXI7IHRoZSBmaXJtd2FyZSByZXF1aXJlcwotCSAqIHdlIHByZXNlbnQgYSAyLWJ5dGUgcGF5bG9hZCBsZW5ndGggZm9sbG93ZWQgYnkgYQotCSAqIDQtYWRkcmVzcyBoZWFkZXIgKHcvbyBRb1MpLCBmb2xsb3dlZCAob3B0aW9uYWxseSkgYnkKLQkgKiBhbnkgV0VQL0V4dElWIGhlYWRlciAoYnV0IG9ubHkgZmlsbGVkIGluIGZvciBDQ01QKS4KKwkgKiBBZGQgYSBmaXJtd2FyZSBETUEgaGVhZGVyOyB0aGUgZmlybXdhcmUgcmVxdWlyZXMgdGhhdCB3ZQorCSAqIHByZXNlbnQgYSAyLWJ5dGUgcGF5bG9hZCBsZW5ndGggZm9sbG93ZWQgYnkgYSA0LWFkZHJlc3MKKwkgKiBoZWFkZXIgKHdpdGhvdXQgUW9TIGZpZWxkKSwgZm9sbG93ZWQgKG9wdGlvbmFsbHkpIGJ5IGFueQorCSAqIFdFUC9FeHRJViBoZWFkZXIgKGJ1dCBvbmx5IGZpbGxlZCBpbiBmb3IgQ0NNUCkuCiAJICovCi0JaWYgKGhkcmxlbiAhPSBzaXplb2Yoc3RydWN0IG13bDhrX2RtYV9kYXRhKSkKLQkJc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IG13bDhrX2RtYV9kYXRhKSAtIGhkcmxlbik7CisJd2ggPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CisKKwloZHJsZW4gPSBpZWVlODAyMTFfaGRybGVuKHdoLT5mcmFtZV9jb250cm9sKTsKKwlpZiAoaGRybGVuICE9IHNpemVvZigqdHIpKQorCQlza2JfcHVzaChza2IsIHNpemVvZigqdHIpIC0gaGRybGVuKTsKKworCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3Mod2gtPmZyYW1lX2NvbnRyb2wpKQorCQloZHJsZW4gLT0gMjsKIAogCXRyID0gKHN0cnVjdCBtd2w4a19kbWFfZGF0YSAqKXNrYi0+ZGF0YTsKIAlpZiAod2ggIT0gJnRyLT53aCkKIAkJbWVtbW92ZSgmdHItPndoLCB3aCwgaGRybGVuKTsKLQotCS8qIENsZWFyIGFkZHI0ICovCi0JbWVtc2V0KHRyLT53aC5hZGRyNCwgMCwgRVRIX0FMRU4pOworCWlmIChoZHJsZW4gIT0gc2l6ZW9mKHRyLT53aCkpCisJCW1lbXNldCgoKHZvaWQgKikmdHItPndoKSArIGhkcmxlbiwgMCwgc2l6ZW9mKHRyLT53aCkgLSBoZHJsZW4pOwogCiAJLyoKIAkgKiBGaXJtd2FyZSBsZW5ndGggaXMgdGhlIGxlbmd0aCBvZiB0aGUgZnVsbHkgZm9ybWVkICI4MDIuMTEKIAkgKiBwYXlsb2FkIi4gIFRoYXQgaXMsIGV2ZXJ5dGhpbmcgZXhjZXB0IGZvciB0aGUgODAyLjExIGhlYWRlci4KIAkgKiBUaGlzIGluY2x1ZGVzIGFsbCBjcnlwdG8gbWF0ZXJpYWwgaW5jbHVkaW5nIHRoZSBNSUMuCiAJICovCi0JdHItPmZ3bGVuID0gY3B1X3RvX2xlMTYocGt0bGVuIC0gaGRybGVuKTsKKwl0ci0+ZndsZW4gPSBjcHVfdG9fbGUxNihza2ItPmxlbiAtIHNpemVvZigqdHIpKTsKIH0KIAogCkBAIC03NzksNiArNzgxLDEwIEBACiAJX191OCByeF9jdHJsOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAorI2RlZmluZSBNV0w4S184MzY2X1JBVEVfSU5GT19NQ1NfRk9STUFUCQkweDgwCisjZGVmaW5lIE1XTDhLXzgzNjZfUkFURV9JTkZPXzQwTUhaCQkweDQwCisjZGVmaW5lIE1XTDhLXzgzNjZfUkFURV9JTkZPX1JBVEVJRCh4KQkJKCh4KSAmIDB4M2YpCisKICNkZWZpbmUgTVdMOEtfODM2Nl9SWF9DVFJMX09XTkVEX0JZX0hPU1QJMHg4MAogCiBzdGF0aWMgdm9pZCBtd2w4a19yeGRfODM2Nl9pbml0KHZvaWQgKl9yeGQsIGRtYV9hZGRyX3QgbmV4dF9kbWFfYWRkcikKQEAgLTgwMCw3ICs4MDYsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1td2w4a19yeGRfODM2Nl9wcm9jZXNzKHZvaWQgKl9yeGQsIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpzdGF0dXMpCittd2w4a19yeGRfODM2Nl9wcm9jZXNzKHZvaWQgKl9yeGQsIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpzdGF0dXMsCisJCSAgICAgICBfX2xlMTYgKnFvcykKIHsKIAlzdHJ1Y3QgbXdsOGtfcnhkXzgzNjYgKnJ4ZCA9IF9yeGQ7CiAKQEAgLTgxMyw5ICs4MjAsMTEgQEAKIAlzdGF0dXMtPnNpZ25hbCA9IC1yeGQtPnJzc2k7CiAJc3RhdHVzLT5ub2lzZSA9IC1yeGQtPm5vaXNlX2Zsb29yOwogCi0JaWYgKHJ4ZC0+cmF0ZSAmIDB4ODApIHsKKwlpZiAocnhkLT5yYXRlICYgTVdMOEtfODM2Nl9SQVRFX0lORk9fTUNTX0ZPUk1BVCkgewogCQlzdGF0dXMtPmZsYWcgfD0gUlhfRkxBR19IVDsKLQkJc3RhdHVzLT5yYXRlX2lkeCA9IHJ4ZC0+cmF0ZSAmIDB4N2Y7CisJCWlmIChyeGQtPnJhdGUgJiBNV0w4S184MzY2X1JBVEVfSU5GT180ME1IWikKKwkJCXN0YXR1cy0+ZmxhZyB8PSBSWF9GTEFHXzQwTUhaOworCQlzdGF0dXMtPnJhdGVfaWR4ID0gTVdMOEtfODM2Nl9SQVRFX0lORk9fUkFURUlEKHJ4ZC0+cmF0ZSk7CiAJfSBlbHNlIHsKIAkJaW50IGk7CiAKQEAgLTgzMCw2ICs4MzksOCBAQAogCXN0YXR1cy0+YmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFo7CiAJc3RhdHVzLT5mcmVxID0gaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KHJ4ZC0+Y2hhbm5lbCk7CiAKKwkqcW9zID0gcnhkLT5xb3NfY29udHJvbDsKKwogCXJldHVybiBsZTE2X3RvX2NwdShyeGQtPnBrdF9sZW4pOwogfQogCkBAIC04ODgsNyArODk5LDggQEAKIH0KIAogc3RhdGljIGludAotbXdsOGtfcnhkXzg2ODdfcHJvY2Vzcyh2b2lkICpfcnhkLCBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHVzKQorbXdsOGtfcnhkXzg2ODdfcHJvY2Vzcyh2b2lkICpfcnhkLCBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHVzLAorCQkgICAgICAgX19sZTE2ICpxb3MpCiB7CiAJc3RydWN0IG13bDhrX3J4ZF84Njg3ICpyeGQgPSBfcnhkOwogCXUxNiByYXRlX2luZm87CkBAIC05MDMsNyArOTE1LDYgQEAKIAogCXN0YXR1cy0+c2lnbmFsID0gLXJ4ZC0+cnNzaTsKIAlzdGF0dXMtPm5vaXNlID0gLXJ4ZC0+bm9pc2VfbGV2ZWw7Ci0Jc3RhdHVzLT5xdWFsID0gcnhkLT5saW5rX3F1YWxpdHk7CiAJc3RhdHVzLT5hbnRlbm5hID0gTVdMOEtfODY4N19SQVRFX0lORk9fQU5UU0VMRUNUKHJhdGVfaW5mbyk7CiAJc3RhdHVzLT5yYXRlX2lkeCA9IE1XTDhLXzg2ODdfUkFURV9JTkZPX1JBVEVJRChyYXRlX2luZm8pOwogCkBAIC05MTksNiArOTMwLDggQEAKIAlzdGF0dXMtPmJhbmQgPSBJRUVFODAyMTFfQkFORF8yR0haOwogCXN0YXR1cy0+ZnJlcSA9IGllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeShyeGQtPmNoYW5uZWwpOwogCisJKnFvcyA9IHJ4ZC0+cW9zX2NvbnRyb2w7CisKIAlyZXR1cm4gbGUxNl90b19jcHUocnhkLT5wa3RfbGVuKTsKIH0KIApAQCAtMTA5MCw2ICsxMTAzLDcgQEAKIAkJdm9pZCAqcnhkOwogCQlpbnQgcGt0X2xlbjsKIAkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgc3RhdHVzOworCQlfX2xlMTYgcW9zOwogCiAJCXNrYiA9IHJ4cS0+YnVmW3J4cS0+aGVhZF0uc2tiOwogCQlpZiAoc2tiID09IE5VTEwpCkBAIC0xMDk3LDcgKzExMTEsNyBAQAogCiAJCXJ4ZCA9IHJ4cS0+cnhkICsgKHJ4cS0+aGVhZCAqIHByaXYtPnJ4ZF9vcHMtPnJ4ZF9zaXplKTsKIAotCQlwa3RfbGVuID0gcHJpdi0+cnhkX29wcy0+cnhkX3Byb2Nlc3MocnhkLCAmc3RhdHVzKTsKKwkJcGt0X2xlbiA9IHByaXYtPnJ4ZF9vcHMtPnJ4ZF9wcm9jZXNzKHJ4ZCwgJnN0YXR1cywgJnFvcyk7CiAJCWlmIChwa3RfbGVuIDwgMCkKIAkJCWJyZWFrOwogCkBAIC0xMTE1LDcgKzExMjksNyBAQAogCQlyeHEtPnJ4ZF9jb3VudC0tOwogCiAJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKLQkJbXdsOGtfcmVtb3ZlX2RtYV9oZWFkZXIoc2tiKTsKKwkJbXdsOGtfcmVtb3ZlX2RtYV9oZWFkZXIoc2tiLCBxb3MpOwogCiAJCS8qCiAJCSAqIENoZWNrIGZvciBhIHBlbmRpbmcgam9pbiBvcGVyYXRpb24uICBTYXZlIGEKQEAgLTEyMjEsOTkgKzEyMzUsMTA2IEBACiAJaW9yZWFkMzIocHJpdi0+cmVncyArIE1XTDhLX0hJVV9JTlRfQ09ERSk7CiB9CiAKLXN0cnVjdCBtd2w4a190eHFfaW5mbyB7Ci0JdTMyIGZ3X293bmVkOwotCXUzMiBkcnZfb3duZWQ7Ci0JdTMyIHVudXNlZDsKLQl1MzIgbGVuOwotCXUzMiBoZWFkOwotCXUzMiB0YWlsOwotfTsKLQotc3RhdGljIGludCBtd2w4a19zY2FuX3R4X3Jpbmcoc3RydWN0IG13bDhrX3ByaXYgKnByaXYsCi0JCQkJc3RydWN0IG13bDhrX3R4cV9pbmZvICp0eGluZm8pCitzdGF0aWMgdm9pZCBtd2w4a19kdW1wX3R4X3JpbmdzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewotCWludCBjb3VudCwgZGVzYywgc3RhdHVzOwotCXN0cnVjdCBtd2w4a190eF9xdWV1ZSAqdHhxOwotCXN0cnVjdCBtd2w4a190eF9kZXNjICp0eF9kZXNjOwotCWludCBuZGVzY3MgPSAwOworCXN0cnVjdCBtd2w4a19wcml2ICpwcml2ID0gaHctPnByaXY7CisJaW50IGk7CiAKLQltZW1zZXQodHhpbmZvLCAwLCBNV0w4S19UWF9RVUVVRVMgKiBzaXplb2Yoc3RydWN0IG13bDhrX3R4cV9pbmZvKSk7CisJZm9yIChpID0gMDsgaSA8IE1XTDhLX1RYX1FVRVVFUzsgaSsrKSB7CisJCXN0cnVjdCBtd2w4a190eF9xdWV1ZSAqdHhxID0gcHJpdi0+dHhxICsgaTsKKwkJaW50IGZ3X293bmVkID0gMDsKKwkJaW50IGRydl9vd25lZCA9IDA7CisJCWludCB1bnVzZWQgPSAwOworCQlpbnQgZGVzYzsKIAotCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE1XTDhLX1RYX1FVRVVFUzsgY291bnQrKykgewotCQl0eHEgPSBwcml2LT50eHEgKyBjb3VudDsKLQkJdHhpbmZvW2NvdW50XS5sZW4gPSB0eHEtPnN0YXRzLmxlbjsKLQkJdHhpbmZvW2NvdW50XS5oZWFkID0gdHhxLT5oZWFkOwotCQl0eGluZm9bY291bnRdLnRhaWwgPSB0eHEtPnRhaWw7CiAJCWZvciAoZGVzYyA9IDA7IGRlc2MgPCBNV0w4S19UWF9ERVNDUzsgZGVzYysrKSB7Ci0JCQl0eF9kZXNjID0gdHhxLT50eGQgKyBkZXNjOwotCQkJc3RhdHVzID0gbGUzMl90b19jcHUodHhfZGVzYy0+c3RhdHVzKTsKKwkJCXN0cnVjdCBtd2w4a190eF9kZXNjICp0eF9kZXNjID0gdHhxLT50eGQgKyBkZXNjOworCQkJdTMyIHN0YXR1czsKIAorCQkJc3RhdHVzID0gbGUzMl90b19jcHUodHhfZGVzYy0+c3RhdHVzKTsKIAkJCWlmIChzdGF0dXMgJiBNV0w4S19UWERfU1RBVFVTX0ZXX09XTkVEKQotCQkJCXR4aW5mb1tjb3VudF0uZndfb3duZWQrKzsKKwkJCQlmd19vd25lZCsrOwogCQkJZWxzZQotCQkJCXR4aW5mb1tjb3VudF0uZHJ2X293bmVkKys7CisJCQkJZHJ2X293bmVkKys7CiAKIAkJCWlmICh0eF9kZXNjLT5wa3RfbGVuID09IDApCi0JCQkJdHhpbmZvW2NvdW50XS51bnVzZWQrKzsKKwkJCQl1bnVzZWQrKzsKIAkJfQotCX0KIAotCXJldHVybiBuZGVzY3M7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHR4cVslZF0gbGVuPSVkIGhlYWQ9JWQgdGFpbD0lZCAiCisJCSAgICAgICAiZndfb3duZWQ9JWQgZHJ2X293bmVkPSVkIHVudXNlZD0lZFxuIiwKKwkJICAgICAgIHdpcGh5X25hbWUoaHctPndpcGh5KSwgaSwKKwkJICAgICAgIHR4cS0+c3RhdHMubGVuLCB0eHEtPmhlYWQsIHR4cS0+dGFpbCwKKwkJICAgICAgIGZ3X293bmVkLCBkcnZfb3duZWQsIHVudXNlZCk7CisJfQogfQogCiAvKgogICogTXVzdCBiZSBjYWxsZWQgd2l0aCBwcml2LT5md19tdXRleCBoZWxkIGFuZCB0eCBxdWV1ZXMgc3RvcHBlZC4KICAqLworI2RlZmluZSBNV0w4S19UWF9XQUlUX1RJTUVPVVRfTVMJMTAwMAorCiBzdGF0aWMgaW50IG13bDhrX3R4X3dhaXRfZW1wdHkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7CiAJc3RydWN0IG13bDhrX3ByaXYgKnByaXYgPSBody0+cHJpdjsKIAlERUNMQVJFX0NPTVBMRVRJT05fT05TVEFDSyh0eF93YWl0KTsKLQl1MzIgY291bnQ7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCByZXRyeTsKKwlpbnQgcmM7CiAKIAltaWdodF9zbGVlcCgpOwogCisJLyoKKwkgKiBUaGUgVFggcXVldWVzIGFyZSBzdG9wcGVkIGF0IHRoaXMgcG9pbnQsIHNvIHRoaXMgdGVzdAorCSAqIGRvZXNuJ3QgbmVlZCB0byB0YWtlIC0+dHhfbG9jay4KKwkgKi8KKwlpZiAoIXByaXYtPnBlbmRpbmdfdHhfcGt0cykKKwkJcmV0dXJuIDA7CisKKwlyZXRyeSA9IDA7CisJcmMgPSAwOworCiAJc3Bpbl9sb2NrX2JoKCZwcml2LT50eF9sb2NrKTsKLQljb3VudCA9IHByaXYtPnBlbmRpbmdfdHhfcGt0czsKLQlpZiAoY291bnQpCi0JCXByaXYtPnR4X3dhaXQgPSAmdHhfd2FpdDsKKwlwcml2LT50eF93YWl0ID0gJnR4X3dhaXQ7CisJd2hpbGUgKCFyYykgeworCQlpbnQgb2xkY291bnQ7CisJCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCQlvbGRjb3VudCA9IHByaXYtPnBlbmRpbmdfdHhfcGt0czsKKworCQlzcGluX3VubG9ja19iaCgmcHJpdi0+dHhfbG9jayk7CisJCXRpbWVvdXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnR4X3dhaXQsCisJCQkgICAgbXNlY3NfdG9famlmZmllcyhNV0w4S19UWF9XQUlUX1RJTUVPVVRfTVMpKTsKKwkJc3Bpbl9sb2NrX2JoKCZwcml2LT50eF9sb2NrKTsKKworCQlpZiAodGltZW91dCkgeworCQkJV0FSTl9PTihwcml2LT5wZW5kaW5nX3R4X3BrdHMpOworCQkJaWYgKHJldHJ5KSB7CisJCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogdHggcmluZ3MgZHJhaW5lZFxuIiwKKwkJCQkgICAgICAgd2lwaHlfbmFtZShody0+d2lwaHkpKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHByaXYtPnBlbmRpbmdfdHhfcGt0cyA8IG9sZGNvdW50KSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIHR4ICIKKwkJCSAgICAgICAicmluZ3MgdG8gZHJhaW4gKCVkIC0+ICVkIHBrdHMpLCByZXRyeWluZ1xuIiwKKwkJCSAgICAgICB3aXBoeV9uYW1lKGh3LT53aXBoeSksIG9sZGNvdW50LAorCQkJICAgICAgIHByaXYtPnBlbmRpbmdfdHhfcGt0cyk7CisJCQlyZXRyeSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCisJCXByaXYtPnR4X3dhaXQgPSBOVUxMOworCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHR4IHJpbmdzIHN0dWNrIGZvciAlZCBtc1xuIiwKKwkJICAgICAgIHdpcGh5X25hbWUoaHctPndpcGh5KSwgTVdMOEtfVFhfV0FJVF9USU1FT1VUX01TKTsKKwkJbXdsOGtfZHVtcF90eF9yaW5ncyhodyk7CisKKwkJcmMgPSAtRVRJTUVET1VUOworCX0KIAlzcGluX3VubG9ja19iaCgmcHJpdi0+dHhfbG9jayk7CiAKLQlpZiAoY291bnQpIHsKLQkJc3RydWN0IG13bDhrX3R4cV9pbmZvIHR4aW5mb1tNV0w4S19UWF9RVUVVRVNdOwotCQlpbnQgaW5kZXg7Ci0JCWludCBuZXdjb3VudDsKLQotCQl0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZ0eF93YWl0LAotCQkJCQltc2Vjc190b19qaWZmaWVzKDUwMDApKTsKLQkJaWYgKHRpbWVvdXQpCi0JCQlyZXR1cm4gMDsKLQotCQlzcGluX2xvY2tfYmgoJnByaXYtPnR4X2xvY2spOwotCQlwcml2LT50eF93YWl0ID0gTlVMTDsKLQkJbmV3Y291bnQgPSBwcml2LT5wZW5kaW5nX3R4X3BrdHM7Ci0JCW13bDhrX3NjYW5fdHhfcmluZyhwcml2LCB0eGluZm8pOwotCQlzcGluX3VubG9ja19iaCgmcHJpdi0+dHhfbG9jayk7Ci0KLQkJcHJpbnRrKEtFUk5fRVJSICIlcygldSkgVElNRURPVVQ6NTAwMG1zIFBlbmQ6JXUtLT4ldVxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXywgY291bnQsIG5ld2NvdW50KTsKLQotCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNV0w4S19UWF9RVUVVRVM7IGluZGV4KyspCi0JCQlwcmludGsoS0VSTl9FUlIgIlRYUToldSBMOiV1IEg6JXUgVDoldSBGVzoldSAiCi0JCQkgICAgICAgIkRSVjoldSBVOiV1XG4iLAotCQkJCQlpbmRleCwKLQkJCQkJdHhpbmZvW2luZGV4XS5sZW4sCi0JCQkJCXR4aW5mb1tpbmRleF0uaGVhZCwKLQkJCQkJdHhpbmZvW2luZGV4XS50YWlsLAotCQkJCQl0eGluZm9baW5kZXhdLmZ3X293bmVkLAotCQkJCQl0eGluZm9baW5kZXhdLmRydl9vd25lZCwKLQkJCQkJdHhpbmZvW2luZGV4XS51bnVzZWQpOwotCi0JCXJldHVybiAtRVRJTUVET1VUOwotCX0KLQotCXJldHVybiAwOworCXJldHVybiByYzsKIH0KIAogI2RlZmluZSBNV0w4S19UWERfU1VDQ0VTUyhzdGF0dXMpCQkJCVwKQEAgLTEzNjEsNyArMTM4Miw3IEBACiAJCUJVR19PTihza2IgPT0gTlVMTCk7CiAJCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGRldiwgYWRkciwgc2l6ZSwgUENJX0RNQV9UT0RFVklDRSk7CiAKLQkJbXdsOGtfcmVtb3ZlX2RtYV9oZWFkZXIoc2tiKTsKKwkJbXdsOGtfcmVtb3ZlX2RtYV9oZWFkZXIoc2tiLCB0eF9kZXNjLT5xb3NfY29udHJvbCk7CiAKIAkJLyogTWFyayBkZXNjcmlwdG9yIGFzIHVudXNlZCAqLwogCQl0eF9kZXNjLT5wa3RfcGh5c19hZGRyID0gMDsKQEAgLTE1NjMsOCArMTU4NCw4IEBACiAgKiBDb21tYW5kIHByb2Nlc3NpbmcuCiAgKi8KIAotLyogVGltZW91dCBmaXJtd2FyZSBjb21tYW5kcyBhZnRlciAyMDAwbXMgKi8KLSNkZWZpbmUgTVdMOEtfQ01EX1RJTUVPVVRfTVMJMjAwMAorLyogVGltZW91dCBmaXJtd2FyZSBjb21tYW5kcyBhZnRlciAxMHMgKi8KKyNkZWZpbmUgTVdMOEtfQ01EX1RJTUVPVVRfTVMJMTAwMDAKIAogc3RhdGljIGludCBtd2w4a19wb3N0X2NtZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IG13bDhrX2NtZF9wa3QgKmNtZCkKIHsKQEAgLTE2MTUsMTIgKzE2MzYsMjEgQEAKIAkJICAgICAgIE1XTDhLX0NNRF9USU1FT1VUX01TKTsKIAkJcmMgPSAtRVRJTUVET1VUOwogCX0gZWxzZSB7CisJCWludCBtczsKKworCQltcyA9IE1XTDhLX0NNRF9USU1FT1VUX01TIC0gamlmZmllc190b19tc2Vjcyh0aW1lb3V0KTsKKwogCQlyYyA9IGNtZC0+cmVzdWx0ID8gLUVJTlZBTCA6IDA7CiAJCWlmIChyYykKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvbW1hbmQgJXMgZXJyb3IgMHgleFxuIiwKIAkJCSAgICAgICB3aXBoeV9uYW1lKGh3LT53aXBoeSksCiAJCQkgICAgICAgbXdsOGtfY21kX25hbWUoY21kLT5jb2RlLCBidWYsIHNpemVvZihidWYpKSwKIAkJCSAgICAgICBsZTE2X3RvX2NwdShjbWQtPnJlc3VsdCkpOworCQllbHNlIGlmIChtcyA+IDIwMDApCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBDb21tYW5kICVzIHRvb2sgJWQgbXNcbiIsCisJCQkgICAgICAgd2lwaHlfbmFtZShody0+d2lwaHkpLAorCQkJICAgICAgIG13bDhrX2NtZF9uYW1lKGNtZC0+Y29kZSwgYnVmLCBzaXplb2YoYnVmKSksCisJCQkgICAgICAgbXMpOwogCX0KIAogCXJldHVybiByYzsKQEAgLTI0MzksOCArMjQ2OSw2IEBACiAvKgogICogQ01EX0ZJTkFMSVpFX0pPSU4uCiAgKi8KLQotLyogRkogYmVhY29uIGJ1ZmZlciBzaXplIGlzIGNvbXBpbGVkIGludG8gdGhlIGZpcm13YXJlLiAgKi8KICNkZWZpbmUgTVdMOEtfRkpfQkVBQ09OX01BWExFTgkxMjgKIAogc3RydWN0IG13bDhrX2NtZF9maW5hbGl6ZV9qb2luIHsKQEAgLTI0NTAsMTcgKzI0NzgsMTMgQEAKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0YXRpYyBpbnQgbXdsOGtfZmluYWxpemVfam9pbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdm9pZCAqZnJhbWUsCi0JCQkJX191MTYgZnJhbWVsZW4sIF9fdTE2IGR0aW0pCisJCQkgICAgICAgaW50IGZyYW1lbGVuLCBpbnQgZHRpbSkKIHsKIAlzdHJ1Y3QgbXdsOGtfY21kX2ZpbmFsaXplX2pvaW4gKmNtZDsKIAlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKnBheWxvYWQgPSBmcmFtZTsKLQl1MTYgaGRybGVuOwotCXUzMiBwYXlsb2FkX2xlbjsKKwlpbnQgcGF5bG9hZF9sZW47CiAJaW50IHJjOwogCi0JaWYgKGZyYW1lID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJY21kID0ga3phbGxvYyhzaXplb2YoKmNtZCksIEdGUF9LRVJORUwpOwogCWlmIChjbWQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0yNDY5LDI0ICsyNDkzLDE3IEBACiAJY21kLT5oZWFkZXIubGVuZ3RoID0gY3B1X3RvX2xlMTYoc2l6ZW9mKCpjbWQpKTsKIAljbWQtPnNsZWVwX2ludGVydmFsID0gY3B1X3RvX2xlMzIoZHRpbSA/IGR0aW0gOiAxKTsKIAotCWhkcmxlbiA9IGllZWU4MDIxMV9oZHJsZW4ocGF5bG9hZC0+ZnJhbWVfY29udHJvbCk7Ci0KLQlwYXlsb2FkX2xlbiA9IGZyYW1lbGVuID4gaGRybGVuID8gZnJhbWVsZW4gLSBoZHJsZW4gOiAwOwotCi0JLyogWFhYIFRCRCBNaWdodCBqdXN0IGhhdmUgdG8gYWJvcnQgYW5kIHJldHVybiBhbiBlcnJvciAqLwotCWlmIChwYXlsb2FkX2xlbiA+IE1XTDhLX0ZKX0JFQUNPTl9NQVhMRU4pCi0JCXByaW50ayhLRVJOX0VSUiAiJXMoKTogV0FSTklORzogSW5jb21wbGV0ZSBiZWFjb24gIgotCQkgICAgICAgInNlbnQgdG8gZmlybXdhcmUuIFN6PSV1IE1BWD0ldVxuIiwgX19mdW5jX18sCi0JCSAgICAgICBwYXlsb2FkX2xlbiwgTVdMOEtfRkpfQkVBQ09OX01BWExFTik7Ci0KLQlpZiAocGF5bG9hZF9sZW4gPiBNV0w4S19GSl9CRUFDT05fTUFYTEVOKQorCXBheWxvYWRfbGVuID0gZnJhbWVsZW4gLSBpZWVlODAyMTFfaGRybGVuKHBheWxvYWQtPmZyYW1lX2NvbnRyb2wpOworCWlmIChwYXlsb2FkX2xlbiA8IDApCisJCXBheWxvYWRfbGVuID0gMDsKKwllbHNlIGlmIChwYXlsb2FkX2xlbiA+IE1XTDhLX0ZKX0JFQUNPTl9NQVhMRU4pCiAJCXBheWxvYWRfbGVuID0gTVdMOEtfRkpfQkVBQ09OX01BWExFTjsKIAotCWlmIChwYXlsb2FkICYmIHBheWxvYWRfbGVuKQotCQltZW1jcHkoY21kLT5iZWFjb25fZGF0YSwgJnBheWxvYWQtPnUuYmVhY29uLCBwYXlsb2FkX2xlbik7CisJbWVtY3B5KGNtZC0+YmVhY29uX2RhdGEsICZwYXlsb2FkLT51LmJlYWNvbiwgcGF5bG9hZF9sZW4pOwogCiAJcmMgPSBtd2w4a19wb3N0X2NtZChodywgJmNtZC0+aGVhZGVyKTsKIAlrZnJlZShjbWQpOworCiAJcmV0dXJuIHJjOwogfQogCkBAIC0yNTE1LDkgKzI1MzIsNyBAQAogCXN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmluZm8gPSAmbXZfdmlmLT5ic3NfaW5mbzsKIAlzdHJ1Y3QgbXdsOGtfY21kX3VwZGF0ZV9zdGFfZGIgKmNtZDsKIAlzdHJ1Y3QgcGVlcl9jYXBhYmlsaXR5X2luZm8gKnBlZXJfaW5mbzsKLQlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKmJpdHJhdGVzID0gbXZfdmlmLT5sZWdhY3lfcmF0ZXM7CiAJaW50IHJjOwotCV9fdTggY291bnQsICpyYXRlczsKIAogCWNtZCA9IGt6YWxsb2Moc2l6ZW9mKCpjbWQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoY21kID09IE5VTEwpCkBAIC0yNTM2LDEzICsyNTUxLDExIEBACiAJCS8qIEJ1aWxkIHBlZXJfaW5mbyBibG9jayAqLwogCQlwZWVyX2luZm8tPnBlZXJfdHlwZSA9IE1XTDhLX1BFRVJfVFlQRV9BQ0NFU1NQT0lOVDsKIAkJcGVlcl9pbmZvLT5iYXNpY19jYXBzID0gY3B1X3RvX2xlMTYoaW5mby0+YXNzb2NfY2FwYWJpbGl0eSk7CisJCW1lbWNweShwZWVyX2luZm8tPmxlZ2FjeV9yYXRlcywgbXdsOGtfcmF0ZWlkcywKKwkJICAgICAgIHNpemVvZihtd2w4a19yYXRlaWRzKSk7CiAJCXBlZXJfaW5mby0+aW50ZXJvcCA9IDE7CiAJCXBlZXJfaW5mby0+YW1zZHVfZW5hYmxlZCA9IDA7CiAKLQkJcmF0ZXMgPSBwZWVyX2luZm8tPmxlZ2FjeV9yYXRlczsKLQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgbXZfdmlmLT5sZWdhY3lfbnJhdGVzOyBjb3VudCsrKQotCQkJcmF0ZXNbY291bnRdID0gYml0cmF0ZXNbY291bnRdLmh3X3ZhbHVlOwotCiAJCXJjID0gbXdsOGtfcG9zdF9jbWQoaHcsICZjbWQtPmhlYWRlcik7CiAJCWlmIChyYyA9PSAwKQogCQkJbXZfdmlmLT5wZWVyX2lkID0gcGVlcl9pbmZvLT5zdGF0aW9uX2lkOwpAQCAtMjU2NSw4ICsyNTc4LDYgQEAKIC8qCiAgKiBDTURfU0VUX0FJRC4KICAqLwotI2RlZmluZSBNV0w4S19SQVRFX0lOREVYX01BWF9BUlJBWQkJCTE0Ci0KICNkZWZpbmUgTVdMOEtfRlJBTUVfUFJPVF9ESVNBQkxFRAkJCTB4MDAKICNkZWZpbmUgTVdMOEtfRlJBTUVfUFJPVF8xMUcJCQkJMHgwNwogI2RlZmluZSBNV0w4S19GUkFNRV9QUk9UXzExTl9IVF80ME1IWl9PTkxZCQkweDAyCkBAIC0yNTc5LDcgKzI1OTAsNyBAQAogCSAvKiBBUCdzIE1BQyBhZGRyZXNzIChCU1NJRCkgKi8KIAlfX3U4CWJzc2lkW0VUSF9BTEVOXTsKIAlfX2xlMTYJcHJvdGVjdGlvbl9tb2RlOwotCV9fdTgJc3VwcF9yYXRlc1tNV0w4S19SQVRFX0lOREVYX01BWF9BUlJBWV07CisJX191OAlzdXBwX3JhdGVzWzE0XTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0YXRpYyBpbnQgbXdsOGtfY21kX3NldF9haWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCkBAIC0yNTg4LDggKzI1OTksNiBAQAogCXN0cnVjdCBtd2w4a192aWYgKm12X3ZpZiA9IE1XTDhLX1ZJRih2aWYpOwogCXN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmluZm8gPSAmbXZfdmlmLT5ic3NfaW5mbzsKIAlzdHJ1Y3QgbXdsOGtfY21kX3VwZGF0ZV9zZXRfYWlkICpjbWQ7Ci0Jc3RydWN0IGllZWU4MDIxMV9yYXRlICpiaXRyYXRlcyA9IG12X3ZpZi0+bGVnYWN5X3JhdGVzOwotCWludCBjb3VudDsKIAl1MTYgcHJvdF9tb2RlOwogCWludCByYzsKIApAQCAtMjYyMSw4ICsyNjMwLDcgQEAKIAl9CiAJY21kLT5wcm90ZWN0aW9uX21vZGUgPSBjcHVfdG9fbGUxNihwcm90X21vZGUpOwogCi0JZm9yIChjb3VudCA9IDA7IGNvdW50IDwgbXZfdmlmLT5sZWdhY3lfbnJhdGVzOyBjb3VudCsrKQotCQljbWQtPnN1cHBfcmF0ZXNbY291bnRdID0gYml0cmF0ZXNbY291bnRdLmh3X3ZhbHVlOworCW1lbWNweShjbWQtPnN1cHBfcmF0ZXMsIG13bDhrX3JhdGVpZHMsIHNpemVvZihtd2w4a19yYXRlaWRzKSk7CiAKIAlyYyA9IG13bDhrX3Bvc3RfY21kKGh3LCAmY21kLT5oZWFkZXIpOwogCWtmcmVlKGNtZCk7CkBAIC0yNjM1LDIwICsyNjQzLDE3IEBACiAgKi8KIHN0cnVjdCBtd2w4a19jbWRfdXBkYXRlX3JhdGVzZXQgewogCXN0cnVjdAltd2w4a19jbWRfcGt0IGhlYWRlcjsKLQlfX3U4CWxlZ2FjeV9yYXRlc1tNV0w4S19SQVRFX0lOREVYX01BWF9BUlJBWV07CisJX191OAlsZWdhY3lfcmF0ZXNbMTRdOwogCiAJLyogQml0bWFwIGZvciBzdXBwb3J0ZWQgTUNTIGNvZGVzLiAgKi8KLQlfX3U4CW1jc19zZXRbTVdMOEtfSUVFRV9MRUdBQ1lfREFUQV9SQVRFU107Ci0JX191OAlyZXNlcnZlZFtNV0w4S19JRUVFX0xFR0FDWV9EQVRBX1JBVEVTXTsKKwlfX3U4CW1jc19zZXRbMTZdOworCV9fdTgJcmVzZXJ2ZWRbMTZdOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RhdGljIGludCBtd2w4a191cGRhdGVfcmF0ZXNldChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKIHsKLQlzdHJ1Y3QgbXdsOGtfdmlmICptdl92aWYgPSBNV0w4S19WSUYodmlmKTsKIAlzdHJ1Y3QgbXdsOGtfY21kX3VwZGF0ZV9yYXRlc2V0ICpjbWQ7Ci0Jc3RydWN0IGllZWU4MDIxMV9yYXRlICpiaXRyYXRlcyA9IG12X3ZpZi0+bGVnYWN5X3JhdGVzOwotCWludCBjb3VudDsKIAlpbnQgcmM7CiAKIAljbWQgPSBremFsbG9jKHNpemVvZigqY21kKSwgR0ZQX0tFUk5FTCk7CkBAIC0yNjU3LDkgKzI2NjIsNyBAQAogCiAJY21kLT5oZWFkZXIuY29kZSA9IGNwdV90b19sZTE2KE1XTDhLX0NNRF9TRVRfUkFURSk7CiAJY21kLT5oZWFkZXIubGVuZ3RoID0gY3B1X3RvX2xlMTYoc2l6ZW9mKCpjbWQpKTsKLQotCWZvciAoY291bnQgPSAwOyBjb3VudCA8IG12X3ZpZi0+bGVnYWN5X25yYXRlczsgY291bnQrKykKLQkJY21kLT5sZWdhY3lfcmF0ZXNbY291bnRdID0gYml0cmF0ZXNbY291bnRdLmh3X3ZhbHVlOworCW1lbWNweShjbWQtPmxlZ2FjeV9yYXRlcywgbXdsOGtfcmF0ZWlkcywgc2l6ZW9mKG13bDhrX3JhdGVpZHMpKTsKIAogCXJjID0gbXdsOGtfcG9zdF9jbWQoaHcsICZjbWQtPmhlYWRlcik7CiAJa2ZyZWUoY21kKTsKQEAgLTI5MzIsMTEgKzI5MzUsNiBAQAogCS8qIEJhY2sgcG9pbnRlciB0byBwYXJlbnQgY29uZmlnIGJsb2NrICovCiAJbXdsOGtfdmlmLT5wcml2ID0gcHJpdjsKIAotCS8qIFNldHVwIGluaXRpYWwgUEhZIHBhcmFtZXRlcnMgKi8KLQltZW1jcHkobXdsOGtfdmlmLT5sZWdhY3lfcmF0ZXMsCi0JCXByaXYtPnJhdGVzLCBzaXplb2YobXdsOGtfdmlmLT5sZWdhY3lfcmF0ZXMpKTsKLQltd2w4a192aWYtPmxlZ2FjeV9ucmF0ZXMgPSBBUlJBWV9TSVpFKHByaXYtPnJhdGVzKTsKLQogCS8qIFNldCBJbml0aWFsIHNlcXVlbmNlIG51bWJlciB0byB6ZXJvICovCiAJbXdsOGtfdmlmLT5zZXFubyA9IDA7CiAKQEAgLTMwMTQsOSArMzAxMiw2IEBACiAJc3RydWN0IG13bDhrX3ZpZiAqbXdsOGtfdmlmID0gTVdMOEtfVklGKHZpZik7CiAJaW50IHJjOwogCi0JaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9CU1NJRCkKLQkJbWVtY3B5KG13bDhrX3ZpZi0+YnNzaWQsIGluZm8tPmJzc2lkLCBFVEhfQUxFTik7Ci0KIAlpZiAoKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9BU1NPQykgPT0gMCkKIAkJcmV0dXJuOwogCkBAIC0zMDMwLDYgKzMwMjUsOCBAQAogCQltZW1jcHkoJm13bDhrX3ZpZi0+YnNzX2luZm8sIGluZm8sCiAJCQlzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZikpOwogCisJCW1lbWNweShtd2w4a192aWYtPmJzc2lkLCBpbmZvLT5ic3NpZCwgRVRIX0FMRU4pOworCiAJCS8qIEluc3RhbGwgcmF0ZXMgKi8KIAkJcmMgPSBtd2w4a191cGRhdGVfcmF0ZXNldChodywgdmlmKTsKIAkJaWYgKHJjKQpAQCAtMzM2Niw3ICszMzYzLDcgQEAKIAlpZiAocmMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2Fubm90IG9idGFpbiBQQ0kgcmVzb3VyY2VzXG4iLAogCQkgICAgICAgTVdMOEtfTkFNRSk7Ci0JCXJldHVybiByYzsKKwkJZ290byBlcnJfZGlzYWJsZV9kZXZpY2U7CiAJfQogCiAJcGNpX3NldF9tYXN0ZXIocGRldik7CkBAIC0zNTk3LDYgKzM1OTQsOCBAQAogCiBlcnJfZnJlZV9yZWc6CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKworZXJyX2Rpc2FibGVfZGV2aWNlOgogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAogCXJldHVybiByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vaGVybWVzX2RsZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9oZXJtZXNfZGxkLmMKaW5kZXggODQyMDBkYS4uZmIxNTdlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9oZXJtZXNfZGxkLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9oZXJtZXNfZGxkLmMKQEAgLTQyNyw3ICs0MjcsNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlwcl9kZWJ1ZyhLRVJOX0RFQlVHIFBGWCAiRW5hYmxpbmcgdm9sYXRpbGUsIEVQIDB4JTA4eFxuIiwgb2Zmc2V0KTsKKwlwcl9kZWJ1ZyhQRlggIkVuYWJsaW5nIHZvbGF0aWxlLCBFUCAweCUwOHhcbiIsIG9mZnNldCk7CiAJZXJyID0gaGVybWVzX2RvaWNtZF93YWl0KGh3LAogCQkJCSBIRVJNRVNfUFJPR1JBTV9FTkFCTEVfVk9MQVRJTEUsCiAJCQkJIG9mZnNldCAmIDB4RkZGRnUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4Ny5oCmluZGV4IGFiYjQ5MDcuLjZhZjBmM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4Ny5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4Ny5oCkBAIC0yMyw2ICsyMyw3IEBACiAjZGVmaW5lIFJUTDgxODdfRUVQUk9NX1RYUFdSX0NIQU5fMQkweDE2CS8qIDMgY2hhbm5lbHMgKi8KICNkZWZpbmUgUlRMODE4N19FRVBST01fVFhQV1JfQ0hBTl82CTB4MUIJLyogMiBjaGFubmVscyAqLwogI2RlZmluZSBSVEw4MTg3X0VFUFJPTV9UWFBXUl9DSEFOXzQJMHgzRAkvKiAyIGNoYW5uZWxzICovCisjZGVmaW5lIFJUTDgxODdfRUVQUk9NX1NFTEVDVF9HUElPCTB4M0IKIAogI2RlZmluZSBSVEw4MTg3X1JFUVRfUkVBRAkweEMwCiAjZGVmaW5lIFJUTDgxODdfUkVRVF9XUklURQkweDQwCkBAIC0zMSw2ICszMiw5IEBACiAKICNkZWZpbmUgUlRMODE4N19NQVhfUlgJCTB4OUM0CiAKKyNkZWZpbmUgUkZLSUxMX01BU0tfODE4N184OV85NwkweDIKKyNkZWZpbmUgUkZLSUxMX01BU0tfODE5OAkweDQKKwogc3RydWN0IHJ0bDgxODdfcnhfaW5mbyB7CiAJc3RydWN0IHVyYiAqdXJiOwogCXN0cnVjdCBpZWVlODAyMTFfaHcgKmRldjsKQEAgLTEwNCw2ICsxMDgsNyBAQAogCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXY7CiAjaWZkZWYgQ09ORklHX1JUTDgxODdfTEVEUworCXN0cnVjdCBydGw4MTg3X2xlZCBsZWRfcmFkaW87CiAJc3RydWN0IHJ0bDgxODdfbGVkIGxlZF90eDsKIAlzdHJ1Y3QgcnRsODE4N19sZWQgbGVkX3J4OwogCXN0cnVjdCBkZWxheWVkX3dvcmsgbGVkX29uOwpAQCAtMTIyLDYgKzEyNyw3IEBACiAJdTggbm9pc2U7CiAJdTggc2xvdF90aW1lOwogCXU4IGFpZnNuWzRdOworCXU4IHJma2lsbF9tYXNrOwogCXN0cnVjdCB7CiAJCV9fbGU2NCBidWY7CiAJCXN0cnVjdCBza19idWZmX2hlYWQgcXVldWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODdfZGV2LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODdfZGV2LmMKaW5kZXggNzY5NzNiOC4uYmM1NzI2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4eC9ydGw4MTg3X2Rldi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4N19kZXYuYwpAQCAtMTMyMiw2ICsxMzIyLDcgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWw7CiAJY29uc3QgY2hhciAqY2hpcF9uYW1lOwogCXUxNiB0eHB3ciwgcmVnOworCXUxNiBwcm9kdWN0X2lkID0gbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOwogCWludCBlcnIsIGk7CiAKIAlkZXYgPSBpZWVlODAyMTFfYWxsb2NfaHcoc2l6ZW9mKCpwcml2KSwgJnJ0bDgxODdfb3BzKTsKQEAgLTE0ODEsNiArMTQ4MiwxMyBAQAogCQkoKmNoYW5uZWwrKykuaHdfdmFsdWUgPSB0eHB3ciAmIDB4RkY7CiAJCSgqY2hhbm5lbCsrKS5od192YWx1ZSA9IHR4cHdyID4+IDg7CiAJfQorCS8qIEhhbmRsZSB0aGUgZGlmZmVyaW5nIHJma2lsbCBHUElPIGJpdCBpbiBkaWZmZXJlbnQgbW9kZWxzICovCisJcHJpdi0+cmZraWxsX21hc2sgPSBSRktJTExfTUFTS184MTg3Xzg5Xzk3OworCWlmIChwcm9kdWN0X2lkID09IDB4ODE5NyB8fCBwcm9kdWN0X2lkID09IDB4ODE5OCkgeworCQllZXByb21fOTNjeDZfcmVhZCgmZWVwcm9tLCBSVEw4MTg3X0VFUFJPTV9TRUxFQ1RfR1BJTywgJnJlZyk7CisJCWlmIChyZWcgJiAweEZGMDApCisJCQlwcml2LT5yZmtpbGxfbWFzayA9IFJGS0lMTF9NQVNLXzgxOTg7CisJfQogCiAJLyoKIAkgKiBYWFg6IE9uY2UgdGhpcyBkcml2ZXIgc3VwcG9ydHMgYW55dGhpbmcgdGhhdCByZXF1aXJlcwpAQCAtMTUwOSw5ICsxNTE3LDkgQEAKIAltdXRleF9pbml0KCZwcml2LT5jb25mX211dGV4KTsKIAlza2JfcXVldWVfaGVhZF9pbml0KCZwcml2LT5iX3R4X3N0YXR1cy5xdWV1ZSk7CiAKLQlwcmludGsoS0VSTl9JTkZPICIlczogaHdhZGRyICVwTSwgJXMgViVkICsgJXNcbiIsCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGh3YWRkciAlcE0sICVzIFYlZCArICVzLCByZmtpbGwgbWFzayAlZFxuIiwKIAkgICAgICAgd2lwaHlfbmFtZShkZXYtPndpcGh5KSwgZGV2LT53aXBoeS0+cGVybV9hZGRyLAotCSAgICAgICBjaGlwX25hbWUsIHByaXYtPmFzaWNfcmV2LCBwcml2LT5yZi0+bmFtZSk7CisJICAgICAgIGNoaXBfbmFtZSwgcHJpdi0+YXNpY19yZXYsIHByaXYtPnJmLT5uYW1lLCBwcml2LT5yZmtpbGxfbWFzayk7CiAKICNpZmRlZiBDT05GSUdfUlRMODE4N19MRURTCiAJZWVwcm9tXzkzY3g2X3JlYWQoJmVlcHJvbSwgMHgzRiwgJnJlZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODdfbGVkcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4eC9ydGw4MTg3X2xlZHMuYwppbmRleCBjZjhhNGE0Li5kZWQ0NGMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODdfbGVkcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4N19sZWRzLmMKQEAgLTEwNSwxOSArMTA1LDM2IEBACiAJc3RydWN0IHJ0bDgxODdfbGVkICpsZWQgPSBjb250YWluZXJfb2YobGVkX2Rldiwgc3RydWN0IHJ0bDgxODdfbGVkLAogCQkJCQkgICAgICAgbGVkX2Rldik7CiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBsZWQtPmRldjsKLQlzdHJ1Y3QgcnRsODE4N19wcml2ICpwcml2ID0gaHctPnByaXY7CisJc3RydWN0IHJ0bDgxODdfcHJpdiAqcHJpdjsKKwlzdGF0aWMgYm9vbCByYWRpb19vbjsKIAotCWlmIChicmlnaHRuZXNzID09IExFRF9PRkYpIHsKLQkJaWVlZTgwMjExX3F1ZXVlX2RlbGF5ZWRfd29yayhodywgJnByaXYtPmxlZF9vZmYsIDApOwotCQkvKiBUaGUgTEVEIGlzIG9mZiBmb3IgMS8yMCBzZWMgc28gdGhhdCBpdCBqdXN0IGJsaW5rcy4gKi8KLQkJaWVlZTgwMjExX3F1ZXVlX2RlbGF5ZWRfd29yayhodywgJnByaXYtPmxlZF9vbiwgSFogLyAyMCk7Ci0JfSBlbHNlCi0JCWllZWU4MDIxMV9xdWV1ZV9kZWxheWVkX3dvcmsoaHcsICZwcml2LT5sZWRfb24sIDApOworCWlmICghaHcpCisJCXJldHVybjsKKwlwcml2ID0gaHctPnByaXY7CisJaWYgKGxlZC0+aXNfcmFkaW8pIHsKKwkJaWYgKGJyaWdodG5lc3MgPT0gTEVEX0ZVTEwpIHsKKwkJCWllZWU4MDIxMV9xdWV1ZV9kZWxheWVkX3dvcmsoaHcsICZwcml2LT5sZWRfb24sIDApOworCQkJcmFkaW9fb24gPSB0cnVlOworCQl9IGVsc2UgaWYgKHJhZGlvX29uKSB7CisJCQlyYWRpb19vbiA9IGZhbHNlOworCQkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwcml2LT5sZWRfb24pOworCQkJaWVlZTgwMjExX3F1ZXVlX2RlbGF5ZWRfd29yayhodywgJnByaXYtPmxlZF9vZmYsIDApOworCQl9CisJfSBlbHNlIGlmIChyYWRpb19vbikgeworCQlpZiAoYnJpZ2h0bmVzcyA9PSBMRURfT0ZGKSB7CisJCQlpZWVlODAyMTFfcXVldWVfZGVsYXllZF93b3JrKGh3LCAmcHJpdi0+bGVkX29mZiwgMCk7CisJCQkvKiBUaGUgTEVEIGlzIG9mZiBmb3IgMS8yMCBzZWMgLSBpdCBqdXN0IGJsaW5rcy4gKi8KKwkJCWllZWU4MDIxMV9xdWV1ZV9kZWxheWVkX3dvcmsoaHcsICZwcml2LT5sZWRfb24sCisJCQkJCQkgICAgIEhaIC8gMjApOworCQl9IGVsc2UKKwkJCWllZWU4MDIxMV9xdWV1ZV9kZWxheWVkX3dvcmsoaHcsICZwcml2LT5sZWRfb24sIDApOworCX0KIH0KIAogc3RhdGljIGludCBydGw4MTg3X3JlZ2lzdGVyX2xlZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsCiAJCQkJc3RydWN0IHJ0bDgxODdfbGVkICpsZWQsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJY29uc3QgY2hhciAqZGVmYXVsdF90cmlnZ2VyLCB1OCBsZWRwaW4pCisJCQkJY29uc3QgY2hhciAqZGVmYXVsdF90cmlnZ2VyLCB1OCBsZWRwaW4sCisJCQkJYm9vbCBpc19yYWRpbykKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCBydGw4MTg3X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CkBAIC0xMjgsNiArMTQ1LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJbGVkLT5kZXYgPSBkZXY7CiAJbGVkLT5sZWRwaW4gPSBsZWRwaW47CisJbGVkLT5pc19yYWRpbyA9IGlzX3JhZGlvOwogCXN0cm5jcHkobGVkLT5uYW1lLCBuYW1lLCBzaXplb2YobGVkLT5uYW1lKSk7CiAKIAlsZWQtPmxlZF9kZXYubmFtZSA9IGxlZC0+bmFtZTsKQEAgLTE0NSw3ICsxNjMsMTEgQEAKIAogc3RhdGljIHZvaWQgcnRsODE4N191bnJlZ2lzdGVyX2xlZChzdHJ1Y3QgcnRsODE4N19sZWQgKmxlZCkKIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IGxlZC0+ZGV2OworCXN0cnVjdCBydGw4MTg3X3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwogCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZsZWQtPmxlZF9kZXYpOworCWZsdXNoX2RlbGF5ZWRfd29yaygmcHJpdi0+bGVkX29mZik7CiAJbGVkLT5kZXYgPSBOVUxMOwogfQogCkBAIC0xODMsMzMgKzIwNSwzNyBAQAogCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5sZWRfb2ZmLCBsZWRfdHVybl9vZmYpOwogCiAJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLAorCQkgInJ0bDgxODctJXM6OnJhZGlvIiwgd2lwaHlfbmFtZShkZXYtPndpcGh5KSk7CisJZXJyID0gcnRsODE4N19yZWdpc3Rlcl9sZWQoZGV2LCAmcHJpdi0+bGVkX3JhZGlvLCBuYW1lLAorCQkJIGllZWU4MDIxMV9nZXRfcmFkaW9fbGVkX25hbWUoZGV2KSwgbGVkcGluLCB0cnVlKTsKKwlpZiAoZXJyKQorCQlyZXR1cm47CisKKwlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksCiAJCSAicnRsODE4Ny0lczo6dHgiLCB3aXBoeV9uYW1lKGRldi0+d2lwaHkpKTsKIAllcnIgPSBydGw4MTg3X3JlZ2lzdGVyX2xlZChkZXYsICZwcml2LT5sZWRfdHgsIG5hbWUsCi0JCQkgaWVlZTgwMjExX2dldF90eF9sZWRfbmFtZShkZXYpLCBsZWRwaW4pOworCQkJIGllZWU4MDIxMV9nZXRfdHhfbGVkX25hbWUoZGV2KSwgbGVkcGluLCBmYWxzZSk7CiAJaWYgKGVycikKLQkJZ290byBlcnJvcjsKKwkJZ290byBlcnJfdHg7CisKIAlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksCiAJCSAicnRsODE4Ny0lczo6cngiLCB3aXBoeV9uYW1lKGRldi0+d2lwaHkpKTsKIAllcnIgPSBydGw4MTg3X3JlZ2lzdGVyX2xlZChkZXYsICZwcml2LT5sZWRfcngsIG5hbWUsCi0JCQkgaWVlZTgwMjExX2dldF9yeF9sZWRfbmFtZShkZXYpLCBsZWRwaW4pOwotCWlmICghZXJyKSB7Ci0JCWllZWU4MDIxMV9xdWV1ZV9kZWxheWVkX3dvcmsoZGV2LCAmcHJpdi0+bGVkX29uLCAwKTsKKwkJCSBpZWVlODAyMTFfZ2V0X3J4X2xlZF9uYW1lKGRldiksIGxlZHBpbiwgZmFsc2UpOworCWlmICghZXJyKQogCQlyZXR1cm47Ci0JfQotCS8qIHJlZ2lzdHJhdGlvbiBvZiBSWCBMRUQgZmFpbGVkIC0gdW5yZWdpc3RlciBUWCAqLworCisJLyogcmVnaXN0cmF0aW9uIG9mIFJYIExFRCBmYWlsZWQgLSB1bnJlZ2lzdGVyICovCiAJcnRsODE4N191bnJlZ2lzdGVyX2xlZCgmcHJpdi0+bGVkX3R4KTsKLWVycm9yOgotCS8qIElmIHJlZ2lzdHJhdGlvbiBvZiBlaXRoZXIgZmFpbGVkLCBjYW5jZWwgZGVsYXllZCB3b3JrICovCi0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwcml2LT5sZWRfb2ZmKTsKLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXYtPmxlZF9vbik7CitlcnJfdHg6CisJcnRsODE4N191bnJlZ2lzdGVyX2xlZCgmcHJpdi0+bGVkX3JhZGlvKTsKIH0KIAogdm9pZCBydGw4MTg3X2xlZHNfZXhpdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYpCiB7CiAJc3RydWN0IHJ0bDgxODdfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKIAotCS8qIHR1cm4gdGhlIExFRCBvZmYgYmVmb3JlIGV4aXRpbmcgKi8KLQlpZWVlODAyMTFfcXVldWVfZGVsYXllZF93b3JrKGRldiwgJnByaXYtPmxlZF9vZmYsIDApOworCXJ0bDgxODdfdW5yZWdpc3Rlcl9sZWQoJnByaXYtPmxlZF9yYWRpbyk7CiAJcnRsODE4N191bnJlZ2lzdGVyX2xlZCgmcHJpdi0+bGVkX3J4KTsKIAlydGw4MTg3X3VucmVnaXN0ZXJfbGVkKCZwcml2LT5sZWRfdHgpOwogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHJpdi0+bGVkX29mZik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODdfbGVkcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4eC9ydGw4MTg3X2xlZHMuaAppbmRleCBhMDMzMjAyLi5lZmU4MDQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODdfbGVkcy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4N19sZWRzLmgKQEAgLTQ3LDYgKzQ3LDggQEAKIAl1OCBsZWRwaW47CiAJLyogVGhlIHVuaXF1ZSBuYW1lIHN0cmluZyBmb3IgdGhpcyBMRUQgZGV2aWNlLiAqLwogCWNoYXIgbmFtZVtSVEw4MTg3X0xFRF9NQVhfTkFNRV9MRU4gKyAxXTsKKwkvKiBJZiB0aGUgTEVEIGlzIHJhZGlvIG9yIHR4L3J4ICovCisJYm9vbCBpc19yYWRpbzsKIH07CiAKIHZvaWQgcnRsODE4N19sZWRzX2luaXQoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LCB1MTYgY29kZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODdfcmZraWxsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODdfcmZraWxsLmMKaW5kZXggY2FkODAzNy4uMDM1NTVlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4eC9ydGw4MTg3X3Jma2lsbC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4N19yZmtpbGwuYwpAQCAtMjUsMTAgKzI1LDEwIEBACiAJdTggZ3BpbzsKIAogCWdwaW8gPSBydGw4MTh4X2lvcmVhZDgocHJpdiwgJnByaXYtPm1hcC0+R1BJTzApOwotCXJ0bDgxOHhfaW93cml0ZTgocHJpdiwgJnByaXYtPm1hcC0+R1BJTzAsIGdwaW8gJiB+MHgwMik7CisJcnRsODE4eF9pb3dyaXRlOChwcml2LCAmcHJpdi0+bWFwLT5HUElPMCwgZ3BpbyAmIH5wcml2LT5yZmtpbGxfbWFzayk7CiAJZ3BpbyA9IHJ0bDgxOHhfaW9yZWFkOChwcml2LCAmcHJpdi0+bWFwLT5HUElPMSk7CiAKLQlyZXR1cm4gZ3BpbyAmIDB4MDI7CisJcmV0dXJuIGdwaW8gJiBwcml2LT5yZmtpbGxfbWFzazsKIH0KIAogdm9pZCBydGw4MTg3X3Jma2lsbF9pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTI1MV9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjUxX21haW4uYwppbmRleCBmZjRiZTdiLi4yZjUwYTI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjUxX21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMjUxX21haW4uYwpAQCAtNjI5LDEwICs2MjksNiBAQAogCQkJZ290byBvdXRfc2xlZXA7CiAJfQogCi0JcmV0ID0gd2wxMjUxX2J1aWxkX251bGxfZGF0YSh3bCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0X3NsZWVwOwotCiAJaWYgKGNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0NPTkZfUFMgJiYgIXdsLT5wc21fcmVxdWVzdGVkKSB7CiAJCXdsMTI1MV9kZWJ1ZyhERUJVR19QU00sICJwc20gZW5hYmxlZCIpOwogCkBAIC0xMTEwLDYgKzExMDYsMjEgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKKwlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0JTU0lEKSB7CisJCW1lbWNweSh3bC0+YnNzaWQsIGJzc19jb25mLT5ic3NpZCwgRVRIX0FMRU4pOworCisJCXJldCA9IHdsMTI1MV9idWlsZF9udWxsX2RhdGEod2wpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCisJCWlmICh3bC0+YnNzX3R5cGUgIT0gQlNTX1RZUEVfSUJTUykgeworCQkJcmV0ID0gd2wxMjUxX2pvaW4od2wsIHdsLT5ic3NfdHlwZSwgd2wtPmNoYW5uZWwsCisJCQkJCSAgd2wtPmJlYWNvbl9pbnQsIHdsLT5kdGltX3BlcmlvZCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIG91dF9zbGVlcDsKKwkJfQorCX0KKwogCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfQVNTT0MpIHsKIAkJaWYgKGJzc19jb25mLT5hc3NvYykgewogCQkJd2wtPmJlYWNvbl9pbnQgPSBic3NfY29uZi0+YmVhY29uX2ludDsKQEAgLTExNjksMjMgKzExODAsNiBAQAogCQl9CiAJfQogCi0JaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9CU1NJRCkgewotCQltZW1jcHkod2wtPmJzc2lkLCBic3NfY29uZi0+YnNzaWQsIEVUSF9BTEVOKTsKLQotCQlyZXQgPSB3bDEyNTFfYnVpbGRfbnVsbF9kYXRhKHdsKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIG91dDsKLQotCQlpZiAod2wtPmJzc190eXBlICE9IEJTU19UWVBFX0lCU1MpIHsKLQkJCXJldCA9IHdsMTI1MV9qb2luKHdsLCB3bC0+YnNzX3R5cGUsIHdsLT5jaGFubmVsLAotCQkJCQkgIHdsLT5iZWFjb25faW50LCB3bC0+ZHRpbV9wZXJpb2QpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJZ290byBvdXRfc2xlZXA7Ci0JCQl3bDEyNTFfd2FybmluZygiU2V0IGN0c3Byb3RlY3QgZmFpbGVkICVkIiwgcmV0KTsKLQkJCWdvdG8gb3V0X3NsZWVwOwotCQl9Ci0JfQotCiAJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9CRUFDT04pIHsKIAkJYmVhY29uID0gaWVlZTgwMjExX2JlYWNvbl9nZXQoaHcsIHZpZik7CiAJCXJldCA9IHdsMTI1MV9jbWRfdGVtcGxhdGVfc2V0KHdsLCBDTURfQkVBQ09OLCBiZWFjb24tPmRhdGEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC94ZW4tbmV0ZnJvbnQuYyBiL2RyaXZlcnMvbmV0L3hlbi1uZXRmcm9udC5jCmluZGV4IGJhYTA1MWQuLmE4NjliNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3hlbi1uZXRmcm9udC5jCisrKyBiL2RyaXZlcnMvbmV0L3hlbi1uZXRmcm9udC5jCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KIAorI2luY2x1ZGUgPHhlbi94ZW4uaD4KICNpbmNsdWRlIDx4ZW4veGVuYnVzLmg+CiAjaW5jbHVkZSA8eGVuL2V2ZW50cy5oPgogI2luY2x1ZGUgPHhlbi9wYWdlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL3BsYXRmb3JtLmMgYi9kcml2ZXJzL29mL3BsYXRmb3JtLmMKaW5kZXggMjk4ZGUwZi4uZDU4YWRlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvb2YvcGxhdGZvcm0uYwpAQCAtNjUsMjggKzY1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBvZl9wbGF0Zm9ybV9kZXZpY2Vfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlICpvZl9kZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICpkcnYgPSB0b19vZl9wbGF0Zm9ybV9kcml2ZXIoZGV2LT5kcml2ZXIpOwotCWludCBlcnJvciA9IDA7Ci0KLQlpZiAoZGV2LT5kcml2ZXIgJiYgZHJ2LT5zdXNwZW5kKQotCQllcnJvciA9IGRydi0+c3VzcGVuZChvZl9kZXYsIHN0YXRlKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyBpbnQgb2ZfcGxhdGZvcm1fZGV2aWNlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICogZGV2KQotewotCXN0cnVjdCBvZl9kZXZpY2UgKm9mX2RldiA9IHRvX29mX2RldmljZShkZXYpOwotCXN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKmRydiA9IHRvX29mX3BsYXRmb3JtX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0JaW50IGVycm9yID0gMDsKLQotCWlmIChkZXYtPmRyaXZlciAmJiBkcnYtPnJlc3VtZSkKLQkJZXJyb3IgPSBkcnYtPnJlc3VtZShvZl9kZXYpOwotCXJldHVybiBlcnJvcjsKLX0KLQogc3RhdGljIHZvaWQgb2ZfcGxhdGZvcm1fZGV2aWNlX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgb2ZfZGV2aWNlICpvZl9kZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKQEAgLTk2LDE2ICs3NCwzMTMgQEAKIAkJZHJ2LT5zaHV0ZG93bihvZl9kZXYpOwogfQogCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCisKK3N0YXRpYyBpbnQgb2ZfcGxhdGZvcm1fbGVnYWN5X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpvZl9kZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICpkcnYgPSB0b19vZl9wbGF0Zm9ybV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCWludCByZXQgPSAwOworCisJaWYgKGRldi0+ZHJpdmVyICYmIGRydi0+c3VzcGVuZCkKKwkJcmV0ID0gZHJ2LT5zdXNwZW5kKG9mX2RldiwgbWVzZyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvZl9wbGF0Zm9ybV9sZWdhY3lfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpvZl9kZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICpkcnYgPSB0b19vZl9wbGF0Zm9ybV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCWludCByZXQgPSAwOworCisJaWYgKGRldi0+ZHJpdmVyICYmIGRydi0+cmVzdW1lKQorCQlyZXQgPSBkcnYtPnJlc3VtZShvZl9kZXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2ZfcGxhdGZvcm1fcG1fcHJlcGFyZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOworCWludCByZXQgPSAwOworCisJaWYgKGRydiAmJiBkcnYtPnBtICYmIGRydi0+cG0tPnByZXBhcmUpCisJCXJldCA9IGRydi0+cG0tPnByZXBhcmUoZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG9mX3BsYXRmb3JtX3BtX2NvbXBsZXRlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CisKKwlpZiAoZHJ2ICYmIGRydi0+cG0gJiYgZHJ2LT5wbS0+Y29tcGxldGUpCisJCWRydi0+cG0tPmNvbXBsZXRlKGRldik7Cit9CisKKyNpZmRlZiBDT05GSUdfU1VTUEVORAorCitzdGF0aWMgaW50IG9mX3BsYXRmb3JtX3BtX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghZHJ2KQorCQlyZXR1cm4gMDsKKworCWlmIChkcnYtPnBtKSB7CisJCWlmIChkcnYtPnBtLT5zdXNwZW5kKQorCQkJcmV0ID0gZHJ2LT5wbS0+c3VzcGVuZChkZXYpOworCX0gZWxzZSB7CisJCXJldCA9IG9mX3BsYXRmb3JtX2xlZ2FjeV9zdXNwZW5kKGRldiwgUE1TR19TVVNQRU5EKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9mX3BsYXRmb3JtX3BtX3N1c3BlbmRfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghZHJ2KQorCQlyZXR1cm4gMDsKKworCWlmIChkcnYtPnBtKSB7CisJCWlmIChkcnYtPnBtLT5zdXNwZW5kX25vaXJxKQorCQkJcmV0ID0gZHJ2LT5wbS0+c3VzcGVuZF9ub2lycShkZXYpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2ZfcGxhdGZvcm1fcG1fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWRydikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZHJ2LT5wbSkgeworCQlpZiAoZHJ2LT5wbS0+cmVzdW1lKQorCQkJcmV0ID0gZHJ2LT5wbS0+cmVzdW1lKGRldik7CisJfSBlbHNlIHsKKwkJcmV0ID0gb2ZfcGxhdGZvcm1fbGVnYWN5X3Jlc3VtZShkZXYpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2ZfcGxhdGZvcm1fcG1fcmVzdW1lX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWRydikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZHJ2LT5wbSkgeworCQlpZiAoZHJ2LT5wbS0+cmVzdW1lX25vaXJxKQorCQkJcmV0ID0gZHJ2LT5wbS0+cmVzdW1lX25vaXJxKGRldik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworI2Vsc2UgLyogIUNPTkZJR19TVVNQRU5EICovCisKKyNkZWZpbmUgb2ZfcGxhdGZvcm1fcG1fc3VzcGVuZAkJTlVMTAorI2RlZmluZSBvZl9wbGF0Zm9ybV9wbV9yZXN1bWUJCU5VTEwKKyNkZWZpbmUgb2ZfcGxhdGZvcm1fcG1fc3VzcGVuZF9ub2lycQlOVUxMCisjZGVmaW5lIG9mX3BsYXRmb3JtX3BtX3Jlc3VtZV9ub2lycQlOVUxMCisKKyNlbmRpZiAvKiAhQ09ORklHX1NVU1BFTkQgKi8KKworI2lmZGVmIENPTkZJR19ISUJFUk5BVElPTgorCitzdGF0aWMgaW50IG9mX3BsYXRmb3JtX3BtX2ZyZWV6ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOworCWludCByZXQgPSAwOworCisJaWYgKCFkcnYpCisJCXJldHVybiAwOworCisJaWYgKGRydi0+cG0pIHsKKwkJaWYgKGRydi0+cG0tPmZyZWV6ZSkKKwkJCXJldCA9IGRydi0+cG0tPmZyZWV6ZShkZXYpOworCX0gZWxzZSB7CisJCXJldCA9IG9mX3BsYXRmb3JtX2xlZ2FjeV9zdXNwZW5kKGRldiwgUE1TR19GUkVFWkUpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2ZfcGxhdGZvcm1fcG1fZnJlZXplX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWRydikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZHJ2LT5wbSkgeworCQlpZiAoZHJ2LT5wbS0+ZnJlZXplX25vaXJxKQorCQkJcmV0ID0gZHJ2LT5wbS0+ZnJlZXplX25vaXJxKGRldik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvZl9wbGF0Zm9ybV9wbV90aGF3KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWRydikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZHJ2LT5wbSkgeworCQlpZiAoZHJ2LT5wbS0+dGhhdykKKwkJCXJldCA9IGRydi0+cG0tPnRoYXcoZGV2KTsKKwl9IGVsc2UgeworCQlyZXQgPSBvZl9wbGF0Zm9ybV9sZWdhY3lfcmVzdW1lKGRldik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvZl9wbGF0Zm9ybV9wbV90aGF3X25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWRydikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZHJ2LT5wbSkgeworCQlpZiAoZHJ2LT5wbS0+dGhhd19ub2lycSkKKwkJCXJldCA9IGRydi0+cG0tPnRoYXdfbm9pcnEoZGV2KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9mX3BsYXRmb3JtX3BtX3Bvd2Vyb2ZmKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWRydikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZHJ2LT5wbSkgeworCQlpZiAoZHJ2LT5wbS0+cG93ZXJvZmYpCisJCQlyZXQgPSBkcnYtPnBtLT5wb3dlcm9mZihkZXYpOworCX0gZWxzZSB7CisJCXJldCA9IG9mX3BsYXRmb3JtX2xlZ2FjeV9zdXNwZW5kKGRldiwgUE1TR19ISUJFUk5BVEUpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2ZfcGxhdGZvcm1fcG1fcG93ZXJvZmZfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghZHJ2KQorCQlyZXR1cm4gMDsKKworCWlmIChkcnYtPnBtKSB7CisJCWlmIChkcnYtPnBtLT5wb3dlcm9mZl9ub2lycSkKKwkJCXJldCA9IGRydi0+cG0tPnBvd2Vyb2ZmX25vaXJxKGRldik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvZl9wbGF0Zm9ybV9wbV9yZXN0b3JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWRydikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZHJ2LT5wbSkgeworCQlpZiAoZHJ2LT5wbS0+cmVzdG9yZSkKKwkJCXJldCA9IGRydi0+cG0tPnJlc3RvcmUoZGV2KTsKKwl9IGVsc2UgeworCQlyZXQgPSBvZl9wbGF0Zm9ybV9sZWdhY3lfcmVzdW1lKGRldik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvZl9wbGF0Zm9ybV9wbV9yZXN0b3JlX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWRydikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZHJ2LT5wbSkgeworCQlpZiAoZHJ2LT5wbS0+cmVzdG9yZV9ub2lycSkKKwkJCXJldCA9IGRydi0+cG0tPnJlc3RvcmVfbm9pcnEoZGV2KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisjZWxzZSAvKiAhQ09ORklHX0hJQkVSTkFUSU9OICovCisKKyNkZWZpbmUgb2ZfcGxhdGZvcm1fcG1fZnJlZXplCQlOVUxMCisjZGVmaW5lIG9mX3BsYXRmb3JtX3BtX3RoYXcJCU5VTEwKKyNkZWZpbmUgb2ZfcGxhdGZvcm1fcG1fcG93ZXJvZmYJCU5VTEwKKyNkZWZpbmUgb2ZfcGxhdGZvcm1fcG1fcmVzdG9yZQkJTlVMTAorI2RlZmluZSBvZl9wbGF0Zm9ybV9wbV9mcmVlemVfbm9pcnEJTlVMTAorI2RlZmluZSBvZl9wbGF0Zm9ybV9wbV90aGF3X25vaXJxCQlOVUxMCisjZGVmaW5lIG9mX3BsYXRmb3JtX3BtX3Bvd2Vyb2ZmX25vaXJxCU5VTEwKKyNkZWZpbmUgb2ZfcGxhdGZvcm1fcG1fcmVzdG9yZV9ub2lycQlOVUxMCisKKyNlbmRpZiAvKiAhQ09ORklHX0hJQkVSTkFUSU9OICovCisKK3N0YXRpYyBzdHJ1Y3QgZGV2X3BtX29wcyBvZl9wbGF0Zm9ybV9kZXZfcG1fb3BzID0geworCS5wcmVwYXJlID0gb2ZfcGxhdGZvcm1fcG1fcHJlcGFyZSwKKwkuY29tcGxldGUgPSBvZl9wbGF0Zm9ybV9wbV9jb21wbGV0ZSwKKwkuc3VzcGVuZCA9IG9mX3BsYXRmb3JtX3BtX3N1c3BlbmQsCisJLnJlc3VtZSA9IG9mX3BsYXRmb3JtX3BtX3Jlc3VtZSwKKwkuZnJlZXplID0gb2ZfcGxhdGZvcm1fcG1fZnJlZXplLAorCS50aGF3ID0gb2ZfcGxhdGZvcm1fcG1fdGhhdywKKwkucG93ZXJvZmYgPSBvZl9wbGF0Zm9ybV9wbV9wb3dlcm9mZiwKKwkucmVzdG9yZSA9IG9mX3BsYXRmb3JtX3BtX3Jlc3RvcmUsCisJLnN1c3BlbmRfbm9pcnEgPSBvZl9wbGF0Zm9ybV9wbV9zdXNwZW5kX25vaXJxLAorCS5yZXN1bWVfbm9pcnEgPSBvZl9wbGF0Zm9ybV9wbV9yZXN1bWVfbm9pcnEsCisJLmZyZWV6ZV9ub2lycSA9IG9mX3BsYXRmb3JtX3BtX2ZyZWV6ZV9ub2lycSwKKwkudGhhd19ub2lycSA9IG9mX3BsYXRmb3JtX3BtX3RoYXdfbm9pcnEsCisJLnBvd2Vyb2ZmX25vaXJxID0gb2ZfcGxhdGZvcm1fcG1fcG93ZXJvZmZfbm9pcnEsCisJLnJlc3RvcmVfbm9pcnEgPSBvZl9wbGF0Zm9ybV9wbV9yZXN0b3JlX25vaXJxLAorfTsKKworI2RlZmluZSBPRl9QTEFURk9STV9QTV9PUFNfUFRSCSgmb2ZfcGxhdGZvcm1fZGV2X3BtX29wcykKKworI2Vsc2UgLyogIUNPTkZJR19QTV9TTEVFUCAqLworCisjZGVmaW5lIE9GX1BMQVRGT1JNX1BNX09QU19QVFIJTlVMTAorCisjZW5kaWYgLyogIUNPTkZJR19QTV9TTEVFUCAqLworCiBpbnQgb2ZfYnVzX3R5cGVfaW5pdChzdHJ1Y3QgYnVzX3R5cGUgKmJ1cywgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlidXMtPm5hbWUgPSBuYW1lOwogCWJ1cy0+bWF0Y2ggPSBvZl9wbGF0Zm9ybV9idXNfbWF0Y2g7CiAJYnVzLT5wcm9iZSA9IG9mX3BsYXRmb3JtX2RldmljZV9wcm9iZTsKIAlidXMtPnJlbW92ZSA9IG9mX3BsYXRmb3JtX2RldmljZV9yZW1vdmU7Ci0JYnVzLT5zdXNwZW5kID0gb2ZfcGxhdGZvcm1fZGV2aWNlX3N1c3BlbmQ7Ci0JYnVzLT5yZXN1bWUgPSBvZl9wbGF0Zm9ybV9kZXZpY2VfcmVzdW1lOwogCWJ1cy0+c2h1dGRvd24gPSBvZl9wbGF0Zm9ybV9kZXZpY2Vfc2h1dGRvd247CiAJYnVzLT5kZXZfYXR0cnMgPSBvZl9wbGF0Zm9ybV9kZXZpY2VfYXR0cnM7CisJYnVzLT5wbSA9IE9GX1BMQVRGT1JNX1BNX09QU19QVFI7CiAJcmV0dXJuIGJ1c19yZWdpc3RlcihidXMpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL29wcm9maWxlL2NwdV9idWZmZXIuYyBiL2RyaXZlcnMvb3Byb2ZpbGUvY3B1X2J1ZmZlci5jCmluZGV4IGE3YWFlMjQuLjE2NmI2N2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb3Byb2ZpbGUvY3B1X2J1ZmZlci5jCisrKyBiL2RyaXZlcnMvb3Byb2ZpbGUvY3B1X2J1ZmZlci5jCkBAIC00Nyw3ICs0Nyw3IEBACiAgKi8KIHN0YXRpYyBzdHJ1Y3QgcmluZ19idWZmZXIgKm9wX3JpbmdfYnVmZmVyX3JlYWQ7CiBzdGF0aWMgc3RydWN0IHJpbmdfYnVmZmVyICpvcF9yaW5nX2J1ZmZlcl93cml0ZTsKLURFRklORV9QRVJfQ1BVKHN0cnVjdCBvcHJvZmlsZV9jcHVfYnVmZmVyLCBjcHVfYnVmZmVyKTsKK0RFRklORV9QRVJfQ1BVKHN0cnVjdCBvcHJvZmlsZV9jcHVfYnVmZmVyLCBvcF9jcHVfYnVmZmVyKTsKIAogc3RhdGljIHZvaWQgd3Ffc3luY19idWZmZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIApAQCAtNjEsOCArNjEsNyBAQAogCiB2b2lkIG9wcm9maWxlX2NwdV9idWZmZXJfaW5jX3NtcGxfbG9zdCh2b2lkKQogewotCXN0cnVjdCBvcHJvZmlsZV9jcHVfYnVmZmVyICpjcHVfYnVmCi0JCT0gJl9fZ2V0X2NwdV92YXIoY3B1X2J1ZmZlcik7CisJc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgKmNwdV9idWYgPSAmX19nZXRfY3B1X3ZhcihvcF9jcHVfYnVmZmVyKTsKIAogCWNwdV9idWYtPnNhbXBsZV9sb3N0X292ZXJmbG93Kys7CiB9CkBAIC05NSw3ICs5NCw3IEBACiAJCWdvdG8gZmFpbDsKIAogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7Ci0JCXN0cnVjdCBvcHJvZmlsZV9jcHVfYnVmZmVyICpiID0gJnBlcl9jcHUoY3B1X2J1ZmZlciwgaSk7CisJCXN0cnVjdCBvcHJvZmlsZV9jcHVfYnVmZmVyICpiID0gJnBlcl9jcHUob3BfY3B1X2J1ZmZlciwgaSk7CiAKIAkJYi0+bGFzdF90YXNrID0gTlVMTDsKIAkJYi0+bGFzdF9pc19rZXJuZWwgPSAtMTsKQEAgLTEyMiw3ICsxMjEsNyBAQAogCXdvcmtfZW5hYmxlZCA9IDE7CiAKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKLQkJc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgKmIgPSAmcGVyX2NwdShjcHVfYnVmZmVyLCBpKTsKKwkJc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgKmIgPSAmcGVyX2NwdShvcF9jcHVfYnVmZmVyLCBpKTsKIAogCQkvKgogCQkgKiBTcHJlYWQgdGhlIHdvcmsgYnkgMSBqaWZmeSBwZXIgY3B1IHNvIHRoZXkgZG9udCBhbGwKQEAgLTEzOSw3ICsxMzgsNyBAQAogCXdvcmtfZW5hYmxlZCA9IDA7CiAKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKLQkJc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgKmIgPSAmcGVyX2NwdShjcHVfYnVmZmVyLCBpKTsKKwkJc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgKmIgPSAmcGVyX2NwdShvcF9jcHVfYnVmZmVyLCBpKTsKIAogCQljYW5jZWxfZGVsYXllZF93b3JrKCZiLT53b3JrKTsKIAl9CkBAIC0zMzAsNyArMzI5LDcgQEAKIF9fb3Byb2ZpbGVfYWRkX2V4dF9zYW1wbGUodW5zaWduZWQgbG9uZyBwYywgc3RydWN0IHB0X3JlZ3MgKiBjb25zdCByZWdzLAogCQkJICB1bnNpZ25lZCBsb25nIGV2ZW50LCBpbnQgaXNfa2VybmVsKQogewotCXN0cnVjdCBvcHJvZmlsZV9jcHVfYnVmZmVyICpjcHVfYnVmID0gJl9fZ2V0X2NwdV92YXIoY3B1X2J1ZmZlcik7CisJc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgKmNwdV9idWYgPSAmX19nZXRfY3B1X3ZhcihvcF9jcHVfYnVmZmVyKTsKIAl1bnNpZ25lZCBsb25nIGJhY2t0cmFjZSA9IG9wcm9maWxlX2JhY2t0cmFjZV9kZXB0aDsKIAogCS8qCkBAIC0zNzUsNyArMzc0LDcgQEAKIHsKIAlzdHJ1Y3Qgb3Bfc2FtcGxlICpzYW1wbGU7CiAJaW50IGlzX2tlcm5lbCA9ICF1c2VyX21vZGUocmVncyk7Ci0Jc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgKmNwdV9idWYgPSAmX19nZXRfY3B1X3ZhcihjcHVfYnVmZmVyKTsKKwlzdHJ1Y3Qgb3Byb2ZpbGVfY3B1X2J1ZmZlciAqY3B1X2J1ZiA9ICZfX2dldF9jcHVfdmFyKG9wX2NwdV9idWZmZXIpOwogCiAJY3B1X2J1Zi0+c2FtcGxlX3JlY2VpdmVkKys7CiAKQEAgLTQzMCwxMyArNDI5LDEzIEBACiAKIHZvaWQgb3Byb2ZpbGVfYWRkX3BjKHVuc2lnbmVkIGxvbmcgcGMsIGludCBpc19rZXJuZWwsIHVuc2lnbmVkIGxvbmcgZXZlbnQpCiB7Ci0Jc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgKmNwdV9idWYgPSAmX19nZXRfY3B1X3ZhcihjcHVfYnVmZmVyKTsKKwlzdHJ1Y3Qgb3Byb2ZpbGVfY3B1X2J1ZmZlciAqY3B1X2J1ZiA9ICZfX2dldF9jcHVfdmFyKG9wX2NwdV9idWZmZXIpOwogCWxvZ19zYW1wbGUoY3B1X2J1ZiwgcGMsIDAsIGlzX2tlcm5lbCwgZXZlbnQpOwogfQogCiB2b2lkIG9wcm9maWxlX2FkZF90cmFjZSh1bnNpZ25lZCBsb25nIHBjKQogewotCXN0cnVjdCBvcHJvZmlsZV9jcHVfYnVmZmVyICpjcHVfYnVmID0gJl9fZ2V0X2NwdV92YXIoY3B1X2J1ZmZlcik7CisJc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgKmNwdV9idWYgPSAmX19nZXRfY3B1X3ZhcihvcF9jcHVfYnVmZmVyKTsKIAogCWlmICghY3B1X2J1Zi0+dHJhY2luZykKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vcHJvZmlsZS9jcHVfYnVmZmVyLmggYi9kcml2ZXJzL29wcm9maWxlL2NwdV9idWZmZXIuaAppbmRleCAyNzI5OTVkLi42OGVhMTZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL29wcm9maWxlL2NwdV9idWZmZXIuaAorKysgYi9kcml2ZXJzL29wcm9maWxlL2NwdV9idWZmZXIuaApAQCAtNTAsNyArNTAsNyBAQAogCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKIH07CiAKLURFQ0xBUkVfUEVSX0NQVShzdHJ1Y3Qgb3Byb2ZpbGVfY3B1X2J1ZmZlciwgY3B1X2J1ZmZlcik7CitERUNMQVJFX1BFUl9DUFUoc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIsIG9wX2NwdV9idWZmZXIpOwogCiAvKgogICogUmVzZXRzIHRoZSBjcHUgYnVmZmVyIHRvIGEgc2FuZSBzdGF0ZS4KQEAgLTYwLDcgKzYwLDcgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkIG9wX2NwdV9idWZmZXJfcmVzZXQoaW50IGNwdSkKIHsKLQlzdHJ1Y3Qgb3Byb2ZpbGVfY3B1X2J1ZmZlciAqY3B1X2J1ZiA9ICZwZXJfY3B1KGNwdV9idWZmZXIsIGNwdSk7CisJc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgKmNwdV9idWYgPSAmcGVyX2NwdShvcF9jcHVfYnVmZmVyLCBjcHUpOwogCiAJY3B1X2J1Zi0+bGFzdF9pc19rZXJuZWwgPSAtMTsKIAljcHVfYnVmLT5sYXN0X3Rhc2sgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vcHJvZmlsZS9vcHJvZmlsZV9zdGF0cy5jIGIvZHJpdmVycy9vcHJvZmlsZS9vcHJvZmlsZV9zdGF0cy5jCmluZGV4IDYxNjg5ZTguLjkxN2QyOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb3Byb2ZpbGUvb3Byb2ZpbGVfc3RhdHMuYworKysgYi9kcml2ZXJzL29wcm9maWxlL29wcm9maWxlX3N0YXRzLmMKQEAgLTIzLDcgKzIzLDcgQEAKIAlpbnQgaTsKIAogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7Ci0JCWNwdV9idWYgPSAmcGVyX2NwdShjcHVfYnVmZmVyLCBpKTsKKwkJY3B1X2J1ZiA9ICZwZXJfY3B1KG9wX2NwdV9idWZmZXIsIGkpOwogCQljcHVfYnVmLT5zYW1wbGVfcmVjZWl2ZWQgPSAwOwogCQljcHVfYnVmLT5zYW1wbGVfbG9zdF9vdmVyZmxvdyA9IDA7CiAJCWNwdV9idWYtPmJhY2t0cmFjZV9hYm9ydGVkID0gMDsKQEAgLTUxLDcgKzUxLDcgQEAKIAkJcmV0dXJuOwogCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKLQkJY3B1X2J1ZiA9ICZwZXJfY3B1KGNwdV9idWZmZXIsIGkpOworCQljcHVfYnVmID0gJnBlcl9jcHUob3BfY3B1X2J1ZmZlciwgaSk7CiAJCXNucHJpbnRmKGJ1ZiwgMTAsICJjcHUlZCIsIGkpOwogCQljcHVkaXIgPSBvcHJvZmlsZWZzX21rZGlyKHNiLCBkaXIsIGJ1Zik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL0tjb25maWcgYi9kcml2ZXJzL3BjaS9LY29uZmlnCmluZGV4IGZkYzg2NGYuLmIxZWNlZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL0tjb25maWcKKysrIGIvZHJpdmVycy9wY2kvS2NvbmZpZwpAQCAtMjcsMTAgKzI3LDEwIEBACiAJZGVmYXVsdCB5CiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBkZXByZWNhdGVkCi0JICBwY2lfZmluZF9zbG90KCkgYW5kIHBjaV9maW5kX2RldmljZSgpIEFQSXMuICBNb3N0IGRyaXZlcnMgaGF2ZQotCSAgYmVlbiBjb252ZXJ0ZWQgb3ZlciB0byB1c2luZyB0aGUgcHJvcGVyIGhvdHBsdWcgQVBJcywgc28gdGhpcwotCSAgb3B0aW9uIHNlcnZlcyB0byBpbmNsdWRlL2V4Y2x1ZGUgb25seSBhIGZldyBkcml2ZXJzIHRoYXQgYXJlCi0JICBzdGlsbCB1c2luZyB0aGlzIEFQSS4KKwkgIHBjaV9maW5kX2RldmljZSgpIEFQSS4gIE1vc3QgZHJpdmVycyBoYXZlIGJlZW4gY29udmVydGVkIG92ZXIKKwkgIHRvIHVzaW5nIHRoZSBwcm9wZXIgaG90cGx1ZyBBUElzLCBzbyB0aGlzIG9wdGlvbiBzZXJ2ZXMgdG8KKwkgIGluY2x1ZGUvZXhjbHVkZSBvbmx5IGEgZmV3IGRyaXZlcnMgdGhhdCBhcmUgc3RpbGwgdXNpbmcgdGhpcworCSAgQVBJLgogCiBjb25maWcgUENJX0RFQlVHCiAJYm9vbCAiUENJIERlYnVnZ2luZyIKQEAgLTY5LDMgKzY5LDEwIEBACiAJICBwaHlzaWNhbCByZXNvdXJjZXMuCiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBQQ0lfSU9BUElDCisJYm9vbAorCWRlcGVuZHMgb24gUENJCisJZGVwZW5kcyBvbiBBQ1BJCisJZGVwZW5kcyBvbiBIT1RQTFVHCisJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9NYWtlZmlsZSBiL2RyaXZlcnMvcGNpL01ha2VmaWxlCmluZGV4IDRhN2YxMWQuLjRkZjQ4ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGNpL01ha2VmaWxlCkBAIC0xNCw2ICsxNCw4IEBACiAjIEJ1aWxkIFBDSSBFeHByZXNzIHN0dWZmIGlmIG5lZWRlZAogb2JqLSQoQ09ORklHX1BDSUVQT1JUQlVTKSArPSBwY2llLwogCitvYmotJChDT05GSUdfUENJX0lPQVBJQykgKz0gaW9hcGljLm8KKwogb2JqLSQoQ09ORklHX0hPVFBMVUcpICs9IGhvdHBsdWcubwogCiAjIEJ1aWxkIHRoZSBQQ0kgSG90cGx1ZyBkcml2ZXJzIGlmIHdlIHdlcmUgYXNrZWQgdG8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2RtYXIuYyBiL2RyaXZlcnMvcGNpL2RtYXIuYwppbmRleCA0MTZmNmFjLi42Y2RjOTMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9kbWFyLmMKKysrIGIvZHJpdmVycy9wY2kvZG1hci5jCkBAIC0zMjAsNyArMzIwLDcgQEAKIAlmb3IgKGJ1cyA9IGRldi0+YnVzOyBidXM7IGJ1cyA9IGJ1cy0+cGFyZW50KSB7CiAJCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2UgPSBidXMtPnNlbGY7CiAKLQkJaWYgKCFicmlkZ2UgfHwgIWJyaWRnZS0+aXNfcGNpZSB8fAorCQlpZiAoIWJyaWRnZSB8fCAhcGNpX2lzX3BjaWUoYnJpZGdlKSB8fAogCQkgICAgYnJpZGdlLT5wY2llX3R5cGUgPT0gUENJX0VYUF9UWVBFX1BDSV9CUklER0UpCiAJCQlyZXR1cm4gMDsKIApAQCAtNjQ1LDggKzY0NSwxMSBAQAogCQkJICAgICAgICJ4MmFwaWMgYW5kIEludHItcmVtYXBwaW5nLlxuIik7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfRE1BUgotCQlpZiAocmV0ICYmICFub19pb21tdSAmJiAhaW9tbXVfZGV0ZWN0ZWQgJiYgIWRtYXJfZGlzYWJsZWQpCisJCWlmIChyZXQgJiYgIW5vX2lvbW11ICYmICFpb21tdV9kZXRlY3RlZCAmJiAhZG1hcl9kaXNhYmxlZCkgewogCQkJaW9tbXVfZGV0ZWN0ZWQgPSAxOworCQkJLyogTWFrZSBzdXJlIEFDUyB3aWxsIGJlIGVuYWJsZWQgKi8KKwkJCXBjaV9yZXF1ZXN0X2FjcygpOworCQl9CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfWDg2CiAJCWlmIChyZXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL01ha2VmaWxlIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9NYWtlZmlsZQppbmRleCAzNjI1YjA5Li42Y2Q5ZjNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvTWFrZWZpbGUKQEAgLTYsMTggKzYsMjIgQEAKIG9iai0kKENPTkZJR19IT1RQTFVHX1BDSV9DT01QQVEpCSs9IGNwcXBocC5vCiBvYmotJChDT05GSUdfSE9UUExVR19QQ0lfSUJNKQkJKz0gaWJtcGhwLm8KIAotIyBwY2llaHAgc2hvdWxkIGJlIGxpbmtlZCBiZWZvcmUgYWNwaXBocCBpbiBvcmRlciB0byBhbGxvdyB0aGUgbmF0aXZlIGRyaXZlcgotIyB0byBhdHRlbXB0IHRvIGJpbmQgZmlyc3QuIFdlIGNhbiB0aGVuIGZhbGwgYmFjayB0byBnZW5lcmljIHN1cHBvcnQuCisjIG5hdGl2ZSBkcml2ZXJzIHNob3VsZCBiZSBsaW5rZWQgYmVmb3JlIGFjcGlwaHAgaW4gb3JkZXIgdG8gYWxsb3cgdGhlCisjIG5hdGl2ZSBkcml2ZXIgdG8gYXR0ZW1wdCB0byBiaW5kIGZpcnN0LiBXZSBjYW4gdGhlbiBmYWxsIGJhY2sgdG8KKyMgZ2VuZXJpYyBzdXBwb3J0LgogCiBvYmotJChDT05GSUdfSE9UUExVR19QQ0lfUENJRSkJCSs9IHBjaWVocC5vCi1vYmotJChDT05GSUdfSE9UUExVR19QQ0lfQUNQSSkJCSs9IGFjcGlwaHAubwotb2JqLSQoQ09ORklHX0hPVFBMVUdfUENJX0FDUElfSUJNKQkrPSBhY3BpcGhwX2libS5vCiBvYmotJChDT05GSUdfSE9UUExVR19QQ0lfQ1BDSV9aVDU1NTApCSs9IGNwY2locF96dDU1NTAubwogb2JqLSQoQ09ORklHX0hPVFBMVUdfUENJX0NQQ0lfR0VORVJJQykJKz0gY3BjaWhwX2dlbmVyaWMubwogb2JqLSQoQ09ORklHX0hPVFBMVUdfUENJX1NIUEMpCQkrPSBzaHBjaHAubwogb2JqLSQoQ09ORklHX0hPVFBMVUdfUENJX1JQQSkJCSs9IHJwYXBocC5vCiBvYmotJChDT05GSUdfSE9UUExVR19QQ0lfUlBBX0RMUEFSKQkrPSBycGFkbHBhcl9pby5vCiBvYmotJChDT05GSUdfSE9UUExVR19QQ0lfU0dJKQkJKz0gc2dpX2hvdHBsdWcubworb2JqLSQoQ09ORklHX0hPVFBMVUdfUENJX0FDUEkpCQkrPSBhY3BpcGhwLm8KKworIyBhY3BpcGhwX2libSBleHRlbmRzIGFjcGlwaHAsIHNvIHNob3VsZCBiZSBsaW5rZWQgYWZ0ZXJ3YXJkcy4KKworb2JqLSQoQ09ORklHX0hPVFBMVUdfUENJX0FDUElfSUJNKQkrPSBhY3BpcGhwX2libS5vCiAKICMgTGluayB0aGlzIGxhc3Qgc28gaXQgZG9lc24ndCBjbGFpbSBkZXZpY2VzIHRoYXQgaGF2ZSBhIHJlYWwgaG90cGx1ZyBkcml2ZXIKIG9iai0kKENPTkZJR19IT1RQTFVHX1BDSV9GQUtFKQkJKz0gZmFrZXBocC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlfcGNpaHAuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaV9wY2locC5jCmluZGV4IDBmMzI1NzEuLjNjNzZmYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaV9wY2locC5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaV9wY2locC5jCkBAIC0zNjIsNiArMzYyLDggQEAKIAkJc3RhdHVzID0gYWNwaV9wY2lfb3NjX2NvbnRyb2xfc2V0KGhhbmRsZSwgZmxhZ3MpOwogCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCiAJCQlnb3RvIGdvdF9vbmU7CisJCWlmIChzdGF0dXMgPT0gQUVfU1VQUE9SVCkKKwkJCWdvdG8gbm9fY29udHJvbDsKIAkJa2ZyZWUoc3RyaW5nLnBvaW50ZXIpOwogCQlzdHJpbmcgPSAoc3RydWN0IGFjcGlfYnVmZmVyKXsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKIAl9CkBAIC0zOTQsMTAgKzM5Niw5IEBACiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJCWJyZWFrOwogCX0KLQorbm9fY29udHJvbDoKIAlkYmcoIkNhbm5vdCBnZXQgY29udHJvbCBvZiBob3RwbHVnIGhhcmR3YXJlIGZvciBwY2kgJXNcbiIsCiAJICAgIHBjaV9uYW1lKHBkZXYpKTsKLQogCWtmcmVlKHN0cmluZy5wb2ludGVyKTsKIAlyZXR1cm4gLUVOT0RFVjsKIGdvdF9vbmU6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHAuaCBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocC5oCmluZGV4IDdkOTM4ZGYuLmJhYjUyMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocC5oCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocC5oCkBAIC0xNDYsMTIgKzE0Niw2IEBACiAJc3RydWN0IG1vZHVsZSAqb3duZXI7CiB9OwogCi1zdHJ1Y3QgYWNwaXBocF9pb2FwaWMgewotCXN0cnVjdCBwY2lfZGV2ICpkZXY7Ci0JdTMyIGdzaV9iYXNlOwotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLX07Ci0KIC8qIFBDSSBidXMgYnJpZGdlIEhJRCAqLwogI2RlZmluZSBBQ1BJX1BDSV9IT1NUX0hJRAkJIlBOUDBBMDMiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jCmluZGV4IGRmMWIwZWEuLjhlOTUyZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYwpAQCAtNTIsOCArNTIsNiBAQAogI2luY2x1ZGUgImFjcGlwaHAuaCIKIAogc3RhdGljIExJU1RfSEVBRChicmlkZ2VfbGlzdCk7Ci1zdGF0aWMgTElTVF9IRUFEKGlvYXBpY19saXN0KTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaW9hcGljX2xpc3RfbG9jayk7CiAKICNkZWZpbmUgTVlfTkFNRSAiYWNwaXBocF9nbHVlIgogCkBAIC0zMTEsMTcgKzMwOSwxMyBAQAogLyogZmluZCBhY3BpcGhwX2Z1bmMgZnJvbSBhY3BpcGhwX2JyaWRnZSAqLwogc3RhdGljIHN0cnVjdCBhY3BpcGhwX2Z1bmMgKmFjcGlwaHBfYnJpZGdlX2hhbmRsZV90b19mdW5jdGlvbihhY3BpX2hhbmRsZSBoYW5kbGUpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbm9kZSwgKmw7CiAJc3RydWN0IGFjcGlwaHBfYnJpZGdlICpicmlkZ2U7CiAJc3RydWN0IGFjcGlwaHBfc2xvdCAqc2xvdDsKIAlzdHJ1Y3QgYWNwaXBocF9mdW5jICpmdW5jOwogCi0JbGlzdF9mb3JfZWFjaChub2RlLCAmYnJpZGdlX2xpc3QpIHsKLQkJYnJpZGdlID0gbGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgYWNwaXBocF9icmlkZ2UsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYnJpZGdlLCAmYnJpZGdlX2xpc3QsIGxpc3QpIHsKIAkJZm9yIChzbG90ID0gYnJpZGdlLT5zbG90czsgc2xvdDsgc2xvdCA9IHNsb3QtPm5leHQpIHsKLQkJCWxpc3RfZm9yX2VhY2gobCwgJnNsb3QtPmZ1bmNzKSB7Ci0JCQkJZnVuYyA9IGxpc3RfZW50cnkobCwgc3RydWN0IGFjcGlwaHBfZnVuYywKLQkJCQkJCQlzaWJsaW5nKTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoZnVuYywgJnNsb3QtPmZ1bmNzLCBzaWJsaW5nKSB7CiAJCQkJaWYgKGZ1bmMtPmhhbmRsZSA9PSBoYW5kbGUpCiAJCQkJCXJldHVybiBmdW5jOwogCQkJfQpAQCAtNDk1LDIxICs0ODksMTkgQEAKIAogc3RhdGljIHN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYWNwaXBocF9oYW5kbGVfdG9fYnJpZGdlKGFjcGlfaGFuZGxlIGhhbmRsZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkOwotCWxpc3RfZm9yX2VhY2goaGVhZCwgJmJyaWRnZV9saXN0KSB7Ci0JCXN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYnJpZGdlID0gbGlzdF9lbnRyeShoZWFkLAotCQkJCQkJc3RydWN0IGFjcGlwaHBfYnJpZGdlLCBsaXN0KTsKKwlzdHJ1Y3QgYWNwaXBocF9icmlkZ2UgKmJyaWRnZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYnJpZGdlLCAmYnJpZGdlX2xpc3QsIGxpc3QpCiAJCWlmIChicmlkZ2UtPmhhbmRsZSA9PSBoYW5kbGUpCiAJCQlyZXR1cm4gYnJpZGdlOwotCX0KIAogCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgdm9pZCBjbGVhbnVwX2JyaWRnZShzdHJ1Y3QgYWNwaXBocF9icmlkZ2UgKmJyaWRnZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCAqdG1wOwotCXN0cnVjdCBhY3BpcGhwX3Nsb3QgKnNsb3Q7CisJc3RydWN0IGFjcGlwaHBfc2xvdCAqc2xvdCwgKm5leHQ7CisJc3RydWN0IGFjcGlwaHBfZnVuYyAqZnVuYywgKnRtcDsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJYWNwaV9oYW5kbGUgaGFuZGxlID0gYnJpZGdlLT5oYW5kbGU7CiAKQEAgLTUzMCwxMCArNTIyLDggQEAKIAogCXNsb3QgPSBicmlkZ2UtPnNsb3RzOwogCXdoaWxlIChzbG90KSB7Ci0JCXN0cnVjdCBhY3BpcGhwX3Nsb3QgKm5leHQgPSBzbG90LT5uZXh0OwotCQlsaXN0X2Zvcl9lYWNoX3NhZmUgKGxpc3QsIHRtcCwgJnNsb3QtPmZ1bmNzKSB7Ci0JCQlzdHJ1Y3QgYWNwaXBocF9mdW5jICpmdW5jOwotCQkJZnVuYyA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGFjcGlwaHBfZnVuYywgc2libGluZyk7CisJCW5leHQgPSBzbG90LT5uZXh0OworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZnVuYywgdG1wLCAmc2xvdC0+ZnVuY3MsIHNpYmxpbmcpIHsKIAkJCWlmIChpc19kb2NrX2RldmljZShmdW5jLT5oYW5kbGUpKSB7CiAJCQkJdW5yZWdpc3Rlcl9ob3RwbHVnX2RvY2tfZGV2aWNlKGZ1bmMtPmhhbmRsZSk7CiAJCQkJdW5yZWdpc3Rlcl9kb2NrX25vdGlmaWVyKCZmdW5jLT5uYik7CkBAIC01NDUsNyArNTM1LDcgQEAKIAkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCQkJCWVycigiZmFpbGVkIHRvIHJlbW92ZSBub3RpZnkgaGFuZGxlclxuIik7CiAJCQl9Ci0JCQlsaXN0X2RlbChsaXN0KTsKKwkJCWxpc3RfZGVsKCZmdW5jLT5zaWJsaW5nKTsKIAkJCWtmcmVlKGZ1bmMpOwogCQl9CiAJCWFjcGlwaHBfdW5yZWdpc3Rlcl9ob3RwbHVnX3Nsb3Qoc2xvdCk7CkBAIC02MDYsMjA0ICs1OTYsMTcgQEAKIAkJCQkJICAgaGFuZGxlX2hvdHBsdWdfZXZlbnRfYnJpZGdlKTsKIH0KIAotc3RhdGljIHN0cnVjdCBwY2lfZGV2ICogZ2V0X2FwaWNfcGNpX2luZm8oYWNwaV9oYW5kbGUgaGFuZGxlKQotewotCXN0cnVjdCBwY2lfZGV2ICpkZXY7Ci0KLQlkZXYgPSBhY3BpX2dldF9wY2lfZGV2KGhhbmRsZSk7Ci0JaWYgKCFkZXYpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKChkZXYtPmNsYXNzICE9IFBDSV9DTEFTU19TWVNURU1fUElDX0lPQVBJQykgJiYKLQkgICAgKGRldi0+Y2xhc3MgIT0gUENJX0NMQVNTX1NZU1RFTV9QSUNfSU9YQVBJQykpCi0JewotCQlwY2lfZGV2X3B1dChkZXYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gZGV2OwotfQotCi1zdGF0aWMgaW50IGdldF9nc2lfYmFzZShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiAqZ3NpX2Jhc2UpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCWludCByZXN1bHQgPSAtMTsKLQl1bnNpZ25lZCBsb25nIGxvbmcgZ3NiOwotCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OwotCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7Ci0Jdm9pZCAqdGFibGU7Ci0KLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiX0dTQiIsIE5VTEwsICZnc2IpOwotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQkqZ3NpX2Jhc2UgPSAodTMyKWdzYjsKLQkJcmV0dXJuIDA7Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCAiX01BVCIsIE5VTEwsICZidWZmZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSB8fCAhYnVmZmVyLmxlbmd0aCB8fCAhYnVmZmVyLnBvaW50ZXIpCi0JCXJldHVybiAtMTsKLQotCW9iaiA9IGJ1ZmZlci5wb2ludGVyOwotCWlmIChvYmotPnR5cGUgIT0gQUNQSV9UWVBFX0JVRkZFUikKLQkJZ290byBvdXQ7Ci0KLQl0YWJsZSA9IG9iai0+YnVmZmVyLnBvaW50ZXI7Ci0Jc3dpdGNoICgoKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqKXRhYmxlKS0+dHlwZSkgewotCWNhc2UgQUNQSV9NQURUX1RZUEVfSU9fU0FQSUM6Ci0JCSpnc2lfYmFzZSA9ICgoc3RydWN0IGFjcGlfbWFkdF9pb19zYXBpYyAqKXRhYmxlKS0+Z2xvYmFsX2lycV9iYXNlOwotCQlyZXN1bHQgPSAwOwotCQlicmVhazsKLQljYXNlIEFDUElfTUFEVF9UWVBFX0lPX0FQSUM6Ci0JCSpnc2lfYmFzZSA9ICgoc3RydWN0IGFjcGlfbWFkdF9pb19hcGljICopdGFibGUpLT5nbG9iYWxfaXJxX2Jhc2U7Ci0JCXJlc3VsdCA9IDA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLSBvdXQ6Ci0Ja2ZyZWUoYnVmZmVyLnBvaW50ZXIpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cwotaW9hcGljX2FkZChhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBsdmwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipydikKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdW5zaWduZWQgbG9uZyBsb25nIHN0YTsKLQlhY3BpX2hhbmRsZSB0bXA7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXY7Ci0JdTMyIGdzaV9iYXNlOwotCXU2NCBwaHlzX2FkZHI7Ci0Jc3RydWN0IGFjcGlwaHBfaW9hcGljICppb2FwaWM7Ci0KLQkvKiBFdmFsdWF0ZSBfU1RBIGlmIHByZXNlbnQgKi8KLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiX1NUQSIsIE5VTEwsICZzdGEpOwotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSAmJiBzdGEgIT0gQUNQSV9TVEFfQUxMKQotCQlyZXR1cm4gQUVfQ1RSTF9ERVBUSDsKLQotCS8qIFNjYW4gb25seSBQQ0kgYnVzIHNjb3BlICovCi0Jc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGhhbmRsZSwgIl9ISUQiLCAmdG1wKTsKLQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCi0JCXJldHVybiBBRV9DVFJMX0RFUFRIOwotCi0JaWYgKGdldF9nc2lfYmFzZShoYW5kbGUsICZnc2lfYmFzZSkpCi0JCXJldHVybiBBRV9PSzsKLQotCWlvYXBpYyA9IGttYWxsb2Moc2l6ZW9mKCppb2FwaWMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWlvYXBpYykKLQkJcmV0dXJuIEFFX05PX01FTU9SWTsKLQotCXBkZXYgPSBnZXRfYXBpY19wY2lfaW5mbyhoYW5kbGUpOwotCWlmICghcGRldikKLQkJZ290byBleGl0X2tmcmVlOwotCi0JaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQotCQlnb3RvIGV4aXRfcGNpX2Rldl9wdXQ7Ci0KLQlwY2lfc2V0X21hc3RlcihwZGV2KTsKLQotCWlmIChwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgMCwgIkkvTyBBUElDKGFjcGlwaHApIikpCi0JCWdvdG8gZXhpdF9wY2lfZGlzYWJsZV9kZXZpY2U7Ci0KLQlwaHlzX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7Ci0JaWYgKGFjcGlfcmVnaXN0ZXJfaW9hcGljKGhhbmRsZSwgcGh5c19hZGRyLCBnc2lfYmFzZSkpCi0JCWdvdG8gZXhpdF9wY2lfcmVsZWFzZV9yZWdpb247Ci0KLQlpb2FwaWMtPmdzaV9iYXNlID0gZ3NpX2Jhc2U7Ci0JaW9hcGljLT5kZXYgPSBwZGV2OwotCXNwaW5fbG9jaygmaW9hcGljX2xpc3RfbG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgmaW9hcGljLT5saXN0LCAmaW9hcGljX2xpc3QpOwotCXNwaW5fdW5sb2NrKCZpb2FwaWNfbGlzdF9sb2NrKTsKLQotCXJldHVybiBBRV9PSzsKLQotIGV4aXRfcGNpX3JlbGVhc2VfcmVnaW9uOgotCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAwKTsKLSBleGl0X3BjaV9kaXNhYmxlX2RldmljZToKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0gZXhpdF9wY2lfZGV2X3B1dDoKLQlwY2lfZGV2X3B1dChwZGV2KTsKLSBleGl0X2tmcmVlOgotCWtmcmVlKGlvYXBpYyk7Ci0KLQlyZXR1cm4gQUVfT0s7Ci19Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cwotaW9hcGljX3JlbW92ZShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBsdmwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipydikKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdW5zaWduZWQgbG9uZyBsb25nIHN0YTsKLQlhY3BpX2hhbmRsZSB0bXA7Ci0JdTMyIGdzaV9iYXNlOwotCXN0cnVjdCBhY3BpcGhwX2lvYXBpYyAqcG9zLCAqbiwgKmlvYXBpYyA9IE5VTEw7Ci0KLQkvKiBFdmFsdWF0ZSBfU1RBIGlmIHByZXNlbnQgKi8KLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiX1NUQSIsIE5VTEwsICZzdGEpOwotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSAmJiBzdGEgIT0gQUNQSV9TVEFfQUxMKQotCQlyZXR1cm4gQUVfQ1RSTF9ERVBUSDsKLQotCS8qIFNjYW4gb25seSBQQ0kgYnVzIHNjb3BlICovCi0Jc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGhhbmRsZSwgIl9ISUQiLCAmdG1wKTsKLQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCi0JCXJldHVybiBBRV9DVFJMX0RFUFRIOwotCi0JaWYgKGdldF9nc2lfYmFzZShoYW5kbGUsICZnc2lfYmFzZSkpCi0JCXJldHVybiBBRV9PSzsKLQotCWFjcGlfdW5yZWdpc3Rlcl9pb2FwaWMoaGFuZGxlLCBnc2lfYmFzZSk7Ci0KLQlzcGluX2xvY2soJmlvYXBpY19saXN0X2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3MsIG4sICZpb2FwaWNfbGlzdCwgbGlzdCkgewotCQlpZiAocG9zLT5nc2lfYmFzZSAhPSBnc2lfYmFzZSkKLQkJCWNvbnRpbnVlOwotCQlpb2FwaWMgPSBwb3M7Ci0JCWxpc3RfZGVsKCZpb2FwaWMtPmxpc3QpOwotCQlicmVhazsKLQl9Ci0Jc3Bpbl91bmxvY2soJmlvYXBpY19saXN0X2xvY2spOwotCi0JaWYgKCFpb2FwaWMpCi0JCXJldHVybiBBRV9PSzsKLQotCXBjaV9yZWxlYXNlX3JlZ2lvbihpb2FwaWMtPmRldiwgMCk7Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKGlvYXBpYy0+ZGV2KTsKLQlwY2lfZGV2X3B1dChpb2FwaWMtPmRldik7Ci0Ja2ZyZWUoaW9hcGljKTsKLQotCXJldHVybiBBRV9PSzsKLX0KLQotc3RhdGljIGludCBhY3BpcGhwX2NvbmZpZ3VyZV9pb2FwaWNzKGFjcGlfaGFuZGxlIGhhbmRsZSkKLXsKLQlpb2FwaWNfYWRkKGhhbmRsZSwgMCwgTlVMTCwgTlVMTCk7Ci0JYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBoYW5kbGUsCi0JCQkgICAgQUNQSV9VSU5UMzJfTUFYLCBpb2FwaWNfYWRkLCBOVUxMLCBOVUxMLCBOVUxMKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhY3BpcGhwX3VuY29uZmlndXJlX2lvYXBpY3MoYWNwaV9oYW5kbGUgaGFuZGxlKQotewotCWlvYXBpY19yZW1vdmUoaGFuZGxlLCAwLCBOVUxMLCBOVUxMKTsKLQlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIGhhbmRsZSwKLQkJCSAgICBBQ1BJX1VJTlQzMl9NQVgsIGlvYXBpY19yZW1vdmUsIE5VTEwsIE5VTEwsIE5VTEwpOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IHBvd2VyX29uX3Nsb3Qoc3RydWN0IGFjcGlwaHBfc2xvdCAqc2xvdCkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IGFjcGlwaHBfZnVuYyAqZnVuYzsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsOwogCWludCByZXR2YWwgPSAwOwogCiAJLyogaWYgYWxyZWFkeSBlbmFibGVkLCBqdXN0IHNraXAgKi8KIAlpZiAoc2xvdC0+ZmxhZ3MgJiBTTE9UX1BPV0VSRURPTikKIAkJZ290byBlcnJfZXhpdDsKIAotCWxpc3RfZm9yX2VhY2ggKGwsICZzbG90LT5mdW5jcykgewotCQlmdW5jID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgYWNwaXBocF9mdW5jLCBzaWJsaW5nKTsKLQorCWxpc3RfZm9yX2VhY2hfZW50cnkoZnVuYywgJnNsb3QtPmZ1bmNzLCBzaWJsaW5nKSB7CiAJCWlmIChmdW5jLT5mbGFncyAmIEZVTkNfSEFTX1BTMCkgewogCQkJZGJnKCIlczogZXhlY3V0aW5nIF9QUzBcbiIsIF9fZnVuY19fKTsKIAkJCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGZ1bmMtPmhhbmRsZSwgIl9QUzAiLCBOVUxMLCBOVUxMKTsKQEAgLTgyOSw3ICs2MzIsNiBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlzdHJ1Y3QgYWNwaXBocF9mdW5jICpmdW5jOwotCXN0cnVjdCBsaXN0X2hlYWQgKmw7CiAKIAlpbnQgcmV0dmFsID0gMDsKIApAQCAtODM3LDkgKzYzOSw3IEBACiAJaWYgKChzbG90LT5mbGFncyAmIFNMT1RfUE9XRVJFRE9OKSA9PSAwKQogCQlnb3RvIGVycl9leGl0OwogCi0JbGlzdF9mb3JfZWFjaCAobCwgJnNsb3QtPmZ1bmNzKSB7Ci0JCWZ1bmMgPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCBhY3BpcGhwX2Z1bmMsIHNpYmxpbmcpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmdW5jLCAmc2xvdC0+ZnVuY3MsIHNpYmxpbmcpIHsKIAkJaWYgKGZ1bmMtPmZsYWdzICYgRlVOQ19IQVNfUFMzKSB7CiAJCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChmdW5jLT5oYW5kbGUsICJfUFMzIiwgTlVMTCwgTlVMTCk7CiAJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKQEAgLTk2Niw3ICs3NjYsNiBAQAogewogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiAJc3RydWN0IHBjaV9idXMgKmJ1cyA9IHNsb3QtPmJyaWRnZS0+cGNpX2J1czsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsOwogCXN0cnVjdCBhY3BpcGhwX2Z1bmMgKmZ1bmM7CiAJaW50IHJldHZhbCA9IDA7CiAJaW50IG51bSwgbWF4LCBwYXNzOwpAQCAtMTAwNiwyMSArODA1LDE2IEBACiAJCX0KIAl9CiAKLQlsaXN0X2Zvcl9lYWNoIChsLCAmc2xvdC0+ZnVuY3MpIHsKLQkJZnVuYyA9IGxpc3RfZW50cnkobCwgc3RydWN0IGFjcGlwaHBfZnVuYywgc2libGluZyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShmdW5jLCAmc2xvdC0+ZnVuY3MsIHNpYmxpbmcpCiAJCWFjcGlwaHBfYnVzX2FkZChmdW5jKTsKLQl9CiAKIAlwY2lfYnVzX2Fzc2lnbl9yZXNvdXJjZXMoYnVzKTsKIAlhY3BpcGhwX3Nhbml0aXplX2J1cyhidXMpOwogCWFjcGlwaHBfc2V0X2hwcF92YWx1ZXMoYnVzKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZ1bmMsICZzbG90LT5mdW5jcywgc2libGluZykKLQkJYWNwaXBocF9jb25maWd1cmVfaW9hcGljcyhmdW5jLT5oYW5kbGUpOwogCXBjaV9lbmFibGVfYnJpZGdlcyhidXMpOwogCXBjaV9idXNfYWRkX2RldmljZXMoYnVzKTsKIAotCWxpc3RfZm9yX2VhY2ggKGwsICZzbG90LT5mdW5jcykgewotCQlmdW5jID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgYWNwaXBocF9mdW5jLCBzaWJsaW5nKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZ1bmMsICZzbG90LT5mdW5jcywgc2libGluZykgewogCQlkZXYgPSBwY2lfZ2V0X3Nsb3QoYnVzLCBQQ0lfREVWRk4oc2xvdC0+ZGV2aWNlLAogCQkJCQkJICBmdW5jLT5mdW5jdGlvbikpOwogCQlpZiAoIWRldikKQEAgLTEwOTEsNyArODg1LDYgQEAKIAl9CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZ1bmMsICZzbG90LT5mdW5jcywgc2libGluZykgewotCQlhY3BpcGhwX3VuY29uZmlndXJlX2lvYXBpY3MoZnVuYy0+aGFuZGxlKTsKIAkJYWNwaXBocF9idXNfdHJpbShmdW5jLT5oYW5kbGUpOwogCX0KIApAQCAtMTExOSwxMiArOTEyLDkgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJdW5zaWduZWQgbG9uZyBsb25nIHN0YSA9IDA7CiAJdTMyIGR2aWQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbDsKIAlzdHJ1Y3QgYWNwaXBocF9mdW5jICpmdW5jOwogCi0JbGlzdF9mb3JfZWFjaCAobCwgJnNsb3QtPmZ1bmNzKSB7Ci0JCWZ1bmMgPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCBhY3BpcGhwX2Z1bmMsIHNpYmxpbmcpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmdW5jLCAmc2xvdC0+ZnVuY3MsIHNpYmxpbmcpIHsKIAkJaWYgKGZ1bmMtPmZsYWdzICYgRlVOQ19IQVNfU1RBKSB7CiAJCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoZnVuYy0+aGFuZGxlLCAiX1NUQSIsIE5VTEwsICZzdGEpOwogCQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpICYmIHN0YSkKQEAgLTExNTIsMTMgKzk0MiwxMCBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlzdHJ1Y3QgYWNwaXBocF9mdW5jICpmdW5jOwotCXN0cnVjdCBsaXN0X2hlYWQgKmw7CiAJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgYXJnX2xpc3Q7CiAJdW5pb24gYWNwaV9vYmplY3QgYXJnOwogCi0JbGlzdF9mb3JfZWFjaCAobCwgJnNsb3QtPmZ1bmNzKSB7Ci0JCWZ1bmMgPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCBhY3BpcGhwX2Z1bmMsIHNpYmxpbmcpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmdW5jLCAmc2xvdC0+ZnVuY3MsIHNpYmxpbmcpIHsKIAkJLyogV2UgZG9uJ3Qgd2FudCB0byBjYWxsIF9FSjAgb24gbm9uLWV4aXN0aW5nIGZ1bmN0aW9ucy4gKi8KIAkJaWYgKChmdW5jLT5mbGFncyAmIEZVTkNfSEFTX0VKMCkpIHsKIAkJCS8qIF9FSjAgbWV0aG9kIHRha2Ugb25lIGFyZ3VtZW50ICovCkBAIC0xMjc1LDcgKzEwNjIsNiBAQAogCWFjcGlwaHBfc2FuaXRpemVfYnVzKGJ1cyk7CiAJYWNwaXBocF9zZXRfaHBwX3ZhbHVlcyhidXMpOwogCXBjaV9lbmFibGVfYnJpZGdlcyhidXMpOwotCWFjcGlwaHBfY29uZmlndXJlX2lvYXBpY3MoaGFuZGxlKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU0Miw3ICsxMzI4LDcgQEAKIAlzdHJ1Y3QgYWNwaXBocF9icmlkZ2UgKmJyaWRnZTsKIAlpbnQgbnVtX3Nsb3RzID0gMDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkgKGJyaWRnZSwgJmJyaWRnZV9saXN0LCBsaXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShicmlkZ2UsICZicmlkZ2VfbGlzdCwgbGlzdCkgewogCQlkYmcoIkJ1cyAlMDR4OiUwMnggaGFzICVkIHNsb3Qlc1xuIiwKIAkJCQlwY2lfZG9tYWluX25yKGJyaWRnZS0+cGNpX2J1cyksCiAJCQkJYnJpZGdlLT5wY2lfYnVzLT5udW1iZXIsIGJyaWRnZS0+bnJfc2xvdHMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2libXBocF9ocGMuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvaWJtcGhwX2hwYy5jCmluZGV4IDgzZjMzN2MuLmM3MDg0ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvaWJtcGhwX2hwYy5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvaWJtcGhwX2hwYy5jCkBAIC04OTAsNyArODkwLDcgQEAKIAkJCW1zbGVlcChQT0xMX0lOVEVSVkFMX1NFQyAqIDEwMDApOwogCiAJCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQotCQkJCWJyZWFrOworCQkJCWdvdG8gb3V0X3NsZWVwOwogCQkJCiAJCQlkb3duICgmc2VtT3BlcmF0aW9ucyk7CiAJCQkKQEAgLTkwNCw2ICs5MDQsNyBAQAogCQkvKiBnaXZlIHVwIHRoZSBoYXJkd2FyZSBzZW1hcGhvcmUgKi8KIAkJdXAgKCZzZW1PcGVyYXRpb25zKTsKIAkJLyogc2xlZXAgZm9yIGEgc2hvcnQgdGltZSBqdXN0IGZvciBnb29kIG1lYXN1cmUgKi8KK291dF9zbGVlcDoKIAkJbXNsZWVwKDEwMCk7CiAJfQogCXVwICgmc2VtX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2lfaG90cGx1Z19jb3JlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaV9ob3RwbHVnX2NvcmUuYwppbmRleCAwMzI1ZDk4Li4zODE4M2E1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaV9ob3RwbHVnX2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaV9ob3RwbHVnX2NvcmUuYwpAQCAtNjgsMjYgKzY4LDI2IEBACiBzdGF0aWMgY2hhciAqcGNpX2J1c19zcGVlZF9zdHJpbmdzW10gPSB7CiAJIjMzIE1IeiBQQ0kiLAkJLyogMHgwMCAqLwogCSI2NiBNSHogUENJIiwJCS8qIDB4MDEgKi8KLQkiNjYgTUh6IFBDSVgiLCAJCS8qIDB4MDIgKi8KLQkiMTAwIE1IeiBQQ0lYIiwJCS8qIDB4MDMgKi8KLQkiMTMzIE1IeiBQQ0lYIiwJCS8qIDB4MDQgKi8KKwkiNjYgTUh6IFBDSS1YIiwJCS8qIDB4MDIgKi8KKwkiMTAwIE1IeiBQQ0ktWCIsCS8qIDB4MDMgKi8KKwkiMTMzIE1IeiBQQ0ktWCIsCS8qIDB4MDQgKi8KIAlOVUxMLAkJCS8qIDB4MDUgKi8KIAlOVUxMLAkJCS8qIDB4MDYgKi8KIAlOVUxMLAkJCS8qIDB4MDcgKi8KIAlOVUxMLAkJCS8qIDB4MDggKi8KLQkiNjYgTUh6IFBDSVggMjY2IiwJLyogMHgwOSAqLwotCSIxMDAgTUh6IFBDSVggMjY2IiwJLyogMHgwYSAqLwotCSIxMzMgTUh6IFBDSVggMjY2IiwJLyogMHgwYiAqLworCSI2NiBNSHogUENJLVggMjY2IiwJLyogMHgwOSAqLworCSIxMDAgTUh6IFBDSS1YIDI2NiIsCS8qIDB4MGEgKi8KKwkiMTMzIE1IeiBQQ0ktWCAyNjYiLAkvKiAweDBiICovCiAJTlVMTCwJCQkvKiAweDBjICovCiAJTlVMTCwJCQkvKiAweDBkICovCiAJTlVMTCwJCQkvKiAweDBlICovCiAJTlVMTCwJCQkvKiAweDBmICovCiAJTlVMTCwJCQkvKiAweDEwICovCi0JIjY2IE1IeiBQQ0lYIDUzMyIsCS8qIDB4MTEgKi8KLQkiMTAwIE1IeiBQQ0lYIDUzMyIsCS8qIDB4MTIgKi8KLQkiMTMzIE1IeiBQQ0lYIDUzMyIsCS8qIDB4MTMgKi8KLQkiMi41IEdUL3MgUENJLUUiLAkvKiAweDE0ICovCi0JIjUuMCBHVC9zIFBDSS1FIiwJLyogMHgxNSAqLworCSI2NiBNSHogUENJLVggNTMzIiwJLyogMHgxMSAqLworCSIxMDAgTUh6IFBDSS1YIDUzMyIsCS8qIDB4MTIgKi8KKwkiMTMzIE1IeiBQQ0ktWCA1MzMiLAkvKiAweDEzICovCisJIjIuNSBHVC9zIFBDSWUiLAkvKiAweDE0ICovCisJIjUuMCBHVC9zIFBDSWUiLAkvKiAweDE1ICovCiB9OwogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfUENJX0NQQ0kKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwLmggYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocC5oCmluZGV4IDMwNzBmNzcuLjRlZDc2YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwLmgKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHAuaApAQCAtOTEsNyArOTEsNiBAQAogCXN0cnVjdCBzbG90ICpzbG90OwogCXdhaXRfcXVldWVfaGVhZF90IHF1ZXVlOwkvKiBzbGVlcCAmIHdha2UgcHJvY2VzcyAqLwogCXUzMiBzbG90X2NhcDsKLQl1OCBjYXBfYmFzZTsKIAlzdHJ1Y3QgdGltZXJfbGlzdCBwb2xsX3RpbWVyOwogCXVuc2lnbmVkIGludCBjbWRfYnVzeToxOwogCXVuc2lnbmVkIGludCBub19jbWRfY29tcGxldGU6MTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2FjcGkuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2FjcGkuYwppbmRleCAzN2M4ZDNkLi5iMDliMDgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9hY3BpLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfYWNwaS5jCkBAIC04Nyw3ICs4Nyw4IEBACiAJLyogTm90ZTogcGNpZWhwX2RldGVjdF9tb2RlICE9IFBDSUVIUF9ERVRFQ1RfQUNQSSBoZXJlICovCiAJaWYgKHBjaWVocF9nZXRfaHBfaHdfY29udHJvbF9mcm9tX2Zpcm13YXJlKHBkZXYpKQogCQlyZXR1cm4gLUVOT0RFVjsKLQlpZiAoIShwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfRVhQKSkpCisJcG9zID0gcGNpX3BjaWVfY2FwKHBkZXYpOworCWlmICghcG9zKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgcG9zICsgUENJX0VYUF9TTFRDQVAsICZzbG90X2NhcCk7CiAJc2xvdCA9IGt6YWxsb2Moc2l6ZW9mKCpzbG90KSwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jb3JlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jb3JlLmMKaW5kZXggYmMyMzQ3MS4uNTY3NGIyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2NvcmUuYwpAQCAtNzIsMTggKzcyLDYgQEAKIHN0YXRpYyBpbnQgZ2V0X21heF9idXNfc3BlZWQJKHN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QsIGVudW0gcGNpX2J1c19zcGVlZCAqdmFsdWUpOwogc3RhdGljIGludCBnZXRfY3VyX2J1c19zcGVlZAkoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCwgZW51bSBwY2lfYnVzX3NwZWVkICp2YWx1ZSk7CiAKLXN0YXRpYyBzdHJ1Y3QgaG90cGx1Z19zbG90X29wcyBwY2llaHBfaG90cGx1Z19zbG90X29wcyA9IHsKLQkuc2V0X2F0dGVudGlvbl9zdGF0dXMgPQlzZXRfYXR0ZW50aW9uX3N0YXR1cywKLQkuZW5hYmxlX3Nsb3QgPQkJZW5hYmxlX3Nsb3QsCi0JLmRpc2FibGVfc2xvdCA9CQlkaXNhYmxlX3Nsb3QsCi0JLmdldF9wb3dlcl9zdGF0dXMgPQlnZXRfcG93ZXJfc3RhdHVzLAotCS5nZXRfYXR0ZW50aW9uX3N0YXR1cyA9CWdldF9hdHRlbnRpb25fc3RhdHVzLAotCS5nZXRfbGF0Y2hfc3RhdHVzID0JZ2V0X2xhdGNoX3N0YXR1cywKLQkuZ2V0X2FkYXB0ZXJfc3RhdHVzID0JZ2V0X2FkYXB0ZXJfc3RhdHVzLAotICAJLmdldF9tYXhfYnVzX3NwZWVkID0JZ2V0X21heF9idXNfc3BlZWQsCi0gIAkuZ2V0X2N1cl9idXNfc3BlZWQgPQlnZXRfY3VyX2J1c19zcGVlZCwKLX07Ci0KIC8qKgogICogcmVsZWFzZV9zbG90IC0gZnJlZSB1cCB0aGUgbWVtb3J5IHVzZWQgYnkgYSBzbG90CiAgKiBAaG90cGx1Z19zbG90OiBzbG90IHRvIGZyZWUKQEAgLTk1LDYgKzgzLDcgQEAKIAljdHJsX2RiZyhzbG90LT5jdHJsLCAiJXM6IHBoeXNpY2FsX3Nsb3QgPSAlc1xuIiwKIAkJIF9fZnVuY19fLCBob3RwbHVnX3Nsb3RfbmFtZShob3RwbHVnX3Nsb3QpKTsKIAorCWtmcmVlKGhvdHBsdWdfc2xvdC0+b3BzKTsKIAlrZnJlZShob3RwbHVnX3Nsb3QtPmluZm8pOwogCWtmcmVlKGhvdHBsdWdfc2xvdCk7CiB9CkBAIC0xMDQsNiArOTMsNyBAQAogCXN0cnVjdCBzbG90ICpzbG90ID0gY3RybC0+c2xvdDsKIAlzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnID0gTlVMTDsKIAlzdHJ1Y3QgaG90cGx1Z19zbG90X2luZm8gKmluZm8gPSBOVUxMOworCXN0cnVjdCBob3RwbHVnX3Nsb3Rfb3BzICpvcHMgPSBOVUxMOwogCWNoYXIgbmFtZVtTTE9UX05BTUVfU0laRV07CiAJaW50IHJldHZhbCA9IC1FTk9NRU07CiAKQEAgLTExNSwxMSArMTA1LDI4IEBACiAJaWYgKCFpbmZvKQogCQlnb3RvIG91dDsKIAorCS8qIFNldHVwIGhvdHBsdWcgc2xvdCBvcHMgKi8KKwlvcHMgPSBremFsbG9jKHNpemVvZigqb3BzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvcHMpCisJCWdvdG8gb3V0OworCW9wcy0+ZW5hYmxlX3Nsb3QgPSBlbmFibGVfc2xvdDsKKwlvcHMtPmRpc2FibGVfc2xvdCA9IGRpc2FibGVfc2xvdDsKKwlvcHMtPmdldF9wb3dlcl9zdGF0dXMgPSBnZXRfcG93ZXJfc3RhdHVzOworCW9wcy0+Z2V0X2FkYXB0ZXJfc3RhdHVzID0gZ2V0X2FkYXB0ZXJfc3RhdHVzOworCW9wcy0+Z2V0X21heF9idXNfc3BlZWQgPSBnZXRfbWF4X2J1c19zcGVlZDsKKwlvcHMtPmdldF9jdXJfYnVzX3NwZWVkID0gZ2V0X2N1cl9idXNfc3BlZWQ7CisJaWYgKE1STF9TRU5TKGN0cmwpKQorCQlvcHMtPmdldF9sYXRjaF9zdGF0dXMgPSBnZXRfbGF0Y2hfc3RhdHVzOworCWlmIChBVFROX0xFRChjdHJsKSkgeworCQlvcHMtPmdldF9hdHRlbnRpb25fc3RhdHVzID0gZ2V0X2F0dGVudGlvbl9zdGF0dXM7CisJCW9wcy0+c2V0X2F0dGVudGlvbl9zdGF0dXMgPSBzZXRfYXR0ZW50aW9uX3N0YXR1czsKKwl9CisKIAkvKiByZWdpc3RlciB0aGlzIHNsb3Qgd2l0aCB0aGUgaG90cGx1ZyBwY2kgY29yZSAqLwogCWhvdHBsdWctPmluZm8gPSBpbmZvOwogCWhvdHBsdWctPnByaXZhdGUgPSBzbG90OwogCWhvdHBsdWctPnJlbGVhc2UgPSAmcmVsZWFzZV9zbG90OwotCWhvdHBsdWctPm9wcyA9ICZwY2llaHBfaG90cGx1Z19zbG90X29wczsKKwlob3RwbHVnLT5vcHMgPSBvcHM7CiAJc2xvdC0+aG90cGx1Z19zbG90ID0gaG90cGx1ZzsKIAlzbnByaW50ZihuYW1lLCBTTE9UX05BTUVfU0laRSwgIiV1IiwgUFNOKGN0cmwpKTsKIApAQCAtMTI4LDE3ICsxMzUsMTIgQEAKIAkJIGN0cmwtPnBjaWUtPnBvcnQtPnN1Ym9yZGluYXRlLT5udW1iZXIsIFBTTihjdHJsKSk7CiAJcmV0dmFsID0gcGNpX2hwX3JlZ2lzdGVyKGhvdHBsdWcsCiAJCQkJIGN0cmwtPnBjaWUtPnBvcnQtPnN1Ym9yZGluYXRlLCAwLCBuYW1lKTsKLQlpZiAocmV0dmFsKSB7CisJaWYgKHJldHZhbCkKIAkJY3RybF9lcnIoY3RybCwKIAkJCSAicGNpX2hwX3JlZ2lzdGVyIGZhaWxlZCB3aXRoIGVycm9yICVkXG4iLCByZXR2YWwpOwotCQlnb3RvIG91dDsKLQl9Ci0JZ2V0X3Bvd2VyX3N0YXR1cyhob3RwbHVnLCAmaW5mby0+cG93ZXJfc3RhdHVzKTsKLQlnZXRfYXR0ZW50aW9uX3N0YXR1cyhob3RwbHVnLCAmaW5mby0+YXR0ZW50aW9uX3N0YXR1cyk7Ci0JZ2V0X2xhdGNoX3N0YXR1cyhob3RwbHVnLCAmaW5mby0+bGF0Y2hfc3RhdHVzKTsKLQlnZXRfYWRhcHRlcl9zdGF0dXMoaG90cGx1ZywgJmluZm8tPmFkYXB0ZXJfc3RhdHVzKTsKIG91dDoKIAlpZiAocmV0dmFsKSB7CisJCWtmcmVlKG9wcyk7CiAJCWtmcmVlKGluZm8pOwogCQlrZnJlZShob3RwbHVnKTsKIAl9CkBAIC0xNjAsMTIgKzE2Miw3IEBACiAJY3RybF9kYmcoc2xvdC0+Y3RybCwgIiVzOiBwaHlzaWNhbF9zbG90ID0gJXNcbiIsCiAJCSAgX19mdW5jX18sIHNsb3RfbmFtZShzbG90KSk7CiAKLQlob3RwbHVnX3Nsb3QtPmluZm8tPmF0dGVudGlvbl9zdGF0dXMgPSBzdGF0dXM7Ci0KLQlpZiAoQVRUTl9MRUQoc2xvdC0+Y3RybCkpCi0JCXBjaWVocF9zZXRfYXR0ZW50aW9uX3N0YXR1cyhzbG90LCBzdGF0dXMpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHBjaWVocF9zZXRfYXR0ZW50aW9uX3N0YXR1cyhzbG90LCBzdGF0dXMpOwogfQogCiAKQEAgLTE5Myw5MiArMTkwLDYyIEBACiBzdGF0aWMgaW50IGdldF9wb3dlcl9zdGF0dXMoc3RydWN0IGhvdHBsdWdfc2xvdCAqaG90cGx1Z19zbG90LCB1OCAqdmFsdWUpCiB7CiAJc3RydWN0IHNsb3QgKnNsb3QgPSBob3RwbHVnX3Nsb3QtPnByaXZhdGU7Ci0JaW50IHJldHZhbDsKIAogCWN0cmxfZGJnKHNsb3QtPmN0cmwsICIlczogcGh5c2ljYWxfc2xvdCA9ICVzXG4iLAogCQkgIF9fZnVuY19fLCBzbG90X25hbWUoc2xvdCkpOwogCi0JcmV0dmFsID0gcGNpZWhwX2dldF9wb3dlcl9zdGF0dXMoc2xvdCwgdmFsdWUpOwotCWlmIChyZXR2YWwgPCAwKQotCQkqdmFsdWUgPSBob3RwbHVnX3Nsb3QtPmluZm8tPnBvd2VyX3N0YXR1czsKLQotCXJldHVybiAwOworCXJldHVybiBwY2llaHBfZ2V0X3Bvd2VyX3N0YXR1cyhzbG90LCB2YWx1ZSk7CiB9CiAKIHN0YXRpYyBpbnQgZ2V0X2F0dGVudGlvbl9zdGF0dXMoc3RydWN0IGhvdHBsdWdfc2xvdCAqaG90cGx1Z19zbG90LCB1OCAqdmFsdWUpCiB7CiAJc3RydWN0IHNsb3QgKnNsb3QgPSBob3RwbHVnX3Nsb3QtPnByaXZhdGU7Ci0JaW50IHJldHZhbDsKIAogCWN0cmxfZGJnKHNsb3QtPmN0cmwsICIlczogcGh5c2ljYWxfc2xvdCA9ICVzXG4iLAogCQkgIF9fZnVuY19fLCBzbG90X25hbWUoc2xvdCkpOwogCi0JcmV0dmFsID0gcGNpZWhwX2dldF9hdHRlbnRpb25fc3RhdHVzKHNsb3QsIHZhbHVlKTsKLQlpZiAocmV0dmFsIDwgMCkKLQkJKnZhbHVlID0gaG90cGx1Z19zbG90LT5pbmZvLT5hdHRlbnRpb25fc3RhdHVzOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHBjaWVocF9nZXRfYXR0ZW50aW9uX3N0YXR1cyhzbG90LCB2YWx1ZSk7CiB9CiAKIHN0YXRpYyBpbnQgZ2V0X2xhdGNoX3N0YXR1cyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnX3Nsb3QsIHU4ICp2YWx1ZSkKIHsKIAlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IGhvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKLQlpbnQgcmV0dmFsOwogCiAJY3RybF9kYmcoc2xvdC0+Y3RybCwgIiVzOiBwaHlzaWNhbF9zbG90ID0gJXNcbiIsCiAJCSBfX2Z1bmNfXywgc2xvdF9uYW1lKHNsb3QpKTsKIAotCXJldHZhbCA9IHBjaWVocF9nZXRfbGF0Y2hfc3RhdHVzKHNsb3QsIHZhbHVlKTsKLQlpZiAocmV0dmFsIDwgMCkKLQkJKnZhbHVlID0gaG90cGx1Z19zbG90LT5pbmZvLT5sYXRjaF9zdGF0dXM7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gcGNpZWhwX2dldF9sYXRjaF9zdGF0dXMoc2xvdCwgdmFsdWUpOwogfQogCiBzdGF0aWMgaW50IGdldF9hZGFwdGVyX3N0YXR1cyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnX3Nsb3QsIHU4ICp2YWx1ZSkKIHsKIAlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IGhvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKLQlpbnQgcmV0dmFsOwogCiAJY3RybF9kYmcoc2xvdC0+Y3RybCwgIiVzOiBwaHlzaWNhbF9zbG90ID0gJXNcbiIsCiAJCSBfX2Z1bmNfXywgc2xvdF9uYW1lKHNsb3QpKTsKIAotCXJldHZhbCA9IHBjaWVocF9nZXRfYWRhcHRlcl9zdGF0dXMoc2xvdCwgdmFsdWUpOwotCWlmIChyZXR2YWwgPCAwKQotCQkqdmFsdWUgPSBob3RwbHVnX3Nsb3QtPmluZm8tPmFkYXB0ZXJfc3RhdHVzOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHBjaWVocF9nZXRfYWRhcHRlcl9zdGF0dXMoc2xvdCwgdmFsdWUpOwogfQogCiBzdGF0aWMgaW50IGdldF9tYXhfYnVzX3NwZWVkKHN0cnVjdCBob3RwbHVnX3Nsb3QgKmhvdHBsdWdfc2xvdCwKIAkJCQllbnVtIHBjaV9idXNfc3BlZWQgKnZhbHVlKQogewogCXN0cnVjdCBzbG90ICpzbG90ID0gaG90cGx1Z19zbG90LT5wcml2YXRlOwotCWludCByZXR2YWw7CiAKIAljdHJsX2RiZyhzbG90LT5jdHJsLCAiJXM6IHBoeXNpY2FsX3Nsb3QgPSAlc1xuIiwKIAkJIF9fZnVuY19fLCBzbG90X25hbWUoc2xvdCkpOwogCi0JcmV0dmFsID0gcGNpZWhwX2dldF9tYXhfbGlua19zcGVlZChzbG90LCB2YWx1ZSk7Ci0JaWYgKHJldHZhbCA8IDApCi0JCSp2YWx1ZSA9IFBDSV9TUEVFRF9VTktOT1dOOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHBjaWVocF9nZXRfbWF4X2xpbmtfc3BlZWQoc2xvdCwgdmFsdWUpOwogfQogCiBzdGF0aWMgaW50IGdldF9jdXJfYnVzX3NwZWVkKHN0cnVjdCBob3RwbHVnX3Nsb3QgKmhvdHBsdWdfc2xvdCwgZW51bSBwY2lfYnVzX3NwZWVkICp2YWx1ZSkKIHsKIAlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IGhvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKLQlpbnQgcmV0dmFsOwogCiAJY3RybF9kYmcoc2xvdC0+Y3RybCwgIiVzOiBwaHlzaWNhbF9zbG90ID0gJXNcbiIsCiAJCSBfX2Z1bmNfXywgc2xvdF9uYW1lKHNsb3QpKTsKIAotCXJldHZhbCA9IHBjaWVocF9nZXRfY3VyX2xpbmtfc3BlZWQoc2xvdCwgdmFsdWUpOwotCWlmIChyZXR2YWwgPCAwKQotCQkqdmFsdWUgPSBQQ0lfU1BFRURfVU5LTk9XTjsKLQotCXJldHVybiAwOworCXJldHVybiBwY2llaHBfZ2V0X2N1cl9saW5rX3NwZWVkKHNsb3QsIHZhbHVlKTsKIH0KIAogc3RhdGljIGludCBwY2llaHBfcHJvYmUoc3RydWN0IHBjaWVfZGV2aWNlICpkZXYpCkBAIC0yODYsMTQgKzI1MywxMyBAQAogCWludCByYzsKIAlzdHJ1Y3QgY29udHJvbGxlciAqY3RybDsKIAlzdHJ1Y3Qgc2xvdCAqc2xvdDsKLQl1OCB2YWx1ZTsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldi0+cG9ydDsKKwl1OCBvY2N1cGllZCwgcG93ZXJvbjsKIAogCWlmIChwY2llaHBfZm9yY2UpCiAJCWRldl9pbmZvKCZkZXYtPmRldmljZSwKIAkJCSAiQnlwYXNzaW5nIEJJT1MgY2hlY2sgZm9yIHBjaWVocCB1c2Ugb24gJXNcbiIsCi0JCQkgcGNpX25hbWUocGRldikpOwotCWVsc2UgaWYgKHBjaWVocF9nZXRfaHBfaHdfY29udHJvbF9mcm9tX2Zpcm13YXJlKHBkZXYpKQorCQkJIHBjaV9uYW1lKGRldi0+cG9ydCkpOworCWVsc2UgaWYgKHBjaWVocF9nZXRfaHBfaHdfY29udHJvbF9mcm9tX2Zpcm13YXJlKGRldi0+cG9ydCkpCiAJCWdvdG8gZXJyX291dF9ub25lOwogCiAJY3RybCA9IHBjaWVfaW5pdChkZXYpOwpAQCAtMzE4LDIzICsyODQsMTggQEAKIAlyYyA9IHBjaWVfaW5pdF9ub3RpZmljYXRpb24oY3RybCk7CiAJaWYgKHJjKSB7CiAJCWN0cmxfZXJyKGN0cmwsICJOb3RpZmljYXRpb24gaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKLQkJZ290byBlcnJfb3V0X3JlbGVhc2VfY3RscjsKKwkJZ290byBlcnJfb3V0X2ZyZWVfY3RybF9zbG90OwogCX0KIAogCS8qIENoZWNrIGlmIHNsb3QgaXMgb2NjdXBpZWQgKi8KIAlzbG90ID0gY3RybC0+c2xvdDsKLQlwY2llaHBfZ2V0X2FkYXB0ZXJfc3RhdHVzKHNsb3QsICZ2YWx1ZSk7Ci0JaWYgKHZhbHVlKSB7Ci0JCWlmIChwY2llaHBfZm9yY2UpCi0JCQlwY2llaHBfZW5hYmxlX3Nsb3Qoc2xvdCk7Ci0JfSBlbHNlIHsKLQkJLyogUG93ZXIgb2ZmIHNsb3QgaWYgbm90IG9jY3VwaWVkICovCi0JCWlmIChQT1dFUl9DVFJMKGN0cmwpKSB7Ci0JCQlyYyA9IHBjaWVocF9wb3dlcl9vZmZfc2xvdChzbG90KTsKLQkJCWlmIChyYykKLQkJCQlnb3RvIGVycl9vdXRfZnJlZV9jdHJsX3Nsb3Q7Ci0JCX0KLQl9CisJcGNpZWhwX2dldF9hZGFwdGVyX3N0YXR1cyhzbG90LCAmb2NjdXBpZWQpOworCXBjaWVocF9nZXRfcG93ZXJfc3RhdHVzKHNsb3QsICZwb3dlcm9uKTsKKwlpZiAob2NjdXBpZWQgJiYgcGNpZWhwX2ZvcmNlKQorCQlwY2llaHBfZW5hYmxlX3Nsb3Qoc2xvdCk7CisJLyogSWYgZW1wdHkgc2xvdCdzIHBvd2VyIHN0YXR1cyBpcyBvbiwgdHVybiBwb3dlciBvZmYgKi8KKwlpZiAoIW9jY3VwaWVkICYmIHBvd2Vyb24gJiYgUE9XRVJfQ1RSTChjdHJsKSkKKwkJcGNpZWhwX3Bvd2VyX29mZl9zbG90KHNsb3QpOwogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2N0cmwuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2N0cmwuYwppbmRleCA4NDQ4N2QxLi5kNmFjMWIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jdHJsLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY3RybC5jCkBAIC0xNDIsMjMgKzE0Miw5IEBACiAKIAkvKiBwb3dlciBmYXVsdCAqLwogCWN0cmxfZGJnKGN0cmwsICJQb3dlciBmYXVsdCBpbnRlcnJ1cHQgcmVjZWl2ZWRcbiIpOwotCi0JaWYgKCFwY2llaHBfcXVlcnlfcG93ZXJfZmF1bHQocF9zbG90KSkgewotCQkvKgotCQkgKiBwb3dlciBmYXVsdCBDbGVhcmVkCi0JCSAqLwotCQljdHJsX2luZm8oY3RybCwgIlBvd2VyIGZhdWx0IGNsZWFyZWQgb24gU2xvdCglcylcbiIsCi0JCQkgIHNsb3RfbmFtZShwX3Nsb3QpKTsKLQkJZXZlbnRfdHlwZSA9IElOVF9QT1dFUl9GQVVMVF9DTEVBUjsKLQl9IGVsc2UgewotCQkvKgotCQkgKiAgIHBvd2VyIGZhdWx0Ci0JCSAqLwotCQljdHJsX2luZm8oY3RybCwgIlBvd2VyIGZhdWx0IG9uIFNsb3QoJXMpXG4iLCBzbG90X25hbWUocF9zbG90KSk7Ci0JCWV2ZW50X3R5cGUgPSBJTlRfUE9XRVJfRkFVTFQ7Ci0JCWN0cmxfaW5mbyhjdHJsLCAiUG93ZXIgZmF1bHQgYml0ICV4IHNldFxuIiwgMCk7Ci0JfQotCisJY3RybF9lcnIoY3RybCwgIlBvd2VyIGZhdWx0IG9uIHNsb3QgJXNcbiIsIHNsb3RfbmFtZShwX3Nsb3QpKTsKKwlldmVudF90eXBlID0gSU5UX1BPV0VSX0ZBVUxUOworCWN0cmxfaW5mbyhjdHJsLCAiUG93ZXIgZmF1bHQgYml0ICV4IHNldFxuIiwgMCk7CiAJcXVldWVfaW50ZXJydXB0X2V2ZW50KHBfc2xvdCwgZXZlbnRfdHlwZSk7CiAKIAlyZXR1cm4gMTsKQEAgLTIyNCwxMyArMjEwLDEyIEBACiAJcmV0dmFsID0gcGNpZWhwX2NoZWNrX2xpbmtfc3RhdHVzKGN0cmwpOwogCWlmIChyZXR2YWwpIHsKIAkJY3RybF9lcnIoY3RybCwgIkZhaWxlZCB0byBjaGVjayBsaW5rIHN0YXR1c1xuIik7Ci0JCXNldF9zbG90X29mZihjdHJsLCBwX3Nsb3QpOwotCQlyZXR1cm4gcmV0dmFsOworCQlnb3RvIGVycl9leGl0OwogCX0KIAogCS8qIENoZWNrIGZvciBhIHBvd2VyIGZhdWx0ICovCi0JaWYgKHBjaWVocF9xdWVyeV9wb3dlcl9mYXVsdChwX3Nsb3QpKSB7Ci0JCWN0cmxfZGJnKGN0cmwsICJQb3dlciBmYXVsdCBkZXRlY3RlZFxuIik7CisJaWYgKGN0cmwtPnBvd2VyX2ZhdWx0X2RldGVjdGVkIHx8IHBjaWVocF9xdWVyeV9wb3dlcl9mYXVsdChwX3Nsb3QpKSB7CisJCWN0cmxfZXJyKGN0cmwsICJQb3dlciBmYXVsdCBvbiBzbG90ICVzXG4iLCBzbG90X25hbWUocF9zbG90KSk7CiAJCXJldHZhbCA9IC1FSU87CiAJCWdvdG8gZXJyX2V4aXQ7CiAJfQpAQCAtMzYzLDI1ICszNDgsNiBAQAogCW11dGV4X3VubG9jaygmcF9zbG90LT5sb2NrKTsKIH0KIAotc3RhdGljIGludCB1cGRhdGVfc2xvdF9pbmZvKHN0cnVjdCBzbG90ICpzbG90KQotewotCXN0cnVjdCBob3RwbHVnX3Nsb3RfaW5mbyAqaW5mbzsKLQlpbnQgcmVzdWx0OwotCi0JaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpbmZvKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBjaWVocF9nZXRfcG93ZXJfc3RhdHVzKHNsb3QsICZpbmZvLT5wb3dlcl9zdGF0dXMpOwotCXBjaWVocF9nZXRfYXR0ZW50aW9uX3N0YXR1cyhzbG90LCAmaW5mby0+YXR0ZW50aW9uX3N0YXR1cyk7Ci0JcGNpZWhwX2dldF9sYXRjaF9zdGF0dXMoc2xvdCwgJmluZm8tPmxhdGNoX3N0YXR1cyk7Ci0JcGNpZWhwX2dldF9hZGFwdGVyX3N0YXR1cyhzbG90LCAmaW5mby0+YWRhcHRlcl9zdGF0dXMpOwotCi0JcmVzdWx0ID0gcGNpX2hwX2NoYW5nZV9zbG90X2luZm8oc2xvdC0+aG90cGx1Z19zbG90LCBpbmZvKTsKLQlrZnJlZSAoaW5mbyk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQogLyoKICAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCBzbG90LT5sb2NrIGhlbGQKICAqLwpAQCAtNDQyLDcgKzQwOCw2IEBACiAJCSAqIHRvIGhvdC1hZGQgb3IgaG90LXJlbW92ZSBpcyB1bmRlcmdvaW5nCiAJCSAqLwogCQljdHJsX2luZm8oY3RybCwgIkJ1dHRvbiBpZ25vcmUgb24gU2xvdCglcylcbiIsIHNsb3RfbmFtZShwX3Nsb3QpKTsKLQkJdXBkYXRlX3Nsb3RfaW5mbyhwX3Nsb3QpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQljdHJsX3dhcm4oY3RybCwgIk5vdCBhIHZhbGlkIHN0YXRlXG4iKTsKQEAgLTUwMCwxMSArNDY1LDkgQEAKIAkJaWYgKCFIUF9TVVBSX1JNKGN0cmwpKQogCQkJYnJlYWs7CiAJCWN0cmxfZGJnKGN0cmwsICJTdXJwcmlzZSBSZW1vdmFsXG4iKTsKLQkJdXBkYXRlX3Nsb3RfaW5mbyhwX3Nsb3QpOwogCQloYW5kbGVfc3VycHJpc2VfZXZlbnQocF9zbG90KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJdXBkYXRlX3Nsb3RfaW5mbyhwX3Nsb3QpOwogCQlicmVhazsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZwX3Nsb3QtPmxvY2spOwpAQCAtNTQ3LDkgKzUxMCw2IEBACiAJaWYgKHJjKSB7CiAJCXBjaWVocF9nZXRfbGF0Y2hfc3RhdHVzKHBfc2xvdCwgJmdldHN0YXR1cyk7CiAJfQotCi0JdXBkYXRlX3Nsb3RfaW5mbyhwX3Nsb3QpOwotCiAJcmV0dXJuIHJjOwogfQogCkBAIC01OTAsMTAgKzU1MCw3IEBACiAJCX0KIAl9CiAKLQlyZXQgPSByZW1vdmVfYm9hcmQocF9zbG90KTsKLQl1cGRhdGVfc2xvdF9pbmZvKHBfc2xvdCk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiByZW1vdmVfYm9hcmQocF9zbG90KTsKIH0KIAogaW50IHBjaWVocF9zeXNmc19lbmFibGVfc2xvdChzdHJ1Y3Qgc2xvdCAqcF9zbG90KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfaHBjLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYwppbmRleCA5ZWY0NjA1Li4xMDA0MGQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYwpAQCAtNDUsMjUgKzQ1LDI1IEBACiBzdGF0aWMgaW5saW5lIGludCBwY2llaHBfcmVhZHcoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwsIGludCByZWcsIHUxNiAqdmFsdWUpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IGN0cmwtPnBjaWUtPnBvcnQ7Ci0JcmV0dXJuIHBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgY3RybC0+Y2FwX2Jhc2UgKyByZWcsIHZhbHVlKTsKKwlyZXR1cm4gcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBwY2lfcGNpZV9jYXAoZGV2KSArIHJlZywgdmFsdWUpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBwY2llaHBfcmVhZGwoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwsIGludCByZWcsIHUzMiAqdmFsdWUpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IGN0cmwtPnBjaWUtPnBvcnQ7Ci0JcmV0dXJuIHBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGN0cmwtPmNhcF9iYXNlICsgcmVnLCB2YWx1ZSk7CisJcmV0dXJuIHBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHBjaV9wY2llX2NhcChkZXYpICsgcmVnLCB2YWx1ZSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHBjaWVocF93cml0ZXcoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwsIGludCByZWcsIHUxNiB2YWx1ZSkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gY3RybC0+cGNpZS0+cG9ydDsKLQlyZXR1cm4gcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgY3RybC0+Y2FwX2Jhc2UgKyByZWcsIHZhbHVlKTsKKwlyZXR1cm4gcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgcGNpX3BjaWVfY2FwKGRldikgKyByZWcsIHZhbHVlKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgcGNpZWhwX3dyaXRlbChzdHJ1Y3QgY29udHJvbGxlciAqY3RybCwgaW50IHJlZywgdTMyIHZhbHVlKQogewogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBjdHJsLT5wY2llLT5wb3J0OwotCXJldHVybiBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgY3RybC0+Y2FwX2Jhc2UgKyByZWcsIHZhbHVlKTsKKwlyZXR1cm4gcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHBjaV9wY2llX2NhcChkZXYpICsgcmVnLCB2YWx1ZSk7CiB9CiAKIC8qIFBvd2VyIENvbnRyb2wgQ29tbWFuZCAqLwpAQCAtMzE4LDggKzMxOCw4IEBACiAJCXJldHVybiByZXR2YWw7CiAJfQogCi0JY3RybF9kYmcoY3RybCwgIiVzOiBTTE9UQ1RSTCAleCwgdmFsdWUgcmVhZCAleFxuIiwKLQkJIF9fZnVuY19fLCBjdHJsLT5jYXBfYmFzZSArIFBDSV9FWFBfU0xUQ1RMLCBzbG90X2N0cmwpOworCWN0cmxfZGJnKGN0cmwsICIlczogU0xPVENUUkwgJXgsIHZhbHVlIHJlYWQgJXhcbiIsIF9fZnVuY19fLAorCQkgcGNpX3BjaWVfY2FwKGN0cmwtPnBjaWUtPnBvcnQpICsgUENJX0VYUF9TTFRDVEwsIHNsb3RfY3RybCk7CiAKIAlhdHRlbl9sZWRfc3RhdGUgPSAoc2xvdF9jdHJsICYgUENJX0VYUF9TTFRDVExfQUlDKSA+PiA2OwogCkBAIC0zNTYsOCArMzU2LDggQEAKIAkJY3RybF9lcnIoY3RybCwgIiVzOiBDYW5ub3QgcmVhZCBTTE9UQ1RSTCByZWdpc3RlclxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KLQljdHJsX2RiZyhjdHJsLCAiJXM6IFNMT1RDVFJMICV4IHZhbHVlIHJlYWQgJXhcbiIsCi0JCSBfX2Z1bmNfXywgY3RybC0+Y2FwX2Jhc2UgKyBQQ0lfRVhQX1NMVENUTCwgc2xvdF9jdHJsKTsKKwljdHJsX2RiZyhjdHJsLCAiJXM6IFNMT1RDVFJMICV4IHZhbHVlIHJlYWQgJXhcbiIsIF9fZnVuY19fLAorCQkgcGNpX3BjaWVfY2FwKGN0cmwtPnBjaWUtPnBvcnQpICsgUENJX0VYUF9TTFRDVEwsIHNsb3RfY3RybCk7CiAKIAlwd3Jfc3RhdGUgPSAoc2xvdF9jdHJsICYgUENJX0VYUF9TTFRDVExfUENDKSA+PiAxMDsKIApAQCAtNDI3LDI3ICs0MjcsMjQgQEAKIAlzdHJ1Y3QgY29udHJvbGxlciAqY3RybCA9IHNsb3QtPmN0cmw7CiAJdTE2IHNsb3RfY21kOwogCXUxNiBjbWRfbWFzazsKLQlpbnQgcmM7CiAKIAljbWRfbWFzayA9IFBDSV9FWFBfU0xUQ1RMX0FJQzsKIAlzd2l0Y2ggKHZhbHVlKSB7Ci0JCWNhc2UgMCA6CS8qIHR1cm4gb2ZmICovCi0JCQlzbG90X2NtZCA9IDB4MDBDMDsKLQkJCWJyZWFrOwotCQljYXNlIDE6CQkvKiB0dXJuIG9uICovCi0JCQlzbG90X2NtZCA9IDB4MDA0MDsKLQkJCWJyZWFrOwotCQljYXNlIDI6CQkvKiB0dXJuIGJsaW5rICovCi0JCQlzbG90X2NtZCA9IDB4MDA4MDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC0xOworCWNhc2UgMCA6CS8qIHR1cm4gb2ZmICovCisJCXNsb3RfY21kID0gMHgwMEMwOworCQlicmVhazsKKwljYXNlIDE6CQkvKiB0dXJuIG9uICovCisJCXNsb3RfY21kID0gMHgwMDQwOworCQlicmVhazsKKwljYXNlIDI6CQkvKiB0dXJuIGJsaW5rICovCisJCXNsb3RfY21kID0gMHgwMDgwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JcmMgPSBwY2llX3dyaXRlX2NtZChjdHJsLCBzbG90X2NtZCwgY21kX21hc2spOwotCWN0cmxfZGJnKGN0cmwsICIlczogU0xPVENUUkwgJXggd3JpdGUgY21kICV4XG4iLAotCQkgX19mdW5jX18sIGN0cmwtPmNhcF9iYXNlICsgUENJX0VYUF9TTFRDVEwsIHNsb3RfY21kKTsKLQotCXJldHVybiByYzsKKwljdHJsX2RiZyhjdHJsLCAiJXM6IFNMT1RDVFJMICV4IHdyaXRlIGNtZCAleFxuIiwgX19mdW5jX18sCisJCSBwY2lfcGNpZV9jYXAoY3RybC0+cGNpZS0+cG9ydCkgKyBQQ0lfRVhQX1NMVENUTCwgc2xvdF9jbWQpOworCXJldHVybiBwY2llX3dyaXRlX2NtZChjdHJsLCBzbG90X2NtZCwgY21kX21hc2spOwogfQogCiB2b2lkIHBjaWVocF9ncmVlbl9sZWRfb24oc3RydWN0IHNsb3QgKnNsb3QpCkBAIC00NTksOCArNDU2LDggQEAKIAlzbG90X2NtZCA9IDB4MDEwMDsKIAljbWRfbWFzayA9IFBDSV9FWFBfU0xUQ1RMX1BJQzsKIAlwY2llX3dyaXRlX2NtZChjdHJsLCBzbG90X2NtZCwgY21kX21hc2spOwotCWN0cmxfZGJnKGN0cmwsICIlczogU0xPVENUUkwgJXggd3JpdGUgY21kICV4XG4iLAotCQkgX19mdW5jX18sIGN0cmwtPmNhcF9iYXNlICsgUENJX0VYUF9TTFRDVEwsIHNsb3RfY21kKTsKKwljdHJsX2RiZyhjdHJsLCAiJXM6IFNMT1RDVFJMICV4IHdyaXRlIGNtZCAleFxuIiwgX19mdW5jX18sCisJCSBwY2lfcGNpZV9jYXAoY3RybC0+cGNpZS0+cG9ydCkgKyBQQ0lfRVhQX1NMVENUTCwgc2xvdF9jbWQpOwogfQogCiB2b2lkIHBjaWVocF9ncmVlbl9sZWRfb2ZmKHN0cnVjdCBzbG90ICpzbG90KQpAQCAtNDcyLDggKzQ2OSw4IEBACiAJc2xvdF9jbWQgPSAweDAzMDA7CiAJY21kX21hc2sgPSBQQ0lfRVhQX1NMVENUTF9QSUM7CiAJcGNpZV93cml0ZV9jbWQoY3RybCwgc2xvdF9jbWQsIGNtZF9tYXNrKTsKLQljdHJsX2RiZyhjdHJsLCAiJXM6IFNMT1RDVFJMICV4IHdyaXRlIGNtZCAleFxuIiwKLQkJIF9fZnVuY19fLCBjdHJsLT5jYXBfYmFzZSArIFBDSV9FWFBfU0xUQ1RMLCBzbG90X2NtZCk7CisJY3RybF9kYmcoY3RybCwgIiVzOiBTTE9UQ1RSTCAleCB3cml0ZSBjbWQgJXhcbiIsIF9fZnVuY19fLAorCQkgcGNpX3BjaWVfY2FwKGN0cmwtPnBjaWUtPnBvcnQpICsgUENJX0VYUF9TTFRDVEwsIHNsb3RfY21kKTsKIH0KIAogdm9pZCBwY2llaHBfZ3JlZW5fbGVkX2JsaW5rKHN0cnVjdCBzbG90ICpzbG90KQpAQCAtNDg1LDggKzQ4Miw4IEBACiAJc2xvdF9jbWQgPSAweDAyMDA7CiAJY21kX21hc2sgPSBQQ0lfRVhQX1NMVENUTF9QSUM7CiAJcGNpZV93cml0ZV9jbWQoY3RybCwgc2xvdF9jbWQsIGNtZF9tYXNrKTsKLQljdHJsX2RiZyhjdHJsLCAiJXM6IFNMT1RDVFJMICV4IHdyaXRlIGNtZCAleFxuIiwKLQkJIF9fZnVuY19fLCBjdHJsLT5jYXBfYmFzZSArIFBDSV9FWFBfU0xUQ1RMLCBzbG90X2NtZCk7CisJY3RybF9kYmcoY3RybCwgIiVzOiBTTE9UQ1RSTCAleCB3cml0ZSBjbWQgJXhcbiIsIF9fZnVuY19fLAorCQkgcGNpX3BjaWVfY2FwKGN0cmwtPnBjaWUtPnBvcnQpICsgUENJX0VYUF9TTFRDVEwsIHNsb3RfY21kKTsKIH0KIAogaW50IHBjaWVocF9wb3dlcl9vbl9zbG90KHN0cnVjdCBzbG90ICogc2xvdCkKQEAgLTUxNCw5NyArNTExLDM4IEBACiAJCQlyZXR1cm4gcmV0dmFsOwogCQl9CiAJfQorCWN0cmwtPnBvd2VyX2ZhdWx0X2RldGVjdGVkID0gMDsKIAogCXNsb3RfY21kID0gUE9XRVJfT047CiAJY21kX21hc2sgPSBQQ0lfRVhQX1NMVENUTF9QQ0M7Ci0JaWYgKCFwY2llaHBfcG9sbF9tb2RlKSB7Ci0JCS8qIEVuYWJsZSBwb3dlciBmYXVsdCBkZXRlY3Rpb24gdHVybmVkIG9mZiBhdCBwb3dlciBvZmYgdGltZSAqLwotCQlzbG90X2NtZCB8PSBQQ0lfRVhQX1NMVENUTF9QRkRFOwotCQljbWRfbWFzayB8PSBQQ0lfRVhQX1NMVENUTF9QRkRFOwotCX0KLQogCXJldHZhbCA9IHBjaWVfd3JpdGVfY21kKGN0cmwsIHNsb3RfY21kLCBjbWRfbWFzayk7CiAJaWYgKHJldHZhbCkgewogCQljdHJsX2VycihjdHJsLCAiV3JpdGUgJXggY29tbWFuZCBmYWlsZWQhXG4iLCBzbG90X2NtZCk7CiAJCXJldHVybiByZXR2YWw7CiAJfQotCWN0cmxfZGJnKGN0cmwsICIlczogU0xPVENUUkwgJXggd3JpdGUgY21kICV4XG4iLAotCQkgX19mdW5jX18sIGN0cmwtPmNhcF9iYXNlICsgUENJX0VYUF9TTFRDVEwsIHNsb3RfY21kKTsKKwljdHJsX2RiZyhjdHJsLCAiJXM6IFNMT1RDVFJMICV4IHdyaXRlIGNtZCAleFxuIiwgX19mdW5jX18sCisJCSBwY2lfcGNpZV9jYXAoY3RybC0+cGNpZS0+cG9ydCkgKyBQQ0lfRVhQX1NMVENUTCwgc2xvdF9jbWQpOwogCi0JY3RybC0+cG93ZXJfZmF1bHRfZGV0ZWN0ZWQgPSAwOwogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHBjaWVfbWFza19iYWRfZGxscChzdHJ1Y3QgY29udHJvbGxlciAqY3RybCkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gY3RybC0+cGNpZS0+cG9ydDsKLQlpbnQgcG9zOwotCXUzMiByZWc7Ci0KLQlwb3MgPSBwY2lfZmluZF9leHRfY2FwYWJpbGl0eShkZXYsIFBDSV9FWFRfQ0FQX0lEX0VSUik7Ci0JaWYgKCFwb3MpCi0JCXJldHVybiAwOwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9FUlJfQ09SX01BU0ssICZyZWcpOwotCWlmIChyZWcgJiBQQ0lfRVJSX0NPUl9CQURfRExMUCkKLQkJcmV0dXJuIDA7Ci0JcmVnIHw9IFBDSV9FUlJfQ09SX0JBRF9ETExQOwotCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBwb3MgKyBQQ0lfRVJSX0NPUl9NQVNLLCByZWcpOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcGNpZV91bm1hc2tfYmFkX2RsbHAoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKmRldiA9IGN0cmwtPnBjaWUtPnBvcnQ7Ci0JdTMyIHJlZzsKLQlpbnQgcG9zOwotCi0JcG9zID0gcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkoZGV2LCBQQ0lfRVhUX0NBUF9JRF9FUlIpOwotCWlmICghcG9zKQotCQlyZXR1cm47Ci0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcG9zICsgUENJX0VSUl9DT1JfTUFTSywgJnJlZyk7Ci0JaWYgKCEocmVnICYgUENJX0VSUl9DT1JfQkFEX0RMTFApKQotCQlyZXR1cm47Ci0JcmVnICY9IH5QQ0lfRVJSX0NPUl9CQURfRExMUDsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcG9zICsgUENJX0VSUl9DT1JfTUFTSywgcmVnKTsKLX0KLQogaW50IHBjaWVocF9wb3dlcl9vZmZfc2xvdChzdHJ1Y3Qgc2xvdCAqIHNsb3QpCiB7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBzbG90LT5jdHJsOwogCXUxNiBzbG90X2NtZDsKIAl1MTYgY21kX21hc2s7Ci0JaW50IHJldHZhbCA9IDA7Ci0JaW50IGNoYW5nZWQ7Ci0KLQkvKgotCSAqIFNldCBCYWQgRExMUCBNYXNrIGJpdCBpbiBDb3JyZWN0YWJsZSBFcnJvciBNYXNrCi0JICogUmVnaXN0ZXIuIFRoaXMgaXMgdGhlIHdvcmthcm91bmQgYWdhaW5zdCBCYWQgRExMUCBlcnJvcgotCSAqIHRoYXQgc29tZXRpbWVzIGhhcHBlbnMgZHVyaW5nIHR1cm5pbmcgcG93ZXIgb2ZmIHRoZSBzbG90Ci0JICogd2hpY2ggY29uZm9ybXMgdG8gUENJIEV4cHJlc3MgMS4wYSBzcGVjLgotCSAqLwotCWNoYW5nZWQgPSBwY2llX21hc2tfYmFkX2RsbHAoY3RybCk7CisJaW50IHJldHZhbDsKIAogCXNsb3RfY21kID0gUE9XRVJfT0ZGOwogCWNtZF9tYXNrID0gUENJX0VYUF9TTFRDVExfUENDOwotCWlmICghcGNpZWhwX3BvbGxfbW9kZSkgewotCQkvKiBEaXNhYmxlIHBvd2VyIGZhdWx0IGRldGVjdGlvbiAqLwotCQlzbG90X2NtZCAmPSB+UENJX0VYUF9TTFRDVExfUEZERTsKLQkJY21kX21hc2sgfD0gUENJX0VYUF9TTFRDVExfUEZERTsKLQl9Ci0KIAlyZXR2YWwgPSBwY2llX3dyaXRlX2NtZChjdHJsLCBzbG90X2NtZCwgY21kX21hc2spOwogCWlmIChyZXR2YWwpIHsKIAkJY3RybF9lcnIoY3RybCwgIldyaXRlIGNvbW1hbmQgZmFpbGVkIVxuIik7Ci0JCXJldHZhbCA9IC0xOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuIHJldHZhbDsKIAl9Ci0JY3RybF9kYmcoY3RybCwgIiVzOiBTTE9UQ1RSTCAleCB3cml0ZSBjbWQgJXhcbiIsCi0JCSBfX2Z1bmNfXywgY3RybC0+Y2FwX2Jhc2UgKyBQQ0lfRVhQX1NMVENUTCwgc2xvdF9jbWQpOwotIG91dDoKLQlpZiAoY2hhbmdlZCkKLQkJcGNpZV91bm1hc2tfYmFkX2RsbHAoY3RybCk7Ci0KLQlyZXR1cm4gcmV0dmFsOworCWN0cmxfZGJnKGN0cmwsICIlczogU0xPVENUUkwgJXggd3JpdGUgY21kICV4XG4iLCBfX2Z1bmNfXywKKwkJIHBjaV9wY2llX2NhcChjdHJsLT5wY2llLT5wb3J0KSArIFBDSV9FWFBfU0xUQ1RMLCBzbG90X2NtZCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBwY2llX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCkBAIC04NDAsMTEgKzc3OCwxOSBAQAogewogCXUxNiBjbWQsIG1hc2s7CiAKKwkvKgorCSAqIFRCRDogUG93ZXIgZmF1bHQgZGV0ZWN0ZWQgc29mdHdhcmUgbm90aWZpY2F0aW9uIHN1cHBvcnQuCisJICoKKwkgKiBQb3dlciBmYXVsdCBkZXRlY3RlZCBzb2Z0d2FyZSBub3RpZmljYXRpb24gaXMgbm90IGVuYWJsZWQKKwkgKiBub3csIGJlY2F1c2UgaXQgY2F1c2VkIHBvd2VyIGZhdWx0IGRldGVjdGVkIGludGVycnVwdCBzdG9ybQorCSAqIG9uIHNvbWUgbWFjaGluZXMuIE9uIHRob3NlIG1hY2hpbmVzLCBwb3dlciBmYXVsdCBkZXRlY3RlZAorCSAqIGJpdCBpbiB0aGUgc2xvdCBzdGF0dXMgcmVnaXN0ZXIgd2FzIHNldCBhZ2FpbiBpbW1lZGlhdGVseQorCSAqIHdoZW4gaXQgaXMgY2xlYXJlZCBpbiB0aGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSwgYW5kCisJICogbmV4dCBwb3dlciBmYXVsdCBkZXRlY3RlZCBpbnRlcnJ1cHQgd2FzIG5vdGlmaWVkIGFnYWluLgorCSAqLwogCWNtZCA9IFBDSV9FWFBfU0xUQ1RMX1BEQ0U7CiAJaWYgKEFUVE5fQlVUVE4oY3RybCkpCiAJCWNtZCB8PSBQQ0lfRVhQX1NMVENUTF9BQlBFOwotCWlmIChQT1dFUl9DVFJMKGN0cmwpKQotCQljbWQgfD0gUENJX0VYUF9TTFRDVExfUEZERTsKIAlpZiAoTVJMX1NFTlMoY3RybCkpCiAJCWNtZCB8PSBQQ0lfRVhQX1NMVENUTF9NUkxTQ0U7CiAJaWYgKCFwY2llaHBfcG9sbF9tb2RlKQpAQCAtODY2LDcgKzgxMiw4IEBACiAJdTE2IG1hc2s7CiAJbWFzayA9IChQQ0lfRVhQX1NMVENUTF9QRENFIHwgUENJX0VYUF9TTFRDVExfQUJQRSB8CiAJCVBDSV9FWFBfU0xUQ1RMX01STFNDRSB8IFBDSV9FWFBfU0xUQ1RMX1BGREUgfAotCQlQQ0lfRVhQX1NMVENUTF9IUElFIHwgUENJX0VYUF9TTFRDVExfQ0NJRSk7CisJCVBDSV9FWFBfU0xUQ1RMX0hQSUUgfCBQQ0lfRVhQX1NMVENUTF9DQ0lFIHwKKwkJUENJX0VYUF9TTFRDVExfRExMU0NFKTsKIAlpZiAocGNpZV93cml0ZV9jbWQoY3RybCwgMCwgbWFzaykpCiAJCWN0cmxfd2FybihjdHJsLCAiQ2Fubm90IGRpc2FibGUgc29mdHdhcmUgbm90aWZpY2F0aW9uXG4iKTsKIH0KQEAgLTkzNCw3ICs4ODEsOCBAQAogCQkgIHBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpOwogCWN0cmxfaW5mbyhjdHJsLCAiICBTdWJzeXN0ZW0gVmVuZG9yIElEICA6IDB4JTA0eFxuIiwKIAkJICBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yKTsKLQljdHJsX2luZm8oY3RybCwgIiAgUENJZSBDYXAgb2Zmc2V0ICAgICAgOiAweCUwMnhcbiIsIGN0cmwtPmNhcF9iYXNlKTsKKwljdHJsX2luZm8oY3RybCwgIiAgUENJZSBDYXAgb2Zmc2V0ICAgICAgOiAweCUwMnhcbiIsCisJCSAgcGNpX3BjaWVfY2FwKHBkZXYpKTsKIAlmb3IgKGkgPSAwOyBpIDwgREVWSUNFX0NPVU5UX1JFU09VUkNFOyBpKyspIHsKIAkJaWYgKCFwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGkpKQogCQkJY29udGludWU7CkBAIC05NzgsOCArOTI2LDcgQEAKIAkJZ290byBhYm9ydDsKIAl9CiAJY3RybC0+cGNpZSA9IGRldjsKLQljdHJsLT5jYXBfYmFzZSA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9FWFApOwotCWlmICghY3RybC0+Y2FwX2Jhc2UpIHsKKwlpZiAoIXBjaV9wY2llX2NhcChwZGV2KSkgewogCQljdHJsX2VycihjdHJsLCAiQ2Fubm90IGZpbmQgUENJIEV4cHJlc3MgY2FwYWJpbGl0eVxuIik7CiAJCWdvdG8gYWJvcnRfY3RybDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWhwX3Nsb3QuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpaHBfc2xvdC5jCmluZGV4IGNjOGVjM2EuLjgwYjQ2MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpaHBfc2xvdC5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpaHBfc2xvdC5jCkBAIC00Myw3ICs0Myw3IEBACiAJCSAqIFBlcmhhcHMgd2UgKnNob3VsZCogdXNlIGRlZmF1bHQgc2V0dGluZ3MgZm9yIFBDSWUsIGJ1dAogCQkgKiBwY2llaHAgZGlkbid0LCBzbyB3ZSB3b24ndCBlaXRoZXIuCiAJCSAqLwotCQlpZiAoZGV2LT5pc19wY2llKQorCQlpZiAocGNpX2lzX3BjaWUoZGV2KSkKIAkJCXJldHVybjsKIAkJZGV2X2luZm8oJmRldi0+ZGV2LCAidXNpbmcgZGVmYXVsdCBQQ0kgc2V0dGluZ3NcbiIpOwogCQlocHAgPSAmcGNpX2RlZmF1bHRfdHlwZTA7CkBAIC0xMDIsNyArMTAyLDcgQEAKIAkJcmV0dXJuOwogCiAJLyogRmluZCBQQ0kgRXhwcmVzcyBjYXBhYmlsaXR5ICovCi0JcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfRVhQKTsKKwlwb3MgPSBwY2lfcGNpZV9jYXAoZGV2KTsKIAlpZiAoIXBvcykKIAkJcmV0dXJuOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9pbnRlbC1pb21tdS5jIGIvZHJpdmVycy9wY2kvaW50ZWwtaW9tbXUuYwppbmRleCA5MjYxMzI3Li44ZDYxNTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9pbnRlbC1pb21tdS5jCisrKyBiL2RyaXZlcnMvcGNpL2ludGVsLWlvbW11LmMKQEAgLTE2MTEsNyArMTYxMSw3IEBACiAJCQlyZXR1cm4gcmV0OwogCQlwYXJlbnQgPSBwYXJlbnQtPmJ1cy0+c2VsZjsKIAl9Ci0JaWYgKHRtcC0+aXNfcGNpZSkgLyogdGhpcyBpcyBhIFBDSUUtdG8tUENJIGJyaWRnZSAqLworCWlmIChwY2lfaXNfcGNpZSh0bXApKSAvKiB0aGlzIGlzIGEgUENJRS10by1QQ0kgYnJpZGdlICovCiAJCXJldHVybiBkb21haW5fY29udGV4dF9tYXBwaW5nX29uZShkb21haW4sCiAJCQkJCXBjaV9kb21haW5fbnIodG1wLT5zdWJvcmRpbmF0ZSksCiAJCQkJCXRtcC0+c3Vib3JkaW5hdGUtPm51bWJlciwgMCwKQEAgLTE2NTEsNyArMTY1MSw3IEBACiAJCQlyZXR1cm4gcmV0OwogCQlwYXJlbnQgPSBwYXJlbnQtPmJ1cy0+c2VsZjsKIAl9Ci0JaWYgKHRtcC0+aXNfcGNpZSkKKwlpZiAocGNpX2lzX3BjaWUodG1wKSkKIAkJcmV0dXJuIGRldmljZV9jb250ZXh0X21hcHBlZChpb21tdSwgdG1wLT5zdWJvcmRpbmF0ZS0+bnVtYmVyLAogCQkJCQkgICAgIDApOwogCWVsc2UKQEAgLTE4MjEsNyArMTgyMSw3IEBACiAKIAlkZXZfdG1wID0gcGNpX2ZpbmRfdXBzdHJlYW1fcGNpZV9icmlkZ2UocGRldik7CiAJaWYgKGRldl90bXApIHsKLQkJaWYgKGRldl90bXAtPmlzX3BjaWUpIHsKKwkJaWYgKHBjaV9pc19wY2llKGRldl90bXApKSB7CiAJCQlidXMgPSBkZXZfdG1wLT5zdWJvcmRpbmF0ZS0+bnVtYmVyOwogCQkJZGV2Zm4gPSAwOwogCQl9IGVsc2UgewpAQCAtMjE4Miw3ICsyMTgyLDcgQEAKIAkgKiB0aGUgMToxIGRvbWFpbiwganVzdCBpbiBfY2FzZV8gb25lIG9mIHRoZWlyIHNpYmxpbmdzIHR1cm5zIG91dAogCSAqIG5vdCB0byBiZSBhYmxlIHRvIG1hcCBhbGwgb2YgbWVtb3J5LgogCSAqLwotCWlmICghcGRldi0+aXNfcGNpZSkgeworCWlmICghcGNpX2lzX3BjaWUocGRldikpIHsKIAkJaWYgKCFwY2lfaXNfcm9vdF9idXMocGRldi0+YnVzKSkKIAkJCXJldHVybiAwOwogCQlpZiAocGRldi0+Y2xhc3MgPj4gOCA9PSBQQ0lfQ0xBU1NfQlJJREdFX1BDSSkKQEAgLTMzMTksNyArMzMxOSw3IEBACiAJCQkJCSBwYXJlbnQtPmRldmZuKTsKIAkJCXBhcmVudCA9IHBhcmVudC0+YnVzLT5zZWxmOwogCQl9Ci0JCWlmICh0bXAtPmlzX3BjaWUpIC8qIHRoaXMgaXMgYSBQQ0lFLXRvLVBDSSBicmlkZ2UgKi8KKwkJaWYgKHBjaV9pc19wY2llKHRtcCkpIC8qIHRoaXMgaXMgYSBQQ0lFLXRvLVBDSSBicmlkZ2UgKi8KIAkJCWlvbW11X2RldGFjaF9kZXYoaW9tbXUsCiAJCQkJdG1wLT5zdWJvcmRpbmF0ZS0+bnVtYmVyLCAwKTsKIAkJZWxzZSAvKiB0aGlzIGlzIGEgbGVnYWN5IFBDSSBicmlkZ2UgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2ludHJfcmVtYXBwaW5nLmMgYi9kcml2ZXJzL3BjaS9pbnRyX3JlbWFwcGluZy5jCmluZGV4IDNiMzY1ODYuLjE0ODdiZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2ludHJfcmVtYXBwaW5nLmMKKysrIGIvZHJpdmVycy9wY2kvaW50cl9yZW1hcHBpbmcuYwpAQCAtNTIwLDcgKzUyMCw3IEBACiAJCXJldHVybiAtMTsKIAogCS8qIFBDSWUgZGV2aWNlIG9yIFJvb3QgQ29tcGxleCBpbnRlZ3JhdGVkIFBDSSBkZXZpY2UgKi8KLQlpZiAoZGV2LT5pc19wY2llIHx8ICFkZXYtPmJ1cy0+cGFyZW50KSB7CisJaWYgKHBjaV9pc19wY2llKGRldikgfHwgIWRldi0+YnVzLT5wYXJlbnQpIHsKIAkJc2V0X2lydGVfc2lkKGlydGUsIFNWVF9WRVJJRllfU0lEX1NRLCBTUV9BTExfMTYsCiAJCQkgICAgIChkZXYtPmJ1cy0+bnVtYmVyIDw8IDgpIHwgZGV2LT5kZXZmbik7CiAJCXJldHVybiAwOwpAQCAtNTI4LDcgKzUyOCw3IEBACiAKIAlicmlkZ2UgPSBwY2lfZmluZF91cHN0cmVhbV9wY2llX2JyaWRnZShkZXYpOwogCWlmIChicmlkZ2UpIHsKLQkJaWYgKGJyaWRnZS0+aXNfcGNpZSkgLyogdGhpcyBpcyBhIFBDSUUtdG8tUENJL1BDSVggYnJpZGdlICovCisJCWlmIChwY2lfaXNfcGNpZShicmlkZ2UpKS8qIHRoaXMgaXMgYSBQQ0lFLXRvLVBDSS9QQ0lYIGJyaWRnZSAqLwogCQkJc2V0X2lydGVfc2lkKGlydGUsIFNWVF9WRVJJRllfQlVTLCBTUV9BTExfMTYsCiAJCQkJKGJyaWRnZS0+YnVzLT5udW1iZXIgPDwgOCkgfCBkZXYtPmJ1cy0+bnVtYmVyKTsKIAkJZWxzZSAvKiB0aGlzIGlzIGEgbGVnYWN5IFBDSSBicmlkZ2UgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2lvYXBpYy5jIGIvZHJpdmVycy9wY2kvaW9hcGljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UwZDdiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGNpL2lvYXBpYy5jCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogSU9BUElDL0lPeEFQSUMvSU9TQVBJQyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRnVqaXRzdSBMaW1pdGVkLgorICogKGMpIENvcHlyaWdodCAyMDA5IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisvKgorICogVGhpcyBkcml2ZXIgbWFuYWdlcyBQQ0kgSS9PIEFQSUNzIGFkZGVkIGJ5IGhvdHBsdWcgYWZ0ZXIgYm9vdC4gIFdlIHRyeSB0bworICogY2xhaW0gYWxsIEkvTyBBUElDIFBDSSBkZXZpY2VzLCBidXQgdGhvc2UgcHJlc2VudCBhdCBib290IHdlcmUgcmVnaXN0ZXJlZAorICogd2hlbiB3ZSBwYXJzZWQgdGhlIEFDUEkgTUFEVCwgc28gd2UnbGwgZmFpbCB3aGVuIHdlIHRyeSB0byByZS1yZWdpc3RlcgorICogdGhlbS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KKworc3RydWN0IGlvYXBpYyB7CisJYWNwaV9oYW5kbGUJaGFuZGxlOworCXUzMgkJZ3NpX2Jhc2U7Cit9OworCitzdGF0aWMgaW50IGlvYXBpY19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBsb25nIGdzYjsKKwlzdHJ1Y3QgaW9hcGljICppb2FwaWM7CisJdTY0IGFkZHI7CisJaW50IHJldDsKKwljaGFyICp0eXBlOworCisJaGFuZGxlID0gREVWSUNFX0FDUElfSEFORExFKCZkZXYtPmRldik7CisJaWYgKCFoYW5kbGUpCisJCXJldHVybiAtRUlOVkFMOworCisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgIl9HU0IiLCBOVUxMLCAmZ3NiKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBUaGUgcHJldmlvdXMgY29kZSBpbiBhY3BpcGhwIGV2YWx1YXRlZCBfTUFUIGlmIF9HU0IgZmFpbGVkLCBidXQKKwkgKiBBQ1BJIHNwZWMgNC4wIHNlYyA2LjIuMiByZXF1aXJlcyBfR1NCIGZvciBob3QtcGx1Z2dhYmxlIEkvTyBBUElDcy4KKwkgKi8KKworCWlvYXBpYyA9IGt6YWxsb2Moc2l6ZW9mKCppb2FwaWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlvYXBpYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpb2FwaWMtPmhhbmRsZSA9IGhhbmRsZTsKKwlpb2FwaWMtPmdzaV9iYXNlID0gKHUzMikgZ3NiOworCisJaWYgKGRldi0+Y2xhc3MgPT0gUENJX0NMQVNTX1NZU1RFTV9QSUNfSU9BUElDKQorCQl0eXBlID0gIklPQVBJQyI7CisJZWxzZQorCQl0eXBlID0gIklPeEFQSUMiOworCisJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBleGl0X2ZyZWU7CisKKwlwY2lfc2V0X21hc3RlcihkZXYpOworCisJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIDAsIHR5cGUpKQorCQlnb3RvIGV4aXRfZGlzYWJsZTsKKworCWFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKTsKKwlpZiAoYWNwaV9yZWdpc3Rlcl9pb2FwaWMoaW9hcGljLT5oYW5kbGUsIGFkZHIsIGlvYXBpYy0+Z3NpX2Jhc2UpKQorCQlnb3RvIGV4aXRfcmVsZWFzZTsKKworCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIGlvYXBpYyk7CisJZGV2X2luZm8oJmRldi0+ZGV2LCAiJXMgYXQgJSNsbHgsIEdTSSAldVxuIiwgdHlwZSwgYWRkciwKKwkJIGlvYXBpYy0+Z3NpX2Jhc2UpOworCXJldHVybiAwOworCitleGl0X3JlbGVhc2U6CisJcGNpX3JlbGVhc2VfcmVnaW9uKGRldiwgMCk7CitleGl0X2Rpc2FibGU6CisJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CitleGl0X2ZyZWU6CisJa2ZyZWUoaW9hcGljKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgaW9hcGljX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBpb2FwaWMgKmlvYXBpYyA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCisJYWNwaV91bnJlZ2lzdGVyX2lvYXBpYyhpb2FwaWMtPmhhbmRsZSwgaW9hcGljLT5nc2lfYmFzZSk7CisJcGNpX3JlbGVhc2VfcmVnaW9uKGRldiwgMCk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CisJa2ZyZWUoaW9hcGljKTsKK30KKworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaW9hcGljX2RldmljZXNbXSA9IHsKKwl7IFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCisJICBQQ0lfQ0xBU1NfU1lTVEVNX1BJQ19JT0FQSUMgPDwgOCwgMHhmZmZmMDAsIH0sCisJeyBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAorCSAgUENJX0NMQVNTX1NZU1RFTV9QSUNfSU9YQVBJQyA8PCA4LCAweGZmZmYwMCwgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpb2FwaWNfZHJpdmVyID0geworCS5uYW1lCQk9ICJpb2FwaWMiLAorCS5pZF90YWJsZQk9IGlvYXBpY19kZXZpY2VzLAorCS5wcm9iZQkJPSBpb2FwaWNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChpb2FwaWNfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlvYXBpY19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmlvYXBpY19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaW9hcGljX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmlvYXBpY19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpb2FwaWNfaW5pdCk7Cittb2R1bGVfZXhpdChpb2FwaWNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9pb3YuYyBiL2RyaXZlcnMvcGNpL2lvdi5jCmluZGV4IGUwM2ZlOTguLmIyYTQ0OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2lvdi5jCisrKyBiL2RyaXZlcnMvcGNpL2lvdi5jCkBAIC01NTUsNyArNTU1LDcgQEAKIHsKIAlpbnQgcG9zOwogCi0JaWYgKCFkZXYtPmlzX3BjaWUpCisJaWYgKCFwY2lfaXNfcGNpZShkZXYpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXBvcyA9IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5KGRldiwgUENJX0VYVF9DQVBfSURfU1JJT1YpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLWFjcGkuYyBiL2RyaXZlcnMvcGNpL3BjaS1hY3BpLmMKaW5kZXggMzMzMTdkZi4uY2M2MTdkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLWFjcGkuYworKysgYi9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jCkBAIC0xMTYsNyArMTE2LDcgQEAKIAkJaW50IHJldDsKIAogCQlyZXQgPSBhY3BpX3BtX2RldmljZV9zbGVlcF93YWtlKCZicmlkZ2UtPmRldiwgZW5hYmxlKTsKLQkJaWYgKCFyZXQgfHwgYnJpZGdlLT5pc19wY2llKQorCQlpZiAoIXJldCB8fCBwY2lfaXNfcGNpZShicmlkZ2UpKQogCQkJcmV0dXJuOwogCQlidXMgPSBidXMtPnBhcmVudDsKIAl9CkBAIC0xMzEsNyArMTMxLDcgQEAKIAlpZiAoYWNwaV9wY2lfY2FuX3dha2V1cChkZXYpKQogCQlyZXR1cm4gYWNwaV9wbV9kZXZpY2Vfc2xlZXBfd2FrZSgmZGV2LT5kZXYsIGVuYWJsZSk7CiAKLQlpZiAoIWRldi0+aXNfcGNpZSkKKwlpZiAoIXBjaV9pc19wY2llKGRldikpCiAJCWFjcGlfcGNpX3Byb3BhZ2F0ZV93YWtldXBfZW5hYmxlKGRldi0+YnVzLCBlbmFibGUpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYyBiL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCmluZGV4IDBmNjM4MmYuLmM1ZGY5NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCkBAIC03NCw3ICs3NCwxMSBAQAogCWNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrOwogCWludCBsZW47CiAKKyNpZmRlZiBDT05GSUdfTlVNQQorCW1hc2sgPSBjcHVtYXNrX29mX25vZGUoZGV2X3RvX25vZGUoZGV2KSk7CisjZWxzZQogCW1hc2sgPSBjcHVtYXNrX29mX3BjaWJ1cyh0b19wY2lfZGV2KGRldiktPmJ1cyk7CisjZW5kaWYKIAlsZW4gPSBjcHVtYXNrX3NjbnByaW50ZihidWYsIFBBR0VfU0laRS0yLCBtYXNrKTsKIAlidWZbbGVuKytdID0gJ1xuJzsKIAlidWZbbGVuXSA9ICdcMCc7CkBAIC04OCw3ICs5MiwxMSBAQAogCWNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrOwogCWludCBsZW47CiAKKyNpZmRlZiBDT05GSUdfTlVNQQorCW1hc2sgPSBjcHVtYXNrX29mX25vZGUoZGV2X3RvX25vZGUoZGV2KSk7CisjZWxzZQogCW1hc2sgPSBjcHVtYXNrX29mX3BjaWJ1cyh0b19wY2lfZGV2KGRldiktPmJ1cyk7CisjZW5kaWYKIAlsZW4gPSBjcHVsaXN0X3NjbnByaW50ZihidWYsIFBBR0VfU0laRS0yLCBtYXNrKTsKIAlidWZbbGVuKytdID0gJ1xuJzsKIAlidWZbbGVuXSA9ICdcMCc7CkBAIC0xNzYsNiArMTg0LDIxIEBACiAjZW5kaWYKIAogc3RhdGljIHNzaXplX3QKK2RtYV9tYXNrX2JpdHNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CisKKwlyZXR1cm4gc3ByaW50ZiAoYnVmLCAiJWRcbiIsIGZsczY0KHBkZXYtPmRtYV9tYXNrKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90Citjb25zaXN0ZW50X2RtYV9tYXNrX2JpdHNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYgKGJ1ZiwgIiVkXG4iLCBmbHM2NChkZXYtPmNvaGVyZW50X2RtYV9tYXNrKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CiBtc2lfYnVzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOwpAQCAtMzA2LDYgKzMyOSw4IEBACiAjaWZkZWYgQ09ORklHX05VTUEKIAlfX0FUVFJfUk8obnVtYV9ub2RlKSwKICNlbmRpZgorCV9fQVRUUl9STyhkbWFfbWFza19iaXRzKSwKKwlfX0FUVFJfUk8oY29uc2lzdGVudF9kbWFfbWFza19iaXRzKSwKIAlfX0FUVFIoZW5hYmxlLCAwNjAwLCBpc19lbmFibGVkX3Nob3csIGlzX2VuYWJsZWRfc3RvcmUpLAogCV9fQVRUUihicm9rZW5fcGFyaXR5X3N0YXR1cywoU19JUlVHT3xTX0lXVVNSKSwKIAkJYnJva2VuX3Bhcml0eV9zdGF0dXNfc2hvdyxicm9rZW5fcGFyaXR5X3N0YXR1c19zdG9yZSksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaS5jCmluZGV4IDRlNGMyOTUuLjBiYzI3ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS5jCkBAIC00Nyw2ICs0NywxNSBAQAogdW5zaWduZWQgbG9uZyBwY2lfaG90cGx1Z19pb19zaXplICA9IERFRkFVTFRfSE9UUExVR19JT19TSVpFOwogdW5zaWduZWQgbG9uZyBwY2lfaG90cGx1Z19tZW1fc2l6ZSA9IERFRkFVTFRfSE9UUExVR19NRU1fU0laRTsKIAorLyoKKyAqIFRoZSBkZWZhdWx0IENMUyBpcyB1c2VkIGlmIGFyY2ggZGlkbid0IHNldCBDTFMgZXhwbGljaXRseSBhbmQgbm90CisgKiBhbGwgcGNpIGRldmljZXMgYWdyZWUgb24gdGhlIHNhbWUgdmFsdWUuICBBcmNoIGNhbiBvdmVycmlkZSBlaXRoZXIKKyAqIHRoZSBkZmwgb3IgYWN0dWFsIHZhbHVlIGFzIGl0IHNlZXMgZml0LiAgRG9uJ3QgZm9yZ2V0IHRoaXMgaXMKKyAqIG1lYXN1cmVkIGluIDMyLWJpdCB3b3Jkcywgbm90IGJ5dGVzLgorICovCit1OCBwY2lfZGZsX2NhY2hlX2xpbmVfc2l6ZSBfX2RldmluaXRkYXRhID0gTDFfQ0FDSEVfQllURVMgPj4gMjsKK3U4IHBjaV9jYWNoZV9saW5lX3NpemU7CisKIC8qKgogICogcGNpX2J1c19tYXhfYnVzbnIgLSByZXR1cm5zIG1heGltdW0gUENJIGJ1cyBudW1iZXIgb2YgZ2l2ZW4gYnVzJyBjaGlsZHJlbgogICogQGJ1czogcG9pbnRlciB0byBQQ0kgYnVzIHN0cnVjdHVyZSB0byBzZWFyY2gKQEAgLTM3Myw4ICszODIsMTIgQEAKIAkJCWNvbnRpbnVlOwkvKiBXcm9uZyB0eXBlICovCiAJCWlmICghKChyZXMtPmZsYWdzIF4gci0+ZmxhZ3MpICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkpCiAJCQlyZXR1cm4gcjsJLyogRXhhY3QgbWF0Y2ggKi8KLQkJaWYgKChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkgJiYgIShyLT5mbGFncyAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpKQotCQkJYmVzdCA9IHI7CS8qIEFwcHJveGltYXRpbmcgcHJlZmV0Y2hhYmxlIGJ5IG5vbi1wcmVmZXRjaGFibGUgKi8KKwkJLyogV2UgY2FuJ3QgaW5zZXJ0IGEgbm9uLXByZWZldGNoIHJlc291cmNlIGluc2lkZSBhIHByZWZldGNoYWJsZSBwYXJlbnQgLi4gKi8KKwkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkKKwkJCWNvbnRpbnVlOworCQkvKiAuLiBidXQgd2UgY2FuIHB1dCBhIHByZWZldGNoYWJsZSByZXNvdXJjZSBpbnNpZGUgYSBub24tcHJlZmV0Y2hhYmxlIG9uZSAqLworCQlpZiAoIWJlc3QpCisJCQliZXN0ID0gcjsKIAl9CiAJcmV0dXJuIGJlc3Q7CiB9CkBAIC03MjgsOCArNzQxLDggQEAKIAl1MTYgKmNhcDsKIAl1MTYgZmxhZ3M7CiAKLQlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9FWFApOwotCWlmIChwb3MgPD0gMCkKKwlwb3MgPSBwY2lfcGNpZV9jYXAoZGV2KTsKKwlpZiAoIXBvcykKIAkJcmV0dXJuIDA7CiAKIAlzYXZlX3N0YXRlID0gcGNpX2ZpbmRfc2F2ZWRfY2FwKGRldiwgUENJX0NBUF9JRF9FWFApOwpAQCAtODM3LDcgKzg1MCw3IEBACiAJaW50IGk7CiAJLyogWFhYOiAxMDAlIGR3b3JkIGFjY2VzcyBvayBoZXJlPyAqLwogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBpICogNCwmZGV2LT5zYXZlZF9jb25maWdfc3BhY2VbaV0pOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBpICogNCwgJmRldi0+c2F2ZWRfY29uZmlnX3NwYWNlW2ldKTsKIAlkZXYtPnN0YXRlX3NhdmVkID0gdHJ1ZTsKIAlpZiAoKGkgPSBwY2lfc2F2ZV9wY2llX3N0YXRlKGRldikpICE9IDApCiAJCXJldHVybiBpOwpAQCAtMTIwMiw3ICsxMjE1LDcgQEAKIAogCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIGRldi0+cG1fY2FwICsgUENJX1BNX0NUUkwsIHBtY3NyKTsKIAotCWRldl9wcmludGsoS0VSTl9JTkZPLCAmZGV2LT5kZXYsICJQTUUjICVzXG4iLAorCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmRldi0+ZGV2LCAiUE1FIyAlc1xuIiwKIAkJCWVuYWJsZSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwogfQogCkBAIC0xNDEzLDcgKzE0MjYsOCBAQAogCiAJcG1jICY9IFBDSV9QTV9DQVBfUE1FX01BU0s7CiAJaWYgKHBtYykgewotCQlkZXZfaW5mbygmZGV2LT5kZXYsICJQTUUjIHN1cHBvcnRlZCBmcm9tJXMlcyVzJXMlc1xuIiwKKwkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXYsCisJCQkgIlBNRSMgc3VwcG9ydGVkIGZyb20lcyVzJXMlcyVzXG4iLAogCQkJIChwbWMgJiBQQ0lfUE1fQ0FQX1BNRV9EMCkgPyAiIEQwIiA6ICIiLAogCQkJIChwbWMgJiBQQ0lfUE1fQ0FQX1BNRV9EMSkgPyAiIEQxIiA6ICIiLAogCQkJIChwbWMgJiBQQ0lfUE1fQ0FQX1BNRV9EMikgPyAiIEQyIiA6ICIiLApAQCAtMTUxMCw3ICsxNTI0LDcgQEAKIAl1MTYgY3RybDsKIAlzdHJ1Y3QgcGNpX2RldiAqYnJpZGdlOwogCi0JaWYgKCFkZXYtPmlzX3BjaWUgfHwgZGV2LT5kZXZmbikKKwlpZiAoIXBjaV9pc19wY2llKGRldikgfHwgZGV2LT5kZXZmbikKIAkJcmV0dXJuOwogCiAJcG9zID0gcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkoZGV2LCBQQ0lfRVhUX0NBUF9JRF9BUkkpOwpAQCAtMTUxOCwxMCArMTUzMiwxMCBAQAogCQlyZXR1cm47CiAKIAlicmlkZ2UgPSBkZXYtPmJ1cy0+c2VsZjsKLQlpZiAoIWJyaWRnZSB8fCAhYnJpZGdlLT5pc19wY2llKQorCWlmICghYnJpZGdlIHx8ICFwY2lfaXNfcGNpZShicmlkZ2UpKQogCQlyZXR1cm47CiAKLQlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGJyaWRnZSwgUENJX0NBUF9JRF9FWFApOworCXBvcyA9IHBjaV9wY2llX2NhcChicmlkZ2UpOwogCWlmICghcG9zKQogCQlyZXR1cm47CiAKQEAgLTE1MzYsNiArMTU1MCw1NCBAQAogCWJyaWRnZS0+YXJpX2VuYWJsZWQgPSAxOwogfQogCitzdGF0aWMgaW50IHBjaV9hY3NfZW5hYmxlOworCisvKioKKyAqIHBjaV9yZXF1ZXN0X2FjcyAtIGFzayBmb3IgQUNTIHRvIGJlIGVuYWJsZWQgaWYgc3VwcG9ydGVkCisgKi8KK3ZvaWQgcGNpX3JlcXVlc3RfYWNzKHZvaWQpCit7CisJcGNpX2Fjc19lbmFibGUgPSAxOworfQorCisvKioKKyAqIHBjaV9lbmFibGVfYWNzIC0gZW5hYmxlIEFDUyBpZiBoYXJkd2FyZSBzdXBwb3J0IGl0CisgKiBAZGV2OiB0aGUgUENJIGRldmljZQorICovCit2b2lkIHBjaV9lbmFibGVfYWNzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IHBvczsKKwl1MTYgY2FwOworCXUxNiBjdHJsOworCisJaWYgKCFwY2lfYWNzX2VuYWJsZSkKKwkJcmV0dXJuOworCisJaWYgKCFwY2lfaXNfcGNpZShkZXYpKQorCQlyZXR1cm47CisKKwlwb3MgPSBwY2lfZmluZF9leHRfY2FwYWJpbGl0eShkZXYsIFBDSV9FWFRfQ0FQX0lEX0FDUyk7CisJaWYgKCFwb3MpCisJCXJldHVybjsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0FDU19DQVAsICZjYXApOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0FDU19DVFJMLCAmY3RybCk7CisKKwkvKiBTb3VyY2UgVmFsaWRhdGlvbiAqLworCWN0cmwgfD0gKGNhcCAmIFBDSV9BQ1NfU1YpOworCisJLyogUDJQIFJlcXVlc3QgUmVkaXJlY3QgKi8KKwljdHJsIHw9IChjYXAgJiBQQ0lfQUNTX1JSKTsKKworCS8qIFAyUCBDb21wbGV0aW9uIFJlZGlyZWN0ICovCisJY3RybCB8PSAoY2FwICYgUENJX0FDU19DUik7CisKKwkvKiBVcHN0cmVhbSBGb3J3YXJkaW5nICovCisJY3RybCB8PSAoY2FwICYgUENJX0FDU19VRik7CisKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBwb3MgKyBQQ0lfQUNTX0NUUkwsIGN0cmwpOworfQorCiAvKioKICAqIHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4gLSBzd2l6emxlIElOVHggZm9yIGRldmljZSBiZWhpbmQgYnJpZGdlCiAgKiBAZGV2OiB0aGUgUENJIGRldmljZQpAQCAtMTY2OSw5ICsxNzMxLDcgQEAKIAlyZXR1cm4gMDsKIAogZXJyX291dDoKLQlkZXZfd2FybigmcGRldi0+ZGV2LCAiQkFSICVkOiBjYW4ndCByZXNlcnZlICVzIHJlZ2lvbiAlcFJcbiIsCi0JCSBiYXIsCi0JCSBwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgYmFyKSAmIElPUkVTT1VSQ0VfSU8gPyAiSS9PIiA6ICJtZW0iLAorCWRldl93YXJuKCZwZGV2LT5kZXYsICJCQVIgJWQ6IGNhbid0IHJlc2VydmUgJXBSXG4iLCBiYXIsCiAJCSAmcGRldi0+cmVzb3VyY2VbYmFyXSk7CiAJcmV0dXJuIC1FQlVTWTsKIH0KQEAgLTE4NjYsMzEgKzE5MjYsNiBAQAogCV9fcGNpX3NldF9tYXN0ZXIoZGV2LCBmYWxzZSk7CiB9CiAKLSNpZmRlZiBQQ0lfRElTQUJMRV9NV0kKLWludCBwY2lfc2V0X213aShzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXJldHVybiAwOwotfQotCi1pbnQgcGNpX3RyeV9zZXRfbXdpKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgcGNpX2NsZWFyX213aShzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotfQotCi0jZWxzZQotCi0jaWZuZGVmIFBDSV9DQUNIRV9MSU5FX0JZVEVTCi0jZGVmaW5lIFBDSV9DQUNIRV9MSU5FX0JZVEVTIEwxX0NBQ0hFX0JZVEVTCi0jZW5kaWYKLQotLyogVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhcmNoIGNvZGUuICovCi0vKiBEb24ndCBmb3JnZXQgdGhpcyBpcyBtZWFzdXJlZCBpbiAzMi1iaXQgd29yZHMsIG5vdCBieXRlcyAqLwotdTggcGNpX2NhY2hlX2xpbmVfc2l6ZSA9IFBDSV9DQUNIRV9MSU5FX0JZVEVTIC8gNDsKLQogLyoqCiAgKiBwY2lfc2V0X2NhY2hlbGluZV9zaXplIC0gZW5zdXJlIHRoZSBDQUNIRV9MSU5FX1NJWkUgcmVnaXN0ZXIgaXMgcHJvZ3JhbW1lZAogICogQGRldjogdGhlIFBDSSBkZXZpY2UgZm9yIHdoaWNoIE1XSSBpcyB0byBiZSBlbmFibGVkCkBAIC0xOTAxLDEzICsxOTM2LDEyIEBACiAgKgogICogUkVUVVJOUzogQW4gYXBwcm9wcmlhdGUgLUVSUk5PIGVycm9yIHZhbHVlIG9uIGVycm9yLCBvciB6ZXJvIGZvciBzdWNjZXNzLgogICovCi1zdGF0aWMgaW50Ci1wY2lfc2V0X2NhY2hlbGluZV9zaXplKHN0cnVjdCBwY2lfZGV2ICpkZXYpCitpbnQgcGNpX3NldF9jYWNoZWxpbmVfc2l6ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXU4IGNhY2hlbGluZV9zaXplOwogCiAJaWYgKCFwY2lfY2FjaGVfbGluZV9zaXplKQotCQlyZXR1cm4gLUVJTlZBTDsJCS8qIFRoZSBzeXN0ZW0gZG9lc24ndCBzdXBwb3J0IE1XSS4gKi8KKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBWYWxpZGF0ZSBjdXJyZW50IHNldHRpbmc6IHRoZSBQQ0lfQ0FDSEVfTElORV9TSVpFIG11c3QgYmUKIAkgICBlcXVhbCB0byBvciBtdWx0aXBsZSBvZiB0aGUgcmlnaHQgdmFsdWUuICovCkBAIC0xOTI4LDYgKzE5NjIsMjQgQEAKIAogCXJldHVybiAtRUlOVkFMOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpX3NldF9jYWNoZWxpbmVfc2l6ZSk7CisKKyNpZmRlZiBQQ0lfRElTQUJMRV9NV0kKK2ludCBwY2lfc2V0X213aShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXJldHVybiAwOworfQorCitpbnQgcGNpX3RyeV9zZXRfbXdpKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcGNpX2NsZWFyX213aShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworfQorCisjZWxzZQogCiAvKioKICAqIHBjaV9zZXRfbXdpIC0gZW5hYmxlcyBtZW1vcnktd3JpdGUtaW52YWxpZGF0ZSBQQ0kgdHJhbnNhY3Rpb24KQEAgLTIwNjIsNiArMjExNCw3IEBACiAJCXJldHVybiAtRUlPOwogCiAJZGV2LT5kbWFfbWFzayA9IG1hc2s7CisJZGV2X2RiZygmZGV2LT5kZXYsICJ1c2luZyAlZGJpdCBETUEgbWFza1xuIiwgZmxzNjQobWFzaykpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMDczLDYgKzIxMjYsNyBAQAogCQlyZXR1cm4gLUVJTzsKIAogCWRldi0+ZGV2LmNvaGVyZW50X2RtYV9tYXNrID0gbWFzazsKKwlkZXZfZGJnKCZkZXYtPmRldiwgInVzaW5nICVkYml0IGNvbnNpc3RlbnQgRE1BIG1hc2tcbiIsIGZsczY0KG1hc2spKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjA5OSw5ICsyMTUzLDkgQEAKIAlpbnQgaTsKIAlpbnQgcG9zOwogCXUzMiBjYXA7Ci0JdTE2IHN0YXR1czsKKwl1MTYgc3RhdHVzLCBjb250cm9sOwogCi0JcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfRVhQKTsKKwlwb3MgPSBwY2lfcGNpZV9jYXAoZGV2KTsKIAlpZiAoIXBvcykKIAkJcmV0dXJuIC1FTk9UVFk7CiAKQEAgLTIxMjYsOCArMjE4MCwxMCBAQAogCQkJInByb2NlZWRpbmcgd2l0aCByZXNldCBhbnl3YXlcbiIpOwogCiBjbGVhcjoKLQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBwb3MgKyBQQ0lfRVhQX0RFVkNUTCwKLQkJCQlQQ0lfRVhQX0RFVkNUTF9CQ1JfRkxSKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHBvcyArIFBDSV9FWFBfREVWQ1RMLCAmY29udHJvbCk7CisJY29udHJvbCB8PSBQQ0lfRVhQX0RFVkNUTF9CQ1JfRkxSOworCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIHBvcyArIFBDSV9FWFBfREVWQ1RMLCBjb250cm9sKTsKKwogCW1zbGVlcCgxMDApOwogCiAJcmV0dXJuIDA7CkBAIC0yNDUwLDcgKzI1MDYsNyBAQAogCWludCByZXQsIGNhcDsKIAl1MTYgY3RsOwogCi0JY2FwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfRVhQKTsKKwljYXAgPSBwY2lfcGNpZV9jYXAoZGV2KTsKIAlpZiAoIWNhcCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTI0ODAsNyArMjUzNiw3IEBACiAKIAl2ID0gKGZmcyhycSkgLSA4KSA8PCAxMjsKIAotCWNhcCA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CisJY2FwID0gcGNpX3BjaWVfY2FwKGRldik7CiAJaWYgKCFjYXApCiAJCWdvdG8gb3V0OwogCkBAIC0yNTQwLDcgKzI1OTYsNyBAQAogCQkJcmV0dXJuIHJlZzsKIAl9CiAKLQlkZXZfZXJyKCZkZXYtPmRldiwgIkJBUjogaW52YWxpZCByZXNvdXJjZSAjJWRcbiIsIHJlc25vKTsKKwlkZXZfZXJyKCZkZXYtPmRldiwgIkJBUiAlZDogaW52YWxpZCByZXNvdXJjZVxuIiwgcmVzbm8pOwogCXJldHVybiAwOwogfQogCkBAIC0yNTkwLDcgKzI2NDYsNyBAQAogCiAjZGVmaW5lIFJFU09VUkNFX0FMSUdOTUVOVF9QQVJBTV9TSVpFIENPTU1BTkRfTElORV9TSVpFCiBzdGF0aWMgY2hhciByZXNvdXJjZV9hbGlnbm1lbnRfcGFyYW1bUkVTT1VSQ0VfQUxJR05NRU5UX1BBUkFNX1NJWkVdID0gezB9Owotc3BpbmxvY2tfdCByZXNvdXJjZV9hbGlnbm1lbnRfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socmVzb3VyY2VfYWxpZ25tZW50X2xvY2spOwogCiAvKioKICAqIHBjaV9zcGVjaWZpZWRfcmVzb3VyY2VfYWxpZ25tZW50IC0gZ2V0IHJlc291cmNlIGFsaWdubWVudCBzcGVjaWZpZWQgYnkgdXNlci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS5oIGIvZHJpdmVycy9wY2kvcGNpLmgKaW5kZXggZDkyZDE5NS4uMzNlZDhlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLmgKKysrIGIvZHJpdmVycy9wY2kvcGNpLmgKQEAgLTMxMSw0ICszMTEsNiBAQAogCXJldHVybiByZXNvdXJjZV9hbGlnbm1lbnQocmVzKTsKIH0KIAorZXh0ZXJuIHZvaWQgcGNpX2VuYWJsZV9hY3Moc3RydWN0IHBjaV9kZXYgKmRldik7CisKICNlbmRpZiAvKiBEUklWRVJTX1BDSV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJfaW5qZWN0LmMgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJfaW5qZWN0LmMKaW5kZXggNjJkMTVmNi4uN2ZjZDUzMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2Flcl9pbmplY3QuYworKysgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJfaW5qZWN0LmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlICJhZXJkcnYuaCIKIAogc3RydWN0IGFlcl9lcnJvcl9pbmogewpAQCAtMzUsMTAgKzM2LDEyIEBACiAJdTMyIGhlYWRlcl9sb2cxOwogCXUzMiBoZWFkZXJfbG9nMjsKIAl1MzIgaGVhZGVyX2xvZzM7CisJdTE2IGRvbWFpbjsKIH07CiAKIHN0cnVjdCBhZXJfZXJyb3IgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1MTYgZG9tYWluOwogCXVuc2lnbmVkIGludCBidXM7CiAJdW5zaWduZWQgaW50IGRldmZuOwogCWludCBwb3NfY2FwX2VycjsKQEAgLTY2LDIyICs2OSwyNyBAQAogLyogUHJvdGVjdCBlaW5qZWN0ZWQgYW5kIHBjaV9idXNfb3BzX2xpc3QgKi8KIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaW5qZWN0X2xvY2spOwogCi1zdGF0aWMgdm9pZCBhZXJfZXJyb3JfaW5pdChzdHJ1Y3QgYWVyX2Vycm9yICplcnIsIHVuc2lnbmVkIGludCBidXMsCi0JCQkgICB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCBwb3NfY2FwX2VycikKK3N0YXRpYyB2b2lkIGFlcl9lcnJvcl9pbml0KHN0cnVjdCBhZXJfZXJyb3IgKmVyciwgdTE2IGRvbWFpbiwKKwkJCSAgIHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJCSAgIGludCBwb3NfY2FwX2VycikKIHsKIAlJTklUX0xJU1RfSEVBRCgmZXJyLT5saXN0KTsKKwllcnItPmRvbWFpbiA9IGRvbWFpbjsKIAllcnItPmJ1cyA9IGJ1czsKIAllcnItPmRldmZuID0gZGV2Zm47CiAJZXJyLT5wb3NfY2FwX2VyciA9IHBvc19jYXBfZXJyOwogfQogCiAvKiBpbmplY3RfbG9jayBtdXN0IGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcgKi8KLXN0YXRpYyBzdHJ1Y3QgYWVyX2Vycm9yICpfX2ZpbmRfYWVyX2Vycm9yKHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZmbikKK3N0YXRpYyBzdHJ1Y3QgYWVyX2Vycm9yICpfX2ZpbmRfYWVyX2Vycm9yKHUxNiBkb21haW4sIHVuc2lnbmVkIGludCBidXMsCisJCQkJCSAgdW5zaWduZWQgaW50IGRldmZuKQogewogCXN0cnVjdCBhZXJfZXJyb3IgKmVycjsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZXJyLCAmZWluamVjdGVkLCBsaXN0KSB7Ci0JCWlmIChidXMgPT0gZXJyLT5idXMgJiYgZGV2Zm4gPT0gZXJyLT5kZXZmbikKKwkJaWYgKGRvbWFpbiA9PSBlcnItPmRvbWFpbiAmJgorCQkgICAgYnVzID09IGVyci0+YnVzICYmCisJCSAgICBkZXZmbiA9PSBlcnItPmRldmZuKQogCQkJcmV0dXJuIGVycjsKIAl9CiAJcmV0dXJuIE5VTEw7CkBAIC05MCw3ICs5OCwxMCBAQAogLyogaW5qZWN0X2xvY2sgbXVzdCBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nICovCiBzdGF0aWMgc3RydWN0IGFlcl9lcnJvciAqX19maW5kX2Flcl9lcnJvcl9ieV9kZXYoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlyZXR1cm4gX19maW5kX2Flcl9lcnJvcihkZXYtPmJ1cy0+bnVtYmVyLCBkZXYtPmRldmZuKTsKKwlpbnQgZG9tYWluID0gcGNpX2RvbWFpbl9ucihkZXYtPmJ1cyk7CisJaWYgKGRvbWFpbiA8IDApCisJCXJldHVybiBOVUxMOworCXJldHVybiBfX2ZpbmRfYWVyX2Vycm9yKCh1MTYpZG9tYWluLCBkZXYtPmJ1cy0+bnVtYmVyLCBkZXYtPmRldmZuKTsKIH0KIAogLyogaW5qZWN0X2xvY2sgbXVzdCBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nICovCkBAIC0xNzIsMTEgKzE4MywxNSBAQAogCXN0cnVjdCBhZXJfZXJyb3IgKmVycjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBwY2lfb3BzICpvcHM7CisJaW50IGRvbWFpbjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpbmplY3RfbG9jaywgZmxhZ3MpOwogCWlmIChzaXplICE9IHNpemVvZih1MzIpKQogCQlnb3RvIG91dDsKLQllcnIgPSBfX2ZpbmRfYWVyX2Vycm9yKGJ1cy0+bnVtYmVyLCBkZXZmbik7CisJZG9tYWluID0gcGNpX2RvbWFpbl9ucihidXMpOworCWlmIChkb21haW4gPCAwKQorCQlnb3RvIG91dDsKKwllcnIgPSBfX2ZpbmRfYWVyX2Vycm9yKCh1MTYpZG9tYWluLCBidXMtPm51bWJlciwgZGV2Zm4pOwogCWlmICghZXJyKQogCQlnb3RvIG91dDsKIApAQCAtMjAwLDExICsyMTUsMTUgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBydzFjczsKIAlzdHJ1Y3QgcGNpX29wcyAqb3BzOworCWludCBkb21haW47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW5qZWN0X2xvY2ssIGZsYWdzKTsKIAlpZiAoc2l6ZSAhPSBzaXplb2YodTMyKSkKIAkJZ290byBvdXQ7Ci0JZXJyID0gX19maW5kX2Flcl9lcnJvcihidXMtPm51bWJlciwgZGV2Zm4pOworCWRvbWFpbiA9IHBjaV9kb21haW5fbnIoYnVzKTsKKwlpZiAoZG9tYWluIDwgMCkKKwkJZ290byBvdXQ7CisJZXJyID0gX19maW5kX2Flcl9lcnJvcigodTE2KWRvbWFpbiwgYnVzLT5udW1iZXIsIGRldmZuKTsKIAlpZiAoIWVycikKIAkJZ290byBvdXQ7CiAKQEAgLTI2Miw3ICsyODEsNyBAQAogc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpwY2llX2ZpbmRfcm9vdF9wb3J0KHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJd2hpbGUgKDEpIHsKLQkJaWYgKCFkZXYtPmlzX3BjaWUpCisJCWlmICghcGNpX2lzX3BjaWUoZGV2KSkKIAkJCWJyZWFrOwogCQlpZiAoZGV2LT5wY2llX3R5cGUgPT0gUENJX0VYUF9UWVBFX1JPT1RfUE9SVCkKIAkJCXJldHVybiBkZXY7CkBAIC0zMDUsMjUgKzMyNCwyNSBAQAogCXUzMiBzZXZlcjsKIAlpbnQgcmV0ID0gMDsKIAotCWRldiA9IHBjaV9nZXRfYnVzX2FuZF9zbG90KGVpbmotPmJ1cywgZGV2Zm4pOworCWRldiA9IHBjaV9nZXRfZG9tYWluX2J1c19hbmRfc2xvdCgoaW50KWVpbmotPmRvbWFpbiwgZWluai0+YnVzLCBkZXZmbik7CiAJaWYgKCFkZXYpCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gLUVOT0RFVjsKIAlycGRldiA9IHBjaWVfZmluZF9yb290X3BvcnQoZGV2KTsKIAlpZiAoIXJwZGV2KSB7Ci0JCXJldCA9IC1FSU5WQUw7CisJCXJldCA9IC1FTk9UVFk7CiAJCWdvdG8gb3V0X3B1dDsKIAl9CiAKIAlwb3NfY2FwX2VyciA9IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5KGRldiwgUENJX0VYVF9DQVBfSURfRVJSKTsKIAlpZiAoIXBvc19jYXBfZXJyKSB7Ci0JCXJldCA9IC1FSU87CisJCXJldCA9IC1FTk9UVFk7CiAJCWdvdG8gb3V0X3B1dDsKIAl9CiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcG9zX2NhcF9lcnIgKyBQQ0lfRVJSX1VOQ09SX1NFVkVSLCAmc2V2ZXIpOwogCiAJcnBfcG9zX2NhcF9lcnIgPSBwY2lfZmluZF9leHRfY2FwYWJpbGl0eShycGRldiwgUENJX0VYVF9DQVBfSURfRVJSKTsKIAlpZiAoIXJwX3Bvc19jYXBfZXJyKSB7Ci0JCXJldCA9IC1FSU87CisJCXJldCA9IC1FTk9UVFk7CiAJCWdvdG8gb3V0X3B1dDsKIAl9CiAKQEAgLTM0NCw3ICszNjMsOCBAQAogCWlmICghZXJyKSB7CiAJCWVyciA9IGVycl9hbGxvYzsKIAkJZXJyX2FsbG9jID0gTlVMTDsKLQkJYWVyX2Vycm9yX2luaXQoZXJyLCBlaW5qLT5idXMsIGRldmZuLCBwb3NfY2FwX2Vycik7CisJCWFlcl9lcnJvcl9pbml0KGVyciwgZWluai0+ZG9tYWluLCBlaW5qLT5idXMsIGRldmZuLAorCQkJICAgICAgIHBvc19jYXBfZXJyKTsKIAkJbGlzdF9hZGQoJmVyci0+bGlzdCwgJmVpbmplY3RlZCk7CiAJfQogCWVyci0+dW5jb3Jfc3RhdHVzIHw9IGVpbmotPnVuY29yX3N0YXR1czsKQEAgLTM1OCw3ICszNzgsOCBAQAogCWlmICghcnBlcnIpIHsKIAkJcnBlcnIgPSBycGVycl9hbGxvYzsKIAkJcnBlcnJfYWxsb2MgPSBOVUxMOwotCQlhZXJfZXJyb3JfaW5pdChycGVyciwgcnBkZXYtPmJ1cy0+bnVtYmVyLCBycGRldi0+ZGV2Zm4sCisJCWFlcl9lcnJvcl9pbml0KHJwZXJyLCBwY2lfZG9tYWluX25yKHJwZGV2LT5idXMpLAorCQkJICAgICAgIHJwZGV2LT5idXMtPm51bWJlciwgcnBkZXYtPmRldmZuLAogCQkJICAgICAgIHJwX3Bvc19jYXBfZXJyKTsKIAkJbGlzdF9hZGQoJnJwZXJyLT5saXN0LCAmZWluamVjdGVkKTsKIAl9CkBAIC00MTEsMTAgKzQzMiwxMSBAQAogCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwotCi0JaWYgKHVzaXplICE9IHNpemVvZihzdHJ1Y3QgYWVyX2Vycm9yX2luaikpCisJaWYgKHVzaXplIDwgb2Zmc2V0b2Yoc3RydWN0IGFlcl9lcnJvcl9pbmosIGRvbWFpbikgfHwKKwkgICAgdXNpemUgPiBzaXplb2YoZWluaikpCiAJCXJldHVybiAtRUlOVkFMOwogCisJbWVtc2V0KCZlaW5qLCAwLCBzaXplb2YoZWluaikpOwogCWlmIChjb3B5X2Zyb21fdXNlcigmZWluaiwgdWJ1ZiwgdXNpemUpKQogCQlyZXR1cm4gLUVGQVVMVDsKIApAQCAtNDUyLDcgKzQ3NCw3IEBACiAJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmluamVjdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVyciwgZXJyX25leHQsICZwY2lfYnVzX29wc19saXN0LCBsaXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVyciwgZXJyX25leHQsICZlaW5qZWN0ZWQsIGxpc3QpIHsKIAkJbGlzdF9kZWwoJmVyci0+bGlzdCk7CiAJCWtmcmVlKGVycik7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2LmMgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnYuYwppbmRleCA0MGMzY2M1Li45N2EzNDU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnYuYworKysgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnYuYwpAQCAtNTMsNyArNTMsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBjaWVfcG9ydF9zZXJ2aWNlX2RyaXZlciBhZXJkcml2ZXIgPSB7CiAJLm5hbWUJCT0gImFlciIsCi0JLnBvcnRfdHlwZQk9IFBDSUVfUkNfUE9SVCwKKwkucG9ydF90eXBlCT0gUENJX0VYUF9UWVBFX1JPT1RfUE9SVCwKIAkuc2VydmljZQk9IFBDSUVfUE9SVF9TRVJWSUNFX0FFUiwKIAogCS5wcm9iZQkJPSBhZXJfcHJvYmUsCkBAIC0yOTUsNyArMjk1LDcgQEAKIAl1MTYgcmVnMTY7CiAKIAkvKiBDbGVhbiB1cCBSb290IGRldmljZSBzdGF0dXMgKi8KLQlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9FWFApOworCXBvcyA9IHBjaV9wY2llX2NhcChkZXYpOwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0VYUF9ERVZTVEEsICZyZWcxNik7CiAJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0VYUF9ERVZTVEEsIHJlZzE2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2NvcmUuYyBiL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydl9jb3JlLmMKaW5kZXggOWY1Y2NiZS4uYWU2NzJjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfY29yZS5jCkBAIC0zNSwxMSArMzUsMTQgQEAKIAl1MTYgcmVnMTYgPSAwOwogCWludCBwb3M7CiAKKwlpZiAoZGV2LT5hZXJfZmlybXdhcmVfZmlyc3QpCisJCXJldHVybiAtRUlPOworCiAJcG9zID0gcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkoZGV2LCBQQ0lfRVhUX0NBUF9JRF9FUlIpOwogCWlmICghcG9zKQogCQlyZXR1cm4gLUVJTzsKIAotCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CisJcG9zID0gcGNpX3BjaWVfY2FwKGRldik7CiAJaWYgKCFwb3MpCiAJCXJldHVybiAtRUlPOwogCkBAIC02MCw3ICs2MywxMCBAQAogCXUxNiByZWcxNiA9IDA7CiAJaW50IHBvczsKIAotCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CisJaWYgKGRldi0+YWVyX2Zpcm13YXJlX2ZpcnN0KQorCQlyZXR1cm4gLUVJTzsKKworCXBvcyA9IHBjaV9wY2llX2NhcChkZXYpOwogCWlmICghcG9zKQogCQlyZXR1cm4gLUVJTzsKIApAQCAtNzgsNDggKzg0LDI3IEBACiBpbnQgcGNpX2NsZWFudXBfYWVyX3VuY29ycmVjdF9lcnJvcl9zdGF0dXMoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlpbnQgcG9zOwotCXUzMiBzdGF0dXMsIG1hc2s7Ci0KLQlwb3MgPSBwY2lfZmluZF9leHRfY2FwYWJpbGl0eShkZXYsIFBDSV9FWFRfQ0FQX0lEX0VSUik7Ci0JaWYgKCFwb3MpCi0JCXJldHVybiAtRUlPOwotCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcG9zICsgUENJX0VSUl9VTkNPUl9TVEFUVVMsICZzdGF0dXMpOwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9FUlJfVU5DT1JfU0VWRVIsICZtYXNrKTsKLQlpZiAoZGV2LT5lcnJvcl9zdGF0ZSA9PSBwY2lfY2hhbm5lbF9pb19ub3JtYWwpCi0JCXN0YXR1cyAmPSB+bWFzazsgLyogQ2xlYXIgY29ycmVzcG9uZGluZyBub25mYXRhbCBiaXRzICovCi0JZWxzZQotCQlzdGF0dXMgJj0gbWFzazsgLyogQ2xlYXIgY29ycmVzcG9uZGluZyBmYXRhbCBiaXRzICovCi0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9FUlJfVU5DT1JfU1RBVFVTLCBzdGF0dXMpOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChwY2lfY2xlYW51cF9hZXJfdW5jb3JyZWN0X2Vycm9yX3N0YXR1cyk7Ci0KLSNpZiAwCi1pbnQgcGNpX2NsZWFudXBfYWVyX2NvcnJlY3RfZXJyb3Jfc3RhdHVzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0JaW50IHBvczsKIAl1MzIgc3RhdHVzOwogCiAJcG9zID0gcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkoZGV2LCBQQ0lfRVhUX0NBUF9JRF9FUlIpOwogCWlmICghcG9zKQogCQlyZXR1cm4gLUVJTzsKIAotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9FUlJfQ09SX1NUQVRVUywgJnN0YXR1cyk7Ci0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9FUlJfQ09SX1NUQVRVUywgc3RhdHVzKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBwb3MgKyBQQ0lfRVJSX1VOQ09SX1NUQVRVUywgJnN0YXR1cyk7CisJaWYgKHN0YXR1cykKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9FUlJfVU5DT1JfU1RBVFVTLCBzdGF0dXMpOwogCiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYgIC8qICAwICAqLworRVhQT1JUX1NZTUJPTF9HUEwocGNpX2NsZWFudXBfYWVyX3VuY29ycmVjdF9lcnJvcl9zdGF0dXMpOwogCiBzdGF0aWMgaW50IHNldF9kZXZpY2VfZXJyb3JfcmVwb3J0aW5nKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHZvaWQgKmRhdGEpCiB7CiAJYm9vbCBlbmFibGUgPSAqKChib29sICopZGF0YSk7CiAKLQlpZiAoZGV2LT5wY2llX3R5cGUgPT0gUENJRV9SQ19QT1JUIHx8Ci0JICAgIGRldi0+cGNpZV90eXBlID09IFBDSUVfU1dfVVBTVFJFQU1fUE9SVCB8fAotCSAgICBkZXYtPnBjaWVfdHlwZSA9PSBQQ0lFX1NXX0RPV05TVFJFQU1fUE9SVCkgeworCWlmICgoZGV2LT5wY2llX3R5cGUgPT0gUENJX0VYUF9UWVBFX1JPT1RfUE9SVCkgfHwKKwkgICAgKGRldi0+cGNpZV90eXBlID09IFBDSV9FWFBfVFlQRV9VUFNUUkVBTSkgfHwKKwkgICAgKGRldi0+cGNpZV90eXBlID09IFBDSV9FWFBfVFlQRV9ET1dOU1RSRUFNKSkgewogCQlpZiAoZW5hYmxlKQogCQkJcGNpX2VuYWJsZV9wY2llX2Vycm9yX3JlcG9ydGluZyhkZXYpOwogCQllbHNlCkBAIC0yMTgsNyArMjAzLDcgQEAKIAkgKi8KIAlpZiAoYXRvbWljX3JlYWQoJmRldi0+ZW5hYmxlX2NudCkgPT0gMCkKIAkJcmV0dXJuIDA7Ci0JcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfRVhQKTsKKwlwb3MgPSBwY2lfcGNpZV9jYXAoZGV2KTsKIAlpZiAoIXBvcykKIAkJcmV0dXJuIDA7CiAJLyogQ2hlY2sgaWYgQUVSIGlzIGVuYWJsZWQgKi8KQEAgLTQzMSwxMCArNDE2LDkgQEAKIAlyZXN1bHQgPSAoc3RydWN0IGZpbmRfYWVyX3NlcnZpY2VfZGF0YSAqKSBkYXRhOwogCiAJaWYgKGRldmljZS0+YnVzID09ICZwY2llX3BvcnRfYnVzX3R5cGUpIHsKLQkJc3RydWN0IHBjaWVfcG9ydF9kYXRhICpwb3J0X2RhdGE7CisJCXN0cnVjdCBwY2llX2RldmljZSAqcGNpZSA9IHRvX3BjaWVfZGV2aWNlKGRldmljZSk7CiAKLQkJcG9ydF9kYXRhID0gcGNpX2dldF9kcnZkYXRhKHRvX3BjaWVfZGV2aWNlKGRldmljZSktPnBvcnQpOwotCQlpZiAocG9ydF9kYXRhLT5wb3J0X3R5cGUgPT0gUENJRV9TV19ET1dOU1RSRUFNX1BPUlQpCisJCWlmIChwY2llLT5wb3J0LT5wY2llX3R5cGUgPT0gUENJX0VYUF9UWVBFX0RPV05TVFJFQU0pCiAJCQlyZXN1bHQtPmlzX2Rvd25zdHJlYW0gPSAxOwogCiAJCWRyaXZlciA9IGRldmljZS0+ZHJpdmVyOwpAQCAtNjEyLDcgKzU5Niw3IEBACiAJdTE2IHJlZzE2OwogCXUzMiByZWczMjsKIAotCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9FWFApOworCXBvcyA9IHBjaV9wY2llX2NhcChwZGV2KTsKIAkvKiBDbGVhciBQQ0lFIENhcGFiaWxpdHkncyBEZXZpY2UgU3RhdHVzICovCiAJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgcG9zK1BDSV9FWFBfREVWU1RBLCAmcmVnMTYpOwogCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBwb3MrUENJX0VYUF9ERVZTVEEsIHJlZzE2KTsKQEAgLTg3NCw4ICs4NTgsMjIgQEAKICAqLwogaW50IGFlcl9pbml0KHN0cnVjdCBwY2llX2RldmljZSAqZGV2KQogewotCWlmIChhZXJfb3NjX3NldHVwKGRldikgJiYgIWZvcmNlbG9hZCkKLQkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoZGV2LT5wb3J0LT5hZXJfZmlybXdhcmVfZmlyc3QpIHsKKwkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXZpY2UsCisJCQkgICAiUENJZSBlcnJvcnMgaGFuZGxlZCBieSBwbGF0Zm9ybSBmaXJtd2FyZS5cbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoYWVyX29zY19zZXR1cChkZXYpKQorCQlnb3RvIG91dDsKIAogCXJldHVybiAwOworb3V0OgorCWlmIChmb3JjZWxvYWQpIHsKKwkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXZpY2UsCisJCQkgICAiYWVyZHJ2IGZvcmNlbG9hZCByZXF1ZXN0ZWQuXG4iKTsKKwkJZGV2LT5wb3J0LT5hZXJfZmlybXdhcmVfZmlyc3QgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FTlhJTzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2VjcmMuYyBiL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2VjcmMuYwppbmRleCBhOTI4ZDhhLi5hMjc0N2E2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL2Flci9lY3JjLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9hZXIvZWNyYy5jCkBAIC01MSw3ICs1MSw3IEBACiAJaW50IHBvczsKIAl1MzIgcmVnMzI7CiAKLQlpZiAoIWRldi0+aXNfcGNpZSkKKwlpZiAoIXBjaV9pc19wY2llKGRldikpCiAJCXJldHVybiAtRU5PREVWOwogCiAJcG9zID0gcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkoZGV2LCBQQ0lfRVhUX0NBUF9JRF9FUlIpOwpAQCAtNzksNyArNzksNyBAQAogCWludCBwb3M7CiAJdTMyIHJlZzMyOwogCi0JaWYgKCFkZXYtPmlzX3BjaWUpCisJaWYgKCFwY2lfaXNfcGNpZShkZXYpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXBvcyA9IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5KGRldiwgUENJX0VYVF9DQVBfSURfRVJSKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvYXNwbS5jIGIvZHJpdmVycy9wY2kvcGNpZS9hc3BtLmMKaW5kZXggNWI3MDU2Yy4uNWEwMWZjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9hc3BtLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9hc3BtLmMKQEAgLTEyMiw3ICsxMjIsNyBAQAogCXN0cnVjdCBwY2lfYnVzICpsaW5rYnVzID0gbGluay0+cGRldi0+c3Vib3JkaW5hdGU7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmbGlua2J1cy0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKLQkJcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShjaGlsZCwgUENJX0NBUF9JRF9FWFApOworCQlwb3MgPSBwY2lfcGNpZV9jYXAoY2hpbGQpOwogCQlpZiAoIXBvcykKIAkJCXJldHVybjsKIAkJcGNpX3JlYWRfY29uZmlnX3dvcmQoY2hpbGQsIHBvcyArIFBDSV9FWFBfTE5LQ1RMLCAmcmVnMTYpOwpAQCAtMTU2LDcgKzE1Niw3IEBACiAKIAkvKiBBbGwgZnVuY3Rpb25zIHNob3VsZCBoYXZlIHRoZSBzYW1lIGNhcCBhbmQgc3RhdGUsIHRha2UgdGhlIHdvcnN0ICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGlsZCwgJmxpbmtidXMtPmRldmljZXMsIGJ1c19saXN0KSB7Ci0JCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkoY2hpbGQsIFBDSV9DQVBfSURfRVhQKTsKKwkJcG9zID0gcGNpX3BjaWVfY2FwKGNoaWxkKTsKIAkJaWYgKCFwb3MpCiAJCQlyZXR1cm47CiAJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChjaGlsZCwgcG9zICsgUENJX0VYUF9MTktDQVAsICZyZWczMik7CkBAIC0xOTEsMjMgKzE5MSwyMyBAQAogCSAqIENvbmZpZ3VyYXRpb24sIHNvIGp1c3QgY2hlY2sgb25lIGZ1bmN0aW9uCiAJICovCiAJY2hpbGQgPSBsaXN0X2VudHJ5KGxpbmtidXMtPmRldmljZXMubmV4dCwgc3RydWN0IHBjaV9kZXYsIGJ1c19saXN0KTsKLQlCVUdfT04oIWNoaWxkLT5pc19wY2llKTsKKwlCVUdfT04oIXBjaV9pc19wY2llKGNoaWxkKSk7CiAKIAkvKiBDaGVjayBkb3duc3RyZWFtIGNvbXBvbmVudCBpZiBiaXQgU2xvdCBDbG9jayBDb25maWd1cmF0aW9uIGlzIDEgKi8KLQljcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShjaGlsZCwgUENJX0NBUF9JRF9FWFApOworCWNwb3MgPSBwY2lfcGNpZV9jYXAoY2hpbGQpOwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGNoaWxkLCBjcG9zICsgUENJX0VYUF9MTktTVEEsICZyZWcxNik7CiAJaWYgKCEocmVnMTYgJiBQQ0lfRVhQX0xOS1NUQV9TTEMpKQogCQlzYW1lX2Nsb2NrID0gMDsKIAogCS8qIENoZWNrIHVwc3RyZWFtIGNvbXBvbmVudCBpZiBiaXQgU2xvdCBDbG9jayBDb25maWd1cmF0aW9uIGlzIDEgKi8KLQlwcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwYXJlbnQsIFBDSV9DQVBfSURfRVhQKTsKKwlwcG9zID0gcGNpX3BjaWVfY2FwKHBhcmVudCk7CiAJcGNpX3JlYWRfY29uZmlnX3dvcmQocGFyZW50LCBwcG9zICsgUENJX0VYUF9MTktTVEEsICZyZWcxNik7CiAJaWYgKCEocmVnMTYgJiBQQ0lfRVhQX0xOS1NUQV9TTEMpKQogCQlzYW1lX2Nsb2NrID0gMDsKIAogCS8qIENvbmZpZ3VyZSBkb3duc3RyZWFtIGNvbXBvbmVudCwgYWxsIGZ1bmN0aW9ucyAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZsaW5rYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgewotCQljcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShjaGlsZCwgUENJX0NBUF9JRF9FWFApOworCQljcG9zID0gcGNpX3BjaWVfY2FwKGNoaWxkKTsKIAkJcGNpX3JlYWRfY29uZmlnX3dvcmQoY2hpbGQsIGNwb3MgKyBQQ0lfRVhQX0xOS0NUTCwgJnJlZzE2KTsKIAkJY2hpbGRfcmVnW1BDSV9GVU5DKGNoaWxkLT5kZXZmbildID0gcmVnMTY7CiAJCWlmIChzYW1lX2Nsb2NrKQpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBhcmVudC0+ZGV2LAogCQkgICAiQVNQTTogQ291bGQgbm90IGNvbmZpZ3VyZSBjb21tb24gY2xvY2tcbiIpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZsaW5rYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgewotCQljcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShjaGlsZCwgUENJX0NBUF9JRF9FWFApOworCQljcG9zID0gcGNpX3BjaWVfY2FwKGNoaWxkKTsKIAkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGNoaWxkLCBjcG9zICsgUENJX0VYUF9MTktDVEwsCiAJCQkJICAgICAgY2hpbGRfcmVnW1BDSV9GVU5DKGNoaWxkLT5kZXZmbildKTsKIAl9CkBAIC0zMDAsNyArMzAwLDcgQEAKIAl1MTYgcmVnMTY7CiAJdTMyIHJlZzMyOwogCi0JcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CisJcG9zID0gcGNpX3BjaWVfY2FwKHBkZXYpOwogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBwb3MgKyBQQ0lfRVhQX0xOS0NBUCwgJnJlZzMyKTsKIAlpbmZvLT5zdXBwb3J0ID0gKHJlZzMyICYgUENJX0VYUF9MTktDQVBfQVNQTVMpID4+IDEwOwogCWluZm8tPmxhdGVuY3lfZW5jb2RpbmdfbDBzID0gKHJlZzMyICYgUENJX0VYUF9MTktDQVBfTDBTRUwpID4+IDEyOwpAQCAtNDIwLDcgKzQyMCw3IEBACiAJCSAgICBjaGlsZC0+cGNpZV90eXBlICE9IFBDSV9FWFBfVFlQRV9MRUdfRU5EKQogCQkJY29udGludWU7CiAKLQkJcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShjaGlsZCwgUENJX0NBUF9JRF9FWFApOworCQlwb3MgPSBwY2lfcGNpZV9jYXAoY2hpbGQpOwogCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoY2hpbGQsIHBvcyArIFBDSV9FWFBfREVWQ0FQLCAmcmVnMzIpOwogCQkvKiBDYWxjdWxhdGUgZW5kcG9pbnQgTDBzIGFjY2VwdGFibGUgbGF0ZW5jeSAqLwogCQllbmNvZGluZyA9IChyZWczMiAmIFBDSV9FWFBfREVWQ0FQX0wwUykgPj4gNjsKQEAgLTQzNiw3ICs0MzYsNyBAQAogc3RhdGljIHZvaWQgcGNpZV9jb25maWdfYXNwbV9kZXYoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiB2YWwpCiB7CiAJdTE2IHJlZzE2OwotCWludCBwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfRVhQKTsKKwlpbnQgcG9zID0gcGNpX3BjaWVfY2FwKHBkZXYpOwogCiAJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX0VYUF9MTktDVEwsICZyZWcxNik7CiAJcmVnMTYgJj0gfjB4MzsKQEAgLTUwMyw3ICs1MDMsNyBAQAogCSAqIHZlcnkgc3RyYW5nZS4gRGlzYWJsZSBBU1BNIGZvciB0aGUgd2hvbGUgc2xvdAogCSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZwZGV2LT5zdWJvcmRpbmF0ZS0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKLQkJcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShjaGlsZCwgUENJX0NBUF9JRF9FWFApOworCQlwb3MgPSBwY2lfcGNpZV9jYXAoY2hpbGQpOwogCQlpZiAoIXBvcykKIAkJCXJldHVybiAtRUlOVkFMOwogCQkvKgpAQCAtNTYzLDcgKzU2Myw3IEBACiAJc3RydWN0IHBjaWVfbGlua19zdGF0ZSAqbGluazsKIAlpbnQgYmxhY2tsaXN0ID0gISFwY2llX2FzcG1fc2FuaXR5X2NoZWNrKHBkZXYpOwogCi0JaWYgKGFzcG1fZGlzYWJsZWQgfHwgIXBkZXYtPmlzX3BjaWUgfHwgcGRldi0+bGlua19zdGF0ZSkKKwlpZiAoYXNwbV9kaXNhYmxlZCB8fCAhcGNpX2lzX3BjaWUocGRldikgfHwgcGRldi0+bGlua19zdGF0ZSkKIAkJcmV0dXJuOwogCWlmIChwZGV2LT5wY2llX3R5cGUgIT0gUENJX0VYUF9UWVBFX1JPT1RfUE9SVCAmJgogCSAgICBwZGV2LT5wY2llX3R5cGUgIT0gUENJX0VYUF9UWVBFX0RPV05TVFJFQU0pCkBAIC02MjksNyArNjI5LDggQEAKIAlzdHJ1Y3QgcGNpX2RldiAqcGFyZW50ID0gcGRldi0+YnVzLT5zZWxmOwogCXN0cnVjdCBwY2llX2xpbmtfc3RhdGUgKmxpbmssICpyb290LCAqcGFyZW50X2xpbms7CiAKLQlpZiAoYXNwbV9kaXNhYmxlZCB8fCAhcGRldi0+aXNfcGNpZSB8fCAhcGFyZW50IHx8ICFwYXJlbnQtPmxpbmtfc3RhdGUpCisJaWYgKGFzcG1fZGlzYWJsZWQgfHwgIXBjaV9pc19wY2llKHBkZXYpIHx8CisJICAgICFwYXJlbnQgfHwgIXBhcmVudC0+bGlua19zdGF0ZSkKIAkJcmV0dXJuOwogCWlmICgocGFyZW50LT5wY2llX3R5cGUgIT0gUENJX0VYUF9UWVBFX1JPT1RfUE9SVCkgJiYKIAkgICAgKHBhcmVudC0+cGNpZV90eXBlICE9IFBDSV9FWFBfVFlQRV9ET1dOU1RSRUFNKSkKQEAgLTY3MCw3ICs2NzEsNyBAQAogewogCXN0cnVjdCBwY2llX2xpbmtfc3RhdGUgKmxpbmsgPSBwZGV2LT5saW5rX3N0YXRlOwogCi0JaWYgKGFzcG1fZGlzYWJsZWQgfHwgIXBkZXYtPmlzX3BjaWUgfHwgIWxpbmspCisJaWYgKGFzcG1fZGlzYWJsZWQgfHwgIXBjaV9pc19wY2llKHBkZXYpIHx8ICFsaW5rKQogCQlyZXR1cm47CiAJaWYgKChwZGV2LT5wY2llX3R5cGUgIT0gUENJX0VYUF9UWVBFX1JPT1RfUE9SVCkgJiYKIAkgICAgKHBkZXYtPnBjaWVfdHlwZSAhPSBQQ0lfRVhQX1RZUEVfRE9XTlNUUkVBTSkpCkBAIC02OTYsNyArNjk3LDcgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqcGFyZW50ID0gcGRldi0+YnVzLT5zZWxmOwogCXN0cnVjdCBwY2llX2xpbmtfc3RhdGUgKmxpbms7CiAKLQlpZiAoYXNwbV9kaXNhYmxlZCB8fCAhcGRldi0+aXNfcGNpZSkKKwlpZiAoYXNwbV9kaXNhYmxlZCB8fCAhcGNpX2lzX3BjaWUocGRldikpCiAJCXJldHVybjsKIAlpZiAocGRldi0+cGNpZV90eXBlID09IFBDSV9FWFBfVFlQRV9ST09UX1BPUlQgfHwKIAkgICAgcGRldi0+cGNpZV90eXBlID09IFBDSV9FWFBfVFlQRV9ET1dOU1RSRUFNKQpAQCAtODQxLDggKzg0Miw5IEBACiB7CiAJc3RydWN0IHBjaWVfbGlua19zdGF0ZSAqbGlua19zdGF0ZSA9IHBkZXYtPmxpbmtfc3RhdGU7CiAKLQlpZiAoIXBkZXYtPmlzX3BjaWUgfHwgKHBkZXYtPnBjaWVfdHlwZSAhPSBQQ0lfRVhQX1RZUEVfUk9PVF9QT1JUICYmCi0JCXBkZXYtPnBjaWVfdHlwZSAhPSBQQ0lfRVhQX1RZUEVfRE9XTlNUUkVBTSkgfHwgIWxpbmtfc3RhdGUpCisJaWYgKCFwY2lfaXNfcGNpZShwZGV2KSB8fAorCSAgICAocGRldi0+cGNpZV90eXBlICE9IFBDSV9FWFBfVFlQRV9ST09UX1BPUlQgJiYKKwkgICAgIHBkZXYtPnBjaWVfdHlwZSAhPSBQQ0lfRVhQX1RZUEVfRE9XTlNUUkVBTSkgfHwgIWxpbmtfc3RhdGUpCiAJCXJldHVybjsKIAogCWlmIChsaW5rX3N0YXRlLT5hc3BtX3N1cHBvcnQpCkBAIC04NTcsOCArODU5LDkgQEAKIHsKIAlzdHJ1Y3QgcGNpZV9saW5rX3N0YXRlICpsaW5rX3N0YXRlID0gcGRldi0+bGlua19zdGF0ZTsKIAotCWlmICghcGRldi0+aXNfcGNpZSB8fCAocGRldi0+cGNpZV90eXBlICE9IFBDSV9FWFBfVFlQRV9ST09UX1BPUlQgJiYKLQkJcGRldi0+cGNpZV90eXBlICE9IFBDSV9FWFBfVFlQRV9ET1dOU1RSRUFNKSB8fCAhbGlua19zdGF0ZSkKKwlpZiAoIXBjaV9pc19wY2llKHBkZXYpIHx8CisJICAgIChwZGV2LT5wY2llX3R5cGUgIT0gUENJX0VYUF9UWVBFX1JPT1RfUE9SVCAmJgorCSAgICAgcGRldi0+cGNpZV90eXBlICE9IFBDSV9FWFBfVFlQRV9ET1dOU1RSRUFNKSB8fCAhbGlua19zdGF0ZSkKIAkJcmV0dXJuOwogCiAJaWYgKGxpbmtfc3RhdGUtPmFzcG1fc3VwcG9ydCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydi5oIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2LmgKaW5kZXggMTdhZDUzOC4uYWFlYjlkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2LmgKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2LmgKQEAgLTExLDMxICsxMSwxNiBAQAogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KIAotI2lmICFkZWZpbmVkKFBDSV9DQVBfSURfUE1FKQotI2RlZmluZSBQQ0lfQ0FQX0lEX1BNRQkJCTEKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoUENJX0NBUF9JRF9FWFApCi0jZGVmaW5lIFBDSV9DQVBfSURfRVhQCQkJMHgxMAotI2VuZGlmCi0KLSNkZWZpbmUgUE9SVF9UWVBFX01BU0sJCQkweGYKLSNkZWZpbmUgUE9SVF9UT19TTE9UX01BU0sJCTB4MTAwCi0jZGVmaW5lIFNMT1RfSFBfQ0FQQUJMRV9NQVNLCQkweDQwCi0jZGVmaW5lIFBDSUVfQ0FQQUJJTElUSUVTX1JFRwkJMHgyCi0jZGVmaW5lIFBDSUVfU0xPVF9DQVBBQklMSVRJRVNfUkVHCTB4MTQKLSNkZWZpbmUgUENJRV9QT1JUX0RFVklDRV9NQVhTRVJWSUNFUwk0Ci0jZGVmaW5lIFBDSUVfUE9SVF9NU0lfVkVDVE9SX01BU0sJMHgxZgorI2RlZmluZSBQQ0lFX1BPUlRfREVWSUNFX01BWFNFUlZJQ0VTICAgNAogLyoKLSAqIEFjY29yZGluZyB0byB0aGUgUENJIEV4cHJlc3MgQmFzZSBTcGVjaWZpY2F0aW9uIDIuMCwgdGhlIGluZGljZXMgb2YgdGhlIE1TSS1YCi0gKiB0YWJsZSBlbnRpcmVzIHVzZWQgYnkgcG9ydCBzZXJ2aWNlcyBtdXN0IG5vdCBleGNlZWQgMzEKKyAqIEFjY29yZGluZyB0byB0aGUgUENJIEV4cHJlc3MgQmFzZSBTcGVjaWZpY2F0aW9uIDIuMCwgdGhlIGluZGljZXMgb2YKKyAqIHRoZSBNU0ktWCB0YWJsZSBlbnRpcmVzIHVzZWQgYnkgcG9ydCBzZXJ2aWNlcyBtdXN0IG5vdCBleGNlZWQgMzEKICAqLwogI2RlZmluZSBQQ0lFX1BPUlRfTUFYX01TSVhfRU5UUklFUwkzMgogCiAjZGVmaW5lIGdldF9kZXNjcmlwdG9yX2lkKHR5cGUsIHNlcnZpY2UpICgoKHR5cGUgLSA0KSA8PCA0KSB8IHNlcnZpY2UpCiAKIGV4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgcGNpZV9wb3J0X2J1c190eXBlOwotZXh0ZXJuIGludCBwY2llX3BvcnRfZGV2aWNlX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogZXh0ZXJuIGludCBwY2llX3BvcnRfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogI2lmZGVmIENPTkZJR19QTQogZXh0ZXJuIGludCBwY2llX3BvcnRfZGV2aWNlX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9idXMuYyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9idXMuYwppbmRleCBlZjNhNGVlLi4xOGJmOTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfYnVzLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X2J1cy5jCkBAIC0yNiw3ICsyNiw2IEBACiBzdGF0aWMgaW50IHBjaWVfcG9ydF9idXNfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQogewogCXN0cnVjdCBwY2llX2RldmljZSAqcGNpZWRldjsKLQlzdHJ1Y3QgcGNpZV9wb3J0X2RhdGEgKnBvcnRfZGF0YTsKIAlzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfZHJpdmVyICpkcml2ZXI7CiAKIAlpZiAoZHJ2LT5idXMgIT0gJnBjaWVfcG9ydF9idXNfdHlwZSB8fCBkZXYtPmJ1cyAhPSAmcGNpZV9wb3J0X2J1c190eXBlKQpAQCAtMzgsMTAgKzM3LDggQEAKIAlpZiAoZHJpdmVyLT5zZXJ2aWNlICE9IHBjaWVkZXYtPnNlcnZpY2UpCiAJCXJldHVybiAwOwogCi0JcG9ydF9kYXRhID0gcGNpX2dldF9kcnZkYXRhKHBjaWVkZXYtPnBvcnQpOwotCi0JaWYgKGRyaXZlci0+cG9ydF90eXBlICE9IFBDSUVfQU5ZX1BPUlQKLQkgICAgICYmIGRyaXZlci0+cG9ydF90eXBlICE9IHBvcnRfZGF0YS0+cG9ydF90eXBlKQorCWlmICgoZHJpdmVyLT5wb3J0X3R5cGUgIT0gUENJRV9BTllfUE9SVCkgJiYKKwkgICAgKGRyaXZlci0+cG9ydF90eXBlICE9IHBjaWVkZXYtPnBvcnQtPnBjaWVfdHlwZSkpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfY29yZS5jIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X2NvcmUuYwppbmRleCA1MmY4NGZjLi40MTMyNjJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9jb3JlLmMKQEAgLTEwOCw5ICsxMDgsOSBAQAogCQkgKiB0aGUgdmFsdWUgaW4gdGhpcyBmaWVsZCBpbmRpY2F0ZXMgd2hpY2ggTVNJLVggVGFibGUgZW50cnkgaXMKIAkJICogdXNlZCB0byBnZW5lcmF0ZSB0aGUgaW50ZXJydXB0IG1lc3NhZ2UuIgogCQkgKi8KLQkJcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfRVhQKTsKLQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBwb3MgKyBQQ0lFX0NBUEFCSUxJVElFU19SRUcsICZyZWcxNik7Ci0JCWVudHJ5ID0gKHJlZzE2ID4+IDkpICYgUENJRV9QT1JUX01TSV9WRUNUT1JfTUFTSzsKKwkJcG9zID0gcGNpX3BjaWVfY2FwKGRldik7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0VYUF9GTEFHUywgJnJlZzE2KTsKKwkJZW50cnkgPSAocmVnMTYgJiBQQ0lfRVhQX0ZMQUdTX0lSUSkgPj4gOTsKIAkJaWYgKGVudHJ5ID49IG5yX2VudHJpZXMpCiAJCQlnb3RvIEVycm9yOwogCkBAIC0xNzcsMzcgKzE3Nyw0MCBAQAogfQogCiAvKioKLSAqIGFzc2lnbl9pbnRlcnJ1cHRfbW9kZSAtIGNob29zZSBpbnRlcnJ1cHQgbW9kZSBmb3IgUENJIEV4cHJlc3MgcG9ydCBzZXJ2aWNlcwotICogICAgICAgICAgICAgICAgICAgICAgICAgKElOVHgsIE1TSS1YLCBNU0kpIGFuZCBzZXQgdXAgdmVjdG9ycworICogaW5pdF9zZXJ2aWNlX2lycXMgLSBpbml0aWFsaXplIGlycXMgZm9yIFBDSSBFeHByZXNzIHBvcnQgc2VydmljZXMKICAqIEBkZXY6IFBDSSBFeHByZXNzIHBvcnQgdG8gaGFuZGxlCi0gKiBAdmVjdG9yczogQXJyYXkgb2YgaW50ZXJydXB0IHZlY3RvcnMgdG8gcG9wdWxhdGUKKyAqIEBpcnFzOiBBcnJheSBvZiBpcnFzIHRvIHBvcHVsYXRlCiAgKiBAbWFzazogQml0bWFzayBvZiBwb3J0IGNhcGFiaWxpdGllcyByZXR1cm5lZCBieSBnZXRfcG9ydF9kZXZpY2VfY2FwYWJpbGl0eSgpCiAgKgogICogUmV0dXJuIHZhbHVlOiBJbnRlcnJ1cHQgbW9kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHBvcnQKICAqLwotc3RhdGljIGludCBhc3NpZ25faW50ZXJydXB0X21vZGUoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50ICp2ZWN0b3JzLCBpbnQgbWFzaykKK3N0YXRpYyBpbnQgaW5pdF9zZXJ2aWNlX2lycXMoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50ICppcnFzLCBpbnQgbWFzaykKIHsKLQlpbnQgaXJxLCBpbnRlcnJ1cHRfbW9kZSA9IFBDSUVfUE9SVF9OT19JUlE7Ci0JaW50IGk7CisJaW50IGksIGlycTsKIAogCS8qIFRyeSB0byB1c2UgTVNJLVggaWYgc3VwcG9ydGVkICovCi0JaWYgKCFwY2llX3BvcnRfZW5hYmxlX21zaXgoZGV2LCB2ZWN0b3JzLCBtYXNrKSkKLQkJcmV0dXJuIFBDSUVfUE9SVF9NU0lYX01PREU7Ci0KKwlpZiAoIXBjaWVfcG9ydF9lbmFibGVfbXNpeChkZXYsIGlycXMsIG1hc2spKQorCQlyZXR1cm4gMDsKIAkvKiBXZSdyZSBub3QgZ29pbmcgdG8gdXNlIE1TSS1YLCBzbyB0cnkgTVNJIGFuZCBmYWxsIGJhY2sgdG8gSU5UeCAqLwotCWlmICghcGNpX2VuYWJsZV9tc2koZGV2KSkKLQkJaW50ZXJydXB0X21vZGUgPSBQQ0lFX1BPUlRfTVNJX01PREU7CisJaXJxID0gLTE7CisJaWYgKCFwY2lfZW5hYmxlX21zaShkZXYpIHx8IGRldi0+cGluKQorCQlpcnEgPSBkZXYtPmlycTsKIAotCWlmIChpbnRlcnJ1cHRfbW9kZSA9PSBQQ0lFX1BPUlRfTk9fSVJRICYmIGRldi0+cGluKQotCQlpbnRlcnJ1cHRfbW9kZSA9IFBDSUVfUE9SVF9JTlR4X01PREU7Ci0KLQlpcnEgPSBpbnRlcnJ1cHRfbW9kZSAhPSBQQ0lFX1BPUlRfTk9fSVJRID8gZGV2LT5pcnEgOiAtMTsKIAlmb3IgKGkgPSAwOyBpIDwgUENJRV9QT1JUX0RFVklDRV9NQVhTRVJWSUNFUzsgaSsrKQotCQl2ZWN0b3JzW2ldID0gaXJxOworCQlpcnFzW2ldID0gaXJxOworCWlycXNbUENJRV9QT1JUX1NFUlZJQ0VfVkNfU0hJRlRdID0gLTE7CiAKLQl2ZWN0b3JzW1BDSUVfUE9SVF9TRVJWSUNFX1ZDX1NISUZUXSA9IC0xOworCWlmIChpcnEgPCAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gMDsKK30KIAotCXJldHVybiBpbnRlcnJ1cHRfbW9kZTsKK3N0YXRpYyB2b2lkIGNsZWFudXBfc2VydmljZV9pcnFzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaWYgKGRldi0+bXNpeF9lbmFibGVkKQorCQlwY2lfZGlzYWJsZV9tc2l4KGRldik7CisJZWxzZSBpZiAoZGV2LT5tc2lfZW5hYmxlZCkKKwkJcGNpX2Rpc2FibGVfbXNpKGRldik7CiB9CiAKIC8qKgpAQCAtMjI2LDEzICsyMjksMTIgQEAKIAl1MTYgcmVnMTY7CiAJdTMyIHJlZzMyOwogCi0JcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfRVhQKTsKLQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHBvcyArIFBDSUVfQ0FQQUJJTElUSUVTX1JFRywgJnJlZzE2KTsKKwlwb3MgPSBwY2lfcGNpZV9jYXAoZGV2KTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHBvcyArIFBDSV9FWFBfRkxBR1MsICZyZWcxNik7CiAJLyogSG90LVBsdWcgQ2FwYWJsZSAqLwotCWlmIChyZWcxNiAmIFBPUlRfVE9fU0xPVF9NQVNLKSB7Ci0JCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIAotCQkJcG9zICsgUENJRV9TTE9UX0NBUEFCSUxJVElFU19SRUcsICZyZWczMik7Ci0JCWlmIChyZWczMiAmIFNMT1RfSFBfQ0FQQUJMRV9NQVNLKQorCWlmIChyZWcxNiAmIFBDSV9FWFBfRkxBR1NfU0xPVCkgeworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBwb3MgKyBQQ0lfRVhQX1NMVENBUCwgJnJlZzMyKTsKKwkJaWYgKHJlZzMyICYgUENJX0VYUF9TTFRDQVBfSFBDKQogCQkJc2VydmljZXMgfD0gUENJRV9QT1JUX1NFUlZJQ0VfSFA7CiAJfQogCS8qIEFFUiBjYXBhYmxlICovCkBAIC0yNDEsODAgKzI0Myw0NyBAQAogCS8qIFZDIHN1cHBvcnQgKi8KIAlpZiAocGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkoZGV2LCBQQ0lfRVhUX0NBUF9JRF9WQykpCiAJCXNlcnZpY2VzIHw9IFBDSUVfUE9SVF9TRVJWSUNFX1ZDOworCS8qIFJvb3QgcG9ydHMgYXJlIGNhcGFibGUgb2YgZ2VuZXJhdGluZyBQTUUgdG9vICovCisJaWYgKGRldi0+cGNpZV90eXBlID09IFBDSV9FWFBfVFlQRV9ST09UX1BPUlQpCisJCXNlcnZpY2VzIHw9IFBDSUVfUE9SVF9TRVJWSUNFX1BNRTsKIAogCXJldHVybiBzZXJ2aWNlczsKIH0KIAogLyoqCi0gKiBwY2llX2RldmljZV9pbml0IC0gaW5pdGlhbGl6ZSBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2UgZGV2aWNlCi0gKiBAZGV2OiBQb3J0IHNlcnZpY2UgZGV2aWNlIHRvIGluaXRpYWxpemUKLSAqIEBwYXJlbnQ6IFBDSSBFeHByZXNzIHBvcnQgdG8gYXNzb2NpYXRlIHRoZSBzZXJ2aWNlIGRldmljZSB3aXRoCi0gKiBAcG9ydF90eXBlOiBUeXBlIG9mIHRoZSBwb3J0Ci0gKiBAc2VydmljZV90eXBlOiBUeXBlIG9mIHNlcnZpY2UgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHNlcnZpY2UgZGV2aWNlCisgKiBwY2llX2RldmljZV9pbml0IC0gYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgUENJIEV4cHJlc3MgcG9ydCBzZXJ2aWNlIGRldmljZQorICogQHBkZXY6IFBDSSBFeHByZXNzIHBvcnQgdG8gYXNzb2NpYXRlIHRoZSBzZXJ2aWNlIGRldmljZSB3aXRoCisgKiBAc2VydmljZTogVHlwZSBvZiBzZXJ2aWNlIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBzZXJ2aWNlIGRldmljZQogICogQGlycTogSW50ZXJydXB0IHZlY3RvciB0byBhc3NvY2lhdGUgd2l0aCB0aGUgc2VydmljZSBkZXZpY2UKICAqLwotc3RhdGljIHZvaWQgcGNpZV9kZXZpY2VfaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGFyZW50LCBzdHJ1Y3QgcGNpZV9kZXZpY2UgKmRldiwgCi0JaW50IHNlcnZpY2VfdHlwZSwgaW50IGlycSkKK3N0YXRpYyBpbnQgcGNpZV9kZXZpY2VfaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IHNlcnZpY2UsIGludCBpcnEpCiB7Ci0Jc3RydWN0IHBjaWVfcG9ydF9kYXRhICpwb3J0X2RhdGEgPSBwY2lfZ2V0X2RydmRhdGEocGFyZW50KTsKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBwY2llX2RldmljZSAqcGNpZTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXZpY2U7Ci0JaW50IHBvcnRfdHlwZSA9IHBvcnRfZGF0YS0+cG9ydF90eXBlOwogCi0JZGV2LT5wb3J0ID0gcGFyZW50OwotCWRldi0+aXJxID0gaXJxOwotCWRldi0+c2VydmljZSA9IHNlcnZpY2VfdHlwZTsKKwlwY2llID0ga3phbGxvYyhzaXplb2YoKnBjaWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBjaWUpCisJCXJldHVybiAtRU5PTUVNOworCXBjaWUtPnBvcnQgPSBwZGV2OworCXBjaWUtPmlycSA9IGlycTsKKwlwY2llLT5zZXJ2aWNlID0gc2VydmljZTsKIAogCS8qIEluaXRpYWxpemUgZ2VuZXJpYyBkZXZpY2UgaW50ZXJmYWNlICovCi0JZGV2aWNlID0gJmRldi0+ZGV2aWNlOwotCW1lbXNldChkZXZpY2UsIDAsIHNpemVvZihzdHJ1Y3QgZGV2aWNlKSk7CisJZGV2aWNlID0gJnBjaWUtPmRldmljZTsKIAlkZXZpY2UtPmJ1cyA9ICZwY2llX3BvcnRfYnVzX3R5cGU7Ci0JZGV2aWNlLT5kcml2ZXIgPSBOVUxMOwotCWRldl9zZXRfZHJ2ZGF0YShkZXZpY2UsIE5VTEwpOwogCWRldmljZS0+cmVsZWFzZSA9IHJlbGVhc2VfcGNpZV9kZXZpY2U7CS8qIGNhbGxiYWNrIHRvIGZyZWUgcGNpZSBkZXYgKi8KIAlkZXZfc2V0X25hbWUoZGV2aWNlLCAiJXM6cGNpZSUwMngiLAotCQkgcGNpX25hbWUocGFyZW50KSwgZ2V0X2Rlc2NyaXB0b3JfaWQocG9ydF90eXBlLCBzZXJ2aWNlX3R5cGUpKTsKLQlkZXZpY2UtPnBhcmVudCA9ICZwYXJlbnQtPmRldjsKLX0KKwkJICAgICBwY2lfbmFtZShwZGV2KSwKKwkJICAgICBnZXRfZGVzY3JpcHRvcl9pZChwZGV2LT5wY2llX3R5cGUsIHNlcnZpY2UpKTsKKwlkZXZpY2UtPnBhcmVudCA9ICZwZGV2LT5kZXY7CiAKLS8qKgotICogYWxsb2NfcGNpZV9kZXZpY2UgLSBhbGxvY2F0ZSBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2UgZGV2aWNlIHN0cnVjdHVyZQotICogQHBhcmVudDogUENJIEV4cHJlc3MgcG9ydCB0byBhc3NvY2lhdGUgdGhlIHNlcnZpY2UgZGV2aWNlIHdpdGgKLSAqIEBwb3J0X3R5cGU6IFR5cGUgb2YgdGhlIHBvcnQKLSAqIEBzZXJ2aWNlX3R5cGU6IFR5cGUgb2Ygc2VydmljZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgc2VydmljZSBkZXZpY2UKLSAqIEBpcnE6IEludGVycnVwdCB2ZWN0b3IgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHNlcnZpY2UgZGV2aWNlCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcGNpZV9kZXZpY2UqIGFsbG9jX3BjaWVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwYXJlbnQsCi0JaW50IHNlcnZpY2VfdHlwZSwgaW50IGlycSkKLXsKLQlzdHJ1Y3QgcGNpZV9kZXZpY2UgKmRldmljZTsKLQotCWRldmljZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2llX2RldmljZSksIEdGUF9LRVJORUwpOwotCWlmICghZGV2aWNlKQotCQlyZXR1cm4gTlVMTDsKLQotCXBjaWVfZGV2aWNlX2luaXQocGFyZW50LCBkZXZpY2UsIHNlcnZpY2VfdHlwZSwgaXJxKTsKLQlyZXR1cm4gZGV2aWNlOwotfQotCi0vKioKLSAqIHBjaWVfcG9ydF9kZXZpY2VfcHJvYmUgLSBjaGVjayBpZiBkZXZpY2UgaXMgYSBQQ0kgRXhwcmVzcyBwb3J0Ci0gKiBAZGV2OiBEZXZpY2UgdG8gY2hlY2sKLSAqLwotaW50IHBjaWVfcG9ydF9kZXZpY2VfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQlpbnQgcG9zLCB0eXBlOwotCXUxNiByZWc7Ci0KLQlpZiAoIShwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9FWFApKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHBvcyArIFBDSUVfQ0FQQUJJTElUSUVTX1JFRywgJnJlZyk7Ci0JdHlwZSA9IChyZWcgPj4gNCkgJiBQT1JUX1RZUEVfTUFTSzsKLQlpZiAoCXR5cGUgPT0gUENJRV9SQ19QT1JUIHx8IHR5cGUgPT0gUENJRV9TV19VUFNUUkVBTV9QT1JUIHx8Ci0JCXR5cGUgPT0gUENJRV9TV19ET1dOU1RSRUFNX1BPUlQgKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAtRU5PREVWOworCXJldHZhbCA9IGRldmljZV9yZWdpc3RlcihkZXZpY2UpOworCWlmIChyZXR2YWwpCisJCWtmcmVlKHBjaWUpOworCWVsc2UKKwkJZ2V0X2RldmljZShkZXZpY2UpOworCXJldHVybiByZXR2YWw7CiB9CiAKIC8qKgpAQCAtMzI2LDc3ICsyOTUsNDkgQEAKICAqLwogaW50IHBjaWVfcG9ydF9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlzdHJ1Y3QgcGNpZV9wb3J0X2RhdGEgKnBvcnRfZGF0YTsKLQlpbnQgc3RhdHVzLCBjYXBhYmlsaXRpZXMsIGlycV9tb2RlLCBpLCBucl9zZXJ2OwotCWludCB2ZWN0b3JzW1BDSUVfUE9SVF9ERVZJQ0VfTUFYU0VSVklDRVNdOwotCXUxNiByZWcxNjsKKwlpbnQgc3RhdHVzLCBjYXBhYmlsaXRpZXMsIGksIG5yX3NlcnZpY2U7CisJaW50IGlycXNbUENJRV9QT1JUX0RFVklDRV9NQVhTRVJWSUNFU107CiAKLQlwb3J0X2RhdGEgPSBremFsbG9jKHNpemVvZigqcG9ydF9kYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwb3J0X2RhdGEpCi0JCXJldHVybiAtRU5PTUVNOwotCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIHBvcnRfZGF0YSk7Ci0KLQkvKiBHZXQgcG9ydCB0eXBlICovCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LAotCQlwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9FWFApICsKLQkJUENJRV9DQVBBQklMSVRJRVNfUkVHLCAmcmVnMTYpOwotCXBvcnRfZGF0YS0+cG9ydF90eXBlID0gKHJlZzE2ID4+IDQpICYgUE9SVF9UWVBFX01BU0s7Ci0KKwkvKiBHZXQgYW5kIGNoZWNrIFBDSSBFeHByZXNzIHBvcnQgc2VydmljZXMgKi8KIAljYXBhYmlsaXRpZXMgPSBnZXRfcG9ydF9kZXZpY2VfY2FwYWJpbGl0eShkZXYpOwotCS8qIFJvb3QgcG9ydHMgYXJlIGNhcGFibGUgb2YgZ2VuZXJhdGluZyBQTUUgdG9vICovCi0JaWYgKHBvcnRfZGF0YS0+cG9ydF90eXBlID09IFBDSUVfUkNfUE9SVCkKLQkJY2FwYWJpbGl0aWVzIHw9IFBDSUVfUE9SVF9TRVJWSUNFX1BNRTsKKwlpZiAoIWNhcGFiaWxpdGllcykKKwkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpcnFfbW9kZSA9IGFzc2lnbl9pbnRlcnJ1cHRfbW9kZShkZXYsIHZlY3RvcnMsIGNhcGFiaWxpdGllcyk7Ci0JaWYgKGlycV9tb2RlID09IFBDSUVfUE9SVF9OT19JUlEpIHsKLQkJLyoKLQkJICogRG9uJ3QgdXNlIHNlcnZpY2UgZGV2aWNlcyB0aGF0IHJlcXVpcmUgaW50ZXJydXB0cyBpZiB0aGVyZSBpcwotCQkgKiBubyB3YXkgdG8gZ2VuZXJhdGUgdGhlbS4KLQkJICovCi0JCWlmICghKGNhcGFiaWxpdGllcyAmIFBDSUVfUE9SVF9TRVJWSUNFX1ZDKSkgewotCQkJc3RhdHVzID0gLUVOT0RFVjsKLQkJCWdvdG8gRXJyb3I7Ci0JCX0KLQkJY2FwYWJpbGl0aWVzID0gUENJRV9QT1JUX1NFUlZJQ0VfVkM7Ci0JfQotCXBvcnRfZGF0YS0+cG9ydF9pcnFfbW9kZSA9IGlycV9tb2RlOwotCisJLyogRW5hYmxlIFBDSSBFeHByZXNzIHBvcnQgZGV2aWNlICovCiAJc3RhdHVzID0gcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKIAlpZiAoc3RhdHVzKQotCQlnb3RvIEVycm9yOworCQlyZXR1cm4gc3RhdHVzOwogCXBjaV9zZXRfbWFzdGVyKGRldik7CisJLyoKKwkgKiBJbml0aWFsaXplIHNlcnZpY2UgaXJxcy4gRG9uJ3QgdXNlIHNlcnZpY2UgZGV2aWNlcyB0aGF0CisJICogcmVxdWlyZSBpbnRlcnJ1cHRzIGlmIHRoZXJlIGlzIG5vIHdheSB0byBnZW5lcmF0ZSB0aGVtLgorCSAqLworCXN0YXR1cyA9IGluaXRfc2VydmljZV9pcnFzKGRldiwgaXJxcywgY2FwYWJpbGl0aWVzKTsKKwlpZiAoc3RhdHVzKSB7CisJCWNhcGFiaWxpdGllcyAmPSBQQ0lFX1BPUlRfU0VSVklDRV9WQzsKKwkJaWYgKCFjYXBhYmlsaXRpZXMpCisJCQlnb3RvIGVycm9yX2Rpc2FibGU7CisJfQogCiAJLyogQWxsb2NhdGUgY2hpbGQgc2VydmljZXMgaWYgYW55ICovCi0JZm9yIChpID0gMCwgbnJfc2VydiA9IDA7IGkgPCBQQ0lFX1BPUlRfREVWSUNFX01BWFNFUlZJQ0VTOyBpKyspIHsKLQkJc3RydWN0IHBjaWVfZGV2aWNlICpjaGlsZDsKKwlzdGF0dXMgPSAtRU5PREVWOworCW5yX3NlcnZpY2UgPSAwOworCWZvciAoaSA9IDA7IGkgPCBQQ0lFX1BPUlRfREVWSUNFX01BWFNFUlZJQ0VTOyBpKyspIHsKIAkJaW50IHNlcnZpY2UgPSAxIDw8IGk7Ci0KIAkJaWYgKCEoY2FwYWJpbGl0aWVzICYgc2VydmljZSkpCiAJCQljb250aW51ZTsKLQotCQljaGlsZCA9IGFsbG9jX3BjaWVfZGV2aWNlKGRldiwgc2VydmljZSwgdmVjdG9yc1tpXSk7Ci0JCWlmICghY2hpbGQpCi0JCQljb250aW51ZTsKLQotCQlzdGF0dXMgPSBkZXZpY2VfcmVnaXN0ZXIoJmNoaWxkLT5kZXZpY2UpOwotCQlpZiAoc3RhdHVzKSB7Ci0JCQlrZnJlZShjaGlsZCk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWdldF9kZXZpY2UoJmNoaWxkLT5kZXZpY2UpOwotCQlucl9zZXJ2Kys7CisJCWlmICghcGNpZV9kZXZpY2VfaW5pdChkZXYsIHNlcnZpY2UsIGlycXNbaV0pKQorCQkJbnJfc2VydmljZSsrOwogCX0KLQlpZiAoIW5yX3NlcnYpIHsKLQkJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7Ci0JCXN0YXR1cyA9IC1FTk9ERVY7Ci0JCWdvdG8gRXJyb3I7Ci0JfQorCWlmICghbnJfc2VydmljZSkKKwkJZ290byBlcnJvcl9jbGVhbnVwX2lycXM7CiAKIAlyZXR1cm4gMDsKIAotIEVycm9yOgotCWtmcmVlKHBvcnRfZGF0YSk7CitlcnJvcl9jbGVhbnVwX2lycXM6CisJY2xlYW51cF9zZXJ2aWNlX2lycXMoZGV2KTsKK2Vycm9yX2Rpc2FibGU6CisJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtNDY0LDIxICs0MDUsOSBAQAogICovCiB2b2lkIHBjaWVfcG9ydF9kZXZpY2VfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IHBjaWVfcG9ydF9kYXRhICpwb3J0X2RhdGEgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKLQogCWRldmljZV9mb3JfZWFjaF9jaGlsZCgmZGV2LT5kZXYsIE5VTEwsIHJlbW92ZV9pdGVyKTsKKwljbGVhbnVwX3NlcnZpY2VfaXJxcyhkZXYpOwogCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOwotCi0Jc3dpdGNoIChwb3J0X2RhdGEtPnBvcnRfaXJxX21vZGUpIHsKLQljYXNlIFBDSUVfUE9SVF9NU0lYX01PREU6Ci0JCXBjaV9kaXNhYmxlX21zaXgoZGV2KTsKLQkJYnJlYWs7Ci0JY2FzZSBQQ0lFX1BPUlRfTVNJX01PREU6Ci0JCXBjaV9kaXNhYmxlX21zaShkZXYpOwotCQlicmVhazsKLQl9Ci0KLQlrZnJlZShwb3J0X2RhdGEpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYwppbmRleCBmNjM1ZTQ3Li5jZTUyZWEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X3BjaS5jCkBAIC02NywxNCArNjcsMTYgQEAKICAqIHRoaXMgcG9ydCBkZXZpY2UuCiAgKgogICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBwY2llX3BvcnRkcnZfcHJvYmUgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIAotCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCApCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwY2llX3BvcnRkcnZfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewotCWludAkJCXN0YXR1czsKKwlpbnQgc3RhdHVzOwogCi0Jc3RhdHVzID0gcGNpZV9wb3J0X2RldmljZV9wcm9iZShkZXYpOwotCWlmIChzdGF0dXMpCi0JCXJldHVybiBzdGF0dXM7CisJaWYgKCFwY2lfaXNfcGNpZShkZXYpIHx8CisJICAgICgoZGV2LT5wY2llX3R5cGUgIT0gUENJX0VYUF9UWVBFX1JPT1RfUE9SVCkgJiYKKwkgICAgIChkZXYtPnBjaWVfdHlwZSAhPSBQQ0lfRVhQX1RZUEVfVVBTVFJFQU0pICYmCisJICAgICAoZGV2LT5wY2llX3R5cGUgIT0gUENJX0VYUF9UWVBFX0RPV05TVFJFQU0pKSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKICAgICAgICAgaWYgKCFkZXYtPmlycSAmJiBkZXYtPnBpbikgewogCQlkZXZfd2FybigmZGV2LT5kZXYsICJkZXZpY2UgWyUwNHg6JTA0eF0gaGFzIGludmFsaWQgSVJROyAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wcm9iZS5jIGIvZHJpdmVycy9wY2kvcHJvYmUuYwppbmRleCA4MTA1ZTMyLi45OGZmYjJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wcm9iZS5jCisrKyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLWFzcG0uaD4KKyNpbmNsdWRlIDxhY3BpL2FjcGlfaGVzdC5oPgogI2luY2x1ZGUgInBjaS5oIgogCiAjZGVmaW5lIENBUkRCVVNfTEFURU5DWV9USU1FUgkxNzYJLyogc2Vjb25kYXJ5IGxhdGVuY3kgdGltZXIgKi8KQEAgLTE2MywxMiArMTY0LDEyIEBACiB7CiAJdTMyIGwsIHN6LCBtYXNrOwogCi0JbWFzayA9IHR5cGUgPyB+UENJX1JPTV9BRERSRVNTX0VOQUJMRSA6IH4wOworCW1hc2sgPSB0eXBlID8gUENJX1JPTV9BRERSRVNTX01BU0sgOiB+MDsKIAogCXJlcy0+bmFtZSA9IHBjaV9uYW1lKGRldik7CiAKIAlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBwb3MsICZsKTsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcG9zLCBtYXNrKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcG9zLCBsIHwgbWFzayk7CiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcG9zLCAmc3opOwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBwb3MsIGwpOwogCkBAIC0yMjMsOSArMjI0LDEzIEBACiAJCQlnb3RvIGZhaWw7CiAKIAkJaWYgKChzaXplb2YocmVzb3VyY2Vfc2l6ZV90KSA8IDgpICYmIChzejY0ID4gMHgxMDAwMDAwMDBVTEwpKSB7Ci0JCQlkZXZfZXJyKCZkZXYtPmRldiwgImNhbid0IGhhbmRsZSA2NC1iaXQgQkFSXG4iKTsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LCAicmVnICV4OiBjYW4ndCBoYW5kbGUgNjQtYml0IEJBUlxuIiwKKwkJCQlwb3MpOwogCQkJZ290byBmYWlsOwotCQl9IGVsc2UgaWYgKChzaXplb2YocmVzb3VyY2Vfc2l6ZV90KSA8IDgpICYmIGwpIHsKKwkJfQorCisJCXJlcy0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9NRU1fNjQ7CisJCWlmICgoc2l6ZW9mKHJlc291cmNlX3NpemVfdCkgPCA4KSAmJiBsKSB7CiAJCQkvKiBBZGRyZXNzIGFib3ZlIDMyLWJpdCBib3VuZGFyeTsgZGlzYWJsZSB0aGUgQkFSICovCiAJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcG9zLCAwKTsKIAkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBwb3MgKyA0LCAwKTsKQEAgLTIzNCwxNCArMjM5LDkgQEAKIAkJfSBlbHNlIHsKIAkJCXJlcy0+c3RhcnQgPSBsNjQ7CiAJCQlyZXMtPmVuZCA9IGw2NCArIHN6NjQ7Ci0JCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZkZXYtPmRldiwKLQkJCQkicmVnICV4ICVzOiAlcFJcbiIsIHBvcywKLQkJCQkgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX1BSRUZFVENIKSA/Ci0JCQkJCSI2NGJpdCBtbWlvIHByZWYiIDogIjY0Yml0IG1taW8iLAotCQkJCSByZXMpOworCQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXYsICJyZWcgJXg6ICVwUlxuIiwKKwkJCQkgICBwb3MsIHJlcyk7CiAJCX0KLQotCQlyZXMtPmZsYWdzIHw9IElPUkVTT1VSQ0VfTUVNXzY0OwogCX0gZWxzZSB7CiAJCXN6ID0gcGNpX3NpemUobCwgc3osIG1hc2spOwogCkBAIC0yNTEsMTEgKzI1MSw3IEBACiAJCXJlcy0+c3RhcnQgPSBsOwogCQlyZXMtPmVuZCA9IGwgKyBzejsKIAotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZkZXYtPmRldiwgInJlZyAleCAlczogJXBSXG4iLCBwb3MsCi0JCQkocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pID8gImlvIHBvcnQiIDoKLQkJCSAoKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX1BSRUZFVENIKSA/Ci0JCQkJICIzMmJpdCBtbWlvIHByZWYiIDogIjMyYml0IG1taW8iKSwKLQkJCXJlcyk7CisJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmRldi0+ZGV2LCAicmVnICV4OiAlcFJcbiIsIHBvcywgcmVzKTsKIAl9CiAKICBvdXQ6CkBAIC0yOTcsOCArMjkzLDExIEBACiAJaWYgKHBjaV9pc19yb290X2J1cyhjaGlsZCkpCS8qIEl0J3MgYSBob3N0IGJ1cywgbm90aGluZyB0byByZWFkICovCiAJCXJldHVybjsKIAorCWRldl9pbmZvKCZkZXYtPmRldiwgIlBDSSBicmlkZ2UgdG8gW2J1cyAlMDJ4LSUwMnhdJXNcbiIsCisJCSBjaGlsZC0+c2Vjb25kYXJ5LCBjaGlsZC0+c3Vib3JkaW5hdGUsCisJCSBkZXYtPnRyYW5zcGFyZW50ID8gIiAoc3VidHJhY3RpdmUgZGVjb2RlKSI6ICIiKTsKKwogCWlmIChkZXYtPnRyYW5zcGFyZW50KSB7Ci0JCWRldl9pbmZvKCZkZXYtPmRldiwgInRyYW5zcGFyZW50IGJyaWRnZVxuIik7CiAJCWZvcihpID0gMzsgaSA8IFBDSV9CVVNfTlVNX1JFU09VUkNFUzsgaSsrKQogCQkJY2hpbGQtPnJlc291cmNlW2ldID0gY2hpbGQtPnBhcmVudC0+cmVzb3VyY2VbaSAtIDNdOwogCX0KQEAgLTMyMyw3ICszMjIsNyBAQAogCQkJcmVzLT5zdGFydCA9IGJhc2U7CiAJCWlmICghcmVzLT5lbmQpCiAJCQlyZXMtPmVuZCA9IGxpbWl0ICsgMHhmZmY7Ci0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmRldi0+ZGV2LCAiYnJpZGdlIGlvIHBvcnQ6ICVwUlxuIiwgcmVzKTsKKwkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXYsICIgIGJyaWRnZSB3aW5kb3cgJXBSXG4iLCByZXMpOwogCX0KIAogCXJlcyA9IGNoaWxkLT5yZXNvdXJjZVsxXTsKQEAgLTMzNSw4ICszMzQsNyBAQAogCQlyZXMtPmZsYWdzID0gKG1lbV9iYXNlX2xvICYgUENJX01FTU9SWV9SQU5HRV9UWVBFX01BU0spIHwgSU9SRVNPVVJDRV9NRU07CiAJCXJlcy0+c3RhcnQgPSBiYXNlOwogCQlyZXMtPmVuZCA9IGxpbWl0ICsgMHhmZmZmZjsKLQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXYsICJicmlkZ2UgMzJiaXQgbW1pbzogJXBSXG4iLAotCQkJcmVzKTsKKwkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXYsICIgIGJyaWRnZSB3aW5kb3cgJXBSXG4iLCByZXMpOwogCX0KIAogCXJlcyA9IGNoaWxkLT5yZXNvdXJjZVsyXTsKQEAgLTM3NSw5ICszNzMsNyBAQAogCQkJcmVzLT5mbGFncyB8PSBJT1JFU09VUkNFX01FTV82NDsKIAkJcmVzLT5zdGFydCA9IGJhc2U7CiAJCXJlcy0+ZW5kID0gbGltaXQgKyAweGZmZmZmOwotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZkZXYtPmRldiwgImJyaWRnZSAlc2JpdCBtbWlvIHByZWY6ICVwUlxuIiwKLQkJCShyZXMtPmZsYWdzICYgUENJX1BSRUZfUkFOR0VfVFlQRV82NCkgPyAiNjQiIDogIjMyIiwKLQkJCXJlcyk7CisJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmRldi0+ZGV2LCAiICBicmlkZ2Ugd2luZG93ICVwUlxuIiwgcmVzKTsKIAl9CiB9CiAKQEAgLTY1MSwxMyArNjQ3LDE0IEBACiAJCSAgICAoY2hpbGQtPm51bWJlciA+IGJ1cy0+c3Vib3JkaW5hdGUpIHx8CiAJCSAgICAoY2hpbGQtPm51bWJlciA8IGJ1cy0+bnVtYmVyKSB8fAogCQkgICAgKGNoaWxkLT5zdWJvcmRpbmF0ZSA8IGJ1cy0+bnVtYmVyKSkgewotCQkJcHJfZGVidWcoIlBDSTogQnVzICMlMDJ4ICgtIyUwMngpIGlzICVzICIKLQkJCQkiaGlkZGVuIGJlaGluZCVzIGJyaWRnZSAjJTAyeCAoLSMlMDJ4KVxuIiwKKwkJCWRldl9pbmZvKCZjaGlsZC0+ZGV2LCAiW2J1cyAlMDJ4LSUwMnhdICVzICIKKwkJCQkiaGlkZGVuIGJlaGluZCVzIGJyaWRnZSAlcyBbYnVzICUwMngtJTAyeF1cbiIsCiAJCQkJY2hpbGQtPm51bWJlciwgY2hpbGQtPnN1Ym9yZGluYXRlLAogCQkJCShidXMtPm51bWJlciA+IGNoaWxkLT5zdWJvcmRpbmF0ZSAmJgogCQkJCSBidXMtPnN1Ym9yZGluYXRlIDwgY2hpbGQtPm51bWJlcikgPwogCQkJCQkid2hvbGx5IiA6ICJwYXJ0aWFsbHkiLAogCQkJCWJ1cy0+c2VsZi0+dHJhbnNwYXJlbnQgPyAiIHRyYW5zcGFyZW50IiA6ICIiLAorCQkJCWRldl9uYW1lKCZidXMtPmRldiksCiAJCQkJYnVzLT5udW1iZXIsIGJ1cy0+c3Vib3JkaW5hdGUpOwogCQl9CiAJCWJ1cyA9IGJ1cy0+cGFyZW50OwpAQCAtNjkzLDYgKzY5MCw3IEBACiAJaWYgKCFwb3MpCiAJCXJldHVybjsKIAlwZGV2LT5pc19wY2llID0gMTsKKwlwZGV2LT5wY2llX2NhcCA9IHBvczsKIAlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBwb3MgKyBQQ0lfRVhQX0ZMQUdTLCAmcmVnMTYpOwogCXBkZXYtPnBjaWVfdHlwZSA9IChyZWcxNiAmIFBDSV9FWFBfRkxBR1NfVFlQRSkgPj4gNDsKIH0KQEAgLTcwMyw3ICs3MDEsNyBAQAogCXUxNiByZWcxNjsKIAl1MzIgcmVnMzI7CiAKLQlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfRVhQKTsKKwlwb3MgPSBwY2lfcGNpZV9jYXAocGRldik7CiAJaWYgKCFwb3MpCiAJCXJldHVybjsKIAlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBwb3MgKyBQQ0lfRVhQX0ZMQUdTLCAmcmVnMTYpOwpAQCAtNzE0LDYgKzcxMiwxMiBAQAogCQlwZGV2LT5pc19ob3RwbHVnX2JyaWRnZSA9IDE7CiB9CiAKK3N0YXRpYyB2b2lkIHNldF9wY2lfYWVyX2Zpcm13YXJlX2ZpcnN0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWlmIChhY3BpX2hlc3RfZmlybXdhcmVfZmlyc3RfcGNpKHBkZXYpKQorCQlwZGV2LT5hZXJfZmlybXdhcmVfZmlyc3QgPSAxOworfQorCiAjZGVmaW5lIExFR0FDWV9JT19SRVNPVVJDRQkoSU9SRVNPVVJDRV9JTyB8IElPUkVTT1VSQ0VfUENJX0ZJWEVEKQogCiAvKioKQEAgLTczMSw2ICs3MzUsNyBAQAogCXUzMiBjbGFzczsKIAl1OCBoZHJfdHlwZTsKIAlzdHJ1Y3QgcGNpX3Nsb3QgKnNsb3Q7CisJaW50IHBvcyA9IDA7CiAKIAlpZiAocGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSEVBREVSX1RZUEUsICZoZHJfdHlwZSkpCiAJCXJldHVybiAtRUlPOwpAQCAtNzQyLDYgKzc0Nyw3IEBACiAJZGV2LT5tdWx0aWZ1bmN0aW9uID0gISEoaGRyX3R5cGUgJiAweDgwKTsKIAlkZXYtPmVycm9yX3N0YXRlID0gcGNpX2NoYW5uZWxfaW9fbm9ybWFsOwogCXNldF9wY2llX3BvcnRfdHlwZShkZXYpOworCXNldF9wY2lfYWVyX2Zpcm13YXJlX2ZpcnN0KGRldik7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNsb3QsICZkZXYtPmJ1cy0+c2xvdHMsIGxpc3QpCiAJCWlmIChQQ0lfU0xPVChkZXYtPmRldmZuKSA9PSBzbG90LT5udW1iZXIpCkBAIC04MjIsNiArODI4LDExIEBACiAJCWRldi0+dHJhbnNwYXJlbnQgPSAoKGRldi0+Y2xhc3MgJiAweGZmKSA9PSAxKTsKIAkJcGNpX3JlYWRfYmFzZXMoZGV2LCAyLCBQQ0lfUk9NX0FERFJFU1MxKTsKIAkJc2V0X3BjaWVfaG90cGx1Z19icmlkZ2UoZGV2KTsKKwkJcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfU1NWSUQpOworCQlpZiAocG9zKSB7CisJCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHBvcyArIFBDSV9TU1ZJRF9WRU5ET1JfSUQsICZkZXYtPnN1YnN5c3RlbV92ZW5kb3IpOworCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBwb3MgKyBQQ0lfU1NWSURfREVWSUNFX0lELCAmZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKTsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgUENJX0hFQURFUl9UWVBFX0NBUkRCVVM6CQkgICAgLyogQ2FyZEJ1cyBicmlkZ2UgaGVhZGVyICovCkBAIC05MDcsNyArOTE4LDcgQEAKIAlpZiAoY2xhc3MgPT0gUENJX0NMQVNTX0JSSURHRV9IT1NUKQogCQlyZXR1cm4gcGNpX2NmZ19zcGFjZV9zaXplX2V4dChkZXYpOwogCi0JcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfRVhQKTsKKwlwb3MgPSBwY2lfcGNpZV9jYXAoZGV2KTsKIAlpZiAoIXBvcykgewogCQlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9QQ0lYKTsKIAkJaWYgKCFwb3MpCkBAIC0xMDE0LDYgKzEwMjUsOSBAQAogCiAJLyogU2luZ2xlIFJvb3QgSS9PIFZpcnR1YWxpemF0aW9uICovCiAJcGNpX2lvdl9pbml0KGRldik7CisKKwkvKiBFbmFibGUgQUNTIFAyUCB1cHN0cmVhbSBmb3J3YXJkaW5nICovCisJcGNpX2VuYWJsZV9hY3MoZGV2KTsKIH0KIAogdm9pZCBwY2lfZGV2aWNlX2FkZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcGNpX2J1cyAqYnVzKQpAQCAtMTExMCw3ICsxMTI0LDcgQEAKIAl1bnNpZ25lZCBpbnQgZGV2Zm4sIHBhc3MsIG1heCA9IGJ1cy0+c2Vjb25kYXJ5OwogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiAKLQlwcl9kZWJ1ZygiUENJOiBTY2FubmluZyBidXMgJTA0eDolMDJ4XG4iLCBwY2lfZG9tYWluX25yKGJ1cyksIGJ1cy0+bnVtYmVyKTsKKwlkZXZfZGJnKCZidXMtPmRldiwgInNjYW5uaW5nIGJ1c1xuIik7CiAKIAkvKiBHbyBmaW5kIHRoZW0sIFJvdmVyISAqLwogCWZvciAoZGV2Zm4gPSAwOyBkZXZmbiA8IDB4MTAwOyBkZXZmbiArPSA4KQpAQCAtMTEyNCw4ICsxMTM4LDcgQEAKIAkgKiBhbGwgUENJLXRvLVBDSSBicmlkZ2VzIG9uIHRoaXMgYnVzLgogCSAqLwogCWlmICghYnVzLT5pc19hZGRlZCkgewotCQlwcl9kZWJ1ZygiUENJOiBGaXh1cHMgZm9yIGJ1cyAlMDR4OiUwMnhcbiIsCi0JCQkgcGNpX2RvbWFpbl9ucihidXMpLCBidXMtPm51bWJlcik7CisJCWRldl9kYmcoJmJ1cy0+ZGV2LCAiZml4dXBzIGZvciBidXNcbiIpOwogCQlwY2liaW9zX2ZpeHVwX2J1cyhidXMpOwogCQlpZiAocGNpX2lzX3Jvb3RfYnVzKGJ1cykpCiAJCQlidXMtPmlzX2FkZGVkID0gMTsKQEAgLTExNDUsOCArMTE1OCw3IEBACiAJICoKIAkgKiBSZXR1cm4gaG93IGZhciB3ZSd2ZSBnb3QgZmluZGluZyBzdWItYnVzZXMuCiAJICovCi0JcHJfZGVidWcoIlBDSTogQnVzIHNjYW4gZm9yICUwNHg6JTAyeCByZXR1cm5pbmcgd2l0aCBtYXg9JTAyeFxuIiwKLQkJcGNpX2RvbWFpbl9ucihidXMpLCBidXMtPm51bWJlciwgbWF4KTsKKwlkZXZfZGJnKCZidXMtPmRldiwgImJ1cyBzY2FuIHJldHVybmluZyB3aXRoIG1heD0lMDJ4XG4iLCBtYXgpOwogCXJldHVybiBtYXg7CiB9CiAKQEAgLTExNTQsNyArMTE2Niw3IEBACiAJCWludCBidXMsIHN0cnVjdCBwY2lfb3BzICpvcHMsIHZvaWQgKnN5c2RhdGEpCiB7CiAJaW50IGVycm9yOwotCXN0cnVjdCBwY2lfYnVzICpiOworCXN0cnVjdCBwY2lfYnVzICpiLCAqYjI7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCiAJYiA9IHBjaV9hbGxvY19idXMoKTsKQEAgLTExNzAsOSArMTE4MiwxMCBAQAogCWItPnN5c2RhdGEgPSBzeXNkYXRhOwogCWItPm9wcyA9IG9wczsKIAotCWlmIChwY2lfZmluZF9idXMocGNpX2RvbWFpbl9ucihiKSwgYnVzKSkgeworCWIyID0gcGNpX2ZpbmRfYnVzKHBjaV9kb21haW5fbnIoYiksIGJ1cyk7CisJaWYgKGIyKSB7CiAJCS8qIElmIHdlIGFscmVhZHkgZ290IHRvIHRoaXMgYnVzIHRocm91Z2ggYSBkaWZmZXJlbnQgYnJpZGdlLCBpZ25vcmUgaXQgKi8KLQkJcHJfZGVidWcoIlBDSTogQnVzICUwNHg6JTAyeCBhbHJlYWR5IGtub3duXG4iLCBwY2lfZG9tYWluX25yKGIpLCBidXMpOworCQlkZXZfZGJnKCZiMi0+ZGV2LCAiYnVzIGFscmVhZHkga25vd25cbiIpOwogCQlnb3RvIGVycl9vdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9xdWlya3MuYyBiL2RyaXZlcnMvcGNpL3F1aXJrcy5jCmluZGV4IDI0NWQyY2QuLjdjZmE3YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jCisrKyBiL2RyaXZlcnMvcGNpL3F1aXJrcy5jCkBAIC0zNTcsNyArMzU3LDcgQEAKIAkJcGNpYmlvc19idXNfdG9fcmVzb3VyY2UoZGV2LCByZXMsICZidXNfcmVnaW9uKTsKIAogCQlwY2lfY2xhaW1fcmVzb3VyY2UoZGV2LCBucik7Ci0JCWRldl9pbmZvKCZkZXYtPmRldiwgInF1aXJrOiByZWdpb24gJTA0eC0lMDR4IGNsYWltZWQgYnkgJXNcbiIsIHJlZ2lvbiwgcmVnaW9uICsgc2l6ZSAtIDEsIG5hbWUpOworCQlkZXZfaW5mbygmZGV2LT5kZXYsICJxdWlyazogJXBSIGNsYWltZWQgYnkgJXNcbiIsIHJlcywgbmFtZSk7CiAJfQogfQkKIApAQCAtMTY4MCw2ICsxNjgwLDcgQEAKICAqLwogI2RlZmluZSBBTURfODEzWF9NSVNDCQkJMHg0MAogI2RlZmluZSBBTURfODEzWF9OT0lPQU1PREUJCSgxPDwwKQorI2RlZmluZSBBTURfODEzWF9SRVZfQjEJCQkweDEyCiAjZGVmaW5lIEFNRF84MTNYX1JFVl9CMgkJCTB4MTMKIAogc3RhdGljIHZvaWQgcXVpcmtfZGlzYWJsZV9hbWRfODEzeF9ib290X2ludGVycnVwdChzdHJ1Y3QgcGNpX2RldiAqZGV2KQpAQCAtMTY4OCw3ICsxNjg5LDggQEAKIAogCWlmIChub2lvYXBpY3F1aXJrKQogCQlyZXR1cm47Ci0JaWYgKGRldi0+cmV2aXNpb24gPT0gQU1EXzgxM1hfUkVWX0IyKQorCWlmICgoZGV2LT5yZXZpc2lvbiA9PSBBTURfODEzWF9SRVZfQjEpIHx8CisJICAgIChkZXYtPnJldmlzaW9uID09IEFNRF84MTNYX1JFVl9CMikpCiAJCXJldHVybjsKIAogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIEFNRF84MTNYX01JU0MsICZwY2lfY29uZmlnX2R3b3JkKTsKQEAgLTE2OTgsOCArMTcwMCwxMCBAQAogCWRldl9pbmZvKCZkZXYtPmRldiwgImRpc2FibGVkIGJvb3QgaW50ZXJydXB0cyBvbiBkZXZpY2UgWyUwNHg6JTA0eF1cbiIsCiAJCSBkZXYtPnZlbmRvciwgZGV2LT5kZXZpY2UpOwogfQotREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9BTUQsICAgUENJX0RFVklDRV9JRF9BTURfODEzMV9CUklER0UsIAlxdWlya19kaXNhYmxlX2FtZF84MTN4X2Jvb3RfaW50ZXJydXB0KTsKLURFQ0xBUkVfUENJX0ZJWFVQX1JFU1VNRShQQ0lfVkVORE9SX0lEX0FNRCwgICBQQ0lfREVWSUNFX0lEX0FNRF84MTMyX0JSSURHRSwgCXF1aXJrX2Rpc2FibGVfYW1kXzgxM3hfYm9vdF9pbnRlcnJ1cHQpOworREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9BTUQsCVBDSV9ERVZJQ0VfSURfQU1EXzgxMzFfQlJJREdFLAlxdWlya19kaXNhYmxlX2FtZF84MTN4X2Jvb3RfaW50ZXJydXB0KTsKK0RFQ0xBUkVfUENJX0ZJWFVQX1JFU1VNRShQQ0lfVkVORE9SX0lEX0FNRCwJUENJX0RFVklDRV9JRF9BTURfODEzMV9CUklER0UsCXF1aXJrX2Rpc2FibGVfYW1kXzgxM3hfYm9vdF9pbnRlcnJ1cHQpOworREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9BTUQsCVBDSV9ERVZJQ0VfSURfQU1EXzgxMzJfQlJJREdFLAlxdWlya19kaXNhYmxlX2FtZF84MTN4X2Jvb3RfaW50ZXJydXB0KTsKK0RFQ0xBUkVfUENJX0ZJWFVQX1JFU1VNRShQQ0lfVkVORE9SX0lEX0FNRCwJUENJX0RFVklDRV9JRF9BTURfODEzMl9CUklER0UsCXF1aXJrX2Rpc2FibGVfYW1kXzgxM3hfYm9vdF9pbnRlcnJ1cHQpOwogCiAjZGVmaW5lIEFNRF84MTExX1BDSV9JUlFfUk9VVElORwkweDU2CiAKQEAgLTI1OTUsOSArMjU5OSwzNyBAQAogc3RhdGljIGludCBfX2luaXQgcGNpX2FwcGx5X2ZpbmFsX3F1aXJrcyh2b2lkKQogewogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworCXU4IGNscyA9IDA7CisJdTggdG1wOworCisJaWYgKHBjaV9jYWNoZV9saW5lX3NpemUpCisJCXByaW50ayhLRVJOX0RFQlVHICJQQ0k6IENMUyAldSBieXRlc1xuIiwKKwkJICAgICAgIHBjaV9jYWNoZV9saW5lX3NpemUgPDwgMik7CiAKIAl3aGlsZSAoKGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGRldikpICE9IE5VTEwpIHsKIAkJcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfZmluYWwsIGRldik7CisJCS8qCisJCSAqIElmIGFyY2ggaGFzbid0IHNldCBpdCBleHBsaWNpdGx5IHlldCwgdXNlIHRoZSBDTFMKKwkJICogdmFsdWUgc2hhcmVkIGJ5IGFsbCBQQ0kgZGV2aWNlcy4gIElmIHRoZXJlJ3MgYQorCQkgKiBtaXNtYXRjaCwgZmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0IHZhbHVlLgorCQkgKi8KKwkJaWYgKCFwY2lfY2FjaGVfbGluZV9zaXplKSB7CisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsICZ0bXApOworCQkJaWYgKCFjbHMpCisJCQkJY2xzID0gdG1wOworCQkJaWYgKCF0bXAgfHwgY2xzID09IHRtcCkKKwkJCQljb250aW51ZTsKKworCQkJcHJpbnRrKEtFUk5fREVCVUcgIlBDSTogQ0xTIG1pc21hdGNoICgldSAhPSAldSksICIKKwkJCSAgICAgICAidXNpbmcgJXUgYnl0ZXNcbiIsIGNscyA8PCAyLCB0bXAgPDwgMiwKKwkJCSAgICAgICBwY2lfZGZsX2NhY2hlX2xpbmVfc2l6ZSA8PCAyKTsKKwkJCXBjaV9jYWNoZV9saW5lX3NpemUgPSBwY2lfZGZsX2NhY2hlX2xpbmVfc2l6ZTsKKwkJfQorCX0KKwlpZiAoIXBjaV9jYWNoZV9saW5lX3NpemUpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlBDSTogQ0xTICV1IGJ5dGVzLCBkZWZhdWx0ICV1XG4iLAorCQkgICAgICAgY2xzIDw8IDIsIHBjaV9kZmxfY2FjaGVfbGluZV9zaXplIDw8IDIpOworCQlwY2lfY2FjaGVfbGluZV9zaXplID0gY2xzOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2VhcmNoLmMgYi9kcml2ZXJzL3BjaS9zZWFyY2guYwppbmRleCBlYzQxNTM1Li42ZGFlODcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9zZWFyY2guYworKysgYi9kcml2ZXJzL3BjaS9zZWFyY2guYwpAQCAtMjYsMTQgKzI2LDE0IEBACiB7CiAJc3RydWN0IHBjaV9kZXYgKnRtcCA9IE5VTEw7CiAKLQlpZiAocGRldi0+aXNfcGNpZSkKKwlpZiAocGNpX2lzX3BjaWUocGRldikpCiAJCXJldHVybiBOVUxMOwogCXdoaWxlICgxKSB7CiAJCWlmIChwY2lfaXNfcm9vdF9idXMocGRldi0+YnVzKSkKIAkJCWJyZWFrOwogCQlwZGV2ID0gcGRldi0+YnVzLT5zZWxmOwogCQkvKiBhIHAycCBicmlkZ2UgKi8KLQkJaWYgKCFwZGV2LT5pc19wY2llKSB7CisJCWlmICghcGNpX2lzX3BjaWUocGRldikpIHsKIAkJCXRtcCA9IHBkZXY7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtMTQ5LDMyICsxNDksMzMgQEAKIH0KIAogLyoqCi0gKiBwY2lfZ2V0X2J1c19hbmRfc2xvdCAtIGxvY2F0ZSBQQ0kgZGV2aWNlIGZyb20gYSBnaXZlbiBQQ0kgYnVzICYgc2xvdAotICogQGJ1czogbnVtYmVyIG9mIFBDSSBidXMgb24gd2hpY2ggZGVzaXJlZCBQQ0kgZGV2aWNlIHJlc2lkZXMKLSAqIEBkZXZmbjogZW5jb2RlcyBudW1iZXIgb2YgUENJIHNsb3QgaW4gd2hpY2ggdGhlIGRlc2lyZWQgUENJCi0gKiBkZXZpY2UgcmVzaWRlcyBhbmQgdGhlIGxvZ2ljYWwgZGV2aWNlIG51bWJlciB3aXRoaW4gdGhhdCBzbG90Ci0gKiBpbiBjYXNlIG9mIG11bHRpLWZ1bmN0aW9uIGRldmljZXMuCisgKiBwY2lfZ2V0X2RvbWFpbl9idXNfYW5kX3Nsb3QgLSBsb2NhdGUgUENJIGRldmljZSBmb3IgYSBnaXZlbiBQQ0kgZG9tYWluIChzZWdtZW50KSwgYnVzLCBhbmQgc2xvdAorICogQGRvbWFpbjogUENJIGRvbWFpbi9zZWdtZW50IG9uIHdoaWNoIHRoZSBQQ0kgZGV2aWNlIHJlc2lkZXMuCisgKiBAYnVzOiBQQ0kgYnVzIG9uIHdoaWNoIGRlc2lyZWQgUENJIGRldmljZSByZXNpZGVzCisgKiBAZGV2Zm46IGVuY29kZXMgbnVtYmVyIG9mIFBDSSBzbG90IGluIHdoaWNoIHRoZSBkZXNpcmVkIFBDSSBkZXZpY2UKKyAqIHJlc2lkZXMgYW5kIHRoZSBsb2dpY2FsIGRldmljZSBudW1iZXIgd2l0aGluIHRoYXQgc2xvdCBpbiBjYXNlIG9mCisgKiBtdWx0aS1mdW5jdGlvbiBkZXZpY2VzLgogICoKLSAqIE5vdGU6IHRoZSBidXMvc2xvdCBzZWFyY2ggaXMgbGltaXRlZCB0byBQQ0kgZG9tYWluIChzZWdtZW50KSAwLgotICoKLSAqIEdpdmVuIGEgUENJIGJ1cyBhbmQgc2xvdC9mdW5jdGlvbiBudW1iZXIsIHRoZSBkZXNpcmVkIFBDSSBkZXZpY2UKLSAqIGlzIGxvY2F0ZWQgaW4gc3lzdGVtIGdsb2JhbCBsaXN0IG9mIFBDSSBkZXZpY2VzLiAgSWYgdGhlIGRldmljZQotICogaXMgZm91bmQsIGEgcG9pbnRlciB0byBpdHMgZGF0YSBzdHJ1Y3R1cmUgaXMgcmV0dXJuZWQuICBJZiBubwotICogZGV2aWNlIGlzIGZvdW5kLCAlTlVMTCBpcyByZXR1cm5lZC4gVGhlIHJldHVybmVkIGRldmljZSBoYXMgaXRzCi0gKiByZWZlcmVuY2UgY291bnQgYnVtcGVkIGJ5IG9uZS4KKyAqIEdpdmVuIGEgUENJIGRvbWFpbiwgYnVzLCBhbmQgc2xvdC9mdW5jdGlvbiBudW1iZXIsIHRoZSBkZXNpcmVkIFBDSQorICogZGV2aWNlIGlzIGxvY2F0ZWQgaW4gdGhlIGxpc3Qgb2YgUENJIGRldmljZXMuIElmIHRoZSBkZXZpY2UgaXMKKyAqIGZvdW5kLCBpdHMgcmVmZXJlbmNlIGNvdW50IGlzIGluY3JlYXNlZCBhbmQgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEKKyAqIHBvaW50ZXIgdG8gaXRzIGRhdGEgc3RydWN0dXJlLiAgVGhlIGNhbGxlciBtdXN0IGRlY3JlbWVudCB0aGUKKyAqIHJlZmVyZW5jZSBjb3VudCBieSBjYWxsaW5nIHBjaV9kZXZfcHV0KCkuICBJZiBubyBkZXZpY2UgaXMgZm91bmQsCisgKiAlTlVMTCBpcyByZXR1cm5lZC4KICAqLwotCi1zdHJ1Y3QgcGNpX2RldiAqIHBjaV9nZXRfYnVzX2FuZF9zbG90KHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZmbikKK3N0cnVjdCBwY2lfZGV2ICpwY2lfZ2V0X2RvbWFpbl9idXNfYW5kX3Nsb3QoaW50IGRvbWFpbiwgdW5zaWduZWQgaW50IGJ1cywKKwkJCQkJICAgIHVuc2lnbmVkIGludCBkZXZmbikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKIAogCXdoaWxlICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZGV2KSkgIT0gTlVMTCkgewotCQlpZiAocGNpX2RvbWFpbl9ucihkZXYtPmJ1cykgPT0gMCAmJgotCQkgICAoZGV2LT5idXMtPm51bWJlciA9PSBidXMgJiYgZGV2LT5kZXZmbiA9PSBkZXZmbikpCisJCWlmIChwY2lfZG9tYWluX25yKGRldi0+YnVzKSA9PSBkb21haW4gJiYKKwkJICAgIChkZXYtPmJ1cy0+bnVtYmVyID09IGJ1cyAmJiBkZXYtPmRldmZuID09IGRldmZuKSkKIAkJCXJldHVybiBkZXY7CiAJfQogCXJldHVybiBOVUxMOwogfQorRVhQT1JUX1NZTUJPTChwY2lfZ2V0X2RvbWFpbl9idXNfYW5kX3Nsb3QpOwogCiBzdGF0aWMgaW50IG1hdGNoX3BjaV9kZXZfYnlfaWQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQogewpAQCAtMzU0LDUgKzM1NSw0IEBACiBFWFBPUlRfU1lNQk9MKHBjaV9nZXRfZGV2aWNlKTsKIEVYUE9SVF9TWU1CT0wocGNpX2dldF9zdWJzeXMpOwogRVhQT1JUX1NZTUJPTChwY2lfZ2V0X3Nsb3QpOwotRVhQT1JUX1NZTUJPTChwY2lfZ2V0X2J1c19hbmRfc2xvdCk7CiBFWFBPUlRfU1lNQk9MKHBjaV9nZXRfY2xhc3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwppbmRleCBjYjFhMDI3Li5jNDhjZDM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYworKysgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwpAQCAtNzEsNTMgKzcxLDUwIEBACiB2b2lkIHBjaV9zZXR1cF9jYXJkYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmJyaWRnZSA9IGJ1cy0+c2VsZjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlzdHJ1Y3QgcGNpX2J1c19yZWdpb24gcmVnaW9uOwogCi0JZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiQ2FyZEJ1cyBicmlkZ2UsIHNlY29uZGFyeSBidXMgJTA0eDolMDJ4XG4iLAotCQkgcGNpX2RvbWFpbl9ucihidXMpLCBidXMtPm51bWJlcik7CisJZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiQ2FyZEJ1cyBicmlkZ2UgdG8gW2J1cyAlMDJ4LSUwMnhdXG4iLAorCQkgYnVzLT5zZWNvbmRhcnksIGJ1cy0+c3Vib3JkaW5hdGUpOwogCi0JcGNpYmlvc19yZXNvdXJjZV90b19idXMoYnJpZGdlLCAmcmVnaW9uLCBidXMtPnJlc291cmNlWzBdKTsKLQlpZiAoYnVzLT5yZXNvdXJjZVswXS0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CisJcmVzID0gYnVzLT5yZXNvdXJjZVswXTsKKwlwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhicmlkZ2UsICZyZWdpb24sIHJlcyk7CisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CiAJCS8qCiAJCSAqIFRoZSBJTyByZXNvdXJjZSBpcyBhbGxvY2F0ZWQgYSByYW5nZSB0d2ljZSBhcyBsYXJnZSBhcyBpdAogCQkgKiB3b3VsZCBub3JtYWxseSBuZWVkLiAgVGhpcyBhbGxvd3MgdXMgdG8gc2V0IGJvdGggSU8gcmVncy4KIAkJICovCi0JCWRldl9pbmZvKCZicmlkZ2UtPmRldiwgIiAgSU8gd2luZG93OiAlIzA4bHgtJSMwOGx4XG4iLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmVnaW9uLnN0YXJ0LAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmVnaW9uLmVuZCk7CisJCWRldl9pbmZvKCZicmlkZ2UtPmRldiwgIiAgYnJpZGdlIHdpbmRvdyAlcFJcbiIsIHJlcyk7CiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYnJpZGdlLCBQQ0lfQ0JfSU9fQkFTRV8wLAogCQkJCQlyZWdpb24uc3RhcnQpOwogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyaWRnZSwgUENJX0NCX0lPX0xJTUlUXzAsCiAJCQkJCXJlZ2lvbi5lbmQpOwogCX0KIAotCXBjaWJpb3NfcmVzb3VyY2VfdG9fYnVzKGJyaWRnZSwgJnJlZ2lvbiwgYnVzLT5yZXNvdXJjZVsxXSk7Ci0JaWYgKGJ1cy0+cmVzb3VyY2VbMV0tPmZsYWdzICYgSU9SRVNPVVJDRV9JTykgewotCQlkZXZfaW5mbygmYnJpZGdlLT5kZXYsICIgIElPIHdpbmRvdzogJSMwOGx4LSUjMDhseFxuIiwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nKXJlZ2lvbi5zdGFydCwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nKXJlZ2lvbi5lbmQpOworCXJlcyA9IGJ1cy0+cmVzb3VyY2VbMV07CisJcGNpYmlvc19yZXNvdXJjZV90b19idXMoYnJpZGdlLCAmcmVnaW9uLCByZXMpOworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykgeworCQlkZXZfaW5mbygmYnJpZGdlLT5kZXYsICIgIGJyaWRnZSB3aW5kb3cgJXBSXG4iLCByZXMpOwogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyaWRnZSwgUENJX0NCX0lPX0JBU0VfMSwKIAkJCQkJcmVnaW9uLnN0YXJ0KTsKIAkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicmlkZ2UsIFBDSV9DQl9JT19MSU1JVF8xLAogCQkJCQlyZWdpb24uZW5kKTsKIAl9CiAKLQlwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhicmlkZ2UsICZyZWdpb24sIGJ1cy0+cmVzb3VyY2VbMl0pOwotCWlmIChidXMtPnJlc291cmNlWzJdLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSB7Ci0JCWRldl9pbmZvKCZicmlkZ2UtPmRldiwgIiAgUFJFRkVUQ0ggd2luZG93OiAlIzA4bHgtJSMwOGx4XG4iLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmVnaW9uLnN0YXJ0LAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmVnaW9uLmVuZCk7CisJcmVzID0gYnVzLT5yZXNvdXJjZVsyXTsKKwlwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhicmlkZ2UsICZyZWdpb24sIHJlcyk7CisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkgeworCQlkZXZfaW5mbygmYnJpZGdlLT5kZXYsICIgIGJyaWRnZSB3aW5kb3cgJXBSXG4iLCByZXMpOwogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyaWRnZSwgUENJX0NCX01FTU9SWV9CQVNFXzAsCiAJCQkJCXJlZ2lvbi5zdGFydCk7CiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYnJpZGdlLCBQQ0lfQ0JfTUVNT1JZX0xJTUlUXzAsCiAJCQkJCXJlZ2lvbi5lbmQpOwogCX0KIAotCXBjaWJpb3NfcmVzb3VyY2VfdG9fYnVzKGJyaWRnZSwgJnJlZ2lvbiwgYnVzLT5yZXNvdXJjZVszXSk7Ci0JaWYgKGJ1cy0+cmVzb3VyY2VbM10tPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pIHsKLQkJZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiICBNRU0gd2luZG93OiAlIzA4bHgtJSMwOGx4XG4iLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmVnaW9uLnN0YXJ0LAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmVnaW9uLmVuZCk7CisJcmVzID0gYnVzLT5yZXNvdXJjZVszXTsKKwlwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhicmlkZ2UsICZyZWdpb24sIHJlcyk7CisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkgeworCQlkZXZfaW5mbygmYnJpZGdlLT5kZXYsICIgIGJyaWRnZSB3aW5kb3cgJXBSXG4iLCByZXMpOwogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyaWRnZSwgUENJX0NCX01FTU9SWV9CQVNFXzEsCiAJCQkJCXJlZ2lvbi5zdGFydCk7CiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYnJpZGdlLCBQQ0lfQ0JfTUVNT1JZX0xJTUlUXzEsCkBAIC0xNDAsMzQgKzEzNywzMyBAQAogc3RhdGljIHZvaWQgcGNpX3NldHVwX2JyaWRnZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewogCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2UgPSBidXMtPnNlbGY7CisJc3RydWN0IHJlc291cmNlICpyZXM7CiAJc3RydWN0IHBjaV9idXNfcmVnaW9uIHJlZ2lvbjsKIAl1MzIgbCwgYnUsIGx1LCBpb191cHBlcjE2OwotCWludCBwcmVmX21lbTY0OwogCiAJaWYgKHBjaV9pc19lbmFibGVkKGJyaWRnZSkpCiAJCXJldHVybjsKIAotCWRldl9pbmZvKCZicmlkZ2UtPmRldiwgIlBDSSBicmlkZ2UsIHNlY29uZGFyeSBidXMgJTA0eDolMDJ4XG4iLAotCQkgcGNpX2RvbWFpbl9ucihidXMpLCBidXMtPm51bWJlcik7CisJZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiUENJIGJyaWRnZSB0byBbYnVzICUwMngtJTAyeF1cbiIsCisJCSBidXMtPnNlY29uZGFyeSwgYnVzLT5zdWJvcmRpbmF0ZSk7CiAKIAkvKiBTZXQgdXAgdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBQQ0kgSS9PIHNlZ21lbnQgZm9yIHRoaXMgYnVzLiAqLwotCXBjaWJpb3NfcmVzb3VyY2VfdG9fYnVzKGJyaWRnZSwgJnJlZ2lvbiwgYnVzLT5yZXNvdXJjZVswXSk7Ci0JaWYgKGJ1cy0+cmVzb3VyY2VbMF0tPmZsYWdzICYgSU9SRVNPVVJDRV9JTykgeworCXJlcyA9IGJ1cy0+cmVzb3VyY2VbMF07CisJcGNpYmlvc19yZXNvdXJjZV90b19idXMoYnJpZGdlLCAmcmVnaW9uLCByZXMpOworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykgewogCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoYnJpZGdlLCBQQ0lfSU9fQkFTRSwgJmwpOwogCQlsICY9IDB4ZmZmZjAwMDA7CiAJCWwgfD0gKHJlZ2lvbi5zdGFydCA+PiA4KSAmIDB4MDBmMDsKIAkJbCB8PSByZWdpb24uZW5kICYgMHhmMDAwOwogCQkvKiBTZXQgdXAgdXBwZXIgMTYgYml0cyBvZiBJL08gYmFzZS9saW1pdC4gKi8KIAkJaW9fdXBwZXIxNiA9IChyZWdpb24uZW5kICYgMHhmZmZmMDAwMCkgfCAocmVnaW9uLnN0YXJ0ID4+IDE2KTsKLQkJZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiICBJTyB3aW5kb3c6ICUjMDRseC0lIzA0bHhcbiIsCi0JCSAgICAodW5zaWduZWQgbG9uZylyZWdpb24uc3RhcnQsCi0JCSAgICAodW5zaWduZWQgbG9uZylyZWdpb24uZW5kKTsKKwkJZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiICBicmlkZ2Ugd2luZG93ICVwUlxuIiwgcmVzKTsKIAl9CiAJZWxzZSB7CiAJCS8qIENsZWFyIHVwcGVyIDE2IGJpdHMgb2YgSS9PIGJhc2UvbGltaXQuICovCiAJCWlvX3VwcGVyMTYgPSAwOwogCQlsID0gMHgwMGYwOwotCQlkZXZfaW5mbygmYnJpZGdlLT5kZXYsICIgIElPIHdpbmRvdzogZGlzYWJsZWRcbiIpOworCQlkZXZfaW5mbygmYnJpZGdlLT5kZXYsICIgIGJyaWRnZSB3aW5kb3cgW2lvICBkaXNhYmxlZF1cbiIpOwogCX0KIAkvKiBUZW1wb3JhcmlseSBkaXNhYmxlIHRoZSBJL08gcmFuZ2UgYmVmb3JlIHVwZGF0aW5nIFBDSV9JT19CQVNFLiAqLwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYnJpZGdlLCBQQ0lfSU9fQkFTRV9VUFBFUjE2LCAweDAwMDBmZmZmKTsKQEAgLTE3OCwxNyArMTc0LDE2IEBACiAKIAkvKiBTZXQgdXAgdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBQQ0kgTWVtb3J5IHNlZ21lbnQKIAkgICBmb3IgdGhpcyBidXMuICovCi0JcGNpYmlvc19yZXNvdXJjZV90b19idXMoYnJpZGdlLCAmcmVnaW9uLCBidXMtPnJlc291cmNlWzFdKTsKLQlpZiAoYnVzLT5yZXNvdXJjZVsxXS0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkgeworCXJlcyA9IGJ1cy0+cmVzb3VyY2VbMV07CisJcGNpYmlvc19yZXNvdXJjZV90b19idXMoYnJpZGdlLCAmcmVnaW9uLCByZXMpOworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pIHsKIAkJbCA9IChyZWdpb24uc3RhcnQgPj4gMTYpICYgMHhmZmYwOwogCQlsIHw9IHJlZ2lvbi5lbmQgJiAweGZmZjAwMDAwOwotCQlkZXZfaW5mbygmYnJpZGdlLT5kZXYsICIgIE1FTSB3aW5kb3c6ICUjMDhseC0lIzA4bHhcbiIsCi0JCSAgICAodW5zaWduZWQgbG9uZylyZWdpb24uc3RhcnQsCi0JCSAgICAodW5zaWduZWQgbG9uZylyZWdpb24uZW5kKTsKKwkJZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiICBicmlkZ2Ugd2luZG93ICVwUlxuIiwgcmVzKTsKIAl9CiAJZWxzZSB7CiAJCWwgPSAweDAwMDBmZmYwOwotCQlkZXZfaW5mbygmYnJpZGdlLT5kZXYsICIgIE1FTSB3aW5kb3c6IGRpc2FibGVkXG4iKTsKKwkJZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiICBicmlkZ2Ugd2luZG93IFttZW0gZGlzYWJsZWRdXG4iKTsKIAl9CiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicmlkZ2UsIFBDSV9NRU1PUllfQkFTRSwgbCk7CiAKQEAgLTE5OCwzNCArMTkzLDI3IEBACiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicmlkZ2UsIFBDSV9QUkVGX0xJTUlUX1VQUEVSMzIsIDApOwogCiAJLyogU2V0IHVwIFBSRUYgYmFzZS9saW1pdC4gKi8KLQlwcmVmX21lbTY0ID0gMDsKIAlidSA9IGx1ID0gMDsKLQlwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhicmlkZ2UsICZyZWdpb24sIGJ1cy0+cmVzb3VyY2VbMl0pOwotCWlmIChidXMtPnJlc291cmNlWzJdLT5mbGFncyAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpIHsKLQkJaW50IHdpZHRoID0gODsKKwlyZXMgPSBidXMtPnJlc291cmNlWzJdOworCXBjaWJpb3NfcmVzb3VyY2VfdG9fYnVzKGJyaWRnZSwgJnJlZ2lvbiwgcmVzKTsKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpIHsKIAkJbCA9IChyZWdpb24uc3RhcnQgPj4gMTYpICYgMHhmZmYwOwogCQlsIHw9IHJlZ2lvbi5lbmQgJiAweGZmZjAwMDAwOwotCQlpZiAoYnVzLT5yZXNvdXJjZVsyXS0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTV82NCkgewotCQkJcHJlZl9tZW02NCA9IDE7CisJCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU1fNjQpIHsKIAkJCWJ1ID0gdXBwZXJfMzJfYml0cyhyZWdpb24uc3RhcnQpOwogCQkJbHUgPSB1cHBlcl8zMl9iaXRzKHJlZ2lvbi5lbmQpOwotCQkJd2lkdGggPSAxNjsKIAkJfQotCQlkZXZfaW5mbygmYnJpZGdlLT5kZXYsICIgIFBSRUZFVENIIHdpbmRvdzogJSMwKmxseC0lIzAqbGx4XG4iLAotCQkJCXdpZHRoLCAodW5zaWduZWQgbG9uZyBsb25nKXJlZ2lvbi5zdGFydCwKLQkJCQl3aWR0aCwgKHVuc2lnbmVkIGxvbmcgbG9uZylyZWdpb24uZW5kKTsKKwkJZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiICBicmlkZ2Ugd2luZG93ICVwUlxuIiwgcmVzKTsKIAl9CiAJZWxzZSB7CiAJCWwgPSAweDAwMDBmZmYwOwotCQlkZXZfaW5mbygmYnJpZGdlLT5kZXYsICIgIFBSRUZFVENIIHdpbmRvdzogZGlzYWJsZWRcbiIpOworCQlkZXZfaW5mbygmYnJpZGdlLT5kZXYsICIgIGJyaWRnZSB3aW5kb3cgW21lbSBwcmVmIGRpc2FibGVkXVxuIik7CiAJfQogCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYnJpZGdlLCBQQ0lfUFJFRl9NRU1PUllfQkFTRSwgbCk7CiAKLQlpZiAocHJlZl9tZW02NCkgewotCQkvKiBTZXQgdGhlIHVwcGVyIDMyIGJpdHMgb2YgUFJFRiBiYXNlICYgbGltaXQuICovCi0JCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYnJpZGdlLCBQQ0lfUFJFRl9CQVNFX1VQUEVSMzIsIGJ1KTsKLQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicmlkZ2UsIFBDSV9QUkVGX0xJTUlUX1VQUEVSMzIsIGx1KTsKLQl9CisJLyogU2V0IHRoZSB1cHBlciAzMiBiaXRzIG9mIFBSRUYgYmFzZSAmIGxpbWl0LiAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYnJpZGdlLCBQQ0lfUFJFRl9CQVNFX1VQUEVSMzIsIGJ1KTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyaWRnZSwgUENJX1BSRUZfTElNSVRfVVBQRVIzMiwgbHUpOwogCiAJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGJyaWRnZSwgUENJX0JSSURHRV9DT05UUk9MLCBidXMtPmJyaWRnZV9jdGwpOwogfQpAQCAtMzQ1LDYgKzMzMywxMCBAQAogI2VuZGlmCiAJc2l6ZSA9IEFMSUdOKHNpemUgKyBzaXplMSwgNDA5Nik7CiAJaWYgKCFzaXplKSB7CisJCWlmIChiX3Jlcy0+c3RhcnQgfHwgYl9yZXMtPmVuZCkKKwkJCWRldl9pbmZvKCZidXMtPnNlbGYtPmRldiwgImRpc2FibGluZyBicmlkZ2Ugd2luZG93ICIKKwkJCQkgIiVwUiB0byBbYnVzICUwMngtJTAyeF0gKHVudXNlZClcbiIsIGJfcmVzLAorCQkJCSBidXMtPnNlY29uZGFyeSwgYnVzLT5zdWJvcmRpbmF0ZSk7CiAJCWJfcmVzLT5mbGFncyA9IDA7CiAJCXJldHVybjsKIAl9CkBAIC0zOTAsOCArMzgyLDkgQEAKIAkJCWFsaWduID0gcGNpX3Jlc291cmNlX2FsaWdubWVudChkZXYsIHIpOwogCQkJb3JkZXIgPSBfX2ZmcyhhbGlnbikgLSAyMDsKIAkJCWlmIChvcmRlciA+IDExKSB7Ci0JCQkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiQkFSICVkIGJhZCBhbGlnbm1lbnQgJWxseDogIgotCQkJCQkgIiVwUlxuIiwgaSwgKHVuc2lnbmVkIGxvbmcgbG9uZylhbGlnbiwgcik7CisJCQkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiZGlzYWJsaW5nIEJBUiAlZDogJXBSICIKKwkJCQkJICIoYmFkIGFsaWdubWVudCAlI2xseClcbiIsIGksIHIsCisJCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKSBhbGlnbik7CiAJCQkJci0+ZmxhZ3MgPSAwOwogCQkJCWNvbnRpbnVlOwogCQkJfQpAQCAtNDI1LDYgKzQxOCwxMCBAQAogCX0KIAlzaXplID0gQUxJR04oc2l6ZSwgbWluX2FsaWduKTsKIAlpZiAoIXNpemUpIHsKKwkJaWYgKGJfcmVzLT5zdGFydCB8fCBiX3Jlcy0+ZW5kKQorCQkJZGV2X2luZm8oJmJ1cy0+c2VsZi0+ZGV2LCAiZGlzYWJsaW5nIGJyaWRnZSB3aW5kb3cgIgorCQkJCSAiJXBSIHRvIFtidXMgJTAyeC0lMDJ4XSAodW51c2VkKVxuIiwgYl9yZXMsCisJCQkJIGJ1cy0+c2Vjb25kYXJ5LCBidXMtPnN1Ym9yZGluYXRlKTsKIAkJYl9yZXMtPmZsYWdzID0gMDsKIAkJcmV0dXJuIDE7CiAJfQpAQCAtNTgyLDEwICs1NzksNyBAQAogICAgICAgICAgICAgICAgIGlmICghcmVzIHx8ICFyZXMtPmVuZCkKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmJ1cy0+ZGV2LCAicmVzb3VyY2UgJWQgJXMgJXBSXG4iLCBpLAotCQkJICAgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSA/ICJpbzogIiA6Ci0JCQkgICAgKChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCk/ICJwcmVmIG1lbSI6Im1lbToiKSwKLQkJCSAgIHJlcyk7CisJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmJ1cy0+ZGV2LCAicmVzb3VyY2UgJWQgJXBSXG4iLCBpLCByZXMpOwogICAgICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NldHVwLXJlcy5jIGIvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKaW5kZXggYzU0NTI2Yi4uN2Q2NzhiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKKysrIGIvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKQEAgLTUxLDEyICs1MSw2IEBACiAKIAlwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhkZXYsICZyZWdpb24sIHJlcyk7CiAKLQlkZXZfZGJnKCZkZXYtPmRldiwgIkJBUiAlZDogZ290IHJlcyAlcFIgYnVzIFslI2xseC0lI2xseF0gIgotCQkiZmxhZ3MgJSNseFxuIiwgcmVzbm8sIHJlcywKLQkJICh1bnNpZ25lZCBsb25nIGxvbmcpcmVnaW9uLnN0YXJ0LAotCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylyZWdpb24uZW5kLAotCQkgKHVuc2lnbmVkIGxvbmcpcmVzLT5mbGFncyk7Ci0KIAluZXcgPSByZWdpb24uc3RhcnQgfCAocmVzLT5mbGFncyAmIFBDSV9SRUdJT05fRkxBR19NQVNLKTsKIAlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCiAJCW1hc2sgPSAodTMyKVBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSzsKQEAgLTkxLDkgKzg1LDkgQEAKIAkJfQogCX0KIAlyZXMtPmZsYWdzICY9IH5JT1JFU09VUkNFX1VOU0VUOwotCWRldl9kYmcoJmRldi0+ZGV2LCAiQkFSICVkOiBtb3ZlZCB0byBidXMgWyUjbGx4LSUjbGx4XSBmbGFncyAlI2x4XG4iLAotCQlyZXNubywgKHVuc2lnbmVkIGxvbmcgbG9uZylyZWdpb24uc3RhcnQsCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpcmVnaW9uLmVuZCwgcmVzLT5mbGFncyk7CisJZGV2X2luZm8oJmRldi0+ZGV2LCAiQkFSICVkOiBzZXQgdG8gJXBSIChQQ0kgYWRkcmVzcyBbJSNsbHgtJSNsbHhdXG4iLAorCQkgcmVzbm8sIHJlcywgKHVuc2lnbmVkIGxvbmcgbG9uZylyZWdpb24uc3RhcnQsCisJCSAodW5zaWduZWQgbG9uZyBsb25nKXJlZ2lvbi5lbmQpOwogfQogCiBpbnQgcGNpX2NsYWltX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCByZXNvdXJjZSkKQEAgLTEwMywyMCArOTcsMTcgQEAKIAlpbnQgZXJyOwogCiAJcm9vdCA9IHBjaV9maW5kX3BhcmVudF9yZXNvdXJjZShkZXYsIHJlcyk7Ci0KLQllcnIgPSAtRUlOVkFMOwotCWlmIChyb290ICE9IE5VTEwpCi0JCWVyciA9IHJlcXVlc3RfcmVzb3VyY2Uocm9vdCwgcmVzKTsKLQotCWlmIChlcnIpIHsKLQkJY29uc3QgY2hhciAqZHR5cGUgPSByZXNvdXJjZSA8IFBDSV9CUklER0VfUkVTT1VSQ0VTID8gImRldmljZSIgOiAiYnJpZGdlIjsKLQkJZGV2X2VycigmZGV2LT5kZXYsICJCQVIgJWQ6ICVzIG9mICVzICVwUlxuIiwKLQkJCXJlc291cmNlLAotCQkJcm9vdCA/ICJhZGRyZXNzIHNwYWNlIGNvbGxpc2lvbiBvbiIgOgotCQkJCSJubyBwYXJlbnQgZm91bmQgZm9yIiwKLQkJCWR0eXBlLCByZXMpOworCWlmICghcm9vdCkgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgIm5vIGNvbXBhdGlibGUgYnJpZGdlIHdpbmRvdyBmb3IgJXBSXG4iLAorCQkJcmVzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJZXJyID0gcmVxdWVzdF9yZXNvdXJjZShyb290LCByZXMpOworCWlmIChlcnIpCisJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJImFkZHJlc3Mgc3BhY2UgY29sbGlzaW9uOiAlcFIgYWxyZWFkeSBpbiB1c2VcbiIsIHJlcyk7CisKIAlyZXR1cm4gZXJyOwogfQogRVhQT1JUX1NZTUJPTChwY2lfY2xhaW1fcmVzb3VyY2UpOwpAQCAtMTI0LDcgKzExNSw3IEBACiAjaWZkZWYgQ09ORklHX1BDSV9RVUlSS1MKIHZvaWQgcGNpX2Rpc2FibGVfYnJpZGdlX3dpbmRvdyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCWRldl9kYmcoJmRldi0+ZGV2LCAiRGlzYWJsaW5nIGJyaWRnZSB3aW5kb3cuXG4iKTsKKwlkZXZfaW5mbygmZGV2LT5kZXYsICJkaXNhYmxpbmcgYnJpZGdlIG1lbSB3aW5kb3dzXG4iKTsKIAogCS8qIE1NSU8gQmFzZS9MaW1pdCAqLwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBQQ0lfTUVNT1JZX0JBU0UsIDB4MDAwMGZmZjApOwpAQCAtMTY1LDYgKzE1Niw3IEBACiAKIAlpZiAoIXJldCkgewogCQlyZXMtPmZsYWdzICY9IH5JT1JFU09VUkNFX1NUQVJUQUxJR047CisJCWRldl9pbmZvKCZkZXYtPmRldiwgIkJBUiAlZDogYXNzaWduZWQgJXBSXG4iLCByZXNubywgcmVzKTsKIAkJaWYgKHJlc25vIDwgUENJX0JSSURHRV9SRVNPVVJDRVMpCiAJCQlwY2lfdXBkYXRlX3Jlc291cmNlKGRldiwgcmVzbm8pOwogCX0KQEAgLTE3OCwxMiArMTcwLDEyIEBACiAJcmVzb3VyY2Vfc2l6ZV90IGFsaWduOwogCXN0cnVjdCBwY2lfYnVzICpidXM7CiAJaW50IHJldDsKKwljaGFyICp0eXBlOwogCiAJYWxpZ24gPSBwY2lfcmVzb3VyY2VfYWxpZ25tZW50KGRldiwgcmVzKTsKIAlpZiAoIWFsaWduKSB7Ci0JCWRldl9pbmZvKCZkZXYtPmRldiwgIkJBUiAlZDogY2FuJ3QgYWxsb2NhdGUgcmVzb3VyY2UgKGJvZ3VzICIKLQkJCSJhbGlnbm1lbnQpICVwUiBmbGFncyAlI2x4XG4iLAotCQkJcmVzbm8sIHJlcywgcmVzLT5mbGFncyk7CisJCWRldl9pbmZvKCZkZXYtPmRldiwgIkJBUiAlZDogY2FuJ3QgYXNzaWduICVwUiAiCisJCQkgIihib2d1cyBhbGlnbm1lbnQpXG4iLCByZXNubywgcmVzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xOTgsOSArMTkwLDIwIEBACiAJCWJyZWFrOwogCX0KIAotCWlmIChyZXQpCi0JCWRldl9pbmZvKCZkZXYtPmRldiwgIkJBUiAlZDogY2FuJ3QgYWxsb2NhdGUgJXMgcmVzb3VyY2UgJXBSXG4iLAotCQkJcmVzbm8sIHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPID8gIkkvTyIgOiAibWVtIiwgcmVzKTsKKwlpZiAocmV0KSB7CisJCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCisJCQlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpCisJCQkJdHlwZSA9ICJtZW0gcHJlZiI7CisJCQllbHNlCisJCQkJdHlwZSA9ICJtZW0iOworCQllbHNlIGlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKKwkJCXR5cGUgPSAiaW8iOworCQllbHNlCisJCQl0eXBlID0gInVua25vd24iOworCQlkZXZfaW5mbygmZGV2LT5kZXYsCisJCQkgIkJBUiAlZDogY2FuJ3QgYXNzaWduICVzIChzaXplICUjbGx4KVxuIiwKKwkJCSByZXNubywgdHlwZSwgKHVuc2lnbmVkIGxvbmcgbG9uZykgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwl9CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjI1LDkgKzIyOCw4IEBACiAKIAkJcl9hbGlnbiA9IHBjaV9yZXNvdXJjZV9hbGlnbm1lbnQoZGV2LCByKTsKIAkJaWYgKCFyX2FsaWduKSB7Ci0JCQlkZXZfd2FybigmZGV2LT5kZXYsICJCQVIgJWQ6IGJvZ3VzIGFsaWdubWVudCAiCi0JCQkJIiVwUiBmbGFncyAlI2x4XG4iLAotCQkJCWksIHIsIHItPmZsYWdzKTsKKwkJCWRldl93YXJuKCZkZXYtPmRldiwgIkJBUiAlZDogJXBSIGhhcyBib2d1cyBhbGlnbm1lbnRcbiIsCisJCQkJIGksIHIpOwogCQkJY29udGludWU7CiAJCX0KIAkJZm9yIChsaXN0ID0gaGVhZDsgOyBsaXN0ID0gbGlzdC0+bmV4dCkgewpAQCAtMjc0LDggKzI3Niw4IEBACiAJCQljb250aW51ZTsKIAogCQlpZiAoIXItPnBhcmVudCkgewotCQkJZGV2X2VycigmZGV2LT5kZXYsICJkZXZpY2Ugbm90IGF2YWlsYWJsZSBiZWNhdXNlIG9mICIKLQkJCQkiQkFSICVkICVwUiBjb2xsaXNpb25zXG4iLCBpLCByKTsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LCAiZGV2aWNlIG5vdCBhdmFpbGFibGUgIgorCQkJCSIoY2FuJ3QgcmVzZXJ2ZSAlcFIpXG4iLCByKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL0tjb25maWcgYi9kcml2ZXJzL3BjbWNpYS9LY29uZmlnCmluZGV4IGNkNTA4MmQuLjlmM2FkYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL0tjb25maWcKKysrIGIvZHJpdmVycy9wY21jaWEvS2NvbmZpZwpAQCAtNjQsNyArNjQsNyBAQAogCSAgSWYgdW5zdXJlLCBzYXkgWS4KIAogY29uZmlnIENBUkRCVVMKLQlib29sICIzMi1iaXQgQ2FyZEJ1cyBzdXBwb3J0IgkKKwlib29sICIzMi1iaXQgQ2FyZEJ1cyBzdXBwb3J0IgogCWRlcGVuZHMgb24gUENJCiAJZGVmYXVsdCB5CiAJLS0taGVscC0tLQpAQCAtODcsOCArODcsOCBAQAogCXNlbGVjdCBQQ0NBUkRfTk9OU1RBVElDCiAJLS0taGVscC0tLQogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBDYXJkQnVzIGhvc3QgYnJpZGdlcy4gIFZpcnR1YWxseQotCSAgYWxsIG1vZGVybiBQQ01DSUEgYnJpZGdlcyBhcmUgQ2FyZEJ1cyBjb21wYXRpYmxlLiAgQSAiYnJpZGdlIiBpcyAKLQkgIHRoZSBoYXJkd2FyZSBpbnNpZGUgeW91ciBjb21wdXRlciB0aGF0IFBDTUNJQSBjYXJkcyBhcmUgcGx1Z2dlZCAKKwkgIGFsbCBtb2Rlcm4gUENNQ0lBIGJyaWRnZXMgYXJlIENhcmRCdXMgY29tcGF0aWJsZS4gIEEgImJyaWRnZSIgaXMKKwkgIHRoZSBoYXJkd2FyZSBpbnNpZGUgeW91ciBjb21wdXRlciB0aGF0IFBDTUNJQSBjYXJkcyBhcmUgcGx1Z2dlZAogCSAgaW50by4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBtb2R1bGVzLCBjaG9vc2UgTSBoZXJlOiB0aGUKQEAgLTIwOCw3ICsyMDgsNyBAQAogCWRlcGVuZHMgb24gQVJNICYmIEFSQ0hfUFhBICYmIFBDTUNJQQogCWRlcGVuZHMgb24gKEFSQ0hfTFVCQk9DSyB8fCBNQUNIX01BSU5TVE9ORSB8fCBQWEFfU0hBUlBTTCBcCiAJCSAgICB8fCBNQUNIX0FSTUNPUkUgfHwgQVJDSF9QWEFfUEFMTSB8fCBUUklaRVBTX1BDTUNJQSBcCi0JCSAgICB8fCBBUkNIX1ZJUEVSIHx8IEFSQ0hfUFhBX0VTRVJJRVMgfHwgTUFDSF9TVEFSR0FURTIpCisJCSAgICB8fCBBUkNPTV9QQ01DSUEgfHwgQVJDSF9QWEFfRVNFUklFUyB8fCBNQUNIX1NUQVJHQVRFMikKIAlzZWxlY3QgUENNQ0lBX1NPQ19DT01NT04KIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIFBYQTJ4eCBQQ01DSUEgY29udHJvbGxlcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvTWFrZWZpbGUgYi9kcml2ZXJzL3BjbWNpYS9NYWtlZmlsZQppbmRleCAzODI5MzgzLi44M2ZmODAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BjbWNpYS9NYWtlZmlsZQpAQCAtNjcsNyArNjcsNyBAQAogcHhhMnh4LW9iai0kKENPTkZJR19NQUNIX01BSU5TVE9ORSkJCSs9IHB4YTJ4eF9tYWluc3RvbmUubwogcHhhMnh4LW9iai0kKENPTkZJR19QWEFfU0hBUlBTTCkJCSs9IHB4YTJ4eF9zaGFycHNsLm8KIHB4YTJ4eC1vYmotJChDT05GSUdfTUFDSF9BUk1DT1JFKQkJKz0gcHhhMnh4X2NtX3gyeHhfY3MubwotcHhhMnh4LW9iai0kKENPTkZJR19BUkNIX1ZJUEVSKQkJCSs9IHB4YTJ4eF92aXBlci5vCitweGEyeHgtb2JqLSQoQ09ORklHX0FSQ09NX1BDTUNJQSkJCSs9IHB4YTJ4eF92aXBlci5vCiBweGEyeHgtb2JqLSQoQ09ORklHX1RSSVpFUFNfUENNQ0lBKQkJKz0gcHhhMnh4X3RyaXplcHM0Lm8KIHB4YTJ4eC1vYmotJChDT05GSUdfTUFDSF9QQUxNVFgpCQkrPSBweGEyeHhfcGFsbXR4Lm8KIHB4YTJ4eC1vYmotJChDT05GSUdfTUFDSF9QQUxNVEMpCQkrPSBweGEyeHhfcGFsbXRjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2NhcmRidXMuYyBiL2RyaXZlcnMvcGNtY2lhL2NhcmRidXMuYwppbmRleCA0Y2Q3MGQwLi5jZGY1MGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9jYXJkYnVzLmMKKysrIGIvZHJpdmVycy9wY21jaWEvY2FyZGJ1cy5jCkBAIC0yNyw4ICsyNyw4IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9zcy5oPgpAQCAtNTgsNyArNTgsNyBAQAogICAgIGltYWdlIG51bWJlciBhbmQgYW4gb2Zmc2V0IHdpdGhpbiB0aGF0IGltYWdlLiAgeGxhdGVfcm9tX2FkZHIoKQogICAgIGNvbnZlcnRzIGFuIGltYWdlL29mZnNldCBhZGRyZXNzIHRvIGFuIGFic29sdXRlIG9mZnNldCBmcm9tIHRoZQogICAgIFJPTSdzIGJhc2UgYWRkcmVzcy4KLSAgICAKKwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogc3RhdGljIHVfaW50IHhsYXRlX3JvbV9hZGRyKHZvaWQgX19pb21lbSAqYiwgdV9pbnQgYWRkcikKQEAgLTg1LDEwICs4NSwxMCBAQAogICAgIFRoZXNlIGFyZSBzaW1pbGFyIHRvIHNldHVwX2Npc19tZW0gYW5kIHJlbGVhc2VfY2lzX21lbSBmb3IgMTYtYml0CiAgICAgY2FyZHMuICBUaGUgInJlc3VsdCIgdGhhdCBpcyB1c2VkIGV4dGVybmFsbHkgaXMgdGhlIGNiX2Npc192aXJ0CiAgICAgcG9pbnRlciBpbiB0aGUgc3RydWN0IHBjbWNpYV9zb2NrZXQgc3RydWN0dXJlLgotICAgIAorCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCi1zdGF0aWMgdm9pZCBjYl9yZWxlYXNlX2Npc19tZW0oc3RydWN0IHBjbWNpYV9zb2NrZXQgKiBzKQorc3RhdGljIHZvaWQgY2JfcmVsZWFzZV9jaXNfbWVtKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKQogewogCWlmIChzLT5jYl9jaXNfdmlydCkgewogCQlkZXZfZGJnKCZzLT5kZXYsICJjYl9yZWxlYXNlX2Npc19tZW0oKVxuIik7CkBAIC05OCw3ICs5OCw3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IGNiX3NldHVwX2Npc19tZW0oc3RydWN0IHBjbWNpYV9zb2NrZXQgKiBzLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKK3N0YXRpYyBpbnQgY2Jfc2V0dXBfY2lzX21lbShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgc3RydWN0IHJlc291cmNlICpyZXMpCiB7CiAJdW5zaWduZWQgaW50IHN0YXJ0LCBzaXplOwogCkBAIC0xMjQsMTAgKzEyNCwxMSBAQAogCiAgICAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBDSVMgcHJvY2Vzc2luZyBjb2RlIHRvIHJlYWQgQ0lTIGluZm9ybWF0aW9uCiAgICAgZnJvbSBhIENhcmRCdXMgZGV2aWNlLgotICAgIAorCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCi1pbnQgcmVhZF9jYl9tZW0oc3RydWN0IHBjbWNpYV9zb2NrZXQgKiBzLCBpbnQgc3BhY2UsIHVfaW50IGFkZHIsIHVfaW50IGxlbiwgdm9pZCAqcHRyKQoraW50IHJlYWRfY2JfbWVtKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBpbnQgc3BhY2UsIHVfaW50IGFkZHIsIHVfaW50IGxlbiwKKwkJdm9pZCAqcHRyKQogewogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CkBAIC0xODEsNDAgKzE4Miw0NyBAQAogICAgIGNiX2FsbG9jKCkgYW5kIGNiX2ZyZWUoKSBhbGxvY2F0ZSBhbmQgZnJlZSB0aGUga2VybmVsIGRhdGEKICAgICBzdHJ1Y3R1cmVzIGZvciBhIENhcmRidXMgZGV2aWNlLCBhbmQgaGFuZGxlIHRoZSBsb3dlc3QgbGV2ZWwgUENJCiAgICAgZGV2aWNlIHNldHVwIGlzc3Vlcy4KLSAgICAKKwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAotLyoKLSAqIFNpbmNlIHRoZXJlIGlzIG9ubHkgb25lIGludGVycnVwdCBhdmFpbGFibGUgdG8gQ2FyZEJ1cwotICogZGV2aWNlcywgYWxsIGRldmljZXMgZG93bnN0cmVhbSBvZiB0aGlzIGRldmljZSBtdXN0Ci0gKiBiZSB1c2luZyB0aGlzIElSUS4KLSAqLwotc3RhdGljIHZvaWQgY2FyZGJ1c19hc3NpZ25faXJxcyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBpbnQgaXJxKQorc3RhdGljIHZvaWQgY2FyZGJ1c19jb25maWdfaXJxX2FuZF9jbHMoc3RydWN0IHBjaV9idXMgKmJ1cywgaW50IGlycSkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2OwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KSB7CiAJCXU4IGlycV9waW47CiAKKwkJLyoKKwkJICogU2luY2UgdGhlcmUgaXMgb25seSBvbmUgaW50ZXJydXB0IGF2YWlsYWJsZSB0bworCQkgKiBDYXJkQnVzIGRldmljZXMsIGFsbCBkZXZpY2VzIGRvd25zdHJlYW0gb2YgdGhpcworCQkgKiBkZXZpY2UgbXVzdCBiZSB1c2luZyB0aGlzIElSUS4KKwkJICovCiAJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9QSU4sICZpcnFfcGluKTsKIAkJaWYgKGlycV9waW4pIHsKIAkJCWRldi0+aXJxID0gaXJxOwogCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBkZXYtPmlycSk7CiAJCX0KIAorCQkvKgorCQkgKiBTb21lIGNvbnRyb2xsZXJzIHRyYW5zZmVyIHZlcnkgc2xvd2x5IHdpdGggMCBDTFMuCisJCSAqIENvbmZpZ3VyZSBpdC4gIFRoaXMgbWF5IGZhaWwgYXMgQ0xTIGNvbmZpZ3VyYXRpb24KKwkJICogaXMgbWFuZGF0b3J5IG9ubHkgZm9yIE1XSS4KKwkJICovCisJCXBjaV9zZXRfY2FjaGVsaW5lX3NpemUoZGV2KTsKKwogCQlpZiAoZGV2LT5zdWJvcmRpbmF0ZSkKLQkJCWNhcmRidXNfYXNzaWduX2lycXMoZGV2LT5zdWJvcmRpbmF0ZSwgaXJxKTsKKwkJCWNhcmRidXNfY29uZmlnX2lycV9hbmRfY2xzKGRldi0+c3Vib3JkaW5hdGUsIGlycSk7CiAJfQogfQogCi1pbnQgX19yZWYgY2JfYWxsb2Moc3RydWN0IHBjbWNpYV9zb2NrZXQgKiBzKQoraW50IF9fcmVmIGNiX2FsbG9jKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKQogewogCXN0cnVjdCBwY2lfYnVzICpidXMgPSBzLT5jYl9kZXYtPnN1Ym9yZGluYXRlOwogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiAJdW5zaWduZWQgaW50IG1heCwgcGFzczsKIAogCXMtPmZ1bmN0aW9ucyA9IHBjaV9zY2FuX3Nsb3QoYnVzLCBQQ0lfREVWRk4oMCwgMCkpOwotLy8JcGNpYmlvc19maXh1cF9idXMoYnVzKTsKKy8qCXBjaWJpb3NfZml4dXBfYnVzKGJ1cyk7ICovCiAKIAltYXggPSBidXMtPnNlY29uZGFyeTsKIAlmb3IgKHBhc3MgPSAwOyBwYXNzIDwgMjsgcGFzcysrKQpAQCAtMjI4LDcgKzIzNiw3IEBACiAJICovCiAJcGNpX2J1c19zaXplX2JyaWRnZXMoYnVzKTsKIAlwY2lfYnVzX2Fzc2lnbl9yZXNvdXJjZXMoYnVzKTsKLQljYXJkYnVzX2Fzc2lnbl9pcnFzKGJ1cywgcy0+cGNpX2lycSk7CisJY2FyZGJ1c19jb25maWdfaXJxX2FuZF9jbHMoYnVzLCBzLT5wY2lfaXJxKTsKIAogCS8qIHNvY2tldCBzcGVjaWZpYyB0dW5lIGZ1bmN0aW9uICovCiAJaWYgKHMtPnR1bmVfYnJpZGdlKQpAQCAtMjQxLDcgKzI0OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgY2JfZnJlZShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqIHMpCit2b2lkIGNiX2ZyZWUoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmJyaWRnZSA9IHMtPmNiX2RldjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvY2lzdHBsLmMgYi9kcml2ZXJzL3BjbWNpYS9jaXN0cGwuYwppbmRleCA4YzFiNzNjLi4yNWIxY2QyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9jaXN0cGwuYworKysgYi9kcml2ZXJzL3BjbWNpYS9jaXN0cGwuYwpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCkBAIC0xMjUsNyArMTI1LDcgQEAKIAogICAgIExvdy1sZXZlbCBmdW5jdGlvbnMgdG8gcmVhZCBhbmQgd3JpdGUgQ0lTIG1lbW9yeS4gIEkgdGhpbmsgdGhlCiAgICAgd3JpdGUgcm91dGluZSBpcyBvbmx5IHVzZWZ1bCBmb3Igd3JpdGluZyBvbmUtYnl0ZSByZWdpc3RlcnMuCi0gICAgCisKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAvKiBCaXRzIGluIGF0dHIgZmllbGQgKi8KQEAgLTEzNyw3ICsxMzcsNyBAQAogewogICAgIHZvaWQgX19pb21lbSAqc3lzLCAqZW5kOwogICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiA9IHB0cjsKLSAgICAKKwogICAgIGRldl9kYmcoJnMtPmRldiwgInBjbWNpYV9yZWFkX2Npc19tZW0oJWQsICUjeCwgJXUpXG4iLCBhdHRyLCBhZGRyLCBsZW4pOwogCiAgICAgaWYgKGF0dHIgJiBJU19JTkRJUkVDVCkgewpAQCAtMjAzLDcgKzIwMyw3IEBACiB7CiAgICAgdm9pZCBfX2lvbWVtICpzeXMsICplbmQ7CiAgICAgdW5zaWduZWQgY2hhciAqYnVmID0gcHRyOwotICAgIAorCiAgICAgZGV2X2RiZygmcy0+ZGV2LCAicGNtY2lhX3dyaXRlX2Npc19tZW0oJWQsICUjeCwgJXUpXG4iLCBhdHRyLCBhZGRyLCBsZW4pOwogCiAgICAgaWYgKGF0dHIgJiBJU19JTkRJUkVDVCkgewpAQCAtMjYyLDcgKzI2Miw3IEBACiAgICAgVGhpcyBpcyBhIHdyYXBwZXIgYXJvdW5kIHJlYWRfY2lzX21lbSwgd2l0aCB0aGUgc2FtZSBpbnRlcmZhY2UsCiAgICAgYnV0IHdoaWNoIGNhY2hlcyBpbmZvcm1hdGlvbiwgZm9yIGNhcmRzIHdob3NlIENJUyBtYXkgbm90IGJlCiAgICAgcmVhZGFibGUgYWxsIHRoZSB0aW1lLgotICAgIAorCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogc3RhdGljIHZvaWQgcmVhZF9jaXNfY2FjaGUoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGludCBhdHRyLCB1X2ludCBhZGRyLApAQCAtMzQyLDcgKzM0Miw3IEBACiAKICAgICBUaGlzIHZlcmlmaWVzIGlmIHRoZSBDSVMgb2YgYSBjYXJkIG1hdGNoZXMgd2hhdCBpcyBpbiB0aGUgQ0lTCiAgICAgY2FjaGUuCi0gICAgCisKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiBpbnQgdmVyaWZ5X2Npc19jYWNoZShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcykKQEAgLTM4MSw3ICszODEsNyBAQAogCiAgICAgRm9yIHJlYWxseSBiYWQgY2FyZHMsIHdlIHByb3ZpZGUgYSBmYWNpbGl0eSBmb3IgdXBsb2FkaW5nIGEKICAgICByZXBsYWNlbWVudCBDSVMuCi0gICAgCisKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiBpbnQgcGNtY2lhX3JlcGxhY2VfY2lzKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLApAQCAtNDA2LDcgKzQwNiw3IEBACiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogICAgIFRoZSBoaWdoLWxldmVsIENJUyB0dXBsZSBzZXJ2aWNlcwotICAgIAorCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogdHlwZWRlZiBzdHJ1Y3QgdHVwbGVfZmxhZ3MgewpAQCAtNDIxLDggKzQyMSw2IEBACiAjZGVmaW5lIE1GQ19GTihmKQkoKCh0dXBsZV9mbGFncyAqKSgmKGYpKSktPm1mY19mbikKICNkZWZpbmUgU1BBQ0UoZikJKCgodHVwbGVfZmxhZ3MgKikoJihmKSkpLT5zcGFjZSkKIAotaW50IHBjY2FyZF9nZXRfbmV4dF90dXBsZShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgdW5zaWduZWQgaW50IGZ1bmMsIHR1cGxlX3QgKnR1cGxlKTsKLQogaW50IHBjY2FyZF9nZXRfZmlyc3RfdHVwbGUoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIHVuc2lnbmVkIGludCBmdW5jdGlvbiwgdHVwbGVfdCAqdHVwbGUpCiB7CiAgICAgaWYgKCFzKQpAQCAtNTIzLDEwICs1MjEsMTEgQEAKIAkJb2ZzKys7IGNvbnRpbnVlOwogCSAgICB9CiAJfQotCQorCiAJLyogRW5kIG9mIGNoYWluPyAgRm9sbG93IGxvbmcgbGluayBpZiBwb3NzaWJsZSAqLwogCWlmIChsaW5rWzBdID09IENJU1RQTF9FTkQpIHsKLQkgICAgaWYgKChvZnMgPSBmb2xsb3dfbGluayhzLCB0dXBsZSkpIDwgMCkKKwkgICAgb2ZzID0gZm9sbG93X2xpbmsocywgdHVwbGUpOworCSAgICBpZiAob2ZzIDwgMCkKIAkJcmV0dXJuIC1FTk9TUEM7CiAJICAgIGF0dHIgPSBTUEFDRSh0dXBsZS0+RmxhZ3MpOwogCSAgICByZWFkX2Npc19jYWNoZShzLCBhdHRyLCBvZnMsIDIsIGxpbmspOwpAQCAtNTc4LDcgKzU3Nyw3IEBACiAJfSBlbHNlCiAJICAgIGlmICh0dXBsZS0+RGVzaXJlZFR1cGxlID09IFJFVFVSTl9GSVJTVF9UVVBMRSkKIAkJYnJlYWs7Ci0JCisKIAlpZiAobGlua1swXSA9PSB0dXBsZS0+RGVzaXJlZFR1cGxlKQogCSAgICBicmVhazsKIAlvZnMgKz0gbGlua1sxXSArIDI7CkBAIC01ODcsNyArNTg2LDcgQEAKIAlkZXZfZGJnKCZzLT5kZXYsICJjczogb3ZlcnJ1biBpbiBwY21jaWFfZ2V0X25leHRfdHVwbGVcbiIpOwogCXJldHVybiAtRU5PU1BDOwogICAgIH0KLSAgICAKKwogICAgIHR1cGxlLT5UdXBsZUNvZGUgPSBsaW5rWzBdOwogICAgIHR1cGxlLT5UdXBsZUxpbmsgPSBsaW5rWzFdOwogICAgIHR1cGxlLT5DSVNPZmZzZXQgPSBvZnMgKyAyOwpAQCAtNjIzLDcgKzYyMiw3IEBACiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogICAgIFBhcnNpbmcgcm91dGluZXMgZm9yIGluZGl2aWR1YWwgdHVwbGVzCi0gICAgCisKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiBzdGF0aWMgaW50IHBhcnNlX2RldmljZSh0dXBsZV90ICp0dXBsZSwgY2lzdHBsX2RldmljZV90ICpkZXZpY2UpCkBAIC02MzcsMjYgKzYzNiwzNyBAQAogCiAgICAgZGV2aWNlLT5uZGV2ID0gMDsKICAgICBmb3IgKGkgPSAwOyBpIDwgQ0lTVFBMX01BWF9ERVZJQ0VTOyBpKyspIHsKLQkKLQlpZiAoKnAgPT0gMHhmZikgYnJlYWs7CisKKwlpZiAoKnAgPT0gMHhmZikKKwkJYnJlYWs7CiAJZGV2aWNlLT5kZXZbaV0udHlwZSA9ICgqcCA+PiA0KTsKIAlkZXZpY2UtPmRldltpXS53cCA9ICgqcCAmIDB4MDgpID8gMSA6IDA7CiAJc3dpdGNoICgqcCAmIDB4MDcpIHsKLQljYXNlIDA6IGRldmljZS0+ZGV2W2ldLnNwZWVkID0gMDsgICBicmVhazsKLQljYXNlIDE6IGRldmljZS0+ZGV2W2ldLnNwZWVkID0gMjUwOyBicmVhazsKLQljYXNlIDI6IGRldmljZS0+ZGV2W2ldLnNwZWVkID0gMjAwOyBicmVhazsKLQljYXNlIDM6IGRldmljZS0+ZGV2W2ldLnNwZWVkID0gMTUwOyBicmVhazsKLQljYXNlIDQ6IGRldmljZS0+ZGV2W2ldLnNwZWVkID0gMTAwOyBicmVhazsKKwljYXNlIDA6CisJCWRldmljZS0+ZGV2W2ldLnNwZWVkID0gMDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlkZXZpY2UtPmRldltpXS5zcGVlZCA9IDI1MDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlkZXZpY2UtPmRldltpXS5zcGVlZCA9IDIwMDsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlkZXZpY2UtPmRldltpXS5zcGVlZCA9IDE1MDsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlkZXZpY2UtPmRldltpXS5zcGVlZCA9IDEwMDsKKwkJYnJlYWs7CiAJY2FzZSA3OgotCSAgICBpZiAoKytwID09IHEpCi0JCSAgICByZXR1cm4gLUVJTlZBTDsKLQkgICAgZGV2aWNlLT5kZXZbaV0uc3BlZWQgPSBTUEVFRF9DVlQoKnApOwotCSAgICB3aGlsZSAoKnAgJiAweDgwKQogCQlpZiAoKytwID09IHEpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkgICAgYnJlYWs7CisJCWRldmljZS0+ZGV2W2ldLnNwZWVkID0gU1BFRURfQ1ZUKCpwKTsKKwkJd2hpbGUgKCpwICYgMHg4MCkKKwkJCWlmICgrK3AgPT0gcSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKLQkgICAgcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmICgrK3AgPT0gcSkKQEAgLTY3MSw3ICs2ODEsNyBAQAogCWlmICgrK3AgPT0gcSkKIAkJYnJlYWs7CiAgICAgfQotICAgIAorCiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTcwNiw5ICs3MTYsOSBAQAogewogICAgIHVfY2hhciAqcDsKICAgICBpbnQgaTsKLSAgICAKKwogICAgIHAgPSAodV9jaGFyICopdHVwbGUtPlR1cGxlRGF0YTsKLSAgICAKKwogICAgIGxpbmstPm5mbiA9ICpwOyBwKys7CiAgICAgaWYgKHR1cGxlLT5UdXBsZURhdGFMZW4gPD0gbGluay0+bmZuKjUpCiAJcmV0dXJuIC1FSU5WQUw7CkBAIC03MzcsMTEgKzc0NywxMyBAQAogCW5zKys7CiAJZm9yICg7OykgewogCSAgICBzW2orK10gPSAoKnAgPT0gMHhmZikgPyAnXDAnIDogKnA7Ci0JICAgIGlmICgoKnAgPT0gJ1wwJykgfHwgKCpwID09IDB4ZmYpKSBicmVhazsKKwkgICAgaWYgKCgqcCA9PSAnXDAnKSB8fCAoKnAgPT0gMHhmZikpCisJCSAgICBicmVhazsKIAkgICAgaWYgKCsrcCA9PSBxKQogCQkgICAgcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmICgoKnAgPT0gMHhmZikgfHwgKCsrcCA9PSBxKSkgYnJlYWs7CisJaWYgKCgqcCA9PSAweGZmKSB8fCAoKytwID09IHEpKQorCQlicmVhazsKICAgICB9CiAgICAgaWYgKGZvdW5kKSB7CiAJKmZvdW5kID0gbnM7CkBAIC03NTYsMTAgKzc2OCwxMCBAQAogc3RhdGljIGludCBwYXJzZV92ZXJzXzEodHVwbGVfdCAqdHVwbGUsIGNpc3RwbF92ZXJzXzFfdCAqdmVyc18xKQogewogICAgIHVfY2hhciAqcCwgKnE7Ci0gICAgCisKICAgICBwID0gKHVfY2hhciAqKXR1cGxlLT5UdXBsZURhdGE7CiAgICAgcSA9IHAgKyB0dXBsZS0+VHVwbGVEYXRhTGVuOwotICAgIAorCiAgICAgdmVyc18xLT5tYWpvciA9ICpwOyBwKys7CiAgICAgdmVyc18xLT5taW5vciA9ICpwOyBwKys7CiAgICAgaWYgKHAgPj0gcSkKQEAgLTc3NCwxMCArNzg2LDEwIEBACiBzdGF0aWMgaW50IHBhcnNlX2FsdHN0cih0dXBsZV90ICp0dXBsZSwgY2lzdHBsX2FsdHN0cl90ICphbHRzdHIpCiB7CiAgICAgdV9jaGFyICpwLCAqcTsKLSAgICAKKwogICAgIHAgPSAodV9jaGFyICopdHVwbGUtPlR1cGxlRGF0YTsKICAgICBxID0gcCArIHR1cGxlLT5UdXBsZURhdGFMZW47Ci0gICAgCisKICAgICByZXR1cm4gcGFyc2Vfc3RyaW5ncyhwLCBxLCBDSVNUUExfTUFYX0FMVFNUUl9TVFJJTkdTLAogCQkJIGFsdHN0ci0+c3RyLCBhbHRzdHItPm9mcywgJmFsdHN0ci0+bnMpOwogfQpAQCAtNzkzLDcgKzgwNSw4IEBACiAgICAgcSA9IHAgKyB0dXBsZS0+VHVwbGVEYXRhTGVuOwogCiAgICAgZm9yIChuaWQgPSAwOyBuaWQgPCBDSVNUUExfTUFYX0RFVklDRVM7IG5pZCsrKSB7Ci0JaWYgKHAgPiBxLTIpIGJyZWFrOworCWlmIChwID4gcS0yKQorCQlicmVhazsKIAlqZWRlYy0+aWRbbmlkXS5tZnIgPSBwWzBdOwogCWplZGVjLT5pZFtuaWRdLmluZm8gPSBwWzFdOwogCXAgKz0gMjsKQEAgLTg3MSw3ICs4ODQsNyBAQAogCiAgICAgVGhlIGZvbGxvd2luZyByb3V0aW5lcyBhcmUgYWxsIHVzZWQgdG8gcGFyc2UgdGhlIG5pZ2h0bWFyaXNoCiAgICAgY29uZmlnIHRhYmxlIGVudHJpZXMuCi0gICAgCisKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiBzdGF0aWMgdV9jaGFyICpwYXJzZV9wb3dlcih1X2NoYXIgKnAsIHVfY2hhciAqcSwKQEAgLTg4MCwxNyArODkzLDIwIEBACiAgICAgaW50IGk7CiAgICAgdV9pbnQgc2NhbGU7CiAKLSAgICBpZiAocCA9PSBxKSByZXR1cm4gTlVMTDsKKyAgICBpZiAocCA9PSBxKQorCSAgICByZXR1cm4gTlVMTDsKICAgICBwd3ItPnByZXNlbnQgPSAqcDsKICAgICBwd3ItPmZsYWdzID0gMDsKICAgICBwKys7CiAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykKIAlpZiAocHdyLT5wcmVzZW50ICYgKDE8PGkpKSB7Ci0JICAgIGlmIChwID09IHEpIHJldHVybiBOVUxMOworCSAgICBpZiAocCA9PSBxKQorCQkgICAgcmV0dXJuIE5VTEw7CiAJICAgIHB3ci0+cGFyYW1baV0gPSBQT1dFUl9DVlQoKnApOwogCSAgICBzY2FsZSA9IFBPV0VSX1NDQUxFKCpwKTsKIAkgICAgd2hpbGUgKCpwICYgMHg4MCkgewotCQlpZiAoKytwID09IHEpIHJldHVybiBOVUxMOworCQlpZiAoKytwID09IHEpCisJCQlyZXR1cm4gTlVMTDsKIAkJaWYgKCgqcCAmIDB4N2YpIDwgMTAwKQogCQkgICAgcHdyLT5wYXJhbVtpXSArPSAoKnAgJiAweDdmKSAqIHNjYWxlIC8gMTAwOwogCQllbHNlIGlmICgqcCA9PSAweDdkKQpAQCAtOTE0LDI0ICs5MzAsMjggQEAKIHsKICAgICB1X2NoYXIgc2NhbGU7CiAKLSAgICBpZiAocCA9PSBxKSByZXR1cm4gTlVMTDsKKyAgICBpZiAocCA9PSBxKQorCSAgICByZXR1cm4gTlVMTDsKICAgICBzY2FsZSA9ICpwOwogICAgIGlmICgoc2NhbGUgJiAzKSAhPSAzKSB7Ci0JaWYgKCsrcCA9PSBxKSByZXR1cm4gTlVMTDsKKwlpZiAoKytwID09IHEpCisJCXJldHVybiBOVUxMOwogCXRpbWluZy0+d2FpdCA9IFNQRUVEX0NWVCgqcCk7CiAJdGltaW5nLT53YWl0c2NhbGUgPSBleHBvbmVudFtzY2FsZSAmIDNdOwogICAgIH0gZWxzZQogCXRpbWluZy0+d2FpdCA9IDA7CiAgICAgc2NhbGUgPj49IDI7CiAgICAgaWYgKChzY2FsZSAmIDcpICE9IDcpIHsKLQlpZiAoKytwID09IHEpIHJldHVybiBOVUxMOworCWlmICgrK3AgPT0gcSkKKwkJcmV0dXJuIE5VTEw7CiAJdGltaW5nLT5yZWFkeSA9IFNQRUVEX0NWVCgqcCk7CiAJdGltaW5nLT5yZHlzY2FsZSA9IGV4cG9uZW50W3NjYWxlICYgN107CiAgICAgfSBlbHNlCiAJdGltaW5nLT5yZWFkeSA9IDA7CiAgICAgc2NhbGUgPj49IDM7CiAgICAgaWYgKHNjYWxlICE9IDcpIHsKLQlpZiAoKytwID09IHEpIHJldHVybiBOVUxMOworCWlmICgrK3AgPT0gcSkKKwkJcmV0dXJuIE5VTEw7CiAJdGltaW5nLT5yZXNlcnZlZCA9IFNQRUVEX0NWVCgqcCk7CiAJdGltaW5nLT5yc3ZzY2FsZSA9IGV4cG9uZW50W3NjYWxlXTsKICAgICB9IGVsc2UKQEAgLTk0Niw3ICs5NjYsOCBAQAogewogICAgIGludCBpLCBqLCBic3osIGxzejsKIAotICAgIGlmIChwID09IHEpIHJldHVybiBOVUxMOworICAgIGlmIChwID09IHEpCisJICAgIHJldHVybiBOVUxMOwogICAgIGlvLT5mbGFncyA9ICpwOwogCiAgICAgaWYgKCEoKnAgJiAweDgwKSkgewpAQCAtOTU1LDI0ICs5NzYsMjkgQEAKIAlpby0+d2luWzBdLmxlbiA9ICgxIDw8IChpby0+ZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSykpOwogCXJldHVybiBwKzE7CiAgICAgfQotICAgIAotICAgIGlmICgrK3AgPT0gcSkgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoKytwID09IHEpCisJICAgIHJldHVybiBOVUxMOwogICAgIGlvLT5ud2luID0gKCpwICYgMHgwZikgKyAxOwogICAgIGJzeiA9ICgqcCAmIDB4MzApID4+IDQ7Ci0gICAgaWYgKGJzeiA9PSAzKSBic3orKzsKKyAgICBpZiAoYnN6ID09IDMpCisJICAgIGJzeisrOwogICAgIGxzeiA9ICgqcCAmIDB4YzApID4+IDY7Ci0gICAgaWYgKGxzeiA9PSAzKSBsc3orKzsKKyAgICBpZiAobHN6ID09IDMpCisJICAgIGxzeisrOwogICAgIHArKzsKLSAgICAKKwogICAgIGZvciAoaSA9IDA7IGkgPCBpby0+bndpbjsgaSsrKSB7CiAJaW8tPndpbltpXS5iYXNlID0gMDsKIAlpby0+d2luW2ldLmxlbiA9IDE7CiAJZm9yIChqID0gMDsgaiA8IGJzejsgaisrLCBwKyspIHsKLQkgICAgaWYgKHAgPT0gcSkgcmV0dXJuIE5VTEw7CisJICAgIGlmIChwID09IHEpCisJCSAgICByZXR1cm4gTlVMTDsKIAkgICAgaW8tPndpbltpXS5iYXNlICs9ICpwIDw8IChqKjgpOwogCX0KIAlmb3IgKGogPSAwOyBqIDwgbHN6OyBqKyssIHArKykgewotCSAgICBpZiAocCA9PSBxKSByZXR1cm4gTlVMTDsKKwkgICAgaWYgKHAgPT0gcSkKKwkJICAgIHJldHVybiBOVUxMOwogCSAgICBpby0+d2luW2ldLmxlbiArPSAqcCA8PCAoaio4KTsKIAl9CiAgICAgfQpAQCAtOTg2LDI3ICsxMDEyLDMyIEBACiAgICAgaW50IGksIGosIGFzeiwgbHN6LCBoYXNfaGE7CiAgICAgdV9pbnQgbGVuLCBjYSwgaGE7CiAKLSAgICBpZiAocCA9PSBxKSByZXR1cm4gTlVMTDsKKyAgICBpZiAocCA9PSBxKQorCSAgICByZXR1cm4gTlVMTDsKIAogICAgIG1lbS0+bndpbiA9ICgqcCAmIDB4MDcpICsgMTsKICAgICBsc3ogPSAoKnAgJiAweDE4KSA+PiAzOwogICAgIGFzeiA9ICgqcCAmIDB4NjApID4+IDU7CiAgICAgaGFzX2hhID0gKCpwICYgMHg4MCk7Ci0gICAgaWYgKCsrcCA9PSBxKSByZXR1cm4gTlVMTDsKLSAgICAKKyAgICBpZiAoKytwID09IHEpCisJICAgIHJldHVybiBOVUxMOworCiAgICAgZm9yIChpID0gMDsgaSA8IG1lbS0+bndpbjsgaSsrKSB7CiAJbGVuID0gY2EgPSBoYSA9IDA7CiAJZm9yIChqID0gMDsgaiA8IGxzejsgaisrLCBwKyspIHsKLQkgICAgaWYgKHAgPT0gcSkgcmV0dXJuIE5VTEw7CisJICAgIGlmIChwID09IHEpCisJCSAgICByZXR1cm4gTlVMTDsKIAkgICAgbGVuICs9ICpwIDw8IChqKjgpOwogCX0KIAlmb3IgKGogPSAwOyBqIDwgYXN6OyBqKyssIHArKykgewotCSAgICBpZiAocCA9PSBxKSByZXR1cm4gTlVMTDsKKwkgICAgaWYgKHAgPT0gcSkKKwkJICAgIHJldHVybiBOVUxMOwogCSAgICBjYSArPSAqcCA8PCAoaio4KTsKIAl9CiAJaWYgKGhhc19oYSkKIAkgICAgZm9yIChqID0gMDsgaiA8IGFzejsgaisrLCBwKyspIHsKLQkJaWYgKHAgPT0gcSkgcmV0dXJuIE5VTEw7CisJCWlmIChwID09IHEpCisJCQlyZXR1cm4gTlVMTDsKIAkJaGEgKz0gKnAgPDwgKGoqOCk7CiAJICAgIH0KIAltZW0tPndpbltpXS5sZW4gPSBsZW4gPDwgODsKQEAgLTEwOTUsNyArMTEyNiw3IEBACiAJZW50cnktPnRpbWluZy5yZWFkeSA9IDA7CiAJZW50cnktPnRpbWluZy5yZXNlcnZlZCA9IDA7CiAgICAgfQotICAgIAorCiAgICAgLyogSS9PIHdpbmRvdyBvcHRpb25zICovCiAgICAgaWYgKGZlYXR1cmVzICYgMHgwOCkgewogCXAgPSBwYXJzZV9pbyhwLCBxLCAmZW50cnktPmlvKTsKQEAgLTExMDMsNyArMTEzNCw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogICAgIH0gZWxzZQogCWVudHJ5LT5pby5ud2luID0gMDsKLSAgICAKKwogICAgIC8qIEludGVycnVwdCBvcHRpb25zICovCiAgICAgaWYgKGZlYXR1cmVzICYgMHgxMCkgewogCXAgPSBwYXJzZV9pcnEocCwgcSwgJmVudHJ5LT5pcnEpOwpAQCAtMTE1Myw3ICsxMTg0LDcgQEAKICAgICB9CiAKICAgICBlbnRyeS0+c3VidHVwbGVzID0gcS1wOwotICAgIAorCiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTExNzYsNyArMTIwNyw3IEBACiBzdGF0aWMgaW50IHBhcnNlX2NvbmZpZ19jYih0dXBsZV90ICp0dXBsZSwgY2lzdHBsX2NvbmZpZ190ICpjb25maWcpCiB7CiAgICAgdV9jaGFyICpwOwotICAgIAorCiAgICAgcCA9ICh1X2NoYXIgKil0dXBsZS0+VHVwbGVEYXRhOwogICAgIGlmICgoKnAgIT0gMykgfHwgKHR1cGxlLT5UdXBsZURhdGFMZW4gPCA2KSkKIAlyZXR1cm4gLUVJTlZBTDsKQEAgLTEyMzEsNyArMTI2Miw3IEBACiAJZW50cnktPmlvID0gKnA7IHArKzsKICAgICB9IGVsc2UKIAllbnRyeS0+aW8gPSAwOwotICAgIAorCiAgICAgLyogSW50ZXJydXB0IG9wdGlvbnMgKi8KICAgICBpZiAoZmVhdHVyZXMgJiAweDEwKSB7CiAJcCA9IHBhcnNlX2lycShwLCBxLCAmZW50cnktPmlycSk7CkBAIC0xMjY0LDcgKzEyOTUsNyBAQAogICAgIH0KIAogICAgIGVudHJ5LT5zdWJ0dXBsZXMgPSBxLXA7Ci0gICAgCisKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTI4MSw3ICsxMzEyLDggQEAKICAgICBxID0gcCArIHR1cGxlLT5UdXBsZURhdGFMZW47CiAKICAgICBmb3IgKG4gPSAwOyBuIDwgQ0lTVFBMX01BWF9ERVZJQ0VTOyBuKyspIHsKLQlpZiAocCA+IHEtNikgYnJlYWs7CisJaWYgKHAgPiBxLTYpCisJCWJyZWFrOwogCWdlby0+Z2VvW25dLmJ1c3dpZHRoID0gcFswXTsKIAlnZW8tPmdlb1tuXS5lcmFzZV9ibG9jayA9IDEgPDwgKHBbMV0tMSk7CiAJZ2VvLT5nZW9bbl0ucmVhZF9ibG9jayAgPSAxIDw8IChwWzJdLTEpOwpAQCAtMTMwMiwxMyArMTMzNCwxMyBAQAogCiAgICAgaWYgKHR1cGxlLT5UdXBsZURhdGFMZW4gPCAxMCkKIAlyZXR1cm4gLUVJTlZBTDsKLSAgICAKKwogICAgIHAgPSB0dXBsZS0+VHVwbGVEYXRhOwogICAgIHEgPSBwICsgdHVwbGUtPlR1cGxlRGF0YUxlbjsKIAogICAgIHYyLT52ZXJzID0gcFswXTsKICAgICB2Mi0+Y29tcGx5ID0gcFsxXTsKLSAgICB2Mi0+ZGluZGV4ID0gZ2V0X3VuYWxpZ25lZF9sZTE2KHAgKzIgKTsKKyAgICB2Mi0+ZGluZGV4ID0gZ2V0X3VuYWxpZ25lZF9sZTE2KHAgKyAyKTsKICAgICB2Mi0+dnNwZWM4ID0gcFs2XTsKICAgICB2Mi0+dnNwZWM5ID0gcFs3XTsKICAgICB2Mi0+bmhkciA9IHBbOF07CkBAIC0xMzIyLDcgKzEzNTQsNyBAQAogewogICAgIHVfY2hhciAqcCwgKnE7CiAgICAgaW50IGk7Ci0gICAgCisKICAgICBwID0gdHVwbGUtPlR1cGxlRGF0YTsKICAgICBxID0gcCArIHR1cGxlLT5UdXBsZURhdGFMZW47CiAgICAgaWYgKHAgPT0gcSkKQEAgLTEzMzIsNyArMTM2NCw4IEBACiAJICAgIHJldHVybiAtRUlOVkFMOwogICAgIGZvciAoaSA9IDA7IGkgPCAzMDsgaSsrKSB7CiAJb3JnLT5kZXNjW2ldID0gKnA7Ci0JaWYgKCpwID09ICdcMCcpIGJyZWFrOworCWlmICgqcCA9PSAnXDAnKQorCQlicmVhazsKIAlpZiAoKytwID09IHEpCiAJCXJldHVybiAtRUlOVkFMOwogICAgIH0KQEAgLTEzNjMsNyArMTM5Niw3IEBACiBpbnQgcGNtY2lhX3BhcnNlX3R1cGxlKHR1cGxlX3QgKnR1cGxlLCBjaXNwYXJzZV90ICpwYXJzZSkKIHsKICAgICBpbnQgcmV0ID0gMDsKLSAgICAKKwogICAgIGlmICh0dXBsZS0+VHVwbGVEYXRhTGVuID4gdHVwbGUtPlR1cGxlRGF0YU1heCkKIAlyZXR1cm4gLUVJTlZBTDsKICAgICBzd2l0Y2ggKHR1cGxlLT5UdXBsZUNvZGUpIHsKQEAgLTE0NDgsNyArMTQ4MSw3IEBACiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogICAgIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IENhcmQgU2VydmljZXMgdG8gbG9vayB1cCBDSVMgc3R1ZmYuCi0gICAgCisKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiBpbnQgcGNjYXJkX3JlYWRfdHVwbGUoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIHVuc2lnbmVkIGludCBmdW5jdGlvbiwgY2lzZGF0YV90IGNvZGUsIHZvaWQgKnBhcnNlKQpAQCAtMTU1MCw3ICsxNTgzLDcgQEAKICAgICBjaGVja3MgaW5jbHVkZSBtYWtpbmcgc3VyZSBzZXZlcmFsIGNyaXRpY2FsIHR1cGxlcyBhcmUgcHJlc2VudCBhbmQKICAgICB2YWxpZDsgc2VlaW5nIGlmIHRoZSB0b3RhbCBudW1iZXIgb2YgdHVwbGVzIGlzIHJlYXNvbmFibGU7IGFuZAogICAgIGxvb2tpbmcgZm9yIHR1cGxlcyB0aGF0IHVzZSByZXNlcnZlZCBjb2Rlcy4KLSAgICAKKwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIGludCBwY2NhcmRfdmFsaWRhdGVfY2lzKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCB1bnNpZ25lZCBpbnQgKmluZm8pCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9jcy5jIGIvZHJpdmVycy9wY21jaWEvY3MuYwppbmRleCA3OTBhZjg3Li42ZDZmODJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9jcy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL2NzLmMKQEAgLTEzNSw3ICsxMzUsNyBAQAogRVhQT1JUX1NZTUJPTChwY21jaWFfc29ja2V0X2Rldl9yZXN1bWUpOwogCiAKLXN0cnVjdCBwY21jaWFfc29ja2V0ICogcGNtY2lhX2dldF9zb2NrZXQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNrdCkKK3N0cnVjdCBwY21jaWFfc29ja2V0ICpwY21jaWFfZ2V0X3NvY2tldChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IGdldF9kZXZpY2UoJnNrdC0+ZGV2KTsKIAlpZiAoIWRldikKQEAgLTE0NSw3ICsxNDUsNyBAQAogCQlwdXRfZGV2aWNlKCZza3QtPmRldik7CiAJCXJldHVybiBOVUxMOwogCX0KLQlyZXR1cm4gKHNrdCk7CisJcmV0dXJuIHNrdDsKIH0KIEVYUE9SVF9TWU1CT0wocGNtY2lhX2dldF9zb2NrZXQpOwogCkBAIC0yOTcsNyArMjk3LDcgQEAKIEVYUE9SVF9TWU1CT0wocGNtY2lhX3VucmVnaXN0ZXJfc29ja2V0KTsKIAogCi1zdHJ1Y3QgcGNtY2lhX3NvY2tldCAqIHBjbWNpYV9nZXRfc29ja2V0X2J5X25yKHVuc2lnbmVkIGludCBucikKK3N0cnVjdCBwY21jaWFfc29ja2V0ICpwY21jaWFfZ2V0X3NvY2tldF9ieV9ucih1bnNpZ25lZCBpbnQgbnIpCiB7CiAJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7CiAKQEAgLTczNiw3ICs3MzYsNyBAQAogLyogcmVnaXN0ZXIgcGNtY2lhX2NhbGxiYWNrICovCiBpbnQgcGNjYXJkX3JlZ2lzdGVyX3BjbWNpYShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgc3RydWN0IHBjbWNpYV9jYWxsYmFjayAqYykKIHsKLSAgICAgICAgaW50IHJldCA9IDA7CisJaW50IHJldCA9IDA7CiAKIAkvKiBzLT5za3RfbXV0ZXggYWxzbyBwcm90ZWN0cyBzLT5jYWxsYmFjayAqLwogCW11dGV4X2xvY2soJnMtPnNrdF9tdXRleCk7CkBAIC04NDgsNyArODQ4LDcgQEAKIGludCBwY21jaWFfcmVzdW1lX2NhcmQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNrdCkKIHsKIAlpbnQgcmV0OwotICAgIAorCiAJZGV2X2RiZygmc2t0LT5kZXYsICJ3YWtpbmcgdXAgc29ja2V0XG4iKTsKIAogCW11dGV4X2xvY2soJnNrdC0+c2t0X211dGV4KTsKQEAgLTg3Niw3ICs4NzYsNyBAQAogaW50IHBjbWNpYV9lamVjdF9jYXJkKHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpCiB7CiAJaW50IHJldDsKLSAgICAKKwogCWRldl9kYmcoJnNrdC0+ZGV2LCAidXNlciBlamVjdCByZXF1ZXN0XG4iKTsKIAogCW11dGV4X2xvY2soJnNrdC0+c2t0X211dGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2RzLmMgYi9kcml2ZXJzL3BjbWNpYS9kcy5jCmluZGV4IDA1ODkzZDQuLjFhNGEzYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2RzLmMKKysrIGIvZHJpdmVycy9wY21jaWEvZHMuYwpAQCAtNTcsNyArNTcsNyBAQAogCQkgICAgICAgImZ1bmN0aW9uXG4iLCBwX2Rydi0+ZHJ2Lm5hbWUpOwogCiAJd2hpbGUgKGRpZCAmJiBkaWQtPm1hdGNoX2ZsYWdzKSB7Ci0JCWZvciAoaT0wOyBpPDQ7IGkrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCQlpZiAoIWRpZC0+cHJvZF9pZFtpXSkKIAkJCQljb250aW51ZTsKIApAQCAtMTA1LDcgKzEwNSw3IEBACiAJX191MTYgbWF0Y2hfZmxhZ3MsIG1hbmZfaWQsIGNhcmRfaWQ7CiAJX191OCBmdW5jX2lkLCBmdW5jdGlvbiwgZGV2aWNlX25vOwogCV9fdTMyIHByb2RfaWRfaGFzaFs0XSA9IHswLCAwLCAwLCAwfTsKLQlpbnQgZmllbGRzPTA7CisJaW50IGZpZWxkcyA9IDA7CiAJaW50IHJldHZhbCA9IDA7CiAKIAlmaWVsZHMgPSBzc2NhbmYoYnVmLCAiJWh4ICVoeCAlaHggJWhoeCAlaGh4ICVoaHggJXggJXggJXggJXgiLApAQCAtMjE0LDcgKzIxNCw3IEBACiAKIC8qIHBjbWNpYV9kZXZpY2UgaGFuZGxpbmcgKi8KIAotc3RydWN0IHBjbWNpYV9kZXZpY2UgKiBwY21jaWFfZ2V0X2RldihzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYpCitzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcGNtY2lhX2dldF9kZXYoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2KQogewogCXN0cnVjdCBkZXZpY2UgKnRtcF9kZXY7CiAJdG1wX2RldiA9IGdldF9kZXZpY2UoJnBfZGV2LT5kZXYpOwpAQCAtMjU4LDcgKzI1OCw3IEBACiAJcmV0dXJuOwogfQogCi1zdGF0aWMgaW50IHBjbWNpYV9kZXZpY2VfcHJvYmUoc3RydWN0IGRldmljZSAqIGRldikKK3N0YXRpYyBpbnQgcGNtY2lhX2RldmljZV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2OwogCXN0cnVjdCBwY21jaWFfZHJpdmVyICpwX2RydjsKQEAgLTMyNSw3ICszMjUsNyBAQAogcHV0X2RldjoKIAlpZiAocmV0KQogCQlwdXRfZGV2aWNlKGRldik7Ci0JcmV0dXJuIChyZXQpOworCXJldHVybiByZXQ7CiB9CiAKIApAQCAtMzU0LDcgKzM1NCw3IEBACiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnBjbWNpYV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7CiAJCWxpc3RfZGVsKCZwX2Rldi0+c29ja2V0X2RldmljZV9saXN0KTsKLQkJcF9kZXYtPl9yZW1vdmVkPTE7CisJCXBfZGV2LT5fcmVtb3ZlZCA9IDE7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjbWNpYV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7CiAKIAkJZGV2X2RiZygmcF9kZXYtPmRldiwgInVucmVnaXN0ZXJpbmcgZGV2aWNlXG4iKTsKQEAgLTM2NCw3ICszNjQsNyBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIGludCBwY21jaWFfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICogZGV2KQorc3RhdGljIGludCBwY21jaWFfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2OwogCXN0cnVjdCBwY21jaWFfZHJpdmVyICpwX2RydjsKQEAgLTM5MSw3ICszOTEsNyBAQAogCQlyZXR1cm4gMDsKIAogCWlmIChwX2Rydi0+cmVtb3ZlKQotCSAgICAgICAJcF9kcnYtPnJlbW92ZShwX2Rldik7CisJCXBfZHJ2LT5yZW1vdmUocF9kZXYpOwogCiAJcF9kZXYtPmRldl9ub2RlID0gTlVMTDsKIApAQCAtNDk5LDcgKzQ5OSw3IEBACiAgKi8KIHN0YXRpYyBERUZJTkVfTVVURVgoZGV2aWNlX2FkZF9sb2NrKTsKIAotc3RydWN0IHBjbWNpYV9kZXZpY2UgKiBwY21jaWFfZGV2aWNlX2FkZChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgdW5zaWduZWQgaW50IGZ1bmN0aW9uKQorc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBjbWNpYV9kZXZpY2VfYWRkKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCB1bnNpZ25lZCBpbnQgZnVuY3Rpb24pCiB7CiAJc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCAqdG1wX2RldjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtNTQ1LDggKzU0NSw4IEBACiAJICogTm90ZSB0aGF0IHRoaXMgaXMgc2VyaWFsaXplZCBieSB0aGUgZGV2aWNlX2FkZF9sb2NrLCBzbyB0aGF0CiAJICogb25seSBvbmUgc3VjaCBzdHJ1Y3Qgd2lsbCBiZSBjcmVhdGVkLgogCSAqLwotICAgICAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcF9kZXYsICZzLT5kZXZpY2VzX2xpc3QsIHNvY2tldF9kZXZpY2VfbGlzdCkKLSAgICAgICAgICAgICAgICBpZiAocF9kZXYtPmZ1bmMgPT0gdG1wX2Rldi0+ZnVuYykgeworCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wX2RldiwgJnMtPmRldmljZXNfbGlzdCwgc29ja2V0X2RldmljZV9saXN0KQorCQlpZiAocF9kZXYtPmZ1bmMgPT0gdG1wX2Rldi0+ZnVuYykgewogCQkJcF9kZXYtPmZ1bmN0aW9uX2NvbmZpZyA9IHRtcF9kZXYtPmZ1bmN0aW9uX2NvbmZpZzsKIAkJCXBfZGV2LT5pbyA9IHRtcF9kZXYtPmlvOwogCQkJcF9kZXYtPmlycSA9IHRtcF9kZXYtPmlycTsKQEAgLTYyNywxMCArNjI3LDEwIEBACiAJCW5vX2Z1bmNzID0gMTsKIAlzLT5mdW5jdGlvbnMgPSBub19mdW5jczsKIAotCWZvciAoaT0wOyBpIDwgbm9fZnVuY3M7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgbm9fZnVuY3M7IGkrKykKIAkJcGNtY2lhX2RldmljZV9hZGQocywgaSk7CiAKLQlyZXR1cm4gKHJldCk7CisJcmV0dXJuIHJldDsKIH0KIAogCkBAIC03NTYsNyArNzU2LDcgQEAKICByZWxlYXNlOgogCXJlbGVhc2VfZmlybXdhcmUoZncpOwogCi0JcmV0dXJuIChyZXQpOworCXJldHVybiByZXQ7CiB9CiAKICNlbHNlIC8qICFDT05GSUdfUENNQ0lBX0xPQURfQ0lTICovCkBAIC04NTIsNyArODUyLDcgQEAKIAogCWlmIChkaWQtPm1hdGNoX2ZsYWdzICYgUENNQ0lBX0RFVl9JRF9NQVRDSF9BTk9OWU1PVVMpIHsKIAkJaW50IGk7Ci0JCWZvciAoaT0wOyBpPDQ7IGkrKykKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKIAkJCWlmIChkZXYtPnByb2RfaWRbaV0pCiAJCQkJcmV0dXJuIDA7CiAJCWlmIChkZXYtPmhhc19tYW5mX2lkIHx8IGRldi0+aGFzX2NhcmRfaWQgfHwgZGV2LT5oYXNfZnVuY19pZCkKQEAgLTg2NSw5ICs4NjUsMTAgQEAKIH0KIAogCi1zdGF0aWMgaW50IHBjbWNpYV9idXNfbWF0Y2goc3RydWN0IGRldmljZSAqIGRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKiBkcnYpIHsKLQlzdHJ1Y3QgcGNtY2lhX2RldmljZSAqIHBfZGV2ID0gdG9fcGNtY2lhX2RldihkZXYpOwotCXN0cnVjdCBwY21jaWFfZHJpdmVyICogcF9kcnYgPSB0b19wY21jaWFfZHJ2KGRydik7CitzdGF0aWMgaW50IHBjbWNpYV9idXNfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiA9IHRvX3BjbWNpYV9kZXYoZGV2KTsKKwlzdHJ1Y3QgcGNtY2lhX2RyaXZlciAqcF9kcnYgPSB0b19wY21jaWFfZHJ2KGRydik7CiAJc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgKmRpZCA9IHBfZHJ2LT5pZF90YWJsZTsKIAlzdHJ1Y3QgcGNtY2lhX2R5bmlkICpkeW5pZDsKIApAQCAtOTE3LDcgKzkxOCw3IEBACiAJcF9kZXYgPSB0b19wY21jaWFfZGV2KGRldik7CiAKIAkvKiBjYWxjdWxhdGUgaGFzaGVzICovCi0JZm9yIChpPTA7IGk8NDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQlpZiAoIXBfZGV2LT5wcm9kX2lkW2ldKQogCQkJY29udGludWU7CiAJCWhhc2hbaV0gPSBjcmMzMigwLCBwX2Rldi0+cHJvZF9pZFtpXSwgc3RybGVuKHBfZGV2LT5wcm9kX2lkW2ldKSk7CkBAIC05ODQsMTQgKzk4NSwxNCBAQAogc3RhdGljIHNzaXplX3QgZmllbGQjI19zaG93IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCQlcCiB7CQkJCQkJCQkJXAogCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiA9IHRvX3BjbWNpYV9kZXYoZGV2KTsJCVwKLQlyZXR1cm4gcF9kZXYtPnRlc3QgPyBzcHJpbnRmIChidWYsIGZvcm1hdCwgcF9kZXYtPmZpZWxkKSA6IC1FTk9ERVY7IFwKKwlyZXR1cm4gcF9kZXYtPnRlc3QgPyBzcHJpbnRmKGJ1ZiwgZm9ybWF0LCBwX2Rldi0+ZmllbGQpIDogLUVOT0RFVjsgXAogfQogCiAjZGVmaW5lIHBjbWNpYV9kZXZpY2Vfc3RyaW5nYXR0cihuYW1lLCBmaWVsZCkJCQkJCVwKIHN0YXRpYyBzc2l6ZV90IG5hbWUjI19zaG93IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCQlcCiB7CQkJCQkJCQkJXAogCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiA9IHRvX3BjbWNpYV9kZXYoZGV2KTsJCVwKLQlyZXR1cm4gcF9kZXYtPmZpZWxkID8gc3ByaW50ZiAoYnVmLCAiJXNcbiIsIHBfZGV2LT5maWVsZCkgOiAtRU5PREVWOyBcCisJcmV0dXJuIHBfZGV2LT5maWVsZCA/IHNwcmludGYoYnVmLCAiJXNcbiIsIHBfZGV2LT5maWVsZCkgOiAtRU5PREVWOyBcCiB9CiAKIHBjbWNpYV9kZXZpY2VfYXR0cihmdW5jLCBzb2NrZXQsICIweCUwMnhcbiIpOwpAQCAtMTAyMCw4ICsxMDIxLDggQEAKIAlzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYgPSB0b19wY21jaWFfZGV2KGRldik7CiAJaW50IHJldCA9IDA7CiAKLSAgICAgICAgaWYgKCFjb3VudCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICgoIXBfZGV2LT5zdXNwZW5kZWQpICYmICFzdHJuY21wKGJ1ZiwgIm9mZiIsIDMpKQogCQlyZXQgPSBydW50aW1lX3N1c3BlbmQoZGV2KTsKQEAgLTEwMzksMTAgKzEwNDAsMTEgQEAKIAl1MzIgaGFzaFs0XSA9IHsgMCwgMCwgMCwgMH07CiAKIAkvKiBjYWxjdWxhdGUgaGFzaGVzICovCi0JZm9yIChpPTA7IGk8NDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQlpZiAoIXBfZGV2LT5wcm9kX2lkW2ldKQogCQkJY29udGludWU7Ci0JCWhhc2hbaV0gPSBjcmMzMigwLHBfZGV2LT5wcm9kX2lkW2ldLHN0cmxlbihwX2Rldi0+cHJvZF9pZFtpXSkpOworCQloYXNoW2ldID0gY3JjMzIoMCwgcF9kZXYtPnByb2RfaWRbaV0sCisJCQkJc3RybGVuKHBfZGV2LT5wcm9kX2lkW2ldKSk7CiAJfQogCXJldHVybiBzcHJpbnRmKGJ1ZiwgInBjbWNpYTptJTA0WGMlMDRYZiUwMlhmbiUwMlhwZm4lMDJYIgogCQkJCSJwYSUwOFhwYiUwOFhwYyUwOFhwZCUwOFhcbiIsCkBAIC0xMDkxLDcgKzEwOTMsNyBAQAogCiAvKiBQTSBzdXBwb3J0LCBhbHNvIG5lZWRlZCBmb3IgcmVzZXQgKi8KIAotc3RhdGljIGludCBwY21jaWFfZGV2X3N1c3BlbmQoc3RydWN0IGRldmljZSAqIGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBwY21jaWFfZGV2X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2ID0gdG9fcGNtY2lhX2RldihkZXYpOwogCXN0cnVjdCBwY21jaWFfZHJpdmVyICpwX2RydiA9IE5VTEw7CkBAIC0xMTMxLDEwICsxMTMzLDEwIEBACiB9CiAKIAotc3RhdGljIGludCBwY21jaWFfZGV2X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICogZGV2KQorc3RhdGljIGludCBwY21jaWFfZGV2X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2ID0gdG9fcGNtY2lhX2RldihkZXYpOwotICAgICAgICBzdHJ1Y3QgcGNtY2lhX2RyaXZlciAqcF9kcnYgPSBOVUxMOworCXN0cnVjdCBwY21jaWFfZHJpdmVyICpwX2RydiA9IE5VTEw7CiAJaW50IHJldCA9IDA7CiAKIAlpZiAoIXBfZGV2LT5zdXNwZW5kZWQpCkBAIC0xMjExLDcgKzEyMTMsNyBAQAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKICAgICBUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlci4KLSAgICAKKwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qIE5vcm1hbGx5LCB0aGUgZXZlbnQgaXMgcGFzc2VkIHRvIGluZGl2aWR1YWwgZHJpdmVycyBhZnRlcgpAQCAtMTI2NCw3ICsxMjY2LDcgQEAKIH0gLyogZHNfZXZlbnQgKi8KIAogCi1zdHJ1Y3QgcGNtY2lhX2RldmljZSAqIHBjbWNpYV9kZXZfcHJlc2VudChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqX3BfZGV2KQorc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBjbWNpYV9kZXZfcHJlc2VudChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqX3BfZGV2KQogewogCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldjsKIAlzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcmV0ID0gTlVMTDsKQEAgLTEzMjksNyArMTMzMSw3IEBACiAJaWYgKHJldCkgewogCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCBkZXYsICJQQ01DSUEgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7CiAJCXBjbWNpYV9wdXRfc29ja2V0KHNvY2tldCk7Ci0JCXJldHVybiAocmV0KTsKKwkJcmV0dXJuIHJldDsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTE0MDAsNyArMTQwMiw3IEBACiAKIAlyZXR1cm4gMDsKIH0KLWZzX2luaXRjYWxsKGluaXRfcGNtY2lhX2J1cyk7IC8qIG9uZSBsZXZlbCBhZnRlciBzdWJzeXNfaW5pdGNhbGwgc28gdGhhdCAKK2ZzX2luaXRjYWxsKGluaXRfcGNtY2lhX2J1cyk7IC8qIG9uZSBsZXZlbCBhZnRlciBzdWJzeXNfaW5pdGNhbGwgc28gdGhhdAogCQkJICAgICAgICogcGNtY2lhX3NvY2tldF9jbGFzcyBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgKi8KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9wY21jaWFfaW9jdGwuYyBiL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9pb2N0bC5jCmluZGV4IGM0ZDc5MDguLmY3M2ZkNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9pb2N0bC5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9pb2N0bC5jCkBAIC04OCwxMiArODgsMTIgQEAKIAogCXBfZHJ2ID0gY29udGFpbmVyX29mKGRydiwgc3RydWN0IHBjbWNpYV9kcml2ZXIsIGRydik7CiAKLQlyZXR1cm4gKHBfZHJ2KTsKKwlyZXR1cm4gcF9kcnY7CiB9CiAKIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCi1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX3BjY2FyZCA9IE5VTEw7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX3BjY2FyZDsKIAogc3RhdGljIGludCBwcm9jX3JlYWRfZHJpdmVyc19jYWxsYmFjayhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyLCB2b2lkICpfbSkKIHsKQEAgLTE1OCw3ICsxNTgsOCBAQAogCiAjZWxzZQogCi1zdGF0aWMgaW5saW5lIGludCBhZGp1c3RfaXJxKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBhZGp1c3RfdCAqYWRqKSB7CitzdGF0aWMgaW5saW5lIGludCBhZGp1c3RfaXJxKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBhZGp1c3RfdCAqYWRqKQorewogCXJldHVybiAwOwogfQogCkBAIC0xOTUsNyArMTk2LDcgQEAKIAkJCQliZWdpbiA9IGFkai0+cmVzb3VyY2UubWVtb3J5LkJhc2U7CiAJCQkJZW5kID0gYWRqLT5yZXNvdXJjZS5tZW1vcnkuQmFzZSArIGFkai0+cmVzb3VyY2UubWVtb3J5LlNpemUgLSAxOwogCQkJCWlmIChzLT5yZXNvdXJjZV9vcHMtPmFkZF9tZW0pCi0JCQkJCXJldCA9cy0+cmVzb3VyY2Vfb3BzLT5hZGRfbWVtKHMsIGFkai0+QWN0aW9uLCBiZWdpbiwgZW5kKTsKKwkJCQkJcmV0ID0gcy0+cmVzb3VyY2Vfb3BzLT5hZGRfbWVtKHMsIGFkai0+QWN0aW9uLCBiZWdpbiwgZW5kKTsKIAkJCWNhc2UgUkVTX0lPX1JBTkdFOgogCQkJCWJlZ2luID0gYWRqLT5yZXNvdXJjZS5pby5CYXNlUG9ydDsKIAkJCQllbmQgPSBhZGotPnJlc291cmNlLmlvLkJhc2VQb3J0ICsgYWRqLT5yZXNvdXJjZS5pby5OdW1Qb3J0cyAtIDE7CkBAIC0yMTUsNyArMjE2LDcgQEAKIAl9CiAJdXBfcmVhZCgmcGNtY2lhX3NvY2tldF9saXN0X3J3c2VtKTsKIAotCXJldHVybiAocmV0KTsKKwlyZXR1cm4gcmV0OwogfQogCiAKQEAgLTQ5MCw3ICs0OTEsNyBAQAogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwY21jaWFfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOwotICAgICAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5KHBfZGV2LCAmcy0+ZGV2aWNlc19saXN0LCBzb2NrZXRfZGV2aWNlX2xpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBfZGV2LCAmcy0+ZGV2aWNlc19saXN0LCBzb2NrZXRfZGV2aWNlX2xpc3QpIHsKIAkJaWYgKHBfZGV2LT5mdW5jID09IGJpbmRfaW5mby0+ZnVuY3Rpb24pIHsKIAkJCWlmICgocF9kZXYtPmRldi5kcml2ZXIgPT0gJnBfZHJ2LT5kcnYpKSB7CiAJCQkJaWYgKHBfZGV2LT5jYXJkbWdyKSB7CkBAIC01NTgsNyArNTU5LDcgQEAKICBlcnJfcHV0OgogCXBjbWNpYV9wdXRfc29ja2V0KHMpOwogCi0JcmV0dXJuIChyZXQpOworCXJldHVybiByZXQ7CiB9IC8qIGJpbmRfcmVxdWVzdCAqLwogCiAjaWZkZWYgQ09ORklHX0NBUkRCVVMKQEAgLTY1NSw3ICs2NTYsNyBAQAogCiAgZXJyX3B1dDoKIAlwY21jaWFfcHV0X2RldihwX2Rldik7Ci0JcmV0dXJuIChyZXQpOworCXJldHVybiByZXQ7CiB9IC8qIGdldF9kZXZpY2VfaW5mbyAqLwogCiAKQEAgLTY2NCw3ICs2NjUsNyBAQAogICAgIHNvY2tldF90IGkgPSBpbWlub3IoaW5vZGUpOwogICAgIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzOwogICAgIHVzZXJfaW5mb190ICp1c2VyOwotICAgIHN0YXRpYyBpbnQgd2FybmluZ19wcmludGVkID0gMDsKKyAgICBzdGF0aWMgaW50IHdhcm5pbmdfcHJpbnRlZDsKICAgICBpbnQgcmV0ID0gMDsKIAogICAgIHByX2RlYnVnKCJkc19vcGVuKHNvY2tldCAlZClcbiIsIGkpOwpAQCAtNzM4LDEyICs3MzksMTMgQEAKICAgICBzID0gdXNlci0+c29ja2V0OwogCiAgICAgLyogVW5saW5rIHVzZXIgZGF0YSBzdHJ1Y3R1cmUgKi8KLSAgICBpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX0FDQ01PREUpICE9IE9fUkRPTkxZKSB7CisgICAgaWYgKChmaWxlLT5mX2ZsYWdzICYgT19BQ0NNT0RFKSAhPSBPX1JET05MWSkKIAlzLT5wY21jaWFfc3RhdGUuYnVzeSA9IDA7Ci0gICAgfQorCiAgICAgZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKICAgICBmb3IgKGxpbmsgPSAmcy0+dXNlcjsgKmxpbms7IGxpbmsgPSAmKCpsaW5rKS0+bmV4dCkKLQlpZiAoKmxpbmsgPT0gdXNlcikgYnJlYWs7CisJaWYgKCpsaW5rID09IHVzZXIpCisJCWJyZWFrOwogICAgIGlmIChsaW5rID09IE5VTEwpCiAJZ290byBvdXQ7CiAgICAgKmxpbmsgPSB1c2VyLT5uZXh0OwpAQCAtNzc0LDcgKzc3Niw3IEBACiAKICAgICBzID0gdXNlci0+c29ja2V0OwogICAgIGlmIChzLT5wY21jaWFfc3RhdGUuZGVhZCkKLSAgICAgICAgcmV0dXJuIC1FSU87CisJcmV0dXJuIC1FSU87CiAKICAgICByZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocy0+cXVldWUsICFxdWV1ZV9lbXB0eSh1c2VyKSk7CiAgICAgaWYgKHJldCA9PSAwKQpAQCAtODI0LDcgKzgyNiw3IEBACiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCi1zdGF0aWMgaW50IGRzX2lvY3RsKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCitzdGF0aWMgaW50IGRzX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkgICAgdV9pbnQgY21kLCB1X2xvbmcgYXJnKQogewogICAgIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzOwpAQCAtODQyLDEwICs4NDQsMTEgQEAKIAogICAgIHMgPSB1c2VyLT5zb2NrZXQ7CiAgICAgaWYgKHMtPnBjbWNpYV9zdGF0ZS5kZWFkKQotICAgICAgICByZXR1cm4gLUVJTzsKKwlyZXR1cm4gLUVJTzsKIAogICAgIHNpemUgPSAoY21kICYgSU9DU0laRV9NQVNLKSA+PiBJT0NTSVpFX1NISUZUOwotICAgIGlmIChzaXplID4gc2l6ZW9mKGRzX2lvY3RsX2FyZ190KSkgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKHNpemUgPiBzaXplb2YoZHNfaW9jdGxfYXJnX3QpKQorCXJldHVybiAtRUlOVkFMOwogCiAgICAgLyogUGVybWlzc2lvbiBjaGVjayAqLwogICAgIGlmICghKGNtZCAmIElPQ19PVVQpICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQpAQCAtMTAyNCw4ICsxMDI3LDggQEAKICAgICB9CiAKICAgICBpZiAoY21kICYgSU9DX09VVCkgewotICAgICAgICBpZiAoX19jb3B5X3RvX3VzZXIodWFyZywgKGNoYXIgKilidWYsIHNpemUpKQotICAgICAgICAgICAgZXJyID0gLUVGQVVMVDsKKwlpZiAoX19jb3B5X3RvX3VzZXIodWFyZywgKGNoYXIgKilidWYsIHNpemUpKQorCQllcnIgPSAtRUZBVUxUOwogICAgIH0KIAogZnJlZV9vdXQ6CkBAIC0xMDQ1LDcgKzEwNDgsOCBAQAogCS5wb2xsCQk9IGRzX3BvbGwsCiB9OwogCi12b2lkIF9faW5pdCBwY21jaWFfc2V0dXBfaW9jdGwodm9pZCkgewordm9pZCBfX2luaXQgcGNtY2lhX3NldHVwX2lvY3RsKHZvaWQpCit7CiAJaW50IGk7CiAKIAkvKiBTZXQgdXAgY2hhcmFjdGVyIGRldmljZSBmb3IgdXNlciBtb2RlIGNsaWVudHMgKi8KQEAgLTEwNjQsNyArMTA2OCw4IEBACiB9CiAKIAotdm9pZCBfX2V4aXQgcGNtY2lhX2NsZWFudXBfaW9jdGwodm9pZCkgewordm9pZCBfX2V4aXQgcGNtY2lhX2NsZWFudXBfaW9jdGwodm9pZCkKK3sKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogCWlmIChwcm9jX3BjY2FyZCkgewogCQlyZW1vdmVfcHJvY19lbnRyeSgiZHJpdmVycyIsIHByb2NfcGNjYXJkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9yZXNvdXJjZS5jIGIvZHJpdmVycy9wY21jaWEvcGNtY2lhX3Jlc291cmNlLmMKaW5kZXggYThiZjhjMS4uZDVkYjk1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcGNtY2lhX3Jlc291cmNlLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcGNtY2lhX3Jlc291cmNlLmMKQEAgLTMzLDcgKzMzLDcgQEAKIAogCiAvKiBBY2Nlc3Mgc3BlZWQgZm9yIElPIHdpbmRvd3MgKi8KLXN0YXRpYyBpbnQgaW9fc3BlZWQgPSAwOworc3RhdGljIGludCBpb19zcGVlZDsKIG1vZHVsZV9wYXJhbShpb19zcGVlZCwgaW50LCAwNDQ0KTsKIAogCkBAIC02Miw3ICs2Miw4IEBACiAJCQkgICAgICAgbnVtLCBhbGlnbik7CiAJCQlhbGlnbiA9IDA7CiAJCX0gZWxzZQotCQkJd2hpbGUgKGFsaWduICYmIChhbGlnbiA8IG51bSkpIGFsaWduIDw8PSAxOworCQkJd2hpbGUgKGFsaWduICYmIChhbGlnbiA8IG51bSkpCisJCQkJYWxpZ24gPDw9IDE7CiAJfQogCWlmICgqYmFzZSAmIH4oYWxpZ24tMSkpIHsKIAkJZGV2X2RiZygmcy0+ZGV2LCAib2RkIElPIHJlcXVlc3Q6IGJhc2UgJSN4IGFsaWduICUjeFxuIiwKQEAgLTMzOCw3ICszMzksNyBAQAogCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzID0gcF9kZXYtPnNvY2tldDsKIAljb25maWdfdCAqYyA9IHBfZGV2LT5mdW5jdGlvbl9jb25maWc7CiAKLQlpZiAoIXBfZGV2LT5faW8gKQorCWlmICghcF9kZXYtPl9pbykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwX2Rldi0+X2lvID0gMDsKQEAgLTM2Miw3ICszNjMsNyBAQAogc3RhdGljIGludCBwY21jaWFfcmVsZWFzZV9pcnEoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBpcnFfcmVxX3QgKnJlcSkKIHsKIAlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9IHBfZGV2LT5zb2NrZXQ7Ci0JY29uZmlnX3QgKmM9IHBfZGV2LT5mdW5jdGlvbl9jb25maWc7CisJY29uZmlnX3QgKmMgPSBwX2Rldi0+ZnVuY3Rpb25fY29uZmlnOwogCiAJaWYgKCFwX2Rldi0+X2lycSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zODMsOSArMzg0LDggQEAKIAkJcy0+aXJxLkFzc2lnbmVkSVJRID0gMDsKIAl9CiAKLQlpZiAocmVxLT5IYW5kbGVyKSB7CisJaWYgKHJlcS0+SGFuZGxlcikKIAkJZnJlZV9pcnEocmVxLT5Bc3NpZ25lZElSUSwgcF9kZXYtPnByaXYpOwotCX0KIAogI2lmZGVmIENPTkZJR19QQ01DSUFfUFJPQkUKIAlwY21jaWFfdXNlZF9pcnFbcmVxLT5Bc3NpZ25lZElSUV0tLTsKQEAgLTY1Niw3ICs2NTYsOCBAQAogCQl0eXBlID0gSVJRRl9TSEFSRUQ7CiAJZWxzZSBpZiAocmVxLT5BdHRyaWJ1dGVzICYgSVJRX1RZUEVfRFlOQU1JQ19TSEFSSU5HKQogCQl0eXBlID0gSVJRRl9TSEFSRUQ7Ci0JZWxzZSBwcmludGsoS0VSTl9XQVJOSU5HICJwY21jaWE6IERyaXZlciBuZWVkcyB1cGRhdGluZyB0byBzdXBwb3J0IElSUSBzaGFyaW5nLlxuIik7CisJZWxzZQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJwY21jaWE6IERyaXZlciBuZWVkcyB1cGRhdGluZyB0byBzdXBwb3J0IElSUSBzaGFyaW5nLlxuIik7CiAKICNpZmRlZiBDT05GSUdfUENNQ0lBX1BST0JFCiAKQEAgLTc4OCw3ICs3ODksOCBAQAogCiAJLyogQWxsb2NhdGUgc3lzdGVtIG1lbW9yeSB3aW5kb3cgKi8KIAlmb3IgKHcgPSAwOyB3IDwgTUFYX1dJTjsgdysrKQotCQlpZiAoIShzLT5zdGF0ZSAmIFNPQ0tFVF9XSU5fUkVRKHcpKSkgYnJlYWs7CisJCWlmICghKHMtPnN0YXRlICYgU09DS0VUX1dJTl9SRVEodykpKQorCQkJYnJlYWs7CiAJaWYgKHcgPT0gTUFYX1dJTikgewogCQlkZXZfZGJnKCZzLT5kZXYsICJhbGwgd2luZG93cyBhcmUgdXNlZCBhbHJlYWR5XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC04MjYsMTggKzgyOCwxOSBAQAogCXMtPnN0YXRlIHw9IFNPQ0tFVF9XSU5fUkVRKHcpOwogCiAJLyogUmV0dXJuIHdpbmRvdyBoYW5kbGUgKi8KLQlpZiAocy0+ZmVhdHVyZXMgJiBTU19DQVBfU1RBVElDX01BUCkgeworCWlmIChzLT5mZWF0dXJlcyAmIFNTX0NBUF9TVEFUSUNfTUFQKQogCQlyZXEtPkJhc2UgPSB3aW4tPnN0YXRpY19zdGFydDsKLQl9IGVsc2UgeworCWVsc2UKIAkJcmVxLT5CYXNlID0gd2luLT5yZXMtPnN0YXJ0OwotCX0KKwogCSp3aCA9IHcgKyAxOwogCiAJcmV0dXJuIDA7CiB9IC8qIHBjbWNpYV9yZXF1ZXN0X3dpbmRvdyAqLwogRVhQT1JUX1NZTUJPTChwY21jaWFfcmVxdWVzdF93aW5kb3cpOwogCi12b2lkIHBjbWNpYV9kaXNhYmxlX2RldmljZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYpIHsKK3ZvaWQgcGNtY2lhX2Rpc2FibGVfZGV2aWNlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldikKK3sKIAlwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKHBfZGV2KTsKIAlwY21jaWFfcmVsZWFzZV9pbyhwX2RldiwgJnBfZGV2LT5pbyk7CiAJcGNtY2lhX3JlbGVhc2VfaXJxKHBfZGV2LCAmcF9kZXYtPmlycSk7CkBAIC05NzAsNyArOTczLDcgQEAKIAogCXJldHVybiBwY2NhcmRfbG9vcF90dXBsZShwX2Rldi0+c29ja2V0LCBwX2Rldi0+ZnVuYywgY29kZSwgTlVMTCwKIAkJCQkgJmxvb3AsIHBjbWNpYV9kb19sb29wX3R1cGxlKTsKLX07Cit9CiBFWFBPUlRfU1lNQk9MKHBjbWNpYV9sb29wX3R1cGxlKTsKIAogCkBAIC0xMDAwLDcgKzEwMDMsNyBAQAogCX0gZWxzZQogCQlkZXZfZGJnKCZwX2Rldi0+ZGV2LCAiZG9fZ2V0X3R1cGxlOiBvdXQgb2YgbWVtb3J5XG4iKTsKIAlyZXR1cm4gMDsKLX07Cit9CiAKIC8qKgogICogcGNtY2lhX2dldF90dXBsZSgpIC0gZ2V0IGZpcnN0IHR1cGxlIGZyb20gQ0lTCkBAIC0xMDI0LDcgKzEwMjcsNyBAQAogCXBjbWNpYV9sb29wX3R1cGxlKHBfZGV2LCBjb2RlLCBwY21jaWFfZG9fZ2V0X3R1cGxlLCAmZ2V0KTsKIAogCXJldHVybiBnZXQubGVuOwotfTsKK30KIEVYUE9SVF9TWU1CT0wocGNtY2lhX2dldF90dXBsZSk7CiAKIApAQCAtMTA1Nyw3ICsxMDYwLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQogCQlkZXYtPmRldl9hZGRyW2ldID0gdHVwbGUtPlR1cGxlRGF0YVtpKzJdOwogCXJldHVybiAwOwotfTsKK30KIAogLyoqCiAgKiBwY21jaWFfZ2V0X21hY19mcm9tX2NpcygpIC0gcmVhZCBvdXQgTUFDIGFkZHJlc3MgZnJvbSBDSVNUUExfRlVOQ0UKQEAgLTEwNzEsNiArMTA3NCw2IEBACiBpbnQgcGNtY2lhX2dldF9tYWNfZnJvbV9jaXMoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXJldHVybiBwY21jaWFfbG9vcF90dXBsZShwX2RldiwgQ0lTVFBMX0ZVTkNFLCBwY21jaWFfZG9fZ2V0X21hYywgZGV2KTsKLX07Cit9CiBFWFBPUlRfU1lNQk9MKHBjbWNpYV9nZXRfbWFjX2Zyb21fY2lzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYXNlLmMKaW5kZXggODRkZGU3NzYuLmRhMzQ2ZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYXNlLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuYwpAQCAtMjE0LDcgKzIxNCw4IEBACiAJTUVDUiB8PSBNRUNSX0NJVDsKIAogCS8qIFNldCBNRUNSOk5PUyAoTnVtYmVyIE9mIFNvY2tldHMpICovCi0JaWYgKChvcHMtPmZpcnN0ICsgb3BzLT5ucikgPiAxIHx8IG1hY2hpbmVfaXNfdmlwZXIoKSkKKwlpZiAoKG9wcy0+Zmlyc3QgKyBvcHMtPm5yKSA+IDEgfHwKKwkgICAgbWFjaGluZV9pc192aXBlcigpIHx8IG1hY2hpbmVfaXNfYXJjb21femV1cygpKQogCQlNRUNSIHw9IE1FQ1JfTk9TOwogCWVsc2UKIAkJTUVDUiAmPSB+TUVDUl9OT1M7CkBAIC0yNTIsNiArMjUzLDcgQEAKIAogCXJldHVybiBzb2NfcGNtY2lhX2FkZF9vbmUoc2t0KTsKIH0KK0VYUE9SVF9TWU1CT0wocHhhMnh4X2Rydl9wY21jaWFfYWRkX29uZSk7CiAKIHZvaWQgcHhhMnh4X2Rydl9wY21jaWFfb3BzKHN0cnVjdCBwY21jaWFfbG93X2xldmVsICpvcHMpCiB7CkBAIC0yNjEsMTkgKzI2MywxOSBAQAogCW9wcy0+ZnJlcXVlbmN5X2NoYW5nZSA9IHB4YTJ4eF9wY21jaWFfZnJlcXVlbmN5X2NoYW5nZTsKICNlbmRpZgogfQorRVhQT1JUX1NZTUJPTChweGEyeHhfZHJ2X3BjbWNpYV9vcHMpOwogCi1pbnQgX19weGEyeHhfZHJ2X3BjbWNpYV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHB4YTJ4eF9kcnZfcGNtY2lhX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKIAlpbnQgaSwgcmV0ID0gMDsKIAlzdHJ1Y3QgcGNtY2lhX2xvd19sZXZlbCAqb3BzOwogCXN0cnVjdCBza3RfZGV2X2luZm8gKnNpbmZvOwogCXN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0OwogCi0JaWYgKCFkZXYgfHwgIWRldi0+cGxhdGZvcm1fZGF0YSkKKwlvcHMgPSAoc3RydWN0IHBjbWNpYV9sb3dfbGV2ZWwgKilkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmICghb3BzKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCW9wcyA9IChzdHJ1Y3QgcGNtY2lhX2xvd19sZXZlbCAqKWRldi0+cGxhdGZvcm1fZGF0YTsKLQogCXB4YTJ4eF9kcnZfcGNtY2lhX29wcyhvcHMpOwogCiAJc2luZm8gPSBremFsbG9jKFNLVF9ERVZfSU5GT19TSVpFKG9wcy0+bnIpLCBHRlBfS0VSTkVMKTsKQEAgLTMwOCwxMyArMzEwLDYgQEAKIAogCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MKF9fcHhhMnh4X2Rydl9wY21jaWFfcHJvYmUpOwotCi0KLXN0YXRpYyBpbnQgcHhhMnh4X2Rydl9wY21jaWFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQotewotCXJldHVybiBfX3B4YTJ4eF9kcnZfcGNtY2lhX3Byb2JlKCZkZXYtPmRldik7Ci19CiAKIHN0YXRpYyBpbnQgcHhhMnh4X2Rydl9wY21jaWFfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYXNlLmggYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfYmFzZS5oCmluZGV4IGNiNWVmYWUuLmJiNjJlYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYXNlLmgKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuaApAQCAtMSw2ICsxLDMgQEAKLS8qIHRlbXBvcmFyeSBtZWFzdXJlICovCi1leHRlcm4gaW50IF9fcHhhMnh4X2Rydl9wY21jaWFfcHJvYmUoc3RydWN0IGRldmljZSAqKTsKLQogaW50IHB4YTJ4eF9kcnZfcGNtY2lhX2FkZF9vbmUoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpOwogdm9pZCBweGEyeHhfZHJ2X3BjbWNpYV9vcHMoc3RydWN0IHBjbWNpYV9sb3dfbGV2ZWwgKm9wcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9wYWxtdGMuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9wYWxtdGMuYwppbmRleCAzYTg5OTNlLi40NTlhMjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfcGFsbXRjLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X3BhbG10Yy5jCkBAIC02Nyw3ICs2Nyw3IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnI3OwogCi0Jc2t0LT5pcnEgPSBJUlFfR1BJTyhHUElPX05SX1BBTE1UQ19QQ01DSUFfUkVBRFkpOworCXNrdC0+c29ja2V0LnBjaV9pcnEgPSBJUlFfR1BJTyhHUElPX05SX1BBTE1UQ19QQ01DSUFfUkVBRFkpOwogCXJldHVybiAwOwogCiBlcnI3OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X3N0YXJnYXRlMi5jIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X3N0YXJnYXRlMi5jCmluZGV4IDQ5MDc0OWUuLmQwODgwMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9zdGFyZ2F0ZTIuYworKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfc3RhcmdhdGUyLmMKQEAgLTQwLDcgKzQwLDcgQEAKIAogc3RhdGljIGludCBzZzJfcGNtY2lhX2h3X2luaXQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCiB7Ci0Jc2t0LT5pcnEgPSBJUlFfR1BJTyhTRzJfUzBfR1BJT19SRUFEWSk7CisJc2t0LT5zb2NrZXQucGNpX2lycSA9IElSUV9HUElPKFNHMl9TMF9HUElPX1JFQURZKTsKIAlyZXR1cm4gc29jX3BjbWNpYV9yZXF1ZXN0X2lycXMoc2t0LCBpcnFzLCBBUlJBWV9TSVpFKGlycXMpKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X3ZpcGVyLmMgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfdmlwZXIuYwppbmRleCAyN2JlMmUxNS4uYTUxZjIwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X3ZpcGVyLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X3ZpcGVyLmMKQEAgLTEsOSArMSw4IEBACiAvKgotICogVklQRVIgUENNQ0lBIHN1cHBvcnQKKyAqIFZpcGVyL1pldXMgUENNQ0lBIHN1cHBvcnQKICAqICAgQ29weXJpZ2h0IDIwMDQgQXJjb20gQ29udHJvbCBTeXN0ZW1zCiAgKgogICogTWFpbnRhaW5lZCBieSBNYXJjIFp5bmdpZXIgPG1hekBtaXN0ZXJqb25lcy5vcmc+Ci0gKiAJCQkgICAgICA8bWFyYy56eW5naWVyQGFsdHJhbi5jb20+CiAgKgogICogQmFzZWQgb246CiAgKiAgIGlQQVEgaDIyMDAgUENNQ0lBIHN1cHBvcnQKQEAgLTI2LDM3ICsyNSw0NyBAQAogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCi0jaW5jbHVkZSA8bWFjaC92aXBlci5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8bWFjaC9hcmNvbS1wY21jaWEuaD4KIAogI2luY2x1ZGUgInNvY19jb21tb24uaCIKICNpbmNsdWRlICJweGEyeHhfYmFzZS5oIgogCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYXJjb21fcGNtY2lhX2RldjsKKwogc3RhdGljIHN0cnVjdCBwY21jaWFfaXJxcyBpcnFzW10gPSB7Ci0JeyAwLCBncGlvX3RvX2lycShWSVBFUl9DRl9DRF9HUElPKSwgICJQQ01DSUFfQ0QiIH0KKwl7CisJCS5zb2NrCT0gMCwKKwkJLnN0cgk9ICJQQ01DSUFfQ0QiLAorCX0sCiB9OwogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhcmNvbV9wY21jaWFfcGRhdGEgKnZpcGVyX2dldF9wZGF0YSh2b2lkKQoreworCXJldHVybiBhcmNvbV9wY21jaWFfZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKK30KKwogc3RhdGljIGludCB2aXBlcl9wY21jaWFfaHdfaW5pdChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKIHsKKwlzdHJ1Y3QgYXJjb21fcGNtY2lhX3BkYXRhICpwZGF0YSA9IHZpcGVyX2dldF9wZGF0YSgpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlza3QtPnNvY2tldC5wY2lfaXJxID0gZ3Bpb190b19pcnEoVklQRVJfQ0ZfUkRZX0dQSU8pOworCXNrdC0+c29ja2V0LnBjaV9pcnEgPSBncGlvX3RvX2lycShwZGF0YS0+cmR5X2dwaW8pOworCWlycXNbMF0uaXJxID0gZ3Bpb190b19pcnEocGRhdGEtPmNkX2dwaW8pOwogCi0JaWYgKGdwaW9fcmVxdWVzdChWSVBFUl9DRl9DRF9HUElPLCAiQ0YgZGV0ZWN0IikpCisJaWYgKGdwaW9fcmVxdWVzdChwZGF0YS0+Y2RfZ3BpbywgIkNGIGRldGVjdCIpKQogCQlnb3RvIGVycl9yZXF1ZXN0X2NkOwogCi0JaWYgKGdwaW9fcmVxdWVzdChWSVBFUl9DRl9SRFlfR1BJTywgIkNGIHJlYWR5IikpCisJaWYgKGdwaW9fcmVxdWVzdChwZGF0YS0+cmR5X2dwaW8sICJDRiByZWFkeSIpKQogCQlnb3RvIGVycl9yZXF1ZXN0X3JkeTsKIAotCWlmIChncGlvX3JlcXVlc3QoVklQRVJfQ0ZfUE9XRVJfR1BJTywgIkNGIHBvd2VyIikpCisJaWYgKGdwaW9fcmVxdWVzdChwZGF0YS0+cHdyX2dwaW8sICJDRiBwb3dlciIpKQogCQlnb3RvIGVycl9yZXF1ZXN0X3B3cjsKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAotCS8qIEdQSU8gODIgaXMgdGhlIENGIHBvd2VyIGVuYWJsZSBsaW5lLiBpbml0aWFsbHkgb2ZmICovCi0JaWYgKGdwaW9fZGlyZWN0aW9uX291dHB1dChWSVBFUl9DRl9QT1dFUl9HUElPLCAwKSB8fAotCSAgICBncGlvX2RpcmVjdGlvbl9pbnB1dChWSVBFUl9DRl9DRF9HUElPKSB8fAotCSAgICBncGlvX2RpcmVjdGlvbl9pbnB1dChWSVBFUl9DRl9SRFlfR1BJTykpIHsKKwlpZiAoZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHBkYXRhLT5wd3JfZ3BpbywgMCkgfHwKKwkgICAgZ3Bpb19kaXJlY3Rpb25faW5wdXQocGRhdGEtPmNkX2dwaW8pIHx8CisJICAgIGdwaW9fZGlyZWN0aW9uX2lucHV0KHBkYXRhLT5yZHlfZ3BpbykpIHsKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCQlnb3RvIGVycl9kaXI7CiAJfQpAQCAtNjYsMTMgKzc1LDEzIEBACiAJcmV0dXJuIHNvY19wY21jaWFfcmVxdWVzdF9pcnFzKHNrdCwgaXJxcywgQVJSQVlfU0laRShpcnFzKSk7CiAKIGVycl9kaXI6Ci0JZ3Bpb19mcmVlKFZJUEVSX0NGX1BPV0VSX0dQSU8pOworCWdwaW9fZnJlZShwZGF0YS0+cHdyX2dwaW8pOwogZXJyX3JlcXVlc3RfcHdyOgotCWdwaW9fZnJlZShWSVBFUl9DRl9SRFlfR1BJTyk7CisJZ3Bpb19mcmVlKHBkYXRhLT5yZHlfZ3Bpbyk7CiBlcnJfcmVxdWVzdF9yZHk6Ci0JZ3Bpb19mcmVlKFZJUEVSX0NGX0NEX0dQSU8pOworCWdwaW9fZnJlZShwZGF0YS0+Y2RfZ3Bpbyk7CiBlcnJfcmVxdWVzdF9jZDoKLQlwcmludGsoS0VSTl9FUlIgInZpcGVyOiBGYWlsZWQgdG8gc2V0dXAgUENNQ0lBIEdQSU9zXG4iKTsKKwlkZXZfZXJyKCZhcmNvbV9wY21jaWFfZGV2LT5kZXYsICJGYWlsZWQgdG8gc2V0dXAgUENNQ0lBIEdQSU9zXG4iKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTgxLDE3ICs5MCwyMSBAQAogICovCiBzdGF0aWMgdm9pZCB2aXBlcl9wY21jaWFfaHdfc2h1dGRvd24oc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCiB7CisJc3RydWN0IGFyY29tX3BjbWNpYV9wZGF0YSAqcGRhdGEgPSB2aXBlcl9nZXRfcGRhdGEoKTsKKwogCXNvY19wY21jaWFfZnJlZV9pcnFzKHNrdCwgaXJxcywgQVJSQVlfU0laRShpcnFzKSk7Ci0JZ3Bpb19mcmVlKFZJUEVSX0NGX1BPV0VSX0dQSU8pOwotCWdwaW9fZnJlZShWSVBFUl9DRl9SRFlfR1BJTyk7Ci0JZ3Bpb19mcmVlKFZJUEVSX0NGX0NEX0dQSU8pOworCWdwaW9fZnJlZShwZGF0YS0+cHdyX2dwaW8pOworCWdwaW9fZnJlZShwZGF0YS0+cmR5X2dwaW8pOworCWdwaW9fZnJlZShwZGF0YS0+Y2RfZ3Bpbyk7CiB9CiAKIHN0YXRpYyB2b2lkIHZpcGVyX3BjbWNpYV9zb2NrZXRfc3RhdGUoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QsCiAJCQkJICAgICAgc3RydWN0IHBjbWNpYV9zdGF0ZSAqc3RhdGUpCiB7Ci0Jc3RhdGUtPmRldGVjdCA9IGdwaW9fZ2V0X3ZhbHVlKFZJUEVSX0NGX0NEX0dQSU8pID8gMCA6IDE7Ci0Jc3RhdGUtPnJlYWR5ICA9IGdwaW9fZ2V0X3ZhbHVlKFZJUEVSX0NGX1JEWV9HUElPKSA/IDEgOiAwOworCXN0cnVjdCBhcmNvbV9wY21jaWFfcGRhdGEgKnBkYXRhID0gdmlwZXJfZ2V0X3BkYXRhKCk7CisKKwlzdGF0ZS0+ZGV0ZWN0ID0gIWdwaW9fZ2V0X3ZhbHVlKHBkYXRhLT5jZF9ncGlvKTsKKwlzdGF0ZS0+cmVhZHkgID0gISFncGlvX2dldF92YWx1ZShwZGF0YS0+cmR5X2dwaW8pOwogCXN0YXRlLT5idmQxICAgPSAxOwogCXN0YXRlLT5idmQyICAgPSAxOwogCXN0YXRlLT53cnByb3QgPSAwOwpAQCAtMTAyLDIwICsxMTUsMjEgQEAKIHN0YXRpYyBpbnQgdmlwZXJfcGNtY2lhX2NvbmZpZ3VyZV9zb2NrZXQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QsCiAJCQkJCSBjb25zdCBzb2NrZXRfc3RhdGVfdCAqc3RhdGUpCiB7CisJc3RydWN0IGFyY29tX3BjbWNpYV9wZGF0YSAqcGRhdGEgPSB2aXBlcl9nZXRfcGRhdGEoKTsKKwogCS8qIFNpbGVudGx5IGlnbm9yZSBWcHAsIG91dHB1dCBlbmFibGUsIHNwZWFrZXIgZW5hYmxlLiAqLwotCXZpcGVyX2NmX3JzdChzdGF0ZS0+ZmxhZ3MgJiBTU19SRVNFVCk7CisJcGRhdGEtPnJlc2V0KHN0YXRlLT5mbGFncyAmIFNTX1JFU0VUKTsKIAogCS8qIEFwcGx5IHNvY2tldCB2b2x0YWdlICovCiAJc3dpdGNoIChzdGF0ZS0+VmNjKSB7CiAJY2FzZSAwOgotCQlncGlvX3NldF92YWx1ZShWSVBFUl9DRl9QT1dFUl9HUElPLCAwKTsKKwkJZ3Bpb19zZXRfdmFsdWUocGRhdGEtPnB3cl9ncGlvLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSAzMzoKLQkJZ3Bpb19zZXRfdmFsdWUoVklQRVJfQ0ZfUE9XRVJfR1BJTywgMSk7CisJCWdwaW9fc2V0X3ZhbHVlKHBkYXRhLT5wd3JfZ3BpbywgMSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuc3VwcG9ydGVkIFZjYzolZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBzdGF0ZS0+VmNjKTsKKwkJZGV2X2VycigmYXJjb21fcGNtY2lhX2Rldi0+ZGV2LCAiVW5zdXBwb3J0ZWQgVmNjOiVkXG4iLCBzdGF0ZS0+VmNjKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtMTMwLDcgKzE0NCw3IEBACiB7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2xvd19sZXZlbCB2aXBlcl9wY21jaWFfb3BzIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHBjbWNpYV9sb3dfbGV2ZWwgdmlwZXJfcGNtY2lhX29wcyA9IHsKIAkub3duZXIgICAgICAgICAgCT0gVEhJU19NT0RVTEUsCiAJLmh3X2luaXQgICAgICAgIAk9IHZpcGVyX3BjbWNpYV9od19pbml0LAogCS5od19zaHV0ZG93bgkJPSB2aXBlcl9wY21jaWFfaHdfc2h1dGRvd24sCkBAIC0xNDMsMTcgKzE1NywyNSBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqdmlwZXJfcGNtY2lhX2RldmljZTsKIAotc3RhdGljIGludCBfX2luaXQgdmlwZXJfcGNtY2lhX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgdmlwZXJfcGNtY2lhX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJaW50IHJldDsKIAotCWlmICghbWFjaGluZV9pc192aXBlcigpKQotCQlyZXR1cm4gLUVOT0RFVjsKKwkvKiBJIGNhbid0IGltYWdpbmUgbW9yZSB0aGFuIG9uZSBkZXZpY2UsIGJ1dCB5b3UgbmV2ZXIga25vdy4uLiAqLworCWlmIChhcmNvbV9wY21jaWFfZGV2KQorCQlyZXR1cm4gLUVFWElTVDsKKworCWlmICghcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpCisJCXJldHVybiAtRUlOVkFMOwogCiAJdmlwZXJfcGNtY2lhX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygicHhhMnh4LXBjbWNpYSIsIC0xKTsKIAlpZiAoIXZpcGVyX3BjbWNpYV9kZXZpY2UpCiAJCXJldHVybiAtRU5PTUVNOwogCisJYXJjb21fcGNtY2lhX2RldiA9IHBkZXY7CisKKwl2aXBlcl9wY21jaWFfZGV2aWNlLT5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKKwogCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YSh2aXBlcl9wY21jaWFfZGV2aWNlLAogCQkJCSAgICAgICAmdmlwZXJfcGNtY2lhX29wcywKIAkJCQkgICAgICAgc2l6ZW9mKHZpcGVyX3BjbWNpYV9vcHMpKTsKQEAgLTE2MSwxOCArMTgzLDQ5IEBACiAJaWYgKCFyZXQpCiAJCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQodmlwZXJfcGNtY2lhX2RldmljZSk7CiAKLQlpZiAocmV0KQorCWlmIChyZXQpIHsKIAkJcGxhdGZvcm1fZGV2aWNlX3B1dCh2aXBlcl9wY21jaWFfZGV2aWNlKTsKKwkJYXJjb21fcGNtY2lhX2RldiA9IE5VTEw7CisJfQogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IHZpcGVyX3BjbWNpYV9leGl0KHZvaWQpCitzdGF0aWMgaW50IHZpcGVyX3BjbWNpYV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcih2aXBlcl9wY21jaWFfZGV2aWNlKTsKKwlhcmNvbV9wY21jaWFfZGV2ID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgdmlwZXJfcGNtY2lhX2lkX3RhYmxlW10gPSB7CisJeyAubmFtZSA9ICJ2aXBlci1wY21jaWEiLCB9LAorCXsgLm5hbWUgPSAiemV1cy1wY21jaWEiLCAgfSwKKwl7IH0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB2aXBlcl9wY21jaWFfZHJpdmVyID0geworCS5wcm9iZQkJPSB2aXBlcl9wY21jaWFfcHJvYmUsCisJLnJlbW92ZQkJPSB2aXBlcl9wY21jaWFfcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJhcmNvbS1wY21jaWEiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5pZF90YWJsZQk9IHZpcGVyX3BjbWNpYV9pZF90YWJsZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHZpcGVyX3BjbWNpYV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdmlwZXJfcGNtY2lhX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB2aXBlcl9wY21jaWFfZXhpdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdmlwZXJfcGNtY2lhX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KHZpcGVyX3BjbWNpYV9pbml0KTsKIG1vZHVsZV9leGl0KHZpcGVyX3BjbWNpYV9leGl0KTsKIAorTU9EVUxFX0RFVklDRV9UQUJMRShwbGF0Zm9ybSwgdmlwZXJfcGNtY2lhX2lkX3RhYmxlKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3JzcmNfbWdyLmMgYi9kcml2ZXJzL3BjbWNpYS9yc3JjX21nci5jCmluZGV4IGRlMGU3NzAuLjUyZGIxNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3JzcmNfbWdyLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcnNyY19tZ3IuYwpAQCAtMTI2LDE2ICsxMjYsMTYgQEAKIAlyZXMtPnN0YXJ0ID0gc3RhcnQ7CiAKICNpZmRlZiBDT05GSUdfWDg2Ci0gICAgICAgIGlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykgewotICAgICAgICAgICAgICAgIGlmIChzdGFydCAmIDB4MzAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IChzdGFydCArIDB4M2ZmKSAmIH4weDNmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcy0+c3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKKwkJaWYgKHN0YXJ0ICYgMHgzMDApIHsKKwkJCXN0YXJ0ID0gKHN0YXJ0ICsgMHgzZmYpICYgfjB4M2ZmOworCQkJcmVzLT5zdGFydCA9IHN0YXJ0OworCQl9CisJfQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfTTY4SwotICAgICAgICBpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKIAkJaWYgKChyZXMtPnN0YXJ0ICsgc2l6ZSAtIDEpID49IDEwMjQpCiAJCQlyZXMtPnN0YXJ0ID0gcmVzLT5lbmQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcnNyY19ub25zdGF0aWMuYyBiL2RyaXZlcnMvcGNtY2lhL3JzcmNfbm9uc3RhdGljLmMKaW5kZXggNzAzOWYzYy4uOWIwZGM0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcnNyY19ub25zdGF0aWMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9yc3JjX25vbnN0YXRpYy5jCkBAIC0yNCw5ICsyNCw5IEBACiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CkBAIC0xNDQsNDMgKzE0NCw0NCBAQAogCiBzdGF0aWMgaW50IHN1Yl9pbnRlcnZhbChzdHJ1Y3QgcmVzb3VyY2VfbWFwICptYXAsIHVfbG9uZyBiYXNlLCB1X2xvbmcgbnVtKQogewotICAgIHN0cnVjdCByZXNvdXJjZV9tYXAgKnAsICpxOworCXN0cnVjdCByZXNvdXJjZV9tYXAgKnAsICpxOwogCi0gICAgZm9yIChwID0gbWFwOyA7IHAgPSBxKSB7Ci0JcSA9IHAtPm5leHQ7Ci0JaWYgKHEgPT0gbWFwKQotCSAgICBicmVhazsKLQlpZiAoKHEtPmJhc2UrcS0+bnVtID4gYmFzZSkgJiYgKGJhc2UrbnVtID4gcS0+YmFzZSkpIHsKLQkgICAgaWYgKHEtPmJhc2UgPj0gYmFzZSkgewotCQlpZiAocS0+YmFzZStxLT5udW0gPD0gYmFzZStudW0pIHsKLQkJICAgIC8qIERlbGV0ZSB3aG9sZSBibG9jayAqLwotCQkgICAgcC0+bmV4dCA9IHEtPm5leHQ7Ci0JCSAgICBrZnJlZShxKTsKLQkJICAgIC8qIGRvbid0IGFkdmFuY2UgdGhlIHBvaW50ZXIgeWV0ICovCi0JCSAgICBxID0gcDsKLQkJfSBlbHNlIHsKLQkJICAgIC8qIEN1dCBvZmYgYml0IGZyb20gdGhlIGZyb250ICovCi0JCSAgICBxLT5udW0gPSBxLT5iYXNlICsgcS0+bnVtIC0gYmFzZSAtIG51bTsKLQkJICAgIHEtPmJhc2UgPSBiYXNlICsgbnVtOworCWZvciAocCA9IG1hcDsgOyBwID0gcSkgeworCQlxID0gcC0+bmV4dDsKKwkJaWYgKHEgPT0gbWFwKQorCQkJYnJlYWs7CisJCWlmICgocS0+YmFzZStxLT5udW0gPiBiYXNlKSAmJiAoYmFzZStudW0gPiBxLT5iYXNlKSkgeworCQkJaWYgKHEtPmJhc2UgPj0gYmFzZSkgeworCQkJCWlmIChxLT5iYXNlK3EtPm51bSA8PSBiYXNlK251bSkgeworCQkJCQkvKiBEZWxldGUgd2hvbGUgYmxvY2sgKi8KKwkJCQkJcC0+bmV4dCA9IHEtPm5leHQ7CisJCQkJCWtmcmVlKHEpOworCQkJCQkvKiBkb24ndCBhZHZhbmNlIHRoZSBwb2ludGVyIHlldCAqLworCQkJCQlxID0gcDsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBDdXQgb2ZmIGJpdCBmcm9tIHRoZSBmcm9udCAqLworCQkJCQlxLT5udW0gPSBxLT5iYXNlICsgcS0+bnVtIC0gYmFzZSAtIG51bTsKKwkJCQkJcS0+YmFzZSA9IGJhc2UgKyBudW07CisJCQkJfQorCQkJfSBlbHNlIGlmIChxLT5iYXNlK3EtPm51bSA8PSBiYXNlK251bSkgeworCQkJCS8qIEN1dCBvZmYgYml0IGZyb20gdGhlIGVuZCAqLworCQkJCXEtPm51bSA9IGJhc2UgLSBxLT5iYXNlOworCQkJfSBlbHNlIHsKKwkJCQkvKiBTcGxpdCB0aGUgYmxvY2sgaW50byB0d28gcGllY2VzICovCisJCQkJcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCByZXNvdXJjZV9tYXApLAorCQkJCQlHRlBfS0VSTkVMKTsKKwkJCQlpZiAoIXApIHsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAib3V0IG9mIG1lbW9yeSB0byB1cGRhdGUgcmVzb3VyY2VzXG4iKTsKKwkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJfQorCQkJCXAtPmJhc2UgPSBiYXNlK251bTsKKwkJCQlwLT5udW0gPSBxLT5iYXNlK3EtPm51bSAtIHAtPmJhc2U7CisJCQkJcS0+bnVtID0gYmFzZSAtIHEtPmJhc2U7CisJCQkJcC0+bmV4dCA9IHEtPm5leHQgOyBxLT5uZXh0ID0gcDsKKwkJCX0KIAkJfQotCSAgICB9IGVsc2UgaWYgKHEtPmJhc2UrcS0+bnVtIDw9IGJhc2UrbnVtKSB7Ci0JCS8qIEN1dCBvZmYgYml0IGZyb20gdGhlIGVuZCAqLwotCQlxLT5udW0gPSBiYXNlIC0gcS0+YmFzZTsKLQkgICAgfSBlbHNlIHsKLQkJLyogU3BsaXQgdGhlIGJsb2NrIGludG8gdHdvIHBpZWNlcyAqLwotCQlwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJlc291cmNlX21hcCksIEdGUF9LRVJORUwpOwotCQlpZiAoIXApIHsKLQkJICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIm91dCBvZiBtZW1vcnkgdG8gdXBkYXRlIHJlc291cmNlc1xuIik7Ci0JCSAgICByZXR1cm4gLUVOT01FTTsKLQkJfQotCQlwLT5iYXNlID0gYmFzZStudW07Ci0JCXAtPm51bSA9IHEtPmJhc2UrcS0+bnVtIC0gcC0+YmFzZTsKLQkJcS0+bnVtID0gYmFzZSAtIHEtPmJhc2U7Ci0JCXAtPm5leHQgPSBxLT5uZXh0IDsgcS0+bmV4dCA9IHA7Ci0JICAgIH0KIAl9Ci0gICAgfQotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTE5NCw2OSArMTk1LDcyIEBACiBzdGF0aWMgdm9pZCBkb19pb19wcm9iZShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgdW5zaWduZWQgaW50IGJhc2UsCiAJCQl1bnNpZ25lZCBpbnQgbnVtKQogewotICAgIHN0cnVjdCByZXNvdXJjZSAqcmVzOwotICAgIHN0cnVjdCBzb2NrZXRfZGF0YSAqc19kYXRhID0gcy0+cmVzb3VyY2VfZGF0YTsKLSAgICB1bnNpZ25lZCBpbnQgaSwgaiwgYmFkOwotICAgIGludCBhbnk7Ci0gICAgdV9jaGFyICpiLCBob2xlLCBtb3N0OworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBzb2NrZXRfZGF0YSAqc19kYXRhID0gcy0+cmVzb3VyY2VfZGF0YTsKKwl1bnNpZ25lZCBpbnQgaSwgaiwgYmFkOworCWludCBhbnk7CisJdV9jaGFyICpiLCBob2xlLCBtb3N0OwogCi0gICAgZGV2X3ByaW50ayhLRVJOX0lORk8sICZzLT5kZXYsICJjczogSU8gcG9ydCBwcm9iZSAlI3gtJSN4OiIsCi0JICAgICAgIGJhc2UsIGJhc2UrbnVtLTEpOworCWRldl9wcmludGsoS0VSTl9JTkZPLCAmcy0+ZGV2LCAiY3M6IElPIHBvcnQgcHJvYmUgJSN4LSUjeDoiLAorCQliYXNlLCBiYXNlK251bS0xKTsKIAotICAgIC8qIEZpcnN0LCB3aGF0IGRvZXMgYSBmbG9hdGluZyBwb3J0IGxvb2sgbGlrZT8gKi8KLSAgICBiID0ga3phbGxvYygyNTYsIEdGUF9LRVJORUwpOwotICAgIGlmICghYikgewotCSAgICBwcmludGsoIlxuIik7Ci0JICAgIGRldl9wcmludGsoS0VSTl9FUlIsICZzLT5kZXYsCi0JCSAgICJkb19pb19wcm9iZTogdW5hYmxlIHRvIGttYWxsb2MgMjU2IGJ5dGVzIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvciAoaSA9IGJhc2UsIG1vc3QgPSAwOyBpIDwgYmFzZStudW07IGkgKz0gOCkgewotCXJlcyA9IGNsYWltX3JlZ2lvbihOVUxMLCBpLCA4LCBJT1JFU09VUkNFX0lPLCAiUENNQ0lBIElPIHByb2JlIik7Ci0JaWYgKCFyZXMpCi0JICAgIGNvbnRpbnVlOwotCWhvbGUgPSBpbmIoaSk7Ci0JZm9yIChqID0gMTsgaiA8IDg7IGorKykKLQkgICAgaWYgKGluYihpK2opICE9IGhvbGUpIGJyZWFrOwotCWZyZWVfcmVnaW9uKHJlcyk7Ci0JaWYgKChqID09IDgpICYmICgrK2JbaG9sZV0gPiBiW21vc3RdKSkKLQkgICAgbW9zdCA9IGhvbGU7Ci0JaWYgKGJbbW9zdF0gPT0gMTI3KSBicmVhazsKLSAgICB9Ci0gICAga2ZyZWUoYik7Ci0KLSAgICBiYWQgPSBhbnkgPSAwOwotICAgIGZvciAoaSA9IGJhc2U7IGkgPCBiYXNlK251bTsgaSArPSA4KSB7Ci0JcmVzID0gY2xhaW1fcmVnaW9uKE5VTEwsIGksIDgsIElPUkVTT1VSQ0VfSU8sICJQQ01DSUEgSU8gcHJvYmUiKTsKLQlpZiAoIXJlcykKLQkgICAgY29udGludWU7Ci0JZm9yIChqID0gMDsgaiA8IDg7IGorKykKLQkgICAgaWYgKGluYihpK2opICE9IG1vc3QpIGJyZWFrOwotCWZyZWVfcmVnaW9uKHJlcyk7Ci0JaWYgKGogPCA4KSB7Ci0JICAgIGlmICghYW55KQotCQlwcmludGsoIiBleGNsdWRpbmciKTsKLQkgICAgaWYgKCFiYWQpCi0JCWJhZCA9IGFueSA9IGk7Ci0JfSBlbHNlIHsKLQkgICAgaWYgKGJhZCkgewotCQlzdWJfaW50ZXJ2YWwoJnNfZGF0YS0+aW9fZGIsIGJhZCwgaS1iYWQpOwotCQlwcmludGsoIiAlI3gtJSN4IiwgYmFkLCBpLTEpOwotCQliYWQgPSAwOwotCSAgICB9CisJLyogRmlyc3QsIHdoYXQgZG9lcyBhIGZsb2F0aW5nIHBvcnQgbG9vayBsaWtlPyAqLworCWIgPSBremFsbG9jKDI1NiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFiKSB7CisJCXByaW50aygiXG4iKTsKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnMtPmRldiwKKwkJCSJkb19pb19wcm9iZTogdW5hYmxlIHRvIGttYWxsb2MgMjU2IGJ5dGVzIik7CisJCXJldHVybjsKIAl9Ci0gICAgfQotICAgIGlmIChiYWQpIHsKLQlpZiAoKG51bSA+IDE2KSAmJiAoYmFkID09IGJhc2UpICYmIChpID09IGJhc2UrbnVtKSkgewotCSAgICBwcmludGsoIiBub3RoaW5nOiBwcm9iZSBmYWlsZWQuXG4iKTsKLQkgICAgcmV0dXJuOwotCX0gZWxzZSB7Ci0JICAgIHN1Yl9pbnRlcnZhbCgmc19kYXRhLT5pb19kYiwgYmFkLCBpLWJhZCk7Ci0JICAgIHByaW50aygiICUjeC0lI3giLCBiYWQsIGktMSk7CisJZm9yIChpID0gYmFzZSwgbW9zdCA9IDA7IGkgPCBiYXNlK251bTsgaSArPSA4KSB7CisJCXJlcyA9IGNsYWltX3JlZ2lvbihOVUxMLCBpLCA4LCBJT1JFU09VUkNFX0lPLCAiUENNQ0lBIGlvcHJvYmUiKTsKKwkJaWYgKCFyZXMpCisJCQljb250aW51ZTsKKwkJaG9sZSA9IGluYihpKTsKKwkJZm9yIChqID0gMTsgaiA8IDg7IGorKykKKwkJCWlmIChpbmIoaStqKSAhPSBob2xlKQorCQkJCWJyZWFrOworCQlmcmVlX3JlZ2lvbihyZXMpOworCQlpZiAoKGogPT0gOCkgJiYgKCsrYltob2xlXSA+IGJbbW9zdF0pKQorCQkJbW9zdCA9IGhvbGU7CisJCWlmIChiW21vc3RdID09IDEyNykKKwkJCWJyZWFrOwogCX0KLSAgICB9CisJa2ZyZWUoYik7CiAKLSAgICBwcmludGsoYW55ID8gIlxuIiA6ICIgY2xlYW4uXG4iKTsKKwliYWQgPSBhbnkgPSAwOworCWZvciAoaSA9IGJhc2U7IGkgPCBiYXNlK251bTsgaSArPSA4KSB7CisJCXJlcyA9IGNsYWltX3JlZ2lvbihOVUxMLCBpLCA4LCBJT1JFU09VUkNFX0lPLCAiUENNQ0lBIGlvcHJvYmUiKTsKKwkJaWYgKCFyZXMpCisJCQljb250aW51ZTsKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCWlmIChpbmIoaStqKSAhPSBtb3N0KQorCQkJCWJyZWFrOworCQlmcmVlX3JlZ2lvbihyZXMpOworCQlpZiAoaiA8IDgpIHsKKwkJCWlmICghYW55KQorCQkJCXByaW50aygiIGV4Y2x1ZGluZyIpOworCQkJaWYgKCFiYWQpCisJCQkJYmFkID0gYW55ID0gaTsKKwkJfSBlbHNlIHsKKwkJCWlmIChiYWQpIHsKKwkJCQlzdWJfaW50ZXJ2YWwoJnNfZGF0YS0+aW9fZGIsIGJhZCwgaS1iYWQpOworCQkJCXByaW50aygiICUjeC0lI3giLCBiYWQsIGktMSk7CisJCQkJYmFkID0gMDsKKwkJCX0KKwkJfQorCX0KKwlpZiAoYmFkKSB7CisJCWlmICgobnVtID4gMTYpICYmIChiYWQgPT0gYmFzZSkgJiYgKGkgPT0gYmFzZStudW0pKSB7CisJCQlwcmludGsoIiBub3RoaW5nOiBwcm9iZSBmYWlsZWQuXG4iKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCXN1Yl9pbnRlcnZhbCgmc19kYXRhLT5pb19kYiwgYmFkLCBpLWJhZCk7CisJCQlwcmludGsoIiAlI3gtJSN4IiwgYmFkLCBpLTEpOworCQl9CisJfQorCisJcHJpbnRrKGFueSA/ICJcbiIgOiAiIGNsZWFuLlxuIik7CiB9CiAjZW5kaWYKIApAQCAtMzI3LDggKzMzMSw5IEBACiAJdW5zaWduZWQgaW50IGluZm8xLCBpbmZvMjsKIAlpbnQgcmV0ID0gMDsKIAotCXJlczEgPSBjbGFpbV9yZWdpb24ocywgYmFzZSwgc2l6ZS8yLCBJT1JFU09VUkNFX01FTSwgImNzIG1lbW9yeSBwcm9iZSIpOwotCXJlczIgPSBjbGFpbV9yZWdpb24ocywgYmFzZSArIHNpemUvMiwgc2l6ZS8yLCBJT1JFU09VUkNFX01FTSwgImNzIG1lbW9yeSBwcm9iZSIpOworCXJlczEgPSBjbGFpbV9yZWdpb24ocywgYmFzZSwgc2l6ZS8yLCBJT1JFU09VUkNFX01FTSwgIlBDTUNJQSBtZW1wcm9iZSIpOworCXJlczIgPSBjbGFpbV9yZWdpb24ocywgYmFzZSArIHNpemUvMiwgc2l6ZS8yLCBJT1JFU09VUkNFX01FTSwKKwkJCSJQQ01DSUEgbWVtcHJvYmUiKTsKIAogCWlmIChyZXMxICYmIHJlczIpIHsKIAkJcmV0ID0gcmVhZGFibGUocywgcmVzMSwgJmluZm8xKTsKQEAgLTM0Nyw4ICszNTIsOSBAQAogCXN0cnVjdCByZXNvdXJjZSAqcmVzMSwgKnJlczI7CiAJaW50IGEgPSAtMSwgYiA9IC0xOwogCi0JcmVzMSA9IGNsYWltX3JlZ2lvbihzLCBiYXNlLCBzaXplLzIsIElPUkVTT1VSQ0VfTUVNLCAiY3MgbWVtb3J5IHByb2JlIik7Ci0JcmVzMiA9IGNsYWltX3JlZ2lvbihzLCBiYXNlICsgc2l6ZS8yLCBzaXplLzIsIElPUkVTT1VSQ0VfTUVNLCAiY3MgbWVtb3J5IHByb2JlIik7CisJcmVzMSA9IGNsYWltX3JlZ2lvbihzLCBiYXNlLCBzaXplLzIsIElPUkVTT1VSQ0VfTUVNLCAiUENNQ0lBIG1lbXByb2JlIik7CisJcmVzMiA9IGNsYWltX3JlZ2lvbihzLCBiYXNlICsgc2l6ZS8yLCBzaXplLzIsIElPUkVTT1VSQ0VfTUVNLAorCQkJIlBDTUNJQSBtZW1wcm9iZSIpOwogCiAJaWYgKHJlczEgJiYgcmVzMikgewogCQlhID0gY2hlY2tzdW0ocywgcmVzMSk7CkBAIC0zNzEsNDIgKzM3Nyw0MyBAQAogCiBzdGF0aWMgaW50IGRvX21lbV9wcm9iZSh1X2xvbmcgYmFzZSwgdV9sb25nIG51bSwgc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpCiB7Ci0gICAgc3RydWN0IHNvY2tldF9kYXRhICpzX2RhdGEgPSBzLT5yZXNvdXJjZV9kYXRhOwotICAgIHVfbG9uZyBpLCBqLCBiYWQsIGZhaWwsIHN0ZXA7CisJc3RydWN0IHNvY2tldF9kYXRhICpzX2RhdGEgPSBzLT5yZXNvdXJjZV9kYXRhOworCXVfbG9uZyBpLCBqLCBiYWQsIGZhaWwsIHN0ZXA7CiAKLSAgICBkZXZfcHJpbnRrKEtFUk5fSU5GTywgJnMtPmRldiwgImNzOiBtZW1vcnkgcHJvYmUgMHglMDZseC0weCUwNmx4OiIsCi0JICAgICAgIGJhc2UsIGJhc2UrbnVtLTEpOwotICAgIGJhZCA9IGZhaWwgPSAwOwotICAgIHN0ZXAgPSAobnVtIDwgMHgyMDAwMCkgPyAweDIwMDAgOiAoKG51bT4+NCkgJiB+MHgxZmZmKTsKLSAgICAvKiBkb24ndCBhbGxvdyB0b28gbGFyZ2Ugc3RlcHMgKi8KLSAgICBpZiAoc3RlcCA+IDB4ODAwMDAwKQotCXN0ZXAgPSAweDgwMDAwMDsKLSAgICAvKiBjaXNfcmVhZGFibGUgd2FudHMgdG8gbWFwIDJ4IG1hcF9zaXplICovCi0gICAgaWYgKHN0ZXAgPCAyICogcy0+bWFwX3NpemUpCi0Jc3RlcCA9IDIgKiBzLT5tYXBfc2l6ZTsKLSAgICBmb3IgKGkgPSBqID0gYmFzZTsgaSA8IGJhc2UrbnVtOyBpID0gaiArIHN0ZXApIHsKLQlpZiAoIWZhaWwpIHsKLQkgICAgZm9yIChqID0gaTsgaiA8IGJhc2UrbnVtOyBqICs9IHN0ZXApIHsKLQkJaWYgKGNpc19yZWFkYWJsZShzLCBqLCBzdGVwKSkKLQkJICAgIGJyZWFrOwotCSAgICB9Ci0JICAgIGZhaWwgPSAoKGkgPT0gYmFzZSkgJiYgKGogPT0gYmFzZStudW0pKTsKKwlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJnMtPmRldiwgImNzOiBtZW1vcnkgcHJvYmUgMHglMDZseC0weCUwNmx4OiIsCisJCWJhc2UsIGJhc2UrbnVtLTEpOworCWJhZCA9IGZhaWwgPSAwOworCXN0ZXAgPSAobnVtIDwgMHgyMDAwMCkgPyAweDIwMDAgOiAoKG51bT4+NCkgJiB+MHgxZmZmKTsKKwkvKiBkb24ndCBhbGxvdyB0b28gbGFyZ2Ugc3RlcHMgKi8KKwlpZiAoc3RlcCA+IDB4ODAwMDAwKQorCQlzdGVwID0gMHg4MDAwMDA7CisJLyogY2lzX3JlYWRhYmxlIHdhbnRzIHRvIG1hcCAyeCBtYXBfc2l6ZSAqLworCWlmIChzdGVwIDwgMiAqIHMtPm1hcF9zaXplKQorCQlzdGVwID0gMiAqIHMtPm1hcF9zaXplOworCWZvciAoaSA9IGogPSBiYXNlOyBpIDwgYmFzZStudW07IGkgPSBqICsgc3RlcCkgeworCQlpZiAoIWZhaWwpIHsKKwkJCWZvciAoaiA9IGk7IGogPCBiYXNlK251bTsgaiArPSBzdGVwKSB7CisJCQkJaWYgKGNpc19yZWFkYWJsZShzLCBqLCBzdGVwKSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlmYWlsID0gKChpID09IGJhc2UpICYmIChqID09IGJhc2UrbnVtKSk7CisJCX0KKwkJaWYgKGZhaWwpIHsKKwkJCWZvciAoaiA9IGk7IGogPCBiYXNlK251bTsgaiArPSAyKnN0ZXApCisJCQkJaWYgKGNoZWNrc3VtX21hdGNoKHMsIGosIHN0ZXApICYmCisJCQkJCWNoZWNrc3VtX21hdGNoKHMsIGogKyBzdGVwLCBzdGVwKSkKKwkJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGkgIT0gaikgeworCQkJaWYgKCFiYWQpCisJCQkJcHJpbnRrKCIgZXhjbHVkaW5nIik7CisJCQlwcmludGsoIiAlIzA1bHgtJSMwNWx4IiwgaSwgai0xKTsKKwkJCXN1Yl9pbnRlcnZhbCgmc19kYXRhLT5tZW1fZGIsIGksIGotaSk7CisJCQliYWQgKz0gai1pOworCQl9CiAJfQotCWlmIChmYWlsKSB7Ci0JICAgIGZvciAoaiA9IGk7IGogPCBiYXNlK251bTsgaiArPSAyKnN0ZXApCi0JCWlmIChjaGVja3N1bV9tYXRjaChzLCBqLCBzdGVwKSAmJgotCQkgICAgY2hlY2tzdW1fbWF0Y2gocywgaiArIHN0ZXAsIHN0ZXApKQotCQkgICAgYnJlYWs7Ci0JfQotCWlmIChpICE9IGopIHsKLQkgICAgaWYgKCFiYWQpIHByaW50aygiIGV4Y2x1ZGluZyIpOwotCSAgICBwcmludGsoIiAlIzA1bHgtJSMwNWx4IiwgaSwgai0xKTsKLQkgICAgc3ViX2ludGVydmFsKCZzX2RhdGEtPm1lbV9kYiwgaSwgai1pKTsKLQkgICAgYmFkICs9IGotaTsKLQl9Ci0gICAgfQotICAgIHByaW50ayhiYWQgPyAiXG4iIDogIiBjbGVhbi5cbiIpOwotICAgIHJldHVybiAobnVtIC0gYmFkKTsKKwlwcmludGsoYmFkID8gIlxuIiA6ICIgY2xlYW4uXG4iKTsKKwlyZXR1cm4gbnVtIC0gYmFkOwogfQogCiAjaWZkZWYgQ09ORklHX1BDTUNJQV9QUk9CRQpAQCAtNjU2LDcgKzY2Myw3IEBACiAJcmV0dXJuIHJlczsKIH0KIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqIG5vbnN0YXRpY19maW5kX21lbV9yZWdpb24odV9sb25nIGJhc2UsIHVfbG9uZyBudW0sCitzdGF0aWMgc3RydWN0IHJlc291cmNlICpub25zdGF0aWNfZmluZF9tZW1fcmVnaW9uKHVfbG9uZyBiYXNlLCB1X2xvbmcgbnVtLAogCQl1X2xvbmcgYWxpZ24sIGludCBsb3csIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKQogewogCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gbWFrZV9yZXNvdXJjZSgwLCBudW0sIElPUkVTT1VSQ0VfTUVNLCBkZXZfbmFtZSgmcy0+ZGV2KSk7CkBAIC03OTQsNyArODAxLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAjZW5kaWYKIAotCWZvciAoaT0wOyBpIDwgUENJX0JVU19OVU1fUkVTT1VSQ0VTOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgUENJX0JVU19OVU1fUkVTT1VSQ0VTOyBpKyspIHsKIAkJcmVzID0gcy0+Y2JfZGV2LT5idXMtPnJlc291cmNlW2ldOwogCQlpZiAoIXJlcykKIAkJCWNvbnRpbnVlOwpAQCAtOTA4LDE0ICs5MTUsMTQgQEAKIAlmb3IgKHAgPSBkYXRhLT5pb19kYi5uZXh0OyBwICE9ICZkYXRhLT5pb19kYjsgcCA9IHAtPm5leHQpIHsKIAkJaWYgKHJldCA+IChQQUdFX1NJWkUgLSAxMCkpCiAJCQljb250aW51ZTsKLQkJcmV0ICs9IHNucHJpbnRmICgmYnVmW3JldF0sIChQQUdFX1NJWkUgLSByZXQgLSAxKSwKLQkJCQkgIjB4JTA4bHggLSAweCUwOGx4XG4iLAotCQkJCSAoKHVuc2lnbmVkIGxvbmcpIHAtPmJhc2UpLAotCQkJCSAoKHVuc2lnbmVkIGxvbmcpIHAtPmJhc2UgKyBwLT5udW0gLSAxKSk7CisJCXJldCArPSBzbnByaW50ZigmYnVmW3JldF0sIChQQUdFX1NJWkUgLSByZXQgLSAxKSwKKwkJCQkiMHglMDhseCAtIDB4JTA4bHhcbiIsCisJCQkJKCh1bnNpZ25lZCBsb25nKSBwLT5iYXNlKSwKKwkJCQkoKHVuc2lnbmVkIGxvbmcpIHAtPmJhc2UgKyBwLT5udW0gLSAxKSk7CiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZyc3JjX211dGV4KTsKLQlyZXR1cm4gKHJldCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHNzaXplX3Qgc3RvcmVfaW9fZGIoc3RydWN0IGRldmljZSAqZGV2LApAQCAtOTI3LDEyICs5MzQsMTMgQEAKIAl1bnNpZ25lZCBpbnQgYWRkID0gQUREX01BTkFHRURfUkVTT1VSQ0U7CiAJc3NpemVfdCByZXQgPSAwOwogCi0JcmV0ID0gc3NjYW5mIChidWYsICIrIDB4JWx4IC0gMHglbHgiLCAmc3RhcnRfYWRkciwgJmVuZF9hZGRyKTsKKwlyZXQgPSBzc2NhbmYoYnVmLCAiKyAweCVseCAtIDB4JWx4IiwgJnN0YXJ0X2FkZHIsICZlbmRfYWRkcik7CiAJaWYgKHJldCAhPSAyKSB7Ci0JCXJldCA9IHNzY2FuZiAoYnVmLCAiLSAweCVseCAtIDB4JWx4IiwgJnN0YXJ0X2FkZHIsICZlbmRfYWRkcik7CisJCXJldCA9IHNzY2FuZihidWYsICItIDB4JWx4IC0gMHglbHgiLCAmc3RhcnRfYWRkciwgJmVuZF9hZGRyKTsKIAkJYWRkID0gUkVNT1ZFX01BTkFHRURfUkVTT1VSQ0U7CiAJCWlmIChyZXQgIT0gMikgewotCQkJcmV0ID0gc3NjYW5mIChidWYsICIweCVseCAtIDB4JWx4IiwgJnN0YXJ0X2FkZHIsICZlbmRfYWRkcik7CisJCQlyZXQgPSBzc2NhbmYoYnVmLCAiMHglbHggLSAweCVseCIsICZzdGFydF9hZGRyLAorCQkJCSZlbmRfYWRkcik7CiAJCQlhZGQgPSBBRERfTUFOQUdFRF9SRVNPVVJDRTsKIAkJCWlmIChyZXQgIT0gMikKIAkJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTk2MywxNCArOTcxLDE0IEBACiAJZm9yIChwID0gZGF0YS0+bWVtX2RiLm5leHQ7IHAgIT0gJmRhdGEtPm1lbV9kYjsgcCA9IHAtPm5leHQpIHsKIAkJaWYgKHJldCA+IChQQUdFX1NJWkUgLSAxMCkpCiAJCQljb250aW51ZTsKLQkJcmV0ICs9IHNucHJpbnRmICgmYnVmW3JldF0sIChQQUdFX1NJWkUgLSByZXQgLSAxKSwKLQkJCQkgIjB4JTA4bHggLSAweCUwOGx4XG4iLAotCQkJCSAoKHVuc2lnbmVkIGxvbmcpIHAtPmJhc2UpLAotCQkJCSAoKHVuc2lnbmVkIGxvbmcpIHAtPmJhc2UgKyBwLT5udW0gLSAxKSk7CisJCXJldCArPSBzbnByaW50ZigmYnVmW3JldF0sIChQQUdFX1NJWkUgLSByZXQgLSAxKSwKKwkJCQkiMHglMDhseCAtIDB4JTA4bHhcbiIsCisJCQkJKCh1bnNpZ25lZCBsb25nKSBwLT5iYXNlKSwKKwkJCQkoKHVuc2lnbmVkIGxvbmcpIHAtPmJhc2UgKyBwLT5udW0gLSAxKSk7CiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZyc3JjX211dGV4KTsKLQlyZXR1cm4gKHJldCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHNzaXplX3Qgc3RvcmVfbWVtX2RiKHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTk4MiwxMiArOTkwLDEzIEBACiAJdW5zaWduZWQgaW50IGFkZCA9IEFERF9NQU5BR0VEX1JFU09VUkNFOwogCXNzaXplX3QgcmV0ID0gMDsKIAotCXJldCA9IHNzY2FuZiAoYnVmLCAiKyAweCVseCAtIDB4JWx4IiwgJnN0YXJ0X2FkZHIsICZlbmRfYWRkcik7CisJcmV0ID0gc3NjYW5mKGJ1ZiwgIisgMHglbHggLSAweCVseCIsICZzdGFydF9hZGRyLCAmZW5kX2FkZHIpOwogCWlmIChyZXQgIT0gMikgewotCQlyZXQgPSBzc2NhbmYgKGJ1ZiwgIi0gMHglbHggLSAweCVseCIsICZzdGFydF9hZGRyLCAmZW5kX2FkZHIpOworCQlyZXQgPSBzc2NhbmYoYnVmLCAiLSAweCVseCAtIDB4JWx4IiwgJnN0YXJ0X2FkZHIsICZlbmRfYWRkcik7CiAJCWFkZCA9IFJFTU9WRV9NQU5BR0VEX1JFU09VUkNFOwogCQlpZiAocmV0ICE9IDIpIHsKLQkJCXJldCA9IHNzY2FuZiAoYnVmLCAiMHglbHggLSAweCVseCIsICZzdGFydF9hZGRyLCAmZW5kX2FkZHIpOworCQkJcmV0ID0gc3NjYW5mKGJ1ZiwgIjB4JWx4IC0gMHglbHgiLCAmc3RhcnRfYWRkciwKKwkJCQkmZW5kX2FkZHIpOwogCQkJYWRkID0gQUREX01BTkFHRURfUkVTT1VSQ0U7CiAJCQlpZiAocmV0ICE9IDIpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9zb2NrZXRfc3lzZnMuYyBiL2RyaXZlcnMvcGNtY2lhL3NvY2tldF9zeXNmcy5jCmluZGV4IDc4ZDVhYWIuLjdhNDU2MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3NvY2tldF9zeXNmcy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3NvY2tldF9zeXNmcy5jCkBAIC0xNjQsNyArMTY0LDcgQEAKIAlpZiAoIWNvdW50KQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldCA9IHNzY2FuZiAoYnVmLCAiMHgleFxuIiwgJm1hc2spOworCXJldCA9IHNzY2FuZihidWYsICIweCV4XG4iLCAmbWFzayk7CiAKIAlpZiAocmV0ID09IDEpIHsKIAkJcy0+aXJxX21hc2sgJj0gbWFzazsKQEAgLTI3OCw3ICsyNzgsNyBAQAogIGZyZWVfdHVwbGU6CiAJa2ZyZWUodHVwbGVidWZmZXIpOwogCi0JcmV0dXJuIChyZXQpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHBjY2FyZF9zaG93X2NpcyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKQEAgLTMwOCw3ICszMDgsNyBAQAogCQljb3VudCA9IHBjY2FyZF9leHRyYWN0X2NpcyhzLCBidWYsIG9mZiwgY291bnQpOwogCX0KIAotCXJldHVybiAoY291bnQpOworCXJldHVybiBjb3VudDsKIH0KIAogc3RhdGljIHNzaXplX3QgcGNjYXJkX3N0b3JlX2NpcyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3llbnRhX3NvY2tldC5jIGIvZHJpdmVycy9wY21jaWEveWVudGFfc29ja2V0LmMKaW5kZXggOGJlNGNjNC4uZmUwMmNmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEveWVudGFfc29ja2V0LmMKKysrIGIvZHJpdmVycy9wY21jaWEveWVudGFfc29ja2V0LmMKQEAgLTYsNyArNiw3IEBACiAgKiBDaGFuZ2Vsb2c6CiAgKiBBdWcgMjAwMjogTWFuZnJlZCBTcHJhdWwgPG1hbmZyZWRAY29sb3JmdWxsaWZlLmNvbT4KICAqIAlEeW5hbWljYWxseSBhZGp1c3QgdGhlIHNpemUgb2YgdGhlIGJyaWRnZSByZXNvdXJjZQotICogCQorICoKICAqIE1heSAyMDAzOiBEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAYnJvZG8uZGU+CiAgKiAJTWVyZ2UgcGNpX3NvY2tldC5jIGFuZCB5ZW50YS5jIGludG8gb25lIGZpbGUKICAqLwpAQCAtMTYsMTMgKzE2LDEyIEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KLQogI2luY2x1ZGUgInllbnRhX3NvY2tldC5oIgogI2luY2x1ZGUgImk4MjM2NS5oIgogCkBAIC01NSw3ICs1NCw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgb3ZlcnJpZGVfYmlvczsKIG1vZHVsZV9wYXJhbShvdmVycmlkZV9iaW9zLCB1aW50LCAwMDAwKTsKLU1PRFVMRV9QQVJNX0RFU0MgKG92ZXJyaWRlX2Jpb3MsICJ5ZW50YSBpZ25vcmUgYmlvcyByZXNvdXJjZSBhbGxvY2F0aW9uIik7CitNT0RVTEVfUEFSTV9ERVNDKG92ZXJyaWRlX2Jpb3MsICJ5ZW50YSBpZ25vcmUgYmlvcyByZXNvdXJjZSBhbGxvY2F0aW9uIik7CiAKIC8qCiAgKiBHZW5lcmF0ZSBlYXN5LXRvLXVzZSB3YXlzIG9mIHJlYWRpbmcgYSBjYXJkYnVzIHNvY2tldHMKQEAgLTIzNywyNCArMjM2LDQyIEBACiAJCS8qIGk4MjM2NVNMLURGIHN0eWxlICovCiAJCWlmIChzb2NrZXQtPmZsYWdzICYgWUVOVEFfMTZCSVRfUE9XRVJfREYpIHsKIAkJCXN3aXRjaCAoc3RhdGUtPlZjYykgewotCQkJY2FzZSAzMzogcmVnIHw9IEkzNjVfVkNDXzNWOyBicmVhazsKLQkJCWNhc2UgNTA6IHJlZyB8PSBJMzY1X1ZDQ181VjsgYnJlYWs7Ci0JCQlkZWZhdWx0OiByZWcgPSAwOyBicmVhazsKKwkJCWNhc2UgMzM6CisJCQkJcmVnIHw9IEkzNjVfVkNDXzNWOworCQkJCWJyZWFrOworCQkJY2FzZSA1MDoKKwkJCQlyZWcgfD0gSTM2NV9WQ0NfNVY7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJlZyA9IDA7CisJCQkJYnJlYWs7CiAJCQl9CiAJCQlzd2l0Y2ggKHN0YXRlLT5WcHApIHsKIAkJCWNhc2UgMzM6Ci0JCQljYXNlIDUwOiByZWcgfD0gSTM2NV9WUFAxXzVWOyBicmVhazsKLQkJCWNhc2UgMTIwOiByZWcgfD0gSTM2NV9WUFAxXzEyVjsgYnJlYWs7CisJCQljYXNlIDUwOgorCQkJCXJlZyB8PSBJMzY1X1ZQUDFfNVY7CisJCQkJYnJlYWs7CisJCQljYXNlIDEyMDoKKwkJCQlyZWcgfD0gSTM2NV9WUFAxXzEyVjsKKwkJCQlicmVhazsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCS8qIGk4MjM2NVNMLUIgc3R5bGUgKi8KIAkJCXN3aXRjaCAoc3RhdGUtPlZjYykgewotCQkJY2FzZSA1MDogcmVnIHw9IEkzNjVfVkNDXzVWOyBicmVhazsKLQkJCWRlZmF1bHQ6IHJlZyA9IDA7IGJyZWFrOworCQkJY2FzZSA1MDoKKwkJCQlyZWcgfD0gSTM2NV9WQ0NfNVY7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJlZyA9IDA7CisJCQkJYnJlYWs7CiAJCQl9CiAJCQlzd2l0Y2ggKHN0YXRlLT5WcHApIHsKLQkJCWNhc2UgNTA6IHJlZyB8PSBJMzY1X1ZQUDFfNVYgfCBJMzY1X1ZQUDJfNVY7IGJyZWFrOwotCQkJY2FzZSAxMjA6IHJlZyB8PSBJMzY1X1ZQUDFfMTJWIHwgSTM2NV9WUFAyXzEyVjsgYnJlYWs7CisJCQljYXNlIDUwOgorCQkJCXJlZyB8PSBJMzY1X1ZQUDFfNVYgfCBJMzY1X1ZQUDJfNVY7CisJCQkJYnJlYWs7CisJCQljYXNlIDEyMDoKKwkJCQlyZWcgfD0gSTM2NV9WUFAxXzEyViB8IEkzNjVfVlBQMl8xMlY7CisJCQkJYnJlYWs7CiAJCQl9CiAJCX0KIApAQCAtMjYzLDE0ICsyODAsMjYgQEAKIAl9IGVsc2UgewogCQl1MzIgcmVnID0gMDsJLyogQ0JfU0NfU1RQQ0xLPyAqLwogCQlzd2l0Y2ggKHN0YXRlLT5WY2MpIHsKLQkJY2FzZSAzMzogcmVnID0gQ0JfU0NfVkNDXzNWOyBicmVhazsKLQkJY2FzZSA1MDogcmVnID0gQ0JfU0NfVkNDXzVWOyBicmVhazsKLQkJZGVmYXVsdDogcmVnID0gMDsgYnJlYWs7CisJCWNhc2UgMzM6CisJCQlyZWcgPSBDQl9TQ19WQ0NfM1Y7CisJCQlicmVhazsKKwkJY2FzZSA1MDoKKwkJCXJlZyA9IENCX1NDX1ZDQ181VjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmVnID0gMDsKKwkJCWJyZWFrOwogCQl9CiAJCXN3aXRjaCAoc3RhdGUtPlZwcCkgewotCQljYXNlIDMzOiAgcmVnIHw9IENCX1NDX1ZQUF8zVjsgYnJlYWs7Ci0JCWNhc2UgNTA6ICByZWcgfD0gQ0JfU0NfVlBQXzVWOyBicmVhazsKLQkJY2FzZSAxMjA6IHJlZyB8PSBDQl9TQ19WUFBfMTJWOyBicmVhazsKKwkJY2FzZSAzMzoKKwkJCXJlZyB8PSBDQl9TQ19WUFBfM1Y7CisJCQlicmVhazsKKwkJY2FzZSA1MDoKKwkJCXJlZyB8PSBDQl9TQ19WUFBfNVY7CisJCQlicmVhazsKKwkJY2FzZSAxMjA6CisJCQlyZWcgfD0gQ0JfU0NfVlBQXzEyVjsKKwkJCWJyZWFrOwogCQl9CiAJCWlmIChyZWcgIT0gY2JfcmVhZGwoc29ja2V0LCBDQl9TT0NLRVRfQ09OVFJPTCkpCiAJCQljYl93cml0ZWwoc29ja2V0LCBDQl9TT0NLRVRfQ09OVFJPTCwgcmVnKTsKQEAgLTMxNCwyMyArMzQzLDI5IEBACiAKIAkJcmVnID0gZXhjYV9yZWFkYihzb2NrZXQsIEkzNjVfUE9XRVIpICYgKEkzNjVfVkNDX01BU0t8STM2NV9WUFAxX01BU0spOwogCQlyZWcgfD0gSTM2NV9QV1JfTk9SRVNFVDsKLQkJaWYgKHN0YXRlLT5mbGFncyAmIFNTX1BXUl9BVVRPKSByZWcgfD0gSTM2NV9QV1JfQVVUTzsKLQkJaWYgKHN0YXRlLT5mbGFncyAmIFNTX09VVFBVVF9FTkEpIHJlZyB8PSBJMzY1X1BXUl9PVVQ7CisJCWlmIChzdGF0ZS0+ZmxhZ3MgJiBTU19QV1JfQVVUTykKKwkJCXJlZyB8PSBJMzY1X1BXUl9BVVRPOworCQlpZiAoc3RhdGUtPmZsYWdzICYgU1NfT1VUUFVUX0VOQSkKKwkJCXJlZyB8PSBJMzY1X1BXUl9PVVQ7CiAJCWlmIChleGNhX3JlYWRiKHNvY2tldCwgSTM2NV9QT1dFUikgIT0gcmVnKQogCQkJZXhjYV93cml0ZWIoc29ja2V0LCBJMzY1X1BPV0VSLCByZWcpOwogCiAJCS8qIENTQyBpbnRlcnJ1cHQ6IG5vIElTQSBpcnEgZm9yIENTQyAqLwogCQlyZWcgPSBJMzY1X0NTQ19ERVRFQ1Q7CiAJCWlmIChzdGF0ZS0+ZmxhZ3MgJiBTU19JT0NBUkQpIHsKLQkJCWlmIChzdGF0ZS0+Y3NjX21hc2sgJiBTU19TVFNDSEcpIHJlZyB8PSBJMzY1X0NTQ19TVFNDSEc7CisJCQlpZiAoc3RhdGUtPmNzY19tYXNrICYgU1NfU1RTQ0hHKQorCQkJCXJlZyB8PSBJMzY1X0NTQ19TVFNDSEc7CiAJCX0gZWxzZSB7Ci0JCQlpZiAoc3RhdGUtPmNzY19tYXNrICYgU1NfQkFUREVBRCkgcmVnIHw9IEkzNjVfQ1NDX0JWRDE7Ci0JCQlpZiAoc3RhdGUtPmNzY19tYXNrICYgU1NfQkFUV0FSTikgcmVnIHw9IEkzNjVfQ1NDX0JWRDI7Ci0JCQlpZiAoc3RhdGUtPmNzY19tYXNrICYgU1NfUkVBRFkpIHJlZyB8PSBJMzY1X0NTQ19SRUFEWTsKKwkJCWlmIChzdGF0ZS0+Y3NjX21hc2sgJiBTU19CQVRERUFEKQorCQkJCXJlZyB8PSBJMzY1X0NTQ19CVkQxOworCQkJaWYgKHN0YXRlLT5jc2NfbWFzayAmIFNTX0JBVFdBUk4pCisJCQkJcmVnIHw9IEkzNjVfQ1NDX0JWRDI7CisJCQlpZiAoc3RhdGUtPmNzY19tYXNrICYgU1NfUkVBRFkpCisJCQkJcmVnIHw9IEkzNjVfQ1NDX1JFQURZOwogCQl9CiAJCWV4Y2Ffd3JpdGViKHNvY2tldCwgSTM2NV9DU0NJTlQsIHJlZyk7CiAJCWV4Y2FfcmVhZGIoc29ja2V0LCBJMzY1X0NTQyk7Ci0JCWlmKHNvY2stPnpvb21fdmlkZW8pCisJCWlmIChzb2NrLT56b29tX3ZpZGVvKQogCQkJc29jay0+em9vbV92aWRlbyhzb2NrLCBzdGF0ZS0+ZmxhZ3MgJiBTU19aVkNBUkQpOwogCX0KIAljb25maWdfd3JpdGV3KHNvY2tldCwgQ0JfQlJJREdFX0NPTlRST0wsIGJyaWRnZSk7CkBAIC0zNjgsOSArNDAzLDEyIEBACiAJZXhjYV93cml0ZXcoc29ja2V0LCBJMzY1X0lPKG1hcCkrSTM2NV9XX1NUT1AsIGlvLT5zdG9wKTsKIAogCWlvY3RsID0gZXhjYV9yZWFkYihzb2NrZXQsIEkzNjVfSU9DVEwpICYgfkkzNjVfSU9DVExfTUFTSyhtYXApOwotCWlmIChpby0+ZmxhZ3MgJiBNQVBfMFdTKSBpb2N0bCB8PSBJMzY1X0lPQ1RMXzBXUyhtYXApOwotCWlmIChpby0+ZmxhZ3MgJiBNQVBfMTZCSVQpIGlvY3RsIHw9IEkzNjVfSU9DVExfMTZCSVQobWFwKTsKLQlpZiAoaW8tPmZsYWdzICYgTUFQX0FVVE9TWikgaW9jdGwgfD0gSTM2NV9JT0NUTF9JT0NTMTYobWFwKTsKKwlpZiAoaW8tPmZsYWdzICYgTUFQXzBXUykKKwkJaW9jdGwgfD0gSTM2NV9JT0NUTF8wV1MobWFwKTsKKwlpZiAoaW8tPmZsYWdzICYgTUFQXzE2QklUKQorCQlpb2N0bCB8PSBJMzY1X0lPQ1RMXzE2QklUKG1hcCk7CisJaWYgKGlvLT5mbGFncyAmIE1BUF9BVVRPU1opCisJCWlvY3RsIHw9IEkzNjVfSU9DVExfSU9DUzE2KG1hcCk7CiAJZXhjYV93cml0ZWIoc29ja2V0LCBJMzY1X0lPQ1RMLCBpb2N0bCk7CiAKIAlpZiAoaW8tPmZsYWdzICYgTUFQX0FDVElWRSkKQEAgLTQxNiwxMCArNDU0LDE3IEBACiAKIAl3b3JkID0gKHN0b3AgPj4gMTIpICYgMHgwZmZmOwogCXN3aXRjaCAodG9fY3ljbGVzKG1lbS0+c3BlZWQpKSB7Ci0JCWNhc2UgMDogYnJlYWs7Ci0JCWNhc2UgMTogIHdvcmQgfD0gSTM2NV9NRU1fV1MwOyBicmVhazsKLQkJY2FzZSAyOiAgd29yZCB8PSBJMzY1X01FTV9XUzE7IGJyZWFrOwotCQlkZWZhdWx0OiB3b3JkIHw9IEkzNjVfTUVNX1dTMSB8IEkzNjVfTUVNX1dTMDsgYnJlYWs7CisJY2FzZSAwOgorCQlicmVhazsKKwljYXNlIDE6CisJCXdvcmQgfD0gSTM2NV9NRU1fV1MwOworCQlicmVhazsKKwljYXNlIDI6CisJCXdvcmQgfD0gSTM2NV9NRU1fV1MxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl3b3JkIHw9IEkzNjVfTUVNX1dTMSB8IEkzNjVfTUVNX1dTMDsKKwkJYnJlYWs7CiAJfQogCWV4Y2Ffd3JpdGV3KHNvY2tldCwgSTM2NV9NRU0obWFwKSArIEkzNjVfV19TVE9QLCB3b3JkKTsKIApAQCAtNTQ3LDkgKzU5Miw5IEBACiAgKiBtYXggNCBNQiwgbWluIDE2IGtCLiBXZSB0cnkgdmVyeSBoYXJkIHRvIG5vdCBnZXQgYmVsb3cKICAqIHRoZSAiQUNDIiB2YWx1ZXMsIHRob3VnaC4KICAqLwotI2RlZmluZSBCUklER0VfTUVNX01BWCA0KjEwMjQqMTAyNAotI2RlZmluZSBCUklER0VfTUVNX0FDQyAxMjgqMTAyNAotI2RlZmluZSBCUklER0VfTUVNX01JTiAxNioxMDI0CisjZGVmaW5lIEJSSURHRV9NRU1fTUFYICg0KjEwMjQqMTAyNCkKKyNkZWZpbmUgQlJJREdFX01FTV9BQ0MgKDEyOCoxMDI0KQorI2RlZmluZSBCUklER0VfTUVNX01JTiAoMTYqMTAyNCkKIAogI2RlZmluZSBCUklER0VfSU9fTUFYIDUxMgogI2RlZmluZSBCUklER0VfSU9fQUNDIDI1NgpAQCAtNTc0LDcgKzYxOSw3IEBACiAJCWludCBpOwogCQlzaXplID0gQlJJREdFX01FTV9NQVg7CiAJCWlmIChzaXplID4gYXZhaWwvOCkgewotCQkJc2l6ZT0oYXZhaWwrMSkvODsKKwkJCXNpemUgPSAoYXZhaWwrMSkvODsKIAkJCS8qIHJvdW5kIHNpemUgZG93biB0byBuZXh0IHBvd2VyIG9mIDIgKi8KIAkJCWkgPSAwOwogCQkJd2hpbGUgKChzaXplIC89IDIpICE9IDApCkBAIC01OTAsNyArNjM1LDcgQEAKIAogCWRvIHsKIAkJaWYgKGFsbG9jYXRlX3Jlc291cmNlKHJvb3QsIHJlcywgc2l6ZSwgc3RhcnQsIGVuZCwgYWxpZ24sCi0JCQkJICAgICAgTlVMTCwgTlVMTCk9PTApIHsKKwkJCQkgICAgICBOVUxMLCBOVUxMKSA9PSAwKSB7CiAJCQlyZXR1cm4gMTsKIAkJfQogCQlzaXplID0gc2l6ZS8yOwpAQCAtNjA1LDggKzY1MCw4IEBACiAJCQkgICAgdTMyIG1pbikKIHsKIAlpbnQgaTsKLQlmb3IgKGk9MDsgaTxQQ0lfQlVTX05VTV9SRVNPVVJDRVM7IGkrKykgewotCQlzdHJ1Y3QgcmVzb3VyY2UgKiByb290ID0gc29ja2V0LT5kZXYtPmJ1cy0+cmVzb3VyY2VbaV07CisJZm9yIChpID0gMDsgaSA8IFBDSV9CVVNfTlVNX1JFU09VUkNFUzsgaSsrKSB7CisJCXN0cnVjdCByZXNvdXJjZSAqcm9vdCA9IHNvY2tldC0+ZGV2LT5idXMtPnJlc291cmNlW2ldOwogCQlpZiAoIXJvb3QpCiAJCQljb250aW51ZTsKIApAQCAtNzA0LDcgKzc0OSw3IEBACiBzdGF0aWMgdm9pZCB5ZW50YV9mcmVlX3Jlc291cmNlcyhzdHJ1Y3QgeWVudGFfc29ja2V0ICpzb2NrZXQpCiB7CiAJaW50IGk7Ci0JZm9yIChpPTA7aTw0O2krKykgeworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKIAkJc3RydWN0IHJlc291cmNlICpyZXM7CiAJCXJlcyA9IHNvY2tldC0+ZGV2LT5yZXNvdXJjZSArIFBDSV9CUklER0VfUkVTT1VSQ0VTICsgaTsKIAkJaWYgKHJlcy0+c3RhcnQgIT0gMCAmJiByZXMtPmVuZCAhPSAwKQpAQCAtNzI2LDcgKzc3MSw3IEBACiAKIAkvKiB3ZSBkb24ndCB3YW50IGEgZHlpbmcgc29ja2V0IHJlZ2lzdGVyZWQgKi8KIAlwY21jaWFfdW5yZWdpc3Rlcl9zb2NrZXQoJnNvY2stPnNvY2tldCk7Ci0JCisKIAkvKiBEaXNhYmxlIGFsbCBldmVudHMgc28gd2UgZG9uJ3QgZGllIGluIGFuIElSUSBzdG9ybSAqLwogCWNiX3dyaXRlbChzb2NrLCBDQl9TT0NLRVRfTUFTSywgMHgwKTsKIAlleGNhX3dyaXRlYihzb2NrLCBJMzY1X0NTQ0lOVCwgMCk7CkBAIC04OTgsNyArOTQzLDcgQEAKIHsKIAlzdHJ1Y3QgeWVudGFfc29ja2V0ICpzb2NrZXQgPSAoc3RydWN0IHllbnRhX3NvY2tldCAqKSBkZXZfaWQ7CiAJdTggY3NjOwotICAgICAgICB1MzIgY2JfZXZlbnQ7CisJdTMyIGNiX2V2ZW50OwogCiAJLyogQ2xlYXIgaW50ZXJydXB0IHN0YXR1cyBmb3IgdGhlIGV2ZW50ICovCiAJY2JfZXZlbnQgPSBjYl9yZWFkbChzb2NrZXQsIENCX1NPQ0tFVF9FVkVOVCk7CkBAIC0xMDE5LDcgKzEwNjQsNyBAQAogewogCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAl1bnNpZ25lZCBjaGFyIHVwcGVyX2xpbWl0OwotIAkvKgorCS8qCiAJICogV2Ugb25seSBjaGVjayBhbmQgZml4IHRoZSBwYXJlbnQgYnJpZGdlOiBBbGwgc3lzdGVtcyB3aGljaCBuZWVkCiAJICogdGhpcyBmaXh1cCB0aGF0IGhhdmUgYmVlbiByZXZpZXdlZCBhcmUgbGFwdG9wcyBhbmQgdGhlIG9ubHkgYnJpZGdlCiAJICogd2hpY2ggbmVlZGVkIGZpeGluZyB3YXMgdGhlIHBhcmVudCBicmlkZ2Ugb2YgdGhlIENhcmRCdXMgYnJpZGdlOgpAQCAtMTAzOCw3ICsxMDgzLDcgQEAKIAogCS8qIGNoZWNrIHRoZSBidXMgcmFuZ2VzIG9mIGFsbCBzaWxibGluZyBicmlkZ2VzIHRvIHByZXZlbnQgb3ZlcmxhcCAqLwogCWxpc3RfZm9yX2VhY2godG1wLCAmYnJpZGdlX3RvX2ZpeC0+cGFyZW50LT5jaGlsZHJlbikgewotCQlzdHJ1Y3QgcGNpX2J1cyAqIHNpbGJsaW5nID0gcGNpX2J1c19iKHRtcCk7CisJCXN0cnVjdCBwY2lfYnVzICpzaWxibGluZyA9IHBjaV9idXNfYih0bXApOwogCQkvKgogCQkgKiBJZiB0aGUgc2lsYmxpbmcgaGFzIGEgaGlnaGVyIHNlY29uZGFyeSBidXMgbnVtYmVyCiAJCSAqIGFuZCBpdCdzIHNlY29uZGFyeSBpcyBlcXVhbCBvciBzbWFsbGVyIHRoYW4gb3VyCkBAIC0xMDgzLDcgKzExMjgsNyBAQAogICogaW50ZXJydXB0LCBhbmQgdGhhdCB3ZSBjYW4gbWFwIHRoZSBjYXJkYnVzIGFyZWEuIEZpbGwgaW4gdGhlCiAgKiBzb2NrZXQgaW5mb3JtYXRpb24gc3RydWN0dXJlLi4KICAqLwotc3RhdGljIGludCBfX2RldmluaXQgeWVudGFfcHJvYmUgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHllbnRhX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgeWVudGFfc29ja2V0ICpzb2NrZXQ7CiAJaW50IHJldDsKQEAgLTEzMDIsNyArMTM0Nyw3IEBACiAjZGVmaW5lIFlFTlRBX1BNX09QUwlOVUxMCiAjZW5kaWYKIAotI2RlZmluZSBDQl9JRCh2ZW5kLGRldix0eXBlKQkJCQlcCisjZGVmaW5lIENCX0lEKHZlbmQsIGRldiwgdHlwZSkJCQkJXAogCXsJCQkJCQlcCiAJCS52ZW5kb3IJCT0gdmVuZCwJCQlcCiAJCS5kZXZpY2UJCT0gZGV2LAkJCVwKQEAgLTEzMTMsNyArMTM1OCw3IEBACiAJCS5kcml2ZXJfZGF0YQk9IENBUkRCVVNfVFlQRV8jI3R5cGUsCVwKIAl9CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB5ZW50YV90YWJsZSBbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB5ZW50YV90YWJsZVtdID0gewogCUNCX0lEKFBDSV9WRU5ET1JfSURfVEksIFBDSV9ERVZJQ0VfSURfVElfMTAzMSwgVEkpLAogCiAJLyoKQEAgLTE0MDMsMTMgKzE0NDgsMTMgQEAKIAogc3RhdGljIGludCBfX2luaXQgeWVudGFfc29ja2V0X2luaXQodm9pZCkKIHsKLQlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlciAoJnllbnRhX2NhcmRidXNfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmeWVudGFfY2FyZGJ1c19kcml2ZXIpOwogfQogCiAKLXN0YXRpYyB2b2lkIF9fZXhpdCB5ZW50YV9zb2NrZXRfZXhpdCAodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCB5ZW50YV9zb2NrZXRfZXhpdCh2b2lkKQogewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlciAoJnllbnRhX2NhcmRidXNfZHJpdmVyKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnllbnRhX2NhcmRidXNfZHJpdmVyKTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9xdWlya3MuYyBiL2RyaXZlcnMvcG5wL3F1aXJrcy5jCmluZGV4IDg0NzNmZTUuLmRmYmQ1YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3F1aXJrcy5jCisrKyBiL2RyaXZlcnMvcG5wL3F1aXJrcy5jCkBAIC0yODUsMTUgKzI4NSwxMCBAQAogCQkJCSAqIHRoZSBQQ0kgcmVnaW9uLCBhbmQgdGhhdCBtaWdodCBwcmV2ZW50IGEgUENJCiAJCQkJICogZHJpdmVyIGZyb20gcmVxdWVzdGluZyBpdHMgcmVzb3VyY2VzLgogCQkJCSAqLwotCQkJCWRldl93YXJuKCZkZXYtPmRldiwgIiVzIHJlc291cmNlICIKLQkJCQkJIigweCVsbHgtMHglbGx4KSBvdmVybGFwcyAlcyBCQVIgJWQgIgotCQkJCQkiKDB4JWxseC0weCVsbHgpLCBkaXNhYmxpbmdcbiIsCi0JCQkJCXBucF9yZXNvdXJjZV90eXBlX25hbWUocmVzKSwKLQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgcG5wX3N0YXJ0LAotCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKSBwbnBfZW5kLAotCQkJCQlwY2lfbmFtZShwZGV2KSwgaSwKLQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgcGNpX3N0YXJ0LAotCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKSBwY2lfZW5kKTsKKwkJCQlkZXZfd2FybigmZGV2LT5kZXYsCisJCQkJCSAiZGlzYWJsaW5nICVwUiBiZWNhdXNlIGl0IG92ZXJsYXBzICIKKwkJCQkJICIlcyBCQVIgJWQgJXBSXG4iLCByZXMsCisJCQkJCSBwY2lfbmFtZShwZGV2KSwgaSwgJnBkZXYtPnJlc291cmNlW2ldKTsKIAkJCQlyZXMtPmZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3Jlc291cmNlLmMgYi9kcml2ZXJzL3BucC9yZXNvdXJjZS5jCmluZGV4IGJhOTc2NTQuLjY0ZDA1OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3Jlc291cmNlLmMKKysrIGIvZHJpdmVycy9wbnAvcmVzb3VyY2UuYwpAQCAtNTE3LDcgKzUxNyw3IEBACiAJcmVzLT5zdGFydCA9IGlycTsKIAlyZXMtPmVuZCA9IGlycTsKIAotCXBucF9kYmcoJmRldi0+ZGV2LCAiICBhZGQgaXJxICVkIGZsYWdzICUjeFxuIiwgaXJxLCBmbGFncyk7CisJcG5wX2RiZygmZGV2LT5kZXYsICIgIGFkZCAlcHJcbiIsIHJlcyk7CiAJcmV0dXJuIHBucF9yZXM7CiB9CiAKQEAgLTUzOCw3ICs1MzgsNyBAQAogCXJlcy0+c3RhcnQgPSBkbWE7CiAJcmVzLT5lbmQgPSBkbWE7CiAKLQlwbnBfZGJnKCZkZXYtPmRldiwgIiAgYWRkIGRtYSAlZCBmbGFncyAlI3hcbiIsIGRtYSwgZmxhZ3MpOworCXBucF9kYmcoJmRldi0+ZGV2LCAiICBhZGQgJXByXG4iLCByZXMpOwogCXJldHVybiBwbnBfcmVzOwogfQogCkBAIC01NjIsOCArNTYyLDcgQEAKIAlyZXMtPnN0YXJ0ID0gc3RhcnQ7CiAJcmVzLT5lbmQgPSBlbmQ7CiAKLQlwbnBfZGJnKCZkZXYtPmRldiwgIiAgYWRkIGlvICAlI2xseC0lI2xseCBmbGFncyAlI3hcbiIsCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXJ0LCAodW5zaWduZWQgbG9uZyBsb25nKSBlbmQsIGZsYWdzKTsKKwlwbnBfZGJnKCZkZXYtPmRldiwgIiAgYWRkICVwclxuIiwgcmVzKTsKIAlyZXR1cm4gcG5wX3JlczsKIH0KIApAQCAtNTg3LDggKzU4Niw3IEBACiAJcmVzLT5zdGFydCA9IHN0YXJ0OwogCXJlcy0+ZW5kID0gZW5kOwogCi0JcG5wX2RiZygmZGV2LT5kZXYsICIgIGFkZCBtZW0gJSNsbHgtJSNsbHggZmxhZ3MgJSN4XG4iLAotCQkodW5zaWduZWQgbG9uZyBsb25nKSBzdGFydCwgKHVuc2lnbmVkIGxvbmcgbG9uZykgZW5kLCBmbGFncyk7CisJcG5wX2RiZygmZGV2LT5kZXYsICIgIGFkZCAlcHJcbiIsIHJlcyk7CiAJcmV0dXJuIHBucF9yZXM7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3N1cHBvcnQuYyBiL2RyaXZlcnMvcG5wL3N1cHBvcnQuYwppbmRleCA2MzA4N2Q1Li45NTg1YzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9zdXBwb3J0LmMKKysrIGIvZHJpdmVycy9wbnAvc3VwcG9ydC5jCkBAIC03NSw0NyArNzUsMTQgQEAKIAogdm9pZCBkYmdfcG5wX3Nob3dfcmVzb3VyY2VzKHN0cnVjdCBwbnBfZGV2ICpkZXYsIGNoYXIgKmRlc2MpCiB7Ci0JY2hhciBidWZbMTI4XTsKLQlpbnQgbGVuOwogCXN0cnVjdCBwbnBfcmVzb3VyY2UgKnBucF9yZXM7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7CiAKLQlpZiAobGlzdF9lbXB0eSgmZGV2LT5yZXNvdXJjZXMpKSB7CisJaWYgKGxpc3RfZW1wdHkoJmRldi0+cmVzb3VyY2VzKSkKIAkJcG5wX2RiZygmZGV2LT5kZXYsICIlczogbm8gY3VycmVudCByZXNvdXJjZXNcbiIsIGRlc2MpOwotCQlyZXR1cm47Ci0JfQotCi0JcG5wX2RiZygmZGV2LT5kZXYsICIlczogY3VycmVudCByZXNvdXJjZXM6XG4iLCBkZXNjKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBucF9yZXMsICZkZXYtPnJlc291cmNlcywgbGlzdCkgewotCQlyZXMgPSAmcG5wX3Jlcy0+cmVzOwotCQlsZW4gPSAwOwotCi0JCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwgIiAgJS0zcyAiLAotCQkJCSBwbnBfcmVzb3VyY2VfdHlwZV9uYW1lKHJlcykpOwotCi0JCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9ESVNBQkxFRCkgewotCQkJcG5wX2RiZygmZGV2LT5kZXYsICIlc2Rpc2FibGVkXG4iLCBidWYpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlzd2l0Y2ggKHBucF9yZXNvdXJjZV90eXBlKHJlcykpIHsKLQkJY2FzZSBJT1JFU09VUkNFX0lPOgotCQljYXNlIElPUkVTT1VSQ0VfTUVNOgotCQkJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLAotCQkJCQkgIiUjbGx4LSUjbGx4IGZsYWdzICUjbHgiLAotCQkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgcmVzLT5zdGFydCwKLQkJCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpIHJlcy0+ZW5kLAotCQkJCQkgcmVzLT5mbGFncyk7Ci0JCQlicmVhazsKLQkJY2FzZSBJT1JFU09VUkNFX0lSUToKLQkJY2FzZSBJT1JFU09VUkNFX0RNQToKLQkJCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwKLQkJCQkJICIlbGxkIGZsYWdzICUjbHgiLAotCQkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgcmVzLT5zdGFydCwKLQkJCQkJIHJlcy0+ZmxhZ3MpOwotCQkJYnJlYWs7Ci0JCX0KLQkJcG5wX2RiZygmZGV2LT5kZXYsICIlc1xuIiwgYnVmKTsKKwllbHNlIHsKKwkJcG5wX2RiZygmZGV2LT5kZXYsICIlczogY3VycmVudCByZXNvdXJjZXM6XG4iLCBkZXNjKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShwbnBfcmVzLCAmZGV2LT5yZXNvdXJjZXMsIGxpc3QpCisJCQlwbnBfZGJnKCZkZXYtPmRldiwgIiVwclxuIiwgJnBucF9yZXMtPnJlcyk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9zeXN0ZW0uYyBiL2RyaXZlcnMvcG5wL3N5c3RlbS5jCmluZGV4IDU5YjkwOTIuLjQ5YzE3MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3N5c3RlbS5jCisrKyBiL2RyaXZlcnMvcG5wL3N5c3RlbS5jCkBAIC0yMiwxMSArMjIsMTEgQEAKIAl7IiIsIDB9CiB9OwogCi1zdGF0aWMgdm9pZCByZXNlcnZlX3JhbmdlKHN0cnVjdCBwbnBfZGV2ICpkZXYsIHJlc291cmNlX3NpemVfdCBzdGFydCwKLQkJCSAgcmVzb3VyY2Vfc2l6ZV90IGVuZCwgaW50IHBvcnQpCitzdGF0aWMgdm9pZCByZXNlcnZlX3JhbmdlKHN0cnVjdCBwbnBfZGV2ICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqciwgaW50IHBvcnQpCiB7CiAJY2hhciAqcmVnaW9uaWQ7CiAJY29uc3QgY2hhciAqcG5waWQgPSBkZXZfbmFtZSgmZGV2LT5kZXYpOworCXJlc291cmNlX3NpemVfdCBzdGFydCA9IHItPnN0YXJ0LCBlbmQgPSByLT5lbmQ7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAKIAlyZWdpb25pZCA9IGttYWxsb2MoMTYsIEdGUF9LRVJORUwpOwpAQCAtNDgsMTAgKzQ4LDggQEAKIAkgKiBleGFtcGxlIGRvIHJlc2VydmUgc3R1ZmYgdGhleSBrbm93IGFib3V0IHRvbywgc28gd2UgbWF5IHdlbGwKIAkgKiBoYXZlIGRvdWJsZSByZXNlcnZhdGlvbnMuCiAJICovCi0JZGV2X2luZm8oJmRldi0+ZGV2LCAiJXMgcmFuZ2UgMHglbGx4LTB4JWxseCAlcyByZXNlcnZlZFxuIiwKLQkJcG9ydCA/ICJpb3BvcnQiIDogImlvbWVtIiwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhcnQsICh1bnNpZ25lZCBsb25nIGxvbmcpIGVuZCwKLQkJcmVzID8gImhhcyBiZWVuIiA6ICJjb3VsZCBub3QgYmUiKTsKKwlkZXZfaW5mbygmZGV2LT5kZXYsICIlcFIgJXMgcmVzZXJ2ZWRcbiIsIHIsCisJCSByZXMgPyAiaGFzIGJlZW4iIDogImNvdWxkIG5vdCBiZSIpOwogfQogCiBzdGF0aWMgdm9pZCByZXNlcnZlX3Jlc291cmNlc19vZl9kZXYoc3RydWN0IHBucF9kZXYgKmRldikKQEAgLTc3LDE0ICs3NSwxNCBAQAogCQlpZiAocmVzLT5lbmQgPCByZXMtPnN0YXJ0KQogCQkJY29udGludWU7CS8qIGludmFsaWQgKi8KIAotCQlyZXNlcnZlX3JhbmdlKGRldiwgcmVzLT5zdGFydCwgcmVzLT5lbmQsIDEpOworCQlyZXNlcnZlX3JhbmdlKGRldiwgcmVzLCAxKTsKIAl9CiAKIAlmb3IgKGkgPSAwOyAocmVzID0gcG5wX2dldF9yZXNvdXJjZShkZXYsIElPUkVTT1VSQ0VfTUVNLCBpKSk7IGkrKykgewogCQlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfRElTQUJMRUQpCiAJCQljb250aW51ZTsKIAotCQlyZXNlcnZlX3JhbmdlKGRldiwgcmVzLT5zdGFydCwgcmVzLT5lbmQsIDApOworCQlyZXNlcnZlX3JhbmdlKGRldiwgcmVzLCAwKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvcGNmNTA2MzMtY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9wY2Y1MDYzMy1jaGFyZ2VyLmMKaW5kZXggZThiMjc4Zi4uNmE4NGE4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9wY2Y1MDYzMy1jaGFyZ2VyLmMKKysrIGIvZHJpdmVycy9wb3dlci9wY2Y1MDYzMy1jaGFyZ2VyLmMKQEAgLTMwMyw3ICszMDMsNiBAQAogc3RhdGljIGludCBfX2RldmluaXQgcGNmNTA2MzNfbWJjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHBjZjUwNjMzX21iYyAqbWJjOwotCXN0cnVjdCBwY2Y1MDYzM19zdWJkZXZfcGRhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJaW50IHJldDsKIAlpbnQgaTsKIAl1OCBtYmNzMTsKQEAgLTMxMyw3ICszMTIsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1iYyk7Ci0JbWJjLT5wY2YgPSBwZGF0YS0+cGNmOworCW1iYy0+cGNmID0gZGV2X3RvX3BjZjUwNjMzKHBkZXYtPmRldi5wYXJlbnQpOwogCiAJLyogU2V0IHVwIElSUSBoYW5kbGVycyAqLwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1iY19pcnFfaGFuZGxlcnMpOyBpKyspCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3dtODM1MF9wb3dlci5jIGIvZHJpdmVycy9wb3dlci93bTgzNTBfcG93ZXIuYwppbmRleCAyOGIwMjk5Li5hZDRmMDcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3dtODM1MF9wb3dlci5jCisrKyBiL2RyaXZlcnMvcG93ZXIvd204MzUwX3Bvd2VyLmMKQEAgLTE4NCw4ICsxODQsOSBAQAogCiBzdGF0aWMgREVWSUNFX0FUVFIoY2hhcmdlcl9zdGF0ZSwgMDQ0NCwgY2hhcmdlcl9zdGF0ZV9zaG93LCBOVUxMKTsKIAotc3RhdGljIHZvaWQgd204MzUwX2NoYXJnZXJfaGFuZGxlcihzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBpcnEsIHZvaWQgKmRhdGEpCitzdGF0aWMgaXJxcmV0dXJuX3Qgd204MzUwX2NoYXJnZXJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQogeworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IGRhdGE7CiAJc3RydWN0IHdtODM1MF9wb3dlciAqcG93ZXIgPSAmd204MzUwLT5wb3dlcjsKIAlzdHJ1Y3Qgd204MzUwX2NoYXJnZXJfcG9saWN5ICpwb2xpY3kgPSBwb3dlci0+cG9saWN5OwogCkBAIC0yMzgsNiArMjM5LDggQEAKIAlkZWZhdWx0OgogCQlkZXZfZXJyKHdtODM1MC0+ZGV2LCAiVW5rbm93biBpbnRlcnJ1cHQgJWRcbiIsIGlycSk7CiAJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zODcsNzMgKzM5MCw1NSBAQAogewogCS8qIHJlZ2lzdGVyIG91ciBpbnRlcmVzdCBpbiBjaGFyZ2VyIGV2ZW50cyAqLwogCXdtODM1MF9yZWdpc3Rlcl9pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19CQVRfSE9ULAotCQkJICAgIHdtODM1MF9jaGFyZ2VyX2hhbmRsZXIsIE5VTEwpOwotCXdtODM1MF91bm1hc2tfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfQkFUX0hPVCk7CisJCQkgICAgd204MzUwX2NoYXJnZXJfaGFuZGxlciwgMCwgIkJhdHRlcnkgaG90Iiwgd204MzUwKTsKIAl3bTgzNTBfcmVnaXN0ZXJfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfQkFUX0NPTEQsCi0JCQkgICAgd204MzUwX2NoYXJnZXJfaGFuZGxlciwgTlVMTCk7Ci0Jd204MzUwX3VubWFza19pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19CQVRfQ09MRCk7CisJCQkgICAgd204MzUwX2NoYXJnZXJfaGFuZGxlciwgMCwgIkJhdHRlcnkgY29sZCIsIHdtODM1MCk7CiAJd204MzUwX3JlZ2lzdGVyX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX0JBVF9GQUlMLAotCQkJICAgIHdtODM1MF9jaGFyZ2VyX2hhbmRsZXIsIE5VTEwpOwotCXdtODM1MF91bm1hc2tfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfQkFUX0ZBSUwpOworCQkJICAgIHdtODM1MF9jaGFyZ2VyX2hhbmRsZXIsIDAsICJCYXR0ZXJ5IGZhaWwiLCB3bTgzNTApOwogCXdtODM1MF9yZWdpc3Rlcl9pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19UTywKLQkJCSAgICB3bTgzNTBfY2hhcmdlcl9oYW5kbGVyLCBOVUxMKTsKLQl3bTgzNTBfdW5tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX1RPKTsKKwkJCSAgICB3bTgzNTBfY2hhcmdlcl9oYW5kbGVyLCAwLAorCQkJICAgICJDaGFyZ2VyIHRpbWVvdXQiLCB3bTgzNTApOwogCXdtODM1MF9yZWdpc3Rlcl9pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19FTkQsCi0JCQkgICAgd204MzUwX2NoYXJnZXJfaGFuZGxlciwgTlVMTCk7Ci0Jd204MzUwX3VubWFza19pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19FTkQpOworCQkJICAgIHdtODM1MF9jaGFyZ2VyX2hhbmRsZXIsIDAsCisJCQkgICAgIkNoYXJnZSBlbmQiLCB3bTgzNTApOwogCXdtODM1MF9yZWdpc3Rlcl9pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19TVEFSVCwKLQkJCSAgICB3bTgzNTBfY2hhcmdlcl9oYW5kbGVyLCBOVUxMKTsKLQl3bTgzNTBfdW5tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX1NUQVJUKTsKKwkJCSAgICB3bTgzNTBfY2hhcmdlcl9oYW5kbGVyLCAwLAorCQkJICAgICJDaGFyZ2Ugc3RhcnQiLCB3bTgzNTApOwogCXdtODM1MF9yZWdpc3Rlcl9pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19GQVNUX1JEWSwKLQkJCSAgICB3bTgzNTBfY2hhcmdlcl9oYW5kbGVyLCBOVUxMKTsKLQl3bTgzNTBfdW5tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX0ZBU1RfUkRZKTsKKwkJCSAgICB3bTgzNTBfY2hhcmdlcl9oYW5kbGVyLCAwLAorCQkJICAgICJGYXN0IGNoYXJnZSByZWFkeSIsIHdtODM1MCk7CiAJd204MzUwX3JlZ2lzdGVyX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzNQOSwKLQkJCSAgICB3bTgzNTBfY2hhcmdlcl9oYW5kbGVyLCBOVUxMKTsKLQl3bTgzNTBfdW5tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzNQOSk7CisJCQkgICAgd204MzUwX2NoYXJnZXJfaGFuZGxlciwgMCwKKwkJCSAgICAiQmF0dGVyeSA8My45ViIsIHdtODM1MCk7CiAJd204MzUwX3JlZ2lzdGVyX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzNQMSwKLQkJCSAgICB3bTgzNTBfY2hhcmdlcl9oYW5kbGVyLCBOVUxMKTsKLQl3bTgzNTBfdW5tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzNQMSk7CisJCQkgICAgd204MzUwX2NoYXJnZXJfaGFuZGxlciwgMCwKKwkJCSAgICAiQmF0dGVyeSA8My4xViIsIHdtODM1MCk7CiAJd204MzUwX3JlZ2lzdGVyX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzJQODUsCi0JCQkgICAgd204MzUwX2NoYXJnZXJfaGFuZGxlciwgTlVMTCk7Ci0Jd204MzUwX3VubWFza19pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19WQkFUVF9MVF8yUDg1KTsKKwkJCSAgICB3bTgzNTBfY2hhcmdlcl9oYW5kbGVyLCAwLAorCQkJICAgICJCYXR0ZXJ5IDwyLjg1ViIsIHdtODM1MCk7CiAKIAkvKiBhbmQgc3VwcGx5IGNoYW5nZSBldmVudHMgKi8KIAl3bTgzNTBfcmVnaXN0ZXJfaXJxKHdtODM1MCwgV004MzUwX0lSUV9FWFRfVVNCX0ZCLAotCQkJICAgIHdtODM1MF9jaGFyZ2VyX2hhbmRsZXIsIE5VTEwpOwotCXdtODM1MF91bm1hc2tfaXJxKHdtODM1MCwgV004MzUwX0lSUV9FWFRfVVNCX0ZCKTsKKwkJCSAgICB3bTgzNTBfY2hhcmdlcl9oYW5kbGVyLCAwLCAiVVNCIiwgd204MzUwKTsKIAl3bTgzNTBfcmVnaXN0ZXJfaXJxKHdtODM1MCwgV004MzUwX0lSUV9FWFRfV0FMTF9GQiwKLQkJCSAgICB3bTgzNTBfY2hhcmdlcl9oYW5kbGVyLCBOVUxMKTsKLQl3bTgzNTBfdW5tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfRVhUX1dBTExfRkIpOworCQkJICAgIHdtODM1MF9jaGFyZ2VyX2hhbmRsZXIsIDAsICJXYWxsIiwgd204MzUwKTsKIAl3bTgzNTBfcmVnaXN0ZXJfaXJxKHdtODM1MCwgV004MzUwX0lSUV9FWFRfQkFUX0ZCLAotCQkJICAgIHdtODM1MF9jaGFyZ2VyX2hhbmRsZXIsIE5VTEwpOwotCXdtODM1MF91bm1hc2tfaXJxKHdtODM1MCwgV004MzUwX0lSUV9FWFRfQkFUX0ZCKTsKKwkJCSAgICB3bTgzNTBfY2hhcmdlcl9oYW5kbGVyLCAwLCAiQmF0dGVyeSIsIHdtODM1MCk7CiB9CiAKIHN0YXRpYyB2b2lkIGZyZWVfY2hhcmdlcl9pcnEoc3RydWN0IHdtODM1MCAqd204MzUwKQogewotCXdtODM1MF9tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX0JBVF9IT1QpOwogCXdtODM1MF9mcmVlX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX0JBVF9IT1QpOwotCXdtODM1MF9tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX0JBVF9DT0xEKTsKIAl3bTgzNTBfZnJlZV9pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19CQVRfQ09MRCk7Ci0Jd204MzUwX21hc2tfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfQkFUX0ZBSUwpOwogCXdtODM1MF9mcmVlX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX0JBVF9GQUlMKTsKLQl3bTgzNTBfbWFza19pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19UTyk7CiAJd204MzUwX2ZyZWVfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfVE8pOwotCXdtODM1MF9tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX0VORCk7CiAJd204MzUwX2ZyZWVfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfRU5EKTsKLQl3bTgzNTBfbWFza19pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19TVEFSVCk7CiAJd204MzUwX2ZyZWVfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfU1RBUlQpOwotCXdtODM1MF9tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzNQOSk7CiAJd204MzUwX2ZyZWVfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfVkJBVFRfTFRfM1A5KTsKLQl3bTgzNTBfbWFza19pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19WQkFUVF9MVF8zUDEpOwogCXdtODM1MF9mcmVlX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzNQMSk7Ci0Jd204MzUwX21hc2tfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfVkJBVFRfTFRfMlA4NSk7CiAJd204MzUwX2ZyZWVfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfVkJBVFRfTFRfMlA4NSk7Ci0Jd204MzUwX21hc2tfaXJxKHdtODM1MCwgV004MzUwX0lSUV9FWFRfVVNCX0ZCKTsKIAl3bTgzNTBfZnJlZV9pcnEod204MzUwLCBXTTgzNTBfSVJRX0VYVF9VU0JfRkIpOwotCXdtODM1MF9tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfRVhUX1dBTExfRkIpOwogCXdtODM1MF9mcmVlX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfRVhUX1dBTExfRkIpOwotCXdtODM1MF9tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfRVhUX0JBVF9GQik7CiAJd204MzUwX2ZyZWVfaXJxKHdtODM1MCwgV004MzUwX0lSUV9FWFRfQkFUX0ZCKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvS2NvbmZpZyBiL2RyaXZlcnMvcmVndWxhdG9yL0tjb25maWcKaW5kZXggYmNiYjE2MS4uN2NmZGQ2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvS2NvbmZpZworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnCkBAIC03MCw3ICs3MCw3IEBACiAJICBmb3IgUFhBMjd4IGNoaXBzIHRvIGNvbnRyb2wgVkNDX0NPUkUgYW5kIFZDQ19VU0lNIHZvbHRhZ2VzLgogCiBjb25maWcgUkVHVUxBVE9SX1RXTDQwMzAKLQlib29sICJUSSBUV0w0MDMwL1RXTDUwMzAvVFBTNjk1eDAgUE1JQyIKKwlib29sICJUSSBUV0w0MDMwL1RXTDUwMzAvVFdMNjAzMC9UUFM2OTV4MCBQTUlDIgogCWRlcGVuZHMgb24gVFdMNDAzMF9DT1JFCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIHZvbHRhZ2UgcmVndWxhdG9ycyBwcm92aWRlZCBieQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvTWFrZWZpbGUgYi9kcml2ZXJzL3JlZ3VsYXRvci9NYWtlZmlsZQppbmRleCA0MjU3YTg2Li45YWUzY2M0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9NYWtlZmlsZQpAQCAtMTEsNyArMTEsNyBAQAogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9CUTI0MDIyKSArPSBicTI0MDIyLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfTFAzOTcxKSArPSBscDM5NzEubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9NQVgxNTg2KSArPSBtYXgxNTg2Lm8KLW9iai0kKENPTkZJR19SRUdVTEFUT1JfVFdMNDAzMCkgKz0gdHdsNDAzMC1yZWd1bGF0b3Iubworb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9UV0w0MDMwKSArPSB0d2wtcmVndWxhdG9yLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfV004MzFYKSArPSB3bTgzMXgtZGNkYy5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX1dNODMxWCkgKz0gd204MzF4LWlzaW5rLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfV004MzFYKSArPSB3bTgzMXgtbGRvLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3BjZjUwNjMzLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvcGNmNTA2MzMtcmVndWxhdG9yLmMKaW5kZXggMDgwM2ZmZS4uYzhmNDFkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvcGNmNTA2MzMtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvcGNmNTA2MzMtcmVndWxhdG9yLmMKQEAgLTMxNCwxMyArMzE0LDE1IEBACiAJc3RydWN0IHBjZjUwNjMzICpwY2Y7CiAKIAkvKiBBbHJlYWR5IHNldCBieSBjb3JlIGRyaXZlciAqLwotCXBjZiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXBjZiA9IGRldl90b19wY2Y1MDYzMyhwZGV2LT5kZXYucGFyZW50KTsKIAogCXJkZXYgPSByZWd1bGF0b3JfcmVnaXN0ZXIoJnJlZ3VsYXRvcnNbcGRldi0+aWRdLCAmcGRldi0+ZGV2LAogCQkJCSAgcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEsIHBjZik7CiAJaWYgKElTX0VSUihyZGV2KSkKIAkJcmV0dXJuIFBUUl9FUlIocmRldik7CiAKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCByZGV2KTsKKwogCWlmIChwY2YtPnBkYXRhLT5yZWd1bGF0b3JfcmVnaXN0ZXJlZCkKIAkJcGNmLT5wZGF0YS0+cmVndWxhdG9yX3JlZ2lzdGVyZWQocGNmLCBwZGV2LT5pZCk7CiAKQEAgLTMzMSw2ICszMzMsNyBAQAogewogCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIAlyZWd1bGF0b3JfdW5yZWdpc3RlcihyZGV2KTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdHdsLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvdHdsLXJlZ3VsYXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYTFjM2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90d2wtcmVndWxhdG9yLmMKQEAgLTAsMCArMSw1NzkgQEAKKy8qCisgKiB0d2wtcmVndWxhdG9yLmMgLS0gc3VwcG9ydCByZWd1bGF0b3JzIGluIHR3bDQwMzAvdHdsNjAzMCBmYW1pbHkgY2hpcHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRGF2aWQgQnJvd25lbGwKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CisjaW5jbHVkZSA8bGludXgvaTJjL3R3bC5oPgorCisKKy8qCisgKiBUaGUgVFdMNDAzMC9UVzUwMzAvVFBTNjU5eDAvVFdMNjAzMCBmYW1pbHkgY2hpcHMgaW5jbHVkZSBwb3dlciBtYW5hZ2VtZW50LCBhCisgKiBVU0IgT1RHIHRyYW5zY2VpdmVyLCBhbiBSVEMsIEFEQywgUFdNLCBhbmQgbG90cyBtb3JlLiAgU29tZSB2ZXJzaW9ucworICogaW5jbHVkZSBhbiBhdWRpbyBjb2RlYywgYmF0dGVyeSBjaGFyZ2VyLCBhbmQgbW9yZSB2b2x0YWdlIHJlZ3VsYXRvcnMuCisgKiBUaGVzZSBjaGlwcyBhcmUgb2Z0ZW4gdXNlZCBpbiBPTUFQLWJhc2VkIHN5c3RlbXMuCisgKgorICogVGhpcyBkcml2ZXIgaW1wbGVtZW50cyBzb2Z0d2FyZS1iYXNlZCByZXNvdXJjZSBjb250cm9sIGZvciB2YXJpb3VzCisgKiB2b2x0YWdlIHJlZ3VsYXRvcnMuICBUaGlzIGlzIHVzdWFsbHkgYXVnbWVudGVkIHdpdGggc3RhdGUgbWFjaGluZQorICogYmFzZWQgY29udHJvbC4KKyAqLworCitzdHJ1Y3QgdHdscmVnX2luZm8geworCS8qIHN0YXJ0IG9mIHJlZ3VsYXRvcidzIFBNX1JFQ0VJVkVSIGNvbnRyb2wgcmVnaXN0ZXIgYmFuayAqLworCXU4CQkJYmFzZTsKKworCS8qIHR3bCByZXNvdXJjZSBJRCwgZm9yIHJlc291cmNlIGNvbnRyb2wgc3RhdGUgbWFjaGluZSAqLworCXU4CQkJaWQ7CisKKwkvKiB2b2x0YWdlIGluIG1WID0gdGFibGVbVlNFTF07IHRhYmxlX2xlbiBtdXN0IGJlIGEgcG93ZXItb2YtdHdvICovCisJdTgJCQl0YWJsZV9sZW47CisJY29uc3QgdTE2CQkqdGFibGU7CisKKwkvKiBjaGlwIGNvbnN0cmFpbnRzIG9uIHJlZ3VsYXRvciBiZWhhdmlvciAqLworCXUxNgkJCW1pbl9tVjsKKworCS8qIHVzZWQgYnkgcmVndWxhdG9yIGNvcmUgKi8KKwlzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MJZGVzYzsKK307CisKKworLyogTERPIGNvbnRyb2wgcmVnaXN0ZXJzIC4uLiBvZmZzZXQgaXMgZnJvbSB0aGUgYmFzZSBvZiBpdHMgcmVnaXN0ZXIgYmFuay4KKyAqIFRoZSBmaXJzdCB0aHJlZSByZWdpc3RlcnMgb2YgYWxsIHBvd2VyIHJlc291cmNlIGJhbmtzIGhlbHAgaGFyZHdhcmUgdG8KKyAqIG1hbmFnZSB0aGUgdmFyaW91cyByZXNvdXJjZSBncm91cHMuCisgKi8KKy8qIENvbW1vbiBvZmZzZXQgaW4gVFdMNDAzMC82MDMwICovCisjZGVmaW5lIFZSRUdfR1JQCQkwCisvKiBUV0w0MDMwIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgVlJFR19UWVBFCQkxCisjZGVmaW5lIFZSRUdfUkVNQVAJCTIKKyNkZWZpbmUgVlJFR19ERURJQ0FURUQJCTMJLyogTERPIGNvbnRyb2wgKi8KKy8qIFRXTDYwMzAgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBWUkVHX1RSQU5TCQkxCisjZGVmaW5lIFZSRUdfU1RBVEUJCTIKKyNkZWZpbmUgVlJFR19WT0xUQUdFCQkzCisvKiBUV0w2MDMwIE1pc2MgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBWUkVHX0JDX0FMTAkJMQorI2RlZmluZSBWUkVHX0JDX1JFRgkJMgorI2RlZmluZSBWUkVHX0JDX1BST0MJCTMKKyNkZWZpbmUgVlJFR19CQ19DTEtfUlNUCQk0CisKK3N0YXRpYyBpbmxpbmUgaW50Cit0d2xyZWdfcmVhZChzdHJ1Y3QgdHdscmVnX2luZm8gKmluZm8sIHVuc2lnbmVkIHNsYXZlX3N1YmdwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJdTggdmFsdWU7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IHR3bF9pMmNfcmVhZF91OChzbGF2ZV9zdWJncCwKKwkJCSZ2YWx1ZSwgaW5mby0+YmFzZSArIG9mZnNldCk7CisJcmV0dXJuIChzdGF0dXMgPCAwKSA/IHN0YXR1cyA6IHZhbHVlOworfQorCitzdGF0aWMgaW5saW5lIGludAordHdscmVnX3dyaXRlKHN0cnVjdCB0d2xyZWdfaW5mbyAqaW5mbywgdW5zaWduZWQgc2xhdmVfc3ViZ3AsIHVuc2lnbmVkIG9mZnNldCwKKwkJCQkJCSB1OCB2YWx1ZSkKK3sKKwlyZXR1cm4gdHdsX2kyY193cml0ZV91OChzbGF2ZV9zdWJncCwKKwkJCXZhbHVlLCBpbmZvLT5iYXNlICsgb2Zmc2V0KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogZ2VuZXJpYyBwb3dlciByZXNvdXJjZSBvcGVyYXRpb25zLCB3aGljaCB3b3JrIG9uIGFsbCByZWd1bGF0b3JzICovCisKK3N0YXRpYyBpbnQgdHdscmVnX2dycChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlyZXR1cm4gdHdscmVnX3JlYWQocmRldl9nZXRfZHJ2ZGF0YShyZGV2KSwgVFdMX01PRFVMRV9QTV9SRUNFSVZFUiwKKwkJCQkJCQkJIFZSRUdfR1JQKTsKK30KKworLyoKKyAqIEVuYWJsZS9kaXNhYmxlIHJlZ3VsYXRvcnMgYnkgam9pbmluZy9sZWF2aW5nIHRoZSBQMSAocHJvY2Vzc29yKSBncm91cC4KKyAqIFdlIGFzc3VtZSBub2JvZHkgZWxzZSBpcyB1cGRhdGluZyB0aGUgREVWX0dSUCByZWdpc3RlcnMuCisgKi8KKy8qIGRlZmluaXRpb24gZm9yIDQwMzAgZmFtaWx5ICovCisjZGVmaW5lIFAzX0dSUF80MDMwCUJJVCg3KQkJLyogInBlcmlwaGVyYWxzIiAqLworI2RlZmluZSBQMl9HUlBfNDAzMAlCSVQoNikJCS8qIHNlY29uZGFyeSBwcm9jZXNzb3IsIG1vZGVtLCBldGMgKi8KKyNkZWZpbmUgUDFfR1JQXzQwMzAJQklUKDUpCQkvKiBDUFUvTGludXggKi8KKy8qIGRlZmluaXRpb24gZm9yIDYwMzAgZmFtaWx5ICovCisjZGVmaW5lIFAzX0dSUF82MDMwCUJJVCgyKQkJLyogc2Vjb25kYXJ5IHByb2Nlc3NvciwgbW9kZW0sIGV0YyAqLworI2RlZmluZSBQMl9HUlBfNjAzMAlCSVQoMSkJCS8qICJwZXJpcGhlcmFscyIgKi8KKyNkZWZpbmUgUDFfR1JQXzYwMzAJQklUKDApCQkvKiBDUFUvTGludXggKi8KKworc3RhdGljIGludCB0d2xyZWdfaXNfZW5hYmxlZChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlpbnQJc3RhdGUgPSB0d2xyZWdfZ3JwKHJkZXYpOworCisJaWYgKHN0YXRlIDwgMCkKKwkJcmV0dXJuIHN0YXRlOworCisJaWYgKHR3bF9jbGFzc19pc180MDMwKCkpCisJCXN0YXRlICY9IFAxX0dSUF80MDMwOworCWVsc2UKKwkJc3RhdGUgJj0gUDFfR1JQXzYwMzA7CisJcmV0dXJuIHN0YXRlOworfQorCitzdGF0aWMgaW50IHR3bHJlZ19lbmFibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCit7CisJc3RydWN0IHR3bHJlZ19pbmZvCSppbmZvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlpbnQJCQlncnA7CisKKwlncnAgPSB0d2xyZWdfcmVhZChpbmZvLCBUV0xfTU9EVUxFX1BNX1JFQ0VJVkVSLCBWUkVHX0dSUCk7CisJaWYgKGdycCA8IDApCisJCXJldHVybiBncnA7CisKKwlpZiAodHdsX2NsYXNzX2lzXzQwMzAoKSkKKwkJZ3JwIHw9IFAxX0dSUF80MDMwOworCWVsc2UKKwkJZ3JwIHw9IFAxX0dSUF82MDMwOworCisJcmV0dXJuIHR3bHJlZ193cml0ZShpbmZvLCBUV0xfTU9EVUxFX1BNX1JFQ0VJVkVSLCBWUkVHX0dSUCwgZ3JwKTsKK30KKworc3RhdGljIGludCB0d2xyZWdfZGlzYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlzdHJ1Y3QgdHdscmVnX2luZm8JKmluZm8gPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCWludAkJCWdycDsKKworCWdycCA9IHR3bHJlZ19yZWFkKGluZm8sIFRXTF9NT0RVTEVfUE1fUkVDRUlWRVIsIFZSRUdfR1JQKTsKKwlpZiAoZ3JwIDwgMCkKKwkJcmV0dXJuIGdycDsKKworCWlmICh0d2xfY2xhc3NfaXNfNDAzMCgpKQorCQlncnAgJj0gflAxX0dSUF80MDMwOworCWVsc2UKKwkJZ3JwICY9IH5QMV9HUlBfNjAzMDsKKworCXJldHVybiB0d2xyZWdfd3JpdGUoaW5mbywgVFdMX01PRFVMRV9QTV9SRUNFSVZFUiwgVlJFR19HUlAsIGdycCk7Cit9CisKK3N0YXRpYyBpbnQgdHdscmVnX2dldF9zdGF0dXMoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCit7CisJaW50CXN0YXRlID0gdHdscmVnX2dycChyZGV2KTsKKworCWlmICh0d2xfY2xhc3NfaXNfNjAzMCgpKQorCQlyZXR1cm4gMDsgLyogRklYTUUgcmV0dXJuIGZvciA2MDMwIHJlZ3VsYXRvciAqLworCisJaWYgKHN0YXRlIDwgMCkKKwkJcmV0dXJuIHN0YXRlOworCXN0YXRlICY9IDB4MGY7CisKKwkvKiBhc3N1bWUgc3RhdGUgIT0gV0FSTV9SRVNFVDsgd2UnZCBub3QgYmUgcnVubmluZy4uLiAgKi8KKwlpZiAoIXN0YXRlKQorCQlyZXR1cm4gUkVHVUxBVE9SX1NUQVRVU19PRkY7CisJcmV0dXJuIChzdGF0ZSAmIEJJVCgzKSkKKwkJPyBSRUdVTEFUT1JfU1RBVFVTX05PUk1BTAorCQk6IFJFR1VMQVRPUl9TVEFUVVNfU1RBTkRCWTsKK30KKworc3RhdGljIGludCB0d2xyZWdfc2V0X21vZGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsIHVuc2lnbmVkIG1vZGUpCit7CisJc3RydWN0IHR3bHJlZ19pbmZvCSppbmZvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwl1bnNpZ25lZAkJbWVzc2FnZTsKKwlpbnQJCQlzdGF0dXM7CisKKwlpZiAodHdsX2NsYXNzX2lzXzYwMzAoKSkKKwkJcmV0dXJuIDA7IC8qIEZJWE1FIHJldHVybiBmb3IgNjAzMCByZWd1bGF0b3IgKi8KKworCS8qIFdlIGNhbiBvbmx5IHNldCB0aGUgbW9kZSB0aHJvdWdoIHN0YXRlIG1hY2hpbmUgY29tbWFuZHMuLi4gKi8KKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIFJFR1VMQVRPUl9NT0RFX05PUk1BTDoKKwkJbWVzc2FnZSA9IE1TR19TSU5HVUxBUihERVZfR1JQX1AxLCBpbmZvLT5pZCwgUkVTX1NUQVRFX0FDVElWRSk7CisJCWJyZWFrOworCWNhc2UgUkVHVUxBVE9SX01PREVfU1RBTkRCWToKKwkJbWVzc2FnZSA9IE1TR19TSU5HVUxBUihERVZfR1JQX1AxLCBpbmZvLT5pZCwgUkVTX1NUQVRFX1NMRUVQKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogRW5zdXJlIHRoZSByZXNvdXJjZSBpcyBhc3NvY2lhdGVkIHdpdGggc29tZSBncm91cCAqLworCXN0YXR1cyA9IHR3bHJlZ19ncnAocmRldik7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisJaWYgKCEoc3RhdHVzICYgKFAzX0dSUF80MDMwIHwgUDJfR1JQXzQwMzAgfCBQMV9HUlBfNDAzMCkpKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCXN0YXR1cyA9IHR3bF9pMmNfd3JpdGVfdTgoVFdMX01PRFVMRV9QTV9NQVNURVIsCisJCQltZXNzYWdlID4+IDgsIDB4MTUgLyogUEJfV09SRF9NU0IgKi8gKTsKKwlpZiAoc3RhdHVzID49IDApCisJCXJldHVybiBzdGF0dXM7CisKKwlyZXR1cm4gdHdsX2kyY193cml0ZV91OChUV0xfTU9EVUxFX1BNX01BU1RFUiwKKwkJCW1lc3NhZ2UsIDB4MTYgLyogUEJfV09SRF9MU0IgKi8gKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFN1cHBvcnQgZm9yIGFkanVzdGFibGUtdm9sdGFnZSBMRE9zIHVzZXMgYSBmb3VyIGJpdCAob3IgbGVzcykgdm9sdGFnZQorICogc2VsZWN0IGZpZWxkIGluIGl0cyBjb250cm9sIHJlZ2lzdGVyLiAgIFdlIHVzZSB0YWJsZXMgaW5kZXhlZCBieSBWU0VMCisgKiB0byByZWNvcmQgdm9sdGFnZXMgaW4gbWlsbGlWb2x0cy4gIChBY2N1cmFjeSBpcyBhYm91dCB0aHJlZSBwZXJjZW50LikKKyAqCisgKiBOb3RlIHRoYXQgVlNFTCB2YWx1ZXMgZm9yIFZBVVgyIGNoYW5nZWQgaW4gdHdsNTAzMCBhbmQgbmV3ZXIgc2lsaWNvbjsKKyAqIGN1cnJlbnRseSBoYW5kbGVkIGJ5IGxpc3RpbmcgdHdvIHNsaWdodGx5IGRpZmZlcmVudCBWQVVYMiByZWd1bGF0b3JzLAorICogb25seSBvbmUgb2Ygd2hpY2ggd2lsbCBiZSBjb25maWd1cmVkLgorICoKKyAqIFZTRUwgdmFsdWVzIGRvY3VtZW50ZWQgYXMgIlRJIGNhbm5vdCBzdXBwb3J0IHRoZXNlIHZhbHVlcyIgYXJlIGZsYWdnZWQKKyAqIGluIHRoZXNlIHRhYmxlcyBhcyBVTlNVUCgpIHZhbHVlczsgd2Ugbm9ybWFsbHkgd29uJ3QgYXNzaWduIHRoZW0uCisgKgorICogVkFVWDMgYXQgM1YgaXMgaW5jb3JyZWN0bHkgbGlzdGVkIGluIHNvbWUgVEkgbWFudWFscyBhcyB1bnN1cHBvcnRlZC4KKyAqIFRJIGFyZSByZXZpc2luZyB0aGUgdHdsNTAzMC90cHM2NTl4MCBzcGVjcyB0byBzdXBwb3J0IHRoYXQgMy4wViBzZXR0aW5nLgorICovCisjaWZkZWYgQ09ORklHX1RXTDQwMzBfQUxMT1dfVU5TVVBQT1JURUQKKyNkZWZpbmUgVU5TVVBfTUFTSwkweDAwMDAKKyNlbHNlCisjZGVmaW5lIFVOU1VQX01BU0sJMHg4MDAwCisjZW5kaWYKKworI2RlZmluZSBVTlNVUCh4KQkoVU5TVVBfTUFTSyB8ICh4KSkKKyNkZWZpbmUgSVNfVU5TVVAoeCkJKFVOU1VQX01BU0sgJiAoeCkpCisjZGVmaW5lIExET19NVih4KQkoflVOU1VQX01BU0sgJiAoeCkpCisKKworc3RhdGljIGNvbnN0IHUxNiBWQVVYMV9WU0VMX3RhYmxlW10gPSB7CisJVU5TVVAoMTUwMCksIFVOU1VQKDE4MDApLCAyNTAwLCAyODAwLAorCTMwMDAsIDMwMDAsIDMwMDAsIDMwMDAsCit9Oworc3RhdGljIGNvbnN0IHUxNiBWQVVYMl80MDMwX1ZTRUxfdGFibGVbXSA9IHsKKwlVTlNVUCgxMDAwKSwgVU5TVVAoMTAwMCksIFVOU1VQKDEyMDApLCAxMzAwLAorCTE1MDAsIDE4MDAsIFVOU1VQKDE4NTApLCAyNTAwLAorCVVOU1VQKDI2MDApLCAyODAwLCBVTlNVUCgyODUwKSwgVU5TVVAoMzAwMCksCisJVU5TVVAoMzE1MCksIFVOU1VQKDMxNTApLCBVTlNVUCgzMTUwKSwgVU5TVVAoMzE1MCksCit9Oworc3RhdGljIGNvbnN0IHUxNiBWQVVYMl9WU0VMX3RhYmxlW10gPSB7CisJMTcwMCwgMTcwMCwgMTkwMCwgMTMwMCwKKwkxNTAwLCAxODAwLCAyMDAwLCAyNTAwLAorCTIxMDAsIDI4MDAsIDIyMDAsIDIzMDAsCisJMjQwMCwgMjQwMCwgMjQwMCwgMjQwMCwKK307CitzdGF0aWMgY29uc3QgdTE2IFZBVVgzX1ZTRUxfdGFibGVbXSA9IHsKKwkxNTAwLCAxODAwLCAyNTAwLCAyODAwLAorCTMwMDAsIDMwMDAsIDMwMDAsIDMwMDAsCit9Oworc3RhdGljIGNvbnN0IHUxNiBWQVVYNF9WU0VMX3RhYmxlW10gPSB7CisJNzAwLCAxMDAwLCAxMjAwLCBVTlNVUCgxMzAwKSwKKwkxNTAwLCAxODAwLCBVTlNVUCgxODUwKSwgMjUwMCwKKwlVTlNVUCgyNjAwKSwgMjgwMCwgVU5TVVAoMjg1MCksIFVOU1VQKDMwMDApLAorCVVOU1VQKDMxNTApLCBVTlNVUCgzMTUwKSwgVU5TVVAoMzE1MCksIFVOU1VQKDMxNTApLAorfTsKK3N0YXRpYyBjb25zdCB1MTYgVk1NQzFfVlNFTF90YWJsZVtdID0geworCTE4NTAsIDI4NTAsIDMwMDAsIDMxNTAsCit9Oworc3RhdGljIGNvbnN0IHUxNiBWTU1DMl9WU0VMX3RhYmxlW10gPSB7CisJVU5TVVAoMTAwMCksIFVOU1VQKDEwMDApLCBVTlNVUCgxMjAwKSwgVU5TVVAoMTMwMCksCisJVU5TVVAoMTUwMCksIFVOU1VQKDE4MDApLCAxODUwLCBVTlNVUCgyNTAwKSwKKwkyNjAwLCAyODAwLCAyODUwLCAzMDAwLAorCTMxNTAsIDMxNTAsIDMxNTAsIDMxNTAsCit9Oworc3RhdGljIGNvbnN0IHUxNiBWUExMMV9WU0VMX3RhYmxlW10gPSB7CisJMTAwMCwgMTIwMCwgMTMwMCwgMTgwMCwKKwlVTlNVUCgyODAwKSwgVU5TVVAoMzAwMCksIFVOU1VQKDMwMDApLCBVTlNVUCgzMDAwKSwKK307CitzdGF0aWMgY29uc3QgdTE2IFZQTEwyX1ZTRUxfdGFibGVbXSA9IHsKKwk3MDAsIDEwMDAsIDEyMDAsIDEzMDAsCisJVU5TVVAoMTUwMCksIDE4MDAsIFVOU1VQKDE4NTApLCBVTlNVUCgyNTAwKSwKKwlVTlNVUCgyNjAwKSwgVU5TVVAoMjgwMCksIFVOU1VQKDI4NTApLCBVTlNVUCgzMDAwKSwKKwlVTlNVUCgzMTUwKSwgVU5TVVAoMzE1MCksIFVOU1VQKDMxNTApLCBVTlNVUCgzMTUwKSwKK307CitzdGF0aWMgY29uc3QgdTE2IFZTSU1fVlNFTF90YWJsZVtdID0geworCVVOU1VQKDEwMDApLCBVTlNVUCgxMjAwKSwgVU5TVVAoMTMwMCksIDE4MDAsCisJMjgwMCwgMzAwMCwgMzAwMCwgMzAwMCwKK307CitzdGF0aWMgY29uc3QgdTE2IFZEQUNfVlNFTF90YWJsZVtdID0geworCTEyMDAsIDEzMDAsIDE4MDAsIDE4MDAsCit9Oworc3RhdGljIGNvbnN0IHUxNiBWQVVYMV82MDMwX1ZTRUxfdGFibGVbXSA9IHsKKwkxMDAwLCAxMzAwLCAxODAwLCAyNTAwLAorCTI4MDAsIDI5MDAsIDMwMDAsIDMwMDAsCit9Oworc3RhdGljIGNvbnN0IHUxNiBWQVVYMl82MDMwX1ZTRUxfdGFibGVbXSA9IHsKKwkxMjAwLCAxODAwLCAyNTAwLCAyNzUwLAorCTI4MDAsIDI4MDAsIDI4MDAsIDI4MDAsCit9Oworc3RhdGljIGNvbnN0IHUxNiBWQVVYM182MDMwX1ZTRUxfdGFibGVbXSA9IHsKKwkxMDAwLCAxMjAwLCAxMzAwLCAxODAwLAorCTI1MDAsIDI4MDAsIDMwMDAsIDMwMDAsCit9Oworc3RhdGljIGNvbnN0IHUxNiBWTU1DX1ZTRUxfdGFibGVbXSA9IHsKKwkxMjAwLCAxODAwLCAyODAwLCAyOTAwLAorCTMwMDAsIDMwMDAsIDMwMDAsIDMwMDAsCit9Oworc3RhdGljIGNvbnN0IHUxNiBWUFBfVlNFTF90YWJsZVtdID0geworCTE4MDAsIDE5MDAsIDIwMDAsIDIxMDAsCisJMjIwMCwgMjMwMCwgMjQwMCwgMjUwMCwKK307CitzdGF0aWMgY29uc3QgdTE2IFZVU0lNX1ZTRUxfdGFibGVbXSA9IHsKKwkxMjAwLCAxODAwLCAyNTAwLCAyOTAwLAorfTsKKworc3RhdGljIGludCB0d2xsZG9fbGlzdF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LCB1bnNpZ25lZCBpbmRleCkKK3sKKwlzdHJ1Y3QgdHdscmVnX2luZm8JKmluZm8gPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCWludAkJCW1WID0gaW5mby0+dGFibGVbaW5kZXhdOworCisJcmV0dXJuIElTX1VOU1VQKG1WKSA/IDAgOiAoTERPX01WKG1WKSAqIDEwMDApOworfQorCitzdGF0aWMgaW50Cit0d2xsZG9fc2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsIGludCBtaW5fdVYsIGludCBtYXhfdVYpCit7CisJc3RydWN0IHR3bHJlZ19pbmZvCSppbmZvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlpbnQJCQl2c2VsOworCisJZm9yICh2c2VsID0gMDsgdnNlbCA8IGluZm8tPnRhYmxlX2xlbjsgdnNlbCsrKSB7CisJCWludCBtViA9IGluZm8tPnRhYmxlW3ZzZWxdOworCQlpbnQgdVY7CisKKwkJaWYgKElTX1VOU1VQKG1WKSkKKwkJCWNvbnRpbnVlOworCQl1ViA9IExET19NVihtVikgKiAxMDAwOworCisJCS8qIFJFVklTSVQgZm9yIFZBVVgyLCBmaXJzdCBtYXRjaCBtYXkgbm90IGJlIGJlc3QvbG93ZXN0ICovCisKKwkJLyogdXNlIHRoZSBmaXJzdCBpbi1yYW5nZSB2YWx1ZSAqLworCQlpZiAobWluX3VWIDw9IHVWICYmIHVWIDw9IG1heF91VikKKwkJCXJldHVybiB0d2xyZWdfd3JpdGUoaW5mbywgVFdMX01PRFVMRV9QTV9SRUNFSVZFUiwKKwkJCQkJCQlWUkVHX1ZPTFRBR0UsIHZzZWwpOworCX0KKworCXJldHVybiAtRURPTTsKK30KKworc3RhdGljIGludCB0d2xsZG9fZ2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCit7CisJc3RydWN0IHR3bHJlZ19pbmZvCSppbmZvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlpbnQJCXZzZWwgPSB0d2xyZWdfcmVhZChpbmZvLCBUV0xfTU9EVUxFX1BNX1JFQ0VJVkVSLAorCQkJCQkJCQlWUkVHX1ZPTFRBR0UpOworCisJaWYgKHZzZWwgPCAwKQorCQlyZXR1cm4gdnNlbDsKKworCXZzZWwgJj0gaW5mby0+dGFibGVfbGVuIC0gMTsKKwlyZXR1cm4gTERPX01WKGluZm8tPnRhYmxlW3ZzZWxdKSAqIDEwMDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyB0d2xsZG9fb3BzID0geworCS5saXN0X3ZvbHRhZ2UJPSB0d2xsZG9fbGlzdF92b2x0YWdlLAorCisJLnNldF92b2x0YWdlCT0gdHdsbGRvX3NldF92b2x0YWdlLAorCS5nZXRfdm9sdGFnZQk9IHR3bGxkb19nZXRfdm9sdGFnZSwKKworCS5lbmFibGUJCT0gdHdscmVnX2VuYWJsZSwKKwkuZGlzYWJsZQk9IHR3bHJlZ19kaXNhYmxlLAorCS5pc19lbmFibGVkCT0gdHdscmVnX2lzX2VuYWJsZWQsCisKKwkuc2V0X21vZGUJPSB0d2xyZWdfc2V0X21vZGUsCisKKwkuZ2V0X3N0YXR1cwk9IHR3bHJlZ19nZXRfc3RhdHVzLAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIEZpeGVkIHZvbHRhZ2UgTERPcyBkb24ndCBoYXZlIGEgVlNFTCBmaWVsZCB0byB1cGRhdGUuCisgKi8KK3N0YXRpYyBpbnQgdHdsZml4ZWRfbGlzdF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LCB1bnNpZ25lZCBpbmRleCkKK3sKKwlzdHJ1Y3QgdHdscmVnX2luZm8JKmluZm8gPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCisJcmV0dXJuIGluZm8tPm1pbl9tViAqIDEwMDA7Cit9CisKK3N0YXRpYyBpbnQgdHdsZml4ZWRfZ2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCit7CisJc3RydWN0IHR3bHJlZ19pbmZvCSppbmZvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKworCXJldHVybiBpbmZvLT5taW5fbVYgKiAxMDAwOworfQorCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgdHdsZml4ZWRfb3BzID0geworCS5saXN0X3ZvbHRhZ2UJPSB0d2xmaXhlZF9saXN0X3ZvbHRhZ2UsCisKKwkuZ2V0X3ZvbHRhZ2UJPSB0d2xmaXhlZF9nZXRfdm9sdGFnZSwKKworCS5lbmFibGUJCT0gdHdscmVnX2VuYWJsZSwKKwkuZGlzYWJsZQk9IHR3bHJlZ19kaXNhYmxlLAorCS5pc19lbmFibGVkCT0gdHdscmVnX2lzX2VuYWJsZWQsCisKKwkuc2V0X21vZGUJPSB0d2xyZWdfc2V0X21vZGUsCisKKwkuZ2V0X3N0YXR1cwk9IHR3bHJlZ19nZXRfc3RhdHVzLAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBUV0w0MDMwX0FESlVTVEFCTEVfTERPKGxhYmVsLCBvZmZzZXQsIG51bSkgXAorCQlUV0xfQURKVVNUQUJMRV9MRE8obGFiZWwsIG9mZnNldCwgbnVtLCBUV0w0MDMwKQorI2RlZmluZSBUV0w0MDMwX0ZJWEVEX0xETyhsYWJlbCwgb2Zmc2V0LCBtVm9sdHMsIG51bSkgXAorCQlUV0xfRklYRURfTERPKGxhYmVsLCBvZmZzZXQsIG1Wb2x0cywgbnVtLCBUV0w0MDMwKQorI2RlZmluZSBUV0w2MDMwX0FESlVTVEFCTEVfTERPKGxhYmVsLCBvZmZzZXQsIG51bSkgXAorCQlUV0xfQURKVVNUQUJMRV9MRE8obGFiZWwsIG9mZnNldCwgbnVtLCBUV0w2MDMwKQorI2RlZmluZSBUV0w2MDMwX0ZJWEVEX0xETyhsYWJlbCwgb2Zmc2V0LCBtVm9sdHMsIG51bSkgXAorCQlUV0xfRklYRURfTERPKGxhYmVsLCBvZmZzZXQsIG1Wb2x0cywgbnVtLCBUV0w2MDMwKQorCisjZGVmaW5lIFRXTF9BREpVU1RBQkxFX0xETyhsYWJlbCwgb2Zmc2V0LCBudW0sIGZhbWlseSkgeyBcCisJLmJhc2UgPSBvZmZzZXQsIFwKKwkuaWQgPSBudW0sIFwKKwkudGFibGVfbGVuID0gQVJSQVlfU0laRShsYWJlbCMjX1ZTRUxfdGFibGUpLCBcCisJLnRhYmxlID0gbGFiZWwjI19WU0VMX3RhYmxlLCBcCisJLmRlc2MgPSB7IFwKKwkJLm5hbWUgPSAjbGFiZWwsIFwKKwkJLmlkID0gZmFtaWx5IyNfUkVHXyMjbGFiZWwsIFwKKwkJLm5fdm9sdGFnZXMgPSBBUlJBWV9TSVpFKGxhYmVsIyNfVlNFTF90YWJsZSksIFwKKwkJLm9wcyA9ICZ0d2xsZG9fb3BzLCBcCisJCS50eXBlID0gUkVHVUxBVE9SX1ZPTFRBR0UsIFwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsIFwKKwkJfSwgXAorCX0KKworI2RlZmluZSBUV0xfRklYRURfTERPKGxhYmVsLCBvZmZzZXQsIG1Wb2x0cywgbnVtLCBmYW1pbHkpIHsgXAorCS5iYXNlID0gb2Zmc2V0LCBcCisJLmlkID0gbnVtLCBcCisJLm1pbl9tViA9IG1Wb2x0cywgXAorCS5kZXNjID0geyBcCisJCS5uYW1lID0gI2xhYmVsLCBcCisJCS5pZCA9IGZhbWlseSMjX1JFR18jI2xhYmVsLCBcCisJCS5uX3ZvbHRhZ2VzID0gMSwgXAorCQkub3BzID0gJnR3bGZpeGVkX29wcywgXAorCQkudHlwZSA9IFJFR1VMQVRPUl9WT0xUQUdFLCBcCisJCS5vd25lciA9IFRISVNfTU9EVUxFLCBcCisJCX0sIFwKKwl9CisKKy8qCisgKiBXZSBsaXN0IHJlZ3VsYXRvcnMgaGVyZSBpZiBzeXN0ZW1zIG5lZWQgc29tZSBsZXZlbCBvZgorICogc29mdHdhcmUgY29udHJvbCBvdmVyIHRoZW0gYWZ0ZXIgYm9vdC4KKyAqLworc3RhdGljIHN0cnVjdCB0d2xyZWdfaW5mbyB0d2xfcmVnc1tdID0geworCVRXTDQwMzBfQURKVVNUQUJMRV9MRE8oVkFVWDEsIDB4MTcsIDEpLAorCVRXTDQwMzBfQURKVVNUQUJMRV9MRE8oVkFVWDJfNDAzMCwgMHgxYiwgMiksCisJVFdMNDAzMF9BREpVU1RBQkxFX0xETyhWQVVYMiwgMHgxYiwgMiksCisJVFdMNDAzMF9BREpVU1RBQkxFX0xETyhWQVVYMywgMHgxZiwgMyksCisJVFdMNDAzMF9BREpVU1RBQkxFX0xETyhWQVVYNCwgMHgyMywgNCksCisJVFdMNDAzMF9BREpVU1RBQkxFX0xETyhWTU1DMSwgMHgyNywgNSksCisJVFdMNDAzMF9BREpVU1RBQkxFX0xETyhWTU1DMiwgMHgyYiwgNiksCisJLyoKKwlUV0w0MDMwX0FESlVTVEFCTEVfTERPKFZQTEwxLCAweDJmLCA3KSwKKwkqLworCVRXTDQwMzBfQURKVVNUQUJMRV9MRE8oVlBMTDIsIDB4MzMsIDgpLAorCVRXTDQwMzBfQURKVVNUQUJMRV9MRE8oVlNJTSwgMHgzNywgOSksCisJVFdMNDAzMF9BREpVU1RBQkxFX0xETyhWREFDLCAweDNiLCAxMCksCisJLyoKKwlUV0w0MDMwX0FESlVTVEFCTEVfTERPKFZJTlRBTkExLCAweDNmLCAxMSksCisJVFdMNDAzMF9BREpVU1RBQkxFX0xETyhWSU5UQU5BMiwgMHg0MywgMTIpLAorCVRXTDQwMzBfQURKVVNUQUJMRV9MRE8oVklOVERJRywgMHg0NywgMTMpLAorCVRXTDQwMzBfU01QUyhWSU8sIDB4NGIsIDE0KSwKKwlUV0w0MDMwX1NNUFMoVkREMSwgMHg1NSwgMTUpLAorCVRXTDQwMzBfU01QUyhWREQyLCAweDYzLCAxNiksCisJICovCisJVFdMNDAzMF9GSVhFRF9MRE8oVlVTQjFWNSwgMHg3MSwgMTUwMCwgMTcpLAorCVRXTDQwMzBfRklYRURfTERPKFZVU0IxVjgsIDB4NzQsIDE4MDAsIDE4KSwKKwlUV0w0MDMwX0ZJWEVEX0xETyhWVVNCM1YxLCAweDc3LCAzMTAwLCAxOSksCisJLyogVlVTQkNQIGlzIG1hbmFnZWQgKm9ubHkqIGJ5IHRoZSBVU0Igc3ViY2hpcCAqLworCisJLyogNjAzMCBSRUcgd2l0aCBiYXNlIGFzIFBNQyBTbGF2ZSBNaXNjIDogMHgwMDMwICovCisJVFdMNjAzMF9BREpVU1RBQkxFX0xETyhWQVVYMV82MDMwLCAweDU0LCAxKSwKKwlUV0w2MDMwX0FESlVTVEFCTEVfTERPKFZBVVgyXzYwMzAsIDB4NTgsIDIpLAorCVRXTDYwMzBfQURKVVNUQUJMRV9MRE8oVkFVWDNfNjAzMCwgMHg1YywgMyksCisJVFdMNjAzMF9BREpVU1RBQkxFX0xETyhWTU1DLCAweDY4LCA0KSwKKwlUV0w2MDMwX0FESlVTVEFCTEVfTERPKFZQUCwgMHg2YywgNSksCisJVFdMNjAzMF9BREpVU1RBQkxFX0xETyhWVVNJTSwgMHg3NCwgNyksCisJVFdMNjAzMF9GSVhFRF9MRE8oVkFOQSwgMHg1MCwgMjEwMCwgMTUpLAorCVRXTDYwMzBfRklYRURfTERPKFZDWElPLCAweDYwLCAxODAwLCAxNiksCisJVFdMNjAzMF9GSVhFRF9MRE8oVkRBQywgMHg2NCwgMTgwMCwgMTcpLAorCVRXTDYwMzBfRklYRURfTERPKFZVU0IsIDB4NzAsIDMzMDAsIDE4KQorfTsKKworc3RhdGljIGludCB0d2xyZWdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQJCQkJaTsKKwlzdHJ1Y3QgdHdscmVnX2luZm8JCSppbmZvOworCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhCSppbml0ZGF0YTsKKwlzdHJ1Y3QgcmVndWxhdGlvbl9jb25zdHJhaW50cwkqYzsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldgkJKnJkZXY7CisKKwlmb3IgKGkgPSAwLCBpbmZvID0gTlVMTDsgaSA8IEFSUkFZX1NJWkUodHdsX3JlZ3MpOyBpKyspIHsKKwkJaWYgKHR3bF9yZWdzW2ldLmRlc2MuaWQgIT0gcGRldi0+aWQpCisJCQljb250aW51ZTsKKwkJaW5mbyA9IHR3bF9yZWdzICsgaTsKKwkJYnJlYWs7CisJfQorCWlmICghaW5mbykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpbml0ZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmICghaW5pdGRhdGEpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQ29uc3RyYWluIGJvYXJkLXNwZWNpZmljIGNhcGFiaWxpdGllcyBhY2NvcmRpbmcgdG8gd2hhdAorCSAqIHRoaXMgZHJpdmVyIGFuZCB0aGUgY2hpcCBpdHNlbGYgY2FuIGFjdHVhbGx5IGRvLgorCSAqLworCWMgPSAmaW5pdGRhdGEtPmNvbnN0cmFpbnRzOworCWMtPnZhbGlkX21vZGVzX21hc2sgJj0gUkVHVUxBVE9SX01PREVfTk9STUFMIHwgUkVHVUxBVE9SX01PREVfU1RBTkRCWTsKKwljLT52YWxpZF9vcHNfbWFzayAmPSBSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0UKKwkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQorCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVM7CisKKwlyZGV2ID0gcmVndWxhdG9yX3JlZ2lzdGVyKCZpbmZvLT5kZXNjLCAmcGRldi0+ZGV2LCBpbml0ZGF0YSwgaW5mbyk7CisJaWYgKElTX0VSUihyZGV2KSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCByZWdpc3RlciAlcywgJWxkXG4iLAorCQkJCWluZm8tPmRlc2MubmFtZSwgUFRSX0VSUihyZGV2KSk7CisJCXJldHVybiBQVFJfRVJSKHJkZXYpOworCX0KKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCByZGV2KTsKKworCS8qIE5PVEU6ICBtYW55IHJlZ3VsYXRvcnMgc3VwcG9ydCBzaG9ydC1jaXJjdWl0IElSUXMgKHByZXNlbnRhYmxlCisJICogYXMgUkVHVUxBVE9SX09WRVJfQ1VSUkVOVCBub3RpZmljYXRpb25zPykgY29uZmlndXJlZCB2aWE6CisJICogIC0gU0NfQ09ORklHCisJICogIC0gU0NfREVURUNUMSAodmludGFuYTIsIHZtbWMxLzIsIHZhdXgxLzIvMy80KQorCSAqICAtIFNDX0RFVEVDVDIgKHZ1c2IsIHZkYWMsIHZpbywgdmRkMS8yLCB2cGxsMikKKwkgKiAgLSBJVF9DT05GSUcKKwkgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCB0d2xyZWdfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmVndWxhdG9yX3VucmVnaXN0ZXIocGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldikpOworCXJldHVybiAwOworfQorCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnR3bF9yZWciKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdHdscmVnX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gdHdscmVnX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AodHdscmVnX3JlbW92ZSksCisJLyogTk9URTogc2hvcnQgbmFtZSwgdG8gd29yayBhcm91bmQgZHJpdmVyIG1vZGVsIHRydW5jYXRpb24gb2YKKwkgKiAidHdsX3JlZ3VsYXRvci4xMiIgKGFuZCBmcmllbmRzKSB0byAidHdsX3JlZ3VsYXRvci4xIi4KKwkgKi8KKwkuZHJpdmVyLm5hbWUJPSAidHdsX3JlZyIsCisJLmRyaXZlci5vd25lcgk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdHdscmVnX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ0d2xyZWdfZHJpdmVyKTsKK30KK3N1YnN5c19pbml0Y2FsbCh0d2xyZWdfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0d2xyZWdfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0d2xyZWdfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHR3bHJlZ19leGl0KQorCitNT0RVTEVfREVTQ1JJUFRJT04oIlRXTCByZWd1bGF0b3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci90d2w0MDMwLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvdHdsNDAzMC1yZWd1bGF0b3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIwMzJmYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci90d2w0MDMwLXJlZ3VsYXRvci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTAwICswLDAgQEAKLS8qCi0gKiB0d2w0MDMwLXJlZ3VsYXRvci5jIC0tIHN1cHBvcnQgcmVndWxhdG9ycyBpbiB0d2w0MDMwIGZhbWlseSBjaGlwcwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBEYXZpZCBCcm93bmVsbAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMvdHdsNDAzMC5oPgotCi0KLS8qCi0gKiBUaGUgVFdMNDAzMC9UVzUwMzAvVFBTNjU5eDAgZmFtaWx5IGNoaXBzIGluY2x1ZGUgcG93ZXIgbWFuYWdlbWVudCwgYQotICogVVNCIE9URyB0cmFuc2NlaXZlciwgYW4gUlRDLCBBREMsIFBXTSwgYW5kIGxvdHMgbW9yZS4gIFNvbWUgdmVyc2lvbnMKLSAqIGluY2x1ZGUgYW4gYXVkaW8gY29kZWMsIGJhdHRlcnkgY2hhcmdlciwgYW5kIG1vcmUgdm9sdGFnZSByZWd1bGF0b3JzLgotICogVGhlc2UgY2hpcHMgYXJlIG9mdGVuIHVzZWQgaW4gT01BUC1iYXNlZCBzeXN0ZW1zLgotICoKLSAqIFRoaXMgZHJpdmVyIGltcGxlbWVudHMgc29mdHdhcmUtYmFzZWQgcmVzb3VyY2UgY29udHJvbCBmb3IgdmFyaW91cwotICogdm9sdGFnZSByZWd1bGF0b3JzLiAgVGhpcyBpcyB1c3VhbGx5IGF1Z21lbnRlZCB3aXRoIHN0YXRlIG1hY2hpbmUKLSAqIGJhc2VkIGNvbnRyb2wuCi0gKi8KLQotc3RydWN0IHR3bHJlZ19pbmZvIHsKLQkvKiBzdGFydCBvZiByZWd1bGF0b3IncyBQTV9SRUNFSVZFUiBjb250cm9sIHJlZ2lzdGVyIGJhbmsgKi8KLQl1OAkJCWJhc2U7Ci0KLQkvKiB0d2w0MDMwIHJlc291cmNlIElELCBmb3IgcmVzb3VyY2UgY29udHJvbCBzdGF0ZSBtYWNoaW5lICovCi0JdTgJCQlpZDsKLQotCS8qIHZvbHRhZ2UgaW4gbVYgPSB0YWJsZVtWU0VMXTsgdGFibGVfbGVuIG11c3QgYmUgYSBwb3dlci1vZi10d28gKi8KLQl1OAkJCXRhYmxlX2xlbjsKLQljb25zdCB1MTYJCSp0YWJsZTsKLQotCS8qIGNoaXAgY29uc3RyYWludHMgb24gcmVndWxhdG9yIGJlaGF2aW9yICovCi0JdTE2CQkJbWluX21WOwotCi0JLyogdXNlZCBieSByZWd1bGF0b3IgY29yZSAqLwotCXN0cnVjdCByZWd1bGF0b3JfZGVzYwlkZXNjOwotfTsKLQotCi0vKiBMRE8gY29udHJvbCByZWdpc3RlcnMgLi4uIG9mZnNldCBpcyBmcm9tIHRoZSBiYXNlIG9mIGl0cyByZWdpc3RlciBiYW5rLgotICogVGhlIGZpcnN0IHRocmVlIHJlZ2lzdGVycyBvZiBhbGwgcG93ZXIgcmVzb3VyY2UgYmFua3MgaGVscCBoYXJkd2FyZSB0bwotICogbWFuYWdlIHRoZSB2YXJpb3VzIHJlc291cmNlIGdyb3Vwcy4KLSAqLwotI2RlZmluZSBWUkVHX0dSUAkJMAotI2RlZmluZSBWUkVHX1RZUEUJCTEKLSNkZWZpbmUgVlJFR19SRU1BUAkJMgotI2RlZmluZSBWUkVHX0RFRElDQVRFRAkJMwkvKiBMRE8gY29udHJvbCAqLwotCi0KLXN0YXRpYyBpbmxpbmUgaW50Ci10d2w0MDMwcmVnX3JlYWQoc3RydWN0IHR3bHJlZ19pbmZvICppbmZvLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0JdTggdmFsdWU7Ci0JaW50IHN0YXR1czsKLQotCXN0YXR1cyA9IHR3bDQwMzBfaTJjX3JlYWRfdTgoVFdMNDAzMF9NT0RVTEVfUE1fUkVDRUlWRVIsCi0JCQkmdmFsdWUsIGluZm8tPmJhc2UgKyBvZmZzZXQpOwotCXJldHVybiAoc3RhdHVzIDwgMCkgPyBzdGF0dXMgOiB2YWx1ZTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLXR3bDQwMzByZWdfd3JpdGUoc3RydWN0IHR3bHJlZ19pbmZvICppbmZvLCB1bnNpZ25lZCBvZmZzZXQsIHU4IHZhbHVlKQotewotCXJldHVybiB0d2w0MDMwX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9SRUNFSVZFUiwKLQkJCXZhbHVlLCBpbmZvLT5iYXNlICsgb2Zmc2V0KTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogZ2VuZXJpYyBwb3dlciByZXNvdXJjZSBvcGVyYXRpb25zLCB3aGljaCB3b3JrIG9uIGFsbCByZWd1bGF0b3JzICovCi0KLXN0YXRpYyBpbnQgdHdsNDAzMHJlZ19ncnAoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCi17Ci0JcmV0dXJuIHR3bDQwMzByZWdfcmVhZChyZGV2X2dldF9kcnZkYXRhKHJkZXYpLCBWUkVHX0dSUCk7Ci19Ci0KLS8qCi0gKiBFbmFibGUvZGlzYWJsZSByZWd1bGF0b3JzIGJ5IGpvaW5pbmcvbGVhdmluZyB0aGUgUDEgKHByb2Nlc3NvcikgZ3JvdXAuCi0gKiBXZSBhc3N1bWUgbm9ib2R5IGVsc2UgaXMgdXBkYXRpbmcgdGhlIERFVl9HUlAgcmVnaXN0ZXJzLgotICovCi0KLSNkZWZpbmUgUDNfR1JQCQlCSVQoNykJCS8qICJwZXJpcGhlcmFscyIgKi8KLSNkZWZpbmUgUDJfR1JQCQlCSVQoNikJCS8qIHNlY29uZGFyeSBwcm9jZXNzb3IsIG1vZGVtLCBldGMgKi8KLSNkZWZpbmUgUDFfR1JQCQlCSVQoNSkJCS8qIENQVS9MaW51eCAqLwotCi1zdGF0aWMgaW50IHR3bDQwMzByZWdfaXNfZW5hYmxlZChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKLXsKLQlpbnQJc3RhdGUgPSB0d2w0MDMwcmVnX2dycChyZGV2KTsKLQotCWlmIChzdGF0ZSA8IDApCi0JCXJldHVybiBzdGF0ZTsKLQotCXJldHVybiAoc3RhdGUgJiBQMV9HUlApICE9IDA7Ci19Ci0KLXN0YXRpYyBpbnQgdHdsNDAzMHJlZ19lbmFibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCi17Ci0Jc3RydWN0IHR3bHJlZ19pbmZvCSppbmZvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKLQlpbnQJCQlncnA7Ci0KLQlncnAgPSB0d2w0MDMwcmVnX3JlYWQoaW5mbywgVlJFR19HUlApOwotCWlmIChncnAgPCAwKQotCQlyZXR1cm4gZ3JwOwotCi0JZ3JwIHw9IFAxX0dSUDsKLQlyZXR1cm4gdHdsNDAzMHJlZ193cml0ZShpbmZvLCBWUkVHX0dSUCwgZ3JwKTsKLX0KLQotc3RhdGljIGludCB0d2w0MDMwcmVnX2Rpc2FibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCi17Ci0Jc3RydWN0IHR3bHJlZ19pbmZvCSppbmZvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKLQlpbnQJCQlncnA7Ci0KLQlncnAgPSB0d2w0MDMwcmVnX3JlYWQoaW5mbywgVlJFR19HUlApOwotCWlmIChncnAgPCAwKQotCQlyZXR1cm4gZ3JwOwotCi0JZ3JwICY9IH5QMV9HUlA7Ci0JcmV0dXJuIHR3bDQwMzByZWdfd3JpdGUoaW5mbywgVlJFR19HUlAsIGdycCk7Ci19Ci0KLXN0YXRpYyBpbnQgdHdsNDAzMHJlZ19nZXRfc3RhdHVzKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQotewotCWludAlzdGF0ZSA9IHR3bDQwMzByZWdfZ3JwKHJkZXYpOwotCi0JaWYgKHN0YXRlIDwgMCkKLQkJcmV0dXJuIHN0YXRlOwotCXN0YXRlICY9IDB4MGY7Ci0KLQkvKiBhc3N1bWUgc3RhdGUgIT0gV0FSTV9SRVNFVDsgd2UnZCBub3QgYmUgcnVubmluZy4uLiAgKi8KLQlpZiAoIXN0YXRlKQotCQlyZXR1cm4gUkVHVUxBVE9SX1NUQVRVU19PRkY7Ci0JcmV0dXJuIChzdGF0ZSAmIEJJVCgzKSkKLQkJPyBSRUdVTEFUT1JfU1RBVFVTX05PUk1BTAotCQk6IFJFR1VMQVRPUl9TVEFUVVNfU1RBTkRCWTsKLX0KLQotc3RhdGljIGludCB0d2w0MDMwcmVnX3NldF9tb2RlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LCB1bnNpZ25lZCBtb2RlKQotewotCXN0cnVjdCB0d2xyZWdfaW5mbwkqaW5mbyA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7Ci0JdW5zaWduZWQJCW1lc3NhZ2U7Ci0JaW50CQkJc3RhdHVzOwotCi0JLyogV2UgY2FuIG9ubHkgc2V0IHRoZSBtb2RlIHRocm91Z2ggc3RhdGUgbWFjaGluZSBjb21tYW5kcy4uLiAqLwotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgUkVHVUxBVE9SX01PREVfTk9STUFMOgotCQltZXNzYWdlID0gTVNHX1NJTkdVTEFSKERFVl9HUlBfUDEsIGluZm8tPmlkLCBSRVNfU1RBVEVfQUNUSVZFKTsKLQkJYnJlYWs7Ci0JY2FzZSBSRUdVTEFUT1JfTU9ERV9TVEFOREJZOgotCQltZXNzYWdlID0gTVNHX1NJTkdVTEFSKERFVl9HUlBfUDEsIGluZm8tPmlkLCBSRVNfU1RBVEVfU0xFRVApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBFbnN1cmUgdGhlIHJlc291cmNlIGlzIGFzc29jaWF0ZWQgd2l0aCBzb21lIGdyb3VwICovCi0Jc3RhdHVzID0gdHdsNDAzMHJlZ19ncnAocmRldik7Ci0JaWYgKHN0YXR1cyA8IDApCi0JCXJldHVybiBzdGF0dXM7Ci0JaWYgKCEoc3RhdHVzICYgKFAzX0dSUCB8IFAyX0dSUCB8IFAxX0dSUCkpKQotCQlyZXR1cm4gLUVBQ0NFUzsKLQotCXN0YXR1cyA9IHR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX01BU1RFUiwKLQkJCW1lc3NhZ2UgPj4gOCwgMHgxNSAvKiBQQl9XT1JEX01TQiAqLyApOwotCWlmIChzdGF0dXMgPj0gMCkKLQkJcmV0dXJuIHN0YXR1czsKLQotCXJldHVybiB0d2w0MDMwX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9NQVNURVIsCi0JCQltZXNzYWdlLCAweDE2IC8qIFBCX1dPUkRfTFNCICovICk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0gKiBTdXBwb3J0IGZvciBhZGp1c3RhYmxlLXZvbHRhZ2UgTERPcyB1c2VzIGEgZm91ciBiaXQgKG9yIGxlc3MpIHZvbHRhZ2UKLSAqIHNlbGVjdCBmaWVsZCBpbiBpdHMgY29udHJvbCByZWdpc3Rlci4gICBXZSB1c2UgdGFibGVzIGluZGV4ZWQgYnkgVlNFTAotICogdG8gcmVjb3JkIHZvbHRhZ2VzIGluIG1pbGxpVm9sdHMuICAoQWNjdXJhY3kgaXMgYWJvdXQgdGhyZWUgcGVyY2VudC4pCi0gKgotICogTm90ZSB0aGF0IFZTRUwgdmFsdWVzIGZvciBWQVVYMiBjaGFuZ2VkIGluIHR3bDUwMzAgYW5kIG5ld2VyIHNpbGljb247Ci0gKiBjdXJyZW50bHkgaGFuZGxlZCBieSBsaXN0aW5nIHR3byBzbGlnaHRseSBkaWZmZXJlbnQgVkFVWDIgcmVndWxhdG9ycywKLSAqIG9ubHkgb25lIG9mIHdoaWNoIHdpbGwgYmUgY29uZmlndXJlZC4KLSAqCi0gKiBWU0VMIHZhbHVlcyBkb2N1bWVudGVkIGFzICJUSSBjYW5ub3Qgc3VwcG9ydCB0aGVzZSB2YWx1ZXMiIGFyZSBmbGFnZ2VkCi0gKiBpbiB0aGVzZSB0YWJsZXMgYXMgVU5TVVAoKSB2YWx1ZXM7IHdlIG5vcm1hbGx5IHdvbid0IGFzc2lnbiB0aGVtLgotICoKLSAqIFZBVVgzIGF0IDNWIGlzIGluY29ycmVjdGx5IGxpc3RlZCBpbiBzb21lIFRJIG1hbnVhbHMgYXMgdW5zdXBwb3J0ZWQuCi0gKiBUSSBhcmUgcmV2aXNpbmcgdGhlIHR3bDUwMzAvdHBzNjU5eDAgc3BlY3MgdG8gc3VwcG9ydCB0aGF0IDMuMFYgc2V0dGluZy4KLSAqLwotI2lmZGVmIENPTkZJR19UV0w0MDMwX0FMTE9XX1VOU1VQUE9SVEVECi0jZGVmaW5lIFVOU1VQX01BU0sJMHgwMDAwCi0jZWxzZQotI2RlZmluZSBVTlNVUF9NQVNLCTB4ODAwMAotI2VuZGlmCi0KLSNkZWZpbmUgVU5TVVAoeCkJKFVOU1VQX01BU0sgfCAoeCkpCi0jZGVmaW5lIElTX1VOU1VQKHgpCShVTlNVUF9NQVNLICYgKHgpKQotI2RlZmluZSBMRE9fTVYoeCkJKH5VTlNVUF9NQVNLICYgKHgpKQotCi0KLXN0YXRpYyBjb25zdCB1MTYgVkFVWDFfVlNFTF90YWJsZVtdID0gewotCVVOU1VQKDE1MDApLCBVTlNVUCgxODAwKSwgMjUwMCwgMjgwMCwKLQkzMDAwLCAzMDAwLCAzMDAwLCAzMDAwLAotfTsKLXN0YXRpYyBjb25zdCB1MTYgVkFVWDJfNDAzMF9WU0VMX3RhYmxlW10gPSB7Ci0JVU5TVVAoMTAwMCksIFVOU1VQKDEwMDApLCBVTlNVUCgxMjAwKSwgMTMwMCwKLQkxNTAwLCAxODAwLCBVTlNVUCgxODUwKSwgMjUwMCwKLQlVTlNVUCgyNjAwKSwgMjgwMCwgVU5TVVAoMjg1MCksIFVOU1VQKDMwMDApLAotCVVOU1VQKDMxNTApLCBVTlNVUCgzMTUwKSwgVU5TVVAoMzE1MCksIFVOU1VQKDMxNTApLAotfTsKLXN0YXRpYyBjb25zdCB1MTYgVkFVWDJfVlNFTF90YWJsZVtdID0gewotCTE3MDAsIDE3MDAsIDE5MDAsIDEzMDAsCi0JMTUwMCwgMTgwMCwgMjAwMCwgMjUwMCwKLQkyMTAwLCAyODAwLCAyMjAwLCAyMzAwLAotCTI0MDAsIDI0MDAsIDI0MDAsIDI0MDAsCi19Owotc3RhdGljIGNvbnN0IHUxNiBWQVVYM19WU0VMX3RhYmxlW10gPSB7Ci0JMTUwMCwgMTgwMCwgMjUwMCwgMjgwMCwKLQkzMDAwLCAzMDAwLCAzMDAwLCAzMDAwLAotfTsKLXN0YXRpYyBjb25zdCB1MTYgVkFVWDRfVlNFTF90YWJsZVtdID0gewotCTcwMCwgMTAwMCwgMTIwMCwgVU5TVVAoMTMwMCksCi0JMTUwMCwgMTgwMCwgVU5TVVAoMTg1MCksIDI1MDAsCi0JVU5TVVAoMjYwMCksIDI4MDAsIFVOU1VQKDI4NTApLCBVTlNVUCgzMDAwKSwKLQlVTlNVUCgzMTUwKSwgVU5TVVAoMzE1MCksIFVOU1VQKDMxNTApLCBVTlNVUCgzMTUwKSwKLX07Ci1zdGF0aWMgY29uc3QgdTE2IFZNTUMxX1ZTRUxfdGFibGVbXSA9IHsKLQkxODUwLCAyODUwLCAzMDAwLCAzMTUwLAotfTsKLXN0YXRpYyBjb25zdCB1MTYgVk1NQzJfVlNFTF90YWJsZVtdID0gewotCVVOU1VQKDEwMDApLCBVTlNVUCgxMDAwKSwgVU5TVVAoMTIwMCksIFVOU1VQKDEzMDApLAotCVVOU1VQKDE1MDApLCBVTlNVUCgxODAwKSwgMTg1MCwgVU5TVVAoMjUwMCksCi0JMjYwMCwgMjgwMCwgMjg1MCwgMzAwMCwKLQkzMTUwLCAzMTUwLCAzMTUwLCAzMTUwLAotfTsKLXN0YXRpYyBjb25zdCB1MTYgVlBMTDFfVlNFTF90YWJsZVtdID0gewotCTEwMDAsIDEyMDAsIDEzMDAsIDE4MDAsCi0JVU5TVVAoMjgwMCksIFVOU1VQKDMwMDApLCBVTlNVUCgzMDAwKSwgVU5TVVAoMzAwMCksCi19Owotc3RhdGljIGNvbnN0IHUxNiBWUExMMl9WU0VMX3RhYmxlW10gPSB7Ci0JNzAwLCAxMDAwLCAxMjAwLCAxMzAwLAotCVVOU1VQKDE1MDApLCAxODAwLCBVTlNVUCgxODUwKSwgVU5TVVAoMjUwMCksCi0JVU5TVVAoMjYwMCksIFVOU1VQKDI4MDApLCBVTlNVUCgyODUwKSwgVU5TVVAoMzAwMCksCi0JVU5TVVAoMzE1MCksIFVOU1VQKDMxNTApLCBVTlNVUCgzMTUwKSwgVU5TVVAoMzE1MCksCi19Owotc3RhdGljIGNvbnN0IHUxNiBWU0lNX1ZTRUxfdGFibGVbXSA9IHsKLQlVTlNVUCgxMDAwKSwgVU5TVVAoMTIwMCksIFVOU1VQKDEzMDApLCAxODAwLAotCTI4MDAsIDMwMDAsIDMwMDAsIDMwMDAsCi19Owotc3RhdGljIGNvbnN0IHUxNiBWREFDX1ZTRUxfdGFibGVbXSA9IHsKLQkxMjAwLCAxMzAwLCAxODAwLCAxODAwLAotfTsKLQotCi1zdGF0aWMgaW50IHR3bDQwMzBsZG9fbGlzdF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LCB1bnNpZ25lZCBpbmRleCkKLXsKLQlzdHJ1Y3QgdHdscmVnX2luZm8JKmluZm8gPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwotCWludAkJCW1WID0gaW5mby0+dGFibGVbaW5kZXhdOwotCi0JcmV0dXJuIElTX1VOU1VQKG1WKSA/IDAgOiAoTERPX01WKG1WKSAqIDEwMDApOwotfQotCi1zdGF0aWMgaW50Ci10d2w0MDMwbGRvX3NldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LCBpbnQgbWluX3VWLCBpbnQgbWF4X3VWKQotewotCXN0cnVjdCB0d2xyZWdfaW5mbwkqaW5mbyA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7Ci0JaW50CQkJdnNlbDsKLQotCWZvciAodnNlbCA9IDA7IHZzZWwgPCBpbmZvLT50YWJsZV9sZW47IHZzZWwrKykgewotCQlpbnQgbVYgPSBpbmZvLT50YWJsZVt2c2VsXTsKLQkJaW50IHVWOwotCi0JCWlmIChJU19VTlNVUChtVikpCi0JCQljb250aW51ZTsKLQkJdVYgPSBMRE9fTVYobVYpICogMTAwMDsKLQotCQkvKiBSRVZJU0lUIGZvciBWQVVYMiwgZmlyc3QgbWF0Y2ggbWF5IG5vdCBiZSBiZXN0L2xvd2VzdCAqLwotCi0JCS8qIHVzZSB0aGUgZmlyc3QgaW4tcmFuZ2UgdmFsdWUgKi8KLQkJaWYgKG1pbl91ViA8PSB1ViAmJiB1ViA8PSBtYXhfdVYpCi0JCQlyZXR1cm4gdHdsNDAzMHJlZ193cml0ZShpbmZvLCBWUkVHX0RFRElDQVRFRCwgdnNlbCk7Ci0JfQotCi0JcmV0dXJuIC1FRE9NOwotfQotCi1zdGF0aWMgaW50IHR3bDQwMzBsZG9fZ2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCi17Ci0Jc3RydWN0IHR3bHJlZ19pbmZvCSppbmZvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKLQlpbnQJCQl2c2VsID0gdHdsNDAzMHJlZ19yZWFkKGluZm8sIFZSRUdfREVESUNBVEVEKTsKLQotCWlmICh2c2VsIDwgMCkKLQkJcmV0dXJuIHZzZWw7Ci0KLQl2c2VsICY9IGluZm8tPnRhYmxlX2xlbiAtIDE7Ci0JcmV0dXJuIExET19NVihpbmZvLT50YWJsZVt2c2VsXSkgKiAxMDAwOwotfQotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgdHdsNDAzMGxkb19vcHMgPSB7Ci0JLmxpc3Rfdm9sdGFnZQk9IHR3bDQwMzBsZG9fbGlzdF92b2x0YWdlLAotCi0JLnNldF92b2x0YWdlCT0gdHdsNDAzMGxkb19zZXRfdm9sdGFnZSwKLQkuZ2V0X3ZvbHRhZ2UJPSB0d2w0MDMwbGRvX2dldF92b2x0YWdlLAotCi0JLmVuYWJsZQkJPSB0d2w0MDMwcmVnX2VuYWJsZSwKLQkuZGlzYWJsZQk9IHR3bDQwMzByZWdfZGlzYWJsZSwKLQkuaXNfZW5hYmxlZAk9IHR3bDQwMzByZWdfaXNfZW5hYmxlZCwKLQotCS5zZXRfbW9kZQk9IHR3bDQwMzByZWdfc2V0X21vZGUsCi0KLQkuZ2V0X3N0YXR1cwk9IHR3bDQwMzByZWdfZ2V0X3N0YXR1cywKLX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0gKiBGaXhlZCB2b2x0YWdlIExET3MgZG9uJ3QgaGF2ZSBhIFZTRUwgZmllbGQgdG8gdXBkYXRlLgotICovCi1zdGF0aWMgaW50IHR3bDQwMzBmaXhlZF9saXN0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsIHVuc2lnbmVkIGluZGV4KQotewotCXN0cnVjdCB0d2xyZWdfaW5mbwkqaW5mbyA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7Ci0KLQlyZXR1cm4gaW5mby0+bWluX21WICogMTAwMDsKLX0KLQotc3RhdGljIGludCB0d2w0MDMwZml4ZWRfZ2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCi17Ci0Jc3RydWN0IHR3bHJlZ19pbmZvCSppbmZvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKLQotCXJldHVybiBpbmZvLT5taW5fbVYgKiAxMDAwOwotfQotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgdHdsNDAzMGZpeGVkX29wcyA9IHsKLQkubGlzdF92b2x0YWdlCT0gdHdsNDAzMGZpeGVkX2xpc3Rfdm9sdGFnZSwKLQotCS5nZXRfdm9sdGFnZQk9IHR3bDQwMzBmaXhlZF9nZXRfdm9sdGFnZSwKLQotCS5lbmFibGUJCT0gdHdsNDAzMHJlZ19lbmFibGUsCi0JLmRpc2FibGUJPSB0d2w0MDMwcmVnX2Rpc2FibGUsCi0JLmlzX2VuYWJsZWQJPSB0d2w0MDMwcmVnX2lzX2VuYWJsZWQsCi0KLQkuc2V0X21vZGUJPSB0d2w0MDMwcmVnX3NldF9tb2RlLAotCi0JLmdldF9zdGF0dXMJPSB0d2w0MDMwcmVnX2dldF9zdGF0dXMsCi19OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIFRXTF9BREpVU1RBQkxFX0xETyhsYWJlbCwgb2Zmc2V0LCBudW0pIHsgXAotCS5iYXNlID0gb2Zmc2V0LCBcCi0JLmlkID0gbnVtLCBcCi0JLnRhYmxlX2xlbiA9IEFSUkFZX1NJWkUobGFiZWwjI19WU0VMX3RhYmxlKSwgXAotCS50YWJsZSA9IGxhYmVsIyNfVlNFTF90YWJsZSwgXAotCS5kZXNjID0geyBcCi0JCS5uYW1lID0gI2xhYmVsLCBcCi0JCS5pZCA9IFRXTDQwMzBfUkVHXyMjbGFiZWwsIFwKLQkJLm5fdm9sdGFnZXMgPSBBUlJBWV9TSVpFKGxhYmVsIyNfVlNFTF90YWJsZSksIFwKLQkJLm9wcyA9ICZ0d2w0MDMwbGRvX29wcywgXAotCQkudHlwZSA9IFJFR1VMQVRPUl9WT0xUQUdFLCBcCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLCBcCi0JCX0sIFwKLQl9Ci0KLSNkZWZpbmUgVFdMX0ZJWEVEX0xETyhsYWJlbCwgb2Zmc2V0LCBtVm9sdHMsIG51bSkgeyBcCi0JLmJhc2UgPSBvZmZzZXQsIFwKLQkuaWQgPSBudW0sIFwKLQkubWluX21WID0gbVZvbHRzLCBcCi0JLmRlc2MgPSB7IFwKLQkJLm5hbWUgPSAjbGFiZWwsIFwKLQkJLmlkID0gVFdMNDAzMF9SRUdfIyNsYWJlbCwgXAotCQkubl92b2x0YWdlcyA9IDEsIFwKLQkJLm9wcyA9ICZ0d2w0MDMwZml4ZWRfb3BzLCBcCi0JCS50eXBlID0gUkVHVUxBVE9SX1ZPTFRBR0UsIFwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsIFwKLQkJfSwgXAotCX0KLQotLyoKLSAqIFdlIGxpc3QgcmVndWxhdG9ycyBoZXJlIGlmIHN5c3RlbXMgbmVlZCBzb21lIGxldmVsIG9mCi0gKiBzb2Z0d2FyZSBjb250cm9sIG92ZXIgdGhlbSBhZnRlciBib290LgotICovCi1zdGF0aWMgc3RydWN0IHR3bHJlZ19pbmZvIHR3bDQwMzBfcmVnc1tdID0gewotCVRXTF9BREpVU1RBQkxFX0xETyhWQVVYMSwgMHgxNywgMSksCi0JVFdMX0FESlVTVEFCTEVfTERPKFZBVVgyXzQwMzAsIDB4MWIsIDIpLAotCVRXTF9BREpVU1RBQkxFX0xETyhWQVVYMiwgMHgxYiwgMiksCi0JVFdMX0FESlVTVEFCTEVfTERPKFZBVVgzLCAweDFmLCAzKSwKLQlUV0xfQURKVVNUQUJMRV9MRE8oVkFVWDQsIDB4MjMsIDQpLAotCVRXTF9BREpVU1RBQkxFX0xETyhWTU1DMSwgMHgyNywgNSksCi0JVFdMX0FESlVTVEFCTEVfTERPKFZNTUMyLCAweDJiLCA2KSwKLQkvKgotCVRXTF9BREpVU1RBQkxFX0xETyhWUExMMSwgMHgyZiwgNyksCi0JKi8KLQlUV0xfQURKVVNUQUJMRV9MRE8oVlBMTDIsIDB4MzMsIDgpLAotCVRXTF9BREpVU1RBQkxFX0xETyhWU0lNLCAweDM3LCA5KSwKLQlUV0xfQURKVVNUQUJMRV9MRE8oVkRBQywgMHgzYiwgMTApLAotCS8qCi0JVFdMX0FESlVTVEFCTEVfTERPKFZJTlRBTkExLCAweDNmLCAxMSksCi0JVFdMX0FESlVTVEFCTEVfTERPKFZJTlRBTkEyLCAweDQzLCAxMiksCi0JVFdMX0FESlVTVEFCTEVfTERPKFZJTlRESUcsIDB4NDcsIDEzKSwKLQlUV0xfU01QUyhWSU8sIDB4NGIsIDE0KSwKLQlUV0xfU01QUyhWREQxLCAweDU1LCAxNSksCi0JVFdMX1NNUFMoVkREMiwgMHg2MywgMTYpLAotCSAqLwotCVRXTF9GSVhFRF9MRE8oVlVTQjFWNSwgMHg3MSwgMTUwMCwgMTcpLAotCVRXTF9GSVhFRF9MRE8oVlVTQjFWOCwgMHg3NCwgMTgwMCwgMTgpLAotCVRXTF9GSVhFRF9MRE8oVlVTQjNWMSwgMHg3NywgMzEwMCwgMTkpLAotCS8qIFZVU0JDUCBpcyBtYW5hZ2VkICpvbmx5KiBieSB0aGUgVVNCIHN1YmNoaXAgKi8KLX07Ci0KLXN0YXRpYyBpbnQgdHdsNDAzMHJlZ19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludAkJCQlpOwotCXN0cnVjdCB0d2xyZWdfaW5mbwkJKmluZm87Ci0Jc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEJKmluaXRkYXRhOwotCXN0cnVjdCByZWd1bGF0aW9uX2NvbnN0cmFpbnRzCSpjOwotCXN0cnVjdCByZWd1bGF0b3JfZGV2CQkqcmRldjsKLQotCWZvciAoaSA9IDAsIGluZm8gPSBOVUxMOyBpIDwgQVJSQVlfU0laRSh0d2w0MDMwX3JlZ3MpOyBpKyspIHsKLQkJaWYgKHR3bDQwMzBfcmVnc1tpXS5kZXNjLmlkICE9IHBkZXYtPmlkKQotCQkJY29udGludWU7Ci0JCWluZm8gPSB0d2w0MDMwX3JlZ3MgKyBpOwotCQlicmVhazsKLQl9Ci0JaWYgKCFpbmZvKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWluaXRkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaWYgKCFpbml0ZGF0YSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBDb25zdHJhaW4gYm9hcmQtc3BlY2lmaWMgY2FwYWJpbGl0aWVzIGFjY29yZGluZyB0byB3aGF0Ci0JICogdGhpcyBkcml2ZXIgYW5kIHRoZSBjaGlwIGl0c2VsZiBjYW4gYWN0dWFsbHkgZG8uCi0JICovCi0JYyA9ICZpbml0ZGF0YS0+Y29uc3RyYWludHM7Ci0JYy0+dmFsaWRfbW9kZXNfbWFzayAmPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwgfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZOwotCWMtPnZhbGlkX29wc19tYXNrICY9IFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRQotCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9NT0RFCi0JCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUzsKLQotCXJkZXYgPSByZWd1bGF0b3JfcmVnaXN0ZXIoJmluZm8tPmRlc2MsICZwZGV2LT5kZXYsIGluaXRkYXRhLCBpbmZvKTsKLQlpZiAoSVNfRVJSKHJkZXYpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IHJlZ2lzdGVyICVzLCAlbGRcbiIsCi0JCQkJaW5mby0+ZGVzYy5uYW1lLCBQVFJfRVJSKHJkZXYpKTsKLQkJcmV0dXJuIFBUUl9FUlIocmRldik7Ci0JfQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJkZXYpOwotCi0JLyogTk9URTogIG1hbnkgcmVndWxhdG9ycyBzdXBwb3J0IHNob3J0LWNpcmN1aXQgSVJRcyAocHJlc2VudGFibGUKLQkgKiBhcyBSRUdVTEFUT1JfT1ZFUl9DVVJSRU5UIG5vdGlmaWNhdGlvbnM/KSBjb25maWd1cmVkIHZpYToKLQkgKiAgLSBTQ19DT05GSUcKLQkgKiAgLSBTQ19ERVRFQ1QxICh2aW50YW5hMiwgdm1tYzEvMiwgdmF1eDEvMi8zLzQpCi0JICogIC0gU0NfREVURUNUMiAodnVzYiwgdmRhYywgdmlvLCB2ZGQxLzIsIHZwbGwyKQotCSAqICAtIElUX0NPTkZJRwotCSAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZleGl0IHR3bDQwMzByZWdfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmVndWxhdG9yX3VucmVnaXN0ZXIocGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldikpOwotCXJldHVybiAwOwotfQotCi1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOnR3bDQwMzBfcmVnIik7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHR3bDQwMzByZWdfZHJpdmVyID0gewotCS5wcm9iZQkJPSB0d2w0MDMwcmVnX3Byb2JlLAotCS5yZW1vdmUJCT0gX19kZXZleGl0X3AodHdsNDAzMHJlZ19yZW1vdmUpLAotCS8qIE5PVEU6IHNob3J0IG5hbWUsIHRvIHdvcmsgYXJvdW5kIGRyaXZlciBtb2RlbCB0cnVuY2F0aW9uIG9mCi0JICogInR3bDQwMzBfcmVndWxhdG9yLjEyIiAoYW5kIGZyaWVuZHMpIHRvICJ0d2w0MDMwX3JlZ3VsYXRvci4xIi4KLQkgKi8KLQkuZHJpdmVyLm5hbWUJPSAidHdsNDAzMF9yZWciLAotCS5kcml2ZXIub3duZXIJPSBUSElTX01PRFVMRSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHR3bDQwMzByZWdfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnR3bDQwMzByZWdfZHJpdmVyKTsKLX0KLXN1YnN5c19pbml0Y2FsbCh0d2w0MDMwcmVnX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdHdsNDAzMHJlZ19leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnR3bDQwMzByZWdfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KHR3bDQwMzByZWdfZXhpdCkKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJUV0w0MDMwIHJlZ3VsYXRvciBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODM1MC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3dtODM1MC1yZWd1bGF0b3IuYwppbmRleCA3NjhiZDBlLi4xYmJmZjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci93bTgzNTAtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204MzUwLXJlZ3VsYXRvci5jCkBAIC0xMzMwLDkgKzEzMzAsMTAgQEAKIAkgfSwKIH07CiAKLXN0YXRpYyB2b2lkIHBtaWNfdXZfaGFuZGxlcihzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBpcnEsIHZvaWQgKmRhdGEpCitzdGF0aWMgaXJxcmV0dXJuX3QgcG1pY191dl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSAoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKilkYXRhOworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CiAKIAltdXRleF9sb2NrKCZyZGV2LT5tdXRleCk7CiAJaWYgKGlycSA9PSBXTTgzNTBfSVJRX0NTMSB8fCBpcnEgPT0gV004MzUwX0lSUV9DUzIpCkBAIC0xMzQ0LDYgKzEzNDUsOCBAQAogCQkJCQkgICAgICBSRUdVTEFUT1JfRVZFTlRfVU5ERVJfVk9MVEFHRSwKIAkJCQkJICAgICAgd204MzUwKTsKIAltdXRleF91bmxvY2soJnJkZXYtPm11dGV4KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAogc3RhdGljIGludCB3bTgzNTBfcmVndWxhdG9yX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC0xMzg4LDcgKzEzOTEsNyBAQAogCiAJLyogcmVnaXN0ZXIgcmVndWxhdG9yIElSUSAqLwogCXJldCA9IHdtODM1MF9yZWdpc3Rlcl9pcnEod204MzUwLCB3bTgzNTBfcmVnW3BkZXYtPmlkXS5pcnEsCi0JCQkJICBwbWljX3V2X2hhbmRsZXIsIHJkZXYpOworCQkJCSAgcG1pY191dl9oYW5kbGVyLCAwLCAiVVYiLCByZGV2KTsKIAlpZiAocmV0IDwgMCkgewogCQlyZWd1bGF0b3JfdW5yZWdpc3RlcihyZGV2KTsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIHJlZ3VsYXRvciAlcyBJUlFcbiIsCkBAIC0xMzk2LDggKzEzOTksNiBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCXdtODM1MF91bm1hc2tfaXJxKHdtODM1MCwgd204MzUwX3JlZ1twZGV2LT5pZF0uaXJxKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0xNDA2LDcgKzE0MDcsNiBAQAogCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IHdtODM1MCAqd204MzUwID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAotCXdtODM1MF9tYXNrX2lycSh3bTgzNTAsIHdtODM1MF9yZWdbcGRldi0+aWRdLmlycSk7CiAJd204MzUwX2ZyZWVfaXJxKHdtODM1MCwgd204MzUwX3JlZ1twZGV2LT5pZF0uaXJxKTsKIAogCXJlZ3VsYXRvcl91bnJlZ2lzdGVyKHJkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvS2NvbmZpZyBiL2RyaXZlcnMvcnRjL0tjb25maWcKaW5kZXggZjJlMTAwNC4uNzFmYmQ2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvS2NvbmZpZworKysgYi9kcml2ZXJzL3J0Yy9LY29uZmlnCkBAIC0yNTgsMTQgKzI1OCwxNCBAQAogCSAgdGhlIE1lbmVsYXVzIGRyaXZlcjsgaXQncyBub3Qgc2VwYXJhdGUgbW9kdWxlLgogCiBjb25maWcgUlRDX0RSVl9UV0w0MDMwCi0JdHJpc3RhdGUgIlRJIFRXTDQwMzAvVFdMNTAzMC9UUFM2NTl4MCIKKwl0cmlzdGF0ZSAiVEkgVFdMNDAzMC9UV0w1MDMwL1RXTDYwMzAvVFBTNjU5eDAiCiAJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgVFdMNDAzMF9DT1JFCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBSVEMgb24gdGhlCi0JICBUV0w0MDMwIGZhbWlseSBjaGlwcywgdXNlZCBtb3N0bHkgd2l0aCBPTUFQMyBwbGF0Zm9ybXMuCisJICBUV0w0MDMwL1RXTDUwMzAvVFdMNjAzMCBmYW1pbHkgY2hpcHMsIHVzZWQgbW9zdGx5IHdpdGggT01BUDMgcGxhdGZvcm1zLgogCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy10d2w0MDMwLgorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLXR3bC4KIAogY29uZmlnIFJUQ19EUlZfUzM1MzkwQQogCXRyaXN0YXRlICJTZWlrbyBJbnN0cnVtZW50cyBTLTM1MzkwQSIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL01ha2VmaWxlIGIvZHJpdmVycy9ydGMvTWFrZWZpbGUKaW5kZXggYWYxYmE3YS4uN2RhNmVmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ydGMvTWFrZWZpbGUKQEAgLTgwLDcgKzgwLDcgQEAKIG9iai0kKENPTkZJR19SVENfRFJWX1NUTVApCSs9IHJ0Yy1zdG1wM3h4eC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9TVU40VikJKz0gcnRjLXN1bjR2Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX1RFU1QpCSs9IHJ0Yy10ZXN0Lm8KLW9iai0kKENPTkZJR19SVENfRFJWX1RXTDQwMzApCSs9IHJ0Yy10d2w0MDMwLm8KK29iai0kKENPTkZJR19SVENfRFJWX1RXTDQwMzApCSs9IHJ0Yy10d2wubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfVFg0OTM5KQkrPSBydGMtdHg0OTM5Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX1YzMDIwKQkrPSBydGMtdjMwMjAubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfVlI0MVhYKQkrPSBydGMtdnI0MXh4Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1wY2Y1MDYzMy5jIGIvZHJpdmVycy9ydGMvcnRjLXBjZjUwNjMzLmMKaW5kZXggNGM1ZDVkMC4uOWI3NGU5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXBjZjUwNjMzLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXBjZjUwNjMzLmMKQEAgLTI3NywxNiArMjc3LDEzIEBACiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHBjZjUwNjMzX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBwY2Y1MDYzM19zdWJkZXZfcGRhdGEgKnBkYXRhOwogCXN0cnVjdCBwY2Y1MDYzM19ydGMgKnJ0YzsKIAotCiAJcnRjID0ga3phbGxvYyhzaXplb2YoKnJ0YyksIEdGUF9LRVJORUwpOwogCWlmICghcnRjKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JcnRjLT5wY2YgPSBwZGF0YS0+cGNmOworCXJ0Yy0+cGNmID0gZGV2X3RvX3BjZjUwNjMzKHBkZXYtPmRldi5wYXJlbnQpOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJ0Yyk7CiAJcnRjLT5ydGNfZGV2ID0gcnRjX2RldmljZV9yZWdpc3RlcigicGNmNTA2MzMtcnRjIiwgJnBkZXYtPmRldiwKIAkJCQkmcGNmNTA2MzNfcnRjX29wcywgVEhJU19NT0RVTEUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXR3bC5jIGIvZHJpdmVycy9ydGMvcnRjLXR3bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YTgzYTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3J0Yy9ydGMtdHdsLmMKQEAgLTAsMCArMSw2MTAgQEAKKy8qCisgKiBydGMtdHdsLmMgLS0gVFdMIFJlYWwgVGltZSBDbG9jayBpbnRlcmZhY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jCisgKiBBdXRob3I6IEFsZXhhbmRyZSBSdXNldiA8c291cmNlQG12aXN0YS5jb20+CisgKgorICogQmFzZWQgb24gb3JpZ2luYWwgVEkgZHJpdmVyIHR3bDQwMzAtcnRjLmMKKyAqICAgQ29weXJpZ2h0IChDKSAyMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogQmFzZWQgb24gcnRjLW9tYXAuYworICogICBDb3B5cmlnaHQgKEMpIDIwMDMgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogICBBdXRob3I6IEdlb3JnZSBHLiBEYXZpcyA8Z2RhdmlzQG12aXN0YS5jb20+IG9yIDxzb3VyY2VAbXZpc3RhLmNvbT4KKyAqICAgQ29weXJpZ2h0IChDKSAyMDA2IERhdmlkIEJyb3duZWxsCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2kyYy90d2wuaD4KKworCisvKgorICogUlRDIGJsb2NrIHJlZ2lzdGVyIG9mZnNldHMgKHVzZSBUV0xfTU9EVUxFX1JUQykKKyAqLworZW51bSB7CisJUkVHX1NFQ09ORFNfUkVHID0gMCwKKwlSRUdfTUlOVVRFU19SRUcsCisJUkVHX0hPVVJTX1JFRywKKwlSRUdfREFZU19SRUcsCisJUkVHX01PTlRIU19SRUcsCisJUkVHX1lFQVJTX1JFRywKKwlSRUdfV0VFS1NfUkVHLAorCisJUkVHX0FMQVJNX1NFQ09ORFNfUkVHLAorCVJFR19BTEFSTV9NSU5VVEVTX1JFRywKKwlSRUdfQUxBUk1fSE9VUlNfUkVHLAorCVJFR19BTEFSTV9EQVlTX1JFRywKKwlSRUdfQUxBUk1fTU9OVEhTX1JFRywKKwlSRUdfQUxBUk1fWUVBUlNfUkVHLAorCisJUkVHX1JUQ19DVFJMX1JFRywKKwlSRUdfUlRDX1NUQVRVU19SRUcsCisJUkVHX1JUQ19JTlRFUlJVUFRTX1JFRywKKworCVJFR19SVENfQ09NUF9MU0JfUkVHLAorCVJFR19SVENfQ09NUF9NU0JfUkVHLAorfTsKK2NvbnN0IHN0YXRpYyB1OCB0d2w0MDMwX3J0Y19yZWdfbWFwW10gPSB7CisJW1JFR19TRUNPTkRTX1JFR10gPSAweDAwLAorCVtSRUdfTUlOVVRFU19SRUddID0gMHgwMSwKKwlbUkVHX0hPVVJTX1JFR10gPSAweDAyLAorCVtSRUdfREFZU19SRUddID0gMHgwMywKKwlbUkVHX01PTlRIU19SRUddID0gMHgwNCwKKwlbUkVHX1lFQVJTX1JFR10gPSAweDA1LAorCVtSRUdfV0VFS1NfUkVHXSA9IDB4MDYsCisKKwlbUkVHX0FMQVJNX1NFQ09ORFNfUkVHXSA9IDB4MDcsCisJW1JFR19BTEFSTV9NSU5VVEVTX1JFR10gPSAweDA4LAorCVtSRUdfQUxBUk1fSE9VUlNfUkVHXSA9IDB4MDksCisJW1JFR19BTEFSTV9EQVlTX1JFR10gPSAweDBBLAorCVtSRUdfQUxBUk1fTU9OVEhTX1JFR10gPSAweDBCLAorCVtSRUdfQUxBUk1fWUVBUlNfUkVHXSA9IDB4MEMsCisKKwlbUkVHX1JUQ19DVFJMX1JFR10gPSAweDBELAorCVtSRUdfUlRDX1NUQVRVU19SRUddID0gMHgwRSwKKwlbUkVHX1JUQ19JTlRFUlJVUFRTX1JFR10gPSAweDBGLAorCisJW1JFR19SVENfQ09NUF9MU0JfUkVHXSA9IDB4MTAsCisJW1JFR19SVENfQ09NUF9NU0JfUkVHXSA9IDB4MTEsCit9OworY29uc3Qgc3RhdGljIHU4IHR3bDYwMzBfcnRjX3JlZ19tYXBbXSA9IHsKKwlbUkVHX1NFQ09ORFNfUkVHXSA9IDB4MDAsCisJW1JFR19NSU5VVEVTX1JFR10gPSAweDAxLAorCVtSRUdfSE9VUlNfUkVHXSA9IDB4MDIsCisJW1JFR19EQVlTX1JFR10gPSAweDAzLAorCVtSRUdfTU9OVEhTX1JFR10gPSAweDA0LAorCVtSRUdfWUVBUlNfUkVHXSA9IDB4MDUsCisJW1JFR19XRUVLU19SRUddID0gMHgwNiwKKworCVtSRUdfQUxBUk1fU0VDT05EU19SRUddID0gMHgwOCwKKwlbUkVHX0FMQVJNX01JTlVURVNfUkVHXSA9IDB4MDksCisJW1JFR19BTEFSTV9IT1VSU19SRUddID0gMHgwQSwKKwlbUkVHX0FMQVJNX0RBWVNfUkVHXSA9IDB4MEIsCisJW1JFR19BTEFSTV9NT05USFNfUkVHXSA9IDB4MEMsCisJW1JFR19BTEFSTV9ZRUFSU19SRUddID0gMHgwRCwKKworCVtSRUdfUlRDX0NUUkxfUkVHXSA9IDB4MTAsCisJW1JFR19SVENfU1RBVFVTX1JFR10gPSAweDExLAorCVtSRUdfUlRDX0lOVEVSUlVQVFNfUkVHXSA9IDB4MTIsCisKKwlbUkVHX1JUQ19DT01QX0xTQl9SRUddID0gMHgxMywKKwlbUkVHX1JUQ19DT01QX01TQl9SRUddID0gMHgxNCwKK307CisKKy8qIFJUQ19DVFJMX1JFRyBiaXRmaWVsZHMgKi8KKyNkZWZpbmUgQklUX1JUQ19DVFJMX1JFR19TVE9QX1JUQ19NICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEJJVF9SVENfQ1RSTF9SRUdfUk9VTkRfMzBTX00gICAgICAgICAgICAgMHgwMgorI2RlZmluZSBCSVRfUlRDX0NUUkxfUkVHX0FVVE9fQ09NUF9NICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgQklUX1JUQ19DVFJMX1JFR19NT0RFXzEyXzI0X00gICAgICAgICAgICAweDA4CisjZGVmaW5lIEJJVF9SVENfQ1RSTF9SRUdfVEVTVF9NT0RFX00gICAgICAgICAgICAgMHgxMAorI2RlZmluZSBCSVRfUlRDX0NUUkxfUkVHX1NFVF8zMl9DT1VOVEVSX00gICAgICAgIDB4MjAKKyNkZWZpbmUgQklUX1JUQ19DVFJMX1JFR19HRVRfVElNRV9NICAgICAgICAgICAgICAweDQwCisKKy8qIFJUQ19TVEFUVVNfUkVHIGJpdGZpZWxkcyAqLworI2RlZmluZSBCSVRfUlRDX1NUQVRVU19SRUdfUlVOX00gICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQklUX1JUQ19TVEFUVVNfUkVHXzFTX0VWRU5UX00gICAgICAgICAgICAweDA0CisjZGVmaW5lIEJJVF9SVENfU1RBVFVTX1JFR18xTV9FVkVOVF9NICAgICAgICAgICAgMHgwOAorI2RlZmluZSBCSVRfUlRDX1NUQVRVU19SRUdfMUhfRVZFTlRfTSAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQklUX1JUQ19TVEFUVVNfUkVHXzFEX0VWRU5UX00gICAgICAgICAgICAweDIwCisjZGVmaW5lIEJJVF9SVENfU1RBVFVTX1JFR19BTEFSTV9NICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBCSVRfUlRDX1NUQVRVU19SRUdfUE9XRVJfVVBfTSAgICAgICAgICAgIDB4ODAKKworLyogUlRDX0lOVEVSUlVQVFNfUkVHIGJpdGZpZWxkcyAqLworI2RlZmluZSBCSVRfUlRDX0lOVEVSUlVQVFNfUkVHX0VWRVJZX00gICAgICAgICAgIDB4MDMKKyNkZWZpbmUgQklUX1JUQ19JTlRFUlJVUFRTX1JFR19JVF9USU1FUl9NICAgICAgICAweDA0CisjZGVmaW5lIEJJVF9SVENfSU5URVJSVVBUU19SRUdfSVRfQUxBUk1fTSAgICAgICAgMHgwOAorCisKKy8qIFJFR19TRUNPTkRTX1JFRyB0aHJvdWdoIFJFR19ZRUFSU19SRUcgaXMgaG93IG1hbnkgcmVnaXN0ZXJzPyAqLworI2RlZmluZSBBTExfVElNRV9SRUdTCQk2CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdTggICpydGNfcmVnX21hcDsKKworLyoKKyAqIFN1cHBvcnRzIDEgYnl0ZSByZWFkIGZyb20gVFdMIFJUQyByZWdpc3Rlci4KKyAqLworc3RhdGljIGludCB0d2xfcnRjX3JlYWRfdTgodTggKmRhdGEsIHU4IHJlZykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gdHdsX2kyY19yZWFkX3U4KFRXTF9NT0RVTEVfUlRDLCBkYXRhLCAocnRjX3JlZ19tYXBbcmVnXSkpOworCWlmIChyZXQgPCAwKQorCQlwcl9lcnIoInR3bF9ydGM6IENvdWxkIG5vdCByZWFkIFRXTCIKKwkJICAgICAgICJyZWdpc3RlciAlWCAtIGVycm9yICVkXG4iLCByZWcsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFN1cHBvcnRzIDEgYnl0ZSB3cml0ZSB0byBUV0wgUlRDIHJlZ2lzdGVycy4KKyAqLworc3RhdGljIGludCB0d2xfcnRjX3dyaXRlX3U4KHU4IGRhdGEsIHU4IHJlZykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gdHdsX2kyY193cml0ZV91OChUV0xfTU9EVUxFX1JUQywgZGF0YSwgKHJ0Y19yZWdfbWFwW3JlZ10pKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfZXJyKCJ0d2xfcnRjOiBDb3VsZCBub3Qgd3JpdGUgVFdMIgorCQkgICAgICAgInJlZ2lzdGVyICVYIC0gZXJyb3IgJWRcbiIsIHJlZywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQ2FjaGUgdGhlIHZhbHVlIGZvciB0aW1lci9hbGFybSBpbnRlcnJ1cHRzIHJlZ2lzdGVyOyB0aGlzIGlzCisgKiBvbmx5IGNoYW5nZWQgYnkgY2FsbGVycyBob2xkaW5nIHJ0YyBvcHMgbG9jayAob3IgcmVzdW1lKS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgcnRjX2lycV9iaXRzOworCisvKgorICogRW5hYmxlIDEvc2Vjb25kIHVwZGF0ZSBhbmQvb3IgYWxhcm0gaW50ZXJydXB0cy4KKyAqLworc3RhdGljIGludCBzZXRfcnRjX2lycV9iaXQodW5zaWduZWQgY2hhciBiaXQpCit7CisJdW5zaWduZWQgY2hhciB2YWw7CisJaW50IHJldDsKKworCXZhbCA9IHJ0Y19pcnFfYml0cyB8IGJpdDsKKwl2YWwgJj0gfkJJVF9SVENfSU5URVJSVVBUU19SRUdfRVZFUllfTTsKKwlyZXQgPSB0d2xfcnRjX3dyaXRlX3U4KHZhbCwgUkVHX1JUQ19JTlRFUlJVUFRTX1JFRyk7CisJaWYgKHJldCA9PSAwKQorCQlydGNfaXJxX2JpdHMgPSB2YWw7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRGlzYWJsZSB1cGRhdGUgYW5kL29yIGFsYXJtIGludGVycnVwdHMuCisgKi8KK3N0YXRpYyBpbnQgbWFza19ydGNfaXJxX2JpdCh1bnNpZ25lZCBjaGFyIGJpdCkKK3sKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKwlpbnQgcmV0OworCisJdmFsID0gcnRjX2lycV9iaXRzICYgfmJpdDsKKwlyZXQgPSB0d2xfcnRjX3dyaXRlX3U4KHZhbCwgUkVHX1JUQ19JTlRFUlJVUFRTX1JFRyk7CisJaWYgKHJldCA9PSAwKQorCQlydGNfaXJxX2JpdHMgPSB2YWw7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHR3bF9ydGNfYWxhcm1faXJxX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGVuYWJsZWQpCit7CisJaW50IHJldDsKKworCWlmIChlbmFibGVkKQorCQlyZXQgPSBzZXRfcnRjX2lycV9iaXQoQklUX1JUQ19JTlRFUlJVUFRTX1JFR19JVF9BTEFSTV9NKTsKKwllbHNlCisJCXJldCA9IG1hc2tfcnRjX2lycV9iaXQoQklUX1JUQ19JTlRFUlJVUFRTX1JFR19JVF9BTEFSTV9NKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdHdsX3J0Y191cGRhdGVfaXJxX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGVuYWJsZWQpCit7CisJaW50IHJldDsKKworCWlmIChlbmFibGVkKQorCQlyZXQgPSBzZXRfcnRjX2lycV9iaXQoQklUX1JUQ19JTlRFUlJVUFRTX1JFR19JVF9USU1FUl9NKTsKKwllbHNlCisJCXJldCA9IG1hc2tfcnRjX2lycV9iaXQoQklUX1JUQ19JTlRFUlJVUFRTX1JFR19JVF9USU1FUl9NKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBHZXRzIGN1cnJlbnQgVFdMIFJUQyB0aW1lIGFuZCBkYXRlIHBhcmFtZXRlcnMuCisgKgorICogVGhlIFJUQydzIHRpbWUvYWxhcm0gcmVwcmVzZW50YXRpb24gaXMgbm90IHdoYXQgZ210aW1lKDMpIHJlcXVpcmVzCisgKiBMaW51eCB0byB1c2U6CisgKgorICogIC0gTW9udGhzIGFyZSAxLi4xMiB2cyBMaW51eCAwLTExCisgKiAgLSBZZWFycyBhcmUgMC4uOTkgdnMgTGludXggMTkwMC4uTiAod2UgYXNzdW1lIDIxc3QgY2VudHVyeSkKKyAqLworc3RhdGljIGludCB0d2xfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJdW5zaWduZWQgY2hhciBydGNfZGF0YVtBTExfVElNRV9SRUdTICsgMV07CisJaW50IHJldDsKKwl1OCBzYXZlX2NvbnRyb2w7CisKKwlyZXQgPSB0d2xfcnRjX3JlYWRfdTgoJnNhdmVfY29udHJvbCwgUkVHX1JUQ19DVFJMX1JFRyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzYXZlX2NvbnRyb2wgfD0gQklUX1JUQ19DVFJMX1JFR19HRVRfVElNRV9NOworCisJcmV0ID0gdHdsX3J0Y193cml0ZV91OChzYXZlX2NvbnRyb2wsIFJFR19SVENfQ1RSTF9SRUcpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gdHdsX2kyY19yZWFkKFRXTF9NT0RVTEVfUlRDLCBydGNfZGF0YSwKKwkJCShydGNfcmVnX21hcFtSRUdfU0VDT05EU19SRUddKSwgQUxMX1RJTUVfUkVHUyk7CisKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgInJ0Y19yZWFkX3RpbWUgZXJyb3IgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJdG0tPnRtX3NlYyA9IGJjZDJiaW4ocnRjX2RhdGFbMF0pOworCXRtLT50bV9taW4gPSBiY2QyYmluKHJ0Y19kYXRhWzFdKTsKKwl0bS0+dG1faG91ciA9IGJjZDJiaW4ocnRjX2RhdGFbMl0pOworCXRtLT50bV9tZGF5ID0gYmNkMmJpbihydGNfZGF0YVszXSk7CisJdG0tPnRtX21vbiA9IGJjZDJiaW4ocnRjX2RhdGFbNF0pIC0gMTsKKwl0bS0+dG1feWVhciA9IGJjZDJiaW4ocnRjX2RhdGFbNV0pICsgMTAwOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0d2xfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwl1bnNpZ25lZCBjaGFyIHNhdmVfY29udHJvbDsKKwl1bnNpZ25lZCBjaGFyIHJ0Y19kYXRhW0FMTF9USU1FX1JFR1MgKyAxXTsKKwlpbnQgcmV0OworCisJcnRjX2RhdGFbMV0gPSBiaW4yYmNkKHRtLT50bV9zZWMpOworCXJ0Y19kYXRhWzJdID0gYmluMmJjZCh0bS0+dG1fbWluKTsKKwlydGNfZGF0YVszXSA9IGJpbjJiY2QodG0tPnRtX2hvdXIpOworCXJ0Y19kYXRhWzRdID0gYmluMmJjZCh0bS0+dG1fbWRheSk7CisJcnRjX2RhdGFbNV0gPSBiaW4yYmNkKHRtLT50bV9tb24gKyAxKTsKKwlydGNfZGF0YVs2XSA9IGJpbjJiY2QodG0tPnRtX3llYXIgLSAxMDApOworCisJLyogU3RvcCBSVEMgd2hpbGUgdXBkYXRpbmcgdGhlIFRDIHJlZ2lzdGVycyAqLworCXJldCA9IHR3bF9ydGNfcmVhZF91OCgmc2F2ZV9jb250cm9sLCBSRUdfUlRDX0NUUkxfUkVHKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlzYXZlX2NvbnRyb2wgJj0gfkJJVF9SVENfQ1RSTF9SRUdfU1RPUF9SVENfTTsKKwl0d2xfcnRjX3dyaXRlX3U4KHNhdmVfY29udHJvbCwgUkVHX1JUQ19DVFJMX1JFRyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJLyogdXBkYXRlIGFsbCB0aGUgdGltZSByZWdpc3RlcnMgaW4gb25lIHNob3QgKi8KKwlyZXQgPSB0d2xfaTJjX3dyaXRlKFRXTF9NT0RVTEVfUlRDLCBydGNfZGF0YSwKKwkJKHJ0Y19yZWdfbWFwW1JFR19TRUNPTkRTX1JFR10pLCBBTExfVElNRV9SRUdTKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgInJ0Y19zZXRfdGltZSBlcnJvciAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogU3RhcnQgYmFjayBSVEMgKi8KKwlzYXZlX2NvbnRyb2wgfD0gQklUX1JUQ19DVFJMX1JFR19TVE9QX1JUQ19NOworCXJldCA9IHR3bF9ydGNfd3JpdGVfdTgoc2F2ZV9jb250cm9sLCBSRUdfUlRDX0NUUkxfUkVHKTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBHZXRzIGN1cnJlbnQgVFdMIFJUQyBhbGFybSB0aW1lLgorICovCitzdGF0aWMgaW50IHR3bF9ydGNfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbG0pCit7CisJdW5zaWduZWQgY2hhciBydGNfZGF0YVtBTExfVElNRV9SRUdTICsgMV07CisJaW50IHJldDsKKworCXJldCA9IHR3bF9pMmNfcmVhZChUV0xfTU9EVUxFX1JUQywgcnRjX2RhdGEsCisJCQkocnRjX3JlZ19tYXBbUkVHX0FMQVJNX1NFQ09ORFNfUkVHXSksIEFMTF9USU1FX1JFR1MpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAicnRjX3JlYWRfYWxhcm0gZXJyb3IgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogc29tZSBvZiB0aGVzZSBmaWVsZHMgbWF5IGJlIHdpbGRjYXJkLyJtYXRjaCBhbGwiICovCisJYWxtLT50aW1lLnRtX3NlYyA9IGJjZDJiaW4ocnRjX2RhdGFbMF0pOworCWFsbS0+dGltZS50bV9taW4gPSBiY2QyYmluKHJ0Y19kYXRhWzFdKTsKKwlhbG0tPnRpbWUudG1faG91ciA9IGJjZDJiaW4ocnRjX2RhdGFbMl0pOworCWFsbS0+dGltZS50bV9tZGF5ID0gYmNkMmJpbihydGNfZGF0YVszXSk7CisJYWxtLT50aW1lLnRtX21vbiA9IGJjZDJiaW4ocnRjX2RhdGFbNF0pIC0gMTsKKwlhbG0tPnRpbWUudG1feWVhciA9IGJjZDJiaW4ocnRjX2RhdGFbNV0pICsgMTAwOworCisJLyogcmVwb3J0IGNhY2hlZCBhbGFybSBlbmFibGUgc3RhdGUgKi8KKwlpZiAocnRjX2lycV9iaXRzICYgQklUX1JUQ19JTlRFUlJVUFRTX1JFR19JVF9BTEFSTV9NKQorCQlhbG0tPmVuYWJsZWQgPSAxOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0d2xfcnRjX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbG0pCit7CisJdW5zaWduZWQgY2hhciBhbGFybV9kYXRhW0FMTF9USU1FX1JFR1MgKyAxXTsKKwlpbnQgcmV0OworCisJcmV0ID0gdHdsX3J0Y19hbGFybV9pcnFfZW5hYmxlKGRldiwgMCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlhbGFybV9kYXRhWzFdID0gYmluMmJjZChhbG0tPnRpbWUudG1fc2VjKTsKKwlhbGFybV9kYXRhWzJdID0gYmluMmJjZChhbG0tPnRpbWUudG1fbWluKTsKKwlhbGFybV9kYXRhWzNdID0gYmluMmJjZChhbG0tPnRpbWUudG1faG91cik7CisJYWxhcm1fZGF0YVs0XSA9IGJpbjJiY2QoYWxtLT50aW1lLnRtX21kYXkpOworCWFsYXJtX2RhdGFbNV0gPSBiaW4yYmNkKGFsbS0+dGltZS50bV9tb24gKyAxKTsKKwlhbGFybV9kYXRhWzZdID0gYmluMmJjZChhbG0tPnRpbWUudG1feWVhciAtIDEwMCk7CisKKwkvKiB1cGRhdGUgYWxsIHRoZSBhbGFybSByZWdpc3RlcnMgaW4gb25lIHNob3QgKi8KKwlyZXQgPSB0d2xfaTJjX3dyaXRlKFRXTF9NT0RVTEVfUlRDLCBhbGFybV9kYXRhLAorCQkocnRjX3JlZ19tYXBbUkVHX0FMQVJNX1NFQ09ORFNfUkVHXSksIEFMTF9USU1FX1JFR1MpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJydGNfc2V0X2FsYXJtIGVycm9yICVkXG4iLCByZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoYWxtLT5lbmFibGVkKQorCQlyZXQgPSB0d2xfcnRjX2FsYXJtX2lycV9lbmFibGUoZGV2LCAxKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgdHdsX3J0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqcnRjKQoreworCXVuc2lnbmVkIGxvbmcgZXZlbnRzID0gMDsKKwlpbnQgcmV0ID0gSVJRX05PTkU7CisJaW50IHJlczsKKwl1OCByZF9yZWc7CisKKyNpZmRlZiBDT05GSUdfTE9DS0RFUAorCS8qIFdPUktBUk9VTkQgZm9yIGxvY2tkZXAgZm9yY2luZyBJUlFGX0RJU0FCTEVEIG9uIHVzLCB3aGljaAorCSAqIHdlIGRvbid0IHdhbnQgYW5kIGNhbid0IHRvbGVyYXRlLiAgQWx0aG91Z2ggaXQgbWlnaHQgYmUKKwkgKiBmcmllbmRsaWVyIG5vdCB0byBib3Jyb3cgdGhpcyB0aHJlYWQgY29udGV4dC4uLgorCSAqLworCWxvY2FsX2lycV9lbmFibGUoKTsKKyNlbmRpZgorCisJcmVzID0gdHdsX3J0Y19yZWFkX3U4KCZyZF9yZWcsIFJFR19SVENfU1RBVFVTX1JFRyk7CisJaWYgKHJlcykKKwkJZ290byBvdXQ7CisJLyoKKwkgKiBGaWd1cmUgb3V0IHNvdXJjZSBvZiBpbnRlcnJ1cHQ6IEFMQVJNIG9yIFRJTUVSIGluIFJUQ19TVEFUVVNfUkVHLgorCSAqIG9ubHkgb25lIChBTEFSTSBvciBSVEMpIGludGVycnVwdCBzb3VyY2UgbWF5IGJlIGVuYWJsZWQKKwkgKiBhdCB0aW1lLCB3ZSBhbHNvIGNvdWxkIGNoZWNrIG91ciByZXN1bHRzCisJICogYnkgcmVhZGluZyBSVFNfSU5URVJSVVBUU19SRUdJU1RFUltJVF9USU1FUixJVF9BTEFSTV0KKwkgKi8KKwlpZiAocmRfcmVnICYgQklUX1JUQ19TVEFUVVNfUkVHX0FMQVJNX00pCisJCWV2ZW50cyB8PSBSVENfSVJRRiB8IFJUQ19BRjsKKwllbHNlCisJCWV2ZW50cyB8PSBSVENfSVJRRiB8IFJUQ19VRjsKKworCXJlcyA9IHR3bF9ydGNfd3JpdGVfdTgocmRfcmVnIHwgQklUX1JUQ19TVEFUVVNfUkVHX0FMQVJNX00sCisJCQkJICAgUkVHX1JUQ19TVEFUVVNfUkVHKTsKKwlpZiAocmVzKQorCQlnb3RvIG91dDsKKworCWlmICh0d2xfY2xhc3NfaXNfNDAzMCgpKSB7CisJCS8qIENsZWFyIG9uIFJlYWQgZW5hYmxlZC4gUlRDX0lUIGJpdCBvZiBUV0w0MDMwX0lOVF9QV1JfSVNSMQorCQkgKiBuZWVkcyAyIHJlYWRzIHRvIGNsZWFyIHRoZSBpbnRlcnJ1cHQuIE9uZSByZWFkIGlzIGRvbmUgaW4KKwkJICogZG9fdHdsX3B3cmlycSgpLiBEb2luZyB0aGUgc2Vjb25kIHJlYWQsIHRvIGNsZWFyCisJCSAqIHRoZSBiaXQuCisJCSAqCisJCSAqIEZJWE1FIHRoZSByZWFzb24gUFdSX0lTUjEgbmVlZHMgYW4gZXh0cmEgcmVhZCBpcyB0aGF0CisJCSAqIFJUQ19JRiByZXRyaWdnZXJlZCB1bnRpbCB3ZSBjbGVhcmVkIFJFR19BTEFSTV9NIGFib3ZlLgorCQkgKiBCdXQgcmUtcmVhZGluZyBsaWtlIHRoaXMgaXMgYSBiYWQgaGFjazsgYnkgZG9pbmcgc28gd2UKKwkJICogcmlzayB3cm9uZ2x5IGNsZWFyaW5nIHN0YXR1cyBmb3Igc29tZSBvdGhlciBJUlEgKGxvc2luZworCQkgKiB0aGUgaW50ZXJydXB0KS4gIEJlIHNtYXJ0ZXIgYWJvdXQgaGFuZGxpbmcgUlRDX1VGIC4uLgorCQkgKi8KKwkJcmVzID0gdHdsX2kyY19yZWFkX3U4KFRXTDQwMzBfTU9EVUxFX0lOVCwKKwkJCSZyZF9yZWcsIFRXTDQwMzBfSU5UX1BXUl9JU1IxKTsKKwkJaWYgKHJlcykKKwkJCWdvdG8gb3V0OworCX0KKworCS8qIE5vdGlmeSBSVEMgY29yZSBvbiBldmVudCAqLworCXJ0Y191cGRhdGVfaXJxKHJ0YywgMSwgZXZlbnRzKTsKKworCXJldCA9IElSUV9IQU5ETEVEOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnRjX2NsYXNzX29wcyB0d2xfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCT0gdHdsX3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gdHdsX3J0Y19zZXRfdGltZSwKKwkucmVhZF9hbGFybQk9IHR3bF9ydGNfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtCT0gdHdsX3J0Y19zZXRfYWxhcm0sCisJLmFsYXJtX2lycV9lbmFibGUgPSB0d2xfcnRjX2FsYXJtX2lycV9lbmFibGUsCisJLnVwZGF0ZV9pcnFfZW5hYmxlID0gdHdsX3J0Y191cGRhdGVfaXJxX2VuYWJsZSwKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHR3bF9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCWludCByZXQgPSAwOworCWludCBpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCXU4IHJkX3JlZzsKKworCWlmIChpcnEgPD0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKHBkZXYtPm5hbWUsCisJCQkJICAmcGRldi0+ZGV2LCAmdHdsX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHJ0YykpIHsKKwkJcmV0ID0gUFRSX0VSUihydGMpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCByZWdpc3RlciBSVEMgZGV2aWNlLCBlcnIgJWxkXG4iLAorCQkJUFRSX0VSUihydGMpKTsKKwkJZ290byBvdXQwOworCisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcnRjKTsKKworCXJldCA9IHR3bF9ydGNfcmVhZF91OCgmcmRfcmVnLCBSRUdfUlRDX1NUQVRVU19SRUcpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDE7CisKKwlpZiAocmRfcmVnICYgQklUX1JUQ19TVEFUVVNfUkVHX1BPV0VSX1VQX00pCisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJQb3dlciB1cCByZXNldCBkZXRlY3RlZC5cbiIpOworCisJaWYgKHJkX3JlZyAmIEJJVF9SVENfU1RBVFVTX1JFR19BTEFSTV9NKQorCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiUGVuZGluZyBBbGFybSBpbnRlcnJ1cHQgZGV0ZWN0ZWQuXG4iKTsKKworCS8qIENsZWFyIFJUQyBQb3dlciB1cCByZXNldCBhbmQgcGVuZGluZyBhbGFybSBpbnRlcnJ1cHRzICovCisJcmV0ID0gdHdsX3J0Y193cml0ZV91OChyZF9yZWcsIFJFR19SVENfU1RBVFVTX1JFRyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0MTsKKworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgdHdsX3J0Y19pbnRlcnJ1cHQsCisJCQkJSVJRRl9UUklHR0VSX1JJU0lORywKKwkJCQlkZXZfbmFtZSgmcnRjLT5kZXYpLCBydGMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIklSUSBpcyBub3QgZnJlZS5cbiIpOworCQlnb3RvIG91dDE7CisJfQorCisJaWYgKHR3bF9jbGFzc19pc182MDMwKCkpIHsKKwkJdHdsNjAzMF9pbnRlcnJ1cHRfdW5tYXNrKFRXTDYwMzBfUlRDX0lOVF9NQVNLLAorCQkJUkVHX0lOVF9NU0tfTElORV9BKTsKKwkJdHdsNjAzMF9pbnRlcnJ1cHRfdW5tYXNrKFRXTDYwMzBfUlRDX0lOVF9NQVNLLAorCQkJUkVHX0lOVF9NU0tfU1RTX0EpOworCX0KKworCS8qIENoZWNrIFJUQyBtb2R1bGUgc3RhdHVzLCBFbmFibGUgaWYgaXQgaXMgb2ZmICovCisJcmV0ID0gdHdsX3J0Y19yZWFkX3U4KCZyZF9yZWcsIFJFR19SVENfQ1RSTF9SRUcpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDI7CisKKwlpZiAoIShyZF9yZWcgJiBCSVRfUlRDX0NUUkxfUkVHX1NUT1BfUlRDX00pKSB7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJFbmFibGluZyBUV0wtUlRDLlxuIik7CisJCXJkX3JlZyA9IEJJVF9SVENfQ1RSTF9SRUdfU1RPUF9SVENfTTsKKwkJcmV0ID0gdHdsX3J0Y193cml0ZV91OChyZF9yZWcsIFJFR19SVENfQ1RSTF9SRUcpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0MjsKKwl9CisKKwkvKiBpbml0IGNhY2hlZCBJUlEgZW5hYmxlIGJpdHMgKi8KKwlyZXQgPSB0d2xfcnRjX3JlYWRfdTgoJnJ0Y19pcnFfYml0cywgUkVHX1JUQ19JTlRFUlJVUFRTX1JFRyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0MjsKKworCXJldHVybiByZXQ7CisKK291dDI6CisJZnJlZV9pcnEoaXJxLCBydGMpOworb3V0MToKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKK291dDA6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIERpc2FibGUgYWxsIFRXTCBSVEMgbW9kdWxlIGludGVycnVwdHMuCisgKiBTZXRzIHN0YXR1cyBmbGFnIHRvIGZyZWUuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZleGl0IHR3bF9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJLyogbGVhdmUgcnRjIHJ1bm5pbmcsIGJ1dCBkaXNhYmxlIGlycXMgKi8KKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IGlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisKKwltYXNrX3J0Y19pcnFfYml0KEJJVF9SVENfSU5URVJSVVBUU19SRUdfSVRfQUxBUk1fTSk7CisJbWFza19ydGNfaXJxX2JpdChCSVRfUlRDX0lOVEVSUlVQVFNfUkVHX0lUX1RJTUVSX00pOworCWlmICh0d2xfY2xhc3NfaXNfNjAzMCgpKSB7CisJCXR3bDYwMzBfaW50ZXJydXB0X21hc2soVFdMNjAzMF9SVENfSU5UX01BU0ssCisJCQlSRUdfSU5UX01TS19MSU5FX0EpOworCQl0d2w2MDMwX2ludGVycnVwdF9tYXNrKFRXTDYwMzBfUlRDX0lOVF9NQVNLLAorCQkJUkVHX0lOVF9NU0tfU1RTX0EpOworCX0KKworCisJZnJlZV9pcnEoaXJxLCBydGMpOworCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHR3bF9ydGNfc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwkvKiBtYXNrIHRpbWVyIGludGVycnVwdHMsIGJ1dCBsZWF2ZSBhbGFybSBpbnRlcnJ1cHRzIG9uIHRvIGVuYWJsZQorCSAgIHBvd2VyLW9uIHdoZW4gYWxhcm0gaXMgdHJpZ2dlcmVkICovCisJbWFza19ydGNfaXJxX2JpdChCSVRfUlRDX0lOVEVSUlVQVFNfUkVHX0lUX1RJTUVSX00pOworfQorCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGlycXN0YXQ7CisKK3N0YXRpYyBpbnQgdHdsX3J0Y19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlpcnFzdGF0ID0gcnRjX2lycV9iaXRzOworCisJbWFza19ydGNfaXJxX2JpdChCSVRfUlRDX0lOVEVSUlVQVFNfUkVHX0lUX1RJTUVSX00pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR3bF9ydGNfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc2V0X3J0Y19pcnFfYml0KGlycXN0YXQpOworCXJldHVybiAwOworfQorCisjZWxzZQorI2RlZmluZSB0d2xfcnRjX3N1c3BlbmQgTlVMTAorI2RlZmluZSB0d2xfcnRjX3Jlc3VtZSAgTlVMTAorI2VuZGlmCisKK01PRFVMRV9BTElBUygicGxhdGZvcm06dHdsX3J0YyIpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0d2w0MDMwcnRjX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gdHdsX3J0Y19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHR3bF9ydGNfcmVtb3ZlKSwKKwkuc2h1dGRvd24JPSB0d2xfcnRjX3NodXRkb3duLAorCS5zdXNwZW5kCT0gdHdsX3J0Y19zdXNwZW5kLAorCS5yZXN1bWUJCT0gdHdsX3J0Y19yZXN1bWUsCisJLmRyaXZlcgkJPSB7CisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkubmFtZQk9ICJ0d2xfcnRjIiwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgdHdsX3J0Y19pbml0KHZvaWQpCit7CisJaWYgKHR3bF9jbGFzc19pc180MDMwKCkpCisJCXJ0Y19yZWdfbWFwID0gKHU4ICopIHR3bDQwMzBfcnRjX3JlZ19tYXA7CisJZWxzZQorCQlydGNfcmVnX21hcCA9ICh1OCAqKSB0d2w2MDMwX3J0Y19yZWdfbWFwOworCisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdHdsNDAzMHJ0Y19kcml2ZXIpOworfQorbW9kdWxlX2luaXQodHdsX3J0Y19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHR3bF9ydGNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0d2w0MDMwcnRjX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCh0d2xfcnRjX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJUZXhhcyBJbnN0cnVtZW50cywgTW9udGFWaXN0YSBTb2Z0d2FyZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXR3bDQwMzAuYyBiL2RyaXZlcnMvcnRjL3J0Yy10d2w0MDMwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljOGM3MGMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXR3bDQwMzAuYworKysgL2Rldi9udWxsCkBAIC0xLDU0MCArMCwwIEBACi0vKgotICogcnRjLXR3bDQwMzAuYyAtLSBUV0w0MDMwIFJlYWwgVGltZSBDbG9jayBpbnRlcmZhY2UKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jCi0gKiBBdXRob3I6IEFsZXhhbmRyZSBSdXNldiA8c291cmNlQG12aXN0YS5jb20+Ci0gKgotICogQmFzZWQgb24gb3JpZ2luYWwgVEkgZHJpdmVyIHR3bDQwMzAtcnRjLmMKLSAqICAgQ29weXJpZ2h0IChDKSAyMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCi0gKgotICogQmFzZWQgb24gcnRjLW9tYXAuYwotICogICBDb3B5cmlnaHQgKEMpIDIwMDMgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgotICogICBBdXRob3I6IEdlb3JnZSBHLiBEYXZpcyA8Z2RhdmlzQG12aXN0YS5jb20+IG9yIDxzb3VyY2VAbXZpc3RhLmNvbT4KLSAqICAgQ29weXJpZ2h0IChDKSAyMDA2IERhdmlkIEJyb3duZWxsCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9ydGMuaD4KLSNpbmNsdWRlIDxsaW51eC9iY2QuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2kyYy90d2w0MDMwLmg+Ci0KLQotLyoKLSAqIFJUQyBibG9jayByZWdpc3RlciBvZmZzZXRzICh1c2UgVFdMX01PRFVMRV9SVEMpCi0gKi8KLSNkZWZpbmUgUkVHX1NFQ09ORFNfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwCi0jZGVmaW5lIFJFR19NSU5VVEVTX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBSRUdfSE9VUlNfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKLSNkZWZpbmUgUkVHX0RBWVNfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzCi0jZGVmaW5lIFJFR19NT05USFNfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNAotI2RlZmluZSBSRUdfWUVBUlNfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUKLSNkZWZpbmUgUkVHX1dFRUtTX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2Ci0KLSNkZWZpbmUgUkVHX0FMQVJNX1NFQ09ORFNfUkVHICAgICAgICAgICAgICAgICAgICAweDA3Ci0jZGVmaW5lIFJFR19BTEFSTV9NSU5VVEVTX1JFRyAgICAgICAgICAgICAgICAgICAgMHgwOAotI2RlZmluZSBSRUdfQUxBUk1fSE9VUlNfUkVHICAgICAgICAgICAgICAgICAgICAgIDB4MDkKLSNkZWZpbmUgUkVHX0FMQVJNX0RBWVNfUkVHICAgICAgICAgICAgICAgICAgICAgICAweDBBCi0jZGVmaW5lIFJFR19BTEFSTV9NT05USFNfUkVHICAgICAgICAgICAgICAgICAgICAgMHgwQgotI2RlZmluZSBSRUdfQUxBUk1fWUVBUlNfUkVHICAgICAgICAgICAgICAgICAgICAgIDB4MEMKLQotI2RlZmluZSBSRUdfUlRDX0NUUkxfUkVHICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQKLSNkZWZpbmUgUkVHX1JUQ19TVEFUVVNfUkVHICAgICAgICAgICAgICAgICAgICAgICAweDBFCi0jZGVmaW5lIFJFR19SVENfSU5URVJSVVBUU19SRUcgICAgICAgICAgICAgICAgICAgMHgwRgotCi0jZGVmaW5lIFJFR19SVENfQ09NUF9MU0JfUkVHICAgICAgICAgICAgICAgICAgICAgMHgxMAotI2RlZmluZSBSRUdfUlRDX0NPTVBfTVNCX1JFRyAgICAgICAgICAgICAgICAgICAgIDB4MTEKLQotLyogUlRDX0NUUkxfUkVHIGJpdGZpZWxkcyAqLwotI2RlZmluZSBCSVRfUlRDX0NUUkxfUkVHX1NUT1BfUlRDX00gICAgICAgICAgICAgIDB4MDEKLSNkZWZpbmUgQklUX1JUQ19DVFJMX1JFR19ST1VORF8zMFNfTSAgICAgICAgICAgICAweDAyCi0jZGVmaW5lIEJJVF9SVENfQ1RSTF9SRUdfQVVUT19DT01QX00gICAgICAgICAgICAgMHgwNAotI2RlZmluZSBCSVRfUlRDX0NUUkxfUkVHX01PREVfMTJfMjRfTSAgICAgICAgICAgIDB4MDgKLSNkZWZpbmUgQklUX1JUQ19DVFJMX1JFR19URVNUX01PREVfTSAgICAgICAgICAgICAweDEwCi0jZGVmaW5lIEJJVF9SVENfQ1RSTF9SRUdfU0VUXzMyX0NPVU5URVJfTSAgICAgICAgMHgyMAotI2RlZmluZSBCSVRfUlRDX0NUUkxfUkVHX0dFVF9USU1FX00gICAgICAgICAgICAgIDB4NDAKLQotLyogUlRDX1NUQVRVU19SRUcgYml0ZmllbGRzICovCi0jZGVmaW5lIEJJVF9SVENfU1RBVFVTX1JFR19SVU5fTSAgICAgICAgICAgICAgICAgMHgwMgotI2RlZmluZSBCSVRfUlRDX1NUQVRVU19SRUdfMVNfRVZFTlRfTSAgICAgICAgICAgIDB4MDQKLSNkZWZpbmUgQklUX1JUQ19TVEFUVVNfUkVHXzFNX0VWRU5UX00gICAgICAgICAgICAweDA4Ci0jZGVmaW5lIEJJVF9SVENfU1RBVFVTX1JFR18xSF9FVkVOVF9NICAgICAgICAgICAgMHgxMAotI2RlZmluZSBCSVRfUlRDX1NUQVRVU19SRUdfMURfRVZFTlRfTSAgICAgICAgICAgIDB4MjAKLSNkZWZpbmUgQklUX1JUQ19TVEFUVVNfUkVHX0FMQVJNX00gICAgICAgICAgICAgICAweDQwCi0jZGVmaW5lIEJJVF9SVENfU1RBVFVTX1JFR19QT1dFUl9VUF9NICAgICAgICAgICAgMHg4MAotCi0vKiBSVENfSU5URVJSVVBUU19SRUcgYml0ZmllbGRzICovCi0jZGVmaW5lIEJJVF9SVENfSU5URVJSVVBUU19SRUdfRVZFUllfTSAgICAgICAgICAgMHgwMwotI2RlZmluZSBCSVRfUlRDX0lOVEVSUlVQVFNfUkVHX0lUX1RJTUVSX00gICAgICAgIDB4MDQKLSNkZWZpbmUgQklUX1JUQ19JTlRFUlJVUFRTX1JFR19JVF9BTEFSTV9NICAgICAgICAweDA4Ci0KLQotLyogUkVHX1NFQ09ORFNfUkVHIHRocm91Z2ggUkVHX1lFQVJTX1JFRyBpcyBob3cgbWFueSByZWdpc3RlcnM/ICovCi0jZGVmaW5lIEFMTF9USU1FX1JFR1MJCTYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSAqIFN1cHBvcnRzIDEgYnl0ZSByZWFkIGZyb20gVFdMNDAzMCBSVEMgcmVnaXN0ZXIuCi0gKi8KLXN0YXRpYyBpbnQgdHdsNDAzMF9ydGNfcmVhZF91OCh1OCAqZGF0YSwgdTggcmVnKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSB0d2w0MDMwX2kyY19yZWFkX3U4KFRXTDQwMzBfTU9EVUxFX1JUQywgZGF0YSwgcmVnKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJfZXJyKCJ0d2w0MDMwX3J0YzogQ291bGQgbm90IHJlYWQgVFdMNDAzMCIKLQkJICAgICAgICJyZWdpc3RlciAlWCAtIGVycm9yICVkXG4iLCByZWcsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIFN1cHBvcnRzIDEgYnl0ZSB3cml0ZSB0byBUV0w0MDMwIFJUQyByZWdpc3RlcnMuCi0gKi8KLXN0YXRpYyBpbnQgdHdsNDAzMF9ydGNfd3JpdGVfdTgodTggZGF0YSwgdTggcmVnKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSB0d2w0MDMwX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9SVEMsIGRhdGEsIHJlZyk7Ci0JaWYgKHJldCA8IDApCi0JCXByX2VycigidHdsNDAzMF9ydGM6IENvdWxkIG5vdCB3cml0ZSBUV0w0MDMwIgotCQkgICAgICAgInJlZ2lzdGVyICVYIC0gZXJyb3IgJWRcbiIsIHJlZywgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogQ2FjaGUgdGhlIHZhbHVlIGZvciB0aW1lci9hbGFybSBpbnRlcnJ1cHRzIHJlZ2lzdGVyOyB0aGlzIGlzCi0gKiBvbmx5IGNoYW5nZWQgYnkgY2FsbGVycyBob2xkaW5nIHJ0YyBvcHMgbG9jayAob3IgcmVzdW1lKS4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIgcnRjX2lycV9iaXRzOwotCi0vKgotICogRW5hYmxlIDEvc2Vjb25kIHVwZGF0ZSBhbmQvb3IgYWxhcm0gaW50ZXJydXB0cy4KLSAqLwotc3RhdGljIGludCBzZXRfcnRjX2lycV9iaXQodW5zaWduZWQgY2hhciBiaXQpCi17Ci0JdW5zaWduZWQgY2hhciB2YWw7Ci0JaW50IHJldDsKLQotCXZhbCA9IHJ0Y19pcnFfYml0cyB8IGJpdDsKLQl2YWwgJj0gfkJJVF9SVENfSU5URVJSVVBUU19SRUdfRVZFUllfTTsKLQlyZXQgPSB0d2w0MDMwX3J0Y193cml0ZV91OCh2YWwsIFJFR19SVENfSU5URVJSVVBUU19SRUcpOwotCWlmIChyZXQgPT0gMCkKLQkJcnRjX2lycV9iaXRzID0gdmFsOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIERpc2FibGUgdXBkYXRlIGFuZC9vciBhbGFybSBpbnRlcnJ1cHRzLgotICovCi1zdGF0aWMgaW50IG1hc2tfcnRjX2lycV9iaXQodW5zaWduZWQgY2hhciBiaXQpCi17Ci0JdW5zaWduZWQgY2hhciB2YWw7Ci0JaW50IHJldDsKLQotCXZhbCA9IHJ0Y19pcnFfYml0cyAmIH5iaXQ7Ci0JcmV0ID0gdHdsNDAzMF9ydGNfd3JpdGVfdTgodmFsLCBSRUdfUlRDX0lOVEVSUlVQVFNfUkVHKTsKLQlpZiAocmV0ID09IDApCi0JCXJ0Y19pcnFfYml0cyA9IHZhbDsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdHdsNDAzMF9ydGNfYWxhcm1faXJxX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGVuYWJsZWQpCi17Ci0JaW50IHJldDsKLQotCWlmIChlbmFibGVkKQotCQlyZXQgPSBzZXRfcnRjX2lycV9iaXQoQklUX1JUQ19JTlRFUlJVUFRTX1JFR19JVF9BTEFSTV9NKTsKLQllbHNlCi0JCXJldCA9IG1hc2tfcnRjX2lycV9iaXQoQklUX1JUQ19JTlRFUlJVUFRTX1JFR19JVF9BTEFSTV9NKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdHdsNDAzMF9ydGNfdXBkYXRlX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBlbmFibGVkKQotewotCWludCByZXQ7Ci0KLQlpZiAoZW5hYmxlZCkKLQkJcmV0ID0gc2V0X3J0Y19pcnFfYml0KEJJVF9SVENfSU5URVJSVVBUU19SRUdfSVRfVElNRVJfTSk7Ci0JZWxzZQotCQlyZXQgPSBtYXNrX3J0Y19pcnFfYml0KEJJVF9SVENfSU5URVJSVVBUU19SRUdfSVRfVElNRVJfTSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogR2V0cyBjdXJyZW50IFRXTDQwMzAgUlRDIHRpbWUgYW5kIGRhdGUgcGFyYW1ldGVycy4KLSAqCi0gKiBUaGUgUlRDJ3MgdGltZS9hbGFybSByZXByZXNlbnRhdGlvbiBpcyBub3Qgd2hhdCBnbXRpbWUoMykgcmVxdWlyZXMKLSAqIExpbnV4IHRvIHVzZToKLSAqCi0gKiAgLSBNb250aHMgYXJlIDEuLjEyIHZzIExpbnV4IDAtMTEKLSAqICAtIFllYXJzIGFyZSAwLi45OSB2cyBMaW51eCAxOTAwLi5OICh3ZSBhc3N1bWUgMjFzdCBjZW50dXJ5KQotICovCi1zdGF0aWMgaW50IHR3bDQwMzBfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCi17Ci0JdW5zaWduZWQgY2hhciBydGNfZGF0YVtBTExfVElNRV9SRUdTICsgMV07Ci0JaW50IHJldDsKLQl1OCBzYXZlX2NvbnRyb2w7Ci0KLQlyZXQgPSB0d2w0MDMwX3J0Y19yZWFkX3U4KCZzYXZlX2NvbnRyb2wsIFJFR19SVENfQ1RSTF9SRUcpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0Jc2F2ZV9jb250cm9sIHw9IEJJVF9SVENfQ1RSTF9SRUdfR0VUX1RJTUVfTTsKLQotCXJldCA9IHR3bDQwMzBfcnRjX3dyaXRlX3U4KHNhdmVfY29udHJvbCwgUkVHX1JUQ19DVFJMX1JFRyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSB0d2w0MDMwX2kyY19yZWFkKFRXTDQwMzBfTU9EVUxFX1JUQywgcnRjX2RhdGEsCi0JCQkgICAgICAgUkVHX1NFQ09ORFNfUkVHLCBBTExfVElNRV9SRUdTKTsKLQotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoZGV2LCAicnRjX3JlYWRfdGltZSBlcnJvciAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQl0bS0+dG1fc2VjID0gYmNkMmJpbihydGNfZGF0YVswXSk7Ci0JdG0tPnRtX21pbiA9IGJjZDJiaW4ocnRjX2RhdGFbMV0pOwotCXRtLT50bV9ob3VyID0gYmNkMmJpbihydGNfZGF0YVsyXSk7Ci0JdG0tPnRtX21kYXkgPSBiY2QyYmluKHJ0Y19kYXRhWzNdKTsKLQl0bS0+dG1fbW9uID0gYmNkMmJpbihydGNfZGF0YVs0XSkgLSAxOwotCXRtLT50bV95ZWFyID0gYmNkMmJpbihydGNfZGF0YVs1XSkgKyAxMDA7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHR3bDQwMzBfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKLXsKLQl1bnNpZ25lZCBjaGFyIHNhdmVfY29udHJvbDsKLQl1bnNpZ25lZCBjaGFyIHJ0Y19kYXRhW0FMTF9USU1FX1JFR1MgKyAxXTsKLQlpbnQgcmV0OwotCi0JcnRjX2RhdGFbMV0gPSBiaW4yYmNkKHRtLT50bV9zZWMpOwotCXJ0Y19kYXRhWzJdID0gYmluMmJjZCh0bS0+dG1fbWluKTsKLQlydGNfZGF0YVszXSA9IGJpbjJiY2QodG0tPnRtX2hvdXIpOwotCXJ0Y19kYXRhWzRdID0gYmluMmJjZCh0bS0+dG1fbWRheSk7Ci0JcnRjX2RhdGFbNV0gPSBiaW4yYmNkKHRtLT50bV9tb24gKyAxKTsKLQlydGNfZGF0YVs2XSA9IGJpbjJiY2QodG0tPnRtX3llYXIgLSAxMDApOwotCi0JLyogU3RvcCBSVEMgd2hpbGUgdXBkYXRpbmcgdGhlIFRDIHJlZ2lzdGVycyAqLwotCXJldCA9IHR3bDQwMzBfcnRjX3JlYWRfdTgoJnNhdmVfY29udHJvbCwgUkVHX1JUQ19DVFJMX1JFRyk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OwotCi0Jc2F2ZV9jb250cm9sICY9IH5CSVRfUlRDX0NUUkxfUkVHX1NUT1BfUlRDX007Ci0JdHdsNDAzMF9ydGNfd3JpdGVfdTgoc2F2ZV9jb250cm9sLCBSRUdfUlRDX0NUUkxfUkVHKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7Ci0KLQkvKiB1cGRhdGUgYWxsIHRoZSB0aW1lIHJlZ2lzdGVycyBpbiBvbmUgc2hvdCAqLwotCXJldCA9IHR3bDQwMzBfaTJjX3dyaXRlKFRXTDQwMzBfTU9EVUxFX1JUQywgcnRjX2RhdGEsCi0JCQlSRUdfU0VDT05EU19SRUcsIEFMTF9USU1FX1JFR1MpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoZGV2LCAicnRjX3NldF90aW1lIGVycm9yICVkXG4iLCByZXQpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBTdGFydCBiYWNrIFJUQyAqLwotCXNhdmVfY29udHJvbCB8PSBCSVRfUlRDX0NUUkxfUkVHX1NUT1BfUlRDX007Ci0JcmV0ID0gdHdsNDAzMF9ydGNfd3JpdGVfdTgoc2F2ZV9jb250cm9sLCBSRUdfUlRDX0NUUkxfUkVHKTsKLQotb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBHZXRzIGN1cnJlbnQgVFdMNDAzMCBSVEMgYWxhcm0gdGltZS4KLSAqLwotc3RhdGljIGludCB0d2w0MDMwX3J0Y19yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFsbSkKLXsKLQl1bnNpZ25lZCBjaGFyIHJ0Y19kYXRhW0FMTF9USU1FX1JFR1MgKyAxXTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gdHdsNDAzMF9pMmNfcmVhZChUV0w0MDMwX01PRFVMRV9SVEMsIHJ0Y19kYXRhLAotCQkJICAgICAgIFJFR19BTEFSTV9TRUNPTkRTX1JFRywgQUxMX1RJTUVfUkVHUyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihkZXYsICJydGNfcmVhZF9hbGFybSBlcnJvciAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBzb21lIG9mIHRoZXNlIGZpZWxkcyBtYXkgYmUgd2lsZGNhcmQvIm1hdGNoIGFsbCIgKi8KLQlhbG0tPnRpbWUudG1fc2VjID0gYmNkMmJpbihydGNfZGF0YVswXSk7Ci0JYWxtLT50aW1lLnRtX21pbiA9IGJjZDJiaW4ocnRjX2RhdGFbMV0pOwotCWFsbS0+dGltZS50bV9ob3VyID0gYmNkMmJpbihydGNfZGF0YVsyXSk7Ci0JYWxtLT50aW1lLnRtX21kYXkgPSBiY2QyYmluKHJ0Y19kYXRhWzNdKTsKLQlhbG0tPnRpbWUudG1fbW9uID0gYmNkMmJpbihydGNfZGF0YVs0XSkgLSAxOwotCWFsbS0+dGltZS50bV95ZWFyID0gYmNkMmJpbihydGNfZGF0YVs1XSkgKyAxMDA7Ci0KLQkvKiByZXBvcnQgY2FjaGVkIGFsYXJtIGVuYWJsZSBzdGF0ZSAqLwotCWlmIChydGNfaXJxX2JpdHMgJiBCSVRfUlRDX0lOVEVSUlVQVFNfUkVHX0lUX0FMQVJNX00pCi0JCWFsbS0+ZW5hYmxlZCA9IDE7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHR3bDQwMzBfcnRjX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbG0pCi17Ci0JdW5zaWduZWQgY2hhciBhbGFybV9kYXRhW0FMTF9USU1FX1JFR1MgKyAxXTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gdHdsNDAzMF9ydGNfYWxhcm1faXJxX2VuYWJsZShkZXYsIDApOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCi0JYWxhcm1fZGF0YVsxXSA9IGJpbjJiY2QoYWxtLT50aW1lLnRtX3NlYyk7Ci0JYWxhcm1fZGF0YVsyXSA9IGJpbjJiY2QoYWxtLT50aW1lLnRtX21pbik7Ci0JYWxhcm1fZGF0YVszXSA9IGJpbjJiY2QoYWxtLT50aW1lLnRtX2hvdXIpOwotCWFsYXJtX2RhdGFbNF0gPSBiaW4yYmNkKGFsbS0+dGltZS50bV9tZGF5KTsKLQlhbGFybV9kYXRhWzVdID0gYmluMmJjZChhbG0tPnRpbWUudG1fbW9uICsgMSk7Ci0JYWxhcm1fZGF0YVs2XSA9IGJpbjJiY2QoYWxtLT50aW1lLnRtX3llYXIgLSAxMDApOwotCi0JLyogdXBkYXRlIGFsbCB0aGUgYWxhcm0gcmVnaXN0ZXJzIGluIG9uZSBzaG90ICovCi0JcmV0ID0gdHdsNDAzMF9pMmNfd3JpdGUoVFdMNDAzMF9NT0RVTEVfUlRDLCBhbGFybV9kYXRhLAotCQkJUkVHX0FMQVJNX1NFQ09ORFNfUkVHLCBBTExfVElNRV9SRUdTKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZGV2LCAicnRjX3NldF9hbGFybSBlcnJvciAlZFxuIiwgcmV0KTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKGFsbS0+ZW5hYmxlZCkKLQkJcmV0ID0gdHdsNDAzMF9ydGNfYWxhcm1faXJxX2VuYWJsZShkZXYsIDEpOwotb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCB0d2w0MDMwX3J0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqcnRjKQotewotCXVuc2lnbmVkIGxvbmcgZXZlbnRzID0gMDsKLQlpbnQgcmV0ID0gSVJRX05PTkU7Ci0JaW50IHJlczsKLQl1OCByZF9yZWc7Ci0KLSNpZmRlZiBDT05GSUdfTE9DS0RFUAotCS8qIFdPUktBUk9VTkQgZm9yIGxvY2tkZXAgZm9yY2luZyBJUlFGX0RJU0FCTEVEIG9uIHVzLCB3aGljaAotCSAqIHdlIGRvbid0IHdhbnQgYW5kIGNhbid0IHRvbGVyYXRlLiAgQWx0aG91Z2ggaXQgbWlnaHQgYmUKLQkgKiBmcmllbmRsaWVyIG5vdCB0byBib3Jyb3cgdGhpcyB0aHJlYWQgY29udGV4dC4uLgotCSAqLwotCWxvY2FsX2lycV9lbmFibGUoKTsKLSNlbmRpZgotCi0JcmVzID0gdHdsNDAzMF9ydGNfcmVhZF91OCgmcmRfcmVnLCBSRUdfUlRDX1NUQVRVU19SRUcpOwotCWlmIChyZXMpCi0JCWdvdG8gb3V0OwotCS8qCi0JICogRmlndXJlIG91dCBzb3VyY2Ugb2YgaW50ZXJydXB0OiBBTEFSTSBvciBUSU1FUiBpbiBSVENfU1RBVFVTX1JFRy4KLQkgKiBvbmx5IG9uZSAoQUxBUk0gb3IgUlRDKSBpbnRlcnJ1cHQgc291cmNlIG1heSBiZSBlbmFibGVkCi0JICogYXQgdGltZSwgd2UgYWxzbyBjb3VsZCBjaGVjayBvdXIgcmVzdWx0cwotCSAqIGJ5IHJlYWRpbmcgUlRTX0lOVEVSUlVQVFNfUkVHSVNURVJbSVRfVElNRVIsSVRfQUxBUk1dCi0JICovCi0JaWYgKHJkX3JlZyAmIEJJVF9SVENfU1RBVFVTX1JFR19BTEFSTV9NKQotCQlldmVudHMgfD0gUlRDX0lSUUYgfCBSVENfQUY7Ci0JZWxzZQotCQlldmVudHMgfD0gUlRDX0lSUUYgfCBSVENfVUY7Ci0KLQlyZXMgPSB0d2w0MDMwX3J0Y193cml0ZV91OChyZF9yZWcgfCBCSVRfUlRDX1NUQVRVU19SRUdfQUxBUk1fTSwKLQkJCQkgICBSRUdfUlRDX1NUQVRVU19SRUcpOwotCWlmIChyZXMpCi0JCWdvdG8gb3V0OwotCi0JLyogQ2xlYXIgb24gUmVhZCBlbmFibGVkLiBSVENfSVQgYml0IG9mIFRXTDQwMzBfSU5UX1BXUl9JU1IxCi0JICogbmVlZHMgMiByZWFkcyB0byBjbGVhciB0aGUgaW50ZXJydXB0LiBPbmUgcmVhZCBpcyBkb25lIGluCi0JICogZG9fdHdsNDAzMF9wd3JpcnEoKS4gRG9pbmcgdGhlIHNlY29uZCByZWFkLCB0byBjbGVhcgotCSAqIHRoZSBiaXQuCi0JICoKLQkgKiBGSVhNRSB0aGUgcmVhc29uIFBXUl9JU1IxIG5lZWRzIGFuIGV4dHJhIHJlYWQgaXMgdGhhdAotCSAqIFJUQ19JRiByZXRyaWdnZXJlZCB1bnRpbCB3ZSBjbGVhcmVkIFJFR19BTEFSTV9NIGFib3ZlLgotCSAqIEJ1dCByZS1yZWFkaW5nIGxpa2UgdGhpcyBpcyBhIGJhZCBoYWNrOyBieSBkb2luZyBzbyB3ZQotCSAqIHJpc2sgd3JvbmdseSBjbGVhcmluZyBzdGF0dXMgZm9yIHNvbWUgb3RoZXIgSVJRIChsb3NpbmcKLQkgKiB0aGUgaW50ZXJydXB0KS4gIEJlIHNtYXJ0ZXIgYWJvdXQgaGFuZGxpbmcgUlRDX1VGIC4uLgotCSAqLwotCXJlcyA9IHR3bDQwMzBfaTJjX3JlYWRfdTgoVFdMNDAzMF9NT0RVTEVfSU5ULAotCQkJJnJkX3JlZywgVFdMNDAzMF9JTlRfUFdSX0lTUjEpOwotCWlmIChyZXMpCi0JCWdvdG8gb3V0OwotCi0JLyogTm90aWZ5IFJUQyBjb3JlIG9uIGV2ZW50ICovCi0JcnRjX3VwZGF0ZV9pcnEocnRjLCAxLCBldmVudHMpOwotCi0JcmV0ID0gSVJRX0hBTkRMRUQ7Ci1vdXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCBydGNfY2xhc3Nfb3BzIHR3bDQwMzBfcnRjX29wcyA9IHsKLQkucmVhZF90aW1lCT0gdHdsNDAzMF9ydGNfcmVhZF90aW1lLAotCS5zZXRfdGltZQk9IHR3bDQwMzBfcnRjX3NldF90aW1lLAotCS5yZWFkX2FsYXJtCT0gdHdsNDAzMF9ydGNfcmVhZF9hbGFybSwKLQkuc2V0X2FsYXJtCT0gdHdsNDAzMF9ydGNfc2V0X2FsYXJtLAotCS5hbGFybV9pcnFfZW5hYmxlID0gdHdsNDAzMF9ydGNfYWxhcm1faXJxX2VuYWJsZSwKLQkudXBkYXRlX2lycV9lbmFibGUgPSB0d2w0MDMwX3J0Y191cGRhdGVfaXJxX2VuYWJsZSwKLX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgX19kZXZpbml0IHR3bDQwMzBfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQl1OCByZF9yZWc7Ci0KLQlpZiAoaXJxIDw9IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihwZGV2LT5uYW1lLAotCQkJCSAgJnBkZXYtPmRldiwgJnR3bDQwMzBfcnRjX29wcywgVEhJU19NT0RVTEUpOwotCWlmIChJU19FUlIocnRjKSkgewotCQlyZXQgPSBQVFJfRVJSKHJ0Yyk7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IHJlZ2lzdGVyIFJUQyBkZXZpY2UsIGVyciAlbGRcbiIsCi0JCQlQVFJfRVJSKHJ0YykpOwotCQlnb3RvIG91dDA7Ci0KLQl9Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBydGMpOwotCi0JcmV0ID0gdHdsNDAzMF9ydGNfcmVhZF91OCgmcmRfcmVnLCBSRUdfUlRDX1NUQVRVU19SRUcpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDE7Ci0KLQlpZiAocmRfcmVnICYgQklUX1JUQ19TVEFUVVNfUkVHX1BPV0VSX1VQX00pCi0JCWRldl93YXJuKCZwZGV2LT5kZXYsICJQb3dlciB1cCByZXNldCBkZXRlY3RlZC5cbiIpOwotCi0JaWYgKHJkX3JlZyAmIEJJVF9SVENfU1RBVFVTX1JFR19BTEFSTV9NKQotCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiUGVuZGluZyBBbGFybSBpbnRlcnJ1cHQgZGV0ZWN0ZWQuXG4iKTsKLQotCS8qIENsZWFyIFJUQyBQb3dlciB1cCByZXNldCBhbmQgcGVuZGluZyBhbGFybSBpbnRlcnJ1cHRzICovCi0JcmV0ID0gdHdsNDAzMF9ydGNfd3JpdGVfdTgocmRfcmVnLCBSRUdfUlRDX1NUQVRVU19SRUcpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDE7Ci0KLQlyZXQgPSByZXF1ZXN0X2lycShpcnEsIHR3bDQwMzBfcnRjX2ludGVycnVwdCwKLQkJCQlJUlFGX1RSSUdHRVJfUklTSU5HLAotCQkJCWRldl9uYW1lKCZydGMtPmRldiksIHJ0Yyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiSVJRIGlzIG5vdCBmcmVlLlxuIik7Ci0JCWdvdG8gb3V0MTsKLQl9Ci0KLQkvKiBDaGVjayBSVEMgbW9kdWxlIHN0YXR1cywgRW5hYmxlIGlmIGl0IGlzIG9mZiAqLwotCXJldCA9IHR3bDQwMzBfcnRjX3JlYWRfdTgoJnJkX3JlZywgUkVHX1JUQ19DVFJMX1JFRyk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0MjsKLQotCWlmICghKHJkX3JlZyAmIEJJVF9SVENfQ1RSTF9SRUdfU1RPUF9SVENfTSkpIHsKLQkJZGV2X2luZm8oJnBkZXYtPmRldiwgIkVuYWJsaW5nIFRXTDQwMzAtUlRDLlxuIik7Ci0JCXJkX3JlZyA9IEJJVF9SVENfQ1RSTF9SRUdfU1RPUF9SVENfTTsKLQkJcmV0ID0gdHdsNDAzMF9ydGNfd3JpdGVfdTgocmRfcmVnLCBSRUdfUlRDX0NUUkxfUkVHKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIG91dDI7Ci0JfQotCi0JLyogaW5pdCBjYWNoZWQgSVJRIGVuYWJsZSBiaXRzICovCi0JcmV0ID0gdHdsNDAzMF9ydGNfcmVhZF91OCgmcnRjX2lycV9iaXRzLCBSRUdfUlRDX0lOVEVSUlVQVFNfUkVHKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQyOwotCi0JcmV0dXJuIHJldDsKLQotb3V0MjoKLQlmcmVlX2lycShpcnEsIHJ0Yyk7Ci1vdXQxOgotCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOwotb3V0MDoKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogRGlzYWJsZSBhbGwgVFdMNDAzMCBSVEMgbW9kdWxlIGludGVycnVwdHMuCi0gKiBTZXRzIHN0YXR1cyBmbGFnIHRvIGZyZWUuCi0gKi8KLXN0YXRpYyBpbnQgX19kZXZleGl0IHR3bDQwMzBfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCS8qIGxlYXZlIHJ0YyBydW5uaW5nLCBidXQgZGlzYWJsZSBpcnFzICovCi0Jc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCWludCBpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwotCi0JbWFza19ydGNfaXJxX2JpdChCSVRfUlRDX0lOVEVSUlVQVFNfUkVHX0lUX0FMQVJNX00pOwotCW1hc2tfcnRjX2lycV9iaXQoQklUX1JUQ19JTlRFUlJVUFRTX1JFR19JVF9USU1FUl9NKTsKLQotCWZyZWVfaXJxKGlycSwgcnRjKTsKLQotCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB0d2w0MDMwX3J0Y19zaHV0ZG93bihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCS8qIG1hc2sgdGltZXIgaW50ZXJydXB0cywgYnV0IGxlYXZlIGFsYXJtIGludGVycnVwdHMgb24gdG8gZW5hYmxlCi0JICAgcG93ZXItb24gd2hlbiBhbGFybSBpcyB0cmlnZ2VyZWQgKi8KLQltYXNrX3J0Y19pcnFfYml0KEJJVF9SVENfSU5URVJSVVBUU19SRUdfSVRfVElNRVJfTSk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfUE0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgaXJxc3RhdDsKLQotc3RhdGljIGludCB0d2w0MDMwX3J0Y19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlpcnFzdGF0ID0gcnRjX2lycV9iaXRzOwotCi0JbWFza19ydGNfaXJxX2JpdChCSVRfUlRDX0lOVEVSUlVQVFNfUkVHX0lUX1RJTUVSX00pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHR3bDQwMzBfcnRjX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXNldF9ydGNfaXJxX2JpdChpcnFzdGF0KTsKLQlyZXR1cm4gMDsKLX0KLQotI2Vsc2UKLSNkZWZpbmUgdHdsNDAzMF9ydGNfc3VzcGVuZCBOVUxMCi0jZGVmaW5lIHR3bDQwMzBfcnRjX3Jlc3VtZSAgTlVMTAotI2VuZGlmCi0KLU1PRFVMRV9BTElBUygicGxhdGZvcm06dHdsNDAzMF9ydGMiKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdHdsNDAzMHJ0Y19kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IHR3bDQwMzBfcnRjX3Byb2JlLAotCS5yZW1vdmUJCT0gX19kZXZleGl0X3AodHdsNDAzMF9ydGNfcmVtb3ZlKSwKLQkuc2h1dGRvd24JPSB0d2w0MDMwX3J0Y19zaHV0ZG93biwKLQkuc3VzcGVuZAk9IHR3bDQwMzBfcnRjX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSB0d2w0MDMwX3J0Y19yZXN1bWUsCi0JLmRyaXZlcgkJPSB7Ci0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCQkubmFtZQk9ICJ0d2w0MDMwX3J0YyIsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHR3bDQwMzBfcnRjX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ0d2w0MDMwcnRjX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdCh0d2w0MDMwX3J0Y19pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IHR3bDQwMzBfcnRjX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdHdsNDAzMHJ0Y19kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQodHdsNDAzMF9ydGNfZXhpdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIlRleGFzIEluc3RydW1lbnRzLCBNb250YVZpc3RhIFNvZnR3YXJlIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtd204MzUwLmMgYi9kcml2ZXJzL3J0Yy9ydGMtd204MzUwLmMKaW5kZXggYzkxZWRjNS4uZjE2NDg2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXdtODM1MC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy13bTgzNTAuYwpAQCAtMzE1LDkgKzMxNSw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHdtODM1MF9ydGNfYWxhcm1faGFuZGxlcihzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBpcnEsCi0JCQkJICAgICB2b2lkICpkYXRhKQorc3RhdGljIGlycXJldHVybl90IHdtODM1MF9ydGNfYWxhcm1faGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQogeworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IGRhdGE7CiAJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHdtODM1MC0+cnRjLnJ0YzsKIAlpbnQgcmV0OwogCkBAIC0zMzAsMTQgKzMzMCwxOCBAQAogCQlkZXZfZXJyKCYod204MzUwLT5ydGMucGRldi0+ZGV2KSwKIAkJCSJGYWlsZWQgdG8gZGlzYWJsZSBhbGFybTogJWRcbiIsIHJldCk7CiAJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgdm9pZCB3bTgzNTBfcnRjX3VwZGF0ZV9oYW5kbGVyKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IGlycSwKLQkJCQkgICAgICB2b2lkICpkYXRhKQorc3RhdGljIGlycXJldHVybl90IHdtODM1MF9ydGNfdXBkYXRlX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKIHsKKwlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSBkYXRhOwogCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSB3bTgzNTAtPnJ0Yy5ydGM7CiAKIAlydGNfdXBkYXRlX2lycShydGMsIDEsIFJUQ19JUlFGIHwgUlRDX1VGKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIHdtODM1MF9ydGNfb3BzID0gewpAQCAtNDU1LDE1ICs0NTksMTQgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQl3bTgzNTBfbWFza19pcnEod204MzUwLCBXTTgzNTBfSVJRX1JUQ19TRUMpOwotCXdtODM1MF9tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfUlRDX1BFUik7Ci0KIAl3bTgzNTBfcmVnaXN0ZXJfaXJxKHdtODM1MCwgV004MzUwX0lSUV9SVENfU0VDLAotCQkJICAgIHdtODM1MF9ydGNfdXBkYXRlX2hhbmRsZXIsIE5VTEwpOworCQkJICAgIHdtODM1MF9ydGNfdXBkYXRlX2hhbmRsZXIsIDAsCisJCQkgICAgIlJUQyBTZWNvbmRzIiwgd204MzUwKTsKKwl3bTgzNTBfbWFza19pcnEod204MzUwLCBXTTgzNTBfSVJRX1JUQ19TRUMpOwogCiAJd204MzUwX3JlZ2lzdGVyX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfUlRDX0FMTSwKLQkJCSAgICB3bTgzNTBfcnRjX2FsYXJtX2hhbmRsZXIsIE5VTEwpOwotCXdtODM1MF91bm1hc2tfaXJxKHdtODM1MCwgV004MzUwX0lSUV9SVENfQUxNKTsKKwkJCSAgICB3bTgzNTBfcnRjX2FsYXJtX2hhbmRsZXIsIDAsCisJCQkgICAgIlJUQyBBbGFybSIsIHdtODM1MCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ3Myw4ICs0NzYsNiBAQAogCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCB3bTgzNTBfcnRjICp3bV9ydGMgPSAmd204MzUwLT5ydGM7CiAKLQl3bTgzNTBfbWFza19pcnEod204MzUwLCBXTTgzNTBfSVJRX1JUQ19TRUMpOwotCiAJd204MzUwX2ZyZWVfaXJxKHdtODM1MCwgV004MzUwX0lSUV9SVENfU0VDKTsKIAl3bTgzNTBfZnJlZV9pcnEod204MzUwLCBXTTgzNTBfSVJRX1JUQ19BTE0pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L25ldGl1Y3YuYyBiL2RyaXZlcnMvczM5MC9uZXQvbmV0aXVjdi5jCmluZGV4IDM5NWMwNGMuLjk4YzA0Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvbmV0aXVjdi5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvbmV0aXVjdi5jCkBAIC0xMTMsMTEgKzExMyw5IEBACiAjZGVmaW5lIElVQ1ZfREJGX1RFWFRfKG5hbWUsIGxldmVsLCB0ZXh0Li4uKSBcCiAJZG8geyBcCiAJCWlmIChpdWN2X2RiZl9wYXNzZXMoaXVjdl9kYmZfIyNuYW1lLCBsZXZlbCkpIHsgXAotCQkJY2hhciogaXVjdl9kYmZfdHh0X2J1ZiA9IFwKLQkJCQkJZ2V0X2NwdV92YXIoaXVjdl9kYmZfdHh0X2J1Zik7IFwKLQkJCXNwcmludGYoaXVjdl9kYmZfdHh0X2J1ZiwgdGV4dCk7IFwKLQkJCWRlYnVnX3RleHRfZXZlbnQoaXVjdl9kYmZfIyNuYW1lLCBsZXZlbCwgXAotCQkJCQkJaXVjdl9kYmZfdHh0X2J1Zik7IFwKKwkJCWNoYXIqIF9fYnVmID0gZ2V0X2NwdV92YXIoaXVjdl9kYmZfdHh0X2J1Zik7IFwKKwkJCXNwcmludGYoX19idWYsIHRleHQpOyBcCisJCQlkZWJ1Z190ZXh0X2V2ZW50KGl1Y3ZfZGJmXyMjbmFtZSwgbGV2ZWwsIF9fYnVmKTsgXAogCQkJcHV0X2NwdV92YXIoaXVjdl9kYmZfdHh0X2J1Zik7IFwKIAkJfSBcCiAJfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsLzgyNTAuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTAuYwppbmRleCA3MzdiNGM5Li5jM2UzN2M4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvODI1MC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzgyNTAuYwpAQCAtMTMzOSwxNCArMTMzOSwxMiBAQAogCQlzZXJpYWxfb3V0KHVwLCBVQVJUX0lFUiwgdXAtPmllcik7CiAKIAkJaWYgKHVwLT5idWdzICYgVUFSVF9CVUdfVFhFTikgewotCQkJdW5zaWduZWQgY2hhciBsc3IsIGlpcjsKKwkJCXVuc2lnbmVkIGNoYXIgbHNyOwogCQkJbHNyID0gc2VyaWFsX2luKHVwLCBVQVJUX0xTUik7CiAJCQl1cC0+bHNyX3NhdmVkX2ZsYWdzIHw9IGxzciAmIExTUl9TQVZFX0ZMQUdTOwotCQkJaWlyID0gc2VyaWFsX2luKHVwLCBVQVJUX0lJUikgJiAweDBmOwogCQkJaWYgKCh1cC0+cG9ydC50eXBlID09IFBPUlRfUk05MDAwKSA/Ci0JCQkJKGxzciAmIFVBUlRfTFNSX1RIUkUgJiYKLQkJCQkoaWlyID09IFVBUlRfSUlSX05PX0lOVCB8fCBpaXIgPT0gVUFSVF9JSVJfVEhSSSkpIDoKLQkJCQkobHNyICYgVUFSVF9MU1JfVEVNVCAmJiBpaXIgJiBVQVJUX0lJUl9OT19JTlQpKQorCQkJCShsc3IgJiBVQVJUX0xTUl9USFJFKSA6CisJCQkJKGxzciAmIFVBUlRfTFNSX1RFTVQpKQogCQkJCXRyYW5zbWl0X2NoYXJzKHVwKTsKIAkJfQogCX0KQEAgLTI2NDYsNyArMjY0NCw3IEBACiB7CiAJc3RydWN0IHVhcnRfODI1MF9wb3J0ICp1cDsKIAlzdGF0aWMgaW50IGZpcnN0ID0gMTsKLQlpbnQgaTsKKwlpbnQgaSwgaXJxZmxhZyA9IDA7CiAKIAlpZiAoIWZpcnN0KQogCQlyZXR1cm47CkBAIC0yNjcwLDYgKzI2NjgsOSBAQAogCQl1cC0+cG9ydC5vcHMgPSAmc2VyaWFsODI1MF9wb3BzOwogCX0KIAorCWlmIChzaGFyZV9pcnFzKQorCQlpcnFmbGFnID0gSVJRRl9TSEFSRUQ7CisKIAlmb3IgKGkgPSAwLCB1cCA9IHNlcmlhbDgyNTBfcG9ydHM7CiAJICAgICBpIDwgQVJSQVlfU0laRShvbGRfc2VyaWFsX3BvcnQpICYmIGkgPCBucl91YXJ0czsKIAkgICAgIGkrKywgdXArKykgewpAQCAtMjY4Myw4ICsyNjg0LDcgQEAKIAkJdXAtPnBvcnQuaW90eXBlICAgPSBvbGRfc2VyaWFsX3BvcnRbaV0uaW9fdHlwZTsKIAkJdXAtPnBvcnQucmVnc2hpZnQgPSBvbGRfc2VyaWFsX3BvcnRbaV0uaW9tZW1fcmVnX3NoaWZ0OwogCQlzZXRfaW9fZnJvbV91cGlvKCZ1cC0+cG9ydCk7Ci0JCWlmIChzaGFyZV9pcnFzKQotCQkJdXAtPnBvcnQuaXJxZmxhZ3MgfD0gSVJRRl9TSEFSRUQ7CisJCXVwLT5wb3J0LmlycWZsYWdzIHw9IGlycWZsYWc7CiAJfQogfQogCkBAIC0yOTQwLDEwICsyOTQwLDEzIEBACiB7CiAJc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0ICpwID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgdWFydF9wb3J0IHBvcnQ7Ci0JaW50IHJldCwgaTsKKwlpbnQgcmV0LCBpLCBpcnFmbGFnID0gMDsKIAogCW1lbXNldCgmcG9ydCwgMCwgc2l6ZW9mKHN0cnVjdCB1YXJ0X3BvcnQpKTsKIAorCWlmIChzaGFyZV9pcnFzKQorCQlpcnFmbGFnID0gSVJRRl9TSEFSRUQ7CisKIAlmb3IgKGkgPSAwOyBwICYmIHAtPmZsYWdzICE9IDA7IHArKywgaSsrKSB7CiAJCXBvcnQuaW9iYXNlCQk9IHAtPmlvYmFzZTsKIAkJcG9ydC5tZW1iYXNlCQk9IHAtPm1lbWJhc2U7CkBAIC0yOTYwLDggKzI5NjMsNyBAQAogCQlwb3J0LnNlcmlhbF9pbgkJPSBwLT5zZXJpYWxfaW47CiAJCXBvcnQuc2VyaWFsX291dAkJPSBwLT5zZXJpYWxfb3V0OwogCQlwb3J0LmRldgkJPSAmZGV2LT5kZXY7Ci0JCWlmIChzaGFyZV9pcnFzKQotCQkJcG9ydC5pcnFmbGFncyB8PSBJUlFGX1NIQVJFRDsKKwkJcG9ydC5pcnFmbGFncwkJfD0gaXJxZmxhZzsKIAkJcmV0ID0gc2VyaWFsODI1MF9yZWdpc3Rlcl9wb3J0KCZwb3J0KTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWRldl9lcnIoJmRldi0+ZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyIHBvcnQgYXQgaW5kZXggJWQgIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvanNtL2pzbS5oIGIvZHJpdmVycy9zZXJpYWwvanNtL2pzbS5oCmluZGV4IDRlNWYzYmQuLjM4YTUwOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2pzbS9qc20uaAorKysgYi9kcml2ZXJzL3NlcmlhbC9qc20vanNtLmgKQEAgLTEzOCw3ICsxMzgsNiBAQAogCXUzMgkJbmFzeW5jOwkJLyogTnVtYmVyIG9mIHBvcnRzIG9uIGNhcmQgKi8KIAogCXUzMgkJaXJxOwkJLyogSW50ZXJydXB0IHJlcXVlc3QgbnVtYmVyICovCi0JdTY0CQlpbnRyX2NvdW50OwkvKiBDb3VudCBvZiBpbnRlcnJ1cHRzICovCiAKIAl1NjQJCW1lbWJhc2U7CS8qIFN0YXJ0IG9mIGJhc2UgbWVtb3J5IG9mIHRoZSBjYXJkICovCiAJdTY0CQltZW1iYXNlX2VuZDsJLyogRW5kIG9mIGJhc2UgbWVtb3J5IG9mIHRoZSBjYXJkICovCkBAIC0yMDYsOCArMjA1LDYgQEAKIAogCXU2NAkJY2hfY2xvc2VfZGVsYXk7CS8qIEhvdyBsb25nIHdlIHNob3VsZCBkcm9wIFJUUy9EVFIgZm9yICovCiAKLQl1NjQJCWNoX2Nwc3RpbWU7CS8qIFRpbWUgZm9yIENQUyBjYWxjdWxhdGlvbnMJKi8KLQogCXRjZmxhZ190CWNoX2NfaWZsYWc7CS8qIGNoYW5uZWwgaWZsYWdzCQkqLwogCXRjZmxhZ190CWNoX2NfY2ZsYWc7CS8qIGNoYW5uZWwgY2ZsYWdzCQkqLwogCXRjZmxhZ190CWNoX2Nfb2ZsYWc7CS8qIGNoYW5uZWwgb2ZsYWdzCQkqLwpAQCAtMjE1LDExICsyMTIsNiBAQAogCXU4CQljaF9zdG9wYzsJLyogU3RvcCBjaGFyYWN0ZXIJCSovCiAJdTgJCWNoX3N0YXJ0YzsJLyogU3RhcnQgY2hhcmFjdGVyCQkqLwogCi0JdTMyCQljaF9vbGRfYmF1ZDsJLyogQ2FjaGUgb2YgdGhlIGN1cnJlbnQgYmF1ZCAqLwotCXUzMgkJY2hfY3VzdG9tX3NwZWVkOy8qIEN1c3RvbSBiYXVkLCBpZiBzZXQgKi8KLQotCXUzMgkJY2hfd29wZW47CS8qIFdhaXRpbmcgZm9yIG9wZW4gcHJvY2VzcyBjbnQgKi8KLQogCXU4CQljaF9tb3N0YXQ7CS8qIEZFUCBvdXRwdXQgbW9kZW0gc3RhdHVzCSovCiAJdTgJCWNoX21pc3RhdDsJLyogRkVQIGlucHV0IG1vZGVtIHN0YXR1cwkqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9qc20vanNtX2RyaXZlci5jIGIvZHJpdmVycy9zZXJpYWwvanNtL2pzbV9kcml2ZXIuYwppbmRleCBiMzYwNGFhLi4xMDhjM2UwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9qc20vanNtX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2pzbS9qc21fZHJpdmVyLmMKQEAgLTQ4LDYgKzQ4LDE3IEBACiAJLm5yCQk9IE5SX1BPUlRTLAogfTsKIAorc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QganNtX2lvX2Vycm9yX2RldGVjdGVkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNpX2NoYW5uZWxfc3RhdGVfdCBzdGF0ZSk7CitzdGF0aWMgcGNpX2Vyc19yZXN1bHRfdCBqc21faW9fc2xvdF9yZXNldChzdHJ1Y3QgcGNpX2RldiAqcGRldik7CitzdGF0aWMgdm9pZCBqc21faW9fcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKworc3RhdGljIHN0cnVjdCBwY2lfZXJyb3JfaGFuZGxlcnMganNtX2Vycl9oYW5kbGVyID0geworCS5lcnJvcl9kZXRlY3RlZCA9IGpzbV9pb19lcnJvcl9kZXRlY3RlZCwKKwkuc2xvdF9yZXNldCA9IGpzbV9pb19zbG90X3Jlc2V0LAorCS5yZXN1bWUgPSBqc21faW9fcmVzdW1lLAorfTsKKwogaW50IGpzbV9kZWJ1ZzsKIG1vZHVsZV9wYXJhbShqc21fZGVidWcsIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGpzbV9kZWJ1ZywgIkRyaXZlciBkZWJ1Z2dpbmcgbGV2ZWwiKTsKQEAgLTEyMyw3ICsxMzQsNyBAQAogCX0KIAogCXJjID0gcmVxdWVzdF9pcnEoYnJkLT5pcnEsIGJyZC0+YmRfb3BzLT5pbnRyLAotCQkJSVJRRl9ESVNBQkxFRHxJUlFGX1NIQVJFRCwgIkpTTSIsIGJyZCk7CisJCQlJUlFGX1NIQVJFRCwgIkpTTSIsIGJyZCk7CiAJaWYgKHJjKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZhaWxlZCB0byBob29rIElSUSAlZFxuIixicmQtPmlycSk7CiAJCWdvdG8gb3V0X2lvdW5tYXA7CkBAIC0xNjQsNiArMTc1LDcgQEAKIAl9CiAKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgYnJkKTsKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKIAogCXJldHVybiAwOwogIG91dF9mcmVlX2lycToKQEAgLTIyMiw4ICsyMzQsNDIgQEAKIAkuaWRfdGFibGUJPSBqc21fcGNpX3RibCwKIAkucHJvYmUJCT0ganNtX3Byb2JlX29uZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGpzbV9yZW1vdmVfb25lKSwKKwkuZXJyX2hhbmRsZXIgICAgPSAmanNtX2Vycl9oYW5kbGVyLAogfTsKIAorc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QganNtX2lvX2Vycm9yX2RldGVjdGVkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQlwY2lfY2hhbm5lbF9zdGF0ZV90IHN0YXRlKQoreworCXN0cnVjdCBqc21fYm9hcmQgKmJyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWpzbV9yZW1vdmVfdWFydF9wb3J0KGJyZCk7CisKKwlyZXR1cm4gUENJX0VSU19SRVNVTFRfTkVFRF9SRVNFVDsKK30KKworc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QganNtX2lvX3Nsb3RfcmVzZXQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaW50IHJjOworCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKworCWlmIChyYykKKwkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1Q7CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9SRUNPVkVSRUQ7Cit9CisKK3N0YXRpYyB2b2lkIGpzbV9pb19yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGpzbV9ib2FyZCAqYnJkID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisKKwlqc21fdWFydF9wb3J0X2luaXQoYnJkKTsKK30KKwogc3RhdGljIGludCBfX2luaXQganNtX2luaXRfbW9kdWxlKHZvaWQpCiB7CiAJaW50IHJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvanNtL2pzbV9uZW8uYyBiL2RyaXZlcnMvc2VyaWFsL2pzbS9qc21fbmVvLmMKaW5kZXggYjRiMTI0ZS4uNzk2MGQ5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvanNtL2pzbV9uZW8uYworKysgYi9kcml2ZXJzL3NlcmlhbC9qc20vanNtX25lby5jCkBAIC05NTQsMTMgKzk1NCw4IEBACiAJCWNoLT5jaF9mbGFncyB8PSAoQ0hfQkFVRDApOwogCQljaC0+Y2hfbW9zdGF0ICY9IH4oVUFSVF9NQ1JfUlRTIHwgVUFSVF9NQ1JfRFRSKTsKIAkJbmVvX2Fzc2VydF9tb2RlbV9zaWduYWxzKGNoKTsKLQkJY2gtPmNoX29sZF9iYXVkID0gMDsKIAkJcmV0dXJuOwogCi0JfSBlbHNlIGlmIChjaC0+Y2hfY3VzdG9tX3NwZWVkKSB7Ci0JCQliYXVkID0gY2gtPmNoX2N1c3RvbV9zcGVlZDsKLQkJCWlmIChjaC0+Y2hfZmxhZ3MgJiBDSF9CQVVEMCkKLQkJCQljaC0+Y2hfZmxhZ3MgJj0gfihDSF9CQVVEMCk7CiAJfSBlbHNlIHsKIAkJaW50IGk7CiAJCXVuc2lnbmVkIGludCBjZmxhZzsKQEAgLTEwNDUsNyArMTA0MCw2IEBACiAJcXVvdCA9IGNoLT5jaF9iZC0+YmRfZGl2aWRlbmQgLyBiYXVkOwogCiAJaWYgKHF1b3QgIT0gMCkgewotCQljaC0+Y2hfb2xkX2JhdWQgPSBiYXVkOwogCQl3cml0ZWIoVUFSVF9MQ1JfRExBQiwgJmNoLT5jaF9uZW9fdWFydC0+bGNyKTsKIAkJd3JpdGViKChxdW90ICYgMHhmZiksICZjaC0+Y2hfbmVvX3VhcnQtPnR4cngpOwogCQl3cml0ZWIoKHF1b3QgPj4gOCksICZjaC0+Y2hfbmVvX3VhcnQtPmllcik7CkBAIC0xMTIzLDggKzExMTcsNiBAQAogCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFnczI7CiAJaW50IG91dG9mbG9vcF9jb3VudCA9IDA7CiAKLQlicmQtPmludHJfY291bnQrKzsKLQogCS8qIExvY2sgb3V0IHRoZSBzbG93IHBvbGxlciBmcm9tIHJ1bm5pbmcgb24gdGhpcyBib2FyZC4gKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmYnJkLT5iZF9pbnRyX2xvY2ssIGxvY2tfZmxhZ3MpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9qc20vanNtX3R0eS5jIGIvZHJpdmVycy9zZXJpYWwvanNtL2pzbV90dHkuYwppbmRleCA3NDM5YzAzLi5jZDk1ZTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9qc20vanNtX3R0eS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2pzbS9qc21fdHR5LmMKQEAgLTI5Niw4ICsyOTYsNiBAQAogCQliZC0+YmRfb3BzLT5hc3NlcnRfbW9kZW1fc2lnbmFscyhjaGFubmVsKTsKIAl9CiAKLQljaGFubmVsLT5jaF9vbGRfYmF1ZCA9IDA7Ci0KIAkvKiBUdXJuIG9mZiBVQVJUIGludGVycnVwdHMgZm9yIHRoaXMgcG9ydCAqLwogCWNoYW5uZWwtPmNoX2JkLT5iZF9vcHMtPnVhcnRfb2ZmKGNoYW5uZWwpOwogCkBAIC00MzIsNyArNDMwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IF9fZGV2aW5pdCBqc21fdWFydF9wb3J0X2luaXQoc3RydWN0IGpzbV9ib2FyZCAqYnJkKQoraW50IGpzbV91YXJ0X3BvcnRfaW5pdChzdHJ1Y3QganNtX2JvYXJkICpicmQpCiB7CiAJaW50IGk7CiAJdW5zaWduZWQgaW50IGxpbmU7CkBAIC00NzIsNyArNDcwLDcgQEAKIAkJaWYgKHVhcnRfYWRkX29uZV9wb3J0ICgmanNtX3VhcnRfZHJpdmVyLCAmYnJkLT5jaGFubmVsc1tpXS0+dWFydF9wb3J0KSkKIAkJCXByaW50ayhLRVJOX0lORk8gImpzbTogYWRkIGRldmljZSBmYWlsZWRcbiIpOwogCQllbHNlCi0JCQlwcmludGsoS0VSTl9JTkZPICJBZGRlZCBkZXZpY2UgXG4iKTsKKwkJCXByaW50ayhLRVJOX0lORk8gImpzbTogUG9ydCAlZCBhZGRlZFxuIiwgaSk7CiAJfQogCiAJanNtX3ByaW50ayhJTklULCBJTkZPLCAmYnJkLT5wY2lfZGV2LCAiZmluaXNoXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3B4YS5jIGIvZHJpdmVycy9zZXJpYWwvcHhhLmMKaW5kZXggYjg2MjlkNy4uNGE4MjEwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvcHhhLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvcHhhLmMKQEAgLTQzOCw2ICs0MzgsNyBAQAogCXVuc2lnbmVkIGNoYXIgY3ZhbCwgZmNyID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBiYXVkLCBxdW90OworCXVuc2lnbmVkIGludCBkbGw7CiAKIAlzd2l0Y2ggKHRlcm1pb3MtPmNfY2ZsYWcgJiBDU0laRSkgewogCWNhc2UgQ1M1OgpAQCAtNTM0LDEwICs1MzUsMTggQEAKIAllbHNlCiAJCXVwLT5tY3IgJj0gflVBUlRfTUNSX0FGRTsKIAotCXNlcmlhbF9vdXQodXAsIFVBUlRfTENSLCBjdmFsIHwgVUFSVF9MQ1JfRExBQik7Lyogc2V0IERMQUIgKi8KKwlzZXJpYWxfb3V0KHVwLCBVQVJUX0xDUiwgY3ZhbCB8IFVBUlRfTENSX0RMQUIpOwkvKiBzZXQgRExBQiAqLwogCXNlcmlhbF9vdXQodXAsIFVBUlRfRExMLCBxdW90ICYgMHhmZik7CQkvKiBMUyBvZiBkaXZpc29yICovCisKKwkvKgorCSAqIHdvcmsgYXJvdW5kIEVycmF0YSAjNzUgYWNjb3JkaW5nIHRvIEludGVsKFIpIFBYQTI3eCBQcm9jZXNzb3IgRmFtaWx5CisJICogU3BlY2lmaWNhdGlvbiBVcGRhdGUgKE5vdiAyMDA1KQorCSAqLworCWRsbCA9IHNlcmlhbF9pbih1cCwgVUFSVF9ETEwpOworCVdBUk5fT04oZGxsICE9IChxdW90ICYgMHhmZikpOworCiAJc2VyaWFsX291dCh1cCwgVUFSVF9ETE0sIHF1b3QgPj4gOCk7CQkvKiBNUyBvZiBkaXZpc29yICovCi0Jc2VyaWFsX291dCh1cCwgVUFSVF9MQ1IsIGN2YWwpOwkJLyogcmVzZXQgRExBQiAqLworCXNlcmlhbF9vdXQodXAsIFVBUlRfTENSLCBjdmFsKTsJCQkvKiByZXNldCBETEFCICovCiAJdXAtPmxjciA9IGN2YWw7CQkJCQkvKiBTYXZlIExDUiAqLwogCXNlcmlhbF9weGFfc2V0X21jdHJsKCZ1cC0+cG9ydCwgdXAtPnBvcnQubWN0cmwpOwogCXNlcmlhbF9vdXQodXAsIFVBUlRfRkNSLCBmY3IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jb3JlLmMKaW5kZXggZGNjNzI0NC4uMDQ3NTMwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY29yZS5jCkBAIC0zNDIsMTEgKzM0MiwxMSBAQAogCiAJaWYgKGZsYWdzID09IFVQRl9TUERfSEkpCiAJCWFsdGJhdWQgPSA1NzYwMDsKLQlpZiAoZmxhZ3MgPT0gVVBGX1NQRF9WSEkpCisJZWxzZSBpZiAoZmxhZ3MgPT0gVVBGX1NQRF9WSEkpCiAJCWFsdGJhdWQgPSAxMTUyMDA7Ci0JaWYgKGZsYWdzID09IFVQRl9TUERfU0hJKQorCWVsc2UgaWYgKGZsYWdzID09IFVQRl9TUERfU0hJKQogCQlhbHRiYXVkID0gMjMwNDAwOwotCWlmIChmbGFncyA9PSBVUEZfU1BEX1dBUlApCisJZWxzZSBpZiAoZmxhZ3MgPT0gVVBGX1NQRF9XQVJQKQogCQlhbHRiYXVkID0gNDYwODAwOwogCiAJZm9yICh0cnkgPSAwOyB0cnkgPCAyOyB0cnkrKykgewpAQCAtMTIxNyw5ICsxMjE3LDggQEAKIAkvKiBIYW5kbGUgdHJhbnNpdGlvbiB0byBCMCBzdGF0dXMgKi8KIAlpZiAoKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpICYmICEoY2ZsYWcgJiBDQkFVRCkpCiAJCXVhcnRfY2xlYXJfbWN0cmwoc3RhdGUtPnVhcnRfcG9ydCwgVElPQ01fUlRTIHwgVElPQ01fRFRSKTsKLQogCS8qIEhhbmRsZSB0cmFuc2l0aW9uIGF3YXkgZnJvbSBCMCBzdGF0dXMgKi8KLQlpZiAoIShvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSAmJiAoY2ZsYWcgJiBDQkFVRCkpIHsKKwllbHNlIGlmICghKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpICYmIChjZmxhZyAmIENCQVVEKSkgewogCQl1bnNpZ25lZCBpbnQgbWFzayA9IFRJT0NNX0RUUjsKIAkJaWYgKCEoY2ZsYWcgJiBDUlRTQ1RTKSB8fAogCQkgICAgIXRlc3RfYml0KFRUWV9USFJPVFRMRUQsICZ0dHktPmZsYWdzKSkKQEAgLTEyMzQsOSArMTIzMyw4IEBACiAJCV9fdWFydF9zdGFydCh0dHkpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+dWFydF9wb3J0LT5sb2NrLCBmbGFncyk7CiAJfQotCiAJLyogSGFuZGxlIHR1cm5pbmcgb24gQ1JUU0NUUyAqLwotCWlmICghKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYgKGNmbGFnICYgQ1JUU0NUUykpIHsKKwllbHNlIGlmICghKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYgKGNmbGFnICYgQ1JUU0NUUykpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT51YXJ0X3BvcnQtPmxvY2ssIGZsYWdzKTsKIAkJaWYgKCEoc3RhdGUtPnVhcnRfcG9ydC0+b3BzLT5nZXRfbWN0cmwoc3RhdGUtPnVhcnRfcG9ydCkgJiBUSU9DTV9DVFMpKSB7CiAJCQl0dHktPmh3X3N0b3BwZWQgPSAxOwpAQCAtMjM0NCw3ICsyMzQyLDcgQEAKICAqLwogaW50IHVhcnRfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1YXJ0X2RyaXZlciAqZHJ2KQogewotCXN0cnVjdCB0dHlfZHJpdmVyICpub3JtYWwgPSBOVUxMOworCXN0cnVjdCB0dHlfZHJpdmVyICpub3JtYWw7CiAJaW50IGksIHJldHZhbDsKIAogCUJVR19PTihkcnYtPnN0YXRlKTsKQEAgLTIzNTQsMTMgKzIzNTIsMTIgQEAKIAkgKiB3ZSBoYXZlIGEgbGFyZ2UgbnVtYmVyIG9mIHBvcnRzIHRvIGhhbmRsZS4KIAkgKi8KIAlkcnYtPnN0YXRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVhcnRfc3RhdGUpICogZHJ2LT5uciwgR0ZQX0tFUk5FTCk7Ci0JcmV0dmFsID0gLUVOT01FTTsKIAlpZiAoIWRydi0+c3RhdGUpCiAJCWdvdG8gb3V0OwogCi0Jbm9ybWFsICA9IGFsbG9jX3R0eV9kcml2ZXIoZHJ2LT5ucik7CisJbm9ybWFsID0gYWxsb2NfdHR5X2RyaXZlcihkcnYtPm5yKTsKIAlpZiAoIW5vcm1hbCkKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X2tmcmVlOwogCiAJZHJ2LT50dHlfZHJpdmVyID0gbm9ybWFsOwogCkBAIC0yMzkzLDEyICsyMzkwLDE0IEBACiAJfQogCiAJcmV0dmFsID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihub3JtYWwpOwotIG91dDoKLQlpZiAocmV0dmFsIDwgMCkgewotCQlwdXRfdHR5X2RyaXZlcihub3JtYWwpOwotCQlrZnJlZShkcnYtPnN0YXRlKTsKLQl9Ci0JcmV0dXJuIHJldHZhbDsKKwlpZiAocmV0dmFsID49IDApCisJCXJldHVybiByZXR2YWw7CisKKwlwdXRfdHR5X2RyaXZlcihub3JtYWwpOworb3V0X2tmcmVlOgorCWtmcmVlKGRydi0+c3RhdGUpOworb3V0OgorCXJldHVybiAtRU5PTUVNOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3VjY191YXJ0LmMgYi9kcml2ZXJzL3NlcmlhbC91Y2NfdWFydC5jCmluZGV4IDQ2ZGU1NjQuLjQ2NWYyZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3VjY191YXJ0LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvdWNjX3VhcnQuYwpAQCAtMTE3OSwxNiArMTE3OSwxOCBAQAogCiAJaWYgKGZpcm13YXJlLT5oZWFkZXIubGVuZ3RoICE9IGZ3LT5zaXplKSB7CiAJCWRldl9lcnIoZGV2LCAiaW52YWxpZCBmaXJtd2FyZVxuIik7Ci0JCXJldHVybjsKKwkJZ290byBvdXQ7CiAJfQogCiAJcmV0ID0gcWVfdXBsb2FkX2Zpcm13YXJlKGZpcm13YXJlKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoZGV2LCAiY291bGQgbm90IGxvYWQgZmlybXdhcmVcbiIpOwotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCX0KIAogCWZpcm13YXJlX2xvYWRlZCA9IDE7Cisgb3V0OgorCXJlbGVhc2VfZmlybXdhcmUoZncpOwogfQogCiBzdGF0aWMgaW50IHVjY191YXJ0X3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2LApAQCAtMTI0Nyw3ICsxMjQ5LDcgQEAKIAkJCSAqLwogCQkJcmV0ID0gcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQoVEhJU19NT0RVTEUsCiAJCQkJRldfQUNUSU9OX0hPVFBMVUcsIGZpbGVuYW1lLCAmb2ZkZXYtPmRldiwKLQkJCQkmb2ZkZXYtPmRldiwgdWFydF9maXJtd2FyZV9jb250KTsKKwkJCQlHRlBfS0VSTkVMLCAmb2ZkZXYtPmRldiwgdWFydF9maXJtd2FyZV9jb250KTsKIAkJCWlmIChyZXQpIHsKIAkJCQlkZXZfZXJyKCZvZmRldi0+ZGV2LAogCQkJCQkiY291bGQgbm90IGxvYWQgZmlybXdhcmUgJXNcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9LY29uZmlnIGIvZHJpdmVycy9zcGkvS2NvbmZpZwppbmRleCA0YjZmN2NiLi4yZDlkNzAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3BpL0tjb25maWcKQEAgLTEzMyw2ICsxMzMsMTQgQEAKIAkgIHdoaWNoIGludGVyZmFjZXMgdG8gYW4gTE03MCB0ZW1wZXJhdHVyZSBzZW5zb3IgdXNpbmcKIAkgIGEgcGFyYWxsZWwgcG9ydC4KIAorY29uZmlnIFNQSV9NUEM1Mnh4CisJdHJpc3RhdGUgIkZyZWVzY2FsZSBNUEM1Mnh4IFNQSSAobm9uLVBTQykgY29udHJvbGxlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gUFBDX01QQzUyeHggJiYgU1BJCisJc2VsZWN0IFNQSV9NQVNURVJfT0YKKwloZWxwCisJICBUaGlzIGRyaXZlcnMgc3VwcG9ydHMgdGhlIE1QQzUyeHggU1BJIGNvbnRyb2xsZXIgaW4gbWFzdGVyIFNQSQorCSAgbW9kZS4KKwogY29uZmlnIFNQSV9NUEM1Mnh4X1BTQwogCXRyaXN0YXRlICJGcmVlc2NhbGUgTVBDNTJ4eCBQU0MgU1BJIGNvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBQUENfTVBDNTJ4eCAmJiBFWFBFUklNRU5UQUwKQEAgLTE0Nyw5ICsxNTUsNiBAQAogCSAgVGhpcyBlbmFibGVzIHVzaW5nIHRoZSBGcmVlc2NhbGUgTVBDOHh4eCBTUEkgY29udHJvbGxlcnMgaW4gbWFzdGVyCiAJICBtb2RlLgogCi0JICBUaGlzIGRyaXZlciB1c2VzIGEgc2ltcGxlIHNldCBvZiBzaGlmdCByZWdpc3RlcnMgZm9yIGRhdGEgKG9wcG9zZWQKLQkgIHRvIHRoZSBDUE0gYmFzZWQgZGVzY3JpcHRvciBtb2RlbCkuCi0KIGNvbmZpZyBTUElfT01BUF9VV0lSRQogCXRyaXN0YXRlICJPTUFQMSBNaWNyb1dpcmUiCiAJZGVwZW5kcyBvbiBBUkNIX09NQVAxCkBAIC0xNjQsNiArMTY5LDEyIEBACiAJICBTUEkgbWFzdGVyIGNvbnRyb2xsZXIgZm9yIE9NQVAyNHh4L09NQVAzNHh4IE11bHRpY2hhbm5lbCBTUEkKIAkgIChNY1NQSSkgbW9kdWxlcy4KIAorY29uZmlnIFNQSV9PTUFQXzEwMEsKKwl0cmlzdGF0ZSAiT01BUCBTUEkgMTAwSyIKKwlkZXBlbmRzIG9uIFNQSV9NQVNURVIgJiYgKEFSQ0hfT01BUDg1MCB8fCBBUkNIX09NQVA3MzApCisJaGVscAorCSAgT01BUCBTUEkgMTAwSyBtYXN0ZXIgY29udHJvbGxlciBmb3Igb21hcDd4eCBib2FyZHMuCisKIGNvbmZpZyBTUElfT1JJT04KIAl0cmlzdGF0ZSAiT3Jpb24gU1BJIG1hc3RlciAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIFBMQVRfT1JJT04gJiYgRVhQRVJJTUVOVEFMCkBAIC0yMTUsNiArMjI2LDEzIEBACiAJICB0aGUgaW5idWlsdCBoYXJkd2FyZSBjYW5ub3QgcHJvdmlkZSB0aGUgdHJhbnNmZXIgbW9kZSwgb3IKIAkgIHdoZXJlIHRoZSBib2FyZCBpcyB1c2luZyBub24gaGFyZHdhcmUgY29ubmVjdGVkIHBpbnMuCiAKK2NvbmZpZyBTUElfU0hfTVNJT0YKKwl0cmlzdGF0ZSAiU3VwZXJIIE1TSU9GIFNQSSBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gU1VQRVJIICYmIEhBVkVfQ0xLCisJc2VsZWN0IFNQSV9CSVRCQU5HCisJaGVscAorCSAgU1BJIGRyaXZlciBmb3IgU3VwZXJIIE1TSU9GIGJsb2Nrcy4KKwogY29uZmlnIFNQSV9TSF9TQ0kKIAl0cmlzdGF0ZSAiU3VwZXJIIFNDSSBTUEkgY29udHJvbGxlciIKIAlkZXBlbmRzIG9uIFNVUEVSSApAQCAtMjM1LDE1ICsyNTMsMzggQEAKIAkgIFNQSSBkcml2ZXIgZm9yIFRvc2hpYmEgVFh4OSBNSVBTIFNvQ3MKIAogY29uZmlnIFNQSV9YSUxJTlgKLQl0cmlzdGF0ZSAiWGlsaW54IFNQSSBjb250cm9sbGVyIgotCWRlcGVuZHMgb24gKFhJTElOWF9WSVJURVggfHwgTUlDUk9CTEFaRSkgJiYgRVhQRVJJTUVOVEFMCisJdHJpc3RhdGUgIlhpbGlueCBTUEkgY29udHJvbGxlciBjb21tb24gbW9kdWxlIgorCWRlcGVuZHMgb24gSEFTX0lPTUVNICYmIEVYUEVSSU1FTlRBTAogCXNlbGVjdCBTUElfQklUQkFORworCXNlbGVjdCBTUElfWElMSU5YX09GIGlmIChYSUxJTlhfVklSVEVYIHx8IE1JQ1JPQkxBWkUpCiAJaGVscAogCSAgVGhpcyBleHBvc2VzIHRoZSBTUEkgY29udHJvbGxlciBJUCBmcm9tIHRoZSBYaWxpbnggRURLLgogCiAJICBTZWUgdGhlICJPUEIgU2VyaWFsIFBlcmlwaGVyYWwgSW50ZXJmYWNlIChTUEkpICh2MS4wMGUpIgogCSAgUHJvZHVjdCBTcGVjaWZpY2F0aW9uIGRvY3VtZW50IChEUzQ2NCkgZm9yIGhhcmR3YXJlIGRldGFpbHMuCiAKKwkgIE9yIGZvciB0aGUgRFM1NzAsIHNlZSAiWFBTIFNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoU1BJKSAodjIuMDBiKSIKKworY29uZmlnIFNQSV9YSUxJTlhfT0YKKwl0cmlzdGF0ZSAiWGlsaW54IFNQSSBjb250cm9sbGVyIE9GIGRldmljZSIKKwlkZXBlbmRzIG9uIFNQSV9YSUxJTlggJiYgKFhJTElOWF9WSVJURVggfHwgTUlDUk9CTEFaRSkKKwloZWxwCisJICBUaGlzIGlzIHRoZSBPRiBkcml2ZXIgZm9yIHRoZSBTUEkgY29udHJvbGxlciBJUCBmcm9tIHRoZSBYaWxpbnggRURLLgorCitjb25maWcgU1BJX1hJTElOWF9QTFRGTQorCXRyaXN0YXRlICJYaWxpbnggU1BJIGNvbnRyb2xsZXIgcGxhdGZvcm0gZGV2aWNlIgorCWRlcGVuZHMgb24gU1BJX1hJTElOWAorCWhlbHAKKwkgIFRoaXMgaXMgdGhlIHBsYXRmb3JtIGRyaXZlciBmb3IgdGhlIFNQSSBjb250cm9sbGVyIElQCisJICBmcm9tIHRoZSBYaWxpbnggRURLLgorCitjb25maWcgU1BJX05VQzkwMAorCXRyaXN0YXRlICJOdXZvdG9uIE5VQzkwMCBzZXJpZXMgU1BJIgorCWRlcGVuZHMgb24gQVJDSF9XOTBYOTAwICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBTUElfQklUQkFORworCWhlbHAKKwkgIFNQSSBkcml2ZXIgZm9yIE51dm90b24gTlVDOTAwIHNlcmllcyBBUk0gU29DcworCiAjCiAjIEFkZCBuZXcgU1BJIG1hc3RlciBjb250cm9sbGVycyBpbiBhbHBoYWJldGljYWwgb3JkZXIgYWJvdmUgdGhpcyBsaW5lCiAjCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9NYWtlZmlsZSBiL2RyaXZlcnMvc3BpL01ha2VmaWxlCmluZGV4IDIxYTExODIuLmVkOGMxNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3BpL01ha2VmaWxlCkBAIC0yMiwxNyArMjIsMjMgQEAKIG9iai0kKENPTkZJR19TUElfUFhBMlhYKQkJKz0gcHhhMnh4X3NwaS5vCiBvYmotJChDT05GSUdfU1BJX09NQVBfVVdJUkUpCQkrPSBvbWFwX3V3aXJlLm8KIG9iai0kKENPTkZJR19TUElfT01BUDI0WFgpCQkrPSBvbWFwMl9tY3NwaS5vCitvYmotJChDT05GSUdfU1BJX09NQVBfMTAwSykJCSs9IG9tYXBfc3BpXzEwMGsubwogb2JqLSQoQ09ORklHX1NQSV9PUklPTikJCQkrPSBvcmlvbl9zcGkubwogb2JqLSQoQ09ORklHX1NQSV9QTDAyMikJCQkrPSBhbWJhLXBsMDIyLm8KIG9iai0kKENPTkZJR19TUElfTVBDNTJ4eF9QU0MpCQkrPSBtcGM1Mnh4X3BzY19zcGkubworb2JqLSQoQ09ORklHX1NQSV9NUEM1Mnh4KQkJKz0gbXBjNTJ4eF9zcGkubwogb2JqLSQoQ09ORklHX1NQSV9NUEM4eHh4KQkJKz0gc3BpX21wYzh4eHgubwogb2JqLSQoQ09ORklHX1NQSV9QUEM0eHgpCQkrPSBzcGlfcHBjNHh4Lm8KIG9iai0kKENPTkZJR19TUElfUzNDMjRYWF9HUElPKQkJKz0gc3BpX3MzYzI0eHhfZ3Bpby5vCiBvYmotJChDT05GSUdfU1BJX1MzQzI0WFgpCQkrPSBzcGlfczNjMjR4eC5vCiBvYmotJChDT05GSUdfU1BJX1RYWDkpCQkJKz0gc3BpX3R4eDkubwogb2JqLSQoQ09ORklHX1NQSV9YSUxJTlgpCQkrPSB4aWxpbnhfc3BpLm8KK29iai0kKENPTkZJR19TUElfWElMSU5YX09GKQkJKz0geGlsaW54X3NwaV9vZi5vCitvYmotJChDT05GSUdfU1BJX1hJTElOWF9QTFRGTSkJCSs9IHhpbGlueF9zcGlfcGx0Zm0ubwogb2JqLSQoQ09ORklHX1NQSV9TSF9TQ0kpCQkrPSBzcGlfc2hfc2NpLm8KK29iai0kKENPTkZJR19TUElfU0hfTVNJT0YpCQkrPSBzcGlfc2hfbXNpb2Yubwogb2JqLSQoQ09ORklHX1NQSV9TVE1QM1hYWCkJCSs9IHNwaV9zdG1wLm8KK29iai0kKENPTkZJR19TUElfTlVDOTAwKQkJKz0gc3BpX251YzkwMC5vCiAjIAkuLi4gYWRkIGFib3ZlIHRoaXMgbGluZSAuLi4KIAogIyBTUEkgcHJvdG9jb2wgZHJpdmVycyAoZGV2aWNlL2xpbmsgb24gYnVzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvYXUxNTUwX3NwaS5jIGIvZHJpdmVycy9zcGkvYXUxNTUwX3NwaS5jCmluZGV4IDc2Y2JjMWEuLmNmZDVmZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL2F1MTU1MF9zcGkuYworKysgYi9kcml2ZXJzL3NwaS9hdTE1NTBfc3BpLmMKQEAgLTIzNyw4ICsyMzcsMTQgQEAKIAl1bnNpZ25lZCBicHcsIGh6OwogCXUzMiBjZmcsIHN0YXQ7CiAKLQlicHcgPSB0ID8gdC0+Yml0c19wZXJfd29yZCA6IHNwaS0+Yml0c19wZXJfd29yZDsKLQloeiA9IHQgPyB0LT5zcGVlZF9oeiA6IHNwaS0+bWF4X3NwZWVkX2h6OworCWJwdyA9IHNwaS0+Yml0c19wZXJfd29yZDsKKwloeiA9IHNwaS0+bWF4X3NwZWVkX2h6OworCWlmICh0KSB7CisJCWlmICh0LT5iaXRzX3Blcl93b3JkKQorCQkJYnB3ID0gdC0+Yml0c19wZXJfd29yZDsKKwkJaWYgKHQtPnNwZWVkX2h6KQorCQkJaHogPSB0LT5zcGVlZF9oejsKKwl9CiAKIAlpZiAoYnB3IDwgNCB8fCBicHcgPiAyNCkgewogCQlkZXZfZXJyKCZzcGktPmRldiwgInNldHVweGZlcjogaW52YWxpZCBiaXRzX3Blcl93b3JkPSVkXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvbXBjNTJ4eF9wc2Nfc3BpLmMgYi9kcml2ZXJzL3NwaS9tcGM1Mnh4X3BzY19zcGkuYwppbmRleCAxYjc0ZDVjLi5mNTBjODFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9tcGM1Mnh4X3BzY19zcGkuYworKysgYi9kcml2ZXJzL3NwaS9tcGM1Mnh4X3BzY19zcGkuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KQEAgLTMxMywxMSArMzE0LDEzIEBACiAJc3RydWN0IG1wYzUyeHhfcHNjIF9faW9tZW0gKnBzYyA9IG1wcy0+cHNjOwogCXN0cnVjdCBtcGM1Mnh4X3BzY19maWZvIF9faW9tZW0gKmZpZm8gPSBtcHMtPmZpZm87CiAJdTMyIG1jbGtlbl9kaXY7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldDsKIAogCS8qIGRlZmF1bHQgc3lzY2xrIGlzIDUxMk1IeiAqLwogCW1jbGtlbl9kaXYgPSAobXBzLT5zeXNjbGsgPyBtcHMtPnN5c2NsayA6IDUxMjAwMDAwMCkgLyBNQ0xLOwotCW1wYzUyeHhfc2V0X3BzY19jbGtkaXYocHNjX2lkLCBtY2xrZW5fZGl2KTsKKwlyZXQgPSBtcGM1Mnh4X3NldF9wc2NfY2xrZGl2KHBzY19pZCwgbWNsa2VuX2Rpdik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCS8qIFJlc2V0IHRoZSBQU0MgaW50byBhIGtub3duIHN0YXRlICovCiAJb3V0XzgoJnBzYy0+Y29tbWFuZCwgTVBDNTJ4eF9QU0NfUlNUX1JYKTsKQEAgLTM0MSw3ICszNDQsNyBAQAogCiAJbXBzLT5iaXRzX3Blcl93b3JkID0gODsKIAotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBtcGM1Mnh4X3BzY19zcGlfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKQEAgLTQxMCw4ICs0MTMsMTAgQEAKIAkJZ290byBmcmVlX21hc3RlcjsKIAogCXJldCA9IG1wYzUyeHhfcHNjX3NwaV9wb3J0X2NvbmZpZyhtYXN0ZXItPmJ1c19udW0sIG1wcyk7Ci0JaWYgKHJldCA8IDApCisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJjYW4ndCBjb25maWd1cmUgUFNDISBJcyBpdCBjYXBhYmxlIG9mIFNQST9cbiIpOwogCQlnb3RvIGZyZWVfaXJxOworCX0KIAogCXNwaW5fbG9ja19pbml0KCZtcHMtPmxvY2spOwogCWluaXRfY29tcGxldGlvbigmbXBzLT5kb25lKTsKQEAgLTQ2NCwxMCArNDY5LDExIEBACiAJY29uc3QgdTMyICpyZWdhZGRyX3A7CiAJdTY0IHJlZ2FkZHI2NCwgc2l6ZTY0OwogCXMxNiBpZCA9IC0xOworCWludCByYzsKIAogCXJlZ2FkZHJfcCA9IG9mX2dldF9hZGRyZXNzKG9wLT5ub2RlLCAwLCAmc2l6ZTY0LCBOVUxMKTsKIAlpZiAoIXJlZ2FkZHJfcCkgewotCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgUFNDIGFkZHJlc3NcbiIpOworCQlkZXZfZXJyKCZvcC0+ZGV2LCAiSW52YWxpZCBQU0MgYWRkcmVzc1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZWdhZGRyNjQgPSBvZl90cmFuc2xhdGVfYWRkcmVzcyhvcC0+bm9kZSwgcmVnYWRkcl9wKTsKQEAgLTQ3OCwxNSArNDg0LDE4IEBACiAKIAkJcHNjX251bXAgPSBvZl9nZXRfcHJvcGVydHkob3AtPm5vZGUsICJjZWxsLWluZGV4IiwgTlVMTCk7CiAJCWlmICghcHNjX251bXAgfHwgKnBzY19udW1wID4gNSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJtcGM1Mnh4X3BzY19zcGk6IERldmljZSBub2RlICVzIGhhcyBpbnZhbGlkICIKLQkJCQkJImNlbGwtaW5kZXggcHJvcGVydHlcbiIsIG9wLT5ub2RlLT5mdWxsX25hbWUpOworCQkJZGV2X2Vycigmb3AtPmRldiwgIkludmFsaWQgY2VsbC1pbmRleCBwcm9wZXJ0eVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlpZCA9ICpwc2NfbnVtcCArIDE7CiAJfQogCi0JcmV0dXJuIG1wYzUyeHhfcHNjX3NwaV9kb19wcm9iZSgmb3AtPmRldiwgKHUzMilyZWdhZGRyNjQsICh1MzIpc2l6ZTY0LAorCXJjID0gbXBjNTJ4eF9wc2Nfc3BpX2RvX3Byb2JlKCZvcC0+ZGV2LCAodTMyKXJlZ2FkZHI2NCwgKHUzMilzaXplNjQsCiAJCQkJCWlycV9vZl9wYXJzZV9hbmRfbWFwKG9wLT5ub2RlLCAwKSwgaWQpOworCWlmIChyYyA9PSAwKQorCQlvZl9yZWdpc3Rlcl9zcGlfZGV2aWNlcyhkZXZfZ2V0X2RydmRhdGEoJm9wLT5kZXYpLCBvcC0+bm9kZSk7CisKKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQgX19leGl0IG1wYzUyeHhfcHNjX3NwaV9vZl9yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqb3ApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9tcGM1Mnh4X3NwaS5jIGIvZHJpdmVycy9zcGkvbXBjNTJ4eF9zcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWJmZTY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvbXBjNTJ4eF9zcGkuYwpAQCAtMCwwICsxLDU3OCBAQAorLyoKKyAqIE1QQzUyeHggU1BJIGJ1cyBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFNlY3JldCBMYWIgVGVjaG5vbG9naWVzIEx0ZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyCisgKgorICogVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgTVBDNTIwMCdzIGRlZGljYXRlZCBTUEkgY29udHJvbGxlci4KKyAqCisgKiBOb3RlOiB0aGlzIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBNUEM1MjAwIFBTQyBpbiBTUEkgbW9kZS4gIEZvcgorICogdGhhdCBkcml2ZXIgc2VlIGRyaXZlcnMvc3BpL21wYzUyeHhfcHNjX3NwaS5jCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvb2Zfc3BpLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vbXBjNTJ4eC5oPgorCitNT0RVTEVfQVVUSE9SKCJHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1QQzUyeHggU1BJIChub24tUFNDKSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogUmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBTUElfQ1RSTDEJMHgwMAorI2RlZmluZSBTUElfQ1RSTDFfU1BJRQkJKDEgPDwgNykKKyNkZWZpbmUgU1BJX0NUUkwxX1NQRQkJKDEgPDwgNikKKyNkZWZpbmUgU1BJX0NUUkwxX01TVFIJCSgxIDw8IDQpCisjZGVmaW5lIFNQSV9DVFJMMV9DUE9MCQkoMSA8PCAzKQorI2RlZmluZSBTUElfQ1RSTDFfQ1BIQQkJKDEgPDwgMikKKyNkZWZpbmUgU1BJX0NUUkwxX1NTT0UJCSgxIDw8IDEpCisjZGVmaW5lIFNQSV9DVFJMMV9MU0JGRQkJKDEgPDwgMCkKKworI2RlZmluZSBTUElfQ1RSTDIJMHgwMQorI2RlZmluZSBTUElfQlJSCQkweDA0CisKKyNkZWZpbmUgU1BJX1NUQVRVUwkweDA1CisjZGVmaW5lIFNQSV9TVEFUVVNfU1BJRgkJKDEgPDwgNykKKyNkZWZpbmUgU1BJX1NUQVRVU19XQ09MCQkoMSA8PCA2KQorI2RlZmluZSBTUElfU1RBVFVTX01PREYJCSgxIDw8IDQpCisKKyNkZWZpbmUgU1BJX0RBVEEJMHgwOQorI2RlZmluZSBTUElfUE9SVERBVEEJMHgwZAorI2RlZmluZSBTUElfREFUQURJUgkweDEwCisKKy8qIEZTTSBzdGF0ZSByZXR1cm4gdmFsdWVzICovCisjZGVmaW5lIEZTTV9TVE9QCTAJLyogTm90aGluZyBtb3JlIGZvciB0aGUgc3RhdGUgbWFjaGluZSB0byAqLworCQkJCS8qIGRvLiAgSWYgc29tZXRoaW5nIGludGVyZXN0aW5nIGhhcHBlbnMgKi8KKwkJCQkvKiB0aGVuIGFuIElSUSB3aWxsIGJlIHJlY2VpdmVkICovCisjZGVmaW5lIEZTTV9QT0xMCTEJLyogbmVlZCB0byBwb2xsIGZvciBjb21wbGV0aW9uLCBhbiBJUlEgaXMgKi8KKwkJCQkvKiBub3QgZXhwZWN0ZWQgKi8KKyNkZWZpbmUgRlNNX0NPTlRJTlVFCTIJLyogS2VlcCBpdGVyYXRpbmcgdGhlIHN0YXRlIG1hY2hpbmUgKi8KKworLyogRHJpdmVyIGludGVybmFsIGRhdGEgKi8KK3N0cnVjdCBtcGM1Mnh4X3NwaSB7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKwl2b2lkIF9faW9tZW0gKnJlZ3M7CisJaW50IGlycTA7CS8qIE1PREYgaXJxICovCisJaW50IGlycTE7CS8qIFNQSUYgaXJxICovCisJdW5zaWduZWQgaW50IGlwYl9mcmVxOworCisJLyogU3RhdGlzdGljczsgbm90IHVzZWQgbm93LCBidXQgd2lsbCBiZSByZWludHJvZHVjZWQgZm9yIGRlYnVnZnMgKi8KKwlpbnQgbXNnX2NvdW50OworCWludCB3Y29sX2NvdW50OworCWludCB3Y29sX3RpY2tzOworCXUzMiB3Y29sX3R4X3RpbWVzdGFtcDsKKwlpbnQgbW9kZl9jb3VudDsKKwlpbnQgYnl0ZV9jb3VudDsKKworCXN0cnVjdCBsaXN0X2hlYWQgcXVldWU7CQkvKiBxdWV1ZSBvZiBwZW5kaW5nIG1lc3NhZ2VzICovCisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCisJLyogRGV0YWlscyBvZiBjdXJyZW50IHRyYW5zZmVyIChsZW5ndGgsIGFuZCBidWZmZXIgcG9pbnRlcnMpICovCisJc3RydWN0IHNwaV9tZXNzYWdlICptZXNzYWdlOwkvKiBjdXJyZW50IG1lc3NhZ2UgKi8KKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0cmFuc2ZlcjsJLyogY3VycmVudCB0cmFuc2ZlciAqLworCWludCAoKnN0YXRlKShpbnQgaXJxLCBzdHJ1Y3QgbXBjNTJ4eF9zcGkgKm1zLCB1OCBzdGF0dXMsIHU4IGRhdGEpOworCWludCBsZW47CisJaW50IHRpbWVzdGFtcDsKKwl1OCAqcnhfYnVmOworCWNvbnN0IHU4ICp0eF9idWY7CisJaW50IGNzX2NoYW5nZTsKKwlpbnQgZ3Bpb19jc19jb3VudDsKKwl1bnNpZ25lZCBpbnQgKmdwaW9fY3M7Cit9OworCisvKgorICogQ1MgY29udHJvbCBmdW5jdGlvbgorICovCitzdGF0aWMgdm9pZCBtcGM1Mnh4X3NwaV9jaGlwc2VsKHN0cnVjdCBtcGM1Mnh4X3NwaSAqbXMsIGludCB2YWx1ZSkKK3sKKwlpbnQgY3M7CisKKwlpZiAobXMtPmdwaW9fY3NfY291bnQgPiAwKSB7CisJCWNzID0gbXMtPm1lc3NhZ2UtPnNwaS0+Y2hpcF9zZWxlY3Q7CisJCWdwaW9fc2V0X3ZhbHVlKG1zLT5ncGlvX2NzW2NzXSwgdmFsdWUgPyAwIDogMSk7CisJfSBlbHNlCisJCW91dF84KG1zLT5yZWdzICsgU1BJX1BPUlREQVRBLCB2YWx1ZSA/IDAgOiAweDA4KTsKK30KKworLyoKKyAqIFN0YXJ0IGEgbmV3IHRyYW5zZmVyLiAgVGhpcyBpcyBjYWxsZWQgYm90aCBieSB0aGUgaWRsZSBzdGF0ZQorICogZm9yIHRoZSBmaXJzdCB0cmFuc2ZlciBpbiBhIG1lc3NhZ2UsIGFuZCBieSB0aGUgd2FpdCBzdGF0ZSB3aGVuIHRoZQorICogcHJldmlvdXMgdHJhbnNmZXIgaW4gYSBtZXNzYWdlIGlzIGNvbXBsZXRlLgorICovCitzdGF0aWMgdm9pZCBtcGM1Mnh4X3NwaV9zdGFydF90cmFuc2ZlcihzdHJ1Y3QgbXBjNTJ4eF9zcGkgKm1zKQoreworCW1zLT5yeF9idWYgPSBtcy0+dHJhbnNmZXItPnJ4X2J1ZjsKKwltcy0+dHhfYnVmID0gbXMtPnRyYW5zZmVyLT50eF9idWY7CisJbXMtPmxlbiA9IG1zLT50cmFuc2Zlci0+bGVuOworCisJLyogQWN0aXZhdGUgdGhlIGNoaXAgc2VsZWN0ICovCisJaWYgKG1zLT5jc19jaGFuZ2UpCisJCW1wYzUyeHhfc3BpX2NoaXBzZWwobXMsIDEpOworCW1zLT5jc19jaGFuZ2UgPSBtcy0+dHJhbnNmZXItPmNzX2NoYW5nZTsKKworCS8qIFdyaXRlIG91dCB0aGUgZmlyc3QgYnl0ZSAqLworCW1zLT53Y29sX3R4X3RpbWVzdGFtcCA9IGdldF90YmwoKTsKKwlpZiAobXMtPnR4X2J1ZikKKwkJb3V0XzgobXMtPnJlZ3MgKyBTUElfREFUQSwgKm1zLT50eF9idWYrKyk7CisJZWxzZQorCQlvdXRfOChtcy0+cmVncyArIFNQSV9EQVRBLCAwKTsKK30KKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBzdGF0ZSBoYW5kbGVycyAqLworc3RhdGljIGludCBtcGM1Mnh4X3NwaV9mc21zdGF0ZV90cmFuc2ZlcihpbnQgaXJxLCBzdHJ1Y3QgbXBjNTJ4eF9zcGkgKm1zLAorCQkJCQkgdTggc3RhdHVzLCB1OCBkYXRhKTsKK3N0YXRpYyBpbnQgbXBjNTJ4eF9zcGlfZnNtc3RhdGVfd2FpdChpbnQgaXJxLCBzdHJ1Y3QgbXBjNTJ4eF9zcGkgKm1zLAorCQkJCSAgICAgdTggc3RhdHVzLCB1OCBkYXRhKTsKKworLyoKKyAqIElETEUgc3RhdGUKKyAqCisgKiBObyB0cmFuc2ZlcnMgYXJlIGluIHByb2dyZXNzOyBpZiBhbm90aGVyIHRyYW5zZmVyIGlzIHBlbmRpbmcgdGhlbiByZXRyaWV2ZQorICogaXQgYW5kIGtpY2sgaXQgb2ZmLiAgT3RoZXJ3aXNlLCBzdG9wIHByb2Nlc3NpbmcgdGhlIHN0YXRlIG1hY2hpbmUKKyAqLworc3RhdGljIGludAorbXBjNTJ4eF9zcGlfZnNtc3RhdGVfaWRsZShpbnQgaXJxLCBzdHJ1Y3QgbXBjNTJ4eF9zcGkgKm1zLCB1OCBzdGF0dXMsIHU4IGRhdGEpCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaTsKKwlpbnQgc3ByLCBzcHByOworCXU4IGN0cmwxOworCisJaWYgKHN0YXR1cyAmJiAoaXJxICE9IE5PX0lSUSkpCisJCWRldl9lcnIoJm1zLT5tYXN0ZXItPmRldiwgInNwdXJpb3VzIGlycSwgc3RhdHVzPTB4JS4yeFxuIiwKKwkJCXN0YXR1cyk7CisKKwkvKiBDaGVjayBpZiB0aGVyZSBpcyBhbm90aGVyIHRyYW5zZmVyIHdhaXRpbmcuICovCisJaWYgKGxpc3RfZW1wdHkoJm1zLT5xdWV1ZSkpCisJCXJldHVybiBGU01fU1RPUDsKKworCS8qIGdldCB0aGUgaGVhZCBvZiB0aGUgcXVldWUgKi8KKwltcy0+bWVzc2FnZSA9IGxpc3RfZmlyc3RfZW50cnkoJm1zLT5xdWV1ZSwgc3RydWN0IHNwaV9tZXNzYWdlLCBxdWV1ZSk7CisJbGlzdF9kZWxfaW5pdCgmbXMtPm1lc3NhZ2UtPnF1ZXVlKTsKKworCS8qIFNldHVwIHRoZSBjb250cm9sbGVyIHBhcmFtZXRlcnMgKi8KKwljdHJsMSA9IFNQSV9DVFJMMV9TUElFIHwgU1BJX0NUUkwxX1NQRSB8IFNQSV9DVFJMMV9NU1RSOworCXNwaSA9IG1zLT5tZXNzYWdlLT5zcGk7CisJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUEhBKQorCQljdHJsMSB8PSBTUElfQ1RSTDFfQ1BIQTsKKwlpZiAoc3BpLT5tb2RlICYgU1BJX0NQT0wpCisJCWN0cmwxIHw9IFNQSV9DVFJMMV9DUE9MOworCWlmIChzcGktPm1vZGUgJiBTUElfTFNCX0ZJUlNUKQorCQljdHJsMSB8PSBTUElfQ1RSTDFfTFNCRkU7CisJb3V0XzgobXMtPnJlZ3MgKyBTUElfQ1RSTDEsIGN0cmwxKTsKKworCS8qIFNldHVwIHRoZSBjb250cm9sbGVyIHNwZWVkICovCisJLyogbWluaW11bSBkaXZpZGVyIGlzICcyJy4gIEFsc28sIGFkZCAnMScgdG8gZm9yY2Ugcm91bmRpbmcgdGhlCisJICogZGl2aWRlciB1cC4gKi8KKwlzcHByID0gKChtcy0+aXBiX2ZyZXEgLyBtcy0+bWVzc2FnZS0+c3BpLT5tYXhfc3BlZWRfaHopICsgMSkgPj4gMTsKKwlzcHIgPSAwOworCWlmIChzcHByIDwgMSkKKwkJc3BwciA9IDE7CisJd2hpbGUgKCgoc3BwciAtIDEpICYgfjB4NykgIT0gMCkgeworCQlzcHByID0gKHNwcHIgKyAxKSA+PiAxOyAvKiBhZGQgJzEnIHRvIGZvcmNlIHJvdW5kaW5nIHVwICovCisJCXNwcisrOworCX0KKwlzcHByLS07CQkvKiBzcHByIHF1YW50aXR5IGluIHJlZ2lzdGVyIGlzIG9mZnNldCBieSAxICovCisJaWYgKHNwciA+IDcpIHsKKwkJLyogRG9uJ3Qgb3ZlcnJ1biBsaW1pdHMgb2YgU1BJIGJhdWRyYXRlIHJlZ2lzdGVyICovCisJCXNwciA9IDc7CisJCXNwcHIgPSA3OworCX0KKwlvdXRfOChtcy0+cmVncyArIFNQSV9CUlIsIHNwcHIgPDwgNCB8IHNwcik7IC8qIFNldCBzcGVlZCAqLworCisJbXMtPmNzX2NoYW5nZSA9IDE7CisJbXMtPnRyYW5zZmVyID0gY29udGFpbmVyX29mKG1zLT5tZXNzYWdlLT50cmFuc2ZlcnMubmV4dCwKKwkJCQkgICAgc3RydWN0IHNwaV90cmFuc2ZlciwgdHJhbnNmZXJfbGlzdCk7CisKKwltcGM1Mnh4X3NwaV9zdGFydF90cmFuc2Zlcihtcyk7CisJbXMtPnN0YXRlID0gbXBjNTJ4eF9zcGlfZnNtc3RhdGVfdHJhbnNmZXI7CisKKwlyZXR1cm4gRlNNX0NPTlRJTlVFOworfQorCisvKgorICogVFJBTlNGRVIgc3RhdGUKKyAqCisgKiBJbiB0aGUgbWlkZGxlIG9mIGEgdHJhbnNmZXIuICBJZiB0aGUgU1BJIGNvcmUgaGFzIGNvbXBsZXRlZCBwcm9jZXNzaW5nCisgKiBhIGJ5dGUsIHRoZW4gcmVhZCBvdXQgdGhlIHJlY2VpdmVkIGRhdGEgYW5kIHdyaXRlIG91dCB0aGUgbmV4dCBieXRlCisgKiAodW5sZXNzIHRoaXMgdHJhbnNmZXIgaXMgZmluaXNoZWQ7IGluIHdoaWNoIGNhc2UgZ28gb24gdG8gdGhlIHdhaXQKKyAqIHN0YXRlKQorICovCitzdGF0aWMgaW50IG1wYzUyeHhfc3BpX2ZzbXN0YXRlX3RyYW5zZmVyKGludCBpcnEsIHN0cnVjdCBtcGM1Mnh4X3NwaSAqbXMsCisJCQkJCSB1OCBzdGF0dXMsIHU4IGRhdGEpCit7CisJaWYgKCFzdGF0dXMpCisJCXJldHVybiBtcy0+aXJxMCA/IEZTTV9TVE9QIDogRlNNX1BPTEw7CisKKwlpZiAoc3RhdHVzICYgU1BJX1NUQVRVU19XQ09MKSB7CisJCS8qIFRoZSBTUEkgY29udHJvbGxlciBpcyBzdG9vcGlkLiAgQXQgc2xvd2VyIHNwZWVkcywgaXQgbWF5CisJCSAqIHJhaXNlIHRoZSBTUElGIGZsYWcgYmVmb3JlIHRoZSBzdGF0ZSBtYWNoaW5lIGlzIGFjdHVhbGx5CisJCSAqIGZpbmlzaGVkLCB3aGljaCBjYXVzZXMgYSBjb2xsaXNpb24gKGludGVybmFsIHRvIHRoZSBzdGF0ZQorCQkgKiBtYWNoaW5lIG9ubHkpLiAgVGhlIG1hbnVhbCByZWNvbW1lbmRzIGluc2VydGluZyBhIGRlbGF5CisJCSAqIGJldHdlZW4gcmVjZWl2aW5nIHRoZSBpbnRlcnJ1cHQgYW5kIHNlbmRpbmcgdGhlIG5leHQgYnl0ZSwKKwkJICogYnV0IGl0IGNhbiBhbHNvIGJlIHdvcmtlZCBhcm91bmQgc2ltcGx5IGJ5IHJldHJ5aW5nIHRoZQorCQkgKiB0cmFuc2ZlciB3aGljaCBpcyB3aGF0IHdlIGRvIGhlcmUuICovCisJCW1zLT53Y29sX2NvdW50Kys7CisJCW1zLT53Y29sX3RpY2tzICs9IGdldF90YmwoKSAtIG1zLT53Y29sX3R4X3RpbWVzdGFtcDsKKwkJbXMtPndjb2xfdHhfdGltZXN0YW1wID0gZ2V0X3RibCgpOworCQlkYXRhID0gMDsKKwkJaWYgKG1zLT50eF9idWYpCisJCQlkYXRhID0gKihtcy0+dHhfYnVmIC0gMSk7CisJCW91dF84KG1zLT5yZWdzICsgU1BJX0RBVEEsIGRhdGEpOyAvKiB0cnkgYWdhaW4gKi8KKwkJcmV0dXJuIEZTTV9DT05USU5VRTsKKwl9IGVsc2UgaWYgKHN0YXR1cyAmIFNQSV9TVEFUVVNfTU9ERikgeworCQltcy0+bW9kZl9jb3VudCsrOworCQlkZXZfZXJyKCZtcy0+bWFzdGVyLT5kZXYsICJtb2RlIGZhdWx0XG4iKTsKKwkJbXBjNTJ4eF9zcGlfY2hpcHNlbChtcywgMCk7CisJCW1zLT5tZXNzYWdlLT5zdGF0dXMgPSAtRUlPOworCQltcy0+bWVzc2FnZS0+Y29tcGxldGUobXMtPm1lc3NhZ2UtPmNvbnRleHQpOworCQltcy0+c3RhdGUgPSBtcGM1Mnh4X3NwaV9mc21zdGF0ZV9pZGxlOworCQlyZXR1cm4gRlNNX0NPTlRJTlVFOworCX0KKworCS8qIFJlYWQgZGF0YSBvdXQgb2YgdGhlIHNwaSBkZXZpY2UgKi8KKwltcy0+Ynl0ZV9jb3VudCsrOworCWlmIChtcy0+cnhfYnVmKQorCQkqbXMtPnJ4X2J1ZisrID0gZGF0YTsKKworCS8qIElzIHRoZSB0cmFuc2ZlciBjb21wbGV0ZT8gKi8KKwltcy0+bGVuLS07CisJaWYgKG1zLT5sZW4gPT0gMCkgeworCQltcy0+dGltZXN0YW1wID0gZ2V0X3RibCgpOworCQltcy0+dGltZXN0YW1wICs9IG1zLT50cmFuc2Zlci0+ZGVsYXlfdXNlY3MgKiB0Yl90aWNrc19wZXJfdXNlYzsKKwkJbXMtPnN0YXRlID0gbXBjNTJ4eF9zcGlfZnNtc3RhdGVfd2FpdDsKKwkJcmV0dXJuIEZTTV9DT05USU5VRTsKKwl9CisKKwkvKiBXcml0ZSBvdXQgdGhlIG5leHQgYnl0ZSAqLworCW1zLT53Y29sX3R4X3RpbWVzdGFtcCA9IGdldF90YmwoKTsKKwlpZiAobXMtPnR4X2J1ZikKKwkJb3V0XzgobXMtPnJlZ3MgKyBTUElfREFUQSwgKm1zLT50eF9idWYrKyk7CisJZWxzZQorCQlvdXRfOChtcy0+cmVncyArIFNQSV9EQVRBLCAwKTsKKworCXJldHVybiBGU01fQ09OVElOVUU7Cit9CisKKy8qCisgKiBXQUlUIHN0YXRlCisgKgorICogQSB0cmFuc2ZlciBoYXMgY29tcGxldGVkOyBuZWVkIHRvIHdhaXQgZm9yIHRoZSBkZWxheSBwZXJpb2QgdG8gY29tcGxldGUKKyAqIGJlZm9yZSBzdGFydGluZyB0aGUgbmV4dCB0cmFuc2ZlcgorICovCitzdGF0aWMgaW50CittcGM1Mnh4X3NwaV9mc21zdGF0ZV93YWl0KGludCBpcnEsIHN0cnVjdCBtcGM1Mnh4X3NwaSAqbXMsIHU4IHN0YXR1cywgdTggZGF0YSkKK3sKKwlpZiAoc3RhdHVzICYmIGlycSkKKwkJZGV2X2VycigmbXMtPm1hc3Rlci0+ZGV2LCAic3B1cmlvdXMgaXJxLCBzdGF0dXM9MHglLjJ4XG4iLAorCQkJc3RhdHVzKTsKKworCWlmICgoKGludClnZXRfdGJsKCkpIC0gbXMtPnRpbWVzdGFtcCA8IDApCisJCXJldHVybiBGU01fUE9MTDsKKworCW1zLT5tZXNzYWdlLT5hY3R1YWxfbGVuZ3RoICs9IG1zLT50cmFuc2Zlci0+bGVuOworCisJLyogQ2hlY2sgaWYgdGhlcmUgaXMgYW5vdGhlciB0cmFuc2ZlciBpbiB0aGlzIG1lc3NhZ2UuICBJZiB0aGVyZQorCSAqIGFyZW4ndCB0aGVuIGRlYWN0aXZhdGUgQ1MsIG5vdGlmeSBzZW5kZXIsIGFuZCBkcm9wIGJhY2sgdG8gaWRsZQorCSAqIHRvIHN0YXJ0IHRoZSBuZXh0IG1lc3NhZ2UuICovCisJaWYgKG1zLT50cmFuc2Zlci0+dHJhbnNmZXJfbGlzdC5uZXh0ID09ICZtcy0+bWVzc2FnZS0+dHJhbnNmZXJzKSB7CisJCW1zLT5tc2dfY291bnQrKzsKKwkJbXBjNTJ4eF9zcGlfY2hpcHNlbChtcywgMCk7CisJCW1zLT5tZXNzYWdlLT5zdGF0dXMgPSAwOworCQltcy0+bWVzc2FnZS0+Y29tcGxldGUobXMtPm1lc3NhZ2UtPmNvbnRleHQpOworCQltcy0+c3RhdGUgPSBtcGM1Mnh4X3NwaV9mc21zdGF0ZV9pZGxlOworCQlyZXR1cm4gRlNNX0NPTlRJTlVFOworCX0KKworCS8qIFRoZXJlIGlzIGFub3RoZXIgdHJhbnNmZXI7IGtpY2sgaXQgb2ZmICovCisKKwlpZiAobXMtPmNzX2NoYW5nZSkKKwkJbXBjNTJ4eF9zcGlfY2hpcHNlbChtcywgMCk7CisKKwltcy0+dHJhbnNmZXIgPSBjb250YWluZXJfb2YobXMtPnRyYW5zZmVyLT50cmFuc2Zlcl9saXN0Lm5leHQsCisJCQkJICAgIHN0cnVjdCBzcGlfdHJhbnNmZXIsIHRyYW5zZmVyX2xpc3QpOworCW1wYzUyeHhfc3BpX3N0YXJ0X3RyYW5zZmVyKG1zKTsKKwltcy0+c3RhdGUgPSBtcGM1Mnh4X3NwaV9mc21zdGF0ZV90cmFuc2ZlcjsKKwlyZXR1cm4gRlNNX0NPTlRJTlVFOworfQorCisvKioKKyAqIG1wYzUyeHhfc3BpX2ZzbV9wcm9jZXNzIC0gRmluaXRlIFN0YXRlIE1hY2hpbmUgaXRlcmF0aW9uIGZ1bmN0aW9uCisgKiBAaXJxOiBpcnEgbnVtYmVyIHRoYXQgdHJpZ2dlcmVkIHRoZSBGU00gb3IgMCBmb3IgcG9sbGluZworICogQG1zOiBwb2ludGVyIHRvIG1wYzUyeHhfc3BpIGRyaXZlciBkYXRhCisgKi8KK3N0YXRpYyB2b2lkIG1wYzUyeHhfc3BpX2ZzbV9wcm9jZXNzKGludCBpcnEsIHN0cnVjdCBtcGM1Mnh4X3NwaSAqbXMpCit7CisJaW50IHJjID0gRlNNX0NPTlRJTlVFOworCXU4IHN0YXR1cywgZGF0YTsKKworCXdoaWxlIChyYyA9PSBGU01fQ09OVElOVUUpIHsKKwkJLyogSW50ZXJydXB0IGNsZWFyZWQgYnkgcmVhZCBvZiBTVEFUVVMgZm9sbG93ZWQgYnkKKwkJICogcmVhZCBvZiBEQVRBIHJlZ2lzdGVycyAqLworCQlzdGF0dXMgPSBpbl84KG1zLT5yZWdzICsgU1BJX1NUQVRVUyk7CisJCWRhdGEgPSBpbl84KG1zLT5yZWdzICsgU1BJX0RBVEEpOworCQlyYyA9IG1zLT5zdGF0ZShpcnEsIG1zLCBzdGF0dXMsIGRhdGEpOworCX0KKworCWlmIChyYyA9PSBGU01fUE9MTCkKKwkJc2NoZWR1bGVfd29yaygmbXMtPndvcmspOworfQorCisvKioKKyAqIG1wYzUyeHhfc3BpX2lycSAtIElSUSBoYW5kbGVyCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBtcGM1Mnh4X3NwaV9pcnEoaW50IGlycSwgdm9pZCAqX21zKQoreworCXN0cnVjdCBtcGM1Mnh4X3NwaSAqbXMgPSBfbXM7CisJc3Bpbl9sb2NrKCZtcy0+bG9jayk7CisJbXBjNTJ4eF9zcGlfZnNtX3Byb2Nlc3MoaXJxLCBtcyk7CisJc3Bpbl91bmxvY2soJm1zLT5sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKgorICogbXBjNTJ4eF9zcGlfd3EgLSBXb3JrcXVldWUgZnVuY3Rpb24gZm9yIHBvbGxpbmcgdGhlIHN0YXRlIG1hY2hpbmUKKyAqLworc3RhdGljIHZvaWQgbXBjNTJ4eF9zcGlfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBtcGM1Mnh4X3NwaSAqbXMgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG1wYzUyeHhfc3BpLCB3b3JrKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1zLT5sb2NrLCBmbGFncyk7CisJbXBjNTJ4eF9zcGlfZnNtX3Byb2Nlc3MoMCwgbXMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBzcGlfbWFzdGVyIG9wcworICovCisKK3N0YXRpYyBpbnQgbXBjNTJ4eF9zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpZiAoc3BpLT5iaXRzX3Blcl93b3JkICUgOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc3BpLT5tb2RlICYgfihTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0xTQl9GSVJTVCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHNwaS0+Y2hpcF9zZWxlY3QgPj0gc3BpLT5tYXN0ZXItPm51bV9jaGlwc2VsZWN0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1wYzUyeHhfc3BpX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfbWVzc2FnZSAqbSkKK3sKKwlzdHJ1Y3QgbXBjNTJ4eF9zcGkgKm1zID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW0tPmFjdHVhbF9sZW5ndGggPSAwOworCW0tPnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtcy0+bG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJm0tPnF1ZXVlLCAmbXMtPnF1ZXVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcy0+bG9jaywgZmxhZ3MpOworCXNjaGVkdWxlX3dvcmsoJm1zLT53b3JrKTsKKworCXJldHVybiAwOworfQorCisvKgorICogT0YgUGxhdGZvcm0gQnVzIEJpbmRpbmcKKyAqLworc3RhdGljIGludCBfX2RldmluaXQgbXBjNTJ4eF9zcGlfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb3AsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IG1wYzUyeHhfc3BpICptczsKKwl2b2lkIF9faW9tZW0gKnJlZ3M7CisJdTggY3RybDE7CisJaW50IHJjLCBpID0gMDsKKwlpbnQgZ3Bpb19jczsKKworCS8qIE1NSU8gcmVnaXN0ZXJzICovCisJZGV2X2RiZygmb3AtPmRldiwgInByb2JpbmcgbXBjNTIwMCBTUEkgZGV2aWNlXG4iKTsKKwlyZWdzID0gb2ZfaW9tYXAob3AtPm5vZGUsIDApOworCWlmICghcmVncykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBpbml0aWFsaXplIHRoZSBkZXZpY2UgKi8KKwljdHJsMSA9IFNQSV9DVFJMMV9TUElFIHwgU1BJX0NUUkwxX1NQRSB8IFNQSV9DVFJMMV9NU1RSOworCW91dF84KHJlZ3MgKyBTUElfQ1RSTDEsIGN0cmwxKTsKKwlvdXRfOChyZWdzICsgU1BJX0NUUkwyLCAweDApOworCW91dF84KHJlZ3MgKyBTUElfREFUQURJUiwgMHhlKTsJLyogU2V0IG91dHB1dCBwaW5zICovCisJb3V0XzgocmVncyArIFNQSV9QT1JUREFUQSwgMHg4KTsJLyogRGVhc3NlcnQgL1NTIHNpZ25hbCAqLworCisJLyogQ2xlYXIgdGhlIHN0YXR1cyByZWdpc3RlciBhbmQgcmUtcmVhZCBpdCB0byBjaGVjayBmb3IgYSBNT0RGCisJICogZmFpbHVyZS4gIFRoaXMgZHJpdmVyIGNhbm5vdCBjdXJyZW50bHkgaGFuZGxlIG11bHRpcGxlIG1hc3RlcnMKKwkgKiBvbiB0aGUgU1BJIGJ1cy4gIFRoaXMgZmF1bHQgd2lsbCBhbHNvIG9jY3VyIGlmIHRoZSBTUEkgc2lnbmFscworCSAqIGFyZSBub3QgY29ubmVjdGVkIHRvIGFueSBwaW5zIChwb3J0X2NvbmZpZyBzZXR0aW5nKSAqLworCWluXzgocmVncyArIFNQSV9TVEFUVVMpOworCW91dF84KHJlZ3MgKyBTUElfQ1RSTDEsIGN0cmwxKTsKKworCWluXzgocmVncyArIFNQSV9EQVRBKTsKKwlpZiAoaW5fOChyZWdzICsgU1BJX1NUQVRVUykgJiBTUElfU1RBVFVTX01PREYpIHsKKwkJZGV2X2Vycigmb3AtPmRldiwgIm1vZGUgZmF1bHQ7IGlzIHBvcnRfY29uZmlnIGNvcnJlY3Q/XG4iKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGVycl9pbml0OworCX0KKworCWRldl9kYmcoJm9wLT5kZXYsICJhbGxvY2F0aW5nIHNwaV9tYXN0ZXIgc3RydWN0XG4iKTsKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZvcC0+ZGV2LCBzaXplb2YgKm1zKTsKKwlpZiAoIW1hc3RlcikgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2FsbG9jOworCX0KKworCW1hc3Rlci0+YnVzX251bSA9IC0xOworCW1hc3Rlci0+c2V0dXAgPSBtcGM1Mnh4X3NwaV9zZXR1cDsKKwltYXN0ZXItPnRyYW5zZmVyID0gbXBjNTJ4eF9zcGlfdHJhbnNmZXI7CisJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0xTQl9GSVJTVDsKKworCWRldl9zZXRfZHJ2ZGF0YSgmb3AtPmRldiwgbWFzdGVyKTsKKworCW1zID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCW1zLT5tYXN0ZXIgPSBtYXN0ZXI7CisJbXMtPnJlZ3MgPSByZWdzOworCW1zLT5pcnEwID0gaXJxX29mX3BhcnNlX2FuZF9tYXAob3AtPm5vZGUsIDApOworCW1zLT5pcnExID0gaXJxX29mX3BhcnNlX2FuZF9tYXAob3AtPm5vZGUsIDEpOworCW1zLT5zdGF0ZSA9IG1wYzUyeHhfc3BpX2ZzbXN0YXRlX2lkbGU7CisJbXMtPmlwYl9mcmVxID0gbXBjNXh4eF9nZXRfYnVzX2ZyZXF1ZW5jeShvcC0+bm9kZSk7CisJbXMtPmdwaW9fY3NfY291bnQgPSBvZl9ncGlvX2NvdW50KG9wLT5ub2RlKTsKKwlpZiAobXMtPmdwaW9fY3NfY291bnQgPiAwKSB7CisJCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBtcy0+Z3Bpb19jc19jb3VudDsKKwkJbXMtPmdwaW9fY3MgPSBrbWFsbG9jKG1zLT5ncGlvX2NzX2NvdW50ICogc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCQkJR0ZQX0tFUk5FTCk7CisJCWlmICghbXMtPmdwaW9fY3MpIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyX2FsbG9jOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IG1zLT5ncGlvX2NzX2NvdW50OyBpKyspIHsKKwkJCWdwaW9fY3MgPSBvZl9nZXRfZ3BpbyhvcC0+bm9kZSwgaSk7CisJCQlpZiAoZ3Bpb19jcyA8IDApIHsKKwkJCQlkZXZfZXJyKCZvcC0+ZGV2LAorCQkJCQkiY291bGQgbm90IHBhcnNlIHRoZSBncGlvIGZpZWxkICIKKwkJCQkJImluIG9mdHJlZVxuIik7CisJCQkJcmMgPSAtRU5PREVWOworCQkJCWdvdG8gZXJyX2dwaW87CisJCQl9CisKKwkJCXJjID0gZ3Bpb19yZXF1ZXN0KGdwaW9fY3MsIGRldl9uYW1lKCZvcC0+ZGV2KSk7CisJCQlpZiAocmMpIHsKKwkJCQlkZXZfZXJyKCZvcC0+ZGV2LAorCQkJCQkiY2FuJ3QgcmVxdWVzdCBzcGkgY3MgZ3BpbyAjJWQgIgorCQkJCQkib24gZ3BpbyBsaW5lICVkXG4iLCBpLCBncGlvX2NzKTsKKwkJCQlnb3RvIGVycl9ncGlvOworCQkJfQorCisJCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZ3Bpb19jcywgMSk7CisJCQltcy0+Z3Bpb19jc1tpXSA9IGdwaW9fY3M7CisJCX0KKwl9IGVsc2UgeworCQltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gMTsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmbXMtPmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZtcy0+cXVldWUpOworCUlOSVRfV09SSygmbXMtPndvcmssIG1wYzUyeHhfc3BpX3dxKTsKKworCS8qIERlY2lkZSBpZiBpbnRlcnJ1cHRzIGNhbiBiZSB1c2VkICovCisJaWYgKG1zLT5pcnEwICYmIG1zLT5pcnExKSB7CisJCXJjID0gcmVxdWVzdF9pcnEobXMtPmlycTAsIG1wYzUyeHhfc3BpX2lycSwgMCwKKwkJCQkgICJtcGM1MjAwLXNwaS1tb2RmIiwgbXMpOworCQlyYyB8PSByZXF1ZXN0X2lycShtcy0+aXJxMSwgbXBjNTJ4eF9zcGlfaXJxLCAwLAorCQkJCSAgIm1wYzUyMDAtc3BpLXNwaWYiLCBtcyk7CisJCWlmIChyYykgeworCQkJZnJlZV9pcnEobXMtPmlycTAsIG1zKTsKKwkJCWZyZWVfaXJxKG1zLT5pcnExLCBtcyk7CisJCQltcy0+aXJxMCA9IG1zLT5pcnExID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIG9wZXJhdGUgaW4gcG9sbGVkIG1vZGUgKi8KKwkJbXMtPmlycTAgPSBtcy0+aXJxMSA9IDA7CisJfQorCisJaWYgKCFtcy0+aXJxMCkKKwkJZGV2X2luZm8oJm9wLT5kZXYsICJ1c2luZyBwb2xsZWQgbW9kZVxuIik7CisKKwlkZXZfZGJnKCZvcC0+ZGV2LCAicmVnaXN0ZXJpbmcgc3BpX21hc3RlciBzdHJ1Y3RcbiIpOworCXJjID0gc3BpX3JlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOworCWlmIChyYykKKwkJZ290byBlcnJfcmVnaXN0ZXI7CisKKwlvZl9yZWdpc3Rlcl9zcGlfZGV2aWNlcyhtYXN0ZXIsIG9wLT5ub2RlKTsKKwlkZXZfaW5mbygmbXMtPm1hc3Rlci0+ZGV2LCAicmVnaXN0ZXJlZCBNUEM1MjAwIFNQSSBidXNcbiIpOworCisJcmV0dXJuIHJjOworCisgZXJyX3JlZ2lzdGVyOgorCWRldl9lcnIoJm1zLT5tYXN0ZXItPmRldiwgImluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CisJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKKyBlcnJfZ3BpbzoKKwl3aGlsZSAoaS0tID4gMCkKKwkJZ3Bpb19mcmVlKG1zLT5ncGlvX2NzW2ldKTsKKworCWtmcmVlKG1zLT5ncGlvX2NzKTsKKyBlcnJfYWxsb2M6CisgZXJyX2luaXQ6CisJaW91bm1hcChyZWdzKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IG1wYzUyeHhfc3BpX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCkKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gZGV2X2dldF9kcnZkYXRhKCZvcC0+ZGV2KTsKKwlzdHJ1Y3QgbXBjNTJ4eF9zcGkgKm1zID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCWludCBpOworCisJZnJlZV9pcnEobXMtPmlycTAsIG1zKTsKKwlmcmVlX2lycShtcy0+aXJxMSwgbXMpOworCisJZm9yIChpID0gMDsgaSA8IG1zLT5ncGlvX2NzX2NvdW50OyBpKyspCisJCWdwaW9fZnJlZShtcy0+Z3Bpb19jc1tpXSk7CisKKwlrZnJlZShtcy0+Z3Bpb19jcyk7CisJc3BpX3VucmVnaXN0ZXJfbWFzdGVyKG1hc3Rlcik7CisJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKKwlpb3VubWFwKG1zLT5yZWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtcGM1Mnh4X3NwaV9tYXRjaFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMC1zcGkiLCB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXBjNTJ4eF9zcGlfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBtcGM1Mnh4X3NwaV9vZl9kcml2ZXIgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm5hbWUgPSAibXBjNTJ4eC1zcGkiLAorCS5tYXRjaF90YWJsZSA9IG1wYzUyeHhfc3BpX21hdGNoLAorCS5wcm9iZSA9IG1wYzUyeHhfc3BpX3Byb2JlLAorCS5yZW1vdmUgPSBfX2V4aXRfcChtcGM1Mnh4X3NwaV9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbXBjNTJ4eF9zcGlfaW5pdCh2b2lkKQoreworCXJldHVybiBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJm1wYzUyeHhfc3BpX29mX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChtcGM1Mnh4X3NwaV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IG1wYzUyeHhfc3BpX2V4aXQodm9pZCkKK3sKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmbXBjNTJ4eF9zcGlfb2ZfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KG1wYzUyeHhfc3BpX2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9vbWFwX3NwaV8xMDBrLmMgYi9kcml2ZXJzL3NwaS9vbWFwX3NwaV8xMDBrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM1NWQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL29tYXBfc3BpXzEwMGsuYwpAQCAtMCwwICsxLDYzNSBAQAorLyoKKyAqIE9NQVA3eHggU1BJIDEwMGsgY29udHJvbGxlciBkcml2ZXIKKyAqIEF1dGhvcjogRmFicmljZSBDcm9oYXMgPGZjcm9oYXNAZ21haWwuY29tPgorICogZnJvbSBvcmlnaW5hbCBvbWFwMV9tY3NwaSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogICAgICBTYW11ZWwgT3J0aXogPHNhbXVlbC5vcnRpekBub2tpYS5jb20+IGFuZAorICogICAgICAgICAgICAgIEp1aGEgWXJq77+9bO+/vSA8anVoYS55cmpvbGFAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKworI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KKworI2RlZmluZSBPTUFQMV9TUEkxMDBLX01BWF9GUkVRICAgICAgICAgIDQ4MDAwMDAwCisKKyNkZWZpbmUgSUNSX1NQSVRBUyAgICAgIChPTUFQN1hYX0lDUl9CQVNFICsgMHgxMikKKworI2RlZmluZSBTUElfU0VUVVAxICAgICAgMHgwMAorI2RlZmluZSBTUElfU0VUVVAyICAgICAgMHgwMgorI2RlZmluZSBTUElfQ1RSTCAgICAgICAgMHgwNAorI2RlZmluZSBTUElfU1RBVFVTICAgICAgMHgwNgorI2RlZmluZSBTUElfVFhfTFNCICAgICAgMHgwOAorI2RlZmluZSBTUElfVFhfTVNCICAgICAgMHgwYQorI2RlZmluZSBTUElfUlhfTFNCICAgICAgMHgwYworI2RlZmluZSBTUElfUlhfTVNCICAgICAgMHgwZQorCisjZGVmaW5lIFNQSV9TRVRVUDFfSU5UX1JFQURfRU5BQkxFICAgICAgKDFVTCA8PCA1KQorI2RlZmluZSBTUElfU0VUVVAxX0lOVF9XUklURV9FTkFCTEUgICAgICgxVUwgPDwgNCkKKyNkZWZpbmUgU1BJX1NFVFVQMV9DTE9DS19ESVZJU09SKHgpICAgICAoKHgpIDw8IDEpCisjZGVmaW5lIFNQSV9TRVRVUDFfQ0xPQ0tfRU5BQkxFICAgICAgICAgKDFVTCA8PCAwKQorCisjZGVmaW5lIFNQSV9TRVRVUDJfQUNUSVZFX0VER0VfRkFMTElORyAgKDBVTCA8PCAwKQorI2RlZmluZSBTUElfU0VUVVAyX0FDVElWRV9FREdFX1JJU0lORyAgICgxVUwgPDwgMCkKKyNkZWZpbmUgU1BJX1NFVFVQMl9ORUdBVElWRV9MRVZFTCAgICAgICAoMFVMIDw8IDUpCisjZGVmaW5lIFNQSV9TRVRVUDJfUE9TSVRJVkVfTEVWRUwgICAgICAgKDFVTCA8PCA1KQorI2RlZmluZSBTUElfU0VUVVAyX0xFVkVMX1RSSUdHRVIgICAgICAgICgwVUwgPDwgMTApCisjZGVmaW5lIFNQSV9TRVRVUDJfRURHRV9UUklHR0VSICAgICAgICAgKDFVTCA8PCAxMCkKKworI2RlZmluZSBTUElfQ1RSTF9TRU4oeCkgICAgICAgICAgICAgICAgICgoeCkgPDwgNykKKyNkZWZpbmUgU1BJX0NUUkxfV09SRF9TSVpFKHgpICAgICAgICAgICAoKCh4KSAtIDEpIDw8IDIpCisjZGVmaW5lIFNQSV9DVFJMX1dSICAgICAgICAgICAgICAgICAgICAgKDFVTCA8PCAxKQorI2RlZmluZSBTUElfQ1RSTF9SRCAgICAgICAgICAgICAgICAgICAgICgxVUwgPDwgMCkKKworI2RlZmluZSBTUElfU1RBVFVTX1dFICAgICAgICAgICAgICAgICAgICgxVUwgPDwgMSkKKyNkZWZpbmUgU1BJX1NUQVRVU19SRCAgICAgICAgICAgICAgICAgICAoMVVMIDw8IDApCisKKyNkZWZpbmUgV1JJVEUgMAorI2RlZmluZSBSRUFEICAxCisKKworLyogdXNlIFBJTyBmb3Igc21hbGwgdHJhbnNmZXJzLCBhdm9pZGluZyBETUEgc2V0dXAvdGVhcmRvd24gb3ZlcmhlYWQgYW5kCisgKiBjYWNoZSBvcGVyYXRpb25zOyBiZXR0ZXIgaGV1cmlzdGljcyBjb25zaWRlciB3b3Jkc2l6ZSBhbmQgYml0cmF0ZS4KKyAqLworI2RlZmluZSBETUFfTUlOX0JZVEVTICAgICAgICAgICAgICAgICAgIDgKKworI2RlZmluZSBTUElfUlVOTklORwkwCisjZGVmaW5lIFNQSV9TSFVURE9XTgkxCisKK3N0cnVjdCBvbWFwMV9zcGkxMDBrIHsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgICAgICB3b3JrOworCisJLyogbG9jayBwcm90ZWN0cyBxdWV1ZSBhbmQgcmVnaXN0ZXJzICovCisJc3BpbmxvY2tfdCAgICAgICAgICAgICAgbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICBtc2dfcXVldWU7CisJc3RydWN0IHNwaV9tYXN0ZXIgICAgICAgKm1hc3RlcjsKKwlzdHJ1Y3QgY2xrICAgICAgICAgICAgICAqaWNrOworCXN0cnVjdCBjbGsgICAgICAgICAgICAgICpmY2s7CisKKwkvKiBWaXJ0dWFsIGJhc2UgYWRkcmVzcyBvZiB0aGUgY29udHJvbGxlciAqLworCXZvaWQgX19pb21lbSAgICAgICAgICAgICpiYXNlOworCisJLyogU3RhdGUgb2YgdGhlIFNQSSAqLworCXVuc2lnbmVkIGludAkJc3RhdGU7Cit9OworCitzdHJ1Y3Qgb21hcDFfc3BpMTAwa19jcyB7CisJdm9pZCBfX2lvbWVtICAgICAgICAgICAgKmJhc2U7CisJaW50ICAgICAgICAgICAgICAgICAgICAgd29yZF9sZW47Cit9OworCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKm9tYXAxX3NwaTEwMGtfd3E7CisKKyNkZWZpbmUgTU9EX1JFR19CSVQodmFsLCBtYXNrLCBzZXQpIGRvIHsgXAorCWlmIChzZXQpIFwKKwkJdmFsIHw9IG1hc2s7IFwKKwllbHNlIFwKKwkJdmFsICY9IH5tYXNrOyBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBzcGkxMDBrX2VuYWJsZV9jbG9jayhzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJc3RydWN0IG9tYXAxX3NwaTEwMGsgKnNwaTEwMGsgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwkvKiBlbmFibGUgU1BJICovCisJdmFsID0gcmVhZHcoc3BpMTAway0+YmFzZSArIFNQSV9TRVRVUDEpOworCXZhbCB8PSBTUElfU0VUVVAxX0NMT0NLX0VOQUJMRTsKKwl3cml0ZXcodmFsLCBzcGkxMDBrLT5iYXNlICsgU1BJX1NFVFVQMSk7Cit9CisKK3N0YXRpYyB2b2lkIHNwaTEwMGtfZGlzYWJsZV9jbG9jayhzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJc3RydWN0IG9tYXAxX3NwaTEwMGsgKnNwaTEwMGsgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwkvKiBkaXNhYmxlIFNQSSAqLworCXZhbCA9IHJlYWR3KHNwaTEwMGstPmJhc2UgKyBTUElfU0VUVVAxKTsKKwl2YWwgJj0gflNQSV9TRVRVUDFfQ0xPQ0tfRU5BQkxFOworCXdyaXRldyh2YWwsIHNwaTEwMGstPmJhc2UgKyBTUElfU0VUVVAxKTsKK30KKworc3RhdGljIHZvaWQgc3BpMTAwa193cml0ZV9kYXRhKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsIGludCBsZW4sIGludCBkYXRhKQoreworCXN0cnVjdCBvbWFwMV9zcGkxMDBrICpzcGkxMDBrID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJLyogd3JpdGUgMTYtYml0IHdvcmQgKi8KKwlzcGkxMDBrX2VuYWJsZV9jbG9jayhtYXN0ZXIpOworCXdyaXRldyggZGF0YSAsIHNwaTEwMGstPmJhc2UgKyBTUElfVFhfTVNCKTsKKworCXdyaXRldyhTUElfQ1RSTF9TRU4oMCkgfAorCSAgICAgICBTUElfQ1RSTF9XT1JEX1NJWkUobGVuKSB8CisJICAgICAgIFNQSV9DVFJMX1dSLAorCSAgICAgICBzcGkxMDBrLT5iYXNlICsgU1BJX0NUUkwpOworCisJLyogV2FpdCBmb3IgYml0IGFjayBzZW5kIGNoYW5nZSAqLworCXdoaWxlKChyZWFkdyhzcGkxMDBrLT5iYXNlICsgU1BJX1NUQVRVUykgJiBTUElfU1RBVFVTX1dFKSAhPSBTUElfU1RBVFVTX1dFKTsKKwl1ZGVsYXkoMTAwMCk7CisKKwlzcGkxMDBrX2Rpc2FibGVfY2xvY2sobWFzdGVyKTsKK30KKworc3RhdGljIGludCBzcGkxMDBrX3JlYWRfZGF0YShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCBpbnQgbGVuKQoreworCWludCBkYXRhSCxkYXRhTDsKKwlzdHJ1Y3Qgb21hcDFfc3BpMTAwayAqc3BpMTAwayA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCXNwaTEwMGtfZW5hYmxlX2Nsb2NrKG1hc3Rlcik7CisJd3JpdGV3KFNQSV9DVFJMX1NFTigwKSB8CisJICAgICAgIFNQSV9DVFJMX1dPUkRfU0laRShsZW4pIHwKKwkgICAgICAgU1BJX0NUUkxfUkQsCisJICAgICAgIHNwaTEwMGstPmJhc2UgKyBTUElfQ1RSTCk7CisKKwl3aGlsZSgocmVhZHcoc3BpMTAway0+YmFzZSArIFNQSV9TVEFUVVMpICYgU1BJX1NUQVRVU19SRCkgIT0gU1BJX1NUQVRVU19SRCk7CisJdWRlbGF5KDEwMDApOworCisJZGF0YUwgPSByZWFkdyhzcGkxMDBrLT5iYXNlICsgU1BJX1JYX0xTQik7CisJZGF0YUggPSByZWFkdyhzcGkxMDBrLT5iYXNlICsgU1BJX1JYX01TQik7CisJc3BpMTAwa19kaXNhYmxlX2Nsb2NrKG1hc3Rlcik7CisKKwlyZXR1cm4gZGF0YUw7Cit9CisKK3N0YXRpYyB2b2lkIHNwaTEwMGtfb3BlbihzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQoreworCS8qIGdldCBjb250cm9sIG9mIFNQSSAqLworCXN0cnVjdCBvbWFwMV9zcGkxMDBrICpzcGkxMDBrID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJd3JpdGV3KFNQSV9TRVRVUDFfSU5UX1JFQURfRU5BQkxFIHwKKwkgICAgICAgU1BJX1NFVFVQMV9JTlRfV1JJVEVfRU5BQkxFIHwKKwkgICAgICAgU1BJX1NFVFVQMV9DTE9DS19ESVZJU09SKDApLCBzcGkxMDBrLT5iYXNlICsgU1BJX1NFVFVQMSk7CisKKwkvKiBjb25maWd1cmUgY2xvY2sgYW5kIGludGVycnVwdHMgKi8KKwl3cml0ZXcoU1BJX1NFVFVQMl9BQ1RJVkVfRURHRV9GQUxMSU5HIHwKKwkgICAgICAgU1BJX1NFVFVQMl9ORUdBVElWRV9MRVZFTCB8CisJICAgICAgIFNQSV9TRVRVUDJfTEVWRUxfVFJJR0dFUiwgc3BpMTAway0+YmFzZSArIFNQSV9TRVRVUDIpOworfQorCitzdGF0aWMgdm9pZCBvbWFwMV9zcGkxMDBrX2ZvcmNlX2NzKHN0cnVjdCBvbWFwMV9zcGkxMDBrICpzcGkxMDBrLCBpbnQgZW5hYmxlKQoreworCWlmIChlbmFibGUpCisJCXdyaXRldygweDA1ZmMsIHNwaTEwMGstPmJhc2UgKyBTUElfQ1RSTCk7CisJZWxzZQorCQl3cml0ZXcoMHgwNWZkLCBzcGkxMDBrLT5iYXNlICsgU1BJX0NUUkwpOworfQorCitzdGF0aWMgdW5zaWduZWQKK29tYXAxX3NwaTEwMGtfdHhyeF9waW8oc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKK3sKKwlzdHJ1Y3Qgb21hcDFfc3BpMTAwayAgICAqc3BpMTAwazsKKwlzdHJ1Y3Qgb21hcDFfc3BpMTAwa19jcyAqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgY291bnQsIGM7CisJaW50ICAgICAgICAgICAgICAgICAgICAgd29yZF9sZW47CisKKwlzcGkxMDBrID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJY291bnQgPSB4ZmVyLT5sZW47CisJYyA9IGNvdW50OworCXdvcmRfbGVuID0gY3MtPndvcmRfbGVuOworCisJLyogUlhfT05MWSBtb2RlIG5lZWRzIGR1bW15IGRhdGEgaW4gVFggcmVnICovCisJaWYgKHhmZXItPnR4X2J1ZiA9PSBOVUxMKQorCQlzcGkxMDBrX3dyaXRlX2RhdGEoc3BpLT5tYXN0ZXIsd29yZF9sZW4sIDApOworCisJaWYgKHdvcmRfbGVuIDw9IDgpIHsKKwkJdTggICAgICAgICAgICAgICpyeDsKKwkJY29uc3QgdTggICAgICAgICp0eDsKKworCQlyeCA9IHhmZXItPnJ4X2J1ZjsKKwkJdHggPSB4ZmVyLT50eF9idWY7CisJCWRvIHsKKwkJCWMtPTE7CisJCQlpZiAoeGZlci0+dHhfYnVmICE9IE5VTEwpCisJCQkJc3BpMTAwa193cml0ZV9kYXRhKHNwaS0+bWFzdGVyLHdvcmRfbGVuLCAqdHgpOworCQkJaWYgKHhmZXItPnJ4X2J1ZiAhPSBOVUxMKQorCQkJCSpyeCA9IHNwaTEwMGtfcmVhZF9kYXRhKHNwaS0+bWFzdGVyLHdvcmRfbGVuKTsKKwkJfSB3aGlsZShjKTsKKwl9IGVsc2UgaWYgKHdvcmRfbGVuIDw9IDE2KSB7CisJCXUxNiAgICAgICAgICAgICAqcng7CisJCWNvbnN0IHUxNiAgICAgICAqdHg7CisKKwkJcnggPSB4ZmVyLT5yeF9idWY7CisJCXR4ID0geGZlci0+dHhfYnVmOworCQlkbyB7CisJCQljLT0yOworCQkJaWYgKHhmZXItPnR4X2J1ZiAhPSBOVUxMKQorCQkJCXNwaTEwMGtfd3JpdGVfZGF0YShzcGktPm1hc3Rlcix3b3JkX2xlbiwgKnR4KyspOworCQkJaWYgKHhmZXItPnJ4X2J1ZiAhPSBOVUxMKQorCQkJCSpyeCsrID0gc3BpMTAwa19yZWFkX2RhdGEoc3BpLT5tYXN0ZXIsd29yZF9sZW4pOworCQl9IHdoaWxlKGMpOworCX0gZWxzZSBpZiAod29yZF9sZW4gPD0gMzIpIHsKKwkJdTMyICAgICAgICAgICAgICpyeDsKKwkJY29uc3QgdTMyICAgICAgICp0eDsKKworCQlyeCA9IHhmZXItPnJ4X2J1ZjsKKwkJdHggPSB4ZmVyLT50eF9idWY7CisJCWRvIHsKKwkJCWMtPTQ7CisJCQlpZiAoeGZlci0+dHhfYnVmICE9IE5VTEwpCisJCQkJc3BpMTAwa193cml0ZV9kYXRhKHNwaS0+bWFzdGVyLHdvcmRfbGVuLCAqdHgpOworCQkJaWYgKHhmZXItPnJ4X2J1ZiAhPSBOVUxMKQorCQkJCSpyeCA9IHNwaTEwMGtfcmVhZF9kYXRhKHNwaS0+bWFzdGVyLHdvcmRfbGVuKTsKKwkJfSB3aGlsZShjKTsKKwl9CisJcmV0dXJuIGNvdW50IC0gYzsKK30KKworLyogY2FsbGVkIG9ubHkgd2hlbiBubyB0cmFuc2ZlciBpcyBhY3RpdmUgdG8gdGhpcyBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgb21hcDFfc3BpMTAwa19zZXR1cF90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQoreworCXN0cnVjdCBvbWFwMV9zcGkxMDBrICpzcGkxMDBrID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJc3RydWN0IG9tYXAxX3NwaTEwMGtfY3MgKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOworCXU4IHdvcmRfbGVuID0gc3BpLT5iaXRzX3Blcl93b3JkOworCisJaWYgKHQgIT0gTlVMTCAmJiB0LT5iaXRzX3Blcl93b3JkKQorCQl3b3JkX2xlbiA9IHQtPmJpdHNfcGVyX3dvcmQ7CisJaWYgKCF3b3JkX2xlbikKKwkJd29yZF9sZW4gPSA4OworCisJaWYgKHNwaS0+Yml0c19wZXJfd29yZCA+IDMyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwljcy0+d29yZF9sZW4gPSB3b3JkX2xlbjsKKworCS8qIFNQSSBpbml0IGJlZm9yZSB0cmFuc2ZlciAqLworCXdyaXRldygweDNlICwgc3BpMTAway0+YmFzZSArIFNQSV9TRVRVUDEpOworCXdyaXRldygweDAwICwgc3BpMTAway0+YmFzZSArIFNQSV9TVEFUVVMpOworCXdyaXRldygweDNlICwgc3BpMTAway0+YmFzZSArIFNQSV9DVFJMKTsKKworCXJldHVybiAwOworfQorCisvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KKyNkZWZpbmUgTU9ERUJJVFMgKFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSCkKKworc3RhdGljIGludCBvbWFwMV9zcGkxMDBrX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50ICAgICAgICAgICAgICAgICAgICAgcmV0OworCXN0cnVjdCBvbWFwMV9zcGkxMDBrICAgICpzcGkxMDBrOworCXN0cnVjdCBvbWFwMV9zcGkxMDBrX2NzICpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKworCWlmIChzcGktPmJpdHNfcGVyX3dvcmQgPCA0IHx8IHNwaS0+Yml0c19wZXJfd29yZCA+IDMyKSB7CisJCSBkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiB1bnN1cHBvcnRlZCAlZCBiaXQgd29yZHNcbiIsCisJCQlzcGktPmJpdHNfcGVyX3dvcmQpOworCQkgcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3BpMTAwayA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCisJaWYgKCFjcykgeworCQljcyA9IGt6YWxsb2Moc2l6ZW9mICpjcywgR0ZQX0tFUk5FTCk7CisJCWlmICghY3MpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJY3MtPmJhc2UgPSBzcGkxMDBrLT5iYXNlICsgc3BpLT5jaGlwX3NlbGVjdCAqIDB4MTQ7CisJCXNwaS0+Y29udHJvbGxlcl9zdGF0ZSA9IGNzOworCX0KKworCXNwaTEwMGtfb3BlbihzcGktPm1hc3Rlcik7CisKKwljbGtfZW5hYmxlKHNwaTEwMGstPmljayk7CisJY2xrX2VuYWJsZShzcGkxMDBrLT5mY2spOworCisJcmV0ID0gb21hcDFfc3BpMTAwa19zZXR1cF90cmFuc2ZlcihzcGksIE5VTEwpOworCisJY2xrX2Rpc2FibGUoc3BpMTAway0+aWNrKTsKKwljbGtfZGlzYWJsZShzcGkxMDBrLT5mY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgb21hcDFfc3BpMTAwa193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgb21hcDFfc3BpMTAwayAgICAqc3BpMTAwazsKKwlpbnQgc3RhdHVzID0gMDsKKworCXNwaTEwMGsgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG9tYXAxX3NwaTEwMGssIHdvcmspOworCXNwaW5fbG9ja19pcnEoJnNwaTEwMGstPmxvY2spOworCisJY2xrX2VuYWJsZShzcGkxMDBrLT5pY2spOworCWNsa19lbmFibGUoc3BpMTAway0+ZmNrKTsKKworCS8qIFdlIG9ubHkgZW5hYmxlIG9uZSBjaGFubmVsIGF0IGEgdGltZSAtLSB0aGUgb25lIHdob3NlIG1lc3NhZ2UgaXMKKwkgKiBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUgLS0gYWx0aG91Z2ggdGhpcyBjb250cm9sbGVyIHdvdWxkIGdsYWRseQorCSAqIGFyYml0cmF0ZSBhbW9uZyBtdWx0aXBsZSBjaGFubmVscy4gIFRoaXMgY29ycmVzcG9uZHMgdG8gInNpbmdsZQorCSAqIGNoYW5uZWwiIG1hc3RlciBtb2RlLiAgQXMgYSBzaWRlIGVmZmVjdCwgd2UgbmVlZCB0byBtYW5hZ2UgdGhlCisJICogY2hpcHNlbGVjdCB3aXRoIHRoZSBGT1JDRSBiaXQgLi4uIENTICE9IGNoYW5uZWwgZW5hYmxlLgorCSAqLworCSB3aGlsZSAoIWxpc3RfZW1wdHkoJnNwaTEwMGstPm1zZ19xdWV1ZSkpIHsKKwkJc3RydWN0IHNwaV9tZXNzYWdlICAgICAgICAgICAgICAqbTsKKwkJc3RydWN0IHNwaV9kZXZpY2UgICAgICAgICAgICAgICAqc3BpOworCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICAgICAgICAgICAgICp0ID0gTlVMTDsKKwkJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc19hY3RpdmUgPSAwOworCQlzdHJ1Y3Qgb21hcDFfc3BpMTAwa19jcyAgICAgICAgICpjczsKKwkJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJfb3ZlcnJpZGUgPSAwOworCisJCW0gPSBjb250YWluZXJfb2Yoc3BpMTAway0+bXNnX3F1ZXVlLm5leHQsIHN0cnVjdCBzcGlfbWVzc2FnZSwKKwkJCQkgcXVldWUpOworCisJCWxpc3RfZGVsX2luaXQoJm0tPnF1ZXVlKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZzcGkxMDBrLT5sb2NrKTsKKworCQlzcGkgPSBtLT5zcGk7CisJCWNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCQkJaWYgKHQtPnR4X2J1ZiA9PSBOVUxMICYmIHQtPnJ4X2J1ZiA9PSBOVUxMICYmIHQtPmxlbikgeworCQkJCXN0YXR1cyA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAocGFyX292ZXJyaWRlIHx8IHQtPnNwZWVkX2h6IHx8IHQtPmJpdHNfcGVyX3dvcmQpIHsKKwkJCQlwYXJfb3ZlcnJpZGUgPSAxOworCQkJCXN0YXR1cyA9IG9tYXAxX3NwaTEwMGtfc2V0dXBfdHJhbnNmZXIoc3BpLCB0KTsKKwkJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKCF0LT5zcGVlZF9oeiAmJiAhdC0+Yml0c19wZXJfd29yZCkKKwkJCQkJcGFyX292ZXJyaWRlID0gMDsKKwkJCX0KKworCQkJaWYgKCFjc19hY3RpdmUpIHsKKwkJCQlvbWFwMV9zcGkxMDBrX2ZvcmNlX2NzKHNwaTEwMGssIDEpOworCQkJCWNzX2FjdGl2ZSA9IDE7CisJCQl9CisKKwkJCWlmICh0LT5sZW4pIHsKKwkJCQl1bnNpZ25lZCBjb3VudDsKKworCQkJCS8qIFJYX09OTFkgbW9kZSBuZWVkcyBkdW1teSBkYXRhIGluIFRYIHJlZyAqLworCQkJCWlmICh0LT50eF9idWYgPT0gTlVMTCkKKwkJCQkJc3BpMTAwa193cml0ZV9kYXRhKHNwaS0+bWFzdGVyLCA4LCAwKTsKKworCQkJCWNvdW50ID0gb21hcDFfc3BpMTAwa190eHJ4X3BpbyhzcGksIHQpOworCQkJCW0tPmFjdHVhbF9sZW5ndGggKz0gY291bnQ7CisKKwkJCQlpZiAoY291bnQgIT0gdC0+bGVuKSB7CisJCQkJCXN0YXR1cyA9IC1FSU87CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHQtPmRlbGF5X3VzZWNzKQorCQkJCXVkZWxheSh0LT5kZWxheV91c2Vjcyk7CisKKwkJCS8qIGlnbm9yZSB0aGUgImxlYXZlIGl0IG9uIGFmdGVyIGxhc3QgeGZlciIgaGludCAqLworCisJCQlpZiAodC0+Y3NfY2hhbmdlKSB7CisJCQkJb21hcDFfc3BpMTAwa19mb3JjZV9jcyhzcGkxMDBrLCAwKTsKKwkJCQljc19hY3RpdmUgPSAwOworCQkJfQorCQl9CisKKwkJLyogUmVzdG9yZSBkZWZhdWx0cyBpZiB0aGV5IHdlcmUgb3ZlcnJpZGVuICovCisJCWlmIChwYXJfb3ZlcnJpZGUpIHsKKwkJCXBhcl9vdmVycmlkZSA9IDA7CisJCQlzdGF0dXMgPSBvbWFwMV9zcGkxMDBrX3NldHVwX3RyYW5zZmVyKHNwaSwgTlVMTCk7CisJCX0KKworCQlpZiAoY3NfYWN0aXZlKQorCQkJb21hcDFfc3BpMTAwa19mb3JjZV9jcyhzcGkxMDBrLCAwKTsKKworCQltLT5zdGF0dXMgPSBzdGF0dXM7CisJCW0tPmNvbXBsZXRlKG0tPmNvbnRleHQpOworCisJCXNwaW5fbG9ja19pcnEoJnNwaTEwMGstPmxvY2spOworCX0KKworCWNsa19kaXNhYmxlKHNwaTEwMGstPmljayk7CisJY2xrX2Rpc2FibGUoc3BpMTAway0+ZmNrKTsKKwlzcGluX3VubG9ja19pcnEoJnNwaTEwMGstPmxvY2spOworCisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNwaSB0cmFuc2ZlciBmYWlsZWQgd2l0aCAlZFxuIiwgc3RhdHVzKTsKK30KKworc3RhdGljIGludCBvbWFwMV9zcGkxMDBrX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfbWVzc2FnZSAqbSkKK3sKKwlzdHJ1Y3Qgb21hcDFfc3BpMTAwayAgICAqc3BpMTAwazsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICBmbGFnczsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICAgICAqdDsKKworCW0tPmFjdHVhbF9sZW5ndGggPSAwOworCW0tPnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKKworCXNwaTEwMGsgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKworCS8qIERvbid0IGFjY2VwdCBuZXcgd29yayBpZiB3ZSdyZSBzaHV0dGluZyBkb3duICovCisJaWYgKHNwaTEwMGstPnN0YXRlID09IFNQSV9TSFVURE9XTikKKwkJcmV0dXJuIC1FU0hVVERPV047CisKKwkvKiByZWplY3QgaW52YWxpZCBtZXNzYWdlcyBhbmQgdHJhbnNmZXJzICovCisJaWYgKGxpc3RfZW1wdHkoJm0tPnRyYW5zZmVycykgfHwgIW0tPmNvbXBsZXRlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCQljb25zdCB2b2lkICAgICAgKnR4X2J1ZiA9IHQtPnR4X2J1ZjsKKwkJdm9pZCAgICAgICAgICAgICpyeF9idWYgPSB0LT5yeF9idWY7CisJCXVuc2lnbmVkICAgICAgICBsZW4gPSB0LT5sZW47CisKKwkJaWYgKHQtPnNwZWVkX2h6ID4gT01BUDFfU1BJMTAwS19NQVhfRlJFUQorCQkJCXx8IChsZW4gJiYgIShyeF9idWYgfHwgdHhfYnVmKSkKKwkJCQl8fCAodC0+Yml0c19wZXJfd29yZCAmJgorCQkJCQkoICB0LT5iaXRzX3Blcl93b3JkIDwgNAorCQkJCQl8fCB0LT5iaXRzX3Blcl93b3JkID4gMzIpKSkgeworCQkJZGV2X2RiZygmc3BpLT5kZXYsICJ0cmFuc2ZlcjogJWQgSHosICVkICVzJXMsICVkIGJwd1xuIiwKKwkJCQkJdC0+c3BlZWRfaHosCisJCQkJCWxlbiwKKwkJCQkJdHhfYnVmID8gInR4IiA6ICIiLAorCQkJCQlyeF9idWYgPyAicngiIDogIiIsCisJCQkJCXQtPmJpdHNfcGVyX3dvcmQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAodC0+c3BlZWRfaHogJiYgdC0+c3BlZWRfaHogPCBPTUFQMV9TUEkxMDBLX01BWF9GUkVRLygxPDwxNikpIHsKKwkJCWRldl9kYmcoJnNwaS0+ZGV2LCAiJWQgSHogbWF4IGV4Y2VlZHMgJWRcbiIsCisJCQkJCXQtPnNwZWVkX2h6LAorCQkJCQlPTUFQMV9TUEkxMDBLX01BWF9GUkVRLygxPDwxNikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZzcGkxMDBrLT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmbS0+cXVldWUsICZzcGkxMDBrLT5tc2dfcXVldWUpOworCXF1ZXVlX3dvcmsob21hcDFfc3BpMTAwa193cSwgJnNwaTEwMGstPndvcmspOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwaTEwMGstPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBvbWFwMV9zcGkxMDBrX3Jlc2V0KHN0cnVjdCBvbWFwMV9zcGkxMDBrICpzcGkxMDBrKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBvbWFwMV9zcGkxMDBrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgICAgICAgKm1hc3RlcjsKKwlzdHJ1Y3Qgb21hcDFfc3BpMTAwayAgICAqc3BpMTAwazsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAwOworCisJaWYgKCFwZGV2LT5pZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZiAqc3BpMTAwayk7CisJaWYgKG1hc3RlciA9PSBOVUxMKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIm1hc3RlciBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChwZGV2LT5pZCAhPSAtMSkKKwkgICAgICAgbWFzdGVyLT5idXNfbnVtID0gcGRldi0+aWQ7CisKKwltYXN0ZXItPnNldHVwID0gb21hcDFfc3BpMTAwa19zZXR1cDsKKwltYXN0ZXItPnRyYW5zZmVyID0gb21hcDFfc3BpMTAwa190cmFuc2ZlcjsKKwltYXN0ZXItPmNsZWFudXAgPSBOVUxMOworCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSAyOworCW1hc3Rlci0+bW9kZV9iaXRzID0gTU9ERUJJVFM7CisKKwlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgbWFzdGVyKTsKKworCXNwaTEwMGsgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJc3BpMTAway0+bWFzdGVyID0gbWFzdGVyOworCisJLyoKKwkgKiBUaGUgbWVtb3J5IHJlZ2lvbiBiYXNlIGFkZHJlc3MgaXMgdGFrZW4gYXMgdGhlIHBsYXRmb3JtX2RhdGEuCisJICogWW91IHNob3VsZCBhbGxvY2F0ZSB0aGlzIHdpdGggaW9yZW1hcCgpIGJlZm9yZSBpbml0aWFsaXppbmcKKwkgKiB0aGUgU1BJLgorCSAqLworCXNwaTEwMGstPmJhc2UgPSAodm9pZCBfX2lvbWVtICopIHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJSU5JVF9XT1JLKCZzcGkxMDBrLT53b3JrLCBvbWFwMV9zcGkxMDBrX3dvcmspOworCisJc3Bpbl9sb2NrX2luaXQoJnNwaTEwMGstPmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZzcGkxMDBrLT5tc2dfcXVldWUpOworCXNwaTEwMGstPmljayA9IGNsa19nZXQoJnBkZXYtPmRldiwgImljayIpOworCWlmIChJU19FUlIoc3BpMTAway0+aWNrKSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjYW4ndCBnZXQgc3BpMTAwa19pY2tcbiIpOworCQlzdGF0dXMgPSBQVFJfRVJSKHNwaTEwMGstPmljayk7CisJCWdvdG8gZXJyMTsKKwl9CisKKwlzcGkxMDBrLT5mY2sgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJmY2siKTsKKwlpZiAoSVNfRVJSKHNwaTEwMGstPmZjaykpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IHNwaTEwMGtfZmNrXG4iKTsKKwkJc3RhdHVzID0gUFRSX0VSUihzcGkxMDBrLT5mY2spOworCQlnb3RvIGVycjI7CisJfQorCisJaWYgKG9tYXAxX3NwaTEwMGtfcmVzZXQoc3BpMTAwaykgPCAwKQorCQlnb3RvIGVycjM7CisKKwlzdGF0dXMgPSBzcGlfcmVnaXN0ZXJfbWFzdGVyKG1hc3Rlcik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyMzsKKworCXNwaTEwMGstPnN0YXRlID0gU1BJX1JVTk5JTkc7CisKKwlyZXR1cm4gc3RhdHVzOworCitlcnIzOgorCWNsa19wdXQoc3BpMTAway0+ZmNrKTsKK2VycjI6CisJY2xrX3B1dChzcGkxMDBrLT5pY2spOworZXJyMToKKwlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IG9tYXAxX3NwaTEwMGtfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgICAgICAgKm1hc3RlcjsKKwlzdHJ1Y3Qgb21hcDFfc3BpMTAwayAgICAqc3BpMTAwazsKKwlzdHJ1Y3QgcmVzb3VyY2UgICAgICAgICAqcjsKKwl1bnNpZ25lZAkJbGltaXQgPSA1MDA7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJaW50CQkJc3RhdHVzID0gMDsKKworCW1hc3RlciA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlzcGkxMDBrID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwaTEwMGstPmxvY2ssIGZsYWdzKTsKKworCXNwaTEwMGstPnN0YXRlID0gU1BJX1NIVVRET1dOOworCXdoaWxlICghbGlzdF9lbXB0eSgmc3BpMTAway0+bXNnX3F1ZXVlKSAmJiBsaW1pdC0tKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwaTEwMGstPmxvY2ssIGZsYWdzKTsKKwkJbXNsZWVwKDEwKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNwaTEwMGstPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlpZiAoIWxpc3RfZW1wdHkoJnNwaTEwMGstPm1zZ19xdWV1ZSkpCisJCXN0YXR1cyA9IC1FQlVTWTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwaTEwMGstPmxvY2ssIGZsYWdzKTsKKworCWlmIChzdGF0dXMgIT0gMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCWNsa19wdXQoc3BpMTAway0+ZmNrKTsKKwljbGtfcHV0KHNwaTEwMGstPmljayk7CisKKwlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKworCXNwaV91bnJlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9tYXAxX3NwaTEwMGtfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCQk9ICJvbWFwMV9zcGkxMDBrIiwKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCX0sCisJLnJlbW92ZQkJPSBfX2V4aXRfcChvbWFwMV9zcGkxMDBrX3JlbW92ZSksCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXAxX3NwaTEwMGtfaW5pdCh2b2lkKQoreworCW9tYXAxX3NwaTEwMGtfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgKKwkJCW9tYXAxX3NwaTEwMGtfZHJpdmVyLmRyaXZlci5uYW1lKTsKKworCWlmIChvbWFwMV9zcGkxMDBrX3dxID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJm9tYXAxX3NwaTEwMGtfZHJpdmVyLCBvbWFwMV9zcGkxMDBrX3Byb2JlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG9tYXAxX3NwaTEwMGtfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZvbWFwMV9zcGkxMDBrX2RyaXZlcik7CisKKwlkZXN0cm95X3dvcmtxdWV1ZShvbWFwMV9zcGkxMDBrX3dxKTsKK30KKworbW9kdWxlX2luaXQob21hcDFfc3BpMTAwa19pbml0KTsKK21vZHVsZV9leGl0KG9tYXAxX3NwaTEwMGtfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiT01BUDd4eCBTUEkgMTAwayBjb250cm9sbGVyIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiRmFicmljZSBDcm9oYXMgPGZjcm9oYXNAZ21haWwuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfaW14LmMgYi9kcml2ZXJzL3NwaS9zcGlfaW14LmMKaW5kZXggODljMjJlZi4uMTg5M2YxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpX2lteC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9pbXguYwpAQCAtNDQsNiArNDQsOSBAQAogI2RlZmluZSBNWENfQ1NQSUlOVAkJMHgwYwogI2RlZmluZSBNWENfUkVTRVQJCTB4MWMKIAorI2RlZmluZSBNWDNfQ1NQSVNUQVQJCTB4MTQKKyNkZWZpbmUgTVgzX0NTUElTVEFUX1JSCQkoMSA8PCAzKQorCiAvKiBnZW5lcmljIGRlZmluZXMgdG8gYWJzdHJhY3QgZnJvbSB0aGUgZGlmZmVyZW50IHJlZ2lzdGVyIGxheW91dHMgKi8KICNkZWZpbmUgTVhDX0lOVF9SUgkoMSA8PCAwKSAvKiBSZWNlaXZlIGRhdGEgcmVhZHkgaW50ZXJydXB0ICovCiAjZGVmaW5lIE1YQ19JTlRfVEUJKDEgPDwgMSkgLyogVHJhbnNtaXQgRklGTyBlbXB0eSBpbnRlcnJ1cHQgKi8KQEAgLTIwNSw3ICsyMDgsNyBAQAogCiAJaWYgKGNwdV9pc19teDMxKCkpCiAJCXJlZyB8PSAoY29uZmlnLT5icHcgLSAxKSA8PCBNWDMxX0NTUElDVFJMX0JDX1NISUZUOwotCWVsc2UgaWYgKGNwdV9pc19teDM1KCkpIHsKKwllbHNlIGlmIChjcHVfaXNfbXgyNSgpIHx8IGNwdV9pc19teDM1KCkpIHsKIAkJcmVnIHw9IChjb25maWctPmJwdyAtIDEpIDw8IE1YMzVfQ1NQSUNUUkxfQkxfU0hJRlQ7CiAJCXJlZyB8PSBNWDMxX0NTUElDVFJMX1NTQ1RMOwogCX0KQEAgLTIxOSw3ICsyMjIsNyBAQAogCWlmIChjb25maWctPmNzIDwgMCkgewogCQlpZiAoY3B1X2lzX214MzEoKSkKIAkJCXJlZyB8PSAoY29uZmlnLT5jcyArIDMyKSA8PCBNWDMxX0NTUElDVFJMX0NTX1NISUZUOwotCQllbHNlIGlmIChjcHVfaXNfbXgzNSgpKQorCQllbHNlIGlmIChjcHVfaXNfbXgyNSgpIHx8IGNwdV9pc19teDM1KCkpCiAJCQlyZWcgfD0gKGNvbmZpZy0+Y3MgKyAzMikgPDwgTVgzNV9DU1BJQ1RSTF9DU19TSElGVDsKIAl9CiAKQEAgLTQ4MSw3ICs0ODQsNyBAQAogewogfQogCi1zdGF0aWMgaW50IF9faW5pdCBzcGlfaW14X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzcGlfaW14X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHNwaV9pbXhfbWFzdGVyICpteGNfcGxhdGZvcm1faW5mbzsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwpAQCAtNDg5LDcgKzQ5Miw3IEBACiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJaW50IGksIHJldDsKIAotCW14Y19wbGF0Zm9ybV9pbmZvID0gKHN0cnVjdCBzcGlfaW14X21hc3RlciAqKXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCW14Y19wbGF0Zm9ybV9pbmZvID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKIAlpZiAoIW14Y19wbGF0Zm9ybV9pbmZvKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGdldCB0aGUgcGxhdGZvcm0gZGF0YVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNTEzLDExICs1MTYsMTIgQEAKIAkJCWNvbnRpbnVlOwogCQlyZXQgPSBncGlvX3JlcXVlc3Qoc3BpX2lteC0+Y2hpcHNlbGVjdFtpXSwgRFJJVkVSX05BTUUpOwogCQlpZiAocmV0KSB7Ci0JCQlpLS07Ci0JCQl3aGlsZSAoaSA+IDApCisJCQl3aGlsZSAoaSA+IDApIHsKKwkJCQlpLS07CiAJCQkJaWYgKHNwaV9pbXgtPmNoaXBzZWxlY3RbaV0gPj0gMCkKLQkJCQkJZ3Bpb19mcmVlKHNwaV9pbXgtPmNoaXBzZWxlY3RbaS0tXSk7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBnZXQgY3MgZ3Bpb3MiKTsKKwkJCQkJZ3Bpb19mcmVlKHNwaV9pbXgtPmNoaXBzZWxlY3RbaV0pOworCQkJfQorCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGNzIGdwaW9zXG4iKTsKIAkJCWdvdG8gb3V0X21hc3Rlcl9wdXQ7CiAJCX0KIAl9CkBAIC01NTEsNyArNTU1LDcgQEAKIAl9CiAKIAlzcGlfaW14LT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwotCWlmICghc3BpX2lteC0+aXJxKSB7CisJaWYgKHNwaV9pbXgtPmlycSA8PSAwKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0X2lvdW5tYXA7CiAJfQpAQCAtNTYyLDcgKzU2Niw3IEBACiAJCWdvdG8gb3V0X2lvdW5tYXA7CiAJfQogCi0JaWYgKGNwdV9pc19teDMxKCkgfHwgY3B1X2lzX214MzUoKSkgeworCWlmIChjcHVfaXNfbXgyNSgpIHx8IGNwdV9pc19teDMxKCkgfHwgY3B1X2lzX214MzUoKSkgewogCQlzcGlfaW14LT5pbnRjdHJsID0gbXgzMV9pbnRjdHJsOwogCQlzcGlfaW14LT5jb25maWcgPSBteDMxX2NvbmZpZzsKIAkJc3BpX2lteC0+dHJpZ2dlciA9IG14MzFfdHJpZ2dlcjsKQEAgLTU5MCw5ICs1OTQsMTQgQEAKIAljbGtfZW5hYmxlKHNwaV9pbXgtPmNsayk7CiAJc3BpX2lteC0+c3BpX2NsayA9IGNsa19nZXRfcmF0ZShzcGlfaW14LT5jbGspOwogCi0JaWYgKCFjcHVfaXNfbXgzMSgpIHx8ICFjcHVfaXNfbXgzNSgpKQorCWlmIChjcHVfaXNfbXgxKCkgfHwgY3B1X2lzX214MjEoKSB8fCBjcHVfaXNfbXgyNygpKQogCQl3cml0ZWwoMSwgc3BpX2lteC0+YmFzZSArIE1YQ19SRVNFVCk7CiAKKwkvKiBkcmFpbiByZWNlaXZlIGJ1ZmZlciAqLworCWlmIChjcHVfaXNfbXgyNSgpIHx8IGNwdV9pc19teDMxKCkgfHwgY3B1X2lzX214MzUoKSkKKwkJd2hpbGUgKHJlYWRsKHNwaV9pbXgtPmJhc2UgKyBNWDNfQ1NQSVNUQVQpICYgTVgzX0NTUElTVEFUX1JSKQorCQkJcmVhZGwoc3BpX2lteC0+YmFzZSArIE1YQ19DU1BJUlhEQVRBKTsKKwogCXNwaV9pbXgtPmludGN0cmwoc3BpX2lteCwgMCk7CiAKIAlyZXQgPSBzcGlfYml0YmFuZ19zdGFydCgmc3BpX2lteC0+Yml0YmFuZyk7CkBAIC02MjUsNyArNjM0LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IF9fZXhpdCBzcGlfaW14X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2RldmV4aXQgc3BpX2lteF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IHJlc291cmNlICpyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwpAQCAtNjU5LDcgKzY2OCw3IEBACiAJCSAgIC5vd25lciA9IFRISVNfTU9EVUxFLAogCQkgICB9LAogCS5wcm9iZSA9IHNwaV9pbXhfcHJvYmUsCi0JLnJlbW92ZSA9IF9fZXhpdF9wKHNwaV9pbXhfcmVtb3ZlKSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aoc3BpX2lteF9yZW1vdmUpLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgc3BpX2lteF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfbXBjOHh4eC5jIGIvZHJpdmVycy9zcGkvc3BpX21wYzh4eHguYwppbmRleCAwZmQwZWM0Li5lOTM5MGQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGlfbXBjOHh4eC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9tcGM4eHh4LmMKQEAgLTUsNiArNSwxMCBAQAogICoKICAqIENvcHlyaWdodCAoQykgMjAwNiBQb2x5Y29tLCBJbmMuCiAgKgorICogQ1BNIFNQSSBhbmQgUUUgYnVmZmVyIGRlc2NyaXB0b3JzIG1vZGUgc3VwcG9ydDoKKyAqIENvcHlyaWdodCAoYykgMjAwOSAgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogQXV0aG9yOiBBbnRvbiBWb3JvbnRzb3YgPGF2b3JvbnRzb3ZAcnUubXZpc3RhLmNvbT4KKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQogICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCkBAIC0yNyw2ICszMSw5IEBACiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZnNsX2RldmljZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgpAQCAtMzQsOCArNDEsMTkgQEAKICNpbmNsdWRlIDxsaW51eC9vZl9zcGkuaD4KIAogI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CisjaW5jbHVkZSA8YXNtL2NwbS5oPgorI2luY2x1ZGUgPGFzbS9xZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAorLyogQ1BNMSBhbmQgQ1BNMiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiAqLworI2lmZGVmIENPTkZJR19DUE0xCisjaW5jbHVkZSA8YXNtL2NwbTEuaD4KKyNkZWZpbmUgQ1BNX1NQSV9DTUQgbWtfY3JfY21kKENQTV9DUl9DSF9TUEksIDApCisjZWxzZQorI2luY2x1ZGUgPGFzbS9jcG0yLmg+CisjZGVmaW5lIENQTV9TUElfQ01EIG1rX2NyX2NtZChDUE1fQ1JfU1BJX1BBR0UsIENQTV9DUl9TUElfU0JMT0NLLCAwLCAwKQorI2VuZGlmCisKIC8qIFNQSSBDb250cm9sbGVyIHJlZ2lzdGVycyAqLwogc3RydWN0IG1wYzh4eHhfc3BpX3JlZyB7CiAJdTggcmVzMVsweDIwXTsKQEAgLTQ3LDYgKzY1LDI4IEBACiAJX19iZTMyIHJlY2VpdmU7CiB9OwogCisvKiBTUEkgUGFyYW1ldGVyIFJBTSAqLworc3RydWN0IHNwaV9wcmFtIHsKKwlfX2JlMTYJcmJhc2U7CS8qIFJ4IEJ1ZmZlciBkZXNjcmlwdG9yIGJhc2UgYWRkcmVzcyAqLworCV9fYmUxNgl0YmFzZTsJLyogVHggQnVmZmVyIGRlc2NyaXB0b3IgYmFzZSBhZGRyZXNzICovCisJdTgJcmZjcjsJLyogUnggZnVuY3Rpb24gY29kZSAqLworCXU4CXRmY3I7CS8qIFR4IGZ1bmN0aW9uIGNvZGUgKi8KKwlfX2JlMTYJbXJibHI7CS8qIE1heCByZWNlaXZlIGJ1ZmZlciBsZW5ndGggKi8KKwlfX2JlMzIJcnN0YXRlOwkvKiBJbnRlcm5hbCAqLworCV9fYmUzMglyZHA7CS8qIEludGVybmFsICovCisJX19iZTE2CXJicHRyOwkvKiBJbnRlcm5hbCAqLworCV9fYmUxNglyYmM7CS8qIEludGVybmFsICovCisJX19iZTMyCXJ4dG1wOwkvKiBJbnRlcm5hbCAqLworCV9fYmUzMgl0c3RhdGU7CS8qIEludGVybmFsICovCisJX19iZTMyCXRkcDsJLyogSW50ZXJuYWwgKi8KKwlfX2JlMTYJdGJwdHI7CS8qIEludGVybmFsICovCisJX19iZTE2CXRiYzsJLyogSW50ZXJuYWwgKi8KKwlfX2JlMzIJdHh0bXA7CS8qIEludGVybmFsICovCisJX19iZTMyCXJlczsJLyogVHggdGVtcC4gKi8KKwlfX2JlMTYgIHJwYmFzZTsJLyogUmVsb2NhdGlvbiBwb2ludGVyIChDUE0xIG9ubHkpICovCisJX19iZTE2CXJlczE7CS8qIFJlc2VydmVkICovCit9OworCiAvKiBTUEkgQ29udHJvbGxlciBtb2RlIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCiAjZGVmaW5lCVNQTU9ERV9MT09QCQkoMSA8PCAzMCkKICNkZWZpbmUJU1BNT0RFX0NJX0lOQUNUSVZFSElHSAkoMSA8PCAyOSkKQEAgLTc1LDE0ICsxMTUsNDAgQEAKICNkZWZpbmUJU1BJTV9ORQkJMHgwMDAwMDIwMAkvKiBOb3QgZW1wdHkgKi8KICNkZWZpbmUJU1BJTV9ORgkJMHgwMDAwMDEwMAkvKiBOb3QgZnVsbCAqLwogCisjZGVmaW5lCVNQSUVfVFhCCTB4MDAwMDAyMDAJLyogTGFzdCBjaGFyIGlzIHdyaXR0ZW4gdG8gdHggZmlmbyAqLworI2RlZmluZQlTUElFX1JYQgkweDAwMDAwMTAwCS8qIExhc3QgY2hhciBpcyB3cml0dGVuIHRvIHJ4IGJ1ZiAqLworCisvKiBTUENPTSByZWdpc3RlciB2YWx1ZXMgKi8KKyNkZWZpbmUJU1BDT01fU1RSCSgxIDw8IDIzKQkvKiBTdGFydCB0cmFuc21pdCAqLworCisjZGVmaW5lCVNQSV9QUkFNX1NJWkUJMHgxMDAKKyNkZWZpbmUJU1BJX01SQkxSCSgodW5zaWduZWQgaW50KVBBR0VfU0laRSkKKwogLyogU1BJIENvbnRyb2xsZXIgZHJpdmVyJ3MgcHJpdmF0ZSBkYXRhLiAqLwogc3RydWN0IG1wYzh4eHhfc3BpIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc3RydWN0IG1wYzh4eHhfc3BpX3JlZyBfX2lvbWVtICpiYXNlOwogCiAJLyogcnggJiB0eCBidWZzIGZyb20gdGhlIHNwaV90cmFuc2ZlciAqLwogCWNvbnN0IHZvaWQgKnR4OwogCXZvaWQgKnJ4OwogCisJaW50IHN1YmJsb2NrOworCXN0cnVjdCBzcGlfcHJhbSBfX2lvbWVtICpwcmFtOworCXN0cnVjdCBjcG1fYnVmX2Rlc2MgX19pb21lbSAqdHhfYmQ7CisJc3RydWN0IGNwbV9idWZfZGVzYyBfX2lvbWVtICpyeF9iZDsKKworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXJfaW5fcHJvZ3Jlc3M7CisKKwkvKiBkbWEgYWRkcmVzc2VzIGZvciBDUE0gdHJhbnNmZXJzICovCisJZG1hX2FkZHJfdCB0eF9kbWE7CisJZG1hX2FkZHJfdCByeF9kbWE7CisJYm9vbCBtYXBfdHhfZG1hOworCWJvb2wgbWFwX3J4X2RtYTsKKworCWRtYV9hZGRyX3QgZG1hX2R1bW15X3R4OworCWRtYV9hZGRyX3QgZG1hX2R1bW15X3J4OworCiAJLyogZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBkaWZmZXJlbnQgc2l6ZWQgYnVmZmVycyAqLwogCXZvaWQgKCpnZXRfcngpICh1MzIgcnhfZGF0YSwgc3RydWN0IG1wYzh4eHhfc3BpICopOwogCXUzMigqZ2V0X3R4KSAoc3RydWN0IG1wYzh4eHhfc3BpICopOwpAQCAtOTYsNyArMTYyLDcgQEAKIAl1MzIgcnhfc2hpZnQ7CQkvKiBSWCBkYXRhIHJlZyBzaGlmdCB3aGVuIGluIHFlIG1vZGUgKi8KIAl1MzIgdHhfc2hpZnQ7CQkvKiBUWCBkYXRhIHJlZyBzaGlmdCB3aGVuIGluIHFlIG1vZGUgKi8KIAotCWJvb2wgcWVfbW9kZTsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAKIAlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd29ya3F1ZXVlOwogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwpAQCAtMTA3LDYgKzE3MywxMCBAQAogCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7CiB9OwogCitzdGF0aWMgdm9pZCAqbXBjOHh4eF9kdW1teV9yeDsKK3N0YXRpYyBERUZJTkVfTVVURVgobXBjOHh4eF9kdW1teV9yeF9sb2NrKTsKK3N0YXRpYyBpbnQgbXBjOHh4eF9kdW1teV9yeF9yZWZjbnQ7CisKIHN0cnVjdCBzcGlfbXBjOHh4eF9jcyB7CiAJLyogZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBkaWZmZXJlbnQgc2l6ZWQgYnVmZmVycyAqLwogCXZvaWQgKCpnZXRfcngpICh1MzIgcnhfZGF0YSwgc3RydWN0IG1wYzh4eHhfc3BpICopOwpAQCAtMTU1LDYgKzIyNSw0MiBAQAogTVBDODNYWF9TUElfVFhfQlVGKHUxNikKIE1QQzgzWFhfU1BJX1RYX0JVRih1MzIpCiAKK3N0YXRpYyB2b2lkIG1wYzh4eHhfc3BpX2NoYW5nZV9tb2RlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IG1wYzh4eHhfc3BpICptc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJc3RydWN0IHNwaV9tcGM4eHh4X2NzICpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKwlfX2JlMzIgX19pb21lbSAqbW9kZSA9ICZtc3BpLT5iYXNlLT5tb2RlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoY3MtPmh3X21vZGUgPT0gbXBjOHh4eF9zcGlfcmVhZF9yZWcobW9kZSkpCisJCXJldHVybjsKKworCS8qIFR1cm4gb2ZmIElSUXMgbG9jYWxseSB0byBtaW5pbWl6ZSB0aW1lIHRoYXQgU1BJIGlzIGRpc2FibGVkLiAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCS8qIFR1cm4gb2ZmIFNQSSB1bml0IHByaW9yIGNoYW5naW5nIG1vZGUgKi8KKwltcGM4eHh4X3NwaV93cml0ZV9yZWcobW9kZSwgY3MtPmh3X21vZGUgJiB+U1BNT0RFX0VOQUJMRSk7CisJbXBjOHh4eF9zcGlfd3JpdGVfcmVnKG1vZGUsIGNzLT5od19tb2RlKTsKKworCS8qIFdoZW4gaW4gQ1BNIG1vZGUsIHdlIG5lZWQgdG8gcmVpbml0IHR4IGFuZCByeC4gKi8KKwlpZiAobXNwaS0+ZmxhZ3MgJiBTUElfQ1BNX01PREUpIHsKKwkJaWYgKG1zcGktPmZsYWdzICYgU1BJX1FFKSB7CisJCQlxZV9pc3N1ZV9jbWQoUUVfSU5JVF9UWF9SWCwgbXNwaS0+c3ViYmxvY2ssCisJCQkJICAgICBRRV9DUl9QUk9UT0NPTF9VTlNQRUNJRklFRCwgMCk7CisJCX0gZWxzZSB7CisJCQljcG1fY29tbWFuZChDUE1fU1BJX0NNRCwgQ1BNX0NSX0lOSVRfVFJYKTsKKwkJCWlmIChtc3BpLT5mbGFncyAmIFNQSV9DUE0xKSB7CisJCQkJb3V0X2JlMTYoJm1zcGktPnByYW0tPnJicHRyLAorCQkJCQkgaW5fYmUxNigmbXNwaS0+cHJhbS0+cmJhc2UpKTsKKwkJCQlvdXRfYmUxNigmbXNwaS0+cHJhbS0+dGJwdHIsCisJCQkJCSBpbl9iZTE2KCZtc3BpLT5wcmFtLT50YmFzZSkpOworCQkJfQorCQl9CisJfQorCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCiBzdGF0aWMgdm9pZCBtcGM4eHh4X3NwaV9jaGlwc2VsZWN0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCB2YWx1ZSkKIHsKIAlzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1wYzh4eHhfc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CkBAIC0xNjgsMjcgKzI3NCwxMyBAQAogCX0KIAogCWlmICh2YWx1ZSA9PSBCSVRCQU5HX0NTX0FDVElWRSkgewotCQl1MzIgcmVndmFsID0gbXBjOHh4eF9zcGlfcmVhZF9yZWcoJm1wYzh4eHhfc3BpLT5iYXNlLT5tb2RlKTsKLQogCQltcGM4eHh4X3NwaS0+cnhfc2hpZnQgPSBjcy0+cnhfc2hpZnQ7CiAJCW1wYzh4eHhfc3BpLT50eF9zaGlmdCA9IGNzLT50eF9zaGlmdDsKIAkJbXBjOHh4eF9zcGktPmdldF9yeCA9IGNzLT5nZXRfcng7CiAJCW1wYzh4eHhfc3BpLT5nZXRfdHggPSBjcy0+Z2V0X3R4OwogCi0JCWlmIChjcy0+aHdfbW9kZSAhPSByZWd2YWwpIHsKLQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JCQlfX2JlMzIgX19pb21lbSAqbW9kZSA9ICZtcGM4eHh4X3NwaS0+YmFzZS0+bW9kZTsKKwkJbXBjOHh4eF9zcGlfY2hhbmdlX21vZGUoc3BpKTsKIAotCQkJcmVndmFsID0gY3MtPmh3X21vZGU7Ci0JCQkvKiBUdXJuIG9mZiBJUlFzIGxvY2FsbHkgdG8gbWluaW1pemUgdGltZSB0aGF0Ci0JCQkgKiBTUEkgaXMgZGlzYWJsZWQKLQkJCSAqLwotCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQkJLyogVHVybiBvZmYgU1BJIHVuaXQgcHJpb3IgY2hhbmdpbmcgbW9kZSAqLwotCQkJbXBjOHh4eF9zcGlfd3JpdGVfcmVnKG1vZGUsIHJlZ3ZhbCAmIH5TUE1PREVfRU5BQkxFKTsKLQkJCW1wYzh4eHhfc3BpX3dyaXRlX3JlZyhtb2RlLCByZWd2YWwpOwotCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQl9CiAJCWlmIChwZGF0YS0+Y3NfY29udHJvbCkKIAkJCXBkYXRhLT5jc19jb250cm9sKHNwaSwgcG9sKTsKIAl9CkBAIC0xOTgsNyArMjkwLDYgQEAKIGludCBtcGM4eHh4X3NwaV9zZXR1cF90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQogewogCXN0cnVjdCBtcGM4eHh4X3NwaSAqbXBjOHh4eF9zcGk7Ci0JdTMyIHJlZ3ZhbDsKIAl1OCBiaXRzX3Blcl93b3JkLCBwbTsKIAl1MzIgaHo7CiAJc3RydWN0IHNwaV9tcGM4eHh4X2NzCSpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKQEAgLTIzMCwxNCArMzIxLDE0IEBACiAJaWYgKGJpdHNfcGVyX3dvcmQgPD0gOCkgewogCQljcy0+Z2V0X3J4ID0gbXBjOHh4eF9zcGlfcnhfYnVmX3U4OwogCQljcy0+Z2V0X3R4ID0gbXBjOHh4eF9zcGlfdHhfYnVmX3U4OwotCQlpZiAobXBjOHh4eF9zcGktPnFlX21vZGUpIHsKKwkJaWYgKG1wYzh4eHhfc3BpLT5mbGFncyAmIFNQSV9RRV9DUFVfTU9ERSkgewogCQkJY3MtPnJ4X3NoaWZ0ID0gMTY7CiAJCQljcy0+dHhfc2hpZnQgPSAyNDsKIAkJfQogCX0gZWxzZSBpZiAoYml0c19wZXJfd29yZCA8PSAxNikgewogCQljcy0+Z2V0X3J4ID0gbXBjOHh4eF9zcGlfcnhfYnVmX3UxNjsKIAkJY3MtPmdldF90eCA9IG1wYzh4eHhfc3BpX3R4X2J1Zl91MTY7Ci0JCWlmIChtcGM4eHh4X3NwaS0+cWVfbW9kZSkgeworCQlpZiAobXBjOHh4eF9zcGktPmZsYWdzICYgU1BJX1FFX0NQVV9NT0RFKSB7CiAJCQljcy0+cnhfc2hpZnQgPSAxNjsKIAkJCWNzLT50eF9zaGlmdCA9IDE2OwogCQl9CkBAIC0yNDcsNyArMzM4LDggQEAKIAl9IGVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAobXBjOHh4eF9zcGktPnFlX21vZGUgJiYgc3BpLT5tb2RlICYgU1BJX0xTQl9GSVJTVCkgeworCWlmIChtcGM4eHh4X3NwaS0+ZmxhZ3MgJiBTUElfUUVfQ1BVX01PREUgJiYKKwkJCXNwaS0+bW9kZSAmIFNQSV9MU0JfRklSU1QpIHsKIAkJY3MtPnR4X3NoaWZ0ID0gMDsKIAkJaWYgKGJpdHNfcGVyX3dvcmQgPD0gOCkKIAkJCWNzLT5yeF9zaGlmdCA9IDg7CkBAIC0yODYsMzcgKzM3OCwxMzggQEAKIAkJcG0tLTsKIAogCWNzLT5od19tb2RlIHw9IFNQTU9ERV9QTShwbSk7Ci0JcmVndmFsID0gIG1wYzh4eHhfc3BpX3JlYWRfcmVnKCZtcGM4eHh4X3NwaS0+YmFzZS0+bW9kZSk7Ci0JaWYgKGNzLT5od19tb2RlICE9IHJlZ3ZhbCkgewotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQlfX2JlMzIgX19pb21lbSAqbW9kZSA9ICZtcGM4eHh4X3NwaS0+YmFzZS0+bW9kZTsKIAotCQlyZWd2YWwgPSBjcy0+aHdfbW9kZTsKLQkJLyogVHVybiBvZmYgSVJRcyBsb2NhbGx5IHRvIG1pbmltaXplIHRpbWUKLQkJICogdGhhdCBTUEkgaXMgZGlzYWJsZWQKLQkJICovCi0JCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJLyogVHVybiBvZmYgU1BJIHVuaXQgcHJpb3IgY2hhbmdpbmcgbW9kZSAqLwotCQltcGM4eHh4X3NwaV93cml0ZV9yZWcobW9kZSwgcmVndmFsICYgflNQTU9ERV9FTkFCTEUpOwotCQltcGM4eHh4X3NwaV93cml0ZV9yZWcobW9kZSwgcmVndmFsKTsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCX0KKwltcGM4eHh4X3NwaV9jaGFuZ2VfbW9kZShzcGkpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1wYzh4eHhfc3BpX2J1ZnMoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKK3N0YXRpYyB2b2lkIG1wYzh4eHhfc3BpX2NwbV9idWZzX3N0YXJ0KHN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSkKIHsKLQlzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1wYzh4eHhfc3BpOwotCXUzMiB3b3JkLCBsZW4sIGJpdHNfcGVyX3dvcmQ7CisJc3RydWN0IGNwbV9idWZfZGVzYyBfX2lvbWVtICp0eF9iZCA9IG1zcGktPnR4X2JkOworCXN0cnVjdCBjcG1fYnVmX2Rlc2MgX19pb21lbSAqcnhfYmQgPSBtc3BpLT5yeF9iZDsKKwl1bnNpZ25lZCBpbnQgeGZlcl9sZW4gPSBtaW4obXNwaS0+Y291bnQsIFNQSV9NUkJMUik7CisJdW5zaWduZWQgaW50IHhmZXJfb2ZzOwogCi0JbXBjOHh4eF9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwl4ZmVyX29mcyA9IG1zcGktPnhmZXJfaW5fcHJvZ3Jlc3MtPmxlbiAtIG1zcGktPmNvdW50OwogCi0JbXBjOHh4eF9zcGktPnR4ID0gdC0+dHhfYnVmOwotCW1wYzh4eHhfc3BpLT5yeCA9IHQtPnJ4X2J1ZjsKKwlvdXRfYmUzMigmcnhfYmQtPmNiZF9idWZhZGRyLCBtc3BpLT5yeF9kbWEgKyB4ZmVyX29mcyk7CisJb3V0X2JlMTYoJnJ4X2JkLT5jYmRfZGF0bGVuLCAwKTsKKwlvdXRfYmUxNigmcnhfYmQtPmNiZF9zYywgQkRfU0NfRU1QVFkgfCBCRF9TQ19JTlRSUFQgfCBCRF9TQ19XUkFQKTsKKworCW91dF9iZTMyKCZ0eF9iZC0+Y2JkX2J1ZmFkZHIsIG1zcGktPnR4X2RtYSArIHhmZXJfb2ZzKTsKKwlvdXRfYmUxNigmdHhfYmQtPmNiZF9kYXRsZW4sIHhmZXJfbGVuKTsKKwlvdXRfYmUxNigmdHhfYmQtPmNiZF9zYywgQkRfU0NfUkVBRFkgfCBCRF9TQ19JTlRSUFQgfCBCRF9TQ19XUkFQIHwKKwkJCQkgQkRfU0NfTEFTVCk7CisKKwkvKiBzdGFydCB0cmFuc2ZlciAqLworCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmbXNwaS0+YmFzZS0+Y29tbWFuZCwgU1BDT01fU1RSKTsKK30KKworc3RhdGljIGludCBtcGM4eHh4X3NwaV9jcG1fYnVmcyhzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1zcGksCisJCQkJc3RydWN0IHNwaV90cmFuc2ZlciAqdCwgYm9vbCBpc19kbWFfbWFwcGVkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IG1zcGktPmRldjsKKworCWlmIChpc19kbWFfbWFwcGVkKSB7CisJCW1zcGktPm1hcF90eF9kbWEgPSAwOworCQltc3BpLT5tYXBfcnhfZG1hID0gMDsKKwl9IGVsc2UgeworCQltc3BpLT5tYXBfdHhfZG1hID0gMTsKKwkJbXNwaS0+bWFwX3J4X2RtYSA9IDE7CisJfQorCisJaWYgKCF0LT50eF9idWYpIHsKKwkJbXNwaS0+dHhfZG1hID0gbXNwaS0+ZG1hX2R1bW15X3R4OworCQltc3BpLT5tYXBfdHhfZG1hID0gMDsKKwl9CisKKwlpZiAoIXQtPnJ4X2J1ZikgeworCQltc3BpLT5yeF9kbWEgPSBtc3BpLT5kbWFfZHVtbXlfcng7CisJCW1zcGktPm1hcF9yeF9kbWEgPSAwOworCX0KKworCWlmIChtc3BpLT5tYXBfdHhfZG1hKSB7CisJCXZvaWQgKm5vbmNvbnN0X3R4ID0gKHZvaWQgKiltc3BpLT50eDsgLyogc2h1dCB1cCBnY2MgKi8KKworCQltc3BpLT50eF9kbWEgPSBkbWFfbWFwX3NpbmdsZShkZXYsIG5vbmNvbnN0X3R4LCB0LT5sZW4sCisJCQkJCSAgICAgIERNQV9UT19ERVZJQ0UpOworCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBtc3BpLT50eF9kbWEpKSB7CisJCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byBtYXAgdHggZG1hXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfSBlbHNlIHsKKwkJbXNwaS0+dHhfZG1hID0gdC0+dHhfZG1hOworCX0KKworCWlmIChtc3BpLT5tYXBfcnhfZG1hKSB7CisJCW1zcGktPnJ4X2RtYSA9IGRtYV9tYXBfc2luZ2xlKGRldiwgbXNwaS0+cngsIHQtPmxlbiwKKwkJCQkJICAgICAgRE1BX0ZST01fREVWSUNFKTsKKwkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgbXNwaS0+cnhfZG1hKSkgeworCQkJZGV2X2VycihkZXYsICJ1bmFibGUgdG8gbWFwIHJ4IGRtYVxuIik7CisJCQlnb3RvIGVycl9yeF9kbWE7CisJCX0KKwl9IGVsc2UgeworCQltc3BpLT5yeF9kbWEgPSB0LT5yeF9kbWE7CisJfQorCisJLyogZW5hYmxlIHJ4IGludHMgKi8KKwltcGM4eHh4X3NwaV93cml0ZV9yZWcoJm1zcGktPmJhc2UtPm1hc2ssIFNQSUVfUlhCKTsKKworCW1zcGktPnhmZXJfaW5fcHJvZ3Jlc3MgPSB0OworCW1zcGktPmNvdW50ID0gdC0+bGVuOworCisJLyogc3RhcnQgQ1BNIHRyYW5zZmVycyAqLworCW1wYzh4eHhfc3BpX2NwbV9idWZzX3N0YXJ0KG1zcGkpOworCisJcmV0dXJuIDA7CisKK2Vycl9yeF9kbWE6CisJaWYgKG1zcGktPm1hcF90eF9kbWEpCisJCWRtYV91bm1hcF9zaW5nbGUoZGV2LCBtc3BpLT50eF9kbWEsIHQtPmxlbiwgRE1BX1RPX0RFVklDRSk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIG1wYzh4eHhfc3BpX2NwbV9idWZzX2NvbXBsZXRlKHN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBtc3BpLT5kZXY7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqdCA9IG1zcGktPnhmZXJfaW5fcHJvZ3Jlc3M7CisKKwlpZiAobXNwaS0+bWFwX3R4X2RtYSkKKwkJZG1hX3VubWFwX3NpbmdsZShkZXYsIG1zcGktPnR4X2RtYSwgdC0+bGVuLCBETUFfVE9fREVWSUNFKTsKKwlpZiAobXNwaS0+bWFwX3R4X2RtYSkKKwkJZG1hX3VubWFwX3NpbmdsZShkZXYsIG1zcGktPnJ4X2RtYSwgdC0+bGVuLCBETUFfRlJPTV9ERVZJQ0UpOworCW1zcGktPnhmZXJfaW5fcHJvZ3Jlc3MgPSBOVUxMOworfQorCitzdGF0aWMgaW50IG1wYzh4eHhfc3BpX2NwdV9idWZzKHN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSwKKwkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0LCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXUzMiB3b3JkOworCisJbXNwaS0+Y291bnQgPSBsZW47CisKKwkvKiBlbmFibGUgcnggaW50cyAqLworCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmbXNwaS0+YmFzZS0+bWFzaywgU1BJTV9ORSk7CisKKwkvKiB0cmFuc21pdCB3b3JkICovCisJd29yZCA9IG1zcGktPmdldF90eChtc3BpKTsKKwltcGM4eHh4X3NwaV93cml0ZV9yZWcoJm1zcGktPmJhc2UtPnRyYW5zbWl0LCB3b3JkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1wYzh4eHhfc3BpX2J1ZnMoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqdCwKKwkJCSAgICBib29sIGlzX2RtYV9tYXBwZWQpCit7CisJc3RydWN0IG1wYzh4eHhfc3BpICptcGM4eHh4X3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCXVuc2lnbmVkIGludCBsZW4gPSB0LT5sZW47CisJdTggYml0c19wZXJfd29yZDsKKwlpbnQgcmV0OworCiAJYml0c19wZXJfd29yZCA9IHNwaS0+Yml0c19wZXJfd29yZDsKIAlpZiAodC0+Yml0c19wZXJfd29yZCkKIAkJYml0c19wZXJfd29yZCA9IHQtPmJpdHNfcGVyX3dvcmQ7Ci0JbGVuID0gdC0+bGVuOworCiAJaWYgKGJpdHNfcGVyX3dvcmQgPiA4KSB7CiAJCS8qIGludmFsaWQgbGVuZ3RoPyAqLwogCQlpZiAobGVuICYgMSkKQEAgLTMyOSwyMiArNTIyLDI3IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJbGVuIC89IDI7CiAJfQotCW1wYzh4eHhfc3BpLT5jb3VudCA9IGxlbjsKKworCW1wYzh4eHhfc3BpLT50eCA9IHQtPnR4X2J1ZjsKKwltcGM4eHh4X3NwaS0+cnggPSB0LT5yeF9idWY7CiAKIAlJTklUX0NPTVBMRVRJT04obXBjOHh4eF9zcGktPmRvbmUpOwogCi0JLyogZW5hYmxlIHJ4IGludHMgKi8KLQltcGM4eHh4X3NwaV93cml0ZV9yZWcoJm1wYzh4eHhfc3BpLT5iYXNlLT5tYXNrLCBTUElNX05FKTsKLQotCS8qIHRyYW5zbWl0IHdvcmQgKi8KLQl3b3JkID0gbXBjOHh4eF9zcGktPmdldF90eChtcGM4eHh4X3NwaSk7Ci0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZtcGM4eHh4X3NwaS0+YmFzZS0+dHJhbnNtaXQsIHdvcmQpOworCWlmIChtcGM4eHh4X3NwaS0+ZmxhZ3MgJiBTUElfQ1BNX01PREUpCisJCXJldCA9IG1wYzh4eHhfc3BpX2NwbV9idWZzKG1wYzh4eHhfc3BpLCB0LCBpc19kbWFfbWFwcGVkKTsKKwllbHNlCisJCXJldCA9IG1wYzh4eHhfc3BpX2NwdV9idWZzKG1wYzh4eHhfc3BpLCB0LCBsZW4pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZtcGM4eHh4X3NwaS0+ZG9uZSk7CiAKIAkvKiBkaXNhYmxlIHJ4IGludHMgKi8KIAltcGM4eHh4X3NwaV93cml0ZV9yZWcoJm1wYzh4eHhfc3BpLT5iYXNlLT5tYXNrLCAwKTsKIAorCWlmIChtcGM4eHh4X3NwaS0+ZmxhZ3MgJiBTUElfQ1BNX01PREUpCisJCW1wYzh4eHhfc3BpX2NwbV9idWZzX2NvbXBsZXRlKG1wYzh4eHhfc3BpKTsKKwogCXJldHVybiBtcGM4eHh4X3NwaS0+Y291bnQ7CiB9CiAKQEAgLTM3NSw3ICs1NzMsNyBAQAogCQl9CiAJCWNzX2NoYW5nZSA9IHQtPmNzX2NoYW5nZTsKIAkJaWYgKHQtPmxlbikKLQkJCXN0YXR1cyA9IG1wYzh4eHhfc3BpX2J1ZnMoc3BpLCB0KTsKKwkJCXN0YXR1cyA9IG1wYzh4eHhfc3BpX2J1ZnMoc3BpLCB0LCBtLT5pc19kbWFfbWFwcGVkKTsKIAkJaWYgKHN0YXR1cykgewogCQkJc3RhdHVzID0gLUVNU0dTSVpFOwogCQkJYnJlYWs7CkBAIC00NjQsNDUgKzY2Miw4MCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QgbXBjOHh4eF9zcGlfaXJxKHMzMiBpcnEsIHZvaWQgKmNvbnRleHRfZGF0YSkKK3N0YXRpYyB2b2lkIG1wYzh4eHhfc3BpX2NwbV9pcnEoc3RydWN0IG1wYzh4eHhfc3BpICptc3BpLCB1MzIgZXZlbnRzKQogewotCXN0cnVjdCBtcGM4eHh4X3NwaSAqbXBjOHh4eF9zcGkgPSBjb250ZXh0X2RhdGE7Ci0JdTMyIGV2ZW50OwotCWlycXJldHVybl90IHJldCA9IElSUV9OT05FOworCXUxNiBsZW47CiAKLQkvKiBHZXQgaW50ZXJydXB0IGV2ZW50cyh0eC9yeCkgKi8KLQlldmVudCA9IG1wYzh4eHhfc3BpX3JlYWRfcmVnKCZtcGM4eHh4X3NwaS0+YmFzZS0+ZXZlbnQpOworCWRldl9kYmcobXNwaS0+ZGV2LCAiJXM6IGJkIGRhdGxlbiAlZCwgY291bnQgJWRcbiIsIF9fZnVuY19fLAorCQlpbl9iZTE2KCZtc3BpLT5yeF9iZC0+Y2JkX2RhdGxlbiksIG1zcGktPmNvdW50KTsKIAotCS8qIFdlIG5lZWQgaGFuZGxlIFJYIGZpcnN0ICovCi0JaWYgKGV2ZW50ICYgU1BJRV9ORSkgewotCQl1MzIgcnhfZGF0YSA9IG1wYzh4eHhfc3BpX3JlYWRfcmVnKCZtcGM4eHh4X3NwaS0+YmFzZS0+cmVjZWl2ZSk7Ci0KLQkJaWYgKG1wYzh4eHhfc3BpLT5yeCkKLQkJCW1wYzh4eHhfc3BpLT5nZXRfcngocnhfZGF0YSwgbXBjOHh4eF9zcGkpOwotCi0JCXJldCA9IElSUV9IQU5ETEVEOwotCX0KLQotCWlmICgoZXZlbnQgJiBTUElFX05GKSA9PSAwKQotCQkvKiBzcGluIHVudGlsIFRYIGlzIGRvbmUgKi8KLQkJd2hpbGUgKCgoZXZlbnQgPQotCQkJIG1wYzh4eHhfc3BpX3JlYWRfcmVnKCZtcGM4eHh4X3NwaS0+YmFzZS0+ZXZlbnQpKSAmCi0JCQkJCQlTUElFX05GKSA9PSAwKQotCQkJY3B1X3JlbGF4KCk7Ci0KLQltcGM4eHh4X3NwaS0+Y291bnQgLT0gMTsKLQlpZiAobXBjOHh4eF9zcGktPmNvdW50KSB7Ci0JCXUzMiB3b3JkID0gbXBjOHh4eF9zcGktPmdldF90eChtcGM4eHh4X3NwaSk7Ci0JCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmbXBjOHh4eF9zcGktPmJhc2UtPnRyYW5zbWl0LCB3b3JkKTsKLQl9IGVsc2UgewotCQljb21wbGV0ZSgmbXBjOHh4eF9zcGktPmRvbmUpOworCWxlbiA9IGluX2JlMTYoJm1zcGktPnJ4X2JkLT5jYmRfZGF0bGVuKTsKKwlpZiAobGVuID4gbXNwaS0+Y291bnQpIHsKKwkJV0FSTl9PTigxKTsKKwkJbGVuID0gbXNwaS0+Y291bnQ7CiAJfQogCiAJLyogQ2xlYXIgdGhlIGV2ZW50cyAqLwotCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmbXBjOHh4eF9zcGktPmJhc2UtPmV2ZW50LCBldmVudCk7CisJbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZtc3BpLT5iYXNlLT5ldmVudCwgZXZlbnRzKTsKKworCW1zcGktPmNvdW50IC09IGxlbjsKKwlpZiAobXNwaS0+Y291bnQpCisJCW1wYzh4eHhfc3BpX2NwbV9idWZzX3N0YXJ0KG1zcGkpOworCWVsc2UKKwkJY29tcGxldGUoJm1zcGktPmRvbmUpOworfQorCitzdGF0aWMgdm9pZCBtcGM4eHh4X3NwaV9jcHVfaXJxKHN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSwgdTMyIGV2ZW50cykKK3sKKwkvKiBXZSBuZWVkIGhhbmRsZSBSWCBmaXJzdCAqLworCWlmIChldmVudHMgJiBTUElFX05FKSB7CisJCXUzMiByeF9kYXRhID0gbXBjOHh4eF9zcGlfcmVhZF9yZWcoJm1zcGktPmJhc2UtPnJlY2VpdmUpOworCisJCWlmIChtc3BpLT5yeCkKKwkJCW1zcGktPmdldF9yeChyeF9kYXRhLCBtc3BpKTsKKwl9CisKKwlpZiAoKGV2ZW50cyAmIFNQSUVfTkYpID09IDApCisJCS8qIHNwaW4gdW50aWwgVFggaXMgZG9uZSAqLworCQl3aGlsZSAoKChldmVudHMgPQorCQkJbXBjOHh4eF9zcGlfcmVhZF9yZWcoJm1zcGktPmJhc2UtPmV2ZW50KSkgJgorCQkJCQkJU1BJRV9ORikgPT0gMCkKKwkJCWNwdV9yZWxheCgpOworCisJLyogQ2xlYXIgdGhlIGV2ZW50cyAqLworCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmbXNwaS0+YmFzZS0+ZXZlbnQsIGV2ZW50cyk7CisKKwltc3BpLT5jb3VudCAtPSAxOworCWlmIChtc3BpLT5jb3VudCkgeworCQl1MzIgd29yZCA9IG1zcGktPmdldF90eChtc3BpKTsKKworCQltcGM4eHh4X3NwaV93cml0ZV9yZWcoJm1zcGktPmJhc2UtPnRyYW5zbWl0LCB3b3JkKTsKKwl9IGVsc2UgeworCQljb21wbGV0ZSgmbXNwaS0+ZG9uZSk7CisJfQorfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbXBjOHh4eF9zcGlfaXJxKHMzMiBpcnEsIHZvaWQgKmNvbnRleHRfZGF0YSkKK3sKKwlzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1zcGkgPSBjb250ZXh0X2RhdGE7CisJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7CisJdTMyIGV2ZW50czsKKworCS8qIEdldCBpbnRlcnJ1cHQgZXZlbnRzKHR4L3J4KSAqLworCWV2ZW50cyA9IG1wYzh4eHhfc3BpX3JlYWRfcmVnKCZtc3BpLT5iYXNlLT5ldmVudCk7CisJaWYgKGV2ZW50cykKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisKKwlkZXZfZGJnKG1zcGktPmRldiwgIiVzOiBldmVudHMgJXhcbiIsIF9fZnVuY19fLCBldmVudHMpOworCisJaWYgKG1zcGktPmZsYWdzICYgU1BJX0NQTV9NT0RFKQorCQltcGM4eHh4X3NwaV9jcG1faXJxKG1zcGksIGV2ZW50cyk7CisJZWxzZQorCQltcGM4eHh4X3NwaV9jcHVfaXJxKG1zcGksIGV2ZW50cyk7CiAKIAlyZXR1cm4gcmV0OwogfQorCiBzdGF0aWMgaW50IG1wYzh4eHhfc3BpX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCiAJCQkJc3RydWN0IHNwaV9tZXNzYWdlICptKQogewpAQCAtNTI2LDYgKzc1OSwyMTUgQEAKIAlrZnJlZShzcGktPmNvbnRyb2xsZXJfc3RhdGUpOwogfQogCitzdGF0aWMgdm9pZCAqbXBjOHh4eF9zcGlfYWxsb2NfZHVtbXlfcngodm9pZCkKK3sKKwltdXRleF9sb2NrKCZtcGM4eHh4X2R1bW15X3J4X2xvY2spOworCisJaWYgKCFtcGM4eHh4X2R1bW15X3J4KQorCQltcGM4eHh4X2R1bW15X3J4ID0ga21hbGxvYyhTUElfTVJCTFIsIEdGUF9LRVJORUwpOworCWlmIChtcGM4eHh4X2R1bW15X3J4KQorCQltcGM4eHh4X2R1bW15X3J4X3JlZmNudCsrOworCisJbXV0ZXhfdW5sb2NrKCZtcGM4eHh4X2R1bW15X3J4X2xvY2spOworCisJcmV0dXJuIG1wYzh4eHhfZHVtbXlfcng7Cit9CisKK3N0YXRpYyB2b2lkIG1wYzh4eHhfc3BpX2ZyZWVfZHVtbXlfcngodm9pZCkKK3sKKwltdXRleF9sb2NrKCZtcGM4eHh4X2R1bW15X3J4X2xvY2spOworCisJc3dpdGNoIChtcGM4eHh4X2R1bW15X3J4X3JlZmNudCkgeworCWNhc2UgMDoKKwkJV0FSTl9PTigxKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlrZnJlZShtcGM4eHh4X2R1bW15X3J4KTsKKwkJbXBjOHh4eF9kdW1teV9yeCA9IE5VTEw7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWRlZmF1bHQ6CisJCW1wYzh4eHhfZHVtbXlfcnhfcmVmY250LS07CisJCWJyZWFrOworCX0KKworCW11dGV4X3VubG9jaygmbXBjOHh4eF9kdW1teV9yeF9sb2NrKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbXBjOHh4eF9zcGlfY3BtX2dldF9wcmFtKHN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBtc3BpLT5kZXY7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldl9hcmNoZGF0YV9nZXRfbm9kZSgmZGV2LT5hcmNoZGF0YSk7CisJY29uc3QgdTMyICppcHJvcDsKKwlpbnQgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHNwaV9iYXNlX29mczsKKwl1bnNpZ25lZCBsb25nIHByYW1fb2ZzID0gLUVOT01FTTsKKworCS8qIENhbid0IHVzZSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKCksIFFFIG11cmFtIGlzbid0IGF0IDAuICovCisJaXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJyZWciLCAmc2l6ZSk7CisKKwkvKiBRRSB3aXRoIGEgZml4ZWQgcHJhbSBsb2NhdGlvbj8gKi8KKwlpZiAobXNwaS0+ZmxhZ3MgJiBTUElfUUUgJiYgaXByb3AgJiYgc2l6ZSA9PSBzaXplb2YoKmlwcm9wKSAqIDQpCisJCXJldHVybiBjcG1fbXVyYW1fYWxsb2NfZml4ZWQoaXByb3BbMl0sIFNQSV9QUkFNX1NJWkUpOworCisJLyogUUUgYnV0IHdpdGggYSBkeW5hbWljIHByYW0gbG9jYXRpb24/ICovCisJaWYgKG1zcGktPmZsYWdzICYgU1BJX1FFKSB7CisJCXByYW1fb2ZzID0gY3BtX211cmFtX2FsbG9jKFNQSV9QUkFNX1NJWkUsIDY0KTsKKwkJcWVfaXNzdWVfY21kKFFFX0FTU0lHTl9QQUdFX1RPX0RFVklDRSwgbXNwaS0+c3ViYmxvY2ssCisJCQkJUUVfQ1JfUFJPVE9DT0xfVU5TUEVDSUZJRUQsIHByYW1fb2ZzKTsKKwkJcmV0dXJuIHByYW1fb2ZzOworCX0KKworCS8qIENQTTEgYW5kIENQTTIgcHJhbSBtdXN0IGJlIGF0IGEgZml4ZWQgYWRkci4gKi8KKwlpZiAoIWlwcm9wIHx8IHNpemUgIT0gc2l6ZW9mKCppcHJvcCkgKiA0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaV9iYXNlX29mcyA9IGNwbV9tdXJhbV9hbGxvY19maXhlZChpcHJvcFsyXSwgMik7CisJaWYgKElTX0VSUl9WQUxVRShzcGlfYmFzZV9vZnMpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChtc3BpLT5mbGFncyAmIFNQSV9DUE0yKSB7CisJCXByYW1fb2ZzID0gY3BtX211cmFtX2FsbG9jKFNQSV9QUkFNX1NJWkUsIDY0KTsKKwkJaWYgKCFJU19FUlJfVkFMVUUocHJhbV9vZnMpKSB7CisJCQl1MTYgX19pb21lbSAqc3BpX2Jhc2UgPSBjcG1fbXVyYW1fYWRkcihzcGlfYmFzZV9vZnMpOworCisJCQlvdXRfYmUxNihzcGlfYmFzZSwgcHJhbV9vZnMpOworCQl9CisJfSBlbHNlIHsKKwkJc3RydWN0IHNwaV9wcmFtIF9faW9tZW0gKnByYW0gPSBjcG1fbXVyYW1fYWRkcihzcGlfYmFzZV9vZnMpOworCQl1MTYgcnBiYXNlID0gaW5fYmUxNigmcHJhbS0+cnBiYXNlKTsKKworCQkvKiBNaWNyb2NvZGUgcmVsb2NhdGlvbiBwYXRjaCBhcHBsaWVkPyAqLworCQlpZiAocnBiYXNlKQorCQkJcHJhbV9vZnMgPSBycGJhc2U7CisJCWVsc2UKKwkJCXJldHVybiBzcGlfYmFzZV9vZnM7CisJfQorCisJY3BtX211cmFtX2ZyZWUoc3BpX2Jhc2Vfb2ZzKTsKKwlyZXR1cm4gcHJhbV9vZnM7Cit9CisKK3N0YXRpYyBpbnQgbXBjOHh4eF9zcGlfY3BtX2luaXQoc3RydWN0IG1wYzh4eHhfc3BpICptc3BpKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IG1zcGktPmRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2X2FyY2hkYXRhX2dldF9ub2RlKCZkZXYtPmFyY2hkYXRhKTsKKwljb25zdCB1MzIgKmlwcm9wOworCWludCBzaXplOworCXVuc2lnbmVkIGxvbmcgcHJhbV9vZnM7CisJdW5zaWduZWQgbG9uZyBiZHNfb2ZzOworCisJaWYgKCEobXNwaS0+ZmxhZ3MgJiBTUElfQ1BNX01PREUpKQorCQlyZXR1cm4gMDsKKworCWlmICghbXBjOHh4eF9zcGlfYWxsb2NfZHVtbXlfcngoKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAobXNwaS0+ZmxhZ3MgJiBTUElfUUUpIHsKKwkJaXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJjZWxsLWluZGV4IiwgJnNpemUpOworCQlpZiAoaXByb3AgJiYgc2l6ZSA9PSBzaXplb2YoKmlwcm9wKSkKKwkJCW1zcGktPnN1YmJsb2NrID0gKmlwcm9wOworCisJCXN3aXRjaCAobXNwaS0+c3ViYmxvY2spIHsKKwkJZGVmYXVsdDoKKwkJCWRldl93YXJuKGRldiwgImNlbGwtaW5kZXggdW5zcGVjaWZpZWQsIGFzc3VtaW5nIFNQSTEiKTsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIDA6CisJCQltc3BpLT5zdWJibG9jayA9IFFFX0NSX1NVQkJMT0NLX1NQSTE7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJbXNwaS0+c3ViYmxvY2sgPSBRRV9DUl9TVUJCTE9DS19TUEkyOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlwcmFtX29mcyA9IG1wYzh4eHhfc3BpX2NwbV9nZXRfcHJhbShtc3BpKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHByYW1fb2ZzKSkgeworCQlkZXZfZXJyKGRldiwgImNhbid0IGFsbG9jYXRlIHNwaSBwYXJhbWV0ZXIgcmFtXG4iKTsKKwkJZ290byBlcnJfcHJhbTsKKwl9CisKKwliZHNfb2ZzID0gY3BtX211cmFtX2FsbG9jKHNpemVvZigqbXNwaS0+dHhfYmQpICsKKwkJCQkgIHNpemVvZigqbXNwaS0+cnhfYmQpLCA4KTsKKwlpZiAoSVNfRVJSX1ZBTFVFKGJkc19vZnMpKSB7CisJCWRldl9lcnIoZGV2LCAiY2FuJ3QgYWxsb2NhdGUgYmRzXG4iKTsKKwkJZ290byBlcnJfYmRzOworCX0KKworCW1zcGktPmRtYV9kdW1teV90eCA9IGRtYV9tYXBfc2luZ2xlKGRldiwgZW1wdHlfemVyb19wYWdlLCBQQUdFX1NJWkUsCisJCQkJCSAgICBETUFfVE9fREVWSUNFKTsKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBtc3BpLT5kbWFfZHVtbXlfdHgpKSB7CisJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIG1hcCBkdW1teSB0eCBidWZmZXJcbiIpOworCQlnb3RvIGVycl9kdW1teV90eDsKKwl9CisKKwltc3BpLT5kbWFfZHVtbXlfcnggPSBkbWFfbWFwX3NpbmdsZShkZXYsIG1wYzh4eHhfZHVtbXlfcngsIFNQSV9NUkJMUiwKKwkJCQkJICAgIERNQV9GUk9NX0RFVklDRSk7CisJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgbXNwaS0+ZG1hX2R1bW15X3J4KSkgeworCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byBtYXAgZHVtbXkgcnggYnVmZmVyXG4iKTsKKwkJZ290byBlcnJfZHVtbXlfcng7CisJfQorCisJbXNwaS0+cHJhbSA9IGNwbV9tdXJhbV9hZGRyKHByYW1fb2ZzKTsKKworCW1zcGktPnR4X2JkID0gY3BtX211cmFtX2FkZHIoYmRzX29mcyk7CisJbXNwaS0+cnhfYmQgPSBjcG1fbXVyYW1fYWRkcihiZHNfb2ZzICsgc2l6ZW9mKCptc3BpLT50eF9iZCkpOworCisJLyogSW5pdGlhbGl6ZSBwYXJhbWV0ZXIgcmFtLiAqLworCW91dF9iZTE2KCZtc3BpLT5wcmFtLT50YmFzZSwgY3BtX211cmFtX29mZnNldChtc3BpLT50eF9iZCkpOworCW91dF9iZTE2KCZtc3BpLT5wcmFtLT5yYmFzZSwgY3BtX211cmFtX29mZnNldChtc3BpLT5yeF9iZCkpOworCW91dF84KCZtc3BpLT5wcmFtLT50ZmNyLCBDUE1GQ1JfRUIgfCBDUE1GQ1JfR0JMKTsKKwlvdXRfOCgmbXNwaS0+cHJhbS0+cmZjciwgQ1BNRkNSX0VCIHwgQ1BNRkNSX0dCTCk7CisJb3V0X2JlMTYoJm1zcGktPnByYW0tPm1yYmxyLCBTUElfTVJCTFIpOworCW91dF9iZTMyKCZtc3BpLT5wcmFtLT5yc3RhdGUsIDApOworCW91dF9iZTMyKCZtc3BpLT5wcmFtLT5yZHAsIDApOworCW91dF9iZTE2KCZtc3BpLT5wcmFtLT5yYnB0ciwgMCk7CisJb3V0X2JlMTYoJm1zcGktPnByYW0tPnJiYywgMCk7CisJb3V0X2JlMzIoJm1zcGktPnByYW0tPnJ4dG1wLCAwKTsKKwlvdXRfYmUzMigmbXNwaS0+cHJhbS0+dHN0YXRlLCAwKTsKKwlvdXRfYmUzMigmbXNwaS0+cHJhbS0+dGRwLCAwKTsKKwlvdXRfYmUxNigmbXNwaS0+cHJhbS0+dGJwdHIsIDApOworCW91dF9iZTE2KCZtc3BpLT5wcmFtLT50YmMsIDApOworCW91dF9iZTMyKCZtc3BpLT5wcmFtLT50eHRtcCwgMCk7CisKKwlyZXR1cm4gMDsKKworZXJyX2R1bW15X3J4OgorCWRtYV91bm1hcF9zaW5nbGUoZGV2LCBtc3BpLT5kbWFfZHVtbXlfdHgsIFBBR0VfU0laRSwgRE1BX1RPX0RFVklDRSk7CitlcnJfZHVtbXlfdHg6CisJY3BtX211cmFtX2ZyZWUoYmRzX29mcyk7CitlcnJfYmRzOgorCWNwbV9tdXJhbV9mcmVlKHByYW1fb2ZzKTsKK2Vycl9wcmFtOgorCW1wYzh4eHhfc3BpX2ZyZWVfZHVtbXlfcngoKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgbXBjOHh4eF9zcGlfY3BtX2ZyZWUoc3RydWN0IG1wYzh4eHhfc3BpICptc3BpKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IG1zcGktPmRldjsKKworCWRtYV91bm1hcF9zaW5nbGUoZGV2LCBtc3BpLT5kbWFfZHVtbXlfcngsIFNQSV9NUkJMUiwgRE1BX0ZST01fREVWSUNFKTsKKwlkbWFfdW5tYXBfc2luZ2xlKGRldiwgbXNwaS0+ZG1hX2R1bW15X3R4LCBQQUdFX1NJWkUsIERNQV9UT19ERVZJQ0UpOworCWNwbV9tdXJhbV9mcmVlKGNwbV9tdXJhbV9vZmZzZXQobXNwaS0+dHhfYmQpKTsKKwljcG1fbXVyYW1fZnJlZShjcG1fbXVyYW1fb2Zmc2V0KG1zcGktPnByYW0pKTsKKwltcGM4eHh4X3NwaV9mcmVlX2R1bW15X3J4KCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICptcGM4eHh4X3NwaV9zdHJtb2RlKHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlpZiAoZmxhZ3MgJiBTUElfUUVfQ1BVX01PREUpIHsKKwkJcmV0dXJuICJRRSBDUFUiOworCX0gZWxzZSBpZiAoZmxhZ3MgJiBTUElfQ1BNX01PREUpIHsKKwkJaWYgKGZsYWdzICYgU1BJX1FFKQorCQkJcmV0dXJuICJRRSI7CisJCWVsc2UgaWYgKGZsYWdzICYgU1BJX0NQTTIpCisJCQlyZXR1cm4gIkNQTTIiOworCQllbHNlCisJCQlyZXR1cm4gIkNQTTEiOworCX0KKwlyZXR1cm4gIkNQVSI7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc3BpX21hc3RlciAqIF9fZGV2aW5pdAogbXBjOHh4eF9zcGlfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKm1lbSwgdW5zaWduZWQgaW50IGlycSkKIHsKQEAgLTU1MiwxNCArOTk0LDE5IEBACiAJbWFzdGVyLT5jbGVhbnVwID0gbXBjOHh4eF9zcGlfY2xlYW51cDsKIAogCW1wYzh4eHhfc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCW1wYzh4eHhfc3BpLT5xZV9tb2RlID0gcGRhdGEtPnFlX21vZGU7CisJbXBjOHh4eF9zcGktPmRldiA9IGRldjsKIAltcGM4eHh4X3NwaS0+Z2V0X3J4ID0gbXBjOHh4eF9zcGlfcnhfYnVmX3U4OwogCW1wYzh4eHhfc3BpLT5nZXRfdHggPSBtcGM4eHh4X3NwaV90eF9idWZfdTg7CisJbXBjOHh4eF9zcGktPmZsYWdzID0gcGRhdGEtPmZsYWdzOwogCW1wYzh4eHhfc3BpLT5zcGlicmcgPSBwZGF0YS0+c3lzY2xrOwogCisJcmV0ID0gbXBjOHh4eF9zcGlfY3BtX2luaXQobXBjOHh4eF9zcGkpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2NwbV9pbml0OworCiAJbXBjOHh4eF9zcGktPnJ4X3NoaWZ0ID0gMDsKIAltcGM4eHh4X3NwaS0+dHhfc2hpZnQgPSAwOwotCWlmIChtcGM4eHh4X3NwaS0+cWVfbW9kZSkgeworCWlmIChtcGM4eHh4X3NwaS0+ZmxhZ3MgJiBTUElfUUVfQ1BVX01PREUpIHsKIAkJbXBjOHh4eF9zcGktPnJ4X3NoaWZ0ID0gMTY7CiAJCW1wYzh4eHhfc3BpLT50eF9zaGlmdCA9IDI0OwogCX0KQEAgLTU2OSw3ICsxMDE2LDcgQEAKIAltcGM4eHh4X3NwaS0+YmFzZSA9IGlvcmVtYXAobWVtLT5zdGFydCwgbWVtLT5lbmQgLSBtZW0tPnN0YXJ0ICsgMSk7CiAJaWYgKG1wYzh4eHhfc3BpLT5iYXNlID09IE5VTEwpIHsKIAkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBwdXRfbWFzdGVyOworCQlnb3RvIGVycl9pb3JlbWFwOwogCX0KIAogCW1wYzh4eHhfc3BpLT5pcnEgPSBpcnE7CkBAIC01OTIsNyArMTAzOSw3IEBACiAKIAkvKiBFbmFibGUgU1BJIGludGVyZmFjZSAqLwogCXJlZ3ZhbCA9IHBkYXRhLT5pbml0aWFsX3NwbW9kZSB8IFNQTU9ERV9JTklUX1ZBTCB8IFNQTU9ERV9FTkFCTEU7Ci0JaWYgKHBkYXRhLT5xZV9tb2RlKQorCWlmIChtcGM4eHh4X3NwaS0+ZmxhZ3MgJiBTUElfUUVfQ1BVX01PREUpCiAJCXJlZ3ZhbCB8PSBTUE1PREVfT1A7CiAKIAltcGM4eHh4X3NwaV93cml0ZV9yZWcoJm1wYzh4eHhfc3BpLT5iYXNlLT5tb2RlLCByZWd2YWwpOwpAQCAtNjEyLDkgKzEwNTksOCBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIHVucmVnX21hc3RlcjsKIAotCXByaW50ayhLRVJOX0lORk8KLQkgICAgICAgIiVzOiBNUEM4eHh4IFNQSSBDb250cm9sbGVyIGRyaXZlciBhdCAweCVwIChpcnEgPSAlZClcbiIsCi0JICAgICAgIGRldl9uYW1lKGRldiksIG1wYzh4eHhfc3BpLT5iYXNlLCBtcGM4eHh4X3NwaS0+aXJxKTsKKwlkZXZfaW5mbyhkZXYsICJhdCAweCVwIChpcnEgPSAlZCksICVzIG1vZGVcbiIsIG1wYzh4eHhfc3BpLT5iYXNlLAorCQkgbXBjOHh4eF9zcGktPmlycSwgbXBjOHh4eF9zcGlfc3RybW9kZShtcGM4eHh4X3NwaS0+ZmxhZ3MpKTsKIAogCXJldHVybiBtYXN0ZXI7CiAKQEAgLTYyNCw3ICsxMDcwLDkgQEAKIAlmcmVlX2lycShtcGM4eHh4X3NwaS0+aXJxLCBtcGM4eHh4X3NwaSk7CiB1bm1hcF9pbzoKIAlpb3VubWFwKG1wYzh4eHhfc3BpLT5iYXNlKTsKLXB1dF9tYXN0ZXI6CitlcnJfaW9yZW1hcDoKKwltcGM4eHh4X3NwaV9jcG1fZnJlZShtcGM4eHh4X3NwaSk7CitlcnJfY3BtX2luaXQ6CiAJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKIGVycjoKIAlyZXR1cm4gRVJSX1BUUihyZXQpOwpAQCAtNjQ0LDYgKzEwOTIsNyBAQAogCiAJZnJlZV9pcnEobXBjOHh4eF9zcGktPmlycSwgbXBjOHh4eF9zcGkpOwogCWlvdW5tYXAobXBjOHh4eF9zcGktPmJhc2UpOworCW1wYzh4eHhfc3BpX2NwbV9mcmVlKG1wYzh4eHhfc3BpKTsKIAogCXJldHVybiAwOwogfQpAQCAtNzA5LDYgKzExNTgsNyBAQAogCQlncGlvID0gb2ZfZ2V0X2dwaW9fZmxhZ3MobnAsIGksICZmbGFncyk7CiAJCWlmICghZ3Bpb19pc192YWxpZChncGlvKSkgewogCQkJZGV2X2VycihkZXYsICJpbnZhbGlkIGdwaW8gIyVkOiAlZFxuIiwgaSwgZ3Bpbyk7CisJCQlyZXQgPSBncGlvOwogCQkJZ290byBlcnJfbG9vcDsKIAkJfQogCkBAIC04MDQsNyArMTI1NCwxMyBAQAogCiAJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgIm1vZGUiLCBOVUxMKTsKIAlpZiAocHJvcCAmJiAhc3RyY21wKHByb3AsICJjcHUtcWUiKSkKLQkJcGRhdGEtPnFlX21vZGUgPSAxOworCQlwZGF0YS0+ZmxhZ3MgPSBTUElfUUVfQ1BVX01PREU7CisJZWxzZSBpZiAocHJvcCAmJiAhc3RyY21wKHByb3AsICJxZSIpKQorCQlwZGF0YS0+ZmxhZ3MgPSBTUElfQ1BNX01PREUgfCBTUElfUUU7CisJZWxzZSBpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJmc2wsY3BtMi1zcGkiKSkKKwkJcGRhdGEtPmZsYWdzID0gU1BJX0NQTV9NT0RFIHwgU1BJX0NQTTI7CisJZWxzZSBpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJmc2wsY3BtMS1zcGkiKSkKKwkJcGRhdGEtPmZsYWdzID0gU1BJX0NQTV9NT0RFIHwgU1BJX0NQTTE7CiAKIAlyZXQgPSBvZl9tcGM4eHh4X3NwaV9nZXRfY2hpcHNlbGVjdHMoZGV2KTsKIAlpZiAocmV0KQpAQCAtOTAwLDcgKzEzNTYsNyBAQAogTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTptcGM4eHh4X3NwaSIpOwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXBjOHh4eF9zcGlfZHJpdmVyID0gewogCS5wcm9iZSA9IHBsYXRfbXBjOHh4eF9zcGlfcHJvYmUsCi0JLnJlbW92ZSA9IF9fZXhpdF9wKHBsYXRfbXBjOHh4eF9zcGlfcmVtb3ZlKSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AocGxhdF9tcGM4eHh4X3NwaV9yZW1vdmUpLAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gIm1wYzh4eHhfc3BpIiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfbnVjOTAwLmMgYi9kcml2ZXJzL3NwaS9zcGlfbnVjOTAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMxOWY5YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9udWM5MDAuYwpAQCAtMCwwICsxLDUwNCBAQAorLyogbGludXgvZHJpdmVycy9zcGkvc3BpX251YzkwMC5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE51dm90b24gdGVjaG5vbG9neS4KKyAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CisKKyNpbmNsdWRlIDxtYWNoL251YzkwMF9zcGkuaD4KKworLyogdXNpIHJlZ2lzdGVycyBvZmZzZXQgKi8KKyNkZWZpbmUgVVNJX0NOVAkJMHgwMAorI2RlZmluZSBVU0lfRElWCQkweDA0CisjZGVmaW5lIFVTSV9TU1IJCTB4MDgKKyNkZWZpbmUgVVNJX1JYMAkJMHgxMAorI2RlZmluZSBVU0lfVFgwCQkweDEwCisKKy8qIHVzaSByZWdpc3RlciBiaXQgKi8KKyNkZWZpbmUgRU5JTlQJCSgweDAxIDw8IDE3KQorI2RlZmluZSBFTkZMRwkJKDB4MDEgPDwgMTYpCisjZGVmaW5lIFRYTlVNCQkoMHgwMyA8PCA4KQorI2RlZmluZSBUWE5FRwkJKDB4MDEgPDwgMikKKyNkZWZpbmUgUlhORUcJCSgweDAxIDw8IDEpCisjZGVmaW5lIExTQgkJKDB4MDEgPDwgMTApCisjZGVmaW5lIFNFTEVDVExFVgkoMHgwMSA8PCAyKQorI2RlZmluZSBTRUxFQ1RQT0wJKDB4MDEgPDwgMzEpCisjZGVmaW5lIFNFTEVDVFNMQVZFCTB4MDEKKyNkZWZpbmUgR09CVVNZCQkweDAxCisKK3N0cnVjdCBudWM5MDBfc3BpIHsKKwlzdHJ1Y3Qgc3BpX2JpdGJhbmcJIGJpdGJhbmc7CisJc3RydWN0IGNvbXBsZXRpb24JIGRvbmU7CisJdm9pZCBfX2lvbWVtCQkqcmVnczsKKwlpbnQJCQkgaXJxOworCWludAkJCSBsZW47CisJaW50CQkJIGNvdW50OworCWNvbnN0IHVuc2lnbmVkIGNoYXIJKnR4OworCXVuc2lnbmVkIGNoYXIJCSpyeDsKKwlzdHJ1Y3QgY2xrCQkqY2xrOworCXN0cnVjdCByZXNvdXJjZQkJKmlvYXJlYTsKKwlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOworCXN0cnVjdCBzcGlfZGV2aWNlCSpjdXJkZXY7CisJc3RydWN0IGRldmljZQkJKmRldjsKKwlzdHJ1Y3QgbnVjOTAwX3NwaV9pbmZvICpwZGF0YTsKKwlzcGlubG9ja190CQlsb2NrOworCXN0cnVjdCByZXNvdXJjZQkJKnJlczsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG51YzkwMF9zcGkgKnRvX2h3KHN0cnVjdCBzcGlfZGV2aWNlICpzZGV2KQoreworCXJldHVybiBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNkZXYtPm1hc3Rlcik7Cit9CisKK3N0YXRpYyB2b2lkIG51YzkwMF9zbGF2ZV9zZWxlY3Qoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdW5zaWduZWQgaW50IHNzcikKK3sKKwlzdHJ1Y3QgbnVjOTAwX3NwaSAqaHcgPSB0b19odyhzcGkpOworCXVuc2lnbmVkIGludCB2YWw7CisJdW5zaWduZWQgaW50IGNzID0gc3BpLT5tb2RlICYgU1BJX0NTX0hJR0ggPyAxIDogMDsKKwl1bnNpZ25lZCBpbnQgY3BvbCA9IHNwaS0+bW9kZSAmIFNQSV9DUE9MID8gMSA6IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZody0+bG9jaywgZmxhZ3MpOworCisJdmFsID0gX19yYXdfcmVhZGwoaHctPnJlZ3MgKyBVU0lfU1NSKTsKKworCWlmICghY3MpCisJCXZhbCAmPSB+U0VMRUNUTEVWOworCWVsc2UKKwkJdmFsIHw9IFNFTEVDVExFVjsKKworCWlmICghc3NyKQorCQl2YWwgJj0gflNFTEVDVFNMQVZFOworCWVsc2UKKwkJdmFsIHw9IFNFTEVDVFNMQVZFOworCisJX19yYXdfd3JpdGVsKHZhbCwgaHctPnJlZ3MgKyBVU0lfU1NSKTsKKworCXZhbCA9IF9fcmF3X3JlYWRsKGh3LT5yZWdzICsgVVNJX0NOVCk7CisKKwlpZiAoIWNwb2wpCisJCXZhbCAmPSB+U0VMRUNUUE9MOworCWVsc2UKKwkJdmFsIHw9IFNFTEVDVFBPTDsKKworCV9fcmF3X3dyaXRlbCh2YWwsIGh3LT5yZWdzICsgVVNJX0NOVCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBudWM5MDBfc3BpX2NoaXBzZWwoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IHZhbHVlKQoreworCXN3aXRjaCAodmFsdWUpIHsKKwljYXNlIEJJVEJBTkdfQ1NfSU5BQ1RJVkU6CisJCW51YzkwMF9zbGF2ZV9zZWxlY3Qoc3BpLCAwKTsKKwkJYnJlYWs7CisKKwljYXNlIEJJVEJBTkdfQ1NfQUNUSVZFOgorCQludWM5MDBfc2xhdmVfc2VsZWN0KHNwaSwgMSk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgbnVjOTAwX3NwaV9zZXR1cF90eG51bShzdHJ1Y3QgbnVjOTAwX3NwaSAqaHcsCisJCQkJCQkJdW5zaWduZWQgaW50IHR4bnVtKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZody0+bG9jaywgZmxhZ3MpOworCisJdmFsID0gX19yYXdfcmVhZGwoaHctPnJlZ3MgKyBVU0lfQ05UKTsKKworCWlmICghdHhudW0pCisJCXZhbCAmPSB+VFhOVU07CisJZWxzZQorCQl2YWwgfD0gdHhudW0gPDwgMHgwODsKKworCV9fcmF3X3dyaXRlbCh2YWwsIGh3LT5yZWdzICsgVVNJX0NOVCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+bG9jaywgZmxhZ3MpOworCit9CisKK3N0YXRpYyB2b2lkIG51YzkwMF9zcGlfc2V0dXBfdHhiaXRsZW4oc3RydWN0IG51YzkwMF9zcGkgKmh3LAorCQkJCQkJCXVuc2lnbmVkIGludCB0eGJpdGxlbikKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmxvY2ssIGZsYWdzKTsKKworCXZhbCA9IF9fcmF3X3JlYWRsKGh3LT5yZWdzICsgVVNJX0NOVCk7CisKKwl2YWwgfD0gKHR4Yml0bGVuIDw8IDB4MDMpOworCisJX19yYXdfd3JpdGVsKHZhbCwgaHctPnJlZ3MgKyBVU0lfQ05UKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG51YzkwMF9zcGlfZ29idXN5KHN0cnVjdCBudWM5MDBfc3BpICpodykKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmxvY2ssIGZsYWdzKTsKKworCXZhbCA9IF9fcmF3X3JlYWRsKGh3LT5yZWdzICsgVVNJX0NOVCk7CisKKwl2YWwgfD0gR09CVVNZOworCisJX19yYXdfd3JpdGVsKHZhbCwgaHctPnJlZ3MgKyBVU0lfQ05UKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgbnVjOTAwX3NwaV9zZXR1cHhmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCQkgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBudWM5MDBfc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGh3X3R4Ynl0ZShzdHJ1Y3QgbnVjOTAwX3NwaSAqaHcsIGludCBjb3VudCkKK3sKKwlyZXR1cm4gaHctPnR4ID8gaHctPnR4W2NvdW50XSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgbnVjOTAwX3NwaV90eHJ4KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCit7CisJc3RydWN0IG51YzkwMF9zcGkgKmh3ID0gdG9faHcoc3BpKTsKKworCWh3LT50eCA9IHQtPnR4X2J1ZjsKKwlody0+cnggPSB0LT5yeF9idWY7CisJaHctPmxlbiA9IHQtPmxlbjsKKwlody0+Y291bnQgPSAwOworCisJX19yYXdfd3JpdGVsKGh3X3R4Ynl0ZShodywgMHgwKSwgaHctPnJlZ3MgKyBVU0lfVFgwKTsKKworCW51YzkwMF9zcGlfZ29idXN5KGh3KTsKKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmh3LT5kb25lKTsKKworCXJldHVybiBody0+Y291bnQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBudWM5MDBfc3BpX2lycShpbnQgaXJxLCB2b2lkICpkZXYpCit7CisJc3RydWN0IG51YzkwMF9zcGkgKmh3ID0gZGV2OworCXVuc2lnbmVkIGludCBzdGF0dXM7CisJdW5zaWduZWQgaW50IGNvdW50ID0gaHctPmNvdW50OworCisJc3RhdHVzID0gX19yYXdfcmVhZGwoaHctPnJlZ3MgKyBVU0lfQ05UKTsKKwlfX3Jhd193cml0ZWwoc3RhdHVzLCBody0+cmVncyArIFVTSV9DTlQpOworCisJaWYgKHN0YXR1cyAmIEVORkxHKSB7CisJCWh3LT5jb3VudCsrOworCisJCWlmIChody0+cngpCisJCQlody0+cnhbY291bnRdID0gX19yYXdfcmVhZGwoaHctPnJlZ3MgKyBVU0lfUlgwKTsKKwkJY291bnQrKzsKKworCQlpZiAoY291bnQgPCBody0+bGVuKSB7CisJCQlfX3Jhd193cml0ZWwoaHdfdHhieXRlKGh3LCBjb3VudCksIGh3LT5yZWdzICsgVVNJX1RYMCk7CisJCQludWM5MDBfc3BpX2dvYnVzeShodyk7CisJCX0gZWxzZSB7CisJCQljb21wbGV0ZSgmaHctPmRvbmUpOworCQl9CisKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWNvbXBsZXRlKCZody0+ZG9uZSk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBudWM5MDBfdHhfZWRnZShzdHJ1Y3QgbnVjOTAwX3NwaSAqaHcsIHVuc2lnbmVkIGludCBlZGdlKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZody0+bG9jaywgZmxhZ3MpOworCisJdmFsID0gX19yYXdfcmVhZGwoaHctPnJlZ3MgKyBVU0lfQ05UKTsKKworCWlmIChlZGdlKQorCQl2YWwgfD0gVFhORUc7CisJZWxzZQorCQl2YWwgJj0gflRYTkVHOworCV9fcmF3X3dyaXRlbCh2YWwsIGh3LT5yZWdzICsgVVNJX0NOVCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBudWM5MDBfcnhfZWRnZShzdHJ1Y3QgbnVjOTAwX3NwaSAqaHcsIHVuc2lnbmVkIGludCBlZGdlKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZody0+bG9jaywgZmxhZ3MpOworCisJdmFsID0gX19yYXdfcmVhZGwoaHctPnJlZ3MgKyBVU0lfQ05UKTsKKworCWlmIChlZGdlKQorCQl2YWwgfD0gUlhORUc7CisJZWxzZQorCQl2YWwgJj0gflJYTkVHOworCV9fcmF3X3dyaXRlbCh2YWwsIGh3LT5yZWdzICsgVVNJX0NOVCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBudWM5MDBfc2VuZF9maXJzdChzdHJ1Y3QgbnVjOTAwX3NwaSAqaHcsIHVuc2lnbmVkIGludCBsc2IpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5sb2NrLCBmbGFncyk7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChody0+cmVncyArIFVTSV9DTlQpOworCisJaWYgKGxzYikKKwkJdmFsIHw9IExTQjsKKwllbHNlCisJCXZhbCAmPSB+TFNCOworCV9fcmF3X3dyaXRlbCh2YWwsIGh3LT5yZWdzICsgVVNJX0NOVCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBudWM5MDBfc2V0X3NsZWVwKHN0cnVjdCBudWM5MDBfc3BpICpodywgdW5zaWduZWQgaW50IHNsZWVwKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZody0+bG9jaywgZmxhZ3MpOworCisJdmFsID0gX19yYXdfcmVhZGwoaHctPnJlZ3MgKyBVU0lfQ05UKTsKKworCWlmIChzbGVlcCkKKwkJdmFsIHw9IChzbGVlcCA8PCAxMik7CisJZWxzZQorCQl2YWwgJj0gfigweDBmIDw8IDEyKTsKKwlfX3Jhd193cml0ZWwodmFsLCBody0+cmVncyArIFVTSV9DTlQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbnVjOTAwX2VuYWJsZV9pbnQoc3RydWN0IG51YzkwMF9zcGkgKmh3KQoreworCXVuc2lnbmVkIGludCB2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZody0+bG9jaywgZmxhZ3MpOworCisJdmFsID0gX19yYXdfcmVhZGwoaHctPnJlZ3MgKyBVU0lfQ05UKTsKKworCXZhbCB8PSBFTklOVDsKKworCV9fcmF3X3dyaXRlbCh2YWwsIGh3LT5yZWdzICsgVVNJX0NOVCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBudWM5MDBfc2V0X2RpdmlkZXIoc3RydWN0IG51YzkwMF9zcGkgKmh3KQoreworCV9fcmF3X3dyaXRlbChody0+cGRhdGEtPmRpdmlkZXIsIGh3LT5yZWdzICsgVVNJX0RJVik7Cit9CisKK3N0YXRpYyB2b2lkIG51YzkwMF9pbml0X3NwaShzdHJ1Y3QgbnVjOTAwX3NwaSAqaHcpCit7CisJY2xrX2VuYWJsZShody0+Y2xrKTsKKwlzcGluX2xvY2tfaW5pdCgmaHctPmxvY2spOworCisJbnVjOTAwX3R4X2VkZ2UoaHcsIGh3LT5wZGF0YS0+dHhuZWcpOworCW51YzkwMF9yeF9lZGdlKGh3LCBody0+cGRhdGEtPnJ4bmVnKTsKKwludWM5MDBfc2VuZF9maXJzdChodywgaHctPnBkYXRhLT5sc2IpOworCW51YzkwMF9zZXRfc2xlZXAoaHcsIGh3LT5wZGF0YS0+c2xlZXApOworCW51YzkwMF9zcGlfc2V0dXBfdHhiaXRsZW4oaHcsIGh3LT5wZGF0YS0+dHhiaXRsZW4pOworCW51YzkwMF9zcGlfc2V0dXBfdHhudW0oaHcsIGh3LT5wZGF0YS0+dHhudW0pOworCW51YzkwMF9zZXRfZGl2aWRlcihodyk7CisJbnVjOTAwX2VuYWJsZV9pbnQoaHcpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBudWM5MDBfc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG51YzkwMF9zcGkgKmh3OworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJaW50IGVyciA9IDA7CisKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgbnVjOTAwX3NwaSkpOworCWlmIChtYXN0ZXIgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBtZW1vcnkgZm9yIHNwaV9tYXN0ZXJcbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9ub21lbTsKKwl9CisKKwlodyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwltZW1zZXQoaHcsIDAsIHNpemVvZihzdHJ1Y3QgbnVjOTAwX3NwaSkpOworCisJaHctPm1hc3RlciA9IHNwaV9tYXN0ZXJfZ2V0KG1hc3Rlcik7CisJaHctPnBkYXRhICA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWh3LT5kZXYgPSAmcGRldi0+ZGV2OworCisJaWYgKGh3LT5wZGF0YSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIHBsYXRmb3JtIGRhdGEgc3VwcGxpZWRcbiIpOworCQllcnIgPSAtRU5PRU5UOworCQlnb3RvIGVycl9wZGF0YTsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBodyk7CisJaW5pdF9jb21wbGV0aW9uKCZody0+ZG9uZSk7CisKKwltYXN0ZXItPm1vZGVfYml0cyAgICAgICAgICA9IFNQSV9NT0RFXzA7CisJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCAgICAgPSBody0+cGRhdGEtPm51bV9jczsKKwltYXN0ZXItPmJ1c19udW0gICAgICAgICAgICA9IGh3LT5wZGF0YS0+YnVzX251bTsKKwlody0+Yml0YmFuZy5tYXN0ZXIgICAgICAgICA9IGh3LT5tYXN0ZXI7CisJaHctPmJpdGJhbmcuc2V0dXBfdHJhbnNmZXIgPSBudWM5MDBfc3BpX3NldHVweGZlcjsKKwlody0+Yml0YmFuZy5jaGlwc2VsZWN0ICAgICA9IG51YzkwMF9zcGlfY2hpcHNlbDsKKwlody0+Yml0YmFuZy50eHJ4X2J1ZnMgICAgICA9IG51YzkwMF9zcGlfdHhyeDsKKwlody0+Yml0YmFuZy5tYXN0ZXItPnNldHVwICA9IG51YzkwMF9zcGlfc2V0dXA7CisKKwlody0+cmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoaHctPnJlcyA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBnZXQgSU9SRVNPVVJDRV9NRU1cbiIpOworCQllcnIgPSAtRU5PRU5UOworCQlnb3RvIGVycl9wZGF0YTsKKwl9CisKKwlody0+aW9hcmVhID0gcmVxdWVzdF9tZW1fcmVnaW9uKGh3LT5yZXMtPnN0YXJ0LAorCQkJCQlyZXNvdXJjZV9zaXplKGh3LT5yZXMpLCBwZGV2LT5uYW1lKTsKKworCWlmIChody0+aW9hcmVhID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IHJlc2VydmUgcmVnaW9uXG4iKTsKKwkJZXJyID0gLUVOWElPOworCQlnb3RvIGVycl9wZGF0YTsKKwl9CisKKwlody0+cmVncyA9IGlvcmVtYXAoaHctPnJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUoaHctPnJlcykpOworCWlmIChody0+cmVncyA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBtYXAgSU9cbiIpOworCQllcnIgPSAtRU5YSU87CisJCWdvdG8gZXJyX2lvbWFwOworCX0KKworCWh3LT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChody0+aXJxIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBJUlEgc3BlY2lmaWVkXG4iKTsKKwkJZXJyID0gLUVOT0VOVDsKKwkJZ290byBlcnJfaXJxOworCX0KKworCWVyciA9IHJlcXVlc3RfaXJxKGh3LT5pcnEsIG51YzkwMF9zcGlfaXJxLCAwLCBwZGV2LT5uYW1lLCBodyk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgY2xhaW0gSVJRXG4iKTsKKwkJZ290byBlcnJfaXJxOworCX0KKworCWh3LT5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJzcGkiKTsKKwlpZiAoSVNfRVJSKGh3LT5jbGspKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIGNsb2NrIGZvciBkZXZpY2VcbiIpOworCQllcnIgPSBQVFJfRVJSKGh3LT5jbGspOworCQlnb3RvIGVycl9jbGs7CisJfQorCisJbWZwX3NldF9ncm91cGcoJnBkZXYtPmRldik7CisJbnVjOTAwX2luaXRfc3BpKGh3KTsKKworCWVyciA9IHNwaV9iaXRiYW5nX3N0YXJ0KCZody0+Yml0YmFuZyk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgU1BJIG1hc3RlclxuIik7CisJCWdvdG8gZXJyX3JlZ2lzdGVyOworCX0KKworCXJldHVybiAwOworCitlcnJfcmVnaXN0ZXI6CisJY2xrX2Rpc2FibGUoaHctPmNsayk7CisJY2xrX3B1dChody0+Y2xrKTsKK2Vycl9jbGs6CisJZnJlZV9pcnEoaHctPmlycSwgaHcpOworZXJyX2lycToKKwlpb3VubWFwKGh3LT5yZWdzKTsKK2Vycl9pb21hcDoKKwlyZWxlYXNlX21lbV9yZWdpb24oaHctPnJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUoaHctPnJlcykpOworCWtmcmVlKGh3LT5pb2FyZWEpOworZXJyX3BkYXRhOgorCXNwaV9tYXN0ZXJfcHV0KGh3LT5tYXN0ZXIpOzsKKworZXJyX25vbWVtOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IG51YzkwMF9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbnVjOTAwX3NwaSAqaHcgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCisJZnJlZV9pcnEoaHctPmlycSwgaHcpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKKworCXNwaV91bnJlZ2lzdGVyX21hc3Rlcihody0+bWFzdGVyKTsKKworCWNsa19kaXNhYmxlKGh3LT5jbGspOworCWNsa19wdXQoaHctPmNsayk7CisKKwlpb3VubWFwKGh3LT5yZWdzKTsKKworCXJlbGVhc2VfbWVtX3JlZ2lvbihody0+cmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShody0+cmVzKSk7CisJa2ZyZWUoaHctPmlvYXJlYSk7CisKKwlzcGlfbWFzdGVyX3B1dChody0+bWFzdGVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbnVjOTAwX3NwaV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IG51YzkwMF9zcGlfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChudWM5MDBfc3BpX3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gIm51YzkwMC1zcGkiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgbnVjOTAwX3NwaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbnVjOTAwX3NwaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbnVjOTAwX3NwaV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm51YzkwMF9zcGlfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobnVjOTAwX3NwaV9pbml0KTsKK21vZHVsZV9leGl0KG51YzkwMF9zcGlfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIldhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigibnVjOTAwIHNwaSBkcml2ZXIhIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOm51YzkwMC1zcGkiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9zaF9tc2lvZi5jIGIvZHJpdmVycy9zcGkvc3BpX3NoX21zaW9mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFlNWUxZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9zaF9tc2lvZi5jCkBAIC0wLDAgKzEsNjkxIEBACisvKgorICogU3VwZXJIIE1TSU9GIFNQSSBNYXN0ZXIgSW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IE1hZ251cyBEYW1tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NoX21zaW9mLmg+CisKKyNpbmNsdWRlIDxhc20vc3BpLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCitzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX3ByaXYgeworCXN0cnVjdCBzcGlfYml0YmFuZyBiaXRiYW5nOyAvKiBtdXN0IGJlIGZpcnN0IGZvciBzcGlfYml0YmFuZy5jICovCisJdm9pZCBfX2lvbWVtICptYXBiYXNlOworCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXN0cnVjdCBzaF9tc2lvZl9zcGlfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgY29tcGxldGlvbiBkb25lOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHR4X2ZpZm9fc2l6ZTsKKwlpbnQgcnhfZmlmb19zaXplOworfTsKKworI2RlZmluZSBUTURSMQkweDAwCisjZGVmaW5lIFRNRFIyCTB4MDQKKyNkZWZpbmUgVE1EUjMJMHgwOAorI2RlZmluZSBSTURSMQkweDEwCisjZGVmaW5lIFJNRFIyCTB4MTQKKyNkZWZpbmUgUk1EUjMJMHgxOAorI2RlZmluZSBUU0NSCTB4MjAKKyNkZWZpbmUgUlNDUgkweDIyCisjZGVmaW5lIENUUgkweDI4CisjZGVmaW5lIEZDVFIJMHgzMAorI2RlZmluZSBTVFIJMHg0MAorI2RlZmluZSBJRVIJMHg0NAorI2RlZmluZSBURFIxCTB4NDgKKyNkZWZpbmUgVERSMgkweDRjCisjZGVmaW5lIFRGRFIJMHg1MAorI2RlZmluZSBSRFIxCTB4NTgKKyNkZWZpbmUgUkRSMgkweDVjCisjZGVmaW5lIFJGRFIJMHg2MAorCisjZGVmaW5lIENUUl9UU0NLRSAoMSA8PCAxNSkKKyNkZWZpbmUgQ1RSX1RGU0UgICgxIDw8IDE0KQorI2RlZmluZSBDVFJfVFhFICAgKDEgPDwgOSkKKyNkZWZpbmUgQ1RSX1JYRSAgICgxIDw8IDgpCisKKyNkZWZpbmUgU1RSX1RFT0YgICgxIDw8IDIzKQorI2RlZmluZSBTVFJfUkVPRiAgKDEgPDwgNykKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2hfbXNpb2ZfcmVhZChzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX3ByaXYgKnAsIGludCByZWdfb2ZmcykKK3sKKwlzd2l0Y2ggKHJlZ19vZmZzKSB7CisJY2FzZSBUU0NSOgorCWNhc2UgUlNDUjoKKwkJcmV0dXJuIGlvcmVhZDE2KHAtPm1hcGJhc2UgKyByZWdfb2Zmcyk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGlvcmVhZDMyKHAtPm1hcGJhc2UgKyByZWdfb2Zmcyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzaF9tc2lvZl93cml0ZShzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX3ByaXYgKnAsIGludCByZWdfb2ZmcywKKwkJCSAgIHVuc2lnbmVkIGxvbmcgdmFsdWUpCit7CisJc3dpdGNoIChyZWdfb2ZmcykgeworCWNhc2UgVFNDUjoKKwljYXNlIFJTQ1I6CisJCWlvd3JpdGUxNih2YWx1ZSwgcC0+bWFwYmFzZSArIHJlZ19vZmZzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaW93cml0ZTMyKHZhbHVlLCBwLT5tYXBiYXNlICsgcmVnX29mZnMpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2hfbXNpb2ZfbW9kaWZ5X2N0cl93YWl0KHN0cnVjdCBzaF9tc2lvZl9zcGlfcHJpdiAqcCwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBjbHIsIHVuc2lnbmVkIGxvbmcgc2V0KQoreworCXVuc2lnbmVkIGxvbmcgbWFzayA9IGNsciB8IHNldDsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IGs7CisKKwlkYXRhID0gc2hfbXNpb2ZfcmVhZChwLCBDVFIpOworCWRhdGEgJj0gfmNscjsKKwlkYXRhIHw9IHNldDsKKwlzaF9tc2lvZl93cml0ZShwLCBDVFIsIGRhdGEpOworCisJZm9yIChrID0gMTAwOyBrID4gMDsgay0tKSB7CisJCWlmICgoc2hfbXNpb2ZfcmVhZChwLCBDVFIpICYgbWFzaykgPT0gc2V0KQorCQkJYnJlYWs7CisKKwkJdWRlbGF5KDEwKTsKKwl9CisKKwlyZXR1cm4gayA+IDAgPyAwIDogLUVUSU1FRE9VVDsKK30KKworc3RhdGljIGlycXJldHVybl90IHNoX21zaW9mX3NwaV9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX3ByaXYgKnAgPSBkYXRhOworCisJLyoganVzdCBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgYW5kIHdha2UgdXAgKi8KKwlzaF9tc2lvZl93cml0ZShwLCBJRVIsIDApOworCWNvbXBsZXRlKCZwLT5kb25lKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCB7CisJdW5zaWduZWQgc2hvcnQgZGl2OworCXVuc2lnbmVkIHNob3J0IHNjcjsKK30gY29uc3Qgc2hfbXNpb2Zfc3BpX2Nsa190YWJsZVtdID0geworCXsgMSwgMHgwMDA3IH0sCisJeyAyLCAweDAwMDAgfSwKKwl7IDQsIDB4MDAwMSB9LAorCXsgOCwgMHgwMDAyIH0sCisJeyAxNiwgMHgwMDAzIH0sCisJeyAzMiwgMHgwMDA0IH0sCisJeyA2NCwgMHgxZjAwIH0sCisJeyAxMjgsIDB4MWYwMSB9LAorCXsgMjU2LCAweDFmMDIgfSwKKwl7IDUxMiwgMHgxZjAzIH0sCisJeyAxMDI0LCAweDFmMDQgfSwKK307CisKK3N0YXRpYyB2b2lkIHNoX21zaW9mX3NwaV9zZXRfY2xrX3JlZ3Moc3RydWN0IHNoX21zaW9mX3NwaV9wcml2ICpwLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBzcGlfaHopCit7CisJdW5zaWduZWQgbG9uZyBkaXYgPSAxMDI0OworCXNpemVfdCBrOworCisJaWYgKCFXQVJOX09OKCFzcGlfaHogfHwgIXBhcmVudF9yYXRlKSkKKwkJZGl2ID0gcGFyZW50X3JhdGUgLyBzcGlfaHo7CisKKwkvKiBUT0RPOiBtYWtlIG1vcmUgZmluZSBncmFpbmVkICovCisKKwlmb3IgKGsgPSAwOyBrIDwgQVJSQVlfU0laRShzaF9tc2lvZl9zcGlfY2xrX3RhYmxlKTsgaysrKSB7CisJCWlmIChzaF9tc2lvZl9zcGlfY2xrX3RhYmxlW2tdLmRpdiA+PSBkaXYpCisJCQlicmVhazsKKwl9CisKKwlrID0gbWluX3QoaW50LCBrLCBBUlJBWV9TSVpFKHNoX21zaW9mX3NwaV9jbGtfdGFibGUpIC0gMSk7CisKKwlzaF9tc2lvZl93cml0ZShwLCBUU0NSLCBzaF9tc2lvZl9zcGlfY2xrX3RhYmxlW2tdLnNjcik7CisJc2hfbXNpb2Zfd3JpdGUocCwgUlNDUiwgc2hfbXNpb2Zfc3BpX2Nsa190YWJsZVtrXS5zY3IpOworfQorCitzdGF0aWMgdm9pZCBzaF9tc2lvZl9zcGlfc2V0X3Bpbl9yZWdzKHN0cnVjdCBzaF9tc2lvZl9zcGlfcHJpdiAqcCwKKwkJCQkgICAgICBpbnQgY3BvbCwgaW50IGNwaGEsCisJCQkJICAgICAgaW50IHR4X2hpX3osIGludCBsc2JfZmlyc3QpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJaW50IGVkZ2U7CisKKwkvKgorCSAqIENQT0wgQ1BIQSAgICAgVFNDS0laIFJTQ0tJWiBURURHIFJFREcoISkKKwkgKiAgICAwICAgIDAgICAgICAgICAxMCAgICAgMTAgICAgMSAgICAwCisJICogICAgMCAgICAxICAgICAgICAgMTAgICAgIDEwICAgIDAgICAgMQorCSAqICAgIDEgICAgMCAgICAgICAgIDExICAgICAxMSAgICAwICAgIDEKKwkgKiAgICAxICAgIDEgICAgICAgICAxMSAgICAgMTEgICAgMSAgICAwCisJICoKKwkgKiAoISkgTm90ZTogUkVERyBpcyBpbnZlcnRlZCByZWNvbW1lbmRlZCBkYXRhIHNoZWV0IHNldHRpbmcKKwkgKi8KKworCXNoX21zaW9mX3dyaXRlKHAsIEZDVFIsIDApOworCXNoX21zaW9mX3dyaXRlKHAsIFRNRFIxLCAweGUyMDAwMDA1IHwgKGxzYl9maXJzdCA8PCAyNCkpOworCXNoX21zaW9mX3dyaXRlKHAsIFJNRFIxLCAweDIyMDAwMDA1IHwgKGxzYl9maXJzdCA8PCAyNCkpOworCisJdG1wID0gMHhhMDAwMDAwMDsKKwl0bXAgfD0gY3BvbCA8PCAzMDsgLyogVFNDS0laICovCisJdG1wIHw9IGNwb2wgPDwgMjg7IC8qIFJTQ0tJWiAqLworCisJZWRnZSA9IGNwb2wgPyBjcGhhIDogIWNwaGE7CisKKwl0bXAgfD0gZWRnZSA8PCAyNzsgLyogVEVERyAqLworCXRtcCB8PSAhZWRnZSA8PCAyNjsgLyogUkVERyAqLworCXRtcCB8PSAodHhfaGlfeiA/IDIgOiAwKSA8PCAyMjsgLyogVFhESVogKi8KKwlzaF9tc2lvZl93cml0ZShwLCBDVFIsIHRtcCk7Cit9CisKK3N0YXRpYyB2b2lkIHNoX21zaW9mX3NwaV9zZXRfbW9kZV9yZWdzKHN0cnVjdCBzaF9tc2lvZl9zcGlfcHJpdiAqcCwKKwkJCQkgICAgICAgY29uc3Qgdm9pZCAqdHhfYnVmLCB2b2lkICpyeF9idWYsCisJCQkJICAgICAgIGludCBiaXRzLCBpbnQgd29yZHMpCit7CisJdW5zaWduZWQgbG9uZyBkcjI7CisKKwlkcjIgPSAoKGJpdHMgLSAxKSA8PCAyNCkgfCAoKHdvcmRzIC0gMSkgPDwgMTYpOworCisJaWYgKHR4X2J1ZikKKwkJc2hfbXNpb2Zfd3JpdGUocCwgVE1EUjIsIGRyMik7CisJZWxzZQorCQlzaF9tc2lvZl93cml0ZShwLCBUTURSMiwgZHIyIHwgMSk7CisKKwlpZiAocnhfYnVmKQorCQlzaF9tc2lvZl93cml0ZShwLCBSTURSMiwgZHIyKTsKKworCXNoX21zaW9mX3dyaXRlKHAsIElFUiwgU1RSX1RFT0YgfCBTVFJfUkVPRik7Cit9CisKK3N0YXRpYyB2b2lkIHNoX21zaW9mX3Jlc2V0X3N0cihzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX3ByaXYgKnApCit7CisJc2hfbXNpb2Zfd3JpdGUocCwgU1RSLCBzaF9tc2lvZl9yZWFkKHAsIFNUUikpOworfQorCitzdGF0aWMgdm9pZCBzaF9tc2lvZl9zcGlfd3JpdGVfZmlmb184KHN0cnVjdCBzaF9tc2lvZl9zcGlfcHJpdiAqcCwKKwkJCQkgICAgICBjb25zdCB2b2lkICp0eF9idWYsIGludCB3b3JkcywgaW50IGZzKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1Zl84ID0gdHhfYnVmOworCWludCBrOworCisJZm9yIChrID0gMDsgayA8IHdvcmRzOyBrKyspCisJCXNoX21zaW9mX3dyaXRlKHAsIFRGRFIsIGJ1Zl84W2tdIDw8IGZzKTsKK30KKworc3RhdGljIHZvaWQgc2hfbXNpb2Zfc3BpX3dyaXRlX2ZpZm9fMTYoc3RydWN0IHNoX21zaW9mX3NwaV9wcml2ICpwLAorCQkJCSAgICAgICBjb25zdCB2b2lkICp0eF9idWYsIGludCB3b3JkcywgaW50IGZzKQoreworCWNvbnN0IHVuc2lnbmVkIHNob3J0ICpidWZfMTYgPSB0eF9idWY7CisJaW50IGs7CisKKwlmb3IgKGsgPSAwOyBrIDwgd29yZHM7IGsrKykKKwkJc2hfbXNpb2Zfd3JpdGUocCwgVEZEUiwgYnVmXzE2W2tdIDw8IGZzKTsKK30KKworc3RhdGljIHZvaWQgc2hfbXNpb2Zfc3BpX3dyaXRlX2ZpZm9fMTZ1KHN0cnVjdCBzaF9tc2lvZl9zcGlfcHJpdiAqcCwKKwkJCQkJY29uc3Qgdm9pZCAqdHhfYnVmLCBpbnQgd29yZHMsIGludCBmcykKK3sKKwljb25zdCB1bnNpZ25lZCBzaG9ydCAqYnVmXzE2ID0gdHhfYnVmOworCWludCBrOworCisJZm9yIChrID0gMDsgayA8IHdvcmRzOyBrKyspCisJCXNoX21zaW9mX3dyaXRlKHAsIFRGRFIsIGdldF91bmFsaWduZWQoJmJ1Zl8xNltrXSkgPDwgZnMpOworfQorCitzdGF0aWMgdm9pZCBzaF9tc2lvZl9zcGlfd3JpdGVfZmlmb18zMihzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX3ByaXYgKnAsCisJCQkJICAgICAgIGNvbnN0IHZvaWQgKnR4X2J1ZiwgaW50IHdvcmRzLCBpbnQgZnMpCit7CisJY29uc3QgdW5zaWduZWQgaW50ICpidWZfMzIgPSB0eF9idWY7CisJaW50IGs7CisKKwlmb3IgKGsgPSAwOyBrIDwgd29yZHM7IGsrKykKKwkJc2hfbXNpb2Zfd3JpdGUocCwgVEZEUiwgYnVmXzMyW2tdIDw8IGZzKTsKK30KKworc3RhdGljIHZvaWQgc2hfbXNpb2Zfc3BpX3dyaXRlX2ZpZm9fMzJ1KHN0cnVjdCBzaF9tc2lvZl9zcGlfcHJpdiAqcCwKKwkJCQkJY29uc3Qgdm9pZCAqdHhfYnVmLCBpbnQgd29yZHMsIGludCBmcykKK3sKKwljb25zdCB1bnNpZ25lZCBpbnQgKmJ1Zl8zMiA9IHR4X2J1ZjsKKwlpbnQgazsKKworCWZvciAoayA9IDA7IGsgPCB3b3JkczsgaysrKQorCQlzaF9tc2lvZl93cml0ZShwLCBURkRSLCBnZXRfdW5hbGlnbmVkKCZidWZfMzJba10pIDw8IGZzKTsKK30KKworc3RhdGljIHZvaWQgc2hfbXNpb2Zfc3BpX3JlYWRfZmlmb184KHN0cnVjdCBzaF9tc2lvZl9zcGlfcHJpdiAqcCwKKwkJCQkgICAgIHZvaWQgKnJ4X2J1ZiwgaW50IHdvcmRzLCBpbnQgZnMpCit7CisJdW5zaWduZWQgY2hhciAqYnVmXzggPSByeF9idWY7CisJaW50IGs7CisKKwlmb3IgKGsgPSAwOyBrIDwgd29yZHM7IGsrKykKKwkJYnVmXzhba10gPSBzaF9tc2lvZl9yZWFkKHAsIFJGRFIpID4+IGZzOworfQorCitzdGF0aWMgdm9pZCBzaF9tc2lvZl9zcGlfcmVhZF9maWZvXzE2KHN0cnVjdCBzaF9tc2lvZl9zcGlfcHJpdiAqcCwKKwkJCQkgICAgICB2b2lkICpyeF9idWYsIGludCB3b3JkcywgaW50IGZzKQoreworCXVuc2lnbmVkIHNob3J0ICpidWZfMTYgPSByeF9idWY7CisJaW50IGs7CisKKwlmb3IgKGsgPSAwOyBrIDwgd29yZHM7IGsrKykKKwkJYnVmXzE2W2tdID0gc2hfbXNpb2ZfcmVhZChwLCBSRkRSKSA+PiBmczsKK30KKworc3RhdGljIHZvaWQgc2hfbXNpb2Zfc3BpX3JlYWRfZmlmb18xNnUoc3RydWN0IHNoX21zaW9mX3NwaV9wcml2ICpwLAorCQkJCSAgICAgICB2b2lkICpyeF9idWYsIGludCB3b3JkcywgaW50IGZzKQoreworCXVuc2lnbmVkIHNob3J0ICpidWZfMTYgPSByeF9idWY7CisJaW50IGs7CisKKwlmb3IgKGsgPSAwOyBrIDwgd29yZHM7IGsrKykKKwkJcHV0X3VuYWxpZ25lZChzaF9tc2lvZl9yZWFkKHAsIFJGRFIpID4+IGZzLCAmYnVmXzE2W2tdKTsKK30KKworc3RhdGljIHZvaWQgc2hfbXNpb2Zfc3BpX3JlYWRfZmlmb18zMihzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX3ByaXYgKnAsCisJCQkJICAgICAgdm9pZCAqcnhfYnVmLCBpbnQgd29yZHMsIGludCBmcykKK3sKKwl1bnNpZ25lZCBpbnQgKmJ1Zl8zMiA9IHJ4X2J1ZjsKKwlpbnQgazsKKworCWZvciAoayA9IDA7IGsgPCB3b3JkczsgaysrKQorCQlidWZfMzJba10gPSBzaF9tc2lvZl9yZWFkKHAsIFJGRFIpID4+IGZzOworfQorCitzdGF0aWMgdm9pZCBzaF9tc2lvZl9zcGlfcmVhZF9maWZvXzMydShzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX3ByaXYgKnAsCisJCQkJICAgICAgIHZvaWQgKnJ4X2J1ZiwgaW50IHdvcmRzLCBpbnQgZnMpCit7CisJdW5zaWduZWQgaW50ICpidWZfMzIgPSByeF9idWY7CisJaW50IGs7CisKKwlmb3IgKGsgPSAwOyBrIDwgd29yZHM7IGsrKykKKwkJcHV0X3VuYWxpZ25lZChzaF9tc2lvZl9yZWFkKHAsIFJGRFIpID4+IGZzLCAmYnVmXzMyW2tdKTsKK30KKworc3RhdGljIGludCBzaF9tc2lvZl9zcGlfYml0cyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQoreworCWludCBiaXRzOworCisJYml0cyA9IHQgPyB0LT5iaXRzX3Blcl93b3JkIDogMDsKKwliaXRzID0gYml0cyA/IGJpdHMgOiBzcGktPmJpdHNfcGVyX3dvcmQ7CisJcmV0dXJuIGJpdHM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNoX21zaW9mX3NwaV9oeihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCSAgICAgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKK3sKKwl1bnNpZ25lZCBsb25nIGh6OworCisJaHogPSB0ID8gdC0+c3BlZWRfaHogOiAwOworCWh6ID0gaHogPyBoeiA6IHNwaS0+bWF4X3NwZWVkX2h6OworCXJldHVybiBoejsKK30KKworc3RhdGljIGludCBzaF9tc2lvZl9zcGlfc2V0dXBfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCQkgICAgICAgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKK3sKKwlpbnQgYml0czsKKworCS8qIG5vdGluZyB0byBjaGVjayBoeiB2YWx1ZXMgYWdhaW5zdCBzaW5jZSBwYXJlbnQgY2xvY2sgaXMgZGlzYWJsZWQgKi8KKworCWJpdHMgPSBzaF9tc2lvZl9zcGlfYml0cyhzcGksIHQpOworCWlmIChiaXRzIDwgOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGJpdHMgPiAzMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gc3BpX2JpdGJhbmdfc2V0dXBfdHJhbnNmZXIoc3BpLCB0KTsKK30KKworc3RhdGljIHZvaWQgc2hfbXNpb2Zfc3BpX2NoaXBzZWxlY3Qoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IGlzX29uKQoreworCXN0cnVjdCBzaF9tc2lvZl9zcGlfcHJpdiAqcCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCWludCB2YWx1ZTsKKworCS8qIGNoaXAgc2VsZWN0IGlzIGFjdGl2ZSBsb3cgdW5sZXNzIFNQSV9DU19ISUdIIGlzIHNldCAqLworCWlmIChzcGktPm1vZGUgJiBTUElfQ1NfSElHSCkKKwkJdmFsdWUgPSAoaXNfb24gPT0gQklUQkFOR19DU19BQ1RJVkUpID8gMSA6IDA7CisJZWxzZQorCQl2YWx1ZSA9IChpc19vbiA9PSBCSVRCQU5HX0NTX0FDVElWRSkgPyAwIDogMTsKKworCWlmIChpc19vbiA9PSBCSVRCQU5HX0NTX0FDVElWRSkgeworCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoMCwgJnAtPmZsYWdzKSkgeworCQkJcG1fcnVudGltZV9nZXRfc3luYygmcC0+cGRldi0+ZGV2KTsKKwkJCWNsa19lbmFibGUocC0+Y2xrKTsKKwkJfQorCisJCS8qIENvbmZpZ3VyZSBwaW5zIGJlZm9yZSBhc3NlcnRpbmcgQ1MgKi8KKwkJc2hfbXNpb2Zfc3BpX3NldF9waW5fcmVncyhwLCAhIShzcGktPm1vZGUgJiBTUElfQ1BPTCksCisJCQkJCSAgISEoc3BpLT5tb2RlICYgU1BJX0NQSEEpLAorCQkJCQkgICEhKHNwaS0+bW9kZSAmIFNQSV8zV0lSRSksCisJCQkJCSAgISEoc3BpLT5tb2RlICYgU1BJX0xTQl9GSVJTVCkpOworCX0KKworCS8qIHVzZSBzcGktPmNvbnRyb2xsZXIgZGF0YSBmb3IgQ1MgKHNhbWUgc3RyYXRlZ3kgYXMgc3BpX2dwaW8pICovCisJZ3Bpb19zZXRfdmFsdWUoKHVuc2lnbmVkKXNwaS0+Y29udHJvbGxlcl9kYXRhLCB2YWx1ZSk7CisKKwlpZiAoaXNfb24gPT0gQklUQkFOR19DU19JTkFDVElWRSkgeworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KDAsICZwLT5mbGFncykpIHsKKwkJCWNsa19kaXNhYmxlKHAtPmNsayk7CisJCQlwbV9ydW50aW1lX3B1dCgmcC0+cGRldi0+ZGV2KTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBzaF9tc2lvZl9zcGlfdHhyeF9vbmNlKHN0cnVjdCBzaF9tc2lvZl9zcGlfcHJpdiAqcCwKKwkJCQkgIHZvaWQgKCp0eF9maWZvKShzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX3ByaXYgKiwKKwkJCQkJCSAgY29uc3Qgdm9pZCAqLCBpbnQsIGludCksCisJCQkJICB2b2lkICgqcnhfZmlmbykoc3RydWN0IHNoX21zaW9mX3NwaV9wcml2ICosCisJCQkJCQkgIHZvaWQgKiwgaW50LCBpbnQpLAorCQkJCSAgY29uc3Qgdm9pZCAqdHhfYnVmLCB2b2lkICpyeF9idWYsCisJCQkJICBpbnQgd29yZHMsIGludCBiaXRzKQoreworCWludCBmaWZvX3NoaWZ0OworCWludCByZXQ7CisKKwkvKiBsaW1pdCBtYXhpbXVtIHdvcmQgdHJhbnNmZXIgdG8gcngvdHggZmlmbyBzaXplICovCisJaWYgKHR4X2J1ZikKKwkJd29yZHMgPSBtaW5fdChpbnQsIHdvcmRzLCBwLT50eF9maWZvX3NpemUpOworCWlmIChyeF9idWYpCisJCXdvcmRzID0gbWluX3QoaW50LCB3b3JkcywgcC0+cnhfZmlmb19zaXplKTsKKworCS8qIHRoZSBmaWZvIGNvbnRlbnRzIG5lZWQgc2hpZnRpbmcgKi8KKwlmaWZvX3NoaWZ0ID0gMzIgLSBiaXRzOworCisJLyogc2V0dXAgbXNpb2YgdHJhbnNmZXIgbW9kZSByZWdpc3RlcnMgKi8KKwlzaF9tc2lvZl9zcGlfc2V0X21vZGVfcmVncyhwLCB0eF9idWYsIHJ4X2J1ZiwgYml0cywgd29yZHMpOworCisJLyogd3JpdGUgdHggZmlmbyAqLworCWlmICh0eF9idWYpCisJCXR4X2ZpZm8ocCwgdHhfYnVmLCB3b3JkcywgZmlmb19zaGlmdCk7CisKKwkvKiBzZXR1cCBjbG9jayBhbmQgcngvdHggc2lnbmFscyAqLworCXJldCA9IHNoX21zaW9mX21vZGlmeV9jdHJfd2FpdChwLCAwLCBDVFJfVFNDS0UpOworCWlmIChyeF9idWYpCisJCXJldCA9IHJldCA/IHJldCA6IHNoX21zaW9mX21vZGlmeV9jdHJfd2FpdChwLCAwLCBDVFJfUlhFKTsKKwlyZXQgPSByZXQgPyByZXQgOiBzaF9tc2lvZl9tb2RpZnlfY3RyX3dhaXQocCwgMCwgQ1RSX1RYRSk7CisKKwkvKiBzdGFydCBieSBzZXR0aW5nIGZyYW1lIGJpdCAqLworCUlOSVRfQ09NUExFVElPTihwLT5kb25lKTsKKwlyZXQgPSByZXQgPyByZXQgOiBzaF9tc2lvZl9tb2RpZnlfY3RyX3dhaXQocCwgMCwgQ1RSX1RGU0UpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcC0+cGRldi0+ZGV2LCAiZmFpbGVkIHRvIHN0YXJ0IGhhcmR3YXJlXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJLyogd2FpdCBmb3IgdHggZmlmbyB0byBiZSBlbXB0aWVkIC8gcnggZmlmbyB0byBiZSBmaWxsZWQgKi8KKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZwLT5kb25lKTsKKworCS8qIHJlYWQgcnggZmlmbyAqLworCWlmIChyeF9idWYpCisJCXJ4X2ZpZm8ocCwgcnhfYnVmLCB3b3JkcywgZmlmb19zaGlmdCk7CisKKwkvKiBjbGVhciBzdGF0dXMgYml0cyAqLworCXNoX21zaW9mX3Jlc2V0X3N0cihwKTsKKworCS8qIHNodXQgZG93biBmcmFtZSwgdHgvdHggYW5kIGNsb2NrIHNpZ25hbHMgKi8KKwlyZXQgPSBzaF9tc2lvZl9tb2RpZnlfY3RyX3dhaXQocCwgQ1RSX1RGU0UsIDApOworCXJldCA9IHJldCA/IHJldCA6IHNoX21zaW9mX21vZGlmeV9jdHJfd2FpdChwLCBDVFJfVFhFLCAwKTsKKwlpZiAocnhfYnVmKQorCQlyZXQgPSByZXQgPyByZXQgOiBzaF9tc2lvZl9tb2RpZnlfY3RyX3dhaXQocCwgQ1RSX1JYRSwgMCk7CisJcmV0ID0gcmV0ID8gcmV0IDogc2hfbXNpb2ZfbW9kaWZ5X2N0cl93YWl0KHAsIENUUl9UU0NLRSwgMCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwLT5wZGV2LT5kZXYsICJmYWlsZWQgdG8gc2h1dCBkb3duIGhhcmR3YXJlXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0dXJuIHdvcmRzOworCisgZXJyOgorCXNoX21zaW9mX3dyaXRlKHAsIElFUiwgMCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzaF9tc2lvZl9zcGlfdHhyeChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQoreworCXN0cnVjdCBzaF9tc2lvZl9zcGlfcHJpdiAqcCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCXZvaWQgKCp0eF9maWZvKShzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX3ByaXYgKiwgY29uc3Qgdm9pZCAqLCBpbnQsIGludCk7CisJdm9pZCAoKnJ4X2ZpZm8pKHN0cnVjdCBzaF9tc2lvZl9zcGlfcHJpdiAqLCB2b2lkICosIGludCwgaW50KTsKKwlpbnQgYml0czsKKwlpbnQgYnl0ZXNfcGVyX3dvcmQ7CisJaW50IGJ5dGVzX2RvbmU7CisJaW50IHdvcmRzOworCWludCBuOworCisJYml0cyA9IHNoX21zaW9mX3NwaV9iaXRzKHNwaSwgdCk7CisKKwkvKiBzZXR1cCBieXRlcyBwZXIgd29yZCBhbmQgZmlmbyByZWFkL3dyaXRlIGZ1bmN0aW9ucyAqLworCWlmIChiaXRzIDw9IDgpIHsKKwkJYnl0ZXNfcGVyX3dvcmQgPSAxOworCQl0eF9maWZvID0gc2hfbXNpb2Zfc3BpX3dyaXRlX2ZpZm9fODsKKwkJcnhfZmlmbyA9IHNoX21zaW9mX3NwaV9yZWFkX2ZpZm9fODsKKwl9IGVsc2UgaWYgKGJpdHMgPD0gMTYpIHsKKwkJYnl0ZXNfcGVyX3dvcmQgPSAyOworCQlpZiAoKHVuc2lnbmVkIGxvbmcpdC0+dHhfYnVmICYgMHgwMSkKKwkJCXR4X2ZpZm8gPSBzaF9tc2lvZl9zcGlfd3JpdGVfZmlmb18xNnU7CisJCWVsc2UKKwkJCXR4X2ZpZm8gPSBzaF9tc2lvZl9zcGlfd3JpdGVfZmlmb18xNjsKKworCQlpZiAoKHVuc2lnbmVkIGxvbmcpdC0+cnhfYnVmICYgMHgwMSkKKwkJCXJ4X2ZpZm8gPSBzaF9tc2lvZl9zcGlfcmVhZF9maWZvXzE2dTsKKwkJZWxzZQorCQkJcnhfZmlmbyA9IHNoX21zaW9mX3NwaV9yZWFkX2ZpZm9fMTY7CisJfSBlbHNlIHsKKwkJYnl0ZXNfcGVyX3dvcmQgPSA0OworCQlpZiAoKHVuc2lnbmVkIGxvbmcpdC0+dHhfYnVmICYgMHgwMykKKwkJCXR4X2ZpZm8gPSBzaF9tc2lvZl9zcGlfd3JpdGVfZmlmb18zMnU7CisJCWVsc2UKKwkJCXR4X2ZpZm8gPSBzaF9tc2lvZl9zcGlfd3JpdGVfZmlmb18zMjsKKworCQlpZiAoKHVuc2lnbmVkIGxvbmcpdC0+cnhfYnVmICYgMHgwMykKKwkJCXJ4X2ZpZm8gPSBzaF9tc2lvZl9zcGlfcmVhZF9maWZvXzMydTsKKwkJZWxzZQorCQkJcnhfZmlmbyA9IHNoX21zaW9mX3NwaV9yZWFkX2ZpZm9fMzI7CisJfQorCisJLyogc2V0dXAgY2xvY2tzIChjbG9jayBhbHJlYWR5IGVuYWJsZWQgaW4gY2hpcHNlbGVjdCgpKSAqLworCXNoX21zaW9mX3NwaV9zZXRfY2xrX3JlZ3MocCwgY2xrX2dldF9yYXRlKHAtPmNsayksCisJCQkJICBzaF9tc2lvZl9zcGlfaHooc3BpLCB0KSk7CisKKwkvKiB0cmFuc2ZlciBpbiBmaWZvIHNpemVkIGNodW5rcyAqLworCXdvcmRzID0gdC0+bGVuIC8gYnl0ZXNfcGVyX3dvcmQ7CisJYnl0ZXNfZG9uZSA9IDA7CisKKwl3aGlsZSAoYnl0ZXNfZG9uZSA8IHQtPmxlbikgeworCQluID0gc2hfbXNpb2Zfc3BpX3R4cnhfb25jZShwLCB0eF9maWZvLCByeF9maWZvLAorCQkJCQkgICB0LT50eF9idWYgKyBieXRlc19kb25lLAorCQkJCQkgICB0LT5yeF9idWYgKyBieXRlc19kb25lLAorCQkJCQkgICB3b3JkcywgYml0cyk7CisJCWlmIChuIDwgMCkKKwkJCWJyZWFrOworCisJCWJ5dGVzX2RvbmUgKz0gbiAqIGJ5dGVzX3Blcl93b3JkOworCQl3b3JkcyAtPSBuOworCX0KKworCXJldHVybiBieXRlc19kb25lOworfQorCitzdGF0aWMgdTMyIHNoX21zaW9mX3NwaV90eHJ4X3dvcmQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdW5zaWduZWQgbnNlY3MsCisJCQkJICB1MzIgd29yZCwgdTggYml0cykKK3sKKwlCVUcoKTsgLyogdW51c2VkIGJ1dCBuZWVkZWQgYnkgYml0YmFuZyBjb2RlICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2hfbXNpb2Zfc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlCSpyOworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IHNoX21zaW9mX3NwaV9wcml2ICpwOworCWNoYXIgY2xrX25hbWVbMTZdOworCWludCBpOworCWludCByZXQ7CisKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX3ByaXYpKTsKKwlpZiAobWFzdGVyID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIHNwaSBtYXN0ZXJcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjA7CisJfQorCisJcCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHApOworCXAtPmluZm8gPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpbml0X2NvbXBsZXRpb24oJnAtPmRvbmUpOworCisJc25wcmludGYoY2xrX25hbWUsIHNpemVvZihjbGtfbmFtZSksICJtc2lvZiVkIiwgcGRldi0+aWQpOworCXAtPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgY2xrX25hbWUpOworCWlmIChJU19FUlIocC0+Y2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgZ2V0IGNsb2NrIFwiJXNcIlxuIiwgY2xrX25hbWUpOworCQlyZXQgPSBQVFJfRVJSKHAtPmNsayk7CisJCWdvdG8gZXJyMTsKKwl9CisKKwlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoIXIgfHwgaSA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IGdldCBwbGF0Zm9ybSByZXNvdXJjZXNcbiIpOworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGVycjI7CisJfQorCXAtPm1hcGJhc2UgPSBpb3JlbWFwX25vY2FjaGUoci0+c3RhcnQsIHJlc291cmNlX3NpemUocikpOworCWlmICghcC0+bWFwYmFzZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gaW9yZW1hcFxuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBlcnIyOworCX0KKworCXJldCA9IHJlcXVlc3RfaXJxKGksIHNoX21zaW9mX3NwaV9pcnEsIElSUUZfRElTQUJMRUQsCisJCQkgIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBwKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byByZXF1ZXN0IGlycVxuIik7CisJCWdvdG8gZXJyMzsKKwl9CisKKwlwLT5wZGV2ID0gcGRldjsKKwlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKKworCS8qIFRoZSBzdGFuZGFyZCB2ZXJzaW9uIG9mIE1TSU9GIHVzZSA2NCB3b3JkIEZJRk9zICovCisJcC0+dHhfZmlmb19zaXplID0gNjQ7CisJcC0+cnhfZmlmb19zaXplID0gNjQ7CisKKwkvKiBQbGF0Zm9ybSBkYXRhIG1heSBvdmVycmlkZSBGSUZPIHNpemVzICovCisJaWYgKHAtPmluZm8tPnR4X2ZpZm9fb3ZlcnJpZGUpCisJCXAtPnR4X2ZpZm9fc2l6ZSA9IHAtPmluZm8tPnR4X2ZpZm9fb3ZlcnJpZGU7CisJaWYgKHAtPmluZm8tPnJ4X2ZpZm9fb3ZlcnJpZGUpCisJCXAtPnJ4X2ZpZm9fc2l6ZSA9IHAtPmluZm8tPnJ4X2ZpZm9fb3ZlcnJpZGU7CisKKwkvKiBpbml0IG1hc3RlciBhbmQgYml0YmFuZyBjb2RlICovCisJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0g7CisJbWFzdGVyLT5tb2RlX2JpdHMgfD0gU1BJX0xTQl9GSVJTVCB8IFNQSV8zV0lSRTsKKwltYXN0ZXItPmZsYWdzID0gMDsKKwltYXN0ZXItPmJ1c19udW0gPSBwZGV2LT5pZDsKKwltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gcC0+aW5mby0+bnVtX2NoaXBzZWxlY3Q7CisJbWFzdGVyLT5zZXR1cCA9IHNwaV9iaXRiYW5nX3NldHVwOworCW1hc3Rlci0+Y2xlYW51cCA9IHNwaV9iaXRiYW5nX2NsZWFudXA7CisKKwlwLT5iaXRiYW5nLm1hc3RlciA9IG1hc3RlcjsKKwlwLT5iaXRiYW5nLmNoaXBzZWxlY3QgPSBzaF9tc2lvZl9zcGlfY2hpcHNlbGVjdDsKKwlwLT5iaXRiYW5nLnNldHVwX3RyYW5zZmVyID0gc2hfbXNpb2Zfc3BpX3NldHVwX3RyYW5zZmVyOworCXAtPmJpdGJhbmcudHhyeF9idWZzID0gc2hfbXNpb2Zfc3BpX3R4cng7CisJcC0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfMF0gPSBzaF9tc2lvZl9zcGlfdHhyeF93b3JkOworCXAtPmJpdGJhbmcudHhyeF93b3JkW1NQSV9NT0RFXzFdID0gc2hfbXNpb2Zfc3BpX3R4cnhfd29yZDsKKwlwLT5iaXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8yXSA9IHNoX21zaW9mX3NwaV90eHJ4X3dvcmQ7CisJcC0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfM10gPSBzaF9tc2lvZl9zcGlfdHhyeF93b3JkOworCisJcmV0ID0gc3BpX2JpdGJhbmdfc3RhcnQoJnAtPmJpdGJhbmcpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CisgZXJyMzoKKwlpb3VubWFwKHAtPm1hcGJhc2UpOworIGVycjI6CisJY2xrX3B1dChwLT5jbGspOworIGVycjE6CisJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKKyBlcnIwOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2hfbXNpb2Zfc3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzaF9tc2lvZl9zcGlfcHJpdiAqcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCByZXQ7CisKKwlyZXQgPSBzcGlfYml0YmFuZ19zdG9wKCZwLT5iaXRiYW5nKTsKKwlpZiAoIXJldCkgeworCQlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CisJCWZyZWVfaXJxKHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCksIHNoX21zaW9mX3NwaV9pcnEpOworCQlpb3VubWFwKHAtPm1hcGJhc2UpOworCQljbGtfcHV0KHAtPmNsayk7CisJCXNwaV9tYXN0ZXJfcHV0KHAtPmJpdGJhbmcubWFzdGVyKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzaF9tc2lvZl9zcGlfcnVudGltZV9ub3Aoc3RydWN0IGRldmljZSAqZGV2KQoreworCS8qIFJ1bnRpbWUgUE0gY2FsbGJhY2sgc2hhcmVkIGJldHdlZW4gLT5ydW50aW1lX3N1c3BlbmQoKQorCSAqIGFuZCAtPnJ1bnRpbWVfcmVzdW1lKCkuIFNpbXBseSByZXR1cm5zIHN1Y2Nlc3MuCisJICoKKwkgKiBUaGlzIGRyaXZlciByZS1pbml0aWFsaXplcyBhbGwgcmVnaXN0ZXJzIGFmdGVyCisJICogcG1fcnVudGltZV9nZXRfc3luYygpIGFueXdheSBzbyB0aGVyZSBpcyBubyBuZWVkCisJICogdG8gc2F2ZSBhbmQgcmVzdG9yZSByZWdpc3RlcnMgaGVyZS4KKwkgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZfcG1fb3BzIHNoX21zaW9mX3NwaV9kZXZfcG1fb3BzID0geworCS5ydW50aW1lX3N1c3BlbmQgPSBzaF9tc2lvZl9zcGlfcnVudGltZV9ub3AsCisJLnJ1bnRpbWVfcmVzdW1lID0gc2hfbXNpb2Zfc3BpX3J1bnRpbWVfbm9wLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2hfbXNpb2Zfc3BpX2RydiA9IHsKKwkucHJvYmUJCT0gc2hfbXNpb2Zfc3BpX3Byb2JlLAorCS5yZW1vdmUJCT0gc2hfbXNpb2Zfc3BpX3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJCT0gInNwaV9zaF9tc2lvZiIsCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkJLnBtCQk9ICZzaF9tc2lvZl9zcGlfZGV2X3BtX29wcywKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2hfbXNpb2Zfc3BpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzaF9tc2lvZl9zcGlfZHJ2KTsKK30KK21vZHVsZV9pbml0KHNoX21zaW9mX3NwaV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHNoX21zaW9mX3NwaV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNoX21zaW9mX3NwaV9kcnYpOworfQorbW9kdWxlX2V4aXQoc2hfbXNpb2Zfc3BpX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlN1cGVySCBNU0lPRiBTUEkgTWFzdGVyIEludGVyZmFjZSBEcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIk1hZ251cyBEYW1tIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnNwaV9zaF9tc2lvZiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpZGV2LmMgYi9kcml2ZXJzL3NwaS9zcGlkZXYuYwppbmRleCAyMGQ3MzIyLi45YzQ0NmU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGlkZXYuYworKysgYi9kcml2ZXJzL3NwaS9zcGlkZXYuYwpAQCAtMjY2LDE1ICsyNjYsMTUgQEAKIAkJa190bXAtPmRlbGF5X3VzZWNzID0gdV90bXAtPmRlbGF5X3VzZWNzOwogCQlrX3RtcC0+c3BlZWRfaHogPSB1X3RtcC0+c3BlZWRfaHo7CiAjaWZkZWYgVkVSQk9TRQotCQlkZXZfZGJnKCZzcGktPmRldiwKKwkJZGV2X2RiZygmc3BpZGV2LT5zcGktPmRldiwKIAkJCSIgIHhmZXIgbGVuICV6ZCAlcyVzJXMlZGJpdHMgJXUgdXNlYyAldUh6XG4iLAogCQkJdV90bXAtPmxlbiwKIAkJCXVfdG1wLT5yeF9idWYgPyAicnggIiA6ICIiLAogCQkJdV90bXAtPnR4X2J1ZiA/ICJ0eCAiIDogIiIsCiAJCQl1X3RtcC0+Y3NfY2hhbmdlID8gImNzICIgOiAiIiwKLQkJCXVfdG1wLT5iaXRzX3Blcl93b3JkID8gOiBzcGktPmJpdHNfcGVyX3dvcmQsCisJCQl1X3RtcC0+Yml0c19wZXJfd29yZCA/IDogc3BpZGV2LT5zcGktPmJpdHNfcGVyX3dvcmQsCiAJCQl1X3RtcC0+ZGVsYXlfdXNlY3MsCi0JCQl1X3RtcC0+c3BlZWRfaHogPyA6IHNwaS0+bWF4X3NwZWVkX2h6KTsKKwkJCXVfdG1wLT5zcGVlZF9oeiA/IDogc3BpZGV2LT5zcGktPm1heF9zcGVlZF9oeik7CiAjZW5kaWYKIAkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoa190bXAsICZtc2cpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3hpbGlueF9zcGkuYyBiL2RyaXZlcnMvc3BpL3hpbGlueF9zcGkuYwppbmRleCA0NmI4YzVjLi45ZjM4NjM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS94aWxpbnhfc3BpLmMKKysrIGIvZHJpdmVycy9zcGkveGlsaW54X3NwaS5jCkBAIC0xNCwyMiArMTQsMjAgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L29mX3NwaS5oPgogCiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfYml0YmFuZy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKKyNpbmNsdWRlICJ4aWxpbnhfc3BpLmgiCisjaW5jbHVkZSA8bGludXgvc3BpL3hpbGlueF9zcGkuaD4KKwogI2RlZmluZSBYSUxJTlhfU1BJX05BTUUgInhpbGlueF9zcGkiCiAKIC8qIFJlZ2lzdGVyIGRlZmluaXRpb25zIGFzIHBlciAiT1BCIFNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoU1BJKSAodjEuMDBlKQogICogUHJvZHVjdCBTcGVjaWZpY2F0aW9uIiwgRFM0NjQKICAqLwotI2RlZmluZSBYU1BJX0NSX09GRlNFVAkJMHg2MgkvKiAxNi1iaXQgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBYU1BJX0NSX09GRlNFVAkJMHg2MAkvKiBDb250cm9sIFJlZ2lzdGVyICovCiAKICNkZWZpbmUgWFNQSV9DUl9FTkFCTEUJCTB4MDIKICNkZWZpbmUgWFNQSV9DUl9NQVNURVJfTU9ERQkweDA0CkBAIC00MCw4ICszOCw5IEBACiAjZGVmaW5lIFhTUElfQ1JfUlhGSUZPX1JFU0VUCTB4NDAKICNkZWZpbmUgWFNQSV9DUl9NQU5VQUxfU1NFTEVDVAkweDgwCiAjZGVmaW5lIFhTUElfQ1JfVFJBTlNfSU5ISUJJVAkweDEwMAorI2RlZmluZSBYU1BJX0NSX0xTQl9GSVJTVAkweDIwMAogCi0jZGVmaW5lIFhTUElfU1JfT0ZGU0VUCQkweDY3CS8qIDgtYml0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBYU1BJX1NSX09GRlNFVAkJMHg2NAkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KIAogI2RlZmluZSBYU1BJX1NSX1JYX0VNUFRZX01BU0sJMHgwMQkvKiBSZWNlaXZlIEZJRk8gaXMgZW1wdHkgKi8KICNkZWZpbmUgWFNQSV9TUl9SWF9GVUxMX01BU0sJMHgwMgkvKiBSZWNlaXZlIEZJRk8gaXMgZnVsbCAqLwpAQCAtNDksOCArNDgsOCBAQAogI2RlZmluZSBYU1BJX1NSX1RYX0ZVTExfTUFTSwkweDA4CS8qIFRyYW5zbWl0IEZJRk8gaXMgZnVsbCAqLwogI2RlZmluZSBYU1BJX1NSX01PREVfRkFVTFRfTUFTSwkweDEwCS8qIE1vZGUgZmF1bHQgZXJyb3IgKi8KIAotI2RlZmluZSBYU1BJX1RYRF9PRkZTRVQJCTB4NmIJLyogOC1iaXQgRGF0YSBUcmFuc21pdCBSZWdpc3RlciAqLwotI2RlZmluZSBYU1BJX1JYRF9PRkZTRVQJCTB4NmYJLyogOC1iaXQgRGF0YSBSZWNlaXZlIFJlZ2lzdGVyICovCisjZGVmaW5lIFhTUElfVFhEX09GRlNFVAkJMHg2OAkvKiBEYXRhIFRyYW5zbWl0IFJlZ2lzdGVyICovCisjZGVmaW5lIFhTUElfUlhEX09GRlNFVAkJMHg2YwkvKiBEYXRhIFJlY2VpdmUgUmVnaXN0ZXIgKi8KIAogI2RlZmluZSBYU1BJX1NTUl9PRkZTRVQJCTB4NzAJLyogMzItYml0IFNsYXZlIFNlbGVjdCBSZWdpc3RlciAqLwogCkBAIC03MCw2ICs2OSw3IEBACiAjZGVmaW5lIFhTUElfSU5UUl9UWF9VTkRFUlJVTgkJMHgwOAkvKiBUeEZJRk8gd2FzIHVuZGVycnVuICovCiAjZGVmaW5lIFhTUElfSU5UUl9SWF9GVUxMCQkweDEwCS8qIFJ4RklGTyBpcyBmdWxsICovCiAjZGVmaW5lIFhTUElfSU5UUl9SWF9PVkVSUlVOCQkweDIwCS8qIFJ4RklGTyB3YXMgb3ZlcnJ1biAqLworI2RlZmluZSBYU1BJX0lOVFJfVFhfSEFMRl9FTVBUWQkJMHg0MAkvKiBUeEZJRk8gaXMgaGFsZiBlbXB0eSAqLwogCiAjZGVmaW5lIFhJUElGX1YxMjNCX1JFU0VUUl9PRkZTRVQJMHg0MAkvKiBJUElGIHJlc2V0IHJlZ2lzdGVyICovCiAjZGVmaW5lIFhJUElGX1YxMjNCX1JFU0VUX01BU0sJCTB4MGEJLyogdGhlIHZhbHVlIHRvIHdyaXRlICovCkBAIC03OCwzNSArNzgsODUgQEAKIAkvKiBiaXRiYW5nIGhhcyB0byBiZSBmaXJzdCAqLwogCXN0cnVjdCBzcGlfYml0YmFuZyBiaXRiYW5nOwogCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7Ci0KKwlzdHJ1Y3QgcmVzb3VyY2UgbWVtOyAvKiBwaHlzIG1lbSAqLwogCXZvaWQgX19pb21lbQkqcmVnczsJLyogdmlydC4gYWRkcmVzcyBvZiB0aGUgY29udHJvbCByZWdpc3RlcnMgKi8KIAogCXUzMgkJaXJxOwogCi0JdTMyCQlzcGVlZF9oejsgLyogU0NLIGhhcyBhIGZpeGVkIGZyZXF1ZW5jeSBvZiBzcGVlZF9oeiBIeiAqLwotCiAJdTggKnJ4X3B0cjsJCS8qIHBvaW50ZXIgaW4gdGhlIFR4IGJ1ZmZlciAqLwogCWNvbnN0IHU4ICp0eF9wdHI7CS8qIHBvaW50ZXIgaW4gdGhlIFJ4IGJ1ZmZlciAqLwogCWludCByZW1haW5pbmdfYnl0ZXM7CS8qIHRoZSBudW1iZXIgb2YgYnl0ZXMgbGVmdCB0byB0cmFuc2ZlciAqLworCXU4IGJpdHNfcGVyX3dvcmQ7CisJdW5zaWduZWQgaW50ICgqcmVhZF9mbikgKHZvaWQgX19pb21lbSAqKTsKKwl2b2lkICgqd3JpdGVfZm4pICh1MzIsIHZvaWQgX19pb21lbSAqKTsKKwl2b2lkICgqdHhfZm4pIChzdHJ1Y3QgeGlsaW54X3NwaSAqKTsKKwl2b2lkICgqcnhfZm4pIChzdHJ1Y3QgeGlsaW54X3NwaSAqKTsKIH07CiAKLXN0YXRpYyB2b2lkIHhzcGlfaW5pdF9odyh2b2lkIF9faW9tZW0gKnJlZ3NfYmFzZSkKK3N0YXRpYyB2b2lkIHhzcGlfdHg4KHN0cnVjdCB4aWxpbnhfc3BpICp4c3BpKQogeworCXhzcGktPndyaXRlX2ZuKCp4c3BpLT50eF9wdHIsIHhzcGktPnJlZ3MgKyBYU1BJX1RYRF9PRkZTRVQpOworCXhzcGktPnR4X3B0cisrOworfQorCitzdGF0aWMgdm9pZCB4c3BpX3R4MTYoc3RydWN0IHhpbGlueF9zcGkgKnhzcGkpCit7CisJeHNwaS0+d3JpdGVfZm4oKih1MTYgKikoeHNwaS0+dHhfcHRyKSwgeHNwaS0+cmVncyArIFhTUElfVFhEX09GRlNFVCk7CisJeHNwaS0+dHhfcHRyICs9IDI7Cit9CisKK3N0YXRpYyB2b2lkIHhzcGlfdHgzMihzdHJ1Y3QgeGlsaW54X3NwaSAqeHNwaSkKK3sKKwl4c3BpLT53cml0ZV9mbigqKHUzMiAqKSh4c3BpLT50eF9wdHIpLCB4c3BpLT5yZWdzICsgWFNQSV9UWERfT0ZGU0VUKTsKKwl4c3BpLT50eF9wdHIgKz0gNDsKK30KKworc3RhdGljIHZvaWQgeHNwaV9yeDgoc3RydWN0IHhpbGlueF9zcGkgKnhzcGkpCit7CisJdTMyIGRhdGEgPSB4c3BpLT5yZWFkX2ZuKHhzcGktPnJlZ3MgKyBYU1BJX1JYRF9PRkZTRVQpOworCWlmICh4c3BpLT5yeF9wdHIpIHsKKwkJKnhzcGktPnJ4X3B0ciA9IGRhdGEgJiAweGZmOworCQl4c3BpLT5yeF9wdHIrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHhzcGlfcngxNihzdHJ1Y3QgeGlsaW54X3NwaSAqeHNwaSkKK3sKKwl1MzIgZGF0YSA9IHhzcGktPnJlYWRfZm4oeHNwaS0+cmVncyArIFhTUElfUlhEX09GRlNFVCk7CisJaWYgKHhzcGktPnJ4X3B0cikgeworCQkqKHUxNiAqKSh4c3BpLT5yeF9wdHIpID0gZGF0YSAmIDB4ZmZmZjsKKwkJeHNwaS0+cnhfcHRyICs9IDI7CisJfQorfQorCitzdGF0aWMgdm9pZCB4c3BpX3J4MzIoc3RydWN0IHhpbGlueF9zcGkgKnhzcGkpCit7CisJdTMyIGRhdGEgPSB4c3BpLT5yZWFkX2ZuKHhzcGktPnJlZ3MgKyBYU1BJX1JYRF9PRkZTRVQpOworCWlmICh4c3BpLT5yeF9wdHIpIHsKKwkJKih1MzIgKikoeHNwaS0+cnhfcHRyKSA9IGRhdGE7CisJCXhzcGktPnJ4X3B0ciArPSA0OworCX0KK30KKworc3RhdGljIHZvaWQgeHNwaV9pbml0X2h3KHN0cnVjdCB4aWxpbnhfc3BpICp4c3BpKQoreworCXZvaWQgX19pb21lbSAqcmVnc19iYXNlID0geHNwaS0+cmVnczsKKwogCS8qIFJlc2V0IHRoZSBTUEkgZGV2aWNlICovCi0Jb3V0X2JlMzIocmVnc19iYXNlICsgWElQSUZfVjEyM0JfUkVTRVRSX09GRlNFVCwKLQkJIFhJUElGX1YxMjNCX1JFU0VUX01BU0spOworCXhzcGktPndyaXRlX2ZuKFhJUElGX1YxMjNCX1JFU0VUX01BU0ssCisJCXJlZ3NfYmFzZSArIFhJUElGX1YxMjNCX1JFU0VUUl9PRkZTRVQpOwogCS8qIERpc2FibGUgYWxsIHRoZSBpbnRlcnJ1cHRzIGp1c3QgaW4gY2FzZSAqLwotCW91dF9iZTMyKHJlZ3NfYmFzZSArIFhJUElGX1YxMjNCX0lJRVJfT0ZGU0VULCAwKTsKKwl4c3BpLT53cml0ZV9mbigwLCByZWdzX2Jhc2UgKyBYSVBJRl9WMTIzQl9JSUVSX09GRlNFVCk7CiAJLyogRW5hYmxlIHRoZSBnbG9iYWwgSVBJRiBpbnRlcnJ1cHQgKi8KLQlvdXRfYmUzMihyZWdzX2Jhc2UgKyBYSVBJRl9WMTIzQl9ER0lFUl9PRkZTRVQsCi0JCSBYSVBJRl9WMTIzQl9HSU5UUl9FTkFCTEUpOworCXhzcGktPndyaXRlX2ZuKFhJUElGX1YxMjNCX0dJTlRSX0VOQUJMRSwKKwkJcmVnc19iYXNlICsgWElQSUZfVjEyM0JfREdJRVJfT0ZGU0VUKTsKIAkvKiBEZXNlbGVjdCB0aGUgc2xhdmUgb24gdGhlIFNQSSBidXMgKi8KLQlvdXRfYmUzMihyZWdzX2Jhc2UgKyBYU1BJX1NTUl9PRkZTRVQsIDB4ZmZmZik7CisJeHNwaS0+d3JpdGVfZm4oMHhmZmZmLCByZWdzX2Jhc2UgKyBYU1BJX1NTUl9PRkZTRVQpOwogCS8qIERpc2FibGUgdGhlIHRyYW5zbWl0dGVyLCBlbmFibGUgTWFudWFsIFNsYXZlIFNlbGVjdCBBc3NlcnRpb24sCiAJICogcHV0IFNQSSBjb250cm9sbGVyIGludG8gbWFzdGVyIG1vZGUsIGFuZCBlbmFibGUgaXQgKi8KLQlvdXRfYmUxNihyZWdzX2Jhc2UgKyBYU1BJX0NSX09GRlNFVCwKLQkJIFhTUElfQ1JfVFJBTlNfSU5ISUJJVCB8IFhTUElfQ1JfTUFOVUFMX1NTRUxFQ1QKLQkJIHwgWFNQSV9DUl9NQVNURVJfTU9ERSB8IFhTUElfQ1JfRU5BQkxFKTsKKwl4c3BpLT53cml0ZV9mbihYU1BJX0NSX1RSQU5TX0lOSElCSVQgfCBYU1BJX0NSX01BTlVBTF9TU0VMRUNUIHwKKwkJWFNQSV9DUl9NQVNURVJfTU9ERSB8IFhTUElfQ1JfRU5BQkxFIHwgWFNQSV9DUl9UWEZJRk9fUkVTRVQgfAorCQlYU1BJX0NSX1JYRklGT19SRVNFVCwgcmVnc19iYXNlICsgWFNQSV9DUl9PRkZTRVQpOwogfQogCiBzdGF0aWMgdm9pZCB4aWxpbnhfc3BpX2NoaXBzZWxlY3Qoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IGlzX29uKQpAQCAtMTE1LDE2ICsxNjUsMTYgQEAKIAogCWlmIChpc19vbiA9PSBCSVRCQU5HX0NTX0lOQUNUSVZFKSB7CiAJCS8qIERlc2VsZWN0IHRoZSBzbGF2ZSBvbiB0aGUgU1BJIGJ1cyAqLwotCQlvdXRfYmUzMih4c3BpLT5yZWdzICsgWFNQSV9TU1JfT0ZGU0VULCAweGZmZmYpOworCQl4c3BpLT53cml0ZV9mbigweGZmZmYsIHhzcGktPnJlZ3MgKyBYU1BJX1NTUl9PRkZTRVQpOwogCX0gZWxzZSBpZiAoaXNfb24gPT0gQklUQkFOR19DU19BQ1RJVkUpIHsKIAkJLyogU2V0IHRoZSBTUEkgY2xvY2sgcGhhc2UgYW5kIHBvbGFyaXR5ICovCi0JCXUxNiBjciA9IGluX2JlMTYoeHNwaS0+cmVncyArIFhTUElfQ1JfT0ZGU0VUKQorCQl1MTYgY3IgPSB4c3BpLT5yZWFkX2ZuKHhzcGktPnJlZ3MgKyBYU1BJX0NSX09GRlNFVCkKIAkJCSAmIH5YU1BJX0NSX01PREVfTUFTSzsKIAkJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUEhBKQogCQkJY3IgfD0gWFNQSV9DUl9DUEhBOwogCQlpZiAoc3BpLT5tb2RlICYgU1BJX0NQT0wpCiAJCQljciB8PSBYU1BJX0NSX0NQT0w7Ci0JCW91dF9iZTE2KHhzcGktPnJlZ3MgKyBYU1BJX0NSX09GRlNFVCwgY3IpOworCQl4c3BpLT53cml0ZV9mbihjciwgeHNwaS0+cmVncyArIFhTUElfQ1JfT0ZGU0VUKTsKIAogCQkvKiBXZSBkbyBub3QgY2hlY2sgc3BpLT5tYXhfc3BlZWRfaHogaGVyZSBhcyB0aGUgU1BJIGNsb2NrCiAJCSAqIGZyZXF1ZW5jeSBpcyBub3Qgc29mdHdhcmUgcHJvZ3JhbW1hYmxlICh0aGUgSVAgYmxvY2sgZGVzaWduCkBAIC0xMzIsMjQgKzE4MiwyNyBAQAogCQkgKi8KIAogCQkvKiBBY3RpdmF0ZSB0aGUgY2hpcCBzZWxlY3QgKi8KLQkJb3V0X2JlMzIoeHNwaS0+cmVncyArIFhTUElfU1NSX09GRlNFVCwKLQkJCSB+KDB4MDAwMSA8PCBzcGktPmNoaXBfc2VsZWN0KSk7CisJCXhzcGktPndyaXRlX2ZuKH4oMHgwMDAxIDw8IHNwaS0+Y2hpcF9zZWxlY3QpLAorCQkJeHNwaS0+cmVncyArIFhTUElfU1NSX09GRlNFVCk7CiAJfQogfQogCiAvKiBzcGlfYml0YmFuZyByZXF1aXJlcyBjdXN0b20gc2V0dXBfdHJhbnNmZXIoKSB0byBiZSBkZWZpbmVkIGlmIHRoZXJlIGlzIGEKICAqIGN1c3RvbSB0eHJ4X2J1ZnMoKS4gV2UgaGF2ZSBub3RoaW5nIHRvIHNldHVwIGhlcmUgYXMgdGhlIFNQSSBJUCBibG9jawotICogc3VwcG9ydHMganVzdCA4IGJpdHMgcGVyIHdvcmQsIGFuZCBTUEkgY2xvY2sgY2FuJ3QgYmUgY2hhbmdlZCBpbiBzb2Z0d2FyZS4KLSAqIENoZWNrIGZvciA4IGJpdHMgcGVyIHdvcmQuIENoaXAgc2VsZWN0IGRlbGF5IGNhbGN1bGF0aW9ucyBjb3VsZCBiZQorICogc3VwcG9ydHMgOCBvciAxNiBiaXRzIHBlciB3b3JkIHdoaWNoIGNhbm5vdCBiZSBjaGFuZ2VkIGluIHNvZnR3YXJlLgorICogU1BJIGNsb2NrIGNhbid0IGJlIGNoYW5nZWQgaW4gc29mdHdhcmUgZWl0aGVyLgorICogQ2hlY2sgZm9yIGNvcnJlY3QgYml0cyBwZXIgd29yZC4gQ2hpcCBzZWxlY3QgZGVsYXkgY2FsY3VsYXRpb25zIGNvdWxkIGJlCiAgKiBhZGRlZCBoZXJlIGFzIHNvb24gYXMgYml0YmFuZ193b3JrKCkgY2FuIGJlIG1hZGUgYXdhcmUgb2YgdGhlIGRlbGF5IHZhbHVlLgogICovCiBzdGF0aWMgaW50IHhpbGlueF9zcGlfc2V0dXBfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKIAkJc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKIHsKKwlzdHJ1Y3QgeGlsaW54X3NwaSAqeHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwogCXU4IGJpdHNfcGVyX3dvcmQ7CiAKLQliaXRzX3Blcl93b3JkID0gKHQpID8gdC0+Yml0c19wZXJfd29yZCA6IHNwaS0+Yml0c19wZXJfd29yZDsKLQlpZiAoYml0c19wZXJfd29yZCAhPSA4KSB7CisJYml0c19wZXJfd29yZCA9ICh0ICYmIHQtPmJpdHNfcGVyX3dvcmQpCisJCQkgPyB0LT5iaXRzX3Blcl93b3JkIDogc3BpLT5iaXRzX3Blcl93b3JkOworCWlmIChiaXRzX3Blcl93b3JkICE9IHhzcGktPmJpdHNfcGVyX3dvcmQpIHsKIAkJZGV2X2Vycigmc3BpLT5kZXYsICIlcywgdW5zdXBwb3J0ZWQgYml0c19wZXJfd29yZD0lZFxuIiwKIAkJCV9fZnVuY19fLCBiaXRzX3Blcl93b3JkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNjAsMTcgKzIxMywxNiBAQAogCiBzdGF0aWMgaW50IHhpbGlueF9zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKLQlzdHJ1Y3Qgc3BpX2JpdGJhbmcgKmJpdGJhbmc7Ci0Jc3RydWN0IHhpbGlueF9zcGkgKnhzcGk7Ci0JaW50IHJldHZhbDsKLQotCXhzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQliaXRiYW5nID0gJnhzcGktPmJpdGJhbmc7Ci0KLQlyZXR2YWwgPSB4aWxpbnhfc3BpX3NldHVwX3RyYW5zZmVyKHNwaSwgTlVMTCk7Ci0JaWYgKHJldHZhbCA8IDApCi0JCXJldHVybiByZXR2YWw7Ci0KKwkvKiBhbHdheXMgcmV0dXJuIDAsIHdlIGNhbiBub3QgY2hlY2sgdGhlIG51bWJlciBvZiBiaXRzLgorCSAqIFRoZXJlIGFyZSBjYXNlcyB3aGVuIFNQSSBzZXR1cCBpcyBjYWxsZWQgYmVmb3JlIGFueSBkcml2ZXIgaXMKKwkgKiB0aGVyZSwgaW4gdGhhdCBjYXNlIHRoZSBTUEkgY29yZSBkZWZhdWx0cyB0byA4IGJpdHMsIHdoaWNoIHdlCisJICogZG8gbm90IHN1cHBvcnQgaW4gc29tZSBjYXNlcy4gQnV0IGlmIHdlIHJldHVybiBhbiBlcnJvciwgdGhlCisJICogU1BJIGRldmljZSB3b3VsZCBub3QgYmUgcmVnaXN0ZXJlZCBhbmQgbm8gZHJpdmVyIGNhbiBnZXQgaG9sZCBvZiBpdAorCSAqIFdoZW4gdGhlIGRyaXZlciBpcyB0aGVyZSwgaXQgd2lsbCBjYWxsIFNQSSBzZXR1cCBhZ2FpbiB3aXRoIHRoZQorCSAqIGNvcnJlY3QgbnVtYmVyIG9mIGJpdHMgcGVyIHRyYW5zZmVyLgorCSAqIElmIGEgZHJpdmVyIHNldHVwcyB3aXRoIHRoZSB3cm9uZyBiaXQgbnVtYmVyLCBpdCB3aWxsIGZhaWwgd2hlbgorCSAqIGl0IHRyaWVzIHRvIGRvIGEgdHJhbnNmZXIKKwkgKi8KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTc5LDE1ICsyMzEsMTQgQEAKIAl1OCBzcjsKIAogCS8qIEZpbGwgdGhlIFR4IEZJRk8gd2l0aCBhcyBtYW55IGJ5dGVzIGFzIHBvc3NpYmxlICovCi0Jc3IgPSBpbl84KHhzcGktPnJlZ3MgKyBYU1BJX1NSX09GRlNFVCk7CisJc3IgPSB4c3BpLT5yZWFkX2ZuKHhzcGktPnJlZ3MgKyBYU1BJX1NSX09GRlNFVCk7CiAJd2hpbGUgKChzciAmIFhTUElfU1JfVFhfRlVMTF9NQVNLKSA9PSAwICYmIHhzcGktPnJlbWFpbmluZ19ieXRlcyA+IDApIHsKLQkJaWYgKHhzcGktPnR4X3B0cikgewotCQkJb3V0XzgoeHNwaS0+cmVncyArIFhTUElfVFhEX09GRlNFVCwgKnhzcGktPnR4X3B0cisrKTsKLQkJfSBlbHNlIHsKLQkJCW91dF84KHhzcGktPnJlZ3MgKyBYU1BJX1RYRF9PRkZTRVQsIDApOwotCQl9Ci0JCXhzcGktPnJlbWFpbmluZ19ieXRlcy0tOwotCQlzciA9IGluXzgoeHNwaS0+cmVncyArIFhTUElfU1JfT0ZGU0VUKTsKKwkJaWYgKHhzcGktPnR4X3B0cikKKwkJCXhzcGktPnR4X2ZuKHhzcGkpOworCQllbHNlCisJCQl4c3BpLT53cml0ZV9mbigwLCB4c3BpLT5yZWdzICsgWFNQSV9UWERfT0ZGU0VUKTsKKwkJeHNwaS0+cmVtYWluaW5nX2J5dGVzIC09IHhzcGktPmJpdHNfcGVyX3dvcmQgLyA4OworCQlzciA9IHhzcGktPnJlYWRfZm4oeHNwaS0+cmVncyArIFhTUElfU1JfT0ZGU0VUKTsKIAl9CiB9CiAKQEAgLTIwOSwxOCArMjYwLDE5IEBACiAJLyogRW5hYmxlIHRoZSB0cmFuc21pdCBlbXB0eSBpbnRlcnJ1cHQsIHdoaWNoIHdlIHVzZSB0byBkZXRlcm1pbmUKIAkgKiBwcm9ncmVzcyBvbiB0aGUgdHJhbnNtaXNzaW9uLgogCSAqLwotCWlwaWZfaWVyID0gaW5fYmUzMih4c3BpLT5yZWdzICsgWElQSUZfVjEyM0JfSUlFUl9PRkZTRVQpOwotCW91dF9iZTMyKHhzcGktPnJlZ3MgKyBYSVBJRl9WMTIzQl9JSUVSX09GRlNFVCwKLQkJIGlwaWZfaWVyIHwgWFNQSV9JTlRSX1RYX0VNUFRZKTsKKwlpcGlmX2llciA9IHhzcGktPnJlYWRfZm4oeHNwaS0+cmVncyArIFhJUElGX1YxMjNCX0lJRVJfT0ZGU0VUKTsKKwl4c3BpLT53cml0ZV9mbihpcGlmX2llciB8IFhTUElfSU5UUl9UWF9FTVBUWSwKKwkJeHNwaS0+cmVncyArIFhJUElGX1YxMjNCX0lJRVJfT0ZGU0VUKTsKIAogCS8qIFN0YXJ0IHRoZSB0cmFuc2ZlciBieSBub3QgaW5oaWJpdGluZyB0aGUgdHJhbnNtaXR0ZXIgYW55IGxvbmdlciAqLwotCWNyID0gaW5fYmUxNih4c3BpLT5yZWdzICsgWFNQSV9DUl9PRkZTRVQpICYgflhTUElfQ1JfVFJBTlNfSU5ISUJJVDsKLQlvdXRfYmUxNih4c3BpLT5yZWdzICsgWFNQSV9DUl9PRkZTRVQsIGNyKTsKKwljciA9IHhzcGktPnJlYWRfZm4oeHNwaS0+cmVncyArIFhTUElfQ1JfT0ZGU0VUKSAmCisJCX5YU1BJX0NSX1RSQU5TX0lOSElCSVQ7CisJeHNwaS0+d3JpdGVfZm4oY3IsIHhzcGktPnJlZ3MgKyBYU1BJX0NSX09GRlNFVCk7CiAKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ4c3BpLT5kb25lKTsKIAogCS8qIERpc2FibGUgdGhlIHRyYW5zbWl0IGVtcHR5IGludGVycnVwdCAqLwotCW91dF9iZTMyKHhzcGktPnJlZ3MgKyBYSVBJRl9WMTIzQl9JSUVSX09GRlNFVCwgaXBpZl9pZXIpOworCXhzcGktPndyaXRlX2ZuKGlwaWZfaWVyLCB4c3BpLT5yZWdzICsgWElQSUZfVjEyM0JfSUlFUl9PRkZTRVQpOwogCiAJcmV0dXJuIHQtPmxlbiAtIHhzcGktPnJlbWFpbmluZ19ieXRlczsKIH0KQEAgLTIzNyw4ICsyODksOCBAQAogCXUzMiBpcGlmX2lzcjsKIAogCS8qIEdldCB0aGUgSVBJRiBpbnRlcnJ1cHRzLCBhbmQgY2xlYXIgdGhlbSBpbW1lZGlhdGVseSAqLwotCWlwaWZfaXNyID0gaW5fYmUzMih4c3BpLT5yZWdzICsgWElQSUZfVjEyM0JfSUlTUl9PRkZTRVQpOwotCW91dF9iZTMyKHhzcGktPnJlZ3MgKyBYSVBJRl9WMTIzQl9JSVNSX09GRlNFVCwgaXBpZl9pc3IpOworCWlwaWZfaXNyID0geHNwaS0+cmVhZF9mbih4c3BpLT5yZWdzICsgWElQSUZfVjEyM0JfSUlTUl9PRkZTRVQpOworCXhzcGktPndyaXRlX2ZuKGlwaWZfaXNyLCB4c3BpLT5yZWdzICsgWElQSUZfVjEyM0JfSUlTUl9PRkZTRVQpOwogCiAJaWYgKGlwaWZfaXNyICYgWFNQSV9JTlRSX1RYX0VNUFRZKSB7CS8qIFRyYW5zbWlzc2lvbiBjb21wbGV0ZWQgKi8KIAkJdTE2IGNyOwpAQCAtMjQ5LDIwICszMDEsMTUgQEAKIAkJICogdHJhbnNtaXR0ZXIgd2hpbGUgdGhlIElzciByZWZpbGxzIHRoZSB0cmFuc21pdCByZWdpc3Rlci9GSUZPLAogCQkgKiBvciBtYWtlIHN1cmUgaXQgaXMgc3RvcHBlZCBpZiB3ZSdyZSBkb25lLgogCQkgKi8KLQkJY3IgPSBpbl9iZTE2KHhzcGktPnJlZ3MgKyBYU1BJX0NSX09GRlNFVCk7Ci0JCW91dF9iZTE2KHhzcGktPnJlZ3MgKyBYU1BJX0NSX09GRlNFVCwKLQkJCSBjciB8IFhTUElfQ1JfVFJBTlNfSU5ISUJJVCk7CisJCWNyID0geHNwaS0+cmVhZF9mbih4c3BpLT5yZWdzICsgWFNQSV9DUl9PRkZTRVQpOworCQl4c3BpLT53cml0ZV9mbihjciB8IFhTUElfQ1JfVFJBTlNfSU5ISUJJVCwKKwkJCXhzcGktPnJlZ3MgKyBYU1BJX0NSX09GRlNFVCk7CiAKIAkJLyogUmVhZCBvdXQgYWxsIHRoZSBkYXRhIGZyb20gdGhlIFJ4IEZJRk8gKi8KLQkJc3IgPSBpbl84KHhzcGktPnJlZ3MgKyBYU1BJX1NSX09GRlNFVCk7CisJCXNyID0geHNwaS0+cmVhZF9mbih4c3BpLT5yZWdzICsgWFNQSV9TUl9PRkZTRVQpOwogCQl3aGlsZSAoKHNyICYgWFNQSV9TUl9SWF9FTVBUWV9NQVNLKSA9PSAwKSB7Ci0JCQl1OCBkYXRhOwotCi0JCQlkYXRhID0gaW5fOCh4c3BpLT5yZWdzICsgWFNQSV9SWERfT0ZGU0VUKTsKLQkJCWlmICh4c3BpLT5yeF9wdHIpIHsKLQkJCQkqeHNwaS0+cnhfcHRyKysgPSBkYXRhOwotCQkJfQotCQkJc3IgPSBpbl84KHhzcGktPnJlZ3MgKyBYU1BJX1NSX09GRlNFVCk7CisJCQl4c3BpLT5yeF9mbih4c3BpKTsKKwkJCXNyID0geHNwaS0+cmVhZF9mbih4c3BpLT5yZWdzICsgWFNQSV9TUl9PRkZTRVQpOwogCQl9CiAKIAkJLyogU2VlIGlmIHRoZXJlIGlzIG1vcmUgZGF0YSB0byBzZW5kICovCkBAIC0yNzEsNyArMzE4LDcgQEAKIAkJCS8qIFN0YXJ0IHRoZSB0cmFuc2ZlciBieSBub3QgaW5oaWJpdGluZyB0aGUKIAkJCSAqIHRyYW5zbWl0dGVyIGFueSBsb25nZXIKIAkJCSAqLwotCQkJb3V0X2JlMTYoeHNwaS0+cmVncyArIFhTUElfQ1JfT0ZGU0VULCBjcik7CisJCQl4c3BpLT53cml0ZV9mbihjciwgeHNwaS0+cmVncyArIFhTUElfQ1JfT0ZGU0VUKTsKIAkJfSBlbHNlIHsKIAkJCS8qIE5vIG1vcmUgZGF0YSB0byBzZW5kLgogCQkJICogSW5kaWNhdGUgdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlZC4KQEAgLTI4Myw0MCArMzMwLDIyIEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCB4aWxpbnhfc3BpX29mX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2LAotCQkJCQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKK3N0cnVjdCBzcGlfbWFzdGVyICp4aWxpbnhfc3BpX2luaXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKm1lbSwKKwl1MzIgaXJxLCBzMTYgYnVzX251bSkKIHsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwogCXN0cnVjdCB4aWxpbnhfc3BpICp4c3BpOwotCXN0cnVjdCByZXNvdXJjZSByX2lycV9zdHJ1Y3Q7Ci0Jc3RydWN0IHJlc291cmNlIHJfbWVtX3N0cnVjdDsKKwlzdHJ1Y3QgeHNwaV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKwlpbnQgcmV0OwogCi0Jc3RydWN0IHJlc291cmNlICpyX2lycSA9ICZyX2lycV9zdHJ1Y3Q7Ci0Jc3RydWN0IHJlc291cmNlICpyX21lbSA9ICZyX21lbV9zdHJ1Y3Q7Ci0JaW50IHJjID0gMDsKLQljb25zdCB1MzIgKnByb3A7Ci0JaW50IGxlbjsKLQotCS8qIEdldCByZXNvdXJjZXMobWVtb3J5LCBJUlEpIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlICovCi0JbWFzdGVyID0gc3BpX2FsbG9jX21hc3Rlcigmb2ZkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB4aWxpbnhfc3BpKSk7Ci0KLQlpZiAobWFzdGVyID09IE5VTEwpIHsKLQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCFwZGF0YSkgeworCQlkZXZfZXJyKGRldiwgIk5vIHBsYXRmb3JtIGRhdGEgYXR0YWNoZWRcbiIpOworCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlkZXZfc2V0X2RydmRhdGEoJm9mZGV2LT5kZXYsIG1hc3Rlcik7Ci0KLQlyYyA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uob2ZkZXYtPm5vZGUsIDAsIHJfbWVtKTsKLQlpZiAocmMpIHsKLQkJZGV2X3dhcm4oJm9mZGV2LT5kZXYsICJpbnZhbGlkIGFkZHJlc3NcbiIpOwotCQlnb3RvIHB1dF9tYXN0ZXI7Ci0JfQotCi0JcmMgPSBvZl9pcnFfdG9fcmVzb3VyY2Uob2ZkZXYtPm5vZGUsIDAsIHJfaXJxKTsKLQlpZiAocmMgPT0gTk9fSVJRKSB7Ci0JCWRldl93YXJuKCZvZmRldi0+ZGV2LCAibm8gSVJRIGZvdW5kXG4iKTsKLQkJZ290byBwdXRfbWFzdGVyOwotCX0KKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKGRldiwgc2l6ZW9mKHN0cnVjdCB4aWxpbnhfc3BpKSk7CisJaWYgKCFtYXN0ZXIpCisJCXJldHVybiBOVUxMOwogCiAJLyogdGhlIHNwaS0+bW9kZSBiaXRzIHVuZGVyc3Rvb2QgYnkgdGhpcyBkcml2ZXI6ICovCiAJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BPTCB8IFNQSV9DUEhBOwpAQCAtMzI5LDEyOCArMzU4LDg3IEBACiAJeHNwaS0+Yml0YmFuZy5tYXN0ZXItPnNldHVwID0geGlsaW54X3NwaV9zZXR1cDsKIAlpbml0X2NvbXBsZXRpb24oJnhzcGktPmRvbmUpOwogCi0JeHNwaS0+aXJxID0gcl9pcnEtPnN0YXJ0OwotCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocl9tZW0tPnN0YXJ0LAotCQkJcl9tZW0tPmVuZCAtIHJfbWVtLT5zdGFydCArIDEsIFhJTElOWF9TUElfTkFNRSkpIHsKLQkJcmMgPSAtRU5YSU87Ci0JCWRldl93YXJuKCZvZmRldi0+ZGV2LCAibWVtb3J5IHJlcXVlc3QgZmFpbHVyZVxuIik7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24obWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW0pLAorCQlYSUxJTlhfU1BJX05BTUUpKQogCQlnb3RvIHB1dF9tYXN0ZXI7Ci0JfQogCi0JeHNwaS0+cmVncyA9IGlvcmVtYXAocl9tZW0tPnN0YXJ0LCByX21lbS0+ZW5kIC0gcl9tZW0tPnN0YXJ0ICsgMSk7CisJeHNwaS0+cmVncyA9IGlvcmVtYXAobWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW0pKTsKIAlpZiAoeHNwaS0+cmVncyA9PSBOVUxMKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZGV2X3dhcm4oJm9mZGV2LT5kZXYsICJpb3JlbWFwIGZhaWx1cmVcbiIpOwotCQlnb3RvIHJlbGVhc2VfbWVtOworCQlkZXZfd2FybihkZXYsICJpb3JlbWFwIGZhaWx1cmVcbiIpOworCQlnb3RvIG1hcF9mYWlsZWQ7CiAJfQotCXhzcGktPmlycSA9IHJfaXJxLT5zdGFydDsKIAotCS8qIGR5bmFtaWMgYnVzIGFzc2lnbm1lbnQgKi8KLQltYXN0ZXItPmJ1c19udW0gPSAtMTsKKwltYXN0ZXItPmJ1c19udW0gPSBidXNfbnVtOworCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBwZGF0YS0+bnVtX2NoaXBzZWxlY3Q7CiAKLQkvKiBudW1iZXIgb2Ygc2xhdmUgc2VsZWN0IGJpdHMgaXMgcmVxdWlyZWQgKi8KLQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG9mZGV2LT5ub2RlLCAieGxueCxudW0tc3MtYml0cyIsICZsZW4pOwotCWlmICghcHJvcCB8fCBsZW4gPCBzaXplb2YoKnByb3ApKSB7Ci0JCWRldl93YXJuKCZvZmRldi0+ZGV2LCAibm8gJ3hsbngsbnVtLXNzLWJpdHMnIHByb3BlcnR5XG4iKTsKKwl4c3BpLT5tZW0gPSAqbWVtOworCXhzcGktPmlycSA9IGlycTsKKwlpZiAocGRhdGEtPmxpdHRsZV9lbmRpYW4pIHsKKwkJeHNwaS0+cmVhZF9mbiA9IGlvcmVhZDMyOworCQl4c3BpLT53cml0ZV9mbiA9IGlvd3JpdGUzMjsKKwl9IGVsc2UgeworCQl4c3BpLT5yZWFkX2ZuID0gaW9yZWFkMzJiZTsKKwkJeHNwaS0+d3JpdGVfZm4gPSBpb3dyaXRlMzJiZTsKKwl9CisJeHNwaS0+Yml0c19wZXJfd29yZCA9IHBkYXRhLT5iaXRzX3Blcl93b3JkOworCWlmICh4c3BpLT5iaXRzX3Blcl93b3JkID09IDgpIHsKKwkJeHNwaS0+dHhfZm4gPSB4c3BpX3R4ODsKKwkJeHNwaS0+cnhfZm4gPSB4c3BpX3J4ODsKKwl9IGVsc2UgaWYgKHhzcGktPmJpdHNfcGVyX3dvcmQgPT0gMTYpIHsKKwkJeHNwaS0+dHhfZm4gPSB4c3BpX3R4MTY7CisJCXhzcGktPnJ4X2ZuID0geHNwaV9yeDE2OworCX0gZWxzZSBpZiAoeHNwaS0+Yml0c19wZXJfd29yZCA9PSAzMikgeworCQl4c3BpLT50eF9mbiA9IHhzcGlfdHgzMjsKKwkJeHNwaS0+cnhfZm4gPSB4c3BpX3J4MzI7CisJfSBlbHNlCiAJCWdvdG8gdW5tYXBfaW87Ci0JfQotCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSAqcHJvcDsKKwogCiAJLyogU1BJIGNvbnRyb2xsZXIgaW5pdGlhbGl6YXRpb25zICovCi0JeHNwaV9pbml0X2h3KHhzcGktPnJlZ3MpOworCXhzcGlfaW5pdF9odyh4c3BpKTsKIAogCS8qIFJlZ2lzdGVyIGZvciBTUEkgSW50ZXJydXB0ICovCi0JcmMgPSByZXF1ZXN0X2lycSh4c3BpLT5pcnEsIHhpbGlueF9zcGlfaXJxLCAwLCBYSUxJTlhfU1BJX05BTUUsIHhzcGkpOwotCWlmIChyYyAhPSAwKSB7Ci0JCWRldl93YXJuKCZvZmRldi0+ZGV2LCAiaXJxIHJlcXVlc3QgZmFpbHVyZTogJWRcbiIsIHhzcGktPmlycSk7CisJcmV0ID0gcmVxdWVzdF9pcnEoeHNwaS0+aXJxLCB4aWxpbnhfc3BpX2lycSwgMCwgWElMSU5YX1NQSV9OQU1FLCB4c3BpKTsKKwlpZiAocmV0KQogCQlnb3RvIHVubWFwX2lvOwotCX0KIAotCXJjID0gc3BpX2JpdGJhbmdfc3RhcnQoJnhzcGktPmJpdGJhbmcpOwotCWlmIChyYyAhPSAwKSB7Ci0JCWRldl9lcnIoJm9mZGV2LT5kZXYsICJzcGlfYml0YmFuZ19zdGFydCBGQUlMRURcbiIpOworCXJldCA9IHNwaV9iaXRiYW5nX3N0YXJ0KCZ4c3BpLT5iaXRiYW5nKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAic3BpX2JpdGJhbmdfc3RhcnQgRkFJTEVEXG4iKTsKIAkJZ290byBmcmVlX2lycTsKIAl9CiAKLQlkZXZfaW5mbygmb2ZkZXYtPmRldiwgImF0IDB4JTA4WCBtYXBwZWQgdG8gMHglMDhYLCBpcnE9JWRcbiIsCi0JCQkodW5zaWduZWQgaW50KXJfbWVtLT5zdGFydCwgKHUzMil4c3BpLT5yZWdzLCB4c3BpLT5pcnEpOwotCi0JLyogQWRkIGFueSBzdWJub2RlcyBvbiB0aGUgU1BJIGJ1cyAqLwotCW9mX3JlZ2lzdGVyX3NwaV9kZXZpY2VzKG1hc3Rlciwgb2ZkZXYtPm5vZGUpOwotCi0JcmV0dXJuIHJjOworCWRldl9pbmZvKGRldiwgImF0IDB4JTA4bGxYIG1hcHBlZCB0byAweCVwLCBpcnE9JWRcbiIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpbWVtLT5zdGFydCwgeHNwaS0+cmVncywgeHNwaS0+aXJxKTsKKwlyZXR1cm4gbWFzdGVyOwogCiBmcmVlX2lycToKIAlmcmVlX2lycSh4c3BpLT5pcnEsIHhzcGkpOwogdW5tYXBfaW86CiAJaW91bm1hcCh4c3BpLT5yZWdzKTsKLXJlbGVhc2VfbWVtOgotCXJlbGVhc2VfbWVtX3JlZ2lvbihyX21lbS0+c3RhcnQsIHJlc291cmNlX3NpemUocl9tZW0pKTsKK21hcF9mYWlsZWQ6CisJcmVsZWFzZV9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSk7CiBwdXRfbWFzdGVyOgogCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7Ci0JcmV0dXJuIHJjOworCXJldHVybiBOVUxMOwogfQorRVhQT1JUX1NZTUJPTCh4aWxpbnhfc3BpX2luaXQpOwogCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCB4aWxpbnhfc3BpX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldikKK3ZvaWQgeGlsaW54X3NwaV9kZWluaXQoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcikKIHsKIAlzdHJ1Y3QgeGlsaW54X3NwaSAqeHNwaTsKLQlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwotCXN0cnVjdCByZXNvdXJjZSByX21lbTsKIAotCW1hc3RlciA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKG9mZGV2KTsKIAl4c3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwogCiAJc3BpX2JpdGJhbmdfc3RvcCgmeHNwaS0+Yml0YmFuZyk7CiAJZnJlZV9pcnEoeHNwaS0+aXJxLCB4c3BpKTsKIAlpb3VubWFwKHhzcGktPnJlZ3MpOwotCWlmICghb2ZfYWRkcmVzc190b19yZXNvdXJjZShvZmRldi0+bm9kZSwgMCwgJnJfbWVtKSkKLQkJcmVsZWFzZV9tZW1fcmVnaW9uKHJfbWVtLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZyX21lbSkpOwotCWRldl9zZXRfZHJ2ZGF0YSgmb2ZkZXYtPmRldiwgMCk7CisKKwlyZWxlYXNlX21lbV9yZWdpb24oeHNwaS0+bWVtLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZ4c3BpLT5tZW0pKTsKIAlzcGlfbWFzdGVyX3B1dCh4c3BpLT5iaXRiYW5nLm1hc3Rlcik7Ci0KLQlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woeGlsaW54X3NwaV9kZWluaXQpOwogCi0vKiB3b3JrIHdpdGggaG90cGx1ZyBhbmQgY29sZHBsdWcgKi8KLU1PRFVMRV9BTElBUygicGxhdGZvcm06IiBYSUxJTlhfU1BJX05BTUUpOwotCi1zdGF0aWMgaW50IF9fZXhpdCB4aWxpbnhfc3BpX29mX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCkKLXsKLQlyZXR1cm4geGlsaW54X3NwaV9yZW1vdmUob3ApOwotfQotCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCB4aWxpbnhfc3BpX29mX21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJ4bG54LHhwcy1zcGktMi4wMC5hIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gInhsbngseHBzLXNwaS0yLjAwLmIiLCB9LAotCXt9Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB4aWxpbnhfc3BpX29mX21hdGNoKTsKLQotc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgeGlsaW54X3NwaV9vZl9kcml2ZXIgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm5hbWUgPSAieGlsaW54LXhwcy1zcGkiLAotCS5tYXRjaF90YWJsZSA9IHhpbGlueF9zcGlfb2ZfbWF0Y2gsCi0JLnByb2JlID0geGlsaW54X3NwaV9vZl9wcm9iZSwKLQkucmVtb3ZlID0gX19leGl0X3AoeGlsaW54X3NwaV9vZl9yZW1vdmUpLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gInhpbGlueC14cHMtc3BpIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHhpbGlueF9zcGlfaW5pdCh2b2lkKQotewotCXJldHVybiBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJnhpbGlueF9zcGlfb2ZfZHJpdmVyKTsKLX0KLW1vZHVsZV9pbml0KHhpbGlueF9zcGlfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB4aWxpbnhfc3BpX2V4aXQodm9pZCkKLXsKLQlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmeGlsaW54X3NwaV9vZl9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQoeGlsaW54X3NwaV9leGl0KTsKIE1PRFVMRV9BVVRIT1IoIk1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gPHNvdXJjZUBtdmlzdGEuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJYaWxpbnggU1BJIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkveGlsaW54X3NwaS5oIGIvZHJpdmVycy9zcGkveGlsaW54X3NwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMTFhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS94aWxpbnhfc3BpLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIFhpbGlueCBTUEkgZGV2aWNlIGRyaXZlciBBUEkgYW5kIHBsYXRmb3JtIGRhdGEgaGVhZGVyIGZpbGUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9YSUxJTlhfU1BJX0hfCisjZGVmaW5lIF9YSUxJTlhfU1BJX0hfCisKKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CisKKyNkZWZpbmUgWElMSU5YX1NQSV9OQU1FICJ4aWxpbnhfc3BpIgorCitzdHJ1Y3Qgc3BpX21hc3RlciAqeGlsaW54X3NwaV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJlc291cmNlICptZW0sCisJdTMyIGlycSwgczE2IGJ1c19udW0pOworCit2b2lkIHhpbGlueF9zcGlfZGVpbml0KHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS94aWxpbnhfc3BpX29mLmMgYi9kcml2ZXJzL3NwaS94aWxpbnhfc3BpX29mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFkYzNhZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3hpbGlueF9zcGlfb2YuYwpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIFhpbGlueCBTUEkgT0YgZGV2aWNlIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qIFN1cHBvcnRzOgorICogWGlsaW54IFNQSSBkZXZpY2VzIGFzIE9GIGRldmljZXMKKyAqCisgKiBJbnNwaXJlZCBieSB4aWxpbnhfc3BpLmMsIDIwMDItMjAwNyAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb2Zfc3BpLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zcGkveGlsaW54X3NwaS5oPgorI2luY2x1ZGUgInhpbGlueF9zcGkuaCIKKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB4aWxpbnhfc3BpX29mX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2LAorCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IHhzcGlfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IHJlc291cmNlIHJfbWVtOworCXN0cnVjdCByZXNvdXJjZSByX2lycTsKKwlpbnQgcmMgPSAwOworCWNvbnN0IHUzMiAqcHJvcDsKKwlpbnQgbGVuOworCisJcmMgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG9mZGV2LT5ub2RlLCAwLCAmcl9tZW0pOworCWlmIChyYykgeworCQlkZXZfd2Fybigmb2ZkZXYtPmRldiwgImludmFsaWQgYWRkcmVzc1xuIik7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IG9mX2lycV90b19yZXNvdXJjZShvZmRldi0+bm9kZSwgMCwgJnJfaXJxKTsKKwlpZiAocmMgPT0gTk9fSVJRKSB7CisJCWRldl93YXJuKCZvZmRldi0+ZGV2LCAibm8gSVJRIGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJb2ZkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0KKwkJa3phbGxvYyhzaXplb2Yoc3RydWN0IHhzcGlfcGxhdGZvcm1fZGF0YSksIEdGUF9LRVJORUwpOworCXBkYXRhID0gb2ZkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmICghcGRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogbnVtYmVyIG9mIHNsYXZlIHNlbGVjdCBiaXRzIGlzIHJlcXVpcmVkICovCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShvZmRldi0+bm9kZSwgInhsbngsbnVtLXNzLWJpdHMiLCAmbGVuKTsKKwlpZiAoIXByb3AgfHwgbGVuIDwgc2l6ZW9mKCpwcm9wKSkgeworCQlkZXZfd2Fybigmb2ZkZXYtPmRldiwgIm5vICd4bG54LG51bS1zcy1iaXRzJyBwcm9wZXJ0eVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwZGF0YS0+bnVtX2NoaXBzZWxlY3QgPSAqcHJvcDsKKwlwZGF0YS0+Yml0c19wZXJfd29yZCA9IDg7CisJbWFzdGVyID0geGlsaW54X3NwaV9pbml0KCZvZmRldi0+ZGV2LCAmcl9tZW0sIHJfaXJxLnN0YXJ0LCAtMSk7CisJaWYgKCFtYXN0ZXIpCisJCXJldHVybiAtRU5PREVWOworCisJZGV2X3NldF9kcnZkYXRhKCZvZmRldi0+ZGV2LCBtYXN0ZXIpOworCisJLyogQWRkIGFueSBzdWJub2RlcyBvbiB0aGUgU1BJIGJ1cyAqLworCW9mX3JlZ2lzdGVyX3NwaV9kZXZpY2VzKG1hc3Rlciwgb2ZkZXYtPm5vZGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHhpbGlueF9zcGlfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2KQoreworCXhpbGlueF9zcGlfZGVpbml0KGRldl9nZXRfZHJ2ZGF0YSgmb2ZkZXYtPmRldikpOworCWRldl9zZXRfZHJ2ZGF0YSgmb2ZkZXYtPmRldiwgMCk7CisJa2ZyZWUob2ZkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKTsKKwlvZmRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZXhpdCB4aWxpbnhfc3BpX29mX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCkKK3sKKwlyZXR1cm4geGlsaW54X3NwaV9yZW1vdmUob3ApOworfQorCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCB4aWxpbnhfc3BpX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJ4bG54LHhwcy1zcGktMi4wMC5hIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInhsbngseHBzLXNwaS0yLjAwLmIiLCB9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB4aWxpbnhfc3BpX29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgeGlsaW54X3NwaV9vZl9kcml2ZXIgPSB7CisJLm1hdGNoX3RhYmxlID0geGlsaW54X3NwaV9vZl9tYXRjaCwKKwkucHJvYmUgPSB4aWxpbnhfc3BpX29mX3Byb2JlLAorCS5yZW1vdmUgPSBfX2V4aXRfcCh4aWxpbnhfc3BpX29mX3JlbW92ZSksCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAieGlsaW54LXhwcy1zcGkiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgeGlsaW54X3NwaV9vZl9pbml0KHZvaWQpCit7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmeGlsaW54X3NwaV9vZl9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoeGlsaW54X3NwaV9vZl9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHhpbGlueF9zcGlfb2ZfZXhpdCh2b2lkKQoreworCW9mX3VucmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZ4aWxpbnhfc3BpX29mX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCh4aWxpbnhfc3BpX29mX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNb2NlYW4gTGFib3JhdG9yaWVzIDxpbmZvQG1vY2Vhbi1sYWJzLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiWGlsaW54IFNQSSBwbGF0Zm9ybSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3hpbGlueF9zcGlfcGx0Zm0uYyBiL2RyaXZlcnMvc3BpL3hpbGlueF9zcGlfcGx0Zm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGRlYmFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkveGlsaW54X3NwaV9wbHRmbS5jCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogU3VwcG9ydCBmb3IgWGlsaW54IFNQSSBwbGF0Zm9ybSBkZXZpY2VzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKiBTdXBwb3J0czoKKyAqIFhpbGlueCBTUEkgZGV2aWNlcyBhcyBwbGF0Zm9ybSBkZXZpY2VzCisgKgorICogSW5zcGlyZWQgYnkgeGlsaW54X3NwaS5jLCAyMDAyLTIwMDcgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3hpbGlueF9zcGkuaD4KKworI2luY2x1ZGUgInhpbGlueF9zcGkuaCIKKworc3RhdGljIGludCBfX2RldmluaXQgeGlsaW54X3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHhzcGlfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IHJlc291cmNlICpyOworCWludCBpcnE7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKwl1OCBpOworCisJcGRhdGEgPSBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmICghcGRhdGEpCisJCXJldHVybiAtRU5PREVWOworCisJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXIpCisJCXJldHVybiAtRU5PREVWOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShkZXYsIDApOworCWlmIChpcnEgPCAwKQorCQlyZXR1cm4gLUVOWElPOworCisJbWFzdGVyID0geGlsaW54X3NwaV9pbml0KCZkZXYtPmRldiwgciwgaXJxLCBkZXYtPmlkKTsKKwlpZiAoIW1hc3RlcikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9kZXZpY2VzOyBpKyspCisJCXNwaV9uZXdfZGV2aWNlKG1hc3RlciwgcGRhdGEtPmRldmljZXMgKyBpKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgbWFzdGVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgeGlsaW54X3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXhpbGlueF9zcGlfZGVpbml0KHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldikpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogd29yayB3aXRoIGhvdHBsdWcgYW5kIGNvbGRwbHVnICovCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgWElMSU5YX1NQSV9OQU1FKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgeGlsaW54X3NwaV9kcml2ZXIgPSB7CisJLnByb2JlCT0geGlsaW54X3NwaV9wcm9iZSwKKwkucmVtb3ZlCT0gX19kZXZleGl0X3AoeGlsaW54X3NwaV9yZW1vdmUpLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gWElMSU5YX1NQSV9OQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgeGlsaW54X3NwaV9wbHRmbV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmeGlsaW54X3NwaV9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoeGlsaW54X3NwaV9wbHRmbV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHhpbGlueF9zcGlfcGx0Zm1fZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ4aWxpbnhfc3BpX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCh4aWxpbnhfc3BpX3BsdGZtX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNb2NlYW4gTGFib3JhdG9yaWVzIDxpbmZvQG1vY2Vhbi1sYWJzLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiWGlsaW54IFNQSSBwbGF0Zm9ybSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKaW5kZXggZGZjZDc1Yy4uNTRlMTc0ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnCkBAIC02NSw4ICs2NSw2IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9LY29uZmlnIgogCi1zb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9ydDMwOTAvS2NvbmZpZyIKLQogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvY29tZWRpL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9LY29uZmlnIgpAQCAtNzksMTQgKzc3LDE0IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9taW1pby9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9mcm9udGllci9LY29uZmlnIgogCi1zb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL0tjb25maWciCi0KIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2RyZWFtL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2RzdC9LY29uZmlnIgpAQCAtMTAzLDYgKzEwMSw4IEBACiAKIHNvdXJjZSAiZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL29jdGVvbi9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9zZXJxdF91c2IyL0tjb25maWciCkBAIC0xMjUsNiArMTI1LDE2IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2lpby9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvc2Ftc3VuZy1sYXB0b3AvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvc3RyaXAvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvYXJsYW4vS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZQppbmRleCA3NzE5ZDA0Li4wNjk4NjRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlCkBAIC0xNSwxOCArMTUsMTcgQEAKIG9iai0kKENPTkZJR19PVFVTKQkJKz0gb3R1cy8KIG9iai0kKENPTkZJR19SVDI4NjApCQkrPSBydDI4NjAvCiBvYmotJChDT05GSUdfUlQyODcwKQkJKz0gcnQyODcwLwotb2JqLSQoQ09ORklHX1JUMzA5MCkJCSs9IHJ0MzA5MC8KIG9iai0kKENPTkZJR19DT01FREkpCQkrPSBjb21lZGkvCiBvYmotJChDT05GSUdfQVNVU19PTEVEKQkJKz0gYXN1c19vbGVkLwogb2JqLSQoQ09ORklHX1BBTkVMKQkJKz0gcGFuZWwvCiBvYmotJChDT05GSUdfQUxURVJBX1BDSUVfQ0hETUEpCSs9IGFsdHBjaWVjaGRtYS8KLW9iai0kKENPTkZJR19SVEw4MTg3U0UpCQkrPSBydGw4MTg3c2UvCitvYmotJChDT05GSUdfUjgxODdTRSkJCSs9IHJ0bDgxODdzZS8KIG9iai0kKENPTkZJR19SVEw4MTkyU1UpCQkrPSBydGw4MTkyc3UvCitvYmotJChDT05GSUdfUlRMODE5MlUpCQkrPSBydGw4MTkydS8KIG9iai0kKENPTkZJR19SVEw4MTkyRSkJCSs9IHJ0bDgxOTJlLwogb2JqLSQoQ09ORklHX0lOUFVUX01JTUlPKQkrPSBtaW1pby8KIG9iai0kKENPTkZJR19UUkFOWlBPUlQpCQkrPSBmcm9udGllci8KLW9iai0kKENPTkZJR19BTkRST0lEKQkJKz0gYW5kcm9pZC8KLW9iai0kKENPTkZJR19BTkRST0lEKQkJKz0gZHJlYW0vCitvYmotJChDT05GSUdfRFJFQU0pCQkrPSBkcmVhbS8KIG9iai0kKENPTkZJR19EU1QpCQkrPSBkc3QvCiBvYmotJChDT05GSUdfUE9ITUVMRlMpCQkrPSBwb2htZWxmcy8KIG9iai0kKENPTkZJR19CM0RGRykJCSs9IGIzZGZnLwpAQCAtNDQsNiArNDMsMTEgQEAKIG9iai0kKENPTkZJR19SQVJfUkVHSVNURVIpCSs9IHJhci8KIG9iai0kKENPTkZJR19EWF9TRVApCQkrPSBzZXAvCiBvYmotJChDT05GSUdfSUlPKQkJKz0gaWlvLworb2JqLSQoQ09ORklHX1JBTVpTV0FQKQkJKz0gcmFtenN3YXAvCitvYmotJChDT05GSUdfV0xBR1M0OV9IMikJKz0gd2xhZ3M0OV9oMi8KK29iai0kKENPTkZJR19XTEFHUzQ5X0gyNSkJKz0gd2xhZ3M0OV9oMjUvCitvYmotJChDT05GSUdfQkFUTUFOX0FEVikJKz0gYmF0bWFuLWFkdi8KK29iai0kKENPTkZJR19TQU1TVU5HX0xBUFRPUCkJKz0gc2Ftc3VuZy1sYXB0b3AvCiBvYmotJChDT05GSUdfU1RSSVApCQkrPSBzdHJpcC8KIG9iai0kKENPTkZJR19BUkxBTikJCSs9IGFybGFuLwogb2JqLSQoQ09ORklHX1dBVkVMQU4pCQkrPSB3YXZlbGFuLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FsdHBjaWVjaGRtYS9hbHRwY2llY2hkbWEuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbHRwY2llY2hkbWEvYWx0cGNpZWNoZG1hLmMKaW5kZXggZTBjNWJhNC4uMmYwN2RkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FsdHBjaWVjaGRtYS9hbHRwY2llY2hkbWEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYWx0cGNpZWNoZG1hL2FsdHBjaWVjaGRtYS5jCkBAIC0yMTIsNyArMjEyLDcgQEAKIAlpbnQgbXNpX2VuYWJsZWQ7CiAJLyogd2hldGhlciB0aGlzIGRyaXZlciBjb3VsZCBvYnRhaW4gdGhlIHJlZ2lvbnMgKi8KIAlpbnQgZ290X3JlZ2lvbnM7Ci0JLyogaXJxIGxpbmUgc3VjY2VzZnVsbHkgcmVxdWVzdGVkIGJ5IHRoaXMgZHJpdmVyLCAtMSBvdGhlcndpc2UgKi8KKwkvKiBpcnEgbGluZSBzdWNjZXNzZnVsbHkgcmVxdWVzdGVkIGJ5IHRoaXMgZHJpdmVyLCAtMSBvdGhlcndpc2UgKi8KIAlpbnQgaXJxX2xpbmU7CiAJLyogYm9hcmQgcmV2aXNpb24gKi8KIAl1OCByZXZpc2lvbjsKQEAgLTMzNiw3ICszMzYsNyBAQAogCQlwcmludGsoS0VSTl9ERUJVRyAiQkFSWyVkXSBtYXBwZWQgYXQgMHglcCB3aXRoIGxlbmd0aCAlbHUoLyVsdSkuXG4iLCBpLAogCQlhcGUtPmJhcltpXSwgYmFyX21pbl9sZW5baV0sIGJhcl9sZW5ndGgpOwogCX0KLQkvKiBzdWNjZXNmdWxseSBtYXBwZWQgYWxsIHJlcXVpcmVkIEJBUiByZWdpb25zICovCisJLyogc3VjY2Vzc2Z1bGx5IG1hcHBlZCBhbGwgcmVxdWlyZWQgQkFSIHJlZ2lvbnMgKi8KIAlyYyA9IDA7CiAJZ290byBzdWNjZXNzOwogZmFpbDoKQEAgLTkxMSw3ICs5MTEsNyBAQAogCS8qIHBlcmZvcm0gRE1BIGVuZ2luZXMgbG9vcCBiYWNrIHRlc3QgKi8KIAlyYyA9IGRtYV90ZXN0KGFwZSwgZGV2KTsKIAkodm9pZClyYzsKLQkvKiBzdWNjZXNmdWxseSB0b29rIHRoZSBkZXZpY2UgKi8KKwkvKiBzdWNjZXNzZnVsbHkgdG9vayB0aGUgZGV2aWNlICovCiAJcmMgPSAwOwogCXByaW50ayhLRVJOX0RFQlVHICJwcm9iZSgpIHN1Y2Nlc3NmdWwuXG4iKTsKIAlnb3RvIGVuZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9LY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjY3NTYzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL0tjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi1tZW51ICJBbmRyb2lkIgotCi1jb25maWcgQU5EUk9JRAotCWJvb2wgIkFuZHJvaWQgRHJpdmVycyIKLQlkZXBlbmRzIG9uIEJST0tFTgotCWRlZmF1bHQgTgotCS0tLWhlbHAtLS0KLQkgIEVuYWJsZSBzdXBwb3J0IGZvciB2YXJpb3VzIGRyaXZlcnMgbmVlZGVkIG9uIHRoZSBBbmRyb2lkIHBsYXRmb3JtCi0KLWlmIEFORFJPSUQKLQotY29uZmlnIEFORFJPSURfQklOREVSX0lQQwotCWJvb2wgIkFuZHJvaWQgQmluZGVyIElQQyBEcml2ZXIiCi0JZGVmYXVsdCBuCi0KLWNvbmZpZyBBTkRST0lEX0xPR0dFUgotCXRyaXN0YXRlICJBbmRyb2lkIGxvZyBkcml2ZXIiCi0JZGVmYXVsdCBuCi0KLWNvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFCi0JYm9vbCAiQW5kcm9pZCBSQU0gYnVmZmVyIGNvbnNvbGUiCi0JZGVmYXVsdCBuCi0KLWNvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VOQUJMRV9WRVJCT1NFCi0JYm9vbCAiRW5hYmxlIHZlcmJvc2UgY29uc29sZSBtZXNzYWdlcyBvbiBBbmRyb2lkIFJBTSBjb25zb2xlIgotCWRlZmF1bHQgeQotCWRlcGVuZHMgb24gQU5EUk9JRF9SQU1fQ09OU09MRQotCi1tZW51Y29uZmlnIEFORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgotCWJvb2wgIkFuZHJvaWQgUkFNIENvbnNvbGUgRW5hYmxlIGVycm9yIGNvcnJlY3Rpb24iCi0JZGVmYXVsdCBuCi0JZGVwZW5kcyBvbiBBTkRST0lEX1JBTV9DT05TT0xFCi0JZGVwZW5kcyBvbiAhQU5EUk9JRF9SQU1fQ09OU09MRV9FQVJMWV9JTklUCi0Jc2VsZWN0IFJFRURfU09MT01PTgotCXNlbGVjdCBSRUVEX1NPTE9NT05fRU5DOAotCXNlbGVjdCBSRUVEX1NPTE9NT05fREVDOAotCi1pZiBBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KLQotY29uZmlnIEFORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTl9EQVRBX1NJWkUKLQlpbnQgIkFuZHJvaWQgUkFNIENvbnNvbGUgRGF0YSBkYXRhIHNpemUiCi0JZGVmYXVsdCAxMjgKLQloZWxwCi0JICBNdXN0IGJlIGEgcG93ZXIgb2YgMi4KLQotY29uZmlnIEFORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTl9FQ0NfU0laRQotCWludCAiQW5kcm9pZCBSQU0gQ29uc29sZSBFQ0Mgc2l6ZSIKLQlkZWZhdWx0IDE2Ci0KLWNvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fU1lNQk9MX1NJWkUKLQlpbnQgIkFuZHJvaWQgUkFNIENvbnNvbGUgU3ltYm9sIHNpemUiCi0JZGVmYXVsdCA4Ci0KLWNvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fUE9MWU5PTUlBTAotCWhleCAiQW5kcm9pZCBSQU0gQ29uc29sZSBQb2x5bm9taWFsIgotCWRlZmF1bHQgMHgxOSBpZiAoQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX1NZTUJPTF9TSVpFID0gNCkKLQlkZWZhdWx0IDB4MjkgaWYgKEFORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTl9TWU1CT0xfU0laRSA9IDUpCi0JZGVmYXVsdCAweDYxIGlmIChBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fU1lNQk9MX1NJWkUgPSA2KQotCWRlZmF1bHQgMHg4OSBpZiAoQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX1NZTUJPTF9TSVpFID0gNykKLQlkZWZhdWx0IDB4MTFkIGlmIChBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fU1lNQk9MX1NJWkUgPSA4KQotCi1lbmRpZiAjIEFORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgotCi1jb25maWcgQU5EUk9JRF9SQU1fQ09OU09MRV9FQVJMWV9JTklUCi0JYm9vbCAiU3RhcnQgQW5kcm9pZCBSQU0gY29uc29sZSBlYXJseSIKLQlkZWZhdWx0IG4KLQlkZXBlbmRzIG9uIEFORFJPSURfUkFNX0NPTlNPTEUKLQotY29uZmlnIEFORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfQUREUgotCWhleCAiQW5kcm9pZCBSQU0gY29uc29sZSB2aXJ0dWFsIGFkZHJlc3MiCi0JZGVmYXVsdCAwCi0JZGVwZW5kcyBvbiBBTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX0lOSVQKLQotY29uZmlnIEFORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfU0laRQotCWhleCAiQW5kcm9pZCBSQU0gY29uc29sZSBidWZmZXIgc2l6ZSIKLQlkZWZhdWx0IDAKLQlkZXBlbmRzIG9uIEFORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfSU5JVAotCi1jb25maWcgQU5EUk9JRF9USU1FRF9PVVRQVVQKLQlib29sICJUaW1lZCBvdXRwdXQgY2xhc3MgZHJpdmVyIgotCWRlZmF1bHQgeQotCi1jb25maWcgQU5EUk9JRF9USU1FRF9HUElPCi0JdHJpc3RhdGUgIkFuZHJvaWQgdGltZWQgZ3BpbyBkcml2ZXIiCi0JZGVwZW5kcyBvbiBHRU5FUklDX0dQSU8gJiYgQU5EUk9JRF9USU1FRF9PVVRQVVQKLQlkZWZhdWx0IG4KLQotY29uZmlnIEFORFJPSURfTE9XX01FTU9SWV9LSUxMRVIKLQlib29sICJBbmRyb2lkIExvdyBNZW1vcnkgS2lsbGVyIgotCWRlZmF1bHQgTgotCS0tLWhlbHAtLS0KLQkgIFJlZ2lzdGVyIHByb2Nlc3NlcyB0byBiZSBraWxsZWQgd2hlbiBtZW1vcnkgaXMgbG93Ci0KLWVuZGlmICMgaWYgQU5EUk9JRAotCi1lbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTA1N2U2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1vYmotJChDT05GSUdfQU5EUk9JRF9CSU5ERVJfSVBDKQkrPSBiaW5kZXIubwotb2JqLSQoQ09ORklHX0FORFJPSURfTE9HR0VSKQkJKz0gbG9nZ2VyLm8KLW9iai0kKENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFKQkrPSByYW1fY29uc29sZS5vCi1vYmotJChDT05GSUdfQU5EUk9JRF9USU1FRF9PVVRQVVQpCSs9IHRpbWVkX291dHB1dC5vCi1vYmotJChDT05GSUdfQU5EUk9JRF9USU1FRF9HUElPKQkrPSB0aW1lZF9ncGlvLm8KLW9iai0kKENPTkZJR19BTkRST0lEX0xPV19NRU1PUllfS0lMTEVSKQkrPSBsb3dtZW1vcnlraWxsZXIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL1RPRE8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1OWM1YmUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvVE9ETworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLVRPRE86Ci0JLSBjaGVja3BhdGNoLnBsIGNsZWFudXBzCi0JLSBzcGFyc2UgZml4ZXMKLQktIHJlbmFtZSBmaWxlcyB0byBiZSBub3Qgc28gImdlbmVyaWMiCi0JLSBtYWtlIHN1cmUgdGhpbmdzIGJ1aWxkIGFzIG1vZHVsZXMgcHJvcGVybHkKLQktIGFkZCBwcm9wZXIgYXJjaCBkZXBlbmRhbmNpZXMgYXMgbmVlZGVkCi0JLSBhdWRpdCB1c2Vyc3BhY2UgaW50ZXJmYWNlcyB0byBtYWtlIHN1cmUgdGhleSBhcmUgc2FuZQotCi1QbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IGFuZCBDYzoKLUJyaWFuIFN3ZXRsYW5kIDxzd2V0bGFuZEBnb29nbGUuY29tPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvYmluZGVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkwMTBkNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDM3NjcgKzAsMCBAQAotLyogYmluZGVyLmMKLSAqCi0gKiBBbmRyb2lkIElQQyBTdWJzeXN0ZW0KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBHb29nbGUsIEluYy4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KLSNpbmNsdWRlIDxsaW51eC9mZHRhYmxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvbnNwcm94eS5oPgotI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotCi0jaW5jbHVkZSAiYmluZGVyLmgiCi0KLXN0YXRpYyBERUZJTkVfTVVURVgoYmluZGVyX2xvY2spOwotc3RhdGljIERFRklORV9NVVRFWChiaW5kZXJfZGVmZXJyZWRfbG9jayk7Ci0KLXN0YXRpYyBITElTVF9IRUFEKGJpbmRlcl9wcm9jcyk7Ci1zdGF0aWMgSExJU1RfSEVBRChiaW5kZXJfZGVmZXJyZWRfbGlzdCk7Ci1zdGF0aWMgSExJU1RfSEVBRChiaW5kZXJfZGVhZF9ub2Rlcyk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9yb290Owotc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Byb2M7Ci1zdGF0aWMgc3RydWN0IGJpbmRlcl9ub2RlICpiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZTsKLXN0YXRpYyB1aWRfdCBiaW5kZXJfY29udGV4dF9tZ3JfdWlkID0gLTE7Ci1zdGF0aWMgaW50IGJpbmRlcl9sYXN0X2lkOwotCi1zdGF0aWMgaW50IGJpbmRlcl9yZWFkX3Byb2NfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKLQkJCQkgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0KLS8qIFRoaXMgaXMgb25seSBkZWZpbmVkIGluIGluY2x1ZGUvYXNtLWFybS9zaXplcy5oICovCi0jaWZuZGVmIFNaXzFLCi0jZGVmaW5lIFNaXzFLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwCi0jZW5kaWYKLQotI2lmbmRlZiBTWl80TQotI2RlZmluZSBTWl80TSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMAotI2VuZGlmCi0KLSNkZWZpbmUgRk9SQklEREVOX01NQVBfRkxBR1MgICAgICAgICAgICAgICAgKFZNX1dSSVRFKQotCi0jZGVmaW5lIEJJTkRFUl9TTUFMTF9CVUZfU0laRSAoUEFHRV9TSVpFICogNjQpCi0KLWVudW0gewotCUJJTkRFUl9ERUJVR19VU0VSX0VSUk9SICAgICAgICAgICAgID0gMVUgPDwgMCwKLQlCSU5ERVJfREVCVUdfRkFJTEVEX1RSQU5TQUNUSU9OICAgICA9IDFVIDw8IDEsCi0JQklOREVSX0RFQlVHX0RFQURfVFJBTlNBQ1RJT04gICAgICAgPSAxVSA8PCAyLAotCUJJTkRFUl9ERUJVR19PUEVOX0NMT1NFICAgICAgICAgICAgID0gMVUgPDwgMywKLQlCSU5ERVJfREVCVUdfREVBRF9CSU5ERVIgICAgICAgICAgICA9IDFVIDw8IDQsCi0JQklOREVSX0RFQlVHX0RFQVRIX05PVElGSUNBVElPTiAgICAgPSAxVSA8PCA1LAotCUJJTkRFUl9ERUJVR19SRUFEX1dSSVRFICAgICAgICAgICAgID0gMVUgPDwgNiwKLQlCSU5ERVJfREVCVUdfVVNFUl9SRUZTICAgICAgICAgICAgICA9IDFVIDw8IDcsCi0JQklOREVSX0RFQlVHX1RIUkVBRFMgICAgICAgICAgICAgICAgPSAxVSA8PCA4LAotCUJJTkRFUl9ERUJVR19UUkFOU0FDVElPTiAgICAgICAgICAgID0gMVUgPDwgOSwKLQlCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT05fQ09NUExFVEUgICA9IDFVIDw8IDEwLAotCUJJTkRFUl9ERUJVR19GUkVFX0JVRkZFUiAgICAgICAgICAgID0gMVUgPDwgMTEsCi0JQklOREVSX0RFQlVHX0lOVEVSTkFMX1JFRlMgICAgICAgICAgPSAxVSA8PCAxMiwKLQlCSU5ERVJfREVCVUdfQlVGRkVSX0FMTE9DICAgICAgICAgICA9IDFVIDw8IDEzLAotCUJJTkRFUl9ERUJVR19QUklPUklUWV9DQVAgICAgICAgICAgID0gMVUgPDwgMTQsCi0JQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQ19BU1lOQyAgICAgPSAxVSA8PCAxNSwKLX07Ci1zdGF0aWMgdWludDMyX3QgYmluZGVyX2RlYnVnX21hc2sgPSBCSU5ERVJfREVCVUdfVVNFUl9FUlJPUiB8Ci0JQklOREVSX0RFQlVHX0ZBSUxFRF9UUkFOU0FDVElPTiB8IEJJTkRFUl9ERUJVR19ERUFEX1RSQU5TQUNUSU9OOwotbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnX21hc2ssIGJpbmRlcl9kZWJ1Z19tYXNrLCB1aW50LCBTX0lXVVNSIHwgU19JUlVHTyk7Ci0KLXN0YXRpYyBpbnQgYmluZGVyX2RlYnVnX25vX2xvY2s7Ci1tb2R1bGVfcGFyYW1fbmFtZWQocHJvY19ub19sb2NrLCBiaW5kZXJfZGVidWdfbm9fbG9jaywgYm9vbCwgU19JV1VTUiB8IFNfSVJVR08pOwotCi1zdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoYmluZGVyX3VzZXJfZXJyb3Jfd2FpdCk7Ci1zdGF0aWMgaW50IGJpbmRlcl9zdG9wX29uX3VzZXJfZXJyb3I7Ci0KLXN0YXRpYyBpbnQgYmluZGVyX3NldF9zdG9wX29uX3VzZXJfZXJyb3IoY29uc3QgY2hhciAqdmFsLAotCQkJCQkgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCi17Ci0JaW50IHJldDsKLQlyZXQgPSBwYXJhbV9zZXRfaW50KHZhbCwga3ApOwotCWlmIChiaW5kZXJfc3RvcF9vbl91c2VyX2Vycm9yIDwgMikKLQkJd2FrZV91cCgmYmluZGVyX3VzZXJfZXJyb3Jfd2FpdCk7Ci0JcmV0dXJuIHJldDsKLX0KLW1vZHVsZV9wYXJhbV9jYWxsKHN0b3Bfb25fdXNlcl9lcnJvciwgYmluZGVyX3NldF9zdG9wX29uX3VzZXJfZXJyb3IsCi0JcGFyYW1fZ2V0X2ludCwgJmJpbmRlcl9zdG9wX29uX3VzZXJfZXJyb3IsIFNfSVdVU1IgfCBTX0lSVUdPKTsKLQotI2RlZmluZSBiaW5kZXJfZGVidWcobWFzaywgeC4uLikgXAotCWRvIHsgXAotCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBtYXNrKSBcCi0JCQlwcmludGsoS0VSTl9JTkZPIHgpOyBcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBiaW5kZXJfdXNlcl9lcnJvcih4Li4uKSBcCi0JZG8geyBcCi0JCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19VU0VSX0VSUk9SKSBcCi0JCQlwcmludGsoS0VSTl9JTkZPIHgpOyBcCi0JCWlmIChiaW5kZXJfc3RvcF9vbl91c2VyX2Vycm9yKSBcCi0JCQliaW5kZXJfc3RvcF9vbl91c2VyX2Vycm9yID0gMjsgXAotCX0gd2hpbGUgKDApCi0KLWVudW0gYmluZGVyX3N0YXRfdHlwZXMgewotCUJJTkRFUl9TVEFUX1BST0MsCi0JQklOREVSX1NUQVRfVEhSRUFELAotCUJJTkRFUl9TVEFUX05PREUsCi0JQklOREVSX1NUQVRfUkVGLAotCUJJTkRFUl9TVEFUX0RFQVRILAotCUJJTkRFUl9TVEFUX1RSQU5TQUNUSU9OLAotCUJJTkRFUl9TVEFUX1RSQU5TQUNUSU9OX0NPTVBMRVRFLAotCUJJTkRFUl9TVEFUX0NPVU5UCi19OwotCi1zdHJ1Y3QgYmluZGVyX3N0YXRzIHsKLQlpbnQgYnJbX0lPQ19OUihCUl9GQUlMRURfUkVQTFkpICsgMV07Ci0JaW50IGJjW19JT0NfTlIoQkNfREVBRF9CSU5ERVJfRE9ORSkgKyAxXTsKLQlpbnQgb2JqX2NyZWF0ZWRbQklOREVSX1NUQVRfQ09VTlRdOwotCWludCBvYmpfZGVsZXRlZFtCSU5ERVJfU1RBVF9DT1VOVF07Ci19OwotCi1zdGF0aWMgc3RydWN0IGJpbmRlcl9zdGF0cyBiaW5kZXJfc3RhdHM7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBiaW5kZXJfc3RhdHNfZGVsZXRlZChlbnVtIGJpbmRlcl9zdGF0X3R5cGVzIHR5cGUpCi17Ci0JYmluZGVyX3N0YXRzLm9ial9kZWxldGVkW3R5cGVdKys7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBiaW5kZXJfc3RhdHNfY3JlYXRlZChlbnVtIGJpbmRlcl9zdGF0X3R5cGVzIHR5cGUpCi17Ci0JYmluZGVyX3N0YXRzLm9ial9jcmVhdGVkW3R5cGVdKys7Ci19Ci0KLXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2VudHJ5IHsKLQlpbnQgZGVidWdfaWQ7Ci0JaW50IGNhbGxfdHlwZTsKLQlpbnQgZnJvbV9wcm9jOwotCWludCBmcm9tX3RocmVhZDsKLQlpbnQgdGFyZ2V0X2hhbmRsZTsKLQlpbnQgdG9fcHJvYzsKLQlpbnQgdG9fdGhyZWFkOwotCWludCB0b19ub2RlOwotCWludCBkYXRhX3NpemU7Ci0JaW50IG9mZnNldHNfc2l6ZTsKLX07Ci1zdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZyB7Ci0JaW50IG5leHQ7Ci0JaW50IGZ1bGw7Ci0Jc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkgZW50cnlbMzJdOwotfTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZyBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nOwotc3RhdGljIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nIGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZmFpbGVkOwotCi1zdGF0aWMgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkgKmJpbmRlcl90cmFuc2FjdGlvbl9sb2dfYWRkKAotCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nICpsb2cpCi17Ci0Jc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkgKmU7Ci0JZSA9ICZsb2ctPmVudHJ5W2xvZy0+bmV4dF07Ci0JbWVtc2V0KGUsIDAsIHNpemVvZigqZSkpOwotCWxvZy0+bmV4dCsrOwotCWlmIChsb2ctPm5leHQgPT0gQVJSQVlfU0laRShsb2ctPmVudHJ5KSkgewotCQlsb2ctPm5leHQgPSAwOwotCQlsb2ctPmZ1bGwgPSAxOwotCX0KLQlyZXR1cm4gZTsKLX0KLQotc3RydWN0IGJpbmRlcl93b3JrIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJ5OwotCWVudW0gewotCQlCSU5ERVJfV09SS19UUkFOU0FDVElPTiA9IDEsCi0JCUJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OX0NPTVBMRVRFLAotCQlCSU5ERVJfV09SS19OT0RFLAotCQlCSU5ERVJfV09SS19ERUFEX0JJTkRFUiwKLQkJQklOREVSX1dPUktfREVBRF9CSU5ERVJfQU5EX0NMRUFSLAotCQlCSU5ERVJfV09SS19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT04sCi0JfSB0eXBlOwotfTsKLQotc3RydWN0IGJpbmRlcl9ub2RlIHsKLQlpbnQgZGVidWdfaWQ7Ci0Jc3RydWN0IGJpbmRlcl93b3JrIHdvcms7Ci0JdW5pb24gewotCQlzdHJ1Y3QgcmJfbm9kZSByYl9ub2RlOwotCQlzdHJ1Y3QgaGxpc3Rfbm9kZSBkZWFkX25vZGU7Ci0JfTsKLQlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2M7Ci0Jc3RydWN0IGhsaXN0X2hlYWQgcmVmczsKLQlpbnQgaW50ZXJuYWxfc3Ryb25nX3JlZnM7Ci0JaW50IGxvY2FsX3dlYWtfcmVmczsKLQlpbnQgbG9jYWxfc3Ryb25nX3JlZnM7Ci0Jdm9pZCBfX3VzZXIgKnB0cjsKLQl2b2lkIF9fdXNlciAqY29va2llOwotCXVuc2lnbmVkIGhhc19zdHJvbmdfcmVmOjE7Ci0JdW5zaWduZWQgcGVuZGluZ19zdHJvbmdfcmVmOjE7Ci0JdW5zaWduZWQgaGFzX3dlYWtfcmVmOjE7Ci0JdW5zaWduZWQgcGVuZGluZ193ZWFrX3JlZjoxOwotCXVuc2lnbmVkIGhhc19hc3luY190cmFuc2FjdGlvbjoxOwotCXVuc2lnbmVkIGFjY2VwdF9mZHM6MTsKLQl1bnNpZ25lZCBtaW5fcHJpb3JpdHk6ODsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGFzeW5jX3RvZG87Ci19OwotCi1zdHJ1Y3QgYmluZGVyX3JlZl9kZWF0aCB7Ci0Jc3RydWN0IGJpbmRlcl93b3JrIHdvcms7Ci0Jdm9pZCBfX3VzZXIgKmNvb2tpZTsKLX07Ci0KLXN0cnVjdCBiaW5kZXJfcmVmIHsKLQkvKiBMb29rdXBzIG5lZWRlZDogKi8KLQkvKiAgIG5vZGUgKyBwcm9jID0+IHJlZiAodHJhbnNhY3Rpb24pICovCi0JLyogICBkZXNjICsgcHJvYyA9PiByZWYgKHRyYW5zYWN0aW9uLCBpbmMvZGVjIHJlZikgKi8KLQkvKiAgIG5vZGUgPT4gcmVmcyArIHByb2NzIChwcm9jIGV4aXQpICovCi0JaW50IGRlYnVnX2lkOwotCXN0cnVjdCByYl9ub2RlIHJiX25vZGVfZGVzYzsKLQlzdHJ1Y3QgcmJfbm9kZSByYl9ub2RlX25vZGU7Ci0Jc3RydWN0IGhsaXN0X25vZGUgbm9kZV9lbnRyeTsKLQlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2M7Ci0Jc3RydWN0IGJpbmRlcl9ub2RlICpub2RlOwotCXVpbnQzMl90IGRlc2M7Ci0JaW50IHN0cm9uZzsKLQlpbnQgd2VhazsKLQlzdHJ1Y3QgYmluZGVyX3JlZl9kZWF0aCAqZGVhdGg7Ci19OwotCi1zdHJ1Y3QgYmluZGVyX2J1ZmZlciB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBlbnRyeTsgLyogZnJlZSBhbmQgYWxsb2NhdGVkIGVudHJpZXMgYnkgYWRkZXNzcyAqLwotCXN0cnVjdCByYl9ub2RlIHJiX25vZGU7IC8qIGZyZWUgZW50cnkgYnkgc2l6ZSBvciBhbGxvY2F0ZWQgZW50cnkgKi8KLQkJCQkvKiBieSBhZGRyZXNzICovCi0JdW5zaWduZWQgZnJlZToxOwotCXVuc2lnbmVkIGFsbG93X3VzZXJfZnJlZToxOwotCXVuc2lnbmVkIGFzeW5jX3RyYW5zYWN0aW9uOjE7Ci0JdW5zaWduZWQgZGVidWdfaWQ6Mjk7Ci0KLQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbjsKLQotCXN0cnVjdCBiaW5kZXJfbm9kZSAqdGFyZ2V0X25vZGU7Ci0Jc2l6ZV90IGRhdGFfc2l6ZTsKLQlzaXplX3Qgb2Zmc2V0c19zaXplOwotCXVpbnQ4X3QgZGF0YVswXTsKLX07Ci0KLWVudW0gYmluZGVyX2RlZmVycmVkX3N0YXRlIHsKLQlCSU5ERVJfREVGRVJSRURfUFVUX0ZJTEVTICAgID0gMHgwMSwKLQlCSU5ERVJfREVGRVJSRURfRkxVU0ggICAgICAgID0gMHgwMiwKLQlCSU5ERVJfREVGRVJSRURfUkVMRUFTRSAgICAgID0gMHgwNCwKLX07Ci0KLXN0cnVjdCBiaW5kZXJfcHJvYyB7Ci0Jc3RydWN0IGhsaXN0X25vZGUgcHJvY19ub2RlOwotCXN0cnVjdCByYl9yb290IHRocmVhZHM7Ci0Jc3RydWN0IHJiX3Jvb3Qgbm9kZXM7Ci0Jc3RydWN0IHJiX3Jvb3QgcmVmc19ieV9kZXNjOwotCXN0cnVjdCByYl9yb290IHJlZnNfYnlfbm9kZTsKLQlpbnQgcGlkOwotCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwotCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzOwotCXN0cnVjdCBobGlzdF9ub2RlIGRlZmVycmVkX3dvcmtfbm9kZTsKLQlpbnQgZGVmZXJyZWRfd29yazsKLQl2b2lkICpidWZmZXI7Ci0JcHRyZGlmZl90IHVzZXJfYnVmZmVyX29mZnNldDsKLQotCXN0cnVjdCBsaXN0X2hlYWQgYnVmZmVyczsKLQlzdHJ1Y3QgcmJfcm9vdCBmcmVlX2J1ZmZlcnM7Ci0Jc3RydWN0IHJiX3Jvb3QgYWxsb2NhdGVkX2J1ZmZlcnM7Ci0Jc2l6ZV90IGZyZWVfYXN5bmNfc3BhY2U7Ci0KLQlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOwotCXNpemVfdCBidWZmZXJfc2l6ZTsKLQl1aW50MzJfdCBidWZmZXJfZnJlZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHRvZG87Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLQlzdHJ1Y3QgYmluZGVyX3N0YXRzIHN0YXRzOwotCXN0cnVjdCBsaXN0X2hlYWQgZGVsaXZlcmVkX2RlYXRoOwotCWludCBtYXhfdGhyZWFkczsKLQlpbnQgcmVxdWVzdGVkX3RocmVhZHM7Ci0JaW50IHJlcXVlc3RlZF90aHJlYWRzX3N0YXJ0ZWQ7Ci0JaW50IHJlYWR5X3RocmVhZHM7Ci0JbG9uZyBkZWZhdWx0X3ByaW9yaXR5OwotfTsKLQotZW51bSB7Ci0JQklOREVSX0xPT1BFUl9TVEFURV9SRUdJU1RFUkVEICA9IDB4MDEsCi0JQklOREVSX0xPT1BFUl9TVEFURV9FTlRFUkVEICAgICA9IDB4MDIsCi0JQklOREVSX0xPT1BFUl9TVEFURV9FWElURUQgICAgICA9IDB4MDQsCi0JQklOREVSX0xPT1BFUl9TVEFURV9JTlZBTElEICAgICA9IDB4MDgsCi0JQklOREVSX0xPT1BFUl9TVEFURV9XQUlUSU5HICAgICA9IDB4MTAsCi0JQklOREVSX0xPT1BFUl9TVEFURV9ORUVEX1JFVFVSTiA9IDB4MjAKLX07Ci0KLXN0cnVjdCBiaW5kZXJfdGhyZWFkIHsKLQlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2M7Ci0Jc3RydWN0IHJiX25vZGUgcmJfbm9kZTsKLQlpbnQgcGlkOwotCWludCBsb29wZXI7Ci0Jc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdHJhbnNhY3Rpb25fc3RhY2s7Ci0Jc3RydWN0IGxpc3RfaGVhZCB0b2RvOwotCXVpbnQzMl90IHJldHVybl9lcnJvcjsgLyogV3JpdGUgZmFpbGVkLCByZXR1cm4gZXJyb3IgY29kZSBpbiByZWFkIGJ1ZiAqLwotCXVpbnQzMl90IHJldHVybl9lcnJvcjI7IC8qIFdyaXRlIGZhaWxlZCwgcmV0dXJuIGVycm9yIGNvZGUgaW4gcmVhZCAqLwotCQkvKiBidWZmZXIuIFVzZWQgd2hlbiBzZW5kaW5nIGEgcmVwbHkgdG8gYSBkZWFkIHByb2Nlc3MgdGhhdCAqLwotCQkvKiB3ZSBhcmUgYWxzbyB3YWl0aW5nIG9uICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLQlzdHJ1Y3QgYmluZGVyX3N0YXRzIHN0YXRzOwotfTsKLQotc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiB7Ci0JaW50IGRlYnVnX2lkOwotCXN0cnVjdCBiaW5kZXJfd29yayB3b3JrOwotCXN0cnVjdCBiaW5kZXJfdGhyZWFkICpmcm9tOwotCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKmZyb21fcGFyZW50OwotCXN0cnVjdCBiaW5kZXJfcHJvYyAqdG9fcHJvYzsKLQlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdG9fdGhyZWFkOwotCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnRvX3BhcmVudDsKLQl1bnNpZ25lZCBuZWVkX3JlcGx5OjE7Ci0JLyogdW5zaWduZWQgaXNfZGVhZDoxOyAqLwkvKiBub3QgdXNlZCBhdCB0aGUgbW9tZW50ICovCi0KLQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyOwotCXVuc2lnbmVkIGludAljb2RlOwotCXVuc2lnbmVkIGludAlmbGFnczsKLQlsb25nCXByaW9yaXR5OwotCWxvbmcJc2F2ZWRfcHJpb3JpdHk7Ci0JdWlkX3QJc2VuZGVyX2V1aWQ7Ci19OwotCi1zdGF0aWMgdm9pZAotYmluZGVyX2RlZmVyX3dvcmsoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCBlbnVtIGJpbmRlcl9kZWZlcnJlZF9zdGF0ZSBkZWZlcik7Ci0KLS8qCi0gKiBjb3BpZWQgZnJvbSBnZXRfdW51c2VkX2ZkX2ZsYWdzCi0gKi8KLWludCB0YXNrX2dldF91bnVzZWRfZmRfZmxhZ3Moc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCBpbnQgZmxhZ3MpCi17Ci0Jc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBwcm9jLT5maWxlczsKLQlpbnQgZmQsIGVycm9yOwotCXN0cnVjdCBmZHRhYmxlICpmZHQ7Ci0JdW5zaWduZWQgbG9uZyBybGltX2N1cjsKLQl1bnNpZ25lZCBsb25nIGlycXM7Ci0KLQlpZiAoZmlsZXMgPT0gTlVMTCkKLQkJcmV0dXJuIC1FU1JDSDsKLQotCWVycm9yID0gLUVNRklMRTsKLQlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOwotCi1yZXBlYXQ6Ci0JZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7Ci0JZmQgPSBmaW5kX25leHRfemVyb19iaXQoZmR0LT5vcGVuX2Zkcy0+ZmRzX2JpdHMsIGZkdC0+bWF4X2ZkcywKLQkJCQlmaWxlcy0+bmV4dF9mZCk7Ci0KLQkvKgotCSAqIE4uQi4gRm9yIGNsb25lIHRhc2tzIHNoYXJpbmcgYSBmaWxlcyBzdHJ1Y3R1cmUsIHRoaXMgdGVzdAotCSAqIHdpbGwgbGltaXQgdGhlIHRvdGFsIG51bWJlciBvZiBmaWxlcyB0aGF0IGNhbiBiZSBvcGVuZWQuCi0JICovCi0JcmxpbV9jdXIgPSAwOwotCWlmIChsb2NrX3Rhc2tfc2lnaGFuZChwcm9jLT50c2ssICZpcnFzKSkgewotCQlybGltX2N1ciA9IHByb2MtPnRzay0+c2lnbmFsLT5ybGltW1JMSU1JVF9OT0ZJTEVdLnJsaW1fY3VyOwotCQl1bmxvY2tfdGFza19zaWdoYW5kKHByb2MtPnRzaywgJmlycXMpOwotCX0KLQlpZiAoZmQgPj0gcmxpbV9jdXIpCi0JCWdvdG8gb3V0OwotCi0JLyogRG8gd2UgbmVlZCB0byBleHBhbmQgdGhlIGZkIGFycmF5IG9yIGZkIHNldD8gICovCi0JZXJyb3IgPSBleHBhbmRfZmlsZXMoZmlsZXMsIGZkKTsKLQlpZiAoZXJyb3IgPCAwKQotCQlnb3RvIG91dDsKLQotCWlmIChlcnJvcikgewotCQkvKgotCQkgKiBJZiB3ZSBuZWVkZWQgdG8gZXhwYW5kIHRoZSBmcyBhcnJheSB3ZQotCQkgKiBtaWdodCBoYXZlIGJsb2NrZWQgLSB0cnkgYWdhaW4uCi0JCSAqLwotCQllcnJvciA9IC1FTUZJTEU7Ci0JCWdvdG8gcmVwZWF0OwotCX0KLQotCUZEX1NFVChmZCwgZmR0LT5vcGVuX2Zkcyk7Ci0JaWYgKGZsYWdzICYgT19DTE9FWEVDKQotCQlGRF9TRVQoZmQsIGZkdC0+Y2xvc2Vfb25fZXhlYyk7Ci0JZWxzZQotCQlGRF9DTFIoZmQsIGZkdC0+Y2xvc2Vfb25fZXhlYyk7Ci0JZmlsZXMtPm5leHRfZmQgPSBmZCArIDE7Ci0jaWYgMQotCS8qIFNhbml0eSBjaGVjayAqLwotCWlmIChmZHQtPmZkW2ZkXSAhPSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImdldF91bnVzZWRfZmQ6IHNsb3QgJWQgbm90IE5VTEwhXG4iLCBmZCk7Ci0JCWZkdC0+ZmRbZmRdID0gTlVMTDsKLQl9Ci0jZW5kaWYKLQllcnJvciA9IGZkOwotCi1vdXQ6Ci0Jc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOwotCXJldHVybiBlcnJvcjsKLX0KLQotLyoKLSAqIGNvcGllZCBmcm9tIGZkX2luc3RhbGwKLSAqLwotc3RhdGljIHZvaWQgdGFza19mZF9pbnN0YWxsKAotCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgdW5zaWduZWQgaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcyA9IHByb2MtPmZpbGVzOwotCXN0cnVjdCBmZHRhYmxlICpmZHQ7Ci0KLQlpZiAoZmlsZXMgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKLQlmZHQgPSBmaWxlc19mZHRhYmxlKGZpbGVzKTsKLQlCVUdfT04oZmR0LT5mZFtmZF0gIT0gTlVMTCk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGZkdC0+ZmRbZmRdLCBmaWxlKTsKLQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7Ci19Ci0KLS8qCi0gKiBjb3BpZWQgZnJvbSBfX3B1dF91bnVzZWRfZmQgaW4gb3Blbi5jCi0gKi8KLXN0YXRpYyB2b2lkIF9fcHV0X3VudXNlZF9mZChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcywgdW5zaWduZWQgaW50IGZkKQotewotCXN0cnVjdCBmZHRhYmxlICpmZHQgPSBmaWxlc19mZHRhYmxlKGZpbGVzKTsKLQlfX0ZEX0NMUihmZCwgZmR0LT5vcGVuX2Zkcyk7Ci0JaWYgKGZkIDwgZmlsZXMtPm5leHRfZmQpCi0JCWZpbGVzLT5uZXh0X2ZkID0gZmQ7Ci19Ci0KLS8qCi0gKiBjb3BpZWQgZnJvbSBzeXNfY2xvc2UKLSAqLwotc3RhdGljIGxvbmcgdGFza19jbG9zZV9mZChzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIHVuc2lnbmVkIGludCBmZCkKLXsKLQlzdHJ1Y3QgZmlsZSAqZmlscDsKLQlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcyA9IHByb2MtPmZpbGVzOwotCXN0cnVjdCBmZHRhYmxlICpmZHQ7Ci0JaW50IHJldHZhbDsKLQotCWlmIChmaWxlcyA9PSBOVUxMKQotCQlyZXR1cm4gLUVTUkNIOwotCi0Jc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKLQlmZHQgPSBmaWxlc19mZHRhYmxlKGZpbGVzKTsKLQlpZiAoZmQgPj0gZmR0LT5tYXhfZmRzKQotCQlnb3RvIG91dF91bmxvY2s7Ci0JZmlscCA9IGZkdC0+ZmRbZmRdOwotCWlmICghZmlscCkKLQkJZ290byBvdXRfdW5sb2NrOwotCXJjdV9hc3NpZ25fcG9pbnRlcihmZHQtPmZkW2ZkXSwgTlVMTCk7Ci0JRkRfQ0xSKGZkLCBmZHQtPmNsb3NlX29uX2V4ZWMpOwotCV9fcHV0X3VudXNlZF9mZChmaWxlcywgZmQpOwotCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKLQlyZXR2YWwgPSBmaWxwX2Nsb3NlKGZpbHAsIGZpbGVzKTsKLQotCS8qIGNhbid0IHJlc3RhcnQgY2xvc2Ugc3lzY2FsbCBiZWNhdXNlIGZpbGUgdGFibGUgZW50cnkgd2FzIGNsZWFyZWQgKi8KLQlpZiAodW5saWtlbHkocmV0dmFsID09IC1FUkVTVEFSVFNZUyB8fAotCQkgICAgIHJldHZhbCA9PSAtRVJFU1RBUlROT0lOVFIgfHwKLQkJICAgICByZXR2YWwgPT0gLUVSRVNUQVJUTk9IQU5EIHx8Ci0JCSAgICAgcmV0dmFsID09IC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0spKQotCQlyZXR2YWwgPSAtRUlOVFI7Ci0KLQlyZXR1cm4gcmV0dmFsOwotCi1vdXRfdW5sb2NrOgotCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKLQlyZXR1cm4gLUVCQURGOwotfQotCi1zdGF0aWMgdm9pZCBiaW5kZXJfc2V0X25pY2UobG9uZyBuaWNlKQotewotCWxvbmcgbWluX25pY2U7Ci0JaWYgKGNhbl9uaWNlKGN1cnJlbnQsIG5pY2UpKSB7Ci0JCXNldF91c2VyX25pY2UoY3VycmVudCwgbmljZSk7Ci0JCXJldHVybjsKLQl9Ci0JbWluX25pY2UgPSAyMCAtIGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfTklDRV0ucmxpbV9jdXI7Ci0JYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19QUklPUklUWV9DQVAsCi0JCSAgICAgImJpbmRlcjogJWQ6IG5pY2UgdmFsdWUgJWxkIG5vdCBhbGxvd2VkIHVzZSAiCi0JCSAgICAgIiVsZCBpbnN0ZWFkXG4iLCBjdXJyZW50LT5waWQsIG5pY2UsIG1pbl9uaWNlKTsKLQlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIG1pbl9uaWNlKTsKLQlpZiAobWluX25pY2UgPCAyMCkKLQkJcmV0dXJuOwotCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkIFJMSU1JVF9OSUNFIG5vdCBzZXRcbiIsIGN1cnJlbnQtPnBpZCk7Ci19Ci0KLXN0YXRpYyBzaXplX3QgYmluZGVyX2J1ZmZlcl9zaXplKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywKLQkJCQkgc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcikKLXsKLQlpZiAobGlzdF9pc19sYXN0KCZidWZmZXItPmVudHJ5LCAmcHJvYy0+YnVmZmVycykpCi0JCXJldHVybiBwcm9jLT5idWZmZXIgKyBwcm9jLT5idWZmZXJfc2l6ZSAtICh2b2lkICopYnVmZmVyLT5kYXRhOwotCWVsc2UKLQkJcmV0dXJuIChzaXplX3QpbGlzdF9lbnRyeShidWZmZXItPmVudHJ5Lm5leHQsCi0JCQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgZW50cnkpIC0gKHNpemVfdClidWZmZXItPmRhdGE7Ci19Ci0KLXN0YXRpYyB2b2lkIGJpbmRlcl9pbnNlcnRfZnJlZV9idWZmZXIoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLAotCQkJCSAgICAgIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpuZXdfYnVmZmVyKQotewotCXN0cnVjdCByYl9ub2RlICoqcCA9ICZwcm9jLT5mcmVlX2J1ZmZlcnMucmJfbm9kZTsKLQlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKLQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyOwotCXNpemVfdCBidWZmZXJfc2l6ZTsKLQlzaXplX3QgbmV3X2J1ZmZlcl9zaXplOwotCi0JQlVHX09OKCFuZXdfYnVmZmVyLT5mcmVlKTsKLQotCW5ld19idWZmZXJfc2l6ZSA9IGJpbmRlcl9idWZmZXJfc2l6ZShwcm9jLCBuZXdfYnVmZmVyKTsKLQotCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfQlVGRkVSX0FMTE9DLAotCQkgICAgICJiaW5kZXI6ICVkOiBhZGQgZnJlZSBidWZmZXIsIHNpemUgJXpkLCAiCi0JCSAgICAgImF0ICVwXG4iLCBwcm9jLT5waWQsIG5ld19idWZmZXJfc2l6ZSwgbmV3X2J1ZmZlcik7Ci0KLQl3aGlsZSAoKnApIHsKLQkJcGFyZW50ID0gKnA7Ci0JCWJ1ZmZlciA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGJpbmRlcl9idWZmZXIsIHJiX25vZGUpOwotCQlCVUdfT04oIWJ1ZmZlci0+ZnJlZSk7Ci0KLQkJYnVmZmVyX3NpemUgPSBiaW5kZXJfYnVmZmVyX3NpemUocHJvYywgYnVmZmVyKTsKLQotCQlpZiAobmV3X2J1ZmZlcl9zaXplIDwgYnVmZmVyX3NpemUpCi0JCQlwID0gJnBhcmVudC0+cmJfbGVmdDsKLQkJZWxzZQotCQkJcCA9ICZwYXJlbnQtPnJiX3JpZ2h0OwotCX0KLQlyYl9saW5rX25vZGUoJm5ld19idWZmZXItPnJiX25vZGUsIHBhcmVudCwgcCk7Ci0JcmJfaW5zZXJ0X2NvbG9yKCZuZXdfYnVmZmVyLT5yYl9ub2RlLCAmcHJvYy0+ZnJlZV9idWZmZXJzKTsKLX0KLQotc3RhdGljIHZvaWQgYmluZGVyX2luc2VydF9hbGxvY2F0ZWRfYnVmZmVyKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywKLQkJCQkJICAgc3RydWN0IGJpbmRlcl9idWZmZXIgKm5ld19idWZmZXIpCi17Ci0Jc3RydWN0IHJiX25vZGUgKipwID0gJnByb2MtPmFsbG9jYXRlZF9idWZmZXJzLnJiX25vZGU7Ci0Jc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7Ci0Jc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcjsKLQotCUJVR19PTihuZXdfYnVmZmVyLT5mcmVlKTsKLQotCXdoaWxlICgqcCkgewotCQlwYXJlbnQgPSAqcDsKLQkJYnVmZmVyID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgcmJfbm9kZSk7Ci0JCUJVR19PTihidWZmZXItPmZyZWUpOwotCi0JCWlmIChuZXdfYnVmZmVyIDwgYnVmZmVyKQotCQkJcCA9ICZwYXJlbnQtPnJiX2xlZnQ7Ci0JCWVsc2UgaWYgKG5ld19idWZmZXIgPiBidWZmZXIpCi0JCQlwID0gJnBhcmVudC0+cmJfcmlnaHQ7Ci0JCWVsc2UKLQkJCUJVRygpOwotCX0KLQlyYl9saW5rX25vZGUoJm5ld19idWZmZXItPnJiX25vZGUsIHBhcmVudCwgcCk7Ci0JcmJfaW5zZXJ0X2NvbG9yKCZuZXdfYnVmZmVyLT5yYl9ub2RlLCAmcHJvYy0+YWxsb2NhdGVkX2J1ZmZlcnMpOwotfQotCi1zdGF0aWMgc3RydWN0IGJpbmRlcl9idWZmZXIgKmJpbmRlcl9idWZmZXJfbG9va3VwKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywKLQkJCQkJCSAgdm9pZCBfX3VzZXIgKnVzZXJfcHRyKQotewotCXN0cnVjdCByYl9ub2RlICpuID0gcHJvYy0+YWxsb2NhdGVkX2J1ZmZlcnMucmJfbm9kZTsKLQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyOwotCXN0cnVjdCBiaW5kZXJfYnVmZmVyICprZXJuX3B0cjsKLQotCWtlcm5fcHRyID0gdXNlcl9wdHIgLSBwcm9jLT51c2VyX2J1ZmZlcl9vZmZzZXQKLQkJLSBvZmZzZXRvZihzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgZGF0YSk7Ci0KLQl3aGlsZSAobikgewotCQlidWZmZXIgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgcmJfbm9kZSk7Ci0JCUJVR19PTihidWZmZXItPmZyZWUpOwotCi0JCWlmIChrZXJuX3B0ciA8IGJ1ZmZlcikKLQkJCW4gPSBuLT5yYl9sZWZ0OwotCQllbHNlIGlmIChrZXJuX3B0ciA+IGJ1ZmZlcikKLQkJCW4gPSBuLT5yYl9yaWdodDsKLQkJZWxzZQotCQkJcmV0dXJuIGJ1ZmZlcjsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgYmluZGVyX3VwZGF0ZV9wYWdlX3JhbmdlKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgaW50IGFsbG9jYXRlLAotCQkJCSAgICB2b2lkICpzdGFydCwgdm9pZCAqZW5kLAotCQkJCSAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQl2b2lkICpwYWdlX2FkZHI7Ci0JdW5zaWduZWQgbG9uZyB1c2VyX3BhZ2VfYWRkcjsKLQlzdHJ1Y3Qgdm1fc3RydWN0IHRtcF9hcmVhOwotCXN0cnVjdCBwYWdlICoqcGFnZTsKLQlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKLQotCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfQlVGRkVSX0FMTE9DLAotCQkgICAgICJiaW5kZXI6ICVkOiAlcyBwYWdlcyAlcC0lcFxuIiwgcHJvYy0+cGlkLAotCQkgICAgIGFsbG9jYXRlID8gImFsbG9jYXRlIiA6ICJmcmVlIiwgc3RhcnQsIGVuZCk7Ci0KLQlpZiAoZW5kIDw9IHN0YXJ0KQotCQlyZXR1cm4gMDsKLQotCWlmICh2bWEpCi0JCW1tID0gTlVMTDsKLQllbHNlCi0JCW1tID0gZ2V0X3Rhc2tfbW0ocHJvYy0+dHNrKTsKLQotCWlmIChtbSkgewotCQlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwotCQl2bWEgPSBwcm9jLT52bWE7Ci0JfQotCi0JaWYgKGFsbG9jYXRlID09IDApCi0JCWdvdG8gZnJlZV9yYW5nZTsKLQotCWlmICh2bWEgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYgZmFpbGVkIHRvICIKLQkJICAgICAgICJtYXAgcGFnZXMgaW4gdXNlcnNwYWNlLCBubyB2bWFcbiIsIHByb2MtPnBpZCk7Ci0JCWdvdG8gZXJyX25vX3ZtYTsKLQl9Ci0KLQlmb3IgKHBhZ2VfYWRkciA9IHN0YXJ0OyBwYWdlX2FkZHIgPCBlbmQ7IHBhZ2VfYWRkciArPSBQQUdFX1NJWkUpIHsKLQkJaW50IHJldDsKLQkJc3RydWN0IHBhZ2UgKipwYWdlX2FycmF5X3B0cjsKLQkJcGFnZSA9ICZwcm9jLT5wYWdlc1socGFnZV9hZGRyIC0gcHJvYy0+YnVmZmVyKSAvIFBBR0VfU0laRV07Ci0KLQkJQlVHX09OKCpwYWdlKTsKLQkJKnBhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKLQkJaWYgKCpwYWdlID09IE5VTEwpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiAlZDogYmluZGVyX2FsbG9jX2J1ZiBmYWlsZWQgIgotCQkJICAgICAgICJmb3IgcGFnZSBhdCAlcFxuIiwgcHJvYy0+cGlkLCBwYWdlX2FkZHIpOwotCQkJZ290byBlcnJfYWxsb2NfcGFnZV9mYWlsZWQ7Ci0JCX0KLQkJdG1wX2FyZWEuYWRkciA9IHBhZ2VfYWRkcjsKLQkJdG1wX2FyZWEuc2l6ZSA9IFBBR0VfU0laRSArIFBBR0VfU0laRSAvKiBndWFyZCBwYWdlPyAqLzsKLQkJcGFnZV9hcnJheV9wdHIgPSBwYWdlOwotCQlyZXQgPSBtYXBfdm1fYXJlYSgmdG1wX2FyZWEsIFBBR0VfS0VSTkVMLCAmcGFnZV9hcnJheV9wdHIpOwotCQlpZiAocmV0KSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYgZmFpbGVkICIKLQkJCSAgICAgICAidG8gbWFwIHBhZ2UgYXQgJXAgaW4ga2VybmVsXG4iLAotCQkJICAgICAgIHByb2MtPnBpZCwgcGFnZV9hZGRyKTsKLQkJCWdvdG8gZXJyX21hcF9rZXJuZWxfZmFpbGVkOwotCQl9Ci0JCXVzZXJfcGFnZV9hZGRyID0KLQkJCSh1aW50cHRyX3QpcGFnZV9hZGRyICsgcHJvYy0+dXNlcl9idWZmZXJfb2Zmc2V0OwotCQlyZXQgPSB2bV9pbnNlcnRfcGFnZSh2bWEsIHVzZXJfcGFnZV9hZGRyLCBwYWdlWzBdKTsKLQkJaWYgKHJldCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6ICVkOiBiaW5kZXJfYWxsb2NfYnVmIGZhaWxlZCAiCi0JCQkgICAgICAgInRvIG1hcCBwYWdlIGF0ICVseCBpbiB1c2Vyc3BhY2VcbiIsCi0JCQkgICAgICAgcHJvYy0+cGlkLCB1c2VyX3BhZ2VfYWRkcik7Ci0JCQlnb3RvIGVycl92bV9pbnNlcnRfcGFnZV9mYWlsZWQ7Ci0JCX0KLQkJLyogdm1faW5zZXJ0X3BhZ2UgZG9lcyBub3Qgc2VlbSB0byBpbmNyZW1lbnQgdGhlIHJlZmNvdW50ICovCi0JfQotCWlmIChtbSkgewotCQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKLQkJbW1wdXQobW0pOwotCX0KLQlyZXR1cm4gMDsKLQotZnJlZV9yYW5nZToKLQlmb3IgKHBhZ2VfYWRkciA9IGVuZCAtIFBBR0VfU0laRTsgcGFnZV9hZGRyID49IHN0YXJ0OwotCSAgICAgcGFnZV9hZGRyIC09IFBBR0VfU0laRSkgewotCQlwYWdlID0gJnByb2MtPnBhZ2VzWyhwYWdlX2FkZHIgLSBwcm9jLT5idWZmZXIpIC8gUEFHRV9TSVpFXTsKLQkJaWYgKHZtYSkKLQkJCXphcF9wYWdlX3JhbmdlKHZtYSwgKHVpbnRwdHJfdClwYWdlX2FkZHIgKwotCQkJCXByb2MtPnVzZXJfYnVmZmVyX29mZnNldCwgUEFHRV9TSVpFLCBOVUxMKTsKLWVycl92bV9pbnNlcnRfcGFnZV9mYWlsZWQ6Ci0JCXVubWFwX2tlcm5lbF9yYW5nZSgodW5zaWduZWQgbG9uZylwYWdlX2FkZHIsIFBBR0VfU0laRSk7Ci1lcnJfbWFwX2tlcm5lbF9mYWlsZWQ6Ci0JCV9fZnJlZV9wYWdlKCpwYWdlKTsKLQkJKnBhZ2UgPSBOVUxMOwotZXJyX2FsbG9jX3BhZ2VfZmFpbGVkOgotCQk7Ci0JfQotZXJyX25vX3ZtYToKLQlpZiAobW0pIHsKLQkJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7Ci0JCW1tcHV0KG1tKTsKLQl9Ci0JcmV0dXJuIC1FTk9NRU07Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYmluZGVyX2FsbG9jX2J1ZihzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCi0JCQkJCSAgICAgIHNpemVfdCBkYXRhX3NpemUsCi0JCQkJCSAgICAgIHNpemVfdCBvZmZzZXRzX3NpemUsIGludCBpc19hc3luYykKLXsKLQlzdHJ1Y3QgcmJfbm9kZSAqbiA9IHByb2MtPmZyZWVfYnVmZmVycy5yYl9ub2RlOwotCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXI7Ci0Jc2l6ZV90IGJ1ZmZlcl9zaXplOwotCXN0cnVjdCByYl9ub2RlICpiZXN0X2ZpdCA9IE5VTEw7Ci0Jdm9pZCAqaGFzX3BhZ2VfYWRkcjsKLQl2b2lkICplbmRfcGFnZV9hZGRyOwotCXNpemVfdCBzaXplOwotCi0JaWYgKHByb2MtPnZtYSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiAlZDogYmluZGVyX2FsbG9jX2J1Ziwgbm8gdm1hXG4iLAotCQkgICAgICAgcHJvYy0+cGlkKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0Jc2l6ZSA9IEFMSUdOKGRhdGFfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpICsKLQkJQUxJR04ob2Zmc2V0c19zaXplLCBzaXplb2Yodm9pZCAqKSk7Ci0KLQlpZiAoc2l6ZSA8IGRhdGFfc2l6ZSB8fCBzaXplIDwgb2Zmc2V0c19zaXplKSB7Ci0JCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiBnb3QgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkICIKLQkJCSJzaXplICV6ZC0lemRcbiIsIHByb2MtPnBpZCwgZGF0YV9zaXplLCBvZmZzZXRzX3NpemUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlpZiAoaXNfYXN5bmMgJiYKLQkgICAgcHJvYy0+ZnJlZV9hc3luY19zcGFjZSA8IHNpemUgKyBzaXplb2Yoc3RydWN0IGJpbmRlcl9idWZmZXIpKSB7Ci0JCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfQlVGRkVSX0FMTE9DLAotCQkJICAgICAiYmluZGVyOiAlZDogYmluZGVyX2FsbG9jX2J1ZiBzaXplICV6ZCIKLQkJCSAgICAgImZhaWxlZCwgbm8gYXN5bmMgc3BhY2UgbGVmdFxuIiwgcHJvYy0+cGlkLCBzaXplKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0Jd2hpbGUgKG4pIHsKLQkJYnVmZmVyID0gcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9idWZmZXIsIHJiX25vZGUpOwotCQlCVUdfT04oIWJ1ZmZlci0+ZnJlZSk7Ci0JCWJ1ZmZlcl9zaXplID0gYmluZGVyX2J1ZmZlcl9zaXplKHByb2MsIGJ1ZmZlcik7Ci0KLQkJaWYgKHNpemUgPCBidWZmZXJfc2l6ZSkgewotCQkJYmVzdF9maXQgPSBuOwotCQkJbiA9IG4tPnJiX2xlZnQ7Ci0JCX0gZWxzZSBpZiAoc2l6ZSA+IGJ1ZmZlcl9zaXplKQotCQkJbiA9IG4tPnJiX3JpZ2h0OwotCQllbHNlIHsKLQkJCWJlc3RfZml0ID0gbjsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChiZXN0X2ZpdCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiAlZDogYmluZGVyX2FsbG9jX2J1ZiBzaXplICV6ZCBmYWlsZWQsICIKLQkJICAgICAgICJubyBhZGRyZXNzIHNwYWNlXG4iLCBwcm9jLT5waWQsIHNpemUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKG4gPT0gTlVMTCkgewotCQlidWZmZXIgPSByYl9lbnRyeShiZXN0X2ZpdCwgc3RydWN0IGJpbmRlcl9idWZmZXIsIHJiX25vZGUpOwotCQlidWZmZXJfc2l6ZSA9IGJpbmRlcl9idWZmZXJfc2l6ZShwcm9jLCBidWZmZXIpOwotCX0KLQotCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfQlVGRkVSX0FMTE9DLAotCQkgICAgICJiaW5kZXI6ICVkOiBiaW5kZXJfYWxsb2NfYnVmIHNpemUgJXpkIGdvdCBidWZmIgotCQkgICAgICJlciAlcCBzaXplICV6ZFxuIiwgcHJvYy0+cGlkLCBzaXplLCBidWZmZXIsIGJ1ZmZlcl9zaXplKTsKLQotCWhhc19wYWdlX2FkZHIgPQotCQkodm9pZCAqKSgoKHVpbnRwdHJfdClidWZmZXItPmRhdGEgKyBidWZmZXJfc2l6ZSkgJiBQQUdFX01BU0spOwotCWlmIChuID09IE5VTEwpIHsKLQkJaWYgKHNpemUgKyBzaXplb2Yoc3RydWN0IGJpbmRlcl9idWZmZXIpICsgNCA+PSBidWZmZXJfc2l6ZSkKLQkJCWJ1ZmZlcl9zaXplID0gc2l6ZTsgLyogbm8gcm9vbSBmb3Igb3RoZXIgYnVmZmVycyAqLwotCQllbHNlCi0JCQlidWZmZXJfc2l6ZSA9IHNpemUgKyBzaXplb2Yoc3RydWN0IGJpbmRlcl9idWZmZXIpOwotCX0KLQllbmRfcGFnZV9hZGRyID0KLQkJKHZvaWQgKilQQUdFX0FMSUdOKCh1aW50cHRyX3QpYnVmZmVyLT5kYXRhICsgYnVmZmVyX3NpemUpOwotCWlmIChlbmRfcGFnZV9hZGRyID4gaGFzX3BhZ2VfYWRkcikKLQkJZW5kX3BhZ2VfYWRkciA9IGhhc19wYWdlX2FkZHI7Ci0JaWYgKGJpbmRlcl91cGRhdGVfcGFnZV9yYW5nZShwcm9jLCAxLAotCSAgICAodm9pZCAqKVBBR0VfQUxJR04oKHVpbnRwdHJfdClidWZmZXItPmRhdGEpLCBlbmRfcGFnZV9hZGRyLCBOVUxMKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyYl9lcmFzZShiZXN0X2ZpdCwgJnByb2MtPmZyZWVfYnVmZmVycyk7Ci0JYnVmZmVyLT5mcmVlID0gMDsKLQliaW5kZXJfaW5zZXJ0X2FsbG9jYXRlZF9idWZmZXIocHJvYywgYnVmZmVyKTsKLQlpZiAoYnVmZmVyX3NpemUgIT0gc2l6ZSkgewotCQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqbmV3X2J1ZmZlciA9ICh2b2lkICopYnVmZmVyLT5kYXRhICsgc2l6ZTsKLQkJbGlzdF9hZGQoJm5ld19idWZmZXItPmVudHJ5LCAmYnVmZmVyLT5lbnRyeSk7Ci0JCW5ld19idWZmZXItPmZyZWUgPSAxOwotCQliaW5kZXJfaW5zZXJ0X2ZyZWVfYnVmZmVyKHByb2MsIG5ld19idWZmZXIpOwotCX0KLQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQywKLQkJICAgICAiYmluZGVyOiAlZDogYmluZGVyX2FsbG9jX2J1ZiBzaXplICV6ZCBnb3QgIgotCQkgICAgICIlcFxuIiwgcHJvYy0+cGlkLCBzaXplLCBidWZmZXIpOwotCWJ1ZmZlci0+ZGF0YV9zaXplID0gZGF0YV9zaXplOwotCWJ1ZmZlci0+b2Zmc2V0c19zaXplID0gb2Zmc2V0c19zaXplOwotCWJ1ZmZlci0+YXN5bmNfdHJhbnNhY3Rpb24gPSBpc19hc3luYzsKLQlpZiAoaXNfYXN5bmMpIHsKLQkJcHJvYy0+ZnJlZV9hc3luY19zcGFjZSAtPSBzaXplICsgc2l6ZW9mKHN0cnVjdCBiaW5kZXJfYnVmZmVyKTsKLQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0NfQVNZTkMsCi0JCQkgICAgICJiaW5kZXI6ICVkOiBiaW5kZXJfYWxsb2NfYnVmIHNpemUgJXpkICIKLQkJCSAgICAgImFzeW5jIGZyZWUgJXpkXG4iLCBwcm9jLT5waWQsIHNpemUsCi0JCQkgICAgIHByb2MtPmZyZWVfYXN5bmNfc3BhY2UpOwotCX0KLQotCXJldHVybiBidWZmZXI7Ci19Ci0KLXN0YXRpYyB2b2lkICpidWZmZXJfc3RhcnRfcGFnZShzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyKQotewotCXJldHVybiAodm9pZCAqKSgodWludHB0cl90KWJ1ZmZlciAmIFBBR0VfTUFTSyk7Ci19Ci0KLXN0YXRpYyB2b2lkICpidWZmZXJfZW5kX3BhZ2Uoc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcikKLXsKLQlyZXR1cm4gKHZvaWQgKikoKCh1aW50cHRyX3QpKGJ1ZmZlciArIDEpIC0gMSkgJiBQQUdFX01BU0spOwotfQotCi1zdGF0aWMgdm9pZCBiaW5kZXJfZGVsZXRlX2ZyZWVfYnVmZmVyKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywKLQkJCQkgICAgICBzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyKQotewotCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpwcmV2LCAqbmV4dCA9IE5VTEw7Ci0JaW50IGZyZWVfcGFnZV9lbmQgPSAxOwotCWludCBmcmVlX3BhZ2Vfc3RhcnQgPSAxOwotCi0JQlVHX09OKHByb2MtPmJ1ZmZlcnMubmV4dCA9PSAmYnVmZmVyLT5lbnRyeSk7Ci0JcHJldiA9IGxpc3RfZW50cnkoYnVmZmVyLT5lbnRyeS5wcmV2LCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgZW50cnkpOwotCUJVR19PTighcHJldi0+ZnJlZSk7Ci0JaWYgKGJ1ZmZlcl9lbmRfcGFnZShwcmV2KSA9PSBidWZmZXJfc3RhcnRfcGFnZShidWZmZXIpKSB7Ci0JCWZyZWVfcGFnZV9zdGFydCA9IDA7Ci0JCWlmIChidWZmZXJfZW5kX3BhZ2UocHJldikgPT0gYnVmZmVyX2VuZF9wYWdlKGJ1ZmZlcikpCi0JCQlmcmVlX3BhZ2VfZW5kID0gMDsKLQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MsCi0JCQkgICAgICJiaW5kZXI6ICVkOiBtZXJnZSBmcmVlLCBidWZmZXIgJXAgIgotCQkJICAgICAic2hhcmUgcGFnZSB3aXRoICVwXG4iLCBwcm9jLT5waWQsIGJ1ZmZlciwgcHJldik7Ci0JfQotCi0JaWYgKCFsaXN0X2lzX2xhc3QoJmJ1ZmZlci0+ZW50cnksICZwcm9jLT5idWZmZXJzKSkgewotCQluZXh0ID0gbGlzdF9lbnRyeShidWZmZXItPmVudHJ5Lm5leHQsCi0JCQkJICBzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgZW50cnkpOwotCQlpZiAoYnVmZmVyX3N0YXJ0X3BhZ2UobmV4dCkgPT0gYnVmZmVyX2VuZF9wYWdlKGJ1ZmZlcikpIHsKLQkJCWZyZWVfcGFnZV9lbmQgPSAwOwotCQkJaWYgKGJ1ZmZlcl9zdGFydF9wYWdlKG5leHQpID09Ci0JCQkgICAgYnVmZmVyX3N0YXJ0X3BhZ2UoYnVmZmVyKSkKLQkJCQlmcmVlX3BhZ2Vfc3RhcnQgPSAwOwotCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MsCi0JCQkJICAgICAiYmluZGVyOiAlZDogbWVyZ2UgZnJlZSwgYnVmZmVyIgotCQkJCSAgICAgIiAlcCBzaGFyZSBwYWdlIHdpdGggJXBcbiIsIHByb2MtPnBpZCwKLQkJCQkgICAgIGJ1ZmZlciwgcHJldik7Ci0JCX0KLQl9Ci0JbGlzdF9kZWwoJmJ1ZmZlci0+ZW50cnkpOwotCWlmIChmcmVlX3BhZ2Vfc3RhcnQgfHwgZnJlZV9wYWdlX2VuZCkgewotCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQywKLQkJCSAgICAgImJpbmRlcjogJWQ6IG1lcmdlIGZyZWUsIGJ1ZmZlciAlcCBkbyAiCi0JCQkgICAgICJub3Qgc2hhcmUgcGFnZSVzJXMgd2l0aCB3aXRoICVwIG9yICVwXG4iLAotCQkJICAgICBwcm9jLT5waWQsIGJ1ZmZlciwgZnJlZV9wYWdlX3N0YXJ0ID8gIiIgOiAiIGVuZCIsCi0JCQkgICAgIGZyZWVfcGFnZV9lbmQgPyAiIiA6ICIgc3RhcnQiLCBwcmV2LCBuZXh0KTsKLQkJYmluZGVyX3VwZGF0ZV9wYWdlX3JhbmdlKHByb2MsIDAsIGZyZWVfcGFnZV9zdGFydCA/Ci0JCQlidWZmZXJfc3RhcnRfcGFnZShidWZmZXIpIDogYnVmZmVyX2VuZF9wYWdlKGJ1ZmZlciksCi0JCQkoZnJlZV9wYWdlX2VuZCA/IGJ1ZmZlcl9lbmRfcGFnZShidWZmZXIpIDoKLQkJCWJ1ZmZlcl9zdGFydF9wYWdlKGJ1ZmZlcikpICsgUEFHRV9TSVpFLCBOVUxMKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJpbmRlcl9mcmVlX2J1ZihzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCi0JCQkgICAgc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcikKLXsKLQlzaXplX3Qgc2l6ZSwgYnVmZmVyX3NpemU7Ci0KLQlidWZmZXJfc2l6ZSA9IGJpbmRlcl9idWZmZXJfc2l6ZShwcm9jLCBidWZmZXIpOwotCi0Jc2l6ZSA9IEFMSUdOKGJ1ZmZlci0+ZGF0YV9zaXplLCBzaXplb2Yodm9pZCAqKSkgKwotCQlBTElHTihidWZmZXItPm9mZnNldHNfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpOwotCi0JYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MsCi0JCSAgICAgImJpbmRlcjogJWQ6IGJpbmRlcl9mcmVlX2J1ZiAlcCBzaXplICV6ZCBidWZmZXIiCi0JCSAgICAgIl9zaXplICV6ZFxuIiwgcHJvYy0+cGlkLCBidWZmZXIsIHNpemUsIGJ1ZmZlcl9zaXplKTsKLQotCUJVR19PTihidWZmZXItPmZyZWUpOwotCUJVR19PTihzaXplID4gYnVmZmVyX3NpemUpOwotCUJVR19PTihidWZmZXItPnRyYW5zYWN0aW9uICE9IE5VTEwpOwotCUJVR19PTigodm9pZCAqKWJ1ZmZlciA8IHByb2MtPmJ1ZmZlcik7Ci0JQlVHX09OKCh2b2lkICopYnVmZmVyID4gcHJvYy0+YnVmZmVyICsgcHJvYy0+YnVmZmVyX3NpemUpOwotCi0JaWYgKGJ1ZmZlci0+YXN5bmNfdHJhbnNhY3Rpb24pIHsKLQkJcHJvYy0+ZnJlZV9hc3luY19zcGFjZSArPSBzaXplICsgc2l6ZW9mKHN0cnVjdCBiaW5kZXJfYnVmZmVyKTsKLQotCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQ19BU1lOQywKLQkJCSAgICAgImJpbmRlcjogJWQ6IGJpbmRlcl9mcmVlX2J1ZiBzaXplICV6ZCAiCi0JCQkgICAgICJhc3luYyBmcmVlICV6ZFxuIiwgcHJvYy0+cGlkLCBzaXplLAotCQkJICAgICBwcm9jLT5mcmVlX2FzeW5jX3NwYWNlKTsKLQl9Ci0KLQliaW5kZXJfdXBkYXRlX3BhZ2VfcmFuZ2UocHJvYywgMCwKLQkJKHZvaWQgKilQQUdFX0FMSUdOKCh1aW50cHRyX3QpYnVmZmVyLT5kYXRhKSwKLQkJKHZvaWQgKikoKCh1aW50cHRyX3QpYnVmZmVyLT5kYXRhICsgYnVmZmVyX3NpemUpICYgUEFHRV9NQVNLKSwKLQkJTlVMTCk7Ci0JcmJfZXJhc2UoJmJ1ZmZlci0+cmJfbm9kZSwgJnByb2MtPmFsbG9jYXRlZF9idWZmZXJzKTsKLQlidWZmZXItPmZyZWUgPSAxOwotCWlmICghbGlzdF9pc19sYXN0KCZidWZmZXItPmVudHJ5LCAmcHJvYy0+YnVmZmVycykpIHsKLQkJc3RydWN0IGJpbmRlcl9idWZmZXIgKm5leHQgPSBsaXN0X2VudHJ5KGJ1ZmZlci0+ZW50cnkubmV4dCwKLQkJCQkJCXN0cnVjdCBiaW5kZXJfYnVmZmVyLCBlbnRyeSk7Ci0JCWlmIChuZXh0LT5mcmVlKSB7Ci0JCQlyYl9lcmFzZSgmbmV4dC0+cmJfbm9kZSwgJnByb2MtPmZyZWVfYnVmZmVycyk7Ci0JCQliaW5kZXJfZGVsZXRlX2ZyZWVfYnVmZmVyKHByb2MsIG5leHQpOwotCQl9Ci0JfQotCWlmIChwcm9jLT5idWZmZXJzLm5leHQgIT0gJmJ1ZmZlci0+ZW50cnkpIHsKLQkJc3RydWN0IGJpbmRlcl9idWZmZXIgKnByZXYgPSBsaXN0X2VudHJ5KGJ1ZmZlci0+ZW50cnkucHJldiwKLQkJCQkJCXN0cnVjdCBiaW5kZXJfYnVmZmVyLCBlbnRyeSk7Ci0JCWlmIChwcmV2LT5mcmVlKSB7Ci0JCQliaW5kZXJfZGVsZXRlX2ZyZWVfYnVmZmVyKHByb2MsIGJ1ZmZlcik7Ci0JCQlyYl9lcmFzZSgmcHJldi0+cmJfbm9kZSwgJnByb2MtPmZyZWVfYnVmZmVycyk7Ci0JCQlidWZmZXIgPSBwcmV2OwotCQl9Ci0JfQotCWJpbmRlcl9pbnNlcnRfZnJlZV9idWZmZXIocHJvYywgYnVmZmVyKTsKLX0KLQotc3RhdGljIHN0cnVjdCBiaW5kZXJfbm9kZSAqYmluZGVyX2dldF9ub2RlKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywKLQkJCQkJICAgdm9pZCBfX3VzZXIgKnB0cikKLXsKLQlzdHJ1Y3QgcmJfbm9kZSAqbiA9IHByb2MtPm5vZGVzLnJiX25vZGU7Ci0Jc3RydWN0IGJpbmRlcl9ub2RlICpub2RlOwotCi0Jd2hpbGUgKG4pIHsKLQkJbm9kZSA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfbm9kZSwgcmJfbm9kZSk7Ci0KLQkJaWYgKHB0ciA8IG5vZGUtPnB0cikKLQkJCW4gPSBuLT5yYl9sZWZ0OwotCQllbHNlIGlmIChwdHIgPiBub2RlLT5wdHIpCi0JCQluID0gbi0+cmJfcmlnaHQ7Ci0JCWVsc2UKLQkJCXJldHVybiBub2RlOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHN0cnVjdCBiaW5kZXJfbm9kZSAqYmluZGVyX25ld19ub2RlKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywKLQkJCQkJICAgdm9pZCBfX3VzZXIgKnB0ciwKLQkJCQkJICAgdm9pZCBfX3VzZXIgKmNvb2tpZSkKLXsKLQlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmcHJvYy0+bm9kZXMucmJfbm9kZTsKLQlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKLQlzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGU7Ci0KLQl3aGlsZSAoKnApIHsKLQkJcGFyZW50ID0gKnA7Ci0JCW5vZGUgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBiaW5kZXJfbm9kZSwgcmJfbm9kZSk7Ci0KLQkJaWYgKHB0ciA8IG5vZGUtPnB0cikKLQkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKLQkJZWxzZSBpZiAocHRyID4gbm9kZS0+cHRyKQotCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKLQkJZWxzZQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0Jbm9kZSA9IGt6YWxsb2Moc2l6ZW9mKCpub2RlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKG5vZGUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYmluZGVyX3N0YXRzX2NyZWF0ZWQoQklOREVSX1NUQVRfTk9ERSk7Ci0JcmJfbGlua19ub2RlKCZub2RlLT5yYl9ub2RlLCBwYXJlbnQsIHApOwotCXJiX2luc2VydF9jb2xvcigmbm9kZS0+cmJfbm9kZSwgJnByb2MtPm5vZGVzKTsKLQlub2RlLT5kZWJ1Z19pZCA9ICsrYmluZGVyX2xhc3RfaWQ7Ci0Jbm9kZS0+cHJvYyA9IHByb2M7Ci0Jbm9kZS0+cHRyID0gcHRyOwotCW5vZGUtPmNvb2tpZSA9IGNvb2tpZTsKLQlub2RlLT53b3JrLnR5cGUgPSBCSU5ERVJfV09SS19OT0RFOwotCUlOSVRfTElTVF9IRUFEKCZub2RlLT53b3JrLmVudHJ5KTsKLQlJTklUX0xJU1RfSEVBRCgmbm9kZS0+YXN5bmNfdG9kbyk7Ci0JYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19JTlRFUk5BTF9SRUZTLAotCQkgICAgICJiaW5kZXI6ICVkOiVkIG5vZGUgJWQgdSVwIGMlcCBjcmVhdGVkXG4iLAotCQkgICAgIHByb2MtPnBpZCwgY3VycmVudC0+cGlkLCBub2RlLT5kZWJ1Z19pZCwKLQkJICAgICBub2RlLT5wdHIsIG5vZGUtPmNvb2tpZSk7Ci0JcmV0dXJuIG5vZGU7Ci19Ci0KLXN0YXRpYyBpbnQgYmluZGVyX2luY19ub2RlKHN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZSwgaW50IHN0cm9uZywgaW50IGludGVybmFsLAotCQkJICAgc3RydWN0IGxpc3RfaGVhZCAqdGFyZ2V0X2xpc3QpCi17Ci0JaWYgKHN0cm9uZykgewotCQlpZiAoaW50ZXJuYWwpIHsKLQkJCWlmICh0YXJnZXRfbGlzdCA9PSBOVUxMICYmCi0JCQkgICAgbm9kZS0+aW50ZXJuYWxfc3Ryb25nX3JlZnMgPT0gMCAmJgotCQkJICAgICEobm9kZSA9PSBiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZSAmJgotCQkJICAgIG5vZGUtPmhhc19zdHJvbmdfcmVmKSkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiBpbnZhbGlkIGluYyBzdHJvbmcgIgotCQkJCQkibm9kZSBmb3IgJWRcbiIsIG5vZGUtPmRlYnVnX2lkKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJCW5vZGUtPmludGVybmFsX3N0cm9uZ19yZWZzKys7Ci0JCX0gZWxzZQotCQkJbm9kZS0+bG9jYWxfc3Ryb25nX3JlZnMrKzsKLQkJaWYgKCFub2RlLT5oYXNfc3Ryb25nX3JlZiAmJiB0YXJnZXRfbGlzdCkgewotCQkJbGlzdF9kZWxfaW5pdCgmbm9kZS0+d29yay5lbnRyeSk7Ci0JCQlsaXN0X2FkZF90YWlsKCZub2RlLT53b3JrLmVudHJ5LCB0YXJnZXRfbGlzdCk7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoIWludGVybmFsKQotCQkJbm9kZS0+bG9jYWxfd2Vha19yZWZzKys7Ci0JCWlmICghbm9kZS0+aGFzX3dlYWtfcmVmICYmIGxpc3RfZW1wdHkoJm5vZGUtPndvcmsuZW50cnkpKSB7Ci0JCQlpZiAodGFyZ2V0X2xpc3QgPT0gTlVMTCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiBpbnZhbGlkIGluYyB3ZWFrIG5vZGUgIgotCQkJCQkiZm9yICVkXG4iLCBub2RlLT5kZWJ1Z19pZCk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCQlsaXN0X2FkZF90YWlsKCZub2RlLT53b3JrLmVudHJ5LCB0YXJnZXRfbGlzdCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYmluZGVyX2RlY19ub2RlKHN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZSwgaW50IHN0cm9uZywgaW50IGludGVybmFsKQotewotCWlmIChzdHJvbmcpIHsKLQkJaWYgKGludGVybmFsKQotCQkJbm9kZS0+aW50ZXJuYWxfc3Ryb25nX3JlZnMtLTsKLQkJZWxzZQotCQkJbm9kZS0+bG9jYWxfc3Ryb25nX3JlZnMtLTsKLQkJaWYgKG5vZGUtPmxvY2FsX3N0cm9uZ19yZWZzIHx8IG5vZGUtPmludGVybmFsX3N0cm9uZ19yZWZzKQotCQkJcmV0dXJuIDA7Ci0JfSBlbHNlIHsKLQkJaWYgKCFpbnRlcm5hbCkKLQkJCW5vZGUtPmxvY2FsX3dlYWtfcmVmcy0tOwotCQlpZiAobm9kZS0+bG9jYWxfd2Vha19yZWZzIHx8ICFobGlzdF9lbXB0eSgmbm9kZS0+cmVmcykpCi0JCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKG5vZGUtPnByb2MgJiYgKG5vZGUtPmhhc19zdHJvbmdfcmVmIHx8IG5vZGUtPmhhc193ZWFrX3JlZikpIHsKLQkJaWYgKGxpc3RfZW1wdHkoJm5vZGUtPndvcmsuZW50cnkpKSB7Ci0JCQlsaXN0X2FkZF90YWlsKCZub2RlLT53b3JrLmVudHJ5LCAmbm9kZS0+cHJvYy0+dG9kbyk7Ci0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJm5vZGUtPnByb2MtPndhaXQpOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKGhsaXN0X2VtcHR5KCZub2RlLT5yZWZzKSAmJiAhbm9kZS0+bG9jYWxfc3Ryb25nX3JlZnMgJiYKLQkJICAgICFub2RlLT5sb2NhbF93ZWFrX3JlZnMpIHsKLQkJCWxpc3RfZGVsX2luaXQoJm5vZGUtPndvcmsuZW50cnkpOwotCQkJaWYgKG5vZGUtPnByb2MpIHsKLQkJCQlyYl9lcmFzZSgmbm9kZS0+cmJfbm9kZSwgJm5vZGUtPnByb2MtPm5vZGVzKTsKLQkJCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0lOVEVSTkFMX1JFRlMsCi0JCQkJCSAgICAgImJpbmRlcjogcmVmbGVzcyBub2RlICVkIGRlbGV0ZWRcbiIsCi0JCQkJCSAgICAgbm9kZS0+ZGVidWdfaWQpOwotCQkJfSBlbHNlIHsKLQkJCQlobGlzdF9kZWwoJm5vZGUtPmRlYWRfbm9kZSk7Ci0JCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19JTlRFUk5BTF9SRUZTLAotCQkJCQkgICAgICJiaW5kZXI6IGRlYWQgbm9kZSAlZCBkZWxldGVkXG4iLAotCQkJCQkgICAgIG5vZGUtPmRlYnVnX2lkKTsKLQkJCX0KLQkJCWtmcmVlKG5vZGUpOwotCQkJYmluZGVyX3N0YXRzX2RlbGV0ZWQoQklOREVSX1NUQVRfTk9ERSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgc3RydWN0IGJpbmRlcl9yZWYgKmJpbmRlcl9nZXRfcmVmKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywKLQkJCQkJIHVpbnQzMl90IGRlc2MpCi17Ci0Jc3RydWN0IHJiX25vZGUgKm4gPSBwcm9jLT5yZWZzX2J5X2Rlc2MucmJfbm9kZTsKLQlzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmOwotCi0Jd2hpbGUgKG4pIHsKLQkJcmVmID0gcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9yZWYsIHJiX25vZGVfZGVzYyk7Ci0KLQkJaWYgKGRlc2MgPCByZWYtPmRlc2MpCi0JCQluID0gbi0+cmJfbGVmdDsKLQkJZWxzZSBpZiAoZGVzYyA+IHJlZi0+ZGVzYykKLQkJCW4gPSBuLT5yYl9yaWdodDsKLQkJZWxzZQotCQkJcmV0dXJuIHJlZjsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluZGVyX3JlZiAqYmluZGVyX2dldF9yZWZfZm9yX25vZGUoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLAotCQkJCQkJICBzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGUpCi17Ci0Jc3RydWN0IHJiX25vZGUgKm47Ci0Jc3RydWN0IHJiX25vZGUgKipwID0gJnByb2MtPnJlZnNfYnlfbm9kZS5yYl9ub2RlOwotCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOwotCXN0cnVjdCBiaW5kZXJfcmVmICpyZWYsICpuZXdfcmVmOwotCi0Jd2hpbGUgKCpwKSB7Ci0JCXBhcmVudCA9ICpwOwotCQlyZWYgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBiaW5kZXJfcmVmLCByYl9ub2RlX25vZGUpOwotCi0JCWlmIChub2RlIDwgcmVmLT5ub2RlKQotCQkJcCA9ICYoKnApLT5yYl9sZWZ0OwotCQllbHNlIGlmIChub2RlID4gcmVmLT5ub2RlKQotCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKLQkJZWxzZQotCQkJcmV0dXJuIHJlZjsKLQl9Ci0JbmV3X3JlZiA9IGt6YWxsb2Moc2l6ZW9mKCpyZWYpLCBHRlBfS0VSTkVMKTsKLQlpZiAobmV3X3JlZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQliaW5kZXJfc3RhdHNfY3JlYXRlZChCSU5ERVJfU1RBVF9SRUYpOwotCW5ld19yZWYtPmRlYnVnX2lkID0gKytiaW5kZXJfbGFzdF9pZDsKLQluZXdfcmVmLT5wcm9jID0gcHJvYzsKLQluZXdfcmVmLT5ub2RlID0gbm9kZTsKLQlyYl9saW5rX25vZGUoJm5ld19yZWYtPnJiX25vZGVfbm9kZSwgcGFyZW50LCBwKTsKLQlyYl9pbnNlcnRfY29sb3IoJm5ld19yZWYtPnJiX25vZGVfbm9kZSwgJnByb2MtPnJlZnNfYnlfbm9kZSk7Ci0KLQluZXdfcmVmLT5kZXNjID0gKG5vZGUgPT0gYmluZGVyX2NvbnRleHRfbWdyX25vZGUpID8gMCA6IDE7Ci0JZm9yIChuID0gcmJfZmlyc3QoJnByb2MtPnJlZnNfYnlfZGVzYyk7IG4gIT0gTlVMTDsgbiA9IHJiX25leHQobikpIHsKLQkJcmVmID0gcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9yZWYsIHJiX25vZGVfZGVzYyk7Ci0JCWlmIChyZWYtPmRlc2MgPiBuZXdfcmVmLT5kZXNjKQotCQkJYnJlYWs7Ci0JCW5ld19yZWYtPmRlc2MgPSByZWYtPmRlc2MgKyAxOwotCX0KLQotCXAgPSAmcHJvYy0+cmVmc19ieV9kZXNjLnJiX25vZGU7Ci0Jd2hpbGUgKCpwKSB7Ci0JCXBhcmVudCA9ICpwOwotCQlyZWYgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBiaW5kZXJfcmVmLCByYl9ub2RlX2Rlc2MpOwotCi0JCWlmIChuZXdfcmVmLT5kZXNjIDwgcmVmLT5kZXNjKQotCQkJcCA9ICYoKnApLT5yYl9sZWZ0OwotCQllbHNlIGlmIChuZXdfcmVmLT5kZXNjID4gcmVmLT5kZXNjKQotCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKLQkJZWxzZQotCQkJQlVHKCk7Ci0JfQotCXJiX2xpbmtfbm9kZSgmbmV3X3JlZi0+cmJfbm9kZV9kZXNjLCBwYXJlbnQsIHApOwotCXJiX2luc2VydF9jb2xvcigmbmV3X3JlZi0+cmJfbm9kZV9kZXNjLCAmcHJvYy0+cmVmc19ieV9kZXNjKTsKLQlpZiAobm9kZSkgewotCQlobGlzdF9hZGRfaGVhZCgmbmV3X3JlZi0+bm9kZV9lbnRyeSwgJm5vZGUtPnJlZnMpOwotCi0JCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfSU5URVJOQUxfUkVGUywKLQkJCSAgICAgImJpbmRlcjogJWQgbmV3IHJlZiAlZCBkZXNjICVkIGZvciAiCi0JCQkgICAgICJub2RlICVkXG4iLCBwcm9jLT5waWQsIG5ld19yZWYtPmRlYnVnX2lkLAotCQkJICAgICBuZXdfcmVmLT5kZXNjLCBub2RlLT5kZWJ1Z19pZCk7Ci0JfSBlbHNlIHsKLQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19JTlRFUk5BTF9SRUZTLAotCQkJICAgICAiYmluZGVyOiAlZCBuZXcgcmVmICVkIGRlc2MgJWQgZm9yICIKLQkJCSAgICAgImRlYWQgbm9kZVxuIiwgcHJvYy0+cGlkLCBuZXdfcmVmLT5kZWJ1Z19pZCwKLQkJCSAgICAgIG5ld19yZWYtPmRlc2MpOwotCX0KLQlyZXR1cm4gbmV3X3JlZjsKLX0KLQotc3RhdGljIHZvaWQgYmluZGVyX2RlbGV0ZV9yZWYoc3RydWN0IGJpbmRlcl9yZWYgKnJlZikKLXsKLQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0lOVEVSTkFMX1JFRlMsCi0JCSAgICAgImJpbmRlcjogJWQgZGVsZXRlIHJlZiAlZCBkZXNjICVkIGZvciAiCi0JCSAgICAgIm5vZGUgJWRcbiIsIHJlZi0+cHJvYy0+cGlkLCByZWYtPmRlYnVnX2lkLAotCQkgICAgIHJlZi0+ZGVzYywgcmVmLT5ub2RlLT5kZWJ1Z19pZCk7Ci0KLQlyYl9lcmFzZSgmcmVmLT5yYl9ub2RlX2Rlc2MsICZyZWYtPnByb2MtPnJlZnNfYnlfZGVzYyk7Ci0JcmJfZXJhc2UoJnJlZi0+cmJfbm9kZV9ub2RlLCAmcmVmLT5wcm9jLT5yZWZzX2J5X25vZGUpOwotCWlmIChyZWYtPnN0cm9uZykKLQkJYmluZGVyX2RlY19ub2RlKHJlZi0+bm9kZSwgMSwgMSk7Ci0JaGxpc3RfZGVsKCZyZWYtPm5vZGVfZW50cnkpOwotCWJpbmRlcl9kZWNfbm9kZShyZWYtPm5vZGUsIDAsIDEpOwotCWlmIChyZWYtPmRlYXRoKSB7Ci0JCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfREVBRF9CSU5ERVIsCi0JCQkgICAgICJiaW5kZXI6ICVkIGRlbGV0ZSByZWYgJWQgZGVzYyAlZCAiCi0JCQkgICAgICJoYXMgZGVhdGggbm90aWZpY2F0aW9uXG4iLCByZWYtPnByb2MtPnBpZCwKLQkJCSAgICAgcmVmLT5kZWJ1Z19pZCwgcmVmLT5kZXNjKTsKLQkJbGlzdF9kZWwoJnJlZi0+ZGVhdGgtPndvcmsuZW50cnkpOwotCQlrZnJlZShyZWYtPmRlYXRoKTsKLQkJYmluZGVyX3N0YXRzX2RlbGV0ZWQoQklOREVSX1NUQVRfREVBVEgpOwotCX0KLQlrZnJlZShyZWYpOwotCWJpbmRlcl9zdGF0c19kZWxldGVkKEJJTkRFUl9TVEFUX1JFRik7Ci19Ci0KLXN0YXRpYyBpbnQgYmluZGVyX2luY19yZWYoc3RydWN0IGJpbmRlcl9yZWYgKnJlZiwgaW50IHN0cm9uZywKLQkJCSAgc3RydWN0IGxpc3RfaGVhZCAqdGFyZ2V0X2xpc3QpCi17Ci0JaW50IHJldDsKLQlpZiAoc3Ryb25nKSB7Ci0JCWlmIChyZWYtPnN0cm9uZyA9PSAwKSB7Ci0JCQlyZXQgPSBiaW5kZXJfaW5jX25vZGUocmVmLT5ub2RlLCAxLCAxLCB0YXJnZXRfbGlzdCk7Ci0JCQlpZiAocmV0KQotCQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJcmVmLT5zdHJvbmcrKzsKLQl9IGVsc2UgewotCQlpZiAocmVmLT53ZWFrID09IDApIHsKLQkJCXJldCA9IGJpbmRlcl9pbmNfbm9kZShyZWYtPm5vZGUsIDAsIDEsIHRhcmdldF9saXN0KTsKLQkJCWlmIChyZXQpCi0JCQkJcmV0dXJuIHJldDsKLQkJfQotCQlyZWYtPndlYWsrKzsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludCBiaW5kZXJfZGVjX3JlZihzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmLCBpbnQgc3Ryb25nKQotewotCWlmIChzdHJvbmcpIHsKLQkJaWYgKHJlZi0+c3Ryb25nID09IDApIHsKLQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkIGludmFsaWQgZGVjIHN0cm9uZywgIgotCQkJCQkgICJyZWYgJWQgZGVzYyAlZCBzICVkIHcgJWRcbiIsCi0JCQkJCSAgcmVmLT5wcm9jLT5waWQsIHJlZi0+ZGVidWdfaWQsCi0JCQkJCSAgcmVmLT5kZXNjLCByZWYtPnN0cm9uZywgcmVmLT53ZWFrKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCXJlZi0+c3Ryb25nLS07Ci0JCWlmIChyZWYtPnN0cm9uZyA9PSAwKSB7Ci0JCQlpbnQgcmV0OwotCQkJcmV0ID0gYmluZGVyX2RlY19ub2RlKHJlZi0+bm9kZSwgc3Ryb25nLCAxKTsKLQkJCWlmIChyZXQpCi0JCQkJcmV0dXJuIHJldDsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChyZWYtPndlYWsgPT0gMCkgewotCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQgaW52YWxpZCBkZWMgd2VhaywgIgotCQkJCQkgICJyZWYgJWQgZGVzYyAlZCBzICVkIHcgJWRcbiIsCi0JCQkJCSAgcmVmLT5wcm9jLT5waWQsIHJlZi0+ZGVidWdfaWQsCi0JCQkJCSAgcmVmLT5kZXNjLCByZWYtPnN0cm9uZywgcmVmLT53ZWFrKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCXJlZi0+d2Vhay0tOwotCX0KLQlpZiAocmVmLT5zdHJvbmcgPT0gMCAmJiByZWYtPndlYWsgPT0gMCkKLQkJYmluZGVyX2RlbGV0ZV9yZWYocmVmKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYmluZGVyX3BvcF90cmFuc2FjdGlvbihzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGFyZ2V0X3RocmVhZCwKLQkJCQkgICBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0KQotewotCWlmICh0YXJnZXRfdGhyZWFkKSB7Ci0JCUJVR19PTih0YXJnZXRfdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjayAhPSB0KTsKLQkJQlVHX09OKHRhcmdldF90aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrLT5mcm9tICE9IHRhcmdldF90aHJlYWQpOwotCQl0YXJnZXRfdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjayA9Ci0JCQl0YXJnZXRfdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjay0+ZnJvbV9wYXJlbnQ7Ci0JCXQtPmZyb20gPSBOVUxMOwotCX0KLQl0LT5uZWVkX3JlcGx5ID0gMDsKLQlpZiAodC0+YnVmZmVyKQotCQl0LT5idWZmZXItPnRyYW5zYWN0aW9uID0gTlVMTDsKLQlrZnJlZSh0KTsKLQliaW5kZXJfc3RhdHNfZGVsZXRlZChCSU5ERVJfU1RBVF9UUkFOU0FDVElPTik7Ci19Ci0KLXN0YXRpYyB2b2lkIGJpbmRlcl9zZW5kX2ZhaWxlZF9yZXBseShzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0LAotCQkJCSAgICAgdWludDMyX3QgZXJyb3JfY29kZSkKLXsKLQlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGFyZ2V0X3RocmVhZDsKLQlCVUdfT04odC0+ZmxhZ3MgJiBURl9PTkVfV0FZKTsKLQl3aGlsZSAoMSkgewotCQl0YXJnZXRfdGhyZWFkID0gdC0+ZnJvbTsKLQkJaWYgKHRhcmdldF90aHJlYWQpIHsKLQkJCWlmICh0YXJnZXRfdGhyZWFkLT5yZXR1cm5fZXJyb3IgIT0gQlJfT0sgJiYKLQkJCSAgIHRhcmdldF90aHJlYWQtPnJldHVybl9lcnJvcjIgPT0gQlJfT0spIHsKLQkJCQl0YXJnZXRfdGhyZWFkLT5yZXR1cm5fZXJyb3IyID0KLQkJCQkJdGFyZ2V0X3RocmVhZC0+cmV0dXJuX2Vycm9yOwotCQkJCXRhcmdldF90aHJlYWQtPnJldHVybl9lcnJvciA9IEJSX09LOwotCQkJfQotCQkJaWYgKHRhcmdldF90aHJlYWQtPnJldHVybl9lcnJvciA9PSBCUl9PSykgewotCQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfRkFJTEVEX1RSQU5TQUNUSU9OLAotCQkJCQkgICAgICJiaW5kZXI6IHNlbmQgZmFpbGVkIHJlcGx5IGZvciAiCi0JCQkJCSAgICAgInRyYW5zYWN0aW9uICVkIHRvICVkOiVkXG4iLAotCQkJCQkgICAgICB0LT5kZWJ1Z19pZCwgdGFyZ2V0X3RocmVhZC0+cHJvYy0+cGlkLAotCQkJCQkgICAgICB0YXJnZXRfdGhyZWFkLT5waWQpOwotCi0JCQkJYmluZGVyX3BvcF90cmFuc2FjdGlvbih0YXJnZXRfdGhyZWFkLCB0KTsKLQkJCQl0YXJnZXRfdGhyZWFkLT5yZXR1cm5fZXJyb3IgPSBlcnJvcl9jb2RlOwotCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdGFyZ2V0X3RocmVhZC0+d2FpdCk7Ci0JCQl9IGVsc2UgewotCQkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiByZXBseSBmYWlsZWQsIHRhcmdldCAiCi0JCQkJCSJ0aHJlYWQsICVkOiVkLCBoYXMgZXJyb3IgY29kZSAlZCAiCi0JCQkJCSJhbHJlYWR5XG4iLCB0YXJnZXRfdGhyZWFkLT5wcm9jLT5waWQsCi0JCQkJCXRhcmdldF90aHJlYWQtPnBpZCwKLQkJCQkJdGFyZ2V0X3RocmVhZC0+cmV0dXJuX2Vycm9yKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfSBlbHNlIHsKLQkJCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKm5leHQgPSB0LT5mcm9tX3BhcmVudDsKLQotCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19GQUlMRURfVFJBTlNBQ1RJT04sCi0JCQkJICAgICAiYmluZGVyOiBzZW5kIGZhaWxlZCByZXBseSAiCi0JCQkJICAgICAiZm9yIHRyYW5zYWN0aW9uICVkLCB0YXJnZXQgZGVhZFxuIiwKLQkJCQkgICAgIHQtPmRlYnVnX2lkKTsKLQotCQkJYmluZGVyX3BvcF90cmFuc2FjdGlvbih0YXJnZXRfdGhyZWFkLCB0KTsKLQkJCWlmIChuZXh0ID09IE5VTEwpIHsKLQkJCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0RFQURfQklOREVSLAotCQkJCQkgICAgICJiaW5kZXI6IHJlcGx5IGZhaWxlZCwiCi0JCQkJCSAgICAgIiBubyB0YXJnZXQgdGhyZWFkIGF0IHJvb3RcbiIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCXQgPSBuZXh0OwotCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19ERUFEX0JJTkRFUiwKLQkJCQkgICAgICJiaW5kZXI6IHJlcGx5IGZhaWxlZCwgbm8gdGFyZ2V0ICIKLQkJCQkgICAgICJ0aHJlYWQgLS0gcmV0cnkgJWRcbiIsIHQtPmRlYnVnX2lkKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgYmluZGVyX3RyYW5zYWN0aW9uX2J1ZmZlcl9yZWxlYXNlKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywKLQkJCQkJICAgICAgc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlciwKLQkJCQkJICAgICAgc2l6ZV90ICpmYWlsZWRfYXQpCi17Ci0Jc2l6ZV90ICpvZmZwLCAqb2ZmX2VuZDsKLQlpbnQgZGVidWdfaWQgPSBidWZmZXItPmRlYnVnX2lkOwotCi0JYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTiwKLQkJICAgICAiYmluZGVyOiAlZCBidWZmZXIgcmVsZWFzZSAlZCwgc2l6ZSAlemQtJXpkLCBmYWlsZWQgYXQgJXBcbiIsCi0JCSAgICAgcHJvYy0+cGlkLCBidWZmZXItPmRlYnVnX2lkLAotCQkgICAgIGJ1ZmZlci0+ZGF0YV9zaXplLCBidWZmZXItPm9mZnNldHNfc2l6ZSwgZmFpbGVkX2F0KTsKLQotCWlmIChidWZmZXItPnRhcmdldF9ub2RlKQotCQliaW5kZXJfZGVjX25vZGUoYnVmZmVyLT50YXJnZXRfbm9kZSwgMSwgMCk7Ci0KLQlvZmZwID0gKHNpemVfdCAqKShidWZmZXItPmRhdGEgKyBBTElHTihidWZmZXItPmRhdGFfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpKTsKLQlpZiAoZmFpbGVkX2F0KQotCQlvZmZfZW5kID0gZmFpbGVkX2F0OwotCWVsc2UKLQkJb2ZmX2VuZCA9ICh2b2lkICopb2ZmcCArIGJ1ZmZlci0+b2Zmc2V0c19zaXplOwotCWZvciAoOyBvZmZwIDwgb2ZmX2VuZDsgb2ZmcCsrKSB7Ci0JCXN0cnVjdCBmbGF0X2JpbmRlcl9vYmplY3QgKmZwOwotCQlpZiAoKm9mZnAgPiBidWZmZXItPmRhdGFfc2l6ZSAtIHNpemVvZigqZnApIHx8Ci0JCSAgICBidWZmZXItPmRhdGFfc2l6ZSA8IHNpemVvZigqZnApIHx8Ci0JCSAgICAhSVNfQUxJR05FRCgqb2ZmcCwgc2l6ZW9mKHZvaWQgKikpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogdHJhbnNhY3Rpb24gcmVsZWFzZSAlZCBiYWQiCi0JCQkJCSJvZmZzZXQgJXpkLCBzaXplICV6ZFxuIiwgZGVidWdfaWQsCi0JCQkJCSpvZmZwLCBidWZmZXItPmRhdGFfc2l6ZSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlmcCA9IChzdHJ1Y3QgZmxhdF9iaW5kZXJfb2JqZWN0ICopKGJ1ZmZlci0+ZGF0YSArICpvZmZwKTsKLQkJc3dpdGNoIChmcC0+dHlwZSkgewotCQljYXNlIEJJTkRFUl9UWVBFX0JJTkRFUjoKLQkJY2FzZSBCSU5ERVJfVFlQRV9XRUFLX0JJTkRFUjogewotCQkJc3RydWN0IGJpbmRlcl9ub2RlICpub2RlID0gYmluZGVyX2dldF9ub2RlKHByb2MsIGZwLT5iaW5kZXIpOwotCQkJaWYgKG5vZGUgPT0gTlVMTCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiB0cmFuc2FjdGlvbiByZWxlYXNlICVkIgotCQkJCSAgICAgICAiIGJhZCBub2RlICVwXG4iLCBkZWJ1Z19pZCwgZnAtPmJpbmRlcik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OLAotCQkJCSAgICAgIiAgICAgICAgbm9kZSAlZCB1JXBcbiIsCi0JCQkJICAgICBub2RlLT5kZWJ1Z19pZCwgbm9kZS0+cHRyKTsKLQkJCWJpbmRlcl9kZWNfbm9kZShub2RlLCBmcC0+dHlwZSA9PSBCSU5ERVJfVFlQRV9CSU5ERVIsIDApOwotCQl9IGJyZWFrOwotCQljYXNlIEJJTkRFUl9UWVBFX0hBTkRMRToKLQkJY2FzZSBCSU5ERVJfVFlQRV9XRUFLX0hBTkRMRTogewotCQkJc3RydWN0IGJpbmRlcl9yZWYgKnJlZiA9IGJpbmRlcl9nZXRfcmVmKHByb2MsIGZwLT5oYW5kbGUpOwotCQkJaWYgKHJlZiA9PSBOVUxMKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6IHRyYW5zYWN0aW9uIHJlbGVhc2UgJWQiCi0JCQkJICAgICAgICIgYmFkIGhhbmRsZSAlbGRcbiIsIGRlYnVnX2lkLAotCQkJCSAgICAgICBmcC0+aGFuZGxlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04sCi0JCQkJICAgICAiICAgICAgICByZWYgJWQgZGVzYyAlZCAobm9kZSAlZClcbiIsCi0JCQkJICAgICByZWYtPmRlYnVnX2lkLCByZWYtPmRlc2MsIHJlZi0+bm9kZS0+ZGVidWdfaWQpOwotCQkJYmluZGVyX2RlY19yZWYocmVmLCBmcC0+dHlwZSA9PSBCSU5ERVJfVFlQRV9IQU5ETEUpOwotCQl9IGJyZWFrOwotCi0JCWNhc2UgQklOREVSX1RZUEVfRkQ6Ci0JCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OLAotCQkJCSAgICAgIiAgICAgICAgZmQgJWxkXG4iLCBmcC0+aGFuZGxlKTsKLQkJCWlmIChmYWlsZWRfYXQpCi0JCQkJdGFza19jbG9zZV9mZChwcm9jLCBmcC0+aGFuZGxlKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogdHJhbnNhY3Rpb24gcmVsZWFzZSAlZCBiYWQgIgotCQkJICAgICAgICJvYmplY3QgdHlwZSAlbHhcbiIsIGRlYnVnX2lkLCBmcC0+dHlwZSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgYmluZGVyX3RyYW5zYWN0aW9uKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywKLQkJCSAgICAgICBzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkLAotCQkJICAgICAgIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSAqdHIsIGludCByZXBseSkKLXsKLQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0OwotCXN0cnVjdCBiaW5kZXJfd29yayAqdGNvbXBsZXRlOwotCXNpemVfdCAqb2ZmcCwgKm9mZl9lbmQ7Ci0Jc3RydWN0IGJpbmRlcl9wcm9jICp0YXJnZXRfcHJvYzsKLQlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGFyZ2V0X3RocmVhZCA9IE5VTEw7Ci0Jc3RydWN0IGJpbmRlcl9ub2RlICp0YXJnZXRfbm9kZSA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdGFyZ2V0X2xpc3Q7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgKnRhcmdldF93YWl0OwotCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKmluX3JlcGx5X3RvID0gTlVMTDsKLQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19lbnRyeSAqZTsKLQl1aW50MzJfdCByZXR1cm5fZXJyb3I7Ci0KLQllID0gYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19hZGQoJmJpbmRlcl90cmFuc2FjdGlvbl9sb2cpOwotCWUtPmNhbGxfdHlwZSA9IHJlcGx5ID8gMiA6ICEhKHRyLT5mbGFncyAmIFRGX09ORV9XQVkpOwotCWUtPmZyb21fcHJvYyA9IHByb2MtPnBpZDsKLQllLT5mcm9tX3RocmVhZCA9IHRocmVhZC0+cGlkOwotCWUtPnRhcmdldF9oYW5kbGUgPSB0ci0+dGFyZ2V0LmhhbmRsZTsKLQllLT5kYXRhX3NpemUgPSB0ci0+ZGF0YV9zaXplOwotCWUtPm9mZnNldHNfc2l6ZSA9IHRyLT5vZmZzZXRzX3NpemU7Ci0KLQlpZiAocmVwbHkpIHsKLQkJaW5fcmVwbHlfdG8gPSB0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrOwotCQlpZiAoaW5fcmVwbHlfdG8gPT0gTlVMTCkgewotCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290IHJlcGx5IHRyYW5zYWN0aW9uICIKLQkJCQkJICAid2l0aCBubyB0cmFuc2FjdGlvbiBzdGFja1xuIiwKLQkJCQkJICBwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKLQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKLQkJCWdvdG8gZXJyX2VtcHR5X2NhbGxfc3RhY2s7Ci0JCX0KLQkJYmluZGVyX3NldF9uaWNlKGluX3JlcGx5X3RvLT5zYXZlZF9wcmlvcml0eSk7Ci0JCWlmIChpbl9yZXBseV90by0+dG9fdGhyZWFkICE9IHRocmVhZCkgewotCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290IHJlcGx5IHRyYW5zYWN0aW9uICIKLQkJCQkid2l0aCBiYWQgdHJhbnNhY3Rpb24gc3RhY2ssIgotCQkJCSIgdHJhbnNhY3Rpb24gJWQgaGFzIHRhcmdldCAlZDolZFxuIiwKLQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBpbl9yZXBseV90by0+ZGVidWdfaWQsCi0JCQkJaW5fcmVwbHlfdG8tPnRvX3Byb2MgPwotCQkJCWluX3JlcGx5X3RvLT50b19wcm9jLT5waWQgOiAwLAotCQkJCWluX3JlcGx5X3RvLT50b190aHJlYWQgPwotCQkJCWluX3JlcGx5X3RvLT50b190aHJlYWQtPnBpZCA6IDApOwotCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOwotCQkJaW5fcmVwbHlfdG8gPSBOVUxMOwotCQkJZ290byBlcnJfYmFkX2NhbGxfc3RhY2s7Ci0JCX0KLQkJdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjayA9IGluX3JlcGx5X3RvLT50b19wYXJlbnQ7Ci0JCXRhcmdldF90aHJlYWQgPSBpbl9yZXBseV90by0+ZnJvbTsKLQkJaWYgKHRhcmdldF90aHJlYWQgPT0gTlVMTCkgewotCQkJcmV0dXJuX2Vycm9yID0gQlJfREVBRF9SRVBMWTsKLQkJCWdvdG8gZXJyX2RlYWRfYmluZGVyOwotCQl9Ci0JCWlmICh0YXJnZXRfdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjayAhPSBpbl9yZXBseV90bykgewotCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290IHJlcGx5IHRyYW5zYWN0aW9uICIKLQkJCQkid2l0aCBiYWQgdGFyZ2V0IHRyYW5zYWN0aW9uIHN0YWNrICVkLCAiCi0JCQkJImV4cGVjdGVkICVkXG4iLAotCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCi0JCQkJdGFyZ2V0X3RocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2sgPwotCQkJCXRhcmdldF90aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrLT5kZWJ1Z19pZCA6IDAsCi0JCQkJaW5fcmVwbHlfdG8tPmRlYnVnX2lkKTsKLQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKLQkJCWluX3JlcGx5X3RvID0gTlVMTDsKLQkJCXRhcmdldF90aHJlYWQgPSBOVUxMOwotCQkJZ290byBlcnJfZGVhZF9iaW5kZXI7Ci0JCX0KLQkJdGFyZ2V0X3Byb2MgPSB0YXJnZXRfdGhyZWFkLT5wcm9jOwotCX0gZWxzZSB7Ci0JCWlmICh0ci0+dGFyZ2V0LmhhbmRsZSkgewotCQkJc3RydWN0IGJpbmRlcl9yZWYgKnJlZjsKLQkJCXJlZiA9IGJpbmRlcl9nZXRfcmVmKHByb2MsIHRyLT50YXJnZXQuaGFuZGxlKTsKLQkJCWlmIChyZWYgPT0gTlVMTCkgewotCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCAiCi0JCQkJCSJ0cmFuc2FjdGlvbiB0byBpbnZhbGlkIGhhbmRsZVxuIiwKLQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7Ci0JCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOwotCQkJCWdvdG8gZXJyX2ludmFsaWRfdGFyZ2V0X2hhbmRsZTsKLQkJCX0KLQkJCXRhcmdldF9ub2RlID0gcmVmLT5ub2RlOwotCQl9IGVsc2UgewotCQkJdGFyZ2V0X25vZGUgPSBiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZTsKLQkJCWlmICh0YXJnZXRfbm9kZSA9PSBOVUxMKSB7Ci0JCQkJcmV0dXJuX2Vycm9yID0gQlJfREVBRF9SRVBMWTsKLQkJCQlnb3RvIGVycl9ub19jb250ZXh0X21ncl9ub2RlOwotCQkJfQotCQl9Ci0JCWUtPnRvX25vZGUgPSB0YXJnZXRfbm9kZS0+ZGVidWdfaWQ7Ci0JCXRhcmdldF9wcm9jID0gdGFyZ2V0X25vZGUtPnByb2M7Ci0JCWlmICh0YXJnZXRfcHJvYyA9PSBOVUxMKSB7Ci0JCQlyZXR1cm5fZXJyb3IgPSBCUl9ERUFEX1JFUExZOwotCQkJZ290byBlcnJfZGVhZF9iaW5kZXI7Ci0JCX0KLQkJaWYgKCEodHItPmZsYWdzICYgVEZfT05FX1dBWSkgJiYgdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjaykgewotCQkJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdG1wOwotCQkJdG1wID0gdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjazsKLQkJCWlmICh0bXAtPnRvX3RocmVhZCAhPSB0aHJlYWQpIHsKLQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBnb3QgbmV3ICIKLQkJCQkJInRyYW5zYWN0aW9uIHdpdGggYmFkIHRyYW5zYWN0aW9uIHN0YWNrIgotCQkJCQkiLCB0cmFuc2FjdGlvbiAlZCBoYXMgdGFyZ2V0ICVkOiVkXG4iLAotCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCB0bXAtPmRlYnVnX2lkLAotCQkJCQl0bXAtPnRvX3Byb2MgPyB0bXAtPnRvX3Byb2MtPnBpZCA6IDAsCi0JCQkJCXRtcC0+dG9fdGhyZWFkID8KLQkJCQkJdG1wLT50b190aHJlYWQtPnBpZCA6IDApOwotCQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKLQkJCQlnb3RvIGVycl9iYWRfY2FsbF9zdGFjazsKLQkJCX0KLQkJCXdoaWxlICh0bXApIHsKLQkJCQlpZiAodG1wLT5mcm9tICYmIHRtcC0+ZnJvbS0+cHJvYyA9PSB0YXJnZXRfcHJvYykKLQkJCQkJdGFyZ2V0X3RocmVhZCA9IHRtcC0+ZnJvbTsKLQkJCQl0bXAgPSB0bXAtPmZyb21fcGFyZW50OwotCQkJfQotCQl9Ci0JfQotCWlmICh0YXJnZXRfdGhyZWFkKSB7Ci0JCWUtPnRvX3RocmVhZCA9IHRhcmdldF90aHJlYWQtPnBpZDsKLQkJdGFyZ2V0X2xpc3QgPSAmdGFyZ2V0X3RocmVhZC0+dG9kbzsKLQkJdGFyZ2V0X3dhaXQgPSAmdGFyZ2V0X3RocmVhZC0+d2FpdDsKLQl9IGVsc2UgewotCQl0YXJnZXRfbGlzdCA9ICZ0YXJnZXRfcHJvYy0+dG9kbzsKLQkJdGFyZ2V0X3dhaXQgPSAmdGFyZ2V0X3Byb2MtPndhaXQ7Ci0JfQotCWUtPnRvX3Byb2MgPSB0YXJnZXRfcHJvYy0+cGlkOwotCi0JLyogVE9ETzogcmV1c2UgaW5jb21pbmcgdHJhbnNhY3Rpb24gZm9yIHJlcGx5ICovCi0JdCA9IGt6YWxsb2Moc2l6ZW9mKCp0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHQgPT0gTlVMTCkgewotCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7Ci0JCWdvdG8gZXJyX2FsbG9jX3RfZmFpbGVkOwotCX0KLQliaW5kZXJfc3RhdHNfY3JlYXRlZChCSU5ERVJfU1RBVF9UUkFOU0FDVElPTik7Ci0KLQl0Y29tcGxldGUgPSBremFsbG9jKHNpemVvZigqdGNvbXBsZXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHRjb21wbGV0ZSA9PSBOVUxMKSB7Ci0JCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKLQkJZ290byBlcnJfYWxsb2NfdGNvbXBsZXRlX2ZhaWxlZDsKLQl9Ci0JYmluZGVyX3N0YXRzX2NyZWF0ZWQoQklOREVSX1NUQVRfVFJBTlNBQ1RJT05fQ09NUExFVEUpOwotCi0JdC0+ZGVidWdfaWQgPSArK2JpbmRlcl9sYXN0X2lkOwotCWUtPmRlYnVnX2lkID0gdC0+ZGVidWdfaWQ7Ci0KLQlpZiAocmVwbHkpCi0JCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04sCi0JCQkgICAgICJiaW5kZXI6ICVkOiVkIEJDX1JFUExZICVkIC0+ICVkOiVkLCAiCi0JCQkgICAgICJkYXRhICVwLSVwIHNpemUgJXpkLSV6ZFxuIiwKLQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgdC0+ZGVidWdfaWQsCi0JCQkgICAgIHRhcmdldF9wcm9jLT5waWQsIHRhcmdldF90aHJlYWQtPnBpZCwKLQkJCSAgICAgdHItPmRhdGEucHRyLmJ1ZmZlciwgdHItPmRhdGEucHRyLm9mZnNldHMsCi0JCQkgICAgIHRyLT5kYXRhX3NpemUsIHRyLT5vZmZzZXRzX3NpemUpOwotCWVsc2UKLQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTiwKLQkJCSAgICAgImJpbmRlcjogJWQ6JWQgQkNfVFJBTlNBQ1RJT04gJWQgLT4gIgotCQkJICAgICAiJWQgLSBub2RlICVkLCBkYXRhICVwLSVwIHNpemUgJXpkLSV6ZFxuIiwKLQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgdC0+ZGVidWdfaWQsCi0JCQkgICAgIHRhcmdldF9wcm9jLT5waWQsIHRhcmdldF9ub2RlLT5kZWJ1Z19pZCwKLQkJCSAgICAgdHItPmRhdGEucHRyLmJ1ZmZlciwgdHItPmRhdGEucHRyLm9mZnNldHMsCi0JCQkgICAgIHRyLT5kYXRhX3NpemUsIHRyLT5vZmZzZXRzX3NpemUpOwotCi0JaWYgKCFyZXBseSAmJiAhKHRyLT5mbGFncyAmIFRGX09ORV9XQVkpKQotCQl0LT5mcm9tID0gdGhyZWFkOwotCWVsc2UKLQkJdC0+ZnJvbSA9IE5VTEw7Ci0JdC0+c2VuZGVyX2V1aWQgPSBwcm9jLT50c2stPmNyZWQtPmV1aWQ7Ci0JdC0+dG9fcHJvYyA9IHRhcmdldF9wcm9jOwotCXQtPnRvX3RocmVhZCA9IHRhcmdldF90aHJlYWQ7Ci0JdC0+Y29kZSA9IHRyLT5jb2RlOwotCXQtPmZsYWdzID0gdHItPmZsYWdzOwotCXQtPnByaW9yaXR5ID0gdGFza19uaWNlKGN1cnJlbnQpOwotCXQtPmJ1ZmZlciA9IGJpbmRlcl9hbGxvY19idWYodGFyZ2V0X3Byb2MsIHRyLT5kYXRhX3NpemUsCi0JCXRyLT5vZmZzZXRzX3NpemUsICFyZXBseSAmJiAodC0+ZmxhZ3MgJiBURl9PTkVfV0FZKSk7Ci0JaWYgKHQtPmJ1ZmZlciA9PSBOVUxMKSB7Ci0JCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKLQkJZ290byBlcnJfYmluZGVyX2FsbG9jX2J1Zl9mYWlsZWQ7Ci0JfQotCXQtPmJ1ZmZlci0+YWxsb3dfdXNlcl9mcmVlID0gMDsKLQl0LT5idWZmZXItPmRlYnVnX2lkID0gdC0+ZGVidWdfaWQ7Ci0JdC0+YnVmZmVyLT50cmFuc2FjdGlvbiA9IHQ7Ci0JdC0+YnVmZmVyLT50YXJnZXRfbm9kZSA9IHRhcmdldF9ub2RlOwotCWlmICh0YXJnZXRfbm9kZSkKLQkJYmluZGVyX2luY19ub2RlKHRhcmdldF9ub2RlLCAxLCAwLCBOVUxMKTsKLQotCW9mZnAgPSAoc2l6ZV90ICopKHQtPmJ1ZmZlci0+ZGF0YSArIEFMSUdOKHRyLT5kYXRhX3NpemUsIHNpemVvZih2b2lkICopKSk7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIodC0+YnVmZmVyLT5kYXRhLCB0ci0+ZGF0YS5wdHIuYnVmZmVyLCB0ci0+ZGF0YV9zaXplKSkgewotCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBnb3QgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkICIKLQkJCSJkYXRhIHB0clxuIiwgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7Ci0JCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKLQkJZ290byBlcnJfY29weV9kYXRhX2ZhaWxlZDsKLQl9Ci0JaWYgKGNvcHlfZnJvbV91c2VyKG9mZnAsIHRyLT5kYXRhLnB0ci5vZmZzZXRzLCB0ci0+b2Zmc2V0c19zaXplKSkgewotCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBnb3QgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkICIKLQkJCSJvZmZzZXRzIHB0clxuIiwgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7Ci0JCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKLQkJZ290byBlcnJfY29weV9kYXRhX2ZhaWxlZDsKLQl9Ci0JaWYgKCFJU19BTElHTkVEKHRyLT5vZmZzZXRzX3NpemUsIHNpemVvZihzaXplX3QpKSkgewotCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBnb3QgdHJhbnNhY3Rpb24gd2l0aCAiCi0JCQkiaW52YWxpZCBvZmZzZXRzIHNpemUsICV6ZFxuIiwKLQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIHRyLT5vZmZzZXRzX3NpemUpOwotCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7Ci0JCWdvdG8gZXJyX2JhZF9vZmZzZXQ7Ci0JfQotCW9mZl9lbmQgPSAodm9pZCAqKW9mZnAgKyB0ci0+b2Zmc2V0c19zaXplOwotCWZvciAoOyBvZmZwIDwgb2ZmX2VuZDsgb2ZmcCsrKSB7Ci0JCXN0cnVjdCBmbGF0X2JpbmRlcl9vYmplY3QgKmZwOwotCQlpZiAoKm9mZnAgPiB0LT5idWZmZXItPmRhdGFfc2l6ZSAtIHNpemVvZigqZnApIHx8Ci0JCSAgICB0LT5idWZmZXItPmRhdGFfc2l6ZSA8IHNpemVvZigqZnApIHx8Ci0JCSAgICAhSVNfQUxJR05FRCgqb2ZmcCwgc2l6ZW9mKHZvaWQgKikpKSB7Ci0JCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBnb3QgdHJhbnNhY3Rpb24gd2l0aCAiCi0JCQkJImludmFsaWQgb2Zmc2V0LCAlemRcbiIsCi0JCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgKm9mZnApOwotCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOwotCQkJZ290byBlcnJfYmFkX29mZnNldDsKLQkJfQotCQlmcCA9IChzdHJ1Y3QgZmxhdF9iaW5kZXJfb2JqZWN0ICopKHQtPmJ1ZmZlci0+ZGF0YSArICpvZmZwKTsKLQkJc3dpdGNoIChmcC0+dHlwZSkgewotCQljYXNlIEJJTkRFUl9UWVBFX0JJTkRFUjoKLQkJY2FzZSBCSU5ERVJfVFlQRV9XRUFLX0JJTkRFUjogewotCQkJc3RydWN0IGJpbmRlcl9yZWYgKnJlZjsKLQkJCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZSA9IGJpbmRlcl9nZXRfbm9kZShwcm9jLCBmcC0+YmluZGVyKTsKLQkJCWlmIChub2RlID09IE5VTEwpIHsKLQkJCQlub2RlID0gYmluZGVyX25ld19ub2RlKHByb2MsIGZwLT5iaW5kZXIsIGZwLT5jb29raWUpOwotCQkJCWlmIChub2RlID09IE5VTEwpIHsKLQkJCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOwotCQkJCQlnb3RvIGVycl9iaW5kZXJfbmV3X25vZGVfZmFpbGVkOwotCQkJCX0KLQkJCQlub2RlLT5taW5fcHJpb3JpdHkgPSBmcC0+ZmxhZ3MgJiBGTEFUX0JJTkRFUl9GTEFHX1BSSU9SSVRZX01BU0s7Ci0JCQkJbm9kZS0+YWNjZXB0X2ZkcyA9ICEhKGZwLT5mbGFncyAmIEZMQVRfQklOREVSX0ZMQUdfQUNDRVBUU19GRFMpOwotCQkJfQotCQkJaWYgKGZwLT5jb29raWUgIT0gbm9kZS0+Y29va2llKSB7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgc2VuZGluZyB1JXAgIgotCQkJCQkibm9kZSAlZCwgY29va2llIG1pc21hdGNoICVwICE9ICVwXG4iLAotCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLAotCQkJCQlmcC0+YmluZGVyLCBub2RlLT5kZWJ1Z19pZCwKLQkJCQkJZnAtPmNvb2tpZSwgbm9kZS0+Y29va2llKTsKLQkJCQlnb3RvIGVycl9iaW5kZXJfZ2V0X3JlZl9mb3Jfbm9kZV9mYWlsZWQ7Ci0JCQl9Ci0JCQlyZWYgPSBiaW5kZXJfZ2V0X3JlZl9mb3Jfbm9kZSh0YXJnZXRfcHJvYywgbm9kZSk7Ci0JCQlpZiAocmVmID09IE5VTEwpIHsKLQkJCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7Ci0JCQkJZ290byBlcnJfYmluZGVyX2dldF9yZWZfZm9yX25vZGVfZmFpbGVkOwotCQkJfQotCQkJaWYgKGZwLT50eXBlID09IEJJTkRFUl9UWVBFX0JJTkRFUikKLQkJCQlmcC0+dHlwZSA9IEJJTkRFUl9UWVBFX0hBTkRMRTsKLQkJCWVsc2UKLQkJCQlmcC0+dHlwZSA9IEJJTkRFUl9UWVBFX1dFQUtfSEFORExFOwotCQkJZnAtPmhhbmRsZSA9IHJlZi0+ZGVzYzsKLQkJCWJpbmRlcl9pbmNfcmVmKHJlZiwgZnAtPnR5cGUgPT0gQklOREVSX1RZUEVfSEFORExFLAotCQkJCSAgICAgICAmdGhyZWFkLT50b2RvKTsKLQotCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTiwKLQkJCQkgICAgICIgICAgICAgIG5vZGUgJWQgdSVwIC0+IHJlZiAlZCBkZXNjICVkXG4iLAotCQkJCSAgICAgbm9kZS0+ZGVidWdfaWQsIG5vZGUtPnB0ciwgcmVmLT5kZWJ1Z19pZCwKLQkJCQkgICAgIHJlZi0+ZGVzYyk7Ci0JCX0gYnJlYWs7Ci0JCWNhc2UgQklOREVSX1RZUEVfSEFORExFOgotCQljYXNlIEJJTkRFUl9UWVBFX1dFQUtfSEFORExFOiB7Ci0JCQlzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmID0gYmluZGVyX2dldF9yZWYocHJvYywgZnAtPmhhbmRsZSk7Ci0JCQlpZiAocmVmID09IE5VTEwpIHsKLQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBnb3QgIgotCQkJCQkidHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkICIKLQkJCQkJImhhbmRsZSwgJWxkXG4iLCBwcm9jLT5waWQsCi0JCQkJCXRocmVhZC0+cGlkLCBmcC0+aGFuZGxlKTsKLQkJCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7Ci0JCQkJZ290byBlcnJfYmluZGVyX2dldF9yZWZfZmFpbGVkOwotCQkJfQotCQkJaWYgKHJlZi0+bm9kZS0+cHJvYyA9PSB0YXJnZXRfcHJvYykgewotCQkJCWlmIChmcC0+dHlwZSA9PSBCSU5ERVJfVFlQRV9IQU5ETEUpCi0JCQkJCWZwLT50eXBlID0gQklOREVSX1RZUEVfQklOREVSOwotCQkJCWVsc2UKLQkJCQkJZnAtPnR5cGUgPSBCSU5ERVJfVFlQRV9XRUFLX0JJTkRFUjsKLQkJCQlmcC0+YmluZGVyID0gcmVmLT5ub2RlLT5wdHI7Ci0JCQkJZnAtPmNvb2tpZSA9IHJlZi0+bm9kZS0+Y29va2llOwotCQkJCWJpbmRlcl9pbmNfbm9kZShyZWYtPm5vZGUsIGZwLT50eXBlID09IEJJTkRFUl9UWVBFX0JJTkRFUiwgMCwgTlVMTCk7Ci0JCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTiwKLQkJCQkJICAgICAiICAgICAgICByZWYgJWQgZGVzYyAlZCAtPiBub2RlICVkIHUlcFxuIiwKLQkJCQkJICAgICByZWYtPmRlYnVnX2lkLCByZWYtPmRlc2MsIHJlZi0+bm9kZS0+ZGVidWdfaWQsCi0JCQkJCSAgICAgcmVmLT5ub2RlLT5wdHIpOwotCQkJfSBlbHNlIHsKLQkJCQlzdHJ1Y3QgYmluZGVyX3JlZiAqbmV3X3JlZjsKLQkJCQluZXdfcmVmID0gYmluZGVyX2dldF9yZWZfZm9yX25vZGUodGFyZ2V0X3Byb2MsIHJlZi0+bm9kZSk7Ci0JCQkJaWYgKG5ld19yZWYgPT0gTlVMTCkgewotCQkJCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7Ci0JCQkJCWdvdG8gZXJyX2JpbmRlcl9nZXRfcmVmX2Zvcl9ub2RlX2ZhaWxlZDsKLQkJCQl9Ci0JCQkJZnAtPmhhbmRsZSA9IG5ld19yZWYtPmRlc2M7Ci0JCQkJYmluZGVyX2luY19yZWYobmV3X3JlZiwgZnAtPnR5cGUgPT0gQklOREVSX1RZUEVfSEFORExFLCBOVUxMKTsKLQkJCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OLAotCQkJCQkgICAgICIgICAgICAgIHJlZiAlZCBkZXNjICVkIC0+IHJlZiAlZCBkZXNjICVkIChub2RlICVkKVxuIiwKLQkJCQkJICAgICByZWYtPmRlYnVnX2lkLCByZWYtPmRlc2MsIG5ld19yZWYtPmRlYnVnX2lkLAotCQkJCQkgICAgIG5ld19yZWYtPmRlc2MsIHJlZi0+bm9kZS0+ZGVidWdfaWQpOwotCQkJfQotCQl9IGJyZWFrOwotCi0JCWNhc2UgQklOREVSX1RZUEVfRkQ6IHsKLQkJCWludCB0YXJnZXRfZmQ7Ci0JCQlzdHJ1Y3QgZmlsZSAqZmlsZTsKLQotCQkJaWYgKHJlcGx5KSB7Ci0JCQkJaWYgKCEoaW5fcmVwbHlfdG8tPmZsYWdzICYgVEZfQUNDRVBUX0ZEUykpIHsKLQkJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290IHJlcGx5IHdpdGggZmQsICVsZCwgYnV0IHRhcmdldCBkb2VzIG5vdCBhbGxvdyBmZHNcbiIsCi0JCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBmcC0+aGFuZGxlKTsKLQkJCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOwotCQkJCQlnb3RvIGVycl9mZF9ub3RfYWxsb3dlZDsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKCF0YXJnZXRfbm9kZS0+YWNjZXB0X2ZkcykgewotCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCB0cmFuc2FjdGlvbiB3aXRoIGZkLCAlbGQsIGJ1dCB0YXJnZXQgZG9lcyBub3QgYWxsb3cgZmRzXG4iLAotCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBmcC0+aGFuZGxlKTsKLQkJCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7Ci0JCQkJZ290byBlcnJfZmRfbm90X2FsbG93ZWQ7Ci0JCQl9Ci0KLQkJCWZpbGUgPSBmZ2V0KGZwLT5oYW5kbGUpOwotCQkJaWYgKGZpbGUgPT0gTlVMTCkgewotCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgZmQsICVsZFxuIiwKLQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgZnAtPmhhbmRsZSk7Ci0JCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOwotCQkJCWdvdG8gZXJyX2ZnZXRfZmFpbGVkOwotCQkJfQotCQkJdGFyZ2V0X2ZkID0gdGFza19nZXRfdW51c2VkX2ZkX2ZsYWdzKHRhcmdldF9wcm9jLCBPX0NMT0VYRUMpOwotCQkJaWYgKHRhcmdldF9mZCA8IDApIHsKLQkJCQlmcHV0KGZpbGUpOwotCQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKLQkJCQlnb3RvIGVycl9nZXRfdW51c2VkX2ZkX2ZhaWxlZDsKLQkJCX0KLQkJCXRhc2tfZmRfaW5zdGFsbCh0YXJnZXRfcHJvYywgdGFyZ2V0X2ZkLCBmaWxlKTsKLQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04sCi0JCQkJICAgICAiICAgICAgICBmZCAlbGQgLT4gJWRcbiIsIGZwLT5oYW5kbGUsIHRhcmdldF9mZCk7Ci0JCQkvKiBUT0RPOiBmcHV0PyAqLwotCQkJZnAtPmhhbmRsZSA9IHRhcmdldF9mZDsKLQkJfSBicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290IHRyYW5zYWN0aW8iCi0JCQkJIm4gd2l0aCBpbnZhbGlkIG9iamVjdCB0eXBlLCAlbHhcbiIsCi0JCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgZnAtPnR5cGUpOwotCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOwotCQkJZ290byBlcnJfYmFkX29iamVjdF90eXBlOwotCQl9Ci0JfQotCWlmIChyZXBseSkgewotCQlCVUdfT04odC0+YnVmZmVyLT5hc3luY190cmFuc2FjdGlvbiAhPSAwKTsKLQkJYmluZGVyX3BvcF90cmFuc2FjdGlvbih0YXJnZXRfdGhyZWFkLCBpbl9yZXBseV90byk7Ci0JfSBlbHNlIGlmICghKHQtPmZsYWdzICYgVEZfT05FX1dBWSkpIHsKLQkJQlVHX09OKHQtPmJ1ZmZlci0+YXN5bmNfdHJhbnNhY3Rpb24gIT0gMCk7Ci0JCXQtPm5lZWRfcmVwbHkgPSAxOwotCQl0LT5mcm9tX3BhcmVudCA9IHRocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2s7Ci0JCXRocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2sgPSB0OwotCX0gZWxzZSB7Ci0JCUJVR19PTih0YXJnZXRfbm9kZSA9PSBOVUxMKTsKLQkJQlVHX09OKHQtPmJ1ZmZlci0+YXN5bmNfdHJhbnNhY3Rpb24gIT0gMSk7Ci0JCWlmICh0YXJnZXRfbm9kZS0+aGFzX2FzeW5jX3RyYW5zYWN0aW9uKSB7Ci0JCQl0YXJnZXRfbGlzdCA9ICZ0YXJnZXRfbm9kZS0+YXN5bmNfdG9kbzsKLQkJCXRhcmdldF93YWl0ID0gTlVMTDsKLQkJfSBlbHNlCi0JCQl0YXJnZXRfbm9kZS0+aGFzX2FzeW5jX3RyYW5zYWN0aW9uID0gMTsKLQl9Ci0JdC0+d29yay50eXBlID0gQklOREVSX1dPUktfVFJBTlNBQ1RJT047Ci0JbGlzdF9hZGRfdGFpbCgmdC0+d29yay5lbnRyeSwgdGFyZ2V0X2xpc3QpOwotCXRjb21wbGV0ZS0+dHlwZSA9IEJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OX0NPTVBMRVRFOwotCWxpc3RfYWRkX3RhaWwoJnRjb21wbGV0ZS0+ZW50cnksICZ0aHJlYWQtPnRvZG8pOwotCWlmICh0YXJnZXRfd2FpdCkKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKHRhcmdldF93YWl0KTsKLQlyZXR1cm47Ci0KLWVycl9nZXRfdW51c2VkX2ZkX2ZhaWxlZDoKLWVycl9mZ2V0X2ZhaWxlZDoKLWVycl9mZF9ub3RfYWxsb3dlZDoKLWVycl9iaW5kZXJfZ2V0X3JlZl9mb3Jfbm9kZV9mYWlsZWQ6Ci1lcnJfYmluZGVyX2dldF9yZWZfZmFpbGVkOgotZXJyX2JpbmRlcl9uZXdfbm9kZV9mYWlsZWQ6Ci1lcnJfYmFkX29iamVjdF90eXBlOgotZXJyX2JhZF9vZmZzZXQ6Ci1lcnJfY29weV9kYXRhX2ZhaWxlZDoKLQliaW5kZXJfdHJhbnNhY3Rpb25fYnVmZmVyX3JlbGVhc2UodGFyZ2V0X3Byb2MsIHQtPmJ1ZmZlciwgb2ZmcCk7Ci0JdC0+YnVmZmVyLT50cmFuc2FjdGlvbiA9IE5VTEw7Ci0JYmluZGVyX2ZyZWVfYnVmKHRhcmdldF9wcm9jLCB0LT5idWZmZXIpOwotZXJyX2JpbmRlcl9hbGxvY19idWZfZmFpbGVkOgotCWtmcmVlKHRjb21wbGV0ZSk7Ci0JYmluZGVyX3N0YXRzX2RlbGV0ZWQoQklOREVSX1NUQVRfVFJBTlNBQ1RJT05fQ09NUExFVEUpOwotZXJyX2FsbG9jX3Rjb21wbGV0ZV9mYWlsZWQ6Ci0Ja2ZyZWUodCk7Ci0JYmluZGVyX3N0YXRzX2RlbGV0ZWQoQklOREVSX1NUQVRfVFJBTlNBQ1RJT04pOwotZXJyX2FsbG9jX3RfZmFpbGVkOgotZXJyX2JhZF9jYWxsX3N0YWNrOgotZXJyX2VtcHR5X2NhbGxfc3RhY2s6Ci1lcnJfZGVhZF9iaW5kZXI6Ci1lcnJfaW52YWxpZF90YXJnZXRfaGFuZGxlOgotZXJyX25vX2NvbnRleHRfbWdyX25vZGU6Ci0JYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19GQUlMRURfVFJBTlNBQ1RJT04sCi0JCSAgICAgImJpbmRlcjogJWQ6JWQgdHJhbnNhY3Rpb24gZmFpbGVkICVkLCBzaXplICV6ZC0lemRcbiIsCi0JCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgcmV0dXJuX2Vycm9yLAotCQkgICAgIHRyLT5kYXRhX3NpemUsIHRyLT5vZmZzZXRzX3NpemUpOwotCi0JewotCQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19lbnRyeSAqZmU7Ci0JCWZlID0gYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19hZGQoJmJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZmFpbGVkKTsKLQkJKmZlID0gKmU7Ci0JfQotCi0JQlVHX09OKHRocmVhZC0+cmV0dXJuX2Vycm9yICE9IEJSX09LKTsKLQlpZiAoaW5fcmVwbHlfdG8pIHsKLQkJdGhyZWFkLT5yZXR1cm5fZXJyb3IgPSBCUl9UUkFOU0FDVElPTl9DT01QTEVURTsKLQkJYmluZGVyX3NlbmRfZmFpbGVkX3JlcGx5KGluX3JlcGx5X3RvLCByZXR1cm5fZXJyb3IpOwotCX0gZWxzZQotCQl0aHJlYWQtPnJldHVybl9lcnJvciA9IHJldHVybl9lcnJvcjsKLX0KLQotaW50IGJpbmRlcl90aHJlYWRfd3JpdGUoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCBzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkLAotCQkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgaW50IHNpemUsIHNpZ25lZCBsb25nICpjb25zdW1lZCkKLXsKLQl1aW50MzJfdCBjbWQ7Ci0Jdm9pZCBfX3VzZXIgKnB0ciA9IGJ1ZmZlciArICpjb25zdW1lZDsKLQl2b2lkIF9fdXNlciAqZW5kID0gYnVmZmVyICsgc2l6ZTsKLQotCXdoaWxlIChwdHIgPCBlbmQgJiYgdGhyZWFkLT5yZXR1cm5fZXJyb3IgPT0gQlJfT0spIHsKLQkJaWYgKGdldF91c2VyKGNtZCwgKHVpbnQzMl90IF9fdXNlciAqKXB0cikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7Ci0JCWlmIChfSU9DX05SKGNtZCkgPCBBUlJBWV9TSVpFKGJpbmRlcl9zdGF0cy5iYykpIHsKLQkJCWJpbmRlcl9zdGF0cy5iY1tfSU9DX05SKGNtZCldKys7Ci0JCQlwcm9jLT5zdGF0cy5iY1tfSU9DX05SKGNtZCldKys7Ci0JCQl0aHJlYWQtPnN0YXRzLmJjW19JT0NfTlIoY21kKV0rKzsKLQkJfQotCQlzd2l0Y2ggKGNtZCkgewotCQljYXNlIEJDX0lOQ1JFRlM6Ci0JCWNhc2UgQkNfQUNRVUlSRToKLQkJY2FzZSBCQ19SRUxFQVNFOgotCQljYXNlIEJDX0RFQ1JFRlM6IHsKLQkJCXVpbnQzMl90IHRhcmdldDsKLQkJCXN0cnVjdCBiaW5kZXJfcmVmICpyZWY7Ci0JCQljb25zdCBjaGFyICpkZWJ1Z19zdHJpbmc7Ci0KLQkJCWlmIChnZXRfdXNlcih0YXJnZXQsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7Ci0JCQlpZiAodGFyZ2V0ID09IDAgJiYgYmluZGVyX2NvbnRleHRfbWdyX25vZGUgJiYKLQkJCSAgICAoY21kID09IEJDX0lOQ1JFRlMgfHwgY21kID09IEJDX0FDUVVJUkUpKSB7Ci0JCQkJcmVmID0gYmluZGVyX2dldF9yZWZfZm9yX25vZGUocHJvYywKLQkJCQkJICAgICAgIGJpbmRlcl9jb250ZXh0X21ncl9ub2RlKTsKLQkJCQlpZiAocmVmLT5kZXNjICE9IHRhcmdldCkgewotCQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDoiCi0JCQkJCQkiJWQgdHJpZWQgdG8gYWNxdWlyZSAiCi0JCQkJCQkicmVmZXJlbmNlIHRvIGRlc2MgMCwgIgotCQkJCQkJImdvdCAlZCBpbnN0ZWFkXG4iLAotCQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKLQkJCQkJCXJlZi0+ZGVzYyk7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJcmVmID0gYmluZGVyX2dldF9yZWYocHJvYywgdGFyZ2V0KTsKLQkJCWlmIChyZWYgPT0gTlVMTCkgewotCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIHJlZmNvdSIKLQkJCQkJIm50IGNoYW5nZSBvbiBpbnZhbGlkIHJlZiAlZFxuIiwKLQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgdGFyZ2V0KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXN3aXRjaCAoY21kKSB7Ci0JCQljYXNlIEJDX0lOQ1JFRlM6Ci0JCQkJZGVidWdfc3RyaW5nID0gIkluY1JlZnMiOwotCQkJCWJpbmRlcl9pbmNfcmVmKHJlZiwgMCwgTlVMTCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJDX0FDUVVJUkU6Ci0JCQkJZGVidWdfc3RyaW5nID0gIkFjcXVpcmUiOwotCQkJCWJpbmRlcl9pbmNfcmVmKHJlZiwgMSwgTlVMTCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJDX1JFTEVBU0U6Ci0JCQkJZGVidWdfc3RyaW5nID0gIlJlbGVhc2UiOwotCQkJCWJpbmRlcl9kZWNfcmVmKHJlZiwgMSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJDX0RFQ1JFRlM6Ci0JCQlkZWZhdWx0OgotCQkJCWRlYnVnX3N0cmluZyA9ICJEZWNSZWZzIjsKLQkJCQliaW5kZXJfZGVjX3JlZihyZWYsIDApOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19VU0VSX1JFRlMsCi0JCQkJICAgICAiYmluZGVyOiAlZDolZCAlcyByZWYgJWQgZGVzYyAlZCBzICVkIHcgJWQgZm9yIG5vZGUgJWRcbiIsCi0JCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBkZWJ1Z19zdHJpbmcsIHJlZi0+ZGVidWdfaWQsCi0JCQkJICAgICByZWYtPmRlc2MsIHJlZi0+c3Ryb25nLCByZWYtPndlYWssIHJlZi0+bm9kZS0+ZGVidWdfaWQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBCQ19JTkNSRUZTX0RPTkU6Ci0JCWNhc2UgQkNfQUNRVUlSRV9ET05FOiB7Ci0JCQl2b2lkIF9fdXNlciAqbm9kZV9wdHI7Ci0JCQl2b2lkICpjb29raWU7Ci0JCQlzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGU7Ci0KLQkJCWlmIChnZXRfdXNlcihub2RlX3B0ciwgKHZvaWQgKiBfX3VzZXIgKilwdHIpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcHRyICs9IHNpemVvZih2b2lkICopOwotCQkJaWYgKGdldF91c2VyKGNvb2tpZSwgKHZvaWQgKiBfX3VzZXIgKilwdHIpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcHRyICs9IHNpemVvZih2b2lkICopOwotCQkJbm9kZSA9IGJpbmRlcl9nZXRfbm9kZShwcm9jLCBub2RlX3B0cik7Ci0JCQlpZiAobm9kZSA9PSBOVUxMKSB7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgIgotCQkJCQkiJXMgdSVwIG5vIG1hdGNoXG4iLAotCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLAotCQkJCQljbWQgPT0gQkNfSU5DUkVGU19ET05FID8KLQkJCQkJIkJDX0lOQ1JFRlNfRE9ORSIgOgotCQkJCQkiQkNfQUNRVUlSRV9ET05FIiwKLQkJCQkJbm9kZV9wdHIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGNvb2tpZSAhPSBub2RlLT5jb29raWUpIHsKLQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCAlcyB1JXAgbm9kZSAlZCIKLQkJCQkJIiBjb29raWUgbWlzbWF0Y2ggJXAgIT0gJXBcbiIsCi0JCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCi0JCQkJCWNtZCA9PSBCQ19JTkNSRUZTX0RPTkUgPwotCQkJCQkiQkNfSU5DUkVGU19ET05FIiA6ICJCQ19BQ1FVSVJFX0RPTkUiLAotCQkJCQlub2RlX3B0ciwgbm9kZS0+ZGVidWdfaWQsCi0JCQkJCWNvb2tpZSwgbm9kZS0+Y29va2llKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjbWQgPT0gQkNfQUNRVUlSRV9ET05FKSB7Ci0JCQkJaWYgKG5vZGUtPnBlbmRpbmdfc3Ryb25nX3JlZiA9PSAwKSB7Ci0JCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkICIKLQkJCQkJCSJCQ19BQ1FVSVJFX0RPTkUgbm9kZSAlZCBoYXMgIgotCQkJCQkJIm5vIHBlbmRpbmcgYWNxdWlyZSByZXF1ZXN0XG4iLAotCQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKLQkJCQkJCW5vZGUtPmRlYnVnX2lkKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCW5vZGUtPnBlbmRpbmdfc3Ryb25nX3JlZiA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChub2RlLT5wZW5kaW5nX3dlYWtfcmVmID09IDApIHsKLQkJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgIgotCQkJCQkJIkJDX0lOQ1JFRlNfRE9ORSBub2RlICVkIGhhcyAiCi0JCQkJCQkibm8gcGVuZGluZyBpbmNyZWZzIHJlcXVlc3RcbiIsCi0JCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLAotCQkJCQkJbm9kZS0+ZGVidWdfaWQpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJbm9kZS0+cGVuZGluZ193ZWFrX3JlZiA9IDA7Ci0JCQl9Ci0JCQliaW5kZXJfZGVjX25vZGUobm9kZSwgY21kID09IEJDX0FDUVVJUkVfRE9ORSwgMCk7Ci0JCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1VTRVJfUkVGUywKLQkJCQkgICAgICJiaW5kZXI6ICVkOiVkICVzIG5vZGUgJWQgbHMgJWQgbHcgJWRcbiIsCi0JCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLAotCQkJCSAgICAgY21kID09IEJDX0lOQ1JFRlNfRE9ORSA/ICJCQ19JTkNSRUZTX0RPTkUiIDogIkJDX0FDUVVJUkVfRE9ORSIsCi0JCQkJICAgICBub2RlLT5kZWJ1Z19pZCwgbm9kZS0+bG9jYWxfc3Ryb25nX3JlZnMsIG5vZGUtPmxvY2FsX3dlYWtfcmVmcyk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIEJDX0FUVEVNUFRfQUNRVUlSRToKLQkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiBCQ19BVFRFTVBUX0FDUVVJUkUgbm90IHN1cHBvcnRlZFxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJY2FzZSBCQ19BQ1FVSVJFX1JFU1VMVDoKLQkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiBCQ19BQ1FVSVJFX1JFU1VMVCBub3Qgc3VwcG9ydGVkXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWNhc2UgQkNfRlJFRV9CVUZGRVI6IHsKLQkJCXZvaWQgX191c2VyICpkYXRhX3B0cjsKLQkJCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXI7Ci0KLQkJCWlmIChnZXRfdXNlcihkYXRhX3B0ciwgKHZvaWQgKiBfX3VzZXIgKilwdHIpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcHRyICs9IHNpemVvZih2b2lkICopOwotCi0JCQlidWZmZXIgPSBiaW5kZXJfYnVmZmVyX2xvb2t1cChwcm9jLCBkYXRhX3B0cik7Ci0JCQlpZiAoYnVmZmVyID09IE5VTEwpIHsKLQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCAiCi0JCQkJCSJCQ19GUkVFX0JVRkZFUiB1JXAgbm8gbWF0Y2hcbiIsCi0JCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGRhdGFfcHRyKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICghYnVmZmVyLT5hbGxvd191c2VyX2ZyZWUpIHsKLQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCAiCi0JCQkJCSJCQ19GUkVFX0JVRkZFUiB1JXAgbWF0Y2hlZCAiCi0JCQkJCSJ1bnJldHVybmVkIGJ1ZmZlclxuIiwKLQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgZGF0YV9wdHIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19GUkVFX0JVRkZFUiwKLQkJCQkgICAgICJiaW5kZXI6ICVkOiVkIEJDX0ZSRUVfQlVGRkVSIHUlcCBmb3VuZCBidWZmZXIgJWQgZm9yICVzIHRyYW5zYWN0aW9uXG4iLAotCQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgZGF0YV9wdHIsIGJ1ZmZlci0+ZGVidWdfaWQsCi0JCQkJICAgICBidWZmZXItPnRyYW5zYWN0aW9uID8gImFjdGl2ZSIgOiAiZmluaXNoZWQiKTsKLQotCQkJaWYgKGJ1ZmZlci0+dHJhbnNhY3Rpb24pIHsKLQkJCQlidWZmZXItPnRyYW5zYWN0aW9uLT5idWZmZXIgPSBOVUxMOwotCQkJCWJ1ZmZlci0+dHJhbnNhY3Rpb24gPSBOVUxMOwotCQkJfQotCQkJaWYgKGJ1ZmZlci0+YXN5bmNfdHJhbnNhY3Rpb24gJiYgYnVmZmVyLT50YXJnZXRfbm9kZSkgewotCQkJCUJVR19PTighYnVmZmVyLT50YXJnZXRfbm9kZS0+aGFzX2FzeW5jX3RyYW5zYWN0aW9uKTsKLQkJCQlpZiAobGlzdF9lbXB0eSgmYnVmZmVyLT50YXJnZXRfbm9kZS0+YXN5bmNfdG9kbykpCi0JCQkJCWJ1ZmZlci0+dGFyZ2V0X25vZGUtPmhhc19hc3luY190cmFuc2FjdGlvbiA9IDA7Ci0JCQkJZWxzZQotCQkJCQlsaXN0X21vdmVfdGFpbChidWZmZXItPnRhcmdldF9ub2RlLT5hc3luY190b2RvLm5leHQsICZ0aHJlYWQtPnRvZG8pOwotCQkJfQotCQkJYmluZGVyX3RyYW5zYWN0aW9uX2J1ZmZlcl9yZWxlYXNlKHByb2MsIGJ1ZmZlciwgTlVMTCk7Ci0JCQliaW5kZXJfZnJlZV9idWYocHJvYywgYnVmZmVyKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJY2FzZSBCQ19UUkFOU0FDVElPTjoKLQkJY2FzZSBCQ19SRVBMWTogewotCQkJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhIHRyOwotCi0JCQlpZiAoY29weV9mcm9tX3VzZXIoJnRyLCBwdHIsIHNpemVvZih0cikpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcHRyICs9IHNpemVvZih0cik7Ci0JCQliaW5kZXJfdHJhbnNhY3Rpb24ocHJvYywgdGhyZWFkLCAmdHIsIGNtZCA9PSBCQ19SRVBMWSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWNhc2UgQkNfUkVHSVNURVJfTE9PUEVSOgotCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19USFJFQURTLAotCQkJCSAgICAgImJpbmRlcjogJWQ6JWQgQkNfUkVHSVNURVJfTE9PUEVSXG4iLAotCQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7Ci0JCQlpZiAodGhyZWFkLT5sb29wZXIgJiBCSU5ERVJfTE9PUEVSX1NUQVRFX0VOVEVSRUQpIHsKLQkJCQl0aHJlYWQtPmxvb3BlciB8PSBCSU5ERVJfTE9PUEVSX1NUQVRFX0lOVkFMSUQ7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgRVJST1I6IgotCQkJCQkiIEJDX1JFR0lTVEVSX0xPT1BFUiBjYWxsZWQgIgotCQkJCQkiYWZ0ZXIgQkNfRU5URVJfTE9PUEVSXG4iLAotCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKLQkJCX0gZWxzZSBpZiAocHJvYy0+cmVxdWVzdGVkX3RocmVhZHMgPT0gMCkgewotCQkJCXRocmVhZC0+bG9vcGVyIHw9IEJJTkRFUl9MT09QRVJfU1RBVEVfSU5WQUxJRDsKLQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBFUlJPUjoiCi0JCQkJCSIgQkNfUkVHSVNURVJfTE9PUEVSIGNhbGxlZCAiCi0JCQkJCSJ3aXRob3V0IHJlcXVlc3RcbiIsCi0JCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQpOwotCQkJfSBlbHNlIHsKLQkJCQlwcm9jLT5yZXF1ZXN0ZWRfdGhyZWFkcy0tOwotCQkJCXByb2MtPnJlcXVlc3RlZF90aHJlYWRzX3N0YXJ0ZWQrKzsKLQkJCX0KLQkJCXRocmVhZC0+bG9vcGVyIHw9IEJJTkRFUl9MT09QRVJfU1RBVEVfUkVHSVNURVJFRDsKLQkJCWJyZWFrOwotCQljYXNlIEJDX0VOVEVSX0xPT1BFUjoKLQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVEhSRUFEUywKLQkJCQkgICAgICJiaW5kZXI6ICVkOiVkIEJDX0VOVEVSX0xPT1BFUlxuIiwKLQkJCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQpOwotCQkJaWYgKHRocmVhZC0+bG9vcGVyICYgQklOREVSX0xPT1BFUl9TVEFURV9SRUdJU1RFUkVEKSB7Ci0JCQkJdGhyZWFkLT5sb29wZXIgfD0gQklOREVSX0xPT1BFUl9TVEFURV9JTlZBTElEOwotCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIEVSUk9SOiIKLQkJCQkJIiBCQ19FTlRFUl9MT09QRVIgY2FsbGVkIGFmdGVyICIKLQkJCQkJIkJDX1JFR0lTVEVSX0xPT1BFUlxuIiwKLQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7Ci0JCQl9Ci0JCQl0aHJlYWQtPmxvb3BlciB8PSBCSU5ERVJfTE9PUEVSX1NUQVRFX0VOVEVSRUQ7Ci0JCQlicmVhazsKLQkJY2FzZSBCQ19FWElUX0xPT1BFUjoKLQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVEhSRUFEUywKLQkJCQkgICAgICJiaW5kZXI6ICVkOiVkIEJDX0VYSVRfTE9PUEVSXG4iLAotCQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7Ci0JCQl0aHJlYWQtPmxvb3BlciB8PSBCSU5ERVJfTE9PUEVSX1NUQVRFX0VYSVRFRDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQkNfUkVRVUVTVF9ERUFUSF9OT1RJRklDQVRJT046Ci0JCWNhc2UgQkNfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OOiB7Ci0JCQl1aW50MzJfdCB0YXJnZXQ7Ci0JCQl2b2lkIF9fdXNlciAqY29va2llOwotCQkJc3RydWN0IGJpbmRlcl9yZWYgKnJlZjsKLQkJCXN0cnVjdCBiaW5kZXJfcmVmX2RlYXRoICpkZWF0aDsKLQotCQkJaWYgKGdldF91c2VyKHRhcmdldCwgKHVpbnQzMl90IF9fdXNlciAqKXB0cikpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlwdHIgKz0gc2l6ZW9mKHVpbnQzMl90KTsKLQkJCWlmIChnZXRfdXNlcihjb29raWUsICh2b2lkIF9fdXNlciAqIF9fdXNlciAqKXB0cikpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlwdHIgKz0gc2l6ZW9mKHZvaWQgKik7Ci0JCQlyZWYgPSBiaW5kZXJfZ2V0X3JlZihwcm9jLCB0YXJnZXQpOwotCQkJaWYgKHJlZiA9PSBOVUxMKSB7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgJXMgIgotCQkJCQkiaW52YWxpZCByZWYgJWRcbiIsCi0JCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCi0JCQkJCWNtZCA9PSBCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTiA/Ci0JCQkJCSJCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTiIgOgotCQkJCQkiQkNfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OIiwKLQkJCQkJdGFyZ2V0KTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19ERUFUSF9OT1RJRklDQVRJT04sCi0JCQkJICAgICAiYmluZGVyOiAlZDolZCAlcyAlcCByZWYgJWQgZGVzYyAlZCBzICVkIHcgJWQgZm9yIG5vZGUgJWRcbiIsCi0JCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLAotCQkJCSAgICAgY21kID09IEJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OID8KLQkJCQkgICAgICJCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTiIgOgotCQkJCSAgICAgIkJDX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTiIsCi0JCQkJICAgICBjb29raWUsIHJlZi0+ZGVidWdfaWQsIHJlZi0+ZGVzYywKLQkJCQkgICAgIHJlZi0+c3Ryb25nLCByZWYtPndlYWssIHJlZi0+bm9kZS0+ZGVidWdfaWQpOwotCi0JCQlpZiAoY21kID09IEJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OKSB7Ci0JCQkJaWYgKHJlZi0+ZGVhdGgpIHsKLQkJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JSIKLQkJCQkJCSJkIEJDX1JFUVVFU1RfREVBVEhfTk9USSIKLQkJCQkJCSJGSUNBVElPTiBkZWF0aCBub3RpZmljIgotCQkJCQkJImF0aW9uIGFscmVhZHkgc2V0XG4iLAotCQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlkZWF0aCA9IGt6YWxsb2Moc2l6ZW9mKCpkZWF0aCksIEdGUF9LRVJORUwpOwotCQkJCWlmIChkZWF0aCA9PSBOVUxMKSB7Ci0JCQkJCXRocmVhZC0+cmV0dXJuX2Vycm9yID0gQlJfRVJST1I7Ci0JCQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfRkFJTEVEX1RSQU5TQUNUSU9OLAotCQkJCQkJICAgICAiYmluZGVyOiAlZDolZCAiCi0JCQkJCQkgICAgICJCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTiBmYWlsZWRcbiIsCi0JCQkJCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYmluZGVyX3N0YXRzX2NyZWF0ZWQoQklOREVSX1NUQVRfREVBVEgpOwotCQkJCUlOSVRfTElTVF9IRUFEKCZkZWF0aC0+d29yay5lbnRyeSk7Ci0JCQkJZGVhdGgtPmNvb2tpZSA9IGNvb2tpZTsKLQkJCQlyZWYtPmRlYXRoID0gZGVhdGg7Ci0JCQkJaWYgKHJlZi0+bm9kZS0+cHJvYyA9PSBOVUxMKSB7Ci0JCQkJCXJlZi0+ZGVhdGgtPndvcmsudHlwZSA9IEJJTkRFUl9XT1JLX0RFQURfQklOREVSOwotCQkJCQlpZiAodGhyZWFkLT5sb29wZXIgJiAoQklOREVSX0xPT1BFUl9TVEFURV9SRUdJU1RFUkVEIHwgQklOREVSX0xPT1BFUl9TVEFURV9FTlRFUkVEKSkgewotCQkJCQkJbGlzdF9hZGRfdGFpbCgmcmVmLT5kZWF0aC0+d29yay5lbnRyeSwgJnRocmVhZC0+dG9kbyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlsaXN0X2FkZF90YWlsKCZyZWYtPmRlYXRoLT53b3JrLmVudHJ5LCAmcHJvYy0+dG9kbyk7Ci0JCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByb2MtPndhaXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAocmVmLT5kZWF0aCA9PSBOVUxMKSB7Ci0JCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiUiCi0JCQkJCQkiZCBCQ19DTEVBUl9ERUFUSF9OT1RJRkkiCi0JCQkJCQkiQ0FUSU9OIGRlYXRoIG5vdGlmaWNhdCIKLQkJCQkJCSJpb24gbm90IGFjdGl2ZVxuIiwKLQkJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZGVhdGggPSByZWYtPmRlYXRoOwotCQkJCWlmIChkZWF0aC0+Y29va2llICE9IGNvb2tpZSkgewotCQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolIgotCQkJCQkJImQgQkNfQ0xFQVJfREVBVEhfTk9USUZJIgotCQkJCQkJIkNBVElPTiBkZWF0aCBub3RpZmljYXQiCi0JCQkJCQkiaW9uIGNvb2tpZSBtaXNtYXRjaCAiCi0JCQkJCQkiJXAgIT0gJXBcbiIsCi0JCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLAotCQkJCQkJZGVhdGgtPmNvb2tpZSwgY29va2llKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXJlZi0+ZGVhdGggPSBOVUxMOwotCQkJCWlmIChsaXN0X2VtcHR5KCZkZWF0aC0+d29yay5lbnRyeSkpIHsKLQkJCQkJZGVhdGgtPndvcmsudHlwZSA9IEJJTkRFUl9XT1JLX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTjsKLQkJCQkJaWYgKHRocmVhZC0+bG9vcGVyICYgKEJJTkRFUl9MT09QRVJfU1RBVEVfUkVHSVNURVJFRCB8IEJJTkRFUl9MT09QRVJfU1RBVEVfRU5URVJFRCkpIHsKLQkJCQkJCWxpc3RfYWRkX3RhaWwoJmRlYXRoLT53b3JrLmVudHJ5LCAmdGhyZWFkLT50b2RvKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWxpc3RfYWRkX3RhaWwoJmRlYXRoLT53b3JrLmVudHJ5LCAmcHJvYy0+dG9kbyk7Ci0JCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByb2MtPndhaXQpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQlVHX09OKGRlYXRoLT53b3JrLnR5cGUgIT0gQklOREVSX1dPUktfREVBRF9CSU5ERVIpOwotCQkJCQlkZWF0aC0+d29yay50eXBlID0gQklOREVSX1dPUktfREVBRF9CSU5ERVJfQU5EX0NMRUFSOwotCQkJCX0KLQkJCX0KLQkJfSBicmVhazsKLQkJY2FzZSBCQ19ERUFEX0JJTkRFUl9ET05FOiB7Ci0JCQlzdHJ1Y3QgYmluZGVyX3dvcmsgKnc7Ci0JCQl2b2lkIF9fdXNlciAqY29va2llOwotCQkJc3RydWN0IGJpbmRlcl9yZWZfZGVhdGggKmRlYXRoID0gTlVMTDsKLQkJCWlmIChnZXRfdXNlcihjb29raWUsICh2b2lkIF9fdXNlciAqIF9fdXNlciAqKXB0cikpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKLQkJCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJnByb2MtPmRlbGl2ZXJlZF9kZWF0aCwgZW50cnkpIHsKLQkJCQlzdHJ1Y3QgYmluZGVyX3JlZl9kZWF0aCAqdG1wX2RlYXRoID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBiaW5kZXJfcmVmX2RlYXRoLCB3b3JrKTsKLQkJCQlpZiAodG1wX2RlYXRoLT5jb29raWUgPT0gY29va2llKSB7Ci0JCQkJCWRlYXRoID0gdG1wX2RlYXRoOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0RFQURfQklOREVSLAotCQkJCSAgICAgImJpbmRlcjogJWQ6JWQgQkNfREVBRF9CSU5ERVJfRE9ORSAlcCBmb3VuZCAlcFxuIiwKLQkJCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGNvb2tpZSwgZGVhdGgpOwotCQkJaWYgKGRlYXRoID09IE5VTEwpIHsKLQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBCQ19ERUFEIgotCQkJCQkiX0JJTkRFUl9ET05FICVwIG5vdCBmb3VuZFxuIiwKLQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgY29va2llKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJbGlzdF9kZWxfaW5pdCgmZGVhdGgtPndvcmsuZW50cnkpOwotCQkJaWYgKGRlYXRoLT53b3JrLnR5cGUgPT0gQklOREVSX1dPUktfREVBRF9CSU5ERVJfQU5EX0NMRUFSKSB7Ci0JCQkJZGVhdGgtPndvcmsudHlwZSA9IEJJTkRFUl9XT1JLX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTjsKLQkJCQlpZiAodGhyZWFkLT5sb29wZXIgJiAoQklOREVSX0xPT1BFUl9TVEFURV9SRUdJU1RFUkVEIHwgQklOREVSX0xPT1BFUl9TVEFURV9FTlRFUkVEKSkgewotCQkJCQlsaXN0X2FkZF90YWlsKCZkZWF0aC0+d29yay5lbnRyeSwgJnRocmVhZC0+dG9kbyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbGlzdF9hZGRfdGFpbCgmZGVhdGgtPndvcmsuZW50cnksICZwcm9jLT50b2RvKTsKLQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcm9jLT53YWl0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiAlZDolZCB1bmtub3duIGNvbW1hbmQgJWRcbiIsCi0JCQkgICAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgY21kKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCSpjb25zdW1lZCA9IHB0ciAtIGJ1ZmZlcjsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgYmluZGVyX3N0YXRfYnIoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCBzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkLAotCQkgICAgdWludDMyX3QgY21kKQotewotCWlmIChfSU9DX05SKGNtZCkgPCBBUlJBWV9TSVpFKGJpbmRlcl9zdGF0cy5icikpIHsKLQkJYmluZGVyX3N0YXRzLmJyW19JT0NfTlIoY21kKV0rKzsKLQkJcHJvYy0+c3RhdHMuYnJbX0lPQ19OUihjbWQpXSsrOwotCQl0aHJlYWQtPnN0YXRzLmJyW19JT0NfTlIoY21kKV0rKzsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgYmluZGVyX2hhc19wcm9jX3dvcmsoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLAotCQkJCXN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQpCi17Ci0JcmV0dXJuICFsaXN0X2VtcHR5KCZwcm9jLT50b2RvKSB8fAotCQkodGhyZWFkLT5sb29wZXIgJiBCSU5ERVJfTE9PUEVSX1NUQVRFX05FRURfUkVUVVJOKTsKLX0KLQotc3RhdGljIGludCBiaW5kZXJfaGFzX3RocmVhZF93b3JrKHN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQpCi17Ci0JcmV0dXJuICFsaXN0X2VtcHR5KCZ0aHJlYWQtPnRvZG8pIHx8IHRocmVhZC0+cmV0dXJuX2Vycm9yICE9IEJSX09LIHx8Ci0JCSh0aHJlYWQtPmxvb3BlciAmIEJJTkRFUl9MT09QRVJfU1RBVEVfTkVFRF9SRVRVUk4pOwotfQotCi1zdGF0aWMgaW50IGJpbmRlcl90aHJlYWRfcmVhZChzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCi0JCQkgICAgICBzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkLAotCQkJICAgICAgdm9pZCAgX191c2VyICpidWZmZXIsIGludCBzaXplLAotCQkJICAgICAgc2lnbmVkIGxvbmcgKmNvbnN1bWVkLCBpbnQgbm9uX2Jsb2NrKQotewotCXZvaWQgX191c2VyICpwdHIgPSBidWZmZXIgKyAqY29uc3VtZWQ7Ci0Jdm9pZCBfX3VzZXIgKmVuZCA9IGJ1ZmZlciArIHNpemU7Ci0KLQlpbnQgcmV0ID0gMDsKLQlpbnQgd2FpdF9mb3JfcHJvY193b3JrOwotCi0JaWYgKCpjb25zdW1lZCA9PSAwKSB7Ci0JCWlmIChwdXRfdXNlcihCUl9OT09QLCAodWludDMyX3QgX191c2VyICopcHRyKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlwdHIgKz0gc2l6ZW9mKHVpbnQzMl90KTsKLQl9Ci0KLXJldHJ5OgotCXdhaXRfZm9yX3Byb2Nfd29yayA9IHRocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2sgPT0gTlVMTCAmJgotCQkJCWxpc3RfZW1wdHkoJnRocmVhZC0+dG9kbyk7Ci0KLQlpZiAodGhyZWFkLT5yZXR1cm5fZXJyb3IgIT0gQlJfT0sgJiYgcHRyIDwgZW5kKSB7Ci0JCWlmICh0aHJlYWQtPnJldHVybl9lcnJvcjIgIT0gQlJfT0spIHsKLQkJCWlmIChwdXRfdXNlcih0aHJlYWQtPnJldHVybl9lcnJvcjIsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7Ci0JCQlpZiAocHRyID09IGVuZCkKLQkJCQlnb3RvIGRvbmU7Ci0JCQl0aHJlYWQtPnJldHVybl9lcnJvcjIgPSBCUl9PSzsKLQkJfQotCQlpZiAocHV0X3VzZXIodGhyZWFkLT5yZXR1cm5fZXJyb3IsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXB0ciArPSBzaXplb2YodWludDMyX3QpOwotCQl0aHJlYWQtPnJldHVybl9lcnJvciA9IEJSX09LOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0KLQl0aHJlYWQtPmxvb3BlciB8PSBCSU5ERVJfTE9PUEVSX1NUQVRFX1dBSVRJTkc7Ci0JaWYgKHdhaXRfZm9yX3Byb2Nfd29yaykKLQkJcHJvYy0+cmVhZHlfdGhyZWFkcysrOwotCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOwotCWlmICh3YWl0X2Zvcl9wcm9jX3dvcmspIHsKLQkJaWYgKCEodGhyZWFkLT5sb29wZXIgJiAoQklOREVSX0xPT1BFUl9TVEFURV9SRUdJU1RFUkVEIHwKLQkJCQkJQklOREVSX0xPT1BFUl9TVEFURV9FTlRFUkVEKSkpIHsKLQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIEVSUk9SOiBUaHJlYWQgd2FpdGluZyAiCi0JCQkJImZvciBwcm9jZXNzIHdvcmsgYmVmb3JlIGNhbGxpbmcgQkNfUkVHSVNURVJfIgotCQkJCSJMT09QRVIgb3IgQkNfRU5URVJfTE9PUEVSIChzdGF0ZSAleClcbiIsCi0JCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgdGhyZWFkLT5sb29wZXIpOwotCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGJpbmRlcl91c2VyX2Vycm9yX3dhaXQsCi0JCQkJCQkgYmluZGVyX3N0b3Bfb25fdXNlcl9lcnJvciA8IDIpOwotCQl9Ci0JCWJpbmRlcl9zZXRfbmljZShwcm9jLT5kZWZhdWx0X3ByaW9yaXR5KTsKLQkJaWYgKG5vbl9ibG9jaykgewotCQkJaWYgKCFiaW5kZXJfaGFzX3Byb2Nfd29yayhwcm9jLCB0aHJlYWQpKQotCQkJCXJldCA9IC1FQUdBSU47Ci0JCX0gZWxzZQotCQkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX2V4Y2x1c2l2ZShwcm9jLT53YWl0LCBiaW5kZXJfaGFzX3Byb2Nfd29yayhwcm9jLCB0aHJlYWQpKTsKLQl9IGVsc2UgewotCQlpZiAobm9uX2Jsb2NrKSB7Ci0JCQlpZiAoIWJpbmRlcl9oYXNfdGhyZWFkX3dvcmsodGhyZWFkKSkKLQkJCQlyZXQgPSAtRUFHQUlOOwotCQl9IGVsc2UKLQkJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh0aHJlYWQtPndhaXQsIGJpbmRlcl9oYXNfdGhyZWFkX3dvcmsodGhyZWFkKSk7Ci0JfQotCW11dGV4X2xvY2soJmJpbmRlcl9sb2NrKTsKLQlpZiAod2FpdF9mb3JfcHJvY193b3JrKQotCQlwcm9jLT5yZWFkeV90aHJlYWRzLS07Ci0JdGhyZWFkLT5sb29wZXIgJj0gfkJJTkRFUl9MT09QRVJfU1RBVEVfV0FJVElORzsKLQotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQl3aGlsZSAoMSkgewotCQl1aW50MzJfdCBjbWQ7Ci0JCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSB0cjsKLQkJc3RydWN0IGJpbmRlcl93b3JrICp3OwotCQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0ID0gTlVMTDsKLQotCQlpZiAoIWxpc3RfZW1wdHkoJnRocmVhZC0+dG9kbykpCi0JCQl3ID0gbGlzdF9maXJzdF9lbnRyeSgmdGhyZWFkLT50b2RvLCBzdHJ1Y3QgYmluZGVyX3dvcmssIGVudHJ5KTsKLQkJZWxzZSBpZiAoIWxpc3RfZW1wdHkoJnByb2MtPnRvZG8pICYmIHdhaXRfZm9yX3Byb2Nfd29yaykKLQkJCXcgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwcm9jLT50b2RvLCBzdHJ1Y3QgYmluZGVyX3dvcmssIGVudHJ5KTsKLQkJZWxzZSB7Ci0JCQlpZiAocHRyIC0gYnVmZmVyID09IDQgJiYgISh0aHJlYWQtPmxvb3BlciAmIEJJTkRFUl9MT09QRVJfU1RBVEVfTkVFRF9SRVRVUk4pKSAvKiBubyBkYXRhIGFkZGVkICovCi0JCQkJZ290byByZXRyeTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGVuZCAtIHB0ciA8IHNpemVvZih0cikgKyA0KQotCQkJYnJlYWs7Ci0KLQkJc3dpdGNoICh3LT50eXBlKSB7Ci0JCWNhc2UgQklOREVSX1dPUktfVFJBTlNBQ1RJT046IHsKLQkJCXQgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiwgd29yayk7Ci0JCX0gYnJlYWs7Ci0JCWNhc2UgQklOREVSX1dPUktfVFJBTlNBQ1RJT05fQ09NUExFVEU6IHsKLQkJCWNtZCA9IEJSX1RSQU5TQUNUSU9OX0NPTVBMRVRFOwotCQkJaWYgKHB1dF91c2VyKGNtZCwgKHVpbnQzMl90IF9fdXNlciAqKXB0cikpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlwdHIgKz0gc2l6ZW9mKHVpbnQzMl90KTsKLQotCQkJYmluZGVyX3N0YXRfYnIocHJvYywgdGhyZWFkLCBjbWQpOwotCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTl9DT01QTEVURSwKLQkJCQkgICAgICJiaW5kZXI6ICVkOiVkIEJSX1RSQU5TQUNUSU9OX0NPTVBMRVRFXG4iLAotCQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7Ci0KLQkJCWxpc3RfZGVsKCZ3LT5lbnRyeSk7Ci0JCQlrZnJlZSh3KTsKLQkJCWJpbmRlcl9zdGF0c19kZWxldGVkKEJJTkRFUl9TVEFUX1RSQU5TQUNUSU9OX0NPTVBMRVRFKTsKLQkJfSBicmVhazsKLQkJY2FzZSBCSU5ERVJfV09SS19OT0RFOiB7Ci0JCQlzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGUgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGJpbmRlcl9ub2RlLCB3b3JrKTsKLQkJCXVpbnQzMl90IGNtZCA9IEJSX05PT1A7Ci0JCQljb25zdCBjaGFyICpjbWRfbmFtZTsKLQkJCWludCBzdHJvbmcgPSBub2RlLT5pbnRlcm5hbF9zdHJvbmdfcmVmcyB8fCBub2RlLT5sb2NhbF9zdHJvbmdfcmVmczsKLQkJCWludCB3ZWFrID0gIWhsaXN0X2VtcHR5KCZub2RlLT5yZWZzKSB8fCBub2RlLT5sb2NhbF93ZWFrX3JlZnMgfHwgc3Ryb25nOwotCQkJaWYgKHdlYWsgJiYgIW5vZGUtPmhhc193ZWFrX3JlZikgewotCQkJCWNtZCA9IEJSX0lOQ1JFRlM7Ci0JCQkJY21kX25hbWUgPSAiQlJfSU5DUkVGUyI7Ci0JCQkJbm9kZS0+aGFzX3dlYWtfcmVmID0gMTsKLQkJCQlub2RlLT5wZW5kaW5nX3dlYWtfcmVmID0gMTsKLQkJCQlub2RlLT5sb2NhbF93ZWFrX3JlZnMrKzsKLQkJCX0gZWxzZSBpZiAoc3Ryb25nICYmICFub2RlLT5oYXNfc3Ryb25nX3JlZikgewotCQkJCWNtZCA9IEJSX0FDUVVJUkU7Ci0JCQkJY21kX25hbWUgPSAiQlJfQUNRVUlSRSI7Ci0JCQkJbm9kZS0+aGFzX3N0cm9uZ19yZWYgPSAxOwotCQkJCW5vZGUtPnBlbmRpbmdfc3Ryb25nX3JlZiA9IDE7Ci0JCQkJbm9kZS0+bG9jYWxfc3Ryb25nX3JlZnMrKzsKLQkJCX0gZWxzZSBpZiAoIXN0cm9uZyAmJiBub2RlLT5oYXNfc3Ryb25nX3JlZikgewotCQkJCWNtZCA9IEJSX1JFTEVBU0U7Ci0JCQkJY21kX25hbWUgPSAiQlJfUkVMRUFTRSI7Ci0JCQkJbm9kZS0+aGFzX3N0cm9uZ19yZWYgPSAwOwotCQkJfSBlbHNlIGlmICghd2VhayAmJiBub2RlLT5oYXNfd2Vha19yZWYpIHsKLQkJCQljbWQgPSBCUl9ERUNSRUZTOwotCQkJCWNtZF9uYW1lID0gIkJSX0RFQ1JFRlMiOwotCQkJCW5vZGUtPmhhc193ZWFrX3JlZiA9IDA7Ci0JCQl9Ci0JCQlpZiAoY21kICE9IEJSX05PT1ApIHsKLQkJCQlpZiAocHV0X3VzZXIoY21kLCAodWludDMyX3QgX191c2VyICopcHRyKSkKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7Ci0JCQkJaWYgKHB1dF91c2VyKG5vZGUtPnB0ciwgKHZvaWQgKiBfX3VzZXIgKilwdHIpKQotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQlwdHIgKz0gc2l6ZW9mKHZvaWQgKik7Ci0JCQkJaWYgKHB1dF91c2VyKG5vZGUtPmNvb2tpZSwgKHZvaWQgKiBfX3VzZXIgKilwdHIpKQotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQlwdHIgKz0gc2l6ZW9mKHZvaWQgKik7Ci0KLQkJCQliaW5kZXJfc3RhdF9icihwcm9jLCB0aHJlYWQsIGNtZCk7Ci0JCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19VU0VSX1JFRlMsCi0JCQkJCSAgICAgImJpbmRlcjogJWQ6JWQgJXMgJWQgdSVwIGMlcFxuIiwKLQkJCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBjbWRfbmFtZSwgbm9kZS0+ZGVidWdfaWQsIG5vZGUtPnB0ciwgbm9kZS0+Y29va2llKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbGlzdF9kZWxfaW5pdCgmdy0+ZW50cnkpOwotCQkJCWlmICghd2VhayAmJiAhc3Ryb25nKSB7Ci0JCQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfSU5URVJOQUxfUkVGUywKLQkJCQkJCSAgICAgImJpbmRlcjogJWQ6JWQgbm9kZSAlZCB1JXAgYyVwIGRlbGV0ZWRcbiIsCi0JCQkJCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIG5vZGUtPmRlYnVnX2lkLAotCQkJCQkJICAgICBub2RlLT5wdHIsIG5vZGUtPmNvb2tpZSk7Ci0JCQkJCXJiX2VyYXNlKCZub2RlLT5yYl9ub2RlLCAmcHJvYy0+bm9kZXMpOwotCQkJCQlrZnJlZShub2RlKTsKLQkJCQkJYmluZGVyX3N0YXRzX2RlbGV0ZWQoQklOREVSX1NUQVRfTk9ERSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19JTlRFUk5BTF9SRUZTLAotCQkJCQkJICAgICAiYmluZGVyOiAlZDolZCBub2RlICVkIHUlcCBjJXAgc3RhdGUgdW5jaGFuZ2VkXG4iLAotCQkJCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBub2RlLT5kZWJ1Z19pZCwgbm9kZS0+cHRyLAotCQkJCQkJICAgICBub2RlLT5jb29raWUpOwotCQkJCX0KLQkJCX0KLQkJfSBicmVhazsKLQkJY2FzZSBCSU5ERVJfV09SS19ERUFEX0JJTkRFUjoKLQkJY2FzZSBCSU5ERVJfV09SS19ERUFEX0JJTkRFUl9BTkRfQ0xFQVI6Ci0JCWNhc2UgQklOREVSX1dPUktfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OOiB7Ci0JCQlzdHJ1Y3QgYmluZGVyX3JlZl9kZWF0aCAqZGVhdGg7Ci0JCQl1aW50MzJfdCBjbWQ7Ci0KLQkJCWRlYXRoID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBiaW5kZXJfcmVmX2RlYXRoLCB3b3JrKTsKLQkJCWlmICh3LT50eXBlID09IEJJTkRFUl9XT1JLX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTikKLQkJCQljbWQgPSBCUl9DTEVBUl9ERUFUSF9OT1RJRklDQVRJT05fRE9ORTsKLQkJCWVsc2UKLQkJCQljbWQgPSBCUl9ERUFEX0JJTkRFUjsKLQkJCWlmIChwdXRfdXNlcihjbWQsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7Ci0JCQlpZiAocHV0X3VzZXIoZGVhdGgtPmNvb2tpZSwgKHZvaWQgKiBfX3VzZXIgKilwdHIpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcHRyICs9IHNpemVvZih2b2lkICopOwotCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19ERUFUSF9OT1RJRklDQVRJT04sCi0JCQkJICAgICAiYmluZGVyOiAlZDolZCAlcyAlcFxuIiwKLQkJCQkgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLAotCQkJCSAgICAgIGNtZCA9PSBCUl9ERUFEX0JJTkRFUiA/Ci0JCQkJICAgICAgIkJSX0RFQURfQklOREVSIiA6Ci0JCQkJICAgICAgIkJSX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTl9ET05FIiwKLQkJCQkgICAgICBkZWF0aC0+Y29va2llKTsKLQotCQkJaWYgKHctPnR5cGUgPT0gQklOREVSX1dPUktfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OKSB7Ci0JCQkJbGlzdF9kZWwoJnctPmVudHJ5KTsKLQkJCQlrZnJlZShkZWF0aCk7Ci0JCQkJYmluZGVyX3N0YXRzX2RlbGV0ZWQoQklOREVSX1NUQVRfREVBVEgpOwotCQkJfSBlbHNlCi0JCQkJbGlzdF9tb3ZlKCZ3LT5lbnRyeSwgJnByb2MtPmRlbGl2ZXJlZF9kZWF0aCk7Ci0JCQlpZiAoY21kID09IEJSX0RFQURfQklOREVSKQotCQkJCWdvdG8gZG9uZTsgLyogREVBRF9CSU5ERVIgbm90aWZpY2F0aW9ucyBjYW4gY2F1c2UgdHJhbnNhY3Rpb25zICovCi0JCX0gYnJlYWs7Ci0JCX0KLQotCQlpZiAoIXQpCi0JCQljb250aW51ZTsKLQotCQlCVUdfT04odC0+YnVmZmVyID09IE5VTEwpOwotCQlpZiAodC0+YnVmZmVyLT50YXJnZXRfbm9kZSkgewotCQkJc3RydWN0IGJpbmRlcl9ub2RlICp0YXJnZXRfbm9kZSA9IHQtPmJ1ZmZlci0+dGFyZ2V0X25vZGU7Ci0JCQl0ci50YXJnZXQucHRyID0gdGFyZ2V0X25vZGUtPnB0cjsKLQkJCXRyLmNvb2tpZSA9ICB0YXJnZXRfbm9kZS0+Y29va2llOwotCQkJdC0+c2F2ZWRfcHJpb3JpdHkgPSB0YXNrX25pY2UoY3VycmVudCk7Ci0JCQlpZiAodC0+cHJpb3JpdHkgPCB0YXJnZXRfbm9kZS0+bWluX3ByaW9yaXR5ICYmCi0JCQkgICAgISh0LT5mbGFncyAmIFRGX09ORV9XQVkpKQotCQkJCWJpbmRlcl9zZXRfbmljZSh0LT5wcmlvcml0eSk7Ci0JCQllbHNlIGlmICghKHQtPmZsYWdzICYgVEZfT05FX1dBWSkgfHwKLQkJCQkgdC0+c2F2ZWRfcHJpb3JpdHkgPiB0YXJnZXRfbm9kZS0+bWluX3ByaW9yaXR5KQotCQkJCWJpbmRlcl9zZXRfbmljZSh0YXJnZXRfbm9kZS0+bWluX3ByaW9yaXR5KTsKLQkJCWNtZCA9IEJSX1RSQU5TQUNUSU9OOwotCQl9IGVsc2UgewotCQkJdHIudGFyZ2V0LnB0ciA9IE5VTEw7Ci0JCQl0ci5jb29raWUgPSBOVUxMOwotCQkJY21kID0gQlJfUkVQTFk7Ci0JCX0KLQkJdHIuY29kZSA9IHQtPmNvZGU7Ci0JCXRyLmZsYWdzID0gdC0+ZmxhZ3M7Ci0JCXRyLnNlbmRlcl9ldWlkID0gdC0+c2VuZGVyX2V1aWQ7Ci0KLQkJaWYgKHQtPmZyb20pIHsKLQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqc2VuZGVyID0gdC0+ZnJvbS0+cHJvYy0+dHNrOwotCQkJdHIuc2VuZGVyX3BpZCA9IHRhc2tfdGdpZF9ucl9ucyhzZW5kZXIsCi0JCQkJCQkJY3VycmVudC0+bnNwcm94eS0+cGlkX25zKTsKLQkJfSBlbHNlIHsKLQkJCXRyLnNlbmRlcl9waWQgPSAwOwotCQl9Ci0KLQkJdHIuZGF0YV9zaXplID0gdC0+YnVmZmVyLT5kYXRhX3NpemU7Ci0JCXRyLm9mZnNldHNfc2l6ZSA9IHQtPmJ1ZmZlci0+b2Zmc2V0c19zaXplOwotCQl0ci5kYXRhLnB0ci5idWZmZXIgPSAodm9pZCAqKXQtPmJ1ZmZlci0+ZGF0YSArCi0JCQkJCXByb2MtPnVzZXJfYnVmZmVyX29mZnNldDsKLQkJdHIuZGF0YS5wdHIub2Zmc2V0cyA9IHRyLmRhdGEucHRyLmJ1ZmZlciArCi0JCQkJCUFMSUdOKHQtPmJ1ZmZlci0+ZGF0YV9zaXplLAotCQkJCQkgICAgc2l6ZW9mKHZvaWQgKikpOwotCi0JCWlmIChwdXRfdXNlcihjbWQsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXB0ciArPSBzaXplb2YodWludDMyX3QpOwotCQlpZiAoY29weV90b191c2VyKHB0ciwgJnRyLCBzaXplb2YodHIpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlwdHIgKz0gc2l6ZW9mKHRyKTsKLQotCQliaW5kZXJfc3RhdF9icihwcm9jLCB0aHJlYWQsIGNtZCk7Ci0JCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04sCi0JCQkgICAgICJiaW5kZXI6ICVkOiVkICVzICVkICVkOiVkLCBjbWQgJWQiCi0JCQkgICAgICJzaXplICV6ZC0lemQgcHRyICVwLSVwXG4iLAotCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLAotCQkJICAgICAoY21kID09IEJSX1RSQU5TQUNUSU9OKSA/ICJCUl9UUkFOU0FDVElPTiIgOgotCQkJICAgICAiQlJfUkVQTFkiLAotCQkJICAgICB0LT5kZWJ1Z19pZCwgdC0+ZnJvbSA/IHQtPmZyb20tPnByb2MtPnBpZCA6IDAsCi0JCQkgICAgIHQtPmZyb20gPyB0LT5mcm9tLT5waWQgOiAwLCBjbWQsCi0JCQkgICAgIHQtPmJ1ZmZlci0+ZGF0YV9zaXplLCB0LT5idWZmZXItPm9mZnNldHNfc2l6ZSwKLQkJCSAgICAgdHIuZGF0YS5wdHIuYnVmZmVyLCB0ci5kYXRhLnB0ci5vZmZzZXRzKTsKLQotCQlsaXN0X2RlbCgmdC0+d29yay5lbnRyeSk7Ci0JCXQtPmJ1ZmZlci0+YWxsb3dfdXNlcl9mcmVlID0gMTsKLQkJaWYgKGNtZCA9PSBCUl9UUkFOU0FDVElPTiAmJiAhKHQtPmZsYWdzICYgVEZfT05FX1dBWSkpIHsKLQkJCXQtPnRvX3BhcmVudCA9IHRocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2s7Ci0JCQl0LT50b190aHJlYWQgPSB0aHJlYWQ7Ci0JCQl0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrID0gdDsKLQkJfSBlbHNlIHsKLQkJCXQtPmJ1ZmZlci0+dHJhbnNhY3Rpb24gPSBOVUxMOwotCQkJa2ZyZWUodCk7Ci0JCQliaW5kZXJfc3RhdHNfZGVsZXRlZChCSU5ERVJfU1RBVF9UUkFOU0FDVElPTik7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi1kb25lOgotCi0JKmNvbnN1bWVkID0gcHRyIC0gYnVmZmVyOwotCWlmIChwcm9jLT5yZXF1ZXN0ZWRfdGhyZWFkcyArIHByb2MtPnJlYWR5X3RocmVhZHMgPT0gMCAmJgotCSAgICBwcm9jLT5yZXF1ZXN0ZWRfdGhyZWFkc19zdGFydGVkIDwgcHJvYy0+bWF4X3RocmVhZHMgJiYKLQkgICAgKHRocmVhZC0+bG9vcGVyICYgKEJJTkRFUl9MT09QRVJfU1RBVEVfUkVHSVNURVJFRCB8Ci0JICAgICBCSU5ERVJfTE9PUEVSX1NUQVRFX0VOVEVSRUQpKSAvKiB0aGUgdXNlci1zcGFjZSBjb2RlIGZhaWxzIHRvICovCi0JICAgICAvKnNwYXduIGEgbmV3IHRocmVhZCBpZiB3ZSBsZWF2ZSB0aGlzIG91dCAqLykgewotCQlwcm9jLT5yZXF1ZXN0ZWRfdGhyZWFkcysrOwotCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1RIUkVBRFMsCi0JCQkgICAgICJiaW5kZXI6ICVkOiVkIEJSX1NQQVdOX0xPT1BFUlxuIiwKLQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7Ci0JCWlmIChwdXRfdXNlcihCUl9TUEFXTl9MT09QRVIsICh1aW50MzJfdCBfX3VzZXIgKilidWZmZXIpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBiaW5kZXJfcmVsZWFzZV93b3JrKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCi17Ci0Jc3RydWN0IGJpbmRlcl93b3JrICp3OwotCXdoaWxlICghbGlzdF9lbXB0eShsaXN0KSkgewotCQl3ID0gbGlzdF9maXJzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgYmluZGVyX3dvcmssIGVudHJ5KTsKLQkJbGlzdF9kZWxfaW5pdCgmdy0+ZW50cnkpOwotCQlzd2l0Y2ggKHctPnR5cGUpIHsKLQkJY2FzZSBCSU5ERVJfV09SS19UUkFOU0FDVElPTjogewotCQkJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdDsKLQotCQkJdCA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uLCB3b3JrKTsKLQkJCWlmICh0LT5idWZmZXItPnRhcmdldF9ub2RlICYmICEodC0+ZmxhZ3MgJiBURl9PTkVfV0FZKSkKLQkJCQliaW5kZXJfc2VuZF9mYWlsZWRfcmVwbHkodCwgQlJfREVBRF9SRVBMWSk7Ci0JCX0gYnJlYWs7Ci0JCWNhc2UgQklOREVSX1dPUktfVFJBTlNBQ1RJT05fQ09NUExFVEU6IHsKLQkJCWtmcmVlKHcpOwotCQkJYmluZGVyX3N0YXRzX2RlbGV0ZWQoQklOREVSX1NUQVRfVFJBTlNBQ1RJT05fQ09NUExFVEUpOwotCQl9IGJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLX0KLQotc3RhdGljIHN0cnVjdCBiaW5kZXJfdGhyZWFkICpiaW5kZXJfZ2V0X3RocmVhZChzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MpCi17Ci0Jc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCA9IE5VTEw7Ci0Jc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7Ci0Jc3RydWN0IHJiX25vZGUgKipwID0gJnByb2MtPnRocmVhZHMucmJfbm9kZTsKLQotCXdoaWxlICgqcCkgewotCQlwYXJlbnQgPSAqcDsKLQkJdGhyZWFkID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgYmluZGVyX3RocmVhZCwgcmJfbm9kZSk7Ci0KLQkJaWYgKGN1cnJlbnQtPnBpZCA8IHRocmVhZC0+cGlkKQotCQkJcCA9ICYoKnApLT5yYl9sZWZ0OwotCQllbHNlIGlmIChjdXJyZW50LT5waWQgPiB0aHJlYWQtPnBpZCkKLQkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7Ci0JCWVsc2UKLQkJCWJyZWFrOwotCX0KLQlpZiAoKnAgPT0gTlVMTCkgewotCQl0aHJlYWQgPSBremFsbG9jKHNpemVvZigqdGhyZWFkKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICh0aHJlYWQgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQliaW5kZXJfc3RhdHNfY3JlYXRlZChCSU5ERVJfU1RBVF9USFJFQUQpOwotCQl0aHJlYWQtPnByb2MgPSBwcm9jOwotCQl0aHJlYWQtPnBpZCA9IGN1cnJlbnQtPnBpZDsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmdGhyZWFkLT53YWl0KTsKLQkJSU5JVF9MSVNUX0hFQUQoJnRocmVhZC0+dG9kbyk7Ci0JCXJiX2xpbmtfbm9kZSgmdGhyZWFkLT5yYl9ub2RlLCBwYXJlbnQsIHApOwotCQlyYl9pbnNlcnRfY29sb3IoJnRocmVhZC0+cmJfbm9kZSwgJnByb2MtPnRocmVhZHMpOwotCQl0aHJlYWQtPmxvb3BlciB8PSBCSU5ERVJfTE9PUEVSX1NUQVRFX05FRURfUkVUVVJOOwotCQl0aHJlYWQtPnJldHVybl9lcnJvciA9IEJSX09LOwotCQl0aHJlYWQtPnJldHVybl9lcnJvcjIgPSBCUl9PSzsKLQl9Ci0JcmV0dXJuIHRocmVhZDsKLX0KLQotc3RhdGljIGludCBiaW5kZXJfZnJlZV90aHJlYWQoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLAotCQkJICAgICAgc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCkKLXsKLQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0OwotCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnNlbmRfcmVwbHkgPSBOVUxMOwotCWludCBhY3RpdmVfdHJhbnNhY3Rpb25zID0gMDsKLQotCXJiX2VyYXNlKCZ0aHJlYWQtPnJiX25vZGUsICZwcm9jLT50aHJlYWRzKTsKLQl0ID0gdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjazsKLQlpZiAodCAmJiB0LT50b190aHJlYWQgPT0gdGhyZWFkKQotCQlzZW5kX3JlcGx5ID0gdDsKLQl3aGlsZSAodCkgewotCQlhY3RpdmVfdHJhbnNhY3Rpb25zKys7Ci0JCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfREVBRF9UUkFOU0FDVElPTiwKLQkJCSAgICAgImJpbmRlcjogcmVsZWFzZSAlZDolZCB0cmFuc2FjdGlvbiAlZCAiCi0JCQkgICAgICIlcywgc3RpbGwgYWN0aXZlXG4iLCBwcm9jLT5waWQsIHRocmVhZC0+cGlkLAotCQkJICAgICB0LT5kZWJ1Z19pZCwKLQkJCSAgICAgKHQtPnRvX3RocmVhZCA9PSB0aHJlYWQpID8gImluIiA6ICJvdXQiKTsKLQotCQlpZiAodC0+dG9fdGhyZWFkID09IHRocmVhZCkgewotCQkJdC0+dG9fcHJvYyA9IE5VTEw7Ci0JCQl0LT50b190aHJlYWQgPSBOVUxMOwotCQkJaWYgKHQtPmJ1ZmZlcikgewotCQkJCXQtPmJ1ZmZlci0+dHJhbnNhY3Rpb24gPSBOVUxMOwotCQkJCXQtPmJ1ZmZlciA9IE5VTEw7Ci0JCQl9Ci0JCQl0ID0gdC0+dG9fcGFyZW50OwotCQl9IGVsc2UgaWYgKHQtPmZyb20gPT0gdGhyZWFkKSB7Ci0JCQl0LT5mcm9tID0gTlVMTDsKLQkJCXQgPSB0LT5mcm9tX3BhcmVudDsKLQkJfSBlbHNlCi0JCQlCVUcoKTsKLQl9Ci0JaWYgKHNlbmRfcmVwbHkpCi0JCWJpbmRlcl9zZW5kX2ZhaWxlZF9yZXBseShzZW5kX3JlcGx5LCBCUl9ERUFEX1JFUExZKTsKLQliaW5kZXJfcmVsZWFzZV93b3JrKCZ0aHJlYWQtPnRvZG8pOwotCWtmcmVlKHRocmVhZCk7Ci0JYmluZGVyX3N0YXRzX2RlbGV0ZWQoQklOREVSX1NUQVRfVEhSRUFEKTsKLQlyZXR1cm4gYWN0aXZlX3RyYW5zYWN0aW9uczsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBiaW5kZXJfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCQlzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCi17Ci0Jc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQgPSBOVUxMOwotCWludCB3YWl0X2Zvcl9wcm9jX3dvcms7Ci0KLQltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7Ci0JdGhyZWFkID0gYmluZGVyX2dldF90aHJlYWQocHJvYyk7Ci0KLQl3YWl0X2Zvcl9wcm9jX3dvcmsgPSB0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrID09IE5VTEwgJiYKLQkJbGlzdF9lbXB0eSgmdGhyZWFkLT50b2RvKSAmJiB0aHJlYWQtPnJldHVybl9lcnJvciA9PSBCUl9PSzsKLQltdXRleF91bmxvY2soJmJpbmRlcl9sb2NrKTsKLQotCWlmICh3YWl0X2Zvcl9wcm9jX3dvcmspIHsKLQkJaWYgKGJpbmRlcl9oYXNfcHJvY193b3JrKHByb2MsIHRocmVhZCkpCi0JCQlyZXR1cm4gUE9MTElOOwotCQlwb2xsX3dhaXQoZmlscCwgJnByb2MtPndhaXQsIHdhaXQpOwotCQlpZiAoYmluZGVyX2hhc19wcm9jX3dvcmsocHJvYywgdGhyZWFkKSkKLQkJCXJldHVybiBQT0xMSU47Ci0JfSBlbHNlIHsKLQkJaWYgKGJpbmRlcl9oYXNfdGhyZWFkX3dvcmsodGhyZWFkKSkKLQkJCXJldHVybiBQT0xMSU47Ci0JCXBvbGxfd2FpdChmaWxwLCAmdGhyZWFkLT53YWl0LCB3YWl0KTsKLQkJaWYgKGJpbmRlcl9oYXNfdGhyZWFkX3dvcmsodGhyZWFkKSkKLQkJCXJldHVybiBQT0xMSU47Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZyBiaW5kZXJfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCWludCByZXQ7Ci0Jc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQ7Ci0JdW5zaWduZWQgaW50IHNpemUgPSBfSU9DX1NJWkUoY21kKTsKLQl2b2lkIF9fdXNlciAqdWJ1ZiA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQotCS8qcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyX2lvY3RsOiAlZDolZCAleCAlbHhcbiIsIHByb2MtPnBpZCwgY3VycmVudC0+cGlkLCBjbWQsIGFyZyk7Ki8KLQotCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShiaW5kZXJfdXNlcl9lcnJvcl93YWl0LCBiaW5kZXJfc3RvcF9vbl91c2VyX2Vycm9yIDwgMik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCW11dGV4X2xvY2soJmJpbmRlcl9sb2NrKTsKLQl0aHJlYWQgPSBiaW5kZXJfZ2V0X3RocmVhZChwcm9jKTsKLQlpZiAodGhyZWFkID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnI7Ci0JfQotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEJJTkRFUl9XUklURV9SRUFEOiB7Ci0JCXN0cnVjdCBiaW5kZXJfd3JpdGVfcmVhZCBid3I7Ci0JCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QgYmluZGVyX3dyaXRlX3JlYWQpKSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZid3IsIHVidWYsIHNpemVvZihid3IpKSkgewotCQkJcmV0ID0gLUVGQVVMVDsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfUkVBRF9XUklURSwKLQkJCSAgICAgImJpbmRlcjogJWQ6JWQgd3JpdGUgJWxkIGF0ICUwOGx4LCByZWFkICVsZCBhdCAlMDhseFxuIiwKLQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgYndyLndyaXRlX3NpemUsIGJ3ci53cml0ZV9idWZmZXIsCi0JCQkgICAgIGJ3ci5yZWFkX3NpemUsIGJ3ci5yZWFkX2J1ZmZlcik7Ci0KLQkJaWYgKGJ3ci53cml0ZV9zaXplID4gMCkgewotCQkJcmV0ID0gYmluZGVyX3RocmVhZF93cml0ZShwcm9jLCB0aHJlYWQsICh2b2lkIF9fdXNlciAqKWJ3ci53cml0ZV9idWZmZXIsIGJ3ci53cml0ZV9zaXplLCAmYndyLndyaXRlX2NvbnN1bWVkKTsKLQkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJYndyLnJlYWRfY29uc3VtZWQgPSAwOwotCQkJCWlmIChjb3B5X3RvX3VzZXIodWJ1ZiwgJmJ3ciwgc2l6ZW9mKGJ3cikpKQotCQkJCQlyZXQgPSAtRUZBVUxUOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQl9Ci0JCWlmIChid3IucmVhZF9zaXplID4gMCkgewotCQkJcmV0ID0gYmluZGVyX3RocmVhZF9yZWFkKHByb2MsIHRocmVhZCwgKHZvaWQgX191c2VyICopYndyLnJlYWRfYnVmZmVyLCBid3IucmVhZF9zaXplLCAmYndyLnJlYWRfY29uc3VtZWQsIGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKLQkJCWlmICghbGlzdF9lbXB0eSgmcHJvYy0+dG9kbykpCi0JCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcm9jLT53YWl0KTsKLQkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJaWYgKGNvcHlfdG9fdXNlcih1YnVmLCAmYndyLCBzaXplb2YoYndyKSkpCi0JCQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQkJZ290byBlcnI7Ci0JCQl9Ci0JCX0KLQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19SRUFEX1dSSVRFLAotCQkJICAgICAiYmluZGVyOiAlZDolZCB3cm90ZSAlbGQgb2YgJWxkLCByZWFkIHJldHVybiAlbGQgb2YgJWxkXG4iLAotCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBid3Iud3JpdGVfY29uc3VtZWQsIGJ3ci53cml0ZV9zaXplLAotCQkJICAgICBid3IucmVhZF9jb25zdW1lZCwgYndyLnJlYWRfc2l6ZSk7Ci0JCWlmIChjb3B5X3RvX3VzZXIodWJ1ZiwgJmJ3ciwgc2l6ZW9mKGJ3cikpKSB7Ci0JCQlyZXQgPSAtRUZBVUxUOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQklOREVSX1NFVF9NQVhfVEhSRUFEUzoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZwcm9jLT5tYXhfdGhyZWFkcywgdWJ1Ziwgc2l6ZW9mKHByb2MtPm1heF90aHJlYWRzKSkpIHsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQlicmVhazsKLQljYXNlIEJJTkRFUl9TRVRfQ09OVEVYVF9NR1I6Ci0JCWlmIChiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZSAhPSBOVUxMKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogQklOREVSX1NFVF9DT05URVhUX01HUiBhbHJlYWR5IHNldFxuIik7Ci0JCQlyZXQgPSAtRUJVU1k7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQlpZiAoYmluZGVyX2NvbnRleHRfbWdyX3VpZCAhPSAtMSkgewotCQkJaWYgKGJpbmRlcl9jb250ZXh0X21ncl91aWQgIT0gY3VycmVudC0+Y3JlZC0+ZXVpZCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiBCSU5ERVJfU0VUXyIKLQkJCQkgICAgICAgIkNPTlRFWFRfTUdSIGJhZCB1aWQgJWQgIT0gJWRcbiIsCi0JCQkJICAgICAgIGN1cnJlbnQtPmNyZWQtPmV1aWQsCi0JCQkJICAgICAgIGJpbmRlcl9jb250ZXh0X21ncl91aWQpOwotCQkJCXJldCA9IC1FUEVSTTsKLQkJCQlnb3RvIGVycjsKLQkJCX0KLQkJfSBlbHNlCi0JCQliaW5kZXJfY29udGV4dF9tZ3JfdWlkID0gY3VycmVudC0+Y3JlZC0+ZXVpZDsKLQkJYmluZGVyX2NvbnRleHRfbWdyX25vZGUgPSBiaW5kZXJfbmV3X25vZGUocHJvYywgTlVMTCwgTlVMTCk7Ci0JCWlmIChiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZSA9PSBOVUxMKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJYmluZGVyX2NvbnRleHRfbWdyX25vZGUtPmxvY2FsX3dlYWtfcmVmcysrOwotCQliaW5kZXJfY29udGV4dF9tZ3Jfbm9kZS0+bG9jYWxfc3Ryb25nX3JlZnMrKzsKLQkJYmluZGVyX2NvbnRleHRfbWdyX25vZGUtPmhhc19zdHJvbmdfcmVmID0gMTsKLQkJYmluZGVyX2NvbnRleHRfbWdyX25vZGUtPmhhc193ZWFrX3JlZiA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgQklOREVSX1RIUkVBRF9FWElUOgotCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1RIUkVBRFMsICJiaW5kZXI6ICVkOiVkIGV4aXRcbiIsCi0JCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQpOwotCQliaW5kZXJfZnJlZV90aHJlYWQocHJvYywgdGhyZWFkKTsKLQkJdGhyZWFkID0gTlVMTDsKLQkJYnJlYWs7Ci0JY2FzZSBCSU5ERVJfVkVSU0lPTjoKLQkJaWYgKHNpemUgIT0gc2l6ZW9mKHN0cnVjdCBiaW5kZXJfdmVyc2lvbikpIHsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQlpZiAocHV0X3VzZXIoQklOREVSX0NVUlJFTlRfUFJPVE9DT0xfVkVSU0lPTiwgJigoc3RydWN0IGJpbmRlcl92ZXJzaW9uICopdWJ1ZiktPnByb3RvY29sX3ZlcnNpb24pKSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCXJldCA9IDA7Ci1lcnI6Ci0JaWYgKHRocmVhZCkKLQkJdGhyZWFkLT5sb29wZXIgJj0gfkJJTkRFUl9MT09QRVJfU1RBVEVfTkVFRF9SRVRVUk47Ci0JbXV0ZXhfdW5sb2NrKCZiaW5kZXJfbG9jayk7Ci0Jd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGJpbmRlcl91c2VyX2Vycm9yX3dhaXQsIGJpbmRlcl9zdG9wX29uX3VzZXJfZXJyb3IgPCAyKTsKLQlpZiAocmV0ICYmIHJldCAhPSAtRVJFU1RBUlRTWVMpCi0JCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgaW9jdGwgJXggJWx4IHJldHVybmVkICVkXG4iLCBwcm9jLT5waWQsIGN1cnJlbnQtPnBpZCwgY21kLCBhcmcsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgYmluZGVyX3ZtYV9vcGVuKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYyA9IHZtYS0+dm1fcHJpdmF0ZV9kYXRhOwotCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfT1BFTl9DTE9TRSwKLQkJICAgICAiYmluZGVyOiAlZCBvcGVuIHZtIGFyZWEgJWx4LSVseCAoJWxkIEspIHZtYSAlbHggcGFnZXAgJWx4XG4iLAotCQkgICAgIHByb2MtPnBpZCwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsCi0JCSAgICAgKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgLyBTWl8xSywgdm1hLT52bV9mbGFncywKLQkJICAgICAodW5zaWduZWQgbG9uZylwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSk7Ci0JZHVtcF9zdGFjaygpOwotfQotCi1zdGF0aWMgdm9pZCBiaW5kZXJfdm1hX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYyA9IHZtYS0+dm1fcHJpdmF0ZV9kYXRhOwotCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfT1BFTl9DTE9TRSwKLQkJICAgICAiYmluZGVyOiAlZCBjbG9zZSB2bSBhcmVhICVseC0lbHggKCVsZCBLKSB2bWEgJWx4IHBhZ2VwICVseFxuIiwKLQkJICAgICBwcm9jLT5waWQsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kLAotCQkgICAgICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpIC8gU1pfMUssIHZtYS0+dm1fZmxhZ3MsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkpOwotCXByb2MtPnZtYSA9IE5VTEw7Ci0JYmluZGVyX2RlZmVyX3dvcmsocHJvYywgQklOREVSX0RFRkVSUkVEX1BVVF9GSUxFUyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgYmluZGVyX3ZtX29wcyA9IHsKLQkub3BlbiA9IGJpbmRlcl92bWFfb3BlbiwKLQkuY2xvc2UgPSBiaW5kZXJfdm1hX2Nsb3NlLAotfTsKLQotc3RhdGljIGludCBiaW5kZXJfbW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhOwotCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQljb25zdCBjaGFyICpmYWlsdXJlX3N0cmluZzsKLQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyOwotCi0JaWYgKCh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpID4gU1pfNE0pCi0JCXZtYS0+dm1fZW5kID0gdm1hLT52bV9zdGFydCArIFNaXzRNOwotCi0JYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19PUEVOX0NMT1NFLAotCQkgICAgICJiaW5kZXJfbW1hcDogJWQgJWx4LSVseCAoJWxkIEspIHZtYSAlbHggcGFnZXAgJWx4XG4iLAotCQkgICAgIHByb2MtPnBpZCwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsCi0JCSAgICAgKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgLyBTWl8xSywgdm1hLT52bV9mbGFncywKLQkJICAgICAodW5zaWduZWQgbG9uZylwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSk7Ci0KLQlpZiAodm1hLT52bV9mbGFncyAmIEZPUkJJRERFTl9NTUFQX0ZMQUdTKSB7Ci0JCXJldCA9IC1FUEVSTTsKLQkJZmFpbHVyZV9zdHJpbmcgPSAiYmFkIHZtX2ZsYWdzIjsKLQkJZ290byBlcnJfYmFkX2FyZzsKLQl9Ci0Jdm1hLT52bV9mbGFncyA9ICh2bWEtPnZtX2ZsYWdzIHwgVk1fRE9OVENPUFkpICYgflZNX01BWVdSSVRFOwotCi0JaWYgKHByb2MtPmJ1ZmZlcikgewotCQlyZXQgPSAtRUJVU1k7Ci0JCWZhaWx1cmVfc3RyaW5nID0gImFscmVhZHkgbWFwcGVkIjsKLQkJZ290byBlcnJfYWxyZWFkeV9tYXBwZWQ7Ci0JfQotCi0JYXJlYSA9IGdldF92bV9hcmVhKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwgVk1fSU9SRU1BUCk7Ci0JaWYgKGFyZWEgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlmYWlsdXJlX3N0cmluZyA9ICJnZXRfdm1fYXJlYSI7Ci0JCWdvdG8gZXJyX2dldF92bV9hcmVhX2ZhaWxlZDsKLQl9Ci0JcHJvYy0+YnVmZmVyID0gYXJlYS0+YWRkcjsKLQlwcm9jLT51c2VyX2J1ZmZlcl9vZmZzZXQgPSB2bWEtPnZtX3N0YXJ0IC0gKHVpbnRwdHJfdClwcm9jLT5idWZmZXI7Ci0KLSNpZmRlZiBDT05GSUdfQ1BVX0NBQ0hFX1ZJUFQKLQlpZiAoY2FjaGVfaXNfdmlwdF9hbGlhc2luZygpKSB7Ci0JCXdoaWxlIChDQUNIRV9DT0xPVVIoKHZtYS0+dm1fc3RhcnQgXiAodWludDMyX3QpcHJvYy0+YnVmZmVyKSkpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcl9tbWFwOiAlZCAlbHgtJWx4IG1hcHMgJXAgYmFkIGFsaWdubWVudFxuIiwgcHJvYy0+cGlkLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCwgcHJvYy0+YnVmZmVyKTsKLQkJCXZtYS0+dm1fc3RhcnQgKz0gUEFHRV9TSVpFOwotCQl9Ci0JfQotI2VuZGlmCi0JcHJvYy0+cGFnZXMgPSBremFsbG9jKHNpemVvZihwcm9jLT5wYWdlc1swXSkgKiAoKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgLyBQQUdFX1NJWkUpLCBHRlBfS0VSTkVMKTsKLQlpZiAocHJvYy0+cGFnZXMgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlmYWlsdXJlX3N0cmluZyA9ICJhbGxvYyBwYWdlIGFycmF5IjsKLQkJZ290byBlcnJfYWxsb2NfcGFnZXNfZmFpbGVkOwotCX0KLQlwcm9jLT5idWZmZXJfc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKLQotCXZtYS0+dm1fb3BzID0gJmJpbmRlcl92bV9vcHM7Ci0Jdm1hLT52bV9wcml2YXRlX2RhdGEgPSBwcm9jOwotCi0JaWYgKGJpbmRlcl91cGRhdGVfcGFnZV9yYW5nZShwcm9jLCAxLCBwcm9jLT5idWZmZXIsIHByb2MtPmJ1ZmZlciArIFBBR0VfU0laRSwgdm1hKSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlmYWlsdXJlX3N0cmluZyA9ICJhbGxvYyBzbWFsbCBidWYiOwotCQlnb3RvIGVycl9hbGxvY19zbWFsbF9idWZfZmFpbGVkOwotCX0KLQlidWZmZXIgPSBwcm9jLT5idWZmZXI7Ci0JSU5JVF9MSVNUX0hFQUQoJnByb2MtPmJ1ZmZlcnMpOwotCWxpc3RfYWRkKCZidWZmZXItPmVudHJ5LCAmcHJvYy0+YnVmZmVycyk7Ci0JYnVmZmVyLT5mcmVlID0gMTsKLQliaW5kZXJfaW5zZXJ0X2ZyZWVfYnVmZmVyKHByb2MsIGJ1ZmZlcik7Ci0JcHJvYy0+ZnJlZV9hc3luY19zcGFjZSA9IHByb2MtPmJ1ZmZlcl9zaXplIC8gMjsKLQliYXJyaWVyKCk7Ci0JcHJvYy0+ZmlsZXMgPSBnZXRfZmlsZXNfc3RydWN0KGN1cnJlbnQpOwotCXByb2MtPnZtYSA9IHZtYTsKLQotCS8qcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyX21tYXA6ICVkICVseC0lbHggbWFwcyAlcFxuIiwKLQkJIHByb2MtPnBpZCwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsIHByb2MtPmJ1ZmZlcik7Ki8KLQlyZXR1cm4gMDsKLQotZXJyX2FsbG9jX3NtYWxsX2J1Zl9mYWlsZWQ6Ci0Ja2ZyZWUocHJvYy0+cGFnZXMpOwotCXByb2MtPnBhZ2VzID0gTlVMTDsKLWVycl9hbGxvY19wYWdlc19mYWlsZWQ6Ci0JdmZyZWUocHJvYy0+YnVmZmVyKTsKLQlwcm9jLT5idWZmZXIgPSBOVUxMOwotZXJyX2dldF92bV9hcmVhX2ZhaWxlZDoKLWVycl9hbHJlYWR5X21hcHBlZDoKLWVycl9iYWRfYXJnOgotCXByaW50ayhLRVJOX0VSUiAiYmluZGVyX21tYXA6ICVkICVseC0lbHggJXMgZmFpbGVkICVkXG4iLAotCSAgICAgICBwcm9jLT5waWQsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kLCBmYWlsdXJlX3N0cmluZywgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGJpbmRlcl9vcGVuKHN0cnVjdCBpbm9kZSAqbm9kcCwgc3RydWN0IGZpbGUgKmZpbHApCi17Ci0Jc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jOwotCi0JYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19PUEVOX0NMT1NFLCAiYmluZGVyX29wZW46ICVkOiVkXG4iLAotCQkgICAgIGN1cnJlbnQtPmdyb3VwX2xlYWRlci0+cGlkLCBjdXJyZW50LT5waWQpOwotCi0JcHJvYyA9IGt6YWxsb2Moc2l6ZW9mKCpwcm9jKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHByb2MgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JZ2V0X3Rhc2tfc3RydWN0KGN1cnJlbnQpOwotCXByb2MtPnRzayA9IGN1cnJlbnQ7Ci0JSU5JVF9MSVNUX0hFQUQoJnByb2MtPnRvZG8pOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnByb2MtPndhaXQpOwotCXByb2MtPmRlZmF1bHRfcHJpb3JpdHkgPSB0YXNrX25pY2UoY3VycmVudCk7Ci0JbXV0ZXhfbG9jaygmYmluZGVyX2xvY2spOwotCWJpbmRlcl9zdGF0c19jcmVhdGVkKEJJTkRFUl9TVEFUX1BST0MpOwotCWhsaXN0X2FkZF9oZWFkKCZwcm9jLT5wcm9jX25vZGUsICZiaW5kZXJfcHJvY3MpOwotCXByb2MtPnBpZCA9IGN1cnJlbnQtPmdyb3VwX2xlYWRlci0+cGlkOwotCUlOSVRfTElTVF9IRUFEKCZwcm9jLT5kZWxpdmVyZWRfZGVhdGgpOwotCWZpbHAtPnByaXZhdGVfZGF0YSA9IHByb2M7Ci0JbXV0ZXhfdW5sb2NrKCZiaW5kZXJfbG9jayk7Ci0KLQlpZiAoYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Byb2MpIHsKLQkJY2hhciBzdHJidWZbMTFdOwotCQlzbnByaW50ZihzdHJidWYsIHNpemVvZihzdHJidWYpLCAiJXUiLCBwcm9jLT5waWQpOwotCQlyZW1vdmVfcHJvY19lbnRyeShzdHJidWYsIGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9wcm9jKTsKLQkJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeShzdHJidWYsIFNfSVJVR08sCi0JCQkJICAgICAgIGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9wcm9jLAotCQkJCSAgICAgICBiaW5kZXJfcmVhZF9wcm9jX3Byb2MsIHByb2MpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJpbmRlcl9mbHVzaChzdHJ1Y3QgZmlsZSAqZmlscCwgZmxfb3duZXJfdCBpZCkKLXsKLQlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0KLQliaW5kZXJfZGVmZXJfd29yayhwcm9jLCBCSU5ERVJfREVGRVJSRURfRkxVU0gpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJpbmRlcl9kZWZlcnJlZF9mbHVzaChzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MpCi17Ci0Jc3RydWN0IHJiX25vZGUgKm47Ci0JaW50IHdha2VfY291bnQgPSAwOwotCWZvciAobiA9IHJiX2ZpcnN0KCZwcm9jLT50aHJlYWRzKTsgbiAhPSBOVUxMOyBuID0gcmJfbmV4dChuKSkgewotCQlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkID0gcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl90aHJlYWQsIHJiX25vZGUpOwotCQl0aHJlYWQtPmxvb3BlciB8PSBCSU5ERVJfTE9PUEVSX1NUQVRFX05FRURfUkVUVVJOOwotCQlpZiAodGhyZWFkLT5sb29wZXIgJiBCSU5ERVJfTE9PUEVSX1NUQVRFX1dBSVRJTkcpIHsKLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdGhyZWFkLT53YWl0KTsKLQkJCXdha2VfY291bnQrKzsKLQkJfQotCX0KLQl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZwcm9jLT53YWl0KTsKLQotCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfT1BFTl9DTE9TRSwKLQkJICAgICAiYmluZGVyX2ZsdXNoOiAlZCB3b2tlICVkIHRocmVhZHNcbiIsIHByb2MtPnBpZCwKLQkJICAgICB3YWtlX2NvdW50KTsKLX0KLQotc3RhdGljIGludCBiaW5kZXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKm5vZHAsIHN0cnVjdCBmaWxlICpmaWxwKQotewotCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlpZiAoYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Byb2MpIHsKLQkJY2hhciBzdHJidWZbMTFdOwotCQlzbnByaW50ZihzdHJidWYsIHNpemVvZihzdHJidWYpLCAiJXUiLCBwcm9jLT5waWQpOwotCQlyZW1vdmVfcHJvY19lbnRyeShzdHJidWYsIGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9wcm9jKTsKLQl9Ci0KLQliaW5kZXJfZGVmZXJfd29yayhwcm9jLCBCSU5ERVJfREVGRVJSRURfUkVMRUFTRSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYmluZGVyX2RlZmVycmVkX3JlbGVhc2Uoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jKQotewotCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7Ci0Jc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdDsKLQlzdHJ1Y3QgcmJfbm9kZSAqbjsKLQlpbnQgdGhyZWFkcywgbm9kZXMsIGluY29taW5nX3JlZnMsIG91dGdvaW5nX3JlZnMsIGJ1ZmZlcnMsIGFjdGl2ZV90cmFuc2FjdGlvbnMsIHBhZ2VfY291bnQ7Ci0KLQlCVUdfT04ocHJvYy0+dm1hKTsKLQlCVUdfT04ocHJvYy0+ZmlsZXMpOwotCi0JaGxpc3RfZGVsKCZwcm9jLT5wcm9jX25vZGUpOwotCWlmIChiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZSAmJiBiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZS0+cHJvYyA9PSBwcm9jKSB7Ci0JCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfREVBRF9CSU5ERVIsCi0JCQkgICAgICJiaW5kZXJfcmVsZWFzZTogJWQgY29udGV4dF9tZ3Jfbm9kZSBnb25lXG4iLAotCQkJICAgICBwcm9jLT5waWQpOwotCQliaW5kZXJfY29udGV4dF9tZ3Jfbm9kZSA9IE5VTEw7Ci0JfQotCi0JdGhyZWFkcyA9IDA7Ci0JYWN0aXZlX3RyYW5zYWN0aW9ucyA9IDA7Ci0Jd2hpbGUgKChuID0gcmJfZmlyc3QoJnByb2MtPnRocmVhZHMpKSkgewotCQlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkID0gcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl90aHJlYWQsIHJiX25vZGUpOwotCQl0aHJlYWRzKys7Ci0JCWFjdGl2ZV90cmFuc2FjdGlvbnMgKz0gYmluZGVyX2ZyZWVfdGhyZWFkKHByb2MsIHRocmVhZCk7Ci0JfQotCW5vZGVzID0gMDsKLQlpbmNvbWluZ19yZWZzID0gMDsKLQl3aGlsZSAoKG4gPSByYl9maXJzdCgmcHJvYy0+bm9kZXMpKSkgewotCQlzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGUgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX25vZGUsIHJiX25vZGUpOwotCi0JCW5vZGVzKys7Ci0JCXJiX2VyYXNlKCZub2RlLT5yYl9ub2RlLCAmcHJvYy0+bm9kZXMpOwotCQlsaXN0X2RlbF9pbml0KCZub2RlLT53b3JrLmVudHJ5KTsKLQkJaWYgKGhsaXN0X2VtcHR5KCZub2RlLT5yZWZzKSkgewotCQkJa2ZyZWUobm9kZSk7Ci0JCQliaW5kZXJfc3RhdHNfZGVsZXRlZChCSU5ERVJfU1RBVF9OT0RFKTsKLQkJfSBlbHNlIHsKLQkJCXN0cnVjdCBiaW5kZXJfcmVmICpyZWY7Ci0JCQlpbnQgZGVhdGggPSAwOwotCi0JCQlub2RlLT5wcm9jID0gTlVMTDsKLQkJCW5vZGUtPmxvY2FsX3N0cm9uZ19yZWZzID0gMDsKLQkJCW5vZGUtPmxvY2FsX3dlYWtfcmVmcyA9IDA7Ci0JCQlobGlzdF9hZGRfaGVhZCgmbm9kZS0+ZGVhZF9ub2RlLCAmYmluZGVyX2RlYWRfbm9kZXMpOwotCi0JCQlobGlzdF9mb3JfZWFjaF9lbnRyeShyZWYsIHBvcywgJm5vZGUtPnJlZnMsIG5vZGVfZW50cnkpIHsKLQkJCQlpbmNvbWluZ19yZWZzKys7Ci0JCQkJaWYgKHJlZi0+ZGVhdGgpIHsKLQkJCQkJZGVhdGgrKzsKLQkJCQkJaWYgKGxpc3RfZW1wdHkoJnJlZi0+ZGVhdGgtPndvcmsuZW50cnkpKSB7Ci0JCQkJCQlyZWYtPmRlYXRoLT53b3JrLnR5cGUgPSBCSU5ERVJfV09SS19ERUFEX0JJTkRFUjsKLQkJCQkJCWxpc3RfYWRkX3RhaWwoJnJlZi0+ZGVhdGgtPndvcmsuZW50cnksICZyZWYtPnByb2MtPnRvZG8pOwotCQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZyZWYtPnByb2MtPndhaXQpOwotCQkJCQl9IGVsc2UKLQkJCQkJCUJVRygpOwotCQkJCX0KLQkJCX0KLQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfREVBRF9CSU5ERVIsCi0JCQkJICAgICAiYmluZGVyOiBub2RlICVkIG5vdyBkZWFkLCAiCi0JCQkJICAgICAicmVmcyAlZCwgZGVhdGggJWRcbiIsIG5vZGUtPmRlYnVnX2lkLAotCQkJCSAgICAgaW5jb21pbmdfcmVmcywgZGVhdGgpOwotCQl9Ci0JfQotCW91dGdvaW5nX3JlZnMgPSAwOwotCXdoaWxlICgobiA9IHJiX2ZpcnN0KCZwcm9jLT5yZWZzX2J5X2Rlc2MpKSkgewotCQlzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmID0gcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9yZWYsCi0JCQkJCQkgIHJiX25vZGVfZGVzYyk7Ci0JCW91dGdvaW5nX3JlZnMrKzsKLQkJYmluZGVyX2RlbGV0ZV9yZWYocmVmKTsKLQl9Ci0JYmluZGVyX3JlbGVhc2Vfd29yaygmcHJvYy0+dG9kbyk7Ci0JYnVmZmVycyA9IDA7Ci0KLQl3aGlsZSAoKG4gPSByYl9maXJzdCgmcHJvYy0+YWxsb2NhdGVkX2J1ZmZlcnMpKSkgewotCQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyID0gcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9idWZmZXIsCi0JCQkJCQkJcmJfbm9kZSk7Ci0JCXQgPSBidWZmZXItPnRyYW5zYWN0aW9uOwotCQlpZiAodCkgewotCQkJdC0+YnVmZmVyID0gTlVMTDsKLQkJCWJ1ZmZlci0+dHJhbnNhY3Rpb24gPSBOVUxMOwotCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6IHJlbGVhc2UgcHJvYyAlZCwgIgotCQkJICAgICAgICJ0cmFuc2FjdGlvbiAlZCwgbm90IGZyZWVkXG4iLAotCQkJICAgICAgIHByb2MtPnBpZCwgdC0+ZGVidWdfaWQpOwotCQkJLypCVUcoKTsqLwotCQl9Ci0JCWJpbmRlcl9mcmVlX2J1Zihwcm9jLCBidWZmZXIpOwotCQlidWZmZXJzKys7Ci0JfQotCi0JYmluZGVyX3N0YXRzX2RlbGV0ZWQoQklOREVSX1NUQVRfUFJPQyk7Ci0KLQlwYWdlX2NvdW50ID0gMDsKLQlpZiAocHJvYy0+cGFnZXMpIHsKLQkJaW50IGk7Ci0JCWZvciAoaSA9IDA7IGkgPCBwcm9jLT5idWZmZXJfc2l6ZSAvIFBBR0VfU0laRTsgaSsrKSB7Ci0JCQlpZiAocHJvYy0+cGFnZXNbaV0pIHsKLQkJCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQywKLQkJCQkJICAgICAiYmluZGVyX3JlbGVhc2U6ICVkOiAiCi0JCQkJCSAgICAgInBhZ2UgJWQgYXQgJXAgbm90IGZyZWVkXG4iLAotCQkJCQkgICAgIHByb2MtPnBpZCwgaSwKLQkJCQkJICAgICBwcm9jLT5idWZmZXIgKyBpICogUEFHRV9TSVpFKTsKLQkJCQlfX2ZyZWVfcGFnZShwcm9jLT5wYWdlc1tpXSk7Ci0JCQkJcGFnZV9jb3VudCsrOwotCQkJfQotCQl9Ci0JCWtmcmVlKHByb2MtPnBhZ2VzKTsKLQkJdmZyZWUocHJvYy0+YnVmZmVyKTsKLQl9Ci0KLQlwdXRfdGFza19zdHJ1Y3QocHJvYy0+dHNrKTsKLQotCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfT1BFTl9DTE9TRSwKLQkJICAgICAiYmluZGVyX3JlbGVhc2U6ICVkIHRocmVhZHMgJWQsIG5vZGVzICVkIChyZWYgJWQpLCAiCi0JCSAgICAgInJlZnMgJWQsIGFjdGl2ZSB0cmFuc2FjdGlvbnMgJWQsIGJ1ZmZlcnMgJWQsICIKLQkJICAgICAicGFnZXMgJWRcbiIsCi0JCSAgICAgcHJvYy0+cGlkLCB0aHJlYWRzLCBub2RlcywgaW5jb21pbmdfcmVmcywgb3V0Z29pbmdfcmVmcywKLQkJICAgICBhY3RpdmVfdHJhbnNhY3Rpb25zLCBidWZmZXJzLCBwYWdlX2NvdW50KTsKLQotCWtmcmVlKHByb2MpOwotfQotCi1zdGF0aWMgdm9pZCBiaW5kZXJfZGVmZXJyZWRfZnVuYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jOwotCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzOwotCi0JaW50IGRlZmVyOwotCWRvIHsKLQkJbXV0ZXhfbG9jaygmYmluZGVyX2xvY2spOwotCQltdXRleF9sb2NrKCZiaW5kZXJfZGVmZXJyZWRfbG9jayk7Ci0JCWlmICghaGxpc3RfZW1wdHkoJmJpbmRlcl9kZWZlcnJlZF9saXN0KSkgewotCQkJcHJvYyA9IGhsaXN0X2VudHJ5KGJpbmRlcl9kZWZlcnJlZF9saXN0LmZpcnN0LAotCQkJCQlzdHJ1Y3QgYmluZGVyX3Byb2MsIGRlZmVycmVkX3dvcmtfbm9kZSk7Ci0JCQlobGlzdF9kZWxfaW5pdCgmcHJvYy0+ZGVmZXJyZWRfd29ya19ub2RlKTsKLQkJCWRlZmVyID0gcHJvYy0+ZGVmZXJyZWRfd29yazsKLQkJCXByb2MtPmRlZmVycmVkX3dvcmsgPSAwOwotCQl9IGVsc2UgewotCQkJcHJvYyA9IE5VTEw7Ci0JCQlkZWZlciA9IDA7Ci0JCX0KLQkJbXV0ZXhfdW5sb2NrKCZiaW5kZXJfZGVmZXJyZWRfbG9jayk7Ci0KLQkJZmlsZXMgPSBOVUxMOwotCQlpZiAoZGVmZXIgJiBCSU5ERVJfREVGRVJSRURfUFVUX0ZJTEVTKSB7Ci0JCQlmaWxlcyA9IHByb2MtPmZpbGVzOwotCQkJaWYgKGZpbGVzKQotCQkJCXByb2MtPmZpbGVzID0gTlVMTDsKLQkJfQotCi0JCWlmIChkZWZlciAmIEJJTkRFUl9ERUZFUlJFRF9GTFVTSCkKLQkJCWJpbmRlcl9kZWZlcnJlZF9mbHVzaChwcm9jKTsKLQotCQlpZiAoZGVmZXIgJiBCSU5ERVJfREVGRVJSRURfUkVMRUFTRSkKLQkJCWJpbmRlcl9kZWZlcnJlZF9yZWxlYXNlKHByb2MpOyAvKiBmcmVlcyBwcm9jICovCi0KLQkJbXV0ZXhfdW5sb2NrKCZiaW5kZXJfbG9jayk7Ci0JCWlmIChmaWxlcykKLQkJCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOwotCX0gd2hpbGUgKHByb2MpOwotfQotc3RhdGljIERFQ0xBUkVfV09SSyhiaW5kZXJfZGVmZXJyZWRfd29yaywgYmluZGVyX2RlZmVycmVkX2Z1bmMpOwotCi1zdGF0aWMgdm9pZAotYmluZGVyX2RlZmVyX3dvcmsoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCBlbnVtIGJpbmRlcl9kZWZlcnJlZF9zdGF0ZSBkZWZlcikKLXsKLQltdXRleF9sb2NrKCZiaW5kZXJfZGVmZXJyZWRfbG9jayk7Ci0JcHJvYy0+ZGVmZXJyZWRfd29yayB8PSBkZWZlcjsKLQlpZiAoaGxpc3RfdW5oYXNoZWQoJnByb2MtPmRlZmVycmVkX3dvcmtfbm9kZSkpIHsKLQkJaGxpc3RfYWRkX2hlYWQoJnByb2MtPmRlZmVycmVkX3dvcmtfbm9kZSwKLQkJCQkmYmluZGVyX2RlZmVycmVkX2xpc3QpOwotCQlzY2hlZHVsZV93b3JrKCZiaW5kZXJfZGVmZXJyZWRfd29yayk7Ci0JfQotCW11dGV4X3VubG9jaygmYmluZGVyX2RlZmVycmVkX2xvY2spOwotfQotCi1zdGF0aWMgY2hhciAqcHJpbnRfYmluZGVyX3RyYW5zYWN0aW9uKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBjb25zdCBjaGFyICpwcmVmaXgsCi0JCQkJICAgICAgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdCkKLXsKLQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsCi0JCQkiJXMgJWQ6ICVwIGZyb20gJWQ6JWQgdG8gJWQ6JWQgY29kZSAleCAiCi0JCQkiZmxhZ3MgJXggcHJpICVsZCByJWQiLAotCQkJcHJlZml4LCB0LT5kZWJ1Z19pZCwgdCwKLQkJCXQtPmZyb20gPyB0LT5mcm9tLT5wcm9jLT5waWQgOiAwLAotCQkJdC0+ZnJvbSA/IHQtPmZyb20tPnBpZCA6IDAsCi0JCQl0LT50b19wcm9jID8gdC0+dG9fcHJvYy0+cGlkIDogMCwKLQkJCXQtPnRvX3RocmVhZCA/IHQtPnRvX3RocmVhZC0+cGlkIDogMCwKLQkJCXQtPmNvZGUsIHQtPmZsYWdzLCB0LT5wcmlvcml0eSwgdC0+bmVlZF9yZXBseSk7Ci0JaWYgKGJ1ZiA+PSBlbmQpCi0JCXJldHVybiBidWY7Ci0JaWYgKHQtPmJ1ZmZlciA9PSBOVUxMKSB7Ci0JCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiBidWZmZXIgZnJlZVxuIik7Ci0JCXJldHVybiBidWY7Ci0JfQotCWlmICh0LT5idWZmZXItPnRhcmdldF9ub2RlKSB7Ci0JCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiBub2RlICVkIiwKLQkJCQl0LT5idWZmZXItPnRhcmdldF9ub2RlLT5kZWJ1Z19pZCk7Ci0JCWlmIChidWYgPj0gZW5kKQotCQkJcmV0dXJuIGJ1ZjsKLQl9Ci0JYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiIHNpemUgJXpkOiV6ZCBkYXRhICVwXG4iLAotCQkJdC0+YnVmZmVyLT5kYXRhX3NpemUsIHQtPmJ1ZmZlci0+b2Zmc2V0c19zaXplLAotCQkJdC0+YnVmZmVyLT5kYXRhKTsKLQlyZXR1cm4gYnVmOwotfQotCi1zdGF0aWMgY2hhciAqcHJpbnRfYmluZGVyX2J1ZmZlcihjaGFyICpidWYsIGNoYXIgKmVuZCwgY29uc3QgY2hhciAqcHJlZml4LAotCQkJCSBzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyKQotewotCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiVzICVkOiAlcCBzaXplICV6ZDolemQgJXNcbiIsCi0JCQlwcmVmaXgsIGJ1ZmZlci0+ZGVidWdfaWQsIGJ1ZmZlci0+ZGF0YSwKLQkJCWJ1ZmZlci0+ZGF0YV9zaXplLCBidWZmZXItPm9mZnNldHNfc2l6ZSwKLQkJCWJ1ZmZlci0+dHJhbnNhY3Rpb24gPyAiYWN0aXZlIiA6ICJkZWxpdmVyZWQiKTsKLQlyZXR1cm4gYnVmOwotfQotCi1zdGF0aWMgY2hhciAqcHJpbnRfYmluZGVyX3dvcmsoY2hhciAqYnVmLCBjaGFyICplbmQsIGNvbnN0IGNoYXIgKnByZWZpeCwKLQkJCSAgICAgICBjb25zdCBjaGFyICp0cmFuc2FjdGlvbl9wcmVmaXgsCi0JCQkgICAgICAgc3RydWN0IGJpbmRlcl93b3JrICp3KQotewotCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZTsKLQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0OwotCi0Jc3dpdGNoICh3LT50eXBlKSB7Ci0JY2FzZSBCSU5ERVJfV09SS19UUkFOU0FDVElPTjoKLQkJdCA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uLCB3b3JrKTsKLQkJYnVmID0gcHJpbnRfYmluZGVyX3RyYW5zYWN0aW9uKGJ1ZiwgZW5kLCB0cmFuc2FjdGlvbl9wcmVmaXgsIHQpOwotCQlicmVhazsKLQljYXNlIEJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OX0NPTVBMRVRFOgotCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsCi0JCQkJIiVzdHJhbnNhY3Rpb24gY29tcGxldGVcbiIsIHByZWZpeCk7Ci0JCWJyZWFrOwotCWNhc2UgQklOREVSX1dPUktfTk9ERToKLQkJbm9kZSA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgYmluZGVyX25vZGUsIHdvcmspOwotCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIlc25vZGUgd29yayAlZDogdSVwIGMlcFxuIiwKLQkJCQlwcmVmaXgsIG5vZGUtPmRlYnVnX2lkLCBub2RlLT5wdHIsCi0JCQkJbm9kZS0+Y29va2llKTsKLQkJYnJlYWs7Ci0JY2FzZSBCSU5ERVJfV09SS19ERUFEX0JJTkRFUjoKLQkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiJXNoYXMgZGVhZCBiaW5kZXJcbiIsIHByZWZpeCk7Ci0JCWJyZWFrOwotCWNhc2UgQklOREVSX1dPUktfREVBRF9CSU5ERVJfQU5EX0NMRUFSOgotCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsCi0JCQkJIiVzaGFzIGNsZWFyZWQgZGVhZCBiaW5kZXJcbiIsIHByZWZpeCk7Ci0JCWJyZWFrOwotCWNhc2UgQklOREVSX1dPUktfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OOgotCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsCi0JCQkJIiVzaGFzIGNsZWFyZWQgZGVhdGggbm90aWZpY2F0aW9uXG4iLCBwcmVmaXgpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIlc3Vua25vd24gd29yazogdHlwZSAlZFxuIiwKLQkJCQlwcmVmaXgsIHctPnR5cGUpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl90aHJlYWQoY2hhciAqYnVmLCBjaGFyICplbmQsCi0JCQkJIHN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQsCi0JCQkJIGludCBwcmludF9hbHdheXMpCi17Ci0Jc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdDsKLQlzdHJ1Y3QgYmluZGVyX3dvcmsgKnc7Ci0JY2hhciAqc3RhcnRfYnVmID0gYnVmOwotCWNoYXIgKmhlYWRlcl9idWY7Ci0KLQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgIHRocmVhZCAlZDogbCAlMDJ4XG4iLAotCQkJdGhyZWFkLT5waWQsIHRocmVhZC0+bG9vcGVyKTsKLQloZWFkZXJfYnVmID0gYnVmOwotCXQgPSB0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrOwotCXdoaWxlICh0KSB7Ci0JCWlmIChidWYgPj0gZW5kKQotCQkJYnJlYWs7Ci0JCWlmICh0LT5mcm9tID09IHRocmVhZCkgewotCQkJYnVmID0gcHJpbnRfYmluZGVyX3RyYW5zYWN0aW9uKGJ1ZiwgZW5kLAotCQkJCQkJIiAgICBvdXRnb2luZyB0cmFuc2FjdGlvbiIsIHQpOwotCQkJdCA9IHQtPmZyb21fcGFyZW50OwotCQl9IGVsc2UgaWYgKHQtPnRvX3RocmVhZCA9PSB0aHJlYWQpIHsKLQkJCWJ1ZiA9IHByaW50X2JpbmRlcl90cmFuc2FjdGlvbihidWYsIGVuZCwKLQkJCQkJCSIgICAgaW5jb21pbmcgdHJhbnNhY3Rpb24iLCB0KTsKLQkJCXQgPSB0LT50b19wYXJlbnQ7Ci0JCX0gZWxzZSB7Ci0JCQlidWYgPSBwcmludF9iaW5kZXJfdHJhbnNhY3Rpb24oYnVmLCBlbmQsCi0JCQkJCQkiICAgIGJhZCB0cmFuc2FjdGlvbiIsIHQpOwotCQkJdCA9IE5VTEw7Ci0JCX0KLQl9Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmdGhyZWFkLT50b2RvLCBlbnRyeSkgewotCQlpZiAoYnVmID49IGVuZCkKLQkJCWJyZWFrOwotCQlidWYgPSBwcmludF9iaW5kZXJfd29yayhidWYsIGVuZCwgIiAgICAiLAotCQkJCQkiICAgIHBlbmRpbmcgdHJhbnNhY3Rpb24iLCB3KTsKLQl9Ci0JaWYgKCFwcmludF9hbHdheXMgJiYgYnVmID09IGhlYWRlcl9idWYpCi0JCWJ1ZiA9IHN0YXJ0X2J1ZjsKLQlyZXR1cm4gYnVmOwotfQotCi1zdGF0aWMgY2hhciAqcHJpbnRfYmluZGVyX25vZGUoY2hhciAqYnVmLCBjaGFyICplbmQsIHN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZSkKLXsKLQlzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmOwotCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7Ci0Jc3RydWN0IGJpbmRlcl93b3JrICp3OwotCWludCBjb3VudDsKLQotCWNvdW50ID0gMDsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeShyZWYsIHBvcywgJm5vZGUtPnJlZnMsIG5vZGVfZW50cnkpCi0JCWNvdW50Kys7Ci0KLQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsCi0JCQkiICBub2RlICVkOiB1JXAgYyVwIGhzICVkIGh3ICVkIGxzICVkIGx3ICVkICIKLQkJCSJpcyAlZCBpdyAlZCIsCi0JCQlub2RlLT5kZWJ1Z19pZCwgbm9kZS0+cHRyLCBub2RlLT5jb29raWUsCi0JCQlub2RlLT5oYXNfc3Ryb25nX3JlZiwgbm9kZS0+aGFzX3dlYWtfcmVmLAotCQkJbm9kZS0+bG9jYWxfc3Ryb25nX3JlZnMsIG5vZGUtPmxvY2FsX3dlYWtfcmVmcywKLQkJCW5vZGUtPmludGVybmFsX3N0cm9uZ19yZWZzLCBjb3VudCk7Ci0JaWYgKGJ1ZiA+PSBlbmQpCi0JCXJldHVybiBidWY7Ci0JaWYgKGNvdW50KSB7Ci0JCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiBwcm9jIik7Ci0JCWlmIChidWYgPj0gZW5kKQotCQkJcmV0dXJuIGJ1ZjsKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnkocmVmLCBwb3MsICZub2RlLT5yZWZzLCBub2RlX2VudHJ5KSB7Ci0JCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgJWQiLCByZWYtPnByb2MtPnBpZCk7Ci0JCQlpZiAoYnVmID49IGVuZCkKLQkJCQlyZXR1cm4gYnVmOwotCQl9Ci0JfQotCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIlxuIik7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmbm9kZS0+YXN5bmNfdG9kbywgZW50cnkpIHsKLQkJaWYgKGJ1ZiA+PSBlbmQpCi0JCQlicmVhazsKLQkJYnVmID0gcHJpbnRfYmluZGVyX3dvcmsoYnVmLCBlbmQsICIgICAgIiwKLQkJCQkJIiAgICBwZW5kaW5nIGFzeW5jIHRyYW5zYWN0aW9uIiwgdyk7Ci0JfQotCXJldHVybiBidWY7Ci19Ci0KLXN0YXRpYyBjaGFyICpwcmludF9iaW5kZXJfcmVmKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmKQotewotCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwKLQkJCSIgIHJlZiAlZDogZGVzYyAlZCAlc25vZGUgJWQgcyAlZCB3ICVkIGQgJXBcbiIsCi0JCQlyZWYtPmRlYnVnX2lkLCByZWYtPmRlc2MsCi0JCQlyZWYtPm5vZGUtPnByb2MgPyAiIiA6ICJkZWFkICIsIHJlZi0+bm9kZS0+ZGVidWdfaWQsCi0JCQlyZWYtPnN0cm9uZywgcmVmLT53ZWFrLCByZWYtPmRlYXRoKTsKLQlyZXR1cm4gYnVmOwotfQotCi1zdGF0aWMgY2hhciAqcHJpbnRfYmluZGVyX3Byb2MoY2hhciAqYnVmLCBjaGFyICplbmQsCi0JCQkgICAgICAgc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCBpbnQgcHJpbnRfYWxsKQotewotCXN0cnVjdCBiaW5kZXJfd29yayAqdzsKLQlzdHJ1Y3QgcmJfbm9kZSAqbjsKLQljaGFyICpzdGFydF9idWYgPSBidWY7Ci0JY2hhciAqaGVhZGVyX2J1ZjsKLQotCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgInByb2MgJWRcbiIsIHByb2MtPnBpZCk7Ci0JaGVhZGVyX2J1ZiA9IGJ1ZjsKLQotCWZvciAobiA9IHJiX2ZpcnN0KCZwcm9jLT50aHJlYWRzKTsKLQkgICAgIG4gIT0gTlVMTCAmJiBidWYgPCBlbmQ7Ci0JICAgICBuID0gcmJfbmV4dChuKSkKLQkJYnVmID0gcHJpbnRfYmluZGVyX3RocmVhZChidWYsIGVuZCwKLQkJCQkJICByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX3RocmVhZCwKLQkJCQkJCSAgIHJiX25vZGUpLCBwcmludF9hbGwpOwotCWZvciAobiA9IHJiX2ZpcnN0KCZwcm9jLT5ub2Rlcyk7Ci0JICAgICBuICE9IE5VTEwgJiYgYnVmIDwgZW5kOwotCSAgICAgbiA9IHJiX25leHQobikpIHsKLQkJc3RydWN0IGJpbmRlcl9ub2RlICpub2RlID0gcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9ub2RlLAotCQkJCQkJICAgIHJiX25vZGUpOwotCQlpZiAocHJpbnRfYWxsIHx8IG5vZGUtPmhhc19hc3luY190cmFuc2FjdGlvbikKLQkJCWJ1ZiA9IHByaW50X2JpbmRlcl9ub2RlKGJ1ZiwgZW5kLCBub2RlKTsKLQl9Ci0JaWYgKHByaW50X2FsbCkgewotCQlmb3IgKG4gPSByYl9maXJzdCgmcHJvYy0+cmVmc19ieV9kZXNjKTsKLQkJICAgICBuICE9IE5VTEwgJiYgYnVmIDwgZW5kOwotCQkgICAgIG4gPSByYl9uZXh0KG4pKQotCQkJYnVmID0gcHJpbnRfYmluZGVyX3JlZihidWYsIGVuZCwKLQkJCQkJICAgICAgIHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfcmVmLAotCQkJCQkJCXJiX25vZGVfZGVzYykpOwotCX0KLQlmb3IgKG4gPSByYl9maXJzdCgmcHJvYy0+YWxsb2NhdGVkX2J1ZmZlcnMpOwotCSAgICAgbiAhPSBOVUxMICYmIGJ1ZiA8IGVuZDsKLQkgICAgIG4gPSByYl9uZXh0KG4pKQotCQlidWYgPSBwcmludF9iaW5kZXJfYnVmZmVyKGJ1ZiwgZW5kLCAiICBidWZmZXIiLAotCQkJCQkgIHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfYnVmZmVyLAotCQkJCQkJICAgcmJfbm9kZSkpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJnByb2MtPnRvZG8sIGVudHJ5KSB7Ci0JCWlmIChidWYgPj0gZW5kKQotCQkJYnJlYWs7Ci0JCWJ1ZiA9IHByaW50X2JpbmRlcl93b3JrKGJ1ZiwgZW5kLCAiICAiLAotCQkJCQkiICBwZW5kaW5nIHRyYW5zYWN0aW9uIiwgdyk7Ci0JfQotCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJnByb2MtPmRlbGl2ZXJlZF9kZWF0aCwgZW50cnkpIHsKLQkJaWYgKGJ1ZiA+PSBlbmQpCi0JCQlicmVhazsKLQkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLAotCQkJCSIgIGhhcyBkZWxpdmVyZWQgZGVhZCBiaW5kZXJcbiIpOwotCQlicmVhazsKLQl9Ci0JaWYgKCFwcmludF9hbGwgJiYgYnVmID09IGhlYWRlcl9idWYpCi0JCWJ1ZiA9IHN0YXJ0X2J1ZjsKLQlyZXR1cm4gYnVmOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqYmluZGVyX3JldHVybl9zdHJpbmdzW10gPSB7Ci0JIkJSX0VSUk9SIiwKLQkiQlJfT0siLAotCSJCUl9UUkFOU0FDVElPTiIsCi0JIkJSX1JFUExZIiwKLQkiQlJfQUNRVUlSRV9SRVNVTFQiLAotCSJCUl9ERUFEX1JFUExZIiwKLQkiQlJfVFJBTlNBQ1RJT05fQ09NUExFVEUiLAotCSJCUl9JTkNSRUZTIiwKLQkiQlJfQUNRVUlSRSIsCi0JIkJSX1JFTEVBU0UiLAotCSJCUl9ERUNSRUZTIiwKLQkiQlJfQVRURU1QVF9BQ1FVSVJFIiwKLQkiQlJfTk9PUCIsCi0JIkJSX1NQQVdOX0xPT1BFUiIsCi0JIkJSX0ZJTklTSEVEIiwKLQkiQlJfREVBRF9CSU5ERVIiLAotCSJCUl9DTEVBUl9ERUFUSF9OT1RJRklDQVRJT05fRE9ORSIsCi0JIkJSX0ZBSUxFRF9SRVBMWSIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpiaW5kZXJfY29tbWFuZF9zdHJpbmdzW10gPSB7Ci0JIkJDX1RSQU5TQUNUSU9OIiwKLQkiQkNfUkVQTFkiLAotCSJCQ19BQ1FVSVJFX1JFU1VMVCIsCi0JIkJDX0ZSRUVfQlVGRkVSIiwKLQkiQkNfSU5DUkVGUyIsCi0JIkJDX0FDUVVJUkUiLAotCSJCQ19SRUxFQVNFIiwKLQkiQkNfREVDUkVGUyIsCi0JIkJDX0lOQ1JFRlNfRE9ORSIsCi0JIkJDX0FDUVVJUkVfRE9ORSIsCi0JIkJDX0FUVEVNUFRfQUNRVUlSRSIsCi0JIkJDX1JFR0lTVEVSX0xPT1BFUiIsCi0JIkJDX0VOVEVSX0xPT1BFUiIsCi0JIkJDX0VYSVRfTE9PUEVSIiwKLQkiQkNfUkVRVUVTVF9ERUFUSF9OT1RJRklDQVRJT04iLAotCSJCQ19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT04iLAotCSJCQ19ERUFEX0JJTkRFUl9ET05FIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmJpbmRlcl9vYmpzdGF0X3N0cmluZ3NbXSA9IHsKLQkicHJvYyIsCi0JInRocmVhZCIsCi0JIm5vZGUiLAotCSJyZWYiLAotCSJkZWF0aCIsCi0JInRyYW5zYWN0aW9uIiwKLQkidHJhbnNhY3Rpb25fY29tcGxldGUiCi19OwotCi1zdGF0aWMgY2hhciAqcHJpbnRfYmluZGVyX3N0YXRzKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBjb25zdCBjaGFyICpwcmVmaXgsCi0JCQkJc3RydWN0IGJpbmRlcl9zdGF0cyAqc3RhdHMpCi17Ci0JaW50IGk7Ci0KLQlCVUlMRF9CVUdfT04oQVJSQVlfU0laRShzdGF0cy0+YmMpICE9Ci0JCQlBUlJBWV9TSVpFKGJpbmRlcl9jb21tYW5kX3N0cmluZ3MpKTsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdGF0cy0+YmMpOyBpKyspIHsKLQkJaWYgKHN0YXRzLT5iY1tpXSkKLQkJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiVzJXM6ICVkXG4iLCBwcmVmaXgsCi0JCQkJCWJpbmRlcl9jb21tYW5kX3N0cmluZ3NbaV0sCi0JCQkJCXN0YXRzLT5iY1tpXSk7Ci0JCWlmIChidWYgPj0gZW5kKQotCQkJcmV0dXJuIGJ1ZjsKLQl9Ci0KLQlCVUlMRF9CVUdfT04oQVJSQVlfU0laRShzdGF0cy0+YnIpICE9Ci0JCQlBUlJBWV9TSVpFKGJpbmRlcl9yZXR1cm5fc3RyaW5ncykpOwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN0YXRzLT5icik7IGkrKykgewotCQlpZiAoc3RhdHMtPmJyW2ldKQotCQkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiJXMlczogJWRcbiIsIHByZWZpeCwKLQkJCQkJYmluZGVyX3JldHVybl9zdHJpbmdzW2ldLCBzdGF0cy0+YnJbaV0pOwotCQlpZiAoYnVmID49IGVuZCkKLQkJCXJldHVybiBidWY7Ci0JfQotCi0JQlVJTERfQlVHX09OKEFSUkFZX1NJWkUoc3RhdHMtPm9ial9jcmVhdGVkKSAhPQotCQkJQVJSQVlfU0laRShiaW5kZXJfb2Jqc3RhdF9zdHJpbmdzKSk7Ci0JQlVJTERfQlVHX09OKEFSUkFZX1NJWkUoc3RhdHMtPm9ial9jcmVhdGVkKSAhPQotCQkJQVJSQVlfU0laRShzdGF0cy0+b2JqX2RlbGV0ZWQpKTsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdGF0cy0+b2JqX2NyZWF0ZWQpOyBpKyspIHsKLQkJaWYgKHN0YXRzLT5vYmpfY3JlYXRlZFtpXSB8fCBzdGF0cy0+b2JqX2RlbGV0ZWRbaV0pCi0JCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsCi0JCQkJCSIlcyVzOiBhY3RpdmUgJWQgdG90YWwgJWRcbiIsIHByZWZpeCwKLQkJCQkJYmluZGVyX29ianN0YXRfc3RyaW5nc1tpXSwKLQkJCQkJc3RhdHMtPm9ial9jcmVhdGVkW2ldIC0KLQkJCQkJCXN0YXRzLT5vYmpfZGVsZXRlZFtpXSwKLQkJCQkJc3RhdHMtPm9ial9jcmVhdGVkW2ldKTsKLQkJaWYgKGJ1ZiA+PSBlbmQpCi0JCQlyZXR1cm4gYnVmOwotCX0KLQlyZXR1cm4gYnVmOwotfQotCi1zdGF0aWMgY2hhciAqcHJpbnRfYmluZGVyX3Byb2Nfc3RhdHMoY2hhciAqYnVmLCBjaGFyICplbmQsCi0JCQkJICAgICBzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MpCi17Ci0Jc3RydWN0IGJpbmRlcl93b3JrICp3OwotCXN0cnVjdCByYl9ub2RlICpuOwotCWludCBjb3VudCwgc3Ryb25nLCB3ZWFrOwotCi0JYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAicHJvYyAlZFxuIiwgcHJvYy0+cGlkKTsKLQlpZiAoYnVmID49IGVuZCkKLQkJcmV0dXJuIGJ1ZjsKLQljb3VudCA9IDA7Ci0JZm9yIChuID0gcmJfZmlyc3QoJnByb2MtPnRocmVhZHMpOyBuICE9IE5VTEw7IG4gPSByYl9uZXh0KG4pKQotCQljb3VudCsrOwotCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiAgdGhyZWFkczogJWRcbiIsIGNvdW50KTsKLQlpZiAoYnVmID49IGVuZCkKLQkJcmV0dXJuIGJ1ZjsKLQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgIHJlcXVlc3RlZCB0aHJlYWRzOiAlZCslZC8lZFxuIgotCQkJIiAgcmVhZHkgdGhyZWFkcyAlZFxuIgotCQkJIiAgZnJlZSBhc3luYyBzcGFjZSAlemRcbiIsIHByb2MtPnJlcXVlc3RlZF90aHJlYWRzLAotCQkJcHJvYy0+cmVxdWVzdGVkX3RocmVhZHNfc3RhcnRlZCwgcHJvYy0+bWF4X3RocmVhZHMsCi0JCQlwcm9jLT5yZWFkeV90aHJlYWRzLCBwcm9jLT5mcmVlX2FzeW5jX3NwYWNlKTsKLQlpZiAoYnVmID49IGVuZCkKLQkJcmV0dXJuIGJ1ZjsKLQljb3VudCA9IDA7Ci0JZm9yIChuID0gcmJfZmlyc3QoJnByb2MtPm5vZGVzKTsgbiAhPSBOVUxMOyBuID0gcmJfbmV4dChuKSkKLQkJY291bnQrKzsKLQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgIG5vZGVzOiAlZFxuIiwgY291bnQpOwotCWlmIChidWYgPj0gZW5kKQotCQlyZXR1cm4gYnVmOwotCWNvdW50ID0gMDsKLQlzdHJvbmcgPSAwOwotCXdlYWsgPSAwOwotCWZvciAobiA9IHJiX2ZpcnN0KCZwcm9jLT5yZWZzX2J5X2Rlc2MpOyBuICE9IE5VTEw7IG4gPSByYl9uZXh0KG4pKSB7Ci0JCXN0cnVjdCBiaW5kZXJfcmVmICpyZWYgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX3JlZiwKLQkJCQkJCSAgcmJfbm9kZV9kZXNjKTsKLQkJY291bnQrKzsKLQkJc3Ryb25nICs9IHJlZi0+c3Ryb25nOwotCQl3ZWFrICs9IHJlZi0+d2VhazsKLQl9Ci0JYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiICByZWZzOiAlZCBzICVkIHcgJWRcbiIsCi0JCQljb3VudCwgc3Ryb25nLCB3ZWFrKTsKLQlpZiAoYnVmID49IGVuZCkKLQkJcmV0dXJuIGJ1ZjsKLQotCWNvdW50ID0gMDsKLQlmb3IgKG4gPSByYl9maXJzdCgmcHJvYy0+YWxsb2NhdGVkX2J1ZmZlcnMpOyBuICE9IE5VTEw7IG4gPSByYl9uZXh0KG4pKQotCQljb3VudCsrOwotCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiAgYnVmZmVyczogJWRcbiIsIGNvdW50KTsKLQlpZiAoYnVmID49IGVuZCkKLQkJcmV0dXJuIGJ1ZjsKLQotCWNvdW50ID0gMDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZwcm9jLT50b2RvLCBlbnRyeSkgewotCQlzd2l0Y2ggKHctPnR5cGUpIHsKLQkJY2FzZSBCSU5ERVJfV09SS19UUkFOU0FDVElPTjoKLQkJCWNvdW50Kys7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiAgcGVuZGluZyB0cmFuc2FjdGlvbnM6ICVkXG4iLCBjb3VudCk7Ci0JaWYgKGJ1ZiA+PSBlbmQpCi0JCXJldHVybiBidWY7Ci0KLQlidWYgPSBwcmludF9iaW5kZXJfc3RhdHMoYnVmLCBlbmQsICIgICIsICZwcm9jLT5zdGF0cyk7Ci0KLQlyZXR1cm4gYnVmOwotfQotCi0KLXN0YXRpYyBpbnQgYmluZGVyX3JlYWRfcHJvY19zdGF0ZShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKLQkJCQkgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jOwotCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7Ci0Jc3RydWN0IGJpbmRlcl9ub2RlICpub2RlOwotCWludCBsZW4gPSAwOwotCWNoYXIgKmJ1ZiA9IHBhZ2U7Ci0JY2hhciAqZW5kID0gcGFnZSArIFBBR0VfU0laRTsKLQlpbnQgZG9fbG9jayA9ICFiaW5kZXJfZGVidWdfbm9fbG9jazsKLQotCWlmIChvZmYpCi0JCXJldHVybiAwOwotCi0JaWYgKGRvX2xvY2spCi0JCW11dGV4X2xvY2soJmJpbmRlcl9sb2NrKTsKLQotCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgImJpbmRlciBzdGF0ZTpcbiIpOwotCi0JaWYgKCFobGlzdF9lbXB0eSgmYmluZGVyX2RlYWRfbm9kZXMpKQotCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICJkZWFkIG5vZGVzOlxuIik7Ci0JaGxpc3RfZm9yX2VhY2hfZW50cnkobm9kZSwgcG9zLCAmYmluZGVyX2RlYWRfbm9kZXMsIGRlYWRfbm9kZSkgewotCQlpZiAoYnVmID49IGVuZCkKLQkJCWJyZWFrOwotCQlidWYgPSBwcmludF9iaW5kZXJfbm9kZShidWYsIGVuZCwgbm9kZSk7Ci0JfQotCi0JaGxpc3RfZm9yX2VhY2hfZW50cnkocHJvYywgcG9zLCAmYmluZGVyX3Byb2NzLCBwcm9jX25vZGUpIHsKLQkJaWYgKGJ1ZiA+PSBlbmQpCi0JCQlicmVhazsKLQkJYnVmID0gcHJpbnRfYmluZGVyX3Byb2MoYnVmLCBlbmQsIHByb2MsIDEpOwotCX0KLQlpZiAoZG9fbG9jaykKLQkJbXV0ZXhfdW5sb2NrKCZiaW5kZXJfbG9jayk7Ci0JaWYgKGJ1ZiA+IHBhZ2UgKyBQQUdFX1NJWkUpCi0JCWJ1ZiA9IHBhZ2UgKyBQQUdFX1NJWkU7Ci0KLQkqc3RhcnQgPSBwYWdlICsgb2ZmOwotCi0JbGVuID0gYnVmIC0gcGFnZTsKLQlpZiAobGVuID4gb2ZmKQotCQlsZW4gLT0gb2ZmOwotCWVsc2UKLQkJbGVuID0gMDsKLQotCXJldHVybiBsZW4gPCBjb3VudCA/IGxlbiAgOiBjb3VudDsKLX0KLQotc3RhdGljIGludCBiaW5kZXJfcmVhZF9wcm9jX3N0YXRzKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAotCQkJCSAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2M7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKnBvczsKLQlpbnQgbGVuID0gMDsKLQljaGFyICpwID0gcGFnZTsKLQlpbnQgZG9fbG9jayA9ICFiaW5kZXJfZGVidWdfbm9fbG9jazsKLQotCWlmIChvZmYpCi0JCXJldHVybiAwOwotCi0JaWYgKGRvX2xvY2spCi0JCW11dGV4X2xvY2soJmJpbmRlcl9sb2NrKTsKLQotCXAgKz0gc25wcmludGYocCwgUEFHRV9TSVpFLCAiYmluZGVyIHN0YXRzOlxuIik7Ci0KLQlwID0gcHJpbnRfYmluZGVyX3N0YXRzKHAsIHBhZ2UgKyBQQUdFX1NJWkUsICIiLCAmYmluZGVyX3N0YXRzKTsKLQotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHByb2MsIHBvcywgJmJpbmRlcl9wcm9jcywgcHJvY19ub2RlKSB7Ci0JCWlmIChwID49IHBhZ2UgKyBQQUdFX1NJWkUpCi0JCQlicmVhazsKLQkJcCA9IHByaW50X2JpbmRlcl9wcm9jX3N0YXRzKHAsIHBhZ2UgKyBQQUdFX1NJWkUsIHByb2MpOwotCX0KLQlpZiAoZG9fbG9jaykKLQkJbXV0ZXhfdW5sb2NrKCZiaW5kZXJfbG9jayk7Ci0JaWYgKHAgPiBwYWdlICsgUEFHRV9TSVpFKQotCQlwID0gcGFnZSArIFBBR0VfU0laRTsKLQotCSpzdGFydCA9IHBhZ2UgKyBvZmY7Ci0KLQlsZW4gPSBwIC0gcGFnZTsKLQlpZiAobGVuID4gb2ZmKQotCQlsZW4gLT0gb2ZmOwotCWVsc2UKLQkJbGVuID0gMDsKLQotCXJldHVybiBsZW4gPCBjb3VudCA/IGxlbiAgOiBjb3VudDsKLX0KLQotc3RhdGljIGludCBiaW5kZXJfcmVhZF9wcm9jX3RyYW5zYWN0aW9ucyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKLQkJCQkJIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jOwotCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7Ci0JaW50IGxlbiA9IDA7Ci0JY2hhciAqYnVmID0gcGFnZTsKLQljaGFyICplbmQgPSBwYWdlICsgUEFHRV9TSVpFOwotCWludCBkb19sb2NrID0gIWJpbmRlcl9kZWJ1Z19ub19sb2NrOwotCi0JaWYgKG9mZikKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoZG9fbG9jaykKLQkJbXV0ZXhfbG9jaygmYmluZGVyX2xvY2spOwotCi0JYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiYmluZGVyIHRyYW5zYWN0aW9uczpcbiIpOwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHByb2MsIHBvcywgJmJpbmRlcl9wcm9jcywgcHJvY19ub2RlKSB7Ci0JCWlmIChidWYgPj0gZW5kKQotCQkJYnJlYWs7Ci0JCWJ1ZiA9IHByaW50X2JpbmRlcl9wcm9jKGJ1ZiwgZW5kLCBwcm9jLCAwKTsKLQl9Ci0JaWYgKGRvX2xvY2spCi0JCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOwotCWlmIChidWYgPiBwYWdlICsgUEFHRV9TSVpFKQotCQlidWYgPSBwYWdlICsgUEFHRV9TSVpFOwotCi0JKnN0YXJ0ID0gcGFnZSArIG9mZjsKLQotCWxlbiA9IGJ1ZiAtIHBhZ2U7Ci0JaWYgKGxlbiA+IG9mZikKLQkJbGVuIC09IG9mZjsKLQllbHNlCi0JCWxlbiA9IDA7Ci0KLQlyZXR1cm4gbGVuIDwgY291bnQgPyBsZW4gIDogY291bnQ7Ci19Ci0KLXN0YXRpYyBpbnQgYmluZGVyX3JlYWRfcHJvY19wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAotCQkJCSBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYyA9IGRhdGE7Ci0JaW50IGxlbiA9IDA7Ci0JY2hhciAqcCA9IHBhZ2U7Ci0JaW50IGRvX2xvY2sgPSAhYmluZGVyX2RlYnVnX25vX2xvY2s7Ci0KLQlpZiAob2ZmKQotCQlyZXR1cm4gMDsKLQotCWlmIChkb19sb2NrKQotCQltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7Ci0JcCArPSBzbnByaW50ZihwLCBQQUdFX1NJWkUsICJiaW5kZXIgcHJvYyBzdGF0ZTpcbiIpOwotCXAgPSBwcmludF9iaW5kZXJfcHJvYyhwLCBwYWdlICsgUEFHRV9TSVpFLCBwcm9jLCAxKTsKLQlpZiAoZG9fbG9jaykKLQkJbXV0ZXhfdW5sb2NrKCZiaW5kZXJfbG9jayk7Ci0KLQlpZiAocCA+IHBhZ2UgKyBQQUdFX1NJWkUpCi0JCXAgPSBwYWdlICsgUEFHRV9TSVpFOwotCSpzdGFydCA9IHBhZ2UgKyBvZmY7Ci0KLQlsZW4gPSBwIC0gcGFnZTsKLQlpZiAobGVuID4gb2ZmKQotCQlsZW4gLT0gb2ZmOwotCWVsc2UKLQkJbGVuID0gMDsKLQotCXJldHVybiBsZW4gPCBjb3VudCA/IGxlbiAgOiBjb3VudDsKLX0KLQotc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkoY2hhciAqYnVmLCBjaGFyICplbmQsCi0JCQkJCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2VudHJ5ICplKQotewotCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwKLQkJCSIlZDogJXMgZnJvbSAlZDolZCB0byAlZDolZCBub2RlICVkIGhhbmRsZSAlZCAiCi0JCQkic2l6ZSAlZDolZFxuIiwKLQkJCWUtPmRlYnVnX2lkLCAoZS0+Y2FsbF90eXBlID09IDIpID8gInJlcGx5IiA6Ci0JCQkoKGUtPmNhbGxfdHlwZSA9PSAxKSA/ICJhc3luYyIgOiAiY2FsbCAiKSwgZS0+ZnJvbV9wcm9jLAotCQkJZS0+ZnJvbV90aHJlYWQsIGUtPnRvX3Byb2MsIGUtPnRvX3RocmVhZCwgZS0+dG9fbm9kZSwKLQkJCWUtPnRhcmdldF9oYW5kbGUsIGUtPmRhdGFfc2l6ZSwgZS0+b2Zmc2V0c19zaXplKTsKLQlyZXR1cm4gYnVmOwotfQotCi1zdGF0aWMgaW50IGJpbmRlcl9yZWFkX3Byb2NfdHJhbnNhY3Rpb25fbG9nKAotCWNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nICpsb2cgPSBkYXRhOwotCWludCBsZW4gPSAwOwotCWludCBpOwotCWNoYXIgKmJ1ZiA9IHBhZ2U7Ci0JY2hhciAqZW5kID0gcGFnZSArIFBBR0VfU0laRTsKLQotCWlmIChvZmYpCi0JCXJldHVybiAwOwotCi0JaWYgKGxvZy0+ZnVsbCkgewotCQlmb3IgKGkgPSBsb2ctPm5leHQ7IGkgPCBBUlJBWV9TSVpFKGxvZy0+ZW50cnkpOyBpKyspIHsKLQkJCWlmIChidWYgPj0gZW5kKQotCQkJCWJyZWFrOwotCQkJYnVmID0gcHJpbnRfYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19lbnRyeShidWYsIGVuZCwKLQkJCQkJCQkJJmxvZy0+ZW50cnlbaV0pOwotCQl9Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBsb2ctPm5leHQ7IGkrKykgewotCQlpZiAoYnVmID49IGVuZCkKLQkJCWJyZWFrOwotCQlidWYgPSBwcmludF9iaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2VudHJ5KGJ1ZiwgZW5kLAotCQkJCQkJCSAmbG9nLT5lbnRyeVtpXSk7Ci0JfQotCi0JKnN0YXJ0ID0gcGFnZSArIG9mZjsKLQotCWxlbiA9IGJ1ZiAtIHBhZ2U7Ci0JaWYgKGxlbiA+IG9mZikKLQkJbGVuIC09IG9mZjsKLQllbHNlCi0JCWxlbiA9IDA7Ci0KLQlyZXR1cm4gbGVuIDwgY291bnQgPyBsZW4gIDogY291bnQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJpbmRlcl9mb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5wb2xsID0gYmluZGVyX3BvbGwsCi0JLnVubG9ja2VkX2lvY3RsID0gYmluZGVyX2lvY3RsLAotCS5tbWFwID0gYmluZGVyX21tYXAsCi0JLm9wZW4gPSBiaW5kZXJfb3BlbiwKLQkuZmx1c2ggPSBiaW5kZXJfZmx1c2gsCi0JLnJlbGVhc2UgPSBiaW5kZXJfcmVsZWFzZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBiaW5kZXJfbWlzY2RldiA9IHsKLQkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUgPSAiYmluZGVyIiwKLQkuZm9wcyA9ICZiaW5kZXJfZm9wcwotfTsKLQotc3RhdGljIGludCBfX2luaXQgYmluZGVyX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Jvb3QgPSBwcm9jX21rZGlyKCJiaW5kZXIiLCBOVUxMKTsKLQlpZiAoYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Jvb3QpCi0JCWJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9wcm9jID0gcHJvY19ta2RpcigicHJvYyIsCi0JCQkJCQliaW5kZXJfcHJvY19kaXJfZW50cnlfcm9vdCk7Ci0JcmV0ID0gbWlzY19yZWdpc3RlcigmYmluZGVyX21pc2NkZXYpOwotCWlmIChiaW5kZXJfcHJvY19kaXJfZW50cnlfcm9vdCkgewotCQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJzdGF0ZSIsCi0JCQkJICAgICAgIFNfSVJVR08sCi0JCQkJICAgICAgIGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9yb290LAotCQkJCSAgICAgICBiaW5kZXJfcmVhZF9wcm9jX3N0YXRlLAotCQkJCSAgICAgICBOVUxMKTsKLQkJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgic3RhdHMiLAotCQkJCSAgICAgICBTX0lSVUdPLAotCQkJCSAgICAgICBiaW5kZXJfcHJvY19kaXJfZW50cnlfcm9vdCwKLQkJCQkgICAgICAgYmluZGVyX3JlYWRfcHJvY19zdGF0cywKLQkJCQkgICAgICAgTlVMTCk7Ci0JCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInRyYW5zYWN0aW9ucyIsCi0JCQkJICAgICAgIFNfSVJVR08sCi0JCQkJICAgICAgIGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9yb290LAotCQkJCSAgICAgICBiaW5kZXJfcmVhZF9wcm9jX3RyYW5zYWN0aW9ucywKLQkJCQkgICAgICAgTlVMTCk7Ci0JCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInRyYW5zYWN0aW9uX2xvZyIsCi0JCQkJICAgICAgIFNfSVJVR08sCi0JCQkJICAgICAgIGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9yb290LAotCQkJCSAgICAgICBiaW5kZXJfcmVhZF9wcm9jX3RyYW5zYWN0aW9uX2xvZywKLQkJCQkgICAgICAgJmJpbmRlcl90cmFuc2FjdGlvbl9sb2cpOwotCQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJmYWlsZWRfdHJhbnNhY3Rpb25fbG9nIiwKLQkJCQkgICAgICAgU19JUlVHTywKLQkJCQkgICAgICAgYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Jvb3QsCi0JCQkJICAgICAgIGJpbmRlcl9yZWFkX3Byb2NfdHJhbnNhY3Rpb25fbG9nLAotCQkJCSAgICAgICAmYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19mYWlsZWQpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1kZXZpY2VfaW5pdGNhbGwoYmluZGVyX2luaXQpOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjNhZTFhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKgotICogQmFzZWQgb24sIGJ1dCBubyBsb25nZXIgY29tcGF0aWJsZSB3aXRoLCB0aGUgb3JpZ2luYWwKLSAqIE9wZW5CaW5kZXIub3JnIGJpbmRlciBkcml2ZXIgaW50ZXJmYWNlLCB3aGljaCBpczoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgUGFsbXNvdXJjZSwgSW5jLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpZm5kZWYgX0xJTlVYX0JJTkRFUl9ICi0jZGVmaW5lIF9MSU5VWF9CSU5ERVJfSAotCi0jaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KLQotI2RlZmluZSBCX1BBQ0tfQ0hBUlMoYzEsIGMyLCBjMywgYzQpIFwKLQkoKCgoYzEpPDwyNCkpIHwgKCgoYzIpPDwxNikpIHwgKCgoYzMpPDw4KSkgfCAoYzQpKQotI2RlZmluZSBCX1RZUEVfTEFSR0UgMHg4NQotCi1lbnVtIHsKLQlCSU5ERVJfVFlQRV9CSU5ERVIJPSBCX1BBQ0tfQ0hBUlMoJ3MnLCAnYicsICcqJywgQl9UWVBFX0xBUkdFKSwKLQlCSU5ERVJfVFlQRV9XRUFLX0JJTkRFUgk9IEJfUEFDS19DSEFSUygndycsICdiJywgJyonLCBCX1RZUEVfTEFSR0UpLAotCUJJTkRFUl9UWVBFX0hBTkRMRQk9IEJfUEFDS19DSEFSUygncycsICdoJywgJyonLCBCX1RZUEVfTEFSR0UpLAotCUJJTkRFUl9UWVBFX1dFQUtfSEFORExFCT0gQl9QQUNLX0NIQVJTKCd3JywgJ2gnLCAnKicsIEJfVFlQRV9MQVJHRSksCi0JQklOREVSX1RZUEVfRkQJCT0gQl9QQUNLX0NIQVJTKCdmJywgJ2QnLCAnKicsIEJfVFlQRV9MQVJHRSksCi19OwotCi1lbnVtIHsKLQlGTEFUX0JJTkRFUl9GTEFHX1BSSU9SSVRZX01BU0sgPSAweGZmLAotCUZMQVRfQklOREVSX0ZMQUdfQUNDRVBUU19GRFMgPSAweDEwMCwKLX07Ci0KLS8qCi0gKiBUaGlzIGlzIHRoZSBmbGF0dGVuZWQgcmVwcmVzZW50YXRpb24gb2YgYSBCaW5kZXIgb2JqZWN0IGZvciB0cmFuc2ZlcgotICogYmV0d2VlbiBwcm9jZXNzZXMuICBUaGUgJ29mZnNldHMnIHN1cHBsaWVkIGFzIHBhcnQgb2YgYSBiaW5kZXIgdHJhbnNhY3Rpb24KLSAqIGNvbnRhaW5zIG9mZnNldHMgaW50byB0aGUgZGF0YSB3aGVyZSB0aGVzZSBzdHJ1Y3R1cmVzIG9jY3VyLiAgVGhlIEJpbmRlcgotICogZHJpdmVyIHRha2VzIGNhcmUgb2YgcmUtd3JpdGluZyB0aGUgc3RydWN0dXJlIHR5cGUgYW5kIGRhdGEgYXMgaXQgbW92ZXMKLSAqIGJldHdlZW4gcHJvY2Vzc2VzLgotICovCi1zdHJ1Y3QgZmxhdF9iaW5kZXJfb2JqZWN0IHsKLQkvKiA4IGJ5dGVzIGZvciBsYXJnZV9mbGF0X2hlYWRlci4gKi8KLQl1bnNpZ25lZCBsb25nCQl0eXBlOwotCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwotCi0JLyogOCBieXRlcyBvZiBkYXRhLiAqLwotCXVuaW9uIHsKLQkJdm9pZAkJKmJpbmRlcjsJLyogbG9jYWwgb2JqZWN0ICovCi0JCXNpZ25lZCBsb25nCWhhbmRsZTsJCS8qIHJlbW90ZSBvYmplY3QgKi8KLQl9OwotCi0JLyogZXh0cmEgZGF0YSBhc3NvY2lhdGVkIHdpdGggbG9jYWwgb2JqZWN0ICovCi0Jdm9pZAkJCSpjb29raWU7Ci19OwotCi0vKgotICogT24gNjQtYml0IHBsYXRmb3JtcyB3aGVyZSB1c2VyIGNvZGUgbWF5IHJ1biBpbiAzMi1iaXRzIHRoZSBkcml2ZXIgbXVzdAotICogdHJhbnNsYXRlIHRoZSBidWZmZXIgKGFuZCBsb2NhbCBiaW5kZXIpIGFkZHJlc3NlcyBhcHJvcHJpYXRlbHkuCi0gKi8KLQotc3RydWN0IGJpbmRlcl93cml0ZV9yZWFkIHsKLQlzaWduZWQgbG9uZwl3cml0ZV9zaXplOwkvKiBieXRlcyB0byB3cml0ZSAqLwotCXNpZ25lZCBsb25nCXdyaXRlX2NvbnN1bWVkOwkvKiBieXRlcyBjb25zdW1lZCBieSBkcml2ZXIgKi8KLQl1bnNpZ25lZCBsb25nCXdyaXRlX2J1ZmZlcjsKLQlzaWduZWQgbG9uZwlyZWFkX3NpemU7CS8qIGJ5dGVzIHRvIHJlYWQgKi8KLQlzaWduZWQgbG9uZwlyZWFkX2NvbnN1bWVkOwkvKiBieXRlcyBjb25zdW1lZCBieSBkcml2ZXIgKi8KLQl1bnNpZ25lZCBsb25nCXJlYWRfYnVmZmVyOwotfTsKLQotLyogVXNlIHdpdGggQklOREVSX1ZFUlNJT04sIGRyaXZlciBmaWxscyBpbiBmaWVsZHMuICovCi1zdHJ1Y3QgYmluZGVyX3ZlcnNpb24gewotCS8qIGRyaXZlciBwcm90b2NvbCB2ZXJzaW9uIC0tIGluY3JlbWVudCB3aXRoIGluY29tcGF0aWJsZSBjaGFuZ2UgKi8KLQlzaWduZWQgbG9uZwlwcm90b2NvbF92ZXJzaW9uOwotfTsKLQotLyogVGhpcyBpcyB0aGUgY3VycmVudCBwcm90b2NvbCB2ZXJzaW9uLiAqLwotI2RlZmluZSBCSU5ERVJfQ1VSUkVOVF9QUk9UT0NPTF9WRVJTSU9OIDcKLQotI2RlZmluZSBCSU5ERVJfV1JJVEVfUkVBRCAgIAkJX0lPV1IoJ2InLCAxLCBzdHJ1Y3QgYmluZGVyX3dyaXRlX3JlYWQpCi0jZGVmaW5lCUJJTkRFUl9TRVRfSURMRV9USU1FT1VUCQlfSU9XKCdiJywgMywgaW50NjRfdCkKLSNkZWZpbmUJQklOREVSX1NFVF9NQVhfVEhSRUFEUwkJX0lPVygnYicsIDUsIHNpemVfdCkKLSNkZWZpbmUJQklOREVSX1NFVF9JRExFX1BSSU9SSVRZCV9JT1coJ2InLCA2LCBpbnQpCi0jZGVmaW5lCUJJTkRFUl9TRVRfQ09OVEVYVF9NR1IJCV9JT1coJ2InLCA3LCBpbnQpCi0jZGVmaW5lCUJJTkRFUl9USFJFQURfRVhJVAkJX0lPVygnYicsIDgsIGludCkKLSNkZWZpbmUgQklOREVSX1ZFUlNJT04JCQlfSU9XUignYicsIDksIHN0cnVjdCBiaW5kZXJfdmVyc2lvbikKLQotLyoKLSAqIE5PVEU6IFR3byBzcGVjaWFsIGVycm9yIGNvZGVzIHlvdSBzaG91bGQgY2hlY2sgZm9yIHdoZW4gY2FsbGluZwotICogaW4gdG8gdGhlIGRyaXZlciBhcmU6Ci0gKgotICogRUlOVFIgLS0gVGhlIG9wZXJhdGlvbiBoYXMgYmVlbiBpbnRlcnVwdGVkLiAgVGhpcyBzaG91bGQgYmUKLSAqIGhhbmRsZWQgYnkgcmV0cnlpbmcgdGhlIGlvY3RsKCkgdW50aWwgYSBkaWZmZXJlbnQgZXJyb3IgY29kZQotICogaXMgcmV0dXJuZWQuCi0gKgotICogRUNPTk5SRUZVU0VEIC0tIFRoZSBkcml2ZXIgaXMgbm8gbG9uZ2VyIGFjY2VwdGluZyBvcGVyYXRpb25zCi0gKiBmcm9tIHlvdXIgcHJvY2Vzcy4gIFRoYXQgaXMsIHRoZSBwcm9jZXNzIGlzIGJlaW5nIGRlc3Ryb3llZC4KLSAqIFlvdSBzaG91bGQgaGFuZGxlIHRoaXMgYnkgZXhpdGluZyBmcm9tIHlvdXIgcHJvY2Vzcy4gIE5vdGUKLSAqIHRoYXQgb25jZSB0aGlzIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQsIGFsbCBmdXJ0aGVyIGNhbGxzIHRvCi0gKiB0aGUgZHJpdmVyIGZyb20gYW55IHRocmVhZCB3aWxsIHJldHVybiB0aGlzIHNhbWUgY29kZS4KLSAqLwotCi1lbnVtIHRyYW5zYWN0aW9uX2ZsYWdzIHsKLQlURl9PTkVfV0FZCT0gMHgwMSwJLyogdGhpcyBpcyBhIG9uZS13YXkgY2FsbDogYXN5bmMsIG5vIHJldHVybiAqLwotCVRGX1JPT1RfT0JKRUNUCT0gMHgwNCwJLyogY29udGVudHMgYXJlIHRoZSBjb21wb25lbnQncyByb290IG9iamVjdCAqLwotCVRGX1NUQVRVU19DT0RFCT0gMHgwOCwJLyogY29udGVudHMgYXJlIGEgMzItYml0IHN0YXR1cyBjb2RlICovCi0JVEZfQUNDRVBUX0ZEUwk9IDB4MTAsCS8qIGFsbG93IHJlcGxpZXMgd2l0aCBmaWxlIGRlc2NyaXB0b3JzICovCi19OwotCi1zdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEgewotCS8qIFRoZSBmaXJzdCB0d28gYXJlIG9ubHkgdXNlZCBmb3IgYmNUUkFOU0FDVElPTiBhbmQgYnJUUkFOU0FDVElPTiwKLQkgKiBpZGVudGlmeWluZyB0aGUgdGFyZ2V0IGFuZCBjb250ZW50cyBvZiB0aGUgdHJhbnNhY3Rpb24uCi0JICovCi0JdW5pb24gewotCQlzaXplX3QJaGFuZGxlOwkvKiB0YXJnZXQgZGVzY3JpcHRvciBvZiBjb21tYW5kIHRyYW5zYWN0aW9uICovCi0JCXZvaWQJKnB0cjsJLyogdGFyZ2V0IGRlc2NyaXB0b3Igb2YgcmV0dXJuIHRyYW5zYWN0aW9uICovCi0JfSB0YXJnZXQ7Ci0Jdm9pZAkJKmNvb2tpZTsJLyogdGFyZ2V0IG9iamVjdCBjb29raWUgKi8KLQl1bnNpZ25lZCBpbnQJY29kZTsJCS8qIHRyYW5zYWN0aW9uIGNvbW1hbmQgKi8KLQotCS8qIEdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRyYW5zYWN0aW9uLiAqLwotCXVuc2lnbmVkIGludAlmbGFnczsKLQlwaWRfdAkJc2VuZGVyX3BpZDsKLQl1aWRfdAkJc2VuZGVyX2V1aWQ7Ci0Jc2l6ZV90CQlkYXRhX3NpemU7CS8qIG51bWJlciBvZiBieXRlcyBvZiBkYXRhICovCi0Jc2l6ZV90CQlvZmZzZXRzX3NpemU7CS8qIG51bWJlciBvZiBieXRlcyBvZiBvZmZzZXRzICovCi0KLQkvKiBJZiB0aGlzIHRyYW5zYWN0aW9uIGlzIGlubGluZSwgdGhlIGRhdGEgaW1tZWRpYXRlbHkKLQkgKiBmb2xsb3dzIGhlcmU7IG90aGVyd2lzZSwgaXQgZW5kcyB3aXRoIGEgcG9pbnRlciB0bwotCSAqIHRoZSBkYXRhIGJ1ZmZlci4KLQkgKi8KLQl1bmlvbiB7Ci0JCXN0cnVjdCB7Ci0JCQkvKiB0cmFuc2FjdGlvbiBkYXRhICovCi0JCQljb25zdCB2b2lkCSpidWZmZXI7Ci0JCQkvKiBvZmZzZXRzIGZyb20gYnVmZmVyIHRvIGZsYXRfYmluZGVyX29iamVjdCBzdHJ1Y3RzICovCi0JCQljb25zdCB2b2lkCSpvZmZzZXRzOwotCQl9IHB0cjsKLQkJdWludDhfdAlidWZbOF07Ci0JfSBkYXRhOwotfTsKLQotc3RydWN0IGJpbmRlcl9wdHJfY29va2llIHsKLQl2b2lkICpwdHI7Ci0Jdm9pZCAqY29va2llOwotfTsKLQotc3RydWN0IGJpbmRlcl9wcmlfZGVzYyB7Ci0JaW50IHByaW9yaXR5OwotCWludCBkZXNjOwotfTsKLQotc3RydWN0IGJpbmRlcl9wcmlfcHRyX2Nvb2tpZSB7Ci0JaW50IHByaW9yaXR5OwotCXZvaWQgKnB0cjsKLQl2b2lkICpjb29raWU7Ci19OwotCi1lbnVtIEJpbmRlckRyaXZlclJldHVyblByb3RvY29sIHsKLQlCUl9FUlJPUiA9IF9JT1IoJ3InLCAwLCBpbnQpLAotCS8qCi0JICogaW50OiBlcnJvciBjb2RlCi0JICovCi0KLQlCUl9PSyA9IF9JTygncicsIDEpLAotCS8qIE5vIHBhcmFtZXRlcnMhICovCi0KLQlCUl9UUkFOU0FDVElPTiA9IF9JT1IoJ3InLCAyLCBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEpLAotCUJSX1JFUExZID0gX0lPUigncicsIDMsIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSksCi0JLyoKLQkgKiBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YTogdGhlIHJlY2VpdmVkIGNvbW1hbmQuCi0JICovCi0KLQlCUl9BQ1FVSVJFX1JFU1VMVCA9IF9JT1IoJ3InLCA0LCBpbnQpLAotCS8qCi0JICogbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKLQkgKiBpbnQ6IDAgaWYgdGhlIGxhc3QgYmNBVFRFTVBUX0FDUVVJUkUgd2FzIG5vdCBzdWNjZXNzZnVsLgotCSAqIEVsc2UgdGhlIHJlbW90ZSBvYmplY3QgaGFzIGFjcXVpcmVkIGEgcHJpbWFyeSByZWZlcmVuY2UuCi0JICovCi0KLQlCUl9ERUFEX1JFUExZID0gX0lPKCdyJywgNSksCi0JLyoKLQkgKiBUaGUgdGFyZ2V0IG9mIHRoZSBsYXN0IHRyYW5zYWN0aW9uIChlaXRoZXIgYSBiY1RSQU5TQUNUSU9OIG9yCi0JICogYSBiY0FUVEVNUFRfQUNRVUlSRSkgaXMgbm8gbG9uZ2VyIHdpdGggdXMuICBObyBwYXJhbWV0ZXJzLgotCSAqLwotCi0JQlJfVFJBTlNBQ1RJT05fQ09NUExFVEUgPSBfSU8oJ3InLCA2KSwKLQkvKgotCSAqIE5vIHBhcmFtZXRlcnMuLi4gYWx3YXlzIHJlZmVycyB0byB0aGUgbGFzdCB0cmFuc2FjdGlvbiByZXF1ZXN0ZWQKLQkgKiAoaW5jbHVkaW5nIHJlcGxpZXMpLiAgTm90ZSB0aGF0IHRoaXMgd2lsbCBiZSBzZW50IGV2ZW4gZm9yCi0JICogYXN5bmNocm9ub3VzIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQotCUJSX0lOQ1JFRlMgPSBfSU9SKCdyJywgNywgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKLQlCUl9BQ1FVSVJFID0gX0lPUigncicsIDgsIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCi0JQlJfUkVMRUFTRSA9IF9JT1IoJ3InLCA5LCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAotCUJSX0RFQ1JFRlMgPSBfSU9SKCdyJywgMTAsIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCi0JLyoKLQkgKiB2b2lkICo6CXB0ciB0byBiaW5kZXIKLQkgKiB2b2lkICo6IGNvb2tpZSBmb3IgYmluZGVyCi0JICovCi0KLQlCUl9BVFRFTVBUX0FDUVVJUkUgPSBfSU9SKCdyJywgMTEsIHN0cnVjdCBiaW5kZXJfcHJpX3B0cl9jb29raWUpLAotCS8qCi0JICogbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKLQkgKiBpbnQ6CXByaW9yaXR5Ci0JICogdm9pZCAqOiBwdHIgdG8gYmluZGVyCi0JICogdm9pZCAqOiBjb29raWUgZm9yIGJpbmRlcgotCSAqLwotCi0JQlJfTk9PUCA9IF9JTygncicsIDEyKSwKLQkvKgotCSAqIE5vIHBhcmFtZXRlcnMuICBEbyBub3RoaW5nIGFuZCBleGFtaW5lIHRoZSBuZXh0IGNvbW1hbmQuICBJdCBleGlzdHMKLQkgKiBwcmltYXJpbHkgc28gdGhhdCB3ZSBjYW4gcmVwbGFjZSBpdCB3aXRoIGEgQlJfU1BBV05fTE9PUEVSIGNvbW1hbmQuCi0JICovCi0KLQlCUl9TUEFXTl9MT09QRVIgPSBfSU8oJ3InLCAxMyksCi0JLyoKLQkgKiBObyBwYXJhbWV0ZXJzLiAgVGhlIGRyaXZlciBoYXMgZGV0ZXJtaW5lZCB0aGF0IGEgcHJvY2VzcyBoYXMgbm8KLQkgKiB0aHJlYWRzIHdhaXRpbmcgdG8gc2VydmljZSBpbmNvbW1pbmcgdHJhbnNhY3Rpb25zLiAgV2hlbiBhIHByb2Nlc3MKLQkgKiByZWNlaXZlcyB0aGlzIGNvbW1hbmQsIGl0IG11c3Qgc3Bhd24gYSBuZXcgc2VydmljZSB0aHJlYWQgYW5kCi0JICogcmVnaXN0ZXIgaXQgdmlhIGJjRU5URVJfTE9PUEVSLgotCSAqLwotCi0JQlJfRklOSVNIRUQgPSBfSU8oJ3InLCAxNCksCi0JLyoKLQkgKiBub3QgY3VycmVudGx5IHN1cHBvcnRlZAotCSAqIHN0b3AgdGhyZWFkcG9vbCB0aHJlYWQKLQkgKi8KLQotCUJSX0RFQURfQklOREVSID0gX0lPUigncicsIDE1LCB2b2lkICopLAotCS8qCi0JICogdm9pZCAqOiBjb29raWUKLQkgKi8KLQlCUl9DTEVBUl9ERUFUSF9OT1RJRklDQVRJT05fRE9ORSA9IF9JT1IoJ3InLCAxNiwgdm9pZCAqKSwKLQkvKgotCSAqIHZvaWQgKjogY29va2llCi0JICovCi0KLQlCUl9GQUlMRURfUkVQTFkgPSBfSU8oJ3InLCAxNyksCi0JLyoKLQkgKiBUaGUgdGhlIGxhc3QgdHJhbnNhY3Rpb24gKGVpdGhlciBhIGJjVFJBTlNBQ1RJT04gb3IKLQkgKiBhIGJjQVRURU1QVF9BQ1FVSVJFKSBmYWlsZWQgKGUuZy4gb3V0IG9mIG1lbW9yeSkuICBObyBwYXJhbWV0ZXJzLgotCSAqLwotfTsKLQotZW51bSBCaW5kZXJEcml2ZXJDb21tYW5kUHJvdG9jb2wgewotCUJDX1RSQU5TQUNUSU9OID0gX0lPVygnYycsIDAsIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSksCi0JQkNfUkVQTFkgPSBfSU9XKCdjJywgMSwgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhKSwKLQkvKgotCSAqIGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhOiB0aGUgc2VudCBjb21tYW5kLgotCSAqLwotCi0JQkNfQUNRVUlSRV9SRVNVTFQgPSBfSU9XKCdjJywgMiwgaW50KSwKLQkvKgotCSAqIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCi0JICogaW50OiAgMCBpZiB0aGUgbGFzdCBCUl9BVFRFTVBUX0FDUVVJUkUgd2FzIG5vdCBzdWNjZXNzZnVsLgotCSAqIEVsc2UgeW91IGhhdmUgYWNxdWlyZWQgYSBwcmltYXJ5IHJlZmVyZW5jZSBvbiB0aGUgb2JqZWN0LgotCSAqLwotCi0JQkNfRlJFRV9CVUZGRVIgPSBfSU9XKCdjJywgMywgaW50KSwKLQkvKgotCSAqIHZvaWQgKjogcHRyIHRvIHRyYW5zYWN0aW9uIGRhdGEgcmVjZWl2ZWQgb24gYSByZWFkCi0JICovCi0KLQlCQ19JTkNSRUZTID0gX0lPVygnYycsIDQsIGludCksCi0JQkNfQUNRVUlSRSA9IF9JT1coJ2MnLCA1LCBpbnQpLAotCUJDX1JFTEVBU0UgPSBfSU9XKCdjJywgNiwgaW50KSwKLQlCQ19ERUNSRUZTID0gX0lPVygnYycsIDcsIGludCksCi0JLyoKLQkgKiBpbnQ6CWRlc2NyaXB0b3IKLQkgKi8KLQotCUJDX0lOQ1JFRlNfRE9ORSA9IF9JT1coJ2MnLCA4LCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAotCUJDX0FDUVVJUkVfRE9ORSA9IF9JT1coJ2MnLCA5LCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAotCS8qCi0JICogdm9pZCAqOiBwdHIgdG8gYmluZGVyCi0JICogdm9pZCAqOiBjb29raWUgZm9yIGJpbmRlcgotCSAqLwotCi0JQkNfQVRURU1QVF9BQ1FVSVJFID0gX0lPVygnYycsIDEwLCBzdHJ1Y3QgYmluZGVyX3ByaV9kZXNjKSwKLQkvKgotCSAqIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCi0JICogaW50OiBwcmlvcml0eQotCSAqIGludDogZGVzY3JpcHRvcgotCSAqLwotCi0JQkNfUkVHSVNURVJfTE9PUEVSID0gX0lPKCdjJywgMTEpLAotCS8qCi0JICogTm8gcGFyYW1ldGVycy4KLQkgKiBSZWdpc3RlciBhIHNwYXduZWQgbG9vcGVyIHRocmVhZCB3aXRoIHRoZSBkZXZpY2UuCi0JICovCi0KLQlCQ19FTlRFUl9MT09QRVIgPSBfSU8oJ2MnLCAxMiksCi0JQkNfRVhJVF9MT09QRVIgPSBfSU8oJ2MnLCAxMyksCi0JLyoKLQkgKiBObyBwYXJhbWV0ZXJzLgotCSAqIFRoZXNlIHR3byBjb21tYW5kcyBhcmUgc2VudCBhcyBhbiBhcHBsaWNhdGlvbi1sZXZlbCB0aHJlYWQKLQkgKiBlbnRlcnMgYW5kIGV4aXRzIHRoZSBiaW5kZXIgbG9vcCwgcmVzcGVjdGl2ZWx5LiAgVGhleSBhcmUKLQkgKiB1c2VkIHNvIHRoZSBiaW5kZXIgY2FuIGhhdmUgYW4gYWNjdXJhdGUgY291bnQgb2YgdGhlIG51bWJlcgotCSAqIG9mIGxvb3BpbmcgdGhyZWFkcyBpdCBoYXMgYXZhaWxhYmxlLgotCSAqLwotCi0JQkNfUkVRVUVTVF9ERUFUSF9OT1RJRklDQVRJT04gPSBfSU9XKCdjJywgMTQsIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCi0JLyoKLQkgKiB2b2lkICo6IHB0ciB0byBiaW5kZXIKLQkgKiB2b2lkICo6IGNvb2tpZQotCSAqLwotCi0JQkNfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OID0gX0lPVygnYycsIDE1LCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAotCS8qCi0JICogdm9pZCAqOiBwdHIgdG8gYmluZGVyCi0JICogdm9pZCAqOiBjb29raWUKLQkgKi8KLQotCUJDX0RFQURfQklOREVSX0RPTkUgPSBfSU9XKCdjJywgMTYsIHZvaWQgKiksCi0JLyoKLQkgKiB2b2lkICo6IGNvb2tpZQotCSAqLwotfTsKLQotI2VuZGlmIC8qIF9MSU5VWF9CSU5ERVJfSCAqLwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb2dnZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2xvZ2dlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzEwYjQ1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2xvZ2dlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNjA3ICswLDAgQEAKLS8qCi0gKiBkcml2ZXJzL21pc2MvbG9nZ2VyLmMKLSAqCi0gKiBBIExvZ2dpbmcgU3Vic3lzdGVtCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggR29vZ2xlLCBJbmMuCi0gKgotICogUm9iZXJ0IExvdmUgPHJsb3ZlQGdvb2dsZS5jb20+Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lLmg+Ci0jaW5jbHVkZSAibG9nZ2VyLmgiCi0KLSNpbmNsdWRlIDxhc20vaW9jdGxzLmg+Ci0KLS8qCi0gKiBzdHJ1Y3QgbG9nZ2VyX2xvZyAtIHJlcHJlc2VudHMgYSBzcGVjaWZpYyBsb2csIHN1Y2ggYXMgJ21haW4nIG9yICdyYWRpbycKLSAqCi0gKiBUaGlzIHN0cnVjdHVyZSBsaXZlcyBmcm9tIG1vZHVsZSBpbnNlcnRpb24gdW50aWwgbW9kdWxlIHJlbW92YWwsIHNvIGl0IGRvZXMKLSAqIG5vdCBuZWVkIGFkZGl0aW9uYWwgcmVmZXJlbmNlIGNvdW50aW5nLiBUaGUgc3RydWN0dXJlIGlzIHByb3RlY3RlZCBieSB0aGUKLSAqIG11dGV4ICdtdXRleCcuCi0gKi8KLXN0cnVjdCBsb2dnZXJfbG9nIHsKLQl1bnNpZ25lZCBjaGFyIAkJKmJ1ZmZlcjsvKiB0aGUgcmluZyBidWZmZXIgaXRzZWxmICovCi0Jc3RydWN0IG1pc2NkZXZpY2UJbWlzYzsJLyogbWlzYyBkZXZpY2UgcmVwcmVzZW50aW5nIHRoZSBsb2cgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdAl3cTsJLyogd2FpdCBxdWV1ZSBmb3IgcmVhZGVycyAqLwotCXN0cnVjdCBsaXN0X2hlYWQJcmVhZGVyczsgLyogdGhpcyBsb2cncyByZWFkZXJzICovCi0Jc3RydWN0IG11dGV4CQltdXRleDsJLyogbXV0ZXggcHJvdGVjdGluZyBidWZmZXIgKi8KLQlzaXplX3QJCQl3X29mZjsJLyogY3VycmVudCB3cml0ZSBoZWFkIG9mZnNldCAqLwotCXNpemVfdAkJCWhlYWQ7CS8qIG5ldyByZWFkZXJzIHN0YXJ0IGhlcmUgKi8KLQlzaXplX3QJCQlzaXplOwkvKiBzaXplIG9mIHRoZSBsb2cgKi8KLX07Ci0KLS8qCi0gKiBzdHJ1Y3QgbG9nZ2VyX3JlYWRlciAtIGEgbG9nZ2luZyBkZXZpY2Ugb3BlbiBmb3IgcmVhZGluZwotICoKLSAqIFRoaXMgb2JqZWN0IGxpdmVzIGZyb20gb3BlbiB0byByZWxlYXNlLCBzbyB3ZSBkb24ndCBuZWVkIGFkZGl0aW9uYWwKLSAqIHJlZmVyZW5jZSBjb3VudGluZy4gVGhlIHN0cnVjdHVyZSBpcyBwcm90ZWN0ZWQgYnkgbG9nLT5tdXRleC4KLSAqLwotc3RydWN0IGxvZ2dlcl9yZWFkZXIgewotCXN0cnVjdCBsb2dnZXJfbG9nCSpsb2c7CS8qIGFzc29jaWF0ZWQgbG9nICovCi0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0OwkvKiBlbnRyeSBpbiBsb2dnZXJfbG9nJ3MgbGlzdCAqLwotCXNpemVfdAkJCXJfb2ZmOwkvKiBjdXJyZW50IHJlYWQgaGVhZCBvZmZzZXQgKi8KLX07Ci0KLS8qIGxvZ2dlcl9vZmZzZXQgLSByZXR1cm5zIGluZGV4ICduJyBpbnRvIHRoZSBsb2cgdmlhIChvcHRpbWl6ZWQpIG1vZHVsdXMgKi8KLSNkZWZpbmUgbG9nZ2VyX29mZnNldChuKQkoKG4pICYgKGxvZy0+c2l6ZSAtIDEpKQotCi0vKgotICogZmlsZV9nZXRfbG9nIC0gR2l2ZW4gYSBmaWxlIHN0cnVjdHVyZSwgcmV0dXJuIHRoZSBhc3NvY2lhdGVkIGxvZwotICoKLSAqIFRoaXMgaXNuJ3QgYWVzdGhldGljLiBXZSBoYXZlIHNldmVyYWwgZ29hbHM6Ci0gKgotICogCTEpIE5lZWQgdG8gcXVpY2tseSBvYnRhaW4gdGhlIGFzc29jaWF0ZWQgbG9nIGR1cmluZyBhbiBJL08gb3BlcmF0aW9uCi0gKiAJMikgUmVhZGVycyBuZWVkIHRvIG1haW50YWluIHN0YXRlIChsb2dnZXJfcmVhZGVyKQotICogCTMpIFdyaXRlcnMgbmVlZCB0byBiZSB2ZXJ5IGZhc3QgKG9wZW4oKSBzaG91bGQgYmUgYSBuZWFyIG5vLW9wKQotICoKLSAqIEluIHRoZSByZWFkZXIgY2FzZSwgd2UgY2FuIHRyaXZpYWxseSBnbyBmaWxlLT5sb2dnZXJfcmVhZGVyLT5sb2dnZXJfbG9nLgotICogRm9yIGEgd3JpdGVyLCB3ZSBkb24ndCB3YW50IHRvIG1haW50YWluIGEgbG9nZ2VyX3JlYWRlciwgc28gd2UganVzdCBnbwotICogZmlsZS0+bG9nZ2VyX2xvZy4gVGh1cyB3aGF0IGZpbGUtPnByaXZhdGVfZGF0YSBwb2ludHMgYXQgZGVwZW5kcyBvbiB3aGV0aGVyCi0gKiBvciBub3QgdGhlIGZpbGUgd2FzIG9wZW5lZCBmb3IgcmVhZGluZy4gVGhpcyBmdW5jdGlvbiBoaWRlcyB0aGF0IGRpcnRpbmVzcy4KLSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgbG9nZ2VyX2xvZyAqZmlsZV9nZXRfbG9nKHN0cnVjdCBmaWxlICpmaWxlKQotewotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCXN0cnVjdCBsb2dnZXJfcmVhZGVyICpyZWFkZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JCXJldHVybiByZWFkZXItPmxvZzsKLQl9IGVsc2UKLQkJcmV0dXJuIGZpbGUtPnByaXZhdGVfZGF0YTsKLX0KLQotLyoKLSAqIGdldF9lbnRyeV9sZW4gLSBHcmFicyB0aGUgbGVuZ3RoIG9mIHRoZSBwYXlsb2FkIG9mIHRoZSBuZXh0IGVudHJ5IHN0YXJ0aW5nCi0gKiBmcm9tICdvZmYnLgotICoKLSAqIENhbGxlciBuZWVkcyB0byBob2xkIGxvZy0+bXV0ZXguCi0gKi8KLXN0YXRpYyBfX3UzMiBnZXRfZW50cnlfbGVuKHN0cnVjdCBsb2dnZXJfbG9nICpsb2csIHNpemVfdCBvZmYpCi17Ci0JX191MTYgdmFsOwotCi0Jc3dpdGNoIChsb2ctPnNpemUgLSBvZmYpIHsKLQljYXNlIDE6Ci0JCW1lbWNweSgmdmFsLCBsb2ctPmJ1ZmZlciArIG9mZiwgMSk7Ci0JCW1lbWNweSgoKGNoYXIgKikgJnZhbCkgKyAxLCBsb2ctPmJ1ZmZlciwgMSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCW1lbWNweSgmdmFsLCBsb2ctPmJ1ZmZlciArIG9mZiwgMik7Ci0JfQotCi0JcmV0dXJuIHNpemVvZihzdHJ1Y3QgbG9nZ2VyX2VudHJ5KSArIHZhbDsKLX0KLQotLyoKLSAqIGRvX3JlYWRfbG9nX3RvX3VzZXIgLSByZWFkcyBleGFjdGx5ICdjb3VudCcgYnl0ZXMgZnJvbSAnbG9nJyBpbnRvIHRoZQotICogdXNlci1zcGFjZSBidWZmZXIgJ2J1ZicuIFJldHVybnMgJ2NvdW50JyBvbiBzdWNjZXNzLgotICoKLSAqIENhbGxlciBtdXN0IGhvbGQgbG9nLT5tdXRleC4KLSAqLwotc3RhdGljIHNzaXplX3QgZG9fcmVhZF9sb2dfdG9fdXNlcihzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nLAotCQkJCSAgIHN0cnVjdCBsb2dnZXJfcmVhZGVyICpyZWFkZXIsCi0JCQkJICAgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQkgICBzaXplX3QgY291bnQpCi17Ci0Jc2l6ZV90IGxlbjsKLQotCS8qCi0JICogV2UgcmVhZCBmcm9tIHRoZSBsb2cgaW4gdHdvIGRpc2pvaW50IG9wZXJhdGlvbnMuIEZpcnN0LCB3ZSByZWFkIGZyb20KLQkgKiB0aGUgY3VycmVudCByZWFkIGhlYWQgb2Zmc2V0IHVwIHRvICdjb3VudCcgYnl0ZXMgb3IgdG8gdGhlIGVuZCBvZgotCSAqIHRoZSBsb2csIHdoaWNoZXZlciBjb21lcyBmaXJzdC4KLQkgKi8KLQlsZW4gPSBtaW4oY291bnQsIGxvZy0+c2l6ZSAtIHJlYWRlci0+cl9vZmYpOwotCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBsb2ctPmJ1ZmZlciArIHJlYWRlci0+cl9vZmYsIGxlbikpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JLyoKLQkgKiBTZWNvbmQsIHdlIHJlYWQgYW55IHJlbWFpbmluZyBieXRlcywgc3RhcnRpbmcgYmFjayBhdCB0aGUgaGVhZCBvZgotCSAqIHRoZSBsb2cuCi0JICovCi0JaWYgKGNvdW50ICE9IGxlbikKLQkJaWYgKGNvcHlfdG9fdXNlcihidWYgKyBsZW4sIGxvZy0+YnVmZmVyLCBjb3VudCAtIGxlbikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJlYWRlci0+cl9vZmYgPSBsb2dnZXJfb2Zmc2V0KHJlYWRlci0+cl9vZmYgKyBjb3VudCk7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLS8qCi0gKiBsb2dnZXJfcmVhZCAtIG91ciBsb2cncyByZWFkKCkgbWV0aG9kCi0gKgotICogQmVoYXZpb3I6Ci0gKgotICogCS0gT19OT05CTE9DSyB3b3JrcwotICogCS0gSWYgdGhlcmUgYXJlIG5vIGxvZyBlbnRyaWVzIHRvIHJlYWQsIGJsb2NrcyB1bnRpbCBsb2cgaXMgd3JpdHRlbiB0bwotICogCS0gQXRvbWljYWxseSByZWFkcyBleGFjdGx5IG9uZSBsb2cgZW50cnkKLSAqCi0gKiBPcHRpbWFsIHJlYWQgc2l6ZSBpcyBMT0dHRVJfRU5UUllfTUFYX0xFTi4gV2lsbCBzZXQgZXJybm8gdG8gRUlOVkFMIGlmIHJlYWQKLSAqIGJ1ZmZlciBpcyBpbnN1ZmZpY2llbnQgdG8gaG9sZCBuZXh0IGVudHJ5LgotICovCi1zdGF0aWMgc3NpemVfdCBsb2dnZXJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGxvZ2dlcl9yZWFkZXIgKnJlYWRlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nID0gcmVhZGVyLT5sb2c7Ci0Jc3NpemVfdCByZXQ7Ci0JREVGSU5FX1dBSVQod2FpdCk7Ci0KLXN0YXJ0OgotCXdoaWxlICgxKSB7Ci0JCXByZXBhcmVfdG9fd2FpdCgmbG9nLT53cSwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0KLQkJbXV0ZXhfbG9jaygmbG9nLT5tdXRleCk7Ci0JCXJldCA9IChsb2ctPndfb2ZmID09IHJlYWRlci0+cl9vZmYpOwotCQltdXRleF91bmxvY2soJmxvZy0+bXV0ZXgpOwotCQlpZiAoIXJldCkKLQkJCWJyZWFrOwotCi0JCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewotCQkJcmV0ID0gLUVBR0FJTjsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQlyZXQgPSAtRUlOVFI7Ci0JCQlicmVhazsKLQkJfQotCi0JCXNjaGVkdWxlKCk7Ci0JfQotCi0JZmluaXNoX3dhaXQoJmxvZy0+d3EsICZ3YWl0KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JbXV0ZXhfbG9jaygmbG9nLT5tdXRleCk7Ci0KLQkvKiBpcyB0aGVyZSBzdGlsbCBzb21ldGhpbmcgdG8gcmVhZCBvciBkaWQgd2UgcmFjZT8gKi8KLQlpZiAodW5saWtlbHkobG9nLT53X29mZiA9PSByZWFkZXItPnJfb2ZmKSkgewotCQltdXRleF91bmxvY2soJmxvZy0+bXV0ZXgpOwotCQlnb3RvIHN0YXJ0OwotCX0KLQotCS8qIGdldCB0aGUgc2l6ZSBvZiB0aGUgbmV4dCBlbnRyeSAqLwotCXJldCA9IGdldF9lbnRyeV9sZW4obG9nLCByZWFkZXItPnJfb2ZmKTsKLQlpZiAoY291bnQgPCByZXQpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogZ2V0IGV4YWN0bHkgb25lIGVudHJ5IGZyb20gdGhlIGxvZyAqLwotCXJldCA9IGRvX3JlYWRfbG9nX3RvX3VzZXIobG9nLCByZWFkZXIsIGJ1ZiwgcmV0KTsKLQotb3V0OgotCW11dGV4X3VubG9jaygmbG9nLT5tdXRleCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogZ2V0X25leHRfZW50cnkgLSByZXR1cm4gdGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgdmFsaWQgZW50cnkgYXQgbGVhc3QgJ2xlbicKLSAqIGJ5dGVzIGFmdGVyICdvZmYnLgotICoKLSAqIENhbGxlciBtdXN0IGhvbGQgbG9nLT5tdXRleC4KLSAqLwotc3RhdGljIHNpemVfdCBnZXRfbmV4dF9lbnRyeShzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nLCBzaXplX3Qgb2ZmLCBzaXplX3QgbGVuKQotewotCXNpemVfdCBjb3VudCA9IDA7Ci0KLQlkbyB7Ci0JCXNpemVfdCBuciA9IGdldF9lbnRyeV9sZW4obG9nLCBvZmYpOwotCQlvZmYgPSBsb2dnZXJfb2Zmc2V0KG9mZiArIG5yKTsKLQkJY291bnQgKz0gbnI7Ci0JfSB3aGlsZSAoY291bnQgPCBsZW4pOwotCi0JcmV0dXJuIG9mZjsKLX0KLQotLyoKLSAqIGNsb2NrX2ludGVydmFsIC0gaXMgYSA8IGMgPCBiIGluIG1vZC1zcGFjZT8gUHV0IGFub3RoZXIgd2F5LCBkb2VzIHRoZSBsaW5lCi0gKiBmcm9tIGEgdG8gYiBjcm9zcyBjPwotICovCi1zdGF0aWMgaW5saW5lIGludCBjbG9ja19pbnRlcnZhbChzaXplX3QgYSwgc2l6ZV90IGIsIHNpemVfdCBjKQotewotCWlmIChiIDwgYSkgewotCQlpZiAoYSA8IGMgfHwgYiA+PSBjKQotCQkJcmV0dXJuIDE7Ci0JfSBlbHNlIHsKLQkJaWYgKGEgPCBjICYmIGIgPj0gYykKLQkJCXJldHVybiAxOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogZml4X3VwX3JlYWRlcnMgLSB3YWxrIHRoZSBsaXN0IG9mIGFsbCByZWFkZXJzIGFuZCAiZml4IHVwIiBhbnkgd2hvIHdlcmUKLSAqIGxhcHBlZCBieSB0aGUgd3JpdGVyOyBhbHNvIGRvIHRoZSBzYW1lIGZvciB0aGUgZGVmYXVsdCAic3RhcnQgaGVhZCIuCi0gKiBXZSBkbyB0aGlzIGJ5ICJwdWxsaW5nIGZvcndhcmQiIHRoZSByZWFkZXJzIGFuZCBzdGFydCBoZWFkIHRvIHRoZSBmaXJzdAotICogZW50cnkgYWZ0ZXIgdGhlIG5ldyB3cml0ZSBoZWFkLgotICoKLSAqIFRoZSBjYWxsZXIgbmVlZHMgdG8gaG9sZCBsb2ctPm11dGV4LgotICovCi1zdGF0aWMgdm9pZCBmaXhfdXBfcmVhZGVycyhzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nLCBzaXplX3QgbGVuKQotewotCXNpemVfdCBvbGQgPSBsb2ctPndfb2ZmOwotCXNpemVfdCBuZXcgPSBsb2dnZXJfb2Zmc2V0KG9sZCArIGxlbik7Ci0Jc3RydWN0IGxvZ2dlcl9yZWFkZXIgKnJlYWRlcjsKLQotCWlmIChjbG9ja19pbnRlcnZhbChvbGQsIG5ldywgbG9nLT5oZWFkKSkKLQkJbG9nLT5oZWFkID0gZ2V0X25leHRfZW50cnkobG9nLCBsb2ctPmhlYWQsIGxlbik7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlYWRlciwgJmxvZy0+cmVhZGVycywgbGlzdCkKLQkJaWYgKGNsb2NrX2ludGVydmFsKG9sZCwgbmV3LCByZWFkZXItPnJfb2ZmKSkKLQkJCXJlYWRlci0+cl9vZmYgPSBnZXRfbmV4dF9lbnRyeShsb2csIHJlYWRlci0+cl9vZmYsIGxlbik7Ci19Ci0KLS8qCi0gKiBkb193cml0ZV9sb2cgLSB3cml0ZXMgJ2xlbicgYnl0ZXMgZnJvbSAnYnVmJyB0byAnbG9nJwotICoKLSAqIFRoZSBjYWxsZXIgbmVlZHMgdG8gaG9sZCBsb2ctPm11dGV4LgotICovCi1zdGF0aWMgdm9pZCBkb193cml0ZV9sb2coc3RydWN0IGxvZ2dlcl9sb2cgKmxvZywgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc2l6ZV90IGxlbjsKLQotCWxlbiA9IG1pbihjb3VudCwgbG9nLT5zaXplIC0gbG9nLT53X29mZik7Ci0JbWVtY3B5KGxvZy0+YnVmZmVyICsgbG9nLT53X29mZiwgYnVmLCBsZW4pOwotCi0JaWYgKGNvdW50ICE9IGxlbikKLQkJbWVtY3B5KGxvZy0+YnVmZmVyLCBidWYgKyBsZW4sIGNvdW50IC0gbGVuKTsKLQotCWxvZy0+d19vZmYgPSBsb2dnZXJfb2Zmc2V0KGxvZy0+d19vZmYgKyBjb3VudCk7Ci0KLX0KLQotLyoKLSAqIGRvX3dyaXRlX2xvZ191c2VyIC0gd3JpdGVzICdsZW4nIGJ5dGVzIGZyb20gdGhlIHVzZXItc3BhY2UgYnVmZmVyICdidWYnIHRvCi0gKiB0aGUgbG9nICdsb2cnCi0gKgotICogVGhlIGNhbGxlciBuZWVkcyB0byBob2xkIGxvZy0+bXV0ZXguCi0gKgotICogUmV0dXJucyAnY291bnQnIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KLSAqLwotc3RhdGljIHNzaXplX3QgZG9fd3JpdGVfbG9nX2Zyb21fdXNlcihzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nLAotCQkJCSAgICAgIGNvbnN0IHZvaWQgX191c2VyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzaXplX3QgbGVuOwotCi0JbGVuID0gbWluKGNvdW50LCBsb2ctPnNpemUgLSBsb2ctPndfb2ZmKTsKLQlpZiAobGVuICYmIGNvcHlfZnJvbV91c2VyKGxvZy0+YnVmZmVyICsgbG9nLT53X29mZiwgYnVmLCBsZW4pKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmIChjb3VudCAhPSBsZW4pCi0JCWlmIChjb3B5X2Zyb21fdXNlcihsb2ctPmJ1ZmZlciwgYnVmICsgbGVuLCBjb3VudCAtIGxlbikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCWxvZy0+d19vZmYgPSBsb2dnZXJfb2Zmc2V0KGxvZy0+d19vZmYgKyBjb3VudCk7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLS8qCi0gKiBsb2dnZXJfYWlvX3dyaXRlIC0gb3VyIHdyaXRlIG1ldGhvZCwgaW1wbGVtZW50aW5nIHN1cHBvcnQgZm9yIHdyaXRlKCksCi0gKiB3cml0ZXYoKSwgYW5kIGFpb193cml0ZSgpLiBXcml0ZXMgYXJlIG91ciBmYXN0IHBhdGgsIGFuZCB3ZSB0cnkgdG8gb3B0aW1pemUKLSAqIHRoZW0gYWJvdmUgYWxsIGVsc2UuCi0gKi8KLXNzaXplX3QgbG9nZ2VyX2Fpb193cml0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAotCQkJIHVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90IHBwb3MpCi17Ci0Jc3RydWN0IGxvZ2dlcl9sb2cgKmxvZyA9IGZpbGVfZ2V0X2xvZyhpb2NiLT5raV9maWxwKTsKLQlzaXplX3Qgb3JpZyA9IGxvZy0+d19vZmY7Ci0Jc3RydWN0IGxvZ2dlcl9lbnRyeSBoZWFkZXI7Ci0Jc3RydWN0IHRpbWVzcGVjIG5vdzsKLQlzc2l6ZV90IHJldCA9IDA7Ci0KLQlub3cgPSBjdXJyZW50X2tlcm5lbF90aW1lKCk7Ci0KLQloZWFkZXIucGlkID0gY3VycmVudC0+dGdpZDsKLQloZWFkZXIudGlkID0gY3VycmVudC0+cGlkOwotCWhlYWRlci5zZWMgPSBub3cudHZfc2VjOwotCWhlYWRlci5uc2VjID0gbm93LnR2X25zZWM7Ci0JaGVhZGVyLmxlbiA9IG1pbl90KHNpemVfdCwgaW9jYi0+a2lfbGVmdCwgTE9HR0VSX0VOVFJZX01BWF9QQVlMT0FEKTsKLQotCS8qIG51bGwgd3JpdGVzIHN1Y2NlZWQsIHJldHVybiB6ZXJvICovCi0JaWYgKHVubGlrZWx5KCFoZWFkZXIubGVuKSkKLQkJcmV0dXJuIDA7Ci0KLQltdXRleF9sb2NrKCZsb2ctPm11dGV4KTsKLQotCS8qCi0JICogRml4IHVwIGFueSByZWFkZXJzLCBwdWxsaW5nIHRoZW0gZm9yd2FyZCB0byB0aGUgZmlyc3QgcmVhZGFibGUKLQkgKiBlbnRyeSBhZnRlciAod2hhdCB3aWxsIGJlKSB0aGUgbmV3IHdyaXRlIG9mZnNldC4gV2UgZG8gdGhpcyBub3cKLQkgKiBiZWNhdXNlIGlmIHdlIHBhcnRpYWxseSBmYWlsLCB3ZSBjYW4gZW5kIHVwIHdpdGggY2xvYmJlcmVkIGxvZwotCSAqIGVudHJpZXMgdGhhdCBlbmNyb2FjaCBvbiByZWFkYWJsZSBidWZmZXIuCi0JICovCi0JZml4X3VwX3JlYWRlcnMobG9nLCBzaXplb2Yoc3RydWN0IGxvZ2dlcl9lbnRyeSkgKyBoZWFkZXIubGVuKTsKLQotCWRvX3dyaXRlX2xvZyhsb2csICZoZWFkZXIsIHNpemVvZihzdHJ1Y3QgbG9nZ2VyX2VudHJ5KSk7Ci0KLQl3aGlsZSAobnJfc2Vncy0tID4gMCkgewotCQlzaXplX3QgbGVuOwotCQlzc2l6ZV90IG5yOwotCi0JCS8qIGZpZ3VyZSBvdXQgaG93IG11Y2ggb2YgdGhpcyB2ZWN0b3Igd2UgY2FuIGtlZXAgKi8KLQkJbGVuID0gbWluX3Qoc2l6ZV90LCBpb3YtPmlvdl9sZW4sIGhlYWRlci5sZW4gLSByZXQpOwotCi0JCS8qIHdyaXRlIG91dCB0aGlzIHNlZ21lbnQncyBwYXlsb2FkICovCi0JCW5yID0gZG9fd3JpdGVfbG9nX2Zyb21fdXNlcihsb2csIGlvdi0+aW92X2Jhc2UsIGxlbik7Ci0JCWlmICh1bmxpa2VseShuciA8IDApKSB7Ci0JCQlsb2ctPndfb2ZmID0gb3JpZzsKLQkJCW11dGV4X3VubG9jaygmbG9nLT5tdXRleCk7Ci0JCQlyZXR1cm4gbnI7Ci0JCX0KLQotCQlpb3YrKzsKLQkJcmV0ICs9IG5yOwotCX0KLQotCW11dGV4X3VubG9jaygmbG9nLT5tdXRleCk7Ci0KLQkvKiB3YWtlIHVwIGFueSBibG9ja2VkIHJlYWRlcnMgKi8KLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmxvZy0+d3EpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCBsb2dnZXJfbG9nICpnZXRfbG9nX2Zyb21fbWlub3IoaW50KTsKLQotLyoKLSAqIGxvZ2dlcl9vcGVuIC0gdGhlIGxvZydzIG9wZW4oKSBmaWxlIG9wZXJhdGlvbgotICoKLSAqIE5vdGUgaG93IG5lYXIgYSBuby1vcCB0aGlzIGlzIGluIHRoZSB3cml0ZS1vbmx5IGNhc2UuIEtlZXAgaXQgdGhhdCB3YXkhCi0gKi8KLXN0YXRpYyBpbnQgbG9nZ2VyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGxvZ2dlcl9sb2cgKmxvZzsKLQlpbnQgcmV0OwotCi0JcmV0ID0gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWxvZyA9IGdldF9sb2dfZnJvbV9taW5vcihNSU5PUihpbm9kZS0+aV9yZGV2KSk7Ci0JaWYgKCFsb2cpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJc3RydWN0IGxvZ2dlcl9yZWFkZXIgKnJlYWRlcjsKLQotCQlyZWFkZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbG9nZ2VyX3JlYWRlciksIEdGUF9LRVJORUwpOwotCQlpZiAoIXJlYWRlcikKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCXJlYWRlci0+bG9nID0gbG9nOwotCQlJTklUX0xJU1RfSEVBRCgmcmVhZGVyLT5saXN0KTsKLQotCQltdXRleF9sb2NrKCZsb2ctPm11dGV4KTsKLQkJcmVhZGVyLT5yX29mZiA9IGxvZy0+aGVhZDsKLQkJbGlzdF9hZGRfdGFpbCgmcmVhZGVyLT5saXN0LCAmbG9nLT5yZWFkZXJzKTsKLQkJbXV0ZXhfdW5sb2NrKCZsb2ctPm11dGV4KTsKLQotCQlmaWxlLT5wcml2YXRlX2RhdGEgPSByZWFkZXI7Ci0JfSBlbHNlCi0JCWZpbGUtPnByaXZhdGVfZGF0YSA9IGxvZzsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogbG9nZ2VyX3JlbGVhc2UgLSB0aGUgbG9nJ3MgcmVsZWFzZSBmaWxlIG9wZXJhdGlvbgotICoKLSAqIE5vdGUgdGhpcyBpcyBhIHRvdGFsIG5vLW9wIGluIHRoZSB3cml0ZS1vbmx5IGNhc2UuIEtlZXAgaXQgdGhhdCB3YXkhCi0gKi8KLXN0YXRpYyBpbnQgbG9nZ2VyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppZ25vcmVkLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQlzdHJ1Y3QgbG9nZ2VyX3JlYWRlciAqcmVhZGVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCQlsaXN0X2RlbCgmcmVhZGVyLT5saXN0KTsKLQkJa2ZyZWUocmVhZGVyKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIGxvZ2dlcl9wb2xsIC0gdGhlIGxvZydzIHBvbGwgZmlsZSBvcGVyYXRpb24sIGZvciBwb2xsL3NlbGVjdC9lcG9sbAotICoKLSAqIE5vdGUgd2UgYWx3YXlzIHJldHVybiBQT0xMT1VULCBiZWNhdXNlIHlvdSBjYW4gYWx3YXlzIHdyaXRlKCkgdG8gdGhlIGxvZy4KLSAqIE5vdGUgYWxzbyB0aGF0LCBzdHJpY3RseSBzcGVha2luZywgYSByZXR1cm4gdmFsdWUgb2YgUE9MTElOIGRvZXMgbm90Ci0gKiBndWFyYW50ZWUgdGhhdCB0aGUgbG9nIGlzIHJlYWRhYmxlIHdpdGhvdXQgYmxvY2tpbmcsIGFzIHRoZXJlIGlzIGEgc21hbGwKLSAqIGNoYW5jZSB0aGF0IHRoZSB3cml0ZXIgY2FuIGxhcCB0aGUgcmVhZGVyIGluIHRoZSBpbnRlcmltIGJldHdlZW4gcG9sbCgpCi0gKiByZXR1cm5pbmcgYW5kIHRoZSByZWFkKCkgcmVxdWVzdC4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBsb2dnZXJfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKLXsKLQlzdHJ1Y3QgbG9nZ2VyX3JlYWRlciAqcmVhZGVyOwotCXN0cnVjdCBsb2dnZXJfbG9nICpsb2c7Ci0JdW5zaWduZWQgaW50IHJldCA9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwotCi0JaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCi0JCXJldHVybiByZXQ7Ci0KLQlyZWFkZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JbG9nID0gcmVhZGVyLT5sb2c7Ci0KLQlwb2xsX3dhaXQoZmlsZSwgJmxvZy0+d3EsIHdhaXQpOwotCi0JbXV0ZXhfbG9jaygmbG9nLT5tdXRleCk7Ci0JaWYgKGxvZy0+d19vZmYgIT0gcmVhZGVyLT5yX29mZikKLQkJcmV0IHw9IFBPTExJTiB8IFBPTExSRE5PUk07Ci0JbXV0ZXhfdW5sb2NrKCZsb2ctPm11dGV4KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBsb25nIGxvZ2dlcl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGxvZ2dlcl9sb2cgKmxvZyA9IGZpbGVfZ2V0X2xvZyhmaWxlKTsKLQlzdHJ1Y3QgbG9nZ2VyX3JlYWRlciAqcmVhZGVyOwotCWxvbmcgcmV0ID0gLUVOT1RUWTsKLQotCW11dGV4X2xvY2soJmxvZy0+bXV0ZXgpOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIExPR0dFUl9HRVRfTE9HX0JVRl9TSVpFOgotCQlyZXQgPSBsb2ctPnNpemU7Ci0JCWJyZWFrOwotCWNhc2UgTE9HR0VSX0dFVF9MT0dfTEVOOgotCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQkJcmV0ID0gLUVCQURGOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmVhZGVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCQlpZiAobG9nLT53X29mZiA+PSByZWFkZXItPnJfb2ZmKQotCQkJcmV0ID0gbG9nLT53X29mZiAtIHJlYWRlci0+cl9vZmY7Ci0JCWVsc2UKLQkJCXJldCA9IChsb2ctPnNpemUgLSByZWFkZXItPnJfb2ZmKSArIGxvZy0+d19vZmY7Ci0JCWJyZWFrOwotCWNhc2UgTE9HR0VSX0dFVF9ORVhUX0VOVFJZX0xFTjoKLQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJCXJldCA9IC1FQkFERjsKLQkJCWJyZWFrOwotCQl9Ci0JCXJlYWRlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQkJaWYgKGxvZy0+d19vZmYgIT0gcmVhZGVyLT5yX29mZikKLQkJCXJldCA9IGdldF9lbnRyeV9sZW4obG9nLCByZWFkZXItPnJfb2ZmKTsKLQkJZWxzZQotCQkJcmV0ID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBMT0dHRVJfRkxVU0hfTE9HOgotCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpIHsKLQkJCXJldCA9IC1FQkFERjsKLQkJCWJyZWFrOwotCQl9Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkocmVhZGVyLCAmbG9nLT5yZWFkZXJzLCBsaXN0KQotCQkJcmVhZGVyLT5yX29mZiA9IGxvZy0+d19vZmY7Ci0JCWxvZy0+aGVhZCA9IGxvZy0+d19vZmY7Ci0JCXJldCA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCW11dGV4X3VubG9jaygmbG9nLT5tdXRleCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsb2dnZXJfZm9wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkucmVhZCA9IGxvZ2dlcl9yZWFkLAotCS5haW9fd3JpdGUgPSBsb2dnZXJfYWlvX3dyaXRlLAotCS5wb2xsID0gbG9nZ2VyX3BvbGwsCi0JLnVubG9ja2VkX2lvY3RsID0gbG9nZ2VyX2lvY3RsLAotCS5jb21wYXRfaW9jdGwgPSBsb2dnZXJfaW9jdGwsCi0JLm9wZW4gPSBsb2dnZXJfb3BlbiwKLQkucmVsZWFzZSA9IGxvZ2dlcl9yZWxlYXNlLAotfTsKLQotLyoKLSAqIERlZmluZXMgYSBsb2cgc3RydWN0dXJlIHdpdGggbmFtZSAnTkFNRScgYW5kIGEgc2l6ZSBvZiAnU0laRScgYnl0ZXMsIHdoaWNoCi0gKiBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvLCBncmVhdGVyIHRoYW4gTE9HR0VSX0VOVFJZX01BWF9MRU4sIGFuZCBsZXNzIHRoYW4KLSAqIExPTkdfTUFYIG1pbnVzIExPR0dFUl9FTlRSWV9NQVhfTEVOLgotICovCi0jZGVmaW5lIERFRklORV9MT0dHRVJfREVWSUNFKFZBUiwgTkFNRSwgU0laRSkgXAotc3RhdGljIHVuc2lnbmVkIGNoYXIgX2J1Zl8gIyMgVkFSW1NJWkVdOyBcCi1zdGF0aWMgc3RydWN0IGxvZ2dlcl9sb2cgVkFSID0geyBcCi0JLmJ1ZmZlciA9IF9idWZfICMjIFZBUiwgXAotCS5taXNjID0geyBcCi0JCS5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUiwgXAotCQkubmFtZSA9IE5BTUUsIFwKLQkJLmZvcHMgPSAmbG9nZ2VyX2ZvcHMsIFwKLQkJLnBhcmVudCA9IE5VTEwsIFwKLQl9LCBcCi0JLndxID0gX19XQUlUX1FVRVVFX0hFQURfSU5JVElBTElaRVIoVkFSIC53cSksIFwKLQkucmVhZGVycyA9IExJU1RfSEVBRF9JTklUKFZBUiAucmVhZGVycyksIFwKLQkubXV0ZXggPSBfX01VVEVYX0lOSVRJQUxJWkVSKFZBUiAubXV0ZXgpLCBcCi0JLndfb2ZmID0gMCwgXAotCS5oZWFkID0gMCwgXAotCS5zaXplID0gU0laRSwgXAotfTsKLQotREVGSU5FX0xPR0dFUl9ERVZJQ0UobG9nX21haW4sIExPR0dFUl9MT0dfTUFJTiwgNjQqMTAyNCkKLURFRklORV9MT0dHRVJfREVWSUNFKGxvZ19ldmVudHMsIExPR0dFUl9MT0dfRVZFTlRTLCAyNTYqMTAyNCkKLURFRklORV9MT0dHRVJfREVWSUNFKGxvZ19yYWRpbywgTE9HR0VSX0xPR19SQURJTywgNjQqMTAyNCkKLQotc3RhdGljIHN0cnVjdCBsb2dnZXJfbG9nICpnZXRfbG9nX2Zyb21fbWlub3IoaW50IG1pbm9yKQotewotCWlmIChsb2dfbWFpbi5taXNjLm1pbm9yID09IG1pbm9yKQotCQlyZXR1cm4gJmxvZ19tYWluOwotCWlmIChsb2dfZXZlbnRzLm1pc2MubWlub3IgPT0gbWlub3IpCi0JCXJldHVybiAmbG9nX2V2ZW50czsKLQlpZiAobG9nX3JhZGlvLm1pc2MubWlub3IgPT0gbWlub3IpCi0JCXJldHVybiAmbG9nX3JhZGlvOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X2xvZyhzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZsb2ctPm1pc2MpOwotCWlmICh1bmxpa2VseShyZXQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibG9nZ2VyOiBmYWlsZWQgdG8gcmVnaXN0ZXIgbWlzYyAiCi0JCSAgICAgICAiZGV2aWNlIGZvciBsb2cgJyVzJyFcbiIsIGxvZy0+bWlzYy5uYW1lKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwcmludGsoS0VSTl9JTkZPICJsb2dnZXI6IGNyZWF0ZWQgJWx1SyBsb2cgJyVzJ1xuIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGxvZy0+c2l6ZSA+PiAxMCwgbG9nLT5taXNjLm5hbWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGxvZ2dlcl9pbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IGluaXRfbG9nKCZsb2dfbWFpbik7Ci0JaWYgKHVubGlrZWx5KHJldCkpCi0JCWdvdG8gb3V0OwotCi0JcmV0ID0gaW5pdF9sb2coJmxvZ19ldmVudHMpOwotCWlmICh1bmxpa2VseShyZXQpKQotCQlnb3RvIG91dDsKLQotCXJldCA9IGluaXRfbG9nKCZsb2dfcmFkaW8pOwotCWlmICh1bmxpa2VseShyZXQpKQotCQlnb3RvIG91dDsKLQotb3V0OgotCXJldHVybiByZXQ7Ci19Ci1kZXZpY2VfaW5pdGNhbGwobG9nZ2VyX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG9nZ2VyLmggYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb2dnZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU2MjQzNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb2dnZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qIGluY2x1ZGUvbGludXgvbG9nZ2VyLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBHb29nbGUsIEluYy4KLSAqIEF1dGhvcjogUm9iZXJ0IExvdmUgPHJsb3ZlQGFuZHJvaWQuY29tPgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpZm5kZWYgX0xJTlVYX0xPR0dFUl9ICi0jZGVmaW5lIF9MSU5VWF9MT0dHRVJfSAotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgotCi1zdHJ1Y3QgbG9nZ2VyX2VudHJ5IHsKLQlfX3UxNgkJbGVuOwkvKiBsZW5ndGggb2YgdGhlIHBheWxvYWQgKi8KLQlfX3UxNgkJX19wYWQ7CS8qIG5vIG1hdHRlciB3aGF0LCB3ZSBnZXQgMiBieXRlcyBvZiBwYWRkaW5nICovCi0JX19zMzIJCXBpZDsJLyogZ2VuZXJhdGluZyBwcm9jZXNzJ3MgcGlkICovCi0JX19zMzIJCXRpZDsJLyogZ2VuZXJhdGluZyBwcm9jZXNzJ3MgdGlkICovCi0JX19zMzIJCXNlYzsJLyogc2Vjb25kcyBzaW5jZSBFcG9jaCAqLwotCV9fczMyCQluc2VjOwkvKiBuYW5vc2Vjb25kcyAqLwotCWNoYXIJCW1zZ1swXTsJLyogdGhlIGVudHJ5J3MgcGF5bG9hZCAqLwotfTsKLQotI2RlZmluZSBMT0dHRVJfTE9HX1JBRElPCSJsb2dfcmFkaW8iCS8qIHJhZGlvLXJlbGF0ZWQgbWVzc2FnZXMgKi8KLSNkZWZpbmUgTE9HR0VSX0xPR19FVkVOVFMJImxvZ19ldmVudHMiCS8qIHN5c3RlbS9oYXJkd2FyZSBldmVudHMgKi8KLSNkZWZpbmUgTE9HR0VSX0xPR19NQUlOCQkibG9nX21haW4iCS8qIGV2ZXJ5dGhpbmcgZWxzZSAqLwotCi0jZGVmaW5lIExPR0dFUl9FTlRSWV9NQVhfTEVOCQkoNCoxMDI0KQotI2RlZmluZSBMT0dHRVJfRU5UUllfTUFYX1BBWUxPQUQJXAotCShMT0dHRVJfRU5UUllfTUFYX0xFTiAtIHNpemVvZihzdHJ1Y3QgbG9nZ2VyX2VudHJ5KSkKLQotI2RlZmluZSBfX0xPR0dFUklPCTB4QUUKLQotI2RlZmluZSBMT0dHRVJfR0VUX0xPR19CVUZfU0laRQkJX0lPKF9fTE9HR0VSSU8sIDEpIC8qIHNpemUgb2YgbG9nICovCi0jZGVmaW5lIExPR0dFUl9HRVRfTE9HX0xFTgkJX0lPKF9fTE9HR0VSSU8sIDIpIC8qIHVzZWQgbG9nIGxlbiAqLwotI2RlZmluZSBMT0dHRVJfR0VUX05FWFRfRU5UUllfTEVOCV9JTyhfX0xPR0dFUklPLCAzKSAvKiBuZXh0IGVudHJ5IGxlbiAqLwotI2RlZmluZSBMT0dHRVJfRkxVU0hfTE9HCQlfSU8oX19MT0dHRVJJTywgNCkgLyogZmx1c2ggbG9nICovCi0KLSNlbmRpZiAvKiBfTElOVVhfTE9HR0VSX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2xvd21lbW9yeWtpbGxlci5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG93bWVtb3J5a2lsbGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNWQyODEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG93bWVtb3J5a2lsbGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyogZHJpdmVycy9taXNjL2xvd21lbW9yeWtpbGxlci5jCi0gKgotICogVGhlIGxvd21lbW9yeWtpbGxlciBkcml2ZXIgbGV0cyB1c2VyLXNwYWNlIHNwZWNpZnkgYSBzZXQgb2YgbWVtb3J5IHRocmVzaG9sZHMKLSAqIHdoZXJlIHByb2Nlc3NlcyB3aXRoIGEgcmFuZ2Ugb2Ygb29tX2FkaiB2YWx1ZXMgd2lsbCBnZXQga2lsbGVkLiBTcGVjaWZ5IHRoZQotICogbWluaW11bSBvb21fYWRqIHZhbHVlcyBpbiAvc3lzL21vZHVsZS9sb3dtZW1vcnlraWxsZXIvcGFyYW1ldGVycy9hZGogYW5kIHRoZQotICogbnVtYmVyIG9mIGZyZWUgcGFnZXMgaW4gL3N5cy9tb2R1bGUvbG93bWVtb3J5a2lsbGVyL3BhcmFtZXRlcnMvbWluZnJlZS4gQm90aAotICogZmlsZXMgdGFrZSBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIG51bWJlcnMgaW4gYXNjZW5kaW5nIG9yZGVyLgotICoKLSAqIEZvciBleGFtcGxlLCB3cml0ZSAiMCw4IiB0byAvc3lzL21vZHVsZS9sb3dtZW1vcnlraWxsZXIvcGFyYW1ldGVycy9hZGogYW5kCi0gKiAiMTAyNCw0MDk2IiB0byAvc3lzL21vZHVsZS9sb3dtZW1vcnlraWxsZXIvcGFyYW1ldGVycy9taW5mcmVlIHRvIGtpbGwgcHJvY2Vzc2VzCi0gKiB3aXRoIGEgb29tX2FkaiB2YWx1ZSBvZiA4IG9yIGhpZ2hlciB3aGVuIHRoZSBmcmVlIG1lbW9yeSBkcm9wcyBiZWxvdyA0MDk2IHBhZ2VzCi0gKiBhbmQga2lsbCBwcm9jZXNzZXMgd2l0aCBhIG9vbV9hZGogdmFsdWUgb2YgMCBvciBoaWdoZXIgd2hlbiB0aGUgZnJlZSBtZW1vcnkKLSAqIGRyb3BzIGJlbG93IDEwMjQgcGFnZXMuCi0gKgotICogVGhlIGRyaXZlciBjb25zaWRlcnMgbWVtb3J5IHVzZWQgZm9yIGNhY2hlcyB0byBiZSBmcmVlLCBidXQgaWYgYSBsYXJnZQotICogcGVyY2VudGFnZSBvZiB0aGUgY2FjaGVkIG1lbW9yeSBpcyBsb2NrZWQgdGhpcyBjYW4gYmUgdmVyeSBpbmFjY3VyYXRlCi0gKiBhbmQgcHJvY2Vzc2VzIG1heSBub3QgZ2V0IGtpbGxlZCB1bnRpbCB0aGUgbm9ybWFsIG9vbSBraWxsZXIgaXMgdHJpZ2dlcmVkLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEdvb2dsZSwgSW5jLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L29vbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0KLXN0YXRpYyB1aW50MzJfdCBsb3dtZW1fZGVidWdfbGV2ZWwgPSAyOwotc3RhdGljIGludCBsb3dtZW1fYWRqWzZdID0gewotCTAsCi0JMSwKLQk2LAotCTEyLAotfTsKLXN0YXRpYyBpbnQgbG93bWVtX2Fkal9zaXplID0gNDsKLXN0YXRpYyBzaXplX3QgbG93bWVtX21pbmZyZWVbNl0gPSB7Ci0JMyAqIDUxMiwJLyogNk1CICovCi0JMiAqIDEwMjQsCS8qIDhNQiAqLwotCTQgKiAxMDI0LAkvKiAxNk1CICovCi0JMTYgKiAxMDI0LAkvKiA2NE1CICovCi19Owotc3RhdGljIGludCBsb3dtZW1fbWluZnJlZV9zaXplID0gNDsKLQotI2RlZmluZSBsb3dtZW1fcHJpbnQobGV2ZWwsIHguLi4pCQkJXAotCWRvIHsJCQkJCQlcCi0JCWlmIChsb3dtZW1fZGVidWdfbGV2ZWwgPj0gKGxldmVsKSkJXAotCQkJcHJpbnRrKHgpOwkJCVwKLQl9IHdoaWxlICgwKQotCi1zdGF0aWMgaW50IGxvd21lbV9zaHJpbmsoaW50IG5yX3RvX3NjYW4sIGdmcF90IGdmcF9tYXNrKQotewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnNlbGVjdGVkID0gTlVMTDsKLQlpbnQgcmVtID0gMDsKLQlpbnQgdGFza3NpemU7Ci0JaW50IGk7Ci0JaW50IG1pbl9hZGogPSBPT01fQURKVVNUX01BWCArIDE7Ci0JaW50IHNlbGVjdGVkX3Rhc2tzaXplID0gMDsKLQlpbnQgc2VsZWN0ZWRfb29tX2FkajsKLQlpbnQgYXJyYXlfc2l6ZSA9IEFSUkFZX1NJWkUobG93bWVtX2Fkaik7Ci0JaW50IG90aGVyX2ZyZWUgPSBnbG9iYWxfcGFnZV9zdGF0ZShOUl9GUkVFX1BBR0VTKTsKLQlpbnQgb3RoZXJfZmlsZSA9IGdsb2JhbF9wYWdlX3N0YXRlKE5SX0ZJTEVfUEFHRVMpOwotCi0JaWYgKGxvd21lbV9hZGpfc2l6ZSA8IGFycmF5X3NpemUpCi0JCWFycmF5X3NpemUgPSBsb3dtZW1fYWRqX3NpemU7Ci0JaWYgKGxvd21lbV9taW5mcmVlX3NpemUgPCBhcnJheV9zaXplKQotCQlhcnJheV9zaXplID0gbG93bWVtX21pbmZyZWVfc2l6ZTsKLQlmb3IgKGkgPSAwOyBpIDwgYXJyYXlfc2l6ZTsgaSsrKSB7Ci0JCWlmIChvdGhlcl9mcmVlIDwgbG93bWVtX21pbmZyZWVbaV0gJiYKLQkJICAgIG90aGVyX2ZpbGUgPCBsb3dtZW1fbWluZnJlZVtpXSkgewotCQkJbWluX2FkaiA9IGxvd21lbV9hZGpbaV07Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAobnJfdG9fc2NhbiA+IDApCi0JCWxvd21lbV9wcmludCgzLCAibG93bWVtX3NocmluayAlZCwgJXgsIG9mcmVlICVkICVkLCBtYSAlZFxuIiwKLQkJCSAgICAgbnJfdG9fc2NhbiwgZ2ZwX21hc2ssIG90aGVyX2ZyZWUsIG90aGVyX2ZpbGUsCi0JCQkgICAgIG1pbl9hZGopOwotCXJlbSA9IGdsb2JhbF9wYWdlX3N0YXRlKE5SX0FDVElWRV9BTk9OKSArCi0JCWdsb2JhbF9wYWdlX3N0YXRlKE5SX0FDVElWRV9GSUxFKSArCi0JCWdsb2JhbF9wYWdlX3N0YXRlKE5SX0lOQUNUSVZFX0FOT04pICsKLQkJZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfSU5BQ1RJVkVfRklMRSk7Ci0JaWYgKG5yX3RvX3NjYW4gPD0gMCB8fCBtaW5fYWRqID09IE9PTV9BREpVU1RfTUFYICsgMSkgewotCQlsb3dtZW1fcHJpbnQoNSwgImxvd21lbV9zaHJpbmsgJWQsICV4LCByZXR1cm4gJWRcbiIsCi0JCQkgICAgIG5yX3RvX3NjYW4sIGdmcF9tYXNrLCByZW0pOwotCQlyZXR1cm4gcmVtOwotCX0KLQlzZWxlY3RlZF9vb21fYWRqID0gbWluX2FkajsKLQotCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7Ci0JZm9yX2VhY2hfcHJvY2VzcyhwKSB7Ci0JCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwotCQlpbnQgb29tX2FkajsKLQotCQl0YXNrX2xvY2socCk7Ci0JCW1tID0gcC0+bW07Ci0JCWlmICghbW0pIHsKLQkJCXRhc2tfdW5sb2NrKHApOwotCQkJY29udGludWU7Ci0JCX0KLQkJb29tX2FkaiA9IG1tLT5vb21fYWRqOwotCQlpZiAob29tX2FkaiA8IG1pbl9hZGopIHsKLQkJCXRhc2tfdW5sb2NrKHApOwotCQkJY29udGludWU7Ci0JCX0KLQkJdGFza3NpemUgPSBnZXRfbW1fcnNzKG1tKTsKLQkJdGFza191bmxvY2socCk7Ci0JCWlmICh0YXNrc2l6ZSA8PSAwKQotCQkJY29udGludWU7Ci0JCWlmIChzZWxlY3RlZCkgewotCQkJaWYgKG9vbV9hZGogPCBzZWxlY3RlZF9vb21fYWRqKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKG9vbV9hZGogPT0gc2VsZWN0ZWRfb29tX2FkaiAmJgotCQkJICAgIHRhc2tzaXplIDw9IHNlbGVjdGVkX3Rhc2tzaXplKQotCQkJCWNvbnRpbnVlOwotCQl9Ci0JCXNlbGVjdGVkID0gcDsKLQkJc2VsZWN0ZWRfdGFza3NpemUgPSB0YXNrc2l6ZTsKLQkJc2VsZWN0ZWRfb29tX2FkaiA9IG9vbV9hZGo7Ci0JCWxvd21lbV9wcmludCgyLCAic2VsZWN0ICVkICglcyksIGFkaiAlZCwgc2l6ZSAlZCwgdG8ga2lsbFxuIiwKLQkJCSAgICAgcC0+cGlkLCBwLT5jb21tLCBvb21fYWRqLCB0YXNrc2l6ZSk7Ci0JfQotCWlmIChzZWxlY3RlZCkgewotCQlsb3dtZW1fcHJpbnQoMSwgInNlbmQgc2lna2lsbCB0byAlZCAoJXMpLCBhZGogJWQsIHNpemUgJWRcbiIsCi0JCQkgICAgIHNlbGVjdGVkLT5waWQsIHNlbGVjdGVkLT5jb21tLAotCQkJICAgICBzZWxlY3RlZF9vb21fYWRqLCBzZWxlY3RlZF90YXNrc2l6ZSk7Ci0JCWZvcmNlX3NpZyhTSUdLSUxMLCBzZWxlY3RlZCk7Ci0JCXJlbSAtPSBzZWxlY3RlZF90YXNrc2l6ZTsKLQl9Ci0JbG93bWVtX3ByaW50KDQsICJsb3dtZW1fc2hyaW5rICVkLCAleCwgcmV0dXJuICVkXG4iLAotCQkgICAgIG5yX3RvX3NjYW4sIGdmcF9tYXNrLCByZW0pOwotCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQlyZXR1cm4gcmVtOwotfQotCi1zdGF0aWMgc3RydWN0IHNocmlua2VyIGxvd21lbV9zaHJpbmtlciA9IHsKLQkuc2hyaW5rID0gbG93bWVtX3NocmluaywKLQkuc2Vla3MgPSBERUZBVUxUX1NFRUtTICogMTYKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGxvd21lbV9pbml0KHZvaWQpCi17Ci0JcmVnaXN0ZXJfc2hyaW5rZXIoJmxvd21lbV9zaHJpbmtlcik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBsb3dtZW1fZXhpdCh2b2lkKQotewotCXVucmVnaXN0ZXJfc2hyaW5rZXIoJmxvd21lbV9zaHJpbmtlcik7Ci19Ci0KLW1vZHVsZV9wYXJhbV9uYW1lZChjb3N0LCBsb3dtZW1fc2hyaW5rZXIuc2Vla3MsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOwotbW9kdWxlX3BhcmFtX2FycmF5X25hbWVkKGFkaiwgbG93bWVtX2FkaiwgaW50LCAmbG93bWVtX2Fkal9zaXplLAotCQkJIFNfSVJVR08gfCBTX0lXVVNSKTsKLW1vZHVsZV9wYXJhbV9hcnJheV9uYW1lZChtaW5mcmVlLCBsb3dtZW1fbWluZnJlZSwgdWludCwgJmxvd21lbV9taW5mcmVlX3NpemUsCi0JCQkgU19JUlVHTyB8IFNfSVdVU1IpOwotbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnX2xldmVsLCBsb3dtZW1fZGVidWdfbGV2ZWwsIHVpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKLQotbW9kdWxlX2luaXQobG93bWVtX2luaXQpOwotbW9kdWxlX2V4aXQobG93bWVtX2V4aXQpOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3JhbV9jb25zb2xlLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9yYW1fY29uc29sZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjE4YTU5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3JhbV9jb25zb2xlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTAgKzAsMCBAQAotLyogZHJpdmVycy9hbmRyb2lkL3JhbV9jb25zb2xlLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBHb29nbGUsIEluYy4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0KLSNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCi0jaW5jbHVkZSA8bGludXgvcnNsaWIuaD4KLSNlbmRpZgotCi1zdHJ1Y3QgcmFtX2NvbnNvbGVfYnVmZmVyIHsKLQl1aW50MzJfdCAgICBzaWc7Ci0JdWludDMyX3QgICAgc3RhcnQ7Ci0JdWludDMyX3QgICAgc2l6ZTsKLQl1aW50OF90ICAgICBkYXRhWzBdOwotfTsKLQotI2RlZmluZSBSQU1fQ09OU09MRV9TSUcgKDB4NDM0NzQyNDQpIC8qIERCR0MgKi8KLQotI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX0lOSVQKLXN0YXRpYyBjaGFyIF9faW5pdGRhdGEKLQlyYW1fY29uc29sZV9vbGRfbG9nX2luaXRfYnVmZmVyW0NPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX1NJWkVdOwotI2VuZGlmCi1zdGF0aWMgY2hhciAqcmFtX2NvbnNvbGVfb2xkX2xvZzsKLXN0YXRpYyBzaXplX3QgcmFtX2NvbnNvbGVfb2xkX2xvZ19zaXplOwotCi1zdGF0aWMgc3RydWN0IHJhbV9jb25zb2xlX2J1ZmZlciAqcmFtX2NvbnNvbGVfYnVmZmVyOwotc3RhdGljIHNpemVfdCByYW1fY29uc29sZV9idWZmZXJfc2l6ZTsKLSNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCi1zdGF0aWMgY2hhciAqcmFtX2NvbnNvbGVfcGFyX2J1ZmZlcjsKLXN0YXRpYyBzdHJ1Y3QgcnNfY29udHJvbCAqcmFtX2NvbnNvbGVfcnNfZGVjb2RlcjsKLXN0YXRpYyBpbnQgcmFtX2NvbnNvbGVfY29ycmVjdGVkX2J5dGVzOwotc3RhdGljIGludCByYW1fY29uc29sZV9iYWRfYmxvY2tzOwotI2RlZmluZSBFQ0NfQkxPQ0tfU0laRSBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX0RBVEFfU0laRQotI2RlZmluZSBFQ0NfU0laRSBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX0VDQ19TSVpFCi0jZGVmaW5lIEVDQ19TWU1TSVpFIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fU1lNQk9MX1NJWkUKLSNkZWZpbmUgRUNDX1BPTFkgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTl9QT0xZTk9NSUFMCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KLXN0YXRpYyB2b2lkIHJhbV9jb25zb2xlX2VuY29kZV9yczgodWludDhfdCAqZGF0YSwgc2l6ZV90IGxlbiwgdWludDhfdCAqZWNjKQotewotCWludCBpOwotCXVpbnQxNl90IHBhcltFQ0NfU0laRV07Ci0JLyogSW5pdGlhbGl6ZSB0aGUgcGFyaXR5IGJ1ZmZlciAqLwotCW1lbXNldChwYXIsIDAsIHNpemVvZihwYXIpKTsKLQllbmNvZGVfcnM4KHJhbV9jb25zb2xlX3JzX2RlY29kZXIsIGRhdGEsIGxlbiwgcGFyLCAwKTsKLQlmb3IgKGkgPSAwOyBpIDwgRUNDX1NJWkU7IGkrKykKLQkJZWNjW2ldID0gcGFyW2ldOwotfQotCi1zdGF0aWMgaW50IHJhbV9jb25zb2xlX2RlY29kZV9yczgodm9pZCAqZGF0YSwgc2l6ZV90IGxlbiwgdWludDhfdCAqZWNjKQotewotCWludCBpOwotCXVpbnQxNl90IHBhcltFQ0NfU0laRV07Ci0JZm9yIChpID0gMDsgaSA8IEVDQ19TSVpFOyBpKyspCi0JCXBhcltpXSA9IGVjY1tpXTsKLQlyZXR1cm4gZGVjb2RlX3JzOChyYW1fY29uc29sZV9yc19kZWNvZGVyLCBkYXRhLCBwYXIsIGxlbiwKLQkJCQlOVUxMLCAwLCBOVUxMLCAwLCBOVUxMKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCByYW1fY29uc29sZV91cGRhdGUoY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IGNvdW50KQotewotCXN0cnVjdCByYW1fY29uc29sZV9idWZmZXIgKmJ1ZmZlciA9IHJhbV9jb25zb2xlX2J1ZmZlcjsKLSNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCi0JdWludDhfdCAqYnVmZmVyX2VuZCA9IGJ1ZmZlci0+ZGF0YSArIHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplOwotCXVpbnQ4X3QgKmJsb2NrOwotCXVpbnQ4X3QgKnBhcjsKLQlpbnQgc2l6ZSA9IEVDQ19CTE9DS19TSVpFOwotI2VuZGlmCi0JbWVtY3B5KGJ1ZmZlci0+ZGF0YSArIGJ1ZmZlci0+c3RhcnQsIHMsIGNvdW50KTsKLSNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCi0JYmxvY2sgPSBidWZmZXItPmRhdGEgKyAoYnVmZmVyLT5zdGFydCAmIH4oRUNDX0JMT0NLX1NJWkUgLSAxKSk7Ci0JcGFyID0gcmFtX2NvbnNvbGVfcGFyX2J1ZmZlciArCi0JICAgICAgKGJ1ZmZlci0+c3RhcnQgLyBFQ0NfQkxPQ0tfU0laRSkgKiBFQ0NfU0laRTsKLQlkbyB7Ci0JCWlmIChibG9jayArIEVDQ19CTE9DS19TSVpFID4gYnVmZmVyX2VuZCkKLQkJCXNpemUgPSBidWZmZXJfZW5kIC0gYmxvY2s7Ci0JCXJhbV9jb25zb2xlX2VuY29kZV9yczgoYmxvY2ssIHNpemUsIHBhcik7Ci0JCWJsb2NrICs9IEVDQ19CTE9DS19TSVpFOwotCQlwYXIgKz0gRUNDX1NJWkU7Ci0JfSB3aGlsZSAoYmxvY2sgPCBidWZmZXItPmRhdGEgKyBidWZmZXItPnN0YXJ0ICsgY291bnQpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIHJhbV9jb25zb2xlX3VwZGF0ZV9oZWFkZXIodm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCi0Jc3RydWN0IHJhbV9jb25zb2xlX2J1ZmZlciAqYnVmZmVyID0gcmFtX2NvbnNvbGVfYnVmZmVyOwotCXVpbnQ4X3QgKnBhcjsKLQlwYXIgPSByYW1fY29uc29sZV9wYXJfYnVmZmVyICsKLQkgICAgICBESVZfUk9VTkRfVVAocmFtX2NvbnNvbGVfYnVmZmVyX3NpemUsIEVDQ19CTE9DS19TSVpFKSAqIEVDQ19TSVpFOwotCXJhbV9jb25zb2xlX2VuY29kZV9yczgoKHVpbnQ4X3QgKilidWZmZXIsIHNpemVvZigqYnVmZmVyKSwgcGFyKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotcmFtX2NvbnNvbGVfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvbnNvbGUsIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBjb3VudCkKLXsKLQlpbnQgcmVtOwotCXN0cnVjdCByYW1fY29uc29sZV9idWZmZXIgKmJ1ZmZlciA9IHJhbV9jb25zb2xlX2J1ZmZlcjsKLQotCWlmIChjb3VudCA+IHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplKSB7Ci0JCXMgKz0gY291bnQgLSByYW1fY29uc29sZV9idWZmZXJfc2l6ZTsKLQkJY291bnQgPSByYW1fY29uc29sZV9idWZmZXJfc2l6ZTsKLQl9Ci0JcmVtID0gcmFtX2NvbnNvbGVfYnVmZmVyX3NpemUgLSBidWZmZXItPnN0YXJ0OwotCWlmIChyZW0gPCBjb3VudCkgewotCQlyYW1fY29uc29sZV91cGRhdGUocywgcmVtKTsKLQkJcyArPSByZW07Ci0JCWNvdW50IC09IHJlbTsKLQkJYnVmZmVyLT5zdGFydCA9IDA7Ci0JCWJ1ZmZlci0+c2l6ZSA9IHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplOwotCX0KLQlyYW1fY29uc29sZV91cGRhdGUocywgY291bnQpOwotCi0JYnVmZmVyLT5zdGFydCArPSBjb3VudDsKLQlpZiAoYnVmZmVyLT5zaXplIDwgcmFtX2NvbnNvbGVfYnVmZmVyX3NpemUpCi0JCWJ1ZmZlci0+c2l6ZSArPSBjb3VudDsKLQlyYW1fY29uc29sZV91cGRhdGVfaGVhZGVyKCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY29uc29sZSByYW1fY29uc29sZSA9IHsKLQkubmFtZQk9ICJyYW0iLAotCS53cml0ZQk9IHJhbV9jb25zb2xlX3dyaXRlLAotCS5mbGFncwk9IENPTl9QUklOVEJVRkZFUiB8IENPTl9FTkFCTEVELAotCS5pbmRleAk9IC0xLAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0Ci1yYW1fY29uc29sZV9zYXZlX29sZChzdHJ1Y3QgcmFtX2NvbnNvbGVfYnVmZmVyICpidWZmZXIsIGNoYXIgKmRlc3QpCi17Ci0Jc2l6ZV90IG9sZF9sb2dfc2l6ZSA9IGJ1ZmZlci0+c2l6ZTsKLSNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCi0JdWludDhfdCAqYmxvY2s7Ci0JdWludDhfdCAqcGFyOwotCWNoYXIgc3RyYnVmWzgwXTsKLQlpbnQgc3RyYnVmX2xlbjsKLQotCWJsb2NrID0gYnVmZmVyLT5kYXRhOwotCXBhciA9IHJhbV9jb25zb2xlX3Bhcl9idWZmZXI7Ci0Jd2hpbGUgKGJsb2NrIDwgYnVmZmVyLT5kYXRhICsgYnVmZmVyLT5zaXplKSB7Ci0JCWludCBudW1lcnI7Ci0JCWludCBzaXplID0gRUNDX0JMT0NLX1NJWkU7Ci0JCWlmIChibG9jayArIHNpemUgPiBidWZmZXItPmRhdGEgKyByYW1fY29uc29sZV9idWZmZXJfc2l6ZSkKLQkJCXNpemUgPSBidWZmZXItPmRhdGEgKyByYW1fY29uc29sZV9idWZmZXJfc2l6ZSAtIGJsb2NrOwotCQludW1lcnIgPSByYW1fY29uc29sZV9kZWNvZGVfcnM4KGJsb2NrLCBzaXplLCBwYXIpOwotCQlpZiAobnVtZXJyID4gMCkgewotI2lmIDAKLQkJCXByaW50ayhLRVJOX0lORk8gInJhbV9jb25zb2xlOiBlcnJvciBpbiBibG9jayAlcCwgJWRcbiIsCi0JCQkgICAgICAgYmxvY2ssIG51bWVycik7Ci0jZW5kaWYKLQkJCXJhbV9jb25zb2xlX2NvcnJlY3RlZF9ieXRlcyArPSBudW1lcnI7Ci0JCX0gZWxzZSBpZiAobnVtZXJyIDwgMCkgewotI2lmIDAKLQkJCXByaW50ayhLRVJOX0lORk8gInJhbV9jb25zb2xlOiB1bmNvcnJlY3RhYmxlIGVycm9yIGluICIKLQkJCSAgICAgICAiYmxvY2sgJXBcbiIsIGJsb2NrKTsKLSNlbmRpZgotCQkJcmFtX2NvbnNvbGVfYmFkX2Jsb2NrcysrOwotCQl9Ci0JCWJsb2NrICs9IEVDQ19CTE9DS19TSVpFOwotCQlwYXIgKz0gRUNDX1NJWkU7Ci0JfQotCWlmIChyYW1fY29uc29sZV9jb3JyZWN0ZWRfYnl0ZXMgfHwgcmFtX2NvbnNvbGVfYmFkX2Jsb2NrcykKLQkJc3RyYnVmX2xlbiA9IHNucHJpbnRmKHN0cmJ1Ziwgc2l6ZW9mKHN0cmJ1ZiksCi0JCQkiXG4lZCBDb3JyZWN0ZWQgYnl0ZXMsICVkIHVucmVjb3ZlcmFibGUgYmxvY2tzXG4iLAotCQkJcmFtX2NvbnNvbGVfY29ycmVjdGVkX2J5dGVzLCByYW1fY29uc29sZV9iYWRfYmxvY2tzKTsKLQllbHNlCi0JCXN0cmJ1Zl9sZW4gPSBzbnByaW50ZihzdHJidWYsIHNpemVvZihzdHJidWYpLAotCQkJCSAgICAgICJcbk5vIGVycm9ycyBkZXRlY3RlZFxuIik7Ci0JaWYgKHN0cmJ1Zl9sZW4gPj0gc2l6ZW9mKHN0cmJ1ZikpCi0JCXN0cmJ1Zl9sZW4gPSBzaXplb2Yoc3RyYnVmKSAtIDE7Ci0Jb2xkX2xvZ19zaXplICs9IHN0cmJ1Zl9sZW47Ci0jZW5kaWYKLQotCWlmIChkZXN0ID09IE5VTEwpIHsKLQkJZGVzdCA9IGttYWxsb2Mob2xkX2xvZ19zaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGRlc3QgPT0gTlVMTCkgewotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgInJhbV9jb25zb2xlOiBmYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyXG4iKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCXJhbV9jb25zb2xlX29sZF9sb2cgPSBkZXN0OwotCXJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZSA9IG9sZF9sb2dfc2l6ZTsKLQltZW1jcHkocmFtX2NvbnNvbGVfb2xkX2xvZywKLQkgICAgICAgJmJ1ZmZlci0+ZGF0YVtidWZmZXItPnN0YXJ0XSwgYnVmZmVyLT5zaXplIC0gYnVmZmVyLT5zdGFydCk7Ci0JbWVtY3B5KHJhbV9jb25zb2xlX29sZF9sb2cgKyBidWZmZXItPnNpemUgLSBidWZmZXItPnN0YXJ0LAotCSAgICAgICAmYnVmZmVyLT5kYXRhWzBdLCBidWZmZXItPnN0YXJ0KTsKLSNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCi0JbWVtY3B5KHJhbV9jb25zb2xlX29sZF9sb2cgKyBvbGRfbG9nX3NpemUgLSBzdHJidWZfbGVuLAotCSAgICAgICBzdHJidWYsIHN0cmJ1Zl9sZW4pOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHJhbV9jb25zb2xlX2luaXQoc3RydWN0IHJhbV9jb25zb2xlX2J1ZmZlciAqYnVmZmVyLAotCQkJCSAgIHNpemVfdCBidWZmZXJfc2l6ZSwgY2hhciAqb2xkX2J1ZikKLXsKLSNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCi0JaW50IG51bWVycjsKLQl1aW50OF90ICpwYXI7Ci0jZW5kaWYKLQlyYW1fY29uc29sZV9idWZmZXIgPSBidWZmZXI7Ci0JcmFtX2NvbnNvbGVfYnVmZmVyX3NpemUgPQotCQlidWZmZXJfc2l6ZSAtIHNpemVvZihzdHJ1Y3QgcmFtX2NvbnNvbGVfYnVmZmVyKTsKLQotCWlmIChyYW1fY29uc29sZV9idWZmZXJfc2l6ZSA+IGJ1ZmZlcl9zaXplKSB7Ci0JCXByX2VycigicmFtX2NvbnNvbGU6IGJ1ZmZlciAlcCwgaW52YWxpZCBzaXplICV6dSwgIgotCQkgICAgICAgImRhdGFzaXplICV6dVxuIiwgYnVmZmVyLCBidWZmZXJfc2l6ZSwKLQkJICAgICAgIHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0jaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgotCXJhbV9jb25zb2xlX2J1ZmZlcl9zaXplIC09IChESVZfUk9VTkRfVVAocmFtX2NvbnNvbGVfYnVmZmVyX3NpemUsCi0JCQkJCQlFQ0NfQkxPQ0tfU0laRSkgKyAxKSAqIEVDQ19TSVpFOwotCi0JaWYgKHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplID4gYnVmZmVyX3NpemUpIHsKLQkJcHJfZXJyKCJyYW1fY29uc29sZTogYnVmZmVyICVwLCBpbnZhbGlkIHNpemUgJXp1LCAiCi0JCSAgICAgICAibm9uLWVjYyBkYXRhc2l6ZSAlenVcbiIsCi0JCSAgICAgICBidWZmZXIsIGJ1ZmZlcl9zaXplLCByYW1fY29uc29sZV9idWZmZXJfc2l6ZSk7Ci0JCXJldHVybiAwOwotCX0KLQotCXJhbV9jb25zb2xlX3Bhcl9idWZmZXIgPSBidWZmZXItPmRhdGEgKyByYW1fY29uc29sZV9idWZmZXJfc2l6ZTsKLQotCi0JLyogZmlyc3QgY29uc2VjdXRpdmUgcm9vdCBpcyAwCi0JICogcHJpbWl0aXZlIGVsZW1lbnQgdG8gZ2VuZXJhdGUgcm9vdHMgPSAxCi0JICovCi0JcmFtX2NvbnNvbGVfcnNfZGVjb2RlciA9IGluaXRfcnMoRUNDX1NZTVNJWkUsIEVDQ19QT0xZLCAwLCAxLCBFQ0NfU0laRSk7Ci0JaWYgKHJhbV9jb25zb2xlX3JzX2RlY29kZXIgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9JTkZPICJyYW1fY29uc29sZTogaW5pdF9ycyBmYWlsZWRcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyYW1fY29uc29sZV9jb3JyZWN0ZWRfYnl0ZXMgPSAwOwotCXJhbV9jb25zb2xlX2JhZF9ibG9ja3MgPSAwOwotCi0JcGFyID0gcmFtX2NvbnNvbGVfcGFyX2J1ZmZlciArCi0JICAgICAgRElWX1JPVU5EX1VQKHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplLCBFQ0NfQkxPQ0tfU0laRSkgKiBFQ0NfU0laRTsKLQotCW51bWVyciA9IHJhbV9jb25zb2xlX2RlY29kZV9yczgoYnVmZmVyLCBzaXplb2YoKmJ1ZmZlciksIHBhcik7Ci0JaWYgKG51bWVyciA+IDApIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAicmFtX2NvbnNvbGU6IGVycm9yIGluIGhlYWRlciwgJWRcbiIsIG51bWVycik7Ci0JCXJhbV9jb25zb2xlX2NvcnJlY3RlZF9ieXRlcyArPSBudW1lcnI7Ci0JfSBlbHNlIGlmIChudW1lcnIgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8KLQkJICAgICAgICJyYW1fY29uc29sZTogdW5jb3JyZWN0YWJsZSBlcnJvciBpbiBoZWFkZXJcbiIpOwotCQlyYW1fY29uc29sZV9iYWRfYmxvY2tzKys7Ci0JfQotI2VuZGlmCi0KLQlpZiAoYnVmZmVyLT5zaWcgPT0gUkFNX0NPTlNPTEVfU0lHKSB7Ci0JCWlmIChidWZmZXItPnNpemUgPiByYW1fY29uc29sZV9idWZmZXJfc2l6ZQotCQkgICAgfHwgYnVmZmVyLT5zdGFydCA+IGJ1ZmZlci0+c2l6ZSkKLQkJCXByaW50ayhLRVJOX0lORk8gInJhbV9jb25zb2xlOiBmb3VuZCBleGlzdGluZyBpbnZhbGlkICIKLQkJCSAgICAgICAiYnVmZmVyLCBzaXplICVkLCBzdGFydCAlZFxuIiwKLQkJCSAgICAgICBidWZmZXItPnNpemUsIGJ1ZmZlci0+c3RhcnQpOwotCQllbHNlIHsKLQkJCXByaW50ayhLRVJOX0lORk8gInJhbV9jb25zb2xlOiBmb3VuZCBleGlzdGluZyBidWZmZXIsICIKLQkJCSAgICAgICAic2l6ZSAlZCwgc3RhcnQgJWRcbiIsCi0JCQkgICAgICAgYnVmZmVyLT5zaXplLCBidWZmZXItPnN0YXJ0KTsKLQkJCXJhbV9jb25zb2xlX3NhdmVfb2xkKGJ1ZmZlciwgb2xkX2J1Zik7Ci0JCX0KLQl9IGVsc2UgewotCQlwcmludGsoS0VSTl9JTkZPICJyYW1fY29uc29sZTogbm8gdmFsaWQgZGF0YSBpbiBidWZmZXIgIgotCQkgICAgICAgIihzaWcgPSAweCUwOHgpXG4iLCBidWZmZXItPnNpZyk7Ci0JfQotCi0JYnVmZmVyLT5zaWcgPSBSQU1fQ09OU09MRV9TSUc7Ci0JYnVmZmVyLT5zdGFydCA9IDA7Ci0JYnVmZmVyLT5zaXplID0gMDsKLQotCXJlZ2lzdGVyX2NvbnNvbGUoJnJhbV9jb25zb2xlKTsKLSNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FTkFCTEVfVkVSQk9TRQotCWNvbnNvbGVfdmVyYm9zZSgpOwotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FQVJMWV9JTklUCi1zdGF0aWMgaW50IF9faW5pdCByYW1fY29uc29sZV9lYXJseV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHJhbV9jb25zb2xlX2luaXQoKHN0cnVjdCByYW1fY29uc29sZV9idWZmZXIgKikKLQkJQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfQUREUiwKLQkJQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfU0laRSwKLQkJcmFtX2NvbnNvbGVfb2xkX2xvZ19pbml0X2J1ZmZlcik7Ci19Ci0jZWxzZQotc3RhdGljIGludCByYW1fY29uc29sZV9kcml2ZXJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IHBkZXYtPnJlc291cmNlOwotCXNpemVfdCBzdGFydDsKLQlzaXplX3QgYnVmZmVyX3NpemU7Ci0Jdm9pZCAqYnVmZmVyOwotCi0JaWYgKHJlcyA9PSBOVUxMIHx8IHBkZXYtPm51bV9yZXNvdXJjZXMgIT0gMSB8fAotCSAgICAhKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJyYW1fY29uc29sZTogaW52YWxpZCByZXNvdXJjZSwgJXAgJWQgZmxhZ3MgIgotCQkgICAgICAgIiVseFxuIiwgcmVzLCBwZGV2LT5udW1fcmVzb3VyY2VzLCByZXMgPyByZXMtPmZsYWdzIDogMCk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCWJ1ZmZlcl9zaXplID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKLQlzdGFydCA9IHJlcy0+c3RhcnQ7Ci0JcHJpbnRrKEtFUk5fSU5GTyAicmFtX2NvbnNvbGU6IGdvdCBidWZmZXIgYXQgJXp4LCBzaXplICV6eFxuIiwKLQkgICAgICAgc3RhcnQsIGJ1ZmZlcl9zaXplKTsKLQlidWZmZXIgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIGJ1ZmZlcl9zaXplKTsKLQlpZiAoYnVmZmVyID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJyYW1fY29uc29sZTogZmFpbGVkIHRvIG1hcCBtZW1vcnlcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlyZXR1cm4gcmFtX2NvbnNvbGVfaW5pdChidWZmZXIsIGJ1ZmZlcl9zaXplLCBOVUxMLyogYWxsb2NhdGUgKi8pOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciByYW1fY29uc29sZV9kcml2ZXIgPSB7Ci0JLnByb2JlID0gcmFtX2NvbnNvbGVfZHJpdmVyX3Byb2JlLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJyYW1fY29uc29sZSIsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHJhbV9jb25zb2xlX21vZHVsZV9pbml0KHZvaWQpCi17Ci0JaW50IGVycjsKLQllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnJhbV9jb25zb2xlX2RyaXZlcik7Ci0JcmV0dXJuIGVycjsKLX0KLSNlbmRpZgotCi1zdGF0aWMgc3NpemVfdCByYW1fY29uc29sZV9yZWFkX29sZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQkgICAgc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpCi17Ci0JbG9mZl90IHBvcyA9ICpvZmZzZXQ7Ci0Jc3NpemVfdCBjb3VudDsKLQotCWlmIChwb3MgPj0gcmFtX2NvbnNvbGVfb2xkX2xvZ19zaXplKQotCQlyZXR1cm4gMDsKLQotCWNvdW50ID0gbWluKGxlbiwgKHNpemVfdCkocmFtX2NvbnNvbGVfb2xkX2xvZ19zaXplIC0gcG9zKSk7Ci0JaWYgKGNvcHlfdG9fdXNlcihidWYsIHJhbV9jb25zb2xlX29sZF9sb2cgKyBwb3MsIGNvdW50KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkqb2Zmc2V0ICs9IGNvdW50OwotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmFtX2NvbnNvbGVfZmlsZV9vcHMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLnJlYWQgPSByYW1fY29uc29sZV9yZWFkX29sZCwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHJhbV9jb25zb2xlX2xhdGVfaW5pdCh2b2lkKQotewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50cnk7Ci0KLQlpZiAocmFtX2NvbnNvbGVfb2xkX2xvZyA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLSNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FQVJMWV9JTklUCi0JcmFtX2NvbnNvbGVfb2xkX2xvZyA9IGttYWxsb2MocmFtX2NvbnNvbGVfb2xkX2xvZ19zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAocmFtX2NvbnNvbGVfb2xkX2xvZyA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgInJhbV9jb25zb2xlOiBmYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIGZvciBvbGQgbG9nXG4iKTsKLQkJcmFtX2NvbnNvbGVfb2xkX2xvZ19zaXplID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotCW1lbWNweShyYW1fY29uc29sZV9vbGRfbG9nLAotCSAgICAgICByYW1fY29uc29sZV9vbGRfbG9nX2luaXRfYnVmZmVyLCByYW1fY29uc29sZV9vbGRfbG9nX3NpemUpOwotI2VuZGlmCi0JZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgibGFzdF9rbXNnIiwgU19JRlJFRyB8IFNfSVJVR08sIE5VTEwpOwotCWlmICghZW50cnkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJyYW1fY29uc29sZTogZmFpbGVkIHRvIGNyZWF0ZSBwcm9jIGVudHJ5XG4iKTsKLQkJa2ZyZWUocmFtX2NvbnNvbGVfb2xkX2xvZyk7Ci0JCXJhbV9jb25zb2xlX29sZF9sb2cgPSBOVUxMOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQllbnRyeS0+cHJvY19mb3BzID0gJnJhbV9jb25zb2xlX2ZpbGVfb3BzOwotCWVudHJ5LT5zaXplID0gcmFtX2NvbnNvbGVfb2xkX2xvZ19zaXplOwotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfSU5JVAotY29uc29sZV9pbml0Y2FsbChyYW1fY29uc29sZV9lYXJseV9pbml0KTsKLSNlbHNlCi1tb2R1bGVfaW5pdChyYW1fY29uc29sZV9tb2R1bGVfaW5pdCk7Ci0jZW5kaWYKLWxhdGVfaW5pdGNhbGwocmFtX2NvbnNvbGVfbGF0ZV9pbml0KTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfZ3Bpby5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfZ3Bpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTdjZGFhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RpbWVkX2dwaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKiBkcml2ZXJzL21pc2MvdGltZWRfZ3Bpby5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICogQXV0aG9yOiBNaWtlIExvY2t3b29kIDxsb2Nrd29vZEBhbmRyb2lkLmNvbT4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLQotI2luY2x1ZGUgInRpbWVkX291dHB1dC5oIgotI2luY2x1ZGUgInRpbWVkX2dwaW8uaCIKLQotCi1zdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhIHsKLQlzdHJ1Y3QgdGltZWRfb3V0cHV0X2RldiBkZXY7Ci0Jc3RydWN0IGhydGltZXIgdGltZXI7Ci0Jc3BpbmxvY2tfdCBsb2NrOwotCXVuc2lnbmVkIAlncGlvOwotCWludCAJCW1heF90aW1lb3V0OwotCXU4IAkJYWN0aXZlX2xvdzsKLX07Ci0KLXN0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydCBncGlvX3RpbWVyX2Z1bmMoc3RydWN0IGhydGltZXIgKnRpbWVyKQotewotCXN0cnVjdCB0aW1lZF9ncGlvX2RhdGEgKmRhdGEgPQotCQljb250YWluZXJfb2YodGltZXIsIHN0cnVjdCB0aW1lZF9ncGlvX2RhdGEsIHRpbWVyKTsKLQotCWdwaW9fZGlyZWN0aW9uX291dHB1dChkYXRhLT5ncGlvLCBkYXRhLT5hY3RpdmVfbG93ID8gMSA6IDApOwotCXJldHVybiBIUlRJTUVSX05PUkVTVEFSVDsKLX0KLQotc3RhdGljIGludCBncGlvX2dldF90aW1lKHN0cnVjdCB0aW1lZF9vdXRwdXRfZGV2ICpkZXYpCi17Ci0Jc3RydWN0IHRpbWVkX2dwaW9fZGF0YQkqZGF0YSA9Ci0JCWNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB0aW1lZF9ncGlvX2RhdGEsIGRldik7Ci0KLQlpZiAoaHJ0aW1lcl9hY3RpdmUoJmRhdGEtPnRpbWVyKSkgewotCQlrdGltZV90IHIgPSBocnRpbWVyX2dldF9yZW1haW5pbmcoJmRhdGEtPnRpbWVyKTsKLQkJc3RydWN0IHRpbWV2YWwgdCA9IGt0aW1lX3RvX3RpbWV2YWwocik7Ci0JCXJldHVybiB0LnR2X3NlYyAqIDEwMDAgKyB0LnR2X3VzZWMgLyAxMDAwOwotCX0gZWxzZQotCQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZ3Bpb19lbmFibGUoc3RydWN0IHRpbWVkX291dHB1dF9kZXYgKmRldiwgaW50IHZhbHVlKQotewotCXN0cnVjdCB0aW1lZF9ncGlvX2RhdGEJKmRhdGEgPQotCQljb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhLCBkZXYpOwotCXVuc2lnbmVkIGxvbmcJZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGF0YS0+bG9jaywgZmxhZ3MpOwotCi0JLyogY2FuY2VsIHByZXZpb3VzIHRpbWVyIGFuZCBzZXQgR1BJTyBhY2NvcmRpbmcgdG8gdmFsdWUgKi8KLQlocnRpbWVyX2NhbmNlbCgmZGF0YS0+dGltZXIpOwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChkYXRhLT5ncGlvLCBkYXRhLT5hY3RpdmVfbG93ID8gIXZhbHVlIDogISF2YWx1ZSk7Ci0KLQlpZiAodmFsdWUgPiAwKSB7Ci0JCWlmICh2YWx1ZSA+IGRhdGEtPm1heF90aW1lb3V0KQotCQkJdmFsdWUgPSBkYXRhLT5tYXhfdGltZW91dDsKLQotCQlocnRpbWVyX3N0YXJ0KCZkYXRhLT50aW1lciwKLQkJCWt0aW1lX3NldCh2YWx1ZSAvIDEwMDAsICh2YWx1ZSAlIDEwMDApICogMTAwMDAwMCksCi0JCQlIUlRJTUVSX01PREVfUkVMKTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXRhLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgdGltZWRfZ3Bpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCB0aW1lZF9ncGlvX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IHRpbWVkX2dwaW8gKmN1cl9ncGlvOwotCXN0cnVjdCB0aW1lZF9ncGlvX2RhdGEgKmdwaW9fZGF0YSwgKmdwaW9fZGF0OwotCWludCBpLCBqLCByZXQgPSAwOwotCi0JaWYgKCFwZGF0YSkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCWdwaW9fZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0aW1lZF9ncGlvX2RhdGEpICogcGRhdGEtPm51bV9ncGlvcywKLQkJCUdGUF9LRVJORUwpOwotCWlmICghZ3Bpb19kYXRhKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnVtX2dwaW9zOyBpKyspIHsKLQkJY3VyX2dwaW8gPSAmcGRhdGEtPmdwaW9zW2ldOwotCQlncGlvX2RhdCA9ICZncGlvX2RhdGFbaV07Ci0KLQkJaHJ0aW1lcl9pbml0KCZncGlvX2RhdC0+dGltZXIsIENMT0NLX01PTk9UT05JQywKLQkJCQlIUlRJTUVSX01PREVfUkVMKTsKLQkJZ3Bpb19kYXQtPnRpbWVyLmZ1bmN0aW9uID0gZ3Bpb190aW1lcl9mdW5jOwotCQlzcGluX2xvY2tfaW5pdCgmZ3Bpb19kYXQtPmxvY2spOwotCi0JCWdwaW9fZGF0LT5kZXYubmFtZSA9IGN1cl9ncGlvLT5uYW1lOwotCQlncGlvX2RhdC0+ZGV2LmdldF90aW1lID0gZ3Bpb19nZXRfdGltZTsKLQkJZ3Bpb19kYXQtPmRldi5lbmFibGUgPSBncGlvX2VuYWJsZTsKLQkJcmV0ID0gdGltZWRfb3V0cHV0X2Rldl9yZWdpc3RlcigmZ3Bpb19kYXQtPmRldik7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQotCQkJCXRpbWVkX291dHB1dF9kZXZfdW5yZWdpc3RlcigmZ3Bpb19kYXRhW2ldLmRldik7Ci0JCQlrZnJlZShncGlvX2RhdGEpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCWdwaW9fZGF0LT5ncGlvID0gY3VyX2dwaW8tPmdwaW87Ci0JCWdwaW9fZGF0LT5tYXhfdGltZW91dCA9IGN1cl9ncGlvLT5tYXhfdGltZW91dDsKLQkJZ3Bpb19kYXQtPmFjdGl2ZV9sb3cgPSBjdXJfZ3Bpby0+YWN0aXZlX2xvdzsKLQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW9fZGF0LT5ncGlvLCBncGlvX2RhdC0+YWN0aXZlX2xvdyk7Ci0JfQotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZ3Bpb19kYXRhKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRpbWVkX2dwaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHRpbWVkX2dwaW9fcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhICpncGlvX2RhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnVtX2dwaW9zOyBpKyspCi0JCXRpbWVkX291dHB1dF9kZXZfdW5yZWdpc3RlcigmZ3Bpb19kYXRhW2ldLmRldik7Ci0KLQlrZnJlZShncGlvX2RhdGEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHRpbWVkX2dwaW9fZHJpdmVyID0gewotCS5wcm9iZQkJPSB0aW1lZF9ncGlvX3Byb2JlLAotCS5yZW1vdmUJCT0gdGltZWRfZ3Bpb19yZW1vdmUsCi0JLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCQk9IFRJTUVEX0dQSU9fTkFNRSwKLQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCB0aW1lZF9ncGlvX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ0aW1lZF9ncGlvX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB0aW1lZF9ncGlvX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdGltZWRfZ3Bpb19kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdCh0aW1lZF9ncGlvX2luaXQpOwotbW9kdWxlX2V4aXQodGltZWRfZ3Bpb19leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiTWlrZSBMb2Nrd29vZCA8bG9ja3dvb2RAYW5kcm9pZC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oInRpbWVkIGdwaW8gZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9ncGlvLmggYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9ncGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZTE1ZjguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfZ3Bpby5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyogaW5jbHVkZS9saW51eC90aW1lZF9ncGlvLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0qLwotCi0jaWZuZGVmIF9MSU5VWF9USU1FRF9HUElPX0gKLSNkZWZpbmUgX0xJTlVYX1RJTUVEX0dQSU9fSAotCi0jZGVmaW5lIFRJTUVEX0dQSU9fTkFNRSAidGltZWQtZ3BpbyIKLQotc3RydWN0IHRpbWVkX2dwaW8gewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JdW5zaWduZWQgCWdwaW87Ci0JaW50CQltYXhfdGltZW91dDsKLQl1OCAJCWFjdGl2ZV9sb3c7Ci19OwotCi1zdHJ1Y3QgdGltZWRfZ3Bpb19wbGF0Zm9ybV9kYXRhIHsKLQlpbnQgCQludW1fZ3Bpb3M7Ci0Jc3RydWN0IHRpbWVkX2dwaW8gKmdwaW9zOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9vdXRwdXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RpbWVkX291dHB1dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmU3OTE4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RpbWVkX291dHB1dC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qIGRyaXZlcnMvbWlzYy90aW1lZF9vdXRwdXQuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUsIEluYy4KLSAqIEF1dGhvcjogTWlrZSBMb2Nrd29vZCA8bG9ja3dvb2RAYW5kcm9pZC5jb20+Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLQotI2luY2x1ZGUgInRpbWVkX291dHB1dC5oIgotCi1zdGF0aWMgc3RydWN0IGNsYXNzICp0aW1lZF9vdXRwdXRfY2xhc3M7Ci1zdGF0aWMgYXRvbWljX3QgZGV2aWNlX2NvdW50OwotCi1zdGF0aWMgc3NpemVfdCBlbmFibGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYpCi17Ci0Jc3RydWN0IHRpbWVkX291dHB1dF9kZXYgKnRkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpbnQgcmVtYWluaW5nID0gdGRldi0+Z2V0X3RpbWUodGRldik7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcmVtYWluaW5nKTsKLX0KLQotc3RhdGljIHNzaXplX3QgZW5hYmxlX3N0b3JlKAotCQlzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQotewotCXN0cnVjdCB0aW1lZF9vdXRwdXRfZGV2ICp0ZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IHZhbHVlOwotCi0Jc3NjYW5mKGJ1ZiwgIiVkIiwgJnZhbHVlKTsKLQl0ZGV2LT5lbmFibGUodGRldiwgdmFsdWUpOwotCi0JcmV0dXJuIHNpemU7Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihlbmFibGUsIFNfSVJVR08gfCBTX0lXVVNSLCBlbmFibGVfc2hvdywgZW5hYmxlX3N0b3JlKTsKLQotc3RhdGljIGludCBjcmVhdGVfdGltZWRfb3V0cHV0X2NsYXNzKHZvaWQpCi17Ci0JaWYgKCF0aW1lZF9vdXRwdXRfY2xhc3MpIHsKLQkJdGltZWRfb3V0cHV0X2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAidGltZWRfb3V0cHV0Iik7Ci0JCWlmIChJU19FUlIodGltZWRfb3V0cHV0X2NsYXNzKSkKLQkJCXJldHVybiBQVFJfRVJSKHRpbWVkX291dHB1dF9jbGFzcyk7Ci0JCWF0b21pY19zZXQoJmRldmljZV9jb3VudCwgMCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCB0aW1lZF9vdXRwdXRfZGV2X3JlZ2lzdGVyKHN0cnVjdCB0aW1lZF9vdXRwdXRfZGV2ICp0ZGV2KQotewotCWludCByZXQ7Ci0KLQlpZiAoIXRkZXYgfHwgIXRkZXYtPm5hbWUgfHwgIXRkZXYtPmVuYWJsZSB8fCAhdGRldi0+Z2V0X3RpbWUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0ID0gY3JlYXRlX3RpbWVkX291dHB1dF9jbGFzcygpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JdGRldi0+aW5kZXggPSBhdG9taWNfaW5jX3JldHVybigmZGV2aWNlX2NvdW50KTsKLQl0ZGV2LT5kZXYgPSBkZXZpY2VfY3JlYXRlKHRpbWVkX291dHB1dF9jbGFzcywgTlVMTCwKLQkJTUtERVYoMCwgdGRldi0+aW5kZXgpLCBOVUxMLCB0ZGV2LT5uYW1lKTsKLQlpZiAoSVNfRVJSKHRkZXYtPmRldikpCi0JCXJldHVybiBQVFJfRVJSKHRkZXYtPmRldik7Ci0KLQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUodGRldi0+ZGV2LCAmZGV2X2F0dHJfZW5hYmxlKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJfY3JlYXRlX2ZpbGU7Ci0KLQlkZXZfc2V0X2RydmRhdGEodGRldi0+ZGV2LCB0ZGV2KTsKLQl0ZGV2LT5zdGF0ZSA9IDA7Ci0JcmV0dXJuIDA7Ci0KLWVycl9jcmVhdGVfZmlsZToKLQlkZXZpY2VfZGVzdHJveSh0aW1lZF9vdXRwdXRfY2xhc3MsIE1LREVWKDAsIHRkZXYtPmluZGV4KSk7Ci0JcHJpbnRrKEtFUk5fRVJSICJ0aW1lZF9vdXRwdXQ6IEZhaWxlZCB0byByZWdpc3RlciBkcml2ZXIgJXNcbiIsCi0JCQl0ZGV2LT5uYW1lKTsKLQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh0aW1lZF9vdXRwdXRfZGV2X3JlZ2lzdGVyKTsKLQotdm9pZCB0aW1lZF9vdXRwdXRfZGV2X3VucmVnaXN0ZXIoc3RydWN0IHRpbWVkX291dHB1dF9kZXYgKnRkZXYpCi17Ci0JZGV2aWNlX3JlbW92ZV9maWxlKHRkZXYtPmRldiwgJmRldl9hdHRyX2VuYWJsZSk7Ci0JZGV2aWNlX2Rlc3Ryb3kodGltZWRfb3V0cHV0X2NsYXNzLCBNS0RFVigwLCB0ZGV2LT5pbmRleCkpOwotCWRldl9zZXRfZHJ2ZGF0YSh0ZGV2LT5kZXYsIE5VTEwpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodGltZWRfb3V0cHV0X2Rldl91bnJlZ2lzdGVyKTsKLQotc3RhdGljIGludCBfX2luaXQgdGltZWRfb3V0cHV0X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gY3JlYXRlX3RpbWVkX291dHB1dF9jbGFzcygpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdGltZWRfb3V0cHV0X2V4aXQodm9pZCkKLXsKLQljbGFzc19kZXN0cm95KHRpbWVkX291dHB1dF9jbGFzcyk7Ci19Ci0KLW1vZHVsZV9pbml0KHRpbWVkX291dHB1dF9pbml0KTsKLW1vZHVsZV9leGl0KHRpbWVkX291dHB1dF9leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiTWlrZSBMb2Nrd29vZCA8bG9ja3dvb2RAYW5kcm9pZC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oInRpbWVkIG91dHB1dCBjbGFzcyBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RpbWVkX291dHB1dC5oIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfb3V0cHV0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOTA3YWIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfb3V0cHV0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKiBpbmNsdWRlL2xpbnV4L3RpbWVkX291dHB1dC5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotKi8KLQotI2lmbmRlZiBfTElOVVhfVElNRURfT1VUUFVUX0gKLSNkZWZpbmUgX0xJTlVYX1RJTUVEX09VVFBVVF9ICi0KLXN0cnVjdCB0aW1lZF9vdXRwdXRfZGV2IHsKLQljb25zdCBjaGFyCSpuYW1lOwotCi0JLyogZW5hYmxlIHRoZSBvdXRwdXQgYW5kIHNldCB0aGUgdGltZXIgKi8KLQl2b2lkCSgqZW5hYmxlKShzdHJ1Y3QgdGltZWRfb3V0cHV0X2RldiAqc2RldiwgaW50IHRpbWVvdXQpOwotCi0JLyogcmV0dXJucyB0aGUgY3VycmVudCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHJlbWFpbmluZyBvbiB0aGUgdGltZXIgKi8KLQlpbnQJCSgqZ2V0X3RpbWUpKHN0cnVjdCB0aW1lZF9vdXRwdXRfZGV2ICpzZGV2KTsKLQotCS8qIHByaXZhdGUgZGF0YSAqLwotCXN0cnVjdCBkZXZpY2UJKmRldjsKLQlpbnQJCWluZGV4OwotCWludAkJc3RhdGU7Ci19OwotCi1leHRlcm4gaW50IHRpbWVkX291dHB1dF9kZXZfcmVnaXN0ZXIoc3RydWN0IHRpbWVkX291dHB1dF9kZXYgKmRldik7Ci1leHRlcm4gdm9pZCB0aW1lZF9vdXRwdXRfZGV2X3VucmVnaXN0ZXIoc3RydWN0IHRpbWVkX291dHB1dF9kZXYgKmRldik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2IzZGZnL2IzZGZnLmMgYi9kcml2ZXJzL3N0YWdpbmcvYjNkZmcvYjNkZmcuYwppbmRleCBjZGEyNmJiNC4uNGE0M2M1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2IzZGZnL2IzZGZnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2IzZGZnL2IzZGZnLmMKQEAgLTQ2OCw3ICs0NjgsNiBAQAogCiBzdGF0aWMgaW50IGVuYWJsZV90cmFuc21pc3Npb24oc3RydWN0IGIzZGZnX2RldiAqZmdkZXYpCiB7Ci0JdTE2IGNvbW1hbmQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZmdkZXYtPnBkZXYtPmRldjsKIApAQCAtNDgwLDE3ICs0NzksNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQkvKgotCSAqIENoZWNrIHdlJ3JlIGEgYnVzIG1hc3Rlci4KLQkgKiBUT0RPOiBJIHRoaW5rIHdlIGNhbiByZW1vdmUgdGhpcyBoYXZpbmcgYWRkZWQgdGhlIHBjaV9zZXRfbWFzdGVyIGNhbGwKLQkgKi8KLQlwY2lfcmVhZF9jb25maWdfd29yZChmZ2Rldi0+cGRldiwgUENJX0NPTU1BTkQsICZjb21tYW5kKTsKLQlpZiAoIShjb21tYW5kICYgUENJX0NPTU1BTkRfTUFTVEVSKSkgewotCQlkZXZfZXJyKGRldiwgIm5vdCBhIGJ1cyBtYXN0ZXIsIGZvcmNlLWVuYWJsaW5nXG4iKTsKLQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGZnZGV2LT5wZGV2LCBQQ0lfQ09NTUFORCwKLQkJCWNvbW1hbmQgfCBQQ0lfQ09NTUFORF9NQVNURVIpOwotCX0KLQogCXNwaW5fbG9ja19pcnFzYXZlKCZmZ2Rldi0+YnVmZmVyX2xvY2ssIGZsYWdzKTsKIAogCS8qIEhhbmRsZSByYWNpbmcgZW5hYmxlX3RyYW5zbWlzc2lvbiBjYWxscy4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L0NIQU5HRUxPRyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L0NIQU5HRUxPRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTE4MTYzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvQ0hBTkdFTE9HCkBAIC0wLDAgKzEsMzcgQEAKK2JhdG1hbi1hZHYgMC4yOgorCisqIHN1cHBvcnQgbGF0ZXN0IGtlcm5lbHMgKDIuNi4yMCAtIDIuNi4zMSkKKyogdGVtcG9yYXJ5IHJvdXRpbmcgbG9vcHMgLyBUVEwgY29kZSBidWcgLyBnaG9zdCBlbnRyaWVzIGluIG9yaWdpbmF0b3IgdGFibGUgZml4ZWQKKyogaW50ZXJuYWwgcGFja2V0IHF1ZXVlIGZvciBwYWNrZXQgYWdncmVnYXRpb24gJiB0cmFuc21pc3Npb24gcmV0cnkgKEFSUSkKKyAgZm9yIHBheWxvYWQgYnJvYWRjYXN0cyBhZGRlZAorKiBpbnRlcmZhY2UgZGV0ZWN0aW9uIGNvbnZlcnRlZCB0byBldmVudCBiYXNlZCBoYW5kbGluZyB0byBhdm9pZCB0aW1lcnMKKyogbWFqb3IgbGludXggY29kaW5nIHN0eWxlIGFkanVzdG1lbnRzIGFwcGxpZWQKKyogYWxsIGtlcm5lbCB2ZXJzaW9uIGNvbXBhdGliaWxpdHkgZnVuY3Rpb25zIGhhcyBiZWVuIG1vdmVkIHRvIGNvbXBhdC5oCisqIHVzZSByYW5kb20gZXRoZXJuZXQgYWRkcmVzcyBnZW5lcmF0b3IgZnJvbSB0aGUga2VybmVsCisqIC9zeXMvbW9kdWxlL2JhdG1hbl9hZHYvdmVyc2lvbiB0byBleHBvcnQga2VybmVsIG1vZHVsZSB2ZXJzaW9uCisqIHZpczogc2Vjb25kYXJ5IGludGVyZmFjZSBleHBvcnQgZm9yIGRvdCBkcmF3IGZvcm1hdCArIEpTT04gb3V0cHV0IGZvcm1hdCBhZGRlZAorKiBtYW55IGJ1Z3MgKGFsaWdubWVudCBpc3N1ZXMsIHJhY2UgY29uZGl0aW9ucywgZGVhZGxvY2tzLCBldGMpIHNxdWFzaGVkCisKKyAtLSBTYXQsIDA3IE5vdiAyMDA5IDE1OjQ0OjMxICswMTAwCisKK2JhdG1hbi1hZHYgMC4xOgorCisqIHN1cHBvcnQgbGF0ZXN0IGtlcm5lbHMgKDIuNi4yMCAtIDIuNi4yOCkKKyogTE9UUyBvZiBjbGVhbnVwOiBsb2NraW5nLCBzdGFjayB1c2FnZSwgbWVtb3J5IGxlYWtzCisqIENoYW5nZSBFdGhlcnR5cGUgZnJvbSAweDA4NDIgdG8gMHg0MzA1CisgIHVucmVnaXN0ZXJlZCBhdCBJRUVFLCBpZiB5b3Ugd2FudCB0byBzcG9uc29yIGFuIG9mZmljaWFsIEV0aGVydHlwZSAoJDI1MDApCisgIHBsZWFzZSBjb250YWN0IHVzCisKKyAtLSBTdW4sIDI4IERlYyAyMDA4IDAwOjQ0OjMxICswMTAwCisKK2JhdG1hbi1hZHYgMC4xLWJldGE6CisKKyogbGF5ZXIgMiBtZXNoaW5nIGJhc2VkIG9uIEJBVE1BTiBUUSBhbGdvcml0aG0gaW4ga2VybmVsbGFuZAorKiBvcGVyYXRlcyBvbiBhbnkgZXRoZXJuZXQgbGlrZSBpbnRlcmZhY2UKKyogc3VwcG9ydHMgSVB2NCwgSVB2NiwgREhDUCwgZXRjCisqIGlzIGNvbnRyb2xsZWQgdmlhIC9wcm9jL25ldC9iYXRtYW4tYWR2LworKiBicmlkZ2luZyB2aWEgYnJjdGwgaXMgc3VwcG9ydGVkCisqIGludGVyZmFjZSB3YXRjaGRvZyAoaW50ZXJmYWNlcyBjYW4gYmUgKGRlKWFjdGl2YXRlZCBkeW5hbWljYWxseSkKKyogb2ZmZXJzIGludGVncmF0ZWQgdmlzIHNlcnZlciB3aGljaCBtZXNoZXMvc3luY3Mgd2l0aCBvdGhlciB2aXMgc2VydmVycyBpbiByYW5nZQorCisgLS0gTW9uLCAwNSBNYXkgMjAwOCAxNDoxMDowNCArMDIwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYzMmY1NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L0tjb25maWcKQEAgLTAsMCArMSwyNSBAQAorIworIyBCLkEuVC5NLkEuTiBtZXNoaW5nIHByb3RvY29sCisjCisKK2NvbmZpZyBCQVRNQU5fQURWCisJdHJpc3RhdGUgIkIuQS5ULk0uQS5OLiBBZHZhbmNlZCBNZXNoaW5nIFByb3RvY29sIgorICAgICAgICBkZWZhdWx0IG4KKwktLS1oZWxwLS0tCisKKyAgICAgICAgQi5BLlQuTS5BLk4uIChiZXR0ZXIgYXBwcm9hY2ggdG8gbW9iaWxlIGFkLWhvYyBuZXR3b3JraW5nKSBpcworICAgICAgICBhIHJvdXRpbmcgcHJvdG9jb2wgZm9yIG11bHRpLWhvcCBhZC1ob2MgbWVzaCBuZXR3b3Jrcy4gVGhlCisgICAgICAgIG5ldHdvcmtzIG1heSBiZSB3aXJlZCBvciB3aXJlbGVzcy4gU2VlCisgICAgICAgIGh0dHA6Ly93d3cub3Blbi1tZXNoLm9yZy8gZm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIHVzZXIgc3BhY2UKKyAgICAgICAgdG9vbHMuCisKK2NvbmZpZyBCQVRNQU5fREVCVUcKKwlib29sICJCLkEuVC5NLkEuTi4gZGVidWdnaW5nIgorCWRlcGVuZHMgb24gQkFUTUFOX0FEViAhPSBuCisJaGVscAorCisJICBUaGlzIGlzIGFuIG9wdGlvbiBmb3IgdXNlIGJ5IGRldmVsb3BlcnM7IG1vc3QgcGVvcGxlIHNob3VsZAorCSAgc2F5IE4gaGVyZS4gVGhpcyBlbmFibGVzIGNvbXBpbGF0aW9uIG9mIHN1cHBvcnQgZm9yCisJICBvdXRwdXR0aW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byB0aGUga2VybmVsIGxvZy4gVGhlCisJICBvdXRwdXQgaXMgY29udHJvbGxlZCB2aWEgdGhlIG1vZHVsZSBwYXJhbWV0ZXIgZGVidWcuCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJkYTg3MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L01ha2VmaWxlCkBAIC0wLDAgKzEsMjIgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyMKKyMgTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisjIDAyMTEwLTEzMDEsIFVTQQorIworCitvYmotbSArPSBiYXRtYW4tYWR2Lm8KK2JhdG1hbi1hZHYtb2JqcyA6PSBtYWluLm8gcHJvYy5vIHNlbmQubyByb3V0aW5nLm8gc29mdC1pbnRlcmZhY2UubyBkZXZpY2UubyB0cmFuc2xhdGlvbi10YWJsZS5vIGJpdGFycmF5Lm8gaGFzaC5vIHJpbmdfYnVmZmVyLm8gdmlzLm8gaGFyZC1pbnRlcmZhY2UubyBhZ2dyZWdhdGlvbi5vIGxvZy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9SRUFETUUgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FhZjM5MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L1JFQURNRQpAQCAtMCwwICsxLDEyNSBAQAorW3N0YXRlOiAwNy0xMS0yMDA5XQorCitCQVRNQU4tQURWCistLS0tLS0tLS0tCisKK0JhdG1hbi1hZHZhbmNlZCBpcyBhIG5ldyBhcHByb2FjaCB0byB3aXJlbGVzcyBuZXR3b3JraW5nIHdoaWNoIGRvZXMgbm8gbG9uZ2VyCitvcGVyYXRlIG9uIHRoZSBJUCBiYXNpcy4gVW5saWtlIEIuQS5ULk0uQS5OLCB3aGljaCBleGNoYW5nZXMgaW5mb3JtYXRpb24KK3VzaW5nIFVEUCBwYWNrZXRzIGFuZCBzZXRzIHJvdXRpbmcgdGFibGVzLCBiYXRtYW4tYWR2YW5jZWQgb3BlcmF0ZXMgb24gSVNPL09TSQorTGF5ZXIgMiBvbmx5IGFuZCB1c2VzIGFuZCByb3V0ZXMgKG9yIGJldHRlcjogYnJpZGdlcykgRXRoZXJuZXQgRnJhbWVzLiBJdAorZW11bGF0ZXMgYSB2aXJ0dWFsIG5ldHdvcmsgc3dpdGNoIG9mIGFsbCBub2RlcyBwYXJ0aWNpcGF0aW5nLiBUaGVyZWZvcmUgYWxsCitub2RlcyBhcHBlYXIgdG8gYmUgbGluayBsb2NhbCwgdGh1cyBhbGwgaGlnaGVyIG9wZXJhdGluZyBwcm90b2NvbHMgd29uJ3QgYmUKK2FmZmVjdGVkIGJ5IGFueSBjaGFuZ2VzIHdpdGhpbiB0aGUgbmV0d29yay4gWW91IGNhbiBydW4gYWxtb3N0IGFueSBwcm90b2NvbAorYWJvdmUgQi5BLlQuTS5BLk4uIEFkdmFuY2VkLCBwcm9taW5lbnQgZXhhbXBsZXMgYXJlOiBJUHY0LCBJUHY2LCBESENQLCBJUFguCisKK1RoaXMgaXMgYmF0bWFuLWFkdmFuY2VkIGltcGxlbWVudGVkIGFzIExpbnV4IGtlcm5lbCBkcml2ZXIuIEl0IGRvZXMgbm90IGRlcGVuZAorb24gYW55IG5ldHdvcmsgKG90aGVyKSBkcml2ZXIsIGFuZCBjYW4gYmUgdXNlZCBvbiB3aWZpIGFzIHdlbGwgYXMgZXRoZXJuZXQsCit2cG4sIGV0YyAuLi4gKGFueXRoaW5nIHdpdGggZXRoZXJuZXQtc3R5bGUgbGF5ZXIgMikuCitJdCBjb21waWxlcyBhZ2FpbnN0IGFuZCBzaG91bGQgd29yayB3aXRoIExpbnV4IDIuNi4yMCAtIDIuNi4zMS4gU3VwcG9ydGluZyBvbGRlcgordmVyc2lvbnMgaXMgbm90IHBsYW5uZWQsIGJ1dCBpdCdzIHByb2JhYmx5IGVhc3kgdG8gYmFja3BvcnQgaXQuIElmIHlvdSB3b3JrIG9uIGEKK2JhY2twb3J0LCBmZWVsIGZyZWUgdG8gY29udGFjdCB1cy4gIDotKQorCitDT01QSUxFCistLS0tLS0tCitUbyBjb21waWxlIGFnYWluc3QgeW91ciBjdXJyZW50bHkgaW5zdGFsbGVkIGtlcm5lbCwganVzdCB0eXBlOgorCisjIG1ha2UKKworaWYgeW91IHdhbnQgdG8gY29tcGlsZSBhZ2FpbnN0IHNvbWUgb3RoZXIga2VybmVsLCB1c2U6CisKKyMgbWFrZSBLRVJORUxQQVRIPS9wYXRoL3RvL2tlcm5lbAorCitVU0FHRQorLS0tLS0KKworaW5zbW9kIHRoZSBiYXRtYW4tYWR2LmtvIGluIHlvdXIga2VybmVsOgorCisjIGluc21vZCBiYXRtYW4tYWR2LmtvCisKK3RoZSBtb2R1bGUgaXMgbm93IHdhaXRpbmcgZm9yIGFjdGl2YXRpb24uIFlvdSBtdXN0IGFkZCBzb21lIGludGVyZmFjZXMKK29uIHdoaWNoIGJhdG1hbiBjYW4gb3BlcmF0ZS4gRWFjaCBpbnRlcmZhY2UgbXVzdCBiZSBhZGRlZCBzZXBhcmF0ZWx5OgorCisjIGVjaG8gd2xhbjAgPiAvcHJvYy9uZXQvYmF0bWFuLWFkdi9pbnRlcmZhY2VzCisKKyggIyBlY2hvIHdsYW4xID4gL3Byb2MvbmV0L2JhdG1hbi1hZHYvaW50ZXJmYWNlcyApCisoICMgZWNobyBldGgwID4gL3Byb2MvbmV0L2JhdG1hbi1hZHYvaW50ZXJmYWNlcyApCisoIC4uLiApCisKK05vdyBiYXRtYW4gc3RhcnRzIGJyb2FkY2FzdGluZyBvbiB0aGlzIGludGVyZmFjZS4KK1lvdSBjYW4gbm93IHZpZXcgdGhlIHRhYmxlIG9mIG9yaWdpbmF0b3JzIChtZXNoIHBhcnRpY2lwYW50cykgd2l0aDoKKworIyBjYXQgL3Byb2MvbmV0L2JhdG1hbi1hZHYvb3JpZ2luYXRvcnMKKworVGhlIG1vZHVsZSB3aWxsIGNyZWF0ZSBhIG5ldyBpbnRlcmZhY2UgImJhdDAiLCB3aGljaCBjYW4gYmUgdXNlZCBhcyBhCityZWd1bGFyIGludGVyZmFjZToKKworIyBpZmNvbmZpZyBiYXQwIGluZXQgMTkyLjE2OC4wLjEgdXAKKyMgcGluZyAxOTIuMTY4LjAuMgorLi4uCisKK0lmIHlvdSB3YW50IHRvcG9sb2d5IHZpc3VhbGl6YXRpb24sIHlvdXIgbWVzaG5vZGUgbXVzdCBiZSBjb25maWd1cmVkCithcyBWSVMtc2VydmVyOgorCisjIGVjaG8gInNlcnZlciIgPiAvcHJvYy9uZXQvYmF0bWFuLWFkdi92aXMKKworRWFjaCBub2RlIGlzIGVpdGhlciBjb25maWd1cmVkIGFzICJzZXJ2ZXIiIG9yIGFzICJjbGllbnQiIChkZWZhdWx0OgorImNsaWVudCIpLiBDbGllbnRzIHNlbmQgdGhlaXIgdG9wb2xvZ3kgZGF0YSB0byB0aGUgc2VydmVyIG5leHQgdG8gdGhlbSwKK2FuZCBzZXJ2ZXIgc3luY2hyb25pemUgd2l0aCBvdGhlciBzZXJ2ZXJzLiBJZiB0aGVyZSBpcyBubyBzZXJ2ZXIKK2NvbmZpZ3VyZWQgKGRlZmF1bHQpIHdpdGhpbiB0aGUgbWVzaCwgbm8gdG9wb2xvZ3kgaW5mb3JtYXRpb24gd2lsbCBiZQordHJhbnNtaXR0ZWQuIFdpdGggdGhlc2UgInN5bmNocm9uaXppbmcgc2VydmVycyIsIHRoZXJlIGNhbiBiZSAxIG9yCittb3JlIHZpcyBzZXJ2ZXJzIHNoYXJpbmcgdGhlIHNhbWUgKG9yIGF0IGxlYXN0IHZlcnkgc2ltaWxhcikgZGF0YS4KKworV2hlbiBjb25maWd1cmVkIGFzIHNlcnZlciwgeW91IGNhbiBnZXQgYSB0b3BvbG9neSBzbmFwc2hvdCBvZiB5b3VyIG1lc2g6CisKKyMgY2F0IC9wcm9jL25ldC9iYXRtYW4tYWR2L3ZpcworCitUaGlzIG91dHB1dCBmb3JtYXQgaXMgYSBncmFwaHZpeiBmb3JtYXR0ZWQgdGV4dCBmaWxlIHdoaWNoIGNhbiBiZQorcHJvY2Vzc2VkIHdpdGggZ3JhcGh2aXotdG9vbHMgbGlrZSBkb3QuCitUaGUgbGFiZWxzIGFyZSBzaW1pbGFyL2NvbXBhdGlibGUgdG8gdGhlIEVUWCBtZXRyaWMsIDEuMCBtZWFucyBwZXJmZWN0Citjb25uZWN0aW9uICgxMDAlKSwgMi4wIG1lYW5zIDUwJSwgMy4wIG1lYW5zIDMzJSBhbmQgc28gb24uCisKK0FsdGVybmF0aXZlbHksIGEgSlNPTiBvdXRwdXQgZm9ybWF0IGlzIGF2YWlsYWJsZS4gVGhlIGZvcm1hdCBjYW4gYmUgc2V0Cit1c2luZyBieSB3cml0aW5nIGVpdGhlciAiZG90X2RyYXciIG9yICJqc29uIiBpbnRvIHRoZSB2aXNfZm9ybWF0IGZpbGUuCisiZG90X2RyYXciIGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQuCisKK2VjaG8gImpzb24iID4gL3Byb2MvbmV0L2JhdG1hbi1hZHYvdmlzX2Zvcm1hdAorCitJbiB2ZXJ5IG1vYmlsZSBzY2VuYXJpb3MsIHlvdSBtaWdodCB3YW50IHRvIGFkanVzdCB0aGUgb3JpZ2luYXRvcgoraW50ZXJ2YWwgdG8gYSBsb3dlciB2YWx1ZS4gVGhpcyB3aWxsIG1ha2UgdGhlIG1lc2ggbW9yZSByZXNwb25zaXZlIHRvCit0b3BvbG9neSBjaGFuZ2VzLCBidXQgd2lsbCBhbHNvIGluY3JlYXNlIHRoZSBvdmVyaGVhZC4gUGxlYXNlIG1ha2Ugc3VyZQordGhhdCBhbGwgbm9kZXMgaW4geW91ciBtZXNoIHVzZSB0aGUgc2FtZSBpbnRlcnZhbC4gVGhlIGRlZmF1bHQgdmFsdWUKK2lzIDEwMDAgbXMgKDEgc2Vjb25kKS4KKworIyBlY2hvIDEwMDAgPiAvcHJvYy9uZXQvYmF0bWFuLWFkdi9vcmlnX2ludGVydmFsCisKK1RvIGRlYWN0aXZhdGUgYmF0bWFuLCBkbzoKKworIyBlY2hvICIiID4gL3Byb2MvbmV0L2JhdG1hbi1hZHYvaW50ZXJmYWNlcworCitCQVRDVEwKKy0tLS0tLQorCitCLkEuVC5NLkEuTi4gIGFkdmFuY2VkICBvcGVyYXRlcyBvbiBsYXllciAyIGFuZCB0aHVzIGFsbCBob3N0cyBwYXJ0aWNpLQorcGF0aW5nIGluIHRoZSB2aXJ0dWFsIHN3aXRjaCBhcmUgY29tcGxldGVseSB0cmFuc3BhcmVudCBmb3IgYWxsICBwcm90by0KK2NvbHMgYWJvdmUgbGF5ZXIgMi4gVGhlcmVmb3JlIHRoZSBjb21tb24gZGlhZ25vc2lzIHRvb2xzIGRvIG5vdCB3b3JrIGFzCitleHBlY3RlZC4gVG8gb3ZlcmNvbWUgdGhlc2UgcHJvYmxlbXMgYmF0Y3RsIHdhcyBjcmVhdGVkLiBBdCB0aGUgIG1vbWVudAordGhlICBiYXRjdGwgY29udGFpbnMgcGluZywgdHJhY2Vyb3V0ZSwgdGNwZHVtcCBhbmQgaW50ZXJmYWNlcyB0byB0aGUKK2tlcm5lbCBtb2R1bGUgc2V0dGluZ3MuCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIHRoZSBtYW5wYWdlIChtYW4gYmF0Y3RsKS4KKworYmF0Y3RsIGlzIGF2YWlsYWJsZSBvbiBodHRwOi8vd3d3Lm9wZW4tbWVzaC5uZXQvCisKK0NPTlRBQ1QKKy0tLS0tLS0KKworUGxlYXNlIHNlbmQgdXMgY29tbWVudHMsIGV4cGVyaWVuY2VzLCBxdWVzdGlvbnMsIGFueXRoaW5nIDopCisKK0lSQzogICAgICAgICAgICAgI2JhdG1hbiBvbiBpcmMuZnJlZW5vZGUub3JnCitNYWlsaW5nLWxpc3Q6ICAgIGIuYS50Lm0uYS5uQG9wZW4tbWVzaC5uZXQKKyhzdWJzY3JpcHRpb24gYXQgaHR0cHM6Ly9saXN0Lm9wZW4tbWVzaC5uZXQvbW0vbGlzdGluZm8vYi5hLnQubS5hLm4gKQorCitZb3UgY2FuIGFsc28gY29udGFjdCB0aGUgQXV0aG9yczoKKworTWFyZWsgTGluZG5lciA8bGluZG5lcl9tYXJla0B5YWhvby5kZT4KK1NpbW9uIFd1bmRlcmxpY2ggPHNpd3VAaHJ6LnR1LWNoZW1uaXR6LmRlPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE2ZGNmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L1RPRE8KQEAgLTAsMCArMSw1MSBAQAorPT4gcHJvYyBpbnRlcmZhY2UKKyogaW1wbGVtZW50IG5ldyBpbnRlcmZhY2UgdG8gYWRkL2RlbGV0ZSBpbnRlcmZhY2VzIGFuZCBzZXR0aW5nIG9wdGlvbnMKKyogL3Byb2Mvc3lzL25ldC9iYXRtYW4tYWR2LyBhcyBtYWluIGZvbGRlcgorKiBpbiBpbnRlcmZhY2VzLyBsaXN0IGV2ZXJ5IGF2YWlsYWJsZSBpbnRlcmZhY2Ugb2YgdGhlIGhvc3QKKyogZWFjaCBpbnRlcmZhY2VzLyRpZmFjZS8gY29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKy0+IGVuYWJsZSAoZGVmOiAwKSBbYWRkL3JlbW92ZSB0aGlzIGludGVyZmFjZSB0byBiYXRtYW4tYWR2XQorLT4gb2dtX2ludGVydmFsIChkZWY6IDEwMDApIFtvZ20gaW50ZXJ2YWwgb2YgdGhhdCBpbnRlcmZhY2VdCistPiBjb250ZXh0IChkZWY6IGJhdDApIFtsYXRlciB3ZSB3YW50IHRvIHN1cHBvcnQgbXVsdGlwbGUgbWVzaCBpbnN0YW5jZXMgdmlhCistPiBiYXQwL2JhdDEvYmF0Mi8uLl0KKy0+IHN0YXR1cyAocmVhZC1vbmx5KSBbb3V0cHV0cyB0aGUgaW50ZXJmYWNlIHN0YXR1cyBmcm9tIGJhdG1hbidzCistPiBwZXJzcGVjdGl2ZV0KKyogaW4gbWVzaC9iYXRYLyBsaXN0IGV2ZXJ5IGF2YWlsYWJsZSBtZXNoIHN1Ym5ldAorLT4gdmlzX3NlcnZlciAoZGVmOiAwKSBbZW5hYmxlL2Rpc2FibGUgdmlzIHNlcnZlciBmb3IgdGhhdCBtZXNoXQorLT4gdmlzX2RhdGEgKHJlYWQtb25seSkgW291dHB1dHMgdGhlIHZpcyBkYXRhIGluIGEgcmF3IGZvcm1hdF0KKy0+IGFnZ3JlZ2F0ZV9vZ20gKGRlZjogMSkgW2VuYWJsZS9kaXNhYmxlIG9nbSBhZ2dyZWdhdGlvbiBmb3IgdGhhdCBtZXNoXQorLT4gb3JpZ2luYXRvcnMgKHJlYWQtb25seSkgW291dHB1dHMgdGhlIG9yaWdpbmF0b3IgdGFibGVdCistPiB0cmFuc3RhYmxlX2dsb2JhbCAocmVhZC1vbmx5KSBbb3V0cHV0cyB0aGUgZ2xvYmFsIHRyYW5zbGF0aW9uIHRhYmxlXQorLT4gdHJhbnN0YWJsZV9sb2NhbCAocmVhZC1vbmx5KSBbb3V0cHV0cyB0aGUgbG9jYWwgdHJhbnNsYXRpb24gdGFibGVdCisKKz0+IHZpcyAicmF3IiBkYXRhIG91dHB1dAorKiB0aGUgcmF3IGZvcm1hdCBzaGFsbCByZXBsYWNlIGRvdCBkcmF3IC8ganNvbiB0byBvZmZlciBhIG5ldXRyYWwgdGhhdCBjYW4KKyogYmUgY29udmVydGVkCisqIHRoZSBmb3JtYXQgKGNvbW1hIHNlcGVyYXRlZCBlbnRyaWVzKToKKy0+ICJtYWMiIC0+IG1hYyBhZGRyZXNzIG9mIGFuIG9yaWdpbmF0b3IgKGVhY2ggbGluZSBiZWdpbnMgd2l0aCBpdCkKKy0+ICJUUSBtYWMgdmFsdWUiIC0+IHNyYyBtYWMncyBsaW5rIHF1YWxpdHkgdG93YXJkcyBtYWMgYWRkcmVzcworLT4gIkhOQSBtYWMiIC0+IEhOQSBhbm5vdW5jZWQgYnkgc291cmNlIG1hYworLT4gIlBSSU1BUlkiIC0+IHRoaXMgaXMgYSBwcmltYXJ5IGludGVyZmFjZQorLT4gIlNFQyBtYWMiIC0+IHNlY29uZGFyeSBtYWMgYWRkcmVzcyBvZiBzb3VyY2UgKHJlcXVpcmVzIHByZWNlZWRpbmcKKy0+IFBSSU1BUlkpCisKKz0+IGxvZ2dpbmcKKyogdGhlIGxvZyBsZXZlbCBMT0dfVFlQRV9DUklULCBMT0dfVFlQRV9XQVJOICYgTE9HX1RZUEVfTk9USUNFIHdpbGwgYmUKKyogdW5pZmllZCB0byB1c2UgcHJpbnRrCisqIExPR19UWVBFX0JBVE1BTiAmIExPR19UWVBFX1JPVVRFUyB3aWxsIGFsc28gdXNlIHByaW50ayBidXQgb25seSBhZnRlciB0aGUKKyogaW50ZXJuYWwgZGVidWcgbGV2ZWwgaGFzIGJlZW4gcmFpc2VkCisqIHRoZSBpbnRlcm5hbCBkZWJ1ZyBsZXZlbCBjYW4gYmUgbW9kaWZpZWQgdXNpbmcgYSBtb2R1bGUgcGFyYW1ldGVyIChkZWJ1ZykKKyogb3IgYXQgcnVuIHRpbWUgdmlhIC9zeXMvbW9kdWxlL2JhdG1hbi1hZHYvcGFyYW1ldGVycy9kZWJ1ZworKiBtYWtlIHVzZSBvZiBwcmludGsgJXBNIHN1cHBvcnQgaW5zdGVhZCBvZiBjb252ZXJ0aW5nIG1hYyBhZGRyZXNzZXMKKyogbWFudWFsbHkKKworPT4gc3RyaXAgb3V0IGFsbCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHN1cHBvcnQgdG8gb2xkZXIga2VybmVscworICAgKG9ubHkgZm91bmQgaW4gY29tcGF0LmgpCisKKz0+IGZpeCBjaGVja3BhdGNoLnBsIGVycm9ycworCitQbGVhc2Ugc2VuZCBhbGwgcGF0Y2hlcyB0bzoKKwlNYXJlayBMaW5kbmVyIDxsaW5kbmVyX21hcmVrQHlhaG9vLmRlPgorCVNpbW9uIFd1bmRlcmxpY2ggPHNpd3VAaHJ6LnR1LWNoZW1uaXR6LmRlPgorCUFuZHJldyBMdW5uIDxhbmRyZXdAbHVubi5jaD4KKwliLmEudC5tLmEubkBsaXN0cy5vcGVuLW1lc2gubmV0CisJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAc3VzZS5kZT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2FnZ3JlZ2F0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9hZ2dyZWdhdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNmU2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9hZ2dyZWdhdGlvbi5jCkBAIC0wLDAgKzEsMjMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJhZ2dyZWdhdGlvbi5oIgorI2luY2x1ZGUgInNlbmQuaCIKKyNpbmNsdWRlICJyb3V0aW5nLmgiCisKKy8qIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgaG5hIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIHBhY2tldCAqLworc3RhdGljIGludCBobmFfbGVuKHN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0KQoreworCXJldHVybiBiYXRtYW5fcGFja2V0LT5udW1faG5hICogRVRIX0FMRU47Cit9CisKKy8qIHJldHVybiB0cnVlIGlmIG5ld19wYWNrZXQgY2FuIGJlIGFnZ3JlZ2F0ZWQgd2l0aCBmb3J3X3BhY2tldCAqLworc3RhdGljIGJvb2wgY2FuX2FnZ3JlZ2F0ZV93aXRoKHN0cnVjdCBiYXRtYW5fcGFja2V0ICpuZXdfYmF0bWFuX3BhY2tldCwKKwkJCSAgICAgICBpbnQgcGFja2V0X2xlbiwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIHNlbmRfdGltZSwKKwkJCSAgICAgICBib29sIGRpcmVjdGxpbmssCisJCQkgICAgICAgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcsCisJCQkgICAgICAgc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldCkKK3sKKwlzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCA9CisJCShzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKWZvcndfcGFja2V0LT5wYWNrZXRfYnVmZjsKKwlpbnQgYWdncmVnYXRlZF9ieXRlcyA9IGZvcndfcGFja2V0LT5wYWNrZXRfbGVuICsgcGFja2V0X2xlbjsKKworCS8qKgorCSAqIHdlIGNhbiBhZ2dyZWdhdGUgdGhlIGN1cnJlbnQgcGFja2V0IHRvIHRoaXMgYWdncmVnYXRlZCBwYWNrZXQKKwkgKiBpZjoKKwkgKgorCSAqIC0gdGhlIHNlbmQgdGltZSBpcyB3aXRoaW4gb3VyIE1BWF9BR0dSRUdBVElPTl9NUyB0aW1lCisJICogLSB0aGUgcmVzdWx0aW5nIHBhY2tldCB3b250IGJlIGJpZ2dlciB0aGFuCisJICogICBNQVhfQUdHUkVHQVRJT05fQllURVMKKwkgKi8KKworCWlmICh0aW1lX2JlZm9yZShzZW5kX3RpbWUsIGZvcndfcGFja2V0LT5zZW5kX3RpbWUpICYmCisJICAgIChhZ2dyZWdhdGVkX2J5dGVzIDw9IE1BWF9BR0dSRUdBVElPTl9CWVRFUykpIHsKKworCQkvKioKKwkJICogY2hlY2sgYWdncmVnYXRpb24gY29tcGF0aWJpbGl0eQorCQkgKiAtPiBkaXJlY3QgbGluayBwYWNrZXRzIGFyZSBicm9hZGNhc3RlZCBvbgorCQkgKiAgICB0aGVpciBpbnRlcmZhY2Ugb25seQorCQkgKiAtPiBhZ2dyZWdhdGUgcGFja2V0IGlmIHRoZSBjdXJyZW50IHBhY2tldCBpcworCQkgKiAgICBhICJnbG9iYWwiIHBhY2tldCBhcyB3ZWxsIGFzIHRoZSBiYXNlCisJCSAqICAgIHBhY2tldAorCQkgKi8KKworCQkvKiBwYWNrZXRzIHdpdGhvdXQgZGlyZWN0IGxpbmsgZmxhZyBhbmQgaGlnaCBUVEwKKwkJICogYXJlIGZsb29kZWQgdGhyb3VnaCB0aGUgbmV0ICAqLworCQlpZiAoKCFkaXJlY3RsaW5rKSAmJgorCQkgICAgKCEoYmF0bWFuX3BhY2tldC0+ZmxhZ3MgJiBESVJFQ1RMSU5LKSkgJiYKKwkJICAgIChiYXRtYW5fcGFja2V0LT50dGwgIT0gMSkgJiYKKworCQkgICAgLyogb3duIHBhY2tldHMgb3JpZ2luYXRpbmcgbm9uLXByaW1hcnkKKwkJICAgICAqIGludGVyZmFjZXMgbGVhdmUgb25seSB0aGF0IGludGVyZmFjZSAqLworCQkgICAgKCghZm9yd19wYWNrZXQtPm93bikgfHwKKwkJICAgICAoZm9yd19wYWNrZXQtPmlmX2luY29taW5nLT5pZl9udW0gPT0gMCkpKQorCQkJcmV0dXJuIHRydWU7CisKKwkJLyogaWYgdGhlIGluY29taW5nIHBhY2tldCBpcyBzZW50IHZpYSB0aGlzIG9uZQorCQkgKiBpbnRlcmZhY2Ugb25seSAtIHdlIHN0aWxsIGNhbiBhZ2dyZWdhdGUgKi8KKwkJaWYgKChkaXJlY3RsaW5rKSAmJgorCQkgICAgKG5ld19iYXRtYW5fcGFja2V0LT50dGwgPT0gMSkgJiYKKwkJICAgIChmb3J3X3BhY2tldC0+aWZfaW5jb21pbmcgPT0gaWZfaW5jb21pbmcpKQorCQkJcmV0dXJuIHRydWU7CisKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qIGNyZWF0ZSBhIG5ldyBhZ2dyZWdhdGVkIHBhY2tldCBhbmQgYWRkIHRoaXMgcGFja2V0IHRvIGl0ICovCitzdGF0aWMgdm9pZCBuZXdfYWdncmVnYXRlZF9wYWNrZXQodW5zaWduZWQgY2hhciAqcGFja2V0X2J1ZmYsCisJCQkgICBpbnQgcGFja2V0X2xlbiwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgc2VuZF90aW1lLAorCQkJICAgYm9vbCBkaXJlY3RfbGluaywKKwkJCSAgIHN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nLAorCQkJICAgaW50IG93bl9wYWNrZXQpCit7CisJc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldF9hZ2dyOworCisJZm9yd19wYWNrZXRfYWdnciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmb3J3X3BhY2tldCksIEdGUF9BVE9NSUMpOworCWlmICghZm9yd19wYWNrZXRfYWdncikKKwkJcmV0dXJuOworCisJZm9yd19wYWNrZXRfYWdnci0+cGFja2V0X2J1ZmYgPSBrbWFsbG9jKE1BWF9BR0dSRUdBVElPTl9CWVRFUywKKwkJCQkJCUdGUF9BVE9NSUMpOworCWlmICghZm9yd19wYWNrZXRfYWdnci0+cGFja2V0X2J1ZmYpIHsKKwkJa2ZyZWUoZm9yd19wYWNrZXRfYWdncik7CisJCXJldHVybjsKKwl9CisKKwlJTklUX0hMSVNUX05PREUoJmZvcndfcGFja2V0X2FnZ3ItPmxpc3QpOworCisJZm9yd19wYWNrZXRfYWdnci0+cGFja2V0X2xlbiA9IHBhY2tldF9sZW47CisJbWVtY3B5KGZvcndfcGFja2V0X2FnZ3ItPnBhY2tldF9idWZmLAorCSAgICAgICBwYWNrZXRfYnVmZiwKKwkgICAgICAgZm9yd19wYWNrZXRfYWdnci0+cGFja2V0X2xlbik7CisKKwlmb3J3X3BhY2tldF9hZ2dyLT5vd24gPSBvd25fcGFja2V0OworCWZvcndfcGFja2V0X2FnZ3ItPmlmX2luY29taW5nID0gaWZfaW5jb21pbmc7CisJZm9yd19wYWNrZXRfYWdnci0+bnVtX3BhY2tldHMgPSAwOworCWZvcndfcGFja2V0X2FnZ3ItPmRpcmVjdF9saW5rX2ZsYWdzID0gMDsKKwlmb3J3X3BhY2tldF9hZ2dyLT5zZW5kX3RpbWUgPSBzZW5kX3RpbWU7CisKKwkvKiBzYXZlIHBhY2tldCBkaXJlY3QgbGluayBmbGFnIHN0YXR1cyAqLworCWlmIChkaXJlY3RfbGluaykKKwkJZm9yd19wYWNrZXRfYWdnci0+ZGlyZWN0X2xpbmtfZmxhZ3MgfD0gMTsKKworCS8qIGFkZCBuZXcgcGFja2V0IHRvIHBhY2tldCBsaXN0ICovCisJc3Bpbl9sb2NrKCZmb3J3X2JhdF9saXN0X2xvY2spOworCWhsaXN0X2FkZF9oZWFkKCZmb3J3X3BhY2tldF9hZ2dyLT5saXN0LCAmZm9yd19iYXRfbGlzdCk7CisJc3Bpbl91bmxvY2soJmZvcndfYmF0X2xpc3RfbG9jayk7CisKKwkvKiBzdGFydCB0aW1lciBmb3IgdGhpcyBwYWNrZXQgKi8KKwlJTklUX0RFTEFZRURfV09SSygmZm9yd19wYWNrZXRfYWdnci0+ZGVsYXllZF93b3JrLAorCQkJICBzZW5kX291dHN0YW5kaW5nX2JhdF9wYWNrZXQpOworCXF1ZXVlX2RlbGF5ZWRfd29yayhiYXRfZXZlbnRfd29ya3F1ZXVlLAorCQkJICAgJmZvcndfcGFja2V0X2FnZ3ItPmRlbGF5ZWRfd29yaywKKwkJCSAgIHNlbmRfdGltZSAtIGppZmZpZXMpOworfQorCisvKiBhZ2dyZWdhdGUgYSBuZXcgcGFja2V0IGludG8gdGhlIGV4aXN0aW5nIGFnZ3JlZ2F0aW9uICovCitzdGF0aWMgdm9pZCBhZ2dyZWdhdGUoc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldF9hZ2dyLAorCQkgICAgICB1bnNpZ25lZCBjaGFyICpwYWNrZXRfYnVmZiwKKwkJICAgICAgaW50IHBhY2tldF9sZW4sCisJCSAgICAgIGJvb2wgZGlyZWN0X2xpbmspCit7CisJbWVtY3B5KChmb3J3X3BhY2tldF9hZ2dyLT5wYWNrZXRfYnVmZiArIGZvcndfcGFja2V0X2FnZ3ItPnBhY2tldF9sZW4pLAorCSAgICAgICBwYWNrZXRfYnVmZiwgcGFja2V0X2xlbik7CisJZm9yd19wYWNrZXRfYWdnci0+cGFja2V0X2xlbiArPSBwYWNrZXRfbGVuOworCWZvcndfcGFja2V0X2FnZ3ItPm51bV9wYWNrZXRzKys7CisKKwkvKiBzYXZlIHBhY2tldCBkaXJlY3QgbGluayBmbGFnIHN0YXR1cyAqLworCWlmIChkaXJlY3RfbGluaykKKwkJZm9yd19wYWNrZXRfYWdnci0+ZGlyZWN0X2xpbmtfZmxhZ3MgfD0KKwkJCSgxIDw8IGZvcndfcGFja2V0X2FnZ3ItPm51bV9wYWNrZXRzKTsKK30KKwordm9pZCBhZGRfYmF0X3BhY2tldF90b19saXN0KHVuc2lnbmVkIGNoYXIgKnBhY2tldF9idWZmLCBpbnQgcGFja2V0X2xlbiwKKwkJCSAgICBzdHJ1Y3QgYmF0bWFuX2lmICppZl9pbmNvbWluZywgY2hhciBvd25fcGFja2V0LAorCQkJICAgIHVuc2lnbmVkIGxvbmcgc2VuZF90aW1lKQoreworCS8qKgorCSAqIF9hZ2dyIC0+IHBvaW50ZXIgdG8gdGhlIHBhY2tldCB3ZSB3YW50IHRvIGFnZ3JlZ2F0ZSB3aXRoCisJICogX3BvcyAtPiBwb2ludGVyIHRvIHRoZSBwb3NpdGlvbiBpbiB0aGUgcXVldWUKKwkgKi8KKwlzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0X2FnZ3IgPSBOVUxMLCAqZm9yd19wYWNrZXRfcG9zID0gTlVMTDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqdG1wX25vZGU7CisJc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQgPQorCQkoc3RydWN0IGJhdG1hbl9wYWNrZXQgKilwYWNrZXRfYnVmZjsKKwlib29sIGRpcmVjdF9saW5rID0gYmF0bWFuX3BhY2tldC0+ZmxhZ3MgJiBESVJFQ1RMSU5LID8gMSA6IDA7CisKKwkvKiBmaW5kIHBvc2l0aW9uIGZvciB0aGUgcGFja2V0IGluIHRoZSBmb3J3YXJkIHF1ZXVlICovCisJc3Bpbl9sb2NrKCZmb3J3X2JhdF9saXN0X2xvY2spOworCS8qIG93biBwYWNrZXRzIGFyZSBub3QgdG8gYmUgYWdncmVnYXRlZCAqLworCWlmICgoYXRvbWljX3JlYWQoJmFnZ3JlZ2F0aW9uX2VuYWJsZWQpKSAmJiAoIW93bl9wYWNrZXQpKSB7CisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGZvcndfcGFja2V0X3BvcywgdG1wX25vZGUsICZmb3J3X2JhdF9saXN0LAorCQkJCSAgICAgbGlzdCkgeworCQkJaWYgKGNhbl9hZ2dyZWdhdGVfd2l0aChiYXRtYW5fcGFja2V0LAorCQkJCQkgICAgICAgcGFja2V0X2xlbiwKKwkJCQkJICAgICAgIHNlbmRfdGltZSwKKwkJCQkJICAgICAgIGRpcmVjdF9saW5rLAorCQkJCQkgICAgICAgaWZfaW5jb21pbmcsCisJCQkJCSAgICAgICBmb3J3X3BhY2tldF9wb3MpKSB7CisJCQkJZm9yd19wYWNrZXRfYWdnciA9IGZvcndfcGFja2V0X3BvczsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qIG5vdGhpbmcgdG8gYWdncmVnYXRlIHdpdGggLSBlaXRoZXIgYWdncmVnYXRpb24gZGlzYWJsZWQgb3Igbm8KKwkgKiBzdWl0YWJsZSBhZ2dyZWdhdGlvbiBwYWNrZXQgZm91bmQgKi8KKwlpZiAoZm9yd19wYWNrZXRfYWdnciA9PSBOVUxMKSB7CisJCS8qIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBjYW4gcnVuIHdpdGhvdXQgdGhlIGxvY2sgKi8KKwkJc3Bpbl91bmxvY2soJmZvcndfYmF0X2xpc3RfbG9jayk7CisJCW5ld19hZ2dyZWdhdGVkX3BhY2tldChwYWNrZXRfYnVmZiwgcGFja2V0X2xlbiwKKwkJCQkgICAgICBzZW5kX3RpbWUsIGRpcmVjdF9saW5rLAorCQkJCSAgICAgIGlmX2luY29taW5nLCBvd25fcGFja2V0KTsKKwl9IGVsc2UgeworCQlhZ2dyZWdhdGUoZm9yd19wYWNrZXRfYWdnciwKKwkJCSAgcGFja2V0X2J1ZmYsIHBhY2tldF9sZW4sCisJCQkgIGRpcmVjdF9saW5rKTsKKwkJc3Bpbl91bmxvY2soJmZvcndfYmF0X2xpc3RfbG9jayk7CisJfQorfQorCisvKiB1bnBhY2sgdGhlIGFnZ3JlZ2F0ZWQgcGFja2V0cyBhbmQgcHJvY2VzcyB0aGVtIG9uZSBieSBvbmUgKi8KK3ZvaWQgcmVjZWl2ZV9hZ2dyX2JhdF9wYWNrZXQoc3RydWN0IGV0aGhkciAqZXRoaGRyLCB1bnNpZ25lZCBjaGFyICpwYWNrZXRfYnVmZiwKKwkJCSAgICAgaW50IHBhY2tldF9sZW4sIHN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nKQoreworCXN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0OworCWludCBidWZmX3BvcyA9IDA7CisJdW5zaWduZWQgY2hhciAqaG5hX2J1ZmY7CisKKwliYXRtYW5fcGFja2V0ID0gKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopcGFja2V0X2J1ZmY7CisKKwl3aGlsZSAoYWdncmVnYXRlZF9wYWNrZXQoYnVmZl9wb3MsIHBhY2tldF9sZW4sCisJCQkJIGJhdG1hbl9wYWNrZXQtPm51bV9obmEpKSB7CisKKwkJLyogbmV0d29yayB0byBob3N0IG9yZGVyIGZvciBvdXIgMTZiaXQgc2Vxbm8sIGFuZCB0aGUKKwkJICAgb3JpZ19pbnRlcnZhbC4gKi8KKwkJYmF0bWFuX3BhY2tldC0+c2Vxbm8gPSBudG9ocyhiYXRtYW5fcGFja2V0LT5zZXFubyk7CisKKwkJaG5hX2J1ZmYgPSBwYWNrZXRfYnVmZiArIGJ1ZmZfcG9zICsgQkFUX1BBQ0tFVF9MRU47CisJCXJlY2VpdmVfYmF0X3BhY2tldChldGhoZHIsIGJhdG1hbl9wYWNrZXQsCisJCQkJICAgaG5hX2J1ZmYsIGhuYV9sZW4oYmF0bWFuX3BhY2tldCksCisJCQkJICAgaWZfaW5jb21pbmcpOworCisJCWJ1ZmZfcG9zICs9IEJBVF9QQUNLRVRfTEVOICsgaG5hX2xlbihiYXRtYW5fcGFja2V0KTsKKwkJYmF0bWFuX3BhY2tldCA9IChzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKQorCQkJKHBhY2tldF9idWZmICsgYnVmZl9wb3MpOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2FnZ3JlZ2F0aW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9hZ2dyZWdhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYThkZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9hZ2dyZWdhdGlvbi5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCisjaW5jbHVkZSAibWFpbi5oIgorCisvKiBpcyB0aGVyZSBhbm90aGVyIGFnZ3JlZ2F0ZWQgcGFja2V0IGhlcmU/ICovCitzdGF0aWMgaW5saW5lIGludCBhZ2dyZWdhdGVkX3BhY2tldChpbnQgYnVmZl9wb3MsIGludCBwYWNrZXRfbGVuLCBpbnQgbnVtX2huYSkKK3sKKwlpbnQgbmV4dF9idWZmX3BvcyA9IGJ1ZmZfcG9zICsgQkFUX1BBQ0tFVF9MRU4gKyAobnVtX2huYSAqIEVUSF9BTEVOKTsKKworCXJldHVybiAobmV4dF9idWZmX3BvcyA8PSBwYWNrZXRfbGVuKSAmJgorCQkobmV4dF9idWZmX3BvcyA8PSBNQVhfQUdHUkVHQVRJT05fQllURVMpOworfQorCit2b2lkIGFkZF9iYXRfcGFja2V0X3RvX2xpc3QodW5zaWduZWQgY2hhciAqcGFja2V0X2J1ZmYsIGludCBwYWNrZXRfbGVuLAorCQkJICAgIHN0cnVjdCBiYXRtYW5faWYgKmlmX291dGdvaW5nLCBjaGFyIG93bl9wYWNrZXQsCisJCQkgICAgdW5zaWduZWQgbG9uZyBzZW5kX3RpbWUpOwordm9pZCByZWNlaXZlX2FnZ3JfYmF0X3BhY2tldChzdHJ1Y3QgZXRoaGRyICpldGhoZHIsIHVuc2lnbmVkIGNoYXIgKnBhY2tldF9idWZmLAorCQkJICAgICBpbnQgcGFja2V0X2xlbiwgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYml0YXJyYXkuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JpdGFycmF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M2N2Y1ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JpdGFycmF5LmMKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIFNpbW9uIFd1bmRlcmxpY2gsIE1hcmVrIExpbmRuZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgImJpdGFycmF5LmgiCisjaW5jbHVkZSAibG9nLmgiCisKKy8qIHJldHVybnMgdHJ1ZSBpZiB0aGUgY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIGdpdmVuIHNlcV9iaXRzIGluZGljYXRlcyB0cnVlCisgKiBhbmQgY3Vycl9zZXFubyBpcyB3aXRoaW4gcmFuZ2Ugb2YgbGFzdF9zZXFubyAqLwordWludDhfdCBnZXRfYml0X3N0YXR1cyhUWVBFX09GX1dPUkQgKnNlcV9iaXRzLCB1aW50MTZfdCBsYXN0X3NlcW5vLAorCQkgICAgICAgdWludDE2X3QgY3Vycl9zZXFubykKK3sKKwlpbnQxNl90IGRpZmYsIHdvcmRfb2Zmc2V0LCB3b3JkX251bTsKKworCWRpZmYgPSBsYXN0X3NlcW5vIC0gY3Vycl9zZXFubzsKKwlpZiAoZGlmZiA8IDAgfHwgZGlmZiA+PSBUUV9MT0NBTF9XSU5ET1dfU0laRSkgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKiB3aGljaCB3b3JkICovCisJCXdvcmRfbnVtID0gKGxhc3Rfc2Vxbm8gLSBjdXJyX3NlcW5vKSAvIFdPUkRfQklUX1NJWkU7CisJCS8qIHdoaWNoIHBvc2l0aW9uIGluIHRoZSBzZWxlY3RlZCB3b3JkICovCisJCXdvcmRfb2Zmc2V0ID0gKGxhc3Rfc2Vxbm8gLSBjdXJyX3NlcW5vKSAlIFdPUkRfQklUX1NJWkU7CisKKwkJaWYgKHNlcV9iaXRzW3dvcmRfbnVtXSAmIDEgPDwgd29yZF9vZmZzZXQpCisJCQlyZXR1cm4gMTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfQorfQorCisvKiB0dXJuIGNvcnJlc3BvbmRpbmcgYml0IG9uLCBzbyB3ZSBjYW4gcmVtZW1iZXIgdGhhdCB3ZSBnb3QgdGhlIHBhY2tldCAqLwordm9pZCBiaXRfbWFyayhUWVBFX09GX1dPUkQgKnNlcV9iaXRzLCBpbnQzMl90IG4pCit7CisJaW50MzJfdCB3b3JkX29mZnNldCwgd29yZF9udW07CisKKwkvKiBpZiB0b28gb2xkLCBqdXN0IGRyb3AgaXQgKi8KKwlpZiAobiA8IDAgfHwgbiA+PSBUUV9MT0NBTF9XSU5ET1dfU0laRSkKKwkJcmV0dXJuOworCisJLyogd2hpY2ggd29yZCAqLworCXdvcmRfbnVtID0gbiAvIFdPUkRfQklUX1NJWkU7CisJLyogd2hpY2ggcG9zaXRpb24gaW4gdGhlIHNlbGVjdGVkIHdvcmQgKi8KKwl3b3JkX29mZnNldCA9IG4gJSBXT1JEX0JJVF9TSVpFOworCisJc2VxX2JpdHNbd29yZF9udW1dIHw9IDEgPDwgd29yZF9vZmZzZXQ7CS8qIHR1cm4gdGhlIHBvc2l0aW9uIG9uICovCit9CisKKy8qIHNoaWZ0IHRoZSBwYWNrZXQgYXJyYXkgYnkgbiBwbGFjZXMuICovCit2b2lkIGJpdF9zaGlmdChUWVBFX09GX1dPUkQgKnNlcV9iaXRzLCBpbnQzMl90IG4pCit7CisJaW50MzJfdCB3b3JkX29mZnNldCwgd29yZF9udW07CisJaW50MzJfdCBpOworCisJaWYgKG4gPD0gMCkKKwkJcmV0dXJuOworCisJd29yZF9vZmZzZXQgPSBuICUgV09SRF9CSVRfU0laRTsvKiBzaGlmdCBob3cgbXVjaCBpbnNpZGUgZWFjaCB3b3JkICovCisJd29yZF9udW0gPSBuIC8gV09SRF9CSVRfU0laRTsJLyogc2hpZnQgb3ZlciBob3cgbXVjaCAoZnVsbCkgd29yZHMgKi8KKworCWZvciAoaSA9IE5VTV9XT1JEUyAtIDE7IGkgPiB3b3JkX251bTsgaS0tKSB7CisJCS8qIGdvaW5nIGZyb20gb2xkIHRvIG5ldywgc28gd2UgZG9uJ3Qgb3ZlcndyaXRlIHRoZSBkYXRhIHdlIGNvcHkKKwkJICogZnJvbS4KKwkJICoKKwkJICogbGVmdCBpcyBoaWdoLCByaWdodCBpcyBsb3c6IEZFREMgQkE5OCA3NjU0IDMyMTAKKwkJICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eIF5eCisJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dnZ2CisJCSAqIF5eXl4gPSBmcm9tLCB2dnZ2diA9dG8sIHdlJ2QgaGF2ZSB3b3JkX251bT09MSBhbmQKKwkJICogd29yZF9vZmZzZXQ9PVdPUkRfQklUX1NJWkUvMiA/Pz8/PyBpbiB0aGlzIGV4YW1wbGUuCisJCSAqICg9MjQgYml0cykKKwkJICoKKwkJICogb3VyIGRlc2lyZWQgb3V0cHV0IHdvdWxkIGJlOiA5ODc2IDU0MzIgMTAwMCAwMDAwCisJCSAqICovCisKKwkJc2VxX2JpdHNbaV0gPQorCQkJKHNlcV9iaXRzW2kgLSB3b3JkX251bV0gPDwgd29yZF9vZmZzZXQpICsKKwkJCS8qIHRha2UgdGhlIGxvd2VyIHBvcnQgZnJvbSB0aGUgbGVmdCBoYWxmLCBzaGlmdCBpdCBsZWZ0CisJCQkgKiB0byBpdHMgZmluYWwgcG9zaXRpb24gKi8KKwkJCShzZXFfYml0c1tpIC0gd29yZF9udW0gLSAxXSA+PgorCQkJIChXT1JEX0JJVF9TSVpFLXdvcmRfb2Zmc2V0KSk7CisJCS8qIGFuZCB0aGUgdXBwZXIgcGFydCBvZiB0aGUgcmlnaHQgaGFsZiBhbmQgc2hpZnQgaXQgbGVmdCB0bworCQkgKiBpdCdzIHBvc2l0aW9uICovCisJCS8qIGZvciBvdXIgZXhhbXBsZSB0aGF0IHdvdWxkIGJlOiB3b3JkWzBdID0gOTgwMCArIDAwNzYgPQorCQkgKiA5ODc2ICovCisJfQorCS8qIG5vdyBmb3Igb3VyIGxhc3Qgd29yZCwgaT09d29yZF9udW0sIHdlIG9ubHkgaGF2ZSB0aGUgaXQncyAibGVmdCIKKwkgKiBoYWxmLiB0aGF0J3MgdGhlIDEwMDAgd29yZCBpbiBvdXIgZXhhbXBsZS4qLworCisJc2VxX2JpdHNbaV0gPSAoc2VxX2JpdHNbaSAtIHdvcmRfbnVtXSA8PCB3b3JkX29mZnNldCk7CisKKwkvKiBwYWQgdGhlIHJlc3Qgd2l0aCAwLCBpZiB0aGVyZSBpcyBhbnl0aGluZyAqLworCWktLTsKKworCWZvciAoOyBpID49IDA7IGktLSkKKwkJc2VxX2JpdHNbaV0gPSAwOworfQorCisKKy8qIHJlY2VpdmUgYW5kIHByb2Nlc3Mgb25lIHBhY2tldCwgcmV0dXJucyAxIGlmIHJlY2VpdmVkIHNlcV9udW0gaXMgY29uc2lkZXJlZAorICogbmV3LCAwIGlmIG9sZCAgKi8KK2NoYXIgYml0X2dldF9wYWNrZXQoVFlQRV9PRl9XT1JEICpzZXFfYml0cywgaW50MTZfdCBzZXFfbnVtX2RpZmYsCisJCSAgICBpbnQ4X3Qgc2V0X21hcmspCit7CisJaW50IGk7CisKKwkvKiB3ZSBhbHJlYWR5IGdvdCBhIHNlcXVlbmNlIG51bWJlciBoaWdoZXIgdGhhbiB0aGlzIG9uZSwgc28gd2UganVzdAorCSAqIG1hcmsgaXQuIHRoaXMgc2hvdWxkIHdyYXAgYXJvdW5kIHRoZSBpbnRlZ2VyIGp1c3QgZmluZSAqLworCWlmICgoc2VxX251bV9kaWZmIDwgMCkgJiYgKHNlcV9udW1fZGlmZiA+PSAtVFFfTE9DQUxfV0lORE9XX1NJWkUpKSB7CisJCWlmIChzZXRfbWFyaykKKwkJCWJpdF9tYXJrKHNlcV9iaXRzLCAtc2VxX251bV9kaWZmKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogaXQgc2VlbXMgd2UgbWlzc2VkIGEgbG90IG9mIHBhY2tldHMgb3IgdGhlIG90aGVyIGhvc3QgcmVzdGFydGVkICovCisJaWYgKChzZXFfbnVtX2RpZmYgPiBUUV9MT0NBTF9XSU5ET1dfU0laRSkgfHwKKwkgICAgKHNlcV9udW1fZGlmZiA8IC1UUV9MT0NBTF9XSU5ET1dfU0laRSkpIHsKKworCQlpZiAoc2VxX251bV9kaWZmID4gVFFfTE9DQUxfV0lORE9XX1NJWkUpCisJCQlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLAorCQkJCSAgIldlIG1pc3NlZCBhIGxvdCBvZiBwYWNrZXRzICglaSkgIVxuIiwKKwkJCQkgIHNlcV9udW1fZGlmZi0xKTsKKworCQlpZiAoLXNlcV9udW1fZGlmZiA+IFRRX0xPQ0FMX1dJTkRPV19TSVpFKQorCQkJZGVidWdfbG9nKExPR19UWVBFX0JBVE1BTiwKKwkJCQkgICJPdGhlciBob3N0IHByb2JhYmx5IHJlc3RhcnRlZCAhXG4iKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1dPUkRTOyBpKyspCisJCQlzZXFfYml0c1tpXSA9IDA7CisKKwkJaWYgKHNldF9tYXJrKQorCQkJc2VxX2JpdHNbMF0gPSAxOyAgLyogd2Ugb25seSBoYXZlIHRoZSBsYXRlc3QgcGFja2V0ICovCisJfSBlbHNlIHsKKwkJYml0X3NoaWZ0KHNlcV9iaXRzLCBzZXFfbnVtX2RpZmYpOworCisJCWlmIChzZXRfbWFyaykKKwkJCWJpdF9tYXJrKHNlcV9iaXRzLCAwKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyogY291bnQgdGhlIGhhbW1pbmcgd2VpZ2h0LCBob3cgbWFueSBnb29kIHBhY2tldHMgZGlkIHdlIHJlY2VpdmU/IGp1c3QgY291bnQKKyAqIHRoZSAxJ3MuIFRoZSBpbm5lciBsb29wIHVzZXMgdGhlIEtlcm5pZ2hhbiBhbGdvcml0aG0sIHNlZQorICogaHR0cDovL2dyYXBoaWNzLnN0YW5mb3JkLmVkdS9+c2VhbmRlci9iaXRoYWNrcy5odG1sI0NvdW50Qml0c1NldEtlcm5pZ2hhbgorICovCitpbnQgYml0X3BhY2tldF9jb3VudChUWVBFX09GX1dPUkQgKnNlcV9iaXRzKQoreworCWludCBpLCBoYW1taW5nID0gMDsKKwlUWVBFX09GX1dPUkQgd29yZDsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fV09SRFM7IGkrKykgeworCQl3b3JkID0gc2VxX2JpdHNbaV07CisKKwkJd2hpbGUgKHdvcmQpIHsKKwkJCXdvcmQgJj0gd29yZC0xOworCQkJaGFtbWluZysrOworCQl9CisJfQorCXJldHVybiBoYW1taW5nOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYml0YXJyYXkuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JpdGFycmF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM3MmRkNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JpdGFycmF5LmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogU2ltb24gV3VuZGVybGljaCwgTWFyZWsgTGluZG5lcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKworLyogeW91IHNob3VsZCBjaG9vc2Ugc29tZXRoaW5nIGJpZywgaWYgeW91IGRvbid0IHdhbnQgdG8gd2FzdGUgY3B1ICovCisjZGVmaW5lIFRZUEVfT0ZfV09SRCB1bnNpZ25lZCBsb25nCisjZGVmaW5lIFdPUkRfQklUX1NJWkUgKHNpemVvZihUWVBFX09GX1dPUkQpICogOCkKKworLyogcmV0dXJucyB0cnVlIGlmIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgZ2l2ZW4gc2VxX2JpdHMgaW5kaWNhdGVzIHRydWUKKyAqIGFuZCBjdXJyX3NlcW5vIGlzIHdpdGhpbiByYW5nZSBvZiBsYXN0X3NlcW5vICovCit1aW50OF90IGdldF9iaXRfc3RhdHVzKFRZUEVfT0ZfV09SRCAqc2VxX2JpdHMsIHVpbnQxNl90IGxhc3Rfc2Vxbm8sCisJCQkJCSAgIHVpbnQxNl90IGN1cnJfc2Vxbm8pOworCisvKiB0dXJuIGNvcnJlc3BvbmRpbmcgYml0IG9uLCBzbyB3ZSBjYW4gcmVtZW1iZXIgdGhhdCB3ZSBnb3QgdGhlIHBhY2tldCAqLwordm9pZCBiaXRfbWFyayhUWVBFX09GX1dPUkQgKnNlcV9iaXRzLCBpbnQzMl90IG4pOworCisvKiBzaGlmdCB0aGUgcGFja2V0IGFycmF5IGJ5IG4gcGxhY2VzLiAqLwordm9pZCBiaXRfc2hpZnQoVFlQRV9PRl9XT1JEICpzZXFfYml0cywgaW50MzJfdCBuKTsKKworCisvKiByZWNlaXZlIGFuZCBwcm9jZXNzIG9uZSBwYWNrZXQsIHJldHVybnMgMSBpZiByZWNlaXZlZCBzZXFfbnVtIGlzIGNvbnNpZGVyZWQKKyAqIG5ldywgMCBpZiBvbGQgICovCitjaGFyIGJpdF9nZXRfcGFja2V0KFRZUEVfT0ZfV09SRCAqc2VxX2JpdHMsIGludDE2X3Qgc2VxX251bV9kaWZmLAorCQkJCQlpbnQ4X3Qgc2V0X21hcmspOworCisvKiBjb3VudCB0aGUgaGFtbWluZyB3ZWlnaHQsIGhvdyBtYW55IGdvb2QgcGFja2V0cyBkaWQgd2UgcmVjZWl2ZT8gKi8KK2ludCAgYml0X3BhY2tldF9jb3VudChUWVBFX09GX1dPUkQgKnNlcV9iaXRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2NvbXBhdC5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvY29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRlMGE0NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2NvbXBhdC5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgbWFjcm9zIGZvciBtYWludGFpbmluZyBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMKKyAqIG9mIHRoZSBMaW51eCBrZXJuZWwuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4JLyogTElOVVhfVkVSU0lPTl9DT0RFICovCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA2LCAyMikKKworI2RlZmluZSBza2Jfc2V0X25ldHdvcmtfaGVhZGVyKF9za2IsIF9vZmZzZXQpIFwKKwlkbyB7IChfc2tiKS0+bmgucmF3ID0gKF9za2IpLT5kYXRhICsgKF9vZmZzZXQpOyB9IHdoaWxlICgwKQorCisjZGVmaW5lIHNrYl9yZXNldF9tYWNfaGVhZGVyKF9za2IpIFwKKwlkbyB7IChfc2tiKS0+bWFjLnJhdyA9IChfc2tiKS0+ZGF0YTsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBsaXN0X2ZpcnN0X2VudHJ5KHB0ciwgdHlwZSwgbWVtYmVyKSBcCisJbGlzdF9lbnRyeSgocHRyKS0+bmV4dCwgdHlwZSwgbWVtYmVyKQorCisjZW5kaWYgLyogTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMjIpICovCisKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDI2KQorCisjZGVmaW5lIGRldmljZV9jcmVhdGUoX2NscywgX3BhcmVudCwgX2RldnQsIF9kZXZpY2UsIF9mbXQpIFwKKwljbGFzc19kZXZpY2VfY3JlYXRlKF9jbHMsIF9wYXJlbnQsIF9kZXZ0LCBfZGV2aWNlLCBfZm10KQorCisjZGVmaW5lIGRldmljZV9kZXN0cm95KF9jbHMsIF9kZXZpY2UpIFwKKwljbGFzc19kZXZpY2VfZGVzdHJveShfY2xzLCBfZGV2aWNlKQorCisjZWxzZQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMjcpCisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZShfY2xzLCBfcGFyZW50LCBfZGV2dCwgX2RldmljZSwgX2ZtdCkgXAorCWRldmljZV9jcmVhdGVfZHJ2ZGF0YShfY2xzLCBfcGFyZW50LCBfZGV2dCwgX2RldmljZSwgX2ZtdCkKKworI2VuZGlmIC8qIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDI3KSAqLworCisjZW5kaWYgLyogTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMjYpICovCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA2LCAyMykKKworI2RlZmluZSBjYW5jZWxfZGVsYXllZF93b3JrX3N5bmMod3EpIGNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmsod3EpCisKKyNlbmRpZiAvKiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA2LCAyMykgKi8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA2LCAyNSkKKyNkZWZpbmUgc3RyaWN0X3N0cnRvdWwoY3AsIGJhc2UsIHJlcykgXAorCSh7IFwKKwlpbnQgcmV0ID0gMDsgXAorCWNoYXIgKmVuZHA7IFwKKwkqcmVzID0gc2ltcGxlX3N0cnRvdWwoY3AsICZlbmRwLCBiYXNlKTsgXAorCWlmIChjcCA9PSBlbmRwKSBcCisJCXJldCA9IC1FSU5WQUw7IFwKKwlyZXQ7IFwKK30pCisjZW5kaWYgLyogTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMjUpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9kZXZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2RldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlN2QxZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9kZXZpY2UuYwpAQCAtMCwwICsxLDMzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogTWFyZWsgTGluZG5lcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAiZGV2aWNlLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAic2VuZC5oIgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAiaGFzaC5oIgorCisjaW5jbHVkZSAiY29tcGF0LmgiCisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgKmJhdG1hbl9jbGFzczsKKworc3RhdGljIGludCBNYWpvcjsJLyogTWFqb3IgbnVtYmVyIGFzc2lnbmVkIHRvIG91ciBkZXZpY2UgZHJpdmVyICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHMgPSB7CisJLm9wZW4gPSBiYXRfZGV2aWNlX29wZW4sCisJLnJlbGVhc2UgPSBiYXRfZGV2aWNlX3JlbGVhc2UsCisJLnJlYWQgPSBiYXRfZGV2aWNlX3JlYWQsCisJLndyaXRlID0gYmF0X2RldmljZV93cml0ZSwKKwkucG9sbCA9IGJhdF9kZXZpY2VfcG9sbCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2NsaWVudCAqZGV2aWNlX2NsaWVudF9oYXNoWzI1Nl07CisKK3ZvaWQgYmF0X2RldmljZV9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCWRldmljZV9jbGllbnRfaGFzaFtpXSA9IE5VTEw7Cit9CisKK2ludCBiYXRfZGV2aWNlX3NldHVwKHZvaWQpCit7CisJaW50IHRtcF9tYWpvcjsKKworCWlmIChNYWpvcikKKwkJcmV0dXJuIDE7CisKKwkvKiByZWdpc3RlciBvdXIgZGV2aWNlIC0ga2VybmVsIGFzc2lnbnMgYSBmcmVlIG1ham9yIG51bWJlciAqLworCXRtcF9tYWpvciA9IHJlZ2lzdGVyX2NocmRldigwLCBEUklWRVJfREVWSUNFLCAmZm9wcyk7CisJaWYgKHRtcF9tYWpvciA8IDApIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX1dBUk4sICJSZWdpc3RlcmluZyB0aGUgY2hhcmFjdGVyIGRldmljZSBmYWlsZWQgd2l0aCAlZFxuIiwKKwkJCSAgdG1wX21ham9yKTsKKwkJcmV0dXJuIDA7CisJfQorCisJYmF0bWFuX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAiYmF0bWFuLWFkdiIpOworCisJaWYgKElTX0VSUihiYXRtYW5fY2xhc3MpKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9XQVJOLCAiQ291bGQgbm90IHJlZ2lzdGVyIGNsYXNzICdiYXRtYW4tYWR2JyBcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkZXZpY2VfY3JlYXRlKGJhdG1hbl9jbGFzcywgTlVMTCwgTUtERVYodG1wX21ham9yLCAwKSwgTlVMTCwKKwkJICAgICAgImJhdG1hbi1hZHYiKTsKKworCU1ham9yID0gdG1wX21ham9yOworCXJldHVybiAxOworfQorCit2b2lkIGJhdF9kZXZpY2VfZGVzdHJveSh2b2lkKQoreworCWlmICghTWFqb3IpCisJCXJldHVybjsKKworCWRldmljZV9kZXN0cm95KGJhdG1hbl9jbGFzcywgTUtERVYoTWFqb3IsIDApKTsKKwljbGFzc19kZXN0cm95KGJhdG1hbl9jbGFzcyk7CisKKwkvKiBVbnJlZ2lzdGVyIHRoZSBkZXZpY2UgKi8KKwl1bnJlZ2lzdGVyX2NocmRldihNYWpvciwgRFJJVkVSX0RFVklDRSk7CisKKwlNYWpvciA9IDA7Cit9CisKK2ludCBiYXRfZGV2aWNlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGRldmljZV9jbGllbnQgKmRldmljZV9jbGllbnQ7CisKKwlkZXZpY2VfY2xpZW50ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRldmljZV9jbGllbnQpLCBHRlBfS0VSTkVMKTsKKworCWlmICghZGV2aWNlX2NsaWVudCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJaWYgKCFkZXZpY2VfY2xpZW50X2hhc2hbaV0pIHsKKwkJCWRldmljZV9jbGllbnRfaGFzaFtpXSA9IGRldmljZV9jbGllbnQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChkZXZpY2VfY2xpZW50X2hhc2hbaV0gIT0gZGV2aWNlX2NsaWVudCkgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfV0FSTiwgIkVycm9yIC0gY2FuJ3QgYWRkIGFub3RoZXIgcGFja2V0IGNsaWVudDogbWF4aW11bSBudW1iZXIgb2YgY2xpZW50cyByZWFjaGVkIFxuIik7CisJCWtmcmVlKGRldmljZV9jbGllbnQpOworCQlyZXR1cm4gLUVYRlVMTDsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCgmZGV2aWNlX2NsaWVudC0+cXVldWVfbGlzdCk7CisJZGV2aWNlX2NsaWVudC0+cXVldWVfbGVuID0gMDsKKwlkZXZpY2VfY2xpZW50LT5pbmRleCA9IGk7CisJZGV2aWNlX2NsaWVudC0+bG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGRldmljZV9jbGllbnQtPmxvY2spOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldmljZV9jbGllbnQtPnF1ZXVlX3dhaXQpOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZGV2aWNlX2NsaWVudDsKKworCWluY19tb2R1bGVfY291bnQoKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGJhdF9kZXZpY2VfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX2NsaWVudCAqZGV2aWNlX2NsaWVudCA9CisJCShzdHJ1Y3QgZGV2aWNlX2NsaWVudCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlX3BhY2tldCAqZGV2aWNlX3BhY2tldDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0X3BvcywgKmxpc3RfcG9zX3RtcDsKKworCXNwaW5fbG9jaygmZGV2aWNlX2NsaWVudC0+bG9jayk7CisKKwkvKiBmb3IgYWxsIHBhY2tldHMgaW4gdGhlIHF1ZXVlIC4uLiAqLworCWxpc3RfZm9yX2VhY2hfc2FmZShsaXN0X3BvcywgbGlzdF9wb3NfdG1wLCAmZGV2aWNlX2NsaWVudC0+cXVldWVfbGlzdCkgeworCQlkZXZpY2VfcGFja2V0ID0gbGlzdF9lbnRyeShsaXN0X3BvcywKKwkJCQkJICAgc3RydWN0IGRldmljZV9wYWNrZXQsIGxpc3QpOworCisJCWxpc3RfZGVsKGxpc3RfcG9zKTsKKwkJa2ZyZWUoZGV2aWNlX3BhY2tldCk7CisJfQorCisJZGV2aWNlX2NsaWVudF9oYXNoW2RldmljZV9jbGllbnQtPmluZGV4XSA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmRldmljZV9jbGllbnQtPmxvY2spOworCisJa2ZyZWUoZGV2aWNlX2NsaWVudCk7CisJZGVjX21vZHVsZV9jb3VudCgpOworCisJcmV0dXJuIDA7Cit9CisKK3NzaXplX3QgYmF0X2RldmljZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCisJCQlsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGRldmljZV9jbGllbnQgKmRldmljZV9jbGllbnQgPQorCQkoc3RydWN0IGRldmljZV9jbGllbnQgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRldmljZV9wYWNrZXQgKmRldmljZV9wYWNrZXQ7CisJaW50IGVycm9yOworCisJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgJiYgKGRldmljZV9jbGllbnQtPnF1ZXVlX2xlbiA9PSAwKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlpZiAoKCFidWYpIHx8IChjb3VudCA8IHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXQpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZiwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWVycm9yID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGRldmljZV9jbGllbnQtPnF1ZXVlX3dhaXQsCisJCQkJCSBkZXZpY2VfY2xpZW50LT5xdWV1ZV9sZW4pOworCisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlzcGluX2xvY2soJmRldmljZV9jbGllbnQtPmxvY2spOworCisJZGV2aWNlX3BhY2tldCA9IGxpc3RfZmlyc3RfZW50cnkoJmRldmljZV9jbGllbnQtPnF1ZXVlX2xpc3QsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlX3BhY2tldCwgbGlzdCk7CisJbGlzdF9kZWwoJmRldmljZV9wYWNrZXQtPmxpc3QpOworCWRldmljZV9jbGllbnQtPnF1ZXVlX2xlbi0tOworCisJc3Bpbl91bmxvY2soJmRldmljZV9jbGllbnQtPmxvY2spOworCisJZXJyb3IgPSBfX2NvcHlfdG9fdXNlcihidWYsICZkZXZpY2VfcGFja2V0LT5pY21wX3BhY2tldCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGljbXBfcGFja2V0KSk7CisKKwlrZnJlZShkZXZpY2VfcGFja2V0KTsKKworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXQpOworfQorCitzc2l6ZV90IGJhdF9kZXZpY2Vfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmLAorCQkJIHNpemVfdCBsZW4sIGxvZmZfdCAqb2ZmKQoreworCXN0cnVjdCBkZXZpY2VfY2xpZW50ICpkZXZpY2VfY2xpZW50ID0KKwkJKHN0cnVjdCBkZXZpY2VfY2xpZW50ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpY21wX3BhY2tldCBpY21wX3BhY2tldDsKKwlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7CisJc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOworCisJaWYgKGxlbiA8IHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXQpKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9OT1RJQ0UsICJFcnJvciAtIGNhbid0IHNlbmQgcGFja2V0IGZyb20gY2hhciBkZXZpY2U6IGludmFsaWQgcGFja2V0IHNpemVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZiwgc2l6ZW9mKHN0cnVjdCBpY21wX3BhY2tldCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChfX2NvcHlfZnJvbV91c2VyKCZpY21wX3BhY2tldCwgYnVmZiwgc2l6ZW9mKGljbXBfcGFja2V0KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGljbXBfcGFja2V0LnBhY2tldF90eXBlICE9IEJBVF9JQ01QKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9OT1RJQ0UsICJFcnJvciAtIGNhbid0IHNlbmQgcGFja2V0IGZyb20gY2hhciBkZXZpY2U6IGdvdCBib2d1cyBwYWNrZXQgdHlwZSAoZXhwZWN0ZWQ6IEJBVF9JQ01QKVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChpY21wX3BhY2tldC5tc2dfdHlwZSAhPSBFQ0hPX1JFUVVFU1QpIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX05PVElDRSwgIkVycm9yIC0gY2FuJ3Qgc2VuZCBwYWNrZXQgZnJvbSBjaGFyIGRldmljZTogZ290IGJvZ3VzIG1lc3NhZ2UgdHlwZSAoZXhwZWN0ZWQ6IEVDSE9fUkVRVUVTVClcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpY21wX3BhY2tldC51aWQgPSBkZXZpY2VfY2xpZW50LT5pbmRleDsKKworCWlmIChpY21wX3BhY2tldC52ZXJzaW9uICE9IENPTVBBVF9WRVJTSU9OKSB7CisJCWljbXBfcGFja2V0Lm1zZ190eXBlID0gUEFSQU1FVEVSX1BST0JMRU07CisJCWljbXBfcGFja2V0LnR0bCA9IENPTVBBVF9WRVJTSU9OOworCQliYXRfZGV2aWNlX2FkZF9wYWNrZXQoZGV2aWNlX2NsaWVudCwgJmljbXBfcGFja2V0KTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGF0b21pY19yZWFkKCZtb2R1bGVfc3RhdGUpICE9IE1PRFVMRV9BQ1RJVkUpCisJCWdvdG8gZHN0X3VucmVhY2g7CisKKwlzcGluX2xvY2soJm9yaWdfaGFzaF9sb2NrKTsKKwlvcmlnX25vZGUgPSAoKHN0cnVjdCBvcmlnX25vZGUgKiloYXNoX2ZpbmQob3JpZ19oYXNoLCBpY21wX3BhY2tldC5kc3QpKTsKKworCWlmICghb3JpZ19ub2RlKQorCQlnb3RvIHVubG9jazsKKworCWlmICghb3JpZ19ub2RlLT5yb3V0ZXIpCisJCWdvdG8gdW5sb2NrOworCisJYmF0bWFuX2lmID0gb3JpZ19ub2RlLT5iYXRtYW5faWY7CisKKwlpZiAoIWJhdG1hbl9pZikKKwkJZ290byB1bmxvY2s7CisKKwltZW1jcHkoaWNtcF9wYWNrZXQub3JpZywKKwkgICAgICAgYmF0bWFuX2lmLT5uZXRfZGV2LT5kZXZfYWRkciwKKwkgICAgICAgRVRIX0FMRU4pOworCisJc2VuZF9yYXdfcGFja2V0KCh1bnNpZ25lZCBjaGFyICopJmljbXBfcGFja2V0LAorCQkJc2l6ZW9mKHN0cnVjdCBpY21wX3BhY2tldCksCisJCQliYXRtYW5faWYsIG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyKTsKKworCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJZ290byBvdXQ7CisKK3VubG9jazoKKwlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworZHN0X3VucmVhY2g6CisJaWNtcF9wYWNrZXQubXNnX3R5cGUgPSBERVNUSU5BVElPTl9VTlJFQUNIQUJMRTsKKwliYXRfZGV2aWNlX2FkZF9wYWNrZXQoZGV2aWNlX2NsaWVudCwgJmljbXBfcGFja2V0KTsKK291dDoKKwlyZXR1cm4gbGVuOworfQorCit1bnNpZ25lZCBpbnQgYmF0X2RldmljZV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCBkZXZpY2VfY2xpZW50ICpkZXZpY2VfY2xpZW50ID0KKwkJKHN0cnVjdCBkZXZpY2VfY2xpZW50ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcG9sbF93YWl0KGZpbGUsICZkZXZpY2VfY2xpZW50LT5xdWV1ZV93YWl0LCB3YWl0KTsKKworCWlmIChkZXZpY2VfY2xpZW50LT5xdWV1ZV9sZW4gPiAwKQorCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKKworCXJldHVybiAwOworfQorCit2b2lkIGJhdF9kZXZpY2VfYWRkX3BhY2tldChzdHJ1Y3QgZGV2aWNlX2NsaWVudCAqZGV2aWNlX2NsaWVudCwKKwkJCSAgIHN0cnVjdCBpY21wX3BhY2tldCAqaWNtcF9wYWNrZXQpCit7CisJc3RydWN0IGRldmljZV9wYWNrZXQgKmRldmljZV9wYWNrZXQ7CisKKwlkZXZpY2VfcGFja2V0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRldmljZV9wYWNrZXQpLCBHRlBfS0VSTkVMKTsKKworCWlmICghZGV2aWNlX3BhY2tldCkKKwkJcmV0dXJuOworCisJSU5JVF9MSVNUX0hFQUQoJmRldmljZV9wYWNrZXQtPmxpc3QpOworCW1lbWNweSgmZGV2aWNlX3BhY2tldC0+aWNtcF9wYWNrZXQsIGljbXBfcGFja2V0LAorCSAgICAgICBzaXplb2Yoc3RydWN0IGljbXBfcGFja2V0KSk7CisKKwlzcGluX2xvY2soJmRldmljZV9jbGllbnQtPmxvY2spOworCisJLyogd2hpbGUgd2FpdGluZyBmb3IgdGhlIGxvY2sgdGhlIGRldmljZV9jbGllbnQgY291bGQgaGF2ZSBiZWVuCisJICogZGVsZXRlZCAqLworCWlmICghZGV2aWNlX2NsaWVudF9oYXNoW2ljbXBfcGFja2V0LT51aWRdKSB7CisJCXNwaW5fdW5sb2NrKCZkZXZpY2VfY2xpZW50LT5sb2NrKTsKKwkJa2ZyZWUoZGV2aWNlX3BhY2tldCk7CisJCXJldHVybjsKKwl9CisKKwlsaXN0X2FkZF90YWlsKCZkZXZpY2VfcGFja2V0LT5saXN0LCAmZGV2aWNlX2NsaWVudC0+cXVldWVfbGlzdCk7CisJZGV2aWNlX2NsaWVudC0+cXVldWVfbGVuKys7CisKKwlpZiAoZGV2aWNlX2NsaWVudC0+cXVldWVfbGVuID4gMTAwKSB7CisJCWRldmljZV9wYWNrZXQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZkZXZpY2VfY2xpZW50LT5xdWV1ZV9saXN0LAorCQkJCQkJIHN0cnVjdCBkZXZpY2VfcGFja2V0LCBsaXN0KTsKKworCQlsaXN0X2RlbCgmZGV2aWNlX3BhY2tldC0+bGlzdCk7CisJCWtmcmVlKGRldmljZV9wYWNrZXQpOworCQlkZXZpY2VfY2xpZW50LT5xdWV1ZV9sZW4tLTsKKwl9CisKKwlzcGluX3VubG9jaygmZGV2aWNlX2NsaWVudC0+bG9jayk7CisKKwl3YWtlX3VwKCZkZXZpY2VfY2xpZW50LT5xdWV1ZV93YWl0KTsKK30KKwordm9pZCBiYXRfZGV2aWNlX3JlY2VpdmVfcGFja2V0KHN0cnVjdCBpY21wX3BhY2tldCAqaWNtcF9wYWNrZXQpCit7CisJc3RydWN0IGRldmljZV9jbGllbnQgKmhhc2ggPSBkZXZpY2VfY2xpZW50X2hhc2hbaWNtcF9wYWNrZXQtPnVpZF07CisKKwlpZiAoaGFzaCkKKwkJYmF0X2RldmljZV9hZGRfcGFja2V0KGhhc2gsIGljbXBfcGFja2V0KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2RldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZjMGY0NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2RldmljZS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIE1hcmVrIExpbmRuZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCisjaW5jbHVkZSAidHlwZXMuaCIKKwordm9pZCBiYXRfZGV2aWNlX2luaXQodm9pZCk7CitpbnQgYmF0X2RldmljZV9zZXR1cCh2b2lkKTsKK3ZvaWQgYmF0X2RldmljZV9kZXN0cm95KHZvaWQpOworaW50IGJhdF9kZXZpY2Vfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitpbnQgYmF0X2RldmljZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3NzaXplX3QgYmF0X2RldmljZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCisJCQlsb2ZmX3QgKnBwb3MpOworc3NpemVfdCBiYXRfZGV2aWNlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZiwKKwkJCSBzaXplX3QgbGVuLCBsb2ZmX3QgKm9mZik7Cit1bnNpZ25lZCBpbnQgYmF0X2RldmljZV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KTsKK3ZvaWQgYmF0X2RldmljZV9hZGRfcGFja2V0KHN0cnVjdCBkZXZpY2VfY2xpZW50ICpkZXZpY2VfY2xpZW50LAorCQkJICAgc3RydWN0IGljbXBfcGFja2V0ICppY21wX3BhY2tldCk7Cit2b2lkIGJhdF9kZXZpY2VfcmVjZWl2ZV9wYWNrZXQoc3RydWN0IGljbXBfcGFja2V0ICppY21wX3BhY2tldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXJkLWludGVyZmFjZS5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFyZC1pbnRlcmZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWEzNWRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFyZC1pbnRlcmZhY2UuYwpAQCAtMCwwICsxLDQ1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJzb2Z0LWludGVyZmFjZS5oIgorI2luY2x1ZGUgInNlbmQuaCIKKyNpbmNsdWRlICJ0cmFuc2xhdGlvbi10YWJsZS5oIgorI2luY2x1ZGUgInJvdXRpbmcuaCIKKyNpbmNsdWRlICJoYXNoLmgiCisjaW5jbHVkZSAiY29tcGF0LmgiCisKKyNkZWZpbmUgTUlOKHgsIHkpICgoeCkgPCAoeSkgPyAoeCkgOiAoeSkpCisKK3N0YXRpYyBjaGFyIGF2YWlsX2lmczsKK3N0YXRpYyBjaGFyIGFjdGl2ZV9pZnM7CisKK3N0YXRpYyB2b2lkIGhhcmRpZl9mcmVlX2ludGVyZmFjZShzdHJ1Y3QgcmN1X2hlYWQgKnJjdSk7CisKK3N0YXRpYyBzdHJ1Y3QgYmF0bWFuX2lmICpnZXRfYmF0bWFuX2lmX2J5X25hbWUoY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWY7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoYmF0bWFuX2lmLCAmaWZfbGlzdCwgbGlzdCkgeworCQlpZiAoc3RybmNtcChiYXRtYW5faWYtPmRldiwgbmFtZSwgSUZOQU1TSVopID09IDApCisJCQlnb3RvIG91dDsKKwl9CisKKwliYXRtYW5faWYgPSBOVUxMOworCitvdXQ6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIGJhdG1hbl9pZjsKK30KKworaW50IGhhcmRpZl9taW5fbXR1KHZvaWQpCit7CisJc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOworCS8qIGFsbG93IGJpZyBmcmFtZXMgaWYgYWxsIGRldmljZXMgYXJlIGNhcGFibGUgdG8gZG8gc28KKwkgKiAoaGF2ZSBNVFUgPiAxNTAwICsgQkFUX0hFQURFUl9MRU4pICovCisJaW50IG1pbl9tdHUgPSBFVEhfREFUQV9MRU47CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoYmF0bWFuX2lmLCAmaWZfbGlzdCwgbGlzdCkgeworCQlpZiAoKGJhdG1hbl9pZi0+aWZfYWN0aXZlID09IElGX0FDVElWRSkgfHwKKwkJICAgIChiYXRtYW5faWYtPmlmX2FjdGl2ZSA9PSBJRl9UT19CRV9BQ1RJVkFURUQpKQorCQkJbWluX210dSA9IE1JTihiYXRtYW5faWYtPm5ldF9kZXYtPm10dSAtIEJBVF9IRUFERVJfTEVOLAorCQkJCSAgICAgIG1pbl9tdHUpOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiBtaW5fbXR1OworfQorCitzdGF0aWMgdm9pZCBjaGVja19rbm93bl9tYWNfYWRkcih1aW50OF90ICphZGRyKQoreworCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKKwljaGFyIG1hY19zdHJpbmdbRVRIX1NUUl9MRU5dOworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGJhdG1hbl9pZiwgJmlmX2xpc3QsIGxpc3QpIHsKKwkJaWYgKChiYXRtYW5faWYtPmlmX2FjdGl2ZSAhPSBJRl9BQ1RJVkUpICYmCisJCSAgICAoYmF0bWFuX2lmLT5pZl9hY3RpdmUgIT0gSUZfVE9fQkVfQUNUSVZBVEVEKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghY29tcGFyZV9vcmlnKGJhdG1hbl9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIsIGFkZHIpKQorCQkJY29udGludWU7CisKKwkJYWRkcl90b19zdHJpbmcobWFjX3N0cmluZywgYWRkcik7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9XQVJOLCAiVGhlIG5ld2x5IGFkZGVkIG1hYyBhZGRyZXNzICglcykgYWxyZWFkeSBleGlzdHMgb246ICVzXG4iLAorCQkgICAgICAgICAgbWFjX3N0cmluZywgYmF0bWFuX2lmLT5kZXYpOworCQlkZWJ1Z19sb2coTE9HX1RZUEVfV0FSTiwgIkl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGtlZXAgbWFjIGFkZHJlc3NlcyB1bmlxdWUgdG8gYXZvaWQgcHJvYmxlbXMhXG4iKTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CisKKy8qIGFkanVzdHMgdGhlIE1UVSBpZiBhIG5ldyBpbnRlcmZhY2Ugd2l0aCBhIHNtYWxsZXIgTVRVIGFwcGVhcmVkLiAqLwordm9pZCB1cGRhdGVfbWluX210dSh2b2lkKQoreworCWludCBtaW5fbXR1OworCisJbWluX210dSA9IGhhcmRpZl9taW5fbXR1KCk7CisJaWYgKHNvZnRfZGV2aWNlLT5tdHUgIT0gbWluX210dSkKKwkJc29mdF9kZXZpY2UtPm10dSA9IG1pbl9tdHU7Cit9CisKKy8qIGNoZWNrcyBpZiB0aGUgaW50ZXJmYWNlIGlzIHVwLiAocmV0dXJucyAxIGlmIGl0IGlzKSAqLworc3RhdGljIGludCBoYXJkaWZfaXNfaW50ZXJmYWNlX3VwKGNoYXIgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldjsKKworCS8qKgorCSAqIGlmIHdlIGFscmVhZHkgaGF2ZSBhbiBpbnRlcmZhY2UgaW4gb3VyIGludGVyZmFjZSBsaXN0IGFuZAorCSAqIHRoZSBjdXJyZW50IGludGVyZmFjZSBpcyBub3QgdGhlIHByaW1hcnkgaW50ZXJmYWNlIGFuZAorCSAqIHRoZSBwcmltYXJ5IGludGVyZmFjZSBpcyBub3QgdXAgYW5kCisJICogdGhlIHByaW1hcnkgaW50ZXJmYWNlIGhhcyBuZXZlciBiZWVuIHVwIC0gZG9uJ3QgYWN0aXZhdGUgYW55CisJICogc2Vjb25kYXJ5IGludGVyZmFjZSAhCisJICovCisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKCghbGlzdF9lbXB0eSgmaWZfbGlzdCkpICYmCisJICAgIHN0cm5jbXAoKChzdHJ1Y3QgYmF0bWFuX2lmICopaWZfbGlzdC5uZXh0KS0+ZGV2LCBkZXYsIElGTkFNU0laKSAmJgorCSAgICAhKCgoc3RydWN0IGJhdG1hbl9pZiAqKWlmX2xpc3QubmV4dCktPmlmX2FjdGl2ZSA9PSBJRl9BQ1RJVkUpICYmCisJICAgICEoKChzdHJ1Y3QgYmF0bWFuX2lmICopaWZfbGlzdC5uZXh0KS0+aWZfYWN0aXZlID09IElGX1RPX0JFX0FDVElWQVRFRCkgJiYKKwkgICAgKCFtYWluX2lmX3dhc191cCgpKSkgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJZ290byBlbmQ7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisjaWZkZWYgX19ORVRfTkVUX05BTUVTUEFDRV9ICisJbmV0X2RldiA9IGRldl9nZXRfYnlfbmFtZSgmaW5pdF9uZXQsIGRldik7CisjZWxzZQorCW5ldF9kZXYgPSBkZXZfZ2V0X2J5X25hbWUoZGV2KTsKKyNlbmRpZgorCWlmICghbmV0X2RldikKKwkJZ290byBlbmQ7CisKKwlpZiAoIShuZXRfZGV2LT5mbGFncyAmIElGRl9VUCkpCisJCWdvdG8gZmFpbHVyZTsKKworCWRldl9wdXQobmV0X2Rldik7CisJcmV0dXJuIDE7CisKK2ZhaWx1cmU6CisJZGV2X3B1dChuZXRfZGV2KTsKK2VuZDoKKwlyZXR1cm4gMDsKK30KKworLyogZGVhY3RpdmF0ZXMgdGhlIGludGVyZmFjZS4gKi8KK3ZvaWQgaGFyZGlmX2RlYWN0aXZhdGVfaW50ZXJmYWNlKHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZikKK3sKKwlpZiAoYmF0bWFuX2lmLT5pZl9hY3RpdmUgIT0gSUZfQUNUSVZFKQorCQlyZXR1cm47CisKKwlpZiAoYmF0bWFuX2lmLT5yYXdfc29jaykKKwkJc29ja19yZWxlYXNlKGJhdG1hbl9pZi0+cmF3X3NvY2spOworCisJLyoqCisJICogYmF0bWFuX2lmLT5uZXRfZGV2IGhhcyBiZWVuIGFjcXVpcmVkIGJ5IGRldl9nZXRfYnlfbmFtZSgpIGluCisJICogcHJvY19pbnRlcmZhY2VzX3dyaXRlKCkgYW5kIGhhcyB0byBiZSB1bnJlZmVyZW5jZWQuCisJICovCisKKwlpZiAoYmF0bWFuX2lmLT5uZXRfZGV2KQorCQlkZXZfcHV0KGJhdG1hbl9pZi0+bmV0X2Rldik7CisKKwliYXRtYW5faWYtPnJhd19zb2NrID0gTlVMTDsKKwliYXRtYW5faWYtPm5ldF9kZXYgPSBOVUxMOworCisJYmF0bWFuX2lmLT5pZl9hY3RpdmUgPSBJRl9JTkFDVElWRTsKKwlhY3RpdmVfaWZzLS07CisKKwlkZWJ1Z19sb2coTE9HX1RZUEVfTk9USUNFLCAiSW50ZXJmYWNlIGRlYWN0aXZhdGVkOiAlc1xuIiwKKwkgICAgICAgICAgYmF0bWFuX2lmLT5kZXYpOworfQorCisvKiAocmUpYWN0aXZhdGUgZ2l2ZW4gaW50ZXJmYWNlLiAqLworc3RhdGljIHZvaWQgaGFyZGlmX2FjdGl2YXRlX2ludGVyZmFjZShzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpCit7CisJc3RydWN0IHNvY2thZGRyX2xsIGJpbmRfYWRkcjsKKwlpbnQgcmV0dmFsOworCisJaWYgKGJhdG1hbl9pZi0+aWZfYWN0aXZlICE9IElGX0lOQUNUSVZFKQorCQlyZXR1cm47CisKKyNpZmRlZiBfX05FVF9ORVRfTkFNRVNQQUNFX0gKKwliYXRtYW5faWYtPm5ldF9kZXYgPSBkZXZfZ2V0X2J5X25hbWUoJmluaXRfbmV0LCBiYXRtYW5faWYtPmRldik7CisjZWxzZQorCWJhdG1hbl9pZi0+bmV0X2RldiA9IGRldl9nZXRfYnlfbmFtZShiYXRtYW5faWYtPmRldik7CisjZW5kaWYKKwlpZiAoIWJhdG1hbl9pZi0+bmV0X2RldikKKwkJZ290byBkZXZfZXJyOworCisJcmV0dmFsID0gc29ja19jcmVhdGVfa2VybihQRl9QQUNLRVQsIFNPQ0tfUkFXLAorCQkJCSAgX19jb25zdGFudF9odG9ucyhFVEhfUF9CQVRNQU4pLAorCQkJCSAgJmJhdG1hbl9pZi0+cmF3X3NvY2spOworCisJaWYgKHJldHZhbCA8IDApIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX1dBUk4sICJDYW4ndCBjcmVhdGUgcmF3IHNvY2tldDogJWlcbiIsCisJCQkgIHJldHZhbCk7CisJCWdvdG8gc29ja19lcnI7CisJfQorCisJYmluZF9hZGRyLnNsbF9mYW1pbHkgPSBBRl9QQUNLRVQ7CisJYmluZF9hZGRyLnNsbF9pZmluZGV4ID0gYmF0bWFuX2lmLT5uZXRfZGV2LT5pZmluZGV4OworCWJpbmRfYWRkci5zbGxfcHJvdG9jb2wgPSAwOwkvKiBpcyBzZXQgYnkgdGhlIGtlcm5lbCAqLworCisJcmV0dmFsID0ga2VybmVsX2JpbmQoYmF0bWFuX2lmLT5yYXdfc29jaywKKwkJCSAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZiaW5kX2FkZHIsIHNpemVvZihiaW5kX2FkZHIpKTsKKworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9XQVJOLCAiQ2FuJ3QgY3JlYXRlIGJpbmQgcmF3IHNvY2tldDogJWlcbiIsCisJCQkgIHJldHZhbCk7CisJCWdvdG8gYmluZF9lcnI7CisJfQorCisJY2hlY2tfa25vd25fbWFjX2FkZHIoYmF0bWFuX2lmLT5uZXRfZGV2LT5kZXZfYWRkcik7CisKKwliYXRtYW5faWYtPnJhd19zb2NrLT5zay0+c2tfdXNlcl9kYXRhID0KKwkJYmF0bWFuX2lmLT5yYXdfc29jay0+c2stPnNrX2RhdGFfcmVhZHk7CisJYmF0bWFuX2lmLT5yYXdfc29jay0+c2stPnNrX2RhdGFfcmVhZHkgPSBiYXRtYW5fZGF0YV9yZWFkeTsKKworCWFkZHJfdG9fc3RyaW5nKGJhdG1hbl9pZi0+YWRkcl9zdHIsIGJhdG1hbl9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIpOworCisJbWVtY3B5KCgoc3RydWN0IGJhdG1hbl9wYWNrZXQgKikoYmF0bWFuX2lmLT5wYWNrZXRfYnVmZikpLT5vcmlnLAorCSAgICAgICBiYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KCgoc3RydWN0IGJhdG1hbl9wYWNrZXQgKikoYmF0bWFuX2lmLT5wYWNrZXRfYnVmZikpLT5wcmV2X3NlbmRlciwKKwkgICAgICAgYmF0bWFuX2lmLT5uZXRfZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCisJYmF0bWFuX2lmLT5pZl9hY3RpdmUgPSBJRl9UT19CRV9BQ1RJVkFURUQ7CisJYWN0aXZlX2lmcysrOworCisJLyogc2F2ZSB0aGUgbWFjIGFkZHJlc3MgaWYgaXQgaXMgb3VyIHByaW1hcnkgaW50ZXJmYWNlICovCisJaWYgKGJhdG1hbl9pZi0+aWZfbnVtID09IDApCisJCXNldF9tYWluX2lmX2FkZHIoYmF0bWFuX2lmLT5uZXRfZGV2LT5kZXZfYWRkcik7CisKKwlkZWJ1Z19sb2coTE9HX1RZUEVfTk9USUNFLCAiSW50ZXJmYWNlIGFjdGl2YXRlZDogJXNcbiIsCisJICAgICAgICAgIGJhdG1hbl9pZi0+ZGV2KTsKKworCXJldHVybjsKKworYmluZF9lcnI6CisJc29ja19yZWxlYXNlKGJhdG1hbl9pZi0+cmF3X3NvY2spOworc29ja19lcnI6CisJZGV2X3B1dChiYXRtYW5faWYtPm5ldF9kZXYpOworZGV2X2VycjoKKwliYXRtYW5faWYtPnJhd19zb2NrID0gTlVMTDsKKwliYXRtYW5faWYtPm5ldF9kZXYgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBoYXJkaWZfZnJlZV9pbnRlcmZhY2Uoc3RydWN0IHJjdV9oZWFkICpyY3UpCit7CisJc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmID0gY29udGFpbmVyX29mKHJjdSwgc3RydWN0IGJhdG1hbl9pZiwgcmN1KTsKKworCWtmcmVlKGJhdG1hbl9pZi0+cGFja2V0X2J1ZmYpOworCWtmcmVlKGJhdG1hbl9pZi0+ZGV2KTsKKwlrZnJlZShiYXRtYW5faWYpOworfQorCisvKioKKyAqIGNhbGxlZCBieQorICogIC0gZWNobyAnJyA+IC9wcm9jLy4uLi9pbnRlcmZhY2VzCisgKiAgLSBtb2Rwcm9iZSAtciBiYXRtYW4tYWR2LWNvcmUKKyAqLworLyogcmVtb3ZlcyBhbmQgZnJlZXMgYWxsIGludGVyZmFjZXMgKi8KK3ZvaWQgaGFyZGlmX3JlbW92ZV9pbnRlcmZhY2VzKHZvaWQpCit7CisJc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmID0gTlVMTDsKKworCWF2YWlsX2lmcyA9IDA7CisKKwkvKiBubyBsb2NrIG5lZWRlZCAtIHdlIGRvbid0IGRlbGV0ZSBzb21ld2hlcmUgZWxzZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoYmF0bWFuX2lmLCAmaWZfbGlzdCwgbGlzdCkgeworCisJCWxpc3RfZGVsX3JjdSgmYmF0bWFuX2lmLT5saXN0KTsKKworCQkvKiBmaXJzdCBkZWFjdGl2YXRlIGludGVyZmFjZSAqLworCQlpZiAoYmF0bWFuX2lmLT5pZl9hY3RpdmUgIT0gSUZfSU5BQ1RJVkUpCisJCQloYXJkaWZfZGVhY3RpdmF0ZV9pbnRlcmZhY2UoYmF0bWFuX2lmKTsKKworCQljYWxsX3JjdSgmYmF0bWFuX2lmLT5yY3UsIGhhcmRpZl9mcmVlX2ludGVyZmFjZSk7CisJfQorfQorCitzdGF0aWMgaW50IHJlc2l6ZV9vcmlnKHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwgaW50IGlmX251bSkKK3sKKwl2b2lkICpkYXRhX3B0cjsKKworCWRhdGFfcHRyID0ga21hbGxvYygoaWZfbnVtICsgMSkgKiBzaXplb2YoVFlQRV9PRl9XT1JEKSAqIE5VTV9XT1JEUywKKwkJCSAgIEdGUF9BVE9NSUMpOworCWlmICghZGF0YV9wdHIpIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX1dBUk4sICJDYW4ndCByZXNpemUgb3JpZzogb3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1jcHkoZGF0YV9wdHIsIG9yaWdfbm9kZS0+YmNhc3Rfb3duLAorCSAgICAgICBpZl9udW0gKiBzaXplb2YoVFlQRV9PRl9XT1JEKSAqIE5VTV9XT1JEUyk7CisJa2ZyZWUob3JpZ19ub2RlLT5iY2FzdF9vd24pOworCW9yaWdfbm9kZS0+YmNhc3Rfb3duID0gZGF0YV9wdHI7CisKKwlkYXRhX3B0ciA9IGttYWxsb2MoKGlmX251bSArIDEpICogc2l6ZW9mKHVpbnQ4X3QpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWRhdGFfcHRyKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9XQVJOLCAiQ2FuJ3QgcmVzaXplIG9yaWc6IG91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJbWVtY3B5KGRhdGFfcHRyLCBvcmlnX25vZGUtPmJjYXN0X293bl9zdW0sIGlmX251bSAqIHNpemVvZih1aW50OF90KSk7CisJa2ZyZWUob3JpZ19ub2RlLT5iY2FzdF9vd25fc3VtKTsKKwlvcmlnX25vZGUtPmJjYXN0X293bl9zdW0gPSBkYXRhX3B0cjsKKworCXJldHVybiAwOworfQorCisKKy8qIGFkZHMgYW4gaW50ZXJmYWNlIHRoZSBpbnRlcmZhY2UgbGlzdCBhbmQgYWN0aXZhdGUgaXQsIGlmIHBvc3NpYmxlICovCitpbnQgaGFyZGlmX2FkZF9pbnRlcmZhY2UoY2hhciAqZGV2LCBpbnQgaWZfbnVtKQoreworCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKKwlzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldDsKKwlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7CisJc3RydWN0IGhhc2hfaXRfdCAqaGFzaGl0ID0gTlVMTDsKKworCWJhdG1hbl9pZiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBiYXRtYW5faWYpLCBHRlBfS0VSTkVMKTsKKworCWlmICghYmF0bWFuX2lmKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9XQVJOLCAiQ2FuJ3QgYWRkIGludGVyZmFjZSAoJXMpOiBvdXQgb2YgbWVtb3J5XG4iLCBkZXYpOworCQlyZXR1cm4gLTE7CisJfQorCisJYmF0bWFuX2lmLT5yYXdfc29jayA9IE5VTEw7CisJYmF0bWFuX2lmLT5uZXRfZGV2ID0gTlVMTDsKKworCWlmICgoaWZfbnVtID09IDApICYmIChudW1faG5hID4gMCkpCisJCWJhdG1hbl9pZi0+cGFja2V0X2xlbiA9IEJBVF9QQUNLRVRfTEVOICsgbnVtX2huYSAqIEVUSF9BTEVOOworCWVsc2UKKwkJYmF0bWFuX2lmLT5wYWNrZXRfbGVuID0gQkFUX1BBQ0tFVF9MRU47CisKKwliYXRtYW5faWYtPnBhY2tldF9idWZmID0ga21hbGxvYyhiYXRtYW5faWYtPnBhY2tldF9sZW4sIEdGUF9LRVJORUwpOworCisJaWYgKCFiYXRtYW5faWYtPnBhY2tldF9idWZmKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9XQVJOLCAiQ2FuJ3QgYWRkIGludGVyZmFjZSBwYWNrZXQgKCVzKTogb3V0IG9mIG1lbW9yeVxuIiwgZGV2KTsKKwkJZ290byBvdXQ7CisJfQorCisJYmF0bWFuX2lmLT5pZl9udW0gPSBpZl9udW07CisJYmF0bWFuX2lmLT5kZXYgPSBkZXY7CisJYmF0bWFuX2lmLT5pZl9hY3RpdmUgPSBJRl9JTkFDVElWRTsKKwlJTklUX1JDVV9IRUFEKCZiYXRtYW5faWYtPnJjdSk7CisKKwlkZWJ1Z19sb2coTE9HX1RZUEVfTk9USUNFLCAiQWRkaW5nIGludGVyZmFjZTogJXNcbiIsIGRldik7CisJYXZhaWxfaWZzKys7CisKKwlJTklUX0xJU1RfSEVBRCgmYmF0bWFuX2lmLT5saXN0KTsKKworCWJhdG1hbl9wYWNrZXQgPSAoc3RydWN0IGJhdG1hbl9wYWNrZXQgKikoYmF0bWFuX2lmLT5wYWNrZXRfYnVmZik7CisJYmF0bWFuX3BhY2tldC0+cGFja2V0X3R5cGUgPSBCQVRfUEFDS0VUOworCWJhdG1hbl9wYWNrZXQtPnZlcnNpb24gPSBDT01QQVRfVkVSU0lPTjsKKwliYXRtYW5fcGFja2V0LT5mbGFncyA9IDB4MDA7CisJYmF0bWFuX3BhY2tldC0+dHRsID0gKGJhdG1hbl9pZi0+aWZfbnVtID4gMCA/IDIgOiBUVEwpOworCWJhdG1hbl9wYWNrZXQtPmZsYWdzID0gMDsKKwliYXRtYW5fcGFja2V0LT50cSA9IFRRX01BWF9WQUxVRTsKKwliYXRtYW5fcGFja2V0LT5udW1faG5hID0gMDsKKworCWlmIChiYXRtYW5faWYtPnBhY2tldF9sZW4gIT0gQkFUX1BBQ0tFVF9MRU4pIHsKKwkJdW5zaWduZWQgY2hhciAqaG5hX2J1ZmY7CisJCWludCBobmFfbGVuOworCisJCWhuYV9idWZmID0gYmF0bWFuX2lmLT5wYWNrZXRfYnVmZiArIEJBVF9QQUNLRVRfTEVOOworCQlobmFfbGVuID0gYmF0bWFuX2lmLT5wYWNrZXRfbGVuIC0gQkFUX1BBQ0tFVF9MRU47CisJCWJhdG1hbl9wYWNrZXQtPm51bV9obmEgPSBobmFfbG9jYWxfZmlsbF9idWZmZXIoaG5hX2J1ZmYsCisJCQkJCQkJICAgICAgIGhuYV9sZW4pOworCX0KKworCWF0b21pY19zZXQoJmJhdG1hbl9pZi0+c2Vxbm8sIDEpOworCisJLyogcmVzaXplIGFsbCBvcmlnIG5vZGVzIGJlY2F1c2Ugb3JpZ19ub2RlLT5iY2FzdF9vd24oX3N1bSkgZGVwZW5kIG9uCisJICogaWZfbnVtICovCisJc3Bpbl9sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisKKwl3aGlsZSAoTlVMTCAhPSAoaGFzaGl0ID0gaGFzaF9pdGVyYXRlKG9yaWdfaGFzaCwgaGFzaGl0KSkpIHsKKwkJb3JpZ19ub2RlID0gaGFzaGl0LT5idWNrZXQtPmRhdGE7CisJCWlmIChyZXNpemVfb3JpZyhvcmlnX25vZGUsIGlmX251bSkgPT0gLTEpIHsKKwkJCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisKKwlpZiAoIWhhcmRpZl9pc19pbnRlcmZhY2VfdXAoYmF0bWFuX2lmLT5kZXYpKQorCQlkZWJ1Z19sb2coTE9HX1RZUEVfV0FSTiwgIk5vdCB1c2luZyBpbnRlcmZhY2UgJXMgKHJldHJ5aW5nIGxhdGVyKTogaW50ZXJmYWNlIG5vdCBhY3RpdmVcbiIsIGJhdG1hbl9pZi0+ZGV2KTsKKwllbHNlCisJCWhhcmRpZl9hY3RpdmF0ZV9pbnRlcmZhY2UoYmF0bWFuX2lmKTsKKworCWxpc3RfYWRkX3RhaWxfcmN1KCZiYXRtYW5faWYtPmxpc3QsICZpZl9saXN0KTsKKworCS8qIGJlZ2luIHNlbmRpbmcgb3JpZ2luYXRvciBtZXNzYWdlcyBvbiB0aGF0IGludGVyZmFjZSAqLworCXNjaGVkdWxlX293bl9wYWNrZXQoYmF0bWFuX2lmKTsKKwlyZXR1cm4gMTsKKworb3V0OgorCWlmIChiYXRtYW5faWYtPnBhY2tldF9idWZmKQorCQlrZnJlZShiYXRtYW5faWYtPnBhY2tldF9idWZmKTsKKwlrZnJlZShiYXRtYW5faWYpOworCWtmcmVlKGRldik7CisJcmV0dXJuIC0xOworfQorCitjaGFyIGhhcmRpZl9nZXRfYWN0aXZlX2lmX251bSh2b2lkKQoreworCXJldHVybiBhY3RpdmVfaWZzOworfQorCitzdGF0aWMgaW50IGhhcmRfaWZfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopcHRyOworCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZiA9IGdldF9iYXRtYW5faWZfYnlfbmFtZShkZXYtPm5hbWUpOworCisJaWYgKCFiYXRtYW5faWYpCisJCWdvdG8gb3V0OworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTkVUREVWX0dPSU5HX0RPV046CisJY2FzZSBORVRERVZfRE9XTjoKKwljYXNlIE5FVERFVl9VTlJFR0lTVEVSOgorCQloYXJkaWZfZGVhY3RpdmF0ZV9pbnRlcmZhY2UoYmF0bWFuX2lmKTsKKwkJYnJlYWs7CisJY2FzZSBORVRERVZfVVA6CisJCWhhcmRpZl9hY3RpdmF0ZV9pbnRlcmZhY2UoYmF0bWFuX2lmKTsKKwkJaWYgKChhdG9taWNfcmVhZCgmbW9kdWxlX3N0YXRlKSA9PSBNT0RVTEVfSU5BQ1RJVkUpICYmCisJCSAgICAoaGFyZGlmX2dldF9hY3RpdmVfaWZfbnVtKCkgPiAwKSkgeworCQkJYWN0aXZhdGVfbW9kdWxlKCk7CisJCX0KKwkJYnJlYWs7CisJLyogTkVUREVWX0NIQU5HRUFERFIgLSBtYWMgYWRkcmVzcyBjaGFuZ2UgLSB3aGF0IGFyZSB3ZSBkb2luZyBoZXJlID8gKi8KKwlkZWZhdWx0OgorCQkvKiBkZWJ1Z19sb2coTE9HX1RZUEVfQ1JJVCwgImhhcmRfaWZfZXZlbnQ6ICVzICVpXG4iLCBkZXYtPm5hbWUsIGV2ZW50KTsgKi8KKwkJYnJlYWs7CisJfTsKKworCXVwZGF0ZV9taW5fbXR1KCk7CisKK291dDoKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0cnVjdCBub3RpZmllcl9ibG9jayBoYXJkX2lmX25vdGlmaWVyID0geworICAgICAgICAubm90aWZpZXJfY2FsbCA9IGhhcmRfaWZfZXZlbnQsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFyZC1pbnRlcmZhY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhcmQtaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQyMzU4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhcmQtaW50ZXJmYWNlLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKyNkZWZpbmUgSUZfSU5BQ1RJVkUgMAorI2RlZmluZSBJRl9BQ1RJVkUgMQorLyogI2RlZmluZSBJRl9UT19CRV9ERUFDVElWQVRFRCAyIC0gbm90IG5lZWRlZCBhbnltb3JlICovCisjZGVmaW5lIElGX1RPX0JFX0FDVElWQVRFRCAzCisKK2V4dGVybiBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaGFyZF9pZl9ub3RpZmllcjsKKwordm9pZCBoYXJkaWZfcmVtb3ZlX2ludGVyZmFjZXModm9pZCk7CitpbnQgaGFyZGlmX2FkZF9pbnRlcmZhY2UoY2hhciAqZGV2LCBpbnQgaWZfbnVtKTsKK3ZvaWQgaGFyZGlmX2RlYWN0aXZhdGVfaW50ZXJmYWNlKHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZik7CitjaGFyIGhhcmRpZl9nZXRfYWN0aXZlX2lmX251bSh2b2lkKTsKK3ZvaWQgaGFyZGlmX2NoZWNrX2ludGVyZmFjZXNfc3RhdHVzKHZvaWQpOwordm9pZCBoYXJkaWZfY2hlY2tfaW50ZXJmYWNlc19zdGF0dXNfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK2ludCBoYXJkaWZfbWluX210dSh2b2lkKTsKK3ZvaWQgdXBkYXRlX21pbl9tdHUodm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXNoLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFjYjRhMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhc2guYwpAQCAtMCwwICsxLDMxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogU2ltb24gV3VuZGVybGljaCwgTWFyZWsgTGluZG5lcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAiaGFzaC5oIgorCisvKiBjbGVhcnMgdGhlIGhhc2ggKi8KK3ZvaWQgaGFzaF9pbml0KHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCkKK3sKKwlpbnQgaTsKKworCWhhc2gtPmVsZW1lbnRzID0gMDsKKworCWZvciAoaSA9IDAgOyBpIDwgaGFzaC0+c2l6ZTsgaSsrKQorCQloYXNoLT50YWJsZVtpXSA9IE5VTEw7Cit9CisKKy8qIHJlbW92ZSB0aGUgaGFzaCBzdHJ1Y3R1cmUuIGlmIGhhc2hkYXRhX2ZyZWVfY2IgIT0gTlVMTCwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlCisgKiBjYWxsZWQgdG8gcmVtb3ZlIHRoZSBlbGVtZW50cyBpbnNpZGUgb2YgdGhlIGhhc2guICBpZiB5b3UgZG9uJ3QgcmVtb3ZlIHRoZQorICogZWxlbWVudHMsIG1lbW9yeSBtaWdodCBiZSBsZWFrZWQuICovCit2b2lkIGhhc2hfZGVsZXRlKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwgaGFzaGRhdGFfZnJlZV9jYiBmcmVlX2NiKQoreworCXN0cnVjdCBlbGVtZW50X3QgKmJ1Y2tldCwgKmxhc3RfYnVja2V0OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGhhc2gtPnNpemU7IGkrKykgeworCQlidWNrZXQgPSBoYXNoLT50YWJsZVtpXTsKKworCQl3aGlsZSAoYnVja2V0ICE9IE5VTEwpIHsKKwkJCWlmIChmcmVlX2NiICE9IE5VTEwpCisJCQkJZnJlZV9jYihidWNrZXQtPmRhdGEpOworCisJCQlsYXN0X2J1Y2tldCA9IGJ1Y2tldDsKKwkJCWJ1Y2tldCA9IGJ1Y2tldC0+bmV4dDsKKwkJCWtmcmVlKGxhc3RfYnVja2V0KTsKKwkJfQorCX0KKworCWhhc2hfZGVzdHJveShoYXNoKTsKK30KKworLyogZnJlZSBvbmx5IHRoZSBoYXNodGFibGUgYW5kIHRoZSBoYXNoIGl0c2VsZi4gKi8KK3ZvaWQgaGFzaF9kZXN0cm95KHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCkKK3sKKwlrZnJlZShoYXNoLT50YWJsZSk7CisJa2ZyZWUoaGFzaCk7Cit9CisKKy8qIGl0ZXJhdGUgdGhvdWdoIHRoZSBoYXNoLiBmaXJzdCBlbGVtZW50IGlzIHNlbGVjdGVkIHdpdGggaXRlcl9pbiBOVUxMLiAgdXNlCisgKiB0aGUgcmV0dXJuZWQgaXRlcmF0b3IgdG8gYWNjZXNzIHRoZSBlbGVtZW50cyB1bnRpbCBoYXNoX2l0X3QgcmV0dXJucyBOVUxMLiAqLworc3RydWN0IGhhc2hfaXRfdCAqaGFzaF9pdGVyYXRlKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwKKwkJCSAgICAgICBzdHJ1Y3QgaGFzaF9pdF90ICppdGVyX2luKQoreworCXN0cnVjdCBoYXNoX2l0X3QgKml0ZXI7CisKKwlpZiAoIWhhc2gpCisJCXJldHVybiBOVUxMOworCisJaWYgKGl0ZXJfaW4gPT0gTlVMTCkgeworCQlpdGVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGhhc2hfaXRfdCksIEdGUF9BVE9NSUMpOworCQlpdGVyLT5pbmRleCA9IC0xOworCQlpdGVyLT5idWNrZXQgPSBOVUxMOworCQlpdGVyLT5wcmV2X2J1Y2tldCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJaXRlciA9IGl0ZXJfaW47CisJfQorCisJLyogc2FuaXR5IGNoZWNrcyBmaXJzdCAoaWYgb3VyIGJ1Y2tldCBnb3QgZGVsZXRlZCBpbiB0aGUgbGFzdAorCSAqIGl0ZXJhdGlvbik6ICovCisJaWYgKGl0ZXItPmJ1Y2tldCAhPSBOVUxMKSB7CisJCWlmIChpdGVyLT5maXJzdF9idWNrZXQgIT0gTlVMTCkgeworCQkJLyogd2UncmUgb24gdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGl0IGdvdCByZW1vdmVkIGFmdGVyCisJCQkgKiB0aGUgbGFzdCBpdGVyYXRpb24uICovCisJCQlpZiAoKCppdGVyLT5maXJzdF9idWNrZXQpICE9IGl0ZXItPmJ1Y2tldCkgeworCQkJCS8qIHRoZXJlIGFyZSBzdGlsbCBvdGhlciBlbGVtZW50cyBpbiB0aGUgbGlzdCAqLworCQkJCWlmICgoKml0ZXItPmZpcnN0X2J1Y2tldCkgIT0gTlVMTCkgeworCQkJCQlpdGVyLT5wcmV2X2J1Y2tldCA9IE5VTEw7CisJCQkJCWl0ZXItPmJ1Y2tldCA9ICgqaXRlci0+Zmlyc3RfYnVja2V0KTsKKwkJCQkJaXRlci0+Zmlyc3RfYnVja2V0ID0KKwkJCQkJCSZoYXNoLT50YWJsZVtpdGVyLT5pbmRleF07CisJCQkJCXJldHVybiBpdGVyOworCQkJCX0gZWxzZSB7CisJCQkJCWl0ZXItPmJ1Y2tldCA9IE5VTEw7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKGl0ZXItPnByZXZfYnVja2V0ICE9IE5VTEwpIHsKKwkJCS8qCisJCQkqIHdlJ3JlIG5vdCBvbiB0aGUgZmlyc3QgZWxlbWVudCwgYW5kIHRoZSBidWNrZXQgZ290CisJCQkqIHJlbW92ZWQgYWZ0ZXIgdGhlIGxhc3QgaXRlcmF0aW9uLiAgdGhlIGxhc3QgYnVja2V0J3MKKwkJCSogbmV4dCBwb2ludGVyIGlzIG5vdCBwb2ludGluZyB0byBvdXIgYWN0dWFsIGJ1Y2tldAorCQkJKiBhbnltb3JlLiAgc2VsZWN0IHRoZSBuZXh0LgorCQkJKi8KKwkJCWlmIChpdGVyLT5wcmV2X2J1Y2tldC0+bmV4dCAhPSBpdGVyLT5idWNrZXQpCisJCQkJaXRlci0+YnVja2V0ID0gaXRlci0+cHJldl9idWNrZXQ7CisJCX0KKwl9CisKKwkvKiBub3cgYXMgd2UgYXJlIHNhbmUsIHNlbGVjdCB0aGUgbmV4dCBvbmUgaWYgdGhlcmUgaXMgc29tZSAqLworCWlmIChpdGVyLT5idWNrZXQgIT0gTlVMTCkgeworCQlpZiAoaXRlci0+YnVja2V0LT5uZXh0ICE9IE5VTEwpIHsKKwkJCWl0ZXItPnByZXZfYnVja2V0ID0gaXRlci0+YnVja2V0OworCQkJaXRlci0+YnVja2V0ID0gaXRlci0+YnVja2V0LT5uZXh0OworCQkJaXRlci0+Zmlyc3RfYnVja2V0ID0gTlVMTDsKKwkJCXJldHVybiBpdGVyOworCQl9CisJfQorCisJLyogaWYgbm90IHJldHVybmVkIHlldCwgd2UndmUgcmVhY2hlZCB0aGUgbGFzdCBvbmUgb24gdGhlIGluZGV4IGFuZCBoYXZlCisJICogdG8gc2VhcmNoIGZvcndhcmQgKi8KKwlpdGVyLT5pbmRleCsrOworCS8qIGdvIHRocm91Z2ggdGhlIGVudHJpZXMgb2YgdGhlIGhhc2ggdGFibGUgKi8KKwl3aGlsZSAoaXRlci0+aW5kZXggPCBoYXNoLT5zaXplKSB7CisJCWlmICgoaGFzaC0+dGFibGVbaXRlci0+aW5kZXhdKSAhPSBOVUxMKSB7CisJCQlpdGVyLT5wcmV2X2J1Y2tldCA9IE5VTEw7CisJCQlpdGVyLT5idWNrZXQgPSBoYXNoLT50YWJsZVtpdGVyLT5pbmRleF07CisJCQlpdGVyLT5maXJzdF9idWNrZXQgPSAmaGFzaC0+dGFibGVbaXRlci0+aW5kZXhdOworCQkJcmV0dXJuIGl0ZXI7CisJCX0gZWxzZSB7CisJCQlpdGVyLT5pbmRleCsrOworCQl9CisJfQorCisJLyogbm90aGluZyB0byBpdGVyYXRlIG92ZXIgYW55bW9yZSAqLworCWtmcmVlKGl0ZXIpOworCXJldHVybiBOVUxMOworfQorCisvKiBhbGxvY2F0ZXMgYW5kIGNsZWFycyB0aGUgaGFzaCAqLworc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoX25ldyhpbnQgc2l6ZSwgaGFzaGRhdGFfY29tcGFyZV9jYiBjb21wYXJlLAorCQkJICAgICBoYXNoZGF0YV9jaG9vc2VfY2IgY2hvb3NlKQoreworCXN0cnVjdCBoYXNodGFibGVfdCAqaGFzaDsKKworCWhhc2ggPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaGFzaHRhYmxlX3QpICwgR0ZQX0FUT01JQyk7CisKKwlpZiAoaGFzaCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWhhc2gtPnNpemUgPSBzaXplOworCWhhc2gtPnRhYmxlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGVsZW1lbnRfdCAqKSAqIHNpemUsIEdGUF9BVE9NSUMpOworCisJaWYgKGhhc2gtPnRhYmxlID09IE5VTEwpIHsKKwkJa2ZyZWUoaGFzaCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWhhc2hfaW5pdChoYXNoKTsKKworCWhhc2gtPmNvbXBhcmUgPSBjb21wYXJlOworCWhhc2gtPmNob29zZSA9IGNob29zZTsKKworCXJldHVybiBoYXNoOworfQorCisvKiBhZGRzIGRhdGEgdG8gdGhlIGhhc2h0YWJsZS4gcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICovCitpbnQgaGFzaF9hZGQoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoLCB2b2lkICpkYXRhKQoreworCWludCBpbmRleDsKKwlzdHJ1Y3QgZWxlbWVudF90ICpidWNrZXQsICpwcmV2X2J1Y2tldCA9IE5VTEw7CisKKwlpZiAoIWhhc2gpCisJCXJldHVybiAtMTsKKworCWluZGV4ID0gaGFzaC0+Y2hvb3NlKGRhdGEsIGhhc2gtPnNpemUpOworCWJ1Y2tldCA9IGhhc2gtPnRhYmxlW2luZGV4XTsKKworCXdoaWxlIChidWNrZXQgIT0gTlVMTCkgeworCQlpZiAoaGFzaC0+Y29tcGFyZShidWNrZXQtPmRhdGEsIGRhdGEpKQorCQkJcmV0dXJuIC0xOworCisJCXByZXZfYnVja2V0ID0gYnVja2V0OworCQlidWNrZXQgPSBidWNrZXQtPm5leHQ7CisJfQorCisJLyogZm91bmQgdGhlIHRhaWwgb2YgdGhlIGxpc3QsIGFkZCBuZXcgZWxlbWVudCAqLworCWJ1Y2tldCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBlbGVtZW50X3QpLCBHRlBfQVRPTUlDKTsKKworCWlmIChidWNrZXQgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJYnVja2V0LT5kYXRhID0gZGF0YTsKKwlidWNrZXQtPm5leHQgPSBOVUxMOworCisJLyogYW5kIGxpbmsgaXQgKi8KKwlpZiAocHJldl9idWNrZXQgPT0gTlVMTCkKKwkJaGFzaC0+dGFibGVbaW5kZXhdID0gYnVja2V0OworCWVsc2UKKwkJcHJldl9idWNrZXQtPm5leHQgPSBidWNrZXQ7CisKKwloYXNoLT5lbGVtZW50cysrOworCXJldHVybiAwOworfQorCisvKiBmaW5kcyBkYXRhLCBiYXNlZCBvbiB0aGUga2V5IGluIGtleWRhdGEuIHJldHVybnMgdGhlIGZvdW5kIGRhdGEgb24gc3VjY2VzcywKKyAqIG9yIE5VTEwgb24gZXJyb3IgKi8KK3ZvaWQgKmhhc2hfZmluZChzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsIHZvaWQgKmtleWRhdGEpCit7CisJaW50IGluZGV4OworCXN0cnVjdCBlbGVtZW50X3QgKmJ1Y2tldDsKKworCWlmICghaGFzaCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpbmRleCA9IGhhc2gtPmNob29zZShrZXlkYXRhICwgaGFzaC0+c2l6ZSk7CisJYnVja2V0ID0gaGFzaC0+dGFibGVbaW5kZXhdOworCisJd2hpbGUgKGJ1Y2tldCAhPSBOVUxMKSB7CisJCWlmIChoYXNoLT5jb21wYXJlKGJ1Y2tldC0+ZGF0YSwga2V5ZGF0YSkpCisJCQlyZXR1cm4gYnVja2V0LT5kYXRhOworCisJCWJ1Y2tldCA9IGJ1Y2tldC0+bmV4dDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogcmVtb3ZlIGJ1Y2tldCAodGhpcyBtaWdodCBiZSB1c2VkIGluIGhhc2hfaXRlcmF0ZSgpIGlmIHlvdSBhbHJlYWR5IGZvdW5kIHRoZQorICogYnVja2V0IHlvdSB3YW50IHRvIGRlbGV0ZSBhbmQgZG9uJ3QgbmVlZCB0aGUgb3ZlcmhlYWQgdG8gZmluZCBpdCBhZ2FpbiB3aXRoCisgKiBoYXNoX3JlbW92ZSgpLiBCdXQgdXN1YWxseSwgeW91IGRvbid0IHdhbnQgdG8gdXNlIHRoaXMgZnVuY3Rpb24sIGFzIGl0CisgKiBmaWRkbGVzIHdpdGggaGFzaC1pbnRlcm5hbHMuICovCit2b2lkICpoYXNoX3JlbW92ZV9idWNrZXQoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoLCBzdHJ1Y3QgaGFzaF9pdF90ICpoYXNoX2l0X3QpCit7CisJdm9pZCAqZGF0YV9zYXZlOworCisJZGF0YV9zYXZlID0gaGFzaF9pdF90LT5idWNrZXQtPmRhdGE7CisKKwlpZiAoaGFzaF9pdF90LT5wcmV2X2J1Y2tldCAhPSBOVUxMKQorCQloYXNoX2l0X3QtPnByZXZfYnVja2V0LT5uZXh0ID0gaGFzaF9pdF90LT5idWNrZXQtPm5leHQ7CisJZWxzZSBpZiAoaGFzaF9pdF90LT5maXJzdF9idWNrZXQgIT0gTlVMTCkKKwkJKCpoYXNoX2l0X3QtPmZpcnN0X2J1Y2tldCkgPSBoYXNoX2l0X3QtPmJ1Y2tldC0+bmV4dDsKKworCWtmcmVlKGhhc2hfaXRfdC0+YnVja2V0KTsKKwloYXNoLT5lbGVtZW50cy0tOworCisJcmV0dXJuIGRhdGFfc2F2ZTsKK30KKworLyogcmVtb3ZlcyBkYXRhIGZyb20gaGFzaCwgaWYgZm91bmQuIHJldHVybnMgcG9pbnRlciBkbyBkYXRhIG9uIHN1Y2Nlc3MsIHNvIHlvdQorICogY2FuIHJlbW92ZSB0aGUgdXNlZCBzdHJ1Y3R1cmUgeW91cnNlbGYsIG9yIE5VTEwgb24gZXJyb3IgLiAgZGF0YSBjb3VsZCBiZSB0aGUKKyAqIHN0cnVjdHVyZSB5b3UgdXNlIHdpdGgganVzdCB0aGUga2V5IGZpbGxlZCwgd2UganVzdCBuZWVkIHRoZSBrZXkgZm9yCisgKiBjb21wYXJpbmcuICovCit2b2lkICpoYXNoX3JlbW92ZShzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGhhc2hfaXRfdCBoYXNoX2l0X3Q7CisKKwloYXNoX2l0X3QuaW5kZXggPSBoYXNoLT5jaG9vc2UoZGF0YSwgaGFzaC0+c2l6ZSk7CisJaGFzaF9pdF90LmJ1Y2tldCA9IGhhc2gtPnRhYmxlW2hhc2hfaXRfdC5pbmRleF07CisJaGFzaF9pdF90LnByZXZfYnVja2V0ID0gTlVMTDsKKworCXdoaWxlIChoYXNoX2l0X3QuYnVja2V0ICE9IE5VTEwpIHsKKwkJaWYgKGhhc2gtPmNvbXBhcmUoaGFzaF9pdF90LmJ1Y2tldC0+ZGF0YSwgZGF0YSkpIHsKKwkJCWhhc2hfaXRfdC5maXJzdF9idWNrZXQgPQorCQkJCShoYXNoX2l0X3QuYnVja2V0ID09CisJCQkJIGhhc2gtPnRhYmxlW2hhc2hfaXRfdC5pbmRleF0gPworCQkJCSAmaGFzaC0+dGFibGVbaGFzaF9pdF90LmluZGV4XSA6IE5VTEwpOworCQkJcmV0dXJuIGhhc2hfcmVtb3ZlX2J1Y2tldChoYXNoLCAmaGFzaF9pdF90KTsKKwkJfQorCisJCWhhc2hfaXRfdC5wcmV2X2J1Y2tldCA9IGhhc2hfaXRfdC5idWNrZXQ7CisJCWhhc2hfaXRfdC5idWNrZXQgPSBoYXNoX2l0X3QuYnVja2V0LT5uZXh0OworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKiByZXNpemUgdGhlIGhhc2gsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIG5ldyBoYXNoIG9yIE5VTEwgb24KKyAqIGVycm9yLiByZW1vdmVzIHRoZSBvbGQgaGFzaCBvbiBzdWNjZXNzLiAqLworc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoX3Jlc2l6ZShzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsIGludCBzaXplKQoreworCXN0cnVjdCBoYXNodGFibGVfdCAqbmV3X2hhc2g7CisJc3RydWN0IGVsZW1lbnRfdCAqYnVja2V0OworCWludCBpOworCisJLyogaW5pdGlhbGl6ZSBhIG5ldyBoYXNoIHdpdGggdGhlIG5ldyBzaXplICovCisJbmV3X2hhc2ggPSBoYXNoX25ldyhzaXplLCBoYXNoLT5jb21wYXJlLCBoYXNoLT5jaG9vc2UpOworCisJaWYgKG5ld19oYXNoID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJLyogY29weSB0aGUgZWxlbWVudHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaGFzaC0+c2l6ZTsgaSsrKSB7CisJCWJ1Y2tldCA9IGhhc2gtPnRhYmxlW2ldOworCisJCXdoaWxlIChidWNrZXQgIT0gTlVMTCkgeworCQkJaGFzaF9hZGQobmV3X2hhc2gsIGJ1Y2tldC0+ZGF0YSk7CisJCQlidWNrZXQgPSBidWNrZXQtPm5leHQ7CisJCX0KKwl9CisKKwkvKiByZW1vdmUgaGFzaCBhbmQgZXZlbnR1YWwgb3ZlcmZsb3cgYnVja2V0cyBidXQgbm90IHRoZSBjb250ZW50CisJICogaXRzZWxmLiAqLworCWhhc2hfZGVsZXRlKGhhc2gsIE5VTEwpOworCisJcmV0dXJuIG5ld19oYXNoOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFzaC5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNjBmMDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXNoLmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogU2ltb24gV3VuZGVybGljaCwgTWFyZWsgTGluZG5lcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKyNpZm5kZWYgX0JBVE1BTl9IQVNIX0gKKyNkZWZpbmUgX0JBVE1BTl9IQVNIX0gKKwordHlwZWRlZiBpbnQgKCpoYXNoZGF0YV9jb21wYXJlX2NiKSh2b2lkICosIHZvaWQgKik7Cit0eXBlZGVmIGludCAoKmhhc2hkYXRhX2Nob29zZV9jYikodm9pZCAqLCBpbnQpOwordHlwZWRlZiB2b2lkICgqaGFzaGRhdGFfZnJlZV9jYikodm9pZCAqKTsKKworc3RydWN0IGVsZW1lbnRfdCB7CisJdm9pZCAqZGF0YTsJCS8qIHBvaW50ZXIgdG8gdGhlIGRhdGEgKi8KKwlzdHJ1Y3QgZWxlbWVudF90ICpuZXh0OwkvKiBvdmVyZmxvdyBidWNrZXQgcG9pbnRlciAqLworfTsKKworc3RydWN0IGhhc2hfaXRfdCB7CisJaW50IGluZGV4OworCXN0cnVjdCBlbGVtZW50X3QgKmJ1Y2tldDsKKwlzdHJ1Y3QgZWxlbWVudF90ICpwcmV2X2J1Y2tldDsKKwlzdHJ1Y3QgZWxlbWVudF90ICoqZmlyc3RfYnVja2V0OworfTsKKworc3RydWN0IGhhc2h0YWJsZV90IHsKKwlzdHJ1Y3QgZWxlbWVudF90ICoqdGFibGU7ICAgLyogdGhlIGhhc2h0YWJsZSBpdHNlbGYsIHdpdGggdGhlIGJ1Y2tldHMgKi8KKwlpbnQgZWxlbWVudHM7CQkgICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIHJlZ2lzdGVyZWQgKi8KKwlpbnQgc2l6ZTsJCSAgICAvKiBzaXplIG9mIGhhc2h0YWJsZSAqLworCWhhc2hkYXRhX2NvbXBhcmVfY2IgY29tcGFyZTsvKiBjYWxsYmFjayB0byBhIGNvbXBhcmUgZnVuY3Rpb24uICBzaG91bGQKKwkJCQkgICAgICogY29tcGFyZSAyIGVsZW1lbnQgZGF0YXMgZm9yIHRoZWlyIGtleXMsCisJCQkJICAgICAqIHJldHVybiAwIGlmIHNhbWUgYW5kIG5vdCAwIGlmIG5vdAorCQkJCSAgICAgKiBzYW1lICovCisJaGFzaGRhdGFfY2hvb3NlX2NiIGNob29zZTsgIC8qIHRoZSBoYXNoZnVuY3Rpb24sIHNob3VsZCByZXR1cm4gYW4gaW5kZXgKKwkJCQkgICAgICogYmFzZWQgb24gdGhlIGtleSBpbiB0aGUgZGF0YSBvZiB0aGUgZmlyc3QKKwkJCQkgICAgICogYXJndW1lbnQgYW5kIHRoZSBzaXplIHRoZSBzZWNvbmQgKi8KK307CisKKy8qIGNsZWFycyB0aGUgaGFzaCAqLwordm9pZCBoYXNoX2luaXQoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoKTsKKworLyogYWxsb2NhdGVzIGFuZCBjbGVhcnMgdGhlIGhhc2ggKi8KK3N0cnVjdCBoYXNodGFibGVfdCAqaGFzaF9uZXcoaW50IHNpemUsIGhhc2hkYXRhX2NvbXBhcmVfY2IgY29tcGFyZSwKKwkJCSAgICAgaGFzaGRhdGFfY2hvb3NlX2NiIGNob29zZSk7CisKKy8qIHJlbW92ZSBidWNrZXQgKHRoaXMgbWlnaHQgYmUgdXNlZCBpbiBoYXNoX2l0ZXJhdGUoKSBpZiB5b3UgYWxyZWFkeSBmb3VuZCB0aGUKKyAqIGJ1Y2tldCB5b3Ugd2FudCB0byBkZWxldGUgYW5kIGRvbid0IG5lZWQgdGhlIG92ZXJoZWFkIHRvIGZpbmQgaXQgYWdhaW4gd2l0aAorICogaGFzaF9yZW1vdmUoKS4gIEJ1dCB1c3VhbGx5LCB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgdGhpcyBmdW5jdGlvbiwgYXMgaXQKKyAqIGZpZGRsZXMgd2l0aCBoYXNoLWludGVybmFscy4gKi8KK3ZvaWQgKmhhc2hfcmVtb3ZlX2J1Y2tldChzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsIHN0cnVjdCBoYXNoX2l0X3QgKmhhc2hfaXRfdCk7CisKKy8qIHJlbW92ZSB0aGUgaGFzaCBzdHJ1Y3R1cmUuIGlmIGhhc2hkYXRhX2ZyZWVfY2IgIT0gTlVMTCwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlCisgKiBjYWxsZWQgdG8gcmVtb3ZlIHRoZSBlbGVtZW50cyBpbnNpZGUgb2YgdGhlIGhhc2guICBpZiB5b3UgZG9uJ3QgcmVtb3ZlIHRoZQorICogZWxlbWVudHMsIG1lbW9yeSBtaWdodCBiZSBsZWFrZWQuICovCit2b2lkIGhhc2hfZGVsZXRlKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwgaGFzaGRhdGFfZnJlZV9jYiBmcmVlX2NiKTsKKworLyogZnJlZSBvbmx5IHRoZSBoYXNodGFibGUgYW5kIHRoZSBoYXNoIGl0c2VsZi4gKi8KK3ZvaWQgaGFzaF9kZXN0cm95KHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCk7CisKKy8qIGFkZHMgZGF0YSB0byB0aGUgaGFzaHRhYmxlLiByZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IgKi8KK2ludCBoYXNoX2FkZChzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsIHZvaWQgKmRhdGEpOworCisvKiByZW1vdmVzIGRhdGEgZnJvbSBoYXNoLCBpZiBmb3VuZC4gcmV0dXJucyBwb2ludGVyIGRvIGRhdGEgb24gc3VjY2Vzcywgc28geW91CisgKiBjYW4gcmVtb3ZlIHRoZSB1c2VkIHN0cnVjdHVyZSB5b3Vyc2VsZiwgb3IgTlVMTCBvbiBlcnJvciAuICBkYXRhIGNvdWxkIGJlIHRoZQorICogc3RydWN0dXJlIHlvdSB1c2Ugd2l0aCBqdXN0IHRoZSBrZXkgZmlsbGVkLCB3ZSBqdXN0IG5lZWQgdGhlIGtleSBmb3IKKyAqIGNvbXBhcmluZy4gKi8KK3ZvaWQgKmhhc2hfcmVtb3ZlKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwgdm9pZCAqZGF0YSk7CisKKy8qIGZpbmRzIGRhdGEsIGJhc2VkIG9uIHRoZSBrZXkgaW4ga2V5ZGF0YS4gcmV0dXJucyB0aGUgZm91bmQgZGF0YSBvbiBzdWNjZXNzLAorICogb3IgTlVMTCBvbiBlcnJvciAqLwordm9pZCAqaGFzaF9maW5kKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwgdm9pZCAqa2V5ZGF0YSk7CisKKy8qIHJlc2l6ZSB0aGUgaGFzaCwgcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgbmV3IGhhc2ggb3IgTlVMTCBvbgorICogZXJyb3IuIHJlbW92ZXMgdGhlIG9sZCBoYXNoIG9uIHN1Y2Nlc3MgKi8KK3N0cnVjdCBoYXNodGFibGVfdCAqaGFzaF9yZXNpemUoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoLCBpbnQgc2l6ZSk7CisKKy8qIGl0ZXJhdGUgdGhvdWdoIHRoZSBoYXNoLiBmaXJzdCBlbGVtZW50IGlzIHNlbGVjdGVkIHdpdGggaXRlcl9pbiBOVUxMLiAgdXNlCisgKiB0aGUgcmV0dXJuZWQgaXRlcmF0b3IgdG8gYWNjZXNzIHRoZSBlbGVtZW50cyB1bnRpbCBoYXNoX2l0X3QgcmV0dXJucyBOVUxMLiAqLworc3RydWN0IGhhc2hfaXRfdCAqaGFzaF9pdGVyYXRlKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwKKwkJCSAgICAgICBzdHJ1Y3QgaGFzaF9pdF90ICppdGVyX2luKTsKKworLyogcHJpbnQgdGhlIGhhc2ggdGFibGUgZm9yIGRlYnVnZ2luZyAqLwordm9pZCBoYXNoX2RlYnVnKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2xvZy5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM3YzdmMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2xvZy5jCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJsb2cuaCIKKworI2RlZmluZSBMT0dfQlVGX01BU0sgKGxvZ19idWZfbGVuLTEpCisjZGVmaW5lIExPR19CVUYoaWR4KSAobG9nX2J1ZlsoaWR4KSAmIExPR19CVUZfTUFTS10pCisKK3N0YXRpYyBjaGFyIGxvZ19idWZbTE9HX0JVRl9MRU5dOworc3RhdGljIGludCBsb2dfYnVmX2xlbiA9IExPR19CVUZfTEVOOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9nX3N0YXJ0Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9nX2VuZDsKK3VpbnQ4X3QgbG9nX2xldmVsOworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxvZ2J1Zl9sb2NrKTsKKworY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2xvZ19vcGVyYXRpb25zID0geworCS5vcGVuICAgICAgICAgICA9IGxvZ19vcGVuLAorCS5yZWxlYXNlICAgICAgICA9IGxvZ19yZWxlYXNlLAorCS5yZWFkICAgICAgICAgICA9IGxvZ19yZWFkLAorCS53cml0ZSAgICAgICAgICA9IGxvZ193cml0ZSwKKwkucG9sbCAgICAgICAgICAgPSBsb2dfcG9sbCwKK307CisKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChsb2dfd2FpdCk7CisKK3N0YXRpYyB2b2lkIGVtaXRfbG9nX2NoYXIoY2hhciBjKQoreworCUxPR19CVUYobG9nX2VuZCkgPSBjOworCWxvZ19lbmQrKzsKKworCWlmIChsb2dfZW5kIC0gbG9nX3N0YXJ0ID4gbG9nX2J1Zl9sZW4pCisJCWxvZ19zdGFydCA9IGxvZ19lbmQgLSBsb2dfYnVmX2xlbjsKK30KKworc3RhdGljIGludCBmZGVidWdfbG9nKGNoYXIgKmZtdCwgLi4uKQoreworCWludCBwcmludGVkX2xlbjsKKwljaGFyICpwOworCXZhX2xpc3QgYXJnczsKKwlzdGF0aWMgY2hhciBkZWJ1Z19sb2dfYnVmWzI1Nl07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2didWZfbG9jaywgZmxhZ3MpOworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJcHJpbnRlZF9sZW4gPSB2c2NucHJpbnRmKGRlYnVnX2xvZ19idWYsIHNpemVvZihkZWJ1Z19sb2dfYnVmKSwgZm10LAorCQkJCSBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisKKwlmb3IgKHAgPSBkZWJ1Z19sb2dfYnVmOyAqcCAhPSAwOyBwKyspCisJCWVtaXRfbG9nX2NoYXIoKnApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9nYnVmX2xvY2ssIGZsYWdzKTsKKworCXdha2VfdXAoJmxvZ193YWl0KTsKKworCXJldHVybiAwOworfQorCitpbnQgZGVidWdfbG9nKGludCB0eXBlLCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJaW50IHJldHZhbCA9IDA7CisJY2hhciB0bXBfbG9nX2J1ZlsyNTZdOworCisJLyogb25seSBjcml0aWNhbCBpbmZvcm1hdGlvbiBnZXQgaW50byB0aGUgb2ZmaWNpYWwga2VybmVsIGxvZyAqLworCWlmICh0eXBlID09IExPR19UWVBFX0NSSVQpIHsKKwkJdmFfc3RhcnQoYXJncywgZm10KTsKKwkJdnNjbnByaW50Zih0bXBfbG9nX2J1Ziwgc2l6ZW9mKHRtcF9sb2dfYnVmKSwgZm10LCBhcmdzKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJiYXRtYW4tYWR2OiAlcyIsIHRtcF9sb2dfYnVmKTsKKwkJdmFfZW5kKGFyZ3MpOworCX0KKworCWlmICgodHlwZSA9PSBMT0dfVFlQRV9DUklUKSB8fCAobG9nX2xldmVsICYgdHlwZSkpIHsKKwkJdmFfc3RhcnQoYXJncywgZm10KTsKKwkJdnNjbnByaW50Zih0bXBfbG9nX2J1Ziwgc2l6ZW9mKHRtcF9sb2dfYnVmKSwgZm10LCBhcmdzKTsKKwkJZmRlYnVnX2xvZygiWyUxMHVdICVzIiwgKGppZmZpZXMgLyBIWiksIHRtcF9sb2dfYnVmKTsKKwkJdmFfZW5kKGFyZ3MpOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBsb2dfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbmNfbW9kdWxlX2NvdW50KCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBsb2dfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlkZWNfbW9kdWxlX2NvdW50KCk7CisJcmV0dXJuIDA7Cit9CisKK3NzaXplX3QgbG9nX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKKwkJIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgZXJyb3IsIGkgPSAwOworCWNoYXIgYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgJiYgIShsb2dfZW5kIC0gbG9nX3N0YXJ0KSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlpZiAoKCFidWYpIHx8IChjb3VudCA8IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJZXJyb3IgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUobG9nX3dhaXQsIChsb2dfc3RhcnQgLSBsb2dfZW5kKSk7CisKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2didWZfbG9jaywgZmxhZ3MpOworCisJd2hpbGUgKCghZXJyb3IpICYmIChsb2dfc3RhcnQgIT0gbG9nX2VuZCkgJiYgKGkgPCBjb3VudCkpIHsKKwkJYyA9IExPR19CVUYobG9nX3N0YXJ0KTsKKworCQlsb2dfc3RhcnQrKzsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2didWZfbG9jaywgZmxhZ3MpOworCisJCWVycm9yID0gX19wdXRfdXNlcihjLCBidWYpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZsb2didWZfbG9jaywgZmxhZ3MpOworCisJCWJ1ZisrOworCQlpKys7CisKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2didWZfbG9jaywgZmxhZ3MpOworCisJaWYgKCFlcnJvcikKKwkJcmV0dXJuIGk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3NzaXplX3QgbG9nX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCisJCSAgbG9mZl90ICpwcG9zKQoreworCXJldHVybiBjb3VudDsKK30KKwordW5zaWduZWQgaW50IGxvZ19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXBvbGxfd2FpdChmaWxlLCAmbG9nX3dhaXQsIHdhaXQpOworCisJaWYgKGxvZ19lbmQgLSBsb2dfc3RhcnQpCisJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9sb2cuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MGUzYWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9sb2cuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19sb2dfb3BlcmF0aW9uczsKK2V4dGVybiB1aW50OF90IGxvZ19sZXZlbDsKKworaW50IGRlYnVnX2xvZyhpbnQgdHlwZSwgY2hhciAqZm10LCAuLi4pOworaW50IGxvZ19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK2ludCBsb2dfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Citzc2l6ZV90IGxvZ19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCisJCSBsb2ZmX3QgKnBwb3MpOworc3NpemVfdCBsb2dfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKKwkJICBsb2ZmX3QgKnBwb3MpOwordW5zaWduZWQgaW50IGxvZ19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjg5YmZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvbWFpbi5jCkBAIC0wLDAgKzEsMjg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJwcm9jLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAicm91dGluZy5oIgorI2luY2x1ZGUgInNlbmQuaCIKKyNpbmNsdWRlICJzb2Z0LWludGVyZmFjZS5oIgorI2luY2x1ZGUgImRldmljZS5oIgorI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCisjaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgInZpcy5oIgorI2luY2x1ZGUgImhhc2guaCIKKyNpbmNsdWRlICJjb21wYXQuaCIKKworc3RydWN0IGxpc3RfaGVhZCBpZl9saXN0Oworc3RydWN0IGhsaXN0X2hlYWQgZm9yd19iYXRfbGlzdDsKK3N0cnVjdCBobGlzdF9oZWFkIGZvcndfYmNhc3RfbGlzdDsKK3N0cnVjdCBoYXNodGFibGVfdCAqb3JpZ19oYXNoOworCitERUZJTkVfU1BJTkxPQ0sob3JpZ19oYXNoX2xvY2spOworREVGSU5FX1NQSU5MT0NLKGZvcndfYmF0X2xpc3RfbG9jayk7CitERUZJTkVfU1BJTkxPQ0soZm9yd19iY2FzdF9saXN0X2xvY2spOworCithdG9taWNfdCBvcmlnaW5hdG9yX2ludGVydmFsOworYXRvbWljX3QgdmlzX2ludGVydmFsOworYXRvbWljX3QgYWdncmVnYXRpb25fZW5hYmxlZDsKK2ludDE2X3QgbnVtX2huYTsKK2ludDE2X3QgbnVtX2lmczsKKworc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfZGV2aWNlOworCitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICprdGhyZWFkX3Rhc2s7CisKK3Vuc2lnbmVkIGNoYXIgYnJvYWRjYXN0QWRkcltdID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworYXRvbWljX3QgbW9kdWxlX3N0YXRlOworCitzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYmF0X2V2ZW50X3dvcmtxdWV1ZTsKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCUlOSVRfTElTVF9IRUFEKCZpZl9saXN0KTsKKwlJTklUX0hMSVNUX0hFQUQoJmZvcndfYmF0X2xpc3QpOworCUlOSVRfSExJU1RfSEVBRCgmZm9yd19iY2FzdF9saXN0KTsKKworCWF0b21pY19zZXQoJm1vZHVsZV9zdGF0ZSwgTU9EVUxFX0lOQUNUSVZFKTsKKworCWF0b21pY19zZXQoJm9yaWdpbmF0b3JfaW50ZXJ2YWwsIDEwMDApOworCWF0b21pY19zZXQoJnZpc19pbnRlcnZhbCwgMTAwMCk7LyogVE9ETzogcmFpc2UgdGhpcyBsYXRlciwgdGhpcyBpcyBvbmx5CisJCQkJCSAqIGZvciBkZWJ1Z2dpbmcgbm93LiAqLworCWF0b21pY19zZXQoJmFnZ3JlZ2F0aW9uX2VuYWJsZWQsIDEpOworCisJLyogdGhlIG5hbWUgc2hvdWxkIG5vdCBiZSBsb25nZXIgdGhhbiAxMCBjaGFycyAtIHNlZQorCSAqIGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzIzNjM0LyAqLworCWJhdF9ldmVudF93b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiYmF0X2V2ZW50cyIpOworCisJaWYgKCFiYXRfZXZlbnRfd29ya3F1ZXVlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHZhbCA9IHNldHVwX3Byb2NmcygpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJYmF0X2RldmljZV9pbml0KCk7CisKKwkvKiBpbml0aWFsaXplIGxheWVyIDIgaW50ZXJmYWNlICovCisJc29mdF9kZXZpY2UgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBiYXRfcHJpdikgLCAiYmF0JWQiLAorCQkJCSAgIGludGVyZmFjZV9zZXR1cCk7CisKKwlpZiAoIXNvZnRfZGV2aWNlKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9DUklULCAiVW5hYmxlIHRvIGFsbG9jYXRlIHRoZSBiYXRtYW4gaW50ZXJmYWNlXG4iKTsKKwkJZ290byBlbmQ7CisJfQorCisJcmV0dmFsID0gcmVnaXN0ZXJfbmV0ZGV2KHNvZnRfZGV2aWNlKTsKKworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9DUklULCAiVW5hYmxlIHRvIHJlZ2lzdGVyIHRoZSBiYXRtYW4gaW50ZXJmYWNlOiAlaVxuIiwgcmV0dmFsKTsKKwkJZ290byBmcmVlX3NvZnRfZGV2aWNlOworCX0KKworCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmaGFyZF9pZl9ub3RpZmllcik7CisKKwlkZWJ1Z19sb2coTE9HX1RZUEVfQ1JJVCwgIkIuQS5ULk0uQS5OLiBhZHZhbmNlZCAlcyVzIChjb21wYXRpYmlsaXR5IHZlcnNpb24gJWkpIGxvYWRlZCBcbiIsCisJICAgICAgICAgIFNPVVJDRV9WRVJTSU9OLCBSRVZJU0lPTl9WRVJTSU9OX1NUUiwgQ09NUEFUX1ZFUlNJT04pOworCisJcmV0dXJuIDA7CisKK2ZyZWVfc29mdF9kZXZpY2U6CisJZnJlZV9uZXRkZXYoc29mdF9kZXZpY2UpOworCXNvZnRfZGV2aWNlID0gTlVMTDsKK2VuZDoKKwlyZXR1cm4gLUVOT01FTTsKK30KKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXNodXRkb3duX21vZHVsZSgpOworCisJaWYgKHNvZnRfZGV2aWNlKSB7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KHNvZnRfZGV2aWNlKTsKKwkJc29mdF9kZXZpY2UgPSBOVUxMOworCX0KKworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZoYXJkX2lmX25vdGlmaWVyKTsKKwljbGVhbnVwX3Byb2NmcygpOworCisJZGVzdHJveV93b3JrcXVldWUoYmF0X2V2ZW50X3dvcmtxdWV1ZSk7CisJYmF0X2V2ZW50X3dvcmtxdWV1ZSA9IE5VTEw7Cit9CisKKy8qIGFjdGl2YXRlcyB0aGUgbW9kdWxlLCBjcmVhdGVzIGJhdCBkZXZpY2UsIHN0YXJ0cyB0aW1lciAuLi4gKi8KK3ZvaWQgYWN0aXZhdGVfbW9kdWxlKHZvaWQpCit7CisJaWYgKG9yaWdpbmF0b3JfaW5pdCgpIDwgMSkKKwkJZ290byBlcnI7CisKKwlpZiAoaG5hX2xvY2FsX2luaXQoKSA8IDEpCisJCWdvdG8gZXJyOworCisJaWYgKGhuYV9nbG9iYWxfaW5pdCgpIDwgMSkKKwkJZ290byBlcnI7CisKKwlobmFfbG9jYWxfYWRkKHNvZnRfZGV2aWNlLT5kZXZfYWRkcik7CisKKwlpZiAoYmF0X2RldmljZV9zZXR1cCgpIDwgMSkKKwkJZ290byBlbmQ7CisKKwlpZiAodmlzX2luaXQoKSA8IDEpCisJCWdvdG8gZXJyOworCisJLyogKHJlKXN0YXJ0IGtlcm5lbCB0aHJlYWQgZm9yIHBhY2tldCBwcm9jZXNzaW5nICovCisJaWYgKCFrdGhyZWFkX3Rhc2spIHsKKwkJa3RocmVhZF90YXNrID0ga3RocmVhZF9ydW4ocGFja2V0X3JlY3ZfdGhyZWFkLCBOVUxMLCAiYmF0bWFuLWFkdiIpOworCisJCWlmIChJU19FUlIoa3RocmVhZF90YXNrKSkgeworCQkJZGVidWdfbG9nKExPR19UWVBFX0NSSVQsICJVbmFibGUgdG8gc3RhcnQgcGFja2V0IHJlY2VpdmUgdGhyZWFkXG4iKTsKKwkJCWt0aHJlYWRfdGFzayA9IE5VTEw7CisJCX0KKwl9CisKKwl1cGRhdGVfbWluX210dSgpOworCWF0b21pY19zZXQoJm1vZHVsZV9zdGF0ZSwgTU9EVUxFX0FDVElWRSk7CisJZ290byBlbmQ7CisKK2VycjoKKwlkZWJ1Z19sb2coTE9HX1RZUEVfQ1JJVCwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG1lc2ggaW5mb3JtYXRpb24gc3RydWN0dXJlczogb3V0IG9mIG1lbSA/XG4iKTsKKwlzaHV0ZG93bl9tb2R1bGUoKTsKK2VuZDoKKwlyZXR1cm47Cit9CisKKy8qIHNodXRzIGRvd24gdGhlIHdob2xlIG1vZHVsZS4qLwordm9pZCBzaHV0ZG93bl9tb2R1bGUodm9pZCkKK3sKKwlhdG9taWNfc2V0KCZtb2R1bGVfc3RhdGUsIE1PRFVMRV9ERUFDVElWQVRJTkcpOworCisJcHVyZ2Vfb3V0c3RhbmRpbmdfcGFja2V0cygpOworCWZsdXNoX3dvcmtxdWV1ZShiYXRfZXZlbnRfd29ya3F1ZXVlKTsKKworCXZpc19xdWl0KCk7CisKKwkvKiBkZWFjdGl2YXRlIGtlcm5lbCB0aHJlYWQgZm9yIHBhY2tldCBwcm9jZXNzaW5nIChpZiBydW5uaW5nKSAqLworCWlmIChrdGhyZWFkX3Rhc2spIHsKKwkJYXRvbWljX3NldCgmZXhpdF9jb25kLCAxKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0aHJlYWRfd2FpdCk7CisJCWt0aHJlYWRfc3RvcChrdGhyZWFkX3Rhc2spOworCisJCWt0aHJlYWRfdGFzayA9IE5VTEw7CisJfQorCisJb3JpZ2luYXRvcl9mcmVlKCk7CisKKwlobmFfbG9jYWxfZnJlZSgpOworCWhuYV9nbG9iYWxfZnJlZSgpOworCisJc3luY2hyb25pemVfbmV0KCk7CisJYmF0X2RldmljZV9kZXN0cm95KCk7CisKKwloYXJkaWZfcmVtb3ZlX2ludGVyZmFjZXMoKTsKKwlzeW5jaHJvbml6ZV9yY3UoKTsKKwlhdG9taWNfc2V0KCZtb2R1bGVfc3RhdGUsIE1PRFVMRV9JTkFDVElWRSk7Cit9CisKK3ZvaWQgaW5jX21vZHVsZV9jb3VudCh2b2lkKQoreworCXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKK30KKwordm9pZCBkZWNfbW9kdWxlX2NvdW50KHZvaWQpCit7CisJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Cit9CisKK2ludCBhZGRyX3RvX3N0cmluZyhjaGFyICpidWZmLCB1aW50OF90ICphZGRyKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZmYsICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCisJCSAgICAgICBhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdLCBhZGRyWzRdLCBhZGRyWzVdKTsKK30KKworLyogcmV0dXJucyAxIGlmIHRoZXkgYXJlIHRoZSBzYW1lIG9yaWdpbmF0b3IgKi8KKworaW50IGNvbXBhcmVfb3JpZyh2b2lkICpkYXRhMSwgdm9pZCAqZGF0YTIpCit7CisJcmV0dXJuIChtZW1jbXAoZGF0YTEsIGRhdGEyLCBFVEhfQUxFTikgPT0gMCA/IDEgOiAwKTsKK30KKworLyogaGFzaGZ1bmN0aW9uIHRvIGNob29zZSBhbiBlbnRyeSBpbiBhIGhhc2ggdGFibGUgb2YgZ2l2ZW4gc2l6ZSAqLworLyogaGFzaCBhbGdvcml0aG0gZnJvbSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0hhc2hfdGFibGUgKi8KK2ludCBjaG9vc2Vfb3JpZyh2b2lkICpkYXRhLCBpbnQzMl90IHNpemUpCit7CisJdW5zaWduZWQgY2hhciAqa2V5ID0gZGF0YTsKKwl1aW50MzJfdCBoYXNoID0gMDsKKwlzaXplX3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJaGFzaCArPSBrZXlbaV07CisJCWhhc2ggKz0gKGhhc2ggPDwgMTApOworCQloYXNoIF49IChoYXNoID4+IDYpOworCX0KKworCWhhc2ggKz0gKGhhc2ggPDwgMyk7CisJaGFzaCBePSAoaGFzaCA+PiAxMSk7CisJaGFzaCArPSAoaGFzaCA8PCAxNSk7CisKKwlyZXR1cm4gaGFzaCAlIHNpemU7Cit9CisKK2ludCBpc19teV9tYWModWludDhfdCAqYWRkcikKK3sKKwlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWY7CisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGJhdG1hbl9pZiwgJmlmX2xpc3QsIGxpc3QpIHsKKwkJaWYgKChiYXRtYW5faWYtPm5ldF9kZXYpICYmCisJCSAgICAoY29tcGFyZV9vcmlnKGJhdG1hbl9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIsIGFkZHIpKSkgeworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gMDsKKworfQorCitpbnQgaXNfYmNhc3QodWludDhfdCAqYWRkcikKK3sKKwlyZXR1cm4gKGFkZHJbMF0gPT0gKHVpbnQ4X3QpMHhmZikgJiYgKGFkZHJbMV0gPT0gKHVpbnQ4X3QpMHhmZik7Cit9CisKK2ludCBpc19tY2FzdCh1aW50OF90ICphZGRyKQoreworCXJldHVybiAqYWRkciAmIDB4MDE7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRShEUklWRVJfREVWSUNFKTsKKyNpZmRlZiBSRVZJU0lPTl9WRVJTSU9OCitNT0RVTEVfVkVSU0lPTihTT1VSQ0VfVkVSU0lPTiAiLSIgUkVWSVNJT05fVkVSU0lPTik7CisjZWxzZQorTU9EVUxFX1ZFUlNJT04oU09VUkNFX1ZFUlNJT04pOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9tYWluLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFjYjZiNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L21haW4uaApAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKy8qIEtlcm5lbCBQcm9ncmFtbWluZyAqLworI2RlZmluZSBMSU5VWAorCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgIk1hcmVrIExpbmRuZXIgPGxpbmRuZXJfbWFyZWtAeWFob28uZGU+LCBTaW1vbiBXdW5kZXJsaWNoIDxzaXd1QGhyei50dS1jaGVtbml0ei5kZT4iCisjZGVmaW5lIERSSVZFUl9ERVNDICAgIkIuQS5ULk0uQS5OLiBhZHZhbmNlZCIKKyNkZWZpbmUgRFJJVkVSX0RFVklDRSAiYmF0bWFuLWFkdiIKKworI2RlZmluZSBTT1VSQ0VfVkVSU0lPTiAiMC4yLjEtYmV0YSIKKworCisvKiBCLkEuVC5NLkEuTi4gcGFyYW1ldGVycyAqLworCisjZGVmaW5lIFRRX01BWF9WQUxVRSAyNTUKKyNkZWZpbmUgSklUVEVSIDIwCisjZGVmaW5lIFRUTCA1MAkJICAgICAgICAgIC8qIFRpbWUgVG8gTGl2ZSBvZiBicm9hZGNhc3QgbWVzc2FnZXMgKi8KKyNkZWZpbmUgTUFYX0FERFIgMTYJICAgICAgICAgIC8qIG51bWJlciBvZiBpbnRlcmZhY2VzIHdoaWNoIGNhbiBiZSBhZGRlZCB0bworCQkJCSAgICogYmF0bWFuLiAqLworCisjZGVmaW5lIFBVUkdFX1RJTUVPVVQgMjAwMDAwICAgICAgLyogcHVyZ2Ugb3JpZ2luYXRvcnMgYWZ0ZXIgdGltZSBpbiBtcyBpZiBubworCQkJCSAgICogdmFsaWQgcGFja2V0IGNvbWVzIGluIC0+IFRPRE86IGNoZWNrCisJCQkJICAgKiBpbmZsdWVuY2Ugb24gVFFfTE9DQUxfV0lORE9XX1NJWkUgKi8KKyNkZWZpbmUgTE9DQUxfSE5BX1RJTUVPVVQgMzYwMDAwMAorCisjZGVmaW5lIFRRX0xPQ0FMX1dJTkRPV19TSVpFIDY0ICAgLyogc2xpZGluZyBwYWNrZXQgcmFuZ2Ugb2YgcmVjZWl2ZWQgb3JpZ2luYXRvcgorCQkJCSAgICogbWVzc2FnZXMgaW4gc3F1ZW5jZSBudW1iZXJzIChzaG91bGQgYmUgYQorCQkJCSAgICogbXVsdGlwbGUgb2Ygb3VyIHdvcmQgc2l6ZSkgKi8KKyNkZWZpbmUgVFFfR0xPQkFMX1dJTkRPV19TSVpFIDUKKyNkZWZpbmUgVFFfTE9DQUxfQklEUkVDVF9TRU5EX01JTklNVU0gMQorI2RlZmluZSBUUV9MT0NBTF9CSURSRUNUX1JFQ1ZfTUlOSU1VTSAxCisjZGVmaW5lIFRRX1RPVEFMX0JJRFJFQ1RfTElNSVQgMQorCisjZGVmaW5lIFRRX0hPUF9QRU5BTFRZIDEwCisKKyNkZWZpbmUgTlVNX1dPUkRTIChUUV9MT0NBTF9XSU5ET1dfU0laRSAvIFdPUkRfQklUX1NJWkUpCisKKyNkZWZpbmUgUEFDS0JVRkZfU0laRSAyMDAwCisjZGVmaW5lIExPR19CVUZfTEVOIDgxOTIJICAvKiBoYXMgdG8gYmUgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIEVUSF9TVFJfTEVOIDIwCisKKyNkZWZpbmUgTUFYX0FHR1JFR0FUSU9OX0JZVEVTIDUxMiAvKiBzaG91bGQgbm90IGJlIGJpZ2dlciB0aGFuIDUxMiBieXRlcyBvcgorCQkJCSAgICogY2hhbmdlIHRoZSBzaXplIG9mCisJCQkJICAgKiBmb3J3X3BhY2tldC0+ZGlyZWN0X2xpbmtfZmxhZ3MgKi8KKyNkZWZpbmUgTUFYX0FHR1JFR0FUSU9OX01TIDEwMAorCisjZGVmaW5lIE1PRFVMRV9JTkFDVElWRSAwCisjZGVmaW5lIE1PRFVMRV9BQ1RJVkUgMQorI2RlZmluZSBNT0RVTEVfREVBQ1RJVkFUSU5HIDIKKworCisvKgorICogTG9nZ2luZworICovCisKKyNkZWZpbmUgTE9HX1RZUEVfQ1JJVCAwCQkvKiBoaWdoZXN0IHByaW9yaXR5IGZvciBmYXRhbCBlcnJvcnMgc3VjaCBhcworCQkJCSAqIGJsb2NrZWQgc29ja2V0cyAvIGZhaWxlZCBwYWNrZXQgZGVsaXZlcnkgLworCQkJCSAqIHByb2dyYW1taW5nIGVycm9ycyAqLworI2RlZmluZSBMT0dfVFlQRV9XQVJOIDEJCS8qIHdhcm5pbmdzIGZvciBzbWFsbCBlcnJvcnMgbGlrZSB3cm9uZyB1c2VyCisJCQkJICogaW5wdXQgLyBkYW1hZ2VkIHBhY2tldHMgLyBldGMgKi8KKyNkZWZpbmUgTE9HX1RZUEVfTk9USUNFIDIJLyogbm90aWNlIGluZm9ybWF0aW9uIGZvciBuZXcgaW50ZXJmYWNlcyAvCisJCQkJICogY2hhbmdlZCBzZXR0aW5ncyAvIG5ldyBvcmlnaW5hdG9ycyAvIGV0YyAqLworI2RlZmluZSBMT0dfVFlQRV9CQVRNQU4gNAkvKiBhbGwgbWVzc2FnZXMgcmVsYXRlZCB0byByb3V0aW5nIC8gZmxvb2RpbmcgLworCQkJCSAqIGJyb2FkY2FzdGluZyAvIGV0YyAqLworI2RlZmluZSBMT0dfVFlQRV9ST1VURVMgOAkvKiByb3V0ZSBvciBobmEgYWRkZWQgLyBjaGFuZ2VkIC8gZGVsZXRlZCAqLworI2RlZmluZSBMT0dfVFlQRV9DUklUX05BTUUJImNyaXRpY2FsIgorI2RlZmluZSBMT0dfVFlQRV9XQVJOX05BTUUJIndhcm5pbmdzIgorI2RlZmluZSBMT0dfVFlQRV9OT1RJQ0VfTkFNRQkibm90aWNlcyIKKyNkZWZpbmUgTE9HX1RZUEVfQkFUTUFOX05BTUUJImJhdG1hbiIKKyNkZWZpbmUgTE9HX1RZUEVfUk9VVEVTX05BTUUJInJvdXRlcyIKKworLyoKKyAqICBWaXMKKyAqLworCisvKiAjZGVmaW5lIFZJU19TVUJDTFVTVEVSU19ESVNBQkxFRCAqLworCisvKgorICogS2VybmVsIGhlYWRlcnMKKyAqLworCisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4JLyogbXV0ZXggKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JLyogbmVlZGVkIGJ5IGFsbCBtb2R1bGVzICovCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CS8qIG5ldGRldmljZSAqLworI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CS8qIGV0aGVybmV0IGhlYWRlciAqLworI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4JCS8qIHBvbGxfdGFibGUgKi8KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CS8qIGtlcm5lbCB0aHJlYWRzICovCisjaW5jbHVkZSA8bGludXgvcGt0X3NjaGVkLmg+CS8qIHNjaGVkdWxlIHR5cGVzICovCisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CS8qIHdvcmtxdWV1ZSAqLworI2luY2x1ZGUgPG5ldC9zb2NrLmg+CQkvKiBzdHJ1Y3Qgc29jayAqLworI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlICJ0eXBlcy5oIgorCisjaWZuZGVmIFJFVklTSU9OX1ZFUlNJT04KKyNkZWZpbmUgUkVWSVNJT05fVkVSU0lPTl9TVFIgIiIKKyNlbHNlCisjZGVmaW5lIFJFVklTSU9OX1ZFUlNJT05fU1RSICIgIlJFVklTSU9OX1ZFUlNJT04KKyNlbmRpZgorCitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBpZl9saXN0OworZXh0ZXJuIHN0cnVjdCBobGlzdF9oZWFkIGZvcndfYmF0X2xpc3Q7CitleHRlcm4gc3RydWN0IGhsaXN0X2hlYWQgZm9yd19iY2FzdF9saXN0OworZXh0ZXJuIHN0cnVjdCBoYXNodGFibGVfdCAqb3JpZ19oYXNoOworCitleHRlcm4gc3BpbmxvY2tfdCBvcmlnX2hhc2hfbG9jazsKK2V4dGVybiBzcGlubG9ja190IGZvcndfYmF0X2xpc3RfbG9jazsKK2V4dGVybiBzcGlubG9ja190IGZvcndfYmNhc3RfbGlzdF9sb2NrOworCitleHRlcm4gYXRvbWljX3Qgb3JpZ2luYXRvcl9pbnRlcnZhbDsKK2V4dGVybiBhdG9taWNfdCB2aXNfaW50ZXJ2YWw7CitleHRlcm4gYXRvbWljX3QgYWdncmVnYXRpb25fZW5hYmxlZDsKK2V4dGVybiBpbnQxNl90IG51bV9obmE7CitleHRlcm4gaW50MTZfdCBudW1faWZzOworCitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfZGV2aWNlOworCitleHRlcm4gdW5zaWduZWQgY2hhciBicm9hZGNhc3RBZGRyW107CitleHRlcm4gYXRvbWljX3QgbW9kdWxlX3N0YXRlOworZXh0ZXJuIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpiYXRfZXZlbnRfd29ya3F1ZXVlOworCit2b2lkIGFjdGl2YXRlX21vZHVsZSh2b2lkKTsKK3ZvaWQgc2h1dGRvd25fbW9kdWxlKHZvaWQpOwordm9pZCBpbmNfbW9kdWxlX2NvdW50KHZvaWQpOwordm9pZCBkZWNfbW9kdWxlX2NvdW50KHZvaWQpOworaW50IGFkZHJfdG9fc3RyaW5nKGNoYXIgKmJ1ZmYsIHVpbnQ4X3QgKmFkZHIpOworaW50IGNvbXBhcmVfb3JpZyh2b2lkICpkYXRhMSwgdm9pZCAqZGF0YTIpOworaW50IGNob29zZV9vcmlnKHZvaWQgKmRhdGEsIGludDMyX3Qgc2l6ZSk7CitpbnQgaXNfbXlfbWFjKHVpbnQ4X3QgKmFkZHIpOworaW50IGlzX2JjYXN0KHVpbnQ4X3QgKmFkZHIpOworaW50IGlzX21jYXN0KHVpbnQ4X3QgKmFkZHIpOworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3BhY2tldC5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcGFja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyN2NhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3BhY2tldC5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCisjZGVmaW5lIEVUSF9QX0JBVE1BTiAgMHg0MzA1CS8qIHVub2ZmaWNpYWwvbm90IHJlZ2lzdGVyZWQgRXRoZXJ0eXBlICovCisKKyNkZWZpbmUgQkFUX1BBQ0tFVCAgICAweDAxCisjZGVmaW5lIEJBVF9JQ01QICAgICAgMHgwMgorI2RlZmluZSBCQVRfVU5JQ0FTVCAgIDB4MDMKKyNkZWZpbmUgQkFUX0JDQVNUICAgICAweDA0CisjZGVmaW5lIEJBVF9WSVMgICAgICAgMHgwNQorCisvKiB0aGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgYmF0Y3RsIHdoaWNoIG5lZWRzIHRoZXNlIGRlZmluZXMgKi8KKyNkZWZpbmUgQ09NUEFUX1ZFUlNJT04gOAorI2RlZmluZSBESVJFQ1RMSU5LIDB4NDAKKyNkZWZpbmUgVklTX1NFUlZFUiAweDIwCisKKy8qIElDTVAgbWVzc2FnZSB0eXBlcyAqLworI2RlZmluZSBFQ0hPX1JFUExZIDAKKyNkZWZpbmUgREVTVElOQVRJT05fVU5SRUFDSEFCTEUgMworI2RlZmluZSBFQ0hPX1JFUVVFU1QgOAorI2RlZmluZSBUVExfRVhDRUVERUQgMTEKKyNkZWZpbmUgUEFSQU1FVEVSX1BST0JMRU0gMTIKKworLyogdmlzIGRlZmluZXMgKi8KKyNkZWZpbmUgVklTX1RZUEVfU0VSVkVSX1NZTkMJCTAKKyNkZWZpbmUgVklTX1RZUEVfQ0xJRU5UX1VQREFURQkJMQorCitzdHJ1Y3QgYmF0bWFuX3BhY2tldCB7CisJdWludDhfdCAgcGFja2V0X3R5cGU7CisJdWludDhfdCAgdmVyc2lvbjsgIC8qIGJhdG1hbiB2ZXJzaW9uIGZpZWxkICovCisJdWludDhfdCAgZmxhZ3M7ICAgIC8qIDB4NDA6IERJUkVDVExJTksgZmxhZywgMHgyMCBWSVNfU0VSVkVSIGZsYWcuLi4gKi8KKwl1aW50OF90ICB0cTsKKwl1aW50MTZfdCBzZXFubzsKKwl1aW50OF90ICBvcmlnWzZdOworCXVpbnQ4X3QgIHByZXZfc2VuZGVyWzZdOworCXVpbnQ4X3QgIHR0bDsKKwl1aW50OF90ICBudW1faG5hOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBCQVRfUEFDS0VUX0xFTiBzaXplb2Yoc3RydWN0IGJhdG1hbl9wYWNrZXQpCisKK3N0cnVjdCBpY21wX3BhY2tldCB7CisJdWludDhfdCAgcGFja2V0X3R5cGU7CisJdWludDhfdCAgdmVyc2lvbjsgIC8qIGJhdG1hbiB2ZXJzaW9uIGZpZWxkICovCisJdWludDhfdCAgbXNnX3R5cGU7IC8qIHNlZSBJQ01QIG1lc3NhZ2UgdHlwZXMgYWJvdmUgKi8KKwl1aW50OF90ICB0dGw7CisJdWludDhfdCAgZHN0WzZdOworCXVpbnQ4X3QgIG9yaWdbNl07CisJdWludDE2X3Qgc2Vxbm87CisJdWludDhfdCAgdWlkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHVuaWNhc3RfcGFja2V0IHsKKwl1aW50OF90ICBwYWNrZXRfdHlwZTsKKwl1aW50OF90ICB2ZXJzaW9uOyAgLyogYmF0bWFuIHZlcnNpb24gZmllbGQgKi8KKwl1aW50OF90ICBkZXN0WzZdOworCXVpbnQ4X3QgIHR0bDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBiY2FzdF9wYWNrZXQgeworCXVpbnQ4X3QgIHBhY2tldF90eXBlOworCXVpbnQ4X3QgIHZlcnNpb247ICAvKiBiYXRtYW4gdmVyc2lvbiBmaWVsZCAqLworCXVpbnQ4X3QgIG9yaWdbNl07CisJdWludDE2X3Qgc2Vxbm87Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgdmlzX3BhY2tldCB7CisJdWludDhfdCAgcGFja2V0X3R5cGU7CisJdWludDhfdCAgdmVyc2lvbjsgICAgICAgIC8qIGJhdG1hbiB2ZXJzaW9uIGZpZWxkICovCisJdWludDhfdCAgdmlzX3R5cGU7CSAvKiB3aGljaCB0eXBlIG9mIHZpcy1wYXJ0aWNpcGFudCBzZW50IHRoaXM/ICovCisJdWludDhfdCAgc2Vxbm87CQkgLyogc2VxdWVuY2UgbnVtYmVyICovCisJdWludDhfdCAgZW50cmllczsJIC8qIG51bWJlciBvZiBlbnRyaWVzIGJlaGluZCB0aGlzIHN0cnVjdCAqLworCXVpbnQ4X3QgIHR0bDsJCSAvKiBUVEwgKi8KKwl1aW50OF90ICB2aXNfb3JpZ1s2XTsJIC8qIG9yaWdpbmF0b3IgdGhhdCBpbmZvcm1zIGFib3V0IGl0cworCQkJCSAgKiBuZWlnaGJvdXJzICovCisJdWludDhfdCAgdGFyZ2V0X29yaWdbNl07IC8qIHdobyBzaG91bGQgcmVjZWl2ZSB0aGlzIHBhY2tldCAqLworCXVpbnQ4X3QgIHNlbmRlcl9vcmlnWzZdOyAvKiB3aG8gc2VudCBvciByZWJyb2FkY2FzdGVkIHRoaXMgcGFja2V0ICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYzNkZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9wcm9jLmMKQEAgLTAsMCArMSw5NTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgInByb2MuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJyb3V0aW5nLmgiCisjaW5jbHVkZSAidHJhbnNsYXRpb24tdGFibGUuaCIKKyNpbmNsdWRlICJoYXJkLWludGVyZmFjZS5oIgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAiaGFzaC5oIgorI2luY2x1ZGUgInZpcy5oIgorI2luY2x1ZGUgImNvbXBhdC5oIgorCitzdGF0aWMgdWludDhfdCB2aXNfZm9ybWF0ID0gRE9UX0RSQVc7CisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfYmF0bWFuX2RpciwgKnByb2NfaW50ZXJmYWNlX2ZpbGU7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX29yaWdfaW50ZXJ2YWxfZmlsZSwgKnByb2Nfb3JpZ2luYXRvcnNfZmlsZTsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfbG9nX2ZpbGUsICpwcm9jX2xvZ19sZXZlbF9maWxlOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY190cmFuc3RfbG9jYWxfZmlsZTsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfdHJhbnN0X2dsb2JhbF9maWxlOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY192aXNfZmlsZSwgKnByb2NfdmlzX2Zvcm1hdF9maWxlOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19hZ2dyX2ZpbGU7CisKK3N0YXRpYyBpbnQgcHJvY19pbnRlcmZhY2VzX3JlYWQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKK3sKKwlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWY7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoYmF0bWFuX2lmLCAmaWZfbGlzdCwgbGlzdCkgeworCQlzZXFfcHJpbnRmKHNlcSwgIlslOHNdICVzICVzIFxuIiwKKwkJCSAgIChiYXRtYW5faWYtPmlmX2FjdGl2ZSA9PSBJRl9BQ1RJVkUgPworCQkJICAgICJhY3RpdmUiIDogImluYWN0aXZlIiksCisJCQkgICBiYXRtYW5faWYtPmRldiwKKwkJCSAgIChiYXRtYW5faWYtPmlmX2FjdGl2ZSA9PSBJRl9BQ1RJVkUgPworCQkJICAgIGJhdG1hbl9pZi0+YWRkcl9zdHIgOiAiICIpKTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jX2ludGVyZmFjZXNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcHJvY19pbnRlcmZhY2VzX3JlYWQsIE5VTEwpOworfQorCitzdGF0aWMgc3NpemVfdCBwcm9jX2ludGVyZmFjZXNfd3JpdGUoc3RydWN0IGZpbGUgKmluc3RhbmNlLAorCQkJCSAgICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWZmZXIsCisJCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqZGF0YSkKK3sKKwljaGFyICppZl9zdHJpbmcsICpjb2xvbl9wdHIgPSBOVUxMLCAqY3JfcHRyID0gTlVMTDsKKwlpbnQgbm90X2NvcGllZCA9IDAsIGlmX251bSA9IDA7CisJc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmID0gTlVMTDsKKworCWlmX3N0cmluZyA9IGttYWxsb2MoY291bnQsIEdGUF9LRVJORUwpOworCisJaWYgKCFpZl9zdHJpbmcpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGNvdW50ID4gSUZOQU1TSVogLSAxKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9XQVJOLAorCQkJICAiQ2FuJ3QgYWRkIGludGVyZmFjZTogZGV2aWNlIG5hbWUgaXMgdG9vIGxvbmdcbiIpOworCQlnb3RvIGVuZDsKKwl9CisKKwlub3RfY29waWVkID0gY29weV9mcm9tX3VzZXIoaWZfc3RyaW5nLCB1c2VyYnVmZmVyLCBjb3VudCk7CisJaWZfc3RyaW5nW2NvdW50IC0gbm90X2NvcGllZCAtIDFdID0gMDsKKworCWNvbG9uX3B0ciA9IHN0cmNocihpZl9zdHJpbmcsICc6Jyk7CisJaWYgKGNvbG9uX3B0cikKKwkJKmNvbG9uX3B0ciA9IDA7CisKKwlpZiAoIWNvbG9uX3B0cikgeworCQljcl9wdHIgPSBzdHJjaHIoaWZfc3RyaW5nLCAnXG4nKTsKKwkJaWYgKGNyX3B0cikKKwkJCSpjcl9wdHIgPSAwOworCX0KKworCWlmIChzdHJsZW4oaWZfc3RyaW5nKSA9PSAwKSB7CisJCXNodXRkb3duX21vZHVsZSgpOworCQludW1faWZzID0gMDsKKwkJZ290byBlbmQ7CisJfQorCisJLyogYWRkIGludGVyZmFjZSAqLworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShiYXRtYW5faWYsICZpZl9saXN0LCBsaXN0KSB7CisJCWlmIChzdHJuY21wKGJhdG1hbl9pZi0+ZGV2LCBpZl9zdHJpbmcsIGNvdW50KSA9PSAwKSB7CisJCQlkZWJ1Z19sb2coTE9HX1RZUEVfV0FSTiwgIkdpdmVuIGludGVyZmFjZSBpcyBhbHJlYWR5IGFjdGl2ZTogJXNcbiIsIGlmX3N0cmluZyk7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCWdvdG8gZW5kOworCisJCX0KKworCQlpZl9udW0rKzsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwloYXJkaWZfYWRkX2ludGVyZmFjZShpZl9zdHJpbmcsIGlmX251bSk7CisKKwlpZiAoKGF0b21pY19yZWFkKCZtb2R1bGVfc3RhdGUpID09IE1PRFVMRV9JTkFDVElWRSkgJiYKKwkgICAgKGhhcmRpZl9nZXRfYWN0aXZlX2lmX251bSgpID4gMCkpCisJCWFjdGl2YXRlX21vZHVsZSgpOworCisJcmN1X3JlYWRfbG9jaygpOworCWlmIChsaXN0X2VtcHR5KCZpZl9saXN0KSkgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJZ290byBlbmQ7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJbnVtX2lmcyA9IGlmX251bSArIDE7CisJcmV0dXJuIGNvdW50OworCitlbmQ6CisJa2ZyZWUoaWZfc3RyaW5nKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19vcmlnX2ludGVydmFsX3JlYWQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKK3sKKwlzZXFfcHJpbnRmKHNlcSwgIiVpXG4iLCBhdG9taWNfcmVhZCgmb3JpZ2luYXRvcl9pbnRlcnZhbCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHByb2Nfb3JpZ19pbnRlcnZhbF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciAqaW50ZXJ2YWxfc3RyaW5nOworCWludCBub3RfY29waWVkID0gMDsKKwl1bnNpZ25lZCBsb25nIG9yaWdpbmF0b3JfaW50ZXJ2YWxfdG1wOworCWludCByZXR2YWw7CisKKwlpbnRlcnZhbF9zdHJpbmcgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKKworCWlmICghaW50ZXJ2YWxfc3RyaW5nKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW5vdF9jb3BpZWQgPSBjb3B5X2Zyb21fdXNlcihpbnRlcnZhbF9zdHJpbmcsIGJ1ZmZlciwgY291bnQpOworCWludGVydmFsX3N0cmluZ1tjb3VudCAtIG5vdF9jb3BpZWQgLSAxXSA9IDA7CisKKwlyZXR2YWwgPSBzdHJpY3Rfc3RydG91bChpbnRlcnZhbF9zdHJpbmcsIDEwLCAmb3JpZ2luYXRvcl9pbnRlcnZhbF90bXApOworCWlmIChyZXR2YWwpIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX1dBUk4sICJOZXcgb3JpZ2luYXRvciBpbnRlcnZhbCBpbnZhbGlkXG4iKTsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKG9yaWdpbmF0b3JfaW50ZXJ2YWxfdG1wIDw9IEpJVFRFUiAqIDIpIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX1dBUk4sCisJCQkgICJOZXcgb3JpZ2luYXRvciBpbnRlcnZhbCB0b28gc21hbGw6ICVpIChtaW46ICVpKVxuIiwKKwkJCSAgb3JpZ2luYXRvcl9pbnRlcnZhbF90bXAsIEpJVFRFUiAqIDIpOworCQlnb3RvIGVuZDsKKwl9CisKKwlkZWJ1Z19sb2coTE9HX1RZUEVfTk9USUNFLAorCQkgICJDaGFuZ2luZyBvcmlnaW5hdG9yIGludGVydmFsIGZyb206ICVpIHRvOiAlaVxuIiwKKwkJICBhdG9taWNfcmVhZCgmb3JpZ2luYXRvcl9pbnRlcnZhbCksIG9yaWdpbmF0b3JfaW50ZXJ2YWxfdG1wKTsKKworCWF0b21pY19zZXQoJm9yaWdpbmF0b3JfaW50ZXJ2YWwsIG9yaWdpbmF0b3JfaW50ZXJ2YWxfdG1wKTsKKworZW5kOgorCWtmcmVlKGludGVydmFsX3N0cmluZyk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IHByb2Nfb3JpZ19pbnRlcnZhbF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBwcm9jX29yaWdfaW50ZXJ2YWxfcmVhZCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19vcmlnaW5hdG9yc19yZWFkKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCit7CisJc3RydWN0IGhhc2hfaXRfdCAqaGFzaGl0ID0gTlVMTDsKKwlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7CisJc3RydWN0IG5laWdoX25vZGUgKm5laWdoX25vZGU7CisJaW50IGJhdG1hbl9jb3VudCA9IDA7CisJY2hhciBvcmlnX3N0cltFVEhfU1RSX0xFTl0sIHJvdXRlcl9zdHJbRVRIX1NUUl9MRU5dOworCisJcmN1X3JlYWRfbG9jaygpOworCWlmIChsaXN0X2VtcHR5KCZpZl9saXN0KSkgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJc2VxX3ByaW50ZihzZXEsICJCQVRNQU4gZGlzYWJsZWQgLSBwbGVhc2Ugc3BlY2lmeSBpbnRlcmZhY2VzIHRvIGVuYWJsZSBpdCBcbiIpOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZiAoKChzdHJ1Y3QgYmF0bWFuX2lmICopaWZfbGlzdC5uZXh0KS0+aWZfYWN0aXZlICE9IElGX0FDVElWRSkgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJc2VxX3ByaW50ZihzZXEsICJCQVRNQU4gZGlzYWJsZWQgLSBwcmltYXJ5IGludGVyZmFjZSBub3QgYWN0aXZlIFxuIik7CisJCWdvdG8gZW5kOworCX0KKworCXNlcV9wcmludGYoc2VxLAorCQkgICAiICAlLTE0cyAoJXMvJWkpICUxN3MgWyUxMHNdOiAlMjBzIC4uLiBbQi5BLlQuTS5BLk4uIGFkdiAlcyVzLCBNYWluSUYvTUFDOiAlcy8lc10gXG4iLAorCQkgICAiT3JpZ2luYXRvciIsICIjIiwgVFFfTUFYX1ZBTFVFLCAiTmV4dGhvcCIsICJvdXRnb2luZ0lGIiwKKwkJICAgIlBvdGVudGlhbCBuZXh0aG9wcyIsIFNPVVJDRV9WRVJTSU9OLCBSRVZJU0lPTl9WRVJTSU9OX1NUUiwKKwkJICAgKChzdHJ1Y3QgYmF0bWFuX2lmICopaWZfbGlzdC5uZXh0KS0+ZGV2LAorCQkgICAoKHN0cnVjdCBiYXRtYW5faWYgKilpZl9saXN0Lm5leHQpLT5hZGRyX3N0cik7CisKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlzcGluX2xvY2soJm9yaWdfaGFzaF9sb2NrKTsKKworCXdoaWxlIChOVUxMICE9IChoYXNoaXQgPSBoYXNoX2l0ZXJhdGUob3JpZ19oYXNoLCBoYXNoaXQpKSkgeworCisJCW9yaWdfbm9kZSA9IGhhc2hpdC0+YnVja2V0LT5kYXRhOworCisJCWlmICghb3JpZ19ub2RlLT5yb3V0ZXIpCisJCQljb250aW51ZTsKKworCQlpZiAob3JpZ19ub2RlLT5yb3V0ZXItPnRxX2F2ZyA9PSAwKQorCQkJY29udGludWU7CisKKwkJYmF0bWFuX2NvdW50Kys7CisKKwkJYWRkcl90b19zdHJpbmcob3JpZ19zdHIsIG9yaWdfbm9kZS0+b3JpZyk7CisJCWFkZHJfdG9fc3RyaW5nKHJvdXRlcl9zdHIsIG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyKTsKKworCQlzZXFfcHJpbnRmKHNlcSwgIiUtMTdzICAoJTNpKSAlMTdzIFslMTBzXToiLAorCQkJICAgb3JpZ19zdHIsIG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmcsCisJCQkgICByb3V0ZXJfc3RyLCBvcmlnX25vZGUtPnJvdXRlci0+aWZfaW5jb21pbmctPmRldik7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShuZWlnaF9ub2RlLCAmb3JpZ19ub2RlLT5uZWlnaF9saXN0LCBsaXN0KSB7CisJCQlhZGRyX3RvX3N0cmluZyhvcmlnX3N0ciwgbmVpZ2hfbm9kZS0+YWRkcik7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiAlMTdzICglM2kpIiwKKwkJCQkgICBvcmlnX3N0ciwgbmVpZ2hfbm9kZS0+dHFfYXZnKTsKKwkJfQorCisJCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKKworCX0KKworCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisKKwlpZiAoYmF0bWFuX2NvdW50ID09IDApCisJCXNlcV9wcmludGYoc2VxLCAiTm8gYmF0bWFuIG5vZGVzIGluIHJhbmdlIC4uLiBcbiIpOworCitlbmQ6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19vcmlnaW5hdG9yc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBwcm9jX29yaWdpbmF0b3JzX3JlYWQsIE5VTEwpOworfQorCitzdGF0aWMgaW50IHByb2NfbG9nX2xldmVsX3JlYWQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKK3sKKworCXNlcV9wcmludGYoc2VxLCAiW3hdICVzICglZClcbiIsIExPR19UWVBFX0NSSVRfTkFNRSwgTE9HX1RZUEVfQ1JJVCk7CisJc2VxX3ByaW50ZihzZXEsICJbJWNdICVzICglZClcbiIsCisJCSAgIChMT0dfVFlQRV9XQVJOICYgbG9nX2xldmVsKSA/ICd4JyA6ICcgJywKKwkJICAgTE9HX1RZUEVfV0FSTl9OQU1FLCBMT0dfVFlQRV9XQVJOKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlslY10gJXMgKCVkKVxuIiwKKwkJICAgKExPR19UWVBFX05PVElDRSAmIGxvZ19sZXZlbCkgPyAneCcgOiAnICcsCisJCSAgIExPR19UWVBFX05PVElDRV9OQU1FLCBMT0dfVFlQRV9OT1RJQ0UpOworCXNlcV9wcmludGYoc2VxLCAiWyVjXSAlcyAoJWQpXG4iLAorCQkgICAoTE9HX1RZUEVfQkFUTUFOICYgbG9nX2xldmVsKSA/ICd4JyA6ICcgJywKKwkJICAgTE9HX1RZUEVfQkFUTUFOX05BTUUsIExPR19UWVBFX0JBVE1BTik7CisJc2VxX3ByaW50ZihzZXEsICJbJWNdICVzICglZClcbiIsCisJCSAgIChMT0dfVFlQRV9ST1VURVMgJiBsb2dfbGV2ZWwpID8gJ3gnIDogJyAnLAorCQkgICBMT0dfVFlQRV9ST1VURVNfTkFNRSwgTE9HX1RZUEVfUk9VVEVTKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jX2xvZ19sZXZlbF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBwcm9jX2xvZ19sZXZlbF9yZWFkLCBOVUxMKTsKK30KKworc3RhdGljIHNzaXplX3QgcHJvY19sb2dfbGV2ZWxfd3JpdGUoc3RydWN0IGZpbGUgKmluc3RhbmNlLAorCQkJCSAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNlcmJ1ZmZlciwKKwkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKmRhdGEpCit7CisJY2hhciAqbG9nX2xldmVsX3N0cmluZywgKnRva3B0ciwgKmNwOworCWludCBmaW5pc2hlZCwgbm90X2NvcGllZCA9IDA7CisJdW5zaWduZWQgbG9uZyBsb2dfbGV2ZWxfdG1wID0gMDsKKworCWxvZ19sZXZlbF9zdHJpbmcgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKKworCWlmICghbG9nX2xldmVsX3N0cmluZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlub3RfY29waWVkID0gY29weV9mcm9tX3VzZXIobG9nX2xldmVsX3N0cmluZywgdXNlcmJ1ZmZlciwgY291bnQpOworCWxvZ19sZXZlbF9zdHJpbmdbY291bnQgLSBub3RfY29waWVkIC0gMV0gPSAwOworCisJaWYgKHN0cmljdF9zdHJ0b3VsKGxvZ19sZXZlbF9zdHJpbmcsIDEwLCAmbG9nX2xldmVsX3RtcCkgPCAwKSB7CisJCS8qIHdhcyBub3QgYSBudW1iZXIsIGRvaW5nIHRleHR1YWwgcGFyc2luZyAqLworCQlsb2dfbGV2ZWxfdG1wID0gMDsKKwkJdG9rcHRyID0gbG9nX2xldmVsX3N0cmluZzsKKworCQlmb3IgKGNwID0gbG9nX2xldmVsX3N0cmluZywgZmluaXNoZWQgPSAwOyAhZmluaXNoZWQ7IGNwKyspIHsKKwkJCXN3aXRjaCAoKmNwKSB7CisJCQljYXNlIDA6CisJCQkJZmluaXNoZWQgPSAxOworCQkJY2FzZSAnICc6CisJCQljYXNlICdcbic6CisJCQljYXNlICdcdCc6CisJCQkJKmNwID0gMDsKKwkJCQkvKiBjb21wYXJlICovCisJCQkJaWYgKHN0cmNtcCh0b2twdHIsIExPR19UWVBFX1dBUk5fTkFNRSkgPT0gMCkKKwkJCQkJbG9nX2xldmVsX3RtcCB8PSBMT0dfVFlQRV9XQVJOOworCQkJCWlmIChzdHJjbXAodG9rcHRyLCBMT0dfVFlQRV9OT1RJQ0VfTkFNRSkgPT0gMCkKKwkJCQkJbG9nX2xldmVsX3RtcCB8PSBMT0dfVFlQRV9OT1RJQ0U7CisJCQkJaWYgKHN0cmNtcCh0b2twdHIsIExPR19UWVBFX0JBVE1BTl9OQU1FKSA9PSAwKQorCQkJCQlsb2dfbGV2ZWxfdG1wIHw9IExPR19UWVBFX0JBVE1BTjsKKwkJCQlpZiAoc3RyY21wKHRva3B0ciwgTE9HX1RZUEVfUk9VVEVTX05BTUUpID09IDApCisJCQkJCWxvZ19sZXZlbF90bXAgfD0gTE9HX1RZUEVfUk9VVEVTOworCQkJCXRva3B0ciA9IGNwICsgMTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJOworCQkJfQorCQl9CisJfQorCisJZGVidWdfbG9nKExPR19UWVBFX0NSSVQsICJDaGFuZ2luZyBsb2dfbGV2ZWwgZnJvbTogJWkgdG86ICVpXG4iLAorCQkgIGxvZ19sZXZlbCwgbG9nX2xldmVsX3RtcCk7CisJbG9nX2xldmVsID0gbG9nX2xldmVsX3RtcDsKKworCWtmcmVlKGxvZ19sZXZlbF9zdHJpbmcpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBwcm9jX3RyYW5zdF9sb2NhbF9yZWFkKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCit7CisJY2hhciAqYnVmOworCisJYnVmID0ga21hbGxvYyg0MDk2LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIDA7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKGxpc3RfZW1wdHkoJmlmX2xpc3QpKSB7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlzZXFfcHJpbnRmKHNlcSwgIkJBVE1BTiBkaXNhYmxlZCAtIHBsZWFzZSBzcGVjaWZ5IGludGVyZmFjZXMgdG8gZW5hYmxlIGl0IFxuIik7CisJCWdvdG8gZW5kOworCX0KKworCXJjdV9yZWFkX3VubG9jaygpOworCisJc2VxX3ByaW50ZihzZXEsICJMb2NhbGx5IHJldHJpZXZlZCBhZGRyZXNzZXMgKGZyb20gJXMpIGFubm91bmNlZCB2aWEgSE5BOlxuIiwgc29mdF9kZXZpY2UtPm5hbWUpOworCisJaG5hX2xvY2FsX2ZpbGxfYnVmZmVyX3RleHQoYnVmLCA0MDk2KTsKKwlzZXFfcHJpbnRmKHNlcSwgIiVzIiwgYnVmKTsKKworZW5kOgorCWtmcmVlKGJ1Zik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY190cmFuc3RfbG9jYWxfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcHJvY190cmFuc3RfbG9jYWxfcmVhZCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY190cmFuc3RfZ2xvYmFsX3JlYWQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKK3sKKwljaGFyICpidWY7CisKKwlidWYgPSBrbWFsbG9jKDQwOTYsIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gMDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlpZiAobGlzdF9lbXB0eSgmaWZfbGlzdCkpIHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXNlcV9wcmludGYoc2VxLCAiQkFUTUFOIGRpc2FibGVkIC0gcGxlYXNlIHNwZWNpZnkgaW50ZXJmYWNlcyB0byBlbmFibGUgaXQgXG4iKTsKKwkJZ290byBlbmQ7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisKKwlzZXFfcHJpbnRmKHNlcSwgIkdsb2JhbGx5IGFubm91bmNlZCBITkFzIHJlY2VpdmVkIHZpYSB0aGUgbWVzaCAodHJhbnNsYXRpb24gdGFibGUpOlxuIik7CisKKwlobmFfZ2xvYmFsX2ZpbGxfYnVmZmVyX3RleHQoYnVmLCA0MDk2KTsKKwlzZXFfcHJpbnRmKHNlcSwgIiVzIiwgYnVmKTsKKworZW5kOgorCWtmcmVlKGJ1Zik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY190cmFuc3RfZ2xvYmFsX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHByb2NfdHJhbnN0X2dsb2JhbF9yZWFkLCBOVUxMKTsKK30KKworLyogaW5zZXJ0IGludGVyZmFjZSB0byB0aGUgbGlzdCBvZiBpbnRlcmZhY2VzIG9mIG9uZSBvcmlnaW5hdG9yICovCisKK3N0YXRpYyB2b2lkIHByb2NfdmlzX2luc2VydF9pbnRlcmZhY2UoY29uc3QgdWludDhfdCAqaW50ZXJmYWNlLAorCQkJCSAgICAgIHN0cnVjdCB2aXNfaWZfbGlzdCAqKmlmX2VudHJ5LAorCQkJCSAgICAgIGJvb2wgcHJpbWFyeSkKK3sKKwkvKiBEaWQgd2UgZ2V0IGFuIGVtcHR5IGxpc3Q/ICh0aGVuIGluc2VydCBpbWVkaWF0ZWx5KSAqLworCWlmKCppZl9lbnRyeSA9PSBOVUxMKSB7CisJCSppZl9lbnRyeSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2aXNfaWZfbGlzdCksIEdGUF9LRVJORUwpOworCQlpZiAoKmlmX2VudHJ5ID09IE5VTEwpCisJCQlyZXR1cm47CisKKwkJKCppZl9lbnRyeSktPnByaW1hcnkgPSBwcmltYXJ5OworCQkoKmlmX2VudHJ5KS0+bmV4dCA9IE5VTEw7CisJCW1lbWNweSgoKmlmX2VudHJ5KS0+YWRkciwgaW50ZXJmYWNlLCBFVEhfQUxFTik7CisJfSBlbHNlIHsKKwkJc3RydWN0IHZpc19pZl9saXN0ICpoZWFkX2lmX2VudHJ5ID0gKmlmX2VudHJ5OworCQkvKiBEbyB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBpbnRlcmZhY2UgaW4gb3VyIGxpc3Q/ICovCisJCXdoaWxlICghY29tcGFyZV9vcmlnKCgqaWZfZW50cnkpLT5hZGRyLCAodm9pZCAqKWludGVyZmFjZSkpIHsKKworCQkJLyogT3IgZGlkIHdlIHJlYWNoIHRoZSBlbmQgKHRoZW4gYXBwZW5kIHRoZSBpbnRlcmZhY2UpICovCisJCQlpZiAoKCppZl9lbnRyeSktPm5leHQgPT0gTlVMTCkgeworCQkJCSgqaWZfZW50cnkpLT5uZXh0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZpc19pZl9saXN0KSwgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKCgqaWZfZW50cnkpLT5uZXh0ID09IE5VTEwpCisJCQkJCXJldHVybjsKKworCQkJCW1lbWNweSgoKmlmX2VudHJ5KS0+bmV4dC0+YWRkciwgaW50ZXJmYWNlLCBFVEhfQUxFTik7CisJCQkJKCppZl9lbnRyeSktPm5leHQtPnByaW1hcnkgPSBwcmltYXJ5OworCQkJCSgqaWZfZW50cnkpLT5uZXh0LT5uZXh0ID0gTlVMTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCSppZl9lbnRyeSA9ICgqaWZfZW50cnkpLT5uZXh0OworCQl9CisJCS8qIFJld2luZCB0aGUgbGlzdCB0byBpdHMgaGVhZCAqLworCQkqaWZfZW50cnkgPSBoZWFkX2lmX2VudHJ5OworCX0KK30KKy8qIHJlYWQgYW4gZW50cnkgICovCisKK3N0YXRpYyB2b2lkIHByb2NfdmlzX3JlYWRfZW50cnkoc3RydWN0IHNlcV9maWxlICpzZXEsCisJCQkJc3RydWN0IHZpc19pbmZvX2VudHJ5ICplbnRyeSwKKwkJCQlzdHJ1Y3QgdmlzX2lmX2xpc3QgKippZl9lbnRyeSwKKwkJCQl1aW50OF90ICp2aXNfb3JpZywKKwkJCQl1aW50OF90IGN1cnJlbnRfZm9ybWF0LAorCQkJCXVpbnQ4X3QgZmlyc3RfbGluZSkKK3sKKwljaGFyIGZyb21bNDBdOworCWNoYXIgdG9bNDBdOworCWludCBpbnRfcGFydCwgZnJhY19wYXJ0OworCisJYWRkcl90b19zdHJpbmcodG8sIGVudHJ5LT5kZXN0KTsKKwlpZiAoZW50cnktPnF1YWxpdHkgPT0gMCkgeworI2lmbmRlZiBWSVNfU1VCQ0xVU1RFUlNfRElTQUJMRUQKKwkJcHJvY192aXNfaW5zZXJ0X2ludGVyZmFjZSh2aXNfb3JpZywgaWZfZW50cnksIHRydWUpOworI2VuZGlmIC8qIFZJU19TVUJDTFVTVEVSU19ESVNBQkxFRCAqLworCQlhZGRyX3RvX3N0cmluZyhmcm9tLCB2aXNfb3JpZyk7CisJCWlmIChjdXJyZW50X2Zvcm1hdCA9PSBET1RfRFJBVykgeworCQkJc2VxX3ByaW50ZihzZXEsICJcdFwiJXNcIiAtPiBcIiVzXCIgW2xhYmVsPVwiSE5BXCJdXG4iLAorCQkJCSAgIGZyb20sIHRvKTsKKwkJfSBlbHNlIHsKKwkJCXNlcV9wcmludGYoc2VxLAorCQkJCSAgICIlc1x0eyByb3V0ZXIgOiBcIiVzXCIsIGdhdGV3YXkgICA6IFwiJXNcIiwgbGFiZWwgOiBcIkhOQVwiIH0iLAorCQkJCSAgIChmaXJzdF9saW5lID8gIiIgOiAiLFxuIiksIGZyb20sIHRvKTsKKwkJfQorCX0gZWxzZSB7CisjaWZuZGVmIFZJU19TVUJDTFVTVEVSU19ESVNBQkxFRAorCQlwcm9jX3Zpc19pbnNlcnRfaW50ZXJmYWNlKGVudHJ5LT5zcmMsIGlmX2VudHJ5LCBjb21wYXJlX29yaWcoZW50cnktPnNyYywgdmlzX29yaWcpKTsKKyNlbmRpZiAvKiBWSVNfU1VCQ0xVU1RFUlNfRElTQUJMRUQgKi8KKwkJYWRkcl90b19zdHJpbmcoZnJvbSwgZW50cnktPnNyYyk7CisKKwkJLyoga2VybmVsIGhhcyBubyBwcmludGYtc3VwcG9ydCBmb3IgJWY/IGl0J2QgYmUgYmV0dGVyIHRvIHJldHVybgorCQkgKiB0aGlzIGluIGZsb2F0LiAqLworCisJCWludF9wYXJ0ID0gVFFfTUFYX1ZBTFVFIC8gZW50cnktPnF1YWxpdHk7CisJCWZyYWNfcGFydCA9IDEwMDAgKiBUUV9NQVhfVkFMVUUgLyBlbnRyeS0+cXVhbGl0eSAtIGludF9wYXJ0ICogMTAwMDsKKworCQlpZiAoY3VycmVudF9mb3JtYXQgPT0gRE9UX0RSQVcpIHsKKwkJCXNlcV9wcmludGYoc2VxLAorCQkJCSAgICJcdFwiJXNcIiAtPiBcIiVzXCIgW2xhYmVsPVwiJWQuJWRcIl1cbiIsCisJCQkJICAgZnJvbSwgdG8sIGludF9wYXJ0LCBmcmFjX3BhcnQpOworCQl9IGVsc2UgeworCQkJc2VxX3ByaW50ZihzZXEsCisJCQkJICAgIiVzXHR7IHJvdXRlciA6IFwiJXNcIiwgbmVpZ2hib3VyIDogXCIlc1wiLCBsYWJlbCA6ICVkLiVkIH0iLAorCQkJCSAgIChmaXJzdF9saW5lID8gIiIgOiAiLFxuIiksIGZyb20sIHRvLCBpbnRfcGFydCwgZnJhY19wYXJ0KTsKKwkJfQorCX0KK30KKworCitzdGF0aWMgaW50IHByb2NfdmlzX3JlYWQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKK3sKKwlzdHJ1Y3QgaGFzaF9pdF90ICpoYXNoaXQgPSBOVUxMOworCXN0cnVjdCB2aXNfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgdmlzX2luZm9fZW50cnkgKmVudHJpZXM7CisJc3RydWN0IHZpc19pZl9saXN0ICppZl9lbnRyaWVzID0gTlVMTDsKKwlpbnQgaTsKKwl1aW50OF90IGN1cnJlbnRfZm9ybWF0LCBmaXJzdF9saW5lID0gMTsKKyNpZm5kZWYgVklTX1NVQkNMVVNURVJTX0RJU0FCTEVECisJY2hhciB0bXBfYWRkcl9zdHJbRVRIX1NUUl9MRU5dOworCXN0cnVjdCB2aXNfaWZfbGlzdCAqdG1wX2lmX25leHQ7CisjZW5kaWYgLyogVklTX1NVQkNMVVNURVJTX0RJU0FCTEVEICovCisKKwljdXJyZW50X2Zvcm1hdCA9IHZpc19mb3JtYXQ7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKGxpc3RfZW1wdHkoJmlmX2xpc3QpIHx8ICghaXNfdmlzX3NlcnZlcigpKSkgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJaWYgKGN1cnJlbnRfZm9ybWF0ID09IERPVF9EUkFXKQorCQkJc2VxX3ByaW50ZihzZXEsICJkaWdyYXBoIHtcbn1cbiIpOworCQlnb3RvIGVuZDsKKwl9CisKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCWlmIChjdXJyZW50X2Zvcm1hdCA9PSBET1RfRFJBVykKKwkJc2VxX3ByaW50ZihzZXEsICJkaWdyYXBoIHtcbiIpOworCisJc3Bpbl9sb2NrKCZ2aXNfaGFzaF9sb2NrKTsKKwl3aGlsZSAoTlVMTCAhPSAoaGFzaGl0ID0gaGFzaF9pdGVyYXRlKHZpc19oYXNoLCBoYXNoaXQpKSkgeworCQlpbmZvID0gaGFzaGl0LT5idWNrZXQtPmRhdGE7CisJCWVudHJpZXMgPSAoc3RydWN0IHZpc19pbmZvX2VudHJ5ICopCisJCQkoKGNoYXIgKilpbmZvICsgc2l6ZW9mKHN0cnVjdCB2aXNfaW5mbykpOworCisJCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5wYWNrZXQuZW50cmllczsgaSsrKSB7CisJCQlwcm9jX3Zpc19yZWFkX2VudHJ5KHNlcSwgJmVudHJpZXNbaV0sICZpZl9lbnRyaWVzLAorCQkJCQkgICAgaW5mby0+cGFja2V0LnZpc19vcmlnLAorCQkJCQkgICAgY3VycmVudF9mb3JtYXQsIGZpcnN0X2xpbmUpOworCQkJaWYgKGZpcnN0X2xpbmUpCisJCQkJZmlyc3RfbGluZSA9IDA7CisJCX0KKworI2lmbmRlZiBWSVNfU1VCQ0xVU1RFUlNfRElTQUJMRUQKKwkJLyogR2VuZXJhdGUgc3ViZ3JhcGhzIGZyb20gdGhlIGNvbGxlY3RlZCBpdGVtcyAqLworCQlpZiAoY3VycmVudF9mb3JtYXQgPT0gRE9UX0RSQVcpIHsKKworCQkJYWRkcl90b19zdHJpbmcodG1wX2FkZHJfc3RyLCBpbmZvLT5wYWNrZXQudmlzX29yaWcpOworCQkJc2VxX3ByaW50ZihzZXEsICJcdHN1YmdyYXBoIFwiY2x1c3Rlcl8lc1wiIHtcbiIsIHRtcF9hZGRyX3N0cik7CisJCQl3aGlsZSAoaWZfZW50cmllcyAhPSBOVUxMKSB7CisKKwkJCQlhZGRyX3RvX3N0cmluZyh0bXBfYWRkcl9zdHIsIGlmX2VudHJpZXMtPmFkZHIpOworCQkJCWlmIChpZl9lbnRyaWVzLT5wcmltYXJ5KQorCQkJCQlzZXFfcHJpbnRmKHNlcSwgIlx0XHRcIiVzXCIgW3BlcmlwaGVyaWVzPTJdXG4iLCB0bXBfYWRkcl9zdHIpOworCQkJCWVsc2UKKwkJCQkJc2VxX3ByaW50ZihzZXEsICJcdFx0XCIlc1wiXG4iLCB0bXBfYWRkcl9zdHIpOworCisJCQkJLyogLi4uIGFuZCBlbXB0eSB0aGUgbGlzdCB3aGlsZSBkb2luZyB0aGlzICovCisJCQkJdG1wX2lmX25leHQgPSBpZl9lbnRyaWVzLT5uZXh0OworCQkJCWtmcmVlKGlmX2VudHJpZXMpOworCQkJCWlmX2VudHJpZXMgPSB0bXBfaWZfbmV4dDsKKwkJCX0KKwkJCXNlcV9wcmludGYoc2VxLCAiXHR9XG4iKTsKKwkJfQorI2VuZGlmIC8qIFZJU19TVUJDTFVTVEVSU19ESVNBQkxFRCAqLworCX0KKwlzcGluX3VubG9jaygmdmlzX2hhc2hfbG9jayk7CisKKwlpZiAoY3VycmVudF9mb3JtYXQgPT0gRE9UX0RSQVcpCisJCXNlcV9wcmludGYoc2VxLCAifVxuIik7CisJZWxzZQorCQlzZXFfcHJpbnRmKHNlcSwgIlxuIik7CitlbmQ6CisJcmV0dXJuIDA7Cit9CisKKy8qIHNldHRpbmcgdGhlIG1vZGUgb2YgdGhlIHZpcyBzZXJ2ZXIgYnkgdGhlIHVzZXIgKi8KK3N0YXRpYyBzc2l6ZV90IHByb2NfdmlzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKKwkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgKnZpc19tb2RlX3N0cmluZzsKKwlpbnQgbm90X2NvcGllZCA9IDA7CisKKwl2aXNfbW9kZV9zdHJpbmcgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKKworCWlmICghdmlzX21vZGVfc3RyaW5nKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW5vdF9jb3BpZWQgPSBjb3B5X2Zyb21fdXNlcih2aXNfbW9kZV9zdHJpbmcsIGJ1ZmZlciwgY291bnQpOworCXZpc19tb2RlX3N0cmluZ1tjb3VudCAtIG5vdF9jb3BpZWQgLSAxXSA9IDA7CisKKwlpZiAoc3RyY21wKHZpc19tb2RlX3N0cmluZywgImNsaWVudCIpID09IDApIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX05PVElDRSwgIlNldHRpbmcgVklTIG1vZGUgdG8gY2xpZW50XG4iKTsKKwkJdmlzX3NldF9tb2RlKFZJU19UWVBFX0NMSUVOVF9VUERBVEUpOworCX0gZWxzZSBpZiAoc3RyY21wKHZpc19tb2RlX3N0cmluZywgInNlcnZlciIpID09IDApIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX05PVElDRSwgIlNldHRpbmcgVklTIG1vZGUgdG8gc2VydmVyXG4iKTsKKwkJdmlzX3NldF9tb2RlKFZJU19UWVBFX1NFUlZFUl9TWU5DKTsKKwl9IGVsc2UKKwkJZGVidWdfbG9nKExPR19UWVBFX1dBUk4sICJVbmtub3duIFZJUyBtb2RlOiAlc1xuIiwKKwkJCSAgdmlzX21vZGVfc3RyaW5nKTsKKworCWtmcmVlKHZpc19tb2RlX3N0cmluZyk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IHByb2NfdmlzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHByb2NfdmlzX3JlYWQsIE5VTEwpOworfQorCitzdGF0aWMgaW50IHByb2NfdmlzX2Zvcm1hdF9yZWFkKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCit7CisJdWludDhfdCBjdXJyZW50X2Zvcm1hdCA9IHZpc19mb3JtYXQ7CisKKwlzZXFfcHJpbnRmKHNlcSwgIlslY10gJXNcbiIsCisJCSAgIChjdXJyZW50X2Zvcm1hdCA9PSBET1RfRFJBVykgPyAneCcgOiAnICcsCisJCSAgIFZJU19GT1JNQVRfRERfTkFNRSk7CisJc2VxX3ByaW50ZihzZXEsICJbJWNdICVzXG4iLAorCQkgICAoY3VycmVudF9mb3JtYXQgPT0gSlNPTikgPyAneCcgOiAnICcsCisJCSAgIFZJU19GT1JNQVRfSlNPTl9OQU1FKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jX3Zpc19mb3JtYXRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcHJvY192aXNfZm9ybWF0X3JlYWQsIE5VTEwpOworfQorCitzdGF0aWMgc3NpemVfdCBwcm9jX3Zpc19mb3JtYXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciAqdmlzX2Zvcm1hdF9zdHJpbmc7CisJaW50IG5vdF9jb3BpZWQgPSAwOworCisJdmlzX2Zvcm1hdF9zdHJpbmcgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKKworCWlmICghdmlzX2Zvcm1hdF9zdHJpbmcpCisJCXJldHVybiAtRU5PTUVNOworCisJbm90X2NvcGllZCA9IGNvcHlfZnJvbV91c2VyKHZpc19mb3JtYXRfc3RyaW5nLCBidWZmZXIsIGNvdW50KTsKKwl2aXNfZm9ybWF0X3N0cmluZ1tjb3VudCAtIG5vdF9jb3BpZWQgLSAxXSA9IDA7CisKKwlpZiAoc3RyY21wKHZpc19mb3JtYXRfc3RyaW5nLCBWSVNfRk9STUFUX0REX05BTUUpID09IDApIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX05PVElDRSwgIlNldHRpbmcgVklTIG91dHB1dCBmb3JtYXQgdG86ICVzXG4iLAorCQkJICBWSVNfRk9STUFUX0REX05BTUUpOworCQl2aXNfZm9ybWF0ID0gRE9UX0RSQVc7CisJfSBlbHNlIGlmIChzdHJjbXAodmlzX2Zvcm1hdF9zdHJpbmcsIFZJU19GT1JNQVRfSlNPTl9OQU1FKSA9PSAwKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9OT1RJQ0UsICJTZXR0aW5nIFZJUyBvdXRwdXQgZm9ybWF0IHRvOiAlc1xuIiwKKwkJCSAgVklTX0ZPUk1BVF9KU09OX05BTUUpOworCQl2aXNfZm9ybWF0ID0gSlNPTjsKKwl9IGVsc2UKKwkJZGVidWdfbG9nKExPR19UWVBFX1dBUk4sICJVbmtub3duIFZJUyBvdXRwdXQgZm9ybWF0OiAlc1xuIiwKKwkJCSAgdmlzX2Zvcm1hdF9zdHJpbmcpOworCisJa2ZyZWUodmlzX2Zvcm1hdF9zdHJpbmcpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBwcm9jX2FnZ3JfcmVhZChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQoreworCXNlcV9wcmludGYoc2VxLCAiJWlcbiIsIGF0b21pY19yZWFkKCZhZ2dyZWdhdGlvbl9lbmFibGVkKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgcHJvY19hZ2dyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgKmFnZ3Jfc3RyaW5nOworCWludCBub3RfY29waWVkID0gMDsKKwl1bnNpZ25lZCBsb25nIGFnZ3JlZ2F0aW9uX2VuYWJsZWRfdG1wOworCisJYWdncl9zdHJpbmcgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKKworCWlmICghYWdncl9zdHJpbmcpCisJCXJldHVybiAtRU5PTUVNOworCisJbm90X2NvcGllZCA9IGNvcHlfZnJvbV91c2VyKGFnZ3Jfc3RyaW5nLCBidWZmZXIsIGNvdW50KTsKKwlhZ2dyX3N0cmluZ1tjb3VudCAtIG5vdF9jb3BpZWQgLSAxXSA9IDA7CisKKwlzdHJpY3Rfc3RydG91bChhZ2dyX3N0cmluZywgMTAsICZhZ2dyZWdhdGlvbl9lbmFibGVkX3RtcCk7CisKKwlpZiAoKGFnZ3JlZ2F0aW9uX2VuYWJsZWRfdG1wICE9IDApICYmIChhZ2dyZWdhdGlvbl9lbmFibGVkX3RtcCAhPSAxKSkgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfV0FSTiwgIkFnZ3JlZ2F0aW9uIGNhbiBvbmx5IGJlIGVuYWJsZWQgKDEpIG9yIGRpc2FibGVkICgwKSwgZ2l2ZW4gdmFsdWU6ICVsaVxuIiwgYWdncmVnYXRpb25fZW5hYmxlZF90bXApOworCQlnb3RvIGVuZDsKKwl9CisKKwlkZWJ1Z19sb2coTE9HX1RZUEVfTk9USUNFLCAiQ2hhbmdpbmcgYWdncmVnYXRpb24gZnJvbTogJXMgKCVpKSB0bzogJXMgKCVsaSlcbiIsCisJCSAgKGF0b21pY19yZWFkKCZhZ2dyZWdhdGlvbl9lbmFibGVkKSA9PSAxID8KKwkJICAgImVuYWJsZWQiIDogImRpc2FibGVkIiksCisJCSAgYXRvbWljX3JlYWQoJmFnZ3JlZ2F0aW9uX2VuYWJsZWQpLAorCQkgIChhZ2dyZWdhdGlvbl9lbmFibGVkX3RtcCA9PSAxID8gImVuYWJsZWQiIDogImRpc2FibGVkIiksCisJCSAgYWdncmVnYXRpb25fZW5hYmxlZF90bXApOworCisJYXRvbWljX3NldCgmYWdncmVnYXRpb25fZW5hYmxlZCwgKHVuc2lnbmVkKWFnZ3JlZ2F0aW9uX2VuYWJsZWRfdG1wKTsKK2VuZDoKKwlrZnJlZShhZ2dyX3N0cmluZyk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IHByb2NfYWdncl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBwcm9jX2FnZ3JfcmVhZCwgTlVMTCk7Cit9CisKKy8qIHNhdGlzZnlpbmcgZGlmZmVyZW50IHByb3RvdHlwZXMgLi4uICovCitzdGF0aWMgc3NpemVfdCBwcm9jX2R1bW15X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19hZ2dyX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHByb2NfYWdncl9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS53cml0ZQkJPSBwcm9jX2FnZ3Jfd3JpdGUsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfdmlzX2Zvcm1hdF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBwcm9jX3Zpc19mb3JtYXRfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkud3JpdGUJCT0gcHJvY192aXNfZm9ybWF0X3dyaXRlLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3Zpc19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBwcm9jX3Zpc19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS53cml0ZQkJPSBwcm9jX3Zpc193cml0ZSwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19vcmlnaW5hdG9yc19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBwcm9jX29yaWdpbmF0b3JzX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLndyaXRlCQk9IHByb2NfZHVtbXlfd3JpdGUsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfdHJhbnN0X2xvY2FsX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHByb2NfdHJhbnN0X2xvY2FsX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLndyaXRlCQk9IHByb2NfZHVtbXlfd3JpdGUsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfdHJhbnN0X2dsb2JhbF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBwcm9jX3RyYW5zdF9nbG9iYWxfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkud3JpdGUJCT0gcHJvY19kdW1teV93cml0ZSwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19sb2dfbGV2ZWxfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gcHJvY19sb2dfbGV2ZWxfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkud3JpdGUJCT0gcHJvY19sb2dfbGV2ZWxfd3JpdGUsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfaW50ZXJmYWNlc19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBwcm9jX2ludGVyZmFjZXNfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkud3JpdGUJCT0gcHJvY19pbnRlcmZhY2VzX3dyaXRlLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX29yaWdfaW50ZXJ2YWxfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gcHJvY19vcmlnX2ludGVydmFsX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLndyaXRlCQk9IHByb2Nfb3JpZ19pbnRlcnZhbF93cml0ZSwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKwordm9pZCBjbGVhbnVwX3Byb2Nmcyh2b2lkKQoreworCWlmIChwcm9jX3RyYW5zdF9nbG9iYWxfZmlsZSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19GSUxFX1RSQU5TVF9HTE9CQUwsIHByb2NfYmF0bWFuX2Rpcik7CisKKwlpZiAocHJvY190cmFuc3RfbG9jYWxfZmlsZSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19GSUxFX1RSQU5TVF9MT0NBTCwgcHJvY19iYXRtYW5fZGlyKTsKKworCWlmIChwcm9jX2xvZ19maWxlKQorCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX0ZJTEVfTE9HLCBwcm9jX2JhdG1hbl9kaXIpOworCisJaWYgKHByb2NfbG9nX2xldmVsX2ZpbGUpCisJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfRklMRV9MT0dfTEVWRUwsIHByb2NfYmF0bWFuX2Rpcik7CisKKwlpZiAocHJvY19vcmlnaW5hdG9yc19maWxlKQorCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX0ZJTEVfT1JJR0lOQVRPUlMsIHByb2NfYmF0bWFuX2Rpcik7CisKKwlpZiAocHJvY19vcmlnX2ludGVydmFsX2ZpbGUpCisJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfRklMRV9PUklHX0lOVEVSVkFMLCBwcm9jX2JhdG1hbl9kaXIpOworCisJaWYgKHByb2NfaW50ZXJmYWNlX2ZpbGUpCisJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfRklMRV9JTlRFUkZBQ0VTLCBwcm9jX2JhdG1hbl9kaXIpOworCisJaWYgKHByb2NfdmlzX2ZpbGUpCisJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfRklMRV9WSVMsIHByb2NfYmF0bWFuX2Rpcik7CisKKwlpZiAocHJvY192aXNfZm9ybWF0X2ZpbGUpCisJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfRklMRV9WSVNfRk9STUFULCBwcm9jX2JhdG1hbl9kaXIpOworCisJaWYgKHByb2NfYWdncl9maWxlKQorCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX0ZJTEVfQUdHUiwgcHJvY19iYXRtYW5fZGlyKTsKKworCWlmIChwcm9jX2JhdG1hbl9kaXIpCisjaWZkZWYgX19ORVRfTkVUX05BTUVTUEFDRV9ICisJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfUk9PVF9ESVIsIGluaXRfbmV0LnByb2NfbmV0KTsKKyNlbHNlCisJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfUk9PVF9ESVIsIHByb2NfbmV0KTsKKyNlbmRpZgorfQorCitpbnQgc2V0dXBfcHJvY2ZzKHZvaWQpCit7CisjaWZkZWYgX19ORVRfTkVUX05BTUVTUEFDRV9ICisJcHJvY19iYXRtYW5fZGlyID0gcHJvY19ta2RpcihQUk9DX1JPT1RfRElSLCBpbml0X25ldC5wcm9jX25ldCk7CisjZWxzZQorCXByb2NfYmF0bWFuX2RpciA9IHByb2NfbWtkaXIoUFJPQ19ST09UX0RJUiwgcHJvY19uZXQpOworI2VuZGlmCisKKwlpZiAoIXByb2NfYmF0bWFuX2RpcikgeworCQlwcmludGsoS0VSTl9FUlIgImJhdG1hbi1hZHY6IFJlZ2lzdGVyaW5nIHRoZSAnL3Byb2MvbmV0LyVzJyBmb2xkZXIgZmFpbGVkXG4iLCBQUk9DX1JPT1RfRElSKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcHJvY19pbnRlcmZhY2VfZmlsZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KFBST0NfRklMRV9JTlRFUkZBQ0VTLAorCQkJCQkJU19JV1VTUiB8IFNfSVJVR08sCisJCQkJCQlwcm9jX2JhdG1hbl9kaXIpOworCWlmIChwcm9jX2ludGVyZmFjZV9maWxlKSB7CisJCXByb2NfaW50ZXJmYWNlX2ZpbGUtPnByb2NfZm9wcyA9ICZwcm9jX2ludGVyZmFjZXNfZm9wczsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgImJhdG1hbi1hZHY6IFJlZ2lzdGVyaW5nIHRoZSAnL3Byb2MvbmV0LyVzLyVzJyBmaWxlIGZhaWxlZFxuIiwgUFJPQ19ST09UX0RJUiwgUFJPQ19GSUxFX0lOVEVSRkFDRVMpOworCQljbGVhbnVwX3Byb2NmcygpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlwcm9jX29yaWdfaW50ZXJ2YWxfZmlsZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KFBST0NfRklMRV9PUklHX0lOVEVSVkFMLAorCQkJCQkJICAgIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJCQkJICAgIHByb2NfYmF0bWFuX2Rpcik7CisJaWYgKHByb2Nfb3JpZ19pbnRlcnZhbF9maWxlKSB7CisJCXByb2Nfb3JpZ19pbnRlcnZhbF9maWxlLT5wcm9jX2ZvcHMgPSAmcHJvY19vcmlnX2ludGVydmFsX2ZvcHM7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiYXRtYW4tYWR2OiBSZWdpc3RlcmluZyB0aGUgJy9wcm9jL25ldC8lcy8lcycgZmlsZSBmYWlsZWRcbiIsIFBST0NfUk9PVF9ESVIsIFBST0NfRklMRV9PUklHX0lOVEVSVkFMKTsKKwkJY2xlYW51cF9wcm9jZnMoKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcHJvY19sb2dfbGV2ZWxfZmlsZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KFBST0NfRklMRV9MT0dfTEVWRUwsCisJCQkJCQlTX0lXVVNSIHwgU19JUlVHTywKKwkJCQkJCXByb2NfYmF0bWFuX2Rpcik7CisJaWYgKHByb2NfbG9nX2xldmVsX2ZpbGUpIHsKKwkJcHJvY19sb2dfbGV2ZWxfZmlsZS0+cHJvY19mb3BzID0gJnByb2NfbG9nX2xldmVsX2ZvcHM7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiYXRtYW4tYWR2OiBSZWdpc3RlcmluZyB0aGUgJy9wcm9jL25ldC8lcy8lcycgZmlsZSBmYWlsZWRcbiIsIFBST0NfUk9PVF9ESVIsIFBST0NfRklMRV9MT0dfTEVWRUwpOworCQljbGVhbnVwX3Byb2NmcygpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlwcm9jX29yaWdpbmF0b3JzX2ZpbGUgPSBjcmVhdGVfcHJvY19lbnRyeShQUk9DX0ZJTEVfT1JJR0lOQVRPUlMsCisJCQkJCQkgIFNfSVJVR08sIHByb2NfYmF0bWFuX2Rpcik7CisJaWYgKHByb2Nfb3JpZ2luYXRvcnNfZmlsZSkgeworCQlwcm9jX29yaWdpbmF0b3JzX2ZpbGUtPnByb2NfZm9wcyA9ICZwcm9jX29yaWdpbmF0b3JzX2ZvcHM7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiYXRtYW4tYWR2OiBSZWdpc3RlcmluZyB0aGUgJy9wcm9jL25ldC8lcy8lcycgZmlsZSBmYWlsZWRcbiIsIFBST0NfUk9PVF9ESVIsIFBST0NfRklMRV9PUklHSU5BVE9SUyk7CisJCWNsZWFudXBfcHJvY2ZzKCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXByb2NfbG9nX2ZpbGUgPSBjcmVhdGVfcHJvY19lbnRyeShQUk9DX0ZJTEVfTE9HLAorCQkJCQkgIFNfSVJVR08sIHByb2NfYmF0bWFuX2Rpcik7CisJaWYgKHByb2NfbG9nX2ZpbGUpIHsKKwkJcHJvY19sb2dfZmlsZS0+cHJvY19mb3BzID0gJnByb2NfbG9nX29wZXJhdGlvbnM7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiYXRtYW4tYWR2OiBSZWdpc3RlcmluZyB0aGUgJy9wcm9jL25ldC8lcy8lcycgZmlsZSBmYWlsZWRcbiIsIFBST0NfRklMRV9MT0csIFBST0NfRklMRV9HQVRFV0FZUyk7CisJCWNsZWFudXBfcHJvY2ZzKCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXByb2NfdHJhbnN0X2xvY2FsX2ZpbGUgPSBjcmVhdGVfcHJvY19lbnRyeShQUk9DX0ZJTEVfVFJBTlNUX0xPQ0FMLAorCQkJCQkJICAgU19JUlVHTywgcHJvY19iYXRtYW5fZGlyKTsKKwlpZiAocHJvY190cmFuc3RfbG9jYWxfZmlsZSkgeworCQlwcm9jX3RyYW5zdF9sb2NhbF9maWxlLT5wcm9jX2ZvcHMgPSAmcHJvY190cmFuc3RfbG9jYWxfZm9wczsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgImJhdG1hbi1hZHY6IFJlZ2lzdGVyaW5nIHRoZSAnL3Byb2MvbmV0LyVzLyVzJyBmaWxlIGZhaWxlZFxuIiwgUFJPQ19ST09UX0RJUiwgUFJPQ19GSUxFX1RSQU5TVF9MT0NBTCk7CisJCWNsZWFudXBfcHJvY2ZzKCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXByb2NfdHJhbnN0X2dsb2JhbF9maWxlID0gY3JlYXRlX3Byb2NfZW50cnkoUFJPQ19GSUxFX1RSQU5TVF9HTE9CQUwsCisJCQkJCQkgICAgU19JUlVHTywgcHJvY19iYXRtYW5fZGlyKTsKKwlpZiAocHJvY190cmFuc3RfZ2xvYmFsX2ZpbGUpIHsKKwkJcHJvY190cmFuc3RfZ2xvYmFsX2ZpbGUtPnByb2NfZm9wcyA9ICZwcm9jX3RyYW5zdF9nbG9iYWxfZm9wczsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgImJhdG1hbi1hZHY6IFJlZ2lzdGVyaW5nIHRoZSAnL3Byb2MvbmV0LyVzLyVzJyBmaWxlIGZhaWxlZFxuIiwgUFJPQ19ST09UX0RJUiwgUFJPQ19GSUxFX1RSQU5TVF9HTE9CQUwpOworCQljbGVhbnVwX3Byb2NmcygpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlwcm9jX3Zpc19maWxlID0gY3JlYXRlX3Byb2NfZW50cnkoUFJPQ19GSUxFX1ZJUywgU19JV1VTUiB8IFNfSVJVR08sCisJCQkJCSAgcHJvY19iYXRtYW5fZGlyKTsKKwlpZiAocHJvY192aXNfZmlsZSkgeworCQlwcm9jX3Zpc19maWxlLT5wcm9jX2ZvcHMgPSAmcHJvY192aXNfZm9wczsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgImJhdG1hbi1hZHY6IFJlZ2lzdGVyaW5nIHRoZSAnL3Byb2MvbmV0LyVzLyVzJyBmaWxlIGZhaWxlZFxuIiwgUFJPQ19ST09UX0RJUiwgUFJPQ19GSUxFX1ZJUyk7CisJCWNsZWFudXBfcHJvY2ZzKCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXByb2NfdmlzX2Zvcm1hdF9maWxlID0gY3JlYXRlX3Byb2NfZW50cnkoUFJPQ19GSUxFX1ZJU19GT1JNQVQsCisJCQkJCQkgU19JV1VTUiB8IFNfSVJVR08sCisJCQkJCQkgcHJvY19iYXRtYW5fZGlyKTsKKwlpZiAocHJvY192aXNfZm9ybWF0X2ZpbGUpIHsKKwkJcHJvY192aXNfZm9ybWF0X2ZpbGUtPnByb2NfZm9wcyA9ICZwcm9jX3Zpc19mb3JtYXRfZm9wczsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgImJhdG1hbi1hZHY6IFJlZ2lzdGVyaW5nIHRoZSAnL3Byb2MvbmV0LyVzLyVzJyBmaWxlIGZhaWxlZFxuIiwgUFJPQ19ST09UX0RJUiwgUFJPQ19GSUxFX1ZJU19GT1JNQVQpOworCQljbGVhbnVwX3Byb2NmcygpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlwcm9jX2FnZ3JfZmlsZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KFBST0NfRklMRV9BR0dSLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCQkJICAgcHJvY19iYXRtYW5fZGlyKTsKKwlpZiAocHJvY19hZ2dyX2ZpbGUpIHsKKwkJcHJvY19hZ2dyX2ZpbGUtPnByb2NfZm9wcyA9ICZwcm9jX2FnZ3JfZm9wczsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgImJhdG1hbi1hZHY6IFJlZ2lzdGVyaW5nIHRoZSAnL3Byb2MvbmV0LyVzLyVzJyBmaWxlIGZhaWxlZFxuIiwgUFJPQ19ST09UX0RJUiwgUFJPQ19GSUxFX0FHR1IpOworCQljbGVhbnVwX3Byb2NmcygpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9wcm9jLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9wcm9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZkM2VmZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3Byb2MuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisjZGVmaW5lIFBST0NfUk9PVF9ESVIgImJhdG1hbi1hZHYiCisjZGVmaW5lIFBST0NfRklMRV9JTlRFUkZBQ0VTICJpbnRlcmZhY2VzIgorI2RlZmluZSBQUk9DX0ZJTEVfT1JJR19JTlRFUlZBTCAib3JpZ19pbnRlcnZhbCIKKyNkZWZpbmUgUFJPQ19GSUxFX09SSUdJTkFUT1JTICJvcmlnaW5hdG9ycyIKKyNkZWZpbmUgUFJPQ19GSUxFX0dBVEVXQVlTICJnYXRld2F5cyIKKyNkZWZpbmUgUFJPQ19GSUxFX0xPRyAibG9nIgorI2RlZmluZSBQUk9DX0ZJTEVfTE9HX0xFVkVMICJsb2dfbGV2ZWwiCisjZGVmaW5lIFBST0NfRklMRV9UUkFOU1RfTE9DQUwgInRyYW5zdGFibGVfbG9jYWwiCisjZGVmaW5lIFBST0NfRklMRV9UUkFOU1RfR0xPQkFMICJ0cmFuc3RhYmxlX2dsb2JhbCIKKyNkZWZpbmUgUFJPQ19GSUxFX1ZJUyAidmlzIgorI2RlZmluZSBQUk9DX0ZJTEVfVklTX0ZPUk1BVCAidmlzX2Zvcm1hdCIKKyNkZWZpbmUgUFJPQ19GSUxFX0FHR1IgImFnZ3JlZ2F0ZV9vZ20iCisKK3ZvaWQgY2xlYW51cF9wcm9jZnModm9pZCk7CitpbnQgc2V0dXBfcHJvY2ZzKHZvaWQpOworCisvKiBXaGlsZSBzY2FubmluZyBmb3IgdmlzLWVudHJpZXMgb2YgYSBwYXJ0aWN1bGFyIHZpcy1vcmlnaW5hdG9yCisgKiB0aGlzIGxpc3QgY29sbGVjdHMgaXRzIGludGVyZmFjZXMgdG8gY3JlYXRlIGEgc3ViZ3JhcGgvY2x1c3RlcgorICogb3V0IG9mIHRoZW0gbGF0ZXIKKyAqLworc3RydWN0IHZpc19pZl9saXN0IHsKKwl1aW50OF90IGFkZHJbRVRIX0FMRU5dOworCWJvb2wgcHJpbWFyeTsKKwlzdHJ1Y3QgdmlzX2lmX2xpc3QgKm5leHQ7Cit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcmluZ19idWZmZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3JpbmdfYnVmZmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUxYzg5OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3JpbmdfYnVmZmVyLmMKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogTWFyZWsgTGluZG5lcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAicmluZ19idWZmZXIuaCIKKwordm9pZCByaW5nX2J1ZmZlcl9zZXQodWludDhfdCBscV9yZWN2W10sIHVpbnQ4X3QgKmxxX2luZGV4LCB1aW50OF90IHZhbHVlKQoreworCWxxX3JlY3ZbKmxxX2luZGV4XSA9IHZhbHVlOworCSpscV9pbmRleCA9ICgqbHFfaW5kZXggKyAxKSAlIFRRX0dMT0JBTF9XSU5ET1dfU0laRTsKK30KKwordWludDhfdCByaW5nX2J1ZmZlcl9hdmcodWludDhfdCBscV9yZWN2W10pCit7CisJdWludDhfdCAqcHRyOworCXVpbnQxNl90IGNvdW50ID0gMCwgaSA9IDAsIHN1bSA9IDA7CisKKwlwdHIgPSBscV9yZWN2OworCisJd2hpbGUgKGkgPCBUUV9HTE9CQUxfV0lORE9XX1NJWkUpIHsKKwkJaWYgKCpwdHIgIT0gMCkgeworCQkJY291bnQrKzsKKwkJCXN1bSArPSAqcHRyOworCQl9CisKKwkJaSsrOworCQlwdHIrKzsKKwl9CisKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKHVpbnQ4X3QpKHN1bSAvIGNvdW50KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3JpbmdfYnVmZmVyLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yaW5nX2J1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MzliYTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yaW5nX2J1ZmZlci5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIE1hcmVrIExpbmRuZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCit2b2lkIHJpbmdfYnVmZmVyX3NldCh1aW50OF90IGxxX3JlY3ZbXSwgdWludDhfdCAqbHFfaW5kZXgsIHVpbnQ4X3QgdmFsdWUpOwordWludDhfdCByaW5nX2J1ZmZlcl9hdmcodWludDhfdCBscV9yZWN2W10pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcm91dGluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcm91dGluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMTRjMzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yb3V0aW5nLmMKQEAgLTAsMCArMSwxMDEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworCisKKworCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgInJvdXRpbmcuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJzZW5kLmgiCisjaW5jbHVkZSAic29mdC1pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJoYXJkLWludGVyZmFjZS5oIgorI2luY2x1ZGUgImRldmljZS5oIgorI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJoYXNoLmgiCisjaW5jbHVkZSAicmluZ19idWZmZXIuaCIKKyNpbmNsdWRlICJ2aXMuaCIKKyNpbmNsdWRlICJhZ2dyZWdhdGlvbi5oIgorI2luY2x1ZGUgImNvbXBhdC5oIgorCisKKworREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQodGhyZWFkX3dhaXQpOworc3RhdGljIERFQ0xBUkVfREVMQVlFRF9XT1JLKHB1cmdlX29yaWdfd3EsIHB1cmdlX29yaWcpOworCitzdGF0aWMgYXRvbWljX3QgZGF0YV9yZWFkeV9jb25kOworYXRvbWljX3QgZXhpdF9jb25kOworCitzdGF0aWMgdm9pZCBzdGFydF9wdXJnZV90aW1lcih2b2lkKQoreworCXF1ZXVlX2RlbGF5ZWRfd29yayhiYXRfZXZlbnRfd29ya3F1ZXVlLCAmcHVyZ2Vfb3JpZ193cSwgMSAqIEhaKTsKK30KKworaW50IG9yaWdpbmF0b3JfaW5pdCh2b2lkKQoreworCWlmIChvcmlnX2hhc2gpCisJCXJldHVybiAxOworCisJc3Bpbl9sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJb3JpZ19oYXNoID0gaGFzaF9uZXcoMTI4LCBjb21wYXJlX29yaWcsIGNob29zZV9vcmlnKTsKKworCWlmICghb3JpZ19oYXNoKQorCQlnb3RvIGVycjsKKworCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJc3RhcnRfcHVyZ2VfdGltZXIoKTsKKwlyZXR1cm4gMTsKKworZXJyOgorCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgb3JpZ2luYXRvcl9mcmVlKHZvaWQpCit7CisJaWYgKCFvcmlnX2hhc2gpCisJCXJldHVybjsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHVyZ2Vfb3JpZ193cSk7CisKKwlzcGluX2xvY2soJm9yaWdfaGFzaF9sb2NrKTsKKwloYXNoX2RlbGV0ZShvcmlnX2hhc2gsIGZyZWVfb3JpZ19ub2RlKTsKKwlvcmlnX2hhc2ggPSBOVUxMOworCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmVpZ2hfbm9kZSAqY3JlYXRlX25laWdoYm9yKHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19uZWlnaF9ub2RlLCB1aW50OF90ICpuZWlnaCwgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcpCit7CisJc3RydWN0IG5laWdoX25vZGUgKm5laWdoX25vZGU7CisKKwlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAiQ3JlYXRpbmcgbmV3IGxhc3QtaG9wIG5laWdoYm91ciBvZiBvcmlnaW5hdG9yXG4iKTsKKworCW5laWdoX25vZGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmVpZ2hfbm9kZSksIEdGUF9BVE9NSUMpOworCW1lbXNldChuZWlnaF9ub2RlLCAwLCBzaXplb2Yoc3RydWN0IG5laWdoX25vZGUpKTsKKwlJTklUX0xJU1RfSEVBRCgmbmVpZ2hfbm9kZS0+bGlzdCk7CisKKwltZW1jcHkobmVpZ2hfbm9kZS0+YWRkciwgbmVpZ2gsIEVUSF9BTEVOKTsKKwluZWlnaF9ub2RlLT5vcmlnX25vZGUgPSBvcmlnX25laWdoX25vZGU7CisJbmVpZ2hfbm9kZS0+aWZfaW5jb21pbmcgPSBpZl9pbmNvbWluZzsKKworCWxpc3RfYWRkX3RhaWwoJm5laWdoX25vZGUtPmxpc3QsICZvcmlnX25vZGUtPm5laWdoX2xpc3QpOworCXJldHVybiBuZWlnaF9ub2RlOworfQorCit2b2lkIGZyZWVfb3JpZ19ub2RlKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdF9wb3MsICpsaXN0X3Bvc190bXA7CisJc3RydWN0IG5laWdoX25vZGUgKm5laWdoX25vZGU7CisJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlID0gKHN0cnVjdCBvcmlnX25vZGUgKilkYXRhOworCisJLyogZm9yIGFsbCBuZWlnaGJvdXJzIHRvd2FyZHMgdGhpcyBvcmlnaW5hdG9yIC4uLiAqLworCWxpc3RfZm9yX2VhY2hfc2FmZShsaXN0X3BvcywgbGlzdF9wb3NfdG1wLCAmb3JpZ19ub2RlLT5uZWlnaF9saXN0KSB7CisJCW5laWdoX25vZGUgPSBsaXN0X2VudHJ5KGxpc3RfcG9zLCBzdHJ1Y3QgbmVpZ2hfbm9kZSwgbGlzdCk7CisKKwkJbGlzdF9kZWwobGlzdF9wb3MpOworCQlrZnJlZShuZWlnaF9ub2RlKTsKKwl9CisKKwlobmFfZ2xvYmFsX2RlbF9vcmlnKG9yaWdfbm9kZSwgIm9yaWdpbmF0b3IgdGltZWQgb3V0Iik7CisKKwlrZnJlZShvcmlnX25vZGUtPmJjYXN0X293bik7CisJa2ZyZWUob3JpZ19ub2RlLT5iY2FzdF9vd25fc3VtKTsKKwlrZnJlZShvcmlnX25vZGUpOworfQorCisvKiB0aGlzIGZ1bmN0aW9uIGZpbmRzIG9yIGNyZWF0ZXMgYW4gb3JpZ2luYXRvciBlbnRyeSBmb3IgdGhlIGdpdmVuIGFkZHJlc3MgaWYgaXQgZG9lcyBub3QgZXhpdHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgb3JpZ19ub2RlICpnZXRfb3JpZ19ub2RlKHVpbnQ4X3QgKmFkZHIpCit7CisJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOworCXN0cnVjdCBoYXNodGFibGVfdCAqc3dhcGhhc2g7CisJY2hhciBvcmlnX3N0cltFVEhfU1RSX0xFTl07CisKKwlvcmlnX25vZGUgPSAoKHN0cnVjdCBvcmlnX25vZGUgKiloYXNoX2ZpbmQob3JpZ19oYXNoLCBhZGRyKSk7CisKKwlpZiAob3JpZ19ub2RlICE9IE5VTEwpCisJCXJldHVybiBvcmlnX25vZGU7CisKKwlhZGRyX3RvX3N0cmluZyhvcmlnX3N0ciwgYWRkcik7CisJZGVidWdfbG9nKExPR19UWVBFX0JBVE1BTiwgIkNyZWF0aW5nIG5ldyBvcmlnaW5hdG9yOiAlcyBcbiIsIG9yaWdfc3RyKTsKKworCW9yaWdfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBvcmlnX25vZGUpLCBHRlBfQVRPTUlDKTsKKwltZW1zZXQob3JpZ19ub2RlLCAwLCBzaXplb2Yoc3RydWN0IG9yaWdfbm9kZSkpOworCUlOSVRfTElTVF9IRUFEKCZvcmlnX25vZGUtPm5laWdoX2xpc3QpOworCisJbWVtY3B5KG9yaWdfbm9kZS0+b3JpZywgYWRkciwgRVRIX0FMRU4pOworCW9yaWdfbm9kZS0+cm91dGVyID0gTlVMTDsKKwlvcmlnX25vZGUtPmJhdG1hbl9pZiA9IE5VTEw7CisJb3JpZ19ub2RlLT5obmFfYnVmZiA9IE5VTEw7CisKKwlvcmlnX25vZGUtPmJjYXN0X293biA9IGttYWxsb2MobnVtX2lmcyAqIHNpemVvZihUWVBFX09GX1dPUkQpICogTlVNX1dPUkRTLCBHRlBfQVRPTUlDKTsKKwltZW1zZXQob3JpZ19ub2RlLT5iY2FzdF9vd24sIDAsIG51bV9pZnMgKiBzaXplb2YoVFlQRV9PRl9XT1JEKSAqIE5VTV9XT1JEUyk7CisKKwlvcmlnX25vZGUtPmJjYXN0X293bl9zdW0gPSBrbWFsbG9jKG51bV9pZnMgKiBzaXplb2YodWludDhfdCksIEdGUF9BVE9NSUMpOworCW1lbXNldChvcmlnX25vZGUtPmJjYXN0X293bl9zdW0sIDAsIG51bV9pZnMgKiBzaXplb2YodWludDhfdCkpOworCisJaGFzaF9hZGQob3JpZ19oYXNoLCBvcmlnX25vZGUpOworCisJaWYgKG9yaWdfaGFzaC0+ZWxlbWVudHMgKiA0ID4gb3JpZ19oYXNoLT5zaXplKSB7CisJCXN3YXBoYXNoID0gaGFzaF9yZXNpemUob3JpZ19oYXNoLCBvcmlnX2hhc2gtPnNpemUgKiAyKTsKKworCQlpZiAoc3dhcGhhc2ggPT0gTlVMTCkKKwkJCWRlYnVnX2xvZyhMT0dfVFlQRV9DUklULCAiQ291bGRuJ3QgcmVzaXplIG9yaWcgaGFzaCB0YWJsZSBcbiIpOworCQllbHNlCisJCQlvcmlnX2hhc2ggPSBzd2FwaGFzaDsKKwl9CisKKwlyZXR1cm4gb3JpZ19ub2RlOworfQorCit2b2lkIHNsaWRlX293bl9iY2FzdF93aW5kb3coc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKQoreworCXN0cnVjdCBoYXNoX2l0X3QgKmhhc2hpdCA9IE5VTEw7CisJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOworCisJc3Bpbl9sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisKKwl3aGlsZSAoTlVMTCAhPSAoaGFzaGl0ID0gaGFzaF9pdGVyYXRlKG9yaWdfaGFzaCwgaGFzaGl0KSkpIHsKKwkJb3JpZ19ub2RlID0gaGFzaGl0LT5idWNrZXQtPmRhdGE7CisKKwkJYml0X2dldF9wYWNrZXQoKFRZUEVfT0ZfV09SRCAqKSYob3JpZ19ub2RlLT5iY2FzdF9vd25bYmF0bWFuX2lmLT5pZl9udW0gKiBOVU1fV09SRFNdKSwgMSwgMCk7CisJCW9yaWdfbm9kZS0+YmNhc3Rfb3duX3N1bVtiYXRtYW5faWYtPmlmX251bV0gPSBiaXRfcGFja2V0X2NvdW50KChUWVBFX09GX1dPUkQgKikmKG9yaWdfbm9kZS0+YmNhc3Rfb3duW2JhdG1hbl9pZi0+aWZfbnVtICogTlVNX1dPUkRTXSkpOworCX0KKworCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9yb3V0ZXMoc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLCBzdHJ1Y3QgbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZSwgdW5zaWduZWQgY2hhciAqaG5hX2J1ZmYsIGludCBobmFfYnVmZl9sZW4pCit7CisJY2hhciBvcmlnX3N0cltFVEhfU1RSX0xFTl0sIG5laWdoX3N0cltFVEhfU1RSX0xFTl0sIHJvdXRlcl9zdHJbRVRIX1NUUl9MRU5dOworCisJaWYgKG9yaWdfbm9kZSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAob3JpZ19ub2RlLT5yb3V0ZXIgIT0gbmVpZ2hfbm9kZSkgeworCQlhZGRyX3RvX3N0cmluZyhvcmlnX3N0ciwgb3JpZ19ub2RlLT5vcmlnKTsKKworCQkvKiByb3V0ZSBkZWxldGVkICovCisJCWlmICgob3JpZ19ub2RlLT5yb3V0ZXIgIT0gTlVMTCkgJiYgKG5laWdoX25vZGUgPT0gTlVMTCkpIHsKKworCQkJZGVidWdfbG9nKExPR19UWVBFX1JPVVRFUywgIkRlbGV0aW5nIHJvdXRlIHRvd2FyZHM6ICVzXG4iLCBvcmlnX3N0cik7CisJCQlobmFfZ2xvYmFsX2RlbF9vcmlnKG9yaWdfbm9kZSwgIm9yaWdpbmF0b3IgdGltZWQgb3V0Iik7CisKKwkJLyogcm91dGUgYWRkZWQgKi8KKwkJfSBlbHNlIGlmICgob3JpZ19ub2RlLT5yb3V0ZXIgPT0gTlVMTCkgJiYgKG5laWdoX25vZGUgIT0gTlVMTCkpIHsKKworCQkJYWRkcl90b19zdHJpbmcobmVpZ2hfc3RyLCBuZWlnaF9ub2RlLT5hZGRyKTsKKwkJCWRlYnVnX2xvZyhMT0dfVFlQRV9ST1VURVMsICJBZGRpbmcgcm91dGUgdG93YXJkczogJXMgKHZpYSAlcylcbiIsIG9yaWdfc3RyLCBuZWlnaF9zdHIpOworCQkJaG5hX2dsb2JhbF9hZGRfb3JpZyhvcmlnX25vZGUsIGhuYV9idWZmLCBobmFfYnVmZl9sZW4pOworCisJCS8qIHJvdXRlIGNoYW5nZWQgKi8KKwkJfSBlbHNlIHsKKworCQkJYWRkcl90b19zdHJpbmcobmVpZ2hfc3RyLCBuZWlnaF9ub2RlLT5hZGRyKTsKKwkJCWFkZHJfdG9fc3RyaW5nKHJvdXRlcl9zdHIsIG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyKTsKKwkJCWRlYnVnX2xvZyhMT0dfVFlQRV9ST1VURVMsICJDaGFuZ2luZyByb3V0ZSB0b3dhcmRzOiAlcyAobm93IHZpYSAlcyAtIHdhcyB2aWEgJXMpXG4iLCBvcmlnX3N0ciwgbmVpZ2hfc3RyLCByb3V0ZXJfc3RyKTsKKworCQl9CisKKwkJaWYgKG5laWdoX25vZGUgIT0gTlVMTCkKKwkJCW9yaWdfbm9kZS0+YmF0bWFuX2lmID0gbmVpZ2hfbm9kZS0+aWZfaW5jb21pbmc7CisJCWVsc2UKKwkJCW9yaWdfbm9kZS0+YmF0bWFuX2lmID0gTlVMTDsKKworCQlvcmlnX25vZGUtPnJvdXRlciA9IG5laWdoX25vZGU7CisKKwkvKiBtYXkgYmUganVzdCBITkEgY2hhbmdlZCAqLworCX0gZWxzZSB7CisKKwkJaWYgKChobmFfYnVmZl9sZW4gIT0gb3JpZ19ub2RlLT5obmFfYnVmZl9sZW4pIHx8ICgoaG5hX2J1ZmZfbGVuID4gMCkgJiYgKG9yaWdfbm9kZS0+aG5hX2J1ZmZfbGVuID4gMCkgJiYgKG1lbWNtcChvcmlnX25vZGUtPmhuYV9idWZmLCBobmFfYnVmZiwgaG5hX2J1ZmZfbGVuKSAhPSAwKSkpIHsKKworCQkJaWYgKG9yaWdfbm9kZS0+aG5hX2J1ZmZfbGVuID4gMCkKKwkJCQlobmFfZ2xvYmFsX2RlbF9vcmlnKG9yaWdfbm9kZSwgIm9yaWdpbmF0b3IgY2hhbmdlZCBobmEiKTsKKworCQkJaWYgKChobmFfYnVmZl9sZW4gPiAwKSAmJiAoaG5hX2J1ZmYgIT0gTlVMTCkpCisJCQkJaG5hX2dsb2JhbF9hZGRfb3JpZyhvcmlnX25vZGUsIGhuYV9idWZmLCBobmFfYnVmZl9sZW4pOworCisJCX0KKworCX0KK30KKworc3RhdGljIGludCBpc0JpZGlyZWN0aW9uYWxOZWlnaChzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbmVpZ2hfbm9kZSwgc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQsIHN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nKQoreworCXN0cnVjdCBuZWlnaF9ub2RlICpuZWlnaF9ub2RlID0gTlVMTCwgKnRtcF9uZWlnaF9ub2RlID0gTlVMTDsKKwljaGFyIG9yaWdfc3RyW0VUSF9TVFJfTEVOXSwgbmVpZ2hfc3RyW0VUSF9TVFJfTEVOXTsKKwl1bnNpZ25lZCBjaGFyIHRvdGFsX2NvdW50OworCisJYWRkcl90b19zdHJpbmcob3JpZ19zdHIsIG9yaWdfbm9kZS0+b3JpZyk7CisJYWRkcl90b19zdHJpbmcobmVpZ2hfc3RyLCBvcmlnX25laWdoX25vZGUtPm9yaWcpOworCisJaWYgKG9yaWdfbm9kZSA9PSBvcmlnX25laWdoX25vZGUpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXBfbmVpZ2hfbm9kZSwgJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdCwgbGlzdCkgeworCisJCQlpZiAoY29tcGFyZV9vcmlnKHRtcF9uZWlnaF9ub2RlLT5hZGRyLCBvcmlnX25laWdoX25vZGUtPm9yaWcpICYmICh0bXBfbmVpZ2hfbm9kZS0+aWZfaW5jb21pbmcgPT0gaWZfaW5jb21pbmcpKQorCQkJCW5laWdoX25vZGUgPSB0bXBfbmVpZ2hfbm9kZTsKKwkJfQorCisJCWlmIChuZWlnaF9ub2RlID09IE5VTEwpCisJCQluZWlnaF9ub2RlID0gY3JlYXRlX25laWdoYm9yKG9yaWdfbm9kZSwgb3JpZ19uZWlnaF9ub2RlLCBvcmlnX25laWdoX25vZGUtPm9yaWcsIGlmX2luY29taW5nKTsKKworCQluZWlnaF9ub2RlLT5sYXN0X3ZhbGlkID0gamlmZmllczsKKwl9IGVsc2UgeworCQkvKiBmaW5kIHBhY2tldCBjb3VudCBvZiBjb3JyZXNwb25kaW5nIG9uZSBob3AgbmVpZ2hib3IgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXBfbmVpZ2hfbm9kZSwgJm9yaWdfbmVpZ2hfbm9kZS0+bmVpZ2hfbGlzdCwgbGlzdCkgeworCisJCQlpZiAoY29tcGFyZV9vcmlnKHRtcF9uZWlnaF9ub2RlLT5hZGRyLCBvcmlnX25laWdoX25vZGUtPm9yaWcpICYmICh0bXBfbmVpZ2hfbm9kZS0+aWZfaW5jb21pbmcgPT0gaWZfaW5jb21pbmcpKQorCQkJCW5laWdoX25vZGUgPSB0bXBfbmVpZ2hfbm9kZTsKKwkJfQorCisJCWlmIChuZWlnaF9ub2RlID09IE5VTEwpCisJCQluZWlnaF9ub2RlID0gY3JlYXRlX25laWdoYm9yKG9yaWdfbmVpZ2hfbm9kZSwgb3JpZ19uZWlnaF9ub2RlLCBvcmlnX25laWdoX25vZGUtPm9yaWcsIGlmX2luY29taW5nKTsKKwl9CisKKwlvcmlnX25vZGUtPmxhc3RfdmFsaWQgPSBqaWZmaWVzOworCisJLyogcGF5IGF0dGVudGlvbiB0byBub3QgZ2V0IGEgdmFsdWUgYmlnZ2VyIHRoYW4gMTAwICUgKi8KKwl0b3RhbF9jb3VudCA9IChvcmlnX25laWdoX25vZGUtPmJjYXN0X293bl9zdW1baWZfaW5jb21pbmctPmlmX251bV0gPiBuZWlnaF9ub2RlLT5yZWFsX3BhY2tldF9jb3VudCA/IG5laWdoX25vZGUtPnJlYWxfcGFja2V0X2NvdW50IDogb3JpZ19uZWlnaF9ub2RlLT5iY2FzdF9vd25fc3VtW2lmX2luY29taW5nLT5pZl9udW1dKTsKKworCS8qIGlmIHdlIGhhdmUgdG9vIGZldyBwYWNrZXRzICh0b28gbGVzcyBkYXRhKSB3ZSBzZXQgdHFfb3duIHRvIHplcm8gKi8KKwkvKiBpZiB3ZSByZWNlaXZlIHRvbyBmZXcgcGFja2V0cyBpdCBpcyBub3QgY29uc2lkZXJlZCBiaWRpcmVjdGlvbmFsICovCisJaWYgKCh0b3RhbF9jb3VudCA8IFRRX0xPQ0FMX0JJRFJFQ1RfU0VORF9NSU5JTVVNKSB8fCAobmVpZ2hfbm9kZS0+cmVhbF9wYWNrZXRfY291bnQgPCBUUV9MT0NBTF9CSURSRUNUX1JFQ1ZfTUlOSU1VTSkpCisJCW9yaWdfbmVpZ2hfbm9kZS0+dHFfb3duID0gMDsKKwllbHNlCisJCS8qIG5laWdoX25vZGUtPnJlYWxfcGFja2V0X2NvdW50IGlzIG5ldmVyIHplcm8gYXMgd2Ugb25seSBwdXJnZSBvbGQgaW5mb3JtYXRpb24gd2hlbiBnZXR0aW5nIG5ldyBpbmZvcm1hdGlvbiAqLworCQlvcmlnX25laWdoX25vZGUtPnRxX293biA9IChUUV9NQVhfVkFMVUUgKiB0b3RhbF9jb3VudCkgLyBuZWlnaF9ub2RlLT5yZWFsX3BhY2tldF9jb3VudDsKKworCS8qCisJICogMSAtICgoMS14KSAqKiAzKSwgbm9ybWFsaXplZCB0byBUUV9NQVhfVkFMVUUKKwkgKiB0aGlzIGRvZXMgYWZmZWN0IHRoZSBuZWFybHktc3ltbWV0cmljIGxpbmtzIG9ubHkgYSBsaXR0bGUsCisJICogYnV0IHB1bmlzaGVzIGFzeW1tZXRyaWMgbGlua3MgbW9yZS4KKwkgKiB0aGlzIHdpbGwgZ2l2ZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgVFFfTUFYX1ZBTFVFCisJICovCisJb3JpZ19uZWlnaF9ub2RlLT50cV9hc3ltX3BlbmFsdHkgPSBUUV9NQVhfVkFMVUUgLSAoVFFfTUFYX1ZBTFVFICoKKwkJCShUUV9MT0NBTF9XSU5ET1dfU0laRSAtIG5laWdoX25vZGUtPnJlYWxfcGFja2V0X2NvdW50KSAqCisJCQkoVFFfTE9DQUxfV0lORE9XX1NJWkUgLSBuZWlnaF9ub2RlLT5yZWFsX3BhY2tldF9jb3VudCkgKgorCQkJKFRRX0xPQ0FMX1dJTkRPV19TSVpFIC0gbmVpZ2hfbm9kZS0+cmVhbF9wYWNrZXRfY291bnQpKSAvCisJCQkoVFFfTE9DQUxfV0lORE9XX1NJWkUgKiBUUV9MT0NBTF9XSU5ET1dfU0laRSAqIFRRX0xPQ0FMX1dJTkRPV19TSVpFKTsKKworCWJhdG1hbl9wYWNrZXQtPnRxID0gKChiYXRtYW5fcGFja2V0LT50cSAqIG9yaWdfbmVpZ2hfbm9kZS0+dHFfb3duICogb3JpZ19uZWlnaF9ub2RlLT50cV9hc3ltX3BlbmFsdHkpIC8gKFRRX01BWF9WQUxVRSAqICBUUV9NQVhfVkFMVUUpKTsKKworCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJiaWRpcmVjdGlvbmFsOiBvcmlnID0gJS0xNXMgbmVpZ2ggPSAlLTE1cyA9PiBvd25fYmNhc3QgPSAlMmksIHJlYWwgcmVjdiA9ICUyaSwgbG9jYWwgdHE6ICUzaSwgYXN5bV9wZW5hbHR5OiAlM2ksIHRvdGFsIHRxOiAlM2kgXG4iLAorCQkgIG9yaWdfc3RyLCBuZWlnaF9zdHIsIHRvdGFsX2NvdW50LCBuZWlnaF9ub2RlLT5yZWFsX3BhY2tldF9jb3VudCwgb3JpZ19uZWlnaF9ub2RlLT50cV9vd24sIG9yaWdfbmVpZ2hfbm9kZS0+dHFfYXN5bV9wZW5hbHR5LCBiYXRtYW5fcGFja2V0LT50cSk7CisKKwkvKiBpZiBsaW5rIGhhcyB0aGUgbWluaW11bSByZXF1aXJlZCB0cmFuc21pc3Npb24gcXVhbGl0eSBjb25zaWRlciBpdCBiaWRpcmVjdGlvbmFsICovCisJaWYgKGJhdG1hbl9wYWNrZXQtPnRxID49IFRRX1RPVEFMX0JJRFJFQ1RfTElNSVQpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9vcmlnKHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwgc3RydWN0IGV0aGhkciAqZXRoaGRyLCBzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCwgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcsIHVuc2lnbmVkIGNoYXIgKmhuYV9idWZmLCBpbnQgaG5hX2J1ZmZfbGVuLCBjaGFyIGlzX2R1cGxpY2F0ZSkKK3sKKwlzdHJ1Y3QgbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZSA9IE5VTEwsICp0bXBfbmVpZ2hfbm9kZSA9IE5VTEw7CisJaW50IHRtcF9obmFfYnVmZl9sZW47CisKKwlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAidXBkYXRlX29yaWdpbmF0b3IoKTogU2VhcmNoaW5nIGFuZCB1cGRhdGluZyBvcmlnaW5hdG9yIGVudHJ5IG9mIHJlY2VpdmVkIHBhY2tldCBcbiIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXBfbmVpZ2hfbm9kZSwgJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdCwgbGlzdCkgeworCQlpZiAoY29tcGFyZV9vcmlnKHRtcF9uZWlnaF9ub2RlLT5hZGRyLCBldGhoZHItPmhfc291cmNlKSAmJiAodG1wX25laWdoX25vZGUtPmlmX2luY29taW5nID09IGlmX2luY29taW5nKSkgeworCQkJbmVpZ2hfbm9kZSA9IHRtcF9uZWlnaF9ub2RlOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoaXNfZHVwbGljYXRlKQorCQkJY29udGludWU7CisKKwkJcmluZ19idWZmZXJfc2V0KHRtcF9uZWlnaF9ub2RlLT50cV9yZWN2LCAmdG1wX25laWdoX25vZGUtPnRxX2luZGV4LCAwKTsKKwkJdG1wX25laWdoX25vZGUtPnRxX2F2ZyA9IHJpbmdfYnVmZmVyX2F2Zyh0bXBfbmVpZ2hfbm9kZS0+dHFfcmVjdik7CisJfQorCisJaWYgKG5laWdoX25vZGUgPT0gTlVMTCkKKwkJbmVpZ2hfbm9kZSA9IGNyZWF0ZV9uZWlnaGJvcihvcmlnX25vZGUsIGdldF9vcmlnX25vZGUoZXRoaGRyLT5oX3NvdXJjZSksIGV0aGhkci0+aF9zb3VyY2UsIGlmX2luY29taW5nKTsKKwllbHNlCisJCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJVcGRhdGluZyBleGlzdGluZyBsYXN0LWhvcCBuZWlnaGJvdXIgb2Ygb3JpZ2luYXRvclxuIik7CisKKwlvcmlnX25vZGUtPmZsYWdzID0gYmF0bWFuX3BhY2tldC0+ZmxhZ3M7CisJbmVpZ2hfbm9kZS0+bGFzdF92YWxpZCA9IGppZmZpZXM7CisKKwlyaW5nX2J1ZmZlcl9zZXQobmVpZ2hfbm9kZS0+dHFfcmVjdiwgJm5laWdoX25vZGUtPnRxX2luZGV4LCBiYXRtYW5fcGFja2V0LT50cSk7CisJbmVpZ2hfbm9kZS0+dHFfYXZnID0gcmluZ19idWZmZXJfYXZnKG5laWdoX25vZGUtPnRxX3JlY3YpOworCisJaWYgKCFpc19kdXBsaWNhdGUpIHsKKwkJb3JpZ19ub2RlLT5sYXN0X3R0bCA9IGJhdG1hbl9wYWNrZXQtPnR0bDsKKwkJbmVpZ2hfbm9kZS0+bGFzdF90dGwgPSBiYXRtYW5fcGFja2V0LT50dGw7CisJfQorCisJdG1wX2huYV9idWZmX2xlbiA9IChobmFfYnVmZl9sZW4gPiBiYXRtYW5fcGFja2V0LT5udW1faG5hICogRVRIX0FMRU4gPyBiYXRtYW5fcGFja2V0LT5udW1faG5hICogRVRIX0FMRU4gOiBobmFfYnVmZl9sZW4pOworCisJLyogaWYgdGhpcyBuZWlnaGJvciBhbHJlYWR5IGlzIG91ciBuZXh0IGhvcCB0aGVyZSBpcyBub3RoaW5nIHRvIGNoYW5nZSAqLworCWlmIChvcmlnX25vZGUtPnJvdXRlciA9PSBuZWlnaF9ub2RlKQorCQlnb3RvIHVwZGF0ZV9obmE7CisKKwkvKiBpZiB0aGlzIG5laWdoYm9yIGRvZXMgbm90IG9mZmVyIGEgYmV0dGVyIFRRIHdlIHdvbid0IGNvbnNpZGVyIGl0ICovCisJaWYgKChvcmlnX25vZGUtPnJvdXRlcikgJiYKKwkgICAgKG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmcgPiBuZWlnaF9ub2RlLT50cV9hdmcpKQorCQlnb3RvIHVwZGF0ZV9obmE7CisKKwkvKiBpZiB0aGUgVFEgaXMgdGhlIHNhbWUgYW5kIHRoZSBsaW5rIG5vdCBtb3JlIHN5bWV0cmljIHdlIHdvbid0IGNvbnNpZGVyIGl0IGVpdGhlciAqLworCWlmICgob3JpZ19ub2RlLT5yb3V0ZXIpICYmCisJICAgICAoKG5laWdoX25vZGUtPnRxX2F2ZyA9PSBvcmlnX25vZGUtPnJvdXRlci0+dHFfYXZnKSAmJgorCSAgICAgKG9yaWdfbm9kZS0+cm91dGVyLT5vcmlnX25vZGUtPmJjYXN0X293bl9zdW1baWZfaW5jb21pbmctPmlmX251bV0gPj0KKwkgICAgICBuZWlnaF9ub2RlLT5vcmlnX25vZGUtPmJjYXN0X293bl9zdW1baWZfaW5jb21pbmctPmlmX251bV0pKSkKKwkJZ290byB1cGRhdGVfaG5hOworCisJdXBkYXRlX3JvdXRlcyhvcmlnX25vZGUsIG5laWdoX25vZGUsIGhuYV9idWZmLCB0bXBfaG5hX2J1ZmZfbGVuKTsKKwlyZXR1cm47CisKK3VwZGF0ZV9obmE6CisJdXBkYXRlX3JvdXRlcyhvcmlnX25vZGUsIG9yaWdfbm9kZS0+cm91dGVyLCBobmFfYnVmZiwgdG1wX2huYV9idWZmX2xlbik7CisJcmV0dXJuOworfQorCitzdGF0aWMgY2hhciBjb3VudF9yZWFsX3BhY2tldHMoc3RydWN0IGV0aGhkciAqZXRoaGRyLCBzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCwgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcpCit7CisJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOworCXN0cnVjdCBuZWlnaF9ub2RlICp0bXBfbmVpZ2hfbm9kZTsKKwljaGFyIGlzX2R1cGxpY2F0ZSA9IDA7CisKKworCW9yaWdfbm9kZSA9IGdldF9vcmlnX25vZGUoYmF0bWFuX3BhY2tldC0+b3JpZyk7CisJaWYgKG9yaWdfbm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXBfbmVpZ2hfbm9kZSwgJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdCwgbGlzdCkgeworCisJCWlmICghaXNfZHVwbGljYXRlKQorCQkJaXNfZHVwbGljYXRlID0gZ2V0X2JpdF9zdGF0dXModG1wX25laWdoX25vZGUtPnJlYWxfYml0cywgb3JpZ19ub2RlLT5sYXN0X3JlYWxfc2Vxbm8sIGJhdG1hbl9wYWNrZXQtPnNlcW5vKTsKKworCQlpZiAoY29tcGFyZV9vcmlnKHRtcF9uZWlnaF9ub2RlLT5hZGRyLCBldGhoZHItPmhfc291cmNlKSAmJiAodG1wX25laWdoX25vZGUtPmlmX2luY29taW5nID09IGlmX2luY29taW5nKSkKKwkJCWJpdF9nZXRfcGFja2V0KHRtcF9uZWlnaF9ub2RlLT5yZWFsX2JpdHMsIGJhdG1hbl9wYWNrZXQtPnNlcW5vIC0gb3JpZ19ub2RlLT5sYXN0X3JlYWxfc2Vxbm8sIDEpOworCQllbHNlCisJCQliaXRfZ2V0X3BhY2tldCh0bXBfbmVpZ2hfbm9kZS0+cmVhbF9iaXRzLCBiYXRtYW5fcGFja2V0LT5zZXFubyAtIG9yaWdfbm9kZS0+bGFzdF9yZWFsX3NlcW5vLCAwKTsKKworCQl0bXBfbmVpZ2hfbm9kZS0+cmVhbF9wYWNrZXRfY291bnQgPSBiaXRfcGFja2V0X2NvdW50KHRtcF9uZWlnaF9ub2RlLT5yZWFsX2JpdHMpOworCX0KKworCWlmICghaXNfZHVwbGljYXRlKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJ1cGRhdGluZyBsYXN0X3NlcW5vOiBvbGQgJWQsIG5ldyAlZCBcbiIsIG9yaWdfbm9kZS0+bGFzdF9yZWFsX3NlcW5vLCBiYXRtYW5fcGFja2V0LT5zZXFubyk7CisJCW9yaWdfbm9kZS0+bGFzdF9yZWFsX3NlcW5vID0gYmF0bWFuX3BhY2tldC0+c2Vxbm87CisJfQorCisJcmV0dXJuIGlzX2R1cGxpY2F0ZTsKK30KKwordm9pZCByZWNlaXZlX2JhdF9wYWNrZXQoc3RydWN0IGV0aGhkciAqZXRoaGRyLCBzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCwgdW5zaWduZWQgY2hhciAqaG5hX2J1ZmYsIGludCBobmFfYnVmZl9sZW4sIHN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nKQoreworCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKKwlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25laWdoX25vZGUsICpvcmlnX25vZGU7CisJY2hhciBvcmlnX3N0cltFVEhfU1RSX0xFTl0sIHByZXZfc2VuZGVyX3N0cltFVEhfU1RSX0xFTl0sIG5laWdoX3N0cltFVEhfU1RSX0xFTl07CisJY2hhciBoYXNfZGlyZWN0bGlua19mbGFnOworCWNoYXIgaXNfbXlfYWRkciA9IDAsIGlzX215X29yaWcgPSAwLCBpc19teV9vbGRvcmlnID0gMCwgaXNfYnJvYWRjYXN0ID0gMCwgaXNfYmlkaXJlY3Rpb25hbCwgaXNfc2luZ2xlX2hvcF9uZWlnaCwgaXNfZHVwbGljYXRlOworCXVuc2lnbmVkIHNob3J0IGlmX2luY29taW5nX3NlcW5vOworCisJLyogU2lsZW50bHkgZHJvcCB3aGVuIHRoZSBiYXRtYW4gcGFja2V0IGlzIGFjdHVhbGx5IG5vdCBhIGNvcnJlY3QgcGFja2V0LgorCSAqCisJICogVGhpcyBtaWdodCBoYXBwZW4gaWYgYSBwYWNrZXQgaXMgcGFkZGVkIChlLmcuIEV0aGVybmV0IGhhcyBhCisJICogbWluaW11bSBmcmFtZSBsZW5ndGggb2YgNjQgYnl0ZSkgYW5kIHRoZSBhZ2dyZWdhdGlvbiBpbnRlcnByZXRzCisJICogaXQgYXMgYW4gYWRkaXRpb25hbCBsZW5ndGguCisJICoKKwkgKiBUT0RPOiBBIG1vcmUgc2FuZSBzb2x1dGlvbiB3b3VsZCBiZSB0byBoYXZlIGEgYml0IGluIHRoZSBiYXRtYW5fcGFja2V0CisJICogdG8gZGV0ZWN0IHdoZXRoZXIgdGhlIHBhY2tldCBpcyB0aGUgbGFzdCBwYWNrZXQgaW4gYW4gYWdncmVnYXRpb24uCisJICogSGVyZSB3ZSBleHBlY3QgdGhhdCB0aGUgcGFkZGluZyBpcyBhbHdheXMgemVybyAob3Igbm90IDB4MDEpCisJICovCisJaWYgKGJhdG1hbl9wYWNrZXQtPnBhY2tldF90eXBlICE9IEJBVF9QQUNLRVQpCisJCXJldHVybjsKKworCS8qIGNvdWxkIGJlIGNoYW5nZWQgYnkgc2NoZWR1bGVfb3duX3BhY2tldCgpICovCisJaWZfaW5jb21pbmdfc2Vxbm8gPSBhdG9taWNfcmVhZCgmaWZfaW5jb21pbmctPnNlcW5vKTsKKworCWFkZHJfdG9fc3RyaW5nKG9yaWdfc3RyLCBiYXRtYW5fcGFja2V0LT5vcmlnKTsKKwlhZGRyX3RvX3N0cmluZyhwcmV2X3NlbmRlcl9zdHIsIGJhdG1hbl9wYWNrZXQtPnByZXZfc2VuZGVyKTsKKwlhZGRyX3RvX3N0cmluZyhuZWlnaF9zdHIsIGV0aGhkci0+aF9zb3VyY2UpOworCisJaGFzX2RpcmVjdGxpbmtfZmxhZyA9IChiYXRtYW5fcGFja2V0LT5mbGFncyAmIERJUkVDVExJTksgPyAxIDogMCk7CisKKwlpc19zaW5nbGVfaG9wX25laWdoID0gKGNvbXBhcmVfb3JpZyhldGhoZHItPmhfc291cmNlLCBiYXRtYW5fcGFja2V0LT5vcmlnKSA/IDEgOiAwKTsKKworCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJSZWNlaXZlZCBCQVRNQU4gcGFja2V0IHZpYSBOQjogJXMsIElGOiAlcyBbJXNdIChmcm9tIE9HOiAlcywgdmlhIHByZXYgT0c6ICVzLCBzZXFubyAlZCwgdHEgJWQsIFRUTCAlZCwgViAlZCwgSURGICVkKSBcbiIsIG5laWdoX3N0ciwgaWZfaW5jb21pbmctPmRldiwgaWZfaW5jb21pbmctPmFkZHJfc3RyLCBvcmlnX3N0ciwgcHJldl9zZW5kZXJfc3RyLCBiYXRtYW5fcGFja2V0LT5zZXFubywgYmF0bWFuX3BhY2tldC0+dHEsIGJhdG1hbl9wYWNrZXQtPnR0bCwgYmF0bWFuX3BhY2tldC0+dmVyc2lvbiwgaGFzX2RpcmVjdGxpbmtfZmxhZyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShiYXRtYW5faWYsICZpZl9saXN0LCBsaXN0KSB7CisJCWlmIChiYXRtYW5faWYtPmlmX2FjdGl2ZSAhPSBJRl9BQ1RJVkUpCisJCQljb250aW51ZTsKKworCQlpZiAoY29tcGFyZV9vcmlnKGV0aGhkci0+aF9zb3VyY2UsIGJhdG1hbl9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIpKQorCQkJaXNfbXlfYWRkciA9IDE7CisKKwkJaWYgKGNvbXBhcmVfb3JpZyhiYXRtYW5fcGFja2V0LT5vcmlnLCBiYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyKSkKKwkJCWlzX215X29yaWcgPSAxOworCisJCWlmIChjb21wYXJlX29yaWcoYmF0bWFuX3BhY2tldC0+cHJldl9zZW5kZXIsIGJhdG1hbl9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIpKQorCQkJaXNfbXlfb2xkb3JpZyA9IDE7CisKKwkJaWYgKGNvbXBhcmVfb3JpZyhldGhoZHItPmhfc291cmNlLCBicm9hZGNhc3RBZGRyKSkKKwkJCWlzX2Jyb2FkY2FzdCA9IDE7CisJfQorCisJaWYgKGJhdG1hbl9wYWNrZXQtPnZlcnNpb24gIT0gQ09NUEFUX1ZFUlNJT04pIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX0JBVE1BTiwgIkRyb3AgcGFja2V0OiBpbmNvbXBhdGlibGUgYmF0bWFuIHZlcnNpb24gKCVpKSBcbiIsIGJhdG1hbl9wYWNrZXQtPnZlcnNpb24pOworCQlyZXR1cm47CisJfQorCisJaWYgKGlzX215X2FkZHIpIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX0JBVE1BTiwgIkRyb3AgcGFja2V0OiByZWNlaXZlZCBteSBvd24gYnJvYWRjYXN0IChzZW5kZXI6ICVzKSBcbiIsIG5laWdoX3N0cik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaXNfYnJvYWRjYXN0KSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJEcm9wIHBhY2tldDogaWdub3JpbmcgYWxsIHBhY2tldHMgd2l0aCBicm9hZGNhc3Qgc291cmNlIGFkZHIgKHNlbmRlcjogJXMpIFxuIiwgbmVpZ2hfc3RyKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpc19teV9vcmlnKSB7CisJCW9yaWdfbmVpZ2hfbm9kZSA9IGdldF9vcmlnX25vZGUoZXRoaGRyLT5oX3NvdXJjZSk7CisKKwkJLyogbmVpZ2hib3VyIGhhcyB0byBpbmRpY2F0ZSBkaXJlY3QgbGluayBhbmQgaXQgaGFzIHRvIGNvbWUgdmlhIHRoZSBjb3JyZXNwb25kaW5nIGludGVyZmFjZSAqLworCQkvKiBpZiByZWNlaXZlZCBzZXFubyBlcXVhbHMgbGFzdCBzZW5kIHNlcW5vIHNhdmUgbmV3IHNlcW5vIGZvciBiaWRpcmVjdGlvbmFsIGNoZWNrICovCisJCWlmIChoYXNfZGlyZWN0bGlua19mbGFnICYmIGNvbXBhcmVfb3JpZyhpZl9pbmNvbWluZy0+bmV0X2Rldi0+ZGV2X2FkZHIsIGJhdG1hbl9wYWNrZXQtPm9yaWcpICYmCisJCQkJICAoYmF0bWFuX3BhY2tldC0+c2Vxbm8gLSBpZl9pbmNvbWluZ19zZXFubyArIDIgPT0gMCkpIHsKKwkJCWJpdF9tYXJrKChUWVBFX09GX1dPUkQgKikmKG9yaWdfbmVpZ2hfbm9kZS0+YmNhc3Rfb3duW2lmX2luY29taW5nLT5pZl9udW0gKiBOVU1fV09SRFNdKSwgMCk7CisJCQlvcmlnX25laWdoX25vZGUtPmJjYXN0X293bl9zdW1baWZfaW5jb21pbmctPmlmX251bV0gPSBiaXRfcGFja2V0X2NvdW50KChUWVBFX09GX1dPUkQgKikmKG9yaWdfbmVpZ2hfbm9kZS0+YmNhc3Rfb3duW2lmX2luY29taW5nLT5pZl9udW0gKiBOVU1fV09SRFNdKSk7CisJCX0KKworCQlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAiRHJvcCBwYWNrZXQ6IG9yaWdpbmF0b3IgcGFja2V0IGZyb20gbXlzZWxmICh2aWEgbmVpZ2hib3VyKSBcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGJhdG1hbl9wYWNrZXQtPnRxID09IDApIHsKKwkJY291bnRfcmVhbF9wYWNrZXRzKGV0aGhkciwgYmF0bWFuX3BhY2tldCwgaWZfaW5jb21pbmcpOworCisJCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJEcm9wIHBhY2tldDogb3JpZ2luYXRvciBwYWNrZXQgd2l0aCB0cSBlcXVhbCAwIFxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaXNfbXlfb2xkb3JpZykgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAiRHJvcCBwYWNrZXQ6IGlnbm9yaW5nIGFsbCByZWJyb2FkY2FzdCBlY2hvcyAoc2VuZGVyOiAlcykgXG4iLCBuZWlnaF9zdHIpOworCQlyZXR1cm47CisJfQorCisJaXNfZHVwbGljYXRlID0gY291bnRfcmVhbF9wYWNrZXRzKGV0aGhkciwgYmF0bWFuX3BhY2tldCwgaWZfaW5jb21pbmcpOworCisJb3JpZ19ub2RlID0gZ2V0X29yaWdfbm9kZShiYXRtYW5fcGFja2V0LT5vcmlnKTsKKwlpZiAob3JpZ19ub2RlID09IE5VTEwpCisJCXJldHVybjsKKworCS8qIGF2b2lkIHRlbXBvcmFyeSByb3V0aW5nIGxvb3BzICovCisJaWYgKChvcmlnX25vZGUtPnJvdXRlcikgJiYgKG9yaWdfbm9kZS0+cm91dGVyLT5vcmlnX25vZGUtPnJvdXRlcikgJiYKKwkgICAgKGNvbXBhcmVfb3JpZyhvcmlnX25vZGUtPnJvdXRlci0+YWRkciwgYmF0bWFuX3BhY2tldC0+cHJldl9zZW5kZXIpKSAmJgorCSAgICAhKGNvbXBhcmVfb3JpZyhiYXRtYW5fcGFja2V0LT5vcmlnLCBiYXRtYW5fcGFja2V0LT5wcmV2X3NlbmRlcikpICYmCisJICAgIChjb21wYXJlX29yaWcob3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIsIG9yaWdfbm9kZS0+cm91dGVyLT5vcmlnX25vZGUtPnJvdXRlci0+YWRkcikpKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJEcm9wIHBhY2tldDogaWdub3JpbmcgYWxsIHJlYnJvYWRjYXN0IHBhY2tldHMgdGhhdCBtYXkgbWFrZSBtZSBsb29wIChzZW5kZXI6ICVzKSBcbiIsIG5laWdoX3N0cik7CisJCXJldHVybjsKKwl9CisKKwkvKiBpZiBzZW5kZXIgaXMgYSBkaXJlY3QgbmVpZ2hib3IgdGhlIHNlbmRlciBtYWMgZXF1YWxzIG9yaWdpbmF0b3IgbWFjICovCisJb3JpZ19uZWlnaF9ub2RlID0gKGlzX3NpbmdsZV9ob3BfbmVpZ2ggPyBvcmlnX25vZGUgOiBnZXRfb3JpZ19ub2RlKGV0aGhkci0+aF9zb3VyY2UpKTsKKwlpZiAob3JpZ19uZWlnaF9ub2RlID09IE5VTEwpCisJCXJldHVybjsKKworCS8qIGRyb3AgcGFja2V0IGlmIHNlbmRlciBpcyBub3QgYSBkaXJlY3QgbmVpZ2hib3IgYW5kIGlmIHdlIGRvbid0IHJvdXRlIHRvd2FyZHMgaXQgKi8KKwlpZiAoIWlzX3NpbmdsZV9ob3BfbmVpZ2ggJiYgKG9yaWdfbmVpZ2hfbm9kZS0+cm91dGVyID09IE5VTEwpKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJEcm9wIHBhY2tldDogT0dNIHZpYSB1bmtub3duIG5laWdoYm9yISBcbiIpOworCQlyZXR1cm47CisJfQorCisJaXNfYmlkaXJlY3Rpb25hbCA9IGlzQmlkaXJlY3Rpb25hbE5laWdoKG9yaWdfbm9kZSwgb3JpZ19uZWlnaF9ub2RlLCBiYXRtYW5fcGFja2V0LCBpZl9pbmNvbWluZyk7CisKKwkvKiB1cGRhdGUgcmFua2luZyBpZiBpdCBpcyBub3QgYSBkdXBsaWNhdGUgb3IgaGFzIHRoZSBzYW1lIHNlcW5vIGFuZCBzaW1pbGFyIHR0bCBhcyB0aGUgbm9uLWR1cGxpY2F0ZSAqLworCWlmIChpc19iaWRpcmVjdGlvbmFsICYmICghaXNfZHVwbGljYXRlIHx8CisJCSgob3JpZ19ub2RlLT5sYXN0X3JlYWxfc2Vxbm8gPT0gYmF0bWFuX3BhY2tldC0+c2Vxbm8pICYmCisJCQkob3JpZ19ub2RlLT5sYXN0X3R0bCAtIDMgPD0gYmF0bWFuX3BhY2tldC0+dHRsKSkpKQorCQl1cGRhdGVfb3JpZyhvcmlnX25vZGUsIGV0aGhkciwgYmF0bWFuX3BhY2tldCwgaWZfaW5jb21pbmcsIGhuYV9idWZmLCBobmFfYnVmZl9sZW4sIGlzX2R1cGxpY2F0ZSk7CisKKwkvKiBpcyBzaW5nbGUgaG9wIChkaXJlY3QpIG5laWdoYm91ciAqLworCWlmIChpc19zaW5nbGVfaG9wX25laWdoKSB7CisKKwkJLyogbWFyayBkaXJlY3QgbGluayBvbiBpbmNvbWluZyBpbnRlcmZhY2UgKi8KKwkJc2NoZWR1bGVfZm9yd2FyZF9wYWNrZXQob3JpZ19ub2RlLCBldGhoZHIsIGJhdG1hbl9wYWNrZXQsIDEsIGhuYV9idWZmX2xlbiwgaWZfaW5jb21pbmcpOworCisJCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJGb3J3YXJkaW5nIHBhY2tldDogcmVicm9hZGNhc3QgbmVpZ2hib3VyIHBhY2tldCB3aXRoIGRpcmVjdCBsaW5rIGZsYWcgXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIG11bHRpaG9wIG9yaWdpbmF0b3IgKi8KKwlpZiAoIWlzX2JpZGlyZWN0aW9uYWwpIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX0JBVE1BTiwgIkRyb3AgcGFja2V0OiBub3QgcmVjZWl2ZWQgdmlhIGJpZGlyZWN0aW9uYWwgbGlua1xuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaXNfZHVwbGljYXRlKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJEcm9wIHBhY2tldDogZHVwbGljYXRlIHBhY2tldCByZWNlaXZlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAiRm9yd2FyZGluZyBwYWNrZXQ6IHJlYnJvYWRjYXN0IG9yaWdpbmF0b3IgcGFja2V0IFxuIik7CisJc2NoZWR1bGVfZm9yd2FyZF9wYWNrZXQob3JpZ19ub2RlLCBldGhoZHIsIGJhdG1hbl9wYWNrZXQsIDAsIGhuYV9idWZmX2xlbiwgaWZfaW5jb21pbmcpOworfQorCit2b2lkIHB1cmdlX29yaWcoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3RfcG9zLCAqbGlzdF9wb3NfdG1wOworCXN0cnVjdCBoYXNoX2l0X3QgKmhhc2hpdCA9IE5VTEw7CisJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOworCXN0cnVjdCBuZWlnaF9ub2RlICpuZWlnaF9ub2RlLCAqYmVzdF9uZWlnaF9ub2RlOworCWNoYXIgb3JpZ19zdHJbRVRIX1NUUl9MRU5dLCBuZWlnaF9zdHJbRVRIX1NUUl9MRU5dLCBuZWlnaF9wdXJnZWQ7CisKKwlzcGluX2xvY2soJm9yaWdfaGFzaF9sb2NrKTsKKworCS8qIGZvciBhbGwgb3JpZ2lucy4uLiAqLworCXdoaWxlIChOVUxMICE9IChoYXNoaXQgPSBoYXNoX2l0ZXJhdGUob3JpZ19oYXNoLCBoYXNoaXQpKSkgeworCisJCW9yaWdfbm9kZSA9IGhhc2hpdC0+YnVja2V0LT5kYXRhOworCQlhZGRyX3RvX3N0cmluZyhvcmlnX3N0ciwgb3JpZ19ub2RlLT5vcmlnKTsKKworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBvcmlnX25vZGUtPmxhc3RfdmFsaWQgKyAoKDIgKiBQVVJHRV9USU1FT1VUICogSFopIC8gMTAwMCkpKSB7CisKKwkJCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJPcmlnaW5hdG9yIHRpbWVvdXQ6IG9yaWdpbmF0b3IgJXMsIGxhc3RfdmFsaWQgJXUgXG4iLCBvcmlnX3N0ciwgKG9yaWdfbm9kZS0+bGFzdF92YWxpZCAvIEhaKSk7CisKKwkJCWhhc2hfcmVtb3ZlX2J1Y2tldChvcmlnX2hhc2gsIGhhc2hpdCk7CisJCQlmcmVlX29yaWdfbm9kZShvcmlnX25vZGUpOworCisJCX0gZWxzZSB7CisKKwkJCWJlc3RfbmVpZ2hfbm9kZSA9IE5VTEw7CisJCQluZWlnaF9wdXJnZWQgPSAwOworCisJCQkvKiBmb3IgYWxsIG5laWdoYm91cnMgdG93YXJkcyB0aGlzIG9yaWdpbmF0b3IgLi4uICovCisJCQlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdF9wb3MsIGxpc3RfcG9zX3RtcCwgJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdCkgeworCQkJCW5laWdoX25vZGUgPSBsaXN0X2VudHJ5KGxpc3RfcG9zLCBzdHJ1Y3QgbmVpZ2hfbm9kZSwgbGlzdCk7CisKKwkJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBuZWlnaF9ub2RlLT5sYXN0X3ZhbGlkICsgKChQVVJHRV9USU1FT1VUICogSFopIC8gMTAwMCkpKSB7CisKKwkJCQkJYWRkcl90b19zdHJpbmcobmVpZ2hfc3RyLCBuZWlnaF9ub2RlLT5hZGRyKTsKKwkJCQkJZGVidWdfbG9nKExPR19UWVBFX0JBVE1BTiwgIk5laWdoYm91ciB0aW1lb3V0OiBvcmlnaW5hdG9yICVzLCBuZWlnaGJvdXI6ICVzLCBsYXN0X3ZhbGlkICV1IFxuIiwgb3JpZ19zdHIsIG5laWdoX3N0ciwgKG5laWdoX25vZGUtPmxhc3RfdmFsaWQgLyBIWikpOworCisJCQkJCW5laWdoX3B1cmdlZCA9IDE7CisJCQkJCWxpc3RfZGVsKGxpc3RfcG9zKTsKKwkJCQkJa2ZyZWUobmVpZ2hfbm9kZSk7CisKKwkJCQl9IGVsc2UgeworCisJCQkJCWlmICgoYmVzdF9uZWlnaF9ub2RlID09IE5VTEwpIHx8IChuZWlnaF9ub2RlLT50cV9hdmcgPiBiZXN0X25laWdoX25vZGUtPnRxX2F2ZykpCisJCQkJCQliZXN0X25laWdoX25vZGUgPSBuZWlnaF9ub2RlOworCisJCQkJfQorCisJCQl9CisKKwkJCWlmIChuZWlnaF9wdXJnZWQpCisJCQkJdXBkYXRlX3JvdXRlcyhvcmlnX25vZGUsIGJlc3RfbmVpZ2hfbm9kZSwgb3JpZ19ub2RlLT5obmFfYnVmZiwgb3JpZ19ub2RlLT5obmFfYnVmZl9sZW4pOworCisJCX0KKworCX0KKworCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisKKwlzdGFydF9wdXJnZV90aW1lcigpOworfQorCitzdGF0aWMgaW50IHJlY2VpdmVfcmF3X3BhY2tldChzdHJ1Y3Qgc29ja2V0ICpyYXdfc29jaywgdW5zaWduZWQgY2hhciAqcGFja2V0X2J1ZmYsIGludCBwYWNrZXRfYnVmZl9sZW4pCit7CisJc3RydWN0IGt2ZWMgaW92OworCXN0cnVjdCBtc2doZHIgbXNnOworCisJaW92Lmlvdl9iYXNlID0gcGFja2V0X2J1ZmY7CisJaW92Lmlvdl9sZW4gPSBwYWNrZXRfYnVmZl9sZW47CisKKwltc2cubXNnX2ZsYWdzID0gTVNHX0RPTlRXQUlUOwkvKiBub24tYmxvY2tpbmcgKi8KKwltc2cubXNnX25hbWUgPSBOVUxMOworCW1zZy5tc2dfbmFtZWxlbiA9IDA7CisJbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKworCXJldHVybiBrZXJuZWxfcmVjdm1zZyhyYXdfc29jaywgJm1zZywgJmlvdiwgMSwgcGFja2V0X2J1ZmZfbGVuLCBNU0dfRE9OVFdBSVQpOworfQorCitpbnQgcGFja2V0X3JlY3ZfdGhyZWFkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOworCXN0cnVjdCBldGhoZHIgKmV0aGhkcjsKKwlzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldDsKKwlzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQgKnVuaWNhc3RfcGFja2V0OworCXN0cnVjdCBiY2FzdF9wYWNrZXQgKmJjYXN0X3BhY2tldDsKKwlzdHJ1Y3QgaWNtcF9wYWNrZXQgKmljbXBfcGFja2V0OworCXN0cnVjdCB2aXNfcGFja2V0ICp2aXNfcGFja2V0OworCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKKwl1bnNpZ25lZCBjaGFyICpwYWNrZXRfYnVmZiwgc3JjX3N0cltFVEhfU1RSX0xFTl0sIGRzdF9zdHJbRVRIX1NUUl9MRU5dOworCWludCB2aXNfaW5mb19sZW47CisJaW50IHJlc3VsdDsKKworCWF0b21pY19zZXQoJmRhdGFfcmVhZHlfY29uZCwgMCk7CisJYXRvbWljX3NldCgmZXhpdF9jb25kLCAwKTsKKwlwYWNrZXRfYnVmZiA9IGttYWxsb2MoUEFDS0JVRkZfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYWNrZXRfYnVmZikgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfQ1JJVCwgIkNvdWxkIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHBhY2tldCBidWZmZXIuIDooXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXdoaWxlICgoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgJiYgKCFhdG9taWNfcmVhZCgmZXhpdF9jb25kKSkpIHsKKworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUodGhyZWFkX3dhaXQsIChhdG9taWNfcmVhZCgmZGF0YV9yZWFkeV9jb25kKSB8fCBhdG9taWNfcmVhZCgmZXhpdF9jb25kKSkpOworCisJCWF0b21pY19zZXQoJmRhdGFfcmVhZHlfY29uZCwgMCk7CisKKwkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSB8fCBhdG9taWNfcmVhZCgmZXhpdF9jb25kKSkKKwkJCWJyZWFrOworCisJCS8qIHdlIG9ubHkgd2FudCB0byBzYWZlbHkgdHJhdmVyc2UgdGhlIGxpc3QsIGhhcmQtaW50ZXJmYWNlcworCQkgKiB3b24ndCBiZSBkZWxldGVkIGFueXdheSBhcyBsb25nIGFzIHRoaXMgdGhyZWFkIHJ1bnMuICovCisKKwkJcmN1X3JlYWRfbG9jaygpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShiYXRtYW5faWYsICZpZl9saXN0LCBsaXN0KSB7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKKworCQkJcmVzdWx0ID0gLTE7CisKKwkJCXdoaWxlICgxKSB7CisJCQkJaWYgKGJhdG1hbl9pZi0+aWZfYWN0aXZlICE9IElGX0FDVElWRSkgeworCQkJCQlpZiAoYmF0bWFuX2lmLT5pZl9hY3RpdmUgIT0gSUZfVE9fQkVfQUNUSVZBVEVEKQorCQkJCQkJZGVidWdfbG9nKExPR19UWVBFX05PVElDRSwKKwkJCQkJCSAgICAgICAgICAiQ291bGQgbm90IHJlYWQgZnJvbSBkZWFjdGl2YXRlZCBpbnRlcmZhY2UgJXMhXG4iLAorCQkJCQkJICAgICAgICAgIGJhdG1hbl9pZi0+ZGV2KTsKKworCQkJCQlpZiAoYmF0bWFuX2lmLT5yYXdfc29jaykKKwkJCQkJCXJlY2VpdmVfcmF3X3BhY2tldChiYXRtYW5faWYtPnJhd19zb2NrLCBwYWNrZXRfYnVmZiwgUEFDS0JVRkZfU0laRSk7CisJCQkJCXJlc3VsdCA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCXJlc3VsdCA9IHJlY2VpdmVfcmF3X3BhY2tldChiYXRtYW5faWYtPnJhd19zb2NrLCBwYWNrZXRfYnVmZiwgUEFDS0JVRkZfU0laRSk7CisJCQkJaWYgKHJlc3VsdCA8PSAwKQorCQkJCQlicmVhazsKKworCQkJCWlmIChyZXN1bHQgPCBzaXplb2Yoc3RydWN0IGV0aGhkcikgKyAyKQorCQkJCQljb250aW51ZTsKKworCQkJCWV0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopcGFja2V0X2J1ZmY7CisJCQkJYmF0bWFuX3BhY2tldCA9IChzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKShwYWNrZXRfYnVmZiArIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7CisKKwkJCQlpZiAoYmF0bWFuX3BhY2tldC0+dmVyc2lvbiAhPSBDT01QQVRfVkVSU0lPTikgeworCQkJCQlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAiRHJvcCBwYWNrZXQ6IGluY29tcGF0aWJsZSBiYXRtYW4gdmVyc2lvbiAoJWkpIFxuIiwgYmF0bWFuX3BhY2tldC0+dmVyc2lvbik7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCXN3aXRjaCAoYmF0bWFuX3BhY2tldC0+cGFja2V0X3R5cGUpIHsKKwkJCQkvKiBiYXRtYW4gb3JpZ2luYXRvciBwYWNrZXQgKi8KKwkJCQljYXNlIEJBVF9QQUNLRVQ6CisJCQkJCS8qIHBhY2tldCB3aXRoIGJyb2FkY2FzdCBpbmRpY2F0aW9uIGJ1dCB1bmljYXN0IHJlY2lwaWVudCAqLworCQkJCQlpZiAoIWlzX2JjYXN0KGV0aGhkci0+aF9kZXN0KSkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8qIHBhY2tldCB3aXRoIGJyb2FkY2FzdCBzZW5kZXIgYWRkcmVzcyAqLworCQkJCQlpZiAoaXNfYmNhc3QoZXRoaGRyLT5oX3NvdXJjZSkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvKiBkcm9wIHBhY2tldCBpZiBpdCBoYXMgbm90IGF0IGxlYXN0IG9uZSBiYXRtYW4gcGFja2V0IGFzIHBheWxvYWQgKi8KKwkJCQkJaWYgKHJlc3VsdCA8IHNpemVvZihzdHJ1Y3QgZXRoaGRyKSArIHNpemVvZihzdHJ1Y3QgYmF0bWFuX3BhY2tldCkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQlzcGluX2xvY2soJm9yaWdfaGFzaF9sb2NrKTsKKwkJCQkJcmVjZWl2ZV9hZ2dyX2JhdF9wYWNrZXQoZXRoaGRyLAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXRfYnVmZiArIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSwKKwkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC0gc2l6ZW9mKHN0cnVjdCBldGhoZHIpLAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBiYXRtYW5faWYpOworCQkJCQlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworCisJCQkJCWJyZWFrOworCisJCQkJLyogYmF0bWFuIGljbXAgcGFja2V0ICovCisJCQkJY2FzZSBCQVRfSUNNUDoKKwkJCQkJLyogcGFja2V0IHdpdGggdW5pY2FzdCBpbmRpY2F0aW9uIGJ1dCBicm9hZGNhc3QgcmVjaXBpZW50ICovCisJCQkJCWlmIChpc19iY2FzdChldGhoZHItPmhfZGVzdCkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvKiBwYWNrZXQgd2l0aCBicm9hZGNhc3Qgc2VuZGVyIGFkZHJlc3MgKi8KKwkJCQkJaWYgKGlzX2JjYXN0KGV0aGhkci0+aF9zb3VyY2UpKQorCQkJCQkJY29udGludWU7CisKKwkJCQkJLyogbm90IGZvciBtZSAqLworCQkJCQlpZiAoIWlzX215X21hYyhldGhoZHItPmhfZGVzdCkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvKiBkcm9wIHBhY2tldCBpZiBpdCBoYXMgbm90IG5lY2Vzc2FyeSBtaW5pbXVtIHNpemUgKi8KKwkJCQkJaWYgKHJlc3VsdCA8IHNpemVvZihzdHJ1Y3QgZXRoaGRyKSArIHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXQpKQorCQkJCQkJY29udGludWU7CisKKwkJCQkJaWNtcF9wYWNrZXQgPSAoc3RydWN0IGljbXBfcGFja2V0ICopKHBhY2tldF9idWZmICsgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKTsKKworCQkJCQkvKiBwYWNrZXQgZm9yIG1lICovCisJCQkJCWlmIChpc19teV9tYWMoaWNtcF9wYWNrZXQtPmRzdCkpIHsKKworCQkJCQkJLyogYWRkIGRhdGEgdG8gZGV2aWNlIHF1ZXVlICovCisJCQkJCQlpZiAoaWNtcF9wYWNrZXQtPm1zZ190eXBlICE9IEVDSE9fUkVRVUVTVCkgeworCQkJCQkJCWJhdF9kZXZpY2VfcmVjZWl2ZV9wYWNrZXQoaWNtcF9wYWNrZXQpOworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCisJCQkJCQkvKiBhbnN3ZXIgZWNobyByZXF1ZXN0IChwaW5nKSAqLworCQkJCQkJLyogZ2V0IHJvdXRpbmcgaW5mb3JtYXRpb24gKi8KKwkJCQkJCXNwaW5fbG9jaygmb3JpZ19oYXNoX2xvY2spOworCQkJCQkJb3JpZ19ub2RlID0gKChzdHJ1Y3Qgb3JpZ19ub2RlICopaGFzaF9maW5kKG9yaWdfaGFzaCwgaWNtcF9wYWNrZXQtPm9yaWcpKTsKKworCQkJCQkJaWYgKChvcmlnX25vZGUgIT0gTlVMTCkgJiYgKG9yaWdfbm9kZS0+YmF0bWFuX2lmICE9IE5VTEwpICYmIChvcmlnX25vZGUtPnJvdXRlciAhPSBOVUxMKSkgeworCisJCQkJCQkJbWVtY3B5KGljbXBfcGFja2V0LT5kc3QsIGljbXBfcGFja2V0LT5vcmlnLCBFVEhfQUxFTik7CisJCQkJCQkJbWVtY3B5KGljbXBfcGFja2V0LT5vcmlnLCBldGhoZHItPmhfZGVzdCwgRVRIX0FMRU4pOworCQkJCQkJCWljbXBfcGFja2V0LT5tc2dfdHlwZSA9IEVDSE9fUkVQTFk7CisJCQkJCQkJaWNtcF9wYWNrZXQtPnR0bCA9IFRUTDsKKworCQkJCQkJCXNlbmRfcmF3X3BhY2tldChwYWNrZXRfYnVmZiArIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSwKKwkJCQkJCQkgICAgICAgICAgICAgICAgcmVzdWx0IC0gc2l6ZW9mKHN0cnVjdCBldGhoZHIpLAorCQkJCQkJCSAgICAgICAgICAgICAgICBvcmlnX25vZGUtPmJhdG1hbl9pZiwKKwkJCQkJCQkgICAgICAgICAgICAgICAgb3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIpOworCisJCQkJCQl9CisKKwkJCQkJCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJCQkJCQljb250aW51ZTsKKworCQkJCQl9CisKKwkJCQkJLyogVFRMIGV4Y2VlZGVkICovCisJCQkJCWlmIChpY21wX3BhY2tldC0+dHRsIDwgMikgeworCisJCQkJCQlhZGRyX3RvX3N0cmluZyhzcmNfc3RyLCBpY21wX3BhY2tldC0+b3JpZyk7CisJCQkJCQlhZGRyX3RvX3N0cmluZyhkc3Rfc3RyLCBpY21wX3BhY2tldC0+ZHN0KTsKKworCQkJCQkJZGVidWdfbG9nKExPR19UWVBFX05PVElDRSwgIkVycm9yIC0gY2FuJ3Qgc2VuZCBwYWNrZXQgZnJvbSAlcyB0byAlczogdHRsIGV4Y2VlZGVkXG4iLCBzcmNfc3RyLCBkc3Rfc3RyKTsKKworCQkJCQkJLyogc2VuZCBUVEwgZXhjZWVkZWQgaWYgcGFja2V0IGlzIGFuIGVjaG8gcmVxdWVzdCAodHJhY2Vyb3V0ZSkgKi8KKwkJCQkJCWlmIChpY21wX3BhY2tldC0+bXNnX3R5cGUgIT0gRUNIT19SRVFVRVNUKQorCQkJCQkJCWNvbnRpbnVlOworCisJCQkJCQkvKiBnZXQgcm91dGluZyBpbmZvcm1hdGlvbiAqLworCQkJCQkJc3Bpbl9sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJCQkJCQlvcmlnX25vZGUgPSAoKHN0cnVjdCBvcmlnX25vZGUgKiloYXNoX2ZpbmQob3JpZ19oYXNoLCBpY21wX3BhY2tldC0+b3JpZykpOworCisJCQkJCQlpZiAoKG9yaWdfbm9kZSAhPSBOVUxMKSAmJiAob3JpZ19ub2RlLT5iYXRtYW5faWYgIT0gTlVMTCkgJiYgKG9yaWdfbm9kZS0+cm91dGVyICE9IE5VTEwpKSB7CisKKwkJCQkJCQltZW1jcHkoaWNtcF9wYWNrZXQtPmRzdCwgaWNtcF9wYWNrZXQtPm9yaWcsIEVUSF9BTEVOKTsKKwkJCQkJCQltZW1jcHkoaWNtcF9wYWNrZXQtPm9yaWcsIGV0aGhkci0+aF9kZXN0LCBFVEhfQUxFTik7CisJCQkJCQkJaWNtcF9wYWNrZXQtPm1zZ190eXBlID0gVFRMX0VYQ0VFREVEOworCQkJCQkJCWljbXBfcGFja2V0LT50dGwgPSBUVEw7CisKKwkJCQkJCQlzZW5kX3Jhd19wYWNrZXQocGFja2V0X2J1ZmYgKyBzaXplb2Yoc3RydWN0IGV0aGhkciksCisJCQkJCQkJICAgICAgICAgICAgICAgIHJlc3VsdCAtIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSwKKwkJCQkJCQkgICAgICAgICAgICAgICAgb3JpZ19ub2RlLT5iYXRtYW5faWYsCisJCQkJCQkJICAgICAgICAgICAgICAgIG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyKTsKKworCQkJCQkJfQorCisJCQkJCQlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworCQkJCQkJY29udGludWU7CisKKwkJCQkJfQorCisJCQkJCS8qIGdldCByb3V0aW5nIGluZm9ybWF0aW9uICovCisJCQkJCXNwaW5fbG9jaygmb3JpZ19oYXNoX2xvY2spOworCQkJCQlvcmlnX25vZGUgPSAoKHN0cnVjdCBvcmlnX25vZGUgKiloYXNoX2ZpbmQob3JpZ19oYXNoLCBpY21wX3BhY2tldC0+ZHN0KSk7CisKKwkJCQkJaWYgKChvcmlnX25vZGUgIT0gTlVMTCkgJiYgKG9yaWdfbm9kZS0+YmF0bWFuX2lmICE9IE5VTEwpICYmIChvcmlnX25vZGUtPnJvdXRlciAhPSBOVUxMKSkgeworCisJCQkJCQkvKiBkZWNyZW1lbnQgdHRsICovCisJCQkJCQlpY21wX3BhY2tldC0+dHRsLS07CisKKwkJCQkJCS8qIHJvdXRlIGl0ICovCisJCQkJCQlzZW5kX3Jhd19wYWNrZXQocGFja2V0X2J1ZmYgKyBzaXplb2Yoc3RydWN0IGV0aGhkciksCisJCQkJCQkgICAgICAgICAgICAgICAgcmVzdWx0IC0gc2l6ZW9mKHN0cnVjdCBldGhoZHIpLAorCQkJCQkJICAgICAgICAgICAgICAgIG9yaWdfbm9kZS0+YmF0bWFuX2lmLAorCQkJCQkJICAgICAgICAgICAgICAgIG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyKTsKKwkJCQkJfQorCisJCQkJCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJCQkJCWJyZWFrOworCisJCQkJLyogdW5pY2FzdCBwYWNrZXQgKi8KKwkJCQljYXNlIEJBVF9VTklDQVNUOgorCQkJCQkvKiBwYWNrZXQgd2l0aCB1bmljYXN0IGluZGljYXRpb24gYnV0IGJyb2FkY2FzdCByZWNpcGllbnQgKi8KKwkJCQkJaWYgKGlzX2JjYXN0KGV0aGhkci0+aF9kZXN0KSkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8qIHBhY2tldCB3aXRoIGJyb2FkY2FzdCBzZW5kZXIgYWRkcmVzcyAqLworCQkJCQlpZiAoaXNfYmNhc3QoZXRoaGRyLT5oX3NvdXJjZSkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvKiBub3QgZm9yIG1lICovCisJCQkJCWlmICghaXNfbXlfbWFjKGV0aGhkci0+aF9kZXN0KSkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8qIGRyb3AgcGFja2V0IGlmIGl0IGhhcyBub3QgbmVjZXNzYXJ5IG1pbmltdW0gc2l6ZSAqLworCQkJCQlpZiAocmVzdWx0IDwgc2l6ZW9mKHN0cnVjdCBldGhoZHIpICsgc2l6ZW9mKHN0cnVjdCB1bmljYXN0X3BhY2tldCkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQl1bmljYXN0X3BhY2tldCA9IChzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQgKikocGFja2V0X2J1ZmYgKyBzaXplb2Yoc3RydWN0IGV0aGhkcikpOworCisJCQkJCS8qIHBhY2tldCBmb3IgbWUgKi8KKwkJCQkJaWYgKGlzX215X21hYyh1bmljYXN0X3BhY2tldC0+ZGVzdCkpIHsKKworCQkJCQkJaW50ZXJmYWNlX3J4KHNvZnRfZGV2aWNlLCBwYWNrZXRfYnVmZiArIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSArIHNpemVvZihzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQpLCByZXN1bHQgLSBzaXplb2Yoc3RydWN0IGV0aGhkcikgLSBzaXplb2Yoc3RydWN0IHVuaWNhc3RfcGFja2V0KSk7CisJCQkJCQljb250aW51ZTsKKworCQkJCQl9CisKKwkJCQkJLyogVFRMIGV4Y2VlZGVkICovCisJCQkJCWlmICh1bmljYXN0X3BhY2tldC0+dHRsIDwgMikgeworCQkJCQkJYWRkcl90b19zdHJpbmcoc3JjX3N0ciwgKChzdHJ1Y3QgZXRoaGRyICopKHVuaWNhc3RfcGFja2V0ICsgMSkpLT5oX3NvdXJjZSk7CisJCQkJCQlhZGRyX3RvX3N0cmluZyhkc3Rfc3RyLCB1bmljYXN0X3BhY2tldC0+ZGVzdCk7CisKKwkJCQkJCWRlYnVnX2xvZyhMT0dfVFlQRV9OT1RJQ0UsICJFcnJvciAtIGNhbid0IHNlbmQgcGFja2V0IGZyb20gJXMgdG8gJXM6IHR0bCBleGNlZWRlZFxuIiwgc3JjX3N0ciwgZHN0X3N0cik7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCisJCQkJCS8qIGdldCByb3V0aW5nIGluZm9ybWF0aW9uICovCisJCQkJCXNwaW5fbG9jaygmb3JpZ19oYXNoX2xvY2spOworCQkJCQlvcmlnX25vZGUgPSAoKHN0cnVjdCBvcmlnX25vZGUgKiloYXNoX2ZpbmQob3JpZ19oYXNoLCB1bmljYXN0X3BhY2tldC0+ZGVzdCkpOworCisJCQkJCWlmICgob3JpZ19ub2RlICE9IE5VTEwpICYmIChvcmlnX25vZGUtPmJhdG1hbl9pZiAhPSBOVUxMKSAmJiAob3JpZ19ub2RlLT5yb3V0ZXIgIT0gTlVMTCkpIHsKKwkJCQkJCS8qIGRlY3JlbWVudCB0dGwgKi8KKwkJCQkJCXVuaWNhc3RfcGFja2V0LT50dGwtLTsKKworCQkJCQkJLyogcm91dGUgaXQgKi8KKwkJCQkJCXNlbmRfcmF3X3BhY2tldChwYWNrZXRfYnVmZiArIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSwKKwkJCQkJCSAgICAgICAgICAgICAgICByZXN1bHQgLSBzaXplb2Yoc3RydWN0IGV0aGhkciksCisJCQkJCQkgICAgICAgICAgICAgICAgb3JpZ19ub2RlLT5iYXRtYW5faWYsCisJCQkJCQkgICAgICAgICAgICAgICAgb3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIpOworCQkJCQl9CisKKwkJCQkJc3Bpbl91bmxvY2soJm9yaWdfaGFzaF9sb2NrKTsKKwkJCQkJYnJlYWs7CisKKwkJCQkvKiBicm9hZGNhc3QgcGFja2V0ICovCisJCQkJY2FzZSBCQVRfQkNBU1Q6CisJCQkJCS8qIHBhY2tldCB3aXRoIGJyb2FkY2FzdCBpbmRpY2F0aW9uIGJ1dCB1bmljYXN0IHJlY2lwaWVudCAqLworCQkJCQlpZiAoIWlzX2JjYXN0KGV0aGhkci0+aF9kZXN0KSkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8qIHBhY2tldCB3aXRoIGJyb2FkY2FzdCBzZW5kZXIgYWRkcmVzcyAqLworCQkJCQlpZiAoaXNfYmNhc3QoZXRoaGRyLT5oX3NvdXJjZSkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvKiBkcm9wIHBhY2tldCBpZiBpdCBoYXMgbm90IG5lY2Vzc2FyeSBtaW5pbXVtIHNpemUgKi8KKwkJCQkJaWYgKHJlc3VsdCA8IHNpemVvZihzdHJ1Y3QgZXRoaGRyKSArIHNpemVvZihzdHJ1Y3QgYmNhc3RfcGFja2V0KSkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8qIGlnbm9yZSBicm9hZGNhc3RzIHNlbnQgYnkgbXlzZWxmICovCisJCQkJCWlmIChpc19teV9tYWMoZXRoaGRyLT5oX3NvdXJjZSkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQliY2FzdF9wYWNrZXQgPSAoc3RydWN0IGJjYXN0X3BhY2tldCAqKShwYWNrZXRfYnVmZiArIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7CisKKwkJCQkJLyogaWdub3JlIGJyb2FkY2FzdHMgb3JpZ2luYXRlZCBieSBteXNlbGYgKi8KKwkJCQkJaWYgKGlzX215X21hYyhiY2FzdF9wYWNrZXQtPm9yaWcpKQorCQkJCQkJY29udGludWU7CisKKwkJCQkJc3Bpbl9sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJCQkJCW9yaWdfbm9kZSA9ICgoc3RydWN0IG9yaWdfbm9kZSAqKWhhc2hfZmluZChvcmlnX2hhc2gsIGJjYXN0X3BhY2tldC0+b3JpZykpOworCisJCQkJCWlmIChvcmlnX25vZGUgPT0gTlVMTCkgeworCQkJCQkJc3Bpbl91bmxvY2soJm9yaWdfaGFzaF9sb2NrKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisKKwkJCQkJLyogY2hlY2sgZmxvb2QgaGlzdG9yeSAqLworCQkJCQlpZiAoZ2V0X2JpdF9zdGF0dXMob3JpZ19ub2RlLT5iY2FzdF9iaXRzLCBvcmlnX25vZGUtPmxhc3RfYmNhc3Rfc2Vxbm8sIG50b2hzKGJjYXN0X3BhY2tldC0+c2Vxbm8pKSkgeworCQkJCQkJc3Bpbl91bmxvY2soJm9yaWdfaGFzaF9sb2NrKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisKKwkJCQkJLyogbWFyayBicm9hZGNhc3QgaW4gZmxvb2QgaGlzdG9yeSAqLworCQkJCQlpZiAoYml0X2dldF9wYWNrZXQob3JpZ19ub2RlLT5iY2FzdF9iaXRzLCBudG9ocyhiY2FzdF9wYWNrZXQtPnNlcW5vKSAtIG9yaWdfbm9kZS0+bGFzdF9iY2FzdF9zZXFubywgMSkpCisJCQkJCQlvcmlnX25vZGUtPmxhc3RfYmNhc3Rfc2Vxbm8gPSBudG9ocyhiY2FzdF9wYWNrZXQtPnNlcW5vKTsKKworCQkJCQlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworCisJCQkJCS8qIGJyb2FkY2FzdCBmb3IgbWUgKi8KKwkJCQkJaW50ZXJmYWNlX3J4KHNvZnRfZGV2aWNlLCBwYWNrZXRfYnVmZiArIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSArIHNpemVvZihzdHJ1Y3QgYmNhc3RfcGFja2V0KSwgcmVzdWx0IC0gc2l6ZW9mKHN0cnVjdCBldGhoZHIpIC0gc2l6ZW9mKHN0cnVjdCBiY2FzdF9wYWNrZXQpKTsKKworCQkJCQkvKiByZWJyb2FkY2FzdCBwYWNrZXQgKi8KKwkJCQkJYWRkX2JjYXN0X3BhY2tldF90b19saXN0KHBhY2tldF9idWZmICsgc2l6ZW9mKHN0cnVjdCBldGhoZHIpLAorCQkJCQkJCQkJcmVzdWx0IC0gc2l6ZW9mKHN0cnVjdCBldGhoZHIpKTsKKworCQkJCQlicmVhazsKKworCQkJCS8qIHZpcyBwYWNrZXQgKi8KKwkJCQljYXNlIEJBVF9WSVM6CisJCQkJCS8qIGRyb3AgaWYgdG9vIHNob3J0LiAqLworCQkJCQlpZiAocmVzdWx0IDwgc2l6ZW9mKHN0cnVjdCBldGhoZHIpICsgc2l6ZW9mKHN0cnVjdCB2aXNfcGFja2V0KSkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8qIG5vdCBmb3IgbWUgKi8KKwkJCQkJaWYgKCFpc19teV9tYWMoZXRoaGRyLT5oX2Rlc3QpKQorCQkJCQkJY29udGludWU7CisKKwkJCQkJdmlzX3BhY2tldCA9IChzdHJ1Y3QgdmlzX3BhY2tldCAqKShwYWNrZXRfYnVmZiArIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7CisJCQkJCXZpc19pbmZvX2xlbiA9IHJlc3VsdCAgLSBzaXplb2Yoc3RydWN0IGV0aGhkcikgLSBzaXplb2Yoc3RydWN0IHZpc19wYWNrZXQpOworCisJCQkJCS8qIGlnbm9yZSBvd24gcGFja2V0cyAqLworCQkJCQlpZiAoaXNfbXlfbWFjKHZpc19wYWNrZXQtPnZpc19vcmlnKSkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCWlmIChpc19teV9tYWModmlzX3BhY2tldC0+c2VuZGVyX29yaWcpKQorCQkJCQkJY29udGludWU7CisKKwkJCQkJc3dpdGNoICh2aXNfcGFja2V0LT52aXNfdHlwZSkgeworCQkJCQljYXNlIFZJU19UWVBFX1NFUlZFUl9TWU5DOgorCQkJCQkJcmVjZWl2ZV9zZXJ2ZXJfc3luY19wYWNrZXQodmlzX3BhY2tldCwgdmlzX2luZm9fbGVuKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgVklTX1RZUEVfQ0xJRU5UX1VQREFURToKKwkJCQkJCXJlY2VpdmVfY2xpZW50X3VwZGF0ZV9wYWNrZXQodmlzX3BhY2tldCwgdmlzX2luZm9fbGVuKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQ6CS8qIGlnbm9yZSB1bmtub3duIHBhY2tldCAqLworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0KKworCQkJaWYgKChyZXN1bHQgPCAwKSAmJiAocmVzdWx0ICE9IC1FQUdBSU4pKQorCQkJCWRlYnVnX2xvZyhMT0dfVFlQRV9DUklULCAiQ291bGQgbm90IHJlY2VpdmUgcGFja2V0IGZyb20gaW50ZXJmYWNlICVzOiAlaVxuIiwgYmF0bWFuX2lmLT5kZXYsIHJlc3VsdCk7CisKKwkJCS8qIGxvY2sgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbiAqLworCQkJcmN1X3JlYWRfbG9jaygpOworCQl9CisJCXJjdV9yZWFkX3VubG9jaygpOworCisJfQorCWtmcmVlKHBhY2tldF9idWZmKTsKKworCS8qIGRvIG5vdCBleGl0IHVudGlsIGt0aHJlYWRfc3RvcCgpIGlzIGFjdHVhbGx5IGNhbGxlZCwgb3RoZXJ3aXNlIGl0IHdpbGwgd2FpdCBmb3IgdXMKKwkgKiBmb3JldmVyLiAqLworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQlzY2hlZHVsZSgpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYmF0bWFuX2RhdGFfcmVhZHkoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuKQoreworCXZvaWQgKCpkYXRhX3JlYWR5KShzdHJ1Y3Qgc29jayAqLCBpbnQpID0gc2stPnNrX3VzZXJfZGF0YTsKKworCWRhdGFfcmVhZHkoc2ssIGxlbik7CisKKwlhdG9taWNfc2V0KCZkYXRhX3JlYWR5X2NvbmQsIDEpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdGhyZWFkX3dhaXQpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yb3V0aW5nLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yb3V0aW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEyM2VhOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3JvdXRpbmcuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgInR5cGVzLmgiCisKK2V4dGVybiB3YWl0X3F1ZXVlX2hlYWRfdCB0aHJlYWRfd2FpdDsKK2V4dGVybiBhdG9taWNfdCBleGl0X2NvbmQ7CisKK2ludCBvcmlnaW5hdG9yX2luaXQodm9pZCk7Cit2b2lkIGZyZWVfb3JpZ19ub2RlKHZvaWQgKmRhdGEpOwordm9pZCBvcmlnaW5hdG9yX2ZyZWUodm9pZCk7Cit2b2lkIHNsaWRlX293bl9iY2FzdF93aW5kb3coc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKTsKK3ZvaWQgYmF0bWFuX2RhdGFfcmVhZHkoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuKTsKK3ZvaWQgcHVyZ2Vfb3JpZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworaW50IHBhY2tldF9yZWN2X3RocmVhZCh2b2lkICpkYXRhKTsKK3ZvaWQgcmVjZWl2ZV9iYXRfcGFja2V0KHN0cnVjdCBldGhoZHIgKmV0aGhkciwgc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQsIHVuc2lnbmVkIGNoYXIgKmhuYV9idWZmLCBpbnQgaG5hX2J1ZmZfbGVuLCBzdHJ1Y3QgYmF0bWFuX2lmICppZl9pbmNvbWluZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zZW5kLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zZW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcyNDc5OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NlbmQuYwpAQCAtMCwwICsxLDQ3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAic2VuZC5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInJvdXRpbmcuaCIKKyNpbmNsdWRlICJ0cmFuc2xhdGlvbi10YWJsZS5oIgorI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJ2aXMuaCIKKyNpbmNsdWRlICJhZ2dyZWdhdGlvbi5oIgorCisjaW5jbHVkZSAiY29tcGF0LmgiCisKKy8qIGFwcGx5IGhvcCBwZW5hbHR5IGZvciBhIG5vcm1hbCBsaW5rICovCitzdGF0aWMgdWludDhfdCBob3BfcGVuYWx0eShjb25zdCB1aW50OF90IHRxKQoreworCXJldHVybiAodHEgKiAoVFFfTUFYX1ZBTFVFIC0gVFFfSE9QX1BFTkFMVFkpKSAvIChUUV9NQVhfVkFMVUUpOworfQorCisvKiB3aGVuIGRvIHdlIHNjaGVkdWxlIG91ciBvd24gcGFja2V0IHRvIGJlIHNlbnQgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIG93bl9zZW5kX3RpbWUodm9pZCkKK3sKKwlyZXR1cm4gamlmZmllcyArCisJCSgoKGF0b21pY19yZWFkKCZvcmlnaW5hdG9yX2ludGVydmFsKSAtIEpJVFRFUiArCisJCSAgIChyYW5kb20zMigpICUgMipKSVRURVIpKSAqIEhaKSAvIDEwMDApOworfQorCisvKiB3aGVuIGRvIHdlIHNjaGVkdWxlIGEgZm9yd2FyZGVkIHBhY2tldCB0byBiZSBzZW50ICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBmb3J3YXJkX3NlbmRfdGltZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc2VuZF90aW1lID0gamlmZmllczsgLyogU3RhcnRpbmcgbm93IHBsdXMuLi4gKi8KKworCWlmIChhdG9taWNfcmVhZCgmYWdncmVnYXRpb25fZW5hYmxlZCkpCisJCXNlbmRfdGltZSArPSAoKChNQVhfQUdHUkVHQVRJT05fTVMgLSAoSklUVEVSLzIpICsKKwkJCQkocmFuZG9tMzIoKSAlIEpJVFRFUikpICogSFopIC8gMTAwMCk7CisJZWxzZQorCQlzZW5kX3RpbWUgKz0gKCgocmFuZG9tMzIoKSAlIChKSVRURVIvMikpICogSFopIC8gMTAwMCk7CisKKwlyZXR1cm4gc2VuZF90aW1lOworfQorCisvKiBzZW5kcyBhIHJhdyBwYWNrZXQuICovCit2b2lkIHNlbmRfcmF3X3BhY2tldCh1bnNpZ25lZCBjaGFyICpwYWNrX2J1ZmYsIGludCBwYWNrX2J1ZmZfbGVuLAorCQkgICAgIHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZiwgdWludDhfdCAqZHN0X2FkZHIpCit7CisJc3RydWN0IGV0aGhkciAqZXRoaGRyOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHJldHZhbDsKKwljaGFyICpkYXRhOworCisJaWYgKGJhdG1hbl9pZi0+aWZfYWN0aXZlICE9IElGX0FDVElWRSkKKwkJcmV0dXJuOworCisJaWYgKCEoYmF0bWFuX2lmLT5uZXRfZGV2LT5mbGFncyAmIElGRl9VUCkpIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX1dBUk4sCisJCSAgICAgICAgICJJbnRlcmZhY2UgJXMgaXMgbm90IHVwIC0gY2FuJ3Qgc2VuZCBwYWNrZXQgdmlhIHRoYXQgaW50ZXJmYWNlIChJRl9UT19CRV9ERUFDVElWQVRFRCB3YXMgaGVyZSkgIVxuIiwKKwkJICAgICAgICAgIGJhdG1hbl9pZi0+ZGV2KTsKKwkJcmV0dXJuOworCX0KKworCXNrYiA9IGRldl9hbGxvY19za2IocGFja19idWZmX2xlbiArIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7CisJaWYgKCFza2IpCisJCXJldHVybjsKKwlkYXRhID0gc2tiX3B1dChza2IsIHBhY2tfYnVmZl9sZW4gKyBzaXplb2Yoc3RydWN0IGV0aGhkcikpOworCisJbWVtY3B5KGRhdGEgKyBzaXplb2Yoc3RydWN0IGV0aGhkciksIHBhY2tfYnVmZiwgcGFja19idWZmX2xlbik7CisKKwlldGhoZHIgPSAoc3RydWN0IGV0aGhkciAqKSBkYXRhOworCW1lbWNweShldGhoZHItPmhfc291cmNlLCBiYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGV0aGhkci0+aF9kZXN0LCBkc3RfYWRkciwgRVRIX0FMRU4pOworCWV0aGhkci0+aF9wcm90byA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfQkFUTUFOKTsKKworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CisJc2tiX3NldF9uZXR3b3JrX2hlYWRlcihza2IsIEVUSF9ITEVOKTsKKwlza2ItPnByaW9yaXR5ID0gVENfUFJJT19DT05UUk9MOworCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0JBVE1BTik7CisJc2tiLT5kZXYgPSBiYXRtYW5faWYtPm5ldF9kZXY7CisKKwkvKiBkZXZfcXVldWVfeG1pdCgpIHJldHVybnMgYSBuZWdhdGl2ZSByZXN1bHQgb24gZXJyb3IuCSBIb3dldmVyIG9uCisJICogY29uZ2VzdGlvbiBhbmQgdHJhZmZpYyBzaGFwaW5nLCBpdCBkcm9wcyBhbmQgcmV0dXJucyBORVRfWE1JVF9EUk9QCisJICogKHdoaWNoIGlzID4gMCkuIFRoaXMgd2lsbCBub3QgYmUgdHJlYXRlZCBhcyBhbiBlcnJvci4gKi8KKwlyZXR2YWwgPSBkZXZfcXVldWVfeG1pdChza2IpOworCWlmIChyZXR2YWwgPCAwKQorCQlkZWJ1Z19sb2coTE9HX1RZUEVfQ1JJVCwKKwkJICAgICAgICAgICJDYW4ndCB3cml0ZSB0byByYXcgc29ja2V0IChJRl9UT19CRV9ERUFDVElWQVRFRCB3YXMgaGVyZSk6ICVpXG4iLAorCQkgICAgICAgICAgcmV0dmFsKTsKK30KKworLyogU2VuZCBhIHBhY2tldCB0byBhIGdpdmVuIGludGVyZmFjZSAqLworc3RhdGljIHZvaWQgc2VuZF9wYWNrZXRfdG9faWYoc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldCwKKwkJCSAgICAgIHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZikKK3sKKwljaGFyICpmd2Rfc3RyOworCXVpbnQ4X3QgcGFja2V0X251bTsKKwlpbnQxNl90IGJ1ZmZfcG9zOworCXN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0OworCWNoYXIgb3JpZ19zdHJbRVRIX1NUUl9MRU5dOworCisJaWYgKGJhdG1hbl9pZi0+aWZfYWN0aXZlICE9IElGX0FDVElWRSkKKwkJcmV0dXJuOworCisJcGFja2V0X251bSA9IGJ1ZmZfcG9zID0gMDsKKwliYXRtYW5fcGFja2V0ID0gKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopCisJCShmb3J3X3BhY2tldC0+cGFja2V0X2J1ZmYpOworCisJLyogYWRqdXN0IGFsbCBmbGFncyBhbmQgbG9nIHBhY2tldHMgKi8KKwl3aGlsZSAoYWdncmVnYXRlZF9wYWNrZXQoYnVmZl9wb3MsCisJCQkJIGZvcndfcGFja2V0LT5wYWNrZXRfbGVuLAorCQkJCSBiYXRtYW5fcGFja2V0LT5udW1faG5hKSkgeworCisJCS8qIHdlIG1pZ2h0IGhhdmUgYWdncmVnYXRlZCBkaXJlY3QgbGluayBwYWNrZXRzIHdpdGggYW4KKwkJICogb3JkaW5hcnkgYmFzZSBwYWNrZXQgKi8KKwkJaWYgKChmb3J3X3BhY2tldC0+ZGlyZWN0X2xpbmtfZmxhZ3MgJiAoMSA8PCBwYWNrZXRfbnVtKSkgJiYKKwkJICAgIChmb3J3X3BhY2tldC0+aWZfaW5jb21pbmcgPT0gYmF0bWFuX2lmKSkKKwkJCWJhdG1hbl9wYWNrZXQtPmZsYWdzIHw9IERJUkVDVExJTks7CisJCWVsc2UKKwkJCWJhdG1hbl9wYWNrZXQtPmZsYWdzICY9IH5ESVJFQ1RMSU5LOworCisJCWFkZHJfdG9fc3RyaW5nKG9yaWdfc3RyLCBiYXRtYW5fcGFja2V0LT5vcmlnKTsKKwkJZndkX3N0ciA9IChwYWNrZXRfbnVtID4gMCA/ICJGb3J3YXJkaW5nIiA6IChmb3J3X3BhY2tldC0+b3duID8KKwkJCQkJCQkgICAgIlNlbmRpbmcgb3duIiA6CisJCQkJCQkJICAgICJGb3J3YXJkaW5nIikpOworCQlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLAorCQkJICAiJXMgJXNwYWNrZXQgKG9yaWdpbmF0b3IgJXMsIHNlcW5vICVkLCBUUSAlZCwgVFRMICVkLCBJREYgJXMpIG9uIGludGVyZmFjZSAlcyBbJXNdXG4iLAorCQkJICBmd2Rfc3RyLAorCQkJICAocGFja2V0X251bSA+IDAgPyAiYWdncmVnYXRlZCAiIDogIiIpLAorCQkJICBvcmlnX3N0ciwgbnRvaHMoYmF0bWFuX3BhY2tldC0+c2Vxbm8pLAorCQkJICBiYXRtYW5fcGFja2V0LT50cSwgYmF0bWFuX3BhY2tldC0+dHRsLAorCQkJICAoYmF0bWFuX3BhY2tldC0+ZmxhZ3MgJiBESVJFQ1RMSU5LID8KKwkJCSAgICJvbiIgOiAib2ZmIiksCisJCQkgIGJhdG1hbl9pZi0+ZGV2LCBiYXRtYW5faWYtPmFkZHJfc3RyKTsKKworCQlidWZmX3BvcyArPSBzaXplb2Yoc3RydWN0IGJhdG1hbl9wYWNrZXQpICsKKwkJCShiYXRtYW5fcGFja2V0LT5udW1faG5hICogRVRIX0FMRU4pOworCQlwYWNrZXRfbnVtKys7CisJCWJhdG1hbl9wYWNrZXQgPSAoc3RydWN0IGJhdG1hbl9wYWNrZXQgKikKKwkJCShmb3J3X3BhY2tldC0+cGFja2V0X2J1ZmYgKyBidWZmX3Bvcyk7CisJfQorCisJc2VuZF9yYXdfcGFja2V0KGZvcndfcGFja2V0LT5wYWNrZXRfYnVmZiwKKwkJCWZvcndfcGFja2V0LT5wYWNrZXRfbGVuLAorCQkJYmF0bWFuX2lmLCBicm9hZGNhc3RBZGRyKTsKK30KKworLyogc2VuZCBhIGJhdG1hbiBwYWNrZXQgKi8KK3N0YXRpYyB2b2lkIHNlbmRfcGFja2V0KHN0cnVjdCBmb3J3X3BhY2tldCAqZm9yd19wYWNrZXQpCit7CisJc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOworCXN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0ID0KKwkJKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopKGZvcndfcGFja2V0LT5wYWNrZXRfYnVmZik7CisJY2hhciBvcmlnX3N0cltFVEhfU1RSX0xFTl07CisJdW5zaWduZWQgY2hhciBkaXJlY3RsaW5rID0gKGJhdG1hbl9wYWNrZXQtPmZsYWdzICYgRElSRUNUTElOSyA/IDEgOiAwKTsKKworCWlmICghZm9yd19wYWNrZXQtPmlmX2luY29taW5nKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9DUklULAorCQkJICAiRXJyb3IgLSBjYW4ndCBmb3J3YXJkIHBhY2tldDogaW5jb21pbmcgaWZhY2Ugbm90IHNwZWNpZmllZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZm9yd19wYWNrZXQtPmlmX2luY29taW5nLT5pZl9hY3RpdmUgIT0gSUZfQUNUSVZFKQorCQlyZXR1cm47CisKKwlhZGRyX3RvX3N0cmluZyhvcmlnX3N0ciwgYmF0bWFuX3BhY2tldC0+b3JpZyk7CisKKwkvKiBtdWx0aWhvbWVkIHBlZXIgYXNzdW1lZCAqLworCS8qIG5vbi1wcmltYXJ5IE9HTXMgYXJlIG9ubHkgYnJvYWRjYXN0ZWQgb24gdGhlaXIgaW50ZXJmYWNlICovCisJaWYgKChkaXJlY3RsaW5rICYmIChiYXRtYW5fcGFja2V0LT50dGwgPT0gMSkpIHx8CisJICAgIChmb3J3X3BhY2tldC0+b3duICYmIChmb3J3X3BhY2tldC0+aWZfaW5jb21pbmctPmlmX251bSA+IDApKSkgeworCisJCS8qIEZJWE1FOiB3aGF0IGFib3V0IGFnZ3JlZ2F0ZWQgcGFja2V0cyA/ICovCisJCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sCisJCQkgICIlcyBwYWNrZXQgKG9yaWdpbmF0b3IgJXMsIHNlcW5vICVkLCBUVEwgJWQpIG9uIGludGVyZmFjZSAlcyBbJXNdXG4iLAorCQkJICAoZm9yd19wYWNrZXQtPm93biA/ICJTZW5kaW5nIG93biIgOiAiRm9yd2FyZGluZyIpLAorCQkJICBvcmlnX3N0ciwgbnRvaHMoYmF0bWFuX3BhY2tldC0+c2Vxbm8pLAorCQkJICBiYXRtYW5fcGFja2V0LT50dGwsIGZvcndfcGFja2V0LT5pZl9pbmNvbWluZy0+ZGV2LAorCQkJICBmb3J3X3BhY2tldC0+aWZfaW5jb21pbmctPmFkZHJfc3RyKTsKKworCQlzZW5kX3Jhd19wYWNrZXQoZm9yd19wYWNrZXQtPnBhY2tldF9idWZmLAorCQkJCWZvcndfcGFja2V0LT5wYWNrZXRfbGVuLAorCQkJCWZvcndfcGFja2V0LT5pZl9pbmNvbWluZywKKwkJCQlicm9hZGNhc3RBZGRyKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGJyb2FkY2FzdCBvbiBldmVyeSBpbnRlcmZhY2UgKi8KKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoYmF0bWFuX2lmLCAmaWZfbGlzdCwgbGlzdCkKKwkJc2VuZF9wYWNrZXRfdG9faWYoZm9yd19wYWNrZXQsIGJhdG1hbl9pZik7CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlYnVpbGRfYmF0bWFuX3BhY2tldChzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpCit7CisJaW50IG5ld19sZW47CisJdW5zaWduZWQgY2hhciAqbmV3X2J1ZmY7CisJc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQ7CisKKwluZXdfbGVuID0gc2l6ZW9mKHN0cnVjdCBiYXRtYW5fcGFja2V0KSArIChudW1faG5hICogRVRIX0FMRU4pOworCW5ld19idWZmID0ga21hbGxvYyhuZXdfbGVuLCBHRlBfQVRPTUlDKTsKKworCS8qIGtlZXAgb2xkIGJ1ZmZlciBpZiBrbWFsbG9jIHNob3VsZCBmYWlsICovCisJaWYgKG5ld19idWZmKSB7CisJCW1lbWNweShuZXdfYnVmZiwgYmF0bWFuX2lmLT5wYWNrZXRfYnVmZiwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgYmF0bWFuX3BhY2tldCkpOworCQliYXRtYW5fcGFja2V0ID0gKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopbmV3X2J1ZmY7CisKKwkJYmF0bWFuX3BhY2tldC0+bnVtX2huYSA9IGhuYV9sb2NhbF9maWxsX2J1ZmZlcigKKwkJCW5ld19idWZmICsgc2l6ZW9mKHN0cnVjdCBiYXRtYW5fcGFja2V0KSwKKwkJCW5ld19sZW4gLSBzaXplb2Yoc3RydWN0IGJhdG1hbl9wYWNrZXQpKTsKKworCQlrZnJlZShiYXRtYW5faWYtPnBhY2tldF9idWZmKTsKKwkJYmF0bWFuX2lmLT5wYWNrZXRfYnVmZiA9IG5ld19idWZmOworCQliYXRtYW5faWYtPnBhY2tldF9sZW4gPSBuZXdfbGVuOworCX0KK30KKwordm9pZCBzY2hlZHVsZV9vd25fcGFja2V0KHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZikKK3sKKwl1bnNpZ25lZCBsb25nIHNlbmRfdGltZTsKKwlzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldDsKKworCS8qKgorCSAqIHRoZSBpbnRlcmZhY2UgZ2V0cyBhY3RpdmF0ZWQgaGVyZSB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnMgYmV0d2VlbgorCSAqIHRoZSBtb21lbnQgb2YgYWN0aXZhdGluZyB0aGUgaW50ZXJmYWNlIGluCisJICogaGFyZGlmX2FjdGl2YXRlX2ludGVyZmFjZSgpIHdoZXJlIHRoZSBvcmlnaW5hdG9yIG1hYyBpcyBzZXQgYW5kCisJICogb3V0ZGF0ZWQgcGFja2V0cyAoZXNwZWNpYWxseSB1bmluaXRpYWxpemVkIG1hYyBhZGRyZXNzZXMpIGluIHRoZQorCSAqIHBhY2tldCBxdWV1ZQorCSAqLworCWlmIChiYXRtYW5faWYtPmlmX2FjdGl2ZSA9PSBJRl9UT19CRV9BQ1RJVkFURUQpCisJCWJhdG1hbl9pZi0+aWZfYWN0aXZlID0gSUZfQUNUSVZFOworCisJLyogaWYgbG9jYWwgaG5hIGhhcyBjaGFuZ2VkIGFuZCBpbnRlcmZhY2UgaXMgYSBwcmltYXJ5IGludGVyZmFjZSAqLworCWlmICgoYXRvbWljX3JlYWQoJmhuYV9sb2NhbF9jaGFuZ2VkKSkgJiYgKGJhdG1hbl9pZi0+aWZfbnVtID09IDApKQorCQlyZWJ1aWxkX2JhdG1hbl9wYWNrZXQoYmF0bWFuX2lmKTsKKworCS8qKgorCSAqIE5PVEU6IHBhY2tldF9idWZmIG1pZ2h0IGp1c3QgaGF2ZSBiZWVuIHJlLWFsbG9jYXRlZCBpbgorCSAqIHJlYnVpbGRfYmF0bWFuX3BhY2tldCgpCisJICovCisJYmF0bWFuX3BhY2tldCA9IChzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKWJhdG1hbl9pZi0+cGFja2V0X2J1ZmY7CisKKwkvKiBjaGFuZ2Ugc2VxdWVuY2UgbnVtYmVyIHRvIG5ldHdvcmsgb3JkZXIgKi8KKwliYXRtYW5fcGFja2V0LT5zZXFubyA9IGh0b25zKCh1aW50MTZfdClhdG9taWNfcmVhZCgmYmF0bWFuX2lmLT5zZXFubykpOworCisJaWYgKGlzX3Zpc19zZXJ2ZXIoKSkKKwkJYmF0bWFuX3BhY2tldC0+ZmxhZ3MgPSBWSVNfU0VSVkVSOworCWVsc2UKKwkJYmF0bWFuX3BhY2tldC0+ZmxhZ3MgPSAwOworCisJLyogY291bGQgYmUgcmVhZCBieSByZWNlaXZlX2JhdF9wYWNrZXQoKSAqLworCWF0b21pY19pbmMoJmJhdG1hbl9pZi0+c2Vxbm8pOworCisJc2xpZGVfb3duX2JjYXN0X3dpbmRvdyhiYXRtYW5faWYpOworCXNlbmRfdGltZSA9IG93bl9zZW5kX3RpbWUoKTsKKwlhZGRfYmF0X3BhY2tldF90b19saXN0KGJhdG1hbl9pZi0+cGFja2V0X2J1ZmYsCisJCQkgICAgICAgYmF0bWFuX2lmLT5wYWNrZXRfbGVuLCBiYXRtYW5faWYsIDEsIHNlbmRfdGltZSk7Cit9CisKK3ZvaWQgc2NoZWR1bGVfZm9yd2FyZF9wYWNrZXQoc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAorCQkJICAgICBzdHJ1Y3QgZXRoaGRyICpldGhoZHIsCisJCQkgICAgIHN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0LAorCQkJICAgICB1aW50OF90IGRpcmVjdGxpbmssIGludCBobmFfYnVmZl9sZW4sCisJCQkgICAgIHN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nKQoreworCXVuc2lnbmVkIGNoYXIgaW5fdHEsIGluX3R0bCwgdHFfYXZnID0gMDsKKwl1bnNpZ25lZCBsb25nIHNlbmRfdGltZTsKKworCWlmIChiYXRtYW5fcGFja2V0LT50dGwgPD0gMSkgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAidHRsIGV4Y2VlZGVkIFxuIik7CisJCXJldHVybjsKKwl9CisKKwlpbl90cSA9IGJhdG1hbl9wYWNrZXQtPnRxOworCWluX3R0bCA9IGJhdG1hbl9wYWNrZXQtPnR0bDsKKworCWJhdG1hbl9wYWNrZXQtPnR0bC0tOworCW1lbWNweShiYXRtYW5fcGFja2V0LT5wcmV2X3NlbmRlciwgZXRoaGRyLT5oX3NvdXJjZSwgRVRIX0FMRU4pOworCisJLyogcmVicm9hZGNhc3QgdHEgb2Ygb3VyIGJlc3QgcmFua2luZyBuZWlnaGJvciB0byBlbnN1cmUgdGhlIHJlYnJvYWRjYXN0CisJICogb2Ygb3VyIGJlc3QgdHEgdmFsdWUgKi8KKwlpZiAoKG9yaWdfbm9kZS0+cm91dGVyKSAmJiAob3JpZ19ub2RlLT5yb3V0ZXItPnRxX2F2ZyAhPSAwKSkgeworCisJCS8qIHJlYnJvYWRjYXN0IG9nbSBvZiBiZXN0IHJhbmtpbmcgbmVpZ2hib3IgYXMgaXMgKi8KKwkJaWYgKCFjb21wYXJlX29yaWcob3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIsIGV0aGhkci0+aF9zb3VyY2UpKSB7CisJCQliYXRtYW5fcGFja2V0LT50cSA9IG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmc7CisKKwkJCWlmIChvcmlnX25vZGUtPnJvdXRlci0+bGFzdF90dGwpCisJCQkJYmF0bWFuX3BhY2tldC0+dHRsID0gb3JpZ19ub2RlLT5yb3V0ZXItPmxhc3RfdHRsIC0gMTsKKwkJfQorCisJCXRxX2F2ZyA9IG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmc7CisJfQorCisJLyogYXBwbHkgaG9wIHBlbmFsdHkgKi8KKwliYXRtYW5fcGFja2V0LT50cSA9IGhvcF9wZW5hbHR5KGJhdG1hbl9wYWNrZXQtPnRxKTsKKworCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJGb3J3YXJkaW5nIHBhY2tldDogdHFfb3JpZzogJWksIHRxX2F2ZzogJWksIHRxX2Zvcnc6ICVpLCB0dGxfb3JpZzogJWksIHR0bF9mb3J3OiAlaSBcbiIsCisJCSAgaW5fdHEsIHRxX2F2ZywgYmF0bWFuX3BhY2tldC0+dHEsIGluX3R0bCAtIDEsCisJCSAgYmF0bWFuX3BhY2tldC0+dHRsKTsKKworCWJhdG1hbl9wYWNrZXQtPnNlcW5vID0gaHRvbnMoYmF0bWFuX3BhY2tldC0+c2Vxbm8pOworCisJaWYgKGRpcmVjdGxpbmspCisJCWJhdG1hbl9wYWNrZXQtPmZsYWdzIHw9IERJUkVDVExJTks7CisJZWxzZQorCQliYXRtYW5fcGFja2V0LT5mbGFncyAmPSB+RElSRUNUTElOSzsKKworCXNlbmRfdGltZSA9IGZvcndhcmRfc2VuZF90aW1lKCk7CisJYWRkX2JhdF9wYWNrZXRfdG9fbGlzdCgodW5zaWduZWQgY2hhciAqKWJhdG1hbl9wYWNrZXQsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBiYXRtYW5fcGFja2V0KSArIGhuYV9idWZmX2xlbiwKKwkJCSAgICAgICBpZl9pbmNvbWluZywgMCwgc2VuZF90aW1lKTsKK30KKworc3RhdGljIHZvaWQgZm9yd19wYWNrZXRfZnJlZShzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0KQoreworCWtmcmVlKGZvcndfcGFja2V0LT5wYWNrZXRfYnVmZik7CisJa2ZyZWUoZm9yd19wYWNrZXQpOworfQorCitzdGF0aWMgdm9pZCBfYWRkX2JjYXN0X3BhY2tldF90b19saXN0KHN0cnVjdCBmb3J3X3BhY2tldCAqZm9yd19wYWNrZXQsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBzZW5kX3RpbWUpCit7CisJSU5JVF9ITElTVF9OT0RFKCZmb3J3X3BhY2tldC0+bGlzdCk7CisKKwkvKiBhZGQgbmV3IHBhY2tldCB0byBwYWNrZXQgbGlzdCAqLworCXNwaW5fbG9jaygmZm9yd19iY2FzdF9saXN0X2xvY2spOworCWhsaXN0X2FkZF9oZWFkKCZmb3J3X3BhY2tldC0+bGlzdCwgJmZvcndfYmNhc3RfbGlzdCk7CisJc3Bpbl91bmxvY2soJmZvcndfYmNhc3RfbGlzdF9sb2NrKTsKKworCS8qIHN0YXJ0IHRpbWVyIGZvciB0aGlzIHBhY2tldCAqLworCUlOSVRfREVMQVlFRF9XT1JLKCZmb3J3X3BhY2tldC0+ZGVsYXllZF93b3JrLAorCQkJICBzZW5kX291dHN0YW5kaW5nX2JjYXN0X3BhY2tldCk7CisJcXVldWVfZGVsYXllZF93b3JrKGJhdF9ldmVudF93b3JrcXVldWUsICZmb3J3X3BhY2tldC0+ZGVsYXllZF93b3JrLAorCQkJICAgc2VuZF90aW1lKTsKK30KKwordm9pZCBhZGRfYmNhc3RfcGFja2V0X3RvX2xpc3QodW5zaWduZWQgY2hhciAqcGFja2V0X2J1ZmYsIGludCBwYWNrZXRfbGVuKQoreworCXN0cnVjdCBmb3J3X3BhY2tldCAqZm9yd19wYWNrZXQ7CisKKwlmb3J3X3BhY2tldCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmb3J3X3BhY2tldCksIEdGUF9BVE9NSUMpOworCWlmICghZm9yd19wYWNrZXQpCisJCXJldHVybjsKKworCWZvcndfcGFja2V0LT5wYWNrZXRfYnVmZiA9IGttYWxsb2MocGFja2V0X2xlbiwgR0ZQX0FUT01JQyk7CisJaWYgKCFmb3J3X3BhY2tldC0+cGFja2V0X2J1ZmYpCisJCXJldHVybjsKKworCWZvcndfcGFja2V0LT5wYWNrZXRfbGVuID0gcGFja2V0X2xlbjsKKwltZW1jcHkoZm9yd19wYWNrZXQtPnBhY2tldF9idWZmLCBwYWNrZXRfYnVmZiwgZm9yd19wYWNrZXQtPnBhY2tldF9sZW4pOworCisJLyogaG93IG9mdGVuIGRpZCB3ZSBzZW5kIHRoZSBiY2FzdCBwYWNrZXQgPyAqLworCWZvcndfcGFja2V0LT5udW1fcGFja2V0cyA9IDA7CisKKwlfYWRkX2JjYXN0X3BhY2tldF90b19saXN0KGZvcndfcGFja2V0LCAxKTsKK30KKwordm9pZCBzZW5kX291dHN0YW5kaW5nX2JjYXN0X3BhY2tldChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOworCXN0cnVjdCBkZWxheWVkX3dvcmsgKmRlbGF5ZWRfd29yayA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKKwlzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0ID0KKwkJY29udGFpbmVyX29mKGRlbGF5ZWRfd29yaywgc3RydWN0IGZvcndfcGFja2V0LCBkZWxheWVkX3dvcmspOworCisJc3Bpbl9sb2NrKCZmb3J3X2JjYXN0X2xpc3RfbG9jayk7CisJaGxpc3RfZGVsKCZmb3J3X3BhY2tldC0+bGlzdCk7CisJc3Bpbl91bmxvY2soJmZvcndfYmNhc3RfbGlzdF9sb2NrKTsKKworCS8qIHJlYnJvYWRjYXN0IHBhY2tldCAqLworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShiYXRtYW5faWYsICZpZl9saXN0LCBsaXN0KSB7CisJCXNlbmRfcmF3X3BhY2tldChmb3J3X3BhY2tldC0+cGFja2V0X2J1ZmYsCisJCQkJZm9yd19wYWNrZXQtPnBhY2tldF9sZW4sCisJCQkJYmF0bWFuX2lmLCBicm9hZGNhc3RBZGRyKTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlmb3J3X3BhY2tldC0+bnVtX3BhY2tldHMrKzsKKworCS8qIGlmIHdlIHN0aWxsIGhhdmUgc29tZSBtb3JlIGJjYXN0cyB0byBzZW5kIGFuZCB3ZSBhcmUgbm90IHNodXR0aW5nCisJICogZG93biAqLworCWlmICgoZm9yd19wYWNrZXQtPm51bV9wYWNrZXRzIDwgMykgJiYKKwkgICAgKGF0b21pY19yZWFkKCZtb2R1bGVfc3RhdGUpICE9IE1PRFVMRV9ERUFDVElWQVRJTkcpKQorCQlfYWRkX2JjYXN0X3BhY2tldF90b19saXN0KGZvcndfcGFja2V0LCAoKDUgKiBIWikgLyAxMDAwKSk7CisJZWxzZQorCQlmb3J3X3BhY2tldF9mcmVlKGZvcndfcGFja2V0KTsKK30KKwordm9pZCBzZW5kX291dHN0YW5kaW5nX2JhdF9wYWNrZXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkZWxheWVkX3dvcmsgKmRlbGF5ZWRfd29yayA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKKwlzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0ID0KKwkJY29udGFpbmVyX29mKGRlbGF5ZWRfd29yaywgc3RydWN0IGZvcndfcGFja2V0LCBkZWxheWVkX3dvcmspOworCisJc3Bpbl9sb2NrKCZmb3J3X2JhdF9saXN0X2xvY2spOworCWhsaXN0X2RlbCgmZm9yd19wYWNrZXQtPmxpc3QpOworCXNwaW5fdW5sb2NrKCZmb3J3X2JhdF9saXN0X2xvY2spOworCisJc2VuZF9wYWNrZXQoZm9yd19wYWNrZXQpOworCisJLyoqCisJICogd2UgaGF2ZSB0byBoYXZlIGF0IGxlYXN0IG9uZSBwYWNrZXQgaW4gdGhlIHF1ZXVlCisJICogdG8gZGV0ZXJtaW5lIHRoZSBxdWV1ZXMgd2FrZSB1cCB0aW1lIHVubGVzcyB3ZSBhcmUKKwkgKiBzaHV0dGluZyBkb3duCisJICovCisJaWYgKChmb3J3X3BhY2tldC0+b3duKSAmJgorCSAgICAoYXRvbWljX3JlYWQoJm1vZHVsZV9zdGF0ZSkgIT0gTU9EVUxFX0RFQUNUSVZBVElORykpCisJCXNjaGVkdWxlX293bl9wYWNrZXQoZm9yd19wYWNrZXQtPmlmX2luY29taW5nKTsKKworCWZvcndfcGFja2V0X2ZyZWUoZm9yd19wYWNrZXQpOworfQorCit2b2lkIHB1cmdlX291dHN0YW5kaW5nX3BhY2tldHModm9pZCkKK3sKKwlzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0OworCXN0cnVjdCBobGlzdF9ub2RlICp0bXBfbm9kZSwgKnNhZmVfdG1wX25vZGU7CisKKwlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAicHVyZ2Vfb3V0c3RhbmRpbmdfcGFja2V0cygpXG4iKTsKKworCS8qIGZyZWUgYmNhc3QgbGlzdCAqLworCXNwaW5fbG9jaygmZm9yd19iY2FzdF9saXN0X2xvY2spOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZm9yd19wYWNrZXQsIHRtcF9ub2RlLCBzYWZlX3RtcF9ub2RlLAorCQkJCSAgJmZvcndfYmNhc3RfbGlzdCwgbGlzdCkgeworCisJCXNwaW5fdW5sb2NrKCZmb3J3X2JjYXN0X2xpc3RfbG9jayk7CisKKwkJLyoqCisJCSAqIHNlbmRfb3V0c3RhbmRpbmdfYmNhc3RfcGFja2V0KCkgd2lsbCBsb2NrIHRoZSBsaXN0IHRvCisJCSAqIGRlbGV0ZSB0aGUgaXRlbSBmcm9tIHRoZSBsaXN0CisJCSAqLworCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmZvcndfcGFja2V0LT5kZWxheWVkX3dvcmspOworCQlzcGluX2xvY2soJmZvcndfYmNhc3RfbGlzdF9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJmZvcndfYmNhc3RfbGlzdF9sb2NrKTsKKworCS8qIGZyZWUgYmF0bWFuIHBhY2tldCBsaXN0ICovCisJc3Bpbl9sb2NrKCZmb3J3X2JhdF9saXN0X2xvY2spOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZm9yd19wYWNrZXQsIHRtcF9ub2RlLCBzYWZlX3RtcF9ub2RlLAorCQkJCSAgJmZvcndfYmF0X2xpc3QsIGxpc3QpIHsKKworCQlzcGluX3VubG9jaygmZm9yd19iYXRfbGlzdF9sb2NrKTsKKworCQkvKioKKwkJICogc2VuZF9vdXRzdGFuZGluZ19iYXRfcGFja2V0KCkgd2lsbCBsb2NrIHRoZSBsaXN0IHRvCisJCSAqIGRlbGV0ZSB0aGUgaXRlbSBmcm9tIHRoZSBsaXN0CisJCSAqLworCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmZvcndfcGFja2V0LT5kZWxheWVkX3dvcmspOworCQlzcGluX2xvY2soJmZvcndfYmF0X2xpc3RfbG9jayk7CisJfQorCXNwaW5fdW5sb2NrKCZmb3J3X2JhdF9saXN0X2xvY2spOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc2VuZC5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc2VuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZDUwMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zZW5kLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKyNpbmNsdWRlICJ0eXBlcy5oIgorCit2b2lkIHNlbmRfb3duX3BhY2tldF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Cit2b2lkIHNlbmRfcmF3X3BhY2tldCh1bnNpZ25lZCBjaGFyICpwYWNrX2J1ZmYsIGludCBwYWNrX2J1ZmZfbGVuLAorCQkgICAgIHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZiwgdWludDhfdCAqZHN0X2FkZHIpOwordm9pZCBzY2hlZHVsZV9vd25fcGFja2V0KHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZik7Cit2b2lkIHNjaGVkdWxlX2ZvcndhcmRfcGFja2V0KHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKKwkJCSAgICAgc3RydWN0IGV0aGhkciAqZXRoaGRyLAorCQkJICAgICBzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCwKKwkJCSAgICAgdWludDhfdCBkaXJlY3RsaW5rLCBpbnQgaG5hX2J1ZmZfbGVuLAorCQkJICAgICBzdHJ1Y3QgYmF0bWFuX2lmICppZl9vdXRnb2luZyk7Cit2b2lkIGFkZF9iY2FzdF9wYWNrZXRfdG9fbGlzdCh1bnNpZ25lZCBjaGFyICpwYWNrZXRfYnVmZiwgaW50IHBhY2tldF9sZW4pOwordm9pZCBzZW5kX291dHN0YW5kaW5nX2JjYXN0X3BhY2tldChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwordm9pZCBzZW5kX291dHN0YW5kaW5nX2JhdF9wYWNrZXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3ZvaWQgcHVyZ2Vfb3V0c3RhbmRpbmdfcGFja2V0cyh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zb2Z0LWludGVyZmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NDNmNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zb2Z0LWludGVyZmFjZS5jCkBAIC0wLDAgKzEsMzQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJzb2Z0LWludGVyZmFjZS5oIgorI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAic2VuZC5oIgorI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJoYXNoLmgiCisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSAiY29tcGF0LmgiCisKK3N0YXRpYyB1aW50MTZfdCBiY2FzdF9zZXFubyA9IDE7IC8qIGdpdmUgb3duIGJjYXN0IG1lc3NhZ2VzIHNlcSBudW1iZXJzIHRvIGF2b2lkCisJCQkJICAqIGJyb2FkY2FzdCBzdG9ybXMgKi8KK3N0YXRpYyBpbnQzMl90IHNrYl9wYWNrZXRzOworc3RhdGljIGludDMyX3Qgc2tiX2JhZF9wYWNrZXRzOworc3RhdGljIGludDMyX3QgbG9ja19kcm9wcGVkOworCit1bnNpZ25lZCBjaGFyIG1haW5JZkFkZHJbRVRIX0FMRU5dOworc3RhdGljIHVuc2lnbmVkIGNoYXIgbWFpbklmQWRkcl9kZWZhdWx0W0VUSF9BTEVOXTsKK3N0YXRpYyBpbnQgYmF0X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCk7CitzdGF0aWMgdm9pZCBiYXRfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKTsKK3N0YXRpYyB1MzIgYmF0X2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGJhdF9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHZhbHVlKTsKK3N0YXRpYyB1MzIgYmF0X2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHUzMiBiYXRfZ2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGJhdF9zZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgYmF0X2V0aHRvb2xfb3BzID0geworCS5nZXRfc2V0dGluZ3MgPSBiYXRfZ2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbyA9IGJhdF9nZXRfZHJ2aW5mbywKKwkuZ2V0X21zZ2xldmVsID0gYmF0X2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsID0gYmF0X3NldF9tc2dsZXZlbCwKKwkuZ2V0X2xpbmsgPSBiYXRfZ2V0X2xpbmssCisJLmdldF9yeF9jc3VtID0gYmF0X2dldF9yeF9jc3VtLAorCS5zZXRfcnhfY3N1bSA9IGJhdF9zZXRfcnhfY3N1bQorfTsKKwordm9pZCBzZXRfbWFpbl9pZl9hZGRyKHVpbnQ4X3QgKmFkZHIpCit7CisJbWVtY3B5KG1haW5JZkFkZHIsIGFkZHIsIEVUSF9BTEVOKTsKK30KKworaW50IG1haW5faWZfd2FzX3VwKHZvaWQpCit7CisJcmV0dXJuIChtZW1jbXAobWFpbklmQWRkciwgbWFpbklmQWRkcl9kZWZhdWx0LCBFVEhfQUxFTikgIT0gMCA/IDEgOiAwKTsKK30KKworc3RhdGljIGludCBteV9za2JfcHVzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWludCByZXN1bHQgPSAwOworCisJc2tiX3BhY2tldHMrKzsKKwlpZiAoc2tiLT5kYXRhIC0gbGVuIDwgc2tiLT5oZWFkKSB7CisJCXNrYl9iYWRfcGFja2V0cysrOworCQlyZXN1bHQgPSBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgbGVuLCAwLCBHRlBfQVRPTUlDKTsKKworCQlpZiAocmVzdWx0IDwgMCkKKwkJCXJldHVybiByZXN1bHQ7CisJfQorCisJc2tiX3B1c2goc2tiLCBsZW4pOworCXJldHVybiAwOworfQorCisjaWZkZWYgSEFWRV9ORVRfREVWSUNFX09QUworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBiYXRfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4gPSBpbnRlcmZhY2Vfb3BlbiwKKwkubmRvX3N0b3AgPSBpbnRlcmZhY2VfcmVsZWFzZSwKKwkubmRvX2dldF9zdGF0cyA9IGludGVyZmFjZV9zdGF0cywKKwkubmRvX3NldF9tYWNfYWRkcmVzcyA9IGludGVyZmFjZV9zZXRfbWFjX2FkZHIsCisJLm5kb19jaGFuZ2VfbXR1ID0gaW50ZXJmYWNlX2NoYW5nZV9tdHUsCisJLm5kb19zdGFydF94bWl0ID0gaW50ZXJmYWNlX3R4LAorCS5uZG9fdmFsaWRhdGVfYWRkciA9IGV0aF92YWxpZGF0ZV9hZGRyCit9OworI2VuZGlmCisKK3ZvaWQgaW50ZXJmYWNlX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJhdF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljaGFyIGRldl9hZGRyW0VUSF9BTEVOXTsKKworCWV0aGVyX3NldHVwKGRldik7CisKKyNpZmRlZiBIQVZFX05FVF9ERVZJQ0VfT1BTCisJZGV2LT5uZXRkZXZfb3BzID0gJmJhdF9uZXRkZXZfb3BzOworI2Vsc2UKKwlkZXYtPm9wZW4gPSBpbnRlcmZhY2Vfb3BlbjsKKwlkZXYtPnN0b3AgPSBpbnRlcmZhY2VfcmVsZWFzZTsKKwlkZXYtPmdldF9zdGF0cyA9IGludGVyZmFjZV9zdGF0czsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGludGVyZmFjZV9zZXRfbWFjX2FkZHI7CisJZGV2LT5jaGFuZ2VfbXR1ID0gaW50ZXJmYWNlX2NoYW5nZV9tdHU7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBpbnRlcmZhY2VfdHg7CisjZW5kaWYKKwlkZXYtPmRlc3RydWN0b3IgPSBmcmVlX25ldGRldjsKKworCWRldi0+bXR1ID0gaGFyZGlmX21pbl9tdHUoKTsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IEJBVF9IRUFERVJfTEVOOyAvKiByZXNlcnZlIG1vcmUgc3BhY2UgaW4gdGhlCisJCQkJCQkqIHNrYnVmZiBmb3Igb3VyIGhlYWRlciAqLworCisJLyogZ2VuZXJhdGUgcmFuZG9tIGFkZHJlc3MgKi8KKwlyYW5kb21fZXRoZXJfYWRkcihkZXZfYWRkcik7CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGRldl9hZGRyLCBzaXplb2YoZGV2LT5kZXZfYWRkcikpOworCisJU0VUX0VUSFRPT0xfT1BTKGRldiwgJmJhdF9ldGh0b29sX29wcyk7CisKKwltZW1zZXQocHJpdiwgMCwgc2l6ZW9mKHN0cnVjdCBiYXRfcHJpdikpOworfQorCitpbnQgaW50ZXJmYWNlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCitpbnQgaW50ZXJmYWNlX3JlbGVhc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppbnRlcmZhY2Vfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmF0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiAmcHJpdi0+c3RhdHM7Cit9CisKK2ludCBpbnRlcmZhY2Vfc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCit7CisJcmV0dXJuIC1FQlVTWTsKK30KKworaW50IGludGVyZmFjZV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCS8qIGNoZWNrIHJhbmdlcyAqLworCWlmICgobmV3X210dSA8IDY4KSB8fCAobmV3X210dSA+IGhhcmRpZl9taW5fbXR1KCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldi0+bXR1ID0gbmV3X210dTsKKworCXJldHVybiAwOworfQorCitpbnQgaW50ZXJmYWNlX3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHVuaWNhc3RfcGFja2V0ICp1bmljYXN0X3BhY2tldDsKKwlzdHJ1Y3QgYmNhc3RfcGFja2V0ICpiY2FzdF9wYWNrZXQ7CisJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOworCXN0cnVjdCBldGhoZHIgKmV0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhOworCXN0cnVjdCBiYXRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGRhdGFfbGVuID0gc2tiLT5sZW47CisKKwlpZiAoYXRvbWljX3JlYWQoJm1vZHVsZV9zdGF0ZSkgIT0gTU9EVUxFX0FDVElWRSkKKwkJZ290byBkcm9wcGVkOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJLyogVE9ETzogY2hlY2sgdGhpcyBmb3IgbG9ja3MgKi8KKwlobmFfbG9jYWxfYWRkKGV0aGhkci0+aF9zb3VyY2UpOworCisJLyogZXRoZXJuZXQgcGFja2V0IHNob3VsZCBiZSBicm9hZGNhc3RlZCAqLworCWlmIChpc19iY2FzdChldGhoZHItPmhfZGVzdCkgfHwgaXNfbWNhc3QoZXRoaGRyLT5oX2Rlc3QpKSB7CisKKwkJaWYgKG15X3NrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBiY2FzdF9wYWNrZXQpKSA8IDApCisJCQlnb3RvIGRyb3BwZWQ7CisKKwkJYmNhc3RfcGFja2V0ID0gKHN0cnVjdCBiY2FzdF9wYWNrZXQgKilza2ItPmRhdGE7CisKKwkJYmNhc3RfcGFja2V0LT52ZXJzaW9uID0gQ09NUEFUX1ZFUlNJT047CisKKwkJLyogYmF0bWFuIHBhY2tldCB0eXBlOiBicm9hZGNhc3QgKi8KKwkJYmNhc3RfcGFja2V0LT5wYWNrZXRfdHlwZSA9IEJBVF9CQ0FTVDsKKworCQkvKiBodyBhZGRyZXNzIG9mIGZpcnN0IGludGVyZmFjZSBpcyB0aGUgb3JpZyBtYWMgYmVjYXVzZSBvbmx5CisJCSAqIHRoaXMgbWFjIGlzIGtub3duIHRocm91Z2hvdXQgdGhlIG1lc2ggKi8KKwkJbWVtY3B5KGJjYXN0X3BhY2tldC0+b3JpZywgbWFpbklmQWRkciwgRVRIX0FMRU4pOworCQkvKiBzZXQgYnJvYWRjYXN0IHNlcXVlbmNlIG51bWJlciAqLworCQliY2FzdF9wYWNrZXQtPnNlcW5vID0gaHRvbnMoYmNhc3Rfc2Vxbm8pOworCisJCWJjYXN0X3NlcW5vKys7CisKKwkJLyogYnJvYWRjYXN0IHBhY2tldCAqLworCQlhZGRfYmNhc3RfcGFja2V0X3RvX2xpc3Qoc2tiLT5kYXRhLCBza2ItPmxlbik7CisKKwkvKiB1bmljYXN0IHBhY2tldCAqLworCX0gZWxzZSB7CisKKwkJLyogc2ltcGx5IHNwaW5fbG9jaygpaW5nIGNhbiBkZWFkbG9jayB3aGVuIHRoZSBsb2NrIGlzIGFscmVhZHkKKwkJICogaG9sZC4gKi8KKwkJLyogVE9ETzogZGVmZXIgdGhlIHdvcmsgaW4gYSB3b3JraW5nIHF1ZXVlIGluc3RlYWQgb2YKKwkJICogZHJvcHBpbmcgKi8KKwkJaWYgKCFzcGluX3RyeWxvY2soJm9yaWdfaGFzaF9sb2NrKSkgeworCQkJbG9ja19kcm9wcGVkKys7CisJCQlkZWJ1Z19sb2coTE9HX1RZUEVfTk9USUNFLCAiJWQgcGFja2V0cyBkcm9wcGVkIGJlY2F1c2UgbG9jayB3YXMgaG9sZFxuIiwgbG9ja19kcm9wcGVkKTsKKwkJCWdvdG8gZHJvcHBlZDsKKwkJfQorCisJCS8qIGdldCByb3V0aW5nIGluZm9ybWF0aW9uICovCisJCW9yaWdfbm9kZSA9ICgoc3RydWN0IG9yaWdfbm9kZSAqKWhhc2hfZmluZChvcmlnX2hhc2gsCisJCQkJCQkJICAgZXRoaGRyLT5oX2Rlc3QpKTsKKworCQkvKiBjaGVjayBmb3IgaG5hIGhvc3QgKi8KKwkJaWYgKCFvcmlnX25vZGUpCisJCQlvcmlnX25vZGUgPSB0cmFuc3RhYmxlX3NlYXJjaChldGhoZHItPmhfZGVzdCk7CisKKwkJaWYgKChvcmlnX25vZGUpICYmCisJCSAgICAob3JpZ19ub2RlLT5iYXRtYW5faWYpICYmCisJCSAgICAob3JpZ19ub2RlLT5yb3V0ZXIpKSB7CisJCQlpZiAobXlfc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IHVuaWNhc3RfcGFja2V0KSkgPCAwKQorCQkJCWdvdG8gdW5sb2NrOworCisJCQl1bmljYXN0X3BhY2tldCA9IChzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQgKilza2ItPmRhdGE7CisKKwkJCXVuaWNhc3RfcGFja2V0LT52ZXJzaW9uID0gQ09NUEFUX1ZFUlNJT047CisJCQkvKiBiYXRtYW4gcGFja2V0IHR5cGU6IHVuaWNhc3QgKi8KKwkJCXVuaWNhc3RfcGFja2V0LT5wYWNrZXRfdHlwZSA9IEJBVF9VTklDQVNUOworCQkJLyogc2V0IHVuaWNhc3QgdHRsICovCisJCQl1bmljYXN0X3BhY2tldC0+dHRsID0gVFRMOworCQkJLyogY29weSB0aGUgZGVzdGluYXRpb24gZm9yIGZhc3RlciByb3V0aW5nICovCisJCQltZW1jcHkodW5pY2FzdF9wYWNrZXQtPmRlc3QsIG9yaWdfbm9kZS0+b3JpZywgRVRIX0FMRU4pOworCisJCQkvKiBuZXRfZGV2IHdvbid0IGJlIGF2YWlsYWJsZSB3aGVuIG5vdCBhY3RpdmUgKi8KKwkJCWlmIChvcmlnX25vZGUtPmJhdG1hbl9pZi0+aWZfYWN0aXZlICE9IElGX0FDVElWRSkKKwkJCQlnb3RvIHVubG9jazsKKworCQkJc2VuZF9yYXdfcGFja2V0KHNrYi0+ZGF0YSwgc2tiLT5sZW4sCisJCQkJCW9yaWdfbm9kZS0+YmF0bWFuX2lmLAorCQkJCQlvcmlnX25vZGUtPnJvdXRlci0+YWRkcik7CisJCX0gZWxzZSB7CisJCQlnb3RvIHVubG9jazsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJfQorCisJcHJpdi0+c3RhdHMudHhfcGFja2V0cysrOworCXByaXYtPnN0YXRzLnR4X2J5dGVzICs9IGRhdGFfbGVuOworCWdvdG8gZW5kOworCit1bmxvY2s6CisJc3Bpbl91bmxvY2soJm9yaWdfaGFzaF9sb2NrKTsKK2Ryb3BwZWQ6CisJcHJpdi0+c3RhdHMudHhfZHJvcHBlZCsrOworZW5kOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCit2b2lkIGludGVyZmFjZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwYWNrZXQsIGludCBwYWNrZXRfbGVuKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGJhdF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNrYiA9IGRldl9hbGxvY19za2IocGFja2V0X2xlbik7CisKKwlpZiAoIXNrYikgeworCQlwcml2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCWdvdG8gb3V0OworCX0KKworCW1lbWNweShza2JfcHV0KHNrYiwgcGFja2V0X2xlbiksIHBhY2tldCwgcGFja2V0X2xlbik7CisKKwkvKiBXcml0ZSBtZXRhZGF0YSwgYW5kIHRoZW4gcGFzcyB0byB0aGUgcmVjZWl2ZSBsZXZlbCAqLworCXNrYi0+ZGV2ID0gZGV2OworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKworCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlwcml2LT5zdGF0cy5yeF9ieXRlcyArPSBwYWNrZXRfbGVuOworCisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworCW5ldGlmX3J4KHNrYik7CisKK291dDoKKwlyZXR1cm47Cit9CisKKy8qIGV0aHRvb2wgKi8KK3N0YXRpYyBpbnQgYmF0X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwljbWQtPnN1cHBvcnRlZCA9IDA7CisJY21kLT5hZHZlcnRpc2luZyA9IDA7CisJY21kLT5zcGVlZCA9IFNQRUVEXzEwOworCWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJY21kLT5wb3J0ID0gUE9SVF9UUDsKKwljbWQtPnBoeV9hZGRyZXNzID0gMDsKKwljbWQtPnRyYW5zY2VpdmVyID0gWENWUl9JTlRFUk5BTDsKKwljbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0RJU0FCTEU7CisJY21kLT5tYXh0eHBrdCA9IDA7CisJY21kLT5tYXhyeHBrdCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmF0X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCAiQi5BLlQuTS5BLk4uIGFkdmFuY2VkIik7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIFNPVVJDRV9WRVJTSU9OKTsKKwlzdHJjcHkoaW5mby0+ZndfdmVyc2lvbiwgIk4vQSIpOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgImJhdG1hbiIpOworfQorCitzdGF0aWMgdTMyIGJhdF9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyB2b2lkIGJhdF9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHZhbHVlKQoreworCXJldHVybjsKK30KKworc3RhdGljIHUzMiBiYXRfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHUzMiBiYXRfZ2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiYXRfc2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc29mdC1pbnRlcmZhY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE1ZTI3NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogTWFyZWsgTGluZG5lcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKK3ZvaWQgc2V0X21haW5faWZfYWRkcih1aW50OF90ICphZGRyKTsKK2ludCBtYWluX2lmX3dhc191cCh2b2lkKTsKK3ZvaWQgaW50ZXJmYWNlX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IGludGVyZmFjZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IGludGVyZmFjZV9yZWxlYXNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmludGVyZmFjZV9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCBpbnRlcmZhY2Vfc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpOworaW50IGludGVyZmFjZV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KTsKK2ludCBpbnRlcmZhY2VfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIGludGVyZmFjZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwYWNrZXQsIGludCBwYWNrZXRfbGVuKTsKKworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgbWFpbklmQWRkcltdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdHJhbnNsYXRpb24tdGFibGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIxOTBlMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmMKQEAgLTAsMCArMSw0NTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAic29mdC1pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgImhhc2guaCIKKyNpbmNsdWRlICJjb21wYXQuaCIKKworc3RydWN0IGhhc2h0YWJsZV90ICpobmFfbG9jYWxfaGFzaDsKK3N0YXRpYyBzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhuYV9nbG9iYWxfaGFzaDsKK2F0b21pY190IGhuYV9sb2NhbF9jaGFuZ2VkOworCitERUZJTkVfU1BJTkxPQ0soaG5hX2xvY2FsX2hhc2hfbG9jayk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGhuYV9nbG9iYWxfaGFzaF9sb2NrKTsKKworc3RhdGljIERFQ0xBUkVfREVMQVlFRF9XT1JLKGhuYV9sb2NhbF9wdXJnZV93cSwgaG5hX2xvY2FsX3B1cmdlKTsKKworc3RhdGljIHZvaWQgaG5hX2xvY2FsX3N0YXJ0X3RpbWVyKHZvaWQpCit7CisJcXVldWVfZGVsYXllZF93b3JrKGJhdF9ldmVudF93b3JrcXVldWUsICZobmFfbG9jYWxfcHVyZ2Vfd3EsIDEwICogSFopOworfQorCitpbnQgaG5hX2xvY2FsX2luaXQodm9pZCkKK3sKKwlpZiAoaG5hX2xvY2FsX2hhc2gpCisJCXJldHVybiAxOworCisJaG5hX2xvY2FsX2hhc2ggPSBoYXNoX25ldygxMjgsIGNvbXBhcmVfb3JpZywgY2hvb3NlX29yaWcpOworCisJaWYgKCFobmFfbG9jYWxfaGFzaCkKKwkJcmV0dXJuIDA7CisKKwlhdG9taWNfc2V0KCZobmFfbG9jYWxfY2hhbmdlZCwgMCk7CisJaG5hX2xvY2FsX3N0YXJ0X3RpbWVyKCk7CisKKwlyZXR1cm4gMTsKK30KKwordm9pZCBobmFfbG9jYWxfYWRkKHVpbnQ4X3QgKmFkZHIpCit7CisJc3RydWN0IGhuYV9sb2NhbF9lbnRyeSAqaG5hX2xvY2FsX2VudHJ5OworCXN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5ICpobmFfZ2xvYmFsX2VudHJ5OworCXN0cnVjdCBoYXNodGFibGVfdCAqc3dhcGhhc2g7CisJY2hhciBobmFfc3RyW0VUSF9TVFJfTEVOXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhuYV9sb2NhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKwlobmFfbG9jYWxfZW50cnkgPQorCQkoKHN0cnVjdCBobmFfbG9jYWxfZW50cnkgKiloYXNoX2ZpbmQoaG5hX2xvY2FsX2hhc2gsIGFkZHIpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZobmFfbG9jYWxfaGFzaF9sb2NrLCBmbGFncyk7CisKKwlpZiAoaG5hX2xvY2FsX2VudHJ5ICE9IE5VTEwpIHsKKwkJaG5hX2xvY2FsX2VudHJ5LT5sYXN0X3NlZW4gPSBqaWZmaWVzOworCQlyZXR1cm47CisJfQorCisJYWRkcl90b19zdHJpbmcoaG5hX3N0ciwgYWRkcik7CisKKwkvKiBvbmx5IGFubm91bmNlIGFzIG1hbnkgaG9zdHMgYXMgcG9zc2libGUgaW4gdGhlIGJhdG1hbi1wYWNrZXQgYW5kCisJICAgc3BhY2UgaW4gYmF0bWFuX3BhY2tldC0+bnVtX2huYSBUaGF0IGFsc28gc2hvdWxkIGdpdmUgYSBsaW1pdCB0bworCSAgIE1BQy1mbG9vZGluZy4gKi8KKwlpZiAoKG51bV9obmEgKyAxID4gKEVUSF9EQVRBX0xFTiAtIEJBVF9QQUNLRVRfTEVOKSAvIEVUSF9BTEVOKSB8fAorCSAgICAobnVtX2huYSArIDEgPiAyNTUpKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9ST1VURVMsICJDYW4ndCBhZGQgbmV3IGxvY2FsIGhuYSBlbnRyeSAoJXMpOiBudW1iZXIgb2YgbG9jYWwgaG5hIGVudHJpZXMgZXhjZWVkcyBwYWNrZXQgc2l6ZSBcbiIsIGhuYV9zdHIpOworCQlyZXR1cm47CisJfQorCisJZGVidWdfbG9nKExPR19UWVBFX1JPVVRFUywgIkNyZWF0aW5nIG5ldyBsb2NhbCBobmEgZW50cnk6ICVzIFxuIiwKKwkJICBobmFfc3RyKTsKKworCWhuYV9sb2NhbF9lbnRyeSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBobmFfbG9jYWxfZW50cnkpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWhuYV9sb2NhbF9lbnRyeSkKKwkJcmV0dXJuOworCisJbWVtY3B5KGhuYV9sb2NhbF9lbnRyeS0+YWRkciwgYWRkciwgRVRIX0FMRU4pOworCWhuYV9sb2NhbF9lbnRyeS0+bGFzdF9zZWVuID0gamlmZmllczsKKworCS8qIHRoZSBiYXRtYW4gaW50ZXJmYWNlIG1hYyBhZGRyZXNzIHNob3VsZCBuZXZlciBiZSBwdXJnZWQgKi8KKwlpZiAoY29tcGFyZV9vcmlnKGFkZHIsIHNvZnRfZGV2aWNlLT5kZXZfYWRkcikpCisJCWhuYV9sb2NhbF9lbnRyeS0+bmV2ZXJfcHVyZ2UgPSAxOworCWVsc2UKKwkJaG5hX2xvY2FsX2VudHJ5LT5uZXZlcl9wdXJnZSA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaG5hX2xvY2FsX2hhc2hfbG9jaywgZmxhZ3MpOworCisJaGFzaF9hZGQoaG5hX2xvY2FsX2hhc2gsIGhuYV9sb2NhbF9lbnRyeSk7CisJbnVtX2huYSsrOworCWF0b21pY19zZXQoJmhuYV9sb2NhbF9jaGFuZ2VkLCAxKTsKKworCWlmIChobmFfbG9jYWxfaGFzaC0+ZWxlbWVudHMgKiA0ID4gaG5hX2xvY2FsX2hhc2gtPnNpemUpIHsKKwkJc3dhcGhhc2ggPSBoYXNoX3Jlc2l6ZShobmFfbG9jYWxfaGFzaCwKKwkJCQkgICAgICAgaG5hX2xvY2FsX2hhc2gtPnNpemUgKiAyKTsKKworCQlpZiAoc3dhcGhhc2ggPT0gTlVMTCkKKwkJCWRlYnVnX2xvZyhMT0dfVFlQRV9DUklULCAiQ291bGRuJ3QgcmVzaXplIGxvY2FsIGhuYSBoYXNoIHRhYmxlIFxuIik7CisJCWVsc2UKKwkJCWhuYV9sb2NhbF9oYXNoID0gc3dhcGhhc2g7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG5hX2xvY2FsX2hhc2hfbG9jaywgZmxhZ3MpOworCisJLyogcmVtb3ZlIGFkZHJlc3MgZnJvbSBnbG9iYWwgaGFzaCBpZiBwcmVzZW50ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhuYV9nbG9iYWxfaGFzaF9sb2NrLCBmbGFncyk7CisKKwlobmFfZ2xvYmFsX2VudHJ5ID0KKwkJKChzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqKWhhc2hfZmluZChobmFfZ2xvYmFsX2hhc2gsIGFkZHIpKTsKKworCWlmIChobmFfZ2xvYmFsX2VudHJ5ICE9IE5VTEwpCisJCV9obmFfZ2xvYmFsX2RlbF9vcmlnKGhuYV9nbG9iYWxfZW50cnksICJsb2NhbCBobmEgcmVjZWl2ZWQiKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhuYV9nbG9iYWxfaGFzaF9sb2NrLCBmbGFncyk7Cit9CisKK2ludCBobmFfbG9jYWxfZmlsbF9idWZmZXIodW5zaWduZWQgY2hhciAqYnVmZiwgaW50IGJ1ZmZfbGVuKQoreworCXN0cnVjdCBobmFfbG9jYWxfZW50cnkgKmhuYV9sb2NhbF9lbnRyeTsKKwlzdHJ1Y3QgaGFzaF9pdF90ICpoYXNoaXQgPSBOVUxMOworCWludCBpID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhuYV9sb2NhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKworCXdoaWxlIChOVUxMICE9IChoYXNoaXQgPSBoYXNoX2l0ZXJhdGUoaG5hX2xvY2FsX2hhc2gsIGhhc2hpdCkpKSB7CisKKwkJaWYgKGJ1ZmZfbGVuIDwgKGkgKyAxKSAqIEVUSF9BTEVOKQorCQkJYnJlYWs7CisKKwkJaG5hX2xvY2FsX2VudHJ5ID0gaGFzaGl0LT5idWNrZXQtPmRhdGE7CisJCW1lbWNweShidWZmICsgKGkgKiBFVEhfQUxFTiksIGhuYV9sb2NhbF9lbnRyeS0+YWRkciwgRVRIX0FMRU4pOworCisJCWkrKzsKKwl9CisKKwkvKiBpZiB3ZSBkaWQgbm90IGdldCBhbGwgbmV3IGxvY2FsIGhuYXMgc2VlIHlvdSBuZXh0IHRpbWUgIDstKSAqLworCWlmIChpID09IG51bV9obmEpCisJCWF0b21pY19zZXQoJmhuYV9sb2NhbF9jaGFuZ2VkLCAwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhuYV9sb2NhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBpOworfQorCitpbnQgaG5hX2xvY2FsX2ZpbGxfYnVmZmVyX3RleHQodW5zaWduZWQgY2hhciAqYnVmZiwgaW50IGJ1ZmZfbGVuKQoreworCXN0cnVjdCBobmFfbG9jYWxfZW50cnkgKmhuYV9sb2NhbF9lbnRyeTsKKwlzdHJ1Y3QgaGFzaF9pdF90ICpoYXNoaXQgPSBOVUxMOworCWludCBieXRlc193cml0dGVuID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhuYV9sb2NhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKworCXdoaWxlIChOVUxMICE9IChoYXNoaXQgPSBoYXNoX2l0ZXJhdGUoaG5hX2xvY2FsX2hhc2gsIGhhc2hpdCkpKSB7CisKKwkJaWYgKGJ1ZmZfbGVuIDwgYnl0ZXNfd3JpdHRlbiArIEVUSF9TVFJfTEVOICsgNCkKKwkJCWJyZWFrOworCisJCWhuYV9sb2NhbF9lbnRyeSA9IGhhc2hpdC0+YnVja2V0LT5kYXRhOworCisJCWJ5dGVzX3dyaXR0ZW4gKz0gc25wcmludGYoYnVmZiArIGJ5dGVzX3dyaXR0ZW4sIEVUSF9TVFJfTEVOICsgNCwKKwkJCQkJICAiICogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkJCSAgaG5hX2xvY2FsX2VudHJ5LT5hZGRyWzBdLAorCQkJCQkgIGhuYV9sb2NhbF9lbnRyeS0+YWRkclsxXSwKKwkJCQkJICBobmFfbG9jYWxfZW50cnktPmFkZHJbMl0sCisJCQkJCSAgaG5hX2xvY2FsX2VudHJ5LT5hZGRyWzNdLAorCQkJCQkgIGhuYV9sb2NhbF9lbnRyeS0+YWRkcls0XSwKKwkJCQkJICBobmFfbG9jYWxfZW50cnktPmFkZHJbNV0pOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhuYV9sb2NhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBieXRlc193cml0dGVuOworfQorCitzdGF0aWMgdm9pZCBfaG5hX2xvY2FsX2RlbCh2b2lkICpkYXRhKQoreworCWtmcmVlKGRhdGEpOworCW51bV9obmEtLTsKKwlhdG9taWNfc2V0KCZobmFfbG9jYWxfY2hhbmdlZCwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGhuYV9sb2NhbF9kZWwoc3RydWN0IGhuYV9sb2NhbF9lbnRyeSAqaG5hX2xvY2FsX2VudHJ5LAorCQkJICBjaGFyICptZXNzYWdlKQoreworCWNoYXIgaG5hX3N0cltFVEhfU1RSX0xFTl07CisKKwlhZGRyX3RvX3N0cmluZyhobmFfc3RyLCBobmFfbG9jYWxfZW50cnktPmFkZHIpOworCWRlYnVnX2xvZyhMT0dfVFlQRV9ST1VURVMsICJEZWxldGluZyBsb2NhbCBobmEgZW50cnkgKCVzKTogJXMgXG4iLAorCQkgIGhuYV9zdHIsIG1lc3NhZ2UpOworCisJaGFzaF9yZW1vdmUoaG5hX2xvY2FsX2hhc2gsIGhuYV9sb2NhbF9lbnRyeS0+YWRkcik7CisJX2huYV9sb2NhbF9kZWwoaG5hX2xvY2FsX2VudHJ5KTsKK30KKwordm9pZCBobmFfbG9jYWxfcHVyZ2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBobmFfbG9jYWxfZW50cnkgKmhuYV9sb2NhbF9lbnRyeTsKKwlzdHJ1Y3QgaGFzaF9pdF90ICpoYXNoaXQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhuYV9sb2NhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKworCXdoaWxlIChOVUxMICE9IChoYXNoaXQgPSBoYXNoX2l0ZXJhdGUoaG5hX2xvY2FsX2hhc2gsIGhhc2hpdCkpKSB7CisJCWhuYV9sb2NhbF9lbnRyeSA9IGhhc2hpdC0+YnVja2V0LT5kYXRhOworCisJCXRpbWVvdXQgPSBobmFfbG9jYWxfZW50cnktPmxhc3Rfc2VlbiArCisJCQkoKExPQ0FMX0hOQV9USU1FT1VUIC8gMTAwMCkgKiBIWik7CisJCWlmICgoIWhuYV9sb2NhbF9lbnRyeS0+bmV2ZXJfcHVyZ2UpICYmCisJCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJaG5hX2xvY2FsX2RlbChobmFfbG9jYWxfZW50cnksICJhZGRyZXNzIHRpbWVkIG91dCIpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhuYV9sb2NhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKwlobmFfbG9jYWxfc3RhcnRfdGltZXIoKTsKK30KKwordm9pZCBobmFfbG9jYWxfZnJlZSh2b2lkKQoreworCWlmICghaG5hX2xvY2FsX2hhc2gpCisJCXJldHVybjsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmaG5hX2xvY2FsX3B1cmdlX3dxKTsKKwloYXNoX2RlbGV0ZShobmFfbG9jYWxfaGFzaCwgX2huYV9sb2NhbF9kZWwpOworCWhuYV9sb2NhbF9oYXNoID0gTlVMTDsKK30KKworaW50IGhuYV9nbG9iYWxfaW5pdCh2b2lkKQoreworCWlmIChobmFfZ2xvYmFsX2hhc2gpCisJCXJldHVybiAxOworCisJaG5hX2dsb2JhbF9oYXNoID0gaGFzaF9uZXcoMTI4LCBjb21wYXJlX29yaWcsIGNob29zZV9vcmlnKTsKKworCWlmICghaG5hX2dsb2JhbF9oYXNoKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCit2b2lkIGhuYV9nbG9iYWxfYWRkX29yaWcoc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAorCQkJIHVuc2lnbmVkIGNoYXIgKmhuYV9idWZmLCBpbnQgaG5hX2J1ZmZfbGVuKQoreworCXN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5ICpobmFfZ2xvYmFsX2VudHJ5OworCXN0cnVjdCBobmFfbG9jYWxfZW50cnkgKmhuYV9sb2NhbF9lbnRyeTsKKwlzdHJ1Y3QgaGFzaHRhYmxlX3QgKnN3YXBoYXNoOworCWNoYXIgaG5hX3N0cltFVEhfU1RSX0xFTl0sIG9yaWdfc3RyW0VUSF9TVFJfTEVOXTsKKwlpbnQgaG5hX2J1ZmZfY291bnQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciAqaG5hX3B0cjsKKworCWFkZHJfdG9fc3RyaW5nKG9yaWdfc3RyLCBvcmlnX25vZGUtPm9yaWcpOworCisJd2hpbGUgKChobmFfYnVmZl9jb3VudCArIDEpICogRVRIX0FMRU4gPD0gaG5hX2J1ZmZfbGVuKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZobmFfZ2xvYmFsX2hhc2hfbG9jaywgZmxhZ3MpOworCisJCWhuYV9wdHIgPSBobmFfYnVmZiArIChobmFfYnVmZl9jb3VudCAqIEVUSF9BTEVOKTsKKwkJaG5hX2dsb2JhbF9lbnRyeSA9IChzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqKQorCQkJaGFzaF9maW5kKGhuYV9nbG9iYWxfaGFzaCwgaG5hX3B0cik7CisKKwkJaWYgKGhuYV9nbG9iYWxfZW50cnkgPT0gTlVMTCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG5hX2dsb2JhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKworCQkJaG5hX2dsb2JhbF9lbnRyeSA9CisJCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IGhuYV9nbG9iYWxfZW50cnkpLAorCQkJCQlHRlBfQVRPTUlDKTsKKworCQkJaWYgKCFobmFfZ2xvYmFsX2VudHJ5KQorCQkJCWJyZWFrOworCisJCQltZW1jcHkoaG5hX2dsb2JhbF9lbnRyeS0+YWRkciwgaG5hX3B0ciwgRVRIX0FMRU4pOworCisJCQlhZGRyX3RvX3N0cmluZyhobmFfc3RyLCBobmFfZ2xvYmFsX2VudHJ5LT5hZGRyKTsKKwkJCWRlYnVnX2xvZyhMT0dfVFlQRV9ST1VURVMsICJDcmVhdGluZyBuZXcgZ2xvYmFsIGhuYSBlbnRyeTogJXMgKHZpYSAlcylcbiIsIGhuYV9zdHIsIG9yaWdfc3RyKTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmhuYV9nbG9iYWxfaGFzaF9sb2NrLCBmbGFncyk7CisJCQloYXNoX2FkZChobmFfZ2xvYmFsX2hhc2gsIGhuYV9nbG9iYWxfZW50cnkpOworCisJCX0KKworCQlobmFfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUgPSBvcmlnX25vZGU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhuYV9nbG9iYWxfaGFzaF9sb2NrLCBmbGFncyk7CisKKwkJLyogcmVtb3ZlIGFkZHJlc3MgZnJvbSBsb2NhbCBoYXNoIGlmIHByZXNlbnQgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhuYV9sb2NhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKworCQlobmFfcHRyID0gaG5hX2J1ZmYgKyAoaG5hX2J1ZmZfY291bnQgKiBFVEhfQUxFTik7CisJCWhuYV9sb2NhbF9lbnRyeSA9IChzdHJ1Y3QgaG5hX2xvY2FsX2VudHJ5ICopCisJCQloYXNoX2ZpbmQoaG5hX2xvY2FsX2hhc2gsIGhuYV9wdHIpOworCisJCWlmIChobmFfbG9jYWxfZW50cnkgIT0gTlVMTCkKKwkJCWhuYV9sb2NhbF9kZWwoaG5hX2xvY2FsX2VudHJ5LCAiZ2xvYmFsIGhuYSByZWNlaXZlZCIpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhuYV9sb2NhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKworCQlobmFfYnVmZl9jb3VudCsrOworCX0KKworCW9yaWdfbm9kZS0+aG5hX2J1ZmZfbGVuID0gaG5hX2J1ZmZfbGVuOworCisJaWYgKG9yaWdfbm9kZS0+aG5hX2J1ZmZfbGVuID4gMCkgeworCQlvcmlnX25vZGUtPmhuYV9idWZmID0ga21hbGxvYyhvcmlnX25vZGUtPmhuYV9idWZmX2xlbiwKKwkJCQkJICAgICAgR0ZQX0FUT01JQyk7CisJCW1lbWNweShvcmlnX25vZGUtPmhuYV9idWZmLCBobmFfYnVmZiwgb3JpZ19ub2RlLT5obmFfYnVmZl9sZW4pOworCX0gZWxzZSB7CisJCW9yaWdfbm9kZS0+aG5hX2J1ZmYgPSBOVUxMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZobmFfZ2xvYmFsX2hhc2hfbG9jaywgZmxhZ3MpOworCisJaWYgKGhuYV9nbG9iYWxfaGFzaC0+ZWxlbWVudHMgKiA0ID4gaG5hX2dsb2JhbF9oYXNoLT5zaXplKSB7CisJCXN3YXBoYXNoID0gaGFzaF9yZXNpemUoaG5hX2dsb2JhbF9oYXNoLAorCQkJCSAgICAgICBobmFfZ2xvYmFsX2hhc2gtPnNpemUgKiAyKTsKKworCQlpZiAoc3dhcGhhc2ggPT0gTlVMTCkKKwkJCWRlYnVnX2xvZyhMT0dfVFlQRV9DUklULCAiQ291bGRuJ3QgcmVzaXplIGdsb2JhbCBobmEgaGFzaCB0YWJsZSBcbiIpOworCQllbHNlCisJCQlobmFfZ2xvYmFsX2hhc2ggPSBzd2FwaGFzaDsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZobmFfZ2xvYmFsX2hhc2hfbG9jaywgZmxhZ3MpOworfQorCitpbnQgaG5hX2dsb2JhbF9maWxsX2J1ZmZlcl90ZXh0KHVuc2lnbmVkIGNoYXIgKmJ1ZmYsIGludCBidWZmX2xlbikKK3sKKwlzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqaG5hX2dsb2JhbF9lbnRyeTsKKwlzdHJ1Y3QgaGFzaF9pdF90ICpoYXNoaXQgPSBOVUxMOworCWludCBieXRlc193cml0dGVuID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhuYV9nbG9iYWxfaGFzaF9sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAoTlVMTCAhPSAoaGFzaGl0ID0gaGFzaF9pdGVyYXRlKGhuYV9nbG9iYWxfaGFzaCwgaGFzaGl0KSkpIHsKKwkJaWYgKGJ1ZmZfbGVuIDwgYnl0ZXNfd3JpdHRlbiArICgyICogRVRIX1NUUl9MRU4pICsgMTApCisJCQlicmVhazsKKworCQlobmFfZ2xvYmFsX2VudHJ5ID0gaGFzaGl0LT5idWNrZXQtPmRhdGE7CisKKwkJYnl0ZXNfd3JpdHRlbiArPSBzbnByaW50ZihidWZmICsgYnl0ZXNfd3JpdHRlbiwKKwkJCQkJICAoMiAqIEVUSF9TVFJfTEVOKSArIDEwLAorCQkJCQkgICIgKiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCB2aWEgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggXG4iLAorCQkJCQkgIGhuYV9nbG9iYWxfZW50cnktPmFkZHJbMF0sCisJCQkJCSAgaG5hX2dsb2JhbF9lbnRyeS0+YWRkclsxXSwKKwkJCQkJICBobmFfZ2xvYmFsX2VudHJ5LT5hZGRyWzJdLAorCQkJCQkgIGhuYV9nbG9iYWxfZW50cnktPmFkZHJbM10sCisJCQkJCSAgaG5hX2dsb2JhbF9lbnRyeS0+YWRkcls0XSwKKwkJCQkJICBobmFfZ2xvYmFsX2VudHJ5LT5hZGRyWzVdLAorCQkJCQkgIGhuYV9nbG9iYWxfZW50cnktPm9yaWdfbm9kZS0+b3JpZ1swXSwKKwkJCQkJICBobmFfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUtPm9yaWdbMV0sCisJCQkJCSAgaG5hX2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlLT5vcmlnWzJdLAorCQkJCQkgIGhuYV9nbG9iYWxfZW50cnktPm9yaWdfbm9kZS0+b3JpZ1szXSwKKwkJCQkJICBobmFfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUtPm9yaWdbNF0sCisJCQkJCSAgaG5hX2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlLT5vcmlnWzVdKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZobmFfZ2xvYmFsX2hhc2hfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGJ5dGVzX3dyaXR0ZW47Cit9CisKK3ZvaWQgX2huYV9nbG9iYWxfZGVsX29yaWcoc3RydWN0IGhuYV9nbG9iYWxfZW50cnkgKmhuYV9nbG9iYWxfZW50cnksCisJCQkgIGNoYXIgKm1lc3NhZ2UpCit7CisJY2hhciBobmFfc3RyW0VUSF9TVFJfTEVOXSwgb3JpZ19zdHJbRVRIX1NUUl9MRU5dOworCisJYWRkcl90b19zdHJpbmcob3JpZ19zdHIsIGhuYV9nbG9iYWxfZW50cnktPm9yaWdfbm9kZS0+b3JpZyk7CisJYWRkcl90b19zdHJpbmcoaG5hX3N0ciwgaG5hX2dsb2JhbF9lbnRyeS0+YWRkcik7CisKKwlkZWJ1Z19sb2coTE9HX1RZUEVfUk9VVEVTLCAiRGVsZXRpbmcgZ2xvYmFsIGhuYSBlbnRyeSAlcyAodmlhICVzKTogJXMgXG4iLCBobmFfc3RyLCBvcmlnX3N0ciwgbWVzc2FnZSk7CisKKwloYXNoX3JlbW92ZShobmFfZ2xvYmFsX2hhc2gsIGhuYV9nbG9iYWxfZW50cnktPmFkZHIpOworCWtmcmVlKGhuYV9nbG9iYWxfZW50cnkpOworfQorCit2b2lkIGhuYV9nbG9iYWxfZGVsX29yaWcoc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLCBjaGFyICptZXNzYWdlKQoreworCXN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5ICpobmFfZ2xvYmFsX2VudHJ5OworCWludCBobmFfYnVmZl9jb3VudCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyICpobmFfcHRyOworCisJaWYgKG9yaWdfbm9kZS0+aG5hX2J1ZmZfbGVuID09IDApCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZobmFfZ2xvYmFsX2hhc2hfbG9jaywgZmxhZ3MpOworCisJd2hpbGUgKChobmFfYnVmZl9jb3VudCArIDEpICogRVRIX0FMRU4gPD0gb3JpZ19ub2RlLT5obmFfYnVmZl9sZW4pIHsKKwkJaG5hX3B0ciA9IG9yaWdfbm9kZS0+aG5hX2J1ZmYgKyAoaG5hX2J1ZmZfY291bnQgKiBFVEhfQUxFTik7CisJCWhuYV9nbG9iYWxfZW50cnkgPSAoc3RydWN0IGhuYV9nbG9iYWxfZW50cnkgKikKKwkJCWhhc2hfZmluZChobmFfZ2xvYmFsX2hhc2gsIGhuYV9wdHIpOworCisJCWlmICgoaG5hX2dsb2JhbF9lbnRyeSAhPSBOVUxMKSAmJgorCQkgICAgKGhuYV9nbG9iYWxfZW50cnktPm9yaWdfbm9kZSA9PSBvcmlnX25vZGUpKQorCQkJX2huYV9nbG9iYWxfZGVsX29yaWcoaG5hX2dsb2JhbF9lbnRyeSwgbWVzc2FnZSk7CisKKwkJaG5hX2J1ZmZfY291bnQrKzsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZobmFfZ2xvYmFsX2hhc2hfbG9jaywgZmxhZ3MpOworCisJb3JpZ19ub2RlLT5obmFfYnVmZl9sZW4gPSAwOworCWtmcmVlKG9yaWdfbm9kZS0+aG5hX2J1ZmYpOworCW9yaWdfbm9kZS0+aG5hX2J1ZmYgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBobmFfZ2xvYmFsX2RlbCh2b2lkICpkYXRhKQoreworCWtmcmVlKGRhdGEpOworfQorCit2b2lkIGhuYV9nbG9iYWxfZnJlZSh2b2lkKQoreworCWlmICghaG5hX2dsb2JhbF9oYXNoKQorCQlyZXR1cm47CisKKwloYXNoX2RlbGV0ZShobmFfZ2xvYmFsX2hhc2gsIGhuYV9nbG9iYWxfZGVsKTsKKwlobmFfZ2xvYmFsX2hhc2ggPSBOVUxMOworfQorCitzdHJ1Y3Qgb3JpZ19ub2RlICp0cmFuc3RhYmxlX3NlYXJjaCh1aW50OF90ICphZGRyKQoreworCXN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5ICpobmFfZ2xvYmFsX2VudHJ5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaG5hX2dsb2JhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKwlobmFfZ2xvYmFsX2VudHJ5ID0gKHN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5ICopCisJCWhhc2hfZmluZChobmFfZ2xvYmFsX2hhc2gsIGFkZHIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhuYV9nbG9iYWxfaGFzaF9sb2NrLCBmbGFncyk7CisKKwlpZiAoaG5hX2dsb2JhbF9lbnRyeSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBobmFfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGU7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi90cmFuc2xhdGlvbi10YWJsZS5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdHJhbnNsYXRpb24tdGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2RhODExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdHJhbnNsYXRpb24tdGFibGUuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgInR5cGVzLmgiCisKK2ludCBobmFfbG9jYWxfaW5pdCh2b2lkKTsKK3ZvaWQgaG5hX2xvY2FsX2FkZCh1aW50OF90ICphZGRyKTsKK2ludCBobmFfbG9jYWxfZmlsbF9idWZmZXIodW5zaWduZWQgY2hhciAqYnVmZiwgaW50IGJ1ZmZfbGVuKTsKK2ludCBobmFfbG9jYWxfZmlsbF9idWZmZXJfdGV4dCh1bnNpZ25lZCBjaGFyICpidWZmLCBpbnQgYnVmZl9sZW4pOwordm9pZCBobmFfbG9jYWxfcHVyZ2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3ZvaWQgaG5hX2xvY2FsX2ZyZWUodm9pZCk7CitpbnQgaG5hX2dsb2JhbF9pbml0KHZvaWQpOwordm9pZCBobmFfZ2xvYmFsX2FkZF9vcmlnKHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwgdW5zaWduZWQgY2hhciAqaG5hX2J1ZmYsCisJCQkgaW50IGhuYV9idWZmX2xlbik7CitpbnQgaG5hX2dsb2JhbF9maWxsX2J1ZmZlcl90ZXh0KHVuc2lnbmVkIGNoYXIgKmJ1ZmYsIGludCBidWZmX2xlbik7Cit2b2lkIF9obmFfZ2xvYmFsX2RlbF9vcmlnKHN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5ICpobmFfZ2xvYmFsX2VudHJ5LAorCQkJICBjaGFyICpvcmlnX3N0cik7Cit2b2lkIGhuYV9nbG9iYWxfZGVsX29yaWcoc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLCBjaGFyICptZXNzYWdlKTsKK3ZvaWQgaG5hX2dsb2JhbF9mcmVlKHZvaWQpOworc3RydWN0IG9yaWdfbm9kZSAqdHJhbnN0YWJsZV9zZWFyY2godWludDhfdCAqYWRkcik7CisKK2V4dGVybiBzcGlubG9ja190IGhuYV9sb2NhbF9oYXNoX2xvY2s7CitleHRlcm4gc3RydWN0IGhhc2h0YWJsZV90ICpobmFfbG9jYWxfaGFzaDsKK2V4dGVybiBhdG9taWNfdCBobmFfbG9jYWxfY2hhbmdlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3R5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMGVmMGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi90eXBlcy5oCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworCisKKworCisjaWZuZGVmIFRZUEVTX0gKKyNkZWZpbmUgVFlQRVNfSAorCisjaW5jbHVkZSAicGFja2V0LmgiCisjaW5jbHVkZSAiYml0YXJyYXkuaCIKKworI2RlZmluZSBCQVRfSEVBREVSX0xFTiAoc2l6ZW9mKHN0cnVjdCBldGhoZHIpICsgKChzaXplb2Yoc3RydWN0IHVuaWNhc3RfcGFja2V0KSA+IHNpemVvZihzdHJ1Y3QgYmNhc3RfcGFja2V0KSA/IHNpemVvZihzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQpIDogc2l6ZW9mKHN0cnVjdCBiY2FzdF9wYWNrZXQpKSkpCisKKworc3RydWN0IGJhdG1hbl9pZiB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWludDE2X3QgaWZfbnVtOworCWNoYXIgKmRldjsKKwljaGFyIGlmX2FjdGl2ZTsKKwljaGFyIGFkZHJfc3RyW0VUSF9TVFJfTEVOXTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldjsKKwlzdHJ1Y3Qgc29ja2V0ICpyYXdfc29jazsKKwlhdG9taWNfdCBzZXFubzsKKwl1bnNpZ25lZCBjaGFyICpwYWNrZXRfYnVmZjsKKwlpbnQgcGFja2V0X2xlbjsKKwlzdHJ1Y3QgcmN1X2hlYWQgcmN1OworCit9OworCitzdHJ1Y3Qgb3JpZ19ub2RlIHsgICAgICAgICAgICAgICAvKiBzdHJ1Y3R1cmUgZm9yIG9yaWdfbGlzdCBtYWludGFpbmluZyBub2RlcyBvZiBtZXNoICovCisJdWludDhfdCBvcmlnW0VUSF9BTEVOXTsKKwlzdHJ1Y3QgbmVpZ2hfbm9kZSAqcm91dGVyOworCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKKwlUWVBFX09GX1dPUkQgKmJjYXN0X293bjsKKwl1aW50OF90ICpiY2FzdF9vd25fc3VtOworCXVpbnQ4X3QgdHFfb3duOworCWludCB0cV9hc3ltX3BlbmFsdHk7CisJdW5zaWduZWQgbG9uZyBsYXN0X3ZhbGlkOyAgICAgICAgLyogd2hlbiBsYXN0IHBhY2tldCBmcm9tIHRoaXMgbm9kZSB3YXMgcmVjZWl2ZWQgKi8KKy8qCXVpbnQ4X3QgIGd3ZmxhZ3M7ICAgICAgKiBmbGFncyByZWxhdGVkIHRvIGdhdGV3YXkgZnVuY3Rpb25zOiBnYXRld2F5IGNsYXNzICovCisJdWludDhfdCAgZmxhZ3M7ICAgIAkJLyogZm9yIG5vdyBvbmx5IFZJU19TRVJWRVIgZmxhZy4gKi8KKwl1bnNpZ25lZCBjaGFyICpobmFfYnVmZjsKKwlpbnQxNl90ICBobmFfYnVmZl9sZW47CisJdWludDE2X3QgbGFzdF9yZWFsX3NlcW5vOyAgIC8qIGxhc3QgYW5kIGJlc3Qga25vd24gc3F1ZW5jZSBudW1iZXIgKi8KKwl1aW50OF90IGxhc3RfdHRsOyAgICAgICAgIC8qIHR0bCBvZiBsYXN0IHJlY2VpdmVkIHBhY2tldCAqLworCVRZUEVfT0ZfV09SRCBiY2FzdF9iaXRzW05VTV9XT1JEU107CisJdWludDE2X3QgbGFzdF9iY2FzdF9zZXFubzsgIC8qIGxhc3QgYnJvYWRjYXN0IHNlcXVlbmNlIG51bWJlciByZWNlaXZlZCBieSB0aGlzIGhvc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIG5laWdoX2xpc3Q7Cit9OworCitzdHJ1Y3QgbmVpZ2hfbm9kZSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXVpbnQ4X3QgYWRkcltFVEhfQUxFTl07CisJdWludDhfdCByZWFsX3BhY2tldF9jb3VudDsKKwl1aW50OF90IHRxX3JlY3ZbVFFfR0xPQkFMX1dJTkRPV19TSVpFXTsKKwl1aW50OF90IHRxX2luZGV4OworCXVpbnQ4X3QgdHFfYXZnOworCXVpbnQ4X3QgbGFzdF90dGw7CisJdW5zaWduZWQgbG9uZyBsYXN0X3ZhbGlkOyAgICAgICAgICAgIC8qIHdoZW4gbGFzdCBwYWNrZXQgdmlhIHRoaXMgbmVpZ2hib3VyIHdhcyByZWNlaXZlZCAqLworCVRZUEVfT0ZfV09SRCByZWFsX2JpdHNbTlVNX1dPUkRTXTsKKwlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7CisJc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmc7Cit9OworCitzdHJ1Y3QgYmF0X3ByaXYgeworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworfTsKKworc3RydWN0IGRldmljZV9jbGllbnQgeworCXN0cnVjdCBsaXN0X2hlYWQgcXVldWVfbGlzdDsKKwl1bnNpZ25lZCBpbnQgcXVldWVfbGVuOworCXVuc2lnbmVkIGNoYXIgaW5kZXg7CisJc3BpbmxvY2tfdCBsb2NrOworCXdhaXRfcXVldWVfaGVhZF90IHF1ZXVlX3dhaXQ7Cit9OworCitzdHJ1Y3QgZGV2aWNlX3BhY2tldCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBpY21wX3BhY2tldCBpY21wX3BhY2tldDsKK307CisKK3N0cnVjdCBobmFfbG9jYWxfZW50cnkgeworCXVpbnQ4X3QgYWRkcltFVEhfQUxFTl07CisJdW5zaWduZWQgbG9uZyBsYXN0X3NlZW47CisJY2hhciBuZXZlcl9wdXJnZTsKK307CisKK3N0cnVjdCBobmFfZ2xvYmFsX2VudHJ5IHsKKwl1aW50OF90IGFkZHJbRVRIX0FMRU5dOworCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKK307CisKK3N0cnVjdCBmb3J3X3BhY2tldCB7ICAgICAgICAgICAgICAgLyogc3RydWN0dXJlIGZvciBmb3J3X2xpc3QgbWFpbnRhaW5pbmcgcGFja2V0cyB0byBiZSBzZW5kL2ZvcndhcmRlZCAqLworCXN0cnVjdCBobGlzdF9ub2RlIGxpc3Q7CisJdW5zaWduZWQgbG9uZyBzZW5kX3RpbWU7CisJdWludDhfdCBvd247CisJdW5zaWduZWQgY2hhciAqcGFja2V0X2J1ZmY7CisJdWludDE2X3QgcGFja2V0X2xlbjsKKwl1aW50MzJfdCBkaXJlY3RfbGlua19mbGFnczsKKwl1aW50OF90IG51bV9wYWNrZXRzOworCXN0cnVjdCBkZWxheWVkX3dvcmsgZGVsYXllZF93b3JrOworCXN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi92aXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3Zpcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YzlhY2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi92aXMuYwpAQCAtMCwwICsxLDU2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogU2ltb24gV3VuZGVybGljaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAic2VuZC5oIgorI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCisjaW5jbHVkZSAidmlzLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAic29mdC1pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJoYXJkLWludGVyZmFjZS5oIgorI2luY2x1ZGUgImhhc2guaCIKKyNpbmNsdWRlICJjb21wYXQuaCIKKworc3RydWN0IGhhc2h0YWJsZV90ICp2aXNfaGFzaDsKK0RFRklORV9TUElOTE9DSyh2aXNfaGFzaF9sb2NrKTsKK3N0YXRpYyBzdHJ1Y3QgdmlzX2luZm8gKm15X3Zpc19pbmZvOworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgc2VuZF9saXN0OwkvKiBhbHdheXMgbG9ja2VkIHdpdGggdmlzX2hhc2hfbG9jayAqLworCitzdGF0aWMgdm9pZCBzdGFydF92aXNfdGltZXIodm9pZCk7CisKKy8qIGZyZWUgdGhlIGluZm8gKi8KK3N0YXRpYyB2b2lkIGZyZWVfaW5mbyh2b2lkICpkYXRhKQoreworCXN0cnVjdCB2aXNfaW5mbyAqaW5mbyA9IGRhdGE7CisJc3RydWN0IHJlY3ZsaXN0X25vZGUgKmVudHJ5LCAqdG1wOworCisJbGlzdF9kZWxfaW5pdCgmaW5mby0+c2VuZF9saXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIHRtcCwgJmluZm8tPnJlY3ZfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmZW50cnktPmxpc3QpOworCQlrZnJlZShlbnRyeSk7CisJfQorCWtmcmVlKGluZm8pOworfQorCisvKiBzZXQgdGhlIG1vZGUgb2YgdGhlIHZpc3VhbGl6YXRpb24gdG8gY2xpZW50IG9yIHNlcnZlciAqLwordm9pZCB2aXNfc2V0X21vZGUoaW50IG1vZGUpCit7CisJc3Bpbl9sb2NrKCZ2aXNfaGFzaF9sb2NrKTsKKworCWlmIChteV92aXNfaW5mbyAhPSBOVUxMKQorCQlteV92aXNfaW5mby0+cGFja2V0LnZpc190eXBlID0gbW9kZTsKKworCXNwaW5fdW5sb2NrKCZ2aXNfaGFzaF9sb2NrKTsKK30KKworLyogaXNfdmlzX3NlcnZlcigpLCBsb2NrZWQgb3V0c2lkZSAqLworc3RhdGljIGludCBpc192aXNfc2VydmVyX2xvY2tlZCh2b2lkKQoreworCWlmIChteV92aXNfaW5mbyAhPSBOVUxMKQorCQlpZiAobXlfdmlzX2luZm8tPnBhY2tldC52aXNfdHlwZSA9PSBWSVNfVFlQRV9TRVJWRVJfU1lOQykKKwkJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGdldCB0aGUgY3VycmVudCBzZXQgbW9kZSAqLworaW50IGlzX3Zpc19zZXJ2ZXIodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9jaygmdmlzX2hhc2hfbG9jayk7CisJcmV0ID0gaXNfdmlzX3NlcnZlcl9sb2NrZWQoKTsKKwlzcGluX3VubG9jaygmdmlzX2hhc2hfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBDb21wYXJlIHR3byB2aXMgcGFja2V0cywgdXNlZCBieSB0aGUgaGFzaGluZyBhbGdvcml0aG0gKi8KK3N0YXRpYyBpbnQgdmlzX2luZm9fY21wKHZvaWQgKmRhdGExLCB2b2lkICpkYXRhMikKK3sKKwlzdHJ1Y3QgdmlzX2luZm8gKmQxLCAqZDI7CisJZDEgPSBkYXRhMTsKKwlkMiA9IGRhdGEyOworCXJldHVybiBjb21wYXJlX29yaWcoZDEtPnBhY2tldC52aXNfb3JpZywgZDItPnBhY2tldC52aXNfb3JpZyk7Cit9CisKKy8qIGhhc2ggZnVuY3Rpb24gdG8gY2hvb3NlIGFuIGVudHJ5IGluIGEgaGFzaCB0YWJsZSBvZiBnaXZlbiBzaXplICovCisvKiBoYXNoIGFsZ29yaXRobSBmcm9tIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSGFzaF90YWJsZSAqLworc3RhdGljIGludCB2aXNfaW5mb19jaG9vc2Uodm9pZCAqZGF0YSwgaW50IHNpemUpCit7CisJc3RydWN0IHZpc19pbmZvICp2aXNfaW5mbyA9IGRhdGE7CisJdW5zaWduZWQgY2hhciAqa2V5OworCXVpbnQzMl90IGhhc2ggPSAwOworCXNpemVfdCBpOworCisJa2V5ID0gdmlzX2luZm8tPnBhY2tldC52aXNfb3JpZzsKKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykgeworCQloYXNoICs9IGtleVtpXTsKKwkJaGFzaCArPSAoaGFzaCA8PCAxMCk7CisJCWhhc2ggXj0gKGhhc2ggPj4gNik7CisJfQorCisJaGFzaCArPSAoaGFzaCA8PCAzKTsKKwloYXNoIF49IChoYXNoID4+IDExKTsKKwloYXNoICs9IChoYXNoIDw8IDE1KTsKKworCXJldHVybiBoYXNoICUgc2l6ZTsKK30KKworLyogdHJpZXMgdG8gYWRkIG9uZSBlbnRyeSB0byB0aGUgcmVjZWl2ZSBsaXN0LiAqLworc3RhdGljIHZvaWQgcmVjdl9saXN0X2FkZChzdHJ1Y3QgbGlzdF9oZWFkICpyZWN2X2xpc3QsIGNoYXIgKm1hYykKK3sKKwlzdHJ1Y3QgcmVjdmxpc3Rfbm9kZSAqZW50cnk7CisJZW50cnkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVjdmxpc3Rfbm9kZSksIEdGUF9BVE9NSUMpOworCWlmICghZW50cnkpCisJCXJldHVybjsKKworCW1lbWNweShlbnRyeS0+bWFjLCBtYWMsIEVUSF9BTEVOKTsKKwlsaXN0X2FkZF90YWlsKCZlbnRyeS0+bGlzdCwgcmVjdl9saXN0KTsKK30KKworLyogcmV0dXJucyAxIGlmIHRoaXMgbWFjIGlzIGluIHRoZSByZWN2X2xpc3QgKi8KK3N0YXRpYyBpbnQgcmVjdl9saXN0X2lzX2luKHN0cnVjdCBsaXN0X2hlYWQgKnJlY3ZfbGlzdCwgY2hhciAqbWFjKQoreworCXN0cnVjdCByZWN2bGlzdF9ub2RlICplbnRyeTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksIHJlY3ZfbGlzdCwgbGlzdCkgeworCQlpZiAobWVtY21wKGVudHJ5LT5tYWMsIG1hYywgRVRIX0FMRU4pID09IDApCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogdHJ5IHRvIGFkZCB0aGUgcGFja2V0IHRvIHRoZSB2aXNfaGFzaC4gcmV0dXJuIE5VTEwgaWYgaW52YWxpZCAoZS5nLiB0b28gb2xkLAorICogYnJva2VuLi4gKS4gIHZpcyBoYXNoIG11c3QgYmUgbG9ja2VkIG91dHNpZGUuICBpc19uZXcgaXMgc2V0IHdoZW4gdGhlIHBhY2tldAorICogaXMgbmV3ZXIgdGhhbiBvbGQgZW50cmllcyBpbiB0aGUgaGFzaC4gKi8KK3N0YXRpYyBzdHJ1Y3QgdmlzX2luZm8gKmFkZF9wYWNrZXQoc3RydWN0IHZpc19wYWNrZXQgKnZpc19wYWNrZXQsCisJCQkJICAgaW50IHZpc19pbmZvX2xlbiwgaW50ICppc19uZXcpCit7CisJc3RydWN0IHZpc19pbmZvICppbmZvLCAqb2xkX2luZm87CisJc3RydWN0IHZpc19pbmZvIHNlYXJjaF9lbGVtOworCisJKmlzX25ldyA9IDA7CisJLyogc2FuaXR5IGNoZWNrICovCisJaWYgKHZpc19oYXNoID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJLyogc2VlIGlmIHRoZSBwYWNrZXQgaXMgYWxyZWFkeSBpbiB2aXNfaGFzaCAqLworCW1lbWNweShzZWFyY2hfZWxlbS5wYWNrZXQudmlzX29yaWcsIHZpc19wYWNrZXQtPnZpc19vcmlnLCBFVEhfQUxFTik7CisJb2xkX2luZm8gPSBoYXNoX2ZpbmQodmlzX2hhc2gsICZzZWFyY2hfZWxlbSk7CisKKwlpZiAob2xkX2luZm8gIT0gTlVMTCkgeworCQlpZiAodmlzX3BhY2tldC0+c2Vxbm8gLSBvbGRfaW5mby0+cGFja2V0LnNlcW5vIDw9IDApIHsKKwkJCWlmIChvbGRfaW5mby0+cGFja2V0LnNlcW5vID09IHZpc19wYWNrZXQtPnNlcW5vKSB7CisJCQkJcmVjdl9saXN0X2FkZCgmb2xkX2luZm8tPnJlY3ZfbGlzdCwKKwkJCQkJICAgICAgdmlzX3BhY2tldC0+c2VuZGVyX29yaWcpOworCQkJCXJldHVybiBvbGRfaW5mbzsKKwkJCX0gZWxzZSB7CisJCQkJLyogbmV3ZXIgcGFja2V0IGlzIGFscmVhZHkgaW4gaGFzaC4gKi8KKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCQkvKiByZW1vdmUgb2xkIGVudHJ5ICovCisJCWhhc2hfcmVtb3ZlKHZpc19oYXNoLCBvbGRfaW5mbyk7CisJCWZyZWVfaW5mbyhvbGRfaW5mbyk7CisJfQorCisJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2aXNfaW5mbykgKyB2aXNfaW5mb19sZW4sIEdGUF9BVE9NSUMpOworCWlmIChpbmZvID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJSU5JVF9MSVNUX0hFQUQoJmluZm8tPnNlbmRfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmluZm8tPnJlY3ZfbGlzdCk7CisJaW5mby0+Zmlyc3Rfc2VlbiA9IGppZmZpZXM7CisJbWVtY3B5KCZpbmZvLT5wYWNrZXQsIHZpc19wYWNrZXQsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgdmlzX3BhY2tldCkgKyB2aXNfaW5mb19sZW4pOworCisJLyogaW5pdGlhbGl6ZSBhbmQgYWRkIG5ldyBwYWNrZXQuICovCisJKmlzX25ldyA9IDE7CisKKwkvKiByZXBhaXIgaWYgZW50cmllcyBpcyBsb25nZXIgdGhhbiBwYWNrZXQuICovCisJaWYgKGluZm8tPnBhY2tldC5lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCB2aXNfaW5mb19lbnRyeSkgPiB2aXNfaW5mb19sZW4pCisJCWluZm8tPnBhY2tldC5lbnRyaWVzID0gdmlzX2luZm9fbGVuIC8gc2l6ZW9mKHN0cnVjdCB2aXNfaW5mb19lbnRyeSk7CisKKwlyZWN2X2xpc3RfYWRkKCZpbmZvLT5yZWN2X2xpc3QsIGluZm8tPnBhY2tldC5zZW5kZXJfb3JpZyk7CisKKwkvKiB0cnkgdG8gYWRkIGl0ICovCisJaWYgKGhhc2hfYWRkKHZpc19oYXNoLCBpbmZvKSA8IDApIHsKKwkJLyogZGlkIG5vdCB3b3JrIChmb3Igc29tZSByZWFzb24pICovCisJCWZyZWVfaW5mbyhpbmZvKTsKKwkJaW5mbyA9IE5VTEw7CisJfQorCisJcmV0dXJuIGluZm87Cit9CisKKy8qIGhhbmRsZSB0aGUgc2VydmVyIHN5bmMgcGFja2V0LCBmb3J3YXJkIGlmIG5lZWRlZC4gKi8KK3ZvaWQgcmVjZWl2ZV9zZXJ2ZXJfc3luY19wYWNrZXQoc3RydWN0IHZpc19wYWNrZXQgKnZpc19wYWNrZXQsIGludCB2aXNfaW5mb19sZW4pCit7CisJc3RydWN0IHZpc19pbmZvICppbmZvOworCWludCBpc19uZXc7CisKKwlzcGluX2xvY2soJnZpc19oYXNoX2xvY2spOworCWluZm8gPSBhZGRfcGFja2V0KHZpc19wYWNrZXQsIHZpc19pbmZvX2xlbiwgJmlzX25ldyk7CisJaWYgKGluZm8gPT0gTlVMTCkKKwkJZ290byBlbmQ7CisKKwkvKiBvbmx5IGlmIHdlIGFyZSBzZXJ2ZXIgb3Vyc2VsdmVzIGFuZCBwYWNrZXQgaXMgbmV3ZXIgdGhhbiB0aGUgb25lIGluCisJICogaGFzaC4qLworCWlmIChpc192aXNfc2VydmVyX2xvY2tlZCgpICYmIGlzX25ldykgeworCQltZW1jcHkoaW5mby0+cGFja2V0LnRhcmdldF9vcmlnLCBicm9hZGNhc3RBZGRyLCBFVEhfQUxFTik7CisJCWlmIChsaXN0X2VtcHR5KCZpbmZvLT5zZW5kX2xpc3QpKQorCQkJbGlzdF9hZGRfdGFpbCgmaW5mby0+c2VuZF9saXN0LCAmc2VuZF9saXN0KTsKKwl9CitlbmQ6CisJc3Bpbl91bmxvY2soJnZpc19oYXNoX2xvY2spOworfQorCisvKiBoYW5kbGUgYW4gaW5jb21pbmcgY2xpZW50IHVwZGF0ZSBwYWNrZXQgYW5kIHNjaGVkdWxlIGZvcndhcmQgaWYgbmVlZGVkLiAqLwordm9pZCByZWNlaXZlX2NsaWVudF91cGRhdGVfcGFja2V0KHN0cnVjdCB2aXNfcGFja2V0ICp2aXNfcGFja2V0LAorCQkJCSAgaW50IHZpc19pbmZvX2xlbikKK3sKKwlzdHJ1Y3QgdmlzX2luZm8gKmluZm87CisJaW50IGlzX25ldzsKKworCS8qIGNsaWVudHMgc2hhbGwgbm90IGJyb2FkY2FzdC4gKi8KKwlpZiAoaXNfYmNhc3QodmlzX3BhY2tldC0+dGFyZ2V0X29yaWcpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2soJnZpc19oYXNoX2xvY2spOworCWluZm8gPSBhZGRfcGFja2V0KHZpc19wYWNrZXQsIHZpc19pbmZvX2xlbiwgJmlzX25ldyk7CisJaWYgKGluZm8gPT0gTlVMTCkKKwkJZ290byBlbmQ7CisJLyogbm90ZSB0aGF0IG91dGRhdGVkIHBhY2tldHMgd2lsbCBiZSBkcm9wcGVkIGF0IHRoaXMgcG9pbnQuICovCisKKworCS8qIHNlbmQgb25seSBpZiB3ZSdyZSB0aGUgdGFyZ2V0IHNlcnZlciBvciAuLi4gKi8KKwlpZiAoaXNfdmlzX3NlcnZlcl9sb2NrZWQoKSAmJgorCSAgICBpc19teV9tYWMoaW5mby0+cGFja2V0LnRhcmdldF9vcmlnKSAmJgorCSAgICBpc19uZXcpIHsKKwkJaW5mby0+cGFja2V0LnZpc190eXBlID0gVklTX1RZUEVfU0VSVkVSX1NZTkM7CS8qIHVwZ3JhZGUhICovCisJCW1lbWNweShpbmZvLT5wYWNrZXQudGFyZ2V0X29yaWcsIGJyb2FkY2FzdEFkZHIsIEVUSF9BTEVOKTsKKwkJaWYgKGxpc3RfZW1wdHkoJmluZm8tPnNlbmRfbGlzdCkpCisJCQlsaXN0X2FkZF90YWlsKCZpbmZvLT5zZW5kX2xpc3QsICZzZW5kX2xpc3QpOworCisJCS8qIC4uLiB3ZSdyZSBub3QgdGhlIHJlY2lwaWVudCAoYW5kIHRodXMgbmVlZCB0byBmb3J3YXJkKS4gKi8KKwl9IGVsc2UgaWYgKCFpc19teV9tYWMoaW5mby0+cGFja2V0LnRhcmdldF9vcmlnKSkgeworCQlpZiAobGlzdF9lbXB0eSgmaW5mby0+c2VuZF9saXN0KSkKKwkJCWxpc3RfYWRkX3RhaWwoJmluZm8tPnNlbmRfbGlzdCwgJnNlbmRfbGlzdCk7CisJfQorZW5kOgorCXNwaW5fdW5sb2NrKCZ2aXNfaGFzaF9sb2NrKTsKK30KKworLyogV2FsayB0aGUgb3JpZ2luYXRvcnMgYW5kIGZpbmQgdGhlIFZJUyBzZXJ2ZXIgd2l0aCB0aGUgYmVzdCB0cS4gU2V0IHRoZSBwYWNrZXQKKyAqIGFkZHJlc3MgdG8gaXRzIGFkZHJlc3MgYW5kIHJldHVybiB0aGUgYmVzdF90cS4KKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBvcmlnaW5hdG9yIGhhc2ggbG9ja2VkICovCitzdGF0aWMgaW50IGZpbmRfYmVzdF92aXNfc2VydmVyKHN0cnVjdCB2aXNfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgaGFzaF9pdF90ICpoYXNoaXQgPSBOVUxMOworCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKKwlpbnQgYmVzdF90cSA9IC0xOworCisJd2hpbGUgKE5VTEwgIT0gKGhhc2hpdCA9IGhhc2hfaXRlcmF0ZShvcmlnX2hhc2gsIGhhc2hpdCkpKSB7CisJCW9yaWdfbm9kZSA9IGhhc2hpdC0+YnVja2V0LT5kYXRhOworCQlpZiAoKG9yaWdfbm9kZSAhPSBOVUxMKSAmJgorCQkgICAgKG9yaWdfbm9kZS0+cm91dGVyICE9IE5VTEwpICYmCisJCSAgICAob3JpZ19ub2RlLT5mbGFncyAmIFZJU19TRVJWRVIpICYmCisJCSAgICAob3JpZ19ub2RlLT5yb3V0ZXItPnRxX2F2ZyA+IGJlc3RfdHEpKSB7CisJCQliZXN0X3RxID0gb3JpZ19ub2RlLT5yb3V0ZXItPnRxX2F2ZzsKKwkJCW1lbWNweShpbmZvLT5wYWNrZXQudGFyZ2V0X29yaWcsIG9yaWdfbm9kZS0+b3JpZywKKwkJCSAgICAgICBFVEhfQUxFTik7CisJCX0KKwl9CisJcmV0dXJuIGJlc3RfdHE7Cit9CisKKy8qIFJldHVybiB0cnVlIGlmIHRoZSB2aXMgcGFja2V0IGlzIGZ1bGwuICovCitzdGF0aWMgYm9vbCB2aXNfcGFja2V0X2Z1bGwoc3RydWN0IHZpc19pbmZvICppbmZvKQoreworCWlmIChpbmZvLT5wYWNrZXQuZW50cmllcyArIDEgPgorCSAgICAoMTAwMCAtIHNpemVvZihzdHJ1Y3QgdmlzX2luZm8pKSAvIHNpemVvZihzdHJ1Y3QgdmlzX2luZm9fZW50cnkpKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qIGdlbmVyYXRlcyBhIHBhY2tldCBvZiBvd24gdmlzIGRhdGEsCisgKiByZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgaWYgbm8gcGFja2V0IGNvdWxkIGJlIGdlbmVyYXRlZCAqLworc3RhdGljIGludCBnZW5lcmF0ZV92aXNfcGFja2V0KHZvaWQpCit7CisJc3RydWN0IGhhc2hfaXRfdCAqaGFzaGl0ID0gTlVMTDsKKwlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7CisJc3RydWN0IHZpc19pbmZvICppbmZvID0gKHN0cnVjdCB2aXNfaW5mbyAqKW15X3Zpc19pbmZvOworCXN0cnVjdCB2aXNfaW5mb19lbnRyeSAqZW50cnksICplbnRyeV9hcnJheTsKKwlzdHJ1Y3QgaG5hX2xvY2FsX2VudHJ5ICpobmFfbG9jYWxfZW50cnk7CisJaW50IGJlc3RfdHEgPSAtMTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaW5mby0+Zmlyc3Rfc2VlbiA9IGppZmZpZXM7CisKKwlzcGluX2xvY2soJm9yaWdfaGFzaF9sb2NrKTsKKwltZW1jcHkoaW5mby0+cGFja2V0LnRhcmdldF9vcmlnLCBicm9hZGNhc3RBZGRyLCBFVEhfQUxFTik7CisJaW5mby0+cGFja2V0LnR0bCA9IFRUTDsKKwlpbmZvLT5wYWNrZXQuc2Vxbm8rKzsKKwlpbmZvLT5wYWNrZXQuZW50cmllcyA9IDA7CisKKwlpZiAoIWlzX3Zpc19zZXJ2ZXJfbG9ja2VkKCkpIHsKKwkJYmVzdF90cSA9IGZpbmRfYmVzdF92aXNfc2VydmVyKGluZm8pOworCQlpZiAoYmVzdF90cSA8IDApIHsKKwkJCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJaGFzaGl0ID0gTlVMTDsKKworCWVudHJ5X2FycmF5ID0gKHN0cnVjdCB2aXNfaW5mb19lbnRyeSAqKQorCQkoKGNoYXIgKilpbmZvICsgc2l6ZW9mKHN0cnVjdCB2aXNfaW5mbykpOworCisJd2hpbGUgKE5VTEwgIT0gKGhhc2hpdCA9IGhhc2hfaXRlcmF0ZShvcmlnX2hhc2gsIGhhc2hpdCkpKSB7CisJCW9yaWdfbm9kZSA9IGhhc2hpdC0+YnVja2V0LT5kYXRhOworCQlpZiAob3JpZ19ub2RlLT5yb3V0ZXIgIT0gTlVMTAorCQkJJiYgY29tcGFyZV9vcmlnKG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyLCBvcmlnX25vZGUtPm9yaWcpCisJCQkmJiBvcmlnX25vZGUtPmJhdG1hbl9pZgorCQkJJiYgKG9yaWdfbm9kZS0+YmF0bWFuX2lmLT5pZl9hY3RpdmUgPT0gSUZfQUNUSVZFKQorCQkgICAgJiYgb3JpZ19ub2RlLT5yb3V0ZXItPnRxX2F2ZyA+IDApIHsKKworCQkJLyogZmlsbCBvbmUgZW50cnkgaW50byBidWZmZXIuICovCisJCQllbnRyeSA9ICZlbnRyeV9hcnJheVtpbmZvLT5wYWNrZXQuZW50cmllc107CisJCQltZW1jcHkoZW50cnktPnNyYywgb3JpZ19ub2RlLT5iYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJCQltZW1jcHkoZW50cnktPmRlc3QsIG9yaWdfbm9kZS0+b3JpZywgRVRIX0FMRU4pOworCQkJZW50cnktPnF1YWxpdHkgPSBvcmlnX25vZGUtPnJvdXRlci0+dHFfYXZnOworCQkJaW5mby0+cGFja2V0LmVudHJpZXMrKzsKKworCQkJaWYgKHZpc19wYWNrZXRfZnVsbChpbmZvKSkgeworCQkJCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisKKwlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworCisJaGFzaGl0ID0gTlVMTDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaG5hX2xvY2FsX2hhc2hfbG9jaywgZmxhZ3MpOworCXdoaWxlIChOVUxMICE9IChoYXNoaXQgPSBoYXNoX2l0ZXJhdGUoaG5hX2xvY2FsX2hhc2gsIGhhc2hpdCkpKSB7CisJCWhuYV9sb2NhbF9lbnRyeSA9IGhhc2hpdC0+YnVja2V0LT5kYXRhOworCQllbnRyeSA9ICZlbnRyeV9hcnJheVtpbmZvLT5wYWNrZXQuZW50cmllc107CisJCW1lbXNldChlbnRyeS0+c3JjLCAwLCBFVEhfQUxFTik7CisJCW1lbWNweShlbnRyeS0+ZGVzdCwgaG5hX2xvY2FsX2VudHJ5LT5hZGRyLCBFVEhfQUxFTik7CisJCWVudHJ5LT5xdWFsaXR5ID0gMDsgLyogMCBtZWFucyBITkEgKi8KKwkJaW5mby0+cGFja2V0LmVudHJpZXMrKzsKKworCQlpZiAodmlzX3BhY2tldF9mdWxsKGluZm8pKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZobmFfbG9jYWxfaGFzaF9sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZobmFfbG9jYWxfaGFzaF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHB1cmdlX3Zpc19wYWNrZXRzKHZvaWQpCit7CisJc3RydWN0IGhhc2hfaXRfdCAqaGFzaGl0ID0gTlVMTDsKKwlzdHJ1Y3QgdmlzX2luZm8gKmluZm87CisKKwl3aGlsZSAoTlVMTCAhPSAoaGFzaGl0ID0gaGFzaF9pdGVyYXRlKHZpc19oYXNoLCBoYXNoaXQpKSkgeworCQlpbmZvID0gaGFzaGl0LT5idWNrZXQtPmRhdGE7CisJCWlmIChpbmZvID09IG15X3Zpc19pbmZvKQkvKiBuZXZlciBwdXJnZSBvd24gZGF0YS4gKi8KKwkJCWNvbnRpbnVlOworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLAorCQkJICAgICAgIGluZm8tPmZpcnN0X3NlZW4gKyAoVklTX1RJTUVPVVQvMTAwMCkqSFopKSB7CisJCQloYXNoX3JlbW92ZV9idWNrZXQodmlzX2hhc2gsIGhhc2hpdCk7CisJCQlmcmVlX2luZm8oaW5mbyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJyb2FkY2FzdF92aXNfcGFja2V0KHN0cnVjdCB2aXNfaW5mbyAqaW5mbywgaW50IHBhY2tldF9sZW5ndGgpCit7CisJc3RydWN0IGhhc2hfaXRfdCAqaGFzaGl0ID0gTlVMTDsKKwlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7CisKKwlzcGluX2xvY2soJm9yaWdfaGFzaF9sb2NrKTsKKworCS8qIHNlbmQgdG8gYWxsIHJvdXRlcnMgaW4gcmFuZ2UuICovCisJd2hpbGUgKE5VTEwgIT0gKGhhc2hpdCA9IGhhc2hfaXRlcmF0ZShvcmlnX2hhc2gsIGhhc2hpdCkpKSB7CisJCW9yaWdfbm9kZSA9IGhhc2hpdC0+YnVja2V0LT5kYXRhOworCisJCS8qIGlmIGl0J3MgYSB2aXMgc2VydmVyIGFuZCByZWFjaGFibGUsIHNlbmQgaXQuICovCisJCWlmIChvcmlnX25vZGUgJiYKKwkJICAgIChvcmlnX25vZGUtPmZsYWdzICYgVklTX1NFUlZFUikgJiYKKwkJICAgIG9yaWdfbm9kZS0+YmF0bWFuX2lmICYmCisJCSAgICBvcmlnX25vZGUtPnJvdXRlcikgeworCisJCQkvKiBkb24ndCBzZW5kIGl0IGlmIHdlIGFscmVhZHkgcmVjZWl2ZWQgdGhlIHBhY2tldCBmcm9tCisJCQkgKiB0aGlzIG5vZGUuICovCisJCQlpZiAocmVjdl9saXN0X2lzX2luKCZpbmZvLT5yZWN2X2xpc3QsIG9yaWdfbm9kZS0+b3JpZykpCisJCQkJY29udGludWU7CisKKwkJCW1lbWNweShpbmZvLT5wYWNrZXQudGFyZ2V0X29yaWcsCisJCQkgICAgICAgb3JpZ19ub2RlLT5vcmlnLCBFVEhfQUxFTik7CisKKwkJCXNlbmRfcmF3X3BhY2tldCgodW5zaWduZWQgY2hhciAqKSAmaW5mby0+cGFja2V0LAorCQkJCQlwYWNrZXRfbGVuZ3RoLAorCQkJCQlvcmlnX25vZGUtPmJhdG1hbl9pZiwKKwkJCQkJb3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIpOworCQl9CisJfQorCW1lbWNweShpbmZvLT5wYWNrZXQudGFyZ2V0X29yaWcsIGJyb2FkY2FzdEFkZHIsIEVUSF9BTEVOKTsKKwlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworfQorCitzdGF0aWMgdm9pZCB1bmljYXN0X3Zpc19wYWNrZXQoc3RydWN0IHZpc19pbmZvICppbmZvLCBpbnQgcGFja2V0X2xlbmd0aCkKK3sKKwlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7CisKKwlzcGluX2xvY2soJm9yaWdfaGFzaF9sb2NrKTsKKwlvcmlnX25vZGUgPSAoKHN0cnVjdCBvcmlnX25vZGUgKikKKwkJICAgICBoYXNoX2ZpbmQob3JpZ19oYXNoLCBpbmZvLT5wYWNrZXQudGFyZ2V0X29yaWcpKTsKKworCWlmICgob3JpZ19ub2RlICE9IE5VTEwpICYmCisJICAgIChvcmlnX25vZGUtPmJhdG1hbl9pZiAhPSBOVUxMKSAmJgorCSAgICAob3JpZ19ub2RlLT5yb3V0ZXIgIT0gTlVMTCkpIHsKKwkJc2VuZF9yYXdfcGFja2V0KCh1bnNpZ25lZCBjaGFyICopICZpbmZvLT5wYWNrZXQsIHBhY2tldF9sZW5ndGgsCisJCQkJb3JpZ19ub2RlLT5iYXRtYW5faWYsCisJCQkJb3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIpOworCX0KKwlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworfQorCisvKiBvbmx5IHNlbmQgb25lIHZpcyBwYWNrZXQuIGNhbGxlZCBmcm9tIHNlbmRfdmlzX3BhY2tldHMoKSAqLworc3RhdGljIHZvaWQgc2VuZF92aXNfcGFja2V0KHN0cnVjdCB2aXNfaW5mbyAqaW5mbykKK3sKKwlpbnQgcGFja2V0X2xlbmd0aDsKKworCWlmIChpbmZvLT5wYWNrZXQudHRsIDwgMikgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfTk9USUNFLAorCQkJICAiRXJyb3IgLSBjYW4ndCBzZW5kIHZpcyBwYWNrZXQ6IHR0bCBleGNlZWRlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwltZW1jcHkoaW5mby0+cGFja2V0LnNlbmRlcl9vcmlnLCBtYWluSWZBZGRyLCBFVEhfQUxFTik7CisJaW5mby0+cGFja2V0LnR0bC0tOworCisJcGFja2V0X2xlbmd0aCA9IHNpemVvZihzdHJ1Y3QgdmlzX3BhY2tldCkgKworCQlpbmZvLT5wYWNrZXQuZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgdmlzX2luZm9fZW50cnkpOworCisJaWYgKGlzX2JjYXN0KGluZm8tPnBhY2tldC50YXJnZXRfb3JpZykpCisJCWJyb2FkY2FzdF92aXNfcGFja2V0KGluZm8sIHBhY2tldF9sZW5ndGgpOworCWVsc2UKKwkJdW5pY2FzdF92aXNfcGFja2V0KGluZm8sIHBhY2tldF9sZW5ndGgpOworCWluZm8tPnBhY2tldC50dGwrKzsgLyogcmVzdG9yZSBUVEwgKi8KK30KKworLyogY2FsbGVkIGZyb20gdGltZXI7IHNlbmQgKGFuZCBtYXliZSBnZW5lcmF0ZSkgdmlzIHBhY2tldC4gKi8KK3N0YXRpYyB2b2lkIHNlbmRfdmlzX3BhY2tldHMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB2aXNfaW5mbyAqaW5mbywgKnRlbXA7CisKKwlzcGluX2xvY2soJnZpc19oYXNoX2xvY2spOworCXB1cmdlX3Zpc19wYWNrZXRzKCk7CisKKwlpZiAoZ2VuZXJhdGVfdmlzX3BhY2tldCgpID09IDApCisJCS8qIHNjaGVkdWxlIGlmIGdlbmVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgKi8KKwkJbGlzdF9hZGRfdGFpbCgmbXlfdmlzX2luZm8tPnNlbmRfbGlzdCwgJnNlbmRfbGlzdCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaW5mbywgdGVtcCwgJnNlbmRfbGlzdCwgc2VuZF9saXN0KSB7CisJCWxpc3RfZGVsX2luaXQoJmluZm8tPnNlbmRfbGlzdCk7CisJCXNlbmRfdmlzX3BhY2tldChpbmZvKTsKKwl9CisJc3Bpbl91bmxvY2soJnZpc19oYXNoX2xvY2spOworCXN0YXJ0X3Zpc190aW1lcigpOworfQorc3RhdGljIERFQ0xBUkVfREVMQVlFRF9XT1JLKHZpc190aW1lcl93cSwgc2VuZF92aXNfcGFja2V0cyk7CisKKy8qIGluaXQgdGhlIHZpcyBzZXJ2ZXIuIHRoaXMgbWF5IG9ubHkgYmUgY2FsbGVkIHdoZW4gaWZfbGlzdCBpcyBhbHJlYWR5CisgKiBpbml0aWFsaXplZCAoZS5nLiBiYXQwIGlzIGluaXRpYWxpemVkLCBpbnRlcmZhY2VzIGhhdmUgYmVlbiBhZGRlZCkgKi8KK2ludCB2aXNfaW5pdCh2b2lkKQoreworCWlmICh2aXNfaGFzaCkKKwkJcmV0dXJuIDE7CisKKwlzcGluX2xvY2soJnZpc19oYXNoX2xvY2spOworCisJdmlzX2hhc2ggPSBoYXNoX25ldygyNTYsIHZpc19pbmZvX2NtcCwgdmlzX2luZm9fY2hvb3NlKTsKKwlpZiAoIXZpc19oYXNoKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9DUklULCAiQ2FuJ3QgaW5pdGlhbGl6ZSB2aXNfaGFzaFxuIik7CisJCWdvdG8gZXJyOworCX0KKworCW15X3Zpc19pbmZvID0ga21hbGxvYygxMDAwLCBHRlBfQVRPTUlDKTsKKwlpZiAoIW15X3Zpc19pbmZvKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9DUklULCAiQ2FuJ3QgaW5pdGlhbGl6ZSB2aXMgcGFja2V0XG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJLyogcHJlZmlsbCB0aGUgdmlzIGluZm8gKi8KKwlteV92aXNfaW5mby0+Zmlyc3Rfc2VlbiA9IGppZmZpZXMgLSBhdG9taWNfcmVhZCgmdmlzX2ludGVydmFsKTsKKwlJTklUX0xJU1RfSEVBRCgmbXlfdmlzX2luZm8tPnJlY3ZfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJm15X3Zpc19pbmZvLT5zZW5kX2xpc3QpOworCW15X3Zpc19pbmZvLT5wYWNrZXQudmVyc2lvbiA9IENPTVBBVF9WRVJTSU9OOworCW15X3Zpc19pbmZvLT5wYWNrZXQucGFja2V0X3R5cGUgPSBCQVRfVklTOworCW15X3Zpc19pbmZvLT5wYWNrZXQudmlzX3R5cGUgPSBWSVNfVFlQRV9DTElFTlRfVVBEQVRFOworCW15X3Zpc19pbmZvLT5wYWNrZXQudHRsID0gVFRMOworCW15X3Zpc19pbmZvLT5wYWNrZXQuc2Vxbm8gPSAwOworCW15X3Zpc19pbmZvLT5wYWNrZXQuZW50cmllcyA9IDA7CisKKwlJTklUX0xJU1RfSEVBRCgmc2VuZF9saXN0KTsKKworCW1lbWNweShteV92aXNfaW5mby0+cGFja2V0LnZpc19vcmlnLCBtYWluSWZBZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KG15X3Zpc19pbmZvLT5wYWNrZXQuc2VuZGVyX29yaWcsIG1haW5JZkFkZHIsIEVUSF9BTEVOKTsKKworCWlmIChoYXNoX2FkZCh2aXNfaGFzaCwgbXlfdmlzX2luZm8pIDwgMCkgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfQ1JJVCwKKwkJCSAgIkNhbid0IGFkZCBvd24gdmlzIHBhY2tldCBpbnRvIGhhc2hcbiIpOworCQlmcmVlX2luZm8obXlfdmlzX2luZm8pOwkvKiBub3QgaW4gaGFzaCwgbmVlZCB0byByZW1vdmUgaXQKKwkJCQkJICogbWFudWFsbHkuICovCisJCWdvdG8gZXJyOworCX0KKworCXNwaW5fdW5sb2NrKCZ2aXNfaGFzaF9sb2NrKTsKKwlzdGFydF92aXNfdGltZXIoKTsKKwlyZXR1cm4gMTsKKworZXJyOgorCXNwaW5fdW5sb2NrKCZ2aXNfaGFzaF9sb2NrKTsKKwl2aXNfcXVpdCgpOworCXJldHVybiAwOworfQorCisvKiBzaHV0ZG93biB2aXMtc2VydmVyICovCit2b2lkIHZpc19xdWl0KHZvaWQpCit7CisJaWYgKCF2aXNfaGFzaCkKKwkJcmV0dXJuOworCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ2aXNfdGltZXJfd3EpOworCisJc3Bpbl9sb2NrKCZ2aXNfaGFzaF9sb2NrKTsKKwkvKiBwcm9wZXJseSByZW1vdmUsIGtpbGwgdGltZXJzIC4uLiAqLworCWhhc2hfZGVsZXRlKHZpc19oYXNoLCBmcmVlX2luZm8pOworCXZpc19oYXNoID0gTlVMTDsKKwlteV92aXNfaW5mbyA9IE5VTEw7CisJc3Bpbl91bmxvY2soJnZpc19oYXNoX2xvY2spOworfQorCisvKiBzY2hlZHVsZSBwYWNrZXRzIGZvciAocmUpdHJhbnNtaXNzaW9uICovCitzdGF0aWMgdm9pZCBzdGFydF92aXNfdGltZXIodm9pZCkKK3sKKwlxdWV1ZV9kZWxheWVkX3dvcmsoYmF0X2V2ZW50X3dvcmtxdWV1ZSwgJnZpc190aW1lcl93cSwKKwkJCSAgIChhdG9taWNfcmVhZCgmdmlzX2ludGVydmFsKS8xMDAwKSAqIEhaKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdmlzLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi92aXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzZmYWJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdmlzLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogU2ltb24gV3VuZGVybGljaCwgTWFyZWsgTGluZG5lcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKyNkZWZpbmUgVklTX1RJTUVPVVQJCTIwMDAwMAorI2RlZmluZSBWSVNfRk9STUFUX0REX05BTUUJImRvdF9kcmF3IgorI2RlZmluZSBWSVNfRk9STUFUX0pTT05fTkFNRQkianNvbiIKKworc3RydWN0IHZpc19pbmZvIHsKKwl1bnNpZ25lZCBsb25nICAgICAgIGZpcnN0X3NlZW47CisJc3RydWN0IGxpc3RfaGVhZCAgICByZWN2X2xpc3Q7CisJCQkgICAgLyogbGlzdCBvZiBzZXJ2ZXItbmVpZ2hib3JzIHdlIHJlY2VpdmVkIGEgdmlzLXBhY2tldAorCQkJICAgICAqIGZyb20uICB3ZSBzaG91bGQgbm90IHJlcGx5IHRvIHRoZW0uICovCisJc3RydWN0IGxpc3RfaGVhZCBzZW5kX2xpc3Q7CisJLyogdGhpcyBwYWNrZXQgbWlnaHQgYmUgcGFydCBvZiB0aGUgdmlzIHNlbmQgcXVldWUuICovCisJc3RydWN0IHZpc19wYWNrZXQgcGFja2V0OworCS8qIHZpc19pbmZvIG1heSBmb2xsb3cgaGVyZSovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgdmlzX2luZm9fZW50cnkgeworCXVpbnQ4X3QgIHNyY1tFVEhfQUxFTl07CisJdWludDhfdCAgZGVzdFtFVEhfQUxFTl07CisJdWludDhfdCAgcXVhbGl0eTsJLyogcXVhbGl0eSA9IDAgbWVhbnMgSE5BICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgcmVjdmxpc3Rfbm9kZSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXVpbnQ4X3QgbWFjW0VUSF9BTEVOXTsKK307CisKK2VudW0gdmlzX2Zvcm1hdHMgeworCURPVF9EUkFXLAorCUpTT04sCit9OworCitleHRlcm4gc3RydWN0IGhhc2h0YWJsZV90ICp2aXNfaGFzaDsKK2V4dGVybiBzcGlubG9ja190IHZpc19oYXNoX2xvY2s7CisKK3ZvaWQgdmlzX3NldF9tb2RlKGludCBtb2RlKTsKK2ludCBpc192aXNfc2VydmVyKHZvaWQpOwordm9pZCByZWNlaXZlX3NlcnZlcl9zeW5jX3BhY2tldChzdHJ1Y3QgdmlzX3BhY2tldCAqdmlzX3BhY2tldCwKKwkJCQlpbnQgdmlzX2luZm9fbGVuKTsKK3ZvaWQgcmVjZWl2ZV9jbGllbnRfdXBkYXRlX3BhY2tldChzdHJ1Y3QgdmlzX3BhY2tldCAqdmlzX3BhY2tldCwKKwkJCQkgIGludCB2aXNfaW5mb19sZW4pOworaW50IHZpc19pbml0KHZvaWQpOwordm9pZCB2aXNfcXVpdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaS5oCmluZGV4IDk1N2I2NDAuLmNjYzVjZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGkuaApAQCAtMjQsMTAgKzI0LDYgQEAKICNpZm5kZWYgX0NPTUVESV9ICiAjZGVmaW5lIF9DT01FRElfSAogCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KICNkZWZpbmUgQ09NRURJX01BSk9SVkVSU0lPTgkwCiAjZGVmaW5lIENPTUVESV9NSU5PUlZFUlNJT04JNwogI2RlZmluZSBDT01FRElfTUlDUk9WRVJTSU9OCTc2CkBAIC04NzEsOCArODY3LDQgQEAKIAkJQU1QTENfRElPX0dBVF9SRVNFUlZFRDcKIAl9OwogCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCiAjZW5kaWYgLyogX0NPTUVESV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9jb21wYXQzMi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfY29tcGF0MzIuYwppbmRleCA5ODEwZTM3Li5hOWZkY2RhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9jb21wYXQzMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2NvbXBhdDMyLmMKQEAgLTI3LDE2ICsyNywxMiBAQAogI2RlZmluZSBfX05PX1ZFUlNJT05fXwogI2luY2x1ZGUgImNvbWVkaS5oIgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKICNpbmNsdWRlICJjb21lZGlfY29tcGF0MzIuaCIKIAogI2lmZGVmIENPTkZJR19DT01QQVQKIAotI2lmbmRlZiBIQVZFX0NPTVBBVF9JT0NUTAotI2luY2x1ZGUgPGxpbnV4L2lvY3RsMzIuaD4JLyogZm9yICh1bilyZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24gKi8KLSNlbmRpZgotCiAjZGVmaW5lIENPTUVESTMyX0NIQU5JTkZPIF9JT1IoQ0lPLCAzLCBzdHJ1Y3QgY29tZWRpMzJfY2hhbmluZm9fc3RydWN0KQogI2RlZmluZSBDT01FREkzMl9SQU5HRUlORk8gX0lPUihDSU8sIDgsIHN0cnVjdCBjb21lZGkzMl9yYW5nZWluZm9fc3RydWN0KQogLyogTi5CLiBDT01FREkzMl9DTUQgYW5kIENPTUVESV9DTUQgb3VnaHQgdG8gdXNlIF9JT1dSLCBub3QgX0lPUi4KQEAgLTEwMSwyMiArOTcsOSBAQAogCWlmICghZmlsZS0+Zl9vcCkKIAkJcmV0dXJuIC1FTk9UVFk7CiAKLSNpZmRlZiBIQVZFX1VOTE9DS0VEX0lPQ1RMCi0JaWYgKGZpbGUtPmZfb3AtPnVubG9ja2VkX2lvY3RsKSB7Ci0JCWludCByYyA9IChpbnQpKCpmaWxlLT5mX29wLT51bmxvY2tlZF9pb2N0bCkgKGZpbGUsIGNtZCwgYXJnKTsKLQkJaWYgKHJjID09IC1FTk9JT0NUTENNRCkKLQkJCXJjID0gLUVOT1RUWTsKLQkJcmV0dXJuIHJjOwotCX0KLSNlbmRpZgotCWlmIChmaWxlLT5mX29wLT5pb2N0bCkgewotCQlpbnQgcmM7Ci0JCWxvY2tfa2VybmVsKCk7Ci0JCXJjID0gKCpmaWxlLT5mX29wLT5pb2N0bCkgKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLAotCQkJCQkgICBmaWxlLCBjbWQsIGFyZyk7Ci0JCXVubG9ja19rZXJuZWwoKTsKLQkJcmV0dXJuIHJjOwotCX0KKwlpZiAoZmlsZS0+Zl9vcC0+dW5sb2NrZWRfaW9jdGwpCisJCXJldHVybiBmaWxlLT5mX29wLT51bmxvY2tlZF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisKIAlyZXR1cm4gLUVOT1RUWTsKIH0KIApAQCAtMTg2LDggKzE2OSw4IEBACiB9CiAKIC8qIENvcHkgMzItYml0IGNtZCBzdHJ1Y3R1cmUgdG8gbmF0aXZlIGNtZCBzdHJ1Y3R1cmUuICovCi1zdGF0aWMgaW50IGdldF9jb21wYXRfY21kKHN0cnVjdCBjb21lZGlfY21kIF9fdXNlciAqIGNtZCwKLQkJCSAgc3RydWN0IGNvbWVkaTMyX2NtZF9zdHJ1Y3QgX191c2VyICogY21kMzIpCitzdGF0aWMgaW50IGdldF9jb21wYXRfY21kKHN0cnVjdCBjb21lZGlfY21kIF9fdXNlciAqY21kLAorCQkJICBzdHJ1Y3QgY29tZWRpMzJfY21kX3N0cnVjdCBfX3VzZXIgKmNtZDMyKQogewogCWludCBlcnI7CiAJdW5pb24gewpAQCAtMjM3LDggKzIyMCw4IEBACiB9CiAKIC8qIENvcHkgbmF0aXZlIGNtZCBzdHJ1Y3R1cmUgdG8gMzItYml0IGNtZCBzdHJ1Y3R1cmUuICovCi1zdGF0aWMgaW50IHB1dF9jb21wYXRfY21kKHN0cnVjdCBjb21lZGkzMl9jbWRfc3RydWN0IF9fdXNlciAqIGNtZDMyLAotCQkJICBzdHJ1Y3QgY29tZWRpX2NtZCBfX3VzZXIgKiBjbWQpCitzdGF0aWMgaW50IHB1dF9jb21wYXRfY21kKHN0cnVjdCBjb21lZGkzMl9jbWRfc3RydWN0IF9fdXNlciAqY21kMzIsCisJCQkgIHN0cnVjdCBjb21lZGlfY21kIF9fdXNlciAqY21kKQogewogCWludCBlcnI7CiAJdW5zaWduZWQgaW50IHRlbXA7CkBAIC0zMjgsOCArMzExLDggQEAKIH0KIAogLyogQ29weSAzMi1iaXQgaW5zbiBzdHJ1Y3R1cmUgdG8gbmF0aXZlIGluc24gc3RydWN0dXJlLiAqLwotc3RhdGljIGludCBnZXRfY29tcGF0X2luc24oc3RydWN0IGNvbWVkaV9pbnNuIF9fdXNlciAqIGluc24sCi0JCQkgICBzdHJ1Y3QgY29tZWRpMzJfaW5zbl9zdHJ1Y3QgX191c2VyICogaW5zbjMyKQorc3RhdGljIGludCBnZXRfY29tcGF0X2luc24oc3RydWN0IGNvbWVkaV9pbnNuIF9fdXNlciAqaW5zbiwKKwkJCSAgIHN0cnVjdCBjb21lZGkzMl9pbnNuX3N0cnVjdCBfX3VzZXIgKmluc24zMikKIHsKIAlpbnQgZXJyOwogCXVuaW9uIHsKQEAgLTM3Miw5ICszNTUsOSBAQAogCWluc25saXN0MzIgPSBjb21wYXRfcHRyKGFyZyk7CiAKIAkvKiBHZXQgMzItYml0IGluc25saXN0IHN0cnVjdHVyZS4gICovCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGluc25saXN0MzIsIHNpemVvZigqaW5zbmxpc3QzMikpKSB7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGluc25saXN0MzIsIHNpemVvZigqaW5zbmxpc3QzMikpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQl9CisKIAllcnIgPSAwOwogCWVyciB8PSBfX2dldF91c2VyKG5faW5zbnMsICZpbnNubGlzdDMyLT5uX2luc25zKTsKIAllcnIgfD0gX19nZXRfdXNlcih1cHRyLCAmaW5zbmxpc3QzMi0+aW5zbnMpOwpAQCAtMzg3LDkgKzM3MCw5IEBACiAJCQkJCSAgICAgaW5zbltuX2luc25zXSkpOwogCiAJLyogU2V0IG5hdGl2ZSBpbnNubGlzdCBzdHJ1Y3R1cmUuICovCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCAmcy0+aW5zbmxpc3QsIHNpemVvZihzLT5pbnNubGlzdCkpKSB7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCAmcy0+aW5zbmxpc3QsIHNpemVvZihzLT5pbnNubGlzdCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQl9CisKIAllcnIgfD0gX19wdXRfdXNlcihuX2luc25zLCAmcy0+aW5zbmxpc3Qubl9pbnNucyk7CiAJZXJyIHw9IF9fcHV0X3VzZXIoJnMtPmluc25bMF0sICZzLT5pbnNubGlzdC5pbnNucyk7CiAJaWYgKGVycikKQEAgLTQ3Miw4ICs0NTUsNiBAQAogCXJldHVybiByYzsKIH0KIAotI2lmZGVmIEhBVkVfQ09NUEFUX0lPQ1RMCS8qIGRlZmluZWQgaW4gPGxpbnV4L2ZzLmg+IDIuNi4xMSBvbndhcmRzICovCi0KIC8qIGNvbXBhdF9pb2N0bCBmaWxlIG9wZXJhdGlvbi4gKi8KIC8qIFJldHVybnMgLUVOT0lPQ1RMQ01EIGZvciB1bnJlY29nbmlzZWQgaW9jdGwgY29kZXMuICovCiBsb25nIGNvbWVkaV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQpAQCAtNDgxLDEwNiArNDYyLDQgQEAKIAlyZXR1cm4gcmF3X2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKIH0KIAotI2Vsc2UgLyogSEFWRV9DT01QQVRfSU9DVEwgKi8KLQotLyoKLSAqIEJyYWluLWRlYWQgaW9jdGwgY29tcGF0aWJpbGl0eSBmb3IgMi42LjEwIGFuZCBlYXJsaWVyLgotICoKLSAqIEl0J3MgYnJhaW4tZGVhZCBiZWNhdXNlIGNtZCBudW1iZXJzIG5lZWQgdG8gYmUgdW5pcXVlIHN5c3RlbS13aWRlIQotICogVGhlIGNvbWVkaSBkcml2ZXIgY291bGQgZW5kIHVwIGF0dGVtcHRpbmcgdG8gZXhlY3V0ZSBpb2N0bHMgZm9yIG5vbi1Db21lZGkKLSAqIGRldmljZXMgYmVjYXVzZSBpdCByZWdpc3RlcmVkIHRoZSBzeXN0ZW0td2lkZSBjbWQgY29kZSBmaXJzdC4gIFNpbWlsYXJseSwKLSAqIGFub3RoZXIgZHJpdmVyIGNvdWxkIGVuZCB1cCBhdHRlbXB0aW5nIHRvIGV4ZWN1dGUgaW9jdGxzIGZvciBhIENvbWVkaQotICogZGV2aWNlIGJlY2F1c2UgaXQgcmVnaXN0ZXJlZCB0aGUgY21kIGNvZGUgZmlyc3QuICBDaGFvcyBlbnN1ZXMuCi0gKi8KLQotLyogSGFuZGxlciBmb3IgYWxsIDMyLWJpdCBpb2N0bCBjb2RlcyByZWdpc3RlcmVkIGJ5IHRoaXMgZHJpdmVyLiAqLwotc3RhdGljIGludCBtYXBwZWRfaW9jdGwodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywKLQkJCXN0cnVjdCBmaWxlICpmaWxlKQotewotCWludCByYzsKLQotCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgQ29tZWRpIGRldmljZS4gKi8KLQlpZiAoaW1ham9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSAhPSBDT01FRElfTUFKT1IpCi0JCXJldHVybiAtRU5PVFRZOwotCi0JcmMgPSByYXdfaW9jdGwoZmlsZSwgY21kLCBhcmcpOwotCS8qIERvIG5vdCByZXR1cm4gLUVOT0lPQ1RMQ01ELiAqLwotCWlmIChyYyA9PSAtRU5PSU9DVExDTUQpCi0JCXJjID0gLUVOT1RUWTsKLQotCXJldHVybiByYzsKLX0KLQotc3RydWN0IGlvY3RsMzJfbWFwIHsKLQl1bnNpZ25lZCBpbnQgY21kOwotCWludCAoKmhhbmRsZXIpICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZywKLQkJCXN0cnVjdCBmaWxlICopOwotCWludCByZWdpc3RlcmVkOwotfTsKLQotc3RhdGljIHN0cnVjdCBpb2N0bDMyX21hcCBjb21lZGlfaW9jdGwzMl9tYXBbXSA9IHsKLQl7Q09NRURJX0RFVkNPTkZJRywgbWFwcGVkX2lvY3RsLCAwfSwKLQl7Q09NRURJX0RFVklORk8sIG1hcHBlZF9pb2N0bCwgMH0sCi0Je0NPTUVESV9TVUJESU5GTywgbWFwcGVkX2lvY3RsLCAwfSwKLQl7Q09NRURJX0JVRkNPTkZJRywgbWFwcGVkX2lvY3RsLCAwfSwKLQl7Q09NRURJX0JVRklORk8sIG1hcHBlZF9pb2N0bCwgMH0sCi0Je0NPTUVESV9MT0NLLCBtYXBwZWRfaW9jdGwsIDB9LAotCXtDT01FRElfVU5MT0NLLCBtYXBwZWRfaW9jdGwsIDB9LAotCXtDT01FRElfQ0FOQ0VMLCBtYXBwZWRfaW9jdGwsIDB9LAotCXtDT01FRElfUE9MTCwgbWFwcGVkX2lvY3RsLCAwfSwKLQl7Q09NRURJMzJfQ0hBTklORk8sIG1hcHBlZF9pb2N0bCwgMH0sCi0Je0NPTUVESTMyX1JBTkdFSU5GTywgbWFwcGVkX2lvY3RsLCAwfSwKLQl7Q09NRURJMzJfQ01ELCBtYXBwZWRfaW9jdGwsIDB9LAotCXtDT01FREkzMl9DTURURVNULCBtYXBwZWRfaW9jdGwsIDB9LAotCXtDT01FREkzMl9JTlNOTElTVCwgbWFwcGVkX2lvY3RsLCAwfSwKLQl7Q09NRURJMzJfSU5TTiwgbWFwcGVkX2lvY3RsLCAwfSwKLX07Ci0KLSNkZWZpbmUgTlVNX0lPQ1RMMzJfTUFQUyBBUlJBWV9TSVpFKGNvbWVkaV9pb2N0bDMyX21hcCkKLQotLyogUmVnaXN0ZXIgc3lzdGVtLXdpZGUgMzItYml0IGlvY3RsIGhhbmRsZXJzLiAqLwotdm9pZCBjb21lZGlfcmVnaXN0ZXJfaW9jdGwzMih2b2lkKQotewotCWludCBuLCByYzsKLQotCWZvciAobiA9IDA7IG4gPCBOVU1fSU9DVEwzMl9NQVBTOyBuKyspIHsKLQkJcmMgPSByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oY29tZWRpX2lvY3RsMzJfbWFwW25dLmNtZCwKLQkJCQkJCSBjb21lZGlfaW9jdGwzMl9tYXBbbl0uaGFuZGxlcik7Ci0JCWlmIChyYykgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgICJjb21lZGk6IGZhaWxlZCB0byByZWdpc3RlciAzMi1iaXQgIgotCQkJICAgICAgICJjb21wYXRpYmxlIGlvY3RsIGhhbmRsZXIgZm9yIDB4JVggLSAiCi0JCQkgICAgICAgImV4cGVjdCBiYWQgdGhpbmdzIHRvIGhhcHBlbiFcbiIsCi0JCQkgICAgICAgY29tZWRpX2lvY3RsMzJfbWFwW25dLmNtZCk7Ci0JCX0KLQkJY29tZWRpX2lvY3RsMzJfbWFwW25dLnJlZ2lzdGVyZWQgPSAhcmM7Ci0JfQotfQotCi0vKiBVbnJlZ2lzdGVyIHN5c3RlbS13aWRlIDMyLWJpdCBpb2N0bCB0cmFuc2xhdGlvbnMuICovCi12b2lkIGNvbWVkaV91bnJlZ2lzdGVyX2lvY3RsMzIodm9pZCkKLXsKLQlpbnQgbiwgcmM7Ci0KLQlmb3IgKG4gPSAwOyBuIDwgTlVNX0lPQ1RMMzJfTUFQUzsgbisrKSB7Ci0JCWlmIChjb21lZGlfaW9jdGwzMl9tYXBbbl0ucmVnaXN0ZXJlZCkgewotCQkJcmMgPSB1bnJlZ2lzdGVyX2lvY3RsMzJfY29udmVyc2lvbihjb21lZGlfaW9jdGwzMl9tYXAKLQkJCQkJCQkgICBbbl0uY21kLAotCQkJCQkJCSAgIGNvbWVkaV9pb2N0bDMyX21hcAotCQkJCQkJCSAgIFtuXS5oYW5kbGVyKTsKLQkJCWlmIChyYykgewotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCSAgICAgICAiY29tZWRpOiBmYWlsZWQgdG8gdW5yZWdpc3RlciAzMi1iaXQgIgotCQkJCSAgICAgICAiY29tcGF0aWJsZSBpb2N0bCBoYW5kbGVyIGZvciAweCVYIC0gIgotCQkJCSAgICAgICAiZXhwZWN0IGtlcm5lbCBPb3BzIVxuIiwKLQkJCQkgICAgICAgY29tZWRpX2lvY3RsMzJfbWFwW25dLmNtZCk7Ci0JCQl9IGVsc2UgewotCQkJCWNvbWVkaV9pb2N0bDMyX21hcFtuXS5yZWdpc3RlcmVkID0gMDsKLQkJCX0KLQkJfQotCX0KLX0KLQotI2VuZGlmIC8qIEhBVkVfQ09NUEFUX0lPQ1RMICovCi0KICNlbmRpZiAvKiBDT05GSUdfQ09NUEFUICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9jb21wYXQzMi5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfY29tcGF0MzIuaAppbmRleCBmZDBmOGEzLi4wMzQwYTg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9jb21wYXQzMi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2NvbXBhdDMyLmgKQEAgLTI4LDMwICsyOCwxNiBAQAogI2RlZmluZSBfQ09NRURJX0NPTVBBVDMyX0gKIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CQkvKiBGb3IgSEFWRV9DT01QQVRfSU9DVEwgYW5kIEhBVkVfVU5MT0NLRURfSU9DVEwgKi8KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgogCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCi0jaWZkZWYgSEFWRV9DT01QQVRfSU9DVEwKLQogZXh0ZXJuIGxvbmcgY29tZWRpX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKIAkJCQl1bnNpZ25lZCBsb25nIGFyZyk7Ci0jZGVmaW5lIGNvbWVkaV9yZWdpc3Rlcl9pb2N0bDMyKCkgZG8ge30gd2hpbGUgKDApCi0jZGVmaW5lIGNvbWVkaV91bnJlZ2lzdGVyX2lvY3RsMzIoKSBkbyB7fSB3aGlsZSAoMCkKLQotI2Vsc2UgLyogSEFWRV9DT01QQVRfSU9DVEwgKi8KLQotI2RlZmluZSBjb21lZGlfY29tcGF0X2lvY3RsIDAJLyogTlVMTCAqLwotZXh0ZXJuIHZvaWQgY29tZWRpX3JlZ2lzdGVyX2lvY3RsMzIodm9pZCk7Ci1leHRlcm4gdm9pZCBjb21lZGlfdW5yZWdpc3Rlcl9pb2N0bDMyKHZvaWQpOwotCi0jZW5kaWYgLyogSEFWRV9DT01QQVRfSU9DVEwgKi8KIAogI2Vsc2UgLyogQ09ORklHX0NPTVBBVCAqLwogCiAjZGVmaW5lIGNvbWVkaV9jb21wYXRfaW9jdGwgMAkvKiBOVUxMICovCi0jZGVmaW5lIGNvbWVkaV9yZWdpc3Rlcl9pb2N0bDMyKCkgZG8ge30gd2hpbGUgKDApCi0jZGVmaW5lIGNvbWVkaV91bnJlZ2lzdGVyX2lvY3RsMzIoKSBkbyB7fSB3aGlsZSAoMCkKIAogI2VuZGlmIC8qIENPTkZJR19DT01QQVQgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfZm9wcy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfZm9wcy5jCmluZGV4IGFhYWQ3NmUuLjgxMTc3NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ZvcHMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmMKQEAgLTExMCwxMyArMTEwLDggQEAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9tYXhfd3JpdGVfYnVmZmVyX2tiOwogc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX3dyaXRlX2J1ZmZlcl9rYjsKIAotI2lmZGVmIEhBVkVfVU5MT0NLRURfSU9DVEwKIHN0YXRpYyBsb25nIGNvbWVkaV91bmxvY2tlZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQotI2Vsc2UKLXN0YXRpYyBpbnQgY29tZWRpX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi0jZW5kaWYKIHsKIAljb25zdCB1bnNpZ25lZCBtaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CiAJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpkZXZfZmlsZV9pbmZvID0KQEAgLTE4NjcsMTQgKzE4NjIsOCBAQAogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNvbWVkaV9mb3BzID0gewogCS5vd25lciA9IFRISVNfTU9EVUxFLAotI2lmZGVmIEhBVkVfVU5MT0NLRURfSU9DVEwKIAkudW5sb2NrZWRfaW9jdGwgPSBjb21lZGlfdW5sb2NrZWRfaW9jdGwsCi0jZWxzZQotCS5pb2N0bCA9IGNvbWVkaV9pb2N0bCwKLSNlbmRpZgotI2lmZGVmIEhBVkVfQ09NUEFUX0lPQ1RMCiAJLmNvbXBhdF9pb2N0bCA9IGNvbWVkaV9jb21wYXRfaW9jdGwsCi0jZW5kaWYKIAkub3BlbiA9IGNvbWVkaV9vcGVuLAogCS5yZWxlYXNlID0gY29tZWRpX2Nsb3NlLAogCS5yZWFkID0gY29tZWRpX3JlYWQsCkBAIC0xOTU5LDggKzE5NDgsNiBAQAogCQl9CiAJfQogCi0JY29tZWRpX3JlZ2lzdGVyX2lvY3RsMzIoKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0xOTc3LDggKzE5NjQsNiBAQAogCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihDT01FRElfTUFKT1IsIDApLCBDT01FRElfTlVNX01JTk9SUyk7CiAKIAljb21lZGlfcHJvY19jbGVhbnVwKCk7Ci0KLQljb21lZGlfdW5yZWdpc3Rlcl9pb2N0bDMyKCk7CiB9CiAKIG1vZHVsZV9pbml0KGNvbWVkaV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpZGV2LmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaWRldi5oCmluZGV4IGU4YTVmN2QuLmViZGNjZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpZGV2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlkZXYuaApAQCAtNDksNyArNDksOCBAQAogfSB3aGlsZSAoMCkKIAogI2RlZmluZSBDT01FRElfVkVSU0lPTihhLCBiLCBjKSAoKChhKSA8PCAxNikgKyAoKGIpIDw8IDgpICsgKGMpKQotI2RlZmluZSBDT01FRElfVkVSU0lPTl9DT0RFIENPTUVESV9WRVJTSU9OKENPTUVESV9NQUpPUlZFUlNJT04sIENPTUVESV9NSU5PUlZFUlNJT04sIENPTUVESV9NSUNST1ZFUlNJT04pCisjZGVmaW5lIENPTUVESV9WRVJTSU9OX0NPREUgQ09NRURJX1ZFUlNJT04oQ09NRURJX01BSk9SVkVSU0lPTiwgXAorCUNPTUVESV9NSU5PUlZFUlNJT04sIENPTUVESV9NSUNST1ZFUlNJT04pCiAjZGVmaW5lIENPTUVESV9SRUxFQVNFIFZFUlNJT04KIAogI2RlZmluZSBDT01FRElfSU5JVENMRUFOVVBfTk9NT0RVTEUoeCkJCQkJCVwKQEAgLTU4LDEyICs1OSwxMiBAQAogCXN0YXRpYyB2b2lkIF9fZXhpdCB4ICMjIF9jbGVhbnVwX21vZHVsZSh2b2lkKQkJCVwKIAkJe2NvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmKHgpKTsgfSAJCQlcCiAJbW9kdWxlX2luaXQoeCAjIyBfaW5pdF9tb2R1bGUpOwkJCQkJXAotCW1vZHVsZV9leGl0KHggIyMgX2NsZWFudXBfbW9kdWxlKTsJCQkJCVwKKwltb2R1bGVfZXhpdCh4ICMjIF9jbGVhbnVwX21vZHVsZSk7CiAKICNkZWZpbmUgQ09NRURJX01PRFVMRV9NQUNST1MJCQkJCQlcCiAJTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOwkJXAogCU1PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsJCQlcCi0JTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwkJCQkJCVwKKwlNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKICNkZWZpbmUgQ09NRURJX0lOSVRDTEVBTlVQKHgpCQkJCQkJXAogCUNPTUVESV9NT0RVTEVfTUFDUk9TCQlcCkBAIC03NSw3ICs3Niw4IEBACiAJeyBcCiAJCXJldHVybiBjb21lZGlfcGNpX2F1dG9fY29uZmlnKGRldiwgY29tZWRpX2RyaXZlci5kcml2ZXJfbmFtZSk7IFwKIAl9IFwKLQlzdGF0aWMgdm9pZCBfX2RldmV4aXQgY29tZWRpX2RyaXZlciAjIyBfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KSBcCisJc3RhdGljIHZvaWQgX19kZXZleGl0IGNvbWVkaV9kcml2ZXIgIyMgX3BjaV9yZW1vdmUoXAorCQlzdHJ1Y3QgcGNpX2RldiAqZGV2KSBcCiAJeyBcCiAJCWNvbWVkaV9wY2lfYXV0b191bmNvbmZpZyhkZXYpOyBcCiAJfSBcCkBAIC05MSw3ICs5Myw4IEBACiAJCXJldHZhbCA9IGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmNvbWVkaV9kcml2ZXIpOyBcCiAJCWlmIChyZXR2YWwgPCAwKSBcCiAJCQlyZXR1cm4gcmV0dmFsOyBcCi0JCWNvbWVkaV9kcml2ZXIgIyMgX3BjaV9kcml2ZXIubmFtZSA9IChjaGFyICopY29tZWRpX2RyaXZlci5kcml2ZXJfbmFtZTsgXAorCQkJY29tZWRpX2RyaXZlciAjIyBfcGNpX2RyaXZlci5uYW1lID0gXAorCQkJCShjaGFyICopY29tZWRpX2RyaXZlci5kcml2ZXJfbmFtZTsgXAogCQlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmY29tZWRpX2RyaXZlciAjIyBfcGNpX2RyaXZlcik7IFwKIAl9IFwKIAlzdGF0aWMgdm9pZCBfX2V4aXQgY29tZWRpX2RyaXZlciAjIyBfY2xlYW51cF9tb2R1bGUodm9pZCkgXApAQCAtMTcwLDE0ICsxNzMsMTUgQEAKIAkJCSAgIHN0cnVjdCBjb21lZGlfY21kICopOwogCWludCAoKnBvbGwpIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqKTsKIAlpbnQgKCpjYW5jZWwpIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqKTsKLQkvKiBpbnQgKCpkb19sb2NrKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqLHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICopOyAqLwotCS8qIGludCAoKmRvX3VubG9jaykoc3RydWN0IGNvbWVkaV9kZXZpY2UgKixzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqKTsgKi8KKwkvKiBpbnQgKCpkb19sb2NrKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqKTsgKi8KKwkvKiBpbnQgKCpkb191bmxvY2spKHN0cnVjdCBjb21lZGlfZGV2aWNlICosIFwKKwkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICopOyAqLwogCiAJLyogY2FsbGVkIHdoZW4gdGhlIGJ1ZmZlciBjaGFuZ2VzICovCi0JaW50ICgqYnVmX2NoYW5nZSkgKHN0cnVjdCBjb21lZGlfZGV2aWNlICogZGV2LAotCQkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiBzLCB1bnNpZ25lZCBsb25nIG5ld19zaXplKTsKKwlpbnQgKCpidWZfY2hhbmdlKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCB1bnNpZ25lZCBsb25nIG5ld19zaXplKTsKIAotCXZvaWQgKCptdW5nZSkgKHN0cnVjdCBjb21lZGlfZGV2aWNlICogZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqIHMsCisJdm9pZCAoKm11bmdlKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCSAgICAgICB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbnVtX2J5dGVzLAogCQkgICAgICAgdW5zaWduZWQgaW50IHN0YXJ0X2NoYW5faW5kZXgpOwogCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGFzeW5jX2RtYV9kaXI7CkBAIC0xOTgsMTYgKzIwMiwyMiBAQAogCiAJdm9pZCAqcHJlYWxsb2NfYnVmOwkvKiBwcmUtYWxsb2NhdGVkIGJ1ZmZlciAqLwogCXVuc2lnbmVkIGludCBwcmVhbGxvY19idWZzejsJLyogYnVmZmVyIHNpemUsIGluIGJ5dGVzICovCi0Jc3RydWN0IGNvbWVkaV9idWZfcGFnZSAqYnVmX3BhZ2VfbGlzdDsJLyogdmlydHVhbCBhbmQgZG1hIGFkZHJlc3Mgb2YgZWFjaCBwYWdlICovCisJLyogdmlydHVhbCBhbmQgZG1hIGFkZHJlc3Mgb2YgZWFjaCBwYWdlICovCisJc3RydWN0IGNvbWVkaV9idWZfcGFnZSAqYnVmX3BhZ2VfbGlzdDsKIAl1bnNpZ25lZCBuX2J1Zl9wYWdlczsJLyogbnVtIGVsZW1lbnRzIGluIGJ1Zl9wYWdlX2xpc3QgKi8KIAogCXVuc2lnbmVkIGludCBtYXhfYnVmc2l6ZTsJLyogbWF4aW11bSBidWZmZXIgc2l6ZSwgYnl0ZXMgKi8KLQl1bnNpZ25lZCBpbnQgbW1hcF9jb3VudDsJLyogY3VycmVudCBudW1iZXIgb2YgbW1hcHMgb2YgcHJlYWxsb2NfYnVmICovCisJLyogY3VycmVudCBudW1iZXIgb2YgbW1hcHMgb2YgcHJlYWxsb2NfYnVmICovCisJdW5zaWduZWQgaW50IG1tYXBfY291bnQ7CiAKLQl1bnNpZ25lZCBpbnQgYnVmX3dyaXRlX2NvdW50OwkvKiBieXRlIGNvdW50IGZvciB3cml0ZXIgKHdyaXRlIGNvbXBsZXRlZCkgKi8KLQl1bnNpZ25lZCBpbnQgYnVmX3dyaXRlX2FsbG9jX2NvdW50OwkvKiBieXRlIGNvdW50IGZvciB3cml0ZXIgKGFsbG9jYXRlZCBmb3Igd3JpdGluZykgKi8KLQl1bnNpZ25lZCBpbnQgYnVmX3JlYWRfY291bnQ7CS8qIGJ5dGUgY291bnQgZm9yIHJlYWRlciAocmVhZCBjb21wbGV0ZWQpICovCi0JdW5zaWduZWQgaW50IGJ1Zl9yZWFkX2FsbG9jX2NvdW50OwkvKiBieXRlIGNvdW50IGZvciByZWFkZXIgKGFsbG9jYXRlZCBmb3IgcmVhZGluZykgKi8KKwkvKiBieXRlIGNvdW50IGZvciB3cml0ZXIgKHdyaXRlIGNvbXBsZXRlZCkgKi8KKwl1bnNpZ25lZCBpbnQgYnVmX3dyaXRlX2NvdW50OworCS8qIGJ5dGUgY291bnQgZm9yIHdyaXRlciAoYWxsb2NhdGVkIGZvciB3cml0aW5nKSAqLworCXVuc2lnbmVkIGludCBidWZfd3JpdGVfYWxsb2NfY291bnQ7CisJLyogYnl0ZSBjb3VudCBmb3IgcmVhZGVyIChyZWFkIGNvbXBsZXRlZCkgKi8KKwl1bnNpZ25lZCBpbnQgYnVmX3JlYWRfY291bnQ7CisJLyogYnl0ZSBjb3VudCBmb3IgcmVhZGVyIChhbGxvY2F0ZWQgZm9yIHJlYWRpbmcpICovCisJdW5zaWduZWQgaW50IGJ1Zl9yZWFkX2FsbG9jX2NvdW50OwogCiAJdW5zaWduZWQgaW50IGJ1Zl93cml0ZV9wdHI7CS8qIGJ1ZmZlciBtYXJrZXIgZm9yIHdyaXRlciAqLwogCXVuc2lnbmVkIGludCBidWZfcmVhZF9wdHI7CS8qIGJ1ZmZlciBtYXJrZXIgZm9yIHJlYWRlciAqLwpAQCAtMjMzLDcgKzI0Myw3IEBACiAJaW50ICgqY2JfZnVuYykgKHVuc2lnbmVkIGludCBmbGFncywgdm9pZCAqKTsKIAl2b2lkICpjYl9hcmc7CiAKLQlpbnQgKCppbnR0cmlnKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICogcywKKwlpbnQgKCppbnR0cmlnKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQl1bnNpZ25lZCBpbnQgeCk7CiB9OwogCkBAIC0yODMsOCArMjkzLDggQEAKIAogCXN0cnVjdCBmYXN5bmNfc3RydWN0ICphc3luY19xdWV1ZTsKIAotCXZvaWQgKCpvcGVuKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiBkZXYpOwotCXZvaWQgKCpjbG9zZSkgKHN0cnVjdCBjb21lZGlfZGV2aWNlICogZGV2KTsKKwl2b2lkICgqb3BlbikgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpOworCXZvaWQgKCpjbG9zZSkgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpOwogfTsKIAogc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvIHsKQEAgLTMxOCw5ICszMjgsOCBAQAogCiBzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKmNvbWVkaV9nZXRfZGV2aWNlX2ZpbGVfaW5mbyh1bnNpZ25lZCBtaW5vcik7CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKmNvbWVkaV9nZXRfcmVhZF9zdWJkZXZpY2UoY29uc3Qgc3RydWN0Ci0JCQkJCQkJCSBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbwotCQkJCQkJCQkgKmluZm8pCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpjb21lZGlfZ2V0X3JlYWRfc3ViZGV2aWNlKAorCWNvbnN0IHN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqaW5mbykKIHsKIAlpZiAoaW5mby0+cmVhZF9zdWJkZXZpY2UpCiAJCXJldHVybiBpbmZvLT5yZWFkX3N1YmRldmljZTsKQEAgLTMyOSw5ICszMzgsOCBAQAogCXJldHVybiBpbmZvLT5kZXZpY2UtPnJlYWRfc3ViZGV2OwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpjb21lZGlfZ2V0X3dyaXRlX3N1YmRldmljZShjb25zdCBzdHJ1Y3QKLQkJCQkJCQkJICBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbwotCQkJCQkJCQkgICppbmZvKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqY29tZWRpX2dldF93cml0ZV9zdWJkZXZpY2UoCisJY29uc3Qgc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICppbmZvKQogewogCWlmIChpbmZvLT53cml0ZV9zdWJkZXZpY2UpCiAJCXJldHVybiBpbmZvLT53cml0ZV9zdWJkZXZpY2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy5jCmluZGV4IGRjNTNhZWUuLmMyYTYzMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy5jCkBAIC0zODcsNyArMzg3LDcgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHV2aXJ0X3RvX2t2YShwZ2RfdCAqIHBnZCwgdW5zaWduZWQgbG9uZyBhZHIpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdXZpcnRfdG9fa3ZhKHBnZF90ICpwZ2QsIHVuc2lnbmVkIGxvbmcgYWRyKQogewogCXVuc2lnbmVkIGxvbmcgcmV0ID0gMFVMOwogCXBtZF90ICpwbWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvODI1My5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLzgyNTMuaAppbmRleCBjMmVhMmQ5Li4wYmIzNWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvODI1My5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy84MjUzLmgKQEAgLTIwNiw3ICsyMDYsOCBAQAogCX0KIAogCSpuYW5vc2VjID0gZGl2MSAqIGRpdjIgKiBpODI1M19vc2NfYmFzZTsKLQkqZDEgPSBkaXYxICYgMHhmZmZmOwkvKiAgbWFza2luZyBpcyBkb25lIHNpbmNlIGNvdW50ZXIgbWFwcyB6ZXJvIHRvIDB4MTAwMDAgKi8KKwkvKiAgbWFza2luZyBpcyBkb25lIHNpbmNlIGNvdW50ZXIgbWFwcyB6ZXJvIHRvIDB4MTAwMDAgKi8KKwkqZDEgPSBkaXYxICYgMHhmZmZmOwogCSpkMiA9IGRpdjIgJiAweGZmZmY7CiAJcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLzgyNTUuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy84MjU1LmMKaW5kZXggMGE1MDg2NDcuLjEwZjQ4OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy84MjU1LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLzgyNTUuYwpAQCAtMTMyLDYgKzEzMiw3IEBACiAKIAljb21lZGlfZXZlbnQoZGV2LCBzKTsKIH0KK0VYUE9SVF9TWU1CT0woc3ViZGV2XzgyNTVfaW50ZXJydXB0KTsKIAogc3RhdGljIGludCBzdWJkZXZfODI1NV9jYihpbnQgZGlyLCBpbnQgcG9ydCwgaW50IGRhdGEsIHVuc2lnbmVkIGxvbmcgYXJnKQogewpAQCAtMTc5LDE1ICsxODAsMTQgQEAKIAl1bnNpZ25lZCBpbnQgYml0czsKIAogCW1hc2sgPSAxIDw8IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCWlmIChtYXNrICYgMHgwMDAwZmYpIHsKKwlpZiAobWFzayAmIDB4MDAwMGZmKQogCQliaXRzID0gMHgwMDAwZmY7Ci0JfSBlbHNlIGlmIChtYXNrICYgMHgwMGZmMDApIHsKKwllbHNlIGlmIChtYXNrICYgMHgwMGZmMDApCiAJCWJpdHMgPSAweDAwZmYwMDsKLQl9IGVsc2UgaWYgKG1hc2sgJiAweDBmMDAwMCkgeworCWVsc2UgaWYgKG1hc2sgJiAweDBmMDAwMCkKIAkJYml0cyA9IDB4MGYwMDAwOwotCX0gZWxzZSB7CisJZWxzZQogCQliaXRzID0gMHhmMDAwMDA7Ci0JfQogCiAJc3dpdGNoIChkYXRhWzBdKSB7CiAJY2FzZSBJTlNOX0NPTkZJR19ESU9fSU5QVVQ6CkBAIC0zMzMsMTEgKzMzMywxMCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCUNBTExCQUNLX0FSRyA9IGFyZzsKLQlpZiAoY2IgPT0gTlVMTCkgeworCWlmIChjYiA9PSBOVUxMKQogCQlDQUxMQkFDS19GVU5DID0gc3ViZGV2XzgyNTVfY2I7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCUNBTExCQUNLX0ZVTkMgPSBjYjsKLQl9CiAJcy0+aW5zbl9iaXRzID0gc3ViZGV2XzgyNTVfaW5zbjsKIAlzLT5pbnNuX2NvbmZpZyA9IHN1YmRldl84MjU1X2luc25fY29uZmlnOwogCkBAIC0zNDcsNiArMzQ2LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChzdWJkZXZfODI1NV9pbml0KTsKIAogaW50IHN1YmRldl84MjU1X2luaXRfaXJxKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJIGludCAoKmNiKSAoaW50LCBpbnQsIGludCwgdW5zaWduZWQgbG9uZyksCkBAIC0zNjYsNiArMzY2LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChzdWJkZXZfODI1NV9pbml0X2lycSk7CiAKIHZvaWQgc3ViZGV2XzgyNTVfY2xlYW51cChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKQEAgLTM3OCw2ICszNzksNyBAQAogCQlrZnJlZShzLT5wcml2YXRlKTsKIAl9CiB9CitFWFBPUlRfU1lNQk9MKHN1YmRldl84MjU1X2NsZWFudXApOwogCiAvKgogCkBAIC00NDgsOCArNDUwLDMgQEAKIAogCXJldHVybiAwOwogfQotCi1FWFBPUlRfU1lNQk9MKHN1YmRldl84MjU1X2luaXQpOwotRVhQT1JUX1NZTUJPTChzdWJkZXZfODI1NV9pbml0X2lycSk7Ci1FWFBPUlRfU1lNQk9MKHN1YmRldl84MjU1X2NsZWFudXApOwotRVhQT1JUX1NZTUJPTChzdWJkZXZfODI1NV9pbnRlcnJ1cHQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FjbDcyMjViLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWNsNzIyNWIuYwppbmRleCBjMzY1MmVmLi5lMjBjMzU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWNsNzIyNWIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWNsNzIyNWIuYwpAQCAtOTQsMTAgKzk0LDExIEBACiAKIAlpb2Jhc2UgPSBpdC0+b3B0aW9uc1swXTsKIAlpb3JhbmdlID0gdGhpc19ib2FyZC0+aW9fcmFuZ2U7Ci0JcHJpbnRrKCJjb21lZGklZDogYWNsNzIyNWI6IGJvYXJkPSVzIDB4JTA0eCAiLCBkZXYtPm1pbm9yLAorCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBhY2w3MjI1YjogYm9hcmQ9JXMgMHglMDR4XG4iLCBkZXYtPm1pbm9yLAogCSAgICAgICB0aGlzX2JvYXJkLT5uYW1lLCBpb2Jhc2UpOwogCWlmICghcmVxdWVzdF9yZWdpb24oaW9iYXNlLCBpb3JhbmdlLCAiYWNsNzIyNWIiKSkgewotCQlwcmludGsoIkkvTyBwb3J0IGNvbmZsaWN0XG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJjb21lZGklZDogcmVxdWVzdF9yZWdpb24gZmFpbGVkIC0gSS9PIHBvcnQgY29uZmxpY3RcbiIsCisJCQlkZXYtPm1pbm9yKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCWRldi0+Ym9hcmRfbmFtZSA9IHRoaXNfYm9hcmQtPm5hbWU7CkBAIC0xMzcsMTQgKzEzOCwxMiBAQAogCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CiAJcy0+cHJpdmF0ZSA9ICh2b2lkICopQUNMNzIyNV9ESV9MTzsKIAotCXByaW50aygiXG4iKTsKLQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFjbDcyMjViX2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewotCXByaW50aygiY29tZWRpJWQ6IGFjbDcyMjViOiByZW1vdmVcbiIsIGRldi0+bWlub3IpOworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBhY2w3MjI1YjogcmVtb3ZlXG4iLCBkZXYtPm1pbm9yKTsKIAogCWlmIChkZXYtPmlvYmFzZSkKIAkJcmVsZWFzZV9yZWdpb24oZGV2LT5pb2Jhc2UsIHRoaXNfYm9hcmQtPmlvX3JhbmdlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvQVBDSTE3MTBfQ2hyb25vLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL0FQQ0kxNzEwX0Nocm9uby5jCmluZGV4IGNjYjEwOWEuLjBhZjEyZmQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL0FQQ0kxNzEwX0Nocm9uby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvQVBDSTE3MTBfQ2hyb25vLmMKQEAgLTEzODYsOCArMTM4Niw3IEBACiAJCQkJLyogVGVzdCB0aGUgdGltb3V0IHBhcmFtZXRlciAqLwogCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0JCQkJaWYgKCh1aV9UaW1lT3V0ID49IDApCi0JCQkJCSYmICh1aV9UaW1lT3V0IDw9IDY1NTM1VUwpKSB7CisJCQkJaWYgKHVpX1RpbWVPdXQgPD0gNjU1MzVVTCkgewogCiAJCQkJCWZvciAoOzspIHsKIAkJCSAgLyoqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL0FQQ0kxNzEwX0lOQ0NQVC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9BUENJMTcxMF9JTkNDUFQuYwppbmRleCA2YzA5MmVmLi5hMTVjOTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL0FQQ0kxNzEwX0lOQ0NQVC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvQVBDSTE3MTBfSU5DQ1BULmMKQEAgLTM4MDcsNyArMzgwNyw3IEBACiAJCQlzX01vZHVsZUluZm9bYl9Nb2R1bE5icl0uCiAJCQlzX1NpZW1lbnNDb3VudGVySW5mby5zX0luaXRGbGFnLmJfQ291bnRlckluaXQgPT0gMSkgewogCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkJCS8qIFRlc3QgaWYgZnJlcXVlbmN5IG1lc3VyZW1lbnQgaW5pdGlhbGlzZWQgKi8KKwkJCS8qIFRlc3QgaWYgZnJlcXVlbmN5IG1lYXN1cmVtZW50IGluaXRpYWxpc2VkICovCiAJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQlpZiAoZGV2cHJpdi0+CkBAIC0zOTUzLDcgKzM5NTMsNyBAQAogCQkJc19Nb2R1bGVJbmZvW2JfTW9kdWxOYnJdLgogCQkJc19TaWVtZW5zQ291bnRlckluZm8uc19Jbml0RmxhZy5iX0NvdW50ZXJJbml0ID09IDEpIHsKIAkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCQkvKiBUZXN0IGlmIGZyZXF1ZW5jeSBtZXN1cmVtZW50IGluaXRpYWxpc2VkICovCisJCQkvKiBUZXN0IGlmIGZyZXF1ZW5jeSBtZWFzdXJlbWVudCBpbml0aWFsaXNlZCAqLwogCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJaWYgKGRldnByaXYtPgpAQCAtNTE2Niw3ICs1MTY2LDcgQEAKIAkJCXNfTW9kdWxlSW5mb1tiX01vZHVsTmJyXS4KIAkJCXNfU2llbWVuc0NvdW50ZXJJbmZvLnNfSW5pdEZsYWcuYl9Db3VudGVySW5pdCA9PSAxKSB7CiAJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCQkJLyogVGVzdCBpZiBmcmVxdWVuY3kgbWVzdXJlbWVudCBpbml0aWFsaXNlZCAqLworCQkJLyogVGVzdCBpZiBmcmVxdWVuY3kgbWVhc3VyZW1lbnQgaW5pdGlhbGlzZWQgKi8KIAkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCWlmIChkZXZwcml2LT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvQVBDSTE3MTBfVG9yLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL0FQQ0kxNzEwX1Rvci5jCmluZGV4IDQzMTk4YWEuLjdlMTI1NDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvQVBDSTE3MTBfVG9yLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9BUENJMTcxMF9Ub3IuYwpAQCAtMTgwOCw3ICsxODA4LDcgQEAKIAkJCQkJCQkJCTIpIHsKIAkJCQkJCQkJCWlmIChkd19TdGF0dXMgJiA0KSB7CiAJCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKi8KLQkJCQkJCQkJCQkvKiBUb3IgY291bnRlciBvd2VyZmxvdyAqLworCQkJCQkJCQkJCS8qIFRvciBjb3VudGVyIG92ZXJmbG93ICovCiAJCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJCQkJCQkJCSpwYl9Ub3JDb3VudGVyU3RhdHVzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2FkZGlfY29tbW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2FkZGlfY29tbW9uLmgKaW5kZXggZWRkNjU3Yi4uM2FiMjdjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9hZGRpX2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvYWRkaV9jb21tb24uaApAQCAtODIsNyArODIsNyBAQAogCiAJaW50IGlfTmJyRGlDaGFubmVsOwkvKiAgTnVtYmVyIG9mIERJIGNoYW5uZWxzICovCiAJaW50IGlfTmJyRG9DaGFubmVsOwkvKiAgTnVtYmVyIG9mIERPIGNoYW5uZWxzICovCi0JaW50IGlfRG9NYXhkYXRhOwkvKiAgZGF0YSB0byBzZXQgYWxsIGNoYW5lbHMgaGlnaCAqLworCWludCBpX0RvTWF4ZGF0YTsJLyogIGRhdGEgdG8gc2V0IGFsbCBjaGFubmVscyBoaWdoICovCiAKIAlpbnQgaV9OYnJUVExDaGFubmVsOwkvKiAgTnVtYmVyIG9mIFRUTCBjaGFubmVscyAqLwogCWNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlICpwcl9UVExSYW5nZWxpc3Q7CS8qIHJhbmdlbGlzdCBmb3IgVFRMICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxMDMyLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxMDMyLmMKaW5kZXggZTkwMjFjZC4uNzIzYTk3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTAzMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTEwMzIuYwpAQCAtMTUwLDcgKzE1MCw3IEBACiAJdW5zaWduZWQgaW50IHVpX1RtcFZhbHVlID0gMDsKIAl1bnNpZ25lZCBpbnQgdWlfQ2hhbm5lbDsKIAl1aV9DaGFubmVsID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7Ci0JaWYgKHVpX0NoYW5uZWwgPj0gMCAmJiB1aV9DaGFubmVsIDw9IDMxKSB7CisJaWYgKHVpX0NoYW5uZWwgPD0gMzEpIHsKIAkJdWlfVG1wVmFsdWUgPSAodW5zaWduZWQgaW50KSBpbmwoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTEwMzJfRElHSVRBTF9JUCk7CiAvKgogKiBzaW5jZSBvbmx5IDEgY2hhbm5lbCByZXFkIHRvIGJyaW5nIGl0IHRvIGxhc3QgYml0IGl0IGlzIHJvdGF0ZWQgOApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTUwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTUwMC5jCmluZGV4IDIzNmI4YTMuLjM2YjkyOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1MDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxNTAwLmMKQEAgLTk2OCw3ICs5NjgsNyBAQAogCiAJc3dpdGNoIChkYXRhWzBdKSB7CiAJY2FzZSAwOgotCQlpZiAodWlfQ2hhbm5lbCA+PSAwICYmIHVpX0NoYW5uZWwgPD0gMTUpIHsKKwkJaWYgKHVpX0NoYW5uZWwgPD0gMTUpIHsKIAkJCXVpX1RtcFZhbHVlID0KIAkJCQkodW5zaWduZWQgaW50KSBpbncoZGV2cHJpdi0+aV9Jb2Jhc2VBZGRvbiArCiAJCQkJQVBDSTE1MDBfRElHSVRBTF9JUCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxNTE2LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxNTE2LmMKaW5kZXggMzg0MTYzNS4uODY2ZWI4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTUxNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1MTYuYwpAQCAtNzksNyArNzksNyBAQAogCXVuc2lnbmVkIGludCB1aV9UbXBWYWx1ZSA9IDA7CiAJdW5zaWduZWQgaW50IHVpX0NoYW5uZWw7CiAJdWlfQ2hhbm5lbCA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCWlmICh1aV9DaGFubmVsID49IDAgJiYgdWlfQ2hhbm5lbCA8PSA3KSB7CisJaWYgKHVpX0NoYW5uZWwgPD0gNykgewogCQl1aV9UbXBWYWx1ZSA9ICh1bnNpZ25lZCBpbnQpIGludyhkZXZwcml2LT5pb2Jhc2UgKyBBUENJMTUxNl9ESUdJVEFMX0lQKTsKIAkJLyogICBzaW5jZSBvbmx5IDEgY2hhbm5lbCByZXFkICB0byBicmluZyBpdCB0byBsYXN0IGJpdCBpdCBpcyByb3RhdGVkICovCiAJCS8qICAgOCArKGNoYW4gLSAxKSB0aW1lcyB0aGVuIEFORGVkIHdpdGggMSBmb3IgbGFzdCBiaXQuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxNTY0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxNTY0LmMKaW5kZXggM2E0N2MzMC4uM2FlNjYzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTU2NC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1NjQuYwpAQCAtMTU0LDcgKzE1NCw3IEBACiAJdW5zaWduZWQgaW50IHVpX0NoYW5uZWw7CiAKIAl1aV9DaGFubmVsID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7Ci0JaWYgKHVpX0NoYW5uZWwgPj0gMCAmJiB1aV9DaGFubmVsIDw9IDMxKSB7CisJaWYgKHVpX0NoYW5uZWwgPD0gMzEpIHsKIAkJdWlfVG1wVmFsdWUgPQogCQkJKHVuc2lnbmVkIGludCkgaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFQQ0kxNTY0X0RJR0lUQUxfSVApOwogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTIwMTYuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTIwMTYuYwppbmRleCA0NTc5MTdmLi5kMzQ4Y2Q1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kyMDE2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMjAxNi5jCkBAIC0xMTcsNyArMTE3LDcgQEAKIAl1bnNpZ25lZCBpbnQgdWlfTm9PZkNoYW5uZWw7CiAJdW5zaWduZWQgaW50IHVpX1RlbXAsIHVpX1RlbXAxOwogCXVpX05vT2ZDaGFubmVsID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7Ci0JaWYgKCh1aV9Ob09mQ2hhbm5lbCA8IDApIHx8ICh1aV9Ob09mQ2hhbm5lbCA+IDE1KSkgeworCWlmICh1aV9Ob09mQ2hhbm5lbCA+IDE1KSB7CiAJCWNvbWVkaV9lcnJvcihkZXYsCiAJCQkiSW52YWxpZCBDaGFubmVsIE51bWJlcnMgISEhLCBDaGFubmVsIE51bWJlcnMgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDE1XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yNzIsNyArMjcyLDcgQEAKIAl1bnNpZ25lZCBpbnQgdWlfVGVtcDsKIAl1bnNpZ25lZCBpbnQgdWlfTm9PZkNoYW5uZWw7CiAJdWlfTm9PZkNoYW5uZWwgPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKLQlpZiAoKHVpX05vT2ZDaGFubmVsIDwgMCkgfHwgKHVpX05vT2ZDaGFubmVsID4gMTUpKSB7CisJaWYgKHVpX05vT2ZDaGFubmVsID4gMTUpIHsKIAkJY29tZWRpX2Vycm9yKGRldiwKIAkJCSJJbnZhbGlkIENoYW5uZWwgTnVtYmVycyAhISEsIENoYW5uZWwgTnVtYmVycyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTVcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTIyMDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTIyMDAuYwppbmRleCBhODUzYzYyLi5hYTE1OWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kyMjAwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMjIwMC5jCkBAIC03OSw3ICs3OSw3IEBACiAJdW5zaWduZWQgaW50IHVpX1RtcFZhbHVlID0gMDsKIAl1bnNpZ25lZCBpbnQgdWlfQ2hhbm5lbDsKIAl1aV9DaGFubmVsID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7Ci0JaWYgKHVpX0NoYW5uZWwgPj0gMCAmJiB1aV9DaGFubmVsIDw9IDcpIHsKKwlpZiAodWlfQ2hhbm5lbCA8PSA3KSB7CiAJCXVpX1RtcFZhbHVlID0gKHVuc2lnbmVkIGludCkgaW53KGRldnByaXYtPmlvYmFzZSArIEFQQ0kyMjAwX0RJR0lUQUxfSVApOwogCQkqZGF0YSA9ICh1aV9UbXBWYWx1ZSA+PiB1aV9DaGFubmVsKSAmIDB4MTsKIAl9CQkJLyogaWYodWlfQ2hhbm5lbCA+PSAwICYmIHVpX0NoYW5uZWwgPD03KSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzEyMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzEyMC5jCmluZGV4IDE2OWNlZTQuLjE3MmZiYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTMxMjAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzMTIwLmMKQEAgLTE0NjgsNyArMTQ2OCw3IEBACiAJaW50X2FtY2MgPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgQU1DQ19PUF9SRUdfSU5UQ1NSKTsJLyogIGdldCBBTUNDIGludCByZWdpc3RlciAqLwogCiAJaWYgKCghaW50X2RhcSkgJiYgKCEoaW50X2FtY2MgJiBBTllfUzU5M1hfSU5UKSkpIHsKLQkJY29tZWRpX2Vycm9yKGRldiwgIklSUSBmcm9tIHVua25vdyBzb3VyY2UiKTsKKwkJY29tZWRpX2Vycm9yKGRldiwgIklSUSBmcm9tIHVua25vd24gc291cmNlIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTIzNTAsNyArMjM1MCw3IEBACiAJdWlfQ2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwkvKiAgY2hhbm5lbCBzcGVjaWZpZWQgKi8KIAogCS8qIHRoaXNfYm9hcmQtPmlfaHdkcnZfSW5zblJlYWREaWdpdGFsSW5wdXQoZGV2LHVpX0NoYW4sZGF0YSk7ICovCi0JaWYgKHVpX0NoYW4gPj0gMCAmJiB1aV9DaGFuIDw9IDMpIHsKKwlpZiAodWlfQ2hhbiA8PSAzKSB7CiAJCXVpX1RtcFZhbHVlID0gKHVuc2lnbmVkIGludCkgaW53KGRldnByaXYtPmlvYmFzZSArIEFQQ0kzMTIwX1JEX1NUQVRVUyk7CiAKIC8qCkBAIC0yNTM5LDggKzI1MzksNyBAQAogCQkJIk5vdCBhIHZhbGlkIERhdGEgISEhICxEYXRhIHNob3VsZCBiZSAxIG9yIDBcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKCh1aV9Ob09mQ2hhbm5lbCA+ICh0aGlzX2JvYXJkLT5pX05ickRvQ2hhbm5lbCAtIDEpKQotCQl8fCAodWlfTm9PZkNoYW5uZWwgPCAwKSkgeworCWlmICh1aV9Ob09mQ2hhbm5lbCA+IHRoaXNfYm9hcmQtPmlfTmJyRG9DaGFubmVsIC0gMSkgewogCQljb21lZGlfZXJyb3IoZGV2LAogCQkJIlRoaXMgYm9hcmQgZG9lc24ndCBoYXZlIHNwZWNpZmllZCBjaGFubmVsICEhISBcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTMyMDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTMyMDAuYwppbmRleCAwMTA2OTdmLi45OGMyMzg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzMjAwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzIwMC5jCkBAIC00NjEsNyArNDYxLDcgQEAKIAlpZiAoc19Cb2FyZEluZm9zW2Rldi0+bWlub3JdLmlfQ29ubmVjdGlvblR5cGUgPT0gMSkgewogCQkvKiBpZiBkaWZmICovCiAKLQkJaWYgKCh1aV9DaGFubmVsX251bSA+PSAwKSAmJiAodWlfQ2hhbm5lbF9udW0gPD0gMSkpCisJCWlmICh1aV9DaGFubmVsX251bSA8PSAxKQogCQkJaV9EaWZmQ2hhbm5lbCA9IHVpX0NoYW5uZWxfbnVtLCBpX01vZHVsZSA9IDA7CiAJCWVsc2UgaWYgKCh1aV9DaGFubmVsX251bSA+PSAyKSAmJiAodWlfQ2hhbm5lbF9udW0gPD0gMykpCiAJCQlpX0RpZmZDaGFubmVsID0gdWlfQ2hhbm5lbF9udW0gLSAyLCBpX01vZHVsZSA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzNTAxLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzNTAxLmMKaW5kZXggZWYyMWYwMy4uN2IzOGQxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzUwMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTM1MDEuYwpAQCAtNzI0LDcgKzcyNCw3IEBACiAJCUFQQ0kzNTAxX1RDV19JUlEpICYgMHgxOwogCiAJaWYgKCghdWlfVGltZXJfQU9XYXRjaGRvZykpIHsKLQkJY29tZWRpX2Vycm9yKGRldiwgIklSUSBmcm9tIHVua25vdyBzb3VyY2UiKTsKKwkJY29tZWRpX2Vycm9yKGRldiwgIklSUSBmcm9tIHVua25vd24gc291cmNlIik7CiAJCXJldHVybjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTN4eHguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTN4eHguYwppbmRleCAzMzg3Mjc4Li4xZDFlNWZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzeHh4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpM3h4eC5jCkBAIC0xNDgsNyArMTQ4LDcgQEAKIAkJCS8qIFRlc3QgdGhlIGNvbnZlcnQgdGltZSB2YWx1ZSAqLwogCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0JCQlpZiAoKGR3X1JlbG9hZFZhbHVlID49IDApICYmIChkd19SZWxvYWRWYWx1ZSA8PSA2NTUzNSkpIHsKKwkJCWlmIChkd19SZWxvYWRWYWx1ZSA8PSA2NTUzNSkgewogCQkJCWR3X1Rlc3RSZWxvYWRWYWx1ZSA9IGR3X1JlbG9hZFZhbHVlOwogCiAJCQkJaWYgKGJfVGltZUJhc2UgPT0gMSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k2MjA4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTYyMDguYwppbmRleCA4ZTFiZWZjLi42OTI1ZmFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTYyMDguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTYyMDguYwpAQCAtMTMzLDkgKzEzMywxMSBAQAogc3RhdGljIGludCBwY2k2MjA4X2FvX3JpbnNuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpOwotLyogc3RhdGljIGludCBwY2k2MjA4X2Rpb19pbnNuX2JpdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldixzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgKi8KKy8qIHN0YXRpYyBpbnQgcGNpNjIwOF9kaW9faW5zbl9iaXRzIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorICogCQkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgKi8KIC8qIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbix1bnNpZ25lZCBpbnQgKmRhdGEpOyAqLwotLyogc3RhdGljIGludCBwY2k2MjA4X2Rpb19pbnNuX2NvbmZpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCAqLworLyogc3RhdGljIGludCBwY2k2MjA4X2Rpb19pbnNuX2NvbmZpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorICogCQkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgKi8KIC8qIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbix1bnNpZ25lZCBpbnQgKmRhdGEpOyAqLwogCiAvKgpAQCAtMTUxLDcgKzE1Myw3IEBACiAJaW50IHJldHZhbDsKIAl1bnNpZ25lZCBsb25nIGlvX2Jhc2U7CiAKLQlwcmludGsoImNvbWVkaSVkOiBwY2k2MjA4OiAiLCBkZXYtPm1pbm9yKTsKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogcGNpNjIwODogIiwgZGV2LT5taW5vcik7CiAKIAlyZXR2YWwgPSBhbGxvY19wcml2YXRlKGRldiwgc2l6ZW9mKHN0cnVjdCBwY2k2MjA4X3ByaXZhdGUpKTsKIAlpZiAocmV0dmFsIDwgMCkKQEAgLTE5NSw3ICsxOTcsNyBAQAogCS8qIHMtPmluc25fYml0cyA9IHBjaTYyMDhfZGlvX2luc25fYml0czsgKi8KIAkvKiBzLT5pbnNuX2NvbmZpZyA9IHBjaTYyMDhfZGlvX2luc25fY29uZmlnOyAqLwogCi0JcHJpbnRrKCJhdHRhY2hlZFxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiYXR0YWNoZWRcbiIpOwogCiAJcmV0dXJuIDE7CiB9CkBAIC0yMTAsMTIgKzIxMiwxMSBAQAogICovCiBzdGF0aWMgaW50IHBjaTYyMDhfZGV0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7Ci0JcHJpbnRrKCJjb21lZGklZDogcGNpNjIwODogcmVtb3ZlXG4iLCBkZXYtPm1pbm9yKTsKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogcGNpNjIwODogcmVtb3ZlXG4iLCBkZXYtPm1pbm9yKTsKIAogCWlmIChkZXZwcml2ICYmIGRldnByaXYtPnBjaV9kZXYpIHsKLQkJaWYgKGRldi0+aW9iYXNlKSB7CisJCWlmIChkZXYtPmlvYmFzZSkKIAkJCWNvbWVkaV9wY2lfZGlzYWJsZShkZXZwcml2LT5wY2lfZGV2KTsKLQkJfQogCQlwY2lfZGV2X3B1dChkZXZwcml2LT5wY2lfZGV2KTsKIAl9CiAKQEAgLTI2Niw3ICsyNjcsOCBAQAogICogdXNlZnVsIHRvIGFwcGxpY2F0aW9ucyBpZiB5b3UgaW1wbGVtZW50IHRoZSBpbnNuX2JpdHMgaW50ZXJmYWNlLgogICogVGhpcyBhbGxvd3MgcGFja2VkIHJlYWRpbmcvd3JpdGluZyBvZiB0aGUgRElPIGNoYW5uZWxzLiAgVGhlCiAgKiBjb21lZGkgY29yZSBjYW4gY29udmVydCBiZXR3ZWVuIGluc25fYml0cyBhbmQgaW5zbl9yZWFkL3dyaXRlICovCi0vKiBzdGF0aWMgaW50IHBjaTYyMDhfZGlvX2luc25fYml0cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCAqLworLyogc3RhdGljIGludCBwY2k2MjA4X2Rpb19pbnNuX2JpdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKyAqIAkJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICovCiAvKiBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sdW5zaWduZWQgaW50ICpkYXRhKSAqLwogLyogeyAqLwogLyogaWYoaW5zbi0+biE9MilyZXR1cm4gLUVJTlZBTDsgKi8KQEAgLTI5MCw3ICsyOTIsOCBAQAogLyogcmV0dXJuIDI7ICovCiAvKiB9ICovCiAKLS8qIHN0YXRpYyBpbnQgcGNpNjIwOF9kaW9faW5zbl9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldixzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgKi8KKy8qIHN0YXRpYyBpbnQgcGNpNjIwOF9kaW9faW5zbl9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKyAqIAkJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICovCiAvKiBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sdW5zaWduZWQgaW50ICpkYXRhKSAqLwogLyogeyAqLwogLyogaW50IGNoYW49Q1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7ICovCkBAIC0zMjAsMTAgKzMyMywxNiBAQAogCSAgICAgcGNpX2RldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBjaV9kZXYpKSB7CiAJCWlmIChwY2lfZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9BRExJTkspIHsKIAkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBjaTYyMDhfYm9hcmRzKTsgaSsrKSB7Ci0JCQkJaWYgKHBjaTYyMDhfYm9hcmRzW2ldLmRldl9pZCA9PSBwY2lfZGV2LT5kZXZpY2UpIHsKLQkJCQkJLyogIHdhcyBhIHBhcnRpY3VsYXIgYnVzL3Nsb3QgcmVxdWVzdGVkPyAqLworCQkJCWlmIChwY2k2MjA4X2JvYXJkc1tpXS5kZXZfaWQgPT0KKwkJCQkJcGNpX2Rldi0+ZGV2aWNlKSB7CisJCQkJCS8qCisJCQkJCSAqIHdhcyBhIHBhcnRpY3VsYXIgYnVzL3Nsb3QgcmVxdWVzdGVkPworCQkJCQkqLwogCQkJCQlpZiAoKGJ1cyAhPSAwKSB8fCAoc2xvdCAhPSAwKSkgewotCQkJCQkJLyogIGFyZSB3ZSBvbiB0aGUgd3JvbmcgYnVzL3Nsb3Q/ICovCisJCQkJCQkvKgorCQkJCQkJICogYXJlIHdlIG9uIHRoZQorCQkJCQkJICogd3JvbmcgYnVzL3Nsb3Q/CisJCQkJCQkqLwogCQkJCQkJaWYgKHBjaV9kZXYtPmJ1cy0+bnVtYmVyCiAJCQkJCQkgICAgIT0gYnVzIHx8CiAJCQkJCQkgICAgUENJX1NMT1QocGNpX2Rldi0+ZGV2Zm4pCkBAIC0zMzgsOCArMzQ3LDkgQEAKIAkJfQogCX0KIAotCXByaW50aygiY29tZWRpJWQ6IG5vIHN1cHBvcnRlZCBib2FyZCBmb3VuZCEgKHJlcS4gYnVzL3Nsb3QgOiAlZC8lZClcbiIsCi0JICAgICAgIGRldi0+bWlub3IsIGJ1cywgc2xvdCk7CisJcHJpbnRrKEtFUk5fRVJSICJjb21lZGklZDogbm8gc3VwcG9ydGVkIGJvYXJkIGZvdW5kISAiCisJCQkiKHJlcS4gYnVzL3Nsb3QgOiAlZC8lZClcbiIsCisJCQlkZXYtPm1pbm9yLCBidXMsIHNsb3QpOwogCXJldHVybiAtRUlPOwogCiBmb3VuZDoKQEAgLTM2OCwxNyArMzc4LDIwIEBACiAKIAkvKiAgRW5hYmxlIFBDSSBkZXZpY2UgYW5kIHJlcXVlc3QgcmVnaW9ucyAqLwogCWlmIChjb21lZGlfcGNpX2VuYWJsZShwY2lfZGV2LCBQQ0k2MjA4X0RSSVZFUl9OQU1FKSA8IDApIHsKLQkJcHJpbnRrCi0JCSAgICAoImNvbWVkaSVkOiBGYWlsZWQgdG8gZW5hYmxlIFBDSSBkZXZpY2UgYW5kIHJlcXVlc3QgcmVnaW9uc1xuIiwKLQkJICAgICBkZXZfbWlub3IpOworCQlwcmludGsoS0VSTl9FUlIgImNvbWVkaSVkOiBGYWlsZWQgdG8gZW5hYmxlIFBDSSBkZXZpY2UgIgorCQkJImFuZCByZXF1ZXN0IHJlZ2lvbnNcbiIsCisJCQlkZXZfbWlub3IpOwogCQlyZXR1cm4gLUVJTzsKIAl9Ci0JLyogIFJlYWQgbG9jYWwgY29uZmlndXJhdGlvbiByZWdpc3RlciBiYXNlIGFkZHJlc3MgW1BDSV9CQVNFX0FERFJFU1MgIzFdLiAqLworCS8qIFJlYWQgbG9jYWwgY29uZmlndXJhdGlvbiByZWdpc3RlcgorCSAqIGJhc2UgYWRkcmVzcyBbUENJX0JBU0VfQUREUkVTUyAjMV0uCisJICovCiAJbGNyX2lvX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMSk7CiAJbGNyX2lvX3JhbmdlID0gcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2LCAxKTsKIAotCXByaW50aygiY29tZWRpJWQ6IGxvY2FsIGNvbmZpZyByZWdpc3RlcnMgYXQgYWRkcmVzcyAweCU0bHggWzB4JTRseF1cbiIsCi0JICAgICAgIGRldl9taW5vciwgbGNyX2lvX2Jhc2UsIGxjcl9pb19yYW5nZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IGxvY2FsIGNvbmZpZyByZWdpc3RlcnMgYXQgYWRkcmVzcyIKKwkJCSIgMHglNGx4IFsweCU0bHhdXG4iLAorCQkJZGV2X21pbm9yLCBsY3JfaW9fYmFzZSwgbGNyX2lvX3JhbmdlKTsKIAogCS8qICBSZWFkIFBDSTYyMDggcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIFtQQ0lfQkFTRV9BRERSRVNTICMyXS4gKi8KIAlpb19iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k3Mjk2LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTcyOTYuYwppbmRleCA0ZGU2ZmFkLi44NjAyODY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTcyOTYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTcyOTYuYwpAQCAtODIsOCArODIsNyBAQAogCWludCBidXMsIHNsb3Q7CiAJaW50IHJldDsKIAotCXByaW50aygiY29tZWRpOiBhdHRlbXB0IHRvIGF0dGFjaC4uLlxuIik7Ci0JcHJpbnRrKCJjb21lZGklZDogYWRsX3BjaTc0MzJcbiIsIGRldi0+bWlub3IpOworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBhdHRhY2ggYWRsX3BjaTc0MzJcbiIsIGRldi0+bWlub3IpOwogCiAJZGV2LT5ib2FyZF9uYW1lID0gInBjaTc0MzIiOwogCWJ1cyA9IGl0LT5vcHRpb25zWzBdOwpAQCAtMTEwLDE0ICsxMDksMTQgQEAKIAkJCX0KIAkJCWRldnByaXYtPnBjaV9kZXYgPSBwY2lkZXY7CiAJCQlpZiAoY29tZWRpX3BjaV9lbmFibGUocGNpZGV2LCAiYWRsX3BjaTcyOTYiKSA8IDApIHsKLQkJCQlwcmludGsKLQkJCQkgICAgKCJjb21lZGklZDogRmFpbGVkIHRvIGVuYWJsZSBQQ0kgZGV2aWNlIGFuZCByZXF1ZXN0IHJlZ2lvbnNcbiIsCisJCQkJcHJpbnRrKEtFUk5fRVJSICJjb21lZGklZDogRmFpbGVkIHRvIGVuYWJsZSBQQ0kgZGV2aWNlIGFuZCByZXF1ZXN0IHJlZ2lvbnNcbiIsCiAJCQkJICAgICBkZXYtPm1pbm9yKTsKIAkJCQlyZXR1cm4gLUVJTzsKIAkJCX0KIAogCQkJZGV2LT5pb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAyKTsKLQkJCXByaW50aygiY29tZWRpOiBiYXNlIGFkZHIgJTRseFxuIiwgZGV2LT5pb2Jhc2UpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpOiBiYXNlIGFkZHIgJTRseFxuIiwKKwkJCQlkZXYtPmlvYmFzZSk7CiAKIAkJCS8qICBmb3VyIDgyNTUgZGlnaXRhbCBpbyBzdWJkZXZpY2VzICovCiAJCQlzID0gZGV2LT5zdWJkZXZpY2VzICsgMDsKQEAgLTE0NSwyNSArMTQ0LDI1IEBACiAJCQlpZiAocmV0IDwgMCkKIAkJCQlyZXR1cm4gcmV0OwogCi0JCQlwcmludGsoImF0dGFjaGVkXG4iKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJjb21lZGklZDogYWRsX3BjaTc0MzIgYXR0YWNoZWRcbiIsCisJCQkJZGV2LT5taW5vcik7CiAKIAkJCXJldHVybiAxOwogCQl9CiAJfQogCi0JcHJpbnRrKCJjb21lZGklZDogbm8gc3VwcG9ydGVkIGJvYXJkIGZvdW5kISAocmVxLiBidXMvc2xvdCA6ICVkLyVkKVxuIiwKKwlwcmludGsoS0VSTl9FUlIgImNvbWVkaSVkOiBubyBzdXBwb3J0ZWQgYm9hcmQgZm91bmQhIChyZXEuIGJ1cy9zbG90IDogJWQvJWQpXG4iLAogCSAgICAgICBkZXYtPm1pbm9yLCBidXMsIHNsb3QpOwogCXJldHVybiAtRUlPOwogfQogCiBzdGF0aWMgaW50IGFkbF9wY2k3Mjk2X2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewotCXByaW50aygiY29tZWRpJWQ6IHBjaTc0MzI6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IHBjaTc0MzI6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CiAKIAlpZiAoZGV2cHJpdiAmJiBkZXZwcml2LT5wY2lfZGV2KSB7Ci0JCWlmIChkZXYtPmlvYmFzZSkgeworCQlpZiAoZGV2LT5pb2Jhc2UpCiAJCQljb21lZGlfcGNpX2Rpc2FibGUoZGV2cHJpdi0+cGNpX2Rldik7Ci0JCX0KIAkJcGNpX2Rldl9wdXQoZGV2cHJpdi0+cGNpX2Rldik7CiAJfQogCS8qICBkZXRhY2ggZm91ciA4MjU1IGRpZ2l0YWwgaW8gc3ViZGV2aWNlcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k3NDMyLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTc0MzIuYwppbmRleCBlMDg0NGM2Li5iNWE5NDk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTc0MzIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTc0MzIuYwpAQCAtOTAsOCArOTAsNyBAQAogCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOwogCWludCBidXMsIHNsb3Q7CiAKLQlwcmludGsoImNvbWVkaTogYXR0ZW1wdCB0byBhdHRhY2guLi5cbiIpOwotCXByaW50aygiY29tZWRpJWQ6IGFkbF9wY2k3NDMyXG4iLCBkZXYtPm1pbm9yKTsKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogYXR0YWNoIGFkbF9wY2k3NDMyXG4iLCBkZXYtPm1pbm9yKTsKIAogCWRldi0+Ym9hcmRfbmFtZSA9ICJwY2k3NDMyIjsKIAlidXMgPSBpdC0+b3B0aW9uc1swXTsKQEAgLTExOCwxMyArMTE3LDEzIEBACiAJCQl9CiAJCQlkZXZwcml2LT5wY2lfZGV2ID0gcGNpZGV2OwogCQkJaWYgKGNvbWVkaV9wY2lfZW5hYmxlKHBjaWRldiwgImFkbF9wY2k3NDMyIikgPCAwKSB7Ci0JCQkJcHJpbnRrCi0JCQkJICAgICgiY29tZWRpJWQ6IEZhaWxlZCB0byBlbmFibGUgUENJIGRldmljZSBhbmQgcmVxdWVzdCByZWdpb25zXG4iLAorCQkJCXByaW50ayhLRVJOX0VSUiAiY29tZWRpJWQ6IEZhaWxlZCB0byBlbmFibGUgUENJIGRldmljZSBhbmQgcmVxdWVzdCByZWdpb25zXG4iLAogCQkJCSAgICAgZGV2LT5taW5vcik7CiAJCQkJcmV0dXJuIC1FSU87CiAJCQl9CiAJCQlkZXYtPmlvYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDIpOwotCQkJcHJpbnRrKCJjb21lZGk6IGJhc2UgYWRkciAlNGx4XG4iLCBkZXYtPmlvYmFzZSk7CisJCQlwcmludGsoS0VSTl9JTkZPICJjb21lZGk6IGJhc2UgYWRkciAlNGx4XG4iLAorCQkJCWRldi0+aW9iYXNlKTsKIAogCQkJcyA9IGRldi0+c3ViZGV2aWNlcyArIDA7CiAJCQlzLT50eXBlID0gQ09NRURJX1NVQkRfREk7CkBAIC0xNDgsMjUgKzE0NywyNCBAQAogCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKIAkJCXMtPmluc25fYml0cyA9IGFkbF9wY2k3NDMyX2RvX2luc25fYml0czsKIAotCQkJcHJpbnRrKCJjb21lZGk6IGF0dGFjaGVkXG4iKTsKLQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImNvbWVkaSVkOiBhZGxfcGNpNzQzMiBhdHRhY2hlZFxuIiwKKwkJCQlkZXYtPm1pbm9yKTsKIAkJCXJldHVybiAxOwogCQl9CiAJfQogCi0JcHJpbnRrKCJjb21lZGklZDogbm8gc3VwcG9ydGVkIGJvYXJkIGZvdW5kISAocmVxLiBidXMvc2xvdCA6ICVkLyVkKVxuIiwKKwlwcmludGsoS0VSTl9FUlIgImNvbWVkaSVkOiBubyBzdXBwb3J0ZWQgYm9hcmQgZm91bmQhIChyZXEuIGJ1cy9zbG90IDogJWQvJWQpXG4iLAogCSAgICAgICBkZXYtPm1pbm9yLCBidXMsIHNsb3QpOwogCXJldHVybiAtRUlPOwogfQogCiBzdGF0aWMgaW50IGFkbF9wY2k3NDMyX2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewotCXByaW50aygiY29tZWRpJWQ6IHBjaTc0MzI6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IHBjaTc0MzI6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CiAKIAlpZiAoZGV2cHJpdiAmJiBkZXZwcml2LT5wY2lfZGV2KSB7Ci0JCWlmIChkZXYtPmlvYmFzZSkgeworCQlpZiAoZGV2LT5pb2Jhc2UpCiAJCQljb21lZGlfcGNpX2Rpc2FibGUoZGV2cHJpdi0+cGNpX2Rldik7Ci0JCX0KIAkJcGNpX2Rldl9wdXQoZGV2cHJpdi0+cGNpX2Rldik7CiAJfQogCkBAIC0xNzgsOCArMTc2LDggQEAKIAkJCQkgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7Ci0JcHJpbnRrKCJjb21lZGk6IHBjaTc0MzJfZG9faW5zbl9iaXRzIGNhbGxlZFxuIik7Ci0JcHJpbnRrKCJjb21lZGk6IGRhdGEwOiAlOHggZGF0YTE6ICU4eFxuIiwgZGF0YVswXSwgZGF0YVsxXSk7CisJcHJpbnRrKEtFUk5fREVCVUcgImNvbWVkaTogcGNpNzQzMl9kb19pbnNuX2JpdHMgY2FsbGVkXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiY29tZWRpOiBkYXRhMDogJTh4IGRhdGExOiAlOHhcbiIsIGRhdGFbMF0sIGRhdGFbMV0pOwogCiAJaWYgKGluc24tPm4gIT0gMikKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xODgsNyArMTg2LDcgQEAKIAkJcy0+c3RhdGUgJj0gfmRhdGFbMF07CiAJCXMtPnN0YXRlIHw9IChkYXRhWzBdICYgZGF0YVsxXSk7CiAKLQkJcHJpbnRrKCJjb21lZGk6IG91dDogJTh4IG9uIGlvYmFzZSAlNGx4XG4iLCBzLT5zdGF0ZSwKKwkJcHJpbnRrKEtFUk5fREVCVUcgImNvbWVkaTogb3V0OiAlOHggb24gaW9iYXNlICU0bHhcbiIsIHMtPnN0YXRlLAogCQkgICAgICAgZGV2LT5pb2Jhc2UgKyBQQ0k3NDMyX0RPKTsKIAkJb3V0bChzLT5zdGF0ZSAmIDB4ZmZmZmZmZmYsIGRldi0+aW9iYXNlICsgUENJNzQzMl9ETyk7CiAJfQpAQCAtMjAwLDE0ICsxOTgsMTQgQEAKIAkJCQkgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7Ci0JcHJpbnRrKCJjb21lZGk6IHBjaTc0MzJfZGlfaW5zbl9iaXRzIGNhbGxlZFxuIik7Ci0JcHJpbnRrKCJjb21lZGk6IGRhdGEwOiAlOHggZGF0YTE6ICU4eFxuIiwgZGF0YVswXSwgZGF0YVsxXSk7CisJcHJpbnRrKEtFUk5fREVCVUcgImNvbWVkaTogcGNpNzQzMl9kaV9pbnNuX2JpdHMgY2FsbGVkXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiY29tZWRpOiBkYXRhMDogJTh4IGRhdGExOiAlOHhcbiIsIGRhdGFbMF0sIGRhdGFbMV0pOwogCiAJaWYgKGluc24tPm4gIT0gMikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlkYXRhWzFdID0gaW5sKGRldi0+aW9iYXNlICsgUENJNzQzMl9ESSkgJiAweGZmZmZmZmZmOwotCXByaW50aygiY29tZWRpOiBkYXRhMSAlOHhcbiIsIGRhdGFbMV0pOworCXByaW50ayhLRVJOX0RFQlVHICJjb21lZGk6IGRhdGExICU4eFxuIiwgZGF0YVsxXSk7CiAKIAlyZXR1cm4gMjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpODE2NC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k4MTY0LmMKaW5kZXggNDM3NDVlYy4uZGEyNTZhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k4MTY0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k4MTY0LmMKQEAgLTM1LDYgKzM1LDcgQEAKICovCiAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgImNvbWVkaV9mYy5oIgogI2luY2x1ZGUgImNvbWVkaV9wY2kuaCIKQEAgLTEyOCw4ICsxMjksOCBAQAogCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOwogCWludCBidXMsIHNsb3Q7CiAKLQlwcmludGsoImNvbWVkaTogYXR0ZW1wdCB0byBhdHRhY2guLi5cbiIpOwotCXByaW50aygiY29tZWRpJWQ6IGFkbF9wY2k4MTY0XG4iLCBkZXYtPm1pbm9yKTsKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGk6IGF0dGVtcHQgdG8gYXR0YWNoLi4uXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogYWRsX3BjaTgxNjRcbiIsIGRldi0+bWlub3IpOwogCiAJZGV2LT5ib2FyZF9uYW1lID0gInBjaTgxNjQiOwogCWJ1cyA9IGl0LT5vcHRpb25zWzBdOwpAQCAtMTUwLDE5ICsxNTEsMTggQEAKIAkJCWlmIChidXMgfHwgc2xvdCkgewogCQkJCS8qIHJlcXVlc3RlZCBwYXJ0aWN1bGFyIGJ1cy9zbG90ICovCiAJCQkJaWYgKHBjaWRldi0+YnVzLT5udW1iZXIgIT0gYnVzCi0JCQkJICAgIHx8IFBDSV9TTE9UKHBjaWRldi0+ZGV2Zm4pICE9IHNsb3QpIHsKKwkJCQkJfHwgUENJX1NMT1QocGNpZGV2LT5kZXZmbikgIT0gc2xvdCkKIAkJCQkJY29udGludWU7Ci0JCQkJfQogCQkJfQogCQkJZGV2cHJpdi0+cGNpX2RldiA9IHBjaWRldjsKIAkJCWlmIChjb21lZGlfcGNpX2VuYWJsZShwY2lkZXYsICJhZGxfcGNpODE2NCIpIDwgMCkgewotCQkJCXByaW50awotCQkJCSAgICAoImNvbWVkaSVkOiBGYWlsZWQgdG8gZW5hYmxlIFBDSSBkZXZpY2UgYW5kIHJlcXVlc3QgcmVnaW9uc1xuIiwKLQkJCQkgICAgIGRldi0+bWlub3IpOworCQkJCXByaW50ayhLRVJOX0VSUiAiY29tZWRpJWQ6IEZhaWxlZCB0byBlbmFibGUgIgorCQkJCSJQQ0kgZGV2aWNlIGFuZCByZXF1ZXN0IHJlZ2lvbnNcbiIsIGRldi0+bWlub3IpOwogCQkJCXJldHVybiAtRUlPOwogCQkJfQogCQkJZGV2LT5pb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAyKTsKLQkJCXByaW50aygiY29tZWRpOiBiYXNlIGFkZHIgJTRseFxuIiwgZGV2LT5pb2Jhc2UpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgImNvbWVkaTogYmFzZSBhZGRyICU0bHhcbiIsCisJCQkJICAgZGV2LT5pb2Jhc2UpOwogCiAJCQlzID0gZGV2LT5zdWJkZXZpY2VzICsgMDsKIAkJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9QUk9DOwpAQCAtMjA0LDI1ICsyMDQsMjQgQEAKIAkJCXMtPmluc25fcmVhZCA9IGFkbF9wY2k4MTY0X2luc25fcmVhZF9idWYxOwogCQkJcy0+aW5zbl93cml0ZSA9IGFkbF9wY2k4MTY0X2luc25fd3JpdGVfYnVmMTsKIAotCQkJcHJpbnRrKCJjb21lZGk6IGF0dGFjaGVkXG4iKTsKKwkJCXByaW50ayhLRVJOX0lORk8gImNvbWVkaTogYXR0YWNoZWRcbiIpOwogCiAJCQlyZXR1cm4gMTsKIAkJfQogCX0KIAotCXByaW50aygiY29tZWRpJWQ6IG5vIHN1cHBvcnRlZCBib2FyZCBmb3VuZCEgKHJlcS4gYnVzL3Nsb3QgOiAlZC8lZClcbiIsCi0JICAgICAgIGRldi0+bWlub3IsIGJ1cywgc2xvdCk7CisJcHJpbnRrKEtFUk5fRVJSICJjb21lZGklZDogbm8gc3VwcG9ydGVkIGJvYXJkIGZvdW5kISIKKwkJICAgIihyZXEuIGJ1cy9zbG90IDogJWQvJWQpXG4iLCBkZXYtPm1pbm9yLCBidXMsIHNsb3QpOwogCXJldHVybiAtRUlPOwogfQogCiBzdGF0aWMgaW50IGFkbF9wY2k4MTY0X2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewotCXByaW50aygiY29tZWRpJWQ6IHBjaTgxNjQ6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IHBjaTgxNjQ6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CiAKIAlpZiAoZGV2cHJpdiAmJiBkZXZwcml2LT5wY2lfZGV2KSB7Ci0JCWlmIChkZXYtPmlvYmFzZSkgeworCQlpZiAoZGV2LT5pb2Jhc2UpCiAJCQljb21lZGlfcGNpX2Rpc2FibGUoZGV2cHJpdi0+cGNpX2Rldik7Ci0JCX0KIAkJcGNpX2Rldl9wdXQoZGV2cHJpdi0+cGNpX2Rldik7CiAJfQogCkBAIC0yNjcsOCArMjY2LDkgQEAKIAl9CiAKIAlkYXRhWzBdID0gaW53KGRldi0+aW9iYXNlICsgYXhpc19yZWcgKyBvZmZzZXQpOwotCXByaW50aygiY29tZWRpOiBwY2k4MTY0ICVzIHJlYWQgLT4gJTA0WDolMDRYIG9uIGF4aXMgJXNcbiIsIGFjdGlvbiwKLQkgICAgICAgZGF0YVswXSwgZGF0YVsxXSwgYXhpc25hbWUpOworCXByaW50ayhLRVJOX0RFQlVHICJjb21lZGk6IHBjaTgxNjQgJXMgcmVhZCAtPiAiCisJCQkJCQkgICIlMDRYOiUwNFggb24gYXhpcyAlc1xuIiwKKwkJCQlhY3Rpb24sIGRhdGFbMF0sIGRhdGFbMV0sIGF4aXNuYW1lKTsKIH0KIAogc3RhdGljIGludCBhZGxfcGNpODE2NF9pbnNuX3JlYWRfbXN0cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtMzQ3LDggKzM0Nyw5IEBACiAKIAlvdXR3KGRhdGFbMF0sIGRldi0+aW9iYXNlICsgYXhpc19yZWcgKyBvZmZzZXQpOwogCi0JcHJpbnRrKCJjb21lZGk6IHBjaTgxNjQgJXMgd3JpdGUgLT4gJTA0WDolMDRYIG9uIGF4aXMgJXNcbiIsIGFjdGlvbiwKLQkgICAgICAgZGF0YVswXSwgZGF0YVsxXSwgYXhpc25hbWUpOworCXByaW50ayhLRVJOX0RFQlVHICJjb21lZGk6IHBjaTgxNjQgJXMgd3JpdGUgLT4gIgorCQkJCQkJIiUwNFg6JTA0WCBvbiBheGlzICVzXG4iLAorCQkJCWFjdGlvbiwgZGF0YVswXSwgZGF0YVsxXSwgYXhpc25hbWUpOwogCiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpOTExOC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k5MTE4LmMKaW5kZXggMWVlNGI2YS4uNzkxZWE4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k5MTE4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k5MTE4LmMKQEAgLTc4MCw3ICs3ODAsNyBAQAogCQkJICAgICAgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKIHsKIAlpbnQgZXJyID0gMDsKLQlpbnQgdG1wLCBkaXZpc29yMSwgZGl2aXNvcjI7CisJaW50IHRtcCwgZGl2aXNvcjEgPSAwLCBkaXZpc29yMiA9IDA7CiAKIAkvKiBzdGVwIDE6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MTAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpMTcxMC5jCmluZGV4IGYwYWU0YzAuLjk1MWU1NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpMTcxMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpMTcxMC5jCkBAIC04MzAsNyArODMwLDcgQEAKIHN0YXRpYyBpbnQgcGNpMTcxeF9haV9kb2NtZF9hbmRfbW9kZShpbnQgbW9kZSwgc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewotCXVuc2lnbmVkIGludCBkaXZpc29yMSwgZGl2aXNvcjI7CisJdW5zaWduZWQgaW50IGRpdmlzb3IxID0gMCwgZGl2aXNvcjIgPSAwOwogCXVuc2lnbmVkIGludCBzZWdsZW47CiAKIAlEUFJJTlRLKCJhZHZfcGNpMTcxMCBFREJHOiBCR046IHBjaTE3MXhfYWlfZG9jbWRfYW5kX21vZGUoJWQsLi4uKVxuIiwKQEAgLTkzNCw3ICs5MzQsNyBAQAogCQkJICAgICAgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKIHsKIAlpbnQgZXJyID0gMDsKLQlpbnQgdG1wLCBkaXZpc29yMSwgZGl2aXNvcjI7CisJaW50IHRtcCwgZGl2aXNvcjEgPSAwLCBkaXZpc29yMiA9IDA7CiAKIAlEUFJJTlRLKCJhZHZfcGNpMTcxMCBFREJHOiBCR046IHBjaTE3MXhfYWlfY21kdGVzdCguLi4pXG4iKTsKICNpZmRlZiBQQ0kxNzFYX0VYVERFQlVHCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGMyNjMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wYzI2My5jCmluZGV4IGM2MmE3ZTEuLjE1ODA4ZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wYzI2My5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wYzI2My5jCkBAIC0xMTcsNyArMTE3LDggQEAKIAogLyogdGhpcyBzdHJ1Y3R1cmUgaXMgZm9yIGRhdGEgdW5pcXVlIHRvIHRoaXMgaGFyZHdhcmUgZHJpdmVyLiAgSWYKICAgIHNldmVyYWwgaGFyZHdhcmUgZHJpdmVycyBrZWVwIHNpbWlsYXIgaW5mb3JtYXRpb24gaW4gdGhpcyBzdHJ1Y3R1cmUsCi0gICBmZWVsIGZyZWUgdG8gc3VnZ2VzdCBtb3ZpbmcgdGhlIHZhcmlhYmxlIHRvIHRoZSBzdHJ1Y3QgY29tZWRpX2RldmljZSBzdHJ1Y3QuICAqLworICAgZmVlbCBmcmVlIHRvIHN1Z2dlc3QgbW92aW5nIHRoZSB2YXJpYWJsZSB0byB0aGUgc3RydWN0IGNvbWVkaV9kZXZpY2Ugc3RydWN0LgorKi8KICNpZmRlZiBDT05GSUdfQ09NRURJX1BDSQogc3RydWN0IHBjMjYzX3ByaXZhdGUgewogCS8qIFBDSSBkZXZpY2UuICovCkBAIC0yODEsNyArMjgyLDggQEAKIAkJcmV0ID0gY29tZWRpX3BjaV9lbmFibGUocGNpX2RldiwgUEMyNjNfRFJJVkVSX05BTUUpOwogCQlpZiAocmV0IDwgMCkgewogCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgImNvbWVkaSVkOiBlcnJvciEgY2Fubm90IGVuYWJsZSBQQ0kgZGV2aWNlIGFuZCByZXF1ZXN0IHJlZ2lvbnMhXG4iLAorCQkJICAgICAgICJjb21lZGklZDogZXJyb3IhIGNhbm5vdCBlbmFibGUgUENJIGRldmljZSBhbmQgIgorCQkJCSJyZXF1ZXN0IHJlZ2lvbnMhXG4iLAogCQkJICAgICAgIGRldi0+bWlub3IpOwogCQkJcmV0dXJuIHJldDsKIAkJfQpAQCAtMjkwLDkgKzI5Miw4IEBACiAjZW5kaWYKIAl7CiAJCXJldCA9IHBjMjYzX3JlcXVlc3RfcmVnaW9uKGRldi0+bWlub3IsIGlvYmFzZSwgUEMyNjNfSU9fU0laRSk7Ci0JCWlmIChyZXQgPCAwKSB7CisJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKLQkJfQogCX0KIAlkZXYtPmlvYmFzZSA9IGlvYmFzZTsKIApAQCAtMzUwLDIxICszNTEsMTggQEAKIAkgICAgICAgUEMyNjNfRFJJVkVSX05BTUUpOwogCiAjaWZkZWYgQ09ORklHX0NPTUVESV9QQ0kKLQlpZiAoZGV2cHJpdikKKwlpZiAoZGV2cHJpdikgewogI2VuZGlmCi0JewogI2lmZGVmIENPTkZJR19DT01FRElfUENJCiAJCWlmIChkZXZwcml2LT5wY2lfZGV2KSB7Ci0JCQlpZiAoZGV2LT5pb2Jhc2UpIHsKKwkJCWlmIChkZXYtPmlvYmFzZSkKIAkJCQljb21lZGlfcGNpX2Rpc2FibGUoZGV2cHJpdi0+cGNpX2Rldik7Ci0JCQl9CiAJCQlwY2lfZGV2X3B1dChkZXZwcml2LT5wY2lfZGV2KTsKIAkJfSBlbHNlCiAjZW5kaWYKIAkJewotCQkJaWYgKGRldi0+aW9iYXNlKSB7CisJCQlpZiAoZGV2LT5pb2Jhc2UpCiAJCQkJcmVsZWFzZV9yZWdpb24oZGV2LT5pb2Jhc2UsIFBDMjYzX0lPX1NJWkUpOwotCQkJfQogCQl9CiAJfQogCWlmIChkZXYtPmJvYXJkX25hbWUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9kYXMxNl9jcy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX2RhczE2X2NzLmMKaW5kZXggMzk5MjNjYi4uYmMzNzVlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX2RhczE2X2NzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX2RhczE2X2NzLmMKQEAgLTM3Miw3ICszNzIsNyBAQAogCiAJLyogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIAotCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCisJLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmlsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19USU1FUiAmJgogCSAgICBjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRVhUKQogCQllcnIrKzsKQEAgLTQ1Miw3ICs0NTIsNyBAQAogCS8qIHN0ZXAgNDogZml4IHVwIGFueSBhcmd1bWVudHMgKi8KIAogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKLQkJdW5zaWduZWQgaW50IGRpdjEsIGRpdjI7CisJCXVuc2lnbmVkIGludCBkaXYxID0gMCwgZGl2MiA9IDA7CiAKIAkJdG1wID0gY21kLT5zY2FuX2JlZ2luX2FyZzsKIAkJaTgyNTNfY2FzY2FkZV9uc190b190aW1lcigxMDAsICZkaXYxLCAmZGl2MiwKQEAgLTQ2Miw3ICs0NjIsNyBAQAogCQkJZXJyKys7CiAJfQogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKLQkJdW5zaWduZWQgaW50IGRpdjEsIGRpdjI7CisJCXVuc2lnbmVkIGludCBkaXYxID0gMCwgZGl2MiA9IDA7CiAKIAkJdG1wID0gY21kLT5jb252ZXJ0X2FyZzsKIAkJaTgyNTNfY2FzY2FkZV9uc190b190aW1lcigxMDAsICZkaXYxLCAmZGl2MiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkZGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkZGEuYwppbmRleCA3YTVkNDZlLi43ODIzNTc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGRhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRkYS5jCkBAIC00OTcsNyArNDk3LDcgQEAKIAogCS8qIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKLQkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGlibGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLworCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJpbGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLwogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfVElNRVIKIAkgICAgJiYgY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0VYVCkKIAkJZXJyKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGlvLmMKaW5kZXggMDllNmUzYi4uN2RhYWQwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRpby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkaW8uYwpAQCAtMTA5LDEyICsxMDksMTIgQEAKICAgIHNldmVyYWwgaGFyZHdhcmUgZHJpdmVycyBrZWVwIHNpbWlsYXIgaW5mb3JtYXRpb24gaW4gdGhpcyBzdHJ1Y3R1cmUsCiAgICBmZWVsIGZyZWUgdG8gc3VnZ2VzdCBtb3ZpbmcgdGhlIHZhcmlhYmxlIHRvIHRoZSBzdHJ1Y3QgY29tZWRpX2RldmljZSBzdHJ1Y3QuICAqLwogc3RydWN0IHBjaWRpb19wcml2YXRlIHsKLQlpbnQgZGF0YTsJCS8qICBjdXJlbnRseSB1bnVzZWQgKi8KKwlpbnQgZGF0YTsJCS8qICBjdXJyZW50bHkgdW51c2VkICovCiAKIAkvKiB3b3VsZCBiZSB1c2VmdWwgZm9yIGEgUENJIGRldmljZSAqLwogCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OwogCi0JLyogdXNlZCBmb3IgRE8gcmVhZGJhY2ssIGN1cmVudGx5IHVudXNlZCAqLworCS8qIHVzZWQgZm9yIERPIHJlYWRiYWNrLCBjdXJyZW50bHkgdW51c2VkICovCiAJdW5zaWduZWQgaW50IGRvX3JlYWRiYWNrWzRdOwkvKiB1cCB0byA0IHVuc2lnbmVkIGludCBzdWZmaWNlIHRvIGhvbGQgOTYgYml0cyBmb3IgUENJLURJTzk2ICovCiAKIAl1bnNpZ25lZCBsb25nIGRpb19yZWdfYmFzZTsJLyogIGFkZHJlc3Mgb2YgcG9ydCBBIG9mIHRoZSBmaXJzdCA4MjU1IGNoaXAgb24gYm9hcmQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfZmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfZmMuYwppbmRleCBmNzgxMTU0Li42M2JlNjE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2ZjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9mYy5jCkBAIC01Myw3ICs1Myw3IEBACiAKIAlyZXR2YWwgPSBjb21lZGlfYnVmX3dyaXRlX2FsbG9jKGFzeW5jLCBudW1fYnl0ZXMpOwogCWlmIChyZXR2YWwgIT0gbnVtX2J5dGVzKSB7Ci0JCXByaW50aygiY29tZWRpOiBidWZmZXIgb3ZlcnJ1blxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNvbWVkaTogYnVmZmVyIG92ZXJydW5cbiIpOwogCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9PVkVSRkxPVzsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtNjUsNyArNjUsNiBAQAogCiAJcmV0dXJuIG51bV9ieXRlczsKIH0KLQogRVhQT1JUX1NZTUJPTChjZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKTsKIAogdW5zaWduZWQgaW50IGNmY19yZWFkX2FycmF5X2Zyb21fYnVmZmVyKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzdWJkLApAQCAtODQsNyArODMsNiBAQAogCiAJcmV0dXJuIG51bV9ieXRlczsKIH0KLQogRVhQT1JUX1NZTUJPTChjZmNfcmVhZF9hcnJheV9mcm9tX2J1ZmZlcik7CiAKIHVuc2lnbmVkIGludCBjZmNfaGFuZGxlX2V2ZW50cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtMTAyLDcgKzEwMCw2IEBACiAKIAlyZXR1cm4gZXZlbnRzOwogfQotCiBFWFBPUlRfU1lNQk9MKGNmY19oYW5kbGVfZXZlbnRzKTsKIAogTU9EVUxFX0FVVEhPUigiRnJhbmsgTW9yaSBIZXNzIDxmbWhlc3NAdXNlcnMuc291cmNlZm9yZ2UubmV0PiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RtbTMyYXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kbW0zMmF0LmMKaW5kZXggYWVlYzFlZS4uOWRiOWE0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RtbTMyYXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZG1tMzJhdC5jCkBAIC02MjksNyArNjI5LDcgQEAKIAogCS8qIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKLQkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGlibGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLworCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJpbGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLwogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfVElNRVIgJiYKIAkgICAgY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0VYVCkKIAkJZXJyKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODE0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODE0LmMKaW5kZXggMDM2NGJiZi4uZTFiNzM3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxNC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTQuYwpAQCAtMTc1LDcgKzE3NSw3IEBACiAKIAkvKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCi0JLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KKwkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGliaWxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KIAlpZiAoY21kLT5zdG9wX3NyYyAhPSBUUklHX1RJTUVSICYmIGNtZC0+c3RvcF9zcmMgIT0gVFJJR19FWFQpCiAJCWVycisrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODJ4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODJ4LmMKaW5kZXggYTRjOTZjMC4uOTljYTI5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgyeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MnguYwpAQCAtNzc3LDcgKzc3Nyw3IEBACiAKIAkvKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCi0JLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KKwkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGliaWxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0ZPTExPVyAmJgogCSAgICBjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRVhUKQogCQllcnIrKzsKQEAgLTEwNTAsNyArMTA1MCw3IEBACiAKIAkvKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCi0JLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KKwkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGliaWxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KIAlpZiAoY21kLT5zdG9wX3NyYyAhPSBUUklHX0NPVU5UICYmIGNtZC0+c3RvcF9zcmMgIT0gVFJJR19OT05FKQogCQllcnIrKzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2dzY19ocGRpLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZ3NjX2hwZGkuYwppbmRleCAwYmIzMDE2Li41MWYxMmJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZ3NjX2hwZGkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZ3NjX2hwZGkuYwpAQCAtNTUsNyArNTUsNyBAQAogCiBzdGF0aWMgaW50IGhwZGlfYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfZGV2Y29uZmlnICppdCk7CiBzdGF0aWMgaW50IGhwZGlfZGV0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpOwotdm9pZCBhYm9ydF9kbWEoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNoYW5uZWwpOworc3RhdGljIHZvaWQgYWJvcnRfZG1hKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBjaGFubmVsKTsKIHN0YXRpYyBpbnQgaHBkaV9jbWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpOwogc3RhdGljIGludCBocGRpX2NtZF90ZXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJIHN0cnVjdCBjb21lZGlfY21kICpjbWQpOwpAQCAtMTEwLDcgKzExMCw4IEBACiBpbnQgY29tbWFuZF9jaGFubmVsX3ZhbGlkKHVuc2lnbmVkIGludCBjaGFubmVsKQogewogCWlmIChjaGFubmVsID09IDAgfHwgY2hhbm5lbCA+IDYpIHsKLQkJcHJpbnRrKCJnc2NfaHBkaTogYnVnISBpbnZhbGlkIGNhYmxlIGNvbW1hbmQgY2hhbm5lbFxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJnc2NfaHBkaTogYnVnISBpbnZhbGlkIGNhYmxlIGNvbW1hbmQgY2hhbm5lbFxuIik7CiAJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gMTsKQEAgLTE0Miw3ICsxNDMsOCBAQAogCVJYX0ZJRk9fUkVTRVRfQklUID0gMHg0LAogCVRYX0VOQUJMRV9CSVQgPSAweDEwLAogCVJYX0VOQUJMRV9CSVQgPSAweDIwLAotCURFTUFORF9ETUFfRElSRUNUSU9OX1RYX0JJVCA9IDB4NDAsCS8qIGZvciBjaGFubmVsIDAsIGNoYW5uZWwgMSBjYW4gb25seSB0cmFuc21pdCAod2hlbiBwcmVzZW50KSAqLworCURFTUFORF9ETUFfRElSRUNUSU9OX1RYX0JJVCA9IDB4NDAsCisJCS8qIGZvciBjaCAwLCBjaCAxIGNhbiBvbmx5IHRyYW5zbWl0ICh3aGVuIHByZXNlbnQpICovCiAJTElORV9WQUxJRF9PTl9TVEFUVVNfVkFMSURfQklUID0gMHg4MCwKIAlTVEFSVF9UWF9CSVQgPSAweDEwLAogCUNBQkxFX1RIUk9UVExFX0VOQUJMRV9CSVQgPSAweDIwLApAQCAtNDIwLDkgKzQyMiwxMSBAQAogCWJpdHMgfD0gUExYX0RNQV9FTl9SRUFEWUlOX0JJVDsKIAkvKiAgZW5hYmxlIGRtYSBjaGFpbmluZyAqLwogCWJpdHMgfD0gUExYX0VOX0NIQUlOX0JJVDsKLQkvKiAgZW5hYmxlIGludGVycnVwdCBvbiBkbWEgZG9uZSAocHJvYmFibHkgZG9uJ3QgbmVlZCB0aGlzLCBzaW5jZSBjaGFpbiBuZXZlciBmaW5pc2hlcykgKi8KKwkvKiAgZW5hYmxlIGludGVycnVwdCBvbiBkbWEgZG9uZQorCSAqICAocHJvYmFibHkgZG9uJ3QgbmVlZCB0aGlzLCBzaW5jZSBjaGFpbiBuZXZlciBmaW5pc2hlcykgKi8KIAliaXRzIHw9IFBMWF9FTl9ETUFfRE9ORV9JTlRSX0JJVDsKLQkvKiAgZG9uJ3QgaW5jcmVtZW50IGxvY2FsIGFkZHJlc3MgZHVyaW5nIHRyYW5zZmVycyAod2UgYXJlIHRyYW5zZmVycmluZyBmcm9tIGEgZml4ZWQgZmlmbyByZWdpc3RlcikgKi8KKwkvKiAgZG9uJ3QgaW5jcmVtZW50IGxvY2FsIGFkZHJlc3MgZHVyaW5nIHRyYW5zZmVycworCSAqICAod2UgYXJlIHRyYW5zZmVycmluZyBmcm9tIGEgZml4ZWQgZmlmbyByZWdpc3RlcikgKi8KIAliaXRzIHw9IFBMWF9MT0NBTF9BRERSX0NPTlNUX0JJVDsKIAkvKiAgcm91dGUgZG1hIGludGVycnVwdCB0byBwY2kgYnVzICovCiAJYml0cyB8PSBQTFhfRE1BX0lOVFJfUENJX0JJVDsKQEAgLTU2MCw3ICs1NjQsNyBAQAogCWludCBpOwogCWludCByZXR2YWw7CiAKLQlwcmludGsoImNvbWVkaSVkOiBnc2NfaHBkaVxuIiwgZGV2LT5taW5vcik7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiY29tZWRpJWQ6IGdzY19ocGRpXG4iLCBkZXYtPm1pbm9yKTsKIAogCWlmIChhbGxvY19wcml2YXRlKGRldiwgc2l6ZW9mKHN0cnVjdCBocGRpX3ByaXZhdGUpKSA8IDApCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNTg4LDExICs1OTIsMTIgQEAKIAkJfSB3aGlsZSAocGNpZGV2ICE9IE5VTEwpOwogCX0KIAlpZiAoZGV2LT5ib2FyZF9wdHIgPT0gTlVMTCkgewotCQlwcmludGsoImdzY19ocGRpOiBubyBocGRpIGNhcmQgZm91bmRcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJnc2NfaHBkaTogbm8gaHBkaSBjYXJkIGZvdW5kXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JcHJpbnRrKCJnc2NfaHBkaTogZm91bmQgJXMgb24gYnVzICVpLCBzbG90ICVpXG4iLCBib2FyZChkZXYpLT5uYW1lLAorCXByaW50ayhLRVJOX1dBUk5JTkcKKwkgICAgICAgImdzY19ocGRpOiBmb3VuZCAlcyBvbiBidXMgJWksIHNsb3QgJWlcbiIsIGJvYXJkKGRldiktPm5hbWUsCiAJICAgICAgIHBjaWRldi0+YnVzLT5udW1iZXIsIFBDSV9TTE9UKHBjaWRldi0+ZGV2Zm4pKTsKIAogCWlmIChjb21lZGlfcGNpX2VuYWJsZShwY2lkZXYsIGRyaXZlcl9ocGRpLmRyaXZlcl9uYW1lKSkgewpAQCAtNjE4LDcgKzYyMyw3IEBACiAJICAgIGlvcmVtYXAocHJpdihkZXYpLT5ocGRpX3BoeXNfaW9iYXNlLAogCQkgICAgcGNpX3Jlc291cmNlX2xlbihwY2lkZXYsIEhQRElfQkFERFJJTkRFWCkpOwogCWlmICghcHJpdihkZXYpLT5wbHg5MDgwX2lvYmFzZSB8fCAhcHJpdihkZXYpLT5ocGRpX2lvYmFzZSkgewotCQlwcmludGsoIiBmYWlsZWQgdG8gcmVtYXAgaW8gbWVtb3J5XG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiIGZhaWxlZCB0byByZW1hcCBpbyBtZW1vcnlcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTYzMCwxMiArNjM1LDEzIEBACiAJLyogIGdldCBpcnEgKi8KIAlpZiAocmVxdWVzdF9pcnEocGNpZGV2LT5pcnEsIGhhbmRsZV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJZHJpdmVyX2hwZGkuZHJpdmVyX25hbWUsIGRldikpIHsKLQkJcHJpbnRrKCIgdW5hYmxlIHRvIGFsbG9jYXRlIGlycSAldVxuIiwgcGNpZGV2LT5pcnEpOworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiIHVuYWJsZSB0byBhbGxvY2F0ZSBpcnEgJXVcbiIsIHBjaWRldi0+aXJxKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWRldi0+aXJxID0gcGNpZGV2LT5pcnE7CiAKLQlwcmludGsoIiBpcnEgJXVcbiIsIGRldi0+aXJxKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICIgaXJxICV1XG4iLCBkZXYtPmlycSk7CiAKIAkvKiAgYWxvY2F0ZSBwY2kgZG1hIGJ1ZmZlcnMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTlVNX0RNQV9CVUZGRVJTOyBpKyspIHsKQEAgLTY1Myw3ICs2NTksOCBAQAogCQkJCQkJICAgJnByaXYoZGV2KS0+CiAJCQkJCQkgICBkbWFfZGVzY19waHlzX2FkZHIpOwogCWlmIChwcml2KGRldiktPmRtYV9kZXNjX3BoeXNfYWRkciAmIDB4ZikgewotCQlwcmludGsoIiBkbWEgZGVzY3JpcHRvcnMgbm90IHF1YWQtd29yZCBhbGlnbmVkIChidWcpXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIiBkbWEgZGVzY3JpcHRvcnMgbm90IHF1YWQtd29yZCBhbGlnbmVkIChidWcpXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC02NzIsNDIgKzY3OSwzOSBAQAogewogCXVuc2lnbmVkIGludCBpOwogCi0JcHJpbnRrKCJjb21lZGklZDogZ3NjX2hwZGk6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiY29tZWRpJWQ6IGdzY19ocGRpOiByZW1vdmVcbiIsIGRldi0+bWlub3IpOwogCiAJaWYgKGRldi0+aXJxKQogCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKLQlpZiAocHJpdihkZXYpKSB7Ci0JCWlmIChwcml2KGRldiktPmh3X2RldikgewotCQkJaWYgKHByaXYoZGV2KS0+cGx4OTA4MF9pb2Jhc2UpIHsKLQkJCQlkaXNhYmxlX3BseF9pbnRlcnJ1cHRzKGRldik7Ci0JCQkJaW91bm1hcCgodm9pZCAqKXByaXYoZGV2KS0+cGx4OTA4MF9pb2Jhc2UpOwotCQkJfQotCQkJaWYgKHByaXYoZGV2KS0+aHBkaV9pb2Jhc2UpCi0JCQkJaW91bm1hcCgodm9pZCAqKXByaXYoZGV2KS0+aHBkaV9pb2Jhc2UpOwotCQkJLyogIGZyZWUgcGNpIGRtYSBidWZmZXJzICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0RNQV9CVUZGRVJTOyBpKyspIHsKLQkJCQlpZiAocHJpdihkZXYpLT5kaW9fYnVmZmVyW2ldKQotCQkJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHByaXYoZGV2KS0+aHdfZGV2LAotCQkJCQkJCSAgICBETUFfQlVGRkVSX1NJWkUsCi0JCQkJCQkJICAgIHByaXYoZGV2KS0+Ci0JCQkJCQkJICAgIGRpb19idWZmZXJbaV0sCi0JCQkJCQkJICAgIHByaXYKLQkJCQkJCQkgICAgKGRldiktPmRpb19idWZmZXJfcGh5c19hZGRyCi0JCQkJCQkJICAgIFtpXSk7Ci0JCQl9Ci0JCQkvKiAgZnJlZSBkbWEgZGVzY3JpcHRvcnMgKi8KLQkJCWlmIChwcml2KGRldiktPmRtYV9kZXNjKQotCQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQocHJpdihkZXYpLT5od19kZXYsCi0JCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBwbHhfZG1hX2Rlc2MpCi0JCQkJCQkgICAgKiBOVU1fRE1BX0RFU0NSSVBUT1JTLAotCQkJCQkJICAgIHByaXYoZGV2KS0+ZG1hX2Rlc2MsCi0JCQkJCQkgICAgcHJpdihkZXYpLT4KLQkJCQkJCSAgICBkbWFfZGVzY19waHlzX2FkZHIpOwotCQkJaWYgKHByaXYoZGV2KS0+aHBkaV9waHlzX2lvYmFzZSkgewotCQkJCWNvbWVkaV9wY2lfZGlzYWJsZShwcml2KGRldiktPmh3X2Rldik7Ci0JCQl9Ci0JCQlwY2lfZGV2X3B1dChwcml2KGRldiktPmh3X2Rldik7CisJaWYgKChwcml2KGRldikpICYmIChwcml2KGRldiktPmh3X2RldikpIHsKKwkJaWYgKHByaXYoZGV2KS0+cGx4OTA4MF9pb2Jhc2UpIHsKKwkJCWRpc2FibGVfcGx4X2ludGVycnVwdHMoZGV2KTsKKwkJCWlvdW5tYXAoKHZvaWQgKilwcml2KGRldiktPnBseDkwODBfaW9iYXNlKTsKIAkJfQorCQlpZiAocHJpdihkZXYpLT5ocGRpX2lvYmFzZSkKKwkJCWlvdW5tYXAoKHZvaWQgKilwcml2KGRldiktPmhwZGlfaW9iYXNlKTsKKwkJLyogIGZyZWUgcGNpIGRtYSBidWZmZXJzICovCisJCWZvciAoaSA9IDA7IGkgPCBOVU1fRE1BX0JVRkZFUlM7IGkrKykgeworCQkJaWYgKHByaXYoZGV2KS0+ZGlvX2J1ZmZlcltpXSkKKwkJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHByaXYoZGV2KS0+aHdfZGV2LAorCQkJCQkJICAgIERNQV9CVUZGRVJfU0laRSwKKwkJCQkJCSAgICBwcml2KGRldiktPgorCQkJCQkJICAgIGRpb19idWZmZXJbaV0sCisJCQkJCQkgICAgcHJpdgorCQkJCQkJICAgIChkZXYpLT5kaW9fYnVmZmVyX3BoeXNfYWRkcgorCQkJCQkJICAgIFtpXSk7CisJCX0KKwkJLyogIGZyZWUgZG1hIGRlc2NyaXB0b3JzICovCisJCWlmIChwcml2KGRldiktPmRtYV9kZXNjKQorCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwcml2KGRldiktPmh3X2RldiwKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3QgcGx4X2RtYV9kZXNjKQorCQkJCQkgICAgKiBOVU1fRE1BX0RFU0NSSVBUT1JTLAorCQkJCQkgICAgcHJpdihkZXYpLT5kbWFfZGVzYywKKwkJCQkJICAgIHByaXYoZGV2KS0+CisJCQkJCSAgICBkbWFfZGVzY19waHlzX2FkZHIpOworCQlpZiAocHJpdihkZXYpLT5ocGRpX3BoeXNfaW9iYXNlKQorCQkJY29tZWRpX3BjaV9kaXNhYmxlKHByaXYoZGV2KS0+aHdfZGV2KTsKKwkJcGNpX2Rldl9wdXQocHJpdihkZXYpLT5od19kZXYpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTgxMCwxNSArODE0LDE2IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIDQ7CiAKLQlpZiAoY21kLT5jaGFubGlzdCkgewotCQlmb3IgKGkgPSAxOyBpIDwgY21kLT5jaGFubGlzdF9sZW47IGkrKykgewotCQkJaWYgKENSX0NIQU4oY21kLT5jaGFubGlzdFtpXSkgIT0gaSkgewotCQkJCS8qICBYWFggY291bGQgc3VwcG9ydCA4IGNoYW5uZWxzIG9yIDE2IGNoYW5uZWxzICovCi0JCQkJY29tZWRpX2Vycm9yKGRldiwKLQkJCQkJICAgICAiY2hhbmxpc3QgbXVzdCBiZSBjaGFubmVscyAwIHRvIDMxIGluIG9yZGVyIik7Ci0JCQkJZXJyKys7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJaWYgKCFjbWQtPmNoYW5saXN0KQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDE7IGkgPCBjbWQtPmNoYW5saXN0X2xlbjsgaSsrKSB7CisJCWlmIChDUl9DSEFOKGNtZC0+Y2hhbmxpc3RbaV0pICE9IGkpIHsKKwkJCS8qICBYWFggY291bGQgc3VwcG9ydCA4IG9yIDE2IGNoYW5uZWxzICovCisJCQljb21lZGlfZXJyb3IoZGV2LAorCQkJCSAgICAgImNoYW5saXN0IG11c3QgYmUgY2ggMCB0byAzMSBpbiBvcmRlciIpOworCQkJZXJyKys7CisJCQlicmVhazsKIAkJfQogCX0KIApAQCAtODMxLDkgKzgzNiw5IEBACiBzdGF0aWMgaW50IGhwZGlfY21kX3Rlc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKIHsKLQlpZiAocHJpdihkZXYpLT5kaW9fY29uZmlnX291dHB1dCkgeworCWlmIChwcml2KGRldiktPmRpb19jb25maWdfb3V0cHV0KQogCQlyZXR1cm4gLUVJTlZBTDsKLQl9IGVsc2UKKwllbHNlCiAJCXJldHVybiBkaV9jbWRfdGVzdChkZXYsIHMsIGNtZCk7CiB9CiAKQEAgLTg5OSw5ICs5MDQsOSBAQAogCiBzdGF0aWMgaW50IGhwZGlfY21kKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewotCWlmIChwcml2KGRldiktPmRpb19jb25maWdfb3V0cHV0KSB7CisJaWYgKHByaXYoZGV2KS0+ZGlvX2NvbmZpZ19vdXRwdXQpCiAJCXJldHVybiAtRUlOVkFMOwotCX0gZWxzZQorCWVsc2UKIAkJcmV0dXJuIGRpX2NtZChkZXYsIHMpOwogfQogCkBAIC05NjMsMTQgKzk2OCwxMiBAQAogCXVpbnQ4X3QgZG1hMF9zdGF0dXMsIGRtYTFfc3RhdHVzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoIWRldi0+YXR0YWNoZWQpIHsKKwlpZiAoIWRldi0+YXR0YWNoZWQpCiAJCXJldHVybiBJUlFfTk9ORTsKLQl9CiAKIAlwbHhfc3RhdHVzID0gcmVhZGwocHJpdihkZXYpLT5wbHg5MDgwX2lvYmFzZSArIFBMWF9JTlRSQ1NfUkVHKTsKLQlpZiAoKHBseF9zdGF0dXMgJiAoSUNTX0RNQTBfQSB8IElDU19ETUExX0EgfCBJQ1NfTElBKSkgPT0gMCkgeworCWlmICgocGx4X3N0YXR1cyAmIChJQ1NfRE1BMF9BIHwgSUNTX0RNQTFfQSB8IElDU19MSUEpKSA9PSAwKQogCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQogCiAJaHBkaV9pbnRyX3N0YXR1cyA9IHJlYWRsKHByaXYoZGV2KS0+aHBkaV9pb2Jhc2UgKyBJTlRFUlJVUFRfU1RBVFVTX1JFRyk7CiAJaHBkaV9ib2FyZF9zdGF0dXMgPSByZWFkbChwcml2KGRldiktPmhwZGlfaW9iYXNlICsgQk9BUkRfU1RBVFVTX1JFRyk7CkBAIC05OTAsOSArOTkzLDggQEAKIAkJICAgICAgIHByaXYoZGV2KS0+cGx4OTA4MF9pb2Jhc2UgKyBQTFhfRE1BMF9DU19SRUcpOwogCiAJCURFQlVHX1BSSU5UKCJkbWEwIHN0YXR1cyAweCV4XG4iLCBkbWEwX3N0YXR1cyk7Ci0JCWlmIChkbWEwX3N0YXR1cyAmIFBMWF9ETUFfRU5fQklUKSB7CisJCWlmIChkbWEwX3N0YXR1cyAmIFBMWF9ETUFfRU5fQklUKQogCQkJZHJhaW5fZG1hX2J1ZmZlcnMoZGV2LCAwKTsKLQkJfQogCQlERUJVR19QUklOVCgiIGNsZWFyZWQgZG1hIGNoMCBpbnRlcnJ1cHRcbiIpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CkBAIC0xMDQyLDcgKzEwNDQsNyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotdm9pZCBhYm9ydF9kbWEoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNoYW5uZWwpCitzdGF0aWMgdm9pZCBhYm9ydF9kbWEoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNoYW5uZWwpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ljcF9tdWx0aS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ljcF9tdWx0aS5jCmluZGV4IDdhNjdmZmYuLmZhMGU0ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9pY3BfbXVsdGkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWNwX211bHRpLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAogT3B0aW9uczoKICBbMF0gLSBQQ0kgYnVzIG51bWJlciAtIGlmIGJ1cyBudW1iZXIgYW5kIHNsb3QgbnVtYmVyIGFyZSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBkcml2ZXIgc2VhcmNoIGZvciBmaXJzdCB1bnVzZWQgY2FyZAorCQkJdGhlbiBkcml2ZXIgc2VhcmNoIGZvciBmaXJzdCB1bnVzZWQgY2FyZAogIFsxXSAtIFBDSSBzbG90IG51bWJlcgogKi8KIApAQCAtMTMzLDcgKzEzMyw3IEBACiAJRGF0YSAmIFN0cnVjdHVyZSBkZWNsYXJhdGlvbnMKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBwY2lfbGlzdF9idWlsZGVkID0gMDsJLyo+MCBsaXN0IG9mIGNhcmQgaXMga25vd24gKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwY2lfbGlzdF9idWlsZGVkOwkvKj4wIGxpc3Qgb2YgY2FyZCBpcyBrbm93biAqLwogCiBzdHJ1Y3QgYm9hcmR0eXBlIHsKIAljb25zdCBjaGFyICpuYW1lOwkvKiAgZHJpdmVyIG5hbWUgKi8KQEAgLTE3NiwxMyArMTc2LDEzIEBACiAjZGVmaW5lIG5fYm9hcmR0eXBlcyAoc2l6ZW9mKGJvYXJkdHlwZXMpL3NpemVvZihzdHJ1Y3QgYm9hcmR0eXBlKSkKIAogc3RhdGljIHN0cnVjdCBjb21lZGlfZHJpdmVyIGRyaXZlcl9pY3BfbXVsdGkgPSB7Ci1kcml2ZXJfbmFtZToiaWNwX211bHRpIiwKLW1vZHVsZTpUSElTX01PRFVMRSwKLWF0dGFjaDppY3BfbXVsdGlfYXR0YWNoLAotZGV0YWNoOmljcF9tdWx0aV9kZXRhY2gsCi1udW1fbmFtZXM6bl9ib2FyZHR5cGVzLAotYm9hcmRfbmFtZTomYm9hcmR0eXBlc1swXS5uYW1lLAotb2Zmc2V0OnNpemVvZihzdHJ1Y3QgYm9hcmR0eXBlKSwKK2RyaXZlcl9uYW1lOiAiaWNwX211bHRpIiwKK21vZHVsZSA6IFRISVNfTU9EVUxFLAorYXR0YWNoIDogaWNwX211bHRpX2F0dGFjaCwKK2RldGFjaCA6IGljcF9tdWx0aV9kZXRhY2gsCitudW1fbmFtZXMgOiBuX2JvYXJkdHlwZXMsCitib2FyZF9uYW1lIDogJmJvYXJkdHlwZXNbMF0ubmFtZSwKK29mZnNldCA6IHNpemVvZihzdHJ1Y3QgYm9hcmR0eXBlKSwKIH07CiAKIENPTUVESV9JTklUQ0xFQU5VUChkcml2ZXJfaWNwX211bHRpKTsKQEAgLTIzNCwxOCArMjM0LDE4IEBACiAvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLQlOYW1lOglpY3BfbXVsdGlfaW5zbl9yZWFkX2FpCitOYW1lOglpY3BfbXVsdGlfaW5zbl9yZWFkX2FpCiAKLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyBmdW5jdGlvbiByZWFkcyBhIHNpbmdsZSBhbmFsb2d1ZSBpbnB1dC4KK0Rlc2NyaXB0aW9uOgorCVRoaXMgZnVuY3Rpb24gcmVhZHMgYSBzaW5nbGUgYW5hbG9ndWUgaW5wdXQuCiAKLQlQYXJhbWV0ZXJzOgotCQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCi0JCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCi0JCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbglQb2ludGVyIHRvIGN1cnJlbnQgY29tZWRpIGluc3RydWN0aW9uCi0JCXVuc2lnbmVkIGludCAqZGF0YQkJUG9pbnRlciB0byBhbmFsb2d1ZSBpbnB1dCBkYXRhCitQYXJhbWV0ZXJzOgorCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKKwlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQorCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbglQb2ludGVyIHRvIGN1cnJlbnQgY29tZWRpIGluc3RydWN0aW9uCisJdW5zaWduZWQgaW50ICpkYXRhCQlQb2ludGVyIHRvIGFuYWxvZ3VlIGlucHV0IGRhdGEKIAotCVJldHVybnM6aW50CQkJTm11YmVyIG9mIGluc3RydWN0aW9ucyBleGVjdXRlZAorUmV0dXJuczppbnQJCQlObXViZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KQEAgLTI1Niw3ICsyNTYsNyBAQAogCWludCBuLCB0aW1lb3V0OwogCiAjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCi0JcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogQkdOOiBpY3BfbXVsdGlfaW5zbl9yZWFkX2FpKC4uLilcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJpY3AgbXVsdGkgRURCRzogQkdOOiBpY3BfbXVsdGlfaW5zbl9yZWFkX2FpKC4uLilcbiIpOwogI2VuZGlmCiAJLyogIERpc2FibGUgQS9EIGNvbnZlcnNpb24gcmVhZHkgaW50ZXJydXB0ICovCiAJZGV2cHJpdi0+SW50RW5hYmxlICY9IH5BRENfUkVBRFk7CkBAIC0yNjYsMTEgKzI2NiwxMSBAQAogCWRldnByaXYtPkludFN0YXR1cyB8PSBBRENfUkVBRFk7CiAJd3JpdGV3KGRldnByaXYtPkludFN0YXR1cywgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfU1RBVCk7CiAKLQkvKiAgU2V0IHVwIGFwcHJvcHJpYXRlIGNoYW5uZWwsIG1vZGUgYW5kIHJhbmdlIGRhdGEsIGZvciBzcGVjaWZpZWQgY2hhbm5lbCAqLworCS8qICBTZXQgdXAgYXBwcm9wcmlhdGUgY2hhbm5lbCwgbW9kZSBhbmQgcmFuZ2UgZGF0YSwgZm9yIHNwZWNpZmllZCBjaCAqLwogCXNldHVwX2NoYW5uZWxfbGlzdChkZXYsIHMsICZpbnNuLT5jaGFuc3BlYywgMSk7CiAKICNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKLQlwcmludGsoImljcF9tdWx0aSBBIFNUPSU0eCBJTz0lcFxuIiwKKwlwcmludGsoS0VSTl9ERUJVRyAiaWNwX211bHRpIEEgU1Q9JTR4IElPPSVwXG4iLAogCSAgICAgICByZWFkdyhkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0FEQ19DU1IpLAogCSAgICAgICBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0FEQ19DU1IpOwogI2VuZGlmCkBAIC0yODMsMTQgKzI4MywxNCBAQAogCQlkZXZwcml2LT5BZGNDbWRTdGF0dXMgJj0gfkFEQ19TVDsKIAogI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRwotCQlwcmludGsoImljcCBtdWx0aSBCIG49JWQgU1Q9JTR4XG4iLCBuLAorCQlwcmludGsoS0VSTl9ERUJVRyAiaWNwIG11bHRpIEIgbj0lZCBTVD0lNHhcbiIsIG4sCiAJCSAgICAgICByZWFkdyhkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0FEQ19DU1IpKTsKICNlbmRpZgogCiAJCXVkZWxheSgxKTsKIAogI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRwotCQlwcmludGsoImljcCBtdWx0aSBDIG49JWQgU1Q9JTR4XG4iLCBuLAorCQlwcmludGsoS0VSTl9ERUJVRyAiaWNwIG11bHRpIEMgbj0lZCBTVD0lNHhcbiIsIG4sCiAJCSAgICAgICByZWFkdyhkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0FEQ19DU1IpKTsKICNlbmRpZgogCkBAIC0zMDMsNyArMzAzLDggQEAKIAogI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRwogCQkJaWYgKCEodGltZW91dCAlIDEwKSkKLQkJCQlwcmludGsoImljcCBtdWx0aSBEIG49JWQgdG09JWQgU1Q9JTR4XG4iLCBuLAorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICJpY3AgbXVsdGkgRCBuPSVkIHRtPSVkIFNUPSU0eFxuIiwgbiwKIAkJCQkgICAgICAgdGltZW91dCwKIAkJCQkgICAgICAgcmVhZHcoZGV2cHJpdi0+aW9fYWRkciArCiAJCQkJCSAgICAgSUNQX01VTFRJX0FEQ19DU1IpKTsKQEAgLTMyOCw5ICszMjksOSBAQAogCQlkYXRhW25dID0gMDsKIAogI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRwotCQlwcmludGsKLQkJICAgICgiaWNwIG11bHRpIEVEQkc6IEVORDogaWNwX211bHRpX2luc25fcmVhZF9haSguLi4pIG49JWRcbiIsCi0JCSAgICAgbik7CisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICJpY3AgbXVsdGkgRURCRzogRU5EOiBpY3BfbXVsdGlfaW5zbl9yZWFkX2FpKC4uLikgbj0lZFxuIiwKKwkJICAgICAgbik7CiAjZW5kaWYKIAkJcmV0dXJuIC1FVElNRTsKIApAQCAtMzQ4LDcgKzM0OSw4IEBACiAJd3JpdGV3KGRldnByaXYtPkludFN0YXR1cywgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfU1RBVCk7CiAKICNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKLQlwcmludGsoImljcCBtdWx0aSBFREJHOiBFTkQ6IGljcF9tdWx0aV9pbnNuX3JlYWRfYWkoLi4uKSBuPSVkXG4iLCBuKTsKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiaWNwIG11bHRpIEVEQkc6IEVORDogaWNwX211bHRpX2luc25fcmVhZF9haSguLi4pIG49JWRcbiIsIG4pOwogI2VuZGlmCiAJcmV0dXJuIG47CiB9CkBAIC0zNTYsMTggKzM1OCwxOCBAQAogLyoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0JTmFtZToJaWNwX211bHRpX2luc25fd3JpdGVfYW8KK05hbWU6CWljcF9tdWx0aV9pbnNuX3dyaXRlX2FvCiAKLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyBmdW5jdGlvbiB3cml0ZXMgYSBzaW5nbGUgYW5hbG9ndWUgb3V0cHV0LgorRGVzY3JpcHRpb246CisJVGhpcyBmdW5jdGlvbiB3cml0ZXMgYSBzaW5nbGUgYW5hbG9ndWUgb3V0cHV0LgogCi0JUGFyYW1ldGVyczoKLQkJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQotCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQotCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24JUG9pbnRlciB0byBjdXJyZW50IGNvbWVkaSBpbnN0cnVjdGlvbgotCQl1bnNpZ25lZCBpbnQgKmRhdGEJCVBvaW50ZXIgdG8gYW5hbG9ndWUgb3V0cHV0IGRhdGEKK1BhcmFtZXRlcnM6CisJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQorCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCisJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuCVBvaW50ZXIgdG8gY3VycmVudCBjb21lZGkgaW5zdHJ1Y3Rpb24KKwl1bnNpZ25lZCBpbnQgKmRhdGEJCVBvaW50ZXIgdG8gYW5hbG9ndWUgb3V0cHV0IGRhdGEKIAotCVJldHVybnM6aW50CQkJTm11YmVyIG9mIGluc3RydWN0aW9ucyBleGVjdXRlZAorUmV0dXJuczppbnQJCQlObXViZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KQEAgLTM3OCw3ICszODAsOCBAQAogCWludCBuLCBjaGFuLCByYW5nZSwgdGltZW91dDsKIAogI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRwotCXByaW50aygiaWNwIG11bHRpIEVEQkc6IEJHTjogaWNwX211bHRpX2luc25fd3JpdGVfYW8oLi4uKVxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgImljcCBtdWx0aSBFREJHOiBCR046IGljcF9tdWx0aV9pbnNuX3dyaXRlX2FvKC4uLilcbiIpOwogI2VuZGlmCiAJLyogIERpc2FibGUgRC9BIGNvbnZlcnNpb24gcmVhZHkgaW50ZXJydXB0ICovCiAJZGV2cHJpdi0+SW50RW5hYmxlICY9IH5EQUNfUkVBRFk7CkBAIC00MDQsNyArNDA3LDggQEAKIAl3cml0ZXcoZGV2cHJpdi0+RGFjQ21kU3RhdHVzLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0RBQ19DU1IpOwogCiAJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgewotCQkvKiAgV2FpdCBmb3IgYW5hbG9ndWUgb3V0cHV0IGRhdGEgcmVnaXN0ZXIgdG8gYmUgcmVhZHkgZm9yIG5ldyBkYXRhLCBvciBnZXQgZmVkIHVwIHdhaXRpbmcgKi8KKwkJLyogIFdhaXQgZm9yIGFuYWxvZ3VlIG91dHB1dCBkYXRhIHJlZ2lzdGVyIHRvIGJlCisJCSAqICByZWFkeSBmb3IgbmV3IGRhdGEsIG9yIGdldCBmZWQgdXAgd2FpdGluZyAqLwogCQl0aW1lb3V0ID0gMTAwOwogCQl3aGlsZSAodGltZW91dC0tKSB7CiAJCQlpZiAoIShyZWFkdyhkZXZwcml2LT5pb19hZGRyICsKQEAgLTQxMyw3ICs0MTcsOCBAQAogCiAjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCiAJCQlpZiAoISh0aW1lb3V0ICUgMTApKQotCQkJCXByaW50aygiaWNwIG11bHRpIEEgbj0lZCB0bT0lZCBTVD0lNHhcbiIsIG4sCisJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkgICAgICAgImljcCBtdWx0aSBBIG49JWQgdG09JWQgU1Q9JTR4XG4iLCBuLAogCQkJCSAgICAgICB0aW1lb3V0LAogCQkJCSAgICAgICByZWFkdyhkZXZwcml2LT5pb19hZGRyICsKIAkJCQkJICAgICBJQ1BfTVVMVElfREFDX0NTUikpOwpAQCAtNDM4LDggKzQ0Myw4IEBACiAJCWRldnByaXYtPmFvX2RhdGFbY2hhbl0gPSAwOwogCiAjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCi0JCXByaW50awotCQkgICAgKCJpY3AgbXVsdGkgRURCRzogRU5EOiBpY3BfbXVsdGlfaW5zbl93cml0ZV9hbyguLi4pIG49JWRcbiIsCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgImljcCBtdWx0aSBFREJHOiBFTkQ6IGljcF9tdWx0aV9pbnNuX3dyaXRlX2FvKC4uLikgbj0lZFxuIiwKIAkJICAgICBuKTsKICNlbmRpZgogCQlyZXR1cm4gLUVUSU1FOwpAQCAtNDU5LDcgKzQ2NCw4IEBACiAJfQogCiAjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCi0JcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogRU5EOiBpY3BfbXVsdGlfaW5zbl93cml0ZV9hbyguLi4pIG49JWRcbiIsIG4pOworCXByaW50ayhLRVJOX0RFQlVHCisJICAgICAgICJpY3AgbXVsdGkgRURCRzogRU5EOiBpY3BfbXVsdGlfaW5zbl93cml0ZV9hbyguLi4pIG49JWRcbiIsIG4pOwogI2VuZGlmCiAJcmV0dXJuIG47CiB9CkBAIC00NjcsMTggKzQ3MywxOCBAQAogLyoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0JTmFtZToJaWNwX211bHRpX2luc25fcmVhZF9hbworTmFtZToJaWNwX211bHRpX2luc25fcmVhZF9hbwogCi0JRGVzY3JpcHRpb246Ci0JCVRoaXMgZnVuY3Rpb24gcmVhZHMgYSBzaW5nbGUgYW5hbG9ndWUgb3V0cHV0LgorRGVzY3JpcHRpb246CisJVGhpcyBmdW5jdGlvbiByZWFkcyBhIHNpbmdsZSBhbmFsb2d1ZSBvdXRwdXQuCiAKLQlQYXJhbWV0ZXJzOgotCQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCi0JCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCi0JCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbglQb2ludGVyIHRvIGN1cnJlbnQgY29tZWRpIGluc3RydWN0aW9uCi0JCXVuc2lnbmVkIGludCAqZGF0YQkJUG9pbnRlciB0byBhbmFsb2d1ZSBvdXRwdXQgZGF0YQorUGFyYW1ldGVyczoKKwlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCisJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKKwlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24JUG9pbnRlciB0byBjdXJyZW50IGNvbWVkaSBpbnN0cnVjdGlvbgorCXVuc2lnbmVkIGludCAqZGF0YQkJUG9pbnRlciB0byBhbmFsb2d1ZSBvdXRwdXQgZGF0YQogCi0JUmV0dXJuczppbnQJCQlObXViZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkCitSZXR1cm5zOmludAkJCU5tdWJlciBvZiBpbnN0cnVjdGlvbnMgZXhlY3V0ZWQKIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwpAQCAtNTAxLDE4ICs1MDcsMTggQEAKIC8qCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotCU5hbWU6CWljcF9tdWx0aV9pbnNuX2JpdHNfZGkKK05hbWU6CWljcF9tdWx0aV9pbnNuX2JpdHNfZGkKIAotCURlc2NyaXB0aW9uOgotCQlUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBkaWdpdGFsIGlucHV0cy4KK0Rlc2NyaXB0aW9uOgorCVRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGRpZ2l0YWwgaW5wdXRzLgogCi0JUGFyYW1ldGVyczoKLQkJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQotCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQotCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24JUG9pbnRlciB0byBjdXJyZW50IGNvbWVkaSBpbnN0cnVjdGlvbgotCQl1bnNpZ25lZCBpbnQgKmRhdGEJCVBvaW50ZXIgdG8gYW5hbG9ndWUgb3V0cHV0IGRhdGEKK1BhcmFtZXRlcnM6CisJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQorCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCisJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuCVBvaW50ZXIgdG8gY3VycmVudCBjb21lZGkgaW5zdHJ1Y3Rpb24KKwl1bnNpZ25lZCBpbnQgKmRhdGEJCVBvaW50ZXIgdG8gYW5hbG9ndWUgb3V0cHV0IGRhdGEKIAotCVJldHVybnM6aW50CQkJTm11YmVyIG9mIGluc3RydWN0aW9ucyBleGVjdXRlZAorUmV0dXJuczppbnQJCQlObXViZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KQEAgLTUyOCwxOCArNTM0LDE4IEBACiAvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLQlOYW1lOglpY3BfbXVsdGlfaW5zbl9iaXRzX2RvCitOYW1lOglpY3BfbXVsdGlfaW5zbl9iaXRzX2RvCiAKLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyBmdW5jdGlvbiB3cml0ZXMgdGhlIGFwcHJvcHJpYXRlIGRpZ2l0YWwgb3V0cHV0cy4KK0Rlc2NyaXB0aW9uOgorCVRoaXMgZnVuY3Rpb24gd3JpdGVzIHRoZSBhcHByb3ByaWF0ZSBkaWdpdGFsIG91dHB1dHMuCiAKLQlQYXJhbWV0ZXJzOgotCQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCi0JCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCi0JCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbglQb2ludGVyIHRvIGN1cnJlbnQgY29tZWRpIGluc3RydWN0aW9uCi0JCXVuc2lnbmVkIGludCAqZGF0YQkJUG9pbnRlciB0byBhbmFsb2d1ZSBvdXRwdXQgZGF0YQorUGFyYW1ldGVyczoKKwlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCisJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKKwlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24JUG9pbnRlciB0byBjdXJyZW50IGNvbWVkaSBpbnN0cnVjdGlvbgorCXVuc2lnbmVkIGludCAqZGF0YQkJUG9pbnRlciB0byBhbmFsb2d1ZSBvdXRwdXQgZGF0YQogCi0JUmV0dXJuczppbnQJCQlObXViZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkCitSZXR1cm5zOmludAkJCU5tdWJlciBvZiBpbnN0cnVjdGlvbnMgZXhlY3V0ZWQKIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwpAQCAtNTQ4LDE0ICs1NTQsMTQgQEAKIAkJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewogI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRwotCXByaW50aygiaWNwIG11bHRpIEVEQkc6IEJHTjogaWNwX211bHRpX2luc25fYml0c19kbyguLi4pXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiaWNwIG11bHRpIEVEQkc6IEJHTjogaWNwX211bHRpX2luc25fYml0c19kbyguLi4pXG4iKTsKICNlbmRpZgogCiAJaWYgKGRhdGFbMF0pIHsKIAkJcy0+c3RhdGUgJj0gfmRhdGFbMF07CiAJCXMtPnN0YXRlIHw9IChkYXRhWzBdICYgZGF0YVsxXSk7CiAKLQkJcHJpbnRrKCJEaWdpdGFsIG91dHB1dHMgPSAlNHggXG4iLCBzLT5zdGF0ZSk7CisJCXByaW50ayhLRVJOX0RFQlVHICJEaWdpdGFsIG91dHB1dHMgPSAlNHggXG4iLCBzLT5zdGF0ZSk7CiAKIAkJd3JpdGV3KHMtPnN0YXRlLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0RPKTsKIAl9CkBAIC01NjMsNyArNTY5LDcgQEAKIAlkYXRhWzFdID0gcmVhZHcoZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9ESSk7CiAKICNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKLQlwcmludGsoImljcCBtdWx0aSBFREJHOiBFTkQ6IGljcF9tdWx0aV9pbnNuX2JpdHNfZG8oLi4uKVxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgImljcCBtdWx0aSBFREJHOiBFTkQ6IGljcF9tdWx0aV9pbnNuX2JpdHNfZG8oLi4uKVxuIik7CiAjZW5kaWYKIAlyZXR1cm4gMjsKIH0KQEAgLTU3MSwxOCArNTc3LDE4IEBACiAvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLQlOYW1lOglpY3BfbXVsdGlfaW5zbl9yZWFkX2N0cgorTmFtZToJaWNwX211bHRpX2luc25fcmVhZF9jdHIKIAotCURlc2NyaXB0aW9uOgotCQlUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBzcGVjaWZpZWQgY291bnRlci4KK0Rlc2NyaXB0aW9uOgorCVRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIHNwZWNpZmllZCBjb3VudGVyLgogCi0JUGFyYW1ldGVyczoKLQkJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQotCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQotCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24JUG9pbnRlciB0byBjdXJyZW50IGNvbWVkaSBpbnN0cnVjdGlvbgotCQl1bnNpZ25lZCBpbnQgKmRhdGEJCVBvaW50ZXIgdG8gY291bnRlciBkYXRhCitQYXJhbWV0ZXJzOgorCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKKwlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQorCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbglQb2ludGVyIHRvIGN1cnJlbnQgY29tZWRpIGluc3RydWN0aW9uCisJdW5zaWduZWQgaW50ICpkYXRhCQlQb2ludGVyIHRvIGNvdW50ZXIgZGF0YQogCi0JUmV0dXJuczppbnQJCQlObXViZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkCitSZXR1cm5zOmludAkJCU5tdWJlciBvZiBpbnN0cnVjdGlvbnMgZXhlY3V0ZWQKIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwpAQCAtNTk2LDE4ICs2MDIsMTggQEAKIC8qCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotCU5hbWU6CWljcF9tdWx0aV9pbnNuX3dyaXRlX2N0cgorTmFtZToJaWNwX211bHRpX2luc25fd3JpdGVfY3RyCiAKLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyBmdW5jdGlvbiB3cml0ZSB0byB0aGUgc3BlY2lmaWVkIGNvdW50ZXIuCitEZXNjcmlwdGlvbjoKKwlUaGlzIGZ1bmN0aW9uIHdyaXRlIHRvIHRoZSBzcGVjaWZpZWQgY291bnRlci4KIAotCVBhcmFtZXRlcnM6Ci0JCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKLQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKLQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuCVBvaW50ZXIgdG8gY3VycmVudCBjb21lZGkgaW5zdHJ1Y3Rpb24KLQkJdW5zaWduZWQgaW50ICpkYXRhCQlQb2ludGVyIHRvIGNvdW50ZXIgZGF0YQorUGFyYW1ldGVyczoKKwlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCisJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKKwlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24JUG9pbnRlciB0byBjdXJyZW50IGNvbWVkaSBpbnN0cnVjdGlvbgorCXVuc2lnbmVkIGludCAqZGF0YQkJUG9pbnRlciB0byBjb3VudGVyIGRhdGEKIAotCVJldHVybnM6aW50CQkJTm11YmVyIG9mIGluc3RydWN0aW9ucyBleGVjdXRlZAorUmV0dXJuczppbnQJCQlObXViZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KQEAgLTYyMiwxNSArNjI4LDE1IEBACiAvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLQlOYW1lOglpbnRlcnJ1cHRfc2VydmljZV9pY3BfbXVsdGkKK05hbWU6CWludGVycnVwdF9zZXJ2aWNlX2ljcF9tdWx0aQogCi0JRGVzY3JpcHRpb246Ci0JCVRoaXMgZnVuY3Rpb24gaXMgdGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIGFsbAotCQlpbnRlcnJ1cHRzIGdlbmVyYXRlZCBieSB0aGUgaWNwIG11bHRpIGJvYXJkLgorRGVzY3JpcHRpb246CisJVGhpcyBmdW5jdGlvbiBpcyB0aGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3IgYWxsCisJaW50ZXJydXB0cyBnZW5lcmF0ZWQgYnkgdGhlIGljcCBtdWx0aSBib2FyZC4KIAotCVBhcmFtZXRlcnM6Ci0JCWludCBpcnEKLQkJdm9pZCAqZAkJCVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2UKK1BhcmFtZXRlcnM6CisJaW50IGlycQorCXZvaWQgKmQJCQlQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KQEAgLTY0MCw3ICs2NDYsOCBAQAogCWludCBpbnRfbm87CiAKICNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKLQlwcmludGsoImljcCBtdWx0aSBFREJHOiBCR046IGludGVycnVwdF9zZXJ2aWNlX2ljcF9tdWx0aSglZCwuLi4pXG4iLAorCXByaW50ayhLRVJOX0RFQlVHCisJICAgICAgICJpY3AgbXVsdGkgRURCRzogQkdOOiBpbnRlcnJ1cHRfc2VydmljZV9pY3BfbXVsdGkoJWQsLi4uKVxuIiwKIAkgICAgICAgaXJxKTsKICNlbmRpZgogCkBAIC02NTEsNyArNjU4LDggQEAKIAkJcmV0dXJuIElSUV9OT05FOwogCiAjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCi0JcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogaW50ZXJydXB0X3NlcnZpY2VfaWNwX211bHRpKCkgU1Q6ICU0eFxuIiwKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiaWNwIG11bHRpIEVEQkc6IGludGVycnVwdF9zZXJ2aWNlX2ljcF9tdWx0aSgpIFNUOiAlNHhcbiIsCiAJICAgICAgIHJlYWR3KGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfSU5UX1NUQVQpKTsKICNlbmRpZgogCkBAIC02NzksNyArNjg3LDggQEAKIAl9CiAKICNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKLQlwcmludGsoImljcCBtdWx0aSBFREJHOiBFTkQ6IGludGVycnVwdF9zZXJ2aWNlX2ljcF9tdWx0aSguLi4pXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiaWNwIG11bHRpIEVEQkc6IEVORDogaW50ZXJydXB0X3NlcnZpY2VfaWNwX211bHRpKC4uLilcbiIpOwogI2VuZGlmCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtNjg4LDIwICs2OTcsMjAgQEAKIC8qCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotCU5hbWU6CWNoZWNrX2NoYW5uZWxfbGlzdAorTmFtZToJY2hlY2tfY2hhbm5lbF9saXN0CiAKLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGNoYW5uZWwgbGlzdCwgcHJvdmlkZWQgYnkgdXNlcgotCQlpcyBidWlsdCBjb3JyZWN0bHkKK0Rlc2NyaXB0aW9uOgorCVRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBjaGFubmVsIGxpc3QsIHByb3ZpZGVkIGJ5IHVzZXIKKwlpcyBidWlsdCBjb3JyZWN0bHkKIAotCVBhcmFtZXRlcnM6Ci0JCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IHNldmljZSBzdHJ1Y3R1cmUKLQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKLQkJdW5zaWduZWQgaW50ICpjaGFubGlzdAlQb2ludGVyIHRvIHBhY2tlZCBjaGFubmVsIGxpc3QKLQkJdW5zaWduZWQgaW50IG5fY2hhbglOdW1iZXIgb2YgY2hhbm5lbHMgdG8gc2NhbgorUGFyYW1ldGVyczoKKwlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBzZXZpY2Ugc3RydWN0dXJlCisJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKKwl1bnNpZ25lZCBpbnQgKmNoYW5saXN0CVBvaW50ZXIgdG8gcGFja2VkIGNoYW5uZWwgbGlzdAorCXVuc2lnbmVkIGludCBuX2NoYW4JTnVtYmVyIG9mIGNoYW5uZWxzIHRvIHNjYW4KIAotCVJldHVybnM6aW50IDAgPSBmYWlsdXJlCi0JCSAgICAxID0gc3VjY2VzcworUmV0dXJuczppbnQgMCA9IGZhaWx1cmUKKwkgICAgMSA9IHN1Y2Nlc3MKIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwpAQCAtNzEyLDcgKzcyMSw4IEBACiAJdW5zaWduZWQgaW50IGk7CiAKICNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKLQlwcmludGsoImljcCBtdWx0aSBFREJHOiAgY2hlY2tfY2hhbm5lbF9saXN0KC4uLiwlZClcbiIsIG5fY2hhbik7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgImljcCBtdWx0aSBFREJHOiAgY2hlY2tfY2hhbm5lbF9saXN0KC4uLiwlZClcbiIsIG5fY2hhbik7CiAjZW5kaWYKIAkvKiAgQ2hlY2sgdGhhdCB3ZSBhdCBsZWFzdCBoYXZlIG9uZSBjaGFubmVsIHRvIGNoZWNrICovCiAJaWYgKG5fY2hhbiA8IDEpIHsKQEAgLTcyNSw3ICs3MzUsNyBAQAogCQlpZiAoQ1JfQVJFRihjaGFubGlzdFtpXSkgPT0gQVJFRl9ESUZGKSB7CiAJCQlpZiAoQ1JfQ0hBTihjaGFubGlzdFtpXSkgPiB0aGlzX2JvYXJkLT5uX2FpY2hhbmQpIHsKIAkJCQljb21lZGlfZXJyb3IoZGV2LAotCQkJCQkgICAgICJJbmNvcnJlY3QgZGlmZmVyZW50aWFsIGFpIGNoYW5uZWwgbnVtYmVyIik7CisJCQkJCSAgICAgIkluY29ycmVjdCBkaWZmZXJlbnRpYWwgYWkgY2gtbnIiKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJfSBlbHNlIHsKQEAgLTc0MywyMCArNzUzLDIwIEBACiAvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLQlOYW1lOglzZXR1cF9jaGFubmVsX2xpc3QKK05hbWU6CXNldHVwX2NoYW5uZWxfbGlzdAogCi0JRGVzY3JpcHRpb246Ci0JCVRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgYXBwcm9wcmlhdGUgY2hhbm5lbCBzZWxlY3Rpb24sCi0JCWRpZmZlcmVudGlhbCBpbnB1dCBtb2RlIGFuZCByYW5nZSBiaXRzIGluIHRoZSBBREMgQ29tbWFuZC8KLQkJU3RhdHVzIHJlZ2lzdGVyLgorRGVzY3JpcHRpb246CisJVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBhcHByb3ByaWF0ZSBjaGFubmVsIHNlbGVjdGlvbiwKKwlkaWZmZXJlbnRpYWwgaW5wdXQgbW9kZSBhbmQgcmFuZ2UgYml0cyBpbiB0aGUgQURDIENvbW1hbmQvCisJU3RhdHVzIHJlZ2lzdGVyLgogCi0JUGFyYW1ldGVyczoKLQkJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgc2V2aWNlIHN0cnVjdHVyZQotCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQotCQl1bnNpZ25lZCBpbnQgKmNoYW5saXN0CVBvaW50ZXIgdG8gcGFja2VkIGNoYW5uZWwgbGlzdAotCQl1bnNpZ25lZCBpbnQgbl9jaGFuCU51bWJlciBvZiBjaGFubmVscyB0byBzY2FuCitQYXJhbWV0ZXJzOgorCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IHNldmljZSBzdHJ1Y3R1cmUKKwlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQorCXVuc2lnbmVkIGludCAqY2hhbmxpc3QJUG9pbnRlciB0byBwYWNrZWQgY2hhbm5lbCBsaXN0CisJdW5zaWduZWQgaW50IG5fY2hhbglOdW1iZXIgb2YgY2hhbm5lbHMgdG8gc2NhbgogCi0JUmV0dXJuczpWb2lkCitSZXR1cm5zOlZvaWQKIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwpAQCAtNzY4LDcgKzc3OCw4IEBACiAJdW5zaWduZWQgaW50IGRpZmY7CiAKICNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKLQlwcmludGsoImljcCBtdWx0aSBFREJHOiAgc2V0dXBfY2hhbm5lbF9saXN0KC4uLiwlZClcbiIsIG5fY2hhbik7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgImljcCBtdWx0aSBFREJHOiAgc2V0dXBfY2hhbm5lbF9saXN0KC4uLiwlZClcbiIsIG5fY2hhbik7CiAjZW5kaWYKIAlkZXZwcml2LT5hY3RfY2hhbmxpc3RfbGVuID0gbl9jaGFuOwogCWRldnByaXYtPmFjdF9jaGFubGlzdF9wb3MgPSAwOwpAQCAtNzg2LDcgKzc5Nyw4IEBACiAJCQljaGFucHJvZyAmPSAweDAwMGY7CiAJCX0KIAotCQkvKiAgQ2xlYXIgY2hhbm5lbCwgcmFuZ2UgYW5kIGlucHV0IG1vZGUgYml0cyBpbiBBL0QgY29tbWFuZC9zdGF0dXMgcmVnaXN0ZXIgKi8KKwkJLyogIENsZWFyIGNoYW5uZWwsIHJhbmdlIGFuZCBpbnB1dCBtb2RlIGJpdHMKKwkJICogIGluIEEvRCBjb21tYW5kL3N0YXR1cyByZWdpc3RlciAqLwogCQlkZXZwcml2LT5BZGNDbWRTdGF0dXMgJj0gMHhmMDBmOwogCiAJCS8qICBTZXQgY2hhbm5lbCBudW1iZXIgYW5kIGRpZmZlcmVudGlhbCBtb2RlIHN0YXR1cyBiaXQgKi8KQEAgLTgwOCw3ICs4MjAsOCBAQAogCQkgICAgICAgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9BRENfQ1NSKTsKIAogI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRwotCQlwcmludGsoIkdTOiAlMmQuIFslNHhdPSU0eCAlNHhcbiIsIGksIGNoYW5wcm9nLCByYW5nZSwKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICJHUzogJTJkLiBbJTR4XT0lNHggJTR4XG4iLCBpLCBjaGFucHJvZywgcmFuZ2UsCiAJCSAgICAgICBkZXZwcml2LT5hY3RfY2hhbmxpc3RbaV0pOwogI2VuZGlmCiAJfQpAQCAtODE4LDE1ICs4MzEsMTUgQEAKIC8qCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotCU5hbWU6CWljcF9tdWx0aV9yZXNldAorTmFtZToJaWNwX211bHRpX3Jlc2V0CiAKLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIGljcCBtdWx0aSBkZXZpY2UgdG8gYSAnc2FmZScgc3RhdGUKK0Rlc2NyaXB0aW9uOgorCVRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSBpY3AgbXVsdGkgZGV2aWNlIHRvIGEgJ3NhZmUnIHN0YXRlCiAKLQlQYXJhbWV0ZXJzOgotCQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBzZXZpY2Ugc3RydWN0dXJlCitQYXJhbWV0ZXJzOgorCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IHNldmljZSBzdHJ1Y3R1cmUKIAotCVJldHVybnM6aW50CTAgPSBzdWNjZXNzCitSZXR1cm5zOmludAkwID0gc3VjY2VzcwogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCkBAIC04MzUsNyArODQ4LDggQEAKIAl1bnNpZ25lZCBpbnQgaTsKIAogI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRwotCXByaW50aygiaWNwX211bHRpIEVEQkc6IEJHTjogaWNwX211bHRpX3Jlc2V0KC4uLilcbiIpOworCXByaW50ayhLRVJOX0RFQlVHCisJICAgICAgICJpY3BfbXVsdGkgRURCRzogQkdOOiBpY3BfbXVsdGlfcmVzZXQoLi4uKVxuIik7CiAjZW5kaWYKIAkvKiAgQ2xlYXIgSU5UIGVuYWJsZXMgYW5kIHJlcXVlc3RzICovCiAJd3JpdGV3KDAsIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfSU5UX0VOKTsKQEAgLTg2Niw3ICs4ODAsOCBAQAogCXdyaXRldygwLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0RPKTsKIAogI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRwotCXByaW50aygiaWNwIG11bHRpIEVEQkc6IEVORDogaWNwX211bHRpX3Jlc2V0KC4uLilcbiIpOworCXByaW50ayhLRVJOX0RFQlVHCisJICAgICAgICJpY3AgbXVsdGkgRURCRzogRU5EOiBpY3BfbXVsdGlfcmVzZXQoLi4uKVxuIik7CiAjZW5kaWYKIAlyZXR1cm4gMDsKIH0KQEAgLTg3NCwxNyArODg5LDE3IEBACiAvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLQlOYW1lOglpY3BfbXVsdGlfYXR0YWNoCitOYW1lOglpY3BfbXVsdGlfYXR0YWNoCiAKLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyBmdW5jdGlvbiBzZXRzIHVwIGFsbCB0aGUgYXBwcm9wcmlhdGUgZGF0YSBmb3IgdGhlIGN1cnJlbnQKLQkJZGV2aWNlLgorRGVzY3JpcHRpb246CisJVGhpcyBmdW5jdGlvbiBzZXRzIHVwIGFsbCB0aGUgYXBwcm9wcmlhdGUgZGF0YSBmb3IgdGhlIGN1cnJlbnQKKwlkZXZpY2UuCiAKLQlQYXJhbWV0ZXJzOgotCQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCi0JCXN0cnVjdCBjb21lZGlfZGV2Y29uZmlnICppdAlQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIGNvbmZpZ3VyYXRpb24KK1BhcmFtZXRlcnM6CisJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQorCXN0cnVjdCBjb21lZGlfZGV2Y29uZmlnICppdAlQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIGNvbmZpZ3VyYXRpb24KIAotCVJldHVybnM6aW50CTAgPSBzdWNjZXNzCitSZXR1cm5zOmludAkwID0gc3VjY2VzcwogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCkBAIC04OTgsNyArOTEzLDggQEAKIAlyZXNvdXJjZV9zaXplX3QgaW9fYWRkcls1XSwgaW9iYXNlOwogCXVuc2lnbmVkIGNoYXIgcGNpX2J1cywgcGNpX3Nsb3QsIHBjaV9mdW5jOwogCi0JcHJpbnRrKCJpY3BfbXVsdGkgRURCRzogQkdOOiBpY3BfbXVsdGlfYXR0YWNoKC4uLilcbiIpOworCXByaW50ayhLRVJOX1dBUk5JTkcKKwkgICAgICAgImljcF9tdWx0aSBFREJHOiBCR046IGljcF9tdWx0aV9hdHRhY2goLi4uKVxuIik7CiAKIAkvKiAgQWxvY2F0ZSBwcml2YXRlIGRhdGEgc3RvcmFnZSBzcGFjZSAqLwogCXJldCA9IGFsbG9jX3ByaXZhdGUoZGV2LCBzaXplb2Yoc3RydWN0IGljcF9tdWx0aV9wcml2YXRlKSk7CkBAIC05MTYsNyArOTMyLDggQEAKIAkJICAgICk7CiAJfQogCi0JcHJpbnRrKCJBbm5lJ3MgY29tZWRpJWQ6IGljcF9tdWx0aTogYm9hcmQ9JXMiLCBkZXYtPm1pbm9yLAorCXByaW50ayhLRVJOX1dBUk5JTkcKKwkgICAgICAgIkFubmUncyBjb21lZGklZDogaWNwX211bHRpOiBib2FyZD0lcyIsIGRldi0+bWlub3IsCiAJICAgICAgIHRoaXNfYm9hcmQtPm5hbWUpOwogCiAJY2FyZCA9IHNlbGVjdF9hbmRfYWxsb2NfcGNpX2NhcmQoUENJX1ZFTkRPUl9JRF9JQ1AsCkBAIC05MzAsMjQgKzk0NywyNiBAQAogCiAJaWYgKChwY2lfY2FyZF9kYXRhKGNhcmQsICZwY2lfYnVzLCAmcGNpX3Nsb3QsICZwY2lfZnVuYywgJmlvX2FkZHJbMF0sCiAJCQkgICAmaXJxKSkgPCAwKSB7Ci0JCXByaW50aygiIC0gQ2FuJ3QgZ2V0IGNvbmZpZ3VyYXRpb24gZGF0YSFcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICIgLSBDYW4ndCBnZXQgY29uZmlndXJhdGlvbiBkYXRhIVxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAogCWlvYmFzZSA9IGlvX2FkZHJbMl07CiAJZGV2cHJpdi0+cGh5c19pb2Jhc2UgPSBpb2Jhc2U7CiAKLQlwcmludGsoIiwgYjpzOmY9JWQ6JWQ6JWQsIGlvPTB4JThsbHggXG4iLCBwY2lfYnVzLCBwY2lfc2xvdCwgcGNpX2Z1bmMsCisJcHJpbnRrKEtFUk5fV0FSTklORworCSAgICAgICAiLCBiOnM6Zj0lZDolZDolZCwgaW89MHglOGxseCBcbiIsIHBjaV9idXMsIHBjaV9zbG90LCBwY2lfZnVuYywKIAkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylpb2Jhc2UpOwogCiAJZGV2cHJpdi0+aW9fYWRkciA9IGlvcmVtYXAoaW9iYXNlLCBJQ1BfTVVMVElfU0laRSk7CiAKIAlpZiAoZGV2cHJpdi0+aW9fYWRkciA9PSBOVUxMKSB7Ci0JCXByaW50aygiaW9yZW1hcCBmYWlsZWQuXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaW9yZW1hcCBmYWlsZWQuXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRwotCXByaW50aygiMHglMDhsbHggbWFwcGVkIHRvICVwLCAiLCAodW5zaWduZWQgbG9uZyBsb25nKWlvYmFzZSwKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiMHglMDhsbHggbWFwcGVkIHRvICVwLCAiLCAodW5zaWduZWQgbG9uZyBsb25nKWlvYmFzZSwKIAkgICAgICAgZGV2cHJpdi0+aW9fYWRkcik7CiAjZW5kaWYKIApAQCAtOTc1LDIwICs5OTQsMjAgQEAKIAkJaWYgKGlycSkgewogCQkJaWYgKHJlcXVlc3RfaXJxKGlycSwgaW50ZXJydXB0X3NlcnZpY2VfaWNwX211bHRpLAogCQkJCQlJUlFGX1NIQVJFRCwgIklub3ZhIEljcCBNdWx0aSIsIGRldikpIHsKLQkJCQlwcmludGsKLQkJCQkgICAgKCIsIHVuYWJsZSB0byBhbGxvY2F0ZSBJUlEgJXUsIERJU0FCTElORyBJVCIsCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSAgICAidW5hYmxlIHRvIGFsbG9jYXRlIElSUSAldSwgRElTQUJMSU5HIElUIiwKIAkJCQkgICAgIGlycSk7CiAJCQkJaXJxID0gMDsJLyogQ2FuJ3QgdXNlIElSUSAqLwogCQkJfSBlbHNlCi0JCQkJcHJpbnRrKCIsIGlycT0ldSIsIGlycSk7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiLCBpcnE9JXUiLCBpcnEpOwogCQl9IGVsc2UKLQkJCXByaW50aygiLCBJUlEgZGlzYWJsZWQiKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiwgSVJRIGRpc2FibGVkIik7CiAJfSBlbHNlCiAJCWlycSA9IDA7CiAKIAlkZXYtPmlycSA9IGlycTsKIAotCXByaW50aygiLlxuIik7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiLlxuIik7CiAKIAlzdWJkZXYgPSAwOwogCkBAIC0xMDYzLDcgKzEwODIsNyBAQAogCWRldnByaXYtPnZhbGlkID0gMTsKIAogI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRwotCXByaW50aygiaWNwIG11bHRpIEVEQkc6IEVORDogaWNwX211bHRpX2F0dGFjaCguLi4pXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiaWNwIG11bHRpIEVEQkc6IEVORDogaWNwX211bHRpX2F0dGFjaCguLi4pXG4iKTsKICNlbmRpZgogCiAJcmV0dXJuIDA7CkBAIC0xMDcyLDE2ICsxMDkxLDE2IEBACiAvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLQlOYW1lOglpY3BfbXVsdGlfZGV0YWNoCitOYW1lOglpY3BfbXVsdGlfZGV0YWNoCiAKLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyBmdW5jdGlvbiByZWxlYXNlcyBhbGwgdGhlIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBjdXJyZW50Ci0JCWRldmljZS4KK0Rlc2NyaXB0aW9uOgorCVRoaXMgZnVuY3Rpb24gcmVsZWFzZXMgYWxsIHRoZSByZXNvdXJjZXMgdXNlZCBieSB0aGUgY3VycmVudAorCWRldmljZS4KIAotCVBhcmFtZXRlcnM6Ci0JCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKK1BhcmFtZXRlcnM6CisJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQogCi0JUmV0dXJuczppbnQJMCA9IHN1Y2Nlc3MKK1JldHVybnM6aW50CTAgPSBzdWNjZXNzCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9paV9wY2kyMGtjLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWlfcGNpMjBrYy5jCmluZGV4IDI0ZGYyNDUuLmUyNmMxYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9paV9wY2kyMGtjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2lpX3BjaTIwa2MuYwpAQCAtMjMsNyArMjMsOCBAQAogICoJbm8gZXh0ZXJuIHRyaWdnZXIgaW1wbGVtZW50ZWQKICAqCiAgKglOT1QgV09SS0lORyAoYnV0IHNvb24pIG9ubHkgNCBvbi1ib2FyZCBkaWZmZXJlbnRpYWwgY2hhbm5lbHMgc3VwcG9ydGVkCi0gKglOT1QgV09SS0lORyAoYnV0IHNvb24pIG9ubHkgT05FIGRpLXBvcnQgYW5kIE9ORSBkby1wb3J0IHN1cHBvcnRlZCBpbnN0ZWFkIG9mIDQgZGlnaXRhbCBwb3J0cworICoJTk9UIFdPUktJTkcgKGJ1dCBzb29uKSBvbmx5IE9ORSBkaS1wb3J0IGFuZCBPTkUgZG8tcG9ydCBzdXBwb3J0ZWQKKyAqCQkJICAgICAgIGluc3RlYWQgb2YgNCBkaWdpdGFsIHBvcnRzCiAgKglkaS1wb3J0ID09IFBvcnQgMAogICoJZG8tcG9ydCA9PSBQb3J0IDEKICAqCkBAIC02MywxNyArNjQsMTcgQEAKIAogb3B0aW9ucyBmb3IgUENJLTIwMDA2TToKICAgZmlyc3Q6ICAgQW5hbG9nIG91dHB1dCBjaGFubmVsIDAgcmFuZ2UgY29uZmlndXJhdGlvbgotICAgICAgICAgICAgIDAgIGJpcG9sYXIgMTAgICgtMTBWIC0tICsxMFYpCi0gICAgICAgICAgICAgMSAgdW5pcG9sYXIgMTAgICgwViAtLSArMTBWKQotICAgICAgICAgICAgIDIgIGJpcG9sYXIgNSAgKC01ViAtLSA1VikKKwkgICAgIDAgIGJpcG9sYXIgMTAgICgtMTBWIC0tICsxMFYpCisJICAgICAxICB1bmlwb2xhciAxMCAgKDBWIC0tICsxMFYpCisJICAgICAyICBiaXBvbGFyIDUgICgtNVYgLS0gNVYpCiAgIHNlY29uZDogIEFuYWxvZyBvdXRwdXQgY2hhbm5lbCAxIHJhbmdlIGNvbmZpZ3VyYXRpb24KIAogb3B0aW9ucyBmb3IgUENJLTIwMzQxTToKICAgZmlyc3Q6ICAgQW5hbG9nIGlucHV0IGdhaW4gY29uZmlndXJhdGlvbgotICAgICAgICAgICAgIDAgIDEKLSAgICAgICAgICAgICAxICAxMAotICAgICAgICAgICAgIDIgIDEwMAotICAgICAgICAgICAgIDMgIDIwMAorCSAgICAgMCAgMQorCSAgICAgMSAgMTAKKwkgICAgIDIgIDEwMAorCSAgICAgMyAgMjAwCiAqLwogCiAvKiBYWFggbmVlZHMgdG8gdXNlIGlvcmVtYXAoKSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIDIuNCBrZXJuZWxzLiAgU2hvdWxkIGFsc28KQEAgLTk1LDEyICs5NiwxMiBAQAogI2RlZmluZSBQQ0kyMDAwMF9ESU9fMwkJCTB4YzEKICNkZWZpbmUgUENJMjAwMDBfRElPX0NPTlRST0xfMDEJCTB4ODMJLyogcG9ydCAwLCAxIGNvbnRyb2wgKi8KICNkZWZpbmUgUENJMjAwMDBfRElPX0NPTlRST0xfMjMJCTB4YzMJLyogcG9ydCAyLCAzIGNvbnRyb2wgKi8KLSNkZWZpbmUgUENJMjAwMDBfRElPX0JVRkZFUgkJMHg4MgkvKiBidWZmZXIgZGlyZWN0aW9uIGFuZCBlbmFibGUgKi8KKyNkZWZpbmUgUENJMjAwMDBfRElPX0JVRkZFUgkJMHg4MgkvKiBidWZmZXIgZGlyZWN0aW9uICYgZW5hYmxlICovCiAjZGVmaW5lIFBDSTIwMDAwX0RJT19FT0MJCTB4ZWYJLyogZXZlbiBwb3J0LCBjb250cm9sIG91dHB1dCAqLwogI2RlZmluZSBQQ0kyMDAwMF9ESU9fT09DCQkweGZkCS8qIG9kZCBwb3J0LCBjb250cm9sIG91dHB1dCAqLwogI2RlZmluZSBQQ0kyMDAwMF9ESU9fRUlDCQkweDkwCS8qIGV2ZW4gcG9ydCwgY29udHJvbCBpbnB1dCAqLwogI2RlZmluZSBQQ0kyMDAwMF9ESU9fT0lDCQkweDgyCS8qIG9kZCBwb3J0LCBjb250cm9sIGlucHV0ICovCi0jZGVmaW5lIERJT19DQU5ECQkJMHgxMgkvKiBhbmQgYml0IDEsIGJpdCA0IG9mIGNvbnRyb2wgKi8KKyNkZWZpbmUgRElPX0NBTkQJCQkweDEyCS8qIGFuZCBiaXQgMSAmIDQgb2YgY29udHJvbCAqLwogI2RlZmluZSBESU9fQkUJCQkJMHgwMQkvKiBidWZmZXI6IHBvcnQgZW5hYmxlICovCiAjZGVmaW5lIERJT19CTwkJCQkweDA0CS8qIGJ1ZmZlcjogb3V0cHV0ICovCiAjZGVmaW5lIERJT19CSQkJCQkweDA1CS8qIGJ1ZmZlcjogaW5wdXQgKi8KQEAgLTEzNyw3ICsxMzgsOCBAQAogCXZvaWQgKmlvYmFzZTsKIAlzdHJ1Y3QgewogCQl2b2lkICppb2Jhc2U7Ci0JCWNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlICphb19yYW5nZV9saXN0WzJdOwkvKiByYW5nZSBvZiBjaGFubmVscyBvZiBhbyBtb2R1bGUgKi8KKwkJY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgKmFvX3JhbmdlX2xpc3RbMl07CisJCQkJCS8qIHJhbmdlIG9mIGNoYW5uZWxzIG9mIGFvIG1vZHVsZSAqLwogCQl1bnNpZ25lZCBpbnQgbGFzdF9kYXRhWzJdOwogCX0gcGNpMjAwMDY7CiAJc3RydWN0IHsKQEAgLTIyNCwxNCArMjI2LDEzIEBACiAKIAkvKiBDaGVjayBQQ0ktMjAwMDEgQy0yQSBDYXJyaWVyIEJvYXJkIElEICovCiAJaWYgKChyZWFkYihkZXZwcml2LT5pb2FkZHIpICYgUENJMjAwMDBfSUQpICE9IFBDSTIwMDAwX0lEKSB7Ci0JCXByaW50aygiY29tZWRpJWQ6IGlpX3BjaTIwa2MiLCBkZXYtPm1pbm9yKTsKLQkJcHJpbnRrCi0JCSAgICAoIiBQQ0ktMjAwMDEgQy0yQSBDYXJyaWVyIEJvYXJkIGF0IGJhc2U9MHglcCBub3QgZm91bmQgIVxuIiwKLQkJICAgICBkZXZwcml2LT5pb2FkZHIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJjb21lZGklZDogaWlfcGNpMjBrYyBQQ0ktMjAwMDEiCisJCSAgICAgICAiIEMtMkEgQ2FycmllciBCb2FyZCBhdCBiYXNlPTB4JXAgbm90IGZvdW5kICFcbiIsCisJCSAgICAgICBkZXYtPm1pbm9yLCBkZXZwcml2LT5pb2FkZHIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JcHJpbnRrKCJjb21lZGklZDpcbiIsIGRldi0+bWlub3IpOwotCXByaW50aygiaWlfcGNpMjBrYzogUENJLTIwMDAxIEMtMkEgYXQgYmFzZT0weCVwXG4iLCBkZXZwcml2LT5pb2FkZHIpOworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBpaV9wY2kyMGtjOiBQQ0ktMjAwMDEgQy0yQSBhdCBiYXNlPTB4JXBcbiIsCisJICAgICAgIGRldi0+bWlub3IsIGRldnByaXYtPmlvYWRkcik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgUENJMjAwMDBfTU9EVUxFUzsgaSsrKSB7CiAJCXMgPSBkZXYtPnN1YmRldmljZXMgKyBpOwpAQCAtMjQ0LDIxICsyNDUsMjMgQEAKIAkJCSAgICBkZXZwcml2LT5pb2FkZHIgKyAoaSArIDEpICogUENJMjAwMDBfT0ZGU0VUOwogCQkJcGNpMjAwMDZfaW5pdChkZXYsIHMsIGl0LT5vcHRpb25zWzIgKiBpICsgMl0sCiAJCQkJICAgICAgaXQtPm9wdGlvbnNbMiAqIGkgKyAzXSk7Ci0JCQlwcmludGsoImNvbWVkaSVkOiBpaV9wY2kyMGtjIiwgZGV2LT5taW5vcik7Ci0JCQlwcmludGsoIiBQQ0ktMjAwMDYgbW9kdWxlIGluIHNsb3QgJWQgXG4iLCBpICsgMSk7CisJCQlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogIgorCQkJICAgICAgICJpaV9wY2kyMGtjIFBDSS0yMDAwNiBtb2R1bGUgaW4gc2xvdCAlZCBcbiIsCisJCQkgICAgICAgZGV2LT5taW5vciwgaSArIDEpOwogCQkJYnJlYWs7CiAJCWNhc2UgUENJMjAzNDFfSUQ6CiAJCQlzZHAtPnBjaTIwMzQxLmlvYmFzZSA9CiAJCQkgICAgZGV2cHJpdi0+aW9hZGRyICsgKGkgKyAxKSAqIFBDSTIwMDAwX09GRlNFVDsKIAkJCXBjaTIwMzQxX2luaXQoZGV2LCBzLCBpdC0+b3B0aW9uc1syICogaSArIDJdLAogCQkJCSAgICAgIGl0LT5vcHRpb25zWzIgKiBpICsgM10pOwotCQkJcHJpbnRrKCJjb21lZGklZDogaWlfcGNpMjBrYyIsIGRldi0+bWlub3IpOwotCQkJcHJpbnRrKCIgUENJLTIwMzQxIG1vZHVsZSBpbiBzbG90ICVkIFxuIiwgaSArIDEpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6ICIKKwkJCSAgICAgICAiaWlfcGNpMjBrYyBQQ0ktMjAzNDEgbW9kdWxlIGluIHNsb3QgJWQgXG4iLAorCQkJICAgICAgIGRldi0+bWlub3IsIGkgKyAxKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJpbnRrCi0JCQkgICAgKCJpaV9wY2kyMGtjOiB1bmtub3duIG1vZHVsZSBjb2RlIDB4JTAyeCBpbiBzbG90ICVkOiBtb2R1bGUgZGlzYWJsZWRcbiIsCi0JCQkgICAgIGlkLCBpKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImlpX3BjaTIwa2M6IHVua25vd24gbW9kdWxlICIKKwkJCSAgICAgICAiY29kZSAweCUwMnggaW4gc2xvdCAlZDogbW9kdWxlIGRpc2FibGVkXG4iLAorCQkJICAgICAgIGlkLCBpKTsgLyogWFhYIHRoaXMgbG9va3MgbGlrZSBhIGJ1ZyEgaSArIDEgPz8gKi8KIAkJCS8qIGZhbGwgdGhyb3VnaCAqLwogCQljYXNlIFBDSTIweHh4X0VNUFRZX0lEOgogCQkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKQEAgLTI3NCw3ICsyNzcsNyBAQAogCiBzdGF0aWMgaW50IHBjaTIweHh4X2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewotCXByaW50aygiY29tZWRpJWQ6IHBjaTIweHh4OiByZW1vdmVcbiIsIGRldi0+bWlub3IpOworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBwY2kyMHh4eDogcmVtb3ZlXG4iLCBkZXYtPm1pbm9yKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzM5LDcgKzM0Miw4IEBACiAJdW5zaWduZWQgaW50IGJvYXJkZGF0YTsKIAogCXNkcC0+cGNpMjAwMDYubGFzdF9kYXRhW0NSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpXSA9IGRhdGFbMF07Ci0JYm9hcmRkYXRhID0gKCgodW5zaWduZWQgaW50KWRhdGFbMF0gKyAweDgwMDApICYgMHhmZmZmKTsJLyogY29tZWRpLWRhdGEgLT4gYm9hcmQtZGF0YSAqLworCWJvYXJkZGF0YSA9ICgoKHVuc2lnbmVkIGludClkYXRhWzBdICsgMHg4MDAwKSAmIDB4ZmZmZik7CisJCQkJCQkvKiBjb21lZGktZGF0YSAtPiBib2FyZC1kYXRhICovCiAJbG8gPSAoYm9hcmRkYXRhICYgMHhmZik7CiAJaGkgPSAoKGJvYXJkZGF0YSA+PiA4KSAmIDB4ZmYpOwogCkBAIC0zNTUsNyArMzU5LDggQEAKIAkJd3JpdGViKDB4MDAsIHNkcC0+aW9iYXNlICsgUENJMjAwMDZfU1RST0JFMSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50aygiIGNvbWVkaSVkOiBwY2kyMHh4eDogYW8gY2hhbm5lbCBFcnJvciFcbiIsIGRldi0+bWlub3IpOworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiIGNvbWVkaSVkOiBwY2kyMHh4eDogYW8gY2hhbm5lbCBFcnJvciFcbiIsIGRldi0+bWlub3IpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTM3Myw4ICszNzgsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfYmlwb2xhcjBfNSA9IHsgMSwge0JJUF9SQU5HRSgwLjUpfSB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIHJhbmdlX2JpcG9sYXIwXzA1ID0geyAxLCB7QklQX1JBTkdFKDAuMDUpfSB9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIHJhbmdlX2JpcG9sYXIwXzAyNSA9Ci0gICAgeyAxLCB7QklQX1JBTkdFKDAuMDI1KX0gfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSByYW5nZV9iaXBvbGFyMF8wMjUgPSB7IDEsIHtCSVBfUkFOR0UoMC4wMjUpfSB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgKmNvbnN0IHBjaTIwMzQxX3Jhbmdlc1tdID0gewogCSZyYW5nZV9iaXBvbGFyNSwKQEAgLTQ0Nyw5ICs0NTEsMTAgQEAKIAkJCWVvYyA9IHJlYWRiKHNkcC0+aW9iYXNlICsgUENJMjAzNDFfU1RBVFVTX1JFRyk7CiAJCX0KIAkJaWYgKGogPj0gMTAwKSB7Ci0JCQlwcmludGsKLQkJCSAgICAoImNvbWVkaSVkOiAgcGNpMjB4eHg6IEFJIGludGVycnVwdCBjaGFubmVsICVpIHBvbGxpbmcgZXhpdCAhXG4iLAotCQkJICAgICBkZXYtPm1pbm9yLCBpKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiY29tZWRpJWQ6ICBwY2kyMHh4eDogIgorCQkJICAgICAgICJBSSBpbnRlcnJ1cHQgY2hhbm5lbCAlaSBwb2xsaW5nIGV4aXQgIVxuIiwKKwkJCSAgICAgICBkZXYtPm1pbm9yLCBpKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWxvID0gcmVhZGIoc2RwLT5pb2Jhc2UgKyBQQ0kyMDM0MV9MREFUQSk7CkBAIC01MDIsMjAgKzUwNywxOCBAQAogCWludCBtYXNrLCBiaXRzOwogCiAJbWFzayA9IDEgPDwgQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7Ci0JaWYgKG1hc2sgJiAweDAwMDAwMGZmKSB7CisJaWYgKG1hc2sgJiAweDAwMDAwMGZmKQogCQliaXRzID0gMHgwMDAwMDBmZjsKLQl9IGVsc2UgaWYgKG1hc2sgJiAweDAwMDBmZjAwKSB7CisJZWxzZSBpZiAobWFzayAmIDB4MDAwMGZmMDApCiAJCWJpdHMgPSAweDAwMDBmZjAwOwotCX0gZWxzZSBpZiAobWFzayAmIDB4MDBmZjAwMDApIHsKKwllbHNlIGlmIChtYXNrICYgMHgwMGZmMDAwMCkKIAkJYml0cyA9IDB4MDBmZjAwMDA7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCWJpdHMgPSAweGZmMDAwMDAwOwotCX0KLQlpZiAoZGF0YVswXSkgeworCWlmIChkYXRhWzBdKQogCQlzLT5pb19iaXRzIHw9IGJpdHM7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCXMtPmlvX2JpdHMgJj0gfmJpdHM7Ci0JfQogCXBjaTIweHh4X2Rpb19jb25maWcoZGV2LCBzKTsKIAogCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2tlX2NvdW50ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9rZV9jb3VudGVyLmMKaW5kZXggYzE0NWU4Mi4uNzNiMDQ0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2tlX2NvdW50ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMva2VfY291bnRlci5jCkBAIC0xOTIsMTIgKzE5MiwxNCBAQAogCQkJfQogCQl9CiAJfQotCXByaW50aygiY29tZWRpJWQ6IG5vIHN1cHBvcnRlZCBib2FyZCBmb3VuZCEgKHJlcS4gYnVzL3Nsb3Q6ICVkLyVkKVxuIiwKKwlwcmludGsoS0VSTl9XQVJOSU5HCisJICAgICAgICJjb21lZGklZDogbm8gc3VwcG9ydGVkIGJvYXJkIGZvdW5kISAocmVxLiBidXMvc2xvdDogJWQvJWQpXG4iLAogCSAgICAgICBkZXYtPm1pbm9yLCBpdC0+b3B0aW9uc1swXSwgaXQtPm9wdGlvbnNbMV0pOwogCXJldHVybiAtRUlPOwogCiBmb3VuZDoKLQlwcmludGsoImNvbWVkaSVkOiBmb3VuZCAlcyBhdCBQQ0kgYnVzICVkLCBzbG90ICVkXG4iLCBkZXYtPm1pbm9yLAorCXByaW50ayhLRVJOX0lORk8KKwkgICAgICAgImNvbWVkaSVkOiBmb3VuZCAlcyBhdCBQQ0kgYnVzICVkLCBzbG90ICVkXG4iLCBkZXYtPm1pbm9yLAogCSAgICAgICBib2FyZC0+bmFtZSwgcGNpX2RldmljZS0+YnVzLT5udW1iZXIsCiAJICAgICAgIFBDSV9TTE9UKHBjaV9kZXZpY2UtPmRldmZuKSk7CiAJZGV2cHJpdi0+cGNpZGV2ID0gcGNpX2RldmljZTsKQEAgLTIwNiw5ICsyMDgsOSBAQAogCS8qIGVuYWJsZSBQQ0kgZGV2aWNlIGFuZCByZXF1ZXN0IHJlZ2lvbnMgKi8KIAllcnJvciA9IGNvbWVkaV9wY2lfZW5hYmxlKHBjaV9kZXZpY2UsIENOVF9EUklWRVJfTkFNRSk7CiAJaWYgKGVycm9yIDwgMCkgewotCQlwcmludGsKLQkJICAgICgiY29tZWRpJWQ6IGZhaWxlZCB0byBlbmFibGUgUENJIGRldmljZSBhbmQgcmVxdWVzdCByZWdpb25zIVxuIiwKLQkJICAgICBkZXYtPm1pbm9yKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY29tZWRpJWQ6ICIKKwkJICAgICAgICJmYWlsZWQgdG8gZW5hYmxlIFBDSSBkZXZpY2UgYW5kIHJlcXVlc3QgcmVnaW9ucyFcbiIsCisJCSAgICAgICBkZXYtPm1pbm9yKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KIApAQCAtMjM5LDcgKzI0MSw4IEBACiAJb3V0YigwLCBkZXYtPmlvYmFzZSArIDB4MjApOwogCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyAweDQwKTsKIAotCXByaW50aygiY29tZWRpJWQ6ICIgQ05UX0RSSVZFUl9OQU1FICIgYXR0YWNoZWQuXG4iLCBkZXYtPm1pbm9yKTsKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogIiBDTlRfRFJJVkVSX05BTUUgIiBhdHRhY2hlZC5cbiIsCisJICAgICAgIGRldi0+bWlub3IpOwogCXJldHVybiAwOwogfQogCkBAIC0yNDgsMTEgKzI1MSwxMSBAQAogc3RhdGljIGludCBjbnRfZGV0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7CiAJaWYgKGRldnByaXYgJiYgZGV2cHJpdi0+cGNpZGV2KSB7Ci0JCWlmIChkZXYtPmlvYmFzZSkgeworCQlpZiAoZGV2LT5pb2Jhc2UpCiAJCQljb21lZGlfcGNpX2Rpc2FibGUoZGV2cHJpdi0+cGNpZGV2KTsKLQkJfQogCQlwY2lfZGV2X3B1dChkZXZwcml2LT5wY2lkZXYpOwogCX0KLQlwcmludGsoImNvbWVkaSVkOiAiIENOVF9EUklWRVJfTkFNRSAiIHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6ICIgQ05UX0RSSVZFUl9OQU1FICIgcmVtb3ZlXG4iLAorCSAgICAgICBkZXYtPm1pbm9yKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZTQwMDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZTQwMDAuYwppbmRleCA2MDc5OTEzLi44YjlmYTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWU0MDAwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lNDAwMC5jCkBAIC04NDAsNyArODQwLDcgQEAKIAkJICAgICAgICJjb21lZGklZDogbWU0MDAwOiB4aWxpbnhfZG93bmxvYWQoKTogRE9ORSBmbGFnIGlzIG5vdCBzZXRcbiIsCiAJCSAgICAgICBkZXYtPm1pbm9yKTsKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogeGlsaW54X2Rvd25sb2FkKCk6IERvd25sb2FkIG5vdCBzdWNjZXNmdWxcbiIsCisJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogeGlsaW54X2Rvd25sb2FkKCk6IERvd25sb2FkIG5vdCBzdWNjZXNzZnVsXG4iLAogCQkgICAgICAgZGV2LT5taW5vcik7CiAJCXJldHVybiAtRUlPOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5jCmluZGV4IGU2NTJmM2IuLjE4OGY1ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuYwpAQCAtNjQsNiArNjQsNyBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiBzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGVfZGV2aWNlczsKK0VYUE9SVF9TWU1CT0wobWl0ZV9kZXZpY2VzKTsKIAogI2RlZmluZSBUT1BfT0ZfUEFHRSh4KSAoKHgpfCh+KFBBR0VfTUFTSykpKQogCkBAIC04MCw3ICs4MSw3IEBACiAKIAkJCW1pdGUgPSBremFsbG9jKHNpemVvZigqbWl0ZSksIEdGUF9LRVJORUwpOwogCQkJaWYgKCFtaXRlKSB7Ci0JCQkJcHJpbnRrKCJtaXRlOiBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJtaXRlOiBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCQkJcGNpX2Rldl9wdXQocGNpZGV2KTsKIAkJCQlyZXR1cm47CiAJCQl9CkBAIC05OSwxNCArMTAwLDE0IEBACiAKIHN0YXRpYyB2b2lkIGR1bXBfY2hpcF9zaWduYXR1cmUodTMyIGNzaWdyX2JpdHMpCiB7Ci0JcHJpbnRrCi0JICAgICgibWl0ZTogdmVyc2lvbiA9ICVpLCB0eXBlID0gJWksIG1pdGUgbW9kZSA9ICVpLCBpbnRlcmZhY2UgbW9kZSA9ICVpXG4iLAotCSAgICAgbWl0ZV9jc2lncl92ZXJzaW9uKGNzaWdyX2JpdHMpLCBtaXRlX2NzaWdyX3R5cGUoY3NpZ3JfYml0cyksCi0JICAgICBtaXRlX2NzaWdyX21tb2RlKGNzaWdyX2JpdHMpLCBtaXRlX2NzaWdyX2ltb2RlKGNzaWdyX2JpdHMpKTsKLQlwcmludGsKLQkgICAgKCJtaXRlOiBudW0gY2hhbm5lbHMgPSAlaSwgd3JpdGUgcG9zdCBmaWZvIGRlcHRoID0gJWksIHdpbnMgPSAlaSwgaW93aW5zID0gJWlcbiIsCi0JICAgICBtaXRlX2NzaWdyX2RtYWMoY3NpZ3JfYml0cyksIG1pdGVfY3NpZ3Jfd3BkZXAoY3NpZ3JfYml0cyksCi0JICAgICBtaXRlX2NzaWdyX3dpbnMoY3NpZ3JfYml0cyksIG1pdGVfY3NpZ3JfaW93aW5zKGNzaWdyX2JpdHMpKTsKKwlwcmludGsoS0VSTl9JTkZPICJtaXRlOiB2ZXJzaW9uID0gJWksIHR5cGUgPSAlaSwgbWl0ZSBtb2RlID0gJWksIgorCSAgICAgICAiaW50ZXJmYWNlIG1vZGUgPSAlaVxuIiwKKwkgICAgICAgbWl0ZV9jc2lncl92ZXJzaW9uKGNzaWdyX2JpdHMpLCBtaXRlX2NzaWdyX3R5cGUoY3NpZ3JfYml0cyksCisJICAgICAgIG1pdGVfY3NpZ3JfbW1vZGUoY3NpZ3JfYml0cyksIG1pdGVfY3NpZ3JfaW1vZGUoY3NpZ3JfYml0cykpOworCXByaW50ayhLRVJOX0lORk8gIm1pdGU6IG51bSBjaGFubmVscyA9ICVpLCB3cml0ZSBwb3N0IGZpZm8gZGVwdGggPSAlaSwiCisJICAgICAgICJ3aW5zID0gJWksIGlvd2lucyA9ICVpXG4iLAorCSAgICAgICBtaXRlX2NzaWdyX2RtYWMoY3NpZ3JfYml0cyksIG1pdGVfY3NpZ3Jfd3BkZXAoY3NpZ3JfYml0cyksCisJICAgICAgIG1pdGVfY3NpZ3Jfd2lucyhjc2lncl9iaXRzKSwgbWl0ZV9jc2lncl9pb3dpbnMoY3NpZ3JfYml0cykpOwogfQogCiB1bnNpZ25lZCBtaXRlX2ZpZm9fc2l6ZShzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUsIHVuc2lnbmVkIGNoYW5uZWwpCkBAIC0xMjYsNyArMTI3LDcgQEAKIAl1bnNpZ25lZCB1bmtub3duX2RtYV9idXJzdF9iaXRzOwogCiAJaWYgKGNvbWVkaV9wY2lfZW5hYmxlKG1pdGUtPnBjaWRldiwgIm1pdGUiKSkgewotCQlwcmludGsoImVycm9yIGVuYWJsaW5nIG1pdGUgYW5kIHJlcXVlc3RpbmcgaW8gcmVnaW9uc1xuIik7CisJCXByaW50ayhLRVJOX0VSUiAiZXJyb3IgZW5hYmxpbmcgbWl0ZSBhbmQgcmVxdWVzdGluZyBpbyByZWdpb25zXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCXBjaV9zZXRfbWFzdGVyKG1pdGUtPnBjaWRldik7CkBAIC0xMzUsMjcgKzEzNiwzMCBAQAogCW1pdGUtPm1pdGVfcGh5c19hZGRyID0gYWRkcjsKIAltaXRlLT5taXRlX2lvX2FkZHIgPSBpb3JlbWFwKGFkZHIsIFBDSV9NSVRFX1NJWkUpOwogCWlmICghbWl0ZS0+bWl0ZV9pb19hZGRyKSB7Ci0JCXByaW50aygiZmFpbGVkIHRvIHJlbWFwIG1pdGUgaW8gbWVtb3J5IGFkZHJlc3NcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZW1hcCBtaXRlIGlvIG1lbW9yeSBhZGRyZXNzXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCXByaW50aygiTUlURToweCUwOGxseCBtYXBwZWQgdG8gJXAgIiwKKwlwcmludGsoS0VSTl9JTkZPICJNSVRFOjB4JTA4bGx4IG1hcHBlZCB0byAlcCAiLAogCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW1pdGUtPm1pdGVfcGh5c19hZGRyLCBtaXRlLT5taXRlX2lvX2FkZHIpOwogCiAJYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChtaXRlLT5wY2lkZXYsIDEpOwogCW1pdGUtPmRhcV9waHlzX2FkZHIgPSBhZGRyOwogCWxlbmd0aCA9IHBjaV9yZXNvdXJjZV9sZW4obWl0ZS0+cGNpZGV2LCAxKTsKLQkvKiAgSW4gY2FzZSBvZiBhIDY2MHggYm9hcmQsIERBUSBzaXplIGlzIDhrIGluc3RlYWQgb2YgNGsgKHNlZSBhcyBzaG93biBieSBsc3BjaSBvdXRwdXQpICovCisJLyoKKwkgKiBJbiBjYXNlIG9mIGEgNjYweCBib2FyZCwgREFRIHNpemUgaXMgOGsgaW5zdGVhZCBvZiA0aworCSAqIChzZWUgYXMgc2hvd24gYnkgbHNwY2kgb3V0cHV0KQorCSAqLwogCW1pdGUtPmRhcV9pb19hZGRyID0gaW9yZW1hcChtaXRlLT5kYXFfcGh5c19hZGRyLCBsZW5ndGgpOwogCWlmICghbWl0ZS0+ZGFxX2lvX2FkZHIpIHsKLQkJcHJpbnRrKCJmYWlsZWQgdG8gcmVtYXAgZGFxIGlvIG1lbW9yeSBhZGRyZXNzXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVtYXAgZGFxIGlvIG1lbW9yeSBhZGRyZXNzXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCXByaW50aygiREFROjB4JTA4bGx4IG1hcHBlZCB0byAlcFxuIiwKKwlwcmludGsoS0VSTl9JTkZPICJEQVE6MHglMDhsbHggbWFwcGVkIHRvICVwXG4iLAogCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW1pdGUtPmRhcV9waHlzX2FkZHIsIG1pdGUtPmRhcV9pb19hZGRyKTsKIAogCWlmICh1c2VfaW9kd2Jzcl8xKSB7CiAJCXdyaXRlbCgwLCBtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0lPRFdCU1IpOwotCQlwcmludGsoIm1pdGU6IHVzaW5nIEkvTyBXaW5kb3cgQmFzZSBTaXplIHJlZ2lzdGVyIDFcbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJtaXRlOiB1c2luZyBJL08gV2luZG93IEJhc2UgU2l6ZSByZWdpc3RlciAxXG4iKTsKIAkJd3JpdGVsKG1pdGUtPmRhcV9waHlzX2FkZHIgfCBXRU5BQiB8CiAJCSAgICAgICBNSVRFX0lPRFdCU1JfMV9XU0laRV9iaXRzKGxlbmd0aCksCiAJCSAgICAgICBtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0lPRFdCU1JfMSk7CkBAIC0xNjQsMTEgKzE2OCwxMiBAQAogCQl3cml0ZWwobWl0ZS0+ZGFxX3BoeXNfYWRkciB8IFdFTkFCLAogCQkgICAgICAgbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9JT0RXQlNSKTsKIAl9Ci0JLyogbWFrZSBzdXJlIGRtYSBidXJzdHMgd29yay4gIEkgZ290IHRoaXMgZnJvbSBydW5uaW5nIGEgYnVzIGFuYWx5emVyCi0JICAgb24gYSBweGktNjI4MSBhbmQgYSBweGktNjcxMy4gIDY3MTMgcG93ZXJlZCB1cCB3aXRoIHJlZ2lzdGVyIHZhbHVlCi0JICAgb2YgMHg2MWYgYW5kIGJ1cnN0cyB3b3JrZWQuICA2MjgxIHBvd2VyZWQgdXAgd2l0aCByZWdpc3RlciB2YWx1ZSBvZgotCSAgIDB4MWYgYW5kIGJ1cnN0cyBkaWRuJ3Qgd29yay4gIFRoZSBOSSB3aW5kb3dzIGRyaXZlciByZWFkcyB0aGUgcmVnaXN0ZXIsCi0JICAgdGhlbiBkb2VzIGEgYml0d2lzZS1vciBvZiAweDYwMCB3aXRoIGl0IGFuZCB3cml0ZXMgaXQgYmFjay4KKwkvKgorCSAqIG1ha2Ugc3VyZSBkbWEgYnVyc3RzIHdvcmsuIEkgZ290IHRoaXMgZnJvbSBydW5uaW5nIGEgYnVzIGFuYWx5emVyCisJICogb24gYSBweGktNjI4MSBhbmQgYSBweGktNjcxMy4gNjcxMyBwb3dlcmVkIHVwIHdpdGggcmVnaXN0ZXIgdmFsdWUKKwkgKiBvZiAweDYxZiBhbmQgYnVyc3RzIHdvcmtlZC4gNjI4MSBwb3dlcmVkIHVwIHdpdGggcmVnaXN0ZXIgdmFsdWUgb2YKKwkgKiAweDFmIGFuZCBidXJzdHMgZGlkbid0IHdvcmsuIFRoZSBOSSB3aW5kb3dzIGRyaXZlciByZWFkcyB0aGUKKwkgKiByZWdpc3RlciwgdGhlbiBkb2VzIGEgYml0d2lzZS1vciBvZiAweDYwMCB3aXRoIGl0IGFuZCB3cml0ZXMgaXQgYmFjay4KIAkgKi8KIAl1bmtub3duX2RtYV9idXJzdF9iaXRzID0KIAkgICAgcmVhZGwobWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9VTktOT1dOX0RNQV9CVVJTVF9SRUcpOwpAQCAtMTc5LDkgKzE4NCw5IEBACiAJY3NpZ3JfYml0cyA9IHJlYWRsKG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfQ1NJR1IpOwogCW1pdGUtPm51bV9jaGFubmVscyA9IG1pdGVfY3NpZ3JfZG1hYyhjc2lncl9iaXRzKTsKIAlpZiAobWl0ZS0+bnVtX2NoYW5uZWxzID4gTUFYX01JVEVfRE1BX0NIQU5ORUxTKSB7Ci0JCXByaW50awotCQkgICAgKCJtaXRlOiBidWc/IGNoaXAgY2xhaW1zIHRvIGhhdmUgJWkgZG1hIGNoYW5uZWxzLiAgU2V0dGluZyB0byAlaS5cbiIsCi0JCSAgICAgbWl0ZS0+bnVtX2NoYW5uZWxzLCBNQVhfTUlURV9ETUFfQ0hBTk5FTFMpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtaXRlOiBidWc/IGNoaXAgY2xhaW1zIHRvIGhhdmUgJWkgZG1hICIKKwkJICAgICAgICJjaGFubmVscy4gU2V0dGluZyB0byAlaS5cbiIsCisJCSAgICAgICBtaXRlLT5udW1fY2hhbm5lbHMsIE1BWF9NSVRFX0RNQV9DSEFOTkVMUyk7CiAJCW1pdGUtPm51bV9jaGFubmVscyA9IE1BWF9NSVRFX0RNQV9DSEFOTkVMUzsKIAl9CiAJZHVtcF9jaGlwX3NpZ25hdHVyZShjc2lncl9iaXRzKTsKQEAgLTE5NCwxNiArMTk5LDE4IEBACiAJCSAgICAgICBtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0NIQ1IoaSkpOwogCX0KIAltaXRlLT5maWZvX3NpemUgPSBtaXRlX2ZpZm9fc2l6ZShtaXRlLCAwKTsKLQlwcmludGsoIm1pdGU6IGZpZm8gc2l6ZSBpcyAlaS5cbiIsIG1pdGUtPmZpZm9fc2l6ZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAibWl0ZTogZmlmbyBzaXplIGlzICVpLlxuIiwgbWl0ZS0+Zmlmb19zaXplKTsKIAltaXRlLT51c2VkID0gMTsKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChtaXRlX3NldHVwMik7CiAKIGludCBtaXRlX3NldHVwKHN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSkKIHsKIAlyZXR1cm4gbWl0ZV9zZXR1cDIobWl0ZSwgMCk7CiB9CitFWFBPUlRfU1lNQk9MKG1pdGVfc2V0dXApOwogCiB2b2lkIG1pdGVfY2xlYW51cCh2b2lkKQogewpAQCAtMjM4LDIyICsyNDUsMjMgQEAKIAogCW1pdGUtPnVzZWQgPSAwOwogfQorRVhQT1JUX1NZTUJPTChtaXRlX3Vuc2V0dXApOwogCiB2b2lkIG1pdGVfbGlzdF9kZXZpY2VzKHZvaWQpCiB7CiAJc3RydWN0IG1pdGVfc3RydWN0ICptaXRlLCAqbmV4dDsKIAotCXByaW50aygiQXZhaWxhYmxlIE5JIGRldmljZSBJRHM6Iik7CisJcHJpbnRrKEtFUk5fSU5GTyAiQXZhaWxhYmxlIE5JIGRldmljZSBJRHM6Iik7CiAJaWYgKG1pdGVfZGV2aWNlcykKIAkJZm9yIChtaXRlID0gbWl0ZV9kZXZpY2VzOyBtaXRlOyBtaXRlID0gbmV4dCkgewogCQkJbmV4dCA9IG1pdGUtPm5leHQ7Ci0JCQlwcmludGsoIiAweCUwNHgiLCBtaXRlX2RldmljZV9pZChtaXRlKSk7CisJCQlwcmludGsoS0VSTl9JTkZPICIgMHglMDR4IiwgbWl0ZV9kZXZpY2VfaWQobWl0ZSkpOwogCQkJaWYgKG1pdGUtPnVzZWQpCi0JCQkJcHJpbnRrKCIodXNlZCkiKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIodXNlZCkiKTsKIAkJfQotCXByaW50aygiXG4iKTsKLQorCXByaW50ayhLRVJOX0lORk8gIlxuIik7CiB9CitFWFBPUlRfU1lNQk9MKG1pdGVfbGlzdF9kZXZpY2VzKTsKIAogc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9yZXF1ZXN0X2NoYW5uZWxfaW5fcmFuZ2Uoc3RydWN0IG1pdGVfc3RydWN0ICptaXRlLAogCQkJCQkJICAgc3RydWN0CkBAIC0yNjUsNyArMjczLDkgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBtaXRlX2NoYW5uZWwgKmNoYW5uZWwgPSBOVUxMOwogCi0JLyogIHNwaW4gbG9jayBzbyBtaXRlX3JlbGVhc2VfY2hhbm5lbCBjYW4gYmUgY2FsbGVkIHNhZmVseSBmcm9tIGludGVycnVwdHMgKi8KKwkvKiBzcGluIGxvY2sgc28gbWl0ZV9yZWxlYXNlX2NoYW5uZWwgY2FuIGJlIGNhbGxlZCBzYWZlbHkKKwkgKiBmcm9tIGludGVycnVwdHMKKwkgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmbWl0ZS0+bG9jaywgZmxhZ3MpOwogCWZvciAoaSA9IG1pbl9jaGFubmVsOyBpIDw9IG1heF9jaGFubmVsOyArK2kpIHsKIAkJaWYgKG1pdGUtPmNoYW5uZWxfYWxsb2NhdGVkW2ldID09IDApIHsKQEAgLTI3OCw2ICsyODgsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pdGUtPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gY2hhbm5lbDsKIH0KK0VYUE9SVF9TWU1CT0wobWl0ZV9yZXF1ZXN0X2NoYW5uZWxfaW5fcmFuZ2UpOwogCiB2b2lkIG1pdGVfcmVsZWFzZV9jaGFubmVsKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbikKIHsKQEAgLTI4OSw4ICszMDAsMTAgQEAKIAlpZiAobWl0ZS0+Y2hhbm5lbF9hbGxvY2F0ZWRbbWl0ZV9jaGFuLT5jaGFubmVsXSkgewogCQltaXRlX2RtYV9kaXNhcm0obWl0ZV9jaGFuKTsKIAkJbWl0ZV9kbWFfcmVzZXQobWl0ZV9jaGFuKTsKLS8qIGRpc2FibGUgYWxsIGNoYW5uZWwncyBpbnRlcnJ1cHRzIChkbyBpdCBhZnRlciBkaXNhcm0vcmVzZXQgc28KLU1JVEVfQ0hDUiByZWcgaXNuJ3QgY2hhbmdlZCB3aGlsZSBkbWEgaXMgc3RpbGwgYWN0aXZlISkgKi8KKwkvKgorCSAqIGRpc2FibGUgYWxsIGNoYW5uZWwncyBpbnRlcnJ1cHRzIChkbyBpdCBhZnRlciBkaXNhcm0vcmVzZXQgc28KKwkgKiBNSVRFX0NIQ1IgcmVnIGlzbid0IGNoYW5nZWQgd2hpbGUgZG1hIGlzIHN0aWxsIGFjdGl2ZSEpCisJICovCiAJCXdyaXRlbChDSENSX0NMUl9ETUFfSUUgfCBDSENSX0NMUl9MSU5LUF9JRSB8CiAJCSAgICAgICBDSENSX0NMUl9TQVJfSUUgfCBDSENSX0NMUl9ET05FX0lFIHwKIAkJICAgICAgIENIQ1JfQ0xSX01SRFlfSUUgfCBDSENSX0NMUl9EUkRZX0lFIHwKQEAgLTMwMiw2ICszMTUsNyBAQAogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaXRlLT5sb2NrLCBmbGFncyk7CiB9CitFWFBPUlRfU1lNQk9MKG1pdGVfcmVsZWFzZV9jaGFubmVsKTsKIAogdm9pZCBtaXRlX2RtYV9hcm0oc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKQogewpAQCAtMzEwLDggKzMyNCwxMCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlNRFBSSU5USygibWl0ZV9kbWFfYXJtIGNoJWlcbiIsIGNoYW5uZWwpOwotCS8qIG1lbW9yeSBiYXJyaWVyIGlzIGludGVuZGVkIHRvIGluc3VyZSBhbnkgdHdpZGRsaW5nIHdpdGggdGhlIGJ1ZmZlcgotCSAgIGlzIGRvbmUgYmVmb3JlIHdyaXRpbmcgdG8gdGhlIG1pdGUgdG8gYXJtIGRtYSB0cmFuc2ZlciAqLworCS8qCisJICogbWVtb3J5IGJhcnJpZXIgaXMgaW50ZW5kZWQgdG8gaW5zdXJlIGFueSB0d2lkZGxpbmcgd2l0aCB0aGUgYnVmZmVyCisJICogaXMgZG9uZSBiZWZvcmUgd3JpdGluZyB0byB0aGUgbWl0ZSB0byBhcm0gZG1hIHRyYW5zZmVyCisJICovCiAJc21wX21iKCk7CiAJLyogYXJtICovCiAJY2hvciA9IENIT1JfU1RBUlQ7CkBAIC0zMjIsNiArMzM4LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaXRlLT5sb2NrLCBmbGFncyk7CiAvKiAgICAgICBtaXRlX2RtYV90Y3IobWl0ZSwgY2hhbm5lbCk7ICovCiB9CitFWFBPUlRfU1lNQk9MKG1pdGVfZG1hX2FybSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMzU0LDcgKzM3MSw3IEBACiAJCQkgICAgICAgbl9saW5rcyAqIHNpemVvZihzdHJ1Y3QgbWl0ZV9kbWFfZGVzY3JpcHRvciksCiAJCQkgICAgICAgJnJpbmctPmRlc2NyaXB0b3JzX2RtYV9hZGRyLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJpbmctPmRlc2NyaXB0b3JzKSB7Ci0JCXByaW50aygibWl0ZTogcmluZyBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIm1pdGU6IHJpbmcgYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXJpbmctPm5fbGlua3MgPSBuX2xpbmtzOwpAQCAtMzcwLDExICszODcsMTQgQEAKIAl9CiAJcmluZy0+ZGVzY3JpcHRvcnNbbl9saW5rcyAtIDFdLm5leHQgPQogCSAgICBjcHVfdG9fbGUzMihyaW5nLT5kZXNjcmlwdG9yc19kbWFfYWRkcik7Ci0JLyogYmFycmllciBpcyBtZWFudCB0byBpbnN1cmUgdGhhdCBhbGwgdGhlIHdyaXRlcyB0byB0aGUgZG1hIGRlc2NyaXB0b3JzCi0JICAgaGF2ZSBjb21wbGV0ZWQgYmVmb3JlIHRoZSBkbWEgY29udHJvbGxlciBpcyBjb21tYW5kZWQgdG8gcmVhZCB0aGVtICovCisJLyoKKwkgKiBiYXJyaWVyIGlzIG1lYW50IHRvIGluc3VyZSB0aGF0IGFsbCB0aGUgd3JpdGVzIHRvIHRoZSBkbWEgZGVzY3JpcHRvcnMKKwkgKiBoYXZlIGNvbXBsZXRlZCBiZWZvcmUgdGhlIGRtYSBjb250cm9sbGVyIGlzIGNvbW1hbmRlZCB0byByZWFkIHRoZW0KKwkgKi8KIAlzbXBfd21iKCk7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKG1pdGVfYnVmX2NoYW5nZSk7CiAKIHZvaWQgbWl0ZV9wcmVwX2RtYShzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4sCiAJCSAgIHVuc2lnbmVkIGludCBudW1fZGV2aWNlX2JpdHMsIHVuc2lnbmVkIGludCBudW1fbWVtb3J5X2JpdHMpCkBAIC0zOTUsMTYgKzQxNSwxOSBAQAogCSAqIExpbmsgQ29tcGxldGUgSW50ZXJydXB0OiBpbnRlcnJ1cHQgZXZlcnkgdGltZSBhIGxpbmsKIAkgKiBpbiBNSVRFX1JJTkcgaXMgY29tcGxldGVkLiBUaGlzIGNhbiBnZW5lcmF0ZSBhIGxvdCBvZgogCSAqIGV4dHJhIGludGVycnVwdHMsIGJ1dCByaWdodCBub3cgd2UgdXBkYXRlIHRoZSB2YWx1ZXMKLQkgKiBvZiBidWZfaW50X3B0ciBhbmQgYnVmX2ludF9jb3VudCBhdCBlYWNoIGludGVycnVwdC4gIEEKKwkgKiBvZiBidWZfaW50X3B0ciBhbmQgYnVmX2ludF9jb3VudCBhdCBlYWNoIGludGVycnVwdC4gQQogCSAqIGJldHRlciBtZXRob2QgaXMgdG8gcG9sbCB0aGUgTUlURSBiZWZvcmUgZWFjaCB1c2VyCiAJICogInJlYWQoKSIgdG8gY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlLgogCSAqLwogCWNoY3IgfD0gQ0hDUl9TRVRfTENfSUU7CiAJaWYgKG51bV9tZW1vcnlfYml0cyA9PSAzMiAmJiBudW1fZGV2aWNlX2JpdHMgPT0gMTYpIHsKLQkJLyogRG9pbmcgYSBjb21iaW5lZCAzMiBhbmQgMTYgYml0IGJ5dGVzd2FwIGdldHMgdGhlIDE2IGJpdCBzYW1wbGVzIGludG8gdGhlIGZpZm8gaW4gdGhlIHJpZ2h0IG9yZGVyLgotCQkgICBUZXN0ZWQgZG9pbmcgMzIgYml0IG1lbW9yeSB0byAxNiBiaXQgZGV2aWNlIHRyYW5zZmVycyB0byB0aGUgYW5hbG9nIG91dCBvZiBhIHB4aS02MjgxLAotCQkgICB3aGljaCBoYXMgbWl0ZSB2ZXJzaW9uID0gMSwgdHlwZSA9IDQuICBUaGlzIGFsc28gd29ya3MgZm9yIGRtYSByZWFkcyBmcm9tIHRoZSBjb3VudGVycwotCQkgICBvbiBlLXNlcmllcyBib2FyZHMuICAqLworCQkvKgorCQkgKiBEb2luZyBhIGNvbWJpbmVkIDMyIGFuZCAxNiBiaXQgYnl0ZXN3YXAgZ2V0cyB0aGUgMTYgYml0CisJCSAqIHNhbXBsZXMgaW50byB0aGUgZmlmbyBpbiB0aGUgcmlnaHQgb3JkZXIuIFRlc3RlZCBkb2luZyAzMiBiaXQKKwkJICogbWVtb3J5IHRvIDE2IGJpdCBkZXZpY2UgdHJhbnNmZXJzIHRvIHRoZSBhbmFsb2cgb3V0IG9mIGEKKwkJICogcHhpLTYyODEsIHdoaWNoIGhhcyBtaXRlIHZlcnNpb24gPSAxLCB0eXBlID0gNC4gVGhpcyBhbHNvCisJCSAqIHdvcmtzIGZvciBkbWEgcmVhZHMgZnJvbSB0aGUgY291bnRlcnMgb24gZS1zZXJpZXMgYm9hcmRzLgorCQkgKi8KIAkJY2hjciB8PSBDSENSX0JZVEVfU1dBUF9ERVZJQ0UgfCBDSENSX0JZVEVfU1dBUF9NRU1PUlk7CiAJfQogCWlmIChtaXRlX2NoYW4tPmRpciA9PSBDT01FRElfSU5QVVQpCkBAIC00MjUsNyArNDQ4LDggQEAKIAkJbWNyIHw9IENSX1BTSVpFMzI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50aygibWl0ZTogYnVnISBpbnZhbGlkIG1lbSBiaXQgd2lkdGggZm9yIGRtYSB0cmFuc2ZlclxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1pdGU6IGJ1ZyEgaW52YWxpZCBtZW0gYml0IHdpZHRoIGZvciBkbWEgIgorCQkgICAgICAgInRyYW5zZmVyXG4iKTsKIAkJYnJlYWs7CiAJfQogCXdyaXRlbChtY3IsIG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfTUNSKG1pdGVfY2hhbi0+Y2hhbm5lbCkpOwpAQCAtNDQ0LDcgKzQ2OCw4IEBACiAJCWRjciB8PSBDUl9QU0laRTMyOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoIm1pdGU6IGJ1ZyEgaW52YWxpZCBkZXYgYml0IHdpZHRoIGZvciBkbWEgdHJhbnNmZXJcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtaXRlOiBidWchIGludmFsaWQgZGV2IGJpdCB3aWR0aCBmb3IgZG1hICIKKwkJICAgICAgICJ0cmFuc2ZlclxuIik7CiAJCWJyZWFrOwogCX0KIAl3cml0ZWwoZGNyLCBtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0RDUihtaXRlX2NoYW4tPmNoYW5uZWwpKTsKQEAgLTQ2Miw2ICs0ODcsNyBAQAogCiAJTURQUklOVEsoImV4aXQgbWl0ZV9wcmVwX2RtYVxuIik7CiB9CitFWFBPUlRfU1lNQk9MKG1pdGVfcHJlcF9kbWEpOwogCiB1MzIgbWl0ZV9kZXZpY2VfYnl0ZXNfdHJhbnNmZXJyZWQoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKQogewpAQCAtNDY5LDQ4ICs0OTUsNTMgQEAKIAlyZXR1cm4gcmVhZGwobWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9EQVIobWl0ZV9jaGFuLT5jaGFubmVsKSk7CiB9CiAKLXUzMiBtaXRlX2J5dGVzX2luX3RyYW5zaXQoc3RydWN0IG1pdGVfY2hhbm5lbCAqIG1pdGVfY2hhbikKK3UzMiBtaXRlX2J5dGVzX2luX3RyYW5zaXQoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKQogewogCXN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSA9IG1pdGVfY2hhbi0+bWl0ZTsKIAlyZXR1cm4gcmVhZGwobWl0ZS0+bWl0ZV9pb19hZGRyICsKIAkJICAgICBNSVRFX0ZDUihtaXRlX2NoYW4tPmNoYW5uZWwpKSAmIDB4MDAwMDAwRkY7CiB9CitFWFBPUlRfU1lNQk9MKG1pdGVfYnl0ZXNfaW5fdHJhbnNpdCk7CiAKLS8qICByZXR1cm5zIGxvd2VyIGJvdW5kIGZvciBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQgZnJvbSBkZXZpY2UgdG8gbWVtb3J5ICovCi11MzIgbWl0ZV9ieXRlc193cml0dGVuX3RvX21lbW9yeV9sYihzdHJ1Y3QgbWl0ZV9jaGFubmVsICogbWl0ZV9jaGFuKQorLyogcmV0dXJucyBsb3dlciBib3VuZCBmb3IgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIGZyb20gZGV2aWNlIHRvIG1lbW9yeSAqLwordTMyIG1pdGVfYnl0ZXNfd3JpdHRlbl90b19tZW1vcnlfbGIoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKQogewogCXUzMiBkZXZpY2VfYnl0ZV9jb3VudDsKIAogCWRldmljZV9ieXRlX2NvdW50ID0gbWl0ZV9kZXZpY2VfYnl0ZXNfdHJhbnNmZXJyZWQobWl0ZV9jaGFuKTsKIAlyZXR1cm4gZGV2aWNlX2J5dGVfY291bnQgLSBtaXRlX2J5dGVzX2luX3RyYW5zaXQobWl0ZV9jaGFuKTsKIH0KK0VYUE9SVF9TWU1CT0wobWl0ZV9ieXRlc193cml0dGVuX3RvX21lbW9yeV9sYik7CiAKLS8qICByZXR1cm5zIHVwcGVyIGJvdW5kIGZvciBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQgZnJvbSBkZXZpY2UgdG8gbWVtb3J5ICovCi11MzIgbWl0ZV9ieXRlc193cml0dGVuX3RvX21lbW9yeV91YihzdHJ1Y3QgbWl0ZV9jaGFubmVsICogbWl0ZV9jaGFuKQorLyogcmV0dXJucyB1cHBlciBib3VuZCBmb3IgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIGZyb20gZGV2aWNlIHRvIG1lbW9yeSAqLwordTMyIG1pdGVfYnl0ZXNfd3JpdHRlbl90b19tZW1vcnlfdWIoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKQogewogCXUzMiBpbl90cmFuc2l0X2NvdW50OwogCiAJaW5fdHJhbnNpdF9jb3VudCA9IG1pdGVfYnl0ZXNfaW5fdHJhbnNpdChtaXRlX2NoYW4pOwogCXJldHVybiBtaXRlX2RldmljZV9ieXRlc190cmFuc2ZlcnJlZChtaXRlX2NoYW4pIC0gaW5fdHJhbnNpdF9jb3VudDsKIH0KK0VYUE9SVF9TWU1CT0wobWl0ZV9ieXRlc193cml0dGVuX3RvX21lbW9yeV91Yik7CiAKLS8qICByZXR1cm5zIGxvd2VyIGJvdW5kIGZvciBudW1iZXIgb2YgYnl0ZXMgcmVhZCBmcm9tIG1lbW9yeSBmb3IgdHJhbnNmZXIgdG8gZGV2aWNlICovCi11MzIgbWl0ZV9ieXRlc19yZWFkX2Zyb21fbWVtb3J5X2xiKHN0cnVjdCBtaXRlX2NoYW5uZWwgKiBtaXRlX2NoYW4pCisvKiByZXR1cm5zIGxvd2VyIGJvdW5kIGZvciBudW1iZXIgb2YgYnl0ZXMgcmVhZCBmcm9tIG1lbW9yeSB0byBkZXZpY2UgKi8KK3UzMiBtaXRlX2J5dGVzX3JlYWRfZnJvbV9tZW1vcnlfbGIoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKQogewogCXUzMiBkZXZpY2VfYnl0ZV9jb3VudDsKIAogCWRldmljZV9ieXRlX2NvdW50ID0gbWl0ZV9kZXZpY2VfYnl0ZXNfdHJhbnNmZXJyZWQobWl0ZV9jaGFuKTsKIAlyZXR1cm4gZGV2aWNlX2J5dGVfY291bnQgKyBtaXRlX2J5dGVzX2luX3RyYW5zaXQobWl0ZV9jaGFuKTsKIH0KK0VYUE9SVF9TWU1CT0wobWl0ZV9ieXRlc19yZWFkX2Zyb21fbWVtb3J5X2xiKTsKIAotLyogIHJldHVybnMgdXBwZXIgYm91bmQgZm9yIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gbWVtb3J5IGZvciB0cmFuc2ZlciB0byBkZXZpY2UgKi8KLXUzMiBtaXRlX2J5dGVzX3JlYWRfZnJvbV9tZW1vcnlfdWIoc3RydWN0IG1pdGVfY2hhbm5lbCAqIG1pdGVfY2hhbikKKy8qIHJldHVybnMgdXBwZXIgYm91bmQgZm9yIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gbWVtb3J5IHRvIGRldmljZSAqLwordTMyIG1pdGVfYnl0ZXNfcmVhZF9mcm9tX21lbW9yeV91YihzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pCiB7CiAJdTMyIGluX3RyYW5zaXRfY291bnQ7CiAKIAlpbl90cmFuc2l0X2NvdW50ID0gbWl0ZV9ieXRlc19pbl90cmFuc2l0KG1pdGVfY2hhbik7CiAJcmV0dXJuIG1pdGVfZGV2aWNlX2J5dGVzX3RyYW5zZmVycmVkKG1pdGVfY2hhbikgKyBpbl90cmFuc2l0X2NvdW50OwogfQorRVhQT1JUX1NZTUJPTChtaXRlX2J5dGVzX3JlYWRfZnJvbV9tZW1vcnlfdWIpOwogCiB1bnNpZ25lZCBtaXRlX2RtYV90Y3Ioc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKQogewpAQCAtNTI1LDYgKzU1Niw3IEBACiAKIAlyZXR1cm4gdGNyOwogfQorRVhQT1JUX1NZTUJPTChtaXRlX2RtYV90Y3IpOwogCiB2b2lkIG1pdGVfZG1hX2Rpc2FybShzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pCiB7CkBAIC01MzUsNiArNTY3LDcgQEAKIAljaG9yID0gQ0hPUl9BQk9SVDsKIAl3cml0ZWwoY2hvciwgbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9DSE9SKG1pdGVfY2hhbi0+Y2hhbm5lbCkpOwogfQorRVhQT1JUX1NZTUJPTChtaXRlX2RtYV9kaXNhcm0pOwogCiBpbnQgbWl0ZV9zeW5jX2lucHV0X2RtYShzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4sCiAJCQlzdHJ1Y3QgY29tZWRpX2FzeW5jICphc3luYykKQEAgLTU0NCw3ICs1NzcsNyBAQAogCWNvbnN0IHVuc2lnbmVkIGJ5dGVzX3Blcl9zY2FuID0gY2ZjX2J5dGVzX3Blcl9zY2FuKGFzeW5jLT5zdWJkZXZpY2UpOwogCiAJb2xkX2FsbG9jX2NvdW50ID0gYXN5bmMtPmJ1Zl93cml0ZV9hbGxvY19jb3VudDsKLQkvKiAgd3JpdGUgYWxsb2MgYXMgbXVjaCBhcyB3ZSBjYW4gKi8KKwkvKiB3cml0ZSBhbGxvYyBhcyBtdWNoIGFzIHdlIGNhbiAqLwogCWNvbWVkaV9idWZfd3JpdGVfYWxsb2MoYXN5bmMsIGFzeW5jLT5wcmVhbGxvY19idWZzeik7CiAKIAluYnl0ZXMgPSBtaXRlX2J5dGVzX3dyaXR0ZW5fdG9fbWVtb3J5X2xiKG1pdGVfY2hhbik7CkBAIC01NzEsNiArNjA0LDcgQEAKIAlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSzsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0wobWl0ZV9zeW5jX2lucHV0X2RtYSk7CiAKIGludCBtaXRlX3N5bmNfb3V0cHV0X2RtYShzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4sCiAJCQkgc3RydWN0IGNvbWVkaV9hc3luYyAqYXN5bmMpCkBAIC01OTMsNyArNjI3LDcgQEAKIAkgICAgKGludCkobmJ5dGVzX3ViIC0gc3RvcF9jb3VudCkgPiAwKQogCQluYnl0ZXNfdWIgPSBzdG9wX2NvdW50OwogCWlmICgoaW50KShuYnl0ZXNfdWIgLSBvbGRfYWxsb2NfY291bnQpID4gMCkgewotCQlwcmludGsoIm1pdGU6IERNQSB1bmRlcnJ1blxuIik7CisJCXByaW50ayhLRVJOX0VSUiAibWl0ZTogRE1BIHVuZGVycnVuXG4iKTsKIAkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfT1ZFUkZMT1c7CiAJCXJldHVybiAtMTsKIAl9CkBAIC02MDcsNiArNjQxLDcgQEAKIAl9CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKG1pdGVfc3luY19vdXRwdXRfZG1hKTsKIAogdW5zaWduZWQgbWl0ZV9nZXRfc3RhdHVzKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbikKIHsKQEAgLTYyNSw2ICs2NjAsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pdGUtPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQorRVhQT1JUX1NZTUJPTChtaXRlX2dldF9zdGF0dXMpOwogCiBpbnQgbWl0ZV9kb25lKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbikKIHsKQEAgLTYzOCw2ICs2NzQsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pdGUtPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gZG9uZTsKIH0KK0VYUE9SVF9TWU1CT0wobWl0ZV9kb25lKTsKIAogI2lmZGVmIERFQlVHX01JVEUKIApAQCAtNzE5LDQ2ICs3NTYsNTEgQEAKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSAwOwogCXVuc2lnbmVkIGxvbmcgdGVtcCA9IDA7CiAKLQlwcmludGsoIm1pdGVfZHVtcF9yZWdzIGNoJWlcbiIsIG1pdGVfY2hhbi0+Y2hhbm5lbCk7Ci0JcHJpbnRrKCJtaXRlIGFkZHJlc3MgaXMgID0weCUwOGx4XG4iLCBtaXRlX2lvX2FkZHIpOworCXByaW50ayhLRVJOX0RFQlVHICJtaXRlX2R1bXBfcmVncyBjaCVpXG4iLCBtaXRlX2NoYW4tPmNoYW5uZWwpOworCXByaW50ayhLRVJOX0RFQlVHICJtaXRlIGFkZHJlc3MgaXMgID0weCUwOGx4XG4iLCBtaXRlX2lvX2FkZHIpOwogCiAJYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfQ0hPUihjaGFubmVsKTsKLQlwcmludGsoIm1pdGUgc3RhdHVzW0NIT1JdYXQgMHglMDhseCA9MHglMDhseFxuIiwgYWRkciwgdGVtcCA9Ci0JICAgICAgIHJlYWRsKGFkZHIpKTsKKwlwcmludGsoS0VSTl9ERUJVRyAibWl0ZSBzdGF0dXNbQ0hPUl1hdCAweCUwOGx4ID0weCUwOGx4XG4iLCBhZGRyLAorCSAgICAgICB0ZW1wID0gcmVhZGwoYWRkcikpOwogCW1pdGVfZGVjb2RlKG1pdGVfQ0hPUl9zdHJpbmdzLCB0ZW1wKTsKIAlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9DSENSKGNoYW5uZWwpOwotCXByaW50aygibWl0ZSBzdGF0dXNbQ0hDUl1hdCAweCUwOGx4ID0weCUwOGx4XG4iLCBhZGRyLCB0ZW1wID0KLQkgICAgICAgcmVhZGwoYWRkcikpOworCXByaW50ayhLRVJOX0RFQlVHICJtaXRlIHN0YXR1c1tDSENSXWF0IDB4JTA4bHggPTB4JTA4bHhcbiIsIGFkZHIsCisJICAgICAgIHRlbXAgPSByZWFkbChhZGRyKSk7CiAJbWl0ZV9kZWNvZGUobWl0ZV9DSENSX3N0cmluZ3MsIHRlbXApOwogCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX1RDUihjaGFubmVsKTsKLQlwcmludGsoIm1pdGUgc3RhdHVzW1RDUl0gYXQgMHglMDhseCA9MHglMDh4XG4iLCBhZGRyLCByZWFkbChhZGRyKSk7Ci0JYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfTUNSKGNoYW5uZWwpOwotCXByaW50aygibWl0ZSBzdGF0dXNbTUNSXSBhdCAweCUwOGx4ID0weCUwOGx4XG4iLCBhZGRyLCB0ZW1wID0KKwlwcmludGsoS0VSTl9ERUJVRyAibWl0ZSBzdGF0dXNbVENSXSBhdCAweCUwOGx4ID0weCUwOHhcbiIsIGFkZHIsCiAJICAgICAgIHJlYWRsKGFkZHIpKTsKKwlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9NQ1IoY2hhbm5lbCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIm1pdGUgc3RhdHVzW01DUl0gYXQgMHglMDhseCA9MHglMDhseFxuIiwgYWRkciwKKwkgICAgICAgdGVtcCA9IHJlYWRsKGFkZHIpKTsKIAltaXRlX2RlY29kZShtaXRlX01DUl9zdHJpbmdzLCB0ZW1wKTsKIAogCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX01BUihjaGFubmVsKTsKLQlwcmludGsoIm1pdGUgc3RhdHVzW01BUl0gYXQgMHglMDhseCA9MHglMDh4XG4iLCBhZGRyLCByZWFkbChhZGRyKSk7Ci0JYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfRENSKGNoYW5uZWwpOwotCXByaW50aygibWl0ZSBzdGF0dXNbRENSXSBhdCAweCUwOGx4ID0weCUwOGx4XG4iLCBhZGRyLCB0ZW1wID0KKwlwcmludGsoS0VSTl9ERUJVRyAibWl0ZSBzdGF0dXNbTUFSXSBhdCAweCUwOGx4ID0weCUwOHhcbiIsIGFkZHIsCiAJICAgICAgIHJlYWRsKGFkZHIpKTsKKwlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9EQ1IoY2hhbm5lbCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIm1pdGUgc3RhdHVzW0RDUl0gYXQgMHglMDhseCA9MHglMDhseFxuIiwgYWRkciwKKwkgICAgICAgdGVtcCA9IHJlYWRsKGFkZHIpKTsKIAltaXRlX2RlY29kZShtaXRlX0RDUl9zdHJpbmdzLCB0ZW1wKTsKIAlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9EQVIoY2hhbm5lbCk7Ci0JcHJpbnRrKCJtaXRlIHN0YXR1c1tEQVJdIGF0IDB4JTA4bHggPTB4JTA4eFxuIiwgYWRkciwgcmVhZGwoYWRkcikpOwotCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX0xLQ1IoY2hhbm5lbCk7Ci0JcHJpbnRrKCJtaXRlIHN0YXR1c1tMS0NSXWF0IDB4JTA4bHggPTB4JTA4bHhcbiIsIGFkZHIsIHRlbXAgPQorCXByaW50ayhLRVJOX0RFQlVHICJtaXRlIHN0YXR1c1tEQVJdIGF0IDB4JTA4bHggPTB4JTA4eFxuIiwgYWRkciwKIAkgICAgICAgcmVhZGwoYWRkcikpOworCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX0xLQ1IoY2hhbm5lbCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIm1pdGUgc3RhdHVzW0xLQ1JdYXQgMHglMDhseCA9MHglMDhseFxuIiwgYWRkciwKKwkgICAgICAgdGVtcCA9IHJlYWRsKGFkZHIpKTsKIAltaXRlX2RlY29kZShtaXRlX0xLQ1Jfc3RyaW5ncywgdGVtcCk7CiAJYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfTEtBUihjaGFubmVsKTsKLQlwcmludGsoIm1pdGUgc3RhdHVzW0xLQVJdYXQgMHglMDhseCA9MHglMDh4XG4iLCBhZGRyLCByZWFkbChhZGRyKSk7Ci0KLQlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9DSFNSKGNoYW5uZWwpOwotCXByaW50aygibWl0ZSBzdGF0dXNbQ0hTUl1hdCAweCUwOGx4ID0weCUwOGx4XG4iLCBhZGRyLCB0ZW1wID0KKwlwcmludGsoS0VSTl9ERUJVRyAibWl0ZSBzdGF0dXNbTEtBUl1hdCAweCUwOGx4ID0weCUwOHhcbiIsIGFkZHIsCiAJICAgICAgIHJlYWRsKGFkZHIpKTsKKwlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9DSFNSKGNoYW5uZWwpOworCXByaW50ayhLRVJOX0RFQlVHICJtaXRlIHN0YXR1c1tDSFNSXWF0IDB4JTA4bHggPTB4JTA4bHhcbiIsIGFkZHIsCisJICAgICAgIHRlbXAgPSByZWFkbChhZGRyKSk7CiAJbWl0ZV9kZWNvZGUobWl0ZV9DSFNSX3N0cmluZ3MsIHRlbXApOwogCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX0ZDUihjaGFubmVsKTsKLQlwcmludGsoIm1pdGUgc3RhdHVzW0ZDUl0gYXQgMHglMDhseCA9MHglMDh4XG5cbiIsIGFkZHIsIHJlYWRsKGFkZHIpKTsKKwlwcmludGsoS0VSTl9ERUJVRyAibWl0ZSBzdGF0dXNbRkNSXSBhdCAweCUwOGx4ID0weCUwOHhcblxuIiwgYWRkciwKKwkgICAgICAgcmVhZGwoYWRkcikpOwogfQorRVhQT1JUX1NZTUJPTChtaXRlX2R1bXBfcmVncyk7CiAKIHN0YXRpYyB2b2lkIG1pdGVfZGVjb2RlKGNoYXIgKipiaXRfc3RyLCB1bnNpZ25lZCBpbnQgYml0cykKIHsKQEAgLTc2NiwxMCArODA4LDExIEBACiAKIAlmb3IgKGkgPSAzMTsgaSA+PSAwOyBpLS0pIHsKIAkJaWYgKGJpdHMgJiAoMSA8PCBpKSkKLQkJCXByaW50aygiICVzIiwgYml0X3N0cltpXSk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiICVzIiwgYml0X3N0cltpXSk7CiAJfQotCXByaW50aygiXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiXG4iKTsKIH0KK0VYUE9SVF9TWU1CT0wobWl0ZV9kZWNvZGUpOwogI2VuZGlmCiAKICNpZmRlZiBNT0RVTEUKQEAgLTc4NSwzNiArODI4LDQgQEAKIHsKIAltaXRlX2NsZWFudXAoKTsKIH0KLQotRVhQT1JUX1NZTUJPTChtaXRlX2RtYV90Y3IpOwotRVhQT1JUX1NZTUJPTChtaXRlX2RtYV9hcm0pOwotRVhQT1JUX1NZTUJPTChtaXRlX2RtYV9kaXNhcm0pOwotRVhQT1JUX1NZTUJPTChtaXRlX3N5bmNfaW5wdXRfZG1hKTsKLUVYUE9SVF9TWU1CT0wobWl0ZV9zeW5jX291dHB1dF9kbWEpOwotRVhQT1JUX1NZTUJPTChtaXRlX3NldHVwKTsKLUVYUE9SVF9TWU1CT0wobWl0ZV9zZXR1cDIpOwotRVhQT1JUX1NZTUJPTChtaXRlX3Vuc2V0dXApOwotI2lmIDAKLUVYUE9SVF9TWU1CT0wobWl0ZV9rdm1lbV9zZWdtZW50X2xvYWQpOwotRVhQT1JUX1NZTUJPTChtaXRlX2xsX2Zyb21fa3ZtZW0pOwotRVhQT1JUX1NZTUJPTChtaXRlX3NldHJlZ3MpOwotI2VuZGlmCi1FWFBPUlRfU1lNQk9MKG1pdGVfZGV2aWNlcyk7Ci1FWFBPUlRfU1lNQk9MKG1pdGVfbGlzdF9kZXZpY2VzKTsKLUVYUE9SVF9TWU1CT0wobWl0ZV9yZXF1ZXN0X2NoYW5uZWxfaW5fcmFuZ2UpOwotRVhQT1JUX1NZTUJPTChtaXRlX3JlbGVhc2VfY2hhbm5lbCk7Ci1FWFBPUlRfU1lNQk9MKG1pdGVfcHJlcF9kbWEpOwotRVhQT1JUX1NZTUJPTChtaXRlX2J1Zl9jaGFuZ2UpOwotRVhQT1JUX1NZTUJPTChtaXRlX2J5dGVzX3dyaXR0ZW5fdG9fbWVtb3J5X2xiKTsKLUVYUE9SVF9TWU1CT0wobWl0ZV9ieXRlc193cml0dGVuX3RvX21lbW9yeV91Yik7Ci1FWFBPUlRfU1lNQk9MKG1pdGVfYnl0ZXNfcmVhZF9mcm9tX21lbW9yeV9sYik7Ci1FWFBPUlRfU1lNQk9MKG1pdGVfYnl0ZXNfcmVhZF9mcm9tX21lbW9yeV91Yik7Ci1FWFBPUlRfU1lNQk9MKG1pdGVfYnl0ZXNfaW5fdHJhbnNpdCk7Ci1FWFBPUlRfU1lNQk9MKG1pdGVfZ2V0X3N0YXR1cyk7Ci1FWFBPUlRfU1lNQk9MKG1pdGVfZG9uZSk7Ci0jaWZkZWYgREVCVUdfTUlURQotRVhQT1JUX1NZTUJPTChtaXRlX2RlY29kZSk7Ci1FWFBPUlRfU1lNQk9MKG1pdGVfZHVtcF9yZWdzKTsKLSNlbmRpZgotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5oCmluZGV4IDA1MThmYWQuLjlkNTA0OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuaApAQCAtMTYzLDEzICsxNjMsNiBAQAogdW5zaWduZWQgbWl0ZV9nZXRfc3RhdHVzKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbik7CiBpbnQgbWl0ZV9kb25lKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbik7CiAKLSNpZiAwCi11bnNpZ25lZCBsb25nIG1pdGVfbGxfZnJvbV9rdm1lbShzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUsCi0JCQkJIHN0cnVjdCBjb21lZGlfYXN5bmMgKmFzeW5jLCBpbnQgbGVuKTsKLXZvaWQgbWl0ZV9zZXRyZWdzKHN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSwgdW5zaWduZWQgbG9uZyBsbF9zdGFydCwgaW50IGNoYW4sCi0JCSAgaW50IGRpcik7Ci0jZW5kaWYKLQogdm9pZCBtaXRlX3ByZXBfZG1hKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbiwKIAkJICAgdW5zaWduZWQgaW50IG51bV9kZXZpY2VfYml0cywgdW5zaWduZWQgaW50IG51bV9tZW1vcnlfYml0cyk7CiBpbnQgbWl0ZV9idWZfY2hhbmdlKHN0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yX3JpbmcgKnJpbmcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbXVsdGlxMy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL211bHRpcTMuYwppbmRleCA1ZDZhZjljLi42YjIyZjBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbXVsdGlxMy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tdWx0aXEzLmMKQEAgLTE0NCw5ICsxNDQsOCBAQAogCWludCBpOwogCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykKIAkJZGF0YVtpXSA9IGRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dOwotCX0KIAogCXJldHVybiBpOwogfQpAQCAtMjUzLDIwICsyNTIsMjAgQEAKIAlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqczsKIAogCWlvYmFzZSA9IGl0LT5vcHRpb25zWzBdOwotCXByaW50aygiY29tZWRpJWQ6IG11bHRpcTM6IDB4JTA0bHggIiwgZGV2LT5taW5vciwgaW9iYXNlKTsKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogbXVsdGlxMzogMHglMDRseCAiLCBkZXYtPm1pbm9yLCBpb2Jhc2UpOwogCWlmICghcmVxdWVzdF9yZWdpb24oaW9iYXNlLCBNVUxUSVEzX1NJWkUsICJtdWx0aXEzIikpIHsKLQkJcHJpbnRrKCJjb21lZGklZDogSS9PIHBvcnQgY29uZmxpY3RcbiIsIGRldi0+bWlub3IpOworCQlwcmludGsoS0VSTl9FUlIgImNvbWVkaSVkOiBJL08gcG9ydCBjb25mbGljdFxuIiwgZGV2LT5taW5vcik7CiAJCXJldHVybiAtRUlPOwogCX0KIAogCWRldi0+aW9iYXNlID0gaW9iYXNlOwogCiAJaXJxID0gaXQtPm9wdGlvbnNbMV07Ci0JaWYgKGlycSkgewotCQlwcmludGsoImNvbWVkaSVkOiBpcnEgPSAldSBpZ25vcmVkXG4iLCBkZXYtPm1pbm9yLCBpcnEpOwotCX0gZWxzZSB7Ci0JCXByaW50aygiY29tZWRpJWQ6IG5vIGlycVxuIiwgZGV2LT5taW5vcik7Ci0JfQorCWlmIChpcnEpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNvbWVkaSVkOiBpcnEgPSAldSBpZ25vcmVkXG4iLAorCQkJZGV2LT5taW5vciwgaXJxKTsKKwllbHNlCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNvbWVkaSVkOiBubyBpcnFcbiIsIGRldi0+bWlub3IpOwogCWRldi0+Ym9hcmRfbmFtZSA9ICJtdWx0aXEzIjsKIAlyZXN1bHQgPSBhbGxvY19zdWJkZXZpY2VzKGRldiwgNSk7CiAJaWYgKHJlc3VsdCA8IDApCkBAIC0zMzAsMTQgKzMyOSwxMiBAQAogCiBzdGF0aWMgaW50IG11bHRpcTNfZGV0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7Ci0JcHJpbnRrKCJjb21lZGklZDogbXVsdGlxMzogcmVtb3ZlXG4iLCBkZXYtPm1pbm9yKTsKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogbXVsdGlxMzogcmVtb3ZlXG4iLCBkZXYtPm1pbm9yKTsKIAotCWlmIChkZXYtPmlvYmFzZSkgeworCWlmIChkZXYtPmlvYmFzZSkKIAkJcmVsZWFzZV9yZWdpb24oZGV2LT5pb2Jhc2UsIE1VTFRJUTNfU0laRSk7Ci0JfQotCWlmIChkZXYtPmlycSkgeworCWlmIChkZXYtPmlycSkKIAkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7Ci0JfQogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjUyNy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY1MjcuYwppbmRleCBiMzdlZjM3Li42NTNiNGM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjUyNy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NTI3LmMKQEAgLTI3Myw3ICsyNzMsOCBAQAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCi0JLyogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KKwkvKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQgKi8KKwkvKiAgICAgICAgIGFyZSBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMjsKQEAgLTM3Nyw3ICszNzgsNyBAQAogCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOwogCWludCByZXQ7CiAKLQlwcmludGsoImNvbWVkaSVkOiBuaTY1Mjc6IiwgZGV2LT5taW5vcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IG5pNjUyN1xuIiwgZGV2LT5taW5vcik7CiAKIAlyZXQgPSBhbGxvY19wcml2YXRlKGRldiwgc2l6ZW9mKHN0cnVjdCBuaTY1MjdfcHJpdmF0ZSkpOwogCWlmIChyZXQgPCAwKQpAQCAtMzg5LDE0ICszOTAsMTMgQEAKIAogCXJldCA9IG1pdGVfc2V0dXAoZGV2cHJpdi0+bWl0ZSk7CiAJaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKCJlcnJvciBzZXR0aW5nIHVwIG1pdGVcbiIpOworCQlwcmludGsoS0VSTl9FUlIgImNvbWVkaTogZXJyb3Igc2V0dGluZyB1cCBtaXRlXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlkZXYtPmJvYXJkX25hbWUgPSB0aGlzX2JvYXJkLT5uYW1lOwotCXByaW50aygiICVzIiwgZGV2LT5ib2FyZF9uYW1lKTsKLQotCXByaW50aygiIElEPTB4JTAyeCIsIHJlYWRiKGRldnByaXYtPm1pdGUtPmRhcV9pb19hZGRyICsgSURfUmVnaXN0ZXIpKTsKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGkgYm9hcmQ6ICVzLCBJRD0weCUwMnhcbiIsIGRldi0+Ym9hcmRfbmFtZSwKKwkJcmVhZGIoZGV2cHJpdi0+bWl0ZS0+ZGFxX2lvX2FkZHIgKyBJRF9SZWdpc3RlcikpOwogCiAJcmV0ID0gYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDMpOwogCWlmIChyZXQgPCAwKQpAQCAtNDE1LDcgKzQxNSw3IEBACiAJcy0+dHlwZSA9IENPTUVESV9TVUJEX0RPOwogCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSB8IFNERl9XUklUQUJMRTsKIAlzLT5uX2NoYW4gPSAyNDsKLQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV91bmtub3duOwkvKiBGSVhNRTogYWN0dWFsbHkgY29uZHVjdGFuY2UgKi8KKwlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV91bmtub3duOyAgLyogRklYTUU6IGFjdHVhbGx5IGNvbmR1Y3RhbmNlICovCiAJcy0+bWF4ZGF0YSA9IDE7CiAJcy0+aW5zbl9iaXRzID0gbmk2NTI3X2RvX2luc25fYml0czsKIApAQCAtNDQyLDMwICs0NDIsMjUgQEAKIAogCXJldCA9IHJlcXVlc3RfaXJxKG1pdGVfaXJxKGRldnByaXYtPm1pdGUpLCBuaTY1MjdfaW50ZXJydXB0LAogCQkJICBJUlFGX1NIQVJFRCwgIm5pNjUyNyIsIGRldik7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKCIgaXJxIG5vdCBhdmFpbGFibGUiKTsKLQl9IGVsc2UKKwlpZiAocmV0IDwgMCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY29tZWRpIGk2NTI3IGlycSBub3QgYXZhaWxhYmxlXG4iKTsKKwllbHNlCiAJCWRldi0+aXJxID0gbWl0ZV9pcnEoZGV2cHJpdi0+bWl0ZSk7CiAKLQlwcmludGsoIlxuIik7Ci0KIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBuaTY1MjdfZGV0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7Ci0JaWYgKGRldnByaXYgJiYgZGV2cHJpdi0+bWl0ZSAmJiBkZXZwcml2LT5taXRlLT5kYXFfaW9fYWRkcikgeworCWlmIChkZXZwcml2ICYmIGRldnByaXYtPm1pdGUgJiYgZGV2cHJpdi0+bWl0ZS0+ZGFxX2lvX2FkZHIpCiAJCXdyaXRlYigweDAwLAogCQkgICAgICAgZGV2cHJpdi0+bWl0ZS0+ZGFxX2lvX2FkZHIgKyBNYXN0ZXJfSW50ZXJydXB0X0NvbnRyb2wpOwotCX0KIAotCWlmIChkZXYtPmlycSkgeworCWlmIChkZXYtPmlycSkKIAkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7Ci0JfQogCi0JaWYgKGRldnByaXYgJiYgZGV2cHJpdi0+bWl0ZSkgeworCWlmIChkZXZwcml2ICYmIGRldnByaXYtPm1pdGUpCiAJCW1pdGVfdW5zZXR1cChkZXZwcml2LT5taXRlKTsKLQl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ5MSw3ICs0ODYsNyBAQAogCQkJfQogCQl9CiAJfQotCXByaW50aygibm8gZGV2aWNlIGZvdW5kXG4iKTsKKwlwcmludGsoS0VSTl9FUlIgImNvbWVkaSA2NTI3OiBubyBkZXZpY2UgZm91bmRcbiIpOwogCW1pdGVfbGlzdF9kZXZpY2VzKCk7CiAJcmV0dXJuIC1FSU87CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRfYW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdF9hby5jCmluZGV4IDhhZGIyMzcuLjM3Nzg1NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdF9hby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdF9hby5jCkBAIC0zMiw3ICszMiw4IEBACiAgIFswXSAtIEkvTyBwb3J0IGJhc2UgYWRkcmVzcwogICBbMV0gLSBJUlEgKHVudXNlZCkKICAgWzJdIC0gRE1BICh1bnVzZWQpCi0gIFszXSAtIGFuYWxvZyBvdXRwdXQgcmFuZ2UsIHNldCBieSBqdW1wZXJzIG9uIGhhcmR3YXJlICgwIGZvciAtMTAgdG8gMTBWIGJpcG9sYXIsIDEgZm9yIDBWIHRvIDEwViB1bmlwb2xhcikKKyAgWzNdIC0gYW5hbG9nIG91dHB1dCByYW5nZSwgc2V0IGJ5IGp1bXBlcnMgb24gaGFyZHdhcmUgKDAgZm9yIC0xMCB0byAxMFYKKwliaXBvbGFyLCAxIGZvciAwViB0byAxMFYgdW5pcG9sYXIpCiAKICovCiAvKgpAQCAtNDMxLDkgKzQzMiw4IEBACiAJCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspCiAJCWRhdGFbaV0gPSAwOwkvKiBYWFggKi8KLQl9CiAJcmV0dXJuIGluc24tPm47CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdG1pbzE2ZC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0bWlvMTZkLmMKaW5kZXggOTAxODMzZC4uY2Y0ZjI0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0bWlvMTZkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0bWlvMTZkLmMKQEAgLTIwMCw4ICsyMDAsOCBAQAogCWVudW0geyBkYWNfMmNvbXAsIGRhY19zdHJhaWdodCB9IGRhYzBfY29kaW5nLCBkYWMxX2NvZGluZzsKIAljb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqYW9fcmFuZ2VfdHlwZV9saXN0WzJdOwogCXVuc2lnbmVkIGludCBhb19yZWFkYmFja1syXTsKLQl1bnNpZ25lZCBpbnQgY29tX3JlZ18xX3N0YXRlOwkvKiBjdXJyZW50IHN0YXRlIG9mIGNvbW1hbmQgcmVnaXN0ZXIgMSAqLwotCXVuc2lnbmVkIGludCBjb21fcmVnXzJfc3RhdGU7CS8qIGN1cnJlbnQgc3RhdGUgb2YgY29tbWFuZCByZWdpc3RlciAyICovCisJdW5zaWduZWQgaW50IGNvbV9yZWdfMV9zdGF0ZTsgLyogY3VycmVudCBzdGF0ZSBvZiBjb21tYW5kIHJlZ2lzdGVyIDEgKi8KKwl1bnNpZ25lZCBpbnQgY29tX3JlZ18yX3N0YXRlOyAvKiBjdXJyZW50IHN0YXRlIG9mIGNvbW1hbmQgcmVnaXN0ZXIgMiAqLwogfTsKIAogc3RhdGljIHZvaWQgcmVzZXRfY291bnRlcnMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKQEAgLTI3OSw3ICsyNzksOSBAQAogCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgPSBkOwogCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzICsgMDsKIAotLyogcHJpbnRrKCJhdG1pbzE2ZF9pbnRlcnJ1cHQhXG4iKTsgKi8KKyNpZmRlZiBERUJVRzEKKwlwcmludGsoS0VSTl9ERUJVRyAiYXRtaW8xNmRfaW50ZXJydXB0IVxuIik7CisjZW5kaWYKIAogCWNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCBpbncoZGV2LT5pb2Jhc2UgKyBBRF9GSUZPX1JFRykpOwogCkBAIC0yOTMsNyArMjk1LDcgQEAKIHsKIAlpbnQgZXJyID0gMCwgdG1wOwogI2lmZGVmIERFQlVHMQotCXByaW50aygiYXRtaW8xNmRfYWlfY21kdGVzdFxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgImF0bWlvMTZkX2FpX2NtZHRlc3RcbiIpOwogI2VuZGlmCiAJLyogbWFrZSBzdXJlIHRyaWdnZXJzIGFyZSB2YWxpZCAqLwogCXRtcCA9IGNtZC0+c3RhcnRfc3JjOwpAQCAtMzI0LDggKzMyNiw4IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKLQkvKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwotCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCisJLyogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgJiBtdXR1YWxseSBjb21wYXRpYmxlICovCisJLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmlsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19GT0xMT1cgJiYKIAkgICAgY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0VYVCAmJgogCSAgICBjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfVElNRVIpCkBAIC0zOTcsNyArMzk5LDcgQEAKIAl1bnNpZ25lZCBpbnQgc2FtcGxlX2NvdW50LCB0bXAsIGNoYW4sIGdhaW47CiAJaW50IGk7CiAjaWZkZWYgREVCVUcxCi0JcHJpbnRrKCJhdG1pbzE2ZF9haV9jbWRcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJhdG1pbzE2ZF9haV9jbWRcbiIpOwogI2VuZGlmCiAJLyogVGhpcyBpcyBzbG93bHkgYmVjb21pbmcgYSB3b3JraW5nIGNvbW1hbmQgaW50ZXJmYWNlLiAqCiAJICogSXQgaXMgc3RpbGwgdWJlci1leHBlcmltZW50YWwgKi8KQEAgLTQzNiwxMCArNDM4LDEwIEBACiAJfSBlbHNlIGlmIChjbWQtPmNvbnZlcnRfYXJnIDwgNjU1MzYwMDAwKSB7CiAJCWJhc2VfY2xvY2sgPSBDTE9DS18xMDBfS0haOwogCQl0aW1lciA9IGNtZC0+Y29udmVydF9hcmcgLyAxMDAwMDsKLQl9IGVsc2UgaWYgKGNtZC0+Y29udmVydF9hcmcgPD0gMHhmZmZmZmZmZiAvKiA2NTUzNjAwMDAwICovICkgeworCX0gZWxzZSBpZiAoY21kLT5jb252ZXJ0X2FyZyA8PSAweGZmZmZmZmZmIC8qIDY1NTM2MDAwMDAgKi8pIHsKIAkJYmFzZV9jbG9jayA9IENMT0NLXzEwX0tIWjsKIAkJdGltZXIgPSBjbWQtPmNvbnZlcnRfYXJnIC8gMTAwMDAwOwotCX0gZWxzZSBpZiAoY21kLT5jb252ZXJ0X2FyZyA8PSAweGZmZmZmZmZmIC8qIDY1NTM2MDAwMDAwICovICkgeworCX0gZWxzZSBpZiAoY21kLT5jb252ZXJ0X2FyZyA8PSAweGZmZmZmZmZmIC8qIDY1NTM2MDAwMDAwICovKSB7CiAJCWJhc2VfY2xvY2sgPSBDTE9DS18xX0tIWjsKIAkJdGltZXIgPSBjbWQtPmNvbnZlcnRfYXJnIC8gMTAwMDAwMDsKIAl9CkBAIC01MDQsMTAgKzUwNiwxMCBAQAogCQl9IGVsc2UgaWYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcgPCA2NTUzNjAwMDApIHsKIAkJCWJhc2VfY2xvY2sgPSBDTE9DS18xMDBfS0haOwogCQkJdGltZXIgPSBjbWQtPnNjYW5fYmVnaW5fYXJnIC8gMTAwMDA7Ci0JCX0gZWxzZSBpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyA8IDB4ZmZmZmZmZmYgLyogNjU1MzYwMDAwMCAqLyApIHsKKwkJfSBlbHNlIGlmIChjbWQtPnNjYW5fYmVnaW5fYXJnIDwgMHhmZmZmZmZmZiAvKiA2NTUzNjAwMDAwICovKSB7CiAJCQliYXNlX2Nsb2NrID0gQ0xPQ0tfMTBfS0haOwogCQkJdGltZXIgPSBjbWQtPnNjYW5fYmVnaW5fYXJnIC8gMTAwMDAwOwotCQl9IGVsc2UgaWYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcgPCAweGZmZmZmZmZmIC8qIDY1NTM2MDAwMDAwICovICkgeworCQl9IGVsc2UgaWYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcgPCAweGZmZmZmZmZmIC8qIDY1NTM2MDAwMDAwICovKSB7CiAJCQliYXNlX2Nsb2NrID0gQ0xPQ0tfMV9LSFo7CiAJCQl0aW1lciA9IGNtZC0+c2Nhbl9iZWdpbl9hcmcgLyAxMDAwMDAwOwogCQl9CkBAIC01NTksNyArNTYxLDcgQEAKIAlpbnQgc3RhdHVzOwogCiAjaWZkZWYgREVCVUcxCi0JcHJpbnRrKCJhdG1pbzE2ZF9haV9pbnNuX3JlYWRcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJhdG1pbzE2ZF9haV9pbnNuX3JlYWRcbiIpOwogI2VuZGlmCiAJY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwogCWdhaW4gPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CkBAIC01ODAsMTkgKzU4MiwxOCBAQAogCQkJLyogY2hlY2sgY29udmVyc2lvbiBzdGF0dXMgKi8KIAkJCXN0YXR1cyA9IGludyhkZXYtPmlvYmFzZSArIFNUQVRfUkVHKTsKICNpZmRlZiBERUJVRzEKLQkJCXByaW50aygic3RhdHVzPSV4XG4iLCBzdGF0dXMpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgInN0YXR1cz0leFxuIiwgc3RhdHVzKTsKICNlbmRpZgogCQkJaWYgKHN0YXR1cyAmIFNUQVRfQURfQ09OVkFWQUlMKSB7CiAJCQkJLyogcmVhZCB0aGUgZGF0YSBub3cgKi8KIAkJCQlkYXRhW2ldID0gaW53KGRldi0+aW9iYXNlICsgQURfRklGT19SRUcpOwogCQkJCS8qIGNoYW5nZSB0byB0d28ncyBjb21wbGVtZW50IGlmIG5lZWQgYmUgKi8KLQkJCQlpZiAoZGV2cHJpdi0+YWRjX2NvZGluZyA9PSBhZGNfMmNvbXApIHsKKwkJCQlpZiAoZGV2cHJpdi0+YWRjX2NvZGluZyA9PSBhZGNfMmNvbXApCiAJCQkJCWRhdGFbaV0gXj0gMHg4MDA7Ci0JCQkJfQogCQkJCWJyZWFrOwogCQkJfQogCQkJaWYgKHN0YXR1cyAmIFNUQVRfQURfT1ZFUkZMT1cpIHsKLQkJCQlwcmludGsoImF0bWlvMTZkOiBhL2QgRklGTyBvdmVyZmxvd1xuIik7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYXRtaW8xNmQ6IGEvZCBGSUZPIG92ZXJmbG93XG4iKTsKIAkJCQlvdXR3KDAsIGRldi0+aW9iYXNlICsgQURfQ0xFQVJfUkVHKTsKIAogCQkJCXJldHVybiAtRVRJTUU7CkBAIC02MDAsNyArNjAxLDcgQEAKIAkJfQogCQkvKiBlbmQgd2FpdGluZywgbm93IGNoZWNrIGlmIGl0IHRpbWVkIG91dCAqLwogCQlpZiAodCA9PSBBVE1JTzE2RF9USU1FT1VUKSB7Ci0JCQlwcmludGsoImF0bWlvMTZkOiB0aW1lb3V0XG4iKTsKKwkJCXByaW50ayhLRVJOX0lORk8gImF0bWlvMTZkOiB0aW1lb3V0XG4iKTsKIAogCQkJcmV0dXJuIC1FVElNRTsKIAkJfQpAQCAtNjE1LDEzICs2MTYsMTEgQEAKIHsKIAlpbnQgaTsKICNpZmRlZiBERUJVRzEKLQlwcmludGsoImF0bWlvMTZkX2FvX2luc25fcmVhZFxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgImF0bWlvMTZkX2FvX2luc25fcmVhZFxuIik7CiAjZW5kaWYKIAotCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKQogCQlkYXRhW2ldID0gZGV2cHJpdi0+YW9fcmVhZGJhY2tbQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyldOwotCX0KLQogCXJldHVybiBpOwogfQogCkBAIC02MzMsNyArNjMyLDcgQEAKIAlpbnQgY2hhbjsKIAlpbnQgZDsKICNpZmRlZiBERUJVRzEKLQlwcmludGsoImF0bWlvMTZkX2FvX2luc25fd3JpdGVcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJhdG1pbzE2ZF9hb19pbnNuX3dyaXRlXG4iKTsKICNlbmRpZgogCiAJY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwpAQCAtNjQyLDE1ICs2NDEsMTMgQEAKIAkJZCA9IGRhdGFbaV07CiAJCXN3aXRjaCAoY2hhbikgewogCQljYXNlIDA6Ci0JCQlpZiAoZGV2cHJpdi0+ZGFjMF9jb2RpbmcgPT0gZGFjXzJjb21wKSB7CisJCQlpZiAoZGV2cHJpdi0+ZGFjMF9jb2RpbmcgPT0gZGFjXzJjb21wKQogCQkJCWQgXj0gMHg4MDA7Ci0JCQl9CiAJCQlvdXR3KGQsIGRldi0+aW9iYXNlICsgREFDMF9SRUcpOwogCQkJYnJlYWs7CiAJCWNhc2UgMToKLQkJCWlmIChkZXZwcml2LT5kYWMxX2NvZGluZyA9PSBkYWNfMmNvbXApIHsKKwkJCWlmIChkZXZwcml2LT5kYWMxX2NvZGluZyA9PSBkYWNfMmNvbXApCiAJCQkJZCBePSAweDgwMDsKLQkJCX0KIAkJCW91dHcoZCwgZGV2LT5pb2Jhc2UgKyBEQUMxX1JFRyk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKQEAgLTcwNSwyOSArNzAyLDI5IEBACiAvKgogICAgb3B0aW9uc1swXSAtIEkvTyBwb3J0CiAgICBvcHRpb25zWzFdIC0gTUlPIGlycQotICAgICAgICAgICAgICAgIDAgPT0gbm8gaXJxCi0gICAgICAgICAgICAgICAgTiA9PSBpcnEgTiB7Myw0LDUsNiw3LDksMTAsMTEsMTIsMTQsMTV9CisJCTAgPT0gbm8gaXJxCisJCU4gPT0gaXJxIE4gezMsNCw1LDYsNyw5LDEwLDExLDEyLDE0LDE1fQogICAgb3B0aW9uc1syXSAtIERJTyBpcnEKLSAgICAgICAgICAgICAgICAwID09IG5vIGlycQotICAgICAgICAgICAgICAgIE4gPT0gaXJxIE4gezMsNCw1LDYsNyw5fQorCQkwID09IG5vIGlycQorCQlOID09IGlycSBOIHszLDQsNSw2LDcsOX0KICAgIG9wdGlvbnNbM10gLSBETUExIGNoYW5uZWwKLSAgICAgICAgICAgICAgICAwID09IG5vIERNQQotICAgICAgICAgICAgICAgIE4gPT0gRE1BIE4gezUsNiw3fQorCQkwID09IG5vIERNQQorCQlOID09IERNQSBOIHs1LDYsN30KICAgIG9wdGlvbnNbNF0gLSBETUEyIGNoYW5uZWwKLSAgICAgICAgICAgICAgICAwID09IG5vIERNQQotICAgICAgICAgICAgICAgIE4gPT0gRE1BIE4gezUsNiw3fQorCQkwID09IG5vIERNQQorCQlOID09IERNQSBOIHs1LDYsN30KIAogICAgb3B0aW9uc1s1XSAtIGEvZCBtdXgKLSAgIAkwPWRpZmZlcmVudGlhbCwgMT1zaW5nbGUKKwkwPWRpZmZlcmVudGlhbCwgMT1zaW5nbGUKICAgIG9wdGlvbnNbNl0gLSBhL2QgcmFuZ2UKLSAgIAkwPWJpcG9sYXIxMCwgMT1iaXBvbGFyNSwgMj11bmlwb2xhcjEwCisJMD1iaXBvbGFyMTAsIDE9Ymlwb2xhcjUsIDI9dW5pcG9sYXIxMAogCiAgICBvcHRpb25zWzddIC0gZGFjMCByYW5nZQotICAgCTA9Ymlwb2xhciwgMT11bmlwb2xhcgorCTA9Ymlwb2xhciwgMT11bmlwb2xhcgogICAgb3B0aW9uc1s4XSAtIGRhYzAgcmVmZXJlbmNlCi0gICAgMD1pbnRlcm5hbCwgMT1leHRlcm5hbAorCTA9aW50ZXJuYWwsIDE9ZXh0ZXJuYWwKICAgIG9wdGlvbnNbOV0gLSBkYWMwIGNvZGluZwotICAgCTA9MidzIGNvbXAsIDE9c3RyYWlnaHQgYmluYXJ5CisJMD0yJ3MgY29tcCwgMT1zdHJhaWdodCBiaW5hcnkKIAogICAgb3B0aW9uc1sxMF0gLSBkYWMxIHJhbmdlCiAgICBvcHRpb25zWzExXSAtIGRhYzEgcmVmZXJlbmNlCkBAIC03NDUsNyArNzQyLDcgQEAKIAogCS8qIG1ha2Ugc3VyZSB0aGUgYWRkcmVzcyByYW5nZSBpcyBmcmVlIGFuZCBhbGxvY2F0ZSBpdCAqLwogCWlvYmFzZSA9IGl0LT5vcHRpb25zWzBdOwotCXByaW50aygiY29tZWRpJWQ6IGF0bWlvMTZkOiAweCUwNGx4ICIsIGRldi0+bWlub3IsIGlvYmFzZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IGF0bWlvMTZkOiAweCUwNGx4ICIsIGRldi0+bWlub3IsIGlvYmFzZSk7CiAJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2Jhc2UsIEFUTUlPMTZEX1NJWkUsICJuaV9hdG1pbzE2ZCIpKSB7CiAJCXByaW50aygiSS9PIHBvcnQgY29uZmxpY3RcbiIpOwogCQlyZXR1cm4gLUVJTzsKQEAgLTc3MiwxMyArNzY5LDEzIEBACiAKIAkJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBhdG1pbzE2ZF9pbnRlcnJ1cHQsIDAsICJhdG1pbzE2ZCIsIGRldik7CiAJCWlmIChyZXQgPCAwKSB7Ci0JCQlwcmludGsoImZhaWxlZCB0byBhbGxvY2F0ZSBpcnEgJXVcbiIsIGlycSk7CisJCQlwcmludGsoS0VSTl9JTkZPICJmYWlsZWQgdG8gYWxsb2NhdGUgaXJxICV1XG4iLCBpcnEpOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCQlkZXYtPmlycSA9IGlycTsKLQkJcHJpbnRrKCIoIGlycSA9ICV1IClcbiIsIGlycSk7CisJCXByaW50ayhLRVJOX0lORk8gIiggaXJxID0gJXUgKVxuIiwgaXJxKTsKIAl9IGVsc2UgewotCQlwcmludGsoIiggbm8gaXJxICkiKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiKCBubyBpcnEgKSIpOwogCX0KIAogCS8qIHNldCBkZXZpY2Ugb3B0aW9ucyAqLwpAQCAtODU1LDExICs4NTIsMTAgQEAKIAogCS8qIDgyNTUgc3ViZGV2aWNlICovCiAJcysrOwotCWlmIChib2FyZHR5cGUtPmhhc184MjU1KSB7CisJaWYgKGJvYXJkdHlwZS0+aGFzXzgyNTUpCiAJCXN1YmRldl84MjU1X2luaXQoZGV2LCBzLCBOVUxMLCBkZXYtPmlvYmFzZSk7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7Ci0JfQogCiAvKiBkb24ndCB5ZXQga25vdyBob3cgdG8gZGVhbCB3aXRoIGNvdW50ZXIvdGltZXJzICovCiAjaWYgMApAQCAtODc2LDcgKzg3Miw3IEBACiAKIHN0YXRpYyBpbnQgYXRtaW8xNmRfZGV0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7Ci0JcHJpbnRrKCJjb21lZGklZDogYXRtaW8xNmQ6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IGF0bWlvMTZkOiByZW1vdmVcbiIsIGRldi0+bWlub3IpOwogCiAJaWYgKGRldi0+c3ViZGV2aWNlcyAmJiBib2FyZHR5cGUtPmhhc184MjU1KQogCQlzdWJkZXZfODI1NV9jbGVhbnVwKGRldiwgZGV2LT5zdWJkZXZpY2VzICsgMyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGMuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9sYWJwYy5oCmluZGV4IDgyNTk2MzQuLjQyMmNlZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9sYWJwYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9sYWJwYy5oCkBAIC0zOCwxOSArMzgsMjcgQEAKIAlpbnQgZGV2aWNlX2lkOwkJLyogIGRldmljZSBpZCBmb3IgcGNpIGFuZCBwY21jaWEgYm9hcmRzICovCiAJaW50IGFpX3NwZWVkOwkJLyogIG1heGltdW0gaW5wdXQgc3BlZWQgaW4gbmFub3NlY29uZHMgKi8KIAllbnVtIGxhYnBjX2J1c3R5cGUgYnVzdHlwZTsJLyogIElTQS9QQ0kvZXRjLiAqLwotCWVudW0gbGFicGNfcmVnaXN0ZXJfbGF5b3V0IHJlZ2lzdGVyX2xheW91dDsJLyogIDEyMDAgaGFzIGV4dHJhIHJlZ2lzdGVycyBjb21wYXJlZCB0byBwYysgKi8KKworCS8qICAxMjAwIGhhcyBleHRyYSByZWdpc3RlcnMgY29tcGFyZWQgdG8gcGMrICovCisJZW51bSBsYWJwY19yZWdpc3Rlcl9sYXlvdXQgcmVnaXN0ZXJfbGF5b3V0OwogCWludCBoYXNfYW87CQkvKiAgaGFzIGFuYWxvZyBvdXRwdXQgdHJ1ZS9mYWxzZSAqLwogCWNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlICphaV9yYW5nZV90YWJsZTsKIAljb25zdCBpbnQgKmFpX3JhbmdlX2NvZGU7CiAJY29uc3QgaW50ICphaV9yYW5nZV9pc191bmlwb2xhcjsKLQl1bnNpZ25lZCBhaV9zY2FuX3VwOjE7CS8qICBib2FyZCBjYW4gYXV0byBzY2FuIHVwIGluIGFpIGNoYW5uZWxzLCBub3QganVzdCBkb3duICovCi0JdW5zaWduZWQgbWVtb3J5X21hcHBlZF9pbzoxOwkvKiB1c2VzIG1lbW9yeSBtYXBwZWQgaW8gaW5zdGVhZCBvZiBpb3BvcnRzICovCisKKwkvKiAgYm9hcmQgY2FuIGF1dG8gc2NhbiB1cCBpbiBhaSBjaGFubmVscywgbm90IGp1c3QgZG93biAqLworCXVuc2lnbmVkIGFpX3NjYW5fdXA6MTsKKworCS8qIHVzZXMgbWVtb3J5IG1hcHBlZCBpbyBpbnN0ZWFkIG9mIGlvcG9ydHMgKi8KKwl1bnNpZ25lZCBtZW1vcnlfbWFwcGVkX2lvOjE7CiB9OwogCiBzdHJ1Y3QgbGFicGNfcHJpdmF0ZSB7CiAJc3RydWN0IG1pdGVfc3RydWN0ICptaXRlOwkvKiAgZm9yIG1pdGUgY2hpcCBvbiBwY2ktMTIwMCAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgbG9uZyBjb3VudDsJLyogbnVtYmVyIG9mIGRhdGEgcG9pbnRzIGxlZnQgdG8gYmUgdGFrZW4gKi8KLQl1bnNpZ25lZCBpbnQgYW9fdmFsdWVbTlVNX0FPX0NIQU5dOwkvKiAgc29mdHdhcmUgY29weSBvZiBhbmFsb2cgb3V0cHV0IHZhbHVlcyAqLworCS8qICBudW1iZXIgb2YgZGF0YSBwb2ludHMgbGVmdCB0byBiZSB0YWtlbiAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgbG9uZyBjb3VudDsKKwkvKiAgc29mdHdhcmUgY29weSBvZiBhbmFsb2cgb3V0cHV0IHZhbHVlcyAqLworCXVuc2lnbmVkIGludCBhb192YWx1ZVtOVU1fQU9fQ0hBTl07CiAJLyogIHNvZnR3YXJlIGNvcHlzIG9mIGJpdHMgd3JpdHRlbiB0byBjb21tYW5kIHJlZ2lzdGVycyAqLwogCXZvbGF0aWxlIHVuc2lnbmVkIGludCBjb21tYW5kMV9iaXRzOwogCXZvbGF0aWxlIHVuc2lnbmVkIGludCBjb21tYW5kMl9iaXRzOwpAQCAtNjEsMTYgKzY5LDM0IEBACiAJLyogIHN0b3JlIGxhc3QgcmVhZCBvZiBib2FyZCBzdGF0dXMgcmVnaXN0ZXJzICovCiAJdm9sYXRpbGUgdW5zaWduZWQgaW50IHN0YXR1czFfYml0czsKIAl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc3RhdHVzMl9iaXRzOwotCXVuc2lnbmVkIGludCBkaXZpc29yX2EwOwkvKiB2YWx1ZSB0byBsb2FkIGludG8gYm9hcmQncyBjb3VudGVyIGEwIChjb252ZXJzaW9uIHBhY2luZykgZm9yIHRpbWVkIGNvbnZlcnNpb25zICovCi0JdW5zaWduZWQgaW50IGRpdmlzb3JfYjA7CS8qIHZhbHVlIHRvIGxvYWQgaW50byBib2FyZCdzIGNvdW50ZXIgYjAgKG1hc3RlcikgZm9yIHRpbWVkIGNvbnZlcnNpb25zICovCi0JdW5zaWduZWQgaW50IGRpdmlzb3JfYjE7CS8qIHZhbHVlIHRvIGxvYWQgaW50byBib2FyZCdzIGNvdW50ZXIgYjEgKHNjYW4gcGFjaW5nKSBmb3IgdGltZWQgY29udmVyc2lvbnMgKi8KKwkvKgorCSAqIHZhbHVlIHRvIGxvYWQgaW50byBib2FyZCdzIGNvdW50ZXIgYTAgKGNvbnZlcnNpb24gcGFjaW5nKSBmb3IgdGltZWQKKwkgKiBjb252ZXJzaW9ucworCSAqLworCXVuc2lnbmVkIGludCBkaXZpc29yX2EwOworCS8qCisJICogdmFsdWUgdG8gbG9hZCBpbnRvIGJvYXJkJ3MgY291bnRlciBiMCAobWFzdGVyKSBmb3IgdGltZWQgY29udmVyc2lvbnMKKwkgKi8KKwl1bnNpZ25lZCBpbnQgZGl2aXNvcl9iMDsKKwkvKgorCSAqIHZhbHVlIHRvIGxvYWQgaW50byBib2FyZCdzIGNvdW50ZXIgYjEgKHNjYW4gcGFjaW5nKSBmb3IgdGltZWQKKwkgKiBjb252ZXJzaW9ucworCSAqLworCXVuc2lnbmVkIGludCBkaXZpc29yX2IxOwogCXVuc2lnbmVkIGludCBkbWFfY2hhbjsJLyogIGRtYSBjaGFubmVsIHRvIHVzZSAqLwogCXUxNiAqZG1hX2J1ZmZlcjsJLyogIGJ1ZmZlciBhaSB3aWxsIGRtYSBpbnRvICovCi0JdW5zaWduZWQgaW50IGRtYV90cmFuc2Zlcl9zaXplOwkvKiAgdHJhbnNmZXIgc2l6ZSBpbiBieXRlcyBmb3IgY3VycmVudCB0cmFuc2ZlciAqLwotCWVudW0gdHJhbnNmZXJfdHlwZSBjdXJyZW50X3RyYW5zZmVyOwkvKiAgd2UgYXJlIHVzaW5nIGRtYS9maWZvLWhhbGYtZnVsbC9ldGMuICovCi0JdW5zaWduZWQgaW50IGVlcHJvbV9kYXRhW0VFUFJPTV9TSVpFXTsJLyogIHN0b3JlcyBjb250ZW50cyBvZiBib2FyZCdzIGVlcHJvbSAqLwotCXVuc2lnbmVkIGludCBjYWxkYWNbMTZdOwkvKiAgc3RvcmVzIHNldHRpbmdzIG9mIGNhbGlicmF0aW9uIGRhY3MgKi8KLQkvKiAgZnVuY3Rpb24gcG9pbnRlcnMgc28gd2UgY2FuIHVzZSBpbmIvb3V0YiBvciByZWFkYi93cml0ZWIgYXMgYXBwcm9wcmlhdGUgKi8KKwkvKiB0cmFuc2ZlciBzaXplIGluIGJ5dGVzIGZvciBjdXJyZW50IHRyYW5zZmVyICovCisJdW5zaWduZWQgaW50IGRtYV90cmFuc2Zlcl9zaXplOworCS8qIHdlIGFyZSB1c2luZyBkbWEvZmlmby1oYWxmLWZ1bGwvZXRjLiAqLworCWVudW0gdHJhbnNmZXJfdHlwZSBjdXJyZW50X3RyYW5zZmVyOworCS8qIHN0b3JlcyBjb250ZW50cyBvZiBib2FyZCdzIGVlcHJvbSAqLworCXVuc2lnbmVkIGludCBlZXByb21fZGF0YVtFRVBST01fU0laRV07CisJLyogc3RvcmVzIHNldHRpbmdzIG9mIGNhbGlicmF0aW9uIGRhY3MgKi8KKwl1bnNpZ25lZCBpbnQgY2FsZGFjWzE2XTsKKwkvKgorCSAqIGZ1bmN0aW9uIHBvaW50ZXJzIHNvIHdlIGNhbiB1c2UgaW5iL291dGIgb3IgcmVhZGIvd3JpdGViIGFzCisJICogYXBwcm9wcmlhdGUKKwkgKi8KIAl1bnNpZ25lZCBpbnQgKCpyZWFkX2J5dGUpICh1bnNpZ25lZCBsb25nIGFkZHJlc3MpOwogCXZvaWQgKCp3cml0ZV9ieXRlKSAodW5zaWduZWQgaW50IGJ5dGUsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyk7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjX2NzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGNfY3MuYwppbmRleCA3ZDUxNGIzLi4wYjk2M2JiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGNfY3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGNfY3MuYwpAQCAtNTksOCArNTksNyBAQAogCiAqLwogCi0jdW5kZWYgTEFCUENfREVCVUcKLQkJCSAgICAvKiAjZGVmaW5lIExBQlBDX0RFQlVHICovLyogIGVuYWJsZSBkZWJ1Z2dpbmcgbWVzc2FnZXMgKi8KKyN1bmRlZiBMQUJQQ19ERUJVRyAgLyogZGVidWdnaW5nIG1lc3NhZ2VzICovCiAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIApAQCAtNzcsMTQgKzc2LDE1IEBACiAjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgogI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgogCi1zdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBjbWNpYV9jdXJfZGV2ID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcGNtY2lhX2N1cl9kZXY7CiAKIHN0YXRpYyBpbnQgbGFicGNfYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfZGV2Y29uZmlnICppdCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbGFicGNfYm9hcmRfc3RydWN0IGxhYnBjX2NzX2JvYXJkc1tdID0gewogCXsKIAkgLm5hbWUgPSAiZGFxY2FyZC0xMjAwIiwKLQkgLmRldmljZV9pZCA9IDB4MTAzLAkvKiAgMHgxMGIgaXMgbWFudWZhY3R1cmVyIGlkLCAweDEwMyBpcyBkZXZpY2UgaWQgKi8KKwkgLmRldmljZV9pZCA9IDB4MTAzLAkvKiAweDEwYiBpcyBtYW51ZmFjdHVyZXIgaWQsCisJCQkJICAgMHgxMDMgaXMgZGV2aWNlIGlkICovCiAJIC5haV9zcGVlZCA9IDEwMDAwLAogCSAuYnVzdHlwZSA9IHBjbWNpYV9idXN0eXBlLAogCSAucmVnaXN0ZXJfbGF5b3V0ID0gbGFicGNfMTIwMF9sYXlvdXQsCkBAIC0yNzMsOSArMjczLDggQEAKIAkJbGFicGNfcmVsZWFzZShsaW5rKTsKIAl9CiAKLQkvKiBUaGlzIHBvaW50cyB0byB0aGUgcGFyZW50IGxvY2FsX2luZm9fdCBzdHJ1Y3QgKi8KLQlpZiAobGluay0+cHJpdikKLQkJa2ZyZWUobGluay0+cHJpdik7CisJLyogVGhpcyBwb2ludHMgdG8gdGhlIHBhcmVudCBsb2NhbF9pbmZvX3Qgc3RydWN0IChtYXkgYmUgbnVsbCkgKi8KKwlrZnJlZShsaW5rLT5wcml2KTsKIAogfQkJCQkvKiBsYWJwY19jc19kZXRhY2ggKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX21pb19jb21tb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9taW9fY29tbW9uLmMKaW5kZXggNzUzZWUwNS4uZDZkNDljMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX21pb19jb21tb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbWlvX2NvbW1vbi5jCkBAIC0yMjA3LDcgKzIyMDcsNyBAQAogCiAJLyogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIAotCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCisJLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmlsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCiAJaWYgKGNtZC0+c3RhcnRfc3JjICE9IFRSSUdfTk9XICYmCiAJICAgIGNtZC0+c3RhcnRfc3JjICE9IFRSSUdfSU5UICYmIGNtZC0+c3RhcnRfc3JjICE9IFRSSUdfRVhUKQogCQllcnIrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9taW9fY3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9taW9fY3MuYwppbmRleCBkNjkyZjRiLi5kYzQ4NDlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbWlvX2NzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX21pb19jcy5jCkBAIC0yNTAsOSArMjUwLDggQEAKIAogCS8qIFBDTUNJQSBsYXllciBmcmVlcyB0aGUgSU8gcmVnaW9uICovCiAKLQlpZiAoZGV2LT5pcnEpIHsKKwlpZiAoZGV2LT5pcnEpCiAJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwotCX0KIAogCXJldHVybiAwOwogfQpAQCAtMjkzLDkgKzI5Miw4IEBACiB7CiAJRFBSSU5USygiY3NfZGV0YWNoKGxpbms9JXApXG4iLCBsaW5rKTsKIAotCWlmIChsaW5rLT5kZXZfbm9kZSkgeworCWlmIChsaW5rLT5kZXZfbm9kZSkKIAkJY3NfcmVsZWFzZShsaW5rKTsKLQl9CiB9CiAKIHN0YXRpYyBpbnQgbWlvX2NzX3N1c3BlbmQoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCkBAIC0zODcsOSArMzg1LDggQEAKIAkJfQogCQlwcmludGsoIlxuIik7CiAJCXByaW50aygiIGJvYXJkIGZpbmdlcnByaW50ICh3aW5kb3dlZCk6Iik7Ci0JCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQogCQkJcHJpbnRrKCIgMHglMDR4Iiwgd2luX2luKGkpKTsKLQkJfQogCQlwcmludGsoIlxuIik7CiAJfQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpZGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpZGlvLmMKaW5kZXggZDU0NDY5OC4uMmQ4OGE1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaWRpby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9wY2lkaW8uYwpAQCAtNzk1LDcgKzc5NSw3IEBACiAKIAkvKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCi0JLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KKwkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGliaWxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KIAlpZiAoY21kLT5zdGFydF9zcmMgIT0gVFJJR19OT1cgJiYgY21kLT5zdGFydF9zcmMgIT0gVFJJR19JTlQpCiAJCWVycisrOwogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfVElNRVIgJiYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w3MTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w3MTEuYwppbmRleCBkZDlkYjA2Li40OTE0Nzg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsNzExLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDcxMS5jCkBAIC00MDcsNiArNDA3LDcgQEAKIAkJICogIDB4YjQgPSBTZWxlY3QgQ291bnRlciAyIHwgTFNCL01TQiB8IE1vZGU9MiB8IEJpbmFyeQogCQkgKi8KIAorCQl0aW1lcjEgPSB0aW1lcjIgPSAwOwogCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKGk4MjUzX29zY19iYXNlLCAmdGltZXIxLCAmdGltZXIyLAogCQkJCQkgICZjbWQtPnNjYW5fYmVnaW5fYXJnLAogCQkJCQkgIFRSSUdfUk9VTkRfTkVBUkVTVCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsNzI2LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsNzI2LmMKaW5kZXggY2NhZGQwOS4uNmExYTk3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDcyNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w3MjYuYwpAQCAtMzksMjcgKzM5LDI3IEBACiAgICAgT3B0aW9ucyBmb3IgUENMLTcyNjoKICAgICAgWzBdIC0gSU8gQmFzZQogICAgICBbMl0uLi5bN10gLSBEL0Egb3V0cHV0IHJhbmdlIGZvciBjaGFubmVsIDEtNjoKLSAgICAgICAgICAgICAgIDA6IDAtNVYsIDE6IDAtMTBWLCAyOiArLy01ViwgMzogKy8tMTBWLAotCSAgICAgICA0OiA0LTIwbUEsIDU6IHVua25vd24gKGV4dGVybmFsIHJlZmVyZW5jZSkKKwkJMDogMC01ViwgMTogMC0xMFYsIDI6ICsvLTVWLCAzOiArLy0xMFYsCisJCTQ6IDQtMjBtQSwgNTogdW5rbm93biAoZXh0ZXJuYWwgcmVmZXJlbmNlKQogCiAgICAgT3B0aW9ucyBmb3IgUENMLTcyNzoKICAgICAgWzBdIC0gSU8gQmFzZQogICAgICBbMl0uLi5bMTNdIC0gRC9BIG91dHB1dCByYW5nZSBmb3IgY2hhbm5lbCAxLTEyOgotICAgICAgICAgICAgICAgMDogMC01ViwgMTogMC0xMFYsIDI6ICsvLTVWLAotCSAgICAgICAzOiA0LTIwbUEKKwkJMDogMC01ViwgMTogMC0xMFYsIDI6ICsvLTVWLAorCQkzOiA0LTIwbUEKIAogICAgIE9wdGlvbnMgZm9yIFBDTC03MjggYW5kIEFDTC02MTI4OgogICAgICBbMF0gLSBJTyBCYXNlCiAgICAgIFsyXSwgWzNdIC0gRC9BIG91dHB1dCByYW5nZSBmb3IgY2hhbm5lbCAxIGFuZCAyOgotICAgICAgICAgICAgICAgMDogMC01ViwgMTogMC0xMFYsIDI6ICsvLTVWLCAzOiArLy0xMFYsCi0JICAgICAgIDQ6IDQtMjBtQSwgNTogMC0yMG1BCisJCTA6IDAtNVYsIDE6IDAtMTBWLCAyOiArLy01ViwgMzogKy8tMTBWLAorCQk0OiA0LTIwbUEsIDU6IDAtMjBtQQogCiAgICAgT3B0aW9ucyBmb3IgQUNMLTYxMjY6CiAgICAgIFswXSAtIElPIEJhc2UKICAgICAgWzFdIC0gSVJRICgwPWRpc2FibGUsIDMsIDUsIDYsIDcsIDksIDEwLCAxMSwgMTIsIDE1KSAoY3VycmVudGx5IGlnbm9yZWQpCiAgICAgIFsyXS4uLls3XSAtIEQvQSBvdXRwdXQgcmFuZ2UgZm9yIGNoYW5uZWwgMS02OgotICAgICAgICAgICAgICAgMDogMC01ViwgMTogMC0xMFYsIDI6ICsvLTVWLCAzOiArLy0xMFYsCi0JICAgICAgIDQ6IDQtMjBtQQorCQkwOiAwLTVWLCAxOiAwLTEwViwgMjogKy8tNVYsIDM6ICsvLTEwViwKKwkJNDogNC0yMG1BCiAqLwogCiAvKgpAQCAtMTI3LDcgKzEyNyw4IEBACiAJaW50IGRpX2xvOwogCWludCBkb19oaTsKIAlpbnQgZG9fbG87Ci0JY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgKmNvbnN0ICpyYW5nZV90eXBlX2xpc3Q7CS8qICBsaXN0IG9mIHN1cHBvcnRlZCByYW5nZXMgKi8KKwljb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqY29uc3QgKnJhbmdlX3R5cGVfbGlzdDsKKwkvKiAgbGlzdCBvZiBzdXBwb3J0ZWQgcmFuZ2VzICovCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjbDcyNl9ib2FyZCBib2FyZHR5cGVzW10gPSB7CkBAIC0yMDQsOSArMjA1LDggQEAKIAlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwogCWludCBuOwogCi0JZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgeworCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspCiAJCWRhdGFbbl0gPSBkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXTsKLQl9CiAJcmV0dXJuIG47CiB9CiAKQEAgLTI1NiwxMCArMjU2LDEwIEBACiAKIAlpb2Jhc2UgPSBpdC0+b3B0aW9uc1swXTsKIAlpb3JhbmdlID0gdGhpc19ib2FyZC0+aW9fcmFuZ2U7Ci0JcHJpbnRrKCJjb21lZGklZDogcGNsNzI2OiBib2FyZD0lcywgMHglMDNseCAiLCBkZXYtPm1pbm9yLAorCXByaW50ayhLRVJOX1dBUk5JTkcgImNvbWVkaSVkOiBwY2w3MjY6IGJvYXJkPSVzLCAweCUwM2x4ICIsIGRldi0+bWlub3IsCiAJICAgICAgIHRoaXNfYm9hcmQtPm5hbWUsIGlvYmFzZSk7CiAJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2Jhc2UsIGlvcmFuZ2UsICJwY2w3MjYiKSkgewotCQlwcmludGsoIkkvTyBwb3J0IGNvbmZsaWN0XG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSS9PIHBvcnQgY29uZmxpY3RcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTI4MywxNiArMjgzLDE2IEBACiAJCWRldnByaXYtPmZpcnN0X2NoYW4gPSAyOwogCQlpZiAoaXJxKSB7CS8qIHdlIHdhbnQgdG8gdXNlIElSUSAqLwogCQkJaWYgKCgoMSA8PCBpcnEpICYgYm9hcmR0eXBlc1tib2FyZF0uSVJRYml0cykgPT0gMCkgewotCQkJCXByaW50awotCQkJCSAgICAoIiwgSVJRICVkIGlzIG91dCBvZiBhbGxvd2VkIHJhbmdlLCBESVNBQkxJTkcgSVQiLAotCQkJCSAgICAgaXJxKTsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCSIsIElSUSAlZCBpcyBvdXQgb2YgYWxsb3dlZCByYW5nZSwiCisJCQkJCSIgRElTQUJMSU5HIElUIiwgaXJxKTsKIAkJCQlpcnEgPSAwOwkvKiBCYWQgSVJRICovCiAJCQl9IGVsc2UgewogCQkJCWlmIChyZXF1ZXN0X2lycShpcnEsIGludGVycnVwdF9wY2w4MTgsIDAsCiAJCQkJCQkicGNsNzI2IiwgZGV2KSkgewotCQkJCQlwcmludGsKLQkJCQkJICAgICgiLCB1bmFibGUgdG8gYWxsb2NhdGUgSVJRICVkLCBESVNBQkxJTkcgSVQiLAotCQkJCQkgICAgIGlycSk7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJCSIsIHVuYWJsZSB0byBhbGxvY2F0ZSBJUlEgJWQsIgorCQkJCQkJIiBESVNBQkxJTkcgSVQiLCBpcnEpOwogCQkJCQlpcnEgPSAwOwkvKiBDYW4ndCB1c2UgSVJRICovCiAJCQkJfSBlbHNlIHsKIAkJCQkJcHJpbnRrKCIsIGlycT0lZCIsIGlycSk7CkBAIC0zNzIsOSArMzcyLDggQEAKIC8qIHByaW50aygiY29tZWRpJWQ6IHBjbDcyNjogcmVtb3ZlXG4iLGRldi0+bWlub3IpOyAqLwogCiAjaWZkZWYgQUNMNjEyNl9JUlEKLQlpZiAoZGV2LT5pcnEpIHsKKwlpZiAoZGV2LT5pcnEpCiAJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwotCX0KICNlbmRpZgogCiAJaWYgKGRldi0+aW9iYXNlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxMi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxMi5jCmluZGV4IDBiNTFhNDguLjBhNWJjM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODEyLmMKQEAgLTUxLDcgKzUxLDcgQEAKICAgICAgICAgNT1BL0QgaW5wdXQgcmFuZ2UgaXMgKy8tMC4zMTI1VgogICBbNV0gLSAwPUQvQSBvdXRwdXRzIDAtNVYgIChpbnRlcm5hbCByZWZlcmVuY2UgLTVWKQogICAgICAgICAxPUQvQSBvdXRwdXRzIDAtMTBWIChpbnRlcm5hbCByZWZlcmVuY2UgLTEwVikKLSAgICAgICAgMj1EL0Egb3V0cHV0cyB1bmtub3cgKGV4dGVybmFsIHJlZmVyZW5jZSkKKyAgICAgICAgMj1EL0Egb3V0cHV0cyB1bmtub3duIChleHRlcm5hbCByZWZlcmVuY2UpCiAKIE9wdGlvbnMgZm9yIFBDTC04MTJQRywgQUNMLTgxMTJQRzoKICAgWzBdIC0gSU8gQmFzZQpAQCAtNjMsNyArNjMsNyBAQAogICAgICAgICAxPUEvRCBoYXZlIG1heCArLy0xMFYgaW5wdXQKICAgWzVdIC0gMD1EL0Egb3V0cHV0cyAwLTVWICAoaW50ZXJuYWwgcmVmZXJlbmNlIC01VikKICAgICAgICAgMT1EL0Egb3V0cHV0cyAwLTEwViAoaW50ZXJuYWwgcmVmZXJlbmNlIC0xMFYpCi0gICAgICAgIDI9RC9BIG91dHB1dHMgdW5rbm93IChleHRlcm5hbCByZWZlcmVuY2UpCisgICAgICAgIDI9RC9BIG91dHB1dHMgdW5rbm93biAoZXh0ZXJuYWwgcmVmZXJlbmNlKQogCiBPcHRpb25zIGZvciBBQ0wtODExMkRHL0hHLCBBLTgyMlBHTC9QR0gsIEEtODIzUEdML1BHSCwgQUNMLTgyMTYsIEEtODI2UEc6CiAgIFswXSAtIElPIEJhc2UKQEAgLTc1LDcgKzc1LDcgQEAKICAgICAgICAgMT1BL0QgY2hhbm5lbHMgYXJlIERJRkYKICAgWzVdIC0gMD1EL0Egb3V0cHV0cyAwLTVWICAoaW50ZXJuYWwgcmVmZXJlbmNlIC01VikKICAgICAgICAgMT1EL0Egb3V0cHV0cyAwLTEwViAoaW50ZXJuYWwgcmVmZXJlbmNlIC0xMFYpCi0gICAgICAgIDI9RC9BIG91dHB1dHMgdW5rbm93IChleHRlcm5hbCByZWZlcmVuY2UpCisgICAgICAgIDI9RC9BIG91dHB1dHMgdW5rbm93biAoZXh0ZXJuYWwgcmVmZXJlbmNlKQogCiBPcHRpb25zIGZvciBBLTgyMVBHTC9QR0g6CiAgIFswXSAtIElPIEJhc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTYuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTYuYwppbmRleCBmYTI0MTQ1Li44NTJmZTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODE2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxNi5jCkBAIC0xMTIsNyArMTEyLDcgQEAKIAlpbnQgbl9kaWNoYW47CQkvKiAgbnVtIG9mIERJIGNoYW5zICovCiAJaW50IG5fZG9jaGFuOwkJLyogIG51bSBvZiBETyBjaGFucyAqLwogCWNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlICphaV9yYW5nZV90eXBlOwkvKiAgZGVmYXVsdCBBL0QgcmFuZ2VsaXN0ICovCi0JY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgKmFvX3JhbmdlX3R5cGU7CS8qICBkYWZhdWx0IEQvQSByYW5nZWxpc3QgKi8KKwljb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqYW9fcmFuZ2VfdHlwZTsJLyogIGRlZmF1bHQgRC9BIHJhbmdlbGlzdCAqLwogCXVuc2lnbmVkIGludCBpb19yYW5nZTsJLyogIGxlbiBvZiBJTyBzcGFjZSAqLwogCXVuc2lnbmVkIGludCBJUlFiaXRzOwkvKiAgYWxsb3dlZCBpbnRlcnJ1cHRzICovCiAJdW5zaWduZWQgaW50IERNQWJpdHM7CS8qICBhbGxvd2VkIERNQSBjaGFucyAqLwpAQCAtNDQ1LDcgKzQ0NSw3IEBACiAJCWNvbWVkaV9lcnJvcihkZXYsICJiYWQgSVJRISIpOwogCQlyZXR1cm4gSVJRX05PTkU7CiAJfQotCWNvbWVkaV9lcnJvcihkZXYsICJJUlEgZnJvbSB1bmtub3cgc291cmNlISIpOworCWNvbWVkaV9lcnJvcihkZXYsICJJUlEgZnJvbSB1bmtub3duIHNvdXJjZSEiKTsKIAlyZXR1cm4gSVJRX05PTkU7CiB9CiAKQEAgLTQ3Miw3ICs0NzIsNyBAQAogCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKIHsKIAlpbnQgZXJyID0gMDsKLQlpbnQgdG1wLCBkaXZpc29yMSwgZGl2aXNvcjI7CisJaW50IHRtcCwgZGl2aXNvcjEgPSAwLCBkaXZpc29yMiA9IDA7CiAKIAlERUJVRyhwcmludGsoInBjbDgxNiBwY2w4MTJfYWlfY21kdGVzdFxuIik7IHBjbDgxNl9jbWR0ZXN0X291dCgtMSwgY21kKTsKIAkgICAgKTsKQEAgLTQ4OCw3ICs0ODgsOSBAQAogCWlmICghY21kLT5zY2FuX2JlZ2luX3NyYyB8fCB0bXAgIT0gY21kLT5zY2FuX2JlZ2luX3NyYykKIAkJZXJyKys7CiAKLQlpZiAoIShjbWQtPmNvbnZlcnRfc3JjICYgKFRSSUdfRVhUIHwgVFJJR19USU1FUikpKQorCXRtcCA9IGNtZC0+Y29udmVydF9zcmM7CisJY21kLT5jb252ZXJ0X3NyYyAmPSBUUklHX0VYVCB8IFRSSUdfVElNRVI7CisJaWYgKCFjbWQtPmNvbnZlcnRfc3JjIHx8IHRtcCAhPSBjbWQtPmNvbnZlcnRfc3JjKQogCQllcnIrKzsKIAogCXRtcCA9IGNtZC0+c2Nhbl9lbmRfc3JjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxOC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxOC5jCmluZGV4IGU5NTIyOWIuLmQwNDgxMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODE4LmMKQEAgLTUwLDcgKzUwLDcgQEAKICAgICAgICAgICAxLCAxMD1BL0QgaW5wdXQgLTEwVi4uKzEwVgogICAgIFs1XSAtIDAsICA1PUQvQSBvdXRwdXQgMC01ViAgKGludGVybmFsIHJlZmVyZW5jZSAtNVYpCiAgICAgICAgICAgMSwgMTA9RC9BIG91dHB1dCAwLTEwViAoaW50ZXJuYWwgcmVmZXJlbmNlIC0xMFYpCi0JICAyICAgID1EL0Egb3V0cHV0IHVua25vdyAoZXh0ZXJuYWwgcmVmZXJlbmNlKQorCSAgMiAgICA9RC9BIG91dHB1dCB1bmtub3duIChleHRlcm5hbCByZWZlcmVuY2UpCiAKICAgIE9wdGlvbnMgZm9yIFBDTC04MTgsIFBDTC04MThIOgogICAgIFswXSAtIElPIEJhc2UKQEAgLTYwLDcgKzYwLDcgQEAKICAgICAgICAgICAgICAgMT0gMU1IeiBjbG9jayBmb3IgODI1NAogICAgIFs0XSAtIDAsICA1PUQvQSBvdXRwdXQgMC01ViAgKGludGVybmFsIHJlZmVyZW5jZSAtNVYpCiAgICAgICAgICAgMSwgMTA9RC9BIG91dHB1dCAwLTEwViAoaW50ZXJuYWwgcmVmZXJlbmNlIC0xMFYpCi0JICAyICAgID1EL0Egb3V0cHV0IHVua25vdyAoZXh0ZXJuYWwgcmVmZXJlbmNlKQorCSAgMiAgICA9RC9BIG91dHB1dCB1bmtub3duIChleHRlcm5hbCByZWZlcmVuY2UpCiAKICAgIE9wdGlvbnMgZm9yIFBDTC04MThIRCwgUENMLTgxOEhHOgogICAgIFswXSAtIElPIEJhc2UKQEAgLTcxLDcgKzcxLDcgQEAKICAgICAgICAgICAgICAgMT0gMU1IeiBjbG9jayBmb3IgODI1NAogICAgIFs0XSAtIDAsICA1PUQvQSBvdXRwdXQgMC01ViAgKGludGVybmFsIHJlZmVyZW5jZSAtNVYpCiAgICAgICAgICAgMSwgMTA9RC9BIG91dHB1dCAwLTEwViAoaW50ZXJuYWwgcmVmZXJlbmNlIC0xMFYpCi0gICAJICAyICAgID1EL0Egb3V0cHV0IHVua25vdyAoZXh0ZXJuYWwgcmVmZXJlbmNlKQorICAgCSAgMiAgICA9RC9BIG91dHB1dCB1bmtub3duIChleHRlcm5hbCByZWZlcmVuY2UpCiAKICAgIE9wdGlvbnMgZm9yIFBDTC03MTg6CiAgICAgWzBdIC0gSU8gQmFzZQpAQCAtOTIsNyArOTIsNyBAQAogCSAgICAgMTA9CSAgICAgdXNlciBkZWZpbmVkIHVuaXBvbGFyCiAgICAgWzVdIC0gMCwgIDU9RC9BIG91dHB1dHMgMC01ViAgKGludGVybmFsIHJlZmVyZW5jZSAtNVYpCiAgICAgICAgICAgMSwgMTA9RC9BIG91dHB1dHMgMC0xMFYgKGludGVybmFsIHJlZmVyZW5jZSAtMTBWKQotCSAgICAgIDI9RC9BIG91dHB1dHMgdW5rbm93IChleHRlcm5hbCByZWZlcmVuY2UpCisJICAgICAgMj1EL0Egb3V0cHV0cyB1bmtub3duIChleHRlcm5hbCByZWZlcmVuY2UpCiAgICAgWzZdIC0gMCwgNjA9bWF4ICA2MGtIeiBBL0Qgc2FtcGxpbmcKICAgICAgICAgICAxLDEwMD1tYXggMTAwa0h6IEEvRCBzYW1wbGluZyAoUENMLTcxOCB3aXRoIE9wdGlvbiAwMDEgaW5zdGFsbGVkKQogCkBAIC04NzYsNyArODc2LDcgQEAKIAkJcmV0dXJuIElSUV9OT05FOwogCX0KIAotCWNvbWVkaV9lcnJvcihkZXYsICJJUlEgZnJvbSB1bmtub3cgc291cmNlISIpOworCWNvbWVkaV9lcnJvcihkZXYsICJJUlEgZnJvbSB1bmtub3duIHNvdXJjZSEiKTsKIAlyZXR1cm4gSVJRX05PTkU7CiB9CiAKQEAgLTk3MCw3ICs5NzAsNyBAQAogCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7CiAJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOwotCWludCBkaXZpc29yMSwgZGl2aXNvcjI7CisJaW50IGRpdmlzb3IxID0gMCwgZGl2aXNvcjIgPSAwOwogCXVuc2lnbmVkIGludCBzZWdsZW47CiAKIAlwcmludGsoInBjbDgxOF9haV9jbWRfbW9kZSgpXG4iKTsKQEAgLTEwODksNyArMTA4OSw3IEBACiBzdGF0aWMgaW50IHBjbDgxOF9hb19tb2RlMTMoaW50IG1vZGUsIHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsIGNvbWVkaV90cmlnICogaXQpCiB7Ci0JaW50IGRpdmlzb3IxLCBkaXZpc29yMjsKKwlpbnQgZGl2aXNvcjEgPSAwLCBkaXZpc29yMiA9IDA7CiAKIAlpZiAoIWRldi0+aXJxKSB7CiAJCWNvbWVkaV9lcnJvcihkZXYsICJJUlEgbm90IGRlZmluZWQhIik7CkBAIC0xMjg3LDcgKzEyODcsNyBAQAogCQkgICAgICBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQogewogCWludCBlcnIgPSAwOwotCWludCB0bXAsIGRpdmlzb3IxLCBkaXZpc29yMjsKKwlpbnQgdG1wLCBkaXZpc29yMSA9IDAsIGRpdmlzb3IyID0gMDsKIAogCS8qIHN0ZXAgMTogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY21fY29tbW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtX2NvbW1vbi5jCmluZGV4IGViZDk4MzguLjUyYzJhNjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY21fY29tbW9uLmMKQEAgLTQxLDcgKzQxLDggQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAotCS8qIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCisJLyogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kCisJICogbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCiAJLyogdGhlc2UgdGVzdHMgYXJlIHRydWUgaWYgbW9yZSB0aGFuIG9uZSBfc3JjIGJpdCBpcyBzZXQgKi8KIAlpZiAoKGNtZC0+c3RhcnRfc3JjICYgKGNtZC0+c3RhcnRfc3JjIC0gMSkpICE9IDApCkBAIC0xMDcsNSArMTA4LDQgQEAKIAogCXJldHVybiAwOwogfQotCiBFWFBPUlRfU1lNQk9MKGNvbWVkaV9wY21fY21kdGVzdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtbWlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtbWlvLmMKaW5kZXggZDgxMmMyYy4uMzViYTkzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbW1pby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY21taW8uYwpAQCAtMzIsOCArMzIsMTAgQEAKIGZvdXIgc3ViZGV2aWNlczoKICAgc3ViZGV2aWNlIDAgLSAxNiBjaGFubmVscyBvZiAxNi1iaXQgQUkKICAgc3ViZGV2aWNlIDEgLSA4IGNoYW5uZWxzIG9mIDE2LWJpdCBBTwotICBzdWJkZXZpY2UgMiAtIGZpcnN0IDI0IGNoYW5uZWxzIG9mIHRoZSA0OCBjaGFubmVsIG9mIERJTyAod2l0aCBlZGdlLXRyaWdnZXJlZCBpbnRlcnJ1cHQgc3VwcG9ydCkKLSAgc3ViZGV2aWNlIDMgLSBsYXN0IDI0IGNoYW5uZWxzIG9mIHRoZSA0OCBjaGFubmVsIERJTyAobm8gaW50ZXJydXB0IHN1cHBvcnQgZm9yIHRoaXMgYmFuayBvZiBjaGFubmVscykKKyAgc3ViZGV2aWNlIDIgLSBmaXJzdCAyNCBjaGFubmVscyBvZiB0aGUgNDggY2hhbm5lbCBvZiBESU8KKwkod2l0aCBlZGdlLXRyaWdnZXJlZCBpbnRlcnJ1cHQgc3VwcG9ydCkKKyAgc3ViZGV2aWNlIDMgLSBsYXN0IDI0IGNoYW5uZWxzIG9mIHRoZSA0OCBjaGFubmVsIERJTworCShubyBpbnRlcnJ1cHQgc3VwcG9ydCBmb3IgdGhpcyBiYW5rIG9mIGNoYW5uZWxzKQogCiAgIFNvbWUgbm90ZXM6CiAKQEAgLTcwLDcgKzcyLDggQEAKIAogQ29uZmlndXJhdGlvbiBPcHRpb25zOgogICBbMF0gLSBJL08gcG9ydCBiYXNlIGFkZHJlc3MKLSAgWzFdIC0gSVJRIChvcHRpb25hbCAtLSBmb3IgZWRnZS1kZXRlY3QgaW50ZXJydXB0IHN1cHBvcnQgb25seSwgbGVhdmUgb3V0IGlmIHlvdSBkb24ndCBuZWVkIHRoaXMgZmVhdHVyZSkKKyAgWzFdIC0gSVJRIChvcHRpb25hbCAtLSBmb3IgZWRnZS1kZXRlY3QgaW50ZXJydXB0IHN1cHBvcnQgb25seSwKKwlsZWF2ZSBvdXQgaWYgeW91IGRvbid0IG5lZWQgdGhpcyBmZWF0dXJlKQogKi8KIAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtMTE1LDkgKzExOCwxMSBAQAogI2RlZmluZSBSRUdfUE9SVDQgMHg0CiAjZGVmaW5lIFJFR19QT1JUNSAweDUKICNkZWZpbmUgUkVHX0lOVF9QRU5ESU5HIDB4NgotI2RlZmluZSBSRUdfUEFHRUxPQ0sgMHg3CS8qIHBhZ2Ugc2VsZWN0b3IgcmVnaXN0ZXIsIHVwcGVyIDIgYml0cyBzZWxlY3QgYSBwYWdlCi0JCQkJICAgYW5kIGJpdHMgMC01IGFyZSB1c2VkIHRvICdsb2NrIGRvd24nIGEgcGFydGljdWxhcgotCQkJCSAgIHBvcnQgYWJvdmUgdG8gbWFrZSBpdCByZWFkb25seS4gICovCisjZGVmaW5lIFJFR19QQUdFTE9DSyAweDcJLyoKKwkJCQkgKiBwYWdlIHNlbGVjdG9yIHJlZ2lzdGVyLCB1cHBlciAyIGJpdHMgc2VsZWN0CisJCQkJICogYSBwYWdlIGFuZCBiaXRzIDAtNSBhcmUgdXNlZCB0byAnbG9jayBkb3duJworCQkJCSAqIGEgcGFydGljdWxhciBwb3J0IGFib3ZlIHRvIG1ha2UgaXQgcmVhZG9ubHkuCisJCQkJICovCiAjZGVmaW5lIFJFR19QT0wwIDB4OAogI2RlZmluZSBSRUdfUE9MMSAweDkKICNkZWZpbmUgUkVHX1BPTDIgMHhBCkBAIC0xMzQsNyArMTM5LDcgQEAKICNkZWZpbmUgUkVHX1BBR0VfQklUT0ZGU0VUIDYKICNkZWZpbmUgUkVHX0xPQ0tfQklUT0ZGU0VUIDAKICNkZWZpbmUgUkVHX1BBR0VfTUFTSyAofigoMHgxPDxSRUdfUEFHRV9CSVRPRkZTRVQpLTEpKQotI2RlZmluZSBSRUdfTE9DS19NQVNLIH4oUkVHX1BBR0VfTUFTSykKKyNkZWZpbmUgUkVHX0xPQ0tfTUFTSyAofihSRUdfUEFHRV9NQVNLKSkKICNkZWZpbmUgUEFHRV9QT0wgMQogI2RlZmluZSBQQUdFX0VOQUIgMgogI2RlZmluZSBQQUdFX0lOVF9JRCAzCkBAIC0xNjgsMTMgKzE3MywxMiBAQAogCWNvbWVkaV9pbnNuX2ZuX3QgYWlfcmluc24sIGFvX3JpbnNuLCBhb193aW5zbjsKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSByYW5nZXNfYWkgPQotICAgIHsgNCwge1JBTkdFKC01LiwgNS4pLCBSQU5HRSgtMTAuLCAxMC4pLCBSQU5HRSgwLiwgNS4pLCBSQU5HRSgwLiwKLQkJCQkJCQkJIDEwLil9CitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VzX2FpID0geworCTQsIHtSQU5HRSgtNS4sIDUuKSwgUkFOR0UoLTEwLiwgMTAuKSwgUkFOR0UoMC4sIDUuKSwgUkFOR0UoMC4sIDEwLil9CiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VzX2FvID0KLSAgICB7IDYsIHtSQU5HRSgwLiwgNS4pLCBSQU5HRSgwLiwgMTAuKSwgUkFOR0UoLTUuLCA1LiksIFJBTkdFKC0xMC4sIDEwLiksCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VzX2FvID0geworCTYsIHtSQU5HRSgwLiwgNS4pLCBSQU5HRSgwLiwgMTAuKSwgUkFOR0UoLTUuLCA1LiksIFJBTkdFKC0xMC4sIDEwLiksCiAJICBSQU5HRSgtMi41LCAyLjUpLCBSQU5HRSgtMi41LCA3LjUpfQogfTsKIApAQCAtMjA0LDcgKzIwOCw4IEBACiBzdHJ1Y3QgcGNtbWlvX3N1YmRldl9wcml2YXRlIHsKIAogCXVuaW9uIHsKLQkJLyogZm9yIERJTzogbWFwcGluZyBvZiBoYWxmd29yZHMgKGJ5dGVzKSBpbiBwb3J0L2NoYW5hcnJheSB0byBpb2Jhc2UgKi8KKwkJLyogZm9yIERJTzogbWFwcGluZyBvZiBoYWxmd29yZHMgKGJ5dGVzKQorCQkgICBpbiBwb3J0L2NoYW5hcnJheSB0byBpb2Jhc2UgKi8KIAkJdW5zaWduZWQgbG9uZyBpb2Jhc2VzW1BPUlRTX1BFUl9TVUJERVZdOwogCiAJCS8qIGZvciBBSS9BTyAqLwpAQCAtMjE1LDE1ICsyMjAsMzEgQEAKIAogCQkJLyogVGhlIGJlbG93IGlzIG9ubHkgdXNlZCBmb3IgaW50ciBzdWJkZXZpY2VzICovCiAJCQlzdHJ1Y3QgewotCQkJCWludCBhc2ljOwkvKiBpZiBub24tbmVnYXRpdmUsIHRoaXMgc3ViZGV2IGhhcyBhbiBpbnRlcnJ1cHQgYXNpYyAqLwotCQkJCWludCBmaXJzdF9jaGFuOwkvKiBpZiBub25uZWdhdGl2ZSwgdGhlIGZpcnN0IGNoYW5uZWwgaWQgZm9yCi0JCQkJCQkgICBpbnRlcnJ1cHRzLiAqLwotCQkJCWludCBudW1fYXNpY19jaGFuczsJLyogdGhlIG51bWJlciBvZiBhc2ljIGNoYW5uZWxzIGluIHRoaXMgc3ViZGV2Ci0JCQkJCQkJICAgdGhhdCBoYXZlIGludGVycnV0cHMgKi8KLQkJCQlpbnQgYXNpY19jaGFuOwkvKiBpZiBub25uZWdhdGl2ZSwgdGhlIGZpcnN0IGNoYW5uZWwgaWQgd2l0aAotCQkJCQkJICAgcmVzcGVjdCB0byB0aGUgYXNpYyB0aGF0IGhhcyBpbnRlcnJ1cHRzICovCi0JCQkJaW50IGVuYWJsZWRfbWFzazsJLyogc3ViZGV2LXJlbGF0aXZlIGNoYW5uZWwgbWFzayBmb3IgY2hhbm5lbHMKLQkJCQkJCQkgICB3ZSBhcmUgaW50ZXJlc3RlZCBpbiAqLworCQkJCS8qCisJCQkJICogaWYgbm9uLW5lZ2F0aXZlLCB0aGlzIHN1YmRldiBoYXMgYW4KKwkJCQkgKiBpbnRlcnJ1cHQgYXNpYworCQkJCSAqLworCQkJCWludCBhc2ljOworCQkJCS8qCisJCQkJICogaWYgbm9ubmVnYXRpdmUsIHRoZSBmaXJzdCBjaGFubmVsIGlkIGZvcgorCQkJCSAqIGludGVycnVwdHMuCisJCQkJICovCisJCQkJaW50IGZpcnN0X2NoYW47CisJCQkJLyoKKwkJCQkgKiB0aGUgbnVtYmVyIG9mIGFzaWMgY2hhbm5lbHMgaW4gdGhpcyBzdWJkZXYKKwkJCQkgKiB0aGF0IGhhdmUgaW50ZXJydXRwcworCQkJCSAqLworCQkJCWludCBudW1fYXNpY19jaGFuczsKKwkJCQkvKgorCQkJCSAqIGlmIG5vbm5lZ2F0aXZlLCB0aGUgZmlyc3QgY2hhbm5lbCBpZCB3aXRoCisJCQkJICogcmVzcGVjdCB0byB0aGUgYXNpYyB0aGF0IGhhcyBpbnRlcnJ1cHRzCisJCQkJICovCisJCQkJaW50IGFzaWNfY2hhbjsKKwkJCQkvKgorCQkJCSAqIHN1YmRldi1yZWxhdGl2ZSBjaGFubmVsIG1hc2sgZm9yIGNoYW5uZWxzCisJCQkJICogd2UgYXJlIGludGVyZXN0ZWQgaW4KKwkJCQkgKi8KKwkJCQlpbnQgZW5hYmxlZF9tYXNrOwogCQkJCWludCBhY3RpdmU7CiAJCQkJaW50IHN0b3BfY291bnQ7CiAJCQkJaW50IGNvbnRpbnVvdXM7CkBAIC0yMzEsMjAgKzI1MiwyNSBAQAogCQkJfSBpbnRyOwogCQl9IGRpbzsKIAkJc3RydWN0IHsKLQkJCXVuc2lnbmVkIGludCBzaGFkb3dfc2FtcGxlc1s4XTsJLyogdGhlIGxhc3QgdW5zaWduZWQgaW50IGRhdGEgd3JpdHRlbiAqLworCQkJLyogdGhlIGxhc3QgdW5zaWduZWQgaW50IGRhdGEgd3JpdHRlbiAqLworCQkJdW5zaWduZWQgaW50IHNoYWRvd19zYW1wbGVzWzhdOwogCQl9IGFvOwogCX07CiB9OwogCi0vKiB0aGlzIHN0cnVjdHVyZSBpcyBmb3IgZGF0YSB1bmlxdWUgdG8gdGhpcyBoYXJkd2FyZSBkcml2ZXIuICBJZgotICAgc2V2ZXJhbCBoYXJkd2FyZSBkcml2ZXJzIGtlZXAgc2ltaWxhciBpbmZvcm1hdGlvbiBpbiB0aGlzIHN0cnVjdHVyZSwKLSAgIGZlZWwgZnJlZSB0byBzdWdnZXN0IG1vdmluZyB0aGUgdmFyaWFibGUgdG8gdGhlIHN0cnVjdCBjb21lZGlfZGV2aWNlIHN0cnVjdC4gICovCisvKgorICogdGhpcyBzdHJ1Y3R1cmUgaXMgZm9yIGRhdGEgdW5pcXVlIHRvIHRoaXMgaGFyZHdhcmUgZHJpdmVyLiAgSWYKKyAqIHNldmVyYWwgaGFyZHdhcmUgZHJpdmVycyBrZWVwIHNpbWlsYXIgaW5mb3JtYXRpb24gaW4gdGhpcyBzdHJ1Y3R1cmUsCisgKiBmZWVsIGZyZWUgdG8gc3VnZ2VzdCBtb3ZpbmcgdGhlIHZhcmlhYmxlIHRvIHRoZSBzdHJ1Y3QgY29tZWRpX2RldmljZSBzdHJ1Y3QuCisgKi8KIHN0cnVjdCBwY21taW9fcHJpdmF0ZSB7CiAJLyogc3R1ZmYgZm9yIERJTyAqLwogCXN0cnVjdCB7CiAJCXVuc2lnbmVkIGNoYXIgcGFnZWxvY2s7CS8qIGN1cnJlbnQgcGFnZSBhbmQgbG9jayAqLwotCQl1bnNpZ25lZCBjaGFyIHBvbFtOVU1fUEFHRURfUkVHU107CS8qIHNoYWRvdyBvZiBQT0x4IHJlZ2lzdGVycyAqLwotCQl1bnNpZ25lZCBjaGFyIGVuYWJbTlVNX1BBR0VEX1JFR1NdOwkvKiBzaGFkb3cgb2YgRU5BQnggcmVnaXN0ZXJzICovCisJCS8qIHNoYWRvdyBvZiBQT0x4IHJlZ2lzdGVycyAqLworCQl1bnNpZ25lZCBjaGFyIHBvbFtOVU1fUEFHRURfUkVHU107CisJCS8qIHNoYWRvdyBvZiBFTkFCeCByZWdpc3RlcnMgKi8KKwkJdW5zaWduZWQgY2hhciBlbmFiW05VTV9QQUdFRF9SRUdTXTsKIAkJaW50IG51bTsKIAkJdW5zaWduZWQgbG9uZyBpb2Jhc2U7CiAJCXVuc2lnbmVkIGludCBpcnE7CkBAIC0zMTIsNyArMzM4LDggQEAKIAkJCSAgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCk7CiAKIC8qIHNvbWUgaGVscGVyIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggc3BlY2lmaWNzIG9mIHRoaXMgZGV2aWNlJ3MgcmVnaXN0ZXJzICovCi1zdGF0aWMgdm9pZCBpbml0X2FzaWNzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpOwkvKiBzZXRzIHVwL2NsZWFycyBBU0lDIGNoaXBzIHRvIGRlZmF1bHRzICovCisvKiBzZXRzIHVwL2NsZWFycyBBU0lDIGNoaXBzIHRvIGRlZmF1bHRzICovCitzdGF0aWMgdm9pZCBpbml0X2FzaWNzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgc3dpdGNoX3BhZ2Uoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgaW50IGFzaWMsIGludCBwYWdlKTsKICNpZmRlZiBub3R1c2VkCiBzdGF0aWMgdm9pZCBsb2NrX3BvcnQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgaW50IGFzaWMsIGludCBwb3J0KTsKQEAgLTM2Nyw5ICszOTQsMTEgQEAKIAkJZGV2cHJpdi0+YXNpY3NbYXNpY10ubnVtID0gYXNpYzsKIAkJZGV2cHJpdi0+YXNpY3NbYXNpY10uaW9iYXNlID0KIAkJICAgIGRldi0+aW9iYXNlICsgMTYgKyBhc2ljICogQVNJQ19JT1NJWkU7Ci0JCWRldnByaXYtPmFzaWNzW2FzaWNdLmlycSA9IDA7CS8qIHRoaXMgZ2V0cyBhY3R1YWxseSBzZXQgYXQgdGhlIGVuZCBvZgotCQkJCQkJICAgdGhpcyBmdW5jdGlvbiB3aGVuIHdlCi0JCQkJCQkgICByZXF1ZXN0X2lycXMgKi8KKwkJLyoKKwkJICogdGhpcyBnZXRzIGFjdHVhbGx5IHNldCBhdCB0aGUgZW5kIG9mIHRoaXMgZnVuY3Rpb24gd2hlbiB3ZQorCQkgKiByZXF1ZXN0X2lycXMKKwkJICovCisJCWRldnByaXYtPmFzaWNzW2FzaWNdLmlycSA9IDA7CiAJCXNwaW5fbG9ja19pbml0KCZkZXZwcml2LT5hc2ljc1thc2ljXS5zcGlubG9jayk7CiAJfQogCkBAIC00NjMsNyArNDkyLDEwIEBACiAJCQlpZiAodGhpc2FzaWNfY2hhbmN0IDwKIAkJCSAgICBDSEFOU19QRVJfUE9SVCAqIElOVFJfUE9SVFNfUEVSX0FTSUMKIAkJCSAgICAmJiBzdWJwcml2LT5kaW8uaW50ci5hc2ljIDwgMCkgewotCQkJCS8qIHRoaXMgaXMgYW4gaW50ZXJydXB0IHN1YmRldmljZSwgc28gc2V0dXAgdGhlIHN0cnVjdCAqLworCQkJCS8qCisJCQkJICogdGhpcyBpcyBhbiBpbnRlcnJ1cHQgc3ViZGV2aWNlLAorCQkJCSAqIHNvIHNldHVwIHRoZSBzdHJ1Y3QKKwkJCQkgKi8KIAkJCQlzdWJwcml2LT5kaW8uaW50ci5hc2ljID0gYXNpYzsKIAkJCQlzdWJwcml2LT5kaW8uaW50ci5hY3RpdmUgPSAwOwogCQkJCXN1YnByaXYtPmRpby5pbnRyLnN0b3BfY291bnQgPSAwOwpAQCAtNDg0LDcgKzUxNiwxMSBAQAogCQljaGFuc19sZWZ0IC09IHMtPm5fY2hhbjsKIAogCQlpZiAoIWNoYW5zX2xlZnQpIHsKLQkJCWFzaWMgPSAwOwkvKiByZXNldCB0aGUgYXNpYyB0byBvdXIgZmlyc3QgYXNpYywgdG8gZG8gaW50ciBzdWJkZXZzICovCisJCQkvKgorCQkJICogcmVzZXQgdGhlIGFzaWMgdG8gb3VyIGZpcnN0IGFzaWMsCisJCQkgKiB0byBkbyBpbnRyIHN1YmRldnMKKwkJCSAqLworCQkJYXNpYyA9IDA7CiAJCQlwb3J0ID0gMDsKIAkJfQogCkBAIC01MDcsOCArNTQzLDEwIEBACiAJCWRldnByaXYtPmFzaWNzW2FzaWNdLmlycSA9IGlycVthc2ljXTsKIAl9CiAKLQlkZXYtPmlycSA9IGlycVswXTsJLyogZ3JyLi4gd2lzaCBjb21lZGkgZGV2IHN0cnVjdCBzdXBwb3J0ZWQgbXVsdGlwbGUKLQkJCQkgICBpcnFzLi4gKi8KKwlkZXYtPmlycSA9IGlycVswXTsJLyoKKwkJCQkgKiBncnIuLiB3aXNoIGNvbWVkaSBkZXYgc3RydWN0IHN1cHBvcnRlZAorCQkJCSAqIG11bHRpcGxlIGlycXMuLgorCQkJCSAqLwogCiAJaWYgKGlycVswXSkgewogCQlwcmludGsoImlycTogJXUgIiwgaXJxWzBdKTsKQEAgLTYwNCw5ICs2NDIsMTQgQEAKICNlbmRpZgogCiAJCWlmICh3cml0ZV9tYXNrX2J5dGUpIHsKLQkJCS8qIHRoaXMgYnl0ZSBoYXMgc29tZSB3cml0ZV9iaXRzIC0tIHNvIHNldCB0aGUgb3V0cHV0IGxpbmVzICovCi0JCQlieXRlICY9IH53cml0ZV9tYXNrX2J5dGU7CS8qIGNsZWFyIGJpdHMgZm9yIHdyaXRlIG1hc2sgKi8KLQkJCWJ5dGUgfD0gfmRhdGFfYnl0ZSAmIHdyaXRlX21hc2tfYnl0ZTsJLyogc2V0IHRvIGludmVydGVkIGRhdGFfYnl0ZSAqLworCQkJLyoKKwkJCSAqIHRoaXMgYnl0ZSBoYXMgc29tZSB3cml0ZV9iaXRzCisJCQkgKiAtLSBzbyBzZXQgdGhlIG91dHB1dCBsaW5lcworCQkJICovCisJCQkvKiBjbGVhciBiaXRzIGZvciB3cml0ZSBtYXNrICovCisJCQlieXRlICY9IH53cml0ZV9tYXNrX2J5dGU7CisJCQkvKiBzZXQgdG8gaW52ZXJ0ZWQgZGF0YV9ieXRlICovCisJCQlieXRlIHw9IH5kYXRhX2J5dGUgJiB3cml0ZV9tYXNrX2J5dGU7CiAJCQkvKiBXcml0ZSBvdXQgdGhlIG5ldyBkaWdpdGFsIG91dHB1dCBzdGF0ZSAqLwogCQkJb3V0YihieXRlLCBpb2FkZHIpOwogCQl9CkBAIC02NzAsOSArNzEzLDExIEBACiAJCWJ5dGUgJj0gfigxIDw8IGJpdF9ubyk7CiAJCQkJLyoqPCBzZXQgaW5wdXQgY2hhbm5lbCB0byAnMCcgKi8KIAotCQkvKiB3cml0ZSBvdXQgYnl0ZSAtLSB0aGlzIGlzIHRoZSBvbmx5IHRpbWUgd2UgYWN0dWFsbHkgYWZmZWN0IHRoZQotCQkgICBoYXJkd2FyZSBhcyBhbGwgY2hhbm5lbHMgYXJlIGltcGxpY2l0bHkgb3V0cHV0IC0tIGJ1dCBpbnB1dAotCQkgICBjaGFubmVscyBhcmUgc2V0IHRvIGZsb2F0LWhpZ2ggKi8KKwkJLyoKKwkJICogd3JpdGUgb3V0IGJ5dGUgLS0gdGhpcyBpcyB0aGUgb25seSB0aW1lIHdlIGFjdHVhbGx5IGFmZmVjdAorCQkgKiB0aGUgaGFyZHdhcmUgYXMgYWxsIGNoYW5uZWxzIGFyZSBpbXBsaWNpdGx5IG91dHB1dAorCQkgKiAtLSBidXQgaW5wdXQgY2hhbm5lbHMgYXJlIHNldCB0byBmbG9hdC1oaWdoCisJCSAqLwogCQlvdXRiKGJ5dGUsIGlvYWRkcik7CiAKIAkJLyogc2F2ZSB0byBpb19iaXRzICovCkBAIC03MjYsOCArNzcxLDggQEAKIAkJICAgb3V0YigweGZmLCBiYXNlYWRkciArIFJFR19FTkFCMCk7ICovCiAJCS8qIEVORCBERUJVRyAqLwogCi0JCXN3aXRjaF9wYWdlKGRldiwgYXNpYywgMCk7CS8qIHN3aXRjaCBiYWNrIHRvIGRlZmF1bHQgcGFnZSAwICovCi0KKwkJLyogc3dpdGNoIGJhY2sgdG8gZGVmYXVsdCBwYWdlIDAgKi8KKwkJc3dpdGNoX3BhZ2UoZGV2LCBhc2ljLCAwKTsKIAl9CiB9CiAKQEAgLTgwNiw3ICs4NTEsMTAgQEAKIAkJCQkJCQlSRUdfSU5UX0lEMCArIHBvcnQpOwogCiAJCQkJCQlpZiAoaW9fbGluZXNfd2l0aF9lZGdlcykKLQkJCQkJCQkvKiBjbGVhciBwZW5kaW5nIGludGVycnVwdCAqLworCQkJCQkJCS8qCisJCQkJCQkJICogY2xlYXIgcGVuZGluZworCQkJCQkJCSAqIGludGVycnVwdAorCQkJCQkJCSAqLwogCQkJCQkJCW91dGIoMCwgaW9iYXNlICsKIAkJCQkJCQkgICAgIFJFR19JTlRfSUQwICsKIAkJCQkJCQkgICAgIHBvcnQpOwpAQCAtODI1LDE0ICs4NzMsMjEgQEAKIAogCQkJaWYgKHRyaWdnZXJlZCkgewogCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOwotCQkJCS8qIFRPRE8gaGVyZTogZGlzcGF0Y2ggaW8gbGluZXMgdG8gc3ViZGV2cyB3aXRoIGNvbW1hbmRzLi4gKi8KKwkJCQkvKgorCQkJCSAqIFRPRE8gaGVyZTogZGlzcGF0Y2ggaW8gbGluZXMgdG8gc3ViZGV2cworCQkJCSAqIHdpdGggY29tbWFuZHMuLgorCQkJCSAqLwogCQkJCXByaW50awogCQkJCSAgICAoIlBDTU1JTyBERUJVRzogZ290IGVkZ2UgZGV0ZWN0IGludGVycnVwdCAlZCBhc2ljICVkIHdoaWNoX2NoYW5zOiAlMDZ4XG4iLAogCQkJCSAgICAgaXJxLCBhc2ljLCB0cmlnZ2VyZWQpOwogCQkJCWZvciAocyA9IGRldi0+c3ViZGV2aWNlcyArIDI7CiAJCQkJICAgICBzIDwgZGV2LT5zdWJkZXZpY2VzICsgZGV2LT5uX3N1YmRldmljZXM7CiAJCQkJICAgICArK3MpIHsKLQkJCQkJaWYgKHN1YnByaXYtPmRpby5pbnRyLmFzaWMgPT0gYXNpYykgewkvKiB0aGlzIGlzIGFuIGludGVycnVwdCBzdWJkZXYsIGFuZCBpdCBtYXRjaGVzIHRoaXMgYXNpYyEgKi8KKwkJCQkJLyoKKwkJCQkJICogdGhpcyBpcyBhbiBpbnRlcnJ1cHQgc3ViZGV2LAorCQkJCQkgKiBhbmQgaXQgbWF0Y2hlcyB0aGlzIGFzaWMhCisJCQkJCSAqLworCQkJCQlpZiAoc3VicHJpdi0+ZGlvLmludHIuYXNpYyA9PSBhc2ljKSB7CiAJCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCQkJCQkJdW5zaWduZWQgb2xkZXZlbnRzOwogCkBAIC04NjcsOSArOTIyLDggQEAKIAkJCQkJCQkJICAgICBuIDwgbGVuOwogCQkJCQkJCQkgICAgIG4rKykgewogCQkJCQkJCQkJY2ggPSBDUl9DSEFOKHMtPmFzeW5jLT5jbWQuY2hhbmxpc3Rbbl0pOwotCQkJCQkJCQkJaWYgKG15dHJpZyAmICgxVSA8PCBjaCkpIHsKKwkJCQkJCQkJCWlmIChteXRyaWcgJiAoMVUgPDwgY2gpKQogCQkJCQkJCQkJCXZhbCB8PSAoMVUgPDwgbik7Ci0JCQkJCQkJCQl9CiAJCQkJCQkJCX0KIAkJCQkJCQkJLyogV3JpdGUgdGhlIHNjYW4gdG8gdGhlIGJ1ZmZlci4gKi8KIAkJCQkJCQkJaWYgKGNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCAoKHNob3J0ICopJnZhbClbMF0pCkBAIC04NzcsOCArOTMxLDcgQEAKIAkJCQkJCQkJICAgIGNvbWVkaV9idWZfcHV0CiAJCQkJCQkJCSAgICAocy0+YXN5bmMsCiAJCQkJCQkJCSAgICAgKChzaG9ydCAqKQotCQkJCQkJCQkgICAgICAmdmFsKVsxXSkpCi0JCQkJCQkJCXsKKwkJCQkJCQkJICAgICAgJnZhbClbMV0pKSB7CiAJCQkJCQkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IChDT01FRElfQ0JfQkxPQ0sgfCBDT01FRElfQ0JfRU9TKTsKIAkJCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQkJCS8qIE92ZXJmbG93ISBTdG9wIGFjcXVpc2l0aW9uISEgKi8KQEAgLTk4MSw5ICsxMDM0LDE2IEBACiAJCQkgMSkgPDwgc3VicHJpdi0+ZGlvLmludHIuZmlyc3RfY2hhbjsKIAkJc3VicHJpdi0+ZGlvLmludHIuZW5hYmxlZF9tYXNrID0gYml0czsKIAotCQl7CQkvKiB0aGUgYmVsb3cgY29kZSBjb25maWd1cmVzIHRoZSBib2FyZCB0byB1c2UgYSBzcGVjaWZpYyBJUlEgZnJvbSAwLTE1LiAqLworCQl7CisJCQkvKgorCQkJICogdGhlIGJlbG93IGNvZGUgY29uZmlndXJlcyB0aGUgYm9hcmQKKwkJCSAqIHRvIHVzZSBhIHNwZWNpZmljIElSUSBmcm9tIDAtMTUuCisJCQkgKi8KIAkJCXVuc2lnbmVkIGNoYXIgYjsKLQkJCS8qIHNldCByZXNvdXJjZSBlbmFibGUgcmVnaXN0ZXIgdG8gZW5hYmxlIElSUSBvcGVyYXRpb24gKi8KKwkJCS8qCisJCQkgKiBzZXQgcmVzb3VyY2UgZW5hYmxlIHJlZ2lzdGVyCisJCQkgKiB0byBlbmFibGUgSVJRIG9wZXJhdGlvbgorCQkJICovCiAJCQlvdXRiKDEgPDwgNCwgZGV2LT5pb2Jhc2UgKyAzKTsKIAkJCS8qIHNldCBiaXRzIDAtMyBvZiBiIHRvIHRoZSBpcnEgbnVtYmVyIGZyb20gMC0xNSAqLwogCQkJYiA9IGRldi0+aXJxICYgKCgxIDw8IDQpIC0gMSk7CkBAIC0xMDM3LDE0ICsxMDk3LDEyIEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc3VicHJpdi0+ZGlvLmludHIuc3BpbmxvY2ssIGZsYWdzKTsKIAlzLT5hc3luYy0+aW50dHJpZyA9IDA7Ci0JaWYgKHN1YnByaXYtPmRpby5pbnRyLmFjdGl2ZSkgeworCWlmIChzdWJwcml2LT5kaW8uaW50ci5hY3RpdmUpCiAJCWV2ZW50ID0gcGNtbWlvX3N0YXJ0X2ludHIoZGV2LCBzKTsKLQl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3VicHJpdi0+ZGlvLmludHIuc3BpbmxvY2ssIGZsYWdzKTsKIAotCWlmIChldmVudCkgeworCWlmIChldmVudCkKIAkJY29tZWRpX2V2ZW50KGRldiwgcyk7Ci0JfQogCiAJcmV0dXJuIDE7CiB9CkBAIC0xMDg2LDkgKzExNDQsOCBAQAogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdWJwcml2LT5kaW8uaW50ci5zcGlubG9jaywgZmxhZ3MpOwogCi0JaWYgKGV2ZW50KSB7CisJaWYgKGV2ZW50KQogCQljb21lZGlfZXZlbnQoZGV2LCBzKTsKLQl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTExMzYsMTcgKzExOTMsMzIgQEAKIAkJc2hvcnQgc2FtcGxlLCBhZGNfYWRqdXN0ID0gMDsKIAogCQlpZiAoY2hhbiA+IDcpCi0JCQljaGFuIC09IDgsIGlvb2Zmc2V0ID0gNDsJLyogdXNlIHRoZSBzZWNvbmQgZHdvcmQgZm9yIGNoYW5uZWxzID4gNyAqLworCQkJY2hhbiAtPSA4LCBpb29mZnNldCA9IDQ7CS8qCisJCQkJCQkJICogdXNlIHRoZSBzZWNvbmQgZHdvcmQKKwkJCQkJCQkgKiBmb3IgY2hhbm5lbHMgPiA3CisJCQkJCQkJICovCiAKIAkJaWYgKGFyZWYgIT0gQVJFRl9ESUZGKSB7CiAJCQlhcmVmID0gQVJFRl9HUk9VTkQ7Ci0JCQljb21tYW5kX2J5dGUgfD0gMSA8PCA3OwkvKiBzZXQgYml0IDcgdG8gaW5kaWNhdGUgc2luZ2xlLWVuZGVkICovCisJCQljb21tYW5kX2J5dGUgfD0gMSA8PCA3OwkvKgorCQkJCQkJICogc2V0IGJpdCA3IHRvIGluZGljYXRlCisJCQkJCQkgKiBzaW5nbGUtZW5kZWQKKwkJCQkJCSAqLwogCQl9CiAJCWlmIChyYW5nZSA8IDIpCi0JCQlhZGNfYWRqdXN0ID0gMHg4MDAwOwkvKiBiaXBvbGFyIHJhbmdlcyAoLTUsNSAuLiAtMTAsMTAgbmVlZCB0byBiZSBhZGp1c3RlZCAtLSB0aGF0IGlzLi4gdGhleSBuZWVkIHRvIHdyYXAgYXJvdW5kIGJ5IGFkZGluZyAweDgwMDAgKi8KKwkJCWFkY19hZGp1c3QgPSAweDgwMDA7CS8qCisJCQkJCQkgKiBiaXBvbGFyIHJhbmdlcworCQkJCQkJICogKC01LDUgLi4gLTEwLDEwIG5lZWQgdG8gYmUKKwkJCQkJCSAqIGFkanVzdGVkIC0tIHRoYXQgaXMuLiB0aGV5CisJCQkJCQkgKiBuZWVkIHRvIHdyYXAgYXJvdW5kIGJ5CisJCQkJCQkgKiBhZGRpbmcgMHg4MDAwCisJCQkJCQkgKi8KIAogCQlpZiAoY2hhbiAlIDIpIHsKLQkJCWNvbW1hbmRfYnl0ZSB8PSAxIDw8IDY7CS8qIG9kZC1udW1iZXJlZCBjaGFubmVscyBoYXZlIGJpdCA2IHNldCAqLworCQkJY29tbWFuZF9ieXRlIHw9IDEgPDwgNjsJLyoKKwkJCQkJCSAqIG9kZC1udW1iZXJlZCBjaGFubmVscworCQkJCQkJICogaGF2ZSBiaXQgNiBzZXQKKwkJCQkJCSAqLwogCQl9CiAKIAkJLyogc2VsZWN0IHRoZSBjaGFubmVsLCBiaXRzIDQtNSA9PSBjaGFuLzIgKi8KQEAgLTExNTYsMTYgKzEyMjgsMjIgQEAKIAkJY29tbWFuZF9ieXRlIHw9IChyYW5nZSAmIDB4MykgPDwgMjsKIAogCQkvKiBuZWVkIHRvIGRvIHRoaXMgdHdpY2UgdG8gbWFrZSBzdXJlIG11eCBzZXR0bGVkICovCi0JCW91dGIoY29tbWFuZF9ieXRlLCBpb2Jhc2UgKyBpb29mZnNldCArIDIpOwkvKiBjaGFuL3JhbmdlL2FyZWYgc2VsZWN0ICovCisJCS8qIGNoYW4vcmFuZ2UvYXJlZiBzZWxlY3QgKi8KKwkJb3V0Yihjb21tYW5kX2J5dGUsIGlvYmFzZSArIGlvb2Zmc2V0ICsgMik7CiAKLQkJYWRjX3dhaXRfcmVhZHkoaW9iYXNlICsgaW9vZmZzZXQpOwkvKiB3YWl0IGZvciB0aGUgYWRjIHRvIHNheSBpdCBmaW5pc2VkIHRoZSBjb252ZXJzaW9uICovCisJCS8qIHdhaXQgZm9yIHRoZSBhZGMgdG8gc2F5IGl0IGZpbmlzZWQgdGhlIGNvbnZlcnNpb24gKi8KKwkJYWRjX3dhaXRfcmVhZHkoaW9iYXNlICsgaW9vZmZzZXQpOwogCi0JCW91dGIoY29tbWFuZF9ieXRlLCBpb2Jhc2UgKyBpb29mZnNldCArIDIpOwkvKiBzZWxlY3QgdGhlIGNoYW4vcmFuZ2UvYXJlZiBBR0FJTiAqLworCQkvKiBzZWxlY3QgdGhlIGNoYW4vcmFuZ2UvYXJlZiBBR0FJTiAqLworCQlvdXRiKGNvbW1hbmRfYnl0ZSwgaW9iYXNlICsgaW9vZmZzZXQgKyAyKTsKIAogCQlhZGNfd2FpdF9yZWFkeShpb2Jhc2UgKyBpb29mZnNldCk7CiAKLQkJc2FtcGxlID0gaW5iKGlvYmFzZSArIGlvb2Zmc2V0ICsgMCk7CS8qIHJlYWQgZGF0YSBsbyBieXRlICovCi0JCXNhbXBsZSB8PSBpbmIoaW9iYXNlICsgaW9vZmZzZXQgKyAxKSA8PCA4OwkvKiByZWFkIGRhdGEgaGkgYnl0ZSAqLworCQkvKiByZWFkIGRhdGEgbG8gYnl0ZSAqLworCQlzYW1wbGUgPSBpbmIoaW9iYXNlICsgaW9vZmZzZXQgKyAwKTsKKworCQkvKiByZWFkIGRhdGEgaGkgYnl0ZSAqLworCQlzYW1wbGUgfD0gaW5iKGlvYmFzZSArIGlvb2Zmc2V0ICsgMSkgPDwgODsKIAkJc2FtcGxlICs9IGFkY19hZGp1c3Q7CS8qIGFkanVzdG1lbnQgLi4gbXVuZ2UgZGF0YSAqLwogCQlkYXRhW25dID0gc2FtcGxlOwogCX0KQEAgLTEyMjcsMTUgKzEzMDUsMjQgQEAKIAogCQkJd2FpdF9kYWNfcmVhZHkoaW9iYXNlICsgaW9vZmZzZXQpOwogCi0JCQlvdXRiKGRhdGFbbl0gJiAweGZmLCBpb2Jhc2UgKyBpb29mZnNldCArIDApOwkvKiBsb3cgb3JkZXIgYnl0ZSAqLwotCQkJb3V0YigoZGF0YVtuXSA+PiA4KSAmIDB4ZmYsIGlvYmFzZSArIGlvb2Zmc2V0ICsgMSk7CS8qIGhpZ2ggb3JkZXIgYnl0ZSAqLwotCQkJY29tbWFuZF9ieXRlID0gMHg3MCB8IChjaGFuIDw8IDEpOwkvKiBzZXQgYml0IDQgb2YgY29tbWFuZCBieXRlIHRvIGluZGljYXRlIGRhdGEgaXMgbG9hZGVkIGFuZCB0cmlnZ2VyIGNvbnZlcnNpb24gKi8KKwkJCS8qIGxvdyBvcmRlciBieXRlICovCisJCQlvdXRiKGRhdGFbbl0gJiAweGZmLCBpb2Jhc2UgKyBpb29mZnNldCArIDApOworCisJCQkvKiBoaWdoIG9yZGVyIGJ5dGUgKi8KKwkJCW91dGIoKGRhdGFbbl0gPj4gOCkgJiAweGZmLCBpb2Jhc2UgKyBpb29mZnNldCArIDEpOworCisJCQkvKgorCQkJICogc2V0IGJpdCA0IG9mIGNvbW1hbmQgYnl0ZSB0byBpbmRpY2F0ZQorCQkJICogZGF0YSBpcyBsb2FkZWQgYW5kIHRyaWdnZXIgY29udmVyc2lvbgorCQkJICovCisJCQljb21tYW5kX2J5dGUgPSAweDcwIHwgKGNoYW4gPDwgMSk7CiAJCQkvKiB0cmlnZ2VyIGNvbnZlcmlvbiAqLwogCQkJb3V0Yihjb21tYW5kX2J5dGUsIGlvYmFzZSArIGlvb2Zmc2V0ICsgMik7CiAKIAkJCXdhaXRfZGFjX3JlYWR5KGlvYmFzZSArIGlvb2Zmc2V0KTsKIAotCQkJc3VicHJpdi0+YW8uc2hhZG93X3NhbXBsZXNbY2hhbl0gPSBkYXRhW25dOwkvKiBzYXZlIHRvIHNoYWRvdyByZWdpc3RlciBmb3IgYW9fcmluc24gKi8KKwkJCS8qIHNhdmUgdG8gc2hhZG93IHJlZ2lzdGVyIGZvciBhb19yaW5zbiAqLworCQkJc3VicHJpdi0+YW8uc2hhZG93X3NhbXBsZXNbY2hhbl0gPSBkYXRhW25dOwogCQl9CiAJfQogCXJldHVybiBuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3F1YXRlY2hfZGFxcF9jcy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3F1YXRlY2hfZGFxcF9jcy5jCmluZGV4IDUyNTZmZDkuLjMzMjVmMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9xdWF0ZWNoX2RhcXBfY3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcXVhdGVjaF9kYXFwX2NzLmMKQEAgLTQ4OSw3ICs0ODksNyBAQAogCiAJLyogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIAotCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCisJLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmlsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19USU1FUiAmJgogCSAgICBjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRk9MTE9XKQogCQllcnIrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGQ1MjAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGQ1MjAuYwppbmRleCBmMzVjY2U1Li44NjI2NjU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0ZDUyMC5jCkBAIC0xNzY4LDcgKzE3NjgsNyBAQAogCiAJLyogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUKIAkgICBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwotCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCisJLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmlsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19USU1FUiAmJgogCSAgICBjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRVhUKSB7CiAJCWVycisrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmMKaW5kZXggODBkMjc4Ny4uZmRkN2FiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5jCkBAIC0xOTI2LDcgKzE5MjYsNyBAQAogCS8qIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCBtdXR1YWxseQogCSAgIGNvbXBhdGlibGUgKi8KIAotCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCisJLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmlsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19USU1FUiAmJgogCSAgICBjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRVhUCiAJICAgICYmIGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19GT0xMT1cpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuaAppbmRleCAxZDA0OTIyLi5kMDI3NDJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmgKQEAgLTc2LDE0ICs3Niw2IEBACiAjZGVmaW5lIEZBTFNFICAgKDApCiAjZW5kaWYKIAotI2lmICFkZWZpbmVkKEVYVEVSTikKLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQotI2RlZmluZSBFWFRFUk4gZXh0ZXJuICJDIgotI2Vsc2UKLSNkZWZpbmUgRVhURVJOIGV4dGVybgotI2VuZGlmCi0jZW5kaWYKLQogI2lmICFkZWZpbmVkKElOTElORSkKICNkZWZpbmUgSU5MSU5FIHN0YXRpYyBfX2lubGluZQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvc2VyaWFsMjAwMi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3NlcmlhbDIwMDIuYwppbmRleCA4MmFhODZlLi5kYjM3ZGNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvc2VyaWFsMjAwMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zZXJpYWwyMDAyLmMKQEAgLTEyNSwxNCArMTI1LDkgQEAKIAogc3RhdGljIGxvbmcgdHR5X2lvY3RsKHN0cnVjdCBmaWxlICpmLCB1bnNpZ25lZCBvcCwgdW5zaWduZWQgbG9uZyBwYXJhbSkKIHsKLSNpZmRlZiBIQVZFX1VOTE9DS0VEX0lPQ1RMCi0JaWYgKGYtPmZfb3AtPnVubG9ja2VkX2lvY3RsKSB7CisJaWYgKGYtPmZfb3AtPnVubG9ja2VkX2lvY3RsKQogCQlyZXR1cm4gZi0+Zl9vcC0+dW5sb2NrZWRfaW9jdGwoZiwgb3AsIHBhcmFtKTsKLQl9Ci0jZW5kaWYKLQlpZiAoZi0+Zl9vcC0+aW9jdGwpIHsKLQkJcmV0dXJuIGYtPmZfb3AtPmlvY3RsKGYtPmZfZGVudHJ5LT5kX2lub2RlLCBmLCBvcCwgcGFyYW0pOwotCX0KKwogCXJldHVybiAtRU5PU1lTOwogfQogCkBAIC00MDksOCArNDA0LDggQEAKIAl9IGVsc2UgewogCQlzdHJ1Y3QgY29uZmlnX3QgewogCi0JCQlpbnQga2luZDsKLQkJCWludCBiaXRzOworCQkJc2hvcnQgaW50IGtpbmQ7CisJCQlzaG9ydCBpbnQgYml0czsKIAkJCWludCBtaW47CiAJCQlpbnQgbWF4OwogCQl9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3NrZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9za2VsLmMKaW5kZXggM2RlZTYyYS4uYWJhNTdkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3NrZWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvc2tlbC5jCkBAIC0zOTksNyArMzk5LDcgQEAKIAogCS8qIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKLQkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGlibGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLworCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJpbGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLwogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfVElNRVIgJiYKIAkgICAgY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0VYVCkKIAkJZXJyKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4LmMKaW5kZXggY2NhNGU4Ni4uMDZjMDIwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXguYwpAQCAtMSw0ICsxLDQgQEAKLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYyLjIiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2Mi4zIgogI2RlZmluZSBEUklWRVJfQVVUSE9SICJCZXJuZCBQb3JyLCBCZXJuZFBvcnJAZjJzLmNvbSIKICNkZWZpbmUgRFJJVkVSX0RFU0MgIlN0aXJsaW5nL0lUTCBVU0ItRFVYIC0tIEJlcm5kLlBvcnJAZjJzLmNvbSIKIC8qCkBAIC04MCw2ICs4MCw3IEBACiAgKiAyLjA6ICBQV00gc2VlbXMgdG8gYmUgc3RhYmxlIGFuZCBpcyBub3QgaW50ZXJmZXJpbmcgd2l0aCB0aGUgb3RoZXIgZnVuY3Rpb25zCiAgKiAyLjE6ICBjaGFuZ2VkIFBXTSBBUEkKICAqIDIuMjogIGFkZGVkIGZpcm13YXJlIGtlcm5lbCByZXF1ZXN0IHRvIGZpeCBhbiB1ZGV2IHByb2JsZW0KKyAqIDIuMzogIGNvcnJlY3RlZCBhIGJ1ZyBpbiBidWxrIHRpbWVvdXRzIHdoaWNoIHdlcmUgZmFyIHRvbyBzaG9ydAogICoKICAqLwogCkBAIC0xMDEsOCArMTAyLDggQEAKIAogI2RlZmluZSBCT0FSRE5BTUUgInVzYmR1eCIKIAotLyogdGltZW91dCBmb3IgdGhlIFVTQi10cmFuc2ZlciAqLwotI2RlZmluZSBFWlRJTUVPVVQgMzAKKy8qIHRpbWVvdXQgZm9yIHRoZSBVU0ItdHJhbnNmZXIgaW4gbXMqLworI2RlZmluZSBCVUxLX1RJTUVPVVQgMTAwMAogCiAvKiBjb25zdGFudHMgZm9yICJmaXJtd2FyZSIgdXBsb2FkIGFuZCBkb3dubG9hZCAqLwogI2RlZmluZSBVU0JEVVhTVUJfRklSTVdBUkUgMHhBMApAQCAtNzUwLDcgKzc1MSw3IEBACiAJCQkJICAvKiBMZW5ndGggKi8KIAkJCQkgIDEsCiAJCQkJICAvKiBUaW1lb3V0ICovCi0JCQkJICBFWlRJTUVPVVQpOworCQkJCSAgQlVMS19USU1FT1VUKTsKIAlpZiAoZXJyY29kZSA8IDApIHsKIAkJZGV2X2VycigmdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKIAkJCSJjb21lZGlfOiBjb250cm9sIG1zZyBmYWlsZWQgKHN0YXJ0KVxuIik7CkBAIC03ODAsNyArNzgxLDcgQEAKIAkJCQkgIC8qIExlbmd0aCAqLwogCQkJCSAgMSwKIAkJCQkgIC8qIFRpbWVvdXQgKi8KLQkJCQkgIEVaVElNRU9VVCk7CisJCQkJICBCVUxLX1RJTUVPVVQpOwogCWlmIChlcnJjb2RlIDwgMCkgewogCQlkZXZfZXJyKCZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAogCQkJImNvbWVkaV86IGNvbnRyb2wgbXNnIGZhaWxlZCAoc3RvcClcbiIpOwpAQCAtODEwLDcgKzgxMSw3IEBACiAJCQkJICAvKiBsZW5ndGggKi8KIAkJCQkgIGxlbiwKIAkJCQkgIC8qIHRpbWVvdXQgKi8KLQkJCQkgIEVaVElNRU9VVCk7CisJCQkJICBCVUxLX1RJTUVPVVQpOwogCWRldl9kYmcoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGlfOiByZXN1bHQ9JWRcbiIsIGVycmNvZGUpOwogCWlmIChlcnJjb2RlIDwgMCkgewogCQlkZXZfZXJyKCZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpXzogdXBsb2FkIGZhaWxlZFxuIik7CkBAIC05NzksNyArOTgwLDcgQEAKIAogCS8qCiAJICogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUKLQkgKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGlibGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZQorCSAqIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJpbGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZQogCSAqLwogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRk9MTE9XICYmCiAJICAgIGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19FWFQgJiYKQEAgLTExMTAsNyArMTExMSw3IEBACiAJCQkgICAgICB1c2Jfc25kYnVsa3BpcGUodGhpc191c2JkdXhzdWItPnVzYmRldiwKIAkJCQkJICAgICAgQ09NTUFORF9PVVRfRVApLAogCQkJICAgICAgdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kcywgU0laRU9GRFVYQlVGRkVSLAotCQkJICAgICAgJm5zZW50LCAxMCk7CisJCQkgICAgICAmbnNlbnQsIEJVTEtfVElNRU9VVCk7CiAJaWYgKHJlc3VsdCA8IDApCiAJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwgImNvbWVkaSVkOiAiCiAJCQkiY291bGQgbm90IHRyYW5zbWl0IGR1eF9jb21tYW5kIHRvIHRoZSB1c2ItZGV2aWNlLCAiCkBAIC0xMTMwLDcgKzExMzEsNyBAQAogCQkJCSAgICAgIHVzYl9yY3ZidWxrcGlwZSh0aGlzX3VzYmR1eHN1Yi0+dXNiZGV2LAogCQkJCQkJICAgICAgQ09NTUFORF9JTl9FUCksCiAJCQkJICAgICAgdGhpc191c2JkdXhzdWItPmluc25CdWZmZXIsIFNJWkVJTlNOQlVGLAotCQkJCSAgICAgICZucmVjLCAxKTsKKwkJCQkgICAgICAmbnJlYywgQlVMS19USU1FT1VUKTsKIAkJaWYgKHJlc3VsdCA8IDApIHsKIAkJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwgImNvbWVkaSVkOiAiCiAJCQkJImluc246IFVTQiBlcnJvciAlZCB3aGlsZSByZWNlaXZpbmcgRFVYIGNvbW1hbmQiCkBAIC0xNTU3LDcgKzE1NTgsNyBAQAogCiAJLyoKIAkgKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZQotCSAqIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlCisJICogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmlsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlCiAJICovCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19GT0xMT1cgJiYKIAkgICAgY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0VYVCAmJgpAQCAtMjMyNyw5ICsyMzI4LDExIEBACiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZ1c2JkZXYtPmRldiwKIAkJCSJDb3VsZCBub3QgdXBsb2FkIGZpcm13YXJlIChlcnI9JWQpXG4iLCByZXQpOwotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCX0KIAljb21lZGlfdXNiX2F1dG9fY29uZmlnKHVzYmRldiwgQk9BUkROQU1FKTsKKyBvdXQ6CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CiB9CiAKIC8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHVyYnMgYW5kIGluaXRpYWxpc2UgdGhlbSAqLwpAQCAtMjU4MCw2ICsyNTgzLDcgQEAKIAkJCQkgICAgICBGV19BQ1RJT05fSE9UUExVRywKIAkJCQkgICAgICAidXNiZHV4X2Zpcm13YXJlLmJpbiIsCiAJCQkJICAgICAgJnVkZXYtPmRldiwKKwkJCQkgICAgICBHRlBfS0VSTkVMLAogCQkJCSAgICAgIHVzYmR1eHN1YiArIGluZGV4LAogCQkJCSAgICAgIHVzYmR1eF9maXJtd2FyZV9yZXF1ZXN0X2NvbXBsZXRlX2hhbmRsZXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4ZmFzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eGZhc3QuYwppbmRleCBkMTQzMjIyLi4yZTY3NWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4ZmFzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXhmYXN0LmMKQEAgLTE0NTEsMTAgKzE0NTEsMTIgQEAKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnVzYmRldi0+ZGV2LAogCQkJIkNvdWxkIG5vdCB1cGxvYWQgZmlybXdhcmUgKGVycj0lZClcbiIsIHJldCk7Ci0JCXJldHVybjsKKwkJZ290byBvdXQ7CiAJfQogCiAJY29tZWRpX3VzYl9hdXRvX2NvbmZpZyh1c2JkZXYsIEJPQVJETkFNRSk7Cisgb3V0OgorCXJlbGVhc2VfZmlybXdhcmUoZncpOwogfQogCiAvKgpAQCAtMTU2OSw2ICsxNTcxLDcgQEAKIAkJCQkgICAgICBGV19BQ1RJT05fSE9UUExVRywKIAkJCQkgICAgICAidXNiZHV4ZmFzdF9maXJtd2FyZS5iaW4iLAogCQkJCSAgICAgICZ1ZGV2LT5kZXYsCisJCQkJICAgICAgR0ZQX0tFUk5FTCwKIAkJCQkgICAgICB1c2JkdXhmYXN0c3ViICsgaW5kZXgsCiAJCQkJICAgICAgdXNiZHV4ZmFzdF9maXJtd2FyZV9yZXF1ZXN0X2NvbXBsZXRlX2hhbmRsZXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdm1rODB4eC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3ZtazgweHguYwppbmRleCBjMzM1MDQwLi5jMzRhMGI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdm1rODB4eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy92bWs4MHh4LmMKQEAgLTc2LDE4ICs3NiwxOCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHZtazgweHhfaWRfdGFibGVbXSA9IHsKLQl7VVNCX0RFVklDRSgweDEwY2YsIDB4NTUwMCksLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNTV9LAotCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg1NTAxKSwuZHJpdmVyX2luZm8gPSBERVZJQ0VfVk1LODA1NX0sCi0Je1VTQl9ERVZJQ0UoMHgxMGNmLCAweDU1MDIpLC5kcml2ZXJfaW5mbyA9IERFVklDRV9WTUs4MDU1fSwKLQl7VVNCX0RFVklDRSgweDEwY2YsIDB4NTUwMyksLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNTV9LAotCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg4MDYxKSwuZHJpdmVyX2luZm8gPSBERVZJQ0VfVk1LODA2MX0sCi0Je1VTQl9ERVZJQ0UoMHgxMGNmLCAweDgwNjIpLC5kcml2ZXJfaW5mbyA9IERFVklDRV9WTUs4MDYxfSwKLQl7VVNCX0RFVklDRSgweDEwY2YsIDB4ODA2MyksLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNjF9LAotCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg4MDY0KSwuZHJpdmVyX2luZm8gPSBERVZJQ0VfVk1LODA2MX0sCi0Je1VTQl9ERVZJQ0UoMHgxMGNmLCAweDgwNjUpLC5kcml2ZXJfaW5mbyA9IERFVklDRV9WTUs4MDYxfSwKLQl7VVNCX0RFVklDRSgweDEwY2YsIDB4ODA2NiksLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNjF9LAotCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg4MDY3KSwuZHJpdmVyX2luZm8gPSBERVZJQ0VfVk1LODA2MX0sCi0Je1VTQl9ERVZJQ0UoMHgxMGNmLCAweDgwNjgpLC5kcml2ZXJfaW5mbyA9IERFVklDRV9WTUs4MDYxfSwKKwl7VVNCX0RFVklDRSgweDEwY2YsIDB4NTUwMCksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9WTUs4MDU1fSwKKwl7VVNCX0RFVklDRSgweDEwY2YsIDB4NTUwMSksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9WTUs4MDU1fSwKKwl7VVNCX0RFVklDRSgweDEwY2YsIDB4NTUwMiksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9WTUs4MDU1fSwKKwl7VVNCX0RFVklDRSgweDEwY2YsIDB4NTUwMyksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9WTUs4MDU1fSwKKwl7VVNCX0RFVklDRSgweDEwY2YsIDB4ODA2MSksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9WTUs4MDYxfSwKKwl7VVNCX0RFVklDRSgweDEwY2YsIDB4ODA2MiksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9WTUs4MDYxfSwKKwl7VVNCX0RFVklDRSgweDEwY2YsIDB4ODA2MyksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9WTUs4MDYxfSwKKwl7VVNCX0RFVklDRSgweDEwY2YsIDB4ODA2NCksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9WTUs4MDYxfSwKKwl7VVNCX0RFVklDRSgweDEwY2YsIDB4ODA2NSksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9WTUs4MDYxfSwKKwl7VVNCX0RFVklDRSgweDEwY2YsIDB4ODA2NiksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9WTUs4MDYxfSwKKwl7VVNCX0RFVklDRSgweDEwY2YsIDB4ODA2NyksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9WTUs4MDYxfSwKKwl7VVNCX0RFVklDRSgweDEwY2YsIDB4ODA2OCksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9WTUs4MDYxfSwKIAl7fQkJCS8qIHRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLWNvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtY29yZS5jCmluZGV4IDhhY2VhZTUuLjY3ZjY4OWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtY29yZS5jCkBAIC0xNTIxLDcgKzE1MjEsNyBAQAogCS5yZXN1bWUgPSBOVUxMLAogfTsKIAotc3RhdGljIGludCBjeDI1ODIxX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGN4MjU4MjFfaW5pdCh2b2lkKQogewogCUlOSVRfTElTVF9IRUFEKCZjeDI1ODIxX2Rldmxpc3QpOwogCXByaW50ayhLRVJOX0lORk8gImN4MjU4MjEgZHJpdmVyIHZlcnNpb24gJWQuJWQuJWQgbG9hZGVkXG4iLApAQCAtMTUzMCw3ICsxNTMwLDcgQEAKIAlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmY3gyNTgyMV9wY2lfZHJpdmVyKTsKIH0KIAotc3RhdGljIHZvaWQgY3gyNTgyMV9maW5pKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgY3gyNTgyMV9maW5pKHZvaWQpCiB7CiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZjeDI1ODIxX3BjaV9kcml2ZXIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RyZWFtL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vS2NvbmZpZwppbmRleCA1MmJkMTg3ZC4uNGFmYTA4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RyZWFtL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL0tjb25maWcKQEAgLTEsMyArMSw3IEBACitjb25maWcgRFJFQU0KKyAgICAgICB0cmlzdGF0ZSAiSFRDIERyZWFtIHN1cHBvcnQiCisgICAgICAgZGVwZW5kcyBvbiBCUk9LRU4KKwogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvZHJlYW0vc21kL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2RyZWFtL2NhbWVyYS9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RyZWFtL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDdjODgwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL1RPRE8KQEAgLTAsMCArMSwxNCBAQAorKiByZW1vdmUgc3VwcG9ydCBmb3Igd2FrZWxvY2tzIHNpbmNlIHRob3NlIGFyZSBub3QgaW4gbWFpbmxpbmUKKworKiBjYW1lcmEgZHJpdmVyIHVzZXMgb2xkIFY0TCBBUEkKKworKiBjb2Rpbmcgc3R5bGUgaW4gc29tZSBwbGFjZXMgaXMgbGFja2luZworCisqIGdwaW9faW5wdXQuYyBoYXMgc29tZSBmZWF0dXJlcyBtYXRyaXhfa2V5cGFkIGxhY2tzLiBUaGV5IHNob3VsZCBiZQorbWVyZ2VkIHRvIGdwaW9faW5wdXQsIHdpdGggZ3Bpb19pbnB1dC5jIHJlbW92ZWQKKworKiBwbWVtIHByb3ZpZGVzIGludGVyZmFjZSBmb3IgdXNlcnNwYWNlLiBOZWVkcyB0byBiZSByZXZpZXdlZCBhdCBsZWFzdC4KKworKiBpdCBpcyBwcm9iYWJseSBwb3NzaWJsZSB0byBzaW1wbGlmeSB0b3VjaHNjcmVlbiBkcml2ZXIgdXNpbmcgdGhyZWFkZWRfaXJxJ3MuCisKKyogdG91Y2hzY3JlZW4gZHJpdmVyIHNob3VsZCBiZSBzd2l0Y2hlZCB0byBvZmljaWFsIG11bHRpdG91Y2ggQVBJCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vY2FtZXJhL21zbV9jYW1lcmEuYyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9jYW1lcmEvbXNtX2NhbWVyYS5jCmluZGV4IDg4MTY1OTkuLjdkOTM4NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9jYW1lcmEvbXNtX2NhbWVyYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9jYW1lcmEvbXNtX2NhbWVyYS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgogCiAjaW5jbHVkZSA8bGludXgvZnMuaD4KQEAgLTE1OTcsNyArMTU5OCw2IEBACiAJCU1TTV9EUkFJTl9RVUVVRShzeW5jLCBwaWN0X2ZyYW1lX3EpOwogCiAJCXN5bmMtPnNjdHJsLnNfcmVsZWFzZSgpOwotCQl3YWtlX3VubG9jaygmc3luYy0+d2FrZV9sb2NrKTsKIAogCQlzeW5jLT5hcHBzX2lkID0gTlVMTDsKIAkJQ0RCRygibXNtX3JlbGVhc2UgY29tcGxldGVkIVxuIik7CkBAIC0xODA2LDcgKzE4MDYsNiBAQAogCXN5bmMtPmFwcHNfaWQgPSBhcHBzX2lkOwogCiAJaWYgKCFzeW5jLT5vcGVuY250KSB7Ci0JCXdha2VfbG9jaygmc3luYy0+d2FrZV9sb2NrKTsKIAogCQltc21fY2FtdmZlX2ZuX2luaXQoJnN5bmMtPnZmZWZuLCBzeW5jKTsKIAkJaWYgKHN5bmMtPnZmZWZuLnZmZV9pbml0KSB7CkBAIC0yMDQ0LDggKzIwNDMsNiBAQAogCUlOSVRfTElTVF9IRUFEKCZzeW5jLT5waWN0X2ZyYW1lX3EpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN5bmMtPnBpY3RfZnJhbWVfd2FpdCk7CiAKLQl3YWtlX2xvY2tfaW5pdCgmc3luYy0+d2FrZV9sb2NrLCBXQUtFX0xPQ0tfSURMRSwgIm1zbV9jYW1lcmEiKTsKLQogCXJjID0gbXNtX2NhbWlvX3Byb2JlX29uKHBkZXYpOwogCWlmIChyYyA8IDApCiAJCXJldHVybiByYzsKQEAgLTIwNTgsNyArMjA1NSw2IEBACiAJaWYgKHJjIDwgMCkgewogCQlwcl9lcnIoIm1zbV9jYW1lcmE6IGZhaWxlZCB0byBpbml0aWFsaXplICVzXG4iLAogCQkJc3luYy0+c2RhdGEtPnNlbnNvcl9uYW1lKTsKLQkJd2FrZV9sb2NrX2Rlc3Ryb3koJnN5bmMtPndha2VfbG9jayk7CiAJCXJldHVybiByYzsKIAl9CiAKQEAgLTIwNzAsNyArMjA2Niw2IEBACiAKIHN0YXRpYyBpbnQgbXNtX3N5bmNfZGVzdHJveShzdHJ1Y3QgbXNtX3N5bmMgKnN5bmMpCiB7Ci0Jd2FrZV9sb2NrX2Rlc3Ryb3koJnN5bmMtPndha2VfbG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9jYW1lcmEvbXNtX3ZmZTd4LmMgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vY2FtZXJhL21zbV92ZmU3eC5jCmluZGV4IDVkZTk2YzUuLjMzYWIzYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9jYW1lcmEvbXNtX3ZmZTd4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL2NhbWVyYS9tc21fdmZlN3guYwpAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tc21fYWRzcC5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvYW5kcm9pZF9wbWVtLmg+CiAjaW5jbHVkZSA8bWFjaC9tc21fYWRzcC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vZ2VuZXJpY19ncGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vZ2VuZXJpY19ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUyNGQzOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9nZW5lcmljX2dwaW8uYwpAQCAtMCwwICsxLDI3NCBAQAorLyogYXJjaC9hcm0vbWFjaC1tc20vZ2VuZXJpY19ncGlvLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgR29vZ2xlLCBJbmMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8uaD4KKyNpbmNsdWRlICJncGlvX2NoaXAuaCIKKworI2RlZmluZSBHUElPX05VTV9UT19DSElQX0lOREVYKGdwaW8pICgoZ3Bpbyk+PjUpCisKK3N0cnVjdCBncGlvX3N0YXRlIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZWZjb3VudDsKK307CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZ3Bpb19jaGlwc19sb2NrKTsKK3N0YXRpYyBMSVNUX0hFQUQoZ3Bpb19jaGlwX2xpc3QpOworc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgKipncGlvX2NoaXBfYXJyYXk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBncGlvX2NoaXBfYXJyYXlfc2l6ZTsKKworaW50IHJlZ2lzdGVyX2dwaW9fY2hpcChzdHJ1Y3QgZ3Bpb19jaGlwICpuZXdfZ3Bpb19jaGlwKQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBncGlvX2NoaXAgKmdwaW9fY2hpcDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKwl1bnNpZ25lZCBpbnQgY2hpcF9hcnJheV9zdGFydF9pbmRleCwgY2hpcF9hcnJheV9lbmRfaW5kZXg7CisKKwluZXdfZ3Bpb19jaGlwLT5zdGF0ZSA9IGt6YWxsb2MoKG5ld19ncGlvX2NoaXAtPmVuZCArIDEgLSBuZXdfZ3Bpb19jaGlwLT5zdGFydCkgKiBzaXplb2YobmV3X2dwaW9fY2hpcC0+c3RhdGVbMF0pLCBHRlBfS0VSTkVMKTsKKwlpZiAobmV3X2dwaW9fY2hpcC0+c3RhdGUgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgInJlZ2lzdGVyX2dwaW9fY2hpcDogZmFpbGVkIHRvIGFsbG9jYXRlIHN0YXRlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fY2hpcHNfbG9jaywgaXJxX2ZsYWdzKTsKKwljaGlwX2FycmF5X3N0YXJ0X2luZGV4ID0gR1BJT19OVU1fVE9fQ0hJUF9JTkRFWChuZXdfZ3Bpb19jaGlwLT5zdGFydCk7CisJY2hpcF9hcnJheV9lbmRfaW5kZXggPSBHUElPX05VTV9UT19DSElQX0lOREVYKG5ld19ncGlvX2NoaXAtPmVuZCk7CisJaWYgKGNoaXBfYXJyYXlfZW5kX2luZGV4ID49IGdwaW9fY2hpcF9hcnJheV9zaXplKSB7CisJCXN0cnVjdCBncGlvX2NoaXAgKipuZXdfZ3Bpb19jaGlwX2FycmF5OworCQl1bnNpZ25lZCBsb25nIG5ld19ncGlvX2NoaXBfYXJyYXlfc2l6ZSA9IGNoaXBfYXJyYXlfZW5kX2luZGV4ICsgMTsKKworCQluZXdfZ3Bpb19jaGlwX2FycmF5ID0ga21hbGxvYyhuZXdfZ3Bpb19jaGlwX2FycmF5X3NpemUgKiBzaXplb2YobmV3X2dwaW9fY2hpcF9hcnJheVswXSksIEdGUF9BVE9NSUMpOworCQlpZiAobmV3X2dwaW9fY2hpcF9hcnJheSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInJlZ2lzdGVyX2dwaW9fY2hpcDogZmFpbGVkIHRvIGFsbG9jYXRlIGFycmF5XG4iKTsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgZ3Bpb19jaGlwX2FycmF5X3NpemU7IGkrKykKKwkJCW5ld19ncGlvX2NoaXBfYXJyYXlbaV0gPSBncGlvX2NoaXBfYXJyYXlbaV07CisJCWZvciAoaSA9IGdwaW9fY2hpcF9hcnJheV9zaXplOyBpIDwgbmV3X2dwaW9fY2hpcF9hcnJheV9zaXplOyBpKyspCisJCQluZXdfZ3Bpb19jaGlwX2FycmF5W2ldID0gTlVMTDsKKwkJZ3Bpb19jaGlwX2FycmF5ID0gbmV3X2dwaW9fY2hpcF9hcnJheTsKKwkJZ3Bpb19jaGlwX2FycmF5X3NpemUgPSBuZXdfZ3Bpb19jaGlwX2FycmF5X3NpemU7CisJfQorCWxpc3RfZm9yX2VhY2hfZW50cnkoZ3Bpb19jaGlwLCAmZ3Bpb19jaGlwX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGdwaW9fY2hpcC0+c3RhcnQgPiBuZXdfZ3Bpb19jaGlwLT5lbmQpIHsKKwkJCWxpc3RfYWRkX3RhaWwoJm5ld19ncGlvX2NoaXAtPmxpc3QsICZncGlvX2NoaXAtPmxpc3QpOworCQkJZ290byBhZGRlZDsKKwkJfQorCQlpZiAoZ3Bpb19jaGlwLT5lbmQgPj0gbmV3X2dwaW9fY2hpcC0+c3RhcnQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAicmVnaXN0ZXJfZ3Bpb19zb3VyY2UgJXUtJXUgb3ZlcmxhcHMgd2l0aCAldS0ldVxuIiwKKwkJCSAgICAgICBuZXdfZ3Bpb19jaGlwLT5zdGFydCwgbmV3X2dwaW9fY2hpcC0+ZW5kLAorCQkJICAgICAgIGdwaW9fY2hpcC0+c3RhcnQsIGdwaW9fY2hpcC0+ZW5kKTsKKwkJCWVyciA9IC1FQlVTWTsKKwkJCWdvdG8gZmFpbGVkOworCQl9CisJfQorCWxpc3RfYWRkX3RhaWwoJm5ld19ncGlvX2NoaXAtPmxpc3QsICZncGlvX2NoaXBfbGlzdCk7CithZGRlZDoKKwlmb3IgKGkgPSBjaGlwX2FycmF5X3N0YXJ0X2luZGV4OyBpIDw9IGNoaXBfYXJyYXlfZW5kX2luZGV4OyBpKyspIHsKKwkJaWYgKGdwaW9fY2hpcF9hcnJheVtpXSA9PSBOVUxMIHx8IGdwaW9fY2hpcF9hcnJheVtpXS0+c3RhcnQgPiBuZXdfZ3Bpb19jaGlwLT5zdGFydCkKKwkJCWdwaW9fY2hpcF9hcnJheVtpXSA9IG5ld19ncGlvX2NoaXA7CisJfQorZmFpbGVkOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fY2hpcHNfbG9jaywgaXJxX2ZsYWdzKTsKKwlpZiAoZXJyKQorCQlrZnJlZShuZXdfZ3Bpb19jaGlwLT5zdGF0ZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgKmdldF9ncGlvX2NoaXBfbG9ja2VkKHVuc2lnbmVkIGludCBncGlvKQoreworCXVuc2lnbmVkIGxvbmcgaTsKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwOworCisJaSA9IEdQSU9fTlVNX1RPX0NISVBfSU5ERVgoZ3Bpbyk7CisJaWYgKGkgPj0gZ3Bpb19jaGlwX2FycmF5X3NpemUpCisJCXJldHVybiBOVUxMOworCWNoaXAgPSBncGlvX2NoaXBfYXJyYXlbaV07CisJaWYgKGNoaXAgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9mcm9tKGNoaXAsICZncGlvX2NoaXBfbGlzdCwgbGlzdCkgeworCQlpZiAoZ3BpbyA8IGNoaXAtPnN0YXJ0KQorCQkJcmV0dXJuIE5VTEw7CisJCWlmIChncGlvIDw9IGNoaXAtPmVuZCkKKwkJCXJldHVybiBjaGlwOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCByZXF1ZXN0X2dwaW8odW5zaWduZWQgaW50IGdwaW8sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGdwaW9fY2hpcCAqY2hpcDsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKwl1bnNpZ25lZCBsb25nIGNoaXBfaW5kZXg7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19jaGlwc19sb2NrLCBpcnFfZmxhZ3MpOworCWNoaXAgPSBnZXRfZ3Bpb19jaGlwX2xvY2tlZChncGlvKTsKKwlpZiAoY2hpcCA9PSBOVUxMKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKwljaGlwX2luZGV4ID0gZ3BpbyAtIGNoaXAtPnN0YXJ0OworCWlmIChjaGlwLT5zdGF0ZVtjaGlwX2luZGV4XS5yZWZjb3VudCA9PSAwKSB7CisJCWNoaXAtPmNvbmZpZ3VyZShjaGlwLCBncGlvLCBmbGFncyk7CisJCWNoaXAtPnN0YXRlW2NoaXBfaW5kZXhdLmZsYWdzID0gZmxhZ3M7CisJCWNoaXAtPnN0YXRlW2NoaXBfaW5kZXhdLnJlZmNvdW50Kys7CisJfSBlbHNlIGlmICgoZmxhZ3MgJiBJUlFGX1NIQVJFRCkgJiYgKGNoaXAtPnN0YXRlW2NoaXBfaW5kZXhdLmZsYWdzICYgSVJRRl9TSEFSRUQpKQorCQljaGlwLT5zdGF0ZVtjaGlwX2luZGV4XS5yZWZjb3VudCsrOworCWVsc2UKKwkJZXJyID0gLUVCVVNZOworZXJyOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fY2hpcHNfbG9jaywgaXJxX2ZsYWdzKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgZ3Bpb19yZXF1ZXN0KHVuc2lnbmVkIGdwaW8sIGNvbnN0IGNoYXIgKmxhYmVsKQoreworCXJldHVybiByZXF1ZXN0X2dwaW8oZ3BpbywgMCk7Cit9CitFWFBPUlRfU1lNQk9MKGdwaW9fcmVxdWVzdCk7CisKK3ZvaWQgZ3Bpb19mcmVlKHVuc2lnbmVkIGdwaW8pCit7CisJc3RydWN0IGdwaW9fY2hpcCAqY2hpcDsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKwl1bnNpZ25lZCBsb25nIGNoaXBfaW5kZXg7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19jaGlwc19sb2NrLCBpcnFfZmxhZ3MpOworCWNoaXAgPSBnZXRfZ3Bpb19jaGlwX2xvY2tlZChncGlvKTsKKwlpZiAoY2hpcCkgeworCQljaGlwX2luZGV4ID0gZ3BpbyAtIGNoaXAtPnN0YXJ0OworCQljaGlwLT5zdGF0ZVtjaGlwX2luZGV4XS5yZWZjb3VudC0tOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2NoaXBzX2xvY2ssIGlycV9mbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGdwaW9fZnJlZSk7CisKK3N0YXRpYyBpbnQgZ3Bpb19nZXRfaXJxX251bSh1bnNpZ25lZCBpbnQgZ3BpbywgdW5zaWduZWQgaW50ICppcnFwLCB1bnNpZ25lZCBsb25nICppcnFudW1mbGFnc3ApCit7CisJaW50IHJldCA9IC1FTk9UU1VQUDsKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwOworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fY2hpcHNfbG9jaywgaXJxX2ZsYWdzKTsKKwljaGlwID0gZ2V0X2dwaW9fY2hpcF9sb2NrZWQoZ3Bpbyk7CisJaWYgKGNoaXAgJiYgY2hpcC0+Z2V0X2lycV9udW0pCisJCXJldCA9IGNoaXAtPmdldF9pcnFfbnVtKGNoaXAsIGdwaW8sIGlycXAsIGlycW51bWZsYWdzcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19jaGlwc19sb2NrLCBpcnFfZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBncGlvX3RvX2lycSh1bnNpZ25lZCBncGlvKQoreworCWludCByZXQsIGlycTsKKwlyZXQgPSBncGlvX2dldF9pcnFfbnVtKGdwaW8sICZpcnEsIE5VTEwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIGlycTsKK30KK0VYUE9SVF9TWU1CT0woZ3Bpb190b19pcnEpOworCitpbnQgZ3Bpb19jb25maWd1cmUodW5zaWduZWQgaW50IGdwaW8sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJaW50IHJldCA9IC1FTk9UU1VQUDsKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwOworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fY2hpcHNfbG9jaywgaXJxX2ZsYWdzKTsKKwljaGlwID0gZ2V0X2dwaW9fY2hpcF9sb2NrZWQoZ3Bpbyk7CisJaWYgKGNoaXApCisJCXJldCA9IGNoaXAtPmNvbmZpZ3VyZShjaGlwLCBncGlvLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19jaGlwc19sb2NrLCBpcnFfZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGdwaW9fY29uZmlndXJlKTsKKworaW50IGdwaW9fZGlyZWN0aW9uX2lucHV0KHVuc2lnbmVkIGdwaW8pCit7CisJcmV0dXJuIGdwaW9fY29uZmlndXJlKGdwaW8sIEdQSU9GX0lOUFVUKTsKK30KK0VYUE9SVF9TWU1CT0woZ3Bpb19kaXJlY3Rpb25faW5wdXQpOworCitpbnQgZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSkKK3sKKwlncGlvX3NldF92YWx1ZShncGlvLCB2YWx1ZSk7CisJcmV0dXJuIGdwaW9fY29uZmlndXJlKGdwaW8sIEdQSU9GX0RSSVZFX09VVFBVVCk7Cit9CitFWFBPUlRfU1lNQk9MKGdwaW9fZGlyZWN0aW9uX291dHB1dCk7CisKK2ludCBncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBncGlvKQoreworCWludCByZXQgPSAtRU5PVFNVUFA7CisJc3RydWN0IGdwaW9fY2hpcCAqY2hpcDsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2NoaXBzX2xvY2ssIGlycV9mbGFncyk7CisJY2hpcCA9IGdldF9ncGlvX2NoaXBfbG9ja2VkKGdwaW8pOworCWlmIChjaGlwICYmIGNoaXAtPnJlYWQpCisJCXJldCA9IGNoaXAtPnJlYWQoY2hpcCwgZ3Bpbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19jaGlwc19sb2NrLCBpcnFfZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGdwaW9fZ2V0X3ZhbHVlKTsKKwordm9pZCBncGlvX3NldF92YWx1ZSh1bnNpZ25lZCBncGlvLCBpbnQgb24pCit7CisJaW50IHJldCA9IC1FTk9UU1VQUDsKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwOworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fY2hpcHNfbG9jaywgaXJxX2ZsYWdzKTsKKwljaGlwID0gZ2V0X2dwaW9fY2hpcF9sb2NrZWQoZ3Bpbyk7CisJaWYgKGNoaXAgJiYgY2hpcC0+d3JpdGUpCisJCXJldCA9IGNoaXAtPndyaXRlKGNoaXAsIGdwaW8sIG9uKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2NoaXBzX2xvY2ssIGlycV9mbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGdwaW9fc2V0X3ZhbHVlKTsKKworaW50IGdwaW9fcmVhZF9kZXRlY3Rfc3RhdHVzKHVuc2lnbmVkIGludCBncGlvKQoreworCWludCByZXQgPSAtRU5PVFNVUFA7CisJc3RydWN0IGdwaW9fY2hpcCAqY2hpcDsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2NoaXBzX2xvY2ssIGlycV9mbGFncyk7CisJY2hpcCA9IGdldF9ncGlvX2NoaXBfbG9ja2VkKGdwaW8pOworCWlmIChjaGlwICYmIGNoaXAtPnJlYWRfZGV0ZWN0X3N0YXR1cykKKwkJcmV0ID0gY2hpcC0+cmVhZF9kZXRlY3Rfc3RhdHVzKGNoaXAsIGdwaW8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fY2hpcHNfbG9jaywgaXJxX2ZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChncGlvX3JlYWRfZGV0ZWN0X3N0YXR1cyk7CisKK2ludCBncGlvX2NsZWFyX2RldGVjdF9zdGF0dXModW5zaWduZWQgaW50IGdwaW8pCit7CisJaW50IHJldCA9IC1FTk9UU1VQUDsKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwOworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fY2hpcHNfbG9jaywgaXJxX2ZsYWdzKTsKKwljaGlwID0gZ2V0X2dwaW9fY2hpcF9sb2NrZWQoZ3Bpbyk7CisJaWYgKGNoaXAgJiYgY2hpcC0+Y2xlYXJfZGV0ZWN0X3N0YXR1cykKKwkJcmV0ID0gY2hpcC0+Y2xlYXJfZGV0ZWN0X3N0YXR1cyhjaGlwLCBncGlvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2NoaXBzX2xvY2ssIGlycV9mbGFncyk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZ3Bpb19jbGVhcl9kZXRlY3Rfc3RhdHVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9ncGlvX2V2ZW50LmMgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vZ3Bpb19ldmVudC5jCmluZGV4IDhiNjRjMWUuLmU2MGUyYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9ncGlvX2V2ZW50LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL2dwaW9fZXZlbnQuYwpAQCAtMTMsNyArMTMsNyBAQAogICoKICAqLwogCi0jaW5jbHVkZSA8bGludXgvZWFybHlzdXNwZW5kLmg+CisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW9fZXZlbnQuaD4KQEAgLTIzLDcgKzIzLDYgQEAKIHN0cnVjdCBncGlvX2V2ZW50IHsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CiAJY29uc3Qgc3RydWN0IGdwaW9fZXZlbnRfcGxhdGZvcm1fZGF0YSAqaW5mbzsKLQlzdHJ1Y3QgZWFybHlfc3VzcGVuZCBlYXJseV9zdXNwZW5kOwogCXZvaWQgKnN0YXRlWzBdOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RyZWFtL2dwaW9faW5wdXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9ncGlvX2lucHV0LmMKaW5kZXggN2UzMDdmMi4uMDYzOGVjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RyZWFtL2dwaW9faW5wdXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vZ3Bpb19pbnB1dC5jCkBAIC0xOSw3ICsxOSw2IEBACiAjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvd2FrZWxvY2suaD4KIAogZW51bSB7CiAJREVCT1VOQ0VfVU5TVEFCTEUgICAgID0gQklUKDApLAkvKiBHb3QgaXJxLCB3aGlsZSBkZWJvdW5jaW5nICovCkBAIC00NCw3ICs0Myw2IEBACiAJaW50IHVzZV9pcnE7CiAJaW50IGRlYm91bmNlX2NvdW50OwogCXNwaW5sb2NrX3QgaXJxX2xvY2s7Ci0Jc3RydWN0IHdha2VfbG9jayB3YWtlX2xvY2s7CiAJc3RydWN0IGdwaW9fa2V5X3N0YXRlIGtleV9zdGF0ZVswXTsKIH07CiAKQEAgLTE0Myw4ICsxNDEsNiBAQAogCQlocnRpbWVyX3N0YXJ0KHRpbWVyLCBkcy0+aW5mby0+ZGVib3VuY2VfdGltZSwgSFJUSU1FUl9NT0RFX1JFTCk7CiAJZWxzZSBpZiAoIWRzLT51c2VfaXJxKQogCQlocnRpbWVyX3N0YXJ0KHRpbWVyLCBkcy0+aW5mby0+cG9sbF90aW1lLCBIUlRJTUVSX01PREVfUkVMKTsKLQllbHNlCi0JCXdha2VfdW5sb2NrKCZkcy0+d2FrZV9sb2NrKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzLT5pcnFfbG9jaywgaXJxZmxhZ3MpOwogCkBAIC0xNzAsNyArMTY2LDYgQEAKIAkJaWYgKGtzLT5kZWJvdW5jZSAmIERFQk9VTkNFX1dBSVRfSVJRKSB7CiAJCQlrcy0+ZGVib3VuY2UgPSBERUJPVU5DRV9VTktOT1dOOwogCQkJaWYgKGRzLT5kZWJvdW5jZV9jb3VudCsrID09IDApIHsKLQkJCQl3YWtlX2xvY2soJmRzLT53YWtlX2xvY2spOwogCQkJCWhydGltZXJfc3RhcnQoCiAJCQkJCSZkcy0+dGltZXIsIGRzLT5pbmZvLT5kZWJvdW5jZV90aW1lLAogCQkJCQlIUlRJTUVSX01PREVfUkVMKTsKQEAgLTI3Nyw3ICsyNzIsNiBAQAogCQlkcy0+ZGVib3VuY2VfY291bnQgPSBkaS0+a2V5bWFwX3NpemU7CiAJCWRzLT5pbnB1dF9kZXYgPSBpbnB1dF9kZXY7CiAJCWRzLT5pbmZvID0gZGk7Ci0JCXdha2VfbG9ja19pbml0KCZkcy0+d2FrZV9sb2NrLCBXQUtFX0xPQ0tfU1VTUEVORCwgImdwaW9faW5wdXQiKTsKIAkJc3Bpbl9sb2NrX2luaXQoJmRzLT5pcnFfbG9jayk7CiAKIAkJZm9yIChpID0gMDsgaSA8IGRpLT5rZXltYXBfc2l6ZTsgaSsrKSB7CkBAIC0zMzYsNyArMzMwLDYgQEAKIGVycl9ncGlvX3JlcXVlc3RfZmFpbGVkOgogCQk7CiAJfQotCXdha2VfbG9ja19kZXN0cm95KCZkcy0+d2FrZV9sb2NrKTsKIAlrZnJlZShkcyk7CiBlcnJfZHNfYWxsb2NfZmFpbGVkOgogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vZ3Bpb19tYXRyaXguYyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9ncGlvX21hdHJpeC5jCmluZGV4IGMxZjQ3NjUuLjc5NmRlNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9ncGlvX21hdHJpeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9ncGlvX21hdHJpeC5jCkBAIC0xOCwxMyArMTgsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9ncGlvX2V2ZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3dha2Vsb2NrLmg+CiAKIHN0cnVjdCBncGlvX2twIHsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CiAJc3RydWN0IGdwaW9fZXZlbnRfbWF0cml4X2luZm8gKmtleXBhZF9pbmZvOwogCXN0cnVjdCBocnRpbWVyIHRpbWVyOwotCXN0cnVjdCB3YWtlX2xvY2sgd2FrZV9sb2NrOwogCWludCBjdXJyZW50X291dHB1dDsKIAl1bnNpZ25lZCBpbnQgdXNlX2lycToxOwogCXVuc2lnbmVkIGludCBrZXlfc3RhdGVfY2hhbmdlZDoxOwpAQCAtMTk5LDcgKzE5Nyw2IEBACiAJfQogCWZvciAoaW4gPSAwOyBpbiA8IG1pLT5uaW5wdXRzOyBpbisrKQogCQllbmFibGVfaXJxKGdwaW9fdG9faXJxKG1pLT5pbnB1dF9ncGlvc1tpbl0pKTsKLQl3YWtlX3VubG9jaygma3AtPndha2VfbG9jayk7CiAJcmV0dXJuIEhSVElNRVJfTk9SRVNUQVJUOwogfQogCkBAIC0yMjIsNyArMjE5LDYgQEAKIAkJZWxzZQogCQkJZ3Bpb19kaXJlY3Rpb25faW5wdXQobWktPm91dHB1dF9ncGlvc1tpXSk7CiAJfQotCXdha2VfbG9jaygma3AtPndha2VfbG9jayk7CiAJaHJ0aW1lcl9zdGFydCgma3AtPnRpbWVyLCBrdGltZV9zZXQoMCwgMCksIEhSVElNRVJfTU9ERV9SRUwpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTM2Myw3ICszNTksNiBAQAogCiAJCWhydGltZXJfaW5pdCgma3AtPnRpbWVyLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9SRUwpOwogCQlrcC0+dGltZXIuZnVuY3Rpb24gPSBncGlvX2tleXBhZF90aW1lcl9mdW5jOwotCQl3YWtlX2xvY2tfaW5pdCgma3AtPndha2VfbG9jaywgV0FLRV9MT0NLX1NVU1BFTkQsICJncGlvX2twIik7CiAJCWVyciA9IGdwaW9fa2V5cGFkX3JlcXVlc3RfaXJxcyhrcCk7CiAJCWtwLT51c2VfaXJxID0gZXJyID09IDA7CiAKQEAgLTM3MSw4ICszNjYsNiBAQAogCQkJImluICVzIG1vZGVcbiIsIGlucHV0X2Rldi0+bmFtZSwKIAkJCWtwLT51c2VfaXJxID8gImludGVycnVwdCIgOiAicG9sbGluZyIpOwogCi0JCWlmIChrcC0+dXNlX2lycSkKLQkJCXdha2VfbG9jaygma3AtPndha2VfbG9jayk7CiAJCWhydGltZXJfc3RhcnQoJmtwLT50aW1lciwga3RpbWVfc2V0KDAsIDApLCBIUlRJTUVSX01PREVfUkVMKTsKIAogCQlyZXR1cm4gMDsKQEAgLTM4Niw3ICszNzksNiBAQAogCQkJZnJlZV9pcnEoZ3Bpb190b19pcnEobWktPmlucHV0X2dwaW9zW2ldKSwga3ApOwogCiAJaHJ0aW1lcl9jYW5jZWwoJmtwLT50aW1lcik7Ci0Jd2FrZV9sb2NrX2Rlc3Ryb3koJmtwLT53YWtlX2xvY2spOwogCWZvciAoaSA9IG1pLT5ub3V0cHV0cyAtIDE7IGkgPj0gMDsgaS0tKSB7CiBlcnJfZ3Bpb19kaXJlY3Rpb25faW5wdXRfZmFpbGVkOgogCQlncGlvX2ZyZWUobWktPmlucHV0X2dwaW9zW2ldKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9wbWVtLmMgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vcG1lbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZjY0NjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vcG1lbS5jCkBAIC0wLDAgKzEsMTMzNSBAQAorLyogZHJpdmVycy9hbmRyb2lkL3BtZW0uYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBHb29nbGUsIEluYy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9hbmRyb2lkX3BtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1wb2xpY3kuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKworI2RlZmluZSBQTUVNX01BWF9ERVZJQ0VTIDEwCisjZGVmaW5lIFBNRU1fTUFYX09SREVSIDEyOAorI2RlZmluZSBQTUVNX01JTl9BTExPQyBQQUdFX1NJWkUKKworI2RlZmluZSBQTUVNX0RFQlVHIDEKKworLyogaW5kaWNhdGVzIHRoYXQgYSByZWZlcm5jZSB0byB0aGlzIGZpbGUgaGFzIGJlZW4gdGFrZW4gdmlhIGdldF9wbWVtX2ZpbGUsCisgKiB0aGUgZmlsZSBzaG91bGQgbm90IGJlIHJlbGVhc2VkIHVudGlsIHB1dF9wbWVtX2ZpbGUgaXMgY2FsbGVkICovCisjZGVmaW5lIFBNRU1fRkxBR1NfQlVTWSAweDEKKy8qIGluZGljYXRlcyB0aGF0IHRoaXMgaXMgYSBzdWJhbGxvY2F0aW9uIG9mIGEgbGFyZ2VyIG1hc3RlciByYW5nZSAqLworI2RlZmluZSBQTUVNX0ZMQUdTX0NPTk5FQ1RFRCAweDEgPDwgMQorLyogaW5kaWNhdGVzIHRoaXMgaXMgYSBtYXN0ZXIgYW5kIG5vdCBhIHN1YiBhbGxvY2F0aW9uIGFuZCB0aGF0IGl0IGlzIG1tYXBlZCAqLworI2RlZmluZSBQTUVNX0ZMQUdTX01BU1RFUk1BUCAweDEgPDwgMgorLyogc3VibWFwIGFuZCB1bnN1Ym1hcCBmbGFncyBpbmRpY2F0ZToKKyAqIDAwOiBzdWJyZWdpb24gaGFzIG5ldmVyIGJlZW4gbW1hcGVkCisgKiAxMDogc3VicmVnaW9uIGhhcyBiZWVuIG1tYXBlZCwgcmVmZXJlbmNlIHRvIHRoZSBtbSB3YXMgdGFrZW4KKyAqIDExOiBzdWJyZXRpb24gaGFzIGJlbiByZWxlYXNlZCwgcmVmZXJuZWNlIHRvIHRoZSBtbSBzdGlsbCBoZWxkCisgKiAwMTogc3VicmV0aW9uIGhhcyBiZWVuIHJlbGVhc2VkLCByZWZlcmVuY2UgdG8gdGhlIG1tIGhhcyBiZWVuIHJlbGVhc2VkCisgKi8KKyNkZWZpbmUgUE1FTV9GTEFHU19TVUJNQVAgMHgxIDw8IDMKKyNkZWZpbmUgUE1FTV9GTEFHU19VTlNVQk1BUCAweDEgPDwgNAorCisKK3N0cnVjdCBwbWVtX2RhdGEgeworCS8qIGluIGFsbG9jIG1vZGU6IGFuIGluZGV4IGludG8gdGhlIGJpdG1hcAorCSAqIGluIG5vX2FsbG9jIG1vZGU6IHRoZSBzaXplIG9mIHRoZSBhbGxvY2F0aW9uICovCisJaW50IGluZGV4OworCS8qIHNlZSBmbGFncyBhYm92ZSBmb3IgZGVzY3JpcHRpb25zICovCisJdW5zaWduZWQgaW50IGZsYWdzOworCS8qIHByb3RlY3RzIHRoaXMgZGF0YSBmaWVsZCwgaWYgdGhlIG1tX21tYXAgc2VtIHdpbGwgYmUgaGVsZCBhdCB0aGUKKwkgKiBzYW1lIHRpbWUgYXMgdGhpcyBzZW0sIHRoZSBtbSBzZW0gbXVzdCBiZSB0YWtlbiBmaXJzdCAoYXMgdGhpcyBpcworCSAqIHRoZSBvcmRlciBmb3Igdm1hX29wZW4gYW5kIHZtYV9jbG9zZSBvcHMgKi8KKwlzdHJ1Y3Qgcndfc2VtYXBob3JlIHNlbTsKKwkvKiBpbmZvIGFib3V0IHRoZSBtbWFwaW5nIHByb2Nlc3MgKi8KKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwkvKiB0YXNrIHN0cnVjdCBvZiB0aGUgbWFwcGluZyBwcm9jZXNzICovCisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCS8qIHByb2Nlc3MgaWQgb2YgdGVoIG1hcHBpbmcgcHJvY2VzcyAqLworCXBpZF90IHBpZDsKKwkvKiBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIG1hc3RlciAqLworCWludCBtYXN0ZXJfZmQ7CisJLyogZmlsZSBzdHJ1Y3Qgb2YgdGhlIG1hc3RlciAqLworCXN0cnVjdCBmaWxlICptYXN0ZXJfZmlsZTsKKwkvKiBhIGxpc3Qgb2YgY3VycmVudGx5IGF2YWlsYWJsZSByZWdpb25zIGlmIHRoaXMgaXMgYSBzdWJhbGxvY2F0aW9uICovCisJc3RydWN0IGxpc3RfaGVhZCByZWdpb25fbGlzdDsKKwkvKiBhIGxpbmtlZCBsaXN0IG9mIGRhdGEgc28gd2UgY2FuIGFjY2VzcyB0aGVtIGZvciBkZWJ1Z2dpbmcgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisjaWYgUE1FTV9ERUJVRworCWludCByZWY7CisjZW5kaWYKK307CisKK3N0cnVjdCBwbWVtX2JpdHMgeworCXVuc2lnbmVkIGFsbG9jYXRlZDoxOwkJLyogMSBpZiBhbGxvY2F0ZWQsIDAgaWYgZnJlZSAqLworCXVuc2lnbmVkIG9yZGVyOjc7CQkvKiBzaXplIG9mIHRoZSByZWdpb24gaW4gcG1lbSBzcGFjZSAqLworfTsKKworc3RydWN0IHBtZW1fcmVnaW9uX25vZGUgeworCXN0cnVjdCBwbWVtX3JlZ2lvbiByZWdpb247CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworI2RlZmluZSBQTUVNX0RFQlVHX01TR1MgMAorI2lmIFBNRU1fREVCVUdfTVNHUworI2RlZmluZSBETE9HKGZtdCxhcmdzLi4uKSBcCisJZG8geyBwcmludGsoS0VSTl9JTkZPICJbJXM6JXM6JWRdICJmbXQsIF9fRklMRV9fLCBfX2Z1bmNfXywgX19MSU5FX18sIFwKKwkJICAgICMjYXJncyk7IH0gXAorCXdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgRExPRyh4Li4uKSBkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgorCitzdHJ1Y3QgcG1lbV9pbmZvIHsKKwlzdHJ1Y3QgbWlzY2RldmljZSBkZXY7CisJLyogcGh5c2ljYWwgc3RhcnQgYWRkcmVzcyBvZiB0aGUgcmVtYXBlZCBwbWVtIHNwYWNlICovCisJdW5zaWduZWQgbG9uZyBiYXNlOworCS8qIHZpdHVhbCBzdGFydCBhZGRyZXNzIG9mIHRoZSByZW1hcGVkIHBtZW0gc3BhY2UgKi8KKwl1bnNpZ25lZCBjaGFyIF9faW9tZW0gKnZiYXNlOworCS8qIHRvdGFsIHNpemUgb2YgdGhlIHBtZW0gc3BhY2UgKi8KKwl1bnNpZ25lZCBsb25nIHNpemU7CisJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHBtZW0gc3BhY2UgKi8KKwl1bnNpZ25lZCBsb25nIG51bV9lbnRyaWVzOworCS8qIHBmbiBvZiB0aGUgZ2FyYmFnZSBwYWdlIGluIG1lbW9yeSAqLworCXVuc2lnbmVkIGxvbmcgZ2FyYmFnZV9wZm47CisJLyogaW5kZXggb2YgdGhlIGdhcmJhZ2UgcGFnZSBpbiB0aGUgcG1lbSBzcGFjZSAqLworCWludCBnYXJiYWdlX2luZGV4OworCS8qIHRoZSBiaXRtYXAgZm9yIHRoZSByZWdpb24gaW5kaWNhdGluZyB3aGljaCBlbnRyaWVzIGFyZSBhbGxvY2F0ZWQKKwkgKiBhbmQgd2hpY2ggYXJlIGZyZWUgKi8KKwlzdHJ1Y3QgcG1lbV9iaXRzICpiaXRtYXA7CisJLyogaW5kaWNhdGVzIHRoZSByZWdpb24gc2hvdWxkIG5vdCBiZSBtYW5hZ2VkIHdpdGggYW4gYWxsb2NhdG9yICovCisJdW5zaWduZWQgbm9fYWxsb2NhdG9yOworCS8qIGluZGljYXRlcyBtYXBzIG9mIHRoaXMgcmVnaW9uIHNob3VsZCBiZSBjYWNoZWQsIGlmIGEgbWl4IG9mCisJICogY2FjaGVkIGFuZCB1bmNhY2hlZCBpcyBkZXNpcmVkLCBzZXQgdGhpcyBhbmQgb3BlbiB0aGUgZGV2aWNlIHdpdGgKKwkgKiBPX1NZTkMgdG8gZ2V0IGFuIHVuY2FjaGVkIHJlZ2lvbiAqLworCXVuc2lnbmVkIGNhY2hlZDsKKwl1bnNpZ25lZCBidWZmZXJlZDsKKwkvKiBpbiBub19hbGxvY2F0b3IgbW9kZSB0aGUgZmlyc3QgbWFwcGVyIGdldHMgdGhlIHdob2xlIHNwYWNlIGFuZCBzZXRzCisJICogdGhpcyBmbGFnICovCisJdW5zaWduZWQgYWxsb2NhdGVkOworCS8qIGZvciBkZWJ1Z2dpbmcsIGNyZWF0ZXMgYSBsaXN0IG9mIHBtZW0gZmlsZSBzdHJ1Y3RzLCB0aGUKKwkgKiBkYXRhX2xpc3Rfc2VtIHNob3VsZCBiZSB0YWtlbiBiZWZvcmUgcG1lbV9kYXRhLT5zZW0gaWYgYm90aCBhcmUKKwkgKiBuZWVkZWQgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIGRhdGFfbGlzdF9zZW07CisJc3RydWN0IGxpc3RfaGVhZCBkYXRhX2xpc3Q7CisJLyogcG1lbV9zZW0gcHJvdGVjdHMgdGhlIGJpdG1hcCBhcnJheQorCSAqIGEgd3JpdGUgbG9jayBzaG91bGQgYmUgaGVsZCB3aGVuIG1vZGlmeWluZyBlbnRyaWVzIGluIGJpdG1hcAorCSAqIGEgcmVhZCBsb2NrIHNob3VsZCBiZSBoZWxkIHdoZW4gcmVhZGluZyBkYXRhIGZyb20gYml0cyBvcgorCSAqIGRlcmVmZXJlbmNpbmcgYSBwb2ludGVyIGludG8gYml0bWFwCisJICoKKwkgKiBwbWVtX2RhdGEtPnNlbSBwcm90ZWN0cyB0aGUgcG1lbSBkYXRhIG9mIGEgcGFydGljdWxhciBmaWxlCisJICogTWFueSBvZiB0aGUgZnVuY3Rpb24gdGhhdCByZXF1aXJlIHRoZSBwbWVtX2RhdGEtPnNlbSBoYXZlIGEgbm9uLQorCSAqIGxvY2tpbmcgdmVyc2lvbiBmb3Igd2hlbiB0aGUgY2FsbGVyIGlzIGFscmVhZHkgaG9sZGluZyB0aGF0IHNlbS4KKwkgKgorCSAqIElGIFlPVSBUQUtFIEJPVEggTE9DS1MgVEFLRSBUSEVNIElOIFRISVMgT1JERVI6CisJICogZG93bihwbWVtX2RhdGEtPnNlbSkgPT4gZG93bihiaXRtYXBfc2VtKQorCSAqLworCXN0cnVjdCByd19zZW1hcGhvcmUgYml0bWFwX3NlbTsKKworCWxvbmcgKCppb2N0bCkoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKKwlpbnQgKCpyZWxlYXNlKShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7Cit9OworCitzdGF0aWMgc3RydWN0IHBtZW1faW5mbyBwbWVtW1BNRU1fTUFYX0RFVklDRVNdOworc3RhdGljIGludCBpZF9jb3VudDsKKworI2RlZmluZSBQTUVNX0lTX0ZSRUUoaWQsIGluZGV4KSAhKHBtZW1baWRdLmJpdG1hcFtpbmRleF0uYWxsb2NhdGVkKQorI2RlZmluZSBQTUVNX09SREVSKGlkLCBpbmRleCkgcG1lbVtpZF0uYml0bWFwW2luZGV4XS5vcmRlcgorI2RlZmluZSBQTUVNX0JVRERZX0lOREVYKGlkLCBpbmRleCkgKGluZGV4IF4gKDEgPDwgUE1FTV9PUkRFUihpZCwgaW5kZXgpKSkKKyNkZWZpbmUgUE1FTV9ORVhUX0lOREVYKGlkLCBpbmRleCkgKGluZGV4ICsgKDEgPDwgUE1FTV9PUkRFUihpZCwgaW5kZXgpKSkKKyNkZWZpbmUgUE1FTV9PRkZTRVQoaW5kZXgpIChpbmRleCAqIFBNRU1fTUlOX0FMTE9DKQorI2RlZmluZSBQTUVNX1NUQVJUX0FERFIoaWQsIGluZGV4KSAoUE1FTV9PRkZTRVQoaW5kZXgpICsgcG1lbVtpZF0uYmFzZSkKKyNkZWZpbmUgUE1FTV9MRU4oaWQsIGluZGV4KSAoKDEgPDwgUE1FTV9PUkRFUihpZCwgaW5kZXgpKSAqIFBNRU1fTUlOX0FMTE9DKQorI2RlZmluZSBQTUVNX0VORF9BRERSKGlkLCBpbmRleCkgKFBNRU1fU1RBUlRfQUREUihpZCwgaW5kZXgpICsgXAorCVBNRU1fTEVOKGlkLCBpbmRleCkpCisjZGVmaW5lIFBNRU1fU1RBUlRfVkFERFIoaWQsIGluZGV4KSAoUE1FTV9PRkZTRVQoaWQsIGluZGV4KSArIHBtZW1baWRdLnZiYXNlKQorI2RlZmluZSBQTUVNX0VORF9WQUREUihpZCwgaW5kZXgpIChQTUVNX1NUQVJUX1ZBRERSKGlkLCBpbmRleCkgKyBcCisJUE1FTV9MRU4oaWQsIGluZGV4KSkKKyNkZWZpbmUgUE1FTV9SRVZPS0VEKGRhdGEpIChkYXRhLT5mbGFncyAmIFBNRU1fRkxBR1NfUkVWT0tFRCkKKyNkZWZpbmUgUE1FTV9JU19QQUdFX0FMSUdORUQoYWRkcikgKCEoKGFkZHIpICYgKH5QQUdFX01BU0spKSkKKyNkZWZpbmUgUE1FTV9JU19TVUJNQVAoZGF0YSkgKChkYXRhLT5mbGFncyAmIFBNRU1fRkxBR1NfU1VCTUFQKSAmJiBcCisJKCEoZGF0YS0+ZmxhZ3MgJiBQTUVNX0ZMQUdTX1VOU1VCTUFQKSkpCisKK3N0YXRpYyBpbnQgcG1lbV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKK3N0YXRpYyBpbnQgcG1lbV9tbWFwKHN0cnVjdCBmaWxlICosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKK3N0YXRpYyBpbnQgcG1lbV9vcGVuKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKK3N0YXRpYyBsb25nIHBtZW1faW9jdGwoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwbWVtX2ZvcHMgPSB7CisJLnJlbGVhc2UgPSBwbWVtX3JlbGVhc2UsCisJLm1tYXAgPSBwbWVtX21tYXAsCisJLm9wZW4gPSBwbWVtX29wZW4sCisJLnVubG9ja2VkX2lvY3RsID0gcG1lbV9pb2N0bCwKK307CisKK3N0YXRpYyBpbnQgZ2V0X2lkKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBNSU5PUihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9yZGV2KTsKK30KKworc3RhdGljIGludCBpc19wbWVtX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IGlkOworCisJaWYgKHVubGlrZWx5KCFmaWxlIHx8ICFmaWxlLT5mX2RlbnRyeSB8fCAhZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpKQorCQlyZXR1cm4gMDsKKwlpZCA9IGdldF9pZChmaWxlKTsKKwlpZiAodW5saWtlbHkoaWQgPj0gUE1FTV9NQVhfREVWSUNFUykpCisJCXJldHVybiAwOworCWlmICh1bmxpa2VseShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9yZGV2ICE9CisJICAgICBNS0RFVihNSVNDX01BSk9SLCBwbWVtW2lkXS5kZXYubWlub3IpKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgaGFzX2FsbG9jYXRpb24oc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHBtZW1fZGF0YSAqZGF0YTsKKwkvKiBjaGVjayBpc19wbWVtX2ZpbGUgZmlyc3QgaWYgbm90IGFjY2Vzc2VkIHZpYSBwbWVtX2ZpbGVfb3BzICovCisKKwlpZiAodW5saWtlbHkoIWZpbGUtPnByaXZhdGVfZGF0YSkpCisJCXJldHVybiAwOworCWRhdGEgPSAoc3RydWN0IHBtZW1fZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAodW5saWtlbHkoZGF0YS0+aW5kZXggPCAwKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgaXNfbWFzdGVyX293bmVyKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBmaWxlICptYXN0ZXJfZmlsZTsKKwlzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhOworCWludCBwdXRfbmVlZGVkLCByZXQgPSAwOworCisJaWYgKCFpc19wbWVtX2ZpbGUoZmlsZSkgfHwgIWhhc19hbGxvY2F0aW9uKGZpbGUpKQorCQlyZXR1cm4gMDsKKwlkYXRhID0gKHN0cnVjdCBwbWVtX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKFBNRU1fRkxBR1NfTUFTVEVSTUFQICYgZGF0YS0+ZmxhZ3MpCisJCXJldHVybiAxOworCW1hc3Rlcl9maWxlID0gZmdldF9saWdodChkYXRhLT5tYXN0ZXJfZmQsICZwdXRfbmVlZGVkKTsKKwlpZiAobWFzdGVyX2ZpbGUgJiYgZGF0YS0+bWFzdGVyX2ZpbGUgPT0gbWFzdGVyX2ZpbGUpCisJCXJldCA9IDE7CisJZnB1dF9saWdodChtYXN0ZXJfZmlsZSwgcHV0X25lZWRlZCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwbWVtX2ZyZWUoaW50IGlkLCBpbnQgaW5kZXgpCit7CisJLyogY2FsbGVyIHNob3VsZCBob2xkIHRoZSB3cml0ZSBsb2NrIG9uIHBtZW1fc2VtISAqLworCWludCBidWRkeSwgY3VyciA9IGluZGV4OworCURMT0coImluZGV4ICVkXG4iLCBpbmRleCk7CisKKwlpZiAocG1lbVtpZF0ubm9fYWxsb2NhdG9yKSB7CisJCXBtZW1baWRdLmFsbG9jYXRlZCA9IDA7CisJCXJldHVybiAwOworCX0KKwkvKiBjbGVhbiB1cCB0aGUgYml0bWFwLCBtZXJnaW5nIGFueSBidWRkaWVzICovCisJcG1lbVtpZF0uYml0bWFwW2N1cnJdLmFsbG9jYXRlZCA9IDA7CisJLyogZmluZCBhIHNsb3RzIGJ1ZGR5IEJ1ZGR5IyA9IFNsb3QjIF4gKDEgPDwgb3JkZXIpCisJICogaWYgdGhlIGJ1ZGR5IGlzIGFsc28gZnJlZSBtZXJnZSB0aGVtCisJICogcmVwZWF0IHVudGlsIHRoZSBidWRkeSBpcyBub3QgZnJlZSBvciBlbmQgb2YgdGhlIGJpdG1hcCBpcyByZWFjaGVkCisJICovCisJZG8geworCQlidWRkeSA9IFBNRU1fQlVERFlfSU5ERVgoaWQsIGN1cnIpOworCQlpZiAoUE1FTV9JU19GUkVFKGlkLCBidWRkeSkgJiYKKwkJCQlQTUVNX09SREVSKGlkLCBidWRkeSkgPT0gUE1FTV9PUkRFUihpZCwgY3VycikpIHsKKwkJCVBNRU1fT1JERVIoaWQsIGJ1ZGR5KSsrOworCQkJUE1FTV9PUkRFUihpZCwgY3VycikrKzsKKwkJCWN1cnIgPSBtaW4oYnVkZHksIGN1cnIpOworCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChjdXJyIDwgcG1lbVtpZF0ubnVtX2VudHJpZXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBtZW1fcmV2b2tlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhKTsKKworc3RhdGljIGludCBwbWVtX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHBtZW1fZGF0YSAqZGF0YSA9IChzdHJ1Y3QgcG1lbV9kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwbWVtX3JlZ2lvbl9ub2RlICpyZWdpb25fbm9kZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbHQsICplbHQyOworCWludCBpZCA9IGdldF9pZChmaWxlKSwgcmV0ID0gMDsKKworCisJZG93bigmcG1lbVtpZF0uZGF0YV9saXN0X3NlbSk7CisJLyogaWYgdGhpcyBmaWxlIGlzIGEgbWFzdGVyLCByZXZva2UgYWxsIHRoZSBtZW1vcnkgaW4gdGhlIGNvbm5lY3RlZAorCSAqICBmaWxlcyAqLworCWlmIChQTUVNX0ZMQUdTX01BU1RFUk1BUCAmIGRhdGEtPmZsYWdzKSB7CisJCXN0cnVjdCBwbWVtX2RhdGEgKnN1Yl9kYXRhOworCQlsaXN0X2Zvcl9lYWNoKGVsdCwgJnBtZW1baWRdLmRhdGFfbGlzdCkgeworCQkJc3ViX2RhdGEgPSBsaXN0X2VudHJ5KGVsdCwgc3RydWN0IHBtZW1fZGF0YSwgbGlzdCk7CisJCQlkb3duX3JlYWQoJnN1Yl9kYXRhLT5zZW0pOworCQkJaWYgKFBNRU1fSVNfU1VCTUFQKHN1Yl9kYXRhKSAmJgorCQkJICAgIGZpbGUgPT0gc3ViX2RhdGEtPm1hc3Rlcl9maWxlKSB7CisJCQkJdXBfcmVhZCgmc3ViX2RhdGEtPnNlbSk7CisJCQkJcG1lbV9yZXZva2UoZmlsZSwgc3ViX2RhdGEpOworCQkJfSAgZWxzZQorCQkJCXVwX3JlYWQoJnN1Yl9kYXRhLT5zZW0pOworCQl9CisJfQorCWxpc3RfZGVsKCZkYXRhLT5saXN0KTsKKwl1cCgmcG1lbVtpZF0uZGF0YV9saXN0X3NlbSk7CisKKworCWRvd25fd3JpdGUoJmRhdGEtPnNlbSk7CisKKwkvKiBpZiBpdHMgbm90IGEgY29uZW5jdGVkIGZpbGUgYW5kIGl0IGhhcyBhbiBhbGxvY2F0aW9uLCBmcmVlIGl0ICovCisJaWYgKCEoUE1FTV9GTEFHU19DT05ORUNURUQgJiBkYXRhLT5mbGFncykgJiYgaGFzX2FsbG9jYXRpb24oZmlsZSkpIHsKKwkJZG93bl93cml0ZSgmcG1lbVtpZF0uYml0bWFwX3NlbSk7CisJCXJldCA9IHBtZW1fZnJlZShpZCwgZGF0YS0+aW5kZXgpOworCQl1cF93cml0ZSgmcG1lbVtpZF0uYml0bWFwX3NlbSk7CisJfQorCisJLyogaWYgdGhpcyBmaWxlIGlzIGEgc3VibWFwIChtYXBwZWQsIGNvbm5lY3RlZCBmaWxlKSwgZG93bnJlZiB0aGUKKwkgKiB0YXNrIHN0cnVjdCAqLworCWlmIChQTUVNX0ZMQUdTX1NVQk1BUCAmIGRhdGEtPmZsYWdzKQorCQlpZiAoZGF0YS0+dGFzaykgeworCQkJcHV0X3Rhc2tfc3RydWN0KGRhdGEtPnRhc2spOworCQkJZGF0YS0+dGFzayA9IE5VTEw7CisJCX0KKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZWx0LCBlbHQyLCAmZGF0YS0+cmVnaW9uX2xpc3QpIHsKKwkJcmVnaW9uX25vZGUgPSBsaXN0X2VudHJ5KGVsdCwgc3RydWN0IHBtZW1fcmVnaW9uX25vZGUsIGxpc3QpOworCQlsaXN0X2RlbChlbHQpOworCQlrZnJlZShyZWdpb25fbm9kZSk7CisJfQorCUJVR19PTighbGlzdF9lbXB0eSgmZGF0YS0+cmVnaW9uX2xpc3QpKTsKKworCXVwX3dyaXRlKCZkYXRhLT5zZW0pOworCWtmcmVlKGRhdGEpOworCWlmIChwbWVtW2lkXS5yZWxlYXNlKQorCQlyZXQgPSBwbWVtW2lkXS5yZWxlYXNlKGlub2RlLCBmaWxlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcG1lbV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBwbWVtX2RhdGEgKmRhdGE7CisJaW50IGlkID0gZ2V0X2lkKGZpbGUpOworCWludCByZXQgPSAwOworCisJRExPRygiY3VycmVudCAldSBmaWxlICVwKCVkKVxuIiwgY3VycmVudC0+cGlkLCBmaWxlLCBmaWxlX2NvdW50KGZpbGUpKTsKKwkvKiBzZXR1cCBmaWxlLT5wcml2YXRlX2RhdGEgdG8gaW5kaWNhdGUgaXRzIHVubWFwcGVkICovCisJLyogIHlvdSBjYW4gb25seSBvcGVuIGEgcG1lbSBkZXZpY2Ugb25lIHRpbWUgKi8KKwlpZiAoZmlsZS0+cHJpdmF0ZV9kYXRhICE9IE5VTEwpCisJCXJldHVybiAtMTsKKwlkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBtZW1fZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkgeworCQlwcmludGsoInBtZW06IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBtZW0gbWV0YWRhdGEuIik7CisJCXJldHVybiAtMTsKKwl9CisJZGF0YS0+ZmxhZ3MgPSAwOworCWRhdGEtPmluZGV4ID0gLTE7CisJZGF0YS0+dGFzayA9IE5VTEw7CisJZGF0YS0+dm1hID0gTlVMTDsKKwlkYXRhLT5waWQgPSAwOworCWRhdGEtPm1hc3Rlcl9maWxlID0gTlVMTDsKKyNpZiBQTUVNX0RFQlVHCisJZGF0YS0+cmVmID0gMDsKKyNlbmRpZgorCUlOSVRfTElTVF9IRUFEKCZkYXRhLT5yZWdpb25fbGlzdCk7CisJaW5pdF9yd3NlbSgmZGF0YS0+c2VtKTsKKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGRhdGE7CisJSU5JVF9MSVNUX0hFQUQoJmRhdGEtPmxpc3QpOworCisJZG93bigmcG1lbVtpZF0uZGF0YV9saXN0X3NlbSk7CisJbGlzdF9hZGQoJmRhdGEtPmxpc3QsICZwbWVtW2lkXS5kYXRhX2xpc3QpOworCXVwKCZwbWVtW2lkXS5kYXRhX2xpc3Rfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwbWVtX29yZGVyKHVuc2lnbmVkIGxvbmcgbGVuKQoreworCWludCBpOworCisJbGVuID0gKGxlbiArIFBNRU1fTUlOX0FMTE9DIC0gMSkvUE1FTV9NSU5fQUxMT0M7CisJbGVuLS07CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihsZW4pKjg7IGkrKykKKwkJaWYgKGxlbiA+PiBpID09IDApCisJCQlicmVhazsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBwbWVtX2FsbG9jYXRlKGludCBpZCwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJLyogY2FsbGVyIHNob3VsZCBob2xkIHRoZSB3cml0ZSBsb2NrIG9uIHBtZW1fc2VtISAqLworCS8qIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBwZGF0YVtdIGVudHJ5ICovCisJaW50IGN1cnIgPSAwOworCWludCBlbmQgPSBwbWVtW2lkXS5udW1fZW50cmllczsKKwlpbnQgYmVzdF9maXQgPSAtMTsKKwl1bnNpZ25lZCBsb25nIG9yZGVyID0gcG1lbV9vcmRlcihsZW4pOworCisJaWYgKHBtZW1baWRdLm5vX2FsbG9jYXRvcikgeworCQlETE9HKCJubyBhbGxvY2F0b3IiKTsKKwkJaWYgKChsZW4gPiBwbWVtW2lkXS5zaXplKSB8fCBwbWVtW2lkXS5hbGxvY2F0ZWQpCisJCQlyZXR1cm4gLTE7CisJCXBtZW1baWRdLmFsbG9jYXRlZCA9IDE7CisJCXJldHVybiBsZW47CisJfQorCisJaWYgKG9yZGVyID4gUE1FTV9NQVhfT1JERVIpCisJCXJldHVybiAtMTsKKwlETE9HKCJvcmRlciAlbHhcbiIsIG9yZGVyKTsKKworCS8qIGxvb2sgdGhyb3VnaCB0aGUgYml0bWFwOgorCSAqIAlpZiB5b3UgZmluZCBhIGZyZWUgc2xvdCBvZiB0aGUgY29ycmVjdCBvcmRlciB1c2UgaXQKKwkgKiAJb3RoZXJ3aXNlLCB1c2UgdGhlIGJlc3QgZml0IChzbWFsbGVzdCB3aXRoIHNpemUgPiBvcmRlcikgc2xvdAorCSAqLworCXdoaWxlIChjdXJyIDwgZW5kKSB7CisJCWlmIChQTUVNX0lTX0ZSRUUoaWQsIGN1cnIpKSB7CisJCQlpZiAoUE1FTV9PUkRFUihpZCwgY3VycikgPT0gKHVuc2lnbmVkIGNoYXIpb3JkZXIpIHsKKwkJCQkvKiBzZXQgdGhlIG5vdCBmcmVlIGJpdCBhbmQgY2xlYXIgb3RoZXJzICovCisJCQkJYmVzdF9maXQgPSBjdXJyOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKFBNRU1fT1JERVIoaWQsIGN1cnIpID4gKHVuc2lnbmVkIGNoYXIpb3JkZXIgJiYKKwkJCSAgICAoYmVzdF9maXQgPCAwIHx8CisJCQkgICAgIFBNRU1fT1JERVIoaWQsIGN1cnIpIDwgUE1FTV9PUkRFUihpZCwgYmVzdF9maXQpKSkKKwkJCQliZXN0X2ZpdCA9IGN1cnI7CisJCX0KKwkJY3VyciA9IFBNRU1fTkVYVF9JTkRFWChpZCwgY3Vycik7CisJfQorCisJLyogaWYgYmVzdF9maXQgPCAwLCB0aGVyZSBhcmUgbm8gc3VpdGFibGUgc2xvdHMsCisJICogcmV0dXJuIGFuIGVycm9yCisJICovCisJaWYgKGJlc3RfZml0IDwgMCkgeworCQlwcmludGsoInBtZW06IG5vIHNwYWNlIGxlZnQgdG8gYWxsb2NhdGUhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIG5vdyBwYXJ0aXRpb24gdGhlIGJlc3QgZml0OgorCSAqIAlzcGxpdCB0aGUgc2xvdCBpbnRvIDIgYnVkZGllcyBvZiBvcmRlciAtIDEKKwkgKiAJcmVwZWF0IHVudGlsIHRoZSBzbG90IGlzIG9mIHRoZSBjb3JyZWN0IG9yZGVyCisJICovCisJd2hpbGUgKFBNRU1fT1JERVIoaWQsIGJlc3RfZml0KSA+ICh1bnNpZ25lZCBjaGFyKW9yZGVyKSB7CisJCWludCBidWRkeTsKKwkJUE1FTV9PUkRFUihpZCwgYmVzdF9maXQpIC09IDE7CisJCWJ1ZGR5ID0gUE1FTV9CVUREWV9JTkRFWChpZCwgYmVzdF9maXQpOworCQlQTUVNX09SREVSKGlkLCBidWRkeSkgPSBQTUVNX09SREVSKGlkLCBiZXN0X2ZpdCk7CisJfQorCXBtZW1baWRdLmJpdG1hcFtiZXN0X2ZpdF0uYWxsb2NhdGVkID0gMTsKKwlyZXR1cm4gYmVzdF9maXQ7Cit9CisKK3N0YXRpYyBwZ3Byb3RfdCBwaHlzX21lbV9hY2Nlc3NfcHJvdChzdHJ1Y3QgZmlsZSAqZmlsZSwgcGdwcm90X3Qgdm1hX3Byb3QpCit7CisJaW50IGlkID0gZ2V0X2lkKGZpbGUpOworI2lmZGVmIHBncHJvdF9ub25jYWNoZWQKKwlpZiAocG1lbVtpZF0uY2FjaGVkID09IDAgfHwgZmlsZS0+Zl9mbGFncyAmIE9fU1lOQykKKwkJcmV0dXJuIHBncHJvdF9ub25jYWNoZWQodm1hX3Byb3QpOworI2VuZGlmCisjaWZkZWYgcGdwcm90X2V4dF9idWZmZXJlZAorCWVsc2UgaWYgKHBtZW1baWRdLmJ1ZmZlcmVkKQorCQlyZXR1cm4gcGdwcm90X2V4dF9idWZmZXJlZCh2bWFfcHJvdCk7CisjZW5kaWYKKwlyZXR1cm4gdm1hX3Byb3Q7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBtZW1fc3RhcnRfYWRkcihpbnQgaWQsIHN0cnVjdCBwbWVtX2RhdGEgKmRhdGEpCit7CisJaWYgKHBtZW1baWRdLm5vX2FsbG9jYXRvcikKKwkJcmV0dXJuIFBNRU1fU1RBUlRfQUREUihpZCwgMCk7CisJZWxzZQorCQlyZXR1cm4gUE1FTV9TVEFSVF9BRERSKGlkLCBkYXRhLT5pbmRleCk7CisKK30KKworc3RhdGljIHZvaWQgKnBtZW1fc3RhcnRfdmFkZHIoaW50IGlkLCBzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhKQoreworCXJldHVybiBwbWVtX3N0YXJ0X2FkZHIoaWQsIGRhdGEpIC0gcG1lbVtpZF0uYmFzZSArIHBtZW1baWRdLnZiYXNlOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwbWVtX2xlbihpbnQgaWQsIHN0cnVjdCBwbWVtX2RhdGEgKmRhdGEpCit7CisJaWYgKHBtZW1baWRdLm5vX2FsbG9jYXRvcikKKwkJcmV0dXJuIGRhdGEtPmluZGV4OworCWVsc2UKKwkJcmV0dXJuIFBNRU1fTEVOKGlkLCBkYXRhLT5pbmRleCk7Cit9CisKK3N0YXRpYyBpbnQgcG1lbV9tYXBfZ2FyYmFnZShpbnQgaWQsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJICAgIHN0cnVjdCBwbWVtX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJICAgIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCWludCBpLCBnYXJiYWdlX3BhZ2VzID0gbGVuID4+IFBBR0VfU0hJRlQ7CisKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX0lPIHwgVk1fUkVTRVJWRUQgfCBWTV9QRk5NQVAgfCBWTV9TSEFSRUQgfCBWTV9XUklURTsKKwlmb3IgKGkgPSAwOyBpIDwgZ2FyYmFnZV9wYWdlczsgaSsrKSB7CisJCWlmICh2bV9pbnNlcnRfcGZuKHZtYSwgdm1hLT52bV9zdGFydCArIG9mZnNldCArIChpICogUEFHRV9TSVpFKSwKKwkJICAgIHBtZW1baWRdLmdhcmJhZ2VfcGZuKSkKKwkJCXJldHVybiAtRUFHQUlOOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbWVtX3VubWFwX3Bmbl9yYW5nZShpbnQgaWQsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCXN0cnVjdCBwbWVtX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCXVuc2lnbmVkIGxvbmcgbGVuKQoreworCWludCBnYXJiYWdlX3BhZ2VzOworCURMT0coInVubWFwIG9mZnNldCAlbHggbGVuICVseFxuIiwgb2Zmc2V0LCBsZW4pOworCisJQlVHX09OKCFQTUVNX0lTX1BBR0VfQUxJR05FRChsZW4pKTsKKworCWdhcmJhZ2VfcGFnZXMgPSBsZW4gPj4gUEFHRV9TSElGVDsKKwl6YXBfcGFnZV9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQgKyBvZmZzZXQsIGxlbiwgTlVMTCk7CisJcG1lbV9tYXBfZ2FyYmFnZShpZCwgdm1hLCBkYXRhLCBvZmZzZXQsIGxlbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG1lbV9tYXBfcGZuX3JhbmdlKGludCBpZCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkgICAgICBzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCURMT0coIm1hcCBvZmZzZXQgJWx4IGxlbiAlbHhcbiIsIG9mZnNldCwgbGVuKTsKKwlCVUdfT04oIVBNRU1fSVNfUEFHRV9BTElHTkVEKHZtYS0+dm1fc3RhcnQpKTsKKwlCVUdfT04oIVBNRU1fSVNfUEFHRV9BTElHTkVEKHZtYS0+dm1fZW5kKSk7CisJQlVHX09OKCFQTUVNX0lTX1BBR0VfQUxJR05FRChsZW4pKTsKKwlCVUdfT04oIVBNRU1fSVNfUEFHRV9BTElHTkVEKG9mZnNldCkpOworCisJaWYgKGlvX3JlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQgKyBvZmZzZXQsCisJCShwbWVtX3N0YXJ0X2FkZHIoaWQsIGRhdGEpICsgb2Zmc2V0KSA+PiBQQUdFX1NISUZULAorCQlsZW4sIHZtYS0+dm1fcGFnZV9wcm90KSkgeworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG1lbV9yZW1hcF9wZm5fcmFuZ2UoaW50IGlkLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCSAgICAgIHN0cnVjdCBwbWVtX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJLyogaG9sZCB0aGUgbW0gc2VtcCBmb3IgdGhlIHZtYSB5b3UgYXJlIG1vZGlmeWluZyB3aGVuIHlvdSBjYWxsIHRoaXMgKi8KKwlCVUdfT04oIXZtYSk7CisJemFwX3BhZ2VfcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0ICsgb2Zmc2V0LCBsZW4sIE5VTEwpOworCXJldHVybiBwbWVtX21hcF9wZm5fcmFuZ2UoaWQsIHZtYSwgZGF0YSwgb2Zmc2V0LCBsZW4pOworfQorCitzdGF0aWMgdm9pZCBwbWVtX3ZtYV9vcGVuKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBmaWxlICpmaWxlID0gdm1hLT52bV9maWxlOworCXN0cnVjdCBwbWVtX2RhdGEgKmRhdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IGlkID0gZ2V0X2lkKGZpbGUpOworCS8qIHRoaXMgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBhcyB3ZSBkb24ndCBzdXBwb3J0IGNvcHlpbmcgcG1lbQorCSAqIHJhbmdlcyB2aWEgZm9yayAqLworCUJVR19PTighaGFzX2FsbG9jYXRpb24oZmlsZSkpOworCWRvd25fd3JpdGUoJmRhdGEtPnNlbSk7CisJLyogcmVtYXAgdGhlIGdhcmJhZ2UgcGFnZXMsIGZvcmtlcnMgZG9uJ3QgZ2V0IGFjY2VzcyB0byB0aGUgZGF0YSAqLworCXBtZW1fdW5tYXBfcGZuX3JhbmdlKGlkLCB2bWEsIGRhdGEsIDAsIHZtYS0+dm1fc3RhcnQgLSB2bWEtPnZtX2VuZCk7CisJdXBfd3JpdGUoJmRhdGEtPnNlbSk7Cit9CisKK3N0YXRpYyB2b2lkIHBtZW1fdm1hX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBmaWxlICpmaWxlID0gdm1hLT52bV9maWxlOworCXN0cnVjdCBwbWVtX2RhdGEgKmRhdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlETE9HKCJjdXJyZW50ICV1IHBwaWQgJXUgZmlsZSAlcCBjb3VudCAlZFxuIiwgY3VycmVudC0+cGlkLAorCSAgICAgY3VycmVudC0+cGFyZW50LT5waWQsIGZpbGUsIGZpbGVfY291bnQoZmlsZSkpOworCWlmICh1bmxpa2VseSghaXNfcG1lbV9maWxlKGZpbGUpIHx8ICFoYXNfYWxsb2NhdGlvbihmaWxlKSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicG1lbTogc29tZXRoaW5nIGlzIHZlcnkgd3JvbmcsIHlvdSBhcmUgIgorCQkgICAgICAgImNsb3NpbmcgYSB2bSBiYWNraW5nIGFuIGFsbG9jYXRpb24gdGhhdCBkb2Vzbid0ICIKKwkJICAgICAgICJleGlzdCFcbiIpOworCQlyZXR1cm47CisJfQorCWRvd25fd3JpdGUoJmRhdGEtPnNlbSk7CisJaWYgKGRhdGEtPnZtYSA9PSB2bWEpIHsKKwkJZGF0YS0+dm1hID0gTlVMTDsKKwkJaWYgKChkYXRhLT5mbGFncyAmIFBNRU1fRkxBR1NfQ09OTkVDVEVEKSAmJgorCQkgICAgKGRhdGEtPmZsYWdzICYgUE1FTV9GTEFHU19TVUJNQVApKQorCQkJZGF0YS0+ZmxhZ3MgfD0gUE1FTV9GTEFHU19VTlNVQk1BUDsKKwl9CisJLyogdGhlIGtlcm5lbCBpcyBnb2luZyB0byBmcmVlIHRoaXMgdm1hIG5vdyBhbnl3YXkgKi8KKwl1cF93cml0ZSgmZGF0YS0+c2VtKTsKK30KKworc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCB2bV9vcHMgPSB7CisJLm9wZW4gPSBwbWVtX3ZtYV9vcGVuLAorCS5jbG9zZSA9IHBtZW1fdm1hX2Nsb3NlLAorfTsKKworc3RhdGljIGludCBwbWVtX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBwbWVtX2RhdGEgKmRhdGE7CisJaW50IGluZGV4OworCXVuc2lnbmVkIGxvbmcgdm1hX3NpemUgPSAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCWludCByZXQgPSAwLCBpZCA9IGdldF9pZChmaWxlKTsKKworCWlmICh2bWEtPnZtX3Bnb2ZmIHx8ICFQTUVNX0lTX1BBR0VfQUxJR05FRCh2bWFfc2l6ZSkpIHsKKyNpZiBQTUVNX0RFQlVHCisJCXByaW50ayhLRVJOX0VSUiAicG1lbTogbW1hcHMgbXVzdCBiZSBhdCBvZmZzZXQgemVybywgYWxpZ25lZCIKKwkJCQkiIGFuZCBhIG11bHRpcGxlIG9mIHBhZ2VzX3NpemUuXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkYXRhID0gKHN0cnVjdCBwbWVtX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJZG93bl93cml0ZSgmZGF0YS0+c2VtKTsKKwkvKiBjaGVjayB0aGlzIGZpbGUgaXNuJ3QgYWxyZWFkeSBtbWFwZWQsIGZvciBzdWJtYXBzIGNoZWNrIHRoaXMgZmlsZQorCSAqIGhhcyBuZXZlciBiZWVuIG1tYXBlZCAqLworCWlmICgoZGF0YS0+ZmxhZ3MgJiBQTUVNX0ZMQUdTX01BU1RFUk1BUCkgfHwKKwkgICAgKGRhdGEtPmZsYWdzICYgUE1FTV9GTEFHU19TVUJNQVApIHx8CisJICAgIChkYXRhLT5mbGFncyAmIFBNRU1fRkxBR1NfVU5TVUJNQVApKSB7CisjaWYgUE1FTV9ERUJVRworCQlwcmludGsoS0VSTl9FUlIgInBtZW06IHlvdSBjYW4gb25seSBtbWFwIGEgcG1lbSBmaWxlIG9uY2UsICIKKwkJICAgICAgICJ0aGlzIGZpbGUgaXMgYWxyZWFkeSBtbWFwZWQuICV4XG4iLCBkYXRhLT5mbGFncyk7CisjZW5kaWYKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKwl9CisJLyogaWYgZmlsZS0+cHJpdmF0ZV9kYXRhID09IHVuYWxsb2NlZCwgYWxsb2MqLworCWlmIChkYXRhICYmIGRhdGEtPmluZGV4ID09IC0xKSB7CisJCWRvd25fd3JpdGUoJnBtZW1baWRdLmJpdG1hcF9zZW0pOworCQlpbmRleCA9IHBtZW1fYWxsb2NhdGUoaWQsIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCk7CisJCXVwX3dyaXRlKCZwbWVtW2lkXS5iaXRtYXBfc2VtKTsKKwkJZGF0YS0+aW5kZXggPSBpbmRleDsKKwl9CisJLyogZWl0aGVyIG5vIHNwYWNlIHdhcyBhdmFpbGFibGUgb3IgYW4gZXJyb3Igb2NjdXJlZCAqLworCWlmICghaGFzX2FsbG9jYXRpb24oZmlsZSkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJcHJpbnRrKCJwbWVtOiBjb3VsZCBub3QgZmluZCBhbGxvY2F0aW9uIGZvciBtYXAuXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAocG1lbV9sZW4oaWQsIGRhdGEpIDwgdm1hX3NpemUpIHsKKyNpZiBQTUVNX0RFQlVHCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInBtZW06IG1tYXAgc2l6ZSBbJWx1XSBkb2VzIG5vdCBtYXRjaCIKKwkJICAgICAgICJzaXplIG9mIGJhY2tpbmcgcmVnaW9uIFslbHVdLlxuIiwgdm1hX3NpemUsCisJCSAgICAgICBwbWVtX2xlbihpZCwgZGF0YSkpOworI2VuZGlmCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3I7CisJfQorCisJdm1hLT52bV9wZ29mZiA9IHBtZW1fc3RhcnRfYWRkcihpZCwgZGF0YSkgPj4gUEFHRV9TSElGVDsKKwl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBoeXNfbWVtX2FjY2Vzc19wcm90KGZpbGUsIHZtYS0+dm1fcGFnZV9wcm90KTsKKworCWlmIChkYXRhLT5mbGFncyAmIFBNRU1fRkxBR1NfQ09OTkVDVEVEKSB7CisJCXN0cnVjdCBwbWVtX3JlZ2lvbl9ub2RlICpyZWdpb25fbm9kZTsKKwkJc3RydWN0IGxpc3RfaGVhZCAqZWx0OworCQlpZiAocG1lbV9tYXBfZ2FyYmFnZShpZCwgdm1hLCBkYXRhLCAwLCB2bWFfc2l6ZSkpIHsKKwkJCXByaW50aygicG1lbTogbW1hcCBmYWlsZWQgaW4ga2VybmVsIVxuIik7CisJCQlyZXQgPSAtRUFHQUlOOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlsaXN0X2Zvcl9lYWNoKGVsdCwgJmRhdGEtPnJlZ2lvbl9saXN0KSB7CisJCQlyZWdpb25fbm9kZSA9IGxpc3RfZW50cnkoZWx0LCBzdHJ1Y3QgcG1lbV9yZWdpb25fbm9kZSwKKwkJCQkJCSBsaXN0KTsKKwkJCURMT0coInJlbWFwcGluZyBmaWxlOiAlcCAlbHggJWx4XG4iLCBmaWxlLAorCQkJCXJlZ2lvbl9ub2RlLT5yZWdpb24ub2Zmc2V0LAorCQkJCXJlZ2lvbl9ub2RlLT5yZWdpb24ubGVuKTsKKwkJCWlmIChwbWVtX3JlbWFwX3Bmbl9yYW5nZShpZCwgdm1hLCBkYXRhLAorCQkJCQkJIHJlZ2lvbl9ub2RlLT5yZWdpb24ub2Zmc2V0LAorCQkJCQkJIHJlZ2lvbl9ub2RlLT5yZWdpb24ubGVuKSkgeworCQkJCXJldCA9IC1FQUdBSU47CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJfQorCQlkYXRhLT5mbGFncyB8PSBQTUVNX0ZMQUdTX1NVQk1BUDsKKwkJZ2V0X3Rhc2tfc3RydWN0KGN1cnJlbnQtPmdyb3VwX2xlYWRlcik7CisJCWRhdGEtPnRhc2sgPSBjdXJyZW50LT5ncm91cF9sZWFkZXI7CisJCWRhdGEtPnZtYSA9IHZtYTsKKyNpZiBQTUVNX0RFQlVHCisJCWRhdGEtPnBpZCA9IGN1cnJlbnQtPnBpZDsKKyNlbmRpZgorCQlETE9HKCJzdWJtbWFwcGVkIGZpbGUgJXAgdm1hICVwIHBpZCAldVxuIiwgZmlsZSwgdm1hLAorCQkgICAgIGN1cnJlbnQtPnBpZCk7CisJfSBlbHNlIHsKKwkJaWYgKHBtZW1fbWFwX3Bmbl9yYW5nZShpZCwgdm1hLCBkYXRhLCAwLCB2bWFfc2l6ZSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gInBtZW06IG1tYXAgZmFpbGVkIGluIGtlcm5lbCFcbiIpOworCQkJcmV0ID0gLUVBR0FJTjsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJZGF0YS0+ZmxhZ3MgfD0gUE1FTV9GTEFHU19NQVNURVJNQVA7CisJCWRhdGEtPnBpZCA9IGN1cnJlbnQtPnBpZDsKKwl9CisJdm1hLT52bV9vcHMgPSAmdm1fb3BzOworZXJyb3I6CisJdXBfd3JpdGUoJmRhdGEtPnNlbSk7CisJcmV0dXJuIHJldDsKK30KKworLyogdGhlIGZvbGxvd2luZyBhcmUgdGhlIGFwaSBmb3IgYWNjZXNzaW5nIHBtZW0gcmVnaW9ucyBieSBvdGhlciBkcml2ZXJzCisgKiBmcm9tIGluc2lkZSB0aGUga2VybmVsICovCitpbnQgZ2V0X3BtZW1fdXNlcl9hZGRyKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nICpzdGFydCwKKwkJICAgdW5zaWduZWQgbG9uZyAqbGVuKQoreworCXN0cnVjdCBwbWVtX2RhdGEgKmRhdGE7CisJaWYgKCFpc19wbWVtX2ZpbGUoZmlsZSkgfHwgIWhhc19hbGxvY2F0aW9uKGZpbGUpKSB7CisjaWYgUE1FTV9ERUJVRworCQlwcmludGsoS0VSTl9JTkZPICJwbWVtOiByZXF1ZXN0ZWQgcG1lbSBkYXRhIGZyb20gaW52YWxpZCIKKwkJCQkgICJmaWxlLlxuIik7CisjZW5kaWYKKwkJcmV0dXJuIC0xOworCX0KKwlkYXRhID0gKHN0cnVjdCBwbWVtX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJZG93bl9yZWFkKCZkYXRhLT5zZW0pOworCWlmIChkYXRhLT52bWEpIHsKKwkJKnN0YXJ0ID0gZGF0YS0+dm1hLT52bV9zdGFydDsKKwkJKmxlbiA9IGRhdGEtPnZtYS0+dm1fZW5kIC0gZGF0YS0+dm1hLT52bV9zdGFydDsKKwl9IGVsc2UgeworCQkqc3RhcnQgPSAwOworCQkqbGVuID0gMDsKKwl9CisJdXBfcmVhZCgmZGF0YS0+c2VtKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGdldF9wbWVtX2FkZHIoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgKnN0YXJ0LAorCQkgIHVuc2lnbmVkIGxvbmcgKnZzdGFydCwgdW5zaWduZWQgbG9uZyAqbGVuKQoreworCXN0cnVjdCBwbWVtX2RhdGEgKmRhdGE7CisJaW50IGlkOworCisJaWYgKCFpc19wbWVtX2ZpbGUoZmlsZSkgfHwgIWhhc19hbGxvY2F0aW9uKGZpbGUpKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlkYXRhID0gKHN0cnVjdCBwbWVtX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKGRhdGEtPmluZGV4ID09IC0xKSB7CisjaWYgUE1FTV9ERUJVRworCQlwcmludGsoS0VSTl9JTkZPICJwbWVtOiByZXF1ZXN0ZWQgcG1lbSBkYXRhIGZyb20gZmlsZSB3aXRoIG5vICIKKwkJICAgICAgICJhbGxvY2F0aW9uLlxuIik7CisJCXJldHVybiAtMTsKKyNlbmRpZgorCX0KKwlpZCA9IGdldF9pZChmaWxlKTsKKworCWRvd25fcmVhZCgmZGF0YS0+c2VtKTsKKwkqc3RhcnQgPSBwbWVtX3N0YXJ0X2FkZHIoaWQsIGRhdGEpOworCSpsZW4gPSBwbWVtX2xlbihpZCwgZGF0YSk7CisJKnZzdGFydCA9ICh1bnNpZ25lZCBsb25nKXBtZW1fc3RhcnRfdmFkZHIoaWQsIGRhdGEpOworCXVwX3JlYWQoJmRhdGEtPnNlbSk7CisjaWYgUE1FTV9ERUJVRworCWRvd25fd3JpdGUoJmRhdGEtPnNlbSk7CisJZGF0YS0+cmVmKys7CisJdXBfd3JpdGUoJmRhdGEtPnNlbSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworaW50IGdldF9wbWVtX2ZpbGUoaW50IGZkLCB1bnNpZ25lZCBsb25nICpzdGFydCwgdW5zaWduZWQgbG9uZyAqdnN0YXJ0LAorCQkgIHVuc2lnbmVkIGxvbmcgKmxlbiwgc3RydWN0IGZpbGUgKipmaWxwKQoreworCXN0cnVjdCBmaWxlICpmaWxlOworCisJZmlsZSA9IGZnZXQoZmQpOworCWlmICh1bmxpa2VseShmaWxlID09IE5VTEwpKSB7CisJCXByaW50ayhLRVJOX0lORk8gInBtZW06IHJlcXVlc3RlZCBkYXRhIGZyb20gZmlsZSBkZXNjcmlwdG9yICIKKwkJICAgICAgICJ0aGF0IGRvZXNuJ3QgZXhpc3QuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoZ2V0X3BtZW1fYWRkcihmaWxlLCBzdGFydCwgdnN0YXJ0LCBsZW4pKQorCQlnb3RvIGVuZDsKKworCWlmIChmaWxwKQorCQkqZmlscCA9IGZpbGU7CisJcmV0dXJuIDA7CitlbmQ6CisJZnB1dChmaWxlKTsKKwlyZXR1cm4gLTE7Cit9CisKK3ZvaWQgcHV0X3BtZW1fZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhOworCWludCBpZDsKKworCWlmICghaXNfcG1lbV9maWxlKGZpbGUpKQorCQlyZXR1cm47CisJaWQgPSBnZXRfaWQoZmlsZSk7CisJZGF0YSA9IChzdHJ1Y3QgcG1lbV9kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworI2lmIFBNRU1fREVCVUcKKwlkb3duX3dyaXRlKCZkYXRhLT5zZW0pOworCWlmIChkYXRhLT5yZWYgPT0gMCkgeworCQlwcmludGsoInBtZW06IHBtZW1fcHV0ID4gcG1lbV9nZXQgJXMgKHBpZCAlZClcbiIsCisJCSAgICAgICBwbWVtW2lkXS5kZXYubmFtZSwgZGF0YS0+cGlkKTsKKwkJQlVHKCk7CisJfQorCWRhdGEtPnJlZi0tOworCXVwX3dyaXRlKCZkYXRhLT5zZW0pOworI2VuZGlmCisJZnB1dChmaWxlKTsKK30KKwordm9pZCBmbHVzaF9wbWVtX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhOworCWludCBpZDsKKwl2b2lkICp2YWRkcjsKKwlzdHJ1Y3QgcG1lbV9yZWdpb25fbm9kZSAqcmVnaW9uX25vZGU7CisJc3RydWN0IGxpc3RfaGVhZCAqZWx0OworCXZvaWQgKmZsdXNoX3N0YXJ0LCAqZmx1c2hfZW5kOworCisJaWYgKCFpc19wbWVtX2ZpbGUoZmlsZSkgfHwgIWhhc19hbGxvY2F0aW9uKGZpbGUpKSB7CisJCXJldHVybjsKKwl9CisKKwlpZCA9IGdldF9pZChmaWxlKTsKKwlkYXRhID0gKHN0cnVjdCBwbWVtX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKCFwbWVtW2lkXS5jYWNoZWQpCisJCXJldHVybjsKKworCWRvd25fcmVhZCgmZGF0YS0+c2VtKTsKKwl2YWRkciA9IHBtZW1fc3RhcnRfdmFkZHIoaWQsIGRhdGEpOworCS8qIGlmIHRoaXMgaXNuJ3QgYSBzdWJtbWFwcGVkIGZpbGUsIGZsdXNoIHRoZSB3aG9sZSB0aGluZyAqLworCWlmICh1bmxpa2VseSghKGRhdGEtPmZsYWdzICYgUE1FTV9GTEFHU19DT05ORUNURUQpKSkgeworCQlkbWFjX2ZsdXNoX3JhbmdlKHZhZGRyLCB2YWRkciArIHBtZW1fbGVuKGlkLCBkYXRhKSk7CisJCWdvdG8gZW5kOworCX0KKwkvKiBvdGhlcndpc2UsIGZsdXNoIHRoZSByZWdpb24gb2YgdGhlIGZpbGUgd2UgYXJlIGRyYXdpbmcgKi8KKwlsaXN0X2Zvcl9lYWNoKGVsdCwgJmRhdGEtPnJlZ2lvbl9saXN0KSB7CisJCXJlZ2lvbl9ub2RlID0gbGlzdF9lbnRyeShlbHQsIHN0cnVjdCBwbWVtX3JlZ2lvbl9ub2RlLCBsaXN0KTsKKwkJaWYgKChvZmZzZXQgPj0gcmVnaW9uX25vZGUtPnJlZ2lvbi5vZmZzZXQpICYmCisJCSAgICAoKG9mZnNldCArIGxlbikgPD0gKHJlZ2lvbl9ub2RlLT5yZWdpb24ub2Zmc2V0ICsKKwkJCXJlZ2lvbl9ub2RlLT5yZWdpb24ubGVuKSkpIHsKKwkJCWZsdXNoX3N0YXJ0ID0gdmFkZHIgKyByZWdpb25fbm9kZS0+cmVnaW9uLm9mZnNldDsKKwkJCWZsdXNoX2VuZCA9IGZsdXNoX3N0YXJ0ICsgcmVnaW9uX25vZGUtPnJlZ2lvbi5sZW47CisJCQlkbWFjX2ZsdXNoX3JhbmdlKGZsdXNoX3N0YXJ0LCBmbHVzaF9lbmQpOworCQkJYnJlYWs7CisJCX0KKwl9CitlbmQ6CisJdXBfcmVhZCgmZGF0YS0+c2VtKTsKK30KKworc3RhdGljIGludCBwbWVtX2Nvbm5lY3QodW5zaWduZWQgbG9uZyBjb25uZWN0LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhID0gKHN0cnVjdCBwbWVtX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHBtZW1fZGF0YSAqc3JjX2RhdGE7CisJc3RydWN0IGZpbGUgKnNyY19maWxlOworCWludCByZXQgPSAwLCBwdXRfbmVlZGVkOworCisJZG93bl93cml0ZSgmZGF0YS0+c2VtKTsKKwkvKiByZXRyaWV2ZSB0aGUgc3JjIGZpbGUgYW5kIGNoZWNrIGl0IGlzIGEgcG1lbSBmaWxlIHdpdGggYW4gYWxsb2MgKi8KKwlzcmNfZmlsZSA9IGZnZXRfbGlnaHQoY29ubmVjdCwgJnB1dF9uZWVkZWQpOworCURMT0coImNvbm5lY3QgJXAgdG8gJXBcbiIsIGZpbGUsIHNyY19maWxlKTsKKwlpZiAoIXNyY19maWxlKSB7CisJCXByaW50aygicG1lbTogc3JjIGZpbGUgbm90IGZvdW5kIVxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX25vX2ZpbGU7CisJfQorCWlmICh1bmxpa2VseSghaXNfcG1lbV9maWxlKHNyY19maWxlKSB8fCAhaGFzX2FsbG9jYXRpb24oc3JjX2ZpbGUpKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJwbWVtOiBzcmMgZmlsZSBpcyBub3QgYSBwbWVtIGZpbGUgb3IgaGFzIG5vICIKKwkJICAgICAgICJhbGxvYyFcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9iYWRfZmlsZTsKKwl9CisJc3JjX2RhdGEgPSAoc3RydWN0IHBtZW1fZGF0YSAqKXNyY19maWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoaGFzX2FsbG9jYXRpb24oZmlsZSkgJiYgKGRhdGEtPmluZGV4ICE9IHNyY19kYXRhLT5pbmRleCkpIHsKKwkJcHJpbnRrKCJwbWVtOiBmaWxlIGlzIGFscmVhZHkgbWFwcGVkIGJ1dCBkb2Vzbid0IG1hdGNoIHRoaXMiCisJCSAgICAgICAiIHNyY19maWxlIVxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2JhZF9maWxlOworCX0KKwlkYXRhLT5pbmRleCA9IHNyY19kYXRhLT5pbmRleDsKKwlkYXRhLT5mbGFncyB8PSBQTUVNX0ZMQUdTX0NPTk5FQ1RFRDsKKwlkYXRhLT5tYXN0ZXJfZmQgPSBjb25uZWN0OworCWRhdGEtPm1hc3Rlcl9maWxlID0gc3JjX2ZpbGU7CisKK2Vycl9iYWRfZmlsZToKKwlmcHV0X2xpZ2h0KHNyY19maWxlLCBwdXRfbmVlZGVkKTsKK2Vycl9ub19maWxlOgorCXVwX3dyaXRlKCZkYXRhLT5zZW0pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHBtZW1fdW5sb2NrX2RhdGFfYW5kX21tKHN0cnVjdCBwbWVtX2RhdGEgKmRhdGEsCisJCQkJICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXVwX3dyaXRlKCZkYXRhLT5zZW0pOworCWlmIChtbSAhPSBOVUxMKSB7CisJCXVwX3dyaXRlKCZtbS0+bW1hcF9zZW0pOworCQltbXB1dChtbSk7CisJfQorfQorCitzdGF0aWMgaW50IHBtZW1fbG9ja19kYXRhX2FuZF9tbShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBtZW1fZGF0YSAqZGF0YSwKKwkJCQkgc3RydWN0IG1tX3N0cnVjdCAqKmxvY2tlZF9tbSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IE5VTEw7CisJKmxvY2tlZF9tbSA9IE5VTEw7Citsb2NrX21tOgorCWRvd25fcmVhZCgmZGF0YS0+c2VtKTsKKwlpZiAoUE1FTV9JU19TVUJNQVAoZGF0YSkpIHsKKwkJbW0gPSBnZXRfdGFza19tbShkYXRhLT50YXNrKTsKKwkJaWYgKCFtbSkgeworI2lmIFBNRU1fREVCVUcKKwkJCXByaW50aygicG1lbTogY2FuJ3QgcmVtYXAgdGFzayBpcyBnb25lIVxuIik7CisjZW5kaWYKKwkJCXVwX3JlYWQoJmRhdGEtPnNlbSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJdXBfcmVhZCgmZGF0YS0+c2VtKTsKKworCWlmIChtbSkKKwkJZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKworCWRvd25fd3JpdGUoJmRhdGEtPnNlbSk7CisJLyogY2hlY2sgdGhhdCB0aGUgZmlsZSBkaWRuJ3QgZ2V0IG1tYXBlZCBiZWZvcmUgd2UgY291bGQgdGFrZSB0aGUKKwkgKiBkYXRhIHNlbSwgdGhpcyBzaG91bGQgYmUgc2FmZSBiL2MgeW91IGNhbiBvbmx5IHN1Ym1hcCBlYWNoIGZpbGUKKwkgKiBvbmNlICovCisJaWYgKFBNRU1fSVNfU1VCTUFQKGRhdGEpICYmICFtbSkgeworCQlwbWVtX3VubG9ja19kYXRhX2FuZF9tbShkYXRhLCBtbSk7CisJCXVwX3dyaXRlKCZkYXRhLT5zZW0pOworCQlnb3RvIGxvY2tfbW07CisJfQorCS8qIG5vdyBjaGVjayB0aGF0IHZtYS5tbSBpcyBzdGlsbCB0aGVyZSwgaXQgY291bGQgaGF2ZSBiZWVuCisJICogZGVsZXRlZCBieSB2bWFfY2xvc2UgYmVmb3JlIHdlIGNvdWxkIGdldCB0aGUgZGF0YS0+c2VtICovCisJaWYgKChkYXRhLT5mbGFncyAmIFBNRU1fRkxBR1NfVU5TVUJNQVApICYmIChtbSAhPSBOVUxMKSkgeworCQkvKiBtaWdodCBhcyB3ZWxsIHJlbGVhc2UgdGhpcyAqLworCQlpZiAoZGF0YS0+ZmxhZ3MgJiBQTUVNX0ZMQUdTX1NVQk1BUCkgeworCQkJcHV0X3Rhc2tfc3RydWN0KGRhdGEtPnRhc2spOworCQkJZGF0YS0+dGFzayA9IE5VTEw7CisJCQkvKiBsb3dlciB0aGUgc3VibWFwIGZsYWcgdG8gc2hvdyB0aGUgbW0gaXMgZ29uZSAqLworCQkJZGF0YS0+ZmxhZ3MgJj0gfihQTUVNX0ZMQUdTX1NVQk1BUCk7CisJCX0KKwkJcG1lbV91bmxvY2tfZGF0YV9hbmRfbW0oZGF0YSwgbW0pOworCQlyZXR1cm4gLTE7CisJfQorCSpsb2NrZWRfbW0gPSBtbTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgcG1lbV9yZW1hcChzdHJ1Y3QgcG1lbV9yZWdpb24gKnJlZ2lvbiwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgIHVuc2lnbmVkIG9wZXJhdGlvbikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBwbWVtX3JlZ2lvbl9ub2RlICpyZWdpb25fbm9kZTsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqZWx0LCAqZWx0MjsKKwlpbnQgaWQgPSBnZXRfaWQoZmlsZSk7CisJc3RydWN0IHBtZW1fZGF0YSAqZGF0YSA9IChzdHJ1Y3QgcG1lbV9kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJLyogcG1lbSByZWdpb24gbXVzdCBiZSBhbGlnbmVkIG9uIGEgcGFnZSBib3VuZHJ5ICovCisJaWYgKHVubGlrZWx5KCFQTUVNX0lTX1BBR0VfQUxJR05FRChyZWdpb24tPm9mZnNldCkgfHwKKwkJICFQTUVNX0lTX1BBR0VfQUxJR05FRChyZWdpb24tPmxlbikpKSB7CisjaWYgUE1FTV9ERUJVRworCQlwcmludGsoInBtZW06IHJlcXVlc3QgZm9yIHVuYWxpZ25lZCBwbWVtIHN1YmFsbG9jYXRpb24gIgorCQkgICAgICAgIiVseCAlbHhcbiIsIHJlZ2lvbi0+b2Zmc2V0LCByZWdpb24tPmxlbik7CisjZW5kaWYKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogaWYgdXNlcnNwYWNlIHJlcXVlc3RzIGEgcmVnaW9uIG9mIGxlbiAwLCB0aGVyZSdzIG5vdGhpbmcgdG8gZG8gKi8KKwlpZiAocmVnaW9uLT5sZW4gPT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBsb2NrIHRoZSBtbSBhbmQgZGF0YSAqLworCXJldCA9IHBtZW1fbG9ja19kYXRhX2FuZF9tbShmaWxlLCBkYXRhLCAmbW0pOworCWlmIChyZXQpCisJCXJldHVybiAwOworCisJLyogb25seSB0aGUgb3duZXIgb2YgdGhlIG1hc3RlciBmaWxlIGNhbiByZW1hcCB0aGUgY2xpZW50IGZkcworCSAqIHRoYXQgYmFjayBpbiBpdCAqLworCWlmICghaXNfbWFzdGVyX293bmVyKGZpbGUpKSB7CisjaWYgUE1FTV9ERUJVRworCQlwcmludGsoInBtZW06IHJlbWFwIHJlcXVlc3RlZCBmcm9tIG5vbi1tYXN0ZXIgcHJvY2Vzc1xuIik7CisjZW5kaWYKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJLyogY2hlY2sgdGhhdCB0aGUgcmVxdWVzdGVkIHJhbmdlIGlzIHdpdGhpbiB0aGUgc3JjIGFsbG9jYXRpb24gKi8KKwlpZiAodW5saWtlbHkoKHJlZ2lvbi0+b2Zmc2V0ID4gcG1lbV9sZW4oaWQsIGRhdGEpKSB8fAorCQkgICAgIChyZWdpb24tPmxlbiA+IHBtZW1fbGVuKGlkLCBkYXRhKSkgfHwKKwkJICAgICAocmVnaW9uLT5vZmZzZXQgKyByZWdpb24tPmxlbiA+IHBtZW1fbGVuKGlkLCBkYXRhKSkpKSB7CisjaWYgUE1FTV9ERUJVRworCQlwcmludGsoS0VSTl9JTkZPICJwbWVtOiBzdWJhbGxvYyBkb2Vzbid0IGZpdCBpbiBzcmNfZmlsZSFcbiIpOworI2VuZGlmCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCWlmIChvcGVyYXRpb24gPT0gUE1FTV9NQVApIHsKKwkJcmVnaW9uX25vZGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG1lbV9yZWdpb25fbm9kZSksCisJCQkgICAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKCFyZWdpb25fbm9kZSkgeworCQkJcmV0ID0gLUVOT01FTTsKKyNpZiBQTUVNX0RFQlVHCisJCQlwcmludGsoS0VSTl9JTkZPICJObyBzcGFjZSB0byBhbGxvY2F0ZSBtZXRhZGF0YSEiKTsKKyNlbmRpZgorCQkJZ290byBlcnI7CisJCX0KKwkJcmVnaW9uX25vZGUtPnJlZ2lvbiA9ICpyZWdpb247CisJCWxpc3RfYWRkKCZyZWdpb25fbm9kZS0+bGlzdCwgJmRhdGEtPnJlZ2lvbl9saXN0KTsKKwl9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PSBQTUVNX1VOTUFQKSB7CisJCWludCBmb3VuZCA9IDA7CisJCWxpc3RfZm9yX2VhY2hfc2FmZShlbHQsIGVsdDIsICZkYXRhLT5yZWdpb25fbGlzdCkgeworCQkJcmVnaW9uX25vZGUgPSBsaXN0X2VudHJ5KGVsdCwgc3RydWN0IHBtZW1fcmVnaW9uX25vZGUsCisJCQkJICAgICAgbGlzdCk7CisJCQlpZiAocmVnaW9uLT5sZW4gPT0gMCB8fAorCQkJICAgIChyZWdpb25fbm9kZS0+cmVnaW9uLm9mZnNldCA9PSByZWdpb24tPm9mZnNldCAmJgorCQkJICAgIHJlZ2lvbl9ub2RlLT5yZWdpb24ubGVuID09IHJlZ2lvbi0+bGVuKSkgeworCQkJCWxpc3RfZGVsKGVsdCk7CisJCQkJa2ZyZWUocmVnaW9uX25vZGUpOworCQkJCWZvdW5kID0gMTsKKwkJCX0KKwkJfQorCQlpZiAoIWZvdW5kKSB7CisjaWYgUE1FTV9ERUJVRworCQkJcHJpbnRrKCJwbWVtOiBVbm1hcCByZWdpb24gZG9lcyBub3QgbWFwIGFueSBtYXBwZWQgIgorCQkJCSJyZWdpb24hIik7CisjZW5kaWYKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKworCWlmIChkYXRhLT52bWEgJiYgUE1FTV9JU19TVUJNQVAoZGF0YSkpIHsKKwkJaWYgKG9wZXJhdGlvbiA9PSBQTUVNX01BUCkKKwkJCXJldCA9IHBtZW1fcmVtYXBfcGZuX3JhbmdlKGlkLCBkYXRhLT52bWEsIGRhdGEsCisJCQkJCQkgICByZWdpb24tPm9mZnNldCwgcmVnaW9uLT5sZW4pOworCQllbHNlIGlmIChvcGVyYXRpb24gPT0gUE1FTV9VTk1BUCkKKwkJCXJldCA9IHBtZW1fdW5tYXBfcGZuX3JhbmdlKGlkLCBkYXRhLT52bWEsIGRhdGEsCisJCQkJCQkgICByZWdpb24tPm9mZnNldCwgcmVnaW9uLT5sZW4pOworCX0KKworZXJyOgorCXBtZW1fdW5sb2NrX2RhdGFfYW5kX21tKGRhdGEsIG1tKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBwbWVtX3Jldm9rZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBtZW1fZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgcG1lbV9yZWdpb25fbm9kZSAqcmVnaW9uX25vZGU7CisJc3RydWN0IGxpc3RfaGVhZCAqZWx0LCAqZWx0MjsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IE5VTEw7CisJaW50IGlkID0gZ2V0X2lkKGZpbGUpOworCWludCByZXQgPSAwOworCisJZGF0YS0+bWFzdGVyX2ZpbGUgPSBOVUxMOworCXJldCA9IHBtZW1fbG9ja19kYXRhX2FuZF9tbShmaWxlLCBkYXRhLCAmbW0pOworCS8qIGlmIGxvY2tfZGF0YV9hbmRfbW0gZmFpbHMgZWl0aGVyIHRoZSB0YXNrIHRoYXQgbWFwcGVkIHRoZSBmZCwgb3IKKwkgKiB0aGUgdm1hIHRoYXQgbWFwcGVkIGl0IGhhdmUgYWxyZWFkeSBnb25lIGF3YXksIG5vdGhpbmcgbW9yZQorCSAqIG5lZWRzIHRvIGJlIGRvbmUgKi8KKwlpZiAocmV0KQorCQlyZXR1cm47CisJLyogdW5tYXAgZXZlcnl0aGluZyAqLworCS8qIGRlbGV0ZSB0aGUgcmVnaW9ucyBhbmQgcmVnaW9uIGxpc3Qgbm90aGluZyBpcyBtYXBwZWQgYW55IG1vcmUgKi8KKwlpZiAoZGF0YS0+dm1hKQorCQlsaXN0X2Zvcl9lYWNoX3NhZmUoZWx0LCBlbHQyLCAmZGF0YS0+cmVnaW9uX2xpc3QpIHsKKwkJCXJlZ2lvbl9ub2RlID0gbGlzdF9lbnRyeShlbHQsIHN0cnVjdCBwbWVtX3JlZ2lvbl9ub2RlLAorCQkJCQkJIGxpc3QpOworCQkJcG1lbV91bm1hcF9wZm5fcmFuZ2UoaWQsIGRhdGEtPnZtYSwgZGF0YSwKKwkJCQkJICAgICByZWdpb25fbm9kZS0+cmVnaW9uLm9mZnNldCwKKwkJCQkJICAgICByZWdpb25fbm9kZS0+cmVnaW9uLmxlbik7CisJCQlsaXN0X2RlbChlbHQpOworCQkJa2ZyZWUocmVnaW9uX25vZGUpOworCX0KKwkvKiBkZWxldGUgdGhlIG1hc3RlciBmaWxlICovCisJcG1lbV91bmxvY2tfZGF0YV9hbmRfbW0oZGF0YSwgbW0pOworfQorCitzdGF0aWMgdm9pZCBwbWVtX2dldF9zaXplKHN0cnVjdCBwbWVtX3JlZ2lvbiAqcmVnaW9uLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhID0gKHN0cnVjdCBwbWVtX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IGlkID0gZ2V0X2lkKGZpbGUpOworCisJaWYgKCFoYXNfYWxsb2NhdGlvbihmaWxlKSkgeworCQlyZWdpb24tPm9mZnNldCA9IDA7CisJCXJlZ2lvbi0+bGVuID0gMDsKKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCXJlZ2lvbi0+b2Zmc2V0ID0gcG1lbV9zdGFydF9hZGRyKGlkLCBkYXRhKTsKKwkJcmVnaW9uLT5sZW4gPSBwbWVtX2xlbihpZCwgZGF0YSk7CisJfQorCURMT0coIm9mZnNldCAlbHggbGVuICVseFxuIiwgcmVnaW9uLT5vZmZzZXQsIHJlZ2lvbi0+bGVuKTsKK30KKworCitzdGF0aWMgbG9uZyBwbWVtX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhOworCWludCBpZCA9IGdldF9pZChmaWxlKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBQTUVNX0dFVF9QSFlTOgorCQl7CisJCQlzdHJ1Y3QgcG1lbV9yZWdpb24gcmVnaW9uOworCQkJRExPRygiZ2V0X3BoeXNcbiIpOworCQkJaWYgKCFoYXNfYWxsb2NhdGlvbihmaWxlKSkgeworCQkJCXJlZ2lvbi5vZmZzZXQgPSAwOworCQkJCXJlZ2lvbi5sZW4gPSAwOworCQkJfSBlbHNlIHsKKwkJCQlkYXRhID0gKHN0cnVjdCBwbWVtX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJCQkJcmVnaW9uLm9mZnNldCA9IHBtZW1fc3RhcnRfYWRkcihpZCwgZGF0YSk7CisJCQkJcmVnaW9uLmxlbiA9IHBtZW1fbGVuKGlkLCBkYXRhKTsKKwkJCX0KKwkJCXByaW50ayhLRVJOX0lORk8gInBtZW06IHJlcXVlc3QgZm9yIHBoeXNpY2FsIGFkZHJlc3Mgb2YgcG1lbSByZWdpb24gIgorCQkJCQkiZnJvbSBwcm9jZXNzICVkLlxuIiwgY3VycmVudC0+cGlkKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmcmVnaW9uLAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBwbWVtX3JlZ2lvbikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwljYXNlIFBNRU1fTUFQOgorCQl7CisJCQlzdHJ1Y3QgcG1lbV9yZWdpb24gcmVnaW9uOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZyZWdpb24sICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkJCXNpemVvZihzdHJ1Y3QgcG1lbV9yZWdpb24pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWRhdGEgPSAoc3RydWN0IHBtZW1fZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwkJCXJldHVybiBwbWVtX3JlbWFwKCZyZWdpb24sIGZpbGUsIFBNRU1fTUFQKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFBNRU1fVU5NQVA6CisJCXsKKwkJCXN0cnVjdCBwbWVtX3JlZ2lvbiByZWdpb247CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnJlZ2lvbiwgKHZvaWQgX191c2VyICopYXJnLAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBwbWVtX3JlZ2lvbikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJZGF0YSA9IChzdHJ1Y3QgcG1lbV9kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCQkJcmV0dXJuIHBtZW1fcmVtYXAoJnJlZ2lvbiwgZmlsZSwgUE1FTV9VTk1BUCk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgUE1FTV9HRVRfU0laRToKKwkJeworCQkJc3RydWN0IHBtZW1fcmVnaW9uIHJlZ2lvbjsKKwkJCURMT0coImdldF9zaXplXG4iKTsKKwkJCXBtZW1fZ2V0X3NpemUoJnJlZ2lvbiwgZmlsZSk7CisJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnJlZ2lvbiwKKwkJCQkJCXNpemVvZihzdHJ1Y3QgcG1lbV9yZWdpb24pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBQTUVNX0dFVF9UT1RBTF9TSVpFOgorCQl7CisJCQlzdHJ1Y3QgcG1lbV9yZWdpb24gcmVnaW9uOworCQkJRExPRygiZ2V0IHRvdGFsIHNpemVcbiIpOworCQkJcmVnaW9uLm9mZnNldCA9IDA7CisJCQlnZXRfaWQoZmlsZSk7CisJCQlyZWdpb24ubGVuID0gcG1lbVtpZF0uc2l6ZTsKKwkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmcmVnaW9uLAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBwbWVtX3JlZ2lvbikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwljYXNlIFBNRU1fQUxMT0NBVEU6CisJCXsKKwkJCWlmIChoYXNfYWxsb2NhdGlvbihmaWxlKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWRhdGEgPSAoc3RydWN0IHBtZW1fZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwkJCWRhdGEtPmluZGV4ID0gcG1lbV9hbGxvY2F0ZShpZCwgYXJnKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBQTUVNX0NPTk5FQ1Q6CisJCURMT0coImNvbm5lY3RcbiIpOworCQlyZXR1cm4gcG1lbV9jb25uZWN0KGFyZywgZmlsZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmIChwbWVtW2lkXS5pb2N0bCkKKwkJCXJldHVybiBwbWVtW2lkXS5pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmIFBNRU1fREVCVUcKK3N0YXRpYyBzc2l6ZV90IGRlYnVnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgZGVidWdfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJICBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZWx0LCAqZWx0MjsKKwlzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhOworCXN0cnVjdCBwbWVtX3JlZ2lvbl9ub2RlICpyZWdpb25fbm9kZTsKKwlpbnQgaWQgPSAoaW50KWZpbGUtPnByaXZhdGVfZGF0YTsKKwljb25zdCBpbnQgZGVidWdfYnVmbWF4ID0gNDA5NjsKKwlzdGF0aWMgY2hhciBidWZmZXJbNDA5Nl07CisJaW50IG4gPSAwOworCisJRExPRygiZGVidWcgb3BlblxuIik7CisJbiA9IHNjbnByaW50ZihidWZmZXIsIGRlYnVnX2J1Zm1heCwKKwkJICAgICAgInBpZCAjOiBtYXBwZWQgcmVnaW9ucyAob2Zmc2V0LCBsZW4pIChvZmZzZXQsbGVuKS4uLlxuIik7CisKKwlkb3duKCZwbWVtW2lkXS5kYXRhX2xpc3Rfc2VtKTsKKwlsaXN0X2Zvcl9lYWNoKGVsdCwgJnBtZW1baWRdLmRhdGFfbGlzdCkgeworCQlkYXRhID0gbGlzdF9lbnRyeShlbHQsIHN0cnVjdCBwbWVtX2RhdGEsIGxpc3QpOworCQlkb3duX3JlYWQoJmRhdGEtPnNlbSk7CisJCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sICJwaWQgJXU6IiwKKwkJCQlkYXRhLT5waWQpOworCQlsaXN0X2Zvcl9lYWNoKGVsdDIsICZkYXRhLT5yZWdpb25fbGlzdCkgeworCQkJcmVnaW9uX25vZGUgPSBsaXN0X2VudHJ5KGVsdDIsIHN0cnVjdCBwbWVtX3JlZ2lvbl9ub2RlLAorCQkJCSAgICAgIGxpc3QpOworCQkJbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKKwkJCQkJIiglbHgsJWx4KSAiLAorCQkJCQlyZWdpb25fbm9kZS0+cmVnaW9uLm9mZnNldCwKKwkJCQkJcmVnaW9uX25vZGUtPnJlZ2lvbi5sZW4pOworCQl9CisJCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sICJcbiIpOworCQl1cF9yZWFkKCZkYXRhLT5zZW0pOworCX0KKwl1cCgmcG1lbVtpZF0uZGF0YV9saXN0X3NlbSk7CisKKwluKys7CisJYnVmZmVyW25dID0gMDsKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgYnVmZmVyLCBuKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVidWdfZm9wcyA9IHsKKwkucmVhZCA9IGRlYnVnX3JlYWQsCisJLm9wZW4gPSBkZWJ1Z19vcGVuLAorfTsKKyNlbmRpZgorCisjaWYgMAorc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHBtZW1fZGV2ID0geworCS5uYW1lID0gInBtZW0iLAorCS5mb3BzID0gJnBtZW1fZm9wcywKK307CisjZW5kaWYKKworaW50IHBtZW1fc2V0dXAoc3RydWN0IGFuZHJvaWRfcG1lbV9wbGF0Zm9ybV9kYXRhICpwZGF0YSwKKwkgICAgICAgbG9uZyAoKmlvY3RsKShzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpLAorCSAgICAgICBpbnQgKCpyZWxlYXNlKShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKikpCit7CisJaW50IGVyciA9IDA7CisJaW50IGksIGluZGV4ID0gMDsKKwlpbnQgaWQgPSBpZF9jb3VudDsKKwlpZF9jb3VudCsrOworCisJcG1lbVtpZF0ubm9fYWxsb2NhdG9yID0gcGRhdGEtPm5vX2FsbG9jYXRvcjsKKwlwbWVtW2lkXS5jYWNoZWQgPSBwZGF0YS0+Y2FjaGVkOworCXBtZW1baWRdLmJ1ZmZlcmVkID0gcGRhdGEtPmJ1ZmZlcmVkOworCXBtZW1baWRdLmJhc2UgPSBwZGF0YS0+c3RhcnQ7CisJcG1lbVtpZF0uc2l6ZSA9IHBkYXRhLT5zaXplOworCXBtZW1baWRdLmlvY3RsID0gaW9jdGw7CisJcG1lbVtpZF0ucmVsZWFzZSA9IHJlbGVhc2U7CisJaW5pdF9yd3NlbSgmcG1lbVtpZF0uYml0bWFwX3NlbSk7CisJaW5pdF9NVVRFWCgmcG1lbVtpZF0uZGF0YV9saXN0X3NlbSk7CisJSU5JVF9MSVNUX0hFQUQoJnBtZW1baWRdLmRhdGFfbGlzdCk7CisJcG1lbVtpZF0uZGV2Lm5hbWUgPSBwZGF0YS0+bmFtZTsKKwlwbWVtW2lkXS5kZXYubWlub3IgPSBpZDsKKwlwbWVtW2lkXS5kZXYuZm9wcyA9ICZwbWVtX2ZvcHM7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVkIGluaXRcbiIsIHBkYXRhLT5uYW1lLCBwZGF0YS0+Y2FjaGVkKTsKKworCWVyciA9IG1pc2NfcmVnaXN0ZXIoJnBtZW1baWRdLmRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9BTEVSVCAiVW5hYmxlIHRvIHJlZ2lzdGVyIHBtZW0gZHJpdmVyIVxuIik7CisJCWdvdG8gZXJyX2NhbnRfcmVnaXN0ZXJfZGV2aWNlOworCX0KKwlwbWVtW2lkXS5udW1fZW50cmllcyA9IHBtZW1baWRdLnNpemUgLyBQTUVNX01JTl9BTExPQzsKKworCXBtZW1baWRdLmJpdG1hcCA9IGttYWxsb2MocG1lbVtpZF0ubnVtX2VudHJpZXMgKgorCQkJCSAgc2l6ZW9mKHN0cnVjdCBwbWVtX2JpdHMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBtZW1baWRdLmJpdG1hcCkKKwkJZ290byBlcnJfbm9fbWVtX2Zvcl9tZXRhZGF0YTsKKworCW1lbXNldChwbWVtW2lkXS5iaXRtYXAsIDAsIHNpemVvZihzdHJ1Y3QgcG1lbV9iaXRzKSAqCisJCQkJCSAgcG1lbVtpZF0ubnVtX2VudHJpZXMpOworCisJZm9yIChpID0gc2l6ZW9mKHBtZW1baWRdLm51bV9lbnRyaWVzKSAqIDggLSAxOyBpID49IDA7IGktLSkgeworCQlpZiAoKHBtZW1baWRdLm51bV9lbnRyaWVzKSAmICAxPDxpKSB7CisJCQlQTUVNX09SREVSKGlkLCBpbmRleCkgPSBpOworCQkJaW5kZXggPSBQTUVNX05FWFRfSU5ERVgoaWQsIGluZGV4KTsKKwkJfQorCX0KKworCWlmIChwbWVtW2lkXS5jYWNoZWQpCisJCXBtZW1baWRdLnZiYXNlID0gaW9yZW1hcF9jYWNoZWQocG1lbVtpZF0uYmFzZSwKKwkJCQkJCXBtZW1baWRdLnNpemUpOworI2lmZGVmIGlvcmVtYXBfZXh0X2J1ZmZlcmVkCisJZWxzZSBpZiAocG1lbVtpZF0uYnVmZmVyZWQpCisJCXBtZW1baWRdLnZiYXNlID0gaW9yZW1hcF9leHRfYnVmZmVyZWQocG1lbVtpZF0uYmFzZSwKKwkJCQkJCSAgICAgIHBtZW1baWRdLnNpemUpOworI2VuZGlmCisJZWxzZQorCQlwbWVtW2lkXS52YmFzZSA9IGlvcmVtYXAocG1lbVtpZF0uYmFzZSwgcG1lbVtpZF0uc2l6ZSk7CisKKwlpZiAocG1lbVtpZF0udmJhc2UgPT0gMCkKKwkJZ290byBlcnJvcl9jYW50X3JlbWFwOworCisJcG1lbVtpZF0uZ2FyYmFnZV9wZm4gPSBwYWdlX3RvX3BmbihhbGxvY19wYWdlKEdGUF9LRVJORUwpKTsKKwlpZiAocG1lbVtpZF0ubm9fYWxsb2NhdG9yKQorCQlwbWVtW2lkXS5hbGxvY2F0ZWQgPSAwOworCisjaWYgUE1FTV9ERUJVRworCWRlYnVnZnNfY3JlYXRlX2ZpbGUocGRhdGEtPm5hbWUsIFNfSUZSRUcgfCBTX0lSVUdPLCBOVUxMLCAodm9pZCAqKWlkLAorCQkJICAgICZkZWJ1Z19mb3BzKTsKKyNlbmRpZgorCXJldHVybiAwOworZXJyb3JfY2FudF9yZW1hcDoKKwlrZnJlZShwbWVtW2lkXS5iaXRtYXApOworZXJyX25vX21lbV9mb3JfbWV0YWRhdGE6CisJbWlzY19kZXJlZ2lzdGVyKCZwbWVtW2lkXS5kZXYpOworZXJyX2NhbnRfcmVnaXN0ZXJfZGV2aWNlOgorCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBwbWVtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFuZHJvaWRfcG1lbV9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKworCWlmICghcGRldiB8fCAhcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpIHsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIlVuYWJsZSB0byBwcm9iZSBwbWVtIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlyZXR1cm4gcG1lbV9zZXR1cChwZGF0YSwgTlVMTCwgTlVMTCk7Cit9CisKKworc3RhdGljIGludCBwbWVtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCBpZCA9IHBkZXYtPmlkOworCV9fZnJlZV9wYWdlKHBmbl90b19wYWdlKHBtZW1baWRdLmdhcmJhZ2VfcGZuKSk7CisJbWlzY19kZXJlZ2lzdGVyKCZwbWVtW2lkXS5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwbWVtX2RyaXZlciA9IHsKKwkucHJvYmUgPSBwbWVtX3Byb2JlLAorCS5yZW1vdmUgPSBwbWVtX3JlbW92ZSwKKwkuZHJpdmVyID0geyAubmFtZSA9ICJhbmRyb2lkX3BtZW0iIH0KK307CisKKworc3RhdGljIGludCBfX2luaXQgcG1lbV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmcG1lbV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcG1lbV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBtZW1fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocG1lbV9pbml0KTsKK21vZHVsZV9leGl0KHBtZW1fZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9xZHNwNS9hZHNwLmMgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vcWRzcDUvYWRzcC5jCmluZGV4IGQwOTY0NTYuLjkwNjk1MzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9xZHNwNS9hZHNwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3Fkc3A1L2Fkc3AuYwpAQCAtMzIsMTYgKzMyLDEyIEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWtlbG9jay5oPgogCi1zdGF0aWMgc3RydWN0IHdha2VfbG9jayBhZHNwX3dha2VfbG9jazsKIHN0YXRpYyBpbmxpbmUgdm9pZCBwcmV2ZW50X3N1c3BlbmQodm9pZCkKIHsKLQl3YWtlX2xvY2soJmFkc3Bfd2FrZV9sb2NrKTsKIH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBhbGxvd19zdXNwZW5kKHZvaWQpCiB7Ci0Jd2FrZV91bmxvY2soJmFkc3Bfd2FrZV9sb2NrKTsKIH0KIAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CkBAIC0xMDQ2LDcgKzEwNDIsNiBAQAogCiAJcHJfaW5mbygiYWRzcDogcHJvYmVcbiIpOwogCi0Jd2FrZV9sb2NrX2luaXQoJmFkc3Bfd2FrZV9sb2NrLCBXQUtFX0xPQ0tfU1VTUEVORCwgImFkc3AiKTsKICNpZiBDT05GSUdfTVNNX0FNU1NfVkVSU0lPTiA+PSA2MzUwCiAJYWRzcF9pbmZvLmluaXRfaW5mb19wdHIgPSBremFsbG9jKAogCQkoc2l6ZW9mKHN0cnVjdCBhZHNwX3J0b3NfbXBfbXRvYV9pbml0X2luZm9fdHlwZSkpLCBHRlBfS0VSTkVMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9xZHNwNS9hdWRpb19vdXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9xZHNwNS9hdWRpb19vdXQuYwppbmRleCBkMWFkY2Y2Li5kZjg3Y2EzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vcWRzcDUvYXVkaW9fb3V0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3Fkc3A1L2F1ZGlvX291dC5jCkBAIC0zOCw4ICszOCw2IEBACiAjaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBwY21kaS5oPgogI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRwcG1zZy5oPgogCi0jaW5jbHVkZSA8bWFjaC9odGNfcHdyc2luay5oPgotCiAjaW5jbHVkZSAiZXZsb2cuaCIKIAogI2RlZmluZSBMT0dfQVVESU9fRVZFTlRTIDEKQEAgLTI2MCw3ICsyNTgsNiBAQAogCX0KIAogCWF1ZGlvLT5lbmFibGVkID0gMTsKLQlodGNfcHdyc2lua19zZXQoUFdSU0lOS19BVURJTywgMTAwKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjk1LDcgKzY5Miw2IEBACiAJYXVkaW9fZmx1c2goYXVkaW8pOwogCWF1ZGlvLT5vcGVuZWQgPSAwOwogCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCWh0Y19wd3JzaW5rX3NldChQV1JTSU5LX0FVRElPLCAwKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3NtZC9zbWRfcW1pLmMgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vc21kL3NtZF9xbWkuYwppbmRleCBkNGU3ZDg4Li42ODdkYjE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vc21kL3NtZF9xbWkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vc21kL3NtZF9xbWkuYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FrZWxvY2suaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bWFjaC9tc21fc21kLmg+CkBAIC03NCw3ICs3Myw2IEBACiAKIAlzbWRfY2hhbm5lbF90ICpjaDsKIAljb25zdCBjaGFyICpjaF9uYW1lOwotCXN0cnVjdCB3YWtlX2xvY2sgd2FrZV9sb2NrOwogCiAJc3RydWN0IHdvcmtfc3RydWN0IG9wZW5fd29yazsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVhZF93b3JrOwpAQCAtOTAsNyArODgsNiBAQAogCW11dGV4X2luaXQoJmN0eHQtPmxvY2spOwogCUlOSVRfV09SSygmY3R4dC0+cmVhZF93b3JrLCBxbWlfcmVhZF93b3JrKTsKIAlJTklUX1dPUksoJmN0eHQtPm9wZW5fd29yaywgcW1pX29wZW5fd29yayk7Ci0Jd2FrZV9sb2NrX2luaXQoJmN0eHQtPndha2VfbG9jaywgV0FLRV9MT0NLX1NVU1BFTkQsIGN0eHQtPm1pc2MubmFtZSk7CiAJY3R4dC0+Y3RsX3R4bl9pZCA9IDE7CiAJY3R4dC0+d2RzX3R4bl9pZCA9IDE7CiAJY3R4dC0+d2RzX2J1c3kgPSAxOwpAQCAtNDU0LDcgKzQ1MSw2IEBACiAJCWJyZWFrOwogCX0KIAltdXRleF91bmxvY2soJmN0eHQtPmxvY2spOwotCiAJd2FrZV91cCgmcW1pX3dhaXRfcXVldWUpOwogfQogCkBAIC01MDksNyArNTA1LDYgQEAKIAkJaW50IHN6OwogCQlzeiA9IHNtZF9jdXJfcGFja2V0X3NpemUoY3R4dC0+Y2gpOwogCQlpZiAoKHN6ID4gMCkgJiYgKHN6IDw9IHNtZF9yZWFkX2F2YWlsKGN0eHQtPmNoKSkpIHsKLQkJCXdha2VfbG9ja190aW1lb3V0KCZjdHh0LT53YWtlX2xvY2ssIEhaIC8gMik7CiAJCQlxdWV1ZV93b3JrKHFtaV93cSwgJmN0eHQtPnJlYWRfd29yayk7CiAJCX0KIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vc21kL3NtZF9ycGNyb3V0ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9zbWQvc21kX3JwY3JvdXRlci5jCmluZGV4IGQ0YTRhODguLjVhYzJjZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9zbWQvc21kX3JwY3JvdXRlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9zbWQvc21kX3JwY3JvdXRlci5jCkBAIC0zMyw3ICszMyw2IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FrZWxvY2suaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTk2LDcgKzk1LDYgQEAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc21kX2xvY2spOwogCiBzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnJwY3JvdXRlcl93b3JrcXVldWU7Ci1zdGF0aWMgc3RydWN0IHdha2VfbG9jayBycGNyb3V0ZXJfd2FrZV9sb2NrOwogc3RhdGljIGludCBycGNyb3V0ZXJfbmVlZF9sZW47CiAKIHN0YXRpYyBhdG9taWNfdCBuZXh0X3hpZCA9IEFUT01JQ19JTklUKDEpOwpAQCAtMjkwLDcgKzI4OCw2IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZXB0LT53YWl0X3EpOwogCUlOSVRfTElTVF9IRUFEKCZlcHQtPnJlYWRfcSk7CiAJc3Bpbl9sb2NrX2luaXQoJmVwdC0+cmVhZF9xX2xvY2spOwotCXdha2VfbG9ja19pbml0KCZlcHQtPnJlYWRfcV93YWtlX2xvY2ssIFdBS0VfTE9DS19TVVNQRU5ELCAicnBjX3JlYWQiKTsKIAlJTklUX0xJU1RfSEVBRCgmZXB0LT5pbmNvbXBsZXRlKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NhbF9lbmRwb2ludHNfbG9jaywgZmxhZ3MpOwpAQCAtMzEzLDcgKzMxMCw2IEBACiAJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIHJjOwogCi0Jd2FrZV9sb2NrX2Rlc3Ryb3koJmVwdC0+cmVhZF9xX3dha2VfbG9jayk7CiAJbGlzdF9kZWwoJmVwdC0+bGlzdCk7CiAJa2ZyZWUoZXB0KTsKIAlyZXR1cm4gMDsKQEAgLTU0MCw4ICs1MzYsNiBAQAogCWlmIChldmVudCAhPSBTTURfRVZFTlRfREFUQSkKIAkJcmV0dXJuOwogCi0JaWYgKHNtZF9yZWFkX2F2YWlsKHNtZF9jaGFubmVsKSA+PSBycGNyb3V0ZXJfbmVlZF9sZW4pCi0JCXdha2VfbG9jaygmcnBjcm91dGVyX3dha2VfbG9jayk7CiAJd2FrZV91cCgmc21kX3dhaXQpOwogfQogCkBAIC01NzYsNyArNTcwLDYgQEAKIAkJCQlyZXR1cm4gLUVJTzsKIAkJfQogCQlycGNyb3V0ZXJfbmVlZF9sZW4gPSBsZW47Ci0JCXdha2VfdW5sb2NrKCZycGNyb3V0ZXJfd2FrZV9sb2NrKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc21kX2xvY2ssIGZsYWdzKTsKIAogLy8JCXByaW50aygicnJfcmVhZDogd2FpdGluZyAoJWQpXG4iLCBsZW4pOwpAQCAtNjc2LDcgKzY2OSw2IEBACiAKIHBhY2tldF9jb21wbGV0ZToKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZXB0LT5yZWFkX3FfbG9jaywgZmxhZ3MpOwotCXdha2VfbG9jaygmZXB0LT5yZWFkX3Ffd2FrZV9sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZwa3QtPmxpc3QsICZlcHQtPnJlYWRfcSk7CiAJd2FrZV91cCgmZXB0LT53YWl0X3EpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwdC0+cmVhZF9xX2xvY2ssIGZsYWdzKTsKQEAgLTY5OSw3ICs2OTEsNiBAQAogZmFpbF9pbzoKIGZhaWxfZGF0YToKIAlwcmludGsoS0VSTl9FUlIgInJwY19yb3V0ZXIgaGFzIGRpZWRcbiIpOwotCXdha2VfdW5sb2NrKCZycGNyb3V0ZXJfd2FrZV9sb2NrKTsKIH0KIAogdm9pZCBtc21fcnBjX3NldHVwX3JlcShzdHJ1Y3QgcnBjX3JlcXVlc3RfaGRyICpoZHIsIHVpbnQzMl90IHByb2csCkBAIC0xMDYxLDggKzEwNTIsNiBAQAogCQlyZXR1cm4gLUVUT09TTUFMTDsKIAl9CiAJbGlzdF9kZWwoJnBrdC0+bGlzdCk7Ci0JaWYgKGxpc3RfZW1wdHkoJmVwdC0+cmVhZF9xKSkKLQkJd2FrZV91bmxvY2soJmVwdC0+cmVhZF9xX3dha2VfbG9jayk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXB0LT5yZWFkX3FfbG9jaywgZmxhZ3MpOwogCiAJcmMgPSBwa3QtPmxlbmd0aDsKQEAgLTEyMjksNyArMTIxOCw2IEBACiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZuZXdzZXJ2ZXJfd2FpdCk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmc21kX3dhaXQpOwotCXdha2VfbG9ja19pbml0KCZycGNyb3V0ZXJfd2FrZV9sb2NrLCBXQUtFX0xPQ0tfU1VTUEVORCwgIlNNRF9SUENDQUxMIik7CiAKIAlycGNyb3V0ZXJfd29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoInJwY3JvdXRlciIpOwogCWlmICghcnBjcm91dGVyX3dvcmtxdWV1ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9zbWQvc21kX3JwY3JvdXRlci5oIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3NtZC9zbWRfcnBjcm91dGVyLmgKaW5kZXggYTc0MTZhMi4uODZhYjk5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3NtZC9zbWRfcnBjcm91dGVyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3NtZC9zbWRfcnBjcm91dGVyLmgKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3dha2Vsb2NrLmg+CiAKICNpbmNsdWRlIDxtYWNoL21zbV9zbWQuaD4KICNpbmNsdWRlIDxtYWNoL21zbV9ycGNyb3V0ZXIuaD4KQEAgLTE0NCw3ICsxNDMsNiBAQAogCS8qIGNvbXBsZXRlIHBhY2tldHMgd2FpdGluZyB0byBiZSByZWFkICovCiAJc3RydWN0IGxpc3RfaGVhZCByZWFkX3E7CiAJc3BpbmxvY2tfdCByZWFkX3FfbG9jazsKLQlzdHJ1Y3Qgd2FrZV9sb2NrIHJlYWRfcV93YWtlX2xvY2s7CiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9xOwogCXVuc2lnbmVkIGZsYWdzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vc21kL3NtZF90dHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9zbWQvc21kX3R0eS5jCmluZGV4IDJlZGQ5ZDEuLmY0MDk0NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9zbWQvc21kX3R0eS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9zbWQvc21kX3R0eS5jCkBAIC0xOSw3ICsxOSw2IEBACiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWtlbG9jay5oPgogCiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvdHR5X2RyaXZlci5oPgpAQCAtMzQsNyArMzMsNiBAQAogc3RydWN0IHNtZF90dHlfaW5mbyB7CiAJc21kX2NoYW5uZWxfdCAqY2g7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKLQlzdHJ1Y3Qgd2FrZV9sb2NrIHdha2VfbG9jazsKIAlpbnQgb3Blbl9jb3VudDsKIH07CiAKQEAgLTY5LDcgKzY3LDYgQEAKIAkJCXByaW50ayhLRVJOX0VSUiAiT09QUyAtIHNtZF90dHlfYnVmZmVyIG1pc21hdGNoPyEiKTsKIAkJfQogCi0JCXdha2VfbG9ja190aW1lb3V0KCZpbmZvLT53YWtlX2xvY2ssIEhaIC8gMik7CiAJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiAJfQogCkBAIC05NSw3ICs5Miw2IEBACiAJaW5mbyA9IHNtZF90dHkgKyBuOwogCiAJbXV0ZXhfbG9jaygmc21kX3R0eV9sb2NrKTsKLQl3YWtlX2xvY2tfaW5pdCgmaW5mby0+d2FrZV9sb2NrLCBXQUtFX0xPQ0tfU1VTUEVORCwgbmFtZSk7CiAJdHR5LT5kcml2ZXJfZGF0YSA9IGluZm87CiAKIAlpZiAoaW5mby0+b3Blbl9jb3VudCsrID09IDApIHsKQEAgLTEyMiw3ICsxMTgsNiBAQAogCWlmICgtLWluZm8tPm9wZW5fY291bnQgPT0gMCkgewogCQlpbmZvLT50dHkgPSAwOwogCQl0dHktPmRyaXZlcl9kYXRhID0gMDsKLQkJd2FrZV9sb2NrX2Rlc3Ryb3koJmluZm8tPndha2VfbG9jayk7CiAJCWlmIChpbmZvLT5jaCkgewogCQkJc21kX2Nsb3NlKGluZm8tPmNoKTsKIAkJCWluZm8tPmNoID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9zeW5hcHRpY3NfaTJjX3JtaS5jIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3N5bmFwdGljc19pMmNfcm1pLmMKaW5kZXggYWU2OTZkMy4uNGRlNmJjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3N5bmFwdGljc19pMmNfcm1pLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3N5bmFwdGljc19pMmNfcm1pLmMKQEAgLTM3OSw2ICszNzksMTIgQEAKIAkJZ290byBlcnJfY2hlY2tfZnVuY3Rpb25hbGl0eV9mYWlsZWQ7CiAJfQogCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSkpIHsKKwkJcHJfZXJyKCJzeW5hcHRpY3NfdHNfcHJvYmU6IG5lZWQgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfY2hlY2tfZnVuY3Rpb25hbGl0eV9mYWlsZWQ7CisJfQorCiAJdHMgPSBremFsbG9jKHNpemVvZigqdHMpLCBHRlBfS0VSTkVMKTsKIAlpZiAodHMgPT0gTlVMTCkgewogCQlyZXQgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RzdC9jcnlwdG8uYyBiL2RyaXZlcnMvc3RhZ2luZy9kc3QvY3J5cHRvLmMKaW5kZXggNzI1MGY5MC4uMzUxMjk1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RzdC9jcnlwdG8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZHN0L2NyeXB0by5jCkBAIC02NCw3ICs2NCw4IEBACiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KIAotc3RhdGljIHN0cnVjdCBjcnlwdG9fYWJsa2NpcGhlciAqZHN0X2luaXRfY2lwaGVyKHN0cnVjdCBkc3RfY3J5cHRvX2N0bCAqY3RsLCB1OCAqa2V5KQorc3RhdGljIHN0cnVjdCBjcnlwdG9fYWJsa2NpcGhlciAqZHN0X2luaXRfY2lwaGVyKHN0cnVjdCBkc3RfY3J5cHRvX2N0bCAqY3RsLAorCQl1OCAqa2V5KQogewogCWludCBlcnIgPSAtRUlOVkFMOwogCXN0cnVjdCBjcnlwdG9fYWJsa2NpcGhlciAqY2lwaGVyOwpAQCAtMTA1LDcgKzEwNiw3IEBACiB7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlmb3IgKGk9MDsgaTxlLT5wYWdlX251bTsgKytpKQorCWZvciAoaSA9IDA7IGkgPCBlLT5wYWdlX251bTsgKytpKQogCQlfX2ZyZWVfcGFnZShlLT5wYWdlc1tpXSk7CiAJa2ZyZWUoZS0+cGFnZXMpOwogfQpAQCAtMTE4LDcgKzExOSw3IEBACiAJaWYgKCFlLT5wYWdlcykKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlmb3IgKGk9MDsgaTxudW07ICsraSkgeworCWZvciAoaSA9IDA7IGkgPCBudW07ICsraSkgewogCQllLT5wYWdlc1tpXSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CiAJCWlmICghZS0+cGFnZXNbaV0pCiAJCQlnb3RvIGVycl9vdXRfZnJlZV9wYWdlczsKQEAgLTEzOSw3ICsxNDAsOCBAQAogICogSW5pdGlhbGl6ZSBjcnlwdG8gZW5naW5lIGZvciBnaXZlbiBub2RlLgogICogU2V0dXAgY2lwaGVyL2hhc2gsIGtleXMsIHBvb2wgb2YgdGhyZWFkcyBhbmQgcHJpdmF0ZSBkYXRhLgogICovCi1zdGF0aWMgaW50IGRzdF9jcnlwdG9fZW5naW5lX2luaXQoc3RydWN0IGRzdF9jcnlwdG9fZW5naW5lICplLCBzdHJ1Y3QgZHN0X25vZGUgKm4pCitzdGF0aWMgaW50IGRzdF9jcnlwdG9fZW5naW5lX2luaXQoc3RydWN0IGRzdF9jcnlwdG9fZW5naW5lICplLAorCQlzdHJ1Y3QgZHN0X25vZGUgKm4pCiB7CiAJaW50IGVycjsKIAlzdHJ1Y3QgZHN0X2NyeXB0b19jdGwgKmN0bCA9ICZuLT5jcnlwdG87CkBAIC0xOTgsOCArMjAwLDcgQEAKIC8qCiAgKiBXYWl0aW5nIGZvciBjaXBoZXIgcHJvY2Vzc2luZyB0byBiZSBjb21wbGV0ZWQuCiAgKi8KLXN0cnVjdCBkc3RfY3J5cHRvX2NvbXBsZXRpb24KLXsKK3N0cnVjdCBkc3RfY3J5cHRvX2NvbXBsZXRpb24gewogCXN0cnVjdCBjb21wbGV0aW9uCQljb21wbGV0ZTsKIAlpbnQJCQkJZXJyb3I7CiB9OwpAQCAtMjM3LDE3ICsyMzgsMTcgQEAKIAkJZXJyID0gY3J5cHRvX2FibGtjaXBoZXJfZGVjcnlwdChyZXEpOwogCiAJc3dpdGNoIChlcnIpIHsKLQkJY2FzZSAtRUlOUFJPR1JFU1M6Ci0JCWNhc2UgLUVCVVNZOgotCQkJZXJyID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJmMuY29tcGxldGUsCi0JCQkJCXRpbWVvdXQpOwotCQkJaWYgKCFlcnIpCi0JCQkJZXJyID0gLUVUSU1FRE9VVDsKLQkJCWVsc2UKLQkJCQllcnIgPSBjLmVycm9yOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKKwljYXNlIC1FSU5QUk9HUkVTUzoKKwljYXNlIC1FQlVTWToKKwkJZXJyID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJmMuY29tcGxldGUsCisJCQkJdGltZW91dCk7CisJCWlmICghZXJyKQorCQkJZXJyID0gLUVUSU1FRE9VVDsKKwkJZWxzZQorCQkJZXJyID0gYy5lcnJvcjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIGVycjsKQEAgLTI2Myw3ICsyNjQsNyBAQAogICogdGVtcG9yYXJ5IHN0b3JhZ2UsIHdoaWNoIGlzIHRoZW4gYmVpbmcgc2VudCB0byB0aGUgcmVtb3RlIHBlZXIuCiAgKi8KIHN0YXRpYyBpbnQgZHN0X3RyYW5zX2l0ZXJfb3V0KHN0cnVjdCBiaW8gKmJpbywgc3RydWN0IGRzdF9jcnlwdG9fZW5naW5lICplLAotCQlpbnQgKCogaXRlcmF0b3IpIChzdHJ1Y3QgZHN0X2NyeXB0b19lbmdpbmUgKmUsCisJCWludCAoKml0ZXJhdG9yKSAoc3RydWN0IGRzdF9jcnlwdG9fZW5naW5lICplLAogCQkJCSAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCiAJCQkJICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYykpCiB7CkBAIC0yODYsNyArMjg3LDcgQEAKIH0KIAogc3RhdGljIGludCBkc3RfdHJhbnNfaXRlcl9pbihzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBkc3RfY3J5cHRvX2VuZ2luZSAqZSwKLQkJaW50ICgqIGl0ZXJhdG9yKSAoc3RydWN0IGRzdF9jcnlwdG9fZW5naW5lICplLAorCQlpbnQgKCppdGVyYXRvcikgKHN0cnVjdCBkc3RfY3J5cHRvX2VuZ2luZSAqZSwKIAkJCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAogCQkJCSAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMpKQogewpAQCAtNDExLDkgKzQxMiw5IEBACiAgKiBJbml0aWFsaXplIGNyeXB0byBlbmdpbmUgZm9yIGdpdmVuIG5vZGU6IHN0b3JlIGtleXMsIGNyZWF0ZSBwb29sCiAgKiBvZiB0aHJlYWRzLCBpbml0aWFsaXplIGVhY2ggb25lLgogICoKLSAqIEVhY2ggdGhyZWFkIGhhcyB1bmlxdWUgSUQsIGJ1dCAwIGFuZCAxIGFyZSByZXNlcnZlZCBmb3IgcmVjZWl2aW5nIGFuZCBhY2NlcHRpbmcKLSAqIHRocmVhZHMgKGlmIGV4cG9ydCBub2RlKSwgc28gSURzIGNvdWxkIHN0YXJ0IGZyb20gMiwgYnV0IHN0YXJ0aW5nIHRoZW0KLSAqIGZyb20gMTAgYWxsb3dzIGVhc2lseSB1bmRlcnN0YW5kIHdoYXQgdGhpcyB0aHJlYWQgaXMgZm9yLgorICogRWFjaCB0aHJlYWQgaGFzIHVuaXF1ZSBJRCwgYnV0IDAgYW5kIDEgYXJlIHJlc2VydmVkIGZvciByZWNlaXZpbmcgYW5kCisgKiBhY2NlcHRpbmcgdGhyZWFkcyAoaWYgZXhwb3J0IG5vZGUpLCBzbyBJRHMgY291bGQgc3RhcnQgZnJvbSAyLCBidXQgc3RhcnRpbmcKKyAqIHRoZW0gZnJvbSAxMCBhbGxvd3MgZWFzaWx5IHVuZGVyc3RhbmQgd2hhdCB0aGlzIHRocmVhZCBpcyBmb3IuCiAgKi8KIGludCBkc3Rfbm9kZV9jcnlwdG9faW5pdChzdHJ1Y3QgZHN0X25vZGUgKm4sIHN0cnVjdCBkc3RfY3J5cHRvX2N0bCAqY3RsKQogewpAQCAtNDM2LDEwICs0MzcsMTAgQEAKIAl9CiAJbWVtY3B5KCZuLT5jcnlwdG8sIGN0bCwgc2l6ZW9mKHN0cnVjdCBkc3RfY3J5cHRvX2N0bCkpOwogCi0JZm9yIChpPTA7IGk8Y3RsLT50aHJlYWRfbnVtOyArK2kpIHsKKwlmb3IgKGkgPSAwOyBpIDwgY3RsLT50aHJlYWRfbnVtOyArK2kpIHsKIAkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMtY3J5cHRvLSVkIiwgbi0+bmFtZSwgaSk7CiAJCS8qIFVuaXF1ZSBpZHMuLi4gKi8KLQkJZXJyID0gdGhyZWFkX3Bvb2xfYWRkX3dvcmtlcihuLT5wb29sLCBuYW1lLCBpKzEwLAorCQllcnIgPSB0aHJlYWRfcG9vbF9hZGRfd29ya2VyKG4tPnBvb2wsIG5hbWUsIGkgKyAxMCwKIAkJCWRzdF9jcnlwdG9fdGhyZWFkX2luaXQsIGRzdF9jcnlwdG9fdGhyZWFkX2NsZWFudXAsIG4pOwogCQlpZiAoZXJyKQogCQkJZ290byBlcnJfb3V0X2ZyZWVfdGhyZWFkczsKQEAgLTQ5Niw4ICs0OTcsOCBAQAogCQkJCWJ2LT5idl9sZW4sIGJ2LT5idl9vZmZzZXQpOwogCiAJCXAgPSBrbWFwKGJ2LT5idl9wYWdlKSArIGJ2LT5idl9vZmZzZXQ7Ci0JCWZvciAoaT0wOyBpPGJ2LT5idl9sZW47ICsraSkKLQkJCXByaW50aygiJTAyeCAiLCBwW2ldKTsKKwkJZm9yIChpID0gMDsgaSA8IGJ2LT5idl9sZW47ICsraSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlMDJ4ICIsIHBbaV0pOwogCQlrdW5tYXAoYnYtPmJ2X3BhZ2UpOwogCQlwcmludGsoIlxuIik7CiAJfQpAQCAtNTMyLDcgKzUzMyw3IEBACiAJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJpbzogJWxsdS8ldSwgcnc6ICVsdSwgaGFzaDogIiwKIAkJCQlfX2Z1bmNfXywgKHU2NCliaW8tPmJpX3NlY3RvciwKIAkJCQliaW8tPmJpX3NpemUsIGJpb19kYXRhX2RpcihiaW8pKTsKLQkJCWZvciAoaT0wOyBpPGNyeXB0b19oYXNoX2RpZ2VzdHNpemUoZS0+aGFzaCk7ICsraSkKKwkJCWZvciAoaSA9IDA7IGkgPCBjcnlwdG9faGFzaF9kaWdlc3RzaXplKGUtPmhhc2gpOyArK2kpCiAJCQkJCXByaW50aygiJTAyeCAiLCBoYXNoW2ldKTsKIAkJCXByaW50aygiXG4iKTsKIAkJfQpAQCAtNTcyLDkgKzU3Myw5IEBACiAJCQl1bnNpZ25lZCBpbnQgaTsKIAogCQkJcHJpbnRrKCIsIHJlY3YvY2FsYzogIik7Ci0JCQlmb3IgKGk9MDsgaTxjcnlwdG9faGFzaF9kaWdlc3RzaXplKGUtPmhhc2gpOyArK2kpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBjcnlwdG9faGFzaF9kaWdlc3RzaXplKGUtPmhhc2gpOyArK2kpCiAJCQkJcHJpbnRrKCIlMDJ4LyUwMnggIiwgcmVjdl9oYXNoW2ldLCBoYXNoW2ldKTsKLQkJCX0KKwogCQl9CiAJCXByaW50aygiXG4iKTsKICNlbmRpZgpAQCAtNjgwLDggKzY4MSw5IEBACiAJc3RydWN0IGRzdF9leHBvcnRfcHJpdiAqcCA9IGJpby0+YmlfcHJpdmF0ZTsKIAlpbnQgZXJyOwogCi0JZHByaW50aygiJXM6IGU6ICVwLCBkYXRhOiAlcCwgYmlvOiAlbGx1LyV1LCBkaXI6ICVsdS5cbiIsIF9fZnVuY19fLAotCQllLCBlLT5kYXRhLCAodTY0KWJpby0+Ymlfc2VjdG9yLCBiaW8tPmJpX3NpemUsIGJpb19kYXRhX2RpcihiaW8pKTsKKwlkcHJpbnRrKCIlczogZTogJXAsIGRhdGE6ICVwLCBiaW86ICVsbHUvJXUsIGRpcjogJWx1LlxuIiwKKwkJCV9fZnVuY19fLCBlLCBlLT5kYXRhLCAodTY0KWJpby0+Ymlfc2VjdG9yLAorCQkJYmlvLT5iaV9zaXplLCBiaW9fZGF0YV9kaXIoYmlvKSk7CiAKIAllLT5lbmMgPSAoYmlvX2RhdGFfZGlyKGJpbykgPT0gUkVBRCk7CiAJZS0+aXYgPSBwLT5jbWQuaWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHN0L2Rjb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvZHN0L2Rjb3JlLmMKaW5kZXggYzI0ZTRlMC4uZmQ1YmQwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RzdC9kY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kc3QvZGNvcmUuYwpAQCAtMTE2LDcgKzExNiw3IEBACiAJCSAqIGJpb19yd19mbGFnZ2VkKGJpbywgQklPX1JXX0RJU0NBUkQpIG9ubHksIHdoaWNoIGRvZXMgbm90CiAJCSAqIHdvcmsgaW4gdGhpcyBjYXNlLgogCQkgKi8KLQkJLy9lcnIgPSAtRU9QTk9UU1VQUDsKKwkJLyogZXJyID0gLUVPUE5PVFNVUFA7ICovCiAJCWVyciA9IDA7CiAJCWdvdG8gZW5kX2lvOwogCX0KQEAgLTE5Nyw3ICsxOTcsOCBAQAogCW4tPmRpc2stPmZvcHMgPSAmZHN0X2Jsa19vcHM7CiAJbi0+ZGlzay0+cXVldWUgPSBuLT5xdWV1ZTsKIAluLT5kaXNrLT5wcml2YXRlX2RhdGEgPSBuOwotCXNucHJpbnRmKG4tPmRpc2stPmRpc2tfbmFtZSwgc2l6ZW9mKG4tPmRpc2stPmRpc2tfbmFtZSksICJkc3QtJXMiLCBuLT5uYW1lKTsKKwlzbnByaW50ZihuLT5kaXNrLT5kaXNrX25hbWUsIHNpemVvZihuLT5kaXNrLT5kaXNrX25hbWUpLAorCQkJImRzdC0lcyIsIG4tPm5hbWUpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTI0Niw3ICsyNDcsOCBAQAogCQlyZXR1cm4gc3ByaW50ZihidWYsICIldS4ldS4ldS4ldTolZFxuIiwKIAkJCU5JUFFVQUQoc2luLT5zaW5fYWRkci5zX2FkZHIpLCBudG9ocyhzaW4tPnNpbl9wb3J0KSk7CiAJfSBlbHNlIGlmIChmYW1pbHkgPT0gQUZfSU5FVDYpIHsKLQkJc3RydWN0IHNvY2thZGRyX2luNiAqc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmaW5mby0+bmV0LmFkZHI7CisJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopCisJCQkJJmluZm8tPm5ldC5hZGRyOwogCQlyZXR1cm4gc3ByaW50ZihidWYsCiAJCQkiJXBpNjolZFxuIiwKIAkJCSZzaW4tPnNpbjZfYWRkciwgbnRvaHMoc2luLT5zaW42X3BvcnQpKTsKQEAgLTI2MSw3ICsyNjMsNyBAQAogCQlzeiAtPSBzaXplOwogCQlidWYgKz0gc2l6ZTsKIAotCQlmb3IgKGk9MDsgaTxhZGRybGVuOyArK2kpIHsKKwkJZm9yIChpID0gMDsgaSA8IGFkZHJsZW47ICsraSkgewogCQkJaWYgKHN6IDwgMykKIAkJCQlicmVhazsKIApAQCAtMjg2LDcgKzI4OCw3IEBACiB7CiAJaW50IGVyciwgaTsKIAotCWZvciAoaT0wOyBpPEFSUkFZX1NJWkUoZHN0X25vZGVfYXR0cnMpOyArK2kpIHsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkc3Rfbm9kZV9hdHRycyk7ICsraSkgewogCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJm4tPmluZm8tPmRldmljZSwKIAkJCQkmZHN0X25vZGVfYXR0cnNbaV0pOwogCQlpZiAoZXJyKQpAQCAtMzA2LDcgKzMwOCw3IEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGk9MDsgaTxBUlJBWV9TSVpFKGRzdF9ub2RlX2F0dHJzKTsgKytpKQorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRzdF9ub2RlX2F0dHJzKTsgKytpKQogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJm4tPmluZm8tPmRldmljZSwKIAkJCQkmZHN0X25vZGVfYXR0cnNbaV0pOwogfQpAQCAtMzU4LDcgKzM2MCw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGRzdF9oYXNoKGNoYXIgKnN0ciwgdW5zaWduZWQgaW50IHNpemUpCiB7Ci0JcmV0dXJuIChqaGFzaChzdHIsIHNpemUsIDApICUgZHN0X2hhc2h0YWJsZV9zaXplKTsKKwlyZXR1cm4gamhhc2goc3RyLCBzaXplLCAwKSAlIGRzdF9oYXNodGFibGVfc2l6ZTsKIH0KIAogc3RhdGljIHZvaWQgZHN0X25vZGVfcmVtb3ZlKHN0cnVjdCBkc3Rfbm9kZSAqbikKQEAgLTY0MSw3ICs2NDMsOCBAQAogCWRzdF9ub2RlX3NldF9zaXplKG4pOwogCWFkZF9kaXNrKG4tPmRpc2spOwogCi0JZHByaW50aygiRFNUOiBzdGFydGVkIHJlbW90ZSBub2RlICclcycsIG1pbm9yOiAlZC5cbiIsIG4tPm5hbWUsIG4tPmRpc2stPmZpcnN0X21pbm9yKTsKKwlkcHJpbnRrKCJEU1Q6IHN0YXJ0ZWQgcmVtb3RlIG5vZGUgJyVzJywgbWlub3I6ICVkLlxuIiwKKwkJCW4tPm5hbWUsIG4tPmRpc2stPmZpcnN0X21pbm9yKTsKIAogCXJldHVybiAwOwogfQpAQCAtNzQwLDcgKzc0Myw4IEBACiAJICogY291bnRlciB3aWxsIGJlIGVxdWFsIHRvIDEpLAogCSAqIGFuZCBzdWJzZXF1ZW50IGRzdF9ub2RlX3B1dCgpIGNhbGxzIHdpbGwgZnJlZSB0aGUgbm9kZS4KIAkgKi8KLQlkcHJpbnRrKCIlczogZ29pbmcgdG8gc2xlZXAgd2l0aCAlZCByZWZjbnQuXG4iLCBfX2Z1bmNfXywgYXRvbWljX3JlYWQoJm4tPnJlZmNudCkpOworCWRwcmludGsoIiVzOiBnb2luZyB0byBzbGVlcCB3aXRoICVkIHJlZmNudC5cbiIsCisJCQlfX2Z1bmNfXywgYXRvbWljX3JlYWQoJm4tPnJlZmNudCkpOwogCXdhaXRfZXZlbnQobi0+d2FpdCwgYXRvbWljX3JlYWQoJm4tPnJlZmNudCkgPD0gMik7CiAKIAlkc3Rfbm9kZV9wdXQobik7CkBAIC05MjEsNyArOTI1LDcgQEAKIAlpZiAoIWRzdF9oYXNodGFibGUpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZm9yIChpPTA7IGk8ZHN0X2hhc2h0YWJsZV9zaXplOyArK2kpCisJZm9yIChpID0gMDsgaSA8IGRzdF9oYXNodGFibGVfc2l6ZTsgKytpKQogCQlJTklUX0xJU1RfSEVBRCgmZHN0X2hhc2h0YWJsZVtpXSk7CiAKIAlyZXR1cm4gMDsKQEAgLTkzMiw3ICs5MzYsNyBAQAogCXVuc2lnbmVkIGludCBpOwogCXN0cnVjdCBkc3Rfbm9kZSAqbiwgKnRtcDsKIAotCWZvciAoaT0wOyBpPGRzdF9oYXNodGFibGVfc2l6ZTsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IGRzdF9oYXNodGFibGVfc2l6ZTsgKytpKSB7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShuLCB0bXAsICZkc3RfaGFzaHRhYmxlW2ldLCBub2RlX2VudHJ5KSB7CiAJCQlkc3Rfbm9kZV9yZW1vdmVfdW5sb2FkKG4pOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHN0L2V4cG9ydC5jIGIvZHJpdmVycy9zdGFnaW5nL2RzdC9leHBvcnQuYwppbmRleCA0ZmJkODQ4Li5jMzI0MjMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHN0L2V4cG9ydC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kc3QvZXhwb3J0LmMKQEAgLTUzLDcgKzUzLDggQEAKICAqIGl0cyBwZXJtaXNzaW9ucyBhcmUgY2hlY2tlZCBpbiBhIHNlY3VyaXR5IGF0dHJpYnV0ZXMgYW5kIHNlbnQKICAqIGJhY2suCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZHN0X2NoZWNrX3Blcm1pc3Npb25zKHN0cnVjdCBkc3Rfc3RhdGUgKm1haW4sIHN0cnVjdCBkc3Rfc3RhdGUgKnN0KQorc3RhdGljIHVuc2lnbmVkIGludCBkc3RfY2hlY2tfcGVybWlzc2lvbnMoc3RydWN0IGRzdF9zdGF0ZSAqbWFpbiwKKwkJc3RydWN0IGRzdF9zdGF0ZSAqc3QpCiB7CiAJc3RydWN0IGRzdF9ub2RlICpuID0gbWFpbi0+bm9kZTsKIAlzdHJ1Y3QgZHN0X3NlY3VyZSAqc2VudHJ5OwpAQCAtNzMsOSArNzQsOSBAQAogCiAJCS8qCiAJCSAqIFRoaXMgJzInIGJlbG93IGlzIGEgcG9ydCBmaWVsZC4gVGhpcyBtYXkgYmUgdmVyeSB3cm9uZyB0byBkbwotCQkgKiBpbiBhdGFsayBmb3IgZXhhbXBsZSB0aG91Z2guIElmIHRoZXJlIHdpbGwgYmUgYW55IG5lZWQgdG8gZXh0ZW50Ci0JCSAqIHByb3RvY29sIHRvIHNvbWV0aGluZyBlbHNlLCBJIGNhbiBjcmVhdGUgcGVyLWZhbWlseSBoZWxwZXJzIGFuZAotCQkgKiB1c2UgdGhlbSBpbnN0ZWFkIG9mIHRoaXMgbWVtY21wLgorCQkgKiBpbiBhdGFsayBmb3IgZXhhbXBsZSB0aG91Z2guIElmIHRoZXJlIHdpbGwgYmUgYW55IG5lZWQKKwkJICogdG8gZXh0ZW50IHByb3RvY29sIHRvIHNvbWV0aGluZyBlbHNlLCBJIGNhbiBjcmVhdGUKKwkJICogcGVyLWZhbWlseSBoZWxwZXJzIGFuZCB1c2UgdGhlbSBpbnN0ZWFkIG9mIHRoaXMgbWVtY21wLgogCQkgKi8KIAkJaWYgKG1lbWNtcChzLT5hZGRyLnNhX2RhdGEgKyAyLCBzYS0+c2FfZGF0YSArIDIsCiAJCQkJCXNhLT5zYV9kYXRhX2xlbiAtIDIpKQpAQCAtMTI1LDggKzEyNiw4IEBACiAJCQkJICogTWFnaWMgSFo/IFBvbGxpbmcgY2hlY2sgYWJvdmUgaXMgbm90IHNhZmUgaW4KIAkJCQkgKiBhbGwgY2FzZXMgKGxpa2Ugc29ja2V0IHJlc2V0IGluIEJIIGNvbnRleHQpLAogCQkJCSAqIHNvIGl0IGlzIHNpbXBsZXIganVzdCB0byBwb3N0cG9uZSBpdCB0byB0aGUKLQkJCQkgKiBwcm9jZXNzIGNvbnRleHQgaW5zdGVhZCBvZiBpbXBsZW1lbnRpbmcgc3BlY2lhbAotCQkJCSAqIGxvY2tpbmcgdGhlcmUuCisJCQkJICogcHJvY2VzcyBjb250ZXh0IGluc3RlYWQgb2YgaW1wbGVtZW50aW5nCisJCQkJICogc3BlY2lhbCBsb2NraW5nIHRoZXJlLgogCQkJCSAqLwogCQkJCXNjaGVkdWxlX3RpbWVvdXQoSFopOwogCQkJfQpAQCAtMjAyLDcgKzIwMyw3IEBACiAgKiBzbyB0byBwbGF5IGdvb2Qgd2l0aCBhbGwgY2FzZXMgd2UganVzdCBxdWV1ZSBCSU8gaW50byB0aGUgcXVldWUKICAqIGFuZCB3YWtlIHVwIHByb2Nlc3NpbmcgdGhyZWFkLCB3aGljaCBnZXRzIGNvbXBsZXRlZCByZXF1ZXN0IGFuZAogICogc2VuZCAoZW5jcnlwdGluZyBpZiBuZWVkZWQpIGl0IGJhY2sgdG8gdGhlIGNsaWVudCAoaWYgaXQgd2FzIGEgcmVhZAotICogcmVxdWVzdCksIG9yIHNlbmRzIGJhY2sgcmVwbHkgdGhhdCB3cml0aW5nIHN1Y2Nlc2Z1bGx5IGNvbXBsZXRlZC4KKyAqIHJlcXVlc3QpLCBvciBzZW5kcyBiYWNrIHJlcGx5IHRoYXQgd3JpdGluZyBzdWNjZXNzZnVsbHkgY29tcGxldGVkLgogICovCiBzdGF0aWMgaW50IGRzdF9leHBvcnRfcHJvY2Vzc19yZXF1ZXN0X3F1ZXVlKHN0cnVjdCBkc3Rfc3RhdGUgKnN0KQogewpAQCAtMjcyLDggKzI3Myw4IEBACiAJCQlpZiAocCkKIAkJCQliaW9fcHV0KHAtPmJpbyk7CiAKLQkJCWRwcmludGsoIiVzOiBzdDogJXAsIHJlZmNudDogJWQsIGxpc3RfZW1wdHk6ICVkLCBwOiAlcC5cbiIsCi0JCQkJX19mdW5jX18sIHN0LCBhdG9taWNfcmVhZCgmc3QtPnJlZmNudCksCisJCQlkcHJpbnRrKCIlczogc3Q6ICVwLCByZWZjbnQ6ICVkLCBsaXN0X2VtcHR5OiAlZCwgcDogIgorCQkJCSIlcC5cbiIsIF9fZnVuY19fLCBzdCwgYXRvbWljX3JlYWQoJnN0LT5yZWZjbnQpLAogCQkJCWxpc3RfZW1wdHkoJnN0LT5yZXF1ZXN0X2xpc3QpLCBwKTsKIAkJfQogCX0KQEAgLTMwMyw5ICszMDQsOSBAQAogCQlpZiAoIWVycikgewogCQkJd2hpbGUgKG4tPnRyYW5zX3NjYW5fdGltZW91dCkgewogCQkJCWVyciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHN0LT50aHJlYWRfd2FpdCwKLQkJCQkJCSFsaXN0X2VtcHR5KCZzdC0+cmVxdWVzdF9saXN0KSB8fAotCQkJCQkJIW4tPnRyYW5zX3NjYW5fdGltZW91dCB8fAotCQkJCQkJc3QtPm5lZWRfZXhpdCwKKwkJCQkJIWxpc3RfZW1wdHkoJnN0LT5yZXF1ZXN0X2xpc3QpIHx8CisJCQkJCSFuLT50cmFuc19zY2FuX3RpbWVvdXQgfHwKKwkJCQkJc3QtPm5lZWRfZXhpdCwKIAkJCQkJSFopOwogCiAJCQkJaWYgKCFuLT50cmFuc19zY2FuX3RpbWVvdXQgfHwgc3QtPm5lZWRfZXhpdCkKQEAgLTM0MSw4ICszNDIsOSBAQAogaW50IGRzdF9zdGFydF9leHBvcnQoc3RydWN0IGRzdF9ub2RlICpuKQogewogCWlmIChsaXN0X2VtcHR5KCZuLT5zZWN1cml0eV9saXN0KSkgewotCQlwcmludGsoS0VSTl9FUlIgIllvdSBhcmUgdHJ5aW5nIHRvIGV4cG9ydCBub2RlICclcycgd2l0aG91dCBzZWN1cml0eSBhdHRyaWJ1dGVzLlxuIgotCQkJCSJObyBjbGllbnRzIHdpbGwgYmUgYWxsb3dlZCB0byBjb25uZWN0LiBFeGl0aW5nLlxuIiwgbi0+bmFtZSk7CisJCXByaW50ayhLRVJOX0VSUiAiWW91IGFyZSB0cnlpbmcgdG8gZXhwb3J0IG5vZGUgJyVzJyAiCisJCQkJIndpdGhvdXQgc2VjdXJpdHkgYXR0cmlidXRlcy5cbk5vIGNsaWVudHMgd2lsbCAiCisJCQkJImJlIGFsbG93ZWQgdG8gY29ubmVjdC4gRXhpdGluZy5cbiIsIG4tPm5hbWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmV0dXJuIGRzdF9ub2RlX3RyYW5zX2luaXQobiwgc2l6ZW9mKHN0cnVjdCBkc3RfZXhwb3J0X3ByaXYpKTsKQEAgLTU1Miw3ICs1NTQsOCBAQAogCWlmICghYmlvKQogCQlnb3RvIGVycl9vdXRfZXhpdDsKIAotCXByaXYgPSAoc3RydWN0IGRzdF9leHBvcnRfcHJpdiAqKSgoKHZvaWQgKiliaW8pIC0gc2l6ZW9mIChzdHJ1Y3QgZHN0X2V4cG9ydF9wcml2KSk7CisJcHJpdiA9IChzdHJ1Y3QgZHN0X2V4cG9ydF9wcml2ICopKCgodm9pZCAqKWJpbykgLQorCQkJc2l6ZW9mIChzdHJ1Y3QgZHN0X2V4cG9ydF9wcml2KSk7CiAKIAlwcml2LT5zdGF0ZSA9IGRzdF9zdGF0ZV9nZXQoc3QpOwogCXByaXYtPmJpbyA9IGJpbzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kc3Qvc3RhdGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9kc3Qvc3RhdGUuYwppbmRleCBkMDU3ZTUyLi4wMmEwNWU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHN0L3N0YXRlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RzdC9zdGF0ZS5jCkBAIC0zMCwxMyArMzAsMTMgQEAKICAqIFBvbGxpbmcgbWFjaGluZXJ5LgogICovCiAKLXN0cnVjdCBkc3RfcG9sbF9oZWxwZXIKLXsKLQlwb2xsX3RhYmxlIAkJcHQ7CitzdHJ1Y3QgZHN0X3BvbGxfaGVscGVyIHsKKwlwb2xsX3RhYmxlCQlwdDsKIAlzdHJ1Y3QgZHN0X3N0YXRlCSpzdDsKIH07CiAKLXN0YXRpYyBpbnQgZHN0X3F1ZXVlX3dha2Uod2FpdF9xdWV1ZV90ICp3YWl0LCB1bnNpZ25lZCBtb2RlLCBpbnQgc3luYywgdm9pZCAqa2V5KQorc3RhdGljIGludCBkc3RfcXVldWVfd2FrZSh3YWl0X3F1ZXVlX3QgKndhaXQsIHVuc2lnbmVkIG1vZGUsCisJCWludCBzeW5jLCB2b2lkICprZXkpCiB7CiAJc3RydWN0IGRzdF9zdGF0ZSAqc3QgPSBjb250YWluZXJfb2Yod2FpdCwgc3RydWN0IGRzdF9zdGF0ZSwgd2FpdCk7CiAKQEAgLTkyLDcgKzkyLDcgQEAKIAltc2cubXNnX25hbWVsZW4gPSAwOwogCW1zZy5tc2dfY29udHJvbCA9IE5VTEw7CiAJbXNnLm1zZ19jb250cm9sbGVuID0gMDsKLQltc2cubXNnX2ZsYWdzID0gKGJsb2NrKT9NU0dfV0FJVEFMTDpNU0dfRE9OVFdBSVQ7CisJbXNnLm1zZ19mbGFncyA9IChibG9jaykgPyBNU0dfV0FJVEFMTCA6IE1TR19ET05UV0FJVDsKIAogCWVyciA9IGtlcm5lbF9yZWN2bXNnKHNvY2ssICZtc2csICZpb3YsIDEsIGlvdi5pb3ZfbGVuLAogCQkJbXNnLm1zZ19mbGFncyk7CkBAIC0xMjEsNyArMTIxLDcgQEAKIAltc2cubXNnX25hbWVsZW4gPSAwOwogCW1zZy5tc2dfY29udHJvbCA9IE5VTEw7CiAJbXNnLm1zZ19jb250cm9sbGVuID0gMDsKLQltc2cubXNnX2ZsYWdzID0gTVNHX1dBSVRBTEwgfCAobW9yZSk/TVNHX01PUkU6MDsKKwltc2cubXNnX2ZsYWdzID0gTVNHX1dBSVRBTEwgfCAobW9yZSA/IE1TR19NT1JFIDogMCk7CiAKIAllcnIgPSBrZXJuZWxfc2VuZG1zZyhzb2NrLCAmbXNnLCAmaW92LCAxLCBpb3YuaW92X2xlbik7CiAJaWYgKGVyciAhPSBzaXplKSB7CkBAIC0yMTcsOCArMjE3LDggQEAKIHsKIAlpZiAoc2stPm9wcy0+ZmFtaWx5ID09IEFGX0lORVQpIHsKIAkJc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopc2E7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzICV1LiV1LiV1LiV1OiVkLlxuIiwKLQkJCXN0ciwgTklQUVVBRChzaW4tPnNpbl9hZGRyLnNfYWRkciksIG50b2hzKHNpbi0+c2luX3BvcnQpKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgJXUuJXUuJXUuJXU6JWQuXG4iLCBzdHIsCisJCQlOSVBRVUFEKHNpbi0+c2luX2FkZHIuc19hZGRyKSwgbnRvaHMoc2luLT5zaW5fcG9ydCkpOwogCX0gZWxzZSBpZiAoc2stPm9wcy0+ZmFtaWx5ID09IEFGX0lORVQ2KSB7CiAJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2E7CiAJCXByaW50ayhLRVJOX0lORk8gIiVzICVwaTY6JWQiLApAQCAtMjcxLDEzICsyNzEsMTMgQEAKICAqIFN0YXRlIHJlc2V0IGlzIHVzZWQgdG8gcmVjb25uZWN0IHRvIHRoZSByZW1vdGUgcGVlci4KICAqIE1heSBmYWlsLCBidXQgd2hvIGNhcmVzLCB3ZSB3aWxsIHRyeSBhZ2FpbiBsYXRlci4KICAqLwotc3RhdGljIHZvaWQgaW5saW5lIGRzdF9zdGF0ZV9yZXNldF9ub2xvY2soc3RydWN0IGRzdF9zdGF0ZSAqc3QpCitzdGF0aWMgaW5saW5lIHZvaWQgZHN0X3N0YXRlX3Jlc2V0X25vbG9jayhzdHJ1Y3QgZHN0X3N0YXRlICpzdCkKIHsKIAlkc3Rfc3RhdGVfZXhpdF9jb25uZWN0ZWQoc3QpOwogCWRzdF9zdGF0ZV9pbml0X2Nvbm5lY3RlZChzdCk7CiB9CiAKLXN0YXRpYyB2b2lkIGlubGluZSBkc3Rfc3RhdGVfcmVzZXQoc3RydWN0IGRzdF9zdGF0ZSAqc3QpCitzdGF0aWMgaW5saW5lIHZvaWQgZHN0X3N0YXRlX3Jlc2V0KHN0cnVjdCBkc3Rfc3RhdGUgKnN0KQogewogCWRzdF9zdGF0ZV9sb2NrKHN0KTsKIAlkc3Rfc3RhdGVfcmVzZXRfbm9sb2NrKHN0KTsKQEAgLTMzNSw5ICszMzUsMTEgQEAKIAogCQljbWQtPmNtZCA9IF9fY3B1X3RvX2JlMzIoRFNUX1BJTkcpOwogCi0JCWVyciA9IGRzdF9kYXRhX3NlbmRfaGVhZGVyKHN0LT5zb2NrZXQsIGNtZCwgc2l6ZW9mKHN0cnVjdCBkc3RfY21kKSwgMCk7CisJCWVyciA9IGRzdF9kYXRhX3NlbmRfaGVhZGVyKHN0LT5zb2NrZXQsIGNtZCwKKwkJCQlzaXplb2Yoc3RydWN0IGRzdF9jbWQpLCAwKTsKIAl9Ci0JZHByaW50aygiJXM6IHN0OiAlcCwgc29ja2V0OiAlcCwgZXJyOiAlZC5cbiIsIF9fZnVuY19fLCBzdCwgc3QtPnNvY2tldCwgZXJyKTsKKwlkcHJpbnRrKCIlczogc3Q6ICVwLCBzb2NrZXQ6ICVwLCBlcnI6ICVkLlxuIiwgX19mdW5jX18sCisJCQlzdCwgc3QtPnNvY2tldCwgZXJyKTsKIAlkc3Rfc3RhdGVfdW5sb2NrKHN0KTsKIAogCXJldHVybiBlcnI7CkBAIC0zOTAsOCArMzkyLDcgQEAKIAkJZXJyID0gLUVDT05OUkVTRVQ7CiAJCWRzdF9zdGF0ZV9sb2NrKHN0KTsKIAotCQlpZiAoCQlzdC0+c29ja2V0ICYmCi0JCQkJKHN0LT5yZWFkX3NvY2tldCA9PSBzdC0+c29ja2V0KSAmJgorCQlpZiAoc3QtPnNvY2tldCAmJiAoc3QtPnJlYWRfc29ja2V0ID09IHN0LT5zb2NrZXQpICYmCiAJCQkJKHJldmVudHMgJiBQT0xMSU4pKSB7CiAJCQllcnIgPSBkc3RfZGF0YV9yZWN2X3JhdyhzdCwgZGF0YSwgc2l6ZSk7CiAJCQlpZiAoZXJyID4gMCkgewpAQCAtNDAyLDggKzQwMyw5IEBACiAJCX0KIAogCQlpZiAocmV2ZW50cyAmIGVycl9tYXNrIHx8ICFzdC0+c29ja2V0KSB7Ci0JCQlkcHJpbnRrKCIlczogcmV2ZW50czogJXgsIHNvY2tldDogJXAsIHNpemU6ICV1LCBlcnI6ICVkLlxuIiwKLQkJCQkJX19mdW5jX18sIHJldmVudHMsIHN0LT5zb2NrZXQsIHNpemUsIGVycik7CisJCQlkcHJpbnRrKCIlczogcmV2ZW50czogJXgsIHNvY2tldDogJXAsIHNpemU6ICV1LCAiCisJCQkJCSJlcnI6ICVkLlxuIiwgX19mdW5jX18sIHJldmVudHMsCisJCQkJCXN0LT5zb2NrZXQsIHNpemUsIGVycik7CiAJCQllcnIgPSAtRUNPTk5SRVNFVDsKIAkJfQogCkBAIC00NDAsNyArNDQyLDggQEAKIC8qCiAgKiBSZWNlaXZlIGJsb2NrIElPIGZyb20gdGhlIG5ldHdvcmsuCiAgKi8KLXN0YXRpYyBpbnQgZHN0X3JlY3ZfYmlvKHN0cnVjdCBkc3Rfc3RhdGUgKnN0LCBzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIGludCB0b3RhbF9zaXplKQorc3RhdGljIGludCBkc3RfcmVjdl9iaW8oc3RydWN0IGRzdF9zdGF0ZSAqc3QsIHN0cnVjdCBiaW8gKmJpbywKKwkJdW5zaWduZWQgaW50IHRvdGFsX3NpemUpCiB7CiAJc3RydWN0IGJpb192ZWMgKmJ2OwogCWludCBpLCBlcnI7CkBAIC00NTAsOSArNDUzLDEwIEBACiAJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIGJpbywgaSkgewogCQlzeiA9IG1pbih0b3RhbF9zaXplLCBidi0+YnZfbGVuKTsKIAotCQlkcHJpbnRrKCIlczogYmlvOiAlbGx1LyV1LCB0b3RhbDogJXUsIGxlbjogJXUsIHN6OiAldSwgb2ZmOiAldS5cbiIsCi0JCQlfX2Z1bmNfXywgKHU2NCliaW8tPmJpX3NlY3RvciwgYmlvLT5iaV9zaXplLCB0b3RhbF9zaXplLAotCQkJYnYtPmJ2X2xlbiwgc3osIGJ2LT5idl9vZmZzZXQpOworCQlkcHJpbnRrKCIlczogYmlvOiAlbGx1LyV1LCB0b3RhbDogJXUsIGxlbjogJXUsIHN6OiAldSwgIgorCQkJCSJvZmY6ICV1LlxuIiwgX19mdW5jX18sICh1NjQpYmlvLT5iaV9zZWN0b3IsCisJCQkJYmlvLT5iaV9zaXplLCB0b3RhbF9zaXplLCBidi0+YnZfbGVuLCBzeiwKKwkJCQlidi0+YnZfb2Zmc2V0KTsKIAogCQlkYXRhID0ga21hcChidi0+YnZfcGFnZSkgKyBidi0+YnZfb2Zmc2V0OwogCQllcnIgPSBkc3RfZGF0YV9yZWN2KHN0LCBkYXRhLCBzeik7CkBAIC01OTAsNyArNTk0LDggQEAKIAkJCWNtZC0+ZmxhZ3MsIGNtZC0+cncpOwogCiAJLyoKLQkgKiBUaGlzIHNob3VsZCBjYXRjaCBwcm90b2NvbCBicmVha2FnZSBhbmQgcmFuZG9tIGdhcmJhZ2UgaW5zdGVhZCBvZiBjb21tYW5kcy4KKwkgKiBUaGlzIHNob3VsZCBjYXRjaCBwcm90b2NvbCBicmVha2FnZSBhbmQgcmFuZG9tIGdhcmJhZ2UKKwkgKiBpbnN0ZWFkIG9mIGNvbW1hbmRzLgogCSAqLwogCWlmICh1bmxpa2VseShjbWQtPmNzaXplID4gc3QtPnNpemUgLSBzaXplb2Yoc3RydWN0IGRzdF9jbWQpKSkgewogCQllcnIgPSAtRUJBRE1TRzsKQEAgLTU5OSwyMCArNjA0LDIwIEBACiAKIAllcnIgPSAtRVBST1RPOwogCXN3aXRjaCAoY21kLT5jbWQpIHsKLQkJY2FzZSBEU1RfSU9fUkVTUE9OU0U6Ci0JCQllcnIgPSBkc3RfcHJvY2Vzc19pb19yZXNwb25zZShzdCk7Ci0JCQlicmVhazsKLQkJY2FzZSBEU1RfSU86Ci0JCQllcnIgPSBkc3RfcHJvY2Vzc19pbyhzdCk7Ci0JCQlicmVhazsKLQkJY2FzZSBEU1RfQ0ZHOgotCQkJZXJyID0gZHN0X3Byb2Nlc3NfY2ZnKHN0KTsKLQkJCWJyZWFrOwotCQljYXNlIERTVF9QSU5HOgotCQkJZXJyID0gMDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7CisJY2FzZSBEU1RfSU9fUkVTUE9OU0U6CisJCWVyciA9IGRzdF9wcm9jZXNzX2lvX3Jlc3BvbnNlKHN0KTsKKwkJYnJlYWs7CisJY2FzZSBEU1RfSU86CisJCWVyciA9IGRzdF9wcm9jZXNzX2lvKHN0KTsKKwkJYnJlYWs7CisJY2FzZSBEU1RfQ0ZHOgorCQllcnIgPSBkc3RfcHJvY2Vzc19jZmcoc3QpOworCQlicmVhazsKKwljYXNlIERTVF9QSU5HOgorCQllcnIgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKIAl9CiAKIG91dF9leGl0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RzdC90aHJlYWRfcG9vbC5jIGIvZHJpdmVycy9zdGFnaW5nL2RzdC90aHJlYWRfcG9vbC5jCmluZGV4IDdiZWQ0ZTguLjI5YTgyYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kc3QvdGhyZWFkX3Bvb2wuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZHN0L3RocmVhZF9wb29sLmMKQEAgLTMwLDggKzMwLDcgQEAKICAqIFdoZW4gYWN0aW9uIGlzIGJlaW5nIHBlcmZvcm1lZCwgdGhyZWFkIGNhbiBub3QgYmUgdXNlZCBieSBvdGhlciB1c2VycywKICAqIGluc3RlYWQgdGhleSB3aWxsIHNsZWVwIHVudGlsIHRoZXJlIGlzIGZyZWUgdGhyZWFkIHRvIHBpY2sgdGhlaXIgd29yay4KICAqLwotc3RydWN0IHRocmVhZF9wb29sX3dvcmtlcgoteworc3RydWN0IHRocmVhZF9wb29sX3dvcmtlciB7CiAJc3RydWN0IGxpc3RfaGVhZAl3b3JrZXJfZW50cnk7CiAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnRocmVhZDsKQEAgLTQ4LDggKzQ3LDggQEAKIAl2b2lkCQkJKnByaXZhdGU7CiAJdm9pZAkJCSpzY2hlZHVsZV9kYXRhOwogCi0JaW50CQkJKCogYWN0aW9uKSh2b2lkICpwcml2YXRlLCB2b2lkICpzY2hlZHVsZV9kYXRhKTsKLQl2b2lkCQkJKCogY2xlYW51cCkodm9pZCAqcHJpdmF0ZSk7CisJaW50CQkJKCphY3Rpb24pKHZvaWQgKnByaXZhdGUsIHZvaWQgKnNjaGVkdWxlX2RhdGEpOworCXZvaWQJCQkoKmNsZWFudXApKHZvaWQgKnByaXZhdGUpOwogfTsKIAogc3RhdGljIHZvaWQgdGhyZWFkX3Bvb2xfZXhpdF93b3JrZXIoc3RydWN0IHRocmVhZF9wb29sX3dvcmtlciAqdykKQEAgLTExNiwxMCArMTE1LDEyIEBACiAJc3RydWN0IHRocmVhZF9wb29sX3dvcmtlciAqdyA9IE5VTEw7CiAKIAl3aGlsZSAoIXcgJiYgcC0+dGhyZWFkX251bSkgewotCQl3YWl0X2V2ZW50KHAtPndhaXQsICFsaXN0X2VtcHR5KCZwLT5yZWFkeV9saXN0KSB8fCAhcC0+dGhyZWFkX251bSk7CisJCXdhaXRfZXZlbnQocC0+d2FpdCwgIWxpc3RfZW1wdHkoJnAtPnJlYWR5X2xpc3QpIHx8CisJCQkJIXAtPnRocmVhZF9udW0pOwogCiAJCWRwcmludGsoIiVzOiBsb2NraW5nIGxpc3RfZW1wdHk6ICVkLCB0aHJlYWRfbnVtOiAlZC5cbiIsCi0JCQkJX19mdW5jX18sIGxpc3RfZW1wdHkoJnAtPnJlYWR5X2xpc3QpLCBwLT50aHJlYWRfbnVtKTsKKwkJCQlfX2Z1bmNfXywgbGlzdF9lbXB0eSgmcC0+cmVhZHlfbGlzdCksCisJCQkJcC0+dGhyZWFkX251bSk7CiAKIAkJbXV0ZXhfbG9jaygmcC0+dGhyZWFkX2xvY2spOwogCQlpZiAoIWxpc3RfZW1wdHkoJnAtPnJlYWR5X2xpc3QpKSB7CkBAIC0xMjcsOCArMTI4LDkgQEAKIAkJCQkJc3RydWN0IHRocmVhZF9wb29sX3dvcmtlciwKIAkJCQkJd29ya2VyX2VudHJ5KTsKIAotCQkJZHByaW50aygiJXM6IGRlbGV0aW5nIHc6ICVwLCB0aHJlYWRfbnVtOiAlZCwgbGlzdDogJXAgWyVwLiVwXS5cbiIsCi0JCQkJCV9fZnVuY19fLCB3LCBwLT50aHJlYWRfbnVtLCAmcC0+cmVhZHlfbGlzdCwKKwkJCWRwcmludGsoIiVzOiBkZWxldGluZyB3OiAlcCwgdGhyZWFkX251bTogJWQsICIKKwkJCQkJImxpc3Q6ICVwIFslcC4lcF0uXG4iLCBfX2Z1bmNfXywKKwkJCQkJdywgcC0+dGhyZWFkX251bSwgJnAtPnJlYWR5X2xpc3QsCiAJCQkJCXAtPnJlYWR5X2xpc3QucHJldiwgcC0+cmVhZHlfbGlzdC5uZXh0KTsKIAogCQkJcC0+dGhyZWFkX251bS0tOwpAQCAtMTgyLDggKzE4NCw4IEBACiBpbnQgdGhyZWFkX3Bvb2xfYWRkX3dvcmtlcihzdHJ1Y3QgdGhyZWFkX3Bvb2wgKnAsCiAJCWNoYXIgKm5hbWUsCiAJCXVuc2lnbmVkIGludCBpZCwKLQkJdm9pZCAqKCogaW5pdCkodm9pZCAqcHJpdmF0ZSksCi0JCXZvaWQgKCogY2xlYW51cCkodm9pZCAqcHJpdmF0ZSksCisJCXZvaWQgKigqaW5pdCkodm9pZCAqcHJpdmF0ZSksCisJCXZvaWQgKCpjbGVhbnVwKSh2b2lkICpwcml2YXRlKSwKIAkJdm9pZCAqcHJpdmF0ZSkKIHsKIAlzdHJ1Y3QgdGhyZWFkX3Bvb2xfd29ya2VyICp3OwpAQCAtMjQzLDggKzI0NSw4IEBACiAgKiBUaGV5IHdpbGwgaGF2ZSBzZXF1ZW50aWFsIElEcyBzdGFydGVkIGZyb20gemVyby4KICAqLwogc3RydWN0IHRocmVhZF9wb29sICp0aHJlYWRfcG9vbF9jcmVhdGUoaW50IG51bSwgY2hhciAqbmFtZSwKLQkJdm9pZCAqKCogaW5pdCkodm9pZCAqcHJpdmF0ZSksCi0JCXZvaWQgKCogY2xlYW51cCkodm9pZCAqcHJpdmF0ZSksCisJCXZvaWQgKigqaW5pdCkodm9pZCAqcHJpdmF0ZSksCisJCXZvaWQgKCpjbGVhbnVwKSh2b2lkICpwcml2YXRlKSwKIAkJdm9pZCAqcHJpdmF0ZSkKIHsKIAlzdHJ1Y3QgdGhyZWFkX3Bvb2xfd29ya2VyICp3LCAqdG1wOwpAQCAtMjYyLDcgKzI2NCw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJnAtPmFjdGl2ZV9saXN0KTsKIAlwLT50aHJlYWRfbnVtID0gMDsKIAotCWZvciAoaT0wOyBpPG51bTsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IG51bTsgKytpKSB7CiAJCWVyciA9IHRocmVhZF9wb29sX2FkZF93b3JrZXIocCwgbmFtZSwgaSwgaW5pdCwKIAkJCQljbGVhbnVwLCBwcml2YXRlKTsKIAkJaWYgKGVycikKQEAgLTI4Nyw4ICsyODksOCBAQAogICogcHJpdmF0ZSBkYXRhLgogICovCiBpbnQgdGhyZWFkX3Bvb2xfc2NoZWR1bGVfcHJpdmF0ZShzdHJ1Y3QgdGhyZWFkX3Bvb2wgKnAsCi0JCWludCAoKiBzZXR1cCkodm9pZCAqcHJpdmF0ZSwgdm9pZCAqZGF0YSksCi0JCWludCAoKiBhY3Rpb24pKHZvaWQgKnByaXZhdGUsIHZvaWQgKmRhdGEpLAorCQlpbnQgKCpzZXR1cCkodm9pZCAqcHJpdmF0ZSwgdm9pZCAqZGF0YSksCisJCWludCAoKmFjdGlvbikodm9pZCAqcHJpdmF0ZSwgdm9pZCAqZGF0YSksCiAJCXZvaWQgKmRhdGEsIGxvbmcgdGltZW91dCwgdm9pZCAqaWQpCiB7CiAJc3RydWN0IHRocmVhZF9wb29sX3dvcmtlciAqdywgKnRtcCwgKndvcmtlciA9IE5VTEw7CkBAIC0zMjEsNyArMzIzLDggQEAKIAkJCQl3LT5oYXNfZGF0YSA9IDE7CiAJCQkJd2FrZV91cCgmdy0+d2FpdCk7CiAJCQl9IGVsc2UgewotCQkJCWxpc3RfbW92ZV90YWlsKCZ3LT53b3JrZXJfZW50cnksICZwLT5yZWFkeV9saXN0KTsKKwkJCQlsaXN0X21vdmVfdGFpbCgmdy0+d29ya2VyX2VudHJ5LAorCQkJCQkJJnAtPnJlYWR5X2xpc3QpOwogCQkJfQogCiAJCQlicmVhazsKQEAgLTMzNiw4ICszMzksOCBAQAogICogU2NoZWR1bGUgZXhlY3V0aW9uIG9uIGFyYml0cmFyeSB0aHJlYWQgZnJvbSB0aGUgcG9vbC4KICAqLwogaW50IHRocmVhZF9wb29sX3NjaGVkdWxlKHN0cnVjdCB0aHJlYWRfcG9vbCAqcCwKLQkJaW50ICgqIHNldHVwKSh2b2lkICpwcml2YXRlLCB2b2lkICpkYXRhKSwKLQkJaW50ICgqIGFjdGlvbikodm9pZCAqcHJpdmF0ZSwgdm9pZCAqZGF0YSksCisJCWludCAoKnNldHVwKSh2b2lkICpwcml2YXRlLCB2b2lkICpkYXRhKSwKKwkJaW50ICgqYWN0aW9uKSh2b2lkICpwcml2YXRlLCB2b2lkICpkYXRhKSwKIAkJdm9pZCAqZGF0YSwgbG9uZyB0aW1lb3V0KQogewogCXJldHVybiB0aHJlYWRfcG9vbF9zY2hlZHVsZV9wcml2YXRlKHAsIHNldHVwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RzdC90cmFucy5jIGIvZHJpdmVycy9zdGFnaW5nL2RzdC90cmFucy5jCmluZGV4IDU1N2QzNzIuLjFjMzZhNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kc3QvdHJhbnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZHN0L3RyYW5zLmMKQEAgLTU4LDcgKzU4LDcgQEAKIAl9CiAKIAlkcHJpbnRrKCIlczogJXMgdHJhbnNhY3Rpb246IGlkOiAlbGx1LlxuIiwgX19mdW5jX18sCi0JCQkocmV0KT8iZm91bmQiOiJub3QgZm91bmQiLCBnZW4pOworCQkJKHJldCkgPyAiZm91bmQiIDogIm5vdCBmb3VuZCIsIGdlbik7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtODgsOSArODgsOSBAQAogCiAJbmV3LT5zZW5kX3RpbWUgPSBqaWZmaWVzOwogCWlmIChyZXQpIHsKLQkJcHJpbnRrKCIlczogZXhpc3Q6IG9sZDogZ2VuOiAlbGx1LCBiaW86ICVsbHUvJXUsIHNlbmRfdGltZTogJWx1LCAiCi0JCQkJIm5ldzogZ2VuOiAlbGx1LCBiaW86ICVsbHUvJXUsIHNlbmRfdGltZTogJWx1LlxuIiwKLQkJCV9fZnVuY19fLAorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV4aXN0OiBvbGQ6IGdlbjogJWxsdSwgYmlvOiAlbGx1LyV1LCAiCisJCQkic2VuZF90aW1lOiAlbHUsIG5ldzogZ2VuOiAlbGx1LCBiaW86ICVsbHUvJXUsICIKKwkJCSJzZW5kX3RpbWU6ICVsdS5cbiIsIF9fZnVuY19fLAogCQkJcmV0LT5nZW4sICh1NjQpcmV0LT5iaW8tPmJpX3NlY3RvciwKIAkJCXJldC0+YmlvLT5iaV9zaXplLCByZXQtPnNlbmRfdGltZSwKIAkJCW5ldy0+Z2VuLCAodTY0KW5ldy0+YmlvLT5iaV9zZWN0b3IsCkBAIC0yMDYsNyArMjA2LDggQEAKICAqLwogc3RhdGljIHZvaWQgZHN0X3RyYW5zX3NjYW4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBkc3Rfbm9kZSAqbiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZHN0X25vZGUsIHRyYW5zX3dvcmsud29yayk7CisJc3RydWN0IGRzdF9ub2RlICpuID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkc3Rfbm9kZSwKKwkJCXRyYW5zX3dvcmsud29yayk7CiAJc3RydWN0IHJiX25vZGUgKnJiX25vZGU7CiAJc3RydWN0IGRzdF90cmFucyAqdDsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBuLT50cmFuc19zY2FuX3RpbWVvdXQ7CkBAIC0yNDYsOCArMjQ3LDggQEAKIAltdXRleF91bmxvY2soJm4tPnRyYW5zX2xvY2spOwogCiAJLyoKLQkgKiBJZiBubyB0aW1lb3V0IHNwZWNpZmllZCB0aGVuIHN5c3RlbSBpcyBpbiB0aGUgbWlkZGxlIG9mIGV4aXRpbmcgcHJvY2VzcywKLQkgKiBzbyBubyBuZWVkIHRvIHJlc2NoZWR1bGUgc2Nhbm5pbmcgcHJvY2VzcyBhZ2Fpbi4KKwkgKiBJZiBubyB0aW1lb3V0IHNwZWNpZmllZCB0aGVuIHN5c3RlbSBpcyBpbiB0aGUgbWlkZGxlIG9mIGV4aXRpbmcKKwkgKiBwcm9jZXNzLCBzbyBubyBuZWVkIHRvIHJlc2NoZWR1bGUgc2Nhbm5pbmcgcHJvY2VzcyBhZ2Fpbi4KIAkgKi8KIAlpZiAodGltZW91dCkgewogCQlpZiAoIW51bSkKQEAgLTMxMyw3ICszMTQsOCBAQAogCWlmICghbi0+dHJhbnNfY2FjaGUpCiAJCWdvdG8gZXJyX291dF9leGl0OwogCi0Jbi0+dHJhbnNfcG9vbCA9IG1lbXBvb2xfY3JlYXRlX3NsYWJfcG9vbChkc3RfbWVtcG9vbF9udW0sIG4tPnRyYW5zX2NhY2hlKTsKKwluLT50cmFuc19wb29sID0gbWVtcG9vbF9jcmVhdGVfc2xhYl9wb29sKGRzdF9tZW1wb29sX251bSwKKwkJCW4tPnRyYW5zX2NhY2hlKTsKIAlpZiAoIW4tPnRyYW5zX3Bvb2wpCiAJCWdvdG8gZXJyX291dF9jYWNoZV9kZXN0cm95OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9hZGRyZXNzX21hcC5oIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfYWRkcmVzc19tYXAuaAppbmRleCAyYzNkNjVhLi42ZGE4NDNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9hZGRyZXNzX21hcC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX2FkZHJlc3NfbWFwLmgKQEAgLTE5OCwyMCArMTk4LDEwIEBACiAvKgogICogc3RydWN0dXJlIGZvciB0eGRtYSBwYWNrZXQgcmluZyBudW1iZXIgb2YgZGVzY3JpcHRvciByZWcgaW4gdHhkbWEgYWRkcmVzcwogICogbWFwLiAgTG9jYXRlZCBhdCBhZGRyZXNzIDB4MTAwQworICoKKyAqIDMxLTEwOiB1bnVzZWQKKyAqIDktMDogcHIgbmRlcwogICovCi10eXBlZGVmIHVuaW9uIF9UWERNQV9QUl9OVU1fREVTX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHVudXNlZDoyMjsJLyogYml0cyAxMC0zMSAqLwotCQl1MzIgcHJfbmRlczoxMDsJLyogYml0cyAwLTkgKi8KLSNlbHNlCi0JCXUzMiBwcl9uZGVzOjEwOwkvKiBiaXRzIDAtOSAqLwotCQl1MzIgdW51c2VkOjIyOwkvKiBiaXRzIDEwLTMxICovCi0jZW5kaWYKLQl9IGJpdHM7Ci19IFRYRE1BX1BSX05VTV9ERVNfdCwgKlBUWERNQV9QUl9OVU1fREVTX3Q7Ci0KIAogI2RlZmluZSBFVF9ETUExMF9NQVNLCQkweDNGRgkvKiAxMCBiaXQgbWFzayBmb3IgRE1BMTBXIHR5cGVzICovCiAjZGVmaW5lIEVUX0RNQTEwX1dSQVAJCTB4NDAwCkBAIC0yNjEsNyArMjUxLDcgQEAKIAl1MzIgY3NyOwkJCS8qICAweDEwMDAgKi8KIAl1MzIgcHJfYmFzZV9oaTsJCQkvKiAgMHgxMDA0ICovCiAJdTMyIHByX2Jhc2VfbG87CQkJLyogIDB4MTAwOCAqLwotCVRYRE1BX1BSX05VTV9ERVNfdCBwcl9udW1fZGVzOwkvKiAgMHgxMDBDICovCisJdTMyIHByX251bV9kZXM7CQkJLyogIDB4MTAwQyAqLwogCXUzMiB0eHFfd3JfYWRkcjsJCS8qICAweDEwMTAgKi8KIAl1MzIgdHhxX3dyX2FkZHJfZXh0OwkJLyogIDB4MTAxNCAqLwogCXUzMiB0eHFfcmRfYWRkcjsJCS8qICAweDEwMTggKi8KQEAgLTM0OSwzNiArMzM5LDE4IEBACiAvKgogICogc3RydWN0dXJlIGZvciBudW1iZXIgb2YgcGFja2V0cyBkb25lIHJlZyBpbiByeGRtYSBhZGRyZXNzIG1hcAogICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MjAwQworICoKKyAqIDMxLTg6IHVudXNlZAorICogNy0wOiBudW0gZG9uZQogICovCi10eXBlZGVmIHVuaW9uIF9SWERNQV9OVU1fUEtUX0RPTkVfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgdW51c2VkOjI0OwkvKiBiaXRzIDgtMzEgKi8KLQkJdTMyIG51bV9kb25lOjg7CS8qIGJpdHMgMC03ICovCi0jZWxzZQotCQl1MzIgbnVtX2RvbmU6ODsJLyogYml0cyAwLTcgKi8KLQkJdTMyIHVudXNlZDoyNDsJLyogYml0cyA4LTMxICovCi0jZW5kaWYKLQl9IGJpdHM7Ci19IFJYRE1BX05VTV9QS1RfRE9ORV90LCAqUFJYRE1BX05VTV9QS1RfRE9ORV90OwogCiAvKgogICogc3RydWN0dXJlIGZvciBtYXggcGFja2V0IHRpbWUgcmVnIGluIHJ4ZG1hIGFkZHJlc3MgbWFwCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgyMDEwCisgKgorICogMzEtMTg6IHVudXNlZAorICogMTctMDogdGltZSBkb25lCiAgKi8KLXR5cGVkZWYgdW5pb24gX1JYRE1BX01BWF9QS1RfVElNRV90IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiB1bnVzZWQ6MTQ7CQkvKiBiaXRzIDE4LTMxICovCi0JCXUzMiB0aW1lX2RvbmU6MTg7CS8qIGJpdHMgMC0xNyAqLwotI2Vsc2UKLQkJdTMyIHRpbWVfZG9uZToxODsJLyogYml0cyAwLTE3ICovCi0JCXUzMiB1bnVzZWQ6MTQ7CQkvKiBiaXRzIDE4LTMxICovCi0jZW5kaWYKLQl9IGJpdHM7Ci19IFJYRE1BX01BWF9QS1RfVElNRV90LCAqUFJYRE1BX01BWF9QS1RfVElNRV90OwogCiAvKgogICogc3RydWN0dXJlIGZvciByeCBxdWV1ZSByZWFkIGFkZHJlc3MgcmVnIGluIHJ4ZG1hIGFkZHJlc3MgbWFwCkBAIC00MTMsOTEgKzM4NSw0NCBAQAogLyoKICAqIHN0cnVjdHVyZSBmb3IgcGFja2V0IHN0YXR1cyByaW5nIG51bWJlciBvZiBkZXNjcmlwdG9ycyByZWcgaW4gcnhkbWEgYWRkcmVzcwogICogbWFwLiAgTG9jYXRlZCBhdCBhZGRyZXNzIDB4MjAyOAorICoKKyAqIDMxLTEyOiB1bnVzZWQKKyAqIDExLTA6IHBzciBuZGVzCiAgKi8KLXR5cGVkZWYgdW5pb24gX1JYRE1BX1BTUl9OVU1fREVTX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHVudXNlZDoyMDsJCS8qIGJpdHMgMTItMzEgKi8KLQkJdTMyIHBzcl9uZGVzOjEyOwkvKiBiaXQgMC0xMSAqLwotI2Vsc2UKLQkJdTMyIHBzcl9uZGVzOjEyOwkvKiBiaXQgMC0xMSAqLwotCQl1MzIgdW51c2VkOjIwOwkJLyogYml0cyAxMi0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBSWERNQV9QU1JfTlVNX0RFU190LCAqUFJYRE1BX1BTUl9OVU1fREVTX3Q7CiAKIC8qCiAgKiBzdHJ1Y3R1cmUgZm9yIHBhY2tldCBzdGF0dXMgcmluZyBhdmFpbGFibGUgb2Zmc2V0IHJlZyBpbiByeGRtYSBhZGRyZXNzIG1hcAogICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MjAyQworICoKKyAqIDMxLTEzOiB1bnVzZWQKKyAqIDEyOiBwc3IgYXZhaWwgd3JhcAorICogMTEtMDogcHNyIGF2YWlsCiAgKi8KLXR5cGVkZWYgdW5pb24gX1JYRE1BX1BTUl9BVkFJTF9PRkZTRVRfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgdW51c2VkOjE5OwkJLyogYml0cyAxMy0zMSAqLwotCQl1MzIgcHNyX2F2YWlsX3dyYXA6MTsJLyogYml0IDEyICovCi0JCXUzMiBwc3JfYXZhaWw6MTI7CS8qIGJpdCAwLTExICovCi0jZWxzZQotCQl1MzIgcHNyX2F2YWlsOjEyOwkvKiBiaXQgMC0xMSAqLwotCQl1MzIgcHNyX2F2YWlsX3dyYXA6MTsJLyogYml0IDEyICovCi0JCXUzMiB1bnVzZWQ6MTk7CQkvKiBiaXRzIDEzLTMxICovCi0jZW5kaWYKLQl9IGJpdHM7Ci19IFJYRE1BX1BTUl9BVkFJTF9PRkZTRVRfdCwgKlBSWERNQV9QU1JfQVZBSUxfT0ZGU0VUX3Q7CiAKIC8qCiAgKiBzdHJ1Y3R1cmUgZm9yIHBhY2tldCBzdGF0dXMgcmluZyBmdWxsIG9mZnNldCByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKICAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDIwMzAKKyAqCisgKiAzMS0xMzogdW51c2VkCisgKiAxMjogcHNyIGZ1bGwgd3JhcAorICogMTEtMDogcHNyIGZ1bGwKICAqLwotdHlwZWRlZiB1bmlvbiBfUlhETUFfUFNSX0ZVTExfT0ZGU0VUX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHVudXNlZDoxOTsJCS8qIGJpdHMgMTMtMzEgKi8KLQkJdTMyIHBzcl9mdWxsX3dyYXA6MTsJLyogYml0IDEyICovCi0JCXUzMiBwc3JfZnVsbDoxMjsJLyogYml0IDAtMTEgKi8KLSNlbHNlCi0JCXUzMiBwc3JfZnVsbDoxMjsJLyogYml0IDAtMTEgKi8KLQkJdTMyIHBzcl9mdWxsX3dyYXA6MTsJLyogYml0IDEyICovCi0JCXUzMiB1bnVzZWQ6MTk7CQkvKiBiaXRzIDEzLTMxICovCi0jZW5kaWYKLQl9IGJpdHM7Ci19IFJYRE1BX1BTUl9GVUxMX09GRlNFVF90LCAqUFJYRE1BX1BTUl9GVUxMX09GRlNFVF90OwogCiAvKgogICogc3RydWN0dXJlIGZvciBwYWNrZXQgc3RhdHVzIHJpbmcgYWNjZXNzIGluZGV4IHJlZyBpbiByeGRtYSBhZGRyZXNzIG1hcAogICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MjAzNAorICoKKyAqIDMxLTU6IHVudXNlZAorICogNC0wOiBwc3JfYWkKICAqLwotdHlwZWRlZiB1bmlvbiBfUlhETUFfUFNSX0FDQ0VTU19JTkRFWF90IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiB1bnVzZWQ6Mjc7CS8qIGJpdHMgNS0zMSAqLwotCQl1MzIgcHNyX2FpOjU7CS8qIGJpdHMgMC00ICovCi0jZWxzZQotCQl1MzIgcHNyX2FpOjU7CS8qIGJpdHMgMC00ICovCi0JCXUzMiB1bnVzZWQ6Mjc7CS8qIGJpdHMgNS0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBSWERNQV9QU1JfQUNDRVNTX0lOREVYX3QsICpQUlhETUFfUFNSX0FDQ0VTU19JTkRFWF90OwogCiAvKgogICogc3RydWN0dXJlIGZvciBwYWNrZXQgc3RhdHVzIHJpbmcgbWluaW11bSBkZXNjcmlwdG9ycyByZWcgaW4gcnhkbWEgYWRkcmVzcwogICogbWFwLiAgTG9jYXRlZCBhdCBhZGRyZXNzIDB4MjAzOAorICoKKyAqIDMxLTEyOiB1bnVzZWQKKyAqIDExLTA6IHBzcl9taW4KICAqLwotdHlwZWRlZiB1bmlvbiBfUlhETUFfUFNSX01JTl9ERVNfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgdW51c2VkOjIwOwkvKiBiaXRzIDEyLTMxICovCi0JCXUzMiBwc3JfbWluOjEyOwkvKiBiaXRzIDAtMTEgKi8KLSNlbHNlCi0JCXUzMiBwc3JfbWluOjEyOwkvKiBiaXRzIDAtMTEgKi8KLQkJdTMyIHVudXNlZDoyMDsJLyogYml0cyAxMi0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBSWERNQV9QU1JfTUlOX0RFU190LCAqUFJYRE1BX1BTUl9NSU5fREVTX3Q7CiAKIC8qCiAgKiBzdHJ1Y3R1cmUgZm9yIGZyZWUgYnVmZmVyIHJpbmcgYmFzZSBsbyBhZGRyZXNzIHJlZyBpbiByeGRtYSBhZGRyZXNzIG1hcApAQCAtNTE0LDYgKzQzOSw5IEBACiAvKgogICogc3RydWN0dXJlIGZvciBmcmVlIGJ1ZmZlciByaW5nIG51bWJlciBvZiBkZXNjcmlwdG9ycyByZWcgaW4gcnhkbWEgYWRkcmVzcwogICogbWFwLiAgTG9jYXRlZCBhdCBhZGRyZXNzIDB4MjA0NAorICoKKyAqIDMxLTEwOiB1bnVzZWQKKyAqIDktMDogZmJyIG5kZXNjCiAgKi8KIHR5cGVkZWYgdW5pb24gX1JYRE1BX0ZCUl9OVU1fREVTX3QgewogCXUzMiB2YWx1ZTsKQEAgLTU0MywzNiArNDcxLDE4IEBACiAvKgogICogc3RydWN0dXJlIGZvciBmcmVlIGJ1ZmZlciBjYWNoZSAwIGZ1bGwgb2Zmc2V0IHJlZyBpbiByeGRtYSBhZGRyZXNzIG1hcAogICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MjA1MAorICoKKyAqIDMxLTU6IHVudXNlZAorICogNC0wOiBmYmMgcmRpCiAgKi8KLXR5cGVkZWYgdW5pb24gX1JYRE1BX0ZCQ19SRF9JTkRFWF90IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiB1bnVzZWQ6Mjc7CS8qIGJpdHMgNS0zMSAqLwotCQl1MzIgZmJjX3JkaTo1OwkvKiBiaXQgMC00ICovCi0jZWxzZQotCQl1MzIgZmJjX3JkaTo1OwkvKiBiaXQgMC00ICovCi0JCXUzMiB1bnVzZWQ6Mjc7CS8qIGJpdHMgNS0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBSWERNQV9GQkNfUkRfSU5ERVhfdCwgKlBSWERNQV9GQkNfUkRfSU5ERVhfdDsKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgZnJlZSBidWZmZXIgcmluZyAwIG1pbmltdW0gZGVzY3JpcHRvciByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKICAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDIwNTQKKyAqCisgKiAzMS0xMDogdW51c2VkCisgKiA5LTA6IGZiciBtaW4KICAqLwotdHlwZWRlZiB1bmlvbiBfUlhETUFfRkJSX01JTl9ERVNfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgdW51c2VkOjIyOwkvKiBiaXRzIDEwLTMxICovCi0JCXUzMiBmYnJfbWluOjEwOwkvKiBiaXRzIDAtOSAqLwotI2Vsc2UKLQkJdTMyIGZicl9taW46MTA7CS8qIGJpdHMgMC05ICovCi0JCXUzMiB1bnVzZWQ6MjI7CS8qIGJpdHMgMTAtMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gUlhETUFfRkJSX01JTl9ERVNfdCwgKlBSWERNQV9GQlJfTUlOX0RFU190OwogCiAvKgogICogc3RydWN0dXJlIGZvciBmcmVlIGJ1ZmZlciByaW5nIDEgYmFzZSBhZGRyZXNzIGxvIHJlZyBpbiByeGRtYSBhZGRyZXNzIG1hcApAQCAtNjE4LDMyICs1MjgsMzIgQEAKIAlSWERNQV9DU1JfdCBjc3I7CQkJCS8qICAweDIwMDAgKi8KIAl1MzIgZG1hX3diX2Jhc2VfbG87CQkJCS8qICAweDIwMDQgKi8KIAl1MzIgZG1hX3diX2Jhc2VfaGk7CQkJCS8qICAweDIwMDggKi8KLQlSWERNQV9OVU1fUEtUX0RPTkVfdCBudW1fcGt0X2RvbmU7CQkvKiAgMHgyMDBDICovCi0JUlhETUFfTUFYX1BLVF9USU1FX3QgbWF4X3BrdF90aW1lOwkJLyogIDB4MjAxMCAqLworCXUzMiBudW1fcGt0X2RvbmU7CQkJCS8qICAweDIwMEMgKi8KKwl1MzIgbWF4X3BrdF90aW1lOwkJCQkvKiAgMHgyMDEwICovCiAJdTMyIHJ4cV9yZF9hZGRyOwkJCQkvKiAgMHgyMDE0ICovCi0JdTMyIHJ4cV9yZF9hZGRyX2V4dDsJCQkvKiAgMHgyMDE4ICovCisJdTMyIHJ4cV9yZF9hZGRyX2V4dDsJCQkJLyogIDB4MjAxOCAqLwogCXUzMiByeHFfd3JfYWRkcjsJCQkJLyogIDB4MjAxQyAqLwogCXUzMiBwc3JfYmFzZV9sbzsJCQkJLyogIDB4MjAyMCAqLwogCXUzMiBwc3JfYmFzZV9oaTsJCQkJLyogIDB4MjAyNCAqLwotCVJYRE1BX1BTUl9OVU1fREVTX3QgcHNyX251bV9kZXM7CQkvKiAgMHgyMDI4ICovCi0JUlhETUFfUFNSX0FWQUlMX09GRlNFVF90IHBzcl9hdmFpbF9vZmZzZXQ7CS8qICAweDIwMkMgKi8KLQlSWERNQV9QU1JfRlVMTF9PRkZTRVRfdCBwc3JfZnVsbF9vZmZzZXQ7CS8qICAweDIwMzAgKi8KLQlSWERNQV9QU1JfQUNDRVNTX0lOREVYX3QgcHNyX2FjY2Vzc19pbmRleDsJLyogIDB4MjAzNCAqLwotCVJYRE1BX1BTUl9NSU5fREVTX3QgcHNyX21pbl9kZXM7CQkvKiAgMHgyMDM4ICovCisJdTMyIHBzcl9udW1fZGVzOwkJCQkvKiAgMHgyMDI4ICovCisJdTMyIHBzcl9hdmFpbF9vZmZzZXQ7CQkJCS8qICAweDIwMkMgKi8KKwl1MzIgcHNyX2Z1bGxfb2Zmc2V0OwkJCQkvKiAgMHgyMDMwICovCisJdTMyIHBzcl9hY2Nlc3NfaW5kZXg7CQkJCS8qICAweDIwMzQgKi8KKwl1MzIgcHNyX21pbl9kZXM7CQkJCS8qICAweDIwMzggKi8KIAl1MzIgZmJyMF9iYXNlX2xvOwkJCQkvKiAgMHgyMDNDICovCiAJdTMyIGZicjBfYmFzZV9oaTsJCQkJLyogIDB4MjA0MCAqLwotCVJYRE1BX0ZCUl9OVU1fREVTX3QgZmJyMF9udW1fZGVzOwkJLyogIDB4MjA0NCAqLwotCXUzMiBmYnIwX2F2YWlsX29mZnNldDsJCQkvKiAgMHgyMDQ4ICovCi0JdTMyIGZicjBfZnVsbF9vZmZzZXQ7CQkJLyogIDB4MjA0QyAqLwotCVJYRE1BX0ZCQ19SRF9JTkRFWF90IGZicjBfcmRfaW5kZXg7CQkvKiAgMHgyMDUwICovCi0JUlhETUFfRkJSX01JTl9ERVNfdCBmYnIwX21pbl9kZXM7CQkvKiAgMHgyMDU0ICovCisJdTMyIGZicjBfbnVtX2RlczsJCQkJLyogIDB4MjA0NCAqLworCXUzMiBmYnIwX2F2YWlsX29mZnNldDsJCQkJLyogIDB4MjA0OCAqLworCXUzMiBmYnIwX2Z1bGxfb2Zmc2V0OwkJCQkvKiAgMHgyMDRDICovCisJdTMyIGZicjBfcmRfaW5kZXg7CQkJCS8qICAweDIwNTAgKi8KKwl1MzIgZmJyMF9taW5fZGVzOwkJCQkvKiAgMHgyMDU0ICovCiAJdTMyIGZicjFfYmFzZV9sbzsJCQkJLyogIDB4MjA1OCAqLwogCXUzMiBmYnIxX2Jhc2VfaGk7CQkJCS8qICAweDIwNUMgKi8KLQlSWERNQV9GQlJfTlVNX0RFU190IGZicjFfbnVtX2RlczsJCS8qICAweDIwNjAgKi8KLQl1MzIgZmJyMV9hdmFpbF9vZmZzZXQ7CQkJLyogIDB4MjA2NCAqLwotCXUzMiBmYnIxX2Z1bGxfb2Zmc2V0OwkJCS8qICAweDIwNjggKi8KLQlSWERNQV9GQkNfUkRfSU5ERVhfdCBmYnIxX3JkX2luZGV4OwkJLyogIDB4MjA2QyAqLwotCVJYRE1BX0ZCUl9NSU5fREVTX3QgZmJyMV9taW5fZGVzOwkJLyogIDB4MjA3MCAqLworCXUzMiBmYnIxX251bV9kZXM7CQkJCS8qICAweDIwNjAgKi8KKwl1MzIgZmJyMV9hdmFpbF9vZmZzZXQ7CQkJCS8qICAweDIwNjQgKi8KKwl1MzIgZmJyMV9mdWxsX29mZnNldDsJCQkJLyogIDB4MjA2OCAqLworCXUzMiBmYnIxX3JkX2luZGV4OwkJCQkvKiAgMHgyMDZDICovCisJdTMyIGZicjFfbWluX2RlczsJCQkJLyogIDB4MjA3MCAqLwogfSBSWERNQV90LCAqUFJYRE1BX3Q7CiAKIC8qIEVORCBPRiBSWERNQSBSRUdJU1RFUiBBRERSRVNTIE1BUCAqLwpAQCAtNjg1LDIzICs1OTUsMTEgQEAKIC8qCiAgKiBzdHJ1Y3R1cmUgZm9yIHNoYWRvdyBwb2ludGVyIHJlZyBpbiB0eG1hYyBhZGRyZXNzIG1hcAogICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MzAwNAorICogMzEtMjc6IHJlc2VydmVkCisgKiAyNi0xNjogdHhxIHJkIHB0cgorICogMTUtMTE6IHJlc2VydmVkCisgKiAxMC0wOiB0eHEgd3IgcHRyCiAgKi8KLXR5cGVkZWYgdW5pb24gX1RYTUFDX1NIQURPV19QVFJfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgcmVzZXJ2ZWQyOjU7CS8qIGJpdHMgMjctMzEgKi8KLQkJdTMyIHR4cV9yZF9wdHI6MTE7CS8qIGJpdHMgMTYtMjYgKi8KLQkJdTMyIHJlc2VydmVkOjU7CQkvKiBiaXRzIDExLTE1ICovCi0JCXUzMiB0eHFfd3JfcHRyOjExOwkvKiBiaXRzIDAtMTAgKi8KLSNlbHNlCi0JCXUzMiB0eHFfd3JfcHRyOjExOwkvKiBiaXRzIDAtMTAgKi8KLQkJdTMyIHJlc2VydmVkOjU7CQkvKiBiaXRzIDExLTE1ICovCi0JCXUzMiB0eHFfcmRfcHRyOjExOwkvKiBiaXRzIDE2LTI2ICovCi0JCXUzMiByZXNlcnZlZDI6NTsJLyogYml0cyAyNy0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBUWE1BQ19TSEFET1dfUFRSX3QsICpQVFhNQUNfU0hBRE9XX1BUUl90OwogCiAvKgogICogc3RydWN0dXJlIGZvciBlcnJvciBjb3VudCByZWcgaW4gdHhtYWMgYWRkcmVzcyBtYXAKQEAgLTcyNyw1OSArNjI1LDI2IEBACiAvKgogICogc3RydWN0dXJlIGZvciBtYXggZmlsbCByZWcgaW4gdHhtYWMgYWRkcmVzcyBtYXAKICAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDMwMEMKKyAqIDMxLTEyOiB1bnVzZWQKKyAqIDExLTA6IG1heCBmaWxsCiAgKi8KLXR5cGVkZWYgdW5pb24gX1RYTUFDX01BWF9GSUxMX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHVudXNlZDoyMDsJCS8qIGJpdHMgMTItMzEgKi8KLQkJdTMyIG1heF9maWxsOjEyOwkvKiBiaXRzIDAtMTEgKi8KLSNlbHNlCi0JCXUzMiBtYXhfZmlsbDoxMjsJLyogYml0cyAwLTExICovCi0JCXUzMiB1bnVzZWQ6MjA7CQkvKiBiaXRzIDEyLTMxICovCi0jZW5kaWYKLQl9IGJpdHM7Ci19IFRYTUFDX01BWF9GSUxMX3QsICpQVFhNQUNfTUFYX0ZJTExfdDsKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgY2YgcGFyYW1ldGVyIHJlZyBpbiB0eG1hYyBhZGRyZXNzIG1hcAogICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MzAxMAorICogMzEtMTY6IGNmZXAKKyAqIDE1LTA6IGNmcHQKICAqLwotdHlwZWRlZiB1bmlvbiBfVFhNQUNfQ0ZfUEFSQU1fdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgY2ZlcDoxNjsJLyogYml0cyAxNi0zMSAqLwotCQl1MzIgY2ZwdDoxNjsJLyogYml0cyAwLTE1ICovCi0jZWxzZQotCQl1MzIgY2ZwdDoxNjsJLyogYml0cyAwLTE1ICovCi0JCXUzMiBjZmVwOjE2OwkvKiBiaXRzIDE2LTMxICovCi0jZW5kaWYKLQl9IGJpdHM7Ci19IFRYTUFDX0NGX1BBUkFNX3QsICpQVFhNQUNfQ0ZfUEFSQU1fdDsKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgdHggdGVzdCByZWcgaW4gdHhtYWMgYWRkcmVzcyBtYXAKICAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDMwMTQKKyAqIDMxLTE3OiB1bnVzZWQKKyAqIDE2OiByZXNlcnZlZDEKKyAqIDE1OiB0eHRlc3RfZW4KKyAqIDE0LTExOiB1bnVzZWQKKyAqIDEwLTA6IHR4cSB0ZXN0IHBvaW50ZXIKICAqLwotdHlwZWRlZiB1bmlvbiBfVFhNQUNfVFhURVNUX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHVudXNlZDI6MTU7CQkvKiBiaXRzIDE3LTMxICovCi0JCXUzMiByZXNlcnZlZDE6MTsJLyogYml0IDE2ICovCi0JCXUzMiB0eHRlc3RfZW46MTsJLyogYml0IDE1ICovCi0JCXUzMiB1bnVzZWQxOjQ7CQkvKiBiaXRzIDExLTE0ICovCi0JCXUzMiB0eHF0ZXN0X3B0cjoxMTsJLyogYml0cyAwLTExICovCi0jZWxzZQotCQl1MzIgdHhxdGVzdF9wdHI6MTE7CS8qIGJpdHMgMC0xMCAqLwotCQl1MzIgdW51c2VkMTo0OwkJLyogYml0cyAxMS0xNCAqLwotCQl1MzIgdHh0ZXN0X2VuOjE7CS8qIGJpdCAxNSAqLwotCQl1MzIgcmVzZXJ2ZWQxOjE7CS8qIGJpdCAxNiAqLwotCQl1MzIgdW51c2VkMjoxNTsJCS8qIGJpdHMgMTctMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gVFhNQUNfVFhURVNUX3QsICpQVFhNQUNfVFhURVNUX3Q7CiAKIC8qCiAgKiBzdHJ1Y3R1cmUgZm9yIGVycm9yIHJlZyBpbiB0eG1hYyBhZGRyZXNzIG1hcApAQCAtODQ2LDM1ICs3MTEsMjUgQEAKIC8qCiAgKiBzdHJ1Y3R1cmUgZm9yIGVycm9yIGludGVycnVwdCByZWcgaW4gdHhtYWMgYWRkcmVzcyBtYXAKICAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDMwMjAKKyAqCisgKiAzMS0yOiB1bnVzZWQKKyAqIDE6IGJwX3JlcQorICogMDogYnBfeG9ueG9mZgogICovCi10eXBlZGVmIHVuaW9uIF9UWE1BQ19DUF9DVFJMX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHVudXNlZDozMDsJCS8qIGJpdHMgMi0zMSAqLwotCQl1MzIgYnBfcmVxOjE7CQkvKiBiaXQgMSAqLwotCQl1MzIgYnBfeG9ueG9mZjoxOwkvKiBiaXQgMCAqLwotI2Vsc2UKLQkJdTMyIGJwX3hvbnhvZmY6MTsJLyogYml0IDAgKi8KLQkJdTMyIGJwX3JlcToxOwkJLyogYml0IDEgKi8KLQkJdTMyIHVudXNlZDozMDsJCS8qIGJpdHMgMi0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBUWE1BQ19CUF9DVFJMX3QsICpQVFhNQUNfQlBfQ1RSTF90OwogCiAvKgogICogVHggTUFDIE1vZHVsZSBvZiBKQUdDb3JlIEFkZHJlc3MgTWFwcGluZwogICovCiB0eXBlZGVmIHN0cnVjdCBfVFhNQUNfdCB7CQkvKiBMb2NhdGlvbjogKi8KIAlUWE1BQ19DVExfdCBjdGw7CQkvKiAgMHgzMDAwICovCi0JVFhNQUNfU0hBRE9XX1BUUl90IHNoYWRvd19wdHI7CS8qICAweDMwMDQgKi8KKwl1MzIgc2hhZG93X3B0cjsJCQkvKiAgMHgzMDA0ICovCiAJVFhNQUNfRVJSX0NOVF90IGVycl9jbnQ7CS8qICAweDMwMDggKi8KLQlUWE1BQ19NQVhfRklMTF90IG1heF9maWxsOwkvKiAgMHgzMDBDICovCi0JVFhNQUNfQ0ZfUEFSQU1fdCBjZl9wYXJhbTsJLyogIDB4MzAxMCAqLwotCVRYTUFDX1RYVEVTVF90IHR4X3Rlc3Q7CQkvKiAgMHgzMDE0ICovCisJdTMyIG1heF9maWxsOwkJCS8qICAweDMwMEMgKi8KKwl1MzIgY2ZfcGFyYW07CQkJLyogIDB4MzAxMCAqLworCXUzMiB0eF90ZXN0OwkJCS8qICAweDMwMTQgKi8KIAlUWE1BQ19FUlJfdCBlcnI7CQkvKiAgMHgzMDE4ICovCiAJVFhNQUNfRVJSX0lOVF90IGVycl9pbnQ7CS8qICAweDMwMUMgKi8KLQlUWE1BQ19CUF9DVFJMX3QgYnBfY3RybDsJLyogIDB4MzAyMCAqLworCXUzMiBicF9jdHJsOwkJCS8qICAweDMwMjAgKi8KIH0gVFhNQUNfdCwgKlBUWE1BQ190OwogCiAvKiBFTkQgT0YgVFhNQUMgUkVHSVNURVIgQUREUkVTUyBNQVAgKi8KQEAgLTEzMDgsMTU3ICsxMTYzLDc3IEBACiAvKgogICogc3RydWN0dXJlIGZvciBjb25maWd1cmF0aW9uICMxIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDAwCisgKgorICogMzE6IHNvZnQgcmVzZXQKKyAqIDMwOiBzaW0gcmVzZXQKKyAqIDI5LTIwOiByZXNlcnZlZAorICogMTk6IHJlc2V0IHJ4IG1jCisgKiAxODogcmVzZXQgdHggbWMKKyAqIDE3OiByZXNldCByeCBmdW5jCisgKiAxNjogcmVzZXQgdHggZm5jCisgKiAxNS05OiByZXNlcnZlZAorICogODogbG9vcGJhY2sKKyAqIDctNjogcmVzZXJ2ZWQKKyAqIDU6IHJ4IGZsb3cKKyAqIDQ6IHR4IGZsb3cKKyAqIDM6IHN5bmNkIHJ4IGVuCisgKiAyOiByeCBlbmFibGUKKyAqIDE6IHN5bmNkIHR4IGVuCisgKiAwOiB0eCBlbmFibGUKICAqLwotdHlwZWRlZiB1bmlvbiBfTUFDX0NGRzFfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgc29mdF9yZXNldDoxOwkJLyogYml0IDMxICovCi0JCXUzMiBzaW1fcmVzZXQ6MTsJCS8qIGJpdCAzMCAqLwotCQl1MzIgcmVzZXJ2ZWQzOjEwOwkJLyogYml0cyAyMC0yOSAqLwotCQl1MzIgcmVzZXRfcnhfbWM6MTsJCS8qIGJpdCAxOSAqLwotCQl1MzIgcmVzZXRfdHhfbWM6MTsJCS8qIGJpdCAxOCAqLwotCQl1MzIgcmVzZXRfcnhfZnVuOjE7CS8qIGJpdCAxNyAqLwotCQl1MzIgcmVzZXRfdHhfZnVuOjE7CS8qIGJpdCAxNiAqLwotCQl1MzIgcmVzZXJ2ZWQyOjc7CQkvKiBiaXRzIDktMTUgKi8KLQkJdTMyIGxvb3BfYmFjazoxOwkJLyogYml0IDggKi8KLQkJdTMyIHJlc2VydmVkMToyOwkJLyogYml0cyA2LTcgKi8KLQkJdTMyIHJ4X2Zsb3c6MTsJCS8qIGJpdCA1ICovCi0JCXUzMiB0eF9mbG93OjE7CQkvKiBiaXQgNCAqLwotCQl1MzIgc3luY2RfcnhfZW46MTsJCS8qIGJpdCAzICovCi0JCXUzMiByeF9lbmFibGU6MTsJCS8qIGJpdCAyICovCi0JCXUzMiBzeW5jZF90eF9lbjoxOwkJLyogYml0IDEgKi8KLQkJdTMyIHR4X2VuYWJsZToxOwkJLyogYml0IDAgKi8KLSNlbHNlCi0JCXUzMiB0eF9lbmFibGU6MTsJCS8qIGJpdCAwICovCi0JCXUzMiBzeW5jZF90eF9lbjoxOwkJLyogYml0IDEgKi8KLQkJdTMyIHJ4X2VuYWJsZToxOwkJLyogYml0IDIgKi8KLQkJdTMyIHN5bmNkX3J4X2VuOjE7CQkvKiBiaXQgMyAqLwotCQl1MzIgdHhfZmxvdzoxOwkJLyogYml0IDQgKi8KLQkJdTMyIHJ4X2Zsb3c6MTsJCS8qIGJpdCA1ICovCi0JCXUzMiByZXNlcnZlZDE6MjsJCS8qIGJpdHMgNi03ICovCi0JCXUzMiBsb29wX2JhY2s6MTsJCS8qIGJpdCA4ICovCi0JCXUzMiByZXNlcnZlZDI6NzsJCS8qIGJpdHMgOS0xNSAqLwotCQl1MzIgcmVzZXRfdHhfZnVuOjE7CS8qIGJpdCAxNiAqLwotCQl1MzIgcmVzZXRfcnhfZnVuOjE7CS8qIGJpdCAxNyAqLwotCQl1MzIgcmVzZXRfdHhfbWM6MTsJCS8qIGJpdCAxOCAqLwotCQl1MzIgcmVzZXRfcnhfbWM6MTsJCS8qIGJpdCAxOSAqLwotCQl1MzIgcmVzZXJ2ZWQzOjEwOwkJLyogYml0cyAyMC0yOSAqLwotCQl1MzIgc2ltX3Jlc2V0OjE7CQkvKiBiaXQgMzAgKi8KLQkJdTMyIHNvZnRfcmVzZXQ6MTsJCS8qIGJpdCAzMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBNQUNfQ0ZHMV90LCAqUE1BQ19DRkcxX3Q7CisKKyNkZWZpbmUgQ0ZHMV9MT09QQkFDSwkweDAwMDAwMTAwCisjZGVmaW5lIENGRzFfUlhfRkxPVwkweDAwMDAwMDIwCisjZGVmaW5lIENGRzFfVFhfRkxPVwkweDAwMDAwMDEwCisjZGVmaW5lIENGRzFfUlhfRU5BQkxFCTB4MDAwMDAwMDQKKyNkZWZpbmUgQ0ZHMV9UWF9FTkFCTEUJMHgwMDAwMDAwMQorI2RlZmluZSBDRkcxX1dBSVQJMHgwMDAwMDAwQQkvKiBSWCAmIFRYIHN5bmNkICovCiAKIC8qCiAgKiBzdHJ1Y3R1cmUgZm9yIGNvbmZpZ3VyYXRpb24gIzIgcmVnIGluIG1hYyBhZGRyZXNzIG1hcC4KICAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDUwMDQKKyAqIDMxLTE2OiByZXNlcnZlZAorICogMTUtMTI6IHByZWFtYmxlCisgKiAxMS0xMDogcmVzZXJ2ZWQKKyAqIDktODogaWYgbW9kZQorICogNy02OiByZXNlcnZlZAorICogNTogaHVnZSBmcmFtZQorICogNDogbGVuZ3RoIGNoZWNrCisgKiAzOiB1bmRlZmluZWQKKyAqIDI6IHBhZCBjcmMKKyAqIDE6IGNyYyBlbmFibGUKKyAqIDA6IGZ1bGwgZHVwbGV4CiAgKi8KLXR5cGVkZWYgdW5pb24gX01BQ19DRkcyX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHJlc2VydmVkMzoxNjsJCS8qIGJpdHMgMTYtMzEgKi8KLQkJdTMyIHByZWFtYmxlX2xlbjo0OwkvKiBiaXRzIDEyLTE1ICovCi0JCXUzMiByZXNlcnZlZDI6MjsJCS8qIGJpdHMgMTAtMTEgKi8KLQkJdTMyIGlmX21vZGU6MjsJCS8qIGJpdHMgOC05ICovCi0JCXUzMiByZXNlcnZlZDE6MjsJCS8qIGJpdHMgNi03ICovCi0JCXUzMiBodWdlX2ZyYW1lOjE7CQkvKiBiaXQgNSAqLwotCQl1MzIgbGVuX2NoZWNrOjE7CQkvKiBiaXQgNCAqLwotCQl1MzIgdW5kZWZpbmVkOjE7CQkvKiBiaXQgMyAqLwotCQl1MzIgcGFkX2NyYzoxOwkJLyogYml0IDIgKi8KLQkJdTMyIGNyY19lbmFibGU6MTsJCS8qIGJpdCAxICovCi0JCXUzMiBmdWxsX2R1cGxleDoxOwkJLyogYml0IDAgKi8KLSNlbHNlCi0JCXUzMiBmdWxsX2R1cGxleDoxOwkJLyogYml0IDAgKi8KLQkJdTMyIGNyY19lbmFibGU6MTsJCS8qIGJpdCAxICovCi0JCXUzMiBwYWRfY3JjOjE7CQkvKiBiaXQgMiAqLwotCQl1MzIgdW5kZWZpbmVkOjE7CQkvKiBiaXQgMyAqLwotCQl1MzIgbGVuX2NoZWNrOjE7CQkvKiBiaXQgNCAqLwotCQl1MzIgaHVnZV9mcmFtZToxOwkJLyogYml0IDUgKi8KLQkJdTMyIHJlc2VydmVkMToyOwkJLyogYml0cyA2LTcgKi8KLQkJdTMyIGlmX21vZGU6MjsJCS8qIGJpdHMgOC05ICovCi0JCXUzMiByZXNlcnZlZDI6MjsJCS8qIGJpdHMgMTAtMTEgKi8KLQkJdTMyIHByZWFtYmxlX2xlbjo0OwkvKiBiaXRzIDEyLTE1ICovCi0JCXUzMiByZXNlcnZlZDM6MTY7CQkvKiBiaXRzIDE2LTMxICovCi0jZW5kaWYKLQl9IGJpdHM7Ci19IE1BQ19DRkcyX3QsICpQTUFDX0NGRzJfdDsKKwogCiAvKgogICogc3RydWN0dXJlIGZvciBJbnRlcnBhY2tldCBnYXAgcmVnIGluIG1hYyBhZGRyZXNzIG1hcC4KICAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDUwMDgKLSAqLwotdHlwZWRlZiB1bmlvbiBfTUFDX0lQR190IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiByZXNlcnZlZDoxOwkJLyogYml0IDMxICovCi0JCXUzMiBub25fQjJCX2lwZ18xOjc7CS8qIGJpdHMgMjQtMzAgKi8KLQkJdTMyIHVuZGVmaW5lZDI6MTsJCS8qIGJpdCAyMyAqLwotCQl1MzIgbm9uX0IyQl9pcGdfMjo3OwkvKiBiaXRzIDE2LTIyICovCi0JCXUzMiBtaW5faWZnX2VuZm9yY2U6ODsJLyogYml0cyA4LTE1ICovCi0JCXUzMiB1bmRlZmluZWQxOjE7CQkvKiBiaXQgNyAqLwotCQl1MzIgQjJCX2lwZzo3OwkJLyogYml0cyAwLTYgKi8KLSNlbHNlCi0JCXUzMiBCMkJfaXBnOjc7CQkvKiBiaXRzIDAtNiAqLwotCQl1MzIgdW5kZWZpbmVkMToxOwkJLyogYml0IDcgKi8KLQkJdTMyIG1pbl9pZmdfZW5mb3JjZTo4OwkvKiBiaXRzIDgtMTUgKi8KLQkJdTMyIG5vbl9CMkJfaXBnXzI6NzsJLyogYml0cyAxNi0yMiAqLwotCQl1MzIgdW5kZWZpbmVkMjoxOwkJLyogYml0IDIzICovCi0JCXUzMiBub25fQjJCX2lwZ18xOjc7CS8qIGJpdHMgMjQtMzAgKi8KLQkJdTMyIHJlc2VydmVkOjE7CQkvKiBiaXQgMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gTUFDX0lQR190LCAqUE1BQ19JUEdfdDsKLQotLyoKKyAqCisgKiAzMTogcmVzZXJ2ZWQKKyAqIDMwLTI0OiBub24gQjJCIGlwZyAxCisgKiAyMzogdW5kZWZpbmVkCisgKiAyMi0xNjogbm9uIEIyQiBpcGcgMgorICogMTUtODogTWluIGlmZyBlbmZvcmNlCisgKiA3LTA6IEIyQiBpcGcKKyAqCiAgKiBzdHJ1Y3R1cmUgZm9yIGhhbGYgZHVwbGV4IHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDBDCisgKiAzMS0yNDogcmVzZXJ2ZWQKKyAqIDIzLTIwOiBBbHQgQkVCIHRydW5jCisgKiAxOTogQWx0IEJFQiBlbmFibGUKKyAqIDE4OiBCUCBubyBiYWNrb2ZmCisgKiAxNzogbm8gYmFja29mZgorICogMTY6IGV4Y2VzcyBkZWZlcgorICogMTUtMTI6IHJlLXhtaXQgbWF4CisgKiAxMS0xMDogcmVzZXJ2ZWQKKyAqIDktMDogY29sbGlzaW9uIHdpbmRvdwogICovCi10eXBlZGVmIHVuaW9uIF9NQUNfSEZEUF90IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiByZXNlcnZlZDI6ODsJCS8qIGJpdHMgMjQtMzEgKi8KLQkJdTMyIGFsdF9iZWJfdHJ1bmM6NDsJLyogYml0cyAyMy0yMCAqLwotCQl1MzIgYWx0X2JlYl9lbmFibGU6MTsJLyogYml0IDE5ICovCi0JCXUzMiBicF9ub19iYWNrb2ZmOjE7CS8qIGJpdCAxOCAqLwotCQl1MzIgbm9fYmFja29mZjoxOwkJLyogYml0IDE3ICovCi0JCXUzMiBleGNlc3NfZGVmZXI6MTsJLyogYml0IDE2ICovCi0JCXUzMiByZXhtaXRfbWF4OjQ7CQkvKiBiaXRzIDEyLTE1ICovCi0JCXUzMiByZXNlcnZlZDE6MjsJCS8qIGJpdHMgMTAtMTEgKi8KLQkJdTMyIGNvbGxfd2luZG93OjEwOwkvKiBiaXRzIDAtOSAqLwotI2Vsc2UKLQkJdTMyIGNvbGxfd2luZG93OjEwOwkvKiBiaXRzIDAtOSAqLwotCQl1MzIgcmVzZXJ2ZWQxOjI7CQkvKiBiaXRzIDEwLTExICovCi0JCXUzMiByZXhtaXRfbWF4OjQ7CQkvKiBiaXRzIDEyLTE1ICovCi0JCXUzMiBleGNlc3NfZGVmZXI6MTsJLyogYml0IDE2ICovCi0JCXUzMiBub19iYWNrb2ZmOjE7CQkvKiBiaXQgMTcgKi8KLQkJdTMyIGJwX25vX2JhY2tvZmY6MTsJLyogYml0IDE4ICovCi0JCXUzMiBhbHRfYmViX2VuYWJsZToxOwkvKiBiaXQgMTkgKi8KLQkJdTMyIGFsdF9iZWJfdHJ1bmM6NDsJLyogYml0cyAyMy0yMCAqLwotCQl1MzIgcmVzZXJ2ZWQyOjg7CQkvKiBiaXRzIDI0LTMxICovCi0jZW5kaWYKLQl9IGJpdHM7Ci19IE1BQ19IRkRQX3QsICpQTUFDX0hGRFBfdDsKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgTWF4aW11bSBGcmFtZSBMZW5ndGggcmVnIGluIG1hYyBhZGRyZXNzIG1hcC4KLSAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDUwMTAKKyAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDUwMTA6IGJpdHMgMC0xNSBob2xkIHRoZSBsZW5ndGguCiAgKi8KLXR5cGVkZWYgdW5pb24gX01BQ19NQVhfRk1fTEVOX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHJlc2VydmVkOjE2OwkvKiBiaXRzIDE2LTMxICovCi0JCXUzMiBtYXhfbGVuOjE2OwkvKiBiaXRzIDAtMTUgKi8KLSNlbHNlCi0JCXUzMiBtYXhfbGVuOjE2OwkvKiBiaXRzIDAtMTUgKi8KLQkJdTMyIHJlc2VydmVkOjE2OwkvKiBiaXRzIDE2LTMxICovCi0jZW5kaWYKLQl9IGJpdHM7Ci19IE1BQ19NQVhfRk1fTEVOX3QsICpQTUFDX01BWF9GTV9MRU5fdDsKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgUmVzZXJ2ZSAxIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCkBAIC0xNDY5LDE4NiArMTI0NCw4NyBAQAogLyoKICAqIHN0cnVjdHVyZSBmb3IgVGVzdCByZWcgaW4gbWFjIGFkZHJlc3MgbWFwLgogICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NTAxQworICogdGVzdDogYml0cyAwLTIsIHJlc3QgdW51c2VkCiAgKi8KLXR5cGVkZWYgdW5pb24gX01BQ19URVNUX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHVudXNlZDoyOTsJLyogYml0cyAzLTMxICovCi0JCXUzMiBtYWNfdGVzdDozOwkvKiBiaXRzIDAtMiAqLwotI2Vsc2UKLQkJdTMyIG1hY190ZXN0OjM7CS8qIGJpdHMgMC0yICovCi0JCXUzMiB1bnVzZWQ6Mjk7CS8qIGJpdHMgMy0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBNQUNfVEVTVF90LCAqUE1BQ19URVNUX3Q7CiAKIC8qCiAgKiBzdHJ1Y3R1cmUgZm9yIE1JSSBNYW5hZ2VtZW50IENvbmZpZ3VyYXRpb24gcmVnIGluIG1hYyBhZGRyZXNzIG1hcC4KICAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDUwMjAKKyAqCisgKiAzMTogcmVzZXQgTUlJIG1nbXQKKyAqIDMwLTY6IHVudXNlZAorICogNTogc2NhbiBhdXRvIGluY3JlbWVudAorICogNDogcHJlYW1ibGUgc3VwcmVzcworICogMzogdW5kZWZpbmVkCisgKiAyLTA6IG1nbXQgY2xvY2sgcmVzZXQKICAqLwotdHlwZWRlZiB1bmlvbiBfTUlJX01HTVRfQ0ZHX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHJlc2V0X21paV9tZ210OjE7CS8qIGJpdCAzMSAqLwotCQl1MzIgcmVzZXJ2ZWQ6MjU7CQkvKiBiaXRzIDYtMzAgKi8KLQkJdTMyIHNjYW5fYXV0b19pbmNyZW10OjE7CS8qIGJpdCA1ICovCi0JCXUzMiBwcmVhbWJsZV9zdXBwcmVzczoxOwkvKiBiaXQgNCAqLwotCQl1MzIgdW5kZWZpbmVkOjE7CQkvKiBiaXQgMyAqLwotCQl1MzIgbWdtdF9jbGtfcmVzZXQ6MzsJLyogYml0cyAwLTIgKi8KLSNlbHNlCi0JCXUzMiBtZ210X2Nsa19yZXNldDozOwkvKiBiaXRzIDAtMiAqLwotCQl1MzIgdW5kZWZpbmVkOjE7CQkvKiBiaXQgMyAqLwotCQl1MzIgcHJlYW1ibGVfc3VwcHJlc3M6MTsJLyogYml0IDQgKi8KLQkJdTMyIHNjYW5fYXV0b19pbmNyZW10OjE7CS8qIGJpdCA1ICovCi0JCXUzMiByZXNlcnZlZDoyNTsJCS8qIGJpdHMgNi0zMCAqLwotCQl1MzIgcmVzZXRfbWlpX21nbXQ6MTsJLyogYml0IDMxICovCi0jZW5kaWYKLQl9IGJpdHM7Ci19IE1JSV9NR01UX0NGR190LCAqUE1JSV9NR01UX0NGR190OwogCiAvKgogICogc3RydWN0dXJlIGZvciBNSUkgTWFuYWdlbWVudCBDb21tYW5kIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDI0CisgKiBiaXQgMTogc2NhbiBjeWNsZQorICogYml0IDA6IHJlYWQgY3ljbGUKICAqLwotdHlwZWRlZiB1bmlvbiBfTUlJX01HTVRfQ01EX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHJlc2VydmVkOjMwOwkvKiBiaXRzIDItMzEgKi8KLQkJdTMyIHNjYW5fY3ljbGU6MTsJLyogYml0IDEgKi8KLQkJdTMyIHJlYWRfY3ljbGU6MTsJLyogYml0IDAgKi8KLSNlbHNlCi0JCXUzMiByZWFkX2N5Y2xlOjE7CS8qIGJpdCAwICovCi0JCXUzMiBzY2FuX2N5Y2xlOjE7CS8qIGJpdCAxICovCi0JCXUzMiByZXNlcnZlZDozMDsJLyogYml0cyAyLTMxICovCi0jZW5kaWYKLQl9IGJpdHM7Ci19IE1JSV9NR01UX0NNRF90LCAqUE1JSV9NR01UX0NNRF90OwogCiAvKgogICogc3RydWN0dXJlIGZvciBNSUkgTWFuYWdlbWVudCBBZGRyZXNzIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDI4CisgKiAzMS0xMzogcmVzZXJ2ZWQKKyAqIDEyLTg6IHBoeSBhZGRyCisgKiA3LTU6IHJlc2VydmVkCisgKiA0LTA6IHJlZ2lzdGVyCiAgKi8KLXR5cGVkZWYgdW5pb24gX01JSV9NR01UX0FERFJfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgcmVzZXJ2ZWQyOjE5OwkvKiBiaXQgMTMtMzEgKi8KLQkJdTMyIHBoeV9hZGRyOjU7CS8qIGJpdHMgOC0xMiAqLwotCQl1MzIgcmVzZXJ2ZWQxOjM7CS8qIGJpdHMgNS03ICovCi0JCXUzMiByZWdfYWRkcjo1OwkvKiBiaXRzIDAtNCAqLwotI2Vsc2UKLQkJdTMyIHJlZ19hZGRyOjU7CS8qIGJpdHMgMC00ICovCi0JCXUzMiByZXNlcnZlZDE6MzsJLyogYml0cyA1LTcgKi8KLQkJdTMyIHBoeV9hZGRyOjU7CS8qIGJpdHMgOC0xMiAqLwotCQl1MzIgcmVzZXJ2ZWQyOjE5OwkvKiBiaXQgMTMtMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gTUlJX01HTVRfQUREUl90LCAqUE1JSV9NR01UX0FERFJfdDsKKworI2RlZmluZSBNSUlfQUREUihwaHkscmVnKQkoKHBoeSkgPDwgOCB8IChyZWcpKQogCiAvKgogICogc3RydWN0dXJlIGZvciBNSUkgTWFuYWdlbWVudCBDb250cm9sIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDJDCisgKiAzMS0xNjogcmVzZXJ2ZWQKKyAqIDE1LTA6IHBoeSBjb250cm9sCiAgKi8KLXR5cGVkZWYgdW5pb24gX01JSV9NR01UX0NUUkxfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgcmVzZXJ2ZWQ6MTY7CS8qIGJpdHMgMTYtMzEgKi8KLQkJdTMyIHBoeV9jdHJsOjE2OwkvKiBiaXRzIDAtMTUgKi8KLSNlbHNlCi0JCXUzMiBwaHlfY3RybDoxNjsJLyogYml0cyAwLTE1ICovCi0JCXUzMiByZXNlcnZlZDoxNjsJLyogYml0cyAxNi0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBNSUlfTUdNVF9DVFJMX3QsICpQTUlJX01HTVRfQ1RSTF90OwogCiAvKgogICogc3RydWN0dXJlIGZvciBNSUkgTWFuYWdlbWVudCBTdGF0dXMgcmVnIGluIG1hYyBhZGRyZXNzIG1hcC4KICAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDUwMzAKKyAqIDMxLTE2OiByZXNlcnZlZAorICogMTUtMDogcGh5IGNvbnRyb2wKICAqLwotdHlwZWRlZiB1bmlvbiBfTUlJX01HTVRfU1RBVF90IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiByZXNlcnZlZDoxNjsJLyogYml0cyAxNi0zMSAqLwotCQl1MzIgcGh5X3N0YXQ6MTY7CS8qIGJpdHMgMC0xNSAqLwotI2Vsc2UKLQkJdTMyIHBoeV9zdGF0OjE2OwkvKiBiaXRzIDAtMTUgKi8KLQkJdTMyIHJlc2VydmVkOjE2OwkvKiBiaXRzIDE2LTMxICovCi0jZW5kaWYKLQl9IGJpdHM7Ci19IE1JSV9NR01UX1NUQVRfdCwgKlBNSUlfTUdNVF9TVEFUX3Q7CiAKIC8qCiAgKiBzdHJ1Y3R1cmUgZm9yIE1JSSBNYW5hZ2VtZW50IEluZGljYXRvcnMgcmVnIGluIG1hYyBhZGRyZXNzIG1hcC4KICAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDUwMzQKKyAqIDMxLTM6IHJlc2VydmVkCisgKiAyOiBub3QgdmFsaWQKKyAqIDE6IHNjYW5uaW5nCisgKiAwOiBidXN5CiAgKi8KLXR5cGVkZWYgdW5pb24gX01JSV9NR01UX0lORElDQVRPUl90IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiByZXNlcnZlZDoyOTsJLyogYml0cyAzLTMxICovCi0JCXUzMiBub3RfdmFsaWQ6MTsJLyogYml0IDIgKi8KLQkJdTMyIHNjYW5uaW5nOjE7CS8qIGJpdCAxICovCi0JCXUzMiBidXN5OjE7CS8qIGJpdCAwICovCi0jZWxzZQotCQl1MzIgYnVzeToxOwkvKiBiaXQgMCAqLwotCQl1MzIgc2Nhbm5pbmc6MTsJLyogYml0IDEgKi8KLQkJdTMyIG5vdF92YWxpZDoxOwkvKiBiaXQgMiAqLwotCQl1MzIgcmVzZXJ2ZWQ6Mjk7CS8qIGJpdHMgMy0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBNSUlfTUdNVF9JTkRJQ0FUT1JfdCwgKlBNSUlfTUdNVF9JTkRJQ0FUT1JfdDsKKworI2RlZmluZSBNR01UX0JVU1kJMHgwMDAwMDAwMQkvKiBidXN5ICovCisjZGVmaW5lIE1HTVRfV0FJVAkweDAwMDAwMDA1CS8qIGJ1c3kgfCBub3QgdmFsaWQgKi8KIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgSW50ZXJmYWNlIENvbnRyb2wgcmVnIGluIG1hYyBhZGRyZXNzIG1hcC4KICAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDUwMzgKKyAqCisgKiAzMTogcmVzZXQgaWYgbW9kdWxlCisgKiAzMC0yODogcmVzZXJ2ZWQKKyAqIDI3OiB0YmkgbW9kZQorICogMjY6IGdoZCBtb2RlCisgKiAyNTogbGhkIG1vZGUKKyAqIDI0OiBwaHkgbW9kZQorICogMjM6IHJlc2V0IHBlciBtaWkKKyAqIDIyLTE3OiByZXNlcnZlZAorICogMTY6IHNwZWVkCisgKiAxNTogcmVzZXQgcGUxMDB4CisgKiAxNC0xMTogcmVzZXJ2ZWQKKyAqIDEwOiBmb3JjZSBxdWlldAorICogOTogbm8gY2lwaGVyCisgKiA4OiBkaXNhYmxlIGxpbmsgZmFpbAorICogNzogcmVzZXQgZ3BzaQorICogNi0xOiByZXNlcnZlZAorICogMDogZW5hYmxlIGphYmJlciBwcm90ZWN0aW9uCiAgKi8KLXR5cGVkZWYgdW5pb24gX01BQ19JRl9DVFJMX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHJlc2V0X2lmX21vZHVsZToxOwkvKiBiaXQgMzEgKi8KLQkJdTMyIHJlc2VydmVkNDozOwkJLyogYml0IDI4LTMwICovCi0JCXUzMiB0YmlfbW9kZToxOwkJLyogYml0IDI3ICovCi0JCXUzMiBnaGRfbW9kZToxOwkJLyogYml0IDI2ICovCi0JCXUzMiBsaGRfbW9kZToxOwkJLyogYml0IDI1ICovCi0JCXUzMiBwaHlfbW9kZToxOwkJLyogYml0IDI0ICovCi0JCXUzMiByZXNldF9wZXJfbWlpOjE7CS8qIGJpdCAyMyAqLwotCQl1MzIgcmVzZXJ2ZWQzOjY7CQkvKiBiaXRzIDE3LTIyICovCi0JCXUzMiBzcGVlZDoxOwkJLyogYml0IDE2ICovCi0JCXUzMiByZXNldF9wZTEwMHg6MTsJLyogYml0IDE1ICovCi0JCXUzMiByZXNlcnZlZDI6NDsJCS8qIGJpdHMgMTEtMTQgKi8KLQkJdTMyIGZvcmNlX3F1aWV0OjE7CQkvKiBiaXQgMTAgKi8KLQkJdTMyIG5vX2NpcGhlcjoxOwkJLyogYml0IDkgKi8KLQkJdTMyIGRpc2FibGVfbGlua19mYWlsOjE7CS8qIGJpdCA4ICovCi0JCXUzMiByZXNldF9ncHNpOjE7CQkvKiBiaXQgNyAqLwotCQl1MzIgcmVzZXJ2ZWQxOjY7CQkvKiBiaXRzIDEtNiAqLwotCQl1MzIgZW5hYl9qYWJfcHJvdGVjdDoxOwkvKiBiaXQgMCAqLwotI2Vsc2UKLQkJdTMyIGVuYWJfamFiX3Byb3RlY3Q6MTsJLyogYml0IDAgKi8KLQkJdTMyIHJlc2VydmVkMTo2OwkJLyogYml0cyAxLTYgKi8KLQkJdTMyIHJlc2V0X2dwc2k6MTsJCS8qIGJpdCA3ICovCi0JCXUzMiBkaXNhYmxlX2xpbmtfZmFpbDoxOwkvKiBiaXQgOCAqLwotCQl1MzIgbm9fY2lwaGVyOjE7CQkvKiBiaXQgOSAqLwotCQl1MzIgZm9yY2VfcXVpZXQ6MTsJCS8qIGJpdCAxMCAqLwotCQl1MzIgcmVzZXJ2ZWQyOjQ7CQkvKiBiaXRzIDExLTE0ICovCi0JCXUzMiByZXNldF9wZTEwMHg6MTsJLyogYml0IDE1ICovCi0JCXUzMiBzcGVlZDoxOwkJLyogYml0IDE2ICovCi0JCXUzMiByZXNlcnZlZDM6NjsJCS8qIGJpdHMgMTctMjIgKi8KLQkJdTMyIHJlc2V0X3Blcl9taWk6MTsJLyogYml0IDIzICovCi0JCXUzMiBwaHlfbW9kZToxOwkJLyogYml0IDI0ICovCi0JCXUzMiBsaGRfbW9kZToxOwkJLyogYml0IDI1ICovCi0JCXUzMiBnaGRfbW9kZToxOwkJLyogYml0IDI2ICovCi0JCXUzMiB0YmlfbW9kZToxOwkJLyogYml0IDI3ICovCi0JCXUzMiByZXNlcnZlZDQ6MzsJCS8qIGJpdCAyOC0zMCAqLwotCQl1MzIgcmVzZXRfaWZfbW9kdWxlOjE7CS8qIGJpdCAzMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBNQUNfSUZfQ1RSTF90LCAqUE1BQ19JRl9DVFJMX3Q7CiAKIC8qCiAgKiBzdHJ1Y3R1cmUgZm9yIEludGVyZmFjZSBTdGF0dXMgcmVnIGluIG1hYyBhZGRyZXNzIG1hcC4KQEAgLTE3MjksMjEgKzE0MDUsMjEgQEAKICAqIE1BQyBNb2R1bGUgb2YgSkFHQ29yZSBBZGRyZXNzIE1hcHBpbmcKICAqLwogdHlwZWRlZiBzdHJ1Y3QgX01BQ190IHsJCQkJCS8qIExvY2F0aW9uOiAqLwotCU1BQ19DRkcxX3QgY2ZnMTsJCQkJLyogIDB4NTAwMCAqLwotCU1BQ19DRkcyX3QgY2ZnMjsJCQkJLyogIDB4NTAwNCAqLwotCU1BQ19JUEdfdCBpcGc7CQkJCQkvKiAgMHg1MDA4ICovCi0JTUFDX0hGRFBfdCBoZmRwOwkJCQkvKiAgMHg1MDBDICovCi0JTUFDX01BWF9GTV9MRU5fdCBtYXhfZm1fbGVuOwkJCS8qICAweDUwMTAgKi8KKwl1MzIgY2ZnMTsJCQkJCS8qICAweDUwMDAgKi8KKwl1MzIgY2ZnMjsJCQkJCS8qICAweDUwMDQgKi8KKwl1MzIgaXBnOwkJCQkJLyogIDB4NTAwOCAqLworCXUzMiBoZmRwOwkJCQkJLyogIDB4NTAwQyAqLworCXUzMiBtYXhfZm1fbGVuOwkJCQkJLyogIDB4NTAxMCAqLwogCXUzMiByc3YxOwkJCQkJLyogIDB4NTAxNCAqLwogCXUzMiByc3YyOwkJCQkJLyogIDB4NTAxOCAqLwotCU1BQ19URVNUX3QgbWFjX3Rlc3Q7CQkJCS8qICAweDUwMUMgKi8KLQlNSUlfTUdNVF9DRkdfdCBtaWlfbWdtdF9jZmc7CQkJLyogIDB4NTAyMCAqLwotCU1JSV9NR01UX0NNRF90IG1paV9tZ210X2NtZDsJCQkvKiAgMHg1MDI0ICovCi0JTUlJX01HTVRfQUREUl90IG1paV9tZ210X2FkZHI7CQkJLyogIDB4NTAyOCAqLwotCU1JSV9NR01UX0NUUkxfdCBtaWlfbWdtdF9jdHJsOwkJCS8qICAweDUwMkMgKi8KLQlNSUlfTUdNVF9TVEFUX3QgbWlpX21nbXRfc3RhdDsJCQkvKiAgMHg1MDMwICovCi0JTUlJX01HTVRfSU5ESUNBVE9SX3QgbWlpX21nbXRfaW5kaWNhdG9yOwkvKiAgMHg1MDM0ICovCi0JTUFDX0lGX0NUUkxfdCBpZl9jdHJsOwkJCQkvKiAgMHg1MDM4ICovCisJdTMyIG1hY190ZXN0OwkJCQkJLyogIDB4NTAxQyAqLworCXUzMiBtaWlfbWdtdF9jZmc7CQkJCS8qICAweDUwMjAgKi8KKwl1MzIgbWlpX21nbXRfY21kOwkJCQkvKiAgMHg1MDI0ICovCisJdTMyIG1paV9tZ210X2FkZHI7CQkJCS8qICAweDUwMjggKi8KKwl1MzIgbWlpX21nbXRfY3RybDsJCQkJLyogIDB4NTAyQyAqLworCXUzMiBtaWlfbWdtdF9zdGF0OwkJCQkvKiAgMHg1MDMwICovCisJdTMyIG1paV9tZ210X2luZGljYXRvcjsJCQkJLyogIDB4NTAzNCAqLworCXUzMiBpZl9jdHJsOwkJCQkJLyogIDB4NTAzOCAqLwogCU1BQ19JRl9TVEFUX3QgaWZfc3RhdDsJCQkJLyogIDB4NTAzQyAqLwogCU1BQ19TVEFUSU9OX0FERFIxX3Qgc3RhdGlvbl9hZGRyXzE7CQkvKiAgMHg1MDQwICovCiAJTUFDX1NUQVRJT05fQUREUjJfdCBzdGF0aW9uX2FkZHJfMjsJCS8qICAweDUwNDQgKi8KQEAgLTE3NTYsMTIwICsxNDMyLDYwIEBACiAvKgogICogc3RydWN0dXJlIGZvciBDYXJyeSBSZWdpc3RlciBPbmUgYW5kIGl0J3MgTWFzayBSZWdpc3RlciByZWcgbG9jYXRlZCBpbiBtYWMKICAqIHN0YXQgYWRkcmVzcyBtYXAgYWRkcmVzcyAweDYxMzAgYW5kIDB4NjEzOC4KKyAqCisgKiAzMTogdHI2NAorICogMzA6IHRyMTI3CisgKiAyOTogdHIyNTUKKyAqIDI4OiB0cjUxMQorICogMjc6IHRyMWsKKyAqIDI2OiB0cm1heAorICogMjU6IHRybWd2CisgKiAyNC0xNzogdW51c2VkCisgKiAxNjogcmJ5dAorICogMTU6IHJwa3QKKyAqIDE0OiByZmNzCisgKiAxMzogcm1jYQorICogMTI6IHJiY2EKKyAqIDExOiByeGNmCisgKiAxMDogcnhwZgorICogOTogcnh1bworICogODogcmFsbgorICogNzogcmZscgorICogNjogcmNkZQorICogNTogcmNzZQorICogNDogcnVuZAorICogMzogcm92cgorICogMjogcmZyZworICogMTogcmpicgorICogMDogcmRycAogICovCi10eXBlZGVmIHVuaW9uIF9NQUNfU1RBVF9SRUdfMV90IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiB0cjY0OjE7CS8qIGJpdCAzMSAqLwotCQl1MzIgdHIxMjc6MTsJLyogYml0IDMwICovCi0JCXUzMiB0cjI1NToxOwkvKiBiaXQgMjkgKi8KLQkJdTMyIHRyNTExOjE7CS8qIGJpdCAyOCAqLwotCQl1MzIgdHIxazoxOwkvKiBiaXQgMjcgKi8KLQkJdTMyIHRybWF4OjE7CS8qIGJpdCAyNiAqLwotCQl1MzIgdHJtZ3Y6MTsJLyogYml0IDI1ICovCi0JCXUzMiB1bnVzZWQ6ODsJLyogYml0cyAxNy0yNCAqLwotCQl1MzIgcmJ5dDoxOwkvKiBiaXQgMTYgKi8KLQkJdTMyIHJwa3Q6MTsJLyogYml0IDE1ICovCi0JCXUzMiByZmNzOjE7CS8qIGJpdCAxNCAqLwotCQl1MzIgcm1jYToxOwkvKiBiaXQgMTMgKi8KLQkJdTMyIHJiY2E6MTsJLyogYml0IDEyICovCi0JCXUzMiByeGNmOjE7CS8qIGJpdCAxMSAqLwotCQl1MzIgcnhwZjoxOwkvKiBiaXQgMTAgKi8KLQkJdTMyIHJ4dW86MTsJLyogYml0IDkgKi8KLQkJdTMyIHJhbG46MTsJLyogYml0IDggKi8KLQkJdTMyIHJmbHI6MTsJLyogYml0IDcgKi8KLQkJdTMyIHJjZGU6MTsJLyogYml0IDYgKi8KLQkJdTMyIHJjc2U6MTsJLyogYml0IDUgKi8KLQkJdTMyIHJ1bmQ6MTsJLyogYml0IDQgKi8KLQkJdTMyIHJvdnI6MTsJLyogYml0IDMgKi8KLQkJdTMyIHJmcmc6MTsJLyogYml0IDIgKi8KLQkJdTMyIHJqYnI6MTsJLyogYml0IDEgKi8KLQkJdTMyIHJkcnA6MTsJLyogYml0IDAgKi8KLSNlbHNlCi0JCXUzMiByZHJwOjE7CS8qIGJpdCAwICovCi0JCXUzMiByamJyOjE7CS8qIGJpdCAxICovCi0JCXUzMiByZnJnOjE7CS8qIGJpdCAyICovCi0JCXUzMiByb3ZyOjE7CS8qIGJpdCAzICovCi0JCXUzMiBydW5kOjE7CS8qIGJpdCA0ICovCi0JCXUzMiByY3NlOjE7CS8qIGJpdCA1ICovCi0JCXUzMiByY2RlOjE7CS8qIGJpdCA2ICovCi0JCXUzMiByZmxyOjE7CS8qIGJpdCA3ICovCi0JCXUzMiByYWxuOjE7CS8qIGJpdCA4ICovCi0JCXUzMiByeHVvOjE7CS8qIGJpdCA5ICovCi0JCXUzMiByeHBmOjE7CS8qIGJpdCAxMCAqLwotCQl1MzIgcnhjZjoxOwkvKiBiaXQgMTEgKi8KLQkJdTMyIHJiY2E6MTsJLyogYml0IDEyICovCi0JCXUzMiBybWNhOjE7CS8qIGJpdCAxMyAqLwotCQl1MzIgcmZjczoxOwkvKiBiaXQgMTQgKi8KLQkJdTMyIHJwa3Q6MTsJLyogYml0IDE1ICovCi0JCXUzMiByYnl0OjE7CS8qIGJpdCAxNiAqLwotCQl1MzIgdW51c2VkOjg7CS8qIGJpdHMgMTctMjQgKi8KLQkJdTMyIHRybWd2OjE7CS8qIGJpdCAyNSAqLwotCQl1MzIgdHJtYXg6MTsJLyogYml0IDI2ICovCi0JCXUzMiB0cjFrOjE7CS8qIGJpdCAyNyAqLwotCQl1MzIgdHI1MTE6MTsJLyogYml0IDI4ICovCi0JCXUzMiB0cjI1NToxOwkvKiBiaXQgMjkgKi8KLQkJdTMyIHRyMTI3OjE7CS8qIGJpdCAzMCAqLwotCQl1MzIgdHI2NDoxOwkvKiBiaXQgMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gTUFDX1NUQVRfUkVHXzFfdCwgKlBNQUNfU1RBVF9SRUdfMV90OwogCiAvKgogICogc3RydWN0dXJlIGZvciBDYXJyeSBSZWdpc3RlciBUd28gTWFzayBSZWdpc3RlciByZWcgaW4gbWFjIHN0YXQgYWRkcmVzcyBtYXAuCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg2MTNDCisgKgorICogMzEtMjA6IHVudXNlZAorICogMTk6IHRqYnIKKyAqIDE4OiB0ZmNzCisgKiAxNzogdHhjZgorICogMTY6IHRvdnIKKyAqIDE1OiB0dW5kCisgKiAxNDogdHJmZworICogMTM6IHRieXQKKyAqIDEyOiB0cGt0CisgKiAxMTogdG1jYQorICogMTA6IHRiY2EKKyAqIDk6IHR4cGYKKyAqIDg6IHRkZnIKKyAqIDc6IHRlZGYKKyAqIDY6IHRzY2wKKyAqIDU6IHRtY2wKKyAqIDQ6IHRsY2wKKyAqIDM6IHR4Y2wKKyAqIDI6IHRuY2wKKyAqIDE6IHRwZmgKKyAqIDA6IHRkcnAKICAqLwotdHlwZWRlZiB1bmlvbiBfTUFDX1NUQVRfUkVHXzJfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgdW51c2VkOjEyOwkvKiBiaXQgMjAtMzEgKi8KLQkJdTMyIHRqYnI6MTsJLyogYml0IDE5ICovCi0JCXUzMiB0ZmNzOjE7CS8qIGJpdCAxOCAqLwotCQl1MzIgdHhjZjoxOwkvKiBiaXQgMTcgKi8KLQkJdTMyIHRvdnI6MTsJLyogYml0IDE2ICovCi0JCXUzMiB0dW5kOjE7CS8qIGJpdCAxNSAqLwotCQl1MzIgdGZyZzoxOwkvKiBiaXQgMTQgKi8KLQkJdTMyIHRieXQ6MTsJLyogYml0IDEzICovCi0JCXUzMiB0cGt0OjE7CS8qIGJpdCAxMiAqLwotCQl1MzIgdG1jYToxOwkvKiBiaXQgMTEgKi8KLQkJdTMyIHRiY2E6MTsJLyogYml0IDEwICovCi0JCXUzMiB0eHBmOjE7CS8qIGJpdCA5ICovCi0JCXUzMiB0ZGZyOjE7CS8qIGJpdCA4ICovCi0JCXUzMiB0ZWRmOjE7CS8qIGJpdCA3ICovCi0JCXUzMiB0c2NsOjE7CS8qIGJpdCA2ICovCi0JCXUzMiB0bWNsOjE7CS8qIGJpdCA1ICovCi0JCXUzMiB0bGNsOjE7CS8qIGJpdCA0ICovCi0JCXUzMiB0eGNsOjE7CS8qIGJpdCAzICovCi0JCXUzMiB0bmNsOjE7CS8qIGJpdCAyICovCi0JCXUzMiB0cGZoOjE7CS8qIGJpdCAxICovCi0JCXUzMiB0ZHJwOjE7CS8qIGJpdCAwICovCi0jZWxzZQotCQl1MzIgdGRycDoxOwkvKiBiaXQgMCAqLwotCQl1MzIgdHBmaDoxOwkvKiBiaXQgMSAqLwotCQl1MzIgdG5jbDoxOwkvKiBiaXQgMiAqLwotCQl1MzIgdHhjbDoxOwkvKiBiaXQgMyAqLwotCQl1MzIgdGxjbDoxOwkvKiBiaXQgNCAqLwotCQl1MzIgdG1jbDoxOwkvKiBiaXQgNSAqLwotCQl1MzIgdHNjbDoxOwkvKiBiaXQgNiAqLwotCQl1MzIgdGVkZjoxOwkvKiBiaXQgNyAqLwotCQl1MzIgdGRmcjoxOwkvKiBiaXQgOCAqLwotCQl1MzIgdHhwZjoxOwkvKiBiaXQgOSAqLwotCQl1MzIgdGJjYToxOwkvKiBiaXQgMTAgKi8KLQkJdTMyIHRtY2E6MTsJLyogYml0IDExICovCi0JCXUzMiB0cGt0OjE7CS8qIGJpdCAxMiAqLwotCQl1MzIgdGJ5dDoxOwkvKiBiaXQgMTMgKi8KLQkJdTMyIHRmcmc6MTsJLyogYml0IDE0ICovCi0JCXUzMiB0dW5kOjE7CS8qIGJpdCAxNSAqLwotCQl1MzIgdG92cjoxOwkvKiBiaXQgMTYgKi8KLQkJdTMyIHR4Y2Y6MTsJLyogYml0IDE3ICovCi0JCXUzMiB0ZmNzOjE7CS8qIGJpdCAxOCAqLwotCQl1MzIgdGpicjoxOwkvKiBiaXQgMTkgKi8KLQkJdTMyIHVudXNlZDoxMjsJLyogYml0IDIwLTMxICovCi0jZW5kaWYKLQl9IGJpdHM7Ci19IE1BQ19TVEFUX1JFR18yX3QsICpQTUFDX1NUQVRfUkVHXzJfdDsKIAogLyoKICAqIE1BQyBTVEFUUyBNb2R1bGUgb2YgSkFHQ29yZSBBZGRyZXNzIE1hcHBpbmcKQEAgLTIwMTAsMTYgKzE2MjYsMTYgQEAKIAl1MzIgVEZyZzsJCQkvKiAgMHg2MTJDICovCiAKIAkvKiBDYXJyeSBSZWdpc3RlciBPbmUgUmVnaXN0ZXIgKi8KLQlNQUNfU1RBVF9SRUdfMV90IENhcnJ5MTsJLyogIDB4NjEzMCAqLworCXUzMiBDYXJyeTE7CQkJLyogIDB4NjEzMCAqLwogCiAJLyogQ2FycnkgUmVnaXN0ZXIgVHdvIFJlZ2lzdGVyICovCi0JTUFDX1NUQVRfUkVHXzJfdCBDYXJyeTI7CS8qICAweDYxMzQgKi8KKwl1MzIgQ2FycnkyOwkJCS8qICAweDYxMzQgKi8KIAogCS8qIENhcnJ5IFJlZ2lzdGVyIE9uZSBNYXNrIFJlZ2lzdGVyICovCi0JTUFDX1NUQVRfUkVHXzFfdCBDYXJyeTFNOwkvKiAgMHg2MTM4ICovCisJdTMyIENhcnJ5MU07CQkJLyogIDB4NjEzOCAqLwogCiAJLyogQ2FycnkgUmVnaXN0ZXIgVHdvIE1hc2sgUmVnaXN0ZXIgKi8KLQlNQUNfU1RBVF9SRUdfMl90IENhcnJ5Mk07CS8qICAweDYxM0MgKi8KKwl1MzIgQ2FycnkyTTsJCQkvKiAgMHg2MTNDICovCiB9IE1BQ19TVEFUX3QsICpQTUFDX1NUQVRfdDsKIAogLyogRU5EIE9GIE1BQyBTVEFUIFJFR0lTVEVSIEFERFJFU1MgTUFQICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9lZXByb20uYyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX2VlcHJvbS5jCmluZGV4IGM4NTNhMmMuLmJjY2ExZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX2VlcHJvbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX2VlcHJvbS5jCkBAIC05NSwxOTggKzk1LDEyMCBAQAogI2luY2x1ZGUgImV0MTMxMF90eC5oIgogCiAKLS8qCi0gKiBFRVBST00gRGVmaW5lcwotICovCiAKLS8qIExCQ0lGIFJlZ2lzdGVyIEdyb3VwcyAoYWRkcmVzc2VkIHZpYSAzMi1iaXQgb2Zmc2V0cykgKi8KLSNkZWZpbmUgTEJDSUZfRFdPUkQwX0dST1VQX09GRlNFVCAgICAgICAweEFDCi0jZGVmaW5lIExCQ0lGX0RXT1JEMV9HUk9VUF9PRkZTRVQgICAgICAgMHhCMAorc3RhdGljIGludCBlZXByb21fd2FpdF9yZWFkeShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTMyICpzdGF0dXMpCit7CisJdTMyIHJlZzsKKwlpbnQgaTsKIAotLyogTEJDSUYgUmVnaXN0ZXJzIChhZGRyZXNzZWQgdmlhIDgtYml0IG9mZnNldHMpICovCi0jZGVmaW5lIExCQ0lGX0FERFJFU1NfUkVHSVNURVJfT0ZGU0VUICAgMHhBQwotI2RlZmluZSBMQkNJRl9EQVRBX1JFR0lTVEVSX09GRlNFVCAgICAgIDB4QjAKLSNkZWZpbmUgTEJDSUZfQ09OVFJPTF9SRUdJU1RFUl9PRkZTRVQgICAweEIxCi0jZGVmaW5lIExCQ0lGX1NUQVRVU19SRUdJU1RFUl9PRkZTRVQgICAgMHhCMgorCS8qCisJICogMS4gQ2hlY2sgTEJDSUYgU3RhdHVzIFJlZ2lzdGVyIGZvciBiaXRzIDYgJiAzOjIgYWxsIGVxdWFsIHRvIDAgYW5kCisJICogICAgYml0cyA3LDE6MCBib3RoIGVxdWFsIHRvIDEsIGF0IGxlYXN0IG9uY2UgYWZ0ZXIgcmVzZXQuCisJICogICAgU3Vic2VxdWVudCBvcGVyYXRpb25zIG5lZWQgb25seSB0byBjaGVjayB0aGF0IGJpdHMgMTowIGFyZSBlcXVhbAorCSAqICAgIHRvIDEgcHJpb3IgdG8gc3RhcnRpbmcgYSBzaW5nbGUgYnl0ZSByZWFkL3dyaXRlCisJICovCiAKLS8qIExCQ0lGIENvbnRyb2wgUmVnaXN0ZXIgQml0cyAqLwotI2RlZmluZSBMQkNJRl9DT05UUk9MX1NFUVVFTlRJQUxfUkVBRCAgIDB4MDEKLSNkZWZpbmUgTEJDSUZfQ09OVFJPTF9QQUdFX1dSSVRFICAgICAgICAweDAyCi0jZGVmaW5lIExCQ0lGX0NPTlRST0xfVU5VU0VEMSAgICAgICAgICAgMHgwNAotI2RlZmluZSBMQkNJRl9DT05UUk9MX0VFUFJPTV9SRUxPQUQgICAgIDB4MDgKLSNkZWZpbmUgTEJDSUZfQ09OVFJPTF9VTlVTRUQyICAgICAgICAgICAweDEwCi0jZGVmaW5lIExCQ0lGX0NPTlRST0xfVFdPX0JZVEVfQUREUiAgICAgMHgyMAotI2RlZmluZSBMQkNJRl9DT05UUk9MX0kyQ19XUklURSAgICAgICAgIDB4NDAKLSNkZWZpbmUgTEJDSUZfQ09OVFJPTF9MQkNJRl9FTkFCTEUgICAgICAweDgwCisJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fUkVHSVNURVJfUE9MTFM7IGkrKykgeworCQkvKiBSZWFkIHJlZ2lzdGVycyBncm91cGVkIGluIERXT1JEMSAqLworCQlpZiAocGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIExCQ0lGX0RXT1JEMV9HUk9VUCwgJnJlZykpCisJCQlyZXR1cm4gLUVJTzsKIAotLyogTEJDSUYgU3RhdHVzIFJlZ2lzdGVyIEJpdHMgKi8KLSNkZWZpbmUgTEJDSUZfU1RBVFVTX1BIWV9RVUVVRV9BVkFJTCAgICAweDAxCi0jZGVmaW5lIExCQ0lGX1NUQVRVU19JMkNfSURMRSAgICAgICAgICAgMHgwMgotI2RlZmluZSBMQkNJRl9TVEFUVVNfQUNLX0VSUk9SICAgICAgICAgIDB4MDQKLSNkZWZpbmUgTEJDSUZfU1RBVFVTX0dFTkVSQUxfRVJST1IgICAgICAweDA4Ci0jZGVmaW5lIExCQ0lGX1NUQVRVU19VTlVTRUQgICAgICAgICAgICAgMHgzMAotI2RlZmluZSBMQkNJRl9TVEFUVVNfQ0hFQ0tTVU1fRVJST1IgICAgIDB4NDAKLSNkZWZpbmUgTEJDSUZfU1RBVFVTX0VFUFJPTV9QUkVTRU5UICAgICAweDgwCisJCS8qIEkyQyBpZGxlIGFuZCBQaHkgUXVldWUgQXZhaWwgYm90aCB0cnVlICovCisJCWlmICgocmVnICYgMHgzMDAwKSA9PSAweDMwMDApIHsKKwkJCWlmIChzdGF0dXMpCisJCQkJKnN0YXR1cyA9IHJlZzsKKwkJCXJldHVybiByZWcgJiAweEZGOworCQl9CisJfQorCXJldHVybiAtRVRJTUVET1VUOworfQogCi0vKiBNaXNjZWxsYW5lb3VzIENvbnN0cmFpbnRzICovCi0jZGVmaW5lIE1BWF9OVU1fUkVHSVNURVJfUE9MTFMgICAgICAgICAgMTAwMAotI2RlZmluZSBNQVhfTlVNX1dSSVRFX1JFVFJJRVMgICAgICAgICAgIDIKLQotLyoKLSAqIERlZmluZSBtYWNyb3MgdGhhdCBhbGxvdyBpbmRpdmlkdWFsIHJlZ2lzdGVyIHZhbHVlcyB0byBiZSBleHRyYWN0ZWQgZnJvbSBhCi0gKiBEV09SRDEgcmVnaXN0ZXIgZ3JvdXBpbmcKLSAqLwotI2RlZmluZSBFWFRSQUNUX0RBVEFfUkVHSVNURVIoeCkgICAgKHU4KSh4ICYgMHhGRikKLSNkZWZpbmUgRVhUUkFDVF9TVEFUVVNfUkVHSVNURVIoeCkgICh1OCkoKHggPj4gMTYpICYgMHhGRikKLSNkZWZpbmUgRVhUUkFDVF9DT05UUk9MX1JFRyh4KSAgICAgICh1OCkoKHggPj4gOCkgJiAweEZGKQogCiAvKioKLSAqIEVlcHJvbVdyaXRlQnl0ZSAtIFdyaXRlIGEgYnl0ZSB0byB0aGUgRVQxMzEwJ3MgRUVQUk9NCisgKiBlZXByb21fd3JpdGUgLSBXcml0ZSBhIGJ5dGUgdG8gdGhlIEVUMTMxMCdzIEVFUFJPTQogICogQGV0ZGV2OiBwb2ludGVyIHRvIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAgKiBAYWRkcjogdGhlIGFkZHJlc3MgdG8gd3JpdGUKICAqIEBkYXRhOiB0aGUgdmFsdWUgdG8gd3JpdGUKICAqCi0gKiBSZXR1cm5zIFNVQ0NFU1Mgb3IgRkFJTFVSRQorICogUmV0dXJucyAxIGZvciBhIHN1Y2Nlc3NmdWwgd3JpdGUuCiAgKi8KLWludCBFZXByb21Xcml0ZUJ5dGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwgdTMyIGFkZHIsIHU4IGRhdGEpCitzdGF0aWMgaW50IGVlcHJvbV93cml0ZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LCB1MzIgYWRkciwgdTggZGF0YSkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGV0ZGV2LT5wZGV2OwotCWludCBpbmRleDsKKwlpbnQgaW5kZXggPSAwOwogCWludCByZXRyaWVzOwogCWludCBlcnIgPSAwOwogCWludCBpMmNfd2FjayA9IDA7CiAJaW50IHdyaXRlb2sgPSAwOwotCXU4IGNvbnRyb2w7Ci0JdTggc3RhdHVzID0gMDsKLQl1MzIgZHdvcmQxID0gMDsKKwl1MzIgc3RhdHVzOwogCXUzMiB2YWwgPSAwOwogCiAJLyoKLQkgKiBUaGUgZm9sbG93aW5nIGV4Y2VycHQgaXMgZnJvbSAiU2VyaWFsIEVFUFJPTSBIVyBEZXNpZ24KLQkgKiBTcGVjaWZpY2F0aW9uIiBWZXJzaW9uIDAuOTIgKDkvMjAvMjAwNCk6Ci0JICoKLQkgKiBTaW5nbGUgQnl0ZSBXcml0ZXMKLQkgKgogCSAqIEZvciBhbiBFRVBST00sIGFuIEkyQyBzaW5nbGUgYnl0ZSB3cml0ZSBpcyBkZWZpbmVkIGFzIGEgU1RBUlQKIAkgKiBjb25kaXRpb24gZm9sbG93ZWQgYnkgdGhlIGRldmljZSBhZGRyZXNzLCBFRVBST00gYWRkcmVzcywgb25lIGJ5dGUKIAkgKiBvZiBkYXRhIGFuZCBhIFNUT1AgY29uZGl0aW9uLiAgVGhlIFNUT1AgY29uZGl0aW9uIHdpbGwgdHJpZ2dlciB0aGUKIAkgKiBFRVBST00ncyBpbnRlcm5hbGx5IHRpbWVkIHdyaXRlIGN5Y2xlIHRvIHRoZSBub252b2xhdGlsZSBtZW1vcnkuCiAJICogQWxsIGlucHV0cyBhcmUgZGlzYWJsZWQgZHVyaW5nIHRoaXMgd3JpdGUgY3ljbGUgYW5kIHRoZSBFRVBST00gd2lsbAogCSAqIG5vdCByZXNwb25kIHRvIGFueSBhY2Nlc3MgdW50aWwgdGhlIGludGVybmFsIHdyaXRlIGlzIGNvbXBsZXRlLgotCSAqIFRoZSBzdGVwcyB0byBleGVjdXRlIGEgc2luZ2xlIGJ5dGUgd3JpdGUgYXJlIGFzIGZvbGxvd3M6Ci0JICoKLQkgKiAxLiBDaGVjayBMQkNJRiBTdGF0dXMgUmVnaXN0ZXIgZm9yIGJpdHMgNiAmIDM6MiBhbGwgZXF1YWwgdG8gMCBhbmQKLQkgKiAgICBiaXRzIDcsMTowIGJvdGggZXF1YWwgdG8gMSwgYXQgbGVhc3Qgb25jZSBhZnRlciByZXNldC4KLQkgKiAgICBTdWJzZXF1ZW50IG9wZXJhdGlvbnMgbmVlZCBvbmx5IHRvIGNoZWNrIHRoYXQgYml0cyAxOjAgYXJlCi0JICogICAgZXF1YWwgdG8gMSBwcmlvciB0byBzdGFydGluZyBhIHNpbmdsZSBieXRlIHdyaXRlLgotCSAqCisJICovCisKKwllcnIgPSBlZXByb21fd2FpdF9yZWFkeShwZGV2LCBOVUxMKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJIC8qCiAJICogMi4gV3JpdGUgdG8gdGhlIExCQ0lGIENvbnRyb2wgUmVnaXN0ZXI6ICBiaXQgNz0xLCBiaXQgNj0xLCBiaXQgMz0wLAogCSAqICAgIGFuZCBiaXRzIDE6MCBib3RoID0wLiAgQml0IDUgc2hvdWxkIGJlIHNldCBhY2NvcmRpbmcgdG8gdGhlCiAJICogICAgdHlwZSBvZiBFRVBST00gYmVpbmcgYWNjZXNzZWQgKDE9dHdvIGJ5dGUgYWRkcmVzc2luZywgMD1vbmUKIAkgKiAgICBieXRlIGFkZHJlc3NpbmcpLgotCSAqCi0JICogMy4gV3JpdGUgdGhlIGFkZHJlc3MgdG8gdGhlIExCQ0lGIEFkZHJlc3MgUmVnaXN0ZXIuCi0JICoKLQkgKiA0LiBXcml0ZSB0aGUgZGF0YSB0byB0aGUgTEJDSUYgRGF0YSBSZWdpc3RlciAodGhlIEkyQyB3cml0ZSB3aWxsCi0JICogICAgYmVnaW4pLgotCSAqCi0JICogNS4gTW9uaXRvciBiaXQgMTowIG9mIHRoZSBMQkNJRiBTdGF0dXMgUmVnaXN0ZXIuICBXaGVuIGJpdHMgMTowIGFyZQotCSAqICAgIGJvdGggZXF1YWwgdG8gMSwgdGhlIEkyQyB3cml0ZSBoYXMgY29tcGxldGVkIGFuZCB0aGUgaW50ZXJuYWwKLQkgKiAgICB3cml0ZSBjeWNsZSBvZiB0aGUgRUVQUk9NIGlzIGFib3V0IHRvIHN0YXJ0LiAoYml0cyAxOjAgPSAwMSBpcwotCSAqICAgIGEgbGVnYWwgc3RhdGUgd2hpbGUgd2FpdGluZyBmcm9tIGJvdGggZXF1YWwgdG8gMSwgYnV0IGJpdHMKLQkgKiAgICAxOjAgPSAxMCBpcyBpbnZhbGlkIGFuZCBpbXBsaWVzIHRoYXQgc29tZXRoaW5nIGlzIGJyb2tlbikuCi0JICoKLQkgKiA2LiBDaGVjayBiaXQgMyBvZiB0aGUgTEJDSUYgU3RhdHVzIFJlZ2lzdGVyLiAgSWYgIGVxdWFsIHRvIDEsIGFuCi0JICogICAgZXJyb3IgaGFzIG9jY3VycmVkLgotCSAqCi0JICogNy4gQ2hlY2sgYml0IDIgb2YgdGhlIExCQ0lGIFN0YXR1cyBSZWdpc3Rlci4gIElmIGVxdWFsIHRvIDEgYW4gQUNLCi0JICogICAgZXJyb3IgaGFzIG9jY3VycmVkIG9uIHRoZSBhZGRyZXNzIHBoYXNlIG9mIHRoZSB3cml0ZS4gIFRoaXMKLQkgKiAgICBjb3VsZCBiZSBkdWUgdG8gYW4gYWN0dWFsIGhhcmR3YXJlIGZhaWx1cmUgb3IgdGhlIEVFUFJPTSBtYXkKLQkgKiAgICBzdGlsbCBiZSBpbiBpdHMgaW50ZXJuYWwgd3JpdGUgY3ljbGUgZnJvbSBhIHByZXZpb3VzIHdyaXRlLgotCSAqICAgIFRoaXMgd3JpdGUgb3BlcmF0aW9uIHdhcyBpZ25vcmVkIGFuZCBtdXN0IGJlIHJlcGVhdGVkIGxhdGVyLgotCSAqCi0JICogOC4gU2V0IGJpdCA2IG9mIHRoZSBMQkNJRiBDb250cm9sIFJlZ2lzdGVyID0gMC4gSWYgYW5vdGhlciB3cml0ZSBpcwotCSAqICAgIHJlcXVpcmVkLCBnbyB0byBzdGVwIDEuCiAJICovCi0KLQkvKiBTdGVwIDE6ICovCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUFYX05VTV9SRUdJU1RFUl9QT0xMUzsgaW5kZXgrKykgewotCQkvKiBSZWFkIHJlZ2lzdGVycyBncm91cGVkIGluIERXT1JEMSAqLwotCQlpZiAocGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIExCQ0lGX0RXT1JEMV9HUk9VUF9PRkZTRVQsCi0JCQkJCSAgJmR3b3JkMSkpIHsKLQkJCWVyciA9IDE7Ci0JCQlicmVhazsKLQkJfQotCi0JCXN0YXR1cyA9IEVYVFJBQ1RfU1RBVFVTX1JFR0lTVEVSKGR3b3JkMSk7Ci0KLQkJaWYgKHN0YXR1cyAmIExCQ0lGX1NUQVRVU19QSFlfUVVFVUVfQVZBSUwgJiYKLQkJCXN0YXR1cyAmIExCQ0lGX1NUQVRVU19JMkNfSURMRSkKLQkJCS8qIGJpdHMgMTowIGFyZSBlcXVhbCB0byAxICovCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoZXJyIHx8IChpbmRleCA+PSBNQVhfTlVNX1JFR0lTVEVSX1BPTExTKSkKLQkJcmV0dXJuIEZBSUxVUkU7Ci0KLQkvKiBTdGVwIDI6ICovCi0JY29udHJvbCA9IDA7Ci0JY29udHJvbCB8PSBMQkNJRl9DT05UUk9MX0xCQ0lGX0VOQUJMRSB8IExCQ0lGX0NPTlRST0xfSTJDX1dSSVRFOwotCi0JaWYgKHBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBMQkNJRl9DT05UUk9MX1JFR0lTVEVSX09GRlNFVCwKLQkJCQkgIGNvbnRyb2wpKSB7Ci0JCXJldHVybiBGQUlMVVJFOwotCX0KKwlpZiAocGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIExCQ0lGX0NPTlRST0xfUkVHSVNURVIsCisJCQlMQkNJRl9DT05UUk9MX0xCQ0lGX0VOQUJMRSB8IExCQ0lGX0NPTlRST0xfSTJDX1dSSVRFKSkKKwkJcmV0dXJuIC1FSU87CiAKIAlpMmNfd2FjayA9IDE7CiAKIAkvKiBQcmVwYXJlIEVFUFJPTSBhZGRyZXNzIGZvciBTdGVwIDMgKi8KIAogCWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCBNQVhfTlVNX1dSSVRFX1JFVFJJRVM7IHJldHJpZXMrKykgewotCQkvKiBTdGVwIDM6Ki8KLQkJaWYgKHBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgTEJDSUZfQUREUkVTU19SRUdJU1RFUl9PRkZTRVQsCi0JCQkJCSAgIGFkZHIpKSB7CisJCS8qIFdyaXRlIHRoZSBhZGRyZXNzIHRvIHRoZSBMQkNJRiBBZGRyZXNzIFJlZ2lzdGVyICovCisJCWlmIChwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIExCQ0lGX0FERFJFU1NfUkVHSVNURVIsIGFkZHIpKQogCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBTdGVwIDQ6ICovCi0JCWlmIChwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgTEJDSUZfREFUQV9SRUdJU1RFUl9PRkZTRVQsCi0JCQkJCSAgZGF0YSkpIHsKKwkJLyoKKwkJICogV3JpdGUgdGhlIGRhdGEgdG8gdGhlIExCQ0lGIERhdGEgUmVnaXN0ZXIgKHRoZSBJMkMgd3JpdGUKKwkJICogd2lsbCBiZWdpbikuCisJCSAqLworCQlpZiAocGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIExCQ0lGX0RBVEFfUkVHSVNURVIsIGRhdGEpKQogCQkJYnJlYWs7Ci0JCX0KKwkJLyoKKwkJICogTW9uaXRvciBiaXQgMTowIG9mIHRoZSBMQkNJRiBTdGF0dXMgUmVnaXN0ZXIuICBXaGVuIGJpdHMKKwkJICogMTowIGFyZSBib3RoIGVxdWFsIHRvIDEsIHRoZSBJMkMgd3JpdGUgaGFzIGNvbXBsZXRlZCBhbmQgdGhlCisJCSAqIGludGVybmFsIHdyaXRlIGN5Y2xlIG9mIHRoZSBFRVBST00gaXMgYWJvdXQgdG8gc3RhcnQuCisJCSAqIChiaXRzIDE6MCA9IDAxIGlzIGEgbGVnYWwgc3RhdGUgd2hpbGUgd2FpdGluZyBmcm9tIGJvdGgKKwkJICogZXF1YWwgdG8gMSwgYnV0IGJpdHMgMTowID0gMTAgaXMgaW52YWxpZCBhbmQgaW1wbGllcyB0aGF0CisJCSAqIHNvbWV0aGluZyBpcyBicm9rZW4pLgorCQkgKi8KKwkJZXJyID0gZWVwcm9tX3dhaXRfcmVhZHkocGRldiwgJnN0YXR1cyk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIDA7CiAKLQkJLyogU3RlcCA1OiAqLwotCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNQVhfTlVNX1JFR0lTVEVSX1BPTExTOyBpbmRleCsrKSB7Ci0JCQkvKiBSZWFkIHJlZ2lzdGVycyBncm91cGVkIGluIERXT1JEMSAqLwotCQkJaWYgKHBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LAotCQkJCQkJICBMQkNJRl9EV09SRDFfR1JPVVBfT0ZGU0VULAotCQkJCQkJICAmZHdvcmQxKSkgewotCQkJCWVyciA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCXN0YXR1cyA9IEVYVFJBQ1RfU1RBVFVTX1JFR0lTVEVSKGR3b3JkMSk7Ci0KLQkJCWlmIChzdGF0dXMgJiBMQkNJRl9TVEFUVVNfUEhZX1FVRVVFX0FWQUlMICYmCi0JCQkJc3RhdHVzICYgTEJDSUZfU1RBVFVTX0kyQ19JRExFKSB7Ci0JCQkJLyogSTJDIHdyaXRlIGNvbXBsZXRlICovCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZXJyIHx8IChpbmRleCA+PSBNQVhfTlVNX1JFR0lTVEVSX1BPTExTKSkKKwkJLyoKKwkJICogQ2hlY2sgYml0IDMgb2YgdGhlIExCQ0lGIFN0YXR1cyBSZWdpc3Rlci4gIElmICBlcXVhbCB0byAxLAorCQkgKiBhbiBlcnJvciBoYXMgb2NjdXJyZWQuRG9uJ3QgYnJlYWsgaGVyZSBpZiB3ZSBhcmUgcmV2aXNpb24KKwkJICogMSwgdGhpcyBpcyBzbyB3ZSBkbyBhIGJsaW5kIHdyaXRlIGZvciBsb2FkIGJ1Zy4KKwkJICovCisJCWlmICgoc3RhdHVzICYgTEJDSUZfU1RBVFVTX0dFTkVSQUxfRVJST1IpCisJCQkmJiBldGRldi0+cGRldi0+cmV2aXNpb24gPT0gMCkKIAkJCWJyZWFrOwogCiAJCS8qCi0JCSAqIFN0ZXAgNjogRG9uJ3QgYnJlYWsgaGVyZSBpZiB3ZSBhcmUgcmV2aXNpb24gMSwgdGhpcyBpcwotCQkgKgkgICBzbyB3ZSBkbyBhIGJsaW5kIHdyaXRlIGZvciBsb2FkIGJ1Zy4KKwkJICogQ2hlY2sgYml0IDIgb2YgdGhlIExCQ0lGIFN0YXR1cyBSZWdpc3Rlci4gIElmIGVxdWFsIHRvIDEgYW4KKwkJICogQUNLIGVycm9yIGhhcyBvY2N1cnJlZCBvbiB0aGUgYWRkcmVzcyBwaGFzZSBvZiB0aGUgd3JpdGUuCisJCSAqIFRoaXMgY291bGQgYmUgZHVlIHRvIGFuIGFjdHVhbCBoYXJkd2FyZSBmYWlsdXJlIG9yIHRoZQorCQkgKiBFRVBST00gbWF5IHN0aWxsIGJlIGluIGl0cyBpbnRlcm5hbCB3cml0ZSBjeWNsZSBmcm9tIGEKKwkJICogcHJldmlvdXMgd3JpdGUuIFRoaXMgd3JpdGUgb3BlcmF0aW9uIHdhcyBpZ25vcmVkIGFuZCBtdXN0IGJlCisJCSAgKnJlcGVhdGVkIGxhdGVyLgogCQkgKi8KLQkJaWYgKHN0YXR1cyAmIExCQ0lGX1NUQVRVU19HRU5FUkFMX0VSUk9SCi0JCSAgICAmJiBldGRldi0+cGRldi0+cmV2aXNpb24gPT0gMCkgewotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBTdGVwIDcgKi8KIAkJaWYgKHN0YXR1cyAmIExCQ0lGX1NUQVRVU19BQ0tfRVJST1IpIHsKIAkJCS8qCiAJCQkgKiBUaGlzIGNvdWxkIGJlIGR1ZSB0byBhbiBhY3R1YWwgaGFyZHdhcmUgZmFpbHVyZQpAQCAtMzAyLDE1NCArMjI0LDE2MCBAQAogCQlicmVhazsKIAl9CiAKLQkvKiBTdGVwIDg6ICovCisJLyoKKwkgKiBTZXQgYml0IDYgb2YgdGhlIExCQ0lGIENvbnRyb2wgUmVnaXN0ZXIgPSAwLgorCSAqLwogCXVkZWxheSgxMCk7Ci0JaW5kZXggPSAwOwotCXdoaWxlIChpMmNfd2FjaykgewotCQljb250cm9sICY9IH5MQkNJRl9DT05UUk9MX0kyQ19XUklURTsKIAotCQlpZiAocGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIExCQ0lGX0NPTlRST0xfUkVHSVNURVJfT0ZGU0VULAotCQkJCQkgIGNvbnRyb2wpKSB7CisJd2hpbGUgKGkyY193YWNrKSB7CisJCWlmIChwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgTEJDSUZfQ09OVFJPTF9SRUdJU1RFUiwKKwkJCUxCQ0lGX0NPTlRST0xfTEJDSUZfRU5BQkxFKSkKIAkJCXdyaXRlb2sgPSAwOwotCQl9CiAKIAkJLyogRG8gcmVhZCB1bnRpbCBpbnRlcm5hbCBBQ0tfRVJST1IgZ29lcyBhd2F5IG1lYW5pbmcgd3JpdGUKIAkJICogY29tcGxldGVkCiAJCSAqLwogCQlkbyB7CiAJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsCi0JCQkJCSAgICAgICBMQkNJRl9BRERSRVNTX1JFR0lTVEVSX09GRlNFVCwKKwkJCQkJICAgICAgIExCQ0lGX0FERFJFU1NfUkVHSVNURVIsCiAJCQkJCSAgICAgICBhZGRyKTsKIAkJCWRvIHsKIAkJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwKLQkJCQkJTEJDSUZfREFUQV9SRUdJU1RFUl9PRkZTRVQsICZ2YWwpOworCQkJCQlMQkNJRl9EQVRBX1JFR0lTVEVSLCAmdmFsKTsKIAkJCX0gd2hpbGUgKCh2YWwgJiAweDAwMDEwMDAwKSA9PSAwKTsKIAkJfSB3aGlsZSAodmFsICYgMHgwMDA0MDAwMCk7CiAKLQkJY29udHJvbCA9IEVYVFJBQ1RfQ09OVFJPTF9SRUcodmFsKTsKLQotCQlpZiAoY29udHJvbCAhPSAweEMwIHx8IGluZGV4ID09IDEwMDAwKQorCQlpZiAoKHZhbCAmIDB4RkYwMCkgIT0gMHhDMDAwIHx8IGluZGV4ID09IDEwMDAwKQogCQkJYnJlYWs7Ci0KIAkJaW5kZXgrKzsKIAl9Ci0KLQlyZXR1cm4gd3JpdGVvayA/IFNVQ0NFU1MgOiBGQUlMVVJFOworCXJldHVybiB3cml0ZW9rID8gMCA6IC1FSU87CiB9CiAKIC8qKgotICogRWVwcm9tUmVhZEJ5dGUgLSBSZWFkIGEgYnl0ZSBmcm9tIHRoZSBFVDEzMTAncyBFRVBST00KKyAqIGVlcHJvbV9yZWFkIC0gUmVhZCBhIGJ5dGUgZnJvbSB0aGUgRVQxMzEwJ3MgRUVQUk9NCiAgKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICAqIEBhZGRyOiB0aGUgYWRkcmVzcyBmcm9tIHdoaWNoIHRvIHJlYWQKICAqIEBwZGF0YTogYSBwb2ludGVyIHRvIGEgYnl0ZSBpbiB3aGljaCB0byBzdG9yZSB0aGUgdmFsdWUgb2YgdGhlIHJlYWQKICAqIEBlZXByb21faWQ6IHRoZSBJRCBvZiB0aGUgRUVQUk9NCiAgKiBAYWRkcm1vZGU6IGhvdyB0aGUgRUVQUk9NIGlzIHRvIGJlIGFjY2Vzc2VkCiAgKgotICogUmV0dXJucyBTVUNDRVNTIG9yIEZBSUxVUkUKKyAqIFJldHVybnMgMSBmb3IgYSBzdWNjZXNzZnVsIHJlYWQKICAqLwotaW50IEVlcHJvbVJlYWRCeXRlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsIHUzMiBhZGRyLCB1OCAqcGRhdGEpCitzdGF0aWMgaW50IGVlcHJvbV9yZWFkKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsIHUzMiBhZGRyLCB1OCAqcGRhdGEpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBldGRldi0+cGRldjsKLQlpbnQgaW5kZXg7Ci0JaW50IGVyciA9IDA7Ci0JdTggY29udHJvbDsKLQl1OCBzdGF0dXMgPSAwOwotCXUzMiBkd29yZDEgPSAwOworCWludCBlcnI7CisJdTMyIHN0YXR1czsKIAogCS8qCi0JICogVGhlIGZvbGxvd2luZyBleGNlcnB0IGlzIGZyb20gIlNlcmlhbCBFRVBST00gSFcgRGVzaWduCi0JICogU3BlY2lmaWNhdGlvbiIgVmVyc2lvbiAwLjkyICg5LzIwLzIwMDQpOgotCSAqCi0JICogU2luZ2xlIEJ5dGUgUmVhZHMKLQkgKgogCSAqIEEgc2luZ2xlIGJ5dGUgcmVhZCBpcyBzaW1pbGFyIHRvIHRoZSBzaW5nbGUgYnl0ZSB3cml0ZSwgd2l0aCB0aGUKIAkgKiBleGNlcHRpb24gb2YgdGhlIGRhdGEgZmxvdzoKLQkgKgotCSAqIDEuIENoZWNrIExCQ0lGIFN0YXR1cyBSZWdpc3RlciBmb3IgYml0cyA2ICYgMzoyIGFsbCBlcXVhbCB0byAwIGFuZAotCSAqICAgIGJpdHMgNywxOjAgYm90aCBlcXVhbCB0byAxLCBhdCBsZWFzdCBvbmNlIGFmdGVyIHJlc2V0LgotCSAqICAgIFN1YnNlcXVlbnQgb3BlcmF0aW9ucyBuZWVkIG9ubHkgdG8gY2hlY2sgdGhhdCBiaXRzIDE6MCBhcmUgZXF1YWwKLQkgKiAgICB0byAxIHByaW9yIHRvIHN0YXJ0aW5nIGEgc2luZ2xlIGJ5dGUgcmVhZC4KLQkgKgotCSAqIDIuIFdyaXRlIHRvIHRoZSBMQkNJRiBDb250cm9sIFJlZ2lzdGVyOiAgYml0IDc9MSwgYml0IDY9MCwgYml0IDM9MCwKLQkgKiAgICBhbmQgYml0cyAxOjAgYm90aCA9MC4gIEJpdCA1IHNob3VsZCBiZSBzZXQgYWNjb3JkaW5nIHRvIHRoZSB0eXBlCi0JICogICAgb2YgRUVQUk9NIGJlaW5nIGFjY2Vzc2VkICgxPXR3byBieXRlIGFkZHJlc3NpbmcsIDA9b25lIGJ5dGUKLQkgKiAgICBhZGRyZXNzaW5nKS4KLQkgKgotCSAqIDMuIFdyaXRlIHRoZSBhZGRyZXNzIHRvIHRoZSBMQkNJRiBBZGRyZXNzIFJlZ2lzdGVyIChJMkMgcmVhZCB3aWxsCi0JICogICAgYmVnaW4pLgotCSAqCi0JICogNC4gTW9uaXRvciBiaXQgMCBvZiB0aGUgTEJDSUYgU3RhdHVzIFJlZ2lzdGVyLiAgV2hlbiA9MSwgSTJDIHJlYWQKLQkgKiAgICBpcyBjb21wbGV0ZS4gKGlmIGJpdCAxID0xIGFuZCBiaXQgMCBzdGF5cyA9MCwgYSBoYXJkd2FyZSBmYWlsdXJlCi0JICogICAgaGFzIG9jY3VycmVkKS4KLQkgKgotCSAqIDUuIENoZWNrIGJpdCAyIG9mIHRoZSBMQkNJRiBTdGF0dXMgUmVnaXN0ZXIuICBJZiA9MSwgdGhlbiBhbiBlcnJvcgotCSAqICAgIGhhcyBvY2N1cnJlZC4gIFRoZSBkYXRhIHRoYXQgaGFzIGJlZW4gcmV0dXJuZWQgZnJvbSB0aGUgUEhZIG1heQotCSAqICAgIGJlIGludmFsaWQuCi0JICoKLQkgKiA2LiBSZWdhcmRsZXNzIG9mIGVycm9yIHN0YXR1cywgcmVhZCBkYXRhIGJ5dGUgZnJvbSBMQkNJRiBEYXRhCi0JICogICAgUmVnaXN0ZXIuICBJZiBhbm90aGVyIGJ5dGUgaXMgcmVxdWlyZWQsIGdvIHRvIHN0ZXAgMS4KIAkgKi8KIAotCS8qIFN0ZXAgMTogKi8KLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNQVhfTlVNX1JFR0lTVEVSX1BPTExTOyBpbmRleCsrKSB7Ci0JCS8qIFJlYWQgcmVnaXN0ZXJzIGdyb3VwZWQgaW4gRFdPUkQxICovCi0JCWlmIChwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgTEJDSUZfRFdPUkQxX0dST1VQX09GRlNFVCwKLQkJCQkJICAmZHdvcmQxKSkgewotCQkJZXJyID0gMTsKLQkJCWJyZWFrOwotCQl9CisJZXJyID0gZWVwcm9tX3dhaXRfcmVhZHkocGRldiwgTlVMTCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKyAJLyoKKwkgKiBXcml0ZSB0byB0aGUgTEJDSUYgQ29udHJvbCBSZWdpc3RlcjogIGJpdCA3PTEsIGJpdCA2PTAsIGJpdCAzPTAsCisJICogYW5kIGJpdHMgMTowIGJvdGggPTAuICBCaXQgNSBzaG91bGQgYmUgc2V0IGFjY29yZGluZyB0byB0aGUgdHlwZQorCSAqIG9mIEVFUFJPTSBiZWluZyBhY2Nlc3NlZCAoMT10d28gYnl0ZSBhZGRyZXNzaW5nLCAwPW9uZSBieXRlCisJICogYWRkcmVzc2luZykuCisJICovCisJaWYgKHBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBMQkNJRl9DT05UUk9MX1JFR0lTVEVSLAorCQkJCSAgTEJDSUZfQ09OVFJPTF9MQkNJRl9FTkFCTEUpKQorCQlyZXR1cm4gLUVJTzsKKwkvKgorCSAqIFdyaXRlIHRoZSBhZGRyZXNzIHRvIHRoZSBMQkNJRiBBZGRyZXNzIFJlZ2lzdGVyIChJMkMgcmVhZCB3aWxsCisJICogYmVnaW4pLgorCSAqLworCWlmIChwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIExCQ0lGX0FERFJFU1NfUkVHSVNURVIsIGFkZHIpKQorCQlyZXR1cm4gLUVJTzsKKwkvKgorCSAqIE1vbml0b3IgYml0IDAgb2YgdGhlIExCQ0lGIFN0YXR1cyBSZWdpc3Rlci4gIFdoZW4gPSAxLCBJMkMgcmVhZAorCSAqIGlzIGNvbXBsZXRlLiAoaWYgYml0IDEgPTEgYW5kIGJpdCAwIHN0YXlzID0gMCwgYSBoYXJkd2FyZSBmYWlsdXJlCisJICogaGFzIG9jY3VycmVkKS4KKwkgKi8KKwllcnIgPSBlZXByb21fd2FpdF9yZWFkeShwZGV2LCAmc3RhdHVzKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwkvKgorCSAqIFJlZ2FyZGxlc3Mgb2YgZXJyb3Igc3RhdHVzLCByZWFkIGRhdGEgYnl0ZSBmcm9tIExCQ0lGIERhdGEKKwkgKiBSZWdpc3Rlci4KKwkgKi8KKwkqcGRhdGEgPSBlcnI7CisJLyoKKwkgKiBDaGVjayBiaXQgMiBvZiB0aGUgTEJDSUYgU3RhdHVzIFJlZ2lzdGVyLiAgSWYgPSAxLAorCSAqIHRoZW4gYW4gZXJyb3IgaGFzIG9jY3VycmVkLgorCSAqLworCXJldHVybiAoc3RhdHVzICYgTEJDSUZfU1RBVFVTX0FDS19FUlJPUikgPyAtRUlPIDogMDsKK30KIAotCQlzdGF0dXMgPSBFWFRSQUNUX1NUQVRVU19SRUdJU1RFUihkd29yZDEpOworaW50IGV0MTMxeF9pbml0X2VlcHJvbShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZXRkZXYtPnBkZXY7CisJdTggZWVzdGF0dXM7CiAKLQkJaWYgKHN0YXR1cyAmIExCQ0lGX1NUQVRVU19QSFlfUVVFVUVfQVZBSUwgJiYKLQkJICAgIHN0YXR1cyAmIExCQ0lGX1NUQVRVU19JMkNfSURMRSkgewotCQkJLyogYml0cyAxOjAgYXJlIGVxdWFsIHRvIDEgKi8KLQkJCWJyZWFrOwotCQl9CisJLyogV2UgZmlyc3QgbmVlZCB0byBjaGVjayB0aGUgRUVQUk9NIFN0YXR1cyBjb2RlIGxvY2F0ZWQgYXQgb2Zmc2V0CisJICogMHhCMiBvZiBjb25maWcgc3BhY2UKKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBFVDEzMTBfUENJX0VFUFJPTV9TVEFUVVMsCisJCQkJICAgICAgJmVlc3RhdHVzKTsKKworCS8qIFRISVMgSVMgQSBXT1JLQVJPVU5EOgorCSAqIEkgbmVlZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gdHdpY2UgdG8gZ2V0IG15IGNhcmQgaW4gYQorCSAqIExHIE0xIEV4cHJlc3MgRHVhbCBydW5uaW5nLiBJIHRyaWVkIGFsc28gYSBtc2xlZXAgYmVmb3JlIHRoaXMKKwkgKiBmdW5jdGlvbiwgYmVjYXVzZSBJIHRob3VndGggdGhlcmUgY291bGQgYmUgc29tZSB0aW1lIGNvbmRpZGlvbnMKKwkgKiBidXQgaXQgZGlkbid0IHdvcmsuIENhbGwgdGhlIHdob2xlIGZ1bmN0aW9uIHR3aWNlIGFsc28gd29yay4KKwkgKi8KKwlpZiAocGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgRVQxMzEwX1BDSV9FRVBST01fU1RBVFVTLCAmZWVzdGF0dXMpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJICAgICAgICJDb3VsZCBub3QgcmVhZCBQQ0kgY29uZmlnIHNwYWNlIGZvciBFRVBST00gU3RhdHVzXG4iKTsKKwkJcmV0dXJuIC1FSU87CiAJfQogCi0JaWYgKGVyciB8fCAoaW5kZXggPj0gTUFYX05VTV9SRUdJU1RFUl9QT0xMUykpCi0JCXJldHVybiBGQUlMVVJFOworCS8qIERldGVybWluZSBpZiB0aGUgZXJyb3Iocykgd2UgY2FyZSBhYm91dCBhcmUgcHJlc2VudC4gSWYgdGhleSBhcmUKKwkgKiBwcmVzZW50IHdlIG5lZWQgdG8gZmFpbC4KKwkgKi8KKwlpZiAoZWVzdGF0dXMgJiAweDRDKSB7CisJCWludCB3cml0ZV9mYWlsZWQgPSAwOworCQlpZiAocGRldi0+cmV2aXNpb24gPT0gMHgwMSkgeworCQkJaW50CWk7CisJCQlzdGF0aWMgY29uc3QgdTggZWVkYXRhWzRdID0geyAweEZFLCAweDEzLCAweDEwLCAweEZGIH07CiAKLQkvKiBTdGVwIDI6ICovCi0JY29udHJvbCA9IDA7Ci0JY29udHJvbCB8PSBMQkNJRl9DT05UUk9MX0xCQ0lGX0VOQUJMRTsKLQotCWlmIChwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgTEJDSUZfQ09OVFJPTF9SRUdJU1RFUl9PRkZTRVQsCi0JCQkJICBjb250cm9sKSkgewotCQlyZXR1cm4gRkFJTFVSRTsKLQl9Ci0KLQkvKiBTdGVwIDM6ICovCi0KLQlpZiAocGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBMQkNJRl9BRERSRVNTX1JFR0lTVEVSX09GRlNFVCwKLQkJCQkgICBhZGRyKSkgewotCQlyZXR1cm4gRkFJTFVSRTsKLQl9Ci0KLQkvKiBTdGVwIDQ6ICovCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUFYX05VTV9SRUdJU1RFUl9QT0xMUzsgaW5kZXgrKykgewotCQkvKiBSZWFkIHJlZ2lzdGVycyBncm91cGVkIGluIERXT1JEMSAqLwotCQlpZiAocGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIExCQ0lGX0RXT1JEMV9HUk9VUF9PRkZTRVQsCi0JCQkJCSAgJmR3b3JkMSkpIHsKLQkJCWVyciA9IDE7Ci0JCQlicmVhazsKKwkJCS8qIFJlLXdyaXRlIHRoZSBmaXJzdCA0IGJ5dGVzIGlmIHdlIGhhdmUgYW4gZWVwcm9tCisJCQkgKiBwcmVzZW50IGFuZCB0aGUgcmV2aXNpb24gaWQgaXMgMSwgdGhpcyBmaXhlcyB0aGUKKwkJCSAqIGNvcnJ1cHRpb24gc2VlbiB3aXRoIDEzMTAgQiBTaWxpY29uCisJCQkgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCQkJaWYgKGVlcHJvbV93cml0ZShldGRldiwgaSwgZWVkYXRhW2ldKSA8IDApCisJCQkJCXdyaXRlX2ZhaWxlZCA9IDE7CiAJCX0KKwkJaWYgKHBkZXYtPnJldmlzaW9uICAhPSAweDAxIHx8IHdyaXRlX2ZhaWxlZCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJICAgICJGYXRhbCBFRVBST00gU3RhdHVzIEVycm9yIC0gMHglMDR4XG4iLCBlZXN0YXR1cyk7CiAKLQkJc3RhdHVzID0gRVhUUkFDVF9TVEFUVVNfUkVHSVNURVIoZHdvcmQxKTsKLQotCQlpZiAoc3RhdHVzICYgTEJDSUZfU1RBVFVTX1BIWV9RVUVVRV9BVkFJTAotCQkgICAgJiYgc3RhdHVzICYgTEJDSUZfU1RBVFVTX0kyQ19JRExFKSB7Ci0JCQkvKiBJMkMgcmVhZCBjb21wbGV0ZSAqLwotCQkJYnJlYWs7CisJCQkvKiBUaGlzIGVycm9yIGNvdWxkIG1lYW4gdGhhdCB0aGVyZSB3YXMgYW4gZXJyb3IKKwkJCSAqIHJlYWRpbmcgdGhlIGVlcHJvbSBvciB0aGF0IHRoZSBlZXByb20gZG9lc24ndCBleGlzdC4KKwkJCSAqIFdlIHdpbGwgdHJlYXQgZWFjaCBjYXNlIHRoZSBzYW1lIGFuZCBub3QgdHJ5IHRvIGdhdGhlcgorCQkJICogYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0aGF0IG5vcm1hbGx5IHdvdWxkIGNvbWUgZnJvbSB0aGUKKwkJCSAqIGVlcHJvbSwgbGlrZSBNQUMgQWRkcmVzcworCQkJICovCisJCQlldGRldi0+aGFzX2VlcHJvbSA9IDA7CisJCQlyZXR1cm4gLUVJTzsKIAkJfQogCX0KKwlldGRldi0+aGFzX2VlcHJvbSA9IDE7CiAKLQlpZiAoZXJyIHx8IChpbmRleCA+PSBNQVhfTlVNX1JFR0lTVEVSX1BPTExTKSkKLQkJcmV0dXJuIEZBSUxVUkU7CisJLyogUmVhZCB0aGUgRUVQUk9NIGZvciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgTEVEIGJlaGF2aW9yLiBSZWZlciB0bworCSAqIEVUMTMxMF9waHkuYywgZXQxMzF4X3hjdnJfaW5pdCgpLCBmb3IgaXRzIHVzZS4KKwkgKi8KKwllZXByb21fcmVhZChldGRldiwgMHg3MCwgJmV0ZGV2LT5lZXByb21EYXRhWzBdKTsKKwllZXByb21fcmVhZChldGRldiwgMHg3MSwgJmV0ZGV2LT5lZXByb21EYXRhWzFdKTsKIAotCS8qIFN0ZXAgNjogKi8KLQkqcGRhdGEgPSBFWFRSQUNUX0RBVEFfUkVHSVNURVIoZHdvcmQxKTsKKwlpZiAoZXRkZXYtPmVlcHJvbURhdGFbMF0gIT0gMHhjZCkKKwkJLyogRGlzYWJsZSBhbGwgb3B0aW9uYWwgZmVhdHVyZXMgKi8KKwkJZXRkZXYtPmVlcHJvbURhdGFbMV0gPSAweDAwOwogCi0JcmV0dXJuIChzdGF0dXMgJiBMQkNJRl9TVEFUVVNfQUNLX0VSUk9SKSA/IEZBSUxVUkUgOiBTVUNDRVNTOworCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfZWVwcm9tLmggYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9lZXByb20uaAppbmRleCBkOGFjOWEwLi42YTZjNmE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9lZXByb20uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9lZXByb20uaApAQCAtNjEsMTcgKzYxLDQzIEBACiAKICNpbmNsdWRlICJldDEzMTBfYWRkcmVzc19tYXAuaCIKIAotI2lmbmRlZiBTVUNDRVNTCi0jZGVmaW5lIFNVQ0NFU1MJCTAKLSNkZWZpbmUgRkFJTFVSRQkJMQotI2VuZGlmCisvKgorICogRUVQUk9NIERlZmluZXMKKyAqLworCisvKiBMQkNJRiBSZWdpc3RlciBHcm91cHMgKGFkZHJlc3NlZCB2aWEgMzItYml0IG9mZnNldHMpICovCisjZGVmaW5lIExCQ0lGX0RXT1JEMF9HUk9VUCAgICAgICAweEFDCisjZGVmaW5lIExCQ0lGX0RXT1JEMV9HUk9VUCAgICAgICAweEIwCisKKy8qIExCQ0lGIFJlZ2lzdGVycyAoYWRkcmVzc2VkIHZpYSA4LWJpdCBvZmZzZXRzKSAqLworI2RlZmluZSBMQkNJRl9BRERSRVNTX1JFR0lTVEVSICAgMHhBQworI2RlZmluZSBMQkNJRl9EQVRBX1JFR0lTVEVSICAgICAgMHhCMAorI2RlZmluZSBMQkNJRl9DT05UUk9MX1JFR0lTVEVSICAgMHhCMQorI2RlZmluZSBMQkNJRl9TVEFUVVNfUkVHSVNURVIgICAgMHhCMgorCisvKiBMQkNJRiBDb250cm9sIFJlZ2lzdGVyIEJpdHMgKi8KKyNkZWZpbmUgTEJDSUZfQ09OVFJPTF9TRVFVRU5USUFMX1JFQUQgICAweDAxCisjZGVmaW5lIExCQ0lGX0NPTlRST0xfUEFHRV9XUklURSAgICAgICAgMHgwMgorI2RlZmluZSBMQkNJRl9DT05UUk9MX0VFUFJPTV9SRUxPQUQgICAgIDB4MDgKKyNkZWZpbmUgTEJDSUZfQ09OVFJPTF9UV09fQllURV9BRERSICAgICAweDIwCisjZGVmaW5lIExCQ0lGX0NPTlRST0xfSTJDX1dSSVRFICAgICAgICAgMHg0MAorI2RlZmluZSBMQkNJRl9DT05UUk9MX0xCQ0lGX0VOQUJMRSAgICAgIDB4ODAKKworLyogTEJDSUYgU3RhdHVzIFJlZ2lzdGVyIEJpdHMgKi8KKyNkZWZpbmUgTEJDSUZfU1RBVFVTX1BIWV9RVUVVRV9BVkFJTCAgICAweDAxCisjZGVmaW5lIExCQ0lGX1NUQVRVU19JMkNfSURMRSAgICAgICAgICAgMHgwMgorI2RlZmluZSBMQkNJRl9TVEFUVVNfQUNLX0VSUk9SICAgICAgICAgIDB4MDQKKyNkZWZpbmUgTEJDSUZfU1RBVFVTX0dFTkVSQUxfRVJST1IgICAgICAweDA4CisjZGVmaW5lIExCQ0lGX1NUQVRVU19DSEVDS1NVTV9FUlJPUiAgICAgMHg0MAorI2RlZmluZSBMQkNJRl9TVEFUVVNfRUVQUk9NX1BSRVNFTlQgICAgIDB4ODAKKworLyogTWlzY2VsbGFuZW91cyBDb25zdHJhaW50cyAqLworI2RlZmluZSBNQVhfTlVNX1JFR0lTVEVSX1BPTExTICAgICAgICAgIDEwMDAKKyNkZWZpbmUgTUFYX05VTV9XUklURV9SRVRSSUVTICAgICAgICAgICAyCiAKIC8qIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgdGhlIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUgKi8KIHN0cnVjdCBldDEzMXhfYWRhcHRlcjsKIAotaW50MzJfdCBFZXByb21Xcml0ZUJ5dGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLCB1MzIgdW5BZGRyZXNzLAotCQkJdTggYkRhdGEpOwotaW50MzJfdCBFZXByb21SZWFkQnl0ZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiB1bkFkZHJlc3MsCi0JCQl1OCAqcGJEYXRhKTsKK2ludCBldDEzMXhfaW5pdF9lZXByb20oc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldik7CiAKICNlbmRpZiAvKiBfRVQxMzEwX0VFUFJPTV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfbWFjLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9tYWMuYwppbmRleCBmODFlMWNiLi5iOGExZjIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9tYWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9tYWMuYwpAQCAtMTAxLDQxICsxMDEsMjcgQEAKIAlzdHJ1Y3QgX01BQ190IF9faW9tZW0gKnBNYWMgPSAmZXRkZXYtPnJlZ3MtPm1hYzsKIAlNQUNfU1RBVElPTl9BRERSMV90IHN0YXRpb24xOwogCU1BQ19TVEFUSU9OX0FERFIyX3Qgc3RhdGlvbjI7Ci0JTUFDX0lQR190IGlwZzsKLQlNQUNfSEZEUF90IGhmZHA7Ci0JTUlJX01HTVRfQ0ZHX3QgbWlpX21nbXRfY2ZnOworCXUzMiBpcGc7CiAKIAkvKiBGaXJzdCB3ZSBuZWVkIHRvIHJlc2V0IGV2ZXJ5dGhpbmcuICBXcml0ZSB0byBNQUMgY29uZmlndXJhdGlvbgogCSAqIHJlZ2lzdGVyIDEgdG8gcGVyZm9ybSByZXNldC4KIAkgKi8KLQl3cml0ZWwoMHhDMDBGMDAwMCwgJnBNYWMtPmNmZzEudmFsdWUpOworCXdyaXRlbCgweEMwMEYwMDAwLCAmcE1hYy0+Y2ZnMSk7CiAKIAkvKiBOZXh0IGxldHMgY29uZmlndXJlIHRoZSBNQUMgSW50ZXItcGFja2V0IGdhcCByZWdpc3RlciAqLwotCWlwZy5iaXRzLm5vbl9CMkJfaXBnXzEgPSAweDM4OwkJLyogNThkICovCi0JaXBnLmJpdHMubm9uX0IyQl9pcGdfMiA9IDB4NTg7CQkvKiA4OGQgKi8KLQlpcGcuYml0cy5taW5faWZnX2VuZm9yY2UgPSAweDUwOwkvKiA4MGQgKi8KLQlpcGcuYml0cy5CMkJfaXBnID0gMHg2MDsJCS8qIDk2ZCAqLwotCXdyaXRlbChpcGcudmFsdWUsICZwTWFjLT5pcGcudmFsdWUpOworCWlwZyA9IDB4MzgwMDU4NjA7CQkvKiBJUEcxIDB4MzggSVBHMiAweDU4IEIyQiAweDYwICovCisJaXBnIHw9IDB4NTAgPDwgODsJCS8qIGlmZyBlbmZvcmNlIDB4NTAgKi8KKwl3cml0ZWwoaXBnLCAmcE1hYy0+aXBnKTsKIAogCS8qIE5leHQgbGV0cyBjb25maWd1cmUgdGhlIE1BQyBIYWxmIER1cGxleCByZWdpc3RlciAqLwotCWhmZHAuYml0cy5hbHRfYmViX3RydW5jID0gMHhBOwotCWhmZHAuYml0cy5hbHRfYmViX2VuYWJsZSA9IDB4MDsKLQloZmRwLmJpdHMuYnBfbm9fYmFja29mZiA9IDB4MDsKLQloZmRwLmJpdHMubm9fYmFja29mZiA9IDB4MDsKLQloZmRwLmJpdHMuZXhjZXNzX2RlZmVyID0gMHgxOwotCWhmZHAuYml0cy5yZXhtaXRfbWF4ID0gMHhGOwotCWhmZHAuYml0cy5jb2xsX3dpbmRvdyA9IDB4Mzc7CQkvKiA1NWQgKi8KLQl3cml0ZWwoaGZkcC52YWx1ZSwgJnBNYWMtPmhmZHAudmFsdWUpOworCS8qIEJFQiB0cnVuYyAweEEsIEV4IERlZmVyLCBSZXhtaXQgMHhGIENvbGwgMHgzNyAqLworCXdyaXRlbCgweDAwQTFGMDM3LCAmcE1hYy0+aGZkcCk7CiAKIAkvKiBOZXh0IGxldHMgY29uZmlndXJlIHRoZSBNQUMgSW50ZXJmYWNlIENvbnRyb2wgcmVnaXN0ZXIgKi8KLQl3cml0ZWwoMCwgJnBNYWMtPmlmX2N0cmwudmFsdWUpOworCXdyaXRlbCgwLCAmcE1hYy0+aWZfY3RybCk7CiAKIAkvKiBMZXQncyBtb3ZlIG9uIHRvIHNldHRpbmcgdXAgdGhlIG1paSBtYW5hZ2VtZW50IGNvbmZpZ3VyYXRpb24gKi8KLQltaWlfbWdtdF9jZmcuYml0cy5yZXNldF9taWlfbWdtdCA9IDA7Ci0JbWlpX21nbXRfY2ZnLmJpdHMuc2Nhbl9hdXRvX2luY3JlbXQgPSAwOwotCW1paV9tZ210X2NmZy5iaXRzLnByZWFtYmxlX3N1cHByZXNzID0gMDsKLQltaWlfbWdtdF9jZmcuYml0cy5tZ210X2Nsa19yZXNldCA9IDB4NzsKLQl3cml0ZWwobWlpX21nbXRfY2ZnLnZhbHVlLCAmcE1hYy0+bWlpX21nbXRfY2ZnLnZhbHVlKTsKKwl3cml0ZWwoMHgwNywgJnBNYWMtPm1paV9tZ210X2NmZyk7CS8qIENsb2NrIHJlc2V0IDB4NyAqLwogCiAJLyogTmV4dCBsZXRzIGNvbmZpZ3VyZSB0aGUgTUFDIFN0YXRpb24gQWRkcmVzcyByZWdpc3Rlci4gIFRoZXNlCiAJICogdmFsdWVzIGFyZSByZWFkIGZyb20gdGhlIEVFUFJPTSBkdXJpbmcgaW5pdGlhbGl6YXRpb24gYW5kIHN0b3JlZApAQCAtMTYwLDEwICsxNDYsMTAgQEAKIAkgKiBQYWNrZXRzIGxhcmdlciB0aGFuIChSZWdpc3RyeUp1bWJvUGFja2V0KSB0aGF0IGRvIG5vdCBjb250YWluIGEKIAkgKiBWTEFOIElEIHdpbGwgYmUgZHJvcHBlZCBieSB0aGUgUnggZnVuY3Rpb24uCiAJICovCi0Jd3JpdGVsKGV0ZGV2LT5SZWdpc3RyeUp1bWJvUGFja2V0ICsgNCwgJnBNYWMtPm1heF9mbV9sZW4udmFsdWUpOworCXdyaXRlbChldGRldi0+UmVnaXN0cnlKdW1ib1BhY2tldCArIDQsICZwTWFjLT5tYXhfZm1fbGVuKTsKIAogCS8qIGNsZWFyIG91dCBNQUMgY29uZmlnIHJlc2V0ICovCi0Jd3JpdGVsKDAsICZwTWFjLT5jZmcxLnZhbHVlKTsKKwl3cml0ZWwoMCwgJnBNYWMtPmNmZzEpOwogfQogCiAvKioKQEAgLTE3NCw3OSArMTYwLDYyIEBACiB7CiAJaW50MzJfdCBkZWxheSA9IDA7CiAJc3RydWN0IF9NQUNfdCBfX2lvbWVtICpwTWFjID0gJmV0ZGV2LT5yZWdzLT5tYWM7Ci0JTUFDX0NGRzFfdCBjZmcxOwotCU1BQ19DRkcyX3QgY2ZnMjsKLQlNQUNfSUZfQ1RSTF90IGlmY3RybDsKKwl1MzIgY2ZnMTsKKwl1MzIgY2ZnMjsKKwl1MzIgaWZjdHJsOwogCVRYTUFDX0NUTF90IGN0bDsKIAogCWN0bC52YWx1ZSA9IHJlYWRsKCZldGRldi0+cmVncy0+dHhtYWMuY3RsLnZhbHVlKTsKLQljZmcxLnZhbHVlID0gcmVhZGwoJnBNYWMtPmNmZzEudmFsdWUpOwotCWNmZzIudmFsdWUgPSByZWFkbCgmcE1hYy0+Y2ZnMi52YWx1ZSk7Ci0JaWZjdHJsLnZhbHVlID0gcmVhZGwoJnBNYWMtPmlmX2N0cmwudmFsdWUpOworCWNmZzEgPSByZWFkbCgmcE1hYy0+Y2ZnMSk7CisJY2ZnMiA9IHJlYWRsKCZwTWFjLT5jZmcyKTsKKwlpZmN0cmwgPSByZWFkbCgmcE1hYy0+aWZfY3RybCk7CiAKKwkvKiBTZXQgdXAgdGhlIGlmIG1vZGUgYml0cyAqLworCWNmZzIgJj0gfjB4MzAwOwogCWlmIChldGRldi0+bGlua3NwZWVkID09IFRSVUVQSFlfU1BFRURfMTAwME1CUFMpIHsKLQkJY2ZnMi5iaXRzLmlmX21vZGUgPSAweDI7Ci0JCWlmY3RybC5iaXRzLnBoeV9tb2RlID0gMHgwOworCQljZmcyIHw9IDB4MjAwOworCQkvKiBQaHkgbW9kZSBiaXQgKi8KKwkJaWZjdHJsICY9IH4oMSA8PCAyNCk7CiAJfSBlbHNlIHsKLQkJY2ZnMi5iaXRzLmlmX21vZGUgPSAweDE7Ci0JCWlmY3RybC5iaXRzLnBoeV9tb2RlID0gMHgxOworCQljZmcyIHw9IDB4MTAwOworCQlpZmN0cmwgfD0gKDEgPDwgMjQpOwogCX0KIAogCS8qIFdlIG5lZWQgdG8gZW5hYmxlIFJ4L1R4ICovCi0JY2ZnMS5iaXRzLnJ4X2VuYWJsZSA9IDB4MTsKLQljZmcxLmJpdHMudHhfZW5hYmxlID0gMHgxOwotCi0JLyogU2V0IHVwIGZsb3cgY29udHJvbCAqLwotCWNmZzEuYml0cy50eF9mbG93ID0gMHgxOwotCi0JaWYgKChldGRldi0+Rmxvd0NvbnRyb2wgPT0gUnhPbmx5KSB8fAotCSAgICAoZXRkZXYtPkZsb3dDb250cm9sID09IEJvdGgpKSB7Ci0JCWNmZzEuYml0cy5yeF9mbG93ID0gMHgxOwotCX0gZWxzZSB7Ci0JCWNmZzEuYml0cy5yeF9mbG93ID0gMHgwOwotCX0KLQorCWNmZzEgfD0gQ0ZHMV9SWF9FTkFCTEV8Q0ZHMV9UWF9FTkFCTEV8Q0ZHMV9UWF9GTE9XOwogCS8qIEluaXRpYWxpemUgbG9vcCBiYWNrIHRvIG9mZiAqLwotCWNmZzEuYml0cy5sb29wX2JhY2sgPSAwOwotCi0Jd3JpdGVsKGNmZzEudmFsdWUsICZwTWFjLT5jZmcxLnZhbHVlKTsKKwljZmcxICY9IH4oQ0ZHMV9MT09QQkFDS3xDRkcxX1JYX0ZMT1cpOworCWlmIChldGRldi0+Rmxvd0NvbnRyb2wgPT0gUnhPbmx5IHx8IGV0ZGV2LT5GbG93Q29udHJvbCA9PSBCb3RoKQorCQljZmcxIHw9IENGRzFfUlhfRkxPVzsKKwl3cml0ZWwoY2ZnMSwgJnBNYWMtPmNmZzEpOwogCiAJLyogTm93IHdlIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgTUFDIENvbmZpZ3VyYXRpb24gMiByZWdpc3RlciAqLwotCWNmZzIuYml0cy5wcmVhbWJsZV9sZW4gPSAweDc7Ci0JY2ZnMi5iaXRzLmh1Z2VfZnJhbWUgPSAweDA7Ci0JLyogTEVOR1RIIEZJRUxEIENIRUNLSU5HIGJpdDQ6IFNldCB0aGlzIGJpdCB0byBjYXVzZSB0aGUgTUFDIHRvIGNoZWNrCi0JICogdGhlIGZyYW1lJ3MgbGVuZ3RoIGZpZWxkIHRvIGVuc3VyZSBpdCBtYXRjaGVzIHRoZSBhY3R1YWwgZGF0YQotCSAqIGZpZWxkIGxlbmd0aC4gQ2xlYXIgdGhpcyBiaXQgaWYgbm8gbGVuZ3RoIGZpZWxkIGNoZWNraW5nIGlzCi0JICogZGVzaXJlZC4gSXRzIGRlZmF1bHQgaXMgMC4KLQkgKi8KLQljZmcyLmJpdHMubGVuX2NoZWNrID0gMHgxOworCS8qIHByZWFtYmxlIDcsIGNoZWNrIGxlbmd0aCwgaHVnZSBmcmFtZSBvZmYsIHBhZCBjcmMsIGNyYyBlbmFibGUKKwkgICBmdWxsIGR1cGxleCBvZmYgKi8KKwljZmcyIHw9IDB4NzAxNjsKKwljZmcyICY9IH4weDAwMjE7CiAKLQlpZiAoZXRkZXYtPlJlZ2lzdHJ5UGh5TG9vcGJrID09IGZhbHNlKSB7Ci0JCWNmZzIuYml0cy5wYWRfY3JjID0gMHgxOwotCQljZmcyLmJpdHMuY3JjX2VuYWJsZSA9IDB4MTsKLQl9IGVsc2UgewotCQljZmcyLmJpdHMucGFkX2NyYyA9IDA7Ci0JCWNmZzIuYml0cy5jcmNfZW5hYmxlID0gMDsKLQl9CisJLyogVHVybiBvbiBkdXBsZXggaWYgbmVlZGVkICovCisJaWYgKGV0ZGV2LT5kdXBsZXhfbW9kZSkKKwkJY2ZnMiB8PSAweDAxOwogCi0JLyogMSAtIGZ1bGwgZHVwbGV4LCAwIC0gaGFsZi1kdXBsZXggKi8KLQljZmcyLmJpdHMuZnVsbF9kdXBsZXggPSBldGRldi0+ZHVwbGV4X21vZGU7Ci0JaWZjdHJsLmJpdHMuZ2hkX21vZGUgPSAhZXRkZXYtPmR1cGxleF9tb2RlOworCWlmY3RybCAmPSB+KDEgPDwgMjYpOworCWlmICghZXRkZXYtPmR1cGxleF9tb2RlKQorCQlpZmN0cmwgfD0gKDE8PDI2KTsJLyogRW5hYmxlIGdoZCAqLwogCi0Jd3JpdGVsKGlmY3RybC52YWx1ZSwgJnBNYWMtPmlmX2N0cmwudmFsdWUpOwotCXdyaXRlbChjZmcyLnZhbHVlLCAmcE1hYy0+Y2ZnMi52YWx1ZSk7CisJd3JpdGVsKGlmY3RybCwgJnBNYWMtPmlmX2N0cmwpOworCXdyaXRlbChjZmcyLCAmcE1hYy0+Y2ZnMik7CiAKIAlkbyB7CiAJCXVkZWxheSgxMCk7CiAJCWRlbGF5Kys7Ci0JCWNmZzEudmFsdWUgPSByZWFkbCgmcE1hYy0+Y2ZnMS52YWx1ZSk7Ci0JfSB3aGlsZSAoKCFjZmcxLmJpdHMuc3luY2RfcnhfZW4gfHwgIWNmZzEuYml0cy5zeW5jZF90eF9lbikgJiYKLQkJCQkJCQkJIGRlbGF5IDwgMTAwKTsKKwkJY2ZnMSA9IHJlYWRsKCZwTWFjLT5jZmcxKTsKKwl9IHdoaWxlICgoY2ZnMSAmIENGRzFfV0FJVCkgIT0gQ0ZHMV9XQUlUICYmIGRlbGF5IDwgMTAwKTsKIAogCWlmIChkZWxheSA9PSAxMDApIHsKIAkJZGV2X3dhcm4oJmV0ZGV2LT5wZGV2LT5kZXYsCiAJCSAgICAiU3luY2QgYml0cyBkaWQgbm90IHJlc3BvbmQgY29ycmVjdGx5IGNmZzEgd29yZCAweCUwOHhcbiIsCi0JCQljZmcxLnZhbHVlKTsKKwkJCWNmZzEpOwogCX0KIAogCS8qIEVuYWJsZSBUWE1BQyAqLwpAQCAtNDAyLDEwNiArMzcxLDQ3IEBACiB2b2lkIENvbmZpZ1R4TWFjUmVncyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQogewogCXN0cnVjdCBfVFhNQUNfdCBfX2lvbWVtICpwVHhNYWMgPSAmZXRkZXYtPnJlZ3MtPnR4bWFjOwotCVRYTUFDX0NGX1BBUkFNX3QgTG9jYWw7CiAKIAkvKiBXZSBuZWVkIHRvIHVwZGF0ZSB0aGUgQ29udHJvbCBGcmFtZSBQYXJhbWV0ZXJzCiAJICogY2ZwdCAtIGNvbnRyb2wgZnJhbWUgcGF1c2UgdGltZXIgc2V0IHRvIDY0ICgweDQwKQogCSAqIGNmZXAgLSBjb250cm9sIGZyYW1lIGV4dGVuZGVkIHBhdXNlIHRpbWVyIHNldCB0byAweDAKIAkgKi8KLQlpZiAoZXRkZXYtPkZsb3dDb250cm9sID09IE5vbmUpIHsKLQkJd3JpdGVsKDAsICZwVHhNYWMtPmNmX3BhcmFtLnZhbHVlKTsKLQl9IGVsc2UgewotCQlMb2NhbC5iaXRzLmNmcHQgPSAweDQwOwotCQlMb2NhbC5iaXRzLmNmZXAgPSAweDA7Ci0JCXdyaXRlbChMb2NhbC52YWx1ZSwgJnBUeE1hYy0+Y2ZfcGFyYW0udmFsdWUpOwotCX0KKwlpZiAoZXRkZXYtPkZsb3dDb250cm9sID09IE5vbmUpCisJCXdyaXRlbCgwLCAmcFR4TWFjLT5jZl9wYXJhbSk7CisJZWxzZQorCQl3cml0ZWwoMHg0MCwgJnBUeE1hYy0+Y2ZfcGFyYW0pOwogfQogCiB2b2lkIENvbmZpZ01hY1N0YXRSZWdzKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCiB7Ci0Jc3RydWN0IF9NQUNfU1RBVF90IF9faW9tZW0gKnBEZXZNYWNTdGF0ID0KKwlzdHJ1Y3QgX01BQ19TVEFUX3QgX19pb21lbSAqbWFjc3RhdCA9CiAJCSZldGRldi0+cmVncy0+bWFjU3RhdDsKIAogCS8qIE5leHQgd2UgbmVlZCB0byBpbml0aWFsaXplIGFsbCB0aGUgTUFDX1NUQVQgcmVnaXN0ZXJzIHRvIHplcm8gb24KIAkgKiB0aGUgZGV2aWNlLgogCSAqLwotCXdyaXRlbCgwLCAmcERldk1hY1N0YXQtPlJGY3MpOwotCXdyaXRlbCgwLCAmcERldk1hY1N0YXQtPlJBbG4pOwotCXdyaXRlbCgwLCAmcERldk1hY1N0YXQtPlJGbHIpOwotCXdyaXRlbCgwLCAmcERldk1hY1N0YXQtPlJEcnApOwotCXdyaXRlbCgwLCAmcERldk1hY1N0YXQtPlJDZGUpOwotCXdyaXRlbCgwLCAmcERldk1hY1N0YXQtPlJPdnIpOwotCXdyaXRlbCgwLCAmcERldk1hY1N0YXQtPlJGcmcpOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+UkZjcyk7CisJd3JpdGVsKDAsICZtYWNzdGF0LT5SQWxuKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPlJGbHIpOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+UkRycCk7CisJd3JpdGVsKDAsICZtYWNzdGF0LT5SQ2RlKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPlJPdnIpOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+UkZyZyk7CiAKLQl3cml0ZWwoMCwgJnBEZXZNYWNTdGF0LT5UU2NsKTsKLQl3cml0ZWwoMCwgJnBEZXZNYWNTdGF0LT5URGZyKTsKLQl3cml0ZWwoMCwgJnBEZXZNYWNTdGF0LT5UTWNsKTsKLQl3cml0ZWwoMCwgJnBEZXZNYWNTdGF0LT5UTGNsKTsKLQl3cml0ZWwoMCwgJnBEZXZNYWNTdGF0LT5UTmNsKTsKLQl3cml0ZWwoMCwgJnBEZXZNYWNTdGF0LT5UT3ZyKTsKLQl3cml0ZWwoMCwgJnBEZXZNYWNTdGF0LT5UVW5kKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPlRTY2wpOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+VERmcik7CisJd3JpdGVsKDAsICZtYWNzdGF0LT5UTWNsKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPlRMY2wpOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+VE5jbCk7CisJd3JpdGVsKDAsICZtYWNzdGF0LT5UT3ZyKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPlRVbmQpOwogCiAJLyogVW5tYXNrIGFueSBjb3VudGVycyB0aGF0IHdlIHdhbnQgdG8gdHJhY2sgdGhlIG92ZXJmbG93IG9mLgogCSAqIEluaXRpYWxseSB0aGlzIHdpbGwgYmUgYWxsIGNvdW50ZXJzLiAgSXQgbWF5IGJlY29tZSBjbGVhciBsYXRlcgogCSAqIHRoYXQgd2UgZG8gbm90IG5lZWQgdG8gdHJhY2sgYWxsIGNvdW50ZXJzLgogCSAqLwotCXsKLQkJTUFDX1NUQVRfUkVHXzFfdCBDYXJyeTFNID0geyAweGZmZmZmZmZmIH07Ci0KLQkJQ2FycnkxTS5iaXRzLnJkcnAgPSAwOwotCQlDYXJyeTFNLmJpdHMucmpiciA9IDE7Ci0JCUNhcnJ5MU0uYml0cy5yZnJnID0gMDsKLQkJQ2FycnkxTS5iaXRzLnJvdnIgPSAwOwotCQlDYXJyeTFNLmJpdHMucnVuZCA9IDE7Ci0JCUNhcnJ5MU0uYml0cy5yY3NlID0gMTsKLQkJQ2FycnkxTS5iaXRzLnJjZGUgPSAwOwotCQlDYXJyeTFNLmJpdHMucmZsciA9IDA7Ci0JCUNhcnJ5MU0uYml0cy5yYWxuID0gMDsKLQkJQ2FycnkxTS5iaXRzLnJ4dW8gPSAxOwotCQlDYXJyeTFNLmJpdHMucnhwZiA9IDE7Ci0JCUNhcnJ5MU0uYml0cy5yeGNmID0gMTsKLQkJQ2FycnkxTS5iaXRzLnJiY2EgPSAxOwotCQlDYXJyeTFNLmJpdHMucm1jYSA9IDE7Ci0JCUNhcnJ5MU0uYml0cy5yZmNzID0gMDsKLQkJQ2FycnkxTS5iaXRzLnJwa3QgPSAxOwotCQlDYXJyeTFNLmJpdHMucmJ5dCA9IDE7Ci0JCUNhcnJ5MU0uYml0cy50cm1ndiA9IDE7Ci0JCUNhcnJ5MU0uYml0cy50cm1heCA9IDE7Ci0JCUNhcnJ5MU0uYml0cy50cjFrID0gMTsKLQkJQ2FycnkxTS5iaXRzLnRyNTExID0gMTsKLQkJQ2FycnkxTS5iaXRzLnRyMjU1ID0gMTsKLQkJQ2FycnkxTS5iaXRzLnRyMTI3ID0gMTsKLQkJQ2FycnkxTS5iaXRzLnRyNjQgPSAxOwotCi0JCXdyaXRlbChDYXJyeTFNLnZhbHVlLCAmcERldk1hY1N0YXQtPkNhcnJ5MU0udmFsdWUpOwotCX0KLQotCXsKLQkJTUFDX1NUQVRfUkVHXzJfdCBDYXJyeTJNID0geyAweGZmZmZmZmZmIH07Ci0KLQkJQ2FycnkyTS5iaXRzLnRkcnAgPSAxOwotCQlDYXJyeTJNLmJpdHMudHBmaCA9IDE7Ci0JCUNhcnJ5Mk0uYml0cy50bmNsID0gMDsKLQkJQ2FycnkyTS5iaXRzLnR4Y2wgPSAxOwotCQlDYXJyeTJNLmJpdHMudGxjbCA9IDA7Ci0JCUNhcnJ5Mk0uYml0cy50bWNsID0gMDsKLQkJQ2FycnkyTS5iaXRzLnRzY2wgPSAwOwotCQlDYXJyeTJNLmJpdHMudGVkZiA9IDE7Ci0JCUNhcnJ5Mk0uYml0cy50ZGZyID0gMDsKLQkJQ2FycnkyTS5iaXRzLnR4cGYgPSAxOwotCQlDYXJyeTJNLmJpdHMudGJjYSA9IDE7Ci0JCUNhcnJ5Mk0uYml0cy50bWNhID0gMTsKLQkJQ2FycnkyTS5iaXRzLnRwa3QgPSAxOwotCQlDYXJyeTJNLmJpdHMudGJ5dCA9IDE7Ci0JCUNhcnJ5Mk0uYml0cy50ZnJnID0gMTsKLQkJQ2FycnkyTS5iaXRzLnR1bmQgPSAwOwotCQlDYXJyeTJNLmJpdHMudG92ciA9IDA7Ci0JCUNhcnJ5Mk0uYml0cy50eGNmID0gMTsKLQkJQ2FycnkyTS5iaXRzLnRmY3MgPSAxOwotCQlDYXJyeTJNLmJpdHMudGpiciA9IDE7Ci0KLQkJd3JpdGVsKENhcnJ5Mk0udmFsdWUsICZwRGV2TWFjU3RhdC0+Q2FycnkyTS52YWx1ZSk7Ci0JfQorCXdyaXRlbCgweEZGRkZCRTMyLCAmbWFjc3RhdC0+Q2FycnkxTSk7CisJd3JpdGVsKDB4RkZGRTdFOEIsICZtYWNzdGF0LT5DYXJyeTJNKTsKIH0KIAogdm9pZCBDb25maWdGbG93Q29udHJvbChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQpAQCAtNTA5LDI4ICs0MTksMjggQEAKIAlpZiAoZXRkZXYtPmR1cGxleF9tb2RlID09IDApIHsKIAkJZXRkZXYtPkZsb3dDb250cm9sID0gTm9uZTsKIAl9IGVsc2UgewotCQljaGFyIFJlbW90ZVBhdXNlLCBSZW1vdGVBc3luY1BhdXNlOworCQljaGFyIHJlbW90ZV9wYXVzZSwgcmVtb3RlX2FzeW5jX3BhdXNlOwogCiAJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChldGRldiwKLQkJCQkgICAgICBUUlVFUEhZX0JJVF9SRUFELCA1LCAxMCwgJlJlbW90ZVBhdXNlKTsKKwkJCQkgICAgICBUUlVFUEhZX0JJVF9SRUFELCA1LCAxMCwgJnJlbW90ZV9wYXVzZSk7CiAJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChldGRldiwKIAkJCQkgICAgICBUUlVFUEhZX0JJVF9SRUFELCA1LCAxMSwKLQkJCQkgICAgICAmUmVtb3RlQXN5bmNQYXVzZSk7CisJCQkJICAgICAgJnJlbW90ZV9hc3luY19wYXVzZSk7CiAKLQkJaWYgKChSZW1vdGVQYXVzZSA9PSBUUlVFUEhZX0JJVF9TRVQpICYmCi0JCSAgICAoUmVtb3RlQXN5bmNQYXVzZSA9PSBUUlVFUEhZX0JJVF9TRVQpKSB7CisJCWlmICgocmVtb3RlX3BhdXNlID09IFRSVUVQSFlfQklUX1NFVCkgJiYKKwkJICAgIChyZW1vdGVfYXN5bmNfcGF1c2UgPT0gVFJVRVBIWV9CSVRfU0VUKSkgewogCQkJZXRkZXYtPkZsb3dDb250cm9sID0gZXRkZXYtPlJlZ2lzdHJ5Rmxvd0NvbnRyb2w7Ci0JCX0gZWxzZSBpZiAoKFJlbW90ZVBhdXNlID09IFRSVUVQSFlfQklUX1NFVCkgJiYKLQkJCSAgIChSZW1vdGVBc3luY1BhdXNlID09IFRSVUVQSFlfQklUX0NMRUFSKSkgeworCQl9IGVsc2UgaWYgKChyZW1vdGVfcGF1c2UgPT0gVFJVRVBIWV9CSVRfU0VUKSAmJgorCQkJICAgKHJlbW90ZV9hc3luY19wYXVzZSA9PSBUUlVFUEhZX0JJVF9DTEVBUikpIHsKIAkJCWlmIChldGRldi0+UmVnaXN0cnlGbG93Q29udHJvbCA9PSBCb3RoKQogCQkJCWV0ZGV2LT5GbG93Q29udHJvbCA9IEJvdGg7CiAJCQllbHNlCiAJCQkJZXRkZXYtPkZsb3dDb250cm9sID0gTm9uZTsKLQkJfSBlbHNlIGlmICgoUmVtb3RlUGF1c2UgPT0gVFJVRVBIWV9CSVRfQ0xFQVIpICYmCi0JCQkgICAoUmVtb3RlQXN5bmNQYXVzZSA9PSBUUlVFUEhZX0JJVF9DTEVBUikpIHsKKwkJfSBlbHNlIGlmICgocmVtb3RlX3BhdXNlID09IFRSVUVQSFlfQklUX0NMRUFSKSAmJgorCQkJICAgKHJlbW90ZV9hc3luY19wYXVzZSA9PSBUUlVFUEhZX0JJVF9DTEVBUikpIHsKIAkJCWV0ZGV2LT5GbG93Q29udHJvbCA9IE5vbmU7Ci0JCX0gZWxzZSB7LyogaWYgKFJlbW90ZVBhdXNlID09IFRSVUVQSFlfQ0xFQVJfQklUICYmCi0JCQkgICAgICAgUmVtb3RlQXN5bmNQYXVzZSA9PSBUUlVFUEhZX1NFVF9CSVQpICovCisJCX0gZWxzZSB7LyogaWYgKHJlbW90ZV9wYXVzZSA9PSBUUlVFUEhZX0NMRUFSX0JJVCAmJgorCQkJICAgICAgIHJlbW90ZV9hc3luY19wYXVzZSA9PSBUUlVFUEhZX1NFVF9CSVQpICovCiAJCQlpZiAoZXRkZXYtPlJlZ2lzdHJ5Rmxvd0NvbnRyb2wgPT0gQm90aCkKIAkJCQlldGRldi0+Rmxvd0NvbnRyb2wgPSBSeE9ubHk7CiAJCQllbHNlCkBAIC01NDYsMjUgKzQ1NiwyNSBAQAogdm9pZCBVcGRhdGVNYWNTdGF0SG9zdENvdW50ZXJzKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCiB7CiAJc3RydWN0IF9jZV9zdGF0c190ICpzdGF0cyA9ICZldGRldi0+U3RhdHM7Ci0Jc3RydWN0IF9NQUNfU1RBVF90IF9faW9tZW0gKnBEZXZNYWNTdGF0ID0KKwlzdHJ1Y3QgX01BQ19TVEFUX3QgX19pb21lbSAqbWFjc3RhdCA9CiAJCSZldGRldi0+cmVncy0+bWFjU3RhdDsKIAotCXN0YXRzLT5jb2xsaXNpb25zICs9IHJlYWRsKCZwRGV2TWFjU3RhdC0+VE5jbCk7Ci0Jc3RhdHMtPmZpcnN0X2NvbGxpc2lvbiArPSByZWFkbCgmcERldk1hY1N0YXQtPlRTY2wpOwotCXN0YXRzLT50eF9kZWZlcnJlZCArPSByZWFkbCgmcERldk1hY1N0YXQtPlREZnIpOwotCXN0YXRzLT5leGNlc3NpdmVfY29sbGlzaW9ucyArPSByZWFkbCgmcERldk1hY1N0YXQtPlRNY2wpOwotCXN0YXRzLT5sYXRlX2NvbGxpc2lvbnMgKz0gcmVhZGwoJnBEZXZNYWNTdGF0LT5UTGNsKTsKLQlzdGF0cy0+dHhfdWZsbyArPSByZWFkbCgmcERldk1hY1N0YXQtPlRVbmQpOwotCXN0YXRzLT5tYXhfcGt0X2Vycm9yICs9IHJlYWRsKCZwRGV2TWFjU3RhdC0+VE92cik7CisJc3RhdHMtPmNvbGxpc2lvbnMgKz0gcmVhZGwoJm1hY3N0YXQtPlROY2wpOworCXN0YXRzLT5maXJzdF9jb2xsaXNpb24gKz0gcmVhZGwoJm1hY3N0YXQtPlRTY2wpOworCXN0YXRzLT50eF9kZWZlcnJlZCArPSByZWFkbCgmbWFjc3RhdC0+VERmcik7CisJc3RhdHMtPmV4Y2Vzc2l2ZV9jb2xsaXNpb25zICs9IHJlYWRsKCZtYWNzdGF0LT5UTWNsKTsKKwlzdGF0cy0+bGF0ZV9jb2xsaXNpb25zICs9IHJlYWRsKCZtYWNzdGF0LT5UTGNsKTsKKwlzdGF0cy0+dHhfdWZsbyArPSByZWFkbCgmbWFjc3RhdC0+VFVuZCk7CisJc3RhdHMtPm1heF9wa3RfZXJyb3IgKz0gcmVhZGwoJm1hY3N0YXQtPlRPdnIpOwogCi0Jc3RhdHMtPmFsaWdubWVudF9lcnIgKz0gcmVhZGwoJnBEZXZNYWNTdGF0LT5SQWxuKTsKLQlzdGF0cy0+Y3JjX2VyciArPSByZWFkbCgmcERldk1hY1N0YXQtPlJDZGUpOwotCXN0YXRzLT5ub3JjdmJ1ZiArPSByZWFkbCgmcERldk1hY1N0YXQtPlJEcnApOwotCXN0YXRzLT5yeF9vdl9mbG93ICs9IHJlYWRsKCZwRGV2TWFjU3RhdC0+Uk92cik7Ci0Jc3RhdHMtPmNvZGVfdmlvbGF0aW9ucyArPSByZWFkbCgmcERldk1hY1N0YXQtPlJGY3MpOwotCXN0YXRzLT5sZW5ndGhfZXJyICs9IHJlYWRsKCZwRGV2TWFjU3RhdC0+UkZscik7CisJc3RhdHMtPmFsaWdubWVudF9lcnIgKz0gcmVhZGwoJm1hY3N0YXQtPlJBbG4pOworCXN0YXRzLT5jcmNfZXJyICs9IHJlYWRsKCZtYWNzdGF0LT5SQ2RlKTsKKwlzdGF0cy0+bm9yY3ZidWYgKz0gcmVhZGwoJm1hY3N0YXQtPlJEcnApOworCXN0YXRzLT5yeF9vdl9mbG93ICs9IHJlYWRsKCZtYWNzdGF0LT5ST3ZyKTsKKwlzdGF0cy0+Y29kZV92aW9sYXRpb25zICs9IHJlYWRsKCZtYWNzdGF0LT5SRmNzKTsKKwlzdGF0cy0+bGVuZ3RoX2VyciArPSByZWFkbCgmbWFjc3RhdC0+UkZscik7CiAKLQlzdGF0cy0+b3RoZXJfZXJyb3JzICs9IHJlYWRsKCZwRGV2TWFjU3RhdC0+UkZyZyk7CisJc3RhdHMtPm90aGVyX2Vycm9ycyArPSByZWFkbCgmbWFjc3RhdC0+UkZyZyk7CiB9CiAKIC8qKgpAQCAtNTc3LDE3ICs0ODcsMTcgQEAKICAqLwogdm9pZCBIYW5kbGVNYWNTdGF0SW50ZXJydXB0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCiB7Ci0JTUFDX1NUQVRfUkVHXzFfdCBDYXJyeTE7Ci0JTUFDX1NUQVRfUkVHXzJfdCBDYXJyeTI7CisJdTMyIENhcnJ5MTsKKwl1MzIgQ2FycnkyOwogCiAJLyogUmVhZCB0aGUgaW50ZXJydXB0IGJpdHMgZnJvbSB0aGUgcmVnaXN0ZXIocykuICBUaGVzZSBhcmUgQ2xlYXIgT24KIAkgKiBXcml0ZS4KIAkgKi8KLQlDYXJyeTEudmFsdWUgPSByZWFkbCgmZXRkZXYtPnJlZ3MtPm1hY1N0YXQuQ2FycnkxLnZhbHVlKTsKLQlDYXJyeTIudmFsdWUgPSByZWFkbCgmZXRkZXYtPnJlZ3MtPm1hY1N0YXQuQ2FycnkyLnZhbHVlKTsKKwlDYXJyeTEgPSByZWFkbCgmZXRkZXYtPnJlZ3MtPm1hY1N0YXQuQ2FycnkxKTsKKwlDYXJyeTIgPSByZWFkbCgmZXRkZXYtPnJlZ3MtPm1hY1N0YXQuQ2FycnkyKTsKIAotCXdyaXRlbChDYXJyeTEudmFsdWUsICZldGRldi0+cmVncy0+bWFjU3RhdC5DYXJyeTEudmFsdWUpOwotCXdyaXRlbChDYXJyeTIudmFsdWUsICZldGRldi0+cmVncy0+bWFjU3RhdC5DYXJyeTIudmFsdWUpOworCXdyaXRlbChDYXJyeTEsICZldGRldi0+cmVncy0+bWFjU3RhdC5DYXJyeTEpOworCXdyaXRlbChDYXJyeTIsICZldGRldi0+cmVncy0+bWFjU3RhdC5DYXJyeTIpOwogCiAJLyogV2UgbmVlZCB0byBkbyB1cGRhdGUgdGhlIGhvc3QgY29weSBvZiBhbGwgdGhlIE1BQ19TVEFUIGNvdW50ZXJzLgogCSAqIEZvciBlYWNoIGNvdW50ZXIsIGNoZWNrIGl0J3Mgb3ZlcmZsb3cgYml0LiAgSWYgdGhlIG92ZXJmbG93IGJpdCBpcwpAQCAtNTk1LDMzICs1MDUsMzMgQEAKIAkgKiByZXZvbHV0aW9uIG9mIHRoZSBjb3VudGVyLiAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIHRoZSBjb3VudGVyCiAJICogYmxvY2sgaW5kaWNhdGVzIHRoYXQgb25lIG9mIHRoZSBjb3VudGVycyBoYXMgd3JhcHBlZC4KIAkgKi8KLQlpZiAoQ2FycnkxLmJpdHMucmZjcykKKwlpZiAoQ2FycnkxICYgKDEgPDwgMTQpKQogCQlldGRldi0+U3RhdHMuY29kZV92aW9sYXRpb25zICs9IENPVU5URVJfV1JBUF8xNl9CSVQ7Ci0JaWYgKENhcnJ5MS5iaXRzLnJhbG4pCisJaWYgKENhcnJ5MSAmICgxIDw8IDgpKQogCQlldGRldi0+U3RhdHMuYWxpZ25tZW50X2VyciArPSBDT1VOVEVSX1dSQVBfMTJfQklUOwotCWlmIChDYXJyeTEuYml0cy5yZmxyKQorCWlmIChDYXJyeTEgJiAoMSA8PCA3KSkKIAkJZXRkZXYtPlN0YXRzLmxlbmd0aF9lcnIgKz0gQ09VTlRFUl9XUkFQXzE2X0JJVDsKLQlpZiAoQ2FycnkxLmJpdHMucmZyZykKKwlpZiAoQ2FycnkxICYgKDEgPDwgMikpCiAJCWV0ZGV2LT5TdGF0cy5vdGhlcl9lcnJvcnMgKz0gQ09VTlRFUl9XUkFQXzE2X0JJVDsKLQlpZiAoQ2FycnkxLmJpdHMucmNkZSkKKwlpZiAoQ2FycnkxICYgKDEgPDwgNikpCiAJCWV0ZGV2LT5TdGF0cy5jcmNfZXJyICs9IENPVU5URVJfV1JBUF8xNl9CSVQ7Ci0JaWYgKENhcnJ5MS5iaXRzLnJvdnIpCisJaWYgKENhcnJ5MSAmICgxIDw8IDMpKQogCQlldGRldi0+U3RhdHMucnhfb3ZfZmxvdyArPSBDT1VOVEVSX1dSQVBfMTZfQklUOwotCWlmIChDYXJyeTEuYml0cy5yZHJwKQorCWlmIChDYXJyeTEgJiAoMSA8PCAwKSkKIAkJZXRkZXYtPlN0YXRzLm5vcmN2YnVmICs9IENPVU5URVJfV1JBUF8xNl9CSVQ7Ci0JaWYgKENhcnJ5Mi5iaXRzLnRvdnIpCisJaWYgKENhcnJ5MiAmICgxIDw8IDE2KSkKIAkJZXRkZXYtPlN0YXRzLm1heF9wa3RfZXJyb3IgKz0gQ09VTlRFUl9XUkFQXzEyX0JJVDsKLQlpZiAoQ2FycnkyLmJpdHMudHVuZCkKKwlpZiAoQ2FycnkyICYgKDEgPDwgMTUpKQogCQlldGRldi0+U3RhdHMudHhfdWZsbyArPSBDT1VOVEVSX1dSQVBfMTJfQklUOwotCWlmIChDYXJyeTIuYml0cy50c2NsKQorCWlmIChDYXJyeTIgJiAoMSA8PCA2KSkKIAkJZXRkZXYtPlN0YXRzLmZpcnN0X2NvbGxpc2lvbiArPSBDT1VOVEVSX1dSQVBfMTJfQklUOwotCWlmIChDYXJyeTIuYml0cy50ZGZyKQorCWlmIChDYXJyeTIgJiAoMSA8PCA4KSkKIAkJZXRkZXYtPlN0YXRzLnR4X2RlZmVycmVkICs9IENPVU5URVJfV1JBUF8xMl9CSVQ7Ci0JaWYgKENhcnJ5Mi5iaXRzLnRtY2wpCisJaWYgKENhcnJ5MiAmICgxIDw8IDUpKQogCQlldGRldi0+U3RhdHMuZXhjZXNzaXZlX2NvbGxpc2lvbnMgKz0gQ09VTlRFUl9XUkFQXzEyX0JJVDsKLQlpZiAoQ2FycnkyLmJpdHMudGxjbCkKKwlpZiAoQ2FycnkyICYgKDEgPDwgNCkpCiAJCWV0ZGV2LT5TdGF0cy5sYXRlX2NvbGxpc2lvbnMgKz0gQ09VTlRFUl9XUkFQXzEyX0JJVDsKLQlpZiAoQ2FycnkyLmJpdHMudG5jbCkKKwlpZiAoQ2FycnkyICYgKDEgPDwgMikpCiAJCWV0ZGV2LT5TdGF0cy5jb2xsaXNpb25zICs9IENPVU5URVJfV1JBUF8xMl9CSVQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3BoeS5jIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfcGh5LmMKaW5kZXggZGQxOTliZC4uNmVjYWQ2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfcGh5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfcGh5LmMKQEAgLTk4LDIzOCArOTgsNDk4IEBACiAjaW5jbHVkZSAiZXQxMzEwX21hYy5oIgogCiAvKiBQcm90b3R5cGVzIGZvciBmdW5jdGlvbnMgd2l0aCBsb2NhbCBzY29wZSAqLwotc3RhdGljIGludCBldDEzMXhfeGN2cl9pbml0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgdm9pZCBldDEzMXhfeGN2cl9pbml0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpOwogCiAvKioKICAqIFBoeU1pUmVhZCAtIFJlYWQgZnJvbSB0aGUgUEhZIHRocm91Z2ggdGhlIE1JSSBJbnRlcmZhY2Ugb24gdGhlIE1BQwotICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqIEBldGRldjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogICogQHhjdnJBZGRyOiB0aGUgYWRkcmVzcyBvZiB0aGUgdHJhbnNjaWV2ZXIKICAqIEB4Y3ZyUmVnOiB0aGUgcmVnaXN0ZXIgdG8gcmVhZAogICogQHZhbHVlOiBwb2ludGVyIHRvIGEgMTYtYml0IHZhbHVlIGluIHdoaWNoIHRoZSB2YWx1ZSB3aWxsIGJlIHN0b3JlZAogICoKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvbiBmYWlsdXJlIChhcyBkZWZpbmVkIGluIGVycm5vLmgpCiAgKi8KLWludCBQaHlNaVJlYWQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLCB1aW50OF90IHhjdnJBZGRyLAotCSAgICAgIHVpbnQ4X3QgeGN2clJlZywgdWludDE2X3QgKnZhbHVlKQoraW50IFBoeU1pUmVhZChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LCB1OCB4Y3ZyQWRkciwKKwkgICAgICB1OCB4Y3ZyUmVnLCB1MTYgKnZhbHVlKQogewotCXN0cnVjdCBfTUFDX3QgX19pb21lbSAqbWFjID0gJmFkYXB0ZXItPnJlZ3MtPm1hYzsKKwlzdHJ1Y3QgX01BQ190IF9faW9tZW0gKm1hYyA9ICZldGRldi0+cmVncy0+bWFjOwogCWludCBzdGF0dXMgPSAwOwotCXVpbnQzMl90IGRlbGF5OwotCU1JSV9NR01UX0FERFJfdCBtaWlBZGRyOwotCU1JSV9NR01UX0NNRF90IG1paUNtZDsKLQlNSUlfTUdNVF9JTkRJQ0FUT1JfdCBtaWlJbmRpY2F0b3I7CisJdTMyIGRlbGF5OworCXUzMiBtaWlBZGRyOworCXUzMiBtaWlDbWQ7CisJdTMyIG1paUluZGljYXRvcjsKIAogCS8qIFNhdmUgYSBsb2NhbCBjb3B5IG9mIHRoZSByZWdpc3RlcnMgd2UgYXJlIGRlYWxpbmcgd2l0aCBzbyB3ZSBjYW4KIAkgKiBzZXQgdGhlbSBiYWNrCiAJICovCi0JbWlpQWRkci52YWx1ZSA9IHJlYWRsKCZtYWMtPm1paV9tZ210X2FkZHIudmFsdWUpOwotCW1paUNtZC52YWx1ZSA9IHJlYWRsKCZtYWMtPm1paV9tZ210X2NtZC52YWx1ZSk7CisJbWlpQWRkciA9IHJlYWRsKCZtYWMtPm1paV9tZ210X2FkZHIpOworCW1paUNtZCA9IHJlYWRsKCZtYWMtPm1paV9tZ210X2NtZCk7CiAKIAkvKiBTdG9wIHRoZSBjdXJyZW50IG9wZXJhdGlvbiAqLwotCXdyaXRlbCgwLCAmbWFjLT5taWlfbWdtdF9jbWQudmFsdWUpOworCXdyaXRlbCgwLCAmbWFjLT5taWlfbWdtdF9jbWQpOwogCiAJLyogU2V0IHVwIHRoZSByZWdpc3RlciB3ZSBuZWVkIHRvIHJlYWQgZnJvbSBvbiB0aGUgY29ycmVjdCBQSFkgKi8KLQl7Ci0JCU1JSV9NR01UX0FERFJfdCBtaWlfbWdtdF9hZGRyID0geyAwIH07Ci0KLQkJbWlpX21nbXRfYWRkci5iaXRzLnBoeV9hZGRyID0geGN2ckFkZHI7Ci0JCW1paV9tZ210X2FkZHIuYml0cy5yZWdfYWRkciA9IHhjdnJSZWc7Ci0JCXdyaXRlbChtaWlfbWdtdF9hZGRyLnZhbHVlLCAmbWFjLT5taWlfbWdtdF9hZGRyLnZhbHVlKTsKLQl9CisJd3JpdGVsKE1JSV9BRERSKHhjdnJBZGRyLCB4Y3ZyUmVnKSwgJm1hYy0+bWlpX21nbXRfYWRkcik7CiAKIAkvKiBLaWNrIHRoZSByZWFkIGN5Y2xlIG9mZiAqLwogCWRlbGF5ID0gMDsKIAotCXdyaXRlbCgweDEsICZtYWMtPm1paV9tZ210X2NtZC52YWx1ZSk7CisJd3JpdGVsKDB4MSwgJm1hYy0+bWlpX21nbXRfY21kKTsKIAogCWRvIHsKIAkJdWRlbGF5KDUwKTsKIAkJZGVsYXkrKzsKLQkJbWlpSW5kaWNhdG9yLnZhbHVlID0gcmVhZGwoJm1hYy0+bWlpX21nbXRfaW5kaWNhdG9yLnZhbHVlKTsKLQl9IHdoaWxlICgobWlpSW5kaWNhdG9yLmJpdHMubm90X3ZhbGlkIHx8IG1paUluZGljYXRvci5iaXRzLmJ1c3kpICYmCi0JCSBkZWxheSA8IDUwKTsKKwkJbWlpSW5kaWNhdG9yID0gcmVhZGwoJm1hYy0+bWlpX21nbXRfaW5kaWNhdG9yKTsKKwl9IHdoaWxlICgobWlpSW5kaWNhdG9yICYgTUdNVF9XQUlUKSAmJiBkZWxheSA8IDUwKTsKIAogCS8qIElmIHdlIGhpdCB0aGUgbWF4IGRlbGF5LCB3ZSBjb3VsZCBub3QgcmVhZCB0aGUgcmVnaXN0ZXIgKi8KLQlpZiAoZGVsYXkgPj0gNTApIHsKLQkJZGV2X3dhcm4oJmFkYXB0ZXItPnBkZXYtPmRldiwKKwlpZiAoZGVsYXkgPT0gNTApIHsKKwkJZGV2X3dhcm4oJmV0ZGV2LT5wZGV2LT5kZXYsCiAJCQkgICAgInhjdnJSZWcgMHglMDh4IGNvdWxkIG5vdCBiZSByZWFkXG4iLCB4Y3ZyUmVnKTsKLQkJZGV2X3dhcm4oJmFkYXB0ZXItPnBkZXYtPmRldiwgInN0YXR1cyBpcyAgMHglMDh4XG4iLAotCQkJICAgIG1paUluZGljYXRvci52YWx1ZSk7CisJCWRldl93YXJuKCZldGRldi0+cGRldi0+ZGV2LCAic3RhdHVzIGlzICAweCUwOHhcbiIsCisJCQkgICAgbWlpSW5kaWNhdG9yKTsKIAogCQlzdGF0dXMgPSAtRUlPOwogCX0KIAogCS8qIElmIHdlIGhpdCBoZXJlIHdlIHdlcmUgYWJsZSB0byByZWFkIHRoZSByZWdpc3RlciBhbmQgd2UgbmVlZCB0bwotCSAqIHJldHVybiB0aGUgdmFsdWUgdG8gdGhlIGNhbGxlcgotCSAqLwotCS8qIFRPRE86IG1ha2UgdGhpcyBzdHVmZiBhIHNpbXBsZSByZWFkdygpPyEgKi8KLQl7Ci0JCU1JSV9NR01UX1NUQVRfdCBtaWlfbWdtdF9zdGF0OwotCi0JCW1paV9tZ210X3N0YXQudmFsdWUgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9zdGF0LnZhbHVlKTsKLQkJKnZhbHVlID0gKHVpbnQxNl90KSBtaWlfbWdtdF9zdGF0LmJpdHMucGh5X3N0YXQ7Ci0JfQorCSAqIHJldHVybiB0aGUgdmFsdWUgdG8gdGhlIGNhbGxlciAqLworCSp2YWx1ZSA9IHJlYWRsKCZtYWMtPm1paV9tZ210X3N0YXQpICYgMHhGRkZGOwogCiAJLyogU3RvcCB0aGUgcmVhZCBvcGVyYXRpb24gKi8KLQl3cml0ZWwoMCwgJm1hYy0+bWlpX21nbXRfY21kLnZhbHVlKTsKKwl3cml0ZWwoMCwgJm1hYy0+bWlpX21nbXRfY21kKTsKIAogCS8qIHNldCB0aGUgcmVnaXN0ZXJzIHdlIHRvdWNoZWQgYmFjayB0byB0aGUgc3RhdGUgYXQgd2hpY2ggd2UgZW50ZXJlZAogCSAqIHRoaXMgZnVuY3Rpb24KIAkgKi8KLQl3cml0ZWwobWlpQWRkci52YWx1ZSwgJm1hYy0+bWlpX21nbXRfYWRkci52YWx1ZSk7Ci0Jd3JpdGVsKG1paUNtZC52YWx1ZSwgJm1hYy0+bWlpX21nbXRfY21kLnZhbHVlKTsKKwl3cml0ZWwobWlpQWRkciwgJm1hYy0+bWlpX21nbXRfYWRkcik7CisJd3JpdGVsKG1paUNtZCwgJm1hYy0+bWlpX21nbXRfY21kKTsKIAogCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qKgogICogTWlXcml0ZSAtIFdyaXRlIHRvIGEgUEhZIHJlZ2lzdGVyIHRocm91Z2ggdGhlIE1JSSBpbnRlcmZhY2Ugb2YgdGhlIE1BQwotICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqIEBldGRldjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogICogQHhjdnJSZWc6IHRoZSByZWdpc3RlciB0byByZWFkCiAgKiBAdmFsdWU6IDE2LWJpdCB2YWx1ZSB0byB3cml0ZQogICoKKyAqIEZJWE1FOiBvbmUgY2FsbGVyIGluIG5ldGRldiBzdGlsbAorICoKICAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIGVycm5vIG9uIGZhaWx1cmUgKGFzIGRlZmluZWQgaW4gZXJybm8uaCkKICAqLwotaW50IE1pV3JpdGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLCB1aW50OF90IHhjdnJSZWcsIHVpbnQxNl90IHZhbHVlKQoraW50IE1pV3JpdGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwgdTggeGN2clJlZywgdTE2IHZhbHVlKQogewotCXN0cnVjdCBfTUFDX3QgX19pb21lbSAqbWFjID0gJmFkYXB0ZXItPnJlZ3MtPm1hYzsKKwlzdHJ1Y3QgX01BQ190IF9faW9tZW0gKm1hYyA9ICZldGRldi0+cmVncy0+bWFjOwogCWludCBzdGF0dXMgPSAwOwotCXVpbnQ4X3QgeGN2ckFkZHIgPSBhZGFwdGVyLT5TdGF0cy54Y3ZyX2FkZHI7Ci0JdWludDMyX3QgZGVsYXk7Ci0JTUlJX01HTVRfQUREUl90IG1paUFkZHI7Ci0JTUlJX01HTVRfQ01EX3QgbWlpQ21kOwotCU1JSV9NR01UX0lORElDQVRPUl90IG1paUluZGljYXRvcjsKKwl1OCB4Y3ZyQWRkciA9IGV0ZGV2LT5TdGF0cy54Y3ZyX2FkZHI7CisJdTMyIGRlbGF5OworCXUzMiBtaWlBZGRyOworCXUzMiBtaWlDbWQ7CisJdTMyIG1paUluZGljYXRvcjsKIAogCS8qIFNhdmUgYSBsb2NhbCBjb3B5IG9mIHRoZSByZWdpc3RlcnMgd2UgYXJlIGRlYWxpbmcgd2l0aCBzbyB3ZSBjYW4KIAkgKiBzZXQgdGhlbSBiYWNrCiAJICovCi0JbWlpQWRkci52YWx1ZSA9IHJlYWRsKCZtYWMtPm1paV9tZ210X2FkZHIudmFsdWUpOwotCW1paUNtZC52YWx1ZSA9IHJlYWRsKCZtYWMtPm1paV9tZ210X2NtZC52YWx1ZSk7CisJbWlpQWRkciA9IHJlYWRsKCZtYWMtPm1paV9tZ210X2FkZHIpOworCW1paUNtZCA9IHJlYWRsKCZtYWMtPm1paV9tZ210X2NtZCk7CiAKIAkvKiBTdG9wIHRoZSBjdXJyZW50IG9wZXJhdGlvbiAqLwotCXdyaXRlbCgwLCAmbWFjLT5taWlfbWdtdF9jbWQudmFsdWUpOworCXdyaXRlbCgwLCAmbWFjLT5taWlfbWdtdF9jbWQpOwogCiAJLyogU2V0IHVwIHRoZSByZWdpc3RlciB3ZSBuZWVkIHRvIHdyaXRlIHRvIG9uIHRoZSBjb3JyZWN0IFBIWSAqLwotCXsKLQkJTUlJX01HTVRfQUREUl90IG1paV9tZ210X2FkZHI7Ci0KLQkJbWlpX21nbXRfYWRkci5iaXRzLnBoeV9hZGRyID0geGN2ckFkZHI7Ci0JCW1paV9tZ210X2FkZHIuYml0cy5yZWdfYWRkciA9IHhjdnJSZWc7Ci0JCXdyaXRlbChtaWlfbWdtdF9hZGRyLnZhbHVlLCAmbWFjLT5taWlfbWdtdF9hZGRyLnZhbHVlKTsKLQl9CisJd3JpdGVsKE1JSV9BRERSKHhjdnJBZGRyLCB4Y3ZyUmVnKSwgJm1hYy0+bWlpX21nbXRfYWRkcik7CiAKIAkvKiBBZGQgdGhlIHZhbHVlIHRvIHdyaXRlIHRvIHRoZSByZWdpc3RlcnMgdG8gdGhlIG1hYyAqLwotCXdyaXRlbCh2YWx1ZSwgJm1hYy0+bWlpX21nbXRfY3RybC52YWx1ZSk7CisJd3JpdGVsKHZhbHVlLCAmbWFjLT5taWlfbWdtdF9jdHJsKTsKIAlkZWxheSA9IDA7CiAKIAlkbyB7CiAJCXVkZWxheSg1MCk7CiAJCWRlbGF5Kys7Ci0JCW1paUluZGljYXRvci52YWx1ZSA9IHJlYWRsKCZtYWMtPm1paV9tZ210X2luZGljYXRvci52YWx1ZSk7Ci0JfSB3aGlsZSAobWlpSW5kaWNhdG9yLmJpdHMuYnVzeSAmJiBkZWxheSA8IDEwMCk7CisJCW1paUluZGljYXRvciA9IHJlYWRsKCZtYWMtPm1paV9tZ210X2luZGljYXRvcik7CisJfSB3aGlsZSAoKG1paUluZGljYXRvciAmIE1HTVRfQlVTWSkgJiYgZGVsYXkgPCAxMDApOwogCiAJLyogSWYgd2UgaGl0IHRoZSBtYXggZGVsYXksIHdlIGNvdWxkIG5vdCB3cml0ZSB0aGUgcmVnaXN0ZXIgKi8KIAlpZiAoZGVsYXkgPT0gMTAwKSB7Ci0JCXVpbnQxNl90IFRlbXBWYWx1ZTsKKwkJdTE2IFRlbXBWYWx1ZTsKIAotCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQlkZXZfd2FybigmZXRkZXYtPnBkZXYtPmRldiwKIAkJICAgICJ4Y3ZyUmVnIDB4JTA4eCBjb3VsZCBub3QgYmUgd3JpdHRlbiIsIHhjdnJSZWcpOwotCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LCAic3RhdHVzIGlzICAweCUwOHhcbiIsCi0JCQkgICAgbWlpSW5kaWNhdG9yLnZhbHVlKTsKLQkJZGV2X3dhcm4oJmFkYXB0ZXItPnBkZXYtPmRldiwgImNvbW1hbmQgaXMgIDB4JTA4eFxuIiwKLQkJCSAgICByZWFkbCgmbWFjLT5taWlfbWdtdF9jbWQudmFsdWUpKTsKKwkJZGV2X3dhcm4oJmV0ZGV2LT5wZGV2LT5kZXYsICJzdGF0dXMgaXMgIDB4JTA4eFxuIiwKKwkJCSAgICBtaWlJbmRpY2F0b3IpOworCQlkZXZfd2FybigmZXRkZXYtPnBkZXYtPmRldiwgImNvbW1hbmQgaXMgIDB4JTA4eFxuIiwKKwkJCSAgICByZWFkbCgmbWFjLT5taWlfbWdtdF9jbWQpKTsKIAotCQlNaVJlYWQoYWRhcHRlciwgeGN2clJlZywgJlRlbXBWYWx1ZSk7CisJCU1pUmVhZChldGRldiwgeGN2clJlZywgJlRlbXBWYWx1ZSk7CiAKIAkJc3RhdHVzID0gLUVJTzsKIAl9Ci0KIAkvKiBTdG9wIHRoZSB3cml0ZSBvcGVyYXRpb24gKi8KLQl3cml0ZWwoMCwgJm1hYy0+bWlpX21nbXRfY21kLnZhbHVlKTsKKwl3cml0ZWwoMCwgJm1hYy0+bWlpX21nbXRfY21kKTsKIAogCS8qIHNldCB0aGUgcmVnaXN0ZXJzIHdlIHRvdWNoZWQgYmFjayB0byB0aGUgc3RhdGUgYXQgd2hpY2ggd2UgZW50ZXJlZAogCSAqIHRoaXMgZnVuY3Rpb24KIAkgKi8KLQl3cml0ZWwobWlpQWRkci52YWx1ZSwgJm1hYy0+bWlpX21nbXRfYWRkci52YWx1ZSk7Ci0Jd3JpdGVsKG1paUNtZC52YWx1ZSwgJm1hYy0+bWlpX21nbXRfY21kLnZhbHVlKTsKKwl3cml0ZWwobWlpQWRkciwgJm1hYy0+bWlpX21nbXRfYWRkcik7CisJd3JpdGVsKG1paUNtZCwgJm1hYy0+bWlpX21nbXRfY21kKTsKIAogCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qKgogICogZXQxMzF4X3hjdnJfZmluZCAtIEZpbmQgdGhlIFBIWSBJRAotICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqIEBldGRldjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogICoKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvbiBmYWlsdXJlIChhcyBkZWZpbmVkIGluIGVycm5vLmgpCiAgKi8KLWludCBldDEzMXhfeGN2cl9maW5kKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKK2ludCBldDEzMXhfeGN2cl9maW5kKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCiB7Ci0JaW50IHN0YXR1cyA9IC1FTk9ERVY7Ci0JdWludDhfdCB4Y3ZyX2FkZHI7CisJdTggeGN2cl9hZGRyOwogCU1JX0lEUjFfdCBpZHIxOwogCU1JX0lEUjJfdCBpZHIyOwotCXVpbnQzMl90IHhjdnJfaWQ7CisJdTMyIHhjdnJfaWQ7CiAKIAkvKiBXZSBuZWVkIHRvIGdldCB4Y3ZyIGlkIGFuZCBhZGRyZXNzIHdlIGp1c3QgZ2V0IHRoZSBmaXJzdCBvbmUgKi8KIAlmb3IgKHhjdnJfYWRkciA9IDA7IHhjdnJfYWRkciA8IDMyOyB4Y3ZyX2FkZHIrKykgewogCQkvKiBSZWFkIHRoZSBJRCBmcm9tIHRoZSBQSFkgKi8KLQkJUGh5TWlSZWFkKGFkYXB0ZXIsIHhjdnJfYWRkciwKLQkJCSAgKHVpbnQ4X3QpIG9mZnNldG9mKE1JX1JFR1NfdCwgaWRyMSksCisJCVBoeU1pUmVhZChldGRldiwgeGN2cl9hZGRyLAorCQkJICAodTgpIG9mZnNldG9mKE1JX1JFR1NfdCwgaWRyMSksCiAJCQkgICZpZHIxLnZhbHVlKTsKLQkJUGh5TWlSZWFkKGFkYXB0ZXIsIHhjdnJfYWRkciwKLQkJCSAgKHVpbnQ4X3QpIG9mZnNldG9mKE1JX1JFR1NfdCwgaWRyMiksCisJCVBoeU1pUmVhZChldGRldiwgeGN2cl9hZGRyLAorCQkJICAodTgpIG9mZnNldG9mKE1JX1JFR1NfdCwgaWRyMiksCiAJCQkgICZpZHIyLnZhbHVlKTsKIAotCQl4Y3ZyX2lkID0gKHVpbnQzMl90KSAoKGlkcjEudmFsdWUgPDwgMTYpIHwgaWRyMi52YWx1ZSk7CisJCXhjdnJfaWQgPSAodTMyKSAoKGlkcjEudmFsdWUgPDwgMTYpIHwgaWRyMi52YWx1ZSk7CiAKLQkJaWYgKChpZHIxLnZhbHVlICE9IDApICYmIChpZHIxLnZhbHVlICE9IDB4ZmZmZikpIHsKLQkJCWFkYXB0ZXItPlN0YXRzLnhjdnJfaWQgPSB4Y3ZyX2lkOwotCQkJYWRhcHRlci0+U3RhdHMueGN2cl9hZGRyID0geGN2cl9hZGRyOwotCi0JCQlzdGF0dXMgPSAwOwotCQkJYnJlYWs7CisJCWlmIChpZHIxLnZhbHVlICE9IDAgJiYgaWRyMS52YWx1ZSAhPSAweGZmZmYpIHsKKwkJCWV0ZGV2LT5TdGF0cy54Y3ZyX2lkID0geGN2cl9pZDsKKwkJCWV0ZGV2LT5TdGF0cy54Y3ZyX2FkZHIgPSB4Y3ZyX2FkZHI7CisJCQlyZXR1cm4gMDsKIAkJfQogCX0KLQlyZXR1cm4gc3RhdHVzOworCXJldHVybiAtRU5PREVWOworfQorCit2b2lkIEVUMTMxMF9QaHlSZXNldChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQoreworCU1pV3JpdGUoZXRkZXYsIFBIWV9DT05UUk9MLCAweDgwMDApOworfQorCisvKioKKyAqCUVUMTMxMF9QaHlQb3dlckRvd24JLQlQSFkgcG93ZXIgY29udHJvbAorICoJQGV0ZGV2OiBkZXZpY2UgdG8gY29udHJvbAorICoJQGRvd246IHRydWUgZm9yIG9mZi9mYWxzZSBmb3IgYmFjayBvbgorICoKKyAqCW9uZSBodW5kcmVkLCB0ZW4sIG9uZSB0aG91c2FuZCBtZWdzCisgKglIb3cgd291bGQgeW91IGxpa2UgdG8gaGF2ZSB5b3VyIExBTiBhY2Nlc3NlZAorICoJQ2FuJ3QgeW91IHNlZSB0aGF0IHRoaXMgY29kZSBwcm9jZXNzZWQKKyAqCVBoeSBwb3dlciwgcGh5IHBvd2VyLi4KKyAqLworCit2b2lkIEVUMTMxMF9QaHlQb3dlckRvd24oc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwgYm9vbCBkb3duKQoreworCXUxNiBkYXRhOworCisJTWlSZWFkKGV0ZGV2LCBQSFlfQ09OVFJPTCwgJmRhdGEpOworCWRhdGEgJj0gfjB4MDgwMDsJLyogUG93ZXIgVVAgKi8KKwlpZiAoZG93bikgLyogUG93ZXIgRE9XTiAqLworCQlkYXRhIHw9IDB4MDgwMDsKKwlNaVdyaXRlKGV0ZGV2LCBQSFlfQ09OVFJPTCwgZGF0YSk7Cit9CisKKy8qKgorICoJRVQxMzBfUGh5QXV0b05FZwktCWF1dG9uZWdvdGlhdGUgY29udHJvbAorICoJQGV0ZGV2OiBkZXZpY2UgdG8gY29udHJvbAorICoJQGVuYWJlOiBhdXRvbmVnIG9uL29mZgorICoKKyAqCVNldCB1cCB0aGUgYXV0b25lZ290aWF0aW9uIHN0YXRlIGFjY29yZGluZyB0byB3aGV0aGVyIHdlIHdpbGwgYmUKKyAqCW5lZ290aWF0aW5nIHRoZSBzdGF0ZSBvciBmb3JjaW5nIGEgc3BlZWQuCisgKi8KKworc3RhdGljIHZvaWQgRVQxMzEwX1BoeUF1dG9OZWcoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwgYm9vbCBlbmFibGUpCit7CisJdTE2IGRhdGE7CisKKwlNaVJlYWQoZXRkZXYsIFBIWV9DT05UUk9MLCAmZGF0YSk7CisJZGF0YSAmPSB+MHgxMDAwOwkvKiBBdXRvbmVnb3RpYXRpb24gT0ZGICovCisJaWYgKGVuYWJsZSkKKwkJZGF0YSB8PSAweDEwMDA7CQkvKiBBdXRvbmVnb3RpYXRpb24gT04gKi8KKwlNaVdyaXRlKGV0ZGV2LCBQSFlfQ09OVFJPTCwgZGF0YSk7Cit9CisKKy8qKgorICoJRVQxMzBfUGh5RHVwbGV4TW9kZQktCWR1cGxleCBjb250cm9sCisgKglAZXRkZXY6IGRldmljZSB0byBjb250cm9sCisgKglAZHVwbGV4OiBkdXBsZXggb24vb2ZmCisgKgorICoJU2V0IHVwIHRoZSBkdXBsZXggc3RhdGUgb24gdGhlIFBIWQorICovCisKK3N0YXRpYyB2b2lkIEVUMTMxMF9QaHlEdXBsZXhNb2RlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsIHUxNiBkdXBsZXgpCit7CisJdTE2IGRhdGE7CisKKwlNaVJlYWQoZXRkZXYsIFBIWV9DT05UUk9MLCAmZGF0YSk7CisJZGF0YSAmPSB+MHgxMDA7CQkvKiBTZXQgSGFsZiBEdXBsZXggKi8KKwlpZiAoZHVwbGV4ID09IFRSVUVQSFlfRFVQTEVYX0ZVTEwpCisJCWRhdGEgfD0gMHgxMDA7CS8qIFNldCBGdWxsIER1cGxleCAqLworCU1pV3JpdGUoZXRkZXYsIFBIWV9DT05UUk9MLCBkYXRhKTsKK30KKworLyoqCisgKglFVDEzMF9QaHlTcGVlZFNlbGVjdAktCXNwZWVkIGNvbnRyb2wKKyAqCUBldGRldjogZGV2aWNlIHRvIGNvbnRyb2wKKyAqCUBkdXBsZXg6IGR1cGxleCBvbi9vZmYKKyAqCisgKglTZXQgdGhlIHNwZWVkIG9mIG91ciBQSFkuCisgKi8KKworc3RhdGljIHZvaWQgRVQxMzEwX1BoeVNwZWVkU2VsZWN0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsIHUxNiBzcGVlZCkKK3sKKwl1MTYgZGF0YTsKKwlzdGF0aWMgY29uc3QgdTE2IGJpdHNbM109ezB4MDAwMCwgMHgyMDAwLCAweDAwNDB9OworCisJLyogUmVhZCB0aGUgUEhZIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlNaVJlYWQoZXRkZXYsIFBIWV9DT05UUk9MLCAmZGF0YSk7CisJLyogQ2xlYXIgYWxsIFNwZWVkIHNldHRpbmdzIChCaXRzIDYsIDEzKSAqLworCWRhdGEgJj0gfjB4MjA0MDsKKwkvKiBXcml0ZSBiYWNrIHRoZSBuZXcgc3BlZWQgKi8KKwlNaVdyaXRlKGV0ZGV2LCBQSFlfQ09OVFJPTCwgZGF0YSB8IGJpdHNbc3BlZWRdKTsKK30KKworLyoqCisgKglFVDEzMTBfUGh5TGlua1N0YXR1cwktCXJlYWQgbGluayBzdGF0ZQorICoJQGV0ZGV2OiBkZXZpY2UgdG8gcmVhZAorICoJQGxpbmtfc3RhdHVzOiByZXBvcnRlZCBsaW5rIHN0YXRlCisgKglAYXV0b25lZzogcmVwb3J0ZWQgYXV0b25lZ290aWF0aW9uIHN0YXRlIChjb21wbGV0ZS9pbmNvbXBsZXRlL2Rpc2FibGVkKQorICoJQGxpbmtzcGVlZDogcmV0dXJuZWRsaW5rIHNwZWVkIGluIHVzZQorICoJQGR1cGxleF9tb2RlOiByZXBvcnRlZCBoYWxmL2Z1bGwgZHVwbGV4IHN0YXRlCisgKglAbWRpX21kaXg6IG5vdCB5ZXQgd29ya2luZworICoJQG1hc3RlcnNsYXZlOiByZXBvcnQgd2hldGhlciB3ZSBhcmUgbWFzdGVyIG9yIHNsYXZlCisgKglAcG9sYXJpdHk6IGxpbmsgcG9sYXJpdHkKKyAqCisgKglJIGNhbiByZWFkIHlvdXIgbGFuIGxpa2UgYSBtYWdhemluZQorICoJSSBzZWUgaWYgeW91ciB1cAorICoJSSBrbm93IHlvdXIgbGluayBzcGVlZAorICoJSSBzZWUgYWxsIHRoZSBzZXR0aW5nIHRoYXQgeW91J2QgcmF0aGVyIGtlZXAKKyAqLworCitzdGF0aWMgdm9pZCBFVDEzMTBfUGh5TGlua1N0YXR1cyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LAorCQkJICB1OCAqbGlua19zdGF0dXMsCisJCQkgIHUzMiAqYXV0b25lZywKKwkJCSAgdTMyICpsaW5rc3BlZWQsCisJCQkgIHUzMiAqZHVwbGV4X21vZGUsCisJCQkgIHUzMiAqbWRpX21kaXgsCisJCQkgIHUzMiAqbWFzdGVyc2xhdmUsIHUzMiAqcG9sYXJpdHkpCit7CisJdTE2IG1pc3RhdHVzID0gMDsKKwl1MTYgaXMxMDAwQmFzZVQgPSAwOworCXUxNiB2bWlfcGh5c3RhdHVzID0gMDsKKwl1MTYgY29udHJvbCA9IDA7CisKKwlNaVJlYWQoZXRkZXYsIFBIWV9TVEFUVVMsICZtaXN0YXR1cyk7CisJTWlSZWFkKGV0ZGV2LCBQSFlfMTAwMF9TVEFUVVMsICZpczEwMDBCYXNlVCk7CisJTWlSZWFkKGV0ZGV2LCBQSFlfUEhZX1NUQVRVUywgJnZtaV9waHlzdGF0dXMpOworCU1pUmVhZChldGRldiwgUEhZX0NPTlRST0wsICZjb250cm9sKTsKKworCSpsaW5rX3N0YXR1cyA9ICh2bWlfcGh5c3RhdHVzICYgMHgwMDQwKSA/IDEgOiAwOworCSphdXRvbmVnID0gKGNvbnRyb2wgJiAweDEwMDApID8gKCh2bWlfcGh5c3RhdHVzICYgMHgwMDIwKSA/CisJCQkJCSAgICBUUlVFUEhZX0FORUdfQ09NUExFVEUgOgorCQkJCQkgICAgVFJVRVBIWV9BTkVHX05PVF9DT01QTEVURSkgOgorCQkgICAgVFJVRVBIWV9BTkVHX0RJU0FCTEVEOworCSpsaW5rc3BlZWQgPSAodm1pX3BoeXN0YXR1cyAmIDB4MDMwMCkgPj4gODsKKwkqZHVwbGV4X21vZGUgPSAodm1pX3BoeXN0YXR1cyAmIDB4MDA4MCkgPj4gNzsKKwkvKiBOT1RFOiBOZWVkIHRvIGNvbXBsZXRlIHRoaXMgKi8KKwkqbWRpX21kaXggPSAwOworCisJKm1hc3RlcnNsYXZlID0gKGlzMTAwMEJhc2VUICYgMHg0MDAwKSA/CisJCQlUUlVFUEhZX0NGR19NQVNURVIgOiBUUlVFUEhZX0NGR19TTEFWRTsKKwkqcG9sYXJpdHkgPSAodm1pX3BoeXN0YXR1cyAmIDB4MDQwMCkgPworCQkJVFJVRVBIWV9QT0xBUklUWV9JTlZFUlRFRCA6IFRSVUVQSFlfUE9MQVJJVFlfTk9STUFMOworfQorCitzdGF0aWMgdm9pZCBFVDEzMTBfUGh5QW5kT3JSZWcoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwKKwkJCXUxNiByZWdudW0sIHUxNiBhbmRNYXNrLCB1MTYgb3JNYXNrKQoreworCXUxNiByZWc7CisKKwlNaVJlYWQoZXRkZXYsIHJlZ251bSwgJnJlZyk7CisJcmVnICY9IGFuZE1hc2s7CisJcmVnIHw9IG9yTWFzazsKKwlNaVdyaXRlKGV0ZGV2LCByZWdudW0sIHJlZyk7Cit9CisKKy8qIFN0aWxsIHVzZWQgZnJvbSBfbWFjICBmb3IgQklUX1JFQUQgKi8KK3ZvaWQgRVQxMzEwX1BoeUFjY2Vzc01pQml0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsIHUxNiBhY3Rpb24sCisJCQkgICB1MTYgcmVnbnVtLCB1MTYgYml0bnVtLCB1OCAqdmFsdWUpCit7CisJdTE2IHJlZzsKKwl1MTYgbWFzayA9IDB4MDAwMSA8PCBiaXRudW07CisKKwkvKiBSZWFkIHRoZSByZXF1ZXN0ZWQgcmVnaXN0ZXIgKi8KKwlNaVJlYWQoZXRkZXYsIHJlZ251bSwgJnJlZyk7CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgVFJVRVBIWV9CSVRfUkVBRDoKKwkJKnZhbHVlID0gKHJlZyAmIG1hc2spID4+IGJpdG51bTsKKwkJYnJlYWs7CisKKwljYXNlIFRSVUVQSFlfQklUX1NFVDoKKwkJTWlXcml0ZShldGRldiwgcmVnbnVtLCByZWcgfCBtYXNrKTsKKwkJYnJlYWs7CisKKwljYXNlIFRSVUVQSFlfQklUX0NMRUFSOgorCQlNaVdyaXRlKGV0ZGV2LCByZWdudW0sIHJlZyAmIH5tYXNrKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgRVQxMzEwX1BoeUFkdmVydGlzZTEwMDBCYXNlVChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LAorCQkJCSAgdTE2IGR1cGxleCkKK3sKKwl1MTYgZGF0YTsKKworCS8qIFJlYWQgdGhlIFBIWSAxMDAwIEJhc2UtVCBDb250cm9sIFJlZ2lzdGVyICovCisJTWlSZWFkKGV0ZGV2LCBQSFlfMTAwMF9DT05UUk9MLCAmZGF0YSk7CisKKwkvKiBDbGVhciBCaXRzIDgsOSAqLworCWRhdGEgJj0gfjB4MDMwMDsKKworCXN3aXRjaCAoZHVwbGV4KSB7CisJY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORToKKwkJLyogRHVwbGV4IGFscmVhZHkgY2xlYXJlZCwgZG8gbm90aGluZyAqLworCQlicmVhazsKKworCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX0ZVTEw6CisJCS8qIFNldCBCaXQgOSAqLworCQlkYXRhIHw9IDB4MDIwMDsKKwkJYnJlYWs7CisKKwljYXNlIFRSVUVQSFlfQURWX0RVUExFWF9IQUxGOgorCQkvKiBTZXQgQml0IDggKi8KKwkJZGF0YSB8PSAweDAxMDA7CisJCWJyZWFrOworCisJY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfQk9USDoKKwlkZWZhdWx0OgorCQlkYXRhIHw9IDB4MDMwMDsKKwkJYnJlYWs7CisJfQorCisJLyogV3JpdGUgYmFjayBhZHZlcnRpc2VtZW50ICovCisJTWlXcml0ZShldGRldiwgUEhZXzEwMDBfQ09OVFJPTCwgZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIEVUMTMxMF9QaHlBZHZlcnRpc2UxMDBCYXNlVChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LAorCQkJCSB1MTYgZHVwbGV4KQoreworCXUxNiBkYXRhOworCisJLyogUmVhZCB0aGUgQXV0b25lZ290aWF0aW9uIFJlZ2lzdGVyICgxMC8xMDApICovCisJTWlSZWFkKGV0ZGV2LCBQSFlfQVVUT19BRFZFUlRJU0VNRU5ULCAmZGF0YSk7CisKKwkvKiBDbGVhciBiaXRzIDcsOCAqLworCWRhdGEgJj0gfjB4MDE4MDsKKworCXN3aXRjaCAoZHVwbGV4KSB7CisJY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORToKKwkJLyogRHVwbGV4IGFscmVhZHkgY2xlYXJlZCwgZG8gbm90aGluZyAqLworCQlicmVhazsKKworCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX0ZVTEw6CisJCS8qIFNldCBCaXQgOCAqLworCQlkYXRhIHw9IDB4MDEwMDsKKwkJYnJlYWs7CisKKwljYXNlIFRSVUVQSFlfQURWX0RVUExFWF9IQUxGOgorCQkvKiBTZXQgQml0IDcgKi8KKwkJZGF0YSB8PSAweDAwODA7CisJCWJyZWFrOworCisJY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfQk9USDoKKwlkZWZhdWx0OgorCQkvKiBTZXQgQml0cyA3LDggKi8KKwkJZGF0YSB8PSAweDAxODA7CisJCWJyZWFrOworCX0KKworCS8qIFdyaXRlIGJhY2sgYWR2ZXJ0aXNlbWVudCAqLworCU1pV3JpdGUoZXRkZXYsIFBIWV9BVVRPX0FEVkVSVElTRU1FTlQsIGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBFVDEzMTBfUGh5QWR2ZXJ0aXNlMTBCYXNlVChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LAorCQkJCXUxNiBkdXBsZXgpCit7CisJdTE2IGRhdGE7CisKKwkvKiBSZWFkIHRoZSBBdXRvbmVnb3RpYXRpb24gUmVnaXN0ZXIgKDEwLzEwMCkgKi8KKwlNaVJlYWQoZXRkZXYsIFBIWV9BVVRPX0FEVkVSVElTRU1FTlQsICZkYXRhKTsKKworCS8qIENsZWFyIGJpdHMgNSw2ICovCisJZGF0YSAmPSB+MHgwMDYwOworCisJc3dpdGNoIChkdXBsZXgpIHsKKwljYXNlIFRSVUVQSFlfQURWX0RVUExFWF9OT05FOgorCQkvKiBEdXBsZXggYWxyZWFkeSBjbGVhcmVkLCBkbyBub3RoaW5nICovCisJCWJyZWFrOworCisJY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfRlVMTDoKKwkJLyogU2V0IEJpdCA2ICovCisJCWRhdGEgfD0gMHgwMDQwOworCQlicmVhazsKKworCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX0hBTEY6CisJCS8qIFNldCBCaXQgNSAqLworCQlkYXRhIHw9IDB4MDAyMDsKKwkJYnJlYWs7CisKKwljYXNlIFRSVUVQSFlfQURWX0RVUExFWF9CT1RIOgorCWRlZmF1bHQ6CisJCS8qIFNldCBCaXRzIDUsNiAqLworCQlkYXRhIHw9IDB4MDA2MDsKKwkJYnJlYWs7CisJfQorCisJLyogV3JpdGUgYmFjayBhZHZlcnRpc2VtZW50ICovCisJTWlXcml0ZShldGRldiwgUEhZX0FVVE9fQURWRVJUSVNFTUVOVCwgZGF0YSk7CiB9CiAKIC8qKgogICogZXQxMzF4X3NldHBoeV9ub3JtYWwgLSBTZXQgUEhZIGZvciBub3JtYWwgb3BlcmF0aW9uLgotICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqIEBldGRldjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogICoKICAqIFVzZWQgYnkgUG93ZXIgTWFuYWdlbWVudCB0byBmb3JjZSB0aGUgUEhZIGludG8gMTAgQmFzZSBUIGhhbGYtZHVwbGV4IG1vZGUsCiAgKiB3aGVuIGdvaW5nIHRvIEQzIGluIFdPTCBtb2RlLiBBbHNvIHVzZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uIHRvIHNldCB0aGUKICAqIFBIWSBmb3Igbm9ybWFsIG9wZXJhdGlvbi4KICAqLwotaW50IGV0MTMxeF9zZXRwaHlfbm9ybWFsKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKK3ZvaWQgZXQxMzF4X3NldHBoeV9ub3JtYWwoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKIHsKLQlpbnQgc3RhdHVzOwotCiAJLyogTWFrZSBzdXJlIHRoZSBQSFkgaXMgcG93ZXJlZCB1cCAqLwotCUVUMTMxMF9QaHlQb3dlckRvd24oYWRhcHRlciwgMCk7Ci0Jc3RhdHVzID0gZXQxMzF4X3hjdnJfaW5pdChhZGFwdGVyKTsKLQlyZXR1cm4gc3RhdHVzOworCUVUMTMxMF9QaHlQb3dlckRvd24oZXRkZXYsIDApOworCWV0MTMxeF94Y3ZyX2luaXQoZXRkZXYpOwogfQogCisKIC8qKgogICogZXQxMzF4X3hjdnJfaW5pdCAtIEluaXQgdGhlIHBoeSBpZiB3ZSBhcmUgc2V0dGluZyBpdCBpbnRvIGZvcmNlIG1vZGUKLSAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb24gZmFpbHVyZSAoYXMgZGVmaW5lZCBpbiBlcnJuby5oKQogICovCi1zdGF0aWMgaW50IGV0MTMxeF94Y3ZyX2luaXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIHZvaWQgZXQxMzF4X3hjdnJfaW5pdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQogewotCWludCBzdGF0dXMgPSAwOwogCU1JX0lNUl90IGltcjsKIAlNSV9JU1JfdCBpc3I7CiAJTUlfTENSMl90IGxjcjI7CiAKIAkvKiBaZXJvIG91dCB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUgdmFyaWFibGUgcmVwcmVzZW50aW5nIEJNU1IgKi8KLQlhZGFwdGVyLT5CbXNyLnZhbHVlID0gMDsKKwlldGRldi0+Qm1zci52YWx1ZSA9IDA7CiAKLQlNaVJlYWQoYWRhcHRlciwgKHVpbnQ4X3QpIG9mZnNldG9mKE1JX1JFR1NfdCwgaXNyKSwgJmlzci52YWx1ZSk7Ci0KLQlNaVJlYWQoYWRhcHRlciwgKHVpbnQ4X3QpIG9mZnNldG9mKE1JX1JFR1NfdCwgaW1yKSwgJmltci52YWx1ZSk7CisJTWlSZWFkKGV0ZGV2LCAodTgpIG9mZnNldG9mKE1JX1JFR1NfdCwgaXNyKSwgJmlzci52YWx1ZSk7CisJTWlSZWFkKGV0ZGV2LCAodTgpIG9mZnNldG9mKE1JX1JFR1NfdCwgaW1yKSwgJmltci52YWx1ZSk7CiAKIAkvKiBTZXQgdGhlIGxpbmsgc3RhdHVzIGludGVycnVwdCBvbmx5LiAgQmFkIGJlaGF2aW9yIHdoZW4gbGluayBzdGF0dXMKIAkgKiBhbmQgYXV0byBuZWcgYXJlIHNldCwgd2UgcnVuIGludG8gYSBuZXN0ZWQgaW50ZXJydXB0IHByb2JsZW0KQEAgLTMzOCw3ICs1OTgsNyBAQAogCWltci5iaXRzLmxpbmtfc3RhdHVzID0gMHgxOwogCWltci5iaXRzLmF1dG9uZWdfc3RhdHVzID0gMHgxOwogCi0JTWlXcml0ZShhZGFwdGVyLCAodWludDhfdCkgb2Zmc2V0b2YoTUlfUkVHU190LCBpbXIpLCBpbXIudmFsdWUpOworCU1pV3JpdGUoZXRkZXYsICh1OCkgb2Zmc2V0b2YoTUlfUkVHU190LCBpbXIpLCBpbXIudmFsdWUpOwogCiAJLyogU2V0IHRoZSBMRUQgYmVoYXZpb3Igc3VjaCB0aGF0IExFRCAxIGluZGljYXRlcyBzcGVlZCAob2ZmID0KIAkgKiAxME1iaXRzLCBibGluayA9IDEwME1iaXRzLCBvbiA9IDEwMDBNYml0cykgYW5kIExFRCAyIGluZGljYXRlcwpAQCAtMzQ4LDExMSArNjA4LDEzOCBAQAogCSAqIHZlbmRvcnM7IFRoZSBMRUQgYmVoYXZpb3IgaXMgbm93IGRldGVybWluZWQgYnkgdmVuZG9yIGRhdGEgaW4gdGhlCiAJICogRUVQUk9NLiBIb3dldmVyLCB0aGUgYWJvdmUgZGVzY3JpcHRpb24gaXMgdGhlIGRlZmF1bHQuCiAJICovCi0JaWYgKChhZGFwdGVyLT5lZXByb21EYXRhWzFdICYgMHg0KSA9PSAwKSB7Ci0JCU1pUmVhZChhZGFwdGVyLCAodWludDhfdCkgb2Zmc2V0b2YoTUlfUkVHU190LCBsY3IyKSwKKwlpZiAoKGV0ZGV2LT5lZXByb21EYXRhWzFdICYgMHg0KSA9PSAwKSB7CisJCU1pUmVhZChldGRldiwgKHU4KSBvZmZzZXRvZihNSV9SRUdTX3QsIGxjcjIpLAogCQkgICAgICAgJmxjcjIudmFsdWUpOwotCQlpZiAoKGFkYXB0ZXItPmVlcHJvbURhdGFbMV0gJiAweDgpID09IDApCisJCWlmICgoZXRkZXYtPmVlcHJvbURhdGFbMV0gJiAweDgpID09IDApCiAJCQlsY3IyLmJpdHMubGVkX3R4X3J4ID0gMHgzOwogCQllbHNlCiAJCQlsY3IyLmJpdHMubGVkX3R4X3J4ID0gMHg0OwogCQlsY3IyLmJpdHMubGVkX2xpbmsgPSAweGE7Ci0JCU1pV3JpdGUoYWRhcHRlciwgKHVpbnQ4X3QpIG9mZnNldG9mKE1JX1JFR1NfdCwgbGNyMiksCisJCU1pV3JpdGUoZXRkZXYsICh1OCkgb2Zmc2V0b2YoTUlfUkVHU190LCBsY3IyKSwKIAkJCWxjcjIudmFsdWUpOwogCX0KIAogCS8qIERldGVybWluZSBpZiB3ZSBuZWVkIHRvIGdvIGludG8gYSBmb3JjZSBtb2RlIGFuZCBzZXQgaXQgKi8KLQlpZiAoYWRhcHRlci0+QWlGb3JjZVNwZWVkID09IDAgJiYgYWRhcHRlci0+QWlGb3JjZURweCA9PSAwKSB7Ci0JCWlmICgoYWRhcHRlci0+UmVnaXN0cnlGbG93Q29udHJvbCA9PSBUeE9ubHkpIHx8Ci0JCSAgICAoYWRhcHRlci0+UmVnaXN0cnlGbG93Q29udHJvbCA9PSBCb3RoKSkgewotCQkJRVQxMzEwX1BoeUFjY2Vzc01pQml0KGFkYXB0ZXIsCisJaWYgKGV0ZGV2LT5BaUZvcmNlU3BlZWQgPT0gMCAmJiBldGRldi0+QWlGb3JjZURweCA9PSAwKSB7CisJCWlmIChldGRldi0+UmVnaXN0cnlGbG93Q29udHJvbCA9PSBUeE9ubHkgfHwKKwkJICAgIGV0ZGV2LT5SZWdpc3RyeUZsb3dDb250cm9sID09IEJvdGgpCisJCQlFVDEzMTBfUGh5QWNjZXNzTWlCaXQoZXRkZXYsCiAJCQkJCSAgICAgIFRSVUVQSFlfQklUX1NFVCwgNCwgMTEsIE5VTEwpOwotCQl9IGVsc2UgewotCQkJRVQxMzEwX1BoeUFjY2Vzc01pQml0KGFkYXB0ZXIsCisJCWVsc2UKKwkJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChldGRldiwKIAkJCQkJICAgICAgVFJVRVBIWV9CSVRfQ0xFQVIsIDQsIDExLCBOVUxMKTsKLQkJfQogCi0JCWlmIChhZGFwdGVyLT5SZWdpc3RyeUZsb3dDb250cm9sID09IEJvdGgpIHsKLQkJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChhZGFwdGVyLAorCQlpZiAoZXRkZXYtPlJlZ2lzdHJ5Rmxvd0NvbnRyb2wgPT0gQm90aCkKKwkJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChldGRldiwKIAkJCQkJICAgICAgVFJVRVBIWV9CSVRfU0VULCA0LCAxMCwgTlVMTCk7Ci0JCX0gZWxzZSB7Ci0JCQlFVDEzMTBfUGh5QWNjZXNzTWlCaXQoYWRhcHRlciwKKwkJZWxzZQorCQkJRVQxMzEwX1BoeUFjY2Vzc01pQml0KGV0ZGV2LAogCQkJCQkgICAgICBUUlVFUEhZX0JJVF9DTEVBUiwgNCwgMTAsIE5VTEwpOwotCQl9CiAKIAkJLyogU2V0IHRoZSBwaHkgdG8gYXV0b25lZ290aWF0aW9uICovCi0JCUVUMTMxMF9QaHlBdXRvTmVnKGFkYXB0ZXIsIHRydWUpOworCQlFVDEzMTBfUGh5QXV0b05lZyhldGRldiwgdHJ1ZSk7CiAKIAkJLyogTk9URSAtIERvIHdlIG5lZWQgdGhpcz8gKi8KLQkJRVQxMzEwX1BoeUFjY2Vzc01pQml0KGFkYXB0ZXIsIFRSVUVQSFlfQklUX1NFVCwgMCwgOSwgTlVMTCk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfSBlbHNlIHsKLQkJRVQxMzEwX1BoeUF1dG9OZWcoYWRhcHRlciwgZmFsc2UpOwotCi0JCS8qIFNldCB0byB0aGUgY29ycmVjdCBmb3JjZSBtb2RlLiAqLwotCQlpZiAoYWRhcHRlci0+QWlGb3JjZURweCAhPSAxKSB7Ci0JCQlpZiAoKGFkYXB0ZXItPlJlZ2lzdHJ5Rmxvd0NvbnRyb2wgPT0gVHhPbmx5KSB8fAotCQkJICAgIChhZGFwdGVyLT5SZWdpc3RyeUZsb3dDb250cm9sID09IEJvdGgpKSB7Ci0JCQkJRVQxMzEwX1BoeUFjY2Vzc01pQml0KGFkYXB0ZXIsCi0JCQkJCQkgICAgICBUUlVFUEhZX0JJVF9TRVQsIDQsIDExLAotCQkJCQkJICAgICAgTlVMTCk7Ci0JCQl9IGVsc2UgewotCQkJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChhZGFwdGVyLAotCQkJCQkJICAgICAgVFJVRVBIWV9CSVRfQ0xFQVIsIDQsIDExLAotCQkJCQkJICAgICAgTlVMTCk7Ci0JCQl9Ci0KLQkJCWlmIChhZGFwdGVyLT5SZWdpc3RyeUZsb3dDb250cm9sID09IEJvdGgpIHsKLQkJCQlFVDEzMTBfUGh5QWNjZXNzTWlCaXQoYWRhcHRlciwKLQkJCQkJCSAgICAgIFRSVUVQSFlfQklUX1NFVCwgNCwgMTAsCi0JCQkJCQkgICAgICBOVUxMKTsKLQkJCX0gZWxzZSB7Ci0JCQkJRVQxMzEwX1BoeUFjY2Vzc01pQml0KGFkYXB0ZXIsCi0JCQkJCQkgICAgICBUUlVFUEhZX0JJVF9DTEVBUiwgNCwgMTAsCi0JCQkJCQkgICAgICBOVUxMKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChhZGFwdGVyLAotCQkJCQkgICAgICBUUlVFUEhZX0JJVF9DTEVBUiwgNCwgMTAsIE5VTEwpOwotCQkJRVQxMzEwX1BoeUFjY2Vzc01pQml0KGFkYXB0ZXIsCi0JCQkJCSAgICAgIFRSVUVQSFlfQklUX0NMRUFSLCA0LCAxMSwgTlVMTCk7Ci0JCX0KLQotCQlzd2l0Y2ggKGFkYXB0ZXItPkFpRm9yY2VTcGVlZCkgewotCQljYXNlIDEwOgotCQkJaWYgKGFkYXB0ZXItPkFpRm9yY2VEcHggPT0gMSkKLQkJCQlUUEFMX1NldFBoeTEwSGFsZkR1cGxleChhZGFwdGVyKTsKLQkJCWVsc2UgaWYgKGFkYXB0ZXItPkFpRm9yY2VEcHggPT0gMikKLQkJCQlUUEFMX1NldFBoeTEwRnVsbER1cGxleChhZGFwdGVyKTsKLQkJCWVsc2UKLQkJCQlUUEFMX1NldFBoeTEwRm9yY2UoYWRhcHRlcik7Ci0JCQlicmVhazsKLQkJY2FzZSAxMDA6Ci0JCQlpZiAoYWRhcHRlci0+QWlGb3JjZURweCA9PSAxKQotCQkJCVRQQUxfU2V0UGh5MTAwSGFsZkR1cGxleChhZGFwdGVyKTsKLQkJCWVsc2UgaWYgKGFkYXB0ZXItPkFpRm9yY2VEcHggPT0gMikKLQkJCQlUUEFMX1NldFBoeTEwMEZ1bGxEdXBsZXgoYWRhcHRlcik7Ci0JCQllbHNlCi0JCQkJVFBBTF9TZXRQaHkxMDBGb3JjZShhZGFwdGVyKTsKLQkJCWJyZWFrOwotCQljYXNlIDEwMDA6Ci0JCQlUUEFMX1NldFBoeTEwMDBGdWxsRHVwbGV4KGFkYXB0ZXIpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXR1cm4gc3RhdHVzOworCQlFVDEzMTBfUGh5QWNjZXNzTWlCaXQoZXRkZXYsIFRSVUVQSFlfQklUX1NFVCwgMCwgOSwgTlVMTCk7CisJCXJldHVybjsKIAl9CisKKwlFVDEzMTBfUGh5QXV0b05lZyhldGRldiwgZmFsc2UpOworCisJLyogU2V0IHRvIHRoZSBjb3JyZWN0IGZvcmNlIG1vZGUuICovCisJaWYgKGV0ZGV2LT5BaUZvcmNlRHB4ICE9IDEpIHsKKwkJaWYgKGV0ZGV2LT5SZWdpc3RyeUZsb3dDb250cm9sID09IFR4T25seSB8fAorCQkgICAgZXRkZXYtPlJlZ2lzdHJ5Rmxvd0NvbnRyb2wgPT0gQm90aCkKKwkJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChldGRldiwKKwkJCQkgICAgICBUUlVFUEhZX0JJVF9TRVQsIDQsIDExLCBOVUxMKTsKKwkJZWxzZQorCQkJRVQxMzEwX1BoeUFjY2Vzc01pQml0KGV0ZGV2LAorCQkJCQkgICAgICBUUlVFUEhZX0JJVF9DTEVBUiwgNCwgMTEsIE5VTEwpOworCisJCWlmIChldGRldi0+UmVnaXN0cnlGbG93Q29udHJvbCA9PSBCb3RoKQorCQkJRVQxMzEwX1BoeUFjY2Vzc01pQml0KGV0ZGV2LAorCQkJCQkgICAgICBUUlVFUEhZX0JJVF9TRVQsIDQsIDEwLCBOVUxMKTsKKwkJZWxzZQorCQkJRVQxMzEwX1BoeUFjY2Vzc01pQml0KGV0ZGV2LAorCQkJCQkgICAgICBUUlVFUEhZX0JJVF9DTEVBUiwgNCwgMTAsIE5VTEwpOworCX0gZWxzZSB7CisJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChldGRldiwgVFJVRVBIWV9CSVRfQ0xFQVIsIDQsIDEwLCBOVUxMKTsKKwkJRVQxMzEwX1BoeUFjY2Vzc01pQml0KGV0ZGV2LCBUUlVFUEhZX0JJVF9DTEVBUiwgNCwgMTEsIE5VTEwpOworCX0KKwlFVDEzMTBfUGh5UG93ZXJEb3duKGV0ZGV2LCAxKTsKKwlzd2l0Y2ggKGV0ZGV2LT5BaUZvcmNlU3BlZWQpIHsKKwljYXNlIDEwOgorCQkvKiBGaXJzdCB3ZSBuZWVkIHRvIHR1cm4gb2ZmIGFsbCBvdGhlciBhZHZlcnRpc2VtZW50ICovCisJCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDAwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9OT05FKTsKKwkJRVQxMzEwX1BoeUFkdmVydGlzZTEwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7CisJCWlmIChldGRldi0+QWlGb3JjZURweCA9PSAxKSB7CisJCQkvKiBTZXQgb3VyIGFkdmVydGlzZSB2YWx1ZXMgYWNjb3JkaW5nbHkgKi8KKwkJCUVUMTMxMF9QaHlBZHZlcnRpc2UxMEJhc2VUKGV0ZGV2LAorCQkJCQkJVFJVRVBIWV9BRFZfRFVQTEVYX0hBTEYpOworCQl9IGVsc2UgaWYgKGV0ZGV2LT5BaUZvcmNlRHB4ID09IDIpIHsKKwkJCS8qIFNldCBvdXIgYWR2ZXJ0aXNlIHZhbHVlcyBhY2NvcmRpbmdseSAqLworCQkJRVQxMzEwX1BoeUFkdmVydGlzZTEwQmFzZVQoZXRkZXYsCisJCQkJCQlUUlVFUEhZX0FEVl9EVVBMRVhfRlVMTCk7CisJCX0gZWxzZSB7CisJCQkvKiBEaXNhYmxlIGF1dG9uZWcgKi8KKwkJCUVUMTMxMF9QaHlBdXRvTmVnKGV0ZGV2LCBmYWxzZSk7CisJCQkvKiBEaXNhYmxlIHJlc3Qgb2YgdGhlIGFkdmVydGlzZW1lbnRzICovCisJCQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTBCYXNlVChldGRldiwKKwkJCQkJVFJVRVBIWV9BRFZfRFVQTEVYX05PTkUpOworCQkJLyogRm9yY2UgMTAgTWJwcyAqLworCQkJRVQxMzEwX1BoeVNwZWVkU2VsZWN0KGV0ZGV2LCBUUlVFUEhZX1NQRUVEXzEwTUJQUyk7CisJCQkvKiBGb3JjZSBGdWxsIGR1cGxleCAqLworCQkJRVQxMzEwX1BoeUR1cGxleE1vZGUoZXRkZXYsIFRSVUVQSFlfRFVQTEVYX0ZVTEwpOworCQl9CisJCWJyZWFrOworCWNhc2UgMTAwOgorCQkvKiBmaXJzdCB3ZSBuZWVkIHRvIHR1cm4gb2ZmIGFsbCBvdGhlciBhZHZlcnRpc2VtZW50ICovCisJCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDAwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9OT05FKTsKKwkJRVQxMzEwX1BoeUFkdmVydGlzZTEwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9OT05FKTsKKwkJaWYgKGV0ZGV2LT5BaUZvcmNlRHB4ID09IDEpIHsKKwkJCS8qIFNldCBvdXIgYWR2ZXJ0aXNlIHZhbHVlcyBhY2NvcmRpbmdseSAqLworCQkJRVQxMzEwX1BoeUFkdmVydGlzZTEwMEJhc2VUKGV0ZGV2LAorCQkJCQkJVFJVRVBIWV9BRFZfRFVQTEVYX0hBTEYpOworCQkJLyogU2V0IHNwZWVkICovCisJCQlFVDEzMTBfUGh5U3BlZWRTZWxlY3QoZXRkZXYsIFRSVUVQSFlfU1BFRURfMTAwTUJQUyk7CisJCX0gZWxzZSBpZiAoZXRkZXYtPkFpRm9yY2VEcHggPT0gMikgeworCQkJLyogU2V0IG91ciBhZHZlcnRpc2UgdmFsdWVzIGFjY29yZGluZ2x5ICovCisJCQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwQmFzZVQoZXRkZXYsCisJCQkJCQlUUlVFUEhZX0FEVl9EVVBMRVhfRlVMTCk7CisJCX0gZWxzZSB7CisJCQkvKiBEaXNhYmxlIGF1dG9uZWcgKi8KKwkJCUVUMTMxMF9QaHlBdXRvTmVnKGV0ZGV2LCBmYWxzZSk7CisJCQkvKiBEaXNhYmxlIG90aGVyIGFkdmVydGlzZW1lbnQgKi8KKwkJCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDBCYXNlVChldGRldiwKKwkJCQkJCVRSVUVQSFlfQURWX0RVUExFWF9OT05FKTsKKwkJCS8qIEZvcmNlIDEwMCBNYnBzICovCisJCQlFVDEzMTBfUGh5U3BlZWRTZWxlY3QoZXRkZXYsIFRSVUVQSFlfU1BFRURfMTAwTUJQUyk7CisJCQkvKiBGb3JjZSBGdWxsIGR1cGxleCAqLworCQkJRVQxMzEwX1BoeUR1cGxleE1vZGUoZXRkZXYsIFRSVUVQSFlfRFVQTEVYX0ZVTEwpOworCQl9CisJCWJyZWFrOworCWNhc2UgMTAwMDoKKwkJLyogZmlyc3Qgd2UgbmVlZCB0byB0dXJuIG9mZiBhbGwgb3RoZXIgYWR2ZXJ0aXNlbWVudCAqLworCQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9OT05FKTsKKwkJRVQxMzEwX1BoeUFkdmVydGlzZTEwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9OT05FKTsKKwkJLyogc2V0IG91ciBhZHZlcnRpc2UgdmFsdWVzIGFjY29yZGluZ2x5ICovCisJCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDAwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9GVUxMKTsKKwkJYnJlYWs7CisJfQorCUVUMTMxMF9QaHlQb3dlckRvd24oZXRkZXYsIDApOwogfQogCiB2b2lkIGV0MTMxeF9NaWlfY2hlY2soc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwKIAkJICAgICAgTUlfQk1TUl90IGJtc3IsIE1JX0JNU1JfdCBibXNyX2ludHMpCiB7Ci0JdWludDhfdCBsaW5rX3N0YXR1czsKLQl1aW50MzJfdCBhdXRvbmVnX3N0YXR1czsKLQl1aW50MzJfdCBzcGVlZDsKLQl1aW50MzJfdCBkdXBsZXg7Ci0JdWludDMyX3QgbWRpX21kaXg7Ci0JdWludDMyX3QgbWFzdGVyc2xhdmU7Ci0JdWludDMyX3QgcG9sYXJpdHk7CisJdTggbGlua19zdGF0dXM7CisJdTMyIGF1dG9uZWdfc3RhdHVzOworCXUzMiBzcGVlZDsKKwl1MzIgZHVwbGV4OworCXUzMiBtZGlfbWRpeDsKKwl1MzIgbWFzdGVyc2xhdmU7CisJdTMyIHBvbGFyaXR5OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoYm1zcl9pbnRzLmJpdHMubGlua19zdGF0dXMpIHsKQEAgLTQ2OSw5ICs3NTYsNyBAQAogCiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+TG9jaywgZmxhZ3MpOwogCi0JCQkvKiBEb24ndCBpbmRpY2F0ZSBzdGF0ZSBpZiB3ZSdyZSBpbiBsb29wYmFjayBtb2RlICovCi0JCQlpZiAoZXRkZXYtPlJlZ2lzdHJ5UGh5TG9vcGJrID09IGZhbHNlKQotCQkJCW5ldGlmX2NhcnJpZXJfb24oZXRkZXYtPm5ldGRldik7CisJCQluZXRpZl9jYXJyaWVyX29uKGV0ZGV2LT5uZXRkZXYpOwogCQl9IGVsc2UgewogCQkJZGV2X3dhcm4oJmV0ZGV2LT5wZGV2LT5kZXYsCiAJCQkgICAgIkxpbmsgZG93biAtIGNhYmxlIHByb2JsZW0gP1xuIik7CkBAIC00ODEsNyArNzY2LDcgQEAKIAkJCQkgKiBUcnVlUEhZPwogCQkJCSAqICYmIFRSVV9RdWVyeUNvcmVUeXBlKGV0ZGV2LT5oVHJ1ZVBoeSwgMCkgPT0gRU1JX1RSVUVQSFlfQTEzTykgewogCQkJCSAqLwotCQkJCXVpbnQxNl90IFJlZ2lzdGVyMTg7CisJCQkJdTE2IFJlZ2lzdGVyMTg7CiAKIAkJCQlNaVJlYWQoZXRkZXYsIDB4MTIsICZSZWdpc3RlcjE4KTsKIAkJCQlNaVdyaXRlKGV0ZGV2LCAweDEyLCBSZWdpc3RlcjE4IHwgMHg0KTsKQEAgLTUwNCwxMSArNzg5LDcgQEAKIAkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+TG9jaywKIAkJCQkJCSAgICAgICBmbGFncyk7CiAKLQkJCQkvKiBPbmx5IGluZGljYXRlIHN0YXRlIGlmIHdlJ3JlIGluIGxvb3BiYWNrCi0JCQkJICogbW9kZQotCQkJCSAqLwotCQkJCWlmIChldGRldi0+UmVnaXN0cnlQaHlMb29wYmsgPT0gZmFsc2UpCi0JCQkJCW5ldGlmX2NhcnJpZXJfb2ZmKGV0ZGV2LT5uZXRkZXYpOworCQkJCW5ldGlmX2NhcnJpZXJfb2ZmKGV0ZGV2LT5uZXRkZXYpOwogCQkJfQogCiAJCQlldGRldi0+bGlua3NwZWVkID0gMDsKQEAgLTU2MSw3ICs4NDIsNyBAQAogCQkJCSAqIFRydWVQSFk/CiAJCQkJICogJiYgVFJVX1F1ZXJ5Q29yZVR5cGUoZXRkZXYtPmhUcnVlUGh5LCAwKT09IEVNSV9UUlVFUEhZX0ExM08pIHsKIAkJCQkgKi8KLQkJCQl1aW50MTZfdCBSZWdpc3RlcjE4OworCQkJCXUxNiBSZWdpc3RlcjE4OwogCiAJCQkJTWlSZWFkKGV0ZGV2LCAweDEyLCAmUmVnaXN0ZXIxOCk7CiAJCQkJTWlXcml0ZShldGRldiwgMHgxMiwgUmVnaXN0ZXIxOCB8IDB4NCk7CkBAIC01ODMsMjEyICs4NjQsMTMgQEAKIAl9CiB9CiAKLS8qKgotICogVFBBTF9TZXRQaHkxMEhhbGZEdXBsZXggLSBGb3JjZSB0aGUgcGh5IGludG8gMTAgQmFzZSBUIEhhbGYgRHVwbGV4IG1vZGUuCi0gKiBAZXRkZXY6IHBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIgc3RydWN0dXJlCi0gKgotICogQWxzbyBzZXRzIHRoZSBNQUMgc28gaXQgaXMgc3luY2QgdXAgcHJvcGVybHkKLSAqLwotdm9pZCBUUEFMX1NldFBoeTEwSGFsZkR1cGxleChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQotewotCS8qIFBvd2VyIGRvd24gUEhZICovCi0JRVQxMzEwX1BoeVBvd2VyRG93bihldGRldiwgMSk7Ci0KLQkvKiBGaXJzdCB3ZSBuZWVkIHRvIHR1cm4gb2ZmIGFsbCBvdGhlciBhZHZlcnRpc2VtZW50ICovCi0JRVQxMzEwX1BoeUFkdmVydGlzZTEwMDBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkUpOwotCi0JRVQxMzEwX1BoeUFkdmVydGlzZTEwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7Ci0KLQkvKiBTZXQgb3VyIGFkdmVydGlzZSB2YWx1ZXMgYWNjb3JkaW5nbHkgKi8KLQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX0hBTEYpOwotCi0JLyogUG93ZXIgdXAgUEhZICovCi0JRVQxMzEwX1BoeVBvd2VyRG93bihldGRldiwgMCk7Ci19Ci0KLS8qKgotICogVFBBTF9TZXRQaHkxMEZ1bGxEdXBsZXggLSBGb3JjZSB0aGUgcGh5IGludG8gMTAgQmFzZSBUIEZ1bGwgRHVwbGV4IG1vZGUuCi0gKiBAZXRkZXY6IHBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIgc3RydWN0dXJlCi0gKgotICogQWxzbyBzZXRzIHRoZSBNQUMgc28gaXQgaXMgc3luY2QgdXAgcHJvcGVybHkKLSAqLwotdm9pZCBUUEFMX1NldFBoeTEwRnVsbER1cGxleChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQotewotCS8qIFBvd2VyIGRvd24gUEhZICovCi0JRVQxMzEwX1BoeVBvd2VyRG93bihldGRldiwgMSk7Ci0KLQkvKiBGaXJzdCB3ZSBuZWVkIHRvIHR1cm4gb2ZmIGFsbCBvdGhlciBhZHZlcnRpc2VtZW50ICovCi0JRVQxMzEwX1BoeUFkdmVydGlzZTEwMDBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkUpOwotCi0JRVQxMzEwX1BoeUFkdmVydGlzZTEwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7Ci0KLQkvKiBTZXQgb3VyIGFkdmVydGlzZSB2YWx1ZXMgYWNjb3JkaW5nbHkgKi8KLQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX0ZVTEwpOwotCi0JLyogUG93ZXIgdXAgUEhZICovCi0JRVQxMzEwX1BoeVBvd2VyRG93bihldGRldiwgMCk7Ci19Ci0KLS8qKgotICogVFBBTF9TZXRQaHkxMEZvcmNlIC0gRm9yY2UgQmFzZS1UIEZEIG1vZGUgV0lUSE9VVCB1c2luZyBhdXRvbmVnb3RpYXRpb24KLSAqIEBldGRldjogcG9pbnRlciB0byB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUKLSAqLwotdm9pZCBUUEFMX1NldFBoeTEwRm9yY2Uoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKLXsKLQkvKiBQb3dlciBkb3duIFBIWSAqLwotCUVUMTMxMF9QaHlQb3dlckRvd24oZXRkZXYsIDEpOwotCi0JLyogRGlzYWJsZSBhdXRvbmVnICovCi0JRVQxMzEwX1BoeUF1dG9OZWcoZXRkZXYsIGZhbHNlKTsKLQotCS8qIERpc2FibGUgYWxsIGFkdmVydGlzZW1lbnQgKi8KLQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7Ci0JRVQxMzEwX1BoeUFkdmVydGlzZTEwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9OT05FKTsKLQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9OT05FKTsKLQotCS8qIEZvcmNlIDEwIE1icHMgKi8KLQlFVDEzMTBfUGh5U3BlZWRTZWxlY3QoZXRkZXYsIFRSVUVQSFlfU1BFRURfMTBNQlBTKTsKLQotCS8qIEZvcmNlIEZ1bGwgZHVwbGV4ICovCi0JRVQxMzEwX1BoeUR1cGxleE1vZGUoZXRkZXYsIFRSVUVQSFlfRFVQTEVYX0ZVTEwpOwotCi0JLyogUG93ZXIgdXAgUEhZICovCi0JRVQxMzEwX1BoeVBvd2VyRG93bihldGRldiwgMCk7Ci19Ci0KLS8qKgotICogVFBBTF9TZXRQaHkxMDBIYWxmRHVwbGV4IC0gRm9yY2UgMTAwIEJhc2UgVCBIYWxmIER1cGxleCBtb2RlLgotICogQGV0ZGV2OiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyIHN0cnVjdHVyZQotICoKLSAqIEFsc28gc2V0cyB0aGUgTUFDIHNvIGl0IGlzIHN5bmNkIHVwIHByb3Blcmx5LgotICovCi12b2lkIFRQQUxfU2V0UGh5MTAwSGFsZkR1cGxleChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQotewotCS8qIFBvd2VyIGRvd24gUEhZICovCi0JRVQxMzEwX1BoeVBvd2VyRG93bihldGRldiwgMSk7Ci0KLQkvKiBmaXJzdCB3ZSBuZWVkIHRvIHR1cm4gb2ZmIGFsbCBvdGhlciBhZHZlcnRpc2VtZW50ICovCi0JRVQxMzEwX1BoeUFkdmVydGlzZTEwMDBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkUpOwotCi0JRVQxMzEwX1BoeUFkdmVydGlzZTEwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9OT05FKTsKLQotCS8qIFNldCBvdXIgYWR2ZXJ0aXNlIHZhbHVlcyBhY2NvcmRpbmdseSAqLwotCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX0hBTEYpOwotCi0JLyogU2V0IHNwZWVkICovCi0JRVQxMzEwX1BoeVNwZWVkU2VsZWN0KGV0ZGV2LCBUUlVFUEhZX1NQRUVEXzEwME1CUFMpOwotCi0JLyogUG93ZXIgdXAgUEhZICovCi0JRVQxMzEwX1BoeVBvd2VyRG93bihldGRldiwgMCk7Ci19Ci0KLS8qKgotICogVFBBTF9TZXRQaHkxMDBGdWxsRHVwbGV4IC0gRm9yY2UgMTAwIEJhc2UgVCBGdWxsIER1cGxleCBtb2RlLgotICogQGV0ZGV2OiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyIHN0cnVjdHVyZQotICoKLSAqIEFsc28gc2V0cyB0aGUgTUFDIHNvIGl0IGlzIHN5bmNkIHVwIHByb3Blcmx5Ci0gKi8KLXZvaWQgVFBBTF9TZXRQaHkxMDBGdWxsRHVwbGV4KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCi17Ci0JLyogUG93ZXIgZG93biBQSFkgKi8KLQlFVDEzMTBfUGh5UG93ZXJEb3duKGV0ZGV2LCAxKTsKLQotCS8qIEZpcnN0IHdlIG5lZWQgdG8gdHVybiBvZmYgYWxsIG90aGVyIGFkdmVydGlzZW1lbnQgKi8KLQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7Ci0KLQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkUpOwotCi0JLyogU2V0IG91ciBhZHZlcnRpc2UgdmFsdWVzIGFjY29yZGluZ2x5ICovCi0JRVQxMzEwX1BoeUFkdmVydGlzZTEwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfRlVMTCk7Ci0KLQkvKiBQb3dlciB1cCBQSFkgKi8KLQlFVDEzMTBfUGh5UG93ZXJEb3duKGV0ZGV2LCAwKTsKLX0KLQotLyoqCi0gKiBUUEFMX1NldFBoeTEwMEZvcmNlIC0gRm9yY2UgMTAwIEJhc2VUIEZEIG1vZGUgV0lUSE9VVCB1c2luZyBhdXRvbmVnb3RpYXRpb24KLSAqIEBldGRldjogcG9pbnRlciB0byB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUKLSAqLwotdm9pZCBUUEFMX1NldFBoeTEwMEZvcmNlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCi17Ci0JLyogUG93ZXIgZG93biBQSFkgKi8KLQlFVDEzMTBfUGh5UG93ZXJEb3duKGV0ZGV2LCAxKTsKLQotCS8qIERpc2FibGUgYXV0b25lZyAqLwotCUVUMTMxMF9QaHlBdXRvTmVnKGV0ZGV2LCBmYWxzZSk7Ci0KLQkvKiBEaXNhYmxlIGFsbCBhZHZlcnRpc2VtZW50ICovCi0JRVQxMzEwX1BoeUFkdmVydGlzZTEwMDBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkUpOwotCUVUMTMxMF9QaHlBZHZlcnRpc2UxMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7Ci0JRVQxMzEwX1BoeUFkdmVydGlzZTEwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7Ci0KLQkvKiBGb3JjZSAxMDAgTWJwcyAqLwotCUVUMTMxMF9QaHlTcGVlZFNlbGVjdChldGRldiwgVFJVRVBIWV9TUEVFRF8xMDBNQlBTKTsKLQotCS8qIEZvcmNlIEZ1bGwgZHVwbGV4ICovCi0JRVQxMzEwX1BoeUR1cGxleE1vZGUoZXRkZXYsIFRSVUVQSFlfRFVQTEVYX0ZVTEwpOwotCi0JLyogUG93ZXIgdXAgUEhZICovCi0JRVQxMzEwX1BoeVBvd2VyRG93bihldGRldiwgMCk7Ci19Ci0KLS8qKgotICogVFBBTF9TZXRQaHkxMDAwRnVsbER1cGxleCAtIEZvcmNlIDEwMDAgQmFzZSBUIEZ1bGwgRHVwbGV4IG1vZGUKLSAqIEBldGRldjogcG9pbnRlciB0byB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUKLSAqCi0gKiBBbHNvIHNldHMgdGhlIE1BQyBzbyBpdCBpcyBzeW5jZCB1cCBwcm9wZXJseS4KLSAqLwotdm9pZCBUUEFMX1NldFBoeTEwMDBGdWxsRHVwbGV4KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCi17Ci0JLyogUG93ZXIgZG93biBQSFkgKi8KLQlFVDEzMTBfUGh5UG93ZXJEb3duKGV0ZGV2LCAxKTsKLQotCS8qIGZpcnN0IHdlIG5lZWQgdG8gdHVybiBvZmYgYWxsIG90aGVyIGFkdmVydGlzZW1lbnQgKi8KLQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9OT05FKTsKLQotCUVUMTMxMF9QaHlBZHZlcnRpc2UxMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7Ci0KLQkvKiBzZXQgb3VyIGFkdmVydGlzZSB2YWx1ZXMgYWNjb3JkaW5nbHkgKi8KLQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfRlVMTCk7Ci0KLQkvKiBwb3dlciB1cCBQSFkgKi8KLQlFVDEzMTBfUGh5UG93ZXJEb3duKGV0ZGV2LCAwKTsKLX0KLQotLyoqCi0gKiBUUEFMX1NldFBoeUF1dG9OZWcgLSBTZXQgcGh5IHRvIGF1dG9uZWdvdGlhdGlvbiBtb2RlLgotICogQGV0ZGV2OiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyIHN0cnVjdHVyZQotICovCi12b2lkIFRQQUxfU2V0UGh5QXV0b05lZyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQotewotCS8qIFBvd2VyIGRvd24gUEhZICovCi0JRVQxMzEwX1BoeVBvd2VyRG93bihldGRldiwgMSk7Ci0KLQkvKiBUdXJuIG9uIGFkdmVydGlzZW1lbnQgb2YgYWxsIGNhcGFiaWxpdGllcyAqLwotCUVUMTMxMF9QaHlBZHZlcnRpc2UxMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfQk9USCk7Ci0KLQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9CT1RIKTsKLQotCWlmIChldGRldi0+cGRldi0+ZGV2aWNlICE9IEVUMTMxWF9QQ0lfREVWSUNFX0lEX0ZBU1QpCi0JCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDAwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9GVUxMKTsKLQllbHNlCi0JCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDAwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9OT05FKTsKLQotCS8qIE1ha2Ugc3VyZSBhdXRvLW5lZyBpcyBPTiAoaXQgaXMgZGlzYWJsZWQgaW4gRk9SQ0UgbW9kZXMpICovCi0JRVQxMzEwX1BoeUF1dG9OZWcoZXRkZXYsIHRydWUpOwotCi0JLyogUG93ZXIgdXAgUEhZICovCi0JRVQxMzEwX1BoeVBvd2VyRG93bihldGRldiwgMCk7Ci19Ci0KLQogLyoKICAqIFRoZSByb3V0aW5lcyB3aGljaCBmb2xsb3cgcHJvdmlkZSBsb3ctbGV2ZWwgYWNjZXNzIHRvIHRoZSBQSFksIGFuZCBhcmUgdXNlZAogICogcHJpbWFyaWx5IGJ5IHRoZSByb3V0aW5lcyBhYm92ZSAoYWx0aG91Z2ggdGhlcmUgYXJlIGEgZmV3IHBsYWNlcyBlbHNld2hlcmUKICAqIGluIHRoZSBkcml2ZXIgd2hlcmUgdGhpcyBsZXZlbCBvZiBhY2Nlc3MgaXMgcmVxdWlyZWQpLgogICovCiAKLXN0YXRpYyBjb25zdCB1aW50MTZfdCBDb25maWdQaHlbMjVdWzJdID0geworc3RhdGljIGNvbnN0IHUxNiBDb25maWdQaHlbMjVdWzJdID0gewogCS8qIFJlZyAgICAgIFZhbHVlICAgICAgUmVnaXN0ZXIgKi8KIAkvKiBBZGRyICAgICAgICAgICAgICAgICAgICAgICAgICovCiAJezB4ODgwQiwgMHgwOTI2fSwJLyogQWZlSWZDcmVnNEIxMDAwTXNicyAqLwpAQCAtODMxLDcgKzkxMyw3IEBACiAvKiBjb25kZW5zZWQgdmVyc2lvbiBvZiB0aGUgcGh5IGluaXRpYWxpemF0aW9uIHJvdXRpbmUgKi8KIHZvaWQgRVQxMzEwX1BoeUluaXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKIHsKLQl1aW50MTZfdCBkYXRhLCBpbmRleDsKKwl1MTYgZGF0YSwgaW5kZXg7CiAKIAlpZiAoZXRkZXYgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtODk2LDMwNCArOTc4LDMgQEAKIAlNaVdyaXRlKGV0ZGV2LCBQSFlfTVBIWV9DT05UUk9MX1JFRywgMHgwMDAyKTsKIH0KIAotdm9pZCBFVDEzMTBfUGh5UmVzZXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKLXsKLQlNaVdyaXRlKGV0ZGV2LCBQSFlfQ09OVFJPTCwgMHg4MDAwKTsKLX0KLQotdm9pZCBFVDEzMTBfUGh5UG93ZXJEb3duKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsIGJvb2wgZG93bikKLXsKLQl1aW50MTZfdCBkYXRhOwotCi0JTWlSZWFkKGV0ZGV2LCBQSFlfQ09OVFJPTCwgJmRhdGEpOwotCi0JaWYgKGRvd24gPT0gZmFsc2UpIHsKLQkJLyogUG93ZXIgVVAgKi8KLQkJZGF0YSAmPSB+MHgwODAwOwotCQlNaVdyaXRlKGV0ZGV2LCBQSFlfQ09OVFJPTCwgZGF0YSk7Ci0JfSBlbHNlIHsKLQkJLyogUG93ZXIgRE9XTiAqLwotCQlkYXRhIHw9IDB4MDgwMDsKLQkJTWlXcml0ZShldGRldiwgUEhZX0NPTlRST0wsIGRhdGEpOwotCX0KLX0KLQotdm9pZCBFVDEzMTBfUGh5QXV0b05lZyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LCBib29sIGVuYWJsZSkKLXsKLQl1aW50MTZfdCBkYXRhOwotCi0JTWlSZWFkKGV0ZGV2LCBQSFlfQ09OVFJPTCwgJmRhdGEpOwotCi0JaWYgKGVuYWJsZSA9PSB0cnVlKSB7Ci0JCS8qIEF1dG9uZWdvdGlhdGlvbiBPTiAqLwotCQlkYXRhIHw9IDB4MTAwMDsKLQkJTWlXcml0ZShldGRldiwgUEhZX0NPTlRST0wsIGRhdGEpOwotCX0gZWxzZSB7Ci0JCS8qIEF1dG9uZWdvdGlhdGlvbiBPRkYgKi8KLQkJZGF0YSAmPSB+MHgxMDAwOwotCQlNaVdyaXRlKGV0ZGV2LCBQSFlfQ09OVFJPTCwgZGF0YSk7Ci0JfQotfQotCi12b2lkIEVUMTMxMF9QaHlEdXBsZXhNb2RlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsIHVpbnQxNl90IGR1cGxleCkKLXsKLQl1aW50MTZfdCBkYXRhOwotCi0JTWlSZWFkKGV0ZGV2LCBQSFlfQ09OVFJPTCwgJmRhdGEpOwotCi0JaWYgKGR1cGxleCA9PSBUUlVFUEhZX0RVUExFWF9GVUxMKSB7Ci0JCS8qIFNldCBGdWxsIER1cGxleCAqLwotCQlkYXRhIHw9IDB4MTAwOwotCQlNaVdyaXRlKGV0ZGV2LCBQSFlfQ09OVFJPTCwgZGF0YSk7Ci0JfSBlbHNlIHsKLQkJLyogU2V0IEhhbGYgRHVwbGV4ICovCi0JCWRhdGEgJj0gfjB4MTAwOwotCQlNaVdyaXRlKGV0ZGV2LCBQSFlfQ09OVFJPTCwgZGF0YSk7Ci0JfQotfQotCi12b2lkIEVUMTMxMF9QaHlTcGVlZFNlbGVjdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LCB1aW50MTZfdCBzcGVlZCkKLXsKLQl1aW50MTZfdCBkYXRhOwotCi0JLyogUmVhZCB0aGUgUEhZIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLQlNaVJlYWQoZXRkZXYsIFBIWV9DT05UUk9MLCAmZGF0YSk7Ci0KLQkvKiBDbGVhciBhbGwgU3BlZWQgc2V0dGluZ3MgKEJpdHMgNiwgMTMpICovCi0JZGF0YSAmPSB+MHgyMDQwOwotCi0JLyogUmVzZXQgdGhlIHNwZWVkIGJpdHMgYmFzZWQgb24gdXNlciBzZWxlY3Rpb24gKi8KLQlzd2l0Y2ggKHNwZWVkKSB7Ci0JY2FzZSBUUlVFUEhZX1NQRUVEXzEwTUJQUzoKLQkJLyogQml0cyBhbHJlYWR5IGNsZWFyZWQgYWJvdmUsIGRvIG5vdGhpbmcgKi8KLQkJYnJlYWs7Ci0KLQljYXNlIFRSVUVQSFlfU1BFRURfMTAwTUJQUzoKLQkJLyogMTAwTSA9PSBTZXQgYml0IDEzICovCi0JCWRhdGEgfD0gMHgyMDAwOwotCQlicmVhazsKLQotCWNhc2UgVFJVRVBIWV9TUEVFRF8xMDAwTUJQUzoKLQlkZWZhdWx0OgotCQlkYXRhIHw9IDB4MDA0MDsKLQkJYnJlYWs7Ci0JfQotCi0JLyogV3JpdGUgYmFjayB0aGUgbmV3IHNwZWVkICovCi0JTWlXcml0ZShldGRldiwgUEhZX0NPTlRST0wsIGRhdGEpOwotfQotCi12b2lkIEVUMTMxMF9QaHlBZHZlcnRpc2UxMDAwQmFzZVQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwKLQkJCQkgIHVpbnQxNl90IGR1cGxleCkKLXsKLQl1aW50MTZfdCBkYXRhOwotCi0JLyogUmVhZCB0aGUgUEhZIDEwMDAgQmFzZS1UIENvbnRyb2wgUmVnaXN0ZXIgKi8KLQlNaVJlYWQoZXRkZXYsIFBIWV8xMDAwX0NPTlRST0wsICZkYXRhKTsKLQotCS8qIENsZWFyIEJpdHMgOCw5ICovCi0JZGF0YSAmPSB+MHgwMzAwOwotCi0Jc3dpdGNoIChkdXBsZXgpIHsKLQljYXNlIFRSVUVQSFlfQURWX0RVUExFWF9OT05FOgotCQkvKiBEdXBsZXggYWxyZWFkeSBjbGVhcmVkLCBkbyBub3RoaW5nICovCi0JCWJyZWFrOwotCi0JY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfRlVMTDoKLQkJLyogU2V0IEJpdCA5ICovCi0JCWRhdGEgfD0gMHgwMjAwOwotCQlicmVhazsKLQotCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX0hBTEY6Ci0JCS8qIFNldCBCaXQgOCAqLwotCQlkYXRhIHw9IDB4MDEwMDsKLQkJYnJlYWs7Ci0KLQljYXNlIFRSVUVQSFlfQURWX0RVUExFWF9CT1RIOgotCWRlZmF1bHQ6Ci0JCWRhdGEgfD0gMHgwMzAwOwotCQlicmVhazsKLQl9Ci0KLQkvKiBXcml0ZSBiYWNrIGFkdmVydGlzZW1lbnQgKi8KLQlNaVdyaXRlKGV0ZGV2LCBQSFlfMTAwMF9DT05UUk9MLCBkYXRhKTsKLX0KLQotdm9pZCBFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwQmFzZVQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwKLQkJCQkgdWludDE2X3QgZHVwbGV4KQotewotCXVpbnQxNl90IGRhdGE7Ci0KLQkvKiBSZWFkIHRoZSBBdXRvbmVnb3RpYXRpb24gUmVnaXN0ZXIgKDEwLzEwMCkgKi8KLQlNaVJlYWQoZXRkZXYsIFBIWV9BVVRPX0FEVkVSVElTRU1FTlQsICZkYXRhKTsKLQotCS8qIENsZWFyIGJpdHMgNyw4ICovCi0JZGF0YSAmPSB+MHgwMTgwOwotCi0Jc3dpdGNoIChkdXBsZXgpIHsKLQljYXNlIFRSVUVQSFlfQURWX0RVUExFWF9OT05FOgotCQkvKiBEdXBsZXggYWxyZWFkeSBjbGVhcmVkLCBkbyBub3RoaW5nICovCi0JCWJyZWFrOwotCi0JY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfRlVMTDoKLQkJLyogU2V0IEJpdCA4ICovCi0JCWRhdGEgfD0gMHgwMTAwOwotCQlicmVhazsKLQotCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX0hBTEY6Ci0JCS8qIFNldCBCaXQgNyAqLwotCQlkYXRhIHw9IDB4MDA4MDsKLQkJYnJlYWs7Ci0KLQljYXNlIFRSVUVQSFlfQURWX0RVUExFWF9CT1RIOgotCWRlZmF1bHQ6Ci0JCS8qIFNldCBCaXRzIDcsOCAqLwotCQlkYXRhIHw9IDB4MDE4MDsKLQkJYnJlYWs7Ci0JfQotCi0JLyogV3JpdGUgYmFjayBhZHZlcnRpc2VtZW50ICovCi0JTWlXcml0ZShldGRldiwgUEhZX0FVVE9fQURWRVJUSVNFTUVOVCwgZGF0YSk7Ci19Ci0KLXZvaWQgRVQxMzEwX1BoeUFkdmVydGlzZTEwQmFzZVQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwKLQkJCQl1aW50MTZfdCBkdXBsZXgpCi17Ci0JdWludDE2X3QgZGF0YTsKLQotCS8qIFJlYWQgdGhlIEF1dG9uZWdvdGlhdGlvbiBSZWdpc3RlciAoMTAvMTAwKSAqLwotCU1pUmVhZChldGRldiwgUEhZX0FVVE9fQURWRVJUSVNFTUVOVCwgJmRhdGEpOwotCi0JLyogQ2xlYXIgYml0cyA1LDYgKi8KLQlkYXRhICY9IH4weDAwNjA7Ci0KLQlzd2l0Y2ggKGR1cGxleCkgewotCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkU6Ci0JCS8qIER1cGxleCBhbHJlYWR5IGNsZWFyZWQsIGRvIG5vdGhpbmcgKi8KLQkJYnJlYWs7Ci0KLQljYXNlIFRSVUVQSFlfQURWX0RVUExFWF9GVUxMOgotCQkvKiBTZXQgQml0IDYgKi8KLQkJZGF0YSB8PSAweDAwNDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfSEFMRjoKLQkJLyogU2V0IEJpdCA1ICovCi0JCWRhdGEgfD0gMHgwMDIwOwotCQlicmVhazsKLQotCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX0JPVEg6Ci0JZGVmYXVsdDoKLQkJLyogU2V0IEJpdHMgNSw2ICovCi0JCWRhdGEgfD0gMHgwMDYwOwotCQlicmVhazsKLQl9Ci0KLQkvKiBXcml0ZSBiYWNrIGFkdmVydGlzZW1lbnQgKi8KLQlNaVdyaXRlKGV0ZGV2LCBQSFlfQVVUT19BRFZFUlRJU0VNRU5ULCBkYXRhKTsKLX0KLQotdm9pZCBFVDEzMTBfUGh5TGlua1N0YXR1cyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LAotCQkJICB1aW50OF90ICpsaW5rX3N0YXR1cywKLQkJCSAgdWludDMyX3QgKmF1dG9uZWcsCi0JCQkgIHVpbnQzMl90ICpsaW5rc3BlZWQsCi0JCQkgIHVpbnQzMl90ICpkdXBsZXhfbW9kZSwKLQkJCSAgdWludDMyX3QgKm1kaV9tZGl4LAotCQkJICB1aW50MzJfdCAqbWFzdGVyc2xhdmUsIHVpbnQzMl90ICpwb2xhcml0eSkKLXsKLQl1aW50MTZfdCBtaXN0YXR1cyA9IDA7Ci0JdWludDE2X3QgaXMxMDAwQmFzZVQgPSAwOwotCXVpbnQxNl90IHZtaV9waHlzdGF0dXMgPSAwOwotCXVpbnQxNl90IGNvbnRyb2wgPSAwOwotCi0JTWlSZWFkKGV0ZGV2LCBQSFlfU1RBVFVTLCAmbWlzdGF0dXMpOwotCU1pUmVhZChldGRldiwgUEhZXzEwMDBfU1RBVFVTLCAmaXMxMDAwQmFzZVQpOwotCU1pUmVhZChldGRldiwgUEhZX1BIWV9TVEFUVVMsICZ2bWlfcGh5c3RhdHVzKTsKLQlNaVJlYWQoZXRkZXYsIFBIWV9DT05UUk9MLCAmY29udHJvbCk7Ci0KLQlpZiAobGlua19zdGF0dXMpIHsKLQkJKmxpbmtfc3RhdHVzID0KLQkJICAgICh1bnNpZ25lZCBjaGFyKSgodm1pX3BoeXN0YXR1cyAmIDB4MDA0MCkgPyAxIDogMCk7Ci0JfQotCi0JaWYgKGF1dG9uZWcpIHsKLQkJKmF1dG9uZWcgPQotCQkgICAgKGNvbnRyb2wgJiAweDEwMDApID8gKCh2bWlfcGh5c3RhdHVzICYgMHgwMDIwKSA/Ci0JCQkJCSAgICBUUlVFUEhZX0FORUdfQ09NUExFVEUgOgotCQkJCQkgICAgVFJVRVBIWV9BTkVHX05PVF9DT01QTEVURSkgOgotCQkgICAgVFJVRVBIWV9BTkVHX0RJU0FCTEVEOwotCX0KLQotCWlmIChsaW5rc3BlZWQpCi0JCSpsaW5rc3BlZWQgPSAodm1pX3BoeXN0YXR1cyAmIDB4MDMwMCkgPj4gODsKLQotCWlmIChkdXBsZXhfbW9kZSkKLQkJKmR1cGxleF9tb2RlID0gKHZtaV9waHlzdGF0dXMgJiAweDAwODApID4+IDc7Ci0KLQlpZiAobWRpX21kaXgpCi0JCS8qIE5PVEU6IE5lZWQgdG8gY29tcGxldGUgdGhpcyAqLwotCQkqbWRpX21kaXggPSAwOwotCi0JaWYgKG1hc3RlcnNsYXZlKSB7Ci0JCSptYXN0ZXJzbGF2ZSA9Ci0JCSAgICAoaXMxMDAwQmFzZVQgJiAweDQwMDApID8gVFJVRVBIWV9DRkdfTUFTVEVSIDoKLQkJICAgIFRSVUVQSFlfQ0ZHX1NMQVZFOwotCX0KLQotCWlmIChwb2xhcml0eSkgewotCQkqcG9sYXJpdHkgPQotCQkgICAgKHZtaV9waHlzdGF0dXMgJiAweDA0MDApID8gVFJVRVBIWV9QT0xBUklUWV9JTlZFUlRFRCA6Ci0JCSAgICBUUlVFUEhZX1BPTEFSSVRZX05PUk1BTDsKLQl9Ci19Ci0KLXZvaWQgRVQxMzEwX1BoeUFuZE9yUmVnKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsCi0JCQl1aW50MTZfdCByZWdudW0sIHVpbnQxNl90IGFuZE1hc2ssIHVpbnQxNl90IG9yTWFzaykKLXsKLQl1aW50MTZfdCByZWc7Ci0KLQkvKiBSZWFkIHRoZSByZXF1ZXN0ZWQgcmVnaXN0ZXIgKi8KLQlNaVJlYWQoZXRkZXYsIHJlZ251bSwgJnJlZyk7Ci0KLQkvKiBBcHBseSB0aGUgQU5EIG1hc2sgKi8KLQlyZWcgJj0gYW5kTWFzazsKLQotCS8qIEFwcGx5IHRoZSBPUiBtYXNrICovCi0JcmVnIHw9IG9yTWFzazsKLQotCS8qIFdyaXRlIHRoZSB2YWx1ZSBiYWNrIHRvIHRoZSByZWdpc3RlciAqLwotCU1pV3JpdGUoZXRkZXYsIHJlZ251bSwgcmVnKTsKLX0KLQotdm9pZCBFVDEzMTBfUGh5QWNjZXNzTWlCaXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwgdWludDE2X3QgYWN0aW9uLAotCQkJICAgdWludDE2X3QgcmVnbnVtLCB1aW50MTZfdCBiaXRudW0sIHVpbnQ4X3QgKnZhbHVlKQotewotCXVpbnQxNl90IHJlZzsKLQl1aW50MTZfdCBtYXNrID0gMDsKLQotCS8qIENyZWF0ZSBhIG1hc2sgdG8gaXNvbGF0ZSB0aGUgcmVxdWVzdGVkIGJpdCAqLwotCW1hc2sgPSAweDAwMDEgPDwgYml0bnVtOwotCi0JLyogUmVhZCB0aGUgcmVxdWVzdGVkIHJlZ2lzdGVyICovCi0JTWlSZWFkKGV0ZGV2LCByZWdudW0sICZyZWcpOwotCi0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIFRSVUVQSFlfQklUX1JFQUQ6Ci0JCWlmICh2YWx1ZSAhPSBOVUxMKQotCQkJKnZhbHVlID0gKHJlZyAmIG1hc2spID4+IGJpdG51bTsKLQkJYnJlYWs7Ci0KLQljYXNlIFRSVUVQSFlfQklUX1NFVDoKLQkJcmVnIHw9IG1hc2s7Ci0JCU1pV3JpdGUoZXRkZXYsIHJlZ251bSwgcmVnKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFRSVUVQSFlfQklUX0NMRUFSOgotCQlyZWcgJj0gfm1hc2s7Ci0JCU1pV3JpdGUoZXRkZXYsIHJlZ251bSwgcmVnKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9waHkuaCBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3BoeS5oCmluZGV4IDA4MDY1NmMuLjc1OGI5YjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3BoeS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3BoeS5oCkBAIC02MSw5ICs2MSw2IEBACiAKICNpbmNsdWRlICJldDEzMTBfYWRkcmVzc19tYXAuaCIKIAotI2RlZmluZSBUUlVFUEhZX1NVQ0NFU1MgMAotI2RlZmluZSBUUlVFUEhZX0ZBSUxVUkUgMQotCiAvKiBNSSBSZWdpc3RlciBBZGRyZXNzZXMgKi8KICNkZWZpbmUgTUlfQ09OVFJPTF9SRUcgICAgICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBNSV9TVEFUVVNfUkVHICAgICAgICAgICAgICAgICAgICAgICAxCkBAIC03NDIsMjUgKzczOSwxNSBAQAogLyogRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiB0aGUgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZSAqLwogc3RydWN0IGV0MTMxeF9hZGFwdGVyOwogCi0vKiBPUyBTcGVjaWZpYyBGdW5jdGlvbnMqLwotdm9pZCBUUEFMX1NldFBoeTEwSGFsZkR1cGxleChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwotdm9pZCBUUEFMX1NldFBoeTEwRnVsbER1cGxleChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwotdm9pZCBUUEFMX1NldFBoeTEwRm9yY2Uoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpwQWRhcHRlcik7Ci12b2lkIFRQQUxfU2V0UGh5MTAwSGFsZkR1cGxleChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwotdm9pZCBUUEFMX1NldFBoeTEwMEZ1bGxEdXBsZXgoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgVFBBTF9TZXRQaHkxMDBGb3JjZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKnBBZGFwdGVyKTsKLXZvaWQgVFBBTF9TZXRQaHkxMDAwRnVsbER1cGxleChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwotdm9pZCBUUEFMX1NldFBoeUF1dG9OZWcoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKLQogLyogUHJvdG90eXBlcyBmb3IgRVQxMzEwX3BoeS5jICovCiBpbnQgZXQxMzF4X3hjdnJfZmluZChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwotaW50IGV0MTMxeF9zZXRwaHlfbm9ybWFsKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7Ci1pbnQzMl90IFBoeU1pUmVhZChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JICAgICAgIHU4IHhjdnJBZGRyLCB1OCB4Y3ZyUmVnLCB1MTYgKnZhbHVlKTsKK3ZvaWQgZXQxMzF4X3NldHBoeV9ub3JtYWwoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKIAogLyogc3RhdGljIGlubGluZSBmdW5jdGlvbiBkb2VzIG5vdCB3b3JrIGJlY2F1c2UgZXQxMzF4X2FkYXB0ZXIgaXMgbm90IGFsd2F5cwogICogZGVmaW5lZAogICovCitpbnQgUGh5TWlSZWFkKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwgdTggeGN2ckFkZHIsCisJICAgICAgdTggeGN2clJlZywgdTE2ICp2YWx1ZSk7CiAjZGVmaW5lIE1pUmVhZChhZGFwdGVyLCB4Y3ZyUmVnLCB2YWx1ZSkgXAogCVBoeU1pUmVhZCgoYWRhcHRlciksIChhZGFwdGVyKS0+U3RhdHMueGN2cl9hZGRyLCAoeGN2clJlZyksICh2YWx1ZSkpCiAKQEAgLTg2MCwyNCArODQ3LDggQEAKIHZvaWQgRVQxMzEwX1BoeUluaXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKIHZvaWQgRVQxMzEwX1BoeVJlc2V0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7CiB2b2lkIEVUMTMxMF9QaHlQb3dlckRvd24oc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLCBib29sIGRvd24pOwotdm9pZCBFVDEzMTBfUGh5QXV0b05lZyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIsIGJvb2wgZW5hYmxlKTsKLXZvaWQgRVQxMzEwX1BoeUR1cGxleE1vZGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLCB1MTYgZHVwbGV4KTsKLXZvaWQgRVQxMzEwX1BoeVNwZWVkU2VsZWN0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwgdTE2IHNwZWVkKTsKIHZvaWQgRVQxMzEwX1BoeUFkdmVydGlzZTEwMDBCYXNlVChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIsCiAJCQkJICB1MTYgZHVwbGV4KTsKLXZvaWQgRVQxMzEwX1BoeUFkdmVydGlzZTEwMEJhc2VUKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwKLQkJCQkgdTE2IGR1cGxleCk7Ci12b2lkIEVUMTMxMF9QaHlBZHZlcnRpc2UxMEJhc2VUKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwKLQkJCQl1MTYgZHVwbGV4KTsKLXZvaWQgRVQxMzEwX1BoeUxpbmtTdGF0dXMoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLAotCQkJICB1OCAqTGlua19zdGF0dXMsCi0JCQkgIHUzMiAqYXV0b25lZywKLQkJCSAgdTMyICpsaW5rc3BlZWQsCi0JCQkgIHUzMiAqZHVwbGV4X21vZGUsCi0JCQkgIHUzMiAqbWRpX21kaXgsCi0JCQkgIHUzMiAqbWFzdGVyc2xhdmUsIHUzMiAqcG9sYXJpdHkpOwotdm9pZCBFVDEzMTBfUGh5QW5kT3JSZWcoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLAotCQkJdTE2IHJlZ251bSwgdTE2IGFuZE1hc2ssIHUxNiBvck1hc2spOwogdm9pZCBFVDEzMTBfUGh5QWNjZXNzTWlCaXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLAogCQkJICAgdTE2IGFjdGlvbiwKIAkJCSAgIHUxNiByZWdudW0sIHUxNiBiaXRudW0sIHU4ICp2YWx1ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9yeC5jIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfcnguYwppbmRleCAxMGUyMWRiLi4zZGRjOWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9yeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3J4LmMKQEAgLTEwNiw5ICsxMDYsOSBAQAogICovCiBpbnQgZXQxMzF4X3J4X2RtYV9tZW1vcnlfYWxsb2Moc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQogewotCXVpbnQzMl90IE91dGVyTG9vcCwgSW5uZXJMb29wOwotCXVpbnQzMl90IGJ1ZnNpemU7Ci0JdWludDMyX3QgcGt0U3RhdFJpbmdTaXplLCBGQlJDaHVua1NpemU7CisJdTMyIGksIGo7CisJdTMyIGJ1ZnNpemU7CisJdTMyIHBrdFN0YXRSaW5nU2l6ZSwgRkJSQ2h1bmtTaXplOwogCVJYX1JJTkdfdCAqcnhfcmluZzsKIAogCS8qIFNldHVwIHNvbWUgY29udmVuaWVuY2UgcG9pbnRlcnMgKi8KQEAgLTIyNywxMSArMjI3LDExIEBACiAJCQkJCXJ4X3JpbmctPkZicjBvZmZzZXQpOwogI2VuZGlmCiAKLQlmb3IgKE91dGVyTG9vcCA9IDA7IE91dGVyTG9vcCA8IChyeF9yaW5nLT5GYnIxTnVtRW50cmllcyAvIEZCUl9DSFVOS1MpOwotCSAgICAgT3V0ZXJMb29wKyspIHsKLQkJdWludDY0X3QgRmJyMU9mZnNldDsKLQkJdWludDY0X3QgRmJyMVRlbXBQYTsKLQkJdWludDMyX3QgRmJyMUFsaWduOworCWZvciAoaSA9IDA7IGkgPCAocnhfcmluZy0+RmJyMU51bUVudHJpZXMgLyBGQlJfQ0hVTktTKTsKKwkgICAgIGkrKykgeworCQl1NjQgRmJyMU9mZnNldDsKKwkJdTY0IEZicjFUZW1wUGE7CisJCXUzMiBGYnIxQWxpZ247CiAKIAkJLyogVGhpcyBjb2RlIGFsbG9jYXRlcyBhbiBhcmVhIG9mIG1lbW9yeSBiaWcgZW5vdWdoIGZvciBOCiAJCSAqIGZyZWUgYnVmZmVycyArIChidWZmZXJfc2l6ZSAtIDEpIHNvIHRoYXQgdGhlIGJ1ZmZlcnMgY2FuCkBAIC0yNDcsMzkgKzI0NywzOSBAQAogCiAJCUZCUkNodW5rU2l6ZSA9CiAJCSAgICAoRkJSX0NIVU5LUyAqIHJ4X3JpbmctPkZicjFCdWZmZXJTaXplKSArIEZicjFBbGlnbiAtIDE7Ci0JCXJ4X3JpbmctPkZicjFNZW1WYVtPdXRlckxvb3BdID0KKwkJcnhfcmluZy0+RmJyMU1lbVZhW2ldID0KIAkJICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIEZCUkNodW5rU2l6ZSwKLQkJCQkJICZyeF9yaW5nLT5GYnIxTWVtUGFbT3V0ZXJMb29wXSk7CisJCQkJCSAmcnhfcmluZy0+RmJyMU1lbVBhW2ldKTsKIAotCQlpZiAoIXJ4X3JpbmctPkZicjFNZW1WYVtPdXRlckxvb3BdKSB7CisJCWlmICghcnhfcmluZy0+RmJyMU1lbVZhW2ldKSB7CiAJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKIAkJCQkiQ291bGQgbm90IGFsbG9jIG1lbW9yeVxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCiAJCS8qIFNlZSBOT1RFIGluICJTYXZlIFBoeXNpY2FsIEFkZHJlc3MiIGNvbW1lbnQgYWJvdmUgKi8KLQkJRmJyMVRlbXBQYSA9IHJ4X3JpbmctPkZicjFNZW1QYVtPdXRlckxvb3BdOworCQlGYnIxVGVtcFBhID0gcnhfcmluZy0+RmJyMU1lbVBhW2ldOwogCiAJCWV0MTMxeF9hbGlnbl9hbGxvY2F0ZWRfbWVtb3J5KGFkYXB0ZXIsCiAJCQkJCSAgICAgICZGYnIxVGVtcFBhLAogCQkJCQkgICAgICAmRmJyMU9mZnNldCwgKEZicjFBbGlnbiAtIDEpKTsKIAotCQlmb3IgKElubmVyTG9vcCA9IDA7IElubmVyTG9vcCA8IEZCUl9DSFVOS1M7IElubmVyTG9vcCsrKSB7Ci0JCQl1aW50MzJfdCBpbmRleCA9IChPdXRlckxvb3AgKiBGQlJfQ0hVTktTKSArIElubmVyTG9vcDsKKwkJZm9yIChqID0gMDsgaiA8IEZCUl9DSFVOS1M7IGorKykgeworCQkJdTMyIGluZGV4ID0gKGkgKiBGQlJfQ0hVTktTKSArIGo7CiAKIAkJCS8qIFNhdmUgdGhlIFZpcnR1YWwgYWRkcmVzcyBvZiB0aGlzIGluZGV4IGZvciBxdWljawogCQkJICogYWNjZXNzIGxhdGVyCiAJCQkgKi8KIAkJCXJ4X3JpbmctPkZiclsxXS0+VmFbaW5kZXhdID0KLQkJCSAgICAodWludDhfdCAqKSByeF9yaW5nLT5GYnIxTWVtVmFbT3V0ZXJMb29wXSArCi0JCQkgICAgKElubmVyTG9vcCAqIHJ4X3JpbmctPkZicjFCdWZmZXJTaXplKSArIEZicjFPZmZzZXQ7CisJCQkgICAgKHVpbnQ4X3QgKikgcnhfcmluZy0+RmJyMU1lbVZhW2ldICsKKwkJCSAgICAoaiAqIHJ4X3JpbmctPkZicjFCdWZmZXJTaXplKSArIEZicjFPZmZzZXQ7CiAKIAkJCS8qIG5vdyBzdG9yZSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBpbiB0aGUgZGVzY3JpcHRvcgogCQkJICogc28gdGhlIGRldmljZSBjYW4gYWNjZXNzIGl0CiAJCQkgKi8KIAkJCXJ4X3JpbmctPkZiclsxXS0+UEFIaWdoW2luZGV4XSA9Ci0JCQkgICAgKHVpbnQzMl90KSAoRmJyMVRlbXBQYSA+PiAzMik7Ci0JCQlyeF9yaW5nLT5GYnJbMV0tPlBBTG93W2luZGV4XSA9ICh1aW50MzJfdCkgRmJyMVRlbXBQYTsKKwkJCSAgICAodTMyKSAoRmJyMVRlbXBQYSA+PiAzMik7CisJCQlyeF9yaW5nLT5GYnJbMV0tPlBBTG93W2luZGV4XSA9ICh1MzIpIEZicjFUZW1wUGE7CiAKIAkJCUZicjFUZW1wUGEgKz0gcnhfcmluZy0+RmJyMUJ1ZmZlclNpemU7CiAKQEAgLTI5Miw0MCArMjkyLDQwIEBACiAKICNpZmRlZiBVU0VfRkJSMAogCS8qIFNhbWUgZm9yIEZCUjAgKGlmIGluIHVzZSkgKi8KLQlmb3IgKE91dGVyTG9vcCA9IDA7IE91dGVyTG9vcCA8IChyeF9yaW5nLT5GYnIwTnVtRW50cmllcyAvIEZCUl9DSFVOS1MpOwotCSAgICAgT3V0ZXJMb29wKyspIHsKLQkJdWludDY0X3QgRmJyME9mZnNldDsKLQkJdWludDY0X3QgRmJyMFRlbXBQYTsKKwlmb3IgKGkgPSAwOyBpIDwgKHJ4X3JpbmctPkZicjBOdW1FbnRyaWVzIC8gRkJSX0NIVU5LUyk7CisJICAgICBpKyspIHsKKwkJdTY0IEZicjBPZmZzZXQ7CisJCXU2NCBGYnIwVGVtcFBhOwogCiAJCUZCUkNodW5rU2l6ZSA9ICgoRkJSX0NIVU5LUyArIDEpICogcnhfcmluZy0+RmJyMEJ1ZmZlclNpemUpIC0gMTsKLQkJcnhfcmluZy0+RmJyME1lbVZhW091dGVyTG9vcF0gPQorCQlyeF9yaW5nLT5GYnIwTWVtVmFbaV0gPQogCQkgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgRkJSQ2h1bmtTaXplLAotCQkJCQkgJnJ4X3JpbmctPkZicjBNZW1QYVtPdXRlckxvb3BdKTsKKwkJCQkJICZyeF9yaW5nLT5GYnIwTWVtUGFbaV0pOwogCi0JCWlmICghcnhfcmluZy0+RmJyME1lbVZhW091dGVyTG9vcF0pIHsKKwkJaWYgKCFyeF9yaW5nLT5GYnIwTWVtVmFbaV0pIHsKIAkJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKIAkJCQkiQ291bGQgbm90IGFsbG9jIG1lbW9yeVxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCiAJCS8qIFNlZSBOT1RFIGluICJTYXZlIFBoeXNpY2FsIEFkZHJlc3MiIGNvbW1lbnQgYWJvdmUgKi8KLQkJRmJyMFRlbXBQYSA9IHJ4X3JpbmctPkZicjBNZW1QYVtPdXRlckxvb3BdOworCQlGYnIwVGVtcFBhID0gcnhfcmluZy0+RmJyME1lbVBhW2ldOwogCiAJCWV0MTMxeF9hbGlnbl9hbGxvY2F0ZWRfbWVtb3J5KGFkYXB0ZXIsCiAJCQkJCSAgICAgICZGYnIwVGVtcFBhLAogCQkJCQkgICAgICAmRmJyME9mZnNldCwKIAkJCQkJICAgICAgcnhfcmluZy0+RmJyMEJ1ZmZlclNpemUgLSAxKTsKIAotCQlmb3IgKElubmVyTG9vcCA9IDA7IElubmVyTG9vcCA8IEZCUl9DSFVOS1M7IElubmVyTG9vcCsrKSB7Ci0JCQl1aW50MzJfdCBpbmRleCA9IChPdXRlckxvb3AgKiBGQlJfQ0hVTktTKSArIElubmVyTG9vcDsKKwkJZm9yIChqID0gMDsgaiA8IEZCUl9DSFVOS1M7IGorKykgeworCQkJdTMyIGluZGV4ID0gKGkgKiBGQlJfQ0hVTktTKSArIGo7CiAKIAkJCXJ4X3JpbmctPkZiclswXS0+VmFbaW5kZXhdID0KLQkJCSAgICAodWludDhfdCAqKSByeF9yaW5nLT5GYnIwTWVtVmFbT3V0ZXJMb29wXSArCi0JCQkgICAgKElubmVyTG9vcCAqIHJ4X3JpbmctPkZicjBCdWZmZXJTaXplKSArIEZicjBPZmZzZXQ7CisJCQkgICAgKHVpbnQ4X3QgKikgcnhfcmluZy0+RmJyME1lbVZhW2ldICsKKwkJCSAgICAoaiAqIHJ4X3JpbmctPkZicjBCdWZmZXJTaXplKSArIEZicjBPZmZzZXQ7CiAKIAkJCXJ4X3JpbmctPkZiclswXS0+UEFIaWdoW2luZGV4XSA9Ci0JCQkgICAgKHVpbnQzMl90KSAoRmJyMFRlbXBQYSA+PiAzMik7Ci0JCQlyeF9yaW5nLT5GYnJbMF0tPlBBTG93W2luZGV4XSA9ICh1aW50MzJfdCkgRmJyMFRlbXBQYTsKKwkJCSAgICAodTMyKSAoRmJyMFRlbXBQYSA+PiAzMik7CisJCQlyeF9yaW5nLT5GYnJbMF0tPlBBTG93W2luZGV4XSA9ICh1MzIpIEZicjBUZW1wUGE7CiAKIAkJCUZicjBUZW1wUGEgKz0gcnhfcmluZy0+RmJyMEJ1ZmZlclNpemU7CiAKQEAgLTM0Miw3ICszNDIsNyBAQAogCSAgICBzaXplb2YoUEtUX1NUQVRfREVTQ190KSAqIGFkYXB0ZXItPlJ4UmluZy5Qc3JOdW1FbnRyaWVzOwogCiAJcnhfcmluZy0+cFBTUmluZ1ZhID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwKLQkJCQkJCSAgcGt0U3RhdFJpbmdTaXplICsgMHgwZmZmLAorCQkJCQkJICBwa3RTdGF0UmluZ1NpemUsCiAJCQkJCQkgICZyeF9yaW5nLT5wUFNSaW5nUGEpOwogCiAJaWYgKCFyeF9yaW5nLT5wUFNSaW5nVmEpIHsKQEAgLTM1MCw0NSArMzUwLDI2IEBACiAJCQkgICJDYW5ub3QgYWxsb2MgbWVtb3J5IGZvciBQYWNrZXQgU3RhdHVzIFJpbmdcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CisJcHJpbnRrKCJQU1IgJWx4XG4iLCAodW5zaWduZWQgbG9uZykgcnhfcmluZy0+cFBTUmluZ1BhKTsKIAotCS8qIFNhdmUgcGh5c2ljYWwgYWRkcmVzcwotCSAqCisJLyoKIAkgKiBOT1RFIDogcGNpX2FsbG9jX2NvbnNpc3RlbnQoKSwgdXNlZCBhYm92ZSB0byBhbGxvYyBETUEgcmVnaW9ucywKIAkgKiBBTFdBWVMgcmV0dXJucyBTQUMgKDMyLWJpdCkgYWRkcmVzc2VzLiBJZiBEQUMgKDY0LWJpdCkgYWRkcmVzc2VzCiAJICogYXJlIGV2ZXIgcmV0dXJuZWQsIG1ha2Ugc3VyZSB0aGUgaGlnaCBwYXJ0IGlzIHJldHJpZXZlZCBoZXJlIGJlZm9yZQogCSAqIHN0b3JpbmcgdGhlIGFkanVzdGVkIGFkZHJlc3MuCiAJICovCi0JcnhfcmluZy0+cFBTUmluZ1JlYWxQYSA9IHJ4X3JpbmctPnBQU1JpbmdQYTsKLQotCS8qIEFsaWduIFBhY2tldCBTdGF0dXMgUmluZyBvbiBhIDRLIGJvdW5kYXJ5ICovCi0JZXQxMzF4X2FsaWduX2FsbG9jYXRlZF9tZW1vcnkoYWRhcHRlciwKLQkJCQkgICAgICAmcnhfcmluZy0+cFBTUmluZ1JlYWxQYSwKLQkJCQkgICAgICAmcnhfcmluZy0+cFBTUmluZ09mZnNldCwgMHgwRkZGKTsKLQotCXJ4X3JpbmctPnBQU1JpbmdWYSA9ICh2b2lkICopKCh1aW50OF90ICopIHJ4X3JpbmctPnBQU1JpbmdWYSArCi0JCQkJICAgICAgcnhfcmluZy0+cFBTUmluZ09mZnNldCk7CiAKIAkvKiBBbGxvY2F0ZSBhbiBhcmVhIG9mIG1lbW9yeSBmb3Igd3JpdGViYWNrIG9mIHN0YXR1cyBpbmZvcm1hdGlvbiAqLwogCXJ4X3JpbmctPnBSeFN0YXR1c1ZhID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwKLQkJCQkJCSAgICBzaXplb2YoUlhfU1RBVFVTX0JMT0NLX3QpICsKLQkJCQkJCSAgICAweDcsICZyeF9yaW5nLT5wUnhTdGF0dXNQYSk7CisJCQkJCQkgICAgc2l6ZW9mKFJYX1NUQVRVU19CTE9DS190KSwKKwkJCQkJCSAgICAmcnhfcmluZy0+cFJ4U3RhdHVzUGEpOwogCWlmICghcnhfcmluZy0+cFJ4U3RhdHVzVmEpIHsKIAkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAogCQkJICAiQ2Fubm90IGFsbG9jIG1lbW9yeSBmb3IgU3RhdHVzIEJsb2NrXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCi0JLyogU2F2ZSBwaHlzaWNhbCBhZGRyZXNzICovCi0JcnhfcmluZy0+UnhTdGF0dXNSZWFsUEEgPSByeF9yaW5nLT5wUnhTdGF0dXNQYTsKLQotCS8qIEFsaWduIHdyaXRlIGJhY2sgb24gYW4gOCBieXRlIGJvdW5kYXJ5ICovCi0JZXQxMzF4X2FsaWduX2FsbG9jYXRlZF9tZW1vcnkoYWRhcHRlciwKLQkJCQkgICAgICAmcnhfcmluZy0+UnhTdGF0dXNSZWFsUEEsCi0JCQkJICAgICAgJnJ4X3JpbmctPlJ4U3RhdHVzT2Zmc2V0LCAweDA3KTsKLQotCXJ4X3JpbmctPnBSeFN0YXR1c1ZhID0gKHZvaWQgKikoKHVpbnQ4X3QgKikgcnhfcmluZy0+cFJ4U3RhdHVzVmEgKwotCQkJCQlyeF9yaW5nLT5SeFN0YXR1c09mZnNldCk7CiAJcnhfcmluZy0+TnVtUmZkID0gTklDX0RFRkFVTFRfTlVNX1JGRDsKKwlwcmludGsoIlBSUyAlbHhcbiIsICh1bnNpZ25lZCBsb25nKXJ4X3JpbmctPnBSeFN0YXR1c1BhKTsKIAogCS8qIFJlY3YKIAkgKiBwY2lfcG9vbF9jcmVhdGUgaW5pdGlhbGl6ZXMgYSBsb29rYXNpZGUgbGlzdC4gQWZ0ZXIgc3VjY2Vzc2Z1bApAQCAtNDA5LDcgKzM5MCw2IEBACiAJICogbGlzdHMgbm93LgogCSAqLwogCUlOSVRfTElTVF9IRUFEKCZyeF9yaW5nLT5SZWN2TGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJnJ4X3JpbmctPlJlY3ZQZW5kaW5nTGlzdCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQxOSwxMCArMzk5LDEwIEBACiAgKi8KIHZvaWQgZXQxMzF4X3J4X2RtYV9tZW1vcnlfZnJlZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JdWludDMyX3QgaW5kZXg7Ci0JdWludDMyX3QgYnVmc2l6ZTsKLQl1aW50MzJfdCBwa3RTdGF0UmluZ1NpemU7Ci0JUE1QX1JGRCBwTXBSZmQ7CisJdTMyIGluZGV4OworCXUzMiBidWZzaXplOworCXUzMiBwa3RTdGF0UmluZ1NpemU7CisJUE1QX1JGRCByZmQ7CiAJUlhfUklOR190ICpyeF9yaW5nOwogCiAJLyogU2V0dXAgc29tZSBjb252ZW5pZW5jZSBwb2ludGVycyAqLwpAQCAtNDMyLDE4ICs0MTIsMTIgQEAKIAlXQVJOX09OKHJ4X3JpbmctPm5SZWFkeVJlY3YgIT0gcnhfcmluZy0+TnVtUmZkKTsKIAogCXdoaWxlICghbGlzdF9lbXB0eSgmcnhfcmluZy0+UmVjdkxpc3QpKSB7Ci0JCXBNcFJmZCA9IChNUF9SRkQgKikgbGlzdF9lbnRyeShyeF9yaW5nLT5SZWN2TGlzdC5uZXh0LAorCQlyZmQgPSAoTVBfUkZEICopIGxpc3RfZW50cnkocnhfcmluZy0+UmVjdkxpc3QubmV4dCwKIAkJCQkJICAgICAgIE1QX1JGRCwgbGlzdF9ub2RlKTsKIAotCQlsaXN0X2RlbCgmcE1wUmZkLT5saXN0X25vZGUpOwotCQlldDEzMXhfcmZkX3Jlc291cmNlc19mcmVlKGFkYXB0ZXIsIHBNcFJmZCk7Ci0JfQotCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZyeF9yaW5nLT5SZWN2UGVuZGluZ0xpc3QpKSB7Ci0JCXBNcFJmZCA9IChNUF9SRkQgKikgbGlzdF9lbnRyeShyeF9yaW5nLT5SZWN2UGVuZGluZ0xpc3QubmV4dCwKLQkJCQkJICAgICAgIE1QX1JGRCwgbGlzdF9ub2RlKTsKLQkJbGlzdF9kZWwoJnBNcFJmZC0+bGlzdF9ub2RlKTsKLQkJZXQxMzF4X3JmZF9yZXNvdXJjZXNfZnJlZShhZGFwdGVyLCBwTXBSZmQpOworCQlsaXN0X2RlbCgmcmZkLT5saXN0X25vZGUpOworCQlyZmQtPlBhY2tldCA9IE5VTEw7CisJCWttZW1fY2FjaGVfZnJlZShhZGFwdGVyLT5SeFJpbmcuUmVjdkxvb2thc2lkZSwgcmZkKTsKIAl9CiAKIAkvKiBGcmVlIEZyZWUgQnVmZmVyIFJpbmcgMSAqLwpAQCAtNDUyLDcgKzQyNiw3IEBACiAJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8CiAJCSAgICAgKHJ4X3JpbmctPkZicjFOdW1FbnRyaWVzIC8gRkJSX0NIVU5LUyk7IGluZGV4KyspIHsKIAkJCWlmIChyeF9yaW5nLT5GYnIxTWVtVmFbaW5kZXhdKSB7Ci0JCQkJdWludDMyX3QgRmJyMUFsaWduOworCQkJCXUzMiBGYnIxQWxpZ247CiAKIAkJCQlpZiAocnhfcmluZy0+RmJyMUJ1ZmZlclNpemUgPiA0MDk2KQogCQkJCQlGYnIxQWxpZ24gPSA0MDk2OwpAQCAtNTIzLDE0ICs0OTcsMTAgQEAKIAogCS8qIEZyZWUgUGFja2V0IFN0YXR1cyBSaW5nICovCiAJaWYgKHJ4X3JpbmctPnBQU1JpbmdWYSkgewotCQlyeF9yaW5nLT5wUFNSaW5nVmEgPSAodm9pZCAqKSgodWludDhfdCAqKSByeF9yaW5nLT5wUFNSaW5nVmEgLQotCQkJCQkgICAgICByeF9yaW5nLT5wUFNSaW5nT2Zmc2V0KTsKLQogCQlwa3RTdGF0UmluZ1NpemUgPQogCQkgICAgc2l6ZW9mKFBLVF9TVEFUX0RFU0NfdCkgKiBhZGFwdGVyLT5SeFJpbmcuUHNyTnVtRW50cmllczsKIAotCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsCi0JCQkJICAgIHBrdFN0YXRSaW5nU2l6ZSArIDB4MGZmZiwKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBwa3RTdGF0UmluZ1NpemUsCiAJCQkJICAgIHJ4X3JpbmctPnBQU1JpbmdWYSwgcnhfcmluZy0+cFBTUmluZ1BhKTsKIAogCQlyeF9yaW5nLT5wUFNSaW5nVmEgPSBOVUxMOwpAQCAtNTM4LDExICs1MDgsOCBAQAogCiAJLyogRnJlZSBhcmVhIG9mIG1lbW9yeSBmb3IgdGhlIHdyaXRlYmFjayBvZiBzdGF0dXMgaW5mb3JtYXRpb24gKi8KIAlpZiAocnhfcmluZy0+cFJ4U3RhdHVzVmEpIHsKLQkJcnhfcmluZy0+cFJ4U3RhdHVzVmEgPSAodm9pZCAqKSgodWludDhfdCAqKQotCQkJCXJ4X3JpbmctPnBSeFN0YXR1c1ZhIC0gcnhfcmluZy0+UnhTdGF0dXNPZmZzZXQpOwotCiAJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwKLQkJCQlzaXplb2YoUlhfU1RBVFVTX0JMT0NLX3QpICsgMHg3LAorCQkJCXNpemVvZihSWF9TVEFUVVNfQkxPQ0tfdCksCiAJCQkJcnhfcmluZy0+cFJ4U3RhdHVzVmEsIHJ4X3JpbmctPnBSeFN0YXR1c1BhKTsKIAogCQlyeF9yaW5nLT5wUnhTdGF0dXNWYSA9IE5VTEw7CkBAIC01NzgsNDkgKzU0NSw0MyBAQAogaW50IGV0MTMxeF9pbml0X3JlY3Yoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQogewogCWludCBzdGF0dXMgPSAtRU5PTUVNOwotCVBNUF9SRkQgcE1wUmZkID0gTlVMTDsKLQl1aW50MzJfdCBSZmRDb3VudDsKLQl1aW50MzJfdCBUb3RhbE51bVJmZCA9IDA7CisJUE1QX1JGRCByZmQgPSBOVUxMOworCXUzMiByZmRjdDsKKwl1MzIgbnVtcmZkID0gMDsKIAlSWF9SSU5HX3QgKnJ4X3JpbmcgPSBOVUxMOwogCiAJLyogU2V0dXAgc29tZSBjb252ZW5pZW5jZSBwb2ludGVycyAqLwogCXJ4X3JpbmcgPSAoUlhfUklOR190ICopICZhZGFwdGVyLT5SeFJpbmc7CiAKIAkvKiBTZXR1cCBlYWNoIFJGRCAqLwotCWZvciAoUmZkQ291bnQgPSAwOyBSZmRDb3VudCA8IHJ4X3JpbmctPk51bVJmZDsgUmZkQ291bnQrKykgewotCQlwTXBSZmQgPSAoTVBfUkZEICopIGttZW1fY2FjaGVfYWxsb2MocnhfcmluZy0+UmVjdkxvb2thc2lkZSwKKwlmb3IgKHJmZGN0ID0gMDsgcmZkY3QgPCByeF9yaW5nLT5OdW1SZmQ7IHJmZGN0KyspIHsKKwkJcmZkID0gKE1QX1JGRCAqKSBrbWVtX2NhY2hlX2FsbG9jKHJ4X3JpbmctPlJlY3ZMb29rYXNpZGUsCiAJCQkJCQkgICAgIEdGUF9BVE9NSUMgfCBHRlBfRE1BKTsKIAotCQlpZiAoIXBNcFJmZCkgeworCQlpZiAoIXJmZCkgewogCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAogCQkJCSAgIkNvdWxkbid0IGFsbG9jIFJGRCBvdXQgb2Yga21lbV9jYWNoZVxuIik7CiAJCQlzdGF0dXMgPSAtRU5PTUVNOwogCQkJY29udGludWU7CiAJCX0KIAotCQlzdGF0dXMgPSBldDEzMXhfcmZkX3Jlc291cmNlc19hbGxvYyhhZGFwdGVyLCBwTXBSZmQpOwotCQlpZiAoc3RhdHVzICE9IDApIHsKLQkJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKLQkJCQkgICJDb3VsZG4ndCBhbGxvYyBwYWNrZXQgZm9yIFJGRFxuIik7Ci0JCQlrbWVtX2NhY2hlX2ZyZWUocnhfcmluZy0+UmVjdkxvb2thc2lkZSwgcE1wUmZkKTsKLQkJCWNvbnRpbnVlOwotCQl9CisJCXJmZC0+UGFja2V0ID0gTlVMTDsKIAogCQkvKiBBZGQgdGhpcyBSRkQgdG8gdGhlIFJlY3ZMaXN0ICovCi0JCWxpc3RfYWRkX3RhaWwoJnBNcFJmZC0+bGlzdF9ub2RlLCAmcnhfcmluZy0+UmVjdkxpc3QpOworCQlsaXN0X2FkZF90YWlsKCZyZmQtPmxpc3Rfbm9kZSwgJnJ4X3JpbmctPlJlY3ZMaXN0KTsKIAogCQkvKiBJbmNyZW1lbnQgYm90aCB0aGUgYXZhaWxhYmxlIFJGRCdzLCBhbmQgdGhlIHRvdGFsIFJGRCdzLiAqLwogCQlyeF9yaW5nLT5uUmVhZHlSZWN2Kys7Ci0JCVRvdGFsTnVtUmZkKys7CisJCW51bXJmZCsrOwogCX0KIAotCWlmIChUb3RhbE51bVJmZCA+IE5JQ19NSU5fTlVNX1JGRCkKKwlpZiAobnVtcmZkID4gTklDX01JTl9OVU1fUkZEKQogCQlzdGF0dXMgPSAwOwogCi0JcnhfcmluZy0+TnVtUmZkID0gVG90YWxOdW1SZmQ7CisJcnhfcmluZy0+TnVtUmZkID0gbnVtcmZkOwogCiAJaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCWttZW1fY2FjaGVfZnJlZShyeF9yaW5nLT5SZWN2TG9va2FzaWRlLCBwTXBSZmQpOworCQlrbWVtX2NhY2hlX2ZyZWUocnhfcmluZy0+UmVjdkxvb2thc2lkZSwgcmZkKTsKIAkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAogCQkJICAiQWxsb2NhdGlvbiBwcm9ibGVtcyBpbiBldDEzMXhfaW5pdF9yZWN2XG4iKTsKIAl9CkBAIC02MjgsNDEgKzU4OSwxNiBAQAogfQogCiAvKioKLSAqIGV0MTMxeF9yZmRfcmVzb3VyY2VzX2FsbG9jCi0gKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQotICogQHBNcFJmZDogcG9pbnRlciB0byBhIFJGRAotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCBlcnJubyBvbiBmYWlsdXJlIChhcyBkZWZpbmVkIGluIGVycm5vLmgpCi0gKi8KLWludCBldDEzMXhfcmZkX3Jlc291cmNlc19hbGxvYyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIsIE1QX1JGRCAqcE1wUmZkKQotewotCXBNcFJmZC0+UGFja2V0ID0gTlVMTDsKLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGV0MTMxeF9yZmRfcmVzb3VyY2VzX2ZyZWUgLSBGcmVlIHRoZSBwYWNrZXQgYWxsb2NhdGVkIGZvciB0aGUgZ2l2ZW4gUkZECi0gKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQotICogQHBNcFJmZDogcG9pbnRlciB0byBhIFJGRAotICovCi12b2lkIGV0MTMxeF9yZmRfcmVzb3VyY2VzX2ZyZWUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLCBNUF9SRkQgKnBNcFJmZCkKLXsKLQlwTXBSZmQtPlBhY2tldCA9IE5VTEw7Ci0Ja21lbV9jYWNoZV9mcmVlKGFkYXB0ZXItPlJ4UmluZy5SZWN2TG9va2FzaWRlLCBwTXBSZmQpOwotfQotCi0vKioKICAqIENvbmZpZ1J4RG1hUmVncyAtIFN0YXJ0IG9mIFJ4X0RNQSBpbml0IHNlcXVlbmNlCiAgKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIgc3RydWN0dXJlCiAgKi8KIHZvaWQgQ29uZmlnUnhEbWFSZWdzKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCiB7CiAJc3RydWN0IF9SWERNQV90IF9faW9tZW0gKnJ4X2RtYSA9ICZldGRldi0+cmVncy0+cnhkbWE7Ci0Jc3RydWN0IF9yeF9yaW5nX3QgKnBSeExvY2FsID0gJmV0ZGV2LT5SeFJpbmc7CisJc3RydWN0IF9yeF9yaW5nX3QgKnJ4X2xvY2FsID0gJmV0ZGV2LT5SeFJpbmc7CiAJUEZCUl9ERVNDX3QgZmJyX2VudHJ5OwotCXVpbnQzMl90IGVudHJ5OwotCVJYRE1BX1BTUl9OVU1fREVTX3QgcHNyX251bV9kZXM7CisJdTMyIGVudHJ5OworCXUzMiBwc3JfbnVtX2RlczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogSGFsdCBSWERNQSB0byBwZXJmb3JtIHRoZSByZWNvbmZpZ3VyZS4gICovCkBAIC02NzUsMzYgKzYxMSwzNSBAQAogCSAqIGFyZSBldmVyIHJldHVybmVkLCBtYWtlIHN1cmUgdGhlIGhpZ2ggcGFydCBpcyByZXRyaWV2ZWQgaGVyZQogCSAqIGJlZm9yZSBzdG9yaW5nIHRoZSBhZGp1c3RlZCBhZGRyZXNzLgogCSAqLwotCXdyaXRlbCgodWludDMyX3QpIChwUnhMb2NhbC0+UnhTdGF0dXNSZWFsUEEgPj4gMzIpLAorCXdyaXRlbCgodTMyKSAoKHU2NClyeF9sb2NhbC0+cFJ4U3RhdHVzUGEgPj4gMzIpLAogCSAgICAgICAmcnhfZG1hLT5kbWFfd2JfYmFzZV9oaSk7Ci0Jd3JpdGVsKCh1aW50MzJfdCkgcFJ4TG9jYWwtPlJ4U3RhdHVzUmVhbFBBLCAmcnhfZG1hLT5kbWFfd2JfYmFzZV9sbyk7CisJd3JpdGVsKCh1MzIpIHJ4X2xvY2FsLT5wUnhTdGF0dXNQYSwgJnJ4X2RtYS0+ZG1hX3diX2Jhc2VfbG8pOwogCi0JbWVtc2V0KHBSeExvY2FsLT5wUnhTdGF0dXNWYSwgMCwgc2l6ZW9mKFJYX1NUQVRVU19CTE9DS190KSk7CisJbWVtc2V0KHJ4X2xvY2FsLT5wUnhTdGF0dXNWYSwgMCwgc2l6ZW9mKFJYX1NUQVRVU19CTE9DS190KSk7CiAKIAkvKiBTZXQgdGhlIGFkZHJlc3MgYW5kIHBhcmFtZXRlcnMgb2YgdGhlIHBhY2tldCBzdGF0dXMgcmluZyBpbnRvIHRoZQogCSAqIDEzMTAncyByZWdpc3RlcnMKIAkgKi8KLQl3cml0ZWwoKHVpbnQzMl90KSAocFJ4TG9jYWwtPnBQU1JpbmdSZWFsUGEgPj4gMzIpLAorCXdyaXRlbCgodTMyKSAoKHU2NClyeF9sb2NhbC0+cFBTUmluZ1BhID4+IDMyKSwKIAkgICAgICAgJnJ4X2RtYS0+cHNyX2Jhc2VfaGkpOwotCXdyaXRlbCgodWludDMyX3QpIHBSeExvY2FsLT5wUFNSaW5nUmVhbFBhLCAmcnhfZG1hLT5wc3JfYmFzZV9sbyk7Ci0Jd3JpdGVsKHBSeExvY2FsLT5Qc3JOdW1FbnRyaWVzIC0gMSwgJnJ4X2RtYS0+cHNyX251bV9kZXMudmFsdWUpOwotCXdyaXRlbCgwLCAmcnhfZG1hLT5wc3JfZnVsbF9vZmZzZXQudmFsdWUpOworCXdyaXRlbCgodTMyKSByeF9sb2NhbC0+cFBTUmluZ1BhLCAmcnhfZG1hLT5wc3JfYmFzZV9sbyk7CisJd3JpdGVsKHJ4X2xvY2FsLT5Qc3JOdW1FbnRyaWVzIC0gMSwgJnJ4X2RtYS0+cHNyX251bV9kZXMpOworCXdyaXRlbCgwLCAmcnhfZG1hLT5wc3JfZnVsbF9vZmZzZXQpOwogCi0JcHNyX251bV9kZXMudmFsdWUgPSByZWFkbCgmcnhfZG1hLT5wc3JfbnVtX2Rlcy52YWx1ZSk7Ci0Jd3JpdGVsKChwc3JfbnVtX2Rlcy5iaXRzLnBzcl9uZGVzICogTE9fTUFSS19QRVJDRU5UX0ZPUl9QU1IpIC8gMTAwLAotCSAgICAgICAmcnhfZG1hLT5wc3JfbWluX2Rlcy52YWx1ZSk7CisJcHNyX251bV9kZXMgPSByZWFkbCgmcnhfZG1hLT5wc3JfbnVtX2RlcykgJiAweEZGRjsKKwl3cml0ZWwoKHBzcl9udW1fZGVzICogTE9fTUFSS19QRVJDRU5UX0ZPUl9QU1IpIC8gMTAwLAorCSAgICAgICAmcnhfZG1hLT5wc3JfbWluX2Rlcyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZXRkZXYtPlJjdkxvY2ssIGZsYWdzKTsKIAogCS8qIFRoZXNlIGxvY2FsIHZhcmlhYmxlcyB0cmFjayB0aGUgUFNSIGluIHRoZSBhZGFwdGVyIHN0cnVjdHVyZSAqLwotCXBSeExvY2FsLT5sb2NhbF9wc3JfZnVsbC5iaXRzLnBzcl9mdWxsID0gMDsKLQlwUnhMb2NhbC0+bG9jYWxfcHNyX2Z1bGwuYml0cy5wc3JfZnVsbF93cmFwID0gMDsKKwlyeF9sb2NhbC0+bG9jYWxfcHNyX2Z1bGwgPSAwOwogCiAJLyogTm93J3MgdGhlIGJlc3QgdGltZSB0byBpbml0aWFsaXplIEZCUjEgY29udGVudHMgKi8KLQlmYnJfZW50cnkgPSAoUEZCUl9ERVNDX3QpIHBSeExvY2FsLT5wRmJyMVJpbmdWYTsKLQlmb3IgKGVudHJ5ID0gMDsgZW50cnkgPCBwUnhMb2NhbC0+RmJyMU51bUVudHJpZXM7IGVudHJ5KyspIHsKLQkJZmJyX2VudHJ5LT5hZGRyX2hpID0gcFJ4TG9jYWwtPkZiclsxXS0+UEFIaWdoW2VudHJ5XTsKLQkJZmJyX2VudHJ5LT5hZGRyX2xvID0gcFJ4TG9jYWwtPkZiclsxXS0+UEFMb3dbZW50cnldOworCWZicl9lbnRyeSA9IChQRkJSX0RFU0NfdCkgcnhfbG9jYWwtPnBGYnIxUmluZ1ZhOworCWZvciAoZW50cnkgPSAwOyBlbnRyeSA8IHJ4X2xvY2FsLT5GYnIxTnVtRW50cmllczsgZW50cnkrKykgeworCQlmYnJfZW50cnktPmFkZHJfaGkgPSByeF9sb2NhbC0+RmJyWzFdLT5QQUhpZ2hbZW50cnldOworCQlmYnJfZW50cnktPmFkZHJfbG8gPSByeF9sb2NhbC0+RmJyWzFdLT5QQUxvd1tlbnRyeV07CiAJCWZicl9lbnRyeS0+d29yZDIuYml0cy5iaSA9IGVudHJ5OwogCQlmYnJfZW50cnkrKzsKIAl9CkBAIC03MTIsMzkgKzY0NywzOSBAQAogCS8qIFNldCB0aGUgYWRkcmVzcyBhbmQgcGFyYW1ldGVycyBvZiBGcmVlIGJ1ZmZlciByaW5nIDEgKGFuZCAwIGlmCiAJICogcmVxdWlyZWQpIGludG8gdGhlIDEzMTAncyByZWdpc3RlcnMKIAkgKi8KLQl3cml0ZWwoKHVpbnQzMl90KSAocFJ4TG9jYWwtPkZicjFSZWFscGEgPj4gMzIpLCAmcnhfZG1hLT5mYnIxX2Jhc2VfaGkpOwotCXdyaXRlbCgodWludDMyX3QpIHBSeExvY2FsLT5GYnIxUmVhbHBhLCAmcnhfZG1hLT5mYnIxX2Jhc2VfbG8pOwotCXdyaXRlbChwUnhMb2NhbC0+RmJyMU51bUVudHJpZXMgLSAxLCAmcnhfZG1hLT5mYnIxX251bV9kZXMudmFsdWUpOworCXdyaXRlbCgodTMyKSAocnhfbG9jYWwtPkZicjFSZWFscGEgPj4gMzIpLCAmcnhfZG1hLT5mYnIxX2Jhc2VfaGkpOworCXdyaXRlbCgodTMyKSByeF9sb2NhbC0+RmJyMVJlYWxwYSwgJnJ4X2RtYS0+ZmJyMV9iYXNlX2xvKTsKKwl3cml0ZWwocnhfbG9jYWwtPkZicjFOdW1FbnRyaWVzIC0gMSwgJnJ4X2RtYS0+ZmJyMV9udW1fZGVzKTsKIAl3cml0ZWwoRVRfRE1BMTBfV1JBUCwgJnJ4X2RtYS0+ZmJyMV9mdWxsX29mZnNldCk7CiAKIAkvKiBUaGlzIHZhcmlhYmxlIHRyYWNrcyB0aGUgZnJlZSBidWZmZXIgcmluZyAxIGZ1bGwgcG9zaXRpb24sIHNvIGl0CiAJICogaGFzIHRvIG1hdGNoIHRoZSBhYm92ZS4KIAkgKi8KLQlwUnhMb2NhbC0+bG9jYWxfRmJyMV9mdWxsID0gRVRfRE1BMTBfV1JBUDsKLQl3cml0ZWwoKChwUnhMb2NhbC0+RmJyMU51bUVudHJpZXMgKiBMT19NQVJLX1BFUkNFTlRfRk9SX1JYKSAvIDEwMCkgLSAxLAotCSAgICAgICAmcnhfZG1hLT5mYnIxX21pbl9kZXMudmFsdWUpOworCXJ4X2xvY2FsLT5sb2NhbF9GYnIxX2Z1bGwgPSBFVF9ETUExMF9XUkFQOworCXdyaXRlbCgoKHJ4X2xvY2FsLT5GYnIxTnVtRW50cmllcyAqIExPX01BUktfUEVSQ0VOVF9GT1JfUlgpIC8gMTAwKSAtIDEsCisJICAgICAgICZyeF9kbWEtPmZicjFfbWluX2Rlcyk7CiAKICNpZmRlZiBVU0VfRkJSMAogCS8qIE5vdydzIHRoZSBiZXN0IHRpbWUgdG8gaW5pdGlhbGl6ZSBGQlIwIGNvbnRlbnRzICovCi0JZmJyX2VudHJ5ID0gKFBGQlJfREVTQ190KSBwUnhMb2NhbC0+cEZicjBSaW5nVmE7Ci0JZm9yIChlbnRyeSA9IDA7IGVudHJ5IDwgcFJ4TG9jYWwtPkZicjBOdW1FbnRyaWVzOyBlbnRyeSsrKSB7Ci0JCWZicl9lbnRyeS0+YWRkcl9oaSA9IHBSeExvY2FsLT5GYnJbMF0tPlBBSGlnaFtlbnRyeV07Ci0JCWZicl9lbnRyeS0+YWRkcl9sbyA9IHBSeExvY2FsLT5GYnJbMF0tPlBBTG93W2VudHJ5XTsKKwlmYnJfZW50cnkgPSAoUEZCUl9ERVNDX3QpIHJ4X2xvY2FsLT5wRmJyMFJpbmdWYTsKKwlmb3IgKGVudHJ5ID0gMDsgZW50cnkgPCByeF9sb2NhbC0+RmJyME51bUVudHJpZXM7IGVudHJ5KyspIHsKKwkJZmJyX2VudHJ5LT5hZGRyX2hpID0gcnhfbG9jYWwtPkZiclswXS0+UEFIaWdoW2VudHJ5XTsKKwkJZmJyX2VudHJ5LT5hZGRyX2xvID0gcnhfbG9jYWwtPkZiclswXS0+UEFMb3dbZW50cnldOwogCQlmYnJfZW50cnktPndvcmQyLmJpdHMuYmkgPSBlbnRyeTsKIAkJZmJyX2VudHJ5Kys7CiAJfQogCi0Jd3JpdGVsKCh1aW50MzJfdCkgKHBSeExvY2FsLT5GYnIwUmVhbHBhID4+IDMyKSwgJnJ4X2RtYS0+ZmJyMF9iYXNlX2hpKTsKLQl3cml0ZWwoKHVpbnQzMl90KSBwUnhMb2NhbC0+RmJyMFJlYWxwYSwgJnJ4X2RtYS0+ZmJyMF9iYXNlX2xvKTsKLQl3cml0ZWwocFJ4TG9jYWwtPkZicjBOdW1FbnRyaWVzIC0gMSwgJnJ4X2RtYS0+ZmJyMF9udW1fZGVzLnZhbHVlKTsKKwl3cml0ZWwoKHUzMikgKHJ4X2xvY2FsLT5GYnIwUmVhbHBhID4+IDMyKSwgJnJ4X2RtYS0+ZmJyMF9iYXNlX2hpKTsKKwl3cml0ZWwoKHUzMikgcnhfbG9jYWwtPkZicjBSZWFscGEsICZyeF9kbWEtPmZicjBfYmFzZV9sbyk7CisJd3JpdGVsKHJ4X2xvY2FsLT5GYnIwTnVtRW50cmllcyAtIDEsICZyeF9kbWEtPmZicjBfbnVtX2Rlcyk7CiAJd3JpdGVsKEVUX0RNQTEwX1dSQVAsICZyeF9kbWEtPmZicjBfZnVsbF9vZmZzZXQpOwogCiAJLyogVGhpcyB2YXJpYWJsZSB0cmFja3MgdGhlIGZyZWUgYnVmZmVyIHJpbmcgMCBmdWxsIHBvc2l0aW9uLCBzbyBpdAogCSAqIGhhcyB0byBtYXRjaCB0aGUgYWJvdmUuCiAJICovCi0JcFJ4TG9jYWwtPmxvY2FsX0ZicjBfZnVsbCA9IEVUX0RNQTEwX1dSQVA7Ci0Jd3JpdGVsKCgocFJ4TG9jYWwtPkZicjBOdW1FbnRyaWVzICogTE9fTUFSS19QRVJDRU5UX0ZPUl9SWCkgLyAxMDApIC0gMSwKLQkgICAgICAgJnJ4X2RtYS0+ZmJyMF9taW5fZGVzLnZhbHVlKTsKKwlyeF9sb2NhbC0+bG9jYWxfRmJyMF9mdWxsID0gRVRfRE1BMTBfV1JBUDsKKwl3cml0ZWwoKChyeF9sb2NhbC0+RmJyME51bUVudHJpZXMgKiBMT19NQVJLX1BFUkNFTlRfRk9SX1JYKSAvIDEwMCkgLSAxLAorCSAgICAgICAmcnhfZG1hLT5mYnIwX21pbl9kZXMpOwogI2VuZGlmCiAKIAkvKiBQcm9ncmFtIHRoZSBudW1iZXIgb2YgcGFja2V0cyB3ZSB3aWxsIHJlY2VpdmUgYmVmb3JlIGdlbmVyYXRpbmcgYW4KQEAgLTc1MiwxNCArNjg3LDE0IEBACiAJICogRm9yIHZlcnNpb24gQiBzaWxpY29uLCB0aGlzIHZhbHVlIGdldHMgdXBkYXRlZCBvbmNlIGF1dG9uZWcgaXMKIAkgKmNvbXBsZXRlLgogCSAqLwotCXdyaXRlbChQQVJNX1JYX05VTV9CVUZTX0RFRiwgJnJ4X2RtYS0+bnVtX3BrdF9kb25lLnZhbHVlKTsKKwl3cml0ZWwoUEFSTV9SWF9OVU1fQlVGU19ERUYsICZyeF9kbWEtPm51bV9wa3RfZG9uZSk7CiAKIAkvKiBUaGUgInRpbWVfZG9uZSIgaXMgbm90IHdvcmtpbmcgY29ycmVjdGx5IHRvIGNvYWxlc2NlIGludGVycnVwdHMKIAkgKiBhZnRlciBhIGdpdmVuIHRpbWUgcGVyaW9kLCBidXQgcmF0aGVyIGlzIGdpdmluZyB1cyBhbiBpbnRlcnJ1cHQKIAkgKiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgd2UgaGF2ZSByZWNlaXZlZCBwYWNrZXRzLgogCSAqIFRoaXMgdmFsdWUgZ2V0cyB1cGRhdGVkIG9uY2UgYXV0b25lZyBpcyBjb21wbGV0ZS4KIAkgKi8KLQl3cml0ZWwoUEFSTV9SWF9USU1FX0lOVF9ERUYsICZyeF9kbWEtPm1heF9wa3RfdGltZS52YWx1ZSk7CisJd3JpdGVsKFBBUk1fUlhfVElNRV9JTlRfREVGLCAmcnhfZG1hLT5tYXhfcGt0X3RpbWUpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRkZXYtPlJjdkxvY2ssIGZsYWdzKTsKIH0KQEAgLTc3NSw4ICs3MTAsOCBAQAogCSAqLwogCWlmICgoZXRkZXYtPmxpbmtzcGVlZCA9PSBUUlVFUEhZX1NQRUVEXzEwME1CUFMpIHx8CiAJICAgIChldGRldi0+bGlua3NwZWVkID09IFRSVUVQSFlfU1BFRURfMTBNQlBTKSkgewotCQl3cml0ZWwoMCwgJmV0ZGV2LT5yZWdzLT5yeGRtYS5tYXhfcGt0X3RpbWUudmFsdWUpOwotCQl3cml0ZWwoMSwgJmV0ZGV2LT5yZWdzLT5yeGRtYS5udW1fcGt0X2RvbmUudmFsdWUpOworCQl3cml0ZWwoMCwgJmV0ZGV2LT5yZWdzLT5yeGRtYS5tYXhfcGt0X3RpbWUpOworCQl3cml0ZWwoMSwgJmV0ZGV2LT5yZWdzLT5yeGRtYS5udW1fcGt0X2RvbmUpOwogCX0KIH0KIApAQCAtODA3LDQwICs3NDIsMzUgQEAKICAqLwogdm9pZCBldDEzMXhfcnhfZG1hX2VuYWJsZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQogewotCWlmIChldGRldi0+UmVnaXN0cnlQaHlMb29wYmspCi0JCS8qIFJ4RE1BIGlzIGRpc2FibGVkIGZvciBsb29wYmFjayBvcGVyYXRpb24uICovCi0JCXdyaXRlbCgweDEsICZldGRldi0+cmVncy0+cnhkbWEuY3NyLnZhbHVlKTsKLQllbHNlIHsKIAkvKiBTZXR1cCB0aGUgcmVjZWl2ZSBkbWEgY29uZmlndXJhdGlvbiByZWdpc3RlciBmb3Igbm9ybWFsIG9wZXJhdGlvbiAqLwotCQlSWERNQV9DU1JfdCBjc3IgPSB7IDAgfTsKKwlSWERNQV9DU1JfdCBjc3IgPSB7IDAgfTsKIAotCQljc3IuYml0cy5mYnIxX2VuYWJsZSA9IDE7Ci0JCWlmIChldGRldi0+UnhSaW5nLkZicjFCdWZmZXJTaXplID09IDQwOTYpCi0JCQljc3IuYml0cy5mYnIxX3NpemUgPSAxOwotCQllbHNlIGlmIChldGRldi0+UnhSaW5nLkZicjFCdWZmZXJTaXplID09IDgxOTIpCi0JCQljc3IuYml0cy5mYnIxX3NpemUgPSAyOwotCQllbHNlIGlmIChldGRldi0+UnhSaW5nLkZicjFCdWZmZXJTaXplID09IDE2Mzg0KQotCQkJY3NyLmJpdHMuZmJyMV9zaXplID0gMzsKKwljc3IuYml0cy5mYnIxX2VuYWJsZSA9IDE7CisJaWYgKGV0ZGV2LT5SeFJpbmcuRmJyMUJ1ZmZlclNpemUgPT0gNDA5NikKKwkJY3NyLmJpdHMuZmJyMV9zaXplID0gMTsKKwllbHNlIGlmIChldGRldi0+UnhSaW5nLkZicjFCdWZmZXJTaXplID09IDgxOTIpCisJCWNzci5iaXRzLmZicjFfc2l6ZSA9IDI7CisJZWxzZSBpZiAoZXRkZXYtPlJ4UmluZy5GYnIxQnVmZmVyU2l6ZSA9PSAxNjM4NCkKKwkJY3NyLmJpdHMuZmJyMV9zaXplID0gMzsKICNpZmRlZiBVU0VfRkJSMAotCQljc3IuYml0cy5mYnIwX2VuYWJsZSA9IDE7Ci0JCWlmIChldGRldi0+UnhSaW5nLkZicjBCdWZmZXJTaXplID09IDI1NikKLQkJCWNzci5iaXRzLmZicjBfc2l6ZSA9IDE7Ci0JCWVsc2UgaWYgKGV0ZGV2LT5SeFJpbmcuRmJyMEJ1ZmZlclNpemUgPT0gNTEyKQotCQkJY3NyLmJpdHMuZmJyMF9zaXplID0gMjsKLQkJZWxzZSBpZiAoZXRkZXYtPlJ4UmluZy5GYnIwQnVmZmVyU2l6ZSA9PSAxMDI0KQotCQkJY3NyLmJpdHMuZmJyMF9zaXplID0gMzsKKwljc3IuYml0cy5mYnIwX2VuYWJsZSA9IDE7CisJaWYgKGV0ZGV2LT5SeFJpbmcuRmJyMEJ1ZmZlclNpemUgPT0gMjU2KQorCQljc3IuYml0cy5mYnIwX3NpemUgPSAxOworCWVsc2UgaWYgKGV0ZGV2LT5SeFJpbmcuRmJyMEJ1ZmZlclNpemUgPT0gNTEyKQorCQljc3IuYml0cy5mYnIwX3NpemUgPSAyOworCWVsc2UgaWYgKGV0ZGV2LT5SeFJpbmcuRmJyMEJ1ZmZlclNpemUgPT0gMTAyNCkKKwkJY3NyLmJpdHMuZmJyMF9zaXplID0gMzsKICNlbmRpZgotCQl3cml0ZWwoY3NyLnZhbHVlLCAmZXRkZXYtPnJlZ3MtPnJ4ZG1hLmNzci52YWx1ZSk7CisJd3JpdGVsKGNzci52YWx1ZSwgJmV0ZGV2LT5yZWdzLT5yeGRtYS5jc3IudmFsdWUpOwogCisJY3NyLnZhbHVlID0gcmVhZGwoJmV0ZGV2LT5yZWdzLT5yeGRtYS5jc3IudmFsdWUpOworCWlmIChjc3IuYml0cy5oYWx0X3N0YXR1cyAhPSAwKSB7CisJCXVkZWxheSg1KTsKIAkJY3NyLnZhbHVlID0gcmVhZGwoJmV0ZGV2LT5yZWdzLT5yeGRtYS5jc3IudmFsdWUpOwogCQlpZiAoY3NyLmJpdHMuaGFsdF9zdGF0dXMgIT0gMCkgewotCQkJdWRlbGF5KDUpOwotCQkJY3NyLnZhbHVlID0gcmVhZGwoJmV0ZGV2LT5yZWdzLT5yeGRtYS5jc3IudmFsdWUpOwotCQkJaWYgKGNzci5iaXRzLmhhbHRfc3RhdHVzICE9IDApIHsKLQkJCQlkZXZfZXJyKCZldGRldi0+cGRldi0+ZGV2LAotCQkJCQkiUlggRG1hIGZhaWxlZCB0byBleGl0IGhhbHQgc3RhdGUuICBDU1IgMHglMDh4XG4iLAotCQkJCQljc3IudmFsdWUpOwotCQkJfQorCQkJZGV2X2VycigmZXRkZXYtPnBkZXYtPmRldiwKKwkJCSAgICAiUlggRG1hIGZhaWxlZCB0byBleGl0IGhhbHQgc3RhdGUuICBDU1IgMHglMDh4XG4iLAorCQkJCWNzci52YWx1ZSk7CiAJCX0KIAl9CiB9CkBAIC04NDksNyArNzc5LDcgQEAKICAqIG5pY19yeF9wa3RzIC0gQ2hlY2tzIHRoZSBoYXJkd2FyZSBmb3IgYXZhaWxhYmxlIHBhY2tldHMKICAqIEBldGRldjogcG9pbnRlciB0byBvdXIgYWRhcHRlcgogICoKLSAqIFJldHVybnMgcE1wUmZkLCBhIHBvaW50ZXIgdG8gb3VyIE1QUkZELgorICogUmV0dXJucyByZmQsIGEgcG9pbnRlciB0byBvdXIgTVBSRkQuCiAgKgogICogQ2hlY2tzIHRoZSBoYXJkd2FyZSBmb3IgYXZhaWxhYmxlIHBhY2tldHMsIHVzaW5nIGNvbXBsZXRpb24gcmluZwogICogSWYgcGFja2V0cyBhcmUgYXZhaWxhYmxlLCBpdCBnZXRzIGFuIFJGRCBmcm9tIHRoZSBSZWN2TGlzdCwgYXR0YWNoZXMKQEAgLTg1OCwxMTkgKzc4OCwxMjIgQEAKICAqLwogUE1QX1JGRCBuaWNfcnhfcGt0cyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQogewotCXN0cnVjdCBfcnhfcmluZ190ICpwUnhMb2NhbCA9ICZldGRldi0+UnhSaW5nOwotCVBSWF9TVEFUVVNfQkxPQ0tfdCBwUnhTdGF0dXNCbG9jazsKLQlQUEtUX1NUQVRfREVTQ190IHBQU1JFbnRyeTsKLQlQTVBfUkZEIHBNcFJmZDsKLQl1aW50MzJfdCBuSW5kZXg7Ci0JdWludDhfdCAqcEJ1ZlZhOworCXN0cnVjdCBfcnhfcmluZ190ICpyeF9sb2NhbCA9ICZldGRldi0+UnhSaW5nOworCVBSWF9TVEFUVVNfQkxPQ0tfdCBzdGF0dXM7CisJUFBLVF9TVEFUX0RFU0NfdCBwc3I7CisJUE1QX1JGRCByZmQ7CisJdTMyIGk7CisJdWludDhfdCAqYnVmOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudDsKLQl1aW50OF90IHJpbmdJbmRleDsKLQl1aW50MTZfdCBidWZmZXJJbmRleDsKLQl1aW50MzJfdCBsb2NhbExlbjsKKwl1aW50OF90IHJpbmRleDsKKwl1aW50MTZfdCBiaW5kZXg7CisJdTMyIGxlbjsKIAlQS1RfU1RBVF9ERVNDX1dPUkQwX3QgV29yZDA7CiAKIAkvKiBSWCBTdGF0dXMgYmxvY2sgaXMgd3JpdHRlbiBieSB0aGUgRE1BIGVuZ2luZSBwcmlvciB0byBldmVyeQogCSAqIGludGVycnVwdC4gSXQgY29udGFpbnMgdGhlIG5leHQgdG8gYmUgdXNlZCBlbnRyeSBpbiB0aGUgUGFja2V0CiAJICogU3RhdHVzIFJpbmcsIGFuZCBhbHNvIHRoZSB0d28gRnJlZSBCdWZmZXIgcmluZ3MuCiAJICovCi0JcFJ4U3RhdHVzQmxvY2sgPSAoUFJYX1NUQVRVU19CTE9DS190KSBwUnhMb2NhbC0+cFJ4U3RhdHVzVmE7CisJc3RhdHVzID0gKFBSWF9TVEFUVVNfQkxPQ0tfdCkgcnhfbG9jYWwtPnBSeFN0YXR1c1ZhOwogCi0JaWYgKHBSeFN0YXR1c0Jsb2NrLT5Xb3JkMS5iaXRzLlBTUm9mZnNldCA9PQotCQkJcFJ4TG9jYWwtPmxvY2FsX3Bzcl9mdWxsLmJpdHMucHNyX2Z1bGwgJiYKLQkJCXBSeFN0YXR1c0Jsb2NrLT5Xb3JkMS5iaXRzLlBTUndyYXAgPT0KLQkJCXBSeExvY2FsLT5sb2NhbF9wc3JfZnVsbC5iaXRzLnBzcl9mdWxsX3dyYXApIHsKKwkvKiBGSVhNRTogdGlkeSBsYXRlciB3aGVuIGNvbnZlcnNpb25zIGNvbXBsZXRlICovCisJaWYgKHN0YXR1cy0+V29yZDEuYml0cy5QU1JvZmZzZXQgPT0KKwkJCShyeF9sb2NhbC0+bG9jYWxfcHNyX2Z1bGwgJiAweEZGRikgJiYKKwkJCXN0YXR1cy0+V29yZDEuYml0cy5QU1J3cmFwID09CisJCQkoKHJ4X2xvY2FsLT5sb2NhbF9wc3JfZnVsbCA+PiAxMikgJiAxKSkgewogCQkvKiBMb29rcyBsaWtlIHRoaXMgcmluZyBpcyBub3QgdXBkYXRlZCB5ZXQgKi8KIAkJcmV0dXJuIE5VTEw7CiAJfQogCiAJLyogVGhlIHBhY2tldCBzdGF0dXMgcmluZyBpbmRpY2F0ZXMgdGhhdCBkYXRhIGlzIGF2YWlsYWJsZS4gKi8KLQlwUFNSRW50cnkgPSAoUFBLVF9TVEFUX0RFU0NfdCkgKHBSeExvY2FsLT5wUFNSaW5nVmEpICsKLQkJCXBSeExvY2FsLT5sb2NhbF9wc3JfZnVsbC5iaXRzLnBzcl9mdWxsOworCXBzciA9IChQUEtUX1NUQVRfREVTQ190KSAocnhfbG9jYWwtPnBQU1JpbmdWYSkgKworCQkJKHJ4X2xvY2FsLT5sb2NhbF9wc3JfZnVsbCAmIDB4RkZGKTsKIAogCS8qIEdyYWIgYW55IGluZm9ybWF0aW9uIHRoYXQgaXMgcmVxdWlyZWQgb25jZSB0aGUgUFNSIGlzCiAJICogYWR2YW5jZWQsIHNpbmNlIHdlIGNhbiBubyBsb25nZXIgcmVseSBvbiB0aGUgbWVtb3J5IGJlaW5nCiAJICogYWNjdXJhdGUKIAkgKi8KLQlsb2NhbExlbiA9IHBQU1JFbnRyeS0+d29yZDEuYml0cy5sZW5ndGg7Ci0JcmluZ0luZGV4ID0gKHVpbnQ4X3QpIHBQU1JFbnRyeS0+d29yZDEuYml0cy5yaTsKLQlidWZmZXJJbmRleCA9ICh1aW50MTZfdCkgcFBTUkVudHJ5LT53b3JkMS5iaXRzLmJpOwotCVdvcmQwID0gcFBTUkVudHJ5LT53b3JkMDsKKwlsZW4gPSBwc3ItPndvcmQxLmJpdHMubGVuZ3RoOworCXJpbmRleCA9ICh1aW50OF90KSBwc3ItPndvcmQxLmJpdHMucmk7CisJYmluZGV4ID0gKHVpbnQxNl90KSBwc3ItPndvcmQxLmJpdHMuYmk7CisJV29yZDAgPSBwc3ItPndvcmQwOwogCiAJLyogSW5kaWNhdGUgdGhhdCB3ZSBoYXZlIHVzZWQgdGhpcyBQU1IgZW50cnkuICovCi0JaWYgKCsrcFJ4TG9jYWwtPmxvY2FsX3Bzcl9mdWxsLmJpdHMucHNyX2Z1bGwgPgotCSAgICBwUnhMb2NhbC0+UHNyTnVtRW50cmllcyAtIDEpIHsKLQkJcFJ4TG9jYWwtPmxvY2FsX3Bzcl9mdWxsLmJpdHMucHNyX2Z1bGwgPSAwOwotCQlwUnhMb2NhbC0+bG9jYWxfcHNyX2Z1bGwuYml0cy5wc3JfZnVsbF93cmFwIF49IDE7CisJLyogRklYTUUgd3JhcCAxMiAqLworCXJ4X2xvY2FsLT5sb2NhbF9wc3JfZnVsbCA9IChyeF9sb2NhbC0+bG9jYWxfcHNyX2Z1bGwgKyAxKSAmIDB4RkZGOworCWlmIChyeF9sb2NhbC0+bG9jYWxfcHNyX2Z1bGwgID4gcnhfbG9jYWwtPlBzck51bUVudHJpZXMgLSAxKSB7CisJCS8qIENsZWFyIHBzciBmdWxsIGFuZCB0b2dnbGUgdGhlIHdyYXAgYml0ICovCisJCXJ4X2xvY2FsLT5sb2NhbF9wc3JfZnVsbCAmPSAgMHhGRkY7CisJCXJ4X2xvY2FsLT5sb2NhbF9wc3JfZnVsbCBePSAweDEwMDA7CiAJfQogCi0Jd3JpdGVsKHBSeExvY2FsLT5sb2NhbF9wc3JfZnVsbC52YWx1ZSwKLQkgICAgICAgJmV0ZGV2LT5yZWdzLT5yeGRtYS5wc3JfZnVsbF9vZmZzZXQudmFsdWUpOworCXdyaXRlbChyeF9sb2NhbC0+bG9jYWxfcHNyX2Z1bGwsCisJICAgICAgICZldGRldi0+cmVncy0+cnhkbWEucHNyX2Z1bGxfb2Zmc2V0KTsKIAogI2lmbmRlZiBVU0VfRkJSMAotCWlmIChyaW5nSW5kZXggIT0gMSkgeworCWlmIChyaW5kZXggIT0gMSkgewogCQlyZXR1cm4gTlVMTDsKIAl9CiAjZW5kaWYKIAogI2lmZGVmIFVTRV9GQlIwCi0JaWYgKHJpbmdJbmRleCA+IDEgfHwKLQkJKHJpbmdJbmRleCA9PSAwICYmCi0JCWJ1ZmZlckluZGV4ID4gcFJ4TG9jYWwtPkZicjBOdW1FbnRyaWVzIC0gMSkgfHwKLQkJKHJpbmdJbmRleCA9PSAxICYmCi0JCWJ1ZmZlckluZGV4ID4gcFJ4TG9jYWwtPkZicjFOdW1FbnRyaWVzIC0gMSkpCisJaWYgKHJpbmRleCA+IDEgfHwKKwkJKHJpbmRleCA9PSAwICYmCisJCWJpbmRleCA+IHJ4X2xvY2FsLT5GYnIwTnVtRW50cmllcyAtIDEpIHx8CisJCShyaW5kZXggPT0gMSAmJgorCQliaW5kZXggPiByeF9sb2NhbC0+RmJyMU51bUVudHJpZXMgLSAxKSkKICNlbHNlCi0JaWYgKHJpbmdJbmRleCAhPSAxIHx8Ci0JCWJ1ZmZlckluZGV4ID4gcFJ4TG9jYWwtPkZicjFOdW1FbnRyaWVzIC0gMSkKKwlpZiAocmluZGV4ICE9IDEgfHwKKwkJYmluZGV4ID4gcnhfbG9jYWwtPkZicjFOdW1FbnRyaWVzIC0gMSkKICNlbmRpZgogCXsKIAkJLyogSWxsZWdhbCBidWZmZXIgb3IgcmluZyBpbmRleCBjYW5ub3QgYmUgdXNlZCBieSBTL1cqLwogCQlkZXZfZXJyKCZldGRldi0+cGRldi0+ZGV2LAogCQkJICAiTklDUnhQa3RzIFBTUiBFbnRyeSAlZCBpbmRpY2F0ZXMgIgogCQkJICAibGVuZ3RoIG9mICVkIGFuZC9vciBiYWQgYmkoJWQpXG4iLAotCQkJICBwUnhMb2NhbC0+bG9jYWxfcHNyX2Z1bGwuYml0cy5wc3JfZnVsbCwKLQkJCSAgbG9jYWxMZW4sIGJ1ZmZlckluZGV4KTsKKwkJCSAgcnhfbG9jYWwtPmxvY2FsX3Bzcl9mdWxsICYgMHhGRkYsCisJCQkgIGxlbiwgYmluZGV4KTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCiAJLyogR2V0IGFuZCBmaWxsIHRoZSBSRkQuICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5SY3ZMb2NrLCBmbGFncyk7CiAKLQlwTXBSZmQgPSBOVUxMOwotCWVsZW1lbnQgPSBwUnhMb2NhbC0+UmVjdkxpc3QubmV4dDsKLQlwTXBSZmQgPSAoUE1QX1JGRCkgbGlzdF9lbnRyeShlbGVtZW50LCBNUF9SRkQsIGxpc3Rfbm9kZSk7CisJcmZkID0gTlVMTDsKKwllbGVtZW50ID0gcnhfbG9jYWwtPlJlY3ZMaXN0Lm5leHQ7CisJcmZkID0gKFBNUF9SRkQpIGxpc3RfZW50cnkoZWxlbWVudCwgTVBfUkZELCBsaXN0X25vZGUpOwogCi0JaWYgKHBNcFJmZCA9PSBOVUxMKSB7CisJaWYgKHJmZCA9PSBOVUxMKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0ZGV2LT5SY3ZMb2NrLCBmbGFncyk7CiAJCXJldHVybiBOVUxMOwogCX0KIAotCWxpc3RfZGVsKCZwTXBSZmQtPmxpc3Rfbm9kZSk7Ci0JcFJ4TG9jYWwtPm5SZWFkeVJlY3YtLTsKKwlsaXN0X2RlbCgmcmZkLT5saXN0X25vZGUpOworCXJ4X2xvY2FsLT5uUmVhZHlSZWN2LS07CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+UmN2TG9jaywgZmxhZ3MpOwogCi0JcE1wUmZkLT5idWZmZXJpbmRleCA9IGJ1ZmZlckluZGV4OwotCXBNcFJmZC0+cmluZ2luZGV4ID0gcmluZ0luZGV4OworCXJmZC0+YnVmZmVyaW5kZXggPSBiaW5kZXg7CisJcmZkLT5yaW5naW5kZXggPSByaW5kZXg7CiAKIAkvKiBJbiBWMSBzaWxpY29uLCB0aGVyZSBpcyBhIGJ1ZyB3aGljaCBzY3Jld3MgdXAgZmlsdGVyaW5nIG9mCiAJICogcnVudCBwYWNrZXRzLiAgVGhlcmVmb3JlIHJ1bnQgcGFja2V0IGZpbHRlcmluZyBpcyBkaXNhYmxlZAogCSAqIGluIHRoZSBNQUMgYW5kIHRoZSBwYWNrZXRzIGFyZSBkcm9wcGVkIGhlcmUuICBUaGV5IGFyZQogCSAqIGFsc28gY291bnRlZCBoZXJlLgogCSAqLwotCWlmIChsb2NhbExlbiA8IChOSUNfTUlOX1BBQ0tFVF9TSVpFICsgNCkpIHsKKwlpZiAobGVuIDwgKE5JQ19NSU5fUEFDS0VUX1NJWkUgKyA0KSkgewogCQlldGRldi0+U3RhdHMub3RoZXJfZXJyb3JzKys7Ci0JCWxvY2FsTGVuID0gMDsKKwkJbGVuID0gMDsKIAl9CiAKLQlpZiAobG9jYWxMZW4pIHsKKwlpZiAobGVuKSB7CiAJCWlmIChldGRldi0+UmVwbGljYVBoeUxvb3BiayA9PSAxKSB7Ci0JCQlwQnVmVmEgPSBwUnhMb2NhbC0+RmJyW3JpbmdJbmRleF0tPlZhW2J1ZmZlckluZGV4XTsKKwkJCWJ1ZiA9IHJ4X2xvY2FsLT5GYnJbcmluZGV4XS0+VmFbYmluZGV4XTsKIAotCQkJaWYgKG1lbWNtcCgmcEJ1ZlZhWzZdLCAmZXRkZXYtPkN1cnJlbnRBZGRyZXNzWzBdLAorCQkJaWYgKG1lbWNtcCgmYnVmWzZdLCAmZXRkZXYtPkN1cnJlbnRBZGRyZXNzWzBdLAogCQkJCSAgIEVUSF9BTEVOKSA9PSAwKSB7Ci0JCQkJaWYgKG1lbWNtcCgmcEJ1ZlZhWzQyXSwgIlJlcGxpY2EgcGFja2V0IiwKKwkJCQlpZiAobWVtY21wKCZidWZbNDJdLCAiUmVwbGljYSBwYWNrZXQiLAogCQkJCQkgICBFVEhfSExFTikpIHsKIAkJCQkJZXRkZXYtPlJlcGxpY2FQaHlMb29wYmtQRiA9IDE7CiAJCQkJfQpAQCAtOTkwLDI4ICs5MjMsMjggQEAKIAkJCWlmICgoZXRkZXYtPlBhY2tldEZpbHRlciAmIEVUMTMxWF9QQUNLRVRfVFlQRV9NVUxUSUNBU1QpCiAJCQkgICAgJiYgIShldGRldi0+UGFja2V0RmlsdGVyICYgRVQxMzFYX1BBQ0tFVF9UWVBFX1BST01JU0NVT1VTKQogCQkJICAgICYmICEoZXRkZXYtPlBhY2tldEZpbHRlciAmIEVUMTMxWF9QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUKSkgewotCQkJCXBCdWZWYSA9IHBSeExvY2FsLT5GYnJbcmluZ0luZGV4XS0+Ci0JCQkJCQlWYVtidWZmZXJJbmRleF07CisJCQkJYnVmID0gcnhfbG9jYWwtPkZicltyaW5kZXhdLT4KKwkJCQkJCVZhW2JpbmRleF07CiAKIAkJCQkvKiBMb29wIHRocm91Z2ggb3VyIGxpc3QgdG8gc2VlIGlmIHRoZQogCQkJCSAqIGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgdGhpcyBwYWNrZXQKIAkJCQkgKiBtYXRjaGVzIG9uZSBpbiBvdXIgbGlzdC4KIAkJCQkgKi8KLQkJCQlmb3IgKG5JbmRleCA9IDA7Ci0JCQkJICAgICBuSW5kZXggPCBldGRldi0+TUNBZGRyZXNzQ291bnQ7Ci0JCQkJICAgICBuSW5kZXgrKykgewotCQkJCQlpZiAocEJ1ZlZhWzBdID09Ci0JCQkJCSAgICBldGRldi0+TUNMaXN0W25JbmRleF1bMF0KLQkJCQkJICAgICYmIHBCdWZWYVsxXSA9PQotCQkJCQkgICAgZXRkZXYtPk1DTGlzdFtuSW5kZXhdWzFdCi0JCQkJCSAgICAmJiBwQnVmVmFbMl0gPT0KLQkJCQkJICAgIGV0ZGV2LT5NQ0xpc3RbbkluZGV4XVsyXQotCQkJCQkgICAgJiYgcEJ1ZlZhWzNdID09Ci0JCQkJCSAgICBldGRldi0+TUNMaXN0W25JbmRleF1bM10KLQkJCQkJICAgICYmIHBCdWZWYVs0XSA9PQotCQkJCQkgICAgZXRkZXYtPk1DTGlzdFtuSW5kZXhdWzRdCi0JCQkJCSAgICAmJiBwQnVmVmFbNV0gPT0KLQkJCQkJICAgIGV0ZGV2LT5NQ0xpc3RbbkluZGV4XVs1XSkgeworCQkJCWZvciAoaSA9IDA7CisJCQkJICAgICBpIDwgZXRkZXYtPk1DQWRkcmVzc0NvdW50OworCQkJCSAgICAgaSsrKSB7CisJCQkJCWlmIChidWZbMF0gPT0KKwkJCQkJICAgIGV0ZGV2LT5NQ0xpc3RbaV1bMF0KKwkJCQkJICAgICYmIGJ1ZlsxXSA9PQorCQkJCQkgICAgZXRkZXYtPk1DTGlzdFtpXVsxXQorCQkJCQkgICAgJiYgYnVmWzJdID09CisJCQkJCSAgICBldGRldi0+TUNMaXN0W2ldWzJdCisJCQkJCSAgICAmJiBidWZbM10gPT0KKwkJCQkJICAgIGV0ZGV2LT5NQ0xpc3RbaV1bM10KKwkJCQkJICAgICYmIGJ1Zls0XSA9PQorCQkJCQkgICAgZXRkZXYtPk1DTGlzdFtpXVs0XQorCQkJCQkgICAgJiYgYnVmWzVdID09CisJCQkJCSAgICBldGRldi0+TUNMaXN0W2ldWzVdKSB7CiAJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCX0KQEAgLTEwMjQsMTEgKzk1NywxMSBAQAogCQkJCSAqIHNvIHdlIGZyZWUgb3VyIFJGRCB3aGVuIHdlIHJldHVybgogCQkJCSAqIGZyb20gdGhpcyBmdW5jdGlvbi4KIAkJCQkgKi8KLQkJCQlpZiAobkluZGV4ID09IGV0ZGV2LT5NQ0FkZHJlc3NDb3VudCkKLQkJCQkJbG9jYWxMZW4gPSAwOworCQkJCWlmIChpID09IGV0ZGV2LT5NQ0FkZHJlc3NDb3VudCkKKwkJCQkJbGVuID0gMDsKIAkJCX0KIAotCQkJaWYgKGxvY2FsTGVuID4gMCkKKwkJCWlmIChsZW4gPiAwKQogCQkJCWV0ZGV2LT5TdGF0cy5tdWx0aXJjdisrOwogCQl9IGVsc2UgaWYgKFdvcmQwLnZhbHVlICYgQUxDQVRFTF9CUk9BRENBU1RfUEtUKQogCQkJZXRkZXYtPlN0YXRzLmJyZGNzdHJjdisrOwpAQCAtMTA0MSwyNCArOTc0LDI0IEBACiAJCQlldGRldi0+U3RhdHMudW5pcmN2Kys7CiAJfQogCi0JaWYgKGxvY2FsTGVuID4gMCkgeworCWlmIChsZW4gPiAwKSB7CiAJCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwogCi0JCS8qIHBNcFJmZC0+UGFja2V0U2l6ZSA9IGxvY2FsTGVuIC0gNDsgKi8KLQkJcE1wUmZkLT5QYWNrZXRTaXplID0gbG9jYWxMZW47CisJCS8qIHJmZC0+UGFja2V0U2l6ZSA9IGxlbiAtIDQ7ICovCisJCXJmZC0+UGFja2V0U2l6ZSA9IGxlbjsKIAotCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBNcFJmZC0+UGFja2V0U2l6ZSArIDIpOworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHJmZC0+UGFja2V0U2l6ZSArIDIpOwogCQlpZiAoIXNrYikgewogCQkJZGV2X2VycigmZXRkZXYtPnBkZXYtPmRldiwKIAkJCQkgICJDb3VsZG4ndCBhbGxvYyBhbiBTS0IgZm9yIFJ4XG4iKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAKLQkJZXRkZXYtPm5ldF9zdGF0cy5yeF9ieXRlcyArPSBwTXBSZmQtPlBhY2tldFNpemU7CisJCWV0ZGV2LT5uZXRfc3RhdHMucnhfYnl0ZXMgKz0gcmZkLT5QYWNrZXRTaXplOwogCi0JCW1lbWNweShza2JfcHV0KHNrYiwgcE1wUmZkLT5QYWNrZXRTaXplKSwKLQkJICAgICAgIHBSeExvY2FsLT5GYnJbcmluZ0luZGV4XS0+VmFbYnVmZmVySW5kZXhdLAotCQkgICAgICAgcE1wUmZkLT5QYWNrZXRTaXplKTsKKwkJbWVtY3B5KHNrYl9wdXQoc2tiLCByZmQtPlBhY2tldFNpemUpLAorCQkgICAgICAgcnhfbG9jYWwtPkZicltyaW5kZXhdLT5WYVtiaW5kZXhdLAorCQkgICAgICAgcmZkLT5QYWNrZXRTaXplKTsKIAogCQlza2ItPmRldiA9IGV0ZGV2LT5uZXRkZXY7CiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGV0ZGV2LT5uZXRkZXYpOwpAQCAtMTA2NiwxMSArOTk5LDExIEBACiAKIAkJbmV0aWZfcngoc2tiKTsKIAl9IGVsc2UgewotCQlwTXBSZmQtPlBhY2tldFNpemUgPSAwOworCQlyZmQtPlBhY2tldFNpemUgPSAwOwogCX0KIAotCW5pY19yZXR1cm5fcmZkKGV0ZGV2LCBwTXBSZmQpOwotCXJldHVybiBwTXBSZmQ7CisJbmljX3JldHVybl9yZmQoZXRkZXYsIHJmZCk7CisJcmV0dXJuIHJmZDsKIH0KIAogLyoqCkBAIC0xMDgxLDIxICsxMDE0LDggQEAKICAqLwogdm9pZCBldDEzMXhfcmVzZXRfcmVjdihzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQogewotCVBNUF9SRkQgcE1wUmZkOwotCXN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQ7Ci0KIAlXQVJOX09OKGxpc3RfZW1wdHkoJmV0ZGV2LT5SeFJpbmcuUmVjdkxpc3QpKTsKIAotCS8qIFRha2UgYWxsIHRoZSBSRkQncyBmcm9tIHRoZSBwZW5kaW5nIGxpc3QsIGFuZCBzdGljayB0aGVtIG9uIHRoZQotCSAqIFJlY3ZMaXN0LgotCSAqLwotCXdoaWxlICghbGlzdF9lbXB0eSgmZXRkZXYtPlJ4UmluZy5SZWN2UGVuZGluZ0xpc3QpKSB7Ci0JCWVsZW1lbnQgPSBldGRldi0+UnhSaW5nLlJlY3ZQZW5kaW5nTGlzdC5uZXh0OwotCi0JCXBNcFJmZCA9IChQTVBfUkZEKSBsaXN0X2VudHJ5KGVsZW1lbnQsIE1QX1JGRCwgbGlzdF9ub2RlKTsKLQotCQlsaXN0X21vdmVfdGFpbCgmcE1wUmZkLT5saXN0X25vZGUsICZldGRldi0+UnhSaW5nLlJlY3ZMaXN0KTsKLQl9CiB9CiAKIC8qKgpAQCAtMTEwNiwyNyArMTAyNiwyMSBAQAogICovCiB2b2lkIGV0MTMxeF9oYW5kbGVfcmVjdl9pbnRlcnJ1cHQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKIHsKLQlQTVBfUkZEIHBNcFJmZCA9IE5VTEw7Ci0Jc3RydWN0IHNrX2J1ZmYgKlBhY2tldEFycmF5W05VTV9QQUNLRVRTX0hBTkRMRURdOwotCVBNUF9SRkQgUkZERnJlZUFycmF5W05VTV9QQUNLRVRTX0hBTkRMRURdOwotCXVpbnQzMl90IFBhY2tldEFycmF5Q291bnQgPSAwOwotCXVpbnQzMl90IFBhY2tldHNUb0hhbmRsZTsKLQl1aW50MzJfdCBQYWNrZXRGcmVlQ291bnQgPSAwOwotCWJvb2wgVGVtcFVuZmluaXNoZWRSZWMgPSBmYWxzZTsKLQotCVBhY2tldHNUb0hhbmRsZSA9IE5VTV9QQUNLRVRTX0hBTkRMRUQ7CisJUE1QX1JGRCByZmQgPSBOVUxMOworCXUzMiBjb3VudCA9IDA7CisJYm9vbCBkb25lID0gdHJ1ZTsKIAogCS8qIFByb2Nlc3MgdXAgdG8gYXZhaWxhYmxlIFJGRCdzICovCi0Jd2hpbGUgKFBhY2tldEFycmF5Q291bnQgPCBQYWNrZXRzVG9IYW5kbGUpIHsKKwl3aGlsZSAoY291bnQgPCBOVU1fUEFDS0VUU19IQU5ETEVEKSB7CiAJCWlmIChsaXN0X2VtcHR5KCZldGRldi0+UnhSaW5nLlJlY3ZMaXN0KSkgewogCQkJV0FSTl9PTihldGRldi0+UnhSaW5nLm5SZWFkeVJlY3YgIT0gMCk7Ci0JCQlUZW1wVW5maW5pc2hlZFJlYyA9IHRydWU7CisJCQlkb25lID0gZmFsc2U7CiAJCQlicmVhazsKIAkJfQogCi0JCXBNcFJmZCA9IG5pY19yeF9wa3RzKGV0ZGV2KTsKKwkJcmZkID0gbmljX3J4X3BrdHMoZXRkZXYpOwogCi0JCWlmIChwTXBSZmQgPT0gTlVMTCkKKwkJaWYgKHJmZCA9PSBOVUxMKQogCQkJYnJlYWs7CiAKIAkJLyogRG8gbm90IHJlY2VpdmUgYW55IHBhY2tldHMgdW50aWwgYSBmaWx0ZXIgaGFzIGJlZW4gc2V0LgpAQCAtMTEzNiw3ICsxMDUwLDcgQEAKIAkJICovCiAJCWlmICghZXRkZXYtPlBhY2tldEZpbHRlciB8fAogCQkgICAgIShldGRldi0+RmxhZ3MgJiBmTVBfQURBUFRFUl9MSU5LX0RFVEVDVElPTikgfHwKLQkJICAgIHBNcFJmZC0+UGFja2V0U2l6ZSA9PSAwKSB7CisJCSAgICByZmQtPlBhY2tldFNpemUgPT0gMCkgewogCQkJY29udGludWU7CiAJCX0KIApAQCAtMTE0NCwzNSArMTA1OCwyMCBAQAogCQlldGRldi0+U3RhdHMuaXBhY2tldHMrKzsKIAogCQkvKiBTZXQgdGhlIHN0YXR1cyBvbiB0aGUgcGFja2V0LCBlaXRoZXIgcmVzb3VyY2VzIG9yIHN1Y2Nlc3MgKi8KLQkJaWYgKGV0ZGV2LT5SeFJpbmcublJlYWR5UmVjdiA+PSBSRkRfTE9XX1dBVEVSX01BUkspIHsKLQkJCS8qIFB1dCB0aGlzIFJGRCBvbiB0aGUgcGVuZGluZyBsaXN0Ci0JCQkgKgotCQkJICogTk9URTogbmljX3J4X3BrdHMoKSBhYm92ZSBpcyBhbHJlYWR5IHJldHVybmluZyB0aGUKLQkJCSAqIFJGRCB0byB0aGUgUmVjdkxpc3QsIHNvIGRvbid0IGFkZGl0aW9uYWxseSBkbyB0aGF0Ci0JCQkgKiBoZXJlLgotCQkJICogQmVzaWRlcywgd2UgZG9uJ3QgcmVhbGx5IG5lZWQgKGF0IHRoaXMgcG9pbnQpIHRoZQotCQkJICogcGVuZGluZyBsaXN0IGFueXdheS4KLQkJCSAqLwotCQl9IGVsc2UgewotCQkJUkZERnJlZUFycmF5W1BhY2tldEZyZWVDb3VudF0gPSBwTXBSZmQ7Ci0JCQlQYWNrZXRGcmVlQ291bnQrKzsKLQorCQlpZiAoZXRkZXYtPlJ4UmluZy5uUmVhZHlSZWN2IDwgUkZEX0xPV19XQVRFUl9NQVJLKSB7CiAJCQlkZXZfd2FybigmZXRkZXYtPnBkZXYtPmRldiwKIAkJCQkgICAgIlJGRCdzIGFyZSBydW5uaW5nIG91dFxuIik7CiAJCX0KLQotCQlQYWNrZXRBcnJheVtQYWNrZXRBcnJheUNvdW50XSA9IHBNcFJmZC0+UGFja2V0OwotCQlQYWNrZXRBcnJheUNvdW50Kys7CisJCWNvdW50Kys7CiAJfQogCi0JaWYgKChQYWNrZXRBcnJheUNvdW50ID09IE5VTV9QQUNLRVRTX0hBTkRMRUQpIHx8IFRlbXBVbmZpbmlzaGVkUmVjKSB7CisJaWYgKGNvdW50ID09IE5VTV9QQUNLRVRTX0hBTkRMRUQgfHwgIWRvbmUpIHsKIAkJZXRkZXYtPlJ4UmluZy5VbmZpbmlzaGVkUmVjZWl2ZXMgPSB0cnVlOwogCQl3cml0ZWwoUEFSTV9UWF9USU1FX0lOVF9ERUYgKiBOQU5PX0lOX0FfTUlDUk8sCiAJCSAgICAgICAmZXRkZXYtPnJlZ3MtPmdsb2JhbC53YXRjaGRvZ190aW1lcik7Ci0JfSBlbHNlIHsKKwl9IGVsc2UKIAkJLyogV2F0Y2hkb2cgdGltZXIgd2lsbCBkaXNhYmxlIGl0c2VsZiBpZiBhcHByb3ByaWF0ZS4gKi8KIAkJZXRkZXYtPlJ4UmluZy5VbmZpbmlzaGVkUmVjZWl2ZXMgPSBmYWxzZTsKLQl9CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTMyIGJ1bXBfZmJyKHUzMiAqZmJyLCB1MzIgbGltaXQpCkBAIC0xMTk2LDE0ICsxMDk1LDE0IEBACiAvKioKICAqIE5JQ1JldHVyblJGRCAtIFJlY3ljbGUgYSBSRkQgYW5kIHB1dCBpdCBiYWNrIG9udG8gdGhlIHJlY2VpdmUgbGlzdAogICogQGV0ZGV2OiBwb2ludGVyIHRvIG91ciBhZGFwdGVyCi0gKiBAcE1wUmZkOiBwb2ludGVyIHRvIHRoZSBSRkQKKyAqIEByZmQ6IHBvaW50ZXIgdG8gdGhlIFJGRAogICovCi12b2lkIG5pY19yZXR1cm5fcmZkKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsIFBNUF9SRkQgcE1wUmZkKQordm9pZCBuaWNfcmV0dXJuX3JmZChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LCBQTVBfUkZEIHJmZCkKIHsKIAlzdHJ1Y3QgX3J4X3JpbmdfdCAqcnhfbG9jYWwgPSAmZXRkZXYtPlJ4UmluZzsKIAlzdHJ1Y3QgX1JYRE1BX3QgX19pb21lbSAqcnhfZG1hID0gJmV0ZGV2LT5yZWdzLT5yeGRtYTsKLQl1aW50MTZfdCBiaSA9IHBNcFJmZC0+YnVmZmVyaW5kZXg7Ci0JdWludDhfdCByaSA9IHBNcFJmZC0+cmluZ2luZGV4OworCXVpbnQxNl90IGJpID0gcmZkLT5idWZmZXJpbmRleDsKKwl1aW50OF90IHJpID0gcmZkLT5yaW5naW5kZXg7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIFdlIGRvbid0IHVzZSBhbnkgb2YgdGhlIE9PQiBkYXRhIGJlc2lkZXMgc3RhdHVzLiBPdGhlcndpc2UsIHdlCkBAIC0xMjE3LDcgKzExMTYsNyBAQAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZXRkZXYtPkZickxvY2ssIGZsYWdzKTsKIAogCQlpZiAocmkgPT0gMSkgewotCQkJUEZCUl9ERVNDX3QgcE5leHREZXNjID0KKwkJCVBGQlJfREVTQ190IG5leHQgPQogCQkJICAgIChQRkJSX0RFU0NfdCkgKHJ4X2xvY2FsLT5wRmJyMVJpbmdWYSkgKwogCQkJICAgIElOREVYMTAocnhfbG9jYWwtPmxvY2FsX0ZicjFfZnVsbCk7CiAKQEAgLTEyMjUsOSArMTEyNCw5IEBACiAJCQkgKiB0aGUgUEEgLyBCdWZmZXIgSW5kZXggZm9yIHRoZSByZXR1cm5lZCBidWZmZXIgaW50bwogCQkJICogdGhlIG9sZGVzdCAobmV4dCB0byBiZSBmcmVlZClGQlIgZW50cnkKIAkJCSAqLwotCQkJcE5leHREZXNjLT5hZGRyX2hpID0gcnhfbG9jYWwtPkZiclsxXS0+UEFIaWdoW2JpXTsKLQkJCXBOZXh0RGVzYy0+YWRkcl9sbyA9IHJ4X2xvY2FsLT5GYnJbMV0tPlBBTG93W2JpXTsKLQkJCXBOZXh0RGVzYy0+d29yZDIudmFsdWUgPSBiaTsKKwkJCW5leHQtPmFkZHJfaGkgPSByeF9sb2NhbC0+RmJyWzFdLT5QQUhpZ2hbYmldOworCQkJbmV4dC0+YWRkcl9sbyA9IHJ4X2xvY2FsLT5GYnJbMV0tPlBBTG93W2JpXTsKKwkJCW5leHQtPndvcmQyLnZhbHVlID0gYmk7CiAKIAkJCXdyaXRlbChidW1wX2ZicigmcnhfbG9jYWwtPmxvY2FsX0ZicjFfZnVsbCwKIAkJCQlyeF9sb2NhbC0+RmJyMU51bUVudHJpZXMgLSAxKSwKQEAgLTEyMzUsNyArMTEzNCw3IEBACiAJCX0KICNpZmRlZiBVU0VfRkJSMAogCQllbHNlIHsKLQkJCVBGQlJfREVTQ190IHBOZXh0RGVzYyA9CisJCQlQRkJSX0RFU0NfdCBuZXh0ID0KIAkJCSAgICAoUEZCUl9ERVNDX3QpIHJ4X2xvY2FsLT5wRmJyMFJpbmdWYSArCiAJCQkgICAgSU5ERVgxMChyeF9sb2NhbC0+bG9jYWxfRmJyMF9mdWxsKTsKIApAQCAtMTI0Myw5ICsxMTQyLDkgQEAKIAkJCSAqIHRoZSBQQSAvIEJ1ZmZlciBJbmRleCBmb3IgdGhlIHJldHVybmVkIGJ1ZmZlciBpbnRvCiAJCQkgKiB0aGUgb2xkZXN0IChuZXh0IHRvIGJlIGZyZWVkKSBGQlIgZW50cnkKIAkJCSAqLwotCQkJcE5leHREZXNjLT5hZGRyX2hpID0gcnhfbG9jYWwtPkZiclswXS0+UEFIaWdoW2JpXTsKLQkJCXBOZXh0RGVzYy0+YWRkcl9sbyA9IHJ4X2xvY2FsLT5GYnJbMF0tPlBBTG93W2JpXTsKLQkJCXBOZXh0RGVzYy0+d29yZDIudmFsdWUgPSBiaTsKKwkJCW5leHQtPmFkZHJfaGkgPSByeF9sb2NhbC0+RmJyWzBdLT5QQUhpZ2hbYmldOworCQkJbmV4dC0+YWRkcl9sbyA9IHJ4X2xvY2FsLT5GYnJbMF0tPlBBTG93W2JpXTsKKwkJCW5leHQtPndvcmQyLnZhbHVlID0gYmk7CiAKIAkJCXdyaXRlbChidW1wX2ZicigmcnhfbG9jYWwtPmxvY2FsX0ZicjBfZnVsbCwKIAkJCQkJcnhfbG9jYWwtPkZicjBOdW1FbnRyaWVzIC0gMSksCkBAIC0xMjYyLDcgKzExNjEsNyBAQAogCSAqIG91ciBsaXN0CiAJICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5SY3ZMb2NrLCBmbGFncyk7Ci0JbGlzdF9hZGRfdGFpbCgmcE1wUmZkLT5saXN0X25vZGUsICZyeF9sb2NhbC0+UmVjdkxpc3QpOworCWxpc3RfYWRkX3RhaWwoJnJmZC0+bGlzdF9ub2RlLCAmcnhfbG9jYWwtPlJlY3ZMaXN0KTsKIAlyeF9sb2NhbC0+blJlYWR5UmVjdisrOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0ZGV2LT5SY3ZMb2NrLCBmbGFncyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3J4LmggYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9yeC5oCmluZGV4IDcyYTUyMjkuLjY5NTE0NTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3J4LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfcnguaApAQCAtMjA5LDM2ICsyMDksMjYgQEAKIC8qIFR5cGVkZWZzIGZvciB0aGUgUlggRE1BIHN0YXR1cyB3b3JkICovCiAKIC8qCi0gKiBSWFNUQVRfV09SRDBfdCBzdHJ1Y3R1cmUgaG9sZHMgcGFydCBvZiB0aGUgc3RhdHVzIGJpdHMgb2YgdGhlIFJ4IERNQSBlbmdpbmUKKyAqIHJ4IHN0YXR1cyB3b3JkIDAgaG9sZHMgcGFydCBvZiB0aGUgc3RhdHVzIGJpdHMgb2YgdGhlIFJ4IERNQSBlbmdpbmUKICAqIHRoYXQgZ2V0IGNvcGllZCBvdXQgdG8gbWVtb3J5IGJ5IHRoZSBFVC0xMzEwLiAgV29yZCAwIGlzIGEgMzIgYml0IHdvcmQKLSAqIHdoaWNoY29udGFpbnMgRnJlZSBCdWZmZXIgcmluZyAwIGFuZCAxIGF2YWlsYWJsZSBvZmZzZXQuCisgKiB3aGljaCBjb250YWlucyB0aGUgRnJlZSBCdWZmZXIgcmluZyAwIGFuZCAxIGF2YWlsYWJsZSBvZmZzZXQuCisgKgorICogYml0IDAtOSBGQlIxIG9mZnNldAorICogYml0IDEwIFdyYXAgZmxhZyBmb3IgRkJSMQorICogYml0IDE2LTI1IEZCUjAgb2Zmc2V0CisgKiBiaXQgMjYgV3JhcCBmbGFnIGZvciBGQlIwCiAgKi8KLXR5cGVkZWYgdW5pb24gX3J4c3RhdF93b3JkMF90IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiBGQlIxdW51c2VkOjU7CS8qIGJpdHMgMjctMzEgKi8KLQkJdTMyIEZCUjF3cmFwOjE7CS8qIGJpdCAyNiAqLwotCQl1MzIgRkJSMW9mZnNldDoxMDsJLyogYml0cyAxNi0yNSAqLwotCQl1MzIgRkJSMHVudXNlZDo1OwkvKiBiaXRzIDExLTE1ICovCi0JCXUzMiBGQlIwd3JhcDoxOwkvKiBiaXQgMTAgKi8KLQkJdTMyIEZCUjBvZmZzZXQ6MTA7CS8qIGJpdHMgMC05ICovCi0jZWxzZQotCQl1MzIgRkJSMG9mZnNldDoxMDsJLyogYml0cyAwLTkgKi8KLQkJdTMyIEZCUjB3cmFwOjE7CS8qIGJpdCAxMCAqLwotCQl1MzIgRkJSMHVudXNlZDo1OwkvKiBiaXRzIDExLTE1ICovCi0JCXUzMiBGQlIxb2Zmc2V0OjEwOwkvKiBiaXRzIDE2LTI1ICovCi0JCXUzMiBGQlIxd3JhcDoxOwkvKiBiaXQgMjYgKi8KLQkJdTMyIEZCUjF1bnVzZWQ6NTsJLyogYml0cyAyNy0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBSWFNUQVRfV09SRDBfdCwgKlBSWFNUQVRfV09SRDBfdDsKIAogLyoKICAqIFJYU1RBVF9XT1JEMV90IHN0cnVjdHVyZSBob2xkcyBwYXJ0IG9mIHRoZSBzdGF0dXMgYml0cyBvZiB0aGUgUnggRE1BIGVuZ2luZQogICogdGhhdCBnZXQgY29waWVkIG91dCB0byBtZW1vcnkgYnkgdGhlIEVULTEzMTAuICBXb3JkIDMgaXMgYSAzMiBiaXQgd29yZAogICogd2hpY2ggY29udGFpbnMgdGhlIFBhY2tldCBTdGF0dXMgUmluZyBhdmFpbGFibGUgb2Zmc2V0LgogICovCisKKyNkZWZpbmUgUlhTVEFUMV9PRkZTRVQJMTYKKyNkZWZpbmUgUlhTVEFUMV9NQVNLCTB4RkZGCisjZGVmaW5lIFJYU1RBVDFfV1JBUAkweDEwMDAwMDAwCisKIHR5cGVkZWYgdW5pb24gX3J4c3RhdF93b3JkMV90IHsKIAl1MzIgdmFsdWU7CiAJc3RydWN0IHsKQEAgLTI2MSw3ICsyNTEsNyBAQAogICogaXQgc2l0cyBpbiBmcmVlIG1lbW9yeSwgYW5kIGlzIHBvaW50ZWQgdG8gYnkgMHgxMDFjIC8gMHgxMDIwCiAgKi8KIHR5cGVkZWYgc3RydWN0IF9yeF9zdGF0dXNfYmxvY2tfdCB7Ci0JUlhTVEFUX1dPUkQwX3QgV29yZDA7CisJdTMyIFdvcmQwOwogCVJYU1RBVF9XT1JEMV90IFdvcmQxOwogfSBSWF9TVEFUVVNfQkxPQ0tfdCwgKlBSWF9TVEFUVVNfQkxPQ0tfdDsKIApAQCAtMjgyLDE1ICsyNzIsNiBAQAogfSBlUlhfSU5URVJSVVBUX1NUQVRFX3QsICpQZVJYX0lOVEVSUlVQVF9TVEFURV90OwogCiAvKgotICogU3RydWN0dXJlIHRvIGhvbGQgdGhlIHNrYidzIGluIGEgbGlzdAotICovCi10eXBlZGVmIHN0cnVjdCByeF9za2JfbGlzdF9lbGVtIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHNrYl9saXN0X2VsZW07Ci0JZG1hX2FkZHJfdCBkbWFfYWRkcjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotfSBSWF9TS0JfTElTVF9FTEVNLCAqUFJYX1NLQl9MSVNUX0VMRU07Ci0KLS8qCiAgKiBSWF9SSU5HX3QgaXMgc3J1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSBhZGFwdG9yJ3MgbG9jYWwgcmVmZXJlbmNlKHMpIHRvIHRoZQogICogcmluZ3MKICAqLwpAQCAtMzE5LDIxICszMDAsMTYgQEAKIAogCXZvaWQgKnBQU1JpbmdWYTsKIAlkbWFfYWRkcl90IHBQU1JpbmdQYTsKLQl1aW50NjRfdCBwUFNSaW5nUmVhbFBhOwotCXVpbnQ2NF90IHBQU1JpbmdPZmZzZXQ7Ci0JUlhETUFfUFNSX0ZVTExfT0ZGU0VUX3QgbG9jYWxfcHNyX2Z1bGw7CisJdTMyIGxvY2FsX3Bzcl9mdWxsOwogCXUzMiBQc3JOdW1FbnRyaWVzOwogCiAJdm9pZCAqcFJ4U3RhdHVzVmE7CiAJZG1hX2FkZHJfdCBwUnhTdGF0dXNQYTsKLQl1aW50NjRfdCBSeFN0YXR1c1JlYWxQQTsKLQl1aW50NjRfdCBSeFN0YXR1c09mZnNldDsKIAogCXN0cnVjdCBsaXN0X2hlYWQgUmVjdkJ1ZmZlclBvb2w7CiAKIAkvKiBSRUNWICovCiAJc3RydWN0IGxpc3RfaGVhZCBSZWN2TGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIFJlY3ZQZW5kaW5nTGlzdDsKIAl1MzIgblJlYWR5UmVjdjsKIAogCXUzMiBOdW1SZmQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF90eC5jIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfdHguYwppbmRleCA5NGY3NzUyLi45NzdlOGIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF90eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3R4LmMKQEAgLTk0LDEzICs5NCwxMSBAQAogI2luY2x1ZGUgImV0MTMxMF90eC5oIgogCiAKLXN0YXRpYyB2b2lkIGV0MTMxeF91cGRhdGVfdGNiX2xpc3Qoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldik7Ci1zdGF0aWMgdm9pZCBldDEzMXhfY2hlY2tfc2VuZF93YWl0X2xpc3Qoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldik7CiBzdGF0aWMgaW5saW5lIHZvaWQgZXQxMzF4X2ZyZWVfc2VuZF9wYWNrZXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwKLQkJCQkJICAgUE1QX1RDQiBwTXBUY2IpOworCQkJCQkgICBzdHJ1Y3QgdGNiICp0Y2IpOwogc3RhdGljIGludCBldDEzMXhfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgIHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpOwotc3RhdGljIGludCBuaWNfc2VuZF9wYWNrZXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwgUE1QX1RDQiBwTXBUY2IpOworc3RhdGljIGludCBuaWNfc2VuZF9wYWNrZXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwgc3RydWN0IHRjYiAqdGNiKTsKIAogLyoqCiAgKiBldDEzMXhfdHhfZG1hX21lbW9yeV9hbGxvYwpAQCAtMTE3LDEyICsxMTUsMTIgQEAKIGludCBldDEzMXhfdHhfZG1hX21lbW9yeV9hbGxvYyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJaW50IGRlc2Nfc2l6ZSA9IDA7Ci0JVFhfUklOR190ICp0eF9yaW5nID0gJmFkYXB0ZXItPlR4UmluZzsKKwlzdHJ1Y3QgdHhfcmluZyAqdHhfcmluZyA9ICZhZGFwdGVyLT50eF9yaW5nOwogCiAJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgVENCJ3MgKFRyYW5zbWl0IENvbnRyb2wgQmxvY2spICovCi0JYWRhcHRlci0+VHhSaW5nLk1wVGNiTWVtID0gKE1QX1RDQiAqKWtjYWxsb2MoTlVNX1RDQiwgc2l6ZW9mKE1QX1RDQiksCi0JCQkJCQkgICAgICBHRlBfQVRPTUlDIHwgR0ZQX0RNQSk7Ci0JaWYgKCFhZGFwdGVyLT5UeFJpbmcuTXBUY2JNZW0pIHsKKwlhZGFwdGVyLT50eF9yaW5nLnRjYl9yaW5nID0gKHN0cnVjdCB0Y2IgKikKKwkJa2NhbGxvYyhOVU1fVENCLCBzaXplb2Yoc3RydWN0IHRjYiksIEdGUF9BVE9NSUMgfCBHRlBfRE1BKTsKKwlpZiAoIWFkYXB0ZXItPnR4X3JpbmcudGNiX3JpbmcpIHsKIAkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiQ2Fubm90IGFsbG9jIG1lbW9yeSBmb3IgVENCc1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTEzMCwxMiArMTI4LDEzIEBACiAJLyogQWxsb2NhdGUgZW5vdWdoIG1lbW9yeSBmb3IgdGhlIFR4IGRlc2NyaXB0b3IgcmluZywgYW5kIGFsbG9jYXRlCiAJICogc29tZSBleHRyYSBzbyB0aGF0IHRoZSByaW5nIGNhbiBiZSBhbGlnbmVkIG9uIGEgNGsgYm91bmRhcnkuCiAJICovCi0JZGVzY19zaXplID0gKHNpemVvZihUWF9ERVNDX0VOVFJZX3QpICogTlVNX0RFU0NfUEVSX1JJTkdfVFgpICsgNDA5NiAtIDE7Ci0JdHhfcmluZy0+cFR4RGVzY1JpbmdWYSA9Ci0JICAgIChQVFhfREVTQ19FTlRSWV90KSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBkZXNjX3NpemUsCi0JCQkJCQkgICAgJnR4X3JpbmctPnBUeERlc2NSaW5nUGEpOwotCWlmICghYWRhcHRlci0+VHhSaW5nLnBUeERlc2NSaW5nVmEpIHsKLQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiQ2Fubm90IGFsbG9jIG1lbW9yeSBmb3IgVHggUmluZ1xuIik7CisJZGVzY19zaXplID0gKHNpemVvZihzdHJ1Y3QgdHhfZGVzYykgKiBOVU1fREVTQ19QRVJfUklOR19UWCkgKyA0MDk2IC0gMTsKKwl0eF9yaW5nLT50eF9kZXNjX3JpbmcgPQorCSAgICAoc3RydWN0IHR4X2Rlc2MgKikgcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgZGVzY19zaXplLAorCQkJCQkJICAgICZ0eF9yaW5nLT50eF9kZXNjX3JpbmdfcGEpOworCWlmICghYWRhcHRlci0+dHhfcmluZy50eF9kZXNjX3JpbmcpIHsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJCQkiQ2Fubm90IGFsbG9jIG1lbW9yeSBmb3IgVHggUmluZ1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTQ2LDM1ICsxNDUsMTUgQEAKIAkgKiBhcmUgZXZlciByZXR1cm5lZCwgbWFrZSBzdXJlIHRoZSBoaWdoIHBhcnQgaXMgcmV0cmlldmVkIGhlcmUgYmVmb3JlCiAJICogc3RvcmluZyB0aGUgYWRqdXN0ZWQgYWRkcmVzcy4KIAkgKi8KLQl0eF9yaW5nLT5wVHhEZXNjUmluZ0FkanVzdGVkUGEgPSB0eF9yaW5nLT5wVHhEZXNjUmluZ1BhOwotCi0JLyogQWxpZ24gVHggRGVzY3JpcHRvciBSaW5nIG9uIGEgNGsgKDB4MTAwMCkgYnl0ZSBib3VuZGFyeSAqLwotCWV0MTMxeF9hbGlnbl9hbGxvY2F0ZWRfbWVtb3J5KGFkYXB0ZXIsCi0JCQkJICAgICAgJnR4X3JpbmctPnBUeERlc2NSaW5nQWRqdXN0ZWRQYSwKLQkJCQkgICAgICAmdHhfcmluZy0+VHhEZXNjT2Zmc2V0LCAweDBGRkYpOwotCi0JdHhfcmluZy0+cFR4RGVzY1JpbmdWYSArPSB0eF9yaW5nLT5UeERlc2NPZmZzZXQ7Ci0KIAkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBUeCBzdGF0dXMgYmxvY2sgKi8KLQl0eF9yaW5nLT5wVHhTdGF0dXNWYSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsCi0JCQkJCQkgICAgc2l6ZW9mKFRYX1NUQVRVU19CTE9DS190KSwKLQkJCQkJCSAgICAmdHhfcmluZy0+cFR4U3RhdHVzUGEpOwotCWlmICghYWRhcHRlci0+VHhSaW5nLnBUeFN0YXR1c1BhKSB7CisJdHhfcmluZy0+dHhfc3RhdHVzID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwKKwkJCQkJCSAgICBzaXplb2YodTMyKSwKKwkJCQkJCSAgICAmdHhfcmluZy0+dHhfc3RhdHVzX3BhKTsKKwlpZiAoIWFkYXB0ZXItPnR4X3JpbmcudHhfc3RhdHVzX3BhKSB7CiAJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKIAkJCQkgICJDYW5ub3QgYWxsb2MgbWVtb3J5IGZvciBUeCBzdGF0dXMgYmxvY2tcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0KLQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGEgZHVtbXkgYnVmZmVyICovCi0JdHhfcmluZy0+cFR4RHVtbXlCbGtWYSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsCi0JCQkJCQkgICAgICBOSUNfTUlOX1BBQ0tFVF9TSVpFLAotCQkJCQkJICAgICAgJnR4X3JpbmctPnBUeER1bW15QmxrUGEpOwotCWlmICghYWRhcHRlci0+VHhSaW5nLnBUeER1bW15QmxrUGEpIHsKLQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAotCQkJIkNhbm5vdCBhbGxvYyBtZW1vcnkgZm9yIFR4IGR1bW15IGJ1ZmZlclxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQogCXJldHVybiAwOwogfQogCkBAIC0xODgsNzYgKzE2Nyw1OSBAQAogewogCWludCBkZXNjX3NpemUgPSAwOwogCi0JaWYgKGFkYXB0ZXItPlR4UmluZy5wVHhEZXNjUmluZ1ZhKSB7CisJaWYgKGFkYXB0ZXItPnR4X3JpbmcudHhfZGVzY19yaW5nKSB7CiAJCS8qIEZyZWUgbWVtb3J5IHJlbGF0aW5nIHRvIFR4IHJpbmdzIGhlcmUgKi8KLQkJYWRhcHRlci0+VHhSaW5nLnBUeERlc2NSaW5nVmEgLT0gYWRhcHRlci0+VHhSaW5nLlR4RGVzY09mZnNldDsKLQotCQlkZXNjX3NpemUgPQotCQkgICAgKHNpemVvZihUWF9ERVNDX0VOVFJZX3QpICogTlVNX0RFU0NfUEVSX1JJTkdfVFgpICsgNDA5NiAtIDE7Ci0KKwkJZGVzY19zaXplID0gKHNpemVvZihzdHJ1Y3QgdHhfZGVzYykgKiBOVU1fREVTQ19QRVJfUklOR19UWCkKKwkJCQkJCQkJKyA0MDk2IC0gMTsKIAkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LAogCQkJCSAgICBkZXNjX3NpemUsCi0JCQkJICAgIGFkYXB0ZXItPlR4UmluZy5wVHhEZXNjUmluZ1ZhLAotCQkJCSAgICBhZGFwdGVyLT5UeFJpbmcucFR4RGVzY1JpbmdQYSk7Ci0KLQkJYWRhcHRlci0+VHhSaW5nLnBUeERlc2NSaW5nVmEgPSBOVUxMOworCQkJCSAgICBhZGFwdGVyLT50eF9yaW5nLnR4X2Rlc2NfcmluZywKKwkJCQkgICAgYWRhcHRlci0+dHhfcmluZy50eF9kZXNjX3JpbmdfcGEpOworCQlhZGFwdGVyLT50eF9yaW5nLnR4X2Rlc2NfcmluZyA9IE5VTEw7CiAJfQogCiAJLyogRnJlZSBtZW1vcnkgZm9yIHRoZSBUeCBzdGF0dXMgYmxvY2sgKi8KLQlpZiAoYWRhcHRlci0+VHhSaW5nLnBUeFN0YXR1c1ZhKSB7CisJaWYgKGFkYXB0ZXItPnR4X3JpbmcudHhfc3RhdHVzKSB7CiAJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwKLQkJCQkgICAgc2l6ZW9mKFRYX1NUQVRVU19CTE9DS190KSwKLQkJCQkgICAgYWRhcHRlci0+VHhSaW5nLnBUeFN0YXR1c1ZhLAotCQkJCSAgICBhZGFwdGVyLT5UeFJpbmcucFR4U3RhdHVzUGEpOworCQkJCSAgICBzaXplb2YodTMyKSwKKwkJCQkgICAgYWRhcHRlci0+dHhfcmluZy50eF9zdGF0dXMsCisJCQkJICAgIGFkYXB0ZXItPnR4X3JpbmcudHhfc3RhdHVzX3BhKTsKIAotCQlhZGFwdGVyLT5UeFJpbmcucFR4U3RhdHVzVmEgPSBOVUxMOworCQlhZGFwdGVyLT50eF9yaW5nLnR4X3N0YXR1cyA9IE5VTEw7CiAJfQotCi0JLyogRnJlZSBtZW1vcnkgZm9yIHRoZSBkdW1teSBidWZmZXIgKi8KLQlpZiAoYWRhcHRlci0+VHhSaW5nLnBUeER1bW15QmxrVmEpIHsKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LAotCQkJCSAgICBOSUNfTUlOX1BBQ0tFVF9TSVpFLAotCQkJCSAgICBhZGFwdGVyLT5UeFJpbmcucFR4RHVtbXlCbGtWYSwKLQkJCQkgICAgYWRhcHRlci0+VHhSaW5nLnBUeER1bW15QmxrUGEpOwotCi0JCWFkYXB0ZXItPlR4UmluZy5wVHhEdW1teUJsa1ZhID0gTlVMTDsKLQl9Ci0KLQkvKiBGcmVlIHRoZSBtZW1vcnkgZm9yIE1QX1RDQiBzdHJ1Y3R1cmVzICovCi0Ja2ZyZWUoYWRhcHRlci0+VHhSaW5nLk1wVGNiTWVtKTsKKwkvKiBGcmVlIHRoZSBtZW1vcnkgZm9yIHRoZSB0Y2Igc3RydWN0dXJlcyAqLworCWtmcmVlKGFkYXB0ZXItPnR4X3JpbmcudGNiX3JpbmcpOwogfQogCiAvKioKICAqIENvbmZpZ1R4RG1hUmVncyAtIFNldCB1cCB0aGUgdHggZG1hIHNlY3Rpb24gb2YgdGhlIEpBR0NvcmUuCiAgKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiBDb25maWd1cmUgdGhlIHRyYW5zbWl0IGVuZ2luZSB3aXRoIHRoZSByaW5nIGJ1ZmZlcnMgd2UgaGF2ZSBjcmVhdGVkCisgKiBhbmQgcHJlcGFyZSBpdCBmb3IgdXNlLgogICovCiB2b2lkIENvbmZpZ1R4RG1hUmVncyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQogewogCXN0cnVjdCBfVFhETUFfdCBfX2lvbWVtICp0eGRtYSA9ICZldGRldi0+cmVncy0+dHhkbWE7CiAKIAkvKiBMb2FkIHRoZSBoYXJkd2FyZSB3aXRoIHRoZSBzdGFydCBvZiB0aGUgdHJhbnNtaXQgZGVzY3JpcHRvciByaW5nLiAqLwotCXdyaXRlbCgodWludDMyX3QpIChldGRldi0+VHhSaW5nLnBUeERlc2NSaW5nQWRqdXN0ZWRQYSA+PiAzMiksCisJd3JpdGVsKCh1MzIpICgodTY0KWV0ZGV2LT50eF9yaW5nLnR4X2Rlc2NfcmluZ19wYSA+PiAzMiksCiAJICAgICAgICZ0eGRtYS0+cHJfYmFzZV9oaSk7Ci0Jd3JpdGVsKCh1aW50MzJfdCkgZXRkZXYtPlR4UmluZy5wVHhEZXNjUmluZ0FkanVzdGVkUGEsCisJd3JpdGVsKCh1MzIpIGV0ZGV2LT50eF9yaW5nLnR4X2Rlc2NfcmluZ19wYSwKIAkgICAgICAgJnR4ZG1hLT5wcl9iYXNlX2xvKTsKIAogCS8qIEluaXRpYWxpc2UgdGhlIHRyYW5zbWl0IERNQSBlbmdpbmUgKi8KLQl3cml0ZWwoTlVNX0RFU0NfUEVSX1JJTkdfVFggLSAxLCAmdHhkbWEtPnByX251bV9kZXMudmFsdWUpOworCXdyaXRlbChOVU1fREVTQ19QRVJfUklOR19UWCAtIDEsICZ0eGRtYS0+cHJfbnVtX2Rlcyk7CiAKLQkvKiBMb2FkIHRoZSBjb21wbGV0aW9uIHdyaXRlYmFjayBwaHlzaWNhbCBhZGRyZXNzCi0JICoKLQkgKiBOT1RFOiBwY2lfYWxsb2NfY29uc2lzdGVudCgpLCB1c2VkIGFib3ZlIHRvIGFsbG9jIERNQSByZWdpb25zLAotCSAqIEFMV0FZUyByZXR1cm5zIFNBQyAoMzItYml0KSBhZGRyZXNzZXMuIElmIERBQyAoNjQtYml0KSBhZGRyZXNzZXMKLQkgKiBhcmUgZXZlciByZXR1cm5lZCwgbWFrZSBzdXJlIHRoZSBoaWdoIHBhcnQgaXMgcmV0cmlldmVkIGhlcmUgYmVmb3JlCi0JICogc3RvcmluZyB0aGUgYWRqdXN0ZWQgYWRkcmVzcy4KLQkgKi8KLQl3cml0ZWwoMCwgJnR4ZG1hLT5kbWFfd2JfYmFzZV9oaSk7Ci0Jd3JpdGVsKGV0ZGV2LT5UeFJpbmcucFR4U3RhdHVzUGEsICZ0eGRtYS0+ZG1hX3diX2Jhc2VfbG8pOworCS8qIExvYWQgdGhlIGNvbXBsZXRpb24gd3JpdGViYWNrIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwl3cml0ZWwoKHUzMikoKHU2NClldGRldi0+dHhfcmluZy50eF9zdGF0dXNfcGEgPj4gMzIpLAorCQkJCQkJJnR4ZG1hLT5kbWFfd2JfYmFzZV9oaSk7CisJd3JpdGVsKCh1MzIpZXRkZXYtPnR4X3JpbmcudHhfc3RhdHVzX3BhLCAmdHhkbWEtPmRtYV93Yl9iYXNlX2xvKTsKIAotCW1lbXNldChldGRldi0+VHhSaW5nLnBUeFN0YXR1c1ZhLCAwLCBzaXplb2YoVFhfU1RBVFVTX0JMT0NLX3QpKTsKKwkqZXRkZXYtPnR4X3JpbmcudHhfc3RhdHVzID0gMDsKIAogCXdyaXRlbCgwLCAmdHhkbWEtPnNlcnZpY2VfcmVxdWVzdCk7Ci0JZXRkZXYtPlR4UmluZy50eERtYVJlYWR5VG9TZW5kID0gMDsKKwlldGRldi0+dHhfcmluZy5zZW5kX2lkeCA9IDA7CiB9CiAKIC8qKgpAQCAtMjc5LDE2ICsyNDEsMTEgQEAKICAqLwogdm9pZCBldDEzMXhfdHhfZG1hX2VuYWJsZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQogewotCXUzMiBjc3IgPSBFVF9UWERNQV9TTkdMX0VQS1Q7Ci0JaWYgKGV0ZGV2LT5SZWdpc3RyeVBoeUxvb3BiaykKLQkJLyogVHhETUEgaXMgZGlzYWJsZWQgZm9yIGxvb3BiYWNrIG9wZXJhdGlvbi4gKi8KLQkJY3NyIHw9IEVUX1RYRE1BX0NTUl9IQUxUOwotCWVsc2UKLQkJLyogU2V0dXAgdGhlIHRyYW5zbWl0IGRtYSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGZvciBub3JtYWwKLQkJICogb3BlcmF0aW9uCi0JCSAqLwotCQljc3IgfD0gUEFSTV9ETUFfQ0FDSEVfREVGIDw8IEVUX1RYRE1BX0NBQ0hFX1NISUZUOwotCXdyaXRlbChjc3IsICZldGRldi0+cmVncy0+dHhkbWEuY3NyKTsKKwkvKiBTZXR1cCB0aGUgdHJhbnNtaXQgZG1hIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgZm9yIG5vcm1hbAorCSAqIG9wZXJhdGlvbgorCSAqLworCXdyaXRlbChFVF9UWERNQV9TTkdMX0VQS1R8KFBBUk1fRE1BX0NBQ0hFX0RFRiA8PCBFVF9UWERNQV9DQUNIRV9TSElGVCksCisJCQkJCSZldGRldi0+cmVncy0+dHhkbWEuY3NyKTsKIH0KIAogLyoqCkBAIC0yOTcsMzkgKzI1NCwzMiBAQAogICovCiB2b2lkIGV0MTMxeF9pbml0X3NlbmQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQogewotCVBNUF9UQ0IgcE1wVGNiOwotCXVpbnQzMl90IFRjYkNvdW50OwotCVRYX1JJTkdfdCAqdHhfcmluZzsKKwlzdHJ1Y3QgdGNiICp0Y2I7CisJdTMyIGN0OworCXN0cnVjdCB0eF9yaW5nICp0eF9yaW5nOwogCiAJLyogU2V0dXAgc29tZSBjb252ZW5pZW5jZSBwb2ludGVycyAqLwotCXR4X3JpbmcgPSAmYWRhcHRlci0+VHhSaW5nOwotCXBNcFRjYiA9IGFkYXB0ZXItPlR4UmluZy5NcFRjYk1lbTsKKwl0eF9yaW5nID0gJmFkYXB0ZXItPnR4X3Jpbmc7CisJdGNiID0gYWRhcHRlci0+dHhfcmluZy50Y2JfcmluZzsKIAotCXR4X3JpbmctPlRDQlJlYWR5UXVldWVIZWFkID0gcE1wVGNiOworCXR4X3JpbmctPnRjYl9xaGVhZCA9IHRjYjsKKworCW1lbXNldCh0Y2IsIDAsIHNpemVvZihzdHJ1Y3QgdGNiKSAqIE5VTV9UQ0IpOwogCiAJLyogR28gdGhyb3VnaCBhbmQgc2V0IHVwIGVhY2ggVENCICovCi0JZm9yIChUY2JDb3VudCA9IDA7IFRjYkNvdW50IDwgTlVNX1RDQjsgVGNiQ291bnQrKykgewotCQltZW1zZXQocE1wVGNiLCAwLCBzaXplb2YoTVBfVENCKSk7Ci0KKwlmb3IgKGN0ID0gMDsgY3QrKyA8IE5VTV9UQ0I7IHRjYisrKQogCQkvKiBTZXQgdGhlIGxpbmsgcG9pbnRlciBpbiBIVyBUQ0IgdG8gdGhlIG5leHQgVENCIGluIHRoZQotCQkgKiBjaGFpbi4gIElmIHRoaXMgaXMgdGhlIGxhc3QgVENCIGluIHRoZSBjaGFpbiwgYWxzbyBzZXQgdGhlCi0JCSAqIHRhaWwgcG9pbnRlci4KKwkJICogY2hhaW4KIAkJICovCi0JCWlmIChUY2JDb3VudCA8IE5VTV9UQ0IgLSAxKSB7Ci0JCQlwTXBUY2ItPk5leHQgPSBwTXBUY2IgKyAxOwotCQl9IGVsc2UgewotCQkJdHhfcmluZy0+VENCUmVhZHlRdWV1ZVRhaWwgPSBwTXBUY2I7Ci0JCQlwTXBUY2ItPk5leHQgPSAoUE1QX1RDQikgTlVMTDsKLQkJfQorCQl0Y2ItPm5leHQgPSB0Y2IgKyAxOwogCi0JCXBNcFRjYisrOwotCX0KLQorCS8qIFNldCB0aGUgIHRhaWwgcG9pbnRlciAqLworCXRjYi0tOworCXR4X3JpbmctPnRjYl9xdGFpbCA9IHRjYjsKKwl0Y2ItPm5leHQgPSBOVUxMOwogCS8qIEN1cnIgc2VuZCBxdWV1ZSBzaG91bGQgbm93IGJlIGVtcHR5ICovCi0JdHhfcmluZy0+Q3VyclNlbmRIZWFkID0gKFBNUF9UQ0IpIE5VTEw7Ci0JdHhfcmluZy0+Q3VyclNlbmRUYWlsID0gKFBNUF9UQ0IpIE5VTEw7Ci0KLQlJTklUX0xJU1RfSEVBRCgmYWRhcHRlci0+VHhSaW5nLlNlbmRXYWl0UXVldWUpOworCXR4X3JpbmctPnNlbmRfaGVhZCA9IE5VTEw7CisJdHhfcmluZy0+c2VuZF90YWlsID0gTlVMTDsKIH0KIAogLyoqCkBAIC0zNTIsOSArMzAyLDggQEAKIAkgKiB0byBUeCwgc28gdGhlIFBhY2tldENvdW50IGFuZCBpdCdzIGFycmF5IHVzZWQgbWFrZXMgbm8gc2Vuc2UgaGVyZQogCSAqLwogCi0JLyogUXVldWUgaXMgbm90IGVtcHR5IG9yIFRDQiBpcyBub3QgYXZhaWxhYmxlICovCi0JaWYgKCFsaXN0X2VtcHR5KCZldGRldi0+VHhSaW5nLlNlbmRXYWl0UXVldWUpIHx8Ci0JICAgIE1QX1RDQl9SRVNPVVJDRVNfTk9UX0FWQUlMQUJMRShldGRldikpIHsKKwkvKiBUQ0IgaXMgbm90IGF2YWlsYWJsZSAqLworCWlmIChldGRldi0+dHhfcmluZy51c2VkID49IE5VTV9UQ0IpIHsKIAkJLyogTk9URTogSWYgdGhlcmUncyBhbiBlcnJvciBvbiBzZW5kLCBubyBuZWVkIHRvIHF1ZXVlIHRoZQogCQkgKiBwYWNrZXQgdW5kZXIgTGludXg7IGlmIHdlIGp1c3Qgc2VuZCBhbiBlcnJvciB1cCB0byB0aGUKIAkJICogbmV0aWYgbGF5ZXIsIGl0IHdpbGwgcmVzZW5kIHRoZSBza2IgdG8gdXMuCkBAIC0zNjQsMjcgKzMxMywxNSBAQAogCQkvKiBXZSBuZWVkIHRvIHNlZSBpZiB0aGUgbGluayBpcyB1cDsgaWYgaXQncyBub3QsIG1ha2UgdGhlCiAJCSAqIG5ldGlmIGxheWVyIHRoaW5rIHdlJ3JlIGdvb2QgYW5kIGRyb3AgdGhlIHBhY2tldAogCQkgKi8KLQkJLyoKLQkJICogaWYoIE1QX1NIT1VMRF9GQUlMX1NFTkQoIGV0ZGV2ICkgfHwKLQkJICogIGV0ZGV2LT5Ecml2ZXJOb1BoeUFjY2VzcyApCi0JCSAqLwotCQlpZiAoTVBfU0hPVUxEX0ZBSUxfU0VORChldGRldikgfHwgZXRkZXYtPkRyaXZlck5vUGh5QWNjZXNzCi0JCSAgICB8fCAhbmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKSB7CisJCWlmICgoZXRkZXYtPkZsYWdzICYgZk1QX0FEQVBURVJfRkFJTF9TRU5EX01BU0spIHx8CisJCQkJCSFuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKIAkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJCQlza2IgPSBOVUxMOwogCiAJCQlldGRldi0+bmV0X3N0YXRzLnR4X2Ryb3BwZWQrKzsKIAkJfSBlbHNlIHsKIAkJCXN0YXR1cyA9IGV0MTMxeF9zZW5kX3BhY2tldChza2IsIGV0ZGV2KTsKLQotCQkJaWYgKHN0YXR1cyA9PSAtRU5PTUVNKSB7Ci0KLQkJCQkvKiBOT1RFOiBJZiB0aGVyZSdzIGFuIGVycm9yIG9uIHNlbmQsIG5vIG5lZWQKLQkJCQkgKiB0byBxdWV1ZSB0aGUgcGFja2V0IHVuZGVyIExpbnV4OyBpZiB3ZSBqdXN0Ci0JCQkJICogc2VuZCBhbiBlcnJvciB1cCB0byB0aGUgbmV0aWYgbGF5ZXIsIGl0Ci0JCQkJICogd2lsbCByZXNlbmQgdGhlIHNrYiB0byB1cy4KLQkJCQkgKi8KLQkJCX0gZWxzZSBpZiAoc3RhdHVzICE9IDApIHsKKwkJCWlmIChzdGF0dXMgIT0gMCAmJiBzdGF0dXMgIT0gLUVOT01FTSkgewogCQkJCS8qIE9uIGFueSBvdGhlciBlcnJvciwgbWFrZSBuZXRpZiB0aGluayB3ZSdyZQogCQkJCSAqIE9LIGFuZCBkcm9wIHRoZSBwYWNrZXQKIAkJCQkgKi8KQEAgLTQwOSw4NyArMzQ2LDgzIEBACiBzdGF0aWMgaW50IGV0MTMxeF9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICAgc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKIHsKLQlpbnQgc3RhdHVzID0gMDsKLQlQTVBfVENCIHBNcFRjYiA9IE5VTEw7Ci0JdWludDE2X3QgKnNoYnVmdmE7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgdGNiICp0Y2IgPSBOVUxMOworCXUxNiAqc2hidWZ2YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogQWxsIHBhY2tldHMgbXVzdCBoYXZlIGF0IGxlYXN0IGEgTUFDIGFkZHJlc3MgYW5kIGEgcHJvdG9jb2wgdHlwZSAqLwotCWlmIChza2ItPmxlbiA8IEVUSF9ITEVOKSB7CisJaWYgKHNrYi0+bGVuIDwgRVRIX0hMRU4pCiAJCXJldHVybiAtRUlPOwotCX0KIAogCS8qIEdldCBhIFRDQiBmb3IgdGhpcyBwYWNrZXQgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZXRkZXYtPlRDQlJlYWR5UUxvY2ssIGZsYWdzKTsKIAotCXBNcFRjYiA9IGV0ZGV2LT5UeFJpbmcuVENCUmVhZHlRdWV1ZUhlYWQ7CisJdGNiID0gZXRkZXYtPnR4X3JpbmcudGNiX3FoZWFkOwogCi0JaWYgKHBNcFRjYiA9PSBOVUxMKSB7CisJaWYgKHRjYiA9PSBOVUxMKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0ZGV2LT5UQ0JSZWFkeVFMb2NrLCBmbGFncyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCWV0ZGV2LT5UeFJpbmcuVENCUmVhZHlRdWV1ZUhlYWQgPSBwTXBUY2ItPk5leHQ7CisJZXRkZXYtPnR4X3JpbmcudGNiX3FoZWFkID0gdGNiLT5uZXh0OwogCi0JaWYgKGV0ZGV2LT5UeFJpbmcuVENCUmVhZHlRdWV1ZUhlYWQgPT0gTlVMTCkKLQkJZXRkZXYtPlR4UmluZy5UQ0JSZWFkeVF1ZXVlVGFpbCA9IE5VTEw7CisJaWYgKGV0ZGV2LT50eF9yaW5nLnRjYl9xaGVhZCA9PSBOVUxMKQorCQlldGRldi0+dHhfcmluZy50Y2JfcXRhaWwgPSBOVUxMOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRkZXYtPlRDQlJlYWR5UUxvY2ssIGZsYWdzKTsKIAotCXBNcFRjYi0+UGFja2V0TGVuZ3RoID0gc2tiLT5sZW47Ci0JcE1wVGNiLT5QYWNrZXQgPSBza2I7CisJdGNiLT5za2IgPSBza2I7CiAKLQlpZiAoKHNrYi0+ZGF0YSAhPSBOVUxMKSAmJiAoKHNrYi0+bGVuIC0gc2tiLT5kYXRhX2xlbikgPj0gNikpIHsKLQkJc2hidWZ2YSA9ICh1aW50MTZfdCAqKSBza2ItPmRhdGE7CisJaWYgKHNrYi0+ZGF0YSAhPSBOVUxMICYmIHNrYi0+bGVuIC0gc2tiLT5kYXRhX2xlbiA+PSA2KSB7CisJCXNoYnVmdmEgPSAodTE2ICopIHNrYi0+ZGF0YTsKIAogCQlpZiAoKHNoYnVmdmFbMF0gPT0gMHhmZmZmKSAmJgogCQkgICAgKHNoYnVmdmFbMV0gPT0gMHhmZmZmKSAmJiAoc2hidWZ2YVsyXSA9PSAweGZmZmYpKSB7Ci0JCQlwTXBUY2ItPkZsYWdzIHw9IGZNUF9ERVNUX0JST0FEOworCQkJdGNiLT5mbGFncyB8PSBmTVBfREVTVF9CUk9BRDsKIAkJfSBlbHNlIGlmICgoc2hidWZ2YVswXSAmIDB4MykgPT0gMHgwMDAxKSB7Ci0JCQlwTXBUY2ItPkZsYWdzIHw9ICBmTVBfREVTVF9NVUxUSTsKKwkJCXRjYi0+ZmxhZ3MgfD0gIGZNUF9ERVNUX01VTFRJOwogCQl9CiAJfQogCi0JcE1wVGNiLT5OZXh0ID0gTlVMTDsKKwl0Y2ItPm5leHQgPSBOVUxMOwogCiAJLyogQ2FsbCB0aGUgTklDIHNwZWNpZmljIHNlbmQgaGFuZGxlci4gKi8KLQlpZiAoc3RhdHVzID09IDApCi0JCXN0YXR1cyA9IG5pY19zZW5kX3BhY2tldChldGRldiwgcE1wVGNiKTsKKwlzdGF0dXMgPSBuaWNfc2VuZF9wYWNrZXQoZXRkZXYsIHRjYik7CiAKIAlpZiAoc3RhdHVzICE9IDApIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5UQ0JSZWFkeVFMb2NrLCBmbGFncyk7CiAKLQkJaWYgKGV0ZGV2LT5UeFJpbmcuVENCUmVhZHlRdWV1ZVRhaWwpIHsKLQkJCWV0ZGV2LT5UeFJpbmcuVENCUmVhZHlRdWV1ZVRhaWwtPk5leHQgPSBwTXBUY2I7Ci0JCX0gZWxzZSB7CisJCWlmIChldGRldi0+dHhfcmluZy50Y2JfcXRhaWwpCisJCQlldGRldi0+dHhfcmluZy50Y2JfcXRhaWwtPm5leHQgPSB0Y2I7CisJCWVsc2UKIAkJCS8qIEFwcGFyZW50bHkgcmVhZHkgUSBpcyBlbXB0eS4gKi8KLQkJCWV0ZGV2LT5UeFJpbmcuVENCUmVhZHlRdWV1ZUhlYWQgPSBwTXBUY2I7Ci0JCX0KKwkJCWV0ZGV2LT50eF9yaW5nLnRjYl9xaGVhZCA9IHRjYjsKIAotCQlldGRldi0+VHhSaW5nLlRDQlJlYWR5UXVldWVUYWlsID0gcE1wVGNiOworCQlldGRldi0+dHhfcmluZy50Y2JfcXRhaWwgPSB0Y2I7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0ZGV2LT5UQ0JSZWFkeVFMb2NrLCBmbGFncyk7CiAJCXJldHVybiBzdGF0dXM7CiAJfQotCVdBUk5fT04oZXRkZXYtPlR4UmluZy5uQnVzeVNlbmQgPiBOVU1fVENCKTsKKwlXQVJOX09OKGV0ZGV2LT50eF9yaW5nLnVzZWQgPiBOVU1fVENCKTsKIAlyZXR1cm4gMDsKIH0KIAogLyoqCiAgKiBuaWNfc2VuZF9wYWNrZXQgLSBOSUMgc3BlY2lmaWMgc2VuZCBoYW5kbGVyIGZvciB2ZXJzaW9uIEIgc2lsaWNvbi4KICAqIEBldGRldjogcG9pbnRlciB0byBvdXIgYWRhcHRlcgotICogQHBNcFRjYjogcG9pbnRlciB0byBNUF9UQ0IKKyAqIEB0Y2I6IHBvaW50ZXIgdG8gc3RydWN0IHRjYgogICoKICAqIFJldHVybnMgMCBvciBlcnJuby4KICAqLwotc3RhdGljIGludCBuaWNfc2VuZF9wYWNrZXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwgUE1QX1RDQiBwTXBUY2IpCitzdGF0aWMgaW50IG5pY19zZW5kX3BhY2tldChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LCBzdHJ1Y3QgdGNiICp0Y2IpCiB7Ci0JdWludDMyX3QgbG9vcEluZGV4OwotCVRYX0RFU0NfRU5UUllfdCBDdXJEZXNjWzI0XTsKLQl1aW50MzJfdCBGcmFnbWVudE51bWJlciA9IDA7Ci0JdWludDMyX3QgdGhpc2NvcHksIHJlbWFpbmRlcjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcFBhY2tldCA9IHBNcFRjYi0+UGFja2V0OwotCXVpbnQzMl90IEZyYWdMaXN0Q291bnQgPSBza2Jfc2hpbmZvKHBQYWNrZXQpLT5ucl9mcmFncyArIDE7Ci0Jc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqcEZyYWdMaXN0ID0gJnNrYl9zaGluZm8ocFBhY2tldCktPmZyYWdzWzBdOworCXUzMiBpOworCXN0cnVjdCB0eF9kZXNjIGRlc2NbMjRdOwkvKiAyNCB4IDE2IGJ5dGUgKi8KKwl1MzIgZnJhZyA9IDA7CisJdTMyIHRoaXNjb3B5LCByZW1haW5kZXI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHRjYi0+c2tiOworCXUzMiBucl9mcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgKyAxOworCXN0cnVjdCBza2JfZnJhZ19zdHJ1Y3QgKmZyYWdzID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbMF07CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIFBhcnQgb2YgdGhlIG9wdGltaXphdGlvbnMgb2YgdGhpcyBzZW5kIHJvdXRpbmUgcmVzdHJpY3QgdXMgdG8KQEAgLTUwMCwxNyArNDMzLDE2IEBACiAJICogbnVtYmVyIG9mIGZyYWdtZW50cy4gSWYgbmVlZGVkLCB3ZSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uLAogCSAqIGFsdGhvdWdoIGl0IGlzIGxlc3MgZWZmaWNpZW50LgogCSAqLwotCWlmIChGcmFnTGlzdENvdW50ID4gMjMpIHsKKwlpZiAobnJfZnJhZ3MgPiAyMykKIAkJcmV0dXJuIC1FSU87Ci0JfQogCi0JbWVtc2V0KEN1ckRlc2MsIDAsIHNpemVvZihUWF9ERVNDX0VOVFJZX3QpICogKEZyYWdMaXN0Q291bnQgKyAxKSk7CisJbWVtc2V0KGRlc2MsIDAsIHNpemVvZihzdHJ1Y3QgdHhfZGVzYykgKiAobnJfZnJhZ3MgKyAxKSk7CiAKLQlmb3IgKGxvb3BJbmRleCA9IDA7IGxvb3BJbmRleCA8IEZyYWdMaXN0Q291bnQ7IGxvb3BJbmRleCsrKSB7CisJZm9yIChpID0gMDsgaSA8IG5yX2ZyYWdzOyBpKyspIHsKIAkJLyogSWYgdGhlcmUgaXMgc29tZXRoaW5nIGluIHRoaXMgZWxlbWVudCwgbGV0cyBnZXQgYQogCQkgKiBkZXNjcmlwdG9yIGZyb20gdGhlIHJpbmcgYW5kIGdldCB0aGUgbmVjZXNzYXJ5IGRhdGEKIAkJICovCi0JCWlmIChsb29wSW5kZXggPT0gMCkgeworCQlpZiAoaSA9PSAwKSB7CiAJCQkvKiBJZiB0aGUgZnJhZ21lbnRzIGFyZSBzbWFsbGVyIHRoYW4gYSBzdGFuZGFyZCBNVFUsCiAJCQkgKiB0aGVuIG1hcCB0aGVtIHRvIGEgc2luZ2xlIGRlc2NyaXB0b3IgaW4gdGhlIFR4CiAJCQkgKiBEZXNjIHJpbmcuIEhvd2V2ZXIsIGlmIHRoZXkncmUgbGFyZ2VyLCBhcyBpcwpAQCAtNTIwLDE2NiArNDUyLDE2NCBAQAogCQkJICogVGhpcyB3aWxsIHdvcmsgdW50aWwgd2UgZGV0ZXJtaW5lIHdoeSB0aGUgaGFyZHdhcmUKIAkJCSAqIGRvZXNuJ3Qgc2VlbSB0byBsaWtlIGxhcmdlIGZyYWdtZW50cy4KIAkJCSAqLwotCQkJaWYgKChwUGFja2V0LT5sZW4gLSBwUGFja2V0LT5kYXRhX2xlbikgPD0gMTUxNCkgewotCQkJCUN1ckRlc2NbRnJhZ21lbnROdW1iZXJdLkRhdGFCdWZmZXJQdHJIaWdoID0gMDsKLQkJCQlDdXJEZXNjW0ZyYWdtZW50TnVtYmVyXS53b3JkMi5iaXRzLgotCQkJCSAgICBsZW5ndGhfaW5fYnl0ZXMgPQotCQkJCSAgICBwUGFja2V0LT5sZW4gLSBwUGFja2V0LT5kYXRhX2xlbjsKKwkJCWlmICgoc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuKSA8PSAxNTE0KSB7CisJCQkJZGVzY1tmcmFnXS5hZGRyX2hpID0gMDsKKwkJCQkvKiBMb3cgMTZiaXRzIGFyZSBsZW5ndGgsIGhpZ2ggaXMgdmxhbiBhbmQKKwkJCQkgICB1bnVzZWQgY3VycmVudGx5IHNvIHplcm8gKi8KKwkJCQlkZXNjW2ZyYWddLmxlbl92bGFuID0KKwkJCQkJc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuOwogCiAJCQkJLyogTk9URTogSGVyZSwgdGhlIGRtYV9hZGRyX3QgcmV0dXJuZWQgZnJvbQogCQkJCSAqIHBjaV9tYXBfc2luZ2xlKCkgaXMgaW1wbGljaXRseSBjYXN0IGFzIGEKLQkJCQkgKiB1aW50MzJfdC4gQWx0aG91Z2ggZG1hX2FkZHJfdCBjYW4gYmUKKwkJCQkgKiB1MzIuIEFsdGhvdWdoIGRtYV9hZGRyX3QgY2FuIGJlCiAJCQkJICogNjQtYml0LCB0aGUgYWRkcmVzcyByZXR1cm5lZCBieQogCQkJCSAqIHBjaV9tYXBfc2luZ2xlKCkgaXMgYWx3YXlzIDMyLWJpdAogCQkJCSAqIGFkZHJlc3NhYmxlIChhcyBkZWZpbmVkIGJ5IHRoZSBwY2kvZG1hCiAJCQkJICogc3Vic3lzdGVtKQogCQkJCSAqLwotCQkJCUN1ckRlc2NbRnJhZ21lbnROdW1iZXIrK10uRGF0YUJ1ZmZlclB0ckxvdyA9CisJCQkJZGVzY1tmcmFnKytdLmFkZHJfbG8gPQogCQkJCSAgICBwY2lfbWFwX3NpbmdsZShldGRldi0+cGRldiwKLQkJCQkJCSAgIHBQYWNrZXQtPmRhdGEsCi0JCQkJCQkgICBwUGFja2V0LT5sZW4gLQotCQkJCQkJICAgcFBhY2tldC0+ZGF0YV9sZW4sCisJCQkJCQkgICBza2ItPmRhdGEsCisJCQkJCQkgICBza2ItPmxlbiAtCisJCQkJCQkgICBza2ItPmRhdGFfbGVuLAogCQkJCQkJICAgUENJX0RNQV9UT0RFVklDRSk7CiAJCQl9IGVsc2UgewotCQkJCUN1ckRlc2NbRnJhZ21lbnROdW1iZXJdLkRhdGFCdWZmZXJQdHJIaWdoID0gMDsKLQkJCQlDdXJEZXNjW0ZyYWdtZW50TnVtYmVyXS53b3JkMi5iaXRzLgotCQkJCSAgICBsZW5ndGhfaW5fYnl0ZXMgPQotCQkJCSAgICAoKHBQYWNrZXQtPmxlbiAtIHBQYWNrZXQtPmRhdGFfbGVuKSAvIDIpOworCQkJCWRlc2NbZnJhZ10uYWRkcl9oaSA9IDA7CisJCQkJZGVzY1tmcmFnXS5sZW5fdmxhbiA9CisJCQkJICAgIChza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW4pIC8gMjsKIAogCQkJCS8qIE5PVEU6IEhlcmUsIHRoZSBkbWFfYWRkcl90IHJldHVybmVkIGZyb20KIAkJCQkgKiBwY2lfbWFwX3NpbmdsZSgpIGlzIGltcGxpY2l0bHkgY2FzdCBhcyBhCi0JCQkJICogdWludDMyX3QuIEFsdGhvdWdoIGRtYV9hZGRyX3QgY2FuIGJlCisJCQkJICogdTMyLiBBbHRob3VnaCBkbWFfYWRkcl90IGNhbiBiZQogCQkJCSAqIDY0LWJpdCwgdGhlIGFkZHJlc3MgcmV0dXJuZWQgYnkKIAkJCQkgKiBwY2lfbWFwX3NpbmdsZSgpIGlzIGFsd2F5cyAzMi1iaXQKIAkJCQkgKiBhZGRyZXNzYWJsZSAoYXMgZGVmaW5lZCBieSB0aGUgcGNpL2RtYQogCQkJCSAqIHN1YnN5c3RlbSkKIAkJCQkgKi8KLQkJCQlDdXJEZXNjW0ZyYWdtZW50TnVtYmVyKytdLkRhdGFCdWZmZXJQdHJMb3cgPQorCQkJCWRlc2NbZnJhZysrXS5hZGRyX2xvID0KIAkJCQkgICAgcGNpX21hcF9zaW5nbGUoZXRkZXYtPnBkZXYsCi0JCQkJCQkgICBwUGFja2V0LT5kYXRhLAotCQkJCQkJICAgKChwUGFja2V0LT5sZW4gLQotCQkJCQkJICAgICBwUGFja2V0LT5kYXRhX2xlbikgLyAyKSwKKwkJCQkJCSAgIHNrYi0+ZGF0YSwKKwkJCQkJCSAgICgoc2tiLT5sZW4gLQorCQkJCQkJICAgICBza2ItPmRhdGFfbGVuKSAvIDIpLAogCQkJCQkJICAgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkJQ3VyRGVzY1tGcmFnbWVudE51bWJlcl0uRGF0YUJ1ZmZlclB0ckhpZ2ggPSAwOworCQkJCWRlc2NbZnJhZ10uYWRkcl9oaSA9IDA7CiAKLQkJCQlDdXJEZXNjW0ZyYWdtZW50TnVtYmVyXS53b3JkMi5iaXRzLgotCQkJCSAgICBsZW5ndGhfaW5fYnl0ZXMgPQotCQkJCSAgICAoKHBQYWNrZXQtPmxlbiAtIHBQYWNrZXQtPmRhdGFfbGVuKSAvIDIpOworCQkJCWRlc2NbZnJhZ10ubGVuX3ZsYW4gPQorCQkJCSAgICAoc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuKSAvIDI7CiAKIAkJCQkvKiBOT1RFOiBIZXJlLCB0aGUgZG1hX2FkZHJfdCByZXR1cm5lZCBmcm9tCiAJCQkJICogcGNpX21hcF9zaW5nbGUoKSBpcyBpbXBsaWNpdGx5IGNhc3QgYXMgYQotCQkJCSAqIHVpbnQzMl90LiBBbHRob3VnaCBkbWFfYWRkcl90IGNhbiBiZQorCQkJCSAqIHUzMi4gQWx0aG91Z2ggZG1hX2FkZHJfdCBjYW4gYmUKIAkJCQkgKiA2NC1iaXQsIHRoZSBhZGRyZXNzIHJldHVybmVkIGJ5CiAJCQkJICogcGNpX21hcF9zaW5nbGUoKSBpcyBhbHdheXMgMzItYml0CiAJCQkJICogYWRkcmVzc2FibGUgKGFzIGRlZmluZWQgYnkgdGhlIHBjaS9kbWEKIAkJCQkgKiBzdWJzeXN0ZW0pCiAJCQkJICovCi0JCQkJQ3VyRGVzY1tGcmFnbWVudE51bWJlcisrXS5EYXRhQnVmZmVyUHRyTG93ID0KKwkJCQlkZXNjW2ZyYWcrK10uYWRkcl9sbyA9CiAJCQkJICAgIHBjaV9tYXBfc2luZ2xlKGV0ZGV2LT5wZGV2LAotCQkJCQkJICAgcFBhY2tldC0+ZGF0YSArCi0JCQkJCQkgICAoKHBQYWNrZXQtPmxlbiAtCi0JCQkJCQkgICAgIHBQYWNrZXQtPmRhdGFfbGVuKSAvIDIpLAotCQkJCQkJICAgKChwUGFja2V0LT5sZW4gLQotCQkJCQkJICAgICBwUGFja2V0LT5kYXRhX2xlbikgLyAyKSwKKwkJCQkJCSAgIHNrYi0+ZGF0YSArCisJCQkJCQkgICAoKHNrYi0+bGVuIC0KKwkJCQkJCSAgICAgc2tiLT5kYXRhX2xlbikgLyAyKSwKKwkJCQkJCSAgICgoc2tiLT5sZW4gLQorCQkJCQkJICAgICBza2ItPmRhdGFfbGVuKSAvIDIpLAogCQkJCQkJICAgUENJX0RNQV9UT0RFVklDRSk7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlDdXJEZXNjW0ZyYWdtZW50TnVtYmVyXS5EYXRhQnVmZmVyUHRySGlnaCA9IDA7Ci0JCQlDdXJEZXNjW0ZyYWdtZW50TnVtYmVyXS53b3JkMi5iaXRzLmxlbmd0aF9pbl9ieXRlcyA9Ci0JCQkgICAgcEZyYWdMaXN0W2xvb3BJbmRleCAtIDFdLnNpemU7CisJCQlkZXNjW2ZyYWddLmFkZHJfaGkgPSAwOworCQkJZGVzY1tmcmFnXS5sZW5fdmxhbiA9CisJCQkJCWZyYWdzW2kgLSAxXS5zaXplOwogCiAJCQkvKiBOT1RFOiBIZXJlLCB0aGUgZG1hX2FkZHJfdCByZXR1cm5lZCBmcm9tCi0JCQkgKiBwY2lfbWFwX3BhZ2UoKSBpcyBpbXBsaWNpdGx5IGNhc3QgYXMgYSB1aW50MzJfdC4KKwkJCSAqIHBjaV9tYXBfcGFnZSgpIGlzIGltcGxpY2l0bHkgY2FzdCBhcyBhIHUzMi4KIAkJCSAqIEFsdGhvdWdoIGRtYV9hZGRyX3QgY2FuIGJlIDY0LWJpdCwgdGhlIGFkZHJlc3MKIAkJCSAqIHJldHVybmVkIGJ5IHBjaV9tYXBfcGFnZSgpIGlzIGFsd2F5cyAzMi1iaXQKIAkJCSAqIGFkZHJlc3NhYmxlIChhcyBkZWZpbmVkIGJ5IHRoZSBwY2kvZG1hIHN1YnN5c3RlbSkKIAkJCSAqLwotCQkJQ3VyRGVzY1tGcmFnbWVudE51bWJlcisrXS5EYXRhQnVmZmVyUHRyTG93ID0KKwkJCWRlc2NbZnJhZysrXS5hZGRyX2xvID0KIAkJCSAgICBwY2lfbWFwX3BhZ2UoZXRkZXYtPnBkZXYsCi0JCQkJCSBwRnJhZ0xpc3RbbG9vcEluZGV4IC0gMV0ucGFnZSwKLQkJCQkJIHBGcmFnTGlzdFtsb29wSW5kZXggLSAxXS5wYWdlX29mZnNldCwKLQkJCQkJIHBGcmFnTGlzdFtsb29wSW5kZXggLSAxXS5zaXplLAorCQkJCQkgZnJhZ3NbaSAtIDFdLnBhZ2UsCisJCQkJCSBmcmFnc1tpIC0gMV0ucGFnZV9vZmZzZXQsCisJCQkJCSBmcmFnc1tpIC0gMV0uc2l6ZSwKIAkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOwogCQl9CiAJfQogCi0JaWYgKEZyYWdtZW50TnVtYmVyID09IDApCisJaWYgKGZyYWcgPT0gMCkKIAkJcmV0dXJuIC1FSU87CiAKIAlpZiAoZXRkZXYtPmxpbmtzcGVlZCA9PSBUUlVFUEhZX1NQRUVEXzEwMDBNQlBTKSB7Ci0JCWlmICgrK2V0ZGV2LT5UeFJpbmcuVHhQYWNrZXRzU2luY2VMYXN0aW50ZXJydXB0ID09Ci0JCSAgICBQQVJNX1RYX05VTV9CVUZTX0RFRikgewotCQkJQ3VyRGVzY1tGcmFnbWVudE51bWJlciAtIDFdLndvcmQzLnZhbHVlID0gMHg1OwotCQkJZXRkZXYtPlR4UmluZy5UeFBhY2tldHNTaW5jZUxhc3RpbnRlcnJ1cHQgPSAwOwotCQl9IGVsc2UgewotCQkJQ3VyRGVzY1tGcmFnbWVudE51bWJlciAtIDFdLndvcmQzLnZhbHVlID0gMHgxOworCQlpZiAoKytldGRldi0+dHhfcmluZy5zaW5jZV9pcnEgPT0gUEFSTV9UWF9OVU1fQlVGU19ERUYpIHsKKwkJCS8qIExhc3QgZWxlbWVudCAmIEludGVycnVwdCBmbGFnICovCisJCQlkZXNjW2ZyYWcgLSAxXS5mbGFncyA9IDB4NTsKKwkJCWV0ZGV2LT50eF9yaW5nLnNpbmNlX2lycSA9IDA7CisJCX0gZWxzZSB7IC8qIExhc3QgZWxlbWVudCAqLworCQkJZGVzY1tmcmFnIC0gMV0uZmxhZ3MgPSAweDE7CiAJCX0KLQl9IGVsc2UgewotCQlDdXJEZXNjW0ZyYWdtZW50TnVtYmVyIC0gMV0ud29yZDMudmFsdWUgPSAweDU7Ci0JfQorCX0gZWxzZQorCQlkZXNjW2ZyYWcgLSAxXS5mbGFncyA9IDB4NTsKIAotCUN1ckRlc2NbMF0ud29yZDMuYml0cy5mID0gMTsKKwlkZXNjWzBdLmZsYWdzIHw9IDI7CS8qIEZpcnN0IGVsZW1lbnQgZmxhZyAqLwogCi0JcE1wVGNiLT5XckluZGV4U3RhcnQgPSBldGRldi0+VHhSaW5nLnR4RG1hUmVhZHlUb1NlbmQ7Ci0JcE1wVGNiLT5QYWNrZXRTdGFsZUNvdW50ID0gMDsKKwl0Y2ItPmluZGV4X3N0YXJ0ID0gZXRkZXYtPnR4X3Jpbmcuc2VuZF9pZHg7CisJdGNiLT5zdGFsZSA9IDA7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZXRkZXYtPlNlbmRIV0xvY2ssIGZsYWdzKTsKIAogCXRoaXNjb3B5ID0gTlVNX0RFU0NfUEVSX1JJTkdfVFggLQotCQkJCUlOREVYMTAoZXRkZXYtPlR4UmluZy50eERtYVJlYWR5VG9TZW5kKTsKKwkJCQlJTkRFWDEwKGV0ZGV2LT50eF9yaW5nLnNlbmRfaWR4KTsKIAotCWlmICh0aGlzY29weSA+PSBGcmFnbWVudE51bWJlcikgeworCWlmICh0aGlzY29weSA+PSBmcmFnKSB7CiAJCXJlbWFpbmRlciA9IDA7Ci0JCXRoaXNjb3B5ID0gRnJhZ21lbnROdW1iZXI7CisJCXRoaXNjb3B5ID0gZnJhZzsKIAl9IGVsc2UgewotCQlyZW1haW5kZXIgPSBGcmFnbWVudE51bWJlciAtIHRoaXNjb3B5OworCQlyZW1haW5kZXIgPSBmcmFnIC0gdGhpc2NvcHk7CiAJfQogCi0JbWVtY3B5KGV0ZGV2LT5UeFJpbmcucFR4RGVzY1JpbmdWYSArCi0JICAgICAgIElOREVYMTAoZXRkZXYtPlR4UmluZy50eERtYVJlYWR5VG9TZW5kKSwgQ3VyRGVzYywKLQkgICAgICAgc2l6ZW9mKFRYX0RFU0NfRU5UUllfdCkgKiB0aGlzY29weSk7CisJbWVtY3B5KGV0ZGV2LT50eF9yaW5nLnR4X2Rlc2NfcmluZyArCisJICAgICAgIElOREVYMTAoZXRkZXYtPnR4X3Jpbmcuc2VuZF9pZHgpLCBkZXNjLAorCSAgICAgICBzaXplb2Yoc3RydWN0IHR4X2Rlc2MpICogdGhpc2NvcHkpOwogCi0JYWRkXzEwYml0KCZldGRldi0+VHhSaW5nLnR4RG1hUmVhZHlUb1NlbmQsIHRoaXNjb3B5KTsKKwlhZGRfMTBiaXQoJmV0ZGV2LT50eF9yaW5nLnNlbmRfaWR4LCB0aGlzY29weSk7CiAKLQlpZiAoSU5ERVgxMChldGRldi0+VHhSaW5nLnR4RG1hUmVhZHlUb1NlbmQpPT0gMCB8fAotCSAgICBJTkRFWDEwKGV0ZGV2LT5UeFJpbmcudHhEbWFSZWFkeVRvU2VuZCkgPT0gTlVNX0RFU0NfUEVSX1JJTkdfVFgpIHsKLQkgICAgIAlldGRldi0+VHhSaW5nLnR4RG1hUmVhZHlUb1NlbmQgJj0gfkVUX0RNQTEwX01BU0s7Ci0JICAgICAJZXRkZXYtPlR4UmluZy50eERtYVJlYWR5VG9TZW5kIF49IEVUX0RNQTEwX1dSQVA7CisJaWYgKElOREVYMTAoZXRkZXYtPnR4X3Jpbmcuc2VuZF9pZHgpID09IDAgfHwKKwkJICAgIElOREVYMTAoZXRkZXYtPnR4X3Jpbmcuc2VuZF9pZHgpID09IE5VTV9ERVNDX1BFUl9SSU5HX1RYKSB7CisJCWV0ZGV2LT50eF9yaW5nLnNlbmRfaWR4ICY9IH5FVF9ETUExMF9NQVNLOworCQlldGRldi0+dHhfcmluZy5zZW5kX2lkeCBePSBFVF9ETUExMF9XUkFQOwogCX0KIAogCWlmIChyZW1haW5kZXIpIHsKLQkJbWVtY3B5KGV0ZGV2LT5UeFJpbmcucFR4RGVzY1JpbmdWYSwKLQkJICAgICAgIEN1ckRlc2MgKyB0aGlzY29weSwKLQkJICAgICAgIHNpemVvZihUWF9ERVNDX0VOVFJZX3QpICogcmVtYWluZGVyKTsKKwkJbWVtY3B5KGV0ZGV2LT50eF9yaW5nLnR4X2Rlc2NfcmluZywKKwkJICAgICAgIGRlc2MgKyB0aGlzY29weSwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgdHhfZGVzYykgKiByZW1haW5kZXIpOwogCi0JCWFkZF8xMGJpdCgmZXRkZXYtPlR4UmluZy50eERtYVJlYWR5VG9TZW5kLCByZW1haW5kZXIpOworCQlhZGRfMTBiaXQoJmV0ZGV2LT50eF9yaW5nLnNlbmRfaWR4LCByZW1haW5kZXIpOwogCX0KIAotCWlmIChJTkRFWDEwKGV0ZGV2LT5UeFJpbmcudHhEbWFSZWFkeVRvU2VuZCkgPT0gMCkgewotCQlpZiAoZXRkZXYtPlR4UmluZy50eERtYVJlYWR5VG9TZW5kKQotCQkJcE1wVGNiLT5XckluZGV4ID0gTlVNX0RFU0NfUEVSX1JJTkdfVFggLSAxOworCWlmIChJTkRFWDEwKGV0ZGV2LT50eF9yaW5nLnNlbmRfaWR4KSA9PSAwKSB7CisJCWlmIChldGRldi0+dHhfcmluZy5zZW5kX2lkeCkKKwkJCXRjYi0+aW5kZXggPSBOVU1fREVTQ19QRVJfUklOR19UWCAtIDE7CiAJCWVsc2UKLQkJCXBNcFRjYi0+V3JJbmRleD0gRVRfRE1BMTBfV1JBUCB8IChOVU1fREVTQ19QRVJfUklOR19UWCAtIDEpOworCQkJdGNiLT5pbmRleCA9IEVUX0RNQTEwX1dSQVB8KE5VTV9ERVNDX1BFUl9SSU5HX1RYIC0gMSk7CiAJfSBlbHNlCi0JCXBNcFRjYi0+V3JJbmRleCA9IGV0ZGV2LT5UeFJpbmcudHhEbWFSZWFkeVRvU2VuZCAtIDE7CisJCXRjYi0+aW5kZXggPSBldGRldi0+dHhfcmluZy5zZW5kX2lkeCAtIDE7CiAKIAlzcGluX2xvY2soJmV0ZGV2LT5UQ0JTZW5kUUxvY2spOwogCi0JaWYgKGV0ZGV2LT5UeFJpbmcuQ3VyclNlbmRUYWlsKQotCQlldGRldi0+VHhSaW5nLkN1cnJTZW5kVGFpbC0+TmV4dCA9IHBNcFRjYjsKKwlpZiAoZXRkZXYtPnR4X3Jpbmcuc2VuZF90YWlsKQorCQlldGRldi0+dHhfcmluZy5zZW5kX3RhaWwtPm5leHQgPSB0Y2I7CiAJZWxzZQotCQlldGRldi0+VHhSaW5nLkN1cnJTZW5kSGVhZCA9IHBNcFRjYjsKKwkJZXRkZXYtPnR4X3Jpbmcuc2VuZF9oZWFkID0gdGNiOwogCi0JZXRkZXYtPlR4UmluZy5DdXJyU2VuZFRhaWwgPSBwTXBUY2I7CisJZXRkZXYtPnR4X3Jpbmcuc2VuZF90YWlsID0gdGNiOwogCi0JV0FSTl9PTihwTXBUY2ItPk5leHQgIT0gTlVMTCk7CisJV0FSTl9PTih0Y2ItPm5leHQgIT0gTlVMTCk7CiAKLQlldGRldi0+VHhSaW5nLm5CdXN5U2VuZCsrOworCWV0ZGV2LT50eF9yaW5nLnVzZWQrKzsKIAogCXNwaW5fdW5sb2NrKCZldGRldi0+VENCU2VuZFFMb2NrKTsKIAogCS8qIFdyaXRlIHRoZSBuZXcgd3JpdGUgcG9pbnRlciBiYWNrIHRvIHRoZSBkZXZpY2UuICovCi0Jd3JpdGVsKGV0ZGV2LT5UeFJpbmcudHhEbWFSZWFkeVRvU2VuZCwKKwl3cml0ZWwoZXRkZXYtPnR4X3Jpbmcuc2VuZF9pZHgsCiAJICAgICAgICZldGRldi0+cmVncy0+dHhkbWEuc2VydmljZV9yZXF1ZXN0KTsKIAogCS8qIEZvciBHaWcgb25seSwgd2UgdXNlIFR4IEludGVycnVwdCBjb2FsZXNjaW5nLiAgRW5hYmxlIHRoZSBzb2Z0d2FyZQpAQCAtNjk2LDcyICs2MjYsNzEgQEAKIAogCiAvKioKLSAqIGV0MTMxeF9mcmVlX3NlbmRfcGFja2V0IC0gUmVjeWNsZSBhIE1QX1RDQiwgY29tcGxldGUgdGhlIHBhY2tldCBpZiBuZWNlc3NhcnkKKyAqIGV0MTMxeF9mcmVlX3NlbmRfcGFja2V0IC0gUmVjeWNsZSBhIHN0cnVjdCB0Y2IKICAqIEBldGRldjogcG9pbnRlciB0byBvdXIgYWRhcHRlcgotICogQHBNcFRjYjogcG9pbnRlciB0byBNUF9UQ0IKKyAqIEB0Y2I6IHBvaW50ZXIgdG8gc3RydWN0IHRjYgogICoKKyAqIENvbXBsZXRlIHRoZSBwYWNrZXQgaWYgbmVjZXNzYXJ5CiAgKiBBc3N1bXB0aW9uIC0gU2VuZCBzcGlubG9jayBoYXMgYmVlbiBhY3F1aXJlZAogICovCiBpbmxpbmUgdm9pZCBldDEzMXhfZnJlZV9zZW5kX3BhY2tldChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LAotCQkJCQkJCVBNUF9UQ0IgcE1wVGNiKQorCQkJCQkJc3RydWN0IHRjYiAqdGNiKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JVFhfREVTQ19FTlRSWV90ICpkZXNjID0gTlVMTDsKKwlzdHJ1Y3QgdHhfZGVzYyAqZGVzYyA9IE5VTEw7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmV0ZGV2LT5uZXRfc3RhdHM7CiAKLQlpZiAocE1wVGNiLT5GbGFncyAmIGZNUF9ERVNUX0JST0FEKQorCWlmICh0Y2ItPmZsYWdzICYgZk1QX0RFU1RfQlJPQUQpCiAJCWF0b21pY19pbmMoJmV0ZGV2LT5TdGF0cy5icmRjc3R4bXQpOwotCWVsc2UgaWYgKHBNcFRjYi0+RmxhZ3MgJiBmTVBfREVTVF9NVUxUSSkKKwllbHNlIGlmICh0Y2ItPmZsYWdzICYgZk1QX0RFU1RfTVVMVEkpCiAJCWF0b21pY19pbmMoJmV0ZGV2LT5TdGF0cy5tdWx0aXhtdCk7CiAJZWxzZQogCQlhdG9taWNfaW5jKCZldGRldi0+U3RhdHMudW5peG10KTsKIAotCWlmIChwTXBUY2ItPlBhY2tldCkgewotCQlzdGF0cy0+dHhfYnl0ZXMgKz0gcE1wVGNiLT5QYWNrZXQtPmxlbjsKKwlpZiAodGNiLT5za2IpIHsKKwkJc3RhdHMtPnR4X2J5dGVzICs9IHRjYi0+c2tiLT5sZW47CiAKIAkJLyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBUWCBkZXNjcmlwdG9ycyBvbiB0aGUgcmluZwogCQkgKiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcGFja2V0IGFuZCB1bWFwIHRoZSBmcmFnbWVudHMKIAkJICogdGhleSBwb2ludCB0bwogCQkgKi8KIAkJZG8gewotCQkJZGVzYyA9Ci0JCQkgICAgKFRYX0RFU0NfRU5UUllfdCAqKSAoZXRkZXYtPlR4UmluZy5wVHhEZXNjUmluZ1ZhICsKLQkJCSAgICAJSU5ERVgxMChwTXBUY2ItPldySW5kZXhTdGFydCkpOworCQkJZGVzYyA9IChzdHJ1Y3QgdHhfZGVzYyAqKShldGRldi0+dHhfcmluZy50eF9kZXNjX3JpbmcgKworCQkJCQkJSU5ERVgxMCh0Y2ItPmluZGV4X3N0YXJ0KSk7CiAKIAkJCXBjaV91bm1hcF9zaW5nbGUoZXRkZXYtPnBkZXYsCi0JCQkJCSBkZXNjLT5EYXRhQnVmZmVyUHRyTG93LAotCQkJCQkgZGVzYy0+d29yZDIudmFsdWUsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCQkgZGVzYy0+YWRkcl9sbywKKwkJCQkJIGRlc2MtPmxlbl92bGFuLCBQQ0lfRE1BX1RPREVWSUNFKTsKIAotCQkJYWRkXzEwYml0KCZwTXBUY2ItPldySW5kZXhTdGFydCwgMSk7Ci0JCQlpZiAoSU5ERVgxMChwTXBUY2ItPldySW5kZXhTdGFydCkgPj0KLQkJCSAgICBOVU1fREVTQ19QRVJfUklOR19UWCkgewotCQkJICAgIAlwTXBUY2ItPldySW5kZXhTdGFydCAmPSB+RVRfRE1BMTBfTUFTSzsKLQkJCSAgICAJcE1wVGNiLT5XckluZGV4U3RhcnQgXj0gRVRfRE1BMTBfV1JBUDsKKwkJCWFkZF8xMGJpdCgmdGNiLT5pbmRleF9zdGFydCwgMSk7CisJCQlpZiAoSU5ERVgxMCh0Y2ItPmluZGV4X3N0YXJ0KSA+PQorCQkJCQkJCU5VTV9ERVNDX1BFUl9SSU5HX1RYKSB7CisJCQkJdGNiLT5pbmRleF9zdGFydCAmPSB+RVRfRE1BMTBfTUFTSzsKKwkJCQl0Y2ItPmluZGV4X3N0YXJ0IF49IEVUX0RNQTEwX1dSQVA7CiAJCQl9Ci0JCX0gd2hpbGUgKGRlc2MgIT0gKGV0ZGV2LT5UeFJpbmcucFR4RGVzY1JpbmdWYSArCi0JCQkJSU5ERVgxMChwTXBUY2ItPldySW5kZXgpKSk7CisJCX0gd2hpbGUgKGRlc2MgIT0gKGV0ZGV2LT50eF9yaW5nLnR4X2Rlc2NfcmluZyArCisJCQkJSU5ERVgxMCh0Y2ItPmluZGV4KSkpOwogCi0JCWRldl9rZnJlZV9za2JfYW55KHBNcFRjYi0+UGFja2V0KTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkodGNiLT5za2IpOwogCX0KIAotCW1lbXNldChwTXBUY2IsIDAsIHNpemVvZihNUF9UQ0IpKTsKKwltZW1zZXQodGNiLCAwLCBzaXplb2Yoc3RydWN0IHRjYikpOwogCiAJLyogQWRkIHRoZSBUQ0IgdG8gdGhlIFJlYWR5IFEgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZXRkZXYtPlRDQlJlYWR5UUxvY2ssIGZsYWdzKTsKIAogCWV0ZGV2LT5TdGF0cy5vcGFja2V0cysrOwogCi0JaWYgKGV0ZGV2LT5UeFJpbmcuVENCUmVhZHlRdWV1ZVRhaWwpIHsKLQkJZXRkZXYtPlR4UmluZy5UQ0JSZWFkeVF1ZXVlVGFpbC0+TmV4dCA9IHBNcFRjYjsKLQl9IGVsc2UgeworCWlmIChldGRldi0+dHhfcmluZy50Y2JfcXRhaWwpCisJCWV0ZGV2LT50eF9yaW5nLnRjYl9xdGFpbC0+bmV4dCA9IHRjYjsKKwllbHNlCiAJCS8qIEFwcGFyZW50bHkgcmVhZHkgUSBpcyBlbXB0eS4gKi8KLQkJZXRkZXYtPlR4UmluZy5UQ0JSZWFkeVF1ZXVlSGVhZCA9IHBNcFRjYjsKLQl9CisJCWV0ZGV2LT50eF9yaW5nLnRjYl9xaGVhZCA9IHRjYjsKIAotCWV0ZGV2LT5UeFJpbmcuVENCUmVhZHlRdWV1ZVRhaWwgPSBwTXBUY2I7CisJZXRkZXYtPnR4X3JpbmcudGNiX3F0YWlsID0gdGNiOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRkZXYtPlRDQlJlYWR5UUxvY2ssIGZsYWdzKTsKLQlXQVJOX09OKGV0ZGV2LT5UeFJpbmcubkJ1c3lTZW5kIDwgMCk7CisJV0FSTl9PTihldGRldi0+dHhfcmluZy51c2VkIDwgMCk7CiB9CiAKIC8qKgpAQCAtNzcyLDUyICs3MDEsNDAgQEAKICAqLwogdm9pZCBldDEzMXhfZnJlZV9idXN5X3NlbmRfcGFja2V0cyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQogewotCVBNUF9UQ0IgcE1wVGNiOwotCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCXN0cnVjdCB0Y2IgKnRjYjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQzMl90IEZyZWVDb3VudGVyID0gMDsKLQotCXdoaWxlICghbGlzdF9lbXB0eSgmZXRkZXYtPlR4UmluZy5TZW5kV2FpdFF1ZXVlKSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZXRkZXYtPlNlbmRXYWl0TG9jaywgZmxhZ3MpOwotCi0JCWV0ZGV2LT5UeFJpbmcubldhaXRTZW5kLS07Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0ZGV2LT5TZW5kV2FpdExvY2ssIGZsYWdzKTsKLQotCQllbnRyeSA9IGV0ZGV2LT5UeFJpbmcuU2VuZFdhaXRRdWV1ZS5uZXh0OwotCX0KLQotCWV0ZGV2LT5UeFJpbmcubldhaXRTZW5kID0gMDsKKwl1MzIgZnJlZWQgPSAwOwogCiAJLyogQW55IHBhY2tldHMgYmVpbmcgc2VudD8gQ2hlY2sgdGhlIGZpcnN0IFRDQiBvbiB0aGUgc2VuZCBsaXN0ICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5UQ0JTZW5kUUxvY2ssIGZsYWdzKTsKIAotCXBNcFRjYiA9IGV0ZGV2LT5UeFJpbmcuQ3VyclNlbmRIZWFkOworCXRjYiA9IGV0ZGV2LT50eF9yaW5nLnNlbmRfaGVhZDsKIAotCXdoaWxlICgocE1wVGNiICE9IE5VTEwpICYmIChGcmVlQ291bnRlciA8IE5VTV9UQ0IpKSB7Ci0JCVBNUF9UQ0IgcE5leHQgPSBwTXBUY2ItPk5leHQ7CisJd2hpbGUgKHRjYiAhPSBOVUxMICYmIGZyZWVkIDwgTlVNX1RDQikgeworCQlzdHJ1Y3QgdGNiICpuZXh0ID0gdGNiLT5uZXh0OwogCi0JCWV0ZGV2LT5UeFJpbmcuQ3VyclNlbmRIZWFkID0gcE5leHQ7CisJCWV0ZGV2LT50eF9yaW5nLnNlbmRfaGVhZCA9IG5leHQ7CiAKLQkJaWYgKHBOZXh0ID09IE5VTEwpCi0JCQlldGRldi0+VHhSaW5nLkN1cnJTZW5kVGFpbCA9IE5VTEw7CisJCWlmIChuZXh0ID09IE5VTEwpCisJCQlldGRldi0+dHhfcmluZy5zZW5kX3RhaWwgPSBOVUxMOwogCi0JCWV0ZGV2LT5UeFJpbmcubkJ1c3lTZW5kLS07CisJCWV0ZGV2LT50eF9yaW5nLnVzZWQtLTsKIAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+VENCU2VuZFFMb2NrLCBmbGFncyk7CiAKLQkJRnJlZUNvdW50ZXIrKzsKLQkJZXQxMzF4X2ZyZWVfc2VuZF9wYWNrZXQoZXRkZXYsIHBNcFRjYik7CisJCWZyZWVkKys7CisJCWV0MTMxeF9mcmVlX3NlbmRfcGFja2V0KGV0ZGV2LCB0Y2IpOwogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZldGRldi0+VENCU2VuZFFMb2NrLCBmbGFncyk7CiAKLQkJcE1wVGNiID0gZXRkZXYtPlR4UmluZy5DdXJyU2VuZEhlYWQ7CisJCXRjYiA9IGV0ZGV2LT50eF9yaW5nLnNlbmRfaGVhZDsKIAl9CiAKLQlXQVJOX09OKEZyZWVDb3VudGVyID09IE5VTV9UQ0IpOworCVdBUk5fT04oZnJlZWQgPT0gTlVNX1RDQik7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+VENCU2VuZFFMb2NrLCBmbGFncyk7CiAKLQlldGRldi0+VHhSaW5nLm5CdXN5U2VuZCA9IDA7CisJZXRkZXYtPnR4X3JpbmcudXNlZCA9IDA7CiB9CiAKIC8qKgpAQCAtODMxLDk5ICs3NDgsNTYgQEAKICAqLwogdm9pZCBldDEzMXhfaGFuZGxlX3NlbmRfaW50ZXJydXB0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCiB7Ci0JLyogTWFyayBhcyBjb21wbGV0ZWQgYW55IHBhY2tldHMgd2hpY2ggaGF2ZSBiZWVuIHNlbnQgYnkgdGhlIGRldmljZS4gKi8KLQlldDEzMXhfdXBkYXRlX3RjYl9saXN0KGV0ZGV2KTsKLQotCS8qIElmIHdlIHF1ZXVlZCBhbnkgdHJhbnNtaXRzIGJlY2F1c2Ugd2UgZGlkbid0IGhhdmUgYW55IFRDQnMgZWFybGllciwKLQkgKiBkZXF1ZXVlIGFuZCBzZW5kIHRob3NlIHBhY2tldHMgbm93LCBhcyBsb25nIGFzIHdlIGhhdmUgZnJlZSBUQ0JzLgotCSAqLwotCWV0MTMxeF9jaGVja19zZW5kX3dhaXRfbGlzdChldGRldik7Ci19Ci0KLS8qKgotICogZXQxMzF4X3VwZGF0ZV90Y2JfbGlzdCAtIEhlbHBlciByb3V0aW5lIGZvciBTZW5kIEludGVycnVwdCBoYW5kbGVyCi0gKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLSAqCi0gKiBSZS1jbGFpbXMgdGhlIHNlbmQgcmVzb3VyY2VzIGFuZCBjb21wbGV0ZXMgc2VuZHMuICBDYW4gYWxzbyBiZSBjYWxsZWQgYXMKLSAqIHBhcnQgb2YgdGhlIE5JQyBzZW5kIHJvdXRpbmUgd2hlbiB0aGUgIlNlcnZpY2VDb21wbGV0ZSIgaW5kaWNhdGlvbiBoYXMKLSAqIHdyYXBwZWQuCi0gKi8KLXN0YXRpYyB2b2lkIGV0MTMxeF91cGRhdGVfdGNiX2xpc3Qoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKLXsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiBTZXJ2aWNlQ29tcGxldGU7Ci0JUE1QX1RDQiBwTXBUY2I7CisJdTMyIHNlcnZpY2VkOworCXN0cnVjdCB0Y2IgKnRjYjsKIAl1MzIgaW5kZXg7CiAKLQlTZXJ2aWNlQ29tcGxldGUgPSByZWFkbCgmZXRkZXYtPnJlZ3MtPnR4ZG1hLk5ld1NlcnZpY2VDb21wbGV0ZSk7Ci0JaW5kZXggPSBJTkRFWDEwKFNlcnZpY2VDb21wbGV0ZSk7CisJc2VydmljZWQgPSByZWFkbCgmZXRkZXYtPnJlZ3MtPnR4ZG1hLk5ld1NlcnZpY2VDb21wbGV0ZSk7CisJaW5kZXggPSBJTkRFWDEwKHNlcnZpY2VkKTsKIAogCS8qIEhhcyB0aGUgcmluZyB3cmFwcGVkPyAgUHJvY2VzcyBhbnkgZGVzY3JpcHRvcnMgdGhhdCBkbyBub3QgaGF2ZQogCSAqIHRoZSBzYW1lICJ3cmFwIiBpbmRpY2F0b3IgYXMgdGhlIGN1cnJlbnQgY29tcGxldGlvbiBpbmRpY2F0b3IKIAkgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZXRkZXYtPlRDQlNlbmRRTG9jaywgZmxhZ3MpOwogCi0JcE1wVGNiID0gZXRkZXYtPlR4UmluZy5DdXJyU2VuZEhlYWQ7CisJdGNiID0gZXRkZXYtPnR4X3Jpbmcuc2VuZF9oZWFkOwogCi0Jd2hpbGUgKHBNcFRjYiAmJgotCSAgICAgICAoKFNlcnZpY2VDb21wbGV0ZSBeIHBNcFRjYi0+V3JJbmRleCkgJiBFVF9ETUExMF9XUkFQKSAmJgotCSAgICAgICBpbmRleCA8IElOREVYMTAocE1wVGNiLT5XckluZGV4KSkgewotCQlldGRldi0+VHhSaW5nLm5CdXN5U2VuZC0tOwotCQlldGRldi0+VHhSaW5nLkN1cnJTZW5kSGVhZCA9IHBNcFRjYi0+TmV4dDsKLQkJaWYgKHBNcFRjYi0+TmV4dCA9PSBOVUxMKQotCQkJZXRkZXYtPlR4UmluZy5DdXJyU2VuZFRhaWwgPSBOVUxMOworCXdoaWxlICh0Y2IgJiYKKwkgICAgICAgKChzZXJ2aWNlZCBeIHRjYi0+aW5kZXgpICYgRVRfRE1BMTBfV1JBUCkgJiYKKwkgICAgICAgaW5kZXggPCBJTkRFWDEwKHRjYi0+aW5kZXgpKSB7CisJCWV0ZGV2LT50eF9yaW5nLnVzZWQtLTsKKwkJZXRkZXYtPnR4X3Jpbmcuc2VuZF9oZWFkID0gdGNiLT5uZXh0OworCQlpZiAodGNiLT5uZXh0ID09IE5VTEwpCisJCQlldGRldi0+dHhfcmluZy5zZW5kX3RhaWwgPSBOVUxMOwogCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0ZGV2LT5UQ0JTZW5kUUxvY2ssIGZsYWdzKTsKLQkJZXQxMzF4X2ZyZWVfc2VuZF9wYWNrZXQoZXRkZXYsIHBNcFRjYik7CisJCWV0MTMxeF9mcmVlX3NlbmRfcGFja2V0KGV0ZGV2LCB0Y2IpOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZXRkZXYtPlRDQlNlbmRRTG9jaywgZmxhZ3MpOwogCiAJCS8qIEdvdG8gdGhlIG5leHQgcGFja2V0ICovCi0JCXBNcFRjYiA9IGV0ZGV2LT5UeFJpbmcuQ3VyclNlbmRIZWFkOworCQl0Y2IgPSBldGRldi0+dHhfcmluZy5zZW5kX2hlYWQ7CiAJfQotCXdoaWxlIChwTXBUY2IgJiYKLQkgICAgICAgISgoU2VydmljZUNvbXBsZXRlIF4gcE1wVGNiLT5XckluZGV4KSAmIEVUX0RNQTEwX1dSQVApCi0JICAgICAgICYmIGluZGV4ID4gKHBNcFRjYi0+V3JJbmRleCAmIEVUX0RNQTEwX01BU0spKSB7Ci0JCWV0ZGV2LT5UeFJpbmcubkJ1c3lTZW5kLS07Ci0JCWV0ZGV2LT5UeFJpbmcuQ3VyclNlbmRIZWFkID0gcE1wVGNiLT5OZXh0OwotCQlpZiAocE1wVGNiLT5OZXh0ID09IE5VTEwpCi0JCQlldGRldi0+VHhSaW5nLkN1cnJTZW5kVGFpbCA9IE5VTEw7CisJd2hpbGUgKHRjYiAmJgorCSAgICAgICAhKChzZXJ2aWNlZCBeIHRjYi0+aW5kZXgpICYgRVRfRE1BMTBfV1JBUCkKKwkgICAgICAgJiYgaW5kZXggPiAodGNiLT5pbmRleCAmIEVUX0RNQTEwX01BU0spKSB7CisJCWV0ZGV2LT50eF9yaW5nLnVzZWQtLTsKKwkJZXRkZXYtPnR4X3Jpbmcuc2VuZF9oZWFkID0gdGNiLT5uZXh0OworCQlpZiAodGNiLT5uZXh0ID09IE5VTEwpCisJCQlldGRldi0+dHhfcmluZy5zZW5kX3RhaWwgPSBOVUxMOwogCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0ZGV2LT5UQ0JTZW5kUUxvY2ssIGZsYWdzKTsKLQkJZXQxMzF4X2ZyZWVfc2VuZF9wYWNrZXQoZXRkZXYsIHBNcFRjYik7CisJCWV0MTMxeF9mcmVlX3NlbmRfcGFja2V0KGV0ZGV2LCB0Y2IpOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZXRkZXYtPlRDQlNlbmRRTG9jaywgZmxhZ3MpOwogCiAJCS8qIEdvdG8gdGhlIG5leHQgcGFja2V0ICovCi0JCXBNcFRjYiA9IGV0ZGV2LT5UeFJpbmcuQ3VyclNlbmRIZWFkOworCQl0Y2IgPSBldGRldi0+dHhfcmluZy5zZW5kX2hlYWQ7CiAJfQogCiAJLyogV2FrZSB1cCB0aGUgcXVldWUgd2hlbiB3ZSBoaXQgYSBsb3ctd2F0ZXIgbWFyayAqLwotCWlmIChldGRldi0+VHhSaW5nLm5CdXN5U2VuZCA8PSAoTlVNX1RDQiAvIDMpKQorCWlmIChldGRldi0+dHhfcmluZy51c2VkIDw9IE5VTV9UQ0IgLyAzKQogCQluZXRpZl93YWtlX3F1ZXVlKGV0ZGV2LT5uZXRkZXYpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRkZXYtPlRDQlNlbmRRTG9jaywgZmxhZ3MpOwogfQogCi0vKioKLSAqIGV0MTMxeF9jaGVja19zZW5kX3dhaXRfbGlzdCAtIEhlbHBlciByb3V0aW5lIGZvciB0aGUgaW50ZXJydXB0IGhhbmRsZXIKLSAqIEBldGRldjogcG9pbnRlciB0byBvdXIgYWRhcHRlcgotICoKLSAqIFRha2VzIHBhY2tldHMgZnJvbSB0aGUgc2VuZCB3YWl0IHF1ZXVlIGFuZCBwb3N0cyB0aGVtIHRvIHRoZSBkZXZpY2UgKGlmCi0gKiByb29tIGF2YWlsYWJsZSkuCi0gKi8KLXN0YXRpYyB2b2lkIGV0MTMxeF9jaGVja19zZW5kX3dhaXRfbGlzdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZXRkZXYtPlNlbmRXYWl0TG9jaywgZmxhZ3MpOwotCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZldGRldi0+VHhSaW5nLlNlbmRXYWl0UXVldWUpICYmCi0JCQkJTVBfVENCX1JFU09VUkNFU19BVkFJTEFCTEUoZXRkZXYpKSB7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwotCi0JCWVudHJ5ID0gZXRkZXYtPlR4UmluZy5TZW5kV2FpdFF1ZXVlLm5leHQ7Ci0KLQkJZXRkZXYtPlR4UmluZy5uV2FpdFNlbmQtLTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+U2VuZFdhaXRMb2NrLCBmbGFncyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF90eC5oIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfdHguaAppbmRleCBhZDAzNzIxLi40ZjBlYTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF90eC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3R4LmgKQEAgLTYzLDE2NyArNjMsODkgQEAKIC8qIFR5cGVkZWZzIGZvciBUeCBEZXNjcmlwdG9yIFJpbmcgKi8KIAogLyoKLSAqIFRYREVTQ19XT1JEMl90IHN0cnVjdHVyZSBob2xkcyBwYXJ0IG9mIHRoZSBjb250cm9sIGJpdHMgaW4gdGhlIFR4IERlc2NyaXB0b3IKLSAqIHJpbmcgZm9yIHRoZSBFVC0xMzEwCisgKiB3b3JkIDIgb2YgdGhlIGNvbnRyb2wgYml0cyBpbiB0aGUgVHggRGVzY3JpcHRvciByaW5nIGZvciB0aGUgRVQtMTMxMAorICoKKyAqIDAtMTU6IGxlbmd0aCBvZiBwYWNrZXQKKyAqIDE2LTI3OiBWTEFOIHRhZworICogMjg6IFZMQU4gQ0ZJCisgKiAyOS0zMTogVkxBTiBwcmlvcml0eQorICoKKyAqIHdvcmQgMyBvZiB0aGUgY29udHJvbCBiaXRzIGluIHRoZSBUeCBEZXNjcmlwdG9yIHJpbmcgZm9yIHRoZSBFVC0xMzEwCisgKgorICogMDogbGFzdCBwYWNrZXQgaW4gdGhlIHNlcXVlbmNlCisgKiAxOiBmaXJzdCBwYWNrZXQgaW4gdGhlIHNlcXVlbmNlCisgKiAyOiBpbnRlcnJ1cHQgdGhlIHByb2Nlc3NvciB3aGVuIHRoaXMgcGt0IHNlbnQKKyAqIDM6IENvbnRyb2wgd29yZCAtIG5vIHBhY2tldCBkYXRhCisgKiA0OiBJc3N1ZSBoYWxmLWR1cGxleCBiYWNrcHJlc3N1cmUgOiBYT04vWE9GRgorICogNTogc2VuZCBwYXVzZSBmcmFtZQorICogNjogVHggZnJhbWUgaGFzIGVycm9yCisgKiA3OiBhcHBlbmQgQ1JDCisgKiA4OiBNQUMgb3ZlcnJpZGUKKyAqIDk6IHBhZCBwYWNrZXQKKyAqIDEwOiBQYWNrZXQgaXMgYSBIdWdlIHBhY2tldAorICogMTE6IGFwcGVuZCBWTEFOIHRhZworICogMTI6IElQIGNoZWNrc3VtIGFzc2lzdAorICogMTM6IFRDUCBjaGVja3N1bSBhc3Npc3QKKyAqIDE0OiBVRFAgY2hlY2tzdW0gYXNzaXN0CiAgKi8KLXR5cGVkZWYgdW5pb24gX3R4ZGVzY193b3JkMl90IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiB2bGFuX3ByaW86MzsJCS8qIGJpdHMgMjktMzEoVkxBTiBwcmlvcml0eSkgKi8KLQkJdTMyIHZsYW5fY2ZpOjE7CQkvKiBiaXQgMjgoY2ZpKSAqLwotCQl1MzIgdmxhbl90YWc6MTI7CQkvKiBiaXRzIDE2LTI3KFZMQU4gdGFnKSAqLwotCQl1MzIgbGVuZ3RoX2luX2J5dGVzOjE2OwkvKiBiaXRzICAwLTE1KHBhY2tldCBsZW5ndGgpICovCi0jZWxzZQotCQl1MzIgbGVuZ3RoX2luX2J5dGVzOjE2OwkvKiBiaXRzICAwLTE1KHBhY2tldCBsZW5ndGgpICovCi0JCXUzMiB2bGFuX3RhZzoxMjsJCS8qIGJpdHMgMTYtMjcoVkxBTiB0YWcpICovCi0JCXUzMiB2bGFuX2NmaToxOwkJLyogYml0IDI4KGNmaSkgKi8KLQkJdTMyIHZsYW5fcHJpbzozOwkJLyogYml0cyAyOS0zMShWTEFOIHByaW9yaXR5KSAqLwotI2VuZGlmCS8qIF9CSVRfRklFTERTX0hUT0wgKi8KLQl9IGJpdHM7Ci19IFRYREVTQ19XT1JEMl90LCAqUFRYREVTQ19XT1JEMl90OworCisvKiBzdHJ1Y3QgdHhfZGVzYyByZXByZXNlbnRzIGVhY2ggZGVzY3JpcHRvciBvbiB0aGUgcmluZyAqLworc3RydWN0IHR4X2Rlc2MgeworCXUzMiBhZGRyX2hpOworCXUzMiBhZGRyX2xvOworCXUzMiBsZW5fdmxhbjsJLyogY29udHJvbCB3b3JkcyBob3cgdG8geG1pdCB0aGUgKi8KKwl1MzIgZmxhZ3M7CS8qIGRhdGEgKGRldGFpbGVkIGFib3ZlKSAqLworfTsKIAogLyoKLSAqIFRYREVTQ19XT1JEM190IHN0cnVjdHVyZSBob2xkcyBwYXJ0IG9mIHRoZSBjb250cm9sIGJpdHMgaW4gdGhlIFR4IERlc2NyaXB0b3IKLSAqIHJpbmcgZm9yIHRoZSBFVC0xMzEwCisgKiBUaGUgc3RhdHVzIG9mIHRoZSBUeCBETUEgZW5naW5lIGl0IHNpdHMgaW4gZnJlZSBtZW1vcnksIGFuZCBpcyBwb2ludGVkIHRvCisgKiBieSAweDEwMWMgLyAweDEwMjAuIFRoaXMgaXMgYSBETUExMCB0eXBlCiAgKi8KLXR5cGVkZWYgdW5pb24gX3R4ZGVzY193b3JkM190IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiB1bnVzZWQ6MTc7CS8qIGJpdHMgMTUtMzEgKi8KLQkJdTMyIHVkcGE6MTsJLyogYml0IDE0KFVEUCBjaGVja3N1bSBhc3Npc3QpICovCi0JCXUzMiB0Y3BhOjE7CS8qIGJpdCAxMyhUQ1AgY2hlY2tzdW0gYXNzaXN0KSAqLwotCQl1MzIgaXBhOjE7CQkvKiBiaXQgMTIoSVAgY2hlY2tzdW0gYXNzaXN0KSAqLwotCQl1MzIgdmxhbjoxOwkvKiBiaXQgMTEoYXBwZW5kIFZMQU4gdGFnKSAqLwotCQl1MzIgaHA6MTsJCS8qIGJpdCAxMChQYWNrZXQgaXMgYSBIdWdlIHBhY2tldCkgKi8KLQkJdTMyIHBwOjE7CQkvKiBiaXQgIDkocGFkIHBhY2tldCkgKi8KLQkJdTMyIG1hYzoxOwkJLyogYml0ICA4KE1BQyBvdmVycmlkZSkgKi8KLQkJdTMyIGNyYzoxOwkJLyogYml0ICA3KGFwcGVuZCBDUkMpICovCi0JCXUzMiBlOjE7CQkvKiBiaXQgIDYoVHggZnJhbWUgaGFzIGVycm9yKSAqLwotCQl1MzIgcGY6MTsJCS8qIGJpdCAgNShzZW5kIHBhdXNlIGZyYW1lKSAqLwotCQl1MzIgYnA6MTsJCS8qIGJpdCAgNChJc3N1ZSBoYWxmLWR1cGxleCBiYWNrcHJlc3N1cmUgKFhPTi9YT0ZGKSAqLwotCQl1MzIgY3c6MTsJCS8qIGJpdCAgMyhDb250cm9sIHdvcmQgLSBubyBwYWNrZXQgZGF0YSkgKi8KLQkJdTMyIGlyOjE7CQkvKiBiaXQgIDIoaW50ZXJydXB0IHRoZSBwcm9jZXNzb3Igd2hlbiB0aGlzIHBrdCBzZW50KSAqLwotCQl1MzIgZjoxOwkJLyogYml0ICAxKGZpcnN0IHBhY2tldCBpbiB0aGUgc2VxdWVuY2UpICovCi0JCXUzMiBsOjE7CQkvKiBiaXQgIDAobGFzdCBwYWNrZXQgaW4gdGhlIHNlcXVlbmNlKSAqLwotI2Vsc2UKLQkJdTMyIGw6MTsJCS8qIGJpdCAgMChsYXN0IHBhY2tldCBpbiB0aGUgc2VxdWVuY2UpICovCi0JCXUzMiBmOjE7CQkvKiBiaXQgIDEoZmlyc3QgcGFja2V0IGluIHRoZSBzZXF1ZW5jZSkgKi8KLQkJdTMyIGlyOjE7CQkvKiBiaXQgIDIoaW50ZXJydXB0IHRoZSBwcm9jZXNzb3Igd2hlbiB0aGlzIHBrdCBzZW50KSAqLwotCQl1MzIgY3c6MTsJCS8qIGJpdCAgMyhDb250cm9sIHdvcmQgLSBubyBwYWNrZXQgZGF0YSkgKi8KLQkJdTMyIGJwOjE7CQkvKiBiaXQgIDQoSXNzdWUgaGFsZi1kdXBsZXggYmFja3ByZXNzdXJlIChYT04vWE9GRikgKi8KLQkJdTMyIHBmOjE7CQkvKiBiaXQgIDUoc2VuZCBwYXVzZSBmcmFtZSkgKi8KLQkJdTMyIGU6MTsJCS8qIGJpdCAgNihUeCBmcmFtZSBoYXMgZXJyb3IpICovCi0JCXUzMiBjcmM6MTsJCS8qIGJpdCAgNyhhcHBlbmQgQ1JDKSAqLwotCQl1MzIgbWFjOjE7CQkvKiBiaXQgIDgoTUFDIG92ZXJyaWRlKSAqLwotCQl1MzIgcHA6MTsJCS8qIGJpdCAgOShwYWQgcGFja2V0KSAqLwotCQl1MzIgaHA6MTsJCS8qIGJpdCAxMChQYWNrZXQgaXMgYSBIdWdlIHBhY2tldCkgKi8KLQkJdTMyIHZsYW46MTsJLyogYml0IDExKGFwcGVuZCBWTEFOIHRhZykgKi8KLQkJdTMyIGlwYToxOwkJLyogYml0IDEyKElQIGNoZWNrc3VtIGFzc2lzdCkgKi8KLQkJdTMyIHRjcGE6MTsJLyogYml0IDEzKFRDUCBjaGVja3N1bSBhc3Npc3QpICovCi0JCXUzMiB1ZHBhOjE7CS8qIGJpdCAxNChVRFAgY2hlY2tzdW0gYXNzaXN0KSAqLwotCQl1MzIgdW51c2VkOjE3OwkvKiBiaXRzIDE1LTMxICovCi0jZW5kaWYJLyogX0JJVF9GSUVMRFNfSFRPTCAqLwotCX0gYml0czsKLX0gVFhERVNDX1dPUkQzX3QsICpQVFhERVNDX1dPUkQzX3Q7CiAKLS8qIFRYX0RFU0NfRU5UUllfdCBpcyBzcnVjdHVyZSByZXByZXNlbnRpbmcgZWFjaCBkZXNjcmlwdG9yIG9uIHRoZSByaW5nICovCi10eXBlZGVmIHN0cnVjdCBfdHhfZGVzY19lbnRyeV90IHsKLQl1MzIgRGF0YUJ1ZmZlclB0ckhpZ2g7Ci0JdTMyIERhdGFCdWZmZXJQdHJMb3c7Ci0JVFhERVNDX1dPUkQyX3Qgd29yZDI7CS8qIGNvbnRyb2wgd29yZHMgaG93IHRvIHhtaXQgdGhlICovCi0JVFhERVNDX1dPUkQzX3Qgd29yZDM7CS8qIGRhdGEgKGRldGFpbGVkIGFib3ZlKSAqLwotfSBUWF9ERVNDX0VOVFJZX3QsICpQVFhfREVTQ19FTlRSWV90OworLyogVENCIChUcmFuc21pdCBDb250cm9sIEJsb2NrOiBIb3N0IFNpZGUpICovCitzdHJ1Y3QgdGNiIHsKKwlzdHJ1Y3QgdGNiICpuZXh0OwkvKiBOZXh0IGVudHJ5IGluIHJpbmcgKi8KKwl1MzIgZmxhZ3M7CQkvKiBPdXIgZmxhZ3MgZm9yIHRoZSBwYWNrZXQgKi8KKwl1MzIgY291bnQ7CQkvKiBVc2VkIHRvIHNwb3Qgc3R1Y2svbG9zdCBwYWNrZXRzICovCisJdTMyIHN0YWxlOwkJLyogVXNlZCB0byBzcG90IHN0dWNrL2xvc3QgcGFja2V0cyAqLworCXN0cnVjdCBza19idWZmICpza2I7CS8qIE5ldHdvcmsgc2tiIHdlIGFyZSB0aWVkIHRvICovCisJdTMyIGluZGV4OwkJLyogUmluZyBpbmRleGVzICovCisJdTMyIGluZGV4X3N0YXJ0OworfTsKIAotCi0vKiBUeXBlZGVmcyBmb3IgVHggRE1BIGVuZ2luZSBzdGF0dXMgd3JpdGViYWNrICovCi0KLS8qCi0gKiBUWF9TVEFUVVNfQkxPQ0tfdCBpcyBzcnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIHN0YXR1cyBvZiB0aGUgVHggRE1BIGVuZ2luZQotICogaXQgc2l0cyBpbiBmcmVlIG1lbW9yeSwgYW5kIGlzIHBvaW50ZWQgdG8gYnkgMHgxMDFjIC8gMHgxMDIwCi0gKi8KLXR5cGVkZWYgdW5pb24gX3R4X3N0YXR1c19ibG9ja190IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiB1bnVzZWQ6MjE7CQkvKiBiaXRzIDExLTMxICovCi0JCXUzMiBzZXJ2X2NwbF93cmFwOjE7CS8qIGJpdCAxMCAqLwotCQl1MzIgc2Vydl9jcGw6MTA7CQkvKiBiaXRzIDAtOSAqLwotI2Vsc2UKLQkJdTMyIHNlcnZfY3BsOjEwOwkJLyogYml0cyAwLTkgKi8KLQkJdTMyIHNlcnZfY3BsX3dyYXA6MTsJLyogYml0IDEwICovCi0JCXUzMiB1bnVzZWQ6MjE7CQkvKiBiaXRzIDExLTMxICovCi0jZW5kaWYKLQl9IGJpdHM7Ci19IFRYX1NUQVRVU19CTE9DS190LCAqUFRYX1NUQVRVU19CTE9DS190OwotCi0vKiBUQ0IgKFRyYW5zbWl0IENvbnRyb2wgQmxvY2spICovCi10eXBlZGVmIHN0cnVjdCBfTVBfVENCIHsKLQlzdHJ1Y3QgX01QX1RDQiAqTmV4dDsKLQl1MzIgRmxhZ3M7Ci0JdTMyIENvdW50OwotCXUzMiBQYWNrZXRTdGFsZUNvdW50OwotCXN0cnVjdCBza19idWZmICpQYWNrZXQ7Ci0JdTMyIFBhY2tldExlbmd0aDsKLQl1MzIgV3JJbmRleDsKLQl1MzIgV3JJbmRleFN0YXJ0OwotfSBNUF9UQ0IsICpQTVBfVENCOwotCi0vKiBTdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgc2tiJ3MgaW4gYSBsaXN0ICovCi10eXBlZGVmIHN0cnVjdCB0eF9za2JfbGlzdF9lbGVtIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHNrYl9saXN0X2VsZW07Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLX0gVFhfU0tCX0xJU1RfRUxFTSwgKlBUWF9TS0JfTElTVF9FTEVNOwotCi0vKiBUWF9SSU5HX3QgaXMgc3J1Y3R1cmUgcmVwcmVzZW50aW5nIG91ciBsb2NhbCByZWZlcmVuY2UocykgdG8gdGhlIHJpbmcgKi8KLXR5cGVkZWYgc3RydWN0IF90eF9yaW5nX3QgeworLyogU3RydWN0dXJlIHJlcHJlc2VudGluZyBvdXIgbG9jYWwgcmVmZXJlbmNlKHMpIHRvIHRoZSByaW5nICovCitzdHJ1Y3QgdHhfcmluZyB7CiAJLyogVENCIChUcmFuc21pdCBDb250cm9sIEJsb2NrKSBtZW1vcnkgYW5kIGxpc3RzICovCi0JUE1QX1RDQiBNcFRjYk1lbTsKKwlzdHJ1Y3QgdGNiICp0Y2JfcmluZzsKIAogCS8qIExpc3Qgb2YgVENCcyB0aGF0IGFyZSByZWFkeSB0byBiZSB1c2VkICovCi0JUE1QX1RDQiBUQ0JSZWFkeVF1ZXVlSGVhZDsKLQlQTVBfVENCIFRDQlJlYWR5UXVldWVUYWlsOworCXN0cnVjdCB0Y2IgKnRjYl9xaGVhZDsKKwlzdHJ1Y3QgdGNiICp0Y2JfcXRhaWw7CiAKIAkvKiBsaXN0IG9mIFRDQnMgdGhhdCBhcmUgY3VycmVudGx5IGJlaW5nIHNlbnQuICBOT1RFIHRoYXQgYWNjZXNzIHRvIGFsbAotCSAqIHRocmVlIG9mIHRoZXNlIChpbmNsdWRpbmcgbkJ1c3lTZW5kKSBhcmUgY29udHJvbGxlZCB2aWEgdGhlCisJICogdGhyZWUgb2YgdGhlc2UgKGluY2x1ZGluZyB1c2VkKSBhcmUgY29udHJvbGxlZCB2aWEgdGhlCiAJICogVENCU2VuZFFMb2NrLiAgVGhpcyBsb2NrIHNob3VsZCBiZSBzZWN1cmVkIHByaW9yIHRvIGluY2VtZW50aW5nIC8KLQkgKiBkZWNyZW1lbnRpbmcgbkJ1c3lTZW5kLCBvciBhbnkgcXVldWUgbWFuaXB1bGF0aW9uIG9uIEN1cnJTZW5kSGVhZCAvCi0JICogVGFpbAorCSAqIGRlY3JlbWVudGluZyB1c2VkLCBvciBhbnkgcXVldWUgbWFuaXB1bGF0aW9uIG9uIHNlbmRfaGVhZCAvCisJICogdGFpbAogCSAqLwotCVBNUF9UQ0IgQ3VyclNlbmRIZWFkOwotCVBNUF9UQ0IgQ3VyclNlbmRUYWlsOwotCWludDMyX3QgbkJ1c3lTZW5kOwotCi0JLyogTGlzdCBvZiBwYWNrZXRzIChub3QgVENCcykgdGhhdCB3ZXJlIHF1ZXVlZCBmb3IgbGFjayBvZiByZXNvdXJjZXMgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIFNlbmRXYWl0UXVldWU7Ci0JaW50MzJfdCBuV2FpdFNlbmQ7CisJc3RydWN0IHRjYiAqc2VuZF9oZWFkOworCXN0cnVjdCB0Y2IgKnNlbmRfdGFpbDsKKwlpbnQgdXNlZDsKIAogCS8qIFRoZSBhY3R1YWwgZGVzY3JpcHRvciByaW5nICovCi0JUFRYX0RFU0NfRU5UUllfdCBwVHhEZXNjUmluZ1ZhOwotCWRtYV9hZGRyX3QgcFR4RGVzY1JpbmdQYTsKLQl1aW50NjRfdCBwVHhEZXNjUmluZ0FkanVzdGVkUGE7Ci0JdWludDY0X3QgVHhEZXNjT2Zmc2V0OworCXN0cnVjdCB0eF9kZXNjICp0eF9kZXNjX3Jpbmc7CisJZG1hX2FkZHJfdCB0eF9kZXNjX3JpbmdfcGE7CiAKLQkvKiBSZWFkeVRvU2VuZCBpbmRpY2F0ZXMgd2hlcmUgd2UgbGFzdCB3cm90ZSB0byBpbiB0aGUgZGVzY3JpcHRvciByaW5nLiAqLwotCXUzMiB0eERtYVJlYWR5VG9TZW5kOworCS8qIHNlbmRfaWR4IGluZGljYXRlcyB3aGVyZSB3ZSBsYXN0IHdyb3RlIHRvIGluIHRoZSBkZXNjcmlwdG9yIHJpbmcuICovCisJdTMyIHNlbmRfaWR4OwogCiAJLyogVGhlIGxvY2F0aW9uIG9mIHRoZSB3cml0ZS1iYWNrIHN0YXR1cyBibG9jayAqLwotCVBUWF9TVEFUVVNfQkxPQ0tfdCBwVHhTdGF0dXNWYTsKLQlkbWFfYWRkcl90IHBUeFN0YXR1c1BhOworCXUzMiAqdHhfc3RhdHVzOworCWRtYV9hZGRyX3QgdHhfc3RhdHVzX3BhOwogCi0JLyogQSBCbG9jayBvZiB6ZXJvZXMgdXNlZCB0byBwYWQgcGFja2V0cyB0aGF0IGFyZSBsZXNzIHRoYW4gNjAgYnl0ZXMgKi8KLQl2b2lkICpwVHhEdW1teUJsa1ZhOwotCWRtYV9hZGRyX3QgcFR4RHVtbXlCbGtQYTsKLQotCVRYTUFDX0VSUl90IFR4TWFjRXJyOwotCi0JLyogVmFyaWFibGVzIHRvIHRyYWNrIHRoZSBUeCBpbnRlcnJ1cHQgY29hbGVzY2luZyBmZWF0dXJlcyAqLwotCWludDMyX3QgVHhQYWNrZXRzU2luY2VMYXN0aW50ZXJydXB0OwotfSBUWF9SSU5HX3QsICpQVFhfUklOR190OwotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIHRoZSBmcmFnLWxpc3QgZm9yIHRoZSBmb2xsb3dpbmcgcHJvdG90eXBlcyAqLwotdHlwZWRlZiBzdHJ1Y3QgX01QX0ZSQUdfTElTVCBNUF9GUkFHX0xJU1QsICpQTVBfRlJBR19MSVNUOworCS8qIFBhY2tldHMgc2luY2UgdGhlIGxhc3QgSVJROiB1c2VkIGZvciBpbnRlcnJ1cHQgY29hbGVzY2luZyAqLworCWludCBzaW5jZV9pcnE7Cit9OwogCiAvKiBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIHRoZSBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlICovCiBzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXI7CkBAIC0yMzEsMTIgKzE1MywxMiBAQAogLyogUFJPVE9UWVBFUyBmb3IgZXQxMzEwX3R4LmMgKi8KIGludCBldDEzMXhfdHhfZG1hX21lbW9yeV9hbGxvYyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwogdm9pZCBldDEzMXhfdHhfZG1hX21lbW9yeV9mcmVlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7Ci12b2lkIENvbmZpZ1R4RG1hUmVncyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKnBBZGFwdGVyKTsKK3ZvaWQgQ29uZmlnVHhEbWFSZWdzKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7CiB2b2lkIGV0MTMxeF9pbml0X3NlbmQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgZXQxMzF4X3R4X2RtYV9kaXNhYmxlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqcEFkYXB0ZXIpOwotdm9pZCBldDEzMXhfdHhfZG1hX2VuYWJsZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKnBBZGFwdGVyKTsKLXZvaWQgZXQxMzF4X2hhbmRsZV9zZW5kX2ludGVycnVwdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKnBBZGFwdGVyKTsKLXZvaWQgZXQxMzF4X2ZyZWVfYnVzeV9zZW5kX3BhY2tldHMoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpwQWRhcHRlcik7Cit2b2lkIGV0MTMxeF90eF9kbWFfZGlzYWJsZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwordm9pZCBldDEzMXhfdHhfZG1hX2VuYWJsZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwordm9pZCBldDEzMXhfaGFuZGxlX3NlbmRfaW50ZXJydXB0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7Cit2b2lkIGV0MTMxeF9mcmVlX2J1c3lfc2VuZF9wYWNrZXRzKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7CiBpbnQgZXQxMzF4X3NlbmRfcGFja2V0cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKIAogI2VuZGlmIC8qIF9fRVQxMzEwX1RYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfYWRhcHRlci5oIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfYWRhcHRlci5oCmluZGV4IDFkZmUwNmYuLjNmN2YzN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2FkYXB0ZXIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9hZGFwdGVyLmgKQEAgLTEwMCwxMiArMTAwLDYgQEAKICNkZWZpbmUgTE9fTUFSS19QRVJDRU5UX0ZPUl9QU1IgICAgIDE1CiAjZGVmaW5lIExPX01BUktfUEVSQ0VOVF9GT1JfUlggICAgICAxNQogCi0vKiBNYWNyb3Mgc3BlY2lmaWMgdG8gdGhlIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUgKi8KLSNkZWZpbmUgTVBfVENCX1JFU09VUkNFU19BVkFJTEFCTEUoX00pICgoX00pLT5UeFJpbmcubkJ1c3lTZW5kIDwgTlVNX1RDQikKLSNkZWZpbmUgTVBfVENCX1JFU09VUkNFU19OT1RfQVZBSUxBQkxFKF9NKSAoKF9NKS0+VHhSaW5nLm5CdXN5U2VuZCA+PSBOVU1fVENCKQotCi0jZGVmaW5lIE1QX1NIT1VMRF9GQUlMX1NFTkQoX00pICAgKChfTSktPkZsYWdzICYgZk1QX0FEQVBURVJfRkFJTF9TRU5EX01BU0spCi0KIC8qIENvdW50ZXJzIGZvciBlcnJvciByYXRlIG1vbml0b3JpbmcgKi8KIHR5cGVkZWYgc3RydWN0IF9NUF9FUlJfQ09VTlRFUlMgewogCXUzMiBQa3RDb3VudFR4UGFja2V0czsKQEAgLTE2OCw3ICsxNjIsNyBAQAogCXUzMiB0eF9kZWZlcnJlZDsKIAogCS8qIFJ4IFN0YXRpc3RpY3MuICovCi0JdTMyIHJ4X292X2Zsb3c7CS8qIFJ4IE92ZXIgRmxvdyAqLworCXUzMiByeF9vdl9mbG93OwkvKiBSeCBPdmVyZmxvdyAqLwogCiAJdTMyIGxlbmd0aF9lcnI7CiAJdTMyIGFsaWdubWVudF9lcnI7CkBAIC0yMDMsNyArMTk3LDYgQEAKIAlzcGlubG9ja190IFRDQlNlbmRRTG9jazsKIAlzcGlubG9ja190IFRDQlJlYWR5UUxvY2s7CiAJc3BpbmxvY2tfdCBTZW5kSFdMb2NrOwotCXNwaW5sb2NrX3QgU2VuZFdhaXRMb2NrOwogCiAJc3BpbmxvY2tfdCBSY3ZMb2NrOwogCXNwaW5sb2NrX3QgUmN2UGVuZExvY2s7CkBAIC0yMjAsOSArMjEzLDYgQEAKIAl1MzIgTUNBZGRyZXNzQ291bnQ7CiAJdTggTUNMaXN0W05JQ19NQVhfTUNBU1RfTElTVF1bRVRIX0FMRU5dOwogCi0JLyogTUFDIHRlc3QgKi8KLQlUWE1BQ19UWFRFU1RfdCBUeE1hY1Rlc3Q7Ci0KIAkvKiBQb2ludGVyIHRvIHRoZSBkZXZpY2UncyBQQ0kgcmVnaXN0ZXIgc3BhY2UgKi8KIAlBRERSRVNTX01BUF90IF9faW9tZW0gKnJlZ3M7CiAKQEAgLTIzNCw5ICsyMjQsNiBAQAogCXUzMiBSZWdpc3RyeVJ4TWVtRW5kOwkvKiBTaXplIG9mIGludGVybmFsIHJ4IG1lbW9yeSAqLwogCXUzMiBSZWdpc3RyeUp1bWJvUGFja2V0OwkvKiBNYXggc3VwcG9ydGVkIGV0aGVybmV0IHBhY2tldCBzaXplICovCiAKLQkvKiBWYWxpZGF0aW9uIGhlbHBlcnMgKi8KLQl1OCBSZWdpc3RyeU5NSURpc2FibGU7Ci0JdTggUmVnaXN0cnlQaHlMb29wYms7CS8qIEVuYWJsZSBQaHkgbG9vcGJhY2sgKi8KIAogCS8qIERlcml2ZWQgZnJvbSB0aGUgcmVnaXN0cnk6ICovCiAJdTggQWlGb3JjZURweDsJCS8qIGR1cGxleCBzZXR0aW5nICovCkBAIC0yNDgsNyArMjM1LDYgQEAKIAkJTkVUSUZfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QsCiAJCU5FVElGX1NUQVRVU19NQVgKIAl9IE1lZGlhU3RhdGU7Ci0JdTggRHJpdmVyTm9QaHlBY2Nlc3M7CiAKIAkvKiBNaW5pbWl6ZSBpbml0LXRpbWUgKi8KIAlzdHJ1Y3QgdGltZXJfbGlzdCBFcnJvclRpbWVyOwpAQCAtMjU5LDcgKzI0NSw3IEBACiAJTUlfQk1TUl90IEJtc3I7CiAKIAkvKiBUeCBNZW1vcnkgVmFyaWFibGVzICovCi0JVFhfUklOR190IFR4UmluZzsKKwlzdHJ1Y3QgdHhfcmluZyB0eF9yaW5nOwogCiAJLyogUnggTWVtb3J5IFZhcmlhYmxlcyAqLwogCVJYX1JJTkdfdCBSeFJpbmc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9kZWZzLmggYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9kZWZzLmgKaW5kZXggZjk4ZGNhNS4uZDgxZmM3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfZGVmcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2RlZnMuaApAQCAtMTAyLDcgKzEwMiw2IEBACiAKIC8qIFNvbWUgb2Zmc2V0cyBpbiBQQ0kgY29uZmlnIHNwYWNlIHRoYXQgYXJlIGFjdHVhbGx5IHVzZWQuICovCiAjZGVmaW5lIEVUMTMxMF9QQ0lfTUFYX1BZTEQJCTB4NEMKLSNkZWZpbmUgRVQxMzEwX05NSV9ESVNBQkxFCQkweDYxCiAjZGVmaW5lIEVUMTMxMF9QQ0lfTUFDX0FERFJFU1MJCTB4QTQKICNkZWZpbmUgRVQxMzEwX1BDSV9FRVBST01fU1RBVFVTCTB4QjIKICNkZWZpbmUgRVQxMzEwX1BDSV9BQ0tfTkFDSwkJMHhDMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfaW5pdHBjaS5jIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfaW5pdHBjaS5jCmluZGV4IDlkYjIwNTYuLjA4OTJiNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2luaXRwY2kuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9pbml0cGNpLmMKQEAgLTEwNiwxNyArMTA2LDYgQEAKICNkZWZpbmUgUEFSTV9TUEVFRF9EVVBMRVhfTUlOICAgMAogI2RlZmluZSBQQVJNX1NQRUVEX0RVUExFWF9NQVggICA1CiAKLS8qIE1vZHVsZSBwYXJhbWV0ZXIgZm9yIGRpc2FibGluZyBOTUkKLSAqIGV0MTMxeF9ubWlfZGlzYWJsZSA6Ci0gKiBEaXNhYmxlIE5NSSAoMC0yKSBbMF0KLSAqICAwIDoKLSAqICAxIDoKLSAqICAyIDoKLSAqLwotc3RhdGljIHUzMiBldDEzMXhfbm1pX2Rpc2FibGU7CS8qIDAtMiAqLwotbW9kdWxlX3BhcmFtKGV0MTMxeF9ubWlfZGlzYWJsZSwgdWludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGV0MTMxeF9ubWlfZGlzYWJsZSwgIkRpc2FibGUgTk1JICgwLTIpIFswXSIpOwotCiAvKiBNb2R1bGUgcGFyYW1ldGVyIGZvciBtYW51YWwgc3BlZWQgc2V0dGluZwogICogU2V0IExpbmsgc3BlZWQgYW5kIGR1YmxleCBtYW51YWxseSAoMC01KSAgWzBdCiAgKiAgMSA6IDEwTWIgICBIYWxmLUR1cGxleApAQCAtMTMyLDEyOCArMTIxLDg4IEBACiAJCSJTZXQgTGluayBzcGVlZCBhbmQgZHVibGV4IG1hbnVhbGx5ICgwLTUpICBbMF0gXG4gIDEgOiAxME1iICAgSGFsZi1EdXBsZXggXG4gIDIgOiAxME1iICAgRnVsbC1EdXBsZXggXG4gIDMgOiAxMDBNYiAgSGFsZi1EdXBsZXggXG4gIDQgOiAxMDBNYiAgRnVsbC1EdXBsZXggXG4gIDUgOiAxMDAwTWIgRnVsbC1EdXBsZXggXG4gMCA6IEF1dG8gU3BlZWQgQXV0byBEdWJsZXgiKTsKIAogLyoqCi0gKiBldDEzMXhfZmluZF9hZGFwdGVyIC0gRmluZCB0aGUgYWRhcHRlciBhbmQgZ2V0IGFsbCB0aGUgYXNzaWduZWQgcmVzb3VyY2VzCisgKiBldDEzMXhfaHdhZGRyX2luaXQgLSBzZXQgdXAgdGhlIE1BQyBBZGRyZXNzIG9uIHRoZSBFVDEzMTAKICAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG9uIGZhaWx1cmUgKGFzIGRlZmluZWQgaW4gZXJybm8uaCkKICAqLwotaW50IGV0MTMxeF9maW5kX2FkYXB0ZXIoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3ZvaWQgZXQxMzF4X2h3YWRkcl9pbml0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKIHsKLQlpbnQgcmVzdWx0OwotCXVpbnQ4X3QgZWVwcm9tU3RhdDsKLQl1aW50OF90IG1heFBheWxvYWQgPSAwOwotCXVpbnQ4X3QgcmVhZF9zaXplX3JlZzsKLQl1OCByZXY7Ci0KLQkvKiBBbGxvdyBkaXNhYmxpbmcgb2YgTm9uLU1hc2thYmxlIEludGVycnVwdHMgaW4gSS9PIHNwYWNlLCB0bwotCSAqIHN1cHBvcnQgdmFsaWRhdGlvbi4KKwkvKiBJZiBoYXZlIG91ciBkZWZhdWx0IG1hYyBmcm9tIGluaXQgYW5kIG5vIG1hYyBhZGRyZXNzIGZyb20KKwkgKiBFRVBST00gdGhlbiB3ZSBuZWVkIHRvIGdlbmVyYXRlIHRoZSBsYXN0IG9jdGV0IGFuZCBzZXQgaXQgb24gdGhlCisJICogZGV2aWNlCiAJICovCi0JaWYgKGFkYXB0ZXItPlJlZ2lzdHJ5Tk1JRGlzYWJsZSkgewotCQl1aW50OF90IFJlZ2lzdGVyVmFsOwotCi0JCVJlZ2lzdGVyVmFsID0gaW5iKEVUMTMxMF9OTUlfRElTQUJMRSk7Ci0JCVJlZ2lzdGVyVmFsICY9IDB4ZjM7Ci0KLQkJaWYgKGFkYXB0ZXItPlJlZ2lzdHJ5Tk1JRGlzYWJsZSA9PSAyKQotCQkJUmVnaXN0ZXJWYWwgfD0gMHhjOwotCi0JCW91dGIoRVQxMzEwX05NSV9ESVNBQkxFLCBSZWdpc3RlclZhbCk7Ci0JfQotCi0JLyogV2UgZmlyc3QgbmVlZCB0byBjaGVjayB0aGUgRUVQUk9NIFN0YXR1cyBjb2RlIGxvY2F0ZWQgYXQgb2Zmc2V0Ci0JICogMHhCMiBvZiBjb25maWcgc3BhY2UKLQkgKi8KLQlyZXN1bHQgPSBwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBFVDEzMTBfUENJX0VFUFJPTV9TVEFUVVMsCi0JCQkJICAgICAgJmVlcHJvbVN0YXQpOwotCi0JLyogVEhJUyBJUyBBIFdPUktBUk9VTkQ6Ci0JICogSSBuZWVkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB0d2ljZSB0byBnZXQgbXkgY2FyZCBpbiBhCi0JICogTEcgTTEgRXhwcmVzcyBEdWFsIHJ1bm5pbmcuIEkgdHJpZWQgYWxzbyBhIG1zbGVlcCBiZWZvcmUgdGhpcwotCSAqIGZ1bmN0aW9uLCBiZWNhdXNlIEkgdGhvdWd0aCB0aGVyZSBjb3VsZCBiZSBzb21lIHRpbWUgY29uZGlkaW9ucwotCSAqIGJ1dCBpdCBkaWRuJ3Qgd29yay4gQ2FsbCB0aGUgd2hvbGUgZnVuY3Rpb24gdHdpY2UgYWxzbyB3b3JrLgotCSAqLwotCXJlc3VsdCA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIEVUMTMxMF9QQ0lfRUVQUk9NX1NUQVRVUywKLQkJCQkgICAgICAmZWVwcm9tU3RhdCk7Ci0JaWYgKHJlc3VsdCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ291bGQgbm90IHJlYWQgUENJIGNvbmZpZyBzcGFjZSBmb3IgIgotCQkJICAiRUVQUk9NIFN0YXR1c1xuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCS8qIERldGVybWluZSBpZiB0aGUgZXJyb3Iocykgd2UgY2FyZSBhYm91dCBhcmUgcHJlc2VudC4gIElmIHRoZXkgYXJlCi0JICogcHJlc2VudCwgd2UgbmVlZCB0byBmYWlsLgotCSAqLwotCWlmIChlZXByb21TdGF0ICYgMHg0QykgewotCQlyZXN1bHQgPSBwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZyZXYpOwotCQlpZiAocmVzdWx0ICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJCSAgIkNvdWxkIG5vdCByZWFkIFBDSSBjb25maWcgc3BhY2UgZm9yICIKLQkJCQkgICJSZXZpc2lvbiBJRFxuIik7Ci0JCQlyZXR1cm4gLUVJTzsKLQkJfSBlbHNlIGlmIChyZXYgPT0gMHgwMSkgewotCQkJaW50MzJfdCBuTG9vcDsKLQkJCXVpbnQ4X3QgdGVtcFs0XSA9IHsgMHhGRSwgMHgxMywgMHgxMCwgMHhGRiB9OwotCi0JCQkvKiBSZS13cml0ZSB0aGUgZmlyc3QgNCBieXRlcyBpZiB3ZSBoYXZlIGFuIGVlcHJvbQotCQkJICogcHJlc2VudCBhbmQgdGhlIHJldmlzaW9uIGlkIGlzIDEsIHRoaXMgZml4ZXMgdGhlCi0JCQkgKiBjb3JydXB0aW9uIHNlZW4gd2l0aCAxMzEwIEIgU2lsaWNvbgotCQkJICovCi0JCQlmb3IgKG5Mb29wID0gMDsgbkxvb3AgPCAzOyBuTG9vcCsrKSB7Ci0JCQkJRWVwcm9tV3JpdGVCeXRlKGFkYXB0ZXIsIG5Mb29wLCB0ZW1wW25Mb29wXSk7Ci0JCQl9Ci0JCX0KLQotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYXRhbCBFRVBST00gU3RhdHVzIEVycm9yIC0gMHglMDR4XG4iLCBlZXByb21TdGF0KTsKLQotCQkvKiBUaGlzIGVycm9yIGNvdWxkIG1lYW4gdGhhdCB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyB0aGUKLQkJICogZWVwcm9tIG9yIHRoYXQgdGhlIGVlcHJvbSBkb2Vzbid0IGV4aXN0LiAgV2Ugd2lsbCB0cmVhdAotCQkgKiBlYWNoIGNhc2UgdGhlIHNhbWUgYW5kIG5vdCB0cnkgdG8gZ2F0aGVyIGFkZGl0aW9uYWwKLQkJICogaW5mb3JtYXRpb24gdGhhdCBub3JtYWxseSB3b3VsZCBjb21lIGZyb20gdGhlIGVlcHJvbSwgbGlrZQotCQkgKiBNQUMgQWRkcmVzcworCWlmIChhZGFwdGVyLT5QZXJtYW5lbnRBZGRyZXNzWzBdID09IDB4MDAgJiYKKwkgICAgYWRhcHRlci0+UGVybWFuZW50QWRkcmVzc1sxXSA9PSAweDAwICYmCisJICAgIGFkYXB0ZXItPlBlcm1hbmVudEFkZHJlc3NbMl0gPT0gMHgwMCAmJgorCSAgICBhZGFwdGVyLT5QZXJtYW5lbnRBZGRyZXNzWzNdID09IDB4MDAgJiYKKwkgICAgYWRhcHRlci0+UGVybWFuZW50QWRkcmVzc1s0XSA9PSAweDAwICYmCisJICAgIGFkYXB0ZXItPlBlcm1hbmVudEFkZHJlc3NbNV0gPT0gMHgwMCkgeworCQkvKgorCQkgKiBXZSBuZWVkIHRvIHJhbmRvbWx5IGdlbmVyYXRlIHRoZSBsYXN0IG9jdGV0IHNvIHdlCisJCSAqIGRlY3JlYXNlIG91ciBjaGFuY2VzIG9mIHNldHRpbmcgdGhlIG1hYyBhZGRyZXNzIHRvCisJCSAqIHNhbWUgYXMgYW5vdGhlciBvbmUgb2Ygb3VyIGNhcmRzIGluIHRoZSBzeXN0ZW0KIAkJICovCi0JCWFkYXB0ZXItPmhhc19lZXByb20gPSAwOworCQlnZXRfcmFuZG9tX2J5dGVzKCZhZGFwdGVyLT5DdXJyZW50QWRkcmVzc1s1XSwgMSk7CisJCS8qCisJCSAqIFdlIGhhdmUgdGhlIGRlZmF1bHQgdmFsdWUgaW4gdGhlIHJlZ2lzdGVyIHdlIGFyZQorCQkgKiB3b3JraW5nIHdpdGggc28gd2UgbmVlZCB0byBjb3B5IHRoZSBjdXJyZW50CisJCSAqIGFkZHJlc3MgaW50byB0aGUgcGVybWFuZW50IGFkZHJlc3MKKwkJICovCisJCW1lbWNweShhZGFwdGVyLT5QZXJtYW5lbnRBZGRyZXNzLAorCQkJYWRhcHRlci0+Q3VycmVudEFkZHJlc3MsIEVUSF9BTEVOKTsKKwl9IGVsc2UgeworCQkvKiBXZSBkbyBub3QgaGF2ZSBhbiBvdmVycmlkZSBhZGRyZXNzLCBzbyBzZXQgdGhlCisJCSAqIGN1cnJlbnQgYWRkcmVzcyB0byB0aGUgcGVybWFuZW50IGFkZHJlc3MgYW5kIGFkZAorCQkgKiBpdCB0byB0aGUgZGV2aWNlCisJCSAqLworCQltZW1jcHkoYWRhcHRlci0+Q3VycmVudEFkZHJlc3MsCisJCSAgICAgICBhZGFwdGVyLT5QZXJtYW5lbnRBZGRyZXNzLCBFVEhfQUxFTik7CisJfQorfQorCisKKy8qKgorICogZXQxMzF4X3BjaV9pbml0CSAtIGluaXRpYWwgUENJIHNldHVwCisgKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICogQHBkZXY6IG91ciBQQ0kgZGV2aWNlCisgKgorICogUGVyZm9ybSB0aGUgaW5pdGlhbCBzZXR1cCBvZiBQQ0kgcmVnaXN0ZXJzIGFuZCBpZiBwb3NzaWJsZSBpbml0aWFsaXNlCisgKiB0aGUgTUFDIGFkZHJlc3MuIEF0IHRoaXMgcG9pbnQgdGhlIEkvTyByZWdpc3RlcnMgaGF2ZSB5ZXQgdG8gYmUgbWFwcGVkCisgKi8KKworc3RhdGljIGludCBldDEzMXhfcGNpX2luaXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLAorCQkJCQkJc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaW50IGk7CisJdTggbWF4X3BheWxvYWQ7CisJdTggcmVhZF9zaXplX3JlZzsKKworCWlmIChldDEzMXhfaW5pdF9lZXByb20oYWRhcHRlcikgPCAwKQogCQlyZXR1cm4gLUVJTzsKLQl9IGVsc2UKLQkJYWRhcHRlci0+aGFzX2VlcHJvbSA9IDE7Ci0KLQkvKiBSZWFkIHRoZSBFRVBST00gZm9yIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBMRUQgYmVoYXZpb3IuIFJlZmVyIHRvCi0JICogRVQxMzEwX3BoeS5jLCBldDEzMXhfeGN2cl9pbml0KCksIGZvciBpdHMgdXNlLgotCSAqLwotCUVlcHJvbVJlYWRCeXRlKGFkYXB0ZXIsIDB4NzAsICZhZGFwdGVyLT5lZXByb21EYXRhWzBdKTsKLQlFZXByb21SZWFkQnl0ZShhZGFwdGVyLCAweDcxLCAmYWRhcHRlci0+ZWVwcm9tRGF0YVsxXSk7Ci0KLQlpZiAoYWRhcHRlci0+ZWVwcm9tRGF0YVswXSAhPSAweGNkKQotCQkvKiBEaXNhYmxlIGFsbCBvcHRpb25hbCBmZWF0dXJlcyAqLwotCQlhZGFwdGVyLT5lZXByb21EYXRhWzFdID0gMHgwMDsKIAogCS8qIExldCdzIHNldCB1cCB0aGUgUE9SVCBMT0dJQyBSZWdpc3Rlci4gIEZpcnN0IHdlIG5lZWQgdG8ga25vdyB3aGF0CiAJICogdGhlIG1heF9wYXlsb2FkX3NpemUgaXMKIAkgKi8KLQlyZXN1bHQgPSBwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBFVDEzMTBfUENJX01BWF9QWUxELCAmbWF4UGF5bG9hZCk7Ci0JaWYgKHJlc3VsdCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpIHsKKwlpZiAocGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgRVQxMzEwX1BDSV9NQVhfUFlMRCwgJm1heF9wYXlsb2FkKSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCSAgICAiQ291bGQgbm90IHJlYWQgUENJIGNvbmZpZyBzcGFjZSBmb3IgTWF4IFBheWxvYWQgU2l6ZVxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAogCS8qIFByb2dyYW0gdGhlIEFjay9OYWsgbGF0ZW5jeSBhbmQgcmVwbGF5IHRpbWVycyAqLwotCW1heFBheWxvYWQgJj0gMHgwNzsJLyogT25seSB0aGUgbG93ZXIgMyBiaXRzIGFyZSB2YWxpZCAqLworCW1heF9wYXlsb2FkICY9IDB4MDc7CS8qIE9ubHkgdGhlIGxvd2VyIDMgYml0cyBhcmUgdmFsaWQgKi8KIAotCWlmIChtYXhQYXlsb2FkIDwgMikgewotCQljb25zdCB1aW50MTZfdCBBY2tOYWtbMl0gPSB7IDB4NzYsIDB4RDAgfTsKLQkJY29uc3QgdWludDE2X3QgUmVwbGF5WzJdID0geyAweDFFMCwgMHgyRUQgfTsKKwlpZiAobWF4X3BheWxvYWQgPCAyKSB7CisJCXN0YXRpYyBjb25zdCB1MTYgQWNrTmFrWzJdID0geyAweDc2LCAweEQwIH07CisJCXN0YXRpYyBjb25zdCB1MTYgUmVwbGF5WzJdID0geyAweDFFMCwgMHgyRUQgfTsKIAotCQlyZXN1bHQgPSBwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgRVQxMzEwX1BDSV9BQ0tfTkFDSywKLQkJCQkJICAgICAgIEFja05ha1ttYXhQYXlsb2FkXSk7Ci0JCWlmIChyZXN1bHQgIT0gUENJQklPU19TVUNDRVNTRlVMKSB7CisJCWlmIChwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgRVQxMzEwX1BDSV9BQ0tfTkFDSywKKwkJCQkJICAgICAgIEFja05ha1ttYXhfcGF5bG9hZF0pKSB7CiAJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkgICJDb3VsZCBub3Qgd3JpdGUgUENJIGNvbmZpZyBzcGFjZSBmb3IgQUNLL05BS1xuIik7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQotCi0JCXJlc3VsdCA9IHBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBFVDEzMTBfUENJX1JFUExBWSwKLQkJCQkJICAgICAgIFJlcGxheVttYXhQYXlsb2FkXSk7Ci0JCWlmIChyZXN1bHQgIT0gUENJQklPU19TVUNDRVNTRlVMKSB7CisJCWlmIChwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgRVQxMzEwX1BDSV9SRVBMQVksCisJCQkJCSAgICAgICBSZXBsYXlbbWF4X3BheWxvYWRdKSkgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkJICAiQ291bGQgbm90IHdyaXRlIFBDSSBjb25maWcgc3BhY2UgZm9yIFJlcGxheSBUaW1lclxuIik7CiAJCQlyZXR1cm4gLUVJTzsKQEAgLTI2MywxNiArMjEyLDE0IEBACiAJLyogbDBzIGFuZCBsMSBsYXRlbmN5IHRpbWVycy4gIFdlIGFyZSB1c2luZyBkZWZhdWx0IHZhbHVlcy4KIAkgKiBSZXByZXNlbnRpbmcgMDAxIGZvciBMMHMgYW5kIDAxMCBmb3IgTDEKIAkgKi8KLQlyZXN1bHQgPSBwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgRVQxMzEwX1BDSV9MMEwxTEFURU5DWSwgMHgxMSk7Ci0JaWYgKHJlc3VsdCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpIHsKKwlpZiAocGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIEVUMTMxMF9QQ0lfTDBMMUxBVEVOQ1ksIDB4MTEpKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwKIAkJICAiQ291bGQgbm90IHdyaXRlIFBDSSBjb25maWcgc3BhY2UgZm9yIExhdGVuY3kgVGltZXJzXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCiAJLyogQ2hhbmdlIHRoZSBtYXggcmVhZCBzaXplIHRvIDJrICovCi0JcmVzdWx0ID0gcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg1MSwgJnJlYWRfc2l6ZV9yZWcpOwotCWlmIChyZXN1bHQgIT0gUENJQklPU19TVUNDRVNTRlVMKSB7CisJaWYgKHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NTEsICZyZWFkX3NpemVfcmVnKSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkiQ291bGQgbm90IHJlYWQgUENJIGNvbmZpZyBzcGFjZSBmb3IgTWF4IHJlYWQgc2l6ZVxuIik7CiAJCXJldHVybiAtRUlPOwpAQCAtMjgxLDggKzIyOCw3IEBACiAJcmVhZF9zaXplX3JlZyAmPSAweDhmOwogCXJlYWRfc2l6ZV9yZWcgfD0gMHg0MDsKIAotCXJlc3VsdCA9IHBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDUxLCByZWFkX3NpemVfcmVnKTsKLQlpZiAocmVzdWx0ICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkgeworCWlmIChwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg1MSwgcmVhZF9zaXplX3JlZykpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkgICAgICAiQ291bGQgbm90IHdyaXRlIFBDSSBjb25maWcgc3BhY2UgZm9yIE1heCByZWFkIHNpemVcbiIpOwogCQlyZXR1cm4gLUVJTzsKQEAgLTI5MSwxOSArMjM3LDE5IEBACiAJLyogR2V0IE1BQyBhZGRyZXNzIGZyb20gY29uZmlnIHNwYWNlIGlmIGFuIGVlcHJvbSBleGlzdHMsIG90aGVyd2lzZQogCSAqIHRoZSBNQUMgYWRkcmVzcyB0aGVyZSB3aWxsIG5vdCBiZSB2YWxpZAogCSAqLwotCWlmIChhZGFwdGVyLT5oYXNfZWVwcm9tKSB7Ci0JCWludCBpOworCWlmICghYWRhcHRlci0+aGFzX2VlcHJvbSkgeworCQlldDEzMXhfaHdhZGRyX2luaXQoYWRhcHRlcik7CisJCXJldHVybiAwOworCX0KIAotCQlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykgewotCQkJcmVzdWx0ID0gcGNpX3JlYWRfY29uZmlnX2J5dGUoCi0JCQkJCXBkZXYsIEVUMTMxMF9QQ0lfTUFDX0FERFJFU1MgKyBpLAotCQkJCQlhZGFwdGVyLT5QZXJtYW5lbnRBZGRyZXNzICsgaSk7Ci0JCQlpZiAocmVzdWx0ICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkgewotCQkJCWRldl9lcnIoJnBkZXYtPmRldiwgIjtDb3VsZCBub3QgcmVhZCBQQ0kgY29uZmlnIHNwYWNlIGZvciBNQUMgYWRkcmVzc1xuIik7Ci0JCQkJcmV0dXJuIC1FSU87Ci0JCQl9CisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKKwkJaWYgKHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIEVUMTMxMF9QQ0lfTUFDX0FERFJFU1MgKyBpLAorCQkJCQlhZGFwdGVyLT5QZXJtYW5lbnRBZGRyZXNzICsgaSkpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkIG5vdCByZWFkIFBDSSBjb25maWcgc3BhY2UgZm9yIE1BQyBhZGRyZXNzXG4iKTsKKwkJCXJldHVybiAtRUlPOwogCQl9CiAJfQorCW1lbWNweShhZGFwdGVyLT5DdXJyZW50QWRkcmVzcywgYWRhcHRlci0+UGVybWFuZW50QWRkcmVzcywgRVRIX0FMRU4pOwogCXJldHVybiAwOwogfQogCkBAIC0zODMsNTIgKzMyOSwzNCBAQAogewogCXN0cnVjdCBfR0xPQkFMX3QgX19pb21lbSAqcmVncyA9ICZldGRldi0+cmVncy0+Z2xvYmFsOwogCi0JaWYgKGV0ZGV2LT5SZWdpc3RyeVBoeUxvb3BiayA9PSBmYWxzZSkgewotCQlpZiAoZXRkZXYtPlJlZ2lzdHJ5SnVtYm9QYWNrZXQgPCAyMDQ4KSB7Ci0JCQkvKiBUeCAvIFJ4RE1BIGFuZCBUeC9SeCBNQUMgaW50ZXJmYWNlcyBoYXZlIGEgMWsgd29yZAotCQkJICogYmxvY2sgb2YgUkFNIHRoYXQgdGhlIGRyaXZlciBjYW4gc3BsaXQgYmV0d2VlbiBUeAotCQkJICogYW5kIFJ4IGFzIGl0IGRlc2lyZXMuICBPdXIgZGVmYXVsdCBpcyB0byBzcGxpdCBpdAotCQkJICogNTAvNTA6Ci0JCQkgKi8KLQkJCXdyaXRlbCgwLCAmcmVncy0+cnhxX3N0YXJ0X2FkZHIpOwotCQkJd3JpdGVsKFBBUk1fUlhfTUVNX0VORF9ERUYsICZyZWdzLT5yeHFfZW5kX2FkZHIpOwotCQkJd3JpdGVsKFBBUk1fUlhfTUVNX0VORF9ERUYgKyAxLCAmcmVncy0+dHhxX3N0YXJ0X2FkZHIpOwotCQkJd3JpdGVsKElOVEVSTkFMX01FTV9TSVpFIC0gMSwgJnJlZ3MtPnR4cV9lbmRfYWRkcik7Ci0JCX0gZWxzZSBpZiAoZXRkZXYtPlJlZ2lzdHJ5SnVtYm9QYWNrZXQgPCA4MTkyKSB7Ci0JCQkvKiBGb3IganVtYm8gcGFja2V0cyA+IDJrIGJ1dCA8IDhrLCBzcGxpdCA1MC01MC4gKi8KLQkJCXdyaXRlbCgwLCAmcmVncy0+cnhxX3N0YXJ0X2FkZHIpOwotCQkJd3JpdGVsKElOVEVSTkFMX01FTV9SWF9PRkZTRVQsICZyZWdzLT5yeHFfZW5kX2FkZHIpOwotCQkJd3JpdGVsKElOVEVSTkFMX01FTV9SWF9PRkZTRVQgKyAxLCAmcmVncy0+dHhxX3N0YXJ0X2FkZHIpOwotCQkJd3JpdGVsKElOVEVSTkFMX01FTV9TSVpFIC0gMSwgJnJlZ3MtPnR4cV9lbmRfYWRkcik7Ci0JCX0gZWxzZSB7Ci0JCQkvKiA5MjE2IGlzIHRoZSBvbmx5IHBhY2tldCBzaXplIGdyZWF0ZXIgdGhhbiA4ayB0aGF0Ci0JCQkgKiBpcyBhdmFpbGFibGUuIFRoZSBUeCBidWZmZXIgaGFzIHRvIGJlIGJpZyBlbm91Z2gKLQkJCSAqIGZvciBvbmUgd2hvbGUgcGFja2V0IG9uIHRoZSBUeCBzaWRlLiBXZSdsbCBtYWtlCi0JCQkgKiB0aGUgVHggOTQwOCwgYW5kIGdpdmUgdGhlIHJlc3QgdG8gUngKLQkJCSAqLwotCQkJd3JpdGVsKDB4MDAwMCwgJnJlZ3MtPnJ4cV9zdGFydF9hZGRyKTsKLQkJCXdyaXRlbCgweDAxYjMsICZyZWdzLT5yeHFfZW5kX2FkZHIpOwotCQkJd3JpdGVsKDB4MDFiNCwgJnJlZ3MtPnR4cV9zdGFydF9hZGRyKTsKLQkJCXdyaXRlbChJTlRFUk5BTF9NRU1fU0laRSAtIDEsJnJlZ3MtPnR4cV9lbmRfYWRkcik7Ci0JCX0KKwl3cml0ZWwoMCwgJnJlZ3MtPnJ4cV9zdGFydF9hZGRyKTsKKwl3cml0ZWwoSU5URVJOQUxfTUVNX1NJWkUgLSAxLCAmcmVncy0+dHhxX2VuZF9hZGRyKTsKIAotCQkvKiBJbml0aWFsaXplIHRoZSBsb29wYmFjayByZWdpc3Rlci4gRGlzYWJsZSBhbGwgbG9vcGJhY2tzLiAqLwotCQl3cml0ZWwoMCwgJnJlZ3MtPmxvb3BiYWNrKTsKLQl9IGVsc2UgewotCQkvKiBGb3IgUEhZIExpbmUgbG9vcGJhY2ssIHRoZSBtZW1vcnkgaXMgY29uZmlndXJlZCBhcyBpZiBUeAotCQkgKiBhbmQgUnggYm90aCBoYXZlIGFsbCB0aGUgbWVtb3J5LiAgVGhpcyBpcyBiZWNhdXNlIHRoZQotCQkgKiBSeE1BQyB3aWxsIHdyaXRlIGRhdGEgaW50byB0aGUgc3BhY2UsIGFuZCB0aGUgVHhNQUMgd2lsbAotCQkgKiByZWFkIGl0IG91dC4KKwlpZiAoZXRkZXYtPlJlZ2lzdHJ5SnVtYm9QYWNrZXQgPCAyMDQ4KSB7CisJCS8qIFR4IC8gUnhETUEgYW5kIFR4L1J4IE1BQyBpbnRlcmZhY2VzIGhhdmUgYSAxayB3b3JkCisJCSAqIGJsb2NrIG9mIFJBTSB0aGF0IHRoZSBkcml2ZXIgY2FuIHNwbGl0IGJldHdlZW4gVHgKKwkJICogYW5kIFJ4IGFzIGl0IGRlc2lyZXMuICBPdXIgZGVmYXVsdCBpcyB0byBzcGxpdCBpdAorCQkgKiA1MC81MDoKIAkJICovCi0JCXdyaXRlbCgwLCAmcmVncy0+cnhxX3N0YXJ0X2FkZHIpOwotCQl3cml0ZWwoSU5URVJOQUxfTUVNX1NJWkUgLSAxLCAmcmVncy0+cnhxX2VuZF9hZGRyKTsKLQkJd3JpdGVsKDAsICZyZWdzLT50eHFfc3RhcnRfYWRkcik7Ci0JCXdyaXRlbChJTlRFUk5BTF9NRU1fU0laRSAtIDEsICZyZWdzLT50eHFfZW5kX2FkZHIpOwotCi0JCS8qIEluaXRpYWxpemUgdGhlIGxvb3BiYWNrIHJlZ2lzdGVyIChNQUMgbG9vcGJhY2spLiAqLwotCQl3cml0ZWwoRVRfTE9PUF9NQUMsICZyZWdzLT5sb29wYmFjayk7CisJCXdyaXRlbChQQVJNX1JYX01FTV9FTkRfREVGLCAmcmVncy0+cnhxX2VuZF9hZGRyKTsKKwkJd3JpdGVsKFBBUk1fUlhfTUVNX0VORF9ERUYgKyAxLCAmcmVncy0+dHhxX3N0YXJ0X2FkZHIpOworCX0gZWxzZSBpZiAoZXRkZXYtPlJlZ2lzdHJ5SnVtYm9QYWNrZXQgPCA4MTkyKSB7CisJCS8qIEZvciBqdW1ibyBwYWNrZXRzID4gMmsgYnV0IDwgOGssIHNwbGl0IDUwLTUwLiAqLworCQl3cml0ZWwoSU5URVJOQUxfTUVNX1JYX09GRlNFVCwgJnJlZ3MtPnJ4cV9lbmRfYWRkcik7CisJCXdyaXRlbChJTlRFUk5BTF9NRU1fUlhfT0ZGU0VUICsgMSwgJnJlZ3MtPnR4cV9zdGFydF9hZGRyKTsKKwl9IGVsc2UgeworCQkvKiA5MjE2IGlzIHRoZSBvbmx5IHBhY2tldCBzaXplIGdyZWF0ZXIgdGhhbiA4ayB0aGF0CisJCSAqIGlzIGF2YWlsYWJsZS4gVGhlIFR4IGJ1ZmZlciBoYXMgdG8gYmUgYmlnIGVub3VnaAorCQkgKiBmb3Igb25lIHdob2xlIHBhY2tldCBvbiB0aGUgVHggc2lkZS4gV2UnbGwgbWFrZQorCQkgKiB0aGUgVHggOTQwOCwgYW5kIGdpdmUgdGhlIHJlc3QgdG8gUngKKwkJICovCisJCXdyaXRlbCgweDAxYjMsICZyZWdzLT5yeHFfZW5kX2FkZHIpOworCQl3cml0ZWwoMHgwMWI0LCAmcmVncy0+dHhxX3N0YXJ0X2FkZHIpOwogCX0KIAorCS8qIEluaXRpYWxpemUgdGhlIGxvb3BiYWNrIHJlZ2lzdGVyLiBEaXNhYmxlIGFsbCBsb29wYmFja3MuICovCisJd3JpdGVsKDAsICZyZWdzLT5sb29wYmFjayk7CisKIAkvKiBNU0kgUmVnaXN0ZXIgKi8KIAl3cml0ZWwoMCwgJnJlZ3MtPm1zaV9jb25maWcpOwogCkBAIC00OTgsNTcgKzQyNiwxOCBAQAogfQogCiAvKioKLSAqIGV0MTMxeF9zZXR1cF9oYXJkd2FyZV9wcm9wZXJ0aWVzIC0gc2V0IHVwIHRoZSBNQUMgQWRkcmVzcyBvbiB0aGUgRVQxMzEwCi0gKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQotICovCi12b2lkIGV0MTMxeF9zZXR1cF9oYXJkd2FyZV9wcm9wZXJ0aWVzKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKLXsKLQkvKiBJZiBoYXZlIG91ciBkZWZhdWx0IG1hYyBmcm9tIHJlZ2lzdHJ5IGFuZCBubyBtYWMgYWRkcmVzcyBmcm9tCi0JICogRUVQUk9NIHRoZW4gd2UgbmVlZCB0byBnZW5lcmF0ZSB0aGUgbGFzdCBvY3RldCBhbmQgc2V0IGl0IG9uIHRoZQotCSAqIGRldmljZQotCSAqLwotCWlmIChhZGFwdGVyLT5QZXJtYW5lbnRBZGRyZXNzWzBdID09IDB4MDAgJiYKLQkgICAgYWRhcHRlci0+UGVybWFuZW50QWRkcmVzc1sxXSA9PSAweDAwICYmCi0JICAgIGFkYXB0ZXItPlBlcm1hbmVudEFkZHJlc3NbMl0gPT0gMHgwMCAmJgotCSAgICBhZGFwdGVyLT5QZXJtYW5lbnRBZGRyZXNzWzNdID09IDB4MDAgJiYKLQkgICAgYWRhcHRlci0+UGVybWFuZW50QWRkcmVzc1s0XSA9PSAweDAwICYmCi0JICAgIGFkYXB0ZXItPlBlcm1hbmVudEFkZHJlc3NbNV0gPT0gMHgwMCkgewotCQkvKgotCQkgKiBXZSBuZWVkIHRvIHJhbmRvbWx5IGdlbmVyYXRlIHRoZSBsYXN0IG9jdGV0IHNvIHdlCi0JCSAqIGRlY3JlYXNlIG91ciBjaGFuY2VzIG9mIHNldHRpbmcgdGhlIG1hYyBhZGRyZXNzIHRvCi0JCSAqIHNhbWUgYXMgYW5vdGhlciBvbmUgb2Ygb3VyIGNhcmRzIGluIHRoZSBzeXN0ZW0KLQkJICovCi0JCWdldF9yYW5kb21fYnl0ZXMoJmFkYXB0ZXItPkN1cnJlbnRBZGRyZXNzWzVdLCAxKTsKLQkJLyoKLQkJICogV2UgaGF2ZSB0aGUgZGVmYXVsdCB2YWx1ZSBpbiB0aGUgcmVnaXN0ZXIgd2UgYXJlCi0JCSAqIHdvcmtpbmcgd2l0aCBzbyB3ZSBuZWVkIHRvIGNvcHkgdGhlIGN1cnJlbnQKLQkJICogYWRkcmVzcyBpbnRvIHRoZSBwZXJtYW5lbnQgYWRkcmVzcwotCQkgKi8KLQkJbWVtY3B5KGFkYXB0ZXItPlBlcm1hbmVudEFkZHJlc3MsCi0JCQlhZGFwdGVyLT5DdXJyZW50QWRkcmVzcywgRVRIX0FMRU4pOwotCX0gZWxzZSB7Ci0JCS8qIFdlIGRvIG5vdCBoYXZlIGFuIG92ZXJyaWRlIGFkZHJlc3MsIHNvIHNldCB0aGUKLQkJICogY3VycmVudCBhZGRyZXNzIHRvIHRoZSBwZXJtYW5lbnQgYWRkcmVzcyBhbmQgYWRkCi0JCSAqIGl0IHRvIHRoZSBkZXZpY2UKLQkJICovCi0JCW1lbWNweShhZGFwdGVyLT5DdXJyZW50QWRkcmVzcywKLQkJICAgICAgIGFkYXB0ZXItPlBlcm1hbmVudEFkZHJlc3MsIEVUSF9BTEVOKTsKLQl9Ci19Ci0KLS8qKgogICogZXQxMzF4X3NvZnRfcmVzZXQgLSBJc3N1ZSBhIHNvZnQgcmVzZXQgdG8gdGhlIGhhcmR3YXJlLCBjb21wbGV0ZSBmb3IgRVQxMzEwCiAgKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogICovCiB2b2lkIGV0MTMxeF9zb2Z0X3Jlc2V0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKIHsKIAkvKiBEaXNhYmxlIE1BQyBDb3JlICovCi0Jd3JpdGVsKDB4YzAwZjAwMDAsICZhZGFwdGVyLT5yZWdzLT5tYWMuY2ZnMS52YWx1ZSk7CisJd3JpdGVsKDB4YzAwZjAwMDAsICZhZGFwdGVyLT5yZWdzLT5tYWMuY2ZnMSk7CiAKIAkvKiBTZXQgZXZlcnl0aGluZyB0byBhIHJlc2V0IHZhbHVlICovCiAJd3JpdGVsKDB4N0YsICZhZGFwdGVyLT5yZWdzLT5nbG9iYWwuc3dfcmVzZXQpOwotCXdyaXRlbCgweDAwMGYwMDAwLCAmYWRhcHRlci0+cmVncy0+bWFjLmNmZzEudmFsdWUpOwotCXdyaXRlbCgweDAwMDAwMDAwLCAmYWRhcHRlci0+cmVncy0+bWFjLmNmZzEudmFsdWUpOworCXdyaXRlbCgweDAwMGYwMDAwLCAmYWRhcHRlci0+cmVncy0+bWFjLmNmZzEpOworCXdyaXRlbCgweDAwMDAwMDAwLCAmYWRhcHRlci0+cmVncy0+bWFjLmNmZzEpOwogfQogCiAvKioKQEAgLTU4OCwzNiArNDc3LDMyIEBACiAgKi8KIGludCBldDEzMXhfYWRhcHRlcl9tZW1vcnlfYWxsb2Moc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQogewotCWludCBzdGF0dXMgPSAwOworCWludCBzdGF0dXM7CiAKLQlkbyB7Ci0JCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIFR4IFJpbmcgKi8KLQkJc3RhdHVzID0gZXQxMzF4X3R4X2RtYV9tZW1vcnlfYWxsb2MoYWRhcHRlcik7Ci0JCWlmIChzdGF0dXMgIT0gMCkgewotCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAotCQkJCSAgImV0MTMxeF90eF9kbWFfbWVtb3J5X2FsbG9jIEZBSUxFRFxuIik7Ci0JCQlicmVhazsKLQkJfQorCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIFR4IFJpbmcgKi8KKwlzdGF0dXMgPSBldDEzMXhfdHhfZG1hX21lbW9yeV9hbGxvYyhhZGFwdGVyKTsKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJICAiZXQxMzF4X3R4X2RtYV9tZW1vcnlfYWxsb2MgRkFJTEVEXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJLyogUmVjZWl2ZSBidWZmZXIgbWVtb3J5IGFsbG9jYXRpb24gKi8KKwlzdGF0dXMgPSBldDEzMXhfcnhfZG1hX21lbW9yeV9hbGxvYyhhZGFwdGVyKTsKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJICAiZXQxMzF4X3J4X2RtYV9tZW1vcnlfYWxsb2MgRkFJTEVEXG4iKTsKKwkJZXQxMzF4X3R4X2RtYV9tZW1vcnlfZnJlZShhZGFwdGVyKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CiAKLQkJLyogUmVjZWl2ZSBidWZmZXIgbWVtb3J5IGFsbG9jYXRpb24gKi8KLQkJc3RhdHVzID0gZXQxMzF4X3J4X2RtYV9tZW1vcnlfYWxsb2MoYWRhcHRlcik7Ci0JCWlmIChzdGF0dXMgIT0gMCkgewotCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAotCQkJCSAgImV0MTMxeF9yeF9kbWFfbWVtb3J5X2FsbG9jIEZBSUxFRFxuIik7Ci0JCQlldDEzMXhfdHhfZG1hX21lbW9yeV9mcmVlKGFkYXB0ZXIpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBJbml0IHJlY2VpdmUgZGF0YSBzdHJ1Y3R1cmVzICovCi0JCXN0YXR1cyA9IGV0MTMxeF9pbml0X3JlY3YoYWRhcHRlcik7Ci0JCWlmIChzdGF0dXMgIT0gMCkgewotCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAotCQkJCSJldDEzMXhfaW5pdF9yZWN2IEZBSUxFRFxuIik7Ci0JCQlldDEzMXhfdHhfZG1hX21lbW9yeV9mcmVlKGFkYXB0ZXIpOwotCQkJZXQxMzF4X3J4X2RtYV9tZW1vcnlfZnJlZShhZGFwdGVyKTsKLQkJCWJyZWFrOwotCQl9Ci0JfSB3aGlsZSAoMCk7CisJLyogSW5pdCByZWNlaXZlIGRhdGEgc3RydWN0dXJlcyAqLworCXN0YXR1cyA9IGV0MTMxeF9pbml0X3JlY3YoYWRhcHRlcik7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCSJldDEzMXhfaW5pdF9yZWN2IEZBSUxFRFxuIik7CisJCWV0MTMxeF90eF9kbWFfbWVtb3J5X2ZyZWUoYWRhcHRlcik7CisJCWV0MTMxeF9yeF9kbWFfbWVtb3J5X2ZyZWUoYWRhcHRlcik7CisJfQogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTYzMiwyMiArNTE3LDUwIEBACiAJZXQxMzF4X3J4X2RtYV9tZW1vcnlfZnJlZShhZGFwdGVyKTsKIH0KIAorCisKIC8qKgotICogZXQxMzF4X2NvbmZpZ19wYXJzZQorICogZXQxMzF4X2FkYXB0ZXJfaW5pdAogICogQGV0ZGV2OiBwb2ludGVyIHRvIHRoZSBwcml2YXRlIGFkYXB0ZXIgc3RydWN0CisgKiBAcGRldjogcG9pbnRlciB0byB0aGUgUENJIGRldmljZQogICoKLSAqIFBhcnNlcyBhIGNvbmZpZ3VyYXRpb24gZnJvbSBzb21lIGxvY2F0aW9uIChtb2R1bGUgcGFyYW1ldGVycywgZm9yIGV4YW1wbGUpCi0gKiBpbnRvIHRoZSBwcml2YXRlIGFkYXB0ZXIgc3RydWN0LiBUaGlzIHJlYWxseSBoYXMgbm8gc2Vuc2libGUgYW5hbG9neSBpbgotICogTGludXggYXMgc3lzZnMgcGFyYW1ldGVycyBhcmUgZHluYW1pYy4gU2V2ZXJhbCB0aGluZ3MgdGhhdCB3ZXJlIGhlZSBjb3VsZAotICogZ28gaW50byBzeXNmcywgYnV0IG90aGVyIHN0dWZmIGxpa2Ugc3BlZWQgaGFuZGxpbmcgaXMgcGFydCBvZiB0aGUgbWlpCi0gKiBpbnRlcmZhY2VzL2V0aHRvb2wuCisgKiBJbml0aWFsaXplIHRoZSBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoZSBldDEzMXhfYWRhcHRlciBvYmplY3QgYW5kIGxpbmsKKyAqIHRoZW0gdG9nZXRoZXIgd2l0aCB0aGUgcGxhdGZvcm0gcHJvdmlkZWQgZGV2aWNlIHN0cnVjdHVyZXMuCiAgKi8KLXZvaWQgZXQxMzF4X2NvbmZpZ19wYXJzZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQorCisKK3N0YXRpYyBzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0MTMxeF9hZGFwdGVyX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RhdGljIGNvbnN0IHU4IGRlZmF1bHRfbWFjW10gPSB7IDB4MDAsIDB4MDUsIDB4M2QsIDB4MDAsIDB4MDIsIDB4MDAgfTsKIAlzdGF0aWMgY29uc3QgdTggZHVwbGV4W10gPSB7IDAsIDEsIDIsIDEsIDIsIDIgfTsKIAlzdGF0aWMgY29uc3QgdTE2IHNwZWVkW10gPSB7IDAsIDEwLCAxMCwgMTAwLCAxMDAsIDEwMDAgfTsKIAorCXN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXY7CisKKwkvKiBTZXR1cCB0aGUgZnVuZGFtZW50YWwgbmV0X2RldmljZSBhbmQgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZSBlbGVtZW50cyAgKi8KKwlTRVRfTkVUREVWX0RFVihuZXRkZXYsICZwZGV2LT5kZXYpOworCisJLyogQWxsb2NhdGUgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdCBhbmQgY29weSBpbiByZWxldmFudCBpbmZvcm1hdGlvbiAqLworCWV0ZGV2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlldGRldi0+cGRldiA9IHBjaV9kZXZfZ2V0KHBkZXYpOworCWV0ZGV2LT5uZXRkZXYgPSBuZXRkZXY7CisKKwkvKiBEbyB0aGUgc2FtZSBmb3IgdGhlIG5ldGRldiBzdHJ1Y3QgKi8KKwluZXRkZXYtPmlycSA9IHBkZXYtPmlycTsKKwluZXRkZXYtPmJhc2VfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKworCS8qIEluaXRpYWxpemUgc3BpbmxvY2tzIGhlcmUgKi8KKwlzcGluX2xvY2tfaW5pdCgmZXRkZXYtPkxvY2spOworCXNwaW5fbG9ja19pbml0KCZldGRldi0+VENCU2VuZFFMb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZXRkZXYtPlRDQlJlYWR5UUxvY2spOworCXNwaW5fbG9ja19pbml0KCZldGRldi0+U2VuZEhXTG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmV0ZGV2LT5SY3ZMb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZXRkZXYtPlJjdlBlbmRMb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZXRkZXYtPkZickxvY2spOworCXNwaW5fbG9ja19pbml0KCZldGRldi0+UEhZTG9jayk7CisKKwkvKiBQYXJzZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgaW50byB0aGUgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdCAqLwogCWlmIChldDEzMXhfc3BlZWRfc2V0KQogCQlkZXZfaW5mbygmZXRkZXYtPnBkZXYtPmRldiwKIAkJCSJTcGVlZCBzZXQgbWFudWFsbHkgdG8gOiAlZCBcbiIsIGV0MTMxeF9zcGVlZF9zZXQpOwpAQCAtNjU1LDggKzU2OCw2IEBACiAJZXRkZXYtPlNwZWVkRHVwbGV4ID0gZXQxMzF4X3NwZWVkX3NldDsKIAlldGRldi0+UmVnaXN0cnlKdW1ib1BhY2tldCA9IDE1MTQ7CS8qIDE1MTQtOTIxNiAqLwogCi0JZXRkZXYtPlJlZ2lzdHJ5Tk1JRGlzYWJsZSA9IGV0MTMxeF9ubWlfZGlzYWJsZTsKLQogCS8qIFNldCB0aGUgTUFDIGFkZHJlc3MgdG8gYSBkZWZhdWx0ICovCiAJbWVtY3B5KGV0ZGV2LT5DdXJyZW50QWRkcmVzcywgZGVmYXVsdF9tYWMsIEVUSF9BTEVOKTsKIApAQCAtNjc0LDQwICs1ODUsMTAgQEAKIAogCWV0ZGV2LT5BaUZvcmNlU3BlZWQgPSBzcGVlZFtldGRldi0+U3BlZWREdXBsZXhdOwogCWV0ZGV2LT5BaUZvcmNlRHB4ID0gZHVwbGV4W2V0ZGV2LT5TcGVlZER1cGxleF07CS8qIEF1dG8gRkRYICovCisKKwlyZXR1cm4gZXRkZXY7CiB9CiAKLQotLyoqCi0gKiBldDEzMXhfcGNpX3JlbW92ZQotICogQHBkZXY6IGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKLSAqCi0gKiBSZWdpc3RlcmVkIGluIHRoZSBwY2lfZHJpdmVyIHN0cnVjdHVyZSwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUKLSAqIFBDSSBzdWJzeXN0ZW0gZGV0ZWN0cyB0aGF0IGEgUENJIGRldmljZSB3aGljaCBtYXRjaGVzIHRoZSBpbmZvcm1hdGlvbgotICogY29udGFpbmVkIGluIHRoZSBwY2lfZGV2aWNlX2lkIHRhYmxlIGhhcyBiZWVuIHJlbW92ZWQuCi0gKi8KLQotdm9pZCBfX2RldmV4aXQgZXQxMzF4X3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKLQlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXI7Ci0KLQkvKiBSZXRyaWV2ZSB0aGUgbmV0X2RldmljZSBwb2ludGVyIGZyb20gdGhlIHBjaV9kZXYgc3RydWN0LCBhcyB3ZWxsCi0JICogYXMgdGhlIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3QKLQkgKi8KLQluZXRkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCWFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JLyogUGVyZm9ybSBkZXZpY2UgY2xlYW51cCAqLwotCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7Ci0JZXQxMzF4X2FkYXB0ZXJfbWVtb3J5X2ZyZWUoYWRhcHRlcik7Ci0JaW91bm1hcChhZGFwdGVyLT5yZWdzKTsKLQlwY2lfZGV2X3B1dChhZGFwdGVyLT5wZGV2KTsKLQlmcmVlX25ldGRldihuZXRkZXYpOwotCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotfQotCi0KIC8qKgogICogZXQxMzF4X3BjaV9zZXR1cCAtIFBlcmZvcm0gZGV2aWNlIGluaXRpYWxpemF0aW9uCiAgKiBAcGRldjogYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQpAQCAtNzIxLDM0ICs2MDIsMzEgQEAKICAqIGEgZGV2aWNlIGluc2VydGlvbiByb3V0aW5lLgogICovCiAKLWludCBfX2RldmluaXQgZXQxMzF4X3BjaV9zZXR1cChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKK3N0YXRpYyBpbnQgX19kZXZpbml0IGV0MTMxeF9wY2lfc2V0dXAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKLQlpbnQgcmVzdWx0ID0gMDsKKwlpbnQgcmVzdWx0ID0gLUVCVVNZOwogCWludCBwbV9jYXA7CiAJYm9vbCBwY2lfdXNpbmdfZGFjOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBOVUxMOwotCXN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXI7CiAKIAkvKiBFbmFibGUgdGhlIGRldmljZSB2aWEgdGhlIFBDSSBzdWJzeXN0ZW0gKi8KLQlyZXN1bHQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKLQlpZiAocmVzdWx0ICE9IDApIHsKLQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSAhPSAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKIAkJCSJwY2lfZW5hYmxlX2RldmljZSgpIGZhaWxlZFxuIik7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAkvKiBQZXJmb3JtIHNvbWUgYmFzaWMgUENJIGNoZWNrcyAqLwogCWlmICghKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAwKSAmIElPUkVTT1VSQ0VfTUVNKSkgewotCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCWRldl9lcnIoJnBkZXYtPmRldiwKIAkJCSAgIkNhbid0IGZpbmQgUENJIGRldmljZSdzIGJhc2UgYWRkcmVzc1xuIik7Ci0JCXJlc3VsdCA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0OworCQlnb3RvIGVycl9kaXNhYmxlOwogCX0KIAotCXJlc3VsdCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJJVkVSX05BTUUpOwotCWlmIChyZXN1bHQgIT0gMCkgewotCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJJVkVSX05BTUUpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKIAkJCSJDYW4ndCBnZXQgUENJIHJlc291cmNlc1xuIik7CiAJCWdvdG8gZXJyX2Rpc2FibGU7CiAJfQpAQCAtNzYzLDI3ICs2NDEsMjYgQEAKIAkgKi8KIAlwbV9jYXAgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfUE0pOwogCWlmIChwbV9jYXAgPT0gMCkgewotCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCWRldl9lcnIoJnBkZXYtPmRldiwKIAkJCSAgIkNhbm5vdCBmaW5kIFBvd2VyIE1hbmFnZW1lbnQgY2FwYWJpbGl0aWVzXG4iKTsKIAkJcmVzdWx0ID0gLUVJTzsKIAkJZ290byBlcnJfcmVsZWFzZV9yZXM7CiAJfQogCiAJLyogQ2hlY2sgdGhlIERNQSBhZGRyZXNzaW5nIHN1cHBvcnQgb2YgdGhpcyBkZXZpY2UgKi8KLQlpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZmZmZmZmZmZmVUxMKSkgeworCWlmICghcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soNjQpKSkgewogCQlwY2lfdXNpbmdfZGFjID0gdHJ1ZTsKIAotCQlyZXN1bHQgPQotCQkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCk7CisJCXJlc3VsdCA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soNjQpKTsKIAkJaWYgKHJlc3VsdCAhPSAwKSB7CiAJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkJICAiVW5hYmxlIHRvIG9idGFpbiA2NCBiaXQgRE1BIGZvciBjb25zaXN0ZW50IGFsbG9jYXRpb25zXG4iKTsKIAkJCWdvdG8gZXJyX3JlbGVhc2VfcmVzOwogCQl9Ci0JfSBlbHNlIGlmICghcGNpX3NldF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmVUxMKSkgeworCX0gZWxzZSBpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSkpIHsKIAkJcGNpX3VzaW5nX2RhYyA9IGZhbHNlOwogCX0gZWxzZSB7Ci0JCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkJIk5vIHVzYWJsZSBETUEgYWRkcmVzc2luZyBtZXRob2RcbiIpOwogCQlyZXN1bHQgPSAtRUlPOwogCQlnb3RvIGVycl9yZWxlYXNlX3JlczsKQEAgLTc5Miw4NyArNjY5LDIyIEBACiAJLyogQWxsb2NhdGUgbmV0ZGV2IGFuZCBwcml2YXRlIGFkYXB0ZXIgc3RydWN0cyAqLwogCW5ldGRldiA9IGV0MTMxeF9kZXZpY2VfYWxsb2MoKTsKIAlpZiAobmV0ZGV2ID09IE5VTEwpIHsKLQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAotCQkJIkNvdWxkbid0IGFsbG9jIG5ldGRldiBzdHJ1Y3RcbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDb3VsZG4ndCBhbGxvYyBuZXRkZXYgc3RydWN0XG4iKTsKIAkJcmVzdWx0ID0gLUVOT01FTTsKIAkJZ290byBlcnJfcmVsZWFzZV9yZXM7CiAJfQotCi0JLyogU2V0dXAgdGhlIGZ1bmRhbWVudGFsIG5ldF9kZXZpY2UgYW5kIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUgZWxlbWVudHMgICovCi0JU0VUX05FVERFVl9ERVYobmV0ZGV2LCAmcGRldi0+ZGV2KTsKLQkvKgotCWlmIChwY2lfdXNpbmdfZGFjKSB7Ci0JCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOwotCX0KLQkqLwotCi0JLyoKLQkgKiBOT1RFIC0gVHVybiB0aGlzIG9uIHdoZW4gd2UncmUgcmVhZHkgdG8gZGVhbCB3aXRoIFNHLURNQQotCSAqCi0JICogTk9URTogQWNjb3JkaW5nIHRvICJMaW51eCBEZXZpY2UgRHJpdmVycyIsIDNyZCBlZCwgUnViaW5pIGV0IGFsLAotCSAqIGlmIGNoZWNrc3VtbWluZyBpcyBub3QgcGVyZm9ybWVkIGluIEhXLCB0aGVuIHRoZSBrZXJuZWwgd2lsbCBub3QKLQkgKiB1c2UgU0cuCi0JICogRnJvbSBwcCA1MTAtNTExOgotCSAqCi0JICogIk5vdGUgdGhhdCB0aGUga2VybmVsIGRvZXMgbm90IHBlcmZvcm0gc2NhdHRlci9nYXRoZXIgSS9PIHRvIHlvdXIKLQkgKiBkZXZpY2UgaWYgaXQgZG9lcyBub3QgYWxzbyBwcm92aWRlIHNvbWUgZm9ybSBvZiBjaGVja3N1bW1pbmcgYXMKLQkgKiB3ZWxsLiBUaGUgcmVhc29uIGlzIHRoYXQsIGlmIHRoZSBrZXJuZWwgaGFzIHRvIG1ha2UgYSBwYXNzIG92ZXIgYQotCSAqIGZyYWdtZW50ZWQgKCJub25saW5lYXIiKSBwYWNrZXQgdG8gY2FsY3VsYXRlIHRoZSBjaGVja3N1bSwgaXQKLQkgKiBtaWdodCBhcyB3ZWxsIGNvcHkgdGhlIGRhdGEgYW5kIGNvYWxlc2NlIHRoZSBwYWNrZXQgYXQgdGhlIHNhbWUKLQkgKiB0aW1lLiIKLQkgKgotCSAqIFRoaXMgaGFzIGJlZW4gdmVyaWZpZWQgYnkgc2V0dGluZyB0aGUgZmxhZ3MgYmVsb3cgYW5kIHN0aWxsIG5vdAotCSAqIHJlY2VpdmluZyBhIHNjYXR0ZXJlZCBidWZmZXIgZnJvbSB0aGUgbmV0d29yayBzdGFjaywgc28gbGVhdmUgaXQKLQkgKiBvZmYgdW50aWwgY2hlY2tzdW1zIGFyZSBjYWxjdWxhdGVkIGluIEhXLgotCSAqLwotCS8qIG5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9TRzsgKi8KLQkvKiBuZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfTk9fQ1NVTTsgKi8KLQkvKiBuZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfTExUWDsgKi8KLQotCS8qIEFsbG9jYXRlIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3QgYW5kIGNvcHkgaW4gcmVsZXZhbnQgaW5mb3JtYXRpb24gKi8KLQlhZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlhZGFwdGVyLT5wZGV2ID0gcGNpX2Rldl9nZXQocGRldik7Ci0JYWRhcHRlci0+bmV0ZGV2ID0gbmV0ZGV2OwotCi0JLyogRG8gdGhlIHNhbWUgZm9yIHRoZSBuZXRkZXYgc3RydWN0ICovCi0JbmV0ZGV2LT5pcnEgPSBwZGV2LT5pcnE7Ci0JbmV0ZGV2LT5iYXNlX2FkZHIgPSBwZGV2LT5yZXNvdXJjZVswXS5zdGFydDsKLQotCS8qIEluaXRpYWxpemUgc3BpbmxvY2tzIGhlcmUgKi8KLQlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+TG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPlRDQlNlbmRRTG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPlRDQlJlYWR5UUxvY2spOwotCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5TZW5kSFdMb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+U2VuZFdhaXRMb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+UmN2TG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPlJjdlBlbmRMb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+RmJyTG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPlBIWUxvY2spOwotCi0JLyogUGFyc2UgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGludG8gdGhlIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3QgKi8KLQlldDEzMXhfY29uZmlnX3BhcnNlKGFkYXB0ZXIpOwotCi0JLyogRmluZCB0aGUgcGh5c2ljYWwgYWRhcHRlcgotCSAqCi0JICogTk9URTogVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgTXBGaW5kQWRhcHRlcigpIHJvdXRpbmU7IGNhbiB3ZQotCSAqICAgICAgIGx1bXAgaXQncyBpbml0IHdpdGggdGhlIGRldmljZSBzcGVjaWZpYyBpbml0IGJlbG93IGludG8gYQotCSAqICAgICAgIHNpbmdsZSBpbml0IGZ1bmN0aW9uPwotCSAqLwotCS8qIHdoaWxlIChldDEzMXhfZmluZF9hZGFwdGVyKGFkYXB0ZXIsIHBkZXYpICE9IDApOyAqLwotCWV0MTMxeF9maW5kX2FkYXB0ZXIoYWRhcHRlciwgcGRldik7CisJYWRhcHRlciA9IGV0MTMxeF9hZGFwdGVyX2luaXQobmV0ZGV2LCBwZGV2KTsKKwkvKiBJbml0aWFsaXNlIHRoZSBQQ0kgc2V0dXAgZm9yIHRoZSBkZXZpY2UgKi8KKwlldDEzMXhfcGNpX2luaXQoYWRhcHRlciwgcGRldik7CiAKIAkvKiBNYXAgdGhlIGJ1cy1yZWxhdGl2ZSByZWdpc3RlcnMgdG8gc3lzdGVtIHZpcnR1YWwgbWVtb3J5ICovCi0KLQlhZGFwdGVyLT5yZWdzID0gaW9yZW1hcF9ub2NhY2hlKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwKLQkJCQkJICAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7CisJYWRhcHRlci0+cmVncyA9IHBjaV9pb3JlbWFwX2JhcihwZGV2LCAwKTsKIAlpZiAoYWRhcHRlci0+cmVncyA9PSBOVUxMKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBtYXAgZGV2aWNlIHJlZ2lzdGVyc1xuIik7CiAJCXJlc3VsdCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX2ZyZWVfZGV2OwogCX0KIAotCS8qIFBlcmZvcm0gZGV2aWNlLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGhlcmUgKFNlZSBjb2RlIGJlbG93KSAqLwotCiAJLyogSWYgUGh5IENPTUEgbW9kZSB3YXMgZW5hYmxlZCB3aGVuIHdlIHdlbnQgZG93biwgZGlzYWJsZSBpdCBoZXJlLiAqLwogCXdyaXRlbChFVF9QTUNTUl9JTklULCAgJmFkYXB0ZXItPnJlZ3MtPmdsb2JhbC5wbV9jc3IpOwogCkBAIC04OTIsMjAgKzcwNCwxMiBAQAogCS8qIEluaXQgc2VuZCBkYXRhIHN0cnVjdHVyZXMgKi8KIAlldDEzMXhfaW5pdF9zZW5kKGFkYXB0ZXIpOwogCi0JLyogUmVnaXN0ZXIgdGhlIGludGVycnVwdAotCSAqCi0JICogTk9URSAtIFRoaXMgaXMgYmVpbmcgZG9uZSBpbiB0aGUgb3BlbiByb3V0aW5lLCB3aGVyZSBtb3N0IG90aGVyCi0JICogICAgICAgICBMaW51eCBkcml2ZXJzIHNldHVwIElSUSBoYW5kbGVycy4gTWFrZSBzdXJlIGRldmljZQotCSAqICAgICAgICAgaW50ZXJydXB0cyBhcmUgbm90IHR1cm5lZCBvbiBiZWZvcmUgdGhlIElSUSBpcyByZWdpc3RlcmVkISEKLQkgKgotCSAqICAgICAgICAgV2hhdCB3ZSB3aWxsIGRvIGhlcmUgaXMgc2V0dXAgdGhlIHRhc2sgc3RydWN0dXJlIGZvciB0aGUKLQkgKiAgICAgICAgIElTUidzIGRlZmVycmVkIGhhbmRsZXIKKwkvKgorCSAqIFNldCB1cCB0aGUgdGFzayBzdHJ1Y3R1cmUgZm9yIHRoZSBJU1IncyBkZWZlcnJlZCBoYW5kbGVyCiAJICovCiAJSU5JVF9XT1JLKCZhZGFwdGVyLT50YXNrLCBldDEzMXhfaXNyX2hhbmRsZXIpOwogCi0JLyogRGV0ZXJtaW5lIE1BQyBBZGRyZXNzLCBhbmQgY29weSBpbnRvIHRoZSBuZXRfZGV2aWNlIHN0cnVjdCAqLwotCWV0MTMxeF9zZXR1cF9oYXJkd2FyZV9wcm9wZXJ0aWVzKGFkYXB0ZXIpOwotCisJLyogQ29weSBhZGRyZXNzIGludG8gdGhlIG5ldF9kZXZpY2Ugc3RydWN0ICovCiAJbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsIGFkYXB0ZXItPkN1cnJlbnRBZGRyZXNzLCBFVEhfQUxFTik7CiAKIAkvKiBTZXR1cCBldDEzMTAgYXMgcGVyIHRoZSBkb2N1bWVudGF0aW9uICovCkBAIC05NDQsMTAgKzc0OCw3IEBACiAJICogYmVlbiBpbml0aWFsaXplZCwganVzdCBpbiBjYXNlIGl0IG5lZWRzIHRvIGJlIHF1aWNrbHkgcmVzdG9yZWQuCiAJICovCiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIG5ldGRldik7Ci0KIAlwY2lfc2F2ZV9zdGF0ZShhZGFwdGVyLT5wZGV2KTsKLQotb3V0OgogCXJldHVybiByZXN1bHQ7CiAKIGVycl9tZW1fZnJlZToKQEAgLTk2MSw3ICs3NjIsMzcgQEAKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogZXJyX2Rpc2FibGU6CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCWdvdG8gb3V0OworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogZXQxMzF4X3BjaV9yZW1vdmUKKyAqIEBwZGV2OiBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCisgKgorICogUmVnaXN0ZXJlZCBpbiB0aGUgcGNpX2RyaXZlciBzdHJ1Y3R1cmUsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlCisgKiBQQ0kgc3Vic3lzdGVtIGRldGVjdHMgdGhhdCBhIFBDSSBkZXZpY2Ugd2hpY2ggbWF0Y2hlcyB0aGUgaW5mb3JtYXRpb24KKyAqIGNvbnRhaW5lZCBpbiB0aGUgcGNpX2RldmljZV9pZCB0YWJsZSBoYXMgYmVlbiByZW1vdmVkLgorICovCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBldDEzMXhfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcjsKKworCS8qIFJldHJpZXZlIHRoZSBuZXRfZGV2aWNlIHBvaW50ZXIgZnJvbSB0aGUgcGNpX2RldiBzdHJ1Y3QsIGFzIHdlbGwKKwkgKiBhcyB0aGUgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdAorCSAqLworCW5ldGRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwkvKiBQZXJmb3JtIGRldmljZSBjbGVhbnVwICovCisJdW5yZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKKwlldDEzMXhfYWRhcHRlcl9tZW1vcnlfZnJlZShhZGFwdGVyKTsKKwlpb3VubWFwKGFkYXB0ZXItPnJlZ3MpOworCXBjaV9kZXZfcHV0KGFkYXB0ZXItPnBkZXYpOworCWZyZWVfbmV0ZGV2KG5ldGRldik7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBldDEzMXhfcGNpX3RhYmxlW10gX19kZXZpbml0ZGF0YSA9IHsKQEAgLTk4OSw3ICs4MjAsNyBAQAogICoKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvbiBmYWlsdXJlIChhcyBkZWZpbmVkIGluIGVycm5vLmgpCiAgKi8KLXN0YXRpYyBpbnQgZXQxMzF4X2luaXRfbW9kdWxlKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBldDEzMXhfaW5pdF9tb2R1bGUodm9pZCkKIHsKIAlpZiAoZXQxMzF4X3NwZWVkX3NldCA8IFBBUk1fU1BFRURfRFVQTEVYX01JTiB8fAogCSAgICBldDEzMXhfc3BlZWRfc2V0ID4gUEFSTV9TUEVFRF9EVVBMRVhfTUFYKSB7CkBAIC0xMDAyLDcgKzgzMyw3IEBACiAvKioKICAqIGV0MTMxeF9jbGVhbnVwX21vZHVsZSAtIFRoZSBlbnRyeSBwb2ludCBjYWxsZWQgb24gZHJpdmVyIGNsZWFudXAKICAqLwotc3RhdGljIHZvaWQgZXQxMzF4X2NsZWFudXBfbW9kdWxlKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgZXQxMzF4X2NsZWFudXBfbW9kdWxlKHZvaWQpCiB7CiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZldDEzMXhfZHJpdmVyKTsKIH0KQEAgLTEwMTAsNyArODQxLDYgQEAKIG1vZHVsZV9pbml0KGV0MTMxeF9pbml0X21vZHVsZSk7CiBtb2R1bGVfZXhpdChldDEzMXhfY2xlYW51cF9tb2R1bGUpOwogCi0KIC8qIE1vZGluZm8gcGFyYW1ldGVycyAoZmlsbGVkIG91dCB1c2luZyBkZWZpbmVzIGZyb20gZXQxMzF4X3ZlcnNpb24uaCkgKi8KIE1PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CiBNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0lORk8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfaW5pdHBjaS5oIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfaW5pdHBjaS5oCmluZGV4IDgxMzFkNmEuLjcyNjk1NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2luaXRwY2kuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9pbml0cGNpLmgKQEAgLTY3LDcgKzY3LDcgQEAKIGludCBldDEzMXhfYWRhcHRlcl9zZXR1cChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwogaW50IGV0MTMxeF9hZGFwdGVyX21lbW9yeV9hbGxvYyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwogdm9pZCBldDEzMXhfYWRhcHRlcl9tZW1vcnlfZnJlZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwotdm9pZCBldDEzMXhfc2V0dXBfaGFyZHdhcmVfcHJvcGVydGllcyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwordm9pZCBldDEzMXhfaHdhZGRyX2luaXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKIHZvaWQgZXQxMzF4X3NvZnRfcmVzZXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKIAogI2VuZGlmIC8qIF9fRVQxMzFYX0lOSVRQQ0lfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9pc3IuYyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2lzci5jCmluZGV4IGY4MDE4OWQuLmY2ZDQ1MmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2lzci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2lzci5jCkBAIC0xMDksOSArMTA5LDYgQEAKIAllbHNlCiAJCW1hc2sgPSBJTlRfTUFTS19FTkFCTEVfTk9fRkxPVzsKIAotCWlmIChhZGFwdGVyLT5Ecml2ZXJOb1BoeUFjY2VzcykKLQkJbWFzayB8PSBFVF9JTlRSX1BIWTsKLQogCWFkYXB0ZXItPkNhY2hlZE1hc2tWYWx1ZSA9IG1hc2s7CiAJd3JpdGVsKG1hc2ssICZhZGFwdGVyLT5yZWdzLT5nbG9iYWwuaW50X21hc2spOwogfQpAQCAtMTgyLDE1ICsxNzksMTUgQEAKIAkvKiBUaGlzIGlzIG91ciBpbnRlcnJ1cHQsIHNvIHByb2Nlc3MgYWNjb3JkaW5nbHkgKi8KIAogCWlmIChzdGF0dXMgJiBFVF9JTlRSX1dBVENIRE9HKSB7Ci0JCVBNUF9UQ0IgcE1wVGNiID0gYWRhcHRlci0+VHhSaW5nLkN1cnJTZW5kSGVhZDsKKwkJc3RydWN0IHRjYiAqdGNiID0gYWRhcHRlci0+dHhfcmluZy5zZW5kX2hlYWQ7CiAKLQkJaWYgKHBNcFRjYikKLQkJCWlmICgrK3BNcFRjYi0+UGFja2V0U3RhbGVDb3VudCA+IDEpCisJCWlmICh0Y2IpCisJCQlpZiAoKyt0Y2ItPnN0YWxlID4gMSkKIAkJCQlzdGF0dXMgfD0gRVRfSU5UUl9UWERNQV9JU1I7CiAKIAkJaWYgKGFkYXB0ZXItPlJ4UmluZy5VbmZpbmlzaGVkUmVjZWl2ZXMpCiAJCQlzdGF0dXMgfD0gRVRfSU5UUl9SWERNQV9YRlJfRE9ORTsKLQkJZWxzZSBpZiAocE1wVGNiID09IE5VTEwpCisJCWVsc2UgaWYgKHRjYiA9PSBOVUxMKQogCQkJd3JpdGVsKDAsICZhZGFwdGVyLT5yZWdzLT5nbG9iYWwud2F0Y2hkb2dfdGltZXIpOwogCiAJCXN0YXR1cyAmPSB+RVRfSU5UUl9XQVRDSERPRzsKQEAgLTI5MCwxNyArMjg3LDEyIEBACiAJCQkJdTMyIHBtX2NzcjsKIAogCQkJCS8qIFRlbGwgdGhlIGRldmljZSB0byBzZW5kIGEgcGF1c2UgcGFja2V0IHZpYQotCQkJCSAqIHRoZSBiYWNrIHByZXNzdXJlIHJlZ2lzdGVyCisJCQkJICogdGhlIGJhY2sgcHJlc3N1cmUgcmVnaXN0ZXIgKGJwIHJlcSAgYW5kCisJCQkJICogYnAgeG9uL3hvZmYpCiAJCQkJICovCiAJCQkJcG1fY3NyID0gcmVhZGwoJmlvbWVtLT5nbG9iYWwucG1fY3NyKTsKLQkJCQlpZiAoKHBtX2NzciAmIEVUX1BNX1BIWV9TV19DT01BKSA9PSAwKSB7Ci0JCQkJCVRYTUFDX0JQX0NUUkxfdCBicF9jdHJsID0geyAwIH07Ci0KLQkJCQkJYnBfY3RybC5iaXRzLmJwX3JlcSA9IDE7Ci0JCQkJCWJwX2N0cmwuYml0cy5icF94b254b2ZmID0gMTsKLQkJCQkJd3JpdGVsKGJwX2N0cmwudmFsdWUsCi0JCQkJCSAgICAgICAmaW9tZW0tPnR4bWFjLmJwX2N0cmwudmFsdWUpOwotCQkJCX0KKwkJCQlpZiAoKHBtX2NzciAmIEVUX1BNX1BIWV9TV19DT01BKSA9PSAwKQorCQkJCQl3cml0ZWwoMywgJmlvbWVtLT50eG1hYy5icF9jdHJsKTsKIAkJCX0KIAkJfQogCkBAIC0zNDAsMTEgKzMzMiw5IEBACiAJCQkgKi8KIAkJCS8qIFRSQVAoKTsqLwogCi0JCQlldGRldi0+VHhNYWNUZXN0LnZhbHVlID0KLQkJCQlyZWFkbCgmaW9tZW0tPnR4bWFjLnR4X3Rlc3QudmFsdWUpOwogCQkJZGV2X3dhcm4oJmV0ZGV2LT5wZGV2LT5kZXYsCiAJCQkJICAgICJSeERNQV9FUlIgaW50ZXJydXB0LCBlcnJvciAleFxuIiwKLQkJCQkgICAgZXRkZXYtPlR4TWFjVGVzdC52YWx1ZSk7CisJCQkJICAgIHJlYWRsKCZpb21lbS0+dHhtYWMudHhfdGVzdCkpOwogCQl9CiAKIAkJLyogSGFuZGxlIHRoZSBXYWtlIG9uIExBTiBFdmVudCAqLwpAQCAtNDAwLDggKzM5MCw3IEBACiAKIAkJLyogTGV0J3MgbW92ZSBvbiB0byB0aGUgVHhNYWMgKi8KIAkJaWYgKHN0YXR1cyAmIEVUX0lOVFJfVFhNQUMpIHsKLQkJCWV0ZGV2LT5UeFJpbmcuVHhNYWNFcnIudmFsdWUgPQotCQkJCXJlYWRsKCZpb21lbS0+dHhtYWMuZXJyLnZhbHVlKTsKKwkJCXUzMiBlcnIgPSByZWFkbCgmaW9tZW0tPnR4bWFjLmVyci52YWx1ZSk7CiAKIAkJCS8qCiAJCQkgKiBXaGVuIGFueSBvZiB0aGUgZXJyb3JzIG9jY3VyIGFuZCBUWE1BQyBnZW5lcmF0ZXMKQEAgLTQxNSw3ICs0MDQsNyBAQAogCQkJICovCiAJCQlkZXZfd2FybigmZXRkZXYtPnBkZXYtPmRldiwKIAkJCQkgICAgIlRYTUFDIGludGVycnVwdCwgZXJyb3IgMHglMDh4XG4iLAotCQkJCSAgICBldGRldi0+VHhSaW5nLlR4TWFjRXJyLnZhbHVlKTsKKwkJCQkgICAgZXJyKTsKIAogCQkJLyogSWYgd2UgYXJlIGRlYnVnZ2luZywgd2Ugd2FudCB0byBzZWUgdGhpcyBlcnJvciwKIAkJCSAqIG90aGVyd2lzZSB3ZSBqdXN0IHdhbnQgdGhlIGRldmljZSB0byBiZSByZXNldCBhbmQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X25ldGRldi5jIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfbmV0ZGV2LmMKaW5kZXggOGM3NjEyZi4uMjRkOTdiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfbmV0ZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfbmV0ZGV2LmMKQEAgLTUxOSw3ICs1MTksNyBAQAogdm9pZCBldDEzMXhfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCXN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCVBNUF9UQ0IgcE1wVGNiOworCXN0cnVjdCB0Y2IgKnRjYjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogSnVzdCBza2lwIHRoaXMgcGFydCBpZiB0aGUgYWRhcHRlciBpcyBkb2luZyBsaW5rIGRldGVjdGlvbiAqLwpAQCAtNTQxLDI4ICs1NDEsMTkgQEAKIAkvKiBJcyBzZW5kIHN0dWNrPyAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZldGRldi0+VENCU2VuZFFMb2NrLCBmbGFncyk7CiAKLQlwTXBUY2IgPSBldGRldi0+VHhSaW5nLkN1cnJTZW5kSGVhZDsKKwl0Y2IgPSBldGRldi0+dHhfcmluZy5zZW5kX2hlYWQ7CiAKLQlpZiAocE1wVGNiICE9IE5VTEwpIHsKLQkJcE1wVGNiLT5Db3VudCsrOworCWlmICh0Y2IgIT0gTlVMTCkgeworCQl0Y2ItPmNvdW50Kys7CiAKLQkJaWYgKHBNcFRjYi0+Q291bnQgPiBOSUNfU0VORF9IQU5HX1RIUkVTSE9MRCkgewotCQkJVFhfREVTQ19FTlRSWV90IFN0dWNrRGVzY3JpcHRvcnNbMTBdOwotCi0JCQlpZiAoSU5ERVgxMChwTXBUY2ItPldySW5kZXgpID4gNykgewotCQkJCW1lbWNweShTdHVja0Rlc2NyaXB0b3JzLAotCQkJCSAgICAgICBldGRldi0+VHhSaW5nLnBUeERlc2NSaW5nVmEgKwotCQkJCSAgICAgICBJTkRFWDEwKHBNcFRjYi0+V3JJbmRleCkgLSA2LAotCQkJCSAgICAgICBzaXplb2YoVFhfREVTQ19FTlRSWV90KSAqIDEwKTsKLQkJCX0KLQorCQlpZiAodGNiLT5jb3VudCA+IE5JQ19TRU5EX0hBTkdfVEhSRVNIT0xEKSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+VENCU2VuZFFMb2NrLAogCQkJCQkgICAgICAgZmxhZ3MpOwogCiAJCQlkZXZfd2FybigmZXRkZXYtPnBkZXYtPmRldiwKLQkJCQkiU2VuZCBzdHVjayAtIHJlc2V0LiAgcE1wVGNiLT5XckluZGV4ICV4LCBGbGFncyAweCUwOHhcbiIsCi0JCQkJcE1wVGNiLT5XckluZGV4LAotCQkJCXBNcFRjYi0+RmxhZ3MpOworCQkJCSJTZW5kIHN0dWNrIC0gcmVzZXQuICB0Y2ItPldySW5kZXggJXgsIEZsYWdzIDB4JTA4eFxuIiwKKwkJCQl0Y2ItPmluZGV4LAorCQkJCXRjYi0+ZmxhZ3MpOwogCiAJCQlldDEzMXhfY2xvc2UobmV0ZGV2KTsKIAkJCWV0MTMxeF9vcGVuKG5ldGRldik7CkBAIC02MjIsNyArNjEzLDcgQEAKIAogCWV0MTMxeF9pbml0X3NlbmQoYWRhcHRlcik7CiAKLQlldDEzMXhfc2V0dXBfaGFyZHdhcmVfcHJvcGVydGllcyhhZGFwdGVyKTsKKwlldDEzMXhfaHdhZGRyX2luaXQoYWRhcHRlcik7CiAJbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsIGFkYXB0ZXItPkN1cnJlbnRBZGRyZXNzLCBFVEhfQUxFTik7CiAKIAkvKiBJbml0IHRoZSBkZXZpY2Ugd2l0aCB0aGUgbmV3IHNldHRpbmdzICovCkBAIC03MDksOSArNzAwLDcgQEAKIAogCWV0MTMxeF9pbml0X3NlbmQoYWRhcHRlcik7CiAKLQlldDEzMXhfc2V0dXBfaGFyZHdhcmVfcHJvcGVydGllcyhhZGFwdGVyKTsKLQkvKiBtZW1jcHkoIG5ldGRldi0+ZGV2X2FkZHIsIGFkYXB0ZXItPkN1cnJlbnRBZGRyZXNzLCBFVEhfQUxFTiApOyAqLwotCS8qIGJsdXg6IG5vLCBkbyBub3Qgb3ZlcnJpZGUgb3VyIG5pY2UgYWRkcmVzcyAqLworCWV0MTMxeF9od2FkZHJfaW5pdChhZGFwdGVyKTsKIAogCS8qIEluaXQgdGhlIGRldmljZSB3aXRoIHRoZSBuZXcgc2V0dGluZ3MgKi8KIAlldDEzMXhfYWRhcHRlcl9zZXR1cChhZGFwdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9odl9hcGkuaCBiL2RyaXZlcnMvc3RhZ2luZy9odi9odl9hcGkuaAppbmRleCAyNTFlMmQxLi45ZWI4MThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvaHZfYXBpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L2h2X2FwaS5oCkBAIC0zMTYsMTMgKzMxNiwxMyBAQAogCiAvKgogICogSFZfU1RBVFVTX1ZNWF9JTlNUUlVDVElPTl9GQUlMRUQKLSAqIFRoZSByZXF1ZXN0ZWQgVk1YIGluc3RydWN0aW9uIGZhaWxlZCB0byBjb21wbGV0ZSBzdWNjZXNmdWxseS4KKyAqIFRoZSByZXF1ZXN0ZWQgVk1YIGluc3RydWN0aW9uIGZhaWxlZCB0byBjb21wbGV0ZSBzdWNjZXNzZnVsbHkuCiAgKi8KICNkZWZpbmUgSFZfU1RBVFVTX1ZNWF9JTlNUUlVDVElPTl9GQUlMRUQJCSgodTE2KTB4MTAxMSkKIAogLyoKICAqIEhWX1NUQVRVU19WTVhfSU5TVFJVQ1RJT05fRkFJTEVEX1dJVEhfU1RBVFVTCi0gKiBUaGUgcmVxdWVzdGVkIFZNWCBpbnN0cnVjdGlvbiBmYWlsZWQgdG8gY29tcGxldGUgc3VjY2VzZnVsbHkgaW5kaWNhdGluZworICogVGhlIHJlcXVlc3RlZCBWTVggaW5zdHJ1Y3Rpb24gZmFpbGVkIHRvIGNvbXBsZXRlIHN1Y2Nlc3NmdWxseSBpbmRpY2F0aW5nCiAgKiBzdGF0dXMuCiAgKi8KICNkZWZpbmUgSFZfU1RBVFVTX1ZNWF9JTlNUUlVDVElPTl9GQUlMRURfV0lUSF9TVEFUVVMJKCh1MTYpMHgxMDEyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL2RldmljZS50eHQgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vZGV2aWNlLnR4dAppbmRleCA2OTE2Y2QzLi42OWQ5NTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vZGV2aWNlLnR4dAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vZGV2aWNlLnR4dApAQCAtMTAsNyArMTAsNyBAQAogCiBzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOwogCi1UaGUgZmlsbCBpbiB0aGUgZm9sbG93aW5nLgorVGhlbiBmaWxsIGluIHRoZSBmb2xsb3dpbmc6CiAKIGluZGlvX2Rldi0+ZGV2LnBhcmVudAogICB0aGUgc3RydWN0IGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIHVuZGVybHlpbmcgaGFyZHdhcmUuCkBAIC00NSw1ICs0NSw1IEBACiBiZSByZWdpc3RlcmVkIGFmdGVyd2FyZHMgKG90aGVyd2lzZSB0aGUgd2hvbGUgcGFyZW50YWdlIG9mIGRldmljZXMKIGdldHMgY29uZnVzZWQpCiAKLU9uIHJlbW92ZSBpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KSB3aWxsIHJlbW92ZSB0aGUgZGV2aWNlIGZyb20KK09uIHJlbW92ZSwgaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldikgd2lsbCByZW1vdmUgdGhlIGRldmljZSBmcm9tCiB0aGUgY29yZSwgYW5kIGlpb19mcmVlX2RldmljZSB3aWxsIGNsZWFuIHVwLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL292ZXJ2aWV3LnR4dCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9vdmVydmlldy50eHQKaW5kZXggNjQ1ODRhZC4uZTM5ZGZjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL292ZXJ2aWV3LnR4dAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vb3ZlcnZpZXcudHh0CkBAIC0yNCwxMSArMjQsMTIgQEAKICogRXZlbnQgY2hyZGV2cy4gIFRoZXNlIGFyZSBzaW1pbGFyIHRvIGlucHV0IGluIHRoYXQgdGhleSBwcm92aWRlIGEKIHJvdXRlIHRvIHVzZXIgc3BhY2UgZm9yIGhhcmR3YXJlIHRyaWdnZXJlZCBldmVudHMuIFN1Y2ggZXZlbnRzIGluY2x1ZGUKIHRocmVzaG9sZCBkZXRlY3RvcnMsIGZyZWUtZmFsbCBkZXRlY3RvcnMgYW5kIG1vcmUgY29tcGxleCBhY3Rpb24KLWRldGVjdGlvbi4gIFRoZXkgZXZlbnRzIHRoZW1zZWx2ZXMgYXJlIGN1cnJlbnRseSB2ZXJ5IHNpbXBsZSB3aXRoCitkZXRlY3Rpb24uICBUaGUgZXZlbnRzIHRoZW1zZWx2ZXMgYXJlIGN1cnJlbnRseSB2ZXJ5IHNpbXBsZSB3aXRoCiBtZXJlbHkgYW4gZXZlbnQgY29kZSBhbmQgYSB0aW1lc3RhbXAuICBBbnkgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlCi1ldmVudCBtdXN0IGJlIGFjY2Vzc2VkIHZpYSBwb2xsaW5nLiBOb3RlIGEgZ2l2ZW4gZGV2aWNlIG1heSBoYXZlIG9uZQotb3IgbW9yZSBldmVudCBjaGFubmVsLiAgVGhlc2UgZXZlbnRzIGFyZSB0dXJuZWQgb24gb3Igb2ZmIChpZiBwb3NzaWJsZSkKLXZpYSBzeXNmcyBpbnRlcmZhY2VzLgorZXZlbnQgbXVzdCBiZSBhY2Nlc3NlZCB2aWEgcG9sbGluZy4KKworTm90ZTogQSBnaXZlbiBkZXZpY2UgbWF5IGhhdmUgb25lIG9yIG1vcmUgZXZlbnQgY2hhbm5lbC4gIFRoZXNlIGV2ZW50cyBhcmUKK3R1cm5lZCBvbiBvciBvZmYgKGlmIHBvc3NpYmxlKSB2aWEgc3lzZnMgaW50ZXJmYWNlcy4KIAogKiBIYXJkd2FyZSByaW5nIGJ1ZmZlciBzdXBwb3J0LiAgU29tZSByZWNlbnQgc2Vuc29ycyBoYXZlIGluY2x1ZGVkCiBmaWZvIC8gcmluZyBidWZmZXJzIG9uIHRoZSBzZW5zb3IgY2hpcC4gIFRoZXNlIGdyZWF0bHkgcmVkdWNlIHRoZSBsb2FkCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL0tjb25maWcKaW5kZXggNDU4NjY1MC4uYWNlOTlmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vS2NvbmZpZwpAQCAtOCw3ICs4LDcgQEAKIAktLS1oZWxwLS0tCiAJICBUaGUgaW5kdXN0cmlhbCBJL08gc3Vic3lzdGVtIHByb3ZpZGVzIGEgdW5pZmllZCBmcmFtZXdvcmsgZm9yCiAJICBkcml2ZXJzIGZvciBtYW55IGRpZmZlcmVudCB0eXBlcyBvZiBlbWJlZGRlZCBzZW5zb3JzIHVzaW5nIGEKLQkgIG51bWJlciBvZiBkaWZmZXJlbnQgcGh5c2ljYWwgaW50ZXJmYWNlcyAoaTJjLCBzcGkgZXRjKS4gU2VlCisJICBudW1iZXIgb2YgZGlmZmVyZW50IHBoeXNpY2FsIGludGVyZmFjZXMgKGkyYywgc3BpLCBldGMpLiBTZWUKIAkgIERvY3VtZW50YXRpb24vaW5kdXN0cmlhbGlvIGZvciBtb3JlIGluZm9ybWF0aW9uLgogaWYgSUlPCiAKQEAgLTIzLDEwICsyMywxMCBAQAogY29uZmlnIElJT19TV19SSU5HCiAJdHJpc3RhdGUgIkluZHVzdHJpYWwgSS9PIGxvY2sgZnJlZSBzb2Z0d2FyZSByaW5nIgogCWhlbHAKLQlleGFtcGxlIHNvZnR3YXJlIHJpbmcgYnVmZmVyIGltcGxlbWVudGF0aW9uLiAgVGhlIGRlc2lnbiBhaW0KLQlvZiB0aGlzIHBhcnRpY3VsYXIgcmVhbGl6YXRpb24gd2FzIHRvIG1pbml6ZSB3cml0ZSBsb2NraW5nCi0Jd2l0aCB0aGUgaW50ZW50aW9uIHRoYXQgc29tZSBkZXZpY2VzIHdvdWxkIGJlIGFibGUgdG8gd3JpdGUKLQlpbiBpbnRlcnJ1cHQgY29udGV4dC4KKwkgIEV4YW1wbGUgc29mdHdhcmUgcmluZyBidWZmZXIgaW1wbGVtZW50YXRpb24uICBUaGUgZGVzaWduIGFpbQorCSAgb2YgdGhpcyBwYXJ0aWN1bGFyIHJlYWxpemF0aW9uIHdhcyB0byBtaW5pbWl6ZSB3cml0ZSBsb2NraW5nCisJICB3aXRoIHRoZSBpbnRlbnRpb24gdGhhdCBzb21lIGRldmljZXMgd291bGQgYmUgYWJsZSB0byB3cml0ZQorCSAgaW4gaW50ZXJydXB0IGNvbnRleHQuCiAKIGVuZGlmICMgSUlPX1JJTkdCVUZGRVIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9LY29uZmlnCmluZGV4IGZlZjNkYTQuLjNkM2MzMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL0tjb25maWcKQEAgLTEzLDYgKzEzLDggQEAKIGNvbmZpZyBMSVMzTDAyRFEKIAl0cmlzdGF0ZSAiU1QgTWljcm9lbGVjdHJvbmljcyBMSVMzTDAyRFEgQWNjZWxlcm9tZXRlciBEcml2ZXIiCiAJZGVwZW5kcyBvbiBTUEkKKwlzZWxlY3QgSUlPX1RSSUdHRVIgaWYgSUlPX1JJTkdfQlVGRkVSCisJc2VsZWN0IElJT19TV19SSU5HIGlmIElJT19SSU5HX0JVRkZFUgogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBTUEkgc3VwcG9ydCBmb3IgdGhlIFNUIG1pY3JvZWxlY3Ryb25pY3MKIAkgIGFjY2VsZXJvbWV0ZXIuIFRoZSBkcml2ZXIgc3VwcGxpZXMgZGlyZWN0IGFjY2VzcyB2aWEgc3lzZnMgZmlsZXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWNjZWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWNjZWwuaAppbmRleCA4MTFmYTA1Li5kN2ZjN2Y5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FjY2VsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hY2NlbC5oCkBAIC0zMSwxMyArMzEsMTMgQEAKIAlJSU9fREVWSUNFX0FUVFIoYWNjZWxfeiwgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQogCiAvKiBUaHJlc2hvbGRzIGFyZSBzb21ld2hhdCBjaGlwIGRlcGVuZGVudCAtIG1heSBuZWVkIHF1aXRlIGEgZmV3IGRlZnMgaGVyZSAqLwotLyogRm9yIHVuaWZpZWQgdGhlc2hvbGRzIChzaGFyZWQgYWNyb3NzIGFsbCBkaXJlY3Rpb25zICovCisvKiBGb3IgdW5pZmllZCB0aHJlc2hvbGRzIChzaGFyZWQgYWNyb3NzIGFsbCBkaXJlY3Rpb25zICovCiAKIC8qKgogICogSUlPX0RFVl9BVFRSX0FDQ0VMX1RIUkVTSDogdW5pZmllZCB0aHJlc2hvbGQKICAqIEBfbW9kZTogcmVhZC93cml0ZQogICogQF9zaG93OiByZWFkIGRldGVjdG9yIHRocmVzaG9sZCB2YWx1ZQotICogQF9zdG9yZTogd3JpdGUgZGV0ZWN0b3IgdGhlc2hvbGQgdmFsdWUKKyAqIEBfc3RvcmU6IHdyaXRlIGRldGVjdG9yIHRocmVzaG9sZCB2YWx1ZQogICogQF9hZGRyOiBkcml2ZXIgc3BlY2lmaWMgZGF0YSwgdHlwaWNhbGx5IGEgcmVnaXN0ZXIgYWRkcmVzcwogICoKICAqIFRoaXMgb25lIGlzIGZvciBjYXNlcyB3aGVyZSBhcyBzaW5nbGUgdGhyZXNob2xkIGNvdmVycyBhbGwgZGlyZWN0aW9ucwpAQCAtNDgsNyArNDgsNyBAQAogLyoqCiAgKiBJSU9fREVWX0FUVFJfQUNDRUxfVEhSRVNIX1g6IGluZGVwZW5kYW50IGRpcmVjdGlvbiB0aHJlc2hvbGQsIHggYXhpcwogICogQF9tb2RlOiByZWFkYWJsZSAvIHdyaXRhYmxlCi0gKiBAX3Nob3c6IHJlYWQgeCBheGlzIGRldGVjdG9yIHRoZXNob2xkIHZhbHVlCisgKiBAX3Nob3c6IHJlYWQgeCBheGlzIGRldGVjdG9yIHRocmVzaG9sZCB2YWx1ZQogICogQF9zdG9yZTogd3JpdGUgeCBheGlzIGRldGVjdG9yIHRocmVzaG9sZCB2YWx1ZQogICogQF9hZGRyOiBkZXZpY2UgZHJpdmVyIGRlcGVuZGFudCwgdHlwaWNhbGx5IGEgcmVnaXN0ZXIgYWRkcmVzcwogICoqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDAuaAppbmRleCAyOWUxMWRhLi5kYTdkM2NiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDAuaApAQCAtNzQsNyArNzQsNyBAQAogI2RlZmluZSBTQ0EzMDAwX01FQVNfTU9ERV9PUF8yCQkJMHgwMgogCiAvKiBJbiBtb3Rpb24gZGV0ZWN0aW9uIG1vZGUgdGhlIGFjY2VsZXJhdGlvbnMgYXJlIGJhbmQgcGFzcyBmaWx0ZXJlZAotICogKGFwcm94IDEgLSAyNUh6KSBhbmQgdGhlbiBhIHByb2dyYW1tYWJsZSB0aGVzaG9sZCB1c2VkIHRvIHRyaWdnZXIKKyAqIChhcHJveCAxIC0gMjVIeikgYW5kIHRoZW4gYSBwcm9ncmFtbWFibGUgdGhyZXNob2xkIHVzZWQgdG8gdHJpZ2dlcgogICogYW5kIGludGVycnVwdC4KICAqLwogI2RlZmluZSBTQ0EzMDAwX01FQVNfTU9ERV9NT1RfREVUCQkweDAzCkBAIC0xMzksNyArMTM5LDcgQEAKIC8qIFZhbHVlcyBvZiBtdWxpcGV4ZWQgcmVnaXN0ZXJzICh3cml0ZSB0byBjdHJsX2RhdGEgYWZ0ZXIgc2VsZWN0KSAqLwogI2RlZmluZSBTQ0EzMDAwX1JFR19BRERSX0NUUkxfREFUQQkJMHgyMgogCi0vKiBNZWFzdXJtZW50IG1vZGVzIGF2YWlsYWJsZSBvbiBzb21lIHNjYTMwMDAgc2VyaWVzIGNoaXBzLiBDb2RlIGFzc3VtZXMgb3RoZXJzCisvKiBNZWFzdXJlbWVudCBtb2RlcyBhdmFpbGFibGUgb24gc29tZSBzY2EzMDAwIHNlcmllcyBjaGlwcy4gQ29kZSBhc3N1bWVzIG90aGVycwogICogbWF5IGJlY29tZSBhdmFpbGFibGUgaW4gdGhlIGZ1dHVyZS4KICAqCiAgKiBCeXBhc3MgLSBCeXBhc3MgdGhlIGxvdy1wYXNzIGZpbHRlciBpbiB0aGUgc2lnbmFsIGNoYW5uZWwgc28gYXMgdG8gaW5jcmVhc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMF9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDBfY29yZS5jCmluZGV4IGUyN2UzYjdkMS4uY2VkY2FhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDBfY29yZS5jCkBAIC03MjAsNyArNzIwLDcgQEAKIHN0YXRpYyBJSU9fREVWX0FUVFJfVEVNUChzY2EzMDAwX3JlYWRfdGVtcCk7CiAKIC8qKgotICogc2NhMzAwMF9zaG93X3RocmVzaCgpIHN5c2ZzIHF1ZXJ5IG9mIGEgdGhlc2hvbGQKKyAqIHNjYTMwMDBfc2hvd190aHJlc2goKSBzeXNmcyBxdWVyeSBvZiBhIHRocmVzaG9sZAogICoqLwogc3RhdGljIHNzaXplX3Qgc2NhMzAwMF9zaG93X3RocmVzaChzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvS2NvbmZpZwppbmRleCBiOGMyODU4Li4zOTg5YzBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL0tjb25maWcKQEAgLTYsOCArNiwxOCBAQAogY29uZmlnIE1BWDEzNjMKIAl0cmlzdGF0ZSAiTUFYSU0gbWF4MTM2MyBBREMgZHJpdmVyIgogCWRlcGVuZHMgb24gSTJDCisJc2VsZWN0IElJT19UUklHR0VSIGlmIElJT19SSU5HX0JVRkZFUgogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBtYW55IE1BWElNIGkyYyBhbmFsb2cgdG8gZGlnaXRhbAogCSAgY29udmVydG9ycyAoQURDKS4gKG1heDEzNjEsIG1heDEzNjIsIG1heDEzNjMsIG1heDEzNjQsIG1heDExMzYsCiAJICBtYXgxMTM2LCBtYXgxMTM3LCBtYXgxMTM4LCBtYXgxMTM5LCBtYXgxMjM2LCBtYXgxMjM3LCBtYXgxMTIzOCwKIAkgIG1heDEyMzkpIFByb3ZpZGVzIGRpcmVjdCBhY2Nlc3MgdmlhIHN5c2ZzLgorCitjb25maWcgTUFYMTM2M19SSU5HX0JVRkZFUgorCWJvb2wgIk1BWElNIG1heDEzNjM6IHVzZSByaW5nIGJ1ZmZlciIKKwlkZXBlbmRzIG9uIE1BWDEzNjMKKwlzZWxlY3QgSUlPX1JJTkdfQlVGRkVSCisJc2VsZWN0IElJT19TV19SSU5HCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGluY2x1ZGUgcmluZyBidWZmZXIgc3VwcG9ydCBpbiB0aGUgTUFYMTM2MworCSAgQURDIGRyaXZlci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvTWFrZWZpbGUKaW5kZXggMGMyYjZmMy4uMDhjZWU1YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL01ha2VmaWxlCkBAIC0zLDYgKzMsNiBAQAogIwogCiBtYXgxMzYzLXkgOj0gbWF4MTM2M19jb3JlLm8KLW1heDEzNjMtJChDT05GSUdfSUlPX1JJTkdfQlVGRkVSKSArPSBtYXgxMzYzX3JpbmcubworbWF4MTM2My0kKENPTkZJR19NQVgxMzYzX1JJTkdfQlVGRkVSKSArPSBtYXgxMzYzX3JpbmcubwogCiBvYmotJChDT05GSUdfTUFYMTM2MykgKz0gbWF4MTM2My5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9tYXgxMzYzLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9tYXgxMzYzLmgKaW5kZXggOGFjYTgxZi4uYzExMmZiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvbWF4MTM2My5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL21heDEzNjMuaApAQCAtMjI4LDcgKzIyOCw3IEBACiAJc3RydWN0IGlpb190cmlnZ2VyCQkqdHJpZzsKIAlzdHJ1Y3QgcmVndWxhdG9yCQkqcmVnOwogfTsKLSNpZmRlZiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSCisjaWZkZWYgQ09ORklHX01BWDEzNjNfUklOR19CVUZGRVIKIAogc3NpemVfdCBtYXgxMzYzX3NjYW5fZnJvbV9yaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKQEAgLTIzOSw3ICsyMzksNyBAQAogaW50IG1heDEzNjNfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOwogdm9pZCBtYXgxMzYzX3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOwogCi0jZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisjZWxzZSAvKiBDT05GSUdfTUFYMTM2M19SSU5HX0JVRkZFUiAqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQgbWF4MTM2M191bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQogewpAQCAtMjY1LDUgKzI2NSw1IEBACiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgbWF4MTM2M19yaW5nX2NsZWFudXAoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldikge307Ci0jZW5kaWYgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworI2VuZGlmIC8qIENPTkZJR19NQVgxMzYzX1JJTkdfQlVGRkVSICovCiAjZW5kaWYgLyogX01BWDEzNjNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vY2hyZGV2LmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2NocmRldi5oCmluZGV4IDhiYzY0YmYuLmY0MmJhZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vY2hyZGV2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9jaHJkZXYuaApAQCAtNzUsMTAgKzc1LDEyIEBACiAgKiBAY3VycmVudF9ldmVudHM6CW51bWJlciBvZiBldmVudHMgaW4gZGV0ZWN0ZWQgbGlzdAogICogQGlkOgkJCWluZGVudGlmaWVyIHRvIGFsbG93IHRoZSBldmVudCBpbnRlcmZhY2UgdG8ga25vdyB3aGljaAogICoJCQlwaHlzaWNhbCBsaW5lIGl0IGNvcnJlc3BvbmRzIHRvCisgKiBAYXR0cjoJCXRoaXMgY2hyZGV2J3MgbWlub3IgbnVtYmVyIHN5c2ZzIGF0dHJpYnV0ZQogICogQG93bmVyOgkJZW5zdXJlIHRoZSBkcml2ZXIgbW9kdWxlIG93bnMgdGhlIGZpbGUsIG5vdCBpaW8KICAqIEBwcml2YXRlOgkJZHJpdmVyIHNwZWNpZmljIGRhdGEKICAqIEBfbmFtZToJCXVzZWQgaW50ZXJuYWxseSB0byBzdG9yZSB0aGUgc3lzZnMgbmFtZSBmb3IgbWlub3IgaWQKICAqCQkJYXR0cmlidXRlCisgKiBAX2F0dHJuYW1lOgkJdGhlIGV2ZW50IGludGVyZmFjZSdzIGF0dHJpYnV0ZSBuYW1lCiAgKi8KIHN0cnVjdCBpaW9fZXZlbnRfaW50ZXJmYWNlIHsKIAlzdHJ1Y3QgZGV2aWNlCQkJCWRldjsKQEAgLTEwNSw3ICsxMDcsNyBAQAogICogQGhhbmRsZXI6CQlldmVudCBoYW5kbGVyIGZ1bmN0aW9uIC0gY2FsbGVkIG9uIGV2ZW50IGlmIHRoaXMKICAqCQkJZXZlbnRfaGFuZGxlciBpcyBlbmFibGVkLgogICoKLSAqIEVhY2ggZGV2aWNlIGhhcyBvbmUgbGlzdCBvZiB0aGVzZSBwZXIgaW50ZXJydXB0IGxpbmUKKyAqIEVhY2ggZGV2aWNlIGhhcyBvbmUgbGlzdCBvZiB0aGVzZSBwZXIgaW50ZXJydXB0IGxpbmUuCiAgKiovCiBzdHJ1Y3QgaWlvX2V2ZW50X2hhbmRsZXJfbGlzdCB7CiAJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9paW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaWlvLmgKaW5kZXggMjVjY2I4MC4uNzFkYmZlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9paW8uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpby5oCkBAIC0xNjYsNyArMTY2LDcgQEAKICAqIEBiaXQ6IHdoaWNoIG51bWJlciBzY2FuIGVsZW1lbnQgaXMgdGhpcwogICoqLwogc3RhdGljIGlubGluZSBpbnQgaWlvX3NjYW5fbWFza19jb3VudF90b19yaWdodChzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8sCi1pbnQgYml0KQorCQkJCQkJaW50IGJpdCkKIHsKIAlpbnQgY291bnQgPSAwOwogCWludCBtYXNrID0gKDEgPDwgYml0KTsKQEAgLTIzOSw3ICsyMzksNyBAQAogICogQGRldl9pbmZvOgkJSUlPIGRldmljZSBzdHJ1Y3R1cmUKICAqIEBldl9saW5lOgkJV2hpY2ggZXZlbnQgbGluZSAoaGFyZHdhcmUgaW50ZXJydXB0KQogICogQGV2X2NvZGU6CQlXaGF0IGV2ZW50Ci0gKiBAdGltZXN0YW1wOgkJV2hlbiB0aGUgZXZlbnQgb2NjdXJlZAorICogQHRpbWVzdGFtcDoJCVdoZW4gdGhlIGV2ZW50IG9jY3VycmVkCiAgKiovCiBpbnQgaWlvX3B1c2hfZXZlbnQoc3RydWN0IGlpb19kZXYgKmRldl9pbmZvLAogCQkgIGludCBldl9saW5lLApAQCAtMjQ4LDExICsyNDgsMTEgQEAKIAogLyoqCiAgKiBzdHJ1Y3QgaWlvX3dvcmtfY29udCAtIGNvbnRhaW5lciBmb3Igd2hlbiBzaW5nbGV0b24gaGFuZGxlciBjYXNlIG1hdHRlcnMKLSAqIEB3czoJCQlbREVWSUNFXXdvcmtfc3RydWN0IHdoZW4gbm90IG9ubHkgcG9zc2libGUgZXZlbnQKLSAqIEB3c19ub2NoZWNrOgkJW0RFVklDRV13b3JrX3N0cnVjdCB3aGVuIG9ubHkgcG9zc2libGUgZXZlbnQKLSAqIEBhZGRyZXNzOgkJW0RFVklDRV1hc3NvY2lhdGVkIHJlZ2lzdGVyIGFkZHJlc3MKLSAqIEBtYXNrOgkJW0RFVklDRV1hc3NvY2lhdGVkIG1hc2sgZm9yIGlkZW50aWZ5aW5nIGV2ZW50IHNvdXJjZQotICogQHN0OgkJCVtERVZJQ0VdZGV2aWNlIHNwZWNpZmljIHN0YXRlIGluZm9ybWF0aW9uCisgKiBAd3M6CQkJW0RFVklDRV0gd29ya19zdHJ1Y3Qgd2hlbiBub3Qgb25seSBwb3NzaWJsZSBldmVudAorICogQHdzX25vY2hlY2s6CQlbREVWSUNFXSB3b3JrX3N0cnVjdCB3aGVuIG9ubHkgcG9zc2libGUgZXZlbnQKKyAqIEBhZGRyZXNzOgkJW0RFVklDRV0gYXNzb2NpYXRlZCByZWdpc3RlciBhZGRyZXNzCisgKiBAbWFzazoJCVtERVZJQ0VdIGFzc29jaWF0ZWQgbWFzayBmb3IgaWRlbnRpZnlpbmcgZXZlbnQgc291cmNlCisgKiBAc3Q6CQkJW0RFVklDRV0gZGV2aWNlIHNwZWNpZmljIHN0YXRlIGluZm9ybWF0aW9uCiAgKiovCiBzdHJ1Y3QgaWlvX3dvcmtfY29udCB7CiAJc3RydWN0IHdvcmtfc3RydWN0CXdzOwpAQCAtMjczLDkgKzI3Myw5IEBACiAgKiBAY29udDogdGhlIHdvcmsgY29udGFpbmVyCiAgKiBAX2NoZWNrZnVuYzogZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIHBvc3NpYmxlIGludCBzb3VyY2VzCiAgKiBAX25vY2hlY2tmdW5jOiBmdW5jdGlvbiBmb3Igd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBpbnQgc291cmNlCi0gKiBAX2FkZDogZHJpdmVyIGRlcGVuZGFudCwgdHlwaWNhbGx5IGEgcmVnaXN0ZXIgYWRkcmVzcwotICogQF9tYXNrOiBkcml2ZXIgZGVwZW5kYW50LCB0eXBpY2FsbHkgYSBiaXQgbWFzayBmb3IgYSByZWdpc3RlcgotICogQF9zdDogZHJpdmVyIGRlcGVuZGFudCwgdHlwaWNhbGx5IHBvaW50ZXIgdG8gYSBkZXZpY2Ugc3RhdGUgc3RydWN0dXJlCisgKiBAX2FkZDogZHJpdmVyIGRlcGVuZGVudCwgdHlwaWNhbGx5IGEgcmVnaXN0ZXIgYWRkcmVzcworICogQF9tYXNrOiBkcml2ZXIgZGVwZW5kZW50LCB0eXBpY2FsbHkgYSBiaXQgbWFzayBmb3IgYSByZWdpc3RlcgorICogQF9zdDogZHJpdmVyIGRlcGVuZGVudCwgdHlwaWNhbGx5IHBvaW50ZXIgdG8gYSBkZXZpY2Ugc3RhdGUgc3RydWN0dXJlCiAgKiovCiBzdGF0aWMgaW5saW5lIHZvaWQKIGlpb19pbml0X3dvcmtfY29udChzdHJ1Y3QgaWlvX3dvcmtfY29udCAqY29udCwKQEAgLTI5MCw3ICsyOTAsNyBAQAogCWNvbnQtPnN0ID0gX3N0OwogfQogLyoqCi0gKiBfX2lpb19wdXNoX2V2ZW50KCkgdHJpZXMgdG8gYWRkIGFuIGV2ZW50IHRvIHRoZSBsaXN0IGFzc29jaWF0ZWQgd2l0aCBhIGNocmRldgorICogX19paW9fcHVzaF9ldmVudCgpIC0gdHJpZXMgdG8gYWRkIGFuIGV2ZW50IHRvIHRoZSBsaXN0IGFzc29jaWF0ZWQgd2l0aCBhIGNocmRldgogICogQGV2X2ludDoJCXRoZSBldmVudCBpbnRlcmZhY2UgdG8gd2hpY2ggd2UgYXJlIHB1c2hpbmcgdGhlIGV2ZW50CiAgKiBAZXZfY29kZToJCXRoZSBvdXRnb2luZyBldmVudCBjb2RlCiAgKiBAdGltZXN0YW1wOgkJdGltZXN0YW1wIG9mIHRoZSBldmVudApAQCAtMzAyLDggKzMwMiw4IEBACiAJCSAgICBzdHJ1Y3QgaWlvX3NoYXJlZF9ldl9wb2ludGVyKgogCQkgICAgc2hhcmVkX3BvaW50ZXJfcCk7CiAvKioKLSAqIF9faWlvX2NoYW5nZV9ldmVudCgpIGNoYW5nZSBhbiBldmVudCBjb2RlIGluIGNhc2Ugb2YgZXZlbnQgZXNjYWxsYXRpb24KLSAqIEBldjoJCQl0aGUgZXZuZXQgdG8gYmUgY2hhbmdlZAorICogX19paW9fY2hhbmdlX2V2ZW50KCkgLSBjaGFuZ2UgYW4gZXZlbnQgY29kZSBpbiBjYXNlIG9mIGV2ZW50IGVzY2FsYXRpb24KKyAqIEBldjoJCQl0aGUgZXZlbnQgdG8gYmUgY2hhbmdlZAogICogQGV2X2NvZGU6CQluZXcgZXZlbnQgY29kZQogICogQHRpbWVzdGFtcDoJCW5ldyB0aW1lc3RhbXAKICAqKi8KQEAgLTMxMiw3ICszMTIsNyBAQAogCQkJczY0IHRpbWVzdGFtcCk7CiAKIC8qKgotICogaWlvX3NldHVwX2V2X2ludCgpIENvbmZpZ3VyZSBhbiBldmVudCBpbnRlcmZhY2UgKGNocmRldikKKyAqIGlpb19zZXR1cF9ldl9pbnQoKSAtIGNvbmZpZ3VyZSBhbiBldmVudCBpbnRlcmZhY2UgKGNocmRldikKICAqIEBuYW1lOgkJbmFtZSB1c2VkIGZvciByZXN1bHRpbmcgc3lzZnMgZGlyZWN0b3J5IGV0Yy4KICAqIEBldl9pbnQ6CQlpbnRlcmZhY2Ugd2UgYXJlIGNvbmZpZ3VyaW5nCiAgKiBAb3duZXI6CQltb2R1bGUgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgcmVnaXN0ZXJpbmcgdGhpcyBldl9pbnQKQEAgLTM0Myw3ICszNDMsNyBAQAogZXh0ZXJuIHN0cnVjdCBjbGFzcyBpaW9fY2xhc3M7CiAKIC8qKgotICogaWlvX3B1dF9kZXZpY2UoKSAtIHJlZmVyZW5jZSBjb3VudGVkIGRlYWxsb2NhdGVkIG9mIHN0cnVjdCBkZXZpY2UKKyAqIGlpb19wdXRfZGV2aWNlKCkgLSByZWZlcmVuY2UgY291bnRlZCBkZWFsbG9jYXRpb24gb2Ygc3RydWN0IGRldmljZQogICogQGRldjogdGhlIGlpb19kZXZpY2UgY29udGFpbmluZyB0aGUgZGV2aWNlCiAgKiovCiBzdGF0aWMgaW5saW5lIHZvaWQgaWlvX3B1dF9kZXZpY2Uoc3RydWN0IGlpb19kZXYgKmRldikKQEAgLTM1Myw3ICszNTMsNyBAQAogfTsKIAogLyoqCi0gKiB0b19paW9fZGV2KCkgLSBnZXQgaWlvX2RldiBmb3Igd2hpY2ggd2UgaGF2ZSBoYXZlIHRoZSBzdHJ1Y3QgZGV2aWNlCisgKiB0b19paW9fZGV2KCkgLSBnZXQgaWlvX2RldiBmb3Igd2hpY2ggd2UgaGF2ZSB0aGUgc3RydWN0IGRldmljZQogICogQGQ6IHRoZSBzdHJ1Y3QgZGV2aWNlCiAgKiovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBpaW9fZGV2ICp0b19paW9fZGV2KHN0cnVjdCBkZXZpY2UgKmQpCkBAIC0zNzcsNiArMzc3LDcgQEAKIAogLyoqCiAgKiBpaW9fZnJlZV9kZXZpY2UoKSAtIGZyZWUgYW4gaWlvX2RldiBmcm9tIGEgZHJpdmVyCisgKiBAZGV2OiB0aGUgaWlvX2RldiBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZQogICoqLwogdm9pZCBpaW9fZnJlZV9kZXZpY2Uoc3RydWN0IGlpb19kZXYgKmRldik7CiAKQEAgLTM5NSw3ICszOTYsOCBAQAogdm9pZCBpaW9fZGV2aWNlX2ZyZWVfY2hyZGV2X21pbm9yKGludCB2YWwpOwogCiAvKioKLSAqIGlpb19yaW5nX2VuYWJsZWQoKSBoZWxwZXIgZnVuY3Rpb24gdG8gdGVzdCBpZiBhbnkgZm9ybSBvZiByaW5nIGVuYWJsZWQKKyAqIGlpb19yaW5nX2VuYWJsZWQoKSAtIGhlbHBlciBmdW5jdGlvbiB0byB0ZXN0IGlmIGFueSBmb3JtIG9mIHJpbmcgaXMgZW5hYmxlZAorICogQGRldl9pbmZvOgkJSUlPIGRldmljZSBpbmZvIHN0cnVjdHVyZSBmb3IgZGV2aWNlCiAgKiovCiBzdGF0aWMgaW5saW5lIGJvb2wgaWlvX3JpbmdfZW5hYmxlZChzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8pCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L0tjb25maWcKaW5kZXggMTJhZjBjNC4uODBjYjZlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvS2NvbmZpZwpAQCAtMywxMSArMywxMyBAQAogIwogY29tbWVudCAiTGlnaHQgc2Vuc29ycyIKIAotY29uZmlnIFRTTDI1NjEKLSAgICAgICB0cmlzdGF0ZSAiVEFPUyBUU0wyNTYxIGxpZ2h0LXRvLWRpZ2l0YWwgY29udmVydG9yIgotICAgICAgIGRlcGVuZHMgb24gSTJDCi0gICAgICAgaGVscAotCVNheSB5ZXMgYmVyZSB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgVEFPUyBsaWdodCB0byBkaWdpdGFsCi0JY29udmVydG9yLiAgVGhpcyBjaGlwIGhhcyB0d28gbGlnaHQgc2Vuc29ycy4gT25lIGlzIGJyb2FkYmFuZAotCWluY2x1ZGluZyBpbmZyYXJlZCB3aGlsc3QgdGhlIG90aGVyIG1lYXN1cmVzIG9ubHkgaW5mcmFyZWQuCi0JUHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB2aWEgc3lzZnMuCitjb25maWcgU0VOU09SU19UU0wyNTYzCisJdHJpc3RhdGUgIlRBT1MgVFNMMjU2WzAtM10gYW1iaWVudCBsaWdodCBzZW5zb3IiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgVGFvcyBUU0wyNTYwLAorCSBUU0wyNTYxLCBUU0wyNTYyIGFuZCBUU0wyNTYzIGFtYmllbnQgbGlnaHQgc2Vuc29ycy4KKworCSBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJIHdpbGwgYmUgY2FsbGVkIHRzbDI1NjMuCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L01ha2VmaWxlCmluZGV4IGNjZmYxNTEuLjMwZjMzMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC9NYWtlZmlsZQpAQCAtMiw0ICsyLDQgQEAKICMgTWFrZWZpbGUgZm9yIGluZHVzdHJpYWwgSS9PIExpZ2h0IHNlbnNvcnMKICMKIAotb2JqLSQoQ09ORklHX1RTTDI1NjEpICAgKz0gdHNsMjU2MS5vCitvYmotJChDT05GSUdfU0VOU09SU19UU0wyNTYzKQkrPSB0c2wyNTYzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvdHNsMjU2MS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyNTYxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMjEwN2YuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyNTYxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotLyoKLSAqICB0c2wyNTYxLmMgLSBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgbGlnaHQgdG8gZGlnaXRhbCBjb252ZXJ0b3IKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgSm9uYXRoYW4gQ2FtZXJvbiA8amljMjNAY2FtLmFjLnVrPgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICogIFNvbWUgcG9ydGlvbnMgYmFzZWQgdXBvbiB0aGUgdHNsMjU1MCBkcml2ZXIuCi0gKgotICogIFRoaXMgZHJpdmVyIGNvdWxkIHByb2JhYmx5IGJlIGFkYXB0ZWQgZWFzaWx5IHRvIHRhbGsgdG8gdGhlIHRzbDI1NjAgKHNtYnVzKQotICoKLSAqICBOZWVkcyBzb21lIHdvcmsgdG8gc3VwcG9ydCB0aGUgZXZlbnRzIHRoaXMgY2FuIGdlbmVyYXRlLgotICogIFRvZG86IEltcGxlbWVudCBpbnRlcnJ1cHQgaGFuZGxpbmcuICBDdXJyZW50bHkgYSBoYXJkd2FyZSBidWcgbWVhbnMKLSAqICB0aGlzIGlzbid0IGF2YWlsYWJsZSBvbiBteSB0ZXN0IGJvYXJkLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSAiLi4vaWlvLmgiCi0jaW5jbHVkZSAiLi4vc3lzZnMuaCIKLSNpbmNsdWRlICJsaWdodC5oIgotCi0jZGVmaW5lIFRTTDI1NjFfQ09OVFJPTF9SRUdJU1RFUiAweDAwCi0jZGVmaW5lIFRTTDI1NjFfVElNSU5HX1JFR0lTVEVSIDB4MDEKLSNkZWZpbmUgVFNMMjU2MV9USFJFU0hMT1dfTE9XX1JFR0lTVEVSIDB4MDIKLSNkZWZpbmUgVFNMMjU2MV9USFJFU0hMT1dfSElHSF9SRUdJU1RFUiAweDAzCi0jZGVmaW5lIFRTTDI1NjFfVEhSRVNISElHSF9MT1dfUkVHSVNURVIgMHgwNAotI2RlZmluZSBUU0wyNTYxX1RIUkVTSEhJR0hfSElHSF9SRUdJU1RFUiAweDA1Ci0jZGVmaW5lIFRTTDI1NjFfSU5UX0NPTlRST0xfUkVHSVNURVIgMHgwNgotCi0jZGVmaW5lIFRTTDI1NjFfSU5UX1JFR19JTlRfT0ZGIDB4MDAKLSNkZWZpbmUgVFNMMjU2MV9JTlRfUkVHX0lOVF9MRVZFTCAweDA4Ci0jZGVmaW5lIFRTTDI1NjFfSU5UX1JFR19JTlRfU01CVVMgMHgxMAotI2RlZmluZSBUU0wyNTYxX0lOVF9SRUdfSU5UX1RFU1QgMHgxOAotCi0jZGVmaW5lIFRTTDI1NjFfSURfUkVHSVNURVIgMHgwQQotCi0jZGVmaW5lIFRTTDI1NjFfREFUQV8wX0xPVyAweDBDCi0jZGVmaW5lIFRTTDI1NjFfREFUQV8xX0xPVyAweDBFCi0KLS8qIENvbnRyb2wgUmVnaXN0ZXIgVmFsdWVzICovCi0jZGVmaW5lIFRTTDI1NjFfQ09OVF9SRUdfUFdSX09OIDB4MDMKLSNkZWZpbmUgVFNMMjU2MV9DT05UX1JFR19QV1JfT0ZGIDB4MDAKLQotLyoqCi0gKiBzdHJ1Y3QgdHNsMjU2MV9zdGF0ZSAtIGRldmljZSBzcGVjaWZpYyBzdGF0ZQotICogQGluZGlvX2RldjoJCXRoZSBpbmR1c3RyaWFsaW8gSS9PIGluZm8gc3RydWN0dXJlCi0gKiBAY2xpZW50OgkJaTJjIGNsaWVudAotICogQGNvbW1hbmRfYnVmOglzaW5nbGUgY29tbWFuZCBidWZmZXIgdXNlZCBmb3IgYWxsIG9wZXJhdGlvbnMKLSAqIEBjb21tYW5kX2J1Zl9sb2NrOgllbnN1cmUgdW5pcXVlIGFjY2VzcyB0byBjb21tYW5kX2J1ZgotICovCi1zdHJ1Y3QgdHNsMjU2MV9zdGF0ZSB7Ci0Jc3RydWN0IGlpb19kZXYJCSppbmRpb19kZXY7Ci0Jc3RydWN0IGkyY19jbGllbnQJKmNsaWVudDsKLQlzdHJ1Y3QgdHNsMjU2MV9jb21tYW5kCSpjb21tYW5kX2J1ZjsKLQlzdHJ1Y3QgbXV0ZXgJCWNvbW1hbmRfYnVmX2xvY2s7Ci19OwotCi0vKioKLSAqIHN0cnVjdCB0c2wyNTYxX2NvbW1hbmQgLSBjb21tYW5kIGJ5dGUgZm9yIHNtYnVzCi0gKiBAYWRkcmVzczoJcmVnaXN0ZXIgYWRkcmVzcwotICogQGJsb2NrOglpcyB0aGlzIGEgYmxvY2sgci93Ci0gKiBAd29yZDoJaXMgdGhpcyBhIHdvcmQgci93Ci0gKiBAY2xlYXI6CXNldCB0byAxIHRvIGNsZWFyIHBlbmRpbmcgaW50ZXJydXB0Ci0gKiBAY21kOglzZWxlY3QgdGhlIGNvbW1hbmQgcmVnaXN0ZXIgLSBhbHdheXMgMS4KLSAqLwotc3RydWN0IHRzbDI1NjFfY29tbWFuZCB7Ci0JdW5zaWduZWQgaW50IGFkZHJlc3M6NDsKLQl1bnNpZ25lZCBpbnQgYmxvY2s6MTsKLQl1bnNpZ25lZCBpbnQgd29yZDoxOwotCXVuc2lnbmVkIGludCBjbGVhcjoxOwotCXVuc2lnbmVkIGludCBjbWQ6MTsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0c2wyNTYxX2luaXRfY29tbWFuZF9idWYoc3RydWN0IHRzbDI1NjFfY29tbWFuZCAqYnVmKQotewotCWJ1Zi0+YWRkcmVzcyA9IDA7Ci0JYnVmLT5ibG9jayA9IDA7Ci0JYnVmLT53b3JkID0gMDsKLQlidWYtPmNsZWFyID0gMDsKLQlidWYtPmNtZCA9IDE7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHRzbDI1NjFfcmVhZF92YWwoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCWNoYXIgKmJ1ZikKLXsKLQlpbnQgcmV0ID0gMCwgZGF0YTsKLQlzc2l6ZV90IGxlbiA9IDA7Ci0Jc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOwotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgdHNsMjU2MV9zdGF0ZSAqc3QgPSBpbmRpb19kZXYtPmRldl9kYXRhOwotCi0JbXV0ZXhfbG9jaygmc3QtPmNvbW1hbmRfYnVmX2xvY2spOwotCXN0LT5jb21tYW5kX2J1Zi0+Y21kID0gMTsKLQlzdC0+Y29tbWFuZF9idWYtPndvcmQgPSAxOwotCXN0LT5jb21tYW5kX2J1Zi0+YWRkcmVzcyA9IHRoaXNfYXR0ci0+YWRkcmVzczsKLQotCWRhdGEgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoc3QtPmNsaWVudCwgKihjaGFyICopKHN0LT5jb21tYW5kX2J1ZikpOwotCWlmIChkYXRhIDwgMCkgewotCQlyZXQgPSBkYXRhOwotCQlnb3RvIGVycm9yX3JldDsKLQl9Ci0JbGVuID0gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YSk7Ci0KLWVycm9yX3JldDoKLQltdXRleF91bmxvY2soJnN0LT5jb21tYW5kX2J1Zl9sb2NrKTsKLQotCXJldHVybiByZXQgPyByZXQgOiBsZW47Ci19Ci0KLXN0YXRpYyBJSU9fREVWX0FUVFJfTElHSFRfSU5GUkFSRUQoMCwgdHNsMjU2MV9yZWFkX3ZhbCwgVFNMMjU2MV9EQVRBXzBfTE9XKTsKLXN0YXRpYyBJSU9fREVWX0FUVFJfTElHSFRfQlJPQUQoMCwgdHNsMjU2MV9yZWFkX3ZhbCwgVFNMMjU2MV9EQVRBXzFfTE9XKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnRzbDI1NjFfYXR0cmlidXRlc1tdID0gewotCSZpaW9fZGV2X2F0dHJfbGlnaHRfaW5mcmFyZWQwLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9saWdodF9icm9hZHNwZWN0cnVtMC5kZXZfYXR0ci5hdHRyLAotCU5VTEwsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCB0c2wyNTYxX2F0dHJpYnV0ZV9ncm91cCA9IHsKLQkuYXR0cnMgPSB0c2wyNTYxX2F0dHJpYnV0ZXMsCi19OwotCi1zdGF0aWMgaW50IHRzbDI1NjFfaW5pdGlhbGl6ZShzdHJ1Y3QgdHNsMjU2MV9zdGF0ZSAqc3QpCi17Ci0JaW50IGVycjsKLQotCW11dGV4X2xvY2soJnN0LT5jb21tYW5kX2J1Zl9sb2NrKTsKLQlzdC0+Y29tbWFuZF9idWYtPndvcmQgPSAwOwotCXN0LT5jb21tYW5kX2J1Zi0+YmxvY2sgPSAwOwotCXN0LT5jb21tYW5kX2J1Zi0+YWRkcmVzcyA9IFRTTDI1NjFfQ09OVFJPTF9SRUdJU1RFUjsKLQllcnIgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKHN0LT5jbGllbnQsICooY2hhciAqKShzdC0+Y29tbWFuZF9idWYpLAotCQkJCQlUU0wyNTYxX0NPTlRfUkVHX1BXUl9PTik7Ci0JaWYgKGVycikKLQkJZ290byBlcnJvcl9yZXQ7Ci0KLQlzdC0+Y29tbWFuZF9idWYtPmFkZHJlc3MgPSBUU0wyNTYxX0lOVF9DT05UUk9MX1JFR0lTVEVSOwotCWVyciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoc3QtPmNsaWVudCwgKihjaGFyICopKHN0LT5jb21tYW5kX2J1ZiksCi0JCQkJCVRTTDI1NjFfSU5UX1JFR19JTlRfVEVTVCk7Ci0KLWVycm9yX3JldDoKLQltdXRleF91bmxvY2soJnN0LT5jb21tYW5kX2J1Zl9sb2NrKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgdHNsMjU2MV9wb3dlcmRvd24oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCB0c2wyNTYxX2NvbW1hbmQgQ29tbWFuZCA9IHsKLQkJLmNtZCA9ICAxLAotCQkuY2xlYXIgPSAwLAotCQkud29yZCA9IDAsCi0JCS5ibG9jayA9IDAsCi0JCS5hZGRyZXNzID0gVFNMMjU2MV9DT05UUk9MX1JFR0lTVEVSLAotCX07Ci0KLQllcnIgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgKihjaGFyICopKCZDb21tYW5kKSwKLQkJCQkJVFNMMjU2MV9DT05UX1JFR19QV1JfT0ZGKTsKLQlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKLX0KLXN0YXRpYyBpbnQgX19kZXZpbml0IHRzbDI1NjFfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJCQkgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCi17Ci0JaW50IHJldCA9IDAsIHJlZ2RvbmUgPSAwOwotCXN0cnVjdCB0c2wyNTYxX3N0YXRlICpzdCA9IGt6YWxsb2Moc2l6ZW9mKCpzdCksIEdGUF9LRVJORUwpOwotCi0JaWYgKHN0ID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJvcl9yZXQ7Ci0JfQotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHN0KTsKLQlzdC0+Y2xpZW50ID0gY2xpZW50OwotCW11dGV4X2luaXQoJnN0LT5jb21tYW5kX2J1Zl9sb2NrKTsKLQotCXN0LT5jb21tYW5kX2J1ZiA9IGttYWxsb2Moc2l6ZW9mKCpzdC0+Y29tbWFuZF9idWYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoc3QtPmNvbW1hbmRfYnVmID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJvcl9mcmVlX3N0YXRlOwotCX0KLQl0c2wyNTYxX2luaXRfY29tbWFuZF9idWYoc3QtPmNvbW1hbmRfYnVmKTsKLQotCXN0LT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7Ci0JaWYgKHN0LT5pbmRpb19kZXYgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yX2ZyZWVfY29tbWFuZF9idWY7Ci0JfQotCXN0LT5pbmRpb19kZXYtPmF0dHJzID0gJnRzbDI1NjFfYXR0cmlidXRlX2dyb3VwOwotCXN0LT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmY2xpZW50LT5kZXY7Ci0Jc3QtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7Ci0Jc3QtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOwotCXN0LT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7Ci0JcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yX2ZyZWVfaWlvZGV2OwotCXJlZ2RvbmUgPSAxOwotCS8qIEludGlhbGl6ZSB0aGUgY2hpcCAqLwotCXJldCA9IHRzbDI1NjFfaW5pdGlhbGl6ZShzdCk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcl91bnJlZ2lzdGVyX2lpb2RldjsKLQotCXJldHVybiAwOwotZXJyb3JfdW5yZWdpc3Rlcl9paW9kZXY6Ci1lcnJvcl9mcmVlX2lpb2RldjoKLQlpZiAocmVnZG9uZSkKLQkJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOwotCWVsc2UKLQkJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pbmRpb19kZXYpOwotZXJyb3JfZnJlZV9jb21tYW5kX2J1ZjoKLQlrZnJlZShzdC0+Y29tbWFuZF9idWYpOwotZXJyb3JfZnJlZV9zdGF0ZToKLQlrZnJlZShzdCk7Ci1lcnJvcl9yZXQ6Ci0JcmV0dXJuIHJldDsKLQotfQotCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCB0c2wyNTYxX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCB0c2wyNTYxX3N0YXRlICpzdCA9ICBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQotCWlpb19kZXZpY2VfdW5yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKLQlrZnJlZShzdCk7Ci0KLQlyZXR1cm4gdHNsMjU2MV9wb3dlcmRvd24oY2xpZW50KTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHRzbDI1NjFfaWRbXSA9IHsKLQl7ICJ0c2wyNTYxIiwgMCB9LAotCXsgfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCB0c2wyNTYxX2lkKTsKLQotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdHNsMjU2MV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAidHNsMjU2MSIsCi0JfSwKLQkucHJvYmUgPSB0c2wyNTYxX3Byb2JlLAotCS5yZW1vdmUgPSBfX2RldmV4aXRfcCh0c2wyNTYxX3JlbW92ZSksCi0JLmlkX3RhYmxlICA9IHRzbDI1NjFfaWQsCi19OwotCi1zdGF0aWMgX19pbml0IGludCB0c2wyNTYxX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJnRzbDI1NjFfZHJpdmVyKTsKLX0KLW1vZHVsZV9pbml0KHRzbDI1NjFfaW5pdCk7Ci0KLXN0YXRpYyBfX2V4aXQgdm9pZCB0c2wyNTYxX2V4aXQodm9pZCkKLXsKLQlpMmNfZGVsX2RyaXZlcigmdHNsMjU2MV9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQodHNsMjU2MV9leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiSm9uYXRoYW4gQ2FtZXJvbiA8amljMjNAY2FtLmFjLnVrPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJUU0wyNTYxIGxpZ2h0IHNlbnNvciBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvdHNsMjU2My5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyNTYzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhiOTQzMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvdHNsMjU2My5jCkBAIC0wLDAgKzEsNzczIEBACisvKgorICogZHJpdmVycy9pMmMvY2hpcHMvdHNsMjU2My5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uCisgKgorICogV3JpdHRlbiBieSBUaW1vIE8uIEthcmphbGFpbmVuIDx0aW1vLm8ua2FyamFsYWluZW5Abm9raWEuY29tPgorICogQ29udGFjdDogQW1pdCBLdWNoZXJpYSA8YW1pdC5rdWNoZXJpYUB2ZXJkdXJlbnQuY29tPgorICoKKyAqIENvbnZlcnRlZCB0byBJSU8gZHJpdmVyCisgKiBBbWl0IEt1Y2hlcmlhIDxhbWl0Lmt1Y2hlcmlhQHZlcmR1cmVudC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICJ0c2wyNTYzLmgiCisKKy8qIFVzZSB0aGlzIG1hbnkgYml0cyBmb3IgZnJhY3Rpb24gcGFydC4gKi8KKyNkZWZpbmUgQURDX0ZSQUNfQklUUwkJKDE0KQorCisvKiBHaXZlbiBudW1iZXIgb2YgMS8xMDAwMCdzIGluIEFEQ19GUkFDX0JJVFMgcHJlY2lzaW9uLiAqLworI2RlZmluZSBGUkFDMTBLKGYpCQkoKChmKSAqICgxTCA8PCAoQURDX0ZSQUNfQklUUykpKSAvICgxMDAwMCkpCisKKy8qIEJpdHMgdXNlZCBmb3IgZnJhY3Rpb24gaW4gY2FsaWJyYXRpb24gY29lZmZpY2llbnRzLiovCisjZGVmaW5lIENBTElCX0ZSQUNfQklUUwkJKDEwKQorLyogMC41IGluIENBTElCX0ZSQUNfQklUUyBwcmVjaXNpb24gKi8KKyNkZWZpbmUgQ0FMSUJfRlJBQ19IQUxGCQkoMSA8PCAoQ0FMSUJfRlJBQ19CSVRTIC0gMSkpCisvKiBNYWtlIGEgZnJhY3Rpb24gZnJvbSBhIG51bWJlciBuIHRoYXQgd2FzIG11bHRpcGxpZWQgd2l0aCBiLiAqLworI2RlZmluZSBDQUxJQl9GUkFDKG4sIGIpCSgoKG4pIDw8IENBTElCX0ZSQUNfQklUUykgLyAoYikpCisvKiBEZWNpbWFsIDEwXihkaWdpdHMgaW4gc3lzZnMgcHJlc2VudGF0aW9uKSAqLworI2RlZmluZSBDQUxJQl9CQVNFX1NZU0ZTCSgxMDAwKQorCisjZGVmaW5lIFRTTDI1NjNfQ01ECQkoMHg4MCkKKyNkZWZpbmUgVFNMMjU2M19DTEVBUklOVAkoMHg0MCkKKworI2RlZmluZSBUU0wyNTYzX1JFR19DVFJMCSgweDAwKQorI2RlZmluZSBUU0wyNTYzX1JFR19USU1JTkcJKDB4MDEpCisjZGVmaW5lIFRTTDI1NjNfUkVHX0xPV0xPVwkoMHgwMikgLyogZGF0YTAgbG93IHRocmVzaG9sZCwgMiBieXRlcyAqLworI2RlZmluZSBUU0wyNTYzX1JFR19MT1dISUdICSgweDAzKQorI2RlZmluZSBUU0wyNTYzX1JFR19ISUdITE9XCSgweDA0KSAvKiBkYXRhMCBoaWdoIHRocmVzaG9sZCwgMiBieXRlcyAqLworI2RlZmluZSBUU0wyNTYzX1JFR19ISUdISElHSAkoMHgwNSkKKyNkZWZpbmUgVFNMMjU2M19SRUdfSU5UCQkoMHgwNikKKyNkZWZpbmUgVFNMMjU2M19SRUdfSUQJCSgweDBhKQorI2RlZmluZSBUU0wyNTYzX1JFR19EQVRBMExPVwkoMHgwYykgLyogYnJvYWRiYW5kIHNlbnNvciB2YWx1ZSwgMiBieXRlcyAqLworI2RlZmluZSBUU0wyNTYzX1JFR19EQVRBMEhJR0gJKDB4MGQpCisjZGVmaW5lIFRTTDI1NjNfUkVHX0RBVEExTE9XCSgweDBlKSAvKiBpbmZyYXJlZCBzZW5zb3IgdmFsdWUsIDIgYnl0ZXMgKi8KKyNkZWZpbmUgVFNMMjU2M19SRUdfREFUQTFISUdICSgweDBmKQorCisjZGVmaW5lIFRTTDI1NjNfQ01EX1BPV0VSX09OCSgweDAzKQorI2RlZmluZSBUU0wyNTYzX0NNRF9QT1dFUl9PRkYJKDB4MDApCisjZGVmaW5lIFRTTDI1NjNfQ1RSTF9QT1dFUl9NQVNLCSgweDAzKQorCisjZGVmaW5lIFRTTDI1NjNfVElNSU5HXzEzTVMJKDB4MDApCisjZGVmaW5lIFRTTDI1NjNfVElNSU5HXzEwME1TCSgweDAxKQorI2RlZmluZSBUU0wyNTYzX1RJTUlOR180MDBNUwkoMHgwMikKKyNkZWZpbmUgVFNMMjU2M19USU1JTkdfTUFTSwkoMHgwMykKKyNkZWZpbmUgVFNMMjU2M19USU1JTkdfR0FJTjE2CSgweDEwKQorI2RlZmluZSBUU0wyNTYzX1RJTUlOR19HQUlOMQkoMHgwMCkKKworI2RlZmluZSBUU0wyNTYzX0lOVF9ESVNCTEVECSgweDAwKQorI2RlZmluZSBUU0wyNTYzX0lOVF9MRVZFTAkoMHgxMCkKKyNkZWZpbmUgVFNMMjU2M19JTlRfUEVSU0lTVChuKQkoKG4pICYgMHgwRikKKworc3RydWN0IHRzbDI1NjNfZ2FpbmxldmVsX2NvZWZmIHsKKwl1OCBnYWludGltZTsKKwl1MTYgbWluOworCXUxNiBtYXg7Cit9OworCitzdGF0aWMgc3RydWN0IHRzbDI1NjNfZ2FpbmxldmVsX2NvZWZmIHRzbDI1NjNfZ2FpbmxldmVsX3RhYmxlW10gPSB7CisJeworCQkuZ2FpbnRpbWUJPSBUU0wyNTYzX1RJTUlOR180MDBNUyB8IFRTTDI1NjNfVElNSU5HX0dBSU4xNiwKKwkJLm1pbgkJPSAwLAorCQkubWF4CQk9IDY1NTM0LAorCX0sIHsKKwkJLmdhaW50aW1lCT0gVFNMMjU2M19USU1JTkdfNDAwTVMgfCBUU0wyNTYzX1RJTUlOR19HQUlOMSwKKwkJLm1pbgkJPSAyMDQ4LAorCQkubWF4CQk9IDY1NTM0LAorCX0sIHsKKwkJLmdhaW50aW1lCT0gVFNMMjU2M19USU1JTkdfMTAwTVMgfCBUU0wyNTYzX1RJTUlOR19HQUlOMSwKKwkJLm1pbgkJPSA0MDk1LAorCQkubWF4CQk9IDM3MTc3LAorCX0sIHsKKwkJLmdhaW50aW1lCT0gVFNMMjU2M19USU1JTkdfMTNNUyB8IFRTTDI1NjNfVElNSU5HX0dBSU4xLAorCQkubWluCQk9IDMwMDAsCisJCS5tYXgJCT0gNjU1MzUsCisJfSwKK307CisKK3N0cnVjdCB0c2wyNTYzX2NoaXAgeworCXN0cnVjdCBtdXRleAkJbG9jazsKKwlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OworCXN0cnVjdCBpaW9fZGV2CQkqaW5kaW9fZGV2OworCXN0cnVjdCBkZWxheWVkX3dvcmsJcG93ZXJvZmZfd29yazsKKworCS8qIFJlbWVtYmVyIHN0YXRlIGZvciBzdXNwZW5kIGFuZCByZXN1bWUgZnVuY3Rpb25zICovCisJcG1fbWVzc2FnZV90CQlzdGF0ZTsKKworCXN0cnVjdCB0c2wyNTYzX2dhaW5sZXZlbF9jb2VmZiAqZ2FpbmxldmVsOworCisJLyogVGhyZXNob2xkcyBhcmUgaW4gbHV4ICovCisJdTE2CQkJbG93X3RocmVzOworCXUxNgkJCWhpZ2hfdGhyZXM7CisJdTgJCQlpbnRyOworCisJLyogQ2FsaWJyYXRpb24gY29lZmZpY2llbnRzICovCisJdTMyCQkJY2FsaWIwOworCXUzMgkJCWNhbGliMTsKKwlpbnQJCQljb3Zlcl9jb21wX2dhaW47CisKKwkvKiBDYWNoZSBjdXJyZW50IHZhbHVlcywgdG8gYmUgcmV0dXJuZWQgd2hpbGUgc3VzcGVuZGVkICovCisJdTMyCQkJZGF0YTA7CisJdTMyCQkJZGF0YTE7Cit9OworCitzdGF0aWMgaW50IHRzbDI1NjNfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCB2YWx1ZSkKK3sKKwlpbnQgcmV0OworCXU4IGJ1ZlsyXTsKKworCWJ1ZlswXSA9IFRTTDI1NjNfQ01EIHwgcmVnOworCWJ1ZlsxXSA9IHZhbHVlOworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmLCBzaXplb2YoYnVmKSk7CisJcmV0dXJuIChyZXQgPT0gc2l6ZW9mKGJ1ZikpID8gMCA6IHJldDsKK30KKworc3RhdGljIGludCB0c2wyNTYzX3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB2b2lkICpidWYsIGludCBsZW4pCit7CisJaW50IHJldDsKKwl1OCBjbWQgPSBUU0wyNTYzX0NNRCB8IHJlZzsKKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsICZjbWQsIHNpemVvZihjbWQpKTsKKwlpZiAocmV0ICE9IHNpemVvZihjbWQpKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGkyY19tYXN0ZXJfcmVjdihjbGllbnQsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIGludCB0c2wyNTYzX3NldF9wb3dlcihzdHJ1Y3QgdHNsMjU2M19jaGlwICpjaGlwLCBpbnQgb24pCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKwl1OCBjbWQ7CisKKwljbWQgPSBvbiA/IFRTTDI1NjNfQ01EX1BPV0VSX09OIDogVFNMMjU2M19DTURfUE9XRVJfT0ZGOworCXJldHVybiB0c2wyNTYzX3dyaXRlKGNsaWVudCwgVFNMMjU2M19SRUdfQ1RSTCwgY21kKTsKK30KKworLyoKKyAqIFJldHVybiB2YWx1ZSBpcyAwIGZvciBvZmYsIDEgZm9yIG9uLCBvciBhIG5lZ2F0aXZlIGVycm9yCisgKiBjb2RlIGlmIHJlYWRpbmcgZmFpbGVkLgorICovCitzdGF0aWMgaW50IHRzbDI1NjNfZ2V0X3Bvd2VyKHN0cnVjdCB0c2wyNTYzX2NoaXAgKmNoaXApCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKwlpbnQgcmV0OworCXU4IHZhbDsKKworCXJldCA9IHRzbDI1NjNfcmVhZChjbGllbnQsIFRTTDI1NjNfUkVHX0NUUkwsICZ2YWwsIHNpemVvZih2YWwpKTsKKwlpZiAocmV0ICE9IHNpemVvZih2YWwpKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuICh2YWwgJiBUU0wyNTYzX0NUUkxfUE9XRVJfTUFTSykgPT0gVFNMMjU2M19DTURfUE9XRVJfT047Cit9CisKK3N0YXRpYyBpbnQgdHNsMjU2M19jb25maWd1cmUoc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY2hpcC0+Y2xpZW50OworCWludCByZXQ7CisKKwlyZXQgPSB0c2wyNTYzX3dyaXRlKGNsaWVudCwgVFNMMjU2M19SRUdfVElNSU5HLAorCQkJY2hpcC0+Z2FpbmxldmVsLT5nYWludGltZSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSB0c2wyNTYzX3dyaXRlKGNsaWVudCwgVFNMMjU2M19SRUdfSU5ULCBjaGlwLT5pbnRyKTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHRzbDI1NjNfcG93ZXJvZmZfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdHNsMjU2M19jaGlwLCBwb3dlcm9mZl93b3JrLndvcmspOworCXRzbDI1NjNfc2V0X3Bvd2VyKGNoaXAsIDApOworfQorCitzdGF0aWMgaW50IHRzbDI1NjNfZGV0ZWN0KHN0cnVjdCB0c2wyNTYzX2NoaXAgKmNoaXApCit7CisJaW50IHJldDsKKworCXJldCA9IHRzbDI1NjNfc2V0X3Bvd2VyKGNoaXAsIDEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB0c2wyNTYzX2dldF9wb3dlcihjaGlwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiByZXQgPyAwIDogLUVOT0RFVjsKK30KKworc3RhdGljIGludCB0c2wyNTYzX3JlYWRfaWQoc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCwgdTggKmlkKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjaGlwLT5jbGllbnQ7CisJaW50IHJldDsKKworCXJldCA9IHRzbDI1NjNfcmVhZChjbGllbnQsIFRTTDI1NjNfUkVHX0lELCBpZCwgc2l6ZW9mKCppZCkpOworCWlmIChyZXQgIT0gc2l6ZW9mKCppZCkpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICJOb3JtYWxpemVkIiBBREMgdmFsdWUgaXMgb25lIG9idGFpbmVkIHdpdGggNDAwbXMgb2YgaW50ZWdyYXRpb24gdGltZSBhbmQKKyAqIDE2eCBnYWluLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBiaXRzIG9mIHNoaWZ0IG5lZWRlZCB0bworICogY29udmVydCBiZXR3ZWVuIG5vcm1hbGl6ZWQgdmFsdWVzIGFuZCBIVyB2YWx1ZXMgb2J0YWluZWQgdXNpbmcgZ2l2ZW4KKyAqIHRpbWluZyBhbmQgZ2FpbiBzZXR0aW5ncy4KKyAqLworc3RhdGljIGludCBhZGNfc2hpZnRiaXRzKHU4IHRpbWluZykKK3sKKwlpbnQgc2hpZnQgPSAwOworCisJc3dpdGNoICh0aW1pbmcgJiBUU0wyNTYzX1RJTUlOR19NQVNLKSB7CisJY2FzZSBUU0wyNTYzX1RJTUlOR18xM01TOgorCQlzaGlmdCArPSA1OworCQlicmVhazsKKwljYXNlIFRTTDI1NjNfVElNSU5HXzEwME1TOgorCQlzaGlmdCArPSAyOworCQlicmVhazsKKwljYXNlIFRTTDI1NjNfVElNSU5HXzQwME1TOgorCQkvKiBuby1vcCAqLworCQlicmVhazsKKwl9CisKKwlpZiAoISh0aW1pbmcgJiBUU0wyNTYzX1RJTUlOR19HQUlOMTYpKQorCQlzaGlmdCArPSA0OworCisJcmV0dXJuIHNoaWZ0OworfQorCisvKiBDb252ZXJ0IGEgSFcgQURDIHZhbHVlIHRvIG5vcm1hbGl6ZWQgc2NhbGUuICovCitzdGF0aWMgdTMyIG5vcm1hbGl6ZV9hZGModTE2IGFkYywgdTggdGltaW5nKQoreworCXJldHVybiBhZGMgPDwgYWRjX3NoaWZ0Yml0cyh0aW1pbmcpOworfQorCitzdGF0aWMgdm9pZCB0c2wyNTYzX3dhaXRfYWRjKHN0cnVjdCB0c2wyNTYzX2NoaXAgKmNoaXApCit7CisJdW5zaWduZWQgaW50IGRlbGF5OworCisJc3dpdGNoIChjaGlwLT5nYWlubGV2ZWwtPmdhaW50aW1lICYgVFNMMjU2M19USU1JTkdfTUFTSykgeworCWNhc2UgVFNMMjU2M19USU1JTkdfMTNNUzoKKwkJZGVsYXkgPSAxNDsKKwkJYnJlYWs7CisJY2FzZSBUU0wyNTYzX1RJTUlOR18xMDBNUzoKKwkJZGVsYXkgPSAxMDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRlbGF5ID0gNDAyOworCX0KKwkvKgorCSAqIFRPRE86IE1ha2Ugc3VyZSB0aGF0IHdlIHdhaXQgYXQgbGVhc3QgcmVxdWlyZWQgZGVsYXkgYnV0IHdoeSB3ZQorCSAqIGhhdmUgdG8gZXh0ZW5kIGl0IG9uZSB0aWNrIG1vcmU/CisJICovCisJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKG1zZWNzX3RvX2ppZmZpZXMoZGVsYXkpICsgMik7Cit9CisKK3N0YXRpYyBpbnQgdHNsMjU2M19hZGp1c3RfZ2FpbmxldmVsKHN0cnVjdCB0c2wyNTYzX2NoaXAgKmNoaXAsIHUxNiBhZGMpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKworCWlmIChhZGMgPiBjaGlwLT5nYWlubGV2ZWwtPm1heCB8fCBhZGMgPCBjaGlwLT5nYWlubGV2ZWwtPm1pbikgeworCisJCShhZGMgPiBjaGlwLT5nYWlubGV2ZWwtPm1heCkgPworCQkJY2hpcC0+Z2FpbmxldmVsKysgOiBjaGlwLT5nYWlubGV2ZWwtLTsKKworCQl0c2wyNTYzX3dyaXRlKGNsaWVudCwgVFNMMjU2M19SRUdfVElNSU5HLAorCQkJICAgICAgY2hpcC0+Z2FpbmxldmVsLT5nYWludGltZSk7CisKKwkJdHNsMjU2M193YWl0X2FkYyhjaGlwKTsKKwkJdHNsMjU2M193YWl0X2FkYyhjaGlwKTsKKworCQlyZXR1cm4gMTsKKwl9IGVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHNsMjU2M19nZXRfYWRjKHN0cnVjdCB0c2wyNTYzX2NoaXAgKmNoaXApCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKwl1OCBidWYwWzJdLCBidWYxWzJdOworCXUxNiBhZGMwLCBhZGMxOworCWludCByZXRyeSA9IDE7CisJaW50IHJldCA9IDA7CisKKwlpZiAoY2hpcC0+c3RhdGUuZXZlbnQgIT0gUE1fRVZFTlRfT04pCisJCWdvdG8gb3V0OworCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmY2hpcC0+cG93ZXJvZmZfd29yayk7CisKKwlpZiAoIXRzbDI1NjNfZ2V0X3Bvd2VyKGNoaXApKSB7CisJCXJldCA9IHRzbDI1NjNfc2V0X3Bvd2VyKGNoaXAsIDEpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJCXJldCA9IHRzbDI1NjNfY29uZmlndXJlKGNoaXApOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJCXRzbDI1NjNfd2FpdF9hZGMoY2hpcCk7CisJfQorCisJd2hpbGUgKHJldHJ5KSB7CisJCXJldCA9IHRzbDI1NjNfcmVhZChjbGllbnQsCisJCQkJICAgVFNMMjU2M19SRUdfREFUQTBMT1cgfCBUU0wyNTYzX0NMRUFSSU5ULAorCQkJCSAgIGJ1ZjAsIHNpemVvZihidWYwKSk7CisJCWlmIChyZXQgIT0gc2l6ZW9mKGJ1ZjApKQorCQkJZ290byBvdXQ7CisKKwkJcmV0ID0gdHNsMjU2M19yZWFkKGNsaWVudCwgVFNMMjU2M19SRUdfREFUQTFMT1csCisJCQkJICAgYnVmMSwgc2l6ZW9mKGJ1ZjEpKTsKKwkJaWYgKHJldCAhPSBzaXplb2YoYnVmMSkpCisJCQlnb3RvIG91dDsKKworCQlhZGMwID0gKGJ1ZjBbMV0gPDwgOCkgKyBidWYwWzBdOworCQlhZGMxID0gKGJ1ZjFbMV0gPDwgOCkgKyBidWYxWzBdOworCisJCXJldHJ5ID0gdHNsMjU2M19hZGp1c3RfZ2FpbmxldmVsKGNoaXAsIGFkYzApOworCX0KKworCWNoaXAtPmRhdGEwID0gbm9ybWFsaXplX2FkYyhhZGMwLCBjaGlwLT5nYWlubGV2ZWwtPmdhaW50aW1lKTsKKwljaGlwLT5kYXRhMSA9IG5vcm1hbGl6ZV9hZGMoYWRjMSwgY2hpcC0+Z2FpbmxldmVsLT5nYWludGltZSk7CisKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNoaXAtPnBvd2Vyb2ZmX3dvcmssIDUgKiBIWik7CisKKwlyZXQgPSAwOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNhbGliX3RvX3N5c2ZzKHUzMiBjYWxpYikKK3sKKwlyZXR1cm4gKGludCkgKCgoY2FsaWIgKiBDQUxJQl9CQVNFX1NZU0ZTKSArCisJCSAgICAgICBDQUxJQl9GUkFDX0hBTEYpID4+IENBTElCX0ZSQUNfQklUUyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGNhbGliX2Zyb21fc3lzZnMoaW50IHZhbHVlKQoreworCXJldHVybiAoKCh1MzIpIHZhbHVlKSA8PCBDQUxJQl9GUkFDX0JJVFMpIC8gQ0FMSUJfQkFTRV9TWVNGUzsKK30KKworLyoKKyAqIENvbnZlcnNpb25zIGJldHdlZW4gbHV4IGFuZCBBREMgdmFsdWVzLgorICoKKyAqIFRoZSBiYXNpYyBmb3JtdWxhIGlzIGx1eCA9IGMwICogYWRjMCAtIGMxICogYWRjMSwgd2hlcmUgYzAgYW5kIGMxIGFyZQorICogYXBwcm9wcmlhdGUgY29uc3RhbnRzLiBEaWZmZXJlbnQgY29uc3RhbnRzIGFyZSBuZWVkZWQgZm9yIGRpZmZlcmVudAorICoga2luZHMgb2YgbGlnaHQsIGRldGVybWluZWQgYnkgdGhlIHJhdGlvIGFkYzEvYWRjMCAoYmFzaWNhbGx5IHRoZSByYXRpbworICogb2YgdGhlIGludGVuc2l0aWVzIGluIGluZnJhcmVkIGFuZCB2aXNpYmxlIHdhdmVsZW5ndGhzKS4gbHV4X3RhYmxlIGJlbG93CisgKiBsaXN0cyB0aGUgdXBwZXIgdGhyZXNob2xkIG9mIHRoZSBhZGMxL2FkYzAgcmF0aW8gYW5kIHRoZSBjb3JyZXNwb25kaW5nCisgKiBjb25zdGFudHMuCisgKi8KKworc3RydWN0IHRzbDI1NjNfbHV4X2NvZWZmIHsKKwl1bnNpZ25lZCBsb25nIGNoX3JhdGlvOworCXVuc2lnbmVkIGxvbmcgY2gwX2NvZWZmOworCXVuc2lnbmVkIGxvbmcgY2gxX2NvZWZmOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0c2wyNTYzX2x1eF9jb2VmZiBsdXhfdGFibGVbXSA9IHsKKwl7CisJCS5jaF9yYXRpbwk9IEZSQUMxMEsoMTMwMCksCisJCS5jaDBfY29lZmYJPSBGUkFDMTBLKDMxNSksCisJCS5jaDFfY29lZmYJPSBGUkFDMTBLKDI2MiksCisJfSwgeworCQkuY2hfcmF0aW8JPSBGUkFDMTBLKDI2MDApLAorCQkuY2gwX2NvZWZmCT0gRlJBQzEwSygzMzcpLAorCQkuY2gxX2NvZWZmCT0gRlJBQzEwSyg0MzApLAorCX0sIHsKKwkJLmNoX3JhdGlvCT0gRlJBQzEwSygzOTAwKSwKKwkJLmNoMF9jb2VmZgk9IEZSQUMxMEsoMzYzKSwKKwkJLmNoMV9jb2VmZgk9IEZSQUMxMEsoNTI5KSwKKwl9LCB7CisJCS5jaF9yYXRpbwk9IEZSQUMxMEsoNTIwMCksCisJCS5jaDBfY29lZmYJPSBGUkFDMTBLKDM5MiksCisJCS5jaDFfY29lZmYJPSBGUkFDMTBLKDYwNSksCisJfSwgeworCQkuY2hfcmF0aW8JPSBGUkFDMTBLKDY1MDApLAorCQkuY2gwX2NvZWZmCT0gRlJBQzEwSygyMjkpLAorCQkuY2gxX2NvZWZmCT0gRlJBQzEwSygyOTEpLAorCX0sIHsKKwkJLmNoX3JhdGlvCT0gRlJBQzEwSyg4MDAwKSwKKwkJLmNoMF9jb2VmZgk9IEZSQUMxMEsoMTU3KSwKKwkJLmNoMV9jb2VmZgk9IEZSQUMxMEsoMTgwKSwKKwl9LCB7CisJCS5jaF9yYXRpbwk9IEZSQUMxMEsoMTMwMDApLAorCQkuY2gwX2NvZWZmCT0gRlJBQzEwSygzNCksCisJCS5jaDFfY29lZmYJPSBGUkFDMTBLKDI2KSwKKwl9LCB7CisJCS5jaF9yYXRpbwk9IFVMT05HX01BWCwKKwkJLmNoMF9jb2VmZgk9IDAsCisJCS5jaDFfY29lZmYJPSAwLAorCX0sCit9OworCisvKgorICogQ29udmVydCBub3JtYWxpemVkLCBzY2FsZWQgQURDIHZhbHVlcyB0byBsdXguCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWRjX3RvX2x1eCh1MzIgYWRjMCwgdTMyIGFkYzEpCit7CisJY29uc3Qgc3RydWN0IHRzbDI1NjNfbHV4X2NvZWZmICpscCA9IGx1eF90YWJsZTsKKwl1bnNpZ25lZCBsb25nIHJhdGlvLCBsdXgsIGNoMCA9IGFkYzAsIGNoMSA9IGFkYzE7CisKKwlyYXRpbyA9IGNoMCA/ICgoY2gxIDw8IEFEQ19GUkFDX0JJVFMpIC8gY2gwKSA6IFVMT05HX01BWDsKKworCXdoaWxlIChscC0+Y2hfcmF0aW8gPCByYXRpbykKKwkJbHArKzsKKworCWx1eCA9IGNoMCAqIGxwLT5jaDBfY29lZmYgLSBjaDEgKiBscC0+Y2gxX2NvZWZmOworCisJcmV0dXJuICh1bnNpZ25lZCBpbnQpIChsdXggPj4gQURDX0ZSQUNfQklUUyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogICAgICAgICAgICAgICAgICAgICAgU3lzZnMgaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHNzaXplX3QgdHNsMjU2M19hZGMwX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB0c2wyNTYzX2NoaXAgKmNoaXAgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjaGlwLT5sb2NrKTsKKworCXJldCA9IHRzbDI1NjNfZ2V0X2FkYyhjaGlwKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGNoaXAtPmRhdGEwKTsKK291dDoKKwltdXRleF91bmxvY2soJmNoaXAtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRzbDI1NjNfYWRjMV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdHNsMjU2M19jaGlwICpjaGlwID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2hpcC0+bG9jayk7CisKKwlyZXQgPSB0c2wyNTYzX2dldF9hZGMoY2hpcCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBjaGlwLT5kYXRhMSk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBBcHBseSBjYWxpYnJhdGlvbiBjb2VmZmljaWVudCB0byBBREMgY291bnQuICovCitzdGF0aWMgdTMyIGNhbGliX2FkYyh1MzIgYWRjLCB1MzIgY2FsaWIpCit7CisJdW5zaWduZWQgbG9uZyBzY2FsZWQgPSBhZGM7CisKKwlzY2FsZWQgKj0gY2FsaWI7CisJc2NhbGVkID4+PSBDQUxJQl9GUkFDX0JJVFM7CisKKwlyZXR1cm4gKHUzMikgc2NhbGVkOworfQorCitzdGF0aWMgc3NpemVfdCB0c2wyNTYzX2x1eF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdHNsMjU2M19jaGlwICpjaGlwID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKwl1MzIgY2FsaWIwLCBjYWxpYjE7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNoaXAtPmxvY2spOworCisJcmV0ID0gdHNsMjU2M19nZXRfYWRjKGNoaXApOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJY2FsaWIwID0gY2FsaWJfYWRjKGNoaXAtPmRhdGEwLCBjaGlwLT5jYWxpYjApICogY2hpcC0+Y292ZXJfY29tcF9nYWluOworCWNhbGliMSA9IGNhbGliX2FkYyhjaGlwLT5kYXRhMSwgY2hpcC0+Y2FsaWIxKSAqIGNoaXAtPmNvdmVyX2NvbXBfZ2FpbjsKKworCXJldCA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGFkY190b19sdXgoY2FsaWIwLCBjYWxpYjEpKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmY2hpcC0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgZm9ybWF0X2NhbGliKGNoYXIgKmJ1ZiwgaW50IGxlbiwgdTMyIGNhbGliKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBjYWxpYl90b19zeXNmcyhjYWxpYikpOworfQorCitzdGF0aWMgc3NpemVfdCB0c2wyNTYzX2NhbGliMF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdHNsMjU2M19jaGlwICpjaGlwID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2hpcC0+bG9jayk7CisJcmV0ID0gZm9ybWF0X2NhbGliKGJ1ZiwgUEFHRV9TSVpFLCBjaGlwLT5jYWxpYjApOworCW11dGV4X3VubG9jaygmY2hpcC0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgdHNsMjU2M19jYWxpYjFfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNoaXAtPmxvY2spOworCXJldCA9IGZvcm1hdF9jYWxpYihidWYsIFBBR0VfU0laRSwgY2hpcC0+Y2FsaWIxKTsKKwltdXRleF91bmxvY2soJmNoaXAtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZG9fY2FsaWJfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4sCisJCQkgIGludCBjaCkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJaW50IHZhbHVlOworCXUzMiBjYWxpYjsKKworCWlmICgxICE9IHNzY2FuZihidWYsICIlZCIsICZ2YWx1ZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJY2FsaWIgPSBjYWxpYl9mcm9tX3N5c2ZzKHZhbHVlKTsKKworCWlmIChjaCkKKwkJY2hpcC0+Y2FsaWIxID0gY2FsaWI7CisJZWxzZQorCQljaGlwLT5jYWxpYjAgPSBjYWxpYjsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRzbDI1NjNfY2FsaWIwX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gZG9fY2FsaWJfc3RvcmUoZGV2LCBidWYsIGxlbiwgMCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRzbDI1NjNfY2FsaWIxX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gZG9fY2FsaWJfc3RvcmUoZGV2LCBidWYsIGxlbiwgMSk7Cit9CisKKy8qIEFtaXRYWFhYOiBDb252ZXJ0IHRvIElJT19ERVZfQVRUUl9MSUdIVCogYXMgaW4gdHNsMjU2MQorICogb25jZSBJIHVuZGVyc3RhbmQgd2hhdCB0aGV5IG1lYW4gKi8KK3N0YXRpYyBERVZJQ0VfQVRUUihhZGMwLCBTX0lSVUdPLCB0c2wyNTYzX2FkYzBfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoYWRjMSwgU19JUlVHTywgdHNsMjU2M19hZGMxX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGx1eCwgU19JUlVHTywgdHNsMjU2M19sdXhfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoY2FsaWIwLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgdHNsMjU2M19jYWxpYjBfc2hvdywgdHNsMjU2M19jYWxpYjBfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGNhbGliMSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIHRzbDI1NjNfY2FsaWIxX3Nob3csIHRzbDI1NjNfY2FsaWIxX3N0b3JlKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnRzbDI1NjNfYXR0cmlidXRlc1tdID0geworCSZkZXZfYXR0cl9hZGMwLmF0dHIsCisJJmRldl9hdHRyX2FkYzEuYXR0ciwKKwkmZGV2X2F0dHJfbHV4LmF0dHIsCisJJmRldl9hdHRyX2NhbGliMC5hdHRyLAorCSZkZXZfYXR0cl9jYWxpYjEuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCB0c2wyNTYzX2dyb3VwID0geworCS5hdHRycyA9IHRzbDI1NjNfYXR0cmlidXRlcywKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogICAgICAgICAgICAgICAgICAgICAgUHJvYmUsIEF0dGFjaCwgUmVtb3ZlICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB0c2wyNTYzX2kyY19kcml2ZXI7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRzbDI1NjNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqZGV2aWNlX2lkKQoreworCXN0cnVjdCB0c2wyNTYzX2NoaXAgKmNoaXA7CisJc3RydWN0IHRzbDI1NjNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCBlcnIgPSAwOworCWludCByZXQ7CisJdTggaWQ7CisKKwljaGlwID0ga3phbGxvYyhzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoaXApCisJCXJldHVybiAtRU5PTUVNOworCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgY2hpcCk7CisJY2hpcC0+Y2xpZW50ID0gY2xpZW50OworCisJZXJyID0gdHNsMjU2M19kZXRlY3QoY2hpcCk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImRldmljZSBub3QgZm91bmQsIGVycm9yICVkIFxuIiwgLWVycik7CisJCWdvdG8gZmFpbDE7CisJfQorCisJZXJyID0gdHNsMjU2M19yZWFkX2lkKGNoaXAsICZpZCk7CisJaWYgKGVycikKKwkJZ290byBmYWlsMTsKKworCW11dGV4X2luaXQoJmNoaXAtPmxvY2spOworCisJLyogRGVmYXVsdCB2YWx1ZXMgdXNlZCB1bnRpbCB1c2Vyc3BhY2Ugc2F5cyBvdGhlcndpc2UgKi8KKwljaGlwLT5sb3dfdGhyZXMgPSAweDA7CisJY2hpcC0+aGlnaF90aHJlcyA9IDB4ZmZmZjsKKwljaGlwLT5nYWlubGV2ZWwgPSB0c2wyNTYzX2dhaW5sZXZlbF90YWJsZTsKKwljaGlwLT5pbnRyID0gVFNMMjU2M19JTlRfUEVSU0lTVCg0KTsKKwljaGlwLT5jYWxpYjAgPSBjYWxpYl9mcm9tX3N5c2ZzKENBTElCX0JBU0VfU1lTRlMpOworCWNoaXAtPmNhbGliMSA9IGNhbGliX2Zyb21fc3lzZnMoQ0FMSUJfQkFTRV9TWVNGUyk7CisKKwlpZiAocGRhdGEpCisJCWNoaXAtPmNvdmVyX2NvbXBfZ2FpbiA9IHBkYXRhLT5jb3Zlcl9jb21wX2dhaW47CisJZWxzZQorCQljaGlwLT5jb3Zlcl9jb21wX2dhaW4gPSAxOworCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAibW9kZWwgJWQsIHJldi4gJWRcbiIsIGlkID4+IDQsIGlkICYgMHgwZik7CisKKwljaGlwLT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCFjaGlwLT5pbmRpb19kZXYpCisJCWdvdG8gZmFpbDE7CisJY2hpcC0+aW5kaW9fZGV2LT5hdHRycyA9ICZ0c2wyNTYzX2dyb3VwOworCWNoaXAtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKKwljaGlwLT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKikoY2hpcCk7CisJY2hpcC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJY2hpcC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoY2hpcC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWwxOworCisJZXJyID0gdHNsMjU2M19jb25maWd1cmUoY2hpcCk7CisJaWYgKGVycikKKwkJZ290byBmYWlsMjsKKworCUlOSVRfREVMQVlFRF9XT1JLKCZjaGlwLT5wb3dlcm9mZl93b3JrLCB0c2wyNTYzX3Bvd2Vyb2ZmX3dvcmspOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2hpcC0+cG93ZXJvZmZfd29yaywgNSAqIEhaKTsKKworCXJldHVybiAwOworZmFpbDI6CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGNoaXAtPmluZGlvX2Rldik7CitmYWlsMToKKwlrZnJlZShjaGlwKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHRzbDI1NjNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGNoaXAtPmluZGlvX2Rldik7CisKKwlrZnJlZShjaGlwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0c2wyNTYzX3N1c3BlbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCB0c2wyNTYzX2NoaXAgKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2hpcC0+bG9jayk7CisKKwlyZXQgPSB0c2wyNTYzX3NldF9wb3dlcihjaGlwLCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWNoaXAtPnN0YXRlID0gc3RhdGU7CisKK291dDoKKwltdXRleF91bmxvY2soJmNoaXAtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdHNsMjU2M19yZXN1bWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgdHNsMjU2M19jaGlwICpjaGlwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNoaXAtPmxvY2spOworCisJcmV0ID0gdHNsMjU2M19zZXRfcG93ZXIoY2hpcCwgMSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSB0c2wyNTYzX2NvbmZpZ3VyZShjaGlwKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWNoaXAtPnN0YXRlLmV2ZW50ID0gUE1fRVZFTlRfT047CisKK291dDoKKwltdXRleF91bmxvY2soJmNoaXAtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB0c2wyNTYzX2lkW10gPSB7CisJeyAidHNsMjU2MCIsIDAgfSwKKwl7ICJ0c2wyNTYxIiwgMSB9LAorCXsgInRzbDI1NjIiLCAyIH0sCisJeyAidHNsMjU2MyIsIDMgfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCB0c2wyNTYzX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHRzbDI1NjNfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQkgPSAidHNsMjU2MyIsCisJfSwKKwkuc3VzcGVuZAk9IHRzbDI1NjNfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHRzbDI1NjNfcmVzdW1lLAorCS5wcm9iZQkJPSB0c2wyNTYzX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AodHNsMjU2M19yZW1vdmUpLAorCS5pZF90YWJsZQk9IHRzbDI1NjNfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0c2wyNTYzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJnRzbDI1NjNfaTJjX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0c2wyNTYzX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmdHNsMjU2M19pMmNfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiTm9raWEgQ29ycG9yYXRpb24iKTsKK01PRFVMRV9ERVNDUklQVElPTigidHNsMjU2MyBsaWdodCBzZW5zb3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHRzbDI1NjNfaW5pdCk7Cittb2R1bGVfZXhpdCh0c2wyNTYzX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyNTYzLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1NjMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTczNjhiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyNTYzLmgKQEAgLTAsMCArMSw5IEBACisjaWZuZGVmIF9fTElOVVhfVFNMMjU2M19ICisjZGVmaW5lIF9fTElOVVhfVFNMMjU2M19ICisKK3N0cnVjdCB0c2wyNTYzX3BsYXRmb3JtX2RhdGEgeworCWludCBjb3Zlcl9jb21wX2dhaW47Cit9OworCisjZW5kaWYgLyogX19MSU5VWF9UU0wyNTYzX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9yaW5nX2dlbmVyaWMuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vcmluZ19nZW5lcmljLmgKaW5kZXggZDkyNjE4OTcuLjkzYjkxYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vcmluZ19nZW5lcmljLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yaW5nX2dlbmVyaWMuaApAQCAtMjUsOSArMjUsMTIgQEAKIAkJCWludCBldmVudF9jb2RlLAogCQkJczY0IHRpbWVzdGFtcCk7CiAvKioKLSAqIGlpb19wdXNoX29yX2VzY2FsbGF0ZV9yaW5nX2V2ZW50KCkgLQllc2NhbGxhdGUgb3IgYWRkIGFzIGFwcHJvcHJpYXRlCisgKiBpaW9fcHVzaF9vcl9lc2NhbGxhdGVfcmluZ19ldmVudCgpIC0JZXNjYWxhdGUgb3IgYWRkIGFzIGFwcHJvcHJpYXRlCisgKiBAcmluZ19idWY6CQlyaW5nIGJ1ZmZlciB0aGF0IGlzIHRoZSBldmVudCBzb3VyY2UKKyAqIEBldmVudF9jb2RlOgkJZXZlbnQgaW5kZW50aWZpY2F0aW9uIGNvZGUKKyAqIEB0aW1lc3RhbXA6CQl0aW1lIG9mIGV2ZW50CiAgKgotICogVHlwaWNhbCB1c2VjYXNlIGlzIHRvIGVzY2FsbGF0ZSBhIDUwJSByaW5nIGZ1bGwgdG8gNzUlIGZ1bGwgaWYgbm9vbmUgaGFzIHlldAorICogVHlwaWNhbCB1c2VjYXNlIGlzIHRvIGVzY2FsYXRlIGEgNTAlIHJpbmcgZnVsbCB0byA3NSUgZnVsbCBpZiBub29uZSBoYXMgeWV0CiAgKiByZWFkIHRoZSBmaXJzdCBldmVudC4gQ2xlYXJseSB0aGUgNTAlIGZ1bGwgaXMgbm8gbG9uZ2VyIG9mIGludGVyZXN0IGluCiAgKiB0eXBpY2FsIHVzZSBjYXNlLgogICoqLwpAQCAtMzcsMTAgKzQwLDYgQEAKIAogLyoqCiAgKiBzdHJ1Y3QgaWlvX3JpbmdfYWNjZXNzX2Z1bmNzIC0gYWNjZXNzIGZ1bmN0aW9ucyBmb3IgcmluZyBidWZmZXJzLgotICogQGNyZWF0ZToJCXBlcmZvcm0gYWxsb2NhdGlvbgotICogQGluaXQ6CQlnZXQgcmluZyBidWZmZXIgcmVhZHkgZm9yIHVzZQotICogQF9leGl0OgkJcmV2ZXJzZSBzdGVwcyBpbiBpbml0Ci0gKiBAX2ZyZWU6CQlkZWFsbG9jYXRlIHJpbmcgYnVmZmVyCiAgKiBAbWFya19pbl91c2U6CXJlZmVyZW5jZSBjb3VudGluZywgdHlwaWNhbGx5IHRvIHByZXZlbnQgbW9kdWxlIHJlbW92YWwKICAqIEB1bm1hcmtfaW5fdXNlOglyZWR1Y2UgcmVmZXJlbmNlIGNvdW50IHdoZW4gbm8gbG9uZ2VyIHVzaW5nIHJpbmcgYnVmZmVyCiAgKiBAc3RvcmVfdG86CQlhY3R1YWxseSBzdG9yZSBzdHVmZiB0byB0aGUgcmluZyBidWZmZXIKQEAgLTYwLDcgKzU5LDcgQEAKICAqCiAgKiBUaGUgcHVycG9zZSBvZiB0aGlzIHN0cnVjdHVyZSBpcyB0byBtYWtlIHRoZSByaW5nIGJ1ZmZlciBlbGVtZW50CiAgKiBtb2R1bGFyIGFzIGV2ZW50IGZvciBhIGdpdmVuIGRyaXZlciwgZGlmZmVyZW50IHVzZWNhc2VzIG1heSByZXF1aXJlCi0gKiBkaWZmZXJlbnQgcmluZyBkZXNpZ25zIChzcGFjZSBlZmZpY2llbmN5IHZzIHNwZWVkIGZvciBleGFtcGxlLgorICogZGlmZmVyZW50IHJpbmcgZGVzaWducyAoc3BhY2UgZWZmaWNpZW5jeSB2cyBzcGVlZCBmb3IgZXhhbXBsZSkuCiAgKgogICogSXQgaXMgd29ydGggbm90aW5nIHRoYXQgYSBnaXZlbiByaW5nIGltcGxlbWVudGF0aW9uIG1heSBvbmx5IHN1cHBvcnQgYSBzbWFsbAogICogcHJvcG9ydGlvbiBvZiB0aGVzZSBmdW5jdGlvbnMuICBUaGUgY29yZSBjb2RlICdzaG91bGQnIGNvcGUgZmluZSB3aXRoIGFueSBvZgpAQCAtOTEsMjMgKzkwLDI1IEBACiAKIC8qKgogICogc3RydWN0IGlpb19yaW5nX2J1ZmZlciAtIGdlbmVyYWwgcmluZyBidWZmZXIgc3RydWN0dXJlCi0gKiBAbGVuZ3RoOgkJW0RFVklDRV1udW1iZXIgb2YgZGF0dW1zIGluIHJpbmcKLSAqIEBicGQ6CQlbREVWSUNFXXNpemUgb2YgaW5kaXZpZHVhbCBkYXR1bSBpbmNsdWRpbmcgdGltZXN0YW1wCi0gKiBAbG9vcGNvdW50OgkJW0lOVEVSTl1udW1iZXIgb2YgdGltZXMgdGhlIHJpbmcgaGFzIGxvb3BlZAotICogQGFjY2Vzc19taW5vcl9uYW1lOglbSU5URVJOXXN0b3JlIG9mIG5hbWUgb2YgdGhlIGFjY2VzcyBjaHJkZXYgbWlub3IgbnVtYmVyCi0gKgkJCXN5c2ZzIGF0dHJpYnV0ZQotICogQGFjY2Vzc19oYW5kbGVyOglbSU5URVJOXWNocmRldiBhY2Nlc3MgaGFuZGxpbmcKLSAqIEBldmVudF9taW5vcl9uYW1lOglbSU5URVJOXXN0b3JlIG9mIG5hbWUgb2YgdGhlIGV2ZW50IGNocmRldiBtaW5vciBudW1iZXIKLSAqCQkJc3lzZnMgYXR0cmlidXRlCi0gKiBAZXZfaW50OgkJW0lOVEVSTl1jaHJkZXYgaW50ZXJmYWNlIGZvciB0aGUgZXZlbnQgY2hyZGV2Ci0gKiBAc2hhcmVkX2V2X3BvaW50ZXI6CVtJTlRFUk5ddGhlIHNoYXJlZCBldmVudCBwb2ludGVyIHRvIGFsbG93IGVzY2FsYXRpb24gb2YKKyAqIEBkZXY6CQlyaW5nIGJ1ZmZlciBkZXZpY2Ugc3RydWN0CisgKiBAYWNjZXNzX2RldjoJCXN5c3RlbSBkZXZpY2Ugc3RydWN0IGZvciB0aGUgY2hyZGV2CisgKiBAaW5kaW9fZGV2OgkJaW5kdXN0cmlhbCBJL08gZGV2aWNlIHN0cnVjdHVyZQorICogQG93bmVyOgkJbW9kdWxlIHRoYXQgb3ducyB0aGUgcmluZyBidWZmZXIgKGZvciByZWYgY291bnRpbmcpCisgKiBAaWQ6CQkJdW5pcXVlIGlkIG51bWJlcgorICogQGFjY2Vzc19pZDoJCWRldmljZSBpZCBudW1iZXIKKyAqIEBsZW5ndGg6CQlbREVWSUNFXSBudW1iZXIgb2YgZGF0dW1zIGluIHJpbmcKKyAqIEBicGQ6CQlbREVWSUNFXSBzaXplIG9mIGluZGl2aWR1YWwgZGF0dW0gaW5jbHVkaW5nIHRpbWVzdGFtcAorICogQGxvb3Bjb3VudDoJCVtJTlRFUk5dIG51bWJlciBvZiB0aW1lcyB0aGUgcmluZyBoYXMgbG9vcGVkCisgKiBAYWNjZXNzX2hhbmRsZXI6CVtJTlRFUk5dIGNocmRldiBhY2Nlc3MgaGFuZGxpbmcKKyAqIEBldl9pbnQ6CQlbSU5URVJOXSBjaHJkZXYgaW50ZXJmYWNlIGZvciB0aGUgZXZlbnQgY2hyZGV2CisgKiBAc2hhcmVkX2V2X3BvaW50ZXI6CVtJTlRFUk5dIHRoZSBzaGFyZWQgZXZlbnQgcG9pbnRlciB0byBhbGxvdyBlc2NhbGF0aW9uIG9mCiAgKgkJCWV2ZW50cwotICogQHJpbmdfYWNjZXNzOglbRFJJVkVSXXJpbmcgYWNjZXNzIGZ1bmN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlCisgKiBAYWNjZXNzOgkJW0RSSVZFUl0gcmluZyBhY2Nlc3MgZnVuY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUKICAqCQkJaW1wbGVtZW50YXRpb24uCi0gKiBAcmluZ19wcmVuYWJsZToJW0RSSVZFUl0gZnVuY3Rpb24gdG8gcnVuIHByaW9yIHRvIG1hcmtpbmcgcmluZyBlbmFibGVkCi0gKiBAcmluZ19wb3N0ZW5hYmxlOglbRFJJVkVSXSBmdW5jdGlvbiB0byBydW4gYWZ0ZXIgbWFya2luZyByaW5nIGVuYWJsZWQKLSAqIEByaW5nX3ByZWRpc2FibGU6CVtEUklWRVJdIGZ1bmN0aW9uIHRvIHJ1biBwcmlvciB0byBtYXJraW5nIHJpbmcgZGlzYWJsZWQKLSAqIEByaW5nX3Bvc3RkaXNhYmxlOglbRFJJVkVSXSBmdW5jdGlvbiB0byBydW4gYWZ0ZXIgbWFya2luZyByaW5nIGRpc2FibGVkCisgKiBAcHJlZW5hYmxlOgkJW0RSSVZFUl0gZnVuY3Rpb24gdG8gcnVuIHByaW9yIHRvIG1hcmtpbmcgcmluZyBlbmFibGVkCisgKiBAcG9zdGVuYWJsZToJCVtEUklWRVJdIGZ1bmN0aW9uIHRvIHJ1biBhZnRlciBtYXJraW5nIHJpbmcgZW5hYmxlZAorICogQHByZWRpc2FibGU6CQlbRFJJVkVSXSBmdW5jdGlvbiB0byBydW4gcHJpb3IgdG8gbWFya2luZyByaW5nIGRpc2FibGVkCisgKiBAcG9zdGRpc2FibGU6CVtEUklWRVJdIGZ1bmN0aW9uIHRvIHJ1biBhZnRlciBtYXJraW5nIHJpbmcgZGlzYWJsZWQKICAgKiovCiBzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyIHsKIAlzdHJ1Y3QgZGV2aWNlIGRldjsKQEAgLTEzMyw3ICsxMzQsMTAgQEAKIAkJCSAgc3RydWN0IGlpb19kZXYgKmRldl9pbmZvKTsKIAogLyoqCi0gKiBfX2lpb19pbml0X3JpbmdfYnVmZmVyKCkgLSBpbml0aWFsaXplIGNvbW1vbiBlbGVtZW50cyBvZiByaW5nIGJ1ZmZlcnMuCisgKiBfX2lpb19pbml0X3JpbmdfYnVmZmVyKCkgLSBpbml0aWFsaXplIGNvbW1vbiBlbGVtZW50cyBvZiByaW5nIGJ1ZmZlcnMKKyAqIEByaW5nOgkJcmluZyBidWZmZXIgdGhhdCBpcyB0aGUgZXZlbnQgc291cmNlCisgKiBAYnl0ZXNfcGVyX2RhdHVtOglzaXplIG9mIGluZGl2aWR1YWwgZGF0dW0gaW5jbHVkaW5nIHRpbWVzdGFtcAorICogQGxlbmd0aDoJCW51bWJlciBvZiBkYXR1bXMgaW4gcmluZwogICoqLwogc3RhdGljIGlubGluZSB2b2lkIF9faWlvX2luaXRfcmluZ19idWZmZXIoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZywKIAkJCQkgaW50IGJ5dGVzX3Blcl9kYXR1bSwgaW50IGxlbmd0aCkKQEAgLTE3MSw3ICsxNzUsMTEgQEAKIAljb250YWluZXJfb2YoX2Rldl9hdHRyLCBzdHJ1Y3QgaWlvX3NjYW5fZWwsIGRldl9hdHRyKTsKIAogLyoqCi0gKiBpaW9fc2Nhbl9lbF9zdG9yZSgpIC0gc3lzZnMgc2NhbiBlbGVtZW50IHNlbGVjdGlvbiBpbnRlcmZhY2UuCisgKiBpaW9fc2Nhbl9lbF9zdG9yZSgpIC0gc3lzZnMgc2NhbiBlbGVtZW50IHNlbGVjdGlvbiBpbnRlcmZhY2UKKyAqIEBkZXY6IHRoZSB0YXJnZXQgZGV2aWNlCisgKiBAYXR0cjogdGhlIGRldmljZSBhdHRyaWJ1dGUgdGhhdCBpcyBiZWluZyBwcm9jZXNzZWQKKyAqIEBidWY6IGlucHV0IGZyb20gdXNlcnNwYWNlCisgKiBAbGVuOiBsZW5ndGggb2YgaW5wdXQKICAqCiAgKiBBIGdlbmVyaWMgZnVuY3Rpb24gdXNlZCB0byBlbmFibGUgdmFyaW91cyBzY2FuIGVsZW1lbnRzLiAgSW4gc29tZQogICogZGV2aWNlcyBleHBsaWNpdCByZWFkIGNvbW1hbmRzIGZvciBlYWNoIGNoYW5uZWwgbWVhbiB0aGlzIGlzIG1lcmVseQpAQCAtMTg0LDEyICsxOTIsMTUgQEAKIAkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKTsKIC8qKgogICogaWlvX3NjYWxfZWxfc2hvdygpIC0Jc3lzZnMgaW50ZXJmYWNlIHRvIHF1ZXJ5IHdoZXRoZXIgYSBzY2FuIGVsZW1lbnQgaXMKLSAqCQkJaXMgZW5hYmxlZCBvciBub3QuCisgKgkJCWlzIGVuYWJsZWQgb3Igbm90CisgKiBAZGV2OiB0aGUgdGFyZ2V0IGRldmljZQorICogQGF0dHI6IHRoZSBkZXZpY2UgYXR0cmlidXRlIHRoYXQgaXMgYmVpbmcgcHJvY2Vzc2VkCisgKiBAYnVmOiBvdXRwdXQgYnVmZmVyCiAgKiovCiBzc2l6ZV90IGlpb19zY2FuX2VsX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCSBjaGFyICpidWYpOwogLyoqCi0gKiBJSU9fU0NBTl9FTDogLSBkZWNsYXJlIGFuZCBpbml0aWFsaXplIGEgc2NhbiBlbGVtZW50IHdpdGhvdXQgY29udHJvbCBmdW5jCisgKiBJSU9fU0NBTl9FTCAtIGRlY2xhcmUgYW5kIGluaXRpYWxpemUgYSBzY2FuIGVsZW1lbnQgd2l0aG91dCBjb250cm9sIGZ1bmMKICAqIEBfbmFtZToJaWRlbnRpZnlpbmcgbmFtZS4gUmVzdWx0aW5nIHN0cnVjdCBpcyBpaW9fc2Nhbl9lbF8jI19uYW1lLAogICoJCXN5c2ZzIGVsZW1lbnQsIHNjYW5fZW5fIyNfbmFtZS4KICAqIEBfbnVtYmVyOgl1bmlxdWUgaWQgbnVtYmVyIGZvciB0aGUgc2NhbiBlbGVtZW50LgpAQCAtMjE0LDggKzIyNSwxNCBAQAogc3NpemVfdCBpaW9fc2Nhbl9lbF90c19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkgICAgY2hhciAqYnVmKTsKIC8qKgotICogSUlPX1NDQU5fRUxfQzogLSBkZWNsYXJlIGFuZCBpbml0aWFsaXplIGEgc2NhbiBlbGVtZW50IHdpdGggYSBjb250cm9sIGZ1bmMKKyAqIElJT19TQ0FOX0VMX0MgLSBkZWNsYXJlIGFuZCBpbml0aWFsaXplIGEgc2NhbiBlbGVtZW50IHdpdGggYSBjb250cm9sIGZ1bmMKICAqCisgKiBAX25hbWU6CWlkZW50aWZ5aW5nIG5hbWUuIFJlc3VsdGluZyBzdHJ1Y3QgaXMgaWlvX3NjYW5fZWxfIyNfbmFtZSwKKyAqCQlzeXNmcyBlbGVtZW50LCBzY2FuX2VuXyMjX25hbWUuCisgKiBAX251bWJlcjoJdW5pcXVlIGlkIG51bWJlciBmb3IgdGhlIHNjYW4gZWxlbWVudC4KKyAqIEBfYml0czoJbnVtYmVyIG9mIGJpdHMgaW4gdGhlIHNjYW4gZWxlbWVudCByZXN1bHQgKHVzZWQgaW4gbWl4ZWQgYml0CisgKgkJbGVuZ3RoIGRldmljZXMpLgorICogQF9sYWJlbDoJaW5kZW50aWZpY2F0aW9uIHZhcmlhYmxlIHVzZWQgYnkgZHJpdmVycy4gIE9mdGVuIGEgcmVnIGFkZHJlc3MuCiAgKiBAX2NvbnRyb2xmdW5jOiBmdW5jdGlvbiB1c2VkIHRvIG5vdGlmeSBoYXJkd2FyZSBvZiB3aGV0aGVyIHN0YXRlIGNoYW5nZXMKICAqKi8KICNkZWZpbmUgSUlPX1NDQU5fRUxfQyhfbmFtZSwgX251bWJlciwgX2JpdHMsIF9sYWJlbCwgX2NvbnRyb2xmdW5jKQlcCkBAIC0yMzAsNyArMjQ3LDcgQEAKIAkJLnNldF9zdGF0ZSA9IF9jb250cm9sZnVuYywJCQkJXAogCX0KIC8qKgotICogSUlPX1NDQU5fRUxfVElNRVNUQU1QOiAtIGRlY2xhcmUgYSBzcGVjaWFsIHNjYW4gZWxlbWVudCBmb3IgdGltZXN0YW1wcworICogSUlPX1NDQU5fRUxfVElNRVNUQU1QIC0gZGVjbGFyZSBhIHNwZWNpYWwgc2NhbiBlbGVtZW50IGZvciB0aW1lc3RhbXBzCiAgKgogICogT2RkIG9uZSBvdXQuIEhhbmRsZWQgc2xpZ2h0bHkgZGlmZmVyZW50bHkgZnJvbSBvdGhlciBzY2FuIGVsZW1lbnRzLgogICoqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9yaW5nX3N3LmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jpbmdfc3cuaAppbmRleCBhZTcwZWUwLi5mMGI4NmYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jpbmdfc3cuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jpbmdfc3cuaApAQCAtMzYsNTIgKzM2LDY1IEBACiAjaWYgZGVmaW5lZCBDT05GSUdfSUlPX1NXX1JJTkcgfHwgZGVmaW5lZCBDT05GSUdfSUlPX1NXX1JJTkdfTU9EVUxFCiAKIC8qKgotICogaWlvX2NyZWF0ZV9zd19yYigpIHNvZnR3YXJlIHJpbmcgYnVmZmVyIGFsbG9jYXRpb24KKyAqIGlpb19jcmVhdGVfc3dfcmIoKSAtIHNvZnR3YXJlIHJpbmcgYnVmZmVyIGFsbG9jYXRpb24KICAqIEByOgkJcG9pbnRlciB0byByaW5nIGJ1ZmZlciBwb2ludGVyCiAgKiovCiBpbnQgaWlvX2NyZWF0ZV9zd19yYihzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICoqcik7CiAKIC8qKgotICogaWlvX2luaXRfc3dfcmIoKSBpbml0aWFsaXplIHRoZSBzb2Z0d2FyZSByaW5nIGJ1ZmZlcgorICogaWlvX2luaXRfc3dfcmIoKSAtIGluaXRpYWxpemUgdGhlIHNvZnR3YXJlIHJpbmcgYnVmZmVyCiAgKiBAcjoJCXBvaW50ZXIgdG8gYSBzb2Z0d2FyZSByaW5nIGJ1ZmZlciBjcmVhdGVkIGJ5IGFuCi0gKgkJaWlvX2NyZWF0ZV9zd19yYiBjYWxsLgorICoJCWlpb19jcmVhdGVfc3dfcmIgY2FsbAorICogQGluZGlvX2RldjoJCWluZHVzdHJpYWwgSS9PIGRldmljZSBzdHJ1Y3R1cmUKICAqKi8KIGludCBpaW9faW5pdF9zd19yYihzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyLCBzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKKwogLyoqCi0gKiBpaW9fZXhpdF9zd19yYigpIHJldmVyc2Ugd2hhdCB3YXMgZG9uZSBpbiBpaW9faW5pdF9zd19yYgorICogaWlvX2V4aXRfc3dfcmIoKSAtIHJldmVyc2Ugd2hhdCB3YXMgZG9uZSBpbiBpaW9faW5pdF9zd19yYgorICogQHI6CQlwb2ludGVyIHRvIGEgc29mdHdhcmUgcmluZyBidWZmZXIgY3JlYXRlZCBieSBhbgorICoJCWlpb19jcmVhdGVfc3dfcmIgY2FsbAogICoqLwogdm9pZCBpaW9fZXhpdF9zd19yYihzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyKTsKIAogLyoqCi0gKiBpaW9fZnJlZV9zd19yYigpIGZyZWUgbWVtb3J5IG9jY3VwaWVkIGJ5IHRoZSBjb3JlIHJpbmcgYnVmZmVyIHN0cnVjdAorICogaWlvX2ZyZWVfc3dfcmIoKSAtIGZyZWUgbWVtb3J5IG9jY3VwaWVkIGJ5IHRoZSBjb3JlIHJpbmcgYnVmZmVyIHN0cnVjdAorICogQHI6CQlwb2ludGVyIHRvIGEgc29mdHdhcmUgcmluZyBidWZmZXIgY3JlYXRlZCBieSBhbgorICoJCWlpb19jcmVhdGVfc3dfcmIgY2FsbAogICoqLwogdm9pZCBpaW9fZnJlZV9zd19yYihzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyKTsKIAogLyoqCi0gKiBpaW9fbWFya19zd19yYl9pbl91c2UoKSByZWZlcmVuY2UgY291bnRpbmcgdG8gcHJldmVudCBpbmNvcnJlY3QgY2hhbmNlcworICogaWlvX21hcmtfc3dfcmJfaW5fdXNlKCkgLSByZWZlcmVuY2UgY291bnRpbmcgdG8gcHJldmVudCBpbmNvcnJlY3QgY2hhbmNlcworICogQHI6CQlwb2ludGVyIHRvIGEgc29mdHdhcmUgcmluZyBidWZmZXIgY3JlYXRlZCBieSBhbgorICoJCWlpb19jcmVhdGVfc3dfcmIgY2FsbAogICoqLwogdm9pZCBpaW9fbWFya19zd19yYl9pbl91c2Uoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcik7CiAKIC8qKgotICogIGlpb191bm1hcmtfc3dfcmJfaW5fdXNlKCkgbm90aWZ5IHRoZSByaW5nIGJ1ZmZlciB0aGF0IHdlIGRvbid0IGNhcmUgYW55bW9yZQorICogIGlpb191bm1hcmtfc3dfcmJfaW5fdXNlKCkgLSBub3RpZnkgdGhlIHJpbmcgYnVmZmVyIHRoYXQgd2UgZG9uJ3QgY2FyZSBhbnltb3JlCisgKiBAcjoJCXBvaW50ZXIgdG8gYSBzb2Z0d2FyZSByaW5nIGJ1ZmZlciBjcmVhdGVkIGJ5IGFuCisgKgkJaWlvX2NyZWF0ZV9zd19yYiBjYWxsCiAgKiovCiB2b2lkIGlpb191bm1hcmtfc3dfcmJfaW5fdXNlKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnIpOwogCiAvKioKLSAqIGlpb19yZWFkX2xhc3RfZnJvbV9zd19yYigpIGF0dGVtcHQgdG8gcmVhZCB0aGUgbGFzdCBzdG9yZWQgZGF0dW0gZnJvbSB0aGUgcmIKKyAqIGlpb19yZWFkX2xhc3RfZnJvbV9zd19yYigpIC0gYXR0ZW1wdCB0byByZWFkIHRoZSBsYXN0IHN0b3JlZCBkYXR1bSBmcm9tIHRoZSByYgorICogQHI6CQlwb2ludGVyIHRvIGEgc29mdHdhcmUgcmluZyBidWZmZXIgY3JlYXRlZCBieSBhbgorICoJCWlpb19jcmVhdGVfc3dfcmIgY2FsbAorICogQGRhdGE6CXdoZXJlIHRvIHN0b3JlIHRoZSBsYXN0IGRhdHVtCiAgKiovCiBpbnQgaWlvX3JlYWRfbGFzdF9mcm9tX3N3X3JiKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnIsIHU4ICpkYXRhKTsKIAogLyoqCi0gKiBpaW9fc3RvcmVfdG9fc3dfcmIoKSBzdG9yZSBhIG5ldyBkYXR1bSB0byB0aGUgcmluZyBidWZmZXIKLSAqIEByYjoJcG9pbnRlciB0byByaW5nIGJ1ZmZlciBpbnN0YW5jZQotICogQGRhdGE6CXRoZSBkYXR1bSB0byBiZSBzdG9yZWQgaW5jbHVkaW5nIHRpbWVzdGFtcCBpZiByZWxldmFudC4KLSAqIEB0aW1lc3RhbXA6CXRpbWVzdGFtcCB3aGljaCB3aWxsIGJlIGF0dGFjaGVkIHRvIGJ1ZmZlciBldmVudHMgaWYgcmVsZXZhbnQuCisgKiBpaW9fc3RvcmVfdG9fc3dfcmIoKSAtIHN0b3JlIGEgbmV3IGRhdHVtIHRvIHRoZSByaW5nIGJ1ZmZlcgorICogQHI6CQlwb2ludGVyIHRvIHJpbmcgYnVmZmVyIGluc3RhbmNlCisgKiBAZGF0YToJdGhlIGRhdHVtIHRvIGJlIHN0b3JlZCBpbmNsdWRpbmcgdGltZXN0YW1wIGlmIHJlbGV2YW50CisgKiBAdGltZXN0YW1wOgl0aW1lc3RhbXAgd2hpY2ggd2lsbCBiZSBhdHRhY2hlZCB0byBidWZmZXIgZXZlbnRzIGlmIHJlbGV2YW50CiAgKiovCiBpbnQgaWlvX3N0b3JlX3RvX3N3X3JiKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnIsIHU4ICpkYXRhLCBzNjQgdGltZXN0YW1wKTsKIAogLyoqCi0gKiBpaW9fcmlwX3N3X3JiKCkgYXR0ZW1wdCB0byByZWFkIGRhdGEgZnJvbSB0aGUgcmluZyBidWZmZXIKKyAqIGlpb19yaXBfc3dfcmIoKSAtIGF0dGVtcHQgdG8gcmVhZCBkYXRhIGZyb20gdGhlIHJpbmcgYnVmZmVyCiAgKiBAcjoJCQlyaW5nIGJ1ZmZlciBpbnN0YW5jZQogICogQGNvdW50OgkJbnVtYmVyIG9mIGRhdHVtJ3MgdG8gdHJ5IGFuZCByZWFkCiAgKiBAZGF0YToJCXdoZXJlIHRoZSBkYXRhIHdpbGwgYmUgc3RvcmVkLgpAQCAtOTQsMzggKzEwNyw1MyBAQAogCQkgIGludCAqZGVhZF9vZmZzZXQpOwogCiAvKioKLSAqIGlpb19yZXF1ZXN0X3VwZGF0ZV9zd19yYigpIHVwZGF0ZSBwYXJhbXMgaWYgdXBkYXRlIG5lZWRlZAorICogaWlvX3JlcXVlc3RfdXBkYXRlX3N3X3JiKCkgLSB1cGRhdGUgcGFyYW1zIGlmIHVwZGF0ZSBuZWVkZWQKKyAqIEByOgkJcG9pbnRlciB0byBhIHNvZnR3YXJlIHJpbmcgYnVmZmVyIGNyZWF0ZWQgYnkgYW4KKyAqCQlpaW9fY3JlYXRlX3N3X3JiIGNhbGwKICAqKi8KIGludCBpaW9fcmVxdWVzdF91cGRhdGVfc3dfcmIoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcik7CiAKIC8qKgotICogaWlvX21hcmtfdXBkYXRlX25lZWRlZF9zd19yYigpIHRlbGwgdGhlIHJpbmcgYnVmZmVyIGl0IG5lZWRzIGEgcGFyYW0gdXBkYXRlCisgKiBpaW9fbWFya191cGRhdGVfbmVlZGVkX3N3X3JiKCkgLSB0ZWxsIHRoZSByaW5nIGJ1ZmZlciBpdCBuZWVkcyBhIHBhcmFtIHVwZGF0ZQorICogQHI6CQlwb2ludGVyIHRvIGEgc29mdHdhcmUgcmluZyBidWZmZXIgY3JlYXRlZCBieSBhbgorICoJCWlpb19jcmVhdGVfc3dfcmIgY2FsbAogICoqLwogaW50IGlpb19tYXJrX3VwZGF0ZV9uZWVkZWRfc3dfcmIoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcik7CiAKIAogLyoqCi0gKiBpaW9fZ2V0X2JwZF9zd19yYigpIGdldCB0aGUgZGF0dW0gc2l6ZSBpbiBieXRlcworICogaWlvX2dldF9icGRfc3dfcmIoKSAtIGdldCB0aGUgZGF0dW0gc2l6ZSBpbiBieXRlcworICogQHI6CQlwb2ludGVyIHRvIGEgc29mdHdhcmUgcmluZyBidWZmZXIgY3JlYXRlZCBieSBhbgorICoJCWlpb19jcmVhdGVfc3dfcmIgY2FsbAogICoqLwogaW50IGlpb19nZXRfYnBkX3N3X3JiKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnIpOwogCiAvKioKLSAqIGlpb19zZXRfYnBkX3N3X3JiKCkgc2V0IHRoZSBkYXR1bSBzaXplIGluIGJ5dGVzCisgKiBpaW9fc2V0X2JwZF9zd19yYigpIC0gc2V0IHRoZSBkYXR1bSBzaXplIGluIGJ5dGVzCisgKiBAcjoJCXBvaW50ZXIgdG8gYSBzb2Z0d2FyZSByaW5nIGJ1ZmZlciBjcmVhdGVkIGJ5IGFuCisgKgkJaWlvX2NyZWF0ZV9zd19yYiBjYWxsCisgKiBAYnBkOglieXRlcyBwZXIgZGF0dW0gdmFsdWUKICAqKi8KIGludCBpaW9fc2V0X2JwZF9zd19yYihzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyLCBzaXplX3QgYnBkKTsKIAogLyoqCi0gKiBpaW9fZ2V0X2xlbmd0aF9zd19yYigpIGdldCBob3cgbWFueSBkYXR1bXMgdGhlIHJiIG1heSBjb250YWluCisgKiBpaW9fZ2V0X2xlbmd0aF9zd19yYigpIC0gZ2V0IGhvdyBtYW55IGRhdHVtcyB0aGUgcmIgbWF5IGNvbnRhaW4KKyAqIEByOgkJcG9pbnRlciB0byBhIHNvZnR3YXJlIHJpbmcgYnVmZmVyIGNyZWF0ZWQgYnkgYW4KKyAqCQlpaW9fY3JlYXRlX3N3X3JiIGNhbGwKICAqKi8KIGludCBpaW9fZ2V0X2xlbmd0aF9zd19yYihzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyKTsKIAogLyoqCi0gKiBpaW9fc2V0X2xlbmd0aF9zd19yYigpIHNldCBob3cgbWFueSBkYXR1bXMgdGhlIHJiIG1heSBjb250YWluCisgKiBpaW9fc2V0X2xlbmd0aF9zd19yYigpIC0gc2V0IGhvdyBtYW55IGRhdHVtcyB0aGUgcmIgbWF5IGNvbnRhaW4KKyAqIEByOgkJcG9pbnRlciB0byBhIHNvZnR3YXJlIHJpbmcgYnVmZmVyIGNyZWF0ZWQgYnkgYW4KKyAqCQlpaW9fY3JlYXRlX3N3X3JiIGNhbGwKKyAqIEBsZW5ndGg6CW1heCBudW1iZXIgb2YgZGF0YSBpdGVtcyBmb3IgdGhlIHJpbmcgYnVmZmVyCiAgKiovCiBpbnQgaWlvX3NldF9sZW5ndGhfc3dfcmIoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqciwgaW50IGxlbmd0aCk7CiAKIC8qKgotICogaWlvX3Jpbmdfc3dfcmVnaXN0ZXJfZnVuY3MoKSBoZWxwZXIgZnVuY3Rpb24gdG8gc2V0IHVwIHJiIGFjY2VzcworICogaWlvX3Jpbmdfc3dfcmVnaXN0ZXJfZnVuY3MoKSAtIGhlbHBlciBmdW5jdGlvbiB0byBzZXQgdXAgcmIgYWNjZXNzCisgKiBAcmE6CQlwb2ludGVyIHRvIEBpaW9fcmluZ19hY2Nlc3NfZnVuY3MKICAqKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBpaW9fcmluZ19zd19yZWdpc3Rlcl9mdW5jcyhzdHJ1Y3QgaWlvX3JpbmdfYWNjZXNzX2Z1bmNzICpyYSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vc3lzZnMuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vc3lzZnMuaAppbmRleCBiZmU0MDU1Li5lNTAxZTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3N5c2ZzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9zeXNmcy5oCkBAIC0xNSw3ICsxNSw3IEBACiAjaW5jbHVkZSAiaWlvLmgiCiAKIC8qKgotICogc3RydWN0IGlpb19ldmVudF9hdHRyaWJ1dGUgLSBldmVudCBjb250cm9sIGF0dHJpYnV0ZQorICogc3RydWN0IGlpb19ldmVudF9hdHRyIC0gZXZlbnQgY29udHJvbCBhdHRyaWJ1dGUKICAqIEBkZXZfYXR0cjoJdW5kZXJseWluZyBkZXZpY2UgYXR0cmlidXRlCiAgKiBAbWFzazoJbWFzayBmb3IgdGhlIGV2ZW50IHdoZW4gZGV0ZWN0aW5nCiAgKiBAbGlzdGVsOglsaXN0IGhlYWRlciB0byBhbGxvdyBhZGRpdGlvbiB0byBsaXN0IG9mIGV2ZW50IGhhbmRsZXJzCkBAIC01NCw2ICs1NCw3IEBACiAgKiBzdHJ1Y3QgaWlvX2Rldl9hdHRyIC0gaWlvIHNwZWNpZmljIGRldmljZSBhdHRyaWJ1dGUKICAqIEBkZXZfYXR0cjoJdW5kZXJseWluZyBkZXZpY2UgYXR0cmlidXRlCiAgKiBAYWRkcmVzczoJYXNzb2NpYXRlZCByZWdpc3RlciBhZGRyZXNzCisgKiBAdmFsMjoJc2Vjb25kYXJ5IGF0dHJpYnV0ZSB2YWx1ZQogICovCiBzdHJ1Y3QgaWlvX2Rldl9hdHRyIHsKIAlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cjsKQEAgLTcxLDYgKzcyLDggQEAKIC8qKgogICogc3RydWN0IGlpb19jb25zdF9hdHRyIC0gY29uc3RhbnQgZGV2aWNlIHNwZWNpZmljIGF0dHJpYnV0ZQogICogICAgICAgICAgICAgICAgICAgICAgICAgb2Z0ZW4gdXNlZCBmb3IgdGhpbmdzIGxpa2UgYXZhaWxhYmxlIG1vZGVzCisgKiBAc3RyaW5nOglhdHRyaWJ1dGUgc3RyaW5nCisgKiBAZGV2X2F0dHI6CXVuZGVybHlpbmcgZGV2aWNlIGF0dHJpYnV0ZQogICovCiBzdHJ1Y3QgaWlvX2NvbnN0X2F0dHIgewogCWNvbnN0IGNoYXIgKnN0cmluZzsKQEAgLTgwLDcgKzgzLDcgQEAKICNkZWZpbmUgdG9faWlvX2NvbnN0X2F0dHIoX2Rldl9hdHRyKSBcCiAJY29udGFpbmVyX29mKF9kZXZfYXR0ciwgc3RydWN0IGlpb19jb25zdF9hdHRyLCBkZXZfYXR0cikKIAotLyogU29tZSBhdHRyaWJ1dGVzIHdpbGwgYmUgaGFyZCBjb2RlZCAoZGV2aWNlIGRlcGVuZGFudCkgYW5kIG5vdCByZXF1aXJlIGFuCisvKiBTb21lIGF0dHJpYnV0ZXMgd2lsbCBiZSBoYXJkIGNvZGVkIChkZXZpY2UgZGVwZW5kZW50KSBhbmQgbm90IHJlcXVpcmUgYW4KICAgIGFkZHJlc3MsIGluIHRoZXNlIGNhc2VzIHBhc3MgYSBuZWdhdGl2ZSAqLwogI2RlZmluZSBJSU9fQVRUUihfbmFtZSwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQkJXAogCXsgLmRldl9hdHRyID0gX19BVFRSKF9uYW1lLCBfbW9kZSwgX3Nob3csIF9zdG9yZSksCVwKQEAgLTEwOCwxMDIgKzExMSwxMzAgQEAKIC8qIEdlbmVyaWMgYXR0cmlidXRlcyBvZiBvbmV0eXBlIG9yIGFub3RoZXIgKi8KIAogLyoqCi0gKiBJSU9fREVWX0FUVFJfUkVHOiByZXZpc2lvbiBudW1iZXIgZm9yIHRoZSBkZXZpY2UKKyAqIElJT19ERVZfQVRUUl9SRVYgLSByZXZpc2lvbiBudW1iZXIgZm9yIHRoZSBkZXZpY2UKKyAqIEBfc2hvdzogb3V0cHV0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZQogICoKICAqIFZlcnkgbXVjaCBkZXZpY2UgZGVwZW5kZW50LgogICoqLwogI2RlZmluZSBJSU9fREVWX0FUVFJfUkVWKF9zaG93KQkJCVwKIAlJSU9fREVWSUNFX0FUVFIocmV2aXNpb24sIFNfSVJVR08sIF9zaG93LCBOVUxMLCAwKQorCiAvKioKLSAqIElJT19ERVZfQVRUUl9OQU1FOiBjaGlwIHR5cGUgZGVwZW5kYW50IGlkZW50aWZpZXIKKyAqIElJT19ERVZfQVRUUl9OQU1FIC0gY2hpcCB0eXBlIGRlcGVuZGVudCBpZGVudGlmaWVyCisgKiBAX3Nob3c6IG91dHB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKICAqKi8KICNkZWZpbmUgSUlPX0RFVl9BVFRSX05BTUUoX3Nob3cpCQkJCVwKIAlJSU9fREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCiAKIC8qKgotICogSUlPX0RFVl9BVFRSX1NBTVBfRlJFUTogc2V0cyBhbnkgaW50ZXJuYWwgY2xvY2sgZnJlcXVlbmN5CisgKiBJSU9fREVWX0FUVFJfU0FNUF9GUkVRIC0gc2V0cyBhbnkgaW50ZXJuYWwgY2xvY2sgZnJlcXVlbmN5CisgKiBAX21vZGU6IHN5c2ZzIGZpbGUgbW9kZS9wZXJtaXNzaW9ucworICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCisgKiBAX3N0b3JlOiBpbnB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKICAqKi8KICNkZWZpbmUgSUlPX0RFVl9BVFRSX1NBTVBfRlJFUShfbW9kZSwgX3Nob3csIF9zdG9yZSkJCQlcCiAJSUlPX0RFVklDRV9BVFRSKHNhbXBsaW5nX2ZyZXF1ZW5jeSwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCiAKIC8qKgotICogSUlPX0RFVl9BVFRSX0FWQUlMX1NBTVBfRlJFUTogbGlzdCBhdmFpbGFibGUgc2FtcGxpbmcgZnJlcXVlbmNpZXMuCisgKiBJSU9fREVWX0FUVFJfQVZBSUxfU0FNUF9GUkVRIC0gbGlzdCBhdmFpbGFibGUgc2FtcGxpbmcgZnJlcXVlbmNpZXMKKyAqIEBfc2hvdzogb3V0cHV0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZQogICoKLSAqIE1heSBiZSBtb2RlIGRlcGVuZGFudCBvbiBzb21lIGRldmljZXMKKyAqIE1heSBiZSBtb2RlIGRlcGVuZGVudCBvbiBzb21lIGRldmljZXMKICAqKi8KICNkZWZpbmUgSUlPX0RFVl9BVFRSX0FWQUlMX1NBTVBfRlJFUShfc2hvdykJCQkJXAogCUlJT19ERVZJQ0VfQVRUUihhdmFpbGFibGVfc2FtcGxpbmdfZnJlcXVlbmN5LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKIAogLyoqCi0gKiBJSU9fREVWX0FUVFJfQ09OU1RfQVZBSUxfU0FNUF9GUkVROiBsaXN0IGF2YWlsYWJsZSBzYW1wbGluZyBmcmVxdWVuY2llcy4KKyAqIElJT19DT05TVF9BVFRSX0FWQUlMX1NBTVBfRlJFUSAtIGxpc3QgYXZhaWxhYmxlIHNhbXBsaW5nIGZyZXF1ZW5jaWVzCisgKiBAX3N0cmluZzogZnJlcXVlbmN5IHN0cmluZyBmb3IgdGhlIGF0dHJpYnV0ZQogICoKICAqIENvbnN0YW50IHZlcnNpb24KICAqKi8KICNkZWZpbmUgSUlPX0NPTlNUX0FUVFJfQVZBSUxfU0FNUF9GUkVRKF9zdHJpbmcpCVwKIAlJSU9fQ09OU1RfQVRUUihhdmFpbGFibGVfc2FtcGxpbmdfZnJlcXVlbmN5LCBfc3RyaW5nKQorCiAvKioKLSAqIElJT19ERVZfQVRUUl9TQ0FOX01PREU6IHNlbGVjdCBhIHNjYW4gbW9kZQorICogSUlPX0RFVl9BVFRSX1NDQU5fTU9ERSAtIHNlbGVjdCBhIHNjYW4gbW9kZQorICogQF9tb2RlOiBzeXNmcyBmaWxlIG1vZGUvcGVybWlzc2lvbnMKKyAqIEBfc2hvdzogb3V0cHV0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZQorICogQF9zdG9yZTogaW5wdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCiAgKgogICogVGhpcyBpcyB1c2VkIHdoZW4gb25seSBjZXJ0YWluIGNvbWJpbmF0aW9ucyBvZiBpbnB1dHMgbWF5IGJlIHJlYWQgaW4gb25lCiAgKiBzY2FuLgogICoqLwogI2RlZmluZSBJSU9fREVWX0FUVFJfU0NBTl9NT0RFKF9tb2RlLCBfc2hvdywgX3N0b3JlKQkJXAogCUlJT19ERVZJQ0VfQVRUUihzY2FuX21vZGUsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQorCiAvKioKLSAqIElJT19ERVZfQVRUUl9BVkFJTF9TQ0FOX01PREVTOiBsaXN0IGF2YWlsYWJsZSBzY2FuIG1vZGVzCisgKiBJSU9fREVWX0FUVFJfQVZBSUxfU0NBTl9NT0RFUyAtIGxpc3QgYXZhaWxhYmxlIHNjYW4gbW9kZXMKKyAqIEBfc2hvdzogb3V0cHV0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZQogICoqLwogI2RlZmluZSBJSU9fREVWX0FUVFJfQVZBSUxfU0NBTl9NT0RFUyhfc2hvdykJCQkJXAogCUlJT19ERVZJQ0VfQVRUUihhdmFpbGFibGVfc2Nhbl9tb2RlcywgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCiAKIC8qKgotICogSUlPX0RFVl9BVFRSX1NDQU46IHJlc3VsdCBvZiBzY2FuIG9mIG11bHRpcGxlIGNoYW5uZWxzCisgKiBJSU9fREVWX0FUVFJfU0NBTiAtIHJlc3VsdCBvZiBzY2FuIG9mIG11bHRpcGxlIGNoYW5uZWxzCisgKiBAX3Nob3c6IG91dHB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKICAqKi8KICNkZWZpbmUgSUlPX0RFVl9BVFRSX1NDQU4oX3Nob3cpCQlcCiAJSUlPX0RFVklDRV9BVFRSKHNjYW4sIFNfSVJVR08sIF9zaG93LCBOVUxMLCAwKTsKIAogLyoqCi0gKiBJSU9fREVWX0FUVFJfSU5QVVQ6IGRpcmVjdCByZWFkIG9mIGEgc2luZ2xlIGlucHV0IGNoYW5uZWwKKyAqIElJT19ERVZfQVRUUl9JTlBVVCAtIGRpcmVjdCByZWFkIG9mIGEgc2luZ2xlIGlucHV0IGNoYW5uZWwKKyAqIEBfbnVtYmVyOiBpbnB1dCBjaGFubmVsIG51bWJlcgorICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCiAgKiovCiAjZGVmaW5lIElJT19ERVZfQVRUUl9JTlBVVChfbnVtYmVyLCBfc2hvdykJCQkJXAogCUlJT19ERVZJQ0VfQVRUUihpbiMjX251bWJlciwgU19JUlVHTywgX3Nob3csIE5VTEwsIF9udW1iZXIpCiAKLQogLyoqCi0gKiBJSU9fREVWX0FUVFJfU1dfUklOR19FTkFCTEU6IGVuYWJsZSBzb2Z0d2FyZSByaW5nIGJ1ZmZlcgorICogSUlPX0RFVl9BVFRSX1NXX1JJTkdfRU5BQkxFIC0gZW5hYmxlIHNvZnR3YXJlIHJpbmcgYnVmZmVyCisgKiBAX3Nob3c6IG91dHB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKKyAqIEBfc3RvcmU6IGlucHV0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZQogICoKLSAqIFN1Y2Nlc3MgbWF5IGJlIGRlcGVuZGFudCBvbiBhdHRhY2htZW50IG9mIHRyaWdnZXIgcHJldmlvdXNseQorICogU3VjY2VzcyBtYXkgYmUgZGVwZW5kZW50IG9uIGF0dGFjaG1lbnQgb2YgdHJpZ2dlciBwcmV2aW91c2x5LgogICoqLwogI2RlZmluZSBJSU9fREVWX0FUVFJfU1dfUklOR19FTkFCTEUoX3Nob3csIF9zdG9yZSkJCQlcCiAJSUlPX0RFVklDRV9BVFRSKHN3X3JpbmdfZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwgX3Nob3csIF9zdG9yZSwgMCkKIAogLyoqCi0gKiBJSU9fREVWX0FUVFJfSFdfUklOR19FTkFCTEU6IGVuYWJsZSBoYXJkd2FyZSByaW5nIGJ1ZmZlcgorICogSUlPX0RFVl9BVFRSX0hXX1JJTkdfRU5BQkxFIC0gZW5hYmxlIGhhcmR3YXJlIHJpbmcgYnVmZmVyCisgKiBAX3Nob3c6IG91dHB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKKyAqIEBfc3RvcmU6IGlucHV0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZQogICoKLSAqIFRoaXMgaXMgYSBkaWZmZXJlbnQgYXR0cmlidXRlIGZyb20gdGhlIHNvZnR3YXJlIG9uZSBhcyBvbmUgY2FuIGludmlzaW9uCisgKiBUaGlzIGlzIGEgZGlmZmVyZW50IGF0dHJpYnV0ZSBmcm9tIHRoZSBzb2Z0d2FyZSBvbmUgYXMgb25lIGNhbiBlbnZpc2lvbgogICogc2NoZW1lcyB3aGVyZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28gbWF5IGJlIHVzZWQuCiAgKiovCiAjZGVmaW5lIElJT19ERVZfQVRUUl9IV19SSU5HX0VOQUJMRShfc2hvdywgX3N0b3JlKQkJCVwKIAlJSU9fREVWSUNFX0FUVFIoaHdfcmluZ19lbmFibGUsIFNfSVJVR08gfCBTX0lXVVNSLCBfc2hvdywgX3N0b3JlLCAwKQogCiAvKioKLSAqIElJT19ERVZfQVRUUl9CUFNFOiBzZXQgbnVtYmVyIG9mIGJpdHMgcGVyIHNjYW4gZWxlbWVudAorICogSUlPX0RFVl9BVFRSX0JQU0UgLSBzZXQgbnVtYmVyIG9mIGJpdHMgcGVyIHNjYW4gZWxlbWVudAorICogQF9tb2RlOiBzeXNmcyBmaWxlIG1vZGUvcGVybWlzc2lvbnMKKyAqIEBfc2hvdzogb3V0cHV0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZQorICogQF9zdG9yZTogaW5wdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCiAgKiovCiAjZGVmaW5lIElJT19ERVZfQVRUUl9CUFNFKF9tb2RlLCBfc2hvdywgX3N0b3JlKQkJXAogCUlJT19ERVZJQ0VfQVRUUihicHNlLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKIAogLyoqCi0gKiBJSU9fREVWX0FUVFJfQlBTRV9BVkFJTEFCTEU6IG5vIG9mIGJpdHMgcGVyIHNjYW4gZWxlbWVudCBzdXBwb3J0ZWQKKyAqIElJT19ERVZfQVRUUl9CUFNFX0FWQUlMQUJMRSAtIG51bWJlciBvZiBiaXRzIHBlciBzY2FuIGVsZW1lbnQgc3VwcG9ydGVkCisgKiBAX3Nob3c6IG91dHB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKICAqKi8KICNkZWZpbmUgSUlPX0RFVl9BVFRSX0JQU0VfQVZBSUxBQkxFKF9zaG93KQkJCQlcCiAJSUlPX0RFVklDRV9BVFRSKGJwc2VfYXZhaWxhYmxlLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKIAogLyoqCi0gKiBJSU9fREVWX0FUVFJfVEVNUDogbWFueSBzZW5zb3JzIGhhdmUgYXV4aWxpYXJ5IHRlbXBlcmF0dXJlIHNlbnNvcnMKKyAqIElJT19ERVZfQVRUUl9URU1QIC0gbWFueSBzZW5zb3JzIGhhdmUgYXV4aWxpYXJ5IHRlbXBlcmF0dXJlIHNlbnNvcnMKKyAqIEBfc2hvdzogb3V0cHV0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZQogICoqLwogI2RlZmluZSBJSU9fREVWX0FUVFJfVEVNUChfc2hvdykJCQlcCiAJSUlPX0RFVklDRV9BVFRSKHRlbXAsIFNfSVJVR08sIF9zaG93LCBOVUxMLCAwKQorCiAvKioKLSAqIElJT19FVkVOVF9TSDogZ2VuZXJpYyBzaGFyZWQgZXZlbnQgaGFuZGxlcgorICogSUlPX0VWRU5UX1NIIC0gZ2VuZXJpYyBzaGFyZWQgZXZlbnQgaGFuZGxlcgorICogQF9uYW1lOiBldmVudCBuYW1lCisgKiBAX2hhbmRsZXI6IGhhbmRsZXIgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCiAgKgogICogVGhpcyBpcyB1c2VkIGluIGNhc2VzIHdoZXJlIG1vcmUgdGhhbiBvbmUgZXZlbnQgbWF5IHJlc3VsdCBmcm9tIGEgc2luZ2xlCiAgKiBoYW5kbGVyLiAgT2Z0ZW4gdGhlIGNhc2UgdGhhdCBzb21lIGFsYXJtIHJlZ2lzdGVyIG11c3QgYmUgcmVhZCBhbmQgbXVsdGlwbGUKQEAgLTIyMSw4ICsyNTIsMTQgQEAKIAkJCS5wcmV2ID0gJmlpb19ldmVudF8jI19uYW1lLmxpc3QsCQlcCiAJCX0sCQkJCQkJCVwKIAl9OworCiAvKioKLSAqIElJT19FVkVOVF9BVFRSX1NIOiBnZW5lcmljIHNoYXJlZCBldmVudCBhdHRyaWJ1dGUKKyAqIElJT19FVkVOVF9BVFRSX1NIIC0gZ2VuZXJpYyBzaGFyZWQgZXZlbnQgYXR0cmlidXRlCisgKiBAX25hbWU6IGV2ZW50IG5hbWUKKyAqIEBfZXZfbGlzdDogZXZlbnQgaGFuZGxlciBsaXN0CisgKiBAX3Nob3c6IG91dHB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKKyAqIEBfc3RvcmU6IGlucHV0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZQorICogQF9tYXNrOiBtYXNrIHVzZWQgd2hlbiBkZXRlY3RpbmcgdGhlIGV2ZW50CiAgKgogICogQW4gYXR0cmlidXRlIHdpdGggYW4gYXNzb2NpYXRlZCBJSU9fRVZFTlRfU0gKICAqKi8KQEAgLTIzNSw3ICsyNzIsMTIgQEAKIAkgICAgLmxpc3RlbCA9ICZfZXZfbGlzdCB9OwogCiAvKioKLSAqIElJT19FVkVOVF9BVFRSOiBub24gc2hhcmVkIGV2ZW50IGF0dHJpYnV0ZQorICogSUlPX0VWRU5UX0FUVFIgLSBub24tc2hhcmVkIGV2ZW50IGF0dHJpYnV0ZQorICogQF9uYW1lOiBldmVudCBuYW1lCisgKiBAX3Nob3c6IG91dHB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKKyAqIEBfc3RvcmU6IGlucHV0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZQorICogQF9tYXNrOiBtYXNrIHVzZWQgd2hlbiBkZXRlY3RpbmcgdGhlIGV2ZW50CisgKiBAX2hhbmRsZXI6IGhhbmRsZXIgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCiAgKiovCiAjZGVmaW5lIElJT19FVkVOVF9BVFRSKF9uYW1lLCBfc2hvdywgX3N0b3JlLCBfbWFzaywgX2hhbmRsZXIpCQlcCiAJc3RhdGljIHN0cnVjdCBpaW9fZXZlbnRfaGFuZGxlcl9saXN0CQkJCVwKQEAgLTI1MSwxMCArMjkzLDE0IEBACiAJICAgIC5saXN0ZWwgPSAmaWlvX2V2ZW50XyMjX25hbWUgfTsJCQkJXAogCiAvKioKLSAqIElJT19FVkVOVF9BVFRSX0RBVEFfUkRZOiBldmVudCBkcml2ZW4gYnkgZGF0YSByZWFkeSBzaWduYWwKKyAqIElJT19FVkVOVF9BVFRSX0RBVEFfUkRZIC0gZXZlbnQgZHJpdmVuIGJ5IGRhdGEgcmVhZHkgc2lnbmFsCisgKiBAX3Nob3c6IG91dHB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKKyAqIEBfc3RvcmU6IGlucHV0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZQorICogQF9tYXNrOiBtYXNrIHVzZWQgd2hlbiBkZXRlY3RpbmcgdGhlIGV2ZW50CisgKiBAX2hhbmRsZXI6IGhhbmRsZXIgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCiAgKgogICogTm90IHR5cGljYWxseSBpbXBsZW1lbnRlZCBpbiBkZXZpY2VzIHdoZXJlIGZ1bGwgdHJpZ2dlcmluZyBzdXBwb3J0Ci0gKiBoYXMgYmVlbiBpbXBsZW1lbnRlZAorICogaGFzIGJlZW4gaW1wbGVtZW50ZWQuCiAgKiovCiAjZGVmaW5lIElJT19FVkVOVF9BVFRSX0RBVEFfUkRZKF9zaG93LCBfc3RvcmUsIF9tYXNrLCBfaGFuZGxlcikgXAogCUlJT19FVkVOVF9BVFRSKGRhdGFfcmR5LCBfc2hvdywgX3N0b3JlLCBfbWFzaywgX2hhbmRsZXIpCkBAIC0yNjksMTkgKzMxNSwzMSBAQAogI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9ERVZJQ0VfU1BFQ0lGSUMJMTAwMAogCiAvKioKLSAqIElJT19FVkVOVF9BVFRSX1JJTkdfNTBfRlVMTDogcmluZyBidWZmZXIgZXZlbnQgdG8gaW5kaWNhdGUgNTAlIGZ1bGwKKyAqIElJT19FVkVOVF9BVFRSX1JJTkdfNTBfRlVMTCAtIHJpbmcgYnVmZmVyIGV2ZW50IHRvIGluZGljYXRlIDUwJSBmdWxsCisgKiBAX3Nob3c6IG91dHB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKKyAqIEBfc3RvcmU6IGlucHV0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZQorICogQF9tYXNrOiBtYXNrIHVzZWQgd2hlbiBkZXRlY3RpbmcgdGhlIGV2ZW50CisgKiBAX2hhbmRsZXI6IGhhbmRsZXIgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCiAgKiovCiAjZGVmaW5lIElJT19FVkVOVF9BVFRSX1JJTkdfNTBfRlVMTChfc2hvdywgX3N0b3JlLCBfbWFzaywgX2hhbmRsZXIpCVwKIAlJSU9fRVZFTlRfQVRUUihyaW5nXzUwX2Z1bGwsIF9zaG93LCBfc3RvcmUsIF9tYXNrLCBfaGFuZGxlcikKIAogLyoqCi0gKiBJSU9fRVZFTlRfQVRUUl9SSU5HXzUwX0ZVTExfU0g6IHNoYXJlZCByaW5nIGV2ZW50IHRvIGluZGljYXRlIDUwJSBmdWxsCisgKiBJSU9fRVZFTlRfQVRUUl9SSU5HXzUwX0ZVTExfU0ggLSBzaGFyZWQgcmluZyBldmVudCB0byBpbmRpY2F0ZSA1MCUgZnVsbAorICogQF9ldmxpc3Q6IGV2ZW50IGhhbmRsZXIgbGlzdAorICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCisgKiBAX3N0b3JlOiBpbnB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKKyAqIEBfbWFzazogbWFzayB1c2VkIHdoZW4gZGV0ZWN0aW5nIHRoZSBldmVudAogICoqLwogI2RlZmluZSBJSU9fRVZFTlRfQVRUUl9SSU5HXzUwX0ZVTExfU0goX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCVwKIAlJSU9fRVZFTlRfQVRUUl9TSChyaW5nXzUwX2Z1bGwsIF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQogCiAvKioKLSAqIElJT19FVkVOVF9BVFRSX1JJTkdfNzVfRlVMTF9TSDogc2hhcmVkIHJpbmcgZXZlbnQgdG8gaW5kaWNhdGUgNzUlIGZ1bGwKKyAqIElJT19FVkVOVF9BVFRSX1JJTkdfNzVfRlVMTF9TSCAtIHNoYXJlZCByaW5nIGV2ZW50IHRvIGluZGljYXRlIDc1JSBmdWxsCisgKiBAX2V2bGlzdDogZXZlbnQgaGFuZGxlciBsaXN0CisgKiBAX3Nob3c6IG91dHB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKKyAqIEBfc3RvcmU6IGlucHV0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZQorICogQF9tYXNrOiBtYXNrIHVzZWQgd2hlbiBkZXRlY3RpbmcgdGhlIGV2ZW50CiAgKiovCiAjZGVmaW5lIElJT19FVkVOVF9BVFRSX1JJTkdfNzVfRlVMTF9TSChfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykJXAogCUlJT19FVkVOVF9BVFRSX1NIKHJpbmdfNzVfZnVsbCwgX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci5oCmluZGV4IDgyODQwOTguLjc4NGU3YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci5oCkBAIC0xOSwxNiArMTksMTggQEAKICAqIEBpZDoJCQlbSU5URVJOXSB1bmlxdWUgaWQgbnVtYmVyCiAgKiBAbmFtZToJCVtEUklWRVJdIHVuaXF1ZSBuYW1lCiAgKiBAZGV2OgkJW0RSSVZFUl0gYXNzb2NpYXRlZCBkZXZpY2UgKGlmIHJlbGV2YW50KQotICogQHN5c2ZzX2RldjoJCVtJTlRFUk5dIHN5c2ZzIHJlbGV2YW50IGRldmljZQogICogQHByaXZhdGVfZGF0YToJW0RSSVZFUl0gZGV2aWNlIHNwZWNpZmljIGRhdGEKICAqIEBsaXN0OgkJW0lOVEVSTl0gdXNlZCBpbiBtYWludGVuYW5jZSBvZiBnbG9iYWwgdHJpZ2dlciBsaXN0CiAgKiBAYWxsb2NfbGlzdDoJCVtEUklWRVJdIHVzZWQgZm9yIGRyaXZlciBzcGVjaWZpYyB0cmlnZ2VyIGxpc3QKLSAqIEBwb2xsX2Z1bmNfbGlzdF9sb2NrOltJTlRFUk5dIHByb3RlY3Rpb24gb2YgdGhlIHBvbGxpbmcgZnVuY3Rpb24gbGlzdAorICogQHBvbGxmdW5jX2xpc3RfbG9jazoJW0lOVEVSTl0gcHJvdGVjdGlvbiBvZiB0aGUgcG9sbGluZyBmdW5jdGlvbiBsaXN0CiAgKiBAcG9sbGZ1bmNfbGlzdDoJW0lOVEVSTl0gbGlzdCBvZiBmdW5jdGlvbnMgdG8gcnVuIG9uIHRyaWdnZXIuCiAgKiBAY29udHJvbF9hdHRyczoJW0RSSVZFUl0gc3lzZnMgYXR0cmlidXRlcyByZWxldmFudCB0byB0cmlnZ2VyIHR5cGUKLSAqIEBzZXRfdHJpZ2dlcl9zdGF0ZToJW0RSSVZFUl0gc3dpdGNoIG9uL29mZiB0aGUgdHJpZ2dlciBvbiBkZW1hbmQKICAqIEB0aW1lc3RhbXA6CQlbSU5URVJOXSB0aW1lc3RhbXAgdXNlc2QgYnkgc29tZSB0cmlncyAoZS5nLiBkYXRhcmR5KQogICogQG93bmVyOgkJW0RSSVZFUl0gdXNlZCB0byBtb25pdG9yIHVzYWdlIGNvdW50IG9mIHRoZSB0cmlnZ2VyLgorICogQHVzZV9jb3VudDoJCXVzZSBjb3VudCBmb3IgdGhlIHRyaWdnZXIKKyAqIEBzZXRfdHJpZ2dlcl9zdGF0ZToJW0RSSVZFUl0gc3dpdGNoIG9uL29mZiB0aGUgdHJpZ2dlciBvbiBkZW1hbmQKKyAqIEB0cnlfcmVlbmFibGU6CWZ1bmN0aW9uIHRvIHJlZW5hYmxlIHRoZSB0cmlnZ2VyIHdoZW4gdGhlCisgKgkJCXVzZSBjb3VudCBpcyB6ZXJvIChtYXkgYmUgTlVMTCkKICAqKi8KIHN0cnVjdCBpaW9fdHJpZ2dlciB7CiAJaW50CQkJCWlkOwpAQCAtNjgsNiArNzAsOSBAQAogCiAvKioKICAqIGlpb190cmlnZ2VyX3JlYWRfbmFtZSgpIC0gc3lzZnMgYWNjZXNzIGZ1bmN0aW9uIHRvIGdldCB0aGUgdHJpZ2dlciBuYW1lCisgKiBAZGV2OiB0aGUgc3lzdGVtIGRldmljZQorICogQGF0dHI6IGRldmljZSBhdHRyaWJ1dGVzIGZvciB0aGUgZGV2aWNlCisgKiBAYnVmOiBvdXRwdXQgYnVmZmVyIHRvIHN0b3JlIHRoZSB0cmlnZ2VyIG5hbWUKICAqKi8KIHNzaXplX3QgaWlvX3RyaWdnZXJfcmVhZF9uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLApAQCAtNzksNiArODQsOCBAQAogCiAvKioKICAqIGlpb190cmlnZ2VyX2ZpbmRfYnlfbmFtZSgpIC0gc2VhcmNoIGdsb2JhbCB0cmlnZ2VyIGxpc3QKKyAqIEBuYW1lOiB0cmlnZ2VyIG5hbWUgdG8gc2VhcmNoIGZvcgorICogQGxlbjogdHJpZ2dlciBuYW1lIHN0cmluZyBsZW5ndGggdG8gY29tcGFyZQogICoqLwogc3RydWN0IGlpb190cmlnZ2VyICppaW9fdHJpZ2dlcl9maW5kX2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbik7CiAKQEAgLTkwLDMyICs5NywzNSBAQAogCiAvKioKICAqIGlpb190cmlnZ2VyX3VucmVnaXN0ZXIoKSAtIHVucmVnaXN0ZXIgYSB0cmlnZ2VyIGZyb20gdGhlIGNvcmUKKyAqIEB0cmlnX2luZm86CXRyaWdnZXIgdG8gYmUgdW5yZWdpc3RlcmVkCiAgKiovCiB2b2lkIGlpb190cmlnZ2VyX3VucmVnaXN0ZXIoc3RydWN0IGlpb190cmlnZ2VyICp0cmlnX2luZm8pOwogCiAvKioKICAqIGlpb190cmlnZ2VyX2F0dGFjaF9wb2xsX2Z1bmMoKSAtIGFkZCBhIGZ1bmN0aW9uIHBhaXIgdG8gYmUgcnVuIG9uIHRyaWdnZXIKICAqIEB0cmlnOgl0cmlnZ2VyIHRvIHdoaWNoIHRoZSBmdW5jdGlvbiBwYWlyIGFyZSBiZWluZyBhZGRlZAotICogQHBmOglwb2xsIGZ1bmN0aW9uIHBhaXIKKyAqIEBwZjoJCXBvbGwgZnVuY3Rpb24gcGFpcgogICoqLwogaW50IGlpb190cmlnZ2VyX2F0dGFjaF9wb2xsX2Z1bmMoc3RydWN0IGlpb190cmlnZ2VyICp0cmlnLAogCQkJCSBzdHJ1Y3QgaWlvX3BvbGxfZnVuYyAqcGYpOwogCiAvKioKICAqIGlpb190cmlnZ2VyX2RldHRhY2hfcG9sbF9mdW5jKCkgLQlyZW1vdmUgZnVuY3Rpb24gcGFpciBmcm9tIHRob3NlIHRvIGJlCi0gKgkJCQkJcnVuIG9uIHRyaWdnZXIuCi0gKiBAdHJpZzoJdHJpZ2dlciBmcm9tIHdoaWNoIHRoZSBmdW5jdGlvbiBpcyBiZWluZyByZW1vdmVkLgorICoJCQkJCXJ1biBvbiB0cmlnZ2VyCisgKiBAdHJpZzoJdHJpZ2dlciBmcm9tIHdoaWNoIHRoZSBmdW5jdGlvbiBpcyBiZWluZyByZW1vdmVkCiAgKiBAcGY6CQlwb2xsIGZ1bmN0aW9uIHBhaXIKICAqKi8KIGludCBpaW9fdHJpZ2dlcl9kZXR0YWNoX3BvbGxfZnVuYyhzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcsCiAJCQkJICBzdHJ1Y3QgaWlvX3BvbGxfZnVuYyAqcGYpOwogCiAvKioKLSAqIGlpb190cmlnZ2VyX3BvbGwoKSAtIGNhbGxlZCBvbiBhIHRyaWdnZXIgb2NjdXJpbmcKKyAqIGlpb190cmlnZ2VyX3BvbGwoKSAtIGNhbGxlZCBvbiBhIHRyaWdnZXIgb2NjdXJyaW5nCisgKiBAdHJpZzogdHJpZ2dlciB3aGljaCBvY2N1cnJlZAorICoKICAqIFR5cGljYWxseSBjYWxsZWQgaW4gcmVsZXZhbnQgaGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIuCiAgKiovCi12b2lkIGlpb190cmlnZ2VyX3BvbGwoc3RydWN0IGlpb190cmlnZ2VyICopOwotdm9pZCBpaW9fdHJpZ2dlcl9ub3RpZnlfZG9uZShzdHJ1Y3QgaWlvX3RyaWdnZXIgKik7Cit2b2lkIGlpb190cmlnZ2VyX3BvbGwoc3RydWN0IGlpb190cmlnZ2VyICp0cmlnKTsKK3ZvaWQgaWlvX3RyaWdnZXJfbm90aWZ5X2RvbmUoc3RydWN0IGlpb190cmlnZ2VyICp0cmlnKTsKIAogLyoqCiAgKiBzdHJ1Y3QgaWlvX3BvbGxfZnVuYyAtIHBvbGwgZnVuY3Rpb24gcGFpcgpAQCAtMTI3LDExICsxMzcsMTAgQEAKICAqCQkJCWNvbnRyb2wgb24gc2Vuc29yIHN1cHBvcnRpbmcgaXQuCiAgKiBAcG9sbF9mdW5jX21haW46CQlmdW5jdGlvbiBpbiBoZXJlIGlzIHJ1biBhZnRlciBhbGwgaW1tZWRpYXRlcy4KICAqCQkJCVJlYWRpbmcgZnJvbSBzZW5zb3IgZXRjIHR5cGljYWxseSBpbnZvbHZlcwotICoJCQkJc2NoZWR1bGluZwotICoJCQkJZnJvbSBoZXJlLgorICoJCQkJc2NoZWR1bGluZyBmcm9tIGhlcmUuCiAgKgotICogVGhlIHR3byBzdGFnZSBhcHByb2FjaCB1c2VkIGhlcmUgb25seSBpbXBvcnRhbnQgd2hlbiBtdWx0aXBsZSBzZW5zb3JzIGFyZQotICogYmVpbmcgdHJpZ2dlcmVkIGJ5IGEgc2luZ2xlIHRyaWdnZXIuIFRoaXMgcmVhbGx5IGNvbWVzIGludG8gaXQncyBvd24gd2l0aAorICogVGhlIHR3byBzdGFnZSBhcHByb2FjaCB1c2VkIGhlcmUgaXMgb25seSBpbXBvcnRhbnQgd2hlbiBtdWx0aXBsZSBzZW5zb3JzIGFyZQorICogYmVpbmcgdHJpZ2dlcmVkIGJ5IGEgc2luZ2xlIHRyaWdnZXIuIFRoaXMgcmVhbGx5IGNvbWVzIGludG8gaXRzIG93biB3aXRoCiAgKiBzaW11bHRhbmVvdXMgc2FtcGxpbmcgZGV2aWNlcyB3aGVyZSBhIHNpbXBsZSBsYXRjaCBjb21tYW5kIGNhbiBiZSB1c2VkIHRvCiAgKiBtYWtlIHRoZSBkZXZpY2Ugc3RvcmUgdGhlIHZhbHVlcyBvbiBhbGwgaW5wdXRzLgogICoqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIvS2NvbmZpZwppbmRleCBmZGQ5MzAxLi5kODQyYTU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIvS2NvbmZpZwpAQCAtOSwxMyArOSwxMyBAQAogCXRyaXN0YXRlICJQZXJpb2RpYyBSVEMgdHJpZ2dlcnMiCiAJZGVwZW5kcyBvbiBSVENfQ0xBU1MKIAloZWxwCi0JICAgIFByb3ZpZGVzIHN1cHBvcnQgZm9yIHVzaW5nIHBlcmlvZGljIGNhcGFibGUgcmVhbCB0aW1lCi0JICAgIGNsb2NrcyBhcyBJSU8gdHJpZ2dlcnMuCisJICBQcm92aWRlcyBzdXBwb3J0IGZvciB1c2luZyBwZXJpb2RpYyBjYXBhYmxlIHJlYWwgdGltZQorCSAgY2xvY2tzIGFzIElJTyB0cmlnZ2Vycy4KIAogY29uZmlnIElJT19HUElPX1RSSUdHRVIKIAl0cmlzdGF0ZSAiR1BJTyB0cmlnZ2VyIgogCWRlcGVuZHMgb24gR0VORVJJQ19HUElPCiAJaGVscAotCSAgICBQcm92aWRlcyBzdXBwb3J0IGZvciB1c2luZyBHUElPIHBpbnMgYXMgSUlPIHRyaWdnZXJzLgorCSAgUHJvdmlkZXMgc3VwcG9ydCBmb3IgdXNpbmcgR1BJTyBwaW5zIGFzIElJTyB0cmlnZ2Vycy4KIAogZW5kaWYgIyBJSU9fVFJJR0dFUgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyX2NvbnN1bWVyLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXJfY29uc3VtZXIuaAppbmRleCA0YzdmNTI3Li5hMDJkNzBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXJfY29uc3VtZXIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXJfY29uc3VtZXIuaApAQCAtMTAsMTIgKzEwLDEzIEBACiAKICNpZmRlZiBDT05GSUdfSUlPX1RSSUdHRVIKIC8qKgotICogaWlvX2RldmljZV9yZWdpc3Rlcl90cmlnZ2VyX2NvbnN1bWVyKCkgLSBzZXQgdXAgYW4gaWlvX2RldiB0byB1c2UgdHJpZ2dlcnMuCisgKiBpaW9fZGV2aWNlX3JlZ2lzdGVyX3RyaWdnZXJfY29uc3VtZXIoKSAtIHNldCB1cCBhbiBpaW9fZGV2IHRvIHVzZSB0cmlnZ2VycwogICogQGRldl9pbmZvOiBpaW9fZGV2IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlIHRoYXQgd2lsbCBjb25zdW1lIHRoZSB0cmlnZ2VyCiAgKiovCiBpbnQgaWlvX2RldmljZV9yZWdpc3Rlcl90cmlnZ2VyX2NvbnN1bWVyKHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyk7CisKIC8qKgotICogaWlvX2RldmljZV91bnJlZ2lzdGVyX3RyaWdnZXJfY29uc3VtZXIoKSAtIHJldmVyc2UgdGhlIHJlZ2lzdHJhdGlvbiBwcm9jZXNzLgorICogaWlvX2RldmljZV91bnJlZ2lzdGVyX3RyaWdnZXJfY29uc3VtZXIoKSAtIHJldmVyc2UgdGhlIHJlZ2lzdHJhdGlvbiBwcm9jZXNzCiAgKiBAZGV2X2luZm86IGlpb19kZXYgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXZpY2UgdGhhdCBjb25zdW1lZCB0aGUgdHJpZ2dlcgogICoqLwogaW50IGlpb19kZXZpY2VfdW5yZWdpc3Rlcl90cmlnZ2VyX2NvbnN1bWVyKHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyk7CkBAIC0yMywxMyArMjQsMTQgQEAKICNlbHNlCiAKIC8qKgotICogaWlvX2RldmljZV9yZWdpc3Rlcl90cmlnZ2VyX2NvbnN1bWVyKCkgLSBzZXQgdXAgYW4gaWlvX2RldiB0byB1c2UgdHJpZ2dlcnMuCisgKiBpaW9fZGV2aWNlX3JlZ2lzdGVyX3RyaWdnZXJfY29uc3VtZXIoKSAtIHNldCB1cCBhbiBpaW9fZGV2IHRvIHVzZSB0cmlnZ2VycwogICogQGRldl9pbmZvOiBpaW9fZGV2IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlIHRoYXQgd2lsbCBjb25zdW1lIHRoZSB0cmlnZ2VyCiAgKiovCiBpbnQgaWlvX2RldmljZV9yZWdpc3Rlcl90cmlnZ2VyX2NvbnN1bWVyKHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbykKIHsKIAlyZXR1cm4gMDsKIH07CisKIC8qKgogICogaWlvX2RldmljZV91bnJlZ2lzdGVyX3RyaWdnZXJfY29uc3VtZXIoKSAtIHJldmVyc2UgdGhlIHJlZ2lzdHJhdGlvbiBwcm9jZXNzCiAgKiBAZGV2X2luZm86IGlpb19kZXYgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXZpY2UgdGhhdCBjb25zdW1lZCB0aGUgdHJpZ2dlcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2NhcHR1cmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9jYXB0dXJlLmMKaW5kZXggZWEyMDYwYi4uZmQ0ODkwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2NhcHR1cmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvY2FwdHVyZS5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSAicG9kLmgiCiAjaW5jbHVkZSAiY2FwdHVyZS5oIgogCi0KIC8qCiAJRmluZCBhIGZyZWUgVVJCIGFuZCBzdWJtaXQgaXQuCiAqLwpAQCAtMzMsNyArMzIsOCBAQAogCXN0cnVjdCB1cmIgKnVyYl9pbjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZsaW5lNnBjbS0+bG9ja19hdWRpb19pbiwgZmxhZ3MpOwotCWluZGV4ID0gZmluZF9maXJzdF96ZXJvX2JpdCgmbGluZTZwY20tPmFjdGl2ZV91cmJfaW4sIExJTkU2X0lTT19CVUZGRVJTKTsKKwlpbmRleCA9CisJICAgIGZpbmRfZmlyc3RfemVyb19iaXQoJmxpbmU2cGNtLT5hY3RpdmVfdXJiX2luLCBMSU5FNl9JU09fQlVGRkVSUyk7CiAKIAlpZiAoaW5kZXggPj0gTElORTZfSVNPX0JVRkZFUlMpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGluZTZwY20tPmxvY2tfYXVkaW9faW4sIGZsYWdzKTsKQEAgLTQ1LDIwICs0NSwyNCBAQAogCXVyYl9zaXplID0gMDsKIAogCWZvciAoaSA9IDA7IGkgPCBMSU5FNl9JU09fUEFDS0VUUzsgKytpKSB7Ci0JCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICpmaW4gPSAmdXJiX2luLT5pc29fZnJhbWVfZGVzY1tpXTsKKwkJc3RydWN0IHVzYl9pc29fcGFja2V0X2Rlc2NyaXB0b3IgKmZpbiA9CisJCSAgICAmdXJiX2luLT5pc29fZnJhbWVfZGVzY1tpXTsKIAkJZmluLT5vZmZzZXQgPSB1cmJfc2l6ZTsKIAkJZmluLT5sZW5ndGggPSBsaW5lNnBjbS0+bWF4X3BhY2tldF9zaXplOwogCQl1cmJfc2l6ZSArPSBsaW5lNnBjbS0+bWF4X3BhY2tldF9zaXplOwogCX0KIAotCXVyYl9pbi0+dHJhbnNmZXJfYnVmZmVyID0gbGluZTZwY20tPmJ1ZmZlcl9pbiArIGluZGV4ICogTElORTZfSVNPX1BBQ0tFVFMgKiBsaW5lNnBjbS0+bWF4X3BhY2tldF9zaXplOworCXVyYl9pbi0+dHJhbnNmZXJfYnVmZmVyID0KKwkgICAgbGluZTZwY20tPmJ1ZmZlcl9pbiArCisJICAgIGluZGV4ICogTElORTZfSVNPX1BBQ0tFVFMgKiBsaW5lNnBjbS0+bWF4X3BhY2tldF9zaXplOwogCXVyYl9pbi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHVyYl9zaXplOwogCXVyYl9pbi0+Y29udGV4dCA9IHN1YnN0cmVhbTsKIAogCWlmICh1c2Jfc3VibWl0X3VyYih1cmJfaW4sIEdGUF9BVE9NSUMpID09IDApCiAJCXNldF9iaXQoaW5kZXgsICZsaW5lNnBjbS0+YWN0aXZlX3VyYl9pbik7CiAJZWxzZQotCQlkZXZfZXJyKHMybShzdWJzdHJlYW0pLCAiVVJCIGluICMlZCBzdWJtaXNzaW9uIGZhaWxlZFxuIiwgaW5kZXgpOworCQlkZXZfZXJyKHMybShzdWJzdHJlYW0pLCAiVVJCIGluICMlZCBzdWJtaXNzaW9uIGZhaWxlZFxuIiwKKwkJCWluZGV4KTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpbmU2cGNtLT5sb2NrX2F1ZGlvX2luLCBmbGFncyk7CiAJcmV0dXJuIDA7CkBAIC0xNDMsNyArMTQ3LDggQEAKIAlpbnQgZnJhbWVzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPQorCSAgICAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICopdXJiLT5jb250ZXh0OwogCXN0cnVjdCBzbmRfbGluZTZfcGNtICpsaW5lNnBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAljb25zdCBpbnQgYnl0ZXNfcGVyX2ZyYW1lID0gbGluZTZwY20tPnByb3BlcnRpZXMtPmJ5dGVzX3Blcl9mcmFtZTsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwpAQCAtMTU1LDggKzE2MCwxMSBAQAogCiAjaWYgRE9fRFVNUF9QQ01fUkVDRUlWRQogCWZvciAoaSA9IDA7IGkgPCBMSU5FNl9JU09fUEFDS0VUUzsgKytpKSB7Ci0JCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICpmb3V0ID0gJnVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV07Ci0JCWxpbmU2X3dyaXRlX2hleGR1bXAobGluZTZwY20tPmxpbmU2LCAnQycsIHVyYi0+dHJhbnNmZXJfYnVmZmVyICsgZm91dC0+b2Zmc2V0LCBmb3V0LT5sZW5ndGgpOworCQlzdHJ1Y3QgdXNiX2lzb19wYWNrZXRfZGVzY3JpcHRvciAqZm91dCA9CisJCSAgICAmdXJiLT5pc29fZnJhbWVfZGVzY1tpXTsKKwkJbGluZTZfd3JpdGVfaGV4ZHVtcChsaW5lNnBjbS0+bGluZTYsICdDJywKKwkJCQkgICAgdXJiLT50cmFuc2Zlcl9idWZmZXIgKyBmb3V0LT5vZmZzZXQsCisJCQkJICAgIGZvdXQtPmxlbmd0aCk7CiAJfQogI2VuZGlmCiAKQEAgLTE3OSwyNSArMTg3LDQwIEBACiAJCWlmIChmc2l6ZSA+IDApIHsKIAkJCWZyYW1lcyA9IGZzaXplIC8gYnl0ZXNfcGVyX2ZyYW1lOwogCi0JCQlpZiAobGluZTZwY20tPnBvc19pbl9kb25lICsgZnJhbWVzID4gcnVudGltZS0+YnVmZmVyX3NpemUpIHsKKwkJCWlmIChsaW5lNnBjbS0+cG9zX2luX2RvbmUgKyBmcmFtZXMgPgorCQkJICAgIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKSB7CiAJCQkJLyoKLQkJCQkJVGhlIHRyYW5zZmVycmVkIGFyZWEgZ29lcyBvdmVyIGJ1ZmZlciBib3VuZGFyeSwKLQkJCQkJY29weSB0d28gc2VwYXJhdGUgY2h1bmtzLgotCQkJCSovCisJCQkJICAgVGhlIHRyYW5zZmVycmVkIGFyZWEgZ29lcyBvdmVyIGJ1ZmZlcgorCQkJCSAgIGJvdW5kYXJ5LCBjb3B5IHR3byBzZXBhcmF0ZSBjaHVua3MuCisJCQkJICovCiAJCQkJaW50IGxlbjsKLQkJCQlsZW4gPSBydW50aW1lLT5idWZmZXJfc2l6ZSAtIGxpbmU2cGNtLT5wb3NfaW5fZG9uZTsKKwkJCQlsZW4gPQorCQkJCSAgICBydW50aW1lLT5idWZmZXJfc2l6ZSAtCisJCQkJICAgIGxpbmU2cGNtLT5wb3NfaW5fZG9uZTsKIAogCQkJCWlmIChsZW4gPiAwKSB7Ci0JCQkJCW1lbWNweShydW50aW1lLT5kbWFfYXJlYSArIGxpbmU2cGNtLT5wb3NfaW5fZG9uZSAqIGJ5dGVzX3Blcl9mcmFtZSwgZmJ1ZiwgbGVuICogYnl0ZXNfcGVyX2ZyYW1lKTsKLQkJCQkJbWVtY3B5KHJ1bnRpbWUtPmRtYV9hcmVhLCBmYnVmICsgbGVuICogYnl0ZXNfcGVyX2ZyYW1lLCAoZnJhbWVzIC0gbGVuKSAqIGJ5dGVzX3Blcl9mcmFtZSk7Ci0JCQkJfSBlbHNlCi0JCQkJCWRldl9lcnIoczJtKHN1YnN0cmVhbSksICJkcml2ZXIgYnVnOiBsZW4gPSAlZFxuIiwgbGVuKTsgIC8qIHRoaXMgaXMgc29tZXdoYXQgcGFyYW5vaWQgKi8KKwkJCQkJbWVtY3B5KHJ1bnRpbWUtPmRtYV9hcmVhICsKKwkJCQkJICAgICAgIGxpbmU2cGNtLT5wb3NfaW5fZG9uZSAqCisJCQkJCSAgICAgICBieXRlc19wZXJfZnJhbWUsIGZidWYsCisJCQkJCSAgICAgICBsZW4gKiBieXRlc19wZXJfZnJhbWUpOworCQkJCQltZW1jcHkocnVudGltZS0+ZG1hX2FyZWEsCisJCQkJCSAgICAgICBmYnVmICsgbGVuICogYnl0ZXNfcGVyX2ZyYW1lLAorCQkJCQkgICAgICAgKGZyYW1lcyAtCisJCQkJCQlsZW4pICogYnl0ZXNfcGVyX2ZyYW1lKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiB0aGlzIGlzIHNvbWV3aGF0IHBhcmFub2lkICovCisJCQkJCWRldl9lcnIoczJtKHN1YnN0cmVhbSksCisJCQkJCQkiZHJpdmVyIGJ1ZzogbGVuID0gJWRcbiIsIGxlbik7CisJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQkvKiBjb3B5IHNpbmdsZSBjaHVuayAqLwotCQkJCW1lbWNweShydW50aW1lLT5kbWFfYXJlYSArIGxpbmU2cGNtLT5wb3NfaW5fZG9uZSAqIGJ5dGVzX3Blcl9mcmFtZSwgZmJ1ZiwgZnNpemUgKiBieXRlc19wZXJfZnJhbWUpOworCQkJCW1lbWNweShydW50aW1lLT5kbWFfYXJlYSArCisJCQkJICAgICAgIGxpbmU2cGNtLT5wb3NfaW5fZG9uZSAqIGJ5dGVzX3Blcl9mcmFtZSwKKwkJCQkgICAgICAgZmJ1ZiwgZnNpemUgKiBieXRlc19wZXJfZnJhbWUpOwogCQkJfQogCi0JCQlpZiAoKGxpbmU2cGNtLT5wb3NfaW5fZG9uZSArPSBmcmFtZXMpID49IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKQorCQkJbGluZTZwY20tPnBvc19pbl9kb25lICs9IGZyYW1lczsKKwkJCWlmIChsaW5lNnBjbS0+cG9zX2luX2RvbmUgPj0gcnVudGltZS0+YnVmZmVyX3NpemUpCiAJCQkJbGluZTZwY20tPnBvc19pbl9kb25lIC09IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOwogCQl9CiAJfQpAQCAtMjEyLDcgKzIzNSw4IEBACiAJaWYgKCFzaHV0ZG93bikgewogCQlzdWJtaXRfYXVkaW9faW5fdXJiKHN1YnN0cmVhbSk7CiAKLQkJaWYgKChsaW5lNnBjbS0+Ynl0ZXNfaW4gKz0gbGVuZ3RoKSA+PSBsaW5lNnBjbS0+cGVyaW9kX2luKSB7CisJCWxpbmU2cGNtLT5ieXRlc19pbiArPSBsZW5ndGg7CisJCWlmIChsaW5lNnBjbS0+Ynl0ZXNfaW4gPj0gbGluZTZwY20tPnBlcmlvZF9pbikgewogCQkJbGluZTZwY20tPmJ5dGVzX2luIC09IGxpbmU2cGNtLT5wZXJpb2RfaW47CiAJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7CiAJCX0KQEAgLTIyOCw3ICsyNTIsOCBAQAogCiAJZXJyID0gc25kX3BjbV9od19jb25zdHJhaW50X3JhdGRlbnMocnVudGltZSwgMCwKIAkJCQkJICAgIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAotCQkJCQkgICAgKCZsaW5lNnBjbS0+cHJvcGVydGllcy0+c25kX2xpbmU2X3JhdGVzKSk7CisJCQkJCSAgICAoJmxpbmU2cGNtLT5wcm9wZXJ0aWVzLT4KKwkJCQkJICAgICBzbmRfbGluZTZfcmF0ZXMpKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMjY3LDcgKzI5Miw5IEBACiAJCXJldHVybiByZXQ7CiAKIAlsaW5lNnBjbS0+cGVyaW9kX2luID0gcGFyYW1zX3BlcmlvZF9ieXRlcyhod19wYXJhbXMpOwotCWxpbmU2cGNtLT5idWZmZXJfaW4gPSBrbWFsbG9jKExJTkU2X0lTT19CVUZGRVJTICogTElORTZfSVNPX1BBQ0tFVFMgKiBMSU5FNl9JU09fUEFDS0VUX1NJWkVfTUFYLCBHRlBfS0VSTkVMKTsKKwlsaW5lNnBjbS0+YnVmZmVyX2luID0KKwkgICAga21hbGxvYyhMSU5FNl9JU09fQlVGRkVSUyAqIExJTkU2X0lTT19QQUNLRVRTICoKKwkJICAgIExJTkU2X0lTT19QQUNLRVRfU0laRV9NQVgsIEdGUF9LRVJORUwpOwogCiAJaWYgKCFsaW5lNnBjbS0+YnVmZmVyX2luKSB7CiAJCWRldl9lcnIoczJtKHN1YnN0cmVhbSksICJjYW5ub3QgbWFsbG9jIGJ1ZmZlcl9pblxuIik7CkBAIC0zMDIsNyArMzI5LDggQEAKIAkJCWVyciA9IHN1Ym1pdF9hdWRpb19pbl9hbGxfdXJicyhzdWJzdHJlYW0pOwogCiAJCQlpZiAoZXJyIDwgMCkgewotCQkJCWNsZWFyX2JpdChCSVRfUlVOTklOR19DQVBUVVJFLCAmbGluZTZwY20tPmZsYWdzKTsKKwkJCQljbGVhcl9iaXQoQklUX1JVTk5JTkdfQ0FQVFVSRSwKKwkJCQkJICAmbGluZTZwY20tPmZsYWdzKTsKIAkJCQlyZXR1cm4gZXJyOwogCQkJfQogCQl9CkBAIC0zMzIsMTQgKzM2MCwxNCBAQAogCiAvKiBjYXB0dXJlIG9wZXJhdG9ycyAqLwogc3RydWN0IHNuZF9wY21fb3BzIHNuZF9saW5lNl9jYXB0dXJlX29wcyA9IHsKLQkub3BlbiA9ICAgICAgICBzbmRfbGluZTZfY2FwdHVyZV9vcGVuLAotCS5jbG9zZSA9ICAgICAgIHNuZF9saW5lNl9jYXB0dXJlX2Nsb3NlLAotCS5pb2N0bCA9ICAgICAgIHNuZF9wY21fbGliX2lvY3RsLAotCS5od19wYXJhbXMgPSAgIHNuZF9saW5lNl9jYXB0dXJlX2h3X3BhcmFtcywKLQkuaHdfZnJlZSA9ICAgICBzbmRfbGluZTZfY2FwdHVyZV9od19mcmVlLAotCS5wcmVwYXJlID0gICAgIHNuZF9saW5lNl9wcmVwYXJlLAotCS50cmlnZ2VyID0gICAgIHNuZF9saW5lNl90cmlnZ2VyLAotCS5wb2ludGVyID0gICAgIHNuZF9saW5lNl9jYXB0dXJlX3BvaW50ZXIsCisJLm9wZW4gPSBzbmRfbGluZTZfY2FwdHVyZV9vcGVuLAorCS5jbG9zZSA9IHNuZF9saW5lNl9jYXB0dXJlX2Nsb3NlLAorCS5pb2N0bCA9IHNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPSBzbmRfbGluZTZfY2FwdHVyZV9od19wYXJhbXMsCisJLmh3X2ZyZWUgPSBzbmRfbGluZTZfY2FwdHVyZV9od19mcmVlLAorCS5wcmVwYXJlID0gc25kX2xpbmU2X3ByZXBhcmUsCisJLnRyaWdnZXIgPSBzbmRfbGluZTZfdHJpZ2dlciwKKwkucG9pbnRlciA9IHNuZF9saW5lNl9jYXB0dXJlX3BvaW50ZXIsCiB9OwogCiBpbnQgY3JlYXRlX2F1ZGlvX2luX3VyYnMoc3RydWN0IHNuZF9saW5lNl9wY20gKmxpbmU2cGNtKQpAQCAtMzUxLDcgKzM3OSw4IEBACiAJCXN0cnVjdCB1cmIgKnVyYjsKIAogCQkvKiBVUkIgZm9yIGF1ZGlvIGluOiAqLwotCQl1cmIgPSBsaW5lNnBjbS0+dXJiX2F1ZGlvX2luW2ldID0gdXNiX2FsbG9jX3VyYihMSU5FNl9JU09fUEFDS0VUUywgR0ZQX0tFUk5FTCk7CisJCXVyYiA9IGxpbmU2cGNtLT51cmJfYXVkaW9faW5baV0gPQorCQkgICAgdXNiX2FsbG9jX3VyYihMSU5FNl9JU09fUEFDS0VUUywgR0ZQX0tFUk5FTCk7CiAKIAkJaWYgKHVyYiA9PSBOVUxMKSB7CiAJCQlkZXZfZXJyKGxpbmU2cGNtLT5saW5lNi0+aWZjZGV2LCAiT3V0IG9mIG1lbW9yeVxuIik7CkBAIC0zNTksNyArMzg4LDEwIEBACiAJCX0KIAogCQl1cmItPmRldiA9IGxpbmU2cGNtLT5saW5lNi0+dXNiZGV2OwotCQl1cmItPnBpcGUgPSB1c2JfcmN2aXNvY3BpcGUobGluZTZwY20tPmxpbmU2LT51c2JkZXYsIGxpbmU2cGNtLT5lcF9hdWRpb19yZWFkICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLKTsKKwkJdXJiLT5waXBlID0KKwkJICAgIHVzYl9yY3Zpc29jcGlwZShsaW5lNnBjbS0+bGluZTYtPnVzYmRldiwKKwkJCQkgICAgbGluZTZwY20tPgorCQkJCSAgICBlcF9hdWRpb19yZWFkICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLKTsKIAkJdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUDsKIAkJdXJiLT5zdGFydF9mcmFtZSA9IC0xOwogCQl1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gTElORTZfSVNPX1BBQ0tFVFM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvY29udHJvbC5jIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2NvbnRyb2wuYwppbmRleCAyM2FkMDhlLi4wYjU5ODUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvY29udHJvbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9jb250cm9sLmMKQEAgLTIyLDE4ICsyMiwxOCBAQAogc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfIyNfbmFtZTEgPSBfX0FUVFIoX25hbWUyLCBfbW9kZSwgX3Nob3csIF9zdG9yZSkKIAogI2RlZmluZSBMSU5FNl9QQVJBTV9SKFBSRUZJWCwgcHJlZml4LCB0eXBlLCBwYXJhbSkgXAotc3RhdGljIHNzaXplX3QgcHJlZml4ICMjIF9nZXRfICMjIHBhcmFtKHN0cnVjdCBkZXZpY2UgKmRldiwgXAorc3RhdGljIHNzaXplX3QgcHJlZml4IyNfZ2V0XyMjcGFyYW0oc3RydWN0IGRldmljZSAqZGV2LCBcCiAJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCiB7IFwKLQlyZXR1cm4gcHJlZml4ICMjIF9nZXRfcGFyYW1fICMjIHR5cGUoZGV2LCBidWYsIFBSRUZJWCAjIyBfICMjIHBhcmFtKTsgXAorCXJldHVybiBwcmVmaXgjI19nZXRfcGFyYW1fIyN0eXBlKGRldiwgYnVmLCBQUkVGSVgjI18jI3BhcmFtKTsgXAogfQogCiAjZGVmaW5lIExJTkU2X1BBUkFNX1JXKFBSRUZJWCwgcHJlZml4LCB0eXBlLCBwYXJhbSkgXAogTElORTZfUEFSQU1fUihQUkVGSVgsIHByZWZpeCwgdHlwZSwgcGFyYW0pOyBcCi1zdGF0aWMgc3NpemVfdCBwcmVmaXggIyMgX3NldF8gIyMgcGFyYW0oc3RydWN0IGRldmljZSAqZGV2LCBcCitzdGF0aWMgc3NpemVfdCBwcmVmaXgjI19zZXRfIyNwYXJhbShzdHJ1Y3QgZGV2aWNlICpkZXYsIFwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCiB7IFwKLQlyZXR1cm4gcHJlZml4ICMjIF9zZXRfcGFyYW1fICMjIHR5cGUoZGV2LCBidWYsIGNvdW50LCBQUkVGSVggIyMgXyAjIyBwYXJhbSk7IFwKKwlyZXR1cm4gcHJlZml4IyNfc2V0X3BhcmFtXyMjdHlwZShkZXYsIGJ1ZiwgY291bnQsIFBSRUZJWCMjXyMjcGFyYW0pOyBcCiB9CiAKICNkZWZpbmUgUE9EX1BBUkFNX1IodHlwZSwgcGFyYW0pIExJTkU2X1BBUkFNX1IoUE9ELCBwb2QsIHR5cGUsIHBhcmFtKQpAQCAtNDEsNyArNDEsNiBAQAogI2RlZmluZSBWQVJJQVhfUEFSQU1fUih0eXBlLCBwYXJhbSkgTElORTZfUEFSQU1fUihWQVJJQVgsIHZhcmlheCwgdHlwZSwgcGFyYW0pCiAjZGVmaW5lIFZBUklBWF9QQVJBTV9SVyh0eXBlLCBwYXJhbSkgTElORTZfUEFSQU1fUlcoVkFSSUFYLCB2YXJpYXgsIHR5cGUsIHBhcmFtKQogCi0KIHN0YXRpYyBzc2l6ZV90IHBvZF9nZXRfcGFyYW1faW50KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgcGFyYW0pCiB7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKQEAgLTUyLDExICs1MSwxOCBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwb2QtPnByb2dfZGF0YS5jb250cm9sW3BhcmFtXSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHBvZF9zZXRfcGFyYW1faW50KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBwYXJhbSkKK3N0YXRpYyBzc2l6ZV90IHBvZF9zZXRfcGFyYW1faW50KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQkJCSBzaXplX3QgY291bnQsIGludCBwYXJhbSkKIHsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwogCXN0cnVjdCB1c2JfbGluZTZfcG9kICpwb2QgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7Ci0JaW50IHZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbHVlKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCiAJcG9kX3RyYW5zbWl0X3BhcmFtZXRlcihwb2QsIHBhcmFtLCB2YWx1ZSk7CiAJcmV0dXJuIGNvdW50OwogfQpAQCAtNzQsMTMgKzgwLDEzIEBACiBzdGF0aWMgc3NpemVfdCB2YXJpYXhfZ2V0X3BhcmFtX2Zsb2F0KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgcGFyYW0pCiB7CiAJLyoKLQkJV2UgZG8gb3VyIG93biBmbG9hdGluZyBwb2ludCBoYW5kbGluZyBoZXJlIHNpbmNlIGZsb2F0cyBpbiB0aGUKLQkJa2VybmVsIGFyZSBwcm9ibGVtYXRpYyBmb3IgYXQgbGVhc3QgdHdvIHJlYXNvbnM6IC0gbWFueSBkaXN0cm9zCi0JCWFyZSBzdGlsbCBzaGlwcGVkIHdpdGggYmluYXJ5IGtlcm5lbHMgb3B0aW1pemVkIGZvciB0aGUgYW5jaWVudAotCQk4MDM4NiB3aXRob3V0IEZQVQotCQktIHRoZXJlIGlzbid0IGEgcHJpbnRmKCIlZiIpCi0JCSAgKHNlZSBodHRwOi8vd3d3Lmtlcm5lbHRocmVhZC5jb20vcHVibGljYXRpb25zL2ZhcS8zMzUuaHRtbCkKLQkqLworCSAgIFdlIGRvIG91ciBvd24gZmxvYXRpbmcgcG9pbnQgaGFuZGxpbmcgaGVyZSBzaW5jZSBmbG9hdHMgaW4gdGhlCisJICAga2VybmVsIGFyZSBwcm9ibGVtYXRpYyBmb3IgYXQgbGVhc3QgdHdvIHJlYXNvbnM6IC0gbWFueSBkaXN0cm9zCisJICAgYXJlIHN0aWxsIHNoaXBwZWQgd2l0aCBiaW5hcnkga2VybmVscyBvcHRpbWl6ZWQgZm9yIHRoZSBhbmNpZW50CisJICAgODAzODYgd2l0aG91dCBGUFUKKwkgICAtIHRoZXJlIGlzbid0IGEgcHJpbnRmKCIlZiIpCisJICAgKHNlZSBodHRwOi8vd3d3Lmtlcm5lbHRocmVhZC5jb20vcHVibGljYXRpb25zL2ZhcS8zMzUuaHRtbCkKKwkgKi8KIAogCXN0YXRpYyBjb25zdCBpbnQgQklBUyA9IDB4N2Y7CiAJc3RhdGljIGNvbnN0IGludCBPRkZTRVQgPSAweGY7CkBAIC0xMTAsMTAgKzExNiwxMyBAQAogCQkJcGFydF9mcmFjID0gKG1hbnRpc3NhIDw8ICgzMiArIGV4cG9uZW50KSkgJiAweGZmZmZmZmZmOwogCQl9CiAKLQkJcGFydF9mcmFjID0gKHBhcnRfZnJhYyAvICgoMVVMIDw8IDMxKSAvIChQUkVDSVNJT04gLyAyICogMTApKSArIDUpIC8gMTA7CisJCXBhcnRfZnJhYyA9CisJCSAgICAocGFydF9mcmFjIC8gKCgxVUwgPDwgMzEpIC8gKFBSRUNJU0lPTiAvIDIgKiAxMCkpICsgNSkgLyAxMDsKIAl9CiAKLQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIlcyVkLiUwM2RcbiIsICgocFswXSAmIDB4ODApID8gIi0iIDogIiIpLCBwYXJ0X2ludCwgcGFydF9mcmFjKTsKKwlsZW4gKz0KKwkgICAgc3ByaW50ZihidWYgKyBsZW4sICIlcyVkLiUwM2RcbiIsICgocFswXSAmIDB4ODApID8gIi0iIDogIiIpLAorCQkgICAgcGFydF9pbnQsIHBhcnRfZnJhYyk7CiAJcmV0dXJuIGxlbjsKIH0KIApAQCAtMjYwLDEyNyArMjY5LDI0NiBAQAogVkFSSUFYX1BBUkFNX1IoaW50LCBwaWNrdXBfd2lyaW5nKTsKIAogc3RhdGljIERFVklDRV9BVFRSKHR3ZWFrLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF90d2VhaywgcG9kX3NldF90d2Vhayk7Ci1zdGF0aWMgREVWSUNFX0FUVFIod2FoX3Bvc2l0aW9uLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF93YWhfcG9zaXRpb24sIHBvZF9zZXRfd2FoX3Bvc2l0aW9uKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihjb21wcmVzc2lvbl9nYWluLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9jb21wcmVzc2lvbl9nYWluLCBwb2Rfc2V0X2NvbXByZXNzaW9uX2dhaW4pOwotc3RhdGljIERFVklDRV9BVFRSKHZvbF9wZWRhbF9wb3NpdGlvbiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfdm9sX3BlZGFsX3Bvc2l0aW9uLCBwb2Rfc2V0X3ZvbF9wZWRhbF9wb3NpdGlvbik7Ci1zdGF0aWMgREVWSUNFX0FUVFIoY29tcHJlc3Npb25fdGhyZXNob2xkLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9jb21wcmVzc2lvbl90aHJlc2hvbGQsIHBvZF9zZXRfY29tcHJlc3Npb25fdGhyZXNob2xkKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih3YWhfcG9zaXRpb24sIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3dhaF9wb3NpdGlvbiwKKwkJICAgcG9kX3NldF93YWhfcG9zaXRpb24pOworc3RhdGljIERFVklDRV9BVFRSKGNvbXByZXNzaW9uX2dhaW4sIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICBwb2RfZ2V0X2NvbXByZXNzaW9uX2dhaW4sIHBvZF9zZXRfY29tcHJlc3Npb25fZ2Fpbik7CitzdGF0aWMgREVWSUNFX0FUVFIodm9sX3BlZGFsX3Bvc2l0aW9uLCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgcG9kX2dldF92b2xfcGVkYWxfcG9zaXRpb24sIHBvZF9zZXRfdm9sX3BlZGFsX3Bvc2l0aW9uKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihjb21wcmVzc2lvbl90aHJlc2hvbGQsIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICBwb2RfZ2V0X2NvbXByZXNzaW9uX3RocmVzaG9sZCwKKwkJICAgcG9kX3NldF9jb21wcmVzc2lvbl90aHJlc2hvbGQpOwogc3RhdGljIERFVklDRV9BVFRSKHBhbiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfcGFuLCBwb2Rfc2V0X3Bhbik7Ci1zdGF0aWMgREVWSUNFX0FUVFIoYW1wX21vZGVsX3NldHVwLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9hbXBfbW9kZWxfc2V0dXAsIHBvZF9zZXRfYW1wX21vZGVsX3NldHVwKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihhbXBfbW9kZWwsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2FtcF9tb2RlbCwgcG9kX3NldF9hbXBfbW9kZWwpOworc3RhdGljIERFVklDRV9BVFRSKGFtcF9tb2RlbF9zZXR1cCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYW1wX21vZGVsX3NldHVwLAorCQkgICBwb2Rfc2V0X2FtcF9tb2RlbF9zZXR1cCk7CitzdGF0aWMgREVWSUNFX0FUVFIoYW1wX21vZGVsLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9hbXBfbW9kZWwsCisJCSAgIHBvZF9zZXRfYW1wX21vZGVsKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihkcml2ZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZHJpdmUsIHBvZF9zZXRfZHJpdmUpOwogc3RhdGljIERFVklDRV9BVFRSKGJhc3MsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2Jhc3MsIHBvZF9zZXRfYmFzcyk7CiBzdGF0aWMgREVWSUNFX0FUVFIobWlkLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9taWQsIHBvZF9zZXRfbWlkKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihsb3dtaWQsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2xvd21pZCwgcG9kX3NldF9sb3dtaWQpOwogc3RhdGljIERFVklDRV9BVFRSKHRyZWJsZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfdHJlYmxlLCBwb2Rfc2V0X3RyZWJsZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoaGlnaG1pZCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfaGlnaG1pZCwgcG9kX3NldF9oaWdobWlkKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihjaGFuX3ZvbCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfY2hhbl92b2wsIHBvZF9zZXRfY2hhbl92b2wpOwotc3RhdGljIERFVklDRV9BVFRSKHJldmVyYl9taXgsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3JldmVyYl9taXgsIHBvZF9zZXRfcmV2ZXJiX21peCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZWZmZWN0X3NldHVwLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9lZmZlY3Rfc2V0dXAsIHBvZF9zZXRfZWZmZWN0X3NldHVwKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihiYW5kXzFfZnJlcXVlbmN5LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9iYW5kXzFfZnJlcXVlbmN5LCBwb2Rfc2V0X2JhbmRfMV9mcmVxdWVuY3kpOwotc3RhdGljIERFVklDRV9BVFRSKHByZXNlbmNlLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9wcmVzZW5jZSwgcG9kX3NldF9wcmVzZW5jZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIyKHRyZWJsZV9fYmFzcywgdHJlYmxlLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF90cmVibGVfX2Jhc3MsIHBvZF9zZXRfdHJlYmxlX19iYXNzKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihub2lzZV9nYXRlX2VuYWJsZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfbm9pc2VfZ2F0ZV9lbmFibGUsIHBvZF9zZXRfbm9pc2VfZ2F0ZV9lbmFibGUpOwotc3RhdGljIERFVklDRV9BVFRSKGdhdGVfdGhyZXNob2xkLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9nYXRlX3RocmVzaG9sZCwgcG9kX3NldF9nYXRlX3RocmVzaG9sZCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZ2F0ZV9kZWNheV90aW1lLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9nYXRlX2RlY2F5X3RpbWUsIHBvZF9zZXRfZ2F0ZV9kZWNheV90aW1lKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihzdG9tcF9lbmFibGUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3N0b21wX2VuYWJsZSwgcG9kX3NldF9zdG9tcF9lbmFibGUpOwotc3RhdGljIERFVklDRV9BVFRSKGNvbXBfZW5hYmxlLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9jb21wX2VuYWJsZSwgcG9kX3NldF9jb21wX2VuYWJsZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoc3RvbXBfdGltZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfc3RvbXBfdGltZSwgcG9kX3NldF9zdG9tcF90aW1lKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihkZWxheV9lbmFibGUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2RlbGF5X2VuYWJsZSwgcG9kX3NldF9kZWxheV9lbmFibGUpOwotc3RhdGljIERFVklDRV9BVFRSKG1vZF9wYXJhbV8xLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9tb2RfcGFyYW1fMSwgcG9kX3NldF9tb2RfcGFyYW1fMSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfcGFyYW1fMSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZGVsYXlfcGFyYW1fMSwgcG9kX3NldF9kZWxheV9wYXJhbV8xKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihkZWxheV9wYXJhbV8xX25vdGVfdmFsdWUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2RlbGF5X3BhcmFtXzFfbm90ZV92YWx1ZSwgcG9kX3NldF9kZWxheV9wYXJhbV8xX25vdGVfdmFsdWUpOwotc3RhdGljIERFVklDRV9BVFRSMihiYW5kXzJfZnJlcXVlbmN5X19iYXNzLCBiYW5kXzJfZnJlcXVlbmN5LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9iYW5kXzJfZnJlcXVlbmN5X19iYXNzLCBwb2Rfc2V0X2JhbmRfMl9mcmVxdWVuY3lfX2Jhc3MpOwotc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X3BhcmFtXzIsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2RlbGF5X3BhcmFtXzIsIHBvZF9zZXRfZGVsYXlfcGFyYW1fMik7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfdm9sdW1lX21peCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZGVsYXlfdm9sdW1lX21peCwgcG9kX3NldF9kZWxheV92b2x1bWVfbWl4KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihkZWxheV9wYXJhbV8zLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kZWxheV9wYXJhbV8zLCBwb2Rfc2V0X2RlbGF5X3BhcmFtXzMpOwotc3RhdGljIERFVklDRV9BVFRSKHJldmVyYl9lbmFibGUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3JldmVyYl9lbmFibGUsIHBvZF9zZXRfcmV2ZXJiX2VuYWJsZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIocmV2ZXJiX3R5cGUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3JldmVyYl90eXBlLCBwb2Rfc2V0X3JldmVyYl90eXBlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihyZXZlcmJfZGVjYXksIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3JldmVyYl9kZWNheSwgcG9kX3NldF9yZXZlcmJfZGVjYXkpOwotc3RhdGljIERFVklDRV9BVFRSKHJldmVyYl90b25lLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9yZXZlcmJfdG9uZSwgcG9kX3NldF9yZXZlcmJfdG9uZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIocmV2ZXJiX3ByZV9kZWxheSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfcmV2ZXJiX3ByZV9kZWxheSwgcG9kX3NldF9yZXZlcmJfcHJlX2RlbGF5KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihyZXZlcmJfcHJlX3Bvc3QsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3JldmVyYl9wcmVfcG9zdCwgcG9kX3NldF9yZXZlcmJfcHJlX3Bvc3QpOwotc3RhdGljIERFVklDRV9BVFRSKGJhbmRfMl9mcmVxdWVuY3ksIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2JhbmRfMl9mcmVxdWVuY3ksIHBvZF9zZXRfYmFuZF8yX2ZyZXF1ZW5jeSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIyKGJhbmRfM19mcmVxdWVuY3lfX2Jhc3MsIGJhbmRfM19mcmVxdWVuY3ksIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2JhbmRfM19mcmVxdWVuY3lfX2Jhc3MsIHBvZF9zZXRfYmFuZF8zX2ZyZXF1ZW5jeV9fYmFzcyk7Ci1zdGF0aWMgREVWSUNFX0FUVFIod2FoX2VuYWJsZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfd2FoX2VuYWJsZSwgcG9kX3NldF93YWhfZW5hYmxlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihtb2R1bGF0aW9uX2xvX2N1dCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfbW9kdWxhdGlvbl9sb19jdXQsIHBvZF9zZXRfbW9kdWxhdGlvbl9sb19jdXQpOwotc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X3JldmVyYl9sb19jdXQsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2RlbGF5X3JldmVyYl9sb19jdXQsIHBvZF9zZXRfZGVsYXlfcmV2ZXJiX2xvX2N1dCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIodm9sdW1lX3BlZGFsX21pbmltdW0sIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3ZvbHVtZV9wZWRhbF9taW5pbXVtLCBwb2Rfc2V0X3ZvbHVtZV9wZWRhbF9taW5pbXVtKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihlcV9wcmVfcG9zdCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZXFfcHJlX3Bvc3QsIHBvZF9zZXRfZXFfcHJlX3Bvc3QpOwotc3RhdGljIERFVklDRV9BVFRSKHZvbHVtZV9wcmVfcG9zdCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfdm9sdW1lX3ByZV9wb3N0LCBwb2Rfc2V0X3ZvbHVtZV9wcmVfcG9zdCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZGlfbW9kZWwsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2RpX21vZGVsLCBwb2Rfc2V0X2RpX21vZGVsKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihkaV9kZWxheSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZGlfZGVsYXksIHBvZF9zZXRfZGlfZGVsYXkpOwotc3RhdGljIERFVklDRV9BVFRSKG1vZF9lbmFibGUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X21vZF9lbmFibGUsIHBvZF9zZXRfbW9kX2VuYWJsZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIobW9kX3BhcmFtXzFfbm90ZV92YWx1ZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfbW9kX3BhcmFtXzFfbm90ZV92YWx1ZSwgcG9kX3NldF9tb2RfcGFyYW1fMV9ub3RlX3ZhbHVlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihtb2RfcGFyYW1fMiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfbW9kX3BhcmFtXzIsIHBvZF9zZXRfbW9kX3BhcmFtXzIpOwotc3RhdGljIERFVklDRV9BVFRSKG1vZF9wYXJhbV8zLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9tb2RfcGFyYW1fMywgcG9kX3NldF9tb2RfcGFyYW1fMyk7Ci1zdGF0aWMgREVWSUNFX0FUVFIobW9kX3BhcmFtXzQsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X21vZF9wYXJhbV80LCBwb2Rfc2V0X21vZF9wYXJhbV80KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihtb2RfcGFyYW1fNSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfbW9kX3BhcmFtXzUsIHBvZF9zZXRfbW9kX3BhcmFtXzUpOwotc3RhdGljIERFVklDRV9BVFRSKG1vZF92b2x1bWVfbWl4LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9tb2Rfdm9sdW1lX21peCwgcG9kX3NldF9tb2Rfdm9sdW1lX21peCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIobW9kX3ByZV9wb3N0LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9tb2RfcHJlX3Bvc3QsIHBvZF9zZXRfbW9kX3ByZV9wb3N0KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihtb2R1bGF0aW9uX21vZGVsLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9tb2R1bGF0aW9uX21vZGVsLCBwb2Rfc2V0X21vZHVsYXRpb25fbW9kZWwpOwotc3RhdGljIERFVklDRV9BVFRSKGJhbmRfM19mcmVxdWVuY3ksIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2JhbmRfM19mcmVxdWVuY3ksIHBvZF9zZXRfYmFuZF8zX2ZyZXF1ZW5jeSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIyKGJhbmRfNF9mcmVxdWVuY3lfX2Jhc3MsIGJhbmRfNF9mcmVxdWVuY3ksIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2JhbmRfNF9mcmVxdWVuY3lfX2Jhc3MsIHBvZF9zZXRfYmFuZF80X2ZyZXF1ZW5jeV9fYmFzcyk7Ci1zdGF0aWMgREVWSUNFX0FUVFIobW9kX3BhcmFtXzFfZG91YmxlX3ByZWNpc2lvbiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfbW9kX3BhcmFtXzFfZG91YmxlX3ByZWNpc2lvbiwgcG9kX3NldF9tb2RfcGFyYW1fMV9kb3VibGVfcHJlY2lzaW9uKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihkZWxheV9wYXJhbV8xX2RvdWJsZV9wcmVjaXNpb24sIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2RlbGF5X3BhcmFtXzFfZG91YmxlX3ByZWNpc2lvbiwgcG9kX3NldF9kZWxheV9wYXJhbV8xX2RvdWJsZV9wcmVjaXNpb24pOwotc3RhdGljIERFVklDRV9BVFRSKGVxX2VuYWJsZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZXFfZW5hYmxlLCBwb2Rfc2V0X2VxX2VuYWJsZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoaGlnaG1pZCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfaGlnaG1pZCwKKwkJICAgcG9kX3NldF9oaWdobWlkKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihjaGFuX3ZvbCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfY2hhbl92b2wsCisJCSAgIHBvZF9zZXRfY2hhbl92b2wpOworc3RhdGljIERFVklDRV9BVFRSKHJldmVyYl9taXgsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3JldmVyYl9taXgsCisJCSAgIHBvZF9zZXRfcmV2ZXJiX21peCk7CitzdGF0aWMgREVWSUNFX0FUVFIoZWZmZWN0X3NldHVwLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9lZmZlY3Rfc2V0dXAsCisJCSAgIHBvZF9zZXRfZWZmZWN0X3NldHVwKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihiYW5kXzFfZnJlcXVlbmN5LCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgcG9kX2dldF9iYW5kXzFfZnJlcXVlbmN5LCBwb2Rfc2V0X2JhbmRfMV9mcmVxdWVuY3kpOworc3RhdGljIERFVklDRV9BVFRSKHByZXNlbmNlLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9wcmVzZW5jZSwKKwkJICAgcG9kX3NldF9wcmVzZW5jZSk7CitzdGF0aWMgREVWSUNFX0FUVFIyKHRyZWJsZV9fYmFzcywgdHJlYmxlLCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgIHBvZF9nZXRfdHJlYmxlX19iYXNzLCBwb2Rfc2V0X3RyZWJsZV9fYmFzcyk7CitzdGF0aWMgREVWSUNFX0FUVFIobm9pc2VfZ2F0ZV9lbmFibGUsIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICBwb2RfZ2V0X25vaXNlX2dhdGVfZW5hYmxlLCBwb2Rfc2V0X25vaXNlX2dhdGVfZW5hYmxlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihnYXRlX3RocmVzaG9sZCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZ2F0ZV90aHJlc2hvbGQsCisJCSAgIHBvZF9zZXRfZ2F0ZV90aHJlc2hvbGQpOworc3RhdGljIERFVklDRV9BVFRSKGdhdGVfZGVjYXlfdGltZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZ2F0ZV9kZWNheV90aW1lLAorCQkgICBwb2Rfc2V0X2dhdGVfZGVjYXlfdGltZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoc3RvbXBfZW5hYmxlLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9zdG9tcF9lbmFibGUsCisJCSAgIHBvZF9zZXRfc3RvbXBfZW5hYmxlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihjb21wX2VuYWJsZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfY29tcF9lbmFibGUsCisJCSAgIHBvZF9zZXRfY29tcF9lbmFibGUpOworc3RhdGljIERFVklDRV9BVFRSKHN0b21wX3RpbWUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3N0b21wX3RpbWUsCisJCSAgIHBvZF9zZXRfc3RvbXBfdGltZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfZW5hYmxlLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kZWxheV9lbmFibGUsCisJCSAgIHBvZF9zZXRfZGVsYXlfZW5hYmxlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihtb2RfcGFyYW1fMSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfbW9kX3BhcmFtXzEsCisJCSAgIHBvZF9zZXRfbW9kX3BhcmFtXzEpOworc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X3BhcmFtXzEsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2RlbGF5X3BhcmFtXzEsCisJCSAgIHBvZF9zZXRfZGVsYXlfcGFyYW1fMSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfcGFyYW1fMV9ub3RlX3ZhbHVlLCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgcG9kX2dldF9kZWxheV9wYXJhbV8xX25vdGVfdmFsdWUsCisJCSAgIHBvZF9zZXRfZGVsYXlfcGFyYW1fMV9ub3RlX3ZhbHVlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUjIoYmFuZF8yX2ZyZXF1ZW5jeV9fYmFzcywgYmFuZF8yX2ZyZXF1ZW5jeSwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgICBwb2RfZ2V0X2JhbmRfMl9mcmVxdWVuY3lfX2Jhc3MsCisJCSAgICBwb2Rfc2V0X2JhbmRfMl9mcmVxdWVuY3lfX2Jhc3MpOworc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X3BhcmFtXzIsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2RlbGF5X3BhcmFtXzIsCisJCSAgIHBvZF9zZXRfZGVsYXlfcGFyYW1fMik7CitzdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfdm9sdW1lX21peCwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgIHBvZF9nZXRfZGVsYXlfdm9sdW1lX21peCwgcG9kX3NldF9kZWxheV92b2x1bWVfbWl4KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihkZWxheV9wYXJhbV8zLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kZWxheV9wYXJhbV8zLAorCQkgICBwb2Rfc2V0X2RlbGF5X3BhcmFtXzMpOworc3RhdGljIERFVklDRV9BVFRSKHJldmVyYl9lbmFibGUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3JldmVyYl9lbmFibGUsCisJCSAgIHBvZF9zZXRfcmV2ZXJiX2VuYWJsZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocmV2ZXJiX3R5cGUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3JldmVyYl90eXBlLAorCQkgICBwb2Rfc2V0X3JldmVyYl90eXBlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihyZXZlcmJfZGVjYXksIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3JldmVyYl9kZWNheSwKKwkJICAgcG9kX3NldF9yZXZlcmJfZGVjYXkpOworc3RhdGljIERFVklDRV9BVFRSKHJldmVyYl90b25lLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9yZXZlcmJfdG9uZSwKKwkJICAgcG9kX3NldF9yZXZlcmJfdG9uZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocmV2ZXJiX3ByZV9kZWxheSwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgIHBvZF9nZXRfcmV2ZXJiX3ByZV9kZWxheSwgcG9kX3NldF9yZXZlcmJfcHJlX2RlbGF5KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihyZXZlcmJfcHJlX3Bvc3QsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3JldmVyYl9wcmVfcG9zdCwKKwkJICAgcG9kX3NldF9yZXZlcmJfcHJlX3Bvc3QpOworc3RhdGljIERFVklDRV9BVFRSKGJhbmRfMl9mcmVxdWVuY3ksIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICBwb2RfZ2V0X2JhbmRfMl9mcmVxdWVuY3ksIHBvZF9zZXRfYmFuZF8yX2ZyZXF1ZW5jeSk7CitzdGF0aWMgREVWSUNFX0FUVFIyKGJhbmRfM19mcmVxdWVuY3lfX2Jhc3MsIGJhbmRfM19mcmVxdWVuY3ksIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICAgcG9kX2dldF9iYW5kXzNfZnJlcXVlbmN5X19iYXNzLAorCQkgICAgcG9kX3NldF9iYW5kXzNfZnJlcXVlbmN5X19iYXNzKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih3YWhfZW5hYmxlLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF93YWhfZW5hYmxlLAorCQkgICBwb2Rfc2V0X3dhaF9lbmFibGUpOworc3RhdGljIERFVklDRV9BVFRSKG1vZHVsYXRpb25fbG9fY3V0LCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgcG9kX2dldF9tb2R1bGF0aW9uX2xvX2N1dCwgcG9kX3NldF9tb2R1bGF0aW9uX2xvX2N1dCk7CitzdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfcmV2ZXJiX2xvX2N1dCwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgIHBvZF9nZXRfZGVsYXlfcmV2ZXJiX2xvX2N1dCwgcG9kX3NldF9kZWxheV9yZXZlcmJfbG9fY3V0KTsKK3N0YXRpYyBERVZJQ0VfQVRUUih2b2x1bWVfcGVkYWxfbWluaW11bSwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgIHBvZF9nZXRfdm9sdW1lX3BlZGFsX21pbmltdW0sIHBvZF9zZXRfdm9sdW1lX3BlZGFsX21pbmltdW0pOworc3RhdGljIERFVklDRV9BVFRSKGVxX3ByZV9wb3N0LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9lcV9wcmVfcG9zdCwKKwkJICAgcG9kX3NldF9lcV9wcmVfcG9zdCk7CitzdGF0aWMgREVWSUNFX0FUVFIodm9sdW1lX3ByZV9wb3N0LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF92b2x1bWVfcHJlX3Bvc3QsCisJCSAgIHBvZF9zZXRfdm9sdW1lX3ByZV9wb3N0KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihkaV9tb2RlbCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZGlfbW9kZWwsCisJCSAgIHBvZF9zZXRfZGlfbW9kZWwpOworc3RhdGljIERFVklDRV9BVFRSKGRpX2RlbGF5LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kaV9kZWxheSwKKwkJICAgcG9kX3NldF9kaV9kZWxheSk7CitzdGF0aWMgREVWSUNFX0FUVFIobW9kX2VuYWJsZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfbW9kX2VuYWJsZSwKKwkJICAgcG9kX3NldF9tb2RfZW5hYmxlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihtb2RfcGFyYW1fMV9ub3RlX3ZhbHVlLCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgcG9kX2dldF9tb2RfcGFyYW1fMV9ub3RlX3ZhbHVlLAorCQkgICBwb2Rfc2V0X21vZF9wYXJhbV8xX25vdGVfdmFsdWUpOworc3RhdGljIERFVklDRV9BVFRSKG1vZF9wYXJhbV8yLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9tb2RfcGFyYW1fMiwKKwkJICAgcG9kX3NldF9tb2RfcGFyYW1fMik7CitzdGF0aWMgREVWSUNFX0FUVFIobW9kX3BhcmFtXzMsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X21vZF9wYXJhbV8zLAorCQkgICBwb2Rfc2V0X21vZF9wYXJhbV8zKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihtb2RfcGFyYW1fNCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfbW9kX3BhcmFtXzQsCisJCSAgIHBvZF9zZXRfbW9kX3BhcmFtXzQpOworc3RhdGljIERFVklDRV9BVFRSKG1vZF9wYXJhbV81LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9tb2RfcGFyYW1fNSwKKwkJICAgcG9kX3NldF9tb2RfcGFyYW1fNSk7CitzdGF0aWMgREVWSUNFX0FUVFIobW9kX3ZvbHVtZV9taXgsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X21vZF92b2x1bWVfbWl4LAorCQkgICBwb2Rfc2V0X21vZF92b2x1bWVfbWl4KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihtb2RfcHJlX3Bvc3QsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X21vZF9wcmVfcG9zdCwKKwkJICAgcG9kX3NldF9tb2RfcHJlX3Bvc3QpOworc3RhdGljIERFVklDRV9BVFRSKG1vZHVsYXRpb25fbW9kZWwsIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICBwb2RfZ2V0X21vZHVsYXRpb25fbW9kZWwsIHBvZF9zZXRfbW9kdWxhdGlvbl9tb2RlbCk7CitzdGF0aWMgREVWSUNFX0FUVFIoYmFuZF8zX2ZyZXF1ZW5jeSwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgIHBvZF9nZXRfYmFuZF8zX2ZyZXF1ZW5jeSwgcG9kX3NldF9iYW5kXzNfZnJlcXVlbmN5KTsKK3N0YXRpYyBERVZJQ0VfQVRUUjIoYmFuZF80X2ZyZXF1ZW5jeV9fYmFzcywgYmFuZF80X2ZyZXF1ZW5jeSwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgICBwb2RfZ2V0X2JhbmRfNF9mcmVxdWVuY3lfX2Jhc3MsCisJCSAgICBwb2Rfc2V0X2JhbmRfNF9mcmVxdWVuY3lfX2Jhc3MpOworc3RhdGljIERFVklDRV9BVFRSKG1vZF9wYXJhbV8xX2RvdWJsZV9wcmVjaXNpb24sIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICBwb2RfZ2V0X21vZF9wYXJhbV8xX2RvdWJsZV9wcmVjaXNpb24sCisJCSAgIHBvZF9zZXRfbW9kX3BhcmFtXzFfZG91YmxlX3ByZWNpc2lvbik7CitzdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfcGFyYW1fMV9kb3VibGVfcHJlY2lzaW9uLCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgcG9kX2dldF9kZWxheV9wYXJhbV8xX2RvdWJsZV9wcmVjaXNpb24sCisJCSAgIHBvZF9zZXRfZGVsYXlfcGFyYW1fMV9kb3VibGVfcHJlY2lzaW9uKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihlcV9lbmFibGUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2VxX2VuYWJsZSwKKwkJICAgcG9kX3NldF9lcV9lbmFibGUpOwogc3RhdGljIERFVklDRV9BVFRSKHRhcCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfdGFwLCBwb2Rfc2V0X3RhcCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIodm9sdW1lX3R3ZWFrX3BlZGFsX2Fzc2lnbiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfdm9sdW1lX3R3ZWFrX3BlZGFsX2Fzc2lnbiwgcG9kX3NldF92b2x1bWVfdHdlYWtfcGVkYWxfYXNzaWduKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihiYW5kXzVfZnJlcXVlbmN5LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9iYW5kXzVfZnJlcXVlbmN5LCBwb2Rfc2V0X2JhbmRfNV9mcmVxdWVuY3kpOworc3RhdGljIERFVklDRV9BVFRSKHZvbHVtZV90d2Vha19wZWRhbF9hc3NpZ24sIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICBwb2RfZ2V0X3ZvbHVtZV90d2Vha19wZWRhbF9hc3NpZ24sCisJCSAgIHBvZF9zZXRfdm9sdW1lX3R3ZWFrX3BlZGFsX2Fzc2lnbik7CitzdGF0aWMgREVWSUNFX0FUVFIoYmFuZF81X2ZyZXF1ZW5jeSwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgIHBvZF9nZXRfYmFuZF81X2ZyZXF1ZW5jeSwgcG9kX3NldF9iYW5kXzVfZnJlcXVlbmN5KTsKIHN0YXRpYyBERVZJQ0VfQVRUUih0dW5lciwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfdHVuZXIsIHBvZF9zZXRfdHVuZXIpOwotc3RhdGljIERFVklDRV9BVFRSKG1pY19zZWxlY3Rpb24sIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X21pY19zZWxlY3Rpb24sIHBvZF9zZXRfbWljX3NlbGVjdGlvbik7Ci1zdGF0aWMgREVWSUNFX0FUVFIoY2FiaW5ldF9tb2RlbCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfY2FiaW5ldF9tb2RlbCwgcG9kX3NldF9jYWJpbmV0X21vZGVsKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihzdG9tcF9tb2RlbCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfc3RvbXBfbW9kZWwsIHBvZF9zZXRfc3RvbXBfbW9kZWwpOwotc3RhdGljIERFVklDRV9BVFRSKHJvb21sZXZlbCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfcm9vbWxldmVsLCBwb2Rfc2V0X3Jvb21sZXZlbCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoYmFuZF80X2ZyZXF1ZW5jeSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYmFuZF80X2ZyZXF1ZW5jeSwgcG9kX3NldF9iYW5kXzRfZnJlcXVlbmN5KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihiYW5kXzZfZnJlcXVlbmN5LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9iYW5kXzZfZnJlcXVlbmN5LCBwb2Rfc2V0X2JhbmRfNl9mcmVxdWVuY3kpOwotc3RhdGljIERFVklDRV9BVFRSKHN0b21wX3BhcmFtXzFfbm90ZV92YWx1ZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfc3RvbXBfcGFyYW1fMV9ub3RlX3ZhbHVlLCBwb2Rfc2V0X3N0b21wX3BhcmFtXzFfbm90ZV92YWx1ZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoc3RvbXBfcGFyYW1fMiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfc3RvbXBfcGFyYW1fMiwgcG9kX3NldF9zdG9tcF9wYXJhbV8yKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihzdG9tcF9wYXJhbV8zLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9zdG9tcF9wYXJhbV8zLCBwb2Rfc2V0X3N0b21wX3BhcmFtXzMpOwotc3RhdGljIERFVklDRV9BVFRSKHN0b21wX3BhcmFtXzQsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3N0b21wX3BhcmFtXzQsIHBvZF9zZXRfc3RvbXBfcGFyYW1fNCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoc3RvbXBfcGFyYW1fNSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfc3RvbXBfcGFyYW1fNSwgcG9kX3NldF9zdG9tcF9wYXJhbV81KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihzdG9tcF9wYXJhbV82LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9zdG9tcF9wYXJhbV82LCBwb2Rfc2V0X3N0b21wX3BhcmFtXzYpOwotc3RhdGljIERFVklDRV9BVFRSKGFtcF9zd2l0Y2hfc2VsZWN0LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9hbXBfc3dpdGNoX3NlbGVjdCwgcG9kX3NldF9hbXBfc3dpdGNoX3NlbGVjdCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfcGFyYW1fNCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZGVsYXlfcGFyYW1fNCwgcG9kX3NldF9kZWxheV9wYXJhbV80KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihkZWxheV9wYXJhbV81LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kZWxheV9wYXJhbV81LCBwb2Rfc2V0X2RlbGF5X3BhcmFtXzUpOwotc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X3ByZV9wb3N0LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kZWxheV9wcmVfcG9zdCwgcG9kX3NldF9kZWxheV9wcmVfcG9zdCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfbW9kZWwsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2RlbGF5X21vZGVsLCBwb2Rfc2V0X2RlbGF5X21vZGVsKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihkZWxheV92ZXJiX21vZGVsLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kZWxheV92ZXJiX21vZGVsLCBwb2Rfc2V0X2RlbGF5X3ZlcmJfbW9kZWwpOwotc3RhdGljIERFVklDRV9BVFRSKHRlbXBvX21zYiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfdGVtcG9fbXNiLCBwb2Rfc2V0X3RlbXBvX21zYik7Ci1zdGF0aWMgREVWSUNFX0FUVFIodGVtcG9fbHNiLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF90ZW1wb19sc2IsIHBvZF9zZXRfdGVtcG9fbHNiKTsKLXN0YXRpYyBERVZJQ0VfQVRUUih3YWhfbW9kZWwsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3dhaF9tb2RlbCwgcG9kX3NldF93YWhfbW9kZWwpOwotc3RhdGljIERFVklDRV9BVFRSKGJ5cGFzc192b2x1bWUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2J5cGFzc192b2x1bWUsIHBvZF9zZXRfYnlwYXNzX3ZvbHVtZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZnhfbG9vcF9vbl9vZmYsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2Z4X2xvb3Bfb25fb2ZmLCBwb2Rfc2V0X2Z4X2xvb3Bfb25fb2ZmKTsKLXN0YXRpYyBERVZJQ0VfQVRUUih0d2Vha19wYXJhbV9zZWxlY3QsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3R3ZWFrX3BhcmFtX3NlbGVjdCwgcG9kX3NldF90d2Vha19wYXJhbV9zZWxlY3QpOwotc3RhdGljIERFVklDRV9BVFRSKGFtcDFfZW5nYWdlLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9hbXAxX2VuZ2FnZSwgcG9kX3NldF9hbXAxX2VuZ2FnZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoYmFuZF8xX2dhaW4sIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2JhbmRfMV9nYWluLCBwb2Rfc2V0X2JhbmRfMV9nYWluKTsKLXN0YXRpYyBERVZJQ0VfQVRUUjIoYmFuZF8yX2dhaW5fX2Jhc3MsIGJhbmRfMl9nYWluLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9iYW5kXzJfZ2Fpbl9fYmFzcywgcG9kX3NldF9iYW5kXzJfZ2Fpbl9fYmFzcyk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoYmFuZF8yX2dhaW4sIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2JhbmRfMl9nYWluLCBwb2Rfc2V0X2JhbmRfMl9nYWluKTsKLXN0YXRpYyBERVZJQ0VfQVRUUjIoYmFuZF8zX2dhaW5fX2Jhc3MsIGJhbmRfM19nYWluLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9iYW5kXzNfZ2Fpbl9fYmFzcywgcG9kX3NldF9iYW5kXzNfZ2Fpbl9fYmFzcyk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoYmFuZF8zX2dhaW4sIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2JhbmRfM19nYWluLCBwb2Rfc2V0X2JhbmRfM19nYWluKTsKLXN0YXRpYyBERVZJQ0VfQVRUUjIoYmFuZF80X2dhaW5fX2Jhc3MsIGJhbmRfNF9nYWluLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9iYW5kXzRfZ2Fpbl9fYmFzcywgcG9kX3NldF9iYW5kXzRfZ2Fpbl9fYmFzcyk7Ci1zdGF0aWMgREVWSUNFX0FUVFIyKGJhbmRfNV9nYWluX19iYXNzLCBiYW5kXzVfZ2FpbiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYmFuZF81X2dhaW5fX2Jhc3MsIHBvZF9zZXRfYmFuZF81X2dhaW5fX2Jhc3MpOwotc3RhdGljIERFVklDRV9BVFRSKGJhbmRfNF9nYWluLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9iYW5kXzRfZ2FpbiwgcG9kX3NldF9iYW5kXzRfZ2Fpbik7Ci1zdGF0aWMgREVWSUNFX0FUVFIyKGJhbmRfNl9nYWluX19iYXNzLCBiYW5kXzZfZ2FpbiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYmFuZF82X2dhaW5fX2Jhc3MsIHBvZF9zZXRfYmFuZF82X2dhaW5fX2Jhc3MpOworc3RhdGljIERFVklDRV9BVFRSKG1pY19zZWxlY3Rpb24sIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X21pY19zZWxlY3Rpb24sCisJCSAgIHBvZF9zZXRfbWljX3NlbGVjdGlvbik7CitzdGF0aWMgREVWSUNFX0FUVFIoY2FiaW5ldF9tb2RlbCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfY2FiaW5ldF9tb2RlbCwKKwkJICAgcG9kX3NldF9jYWJpbmV0X21vZGVsKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihzdG9tcF9tb2RlbCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfc3RvbXBfbW9kZWwsCisJCSAgIHBvZF9zZXRfc3RvbXBfbW9kZWwpOworc3RhdGljIERFVklDRV9BVFRSKHJvb21sZXZlbCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfcm9vbWxldmVsLAorCQkgICBwb2Rfc2V0X3Jvb21sZXZlbCk7CitzdGF0aWMgREVWSUNFX0FUVFIoYmFuZF80X2ZyZXF1ZW5jeSwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgIHBvZF9nZXRfYmFuZF80X2ZyZXF1ZW5jeSwgcG9kX3NldF9iYW5kXzRfZnJlcXVlbmN5KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihiYW5kXzZfZnJlcXVlbmN5LCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgcG9kX2dldF9iYW5kXzZfZnJlcXVlbmN5LCBwb2Rfc2V0X2JhbmRfNl9mcmVxdWVuY3kpOworc3RhdGljIERFVklDRV9BVFRSKHN0b21wX3BhcmFtXzFfbm90ZV92YWx1ZSwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgIHBvZF9nZXRfc3RvbXBfcGFyYW1fMV9ub3RlX3ZhbHVlLAorCQkgICBwb2Rfc2V0X3N0b21wX3BhcmFtXzFfbm90ZV92YWx1ZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoc3RvbXBfcGFyYW1fMiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfc3RvbXBfcGFyYW1fMiwKKwkJICAgcG9kX3NldF9zdG9tcF9wYXJhbV8yKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihzdG9tcF9wYXJhbV8zLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9zdG9tcF9wYXJhbV8zLAorCQkgICBwb2Rfc2V0X3N0b21wX3BhcmFtXzMpOworc3RhdGljIERFVklDRV9BVFRSKHN0b21wX3BhcmFtXzQsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3N0b21wX3BhcmFtXzQsCisJCSAgIHBvZF9zZXRfc3RvbXBfcGFyYW1fNCk7CitzdGF0aWMgREVWSUNFX0FUVFIoc3RvbXBfcGFyYW1fNSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfc3RvbXBfcGFyYW1fNSwKKwkJICAgcG9kX3NldF9zdG9tcF9wYXJhbV81KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihzdG9tcF9wYXJhbV82LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9zdG9tcF9wYXJhbV82LAorCQkgICBwb2Rfc2V0X3N0b21wX3BhcmFtXzYpOworc3RhdGljIERFVklDRV9BVFRSKGFtcF9zd2l0Y2hfc2VsZWN0LCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgcG9kX2dldF9hbXBfc3dpdGNoX3NlbGVjdCwgcG9kX3NldF9hbXBfc3dpdGNoX3NlbGVjdCk7CitzdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfcGFyYW1fNCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZGVsYXlfcGFyYW1fNCwKKwkJICAgcG9kX3NldF9kZWxheV9wYXJhbV80KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihkZWxheV9wYXJhbV81LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kZWxheV9wYXJhbV81LAorCQkgICBwb2Rfc2V0X2RlbGF5X3BhcmFtXzUpOworc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X3ByZV9wb3N0LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kZWxheV9wcmVfcG9zdCwKKwkJICAgcG9kX3NldF9kZWxheV9wcmVfcG9zdCk7CitzdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfbW9kZWwsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2RlbGF5X21vZGVsLAorCQkgICBwb2Rfc2V0X2RlbGF5X21vZGVsKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihkZWxheV92ZXJiX21vZGVsLCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgcG9kX2dldF9kZWxheV92ZXJiX21vZGVsLCBwb2Rfc2V0X2RlbGF5X3ZlcmJfbW9kZWwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXBvX21zYiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfdGVtcG9fbXNiLAorCQkgICBwb2Rfc2V0X3RlbXBvX21zYik7CitzdGF0aWMgREVWSUNFX0FUVFIodGVtcG9fbHNiLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF90ZW1wb19sc2IsCisJCSAgIHBvZF9zZXRfdGVtcG9fbHNiKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih3YWhfbW9kZWwsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3dhaF9tb2RlbCwKKwkJICAgcG9kX3NldF93YWhfbW9kZWwpOworc3RhdGljIERFVklDRV9BVFRSKGJ5cGFzc192b2x1bWUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2J5cGFzc192b2x1bWUsCisJCSAgIHBvZF9zZXRfYnlwYXNzX3ZvbHVtZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZnhfbG9vcF9vbl9vZmYsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2Z4X2xvb3Bfb25fb2ZmLAorCQkgICBwb2Rfc2V0X2Z4X2xvb3Bfb25fb2ZmKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0d2Vha19wYXJhbV9zZWxlY3QsIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICBwb2RfZ2V0X3R3ZWFrX3BhcmFtX3NlbGVjdCwgcG9kX3NldF90d2Vha19wYXJhbV9zZWxlY3QpOworc3RhdGljIERFVklDRV9BVFRSKGFtcDFfZW5nYWdlLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9hbXAxX2VuZ2FnZSwKKwkJICAgcG9kX3NldF9hbXAxX2VuZ2FnZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoYmFuZF8xX2dhaW4sIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2JhbmRfMV9nYWluLAorCQkgICBwb2Rfc2V0X2JhbmRfMV9nYWluKTsKK3N0YXRpYyBERVZJQ0VfQVRUUjIoYmFuZF8yX2dhaW5fX2Jhc3MsIGJhbmRfMl9nYWluLCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgIHBvZF9nZXRfYmFuZF8yX2dhaW5fX2Jhc3MsIHBvZF9zZXRfYmFuZF8yX2dhaW5fX2Jhc3MpOworc3RhdGljIERFVklDRV9BVFRSKGJhbmRfMl9nYWluLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9iYW5kXzJfZ2FpbiwKKwkJICAgcG9kX3NldF9iYW5kXzJfZ2Fpbik7CitzdGF0aWMgREVWSUNFX0FUVFIyKGJhbmRfM19nYWluX19iYXNzLCBiYW5kXzNfZ2FpbiwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgICBwb2RfZ2V0X2JhbmRfM19nYWluX19iYXNzLCBwb2Rfc2V0X2JhbmRfM19nYWluX19iYXNzKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihiYW5kXzNfZ2FpbiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYmFuZF8zX2dhaW4sCisJCSAgIHBvZF9zZXRfYmFuZF8zX2dhaW4pOworc3RhdGljIERFVklDRV9BVFRSMihiYW5kXzRfZ2Fpbl9fYmFzcywgYmFuZF80X2dhaW4sIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICAgcG9kX2dldF9iYW5kXzRfZ2Fpbl9fYmFzcywgcG9kX3NldF9iYW5kXzRfZ2Fpbl9fYmFzcyk7CitzdGF0aWMgREVWSUNFX0FUVFIyKGJhbmRfNV9nYWluX19iYXNzLCBiYW5kXzVfZ2FpbiwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgICBwb2RfZ2V0X2JhbmRfNV9nYWluX19iYXNzLCBwb2Rfc2V0X2JhbmRfNV9nYWluX19iYXNzKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihiYW5kXzRfZ2FpbiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYmFuZF80X2dhaW4sCisJCSAgIHBvZF9zZXRfYmFuZF80X2dhaW4pOworc3RhdGljIERFVklDRV9BVFRSMihiYW5kXzZfZ2Fpbl9fYmFzcywgYmFuZF82X2dhaW4sIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICAgcG9kX2dldF9iYW5kXzZfZ2Fpbl9fYmFzcywgcG9kX3NldF9iYW5kXzZfZ2Fpbl9fYmFzcyk7CiBzdGF0aWMgREVWSUNFX0FUVFIoYm9keSwgU19JUlVHTywgdmFyaWF4X2dldF9ib2R5LCBsaW5lNl9ub3Bfd3JpdGUpOwotc3RhdGljIERFVklDRV9BVFRSKHBpY2t1cDFfZW5hYmxlLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3BpY2t1cDFfZW5hYmxlLCBsaW5lNl9ub3Bfd3JpdGUpOwotc3RhdGljIERFVklDRV9BVFRSKHBpY2t1cDFfdHlwZSwgU19JUlVHTywgdmFyaWF4X2dldF9waWNrdXAxX3R5cGUsIGxpbmU2X25vcF93cml0ZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIocGlja3VwMV9wb3NpdGlvbiwgU19JUlVHTywgdmFyaWF4X2dldF9waWNrdXAxX3Bvc2l0aW9uLCBsaW5lNl9ub3Bfd3JpdGUpOwotc3RhdGljIERFVklDRV9BVFRSKHBpY2t1cDFfYW5nbGUsIFNfSVJVR08sIHZhcmlheF9nZXRfcGlja3VwMV9hbmdsZSwgbGluZTZfbm9wX3dyaXRlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihwaWNrdXAxX2xldmVsLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3BpY2t1cDFfbGV2ZWwsIGxpbmU2X25vcF93cml0ZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIocGlja3VwMl9lbmFibGUsIFNfSVJVR08sIHZhcmlheF9nZXRfcGlja3VwMl9lbmFibGUsIGxpbmU2X25vcF93cml0ZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIocGlja3VwMl90eXBlLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3BpY2t1cDJfdHlwZSwgbGluZTZfbm9wX3dyaXRlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihwaWNrdXAyX3Bvc2l0aW9uLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3BpY2t1cDJfcG9zaXRpb24sIGxpbmU2X25vcF93cml0ZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIocGlja3VwMl9hbmdsZSwgU19JUlVHTywgdmFyaWF4X2dldF9waWNrdXAyX2FuZ2xlLCBsaW5lNl9ub3Bfd3JpdGUpOwotc3RhdGljIERFVklDRV9BVFRSKHBpY2t1cDJfbGV2ZWwsIFNfSVJVR08sIHZhcmlheF9nZXRfcGlja3VwMl9sZXZlbCwgbGluZTZfbm9wX3dyaXRlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihwaWNrdXBfcGhhc2UsIFNfSVJVR08sIHZhcmlheF9nZXRfcGlja3VwX3BoYXNlLCBsaW5lNl9ub3Bfd3JpdGUpOwotc3RhdGljIERFVklDRV9BVFRSKGNhcGFjaXRhbmNlLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X2NhcGFjaXRhbmNlLCBsaW5lNl9ub3Bfd3JpdGUpOwotc3RhdGljIERFVklDRV9BVFRSKHRvbmVfcmVzaXN0YW5jZSwgU19JUlVHTywgdmFyaWF4X2dldF90b25lX3Jlc2lzdGFuY2UsIGxpbmU2X25vcF93cml0ZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIodm9sdW1lX3Jlc2lzdGFuY2UsIFNfSVJVR08sIHZhcmlheF9nZXRfdm9sdW1lX3Jlc2lzdGFuY2UsIGxpbmU2X25vcF93cml0ZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocGlja3VwMV9lbmFibGUsIFNfSVJVR08sIHZhcmlheF9nZXRfcGlja3VwMV9lbmFibGUsCisJCSAgIGxpbmU2X25vcF93cml0ZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocGlja3VwMV90eXBlLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3BpY2t1cDFfdHlwZSwKKwkJICAgbGluZTZfbm9wX3dyaXRlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwaWNrdXAxX3Bvc2l0aW9uLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3BpY2t1cDFfcG9zaXRpb24sCisJCSAgIGxpbmU2X25vcF93cml0ZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocGlja3VwMV9hbmdsZSwgU19JUlVHTywgdmFyaWF4X2dldF9waWNrdXAxX2FuZ2xlLAorCQkgICBsaW5lNl9ub3Bfd3JpdGUpOworc3RhdGljIERFVklDRV9BVFRSKHBpY2t1cDFfbGV2ZWwsIFNfSVJVR08sIHZhcmlheF9nZXRfcGlja3VwMV9sZXZlbCwKKwkJICAgbGluZTZfbm9wX3dyaXRlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwaWNrdXAyX2VuYWJsZSwgU19JUlVHTywgdmFyaWF4X2dldF9waWNrdXAyX2VuYWJsZSwKKwkJICAgbGluZTZfbm9wX3dyaXRlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwaWNrdXAyX3R5cGUsIFNfSVJVR08sIHZhcmlheF9nZXRfcGlja3VwMl90eXBlLAorCQkgICBsaW5lNl9ub3Bfd3JpdGUpOworc3RhdGljIERFVklDRV9BVFRSKHBpY2t1cDJfcG9zaXRpb24sIFNfSVJVR08sIHZhcmlheF9nZXRfcGlja3VwMl9wb3NpdGlvbiwKKwkJICAgbGluZTZfbm9wX3dyaXRlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwaWNrdXAyX2FuZ2xlLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3BpY2t1cDJfYW5nbGUsCisJCSAgIGxpbmU2X25vcF93cml0ZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocGlja3VwMl9sZXZlbCwgU19JUlVHTywgdmFyaWF4X2dldF9waWNrdXAyX2xldmVsLAorCQkgICBsaW5lNl9ub3Bfd3JpdGUpOworc3RhdGljIERFVklDRV9BVFRSKHBpY2t1cF9waGFzZSwgU19JUlVHTywgdmFyaWF4X2dldF9waWNrdXBfcGhhc2UsCisJCSAgIGxpbmU2X25vcF93cml0ZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoY2FwYWNpdGFuY2UsIFNfSVJVR08sIHZhcmlheF9nZXRfY2FwYWNpdGFuY2UsCisJCSAgIGxpbmU2X25vcF93cml0ZSk7CitzdGF0aWMgREVWSUNFX0FUVFIodG9uZV9yZXNpc3RhbmNlLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3RvbmVfcmVzaXN0YW5jZSwKKwkJICAgbGluZTZfbm9wX3dyaXRlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih2b2x1bWVfcmVzaXN0YW5jZSwgU19JUlVHTywgdmFyaWF4X2dldF92b2x1bWVfcmVzaXN0YW5jZSwKKwkJICAgbGluZTZfbm9wX3dyaXRlKTsKIHN0YXRpYyBERVZJQ0VfQVRUUih0YXBlciwgU19JUlVHTywgdmFyaWF4X2dldF90YXBlciwgbGluZTZfbm9wX3dyaXRlKTsKIHN0YXRpYyBERVZJQ0VfQVRUUih0b25lX2R1bXAsIFNfSVJVR08sIHZhcmlheF9nZXRfdG9uZV9kdW1wLCBsaW5lNl9ub3Bfd3JpdGUpOwogc3RhdGljIERFVklDRV9BVFRSKHNhdmVfdG9uZSwgU19JUlVHTywgdmFyaWF4X2dldF9zYXZlX3RvbmUsIGxpbmU2X25vcF93cml0ZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIodm9sdW1lX2R1bXAsIFNfSVJVR08sIHZhcmlheF9nZXRfdm9sdW1lX2R1bXAsIGxpbmU2X25vcF93cml0ZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIodHVuaW5nX2VuYWJsZSwgU19JUlVHTywgdmFyaWF4X2dldF90dW5pbmdfZW5hYmxlLCBsaW5lNl9ub3Bfd3JpdGUpOworc3RhdGljIERFVklDRV9BVFRSKHZvbHVtZV9kdW1wLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3ZvbHVtZV9kdW1wLAorCQkgICBsaW5lNl9ub3Bfd3JpdGUpOworc3RhdGljIERFVklDRV9BVFRSKHR1bmluZ19lbmFibGUsIFNfSVJVR08sIHZhcmlheF9nZXRfdHVuaW5nX2VuYWJsZSwKKwkJICAgbGluZTZfbm9wX3dyaXRlKTsKIHN0YXRpYyBERVZJQ0VfQVRUUih0dW5pbmc2LCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3R1bmluZzYsIGxpbmU2X25vcF93cml0ZSk7CiBzdGF0aWMgREVWSUNFX0FUVFIodHVuaW5nNSwgU19JUlVHTywgdmFyaWF4X2dldF90dW5pbmc1LCBsaW5lNl9ub3Bfd3JpdGUpOwogc3RhdGljIERFVklDRV9BVFRSKHR1bmluZzQsIFNfSVJVR08sIHZhcmlheF9nZXRfdHVuaW5nNCwgbGluZTZfbm9wX3dyaXRlKTsKQEAgLTM5OSw3ICs1MjcsOCBAQAogc3RhdGljIERFVklDRV9BVFRSKG1peDMsIFNfSVJVR08sIHZhcmlheF9nZXRfbWl4MywgbGluZTZfbm9wX3dyaXRlKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihtaXgyLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X21peDIsIGxpbmU2X25vcF93cml0ZSk7CiBzdGF0aWMgREVWSUNFX0FUVFIobWl4MSwgU19JUlVHTywgdmFyaWF4X2dldF9taXgxLCBsaW5lNl9ub3Bfd3JpdGUpOwotc3RhdGljIERFVklDRV9BVFRSKHBpY2t1cF93aXJpbmcsIFNfSVJVR08sIHZhcmlheF9nZXRfcGlja3VwX3dpcmluZywgbGluZTZfbm9wX3dyaXRlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwaWNrdXBfd2lyaW5nLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3BpY2t1cF93aXJpbmcsCisJCSAgIGxpbmU2X25vcF93cml0ZSk7CiAKIGludCBwb2RfY3JlYXRlX2ZpbGVzKGludCBmaXJtd2FyZSwgaW50IHR5cGUsIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKQEAgLTQwNyw3ICs1MzYsOCBAQAogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfdHdlYWspKTsKIAlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3dhaF9wb3NpdGlvbikpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX1BPRFhUQUxMKSkgIT0gMCkKLQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9jb21wcmVzc2lvbl9nYWluKSk7CisJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCSAgICAgKGRldiwgJmRldl9hdHRyX2NvbXByZXNzaW9uX2dhaW4pKTsKIAlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3ZvbF9wZWRhbF9wb3NpdGlvbikpOwogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfY29tcHJlc3Npb25fdGhyZXNob2xkKSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9wYW4pKTsKQEAgLTQyOSw3ICs1NTksOCBAQAogCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3JldmVyYl9taXgpKTsKIAlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2VmZmVjdF9zZXR1cCkpOwogCWlmIChmaXJtd2FyZSA+PSAyMDApCi0JCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmFuZF8xX2ZyZXF1ZW5jeSkpOworCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkgICAgIChkZXYsICZkZXZfYXR0cl9iYW5kXzFfZnJlcXVlbmN5KSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfUE9EWFRBTEwpKSAhPSAwKQogCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3ByZXNlbmNlKSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfQkFTU1BPRFhUQUxMKSkgIT0gMCkKQEAgLTQ0MywxMCArNTc0LDEyIEBACiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kZWxheV9lbmFibGUpKTsKIAlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX21vZF9wYXJhbV8xKSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kZWxheV9wYXJhbV8xKSk7Ci0JQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kZWxheV9wYXJhbV8xX25vdGVfdmFsdWUpKTsKKwlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCSAgICAgKGRldiwgJmRldl9hdHRyX2RlbGF5X3BhcmFtXzFfbm90ZV92YWx1ZSkpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX0JBU1NQT0RYVEFMTCkpICE9IDApCiAJCWlmIChmaXJtd2FyZSA+PSAyMDApCi0JCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2JhbmRfMl9mcmVxdWVuY3lfX2Jhc3MpKTsKKwkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCQkgICAgIChkZXYsICZkZXZfYXR0cl9iYW5kXzJfZnJlcXVlbmN5X19iYXNzKSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kZWxheV9wYXJhbV8yKSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kZWxheV92b2x1bWVfbWl4KSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kZWxheV9wYXJhbV8zKSk7CkBAIC00NTksMjYgKzU5MiwzNCBAQAogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX1BPRFhUQUxMKSkgIT0gMCkKIAkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9yZXZlcmJfdG9uZSkpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX1BPRFhUQUxMKSkgIT0gMCkKLQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9yZXZlcmJfcHJlX2RlbGF5KSk7CisJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCSAgICAgKGRldiwgJmRldl9hdHRyX3JldmVyYl9wcmVfZGVsYXkpKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19QT0RYVEFMTCkpICE9IDApCi0JCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcmV2ZXJiX3ByZV9wb3N0KSk7CisJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCSAgICAgKGRldiwgJmRldl9hdHRyX3JldmVyYl9wcmVfcG9zdCkpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX1BPRFhUQUxMKSkgIT0gMCkKIAkJaWYgKGZpcm13YXJlID49IDIwMCkKLQkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmFuZF8yX2ZyZXF1ZW5jeSkpOworCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkJCSAgICAgKGRldiwgJmRldl9hdHRyX2JhbmRfMl9mcmVxdWVuY3kpKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19CQVNTUE9EWFRBTEwpKSAhPSAwKQogCQlpZiAoZmlybXdhcmUgPj0gMjAwKQotCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9iYW5kXzNfZnJlcXVlbmN5X19iYXNzKSk7CisJCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkJICAgICAoZGV2LCAmZGV2X2F0dHJfYmFuZF8zX2ZyZXF1ZW5jeV9fYmFzcykpOwogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfd2FoX2VuYWJsZSkpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX0JBU1NQT0RYVEFMTCkpICE9IDApCi0JCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfbW9kdWxhdGlvbl9sb19jdXQpKTsKKwkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkJICAgICAoZGV2LCAmZGV2X2F0dHJfbW9kdWxhdGlvbl9sb19jdXQpKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19CQVNTUE9EWFRBTEwpKSAhPSAwKQotCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2RlbGF5X3JldmVyYl9sb19jdXQpKTsKKwkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkJICAgICAoZGV2LCAmZGV2X2F0dHJfZGVsYXlfcmV2ZXJiX2xvX2N1dCkpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX1BPRFhUQUxMKSkgIT0gMCkKIAkJaWYgKGZpcm13YXJlID49IDIwMCkKLQkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfdm9sdW1lX3BlZGFsX21pbmltdW0pKTsKKwkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCQkgICAgIChkZXYsICZkZXZfYXR0cl92b2x1bWVfcGVkYWxfbWluaW11bSkpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX0JBU1NQT0RYVEFMTCkpICE9IDApCiAJCWlmIChmaXJtd2FyZSA+PSAyMDApCi0JCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2VxX3ByZV9wb3N0KSk7CisJCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkJICAgICAoZGV2LCAmZGV2X2F0dHJfZXFfcHJlX3Bvc3QpKTsKIAlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3ZvbHVtZV9wcmVfcG9zdCkpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX0JBU1NQT0RYVEFMTCkpICE9IDApCiAJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGlfbW9kZWwpKTsKQEAgLTQ5NiwxOSArNjM3LDI1IEBACiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9tb2R1bGF0aW9uX21vZGVsKSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfUE9EWFRBTEwpKSAhPSAwKQogCQlpZiAoZmlybXdhcmUgPj0gMjAwKQotCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9iYW5kXzNfZnJlcXVlbmN5KSk7CisJCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkJICAgICAoZGV2LCAmZGV2X2F0dHJfYmFuZF8zX2ZyZXF1ZW5jeSkpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX0JBU1NQT0RYVEFMTCkpICE9IDApCiAJCWlmIChmaXJtd2FyZSA+PSAyMDApCi0JCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2JhbmRfNF9mcmVxdWVuY3lfX2Jhc3MpKTsKLQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX21vZF9wYXJhbV8xX2RvdWJsZV9wcmVjaXNpb24pKTsKLQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2RlbGF5X3BhcmFtXzFfZG91YmxlX3ByZWNpc2lvbikpOworCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkJCSAgICAgKGRldiwgJmRldl9hdHRyX2JhbmRfNF9mcmVxdWVuY3lfX2Jhc3MpKTsKKwlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCSAgICAgKGRldiwgJmRldl9hdHRyX21vZF9wYXJhbV8xX2RvdWJsZV9wcmVjaXNpb24pKTsKKwlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCSAgICAgKGRldiwgJmRldl9hdHRyX2RlbGF5X3BhcmFtXzFfZG91YmxlX3ByZWNpc2lvbikpOwogCWlmIChmaXJtd2FyZSA+PSAyMDApCiAJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZXFfZW5hYmxlKSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl90YXApKTsKLQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3ZvbHVtZV90d2Vha19wZWRhbF9hc3NpZ24pKTsKKwlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCSAgICAgKGRldiwgJmRldl9hdHRyX3ZvbHVtZV90d2Vha19wZWRhbF9hc3NpZ24pKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19CQVNTUE9EWFRBTEwpKSAhPSAwKQogCQlpZiAoZmlybXdhcmUgPj0gMjAwKQotCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9iYW5kXzVfZnJlcXVlbmN5KSk7CisJCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkJICAgICAoZGV2LCAmZGV2X2F0dHJfYmFuZF81X2ZyZXF1ZW5jeSkpOwogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfdHVuZXIpKTsKIAlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX21pY19zZWxlY3Rpb24pKTsKIAlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2NhYmluZXRfbW9kZWwpKTsKQEAgLTUxNiwyNSArNjYzLDMwIEBACiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9yb29tbGV2ZWwpKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19QT0RYVEFMTCkpICE9IDApCiAJCWlmIChmaXJtd2FyZSA+PSAyMDApCi0JCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2JhbmRfNF9mcmVxdWVuY3kpKTsKKwkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCQkgICAgIChkZXYsICZkZXZfYXR0cl9iYW5kXzRfZnJlcXVlbmN5KSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfQkFTU1BPRFhUQUxMKSkgIT0gMCkKIAkJaWYgKGZpcm13YXJlID49IDIwMCkKLQkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmFuZF82X2ZyZXF1ZW5jeSkpOwotCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfc3RvbXBfcGFyYW1fMV9ub3RlX3ZhbHVlKSk7CisJCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkJICAgICAoZGV2LCAmZGV2X2F0dHJfYmFuZF82X2ZyZXF1ZW5jeSkpOworCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJICAgICAoZGV2LCAmZGV2X2F0dHJfc3RvbXBfcGFyYW1fMV9ub3RlX3ZhbHVlKSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9zdG9tcF9wYXJhbV8yKSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9zdG9tcF9wYXJhbV8zKSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9zdG9tcF9wYXJhbV80KSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9zdG9tcF9wYXJhbV81KSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9zdG9tcF9wYXJhbV82KSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfTElWRSkpICE9IDApCi0JCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYW1wX3N3aXRjaF9zZWxlY3QpKTsKKwkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkJICAgICAoZGV2LCAmZGV2X2F0dHJfYW1wX3N3aXRjaF9zZWxlY3QpKTsKIAlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2RlbGF5X3BhcmFtXzQpKTsKIAlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2RlbGF5X3BhcmFtXzUpKTsKIAlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2RlbGF5X3ByZV9wb3N0KSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfUE9EWFRBTEwpKSAhPSAwKQogCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2RlbGF5X21vZGVsKSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfQkFTU1BPRFhUQUxMKSkgIT0gMCkKLQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kZWxheV92ZXJiX21vZGVsKSk7CisJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCSAgICAgKGRldiwgJmRldl9hdHRyX2RlbGF5X3ZlcmJfbW9kZWwpKTsKIAlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3RlbXBvX21zYikpOwogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfdGVtcG9fbHNiKSk7CiAJaWYgKGZpcm13YXJlID49IDMwMCkKQEAgLTU0OSwzMCArNzAxLDM5IEBACiAJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmFuZF8xX2dhaW4pKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19CQVNTUE9EWFRBTEwpKSAhPSAwKQogCQlpZiAoZmlybXdhcmUgPj0gMjAwKQotCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9iYW5kXzJfZ2Fpbl9fYmFzcykpOworCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkJCSAgICAgKGRldiwgJmRldl9hdHRyX2JhbmRfMl9nYWluX19iYXNzKSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfUE9EWFRBTEwpKSAhPSAwKQogCQlpZiAoZmlybXdhcmUgPj0gMjAwKQotCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9iYW5kXzJfZ2FpbikpOworCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkJCSAgICAgKGRldiwgJmRldl9hdHRyX2JhbmRfMl9nYWluKSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfQkFTU1BPRFhUQUxMKSkgIT0gMCkKIAkJaWYgKGZpcm13YXJlID49IDIwMCkKLQkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmFuZF8zX2dhaW5fX2Jhc3MpKTsKKwkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCQkgICAgIChkZXYsICZkZXZfYXR0cl9iYW5kXzNfZ2Fpbl9fYmFzcykpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX1BPRFhUQUxMKSkgIT0gMCkKIAkJaWYgKGZpcm13YXJlID49IDIwMCkKLQkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmFuZF8zX2dhaW4pKTsKKwkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCQkgICAgIChkZXYsICZkZXZfYXR0cl9iYW5kXzNfZ2FpbikpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX0JBU1NQT0RYVEFMTCkpICE9IDApCiAJCWlmIChmaXJtd2FyZSA+PSAyMDApCi0JCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2JhbmRfNF9nYWluX19iYXNzKSk7CisJCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkJICAgICAoZGV2LCAmZGV2X2F0dHJfYmFuZF80X2dhaW5fX2Jhc3MpKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19CQVNTUE9EWFRBTEwpKSAhPSAwKQogCQlpZiAoZmlybXdhcmUgPj0gMjAwKQotCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9iYW5kXzVfZ2Fpbl9fYmFzcykpOworCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkJCSAgICAgKGRldiwgJmRldl9hdHRyX2JhbmRfNV9nYWluX19iYXNzKSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfUE9EWFRBTEwpKSAhPSAwKQogCQlpZiAoZmlybXdhcmUgPj0gMjAwKQotCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9iYW5kXzRfZ2FpbikpOworCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkJCSAgICAgKGRldiwgJmRldl9hdHRyX2JhbmRfNF9nYWluKSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfQkFTU1BPRFhUQUxMKSkgIT0gMCkKIAkJaWYgKGZpcm13YXJlID49IDIwMCkKLQkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmFuZF82X2dhaW5fX2Jhc3MpKTsKLSAgcmV0dXJuIDA7CisJCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkJICAgICAoZGV2LCAmZGV2X2F0dHJfYmFuZF82X2dhaW5fX2Jhc3MpKTsKKwlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0wocG9kX2NyZWF0ZV9maWxlcyk7CiAKIHZvaWQgcG9kX3JlbW92ZV9maWxlcyhpbnQgZmlybXdhcmUsIGludCB0eXBlLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CkBAIC02MTgsNyArNzc5LDggQEAKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGVsYXlfcGFyYW1fMV9ub3RlX3ZhbHVlKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19CQVNTUE9EWFRBTEwpKSAhPSAwKQogCQlpZiAoZmlybXdhcmUgPj0gMjAwKQotCQkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2JhbmRfMl9mcmVxdWVuY3lfX2Jhc3MpOworCQkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwKKwkJCQkJICAgJmRldl9hdHRyX2JhbmRfMl9mcmVxdWVuY3lfX2Jhc3MpOwogCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9kZWxheV9wYXJhbV8yKTsKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGVsYXlfdm9sdW1lX21peCk7CiAJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2RlbGF5X3BhcmFtXzMpOwpAQCAtNjM5LDcgKzgwMSw4IEBACiAJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmFuZF8yX2ZyZXF1ZW5jeSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfQkFTU1BPRFhUQUxMKSkgIT0gMCkKIAkJaWYgKGZpcm13YXJlID49IDIwMCkKLQkJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9iYW5kXzNfZnJlcXVlbmN5X19iYXNzKTsKKwkJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsCisJCQkJCSAgICZkZXZfYXR0cl9iYW5kXzNfZnJlcXVlbmN5X19iYXNzKTsKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfd2FoX2VuYWJsZSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfQkFTU1BPRFhUQUxMKSkgIT0gMCkKIAkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX21vZHVsYXRpb25fbG9fY3V0KTsKQEAgLTY3MSw3ICs4MzQsOCBAQAogCQkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2JhbmRfM19mcmVxdWVuY3kpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX0JBU1NQT0RYVEFMTCkpICE9IDApCiAJCWlmIChmaXJtd2FyZSA+PSAyMDApCi0JCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmFuZF80X2ZyZXF1ZW5jeV9fYmFzcyk7CisJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LAorCQkJCQkgICAmZGV2X2F0dHJfYmFuZF80X2ZyZXF1ZW5jeV9fYmFzcyk7CiAJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX21vZF9wYXJhbV8xX2RvdWJsZV9wcmVjaXNpb24pOwogCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9kZWxheV9wYXJhbV8xX2RvdWJsZV9wcmVjaXNpb24pOwogCWlmIChmaXJtd2FyZSA+PSAyMDApCkBAIC03NDQsOCArOTA4LDYgQEAKIAkJaWYgKGZpcm13YXJlID49IDIwMCkKIAkJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9iYW5kXzZfZ2Fpbl9fYmFzcyk7CiB9Ci0KLUVYUE9SVF9TWU1CT0wocG9kX2NyZWF0ZV9maWxlcyk7CiBFWFBPUlRfU1lNQk9MKHBvZF9yZW1vdmVfZmlsZXMpOwogCiBpbnQgdmFyaWF4X2NyZWF0ZV9maWxlcyhpbnQgZmlybXdhcmUsIGludCB0eXBlLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCkBAIC03OTAsOCArOTUyLDkgQEAKIAlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX21peDIpKTsKIAlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX21peDEpKTsKIAlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3BpY2t1cF93aXJpbmcpKTsKLSAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHZhcmlheF9jcmVhdGVfZmlsZXMpOwogCiB2b2lkIHZhcmlheF9yZW1vdmVfZmlsZXMoaW50IGZpcm13YXJlLCBpbnQgdHlwZSwgc3RydWN0IGRldmljZSAqZGV2KQogewpAQCAtODM1LDYgKzk5OCw0IEBACiAJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX21peDEpOwogCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9waWNrdXBfd2lyaW5nKTsKIH0KLQotRVhQT1JUX1NZTUJPTCh2YXJpYXhfY3JlYXRlX2ZpbGVzKTsKIEVYUE9SVF9TWU1CT0wodmFyaWF4X3JlbW92ZV9maWxlcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvZHJpdmVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvZHJpdmVyLmMKaW5kZXggZjE4OGVjZS4uZTQwNzhhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2RyaXZlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9kcml2ZXIuYwpAQCAtMTY4LDE5ICsxNjgsMTkgQEAKICNlbmRpZgogCiAvKgotCVNlbmQgcmF3IG1lc3NhZ2UgaW4gcGllY2VzIG9mIHdNYXhQYWNrZXRTaXplIGJ5dGVzLgorCVNlbmQgcmF3IG1lc3NhZ2UgaW4gcGllY2VzIG9mIG1heF9wYWNrZXRfc2l6ZSBieXRlcy4KICovCiBpbnQgbGluZTZfc2VuZF9yYXdfbWVzc2FnZShzdHJ1Y3QgdXNiX2xpbmU2ICpsaW5lNiwgY29uc3QgY2hhciAqYnVmZmVyLAogCQkJICAgaW50IHNpemUpCiB7CiAJaW50IGksIGRvbmUgPSAwOworCWludCBhY3R1YWxfc2l6ZTsKIAogI2lmIERPX0RVTVBfVVJCX1NFTkQKIAlsaW5lNl93cml0ZV9oZXhkdW1wKGxpbmU2LCAnUycsIGJ1ZmZlciwgc2l6ZSk7CiAjZW5kaWYKIAotCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpICs9IGxpbmU2LT5tYXhfcGFja2V0X3NpemUpIHsKLQkJaW50IHBhcnRpYWw7CisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gYWN0dWFsX3NpemUpIHsKIAkJY29uc3QgY2hhciAqZnJhZ19idWYgPSBidWZmZXIgKyBpOwogCQlpbnQgZnJhZ19zaXplID0gbWluKGxpbmU2LT5tYXhfcGFja2V0X3NpemUsIHNpemUgLSBpKTsKIAkJaW50IHJldHZhbDsKQEAgLTE4OSw3ICsxODksNyBAQAogCQkJCQkgICB1c2Jfc25kaW50cGlwZShsaW5lNi0+dXNiZGV2LAogCQkJCQkJCSAgbGluZTYtPmVwX2NvbnRyb2xfd3JpdGUpLAogCQkJCQkgICAoY2hhciAqKWZyYWdfYnVmLCBmcmFnX3NpemUsCi0JCQkJCSAgICZwYXJ0aWFsLCBMSU5FNl9USU1FT1VUICogSFopOworCQkJCQkgICAmYWN0dWFsX3NpemUsIExJTkU2X1RJTUVPVVQgKiBIWik7CiAKIAkJaWYgKHJldHZhbCkgewogCQkJZGV2X2VycihsaW5lNi0+aWZjZGV2LApAQCAtMTk3LDcgKzE5Nyw3IEBACiAJCQlicmVhazsKIAkJfQogCi0JCWRvbmUgKz0gZnJhZ19zaXplOworCQlkb25lICs9IGFjdHVhbF9zaXplOwogCX0KIAogCXJldHVybiBkb25lOwpAQCAtMzk1LDE3ICszOTUsNDQgQEAKIAlsaW5lNl9zdGFydF9saXN0ZW4obGluZTYpOwogfQogCitzdGF0aWMgaW50IGxpbmU2X3NlbmQoc3RydWN0IHVzYl9saW5lNiAqbGluZTYsIHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlpbnQgcmV0dmFsOworCXVuc2lnbmVkIGludCBwYXJ0aWFsOworCisjaWYgRE9fRFVNUF9VUkJfU0VORAorCWxpbmU2X3dyaXRlX2hleGR1bXAobGluZTYsICdTJywgYnVmLCBsZW4pOworI2VuZGlmCisKKwlyZXR2YWwgPSB1c2JfaW50ZXJydXB0X21zZyhsaW5lNi0+dXNiZGV2LAorCQkJCSAgIHVzYl9zbmRpbnRwaXBlKGxpbmU2LT51c2JkZXYsCisJCQkJCQkgIGxpbmU2LT5lcF9jb250cm9sX3dyaXRlKSwKKwkJCQkgICBidWYsIGxlbiwgJnBhcnRpYWwsCisJCQkJICAgTElORTZfVElNRU9VVCAqIEhaKTsKKworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2VycihsaW5lNi0+aWZjZGV2LAorCQkJInVzYl9pbnRlcnJ1cHRfbXNnIGZhaWxlZCAoJWQpXG4iLCByZXR2YWwpOworCX0KKworCWlmIChwYXJ0aWFsICE9IGxlbikgeworCQlkZXZfZXJyKGxpbmU2LT5pZmNkZXYsCisJCQkidXNiX2ludGVycnVwdF9tc2cgc2VudCBwYXJ0aWFsIG1lc3NhZ2UgKCVkKVxuIiwKKwkJCSByZXR2YWwpOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKIC8qCiAJU2VuZCBjaGFubmVsIG51bWJlciAoaS5lLiwgc3dpdGNoIHRvIGEgZGlmZmVyZW50IHNvdW5kKS4KICovCiBpbnQgbGluZTZfc2VuZF9wcm9ncmFtKHN0cnVjdCB1c2JfbGluZTYgKmxpbmU2LCBpbnQgdmFsdWUpCiB7Ci0JaW50IHJldHZhbDsKIAl1bnNpZ25lZCBjaGFyICpidWZmZXI7Ci0JdW5zaWduZWQgaW50IHBhcnRpYWw7CisJc2l6ZV90IGxlbiA9IDI7CiAKLQlidWZmZXIgPSBrbWFsbG9jKDIsIEdGUF9LRVJORUwpOwotCisJYnVmZmVyID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOwogCWlmICghYnVmZmVyKSB7CiAJCWRldl9lcnIobGluZTYtPmlmY2RldiwgIm91dCBvZiBtZW1vcnlcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTQxNCwyMCArNDQxLDcgQEAKIAlidWZmZXJbMF0gPSBMSU5FNl9QUk9HUkFNX0NIQU5HRSB8IExJTkU2X0NIQU5ORUxfSE9TVDsKIAlidWZmZXJbMV0gPSB2YWx1ZTsKIAotI2lmIERPX0RVTVBfVVJCX1NFTkQKLQlsaW5lNl93cml0ZV9oZXhkdW1wKGxpbmU2LCAnUycsIGJ1ZmZlciwgMik7Ci0jZW5kaWYKLQotCXJldHZhbCA9IHVzYl9pbnRlcnJ1cHRfbXNnKGxpbmU2LT51c2JkZXYsCi0JCQkJICAgdXNiX3NuZGludHBpcGUobGluZTYtPnVzYmRldiwKLQkJCQkJCSAgbGluZTYtPmVwX2NvbnRyb2xfd3JpdGUpLAotCQkJCSAgIGJ1ZmZlciwgMiwgJnBhcnRpYWwsIExJTkU2X1RJTUVPVVQgKiBIWik7Ci0KLQlpZiAocmV0dmFsKQotCQlkZXZfZXJyKGxpbmU2LT5pZmNkZXYsICJ1c2JfaW50ZXJydXB0X21zZyBmYWlsZWQgKCVkKVxuIiwgcmV0dmFsKTsKLQotCWtmcmVlKGJ1ZmZlcik7Ci0JcmV0dXJuIHJldHZhbDsKKwlyZXR1cm4gbGluZTZfc2VuZChsaW5lNiwgYnVmZmVyLCBsZW4pOwogfQogCiAvKgpAQCAtNDM1LDEyICs0NDksMTAgQEAKICovCiBpbnQgbGluZTZfdHJhbnNtaXRfcGFyYW1ldGVyKHN0cnVjdCB1c2JfbGluZTYgKmxpbmU2LCBpbnQgcGFyYW0sIGludCB2YWx1ZSkKIHsKLQlpbnQgcmV0dmFsOwogCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKLQl1bnNpZ25lZCBpbnQgcGFydGlhbDsKKwlzaXplX3QgbGVuID0gMzsKIAotCWJ1ZmZlciA9IGttYWxsb2MoMywgR0ZQX0tFUk5FTCk7Ci0KKwlidWZmZXIgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWZmZXIpIHsKIAkJZGV2X2VycihsaW5lNi0+aWZjZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNDUwLDE5ICs0NjIsNyBAQAogCWJ1ZmZlclsxXSA9IHBhcmFtOwogCWJ1ZmZlclsyXSA9IHZhbHVlOwogCi0jaWYgRE9fRFVNUF9VUkJfU0VORAotCWxpbmU2X3dyaXRlX2hleGR1bXAobGluZTYsICdTJywgYnVmZmVyLCAzKTsKLSNlbmRpZgotCi0JcmV0dmFsID0gdXNiX2ludGVycnVwdF9tc2cobGluZTYtPnVzYmRldiwKLQkJCQkJCQkJCQkJCQkJIHVzYl9zbmRpbnRwaXBlKGxpbmU2LT51c2JkZXYsIGxpbmU2LT5lcF9jb250cm9sX3dyaXRlKSwKLQkJCQkJCQkJCQkJCQkJIGJ1ZmZlciwgMywgJnBhcnRpYWwsIExJTkU2X1RJTUVPVVQgKiBIWik7Ci0KLQlpZiAocmV0dmFsKQotCQlkZXZfZXJyKGxpbmU2LT5pZmNkZXYsICJ1c2JfaW50ZXJydXB0X21zZyBmYWlsZWQgKCVkKVxuIiwgcmV0dmFsKTsKLQotCWtmcmVlKGJ1ZmZlcik7Ci0JcmV0dXJuIHJldHZhbDsKKwlyZXR1cm4gbGluZTZfc2VuZChsaW5lNiwgYnVmZmVyLCBsZW4pOwogfQogCiAvKgpAQCAtNDc2LDggKzQ3NiwxMCBAQAogCiAJLyogcXVlcnkgdGhlIHNlcmlhbCBudW1iZXI6ICovCiAJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVzYmRldiwgdXNiX3NuZGN0cmxwaXBlKHVzYmRldiwgMCksIDB4NjcsCi0JCQkJCQkJCQkJCQlVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFIHwgVVNCX0RJUl9PVVQsCi0JCQkJCQkJCQkJCQkoZGF0YWxlbiA8PCA4KSB8IDB4MjEsIGFkZHJlc3MsIE5VTEwsIDAsIExJTkU2X1RJTUVPVVQgKiBIWik7CisJCQkJICAgICAgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRQorCQkJCSAgICAgIHwgVVNCX0RJUl9PVVQsCisJCQkJICAgICAgKGRhdGFsZW4gPDwgOCkgfCAweDIxLCBhZGRyZXNzLAorCQkJCSAgICAgIE5VTEwsIDAsIExJTkU2X1RJTUVPVVQgKiBIWik7CiAKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGxpbmU2LT5pZmNkZXYsICJyZWFkIHJlcXVlc3QgZmFpbGVkIChlcnJvciAlZClcbiIsIHJldCk7CkBAIC00OTYsOSArNDk4LDcgQEAKIAkJCQkicmVjZWl2ZSBsZW5ndGggZmFpbGVkIChlcnJvciAlZClcbiIsIHJldCk7CiAJCQlyZXR1cm4gcmV0OwogCQl9Ci0JfQotCXdoaWxlIChsZW4gPT0gMHhmZikKLQkJOworCX0gd2hpbGUgKGxlbiA9PSAweGZmKTsKIAogCWlmIChsZW4gIT0gZGF0YWxlbikgewogCQkvKiBzaG91bGQgYmUgZXF1YWwgb3Igc29tZXRoaW5nIHdlbnQgd3JvbmcgKi8KQEAgLTY4MiwxMCArNjgyLDE0IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJLyogY2hlY2sgdmVuZG9yIGFuZCBwcm9kdWN0IGlkICovCi0JZm9yIChkZXZ0eXBlID0gQVJSQVlfU0laRShsaW5lNl9pZF90YWJsZSkgLSAxOyBkZXZ0eXBlLS07KQotCQlpZiAoKGxlMTZfdG9fY3B1KHVzYmRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcikgPT0gbGluZTZfaWRfdGFibGVbZGV2dHlwZV0uaWRWZW5kb3IpICYmCi0JCQkgKGxlMTZfdG9fY3B1KHVzYmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpID09IGxpbmU2X2lkX3RhYmxlW2RldnR5cGVdLmlkUHJvZHVjdCkpCisJZm9yIChkZXZ0eXBlID0gQVJSQVlfU0laRShsaW5lNl9pZF90YWJsZSkgLSAxOyBkZXZ0eXBlLS07KSB7CisJCXUxNiB2ZW5kb3IgPSBsZTE2X3RvX2NwdSh1c2JkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpOworCQl1MTYgcHJvZHVjdCA9IGxlMTZfdG9fY3B1KHVzYmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOworCisJCWlmICh2ZW5kb3IgPT0gbGluZTZfaWRfdGFibGVbZGV2dHlwZV0uaWRWZW5kb3IKKwkJICAgICAmJiBwcm9kdWN0ID09IGxpbmU2X2lkX3RhYmxlW2RldnR5cGVdLmlkUHJvZHVjdCkKIAkJCWJyZWFrOworCX0KIAogCWlmIChkZXZ0eXBlIDwgMCkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0xMDM2LDkgKzEwNDAsMTAgQEAKIAogCQlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsICJMaW5lNiAlcyBub3cgZGlzY29ubmVjdGVkXG4iLCBsaW5lNi0+cHJvcGVydGllcy0+bmFtZSk7CiAKLQkJZm9yIChpID0gTElORTZfTUFYX0RFVklDRVM7IGktLTspCisJCWZvciAoaSA9IExJTkU2X01BWF9ERVZJQ0VTOyBpLS07KSB7CiAJCQlpZiAobGluZTZfZGV2aWNlc1tpXSA9PSBsaW5lNikKIAkJCQlsaW5lNl9kZXZpY2VzW2ldID0gTlVMTDsKKwkJfQogCX0KIAogCWxpbmU2X2Rlc3RydWN0KGludGVyZmFjZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvbWlkaS5jIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L21pZGkuYwppbmRleCA4OWEyYjE3Li42ZWY0NDU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvbWlkaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9taWRpLmMKQEAgLTMxOCw3ICszMTgsMTMgQEAKIHsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwogCXN0cnVjdCB1c2JfbGluZTYgKmxpbmU2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOwotCWludCB2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWx1ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCWxpbmU2LT5saW5lNm1pZGktPm1pZGlfbWFza190cmFuc21pdCA9IHZhbHVlOwogCXJldHVybiBjb3VudDsKIH0KQEAgLTM0NCw3ICszNTAsMTMgQEAKIHsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwogCXN0cnVjdCB1c2JfbGluZTYgKmxpbmU2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOwotCWludCB2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWx1ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCWxpbmU2LT5saW5lNm1pZGktPm1pZGlfbWFza19yZWNlaXZlID0gdmFsdWU7CiAJcmV0dXJuIGNvdW50OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3BjbS5jIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3BjbS5jCmluZGV4IGZjNDExM2YuLmRkOTgxMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9wY20uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvcGNtLmMKQEAgLTE1Niw3ICsxNTYsOCBAQAogCXN0cmNweShwY20tPm5hbWUsIGxpbmU2cGNtLT5saW5lNi0+cHJvcGVydGllcy0+bmFtZSk7CiAKIAkvKiBzZXQgb3BlcmF0b3JzICovCi0Jc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJnNuZF9saW5lNl9wbGF5YmFja19vcHMpOworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssCisJCQkmc25kX2xpbmU2X3BsYXliYWNrX29wcyk7CiAJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAmc25kX2xpbmU2X2NhcHR1cmVfb3BzKTsKIAogCS8qIHByZS1hbGxvY2F0aW9uIG9mIGJ1ZmZlcnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9wbGF5YmFjay5jIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3BsYXliYWNrLmMKaW5kZXggYWNiMDYxMi4uMzQzMWY1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3BsYXliYWNrLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3BsYXliYWNrLmMKQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlICJwb2QuaCIKICNpbmNsdWRlICJwbGF5YmFjay5oIgogCi0KIC8qCiAJU29mdHdhcmUgc3RlcmVvIHZvbHVtZSBjb250cm9sLgogKi8KQEAgLTMwLDcgKzI5LDcgQEAKIAlpbnQgY2huID0gMDsKIAogCWlmICh2b2x1bWVbMF0gPT0gMjU2ICYmIHZvbHVtZVsxXSA9PSAyNTYpCi0JCXJldHVybjsgIC8qIG1heGltdW0gdm9sdW1lIC0gbm8gY2hhbmdlICovCisJCXJldHVybjsJCS8qIG1heGltdW0gdm9sdW1lIC0gbm8gY2hhbmdlICovCiAKIAlpZiAoYnl0ZXNfcGVyX2ZyYW1lID09IDQpIHsKIAkJc2hvcnQgKnAsICpidWZfZW5kOwpAQCAtNjgsMTMgKzY3LDE3IEBACiAJaW50IGksIHVyYl9zaXplLCB1cmJfZnJhbWVzOwogCXN0cnVjdCBzbmRfbGluZTZfcGNtICpsaW5lNnBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAljb25zdCBpbnQgYnl0ZXNfcGVyX2ZyYW1lID0gbGluZTZwY20tPnByb3BlcnRpZXMtPmJ5dGVzX3Blcl9mcmFtZTsKLQljb25zdCBpbnQgZnJhbWVfaW5jcmVtZW50ID0gbGluZTZwY20tPnByb3BlcnRpZXMtPnNuZF9saW5lNl9yYXRlcy5yYXRzWzBdLm51bV9taW47Ci0JY29uc3QgaW50IGZyYW1lX2ZhY3RvciA9IGxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5zbmRfbGluZTZfcmF0ZXMucmF0c1swXS5kZW4gKiAoVVNCX0lOVEVSVkFMU19QRVJfU0VDT05EIC8gTElORTZfSVNPX0lOVEVSVkFMKTsKKwljb25zdCBpbnQgZnJhbWVfaW5jcmVtZW50ID0KKwkgICAgbGluZTZwY20tPnByb3BlcnRpZXMtPnNuZF9saW5lNl9yYXRlcy5yYXRzWzBdLm51bV9taW47CisJY29uc3QgaW50IGZyYW1lX2ZhY3RvciA9CisJICAgIGxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5zbmRfbGluZTZfcmF0ZXMucmF0c1swXS5kZW4gKgorCSAgICAoVVNCX0lOVEVSVkFMU19QRVJfU0VDT05EIC8gTElORTZfSVNPX0lOVEVSVkFMKTsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCXN0cnVjdCB1cmIgKnVyYl9vdXQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbGluZTZwY20tPmxvY2tfYXVkaW9fb3V0LCBmbGFncyk7Ci0JaW5kZXggPSBmaW5kX2ZpcnN0X3plcm9fYml0KCZsaW5lNnBjbS0+YWN0aXZlX3VyYl9vdXQsIExJTkU2X0lTT19CVUZGRVJTKTsKKwlpbmRleCA9CisJICAgIGZpbmRfZmlyc3RfemVyb19iaXQoJmxpbmU2cGNtLT5hY3RpdmVfdXJiX291dCwgTElORTZfSVNPX0JVRkZFUlMpOwogCiAJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBMSU5FNl9JU09fQlVGRkVSUykgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaW5lNnBjbS0+bG9ja19hdWRpb19vdXQsIGZsYWdzKTsKQEAgLTg4LDcgKzkxLDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgTElORTZfSVNPX1BBQ0tFVFM7ICsraSkgewogCQkvKiBjb21wdXRlIGZyYW1lIHNpemUgZm9yIGdpdmVuIHNhbXBsaW5nIHJhdGUgKi8KIAkJaW50IG4sIGZzOwotCQlzdHJ1Y3QgdXNiX2lzb19wYWNrZXRfZGVzY3JpcHRvciAqZm91dCA9ICZ1cmJfb3V0LT5pc29fZnJhbWVfZGVzY1tpXTsKKwkJc3RydWN0IHVzYl9pc29fcGFja2V0X2Rlc2NyaXB0b3IgKmZvdXQgPQorCQkgICAgJnVyYl9vdXQtPmlzb19mcmFtZV9kZXNjW2ldOwogCQlsaW5lNnBjbS0+Y291bnRfb3V0ICs9IGZyYW1lX2luY3JlbWVudDsKIAkJbiA9IGxpbmU2cGNtLT5jb3VudF9vdXQgLyBmcmFtZV9mYWN0b3I7CiAJCWxpbmU2cGNtLT5jb3VudF9vdXQgLT0gbiAqIGZyYW1lX2ZhY3RvcjsKQEAgLTEwNiwyNSArMTEwLDM2IEBACiAJfSBlbHNlIHsKIAkJaWYgKGxpbmU2cGNtLT5wb3Nfb3V0ICsgdXJiX2ZyYW1lcyA+IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKSB7CiAJCQkvKgotCQkJCVRoZSB0cmFuc2ZlcnJlZCBhcmVhIGdvZXMgb3ZlciBidWZmZXIgYm91bmRhcnksCi0JCQkJY29weSB0aGUgZGF0YSB0byB0aGUgdGVtcCBidWZmZXIuCi0JCQkqLworCQkJICAgVGhlIHRyYW5zZmVycmVkIGFyZWEgZ29lcyBvdmVyIGJ1ZmZlciBib3VuZGFyeSwKKwkJCSAgIGNvcHkgdGhlIGRhdGEgdG8gdGhlIHRlbXAgYnVmZmVyLgorCQkJICovCiAJCQlpbnQgbGVuOwogCQkJbGVuID0gcnVudGltZS0+YnVmZmVyX3NpemUgLSBsaW5lNnBjbS0+cG9zX291dDsKIAkJCXVyYl9vdXQtPnRyYW5zZmVyX2J1ZmZlciA9IGxpbmU2cGNtLT53cmFwX291dDsKIAogCQkJaWYgKGxlbiA+IDApIHsKLQkJCQltZW1jcHkobGluZTZwY20tPndyYXBfb3V0LCBydW50aW1lLT5kbWFfYXJlYSArIGxpbmU2cGNtLT5wb3Nfb3V0ICogYnl0ZXNfcGVyX2ZyYW1lLCBsZW4gKiBieXRlc19wZXJfZnJhbWUpOwotCQkJCW1lbWNweShsaW5lNnBjbS0+d3JhcF9vdXQgKyBsZW4gKiBieXRlc19wZXJfZnJhbWUsIHJ1bnRpbWUtPmRtYV9hcmVhLCAodXJiX2ZyYW1lcyAtIGxlbikgKiBieXRlc19wZXJfZnJhbWUpOwotCQkJfSBlbHNlCi0JCQkJZGV2X2VycihzMm0oc3Vic3RyZWFtKSwgImRyaXZlciBidWc6IGxlbiA9ICVkXG4iLCBsZW4pOyAgLyogdGhpcyBpcyBzb21ld2hhdCBwYXJhbm9pZCAqLworCQkJCW1lbWNweShsaW5lNnBjbS0+d3JhcF9vdXQsCisJCQkJICAgICAgIHJ1bnRpbWUtPmRtYV9hcmVhICsKKwkJCQkgICAgICAgbGluZTZwY20tPnBvc19vdXQgKiBieXRlc19wZXJfZnJhbWUsCisJCQkJICAgICAgIGxlbiAqIGJ5dGVzX3Blcl9mcmFtZSk7CisJCQkJbWVtY3B5KGxpbmU2cGNtLT53cmFwX291dCArCisJCQkJICAgICAgIGxlbiAqIGJ5dGVzX3Blcl9mcmFtZSwgcnVudGltZS0+ZG1hX2FyZWEsCisJCQkJICAgICAgICh1cmJfZnJhbWVzIC0gbGVuKSAqIGJ5dGVzX3Blcl9mcmFtZSk7CisJCQl9IGVsc2UgeworCQkJCS8qIHRoaXMgaXMgc29tZXdoYXQgcGFyYW5vaWQgKi8KKwkJCQlkZXZfZXJyKHMybShzdWJzdHJlYW0pLAorCQkJCQkiZHJpdmVyIGJ1ZzogbGVuID0gJWRcbiIsIGxlbik7CisJCQl9CiAJCX0gZWxzZSB7CiAJCQkvKiBzZXQgdGhlIGJ1ZmZlciBwb2ludGVyICovCi0JCQl1cmJfb3V0LT50cmFuc2Zlcl9idWZmZXIgPSBydW50aW1lLT5kbWFfYXJlYSArIGxpbmU2cGNtLT5wb3Nfb3V0ICogYnl0ZXNfcGVyX2ZyYW1lOworCQkJdXJiX291dC0+dHJhbnNmZXJfYnVmZmVyID0KKwkJCSAgICBydW50aW1lLT5kbWFfYXJlYSArCisJCQkgICAgbGluZTZwY20tPnBvc19vdXQgKiBieXRlc19wZXJfZnJhbWU7CiAJCX0KIAl9CiAKLQlpZiAoKGxpbmU2cGNtLT5wb3Nfb3V0ICs9IHVyYl9mcmFtZXMpID49IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKQorCWxpbmU2cGNtLT5wb3Nfb3V0ICs9IHVyYl9mcmFtZXM7CisJaWYgKGxpbmU2cGNtLT5wb3Nfb3V0ID49IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKQogCQlsaW5lNnBjbS0+cG9zX291dCAtPSBydW50aW1lLT5idWZmZXJfc2l6ZTsKIAogCXVyYl9vdXQtPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSB1cmJfc2l6ZTsKQEAgLTEzMywxNSArMTQ4LDE5IEBACiAKICNpZiBET19EVU1QX1BDTV9TRU5ECiAJZm9yIChpID0gMDsgaSA8IExJTkU2X0lTT19QQUNLRVRTOyArK2kpIHsKLQkJc3RydWN0IHVzYl9pc29fcGFja2V0X2Rlc2NyaXB0b3IgKmZvdXQgPSAmdXJiX291dC0+aXNvX2ZyYW1lX2Rlc2NbaV07Ci0JCWxpbmU2X3dyaXRlX2hleGR1bXAobGluZTZwY20tPmxpbmU2LCAnUCcsIHVyYl9vdXQtPnRyYW5zZmVyX2J1ZmZlciArIGZvdXQtPm9mZnNldCwgZm91dC0+bGVuZ3RoKTsKKwkJc3RydWN0IHVzYl9pc29fcGFja2V0X2Rlc2NyaXB0b3IgKmZvdXQgPQorCQkgICAgJnVyYl9vdXQtPmlzb19mcmFtZV9kZXNjW2ldOworCQlsaW5lNl93cml0ZV9oZXhkdW1wKGxpbmU2cGNtLT5saW5lNiwgJ1AnLAorCQkJCSAgICB1cmJfb3V0LT50cmFuc2Zlcl9idWZmZXIgKyBmb3V0LT5vZmZzZXQsCisJCQkJICAgIGZvdXQtPmxlbmd0aCk7CiAJfQogI2VuZGlmCiAKIAlpZiAodXNiX3N1Ym1pdF91cmIodXJiX291dCwgR0ZQX0FUT01JQykgPT0gMCkKIAkJc2V0X2JpdChpbmRleCwgJmxpbmU2cGNtLT5hY3RpdmVfdXJiX291dCk7CiAJZWxzZQotCQlkZXZfZXJyKHMybShzdWJzdHJlYW0pLCAiVVJCIG91dCAjJWQgc3VibWlzc2lvbiBmYWlsZWRcbiIsIGluZGV4KTsKKwkJZGV2X2VycihzMm0oc3Vic3RyZWFtKSwgIlVSQiBvdXQgIyVkIHN1Ym1pc3Npb24gZmFpbGVkXG4iLAorCQkJaW5kZXgpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGluZTZwY20tPmxvY2tfYXVkaW9fb3V0LCBmbGFncyk7CiAJcmV0dXJuIDA7CkBAIC0xODEsNyArMjAwLDcgQEAKIH0KIAogLyoKLQlXYWl0IHVudGlsIHVubGlua2luZyBvZiBhbGwgY3VycmVudGx5IGFjdGl2ZSBwbGF5YmFjayBVUkJzIGhhcyBiZWVuIGZpbmlzaGVkLgorICAgV2FpdCB1bnRpbCB1bmxpbmtpbmcgb2YgYWxsIGN1cnJlbnRseSBhY3RpdmUgcGxheWJhY2sgVVJCcyBoYXMgYmVlbiBmaW5pc2hlZC4KICovCiBzdGF0aWMgdm9pZCB3YWl0X2NsZWFyX2F1ZGlvX291dF91cmJzKHN0cnVjdCBzbmRfbGluZTZfcGNtICpsaW5lNnBjbSkKIHsKQEAgLTIyNCw3ICsyNDMsOCBAQAogCWludCBpLCBpbmRleCwgbGVuZ3RoID0gMCwgc2h1dGRvd24gPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPQorCSAgICAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICopdXJiLT5jb250ZXh0OwogCXN0cnVjdCBzbmRfbGluZTZfcGNtICpsaW5lNnBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCkBAIC0yMzQsMTMgKzI1NCwxNCBAQAogCQkJYnJlYWs7CiAKIAlpZiAoaW5kZXggPCAwKQotCQlyZXR1cm47ICAvKiBVUkIgaGFzIGJlZW4gdW5saW5rZWQgYXN5bmNocm9ub3VzbHkgKi8KKwkJcmV0dXJuOwkJLyogVVJCIGhhcyBiZWVuIHVubGlua2VkIGFzeW5jaHJvbm91c2x5ICovCiAKIAlmb3IgKGkgPSBMSU5FNl9JU09fUEFDS0VUUzsgaS0tOykKIAkJbGVuZ3RoICs9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ubGVuZ3RoOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmxpbmU2cGNtLT5sb2NrX2F1ZGlvX291dCwgZmxhZ3MpOwotCWxpbmU2cGNtLT5wb3Nfb3V0X2RvbmUgKz0gbGVuZ3RoIC8gbGluZTZwY20tPnByb3BlcnRpZXMtPmJ5dGVzX3Blcl9mcmFtZTsKKwlsaW5lNnBjbS0+cG9zX291dF9kb25lICs9CisJICAgIGxlbmd0aCAvIGxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5ieXRlc19wZXJfZnJhbWU7CiAKIAlpZiAobGluZTZwY20tPnBvc19vdXRfZG9uZSA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSkKIAkJbGluZTZwY20tPnBvc19vdXRfZG9uZSAtPSBydW50aW1lLT5idWZmZXJfc2l6ZTsKQEAgLTI2MSw3ICsyODIsOCBAQAogCWlmICghc2h1dGRvd24pIHsKIAkJc3VibWl0X2F1ZGlvX291dF91cmIoc3Vic3RyZWFtKTsKIAotCQlpZiAoKGxpbmU2cGNtLT5ieXRlc19vdXQgKz0gbGVuZ3RoKSA+PSBsaW5lNnBjbS0+cGVyaW9kX291dCkgeworCQlsaW5lNnBjbS0+Ynl0ZXNfb3V0ICs9IGxlbmd0aDsKKwkJaWYgKGxpbmU2cGNtLT5ieXRlc19vdXQgPj0gbGluZTZwY20tPnBlcmlvZF9vdXQpIHsKIAkJCWxpbmU2cGNtLT5ieXRlc19vdXQgLT0gbGluZTZwY20tPnBlcmlvZF9vdXQ7CiAJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7CiAJCX0KQEAgLTI3Niw3ICsyOTgsOCBAQAogCXN0cnVjdCBzbmRfbGluZTZfcGNtICpsaW5lNnBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAogCWVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9yYXRkZW5zKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAotCQkJCQkgICAgKCZsaW5lNnBjbS0+cHJvcGVydGllcy0+c25kX2xpbmU2X3JhdGVzKSk7CisJCQkJCSAgICAoJmxpbmU2cGNtLT5wcm9wZXJ0aWVzLT4KKwkJCQkJICAgICBzbmRfbGluZTZfcmF0ZXMpKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMjkxLDcgKzMxNCw4IEBACiB9CiAKIC8qIGh3X3BhcmFtcyBwbGF5YmFjayBjYWxsYmFjayAqLwotc3RhdGljIGludCBzbmRfbGluZTZfcGxheWJhY2tfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKmh3X3BhcmFtcykKK3N0YXRpYyBpbnQgc25kX2xpbmU2X3BsYXliYWNrX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpod19wYXJhbXMpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3Qgc25kX2xpbmU2X3BjbSAqbGluZTZwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CkBAIC0zNDksNyArMzczLDggQEAKIAkJCWVyciA9IHN1Ym1pdF9hdWRpb19vdXRfYWxsX3VyYnMoc3Vic3RyZWFtKTsKIAogCQkJaWYgKGVyciA8IDApIHsKLQkJCQljbGVhcl9iaXQoQklUX1JVTk5JTkdfUExBWUJBQ0ssICZsaW5lNnBjbS0+ZmxhZ3MpOworCQkJCWNsZWFyX2JpdChCSVRfUlVOTklOR19QTEFZQkFDSywKKwkJCQkJICAmbGluZTZwY20tPmZsYWdzKTsKIAkJCQlyZXR1cm4gZXJyOwogCQkJfQogCQl9CkBAIC0zODcsMTQgKzQxMiwxNCBAQAogCiAvKiBwbGF5YmFjayBvcGVyYXRvcnMgKi8KIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfbGluZTZfcGxheWJhY2tfb3BzID0gewotCS5vcGVuID0gICAgICAgIHNuZF9saW5lNl9wbGF5YmFja19vcGVuLAotCS5jbG9zZSA9ICAgICAgIHNuZF9saW5lNl9wbGF5YmFja19jbG9zZSwKLQkuaW9jdGwgPSAgICAgICBzbmRfcGNtX2xpYl9pb2N0bCwKLQkuaHdfcGFyYW1zID0gICBzbmRfbGluZTZfcGxheWJhY2tfaHdfcGFyYW1zLAotCS5od19mcmVlID0gICAgIHNuZF9saW5lNl9wbGF5YmFja19od19mcmVlLAotCS5wcmVwYXJlID0gICAgIHNuZF9saW5lNl9wcmVwYXJlLAotCS50cmlnZ2VyID0gICAgIHNuZF9saW5lNl90cmlnZ2VyLAotCS5wb2ludGVyID0gICAgIHNuZF9saW5lNl9wbGF5YmFja19wb2ludGVyLAorCS5vcGVuID0gc25kX2xpbmU2X3BsYXliYWNrX29wZW4sCisJLmNsb3NlID0gc25kX2xpbmU2X3BsYXliYWNrX2Nsb3NlLAorCS5pb2N0bCA9IHNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPSBzbmRfbGluZTZfcGxheWJhY2tfaHdfcGFyYW1zLAorCS5od19mcmVlID0gc25kX2xpbmU2X3BsYXliYWNrX2h3X2ZyZWUsCisJLnByZXBhcmUgPSBzbmRfbGluZTZfcHJlcGFyZSwKKwkudHJpZ2dlciA9IHNuZF9saW5lNl90cmlnZ2VyLAorCS5wb2ludGVyID0gc25kX2xpbmU2X3BsYXliYWNrX3BvaW50ZXIsCiB9OwogCiBpbnQgY3JlYXRlX2F1ZGlvX291dF91cmJzKHN0cnVjdCBzbmRfbGluZTZfcGNtICpsaW5lNnBjbSkKQEAgLTQwNiw3ICs0MzEsOCBAQAogCQlzdHJ1Y3QgdXJiICp1cmI7CiAKIAkJLyogVVJCIGZvciBhdWRpbyBvdXQ6ICovCi0JCXVyYiA9IGxpbmU2cGNtLT51cmJfYXVkaW9fb3V0W2ldID0gdXNiX2FsbG9jX3VyYihMSU5FNl9JU09fUEFDS0VUUywgR0ZQX0tFUk5FTCk7CisJCXVyYiA9IGxpbmU2cGNtLT51cmJfYXVkaW9fb3V0W2ldID0KKwkJICAgIHVzYl9hbGxvY191cmIoTElORTZfSVNPX1BBQ0tFVFMsIEdGUF9LRVJORUwpOwogCiAJCWlmICh1cmIgPT0gTlVMTCkgewogCQkJZGV2X2VycihsaW5lNnBjbS0+bGluZTYtPmlmY2RldiwgIk91dCBvZiBtZW1vcnlcbiIpOwpAQCAtNDE0LDcgKzQ0MCwxMCBAQAogCQl9CiAKIAkJdXJiLT5kZXYgPSBsaW5lNnBjbS0+bGluZTYtPnVzYmRldjsKLQkJdXJiLT5waXBlID0gdXNiX3NuZGlzb2NwaXBlKGxpbmU2cGNtLT5saW5lNi0+dXNiZGV2LCBsaW5lNnBjbS0+ZXBfYXVkaW9fd3JpdGUgJiBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0spOworCQl1cmItPnBpcGUgPQorCQkgICAgdXNiX3NuZGlzb2NwaXBlKGxpbmU2cGNtLT5saW5lNi0+dXNiZGV2LAorCQkJCSAgICBsaW5lNnBjbS0+CisJCQkJICAgIGVwX2F1ZGlvX3dyaXRlICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLKTsKIAkJdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUDsKIAkJdXJiLT5zdGFydF9mcmFtZSA9IC0xOwogCQl1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gTElORTZfSVNPX1BBQ0tFVFM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvcG9kLmMgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvcG9kLmMKaW5kZXggNGM1YjlkNS4uNjg1YzUyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3BvZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9wb2QuYwpAQCAtNDIyLDEzICs0MjIsMjEgQEAKIC8qCiAJUmVzb2x2ZSB2YWx1ZSB0byBtZW1vcnkgbG9jYXRpb24uCiAqLwotc3RhdGljIHZvaWQgcG9kX3Jlc29sdmUoY29uc3QgY2hhciAqYnVmLCBzaG9ydCBibG9jazAsIHNob3J0IGJsb2NrMSwgdW5zaWduZWQgY2hhciAqbG9jYXRpb24pCitzdGF0aWMgaW50IHBvZF9yZXNvbHZlKGNvbnN0IGNoYXIgKmJ1Ziwgc2hvcnQgYmxvY2swLCBzaG9ydCBibG9jazEsIHVuc2lnbmVkIGNoYXIgKmxvY2F0aW9uKQogewotCWludCB2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwotCXNob3J0IGJsb2NrID0gKHZhbHVlIDwgMHg0MCkgPyBibG9jazAgOiBibG9jazE7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwlzaG9ydCBibG9jazsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbHVlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJYmxvY2sgPSAodmFsdWUgPCAweDQwKSA/IGJsb2NrMCA6IGJsb2NrMTsKIAl2YWx1ZSAmPSAweDNmOwogCWxvY2F0aW9uWzBdID0gYmxvY2sgPj4gNzsKIAlsb2NhdGlvblsxXSA9IHZhbHVlIHwgKGJsb2NrICYgMHg3Zik7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC00MzgsMTQgKzQ0NiwyMCBAQAogewogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CiAJc3RydWN0IHVzYl9saW5lNl9wb2QgKnBvZCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKLQorCWludCByZXQ7CiAJaW50IHNpemUgPSAzICsgc2l6ZW9mKHBvZC0+cHJvZ19kYXRhX2J1Zik7CiAJY2hhciAqc3lzZXggPSBwb2RfYWxsb2Nfc3lzZXhfYnVmZmVyKHBvZCwgUE9EX1NZU0VYX1NUT1JFLCBzaXplKTsKKwogCWlmICghc3lzZXgpCiAJCXJldHVybiAwOwogCiAJc3lzZXhbU1lTRVhfREFUQV9PRlNdID0gNTsgIC8qIHNlZSBwb2RfZHVtcCgpICovCi0JcG9kX3Jlc29sdmUoYnVmLCBibG9jazAsIGJsb2NrMSwgc3lzZXggKyBTWVNFWF9EQVRBX09GUyArIDEpOworCXJldCA9IHBvZF9yZXNvbHZlKGJ1ZiwgYmxvY2swLCBibG9jazEsIHN5c2V4ICsgU1lTRVhfREFUQV9PRlMgKyAxKTsKKwlpZiAocmV0KSB7CisJCWtmcmVlKHN5c2V4KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKIAltZW1jcHkoc3lzZXggKyBTWVNFWF9EQVRBX09GUyArIDMsICZwb2QtPnByb2dfZGF0YV9idWYsIHNpemVvZihwb2QtPnByb2dfZGF0YV9idWYpKTsKIAogCWxpbmU2X3NlbmRfc3lzZXhfbWVzc2FnZSgmcG9kLT5saW5lNiwgc3lzZXgsIHNpemUpOwpAQCAtNDYxLDEzICs0NzUsMTggQEAKIHsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwogCXN0cnVjdCB1c2JfbGluZTZfcG9kICpwb2QgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisJaW50IHJldDsKIAlpbnQgc2l6ZSA9IDQ7CiAJY2hhciAqc3lzZXggPSBwb2RfYWxsb2Nfc3lzZXhfYnVmZmVyKHBvZCwgUE9EX1NZU0VYX0RVTVBNRU0sIHNpemUpOwogCiAJaWYgKCFzeXNleCkKIAkJcmV0dXJuIDA7CiAKLQlwb2RfcmVzb2x2ZShidWYsIGJsb2NrMCwgYmxvY2sxLCBzeXNleCArIFNZU0VYX0RBVEFfT0ZTKTsKKwlyZXQgPSBwb2RfcmVzb2x2ZShidWYsIGJsb2NrMCwgYmxvY2sxLCBzeXNleCArIFNZU0VYX0RBVEFfT0ZTKTsKKwlpZiAocmV0KSB7CisJCWtmcmVlKHN5c2V4KTsKKwkJcmV0dXJuIHJldDsKKwl9CiAJc3lzZXhbU1lTRVhfREFUQV9PRlMgKyAyXSA9IDA7CiAJc3lzZXhbU1lTRVhfREFUQV9PRlMgKyAzXSA9IDA7CiAJbGluZTZfZHVtcF9zdGFydGVkKCZwb2QtPmR1bXByZXEsIFBPRF9EVU1QX01FTU9SWSk7CkBAIC01MjYsNyArNTQ1LDEzIEBACiB7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKIAlzdHJ1Y3QgdXNiX2xpbmU2X3BvZCAqcG9kID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOwotCWludCB2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWx1ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCXBvZF9zZW5kX2NoYW5uZWwocG9kLCB2YWx1ZSk7CiAJcmV0dXJuIGNvdW50OwogfQpAQCAtNTc5LDcgKzYwNCw3IEBACiAKIAlpZiAoY291bnQgIT0gc2l6ZW9mKHBvZC0+cHJvZ19kYXRhKSkgewogCQlkZXZfZXJyKHBvZC0+bGluZTYuaWZjZGV2LAotCQkJImRhdGEgYmxvY2sgbXVzdCBiZSBleGFjdGx5ICVkIGJ5dGVzXG4iLAorCQkJImRhdGEgYmxvY2sgbXVzdCBiZSBleGFjdGx5ICV6dSBieXRlc1xuIiwKIAkJCXNpemVvZihwb2QtPnByb2dfZGF0YSkpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC02NDUsNiArNjcwLDggQEAKIAljaGFyICpzeXNleDsKIAlzdGF0aWMgY29uc3QgaW50IHNpemUgPSA1OwogCXVuc2lnbmVkIHNob3J0IHZhbHVlOworCXVuc2lnbmVkIGxvbmcgcmVzdWx0OworCWludCByZXQ7CiAKIAlpZiAoKChwb2QtPnByb2dfZGF0YS5jb250cm9sW1BPRF90dW5lcl0gJiAweDQwKSA9PSAwKSAmJiB0dW5lcikKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC02NTMsNyArNjgwLDEyIEBACiAJc3lzZXggPSBwb2RfYWxsb2Nfc3lzZXhfYnVmZmVyKHBvZCwgUE9EX1NZU0VYX1NZU1RFTSwgc2l6ZSk7CiAJaWYgKCFzeXNleCkKIAkJcmV0dXJuIDA7Ci0JdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKSAmIG1hc2s7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmcmVzdWx0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdmFsdWUgPSByZXN1bHQgJiBtYXNrOwogCXN5c2V4W1NZU0VYX0RBVEFfT0ZTXSA9IGNvZGU7CiAJc3lzZXhbU1lTRVhfREFUQV9PRlMgKyAxXSA9ICh2YWx1ZSA+PiAxMikgJiAweDBmOwogCXN5c2V4W1NZU0VYX0RBVEFfT0ZTICsgMl0gPSAodmFsdWUgPj4gIDgpICYgMHgwZjsKQEAgLTY5MSw3ICs3MjMsNyBAQAogCiAJaWYgKGNvdW50ICE9IHNpemVvZihwb2QtPnByb2dfZGF0YSkpIHsKIAkJZGV2X2Vycihwb2QtPmxpbmU2LmlmY2RldiwKLQkJCQkJCSJkYXRhIGJsb2NrIG11c3QgYmUgZXhhY3RseSAlZCBieXRlc1xuIiwKKwkJCQkJCSJkYXRhIGJsb2NrIG11c3QgYmUgZXhhY3RseSAlenUgYnl0ZXNcbiIsCiAJCQkJCQlzaXplb2YocG9kLT5wcm9nX2RhdGEpKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtODEyLDcgKzg0NCwxMyBAQAogewogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CiAJc3RydWN0IHVzYl9saW5lNl9wb2QgKnBvZCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKLQlpbnQgdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsdWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlwb2QtPm1pZGlfcG9zdHByb2Nlc3MgPSB2YWx1ZSA/IDEgOiAwOwogCXJldHVybiBjb3VudDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi90b25lcG9ydC5jIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3RvbmVwb3J0LmMKaW5kZXggZWFhMTIyOS4uZTY3NzBlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3RvbmVwb3J0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3RvbmVwb3J0LmMKQEAgLTE3LDEwICsxNyw4IEBACiAjaW5jbHVkZSAicGxheWJhY2suaCIKICNpbmNsdWRlICJ0b25lcG9ydC5oIgogCi0KIHN0YXRpYyBpbnQgdG9uZXBvcnRfc2VuZF9jbWQoc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldiwgaW50IGNtZDEsIGludCBjbWQyKTsKIAotCiBzdGF0aWMgc3RydWN0IHNuZF9yYXRkZW4gdG9uZXBvcnRfcmF0ZGVuID0gewogCS5udW1fbWluID0gNDQxMDAsCiAJLm51bV9tYXggPSA0NDEwMCwKQEAgLTI5LDQ3ICsyNyw0NCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBsaW5lNl9wY21fcHJvcGVydGllcyB0b25lcG9ydF9wY21fcHJvcGVydGllcyA9IHsKLSAgLnNuZF9saW5lNl9wbGF5YmFja19odyA9IHsKLQkJLmluZm8gPSAoU05EUlZfUENNX0lORk9fTU1BUCB8Ci0JCQkJCQkgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAotCQkJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKLQkJCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKLQkJCQkJCSBTTkRSVl9QQ01fSU5GT19QQVVTRSB8Ci0JCQkJCQkgU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCksCi0JCS5mb3JtYXRzID0gICAgICAgICAgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCS5yYXRlcyA9ICAgICAgICAgICAgU05EUlZfUENNX1JBVEVfS05PVCwKLQkJLnJhdGVfbWluID0gICAgICAgICA0NDEwMCwKLQkJLnJhdGVfbWF4ID0gICAgICAgICA0NDEwMCwKLQkJLmNoYW5uZWxzX21pbiA9ICAgICAyLAotCQkuY2hhbm5lbHNfbWF4ID0gICAgIDIsCi0JCS5idWZmZXJfYnl0ZXNfbWF4ID0gNjAwMDAsCi0JCS5wZXJpb2RfYnl0ZXNfbWluID0gMTgwICogNCwKLQkJLnBlcmlvZF9ieXRlc19tYXggPSA4MTkyLAotCQkucGVyaW9kc19taW4gPSAgICAgIDEsCi0JCS5wZXJpb2RzX21heCA9ICAgICAgMTAyNAotCX0sCi0gIC5zbmRfbGluZTZfY2FwdHVyZV9odyA9IHsKLQkJLmluZm8gPSAoU05EUlZfUENNX0lORk9fTU1BUCB8Ci0JCQkJCQkgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAotCQkJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKLQkJCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKLQkJCQkJCSBTTkRSVl9QQ01fSU5GT19TWU5DX1NUQVJUKSwKLQkJLmZvcm1hdHMgPSAgICAgICAgICBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJLnJhdGVzID0gICAgICAgICAgICBTTkRSVl9QQ01fUkFURV9LTk9ULAotCQkucmF0ZV9taW4gPSAgICAgICAgIDQ0MTAwLAotCQkucmF0ZV9tYXggPSAgICAgICAgIDQ0MTAwLAotCQkuY2hhbm5lbHNfbWluID0gICAgIDIsCi0JCS5jaGFubmVsc19tYXggPSAgICAgMiwKLQkJLmJ1ZmZlcl9ieXRlc19tYXggPSA2MDAwMCwKLQkJLnBlcmlvZF9ieXRlc19taW4gPSAxODggKiA0LAotCQkucGVyaW9kX2J5dGVzX21heCA9IDgxOTIsCi0JCS5wZXJpb2RzX21pbiA9ICAgICAgMSwKLQkJLnBlcmlvZHNfbWF4ID0gICAgICAxMDI0Ci0JfSwKKwkuc25kX2xpbmU2X3BsYXliYWNrX2h3ID0geworCQkJCSAgLmluZm8gPSAoU05EUlZfUENNX0lORk9fTU1BUCB8CisJCQkJCSAgIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkJICAgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJCQkgICBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKKwkJCQkJICAgU05EUlZfUENNX0lORk9fUEFVU0UgfAorCQkJCQkgICBTTkRSVl9QQ01fSU5GT19TWU5DX1NUQVJUKSwKKwkJCQkgIC5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkJICAucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV9LTk9ULAorCQkJCSAgLnJhdGVfbWluID0gNDQxMDAsCisJCQkJICAucmF0ZV9tYXggPSA0NDEwMCwKKwkJCQkgIC5jaGFubmVsc19taW4gPSAyLAorCQkJCSAgLmNoYW5uZWxzX21heCA9IDIsCisJCQkJICAuYnVmZmVyX2J5dGVzX21heCA9IDYwMDAwLAorCQkJCSAgLnBlcmlvZF9ieXRlc19taW4gPSAxODAgKiA0LAorCQkJCSAgLnBlcmlvZF9ieXRlc19tYXggPSA4MTkyLAorCQkJCSAgLnBlcmlvZHNfbWluID0gMSwKKwkJCQkgIC5wZXJpb2RzX21heCA9IDEwMjR9LAorCS5zbmRfbGluZTZfY2FwdHVyZV9odyA9IHsKKwkJCQkgLmluZm8gPSAoU05EUlZfUENNX0lORk9fTU1BUCB8CisJCQkJCSAgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCQkgIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkJICBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKKwkJCQkJICBTTkRSVl9QQ01fSU5GT19TWU5DX1NUQVJUKSwKKwkJCQkgLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJCQkgLnJhdGVzID0gU05EUlZfUENNX1JBVEVfS05PVCwKKwkJCQkgLnJhdGVfbWluID0gNDQxMDAsCisJCQkJIC5yYXRlX21heCA9IDQ0MTAwLAorCQkJCSAuY2hhbm5lbHNfbWluID0gMiwKKwkJCQkgLmNoYW5uZWxzX21heCA9IDIsCisJCQkJIC5idWZmZXJfYnl0ZXNfbWF4ID0gNjAwMDAsCisJCQkJIC5wZXJpb2RfYnl0ZXNfbWluID0gMTg4ICogNCwKKwkJCQkgLnBlcmlvZF9ieXRlc19tYXggPSA4MTkyLAorCQkJCSAucGVyaW9kc19taW4gPSAxLAorCQkJCSAucGVyaW9kc19tYXggPSAxMDI0fSwKIAkuc25kX2xpbmU2X3JhdGVzID0gewotCQkubnJhdHMgPSAxLAotCQkucmF0cyA9ICZ0b25lcG9ydF9yYXRkZW4KLQl9LAorCQkJICAgIC5ucmF0cyA9IDEsCisJCQkgICAgLnJhdHMgPSAmdG9uZXBvcnRfcmF0ZGVufSwKIAkuYnl0ZXNfcGVyX2ZyYW1lID0gNAogfTsKIApAQCAtMTAxLDggKzk2LDE0IEBACiAJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQljaGFyICpjOwotCWxlZF9yZWQgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgJmMsIDEwKTsKKwlpbnQgcmV0dmFsOworCWxvbmcgdmFsdWU7CisKKwlyZXR2YWwgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWx1ZSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWxlZF9yZWQgPSB2YWx1ZTsKIAl0b25lcG9ydF91cGRhdGVfbGVkKGRldik7CiAJcmV0dXJuIGNvdW50OwogfQpAQCAtMTExLDE1ICsxMTIsMjIgQEAKIAkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQljaGFyICpjOwotCWxlZF9ncmVlbiA9IHNpbXBsZV9zdHJ0b2woYnVmLCAmYywgMTApOworCWludCByZXR2YWw7CisJbG9uZyB2YWx1ZTsKKworCXJldHZhbCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbHVlKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJbGVkX2dyZWVuID0gdmFsdWU7CiAJdG9uZXBvcnRfdXBkYXRlX2xlZChkZXYpOwogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIERFVklDRV9BVFRSKGxlZF9yZWQsIFNfSVdVR08gfCBTX0lSVUdPLCBsaW5lNl9ub3BfcmVhZCwgdG9uZXBvcnRfc2V0X2xlZF9yZWQpOwotc3RhdGljIERFVklDRV9BVFRSKGxlZF9ncmVlbiwgU19JV1VHTyB8IFNfSVJVR08sIGxpbmU2X25vcF9yZWFkLCB0b25lcG9ydF9zZXRfbGVkX2dyZWVuKTsKLQorc3RhdGljIERFVklDRV9BVFRSKGxlZF9yZWQsIFNfSVdVR08gfCBTX0lSVUdPLCBsaW5lNl9ub3BfcmVhZCwKKwkJICAgdG9uZXBvcnRfc2V0X2xlZF9yZWQpOworc3RhdGljIERFVklDRV9BVFRSKGxlZF9ncmVlbiwgU19JV1VHTyB8IFNfSVJVR08sIGxpbmU2X25vcF9yZWFkLAorCQkgICB0b25lcG9ydF9zZXRfbGVkX2dyZWVuKTsKIAogc3RhdGljIGludCB0b25lcG9ydF9zZW5kX2NtZChzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2LCBpbnQgY21kMSwgaW50IGNtZDIpCiB7CkBAIC0xOTYsMTYgKzIwNCwxOCBAQAogCWxpbmU2X3dyaXRlX2RhdGEobGluZTYsIDB4ODBjNiwgJnRpY2tzLCA0KTsKIAogCS8qCi0Jc2VlbXMgdG8gd29yayB3aXRob3V0IHRoZSBmaXJzdCB0d28uLi4KLQkqLworCSAgIHNlZW1zIHRvIHdvcmsgd2l0aG91dCB0aGUgZmlyc3QgdHdvLi4uCisJICovCiAJLyogdG9uZXBvcnRfc2VuZF9jbWQodXNiZGV2LCAweDAyMDEsIDB4MDAwMik7ICovCiAJLyogdG9uZXBvcnRfc2VuZF9jbWQodXNiZGV2LCAweDA4MDEsIDB4MDAwMCk7ICovCiAJLyogb25seSBvbmUgdGhhdCB3b3JrcyBmb3IgbWU7IG9uIEdQLCBUUCBtaWdodCBiZSBkaWZmZXJlbnQ/ICovCiAJdG9uZXBvcnRfc2VuZF9jbWQodXNiZGV2LCAweDAzMDEsIDB4MDAwMCk7CiAKIAlpZiAodXNiZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCAhPSBMSU5FNl9ERVZJRF9HVUlUQVJQT1JUKSB7Ci0JCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfbGVkX3JlZCkpOwotCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX2xlZF9ncmVlbikpOworCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkgICAgICgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9sZWRfcmVkKSk7CisJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCSAgICAgKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX2xlZF9ncmVlbikpOwogCQl0b25lcG9ydF91cGRhdGVfbGVkKCZ1c2JkZXYtPmRldik7CiAJfQogCkBAIC0yMjMsNyArMjMzLDggQEAKIAkJcmV0dXJuOwogCXRvbmVwb3J0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOwogCi0JaWYgKHRvbmVwb3J0LT5saW5lNi51c2JkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0ICE9IExJTkU2X0RFVklEX0dVSVRBUlBPUlQpIHsKKwlpZiAodG9uZXBvcnQtPmxpbmU2LnVzYmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QgIT0KKwkgICAgTElORTZfREVWSURfR1VJVEFSUE9SVCkgewogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfbGVkX3JlZCk7CiAJCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9sZWRfZ3JlZW4pOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi92YXJpYXguYyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi92YXJpYXguYwppbmRleCBmOWQ5Njk4Li40OGQ4MzRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvdmFyaWF4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3ZhcmlheC5jCkBAIC0xODQsNyArMTg0LDEyIEBACiAJCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCB1c2JfbGluZTZfdmFyaWF4ICp2YXJpYXggPSB1c2JfZ2V0X2ludGZkYXRhKHRvX3VzYl9pbnRlcmZhY2UoZGV2KSk7Ci0JaW50IHZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbHVlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJaWYgKGxpbmU2X3RyYW5zbWl0X3BhcmFtZXRlcigmdmFyaWF4LT5saW5lNiwgVkFSSUFYTUlESV92b2x1bWUsCiAJCQkJICAgICB2YWx1ZSkgPT0gMCkKQEAgLTIxMSw3ICsyMTYsMTIgQEAKIAkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgdXNiX2xpbmU2X3ZhcmlheCAqdmFyaWF4ID0gdXNiX2dldF9pbnRmZGF0YSh0b191c2JfaW50ZXJmYWNlKGRldikpOwotCWludCB2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWx1ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWlmIChsaW5lNl9zZW5kX3Byb2dyYW0oJnZhcmlheC0+bGluZTYsIHZhbHVlKSA9PSAwKQogCQl2YXJpYXgtPm1vZGVsID0gdmFsdWU7CkBAIC0yMzcsOCArMjQ3LDE0IEBACiAJCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCB1c2JfbGluZTZfdmFyaWF4ICp2YXJpYXggPSB1c2JfZ2V0X2ludGZkYXRhKHRvX3VzYl9pbnRlcmZhY2UoZGV2KSk7Ci0JaW50IHZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCkgPyAxIDogMDsKLQl2YXJpYXgtPmJ1ZmZlcl9hY3RpdmF0ZVtWQVJJQVhfT0ZGU0VUX0FDVElWQVRFXSA9IHZhbHVlOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWx1ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXZhcmlheC0+YnVmZmVyX2FjdGl2YXRlW1ZBUklBWF9PRkZTRVRfQUNUSVZBVEVdID0gdmFsdWUgPyAxOiAwOwogCWxpbmU2X3NlbmRfcmF3X21lc3NhZ2VfYXN5bmMoJnZhcmlheC0+bGluZTYsIHZhcmlheC0+YnVmZmVyX2FjdGl2YXRlLAogCQkJCSAgICAgc2l6ZW9mKHZhcmlheF9hY3RpdmF0ZSkpOwogCXJldHVybiBjb3VudDsKQEAgLTI2Miw3ICsyNzgsMTIgQEAKIAkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgdXNiX2xpbmU2X3ZhcmlheCAqdmFyaWF4ID0gdXNiX2dldF9pbnRmZGF0YSh0b191c2JfaW50ZXJmYWNlKGRldikpOwotCWludCB2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWx1ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWlmIChsaW5lNl90cmFuc21pdF9wYXJhbWV0ZXIoJnZhcmlheC0+bGluZTYsIFZBUklBWE1JRElfdG9uZSwKIAkJCQkgICAgIHZhbHVlKSA9PSAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9jdm14LXBvdy5oIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9jdm14LXBvdy5oCmluZGV4IGM1ZDY2ZjIuLmJmOWUwNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vY3ZteC1wb3cuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2N2bXgtcG93LmgKQEAgLTE5NTksNyArMTk1OSw3IEBACiAgKiBAYnVmZmVyX3NpemU6CiAgKiAgICAgICAgICAgICAgIFRoZSBzaXplIG9mIHRoZSBzdXBwbGllZCBidWZmZXIKICAqCi0gKiBSZXR1cm5zIFplcm8gb24gc3VjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKiBSZXR1cm5zIFplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQogICovCiBleHRlcm4gaW50IGN2bXhfcG93X2NhcHR1cmUodm9pZCAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXJnbWlpLmMgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXJnbWlpLmMKaW5kZXggODcwNDEzMy4uZmJhYTQ2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1yZ21paS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtcmdtaWkuYwpAQCAtMzA4LDcgKzMwOCw3IEBACiAKIAkvKgogCSAqIER1ZSB0byBHTVggZXJyYXRhIGluIENOM1hYWCBzZXJpZXMgY2hpcHMsIGl0IGlzIG5lY2Vzc2FyeQotCSAqIHRvIHRha2UgdGhlIGxpbmsgZG93biBpbW1lZGlhdGVseSB3aG5lIHRoZSBQSFkgY2hhbmdlcworCSAqIHRvIHRha2UgdGhlIGxpbmsgZG93biBpbW1lZGlhdGVseSB3aGVuIHRoZSBQSFkgY2hhbmdlcwogCSAqIHN0YXRlLiBJbiBvcmRlciB0byBkbyB0aGlzIHdlIGNhbGwgdGhlIHBvbGwgZnVuY3Rpb24gZXZlcnkKIAkgKiB0aW1lIHRoZSBSR01JSSBpbmJhbmQgc3RhdHVzIGNoYW5nZXMuICBUaGlzIG1heSBjYXVzZQogCSAqIHByb2JsZW1zIGlmIHRoZSBQSFkgZG9lc24ndCBpbXBsZW1lbnQgaW5iYW5kIHN0YXR1cwpAQCAtMzE3LDYgKzMxNyw4IEBACiAJaWYgKG51bWJlcl9yZ21paV9wb3J0cyA9PSAwKSB7CiAJCXIgPSByZXF1ZXN0X2lycShPQ1RFT05fSVJRX1JNTCwgY3ZtX29jdF9yZ21paV9ybWxfaW50ZXJydXB0LAogCQkJCUlSUUZfU0hBUkVELCAiUkdNSUkiLCAmbnVtYmVyX3JnbWlpX3BvcnRzKTsKKwkJaWYgKHIgIT0gMCkKKwkJCXJldHVybiByOwogCX0KIAludW1iZXJfcmdtaWlfcG9ydHMrKzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC10eC5jIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC10eC5jCmluZGV4IDgxYTg1MTMuLjUzNTI5NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtdHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXR4LmMKQEAgLTYyNCw3ICs2MjQsNyBAQAogRVhQT1JUX1NZTUJPTChjdm1fb2N0X3RyYW5zbWl0X3Fvcyk7CiAKIC8qKgotICogVGhpcyBmdW5jdGlvbiBmcmVlcyBhbGwgc2tiIHRoYXQgYXJlIGN1cnJlbnR5IHF1ZXVlZCBmb3IgVFguCisgKiBUaGlzIGZ1bmN0aW9uIGZyZWVzIGFsbCBza2IgdGhhdCBhcmUgY3VycmVudGx5IHF1ZXVlZCBmb3IgVFguCiAgKgogICogQGRldjogICAgRGV2aWNlIGJlaW5nIHNodXRkb3duCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jY21kLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2NtZC5jCmluZGV4IDgzZGQ4YmEuLjhkYTI4ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jY21kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NjbWQuYwpAQCAtODk5LDcgKzg5OSw3IEBACiAJCXpmU3RhRGlzYWJsZVNXRW5jcnlwdGlvbihkZXYpOwogCX0KIAotCS8qIEltcHJvdmUgV0VQL1RLSVAgcGVyZm9ybWFjZSB3aXRoIEhUIEFQLAorCS8qIEltcHJvdmUgV0VQL1RLSVAgcGVyZm9ybWFuY2Ugd2l0aCBIVCBBUCwKIAlkZXRhaWwgaW5mb3JtYXRpb24gcGxlYXNlIGxvb2sgYnVnIzMyNDk1ICovCiAJLyogemZIcFNldFRUU0lGU1RpbWUoZGV2LCAweDgpOyAqLwogCkBAIC0xNDA3LDcgKzE0MDcsNyBAQAogCQl6ZlN0YURpc2FibGVTV0VuY3J5cHRpb24oZGV2KTsKIAl9CiAKLQkvKiAJSW1wcm92ZSBXRVAvVEtJUCBwZXJmb3JtYWNlIHdpdGggSFQgQVAsCisJLyogCUltcHJvdmUgV0VQL1RLSVAgcGVyZm9ybWFuY2Ugd2l0aCBIVCBBUCwKIAkJZGV0YWlsIGluZm9ybWF0aW9uIHBsZWFzZSBsb29rIGJ1ZyMzMjQ5NQogCSovCiAJLyogemZIcFNldFRUU0lGU1RpbWUoZGV2LCAweDgpOyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NtbS5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NtbS5jCmluZGV4IGJlZDE2YjUuLmE2YzFiNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jbW0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY21tLmMKQEAgLTE0MjgsNyArMTQyOCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvKiBCZWFjb24gKi8KICAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0JFQUNPTiA6Ci0gICAgICAgICAgICAgICAgLyogaWYgZW5hYmxlIDgwMi4xMWggYW5kIGN1cnJlbnQgY2hhbmVsIGlzIHNpbGVudCBidXQgcmVjZWl2ZSBiZWFjb24gZnJvbSBvdGhlciBBUCAqLworICAgICAgICAgICAgICAgIC8qIGlmIGVuYWJsZSA4MDIuMTFoIGFuZCBjdXJyZW50IGNoYW5uZWwgaXMgc2lsZW50IGJ1dCByZWNlaXZlIGJlYWNvbiBmcm9tIG90aGVyIEFQICovCiAgICAgICAgICAgICAgICAgaWYgKCgod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbd2QtPnJlZ3VsYXRpb25UYWJsZS5DdXJDaEluZGV4XS5jaGFubmVsRmxhZ3MKICAgICAgICAgICAgICAgICAgICAgICAgICYgWk1fUkVHX0ZMQUdfQ0hBTk5FTF9DU0EpICE9IDApICYmIHdkLT5zdGEuREZTRW5hYmxlKQogICAgICAgICAgICAgICAgIHsKQEAgLTE0NjksNyArMTQ2OSw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgLyogUHJvYmUgcmVzcG9uc2UgKi8KICAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX1BST0JFUlNQIDoKLSAgICAgICAgICAgICAgICAvKiBpZiBlbmFibGUgODAyLjExaCBhbmQgY3VycmVudCBjaGFuZWwgaXMgc2lsZW50IGJ1dCByZWNlaXZlIHByb2JlIHJlc3BvbnNlIGZyb20gb3RoZXIgQVAgKi8KKyAgICAgICAgICAgICAgICAvKiBpZiBlbmFibGUgODAyLjExaCBhbmQgY3VycmVudCBjaGFubmVsIGlzIHNpbGVudCBidXQgcmVjZWl2ZSBwcm9iZSByZXNwb25zZSBmcm9tIG90aGVyIEFQICovCiAgICAgICAgICAgICAgICAgaWYgKCgod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbd2QtPnJlZ3VsYXRpb25UYWJsZS5DdXJDaEluZGV4XS5jaGFubmVsRmxhZ3MKICAgICAgICAgICAgICAgICAgICAgICAgICYgWk1fUkVHX0ZMQUdfQ0hBTk5FTF9DU0EpICE9IDApICYmIHdkLT5zdGEuREZTRW5hYmxlKQogICAgICAgICAgICAgICAgIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jbW1zdGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jbW1zdGEuYwppbmRleCBiMjhhNGUyLi5hMTFkNTU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY21tc3RhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NtbXN0YS5jCkBAIC0yMTYsNyArMjE2LDcgQEAKICAgICAvKiBDaGFuZ2UgaW50ZXJuYWwgc3RhdGUgKi8KICAgICB6ZkNoYW5nZUFkYXB0ZXJTdGF0ZShkZXYsIFpNX1NUQV9TVEFURV9ESVNDT05ORUNUKTsKIAotICAgIC8qIEltcHJvdmUgV0VQL1RLSVAgcGVyZm9ybWFjZSB3aXRoIEhUIEFQLCBkZXRhaWwgaW5mb3JtYXRpb24gcGxlYXNlIGxvb2sgYnVnIzMyNDk1ICovCisgICAgLyogSW1wcm92ZSBXRVAvVEtJUCBwZXJmb3JtYW5jZSB3aXRoIEhUIEFQLCBkZXRhaWwgaW5mb3JtYXRpb24gcGxlYXNlIGxvb2sgYnVnIzMyNDk1ICovCiAgICAgLy96ZkhwU2V0VFRTSUZTVGltZShkZXYsIDB4OCk7CiAKICAgICAvKiBOb3RpZnkgd3JhcHBlciBvZiBjb25uZWN0aW9uIHN0YXR1cyBjaGFuZ2VzICovCkBAIC00MTQ4LDcgKzQxNDgsNyBAQAogICAgICAgICAgICAgd2QtPnN0YS5iSXNTaGFyZWRLZXkgPSAwOwogICAgICAgICB9CiAKLSAgICAgICAgLyogSW1wcm92ZSBXRVAvVEtJUCBwZXJmb3JtYWNlIHdpdGggSFQgQVAsIGRldGFpbCBpbmZvcm1hdGlvbiBwbGVhc2UgbG9vayBidWcjMzI0OTUgKi8KKyAgICAgICAgLyogSW1wcm92ZSBXRVAvVEtJUCBwZXJmb3JtYW5jZSB3aXRoIEhUIEFQLCBkZXRhaWwgaW5mb3JtYXRpb24gcGxlYXNlIGxvb2sgYnVnIzMyNDk1ICovCiAgICAgICAgIC8qCiAgICAgICAgIGlmICggKHBCc3NJbmZvLT5icm9hZGNvbUhUQXAgPT0gMSkKICAgICAgICAgICAgICAmJiAod2QtPnN0YS5TV0VuY3J5cHRFbmFibGUgIT0gMCkgKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N0eHJ4LmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3R4cnguYwppbmRleCBlMjU4YTdkLi5hYzU0ZDVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3R4cnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3R4cnguYwpAQCAtMzA5Myw3ICszMDkzLDcgQEAKIAogICAgIGZyYW1lVHlwZSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCk7CiAKLSAgICAvLyBEb24ndCBkaXZpZGUgMl40IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0aGUgZnJhZ2VtZW50YXRpb24gcGt0IHRvIGJlIHRyZWF0ZWQgYXMKKyAgICAvLyBEb24ndCBkaXZpZGUgMl40IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0aGUgZnJhZ21lbnRhdGlvbiBwa3QgdG8gYmUgdHJlYXRlZCBhcwogICAgIC8vIGR1cGxpY2F0ZWQgZnJhbWVzCiAgICAgc2VxID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzIyKTsKICAgICBkc3QwID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3B1Yl96ZmkuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9wdWJfemZpLmgKaW5kZXggNjBiN2QxYy4uYjdiN2Y0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3B1Yl96ZmkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcHViX3pmaS5oCkBAIC03ODIsNyArNzgyLDcgQEAKIAogLyoqKioqIEVuZCBvZiBzZWN0aW9uIDIgKioqKiovCiAKLS8qKioqKiBzZWN0aW9uIDMgcGVyZm9ybWFjZSBldmFsdWF0aW9uICoqKioqLworLyoqKioqIHNlY3Rpb24gMyBwZXJmb3JtYW5jZSBldmFsdWF0aW9uICoqKioqLwogI2lmZGVmIFpNX0VOQUJMRV9QRVJGT1JNQU5DRV9FVkFMVUFUSU9OCiBleHRlcm4gdm9pZCB6ZmlUeFBlcmZvcm1hbmNlTVNEVSh6ZGV2X3QqIGRldiwgdTMyX3QgdGljayk7CiBleHRlcm4gdm9pZCB6ZmlSeFBlcmZvcm1hbmNlTVBEVSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvYXBkYmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2FwZGJnLmMKaW5kZXggZDNlMmY2Mi4uMGViOTNmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvYXBkYmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9hcGRiZy5jCkBAIC0zOCwzOSArMzgsMzkgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KIAotI2RlZmluZSBaTV9JT0NUTF9SRUdfUkVBRCAgICAgICAgICAgMHgwMQotI2RlZmluZSBaTV9JT0NUTF9SRUdfV1JJVEUgICAgICAgICAgMHgwMgotI2RlZmluZSBaTV9JT0NUTF9NRU1fRFVNUCAgICAgICAgICAgMHgwMwotI2RlZmluZSBaTV9JT0NUTF9SRUdfRFVNUCAgICAgICAgICAgMHgwNQotI2RlZmluZSBaTV9JT0NUTF9UWERfRFVNUCAgICAgICAgICAgMHgwNgotI2RlZmluZSBaTV9JT0NUTF9SWERfRFVNUCAgICAgICAgICAgMHgwNwotI2RlZmluZSBaTV9JT0NUTF9NRU1fUkVBRCAgICAgICAgICAgMHgwQgotI2RlZmluZSBaTV9JT0NUTF9NRU1fV1JJVEUgICAgICAgICAgMHgwQwotI2RlZmluZSBaTV9JT0NUTF9ETUFfVEVTVCAgICAgICAgICAgMHgxMAotI2RlZmluZSBaTV9JT0NUTF9SRUdfVEVTVCAgICAgICAgICAgMHgxMQotI2RlZmluZSBaTV9JT0NUTF9URVNUICAgICAgICAgICAgICAgMHg4MAotI2RlZmluZSBaTV9JT0NUTF9UQUxMWSAgICAgICAgICAgICAgMHg4MSAvL0NXWWFuZygrKQotI2RlZmluZSBaTV9JT0NUTF9SVFMgICAgICAgICAgICAgICAgMHhBMAotI2RlZmluZSBaTV9JT0NUTF9NSVhfTU9ERSAgICAgICAgICAgMHhBMQotI2RlZmluZSBaTV9JT0NUTF9GUkFHICAgICAgICAgICAgICAgMHhBMgotI2RlZmluZSBaTV9JT0NUTF9TQ0FOICAgICAgICAgICAgICAgMHhBMwotI2RlZmluZSBaTV9JT0NUTF9LRVkgICAgICAgICAgICAgICAgMHhBNAotI2RlZmluZSBaTV9JT0NUTF9SQVRFICAgICAgICAgICAgICAgMHhBNQotI2RlZmluZSBaTV9JT0NUTF9FTkNSWVBUSU9OX01PREUgICAgMHhBNgotI2RlZmluZSBaTV9JT0NUTF9HRVRfVFhDTlQgICAgICAgICAgMHhBNwotI2RlZmluZSBaTV9JT0NUTF9HRVRfREVBR0dfQ05UICAgICAgMHhBOAotI2RlZmluZSBaTV9JT0NUTF9EVVJBVElPTl9NT0RFICAgICAgMHhBOQotI2RlZmluZSBaTV9JT0NUTF9TRVRfQUVTX0tFWSAgICAgICAgMHhBQQotI2RlZmluZSBaTV9JT0NUTF9TRVRfQUVTX01PREUgICAgICAgMHhBQgotI2RlZmluZSBaTV9JT0NUTF9TSUdOQUxfU1RSRU5HVEggICAgMHhBQyAvL0NXWWFuZygrKQotI2RlZmluZSBaTV9JT0NUTF9TSUdOQUxfUVVBTElUWSAgICAgMHhBRCAvL0NXWWFuZygrKQotI2RlZmluZSBaTV9JT0NUTF9TRVRfUElCU1NfTU9ERSAgICAgMHhBRQotI2RlZmluZQlaREFQSU9DVEwgICAgICAgICAgICAgICAgICAgU0lPQ0RFVlBSSVZBVEUKKyNkZWZpbmUgWk1fSU9DVExfUkVHX1JFQUQJCQkweDAxCisjZGVmaW5lIFpNX0lPQ1RMX1JFR19XUklURQkJCTB4MDIKKyNkZWZpbmUgWk1fSU9DVExfTUVNX0RVTVAJCQkweDAzCisjZGVmaW5lIFpNX0lPQ1RMX1JFR19EVU1QCQkJMHgwNQorI2RlZmluZSBaTV9JT0NUTF9UWERfRFVNUAkJCTB4MDYKKyNkZWZpbmUgWk1fSU9DVExfUlhEX0RVTVAJCQkweDA3CisjZGVmaW5lIFpNX0lPQ1RMX01FTV9SRUFECQkJMHgwQgorI2RlZmluZSBaTV9JT0NUTF9NRU1fV1JJVEUJCQkweDBDCisjZGVmaW5lIFpNX0lPQ1RMX0RNQV9URVNUCQkJMHgxMAorI2RlZmluZSBaTV9JT0NUTF9SRUdfVEVTVAkJCTB4MTEKKyNkZWZpbmUgWk1fSU9DVExfVEVTVAkJCQkweDgwCisjZGVmaW5lIFpNX0lPQ1RMX1RBTExZCQkJCTB4ODEgLyogQ1dZYW5nKCspICovCisjZGVmaW5lIFpNX0lPQ1RMX1JUUwkJCQkweEEwCisjZGVmaW5lIFpNX0lPQ1RMX01JWF9NT0RFCQkJMHhBMQorI2RlZmluZSBaTV9JT0NUTF9GUkFHCQkJCTB4QTIKKyNkZWZpbmUgWk1fSU9DVExfU0NBTgkJCQkweEEzCisjZGVmaW5lIFpNX0lPQ1RMX0tFWQkJCQkweEE0CisjZGVmaW5lIFpNX0lPQ1RMX1JBVEUJCQkJMHhBNQorI2RlZmluZSBaTV9JT0NUTF9FTkNSWVBUSU9OX01PREUJCTB4QTYKKyNkZWZpbmUgWk1fSU9DVExfR0VUX1RYQ05UCQkJMHhBNworI2RlZmluZSBaTV9JT0NUTF9HRVRfREVBR0dfQ05UCQkJMHhBOAorI2RlZmluZSBaTV9JT0NUTF9EVVJBVElPTl9NT0RFCQkJMHhBOQorI2RlZmluZSBaTV9JT0NUTF9TRVRfQUVTX0tFWQkJCTB4QUEKKyNkZWZpbmUgWk1fSU9DVExfU0VUX0FFU19NT0RFCQkJMHhBQgorI2RlZmluZSBaTV9JT0NUTF9TSUdOQUxfU1RSRU5HVEgJCTB4QUMgLyogQ1dZYW5nKCspICovCisjZGVmaW5lIFpNX0lPQ1RMX1NJR05BTF9RVUFMSVRZCQkJMHhBRCAvKiBDV1lhbmcoKykgKi8KKyNkZWZpbmUgWk1fSU9DVExfU0VUX1BJQlNTX01PREUJCQkweEFFCisjZGVmaW5lCVpEQVBJT0NUTAkJCQlTSU9DREVWUFJJVkFURQogCiBzdHJ1Y3QgemRhcF9pb2N0bCB7Ci0JdW5zaWduZWQgc2hvcnQgY21kOyAgICAgICAgICAgICAgICAvKiBDb21tYW5kIHRvIHJ1biAqLwotCXVuc2lnbmVkIGludCAgIGFkZHI7ICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiB0aGUgZGF0YSBidWZmZXIgKi8KLQl1bnNpZ25lZCBpbnQgICB2YWx1ZTsgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlciAqLworCXVuc2lnbmVkIHNob3J0IGNtZDsJCQkvKiBDb21tYW5kIHRvIHJ1biAqLworCXVuc2lnbmVkIGludCAgIGFkZHI7CQkJLyogTGVuZ3RoIG9mIHRoZSBkYXRhIGJ1ZmZlciAqLworCXVuc2lnbmVkIGludCAgIHZhbHVlOwkJCS8qIFBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyICovCiAJdW5zaWduZWQgY2hhciBkYXRhWzB4MTAwXTsKIH07CiAKQEAgLTc5LDEzICs3OSwxMyBAQAogI2lmIDAKIAogI2RlZmluZSBTS0lQX0VMRU0geyBcCi0gICAgd2hpbGUoaXN4ZGlnaXQoKnApKSBcCi0gICAgICAgIHArKzsgXAorCXdoaWxlIChpc3hkaWdpdCgqcCkpIFwKKwkJcCsrOyBcCiB9CiAKICNkZWZpbmUgU0tJUF9ERUxJTUVURVIgeyBcCi0gICAgaWYoKnAgPT0gJzonIHx8ICpwID09ICcgJykgXAotICAgICAgICBwKys7IFwKKwlpZiAoKnAgPT0gJzonIHx8ICpwID09ICcgJykgXAorCQlwKys7IFwKIH0KIAogI2VuZGlmCkBAIC05NywzNjEgKzk3LDMwOCBAQAogCiBpbnQgc2V0X2lvY3RsKGludCBzb2NrLCBzdHJ1Y3QgaWZyZXEgKnJlcSkKIHsKLSAgICBpZiAoaW9jdGwoc29jaywgWkRBUElPQ1RMLCByZXEpIDwgMCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBpb2N0bChTSU9DR0lGTUFQKTogJXNcbiIsCi0gICAgICAgICAgICAgICAgcHJnbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KKwlpZiAoaW9jdGwoc29jaywgWkRBUElPQ1RMLCByZXEpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBpb2N0bChTSU9DR0lGTUFQKTogJXNcbiIsCisJCQlwcmduYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQogCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIAogaW50IHJlYWRfcmVnKGludCBzb2NrLCBzdHJ1Y3QgaWZyZXEgKnJlcSkKIHsKLSAgICBzdHJ1Y3QgemRhcF9pb2N0bCAqemRyZXEgPSAwOworCXN0cnVjdCB6ZGFwX2lvY3RsICp6ZHJlcSA9IDA7CiAKLSAgICBpZiAoIXNldF9pb2N0bChzb2NrLCByZXEpKQotICAgICAgICByZXR1cm4gLTE7CisJaWYgKCFzZXRfaW9jdGwoc29jaywgcmVxKSkKKwkJCXJldHVybiAtMTsKIAotICAgIC8vemRyZXEgPSAoc3RydWN0IHpkYXBfaW9jdGwgKilyZXEtPmlmcl9kYXRhOwotICAgIC8vcHJpbnRmKCAicmVnID0gJTR4LCB2YWx1ZSA9ICU0eFxuIiwgemRyZXEtPmFkZHIsIHpkcmVxLT52YWx1ZSk7CisJLyoKKwkgKiB6ZHJlcSA9IChzdHJ1Y3QgemRhcF9pb2N0bCAqKXJlcS0+aWZyX2RhdGE7CisJICogcHJpbnRmKCAicmVnID0gJTR4LCB2YWx1ZSA9ICU0eFxuIiwgemRyZXEtPmFkZHIsIHpkcmVxLT52YWx1ZSk7CisJICovCiAKLSAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogCiBpbnQgcmVhZF9tZW0oaW50IHNvY2ssIHN0cnVjdCBpZnJlcSAqcmVxKQogewotICAgIHN0cnVjdCB6ZGFwX2lvY3RsICp6ZHJlcSA9IDA7Ci0gICAgaW50IGk7CisJc3RydWN0IHpkYXBfaW9jdGwgKnpkcmVxID0gMDsKKwlpbnQgaTsKIAotICAgIGlmICghc2V0X2lvY3RsKHNvY2ssIHJlcSkpCi0gICAgICAgIHJldHVybiAtMTsKKwlpZiAoIXNldF9pb2N0bChzb2NrLCByZXEpKQorCQlyZXR1cm4gLTE7CiAKLSAgICAvKnpkcmVxID0gKHN0cnVjdCB6ZGFwX2lvY3RsICopcmVxLT5pZnJfZGF0YTsKLSAgICBwcmludGYoICJkdW1wIG1lbSBmcm9tICV4LCBsZW5ndGggPSAleFxuIiwgemRyZXEtPmFkZHIsIHpkcmVxLT52YWx1ZSk7CisJLyoKKwkgKiB6ZHJlcSA9IChzdHJ1Y3QgemRhcF9pb2N0bCAqKXJlcS0+aWZyX2RhdGE7CisJICogcHJpbnRmKCJkdW1wIG1lbSBmcm9tICV4LCBsZW5ndGggPSAleFxuIiwgemRyZXEtPmFkZHIsIHpkcmVxLT52YWx1ZSk7CisJICoKKwkgKiBmb3IgKGk9MDsgaTx6ZHJlcS0+dmFsdWU7IGkrKykgeworCSAqCXByaW50ZigiJTAyeCIsIHpkcmVxLT5kYXRhW2ldKTsKKwkgKglwcmludGYoIiAiKTsKKwkgKgorCSAqCWlmICgoaT4wKSAmJiAoKGkrMSklMTYgPT0gMCkpCisJICoJCXByaW50ZigiXG4iKTsKKwkgKiB9CisJICovCiAKLSAgICBmb3IgKGk9MDsgaTx6ZHJlcS0+dmFsdWU7IGkrKykgewotICAgICAgICBwcmludGYoIiUwMngiLCB6ZHJlcS0+ZGF0YVtpXSk7Ci0gICAgICAgIHByaW50ZigiICIpOwotCi0gICAgICAgIGlmICgoaT4wKSAmJiAoKGkrMSklMTYgPT0gMCkpCi0gICAgICAgICAgICBwcmludGYoIlxuIik7Ci0gICAgfSovCi0KLSAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7Ci0gICAgaW50IHNvY2s7Ci0gICAgaW50IGFkZHIsIHZhbHVlOwotICAgIHN0cnVjdCBpZnJlcSByZXE7Ci0gICAgY2hhciAqYWN0aW9uID0gTlVMTDsKLSAgICBzdHJ1Y3QgemRhcF9pb2N0bCB6ZHJlcTsKKwlpbnQgc29jazsKKwlpbnQgYWRkciwgdmFsdWU7CisJc3RydWN0IGlmcmVxIHJlcTsKKwljaGFyICphY3Rpb24gPSBOVUxMOworCXN0cnVjdCB6ZGFwX2lvY3RsIHpkcmVxOwogCi0gICAgcHJnbmFtZSA9IGFyZ3ZbMF07CisJcHJnbmFtZSA9IGFyZ3ZbMF07CiAKLSAgICBpZiAoYXJnYyA8IDMpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIiVzOiB1c2FnZSBpcyBcIiVzIDxpZm5hbWU+IDxvcGVyYXRpb24+IFs8YWRkcmVzcz5dIFs8dmFsdWU+XVwiXG4iLAotICAgICAgICAgICAgICAgIHByZ25hbWUsIHByZ25hbWUpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwidmFsaWQgb3BlcmF0aW9uOiByZWFkLCB3cml0ZSwgbWVtLCByZWcsXG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICAgICAgICAgICAgIDogdHhkLCByeGQsIHJtZW0sIHdtZW1cbiIpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgICAgICAgICAgICAgOiBkbWF0LCByZWd0LCB0ZXN0XG4iKTsKKwlpZiAoYXJnYyA8IDMpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogdXNhZ2UgaXMgXCIlcyA8aWZuYW1lPiA8b3BlcmF0aW9uPiIKKwkJCQkiWzxhZGRyZXNzPl0gWzx2YWx1ZT5dXCJcbiIsIHByZ25hbWUsIHByZ25hbWUpOworCQlmcHJpbnRmKHN0ZGVyciwgInZhbGlkIG9wZXJhdGlvbiA6IHJlYWQsIHdyaXRlLCBtZW0sIHJlZywgXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsICIJCTogdHhkLCByeGQsIHJtZW0sIHdtZW1cbiIpOworCQlmcHJpbnRmKHN0ZGVyciwgIgkJOiBkbWF0LCByZWd0LCB0ZXN0XG4iKTsKIAotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIHNjYW4sIENoYW5uZWwgU2NhblxuIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgcnRzIDxkZWNpbWFsPiwgU2V0IFJUUyBUaHJlc2hvbGRcbiIpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIGZyYWcgPGRlY2ltYWw+LCBTZXQgRnJhZ21lbnQgVGhyZXNob2xkXG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICByYXRlIDwwLTI4PiwgMDpBVVRPLCAxLTQ6Q0NLLCA1LTEyOk9GRE0sIDEzLTI4OkhUXG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBUQkQgbWl4IDwwIG9yIDE+LCBTZXQgMSB0byBlbmFibGUgbWl4ZWQgbW9kZVxuIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgZW5jLCA8MC0zPiwgMD0+T1BFTiwgMT0+V0VQNjQsIDI9PldFUDEyOCwgMz0+V0VQMjU2XG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBza2V5IDxrZXk+LCBTZXQgV0VQIGtleVxuIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgdHhjbnQsIEdldCBUeFEgQ250XG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBkYWdjbnQsIEdldCBEZWFnZ3JlZ2F0ZSBDbnRcbiIpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIGR1cm1vZGUgPG1vZGU+LCBTZXQgRHVyYXRpb24gTW9kZSAwPT5IVywgMT0+U1dcbiIpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIGFlc2tleSA8dXNlcj4gPGtleT5cbiIpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIGFlc21vZGUgPG1vZGU+XG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICB3bGFubW9kZSA8MCwxPiAwOlN0YXRpb24gbW9kZSwgMTpQSUJTUyBtb2RlXG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICB0YWwgPDAsMT4sIEdldCBDdXJyZW50IFRhbGx5IEluZm8sIDA9PnJlYWQsIDE9PnJlYWQgYW5kIHJlc2V0XG4iKTsKKwkJZnByaW50ZihzdGRlcnIsICIJc2NhbiwgQ2hhbm5lbCBTY2FuXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsICIJcnRzIDxkZWNpbWFsPiwgU2V0IFJUUyBUaHJlc2hvbGRcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwgIglmcmFnIDxkZWNpbWFsPiwgU2V0IEZyYWdtZW50IgorCQkJIiBUaHJlc2hvbGRcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwgIglyYXRlIDwwLTI4PiwgMDpBVVRPLCAxLTQ6Q0NLLCIKKwkJCSIgNS0xMjpPRkRNLCAxMy0yODpIVFxuIik7CisJCWZwcmludGYoc3RkZXJyLCAiCVRCRCBtaXggPDAgb3IgMT4sIFNldCAxIHRvIGVuYWJsZSIKKwkJCSIgbWl4ZWQgbW9kZVxuIik7CisJCWZwcmludGYoc3RkZXJyLCAiCWVuYywgPDAtMz4sIDA9Pk9QRU4sIDE9PldFUDY0LCAiCisJCQkiMj0+V0VQMTI4LCAzPT5XRVAyNTZcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwgIglza2V5IDxrZXk+LCBTZXQgV0VQIGtleVxuIik7CisJCWZwcmludGYoc3RkZXJyLCAiCXR4Y250LCBHZXQgVHhRIENudFxuIik7CisJCWZwcmludGYoc3RkZXJyLCAiCWRhZ2NudCwgR2V0IERlYWdncmVnYXRlIENudFxuIik7CisJCWZwcmludGYoc3RkZXJyLCAiCWR1cm1vZGUgPG1vZGU+LCBTZXQgRHVyYXRpb24gTW9kZSAiCisJCQkiMD0+SFcsIDE9PlNXXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsICIJYWVza2V5IDx1c2VyPiA8a2V5PlxuIik7CisJCWZwcmludGYoc3RkZXJyLCAiCWFlc21vZGUgPG1vZGU+XG4iKTsKKwkJZnByaW50ZihzdGRlcnIsICIJd2xhbm1vZGUgPDAsMT4gMDpTdGF0aW9uIG1vZGUsICIKKwkJCSIxOlBJQlNTIG1vZGVcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwgIgl0YWwgPDAsMT4sIEdldCBDdXJyZW50IFRhbGx5IEluZm8sICIKKwkJCSIwPT5yZWFkLCAxPT5yZWFkIGFuZCByZXNldFxuIik7CiAKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9CisJCWV4aXQoMSk7CisJfQogCi0gICAgc3RyY3B5KHJlcS5pZnJfbmFtZSwgYXJndlsxXSk7Ci0gICAgemRyZXEuYWRkciA9IDA7Ci0gICAgemRyZXEudmFsdWUgPSAwOworCXN0cmNweShyZXEuaWZyX25hbWUsIGFyZ3ZbMV0pOworCXpkcmVxLmFkZHIgPSAwOworCXpkcmVxLnZhbHVlID0gMDsKIAotICAgIC8qIGEgc2lsbHkgcmF3IHNvY2tldCBqdXN0IGZvciBpb2N0bCgpbGluZyBpdCAqLwotICAgIHNvY2sgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19SQVcsIElQUFJPVE9fUkFXKTsKLSAgICBpZiAoc29jayA8IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogc29ja2V0KCk6ICVzXG4iLCBhcmd2WzBdLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KKwkvKiBhIHNpbGx5IHJhdyBzb2NrZXQganVzdCBmb3IgaW9jdGwoKWxpbmcgaXQgKi8KKwlzb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfUkFXLCBJUFBST1RPX1JBVyk7CisJaWYgKHNvY2sgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IHNvY2tldCgpOiAlc1xuIiwgYXJndlswXSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZXhpdCgxKTsKKwl9CiAKLSAgICBpZiAoYXJnYyA+PSA0KQotICAgIHsKLSAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIleCIsICZhZGRyKTsKLSAgICB9CisJaWYgKGFyZ2MgPj0gNCkKKwkJc3NjYW5mKGFyZ3ZbM10sICIleCIsICZhZGRyKTsKIAotICAgIGlmIChhcmdjID49IDUpCi0gICAgewotICAgICAgICBzc2NhbmYoYXJndls0XSwgIiV4IiwgJnZhbHVlKTsKLSAgICB9CisJaWYgKGFyZ2MgPj0gNSkKKwkJc3NjYW5mKGFyZ3ZbNF0sICIleCIsICZ2YWx1ZSk7CiAKLSAgICB6ZHJlcS5hZGRyID0gYWRkcjsKLSAgICB6ZHJlcS52YWx1ZSA9IHZhbHVlOworCXpkcmVxLmFkZHIgPSBhZGRyOworCXpkcmVxLnZhbHVlID0gdmFsdWU7CiAKLSAgICBpZiAoIXN0cmNtcChhcmd2WzJdLCAicmVhZCIpKQotICAgIHsKLSAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfUkVHX1JFQUQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgIm1lbSIpKQotICAgIHsKLSAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfTUVNX0RVTVA7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgIndyaXRlIikpCi0gICAgewotICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9SRUdfV1JJVEU7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInJlZyIpKQotICAgIHsKLSAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfUkVHX0RVTVA7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInR4ZCIpKQotICAgIHsKLSAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfVFhEX0RVTVA7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInJ4ZCIpKQotICAgIHsKLSAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfUlhEX0RVTVA7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInJtZW0iKSkKLSAgICB7Ci0gICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX01FTV9SRUFEOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ3bWVtIikpCi0gICAgewotICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9NRU1fV1JJVEU7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImRtYXQiKSkKLSAgICB7Ci0gICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX0RNQV9URVNUOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJyZWd0IikpCi0gICAgewotICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9SRUdfVEVTVDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAidGVzdCIpKQotICAgIHsKLSAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfVEVTVDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAidGFsIikpCi0gICAgewotICAgICAgICBzc2NhbmYoYXJndlszXSwgIiVkIiwgJmFkZHIpOwotICAgICAgICB6ZHJlcS5hZGRyID0gYWRkcjsKLSAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfVEFMTFk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInJ0cyIpKQotICAgIHsKLSAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKLSAgICAgICAgemRyZXEuYWRkciA9IGFkZHI7Ci0gICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JUUzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAibWl4IikpCi0gICAgewotICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9NSVhfTU9ERTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAiZnJhZyIpKQotICAgIHsKLSAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKLSAgICAgICAgemRyZXEuYWRkciA9IGFkZHI7Ci0gICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX0ZSQUc7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInNjYW4iKSkKLSAgICB7Ci0gICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1NDQU47Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInNrZXkiKSkKLSAgICB7Ci0gICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX0tFWTsKKwlpZiAoIXN0cmNtcChhcmd2WzJdLCAicmVhZCIpKQorCQl6ZHJlcS5jbWQgPSBaTV9JT0NUTF9SRUdfUkVBRDsKKwllbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJtZW0iKSkKKwkJemRyZXEuY21kID0gWk1fSU9DVExfTUVNX0RVTVA7CisJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAid3JpdGUiKSkKKwkJemRyZXEuY21kID0gWk1fSU9DVExfUkVHX1dSSVRFOworCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInJlZyIpKQorCQl6ZHJlcS5jbWQgPSBaTV9JT0NUTF9SRUdfRFVNUDsKKwllbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ0eGQiKSkKKwkJemRyZXEuY21kID0gWk1fSU9DVExfVFhEX0RVTVA7CisJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAicnhkIikpCisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JYRF9EVU1QOworCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInJtZW0iKSkKKwkJemRyZXEuY21kID0gWk1fSU9DVExfTUVNX1JFQUQ7CisJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAid21lbSIpKQorCQl6ZHJlcS5jbWQgPSBaTV9JT0NUTF9NRU1fV1JJVEU7CisJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAiZG1hdCIpKQorCQl6ZHJlcS5jbWQgPSBaTV9JT0NUTF9ETUFfVEVTVDsKKwllbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJyZWd0IikpCisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JFR19URVNUOworCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInRlc3QiKSkKKwkJemRyZXEuY21kID0gWk1fSU9DVExfVEVTVDsKKwllbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ0YWwiKSkgeworCQlzc2NhbmYoYXJndlszXSwgIiVkIiwgJmFkZHIpOworCQl6ZHJlcS5hZGRyID0gYWRkcjsKKwkJemRyZXEuY21kID0gWk1fSU9DVExfVEFMTFk7CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJydHMiKSkgeworCQlzc2NhbmYoYXJndlszXSwgIiVkIiwgJmFkZHIpOworCQl6ZHJlcS5hZGRyID0gYWRkcjsKKwkJemRyZXEuY21kID0gWk1fSU9DVExfUlRTOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAibWl4IikpIHsKKwkJemRyZXEuY21kID0gWk1fSU9DVExfTUlYX01PREU7CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJmcmFnIikpIHsKKwkJc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKKwkJemRyZXEuYWRkciA9IGFkZHI7CisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX0ZSQUc7CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJzY2FuIikpIHsKKwkJemRyZXEuY21kID0gWk1fSU9DVExfU0NBTjsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInNrZXkiKSkgeworCQl6ZHJlcS5jbWQgPSBaTV9JT0NUTF9LRVk7CiAKLSAgICAgICAgaWYgKGFyZ2MgPj0gNCkKLSAgICAgICAgewotICAgICAgICAgICAgdW5zaWduZWQgY2hhciB0ZW1wWzI5XTsKLSAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgaW50IGtleUxlbjsKLSAgICAgICAgICAgIGludCBlbmNUeXBlOworCQlpZiAoYXJnYyA+PSA0KSB7CisJCQl1bnNpZ25lZCBjaGFyIHRlbXBbMjldOworCQkJaW50IGk7CisJCQlpbnQga2V5TGVuOworCQkJaW50IGVuY1R5cGU7CiAKLSAgICAgICAgICAgIGtleUxlbiA9IHN0cmxlbihhcmd2WzNdKTsKKwkJCWtleUxlbiA9IHN0cmxlbihhcmd2WzNdKTsKIAotICAgICAgICAgICAgaWYgKGtleUxlbiA9PSAxMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzc2NhbmYoYXJndlszXSwgIiUwMnglMDJ4JTAyeCUwMnglMDJ4IiwgJnRlbXBbMF0sICZ0ZW1wWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBbMl0sICZ0ZW1wWzNdLCAmdGVtcFs0XSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChrZXlMZW4gPT0gMjYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wWzBdLCAmdGVtcFsxXSwgJnRlbXBbMl0sICZ0ZW1wWzNdLCAmdGVtcFs0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wWzVdLCAmdGVtcFs2XSwgJnRlbXBbN10sICZ0ZW1wWzhdLCAmdGVtcFs5XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFsxMF0sICZ0ZW1wWzExXSwgJnRlbXBbMTJdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGtleUxlbiA9PSA1OCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzc2NhbmYoYXJndlszXSwgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wWzBdLCAmdGVtcFsxXSwgJnRlbXBbMl0sICZ0ZW1wWzNdLCAmdGVtcFs0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wWzVdLCAmdGVtcFs2XSwgJnRlbXBbN10sICZ0ZW1wWzhdLCAmdGVtcFs5XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wWzEwXSwgJnRlbXBbMTFdLCAmdGVtcFsxMl0sICZ0ZW1wWzEzXSwgJnRlbXBbMTRdLAotICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBbMTVdLCAmdGVtcFsxNl0sICZ0ZW1wWzE3XSwgJnRlbXBbMThdLCAmdGVtcFsxOV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFsyMF0sICZ0ZW1wWzIxXSwgJnRlbXBbMjJdLCAmdGVtcFsyM10sICZ0ZW1wWzI0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wWzI1XSwgJnRlbXBbMjZdLCAmdGVtcFsyN10sICZ0ZW1wWzI4XSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGtleSBsZW5ndGhcbiIpOwotICAgICAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB6ZHJlcS5hZGRyID0ga2V5TGVuLzI7CisJCQlpZiAoa2V5TGVuID09IDEwKQorCQkJCXNzY2FuZihhcmd2WzNdLCAiJTAyeCUwMnglMDJ4JTAyeCUwMngiLAorCQkJCQkmdGVtcFswXSwgJnRlbXBbMV0sICZ0ZW1wWzJdLCAmdGVtcFszXSwKKwkJCQkJJnRlbXBbNF0pOworCQkJZWxzZSBpZiAoa2V5TGVuID09IDI2KQorCQkJCXNzY2FuZihhcmd2WzNdLCAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IgorCQkJCQkiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisJCQkJCSZ0ZW1wWzBdLCAmdGVtcFsxXSwgJnRlbXBbMl0sICZ0ZW1wWzNdLAorCQkJCQkmdGVtcFs0XSwgJnRlbXBbNV0sICZ0ZW1wWzZdLCAmdGVtcFs3XSwKKwkJCQkJJnRlbXBbOF0sICZ0ZW1wWzldLCAmdGVtcFsxMF0sCisJCQkJCSZ0ZW1wWzExXSwgJnRlbXBbMTJdKTsKKwkJCWVsc2UgaWYgKGtleUxlbiA9PSA1OCkKKwkJCQlzc2NhbmYoYXJndlszXSwgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIKKwkJCQkJIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIKKwkJCQkJIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIKKwkJCQkJIiUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKKwkJCQkJJnRlbXBbMF0sICZ0ZW1wWzFdLCAmdGVtcFsyXSwgJnRlbXBbM10sCisJCQkJCSZ0ZW1wWzRdLCAmdGVtcFs1XSwgJnRlbXBbNl0sICZ0ZW1wWzddLAorCQkJCQkmdGVtcFs4XSwgJnRlbXBbOV0sICZ0ZW1wWzEwXSwKKwkJCQkJJnRlbXBbMTFdLCAmdGVtcFsxMl0sICZ0ZW1wWzEzXSwKKwkJCQkJJnRlbXBbMTRdLCAmdGVtcFsxNV0sICZ0ZW1wWzE2XSwKKwkJCQkJJnRlbXBbMTddLCAmdGVtcFsxOF0sICZ0ZW1wWzE5XSwKKwkJCQkJJnRlbXBbMjBdLCAmdGVtcFsyMV0sICZ0ZW1wWzIyXSwKKwkJCQkJJnRlbXBbMjNdLCAmdGVtcFsyNF0sICZ0ZW1wWzI1XSwKKwkJCQkJJnRlbXBbMjZdLCAmdGVtcFsyN10sICZ0ZW1wWzI4XSk7CisJCQllbHNlIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQga2V5IGxlbmd0aFxuIik7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCXpkcmVxLmFkZHIgPSBrZXlMZW4vMjsKIAotICAgICAgICAgICAgZm9yKGk9MDsgaTx6ZHJlcS5hZGRyOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgemRyZXEuZGF0YVtpXSA9IHRlbXBbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGYoIkVycm9yIDogS2V5IHJlcXVpcmVkIVxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAicmF0ZSIpKQotICAgIHsKLSAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKKwkJCWZvciAoaSA9IDA7IGkgPCB6ZHJlcS5hZGRyOyBpKyspCisJCQkJemRyZXEuZGF0YVtpXSA9IHRlbXBbaV07CisJCX0gZWxzZSB7CisJCQlwcmludGYoIkVycm9yIDogS2V5IHJlcXVpcmVkIVxuIik7CisJCX0KKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInJhdGUiKSkgeworCQlzc2NhbmYoYXJndlszXSwgIiVkIiwgJmFkZHIpOwogCi0gICAgICAgIGlmIChhZGRyID4gMjgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCByYXRlLCByYW5nZTowfjI4XG4iKTsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgemRyZXEuYWRkciA9IGFkZHI7Ci0gICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JBVEU7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImVuYyIpKQotICAgIHsKLSAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKKwkJaWYgKGFkZHIgPiAyOCkgeworCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHJhdGUsIHJhbmdlOjB+MjhcbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCQl6ZHJlcS5hZGRyID0gYWRkcjsKKwkJemRyZXEuY21kID0gWk1fSU9DVExfUkFURTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImVuYyIpKSB7CisJCXNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CiAKLSAgICAgICAgaWYgKGFkZHIgPiAzKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgZW5jcnlwdGlvbiBtb2RlLCByYW5nZTowfjNcbiIpOwotICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQorCQlpZiAoYWRkciA+IDMpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBlbmNyeXB0aW9uIG1vZGUsIHJhbmdlOjB+M1xuIik7CisJCQlleGl0KDEpOworCQl9CiAKLSAgICAgICAgaWYgKGFkZHIgPT0gMikKLSAgICAgICAgewotICAgICAgICAgICAgYWRkciA9IDU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYWRkciA9PSAzKQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGRyID0gNjsKLSAgICAgICAgfQorCQlpZiAoYWRkciA9PSAyKQorCQkJYWRkciA9IDU7CisJCWVsc2UgaWYgKGFkZHIgPT0gMykKKwkJCWFkZHIgPSA2OwogCi0gICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOwotICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9FTkNSWVBUSU9OX01PREU7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInR4Y250IikpCi0gICAgewotICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9HRVRfVFhDTlQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImRhZ2NudCIpKQotICAgIHsKLSAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKKwkJemRyZXEuYWRkciA9IGFkZHI7CisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX0VOQ1JZUFRJT05fTU9ERTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInR4Y250IikpIHsKKwkJemRyZXEuY21kID0gWk1fSU9DVExfR0VUX1RYQ05UOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAiZGFnY250IikpIHsKKwkJc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKIAotICAgICAgICBpZiAoYWRkciAhPSAwICYmIGFkZHIgIT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJUaGUgdmFsdWUgc2hvdWxkIGJlIDAgb3IgMVxuIik7Ci0gICAgICAgICAgICBleGl0KDApOwotICAgICAgICB9CisJCWlmIChhZGRyICE9IDAgJiYgYWRkciAhPSAxKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlRoZSB2YWx1ZSBzaG91bGQgYmUgMCBvciAxXG4iKTsKKwkJCWV4aXQoMCk7CisJCX0KIAotICAgICAgICB6ZHJlcS5hZGRyID0gYWRkcjsKLSAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfR0VUX0RFQUdHX0NOVDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAiZHVybW9kZSIpKQotICAgIHsKLSAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKKwkJemRyZXEuYWRkciA9IGFkZHI7CisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX0dFVF9ERUFHR19DTlQ7CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJkdXJtb2RlIikpCXsKKwkJc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKIAotICAgICAgICBpZiAoYWRkciAhPSAwICYmIGFkZHIgIT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJUaGUgRHVyYXRpb24gbW9kZSBzaG91bGQgYmUgMCBvciAxXG4iKTsKLSAgICAgICAgICAgIGV4aXQoMCk7Ci0gICAgICAgIH0KKwkJaWYgKGFkZHIgIT0gMCAmJiBhZGRyICE9IDEpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiVGhlIER1cmF0aW9uIG1vZGUgc2hvdWxkIGJlIDAgb3IgMVxuIik7CisJCQlleGl0KDApOworCQl9CiAKLSAgICAgICAgemRyZXEuYWRkciA9IGFkZHI7Ci0gICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX0RVUkFUSU9OX01PREU7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImFlc2tleSIpKQotICAgIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciB0ZW1wWzE2XTsKLSAgICAgICAgaW50IGk7CisJCXpkcmVxLmFkZHIgPSBhZGRyOworCQl6ZHJlcS5jbWQgPSBaTV9JT0NUTF9EVVJBVElPTl9NT0RFOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAiYWVza2V5IikpIHsKKwkJdW5zaWduZWQgY2hhciB0ZW1wWzE2XTsKKwkJaW50IGk7CiAKLSAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKKwkJc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKIAotICAgICAgICBzc2NhbmYoYXJndls0XSwgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLCAmdGVtcFswXSwgJnRlbXBbMV0sICZ0ZW1wWzJdLCAmdGVtcFszXSwgJnRlbXBbNF0sICZ0ZW1wWzVdLCAmdGVtcFs2XSwgJnRlbXBbN10sICZ0ZW1wWzhdLCAmdGVtcFs5XSwgJnRlbXBbMTBdLCAmdGVtcFsxMV0sICZ0ZW1wWzEyXSwgJnRlbXBbMTNdLCAmdGVtcFsxNF0sICZ0ZW1wWzE1XSk7CisJCXNzY2FuZihhcmd2WzRdLCAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIKKwkJCSIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLCAmdGVtcFswXSwgJnRlbXBbMV0sCisJCQkmdGVtcFsyXSwgJnRlbXBbM10sICZ0ZW1wWzRdLCAmdGVtcFs1XSwgJnRlbXBbNl0sCisJCQkmdGVtcFs3XSwgJnRlbXBbOF0sICZ0ZW1wWzldLCAmdGVtcFsxMF0sICZ0ZW1wWzExXSwKKwkJCSZ0ZW1wWzEyXSwgJnRlbXBbMTNdLCAmdGVtcFsxNF0sICZ0ZW1wWzE1XSk7CiAKLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgemRyZXEuZGF0YVtpXSA9IHRlbXBbaV07Ci0gICAgICAgIH0KKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCQl6ZHJlcS5kYXRhW2ldID0gdGVtcFtpXTsKIAotICAgICAgICB6ZHJlcS5hZGRyID0gYWRkcjsKLSAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfU0VUX0FFU19LRVk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImFlc21vZGUiKSkKLSAgICB7Ci0gICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisJCXpkcmVxLmFkZHIgPSBhZGRyOworCQl6ZHJlcS5jbWQgPSBaTV9JT0NUTF9TRVRfQUVTX0tFWTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImFlc21vZGUiKSkgeworCQlzc2NhbmYoYXJndlszXSwgIiVkIiwgJmFkZHIpOwogCi0gICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOwotICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9TRVRfQUVTX01PREU7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgIndsYW5tb2RlIikpCi0gICAgewotICAgICAgICBzc2NhbmYoYXJndlszXSwgIiVkIiwgJmFkZHIpOworCQl6ZHJlcS5hZGRyID0gYWRkcjsKKwkJemRyZXEuY21kID0gWk1fSU9DVExfU0VUX0FFU19NT0RFOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAid2xhbm1vZGUiKSkgeworCQlzc2NhbmYoYXJndlszXSwgIiVkIiwgJmFkZHIpOwogCi0gICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOwotICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9TRVRfUElCU1NfTU9ERTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQkgICAgZnByaW50ZihzdGRlcnIsICJlcnJvciBhY3Rpb25cbiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KKwkJemRyZXEuYWRkciA9IGFkZHI7CisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX1NFVF9QSUJTU19NT0RFOworCX0gZWxzZSAJeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yIGFjdGlvblxuIik7CisJCWV4aXQoMSk7CisJfQogCi0gICAgcmVxLmlmcl9kYXRhID0gKGNoYXIgKikmemRyZXE7Ci0gICAgc2V0X2lvY3RsKHNvY2ssICZyZXEpOworCXJlcS5pZnJfZGF0YSA9IChjaGFyICopJnpkcmVxOworCXNldF9pb2N0bChzb2NrLCAmcmVxKTsKIAogZmFpbDoKLSAgICBleGl0KDApOworCWV4aXQoMCk7CiB9CiAKIHVuc2lnbmVkIGNoYXIgYXNjdG9oZXgoY2hhciAqc3RyKQogewotICAgIHVuc2lnbmVkIGNoYXIgdmFsdWU7CisJdW5zaWduZWQgY2hhciB2YWx1ZTsKIAotICAgIHZhbHVlID0gaGV4KCpzdHIpICYgMHgwZjsKLSAgICB2YWx1ZSA9IHZhbHVlIDw8IDQ7Ci0gICAgc3RyKys7Ci0gICAgdmFsdWUgfD0gaGV4KCpzdHIpICYgMHgwZjsKKwl2YWx1ZSA9IGhleCgqc3RyKSAmIDB4MGY7CisJdmFsdWUgPSB2YWx1ZSA8PCA0OworCXN0cisrOworCXZhbHVlIHw9IGhleCgqc3RyKSAmIDB4MGY7CiAKLSAgICByZXR1cm4gdmFsdWU7CisJcmV0dXJuIHZhbHVlOwogfQogCiBjaGFyIGhleChjaGFyIHYpCiB7Ci0gICAgaWYoaXNkaWdpdCh2KSkKLSAgICAgICAgcmV0dXJuIHYgLSAnMCc7Ci0gICAgZWxzZSBpZihpc3hkaWdpdCh2KSkKLSAgICAgICAgcmV0dXJuICh0b2xvd2VyKHYpIC0gJ2EnICsgMTApOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIDA7CisJaWYgKGlzZGlnaXQodikpCisJCXJldHVybiB2IC0gJzAnOworCWVsc2UgaWYgKGlzeGRpZ2l0KHYpKQorCQlyZXR1cm4gdG9sb3dlcih2KSAtICdhJyArIDEwOworCWVsc2UKKwkJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2F0aHJfY29tbW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9hdGhyX2NvbW1vbi5oCmluZGV4IDYyMGY3OGEuLjNlMzJmNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2F0aHJfY29tbW9uLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvYXRocl9jb21tb24uaApAQCAtNjgsNyArNjgsNyBAQAogCiAjZGVmaW5lIFpNX1dBUElfS0VZX1NJWkUgICAgICAgICAgICAgICAgMzIKICNkZWZpbmUgWk1fV0FQSV9JVl9MRU4gICAgICAgICAgICAgICAgICAxNgotI2VuZGlmIC8vWk1fRU5BTEJFX1dBUEkKKyNlbmRpZiAvKiBaTV9FTkFMQkVfV0FQSSAqLwogLyogc3RydWN0dXJlIGRlZmluaXRpb24gKi8KIAogc3RydWN0IGF0aHJfd2xhbl9wYXJhbSB7CkBAIC0xMjMsNyArMTIzLDcgQEAKIAkJCXU4IGtleVtaTV9XQVBJX0tFWV9TSVpFXTsKIAkJfSBjcnlwdDsKIAkJc3RydWN0IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHU4IHdhcGlfcG9saWN5OworCQkJdTggd2FwaV9wb2xpY3k7CiAJCX0gaW5mbzsKIAl9IHU7CiB9OwpAQCAtMTMyLDEwICsxMzIsMTAgQEAKIHsKIAl1MTYJbXNnX3R5cGU7CiAJdTE2CWRhdGFsZW47Ci0gICAgCXU4CXN0YV9tYWNbRVRIX0FMRU5dOworCXU4CXN0YV9tYWNbRVRIX0FMRU5dOwogCXU4CXJlc2VydmVfZGF0YVsyXTsKLSAgICAJdTgJZ3NuW1pNX1dBUElfSVZfTEVOXTsKKwl1OAlnc25bWk1fV0FQSV9JVl9MRU5dOwogCXU4CXdpZVsyNTZdOwogfTsKLSNlbmRpZiAvL1pNX0VOQUxCRV9XQVBJCisjZW5kaWYgLyogWk1fRU5BTEJFX1dBUEkgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvb2FsX2R0LmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9vYWxfZHQuaAppbmRleCBlODJiOTc3Li5mYjZkMTFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9vYWxfZHQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9vYWxfZHQuaApAQCAtMzksMTUgKzM5LDE1IEBACiB0eXBlZGVmICAgICBzaG9ydCAgICAgICAgICAgICAgIHMxNl90OwogdHlwZWRlZiAgICAgY2hhciAgICAgICAgICAgICAgICBzOF90OwogCi0jaWZuZGVmICAgICBUUlVFCi0jZGVmaW5lICAgICBUUlVFICAgICAgICAgICAgICAgICgxPT0xKQorI2lmbmRlZiBUUlVFCisjZGVmaW5lICAgICBUUlVFICAgICAgICAgICAgICAgICgxID09IDEpCiAjZW5kaWYKIAotI2lmbmRlZiAgICAgRkFMU0UKLSNkZWZpbmUgICAgIEZBTFNFICAgICAgICAgICAgICAgKDE9PTApCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lICAgICBGQUxTRSAgICAgICAgICAgICAgICgxID09IDApCiAjZW5kaWYKIAotI2lmbmRlZiAgICAgTlVMTAorI2lmbmRlZglOVUxMCiAjZGVmaW5lICAgICBOVUxMICAgICAgICAgICAgICAgIDAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9vYWxfbWFyYy5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvb2FsX21hcmMuaAppbmRleCAyMDYxMTE2Li5lN2E5MDgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9vYWxfbWFyYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL29hbF9tYXJjLmgKQEAgLTM0LDE3ICszNCwxOSBAQAogLyoqKioqIENyaXRpY2FsIHNlY3Rpb24gKioqKiovCiAvKiBEZWNsYXJlIGZvciBjcml0aWNhbCBzZWN0aW9uICovCiAjaWZuZGVmIFpNX0hBTFBMVVNfTE9DSwotI2RlZmluZSB6bXdfZ2V0X3dsYW5fZGV2KGRldikgICAgc3RydWN0IHpzV2xhbkRldiAqd2QgPSAoc3RydWN0IHpzV2xhbkRldiopICgoKChzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUqKWRldi0+cHJpdiktPndkKSkKKyNkZWZpbmUgem13X2dldF93bGFuX2RldihkZXYpIHN0cnVjdCB6c1dsYW5EZXYgKndkID0gKHN0cnVjdCB6c1dsYW5EZXYgKikgXAorCSgoKChzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKilkZXYtPnByaXYpLT53ZCkpCiAKICNkZWZpbmUgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKSB1bnNpZ25lZCBsb25nIGlycUZsYWc7CiAKIC8qIEVudGVyIGNyaXRpY2FsIHNlY3Rpb24gKi8KLSNkZWZpbmUgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KSBcCi0gICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCYoKChzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKikoZGV2LT5wcml2KSktPmNzX2xvY2spLCBpcnFGbGFnKTsKKyNkZWZpbmUgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KSBzcGluX2xvY2tfaXJxc2F2ZSgJXAorCSYoKChzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKikoZGV2LT5wcml2KSktPmNzX2xvY2spLCBpcnFGbGFnKTsKIAogLyogbGVhdmUgY3JpdGljYWwgc2VjdGlvbiAqLwogI2RlZmluZSB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpIFwKLSAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKCgoc3RydWN0IHVzYmRydl9wcml2YXRlICopKGRldi0+cHJpdikpLT5jc19sb2NrKSwgaXJxRmxhZyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKCgoc3RydWN0IHVzYmRydl9wcml2YXRlICopCVwKKwkJCShkZXYtPnByaXYpKS0+Y3NfbG9jayksIGlycUZsYWcpOwogI2Vsc2UKICNkZWZpbmUgem13X2dldF93bGFuX2RldihkZXYpICAgIHN0cnVjdCB6c1dsYW5EZXYgKndkID0gemZ3R2V0V2xhbkRldihkZXYpOwogCkBAIC01MiwzMSArNTQsMjkgQEAKICNkZWZpbmUgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKQogCiAvKiBFbnRlciBjcml0aWNhbCBzZWN0aW9uICovCi0jZGVmaW5lIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldikgXAotICAgICAgICB6ZndFbnRlckNyaXRpY2FsU2VjdGlvbihkZXYpOworI2RlZmluZSB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpIHpmd0VudGVyQ3JpdGljYWxTZWN0aW9uKGRldik7CiAKIC8qIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24gKi8KLSNkZWZpbmUgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KSBcCi0gICAgICAgIHpmd0xlYXZlQ3JpdGljYWxTZWN0aW9uKGRldik7CisjZGVmaW5lIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldikgemZ3TGVhdmVDcml0aWNhbFNlY3Rpb24oZGV2KTsKICNlbmRpZgogCiAvKioqKiogQnl0ZSBvcmRlciBjb252ZXJ0aW5nICoqKioqLwogI2lmZGVmIFpNX0NPTkZJR19CSUdfRU5ESUFOCi0jZGVmaW5lIHptd19jcHVfdG9fbGUzMih2KSAgICAoKCh2ICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodiAmIDB4MDBmZjAwMDApID4+IDgpICB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHYgJiAweDAwMDBmZjAwKSA8PCA4KSAgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2ICYgMHgwMDAwMDBmZikgPDwgMjQpKQorI2RlZmluZSB6bXdfY3B1X3RvX2xlMzIodikgICAgCSgoKHYgJiAweGZmMDAwMDAwKSA+PiAyNCkgfCAJXAorCQkJCSgodiAmIDB4MDBmZjAwMDApID4+IDgpICB8IAlcCisJCQkJKCh2ICYgMHgwMDAwZmYwMCkgPDwgOCkgIHwgCVwKKwkJCQkoKHYgJiAweDAwMDAwMGZmKSA8PCAyNCkpCiAKLSNkZWZpbmUgem13X2xlMzJfdG9fY3B1KHYpICAgICgoKHYgJiAweGZmMDAwMDAwKSA+PiAyNCkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2ICYgMHgwMGZmMDAwMCkgPj4gOCkgIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodiAmIDB4MDAwMGZmMDApIDw8IDgpICB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHYgJiAweDAwMDAwMGZmKSA8PCAyNCkpCisjZGVmaW5lIHptd19sZTMyX3RvX2NwdSh2KSAgICAoKCh2ICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgCVwKKwkJCQkoKHYgJiAweDAwZmYwMDAwKSA+PiA4KSB8IAlcCisJCQkJKCh2ICYgMHgwMDAwZmYwMCkgPDwgOCkgfCAJXAorCQkJCSgodiAmIDB4MDAwMDAwZmYpIDw8IDI0KSkKIAogI2RlZmluZSB6bXdfY3B1X3RvX2xlMTYodikgICAgKCgodiAmIDB4ZmYwMCkgPj4gOCkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2ICYgMHgwMGZmKSA8PCA4KSkKKwkJCQkoKHYgJiAweDAwZmYpIDw8IDgpKQogCiAjZGVmaW5lIHptd19sZTE2X3RvX2NwdSh2KSAgICAoKCh2ICYgMHhmZjAwKSA+PiA4KSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHYgJiAweDAwZmYpIDw8IDgpKQorCQkJCSgodiAmIDB4MDBmZikgPDwgOCkpCiAjZWxzZQogI2RlZmluZSB6bXdfY3B1X3RvX2xlMzIodikgICAgKHYpCiAjZGVmaW5lIHptd19sZTMyX3RvX2NwdSh2KSAgICAodikKQEAgLTg4LDMzICs4OCw0MSBAQAogLyogQ2FsbGVkIHRvIHJlYWQvd3JpdGUgYnVmZmVyICovCiAjaWZuZGVmIFpNX0hBTFBMVVNfTE9DSwogCi0jZGVmaW5lIHptd19idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCkgKih1OF90KikoKHU4X3QqKWJ1Zi0+ZGF0YStvZmZzZXQpCi0jZGVmaW5lIHptd19idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCkgem13X2NwdV90b19sZTE2KCoodTE2X3QqKSgodThfdCopYnVmLT5kYXRhK29mZnNldCkpCi0jZGVmaW5lIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKSAqKHU4X3QqKSgodThfdCopYnVmLT5kYXRhK29mZnNldCkgPSB2YWx1ZQotI2RlZmluZSB6bXdfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkgKih1MTZfdCopKCh1OF90KilidWYtPmRhdGErb2Zmc2V0KSA9IHptd19jcHVfdG9fbGUxNih2YWx1ZSkKLSNkZWZpbmUgem13X2J1Zl9nZXRfYnVmZmVyKGRldiwgYnVmKSAodThfdCopKGJ1Zi0+ZGF0YSkKKyNkZWZpbmUgem13X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KSAoKih1OF90ICopKCh1OF90ICopYnVmLT5kYXRhK29mZnNldCkpCisjZGVmaW5lIHptd19idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCkgem13X2NwdV90b19sZTE2KCoodTE2X3QgKikJXAorCQkJCQkoKHU4X3QgKilidWYtPmRhdGErb2Zmc2V0KSkKKyNkZWZpbmUgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpICgqKHU4X3QgKikJCVwKKwkJCQkJKCh1OF90ICopYnVmLT5kYXRhK29mZnNldCkgPSB2YWx1ZSkKKyNkZWZpbmUgem13X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpICgqKHUxNl90ICopCQlcCisJCQkoKHU4X3QgKilidWYtPmRhdGErb2Zmc2V0KSA9IHptd19jcHVfdG9fbGUxNih2YWx1ZSkpCisjZGVmaW5lIHptd19idWZfZ2V0X2J1ZmZlcihkZXYsIGJ1ZikgKHU4X3QgKikoYnVmLT5kYXRhKQogCiAjZWxzZQogCiAjZGVmaW5lIHptd19idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCkgemZ3QnVmUmVhZEJ5dGUoZGV2LCBidWYsIG9mZnNldCkKICNkZWZpbmUgem13X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KSB6ZndCdWZSZWFkSGFsZldvcmQoZGV2LCBidWYsIG9mZnNldCkKLSNkZWZpbmUgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpIHpmd0J1ZldyaXRlQnl0ZShkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkKLSNkZWZpbmUgem13X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpIHpmd0J1ZldyaXRlSGFsZldvcmQoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpCisjZGVmaW5lIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKSAJCQlcCisJCQl6ZndCdWZXcml0ZUJ5dGUoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpCisjZGVmaW5lIHptd19idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKQkJCQlcCisJCQl6ZndCdWZXcml0ZUhhbGZXb3JkKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKQogI2RlZmluZSB6bXdfYnVmX2dldF9idWZmZXIoZGV2LCBidWYpIHpmd0dldEJ1ZmZlcihkZXYsIGJ1ZikKIAogI2VuZGlmCiAKIC8qKioqKiBEZWJ1ZyBtZXNzYWdlICoqKioqLwogI2lmIDAKLSNkZWZpbmUgem1fZGVidWdfbXNnMChtc2cpIHByaW50aygiJXM6JXNcbiIsIF9fZnVuY19fLCBtc2cpOwotI2RlZmluZSB6bV9kZWJ1Z19tc2cxKG1zZywgdmFsKSBwcmludGsoIiVzOiVzJWxkXG4iLCBfX2Z1bmNfXywgXAotICAgICAgICBtc2csICh1MzJfdCl2YWwpOwotI2RlZmluZSB6bV9kZWJ1Z19tc2cyKG1zZywgdmFsKSBwcmludGsoIiVzOiVzJWx4aFxuIiwgX19mdW5jX18sIFwKLSAgICAgICAgbXNnLCAodTMyX3QpdmFsKTsKLSNkZWZpbmUgem1fZGVidWdfbXNnX3MobXNnLCB2YWwpIHByaW50aygiJXM6JXMlc1xuIiwgX19mdW5jX18sIFwKLSAgICAgICAgbXNnLCB2YWwpOwotI2RlZmluZSB6bV9kZWJ1Z19tc2dfcChtc2csIHZhbDEsIHZhbDIpIHByaW50aygiJXM6JXMlMDFsZC4lMDJsZFxuIiwgX19mdW5jX18sIFwKLSAgICAgICAgbXNnLCAodmFsMS92YWwyKSwgKCgodmFsMSoxMDApL3ZhbDIpJTEwMCkpOworI2RlZmluZSB6bV9kZWJ1Z19tc2cwKG1zZykgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiVzXG4iLCBfX2Z1bmNfXywgbXNnKTsKKyNkZWZpbmUgem1fZGVidWdfbXNnMShtc2csIHZhbCkgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiVzJWxkXG4iLCBfX2Z1bmNfXywgXAorCW1zZywgKHUzMl90KXZhbCk7CisjZGVmaW5lIHptX2RlYnVnX21zZzIobXNnLCB2YWwpIHByaW50ayhLRVJOX0RFQlVHICIlczolcyVseGhcbiIsIF9fZnVuY19fLCBcCisJbXNnLCAodTMyX3QpdmFsKTsKKyNkZWZpbmUgem1fZGVidWdfbXNnX3MobXNnLCB2YWwpIHByaW50ayhLRVJOX0RFQlVHICIlczolcyVzXG4iLCBfX2Z1bmNfXywgXAorCW1zZywgdmFsKTsKKyNkZWZpbmUgem1fZGVidWdfbXNnX3AobXNnLCB2YWwxLCB2YWwyKSBkbyB7IAkJCVwKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczolcyUwMWxkLiUwMmxkXG4iLAlcCisJCQkJCQlfX2Z1bmNfXywgCVwKKwkJCW1zZywgKHZhbDEvdmFsMiksICgoKHZhbDEqMTAwKS92YWwyKSUxMDApKTsKKwkJCX0gd2hpbGUgKDApCiAjZGVmaW5lIHptX2RiZyhTKSBwcmludGsgUwogI2Vsc2UKICNkZWZpbmUgem1fZGVidWdfbXNnMChtc2cpCkBAIC0xMjUsMTAgKzEzMywxMCBAQAogI2RlZmluZSB6bV9kYmcoUykKICNlbmRpZgogCi0jZGVmaW5lIHptX2Fzc2VydChleHByKSBpZighKGV4cHIpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwcmludGsoICJBdGhlb3JzIEFzc2VydGlvbiBmYWlsZWQhICVzLCVzLCVzLGxpbmU9JWRcbiIsICAgXAotICAgICAgICAjZXhwcixfX0ZJTEVfXyxfX2Z1bmNfXyxfX0xJTkVfXyk7ICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9CisjZGVmaW5lIHptX2Fzc2VydChleHByKSBpZiAoIShleHByKSkgewkJCQkJIFwKKwlwcmludGsoS0VSTl9FUlIgIkF0aGVvcnMgQXNzZXJ0aW9uIGZhaWxlZCEgJXMsICVzLCAlcyxsaW5lPSVkXG4iLFwKKwkJI2V4cHIsIF9fRklMRV9fLCBfX2Z1bmNfXywgX19MSU5FX18pOwkJCSBcCisJfQogCiAjZGVmaW5lIERiZ1ByaW50IHByaW50awogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy91c2JkcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3VzYmRydi5jCmluZGV4IDQ4YWEzMGEuLmIwYWRiYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3VzYmRydi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3VzYmRydi5jCkBAIC0xMTEsNyArMTExLDcgQEAKIAogLyogRGVmaW5pdGlvbiBvZiBXaXJlbGVzcyBFeHRlbnNpb24gKi8KIAotLy93aXJlbGVzcyBleHRlbnNpb24gaGVscGVyIGZ1bmN0aW9ucworLyogd2lyZWxlc3MgZXh0ZW5zaW9uIGhlbHBlciBmdW5jdGlvbnMgKi8KIGV4dGVybiBpbnQgdXNiZHJ2X2lvY3RsX3NldGVzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wb2ludCAqZXJxKTsKIGV4dGVybiBpbnQgdXNiZHJ2X2lvY3RsX3NldHJ0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcGFyYW0gKnJycSk7CiAvKiBXaXJlbGVzcyBFeHRlbnNpb24gSGFuZGxlciBmdW5jdGlvbnMgKi8KQEAgLTI4Miw4ICsyODIsOCBAQAogfTsKIAogLyogV0RTICovCi0vL3N0cnVjdCB6c1dkc1N0cnVjdCB3ZHNbWk1fV0RTX1BPUlRfTlVNQkVSXTsKLS8vdm9pZCB6ZkluaXRXZHNTdHJ1Y3Qodm9pZCk7CisvKiBzdHJ1Y3QgenNXZHNTdHJ1Y3Qgd2RzW1pNX1dEU19QT1JUX05VTUJFUl07ICovCisvKiB2b2lkIHpmSW5pdFdkc1N0cnVjdCh2b2lkKTsJKi8KIAogLyogVkFQICovCiBzdHJ1Y3QgenNWYXBTdHJ1Y3QgdmFwW1pNX1ZBUF9QT1JUX05VTUJFUl07CkBAIC0zMTQsMTMgKzMxNCwxMSBAQAogICAgICAgICByZXR1cm4gSVJRX05PTkU7CiAKICAgICAvKiB0aGUgZGV2aWNlIGlzIGNsb3NlZCwgZG9uJ3QgY29udGludWUgb3IgZWxzZSBiYWQgdGhpbmdzIG1heSBoYXBwZW4uICovCi0gICAgaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpIHsKKyAgICBpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKICAgICAgICAgcmV0dXJuIElSUV9OT05FOwotICAgIH0KIAotICAgIGlmIChtYWNwLT5kcml2ZXJfaXNvbGF0ZWQpIHsKKyAgICBpZiAobWFjcC0+ZHJpdmVyX2lzb2xhdGVkKQogICAgICAgICByZXR1cm4gSVJRX05PTkU7Ci0gICAgfQogCiAjaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKQogICAgIC8vemZpSXNyUGNpKGRldik7CkBAIC0zNDAsOSArMzM4LDExIEBACiAKICAgICBwcmludGsoIkVudGVyIG9wZW4oKVxuIik7CiAKLS8vI2lmbmRlZiBDT05GSUdfU01QCi0vLyAgICByZWFkX2xvY2soJihtYWNwLT5pc29sYXRlX2xvY2spKTsKLS8vI2VuZGlmCisvKgorICogI2lmbmRlZiBDT05GSUdfU01QCisgKiAgIHJlYWRfbG9jaygmKG1hY3AtPmlzb2xhdGVfbG9jaykpOworICogI2VuZGlmCisgKi8KICAgICBpZiAobWFjcC0+ZHJpdmVyX2lzb2xhdGVkKSB7CiAgICAgICAgIHJjID0gLUVCVVNZOwogICAgICAgICBnb3RvIGV4aXQ7CkBAIC0zOTMsMTEgKzM5MywxMSBAQAogICAgIGRldi0+ZGV2X2FkZHJbNF0gPSBhZGRyWzRdOwogICAgIGRldi0+ZGV2X2FkZHJbNV0gPSBhZGRyWzVdOwogI2VuZGlmCi0gICAgLy96ZndNYWNBZGRyZXNzTm90aWZ5KCkgd2lsbCBiZSBjYWxsZWQgdG8gc2V0dXAgZGV2LT5kZXZfYWRkcltdCisgICAgLyogemZ3TWFjQWRkcmVzc05vdGlmeSgpIHdpbGwgYmUgY2FsbGVkIHRvIHNldHVwIGRldi0+ZGV2X2FkZHJbXSAqLwogCiAgICAgemZMbnhDcmVhdGVUaHJlYWQoZGV2KTsKIAotICAgIG1vZF90aW1lcigmKG1hY3AtPmhiVGltZXIxMG1zKSwgamlmZmllcyArICgxKkhaKS8xMDApOyAgIC8vMTAgbXMKKyAgICBtb2RfdGltZXIoJihtYWNwLT5oYlRpbWVyMTBtcyksIGppZmZpZXMgKyAoMSpIWikvMTAwKTsgICAvKiAxMCBtcyAqLwogCiAgICAgbmV0aWZfY2Fycmllcl9vbihkZXYpOwogCkBAIC00MjUsMTUgKzQyNSwxNSBAQAogCiAgICAgI2lmIFpNX1NIQVJFX0FVVEggPT0gMQogICAgIHpmaVdsYW5TZXRBdXRoZW50aWNhdGlvbk1vZGUoZGV2LCAxKTsKLSAgICAjZW5kaWYgLy8jaWYgWk1fU0hBUkVfQVVUSCA9PSAxCi0gICNlbmRpZiAvLyNpZiBaTV9XRVBfTU9NRSA9PSAxCisgICAgI2VuZGlmIC8qICNpZiBaTV9TSEFSRV9BVVRIID09IDEgKi8KKyAgI2VuZGlmIC8qICNpZiBaTV9XRVBfTU9NRSA9PSAxICovCiAKICNlbGlmIFpNX1BJQlNTX01PREUgPT0gMQogICAgIHpmaVdsYW5TZXRXbGFuTW9kZShkZXYsIFpNX01PREVfUFNFVURPKTsKICNlbHNlCiAgICAgemZpV2xhblNldFdsYW5Nb2RlKGRldiwgWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSk7CiAjZW5kaWYKLSAgICAvL3pmaVdsYW5TZXRDaGFubmVsKGRldiwgWk1fQ0hBTk5FTCwgRkFMU0UpOworICAgIC8qIHpmaVdsYW5TZXRDaGFubmVsKGRldiwgWk1fQ0hBTk5FTCwgRkFMU0UpOyAqLwogICAgIHpmaVdsYW5TZXRGcmVxdWVuY3koZGV2LCAyNDYyMDAwLCBGQUxTRSk7CiAgICAgemZpV2xhblNldFJ0c1RocmVzaG9sZChkZXYsIDMyNzY3KTsKICAgICB6ZmlXbGFuU2V0RnJhZ1RocmVzaG9sZChkZXYsIDApOwpAQCAtNzIwLDcgKzcyMCw3IEBACiB7CiAgICAgdTE2X3QgaTsKIAotICAgIGZvciAoaT0wOyBpPFpNX1ZBUF9QT1JUX05VTUJFUjsgaSsrKQorICAgIGZvciAoaSA9IDA7IGkgPCBaTV9WQVBfUE9SVF9OVU1CRVI7IGkrKykKICAgICB7CiAgICAgICAgIHZhcFtpXS5kZXYgPSBOVUxMOwogICAgICAgICB2YXBbaV0ub3BlbkZsYWcgPSAwOwpAQCAtMTEyOCw4ICsxMTI4LDcgQEAKIAogICAgIHByaW50ayhLRVJOX0VSUiAiVHhRQ250OiAlZFxuIiwgVHhRQ250KTsKIAotICAgIGZvcihpaSA9IDA7IGlpIDwgVHhRQ250OyBpaSsrKQotICAgIHsKKyAgICBmb3IgKGlpID0gMDsgaWkgPCBUeFFDbnQ7IGlpKyspIHsKICAgICAgICAgVXNiVHhRX3QgKlR4USA9IHpmTG54R2V0VXNiVHhCdWZmZXIoZGV2KTsKIAogICAgICAgICBwcmludGsoS0VSTl9FUlIgImRldl9rZnJlZV9za2JfYW55XG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3VzYmRydi5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvdXNiZHJ2LmgKaW5kZXggNzgwMDQwNi4uMzMwZDFiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvdXNiZHJ2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvdXNiZHJ2LmgKQEAgLTQ1LDcgKzQ1LDcgQEAKICNpbmNsdWRlICJvYWxfZHQuaCIKICNpbmNsdWRlICJvYWxfbWFyYy5oIgogI2luY2x1ZGUgIjgwMjExY29yZS9wdWJfemZpLmgiCi0vLyNpbmNsdWRlICJwdWJfemZ3LmgiCisvKiAjaW5jbHVkZSAicHViX3pmdy5oIgkqLwogI2luY2x1ZGUgIjgwMjExY29yZS9wdWJfdXNiLmgiCiAKICNpbmNsdWRlIDxsaW51eC91c2IuaD4KQEAgLTg2LDggKzg2LDcgQEAKICNkZWZpbmUgWk1fTUFYX1JYX1VSQl9OVU0gICAgICAgICAgICAgICAgICAgMTYKICNkZWZpbmUgWk1fTUFYX1RYX0JVRl9OVU0gICAgICAgICAgICAgICAgICAgMTI4CiAKLXR5cGVkZWYgc3RydWN0IFVzYlR4UQotewordHlwZWRlZiBzdHJ1Y3QgVXNiVHhRIHsKICAgICB6YnVmX3QgKmJ1ZjsKICAgICB1OF90IGhkcls4MF07CiAgICAgdTE2X3QgaGRybGVuOwpAQCAtMTAwLDE3ICs5OSwxNiBAQAogCiAKIHN0cnVjdCB6ZGFwX2lvY3RsIHsKLQl1MTZfdCBjbWQ7ICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgdG8gcnVuICovCi0JdTMyX3QgYWRkcjsgICAgICAgICAgICAgICAgLyogTGVuZ3RoIG9mIHRoZSBkYXRhIGJ1ZmZlciAqLwotCXUzMl90IHZhbHVlOyAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgKi8KKwl1MTZfdCBjbWQ7CQkgIC8qIENvbW1hbmQgdG8gcnVuICovCisJdTMyX3QgYWRkcjsJCSAgLyogTGVuZ3RoIG9mIHRoZSBkYXRhIGJ1ZmZlciAqLworCXUzMl90IHZhbHVlOwkJLyogUG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgKi8KIAl1OF90CWRhdGFbMHgxMDBdOwogfTsKIAogI2RlZmluZSBaTV9PQUxfTUFYX1NUQV9TVVBQT1JUIDE2CiAKLXN0cnVjdCB1c2JkcnZfcHJpdmF0ZQotewotCS8vbGludXggdXNlZAorc3RydWN0IHVzYmRydl9wcml2YXRlIHsKKwkvKiBsaW51eCB1c2VkICovCiAJc3RydWN0IG5ldF9kZXZpY2UgCSpkZXZpY2U7CiAjaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKQogCXN0cnVjdCBwY2lfZGV2IAkJKnBkZXY7CkBAIC0xMjEsNyArMTE5LDcgQEAKICNlbmRpZgogCXN0cnVjdCBkcml2ZXJfc3RhdHMgZHJ2X3N0YXRzOwogCWNoYXIgaWZuYW1lW0lGTkFNU0laXTsKLQlpbnQJICAgICAgICAgICAgICAgIHVzaW5nX2RhYzsKKwlpbnQJCQkgIHVzaW5nX2RhYzsKIAl1OF90CQkJcmV2X2lkOwkJLyogYWRhcHRlciBQQ0kgcmV2aXNpb24gSUQgKi8KIAlyd2xvY2tfdCAJCWlzb2xhdGVfbG9jazsKICAgICBzcGlubG9ja190ICAgICAgY3NfbG9jazsKQEAgLTEzMCw3OCArMTI4LDc2IEBACiAJdm9pZAkJCSpyZWdwOwogI2VuZGlmCiAKLSAgICAgICAgLyogdGltZXIgZm9yIGhlYXJ0IGJlYXQgKi8KKwkgLyogdGltZXIgZm9yIGhlYXJ0IGJlYXQgKi8KIAlzdHJ1Y3QgdGltZXJfbGlzdCBoYlRpbWVyMTBtczsKIAogCS8qIEZvciBkcml2ZXIgY29yZSAqLwotCXZvaWQqIHdkOworCXZvaWQgKndkOwogCiAjaWYgKFdMQU5fSE9TVElGID09IFdMQU5fVVNCKQotCXU4X3QgICAgICAgICAgICAgICAgICAgIHR4VXNiQnVmW1pNX01BWF9UWF9VUkJfTlVNXVtaTV9VU0JfVFhfQlVGX1NJWkVdOwotCXU4X3QgICAgICAgICAgICAgICAgICAgIHJlZ1VzYlJlYWRCdWZbWk1fVVNCX1JFR19NQVhfQlVGX1NJWkVdOwotCXU4X3QgICAgICAgICAgICAgICAgICAgIHJlZ1VzYldyaXRlQnVmW1pNX1VTQl9SRUdfTUFYX0JVRl9TSVpFXTsKKwl1OF90CQkgICAgICB0eFVzYkJ1ZltaTV9NQVhfVFhfVVJCX05VTV1bWk1fVVNCX1RYX0JVRl9TSVpFXTsKKwl1OF90CQkgICAgICByZWdVc2JSZWFkQnVmW1pNX1VTQl9SRUdfTUFYX0JVRl9TSVpFXTsKKwl1OF90CQkgICAgICByZWdVc2JXcml0ZUJ1ZltaTV9VU0JfUkVHX01BWF9CVUZfU0laRV07CiAJdXJiX3QJCQkqV2xhblR4RGF0YVVyYltaTV9NQVhfVFhfVVJCX05VTV07CiAJdXJiX3QJCQkqV2xhblJ4RGF0YVVyYltaTV9NQVhfUlhfVVJCX05VTV07CiAJdXJiX3QJCQkqUmVnT3V0VXJiOwogCXVyYl90CQkJKlJlZ0luVXJiOwotCVVzYlR4UV90ICAgICAgICAgICAgICAgIFVzYlR4QnVmUVtaTV9NQVhfVFhfQlVGX05VTV07Ci0JemJ1Zl90ICAgICAgICAgICAgICAgICAgKlVzYlJ4QnVmUVtaTV9NQVhfUlhfVVJCX05VTV07Ci0gICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIFR4QnVmSGVhZDsKLSAgICAgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgVHhCdWZUYWlsOwotICAgICAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBUeEJ1ZkNudDsKLSAgICAgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgVHhVcmJIZWFkOwotICAgICAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBUeFVyYlRhaWw7Ci0gICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIFR4VXJiQ250OwotICAgICAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBSeEJ1ZkhlYWQ7Ci0gICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIFJ4QnVmVGFpbDsKLSAgICAgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgUnhCdWZDbnQ7CisJVXNiVHhRX3QJCSAgVXNiVHhCdWZRW1pNX01BWF9UWF9CVUZfTlVNXTsKKwl6YnVmX3QJCSAgICAqVXNiUnhCdWZRW1pNX01BWF9SWF9VUkJfTlVNXTsKKwkgdTE2X3QJCSAgICAgVHhCdWZIZWFkOworCSB1MTZfdAkJICAgICBUeEJ1ZlRhaWw7CisJIHUxNl90CQkgICAgIFR4QnVmQ250OworCSB1MTZfdAkJICAgICBUeFVyYkhlYWQ7CisJIHUxNl90CQkgICAgIFR4VXJiVGFpbDsKKwkgdTE2X3QJCSAgICAgVHhVcmJDbnQ7CisJIHUxNl90CQkgICAgIFJ4QnVmSGVhZDsKKwkgdTE2X3QJCSAgICAgUnhCdWZUYWlsOworCSB1MTZfdAkJICAgICBSeEJ1ZkNudDsKICNlbmRpZgogCiAjaWYgWk1fVVNCX1NUUkVBTV9NT0RFID09IDEKLSAgICAgICAgemJ1Zl90ICAgICAgICAgICAgICAgICAgKnJlYW1pbl9idWY7CisJIHpidWZfdAkJICAgICpyZWFtaW5fYnVmOwogI2VuZGlmCiAKICNpZmRlZiBaTV9IT1NUQVBEX1NVUFBPUlQKLSAgICAgICAgc3RydWN0IGF0aHJfd2xhbl9wYXJhbSAgYXRocl93cGFfcmVxOworCSBzdHJ1Y3QgYXRocl93bGFuX3BhcmFtICBhdGhyX3dwYV9yZXE7CiAjZW5kaWYKLSAgICAgICAgc3RydWN0IHNvY2sgICAgICAgICAgICAgKm5ldGxpbmtfc2s7Ci0gICAgICAgIHU4X3QgICAgICAgICAgICBEZXZpY2VPcGVuZWQ7IC8vQ1dZYW5nKCspCi0gICAgICAgIHU4X3QgICAgICAgICAgICBzdXBJZVs1MF07Ci0gICAgICAgIHU4X3QgICAgICAgICAgICBzdXBMZW47Ci0gICAgICAgIHN0cnVjdCBpZWVlODAyMTFyZXFfd3BhaWUgc3Rhd3BhaWVbWk1fT0FMX01BWF9TVEFfU1VQUE9SVF07Ci0gICAgICAgIHU4X3QgICAgICAgICAgICBmb3J3YXJkTWdtdDsKKwkgc3RydWN0IHNvY2sJICAgICAgKm5ldGxpbmtfc2s7CisJIHU4X3QJICAgICBEZXZpY2VPcGVuZWQ7IC8qIENXWWFuZygrKSAqLworCSB1OF90CSAgICAgc3VwSWVbNTBdOworCSB1OF90CSAgICAgc3VwTGVuOworCSBzdHJ1Y3QgaWVlZTgwMjExcmVxX3dwYWllIHN0YXdwYWllW1pNX09BTF9NQVhfU1RBX1NVUFBPUlRdOworCSB1OF90CSAgICAgZm9yd2FyZE1nbXQ7CiAKLSAgICAgICAgc3RydWN0IHpmQ2JVc2JGdW5jVGJsIHVzYkNiRnVuY3Rpb25zOworCSBzdHJ1Y3QgemZDYlVzYkZ1bmNUYmwgdXNiQ2JGdW5jdGlvbnM7CiAKLSAgICAgICAgLyogRm9yIGtldmVudGQgKi8KLSAgICAgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgZmxhZ3M7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIGtldmVudF9mbGFnczsKLSAgICAgICAgdTE2X3QgICAgICAgICAgICAgICAgICAga2V2ZW50X3JlYWR5OworCSAvKiBGb3Iga2V2ZW50ZCAqLworCSB1MzJfdAkJICAgICBmbGFnczsKKwkgdW5zaWduZWQgbG9uZwkgICAga2V2ZW50X2ZsYWdzOworCSB1MTZfdAkJICAgICBrZXZlbnRfcmVhZHk7CiAKLSAgICAgICAgc3RydWN0IHNlbWFwaG9yZSAgICAgICAgaW9jdGxfc2VtOwotICAgICAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3QgICAgICBrZXZlbnQ7Ci0gICAgICAgIHdhaXRfcXVldWVfaGVhZF90ICAgICAgIHdhaXRfcXVldWVfZXZlbnQ7CisJIHN0cnVjdCBzZW1hcGhvcmUJIGlvY3RsX3NlbTsKKwkgc3RydWN0IHdvcmtfc3RydWN0ICAgICAga2V2ZW50OworCSB3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0X3F1ZXVlX2V2ZW50OwogI2lmZGVmIFpNX0hBTFBMVVNfTE9DSwotICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBoYWxfaXJxRmxhZzsKKwkgdW5zaWduZWQgbG9uZwkgICAgaGFsX2lycUZsYWc7CiAjZW5kaWYKLSAgICAgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgYWRhcHRlclN0YXRlOworCSB1MTZfdAkJICAgICBhZGFwdGVyU3RhdGU7CiB9OwogCiAvKiBXRFMgKi8KICNkZWZpbmUgWk1fV0RTX1BPUlRfTlVNQkVSICA2CiAKLXN0cnVjdCB6c1dkc1N0cnVjdAotewotICAgIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXY7CitzdHJ1Y3QgenNXZHNTdHJ1Y3QgeworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAgICAgdTE2X3Qgb3BlbkZsYWc7CiB9OwogCiAvKiBWQVAgKi8KICNkZWZpbmUgWk1fVkFQX1BPUlRfTlVNQkVSICA3CiAKLXN0cnVjdCB6c1ZhcFN0cnVjdAotewotICAgIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXY7CitzdHJ1Y3QgenNWYXBTdHJ1Y3QgeworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAgICAgdTE2X3Qgb3BlbkZsYWc7CiB9OwogCkBAIC0yMTUsMjUgKzIxMSwyNSBAQAogI2RlZmluZSBaTV9JT0NUTF9SWERfRFVNUCAJCQkweDA3CiAjZGVmaW5lIFpNX0lPQ1RMX01FTV9SRUFECQkJMHgwQgogI2RlZmluZSBaTV9JT0NUTF9NRU1fV1JJVEUJCQkweDBDCi0jZGVmaW5lIFpNX0lPQ1RMX0RNQV9URVNUICAgICAgICAgICAweDEwCi0jZGVmaW5lIFpNX0lPQ1RMX1JFR19URVNUICAgICAgICAgICAweDExCi0jZGVmaW5lIFpNX0lPQ1RMX1RFU1QgICAgICAgICAgICAgICAweDgwCi0jZGVmaW5lIFpNX0lPQ1RMX1RBTExZICAgICAgICAgICAgICAweDgxIC8vQ1dZYW5nKCspCi0jZGVmaW5lIFpNX0lPQ1RMX1JUUyAgICAgICAgICAgICAgICAweEEwCi0jZGVmaW5lIFpNX0lPQ1RMX01JWF9NT0RFICAgICAgICAgICAweEExCi0jZGVmaW5lIFpNX0lPQ1RMX0ZSQUcgICAgICAgICAgICAgICAweEEyCi0jZGVmaW5lIFpNX0lPQ1RMX1NDQU4gICAgICAgICAgICAgICAweEEzCi0jZGVmaW5lIFpNX0lPQ1RMX0tFWSAgICAgICAgICAgICAgICAweEE0Ci0jZGVmaW5lIFpNX0lPQ1RMX1JBVEUgICAgICAgICAgICAgICAweEE1Ci0jZGVmaW5lIFpNX0lPQ1RMX0VOQ1JZUFRJT05fTU9ERSAgICAweEE2Ci0jZGVmaW5lIFpNX0lPQ1RMX0dFVF9UWENOVCAgICAgICAgICAweEE3Ci0jZGVmaW5lIFpNX0lPQ1RMX0dFVF9ERUFHR19DTlQgICAgICAweEE4Ci0jZGVmaW5lIFpNX0lPQ1RMX0RVUkFUSU9OX01PREUgICAgICAweEE5Ci0jZGVmaW5lIFpNX0lPQ1RMX1NFVF9BRVNfS0VZICAgICAgICAweEFBCi0jZGVmaW5lIFpNX0lPQ1RMX1NFVF9BRVNfTU9ERSAgICAgICAweEFCCi0jZGVmaW5lIFpNX0lPQ1RMX1NJR05BTF9TVFJFTkdUSCAgICAweEFDIC8vQ1dZYW5nKCspCi0jZGVmaW5lIFpNX0lPQ1RMX1NJR05BTF9RVUFMSVRZICAgICAweEFEIC8vQ1dZYW5nKCspCi0jZGVmaW5lIFpNX0lPQ1RMX1NFVF9QSUJTU19NT0RFICAgICAweEFFCisjZGVmaW5lIFpNX0lPQ1RMX0RNQV9URVNUCSAgICAJCTB4MTAKKyNkZWZpbmUgWk1fSU9DVExfUkVHX1RFU1QJICAgIAkJMHgxMQorI2RlZmluZSBaTV9JT0NUTF9URVNUCQkgCQkweDgwCisjZGVmaW5lIFpNX0lPQ1RMX1RBTExZCQkJCTB4ODEgLyogQ1dZYW5nKCspICovCisjZGVmaW5lIFpNX0lPQ1RMX1JUUwkJCQkweEEwCisjZGVmaW5lIFpNX0lPQ1RMX01JWF9NT0RFCQkJMHhBMQorI2RlZmluZSBaTV9JT0NUTF9GUkFHCQkJCTB4QTIKKyNkZWZpbmUgWk1fSU9DVExfU0NBTgkJCQkweEEzCisjZGVmaW5lIFpNX0lPQ1RMX0tFWQkJCQkweEE0CisjZGVmaW5lIFpNX0lPQ1RMX1JBVEUJCQkJMHhBNQorI2RlZmluZSBaTV9JT0NUTF9FTkNSWVBUSU9OX01PREUJCTB4QTYKKyNkZWZpbmUgWk1fSU9DVExfR0VUX1RYQ05UCQkJMHhBNworI2RlZmluZSBaTV9JT0NUTF9HRVRfREVBR0dfQ05UICAgIAkJMHhBOAorI2RlZmluZSBaTV9JT0NUTF9EVVJBVElPTl9NT0RFCQkJMHhBOQorI2RlZmluZSBaTV9JT0NUTF9TRVRfQUVTX0tFWQkJCTB4QUEKKyNkZWZpbmUgWk1fSU9DVExfU0VUX0FFU19NT0RFCQkJMHhBQgorI2RlZmluZSBaTV9JT0NUTF9TSUdOQUxfU1RSRU5HVEgJCTB4QUMgLyogQ1dZYW5nKCspICovCisjZGVmaW5lIFpNX0lPQ1RMX1NJR05BTF9RVUFMSVRZCQkJMHhBRCAvKiBDV1lhbmcoKykgKi8KKyNkZWZpbmUgWk1fSU9DVExfU0VUX1BJQlNTX01PREUJCQkweEFFCiAKICNkZWZpbmUJWkRBUElPQ1RMCQkJCVNJT0NERVZQUklWQVRFCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfYnVmLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX2J1Zi5jCmluZGV4IGEwZjY3N2EuLmQ3ZWUwYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfYnVmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9idWYuYwpAQCAtMzQsOSArMzQsOSBAQAogCiAKIC8qIENhbGxlZCB0byBhbGxvY2F0ZSBidWZmZXIsIG11c3QgcmV0dXJuIGEgY29udGludWUgYnVmZmVyIHNwYWNlICovCi16YnVmX3QqIHpmd0J1ZkFsbG9jYXRlKHpkZXZfdCogZGV2LCB1MTZfdCBsZW4pCit6YnVmX3QgKnpmd0J1ZkFsbG9jYXRlKHpkZXZfdCAqZGV2LCB1MTZfdCBsZW4pCiB7Ci0gICAgemJ1Zl90KiBidWY7CisgICAgemJ1Zl90ICpidWY7CiAKICAgICAvKiBBbGxvY2F0ZSBTS0IgZm9yIHBhY2tldCovCiAgICAgYnVmID0gZGV2X2FsbG9jX3NrYihsZW4pOwpAQCAtNDYsMTUgKzQ2LDE1IEBACiAKIAogLyogQ2FsbGVkIHRvIGZyZWUgYnVmZmVyLCByZXBsYWNlIGJlbG93IDMgZnVuY3Rpb25zICovCi12b2lkIHpmd0J1ZkZyZWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBzdGF0dXMpCit2b2lkIHpmd0J1ZkZyZWUoemRldl90ICpkZXYsIHpidWZfdCAqYnVmLCB1MTZfdCBzdGF0dXMpCiB7CiAgICAgZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsKIH0KIAogLyogQ2FsbGVkIHRvIGFkanVzdCBidWZmZXIgc2l6ZSBhbmQgaGVhZCBwb2ludGVyICovCi11MTZfdCB6ZndCdWZSZW1vdmVIZWFkKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgc2l6ZSkKK3UxNl90IHpmd0J1ZlJlbW92ZUhlYWQoemRldl90ICpkZXYsIHpidWZfdCAqYnVmLCB1MTZfdCBzaXplKQogewotICAgIC8vem1fYXNzZXJ0KGJ1Zi0+bGVuID4gc2l6ZSk7CisgICAgLyogem1fYXNzZXJ0KGJ1Zi0+bGVuID4gc2l6ZSk7ICovCiAKICAgICBidWYtPmRhdGEgKz0gc2l6ZTsKICAgICBidWYtPmxlbiAtPSBzaXplOwpAQCAtNjgsNyArNjgsNyBAQAogLyogVXNlZCB0byBjaGFpbiBSeCBidWZmZXIgdG8gZm9ybSBhIGZyYW1lLiBpZiB0aGUgcHJlcGFyZWQgUnggYnVmZmVyICAqLwogLyogaXMgZ3JlYXRlciB0aGFuIGFuIGV0aGVybmV0IGZyYW1lKDE1MTgrMzIgYnl0ZSksIHRoZW4gdGhpcyBmdW5jdGlvbiAgICAqLwogLyogd2lsbCBvbmx5IGJlIGNhbGxlZCB3aXRoIGhlYWQ9TlVMTC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotdTE2X3QgemZ3QnVmQ2hhaW4oemRldl90KiBkZXYsIHpidWZfdCoqIGhlYWQsIHpidWZfdCogdGFpbCkKK3UxNl90IHpmd0J1ZkNoYWluKHpkZXZfdCAqZGV2LCB6YnVmX3QgKipoZWFkLCB6YnVmX3QgKnRhaWwpCiB7CiAKICAgICAqaGVhZCA9IHRhaWw7CkBAIC03Nyw3ICs3Nyw3IEBACiAKIAogLyogQ2FsbGVkIHdoZW4gZG9pbmcgaW5mcmEtYnNzIGZvcndhcmRpbmcgKi8KLXUxNl90IHpmd0J1ZkNvcHkoemRldl90KiBkZXYsIHpidWZfdCogZHN0LCB6YnVmX3QqIHNyYykKK3UxNl90IHpmd0J1ZkNvcHkoemRldl90ICpkZXYsIHpidWZfdCAqZHN0LCB6YnVmX3QgKnNyYykKIHsKICAgICBtZW1jcHkoZHN0LT5kYXRhLCBzcmMtPmRhdGEsIHNyYy0+bGVuKTsKICAgICBkc3QtPnRhaWwgPSBkc3QtPmRhdGE7CkBAIC04Nyw3ICs4Nyw3IEBACiAKIAogLyogQ2FsbGVkIHRvIGFkanVzdCBidWZmZXIgc2l6ZSBhbmQgdGFpbCBwb2ludGVyICovCi11MTZfdCB6ZndCdWZTZXRTaXplKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgc2l6ZSkKK3UxNl90IHpmd0J1ZlNldFNpemUoemRldl90ICpkZXYsIHpidWZfdCAqYnVmLCB1MTZfdCBzaXplKQogewogI2lmZGVmIE5FVF9TS0JVRkZfREFUQV9VU0VTX09GRlNFVAogICAgIGJ1Zi0+dGFpbCA9IDA7CkBAIC0xMDEsMTEgKzEwMSwxMSBAQAogICAgIHJldHVybiAwOwogfQogCi11MTZfdCB6ZndCdWZHZXRTaXplKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3UxNl90IHpmd0J1ZkdldFNpemUoemRldl90ICpkZXYsIHpidWZfdCAqYnVmKQogewogICAgIHJldHVybiBidWYtPmxlbjsKIH0KIAotdm9pZCB6ZndDb3B5QnVmQ29udGV4dCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBzb3VyY2UsIHpidWZfdCogZHN0KQordm9pZCB6ZndDb3B5QnVmQ29udGV4dCh6ZGV2X3QgKmRldiwgemJ1Zl90ICpzb3VyY2UsIHpidWZfdCAqZHN0KQogewogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9kYmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfZGJnLmMKaW5kZXggZDQ3ZTlhYi4uZWUwZWUxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9kYmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX2RiZy5jCkBAIC0yOSw3MCArMjksNjcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KIAotdm9pZCB6ZndEdW1wQnVmKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3ZvaWQgemZ3RHVtcEJ1Zih6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYpCiB7Ci0gICAgdTE2X3QgaTsKKwl1MTZfdCBpOwogCi0gICAgZm9yIChpPTA7IGk8YnVmLT5sZW47IGkrKykKLSAgICB7Ci0gICAgICAgIHByaW50aygiJTAyeCAiLCAqKCgodThfdCopYnVmLT5kYXRhKStpKSk7Ci0gICAgICAgIGlmICgoaSYweGYpPT0weGYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaW50aygiXG4iKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwcmludGsoIlxuIik7CisJZm9yIChpID0gMDsgaSA8IGJ1Zi0+bGVuOyBpKyspIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiUwMnggIiwgKigoKHU4X3QgKilidWYtPmRhdGEpK2kpKTsKKwkJaWYgKChpICYgMHhmKSA9PSAweGYpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiXG4iKTsKKwl9CisJcHJpbnRrKEtFUk5fREVCVUcgIlxuIik7CiB9CiAKIAotdm9pZCB6ZndEYmdSZWFkUmVnRG9uZSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKQordm9pZCB6ZndEYmdSZWFkUmVnRG9uZSh6ZGV2X3QgKmRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKQogewotICAgIHByaW50aygiUmVhZCBhZGRyOiV4ID0gJXhcbiIsIGFkZHIsIHZhbCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIlJlYWQgYWRkcjoleCA9ICV4XG4iLCBhZGRyLCB2YWwpOwogfQogCi12b2lkIHpmd0RiZ1dyaXRlUmVnRG9uZSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKQordm9pZCB6ZndEYmdXcml0ZVJlZ0RvbmUoemRldl90ICpkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCkKIHsKLSAgICBwcmludGsoIldyaXRlIGFkZHI6JXggPSAleFxuIiwgYWRkciwgdmFsKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiV3JpdGUgYWRkcjoleCA9ICV4XG4iLCBhZGRyLCB2YWwpOwogfQogCi12b2lkIHpmd0RiZ1JlYWRUYWxseURvbmUoemRldl90KiBkZXYpCit2b2lkIHpmd0RiZ1JlYWRUYWxseURvbmUoemRldl90ICpkZXYpCiB7Ci0gICAgLy9wcmludGsoIlJlYWQgVGFsbCBEb25lXG4iKTsKKwkvKiBwcmludGsoS0VSTl9ERUJVRyAiUmVhZCBUYWxsIERvbmVcbiIpOyAqLwogfQogCi12b2lkIHpmd0RiZ1dyaXRlRWVwcm9tRG9uZSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKQordm9pZCB6ZndEYmdXcml0ZUVlcHJvbURvbmUoemRldl90ICpkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCkKIHsKIH0KIAotdm9pZCB6ZndEYmdRdWVyeUh3VHhCdXN5RG9uZSh6ZGV2X3QqIGRldiwgdTMyX3QgdmFsKQordm9pZCB6ZndEYmdRdWVyeUh3VHhCdXN5RG9uZSh6ZGV2X3QgKmRldiwgdTMyX3QgdmFsKQogewogfQogCi0vL0ZvciBFdmwgKysKLXZvaWQgemZ3RGJnUmVhZEZsYXNoRG9uZSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QqIHJzcGRhdGEsIHUzMl90IGRhdGFsZW4pCisvKiBGb3IgRXZsICsrICovCit2b2lkIHpmd0RiZ1JlYWRGbGFzaERvbmUoemRldl90ICpkZXYsIHUzMl90IGFkZHIsIHUzMl90ICpyc3BkYXRhLCB1MzJfdCBkYXRhbGVuKQogewotICAgIHByaW50aygiUmVhZCBGbGFzaCBhZGRyOiV4IGxlbmd0aDoleFxuIiwgYWRkciwgZGF0YWxlbik7CisJcHJpbnRrKEtFUk5fREVCVUcgIlJlYWQgRmxhc2ggYWRkcjoleCBsZW5ndGg6JXhcbiIsIGFkZHIsIGRhdGFsZW4pOwogfQogCi12b2lkIHpmd0RiZ1Byb2dyYW1lRmxhc2hEb25lKHpkZXZfdCogZGV2KQordm9pZCB6ZndEYmdQcm9ncmFtZUZsYXNoRG9uZSh6ZGV2X3QgKmRldikKIHsKLSAgICBwcmludGsoIlByb2dyYW0gRmxhc2ggRG9uZVxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgIlByb2dyYW0gRmxhc2ggRG9uZVxuIik7CiB9CiAKLXZvaWQgemZ3RGJnUHJvZ3JhbWVGbGFzaENoa0RvbmUoemRldl90KiBkZXYpCit2b2lkIHpmd0RiZ1Byb2dyYW1lRmxhc2hDaGtEb25lKHpkZXZfdCAqZGV2KQogewotICAgIHByaW50aygiUHJvZ3JhbSBGbGFzaCBEb25lXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiUHJvZ3JhbSBGbGFzaCBEb25lXG4iKTsKIH0KIAotdm9pZCB6ZndEYmdHZXRGbGFzaENoa1N1bURvbmUoemRldl90KiBkZXYsIHUzMl90KiByc3BkYXRhKQordm9pZCB6ZndEYmdHZXRGbGFzaENoa1N1bURvbmUoemRldl90ICpkZXYsIHUzMl90ICpyc3BkYXRhKQogewotICAgIHByaW50aygiR2V0IEZsYXNoIENoa1N1bSBEb25lXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiR2V0IEZsYXNoIENoa1N1bSBEb25lXG4iKTsKIH0KIAotdm9pZCB6ZndEYmdEb3dubG9hZEZ3SW5pdERvbmUoemRldl90KiBkZXYpCit2b2lkIHpmd0RiZ0Rvd25sb2FkRndJbml0RG9uZSh6ZGV2X3QgKmRldikKIHsKLSAgICBwcmludGsoIkRvd25sb2FkIEZXIEluaXQgRG9uZVxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgIkRvd25sb2FkIEZXIEluaXQgRG9uZVxuIik7CiB9Ci0vL0ZvciBFdmwgLS0KKy8qIEZvciBFdmwgLS0gKi8KIAogLyogTGVhdmUgYW4gZW1wdHkgbGluZSBiZWxvdyB0byByZW1vdmUgd2FybmluZyBtZXNzYWdlIG9uIHNvbWUgY29tcGlsZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfZXYuYwppbmRleCBiY2RhMGI5Li4yOWY1NjAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX2V2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9ldi5jCkBAIC0zMiwyMDIgKzMyLDIxNCBAQAogCiAKIC8qKioqKiBNYW5hZ2VtZW50ICoqKioqLwotdTE2X3QgemZMbnhBdXRoTm90aWZ5KHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkcikKK3UxNl90IHpmTG54QXV0aE5vdGlmeSh6ZGV2X3QgKmRldiwgdTE2X3QgKm1hY0FkZHIpCiB7Ci0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKLXUxNl90IHpmTG54QXNvY05vdGlmeSh6ZGV2X3QqIGRldiwgdTE2X3QqIG1hY0FkZHIsIHU4X3QqIGJvZHksIHUxNl90IGJvZHlTaXplLCB1MTZfdCBwb3J0KQordTE2X3QgemZMbnhBc29jTm90aWZ5KHpkZXZfdCAqZGV2LCB1MTZfdCAqbWFjQWRkciwgdThfdCAqYm9keSwgdTE2X3QgYm9keVNpemUsCisJCQkgdTE2X3QgcG9ydCkKIHsKLS8vI2lmZGVmIFpNX0hPU1RBUERfU1VQUE9SVAotICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKLSAgICB1bmlvbiBpd3JlcV9kYXRhIHdyZXE7Ci0gICAgdThfdCAqYWRkciA9ICh1OF90ICopIG1hY0FkZHI7Ci0gICAgdTE2X3QgaSwgajsKKy8qICNpZmRlZiBaTV9IT1NUQVBEX1NVUFBPUlQJKi8KKwlzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisJdW5pb24gaXdyZXFfZGF0YSB3cmVxOworCXU4X3QgKmFkZHIgPSAodThfdCAqKSBtYWNBZGRyOworCXUxNl90IGksIGo7CiAKLSAgICBtZW1zZXQoJndyZXEsIDAsIHNpemVvZih3cmVxKSk7Ci0gICAgbWVtY3B5KHdyZXEuYWRkci5zYV9kYXRhLCBtYWNBZGRyLCBFVEhfQUxFTik7Ci0gICAgd3JlcS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLSAgICBwcmludGsoS0VSTl9ERUJVRyAiam9pbl9ldmVudCBvZiBNQUM6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotICAgICAgICAgICAgYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSk7CisJbWVtc2V0KCZ3cmVxLCAwLCBzaXplb2Yod3JlcSkpOworCW1lbWNweSh3cmVxLmFkZHIuc2FfZGF0YSwgbWFjQWRkciwgRVRIX0FMRU4pOworCXdyZXEuYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJcHJpbnRrKEtFUk5fREVCVUcgImpvaW5fZXZlbnQgb2YgTUFDOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCWFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0pOwogCi0gICAgZm9yKGkgPSAwOyBpIDwgWk1fT0FMX01BWF9TVEFfU1VQUE9SVDsgaSsrKQotICAgIHsKLSAgICAgICAgZm9yKGogPSAwOyBqIDwgSUVFRTgwMjExX0FERFJfTEVOOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgobWFjcC0+c3Rhd3BhaWVbaV0ud3BhX21hY2FkZHJbal0gIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAobWFjcC0+c3Rhd3BhaWVbaV0ud3BhX21hY2FkZHJbal0gIT0gYWRkcltqXSkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGogPT0gNikKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoaSA8IFpNX09BTF9NQVhfU1RBX1NVUFBPUlQpCi0gICAgewotICAgICAgICAvL3ByaW50aygiemZ3QXNvY05vdGlmeSAtIHN0b3JlIHdwYSBpZSBpbiBtYWNwLCBpbmRleCA9ICVkXG4iLCBpKTsKLSAgICAgICAgbWVtY3B5KG1hY3AtPnN0YXdwYWllW2ldLndwYV9tYWNhZGRyLCBtYWNBZGRyLCBJRUVFODAyMTFfQUREUl9MRU4pOwotICAgICAgICBtZW1jcHkobWFjcC0+c3Rhd3BhaWVbaV0ud3BhX2llLCBib2R5LCBib2R5U2l6ZSk7Ci0gICAgfQotICAgIC8vaWYobWFjcC0+Y2FyZFNldHRpbmcuQnNzVHlwZSA9PSBJTkZSQVNUUlVDVFVSRV9CU1MpIHsKLSAgICAvLyAgICAgICAgICAgIC8vd2lyZWxlc3Nfc2VuZF9ldmVudChtYWNwLT5kZXZpY2UsIFNJT0NHSVdTQ0FOLCAmd3JlcSwgTlVMTCk7Ci0gICAgLy8gICAgd2lyZWxlc3Nfc2VuZF9ldmVudChtYWNwLT5kZXZpY2UsIFNJT0NHSVdBUCwgJndyZXEsIE5VTEwpOwotICAgIC8vfQotICAgIC8vZWxzZSBpZihtYWNwLT5jYXJkU2V0dGluZy5Cc3NUeXBlID09IEFQX0JTUykgewotLy8gICAgICAgIGlmIChwb3J0ID09IDApCi0vLyAgICAgICAgewotICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIElXRVZSRUdJU1RFUkVELCAmd3JlcSwgTlVMTCk7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGVsc2UKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICAgIC8qIENoZWNrIHdoZXRoZXIgdGhlIFZBUCBkZXZpY2UgaXMgdmFsaWQgKi8KLS8vICAgICAgICAgICAgaWYgKHZhcFtwb3J0XS5kZXYgIT0gTlVMTCkKLS8vICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudCh2YXBbcG9ydF0uZGV2LCBJV0VWUkVHSVNURVJFRCwgJndyZXEsIE5VTEwpOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIGVsc2UKLS8vICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJDYW4nIGZpbmQgYSB2YWxpZCBWQVAgZGV2aWNlLCBwb3J0OiAlZFxuIiwgcG9ydCk7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0gICAgLy99Ci0vLyNlbmRpZgorCWZvciAoaSA9IDA7IGkgPCBaTV9PQUxfTUFYX1NUQV9TVVBQT1JUOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IElFRUU4MDIxMV9BRERSX0xFTjsgaisrKSB7CisJCQlpZiAoKG1hY3AtPnN0YXdwYWllW2ldLndwYV9tYWNhZGRyW2pdICE9IDApICYmCisJCQkJKG1hY3AtPnN0YXdwYWllW2ldLndwYV9tYWNhZGRyW2pdICE9IGFkZHJbal0pKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChqID09IDYpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPCBaTV9PQUxfTUFYX1NUQV9TVVBQT1JUKSB7CisJCS8qCisJCSAqIHByaW50aygiemZ3QXNvY05vdGlmeSAtIHN0b3JlIHdwYSBpZSBpbiBtYWNwLAorCQkgKiAJaW5kZXggPSAlZFxuIiwgaSk7CisJCSAqLworCQltZW1jcHkobWFjcC0+c3Rhd3BhaWVbaV0ud3BhX21hY2FkZHIsIG1hY0FkZHIsCisJCQlJRUVFODAyMTFfQUREUl9MRU4pOworCQltZW1jcHkobWFjcC0+c3Rhd3BhaWVbaV0ud3BhX2llLCBib2R5LCBib2R5U2l6ZSk7CisJfQorCS8qCisJICogaWYobWFjcC0+Y2FyZFNldHRpbmcuQnNzVHlwZSA9PSBJTkZSQVNUUlVDVFVSRV9CU1MpIHsKKwkgKiB3aXJlbGVzc19zZW5kX2V2ZW50KG1hY3AtPmRldmljZSwgU0lPQ0dJV1NDQU4sICZ3cmVxLCBOVUxMKTsKKwkgKgl3aXJlbGVzc19zZW5kX2V2ZW50KG1hY3AtPmRldmljZSwgU0lPQ0dJV0FQLCAmd3JlcSwgTlVMTCk7CisJICogfQorCSAqIGVsc2UgaWYobWFjcC0+Y2FyZFNldHRpbmcuQnNzVHlwZSA9PSBBUF9CU1MpIHsKKwkgKglpZiAocG9ydCA9PSAwKQorCSAqCXsKKwkgKi8KKwkJCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBJV0VWUkVHSVNURVJFRCwgJndyZXEsIE5VTEwpOworCS8qCisJICoJfQorCSAqCWVsc2UKKwkgKgl7CisJICoJCSBDaGVjayB3aGV0aGVyIHRoZSBWQVAgZGV2aWNlIGlzIHZhbGlkCisJICoJCWlmICh2YXBbcG9ydF0uZGV2ICE9IE5VTEwpCisJICoJCXsKKwkgKgkJCXdpcmVsZXNzX3NlbmRfZXZlbnQodmFwW3BvcnRdLmRldiwKKwkgKgkJCQkJSVdFVlJFR0lTVEVSRUQsICZ3cmVxLCBOVUxMKTsKKwkgKgkJfQorCSAqCQllbHNlCisJICoJCXsKKwkgKgkJCXByaW50ayhLRVJOX0VSUiAiQ2FuJyBmaW5kIGEgdmFsaWQgVkFQIGRldmljZSwKKwkgKgkJCQkgcG9ydDogJWRcbiIsIHBvcnQpOworCSAqCQl9CisJICoJfQorCSAqIH0KKwkgKi8KKy8qICNlbmRpZgkqLwogCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIAogLyogTm90aWZpY2F0aW9uIHRoYXQgYSBTVEEgaXMgZGlzYXNzb2NpYXRlZCBmcm9tIEFQICovCiAvKiBBUCBtb2RlIG9ubHkgKi8KLXUxNl90IHpmTG54RGlzQXNvY05vdGlmeSh6ZGV2X3QqIGRldiwgdThfdCogbWFjQWRkciwgdTE2X3QgcG9ydCkKK3UxNl90IHpmTG54RGlzQXNvY05vdGlmeSh6ZGV2X3QgKmRldiwgdThfdCAqbWFjQWRkciwgdTE2X3QgcG9ydCkKIHsKLSAgICB1bmlvbiBpd3JlcV9kYXRhIHdyZXE7Ci0gICAgdThfdCAqYWRkciA9ICh1OF90ICopIG1hY0FkZHI7CisJdW5pb24gaXdyZXFfZGF0YSB3cmVxOworCXU4X3QgKmFkZHIgPSAodThfdCAqKSBtYWNBZGRyOwogCi0gICAgbWVtc2V0KCZ3cmVxLCAwLCBzaXplb2Yod3JlcSkpOwotICAgIG1lbWNweSh3cmVxLmFkZHIuc2FfZGF0YSwgbWFjQWRkciwgRVRIX0FMRU4pOwotICAgIHdyZXEuYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0gICAgcHJpbnRrKEtFUk5fREVCVUcgInpmd0Rpc0Fzb2NOb3RpZnkoKSwgTUFDOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLSAgICAgICAgICAgIGFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0pOworCW1lbXNldCgmd3JlcSwgMCwgc2l6ZW9mKHdyZXEpKTsKKwltZW1jcHkod3JlcS5hZGRyLnNhX2RhdGEsIG1hY0FkZHIsIEVUSF9BTEVOKTsKKwl3cmVxLmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCXByaW50ayhLRVJOX0RFQlVHICJ6ZndEaXNBc29jTm90aWZ5KCksIE1BQzogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQlhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdLCBhZGRyWzRdLCBhZGRyWzVdKTsKIAogCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIC8qIE5vdGlmaWNhdGlvbiB0aGF0IGEgU1RBIGlzIGNvbm5lY3QgdG8gQVAgKi8KIC8qIEFQIG1vZGUgb25seSAqLwotdTE2X3QgemZMbnhBcENvbm5lY3ROb3RpZnkoemRldl90KiBkZXYsIHU4X3QqIG1hY0FkZHIsIHUxNl90IHBvcnQpCit1MTZfdCB6ZkxueEFwQ29ubmVjdE5vdGlmeSh6ZGV2X3QgKmRldiwgdThfdCAqbWFjQWRkciwgdTE2X3QgcG9ydCkKIHsKLSAgICB1bmlvbiBpd3JlcV9kYXRhIHdyZXE7Ci0gICAgdThfdCAqYWRkciA9ICh1OF90ICopIG1hY0FkZHI7CisJdW5pb24gaXdyZXFfZGF0YSB3cmVxOworCXU4X3QgKmFkZHIgPSAodThfdCAqKSBtYWNBZGRyOwogCi0gICAgbWVtc2V0KCZ3cmVxLCAwLCBzaXplb2Yod3JlcSkpOwotICAgIG1lbWNweSh3cmVxLmFkZHIuc2FfZGF0YSwgbWFjQWRkciwgRVRIX0FMRU4pOwotICAgIHdyZXEuYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0gICAgcHJpbnRrKEtFUk5fREVCVUcgInpmd0FwQ29ubmVjdE5vdGlmeSgpLCBNQUM6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotICAgICAgICAgICAgYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSk7CisJbWVtc2V0KCZ3cmVxLCAwLCBzaXplb2Yod3JlcSkpOworCW1lbWNweSh3cmVxLmFkZHIuc2FfZGF0YSwgbWFjQWRkciwgRVRIX0FMRU4pOworCXdyZXEuYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJcHJpbnRrKEtFUk5fREVCVUcgInpmd0FwQ29ubmVjdE5vdGlmeSgpLCBNQUM6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSk7CiAKIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiAKIAotdm9pZCB6ZkxueENvbm5lY3ROb3RpZnkoemRldl90KiBkZXYsIHUxNl90IHN0YXR1cywgdTE2X3QqIGJzc2lkKQordm9pZCB6ZkxueENvbm5lY3ROb3RpZnkoemRldl90ICpkZXYsIHUxNl90IHN0YXR1cywgdTE2X3QgKmJzc2lkKQogewotICAgIHVuaW9uIGl3cmVxX2RhdGEgd3JlcTsKLSAgICB1OF90ICphZGRyID0gKHU4X3QgKikgYnNzaWQ7Ci0gICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCXVuaW9uIGl3cmVxX2RhdGEgd3JlcTsKKwl1OF90ICphZGRyID0gKHU4X3QgKikgYnNzaWQ7CisJc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OwogCi0gICAgaWYgKGJzc2lkICE9IE5VTEwpCi0gICAgewotICAgICAgICBtZW1zZXQoJndyZXEsIDAsIHNpemVvZih3cmVxKSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0NPTk5FQ1QpCi0gICAgICAgICAgICBtZW1jcHkod3JlcS5hZGRyLnNhX2RhdGEsIGJzc2lkLCBFVEhfQUxFTik7Ci0gICAgICAgIHdyZXEuYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJaWYgKGJzc2lkICE9IE5VTEwpIHsKKwkJbWVtc2V0KCZ3cmVxLCAwLCBzaXplb2Yod3JlcSkpOworCQlpZiAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9DT05ORUNUKQorCQkJbWVtY3B5KHdyZXEuYWRkci5zYV9kYXRhLCBic3NpZCwgRVRIX0FMRU4pOworCQl3cmVxLmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwogCi0gICAgICAgIGlmIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0NPTk5FQ1QpCi0gICAgICAgIHsKKwkJaWYgKHN0YXR1cyA9PSBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVCkgewogI2lmZGVmIFpNX0NPTkZJR19CSUdfRU5ESUFOCi0gICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiQ29ubmVjdGVkIHRvIEFQLCBNQUM6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotICAgICAgICAgICAgICAgICAgICBhZGRyWzFdLCBhZGRyWzBdLCBhZGRyWzNdLCBhZGRyWzJdLCBhZGRyWzVdLCBhZGRyWzRdKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJDb25uZWN0ZWQgdG8gQVAsIE1BQzoiCisJCQkJIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJCWFkZHJbMV0sIGFkZHJbMF0sIGFkZHJbM10sIGFkZHJbMl0sCisJCQkJYWRkcls1XSwgYWRkcls0XSk7CiAjZWxzZQotICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIkNvbm5lY3RlZCB0byBBUCwgTUFDOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLSAgICAgICAgICAgICAgICAgICAgYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiQ29ubmVjdGVkIHRvIEFQLCBNQUM6IgorCQkJCSAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkJYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwKKwkJCQlhZGRyWzRdLCBhZGRyWzVdKTsKICNlbmRpZgogCi0gICAgICAgICAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QpIHx8Ci0gICAgICAgICAgICAgICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0FCTEVEKSB8fAotICAgICAgICAgICAgICAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9DT05ORUNUSU9OX0RJU0FCTEVEKSB8fAotCSAgICAgICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0NPTk5FQ1RJT05fUkVTRVQpIHx8Ci0JICAgICAgICAgKHN0YXR1cyA9PSBaTV9TVEFUVVNfTUVESUFfUkVTRVQpIHx8Ci0JICAgICAgICAgKHN0YXR1cyA9PSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9ERUFVVEgpIHx8Ci0JICAgICAgICAgKHN0YXR1cyA9PSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9ESVNBU09DKSB8fAotCSAgICAgICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfQkVBQ09OX01JU1MpIHx8Ci0gICAgICAgICAgICAgICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfTk9UX0ZPVU5EKSB8fAotCSAgICAgICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfVElNRU9VVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJEaXNjb25uZWN0aW9uIE5vdGlmeVxuIik7CisJCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQl9IGVsc2UgaWYgKChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QpIHx8CisJCQkgICAgKHN0YXR1cyA9PSBaTV9TVEFUVVNfTUVESUFfRElTQUJMRUQpIHx8CisJCQkgICAgKHN0YXR1cyA9PSBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVElPTl9ESVNBQkxFRCkgfHwKKwkJCSAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9DT05ORUNUSU9OX1JFU0VUKSB8fAorCQkJICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX1JFU0VUKSB8fAorCQkJICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfREVBVVRIKSB8fAorCQkJICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfRElTQVNPQykgfHwKKwkJCSAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfQkVBQ09OX01JU1MpIHx8CisJCQkgICAgKHN0YXR1cyA9PSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9OT1RfRk9VTkQpIHx8CisJCQkgICAgKHN0YXR1cyA9PSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9USU1FT1VUKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkRpc2Nvbm5lY3Rpb24gTm90aWZ5XG4iKTsKIAotICAgICAgICAgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotICAgICAgICB9CisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCX0KIAogCS8qIFNhdmUgdGhlIGNvbm5lY3RlZCBzdGF0dXMgKi8KIAltYWNwLT5hZGFwdGVyU3RhdGUgPSBzdGF0dXM7CiAKLSAgICAgICAgaWYoemZpV2xhblF1ZXJ5V2xhbk1vZGUoZGV2KSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKSB7Ci0gICAgICAgIC8vICAgICAgICAgICAgLy93aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgU0lPQ0dJV1NDQU4sICZ3cmVxLCBOVUxMKTsKLSAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBTSU9DR0lXQVAsICZ3cmVxLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKHpmaVdsYW5RdWVyeVdsYW5Nb2RlKGRldikgPT0gWk1fTU9ERV9BUCkgewotICAgICAgICAgICAgLy9pZiAocG9ydCA9PSAwKQotICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIElXRVZSRUdJU1RFUkVELCAmd3JlcSwgTlVMTCk7Ci0gICAgICAgICAgICAvL30KLSAgICAgICAgICAgIC8vZWxzZQotICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAvLyAgICAvKiBDaGVjayB3aGV0aGVyIHRoZSBWQVAgZGV2aWNlIGlzIHZhbGlkICovCi0gICAgICAgICAgICAvLyAgICBpZiAodmFwW3BvcnRdLmRldiAhPSBOVUxMKQotICAgICAgICAgICAgLy8gICAgewotICAgICAgICAgICAgLy8gICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQodmFwW3BvcnRdLmRldiwgSVdFVlJFR0lTVEVSRUQsICZ3cmVxLCBOVUxMKTsKLSAgICAgICAgICAgIC8vICAgIH0KLSAgICAgICAgICAgIC8vICAgIGVsc2UKLSAgICAgICAgICAgIC8vICAgIHsKLSAgICAgICAgICAgIC8vICAgICAgICBwcmludGsoS0VSTl9FUlIgIkNhbicgZmluZCBhIHZhbGlkIFZBUCBkZXZpY2UsIHBvcnQ6ICVkXG4iLCBwb3J0KTsKLSAgICAgICAgICAgIC8vICAgIH0KLSAgICAgICAgICAgIC8vfQotICAgICAgICB9Ci0gICAgfQotICAgIC8vcmV0dXJuIDA7CisJCWlmICh6ZmlXbGFuUXVlcnlXbGFuTW9kZShkZXYpID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpIHsKKwkJCS8qd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIFNJT0NHSVdTQ0FOLCAmd3JlcSwgTlVMTCk7Ki8KKwkJCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBTSU9DR0lXQVAsICZ3cmVxLCBOVUxMKTsKKwkJfSBlbHNlIGlmICh6ZmlXbGFuUXVlcnlXbGFuTW9kZShkZXYpID09IFpNX01PREVfQVApIHsKKwkJCS8qCisJCQkgKiBpZiAocG9ydCA9PSAwKQorCQkJICogeworCQkJICoJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIElXRVZSRUdJU1RFUkVELAorCQkJICoJCQkJICZ3cmVxLCBOVUxMKTsKKwkJCSAqIH0KKwkJCSAqIGVsc2UKKwkJCSAqIHsKKwkJCSAqCUNoZWNrIHdoZXRoZXIgdGhlIFZBUCBkZXZpY2UgaXMgdmFsaWQKKwkJCSAqCWlmICh2YXBbcG9ydF0uZGV2ICE9IE5VTEwpCisJCQkgKgl7CisJCQkgKgkJd2lyZWxlc3Nfc2VuZF9ldmVudCh2YXBbcG9ydF0uZGV2LAorCQkgKgkJCQkgSVdFVlJFR0lTVEVSRUQsICZ3cmVxLCBOVUxMKTsKKwkJCSAqCX0KKwkJCSAqCWVsc2UKKwkJCSAqCXsKKwkJCSAqCQlwcmludGsoS0VSTl9FUlIgIkNhbicgZmluZCBhIHZhbGlkIFZBUCIKKwkJCSAqCQkJIiBkZXZpY2UsIHBvcnQ6ICVkXG4iLCBwb3J0KTsKKwkJCSAqCX0KKwkJCSAqIH0KKwkJCSovCisJCX0KKwl9CisJLyogcmV0dXJuIDA7CSovCiB9CiAKLXZvaWQgemZMbnhTY2FuTm90aWZ5KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNTY2FuUmVzdWx0KiByZXN1bHQpCit2b2lkIHpmTG54U2Nhbk5vdGlmeSh6ZGV2X3QgKmRldiwgc3RydWN0IHpzU2NhblJlc3VsdCAqcmVzdWx0KQogewotICAgIHJldHVybjsKKwlyZXR1cm47CiB9CiAKLXZvaWQgemZMbnhTdGF0aXN0aWNzTm90aWZ5KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNTdGFzdGljcyogcmVzdWx0KQordm9pZCB6ZkxueFN0YXRpc3RpY3NOb3RpZnkoemRldl90ICpkZXYsIHN0cnVjdCB6c1N0YXN0aWNzICpyZXN1bHQpCiB7Ci0gICAgcmV0dXJuOworCXJldHVybjsKIH0KIAotLy92b2lkIHpmd01pY0ZhaWx1cmVOb3RpZnkoemRldl90KiBkZXYsIHU4X3QqIG1lc3NhZ2UsIHUxNl90IGV2ZW50KQotdm9pZCB6ZkxueE1pY0ZhaWx1cmVOb3RpZnkoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MTZfdCBzdGF0dXMpCisvKiB2b2lkIHpmd01pY0ZhaWx1cmVOb3RpZnkoemRldl90ICpkZXYsIHU4X3QgKm1lc3NhZ2UsIHUxNl90IGV2ZW50KSAqLwordm9pZCB6ZkxueE1pY0ZhaWx1cmVOb3RpZnkoemRldl90ICpkZXYsIHUxNl90ICphZGRyLCB1MTZfdCBzdGF0dXMpCiB7CiAJc3RhdGljIGNvbnN0IGNoYXIgKnRhZyA9ICJNTE1FLU1JQ0hBRUxNSUNGQUlMVVJFLmluZGljYXRpb24iOwogCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKIAljaGFyIGJ1ZlsxMjhdOwogCiAJLyogVE9ETzogbmVlZGVkIHBhcmFtZXRlcnM6IGNvdW50LCB0eXBlLCBzcmMgYWRkcmVzcyAqLwotCS8vc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzKCVzY2FzdCBhZGRyPSVzKSIsIHRhZywKLQkvLyAgICAoc3RhdHVzID09IFpNX01JQ19HUk9VUF9FUlJPUikgPyAgImJyb2FkIiA6ICJ1bmkiLAotCS8vICAgIGV0aGVyX3NwcmludGYoKHU4X3QgKilhZGRyKSk7CisJLyoKKwkgKiBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMoJXNjYXN0IGFkZHI9JXMpIiwgdGFnLAorCSAqCShzdGF0dXMgPT0gWk1fTUlDX0dST1VQX0VSUk9SKSA/ICAiYnJvYWQiIDogInVuaSIsCisJICoJZXRoZXJfc3ByaW50ZigodThfdCAqKWFkZHIpKTsKKwkgKi8KIAogCWlmICh6ZmlXbGFuUXVlcnlXbGFuTW9kZShkZXYpID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpCi0JewogCQlzdHJjcHkoYnVmLCB0YWcpOwotCX0KIAogCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKIAl3cnF1LmRhdGEubGVuZ3RoID0gc3RybGVuKGJ1Zik7CkBAIC0yMzUsNDIgKzI0Nyw0NiBAQAogfQogCiAKLXZvaWQgemZMbnhBcE1pY0ZhaWx1cmVOb3RpZnkoemRldl90KiBkZXYsIHU4X3QqIGFkZHIsIHpidWZfdCogYnVmKQordm9pZCB6ZkxueEFwTWljRmFpbHVyZU5vdGlmeSh6ZGV2X3QgKmRldiwgdThfdCAqYWRkciwgemJ1Zl90ICpidWYpCiB7Ci0gICAgdW5pb24gaXdyZXFfZGF0YSB3cmVxOworCXVuaW9uIGl3cmVxX2RhdGEgd3JlcTsKIAotICAgIG1lbXNldCgmd3JlcSwgMCwgc2l6ZW9mKHdyZXEpKTsKLSAgICBtZW1jcHkod3JlcS5hZGRyLnNhX2RhdGEsIGFkZHIsIEVUSF9BTEVOKTsKLSAgICB3cmVxLmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotICAgIHByaW50ayhLRVJOX0RFQlVHICJ6ZndBcE1pY0ZhaWx1cmVOb3RpZnkoKSwgTUFDOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLSAgICAgICAgICAgIGFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0pOworCW1lbXNldCgmd3JlcSwgMCwgc2l6ZW9mKHdyZXEpKTsKKwltZW1jcHkod3JlcS5hZGRyLnNhX2RhdGEsIGFkZHIsIEVUSF9BTEVOKTsKKwl3cmVxLmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCXByaW50ayhLRVJOX0RFQlVHICJ6ZndBcE1pY0ZhaWx1cmVOb3RpZnkoKSwgIgorCQkJIk1BQzogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQlhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdLCBhZGRyWzRdLCBhZGRyWzVdKTsKIAotICAgIHJldHVybjsKKwlyZXR1cm47CiB9Ci0KLS8vIHN0YXR1cyA9IDAgID0+IHBhcnRuZXIgbG9zdAotLy8gICAgICAgID0gMSAgPT4gcGFydG5lciBhbGl2ZQotLy92b2lkIHpmd0lic3NQYXJ0bmVyTm90aWZ5KHpkZXZfdCogZGV2LCB1OF90IHN0YXR1cykKLXZvaWQgemZMbnhJYnNzUGFydG5lck5vdGlmeSh6ZGV2X3QqIGRldiwgdTE2X3Qgc3RhdHVzLCBzdHJ1Y3QgenNQYXJ0bmVyTm90aWZ5RXZlbnQgKmV2ZW50KQorLyoKKyAqIHN0YXR1cyA9IDAgID0+IHBhcnRuZXIgbG9zdAorICoJCT0gMSAgPT4gcGFydG5lciBhbGl2ZQorICogdm9pZCB6ZndJYnNzUGFydG5lck5vdGlmeSh6ZGV2X3QqIGRldiwgdThfdCBzdGF0dXMpCisgKi8KK3ZvaWQgemZMbnhJYnNzUGFydG5lck5vdGlmeSh6ZGV2X3QgKmRldiwgdTE2X3Qgc3RhdHVzLAorCQkJCXN0cnVjdCB6c1BhcnRuZXJOb3RpZnlFdmVudCAqZXZlbnQpCiB7CiB9CiAKLXZvaWQgemZMbnhNYWNBZGRyZXNzTm90aWZ5KHpkZXZfdCogZGV2LCB1OF90KiBhZGRyKQordm9pZCB6ZkxueE1hY0FkZHJlc3NOb3RpZnkoemRldl90ICpkZXYsIHU4X3QgKmFkZHIpCiB7Ci0gICAgZGV2LT5kZXZfYWRkclswXSA9IGFkZHJbMF07Ci0gICAgZGV2LT5kZXZfYWRkclsxXSA9IGFkZHJbMV07Ci0gICAgZGV2LT5kZXZfYWRkclsyXSA9IGFkZHJbMl07Ci0gICAgZGV2LT5kZXZfYWRkclszXSA9IGFkZHJbM107Ci0gICAgZGV2LT5kZXZfYWRkcls0XSA9IGFkZHJbNF07Ci0gICAgZGV2LT5kZXZfYWRkcls1XSA9IGFkZHJbNV07CisJZGV2LT5kZXZfYWRkclswXSA9IGFkZHJbMF07CisJZGV2LT5kZXZfYWRkclsxXSA9IGFkZHJbMV07CisJZGV2LT5kZXZfYWRkclsyXSA9IGFkZHJbMl07CisJZGV2LT5kZXZfYWRkclszXSA9IGFkZHJbM107CisJZGV2LT5kZXZfYWRkcls0XSA9IGFkZHJbNF07CisJZGV2LT5kZXZfYWRkcls1XSA9IGFkZHJbNV07CiB9CiAKLXZvaWQgemZMbnhTZW5kQ29tcGxldGVJbmRpY2F0aW9uKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3ZvaWQgemZMbnhTZW5kQ29tcGxldGVJbmRpY2F0aW9uKHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZikKIHsKIH0KIAogCi12b2lkIHpmTG54UmVzdG9yZUJ1ZkRhdGEoemRldl90KiBkZXYsIHpidWZfdCogYnVmKSB7Cit2b2lkIHpmTG54UmVzdG9yZUJ1ZkRhdGEoemRldl90ICpkZXYsIHpidWZfdCAqYnVmKQorewogCiB9CiAvKiBMZWF2ZSBhbiBlbXB0eSBsaW5lIGJlbG93IHRvIHJlbW92ZSB3YXJuaW5nIG1lc3NhZ2Ugb24gc29tZSBjb21waWxlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9tZW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfbWVtLmMKaW5kZXggMzI0MTZkNy4uNDdjYmNlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9tZW0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX21lbS5jCkBAIC0zMCw2OSArMzAsNzUgQEAKICNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgogCiAvKiBNZW1vcnkgbWFuYWdlbWVudCAqLwotLyogQ2FsbGVkIHRvIGFsbG9jYXRlIHVuY2FjaGVkIG1lbW9yeSwgYWxsb2NhdGVkIG1lbW9yeSBtdXN0ICAgICovCi0vKiBpbiA0LWJ5dGUgYm91bmRhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLXZvaWQqIHpmd01lbUFsbG9jYXRlKHpkZXZfdCogZGV2LCB1MzJfdCBzaXplKQorLyogQ2FsbGVkIHRvIGFsbG9jYXRlIHVuY2FjaGVkIG1lbW9yeSwgYWxsb2NhdGVkIG1lbW9yeSBtdXN0CSovCisvKiBpbiA0LWJ5dGUgYm91bmRhcnkJCQkJCQkqLwordm9pZCAqemZ3TWVtQWxsb2NhdGUoemRldl90ICpkZXYsIHUzMl90IHNpemUpCiB7Ci0gICAgdm9pZCogbWVtID0gTlVMTDsKLSAgICBtZW0gPSBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOwotICAgIHJldHVybiBtZW07CisJdm9pZCAqbWVtID0gTlVMTDsKKwltZW0gPSBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOworCXJldHVybiBtZW07CiB9CiAKIAogLyogQ2FsbGVkIHRvIGZyZWUgYWxsb2NhdGVkIG1lbW9yeSAqLwotdm9pZCB6ZndNZW1GcmVlKHpkZXZfdCogZGV2LCB2b2lkKiBtZW0sIHUzMl90IHNpemUpCit2b2lkIHpmd01lbUZyZWUoemRldl90ICpkZXYsIHZvaWQgKm1lbSwgdTMyX3Qgc2l6ZSkKIHsKLSAgICBrZnJlZShtZW0pOwotICAgIHJldHVybjsKKwlrZnJlZShtZW0pOworCXJldHVybjsKIH0KIAotdm9pZCB6ZndNZW1vcnlDb3B5KHU4X3QqIGRzdCwgdThfdCogc3JjLCB1MTZfdCBsZW5ndGgpCit2b2lkIHpmd01lbW9yeUNvcHkodThfdCAqZHN0LCB1OF90ICpzcmMsIHUxNl90IGxlbmd0aCkKIHsKLSAgICAvL3UxNl90IGk7CisJLyogdTE2X3QgaTsgKi8KIAotICAgIG1lbWNweShkc3QsIHNyYywgbGVuZ3RoKTsKLSAgICAvL2ZvcihpPTA7IGk8bGVuZ3RoOyBpKyspCi0gICAgLy97Ci0gICAgLy8gICAgZHN0W2ldID0gc3JjW2ldOwotICAgIC8vfQotICAgIHJldHVybjsKKwltZW1jcHkoZHN0LCBzcmMsIGxlbmd0aCk7CisJLyoKKwkgKiBmb3IoaT0wOyBpPGxlbmd0aDsgaSsrKQorCSAqIHsKKwkgKglkc3RbaV0gPSBzcmNbaV07CisJICogfQorCSAqLworCXJldHVybjsKIH0KIAotdm9pZCB6ZndaZXJvTWVtb3J5KHU4X3QqIHZhLCB1MTZfdCBsZW5ndGgpCit2b2lkIHpmd1plcm9NZW1vcnkodThfdCAqdmEsIHUxNl90IGxlbmd0aCkKIHsKLSAgICAvL3UxNl90IGk7Ci0gICAgbWVtc2V0KHZhLCAwLCBsZW5ndGgpOwotICAgIC8vZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKLSAgICAvL3sKLSAgICAvLyAgICB2YVtpXSA9IDA7Ci0gICAgLy99Ci0gICAgcmV0dXJuOworCS8qIHUxNl90IGk7ICovCisJbWVtc2V0KHZhLCAwLCBsZW5ndGgpOworCS8qCisJICogZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKKwkgKiB7CisJICoJdmFbaV0gPSAwOworCSAqIH0KKwkgKi8KKwlyZXR1cm47CiB9CiAKLXZvaWQgemZ3TWVtb3J5TW92ZSh1OF90KiBkc3QsIHU4X3QqIHNyYywgdTE2X3QgbGVuZ3RoKQordm9pZCB6ZndNZW1vcnlNb3ZlKHU4X3QgKmRzdCwgdThfdCAqc3JjLCB1MTZfdCBsZW5ndGgpCiB7Ci0gICAgbWVtY3B5KGRzdCwgc3JjLCBsZW5ndGgpOwotICAgIHJldHVybjsKKwltZW1jcHkoZHN0LCBzcmMsIGxlbmd0aCk7CisJcmV0dXJuOwogfQogCi11OF90IHpmd01lbW9yeUlzRXF1YWwodThfdCogbTEsIHU4X3QqIG0yLCB1MTZfdCBsZW5ndGgpCit1OF90IHpmd01lbW9yeUlzRXF1YWwodThfdCAqbTEsIHU4X3QgKm0yLCB1MTZfdCBsZW5ndGgpCiB7Ci0gICAgLy91MTZfdCBpOwotICAgIGludCByZXQ7CisJLyogdTE2X3QgaTsgKi8KKwlpbnQgcmV0OwogCi0gICAgcmV0ID0gbWVtY21wKG0xLCBtMiwgbGVuZ3RoKTsKKwlyZXQgPSBtZW1jbXAobTEsIG0yLCBsZW5ndGgpOwogCi0gICAgcmV0dXJuICgocmV0PT0wKT9UUlVFOkZBTFNFKTsKLSAgICAvL2ZvcihpPTA7IGk8bGVuZ3RoOyBpKyspCi0gICAgLy97Ci0gICAgLy8gICAgaWYgKCBtMVtpXSAhPSBtMltpXSApCi0gICAgLy8gICAgewotICAgIC8vICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgLy8gICAgfQotICAgIC8vfQotCi0gICAgLy9yZXR1cm4gVFJVRTsKKwlyZXR1cm4gKChyZXQgPT0gMCkgPyBUUlVFIDogRkFMU0UpOworCS8qCisJICogZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKKwkgKnsKKwkgKgkgaWYgKCBtMVtpXSAhPSBtMltpXSApCisJICoJeworCSAqCQlyZXR1cm4gRkFMU0U7CisJICoJfQorCSAqfQorCSAqCisJICogcmV0dXJuIFRSVUU7CisJICovCiB9CiAKIC8qIExlYXZlIGFuIGVtcHR5IGxpbmUgYmVsb3cgdG8gcmVtb3ZlIHdhcm5pbmcgbWVzc2FnZSBvbiBzb21lIGNvbXBpbGVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX21pcy5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9taXMuYwppbmRleCBlYTIxOTlmLi4yNmY0OWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX21pcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfbWlzLmMKQEAgLTMwLDc2ICszMCw3MyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgogCi0vL2V4dGVybiBzdHJ1Y3QgenNXZHNTdHJ1Y3Qgd2RzW1pNX1dEU19QT1JUX05VTUJFUl07CisvKiBleHRlcm4gc3RydWN0IHpzV2RzU3RydWN0IHdkc1taTV9XRFNfUE9SVF9OVU1CRVJdOwkqLwogZXh0ZXJuIHN0cnVjdCB6c1ZhcFN0cnVjdCB2YXBbWk1fVkFQX1BPUlRfTlVNQkVSXTsKLWV4dGVybiB1MTZfdCB6ZkxueEdldFZhcElkKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MTZfdCB6ZkxueEdldFZhcElkKHpkZXZfdCAqZGV2KTsKIAogLyogU2ltcGx5IHJldHVybiAweGZmZmYgaWYgVkFQIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgKi8KLXUxNl90IHpmd0dldFZhcElkKHpkZXZfdCogZGV2KQordTE2X3QgemZ3R2V0VmFwSWQoemRldl90ICpkZXYpCiB7Ci0gICAgcmV0dXJuIHpmTG54R2V0VmFwSWQoZGV2KTsKKwlyZXR1cm4gemZMbnhHZXRWYXBJZChkZXYpOwogfQogCi12b2lkIHpmd1NsZWVwKHpkZXZfdCogZGV2LCB1MzJfdCBtcykKK3ZvaWQgemZ3U2xlZXAoemRldl90ICpkZXYsIHUzMl90IG1zKQogewotICAgIGlmIChpbl9pbnRlcnJ1cHQoKSA9PSAwKQotICAgIHsKLSAgICAgICAgbWRlbGF5KG1zKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaW50IGlpOwotICAgICAgICBpbnQgaXRlciA9IDEwMDAwMCAqIG1zOworCWlmIChpbl9pbnRlcnJ1cHQoKSA9PSAwKQorCQltZGVsYXkobXMpOworCWVsc2UgeworCQlpbnQgaWk7CisJCWludCBpdGVyID0gMTAwMDAwICogbXM7CiAKLSAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgaXRlcjsgaWkrKykKLSAgICAgICAgewotCi0gICAgICAgIH0KLSAgICB9CisJCWZvciAoaWkgPSAwOyBpaSA8IGl0ZXI7IGlpKyspIHsKKwkJfQorCX0KIH0KIAogI2lmZGVmIFpNX0hBTFBMVVNfTE9DSwotYXNtbGlua2FnZSBzdHJ1Y3QgenNXbGFuRGV2ICp6ZndHZXRXbGFuRGV2KHpkZXZfdCogZGV2KQorYXNtbGlua2FnZSBzdHJ1Y3QgenNXbGFuRGV2ICp6ZndHZXRXbGFuRGV2KHpkZXZfdCAqZGV2KQogewogCXN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKIAlyZXR1cm4gbWFjcC0+d2Q7CiB9CiAKLWFzbWxpbmthZ2Ugdm9pZCB6ZndFbnRlckNyaXRpY2FsU2VjdGlvbih6ZGV2X3QqIGRldikKK2FzbWxpbmthZ2Ugdm9pZCB6ZndFbnRlckNyaXRpY2FsU2VjdGlvbih6ZGV2X3QgKmRldikKIHsKIAlzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1hY3AtPmNzX2xvY2ssIG1hY3AtPmhhbF9pcnFGbGFnKTsKIH0KIAotYXNtbGlua2FnZSB2b2lkIHpmd0xlYXZlQ3JpdGljYWxTZWN0aW9uKHpkZXZfdCogZGV2KQorYXNtbGlua2FnZSB2b2lkIHpmd0xlYXZlQ3JpdGljYWxTZWN0aW9uKHpkZXZfdCAqZGV2KQogewogCXN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBtYWNwLT5oYWxfaXJxRmxhZyk7CiB9CiAKLWFzbWxpbmthZ2UgdThfdCB6ZndCdWZSZWFkQnl0ZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKK2FzbWxpbmthZ2UgdThfdCB6ZndCdWZSZWFkQnl0ZSh6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYsIHUxNl90IG9mZnNldCkKIHsKLSAgICByZXR1cm4gKih1OF90KikoKHU4X3QqKWJ1Zi0+ZGF0YStvZmZzZXQpOworCXJldHVybiAqKHU4X3QgKikoKHU4X3QgKilidWYtPmRhdGErb2Zmc2V0KTsKIH0KIAotYXNtbGlua2FnZSB1MTZfdCB6ZndCdWZSZWFkSGFsZldvcmQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpCithc21saW5rYWdlIHUxNl90IHpmd0J1ZlJlYWRIYWxmV29yZCh6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYsIHUxNl90IG9mZnNldCkKIHsKLSAgICByZXR1cm4gem13X2NwdV90b19sZTE2KCoodTE2X3QqKSgodThfdCopYnVmLT5kYXRhK29mZnNldCkpOworCXJldHVybiB6bXdfY3B1X3RvX2xlMTYoKih1MTZfdCAqKSgodThfdCAqKWJ1Zi0+ZGF0YStvZmZzZXQpKTsKIH0KIAotYXNtbGlua2FnZSB2b2lkIHpmd0J1ZldyaXRlQnl0ZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdThfdCB2YWx1ZSkKK2FzbWxpbmthZ2Ugdm9pZCB6ZndCdWZXcml0ZUJ5dGUoemRldl90ICpkZXYsIHpidWZfdCAqYnVmLCB1MTZfdCBvZmZzZXQsCisJCQkJdThfdCB2YWx1ZSkKIHsKLSAgICAqKHU4X3QqKSgodThfdCopYnVmLT5kYXRhK29mZnNldCkgPSB2YWx1ZTsKKwkqKHU4X3QgKikoKHU4X3QgKilidWYtPmRhdGErb2Zmc2V0KSA9IHZhbHVlOwogfQogCi1hc21saW5rYWdlIHZvaWQgemZ3QnVmV3JpdGVIYWxmV29yZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdTE2X3QgdmFsdWUpCithc21saW5rYWdlIHZvaWQgemZ3QnVmV3JpdGVIYWxmV29yZCh6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYsIHUxNl90IG9mZnNldCwKKwkJCQkJdTE2X3QgdmFsdWUpCiB7Ci0gICAgKih1MTZfdCopKCh1OF90KilidWYtPmRhdGErb2Zmc2V0KSA9IHptd19jcHVfdG9fbGUxNih2YWx1ZSk7CisJKih1MTZfdCAqKSgodThfdCAqKWJ1Zi0+ZGF0YStvZmZzZXQpID0gem13X2NwdV90b19sZTE2KHZhbHVlKTsKIH0KIAotYXNtbGlua2FnZSB1OF90ICp6ZndHZXRCdWZmZXIoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQorYXNtbGlua2FnZSB1OF90ICp6ZndHZXRCdWZmZXIoemRldl90ICpkZXYsIHpidWZfdCAqYnVmKQogewotICAgIHJldHVybiAodThfdCopKGJ1Zi0+ZGF0YSk7CisJcmV0dXJuICh1OF90ICopKGJ1Zi0+ZGF0YSk7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9wa3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfcGt0LmMKaW5kZXggMGQ1OTIwZi4uNzViYjk1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9wa3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX3BrdC5jCkBAIC0zMSwxMzYgKzMxLDEyMiBAQAogI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CiAKIAotLy9leHRlcm4gc3RydWN0IHpzV2RzU3RydWN0IHdkc1taTV9XRFNfUE9SVF9OVU1CRVJdOworLyogZXh0ZXJuIHN0cnVjdCB6c1dkc1N0cnVjdCB3ZHNbWk1fV0RTX1BPUlRfTlVNQkVSXTsgCSovCiBleHRlcm4gc3RydWN0IHpzVmFwU3RydWN0IHZhcFtaTV9WQVBfUE9SVF9OVU1CRVJdOwogCiAKIC8qKioqKiBSeCAqKioqKi8KLXZvaWQgemZMbnhSZWN2ODAyMTEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIGFkZEluZm8pCit2b2lkIHpmTG54UmVjdjgwMjExKHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvICphZGRJbmZvKQogewotICAgIHUxNl90IGZyYW1lVHlwZTsKLSAgICB1MTZfdCBmcmFtZUN0cmw7Ci0gICAgdTE2X3QgZnJhbWVTdWJ0eXBlOwotICAgIHpidWZfdCAqc2tiMTsKLSAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisJdTE2X3QgZnJhbWVUeXBlOworCXUxNl90IGZyYW1lQ3RybDsKKwl1MTZfdCBmcmFtZVN1YnR5cGU7CisJemJ1Zl90ICpza2IxOworCXN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKIAotICAgIC8vZnJhbWVDdHJsID0gem13X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCk7Ci0gICAgZnJhbWVDdHJsID0gKih1OF90KikoKHU4X3QqKWJ1Zi0+ZGF0YSk7Ci0gICAgZnJhbWVUeXBlID0gZnJhbWVDdHJsICYgMHhmOwotICAgIGZyYW1lU3VidHlwZSA9IGZyYW1lQ3RybCAmIDB4ZjA7CisJLyogZnJhbWVDdHJsID0gem13X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCk7CSovCisJZnJhbWVDdHJsID0gKih1OF90ICopKCh1OF90ICopYnVmLT5kYXRhKTsKKwlmcmFtZVR5cGUgPSBmcmFtZUN0cmwgJiAweGY7CisJZnJhbWVTdWJ0eXBlID0gZnJhbWVDdHJsICYgMHhmMDsKIAotICAgIGlmICgoZnJhbWVUeXBlID09IDB4MCkgJiYgKG1hY3AtPmZvcndhcmRNZ210KSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoZnJhbWVTdWJ0eXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogQmVhY29uICovCi0gICAgICAgICAgICBjYXNlIDB4ODAgOgotICAgICAgICAgICAgICAgIC8qIFByb2JlIHJlc3BvbnNlICovCi0gICAgICAgICAgICBjYXNlIDB4NTAgOgotICAgICAgICAgICAgICAgIHNrYjEgPSBza2JfY29weShidWYsIEdGUF9BVE9NSUMpOwotICAgICAgICAgICAgICAgIGlmKHNrYjEgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNrYjEtPmRldiA9IGRldjsKLSAgICAgICAgICAgICAgICAgICAgc2tiMS0+bWFjX2hlYWRlciA9IHNrYjEtPmRhdGE7Ci0JICAgICAgICAgICAgc2tiMS0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKLQkgICAgICAgICAgICBza2IxLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7Ci0JICAgICAgICAgICAgc2tiMS0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKDB4MDAxOSk7ICAvKiBFVEhfUF84MDIxMV9SQVcgKi8KLSAgICAJICAgICAgICAgICAgbmV0aWZfcngoc2tiMSk7Ci0JICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KKwlpZiAoKGZyYW1lVHlwZSA9PSAweDApICYmIChtYWNwLT5mb3J3YXJkTWdtdCkpIHsKKwkJc3dpdGNoIChmcmFtZVN1YnR5cGUpIHsKKwkJCS8qIEJlYWNvbiAqLworCQljYXNlIDB4ODA6CisJCQkvKiBQcm9iZSByZXNwb25zZSAqLworCQljYXNlIDB4NTA6CisJCQlza2IxID0gc2tiX2NvcHkoYnVmLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChza2IxICE9IE5VTEwpIHsKKwkJCQlza2IxLT5kZXYgPSBkZXY7CisJCQkJc2tiMS0+bWFjX2hlYWRlciA9IHNrYjEtPmRhdGE7CisJCQkJc2tiMS0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkJCQlza2IxLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CisJCQkJLyogRVRIX1BfODAyMTFfUkFXICovCisJCQkJc2tiMS0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKDB4MDAxOSk7CisJCQkJbmV0aWZfcngoc2tiMSk7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQogCi0gICAgemZpUmVjdjgwMjExKGRldiwgYnVmLCBhZGRJbmZvKTsKLSAgICByZXR1cm47CisJemZpUmVjdjgwMjExKGRldiwgYnVmLCBhZGRJbmZvKTsKKwlyZXR1cm47CiB9CiAKICNkZWZpbmUgWk1fQVZPSURfVURQX0xBUkdFX1BBQ0tFVF9GQUlMCi12b2lkIHpmTG54UmVjdkV0aCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHBvcnQpCit2b2lkIHpmTG54UmVjdkV0aCh6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYsIHUxNl90IHBvcnQpCiB7Ci0gICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKICNpZmRlZiBaTV9BVk9JRF9VRFBfTEFSR0VfUEFDS0VUX0ZBSUwKLSAgICB6YnVmX3QgKm5ld19idWY7CisJemJ1Zl90ICpuZXdfYnVmOwogCi0gICAgLy9uZXdfYnVmID0gZGV2X2FsbG9jX3NrYigyMDQ4KTsKLSAgICBuZXdfYnVmID0gZGV2X2FsbG9jX3NrYihidWYtPmxlbik7CisJLyogbmV3X2J1ZiA9IGRldl9hbGxvY19za2IoMjA0OCk7CSovCisJbmV3X2J1ZiA9IGRldl9hbGxvY19za2IoYnVmLT5sZW4pOwogCiAjaWZkZWYgTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUCi0gICAgbmV3X2J1Zi0+dGFpbCA9IDA7Ci0gICAgbmV3X2J1Zi0+bGVuID0gMDsKKwluZXdfYnVmLT50YWlsID0gMDsKKwluZXdfYnVmLT5sZW4gPSAwOwogI2Vsc2UKLSAgICBuZXdfYnVmLT50YWlsID0gbmV3X2J1Zi0+ZGF0YTsKLSAgICBuZXdfYnVmLT5sZW4gPSAwOworCW5ld19idWYtPnRhaWwgPSBuZXdfYnVmLT5kYXRhOworCW5ld19idWYtPmxlbiA9IDA7CiAjZW5kaWYKIAotICAgIHNrYl9wdXQobmV3X2J1ZiwgYnVmLT5sZW4pOwotICAgIG1lbWNweShuZXdfYnVmLT5kYXRhLCBidWYtPmRhdGEsIGJ1Zi0+bGVuKTsKKwlza2JfcHV0KG5ld19idWYsIGJ1Zi0+bGVuKTsKKwltZW1jcHkobmV3X2J1Zi0+ZGF0YSwgYnVmLT5kYXRhLCBidWYtPmxlbik7CiAKLSAgICAvKiBGcmVlIGJ1ZmZlciAqLwotICAgIGRldl9rZnJlZV9za2JfYW55KGJ1Zik7CisJLyogRnJlZSBidWZmZXIgKi8KKwlkZXZfa2ZyZWVfc2tiX2FueShidWYpOwogCi0gICAgaWYgKHBvcnQgPT0gMCkKLSAgICB7Ci0gICAgICAgIG5ld19idWYtPmRldiA9IGRldjsKLSAgICAgICAgbmV3X2J1Zi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhuZXdfYnVmLCBkZXYpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBWQVAgKi8KLSAgICAgICAgaWYgKHZhcFswXS5kZXYgIT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgbmV3X2J1Zi0+ZGV2ID0gdmFwWzBdLmRldjsKLSAgICAgICAgICAgIG5ld19idWYtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMobmV3X2J1ZiwgdmFwWzBdLmRldik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBuZXdfYnVmLT5kZXYgPSBkZXY7Ci0gICAgICAgICAgICBuZXdfYnVmLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKG5ld19idWYsIGRldik7Ci0gICAgICAgIH0KLSAgICB9CisJaWYgKHBvcnQgPT0gMCkgeworCQluZXdfYnVmLT5kZXYgPSBkZXY7CisJCW5ld19idWYtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMobmV3X2J1ZiwgZGV2KTsKKwl9IGVsc2UgeworCQkvKiBWQVAgKi8KKwkJaWYgKHZhcFswXS5kZXYgIT0gTlVMTCkgeworCQkJbmV3X2J1Zi0+ZGV2ID0gdmFwWzBdLmRldjsKKwkJCW5ld19idWYtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMobmV3X2J1ZiwgdmFwWzBdLmRldik7CisJCX0gZWxzZSB7CisJCQluZXdfYnVmLT5kZXYgPSBkZXY7CisJCQluZXdfYnVmLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKG5ld19idWYsIGRldik7CisJCX0KKwl9CiAKLSAgICBuZXdfYnVmLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwotICAgIGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJbmV3X2J1Zi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwogCi0gICAgc3dpdGNoKG5ldGlmX3J4KG5ld19idWYpKQorCXN3aXRjaCAobmV0aWZfcngobmV3X2J1ZikpCiAjZWxzZQotICAgIGlmIChwb3J0ID09IDApCi0gICAgewotICAgICAgICBidWYtPmRldiA9IGRldjsKLSAgICAgICAgYnVmLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKGJ1ZiwgZGV2KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogVkFQICovCi0gICAgICAgIGlmICh2YXBbMF0uZGV2ICE9IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ1Zi0+ZGV2ID0gdmFwWzBdLmRldjsKLSAgICAgICAgICAgIGJ1Zi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhidWYsIHZhcFswXS5kZXYpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYnVmLT5kZXYgPSBkZXY7Ci0gICAgICAgICAgICBidWYtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoYnVmLCBkZXYpOwotICAgICAgICB9Ci0gICAgfQorCWlmIChwb3J0ID09IDApIHsKKwkJYnVmLT5kZXYgPSBkZXY7CisJCWJ1Zi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhidWYsIGRldik7CisJfSBlbHNlIHsKKwkJLyogVkFQICovCisJCWlmICh2YXBbMF0uZGV2ICE9IE5VTEwpIHsKKwkJCWJ1Zi0+ZGV2ID0gdmFwWzBdLmRldjsKKwkJCWJ1Zi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhidWYsIHZhcFswXS5kZXYpOworCQl9IGVsc2UgeworCQkJYnVmLT5kZXYgPSBkZXY7CisJCQlidWYtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoYnVmLCBkZXYpOworCQl9CisJfQogCi0gICAgYnVmLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwotICAgIGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJYnVmLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CiAKLSAgICBzd2l0Y2gobmV0aWZfcngoYnVmKSkKKwlzd2l0Y2ggKG5ldGlmX3J4KGJ1ZikpCiAjZW5kaWYKLSAgICB7Ci0gICAgY2FzZSBORVRfUlhfRFJPUDoKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgICAgIG1hY3AtPmRydl9zdGF0cy5uZXRfc3RhdHMucnhfcGFja2V0cysrOwotICAgICAgICAgICAgbWFjcC0+ZHJ2X3N0YXRzLm5ldF9zdGF0cy5yeF9ieXRlcyArPSBidWYtPmxlbjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQorCXsKKwljYXNlIE5FVF9SWF9EUk9QOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQkJbWFjcC0+ZHJ2X3N0YXRzLm5ldF9zdGF0cy5yeF9wYWNrZXRzKys7CisJCQltYWNwLT5kcnZfc3RhdHMubmV0X3N0YXRzLnJ4X2J5dGVzICs9IGJ1Zi0+bGVuOworCQlicmVhazsKKwl9CiAKLSAgICByZXR1cm47CisJcmV0dXJuOwogfQogCiAvKiBMZWF2ZSBhbiBlbXB0eSBsaW5lIGJlbG93IHRvIHJlbW92ZSB3YXJuaW5nIG1lc3NhZ2Ugb24gc29tZSBjb21waWxlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9zZWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfc2VjLmMKaW5kZXggMGY3ODBiYS4uMGIyMzhlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9zZWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX3NlYy5jCkBAIC0zMyw5MiArMzMsOTMgQEAKICNpZmRlZiBaTV9FTkFCTEVfQ0VOQwogZXh0ZXJuIGludCB6ZkxueENlbmNTZW5kTXNnKHN0cnVjdCBzb2NrICpuZXRsaW5rX3NrLCB1X2ludDhfdCAqbXNnLCBpbnQgbGVuKTsKIAotdTE2X3QgemZMbnhDZW5jQXNvY05vdGlmeSh6ZGV2X3QqIGRldiwgdTE2X3QqIG1hY0FkZHIsIHU4X3QqIGJvZHksIHUxNl90IGJvZHlTaXplLCB1MTZfdCBwb3J0KQordTE2X3QgemZMbnhDZW5jQXNvY05vdGlmeSh6ZGV2X3QgKmRldiwgdTE2X3QgKm1hY0FkZHIsIHU4X3QgKmJvZHksCisJCQkJdTE2X3QgYm9keVNpemUsIHUxNl90IHBvcnQpCiB7Ci0gICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqKWRldi0+cHJpdjsKLSAgICBzdHJ1Y3QgenlkYXNfY2VuY19zdGFfaW5mbyBjZW5jX2luZm87Ci0gICAgLy9zdHJ1Y3Qgc29jayAqbmV0bGlua19zazsKLSAgICB1OF90IGllX2xlbjsKLSAgICBpbnQgaWk7CisJc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKwlzdHJ1Y3QgenlkYXNfY2VuY19zdGFfaW5mbyBjZW5jX2luZm87CisJLyogc3RydWN0IHNvY2sgKm5ldGxpbmtfc2s7CSovCisJdThfdCBpZV9sZW47CisJaW50IGlpOwogCi0gICAgLyogQ3JlYXRlIE5FVExJTksgc29ja2V0ICovCi0gICAgLy9uZXRsaW5rX3NrID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfVVNFUlNPQ0ssIE5VTEwpOworCS8qIENyZWF0ZSBORVRMSU5LIHNvY2tldCAqLworCS8qbmV0bGlua19zayA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZShORVRMSU5LX1VTRVJTT0NLLCBOVUxMKTsJKi8KIAotICAgIGlmIChtYWNwLT5uZXRsaW5rX3NrID09IE5VTEwpCi0gICAgewotICAgICAgICBwcmludGsoS0VSTl9FUlIgIk5FVExJTksgU29ja2V0IGlzIE5VTExcbiIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQorCWlmIChtYWNwLT5uZXRsaW5rX3NrID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJORVRMSU5LIFNvY2tldCBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KIAotICAgIG1lbXNldCgmY2VuY19pbmZvLCAwLCBzaXplb2YoY2VuY19pbmZvKSk7CisJbWVtc2V0KCZjZW5jX2luZm8sIDAsIHNpemVvZihjZW5jX2luZm8pKTsKIAotICAgIC8vbWVtY3B5KGNlbmNfaW5mby5nc24sIHZhcC0+aXZfY2VuY21za19rZXlzLndrX3R4aXYsIFpNX0NFTkNfSVZfTEVOKTsKLSAgICB6ZmlXbGFuUXVlcnlHU04oZGV2LCBjZW5jX2luZm8uZ3NuLCBwb3J0KTsKLSAgICBjZW5jX2luZm8uZGF0YWxlbiArPSBaTV9DRU5DX0lWX0xFTjsKLSAgICBpZV9sZW4gPSBib2R5WzFdICsgMjsKLSAgICBtZW1jcHkoY2VuY19pbmZvLndpZSwgYm9keSwgaWVfbGVuKTsKLSAgICBjZW5jX2luZm8uZGF0YWxlbiArPSBpZV9sZW47CisJLyogbWVtY3B5KGNlbmNfaW5mby5nc24sIHZhcC0+aXZfY2VuY21za19rZXlzLndrX3R4aXYsCisJICogIAlaTV9DRU5DX0lWX0xFTik7CisJICovCisJemZpV2xhblF1ZXJ5R1NOKGRldiwgY2VuY19pbmZvLmdzbiwgcG9ydCk7CisJY2VuY19pbmZvLmRhdGFsZW4gKz0gWk1fQ0VOQ19JVl9MRU47CisJaWVfbGVuID0gYm9keVsxXSArIDI7CisJbWVtY3B5KGNlbmNfaW5mby53aWUsIGJvZHksIGllX2xlbik7CisJY2VuY19pbmZvLmRhdGFsZW4gKz0gaWVfbGVuOwogCi0gICAgbWVtY3B5KGNlbmNfaW5mby5zdGFfbWFjLCBtYWNBZGRyLCA2KTsKLSAgICBjZW5jX2luZm8ubXNnX3R5cGUgPSBaTV9DRU5DX1dBSV9SRVFVRVNUOwotICAgIGNlbmNfaW5mby5kYXRhbGVuICs9IDYgKyAyOworCW1lbWNweShjZW5jX2luZm8uc3RhX21hYywgbWFjQWRkciwgNik7CisJY2VuY19pbmZvLm1zZ190eXBlID0gWk1fQ0VOQ19XQUlfUkVRVUVTVDsKKwljZW5jX2luZm8uZGF0YWxlbiArPSA2ICsgMjsKIAotICAgIHByaW50ayhLRVJOX0VSUiAiPT09PT0gemZ3Q2VuY1NlbmRNc2csIGJvZHlTaXplOiAlZCA9PT09PVxuIiwgYm9keVNpemUpOworCXByaW50ayhLRVJOX0VSUiAiPT09PT0gemZ3Q2VuY1NlbmRNc2csIGJvZHlTaXplOiAlZCA9PT09PVxuIiwgYm9keVNpemUpOwogCi0gICAgZm9yKGlpID0gMDsgaWkgPCBib2R5U2l6ZTsgaWkrKykKLSAgICB7Ci0gICAgICAgIHByaW50ayhLRVJOX0VSUiAiJTAyeCAiLCBib2R5W2lpXSk7CisJZm9yIChpaSA9IDA7IGlpIDwgYm9keVNpemU7IGlpKyspIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlMDJ4ICIsIGJvZHlbaWldKTsKIAotICAgICAgICBpZiAoKGlpICYgMHhmKSA9PSAweGYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiXG4iKTsKLSAgICAgICAgfQotICAgIH0KKwkJaWYgKChpaSAmIDB4ZikgPT0gMHhmKQorCQkJcHJpbnRrKEtFUk5fRVJSICJcbiIpOworCX0KIAotICAgIHpmTG54Q2VuY1NlbmRNc2cobWFjcC0+bmV0bGlua19zaywgKHU4X3QgKikmY2VuY19pbmZvLCBjZW5jX2luZm8uZGF0YWxlbis0KTsKKwl6ZkxueENlbmNTZW5kTXNnKG1hY3AtPm5ldGxpbmtfc2ssICh1OF90ICopJmNlbmNfaW5mbywKKwkJCSBjZW5jX2luZm8uZGF0YWxlbis0KTsKIAotICAgIC8qIENsb3NlIE5FVExJTksgc29ja2V0ICovCi0gICAgLy9zb2NrX3JlbGVhc2UobmV0bGlua19zayk7CisJLyogQ2xvc2UgTkVUTElOSyBzb2NrZXQgKi8KKwkvKiBzb2NrX3JlbGVhc2UobmV0bGlua19zayk7CSovCiAKLSAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KLSNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisjZW5kaWYgLyogWk1fRU5BQkxFX0NFTkMJKi8KIAotdThfdCB6ZndDZW5jSGFuZGxlQmVhY29uUHJvYnJlc3Bvbih6ZGV2X3QqIGRldiwgdThfdCAqcFdJRWMsCi0gICAgICAgIHU4X3QgKnBQZWVyU1NJRGMsIHU4X3QgKnBQZWVyQWRkcmMpCit1OF90IHpmd0NlbmNIYW5kbGVCZWFjb25Qcm9icmVzcG9uKHpkZXZfdCAqZGV2LCB1OF90ICpwV0lFYywKKwkJdThfdCAqcFBlZXJTU0lEYywgdThfdCAqcFBlZXJBZGRyYykKIHsKLSAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAotdThfdCB6ZndHZXRQa3RFbmNFeGVtcHRpb25BY3Rpb25UeXBlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3U4X3QgemZ3R2V0UGt0RW5jRXhlbXB0aW9uQWN0aW9uVHlwZSh6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYpCiB7Ci0gICAgcmV0dXJuIFpNX0VOQ1JZUFRJT05fRVhFTVBUX05PX0VYRU1QVElPTjsKKwlyZXR1cm4gWk1fRU5DUllQVElPTl9FWEVNUFRfTk9fRVhFTVBUSU9OOwogfQogCi12b2lkIGNvcHlUb0ludFR4QnVmZmVyKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCogc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90IG9mZnNldCwgdTE2X3QgbGVuZ3RoKQordm9pZCBjb3B5VG9JbnRUeEJ1ZmZlcih6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYsIHU4X3QgKnNyYywKKwkJCQkJCSB1MTZfdCBvZmZzZXQsIHUxNl90IGxlbmd0aCkKIHsKLSAgICB1MTZfdCBpOworCXUxNl90IGk7CiAKLSAgICBmb3IoaT0wOyBpPGxlbmd0aDtpKyspCi0gICAgewotICAgICAgICAvL3ptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQraSwgc3JjW2ldKTsKLSAgICAgICAgKih1OF90KikoKHU4X3QqKWJ1Zi0+ZGF0YStvZmZzZXQraSkgPSBzcmNbaV07Ci0gICAgfQorCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkvKiB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0K2ksIHNyY1tpXSk7CSovCisJCSoodThfdCAqKSgodThfdCAqKWJ1Zi0+ZGF0YStvZmZzZXQraSkgPSBzcmNbaV07CisJfQogfQogCi11MTZfdCB6ZndTdGFBZGRJZVdwYVJzbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdThfdCBmcmFtZVR5cGUpCit1MTZfdCB6ZndTdGFBZGRJZVdwYVJzbih6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYsIHUxNl90IG9mZnNldCwgdThfdCBmcmFtZVR5cGUpCiB7Ci0gICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OwotICAgIC8vem1fbXNnMV9tbShaTV9MVl8wLCAiQ1dZIC0gYWRkIHdwYWllIGNvbnRlbnQgTGVuZ3RoIDogIiwgbWFjcC0+c3VwSWVbMV0pOwotICAgIGlmIChtYWNwLT5zdXBJZVsxXSAhPSAwKQotICAgIHsKLSAgICAgICAgY29weVRvSW50VHhCdWZmZXIoZGV2LCBidWYsIG1hY3AtPnN1cEllLCBvZmZzZXQsIG1hY3AtPnN1cEllWzFdKzIpOwotICAgICAgICAvL21lbWNweShidWYtPmRhdGFbb2Zmc2V0XSwgbWFjcC0+c3VwSWUsIG1hY3AtPnN1cEllWzFdKzIpOwotICAgICAgICBvZmZzZXQgKz0gKG1hY3AtPnN1cEllWzFdKzIpOwotICAgIH0KKwlzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisJLyogem1fbXNnMV9tbShaTV9MVl8wLCAiQ1dZIC0gYWRkIHdwYWllIGNvbnRlbnQgTGVuZ3RoIDogIgorCSAqIAkJLCBtYWNwLT5zdXBJZVsxXSk7CisJICovCisJaWYgKG1hY3AtPnN1cEllWzFdICE9IDApIHsKKwkJY29weVRvSW50VHhCdWZmZXIoZGV2LCBidWYsIG1hY3AtPnN1cEllLCBvZmZzZXQsCisJCQkJCSBtYWNwLT5zdXBJZVsxXSsyKTsKKwkJLyogbWVtY3B5KGJ1Zi0+ZGF0YVtvZmZzZXRdLCBtYWNwLT5zdXBJZSwgbWFjcC0+c3VwSWVbMV0rMik7Ki8KKwkJb2Zmc2V0ICs9IChtYWNwLT5zdXBJZVsxXSsyKTsKKwl9CiAKLSAgICByZXR1cm4gb2Zmc2V0OworCXJldHVybiBvZmZzZXQ7CiB9CiAKIC8qIExlYXZlIGFuIGVtcHR5IGxpbmUgYmVsb3cgdG8gcmVtb3ZlIHdhcm5pbmcgbWVzc2FnZSBvbiBzb21lIGNvbXBpbGVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX3VzYi5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF91c2IuYwppbmRleCA3MGZkNDEwLi42YjMzNmVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX3VzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfdXNiLmMKQEAgLTMwLDE1OSArMzAsMTUyIEBACiAjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CiAKLWV4dGVybiB2b2lkIHpmTG54SW5pdFVzYlR4USh6ZGV2X3QqIGRldik7Ci1leHRlcm4gdm9pZCB6ZkxueEluaXRVc2JSeFEoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZMbnhJbml0VXNiVHhRKHpkZXZfdCAqZGV2KTsKK2V4dGVybiB2b2lkIHpmTG54SW5pdFVzYlJ4USh6ZGV2X3QgKmRldik7CiBleHRlcm4gdTMyX3QgemZMbnhTdWJtaXRSZWdJblVyYih6ZGV2X3QgKmRldik7Ci11MzJfdCB6ZkxueFVzYk91dCh6ZGV2X3QqIGRldiwgdThfdCAqaGRyLCB1MTZfdCBoZHJsZW4sIHU4X3QgKnNuYXAsIHUxNl90IHNuYXBMZW4sCi0gICAgICAgIHU4X3QgKnRhaWwsIHUxNl90IHRhaWxMZW4sIHpidWZfdCAqYnVmLCB1MTZfdCBvZmZzZXQpOwotdTMyX3QgemZMbnhVc2JXcml0ZVJlZyh6ZGV2X3QqIGRldiwgdTMyX3QqIGNtZCwgdTE2X3QgY21kTGVuKTsKK3UzMl90IHpmTG54VXNiT3V0KHpkZXZfdCAqZGV2LCB1OF90ICpoZHIsIHUxNl90IGhkcmxlbiwgdThfdCAqc25hcCwKKwkJdTE2X3Qgc25hcExlbiwgdThfdCAqdGFpbCwgdTE2X3QgdGFpbExlbiwgemJ1Zl90ICpidWYsCisJCXUxNl90IG9mZnNldCk7Cit1MzJfdCB6ZkxueFVzYldyaXRlUmVnKHpkZXZfdCAqZGV2LCB1MzJfdCAqY21kLCB1MTZfdCBjbWRMZW4pOwogCi12b2lkIHpmd1VzYlJlZ2lzdGVyQ2FsbEJhY2soemRldl90KiBkZXYsIHN0cnVjdCB6ZkNiVXNiRnVuY1RibCAqemZVc2JGdW5jKSB7Ci0gICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2Owordm9pZCB6ZndVc2JSZWdpc3RlckNhbGxCYWNrKHpkZXZfdCAqZGV2LCBzdHJ1Y3QgemZDYlVzYkZ1bmNUYmwgKnpmVXNiRnVuYykKK3sKKwlzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CiAKLSAgICBtYWNwLT51c2JDYkZ1bmN0aW9ucy56ZmNiVXNiUmVjdiA9IHpmVXNiRnVuYy0+emZjYlVzYlJlY3Y7Ci0gICAgbWFjcC0+dXNiQ2JGdW5jdGlvbnMuemZjYlVzYlJlZ0luID0gemZVc2JGdW5jLT56ZmNiVXNiUmVnSW47Ci0gICAgbWFjcC0+dXNiQ2JGdW5jdGlvbnMuemZjYlVzYk91dENvbXBsZXRlID0gemZVc2JGdW5jLT56ZmNiVXNiT3V0Q29tcGxldGU7CisJbWFjcC0+dXNiQ2JGdW5jdGlvbnMuemZjYlVzYlJlY3YgPSB6ZlVzYkZ1bmMtPnpmY2JVc2JSZWN2OworCW1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JSZWdJbiA9IHpmVXNiRnVuYy0+emZjYlVzYlJlZ0luOworCW1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JPdXRDb21wbGV0ZSA9IHpmVXNiRnVuYy0+emZjYlVzYk91dENvbXBsZXRlOwogCi0gICAgcmV0dXJuOworCXJldHVybjsKIH0KIAotdTMyX3QgemZ3VXNiR2V0RnJlZVR4UVNpemUoemRldl90KiBkZXYpCit1MzJfdCB6ZndVc2JHZXRGcmVlVHhRU2l6ZSh6ZGV2X3QgKmRldikKIHsKLSAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7Ci0gICAgdTMyX3QgICAgICAgIGZyZWVUeFFTaXplOwotICAgIHVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKLSAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisJc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCXUzMl90CQlmcmVlVHhRU2l6ZTsKKwl1bnNpZ25lZCBsb25nIGlycUZsYWc7CisJLyogem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsJKi8KIAotICAgIC8vem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKLSAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisJLyogem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsJKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CiAKLSAgICBmcmVlVHhRU2l6ZSA9IFpNX01BWF9UWF9CVUZfTlVNIC0gbWFjcC0+VHhCdWZDbnQ7CisJZnJlZVR4UVNpemUgPSBaTV9NQVhfVFhfQlVGX05VTSAtIG1hY3AtPlR4QnVmQ250OwogCi0gICAgLy96bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOwotICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCS8qIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CSovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CiAKLSAgICByZXR1cm4gZnJlZVR4UVNpemU7CisJcmV0dXJuIGZyZWVUeFFTaXplOwogfQogCi11MzJfdCB6ZndVc2JHZXRNYXhUeFFTaXplKHpkZXZfdCogZGV2KQordTMyX3QgemZ3VXNiR2V0TWF4VHhRU2l6ZSh6ZGV2X3QgKmRldikKIHsKLSAgICByZXR1cm4gWk1fTUFYX1RYX0JVRl9OVU07CisJcmV0dXJuIFpNX01BWF9UWF9CVUZfTlVNOwogfQogCiB1MzJfdCB6ZndVc2JFbmFibGVJbnRFcHQoemRldl90ICpkZXYsIHU4X3QgZW5kcHQpCiB7Ci0gICAgLyogSW5pdGlhbGl6ZSBVU0IgVHhRICovCi0gICAgemZMbnhJbml0VXNiVHhRKGRldik7CisJLyogSW5pdGlhbGl6ZSBVU0IgVHhRICovCisJemZMbnhJbml0VXNiVHhRKGRldik7CiAKLSAgICAvKiBJbml0aWFsaXplIFVTQiBSeFEgKi8KLSAgICB6ZkxueEluaXRVc2JSeFEoZGV2KTsKKwkvKiBJbml0aWFsaXplIFVTQiBSeFEgKi8KKwl6ZkxueEluaXRVc2JSeFEoZGV2KTsKIAotICAgIC8qIEluaXRpYWxpemUgVVNCIFJlZ2lzdGVyIEluIFVSQiAqLwotICAgIC8vemZ3VXNiU3VibWl0UmVnSW4oZGV2KTsKLSAgICAvKiBJbml0aWFsaXplIFVTQiBSZWdpc3RlciBJbiBVUkIgKi8KLSAgICB6ZkxueFN1Ym1pdFJlZ0luVXJiKGRldik7CisJLyogSW5pdGlhbGl6ZSBVU0IgUmVnaXN0ZXIgSW4gVVJCICovCisJLyogemZ3VXNiU3VibWl0UmVnSW4oZGV2KTsJKi8KKwkvKiBJbml0aWFsaXplIFVTQiBSZWdpc3RlciBJbiBVUkIgKi8KKwl6ZkxueFN1Ym1pdFJlZ0luVXJiKGRldik7CiAKLSAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAotaW50IHpmd1VzYkVuYWJsZVJ4RXB0KHpkZXZfdCogZGV2LCB1OF90IGVuZHB0KQoraW50IHpmd1VzYkVuYWJsZVJ4RXB0KHpkZXZfdCAqZGV2LCB1OF90IGVuZHB0KQogewotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCi11MzJfdCB6ZndVc2JTdWJtaXRDb250cm9sKHpkZXZfdCogZGV2LCB1OF90IHJlcSwgdTE2X3QgdmFsdWUsIHUxNl90IGluZGV4LCB2b2lkICpkYXRhLCB1MzJfdCBzaXplKQordTMyX3QgemZ3VXNiU3VibWl0Q29udHJvbCh6ZGV2X3QgKmRldiwgdThfdCByZXEsIHUxNl90IHZhbHVlLCB1MTZfdCBpbmRleCwKKwkJCSB2b2lkICpkYXRhLCB1MzJfdCBzaXplKQogewotICAgIGludCByZXN1bHQgPSAwOwotICAgIHUzMl90IHJldCA9IDA7Ci0gICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OwotICAgIHU4X3QqIGJ1ZjsKKwlpbnQgcmVzdWx0ID0gMDsKKwl1MzJfdCByZXQgPSAwOworCXN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKwl1OF90ICpidWY7CiAKLSAgICBpZiAoc2l6ZSA+IDApCi0gICAgewotICAgICAgICBidWYgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwotICAgICAgICBtZW1jcHkoYnVmLCAodThfdCopZGF0YSwgc2l6ZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGJ1ZiA9IE5VTEw7Ci0gICAgfQorCWlmIChzaXplID4gMCkgeworCQlidWYgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCQltZW1jcHkoYnVmLCAodThfdCAqKWRhdGEsIHNpemUpOworCX0gZWxzZQorCQlidWYgPSBOVUxMOwogCiAjaWYgMAotICAgIHByaW50ayhLRVJOX0VSUiAicmVxID0gMHglMDJ4XG4iLCByZXEpOwotICAgIHByaW50ayhLRVJOX0VSUiAidmFsdWUgPSAweCUwNHhcbiIsIHZhbHVlKTsKLSAgICBwcmludGsoS0VSTl9FUlIgImluZGV4ID0gMHglMDR4XG4iLCBpbmRleCk7Ci0gICAgcHJpbnRrKEtFUk5fRVJSICJkYXRhID0gMHglbHhcbiIsICh1MzJfdCkgZGF0YSk7Ci0gICAgcHJpbnRrKEtFUk5fRVJSICJzaXplID0gJWxkXG4iLCBzaXplKTsKKwlwcmludGsoS0VSTl9FUlIgInJlcSA9IDB4JTAyeFxuIiwgcmVxKTsKKwlwcmludGsoS0VSTl9FUlIgInZhbHVlID0gMHglMDR4XG4iLCB2YWx1ZSk7CisJcHJpbnRrKEtFUk5fRVJSICJpbmRleCA9IDB4JTA0eFxuIiwgaW5kZXgpOworCXByaW50ayhLRVJOX0VSUiAiZGF0YSA9IDB4JWx4XG4iLCAodTMyX3QpIGRhdGEpOworCXByaW50ayhLRVJOX0VSUiAic2l6ZSA9ICVsZFxuIiwgc2l6ZSk7CiAjZW5kaWYKIAotICAgIHJlc3VsdCA9IHVzYl9jb250cm9sX21zZyhtYWNwLT51ZGV2LCB1c2Jfc25kY3RybHBpcGUobWFjcC0+dWRldiwgMCksCi0gICAgICAgICAgICByZXEsIFVTQl9ESVJfT1VUIHwgMHg0MCwgdmFsdWUsIGluZGV4LCBidWYsIHNpemUsIEhaKTsKKwlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2cobWFjcC0+dWRldiwgdXNiX3NuZGN0cmxwaXBlKG1hY3AtPnVkZXYsIDApLAorCQkJcmVxLCBVU0JfRElSX09VVCB8IDB4NDAsIHZhbHVlLCBpbmRleCwgYnVmLCBzaXplLCBIWik7CiAKLSAgICBpZiAocmVzdWx0IDwgMCkKLSAgICB7Ci0gICAgICAgIHByaW50aygiemZ3VXNiU3VibWl0Q29udHJvbCgpIGZhaWxlZCwgcmVzdWx0PTB4JXhcbiIsIHJlc3VsdCk7Ci0gICAgICAgIHJldCA9IDE7Ci0gICAgfQotICAgIGtmcmVlKGJ1Zik7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ6ZndVc2JTdWJtaXRDb250cm9sKCkgZmFpbGVkLCByZXN1bHQgPSAweCV4XG4iLAorCQkJcmVzdWx0KTsKKwkJcmV0ID0gMTsKKwl9CisJa2ZyZWUoYnVmKTsKIAotICAgIHJldHVybiByZXQ7CisJcmV0dXJuIHJldDsKIH0KIAotdm9pZCB6ZndVc2JDbWQoemRldl90KiBkZXYsIHU4X3QgZW5kcHQsIHUzMl90KiBjbWQsIHUxNl90IGNtZExlbikKK3ZvaWQgemZ3VXNiQ21kKHpkZXZfdCAqZGV2LCB1OF90IGVuZHB0LCB1MzJfdCAqY21kLCB1MTZfdCBjbWRMZW4pCiB7Ci0gICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OwotICAgIHUzMl90IHJldDsKKwlzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisJdTMyX3QgcmV0OwogCi0gICAgLy9NUFVzYkNvbW1hbmQoZGV2LCBlbmRwdCwgY21kLCBjbWRMZW4pOwotICAgIHJldCA9IHpmTG54VXNiV3JpdGVSZWcoZGV2LCBjbWQsIGNtZExlbik7CisJLyogTVBVc2JDb21tYW5kKGRldiwgZW5kcHQsIGNtZCwgY21kTGVuKTsJKi8KKwlyZXQgPSB6ZkxueFVzYldyaXRlUmVnKGRldiwgY21kLCBjbWRMZW4pOwogCi0gICAgLyogaWYgemZMbnhVc2JXcml0ZVJlZygpIHJldHVybiBlcnJvciwgZnJlZSBhbmQgYWxsb2NhdGUgdXJiLCByZXNlbmQgYWdhaW4gKi8KLSAgICBpZiAocmV0ICE9IDApCi0gICAgewotICAgICAgICB1c2JfZnJlZV91cmIobWFjcC0+UmVnT3V0VXJiKTsKLSAgICAgICAgbWFjcC0+UmVnT3V0VXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKLSAgICAgICAgcmV0ID0gemZMbnhVc2JXcml0ZVJlZyhkZXYsIGNtZCwgY21kTGVuKTsKLSAgICB9CisJLyoKKwkgKiBpZiB6ZkxueFVzYldyaXRlUmVnKCkgcmV0dXJuIGVycm9yLCBmcmVlIGFuZCBhbGxvY2F0ZSB1cmIsCisJICogcmVzZW5kIGFnYWluCisJICovCisJaWYgKHJldCAhPSAwKSB7CisJCXVzYl9mcmVlX3VyYihtYWNwLT5SZWdPdXRVcmIpOworCQltYWNwLT5SZWdPdXRVcmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOworCQlyZXQgPSB6ZkxueFVzYldyaXRlUmVnKGRldiwgY21kLCBjbWRMZW4pOworCX0KIH0KIAotdTMyX3QgemZ3VXNiU2VuZCh6ZGV2X3QqIGRldiwgdThfdCBlbmRwdCwgdThfdCAqaGRyLCB1MTZfdCBoZHJsZW4sIHU4X3QgKnNuYXAsIHUxNl90IHNuYXBMZW4sCi0gICAgICAgICAgICAgICAgdThfdCAqdGFpbCwgdTE2X3QgdGFpbExlbiwgemJ1Zl90ICpidWYsIHUxNl90IG9mZnNldCkKK3UzMl90IHpmd1VzYlNlbmQoemRldl90ICpkZXYsIHU4X3QgZW5kcHQsIHU4X3QgKmhkciwgdTE2X3QgaGRybGVuLCB1OF90ICpzbmFwLAorCQkJdTE2X3Qgc25hcExlbiwJdThfdCAqdGFpbCwgdTE2X3QgdGFpbExlbiwKKwkJCXpidWZfdCAqYnVmLCB1MTZfdCBvZmZzZXQpCiB7Ci0gICAgdTMyX3Qgc3RhdHVzOworCXUzMl90IHN0YXR1czsKIAogI2lmZGVmIFpNX0NPTkZJR19CSUdfRU5ESUFOCi0gICAgdTMyX3QgaWkgPSAwOwotICAgIHUxNl90ICpwYyA9IE5VTEw7CisJdTMyX3QgaWkgPSAwOworCXUxNl90ICpwYyA9IE5VTEw7CiAKLSAgICBwYyA9ICh1MTZfdCAqKWhkcjsKLSAgICBmb3IoaWk9MDsgaWk8KGhkcmxlbj4+MSk7IGlpKyspCi0gICAgewotICAgICAgICBwY1tpaV0gPSBjcHVfdG9fbGUxNihwY1tpaV0pOwotICAgIH0KKwlwYyA9ICh1MTZfdCAqKWhkcjsKKwlmb3IgKGlpID0gMDsgaWkgPCAoaGRybGVuID4+IDEpOyBpaSsrKQorCQlwY1tpaV0gPSBjcHVfdG9fbGUxNihwY1tpaV0pOwogCi0gICAgcGMgPSAodTE2X3QgKilzbmFwOwotICAgIGZvcihpaT0wOyBpaTwoc25hcExlbj4+MSk7IGlpKyspCi0gICAgewotICAgICAgICBwY1tpaV0gPSBjcHVfdG9fbGUxNihwY1tpaV0pOwotICAgIH0KKwlwYyA9ICh1MTZfdCAqKXNuYXA7CisJZm9yIChpaSA9IDA7IGlpIDwgKHNuYXBMZW4gPj4gMSk7IGlpKyspCisJCXBjW2lpXSA9IGNwdV90b19sZTE2KHBjW2lpXSk7CiAKLSAgICBwYyA9ICh1MTZfdCAqKXRhaWw7Ci0gICAgZm9yKGlpPTA7IGlpPCh0YWlsTGVuPj4xKTsgaWkrKykKLSAgICB7Ci0gICAgICAgIHBjW2lpXSA9IGNwdV90b19sZTE2KHBjW2lpXSk7Ci0gICAgfQorCXBjID0gKHUxNl90ICopdGFpbDsKKwlmb3IgKGlpID0gMDsgaWkgPCAodGFpbExlbj4+MSk7IGlpKyspCisJCXBjW2lpXSA9IGNwdV90b19sZTE2KHBjW2lpXSk7CiAjZW5kaWYKIAotICAgIHN0YXR1cyA9IHpmTG54VXNiT3V0KGRldiwgaGRyLCBoZHJsZW4sIHNuYXAsIHNuYXBMZW4sIHRhaWwsIHRhaWxMZW4sIGJ1Ziwgb2Zmc2V0KTsKLSAgICBpZiAoIHN0YXR1cyA9PSAwICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9CisJc3RhdHVzID0gemZMbnhVc2JPdXQoZGV2LCBoZHIsIGhkcmxlbiwgc25hcCwgc25hcExlbiwgdGFpbCwgdGFpbExlbiwKKwkJCQlidWYsIG9mZnNldCk7CisJaWYgKHN0YXR1cyA9PSAwKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAxOwogfQogCiAvKiBMZWF2ZSBhbiBlbXB0eSBsaW5lIGJlbG93IHRvIHJlbW92ZSB3YXJuaW5nIG1lc3NhZ2Ugb24gc29tZSBjb21waWxlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvemR1c2IuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3pkdXNiLmgKaW5kZXggOWY4YWIyZS4uOTdlNGVmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvemR1c2IuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy96ZHVzYi5oCkBAIC0zNCwxMCArMzQsMTAgQEAKICNkZWZpbmUgVkVSU0lPTklEICAgICAgICAgICAgICAgIjAuMC4wLjk5OSIKIAogLyogRGVmaW5lIHRoZXNlIHZhbHVlcyB0byBtYXRjaCB5b3VyIGRldmljZSAqLwotI2RlZmluZSBWRU5ET1JfQVRIUiAgICAgICAgICAgICAweDBDRjMgIC8vQXRoZXJvcworI2RlZmluZSBWRU5ET1JfQVRIUiAgICAgICAgICAgICAweDBDRjMgIC8qIEF0aGVyb3MgKi8KICNkZWZpbmUgUFJPRFVDVF9BUjkxNzAgICAgICAgICAgMHg5MTcwCiAKLSNkZWZpbmUgVkVORE9SX0RMSU5LICAgICAgICAgICAgMHgwN0QxICAvL0RsaW5rCisjZGVmaW5lIFZFTkRPUl9ETElOSyAgICAgICAgICAgIDB4MDdEMSAgLyogRGxpbmsgKi8KICNkZWZpbmUgUFJPRFVDVF9EV0ExNjBBICAgICAgICAgMHgzQzEwCiAKICNkZWZpbmUJVkVORE9SX05FVEdFQVIJCTB4MDg0NgkvKiBOZXRHZWFyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcDlhdXRoL3A5YXV0aC5jIGIvZHJpdmVycy9zdGFnaW5nL3A5YXV0aC9wOWF1dGguYwppbmRleCA4Y2NmZmY3Li5kYjc5NjI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcDlhdXRoL3A5YXV0aC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9wOWF1dGgvcDlhdXRoLmMKQEAgLTMzNCw2ICszMzQsNyBAQAogCS5yZWxlYXNlID0gY2FwX3JlbGVhc2UsCiB9OwogCisvKiBubyBfX2V4aXQgaGVyZSBiZWNhdXNlIGl0IGNhbiBiZSBjYWxsZWQgYnkgdGhlIGluaXQgZnVuY3Rpb24gKi8KIHN0YXRpYyB2b2lkIGNhcF9jbGVhbnVwX21vZHVsZSh2b2lkKQogewogCWludCBpOwpAQCAtMzYwLDcgKzM2MSw3IEBACiAJCXByaW50ayhLRVJOX05PVElDRSAiRXJyb3IgJWQgYWRkaW5nIGNhcCVkIiwgZXJyLCBpbmRleCk7CiB9CiAKLXN0YXRpYyBpbnQgY2FwX2luaXRfbW9kdWxlKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBjYXBfaW5pdF9tb2R1bGUodm9pZCkKIHsKIAlpbnQgcmVzdWx0LCBpOwogCWRldl90IGRldiA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcGhpc29uL3BoaXNvbi5jIGIvZHJpdmVycy9zdGFnaW5nL3BoaXNvbi9waGlzb24uYwppbmRleCAyNzBlYmNiLi4zODE3ZDc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcGhpc29uL3BoaXNvbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9waGlzb24vcGhpc29uLmMKQEAgLTg3LDEyICs4NywxMiBAQAogI2VuZGlmCiB9OwogCi1zdGF0aWMgaW50IHBoaXNvbl9pZGVfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgcGhpc29uX2lkZV9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnBoaXNvbl9wY2lfZHJpdmVyKTsKIH0KIAotc3RhdGljIHZvaWQgcGhpc29uX2lkZV9leGl0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgcGhpc29uX2lkZV9leGl0KHZvaWQpCiB7CiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZwaGlzb25fcGNpX2RyaXZlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcG9jaC9SRUFETUUgYi9kcml2ZXJzL3N0YWdpbmcvcG9jaC9SRUFETUUKaW5kZXggODQyYWZkNC4uYWM3NmZmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3BvY2gvUkVBRE1FCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9wb2NoL1JFQURNRQpAQCAtMSw3ICsxLDYgQEAKIFRPRE86CiAJLSBSeCBibG9jayBzaXplIGlzIGxpbWl0ZWQgdG8gPCAyMDQ4LCBoYXJkd2FyZSBidWc/CiAJLSBHcm91cCBzaXplIGlzIGxpbWl0ZWQgdG8gPCBwYWdlIHNpemUsIGtlcm5lbCBhbGxvYy9tbWFwIEFQSSBpc3N1ZXMKLQktIGZpeC93b3JrYXJvdW5kIGNhY2hlIGlzc3VlcyBpbiBjaXJjdWxhciBidWZmZXIgaGVhZGVyCiAJLSB0ZXN0IHdoZXRoZXIgVHggaXMgdHJhbnNtaXR0aW5nIGRhdGEgZnJvbSBwcm92aWRlZCBidWZmZXJzCiAJLSBoYW5kbGUgZGV2aWNlIHVucGx1ZyBjYXNlCiAJLSBoYW5kbGUgdGVtcGVyYXR1cmUgYWJvdmUgdGhyZXNob2xkCkBAIC0xMCw1ICs5LDEyOCBAQAogCS0gYXVkaXQgdXNlcnNwYWNlIGludGVyZmFjZXMKIAktIGdldCByZXNlcnZlZCBtYWpvci9taW5vciBpZiBuZWVkZWQKIAorU2FtcGxlIENvZGU6CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8cG9sbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJyb3IuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxzeXNmcy9saWJzeXNmcy5oPgorCisjaW5jbHVkZSA8cG9jaC5oPgorCitzdHJ1Y3QgcGNvbnN1bWUgeworCXVpbnQzMl90ICogb2Zmc2V0czsKKwl1aW50MzJfdCBuZmV0Y2g7CisJdWludDMyX3QgbmZsdXNoOworfTsKKwordWludDMyX3Qgb2Zmc2V0c1sxMF07CisKK3ZvaWQgcHJvY2Vzc19ncm91cCh1bnNpZ25lZCBjaGFyICpidWYsIHVpbnQzMl90IHNpemUpCit7CisJdWludDE2X3QgKmJ1ZjE2ID0gKHVpbnQxNl90ICopYnVmOworCisJcHJpbnRmKCJSWDogJXAgJXUgJTA0eCAlMDR4ICUwNHggJTA0eCAlMDR4ICUwNHhcbiIsIGJ1Ziwgc2l6ZSwKKwkgICAgICAgYnVmMTZbMF0sIGJ1ZjE2WzFdLCBidWYxNlsyXSwgYnVmMTZbM10sIGJ1ZjE2WzRdLCBidWYxNls1XSk7Cit9CisKK2ludCBtYWluKCkKK3sKKwlzdHJ1Y3Qgc3lzZnNfYXR0cmlidXRlICphdHRyOworCWNoYXIgKnBhdGg7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIG1tYXBfc2l6ZTsKKwlpbnQgZmQ7CisJdW5zaWduZWQgY2hhciAqY2J1ZjsKKworCXVpbnQzMl90IG5mbHVzaDsKKwlzdHJ1Y3QgcG9sbGZkIHBvbGxfZmRzOworCWludCBjb3VudCA9IDA7CisJaW50IGk7CisKKwlwYXRoID0gIi9zeXMvY2xhc3MvcG9ja2V0Y2hhbmdlL3BvY2gwL2NoMC9ibG9ja19zaXplIjsKKwlhdHRyID0gc3lzZnNfb3Blbl9hdHRyaWJ1dGUocGF0aCk7CisJcmV0ID0gc3lzZnNfd3JpdGVfYXR0cmlidXRlKGF0dHIsICIyNTYiLCBzdHJsZW4oIjI1NiIpKTsKKwlpZiAocmV0ID09IC0xKQorCQllcnJvcigxLCBlcnJubywgImVycm9yIHdyaXRpbmcgYXR0cmlidXRlICVzIiwgcGF0aCk7CisJc3lzZnNfY2xvc2VfYXR0cmlidXRlKGF0dHIpOworCisJcGF0aCA9ICIvc3lzL2NsYXNzL3BvY2tldGNoYW5nZS9wb2NoMC9jaDAvZ3JvdXBfc2l6ZSI7CisJYXR0ciA9IHN5c2ZzX29wZW5fYXR0cmlidXRlKHBhdGgpOworCXJldCA9IHN5c2ZzX3dyaXRlX2F0dHJpYnV0ZShhdHRyLCAiNDA5NiIsIHN0cmxlbigiNDA5NiIpKTsKKwlpZiAocmV0ID09IC0xKQorCQllcnJvcigxLCBlcnJubywgImVycm9yIHdyaXRpbmcgYXR0cmlidXRlICVzIiwgcGF0aCk7CisJc3lzZnNfY2xvc2VfYXR0cmlidXRlKGF0dHIpOworCisJcGF0aCA9ICIvc3lzL2NsYXNzL3BvY2tldGNoYW5nZS9wb2NoMC9jaDAvZ3JvdXBfY291bnQiOworCWF0dHIgPSBzeXNmc19vcGVuX2F0dHJpYnV0ZShwYXRoKTsKKwlyZXQgPSBzeXNmc193cml0ZV9hdHRyaWJ1dGUoYXR0ciwgIjY0Iiwgc3RybGVuKCI2NCIpKTsKKwlpZiAocmV0ID09IC0xKQorCQllcnJvcigxLCBlcnJubywgImVycm9yIHdyaXRpbmcgYXR0cmlidXRlICVzIiwgcGF0aCk7CisJc3lzZnNfY2xvc2VfYXR0cmlidXRlKGF0dHIpOworCisJZmQgPSBvcGVuKCIvZGV2L2NoMCIsIE9fUkRXUik7CisJaWYgKGZkID09IC0xKQorCQllcnJvcigxLCBlcnJubywgImVycm9yIG9wZW5pbmcgZGV2aWNlIG5vZGUiKTsKKworCXBhdGggPSAiL3N5cy9jbGFzcy9wb2NrZXRjaGFuZ2UvcG9jaDAvY2gwL21tYXBfc2l6ZSI7CisJYXR0ciA9IHN5c2ZzX29wZW5fYXR0cmlidXRlKHBhdGgpOworCXJldCA9IHN5c2ZzX3JlYWRfYXR0cmlidXRlKGF0dHIpOworCWlmIChyZXQgPT0gLTEpCisJCWVycm9yKDEsIGVycm5vLCAiZXJyb3IgcmVhZGluZyBhdHRyaWJ1dGUgJXMiLCBwYXRoKTsKKwlwcmludGYoIiVzIiwgYXR0ci0+dmFsdWUpOworCXNzY2FuZihhdHRyLT52YWx1ZSwgIiVsdSIsICZtbWFwX3NpemUpOworCXN5c2ZzX2Nsb3NlX2F0dHJpYnV0ZShhdHRyKTsKKworCWNidWYgPSBtbWFwKE5VTEwsIG1tYXBfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKwkJICAgIE1BUF9QUklWQVRFLCBmZCwgMCk7CisJaWYgKGNidWYgPT0gTUFQX0ZBSUxFRCkKKwkJZXJyb3IoMSwgZXJybm8sICJlcnJvciBtYXBwaW5nIERNQSBidWZmZXJzIik7CisKKwlyZXQgPSBpb2N0bChmZCwgUE9DSF9JT0NfVFJBTlNGRVJfU1RBUlQsIDApOworCWlmIChyZXQgPT0gLTEpCisJCWVycm9yKDEsIGVycm5vLCAiZXJyb3Igc3RhcnRpbmcgdHJhbnNmZXIiKTsKKworCW5mbHVzaCA9IDA7CisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IHBjb25zdW1lIGNvbnN1bWU7CisKKwkJY29uc3VtZS5vZmZzZXRzID0gb2Zmc2V0czsKKwkJY29uc3VtZS5uZmV0Y2ggPSAxMDsKKwkJY29uc3VtZS5uZmx1c2ggPSBuZmx1c2g7CisKKwkJcmV0ID0gaW9jdGwoZmQsIFBPQ0hfSU9DX0NPTlNVTUUsICZjb25zdW1lKTsKKwkJaWYgKHJldCA9PSAtMSkKKwkJCWVycm9yKDEsIGVycm5vLCAiZXJyb3IgY29uc3VtaW5nIGdyb3VwcyIpOworCisJCW5mbHVzaCA9IGNvbnN1bWUubmZldGNoOworCisJCWZvciAoaSA9IDA7IGkgPCBuZmx1c2g7IGkrKykgeworCQkJcHJvY2Vzc19ncm91cChjYnVmICsgY29uc3VtZS5vZmZzZXRzW2ldLCA0MDk2KTsKKworCQkJY291bnQrKzsKKwkJCWlmIChjb3VudCA9PSAxMDAwKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGNvdW50ID09IDEwMDApCisJCQlicmVhazsKKwl9CisKKwlyZXQgPSBpb2N0bChmZCwgUE9DSF9JT0NfVFJBTlNGRVJfU1RPUCwgMCk7CisJaWYgKHJldCA9PSAtMSkKKwkJZXJyb3IoMSwgZXJybm8sICJlcnJvciBzdGFydGluZyB0cmFuc2ZlciIpOworCisJcmV0dXJuIDA7Cit9CisKIFBsZWFzZSBzZW5kIHBhdGNoZXMgdG8gR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4gYW5kCiBWaWpheSBLdW1hciA8dmlqYXlrdW1hckBicmF2ZWdudS5vcmc+IGFuZCBKYXlhIEt1bWFyIDxqYXlha3VtYXIubGttbEBnbWFpbC5jb20+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcG9jaC9wb2NoLmMgYi9kcml2ZXJzL3N0YWdpbmcvcG9jaC9wb2NoLmMKaW5kZXggMmViOGUzZC4uOTA5NTE1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3BvY2gvcG9jaC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9wb2NoL3BvY2guYwpAQCAtMTk3LDEwICsxOTcsOSBAQAogCiAJLyogQ29udGFpbnMgdGhlIGhlYWRlciBhbmQgY2lyY3VsYXIgYnVmZmVyIGV4cG9ydGVkIHRvIHVzZXJzcGFjZS4gKi8KIAlzcGlubG9ja190IGdyb3VwX29mZnNldHNfbG9jazsKLQlzdHJ1Y3QgcG9jaF9jYnVmX2hlYWRlciAqaGVhZGVyOwotCXN0cnVjdCBwYWdlICpoZWFkZXJfcGc7Ci0JdW5zaWduZWQgbG9uZyBoZWFkZXJfc2l6ZTsKIAorCS8qIExhc3QgZ3JvdXAgY29uc3VtZWQgYnkgdXNlciBzcGFjZS4gKi8KKwl1bnNpZ25lZCBpbnQgY29uc3VtZWQ7CiAJLyogTGFzdCBncm91cCBpbmRpY2F0ZWQgYXMgJ2NvbXBsZXRlJyB0byB1c2VyIHNwYWNlLiAqLwogCXVuc2lnbmVkIGludCB0cmFuc2ZlcjsKIApAQCAtMjQ1LDYgKzI0NCwxNiBAQAogCXN0cnVjdCBkZXZpY2UgKmRldjsKIH07CiAKK3N0YXRpYyBpbnQgc3ludGhfcng7Cittb2R1bGVfcGFyYW0oc3ludGhfcngsIGJvb2wsIDA2MDApOworTU9EVUxFX1BBUk1fREVTQyhzeW50aF9yeCwKKwkJIlN5bnRoZXNpemUgcmVjZWl2ZWQgdmFsdWVzIHVzaW5nIGEgY291bnRlci4gRGVmYXVsdDogTm8iKTsKKworc3RhdGljIGludCBsb29wYmFjazsKK21vZHVsZV9wYXJhbShsb29wYmFjaywgYm9vbCwgMDYwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGxvb3BiYWNrLAorCQkiRW5hYmxlIGhhcmR3YXJlIGxvb3BiYWNrIG9mIHRyYXNubWl0dGVkIGRhdGEuIERlZmF1bHQ6IE5vIik7CisKIHN0YXRpYyBkZXZfdCBwb2NoX2ZpcnN0X2RldjsKIHN0YXRpYyBzdHJ1Y3QgY2xhc3MgKnBvY2hfY2xzOwogc3RhdGljIERFRklORV9JRFIocG9jaF9pZHMpOwpAQCAtMzE3LDE0ICszMjYsMTIgQEAKIAlpbnQgbGVuOwogCXVuc2lnbmVkIGxvbmcgbW1hcF9zaXplOwogCXVuc2lnbmVkIGxvbmcgZ3JvdXBfcGFnZXM7Ci0JdW5zaWduZWQgbG9uZyBoZWFkZXJfcGFnZXM7CiAJdW5zaWduZWQgbG9uZyB0b3RhbF9ncm91cF9wYWdlczsKIAogCWdyb3VwX3BhZ2VzID0gbnBhZ2VzKGNoYW5uZWwtPmdyb3VwX3NpemUpOwotCWhlYWRlcl9wYWdlcyA9IG5wYWdlcyhjaGFubmVsLT5oZWFkZXJfc2l6ZSk7CiAJdG90YWxfZ3JvdXBfcGFnZXMgPSBncm91cF9wYWdlcyAqIGNoYW5uZWwtPmdyb3VwX2NvdW50OwogCi0JbW1hcF9zaXplID0gKGhlYWRlcl9wYWdlcyArIHRvdGFsX2dyb3VwX3BhZ2VzKSAqIFBBR0VfU0laRTsKKwltbWFwX3NpemUgPSB0b3RhbF9ncm91cF9wYWdlcyAqIFBBR0VfU0laRTsKIAlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVsdVxuIiwgbW1hcF9zaXplKTsKIAlyZXR1cm4gbGVuOwogfQpAQCAtMzU3LDEwICszNjQsOCBAQAogewogCXVuc2lnbmVkIGxvbmcgaTsKIAl1bnNpZ25lZCBsb25nIGdyb3VwX3BhZ2VzOwotCXVuc2lnbmVkIGxvbmcgaGVhZGVyX3BhZ2VzOwogCiAJZ3JvdXBfcGFnZXMgPSBucGFnZXMoY2hhbm5lbC0+Z3JvdXBfc2l6ZSk7Ci0JaGVhZGVyX3BhZ2VzID0gbnBhZ2VzKGNoYW5uZWwtPmhlYWRlcl9zaXplKTsKIAogCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsLT5ncm91cF9jb3VudDsgaSsrKSB7CiAJCXN0cnVjdCBwb2NoX2dyb3VwX2luZm8gKmdyb3VwOwpAQCAtMzkwLDggKzM5NSw3IEBACiAJCSAqIHRoaXM/CiAJCSAqLwogCQlncm91cC0+ZG1hX2FkZHIgPSBwYWdlX3RvX3Bmbihncm91cC0+cGcpICogUEFHRV9TSVpFOwotCQlncm91cC0+dXNlcl9vZmZzZXQgPQotCQkJKGhlYWRlcl9wYWdlcyArIChpICogZ3JvdXBfcGFnZXMpKSAqIFBBR0VfU0laRTsKKwkJZ3JvdXAtPnVzZXJfb2Zmc2V0ID0gKGkgKiBncm91cF9wYWdlcykgKiBQQUdFX1NJWkU7CiAKIAkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVsZDogdXNlcl9vZmZzZXQ6IDB4JWx4XG4iLCBpLAogCQkgICAgICAgZ3JvdXAtPnVzZXJfb2Zmc2V0KTsKQEAgLTQ3Niw3ICs0ODAsNyBAQAogCQkgIGZwZ2EgKyBibG9ja19jb3VudF9yZWcpOwogCWlvd3JpdGUzMihjaGFubmVsLT5ncm91cF9jb3VudCwgZnBnYSArIGdyb3VwX2NvdW50X3JlZyk7CiAJLyogRklYTUU6IEhhcmRjb2RlZCBncm91cHMgcGVyIGludC4gR2V0IGl0IGZyb20gc3lzZnM/ICovCi0JaW93cml0ZTMyKDEsIGZwZ2EgKyBncm91cHNfcGVyX2ludF9yZWcpOworCWlvd3JpdGUzMigxNiwgZnBnYSArIGdyb3Vwc19wZXJfaW50X3JlZyk7CiAKIAkvKiBVbmxvY2sgUENJIGFkZHJlc3M/IE5vdCBkZWZpbmVkIGluIHRoZSBkYXRhIHNoZWV0LCBidXQgdXNlZAogCSAqIGluIHRoZSByZWZlcmVuY2UgY29kZSBieSBSZWRyYXBpZHMuCkBAIC01MTMsNTYgKzUxNyw2IEBACiAKIH0KIAotc3RhdGljIGludCBwb2NoX2NoYW5uZWxfYWxsb2NfaGVhZGVyKHN0cnVjdCBjaGFubmVsX2luZm8gKmNoYW5uZWwpCi17Ci0Jc3RydWN0IHBvY2hfY2J1Zl9oZWFkZXIgKmhlYWRlciA9IGNoYW5uZWwtPmhlYWRlcjsKLQl1bnNpZ25lZCBsb25nIGdyb3VwX29mZnNldF9zaXplOwotCXVuc2lnbmVkIGxvbmcgdG90X2dyb3VwX29mZnNldHNfc2l6ZTsKLQotCS8qIEFsbG9jYXRlIG1lbW9yeSB0byBob2xkIGhlYWRlciBleHBvcnRlZCB1c2Vyc3BhY2UgKi8KLQlncm91cF9vZmZzZXRfc2l6ZSA9IHNpemVvZihoZWFkZXItPmdyb3VwX29mZnNldHNbMF0pOwotCXRvdF9ncm91cF9vZmZzZXRzX3NpemUgPSBncm91cF9vZmZzZXRfc2l6ZSAqIGNoYW5uZWwtPmdyb3VwX2NvdW50OwotCWNoYW5uZWwtPmhlYWRlcl9zaXplID0gc2l6ZW9mKCpoZWFkZXIpICsgdG90X2dyb3VwX29mZnNldHNfc2l6ZTsKLQljaGFubmVsLT5oZWFkZXJfcGcgPSBhbGxvY19wYWdlcyhHRlBfS0VSTkVMIHwgX19HRlBfWkVSTywKLQkJCQkJIGdldF9vcmRlcihjaGFubmVsLT5oZWFkZXJfc2l6ZSkpOwotCWlmICghY2hhbm5lbC0+aGVhZGVyX3BnKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWNoYW5uZWwtPmhlYWRlciA9IHBhZ2VfYWRkcmVzcyhjaGFubmVsLT5oZWFkZXJfcGcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHBvY2hfY2hhbm5lbF9mcmVlX2hlYWRlcihzdHJ1Y3QgY2hhbm5lbF9pbmZvICpjaGFubmVsKQotewotCXVuc2lnbmVkIGludCBvcmRlcjsKLQotCW9yZGVyID0gZ2V0X29yZGVyKGNoYW5uZWwtPmhlYWRlcl9zaXplKTsKLQlfX2ZyZWVfcGFnZXMoY2hhbm5lbC0+aGVhZGVyX3BnLCBvcmRlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHBvY2hfY2hhbm5lbF9pbml0X2hlYWRlcihzdHJ1Y3QgY2hhbm5lbF9pbmZvICpjaGFubmVsKQotewotCWludCBpOwotCXN0cnVjdCBwb2NoX2dyb3VwX2luZm8gKmdyb3VwczsKLQlzMzIgKmdyb3VwX29mZnNldHM7Ci0KLQljaGFubmVsLT5oZWFkZXItPmdyb3VwX3NpemVfYnl0ZXMgPSBjaGFubmVsLT5ncm91cF9zaXplOwotCWNoYW5uZWwtPmhlYWRlci0+Z3JvdXBfY291bnQgPSBjaGFubmVsLT5ncm91cF9jb3VudDsKLQotCXNwaW5fbG9ja19pbml0KCZjaGFubmVsLT5ncm91cF9vZmZzZXRzX2xvY2spOwotCi0JZ3JvdXBfb2Zmc2V0cyA9IGNoYW5uZWwtPmhlYWRlci0+Z3JvdXBfb2Zmc2V0czsKLQlncm91cHMgPSBjaGFubmVsLT5ncm91cHM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbC0+Z3JvdXBfY291bnQ7IGkrKykgewotCQlpZiAoY2hhbm5lbC0+ZGlyID09IENIQU5ORUxfRElSX1JYKQotCQkJZ3JvdXBfb2Zmc2V0c1tpXSA9IC0xOwotCQllbHNlCi0JCQlncm91cF9vZmZzZXRzW2ldID0gZ3JvdXBzW2ldLnVzZXJfb2Zmc2V0OwotCX0KLX0KLQogc3RhdGljIHZvaWQgX19wb2NoX2NoYW5uZWxfY2xlYXJfY291bnRlcnMoc3RydWN0IGNoYW5uZWxfaW5mbyAqY2hhbm5lbCkKIHsKIAljaGFubmVsLT5jb3VudGVycy5wbGxfdW5sb2NrID0gMDsKQEAgLTU4NCw2ICs1MzgsNyBAQAogCWlmIChyZXQgIT0gMCkKIAkJZ290byBvdXQ7CiAKKwljaGFubmVsLT5jb25zdW1lZCA9IDA7CiAJY2hhbm5lbC0+dHJhbnNmZXIgPSAwOwogCiAJLyogQWxsb2NhdGUgbWVtb3J5IHRvIGhvbGQgZ3JvdXAgaW5mb3JtYXRpb24uICovCkBAIC02MDQsMTIgKzU1OSw2IEBACiAJCWdvdG8gb3V0X2ZyZWVfZ3JvdXBfaW5mbzsKIAl9CiAKLQlyZXQgPSBwb2NoX2NoYW5uZWxfYWxsb2NfaGVhZGVyKGNoYW5uZWwpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihkZXYsICJlcnJvciBhbGxvY2F0aW5nIHVzZXIgc3BhY2UgaGVhZGVyXG4iKTsKLQkJZ290byBvdXRfZnJlZV9ncm91cHM7Ci0JfQotCiAJY2hhbm5lbC0+ZnBnYV9pb21lbSA9IHBvY2hfZGV2LT5mcGdhX2lvbWVtOwogCWNoYW5uZWwtPmJyaWRnZV9pb21lbSA9IHBvY2hfZGV2LT5icmlkZ2VfaW9tZW07CiAJY2hhbm5lbC0+aW9tZW1fbG9jayA9ICZwb2NoX2Rldi0+aW9tZW1fbG9jazsKQEAgLTYxNywxNCArNTY2LDggQEAKIAogCV9fcG9jaF9jaGFubmVsX2NsZWFyX2NvdW50ZXJzKGNoYW5uZWwpOwogCi0JcHJpbnRrKEtFUk5fV0FSTklORyAicG9jaF9jaGFubmVsX2luaXRfaGVhZGVyXG4iKTsKLQotCXBvY2hfY2hhbm5lbF9pbml0X2hlYWRlcihjaGFubmVsKTsKLQogCXJldHVybiAwOwogCi0gb3V0X2ZyZWVfZ3JvdXBzOgotCXBvY2hfY2hhbm5lbF9mcmVlX2dyb3VwcyhjaGFubmVsKTsKICBvdXRfZnJlZV9ncm91cF9pbmZvOgogCWtmcmVlKGNoYW5uZWwtPmdyb3Vwcyk7CiAgb3V0OgpAQCAtODIyLDE0ICs3NjUsMjEgQEAKIAogCWlmIChjaGFubmVsLT5kaXIgPT0gQ0hBTk5FTF9ESVJfVFgpIHsKIAkJLyogRmx1c2ggVFggRklGTyBhbmQgb3V0cHV0IGRhdGEgZnJvbSBjYXJkYnVzLiAqLwotCQlpb3dyaXRlMzIoRlBHQV9UWF9DVExfRklGT19GTFVTSAotCQkJICB8IEZQR0FfVFhfQ1RMX09VVFBVVF9DQVJEQlVTLAotCQkJICBmcGdhICsgRlBHQV9UWF9DVExfUkVHKTsKKwkJdTMyIGN0bF92YWwgPSAwOworCisJCWN0bF92YWwgfD0gRlBHQV9UWF9DVExfRklGT19GTFVTSDsKKwkJY3RsX3ZhbCB8PSBGUEdBX1RYX0NUTF9PVVRQVVRfQ0FSREJVUzsKKwkJaWYgKGxvb3BiYWNrKQorCQkJY3RsX3ZhbCB8PSBGUEdBX1RYX0NUTF9MT09QQkFDSzsKKworCQlpb3dyaXRlMzIoY3RsX3ZhbCwgZnBnYSArIEZQR0FfVFhfQ1RMX1JFRyk7CiAJfSBlbHNlIHsKIAkJLyogRmx1c2ggUlggRklGTyBhbmQgb3V0cHV0IGRhdGEgdG8gY2FyZGJ1cy4gKi8KLQkJaW93cml0ZTMyKEZQR0FfUlhfQ1RMX0NPTlRfQ0FQCi0JCQkgIHwgRlBHQV9SWF9DVExfRklGT19GTFVTSCwKLQkJCSAgZnBnYSArIEZQR0FfUlhfQ1RMX1JFRyk7CisJCXUzMiBjdGxfdmFsID0gRlBHQV9SWF9DVExfQ09OVF9DQVAgfCBGUEdBX1JYX0NUTF9GSUZPX0ZMVVNIOworCQlpZiAoc3ludGhfcngpCisJCQljdGxfdmFsIHw9IEZQR0FfUlhfQ1RMX1NZTlRIX0RBVEE7CisKKwkJaW93cml0ZTMyKGN0bF92YWwsIGZwZ2EgKyBGUEdBX1JYX0NUTF9SRUcpOwogCX0KIAogCWF0b21pY19pbmMoJmNoYW5uZWwtPmluaXRlZCk7CkBAIC04NjEsNyArODExLDYgQEAKIAl9CiAKIAlhdG9taWNfZGVjKCZjaGFubmVsLT5pbml0ZWQpOwotCXBvY2hfY2hhbm5lbF9mcmVlX2hlYWRlcihjaGFubmVsKTsKIAlwb2NoX2NoYW5uZWxfZnJlZV9ncm91cHMoY2hhbm5lbCk7CiAJa2ZyZWUoY2hhbm5lbC0+Z3JvdXBzKTsKIAlhdG9taWNfaW5jKCZjaGFubmVsLT5mcmVlKTsKQEAgLTg3MCw3ICs4MTksNyBAQAogfQogCiAvKgotICogTWFwIHRoZSBoZWFkZXIgYW5kIHRoZSBncm91cCBidWZmZXJzLCB0byB1c2VyIHNwYWNlLgorICogTWFwIHRoZSB0aGUgZ3JvdXAgYnVmZmVycywgdG8gdXNlciBzcGFjZS4KICAqLwogc3RhdGljIGludCBwb2NoX21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewpAQCAtODgwLDcgKzgyOSw2IEBACiAJdW5zaWduZWQgbG9uZyBzaXplOwogCiAJdW5zaWduZWQgbG9uZyBncm91cF9wYWdlczsKLQl1bnNpZ25lZCBsb25nIGhlYWRlcl9wYWdlczsKIAl1bnNpZ25lZCBsb25nIHRvdGFsX2dyb3VwX3BhZ2VzOwogCiAJaW50IHBnX251bTsKQEAgLTg5NywzMCArODQ1LDE2IEBACiAJfQogCiAJZ3JvdXBfcGFnZXMgPSBucGFnZXMoY2hhbm5lbC0+Z3JvdXBfc2l6ZSk7Ci0JaGVhZGVyX3BhZ2VzID0gbnBhZ2VzKGNoYW5uZWwtPmhlYWRlcl9zaXplKTsKIAl0b3RhbF9ncm91cF9wYWdlcyA9IGdyb3VwX3BhZ2VzICogY2hhbm5lbC0+Z3JvdXBfY291bnQ7CiAKIAlzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OwotCWlmIChzaXplICE9IChoZWFkZXJfcGFnZXMgKyB0b3RhbF9ncm91cF9wYWdlcykgKiBQQUdFX1NJWkUpIHsKKwlpZiAoc2l6ZSAhPSB0b3RhbF9ncm91cF9wYWdlcyAqIFBBR0VfU0laRSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAicmVxdWlyZWQgJWx1IGJ5dGVzXG4iLCBzaXplKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJc3RhcnQgPSB2bWEtPnZtX3N0YXJ0OwogCi0JLyogRklYTUU6IENsZWFudXAgcmVxdWlyZWQgb24gZmFpbHVyZT8gKi8KLQlwZyA9IGNoYW5uZWwtPmhlYWRlcl9wZzsKLQlmb3IgKHBnX251bSA9IDA7IHBnX251bSA8IGhlYWRlcl9wYWdlczsgcGdfbnVtKyssIHBnKyspIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJwYWdlX2NvdW50OiAlZFxuIiwgcGFnZV9jb3VudChwZykpOwotCQlwcmludGsoS0VSTl9ERUJVRyBQRlggIiVkOiBoZWFkZXI6IDB4JWx4XG4iLCBwZ19udW0sIHN0YXJ0KTsKLQkJcmV0ID0gdm1faW5zZXJ0X3BhZ2Uodm1hLCBzdGFydCwgcGcpOwotCQlpZiAocmV0KSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAidm1faW5zZXJ0IDEgZmFpbGVkIGF0ICVseFxuIiwgc3RhcnQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCQlzdGFydCArPSBQQUdFX1NJWkU7Ci0JfQotCiAJZm9yIChpID0gMDsgaSA8IGNoYW5uZWwtPmdyb3VwX2NvdW50OyBpKyspIHsKIAkJcGcgPSBjaGFubmVsLT5ncm91cHNbaV0ucGc7CiAJCWZvciAocGdfbnVtID0gMDsgcGdfbnVtIDwgZ3JvdXBfcGFnZXM7IHBnX251bSsrLCBwZysrKSB7CkBAIC05NDcsMjAgKzg4MSwxNiBAQAogICovCiBzdGF0aWMgaW50IHBvY2hfY2hhbm5lbF9hdmFpbGFibGUoc3RydWN0IGNoYW5uZWxfaW5mbyAqY2hhbm5lbCkKIHsKLQlpbnQgaTsKKwlpbnQgYXZhaWxhYmxlID0gMDsKIAogCXNwaW5fbG9ja19pcnEoJmNoYW5uZWwtPmdyb3VwX29mZnNldHNfbG9jayk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbC0+Z3JvdXBfY291bnQ7IGkrKykgewotCQlpZiAoY2hhbm5lbC0+aGVhZGVyLT5ncm91cF9vZmZzZXRzW2ldICE9IC0xKSB7Ci0JCQlzcGluX3VubG9ja19pcnEoJmNoYW5uZWwtPmdyb3VwX29mZnNldHNfbG9jayk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KKwlpZiAoY2hhbm5lbC0+Y29uc3VtZWQgIT0gY2hhbm5lbC0+dHJhbnNmZXIpCisJCWF2YWlsYWJsZSA9IDE7CiAKIAlzcGluX3VubG9ja19pcnEoJmNoYW5uZWwtPmdyb3VwX29mZnNldHNfbG9jayk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gYXZhaWxhYmxlOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IHBvY2hfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgcG9sbF90YWJsZSAqcHQpCkBAIC0xMDI2LDYgKzk1Niw1MSBAQAogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBQT0NIX0lPQ19DT05TVU1FOgorCXsKKwkJaW50IGF2YWlsYWJsZTsKKwkJaW50IG5mZXRjaDsKKwkJdW5zaWduZWQgaW50IGZyb207CisJCXVuc2lnbmVkIGludCBjb3VudDsKKwkJdW5zaWduZWQgaW50IGksIGo7CisJCXN0cnVjdCBwb2NoX2NvbnN1bWUgY29uc3VtZTsKKwkJc3RydWN0IHBvY2hfY29uc3VtZSAqdWNvbnN1bWU7CisKKwkJdWNvbnN1bWUgPSBhcmdwOworCQlyZXQgPSBjb3B5X2Zyb21fdXNlcigmY29uc3VtZSwgdWNvbnN1bWUsIHNpemVvZihjb25zdW1lKSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXNwaW5fbG9ja19pcnEoJmNoYW5uZWwtPmdyb3VwX29mZnNldHNfbG9jayk7CisKKwkJY2hhbm5lbC0+Y29uc3VtZWQgKz0gY29uc3VtZS5uZmx1c2g7CisJCWNoYW5uZWwtPmNvbnN1bWVkICU9IGNoYW5uZWwtPmdyb3VwX2NvdW50OworCisJCWF2YWlsYWJsZSA9IGNoYW5uZWwtPnRyYW5zZmVyIC0gY2hhbm5lbC0+Y29uc3VtZWQ7CisJCWlmIChhdmFpbGFibGUgPCAwKQorCQkJYXZhaWxhYmxlICs9IGNoYW5uZWwtPmdyb3VwX2NvdW50OworCisJCWZyb20gPSBjaGFubmVsLT5jb25zdW1lZDsKKworCQlzcGluX3VubG9ja19pcnEoJmNoYW5uZWwtPmdyb3VwX29mZnNldHNfbG9jayk7CisKKwkJbmZldGNoID0gY29uc3VtZS5uZmV0Y2g7CisJCWNvdW50ID0gbWluKGF2YWlsYWJsZSwgbmZldGNoKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkJaiA9IChmcm9tICsgaSkgJSBjaGFubmVsLT5ncm91cF9jb3VudDsKKwkJCXJldCA9IHB1dF91c2VyKGNoYW5uZWwtPmdyb3Vwc1tqXS51c2VyX29mZnNldCwKKwkJCQkgICAgICAgJmNvbnN1bWUub2Zmc2V0c1tpXSk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJcmV0ID0gcHV0X3VzZXIoY291bnQsICZ1Y29uc3VtZS0+bmZldGNoKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWJyZWFrOworCX0KIAljYXNlIFBPQ0hfSU9DX0dFVF9DT1VOVEVSUzoKIAkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBhcmdwLCBzaXplb2Yoc3RydWN0IHBvY2hfY291bnRlcnMpKSkKIAkJCXJldHVybiAtRUZBVUxUOwpAQCAtMTA3Myw3ICsxMDQ4LDYgQEAKIAlsb25nIGdyb3Vwc19kb25lOwogCXVuc2lnbmVkIGxvbmcgaSwgajsKIAlzdHJ1Y3QgcG9jaF9ncm91cF9pbmZvICpncm91cHM7Ci0JczMyICpncm91cF9vZmZzZXRzOwogCXUzMiBjdXJyX2dyb3VwX3JlZzsKIAogCWlmICghYXRvbWljX3JlYWQoJmNoYW5uZWwtPmluaXRlZCkpCkBAIC0xMDkzLDIwICsxMDY3LDI0IEBACiAJaWYgKGdyb3Vwc19kb25lIDw9IDApCiAJCWdyb3Vwc19kb25lICs9IGNoYW5uZWwtPmdyb3VwX2NvdW50OwogCi0JZ3JvdXBfb2Zmc2V0cyA9IGNoYW5uZWwtPmhlYWRlci0+Z3JvdXBfb2Zmc2V0czsKIAlncm91cHMgPSBjaGFubmVsLT5ncm91cHM7CiAKIAlzcGluX2xvY2soJmNoYW5uZWwtPmdyb3VwX29mZnNldHNfbG9jayk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZ3JvdXBzX2RvbmU7IGkrKykgewogCQlqID0gKHByZXZfdHJhbnNmZXIgKyBpKSAlIGNoYW5uZWwtPmdyb3VwX2NvdW50OwotCQlncm91cF9vZmZzZXRzW2pdID0gZ3JvdXBzW2pdLnVzZXJfb2Zmc2V0OworCisJCWNoYW5uZWwtPnRyYW5zZmVyICs9IDE7CisJCWNoYW5uZWwtPnRyYW5zZmVyICU9IGNoYW5uZWwtPmdyb3VwX2NvdW50OworCisJCWlmIChjaGFubmVsLT50cmFuc2ZlciA9PSBjaGFubmVsLT5jb25zdW1lZCkgeworCQkJY2hhbm5lbC0+Y29uc3VtZWQgKz0gMTsKKwkJCWNoYW5uZWwtPmNvbnN1bWVkICU9IGNoYW5uZWwtPmdyb3VwX2NvdW50OworCQl9CiAJfQogCiAJc3Bpbl91bmxvY2soJmNoYW5uZWwtPmdyb3VwX29mZnNldHNfbG9jayk7CiAKLQljaGFubmVsLT50cmFuc2ZlciA9IGN1cnJfdHJhbnNmZXI7Ci0KIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoYW5uZWwtPndxKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3BvY2gvcG9jaC5oIGIvZHJpdmVycy9zdGFnaW5nL3BvY2gvcG9jaC5oCmluZGV4IDUxYTJkMTQuLjhiMDgzODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9wb2NoL3BvY2guaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcG9jaC9wb2NoLmgKQEAgLTcsMTEgKzcsOCBAQAogICogaW5jbHVkZS9saW51eCBmb3IgZmluYWwgdmVyc2lvbi4KICAqCiAgKi8KLXN0cnVjdCBwb2NoX2NidWZfaGVhZGVyIHsKLQlfX3MzMiBncm91cF9zaXplX2J5dGVzOwotCV9fczMyIGdyb3VwX2NvdW50OwotCV9fczMyIGdyb3VwX29mZnNldHNbMF07Ci19OworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogc3RydWN0IHBvY2hfY291bnRlcnMgewogCV9fdTMyIGZpZm9fZW1wdHk7CkBAIC0xOSw2ICsxNiwxMiBAQAogCV9fdTMyIHBsbF91bmxvY2s7CiB9OwogCitzdHJ1Y3QgcG9jaF9jb25zdW1lIHsKKwlfX3UzMiBfX3VzZXIgKm9mZnNldHM7CisJX191MzIgbmZldGNoOworCV9fdTMyIG5mbHVzaDsKK307CisKICNkZWZpbmUgUE9DSF9JT0NfTlVNCQkJJzknCiAKICNkZWZpbmUgUE9DSF9JT0NfVFJBTlNGRVJfU1RBUlQJCV9JTyhQT0NIX0lPQ19OVU0sIDApCkBAIC0yNywzICszMCw2IEBACiAJCQkJCSAgICAgc3RydWN0IHBvY2hfY291bnRlcnMpCiAjZGVmaW5lIFBPQ0hfSU9DX1NZTkNfR1JPVVBfRk9SX1VTRVIJX0lPKFBPQ0hfSU9DX05VTSwgMykKICNkZWZpbmUgUE9DSF9JT0NfU1lOQ19HUk9VUF9GT1JfREVWSUNFCV9JTyhQT0NIX0lPQ19OVU0sIDQpCisKKyNkZWZpbmUgUE9DSF9JT0NfQ09OU1VNRQkJX0lPV1IoUE9DSF9JT0NfTlVNLCA1LCBcCisJCQkJCSAgICAgIHN0cnVjdCBwb2NoX2NvbnN1bWUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcXVhdGVjaF91c2IyL3F1YXRlY2hfdXNiMi5jIGIvZHJpdmVycy9zdGFnaW5nL3F1YXRlY2hfdXNiMi9xdWF0ZWNoX3VzYjIuYwppbmRleCAyYWNlZjk0Li5mNzcyNmYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcXVhdGVjaF91c2IyL3F1YXRlY2hfdXNiMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9xdWF0ZWNoX3VzYjIvcXVhdGVjaF91c2IyLmMKQEAgLTE2NzAsNyArMTY3MCw3IEBACiAJCWRiZygiJXMoKTogZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWQiLAogCQkJX19mdW5jX18sIHJlc3VsdCk7CiAJfSBlbHNlIHsKLQkJZGJnKCIlcygpIHN1Y2Vzc2Z1bGx5IHJlc3VtaXR0ZWQgcmVhZCB1cmIiLCBfX2Z1bmNfXyk7CisJCWRiZygiJXMoKSBzdWNjZXNzZnVsbHkgcmVzdWJtaXR0ZWQgcmVhZCB1cmIiLCBfX2Z1bmNfXyk7CiAJCWlmICh0dHlfc3QgJiYgUnhDb3VudCkgewogCQkJLyogaWYgc29tZSBpbmJvdW5kIGRhdGEgd2FzIHByb2Nlc3NlZCwgdGhlbgogCQkJICogd2UgbmVlZCB0byBwdXNoIHRoYXQgdGhyb3VnaCB0aGUgdHR5IGxheWVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZTI1NjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvS2NvbmZpZwpAQCAtMCwwICsxLDIxIEBACitjb25maWcgUkFNWlNXQVAKKwl0cmlzdGF0ZSAiQ29tcHJlc3NlZCBpbi1tZW1vcnkgc3dhcCBkZXZpY2UgKHJhbXpzd2FwKSIKKwlkZXBlbmRzIG9uIFNXQVAKKwlzZWxlY3QgTFpPX0NPTVBSRVNTCisJc2VsZWN0IExaT19ERUNPTVBSRVNTCisJZGVmYXVsdCBuCisJaGVscAorCSAgQ3JlYXRlcyB2aXJ0dWFsIGJsb2NrIGRldmljZXMgd2hpY2ggY2FuIGJlIHVzZWQgKG9ubHkpIGFzIGEgc3dhcAorCSAgZGlza3MuIFBhZ2VzIHN3YXBwZWQgdG8gdGhlc2UgZGlza3MgYXJlIGNvbXByZXNzZWQgYW5kIHN0b3JlZCBpbgorCSAgbWVtb3J5IGl0c2VsZi4KKworCSAgU2VlIHJhbXpzd2FwLnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKwkgIFByb2plY3QgaG9tZTogaHR0cDovL2NvbXBjYWNoZS5nb29nbGVjb2RlLmNvbS8KKworY29uZmlnIFJBTVpTV0FQX1NUQVRTCisJYm9vbCAiRW5hYmxlIHJhbXpzd2FwIHN0YXRzIgorCWRlcGVuZHMgb24gUkFNWlNXQVAKKwlkZWZhdWx0IHkKKwloZWxwCisJICBFbmFibGUgc3RhdGlzdGljcyBjb2xsZWN0aW9uIGZvciByYW16c3dhcC4gVGhpcyBhZGRzIG9ubHkgYSBtaW5pbWFsCisJICBvdmVyaGVhZC4gSW4gdW5zdXJlLCBzYXkgWS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDdkN2RjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL01ha2VmaWxlCkBAIC0wLDAgKzEsMyBAQAorcmFtenN3YXAtb2Jqcwk6PQlyYW16c3dhcF9kcnYubyB4dm1hbGxvYy5vCisKK29iai0kKENPTkZJR19SQU1aU1dBUCkJKz0JcmFtenN3YXAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWM0MGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL1RPRE8KQEAgLTAsMCArMSw2IEBACitUT0RPOgorCS0gQWRkIHN1cHBvcnQgZm9yIHN3YXAgbm90aWZpZXJzCisJLSBSZW1vdmUgQ09ORklHX0FSTSBoYWNrCisKK1BsZWFzZSBzZW5kIHBhdGNoZXMgdG8gR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4gYW5kCitOaXRpbiBHdXB0YSA8bmd1cHRhQHZmbGFyZS5vcmc+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvcmFtenN3YXAudHh0IGIvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3JhbXpzd2FwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWYxNjE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3JhbXpzd2FwLnR4dApAQCAtMCwwICsxLDUxIEBACityYW16c3dhcDogQ29tcHJlc3NlZCBSQU0gYmFzZWQgc3dhcCBkZXZpY2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUHJvamVjdCBob21lOiBodHRwOi8vY29tcGNhY2hlLmdvb2dsZWNvZGUuY29tLworCisqIEludHJvZHVjdGlvbgorCitJdCBjcmVhdGVzIFJBTSBiYXNlZCBibG9jayBkZXZpY2VzIHdoaWNoIGNhbiBiZSB1c2VkIChvbmx5KSBhcyBzd2FwIGRpc2tzLgorUGFnZXMgc3dhcHBlZCB0byB0aGVzZSBkZXZpY2VzIGFyZSBjb21wcmVzc2VkIGFuZCBzdG9yZWQgaW4gbWVtb3J5IGl0c2VsZi4KK1NlZSBwcm9qZWN0IGhvbWUgZm9yIHVzZSBjYXNlcywgcGVyZm9ybWFuY2UgbnVtYmVycyBhbmQgYSBsb3QgbW9yZS4KKworSW5kaXZpZHVhbCByYW16c3dhcCBkZXZpY2VzIGFyZSBjb25maWd1cmVkIGFuZCBpbml0aWFsaXplZCB1c2luZyByenNjb250cm9sCit1c2Vyc3BhY2UgdXRpbGl0eSBhcyBzaG93biBpbiBleGFtcGxlcyBiZWxvdy4gU2VlIHJ6c2NvbnRyb2wgbWFuIHBhZ2UgZm9yIG1vcmUKK2RldGFpbHMuCisKKyogVXNhZ2UKKworRm9sbG93aW5nIHNob3dzIGEgdHlwaWNhbCBzZXF1ZW5jZSBvZiBzdGVwcyBmb3IgdXNpbmcgcmFtenN3YXAuCisKKzEpIExvYWQgTW9kdWxlczoKKwltb2Rwcm9iZSByYW16c3dhcCBudW1fZGV2aWNlcz00CisJVGhpcyBjcmVhdGVzIDQgKHVuaW5pdGlhbGl6ZWQpIGRldmljZXM6IC9kZXYvcmFtenN3YXB7MCwxLDIsM30KKwkobnVtX2RldmljZXMgcGFyYW1ldGVyIGlzIG9wdGlvbmFsLiBEZWZhdWx0OiAxKQorCisyKSBJbml0aWFsaXplOgorCVVzZSByenNjb250cm9sIHV0aWxpdHkgdG8gY29uZmlndXJlIGFuZCBpbml0aWFsaXplIGluZGl2aWR1YWwKKwlyYW16c3dhcCBkZXZpY2VzLiBFeGFtcGxlOgorCXJ6c2NvbnRyb2wgL2Rldi9yYW16c3dhcDIgLS1pbml0ICMgdXNlcyBkZWZhdWx0IHZhbHVlIG9mIGRpc2tzaXplX2tiCisKKwkqU2VlIHJ6c2NvbnRyb2wgbWFuIHBhZ2UgZm9yIG1vcmUgZGV0YWlscyBhbmQgZXhhbXBsZXMqCisKKzMpIEFjdGl2YXRlOgorCXN3YXBvbiAvZGV2L3JhbXpzd2FwMiAjIG9yIGFueSBvdGhlciBpbml0aWFsaXplZCByYW16c3dhcCBkZXZpY2UKKworNCkgU3RhdHM6CisJcnpzY29udHJvbCAvZGV2L3JhbXpzd2FwMiAtLXN0YXRzCisKKzUpIERlYWN0aXZhdGU6CisJc3dhcG9mZiAvZGV2L3JhbXpzd2FwMgorCis2KSBSZXNldDoKKwlyenNjb250cm9sIC9kZXYvcmFtenN3YXAyIC0tcmVzZXQKKwkoVGhpcyBmcmVlcyBhbGwgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoaXMgZGV2aWNlKS4KKworCitQbGVhc2UgcmVwb3J0IGFueSBwcm9ibGVtcyBhdDoKKyAtIE1haWxpbmcgbGlzdDogbGludXgtbW0tY2MgYXQgbGFwdG9wIGRvdCBvcmcKKyAtIElzc3VlIHRyYWNrZXI6IGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9jb21wY2FjaGUvaXNzdWVzL2xpc3QKKworTml0aW4gR3VwdGEKK25ndXB0YUB2ZmxhcmUub3JnCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvcmFtenN3YXBfZHJ2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvcmFtenN3YXBfZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgzOWYwNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9yYW16c3dhcF9kcnYuYwpAQCAtMCwwICsxLDE0MzUgQEAKKy8qCisgKiBDb21wcmVzc2VkIFJBTSBiYXNlZCBzd2FwIGRldmljZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSAgTml0aW4gR3VwdGEKKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdXNpbmcgYSBkdWFsIGxpY2Vuc2Ugc3RyYXRlZ3k6IEJTRC9HUEwKKyAqIFlvdSBjYW4gY2hvb3NlIHRoZSBsaWNlbmNlIHRoYXQgYmV0dGVyIGZpdHMgeW91ciByZXF1aXJlbWVudHMuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIDMtY2xhdXNlIEJTRCBMaWNlbnNlCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAKKyAqCisgKiBQcm9qZWN0IGhvbWU6IGh0dHA6Ly9jb21wY2FjaGUuZ29vZ2xlY29kZS5jb20KKyAqLworCisjZGVmaW5lIEtNU0dfQ09NUE9ORU5UICJyYW16c3dhcCIKKyNkZWZpbmUgcHJfZm10KGZtdCkgS01TR19DT01QT05FTlQgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ2VuaGQuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvbHpvLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlICJyYW16c3dhcF9kcnYuaCIKKworLyogR2xvYmFscyAqLworc3RhdGljIGludCByYW16c3dhcF9tYWpvcjsKK3N0YXRpYyBzdHJ1Y3QgcmFtenN3YXAgKmRldmljZXM7CisKKy8qCisgKiBQYWdlcyB0aGF0IGNvbXByZXNzIHRvIGxhcmdlciB0aGFuIHRoaXMgc2l6ZSBhcmUKKyAqIGZvcndhcmRlZCB0byBiYWNraW5nIHN3YXAsIGlmIHByZXNlbnQgb3Igc3RvcmVkCisgKiB1bmNvbXByZXNzZWQgaW4gbWVtb3J5IG90aGVyd2lzZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBtYXhfenBhZ2Vfc2l6ZTsKKworLyogTW9kdWxlIHBhcmFtcyAoZG9jdW1lbnRhdGlvbiBhdCBlbmQpICovCitzdGF0aWMgdW5zaWduZWQgaW50IG51bV9kZXZpY2VzOworCitzdGF0aWMgaW50IHJ6c190ZXN0X2ZsYWcoc3RydWN0IHJhbXpzd2FwICpyenMsIHUzMiBpbmRleCwKKwkJCWVudW0gcnpzX3BhZ2VmbGFncyBmbGFnKQoreworCXJldHVybiByenMtPnRhYmxlW2luZGV4XS5mbGFncyAmIEJJVChmbGFnKTsKK30KKworc3RhdGljIHZvaWQgcnpzX3NldF9mbGFnKHN0cnVjdCByYW16c3dhcCAqcnpzLCB1MzIgaW5kZXgsCisJCQllbnVtIHJ6c19wYWdlZmxhZ3MgZmxhZykKK3sKKwlyenMtPnRhYmxlW2luZGV4XS5mbGFncyB8PSBCSVQoZmxhZyk7Cit9CisKK3N0YXRpYyB2b2lkIHJ6c19jbGVhcl9mbGFnKHN0cnVjdCByYW16c3dhcCAqcnpzLCB1MzIgaW5kZXgsCisJCQllbnVtIHJ6c19wYWdlZmxhZ3MgZmxhZykKK3sKKwlyenMtPnRhYmxlW2luZGV4XS5mbGFncyAmPSB+QklUKGZsYWcpOworfQorCitzdGF0aWMgaW50IHBhZ2VfemVyb19maWxsZWQodm9pZCAqcHRyKQoreworCXVuc2lnbmVkIGludCBwb3M7CisJdW5zaWduZWQgbG9uZyAqcGFnZTsKKworCXBhZ2UgPSAodW5zaWduZWQgbG9uZyAqKXB0cjsKKworCWZvciAocG9zID0gMDsgcG9zICE9IFBBR0VfU0laRSAvIHNpemVvZigqcGFnZSk7IHBvcysrKSB7CisJCWlmIChwYWdlW3Bvc10pCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIG1lbWxpbWl0IGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gYmFja2luZyBkaXNrIHNpemUuCisgKi8KK3N0YXRpYyB2b2lkIHJhbXpzd2FwX3NldF9tZW1saW1pdChzdHJ1Y3QgcmFtenN3YXAgKnJ6cywgc2l6ZV90IHRvdGFscmFtX2J5dGVzKQoreworCWludCBtZW1saW1pdF92YWxpZCA9IDE7CisKKwlpZiAoIXJ6cy0+bWVtbGltaXQpIHsKKwkJcHJfaW5mbygiTWVtb3J5IGxpbWl0IG5vdCBzZXQuXG4iKTsKKwkJbWVtbGltaXRfdmFsaWQgPSAwOworCX0KKworCWlmIChyenMtPm1lbWxpbWl0ID4gcnpzLT5kaXNrc2l6ZSkgeworCQlwcl9pbmZvKCJNZW1vcnkgbGltaXQgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAiCisJCQkiZGlza3NpemU6IGxpbWl0PSV6dSwgZGlza3NpemU9JXp1XG4iLAorCQkJcnpzLT5tZW1saW1pdCwgcnpzLT5kaXNrc2l6ZSk7CisJCW1lbWxpbWl0X3ZhbGlkID0gMDsKKwl9CisKKwlpZiAoIW1lbWxpbWl0X3ZhbGlkKSB7CisJCXNpemVfdCBtZW1wYXJ0LCBkaXNrc2l6ZTsKKwkJcHJfaW5mbygiVXNpbmcgZGVmYXVsdDogc21hbGxlciBvZiAoJXUlJSBvZiBSQU0pIGFuZCAiCisJCQkiKGJhY2tpbmcgZGlzayBzaXplKS5cbiIsCisJCQlkZWZhdWx0X21lbWxpbWl0X3BlcmNfcmFtKTsKKwkJbWVtcGFydCA9IGRlZmF1bHRfbWVtbGltaXRfcGVyY19yYW0gKiAodG90YWxyYW1fYnl0ZXMgLyAxMDApOworCQlkaXNrc2l6ZSA9IHJ6cy0+ZGlza3NpemU7CisJCXJ6cy0+bWVtbGltaXQgPSBtZW1wYXJ0ID4gZGlza3NpemUgPyBkaXNrc2l6ZSA6IG1lbXBhcnQ7CisJfQorCisJaWYgKHJ6cy0+bWVtbGltaXQgPiB0b3RhbHJhbV9ieXRlcyAvIDIpIHsKKwkJcHJfaW5mbygKKwkJIkl0cyBub3QgYWR2aXNhYmxlIHNldHRpbmcgbGltaXQgbW9yZSB0aGFuIGhhbGYgb2YgIgorCQkic2l6ZSBvZiBtZW1vcnkgc2luY2Ugd2UgZXhwZWN0IGEgMjoxIGNvbXByZXNzaW9uIHJhdGlvLiAiCisJCSJMaW1pdCByZXByZXNlbnRzIGFtb3VudCBvZiAqY29tcHJlc3NlZCogZGF0YSB3ZSBjYW4ga2VlcCAiCisJCSJpbiBtZW1vcnkhXG4iCisJCSJcdE1lbW9yeSBTaXplOiAlenUga0JcbiIKKwkJIlx0TGltaXQgeW91IHNlbGVjdGVkOiAlenUga0JcbiIKKwkJIkNvbnRpbnVpbmcgYW55d2F5IC4uLlxuIiwKKwkJdG90YWxyYW1fYnl0ZXMgPj4gMTAsIHJ6cy0+bWVtbGltaXQgPj4gMTAKKwkJKTsKKwl9CisKKwlyenMtPm1lbWxpbWl0ICY9IFBBR0VfTUFTSzsKKwlCVUdfT04oIXJ6cy0+bWVtbGltaXQpOworfQorCitzdGF0aWMgdm9pZCByYW16c3dhcF9zZXRfZGlza3NpemUoc3RydWN0IHJhbXpzd2FwICpyenMsIHNpemVfdCB0b3RhbHJhbV9ieXRlcykKK3sKKwlpZiAoIXJ6cy0+ZGlza3NpemUpIHsKKwkJcHJfaW5mbygKKwkJImRpc2sgc2l6ZSBub3QgcHJvdmlkZWQuIFlvdSBjYW4gdXNlIGRpc2tzaXplX2tiIG1vZHVsZSAiCisJCSJwYXJhbSB0byBzcGVjaWZ5IHNpemUuXG5Vc2luZyBkZWZhdWx0OiAoJXUlJSBvZiBSQU0pLlxuIiwKKwkJZGVmYXVsdF9kaXNrc2l6ZV9wZXJjX3JhbQorCQkpOworCQlyenMtPmRpc2tzaXplID0gZGVmYXVsdF9kaXNrc2l6ZV9wZXJjX3JhbSAqCisJCQkJCSh0b3RhbHJhbV9ieXRlcyAvIDEwMCk7CisJfQorCisJaWYgKHJ6cy0+ZGlza3NpemUgPiAyICogKHRvdGFscmFtX2J5dGVzKSkgeworCQlwcl9pbmZvKAorCQkiVGhlcmUgaXMgbGl0dGxlIHBvaW50IGNyZWF0aW5nIGEgcmFtenN3YXAgb2YgZ3JlYXRlciB0aGFuICIKKwkJInR3aWNlIHRoZSBzaXplIG9mIG1lbW9yeSBzaW5jZSB3ZSBleHBlY3QgYSAyOjEgY29tcHJlc3Npb24gIgorCQkicmF0aW8uIE5vdGUgdGhhdCByYW16c3dhcCB1c2VzIGFib3V0IDAuMSUlIG9mIHRoZSBzaXplIG9mICIKKwkJInRoZSBzd2FwIGRldmljZSB3aGVuIG5vdCBpbiB1c2Ugc28gYSBodWdlIHJhbXpzd2FwIGlzICIKKwkJIndhc3RlZnVsLlxuIgorCQkiXHRNZW1vcnkgU2l6ZTogJXp1IGtCXG4iCisJCSJcdFNpemUgeW91IHNlbGVjdGVkOiAlenUga0JcbiIKKwkJIkNvbnRpbnVpbmcgYW55d2F5IC4uLlxuIiwKKwkJdG90YWxyYW1fYnl0ZXMgPj4gMTAsIHJ6cy0+ZGlza3NpemUKKwkJKTsKKwl9CisKKwlyenMtPmRpc2tzaXplICY9IFBBR0VfTUFTSzsKK30KKworLyoKKyAqIFN3YXAgaGVhZGVyICgxc3QgcGFnZSBvZiBzd2FwIGRldmljZSkgY29udGFpbnMgaW5mb3JtYXRpb24KKyAqIHRvIGluZGVudGlmeSBpdCBhcyBhIHN3YXAgcGFydGl0aW9uLiBQcmVwYXJlIHN1Y2ggYSBoZWFkZXIKKyAqIGZvciByYW16c3dhcCBkZXZpY2UgKHJhbXpzd2FwMCkgc28gdGhhdCBzd2Fwb24gY2FuIGlkZW50aWZ5CisgKiBpdCBhcyBzd2FwIHBhcnRpdGlvbi4gSW4gY2FzZSBiYWNraW5nIHN3YXAgZGV2aWNlIGlzIHByb3ZpZGVkLAorICogY29weSBpdHMgc3dhcCBoZWFkZXIuCisgKi8KK3N0YXRpYyBpbnQgc2V0dXBfc3dhcF9oZWFkZXIoc3RydWN0IHJhbXpzd2FwICpyenMsIHVuaW9uIHN3YXBfaGVhZGVyICpzKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBwYWdlICpwYWdlOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOworCXVuaW9uIHN3YXBfaGVhZGVyICpiYWNraW5nX3N3YXBfaGVhZGVyOworCisJLyoKKwkgKiBUaGVyZSBpcyBubyBiYWNraW5nIHN3YXAgZGV2aWNlLiBDcmVhdGUgYSBzd2FwIGhlYWRlcgorCSAqIHRoYXQgaXMgYWNjZXB0YWJsZSBieSBzd2Fwb24uCisJICovCisJaWYgKCFyenMtPmJhY2tpbmdfc3dhcCkgeworCQlzLT5pbmZvLnZlcnNpb24gPSAxOworCQlzLT5pbmZvLmxhc3RfcGFnZSA9IChyenMtPmRpc2tzaXplID4+IFBBR0VfU0hJRlQpIC0gMTsKKwkJcy0+aW5mby5ucl9iYWRwYWdlcyA9IDA7CisJCW1lbWNweShzLT5tYWdpYy5tYWdpYywgIlNXQVBTUEFDRTIiLCAxMCk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogV2UgaGF2ZSBhIGJhY2tpbmcgc3dhcCBkZXZpY2UuIENvcHkgaXRzIHN3YXAgaGVhZGVyCisJICogdG8gcmFtenN3YXAgZGV2aWNlIGhlYWRlci4gSWYgdGhpcyBoZWFkZXIgY29udGFpbnMKKwkgKiBpbnZhbGlkIGluZm9ybWF0aW9uIChiYWNraW5nIGRldmljZSBub3QgYSBzd2FwCisJICogcGFydGl0aW9uLCBldGMuKSwgc3dhcG9uIHdpbGwgZmFpbCBmb3IgcmFtenN3YXAKKwkgKiB3aGljaCBpcyBjb3JyZWN0IGJlaGF2aW9yIC0gd2UgZG9uJ3Qgd2FudCB0byBzd2FwCisJICogb3ZlciBmaWxlc3lzdGVtIHBhcnRpdGlvbiEKKwkgKi8KKworCS8qIFJlYWQgdGhlIGJhY2tpbmcgc3dhcCBoZWFkZXIgKGNvZGUgZnJvbSBzeXNfc3dhcG9uKSAqLworCW1hcHBpbmcgPSByenMtPnN3YXBfZmlsZS0+Zl9tYXBwaW5nOworCWlmICghbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXBhZ2UgPSByZWFkX21hcHBpbmdfcGFnZShtYXBwaW5nLCAwLCByenMtPnN3YXBfZmlsZSk7CisJaWYgKElTX0VSUihwYWdlKSkgeworCQlyZXQgPSBQVFJfRVJSKHBhZ2UpOworCQlnb3RvIG91dDsKKwl9CisKKwliYWNraW5nX3N3YXBfaGVhZGVyID0ga21hcChwYWdlKTsKKwltZW1jcHkocywgYmFja2luZ19zd2FwX2hlYWRlciwgc2l6ZW9mKCpzKSk7CisJaWYgKHMtPmluZm8ubnJfYmFkcGFnZXMpIHsKKwkJcHJfaW5mbygiQ2Fubm90IHVzZSBiYWNraW5nIHN3YXAgd2l0aCBiYWQgcGFnZXMgKCV1KVxuIiwKKwkJCXMtPmluZm8ubnJfYmFkcGFnZXMpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKwkvKgorCSAqIHJhbXpzd2FwIGRpc2tzaXplIGVxdWFscyBudW1iZXIgb2YgdXNhYmxlIHBhZ2VzIGluIGJhY2tpbmcKKwkgKiBzd2FwLiBTZXQgbGFzdF9wYWdlIGluIHN3YXAgaGVhZGVyIHRvIG1hdGNoIHRoaXMgZGlza3NpemUKKwkgKiAoJ2xhc3RfcGFnZScgbWVhbnMgMC1iYXNlZCBpbmRleCBvZiBsYXN0IHVzYWJsZSBzd2FwIHBhZ2UpLgorCSAqLworCXMtPmluZm8ubGFzdF9wYWdlID0gKHJ6cy0+ZGlza3NpemUgPj4gUEFHRV9TSElGVCkgLSAxOworCWt1bm1hcChwYWdlKTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHJhbXpzd2FwX2ZsdXNoX2RjYWNoZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQoreworI2lmZGVmIENPTkZJR19BUk0KKwlpbnQgZmxhZyA9IDA7CisJLyoKKwkgKiBVZ2x5IGhhY2sgdG8gZ2V0IGZsdXNoX2RjYWNoZV9wYWdlKCkgd29yayBvbiBBUk0uCisJICogcGFnZV9tYXBwaW5nKHBhZ2UpID09IE5VTEwgYWZ0ZXIgY2xlYXJpbmcgdGhpcyBzd2FwIGNhY2hlIGZsYWcuCisJICogV2l0aG91dCBjbGVhcmluZyB0aGlzIGZsYWcsIGZsdXNoX2RjYWNoZV9wYWdlKCkgd2lsbCBzaW1wbHkgc2V0CisJICogIlBHX2RjYWNoZV9kaXJ0eSIgYml0IGFuZCByZXR1cm4uCisJICovCisJaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkpIHsKKwkJZmxhZyA9IDE7CisJCUNsZWFyUGFnZVN3YXBDYWNoZShwYWdlKTsKKwl9CisjZW5kaWYKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKyNpZmRlZiBDT05GSUdfQVJNCisJaWYgKGZsYWcpCisJCVNldFBhZ2VTd2FwQ2FjaGUocGFnZSk7CisjZW5kaWYKK30KKwordm9pZCByYW16c3dhcF9pb2N0bF9nZXRfc3RhdHMoc3RydWN0IHJhbXpzd2FwICpyenMsCisJCQlzdHJ1Y3QgcmFtenN3YXBfaW9jdGxfc3RhdHMgKnMpCit7CisJc3RybmNweShzLT5iYWNraW5nX3N3YXBfbmFtZSwgcnpzLT5iYWNraW5nX3N3YXBfbmFtZSwKKwkJTUFYX1NXQVBfTkFNRV9MRU4gLSAxKTsKKwlzLT5iYWNraW5nX3N3YXBfbmFtZVtNQVhfU1dBUF9OQU1FX0xFTiAtIDFdID0gJ1wwJzsKKworCXMtPmRpc2tzaXplID0gcnpzLT5kaXNrc2l6ZTsKKwlzLT5tZW1saW1pdCA9IHJ6cy0+bWVtbGltaXQ7CisKKyNpZiBkZWZpbmVkKENPTkZJR19SQU1aU1dBUF9TVEFUUykKKwl7CisJc3RydWN0IHJhbXpzd2FwX3N0YXRzICpycyA9ICZyenMtPnN0YXRzOworCXNpemVfdCBzdWNjX3dyaXRlcywgbWVtX3VzZWQ7CisJdW5zaWduZWQgaW50IGdvb2RfY29tcHJlc3NfcGVyYyA9IDAsIG5vX2NvbXByZXNzX3BlcmMgPSAwOworCisJbWVtX3VzZWQgPSB4dl9nZXRfdG90YWxfc2l6ZV9ieXRlcyhyenMtPm1lbV9wb29sKQorCQkJKyAocnMtPnBhZ2VzX2V4cGFuZCA8PCBQQUdFX1NISUZUKTsKKwlzdWNjX3dyaXRlcyA9IHJzLT5udW1fd3JpdGVzIC0gcnMtPmZhaWxlZF93cml0ZXM7CisKKwlpZiAoc3VjY193cml0ZXMgJiYgcnMtPnBhZ2VzX3N0b3JlZCkgeworCQlnb29kX2NvbXByZXNzX3BlcmMgPSBycy0+Z29vZF9jb21wcmVzcyAqIDEwMAorCQkJCQkvIHJzLT5wYWdlc19zdG9yZWQ7CisJCW5vX2NvbXByZXNzX3BlcmMgPSBycy0+cGFnZXNfZXhwYW5kICogMTAwCisJCQkJCS8gcnMtPnBhZ2VzX3N0b3JlZDsKKwl9CisKKwlzLT5udW1fcmVhZHMgPSBycy0+bnVtX3JlYWRzOworCXMtPm51bV93cml0ZXMgPSBycy0+bnVtX3dyaXRlczsKKwlzLT5mYWlsZWRfcmVhZHMgPSBycy0+ZmFpbGVkX3JlYWRzOworCXMtPmZhaWxlZF93cml0ZXMgPSBycy0+ZmFpbGVkX3dyaXRlczsKKwlzLT5pbnZhbGlkX2lvID0gcnMtPmludmFsaWRfaW87CisJcy0+cGFnZXNfemVybyA9IHJzLT5wYWdlc196ZXJvOworCisJcy0+Z29vZF9jb21wcmVzc19wY3QgPSBnb29kX2NvbXByZXNzX3BlcmM7CisJcy0+cGFnZXNfZXhwYW5kX3BjdCA9IG5vX2NvbXByZXNzX3BlcmM7CisKKwlzLT5wYWdlc19zdG9yZWQgPSBycy0+cGFnZXNfc3RvcmVkOworCXMtPnBhZ2VzX3VzZWQgPSBtZW1fdXNlZCA+PiBQQUdFX1NISUZUOworCXMtPm9yaWdfZGF0YV9zaXplID0gcnMtPnBhZ2VzX3N0b3JlZCA8PCBQQUdFX1NISUZUOworCXMtPmNvbXByX2RhdGFfc2l6ZSA9IHJzLT5jb21wcl9zaXplOworCXMtPm1lbV91c2VkX3RvdGFsID0gbWVtX3VzZWQ7CisKKwlzLT5iZGV2X251bV9yZWFkcyA9IHJzLT5iZGV2X251bV9yZWFkczsKKwlzLT5iZGV2X251bV93cml0ZXMgPSBycy0+YmRldl9udW1fd3JpdGVzOworCX0KKyNlbmRpZiAvKiBDT05GSUdfUkFNWlNXQVBfU1RBVFMgKi8KK30KKworc3RhdGljIGludCBhZGRfYmFja2luZ19zd2FwX2V4dGVudChzdHJ1Y3QgcmFtenN3YXAgKnJ6cywKKwkJCQlwZ29mZl90IHBoeV9wYWdlbnVtLAorCQkJCXBnb2ZmX3QgbnVtX3BhZ2VzKQoreworCXVuc2lnbmVkIGludCBpZHg7CisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKKwlzdHJ1Y3QgcGFnZSAqY3Vycl9wYWdlLCAqbmV3X3BhZ2U7CisJdW5zaWduZWQgaW50IGV4dGVudHNfcGVyX3BhZ2UgPSBQQUdFX1NJWkUgLworCQkJCXNpemVvZihzdHJ1Y3QgcmFtenN3YXBfYmFja2luZ19leHRlbnQpOworCisJaWR4ID0gcnpzLT5udW1fZXh0ZW50cyAlIGV4dGVudHNfcGVyX3BhZ2U7CisJaWYgKCFpZHgpIHsKKwkJbmV3X3BhZ2UgPSBhbGxvY19wYWdlKF9fR0ZQX1pFUk8pOworCQlpZiAoIW5ld19wYWdlKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJaWYgKHJ6cy0+bnVtX2V4dGVudHMpIHsKKwkJCWN1cnJfcGFnZSA9IHZpcnRfdG9fcGFnZShyenMtPmN1cnJfZXh0ZW50KTsKKwkJCWhlYWQgPSAmY3Vycl9wYWdlLT5scnU7CisJCX0gZWxzZSB7CisJCQloZWFkID0gJnJ6cy0+YmFja2luZ19zd2FwX2V4dGVudF9saXN0OworCQl9CisKKwkJbGlzdF9hZGQoJm5ld19wYWdlLT5scnUsIGhlYWQpOworCQlyenMtPmN1cnJfZXh0ZW50ID0gcGFnZV9hZGRyZXNzKG5ld19wYWdlKTsKKwl9CisKKwlyenMtPmN1cnJfZXh0ZW50LT5waHlfcGFnZW51bSA9IHBoeV9wYWdlbnVtOworCXJ6cy0+Y3Vycl9leHRlbnQtPm51bV9wYWdlcyA9IG51bV9wYWdlczsKKworCXByX2RlYnVnKCJhZGRfZXh0ZW50OiBpZHg9JXUsIHBoeV9wZ251bT0lbHUsIG51bV9wZ3M9JWx1LCAiCisJCSJwZ19sYXN0PSVsdSwgY3Vycl9leHQ9JXBcbiIsIGlkeCwgcGh5X3BhZ2VudW0sIG51bV9wYWdlcywKKwkJcGh5X3BhZ2VudW0gKyBudW1fcGFnZXMgLSAxLCByenMtPmN1cnJfZXh0ZW50KTsKKworCWlmIChpZHggIT0gZXh0ZW50c19wZXJfcGFnZSAtIDEpCisJCXJ6cy0+Y3Vycl9leHRlbnQrKzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldHVwX2JhY2tpbmdfc3dhcF9leHRlbnRzKHN0cnVjdCByYW16c3dhcCAqcnpzLAorCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgKm51bV9wYWdlcykKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBibGtiaXRzOworCXVuc2lnbmVkIGJsb2Nrc19wZXJfcGFnZTsKKwlwZ29mZl90IGNvbnRpZ19wYWdlcyA9IDAsIHRvdGFsX3BhZ2VzID0gMDsKKwlwZ29mZl90IHBhZ2VudW0gPSAwLCBwcmV2X3BhZ2VudW0gPSAwOworCXNlY3Rvcl90IHByb2JlX2Jsb2NrID0gMDsKKwlzZWN0b3JfdCBsYXN0X2Jsb2NrOworCisJYmxrYml0cyA9IGlub2RlLT5pX2Jsa2JpdHM7CisJYmxvY2tzX3Blcl9wYWdlID0gUEFHRV9TSVpFID4+IGJsa2JpdHM7CisKKwlsYXN0X2Jsb2NrID0gaV9zaXplX3JlYWQoaW5vZGUpID4+IGJsa2JpdHM7CisJd2hpbGUgKHByb2JlX2Jsb2NrICsgYmxvY2tzX3Blcl9wYWdlIDw9IGxhc3RfYmxvY2spIHsKKwkJdW5zaWduZWQgYmxvY2tfaW5fcGFnZTsKKwkJc2VjdG9yX3QgZmlyc3RfYmxvY2s7CisKKwkJZmlyc3RfYmxvY2sgPSBibWFwKGlub2RlLCBwcm9iZV9ibG9jayk7CisJCWlmIChmaXJzdF9ibG9jayA9PSAwKQorCQkJZ290byBiYWRfYm1hcDsKKworCQkvKiBJdCBtdXN0IGJlIFBBR0VfU0laRSBhbGlnbmVkIG9uLWRpc2sgKi8KKwkJaWYgKGZpcnN0X2Jsb2NrICYgKGJsb2Nrc19wZXJfcGFnZSAtIDEpKSB7CisJCQlwcm9iZV9ibG9jaysrOworCQkJZ290byBwcm9iZV9uZXh0OworCQl9CisKKwkJLyogQWxsIGJsb2NrcyB3aXRoaW4gdGhpcyBwYWdlIG11c3QgYmUgY29udGlndW91cyBvbiBkaXNrICovCisJCWZvciAoYmxvY2tfaW5fcGFnZSA9IDE7IGJsb2NrX2luX3BhZ2UgPCBibG9ja3NfcGVyX3BhZ2U7CisJCQkJCWJsb2NrX2luX3BhZ2UrKykgeworCQkJc2VjdG9yX3QgYmxvY2s7CisKKwkJCWJsb2NrID0gYm1hcChpbm9kZSwgcHJvYmVfYmxvY2sgKyBibG9ja19pbl9wYWdlKTsKKwkJCWlmIChibG9jayA9PSAwKQorCQkJCWdvdG8gYmFkX2JtYXA7CisJCQlpZiAoYmxvY2sgIT0gZmlyc3RfYmxvY2sgKyBibG9ja19pbl9wYWdlKSB7CisJCQkJLyogRGlzY29udGlndWl0eSAqLworCQkJCXByb2JlX2Jsb2NrKys7CisJCQkJZ290byBwcm9iZV9uZXh0OworCQkJfQorCQl9CisKKwkJLyoKKwkJICogV2UgZm91bmQgYSBQQUdFX1NJWkUgbGVuZ3RoLCBQQUdFX1NJWkUgYWxpZ25lZAorCQkgKiBydW4gb2YgYmxvY2tzLgorCQkgKi8KKwkJcGFnZW51bSA9IGZpcnN0X2Jsb2NrID4+IChQQUdFX1NISUZUIC0gYmxrYml0cyk7CisKKwkJaWYgKHRvdGFsX3BhZ2VzICYmIChwYWdlbnVtICE9IHByZXZfcGFnZW51bSArIDEpKSB7CisJCQlyZXQgPSBhZGRfYmFja2luZ19zd2FwX2V4dGVudChyenMsIHByZXZfcGFnZW51bSAtCisJCQkJCShjb250aWdfcGFnZXMgLSAxKSwgY29udGlnX3BhZ2VzKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8gb3V0OworCQkJcnpzLT5udW1fZXh0ZW50cysrOworCQkJY29udGlnX3BhZ2VzID0gMDsKKwkJfQorCQl0b3RhbF9wYWdlcysrOworCQljb250aWdfcGFnZXMrKzsKKwkJcHJldl9wYWdlbnVtID0gcGFnZW51bTsKKwkJcHJvYmVfYmxvY2sgKz0gYmxvY2tzX3Blcl9wYWdlOworCitwcm9iZV9uZXh0OgorCQljb250aW51ZTsKKwl9CisKKwlpZiAoY29udGlnX3BhZ2VzKSB7CisJCXByX2RlYnVnKCJhZGRpbmcgbGFzdCBleHRlbnQ6IHBhZ2VudW09JWx1LCAiCisJCQkiY29udGlnX3BhZ2VzPSVsdVxuIiwgcGFnZW51bSwgY29udGlnX3BhZ2VzKTsKKwkJcmV0ID0gYWRkX2JhY2tpbmdfc3dhcF9leHRlbnQocnpzLAorCQkJcHJldl9wYWdlbnVtIC0gKGNvbnRpZ19wYWdlcyAtIDEpLCBjb250aWdfcGFnZXMpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCQlyenMtPm51bV9leHRlbnRzKys7CisJfQorCWlmICghcnpzLT5udW1fZXh0ZW50cykgeworCQlwcl9lcnIoIk5vIHN3YXAgZXh0ZW50cyBmb3VuZCFcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCWlmICghcmV0KSB7CisJCSpudW1fcGFnZXMgPSB0b3RhbF9wYWdlczsKKwkJcHJfaW5mbygiRm91bmQgJWx1IGV4dGVudHMgY29udGFpbmluZyAlbHVrXG4iLAorCQkJcnpzLT5udW1fZXh0ZW50cywgKm51bV9wYWdlcyA8PCAoUEFHRV9TSElGVCAtIDEwKSk7CisJfQorCWdvdG8gb3V0OworCitiYWRfYm1hcDoKKwlwcl9lcnIoIkJhY2tpbmcgc3dhcGZpbGUgaGFzIGhvbGVzXG4iKTsKKwlyZXQgPSAtRUlOVkFMOworb3V0OgorCXdoaWxlIChyZXQgJiYgIWxpc3RfZW1wdHkoJnJ6cy0+YmFja2luZ19zd2FwX2V4dGVudF9saXN0KSkgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJc3RydWN0IGxpc3RfaGVhZCAqZW50cnkgPSByenMtPmJhY2tpbmdfc3dhcF9leHRlbnRfbGlzdC5uZXh0OworCQlwYWdlID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHBhZ2UsIGxydSk7CisJCWxpc3RfZGVsKGVudHJ5KTsKKwkJX19mcmVlX3BhZ2UocGFnZSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG1hcF9iYWNraW5nX3N3YXBfZXh0ZW50cyhzdHJ1Y3QgcmFtenN3YXAgKnJ6cykKK3sKKwlzdHJ1Y3QgcmFtenN3YXBfYmFja2luZ19leHRlbnQgKnNlOworCXN0cnVjdCBwYWdlICp0YWJsZV9wYWdlLCAqc2VfcGFnZTsKKwl1bnNpZ25lZCBsb25nIG51bV9wYWdlcywgbnVtX3RhYmxlX3BhZ2VzLCBlbnRyeTsKKwl1bnNpZ25lZCBsb25nIHNlX2lkeCwgc3BhbjsKKwl1bnNpZ25lZCBlbnRyaWVzX3Blcl9wYWdlID0gUEFHRV9TSVpFIC8gc2l6ZW9mKCpyenMtPnRhYmxlKTsKKwl1bnNpZ25lZCBleHRlbnRzX3Blcl9wYWdlID0gUEFHRV9TSVpFIC8gc2l6ZW9mKCpzZSk7CisKKwkvKiBUcnVlIGZvciBibG9jayBkZXZpY2UgKi8KKwlpZiAoIXJ6cy0+bnVtX2V4dGVudHMpCisJCXJldHVybjsKKworCXNlX3BhZ2UgPSBsaXN0X2VudHJ5KHJ6cy0+YmFja2luZ19zd2FwX2V4dGVudF9saXN0Lm5leHQsCisJCQkJCXN0cnVjdCBwYWdlLCBscnUpOworCXNlID0gcGFnZV9hZGRyZXNzKHNlX3BhZ2UpOworCXNwYW4gPSBzZS0+bnVtX3BhZ2VzOworCW51bV9wYWdlcyA9IHJ6cy0+ZGlza3NpemUgPj4gUEFHRV9TSElGVDsKKwludW1fdGFibGVfcGFnZXMgPSBESVZfUk9VTkRfVVAobnVtX3BhZ2VzICogc2l6ZW9mKCpyenMtPnRhYmxlKSwKKwkJCQkJCQlQQUdFX1NJWkUpOworCisJZW50cnkgPSAwOworCXNlX2lkeCA9IDA7CisJd2hpbGUgKG51bV90YWJsZV9wYWdlcy0tKSB7CisJCXRhYmxlX3BhZ2UgPSB2bWFsbG9jX3RvX3BhZ2UoJnJ6cy0+dGFibGVbZW50cnldKTsKKwkJd2hpbGUgKHNwYW4gPD0gZW50cnkpIHsKKwkJCXNlX2lkeCsrOworCQkJaWYgKHNlX2lkeCA9PSByenMtPm51bV9leHRlbnRzKQorCQkJCUJVRygpOworCisJCQlpZiAoIShzZV9pZHggJSBleHRlbnRzX3Blcl9wYWdlKSkgeworCQkJCXNlX3BhZ2UgPSBsaXN0X2VudHJ5KHNlX3BhZ2UtPmxydS5uZXh0LAorCQkJCQkJc3RydWN0IHBhZ2UsIGxydSk7CisJCQkJc2UgPSBwYWdlX2FkZHJlc3Moc2VfcGFnZSk7CisJCQl9IGVsc2UKKwkJCQlzZSsrOworCisJCQlzcGFuICs9IHNlLT5udW1fcGFnZXM7CisJCX0KKwkJdGFibGVfcGFnZS0+bWFwcGluZyA9IChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqKXNlOworCQl0YWJsZV9wYWdlLT5wcml2YXRlID0gc2UtPm51bV9wYWdlcyAtIChzcGFuIC0gZW50cnkpOworCQlwcl9kZWJ1ZygibWFwX3RhYmxlOiBlbnRyeT0lbHUsIHNwYW49JWx1LCBtYXA9JXAsIHByaXY9JWx1XG4iLAorCQkJZW50cnksIHNwYW4sIHRhYmxlX3BhZ2UtPm1hcHBpbmcsIHRhYmxlX3BhZ2UtPnByaXZhdGUpOworCQllbnRyeSArPSBlbnRyaWVzX3Blcl9wYWdlOworCX0KK30KKworLyoKKyAqIENoZWNrIGlmIHZhbHVlIG9mIGJhY2tpbmdfc3dhcCBtb2R1bGUgcGFyYW0gaXMgc2FuZS4KKyAqIENsYWltIHRoaXMgZGV2aWNlIGFuZCBzZXQgcmFtenN3YXAgc2l6ZSBlcXVhbCB0bworICogc2l6ZSBvZiB0aGlzIGJsb2NrIGRldmljZS4KKyAqLworc3RhdGljIGludCBzZXR1cF9iYWNraW5nX3N3YXAoc3RydWN0IHJhbXpzd2FwICpyenMpCit7CisJaW50IHJldCA9IDA7CisJc2l6ZV90IGRpc2tzaXplOworCXVuc2lnbmVkIGxvbmcgbnVtX3BhZ2VzID0gMDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBmaWxlICpzd2FwX2ZpbGU7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IE5VTEw7CisKKwlpZiAoIXJ6cy0+YmFja2luZ19zd2FwX25hbWVbMF0pIHsKKwkJcHJfZGVidWcoImJhY2tpbmdfc3dhcCBwYXJhbSBub3QgZ2l2ZW5cbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlwcl9pbmZvKCJVc2luZyBiYWNraW5nIHN3YXAgZGV2aWNlOiAlc1xuIiwgcnpzLT5iYWNraW5nX3N3YXBfbmFtZSk7CisKKwlzd2FwX2ZpbGUgPSBmaWxwX29wZW4ocnpzLT5iYWNraW5nX3N3YXBfbmFtZSwKKwkJCQlPX1JEV1IgfCBPX0xBUkdFRklMRSwgMCk7CisJaWYgKElTX0VSUihzd2FwX2ZpbGUpKSB7CisJCXByX2VycigiRXJyb3Igb3BlbmluZyBiYWNraW5nIGRldmljZTogJXNcbiIsCisJCQlyenMtPmJhY2tpbmdfc3dhcF9uYW1lKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJbWFwcGluZyA9IHN3YXBfZmlsZS0+Zl9tYXBwaW5nOworCWlub2RlID0gbWFwcGluZy0+aG9zdDsKKworCWlmIChTX0lTQkxLKGlub2RlLT5pX21vZGUpKSB7CisJCWJkZXYgPSBJX0JERVYoaW5vZGUpOworCQlyZXQgPSBiZF9jbGFpbShiZGV2LCBzZXR1cF9iYWNraW5nX3N3YXApOworCQlpZiAocmV0IDwgMCkgeworCQkJYmRldiA9IE5VTEw7CisJCQlnb3RvIGJhZF9wYXJhbTsKKwkJfQorCQlkaXNrc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwl9IGVsc2UgaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJYmRldiA9IGlub2RlLT5pX3NiLT5zX2JkZXY7CisJCWlmIChJU19TV0FQRklMRShpbm9kZSkpIHsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gYmFkX3BhcmFtOworCQl9CisJCXJldCA9IHNldHVwX2JhY2tpbmdfc3dhcF9leHRlbnRzKHJ6cywgaW5vZGUsICZudW1fcGFnZXMpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gYmFkX3BhcmFtOworCQlkaXNrc2l6ZSA9IG51bV9wYWdlcyA8PCBQQUdFX1NISUZUOworCX0gZWxzZSB7CisJCWdvdG8gYmFkX3BhcmFtOworCX0KKworCXJ6cy0+c3dhcF9maWxlID0gc3dhcF9maWxlOworCXJ6cy0+YmFja2luZ19zd2FwID0gYmRldjsKKwlyenMtPmRpc2tzaXplID0gZGlza3NpemU7CisJQlVHX09OKCFyenMtPmRpc2tzaXplKTsKKworCXJldHVybiAwOworCitiYWRfcGFyYW06CisJaWYgKGJkZXYpCisJCWJkX3JlbGVhc2UoYmRldik7CisJZmlscF9jbG9zZShzd2FwX2ZpbGUsIE5VTEwpOworCitvdXQ6CisJcnpzLT5iYWNraW5nX3N3YXAgPSBOVUxMOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBNYXAgbG9naWNhbCBwYWdlIG51bWJlciAncGFnZW51bScgdG8gcGh5c2ljYWwgcGFnZSBudW1iZXIKKyAqIG9uIGJhY2tpbmcgc3dhcCBkZXZpY2UuIEZvciBibG9jayBkZXZpY2UsIHRoaXMgaXMgYSBub3AuCisgKi8KK3UzMiBtYXBfYmFja2luZ19zd2FwX3BhZ2Uoc3RydWN0IHJhbXpzd2FwICpyenMsIHUzMiBwYWdlbnVtKQoreworCXUzMiBza2lwX3BhZ2VzLCBlbnRyaWVzX3Blcl9wYWdlOworCXNpemVfdCBkZWx0YSwgc2Vfb2Zmc2V0LCBza2lwcGVkOworCXN0cnVjdCBwYWdlICp0YWJsZV9wYWdlLCAqc2VfcGFnZTsKKwlzdHJ1Y3QgcmFtenN3YXBfYmFja2luZ19leHRlbnQgKnNlOworCisJaWYgKCFyenMtPm51bV9leHRlbnRzKQorCQlyZXR1cm4gcGFnZW51bTsKKworCWVudHJpZXNfcGVyX3BhZ2UgPSBQQUdFX1NJWkUgLyBzaXplb2YoKnJ6cy0+dGFibGUpOworCisJdGFibGVfcGFnZSA9IHZtYWxsb2NfdG9fcGFnZSgmcnpzLT50YWJsZVtwYWdlbnVtXSk7CisJc2UgPSAoc3RydWN0IHJhbXpzd2FwX2JhY2tpbmdfZXh0ZW50ICopdGFibGVfcGFnZS0+bWFwcGluZzsKKwlzZV9wYWdlID0gdmlydF90b19wYWdlKHNlKTsKKworCXNraXBfcGFnZXMgPSBwYWdlbnVtIC0gKHBhZ2VudW0gLyBlbnRyaWVzX3Blcl9wYWdlICogZW50cmllc19wZXJfcGFnZSk7CisJc2Vfb2Zmc2V0ID0gdGFibGVfcGFnZS0+cHJpdmF0ZSArIHNraXBfcGFnZXM7CisKKwlpZiAoc2Vfb2Zmc2V0IDwgc2UtPm51bV9wYWdlcykKKwkJcmV0dXJuIHNlLT5waHlfcGFnZW51bSArIHNlX29mZnNldDsKKworCXNraXBwZWQgPSBzZS0+bnVtX3BhZ2VzIC0gdGFibGVfcGFnZS0+cHJpdmF0ZTsKKwlkbyB7CisJCXN0cnVjdCByYW16c3dhcF9iYWNraW5nX2V4dGVudCAqc2VfYmFzZTsKKwkJdTMyIHNlX2VudHJpZXNfcGVyX3BhZ2UgPSBQQUdFX1NJWkUgLyBzaXplb2YoKnNlKTsKKworCQkvKiBHZXQgbmV4dCBzd2FwIGV4dGVudCAqLworCQlzZV9iYXNlID0gKHN0cnVjdCByYW16c3dhcF9iYWNraW5nX2V4dGVudCAqKQorCQkJCQkJcGFnZV9hZGRyZXNzKHNlX3BhZ2UpOworCQlpZiAoc2UgLSBzZV9iYXNlID09IHNlX2VudHJpZXNfcGVyX3BhZ2UgLSAxKSB7CisJCQlzZV9wYWdlID0gbGlzdF9lbnRyeShzZV9wYWdlLT5scnUubmV4dCwKKwkJCQkJCXN0cnVjdCBwYWdlLCBscnUpOworCQkJc2UgPSBwYWdlX2FkZHJlc3Moc2VfcGFnZSk7CisJCX0gZWxzZSB7CisJCQlzZSsrOworCQl9CisKKwkJc2tpcHBlZCArPSBzZS0+bnVtX3BhZ2VzOworCX0gd2hpbGUgKHNraXBwZWQgPCBza2lwX3BhZ2VzKTsKKworCWRlbHRhID0gc2tpcHBlZCAtIHNraXBfcGFnZXM7CisJc2Vfb2Zmc2V0ID0gc2UtPm51bV9wYWdlcyAtIGRlbHRhOworCisJcmV0dXJuIHNlLT5waHlfcGFnZW51bSArIHNlX29mZnNldDsKK30KKworc3RhdGljIHZvaWQgcmFtenN3YXBfZnJlZV9wYWdlKHN0cnVjdCByYW16c3dhcCAqcnpzLCBzaXplX3QgaW5kZXgpCit7CisJdTMyIGNsZW47CisJdm9pZCAqb2JqOworCisJc3RydWN0IHBhZ2UgKnBhZ2UgPSByenMtPnRhYmxlW2luZGV4XS5wYWdlOworCXUzMiBvZmZzZXQgPSByenMtPnRhYmxlW2luZGV4XS5vZmZzZXQ7CisKKwlpZiAodW5saWtlbHkoIXBhZ2UpKSB7CisJCWlmIChyenNfdGVzdF9mbGFnKHJ6cywgaW5kZXgsIFJaU19aRVJPKSkgeworCQkJcnpzX2NsZWFyX2ZsYWcocnpzLCBpbmRleCwgUlpTX1pFUk8pOworCQkJc3RhdF9kZWMocnpzLT5zdGF0cy5wYWdlc196ZXJvKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJaWYgKHVubGlrZWx5KHJ6c190ZXN0X2ZsYWcocnpzLCBpbmRleCwgUlpTX1VOQ09NUFJFU1NFRCkpKSB7CisJCWNsZW4gPSBQQUdFX1NJWkU7CisJCV9fZnJlZV9wYWdlKHBhZ2UpOworCQlyenNfY2xlYXJfZmxhZyhyenMsIGluZGV4LCBSWlNfVU5DT01QUkVTU0VEKTsKKwkJc3RhdF9kZWMocnpzLT5zdGF0cy5wYWdlc19leHBhbmQpOworCQlnb3RvIG91dDsKKwl9CisKKwlvYmogPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCkgKyBvZmZzZXQ7CisJY2xlbiA9IHh2X2dldF9vYmplY3Rfc2l6ZShvYmopIC0gc2l6ZW9mKHN0cnVjdCB6b2JqX2hlYWRlcik7CisJa3VubWFwX2F0b21pYyhvYmosIEtNX1VTRVIwKTsKKworCXh2X2ZyZWUocnpzLT5tZW1fcG9vbCwgcGFnZSwgb2Zmc2V0KTsKKwlpZiAoY2xlbiA8PSBQQUdFX1NJWkUgLyAyKQorCQlzdGF0X2RlYyhyenMtPnN0YXRzLmdvb2RfY29tcHJlc3MpOworCitvdXQ6CisJcnpzLT5zdGF0cy5jb21wcl9zaXplIC09IGNsZW47CisJc3RhdF9kZWMocnpzLT5zdGF0cy5wYWdlc19zdG9yZWQpOworCisJcnpzLT50YWJsZVtpbmRleF0ucGFnZSA9IE5VTEw7CisJcnpzLT50YWJsZVtpbmRleF0ub2Zmc2V0ID0gMDsKK30KKworc3RhdGljIGludCBoYW5kbGVfemVyb19wYWdlKHN0cnVjdCBiaW8gKmJpbykKK3sKKwl2b2lkICp1c2VyX21lbTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGJpby0+YmlfaW9fdmVjWzBdLmJ2X3BhZ2U7CisKKwl1c2VyX21lbSA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwltZW1zZXQodXNlcl9tZW0sIDAsIFBBR0VfU0laRSk7CisJa3VubWFwX2F0b21pYyh1c2VyX21lbSwgS01fVVNFUjApOworCisJcmFtenN3YXBfZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisKKwlzZXRfYml0KEJJT19VUFRPREFURSwgJmJpby0+YmlfZmxhZ3MpOworCWJpb19lbmRpbyhiaW8sIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV91bmNvbXByZXNzZWRfcGFnZShzdHJ1Y3QgcmFtenN3YXAgKnJ6cywgc3RydWN0IGJpbyAqYmlvKQoreworCXUzMiBpbmRleDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBjaGFyICp1c2VyX21lbSwgKmNtZW07CisKKwlwYWdlID0gYmlvLT5iaV9pb192ZWNbMF0uYnZfcGFnZTsKKwlpbmRleCA9IGJpby0+Ymlfc2VjdG9yID4+IFNFQ1RPUlNfUEVSX1BBR0VfU0hJRlQ7CisKKwl1c2VyX21lbSA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwljbWVtID0ga21hcF9hdG9taWMocnpzLT50YWJsZVtpbmRleF0ucGFnZSwgS01fVVNFUjEpICsKKwkJCXJ6cy0+dGFibGVbaW5kZXhdLm9mZnNldDsKKworCW1lbWNweSh1c2VyX21lbSwgY21lbSwgUEFHRV9TSVpFKTsKKwlrdW5tYXBfYXRvbWljKHVzZXJfbWVtLCBLTV9VU0VSMCk7CisJa3VubWFwX2F0b21pYyhjbWVtLCBLTV9VU0VSMSk7CisKKwlyYW16c3dhcF9mbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKworCXNldF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncyk7CisJYmlvX2VuZGlvKGJpbywgMCk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIENhbGxlZCB3aGVuIHJlcXVlc3QgcGFnZSBpcyBub3QgcHJlc2VudCBpbiByYW16c3dhcC4KKyAqIEl0cyBlaXRoZXIgaW4gYmFja2luZyBzd2FwIGRldmljZSAoaWYgcHJlc2VudCkgb3IKKyAqIHRoaXMgaXMgYW4gYXR0ZW1wdCB0byByZWFkIGJlZm9yZSBhbnkgcHJldmlvdXMgd3JpdGUKKyAqIHRvIHRoaXMgbG9jYXRpb24gLSB0aGlzIGhhcHBlbnMgZHVlIHRvIHJlYWRhaGVhZCB3aGVuCisgKiBzd2FwIGRldmljZSBpcyByZWFkIGZyb20gdXNlci1zcGFjZSAoZS5nLiBkdXJpbmcgc3dhcG9uKQorICovCitzdGF0aWMgaW50IGhhbmRsZV9yYW16c3dhcF9mYXVsdChzdHJ1Y3QgcmFtenN3YXAgKnJ6cywgc3RydWN0IGJpbyAqYmlvKQoreworCS8qCisJICogQWx3YXlzIGZvcndhcmQgc3VjaCByZXF1ZXN0cyB0byBiYWNraW5nIHN3YXAKKwkgKiBkZXZpY2UgKGlmIHByZXNlbnQpCisJICovCisJaWYgKHJ6cy0+YmFja2luZ19zd2FwKSB7CisJCXUzMiBwYWdlbnVtOworCQlzdGF0X2RlYyhyenMtPnN0YXRzLm51bV9yZWFkcyk7CisJCXN0YXRfaW5jKHJ6cy0+c3RhdHMuYmRldl9udW1fcmVhZHMpOworCQliaW8tPmJpX2JkZXYgPSByenMtPmJhY2tpbmdfc3dhcDsKKworCQkvKgorCQkgKiBJbiBjYXNlIGJhY2tpbmcgc3dhcCBpcyBhIGZpbGUsIGZpbmQgdGhlIHJpZ2h0IG9mZnNldCB3aXRoaW4KKwkJICogdGhlIGZpbGUgY29ycmVzcG9uZGluZyB0byBsb2dpY2FsIHBvc2l0aW9uICdpbmRleCcuIEZvciBibG9jaworCQkgKiBkZXZpY2UsIHRoaXMgaXMgYSBub3AuCisJCSAqLworCQlwYWdlbnVtID0gYmlvLT5iaV9zZWN0b3IgPj4gU0VDVE9SU19QRVJfUEFHRV9TSElGVDsKKwkJYmlvLT5iaV9zZWN0b3IgPSBtYXBfYmFja2luZ19zd2FwX3BhZ2UocnpzLCBwYWdlbnVtKQorCQkJCQk8PCBTRUNUT1JTX1BFUl9QQUdFX1NISUZUOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIEl0cyB1bmxpa2VseSBldmVudCBpbiBjYXNlIGJhY2tpbmcgZGV2IGlzCisJICogbm90IHByZXNlbnQKKwkgKi8KKwlwcl9kZWJ1ZygiUmVhZCBiZWZvcmUgd3JpdGUgb24gc3dhcCBkZXZpY2U6ICIKKwkJInNlY3Rvcj0lbHUsIHNpemU9JXUsIG9mZnNldD0ldVxuIiwKKwkJKHVsb25nKShiaW8tPmJpX3NlY3RvciksIGJpby0+Ymlfc2l6ZSwKKwkJYmlvLT5iaV9pb192ZWNbMF0uYnZfb2Zmc2V0KTsKKworCS8qIERvIG5vdGhpbmcuIEp1c3QgcmV0dXJuIHN1Y2Nlc3MgKi8KKwlzZXRfYml0KEJJT19VUFRPREFURSwgJmJpby0+YmlfZmxhZ3MpOworCWJpb19lbmRpbyhiaW8sIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJhbXpzd2FwX3JlYWQoc3RydWN0IHJhbXpzd2FwICpyenMsIHN0cnVjdCBiaW8gKmJpbykKK3sKKwlpbnQgcmV0OworCXUzMiBpbmRleDsKKwlzaXplX3QgY2xlbjsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3Qgem9ial9oZWFkZXIgKnpoZWFkZXI7CisJdW5zaWduZWQgY2hhciAqdXNlcl9tZW0sICpjbWVtOworCisJc3RhdF9pbmMocnpzLT5zdGF0cy5udW1fcmVhZHMpOworCisJcGFnZSA9IGJpby0+YmlfaW9fdmVjWzBdLmJ2X3BhZ2U7CisJaW5kZXggPSBiaW8tPmJpX3NlY3RvciA+PiBTRUNUT1JTX1BFUl9QQUdFX1NISUZUOworCisJaWYgKHJ6c190ZXN0X2ZsYWcocnpzLCBpbmRleCwgUlpTX1pFUk8pKQorCQlyZXR1cm4gaGFuZGxlX3plcm9fcGFnZShiaW8pOworCisJLyogUmVxdWVzdGVkIHBhZ2UgaXMgbm90IHByZXNlbnQgaW4gY29tcHJlc3NlZCBhcmVhICovCisJaWYgKCFyenMtPnRhYmxlW2luZGV4XS5wYWdlKQorCQlyZXR1cm4gaGFuZGxlX3JhbXpzd2FwX2ZhdWx0KHJ6cywgYmlvKTsKKworCS8qIFBhZ2UgaXMgc3RvcmVkIHVuY29tcHJlc3NlZCBzaW5jZSBpdHMgaW5jb21wcmVzc2libGUgKi8KKwlpZiAodW5saWtlbHkocnpzX3Rlc3RfZmxhZyhyenMsIGluZGV4LCBSWlNfVU5DT01QUkVTU0VEKSkpCisJCXJldHVybiBoYW5kbGVfdW5jb21wcmVzc2VkX3BhZ2UocnpzLCBiaW8pOworCisJdXNlcl9tZW0gPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJY2xlbiA9IFBBR0VfU0laRTsKKworCWNtZW0gPSBrbWFwX2F0b21pYyhyenMtPnRhYmxlW2luZGV4XS5wYWdlLCBLTV9VU0VSMSkgKworCQkJcnpzLT50YWJsZVtpbmRleF0ub2Zmc2V0OworCisJcmV0ID0gbHpvMXhfZGVjb21wcmVzc19zYWZlKAorCQljbWVtICsgc2l6ZW9mKCp6aGVhZGVyKSwKKwkJeHZfZ2V0X29iamVjdF9zaXplKGNtZW0pIC0gc2l6ZW9mKCp6aGVhZGVyKSwKKwkJdXNlcl9tZW0sICZjbGVuKTsKKworCWt1bm1hcF9hdG9taWModXNlcl9tZW0sIEtNX1VTRVIwKTsKKwlrdW5tYXBfYXRvbWljKGNtZW0sIEtNX1VTRVIxKTsKKworCS8qIHNob3VsZCBORVZFUiBoYXBwZW4gKi8KKwlpZiAodW5saWtlbHkocmV0ICE9IExaT19FX09LKSkgeworCQlwcl9lcnIoIkRlY29tcHJlc3Npb24gZmFpbGVkISBlcnI9JWQsIHBhZ2U9JXVcbiIsCisJCQlyZXQsIGluZGV4KTsKKwkJc3RhdF9pbmMocnpzLT5zdGF0cy5mYWlsZWRfcmVhZHMpOworCQlnb3RvIG91dDsKKwl9CisKKwlyYW16c3dhcF9mbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKworCXNldF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncyk7CisJYmlvX2VuZGlvKGJpbywgMCk7CisJcmV0dXJuIDA7CisKK291dDoKKwliaW9faW9fZXJyb3IoYmlvKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYW16c3dhcF93cml0ZShzdHJ1Y3QgcmFtenN3YXAgKnJ6cywgc3RydWN0IGJpbyAqYmlvKQoreworCWludCByZXQsIGZ3ZF93cml0ZV9yZXF1ZXN0ID0gMDsKKwl1MzIgb2Zmc2V0LCBpbmRleDsKKwlzaXplX3QgY2xlbjsKKwlzdHJ1Y3Qgem9ial9oZWFkZXIgKnpoZWFkZXI7CisJc3RydWN0IHBhZ2UgKnBhZ2UsICpwYWdlX3N0b3JlOworCXVuc2lnbmVkIGNoYXIgKnVzZXJfbWVtLCAqY21lbSwgKnNyYzsKKworCXN0YXRfaW5jKHJ6cy0+c3RhdHMubnVtX3dyaXRlcyk7CisKKwlwYWdlID0gYmlvLT5iaV9pb192ZWNbMF0uYnZfcGFnZTsKKwlpbmRleCA9IGJpby0+Ymlfc2VjdG9yID4+IFNFQ1RPUlNfUEVSX1BBR0VfU0hJRlQ7CisKKwlzcmMgPSByenMtPmNvbXByZXNzX2J1ZmZlcjsKKworCS8qCisJICogU3lzdGVtIHN3YXBzIHRvIHNhbWUgc2VjdG9yIGFnYWluIHdoZW4gdGhlIHN0b3JlZCBwYWdlCisJICogaXMgbm8gbG9uZ2VyIHJlZmVyZW5jZWQgYnkgYW55IHByb2Nlc3MuIFNvLCBpdHMgbm93IHNhZmUKKwkgKiB0byBmcmVlIHRoZSBtZW1vcnkgdGhhdCB3YXMgYWxsb2NhdGVkIGZvciB0aGlzIHBhZ2UuCisJICovCisJaWYgKHJ6cy0+dGFibGVbaW5kZXhdLnBhZ2UpCisJCXJhbXpzd2FwX2ZyZWVfcGFnZShyenMsIGluZGV4KTsKKworCS8qCisJICogTm8gbWVtb3J5IGlhIGFsbG9jYXRlZCBmb3IgemVybyBmaWxsZWQgcGFnZXMuCisJICogU2ltcGx5IGNsZWFyIHplcm8gcGFnZSBmbGFnLgorCSAqLworCWlmIChyenNfdGVzdF9mbGFnKHJ6cywgaW5kZXgsIFJaU19aRVJPKSkgeworCQlzdGF0X2RlYyhyenMtPnN0YXRzLnBhZ2VzX3plcm8pOworCQlyenNfY2xlYXJfZmxhZyhyenMsIGluZGV4LCBSWlNfWkVSTyk7CisJfQorCisJbXV0ZXhfbG9jaygmcnpzLT5sb2NrKTsKKworCXVzZXJfbWVtID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCWlmIChwYWdlX3plcm9fZmlsbGVkKHVzZXJfbWVtKSkgeworCQlrdW5tYXBfYXRvbWljKHVzZXJfbWVtLCBLTV9VU0VSMCk7CisJCW11dGV4X3VubG9jaygmcnpzLT5sb2NrKTsKKwkJc3RhdF9pbmMocnpzLT5zdGF0cy5wYWdlc196ZXJvKTsKKwkJcnpzX3NldF9mbGFnKHJ6cywgaW5kZXgsIFJaU19aRVJPKTsKKworCQlzZXRfYml0KEJJT19VUFRPREFURSwgJmJpby0+YmlfZmxhZ3MpOworCQliaW9fZW5kaW8oYmlvLCAwKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHJ6cy0+YmFja2luZ19zd2FwICYmCisJCShyenMtPnN0YXRzLmNvbXByX3NpemUgPiByenMtPm1lbWxpbWl0IC0gUEFHRV9TSVpFKSkgeworCQlrdW5tYXBfYXRvbWljKHVzZXJfbWVtLCBLTV9VU0VSMCk7CisJCW11dGV4X3VubG9jaygmcnpzLT5sb2NrKTsKKwkJZndkX3dyaXRlX3JlcXVlc3QgPSAxOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBsem8xeF8xX2NvbXByZXNzKHVzZXJfbWVtLCBQQUdFX1NJWkUsIHNyYywgJmNsZW4sCisJCQkJcnpzLT5jb21wcmVzc193b3JrbWVtKTsKKworCWt1bm1hcF9hdG9taWModXNlcl9tZW0sIEtNX1VTRVIwKTsKKworCWlmICh1bmxpa2VseShyZXQgIT0gTFpPX0VfT0spKSB7CisJCW11dGV4X3VubG9jaygmcnpzLT5sb2NrKTsKKwkJcHJfZXJyKCJDb21wcmVzc2lvbiBmYWlsZWQhIGVycj0lZFxuIiwgcmV0KTsKKwkJc3RhdF9pbmMocnpzLT5zdGF0cy5mYWlsZWRfd3JpdGVzKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBQYWdlIGlzIGluY29tcHJlc3NpYmxlLiBGb3J3YXJkIGl0IHRvIGJhY2tpbmcgc3dhcAorCSAqIGlmIHByZXNlbnQuIE90aGVyd2lzZSwgc3RvcmUgaXQgYXMtaXMgKHVuY29tcHJlc3NlZCkKKwkgKiBzaW5jZSB3ZSBkbyBub3Qgd2FudCB0byByZXR1cm4gdG9vIG1hbnkgc3dhcCB3cml0ZQorCSAqIGVycm9ycyB3aGljaCBoYXMgc2lkZSBlZmZlY3Qgb2YgaGFuZ2luZyB0aGUgc3lzdGVtLgorCSAqLworCWlmICh1bmxpa2VseShjbGVuID4gbWF4X3pwYWdlX3NpemUpKSB7CisJCWlmIChyenMtPmJhY2tpbmdfc3dhcCkgeworCQkJbXV0ZXhfdW5sb2NrKCZyenMtPmxvY2spOworCQkJZndkX3dyaXRlX3JlcXVlc3QgPSAxOworCQkJZ290byBvdXQ7CisJCX0KKworCQljbGVuID0gUEFHRV9TSVpFOworCQlwYWdlX3N0b3JlID0gYWxsb2NfcGFnZShHRlBfTk9JTyB8IF9fR0ZQX0hJR0hNRU0pOworCQlpZiAodW5saWtlbHkoIXBhZ2Vfc3RvcmUpKSB7CisJCQltdXRleF91bmxvY2soJnJ6cy0+bG9jayk7CisJCQlwcl9pbmZvKCJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeSBmb3IgaW5jb21wcmVzc2libGUgIgorCQkJCSJwYWdlOiAldVxuIiwgaW5kZXgpOworCQkJc3RhdF9pbmMocnpzLT5zdGF0cy5mYWlsZWRfd3JpdGVzKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJb2Zmc2V0ID0gMDsKKwkJcnpzX3NldF9mbGFnKHJ6cywgaW5kZXgsIFJaU19VTkNPTVBSRVNTRUQpOworCQlzdGF0X2luYyhyenMtPnN0YXRzLnBhZ2VzX2V4cGFuZCk7CisJCXJ6cy0+dGFibGVbaW5kZXhdLnBhZ2UgPSBwYWdlX3N0b3JlOworCQlzcmMgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCWdvdG8gbWVtc3RvcmU7CisJfQorCisJaWYgKHh2X21hbGxvYyhyenMtPm1lbV9wb29sLCBjbGVuICsgc2l6ZW9mKCp6aGVhZGVyKSwKKwkJCSZyenMtPnRhYmxlW2luZGV4XS5wYWdlLCAmb2Zmc2V0LAorCQkJR0ZQX05PSU8gfCBfX0dGUF9ISUdITUVNKSkgeworCQltdXRleF91bmxvY2soJnJ6cy0+bG9jayk7CisJCXByX2luZm8oIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5IGZvciBjb21wcmVzc2VkICIKKwkJCSJwYWdlOiAldSwgc2l6ZT0lenVcbiIsIGluZGV4LCBjbGVuKTsKKwkJc3RhdF9pbmMocnpzLT5zdGF0cy5mYWlsZWRfd3JpdGVzKTsKKwkJaWYgKHJ6cy0+YmFja2luZ19zd2FwKQorCQkJZndkX3dyaXRlX3JlcXVlc3QgPSAxOworCQlnb3RvIG91dDsKKwl9CisKK21lbXN0b3JlOgorCXJ6cy0+dGFibGVbaW5kZXhdLm9mZnNldCA9IG9mZnNldDsKKworCWNtZW0gPSBrbWFwX2F0b21pYyhyenMtPnRhYmxlW2luZGV4XS5wYWdlLCBLTV9VU0VSMSkgKworCQkJcnpzLT50YWJsZVtpbmRleF0ub2Zmc2V0OworCisjaWYgMAorCS8qIEJhY2stcmVmZXJlbmNlIG5lZWRlZCBmb3IgbWVtb3J5IGRlZnJhZ21lbnRhdGlvbiAqLworCWlmICghcnpzX3Rlc3RfZmxhZyhyenMsIGluZGV4LCBSWlNfVU5DT01QUkVTU0VEKSkgeworCQl6aGVhZGVyID0gKHN0cnVjdCB6b2JqX2hlYWRlciAqKWNtZW07CisJCXpoZWFkZXItPnRhYmxlX2lkeCA9IGluZGV4OworCQljbWVtICs9IHNpemVvZigqemhlYWRlcik7CisJfQorI2VuZGlmCisKKwltZW1jcHkoY21lbSwgc3JjLCBjbGVuKTsKKworCWt1bm1hcF9hdG9taWMoY21lbSwgS01fVVNFUjEpOworCWlmICh1bmxpa2VseShyenNfdGVzdF9mbGFnKHJ6cywgaW5kZXgsIFJaU19VTkNPTVBSRVNTRUQpKSkKKwkJa3VubWFwX2F0b21pYyhzcmMsIEtNX1VTRVIwKTsKKworCS8qIFVwZGF0ZSBzdGF0cyAqLworCXJ6cy0+c3RhdHMuY29tcHJfc2l6ZSArPSBjbGVuOworCXN0YXRfaW5jKHJ6cy0+c3RhdHMucGFnZXNfc3RvcmVkKTsKKwlpZiAoY2xlbiA8PSBQQUdFX1NJWkUgLyAyKQorCQlzdGF0X2luYyhyenMtPnN0YXRzLmdvb2RfY29tcHJlc3MpOworCisJbXV0ZXhfdW5sb2NrKCZyenMtPmxvY2spOworCisJc2V0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKKwliaW9fZW5kaW8oYmlvLCAwKTsKKwlyZXR1cm4gMDsKKworb3V0OgorCWlmIChmd2Rfd3JpdGVfcmVxdWVzdCkgeworCQlzdGF0X2luYyhyenMtPnN0YXRzLmJkZXZfbnVtX3dyaXRlcyk7CisJCWJpby0+YmlfYmRldiA9IHJ6cy0+YmFja2luZ19zd2FwOworI2lmIDAKKwkJLyoKKwkJICogVE9ETzogV2UgY3VycmVudGx5IGhhdmUgbGluZWFyIG1hcHBpbmcgb2YgcmFtenN3YXAgYW5kCisJCSAqIGJhY2tpbmcgc3dhcCBzZWN0b3JzLiBUaGlzIGlzIG5vdCBkZXNpcmVkIHNpbmNlIHdlIHdhbnQKKwkJICogdG8gb3B0aW1pemUgd3JpdGVzIHRvIGJhY2tpbmcgc3dhcCB0byBtaW5pbWl6ZSBkaXNrIHNlZWtzCisJCSAqIG9yIGhhdmUgZWZmZWN0aXZlIHdlYXIgbGV2ZWxpbmcgKGZvciBTU0RzKS4gQWxzbywgYQorCQkgKiBub24tbGluZWFyIG1hcHBpbmcgaXMgcmVxdWlyZWQgdG8gaW1wbGVtZW50IGNvbXByZXNzZWQKKwkJICogb24tZGlzayBzd2FwcGluZy4KKwkJICovCisJCSBiaW8tPmJpX3NlY3RvciA9IGdldF9iYWNraW5nX3N3YXBfcGFnZSgpCisJCQkJCTw8IFNFQ1RPUlNfUEVSX1BBR0VfU0hJRlQ7CisjZW5kaWYKKwkJLyoKKwkJICogSW4gY2FzZSBiYWNraW5nIHN3YXAgaXMgYSBmaWxlLCBmaW5kIHRoZSByaWdodCBvZmZzZXQgd2l0aGluCisJCSAqIHRoZSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gbG9naWNhbCBwb3NpdGlvbiAnaW5kZXgnLiBGb3IgYmxvY2sKKwkJICogZGV2aWNlLCB0aGlzIGlzIGEgbm9wLgorCQkgKi8KKwkJYmlvLT5iaV9zZWN0b3IgPSBtYXBfYmFja2luZ19zd2FwX3BhZ2UocnpzLCBpbmRleCkKKwkJCQkJPDwgU0VDVE9SU19QRVJfUEFHRV9TSElGVDsKKwkJcmV0dXJuIDE7CisJfQorCisJYmlvX2lvX2Vycm9yKGJpbyk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIENoZWNrIGlmIHJlcXVlc3QgaXMgd2l0aGluIGJvdW5kcyBhbmQgcGFnZSBhbGlnbmVkLgorICovCitzdGF0aWMgaW5saW5lIGludCB2YWxpZF9zd2FwX3JlcXVlc3Qoc3RydWN0IHJhbXpzd2FwICpyenMsIHN0cnVjdCBiaW8gKmJpbykKK3sKKwlpZiAodW5saWtlbHkoCisJCShiaW8tPmJpX3NlY3RvciA+PSAocnpzLT5kaXNrc2l6ZSA+PiBTRUNUT1JfU0hJRlQpKSB8fAorCQkoYmlvLT5iaV9zZWN0b3IgJiAoU0VDVE9SU19QRVJfUEFHRSAtIDEpKSB8fAorCQkoYmlvLT5iaV92Y250ICE9IDEpIHx8CisJCShiaW8tPmJpX3NpemUgIT0gUEFHRV9TSVpFKSB8fAorCQkoYmlvLT5iaV9pb192ZWNbMF0uYnZfb2Zmc2V0ICE9IDApKSkgeworCisJCXJldHVybiAwOworCX0KKworCS8qIHN3YXAgcmVxdWVzdCBpcyB2YWxpZCAqLworCXJldHVybiAxOworfQorCisvKgorICogSGFuZGxlciBmdW5jdGlvbiBmb3IgYWxsIHJhbXpzd2FwIEkvTyByZXF1ZXN0cy4KKyAqLworc3RhdGljIGludCByYW16c3dhcF9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnF1ZXVlLCBzdHJ1Y3QgYmlvICpiaW8pCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHJhbXpzd2FwICpyenMgPSBxdWV1ZS0+cXVldWVkYXRhOworCisJaWYgKHVubGlrZWx5KCFyenMtPmluaXRfZG9uZSkpIHsKKwkJYmlvX2lvX2Vycm9yKGJpbyk7CisJCXJldHVybiAwOworCX0KKworCWlmICghdmFsaWRfc3dhcF9yZXF1ZXN0KHJ6cywgYmlvKSkgeworCQlzdGF0X2luYyhyenMtPnN0YXRzLmludmFsaWRfaW8pOworCQliaW9faW9fZXJyb3IoYmlvKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChiaW9fZGF0YV9kaXIoYmlvKSkgeworCWNhc2UgUkVBRDoKKwkJcmV0ID0gcmFtenN3YXBfcmVhZChyenMsIGJpbyk7CisJCWJyZWFrOworCisJY2FzZSBXUklURToKKwkJcmV0ID0gcmFtenN3YXBfd3JpdGUocnpzLCBiaW8pOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCByZXNldF9kZXZpY2Uoc3RydWN0IHJhbXpzd2FwICpyenMpCit7CisJaW50IGlzX2JhY2tpbmdfYmxrZGV2ID0gMDsKKwlzaXplX3QgaW5kZXgsIG51bV9wYWdlczsKKwl1bnNpZ25lZCBlbnRyaWVzX3Blcl9wYWdlOworCXVuc2lnbmVkIGxvbmcgbnVtX3RhYmxlX3BhZ2VzLCBlbnRyeSA9IDA7CisKKwlpZiAocnpzLT5iYWNraW5nX3N3YXAgJiYgIXJ6cy0+bnVtX2V4dGVudHMpCisJCWlzX2JhY2tpbmdfYmxrZGV2ID0gMTsKKworCW51bV9wYWdlcyA9IHJ6cy0+ZGlza3NpemUgPj4gUEFHRV9TSElGVDsKKworCS8qIEZyZWUgdmFyaW91cyBwZXItZGV2aWNlIGJ1ZmZlcnMgKi8KKwlrZnJlZShyenMtPmNvbXByZXNzX3dvcmttZW0pOworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcnpzLT5jb21wcmVzc19idWZmZXIsIDEpOworCisJcnpzLT5jb21wcmVzc193b3JrbWVtID0gTlVMTDsKKwlyenMtPmNvbXByZXNzX2J1ZmZlciA9IE5VTEw7CisKKwkvKiBGcmVlIGFsbCBwYWdlcyB0aGF0IGFyZSBzdGlsbCBpbiB0aGlzIHJhbXpzd2FwIGRldmljZSAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bV9wYWdlczsgaW5kZXgrKykgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJdTE2IG9mZnNldDsKKworCQlwYWdlID0gcnpzLT50YWJsZVtpbmRleF0ucGFnZTsKKwkJb2Zmc2V0ID0gcnpzLT50YWJsZVtpbmRleF0ub2Zmc2V0OworCisJCWlmICghcGFnZSkKKwkJCWNvbnRpbnVlOworCisJCWlmICh1bmxpa2VseShyenNfdGVzdF9mbGFnKHJ6cywgaW5kZXgsIFJaU19VTkNPTVBSRVNTRUQpKSkKKwkJCV9fZnJlZV9wYWdlKHBhZ2UpOworCQllbHNlCisJCQl4dl9mcmVlKHJ6cy0+bWVtX3Bvb2wsIHBhZ2UsIG9mZnNldCk7CisJfQorCisJZW50cmllc19wZXJfcGFnZSA9IFBBR0VfU0laRSAvIHNpemVvZigqcnpzLT50YWJsZSk7CisJbnVtX3RhYmxlX3BhZ2VzID0gRElWX1JPVU5EX1VQKG51bV9wYWdlcyAqIHNpemVvZigqcnpzLT50YWJsZSksCisJCQkJCVBBR0VfU0laRSk7CisJLyoKKwkgKiBTZXQgcGFnZS0+bWFwcGluZyB0byBOVUxMIGZvciBldmVyeSB0YWJsZSBwYWdlLgorCSAqIE90aGVyd2lzZSwgd2Ugd2lsbCBoaXQgYmFkX3BhZ2UoKSBkdXJpbmcgZnJlZS4KKwkgKi8KKwl3aGlsZSAocnpzLT5udW1fZXh0ZW50cyAmJiBudW1fdGFibGVfcGFnZXMtLSkgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJcGFnZSA9IHZtYWxsb2NfdG9fcGFnZSgmcnpzLT50YWJsZVtlbnRyeV0pOworCQlwYWdlLT5tYXBwaW5nID0gTlVMTDsKKwkJZW50cnkgKz0gZW50cmllc19wZXJfcGFnZTsKKwl9CisJdmZyZWUocnpzLT50YWJsZSk7CisJcnpzLT50YWJsZSA9IE5VTEw7CisKKwl4dl9kZXN0cm95X3Bvb2wocnpzLT5tZW1fcG9vbCk7CisJcnpzLT5tZW1fcG9vbCA9IE5VTEw7CisKKwkvKiBGcmVlIGFsbCBzd2FwIGV4dGVudCBwYWdlcyAqLworCXdoaWxlICghbGlzdF9lbXB0eSgmcnpzLT5iYWNraW5nX3N3YXBfZXh0ZW50X2xpc3QpKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlOworCQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwkJZW50cnkgPSByenMtPmJhY2tpbmdfc3dhcF9leHRlbnRfbGlzdC5uZXh0OworCQlwYWdlID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHBhZ2UsIGxydSk7CisJCWxpc3RfZGVsKGVudHJ5KTsKKwkJX19mcmVlX3BhZ2UocGFnZSk7CisJfQorCUlOSVRfTElTVF9IRUFEKCZyenMtPmJhY2tpbmdfc3dhcF9leHRlbnRfbGlzdCk7CisJcnpzLT5udW1fZXh0ZW50cyA9IDA7CisKKwkvKiBDbG9zZSBiYWNraW5nIHN3YXAgZGV2aWNlLCBpZiBwcmVzZW50ICovCisJaWYgKHJ6cy0+YmFja2luZ19zd2FwKSB7CisJCWlmIChpc19iYWNraW5nX2Jsa2RldikKKwkJCWJkX3JlbGVhc2UocnpzLT5iYWNraW5nX3N3YXApOworCQlmaWxwX2Nsb3NlKHJ6cy0+c3dhcF9maWxlLCBOVUxMKTsKKwkJcnpzLT5iYWNraW5nX3N3YXAgPSBOVUxMOworCX0KKworCS8qIFJlc2V0IHN0YXRzICovCisJbWVtc2V0KCZyenMtPnN0YXRzLCAwLCBzaXplb2YocnpzLT5zdGF0cykpOworCisJcnpzLT5kaXNrc2l6ZSA9IDA7CisJcnpzLT5tZW1saW1pdCA9IDA7CisKKwkvKiBCYWNrIHRvIHVuaW5pdGlhbGl6ZWQgc3RhdGUgKi8KKwlyenMtPmluaXRfZG9uZSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcmFtenN3YXBfaW9jdGxfaW5pdF9kZXZpY2Uoc3RydWN0IHJhbXpzd2FwICpyenMpCit7CisJaW50IHJldDsKKwlzaXplX3QgbnVtX3BhZ2VzOworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuaW9uIHN3YXBfaGVhZGVyICpzd2FwX2hlYWRlcjsKKworCWlmIChyenMtPmluaXRfZG9uZSkgeworCQlwcl9pbmZvKCJEZXZpY2UgYWxyZWFkeSBpbml0aWFsaXplZCFcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXJldCA9IHNldHVwX2JhY2tpbmdfc3dhcChyenMpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbDsKKworCWlmIChyenMtPmJhY2tpbmdfc3dhcCkKKwkJcmFtenN3YXBfc2V0X21lbWxpbWl0KHJ6cywgdG90YWxyYW1fcGFnZXMgPDwgUEFHRV9TSElGVCk7CisJZWxzZQorCQlyYW16c3dhcF9zZXRfZGlza3NpemUocnpzLCB0b3RhbHJhbV9wYWdlcyA8PCBQQUdFX1NISUZUKTsKKworCXJ6cy0+Y29tcHJlc3Nfd29ya21lbSA9IGt6YWxsb2MoTFpPMVhfTUVNX0NPTVBSRVNTLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJ6cy0+Y29tcHJlc3Nfd29ya21lbSkgeworCQlwcl9lcnIoIkVycm9yIGFsbG9jYXRpbmcgY29tcHJlc3NvciB3b3JraW5nIG1lbW9yeSFcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJcnpzLT5jb21wcmVzc19idWZmZXIgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoX19HRlBfWkVSTywgMSk7CisJaWYgKCFyenMtPmNvbXByZXNzX2J1ZmZlcikgeworCQlwcl9lcnIoIkVycm9yIGFsbG9jYXRpbmcgY29tcHJlc3NvciBidWZmZXIgc3BhY2VcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJbnVtX3BhZ2VzID0gcnpzLT5kaXNrc2l6ZSA+PiBQQUdFX1NISUZUOworCXJ6cy0+dGFibGUgPSB2bWFsbG9jKG51bV9wYWdlcyAqIHNpemVvZigqcnpzLT50YWJsZSkpOworCWlmICghcnpzLT50YWJsZSkgeworCQlwcl9lcnIoIkVycm9yIGFsbG9jYXRpbmcgcmFtenN3YXAgYWRkcmVzcyB0YWJsZVxuIik7CisJCS8qIFRvIHByZXZlbnQgYWNjZXNzaW5nIHRhYmxlIGVudHJpZXMgZHVyaW5nIGNsZWFudXAgKi8KKwkJcnpzLT5kaXNrc2l6ZSA9IDA7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisJbWVtc2V0KHJ6cy0+dGFibGUsIDAsIG51bV9wYWdlcyAqIHNpemVvZigqcnpzLT50YWJsZSkpOworCisJbWFwX2JhY2tpbmdfc3dhcF9leHRlbnRzKHJ6cyk7CisKKwlwYWdlID0gYWxsb2NfcGFnZShfX0dGUF9aRVJPKTsKKwlpZiAoIXBhZ2UpIHsKKwkJcHJfZXJyKCJFcnJvciBhbGxvY2F0aW5nIHN3YXAgaGVhZGVyIHBhZ2VcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCXJ6cy0+dGFibGVbMF0ucGFnZSA9IHBhZ2U7CisJcnpzX3NldF9mbGFnKHJ6cywgMCwgUlpTX1VOQ09NUFJFU1NFRCk7CisKKwlzd2FwX2hlYWRlciA9IGttYXAocGFnZSk7CisJcmV0ID0gc2V0dXBfc3dhcF9oZWFkZXIocnpzLCBzd2FwX2hlYWRlcik7CisJa3VubWFwKHBhZ2UpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJFcnJvciBzZXR0aW5nIHN3YXAgaGVhZGVyXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCXNldF9jYXBhY2l0eShyenMtPmRpc2ssIHJ6cy0+ZGlza3NpemUgPj4gU0VDVE9SX1NISUZUKTsKKworCS8qCisJICogV2UgaGF2ZSBpZGVudCBtYXBwaW5nIG9mIHNlY3RvcnMgZm9yIHJhbXpzd2FwIGFuZAorCSAqIGFuZCB0aGUgYmFja2luZyBzd2FwIGRldmljZS4gU28sIHRoaXMgcXVldWUgZmxhZworCSAqIHNob3VsZCBiZSBhY2NvcmRpbmcgdG8gYmFja2luZyBkZXYuCisJICovCisJaWYgKCFyenMtPmJhY2tpbmdfc3dhcCB8fAorCQkJYmxrX3F1ZXVlX25vbnJvdChyenMtPmJhY2tpbmdfc3dhcC0+YmRfZGlzay0+cXVldWUpKQorCQlxdWV1ZV9mbGFnX3NldF91bmxvY2tlZChRVUVVRV9GTEFHX05PTlJPVCwgcnpzLT5kaXNrLT5xdWV1ZSk7CisKKwlyenMtPm1lbV9wb29sID0geHZfY3JlYXRlX3Bvb2woKTsKKwlpZiAoIXJ6cy0+bWVtX3Bvb2wpIHsKKwkJcHJfZXJyKCJFcnJvciBjcmVhdGluZyBtZW1vcnkgcG9vbFxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKgorCSAqIFBhZ2VzIHRoYXQgY29tcHJlc3MgdG8gc2l6ZSBncmVhdGVyIHRoYW4gdGhpcyBhcmUgZm9yd2FyZGVkCisJICogdG8gcGh5c2ljYWwgc3dhcCBkaXNrIChpZiBiYWNraW5nIGRldiBpcyBwcm92aWRlZCkKKwkgKiBUT0RPOiBtYWtlIHRoaXMgY29uZmlndXJhYmxlCisJICovCisJaWYgKHJ6cy0+YmFja2luZ19zd2FwKQorCQltYXhfenBhZ2Vfc2l6ZSA9IG1heF96cGFnZV9zaXplX2JkZXY7CisJZWxzZQorCQltYXhfenBhZ2Vfc2l6ZSA9IG1heF96cGFnZV9zaXplX25vYmRldjsKKwlwcl9kZWJ1ZygiTWF4IGNvbXByZXNzZWQgcGFnZSBzaXplOiAldSBieXRlc1xuIiwgbWF4X3pwYWdlX3NpemUpOworCisJcnpzLT5pbml0X2RvbmUgPSAxOworCisJcHJfZGVidWcoIkluaXRpYWxpemF0aW9uIGRvbmUhXG4iKTsKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlyZXNldF9kZXZpY2UocnpzKTsKKworCXByX2VycigiSW5pdGlhbGl6YXRpb24gZmFpbGVkOiBlcnI9JWRcbiIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByYW16c3dhcF9pb2N0bF9yZXNldF9kZXZpY2Uoc3RydWN0IHJhbXpzd2FwICpyenMpCit7CisJaWYgKHJ6cy0+aW5pdF9kb25lKQorCQlyZXNldF9kZXZpY2UocnpzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJhbXpzd2FwX2lvY3RsKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGZtb2RlX3QgbW9kZSwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByZXQgPSAwOworCXNpemVfdCBkaXNrc2l6ZV9rYiwgbWVtbGltaXRfa2I7CisKKwlzdHJ1Y3QgcmFtenN3YXAgKnJ6cyA9IGJkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBSWlNJT19TRVRfRElTS1NJWkVfS0I6CisJCWlmIChyenMtPmluaXRfZG9uZSkgeworCQkJcmV0ID0gLUVCVVNZOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZkaXNrc2l6ZV9rYiwgKHZvaWQgKilhcmcsCisJCQkJCQlfSU9DX1NJWkUoY21kKSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCQlyenMtPmRpc2tzaXplID0gZGlza3NpemVfa2IgPDwgMTA7CisJCXByX2luZm8oIkRpc2sgc2l6ZSBzZXQgdG8gJXp1IGtCXG4iLCBkaXNrc2l6ZV9rYik7CisJCWJyZWFrOworCisJY2FzZSBSWlNJT19TRVRfTUVNTElNSVRfS0I6CisJCWlmIChyenMtPmluaXRfZG9uZSkgeworCQkJLyogVE9ETzogYWxsb3cgY2hhbmdpbmcgbWVtbGltaXQgKi8KKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcigmbWVtbGltaXRfa2IsICh2b2lkICopYXJnLAorCQkJCQkJX0lPQ19TSVpFKGNtZCkpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwkJcnpzLT5tZW1saW1pdCA9IG1lbWxpbWl0X2tiIDw8IDEwOworCQlwcl9pbmZvKCJNZW1vcnkgbGltaXQgc2V0IHRvICV6dSBrQlxuIiwgbWVtbGltaXRfa2IpOworCQlicmVhazsKKworCWNhc2UgUlpTSU9fU0VUX0JBQ0tJTkdfU1dBUDoKKwkJaWYgKHJ6cy0+aW5pdF9kb25lKSB7CisJCQlyZXQgPSAtRUJVU1k7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChjb3B5X2Zyb21fdXNlcigmcnpzLT5iYWNraW5nX3N3YXBfbmFtZSwgKHZvaWQgKilhcmcsCisJCQkJCQlfSU9DX1NJWkUoY21kKSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCQlyenMtPmJhY2tpbmdfc3dhcF9uYW1lW01BWF9TV0FQX05BTUVfTEVOIC0gMV0gPSAnXDAnOworCQlwcl9pbmZvKCJCYWNraW5nIHN3YXAgc2V0IHRvICVzXG4iLCByenMtPmJhY2tpbmdfc3dhcF9uYW1lKTsKKwkJYnJlYWs7CisKKwljYXNlIFJaU0lPX0dFVF9TVEFUUzoKKwl7CisJCXN0cnVjdCByYW16c3dhcF9pb2N0bF9zdGF0cyAqc3RhdHM7CisJCWlmICghcnpzLT5pbml0X2RvbmUpIHsKKwkJCXJldCA9IC1FTk9UVFk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlzdGF0cyA9IGt6YWxsb2Moc2l6ZW9mKCpzdGF0cyksIEdGUF9LRVJORUwpOworCQlpZiAoIXN0YXRzKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwkJcmFtenN3YXBfaW9jdGxfZ2V0X3N0YXRzKHJ6cywgc3RhdHMpOworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCBzdGF0cywgc2l6ZW9mKCpzdGF0cykpKSB7CisJCQlrZnJlZShzdGF0cyk7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwkJa2ZyZWUoc3RhdHMpOworCQlicmVhazsKKwl9CisJY2FzZSBSWlNJT19JTklUOgorCQlyZXQgPSByYW16c3dhcF9pb2N0bF9pbml0X2RldmljZShyenMpOworCQlicmVhazsKKworCWNhc2UgUlpTSU9fUkVTRVQ6CisJCS8qIERvIG5vdCByZXNldCBhbiBhY3RpdmUgZGV2aWNlISAqLworCQlpZiAoYmRldi0+YmRfaG9sZGVycykgeworCQkJcmV0ID0gLUVCVVNZOworCQkJZ290byBvdXQ7CisJCX0KKwkJcmV0ID0gcmFtenN3YXBfaW9jdGxfcmVzZXRfZGV2aWNlKHJ6cyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJfaW5mbygiSW52YWxpZCBpb2N0bCAldVxuIiwgY21kKTsKKwkJcmV0ID0gLUVOT1RUWTsKKwl9CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIHJhbXpzd2FwX2Rldm9wcyA9IHsKKwkuaW9jdGwgPSByYW16c3dhcF9pb2N0bCwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9kZXZpY2Uoc3RydWN0IHJhbXpzd2FwICpyenMsIGludCBkZXZpY2VfaWQpCit7CisJbXV0ZXhfaW5pdCgmcnpzLT5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmcnpzLT5iYWNraW5nX3N3YXBfZXh0ZW50X2xpc3QpOworCisJcnpzLT5xdWV1ZSA9IGJsa19hbGxvY19xdWV1ZShHRlBfS0VSTkVMKTsKKwlpZiAoIXJ6cy0+cXVldWUpIHsKKwkJcHJfZXJyKCJFcnJvciBhbGxvY2F0aW5nIGRpc2sgcXVldWUgZm9yIGRldmljZSAlZFxuIiwKKwkJCWRldmljZV9pZCk7CisJCXJldHVybjsKKwl9CisKKwlibGtfcXVldWVfbWFrZV9yZXF1ZXN0KHJ6cy0+cXVldWUsIHJhbXpzd2FwX21ha2VfcmVxdWVzdCk7CisJcnpzLT5xdWV1ZS0+cXVldWVkYXRhID0gcnpzOworCisJIC8qIGdlbmRpc2sgc3RydWN0dXJlICovCisJcnpzLT5kaXNrID0gYWxsb2NfZGlzaygxKTsKKwlpZiAoIXJ6cy0+ZGlzaykgeworCQlibGtfY2xlYW51cF9xdWV1ZShyenMtPnF1ZXVlKTsKKwkJcHJfd2FybmluZygiRXJyb3IgYWxsb2NhdGluZyBkaXNrIHN0cnVjdHVyZSBmb3IgZGV2aWNlICVkXG4iLAorCQkJZGV2aWNlX2lkKTsKKwkJcmV0dXJuOworCX0KKworCXJ6cy0+ZGlzay0+bWFqb3IgPSByYW16c3dhcF9tYWpvcjsKKwlyenMtPmRpc2stPmZpcnN0X21pbm9yID0gZGV2aWNlX2lkOworCXJ6cy0+ZGlzay0+Zm9wcyA9ICZyYW16c3dhcF9kZXZvcHM7CisJcnpzLT5kaXNrLT5xdWV1ZSA9IHJ6cy0+cXVldWU7CisJcnpzLT5kaXNrLT5wcml2YXRlX2RhdGEgPSByenM7CisJc25wcmludGYocnpzLT5kaXNrLT5kaXNrX25hbWUsIDE2LCAicmFtenN3YXAlZCIsIGRldmljZV9pZCk7CisKKwkvKgorCSAqIEFjdHVhbCBjYXBhY2l0eSBzZXQgdXNpbmcgUlpTSU9fU0VUX0RJU0tTSVpFX0tCIGlvY3RsCisJICogb3Igc2V0IGVxdWFsIHRvIGJhY2tpbmcgc3dhcCBkZXZpY2UgKGlmIHByb3ZpZGVkKQorCSAqLworCXNldF9jYXBhY2l0eShyenMtPmRpc2ssIDApOworCWFkZF9kaXNrKHJ6cy0+ZGlzayk7CisKKwlyenMtPmluaXRfZG9uZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfZGV2aWNlKHN0cnVjdCByYW16c3dhcCAqcnpzKQoreworCWlmIChyenMtPmRpc2spIHsKKwkJZGVsX2dlbmRpc2socnpzLT5kaXNrKTsKKwkJcHV0X2Rpc2socnpzLT5kaXNrKTsKKwl9CisKKwlpZiAocnpzLT5xdWV1ZSkKKwkJYmxrX2NsZWFudXBfcXVldWUocnpzLT5xdWV1ZSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHJhbXpzd2FwX2luaXQodm9pZCkKK3sKKwlpbnQgaSwgcmV0OworCisJaWYgKG51bV9kZXZpY2VzID4gbWF4X251bV9kZXZpY2VzKSB7CisJCXByX3dhcm5pbmcoIkludmFsaWQgdmFsdWUgZm9yIG51bV9kZXZpY2VzOiAldVxuIiwKKwkJCQludW1fZGV2aWNlcyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJhbXpzd2FwX21ham9yID0gcmVnaXN0ZXJfYmxrZGV2KDAsICJyYW16c3dhcCIpOworCWlmIChyYW16c3dhcF9tYWpvciA8PSAwKSB7CisJCXByX3dhcm5pbmcoIlVuYWJsZSB0byBnZXQgbWFqb3IgbnVtYmVyXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoIW51bV9kZXZpY2VzKSB7CisJCXByX2luZm8oIm51bV9kZXZpY2VzIG5vdCBzcGVjaWZpZWQuIFVzaW5nIGRlZmF1bHQ6IDFcbiIpOworCQludW1fZGV2aWNlcyA9IDE7CisJfQorCisJLyogQWxsb2NhdGUgdGhlIGRldmljZSBhcnJheSBhbmQgaW5pdGlhbGl6ZSBlYWNoIG9uZSAqLworCXByX2luZm8oIkNyZWF0aW5nICV1IGRldmljZXMgLi4uXG4iLCBudW1fZGV2aWNlcyk7CisJZGV2aWNlcyA9IGt6YWxsb2MobnVtX2RldmljZXMgKiBzaXplb2Yoc3RydWN0IHJhbXpzd2FwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXZpY2VzKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBudW1fZGV2aWNlczsgaSsrKQorCQljcmVhdGVfZGV2aWNlKCZkZXZpY2VzW2ldLCBpKTsKKworCXJldHVybiAwOworb3V0OgorCXVucmVnaXN0ZXJfYmxrZGV2KHJhbXpzd2FwX21ham9yLCAicmFtenN3YXAiKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcmFtenN3YXBfZXhpdCh2b2lkKQoreworCWludCBpOworCXN0cnVjdCByYW16c3dhcCAqcnpzOworCisJZm9yIChpID0gMDsgaSA8IG51bV9kZXZpY2VzOyBpKyspIHsKKwkJcnpzID0gJmRldmljZXNbaV07CisKKwkJZGVzdHJveV9kZXZpY2UocnpzKTsKKwkJaWYgKHJ6cy0+aW5pdF9kb25lKQorCQkJcmVzZXRfZGV2aWNlKHJ6cyk7CisJfQorCisJdW5yZWdpc3Rlcl9ibGtkZXYocmFtenN3YXBfbWFqb3IsICJyYW16c3dhcCIpOworCisJa2ZyZWUoZGV2aWNlcyk7CisJcHJfZGVidWcoIkNsZWFudXAgZG9uZSFcbiIpOworfQorCittb2R1bGVfcGFyYW0obnVtX2RldmljZXMsIHVpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhudW1fZGV2aWNlcywgIk51bWJlciBvZiByYW16c3dhcCBkZXZpY2VzIik7CisKK21vZHVsZV9pbml0KHJhbXpzd2FwX2luaXQpOworbW9kdWxlX2V4aXQocmFtenN3YXBfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKK01PRFVMRV9BVVRIT1IoIk5pdGluIEd1cHRhIDxuZ3VwdGFAdmZsYXJlLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tcHJlc3NlZCBSQU0gQmFzZWQgU3dhcCBEZXZpY2UiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9yYW16c3dhcF9kcnYuaCBiL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9yYW16c3dhcF9kcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmVhMjQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3JhbXpzd2FwX2Rydi5oCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQ29tcHJlc3NlZCBSQU0gYmFzZWQgc3dhcCBkZXZpY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgIE5pdGluIEd1cHRhCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVzaW5nIGEgZHVhbCBsaWNlbnNlIHN0cmF0ZWd5OiBCU0QvR1BMCisgKiBZb3UgY2FuIGNob29zZSB0aGUgbGljZW5jZSB0aGF0IGJldHRlciBmaXRzIHlvdXIgcmVxdWlyZW1lbnRzLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiAzLWNsYXVzZSBCU0QgTGljZW5zZQorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wCisgKgorICogUHJvamVjdCBob21lOiBodHRwOi8vY29tcGNhY2hlLmdvb2dsZWNvZGUuY29tCisgKi8KKworI2lmbmRlZiBfUkFNWlNXQVBfRFJWX0hfCisjZGVmaW5lIF9SQU1aU1dBUF9EUlZfSF8KKworI2luY2x1ZGUgInJhbXpzd2FwX2lvY3RsLmgiCisjaW5jbHVkZSAieHZtYWxsb2MuaCIKKworLyoKKyAqIFNvbWUgYXJiaXRyYXJ5IHZhbHVlLiBUaGlzIGlzIGp1c3QgdG8gY2F0Y2gKKyAqIGludmFsaWQgdmFsdWUgZm9yIG51bV9kZXZpY2VzIG1vZHVsZSBwYXJhbWV0ZXIuCisgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBtYXhfbnVtX2RldmljZXMgPSAzMjsKKworLyoKKyAqIFN0b3JlZCBhdCBiZWdpbm5pbmcgb2YgZWFjaCBjb21wcmVzc2VkIG9iamVjdC4KKyAqCisgKiBJdCBzdG9yZXMgYmFjay1yZWZlcmVuY2UgdG8gdGFibGUgZW50cnkgd2hpY2ggcG9pbnRzIHRvIHRoaXMKKyAqIG9iamVjdC4gVGhpcyBpcyByZXF1aXJlZCB0byBzdXBwb3J0IG1lbW9yeSBkZWZyYWdtZW50YXRpb24gb3IKKyAqIG1pZ3JhdGluZyBjb21wcmVzc2VkIHBhZ2VzIHRvIGJhY2tpbmcgc3dhcCBkaXNrLgorICovCitzdHJ1Y3Qgem9ial9oZWFkZXIgeworI2lmIDAKKwl1MzIgdGFibGVfaWR4OworI2VuZGlmCit9OworCisvKi0tIENvbmZpZ3VyYWJsZSBwYXJhbWV0ZXJzICovCisKKy8qIERlZmF1bHQgcmFtenN3YXAgZGlzayBzaXplOiAyNSUgb2YgdG90YWwgUkFNICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZGVmYXVsdF9kaXNrc2l6ZV9wZXJjX3JhbSA9IDI1Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRlZmF1bHRfbWVtbGltaXRfcGVyY19yYW0gPSAxNTsKKworLyoKKyAqIE1heCBjb21wcmVzc2VkIHBhZ2Ugc2l6ZSB3aGVuIGJhY2tpbmcgZGV2aWNlIGlzIHByb3ZpZGVkLgorICogUGFnZXMgdGhhdCBjb21wcmVzcyB0byBzaXplIGdyZWF0ZXIgdGhhbiB0aGlzIGFyZSBzZW50IHRvCisgKiBwaHlzaWNhbCBzd2FwIGRpc2suCisgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBtYXhfenBhZ2Vfc2l6ZV9iZGV2ID0gUEFHRV9TSVpFIC8gMjsKKworLyoKKyAqIE1heCBjb21wcmVzc2VkIHBhZ2Ugc2l6ZSB3aGVuIHRoZXJlIGlzIG5vIGJhY2tpbmcgZGV2LgorICogUGFnZXMgdGhhdCBjb21wcmVzcyB0byBzaXplIGdyZWF0ZXIgdGhhbiB0aGlzIGFyZSBzdG9yZWQKKyAqIHVuY29tcHJlc3NlZCBpbiBtZW1vcnkuCisgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBtYXhfenBhZ2Vfc2l6ZV9ub2JkZXYgPSBQQUdFX1NJWkUgLyA0ICogMzsKKworLyoKKyAqIE5PVEU6IG1heF96cGFnZV9zaXplX3tiZGV2LG5vYmRldn0gc2l6ZXMgbXVzdCBiZQorICogbGVzcyB0aGFuIG9yIGVxdWFsIHRvOgorICogICBYVl9NQVhfQUxMT0NfU0laRSAtIHNpemVvZihzdHJ1Y3Qgem9ial9oZWFkZXIpCisgKiBzaW5jZSBvdGhlcndpc2UgeHZfbWFsbG9jIHdvdWxkIGFsd2F5cyByZXR1cm4gZmFpbHVyZS4KKyAqLworCisvKi0tIEVuZCBvZiBjb25maWd1cmFibGUgcGFyYW1zICovCisKKyNkZWZpbmUgU0VDVE9SX1NISUZUCQk5CisjZGVmaW5lIFNFQ1RPUl9TSVpFCQkoMSA8PCBTRUNUT1JfU0hJRlQpCisjZGVmaW5lIFNFQ1RPUlNfUEVSX1BBR0VfU0hJRlQJKFBBR0VfU0hJRlQgLSBTRUNUT1JfU0hJRlQpCisjZGVmaW5lIFNFQ1RPUlNfUEVSX1BBR0UJKDEgPDwgU0VDVE9SU19QRVJfUEFHRV9TSElGVCkKKworLyogRGVidWdnaW5nIGFuZCBTdGF0cyAqLworI2lmIGRlZmluZWQoQ09ORklHX1JBTVpTV0FQX1NUQVRTKQorI2RlZmluZSBzdGF0X2luYyhzdGF0KQkoKHN0YXQpKyspCisjZGVmaW5lIHN0YXRfZGVjKHN0YXQpCSgoc3RhdCktLSkKKyNlbHNlCisjZGVmaW5lIHN0YXRfaW5jKHgpCisjZGVmaW5lIHN0YXRfZGVjKHgpCisjZW5kaWYKKworLyogRmxhZ3MgZm9yIHJhbXpzd2FwIHBhZ2VzICh0YWJsZVtwYWdlX25vXS5mbGFncykgKi8KK2VudW0gcnpzX3BhZ2VmbGFncyB7CisJLyogUGFnZSBpcyBzdG9yZWQgdW5jb21wcmVzc2VkICovCisJUlpTX1VOQ09NUFJFU1NFRCwKKworCS8qIFBhZ2UgY29uc2lzdHMgZW50aXJlbHkgb2YgemVyb3MgKi8KKwlSWlNfWkVSTywKKworCV9fTlJfUlpTX1BBR0VGTEFHUywKK307CisKKy8qLS0gRGF0YSBzdHJ1Y3R1cmVzICovCisKKy8qCisgKiBBbGxvY2F0ZWQgZm9yIGVhY2ggc3dhcCBzbG90LCBpbmRleGVkIGJ5IHBhZ2Ugbm8uCisgKiBUaGVzZSB0YWJsZSBlbnRyaWVzIG11c3QgZml0IGV4YWN0bHkgaW4gYSBwYWdlLgorICovCitzdHJ1Y3QgdGFibGUgeworCXN0cnVjdCBwYWdlICpwYWdlOworCXUxNiBvZmZzZXQ7CisJdTggY291bnQ7CS8qIG9iamVjdCByZWYgY291bnQgKG5vdCB5ZXQgdXNlZCkgKi8KKwl1OCBmbGFnczsKK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg0KSkpOzsKKworLyoKKyAqIFN3YXAgZXh0ZW50IGluZm9ybWF0aW9uIGluIGNhc2UgYmFja2luZyBzd2FwIGlzIGEgcmVndWxhcgorICogZmlsZS4gVGhlc2UgZXh0ZW50IGVudHJpZXMgbXVzdCBmaXQgZXhhY3RseSBpbiBhIHBhZ2UuCisgKi8KK3N0cnVjdCByYW16c3dhcF9iYWNraW5nX2V4dGVudCB7CisJcGdvZmZfdCBwaHlfcGFnZW51bTsKKwlwZ29mZl90IG51bV9wYWdlczsKK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg0KSkpOworCitzdHJ1Y3QgcmFtenN3YXBfc3RhdHMgeworCS8qIGJhc2ljIHN0YXRzICovCisJc2l6ZV90IGNvbXByX3NpemU7CS8qIGNvbXByZXNzZWQgc2l6ZSBvZiBwYWdlcyBzdG9yZWQgLQorCQkJCSAqIG5lZWRlZCB0byBlbmZvcmNlIG1lbWxpbWl0ICovCisJLyogbW9yZSBzdGF0cyAqLworI2lmIGRlZmluZWQoQ09ORklHX1JBTVpTV0FQX1NUQVRTKQorCXU2NCBudW1fcmVhZHM7CQkvKiBmYWlsZWQgKyBzdWNjZXNzZnVsICovCisJdTY0IG51bV93cml0ZXM7CQkvKiAtLWRvLS0gKi8KKwl1NjQgZmFpbGVkX3JlYWRzOwkvKiBjYW4gaGFwcGVuIHdoZW4gbWVtb3J5IGlzIHRvbyBsb3cgKi8KKwl1NjQgZmFpbGVkX3dyaXRlczsJLyogc2hvdWxkIE5FVkVSISBoYXBwZW4gKi8KKwl1NjQgaW52YWxpZF9pbzsJCS8qIG5vbi1zd2FwIEkvTyByZXF1ZXN0cyAqLworCXUzMiBwYWdlc196ZXJvOwkJLyogbm8uIG9mIHplcm8gZmlsbGVkIHBhZ2VzICovCisJdTMyIHBhZ2VzX3N0b3JlZDsJLyogbm8uIG9mIHBhZ2VzIGN1cnJlbnRseSBzdG9yZWQgKi8KKwl1MzIgZ29vZF9jb21wcmVzczsJLyogJSBvZiBwYWdlcyB3aXRoIGNvbXByZXNzaW9uIHJhdGlvPD01MCUgKi8KKwl1MzIgcGFnZXNfZXhwYW5kOwkvKiAlIG9mIGluY29tcHJlc3NpYmxlIHBhZ2VzICovCisJdTY0IGJkZXZfbnVtX3JlYWRzOwkvKiBuby4gb2YgcmVhZHMgb24gYmFja2luZyBkZXYgKi8KKwl1NjQgYmRldl9udW1fd3JpdGVzOwkvKiBuby4gb2Ygd3JpdGVzIG9uIGJhY2tpbmcgZGV2ICovCisjZW5kaWYKK307CisKK3N0cnVjdCByYW16c3dhcCB7CisJc3RydWN0IHh2X3Bvb2wgKm1lbV9wb29sOworCXZvaWQgKmNvbXByZXNzX3dvcmttZW07CisJdm9pZCAqY29tcHJlc3NfYnVmZmVyOworCXN0cnVjdCB0YWJsZSAqdGFibGU7CisJc3RydWN0IG11dGV4IGxvY2s7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnF1ZXVlOworCXN0cnVjdCBnZW5kaXNrICpkaXNrOworCWludCBpbml0X2RvbmU7CisJLyoKKwkgKiBUaGlzIGlzIGxpbWl0IG9uIGNvbXByZXNzZWQgZGF0YSBzaXplIChzdGF0cy5jb21wcl9zaXplKQorCSAqIEl0cyBhcHBsaWNhYmxlIG9ubHkgd2hlbiBiYWNraW5nIHN3YXAgZGV2aWNlIGlzIHByZXNlbnQuCisJICovCisJc2l6ZV90IG1lbWxpbWl0OwkvKiBieXRlcyAqLworCS8qCisJICogVGhpcyBpcyBsaW1pdCBvbiBhbW91bnQgb2YgKnVuY29tcHJlc3NlZCogd29ydGggb2YgZGF0YQorCSAqIHdlIGNhbiBob2xkLiBXaGVuIGJhY2tpbmcgc3dhcCBkZXZpY2UgaXMgcHJvdmlkZWQsIGl0IGlzCisJICogc2V0IGVxdWFsIHRvIGRldmljZSBzaXplLgorCSAqLworCXNpemVfdCBkaXNrc2l6ZTsJLyogYnl0ZXMgKi8KKworCXN0cnVjdCByYW16c3dhcF9zdGF0cyBzdGF0czsKKworCS8qIGJhY2tpbmcgc3dhcCBkZXZpY2UgaW5mbyAqLworCXN0cnVjdCByYW16c3dhcF9iYWNraW5nX2V4dGVudCAqY3Vycl9leHRlbnQ7CisJc3RydWN0IGxpc3RfaGVhZCBiYWNraW5nX3N3YXBfZXh0ZW50X2xpc3Q7CisJdW5zaWduZWQgbG9uZyBudW1fZXh0ZW50czsKKwljaGFyIGJhY2tpbmdfc3dhcF9uYW1lW01BWF9TV0FQX05BTUVfTEVOXTsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiYWNraW5nX3N3YXA7CisJc3RydWN0IGZpbGUgKnN3YXBfZmlsZTsKK307CisKKy8qLS0gKi8KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9yYW16c3dhcF9pb2N0bC5oIGIvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3JhbXpzd2FwX2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcxM2EwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9yYW16c3dhcF9pb2N0bC5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb21wcmVzc2VkIFJBTSBiYXNlZCBzd2FwIGRldmljZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSAgTml0aW4gR3VwdGEKKyAqCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdXNpbmcgYSBkdWFsIGxpY2Vuc2Ugc3RyYXRlZ3k6IEJTRC9HUEwKKyAqIFlvdSBjYW4gY2hvb3NlIHRoZSBsaWNlbmNlIHRoYXQgYmV0dGVyIGZpdHMgeW91ciByZXF1aXJlbWVudHMuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIDMtY2xhdXNlIEJTRCBMaWNlbnNlCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAKKyAqCisgKiBQcm9qZWN0IGhvbWU6IGh0dHA6Ly9jb21wY2FjaGUuZ29vZ2xlY29kZS5jb20KKyAqLworCisjaWZuZGVmIF9SQU1aU1dBUF9JT0NUTF9IXworI2RlZmluZSBfUkFNWlNXQVBfSU9DVExfSF8KKworI2RlZmluZSBNQVhfU1dBUF9OQU1FX0xFTiAxMjgKKworc3RydWN0IHJhbXpzd2FwX2lvY3RsX3N0YXRzIHsKKwljaGFyIGJhY2tpbmdfc3dhcF9uYW1lW01BWF9TV0FQX05BTUVfTEVOXTsKKwl1NjQgbWVtbGltaXQ7CQkvKiBvbmx5IGFwcGxpY2FibGUgaWYgYmFja2luZyBzd2FwIHByZXNlbnQgKi8KKwl1NjQgZGlza3NpemU7CQkvKiB1c2VyIHNwZWNpZmllZCBvciBlcXVhbCB0byBiYWNraW5nIHN3YXAKKwkJCQkgKiBzaXplIChpZiBwcmVzZW50KSAqLworCXU2NCBudW1fcmVhZHM7CQkvKiBmYWlsZWQgKyBzdWNjZXNzZnVsICovCisJdTY0IG51bV93cml0ZXM7CQkvKiAtLWRvLS0gKi8KKwl1NjQgZmFpbGVkX3JlYWRzOwkvKiBjYW4gaGFwcGVuIHdoZW4gbWVtb3J5IGlzIHRvbyBsb3cgKi8KKwl1NjQgZmFpbGVkX3dyaXRlczsJLyogc2hvdWxkIE5FVkVSISBoYXBwZW4gKi8KKwl1NjQgaW52YWxpZF9pbzsJCS8qIG5vbi1zd2FwIEkvTyByZXF1ZXN0cyAqLworCXUzMiBwYWdlc196ZXJvOwkJLyogbm8uIG9mIHplcm8gZmlsbGVkIHBhZ2VzICovCisJdTMyIGdvb2RfY29tcHJlc3NfcGN0OwkvKiBuby4gb2YgcGFnZXMgd2l0aCBjb21wcmVzc2lvbiByYXRpbzw9NTAlICovCisJdTMyIHBhZ2VzX2V4cGFuZF9wY3Q7CS8qIG5vLiBvZiBpbmNvbXByZXNzaWJsZSBwYWdlcyAqLworCXUzMiBwYWdlc19zdG9yZWQ7CisJdTMyIHBhZ2VzX3VzZWQ7CisJdTY0IG9yaWdfZGF0YV9zaXplOworCXU2NCBjb21wcl9kYXRhX3NpemU7CisJdTY0IG1lbV91c2VkX3RvdGFsOworCXU2NCBiZGV2X251bV9yZWFkczsJLyogbm8uIG9mIHJlYWRzIG9uIGJhY2tpbmcgZGV2ICovCisJdTY0IGJkZXZfbnVtX3dyaXRlczsJLyogbm8uIG9mIHdyaXRlcyBvbiBiYWNraW5nIGRldiAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkLCBhbGlnbmVkKDQpKSk7CisKKyNkZWZpbmUgUlpTSU9fU0VUX0RJU0tTSVpFX0tCCV9JT1coJ3onLCAwLCBzaXplX3QpCisjZGVmaW5lIFJaU0lPX1NFVF9NRU1MSU1JVF9LQglfSU9XKCd6JywgMSwgc2l6ZV90KQorI2RlZmluZSBSWlNJT19TRVRfQkFDS0lOR19TV0FQCV9JT1coJ3onLCAyLCB1bnNpZ25lZCBjaGFyW01BWF9TV0FQX05BTUVfTEVOXSkKKyNkZWZpbmUgUlpTSU9fR0VUX1NUQVRTCQlfSU9SKCd6JywgMywgc3RydWN0IHJhbXpzd2FwX2lvY3RsX3N0YXRzKQorI2RlZmluZSBSWlNJT19JTklUCQlfSU8oJ3onLCA0KQorI2RlZmluZSBSWlNJT19SRVNFVAkJX0lPKCd6JywgNSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAveHZtYWxsb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC94dm1hbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZTk4NmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAveHZtYWxsb2MuYwpAQCAtMCwwICsxLDUwNyBAQAorLyoKKyAqIHh2bWFsbG9jIG1lbW9yeSBhbGxvY2F0b3IKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgIE5pdGluIEd1cHRhCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVzaW5nIGEgZHVhbCBsaWNlbnNlIHN0cmF0ZWd5OiBCU0QvR1BMCisgKiBZb3UgY2FuIGNob29zZSB0aGUgbGljZW5jZSB0aGF0IGJldHRlciBmaXRzIHlvdXIgcmVxdWlyZW1lbnRzLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiAzLWNsYXVzZSBCU0QgTGljZW5zZQorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJ4dm1hbGxvYy5oIgorI2luY2x1ZGUgInh2bWFsbG9jX2ludC5oIgorCitzdGF0aWMgdm9pZCBzdGF0X2luYyh1NjQgKnZhbHVlKQoreworCSp2YWx1ZSA9ICp2YWx1ZSArIDE7Cit9CisKK3N0YXRpYyB2b2lkIHN0YXRfZGVjKHU2NCAqdmFsdWUpCit7CisJKnZhbHVlID0gKnZhbHVlIC0gMTsKK30KKworc3RhdGljIGludCB0ZXN0X2ZsYWcoc3RydWN0IGJsb2NrX2hlYWRlciAqYmxvY2ssIGVudW0gYmxvY2tmbGFncyBmbGFnKQoreworCXJldHVybiBibG9jay0+cHJldiAmIEJJVChmbGFnKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2ZsYWcoc3RydWN0IGJsb2NrX2hlYWRlciAqYmxvY2ssIGVudW0gYmxvY2tmbGFncyBmbGFnKQoreworCWJsb2NrLT5wcmV2IHw9IEJJVChmbGFnKTsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfZmxhZyhzdHJ1Y3QgYmxvY2tfaGVhZGVyICpibG9jaywgZW51bSBibG9ja2ZsYWdzIGZsYWcpCit7CisJYmxvY2stPnByZXYgJj0gfkJJVChmbGFnKTsKK30KKworLyoKKyAqIEdpdmVuIDxwYWdlLCBvZmZzZXQ+IHBhaXIsIHByb3ZpZGUgYSBkZXJlZnJlbmNhYmxlIHBvaW50ZXIuCisgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIHh2X21hbGxvYy94dl9mcmVlIHBhdGgsIHNvIGl0CisgKiBuZWVkcyB0byBiZSBmYXN0LgorICovCitzdGF0aWMgdm9pZCAqZ2V0X3B0cl9hdG9taWMoc3RydWN0IHBhZ2UgKnBhZ2UsIHUxNiBvZmZzZXQsIGVudW0ga21fdHlwZSB0eXBlKQoreworCXVuc2lnbmVkIGNoYXIgKmJhc2U7CisKKwliYXNlID0ga21hcF9hdG9taWMocGFnZSwgdHlwZSk7CisJcmV0dXJuIGJhc2UgKyBvZmZzZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9wdHJfYXRvbWljKHZvaWQgKnB0ciwgZW51bSBrbV90eXBlIHR5cGUpCit7CisJa3VubWFwX2F0b21pYyhwdHIsIHR5cGUpOworfQorCitzdGF0aWMgdTMyIGdldF9ibG9ja3ByZXYoc3RydWN0IGJsb2NrX2hlYWRlciAqYmxvY2spCit7CisJcmV0dXJuIGJsb2NrLT5wcmV2ICYgUFJFVl9NQVNLOworfQorCitzdGF0aWMgdm9pZCBzZXRfYmxvY2twcmV2KHN0cnVjdCBibG9ja19oZWFkZXIgKmJsb2NrLCB1MTYgbmV3X29mZnNldCkKK3sKKwlibG9jay0+cHJldiA9IG5ld19vZmZzZXQgfCAoYmxvY2stPnByZXYgJiBGTEFHU19NQVNLKTsKK30KKworc3RhdGljIHN0cnVjdCBibG9ja19oZWFkZXIgKkJMT0NLX05FWFQoc3RydWN0IGJsb2NrX2hlYWRlciAqYmxvY2spCit7CisJcmV0dXJuIChzdHJ1Y3QgYmxvY2tfaGVhZGVyICopCisJCSgoY2hhciAqKWJsb2NrICsgYmxvY2stPnNpemUgKyBYVl9BTElHTik7Cit9CisKKy8qCisgKiBHZXQgaW5kZXggb2YgZnJlZSBsaXN0IGNvbnRhaW5pbmcgYmxvY2tzIG9mIG1heGltdW0gc2l6ZQorICogd2hpY2ggaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGdpdmVuIHNpemUuCisgKi8KK3N0YXRpYyB1MzIgZ2V0X2luZGV4X2Zvcl9pbnNlcnQodTMyIHNpemUpCit7CisJaWYgKHVubGlrZWx5KHNpemUgPiBYVl9NQVhfQUxMT0NfU0laRSkpCisJCXNpemUgPSBYVl9NQVhfQUxMT0NfU0laRTsKKwlzaXplICY9IH5GTF9ERUxUQV9NQVNLOworCXJldHVybiAoc2l6ZSAtIFhWX01JTl9BTExPQ19TSVpFKSA+PiBGTF9ERUxUQV9TSElGVDsKK30KKworLyoKKyAqIEdldCBpbmRleCBvZiBmcmVlIGxpc3QgaGF2aW5nIGJsb2NrcyBvZiBzaXplIGdyZWF0ZXIgdGhhbgorICogb3IgZXF1YWwgdG8gcmVxdWVzdGVkIHNpemUuCisgKi8KK3N0YXRpYyB1MzIgZ2V0X2luZGV4KHUzMiBzaXplKQoreworCWlmICh1bmxpa2VseShzaXplIDwgWFZfTUlOX0FMTE9DX1NJWkUpKQorCQlzaXplID0gWFZfTUlOX0FMTE9DX1NJWkU7CisJc2l6ZSA9IEFMSUdOKHNpemUsIEZMX0RFTFRBKTsKKwlyZXR1cm4gKHNpemUgLSBYVl9NSU5fQUxMT0NfU0laRSkgPj4gRkxfREVMVEFfU0hJRlQ7Cit9CisKKy8qKgorICogZmluZF9ibG9jayAtIGZpbmQgYmxvY2sgb2YgYXQgbGVhc3QgZ2l2ZW4gc2l6ZQorICogQHBvb2w6IG1lbW9yeSBwb29sIHRvIHNlYXJjaCBmcm9tCisgKiBAc2l6ZTogc2l6ZSBvZiBibG9jayByZXF1aXJlZAorICogQHBhZ2U6IHBhZ2UgY29udGFpbmluZyByZXF1aXJlZCBibG9jaworICogQG9mZnNldDogb2Zmc2V0IHdpdGhpbiB0aGUgcGFnZSB3aGVyZSBibG9jayBpcyBsb2NhdGVkLgorICoKKyAqIFNlYXJjaGVzIHR3byBsZXZlbCBiaXRtYXAgdG8gbG9jYXRlIGJsb2NrIG9mIGF0IGxlYXN0CisgKiB0aGUgZ2l2ZW4gc2l6ZS4gSWYgc3VjaCBhIGJsb2NrIGlzIGZvdW5kLCBpdCBwcm92aWRlcworICogPHBhZ2UsIG9mZnNldD4gdG8gaWRlbnRpZnkgdGhpcyBibG9jayBhbmQgcmV0dXJucyBpbmRleAorICogaW4gZnJlZWxpc3Qgd2hlcmUgd2UgZm91bmQgdGhpcyBibG9jay4KKyAqIE90aGVyd2lzZSwgcmV0dXJucyAwIGFuZCA8cGFnZSwgb2Zmc2V0PiBwYXJhbXMgYXJlIG5vdCB0b3VjaGVkLgorICovCitzdGF0aWMgdTMyIGZpbmRfYmxvY2soc3RydWN0IHh2X3Bvb2wgKnBvb2wsIHUzMiBzaXplLAorCQkJc3RydWN0IHBhZ2UgKipwYWdlLCB1MzIgKm9mZnNldCkKK3sKKwl1bG9uZyBmbGJpdG1hcCwgc2xiaXRtYXA7CisJdTMyIGZsaW5kZXgsIHNsaW5kZXgsIHNsYml0c3RhcnQ7CisKKwkvKiBUaGVyZSBhcmUgbm8gZnJlZSBibG9ja3MgaW4gdGhpcyBwb29sICovCisJaWYgKCFwb29sLT5mbGJpdG1hcCkKKwkJcmV0dXJuIDA7CisKKwkvKiBHZXQgZnJlZWxpc3QgaW5kZXggY29ycmVzcG9kaW5nIHRvIHRoaXMgc2l6ZSAqLworCXNsaW5kZXggPSBnZXRfaW5kZXgoc2l6ZSk7CisJc2xiaXRtYXAgPSBwb29sLT5zbGJpdG1hcFtzbGluZGV4IC8gQklUU19QRVJfTE9OR107CisJc2xiaXRzdGFydCA9IHNsaW5kZXggJSBCSVRTX1BFUl9MT05HOworCisJLyoKKwkgKiBJZiBmcmVlbGlzdCBpcyBub3QgZW1wdHkgYXQgdGhpcyBpbmRleCwgd2UgZm91bmQgdGhlCisJICogYmxvY2sgLSBoZWFkIG9mIHRoaXMgbGlzdC4gVGhpcyBpcyBhcHByb3hpbWF0ZSBiZXN0LWZpdCBtYXRjaC4KKwkgKi8KKwlpZiAodGVzdF9iaXQoc2xiaXRzdGFydCwgJnNsYml0bWFwKSkgeworCQkqcGFnZSA9IHBvb2wtPmZyZWVsaXN0W3NsaW5kZXhdLnBhZ2U7CisJCSpvZmZzZXQgPSBwb29sLT5mcmVlbGlzdFtzbGluZGV4XS5vZmZzZXQ7CisJCXJldHVybiBzbGluZGV4OworCX0KKworCS8qCisJICogTm8gYmVzdC1maXQgZm91bmQuIFNlYXJjaCBhIGJpdCBmdXJ0aGVyIGluIGJpdG1hcCBmb3IgYSBmcmVlIGJsb2NrLgorCSAqIFNlY29uZCBsZXZlbCBiaXRtYXAgY29uc2lzdHMgb2Ygc2VyaWVzIG9mIDMyLWJpdCBjaHVua3MuIFNlYXJjaAorCSAqIGZ1cnRoZXIgaW4gdGhlIGNodW5rIHdoZXJlIHdlIGV4cGVjdGVkIGEgYmVzdC1maXQsIHN0YXJ0aW5nIGZyb20KKwkgKiBpbmRleCBsb2NhdGlvbiBmb3VuZCBhYm92ZS4KKwkgKi8KKwlzbGJpdHN0YXJ0Kys7CisJc2xiaXRtYXAgPj49IHNsYml0c3RhcnQ7CisKKwkvKiBTa2lwIHRoaXMgc2VhcmNoIGlmIHdlIHdlcmUgYWxyZWFkeSBhdCBlbmQgb2YgdGhpcyBiaXRtYXAgY2h1bmsgKi8KKwlpZiAoKHNsYml0c3RhcnQgIT0gQklUU19QRVJfTE9ORykgJiYgc2xiaXRtYXApIHsKKwkJc2xpbmRleCArPSBfX2ZmcyhzbGJpdG1hcCkgKyAxOworCQkqcGFnZSA9IHBvb2wtPmZyZWVsaXN0W3NsaW5kZXhdLnBhZ2U7CisJCSpvZmZzZXQgPSBwb29sLT5mcmVlbGlzdFtzbGluZGV4XS5vZmZzZXQ7CisJCXJldHVybiBzbGluZGV4OworCX0KKworCS8qIE5vdyBkbyBhIGZ1bGwgdHdvLWxldmVsIGJpdG1hcCBzZWFyY2ggdG8gZmluZCBuZXh0IG5lYXJlc3QgZml0ICovCisJZmxpbmRleCA9IHNsaW5kZXggLyBCSVRTX1BFUl9MT05HOworCisJZmxiaXRtYXAgPSAocG9vbC0+ZmxiaXRtYXApID4+IChmbGluZGV4ICsgMSk7CisJaWYgKCFmbGJpdG1hcCkKKwkJcmV0dXJuIDA7CisKKwlmbGluZGV4ICs9IF9fZmZzKGZsYml0bWFwKSArIDE7CisJc2xiaXRtYXAgPSBwb29sLT5zbGJpdG1hcFtmbGluZGV4XTsKKwlzbGluZGV4ID0gKGZsaW5kZXggKiBCSVRTX1BFUl9MT05HKSArIF9fZmZzKHNsYml0bWFwKTsKKwkqcGFnZSA9IHBvb2wtPmZyZWVsaXN0W3NsaW5kZXhdLnBhZ2U7CisJKm9mZnNldCA9IHBvb2wtPmZyZWVsaXN0W3NsaW5kZXhdLm9mZnNldDsKKworCXJldHVybiBzbGluZGV4OworfQorCisvKgorICogSW5zZXJ0IGJsb2NrIGF0IDxwYWdlLCBvZmZzZXQ+IGluIGZyZWVsaXN0IG9mIGdpdmVuIHBvb2wuCisgKiBmcmVlbGlzdCB1c2VkIGRlcGVuZHMgb24gYmxvY2sgc2l6ZS4KKyAqLworc3RhdGljIHZvaWQgaW5zZXJ0X2Jsb2NrKHN0cnVjdCB4dl9wb29sICpwb29sLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdTMyIG9mZnNldCwKKwkJCXN0cnVjdCBibG9ja19oZWFkZXIgKmJsb2NrKQoreworCXUzMiBmbGluZGV4LCBzbGluZGV4OworCXN0cnVjdCBibG9ja19oZWFkZXIgKm5leHRibG9jazsKKworCXNsaW5kZXggPSBnZXRfaW5kZXhfZm9yX2luc2VydChibG9jay0+c2l6ZSk7CisJZmxpbmRleCA9IHNsaW5kZXggLyBCSVRTX1BFUl9MT05HOworCisJYmxvY2stPmxpbmsucHJldl9wYWdlID0gMDsKKwlibG9jay0+bGluay5wcmV2X29mZnNldCA9IDA7CisJYmxvY2stPmxpbmsubmV4dF9wYWdlID0gcG9vbC0+ZnJlZWxpc3Rbc2xpbmRleF0ucGFnZTsKKwlibG9jay0+bGluay5uZXh0X29mZnNldCA9IHBvb2wtPmZyZWVsaXN0W3NsaW5kZXhdLm9mZnNldDsKKwlwb29sLT5mcmVlbGlzdFtzbGluZGV4XS5wYWdlID0gcGFnZTsKKwlwb29sLT5mcmVlbGlzdFtzbGluZGV4XS5vZmZzZXQgPSBvZmZzZXQ7CisKKwlpZiAoYmxvY2stPmxpbmsubmV4dF9wYWdlKSB7CisJCW5leHRibG9jayA9IGdldF9wdHJfYXRvbWljKGJsb2NrLT5saW5rLm5leHRfcGFnZSwKKwkJCQkJYmxvY2stPmxpbmsubmV4dF9vZmZzZXQsIEtNX1VTRVIxKTsKKwkJbmV4dGJsb2NrLT5saW5rLnByZXZfcGFnZSA9IHBhZ2U7CisJCW5leHRibG9jay0+bGluay5wcmV2X29mZnNldCA9IG9mZnNldDsKKwkJcHV0X3B0cl9hdG9taWMobmV4dGJsb2NrLCBLTV9VU0VSMSk7CisJfQorCisJX19zZXRfYml0KHNsaW5kZXggJSBCSVRTX1BFUl9MT05HLCAmcG9vbC0+c2xiaXRtYXBbZmxpbmRleF0pOworCV9fc2V0X2JpdChmbGluZGV4LCAmcG9vbC0+ZmxiaXRtYXApOworfQorCisvKgorICogUmVtb3ZlIGJsb2NrIGZyb20gaGVhZCBvZiBmcmVlbGlzdC4gSW5kZXggJ3NsaW5kZXgnIGlkZW50aWZpZXMgdGhlIGZyZWVsaXN0LgorICovCitzdGF0aWMgdm9pZCByZW1vdmVfYmxvY2tfaGVhZChzdHJ1Y3QgeHZfcG9vbCAqcG9vbCwKKwkJCXN0cnVjdCBibG9ja19oZWFkZXIgKmJsb2NrLCB1MzIgc2xpbmRleCkKK3sKKwlzdHJ1Y3QgYmxvY2tfaGVhZGVyICp0bXBibG9jazsKKwl1MzIgZmxpbmRleCA9IHNsaW5kZXggLyBCSVRTX1BFUl9MT05HOworCisJcG9vbC0+ZnJlZWxpc3Rbc2xpbmRleF0ucGFnZSA9IGJsb2NrLT5saW5rLm5leHRfcGFnZTsKKwlwb29sLT5mcmVlbGlzdFtzbGluZGV4XS5vZmZzZXQgPSBibG9jay0+bGluay5uZXh0X29mZnNldDsKKwlibG9jay0+bGluay5wcmV2X3BhZ2UgPSAwOworCWJsb2NrLT5saW5rLnByZXZfb2Zmc2V0ID0gMDsKKworCWlmICghcG9vbC0+ZnJlZWxpc3Rbc2xpbmRleF0ucGFnZSkgeworCQlfX2NsZWFyX2JpdChzbGluZGV4ICUgQklUU19QRVJfTE9ORywgJnBvb2wtPnNsYml0bWFwW2ZsaW5kZXhdKTsKKwkJaWYgKCFwb29sLT5zbGJpdG1hcFtmbGluZGV4XSkKKwkJCV9fY2xlYXJfYml0KGZsaW5kZXgsICZwb29sLT5mbGJpdG1hcCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogREVCVUcgT05MWTogV2UgbmVlZCBub3QgcmVpbml0aWFsaXplIGZyZWVsaXN0IGhlYWQgcHJldmlvdXMKKwkJICogcG9pbnRlciB0byAwIC0gd2UgbmV2ZXIgZGVwZW5kIG9uIGl0cyB2YWx1ZS4gQnV0IGp1c3QgZm9yCisJCSAqIHNhbml0eSwgbGV0cyBkbyBpdC4KKwkJICovCisJCXRtcGJsb2NrID0gZ2V0X3B0cl9hdG9taWMocG9vbC0+ZnJlZWxpc3Rbc2xpbmRleF0ucGFnZSwKKwkJCQlwb29sLT5mcmVlbGlzdFtzbGluZGV4XS5vZmZzZXQsIEtNX1VTRVIxKTsKKwkJdG1wYmxvY2stPmxpbmsucHJldl9wYWdlID0gMDsKKwkJdG1wYmxvY2stPmxpbmsucHJldl9vZmZzZXQgPSAwOworCQlwdXRfcHRyX2F0b21pYyh0bXBibG9jaywgS01fVVNFUjEpOworCX0KK30KKworLyoKKyAqIFJlbW92ZSBibG9jayBmcm9tIGZyZWVsaXN0LiBJbmRleCAnc2xpbmRleCcgaWRlbnRpZmllcyB0aGUgZnJlZWxpc3QuCisgKi8KK3N0YXRpYyB2b2lkIHJlbW92ZV9ibG9jayhzdHJ1Y3QgeHZfcG9vbCAqcG9vbCwgc3RydWN0IHBhZ2UgKnBhZ2UsIHUzMiBvZmZzZXQsCisJCQlzdHJ1Y3QgYmxvY2tfaGVhZGVyICpibG9jaywgdTMyIHNsaW5kZXgpCit7CisJdTMyIGZsaW5kZXg7CisJc3RydWN0IGJsb2NrX2hlYWRlciAqdG1wYmxvY2s7CisKKwlpZiAocG9vbC0+ZnJlZWxpc3Rbc2xpbmRleF0ucGFnZSA9PSBwYWdlCisJICAgJiYgcG9vbC0+ZnJlZWxpc3Rbc2xpbmRleF0ub2Zmc2V0ID09IG9mZnNldCkgeworCQlyZW1vdmVfYmxvY2tfaGVhZChwb29sLCBibG9jaywgc2xpbmRleCk7CisJCXJldHVybjsKKwl9CisKKwlmbGluZGV4ID0gc2xpbmRleCAvIEJJVFNfUEVSX0xPTkc7CisKKwlpZiAoYmxvY2stPmxpbmsucHJldl9wYWdlKSB7CisJCXRtcGJsb2NrID0gZ2V0X3B0cl9hdG9taWMoYmxvY2stPmxpbmsucHJldl9wYWdlLAorCQkJCWJsb2NrLT5saW5rLnByZXZfb2Zmc2V0LCBLTV9VU0VSMSk7CisJCXRtcGJsb2NrLT5saW5rLm5leHRfcGFnZSA9IGJsb2NrLT5saW5rLm5leHRfcGFnZTsKKwkJdG1wYmxvY2stPmxpbmsubmV4dF9vZmZzZXQgPSBibG9jay0+bGluay5uZXh0X29mZnNldDsKKwkJcHV0X3B0cl9hdG9taWModG1wYmxvY2ssIEtNX1VTRVIxKTsKKwl9CisKKwlpZiAoYmxvY2stPmxpbmsubmV4dF9wYWdlKSB7CisJCXRtcGJsb2NrID0gZ2V0X3B0cl9hdG9taWMoYmxvY2stPmxpbmsubmV4dF9wYWdlLAorCQkJCWJsb2NrLT5saW5rLm5leHRfb2Zmc2V0LCBLTV9VU0VSMSk7CisJCXRtcGJsb2NrLT5saW5rLnByZXZfcGFnZSA9IGJsb2NrLT5saW5rLnByZXZfcGFnZTsKKwkJdG1wYmxvY2stPmxpbmsucHJldl9vZmZzZXQgPSBibG9jay0+bGluay5wcmV2X29mZnNldDsKKwkJcHV0X3B0cl9hdG9taWModG1wYmxvY2ssIEtNX1VTRVIxKTsKKwl9Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhIHBhZ2UgYW5kIGFkZCBpdCBmcmVlbGlzdCBvZiBnaXZlbiBwb29sLgorICovCitzdGF0aWMgaW50IGdyb3dfcG9vbChzdHJ1Y3QgeHZfcG9vbCAqcG9vbCwgZ2ZwX3QgZmxhZ3MpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IGJsb2NrX2hlYWRlciAqYmxvY2s7CisKKwlwYWdlID0gYWxsb2NfcGFnZShmbGFncyk7CisJaWYgKHVubGlrZWx5KCFwYWdlKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzdGF0X2luYygmcG9vbC0+dG90YWxfcGFnZXMpOworCisJc3Bpbl9sb2NrKCZwb29sLT5sb2NrKTsKKwlibG9jayA9IGdldF9wdHJfYXRvbWljKHBhZ2UsIDAsIEtNX1VTRVIwKTsKKworCWJsb2NrLT5zaXplID0gUEFHRV9TSVpFIC0gWFZfQUxJR047CisJc2V0X2ZsYWcoYmxvY2ssIEJMT0NLX0ZSRUUpOworCWNsZWFyX2ZsYWcoYmxvY2ssIFBSRVZfRlJFRSk7CisJc2V0X2Jsb2NrcHJldihibG9jaywgMCk7CisKKwlpbnNlcnRfYmxvY2socG9vbCwgcGFnZSwgMCwgYmxvY2spOworCisJcHV0X3B0cl9hdG9taWMoYmxvY2ssIEtNX1VTRVIwKTsKKwlzcGluX3VubG9jaygmcG9vbC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENyZWF0ZSBhIG1lbW9yeSBwb29sLiBBbGxvY2F0ZXMgZnJlZWxpc3QsIGJpdG1hcHMgYW5kIG90aGVyCisgKiBwZXItcG9vbCBtZXRhZGF0YS4KKyAqLworc3RydWN0IHh2X3Bvb2wgKnh2X2NyZWF0ZV9wb29sKHZvaWQpCit7CisJdTMyIG92aGRfc2l6ZTsKKwlzdHJ1Y3QgeHZfcG9vbCAqcG9vbDsKKworCW92aGRfc2l6ZSA9IHJvdW5kdXAoc2l6ZW9mKCpwb29sKSwgUEFHRV9TSVpFKTsKKwlwb29sID0ga3phbGxvYyhvdmhkX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghcG9vbCkKKwkJcmV0dXJuIE5VTEw7CisKKwlzcGluX2xvY2tfaW5pdCgmcG9vbC0+bG9jayk7CisKKwlyZXR1cm4gcG9vbDsKK30KKwordm9pZCB4dl9kZXN0cm95X3Bvb2woc3RydWN0IHh2X3Bvb2wgKnBvb2wpCit7CisJa2ZyZWUocG9vbCk7Cit9CisKKy8qKgorICogeHZfbWFsbG9jIC0gQWxsb2NhdGUgYmxvY2sgb2YgZ2l2ZW4gc2l6ZSBmcm9tIHBvb2wuCisgKiBAcG9vbDogcG9vbCB0byBhbGxvY2F0ZSBmcm9tCisgKiBAc2l6ZTogc2l6ZSBvZiBibG9jayB0byBhbGxvY2F0ZQorICogQHBhZ2U6IHBhZ2Ugbm8uIHRoYXQgaG9sZHMgdGhlIG9iamVjdAorICogQG9mZnNldDogbG9jYXRpb24gb2Ygb2JqZWN0IHdpdGhpbiBwYWdlCisgKgorICogT24gc3VjY2VzcywgPHBhZ2UsIG9mZnNldD4gaWRlbnRpZmllcyBibG9jayBhbGxvY2F0ZWQKKyAqIGFuZCAwIGlzIHJldHVybmVkLiBPbiBmYWlsdXJlLCA8cGFnZSwgb2Zmc2V0PiBpcyBzZXQgdG8KKyAqIDAgYW5kIC1FTk9NRU0gaXMgcmV0dXJuZWQuCisgKgorICogQWxsb2NhdGlvbiByZXF1ZXN0cyB3aXRoIHNpemUgPiBYVl9NQVhfQUxMT0NfU0laRSB3aWxsIGZhaWwuCisgKi8KK2ludCB4dl9tYWxsb2Moc3RydWN0IHh2X3Bvb2wgKnBvb2wsIHUzMiBzaXplLCBzdHJ1Y3QgcGFnZSAqKnBhZ2UsCisJCXUzMiAqb2Zmc2V0LCBnZnBfdCBmbGFncykKK3sKKwlpbnQgZXJyb3I7CisJdTMyIGluZGV4LCB0bXBzaXplLCBvcmlnc2l6ZSwgdG1wb2Zmc2V0OworCXN0cnVjdCBibG9ja19oZWFkZXIgKmJsb2NrLCAqdG1wYmxvY2s7CisKKwkqcGFnZSA9IE5VTEw7CisJKm9mZnNldCA9IDA7CisJb3JpZ3NpemUgPSBzaXplOworCisJaWYgKHVubGlrZWx5KCFzaXplIHx8IHNpemUgPiBYVl9NQVhfQUxMT0NfU0laRSkpCisJCXJldHVybiAtRU5PTUVNOworCisJc2l6ZSA9IEFMSUdOKHNpemUsIFhWX0FMSUdOKTsKKworCXNwaW5fbG9jaygmcG9vbC0+bG9jayk7CisKKwlpbmRleCA9IGZpbmRfYmxvY2socG9vbCwgc2l6ZSwgcGFnZSwgb2Zmc2V0KTsKKworCWlmICghKnBhZ2UpIHsKKwkJc3Bpbl91bmxvY2soJnBvb2wtPmxvY2spOworCQlpZiAoZmxhZ3MgJiBHRlBfTk9XQUlUKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWVycm9yID0gZ3Jvd19wb29sKHBvb2wsIGZsYWdzKTsKKwkJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJCXJldHVybiBlcnJvcjsKKworCQlzcGluX2xvY2soJnBvb2wtPmxvY2spOworCQlpbmRleCA9IGZpbmRfYmxvY2socG9vbCwgc2l6ZSwgcGFnZSwgb2Zmc2V0KTsKKwl9CisKKwlpZiAoISpwYWdlKSB7CisJCXNwaW5fdW5sb2NrKCZwb29sLT5sb2NrKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYmxvY2sgPSBnZXRfcHRyX2F0b21pYygqcGFnZSwgKm9mZnNldCwgS01fVVNFUjApOworCisJcmVtb3ZlX2Jsb2NrX2hlYWQocG9vbCwgYmxvY2ssIGluZGV4KTsKKworCS8qIFNwbGl0IHRoZSBibG9jayBpZiByZXF1aXJlZCAqLworCXRtcG9mZnNldCA9ICpvZmZzZXQgKyBzaXplICsgWFZfQUxJR047CisJdG1wc2l6ZSA9IGJsb2NrLT5zaXplIC0gc2l6ZTsKKwl0bXBibG9jayA9IChzdHJ1Y3QgYmxvY2tfaGVhZGVyICopKChjaGFyICopYmxvY2sgKyBzaXplICsgWFZfQUxJR04pOworCWlmICh0bXBzaXplKSB7CisJCXRtcGJsb2NrLT5zaXplID0gdG1wc2l6ZSAtIFhWX0FMSUdOOworCQlzZXRfZmxhZyh0bXBibG9jaywgQkxPQ0tfRlJFRSk7CisJCWNsZWFyX2ZsYWcodG1wYmxvY2ssIFBSRVZfRlJFRSk7CisKKwkJc2V0X2Jsb2NrcHJldih0bXBibG9jaywgKm9mZnNldCk7CisJCWlmICh0bXBibG9jay0+c2l6ZSA+PSBYVl9NSU5fQUxMT0NfU0laRSkKKwkJCWluc2VydF9ibG9jayhwb29sLCAqcGFnZSwgdG1wb2Zmc2V0LCB0bXBibG9jayk7CisKKwkJaWYgKHRtcG9mZnNldCArIFhWX0FMSUdOICsgdG1wYmxvY2stPnNpemUgIT0gUEFHRV9TSVpFKSB7CisJCQl0bXBibG9jayA9IEJMT0NLX05FWFQodG1wYmxvY2spOworCQkJc2V0X2Jsb2NrcHJldih0bXBibG9jaywgdG1wb2Zmc2V0KTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFRoaXMgYmxvY2sgaXMgZXhhY3QgZml0ICovCisJCWlmICh0bXBvZmZzZXQgIT0gUEFHRV9TSVpFKQorCQkJY2xlYXJfZmxhZyh0bXBibG9jaywgUFJFVl9GUkVFKTsKKwl9CisKKwlibG9jay0+c2l6ZSA9IG9yaWdzaXplOworCWNsZWFyX2ZsYWcoYmxvY2ssIEJMT0NLX0ZSRUUpOworCisJcHV0X3B0cl9hdG9taWMoYmxvY2ssIEtNX1VTRVIwKTsKKwlzcGluX3VubG9jaygmcG9vbC0+bG9jayk7CisKKwkqb2Zmc2V0ICs9IFhWX0FMSUdOOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGcmVlIGJsb2NrIGlkZW50aWZpZWQgd2l0aCA8cGFnZSwgb2Zmc2V0PgorICovCit2b2lkIHh2X2ZyZWUoc3RydWN0IHh2X3Bvb2wgKnBvb2wsIHN0cnVjdCBwYWdlICpwYWdlLCB1MzIgb2Zmc2V0KQoreworCXZvaWQgKnBhZ2Vfc3RhcnQ7CisJc3RydWN0IGJsb2NrX2hlYWRlciAqYmxvY2ssICp0bXBibG9jazsKKworCW9mZnNldCAtPSBYVl9BTElHTjsKKworCXNwaW5fbG9jaygmcG9vbC0+bG9jayk7CisKKwlwYWdlX3N0YXJ0ID0gZ2V0X3B0cl9hdG9taWMocGFnZSwgMCwgS01fVVNFUjApOworCWJsb2NrID0gKHN0cnVjdCBibG9ja19oZWFkZXIgKikoKGNoYXIgKilwYWdlX3N0YXJ0ICsgb2Zmc2V0KTsKKworCS8qIENhdGNoIGRvdWJsZSBmcmVlIGJ1Z3MgKi8KKwlCVUdfT04odGVzdF9mbGFnKGJsb2NrLCBCTE9DS19GUkVFKSk7CisKKwlibG9jay0+c2l6ZSA9IEFMSUdOKGJsb2NrLT5zaXplLCBYVl9BTElHTik7CisKKwl0bXBibG9jayA9IEJMT0NLX05FWFQoYmxvY2spOworCWlmIChvZmZzZXQgKyBibG9jay0+c2l6ZSArIFhWX0FMSUdOID09IFBBR0VfU0laRSkKKwkJdG1wYmxvY2sgPSBOVUxMOworCisJLyogTWVyZ2UgbmV4dCBibG9jayBpZiBpdHMgZnJlZSAqLworCWlmICh0bXBibG9jayAmJiB0ZXN0X2ZsYWcodG1wYmxvY2ssIEJMT0NLX0ZSRUUpKSB7CisJCS8qCisJCSAqIEJsb2NrcyBzbWFsbGVyIHRoYW4gWFZfTUlOX0FMTE9DX1NJWkUKKwkJICogYXJlIG5vdCBpbnNlcnRlZCBpbiBhbnkgZnJlZSBsaXN0LgorCQkgKi8KKwkJaWYgKHRtcGJsb2NrLT5zaXplID49IFhWX01JTl9BTExPQ19TSVpFKSB7CisJCQlyZW1vdmVfYmxvY2socG9vbCwgcGFnZSwKKwkJCQkgICAgb2Zmc2V0ICsgYmxvY2stPnNpemUgKyBYVl9BTElHTiwgdG1wYmxvY2ssCisJCQkJICAgIGdldF9pbmRleF9mb3JfaW5zZXJ0KHRtcGJsb2NrLT5zaXplKSk7CisJCX0KKwkJYmxvY2stPnNpemUgKz0gdG1wYmxvY2stPnNpemUgKyBYVl9BTElHTjsKKwl9CisKKwkvKiBNZXJnZSBwcmV2aW91cyBibG9jayBpZiBpdHMgZnJlZSAqLworCWlmICh0ZXN0X2ZsYWcoYmxvY2ssIFBSRVZfRlJFRSkpIHsKKwkJdG1wYmxvY2sgPSAoc3RydWN0IGJsb2NrX2hlYWRlciAqKSgoY2hhciAqKShwYWdlX3N0YXJ0KSArCisJCQkJCQlnZXRfYmxvY2twcmV2KGJsb2NrKSk7CisJCW9mZnNldCA9IG9mZnNldCAtIHRtcGJsb2NrLT5zaXplIC0gWFZfQUxJR047CisKKwkJaWYgKHRtcGJsb2NrLT5zaXplID49IFhWX01JTl9BTExPQ19TSVpFKQorCQkJcmVtb3ZlX2Jsb2NrKHBvb2wsIHBhZ2UsIG9mZnNldCwgdG1wYmxvY2ssCisJCQkJICAgIGdldF9pbmRleF9mb3JfaW5zZXJ0KHRtcGJsb2NrLT5zaXplKSk7CisKKwkJdG1wYmxvY2stPnNpemUgKz0gYmxvY2stPnNpemUgKyBYVl9BTElHTjsKKwkJYmxvY2sgPSB0bXBibG9jazsKKwl9CisKKwkvKiBObyB1c2VkIG9iamVjdHMgaW4gdGhpcyBwYWdlLiBGcmVlIGl0LiAqLworCWlmIChibG9jay0+c2l6ZSA9PSBQQUdFX1NJWkUgLSBYVl9BTElHTikgeworCQlwdXRfcHRyX2F0b21pYyhwYWdlX3N0YXJ0LCBLTV9VU0VSMCk7CisJCXNwaW5fdW5sb2NrKCZwb29sLT5sb2NrKTsKKworCQlfX2ZyZWVfcGFnZShwYWdlKTsKKwkJc3RhdF9kZWMoJnBvb2wtPnRvdGFsX3BhZ2VzKTsKKwkJcmV0dXJuOworCX0KKworCXNldF9mbGFnKGJsb2NrLCBCTE9DS19GUkVFKTsKKwlpZiAoYmxvY2stPnNpemUgPj0gWFZfTUlOX0FMTE9DX1NJWkUpCisJCWluc2VydF9ibG9jayhwb29sLCBwYWdlLCBvZmZzZXQsIGJsb2NrKTsKKworCWlmIChvZmZzZXQgKyBibG9jay0+c2l6ZSArIFhWX0FMSUdOICE9IFBBR0VfU0laRSkgeworCQl0bXBibG9jayA9IEJMT0NLX05FWFQoYmxvY2spOworCQlzZXRfZmxhZyh0bXBibG9jaywgUFJFVl9GUkVFKTsKKwkJc2V0X2Jsb2NrcHJldih0bXBibG9jaywgb2Zmc2V0KTsKKwl9CisKKwlwdXRfcHRyX2F0b21pYyhwYWdlX3N0YXJ0LCBLTV9VU0VSMCk7CisJc3Bpbl91bmxvY2soJnBvb2wtPmxvY2spOworfQorCit1MzIgeHZfZ2V0X29iamVjdF9zaXplKHZvaWQgKm9iaikKK3sKKwlzdHJ1Y3QgYmxvY2tfaGVhZGVyICpibGs7CisKKwlibGsgPSAoc3RydWN0IGJsb2NrX2hlYWRlciAqKSgoY2hhciAqKShvYmopIC0gWFZfQUxJR04pOworCXJldHVybiBibGstPnNpemU7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRvdGFsIG1lbW9yeSB1c2VkIGJ5IGFsbG9jYXRvciAodXNlcmRhdGEgKyBtZXRhZGF0YSkKKyAqLwordTY0IHh2X2dldF90b3RhbF9zaXplX2J5dGVzKHN0cnVjdCB4dl9wb29sICpwb29sKQoreworCXJldHVybiBwb29sLT50b3RhbF9wYWdlcyA8PCBQQUdFX1NISUZUOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3h2bWFsbG9jLmggYi9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAveHZtYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTBjNmZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3h2bWFsbG9jLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIHh2bWFsbG9jIG1lbW9yeSBhbGxvY2F0b3IKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgIE5pdGluIEd1cHRhCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVzaW5nIGEgZHVhbCBsaWNlbnNlIHN0cmF0ZWd5OiBCU0QvR1BMCisgKiBZb3UgY2FuIGNob29zZSB0aGUgbGljZW5jZSB0aGF0IGJldHRlciBmaXRzIHlvdXIgcmVxdWlyZW1lbnRzLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiAzLWNsYXVzZSBCU0QgTGljZW5zZQorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wCisgKi8KKworI2lmbmRlZiBfWFZfTUFMTE9DX0hfCisjZGVmaW5lIF9YVl9NQUxMT0NfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCB4dl9wb29sOworCitzdHJ1Y3QgeHZfcG9vbCAqeHZfY3JlYXRlX3Bvb2wodm9pZCk7Cit2b2lkIHh2X2Rlc3Ryb3lfcG9vbChzdHJ1Y3QgeHZfcG9vbCAqcG9vbCk7CisKK2ludCB4dl9tYWxsb2Moc3RydWN0IHh2X3Bvb2wgKnBvb2wsIHUzMiBzaXplLCBzdHJ1Y3QgcGFnZSAqKnBhZ2UsCisJCQl1MzIgKm9mZnNldCwgZ2ZwX3QgZmxhZ3MpOwordm9pZCB4dl9mcmVlKHN0cnVjdCB4dl9wb29sICpwb29sLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdTMyIG9mZnNldCk7CisKK3UzMiB4dl9nZXRfb2JqZWN0X3NpemUodm9pZCAqb2JqKTsKK3U2NCB4dl9nZXRfdG90YWxfc2l6ZV9ieXRlcyhzdHJ1Y3QgeHZfcG9vbCAqcG9vbCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3h2bWFsbG9jX2ludC5oIGIvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3h2bWFsbG9jX2ludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYzFhNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAveHZtYWxsb2NfaW50LmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIHh2bWFsbG9jIG1lbW9yeSBhbGxvY2F0b3IKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgIE5pdGluIEd1cHRhCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVzaW5nIGEgZHVhbCBsaWNlbnNlIHN0cmF0ZWd5OiBCU0QvR1BMCisgKiBZb3UgY2FuIGNob29zZSB0aGUgbGljZW5jZSB0aGF0IGJldHRlciBmaXRzIHlvdXIgcmVxdWlyZW1lbnRzLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiAzLWNsYXVzZSBCU0QgTGljZW5zZQorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wCisgKi8KKworI2lmbmRlZiBfWFZfTUFMTE9DX0lOVF9IXworI2RlZmluZSBfWFZfTUFMTE9DX0lOVF9IXworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogVXNlciBjb25maWd1cmFibGUgcGFyYW1zICovCisKKy8qIE11c3QgYmUgcG93ZXIgb2YgdHdvICovCisjZGVmaW5lIFhWX0FMSUdOX1NISUZUCTIKKyNkZWZpbmUgWFZfQUxJR04JKDEgPDwgWFZfQUxJR05fU0hJRlQpCisjZGVmaW5lIFhWX0FMSUdOX01BU0sJKFhWX0FMSUdOIC0gMSkKKworLyogVGhpcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBzaXplb2YobGlua19mcmVlKSAqLworI2RlZmluZSBYVl9NSU5fQUxMT0NfU0laRQkzMgorI2RlZmluZSBYVl9NQVhfQUxMT0NfU0laRQkoUEFHRV9TSVpFIC0gWFZfQUxJR04pCisKKy8qIEZyZWUgbGlzdHMgYXJlIHNlcGFyYXRlZCBieSBGTF9ERUxUQSBieXRlcyAqLworI2RlZmluZSBGTF9ERUxUQV9TSElGVAkzCisjZGVmaW5lIEZMX0RFTFRBCSgxIDw8IEZMX0RFTFRBX1NISUZUKQorI2RlZmluZSBGTF9ERUxUQV9NQVNLCShGTF9ERUxUQSAtIDEpCisjZGVmaW5lIE5VTV9GUkVFX0xJU1RTCSgoWFZfTUFYX0FMTE9DX1NJWkUgLSBYVl9NSU5fQUxMT0NfU0laRSkgXAorCQkJCS8gRkxfREVMVEEgKyAxKQorCisjZGVmaW5lIE1BWF9GTEkJCURJVl9ST1VORF9VUChOVU1fRlJFRV9MSVNUUywgQklUU19QRVJfTE9ORykKKworLyogRW5kIG9mIHVzZXIgcGFyYW1zICovCisKK2VudW0gYmxvY2tmbGFncyB7CisJQkxPQ0tfRlJFRSwKKwlQUkVWX0ZSRUUsCisJX19OUl9CTE9DS0ZMQUdTLAorfTsKKworI2RlZmluZSBGTEFHU19NQVNLCVhWX0FMSUdOX01BU0sKKyNkZWZpbmUgUFJFVl9NQVNLCSh+RkxBR1NfTUFTSykKKworc3RydWN0IGZyZWVsaXN0X2VudHJ5IHsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1MTYgb2Zmc2V0OworCXUxNiBwYWQ7Cit9OworCitzdHJ1Y3QgbGlua19mcmVlIHsKKwlzdHJ1Y3QgcGFnZSAqcHJldl9wYWdlOworCXN0cnVjdCBwYWdlICpuZXh0X3BhZ2U7CisJdTE2IHByZXZfb2Zmc2V0OworCXUxNiBuZXh0X29mZnNldDsKK307CisKK3N0cnVjdCBibG9ja19oZWFkZXIgeworCXVuaW9uIHsKKwkJLyogVGhpcyBjb21tb24gaGVhZGVyIG11c3QgYmUgQUxJR04gYnl0ZXMgKi8KKwkJdTggY29tbW9uW1hWX0FMSUdOXTsKKwkJc3RydWN0IHsKKwkJCXUxNiBzaXplOworCQkJdTE2IHByZXY7CisJCX07CisJfTsKKwlzdHJ1Y3QgbGlua19mcmVlIGxpbms7Cit9OworCitzdHJ1Y3QgeHZfcG9vbCB7CisJdWxvbmcgZmxiaXRtYXA7CisJdWxvbmcgc2xiaXRtYXBbTUFYX0ZMSV07CisJc3BpbmxvY2tfdCBsb2NrOworCisJc3RydWN0IGZyZWVsaXN0X2VudHJ5IGZyZWVsaXN0W05VTV9GUkVFX0xJU1RTXTsKKworCS8qIHN0YXRzICovCisJdTY0IHRvdGFsX3BhZ2VzOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcmFyL3Jhcl9kcml2ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9yYXIvcmFyX2RyaXZlci5jCmluZGV4IDk4MDVkNzQuLmQ4NWQxODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9yYXIvcmFyX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9yYXIvcmFyX2RyaXZlci5jCkBAIC02Niw3ICs2Niw3IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgcmFyX2V4aXRfaGFuZGxlcih2b2lkKTsKIAogLyoKLSAgZnVuY3Rpb24gdGhhdCBpcyBhY3RpdmF0ZWQgb24gdGhlIHN1Y2Nlc2Z1bGwgcHJvYmUgb2YgdGhlIFJBUiBkZXZpY2UKKyAgZnVuY3Rpb24gdGhhdCBpcyBhY3RpdmF0ZWQgb24gdGhlIHN1Y2Nlc3NmdWxsIHByb2JlIG9mIHRoZSBSQVIgZGV2aWNlCiAqLwogc3RhdGljIGludCBfX2RldmluaXQgcmFyX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKIApAQCAtMzE5LDcgKzMxOSw3IEBACiB9CiAKIC8qCi0gIGZ1bmN0aW9uIHRoYXQgaXMgYWN0aXZhZWQgb24gdGhlIHN1Y2Nlc2Z1bGwgcHJvYmUgb2YgdGhlIFJBUiBkZXZpY2UKKyAgZnVuY3Rpb24gdGhhdCBpcyBhY3RpdmF0ZWQgb24gdGhlIHN1Y2Nlc3NmdWxsIHByb2JlIG9mIHRoZSBSQVIgZGV2aWNlCiAqLwogc3RhdGljIGludCBfX2RldmluaXQgcmFyX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC8yODYwX21haW5fZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwLzI4NjBfbWFpbl9kZXYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJmMDI5Ni4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwLzI4NjBfbWFpbl9kZXYuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMTkgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICAyODcwX21haW5fZGV2LmMKLQotICAgIEFic3RyYWN0OgotICAgIENyZWF0ZSBhbmQgcmVnaXN0ZXIgbmV0d29yayBpbnRlcmZhY2UuCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSNpbmNsdWRlICJydF9jb25maWcuaCIKLQotZXh0ZXJuIElOVCBfX2RldmluaXQgcnQyOHh4X3Byb2JlKElOIHZvaWQgKl9kZXZfcCwgSU4gdm9pZCAqX2Rldl9pZF9wLAotCQkJCQkJCQkJSU4gVUlOVCBhcmdjLCBPVVQgUFJUTVBfQURBUFRFUiAqcHBBZCk7Ci0KLXN0YXRpYyB2b2lkIHJ4X2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgbWdtdF9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgdm9pZCBhYzBfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgYWMxX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyB2b2lkIGFjMl9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgdm9pZCBhYzNfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgaGNjYV9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgdm9pZCBmaWZvX3N0YXRpc3RpY19mdWxsX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBTeW1ib2wgJiBNYWNybyBEZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIFJUMjg2MF9JTlRfUlhfRExZCQkJCSgxPDwwKQkJLy8gYml0IDAKLSNkZWZpbmUgUlQyODYwX0lOVF9UWF9ETFkJCQkJKDE8PDEpCQkvLyBiaXQgMQotI2RlZmluZSBSVDI4NjBfSU5UX1JYX0RPTkUJCQkJKDE8PDIpCQkvLyBiaXQgMgotI2RlZmluZSBSVDI4NjBfSU5UX0FDMF9ETUFfRE9ORQkJCSgxPDwzKQkJLy8gYml0IDMKLSNkZWZpbmUgUlQyODYwX0lOVF9BQzFfRE1BX0RPTkUJCQkoMTw8NCkJCS8vIGJpdCA0Ci0jZGVmaW5lIFJUMjg2MF9JTlRfQUMyX0RNQV9ET05FCQkJKDE8PDUpCQkvLyBiaXQgNQotI2RlZmluZSBSVDI4NjBfSU5UX0FDM19ETUFfRE9ORQkJCSgxPDw2KQkJLy8gYml0IDYKLSNkZWZpbmUgUlQyODYwX0lOVF9IQ0NBX0RNQV9ET05FCQkoMTw8NykJCS8vIGJpdCA3Ci0jZGVmaW5lIFJUMjg2MF9JTlRfTUdNVF9ET05FCQkJKDE8PDgpCQkvLyBiaXQgOAotCi0jZGVmaW5lIElOVF9SWAkJCVJUMjg2MF9JTlRfUlhfRE9ORQotCi0jZGVmaW5lIElOVF9BQzBfRExZCQkoUlQyODYwX0lOVF9BQzBfRE1BX0RPTkUpIC8vfCBSVDI4NjBfSU5UX1RYX0RMWSkKLSNkZWZpbmUgSU5UX0FDMV9ETFkJCShSVDI4NjBfSU5UX0FDMV9ETUFfRE9ORSkgLy98IFJUMjg2MF9JTlRfVFhfRExZKQotI2RlZmluZSBJTlRfQUMyX0RMWQkJKFJUMjg2MF9JTlRfQUMyX0RNQV9ET05FKSAvL3wgUlQyODYwX0lOVF9UWF9ETFkpCi0jZGVmaW5lIElOVF9BQzNfRExZCQkoUlQyODYwX0lOVF9BQzNfRE1BX0RPTkUpIC8vfCBSVDI4NjBfSU5UX1RYX0RMWSkKLSNkZWZpbmUgSU5UX0hDQ0FfRExZIAkoUlQyODYwX0lOVF9IQ0NBX0RNQV9ET05FKSAvL3wgUlQyODYwX0lOVF9UWF9ETFkpCi0jZGVmaW5lIElOVF9NR01UX0RMWQlSVDI4NjBfSU5UX01HTVRfRE9ORQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBQcm90b3R5cGVzIG9mIEZ1bmN0aW9ucyBVc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KLXN0YXRpYyBJTlQgX19kZXZpbml0IHJ0Mjg2MF9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICAqZW50KTsKLXN0YXRpYyBWT0lEIF9fZGV2ZXhpdCBydDI4NjBfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldik7Ci1zdGF0aWMgSU5UIF9fZGV2aW5pdCBydDI4NjBfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICAqZW50KTsKLXZvaWQgaW5pdF90aHJlYWRfdGFzayhQUlRNUF9BREFQVEVSIHBBZCk7Ci1zdGF0aWMgdm9pZCBfX2V4aXQgcnQyODYwX2NsZWFudXBfbW9kdWxlKHZvaWQpOwotc3RhdGljIGludCBfX2luaXQgcnQyODYwX2luaXRfbW9kdWxlKHZvaWQpOwotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHJ0Mjg2MF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwotc3RhdGljIGludCBydDI4NjBfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KTsKLSNlbmRpZiAvLyBDT05GSUdfUE0gLy8KLQotCi0vLwotLy8gUmFsaW5rIFBDSSBkZXZpY2UgdGFibGUsIGluY2x1ZGUgYWxsIHN1cHBvcnRlZCBjaGlwc2V0cwotLy8KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBydDI4NjBfcGNpX3RibFtdIF9fZGV2aW5pdGRhdGEgPQotewotCXtQQ0lfREVWSUNFKE5JQ19QQ0lfVkVORE9SX0lELCBOSUMyODYwX1BDSV9ERVZJQ0VfSUQpfSwJCS8vUlQyODYwMi40RwotCXtQQ0lfREVWSUNFKE5JQ19QQ0lfVkVORE9SX0lELCBOSUMyODYwX1BDSWVfREVWSUNFX0lEKX0sCi0Je1BDSV9ERVZJQ0UoTklDX1BDSV9WRU5ET1JfSUQsIE5JQzI3NjBfUENJX0RFVklDRV9JRCl9LAotCXtQQ0lfREVWSUNFKE5JQ19QQ0lfVkVORE9SX0lELCBOSUMyNzkwX1BDSWVfREVWSUNFX0lEKX0sCi0Je1BDSV9ERVZJQ0UoVkVOX0FXVF9QQ0lfVkVORE9SX0lELCBWRU5fQVdUX1BDSWVfREVWSUNFX0lEKX0sCi0Je1BDSV9ERVZJQ0UoRURJTUFYX1BDSV9WRU5ET1JfSUQsIDB4NzcwOCl9LAotCXtQQ0lfREVWSUNFKEVESU1BWF9QQ0lfVkVORE9SX0lELCAweDc3MjgpfSwKLQl7UENJX0RFVklDRShFRElNQVhfUENJX1ZFTkRPUl9JRCwgMHg3NzU4KX0sCi0Je1BDSV9ERVZJQ0UoRURJTUFYX1BDSV9WRU5ET1JfSUQsIDB4NzcyNyl9LAotCXtQQ0lfREVWSUNFKEVESU1BWF9QQ0lfVkVORE9SX0lELCAweDc3MzgpfSwKLQl7UENJX0RFVklDRShFRElNQVhfUENJX1ZFTkRPUl9JRCwgMHg3NzQ4KX0sCi0Je1BDSV9ERVZJQ0UoRURJTUFYX1BDSV9WRU5ET1JfSUQsIDB4Nzc2OCl9LAotICAgIHswLH0JCS8vIHRlcm1pbmF0ZSBsaXN0Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcnQyODYwX3BjaV90YmwpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotI2lmZGVmIE1PRFVMRV9WRVJTSU9OCi1NT0RVTEVfVkVSU0lPTihTVEFfRFJJVkVSX1ZFUlNJT04pOwotI2VuZGlmCi0KLS8vCi0vLyBPdXIgUENJIGRyaXZlciBzdHJ1Y3R1cmUKLS8vCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcnQyODYwX2RyaXZlciA9Ci17Ci0gICAgbmFtZTogICAgICAgInJ0Mjg2MCIsCi0gICAgaWRfdGFibGU6ICAgcnQyODYwX3BjaV90YmwsCi0gICAgcHJvYmU6ICAgICAgcnQyODYwX2luaXRfb25lLAotICAgIHJlbW92ZTogICAgIF9fZGV2ZXhpdF9wKHJ0Mjg2MF9yZW1vdmVfb25lKSwKLQotI2lmZGVmIENPTkZJR19QTQotCXN1c3BlbmQ6CXJ0Mjg2MF9zdXNwZW5kLAotCXJlc3VtZToJCXJ0Mjg2MF9yZXN1bWUsCi0jZW5kaWYKLX07Ci0KLQotI2lmZGVmIENPTkZJR19QTQotCi1WT0lEIFJUMjg2MFJlamVjdFBlbmRpbmdQYWNrZXRzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCS8vIGNsZWFyIFBTIHBhY2tldHMKLQkvLyBjbGVhciBUeFN3IHBhY2tldHMKLX0KLQotc3RhdGljIGludCBydDI4NjBfc3VzcGVuZCgKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKLQlwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUilOVUxMOwotCUlOVDMyIHJldHZhbDsKLQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4NjBfc3VzcGVuZCgpXG4iKSk7Ci0KLQlpZiAobmV0X2RldiA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgibmV0X2RldiA9PSBOVUxMIVxuIikpOwotCX0KLQllbHNlCi0JewotCQlwQWQgPSBuZXRfZGV2LT5tbF9wcml2OwotCi0JCS8qIHdlIGNhbiBub3QgdXNlIElGRl9VUCBiZWNhdXNlIHJhMCBkb3duIGJ1dCByYTEgdXAgKi8KLQkJLyogYW5kIDEgc3VzcGVuZC9yZXN1bWUgZnVuY3Rpb24gZm9yIDEgbW9kdWxlLCBub3QgZm9yIGVhY2ggaW50ZXJmYWNlICovCi0JCS8qIHNvIExpbnV4IHdpbGwgY2FsbCBzdXNwZW5kL3Jlc3VtZSBmdW5jdGlvbiBvbmNlICovCi0JCWlmIChWSVJUVUFMX0lGX05VTShwQWQpID4gMCkKLQkJewotCQkJLy8gYXZvaWQgdXNlcnMgZG8gc3VzcGVuZCBhZnRlciBpbnRlcmZhY2UgaXMgZG93bgotCi0JCQkvLyBzdG9wIGludGVyZmFjZQotCQkJbmV0aWZfY2Fycmllcl9vZmYobmV0X2Rldik7Ci0JCQluZXRpZl9zdG9wX3F1ZXVlKG5ldF9kZXYpOwotCi0JCQkvLyBtYXJrIGRldmljZSBhcyByZW1vdmVkIGZyb20gc3lzdGVtIGFuZCB0aGVyZWZvcmUgbm8gbG9uZ2VyIGF2YWlsYWJsZQotCQkJbmV0aWZfZGV2aWNlX2RldGFjaChuZXRfZGV2KTsKLQotCQkJLy8gbWFyayBoYWx0IGZsYWcKLQkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOwotCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKLQotCQkJLy8gdGFrZSBkb3duIHRoZSBkZXZpY2UKLQkJCXJ0Mjh4eF9jbG9zZSgoUE5FVF9ERVYpbmV0X2Rldik7Ci0KLQkJCVJUX01PRF9ERUNfVVNFX0NPVU5UKCk7Ci0JCX0KLQl9Ci0KLQkvLyByZWZlcmVuY2UgdG8gaHR0cDovL3Zvdm8yMDAwLmNvbS90eXBlLWxhYi9saW51eC9rZXJuZWwtYXBpL2xpbnV4LWtlcm5lbC1hcGkuaHRtbAotCS8vIGVuYWJsZSBkZXZpY2UgdG8gZ2VuZXJhdGUgUE1FIyB3aGVuIHN1c3BlbmRlZAotCS8vIHBjaV9jaG9vc2Vfc3RhdGUoKTogQ2hvb3NlIHRoZSBwb3dlciBzdGF0ZSBvZiBhIFBDSSBkZXZpY2UgdG8gYmUgc3VzcGVuZGVkCi0JcmV0dmFsID0gcGNpX2VuYWJsZV93YWtlKHBjaV9kZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGNpX2Rldiwgc3RhdGUpLCAxKTsKLQkvLyBzYXZlIHRoZSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSBvZiBhIGRldmljZSBiZWZvcmUgc3VzcGVuZGluZwotCXBjaV9zYXZlX3N0YXRlKHBjaV9kZXYpOwotCS8vIGRpc2FibGUgUENJIGRldmljZSBhZnRlciB1c2UKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpX2Rldik7Ci0KLQlyZXR2YWwgPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaV9kZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGNpX2Rldiwgc3RhdGUpKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODYwX3N1c3BlbmQoKVxuIikpOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBpbnQgcnQyODYwX3Jlc3VtZSgKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKU5VTEw7Ci0JSU5UMzIgcmV0dmFsOwotCi0KLQkvLyBzZXQgdGhlIHBvd2VyIHN0YXRlIG9mIGEgUENJIGRldmljZQotCS8vIFBDSSBoYXMgNCBwb3dlciBzdGF0ZXMsIERPIChub3JtYWwpIH4gRDMobGVzcyBwb3dlcikKLQkvLyBpbiBpbmNsdWRlL2xpbnV4L3BjaS5oLCB5b3UgY2FuIGZpbmQgdGhhdAotCS8vICNkZWZpbmUgUENJX0QwICAgICAgICAgICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgMCkKLQkvLyAjZGVmaW5lIFBDSV9EMSAgICAgICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDEpCi0JLy8gI2RlZmluZSBQQ0lfRDIgICAgICAgICAgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAyKQotCS8vICNkZWZpbmUgUENJX0QzaG90ICAgICAgICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgMykKLQkvLyAjZGVmaW5lIFBDSV9EM2NvbGQgICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDQpCi0JLy8gI2RlZmluZSBQQ0lfVU5LTk9XTiAgICAgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSA1KQotCS8vICNkZWZpbmUgUENJX1BPV0VSX0VSUk9SICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgLTEpCi0JcmV0dmFsID0gcGNpX3NldF9wb3dlcl9zdGF0ZShwY2lfZGV2LCBQQ0lfRDApOwotCi0JLy8gcmVzdG9yZSB0aGUgc2F2ZWQgc3RhdGUgb2YgYSBQQ0kgZGV2aWNlCi0JcGNpX3Jlc3RvcmVfc3RhdGUocGNpX2Rldik7Ci0KLQkvLyBpbml0aWFsaXplIGRldmljZSBiZWZvcmUgaXQncyB1c2VkIGJ5IGEgZHJpdmVyCi0JaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpKQotCXsKLQkJcHJpbnRrKCJwY2kgZW5hYmxlIGZhaWwhXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4NjBfcmVzdW1lKClcbiIpKTsKLQotCWlmIChuZXRfZGV2ID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJuZXRfZGV2ID09IE5VTEwhXG4iKSk7Ci0JfQotCWVsc2UKLQkJcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKLQotCWlmIChwQWQgIT0gTlVMTCkKLQl7Ci0JCS8qIHdlIGNhbiBub3QgdXNlIElGRl9VUCBiZWNhdXNlIHJhMCBkb3duIGJ1dCByYTEgdXAgKi8KLQkJLyogYW5kIDEgc3VzcGVuZC9yZXN1bWUgZnVuY3Rpb24gZm9yIDEgbW9kdWxlLCBub3QgZm9yIGVhY2ggaW50ZXJmYWNlICovCi0JCS8qIHNvIExpbnV4IHdpbGwgY2FsbCBzdXNwZW5kL3Jlc3VtZSBmdW5jdGlvbiBvbmNlICovCi0JCWlmIChWSVJUVUFMX0lGX05VTShwQWQpID4gMCkKLQkJewotCQkJLy8gbWFyayBkZXZpY2UgYXMgYXR0YWNoZWQgZnJvbSBzeXN0ZW0gYW5kIHJlc3RhcnQgaWYgbmVlZGVkCi0JCQluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldF9kZXYpOwotCi0JCQlpZiAocnQyOHh4X29wZW4oKFBORVRfREVWKW5ldF9kZXYpICE9IDApCi0JCQl7Ci0JCQkJLy8gb3BlbiBmYWlsCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBydDI4NjBfcmVzdW1lKClcbiIpKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQotCQkJLy8gaW5jcmVhc2UgTU9EVUxFIHVzZSBjb3VudAotCQkJUlRfTU9EX0lOQ19VU0VfQ09VTlQoKTsKLQotCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKLQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKLQotCQkJbmV0aWZfc3RhcnRfcXVldWUobmV0X2Rldik7Ci0JCQluZXRpZl9jYXJyaWVyX29uKG5ldF9kZXYpOwotCQkJbmV0aWZfd2FrZV9xdWV1ZShuZXRfZGV2KTsKLQkJfQotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODYwX3Jlc3VtZSgpXG4iKSk7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLy8gQ09ORklHX1BNIC8vCi0KLQotc3RhdGljIElOVCBfX2luaXQgcnQyODYwX2luaXRfbW9kdWxlKFZPSUQpCi17Ci0JcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnJ0Mjg2MF9kcml2ZXIpOwotfQotCi0KLS8vCi0vLyBEcml2ZXIgbW9kdWxlIHVubG9hZCBmdW5jdGlvbgotLy8KLXN0YXRpYyBWT0lEIF9fZXhpdCBydDI4NjBfY2xlYW51cF9tb2R1bGUoVk9JRCkKLXsKLSAgICBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnJ0Mjg2MF9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChydDI4NjBfaW5pdF9tb2R1bGUpOwotbW9kdWxlX2V4aXQocnQyODYwX2NsZWFudXBfbW9kdWxlKTsKLQotCi1zdGF0aWMgSU5UIF9fZGV2aW5pdCBydDI4NjBfaW5pdF9vbmUgKAotICAgIElOICBzdHJ1Y3QgcGNpX2RldiAgICAgICAgICAgICAgKnBjaV9kZXYsCi0gICAgSU4gIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICAqZW50KQotewotICAgIElOVCByYzsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODYwX2luaXRfb25lXG4iKSk7Ci0KLSAgICAvLyB3YWtlIHVwIGFuZCBlbmFibGUgZGV2aWNlCi0gICAgaWYgKHBjaV9lbmFibGVfZGV2aWNlIChwY2lfZGV2KSkKLSAgICB7Ci0gICAgICAgIHJjID0gLUVJTzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmMgPSBydDI4NjBfcHJvYmUocGNpX2RldiwgZW50KTsKLSAgICB9Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IHJ0Mjg2MF9pbml0X29uZVxuIikpOwotICAgIHJldHVybiByYzsKLX0KLQotCi1zdGF0aWMgVk9JRCBfX2RldmV4aXQgcnQyODYwX3JlbW92ZV9vbmUoCi0gICAgSU4gIHN0cnVjdCBwY2lfZGV2ICAqcGNpX2RldikKLXsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAgICpuZXRfZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOwotICAgIFJUTVBfQURBUFRFUiAgICAgICAgKnBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IHJ0Mjg2MF9yZW1vdmVfb25lXG4iKSk7Ci0KLQlpZiAocEFkICE9IE5VTEwpCi0JewotCQkvLyBVbnJlZ2lzdGVyIG5ldHdvcmsgZGV2aWNlCi0JCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldF9kZXYpOwotCi0JCS8vIFVubWFwIENTUiBiYXNlIGFkZHJlc3MKLQkJaW91bm1hcCgoY2hhciAqKShuZXRfZGV2LT5iYXNlX2FkZHIpKTsKLQotCQlSVE1QRnJlZUFkYXB0ZXIocEFkKTsKLQotCQkvLyByZWxlYXNlIG1lbW9yeSByZWdpb24KLQkJcmVsZWFzZV9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCAwKSwgcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2LCAwKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIFVucmVnaXN0ZXIgbmV0d29yayBkZXZpY2UKLQkJdW5yZWdpc3Rlcl9uZXRkZXYobmV0X2Rldik7Ci0KLQkJLy8gVW5tYXAgQ1NSIGJhc2UgYWRkcmVzcwotCQlpb3VubWFwKChjaGFyICopKG5ldF9kZXYtPmJhc2VfYWRkcikpOwotCi0JCS8vIHJlbGVhc2UgbWVtb3J5IHJlZ2lvbgotCQlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApLCBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDApKTsKLQl9Ci0KLQkvLyBGcmVlIHByZS1hbGxvY2F0ZWQgbmV0X2RldmljZSBtZW1vcnkKLQlmcmVlX25ldGRldihuZXRfZGV2KTsKLX0KLQotLy8KLS8vIFBDSSBkZXZpY2UgcHJvYmUgJiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgotLy8KLXN0YXRpYyBJTlQgX19kZXZpbml0ICAgcnQyODYwX3Byb2JlKAotICAgIElOICBzdHJ1Y3QgcGNpX2RldiAgICAgICAgICAgICAgKnBjaV9kZXYsCi0gICAgSU4gIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICAqZW50KQotewotCVBSVE1QX0FEQVBURVIgcEFkOwotICAgIElOVCBydiA9IDA7Ci0KLSAgICBydiA9IChJTlQpcnQyOHh4X3Byb2JlKCh2b2lkICopcGNpX2RldiwgKHZvaWQgKillbnQsIDAsICZwQWQpOwotCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSk7Ci0JcmV0dXJuIHJ2OwotfQotCi0KLXZvaWQgaW5pdF90aHJlYWRfdGFzayhJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0KLQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0JdGFza2xldF9pbml0KCZwT2JqLT5yeF9kb25lX3Rhc2ssIHJ4X2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPm1nbXRfZG1hX2RvbmVfdGFzaywgbWdtdF9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOwotCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMwX2RtYV9kb25lX3Rhc2ssIGFjMF9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOwotCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2ssIGFjMV9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOwotCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2ssIGFjMl9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOwotCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2ssIGFjM19kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOwotCXRhc2tsZXRfaW5pdCgmcE9iai0+aGNjYV9kbWFfZG9uZV90YXNrLCBoY2NhX2RtYV9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7Ci0JdGFza2xldF9pbml0KCZwT2JqLT50YnR0X3Rhc2ssIHRidHRfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPmZpZm9fc3RhdGlzdGljX2Z1bGxfdGFzaywgZmlmb19zdGF0aXN0aWNfZnVsbF90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOwotfQotCi12b2lkIGtpbGxfdGhyZWFkX3Rhc2soSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JUE9TX0NPT0tJRSBwT2JqOwotCi0JcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCXRhc2tsZXRfa2lsbCgmcE9iai0+cnhfZG9uZV90YXNrKTsKLQl0YXNrbGV0X2tpbGwoJnBPYmotPm1nbXRfZG1hX2RvbmVfdGFzayk7Ci0JdGFza2xldF9raWxsKCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzayk7Ci0JdGFza2xldF9raWxsKCZwT2JqLT5hYzFfZG1hX2RvbmVfdGFzayk7Ci0JdGFza2xldF9raWxsKCZwT2JqLT5hYzJfZG1hX2RvbmVfdGFzayk7Ci0JdGFza2xldF9raWxsKCZwT2JqLT5hYzNfZG1hX2RvbmVfdGFzayk7Ci0JdGFza2xldF9raWxsKCZwT2JqLT5oY2NhX2RtYV9kb25lX3Rhc2spOwotCXRhc2tsZXRfa2lsbCgmcE9iai0+dGJ0dF90YXNrKTsKLQl0YXNrbGV0X2tpbGwoJnBPYmotPmZpZm9fc3RhdGlzdGljX2Z1bGxfdGFzayk7Ci19Ci0KLQotc3RhdGljIHZvaWQgcnQyODYwX2ludF9lbmFibGUoUFJUTVBfQURBUFRFUiBwQWQsIHVuc2lnbmVkIGludCBtb2RlKQotewotCXUzMiByZWdWYWx1ZTsKLQotCXBBZC0+aW50X2Rpc2FibGVfbWFzayAmPSB+KG1vZGUpOwotCXJlZ1ZhbHVlID0gcEFkLT5pbnRfZW5hYmxlX3JlZyAmIH4ocEFkLT5pbnRfZGlzYWJsZV9tYXNrKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfTUFTS19DU1IsIHJlZ1ZhbHVlKTsgICAgIC8vIDE6ZW5hYmxlCi0KLQlpZiAocmVnVmFsdWUgIT0gMCkKLQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSk7Ci19Ci0KLQotc3RhdGljIHZvaWQgcnQyODYwX2ludF9kaXNhYmxlKFBSVE1QX0FEQVBURVIgcEFkLCB1bnNpZ25lZCBpbnQgbW9kZSkKLXsKLQl1MzIgcmVnVmFsdWU7Ci0KLQlwQWQtPmludF9kaXNhYmxlX21hc2sgfD0gbW9kZTsKLQlyZWdWYWx1ZSA9IAlwQWQtPmludF9lbmFibGVfcmVnICYgfihwQWQtPmludF9kaXNhYmxlX21hc2spOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9NQVNLX0NTUiwgcmVnVmFsdWUpOyAgICAgLy8gMDogZGlzYWJsZQotCi0JaWYgKHJlZ1ZhbHVlID09IDApCi0JewotCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgbWdtdF9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7Ci0gICAgSU5UX1NPVVJDRV9DU1JfU1RSVUMJSW50U291cmNlOwotCVBPU19DT09LSUUgcE9iajsKLQotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JCXJldHVybjsKLQotICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQlJbnRTb3VyY2Uud29yZCA9IDA7Ci0JSW50U291cmNlLmZpZWxkLk1nbXREbWFEb25lID0gMTsKLQlwQWQtPmludF9wZW5kaW5nICY9IH5JTlRfTUdNVF9ETFk7Ci0KLQlSVE1QSGFuZGxlTWdtdFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCk7Ci0KLQkvLyBpZiB5b3UgdXNlIFJUTVBfU0VNX0xPQ0ssIHNvbWV0aW1lcyBrZXJuZWwgd2lsbCBoYW5nIHVwLCBubyBhbnkKLQkvLyBidWcgcmVwb3J0IG91dHB1dAotCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkvKgotCSAqIGRvdWJsZSBjaGVjayB0byBhdm9pZCBsb3NlIG9mIGludGVycnVwdHMKLQkgKi8KLQlpZiAocEFkLT5pbnRfcGVuZGluZyAmIElOVF9NR01UX0RMWSkKLQl7Ci0JCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPm1nbXRfZG1hX2RvbmVfdGFzayk7Ci0JCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogZW5hYmxlIFR4RGF0YUludCBhZ2FpbiAqLwotCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgSU5UX01HTVRfRExZKTsKLQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgcnhfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7Ci0JQk9PTEVBTgliUmVzY2hlZHVsZSA9IDA7Ci0JUE9TX0NPT0tJRSBwT2JqOwotCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQkJcmV0dXJuOwotCi0gICAgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCXBBZC0+aW50X3BlbmRpbmcgJj0gfihJTlRfUlgpOwotCi0JYlJlc2NoZWR1bGUgPSBTVEFSeERvbmVJbnRlcnJ1cHRIYW5kbGUocEFkLCAwKTsKLQotCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkvKgotCSAqIGRvdWJsZSBjaGVjayB0byBhdm9pZCByb3R0aW5nIHBhY2tldAotCSAqLwotCWlmIChwQWQtPmludF9wZW5kaW5nICYgSU5UX1JYIHx8IGJSZXNjaGVkdWxlKQotCXsKLQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+cnhfZG9uZV90YXNrKTsKLQkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBlbmFibGUgUnhJTlQgYWdhaW4gKi8KLQlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9SWCk7Ci0JUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0KLX0KLQotdm9pZCBmaWZvX3N0YXRpc3RpY19mdWxsX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGF0YTsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0KLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCQlyZXR1cm47Ci0KLSAgICBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0JcEFkLT5pbnRfcGVuZGluZyAmPSB+KEZpZm9TdGFGdWxsSW50KTsKLQlOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMocEFkKTsKLQotCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkvKgotCSAqIGRvdWJsZSBjaGVjayB0byBhdm9pZCByb3R0aW5nIHBhY2tldAotCSAqLwotCWlmIChwQWQtPmludF9wZW5kaW5nICYgRmlmb1N0YUZ1bGxJbnQpCi0JewotCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5maWZvX3N0YXRpc3RpY19mdWxsX3Rhc2spOwotCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGVuYWJsZSBSeElOVCBhZ2FpbiAqLwotCi0JcnQyODYwX2ludF9lbmFibGUocEFkLCBGaWZvU3RhRnVsbEludCk7Ci0JUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0KLX0KLQotc3RhdGljIHZvaWQgaGNjYV9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7Ci0gICAgSU5UX1NPVVJDRV9DU1JfU1RSVUMJSW50U291cmNlOwotCVBPU19DT09LSUUgcE9iajsKLQotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JCXJldHVybjsKLQotICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQotCUludFNvdXJjZS53b3JkID0gMDsKLQlJbnRTb3VyY2UuZmllbGQuSGNjYURtYURvbmUgPSAxOwotCXBBZC0+aW50X3BlbmRpbmcgJj0gfklOVF9IQ0NBX0RMWTsKLQotCVJUTVBIYW5kbGVUeFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCwgSW50U291cmNlKTsKLQotCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkvKgotCSAqIGRvdWJsZSBjaGVjayB0byBhdm9pZCBsb3NlIG9mIGludGVycnVwdHMKLQkgKi8KLQlpZiAocEFkLT5pbnRfcGVuZGluZyAmIElOVF9IQ0NBX0RMWSkKLQl7Ci0JCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmhjY2FfZG1hX2RvbmVfdGFzayk7Ci0JCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogZW5hYmxlIFR4RGF0YUludCBhZ2FpbiAqLwotCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgSU5UX0hDQ0FfRExZKTsKLQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgYWMzX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGF0YTsKLSAgICBJTlRfU09VUkNFX0NTUl9TVFJVQwlJbnRTb3VyY2U7Ci0JUE9TX0NPT0tJRSBwT2JqOwotCUJPT0xFQU4gYlJlc2NoZWR1bGUgPSAwOwotCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQkJcmV0dXJuOwotCi0gICAgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCUludFNvdXJjZS53b3JkID0gMDsKLQlJbnRTb3VyY2UuZmllbGQuQWMzRG1hRG9uZSA9IDE7Ci0JcEFkLT5pbnRfcGVuZGluZyAmPSB+SU5UX0FDM19ETFk7Ci0KLQliUmVzY2hlZHVsZSA9IFJUTVBIYW5kbGVUeFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCwgSW50U291cmNlKTsKLQotCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkvKgotCSAqIGRvdWJsZSBjaGVjayB0byBhdm9pZCBsb3NlIG9mIGludGVycnVwdHMKLQkgKi8KLQlpZiAoKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfQUMzX0RMWSkgfHwgYlJlc2NoZWR1bGUpCi0JewotCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzNfZG1hX2RvbmVfdGFzayk7Ci0JCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogZW5hYmxlIFR4RGF0YUludCBhZ2FpbiAqLwotCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgSU5UX0FDM19ETFkpOwotCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBhYzJfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOwotICAgIElOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0JQk9PTEVBTiBiUmVzY2hlZHVsZSA9IDA7Ci0KLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCQlyZXR1cm47Ci0KLSAgICBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0JSW50U291cmNlLndvcmQgPSAwOwotCUludFNvdXJjZS5maWVsZC5BYzJEbWFEb25lID0gMTsKLQlwQWQtPmludF9wZW5kaW5nICY9IH5JTlRfQUMyX0RMWTsKLQotCWJSZXNjaGVkdWxlID0gUlRNUEhhbmRsZVR4UmluZ0RtYURvbmVJbnRlcnJ1cHQocEFkLCBJbnRTb3VyY2UpOwotCi0JUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCi0JLyoKLQkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCi0JICovCi0JaWYgKChwQWQtPmludF9wZW5kaW5nICYgSU5UX0FDMl9ETFkpIHx8IGJSZXNjaGVkdWxlKQotCXsKLQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2spOwotCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KLQlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9BQzJfRExZKTsKLQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgYWMxX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGF0YTsKLSAgICBJTlRfU09VUkNFX0NTUl9TVFJVQwlJbnRTb3VyY2U7Ci0JUE9TX0NPT0tJRSBwT2JqOwotCUJPT0xFQU4gYlJlc2NoZWR1bGUgPSAwOwotCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQkJcmV0dXJuOwotCi0gICAgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCUludFNvdXJjZS53b3JkID0gMDsKLQlJbnRTb3VyY2UuZmllbGQuQWMxRG1hRG9uZSA9IDE7Ci0JcEFkLT5pbnRfcGVuZGluZyAmPSB+SU5UX0FDMV9ETFk7Ci0KLQliUmVzY2hlZHVsZSA9IFJUTVBIYW5kbGVUeFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCwgSW50U291cmNlKTsKLQotCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkvKgotCSAqIGRvdWJsZSBjaGVjayB0byBhdm9pZCBsb3NlIG9mIGludGVycnVwdHMKLQkgKi8KLQlpZiAoKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfQUMxX0RMWSkgfHwgYlJlc2NoZWR1bGUpCi0JewotCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzFfZG1hX2RvbmVfdGFzayk7Ci0JCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogZW5hYmxlIFR4RGF0YUludCBhZ2FpbiAqLwotCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgSU5UX0FDMV9ETFkpOwotCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBhYzBfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOwotICAgIElOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0JQk9PTEVBTiBiUmVzY2hlZHVsZSA9IDA7Ci0KLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCQlyZXR1cm47Ci0KLSAgICBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0JSW50U291cmNlLndvcmQgPSAwOwotCUludFNvdXJjZS5maWVsZC5BYzBEbWFEb25lID0gMTsKLQlwQWQtPmludF9wZW5kaW5nICY9IH5JTlRfQUMwX0RMWTsKLQotCWJSZXNjaGVkdWxlID0gUlRNUEhhbmRsZVR4UmluZ0RtYURvbmVJbnRlcnJ1cHQocEFkLCBJbnRTb3VyY2UpOwotCi0JUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCS8qCi0JICogZG91YmxlIGNoZWNrIHRvIGF2b2lkIGxvc2Ugb2YgaW50ZXJydXB0cwotCSAqLwotCWlmICgocEFkLT5pbnRfcGVuZGluZyAmIElOVF9BQzBfRExZKSB8fCBiUmVzY2hlZHVsZSkKLQl7Ci0JCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrKTsKLQkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBlbmFibGUgVHhEYXRhSW50IGFnYWluICovCi0JcnQyODYwX2ludF9lbmFibGUocEFkLCBJTlRfQUMwX0RMWSk7Ci0JUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci19Ci0KLQotaW50IHByaW50X2ludF9jb3VudDsKLQotSVJRX0hBTkRMRV9UWVBFCi1ydDI4NjBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaW5zdGFuY2U7Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSBuZXRfZGV2LT5tbF9wcml2OwotCUlOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0JQk9PTEVBTgliT2xkVmFsdWU7Ci0KLQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0KLQkvKiBOb3RlIDAzMzEyMDA4OiB3ZSBjYW4gbm90IHJldHVybiBoZXJlIGJlZm9yZQotCQlSVE1QX0lPX1JFQUQzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCAmSW50U291cmNlLndvcmQpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfU09VUkNFX0NTUiwgSW50U291cmNlLndvcmQpOwotCQlPciBrZXJuZWwgd2lsbCBwYW5pYyBhZnRlciBpZmNvbmZpZyByYTAgZG93biBzb21ldGltZXMgKi8KLQotCi0JLy8KLQkvLyBJbml0YWwgdGhlIEludGVycnVwdCBzb3VyY2UuCi0JLy8KLQlJbnRTb3VyY2Uud29yZCA9IDB4MDAwMDAwMDBMOwotLy8JTWN1SW50U291cmNlLndvcmQgPSAweDAwMDAwMDAwTDsKLQotCS8vCi0JLy8gR2V0IHRoZSBpbnRlcnJ1cHQgc291cmNlcyAmIHNhdmVkIHRvIGxvY2FsIHZhcmlhYmxlCi0JLy8KLQkvL1JUTVBfSU9fUkVBRDMyKHBBZCwgd2hlcmUsICZNY3VJbnRTb3VyY2Uud29yZCk7Ci0JLy9SVE1QX0lPX1dSSVRFMzIocEFkLCAsIE1jdUludFNvdXJjZS53b3JkKTsKLQotCS8vCi0JLy8gRmxhZyBmT1BfU1RBVFVTX0RPWkUgT24sIG1lYW5zIEFTSUMgcHV0IHRvIHNsZWVwLCBlbGFzZSBtZWFucyBBU0lDSyBXYWtlVXAKLQkvLyBBbmQgYXQgdGhlIHNhbWUgdGltZSwgY2xvY2sgbWF5YmUgdHVybmVkIG9mZiB0aGF0IHNheSB0aGVyZSBpcyBubyBETUEgc2VydmljZS4KLQkvLyB3aGVuIEFTSUMgZ2V0IHRvIHNsZWVwLgotCS8vIFRvIHByZXZlbnQgc3lzdGVtIGhhbmcgb24gcG93ZXIgc2F2aW5nLgotCS8vIFdlIG5lZWQgdG8gY2hlY2sgaXQgYmVmb3JlIGhhbmRsZSB0aGUgSU5UX1NPVVJDRV9DU1IsIEFTSUMgbXVzdCBiZSB3YWtlIHVwLgotCS8vCi0JLy8gUlQyNjYxID0+IHdoZW4gQVNJQyBpcyBzbGVlcGluZywgTUFDIHJlZ2lzdGVyIGNhbm5vdCBiZSByZWFkIGFuZCB3cml0dGVuLgotCS8vIFJUMjg2MCA9PiB3aGVuIEFTSUMgaXMgc2xlZXBpbmcsIE1BQyByZWdpc3RlciBjYW4gYmUgcmVhZCBhbmQgd3JpdHRlbi4KLQotCWJPbGRWYWx1ZSA9IHBBZC0+YlBDSWNsa09mZjsKLQlwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgSU5UX1NPVVJDRV9DU1IsICZJbnRTb3VyY2Uud29yZCk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCBJbnRTb3VyY2Uud29yZCk7IC8vIHdyaXRlIDEgdG8gY2xlYXIKLQl9Ci0JcEFkLT5iUENJY2xrT2ZmID0gYk9sZFZhbHVlOwotCi0JLy8gRG8gbm90aGluZyBpZiBSZXNldCBpbiBwcm9ncmVzcwotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpIHx8Ci0JCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkKLQl7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLQkvLwotCS8vIEhhbmRsZSBpbnRlcnJ1cHQsIHdhbGsgdGhyb3VnaCBhbGwgYml0cwotCS8vIFNob3VsZCBzdGFydCBmcm9tIGhpZ2hlc3QgcHJpb3JpdHkgaW50ZXJydXB0Ci0JLy8gVGhlIHByaW9yaXR5IGNhbiBiZSBhZGp1c3QgYnkgYWx0ZXJpbmcgcHJvY2Vzc2luZyBpZiBzdGF0ZW1lbnQKLQkvLwotCi0JLy8gSWYgcmVxdWlyZWQgc3BpbmxvY2ssIGVhY2ggaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBoYXMgdG8gYWNxdWlyZQotCS8vIGFuZCByZWxlYXNlIGl0c2VsZi4KLQkvLwotCi0JLy8gRG8gbm90aGluZyBpZiBOSUMgZG9lc24ndCBleGlzdAotCWlmIChJbnRTb3VyY2Uud29yZCA9PSAweGZmZmZmZmZmKQotCXsKLQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCB8IGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7Ci0JCXByaW50aygic25vd3BpbiAtIEludFNvdXJjZS53b3JkID09IDB4ZmZmZmZmZmZcbiIpOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgVHhDb2hlcmVudCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIj4+PlR4Q29oZXJlbnQ8PDxcbiIpKTsKLQkJUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQocEFkKTsKLQl9Ci0KLQlpZiAoSW50U291cmNlLndvcmQgJiBSeENvaGVyZW50KQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPj4+UnhDb2hlcmVudDw8PFxuIikpOwotCQlSVE1QSGFuZGxlUnhDb2hlcmVudEludGVycnVwdChwQWQpOwotCX0KLQotCWlmIChJbnRTb3VyY2Uud29yZCAmIEZpZm9TdGFGdWxsSW50KQotCXsKLSNpZiAxCi0JCWlmICgocEFkLT5pbnRfZGlzYWJsZV9tYXNrICYgRmlmb1N0YUZ1bGxJbnQpID09IDApCi0JCXsKLQkJCS8qIG1hc2sgRmlmb1N0YUZ1bGxJbnQgKi8KLQkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIEZpZm9TdGFGdWxsSW50KTsKLQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmZpZm9fc3RhdGlzdGljX2Z1bGxfdGFzayk7Ci0JCX0KLQkJcEFkLT5pbnRfcGVuZGluZyB8PSBGaWZvU3RhRnVsbEludDsKLSNlbHNlCi0JCU5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycyhwQWQpOwotI2VuZGlmCi0JfQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgSU5UX01HTVRfRExZKQotCXsKLQkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfTUdNVF9ETFkpID09MCApCi0JCXsKLQkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9NR01UX0RMWSk7Ci0JCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2spOwotCQl9Ci0JCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX01HTVRfRExZIDsKLQl9Ci0KLQlpZiAoSW50U291cmNlLndvcmQgJiBJTlRfUlgpCi0JewotCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIElOVF9SWCkgPT0gMCkKLQkJewotCQkJLyogbWFzayBSeElOVCAqLwotCQkJcnQyODYwX2ludF9kaXNhYmxlKHBBZCwgSU5UX1JYKTsKLQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPnJ4X2RvbmVfdGFzayk7Ci0JCX0KLQkJcEFkLT5pbnRfcGVuZGluZyB8PSBJTlRfUlg7Ci0JfQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgSU5UX0hDQ0FfRExZKQotCXsKLQotCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIElOVF9IQ0NBX0RMWSkgPT0gMCkKLQkJewotCQkJLyogbWFzayBUeERhdGFJbnQgKi8KLQkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9IQ0NBX0RMWSk7Ci0JCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5oY2NhX2RtYV9kb25lX3Rhc2spOwotCQl9Ci0JCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX0hDQ0FfRExZOwotCX0KLQotCWlmIChJbnRTb3VyY2Uud29yZCAmIElOVF9BQzNfRExZKQotCXsKLQotCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIElOVF9BQzNfRExZKSA9PSAwKQotCQl7Ci0JCQkvKiBtYXNrIFR4RGF0YUludCAqLwotCQkJcnQyODYwX2ludF9kaXNhYmxlKHBBZCwgSU5UX0FDM19ETFkpOwotCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2spOwotCQl9Ci0JCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX0FDM19ETFk7Ci0JfQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgSU5UX0FDMl9ETFkpCi0JewotCi0JCWlmICgocEFkLT5pbnRfZGlzYWJsZV9tYXNrICYgSU5UX0FDMl9ETFkpID09IDApCi0JCXsKLQkJCS8qIG1hc2sgVHhEYXRhSW50ICovCi0JCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfQUMyX0RMWSk7Ci0JCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzJfZG1hX2RvbmVfdGFzayk7Ci0JCX0KLQkJcEFkLT5pbnRfcGVuZGluZyB8PSBJTlRfQUMyX0RMWTsKLQl9Ci0KLQlpZiAoSW50U291cmNlLndvcmQgJiBJTlRfQUMxX0RMWSkKLQl7Ci0KLQkJcEFkLT5pbnRfcGVuZGluZyB8PSBJTlRfQUMxX0RMWTsKLQotCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIElOVF9BQzFfRExZKSA9PSAwKQotCQl7Ci0JCQkvKiBtYXNrIFR4RGF0YUludCAqLwotCQkJcnQyODYwX2ludF9kaXNhYmxlKHBBZCwgSU5UX0FDMV9ETFkpOwotCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2spOwotCQl9Ci0KLQl9Ci0KLQlpZiAoSW50U291cmNlLndvcmQgJiBJTlRfQUMwX0RMWSkKLQl7Ci0JCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX0FDMF9ETFk7Ci0KLQkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfQUMwX0RMWSkgPT0gMCkKLQkJewotCQkJLyogbWFzayBUeERhdGFJbnQgKi8KLQkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9BQzBfRExZKTsKLQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrKTsKLQkJfQotCi0JfQotCi0gICAgaWYgKEludFNvdXJjZS53b3JkICYgUHJlVEJUVEludCkKLQl7Ci0JCVJUTVBIYW5kbGVQcmVUQlRUSW50ZXJydXB0KHBBZCk7Ci0JfQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgVEJUVEludCkKLQl7Ci0JCVJUTVBIYW5kbGVUQlRUSW50ZXJydXB0KHBBZCk7Ci0JfQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgQXV0b1dha2V1cEludCkKLQkJUlRNUEhhbmRsZVR3YWtldXBJbnRlcnJ1cHQocEFkKTsKLQotICAgIHJldHVybiAgSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgQ2hlY2sgdGhlIGNoaXBzZXQgdmVuZG9yL3Byb2R1Y3QgSUQuCi0KLUFyZ3VtZW50czoKLSAgICBfZGV2X3AJCQkJUG9pbnQgdG8gdGhlIFBDSSBvciBVU0IgZGV2aWNlCi0KLVJldHVybiBWYWx1ZToKLSAgICBUUlVFCQkJCUNoZWNrIG9rCi0JRkFMU0UJCQkJQ2hlY2sgZmFpbAotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTiBSVDI4WFhDaGlwc2V0Q2hlY2soCi0JSU4gdm9pZCAqX2Rldl9wKQotewotCS8qIGFsd2F5cyBUUlVFICovCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBJbml0IG5ldCBkZXZpY2Ugc3RydWN0dXJlLgotCi1Bcmd1bWVudHM6Ci0gICAgX2Rldl9wCQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQotICAgICpuZXRfZGV2CQkJUG9pbnQgdG8gdGhlIG5ldCBkZXZpY2UKLQkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKLQotUmV0dXJuIFZhbHVlOgotICAgIFRSVUUJCQkJSW5pdCBvawotCUZBTFNFCQkJCUluaXQgZmFpbAotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTiBSVDI4WFhOZXREZXZJbml0KAotCUlOIHZvaWQgCQkJCSpfZGV2X3AsCi0JSU4gc3RydWN0ICBuZXRfZGV2aWNlCSpuZXRfZGV2LAotCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSAoc3RydWN0IHBjaV9kZXYgKilfZGV2X3A7Ci0gICAgY29uc3QgQ0hBUgkqcHJpbnRfbmFtZTsKLSAgICBVTE9ORwljc3JfYWRkcjsKLQotCi0JcHJpbnRfbmFtZSA9IHBjaV9kZXYgPyBwY2lfbmFtZShwY2lfZGV2KSA6ICJydDI4NjAiOwotCi0JbmV0X2Rldi0+YmFzZV9hZGRyID0gMDsKLQluZXRfZGV2LT5pcnEgPSAwOwotCi0gICAgaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGNpX2RldiwgcHJpbnRfbmFtZSkpCi0gICAgICAgIGdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKLQotICAgIC8vIGludGVycnVwdCBJUlEgbnVtYmVyCi0gICAgbmV0X2Rldi0+aXJxID0gcGNpX2Rldi0+aXJxOwotCi0gICAgLy8gbWFwIHBoeXNpY2FsIGFkZHJlc3MgdG8gdmlydHVhbCBhZGRyZXNzIGZvciBhY2Nlc3NpbmcgcmVnaXN0ZXIKLSAgICBjc3JfYWRkciA9ICh1bnNpZ25lZCBsb25nKSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCAwKSwKLQkJCQkJCQkJCQlwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDApKTsKLQotICAgIGlmICghY3NyX2FkZHIpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKLQkJCQkoImlvcmVtYXAgZmFpbGVkIGZvciBkZXZpY2UgJXMsIHJlZ2lvbiAweCVsWCBAIDB4JWxYXG4iLAotCQkJCXByaW50X25hbWUsIChVTE9ORylwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDApLAotCQkJCShVTE9ORylwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCkpKTsKLSAgICAgICAgZ290byBlcnJfb3V0X2ZyZWVfcmVzOwotICAgIH0KLQotICAgIC8vIFNhdmUgQ1NSIHZpcnR1YWwgYWRkcmVzcyBhbmQgaXJxIHRvIGRldmljZSBzdHJ1Y3R1cmUKLSAgICBuZXRfZGV2LT5iYXNlX2FkZHIgPSBjc3JfYWRkcjsKLSAgICBwQWQtPkNTUkJhc2VBZGRyZXNzID0gKFBVQ0hBUiluZXRfZGV2LT5iYXNlX2FkZHI7Ci0KLSAgICAvLyBTZXQgRE1BIG1hc3RlcgotICAgIHBjaV9zZXRfbWFzdGVyKHBjaV9kZXYpOwotCi0gICAgbmV0X2Rldi0+cHJpdl9mbGFncyA9IElOVF9NQUlOOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6IGF0IDB4JWx4LCBWQSAweCVseCwgSVJRICVkLiBcbiIsCi0gICAgICAgIAluZXRfZGV2LT5uYW1lLCAoVUxPTkcpcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApLAotCQkJKFVMT05HKWNzcl9hZGRyLCBwY2lfZGV2LT5pcnEpKTsKLQlyZXR1cm4gVFJVRTsKLQotCi0JLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVSUk9SIEhBTkRMRSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWVycl9vdXRfZnJlZV9yZXM6Ci0gICAgcGNpX3JlbGVhc2VfcmVnaW9ucyhwY2lfZGV2KTsKLWVycl9vdXRfZnJlZV9uZXRkZXY6Ci0JLyogZnJlZSBuZXRkZXYgaW4gY2FsbGVyLCBub3QgaGVyZSAqLwotCXJldHVybiBGQUxTRTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEluaXQgbmV0IGRldmljZSBzdHJ1Y3R1cmUuCi0KLUFyZ3VtZW50czoKLSAgICBfZGV2X3AJCQkJUG9pbnQgdG8gdGhlIFBDSSBvciBVU0IgZGV2aWNlCi0JKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCi0KLVJldHVybiBWYWx1ZToKLSAgICBUUlVFCQkJCUNvbmZpZyBvawotCUZBTFNFCQkJCUNvbmZpZyBmYWlsCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1CT09MRUFOIFJUMjhYWFByb2JlUG9zdENvbmZpZygKLQlJTiB2b2lkIAkJCQkqX2Rldl9wLAotCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQsCi0JSU4gSU5UMzIJCQkJYXJnYykKLXsKLQkvKiBubyB1c2UgKi8KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIERpc2FibGUgRE1BLgotCi1Bcmd1bWVudHM6Ci0JKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCi0KLVJldHVybiBWYWx1ZToKLQlOb25lCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUMjhYWERNQURpc2FibGUoCi0JSU4gUlRNUF9BREFQVEVSIAkJKnBBZCkKLXsKLQlXUERNQV9HTE9fQ0ZHX1NUUlVDICAgICBHbG9DZmc7Ci0KLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKLQlHbG9DZmcud29yZCAmPSAweGZmMDsKLQlHbG9DZmcuZmllbGQuRW5UWFdyaXRlQmFja0RET05FID0xOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEVuYWJsZSBETUEuCi0KLUFyZ3VtZW50czoKLQkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlQyOFhYRE1BRW5hYmxlKAotCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQpCi17Ci0JV1BETUFfR0xPX0NGR19TVFJVQwlHbG9DZmc7Ci0JaW50IGkgPSAwOwotCi0JUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDQpOwotCWRvCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7Ci0JCWlmICgoR2xvQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKSAgJiYgKEdsb0NmZy5maWVsZC5SeERNQUJ1c3kgPT0gMCkpCi0JCQlicmVhazsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gIERNQUJ1c3lcbiIpKTsKLQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQkJaSsrOwotCX13aGlsZSAoIGkgPDIwMCk7Ci0KLQlSVE1QdXNlY0RlbGF5KDUwKTsKLQotCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPSAxOwotCUdsb0NmZy5maWVsZC5XUERNQUJ1cnN0U0laRSA9IDI7Ci0JR2xvQ2ZnLmZpZWxkLkVuYWJsZVJ4RE1BID0gMTsKLQlHbG9DZmcuZmllbGQuRW5hYmxlVHhETUEgPSAxOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IFdSSVRFIERNQSBvZmZzZXQgMHgyMDggPSAweCV4XG4iLCBHbG9DZmcud29yZCkpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKLQotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIFdyaXRlIEJlYWNvbiBidWZmZXIgdG8gQXNpYy4KLQotQXJndW1lbnRzOgotCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgotCi1SZXR1cm4gVmFsdWU6Ci0JTm9uZQotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVDI4eHhfVXBkYXRlQmVhY29uVG9Bc2ljKAotCUlOIFJUTVBfQURBUFRFUgkJKnBBZCwKLQlJTiBJTlQJCQkJYXBpZHgsCi0JSU4gVUxPTkcJCQlGcmFtZUxlbiwKLQlJTiBVTE9ORwkJCVVwZGF0ZVBvcykKLXsKLQlVTE9ORwkJCQlDYXBJbmZvUG9zID0gMDsKLQlVQ0hBUiAgCQkJKnB0ciwgKnB0cl91cGRhdGUsICpwdHJfY2FwaW5mbzsKLQlVSU5UICAJCQlpOwotCUJPT0xFQU4JCQliQmNuUmVxID0gRkFMU0U7Ci0JVUNIQVIJCQliY25faWR4ID0gMDsKLQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMoKSA6IE5vIHZhbGlkIEludGVyZmFjZSBiZSBmb3VuZC5cbiIsIF9fZnVuY19fKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoYkJjblJlcSA9PSBGQUxTRSkKLQl7Ci0JCS8qIHdoZW4gdGhlIHJhIGludGVyZmFjZSBpcyBkb3duLCBkbyBub3Qgc2VuZCBpdHMgYmVhY29uIGZyYW1lICovCi0JCS8qIGNsZWFyIGFsbCB6ZXJvICovCi0JCWZvcihpPTA7IGk8VFhXSV9TSVpFOyBpKz00KQotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYmNuX2lkeF0gKyBpLCAweDAwKTsKLQl9Ci0JZWxzZQotCXsKLQkJcHRyID0gKFBVQ0hBUikmcEFkLT5CZWFjb25UeFdJOwotCi0JCWZvciAoaT0wOyBpPFRYV0lfU0laRTsgaSs9NCkgIC8vIDE2LWJ5dGUgVFhXSSBmaWVsZAotCQl7Ci0JCQlVSU5UMzIgbG9uZ3B0ciA9ICAqcHRyICsgKCoocHRyKzEpPDw4KSArICgqKHB0cisyKTw8MTYpICsgKCoocHRyKzMpPDwyNCk7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIGksIGxvbmdwdHIpOwotCQkJcHRyICs9IDQ7Ci0JCX0KLQotCQkvLyBVcGRhdGUgQ2FwYWJpbGl0eUluZm8gaW4gQmVhY29uCi0JCWZvciAoaSA9IENhcEluZm9Qb3M7IGkgPCAoQ2FwSW5mb1BvcysyKTsgaSsrKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFOChwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgVFhXSV9TSVpFICsgaSwgKnB0cl9jYXBpbmZvKTsKLQkJCXB0cl9jYXBpbmZvICsrOwotCQl9Ci0KLQkJaWYgKEZyYW1lTGVuID4gVXBkYXRlUG9zKQotCQl7Ci0JCQlmb3IgKGk9IFVwZGF0ZVBvczsgaTwgKEZyYW1lTGVuKTsgaSsrKQotCQkJewotCQkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYmNuX2lkeF0gKyBUWFdJX1NJWkUgKyBpLCAqcHRyX3VwZGF0ZSk7Ci0JCQkJcHRyX3VwZGF0ZSArKzsKLQkJCX0KLQkJfQotCi0JfQotCi19Ci0KLVZPSUQgUlRNUEluaXRQQ0llTGlua0N0cmxWYWx1ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLX0KLQotVk9JRCBSVE1QRmluZEhvc3RQQ0lEZXYoCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCQlMZXZlbCA9IFJFU1RPUkVfSEFMVCA6IFJlc3RvcmUgUENJIGhvc3QgYW5kIFJhbGluayBQQ0llIExpbmsgQ29udHJvbCBmaWVsZCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4KLQkJTGV2ZWwgPSBPdGhlciBWYWx1ZSA6IFJlc3RvcmUgZnJvbSBkb3QxMSBwb3dlciBzYXZlIG9yIHJhZGlvIG9mZiBzdGF0dXMuIEFuZCBmb3JjZSBQQ0kgaG9zdCBMaW5rIENvbnRyb2wgZmllbGRzIHRvIDB4MQotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICAgVUNIQVIJCUxldmVsKQotewotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQotCUFyZ3VtZW50czoKLQkJTWF4IDogbGltaXQgSG9zdCBQQ0kgYW5kIFJhbGluayBQQ0llIGRldmljZSdzIExJTksgQ09OVFJPTCBmaWVsZCdzIHZhbHVlLgotCQlCZWNhdXNlIG5vdyBmcmVxdWVudGx5IHNldCBvdXIgZGV2aWNlIHRvIG1vZGUgMSBvciBtb2RlIDMgd2lsbCBjYXVzZSBwcm9ibGVtLgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QUENJZUxpbmtDdHJsU2V0dGluZygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiAJVVNIT1JUCQlNYXgpCi17Ci19Ci0KLVZPSUQgcnQyODYwX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCi17Ci0gICAgUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUilOVUxMOwotICAgIGlmIChuZXRfZGV2ID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJuZXRfZGV2ID09IE5VTEwhXG4iKSk7Ci0JfQotCWVsc2UKLQkJcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKLQotCWlmIChwQWQgIT0gTlVMTCkKLQl7Ci0JICAgIC8vIHN0b3AgaW50ZXJmYWNlCi0JCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldF9kZXYpOwotCQluZXRpZl9zdG9wX3F1ZXVlKG5ldF9kZXYpOwotCi0JCS8vIG1hcmsgZGV2aWNlIGFzIHJlbW92ZWQgZnJvbSBzeXN0ZW0gYW5kIHRoZXJlZm9yZSBubyBsb25nZXIgYXZhaWxhYmxlCi0JCW5ldGlmX2RldmljZV9kZXRhY2gobmV0X2Rldik7Ci0KLQkJLy8gbWFyayBoYWx0IGZsYWcKLQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7Ci0JCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7Ci0KLQkJLy8gdGFrZSBkb3duIHRoZSBkZXZpY2UKLQkJcnQyOHh4X2Nsb3NlKChQTkVUX0RFViluZXRfZGV2KTsKLQkJUlRfTU9EX0RFQ19VU0VfQ09VTlQoKTsKLQl9Ci0gICAgcmV0dXJuOwotfQotCi0vKgotICogaW52YWlsZCBvciB3cml0ZWJhY2sgY2FjaGUKLSAqIGFuZCBjb252ZXJ0IHZpcnR1YWwgYWRkcmVzcyB0byBwaHlzaWNhbCBhZGRyZXNzCi0gKi8KLWRtYV9hZGRyX3QgbGludXhfcGNpX21hcF9zaW5nbGUodm9pZCAqaGFuZGxlLCB2b2lkICpwdHIsIHNpemVfdCBzaXplLCBpbnQgc2RfaWR4LCBpbnQgZGlyZWN0aW9uKQotewotCVBSVE1QX0FEQVBURVIgcEFkOwotCVBPU19DT09LSUUgcE9iajsKLQotCS8qCi0JCS0tLS0tLSBQb3J0aW5nIEluZm9ybWF0aW9uIC0tLS0tLQotCQk+IEZvciBUeCBBbGxvYzoKLQkJCW1nbXQgcGFja2V0cyA9PiBzZF9pZHggPSAwCi0JCQlTd0lkeDogcEFkLT5NZ210UmluZy5UeENwdUlkeAotCQkJcFR4RCA6IHBBZC0+TWdtdFJpbmcuQ2VsbFtTd0lkeF0uQWxsb2NWYTsKLQotCQkJZGF0YSBwYWNrZXRzID0+IHNkX2lkeCA9IDEKLQkgCQlUeElkeCA6IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5UeENwdUlkeAotCSAJCVF1ZUlkeDogcFR4QmxrLT5RdWVJZHgKLQkgCQlwVHhEICA6IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5DZWxsW1R4SWR4XS5BbGxvY1ZhOwotCi0JIAk+IEZvciBSeCBBbGxvYzoKLQkgCQlzZF9pZHggPSAtMQotCSovCi0KLQlwQWQgPSAoUFJUTVBfQURBUFRFUiloYW5kbGU7Ci0JcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOwotCi0JaWYgKHNkX2lkeCA9PSAxKQotCXsKLQkJUFRYX0JMSwkJcFR4QmxrOwotCQlwVHhCbGsgPSAoUFRYX0JMSylwdHI7Ci0JCXJldHVybiBwY2lfbWFwX3NpbmdsZShwT2JqLT5wY2lfZGV2LCBwVHhCbGstPnBTcmNCdWZEYXRhLCBwVHhCbGstPlNyY0J1ZkxlbiwgZGlyZWN0aW9uKTsKLQl9Ci0JZWxzZQotCXsKLQkJcmV0dXJuIHBjaV9tYXBfc2luZ2xlKHBPYmotPnBjaV9kZXYsIHB0ciwgc2l6ZSwgZGlyZWN0aW9uKTsKLQl9Ci0KLX0KLQotdm9pZCBsaW51eF9wY2lfdW5tYXBfc2luZ2xlKHZvaWQgKmhhbmRsZSwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pCi17Ci0JUFJUTVBfQURBUFRFUiBwQWQ7Ci0JUE9TX0NPT0tJRSBwT2JqOwotCi0JcEFkPShQUlRNUF9BREFQVEVSKWhhbmRsZTsKLQlwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7Ci0KLQlwY2lfdW5tYXBfc2luZ2xlKHBPYmotPnBjaV9kZXYsIGRtYV9hZGRyLCBzaXplLCBkaXJlY3Rpb24pOwotCi19Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvS2NvbmZpZwppbmRleCBlZmUzOGUyLi5mOTk2MmI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9LY29uZmlnCkBAIC0xLDUgKzEsOCBAQAogY29uZmlnIFJUMjg2MAotCXRyaXN0YXRlICJSYWxpbmsgMjg2MCB3aXJlbGVzcyBzdXBwb3J0IgorCXRyaXN0YXRlICJSYWxpbmsgMjg2MC8zMDkwIHdpcmVsZXNzIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQQ0kgJiYgWDg2ICYmIFdMQU4KKwlzZWxlY3QgV0lSRUxFU1NfRVhUCisJc2VsZWN0IFdFWFRfUFJJVgogCS0tLWhlbHAtLS0KLQkgIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGRyaXZlciBmb3IgdGhlIFJhbGluayAyODYwIHdpcmVsZXNzIGNoaXAuCisJICBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBkcml2ZXIgZm9yIHRoZSBSYWxpbmsgMjg2MCBhbmQgMzA5MAorCSAgd2lyZWxlc3MgY2hpcHMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9NYWtlZmlsZQppbmRleCBjOWZlOTI1Li4yM2FlMDdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvTWFrZWZpbGUKQEAgLTIsMjYgKzIsMzMgQEAKIAogIyBUT0RPOiBhbGwgb2YgdGhlc2Ugc2hvdWxkIGJlIHJlbW92ZWQKIEVYVFJBX0NGTEFHUyArPSAtRExJTlVYIC1EQUdHUkVHQVRJT05fU1VQUE9SVCAtRFBJR0dZQkFDS19TVVBQT1JUIC1EV01NX1NVUFBPUlQKLUVYVFJBX0NGTEFHUyArPSAtRFJUMjg2MAorRVhUUkFfQ0ZMQUdTICs9IC1EUlRNUF9NQUNfUENJIC1EUlRNUF9QQ0lfU1VQUE9SVCAtRFJUMjg2MAorRVhUUkFfQ0ZMQUdTICs9IC1EUlRNUF9SRl9SV19TVVBQT1JUIC1EUlRNUF9FRlVTRV9TVVBQT1JUIC1EUlQzMHh4IC1EUlQzMDkwCiBFWFRSQV9DRkxBR1MgKz0gLUREQkcKIAogcnQyODYwc3RhLW9ianMgOj0JXAotCWNvbW1vbi9tZDUubwkJXAorCWNvbW1vbi9jcnlwdF9tZDUubwlcCisJY29tbW9uL2NyeXB0X3NoYTIubwlcCisJY29tbW9uL2NyeXB0X2htYWMubwlcCiAJY29tbW9uL21sbWUubwkJXAotCWNvbW1vbi9ydG1wX3dlcC5vCVwKKwljb21tb24vY21tX3dlcC5vCVwKIAljb21tb24vYWN0aW9uLm8JCVwKIAljb21tb24vY21tX2RhdGEubwlcCiAJY29tbW9uL3J0bXBfaW5pdC5vCVwKLQljb21tb24vcnRtcF90a2lwLm8JXAorCWNvbW1vbi9jbW1fdGtpcC5vCVwKKwljb21tb24vY21tX2Flcy5vCVwKIAljb21tb24vY21tX3N5bmMubwlcCiAJY29tbW9uL2VlcHJvbS5vCQlcCiAJY29tbW9uL2NtbV9zYW5pdHkubwlcCiAJY29tbW9uL2NtbV9pbmZvLm8JXAorCWNvbW1vbi9jbW1fY2ZnLm8JXAogCWNvbW1vbi9jbW1fd3BhLm8JXAogCWNvbW1vbi9kZnMubwkJXAogCWNvbW1vbi9zcGVjdHJ1bS5vCVwKKwljb21tb24vcnRtcF90aW1lci5vCVwKKwljb21tb24vcnRfY2hhbm5lbC5vCVwKKwljb21tb24vY21tX2FzaWMubwlcCiAJc3RhL2Fzc29jLm8JCVwKLQlzdGEvYWlyb25ldC5vCQlcCiAJc3RhL2F1dGgubwkJXAogCXN0YS9hdXRoX3JzcC5vCQlcCiAJc3RhL3N5bmMubwkJXApAQCAtMzAsMTAgKzM3LDE2IEBACiAJc3RhL2Nvbm5lY3QubwkJXAogCXN0YS93cGEubwkJXAogCXJ0X2xpbnV4Lm8JCVwKLQlydF9wcm9maWxlLm8JCVwKIAlydF9tYWluX2Rldi5vCQlcCiAJc3RhX2lvY3RsLm8JCVwKIAljb21tb24vYmFfYWN0aW9uLm8JXAotCWNvbW1vbi8yODYwX3J0bXBfaW5pdC5vCVwKLQkyODYwX21haW5fZGV2Lm8JCVwKLQljb21tb24vY21tX2RhdGFfMjg2MC5vCisJcGNpX21haW5fZGV2Lm8JCVwKKwlydF9wY2lfcmJ1cy5vCQlcCisJY29tbW9uL2NtbV9tYWNfcGNpLm8JXAorCWNvbW1vbi9jbW1fZGF0YV9wY2kubwlcCisJY29tbW9uL2VlX3Byb20ubwlcCisJY29tbW9uL3J0bXBfbWN1Lm8JXAorCWNvbW1vbi9lZV9lZnVzZS5vCVwKKwljaGlwcy9ydDMweHgubwkJXAorCWNvbW1vbi9ydF9yZi5vCQlcCisJY2hpcHMvcnQzMDkwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvVE9ETwppbmRleCA2MTU4ZGMyLi44ZTJmNmVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL1RPRE8KKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9UT0RPCkBAIC05LDcgKzksNiBAQAogCS0gY2hlY2twYXRjaC5wbCBjbGVhbgogCS0gc3BhcnNlIGNsZWFuCiAJLSBwb3J0IHRvIGluLWtlcm5lbCA4MDIxMSBzdGFjayBhbmQgY29tbW9uIHJ0MngwMCBpbmZyYXN0cnVjdHVyZQotCS0gcmVtb3ZlIHJlYWRpbmcgZnJvbSAvZXRjLyBjb25maWcgZmlsZXMKIAktIHJldmlldyBieSB0aGUgd2lyZWxlc3MgZGV2ZWxvcGVyIGNvbW11bml0eQogCiBQbGVhc2Ugc2VuZCBhbnkgcGF0Y2hlcyBvciBjb21wbGFpbnRzIGFib3V0IHRoaXMgZHJpdmVyIHRvIEdyZWcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvYWlyb25ldC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9haXJvbmV0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMDdiMTkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9haXJvbmV0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQlhaXJvbmV0LmgKLQotCUFic3RyYWN0OgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCQlXaGVuCQkJV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKLQlQYXVsIExpbgkwNC0wNi0xNQkJSW5pdGlhbAotKi8KLQotI2lmbmRlZglfX0FJUk9ORVRfSF9fCi0jZGVmaW5lCV9fQUlST05FVF9IX18KLQotLy8gTWVhc3VyZW1lbnQgVHlwZSBkZWZpbml0aW9uCi0jZGVmaW5lCU1TUk5fVFlQRV9VTlVTRUQJCQkJMAotI2RlZmluZQlNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUQkJMQotI2RlZmluZQlNU1JOX1RZUEVfTk9JU0VfSElTVF9SRVEJCTIKLSNkZWZpbmUJTVNSTl9UWVBFX0JFQUNPTl9SRVEJCQkzCi0jZGVmaW5lCU1TUk5fVFlQRV9GUkFNRV9SRVEJCQkJNAotCi0vLyBTY2FuIE1vZGUgaW4gQmVhY29uIFJlcXVlc3QKLSNkZWZpbmUJTVNSTl9TQ0FOX01PREVfUEFTU0lWRQkJCTAKLSNkZWZpbmUJTVNSTl9TQ0FOX01PREVfQUNUSVZFCQkJMQotI2RlZmluZQlNU1JOX1NDQU5fTU9ERV9CRUFDT05fVEFCTEUJCTIKLQotLy8gUEhZIHR5cGUgZGVmaW5pdGlvbiBmb3IgQWlyb25ldCBiZWFjb24gcmVwb3J0LCBDQ1ggMiB0YWJsZSAzNi05Ci0jZGVmaW5lCVBIWV9GSAkJCQkJCQkxCi0jZGVmaW5lCVBIWV9EU1MJCQkJCQkJMgotI2RlZmluZQlQSFlfVU5VU0VECQkJCQkJMwotI2RlZmluZQlQSFlfT0ZETQkJCQkJCTQKLSNkZWZpbmUJUEhZX0hSX0RTUwkJCQkJCTUKLSNkZWZpbmUJUEhZX0VSUAkJCQkJCQk2Ci0KLS8vIFJQSSB0YWJsZSBpbiBkQm0KLSNkZWZpbmUJUlBJXzAJCQkwCQkJLy8JUG93ZXIgPD0gLTg3Ci0jZGVmaW5lCVJQSV8xCQkJMQkJCS8vCS04NyA8IFBvd2VyIDw9IC04MgotI2RlZmluZQlSUElfMgkJCTIJCQkvLwktODIgPCBQb3dlciA8PSAtNzcKLSNkZWZpbmUJUlBJXzMJCQkzCQkJLy8JLTc3IDwgUG93ZXIgPD0gLTcyCi0jZGVmaW5lCVJQSV80CQkJNAkJCS8vCS03MiA8IFBvd2VyIDw9IC02NwotI2RlZmluZQlSUElfNQkJCTUJCQkvLwktNjcgPCBQb3dlciA8PSAtNjIKLSNkZWZpbmUJUlBJXzYJCQk2CQkJLy8JLTYyIDwgUG93ZXIgPD0gLTU3Ci0jZGVmaW5lCVJQSV83CQkJNwkJCS8vCS01NyA8IFBvd2VyCi0KLS8vIENpc2NvIEFpcm9uZXQgSUFQUCBkZWZpbmV0aW9ucwotI2RlZmluZQlBSVJPTkVUX0lBUFBfVFlQRQkJCQkJMHgzMgotI2RlZmluZQlBSVJPTkVUX0lBUFBfU1VCVFlQRV9SRVFVRVNUCQkweDAxCi0jZGVmaW5lCUFJUk9ORVRfSUFQUF9TVUJUWVBFX1JFUE9SVAkJCTB4ODEKLQotLy8gTWVhc3VyZW1lbnQgUmVxdWVzdCBkZXRhaWwgZm9ybWF0Ci10eXBlZGVmCXN0cnVjdAlfTUVBU1VSRU1FTlRfUkVRVUVTVAl7Ci0JVUNIQVIJQ2hhbm5lbDsKLQlVQ0hBUglTY2FuTW9kZTsJCQkvLyBVc2Ugb25seSBpbiBiZWFjb24gcmVxdWVzdCwgb3RoZXIgcmVxdWVzdHMgZGlkIG5vdCB1c2UgdGhpcyBmaWVsZAotCVVTSE9SVAlEdXJhdGlvbjsKLX0JTUVBU1VSRU1FTlRfUkVRVUVTVCwgKlBNRUFTVVJFTUVOVF9SRVFVRVNUOwotCi0vLyBCZWFjb24gTWVhc3VyZW1lbnQgUmVwb3J0Ci0vLyBBbGwgdGhlc2UgZmllbGQgbWlnaHQgY2hhbmdlIHRvIFVDSEFSLCBiZWNhdXNlIHdlIGRpZG4ndCBkbyBhbnl0aGluZyB0byB0aGVzZSByZXBvcnQuCi0vLyBXZSBjb3B5IGFsbCB0aGVzZSBiZWFjb25zIGFuZCByZXBvcnQgdG8gQ0NYIDIgQVAuCi10eXBlZGVmCXN0cnVjdAlfQkVBQ09OX1JFUE9SVAl7Ci0JVUNIQVIJQ2hhbm5lbDsKLQlVQ0hBUglTcGFyZTsKLQlVU0hPUlQJRHVyYXRpb247Ci0JVUNIQVIJUGh5VHlwZTsJCQkvLyBEZWZpbmlhdGlvbiBpcyBsaXN0ZWQgYWJvdmUgdGFibGUgMzYtOQotCVVDSEFSCVJ4UG93ZXI7Ci0JVUNIQVIJQlNTSURbNl07Ci0JVUNIQVIJUGFyZW50VFNGWzRdOwotCVVDSEFSCVRhcmdldFRTRls4XTsKLQlVU0hPUlQJQmVhY29uSW50ZXJ2YWw7Ci0JVVNIT1JUCUNhcGFiaWxpdHlJbmZvOwotfQlCRUFDT05fUkVQT1JULCAqUEJFQUNPTl9SRVBPUlQ7Ci0KLS8vIEZyYW1lIE1lYXN1cmVtZW50IFJlcG9ydCAoT3B0aW9uYWwpCi10eXBlZGVmCXN0cnVjdAlfRlJBTUVfUkVQT1JUCXsKLQlVQ0hBUglDaGFubmVsOwotCVVDSEFSCVNwYXJlOwotCVVTSE9SVAlEdXJhdGlvbjsKLQlVQ0hBUglUQTsKLQlVQ0hBUglCU1NJRFs2XTsKLQlVQ0hBUglSU1NJOwotCVVDSEFSCUNvdW50OwotfQlGUkFNRV9SRVBPUlQsICpQRlJBTUVfUkVQT1JUOwotCi0jcHJhZ21hIHBhY2soMSkKLS8vIENoYW5uZWwgTG9hZCBSZXBvcnQKLXR5cGVkZWYJc3RydWN0CV9DSEFOTkVMX0xPQURfUkVQT1JUCXsKLQlVQ0hBUglDaGFubmVsOwotCVVDSEFSCVNwYXJlOwotCVVTSE9SVAlEdXJhdGlvbjsKLQlVQ0hBUglDQ0FCdXN5OwotfQlDSEFOTkVMX0xPQURfUkVQT1JULCAqUENIQU5ORUxfTE9BRF9SRVBPUlQ7Ci0jcHJhZ21hIHBhY2soKQotCi0vLyBOb3NpZSBIaXN0b2dyYW0gUmVwb3J0Ci10eXBlZGVmCXN0cnVjdAlfTk9JU0VfSElTVF9SRVBPUlQJewotCVVDSEFSCUNoYW5uZWw7Ci0JVUNIQVIJU3BhcmU7Ci0JVVNIT1JUCUR1cmF0aW9uOwotCVVDSEFSCURlbnNpdHlbOF07Ci19CU5PSVNFX0hJU1RfUkVQT1JULCAqUE5PSVNFX0hJU1RfUkVQT1JUOwotCi0vLyBSYWRpbyBNYW5hZ2VtZW50IENhcGFiaWxpdHkgZWxlbWVudAotdHlwZWRlZglzdHJ1Y3QJX1JBRElPX01BTkFHRU1FTlRfQ0FQQUJJTElUWQl7Ci0JVUNIQVIJRWlkOwkJCQkvLyBUT0RPOiBXaHkgdGhlIEVpZCBpcyAxIGJ5dGUsIG5vdCBub3JtYWwgMiBieXRlcz8/PwotCVVDSEFSCUxlbmd0aDsKLQlVQ0hBUglBaXJvbmV0T3VpWzNdOwkJLy8gQUlyb25ldCBPVUkgKDAwIDQwIDk2KQotCVVDSEFSCVR5cGU7CQkJCS8vIFR5cGUgLyBWZXJzaW9uCi0JVVNIT1JUCVN0YXR1czsJCQkJLy8gc3dhcDE2IHJlcXVpcmVkCi19CVJBRElPX01BTkFHRU1FTlRfQ0FQQUJJTElUWSwgKlBSQURJT19NQU5BR0VNRU5UX0NBUEFCSUxJVFk7Ci0KLS8vIE1lYXN1cmVtZW50IE1vZGUgQml0IGRlZmluaXRpb24KLXR5cGVkZWYJc3RydWN0CV9NRUFTVVJFTUVOVF9NT0RFCXsKLQlVQ0hBUglSc3ZkOjQ7Ci0JVUNIQVIJUmVwb3J0OjE7Ci0JVUNIQVIJTm90VXNlZDoxOwotCVVDSEFSCUVuYWJsZToxOwotCVVDSEFSCVBhcmFsbGVsOjE7Ci19CU1FQVNVUkVNRU5UX01PREUsICpQTUVBU1VSRU1FTlRfTU9ERTsKLQotLy8gTWVhc3VyZW1lbnQgUmVxdWVzdCBlbGVtZW50LCBUaGlzIGlzIGxpdHRsZSBlbmRpYW4gbW9kZQotdHlwZWRlZglzdHJ1Y3QJX01FQVNVUkVNRU5UX1JFUVVFU1RfRUxFTUVOVAl7Ci0JVVNIT1JUCQkJCUVpZDsKLQlVU0hPUlQJCQkJTGVuZ3RoOwkJCQkvLyBzd2FwMTYgcmVxdWlyZWQKLQlVU0hPUlQJCQkJVG9rZW47CQkJCS8vIG5vbi16ZXJvIHVuaXF1ZSB0b2tlbgotCVVDSEFSCQkJCU1vZGU7CQkJCS8vIE1lYXN1cmVtZW50IE1vZGUKLQlVQ0hBUgkJCQlUeXBlOwkJCQkvLyBNZWFzdXJlbWVudCB0eXBlCi19CU1FQVNVUkVNRU5UX1JFUVVFU1RfRUxFTUVOVCwgKlBNRUFTVVJFTUVOVF9SRVFVRVNUX0VMRU1FTlQ7Ci0KLS8vIE1lYXN1cmVtZW50IFJlcG9ydCBlbGVtZW50LCBUaGlzIGlzIGxpdHRsZSBlbmRpYW4gbW9kZQotdHlwZWRlZglzdHJ1Y3QJX01FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UCXsKLQlVU0hPUlQJCQkJRWlkOwotCVVTSE9SVAkJCQlMZW5ndGg7CQkJCS8vIHN3YXAxNiByZXF1aXJlZAotCVVTSE9SVAkJCQlUb2tlbjsJCQkJLy8gbm9uLXplcm8gdW5pcXVlIHRva2VuCi0JVUNIQVIJCQkJTW9kZTsJCQkJLy8gTWVhc3VyZW1lbnQgTW9kZQotCVVDSEFSCQkJCVR5cGU7CQkJCS8vIE1lYXN1cmVtZW50IHR5cGUKLX0JTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQsICpQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQ7Ci0KLS8vIENpc2NvIEFpcm9uZXQgSUFQUCBGcmFtZSBIZWFkZXIsIE5ldHdvcmsgYnl0ZSBvcmRlciB1c2VkCi10eXBlZGVmCXN0cnVjdAlfQUlST05FVF9JQVBQX0hFQURFUiB7Ci0JVUNIQVIJQ2lzY29TbmFwSGVhZGVyWzhdOwkvLyA4IGJ5dGVzIENpc2NvIHNuYXAgaGVhZGVyCi0JVVNIT1JUCUxlbmd0aDsJCQkJLy8gSUFQUCBJRCAmIGxlbmd0aCwgcmVtZW1iZXIgdG8gc3dhcDE2IGluIExFIHN5c3RlbQotCVVDSEFSCVR5cGU7CQkJCS8vIElBUFAgdHlwZQotCVVDSEFSCVN1YlR5cGU7CQkJLy8gSUFQUCBzdWJ0eXBlCi0JVUNIQVIJREFbNl07CQkJCS8vIERlc3RpbmF0aW9uIE1BQyBhZGRyZXNzCi0JVUNIQVIJU0FbNl07CQkJCS8vIFNvdXJjZSBNQUMgYWRkcmVzcwotCVVTSE9SVAlUb2tlbjsJCQkJLy8gRGlhbG9nIHRva2VuLCBubyBuZWVkIHRvIHN3YXAxNiBzaW5jZSBpdCBpcyBmb3IgeW9rZW4gdXNhZ2Ugb25seQotfQlBSVJPTkVUX0lBUFBfSEVBREVSLCAqUEFJUk9ORVRfSUFQUF9IRUFERVI7Ci0KLS8vIFJhZGlvIE1lYXN1cmVtZW50IFJlcXVlc3QgZnJhbWUKLXR5cGVkZWYJc3RydWN0CV9BSVJPTkVUX1JNX1JFUVVFU1RfRlJBTUUJewotICAgIEFJUk9ORVRfSUFQUF9IRUFERVIJSUFQUDsJCQkvLyBDb21tb24gaGVhZGVyCi0JVUNIQVIJCQkJRGVsYXk7CQkJLy8gQWN0aXZhdGlvbiBEZWxheQotCVVDSEFSCQkJCU9mZnNldDsJCQkvLyBNZWFzdXJlbWVudCBvZmZzZXQKLX0JQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FLCAqUEFJUk9ORVRfUk1fUkVRVUVTVF9GUkFNRTsKLQotLy8gUmFkaW8gTWVhc3VyZW1lbnQgUmVwb3J0IGZyYW1lCi10eXBlZGVmCXN0cnVjdAlfQUlST05FVF9STV9SRVBPUlRfRlJBTUUJewotICAgIEFJUk9ORVRfSUFQUF9IRUFERVIJSUFQUDsJCQkvLyBDb21tb24gaGVhZGVyCi19CUFJUk9ORVRfUk1fUkVQT1JUX0ZSQU1FLCAqUEFJUk9ORVRfUk1fUkVQT1JUX0ZSQU1FOwotCi0vLyBTYXZlZCBlbGVtZW50IHJlcXVlc3QgYWN0aW9ucyB3aGljaCB3aWxsIHNhdmVkIGluIFN0YUNmZy4KLXR5cGVkZWYJc3RydWN0CV9STV9SRVFVRVNUX0FDVElPTgl7Ci0JTUVBU1VSRU1FTlRfUkVRVUVTVF9FTEVNRU5UCVJlcUVsZW07CQkvLyBTYXZlZCByZXF1ZXN0IGVsZW1lbnQKLQlNRUFTVVJFTUVOVF9SRVFVRVNUCQkJTWVhc3VyZW1lbnQ7CS8vIFNhdmVkIG1lYXN1cmVtZW50IHdpdGhpbiB0aGUgcmVxdWVzdCBlbGVtZW50Ci19CVJNX1JFUVVFU1RfQUNUSU9OLCAqUFJNX1JFUVVFU1RfQUNUSU9OOwotCi0vLyBDQ1ggYWRtaW5pc3RyYXRpb24gY29udHJvbAotdHlwZWRlZgl1bmlvbglfQ0NYX0NPTlRST0wJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJRW5hYmxlOjE7CQkJLy8gRW5hYmxlIENDWDIKLQkJVUlOVDMyCQlMZWFwRW5hYmxlOjE7CQkvLyBFbmFibGUgTEVBUCBhdCBDQ1gyCi0JCVVJTlQzMgkJUk1FbmFibGU6MTsJCQkvLyBSYWRpbyBNZWFzdXJlbWVudCBFbmFibGUKLQkJVUlOVDMyCQlEQ1JNRW5hYmxlOjE7CQkvLyBOb24gc2VydmluZyBjaGFubmVsIFJhZGlvIE1lYXN1cmVtZW50IGVuYWJsZQotCQlVSU5UMzIJCVFPU0VuYWJsZToxOwkJLy8gRW5hYmxlIFFPUyBmb3IgQ0NYIDIuMCBzdXBwb3J0Ci0JCVVJTlQzMgkJRmFzdFJvYW1FbmFibGU6MTsJLy8gRW5hYmxlIGZhc3Qgcm9hbWluZwotCQlVSU5UMzIJCVJzdmQ6MjsJCQkJLy8gTm90IHVzZWQKLQkJVUlOVDMyCQlkQm1Ub1JvYW06ODsJCS8vIHRoZSBjb25kaXRpb24gdG8gcm9hbSB3aGVuIHJlY2VpdmluZyBSc3NpIGxlc3MgdGhhbiB0aGlzIHZhbHVlLiBJdCdzIG5lZ2F0aXZlIHZhbHVlLgotCQlVSU5UMzIJCVR1TGltaXQ6MTY7CQkJLy8gTGltaXQgZm9yIGRpZmZlcmVudCBjaGFubmVsIHNjYW4KLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUNDWF9DT05UUk9MLCAqUENDWF9DT05UUk9MOwotCi0jZW5kaWYJLy8gX19BSVJPTkVUX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9hcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9hcC5oCmluZGV4IGZjZGIzNTguLjNmNzQ0YTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvYXAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2FwLmgKQEAgLTQwLDM5ICs0MCwyNyBAQAogI2lmbmRlZiBfX0FQX0hfXwogI2RlZmluZSBfX0FQX0hfXwogCi0vLyBhcF9tbG1lLmMKKy8qIGFwX3dwYS5jICovCit2b2lkIFdwYVN0YXRlTWFjaGluZUluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lICpTbSwgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKIAotI2lmZGVmIFJUMjg3MAotVk9JRCBCZWFjb25VcGRhdGVFeGVjKAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLSAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCisjaWZkZWYgUlRNUF9NQUNfVVNCCit2b2lkIEJlYWNvblVwZGF0ZUV4ZWModm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkgICAgICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSAgICAgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotVk9JRCBSVE1QU2V0UGlnZ3lCYWNrKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIEJPT0xFQU4JCQliUGlnZ3lCYWNrKTsKK3ZvaWQgUlRNUFNldFBpZ2d5QmFjayhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIEJPT0xFQU4gYlBpZ2d5QmFjayk7CiAKLS8vIGFwLmMKK3ZvaWQgTWFjVGFibGVSZXNldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIE1hY1RhYmxlUmVzZXQoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqTWFjVGFibGVJbnNlcnRFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgICB1OCAqcEFkZHIsCisJCQkJICAgICB1OCBhcGlkeCwgSU4gQk9PTEVBTiBDbGVhbkFsbCk7CiAKLU1BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVJbnNlcnRFbnRyeSgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIHBBZGRyLAotCUlOCVVDSEFSCQkJYXBpZHgsCi0JSU4gQk9PTEVBTglDbGVhbkFsbCk7CitCT09MRUFOIE1hY1RhYmxlRGVsZXRlRW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHUxNiB3Y2lkLCB1OCAqcEFkZHIpOwogCi1CT09MRUFOIE1hY1RhYmxlRGVsZXRlRW50cnkoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gVVNIT1JUIHdjaWQsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBwQWRkcik7CitzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpNYWNUYWJsZUxvb2t1cChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4ICpwQWRkcik7CiAKLU1BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVMb29rdXAoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBwQWRkcik7Ci0KLSNlbmRpZiAgLy8gX19BUF9IX18KLQorI2VuZGlmIC8qIF9fQVBfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvbWFjX3BjaS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL21hY19wY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzcwNGFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL21hY19wY2kuaApAQCAtMCwwICsxLDM1NSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKwltYWNfcGNpLmgKKworICAgIEFic3RyYWN0OgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpZm5kZWYgX19NQUNfUENJX0hfXworI2RlZmluZSBfX01BQ19QQ0lfSF9fCisKKyNpbmNsdWRlICIuLi9ydG1wX3R5cGUuaCIKKyNpbmNsdWRlICJydG1wX21hYy5oIgorI2luY2x1ZGUgInJ0bXBfcGh5LmgiCisjaW5jbHVkZSAiLi4vcnRtcF9pZmFjZS5oIgorI2luY2x1ZGUgIi4uL3J0bXBfZG90MTEuaCIKKworLyogKi8KKy8qIERldmljZSBJRCAmIFZlbmRvciBJRCByZWxhdGVkIGRlZmluaXRpb25zLCAqLworLyogTk9URTogeW91IHNob3VsZCBub3QgYWRkIHRoZSBuZXcgVmVuZG9ySUQvRGV2aWNlSUQgaGVyZSB1bmxlc3MgeW91IG5vdCBzdXJlIGl0IGJlbG9uZ3MgdG8gd2hhdCBjaGlwLiAqLworLyogKi8KKyNkZWZpbmUgTklDX1BDSV9WRU5ET1JfSUQJCTB4MTgxNAorI2RlZmluZSBQQ0lCVVNfSU5URUxfVkVORE9SCTB4ODA4NgorCisjaWYgIWRlZmluZWQoUENJX0NBUF9JRF9FWFApCisjZGVmaW5lIFBDSV9DQVBfSURfRVhQCQkJICAgIDB4MTAKKyNlbmRpZgorI2lmICFkZWZpbmVkKFBDSV9FWFBfTE5LQ1RMKQorI2RlZmluZSBQQ0lfRVhQX0xOS0NUTAkJCSAgICAweDEwCisjZW5kaWYKKyNpZiAhZGVmaW5lZChQQ0lfQ0xBU1NfQlJJREdFX1BDSSkKKyNkZWZpbmUgUENJX0NMQVNTX0JSSURHRV9QQ0kJCTB4MDYwNAorI2VuZGlmCisKKyNkZWZpbmUgVFhJTkZPX1NJWkUJCQkJCQkwCisjZGVmaW5lIFJUTVBfUEtUX1RBSUxfUEFERElORwkJCTAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgJMAorCisjZGVmaW5lIEFVWF9DVFJMICAgICAgICAgICAweDEwYworCisvKiAqLworLyogVFggZGVzY3JpcHRvciBmb3JtYXQsIFR4ICAgICByaW5nLCBNZ210IFJpbmcgKi8KKy8qICovCitzdHJ1Y3QgUEFDS0VEIHJ0X3R4ZCB7CisJLyogV29yZCAwICovCisJdTMyIFNEUHRyMDsKKwkvKiBXb3JkIDEgKi8KKwl1MzIgU0RMZW4xOjE0OworCXUzMiBMYXN0U2VjMToxOworCXUzMiBCdXJzdDoxOworCXUzMiBTRExlbjA6MTQ7CisJdTMyIExhc3RTZWMwOjE7CisJdTMyIERNQURPTkU6MTsKKwkvKldvcmQyICovCisJdTMyIFNEUHRyMTsKKwkvKldvcmQzICovCisJdTMyIHJzdjI6MjQ7CisJdTMyIFdJVjoxOwkJLyogV2lyZWxlc3MgSW5mbyBWYWxpZC4gMSBpZiBEcml2ZXIgYWxyZWFkeSBmaWxsIFdJLCAgbyBpZiBETUEgbmVlZHMgdG8gY29weSBXSSB0byBjb3JyZWN0cG9zaXRpb24gKi8KKwl1MzIgUVNFTDoyOwkJLyogc2VsZWN0IG9uLWNoaXAgRklGTyBJRCBmb3IgMm5kLXN0YWdlIG91dHB1dCBzY2hlZHVsZXIuMDpNR01ULCAxOkhDQ0EgMjpFRENBICovCisJdTMyIHJzdjoyOworCXUzMiBUQ086MTsJCS8qICovCisJdTMyIFVDTzoxOwkJLyogKi8KKwl1MzIgSUNPOjE7CQkvKiAqLworfTsKKworLyogKi8KKy8qIFJ4IGRlc2NyaXB0b3IgZm9ybWF0LCBSeCBSaW5nICovCisvKiAqLwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHJ0X3J4ZCB7CisJLyogV29yZCAwICovCisJdTMyIFNEUDA7CisJLyogV29yZCAxICovCisJdTMyIFNETDE6MTQ7CisJdTMyIFJzdjoyOworCXUzMiBTREwwOjE0OworCXUzMiBMUzA6MTsKKwl1MzIgRERPTkU6MTsKKwkvKiBXb3JkIDIgKi8KKwl1MzIgU0RQMTsKKwkvKiBXb3JkIDMgKi8KKwl1MzIgQkE6MTsKKwl1MzIgREFUQToxOworCXUzMiBOVUxMREFUQToxOworCXUzMiBGUkFHOjE7CisJdTMyIFUyTToxOwkJLyogMTogdGhpcyBSWCBmcmFtZSBpcyB1bmljYXN0IHRvIG1lICovCisJdTMyIE1jYXN0OjE7CQkvKiAxOiB0aGlzIGlzIGEgbXVsdGljYXN0IGZyYW1lICovCisJdTMyIEJjYXN0OjE7CQkvKiAxOiB0aGlzIGlzIGEgYnJvYWRjYXN0IGZyYW1lICovCisJdTMyIE15QnNzOjE7CQkvKiAxOiB0aGlzIGZyYW1lIGJlbG9uZ3MgdG8gdGhlIHNhbWUgQlNTSUQgKi8KKwl1MzIgQ3JjOjE7CQkvKiAxOiBDUkMgZXJyb3IgKi8KKwl1MzIgQ2lwaGVyRXJyOjI7CS8qIDA6IGRlY3J5cHRpb24gb2theSwgMTpJQ1YgZXJyb3IsIDI6TUlDIGVycm9yLCAzOktFWSBub3QgdmFsaWQgKi8KKwl1MzIgQU1TRFU6MTsJCS8qIHJ4IHdpdGggODAyLjMgaGVhZGVyLCBub3QgODAyLjExIGhlYWRlci4gKi8KKwl1MzIgSFRDOjE7CisJdTMyIFJTU0k6MTsKKwl1MzIgTDJQQUQ6MTsKKwl1MzIgQU1QRFU6MTsKKwl1MzIgRGVjcnlwdGVkOjE7CS8qIHRoaXMgZnJhbWUgaXMgYmVpbmcgZGVjcnlwdGVkLiAqLworCXUzMiBQbGNwU2lnbmFsOjE7CS8qIFRvIGJlIG1vdmVkICovCisJdTMyIFBsY3BSc3NpbDoxOwkvKiBUbyBiZSBtb3ZlZCAqLworCXUzMiBSc3YxOjEzOworfSBSVDI4WFhfUlhEX1NUUlVDLCAqUFJUMjhYWF9SWERfU1RSVUM7CisKK3R5cGVkZWYgdW5pb24gX1RYX0FUVEVOVUFUSU9OX0NUUkxfU1RSVUMgeworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGxvbmcgUkZfSVNPTEFUSU9OX0VOQUJMRToxOworCQl1bnNpZ25lZCBsb25nIFJlc2VydmUyOjc7CisJCXVuc2lnbmVkIGxvbmcgUENJRV9QSFlfVFhfQVRURU5fVkFMVUU6MzsKKwkJdW5zaWduZWQgbG9uZyBQQ0lFX1BIWV9UWF9BVFRFTl9FTjoxOworCQl1bnNpZ25lZCBsb25nIFJlc2VydmUxOjIwOworCX0gZmllbGQ7CisKKwl1bnNpZ25lZCBsb25nIHdvcmQ7Cit9IFRYX0FUVEVOVUFUSU9OX0NUUkxfU1RSVUMsICpQVFhfQVRURU5VQVRJT05fQ1RSTF9TVFJVQzsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gRUVQUk9NIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogODA1MSBmaXJtd2FyZSBpbWFnZSBmb3IgUlQyODYwIC0gYmFzZSBhZGRyZXNzID0gMHg0MDAwICovCisjZGVmaW5lIEZJUk1XQVJFX0lNQUdFX0JBU0UgICAgIDB4MjAwMAorI2RlZmluZSBNQVhfRklSTVdBUkVfSU1BR0VfU0laRSAweDIwMDAJLyogOGtieXRlICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIEZyaW13YXJlIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUlRNUF9XUklURV9GSVJNV0FSRShfcEFkLCBfcEZ3SW1hZ2UsIF9Gd0xlbikJCQlcCisJZG97CQkJCQkJCQlcCisJCXVuc2lnbmVkIGxvbmcJX2ksIF9maXJtOwkJCQkJXAorCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgUEJGX1NZU19DVFJMLCAweDEwMDAwKTsJCVwKKwkJCQkJCQkJCVwKKwkJZm9yKF9pPTA7IF9pPF9Gd0xlbjsgX2krPTQpCQkJCVwKKwkJewkJCQkJCQlcCisJCQlfZmlybSA9IF9wRndJbWFnZVtfaV0gKwkJCQlcCisJCQkgICAoX3BGd0ltYWdlW19pKzNdIDw8IDI0KSArCQkJXAorCQkJICAgKF9wRndJbWFnZVtfaSsyXSA8PCAxNikgKwkJCVwKKwkJCSAgIChfcEZ3SW1hZ2VbX2krMV0gPDwgOCk7CQkJXAorCQkJUlRNUF9JT19XUklURTMyKF9wQWQsIEZJUk1XQVJFX0lNQUdFX0JBU0UgKyBfaSwgX2Zpcm0pOwlcCisJCX0JCQkJCQkJXAorCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgUEJGX1NZU19DVFJMLCAweDAwMDAwKTsJCVwKKwkJUlRNUF9JT19XUklURTMyKF9wQWQsIFBCRl9TWVNfQ1RSTCwgMHgwMDAwMSk7CQlcCisJCQkJCQkJCQlcCisJCS8qIGluaXRpYWxpemUgQkJQIFIvVyBhY2Nlc3MgYWdlbnQgKi8JCQlcCisJCVJUTVBfSU9fV1JJVEUzMihfcEFkLCBIMk1fQkJQX0FHRU5ULCAwKTsJCVwKKwkJUlRNUF9JT19XUklURTMyKF9wQWQsIEgyTV9NQUlMQk9YX0NTUiwgMCk7CQlcCisJfXdoaWxlKDApCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIFRYIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUlRNUF9TVEFSVF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBpcnFGbGFncykJCWRve313aGlsZSgwKQorI2RlZmluZSBSVE1QX1NUT1BfREVRVUVVRShwQWQsIFF1ZUlkeCwgaXJxRmxhZ3MpCQlkb3t9d2hpbGUoMCkKKworI2RlZmluZSBSVE1QX0hBU19FTk9VR0hfRlJFRV9ERVNDKHBBZCwgcFR4QmxrLCBmcmVlTnVtLCBwUGFja2V0KSBcCisJCSgoZnJlZU51bSkgPj0gKHVuc2lnbmVkIGxvbmcpKHBUeEJsay0+VG90YWxGcmFnTnVtICsgUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0KSArIDMpKQkvKiByb3VnaCBlc3RpbWF0ZSB3ZSB3aWxsIHVzZSAzIG1vcmUgZGVzY3JpcHRvci4gKi8KKyNkZWZpbmUgUlRNUF9SRUxFQVNFX0RFU0NfUkVTT1VSQ0UocEFkLCBRdWVJZHgpCVwKKwkJZG97fXdoaWxlKDApCisKKyNkZWZpbmUgTkVFRF9RVUVVRV9CQUNLX0ZPUl9BR0cocEFkLCBRdWVJZHgsIGZyZWVOdW0sIF9UeEZyYW1lVHlwZSkgXAorCQkoKChmcmVlTnVtICE9IChUWF9SSU5HX1NJWkUtMSkpICYmIChwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdLk51bWJlciA9PSAwKSkgfHwgKGZyZWVOdW08MykpCisKKyNkZWZpbmUgSEFMX0tpY2tPdXRNZ210VHgoX3BBZCwgX1F1ZUlkeCwgX3BQYWNrZXQsIF9wU3JjQnVmVkEsIF9TcmNCdWZMZW4pCVwKKwkJCVJ0bXBQQ0lNZ210S2lja091dChfcEFkLCBfUXVlSWR4LCBfcFBhY2tldCwgX3BTcmNCdWZWQSwgX1NyY0J1ZkxlbikKKworI2RlZmluZSBIQUxfV3JpdGVTdWJUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBiSXNMYXN0LCBwRnJlZU51bWJlcikJXAorCQkJCS8qIFJ0bXBQQ0lfV3JpdGVTdWJUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBiSXNMYXN0LCBwRnJlZU51bWJlcikgKi8KKworI2RlZmluZSBIQUxfV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLGJJc0xhc3QsIHBGcmVlTnVtYmVyKQlcCisJCQlSdG1wUENJX1dyaXRlU2luZ2xlVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgYklzTGFzdCwgcEZyZWVOdW1iZXIpCisKKyNkZWZpbmUgSEFMX1dyaXRlRnJhZ1R4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYWdOdW0sIHBGcmVlTnVtYmVyKSBcCisJCQlSdG1wUENJX1dyaXRlRnJhZ1R4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYWdOdW0sIHBGcmVlTnVtYmVyKQorCisjZGVmaW5lIEhBTF9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsayxmcmFtZU51bSwgcEZyZWVOdW1iZXIpCVwKKwkJCVJ0bXBQQ0lfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYW1lTnVtLCBwRnJlZU51bWJlcikKKworI2RlZmluZSBIQUxfRmluYWxXcml0ZVR4UmVzb3VyY2UoX3BBZCwgX3BUeEJsaywgX1RvdGFsTVBEVVNpemUsIF9GaXJzdFR4SWR4KQlcCisJCQlSdG1wUENJX0ZpbmFsV3JpdGVUeFJlc291cmNlKF9wQWQsIF9wVHhCbGssIF9Ub3RhbE1QRFVTaXplLCBfRmlyc3RUeElkeCkKKworI2RlZmluZSBIQUxfTGFzdFR4SWR4KF9wQWQsIF9RdWVJZHgsX0xhc3RUeElkeCkgXAorCQkJCS8qUnRtcFBDSURhdGFMYXN0VHhJZHgoX3BBZCwgX1F1ZUlkeCxfTGFzdFR4SWR4KSAqLworCisjZGVmaW5lIEhBTF9LaWNrT3V0VHgoX3BBZCwgX3BUeEJsaywgX1F1ZUlkeCkJXAorCQkJUlRNUF9JT19XUklURTMyKChfcEFkKSwgVFhfQ1RYX0lEWDArKChfUXVlSWR4KSoweDEwKSwgKF9wQWQpLT5UeFJpbmdbKF9RdWVJZHgpXS5UeENwdUlkeCkKKy8qCQkJUnRtcFBDSURhdGFLaWNrT3V0KF9wQWQsIF9wVHhCbGssIF9RdWVJZHgpKi8KKworI2RlZmluZSBIQUxfS2lja091dE51bGxGcmFtZVR4KF9wQWQsIF9RdWVJZHgsIF9wTnVsbEZyYW1lLCBfZnJhbWVMZW4pCVwKKwkJCU1pbmlwb3J0TU1SZXF1ZXN0KF9wQWQsIF9RdWVJZHgsIF9wTnVsbEZyYW1lLCBfZnJhbWVMZW4pCisKKyNkZWZpbmUgR0VUX1RYUklOR19GUkVFTk8oX3BBZCwgX1F1ZUlkeCkgXAorCShfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhTd0ZyZWVJZHggPiBfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhDcHVJZHgpCT8gXAorCQkJKF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeFN3RnJlZUlkeCAtIF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeENwdUlkeCAtIDEpIFwKKwkJCSA6CVwKKwkJCShfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhTd0ZyZWVJZHggKyBUWF9SSU5HX1NJWkUgLSBfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhDcHVJZHggLSAxKTsKKworI2RlZmluZSBHRVRfTUdNVFJJTkdfRlJFRU5PKF9wQWQpIFwKKwkoX3BBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPiBfcEFkLT5NZ210UmluZy5UeENwdUlkeCkJPyBcCisJCQkoX3BBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggLSBfcEFkLT5NZ210UmluZy5UeENwdUlkeCAtIDEpIFwKKwkJCSA6CVwKKwkJCShfcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCArIE1HTVRfUklOR19TSVpFIC0gX3BBZC0+TWdtdFJpbmcuVHhDcHVJZHggLSAxKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gUlggUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBBU0lDIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHJlc2V0IE1BQyBvZiBhIHN0YXRpb24gZW50cnkgdG8gMHgwMDAwMDAwMDAwMDAgKi8KKyNkZWZpbmUgUlRNUF9TVEFfRU5UUllfTUFDX1JFU0VUKHBBZCwgV2NpZCkJXAorCUFzaWNEZWxXY2lkVGFiKHBBZCwgV2NpZCk7CisKKy8qIGFkZCB0aGlzIGVudHJ5IGludG8gQVNJQyBSWCBXQ0lEIHNlYXJjaCB0YWJsZSAqLworI2RlZmluZSBSVE1QX1NUQV9FTlRSWV9BREQocEFkLCBwRW50cnkpCQlcCisJQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKHBBZCwgcEVudHJ5LT5BaWQsIHBFbnRyeS0+QWRkcik7CisKKy8qIGFkZCBieSBqb2hubGksIGZpeCAiaW5faW50ZXJydXB0IiBlcnJvciB3aGVuIGNhbGwgIk1hY1RhYmxlRGVsZXRlRW50cnkiIGluIFJ4IHRhc2tsZXQgKi8KKy8qIFNldCBNQUMgcmVnaXN0ZXIgdmFsdWUgYWNjb3JkaW5nIG9wZXJhdGlvbiBtb2RlICovCisjZGVmaW5lIFJUTVBfVVBEQVRFX1BST1RFQ1QocEFkKQlcCisJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCAwLCAoQUxMTl9TRVRQUk9URUNUKSwgVFJVRSwgMCk7CisvKiBlbmQgam9obmxpICovCisKKy8qIHJlbW92ZSBQYWlyLXdpc2Uga2V5IG1hdGVyaWFsIGZyb20gQVNJQyAqLworI2RlZmluZSBSVE1QX1NUQV9FTlRSWV9LRVlfREVMKHBBZCwgQnNzSWR4LCBXY2lkKQlcCisJQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkLCBCc3NJZHgsICh1OClXY2lkKTsKKworLyogYWRkIENsaWVudCBzZWN1cml0eSBpbmZvcm1hdGlvbiBpbnRvIEFTSUMgV0NJRCB0YWJsZSBhbmQgSVZFSVYgdGFibGUgKi8KKyNkZWZpbmUgUlRNUF9TVEFfU0VDVVJJVFlfSU5GT19BREQocEFkLCBhcGlkeCwgS2V5SUQsIHBFbnRyeSkJCVwKKwlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgYXBpZHgsIEtleUlELAkJCVwKKwkJCQkJCQlwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLkNpcGhlckFsZywgcEVudHJ5KTsKKworI2RlZmluZSBSVE1QX1NFQ1VSSVRZX0tFWV9BREQocEFkLCBhcGlkeCwgS2V5SUQsIHBFbnRyeSkJCVwKKwl7CS8qIHVwZGF0ZSBwYWlyd2lzZSBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlICovCVwKKwkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgYXBpZHgsIEtleUlELAkJCQkJXAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLkNpcGhlckFsZywJCVwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5LZXksCQkJCVwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5UeE1pYywJCQlcCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJRF0uUnhNaWMpOwkJCVwKKwkJLyogdXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlICovCQkJXAorCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgYXBpZHgsIEtleUlELAkJCQkJXAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLkNpcGhlckFsZywJCVwKKwkJCQkJCSAgcEVudHJ5KTsgfQorCisvKiBJbnNlcnQgdGhlIEJBIGJpdG1hcCB0byBBU0lDIGZvciB0aGUgV2NpZCBlbnRyeSAqLworI2RlZmluZSBSVE1QX0FERF9CQV9TRVNTSU9OX1RPX0FTSUMoX3BBZCwgX0FpZCwgX1RJRCkJXAorCQlkb3sJCQkJCVwKKwkJCXUzMiBfVmFsdWUgPSAwLCBfT2Zmc2V0OwkJCQkJXAorCQkJX09mZnNldCA9IE1BQ19XQ0lEX0JBU0UgKyAoX0FpZCkgKiBIV19XQ0lEX0VOVFJZX1NJWkUgKyA0OwlcCisJCQlSVE1QX0lPX1JFQUQzMigoX3BBZCksIF9PZmZzZXQsICZfVmFsdWUpO1wKKwkJCV9WYWx1ZSB8PSAoMHgxMDAwMDw8KF9USUQpKTsJXAorCQkJUlRNUF9JT19XUklURTMyKChfcEFkKSwgX09mZnNldCwgX1ZhbHVlKTtcCisJCX13aGlsZSgwKQorCisvKiBSZW1vdmUgdGhlIEJBIGJpdG1hcCBmcm9tIEFTSUMgZm9yIHRoZSBXY2lkIGVudHJ5ICovCisvKiAgICAgICAgICAgICAgYml0bWFwIGZpZWxkIHN0YXJ0cyBhdCAweDEwMDAwIGluIEFTSUMgV0NJRCB0YWJsZSAqLworI2RlZmluZSBSVE1QX0RFTF9CQV9TRVNTSU9OX0ZST01fQVNJQyhfcEFkLCBfV2NpZCwgX1RJRCkJCQkJXAorCQlkb3sJCQkJCQkJCVwKKwkJCXUzMiBfVmFsdWUgPSAwLCBfT2Zmc2V0OwkJCQlcCisJCQlfT2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIChfV2NpZCkgKiBIV19XQ0lEX0VOVFJZX1NJWkUgKyA0OwlcCisJCQlSVE1QX0lPX1JFQUQzMigoX3BBZCksIF9PZmZzZXQsICZfVmFsdWUpOwkJCVwKKwkJCV9WYWx1ZSAmPSAofigweDEwMDAwIDw8IChfVElEKSkpOwkJCQlcCisJCQlSVE1QX0lPX1dSSVRFMzIoKF9wQWQpLCBfT2Zmc2V0LCBfVmFsdWUpOwkJCVwKKwkJfXdoaWxlKDApCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIEludGVyZmFjZSBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qICovCisvKiBFbmFibGUgJiBEaXNhYmxlIE5JQyBpbnRlcnJ1cHQgdmlhIHdyaXRpbmcgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgKi8KKy8qIFNpbmNlIGl0IHVzZSBBREFQVEVSIHN0cnVjdHVyZSwgaXQgaGF2ZSB0byBiZSBwdXQgYWZ0ZXIgc3RydWN0dXJlIGRlZmluaXRpb24uICovCisvKiAqLworI2RlZmluZSBSVE1QX0FTSUNfSU5URVJSVVBUX0RJU0FCTEUoX3BBZCkJCVwKKwlkb3sJCQlcCisJCVJUTVBfSU9fV1JJVEUzMigoX3BBZCksIElOVF9NQVNLX0NTUiwgMHgwKTsgICAgIC8qIDA6IGRpc2FibGUgKi8JXAorCQlSVE1QX0NMRUFSX0ZMQUcoKF9wQWQpLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpOwkJXAorCX13aGlsZSgwKQorCisjZGVmaW5lIFJUTVBfQVNJQ19JTlRFUlJVUFRfRU5BQkxFKF9wQWQpXAorCWRvewkJCQlcCisJCVJUTVBfSU9fV1JJVEUzMigoX3BBZCksIElOVF9NQVNLX0NTUiwgKF9wQWQpLT5pbnRfZW5hYmxlX3JlZyAvKkRFTEFZSU5UTUFTSyovKTsgICAgIC8qIDE6ZW5hYmxlICovCVwKKwkJUlRNUF9TRVRfRkxBRygoX3BBZCksIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSk7CVwKKwl9d2hpbGUoMCkKKworI2RlZmluZSBSVE1QX0lSUV9JTklUKHBBZCkJXAorCXsJcEFkLT5pbnRfZW5hYmxlX3JlZyA9ICgoREVMQVlJTlRNQVNLKSB8CQlcCisJCQkJCShSeElOVHxUeERhdGFJbnR8VHhNZ210SW50KSkgJiB+KDB4MDMpOwlcCisJCXBBZC0+aW50X2Rpc2FibGVfbWFzayA9IDA7CQkJCQkJXAorCQlwQWQtPmludF9wZW5kaW5nID0gMDsgfQorCisjZGVmaW5lIFJUTVBfSVJRX0VOQUJMRShwQWQpCQkJCQlcCisJewkvKiBjbGVhciBnYXJiYWdlIGludHMgKi8JCQlcCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCAweGZmZmZmZmZmKTtcCisJCVJUTVBfQVNJQ19JTlRFUlJVUFRfRU5BQkxFKHBBZCk7IH0KKworLyogLS0tLS0tLS0tLS0tLS0tLS0gTUxNRSBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFJUTVBfTUxNRV9IQU5ETEVSKHBBZCkJCQlNbG1lSGFuZGxlcihwQWQpCisKKyNkZWZpbmUgUlRNUF9NTE1FX1BSRV9TQU5JVFlfQ0hFQ0socEFkKQorCisjZGVmaW5lIFJUTVBfTUxNRV9TVEFfUVVJQ0tfUlNQX1dBS0VfVVAocEFkKQlcCisJCVJUTVBTZXRUaW1lcigmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsIDEwMCk7CisKKyNkZWZpbmUgUlRNUF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkKQlcCisJCU1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lKHBBZCkKKworI2RlZmluZSBSVE1QX0hBTkRMRV9DT1VOVEVSX01FQVNVUkUoX3BBZCwgX3BFbnRyeSlcCisJCUhhbmRsZUNvdW50ZXJNZWFzdXJlKF9wQWQsIF9wRW50cnkpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIFBvd2VyIFNhdmUgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBSVE1QX1BTX1BPTExfRU5RVUVVRShwQWQpCQkJCUVucXVldWVQc1BvbGwocEFkKQorCisvKiBGb3IgUlRNUFBDSWVQb3dlckxpbmtDdHJsUmVzdG9yZSAoKSBmdW5jdGlvbiAqLworI2RlZmluZSBSRVNUT1JFX0hBTFQJCTEKKyNkZWZpbmUgUkVTVE9SRV9XQUtFVVAJCTIKKyNkZWZpbmUgUkVTVE9SRV9DTE9TRSAgICAgICAgICAgMworCisjZGVmaW5lIFBvd2VyU2FmZUNJRAkJMQorI2RlZmluZSBQb3dlclJhZGlvT2ZmQ0lECTIKKyNkZWZpbmUgUG93ZXJXYWtlQ0lECQkzCisjZGVmaW5lIENJRDBNQVNLCQkweDAwMDAwMGZmCisjZGVmaW5lIENJRDFNQVNLCQkweDAwMDBmZjAwCisjZGVmaW5lIENJRDJNQVNLCQkweDAwZmYwMDAwCisjZGVmaW5lIENJRDNNQVNLCQkweGZmMDAwMDAwCisKKyNkZWZpbmUgUlRNUF9TVEFfRk9SQ0VfV0FLRVVQKHBBZCwgYkZyb21UeCkgXAorICAgIFJUMjh4eFBjaVN0YUFzaWNGb3JjZVdha2V1cChwQWQsIGJGcm9tVHgpOworCisjZGVmaW5lIFJUTVBfU1RBX1NMRUVQX1RIRU5fQVVUT19XQUtFVVAocEFkLCBUYnR0TnVtVG9OZXh0V2FrZVVwKSBcCisgICAgUlQyOHh4UGNpU3RhQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAocEFkLCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKKworI2RlZmluZSBSVE1QX1NFVF9QU01fQklUKF9wQWQsIF92YWwpIFwKKwlNbG1lU2V0UHNtQml0KF9wQWQsIF92YWwpOworCisjZGVmaW5lIFJUTVBfTUxNRV9SQURJT19PTihwQWQpIFwKKyAgICBSVDI4eHhQY2lNbG1lUmFkaW9PbihwQWQpOworCisjZGVmaW5lIFJUTVBfTUxNRV9SQURJT19PRkYocEFkKSBcCisgICAgUlQyOHh4UGNpTWxtZVJhZGlvT0ZGKHBBZCk7CisKKyNlbmRpZiAvKl9fTUFDX1BDSV9IX18gLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9tYWNfdXNiLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvbWFjX3VzYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNjdjMGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvbWFjX3VzYi5oCkBAIC0wLDAgKzEsMzQ3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgICAgICBtYWNfdXNiLmgKKworICAgIEFic3RyYWN0OgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpZm5kZWYgX19NQUNfVVNCX0hfXworI2RlZmluZSBfX01BQ19VU0JfSF9fCisKKyNpbmNsdWRlICIuLi9ydG1wX3R5cGUuaCIKKyNpbmNsdWRlICJydG1wX21hYy5oIgorI2luY2x1ZGUgInJ0bXBfcGh5LmgiCisjaW5jbHVkZSAiLi4vcnRtcF9pZmFjZS5oIgorI2luY2x1ZGUgIi4uL3J0bXBfZG90MTEuaCIKKworI2RlZmluZSBVU0JfQ1lDX0NGRwkJCQkweDAyYTQKKworI2RlZmluZSBCRUFDT05fUklOR19TSVpFCQkyCisjZGVmaW5lIE1HTVRQSVBFSURYCQkJCTAJLyogRVA2IGlzIGhpZ2hlc3QgcHJpb3JpdHkgKi8KKworI2RlZmluZSBSVE1QX1BLVF9UQUlMX1BBRERJTkcJMTEJLyogMyhtYXggNCBieXRlIHBhZGRpbmcpICsgNCAobGFzdCBwYWNrZXQgcGFkZGluZykgKyA0IChNYXhCdWxrT3V0c2l6ZSBhbGlnbiBwYWRkaW5nKSAqLworCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfTkVFRF9TVE9QX1RYCQlcCisJCShmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QgfCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAlcCisJCSBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUIHwgXAorCQkgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfCBmUlRNUF9BREFQVEVSX1JFTU9WRV9JTl9QUk9HUkVTUykKKworLyogKi8KKy8qIFJYSU5GTyBhcHBlbmRzIGF0IHRoZSBlbmQgb2YgZWFjaCByeCBwYWNrZXQuICovCisvKiAqLworI2RlZmluZSBSWElORk9fU0laRQkJCQk0CisjZGVmaW5lIFJUMjg3MF9SWERNQUxFTl9GSUVMRF9TSVpFCTQKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHJ0X3J4aW5mbyB7CisJdTMyIEJBOjE7CisJdTMyIERBVEE6MTsKKwl1MzIgTlVMTERBVEE6MTsKKwl1MzIgRlJBRzoxOworCXUzMiBVMk06MTsJCS8qIDE6IHRoaXMgUlggZnJhbWUgaXMgdW5pY2FzdCB0byBtZSAqLworCXUzMiBNY2FzdDoxOwkJLyogMTogdGhpcyBpcyBhIG11bHRpY2FzdCBmcmFtZSAqLworCXUzMiBCY2FzdDoxOwkJLyogMTogdGhpcyBpcyBhIGJyb2FkY2FzdCBmcmFtZSAqLworCXUzMiBNeUJzczoxOwkJLyogMTogdGhpcyBmcmFtZSBiZWxvbmdzIHRvIHRoZSBzYW1lIEJTU0lEICovCisJdTMyIENyYzoxOwkJLyogMTogQ1JDIGVycm9yICovCisJdTMyIENpcGhlckVycjoyOwkvKiAwOiBkZWNyeXB0aW9uIG9rYXksIDE6SUNWIGVycm9yLCAyOk1JQyBlcnJvciwgMzpLRVkgbm90IHZhbGlkICovCisJdTMyIEFNU0RVOjE7CQkvKiByeCB3aXRoIDgwMi4zIGhlYWRlciwgbm90IDgwMi4xMSBoZWFkZXIuICovCisJdTMyIEhUQzoxOworCXUzMiBSU1NJOjE7CisJdTMyIEwyUEFEOjE7CisJdTMyIEFNUERVOjE7CQkvKiBUbyBiZSBtb3ZlZCAqLworCXUzMiBEZWNyeXB0ZWQ6MTsKKwl1MzIgUGxjcFJzc2lsOjE7CisJdTMyIENpcGhlckFsZzoxOworCXUzMiBMYXN0QU1TRFU6MTsKKwl1MzIgUGxjcFNpZ25hbDoxMjsKK30gUlQyOFhYX1JYRF9TVFJVQywgKlBSVDI4WFhfUlhEX1NUUlVDOworCisvKiAqLworLyogVFhJTkZPICovCisvKiAqLworI2RlZmluZSBUWElORk9fU0laRQkJCQk0CisKK3N0cnVjdCBydF90eGluZm8geworCS8qIFdvcmQgMCAqLworCXUzMiBVU0JETUFUeFBrdExlbjoxNjsJLyp1c2VkIE9OTFkgaW4gVVNCIGJ1bGsgQWdncmVnYXRpb24sICBUb3RhbCBieXRlIGNvdW50cyBvZiBhbGwgc3ViLWZyYW1lLiAqLworCXUzMiByc3Y6ODsKKwl1MzIgV0lWOjE7CQkvKiBXaXJlbGVzcyBJbmZvIFZhbGlkLiAxIGlmIERyaXZlciBhbHJlYWR5IGZpbGwgV0ksICBvIGlmIERNQSBuZWVkcyB0byBjb3B5IFdJIHRvIGNvcnJlY3Rwb3NpdGlvbiAqLworCXUzMiBRU0VMOjI7CQkvKiBzZWxlY3Qgb24tY2hpcCBGSUZPIElEIGZvciAybmQtc3RhZ2Ugb3V0cHV0IHNjaGVkdWxlci4wOk1HTVQsIDE6SENDQSAyOkVEQ0EgKi8KKwl1MzIgU3dVc2VMYXN0Um91bmQ6MTsJLyogU29mdHdhcmUgdXNlLiAqLworCXUzMiByc3YyOjI7CQkvKiBTb2Z0d2FyZSB1c2UuICovCisJdTMyIFVTQkRNQU5leHRWTEQ6MTsJLyp1c2VkIE9OTFkgaW4gVVNCIGJ1bGsgQWdncmVnYXRpb24sIE5leHRWYWxpZCAqLworCXUzMiBVU0JETUFUeGJ1cnN0OjE7CS8qdXNlZCBPTkxZIGluIFVTQiBidWxrIEFnZ3JlLiBGb3JjZSBVU0IgRE1BIHRyYW5zbWl0IGZyYW1lIGZyb20gY3VycmVudCBzZWxlY3RlZCBlbmRwb2ludCAqLworfTsKKworLyogKi8KKy8qIE1hbmFnZW1lbnQgcmluZyBidWZmZXIgZm9ybWF0ICovCisvKiAqLworc3RydWN0IHJ0X21nbXQgeworCUJPT0xFQU4gVmFsaWQ7CisJdTggKnBCdWZmZXI7CisJdW5zaWduZWQgbG9uZyBMZW5ndGg7Cit9OworCisvKi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisvKiBUaGUgc3RydWN0IHJ0X3R4X2J1ZmZlciBzdHJ1Y3R1cmUgZm9ybXMgdGhlIHRyYW5zbWl0dGVkIFVTQiBwYWNrZXQgdG8gdGhlIGRldmljZSAqLworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworc3RydWN0IHJ0X3R4X2J1ZmZlciB7CisJdW5pb24geworCQl1OCBXaXJlbGVzc1BhY2tldFtUWF9CVUZGRVJfTk9STVNJWkVdOworCQlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBOdWxsRnJhbWU7CisJCXN0cnVjdCBydF9wc3BvbGxfZnJhbWUgUHNQb2xsUGFja2V0OworCQlzdHJ1Y3QgcnRfcnRzX2ZyYW1lIFJUU0ZyYW1lOworCX0gZmllbGQ7CisJdTggQWdncmVnYXRpb25bNF07CS8qQnVmZmVyIGZvciBzYXZlIEFnZ3JlZ2F0aW9uIHNpemUuICovCit9OworCitzdHJ1Y3QgcnRfaHR0eF9idWZmZXIgeworCXVuaW9uIHsKKwkJdTggV2lyZWxlc3NQYWNrZXRbTUFYX1RYQlVMS19TSVpFXTsKKwkJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgTnVsbEZyYW1lOworCQlzdHJ1Y3QgcnRfcHNwb2xsX2ZyYW1lIFBzUG9sbFBhY2tldDsKKwkJc3RydWN0IHJ0X3J0c19mcmFtZSBSVFNGcmFtZTsKKwl9IGZpZWxkOworCXU4IEFnZ3JlZ2F0aW9uWzRdOwkvKkJ1ZmZlciBmb3Igc2F2ZSBBZ2dyZWdhdGlvbiBzaXplLiAqLworfTsKKworLyogdXNlZCB0byB0cmFjayBkcml2ZXItZ2VuZXJhdGVkIHdyaXRlIGlycHMgKi8KK3N0cnVjdCBydF90eF9jb250ZXh0IHsKKwl2b2lkICpwQWQ7CQkvKkluaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZSAqLworCVBVUkIgcFVyYjsJCS8qSW5pdGlhbGl6ZWQgaW4gTWluaXBvcnRJbml0aWFsaXplICovCisJUElSUCBwSXJwOwkJLyp1c2VkIHRvIGNhbmNlbCBwZW5kaW5nIGJ1bGsgb3V0LiAqLworCS8qSW5pdGlhbGl6ZWQgaW4gTWluaXBvcnRJbml0aWFsaXplICovCisJc3RydWN0IHJ0X3R4X2J1ZmZlciAqVHJhbnNmZXJCdWZmZXI7CS8qSW5pdGlhbGl6ZWQgaW4gTWluaXBvcnRJbml0aWFsaXplICovCisJdW5zaWduZWQgbG9uZyBCdWxrT3V0U2l6ZTsKKwl1OCBCdWxrT3V0UGlwZUlkOworCXU4IFNlbGZJZHg7CisJQk9PTEVBTiBJblVzZTsKKwlCT09MRUFOIGJXYWl0aW5nQnVsa091dDsJLyogYXQgbGVhc3Qgb25lIHBhY2tldCBpcyBpbiB0aGlzIFR4Q29udGV4dCwgcmVhZHkgZm9yIG1ha2luZyBJUlAgYW55dGltZS4gKi8KKwlCT09MRUFOIGJGdWxsRm9yQnVsa091dDsJLyogYWxsIHR4IGJ1ZmZlciBhcmUgZnVsbCAsIHNvIHdhaXRpbmcgZm9yIHR4IGJ1bGtvdXQuICovCisJQk9PTEVBTiBJUlBQZW5kaW5nOworCUJPT0xFQU4gTGFzdE9uZTsKKwlCT09MRUFOIGJBZ2dyZWdhdGlibGU7CisJdTggSGVhZGVyXzgwMl8zW0xFTkdUSF84MDJfM107CisJdTggUnN2WzJdOworCXVuc2lnbmVkIGxvbmcgRGF0YU9mZnNldDsKKwl1MzIgVHhSYXRlOworCWRtYV9hZGRyX3QgZGF0YV9kbWE7CS8qIHVyYiBkbWEgb24gbGludXggKi8KKworfTsKKworLyogdXNlZCB0byB0cmFjayBkcml2ZXItZ2VuZXJhdGVkIHdyaXRlIGlycHMgKi8KK3N0cnVjdCBydF9odF90eF9jb250ZXh0IHsKKwl2b2lkICpwQWQ7CQkvKkluaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZSAqLworCVBVUkIgcFVyYjsJCS8qSW5pdGlhbGl6ZWQgaW4gTWluaXBvcnRJbml0aWFsaXplICovCisJUElSUCBwSXJwOwkJLyp1c2VkIHRvIGNhbmNlbCBwZW5kaW5nIGJ1bGsgb3V0LiAqLworCS8qSW5pdGlhbGl6ZWQgaW4gTWluaXBvcnRJbml0aWFsaXplICovCisJc3RydWN0IHJ0X2h0dHhfYnVmZmVyICpUcmFuc2ZlckJ1ZmZlcjsJLypJbml0aWFsaXplZCBpbiBNaW5pcG9ydEluaXRpYWxpemUgKi8KKwl1bnNpZ25lZCBsb25nIEJ1bGtPdXRTaXplOwkvKiBJbmRpY2F0ZSB0aGUgdG90YWwgYnVsay1vdXQgc2l6ZSBpbiBieXRlcyBpbiBvbmUgYnVsay10cmFuc21pc3Npb24gKi8KKwl1OCBCdWxrT3V0UGlwZUlkOworCUJPT0xFQU4gSVJQUGVuZGluZzsKKwlCT09MRUFOIExhc3RPbmU7CisJQk9PTEVBTiBiQ3VyV3JpdGluZzsKKwlCT09MRUFOIGJSaW5nRW1wdHk7CisJQk9PTEVBTiBiQ29weVNhdmVQYWQ7CisJdTggU2F2ZWRQYWRbOF07CisJdTggSGVhZGVyXzgwMl8zW0xFTkdUSF84MDJfM107CisJdW5zaWduZWQgbG9uZyBDdXJXcml0ZVBvc2l0aW9uOwkvKiBJbmRpY2F0ZSB0aGUgYnVmZmVyIG9mZnNldCB3aGljaCBwYWNrZXQgd2lsbCBiZSBpbnNlcnRlZCBzdGFydCBmcm9tLiAqLworCXVuc2lnbmVkIGxvbmcgQ3VyV3JpdGVSZWFsUG9zOwkvKiBJbmRpY2F0ZSB0aGUgYnVmZmVyIG9mZnNldCB3aGljaCBwYWNrZXQgbm93IGFyZSB3cml0aW5nIHRvLiAqLworCXVuc2lnbmVkIGxvbmcgTmV4dEJ1bGtPdXRQb3NpdGlvbjsJLyogSW5kaWNhdGUgdGhlIGJ1ZmZlciBzdGFydCBvZmZzZXQgb2YgYSBidWxrLXRyYW5zbWlzc2lvbiAqLworCXVuc2lnbmVkIGxvbmcgRU5leHRCdWxrT3V0UG9zaXRpb247CS8qIEluZGljYXRlIHRoZSBidWZmZXIgZW5kIG9mZnNldCBvZiBhIGJ1bGstdHJhbnNtaXNzaW9uICovCisJdTMyIFR4UmF0ZTsKKwlkbWFfYWRkcl90IGRhdGFfZG1hOwkvKiB1cmIgZG1hIG9uIGxpbnV4ICovCit9OworCisvKiAqLworLyogU3RydWN0dXJlIHRvIGtlZXAgdHJhY2sgb2YgcmVjZWl2ZSBwYWNrZXRzIGFuZCBidWZmZXJzIHRvIGluZGljYXRlICovCisvKiByZWNlaXZlIGRhdGEgdG8gdGhlIHByb3RvY29sLiAqLworLyogKi8KK3N0cnVjdCBydF9yeF9jb250ZXh0IHsKKwl1OCAqVHJhbnNmZXJCdWZmZXI7CisJdm9pZCAqcEFkOworCVBJUlAgcElycDsJCS8qdXNlZCB0byBjYW5jZWwgcGVuZGluZyBidWxrIGluLiAqLworCVBVUkIgcFVyYjsKKwkvKlRoZXNlIDIgQm9vbGVhbiBzaG91bGRuJ3QgYm90aCBiZSAxIGF0IHRoZSBzYW1lIHRpbWUuICovCisJdW5zaWduZWQgbG9uZyBCdWxrSW5PZmZzZXQ7CS8qIG51bWJlciBvZiBwYWNrZXRzIHdhaXRpbmcgZm9yIHJlb3JkZXJpbmcgLiAqLworLyogICAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgIFJlb3JkZXJJblVzZTsgICAvLyBBdCBsZWFzdCBvbmUgcGFja2V0IGluIHRoaXMgYnVmZmVyIGFyZSBpbiByZW9yZGVyaW5nIGJ1ZmZlciBhbmQgd2FpdCBmb3IgcmVjZWl2ZSBpbmRpY2F0aW9uICovCisJQk9PTEVBTiBiUnhIYW5kbGluZzsJLyogTm90aWZ5IHRoaXMgcGFja2V0IGlzIGJlaW5nIHByb2Nlc3Mgbm93LiAqLworCUJPT0xFQU4gSW5Vc2U7CQkvKiBVU0IgSGFyZHdhcmUgT2NjdXBpZWQuIFdhaXQgZm9yIFVTQiBIVyB0byBwdXQgcGFja2V0LiAqLworCUJPT0xFQU4gUmVhZGFibGU7CS8qIFJlY2VpdmUgQ29tcGxldGUgYmFjay4gT0sgZm9yIGRyaXZlciB0byBpbmRpY2F0ZSByZWNlaXZpbmcgcGFja2V0LiAqLworCUJPT0xFQU4gSVJQUGVuZGluZzsJLyogVE9ETzogVG8gYmUgcmVtb3ZlZCAqLworCWF0b21pY190IElycExvY2s7CisJc3BpbmxvY2tfdCBSeENvbnRleHRMb2NrOworCWRtYV9hZGRyX3QgZGF0YV9kbWE7CS8qIHVyYiBkbWEgb24gbGludXggKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCVVTQiBGcmltd2FyZSBSZWxhdGVkIE1BQ1JPCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIDgwNTEgZmlybXdhcmUgaW1hZ2UgZm9yIHVzYiAtIHVzZSBsYXN0LWhhbGYgYmFzZSBhZGRyZXNzID0gMHgzMDAwICovCisjZGVmaW5lIEZJUk1XQVJFX0lNQUdFX0JBU0UJCQkweDMwMDAKKyNkZWZpbmUgTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUJCTB4MTAwMAkvKiA0a2J5dGUgKi8KKworI2RlZmluZSBSVE1QX1dSSVRFX0ZJUk1XQVJFKF9wQWQsIF9wRndJbWFnZSwgX0Z3TGVuKQkJXAorCVJUVVNCRmlybXdhcmVXcml0ZShfcEFkLCBfcEZ3SW1hZ2UsIF9Gd0xlbikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJVVNCIFRYIFJlbGF0ZWQgTUFDUk8KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBSVE1QX1NUQVJUX0RFUVVFVUUocEFkLCBRdWVJZHgsIGlycUZsYWdzKQkJCQlcCisJCQlkb3sJCQkJCQkJCQkJCQkJXAorCQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+RGVRdWV1ZUxvY2tbUXVlSWR4XSwgaXJxRmxhZ3MpOwkJXAorCQkJCWlmIChwQWQtPkRlUXVldWVSdW5uaW5nW1F1ZUlkeF0pCQkJCQkJXAorCQkJCXsJCQkJCQkJCQkJCQkJCVwKKwkJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkRlUXVldWVMb2NrW1F1ZUlkeF0sIGlycUZsYWdzKTtcCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJEZVF1ZXVlUnVubmluZ1slZF09IFRSVUUhXG4iLCBRdWVJZHgpKTsJCVwKKwkJCQkJY29udGludWU7CQkJCQkJCQkJCQlcCisJCQkJfQkJCQkJCQkJCQkJCQkJXAorCQkJCWVsc2UJCQkJCQkJCQkJCQkJXAorCQkJCXsJCQkJCQkJCQkJCQkJCVwKKwkJCQkJcEFkLT5EZVF1ZXVlUnVubmluZ1tRdWVJZHhdID0gVFJVRTsJCQkJCVwKKwkJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkRlUXVldWVMb2NrW1F1ZUlkeF0sIGlycUZsYWdzKTtcCisJCQkJfQkJCQkJCQkJCQkJCQkJXAorCQkJfXdoaWxlKDApCisKKyNkZWZpbmUgUlRNUF9TVE9QX0RFUVVFVUUocEFkLCBRdWVJZHgsIGlycUZsYWdzKQkJCQkJCVwKKwkJCWRvewkJCQkJCQkJCQkJCQkJCVwKKwkJCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkRlUXVldWVMb2NrW1F1ZUlkeF0sIGlycUZsYWdzKTsJCVwKKwkJCQlwQWQtPkRlUXVldWVSdW5uaW5nW1F1ZUlkeF0gPSBGQUxTRTsJCQkJCVwKKwkJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+RGVRdWV1ZUxvY2tbUXVlSWR4XSwgaXJxRmxhZ3MpOwlcCisJCQl9d2hpbGUoMCkKKworI2RlZmluZQlSVE1QX0hBU19FTk9VR0hfRlJFRV9ERVNDKHBBZCwgcFR4QmxrLCBmcmVlTnVtLCBwUGFja2V0KSBcCisJCShSVFVTQkZyZWVEZXNjcmlwdG9yUmVxdWVzdChwQWQsIHBUeEJsay0+UXVlSWR4LCAocFR4QmxrLT5Ub3RhbEZyYW1lTGVuICsgR0VUX09TX1BLVF9MRU4ocFBhY2tldCkpKSA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCisjZGVmaW5lIFJUTVBfUkVMRUFTRV9ERVNDX1JFU09VUkNFKHBBZCwgUXVlSWR4KQkJCVwKKwkJZG97fXdoaWxlKDApCisKKyNkZWZpbmUgTkVFRF9RVUVVRV9CQUNLX0ZPUl9BR0coX3BBZCwgX1F1ZUlkeCwgX2ZyZWVOdW0sIF9UeEZyYW1lVHlwZSkJCVwKKwkJKChfVHhGcmFtZVR5cGUgPT0gVFhfUkFMSU5LX0ZSQU1FKSAmJiAoUlRVU0JOZWVkUXVldWVCYWNrRm9yQWdnKF9wQWQsIF9RdWVJZHgpKSkKKworI2RlZmluZSBIQUxfV3JpdGVTdWJUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBiSXNMYXN0LCBwRnJlZU51bWJlcikJXAorCQkJUnRtcFVTQl9Xcml0ZVN1YlR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGJJc0xhc3QsIHBGcmVlTnVtYmVyKQorCisjZGVmaW5lIEhBTF9Xcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssYklzTGFzdCwgcEZyZWVOdW1iZXIpCVwKKwkJCVJ0bXBVU0JfV3JpdGVTaW5nbGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLGJJc0xhc3QsIHBGcmVlTnVtYmVyKQorCisjZGVmaW5lIEhBTF9Xcml0ZUZyYWdUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFnTnVtLCBwRnJlZU51bWJlcikgXAorCQkJUnRtcFVTQl9Xcml0ZUZyYWdUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFnTnVtLCBwRnJlZU51bWJlcikKKworI2RlZmluZSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssZnJhbWVOdW0sIHBGcmVlTnVtYmVyKQlcCisJCQlSdG1wVVNCX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLGZyYW1lTnVtLCBwRnJlZU51bWJlcikKKworI2RlZmluZSBIQUxfRmluYWxXcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIHRvdGFsTVBEVVNpemUsIFR4SWR4KQlcCisJCQlSdG1wVVNCX0ZpbmFsV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCB0b3RhbE1QRFVTaXplLCBUeElkeCkKKworI2RlZmluZSBIQUxfTGFzdFR4SWR4KHBBZCwgUXVlSWR4LFR4SWR4KSBcCisJCQkJLypSdG1wVVNCRGF0YUxhc3RUeElkeChwQWQsIFF1ZUlkeCxUeElkeCkgKi8KKworI2RlZmluZSBIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBRdWVJZHgpCVwKKwkJCVJ0bXBVU0JEYXRhS2lja091dChwQWQsIHBUeEJsaywgUXVlSWR4KQorCisjZGVmaW5lIEhBTF9LaWNrT3V0TWdtdFR4KHBBZCwgUXVlSWR4LCBwUGFja2V0LCBwU3JjQnVmVkEsIFNyY0J1ZkxlbikJXAorCQkJUnRtcFVTQk1nbXRLaWNrT3V0KHBBZCwgUXVlSWR4LCBwUGFja2V0LCBwU3JjQnVmVkEsIFNyY0J1ZkxlbikKKworI2RlZmluZSBIQUxfS2lja091dE51bGxGcmFtZVR4KF9wQWQsIF9RdWVJZHgsIF9wTnVsbEZyYW1lLCBfZnJhbWVMZW4pCVwKKwkJCVJ0bXBVU0JOdWxsRnJhbWVLaWNrT3V0KF9wQWQsIF9RdWVJZHgsIF9wTnVsbEZyYW1lLCBfZnJhbWVMZW4pCisKKyNkZWZpbmUgR0VUX1RYUklOR19GUkVFTk8oX3BBZCwgX1F1ZUlkeCkJKF9RdWVJZHgpCS8qKF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeFN3RnJlZUlkeCkgKi8KKyNkZWZpbmUgR0VUX01HTVRSSU5HX0ZSRUVOTyhfcEFkKQkJCShfcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gUlggUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICAqCURldmljZSBIYXJkd2FyZSBJbnRlcmZhY2UgUmVsYXRlZCBNQUNSTworICAqLworI2RlZmluZSBSVE1QX0lSUV9JTklUKHBBZCkJCQkJZG97fXdoaWxlKDApCisjZGVmaW5lIFJUTVBfSVJRX0VOQUJMRShwQWQpCQkJZG97fXdoaWxlKDApCisKKy8qCisgICoJTUxNRSBSZWxhdGVkIE1BQ1JPCisgICovCisjZGVmaW5lIFJUTVBfTUxNRV9IQU5ETEVSKHBBZCkJCQlSVFVTQk1sbWVVcChwQWQpCisKKyNkZWZpbmUgUlRNUF9NTE1FX1BSRV9TQU5JVFlfQ0hFQ0socEFkKQkJCQkJCQkJXAorCXsJaWYgKChwQWQtPkNvbW1vbkNmZy5iSGFyZHdhcmVSYWRpbyA9PSBUUlVFKSAmJgkJCQkJXAorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpICYmCQlcCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkpIHsJXAorCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfQ0hFQ0tfR1BJTywgTlVMTCwgMCk7IH0gfQorCisjZGVmaW5lIFJUTVBfTUxNRV9TVEFfUVVJQ0tfUlNQX1dBS0VfVVAocEFkKQlcCisJewlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9RS0VSSU9ESUNfRVhFQ1VULCBOVUxMLCAwKTsJXAorCQlSVFVTQk1sbWVVcChwQWQpOyB9CisKKyNkZWZpbmUgUlRNUF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkKQlcCisJCSAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFU0VUX0NPTkYsIDAsIE5VTEwpOwlcCisJCSAgICAgICAgUlRVU0JNbG1lVXAocEFkKTsKKworI2RlZmluZSBSVE1QX0hBTkRMRV9DT1VOVEVSX01FQVNVUkUoX3BBZCwgX3BFbnRyeSkJCVwKKwl7CVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKF9wQWQsIENNRFRIUkVBRF84MDJfMTFfQ09VTlRFUl9NRUFTVVJFLCBfcEVudHJ5LCBzaXplb2Yoc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSkpOwlcCisJCVJUVVNCTWxtZVVwKF9wQWQpOwkJCQkJCQkJCVwKKwl9CisKKy8qCisgICoJUG93ZXIgU2F2ZSBSZWxhdGVkIE1BQ1JPCisgICovCisjZGVmaW5lIFJUTVBfUFNfUE9MTF9FTlFVRVVFKHBBZCkJCQkJCQlcCisJewlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX1BTUE9MTCk7CVwKKwkJUlRVU0JLaWNrQnVsa091dChwQWQpOyB9CisKKyNkZWZpbmUgUlRNUF9TVEFfRk9SQ0VfV0FLRVVQKF9wQWQsIGJGcm9tVHgpIFwKKwlSVDI4eHhVc2JTdGFBc2ljRm9yY2VXYWtldXAoX3BBZCwgYkZyb21UeCk7CisKKyNkZWZpbmUgUlRNUF9TVEFfU0xFRVBfVEhFTl9BVVRPX1dBS0VVUChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApIFwKKyAgICBSVDI4eHhVc2JTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApOworCisjZGVmaW5lIFJUTVBfU0VUX1BTTV9CSVQoX3BBZCwgX3ZhbCkgXAorCXtcCisJCWlmICgoX3BBZCktPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUCkgXAorCQkJTWxtZVNldFBzbUJpdChfcEFkLCBfdmFsKTtcCisJCWVsc2UgXAorCQl7IFwKKwkJCXUxNiBfcHNtX3ZhbDsgXAorCQkJX3BzbV92YWwgPSBfdmFsOyBcCisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChfcEFkLCBDTURUSFJFQURfU0VUX1BTTV9CSVQsICYoX3BzbV92YWwpLCBzaXplb2YodTE2KSk7IFwKKwkJfVwKKwl9CisKKyNkZWZpbmUgUlRNUF9NTE1FX1JBRElPX09OKHBBZCkgXAorICAgIFJUMjh4eFVzYk1sbWVSYWRpb09uKHBBZCk7CisKKyNkZWZpbmUgUlRNUF9NTE1FX1JBRElPX09GRihwQWQpIFwKKyAgICBSVDI4eHhVc2JNbG1lUmFkaW9PRkYocEFkKTsKKworI2VuZGlmIC8qX19NQUNfVVNCX0hfXyAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0Mjg2MC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0Mjg2MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMGI4MDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvcnQyODYwLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfX1JUMjg2MF9IX18KKyNkZWZpbmUgX19SVDI4NjBfSF9fCisKKyNpbmNsdWRlICJtYWNfcGNpLmgiCisKKyNpZm5kZWYgUlRNUF9QQ0lfU1VQUE9SVAorI2Vycm9yICJGb3IgUlQyODYwLCB5b3Ugc2hvdWxkIGRlZmluZSB0aGUgY29tcGlsZSBmbGFnIC1EUlRNUF9QQ0lfU1VQUE9SVCIKKyNlbmRpZgorCisjaWZuZGVmIFJUTVBfTUFDX1BDSQorI2Vycm9yICJGb3IgUlQyODgwLCB5b3Ugc2hvdWxkIGRlZmluZSB0aGUgY29tcGlsZSBmbGFnIC1EUlRNUF9NQUNfUENJIgorI2VuZGlmCisKKy8qICovCisvKiBEZXZpY2UgSUQgJiBWZW5kb3IgSUQsIHRoZXNlIHZhbHVlcyBzaG91bGQgbWF0Y2ggRUVQUk9NIHZhbHVlICovCisvKiAqLworI2RlZmluZSBOSUMyODYwX1BDSV9ERVZJQ0VfSUQJMHgwNjAxCisjZGVmaW5lIE5JQzI4NjBfUENJZV9ERVZJQ0VfSUQJMHgwNjgxCisjZGVmaW5lIE5JQzI3NjBfUENJX0RFVklDRV9JRAkweDA3MDEJLyogMVQvMlIgQ2FyZGJ1cyA/Pz8gKi8KKyNkZWZpbmUgTklDMjc5MF9QQ0llX0RFVklDRV9JRCAgMHgwNzgxCS8qIDFULzJSIG1pbmlDYXJkICovCisKKyNkZWZpbmUgVkVOX0FXVF9QQ0llX0RFVklDRV9JRAkweDEwNTkKKyNkZWZpbmUgVkVOX0FXVF9QQ0lfVkVORE9SX0lECQkweDFBM0IKKworI2RlZmluZSBFRElNQVhfUENJX1ZFTkRPUl9JRAkJMHgxNDMyCisKKyNlbmRpZiAvKl9fUlQyODYwX0hfXyAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0Mjg3MC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0Mjg3MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNjNmMWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvcnQyODcwLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKyNpZm5kZWYgX19SVDI4NzBfSF9fCisjZGVmaW5lIF9fUlQyODcwX0hfXworCisjaWZkZWYgUlQyODcwCisKKyNpZm5kZWYgUlRNUF9VU0JfU1VQUE9SVAorI2Vycm9yICJGb3IgUlQyODcwLCB5b3Ugc2hvdWxkIGRlZmluZSB0aGUgY29tcGlsZSBmbGFnIC1EUlRNUF9VU0JfU1VQUE9SVCIKKyNlbmRpZgorCisjaWZuZGVmIFJUTVBfTUFDX1VTQgorI2Vycm9yICJGb3IgUlQyODcwLCB5b3Ugc2hvdWxkIGRlZmluZSB0aGUgY29tcGlsZSBmbGFnIC1EUlRNUF9NQUNfVVNCIgorI2VuZGlmCisKKyNpbmNsdWRlICIuLi9ydG1wX3R5cGUuaCIKKyNpbmNsdWRlICJtYWNfdXNiLmgiCisKKy8qI2RlZmluZSBSVE1QX0NISVBfTkFNRSAgICAgICAgICAgICAgICAiUlQyODcwIiAqLworCisjZW5kaWYgLyogUlQyODcwIC8vICovCisjZW5kaWYgLypfX1JUMjg3MF9IX18gLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9ydDMwNzAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9ydDMwNzAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzJjZTcwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0MzA3MC5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisJcnQzMDcwLmgKKworICAgIEFic3RyYWN0OgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpZm5kZWYgX19SVDMwNzBfSF9fCisjZGVmaW5lIF9fUlQzMDcwX0hfXworCisjaWZkZWYgUlQzMDcwCisKKyNpZm5kZWYgUlRNUF9VU0JfU1VQUE9SVAorI2Vycm9yICJGb3IgUlQzMDcwLCB5b3Ugc2hvdWxkIGRlZmluZSB0aGUgY29tcGlsZSBmbGFnIC1EUlRNUF9VU0JfU1VQUE9SVCIKKyNlbmRpZgorCisjaWZuZGVmIFJUTVBfTUFDX1VTQgorI2Vycm9yICJGb3IgUlQzMDcwLCB5b3Ugc2hvdWxkIGRlZmluZSB0aGUgY29tcGlsZSBmbGFnIC1EUlRNUF9NQUNfVVNCIgorI2VuZGlmCisKKyNpZm5kZWYgUlRNUF9SRl9SV19TVVBQT1JUCisjZXJyb3IgIkZvciBSVDMwNzAsIHlvdSBzaG91bGQgZGVmaW5lIHRoZSBjb21waWxlIGZsYWcgLURSVE1QX1JGX1JXX1NVUFBPUlQiCisjZW5kaWYKKworI2lmbmRlZiBSVDMweHgKKyNlcnJvciAiRm9yIFJUMzA3MCwgeW91IHNob3VsZCBkZWZpbmUgdGhlIGNvbXBpbGUgZmxhZyAtRFJUMzB4eCIKKyNlbmRpZgorCisjaW5jbHVkZSAibWFjX3VzYi5oIgorI2luY2x1ZGUgInJ0MzB4eC5oIgorCisvKiAqLworLyogRGV2aWNlIElEICYgVmVuZG9yIElELCB0aGVzZSB2YWx1ZXMgc2hvdWxkIG1hdGNoIEVFUFJPTSB2YWx1ZSAqLworLyogKi8KKworI2VuZGlmIC8qIFJUMzA3MCAvLyAqLworCisjZW5kaWYgLypfX1JUMzA3MF9IX18gLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9ydDMwOTAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9ydDMwOTAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDJiOTM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0MzA5MC5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisJcnQzMDkwLmgKKworICAgIEFic3RyYWN0OgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpZm5kZWYgX19SVDMwOTBfSF9fCisjZGVmaW5lIF9fUlQzMDkwX0hfXworCisjaWZkZWYgUlQzMDkwCisKKyNpZm5kZWYgUlRNUF9QQ0lfU1VQUE9SVAorI2Vycm9yICJGb3IgUlQzMDkwLCB5b3Ugc2hvdWxkIGRlZmluZSB0aGUgY29tcGlsZSBmbGFnIC1EUlRNUF9QQ0lfU1VQUE9SVCIKKyNlbmRpZgorCisjaWZuZGVmIFJUTVBfTUFDX1BDSQorI2Vycm9yICJGb3IgUlQzMDkwLCB5b3Ugc2hvdWxkIGRlZmluZSB0aGUgY29tcGlsZSBmbGFnIC1EUlRNUF9NQUNfUENJIgorI2VuZGlmCisKKyNpZm5kZWYgUlRNUF9SRl9SV19TVVBQT1JUCisjZXJyb3IgIkZvciBSVDMwOTAsIHlvdSBzaG91bGQgZGVmaW5lIHRoZSBjb21waWxlIGZsYWcgLURSVE1QX1JGX1JXX1NVUFBPUlQiCisjZW5kaWYKKworI2lmbmRlZiBSVDMweHgKKyNlcnJvciAiRm9yIFJUMzA5MCwgeW91IHNob3VsZCBkZWZpbmUgdGhlIGNvbXBpbGUgZmxhZyAtRFJUMzB4eCIKKyNlbmRpZgorCisjZGVmaW5lIFBDSUVfUFNfU1VQUE9SVAorCisjaW5jbHVkZSAibWFjX3BjaS5oIgorI2luY2x1ZGUgInJ0MzB4eC5oIgorCisvKiAqLworLyogRGV2aWNlIElEICYgVmVuZG9yIElELCB0aGVzZSB2YWx1ZXMgc2hvdWxkIG1hdGNoIEVFUFJPTSB2YWx1ZSAqLworLyogKi8KKyNkZWZpbmUgTklDMzA5MF9QQ0llX0RFVklDRV9JRCAgMHgzMDkwCS8qIDFULzFSIG1pbmlDYXJkICovCisjZGVmaW5lIE5JQzMwOTFfUENJZV9ERVZJQ0VfSUQgIDB4MzA5MQkvKiAxVC8yUiBtaW5pQ2FyZCAqLworI2RlZmluZSBOSUMzMDkyX1BDSWVfREVWSUNFX0lEICAweDMwOTIJLyogMlQvMlIgbWluaUNhcmQgKi8KKworI2VuZGlmIC8qIFJUMzA5MCAvLyAqLworCisjZW5kaWYgLypfX1JUMzA5MF9IX18gLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9ydDMweHguaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9ydDMweHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmUxZDcyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0MzB4eC5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisJcnQzMHh4LmgKKworICAgIEFic3RyYWN0OgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpZm5kZWYgX19SVDMwWFhfSF9fCisjZGVmaW5lIF9fUlQzMFhYX0hfXworCisjaWZkZWYgUlQzMHh4CisKK2V4dGVybiBzdHJ1Y3QgcnRfcmVnX3BhaXIgUlQzMHh4X1JGUmVnVGFibGVbXTsKK2V4dGVybiB1OCBOVU1fUkZfUkVHX1BBUk1TOworCisjZW5kaWYgLyogUlQzMHh4IC8vICovCisKKyNlbmRpZiAvKl9fUlQzMFhYX0hfXyAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0bXBfbWFjLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvcnRtcF9tYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmE3MjU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0bXBfbWFjLmgKQEAgLTAsMCArMSwxMzA3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXJ0bXBfbWFjLmgKKworCUFic3RyYWN0OgorCVJhbGluayBXaXJlbGVzcyBDaGlwIE1BQyByZWxhdGVkIGRlZmluaXRpb24gJiBzdHJ1Y3R1cmVzCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCSAgV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmIF9fUlRNUF9NQUNfSF9fCisjZGVmaW5lIF9fUlRNUF9NQUNfSF9fCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogVFggLyBSWCByaW5nIGRlc2NyaXB0b3IgZm9ybWF0ICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogdGhlIGZpcnN0IDI0LWJ5dGUgaW4gVFhEIGlzIGNhbGxlZCBUWElORk8gYW5kIHdpbGwgYmUgRE1BZWQgdG8gTUFDIGJsb2NrIHRocm91Z2ggVFhGSUZPLiAqLworLyogTUFDIGJsb2NrIHVzZSB0aGlzIFRYSU5GTyB0byBjb250cm9sIHRoZSB0cmFuc21pc3Npb24gYmVoYXZpb3Igb2YgdGhpcyBmcmFtZS4gKi8KKyNkZWZpbmUgRklGT19NR01UICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEZJRk9fSENDQSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBGSUZPX0VEQ0EgICAgICAgICAgICAgICAgIDIKKworLyogKi8KKy8qIFRYRCBXaXJlbGVzcyBJbmZvcm1hdGlvbiBmb3JtYXQgZm9yIFR4IHJpbmcgYW5kIE1nbXQgUmluZyAqLworLyogKi8KKy8qdHhvcCA6IGZvciB0eG9wIG1vZGUgKi8KKy8qIDA6dHhvcCBmb3IgdGhlIE1QRFUgZnJhbWUgd2lsbCBiZSBoYW5kbGVzIGJ5IEFTSUMgYnkgcmVnaXN0ZXIgKi8KKy8qIDEvMi8zOnRoZSBNUERVIGZyYW1lIGlzIHNlbmQgYWZ0ZXIgUElGUy9iYWNrb2ZmL1NJRlMgKi8KK3N0cnVjdCBQQUNLRUQgcnRfdHh3aSB7CisJLyogV29yZCAwICovCisJLyogZXg6IDAwIDAzIDAwIDQwIG1lYW5zIHR4b3AgPSAzLCBQSFlNT0RFID0gMSAqLworCXUzMiBGUkFHOjE7CQkvKiAxIHRvIGluZm9ybSBUS0lQIGVuZ2luZSB0aGlzIGlzIGEgZnJhZ21lbnQuICovCisJdTMyIE1JTU9wczoxOwkvKiB0aGUgcmVtb3RlIHBlZXIgaXMgaW4gZHluYW1pYyBNSU1PLVBTIG1vZGUgKi8KKwl1MzIgQ0ZBQ0s6MTsKKwl1MzIgVFM6MTsKKworCXUzMiBBTVBEVToxOworCXUzMiBNcGR1RGVuc2l0eTozOworCXUzMiB0eG9wOjI7CQkvKkZPUiAiVEhJUyIgZnJhbWUuIDA6SFQgVFhPUCBydWxlICwgMTpQSUZTIFRYICwyOkJhY2tvZmYsIDM6c2lmcyBvbmx5IHdoZW4gcHJldmlvdXMgZnJhbWUgZXhjaGFuZ2UgaXMgc3VjY2Vzc2Z1bC4gKi8KKwl1MzIgcnN2OjY7CisKKwl1MzIgTUNTOjc7CisJdTMyIEJXOjE7CQkvKmNoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IeiAqLworCXUzMiBTaG9ydEdJOjE7CisJdTMyIFNUQkM6MjsJCS8qIDE6IFNUQkMgc3VwcG9ydCBNQ1MgPTAtNywgICAyLDMgOiBSRVNFUlZFICovCisJdTMyIElmczoxOwkJLyogKi8KKy8qICAgICAgdTMyICAgICAgICAgIHJzdjI6MjsgLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHogKi8KKwl1MzIgcnN2MjoxOworCXUzMiBUeEJGOjE7CQkvKiAzKjMgKi8KKwl1MzIgUEhZTU9ERToyOworCS8qIFdvcmQxICovCisJLyogZXg6ICAxYyBmZiAzOCAwMCBtZWFucyBBQ0s9MCwgQkFXaW5TaXplPTcsIE1QRFV0b3RhbEJ5dGVDb3VudCA9IDB4MzggKi8KKwl1MzIgQUNLOjE7CisJdTMyIE5TRVE6MTsKKwl1MzIgQkFXaW5TaXplOjY7CisJdTMyIFdpcmVsZXNzQ2xpSUQ6ODsKKwl1MzIgTVBEVXRvdGFsQnl0ZUNvdW50OjEyOworCXUzMiBQYWNrZXRJZDo0OworCS8qV29yZDIgKi8KKwl1MzIgSVY7CisJLypXb3JkMyAqLworCXUzMiBFSVY7Cit9OworCisvKiAqLworLyogUlhXSSB3aXJlbGVzcyBpbmZvcm1hdGlvbiBmb3JtYXQsIGluIFBCRi4gaW52aXNpYmxlIGluIGRyaXZlci4gKi8KKy8qICovCitzdHJ1Y3QgUEFDS0VEIHJ0X3J4d2kgeworCS8qIFdvcmQgMCAqLworCXUzMiBXaXJlbGVzc0NsaUlEOjg7CisJdTMyIEtleUluZGV4OjI7CisJdTMyIEJTU0lEOjM7CisJdTMyIFVERjozOworCXUzMiBNUERVdG90YWxCeXRlQ291bnQ6MTI7CisJdTMyIFRJRDo0OworCS8qIFdvcmQgMSAqLworCXUzMiBGUkFHOjQ7CisJdTMyIFNFUVVFTkNFOjEyOworCXUzMiBNQ1M6NzsKKwl1MzIgQlc6MTsKKwl1MzIgU2hvcnRHSToxOworCXUzMiBTVEJDOjI7CisJdTMyIHJzdjozOworCXUzMiBQSFlNT0RFOjI7CS8qIDE6IHRoaXMgUlggZnJhbWUgaXMgdW5pY2FzdCB0byBtZSAqLworCS8qV29yZDIgKi8KKwl1MzIgUlNTSTA6ODsKKwl1MzIgUlNTSTE6ODsKKwl1MzIgUlNTSTI6ODsKKwl1MzIgcnN2MTo4OworCS8qV29yZDMgKi8KKwl1MzIgU05SMDo4OworCXUzMiBTTlIxOjg7CisJdTMyIEZPRkZTRVQ6ODsJLyogUlQzNXh4ICovCisJdTMyIHJzdjI6ODsKKwkvKnUzMiAgICAgICAgICAgICAgICByc3YyOjE2OyAqLworfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiBSZWdpc3RlciBmb3JtYXQgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiAqLworLyogU0NIL0RNQSByZWdpc3RlcnMgLSBiYXNlIGFkZHJlc3MgMHgwMjAwICovCisvKiAqLworLyogSU5UX1NPVVJDRV9DU1I6IEludGVycnVwdCBzb3VyY2UgcmVnaXN0ZXIuIFdyaXRlIG9uZSB0byBjbGVhciBjb3JyZXNwb25kaW5nIGJpdCAqLworLyogKi8KKyNkZWZpbmUgRE1BX0NTUjAJCTB4MjAwCisjZGVmaW5lIElOVF9TT1VSQ0VfQ1NSCQkweDIwMAordHlwZWRlZiB1bmlvbiBfSU5UX1NPVVJDRV9DU1JfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBSeERlbGF5SU5UOjE7CisJCXUzMiBUeERlbGF5SU5UOjE7CisJCXUzMiBSeERvbmU6MTsKKwkJdTMyIEFjMERtYURvbmU6MTsJLyo0ICovCisJCXUzMiBBYzFEbWFEb25lOjE7CisJCXUzMiBBYzJEbWFEb25lOjE7CisJCXUzMiBBYzNEbWFEb25lOjE7CisJCXUzMiBIY2NhRG1hRG9uZToxOwkvKiBiaXQ3ICovCisJCXUzMiBNZ210RG1hRG9uZToxOworCQl1MzIgTUNVQ29tbWFuZElOVDoxOwkvKmJpdCA5ICovCisJCXUzMiBSeFR4Q29oZXJlbnQ6MTsKKwkJdTMyIFRCVFRJbnQ6MTsKKwkJdTMyIFByZVRCVFQ6MTsKKwkJdTMyIFRYRmlmb1N0YXR1c0ludDoxOwkvKkZJRk8gU3RhdGlzdGljcyBpcyBmdWxsLCBzdyBzaG91bGQgcmVhZCAweDE3MWMgKi8KKwkJdTMyIEF1dG9XYWtldXA6MTsJLypiaXQxNCAqLworCQl1MzIgR1BUaW1lcjoxOworCQl1MzIgUnhDb2hlcmVudDoxOwkvKmJpdDE2ICovCisJCXUzMiBUeENvaGVyZW50OjE7CisJCXUzMiA6IDE0OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IElOVF9TT1VSQ0VfQ1NSX1NUUlVDLCAqUElOVF9TT1VSQ0VfQ1NSX1NUUlVDOworCisvKiAqLworLyogSU5UX01BU0tfQ1NSOiAgIEludGVycnVwdCBNQVNLIHJlZ2lzdGVyLiAgIDE6IHRoZSBpbnRlcnJ1cHQgaXMgbWFzayBPRkYgKi8KKy8qICovCisjZGVmaW5lIElOVF9NQVNLX0NTUiAgICAgICAgMHgyMDQKK3R5cGVkZWYgdW5pb24gX0lOVF9NQVNLX0NTUl9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIFJYRGVsYXlfSU5UX01TSzoxOworCQl1MzIgVHhEZWxheToxOworCQl1MzIgUnhEb25lOjE7CisJCXUzMiBBYzBEbWFEb25lOjE7CisJCXUzMiBBYzFEbWFEb25lOjE7CisJCXUzMiBBYzJEbWFEb25lOjE7CisJCXUzMiBBYzNEbWFEb25lOjE7CisJCXUzMiBIY2NhRG1hRG9uZToxOworCQl1MzIgTWdtdERtYURvbmU6MTsKKwkJdTMyIE1DVUNvbW1hbmRJTlQ6MTsKKwkJdTMyIDogMjA7CisJCXUzMiBSeENvaGVyZW50OjE7CisJCXUzMiBUeENvaGVyZW50OjE7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gSU5UX01BU0tfQ1NSX1NUUlVDLCAqUElOVF9NQVNLX0NTUl9TVFJVQzsKKworI2RlZmluZSBXUERNQV9HTE9fQ0ZHCTB4MjA4Cit0eXBlZGVmIHVuaW9uIF9XUERNQV9HTE9fQ0ZHX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgRW5hYmxlVHhETUE6MTsKKwkJdTMyIFR4RE1BQnVzeToxOworCQl1MzIgRW5hYmxlUnhETUE6MTsKKwkJdTMyIFJ4RE1BQnVzeToxOworCQl1MzIgV1BETUFCdXJzdFNJWkU6MjsKKwkJdTMyIEVuVFhXcml0ZUJhY2tERE9ORToxOworCQl1MzIgQmlnRW5kaWFuOjE7CisJCXUzMiBSWEhkclNjYXRlcjo4OworCQl1MzIgSERSX1NFR19MRU46MTY7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gV1BETUFfR0xPX0NGR19TVFJVQywgKlBXUERNQV9HTE9fQ0ZHX1NUUlVDOworCisjZGVmaW5lIFdQRE1BX1JTVF9JRFgJMHgyMGMKK3R5cGVkZWYgdW5pb24gX1dQRE1BX1JTVF9JRFhfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBSU1RfRFRYX0lEWDA6MTsKKwkJdTMyIFJTVF9EVFhfSURYMToxOworCQl1MzIgUlNUX0RUWF9JRFgyOjE7CisJCXUzMiBSU1RfRFRYX0lEWDM6MTsKKwkJdTMyIFJTVF9EVFhfSURYNDoxOworCQl1MzIgUlNUX0RUWF9JRFg1OjE7CisJCXUzMiByc3Y6MTA7CisJCXUzMiBSU1RfRFJYX0lEWDA6MTsKKwkJdTMyIDogMTU7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gV1BETUFfUlNUX0lEWF9TVFJVQywgKlBXUERNQV9SU1RfSURYX1NUUlVDOworI2RlZmluZSBERUxBWV9JTlRfQ0ZHICAweDAyMTAKK3R5cGVkZWYgdW5pb24gX0RFTEFZX0lOVF9DRkdfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBSWE1BWF9QVElNRTo4OworCQl1MzIgUlhNQVhfUElOVDo3OworCQl1MzIgUlhETFlfSU5UX0VOOjE7CisJCXUzMiBUWE1BWF9QVElNRTo4OworCQl1MzIgVFhNQVhfUElOVDo3OworCQl1MzIgVFhETFlfSU5UX0VOOjE7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gREVMQVlfSU5UX0NGR19TVFJVQywgKlBERUxBWV9JTlRfQ0ZHX1NUUlVDOworI2RlZmluZSBXTU1fQUlGU05fQ0ZHICAgMHgwMjE0Cit0eXBlZGVmIHVuaW9uIF9BSUZTTl9DU1JfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBBaWZzbjA6NDsJLyogZm9yIEFDX0JFICovCisJCXUzMiBBaWZzbjE6NDsJLyogZm9yIEFDX0JLICovCisJCXUzMiBBaWZzbjI6NDsJLyogZm9yIEFDX1ZJICovCisJCXUzMiBBaWZzbjM6NDsJLyogZm9yIEFDX1ZPICovCisJCXUzMiBSc3Y6MTY7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gQUlGU05fQ1NSX1NUUlVDLCAqUEFJRlNOX0NTUl9TVFJVQzsKKy8qICovCisvKiBDV01JTl9DU1I6IENXbWluIGZvciBlYWNoIEVEQ0EgQUMgKi8KKy8qICovCisjZGVmaW5lIFdNTV9DV01JTl9DRkcgICAweDAyMTgKK3R5cGVkZWYgdW5pb24gX0NXTUlOX0NTUl9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIEN3bWluMDo0OwkvKiBmb3IgQUNfQkUgKi8KKwkJdTMyIEN3bWluMTo0OwkvKiBmb3IgQUNfQksgKi8KKwkJdTMyIEN3bWluMjo0OwkvKiBmb3IgQUNfVkkgKi8KKwkJdTMyIEN3bWluMzo0OwkvKiBmb3IgQUNfVk8gKi8KKwkJdTMyIFJzdjoxNjsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBDV01JTl9DU1JfU1RSVUMsICpQQ1dNSU5fQ1NSX1NUUlVDOworCisvKiAqLworLyogQ1dNQVhfQ1NSOiBDV21pbiBmb3IgZWFjaCBFRENBIEFDICovCisvKiAqLworI2RlZmluZSBXTU1fQ1dNQVhfQ0ZHICAgMHgwMjFjCit0eXBlZGVmIHVuaW9uIF9DV01BWF9DU1JfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBDd21heDA6NDsJLyogZm9yIEFDX0JFICovCisJCXUzMiBDd21heDE6NDsJLyogZm9yIEFDX0JLICovCisJCXUzMiBDd21heDI6NDsJLyogZm9yIEFDX1ZJICovCisJCXUzMiBDd21heDM6NDsJLyogZm9yIEFDX1ZPICovCisJCXUzMiBSc3Y6MTY7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gQ1dNQVhfQ1NSX1NUUlVDLCAqUENXTUFYX0NTUl9TVFJVQzsKKworLyogKi8KKy8qIEFDX1RYT1BfQ1NSMDogQUNfQksvQUNfQkUgVFhPUCByZWdpc3RlciAqLworLyogKi8KKyNkZWZpbmUgV01NX1RYT1AwX0NGRyAgICAweDAyMjAKK3R5cGVkZWYgdW5pb24gX0FDX1RYT1BfQ1NSMF9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTE2IEFjMFR4b3A7CS8qIGZvciBBQ19CSywgaW4gdW5pdCBvZiAzMnVzICovCisJCXUxNiBBYzFUeG9wOwkvKiBmb3IgQUNfQkUsIGluIHVuaXQgb2YgMzJ1cyAqLworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IEFDX1RYT1BfQ1NSMF9TVFJVQywgKlBBQ19UWE9QX0NTUjBfU1RSVUM7CisKKy8qICovCisvKiBBQ19UWE9QX0NTUjE6IEFDX1ZPL0FDX1ZJIFRYT1AgcmVnaXN0ZXIgKi8KKy8qICovCisjZGVmaW5lIFdNTV9UWE9QMV9DRkcgICAgMHgwMjI0Cit0eXBlZGVmIHVuaW9uIF9BQ19UWE9QX0NTUjFfU1RSVUMgeworCXN0cnVjdCB7CisJCXUxNiBBYzJUeG9wOwkvKiBmb3IgQUNfVkksIGluIHVuaXQgb2YgMzJ1cyAqLworCQl1MTYgQWMzVHhvcDsJLyogZm9yIEFDX1ZPLCBpbiB1bml0IG9mIDMydXMgKi8KKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBBQ19UWE9QX0NTUjFfU1RSVUMsICpQQUNfVFhPUF9DU1IxX1NUUlVDOworCisjZGVmaW5lIFJJTkdSRUdfRElGRgkJCTB4MTAKKyNkZWZpbmUgR1BJT19DVFJMX0NGRyAgICAweDAyMjgJLypNQUNfQ1NSMTMgKi8KKyNkZWZpbmUgTUNVX0NNRF9DRkcgICAgMHgwMjJjCisjZGVmaW5lIFRYX0JBU0VfUFRSMCAgICAgMHgwMjMwCS8qQUNfQksgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFRYX01BWF9DTlQwICAgICAgMHgwMjM0CisjZGVmaW5lIFRYX0NUWF9JRFgwICAgICAgIDB4MDIzOAorI2RlZmluZSBUWF9EVFhfSURYMCAgICAgIDB4MDIzYworI2RlZmluZSBUWF9CQVNFX1BUUjEgICAgIDB4MDI0MAkvKkFDX0JFIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBUWF9NQVhfQ05UMSAgICAgIDB4MDI0NAorI2RlZmluZSBUWF9DVFhfSURYMSAgICAgICAweDAyNDgKKyNkZWZpbmUgVFhfRFRYX0lEWDEgICAgICAweDAyNGMKKyNkZWZpbmUgVFhfQkFTRV9QVFIyICAgICAweDAyNTAJLypBQ19WSSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgVFhfTUFYX0NOVDIgICAgICAweDAyNTQKKyNkZWZpbmUgVFhfQ1RYX0lEWDIgICAgICAgMHgwMjU4CisjZGVmaW5lIFRYX0RUWF9JRFgyICAgICAgMHgwMjVjCisjZGVmaW5lIFRYX0JBU0VfUFRSMyAgICAgMHgwMjYwCS8qQUNfVk8gYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFRYX01BWF9DTlQzICAgICAgMHgwMjY0CisjZGVmaW5lIFRYX0NUWF9JRFgzICAgICAgIDB4MDI2OAorI2RlZmluZSBUWF9EVFhfSURYMyAgICAgIDB4MDI2YworI2RlZmluZSBUWF9CQVNFX1BUUjQgICAgIDB4MDI3MAkvKkhDQ0EgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFRYX01BWF9DTlQ0ICAgICAgMHgwMjc0CisjZGVmaW5lIFRYX0NUWF9JRFg0ICAgICAgIDB4MDI3OAorI2RlZmluZSBUWF9EVFhfSURYNCAgICAgIDB4MDI3YworI2RlZmluZSBUWF9CQVNFX1BUUjUgICAgIDB4MDI4MAkvKk1HTVQgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lICBUWF9NQVhfQ05UNSAgICAgMHgwMjg0CisjZGVmaW5lIFRYX0NUWF9JRFg1ICAgICAgIDB4MDI4OAorI2RlZmluZSBUWF9EVFhfSURYNSAgICAgIDB4MDI4YworI2RlZmluZSBUWF9NR01UTUFYX0NOVCAgICAgIFRYX01BWF9DTlQ1CisjZGVmaW5lIFRYX01HTVRDVFhfSURYICAgICAgIFRYX0NUWF9JRFg1CisjZGVmaW5lIFRYX01HTVREVFhfSURYICAgICAgVFhfRFRYX0lEWDUKKyNkZWZpbmUgUlhfQkFTRV9QVFIgICAgIDB4MDI5MAkvKlJYIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBSWF9NQVhfQ05UICAgICAgMHgwMjk0CisjZGVmaW5lIFJYX0NSWF9JRFggICAgICAgMHgwMjk4CisjZGVmaW5lIFJYX0RSWF9JRFggICAgICAweDAyOWMKKworI2RlZmluZSBVU0JfRE1BX0NGRyAgICAgIDB4MDJhMAordHlwZWRlZiB1bmlvbiBfVVNCX0RNQV9DRkdfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBSeEJ1bGtBZ2dUT3V0Ojg7CS8qUnggQnVsayBBZ2dyZWdhdGlvbiBUaW1lT3V0ICBpbiB1bml0IG9mIDMzbnMgKi8KKwkJdTMyIFJ4QnVsa0FnZ0xtdDo4OwkvKlJ4IEJ1bGsgQWdncmVnYXRpb24gTGltaXQgIGluIHVuaXQgb2YgMjU2IGJ5dGVzICovCisJCXUzMiBwaHljbGVhcjoxOwkvKnBoeSB3YXRjaCBkb2cgZW5hYmxlLiB3cml0ZSAxICovCisJCXUzMiByc3Y6MjsKKwkJdTMyIFR4Q2xlYXI6MTsJLypDbGVhciBVU0IgRE1BIFRYIHBhdGggKi8KKwkJdTMyIFR4b3BIYWx0OjE7CS8qSGFsdCBUWE9QIGNvdW50IGRvd24gd2hlbiBUWCBidWZmZXIgaXMgZnVsbC4gKi8KKwkJdTMyIFJ4QnVsa0FnZ0VuOjE7CS8qRW5hYmxlIFJ4IEJ1bGsgQWdncmVnYXRpb24gKi8KKwkJdTMyIFJ4QnVsa0VuOjE7CS8qRW5hYmxlIFVTQiBETUEgUnggKi8KKwkJdTMyIFR4QnVsa0VuOjE7CS8qRW5hYmxlIFVTQiBETUEgVHggKi8KKwkJdTMyIEVwb3V0VmFsaWQ6NjsJLypPVVQgZW5kcG9pbnQgZGF0YSB2YWxpZCAqLworCQl1MzIgUnhCdXN5OjE7CS8qVVNCIERNQSBSWCBGU00gYnVzeSAqLworCQl1MzIgVHhCdXN5OjE7CS8qVVNCIERNQSBUWCBGU00gYnVzeSAqLworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFVTQl9ETUFfQ0ZHX1NUUlVDLCAqUFVTQl9ETUFfQ0ZHX1NUUlVDOworCisvKiAqLworLyogIDMgIFBCRiAgcmVnaXN0ZXJzICovCisvKiAqLworLyogKi8KKy8qIE1vc3QgYXJlIGZvciBkZWJ1Zy4gRHJpdmVyIGRvZXNuJ3QgdG91Y2ggUEJGIHJlZ2lzdGVyLiAqLworI2RlZmluZSBQQkZfU1lTX0NUUkwJIDB4MDQwMAorI2RlZmluZSBQQkZfQ0ZHICAgICAgICAgICAgICAgICAweDA0MDgKKyNkZWZpbmUgUEJGX01BWF9QQ05UCSAweDA0MEMKKyNkZWZpbmUgUEJGX0NUUkwJCTB4MDQxMAorI2RlZmluZSBQQkZfSU5UX1NUQQkgMHgwNDE0CisjZGVmaW5lIFBCRl9JTlRfRU5BCSAweDA0MTgKKyNkZWZpbmUgVFhSWFFfUENOVAkgMHgwNDM4CisjZGVmaW5lIFBCRl9EQkcJCQkgMHgwNDNjCisjZGVmaW5lIFBCRl9DQVBfQ1RSTCAgICAgMHgwNDQwCisKKyNpZmRlZiBSVDMweHgKKyNpZmRlZiBSVE1QX0VGVVNFX1NVUFBPUlQKKy8qIGVGdXNlIHJlZ2lzdGVycyAqLworI2RlZmluZSBFRlVTRV9DVFJMCQkJCTB4MDU4MAorI2RlZmluZSBFRlVTRV9EQVRBMAkJCQkweDA1OTAKKyNkZWZpbmUgRUZVU0VfREFUQTEJCQkJMHgwNTk0CisjZGVmaW5lIEVGVVNFX0RBVEEyCQkJCTB4MDU5OAorI2RlZmluZSBFRlVTRV9EQVRBMwkJCQkweDA1OWMKKyNlbmRpZiAvKiBSVE1QX0VGVVNFX1NVUFBPUlQgLy8gKi8KKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KKworI2RlZmluZSBPU0NfQ1RSTAkJMHg1YTQKKyNkZWZpbmUgUENJRV9QSFlfVFhfQVRURU5VQVRJT05fQ1RSTAkweDA1QzgKKyNkZWZpbmUgTERPX0NGRzAJCQkJMHgwNWQ0CisjZGVmaW5lIEdQSU9fU1dJVENICQkJCTB4MDVkYworCisvKiAqLworLyogIDQgIE1BQyAgcmVnaXN0ZXJzICovCisvKiAqLworLyogKi8KKy8qICA0LjEgTUFDIFNZU1RFTSAgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDEwMDApICovCisvKiAqLworI2RlZmluZSBNQUNfQ1NSMCAgICAgICAgICAgIDB4MTAwMAordHlwZWRlZiB1bmlvbiBfQVNJQ19WRVJfSURfU1RSVUMgeworCXN0cnVjdCB7CisJCXUxNiBBU0lDUmV2OwkvKiByZXZlcnNpb24gIDogMCAqLworCQl1MTYgQVNJQ1ZlcjsJLyogdmVyc2lvbiA6IDI4NjAgKi8KKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBBU0lDX1ZFUl9JRF9TVFJVQywgKlBBU0lDX1ZFUl9JRF9TVFJVQzsKKyNkZWZpbmUgTUFDX1NZU19DVFJMICAgICAgICAgICAgMHgxMDA0CS8qTUFDX0NTUjEgKi8KKyNkZWZpbmUgTUFDX0FERFJfRFcwCQkJCTB4MTAwOAkvKiBNQUMgQUREUiBEVzAgKi8KKyNkZWZpbmUgTUFDX0FERFJfRFcxCQkJIDB4MTAwYwkvKiBNQUMgQUREUiBEVzEgKi8KKy8qICovCisvKiBNQUNfQ1NSMjogU1RBIE1BQyByZWdpc3RlciAwICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfTUFDX0RXMF9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTggQnl0ZTA7CS8qIE1BQyBhZGRyZXNzIGJ5dGUgMCAqLworCQl1OCBCeXRlMTsJLyogTUFDIGFkZHJlc3MgYnl0ZSAxICovCisJCXU4IEJ5dGUyOwkvKiBNQUMgYWRkcmVzcyBieXRlIDIgKi8KKwkJdTggQnl0ZTM7CS8qIE1BQyBhZGRyZXNzIGJ5dGUgMyAqLworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IE1BQ19EVzBfU1RSVUMsICpQTUFDX0RXMF9TVFJVQzsKKworLyogKi8KKy8qIE1BQ19DU1IzOiBTVEEgTUFDIHJlZ2lzdGVyIDEgKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIF9NQUNfRFcxX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1OCBCeXRlNDsJLyogTUFDIGFkZHJlc3MgYnl0ZSA0ICovCisJCXU4IEJ5dGU1OwkvKiBNQUMgYWRkcmVzcyBieXRlIDUgKi8KKwkJdTggVTJNZU1hc2s7CisJCXU4IFJzdmQxOworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IE1BQ19EVzFfU1RSVUMsICpQTUFDX0RXMV9TVFJVQzsKKworI2RlZmluZSBNQUNfQlNTSURfRFcwCQkJCTB4MTAxMAkvKiBNQUMgQlNTSUQgRFcwICovCisjZGVmaW5lIE1BQ19CU1NJRF9EVzEJCQkJMHgxMDE0CS8qIE1BQyBCU1NJRCBEVzEgKi8KKworLyogKi8KKy8qIE1BQ19DU1I1OiBCU1NJRCByZWdpc3RlciAxICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfTUFDX0NTUjVfU1RSVUMgeworCXN0cnVjdCB7CisJCXU4IEJ5dGU0OwkvKiBCU1NJRCBieXRlIDQgKi8KKwkJdTggQnl0ZTU7CS8qIEJTU0lEIGJ5dGUgNSAqLworCQl1MTYgQnNzSWRNYXNrOjI7CS8qIDA6IG9uZSBCU1NJRCwgMTA6IDQgQlNTSUQsICAwMTogMiBCU1NJRCAsIDExOiA4QlNTSUQgKi8KKwkJdTE2IE1Cc3NCY25OdW06MzsKKwkJdTE2IFJzdmQ6MTE7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gTUFDX0NTUjVfU1RSVUMsICpQTUFDX0NTUjVfU1RSVUM7CisKKyNkZWZpbmUgTUFYX0xFTl9DRkcgICAgICAgICAgICAgIDB4MTAxOAkvKiBydDI4NjBiIG1heCAxNmsgYnl0ZXMuIGJpdDEyOjEzIE1heGltdW0gUFNEVSBsZW5ndGggKHBvd2VyIGZhY3RvcikgMDoyXjEzLCAxOjJeMTQsIDI6Ml4xNSwgMzoyXjE2ICovCisjZGVmaW5lIEJCUF9DU1JfQ0ZHCQkJMHgxMDFjCS8qICovCisvKiAqLworLyogQkJQX0NTUl9DRkc6IEJCUCBzZXJpYWwgY29udHJvbCByZWdpc3RlciAqLworLyogKi8KK3R5cGVkZWYgdW5pb24gX0JCUF9DU1JfQ0ZHX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgVmFsdWU6ODsJLyogUmVnaXN0ZXIgICAgIHZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAgKi8KKwkJdTMyIFJlZ051bTo4OwkvKiBTZWxlY3RlZCAgICAgQkJQICAgICByZWdpc3RlciAqLworCQl1MzIgZlJlYWQ6MTsJLyogMDogV3JpdGUgQkJQLCAxOiBSZWFkIEJCUCAqLworCQl1MzIgQnVzeToxOwkvKiAxOiBBU0lDIGlzIGJ1c3kgZXhlY3V0ZSBCQlAgcHJvZ3JhbW1pbmcuICovCisJCXUzMiBCQlBfUEFSX0RVUjoxOwkvKiAwOiA0IE1BQyBjbG9jayBjeWNsZXMgIDE6IDggTUFDIGNsb2NrIGN5Y2xlcyAqLworCQl1MzIgQkJQX1JXX01PREU6MTsJLyogMDogdXNlIHNlcmlhbCBtb2RlICAxOnBhcmFsbGVsICovCisJCXUzMiA6IDEyOworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IEJCUF9DU1JfQ0ZHX1NUUlVDLCAqUEJCUF9DU1JfQ0ZHX1NUUlVDOworI2RlZmluZSBSRl9DU1JfQ0ZHMAkJCTB4MTAyMAorLyogKi8KKy8qIFJGX0NTUl9DRkc6IFJGIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIF9SRl9DU1JfQ0ZHMF9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIFJlZ0lkQW5kQ29udGVudDoyNDsJLyogUmVnaXN0ZXIgICAgIHZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAgKi8KKwkJdTMyIGJpdHdpZHRoOjU7CS8qIFNlbGVjdGVkICAgICBCQlAgICAgIHJlZ2lzdGVyICovCisJCXUzMiBTdGFuZGJ5TW9kZToxOwkvKiAwOiBoaWdoIHdoZW4gc3RhbmQgYnkgMTogbG93IHdoZW4gc3RhbmRieSAqLworCQl1MzIgU2VsOjE7CS8qIDA6UkZfTEUwIGFjdGl2YXRlICAxOlJGX0xFMSBhY3RpdmF0ZSAqLworCQl1MzIgQnVzeToxOwkvKiAwOiBpZGxlIDE6IDhidXN5ICovCisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gUkZfQ1NSX0NGRzBfU1RSVUMsICpQUkZfQ1NSX0NGRzBfU1RSVUM7CisjZGVmaW5lIFJGX0NTUl9DRkcxCQkJMHgxMDI0Cit0eXBlZGVmIHVuaW9uIF9SRl9DU1JfQ0ZHMV9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIFJlZ0lkQW5kQ29udGVudDoyNDsJLyogUmVnaXN0ZXIgICAgIHZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAgKi8KKwkJdTMyIFJGR2FwOjU7CS8qIEdhcCBiZXR3ZWVuIEJCX0NPTlRST0xfUkYgYW5kIFJGX0xFLiAwOiAzIHN5c3RlbSBjbG9jayBjeWNsZSAoMzcuNXVzZWMpIDE6IDUgc3lzdGVtIGNsb2NrIGN5Y2xlICg2Mi41dXNlYykgKi8KKwkJdTMyIHJzdjo3OwkvKiAwOiBpZGxlIDE6IDhidXN5ICovCisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gUkZfQ1NSX0NGRzFfU1RSVUMsICpQUkZfQ1NSX0NGRzFfU1RSVUM7CisjZGVmaW5lIFJGX0NTUl9DRkcyCQkJMHgxMDI4CS8qICovCit0eXBlZGVmIHVuaW9uIF9SRl9DU1JfQ0ZHMl9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIFJlZ0lkQW5kQ29udGVudDoyNDsJLyogUmVnaXN0ZXIgICAgIHZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAgKi8KKwkJdTMyIHJzdjo4OwkvKiAwOiBpZGxlIDE6IDhidXN5ICovCisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gUkZfQ1NSX0NGRzJfU1RSVUMsICpQUkZfQ1NSX0NGRzJfU1RSVUM7CisjZGVmaW5lIExFRF9DRkcJCQkJMHgxMDJjCS8qICBNQUNfQ1NSMTQgKi8KK3R5cGVkZWYgdW5pb24gX0xFRF9DRkdfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBPblBlcmlvZDo4OwkvKiBibGlua2luZyBvbiBwZXJpb2QgdW5pdCAxbXMgKi8KKwkJdTMyIE9mZlBlcmlvZDo4OwkvKiBibGlua2luZyBvZmYgcGVyaW9kIHVuaXQgMW1zICovCisJCXUzMiBTbG93QmxpbmtQZXJpb2Q6NjsJLyogc2xvdyBibGlua2luZyBwZXJpb2QuIHVuaXQ6MW1zICovCisJCXUzMiByc3Y6MjsKKwkJdTMyIFJMZWRNb2RlOjI7CS8qIHJlZCBMZWQgTW9kZSAgICAwOiBvZmYxOiBibGlua2luZyB1cG9uIFRYMjogcGVyaW9kaWMgc2xvdyBibGlua2luZzM6IGFsd2F5cyBvbiAqLworCQl1MzIgR0xlZE1vZGU6MjsJLyogZ3JlZW4gTGVkIE1vZGUgKi8KKwkJdTMyIFlMZWRNb2RlOjI7CS8qIHllbGxvdyBMZWQgTW9kZSAqLworCQl1MzIgTGVkUG9sYXI6MTsJLyogTGVkIFBvbGFyaXR5LiAgMDogYWN0aXZlIGxvdzE6IGFjdGl2ZSBoaWdoICovCisJCXUzMiA6IDE7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gTEVEX0NGR19TVFJVQywgKlBMRURfQ0ZHX1NUUlVDOworLyogKi8KKy8qICA0LjIgTUFDIFRJTUlORyAgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDExMDApICovCisvKiAqLworI2RlZmluZSBYSUZTX1RJTUVfQ0ZHICAgICAgICAgICAgIDB4MTEwMAkvKiBNQUNfQ1NSOCAgTUFDX0NTUjkgKi8KK3R5cGVkZWYgdW5pb24gX0lGU19TTE9UX0NGR19TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIENja21TaWZzVGltZTo4OwkvKiAgdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgQ0NLIFJYL1RYICovCisJCXUzMiBPZmRtU2lmc1RpbWU6ODsJLyogIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIE9GRE0gUlgvVFggKi8KKwkJdTMyIE9mZG1YaWZzVGltZTo0OwkvKk9GRE0gU0lGUy4gdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgT0ZETSBSWCB3aGVuIE1BQyBkb2Vzbid0IHJlZmVyZW5jZSBCQlAgc2lnbmFsIEJCUlhFTkQgKi8KKwkJdTMyIEVJRlM6OTsJLyogIHVuaXQgMXVzICovCisJCXUzMiBCQlJ4ZW5kRW5hYmxlOjE7CS8qICByZWZlcmVuY2UgUlhFTkQgc2lnbmFsIHRvIGJlZ2luIFhJRlMgZGVmZXIgKi8KKwkJdTMyIHJzdjoyOworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IElGU19TTE9UX0NGR19TVFJVQywgKlBJRlNfU0xPVF9DRkdfU1RSVUM7CisKKyNkZWZpbmUgQktPRkZfU0xPVF9DRkcgICAgICAgICAgICAgMHgxMTA0CS8qICBtYWNfY3NyOSBsYXN0IDggYml0cyAqLworI2RlZmluZSBOQVZfVElNRV9DRkcgICAgICAgICAgICAgMHgxMTA4CS8qIE5BViAgKE1BQ19DU1IxNSkgKi8KKyNkZWZpbmUgQ0hfVElNRV9DRkcgICAgICAgICAgICAgMHgxMTBDCS8qIENvdW50IGFzIGNoYW5uZWwgYnVzeSAqLworI2RlZmluZSBQQkZfTElGRV9USU1FUiAgICAgICAgICAgICAweDExMTAJLypUWC9SWCBNUERVIHRpbWVzdGFtcCB0aW1lciAoZnJlZSBydW4pVW5pdDogMXVzICovCisjZGVmaW5lIEJDTl9USU1FX0NGRyAgICAgICAgICAgICAweDExMTQJLyogVFhSWF9DU1I5ICovCisKKyNkZWZpbmUgQkNOX09GRlNFVDAJCQkJMHgwNDJDCisjZGVmaW5lIEJDTl9PRkZTRVQxCQkJCTB4MDQzMAorCisvKiAqLworLyogQkNOX1RJTUVfQ0ZHIDogU3luY2hyb25pemF0aW9uIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIF9CQ05fVElNRV9DRkdfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBCZWFjb25JbnRlcnZhbDoxNjsJLyogaW4gdW5pdCBvZiAxLzE2IFRVICovCisJCXUzMiBiVHNmVGlja2luZzoxOwkvKiBFbmFibGUgVFNGIGF1dG8gY291bnRpbmcgKi8KKwkJdTMyIFRzZlN5bmNNb2RlOjI7CS8qIEVuYWJsZSBUU0Ygc3luYywgMDA6IGRpc2FibGUsIDAxOiBpbmZyYSBtb2RlLCAxMDogYWQtaG9jIG1vZGUgKi8KKwkJdTMyIGJUQlRURW5hYmxlOjE7CisJCXUzMiBiQmVhY29uR2VuOjE7CS8qIEVuYWJsZSBiZWFjb24gZ2VuZXJhdG9yICovCisJCXUzMiA6IDM7CisJCXUzMiBUeFRpbWVzdGFtcENvbXBlbnNhdGU6ODsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBCQ05fVElNRV9DRkdfU1RSVUMsICpQQkNOX1RJTUVfQ0ZHX1NUUlVDOworI2RlZmluZSBUQlRUX1NZTkNfQ0ZHICAgICAgICAgICAgMHgxMTE4CS8qIHR4cnhfY3NyMTAgKi8KKyNkZWZpbmUgVFNGX1RJTUVSX0RXMCAgICAgICAgICAgICAweDExMUMJLyogTG9jYWwgVFNGIHRpbWVyIGxzYiAzMiBiaXRzLiBSZWFkLW9ubHkgKi8KKyNkZWZpbmUgVFNGX1RJTUVSX0RXMSAgICAgICAgICAgICAweDExMjAJLyogbXNiIDMyIGJpdHMuIFJlYWQtb25seS4gKi8KKyNkZWZpbmUgVEJUVF9USU1FUgkJMHgxMTI0CS8qIFRJbWVyIHJlbWFpbnMgdGlsbCBuZXh0IFRCVFQuIFJlYWQtb25seS4gIFRYUlhfQ1NSMTQgKi8KKyNkZWZpbmUgSU5UX1RJTUVSX0NGRwkJCTB4MTEyOAkvKiAqLworI2RlZmluZSBJTlRfVElNRVJfRU4JCQkweDExMmMJLyogIEdQLXRpbWVyIGFuZCBwcmUtdGJ0dCBJbnQgZW5hYmxlICovCisjZGVmaW5lIENIX0lETEVfU1RBCQkJMHgxMTMwCS8qICBjaGFubmVsIGlkbGUgdGltZSAqLworI2RlZmluZSBDSF9CVVNZX1NUQQkJCTB4MTEzNAkvKiAgY2hhbm5sZSBidXN5IHRpbWUgKi8KKy8qICovCisvKiAgNC4yIE1BQyBQT1dFUiAgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDEyMDApICovCisvKiAqLworI2RlZmluZSBNQUNfU1RBVFVTX0NGRyAgICAgICAgICAgICAweDEyMDAJLyogb2xkIE1BQ19DU1IxMiAqLworI2RlZmluZSBQV1JfUElOX0NGRyAgICAgICAgICAgICAweDEyMDQJLyogb2xkIE1BQ19DU1IxMiAqLworI2RlZmluZSBBVVRPX1dBS0VVUF9DRkcgICAgICAgICAgICAgMHgxMjA4CS8qIG9sZCBNQUNfQ1NSMTAgKi8KKy8qICovCisvKiBBVVRPX1dBS0VVUF9DRkc6IE1hbnVhbCBwb3dlciBjb250cm9sIC8gc3RhdHVzIHJlZ2lzdGVyICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfQVVUT19XQUtFVVBfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBBdXRvTGVhZFRpbWU6ODsKKwkJdTMyIE51bW9mU2xlZXBpbmdUYnR0Ojc7CS8qIEZvcmNlV2FrZSBoYXMgaGlnaCBwcml2aWxlZ2UgdGhhbiBQdXRUb1NsZWVwIHdoZW4gYm90aCBzZXQgKi8KKwkJdTMyIEVuYWJsZUF1dG9XYWtldXA6MTsJLyogMDpzbGVlcCwgMTphd2FrZSAqLworCQl1MzIgOiAxNjsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBBVVRPX1dBS0VVUF9TVFJVQywgKlBBVVRPX1dBS0VVUF9TVFJVQzsKKy8qICovCisvKiAgNC4zIE1BQyBUWCAgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDEzMDApICovCisvKiAqLworCisjZGVmaW5lIEVEQ0FfQUMwX0NGRwkweDEzMDAJLypBQ19UWE9QX0NTUjAgMHgzNDc0ICovCisjZGVmaW5lIEVEQ0FfQUMxX0NGRwkweDEzMDQKKyNkZWZpbmUgRURDQV9BQzJfQ0ZHCTB4MTMwOAorI2RlZmluZSBFRENBX0FDM19DRkcJMHgxMzBjCit0eXBlZGVmIHVuaW9uIF9FRENBX0FDX0NGR19TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIEFjVHhvcDo4OwkvKiAgaW4gdW5pdCBvZiAzMnVzICovCisJCXUzMiBBaWZzbjo0OwkvKiAjIG9mIHNsb3QgdGltZSAqLworCQl1MzIgQ3dtaW46NDsJLyogKi8KKwkJdTMyIEN3bWF4OjQ7CS8qdW5pdCBwb3dlciBvZiAyICovCisJCXUzMiA6IDEyOwkvKiAqLworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IEVEQ0FfQUNfQ0ZHX1NUUlVDLCAqUEVEQ0FfQUNfQ0ZHX1NUUlVDOworCisjZGVmaW5lIEVEQ0FfVElEX0FDX01BUAkweDEzMTAKKyNkZWZpbmUgVFhfUFdSX0NGR18wCTB4MTMxNAorI2RlZmluZSBUWF9QV1JfQ0ZHXzEJMHgxMzE4CisjZGVmaW5lIFRYX1BXUl9DRkdfMgkweDEzMUMKKyNkZWZpbmUgVFhfUFdSX0NGR18zCTB4MTMyMAorI2RlZmluZSBUWF9QV1JfQ0ZHXzQJMHgxMzI0CisjZGVmaW5lIFRYX1BJTl9DRkcJCTB4MTMyOAorI2RlZmluZSBUWF9CQU5EX0NGRwkweDEzMmMJLyogMHgxIHVzZSB1cHBlciAyME1Iei4gMCBqdXNlIGxvd2VyIDIwTUh6ICovCisjZGVmaW5lIFRYX1NXX0NGRzAJCTB4MTMzMAorI2RlZmluZSBUWF9TV19DRkcxCQkweDEzMzQKKyNkZWZpbmUgVFhfU1dfQ0ZHMgkJMHgxMzM4CisjZGVmaW5lIFRYT1BfVEhSRVNfQ0ZHCQkweDEzM2MKKyNkZWZpbmUgVFhPUF9DVFJMX0NGRwkJMHgxMzQwCisjZGVmaW5lIFRYX1JUU19DRkcJCTB4MTM0NAorCit0eXBlZGVmIHVuaW9uIF9UWF9SVFNfQ0ZHX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgQXV0b1J0c1JldHJ5TGltaXQ6ODsKKwkJdTMyIFJ0c1RocmVzOjE2OwkvKiB1bml0OmJ5dGUgKi8KKwkJdTMyIFJ0c0Zia0VuOjE7CS8qIGVuYWJsZSBydHMgcmF0ZSBmYWxsYmFjayAqLworCQl1MzIgcnN2Ojc7CS8qIDE6IEhUIG5vbi1TVEJDIGNvbnRyb2wgZnJhbWUgZW5hYmxlICovCisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gVFhfUlRTX0NGR19TVFJVQywgKlBUWF9SVFNfQ0ZHX1NUUlVDOworI2RlZmluZSBUWF9USU1FT1VUX0NGRwkweDEzNDgKK3R5cGVkZWYgdW5pb24gX1RYX1RJTUVPVVRfQ0ZHX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgcnN2OjQ7CisJCXUzMiBNcGR1TGlmZVRpbWU6NDsJLyogIGV4cGlyYXRpb24gdGltZSA9IDJeKDkrTVBEVSBMSUZFIFRJTUUpICB1cyAqLworCQl1MzIgUnhBY2tUaW1lb3V0Ojg7CS8qIHVuaXQ6c2xvdC4gVXNlZCBmb3IgVFggcHJlY2VkdXJlICovCisJCXUzMiBUeG9wVGltZW91dDo4OwkvKlRYT1AgdGltZW91dCB2YWx1ZSBmb3IgVFhPUCB0cnVuY2F0aW9uLiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCAoU0xPVF9USU1FKSA+IChUWF9PUF9USU1FT1VUKSA+IChSWF9BQ0tfVElNRU9VVCkgKi8KKwkJdTMyIHJzdjI6ODsJLyogMTogSFQgbm9uLVNUQkMgY29udHJvbCBmcmFtZSBlbmFibGUgKi8KKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBUWF9USU1FT1VUX0NGR19TVFJVQywgKlBUWF9USU1FT1VUX0NGR19TVFJVQzsKKyNkZWZpbmUgVFhfUlRZX0NGRwkweDEzNGMKK3R5cGVkZWYgdW5pb24gUEFDS0VEIF9UWF9SVFlfQ0ZHX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgU2hvcnRSdHlMaW1pdDo4OwkvKiAgc2hvcnQgcmV0cnkgbGltaXQgKi8KKwkJdTMyIExvbmdSdHlMaW1pdDo4OwkvKmxvbmcgcmV0cnkgbGltaXQgKi8KKwkJdTMyIExvbmdSdHlUaHJlOjEyOwkvKiBMb25nIHJldHJ5IHRocmVzaG9vbGQgKi8KKwkJdTMyIE5vbkFnZ1J0eU1vZGU6MTsJLyogTm9uLUFnZ3JlZ2F0ZSBNUERVIHJldHJ5IG1vZGUuICAwOmV4cGlyZWQgYnkgcmV0cnkgbGltaXQsIDE6IGV4cGlyZWQgYnkgbXBkdSBsaWZlIHRpbWVyICovCisJCXUzMiBBZ2dSdHlNb2RlOjE7CS8qIEFnZ3JlZ2F0ZSBNUERVIHJldHJ5IG1vZGUuICAwOmV4cGlyZWQgYnkgcmV0cnkgbGltaXQsIDE6IGV4cGlyZWQgYnkgbXBkdSBsaWZlIHRpbWVyICovCisJCXUzMiBUeGF1dG9GQkVuYWJsZToxOwkvKiBUeCByZXRyeSBQSFkgcmF0ZSBhdXRvIGZhbGxiYWNrIGVuYWJsZSAqLworCQl1MzIgcnN2OjE7CS8qIDE6IEhUIG5vbi1TVEJDIGNvbnRyb2wgZnJhbWUgZW5hYmxlICovCisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gVFhfUlRZX0NGR19TVFJVQywgKlBUWF9SVFlfQ0ZHX1NUUlVDOworI2RlZmluZSBUWF9MSU5LX0NGRwkweDEzNTAKK3R5cGVkZWYgdW5pb24gUEFDS0VEIF9UWF9MSU5LX0NGR19TVFJVQyB7CisJc3RydWN0IFBBQ0tFRCB7CisJCXUzMiBSZW1vdGVNRkJMaWZlVGltZTo4OwkvKnJlbW90ZSBNRkIgbGlmZSB0aW1lLiB1bml0IDogMzJ1cyAqLworCQl1MzIgTUZCRW5hYmxlOjE7CS8qICBUWCBhcHBseSByZW1vdGUgTUZCIDE6ZW5hYmxlICovCisJCXUzMiBSZW1vdGVVTUZTRW5hYmxlOjE7CS8qICByZW1vdGUgdW5zb2xpY2l0ICBNRkIgZW5hYmxlLiAgMDogbm90IGFwcGx5IHJlbW90ZSByZW1vdGUgdW5zb2xpY2l0IChNRlM9NykgKi8KKwkJdTMyIFR4TVJRRW46MTsJLyogIE1DUyByZXF1ZXN0IFRYIGVuYWJsZSAqLworCQl1MzIgVHhSREdFbjoxOwkvKiBSREcgVFggZW5hYmxlICovCisJCXUzMiBUeENGQWNrRW46MTsJLyogICBQaWdneWJhY2sgQ0YtQUNLIGVuYWJsZSAqLworCQl1MzIgcnN2OjM7CS8qICovCisJCXUzMiBSZW1vdE1GQjo4OwkvKiAgcmVtb3RlIE1DUyBmZWVkYmFjayAqLworCQl1MzIgUmVtb3RNRlM6ODsJLypyZW1vdGUgTUNTIGZlZWRiYWNrIHNlcXVlbmNlIG51bWJlciAqLworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFRYX0xJTktfQ0ZHX1NUUlVDLCAqUFRYX0xJTktfQ0ZHX1NUUlVDOworI2RlZmluZSBIVF9GQktfQ0ZHMAkweDEzNTQKK3R5cGVkZWYgdW5pb24gUEFDS0VEIF9IVF9GQktfQ0ZHMF9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIEhUTUNTMEZCSzo0OworCQl1MzIgSFRNQ1MxRkJLOjQ7CisJCXUzMiBIVE1DUzJGQks6NDsKKwkJdTMyIEhUTUNTM0ZCSzo0OworCQl1MzIgSFRNQ1M0RkJLOjQ7CisJCXUzMiBIVE1DUzVGQks6NDsKKwkJdTMyIEhUTUNTNkZCSzo0OworCQl1MzIgSFRNQ1M3RkJLOjQ7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gSFRfRkJLX0NGRzBfU1RSVUMsICpQSFRfRkJLX0NGRzBfU1RSVUM7CisjZGVmaW5lIEhUX0ZCS19DRkcxCTB4MTM1OAordHlwZWRlZiB1bmlvbiBfSFRfRkJLX0NGRzFfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBIVE1DUzhGQks6NDsKKwkJdTMyIEhUTUNTOUZCSzo0OworCQl1MzIgSFRNQ1MxMEZCSzo0OworCQl1MzIgSFRNQ1MxMUZCSzo0OworCQl1MzIgSFRNQ1MxMkZCSzo0OworCQl1MzIgSFRNQ1MxM0ZCSzo0OworCQl1MzIgSFRNQ1MxNEZCSzo0OworCQl1MzIgSFRNQ1MxNUZCSzo0OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IEhUX0ZCS19DRkcxX1NUUlVDLCAqUEhUX0ZCS19DRkcxX1NUUlVDOworI2RlZmluZSBMR19GQktfQ0ZHMAkweDEzNWMKK3R5cGVkZWYgdW5pb24gX0xHX0ZCS19DRkcwX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgT0ZETU1DUzBGQks6NDsJLyppbml0aWFsIHZhbHVlIGlzIDAgKi8KKwkJdTMyIE9GRE1NQ1MxRkJLOjQ7CS8qaW5pdGlhbCB2YWx1ZSBpcyAwICovCisJCXUzMiBPRkRNTUNTMkZCSzo0OwkvKmluaXRpYWwgdmFsdWUgaXMgMSAqLworCQl1MzIgT0ZETU1DUzNGQks6NDsJLyppbml0aWFsIHZhbHVlIGlzIDIgKi8KKwkJdTMyIE9GRE1NQ1M0RkJLOjQ7CS8qaW5pdGlhbCB2YWx1ZSBpcyAzICovCisJCXUzMiBPRkRNTUNTNUZCSzo0OwkvKmluaXRpYWwgdmFsdWUgaXMgNCAqLworCQl1MzIgT0ZETU1DUzZGQks6NDsJLyppbml0aWFsIHZhbHVlIGlzIDUgKi8KKwkJdTMyIE9GRE1NQ1M3RkJLOjQ7CS8qaW5pdGlhbCB2YWx1ZSBpcyA2ICovCisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gTEdfRkJLX0NGRzBfU1RSVUMsICpQTEdfRkJLX0NGRzBfU1RSVUM7CisjZGVmaW5lIExHX0ZCS19DRkcxCQkweDEzNjAKK3R5cGVkZWYgdW5pb24gX0xHX0ZCS19DRkcxX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgQ0NLTUNTMEZCSzo0OwkvKmluaXRpYWwgdmFsdWUgaXMgMCAqLworCQl1MzIgQ0NLTUNTMUZCSzo0OwkvKmluaXRpYWwgdmFsdWUgaXMgMCAqLworCQl1MzIgQ0NLTUNTMkZCSzo0OwkvKmluaXRpYWwgdmFsdWUgaXMgMSAqLworCQl1MzIgQ0NLTUNTM0ZCSzo0OwkvKmluaXRpYWwgdmFsdWUgaXMgMiAqLworCQl1MzIgcnN2OjE2OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IExHX0ZCS19DRkcxX1NUUlVDLCAqUExHX0ZCS19DRkcxX1NUUlVDOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qPT09PT09PT09PT09PT09PSBQcm90ZWN0aW9uIFBhcmFtYXRlcj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNkZWZpbmUgQ0NLX1BST1RfQ0ZHCTB4MTM2NAkvKkNDSyBQcm90ZWN0aW9uICovCisjZGVmaW5lIEFTSUNfU0hPUlROQVYJCTEKKyNkZWZpbmUgQVNJQ19sb25nTkFWCQkyCisjZGVmaW5lIEFTSUNfUlRTCQkxCisjZGVmaW5lIEFTSUNfQ1RTCQkyCit0eXBlZGVmIHVuaW9uIF9QUk9UX0NGR19TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIFByb3RlY3RSYXRlOjE2OwkvKlByb3RlY3Rpb24gY29udHJvbCBmcmFtZSByYXRlIGZvciBDQ0sgVFgoUlRTL0NUUy9DRkVuZCkuICovCisJCXUzMiBQcm90ZWN0Q3RybDoyOwkvKlByb3RlY3Rpb24gY29udHJvbCBmcmFtZSB0eXBlIGZvciBDQ0sgVFguIDE6UlRTL0NUUywgMjpDVFMtdG8tc2VsZiwgMDpOb25lLCAzOnJzdiAqLworCQl1MzIgUHJvdGVjdE5hdjoyOwkvKlRYT1AgcHJvdGVjdGlvbiB0eXBlIGZvciBDQ0sgVFguIDA6Tm9uZSwgMTpTaG9ydE5BVnByb3RlY3QsICAyOkxvbmdOQVZQcm90ZWN0LCAzOnJzdiAqLworCQl1MzIgVHhvcEFsbG93Q2NrOjE7CS8qQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuICovCisJCXUzMiBUeG9wQWxsb3dPZmRtOjE7CS8qQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuICovCisJCXUzMiBUeG9wQWxsb3dNTTIwOjE7CS8qQ0NLIFRYT1AgYWxsb3dhbmNlLiAwOmRpc2FsbG93LiAqLworCQl1MzIgVHhvcEFsbG93TU00MDoxOwkvKkNDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LiAqLworCQl1MzIgVHhvcEFsbG93R0YyMDoxOwkvKkNDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LiAqLworCQl1MzIgVHhvcEFsbG93R0Y0MDoxOwkvKkNDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LiAqLworCQl1MzIgUlRTVGhFbjoxOwkvKlJUUyB0aHJlc2hvbGQgZW5hYmxlIG9uIENDSyBUWCAqLworCQl1MzIgcnN2OjU7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gUFJPVF9DRkdfU1RSVUMsICpQUFJPVF9DRkdfU1RSVUM7CisKKyNkZWZpbmUgT0ZETV9QUk9UX0NGRwkweDEzNjgJLypPRkRNIFByb3RlY3Rpb24gKi8KKyNkZWZpbmUgTU0yMF9QUk9UX0NGRwkweDEzNkMJLypNTTIwIFByb3RlY3Rpb24gKi8KKyNkZWZpbmUgTU00MF9QUk9UX0NGRwkweDEzNzAJLypNTTQwIFByb3RlY3Rpb24gKi8KKyNkZWZpbmUgR0YyMF9QUk9UX0NGRwkweDEzNzQJLypHRjIwIFByb3RlY3Rpb24gKi8KKyNkZWZpbmUgR0Y0MF9QUk9UX0NGRwkweDEzNzgJLypHUjQwIFByb3RlY3Rpb24gKi8KKyNkZWZpbmUgRVhQX0NUU19USU1FCTB4MTM3QwkvKiAqLworI2RlZmluZSBFWFBfQUNLX1RJTUUJMHgxMzgwCS8qICovCisKKy8qICovCisvKiAgNC40IE1BQyBSWCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTQwMCkgKi8KKy8qICovCisjZGVmaW5lIFJYX0ZJTFRSX0NGRwkweDE0MDAJLypUWFJYX0NTUjAgKi8KKyNkZWZpbmUgQVVUT19SU1BfQ0ZHCTB4MTQwNAkvKlRYUlhfQ1NSNCAqLworLyogKi8KKy8qIFRYUlhfQ1NSNDogQXV0by1SZXNwb25kZXIvICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfQVVUT19SU1BfQ0ZHX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgQXV0b1Jlc3BvbmRlckVuYWJsZToxOworCQl1MzIgQkFDQWNrUG9saWN5RW5hYmxlOjE7CS8qIDA6bG9uZywgMTpzaG9ydCBwcmVhbWJsZSAqLworCQl1MzIgQ1RTNDBNTW9kZToxOwkvKiBSZXNwb25zZSBDVFMgNDBNSHogZHVwbGljYXRlIG1vZGUgKi8KKwkJdTMyIENUUzQwTVJlZjoxOwkvKiBSZXNwb25zZSBDVFMgNDBNSHogZHVwbGljYXRlIG1vZGUgKi8KKwkJdTMyIEF1dG9SZXNwb25kZXJQcmVhbWJsZToxOwkvKiAwOmxvbmcsIDE6c2hvcnQgcHJlYW1ibGUgKi8KKwkJdTMyIHJzdjoxOwkvKiBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUgKi8KKwkJdTMyIER1YWxDVFNFbjoxOwkvKiBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUgKi8KKwkJdTMyIEFja0N0c1BzbUJpdDoxOwkvKiBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUgKi8KKwkJdTMyIDogMjQ7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gQVVUT19SU1BfQ0ZHX1NUUlVDLCAqUEFVVE9fUlNQX0NGR19TVFJVQzsKKworI2RlZmluZSBMRUdBQ1lfQkFTSUNfUkFURQkweDE0MDgJLyogIFRYUlhfQ1NSNSAgICAgICAgICAgMHgzMDU0ICovCisjZGVmaW5lIEhUX0JBU0lDX1JBVEUJCTB4MTQwYworI2RlZmluZSBIVF9DVFJMX0NGRwkJMHgxNDEwCisjZGVmaW5lIFNJRlNfQ09TVF9DRkcJCTB4MTQxNAorI2RlZmluZSBSWF9QQVJTRVJfQ0ZHCQkweDE0MTgJLypTZXQgTkFWIGZvciBhbGwgcmVjZWl2ZWQgZnJhbWVzICovCisKKy8qICovCisvKiAgNC41IE1BQyBTZWN1cml0eSBjb25maWd1cmF0aW9uIChvZmZzZXQ6MHgxNTAwKSAqLworLyogKi8KKyNkZWZpbmUgVFhfU0VDX0NOVDAJCTB4MTUwMAkvKiAqLworI2RlZmluZSBSWF9TRUNfQ05UMAkJMHgxNTA0CS8qICovCisjZGVmaW5lIENDTVBfRkNfTVVURQkJMHgxNTA4CS8qICovCisvKiAqLworLyogIDQuNiBIQ0NBL1BTTVAgKG9mZnNldDoweDE2MDApICovCisvKiAqLworI2RlZmluZSBUWE9QX0hMRFJfQUREUjAJCTB4MTYwMAorI2RlZmluZSBUWE9QX0hMRFJfQUREUjEJCTB4MTYwNAorI2RlZmluZSBUWE9QX0hMRFJfRVQJCTB4MTYwOAorI2RlZmluZSBRT1NfQ0ZQT0xMX1JBX0RXMAkJMHgxNjBjCisjZGVmaW5lIFFPU19DRlBPTExfQTFfRFcxCQkweDE2MTAKKyNkZWZpbmUgUU9TX0NGUE9MTF9RQwkJMHgxNjE0CisvKiAqLworLyogIDQuNyBNQUMgU3RhdGlzdGlzIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTcwMCkgKi8KKy8qICovCisjZGVmaW5lIFJYX1NUQV9DTlQwCQkweDE3MDAJLyogKi8KKyNkZWZpbmUgUlhfU1RBX0NOVDEJCTB4MTcwNAkvKiAqLworI2RlZmluZSBSWF9TVEFfQ05UMgkJMHgxNzA4CS8qICovCisKKy8qICovCisvKiBSWF9TVEFfQ05UMF9TVFJVQzogUlggUExDUCBlcnJvciBjb3VudCAmIFJYIENSQyBlcnJvciBjb3VudCAqLworLyogKi8KK3R5cGVkZWYgdW5pb24gX1JYX1NUQV9DTlQwX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MTYgQ3JjRXJyOworCQl1MTYgUGh5RXJyOworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFJYX1NUQV9DTlQwX1NUUlVDLCAqUFJYX1NUQV9DTlQwX1NUUlVDOworCisvKiAqLworLyogUlhfU1RBX0NOVDFfU1RSVUM6IFJYIEZhbHNlIENDQSBjb3VudCAmIFJYIGxvbmcgZnJhbWUgY291bnQgKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIF9SWF9TVEFfQ05UMV9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTE2IEZhbHNlQ2NhOworCQl1MTYgUGxjcEVycjsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBSWF9TVEFfQ05UMV9TVFJVQywgKlBSWF9TVEFfQ05UMV9TVFJVQzsKKworLyogKi8KKy8qIFJYX1NUQV9DTlQyX1NUUlVDOiAqLworLyogKi8KK3R5cGVkZWYgdW5pb24gX1JYX1NUQV9DTlQyX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MTYgUnhEdXBsaUNvdW50OworCQl1MTYgUnhGaWZvT3ZlcmZsb3dDb3VudDsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBSWF9TVEFfQ05UMl9TVFJVQywgKlBSWF9TVEFfQ05UMl9TVFJVQzsKKyNkZWZpbmUgVFhfU1RBX0NOVDAJCTB4MTcwQwkvKiAqLworLyogKi8KKy8qIFNUQV9DU1IzOiBUWCBCZWFjb24gY291bnQgKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIF9UWF9TVEFfQ05UMF9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTE2IFR4RmFpbENvdW50OworCQl1MTYgVHhCZWFjb25Db3VudDsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBUWF9TVEFfQ05UMF9TVFJVQywgKlBUWF9TVEFfQ05UMF9TVFJVQzsKKyNkZWZpbmUgVFhfU1RBX0NOVDEJCTB4MTcxMAkvKiAqLworLyogKi8KKy8qIFRYX1NUQV9DTlQxOiBUWCB0eCBjb3VudCAqLworLyogKi8KK3R5cGVkZWYgdW5pb24gX1RYX1NUQV9DTlQxX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MTYgVHhTdWNjZXNzOworCQl1MTYgVHhSZXRyYW5zbWl0OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFRYX1NUQV9DTlQxX1NUUlVDLCAqUFRYX1NUQV9DTlQxX1NUUlVDOworI2RlZmluZSBUWF9TVEFfQ05UMgkJMHgxNzE0CS8qICovCisvKiAqLworLyogVFhfU1RBX0NOVDI6IFRYIHR4IGNvdW50ICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfVFhfU1RBX0NOVDJfU1RSVUMgeworCXN0cnVjdCB7CisJCXUxNiBUeFplcm9MZW5Db3VudDsKKwkJdTE2IFR4VW5kZXJGbG93Q291bnQ7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gVFhfU1RBX0NOVDJfU1RSVUMsICpQVFhfU1RBX0NOVDJfU1RSVUM7CisjZGVmaW5lIFRYX1NUQV9GSUZPCQkweDE3MTgJLyogKi8KKy8qICovCisvKiBUWF9TVEFfRklGT19TVFJVQzogVFggUmVzdWx0IGZvciBzcGVjaWZpYyBQSUQgc3RhdHVzIGZpZm8gcmVnaXN0ZXIgKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIFBBQ0tFRCBfVFhfU1RBX0ZJRk9fU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBiVmFsaWQ6MTsJLyogMTpUaGlzIHJlZ2lzdGVyIGNvbnRhaW5zIGEgdmFsaWQgVFggcmVzdWx0ICovCisJCXUzMiBQaWRUeXBlOjQ7CisJCXUzMiBUeFN1Y2Nlc3M6MTsJLyogVHggTm8gcmV0cnkgc3VjY2VzcyAqLworCQl1MzIgVHhBZ2dyZToxOwkvKiBUeCBSZXRyeSBTdWNjZXNzICovCisJCXUzMiBUeEFja1JlcXVpcmVkOjE7CS8qIFR4IGZhaWwgKi8KKwkJdTMyIHdjaWQ6ODsJLyp3aXJlbGVzcyBjbGllbnQgaW5kZXggKi8KKy8qICAgICAgICAgICAgICB1MzIgICAgICAgICAgU3VjY2Vzc1JhdGU6MTY7IC8vaW5jbHVkZSBNQ1MsIG1vZGUgLHNob3J0R0ksIEJXIHNldHRpbmdTYW1lIGZvcm1hdCBhcyBUWFdJIFdvcmQgMCBCaXQgMzEtMTYuICovCisJCXUzMiBTdWNjZXNzUmF0ZToxMzsJLyppbmNsdWRlIE1DUywgbW9kZSAsc2hvcnRHSSwgQlcgc2V0dGluZ1NhbWUgZm9ybWF0IGFzIFRYV0kgV29yZCAwIEJpdCAzMS0xNi4gKi8KKwkJdTMyIFR4QkY6MTsKKwkJdTMyIFJlc2VydmU6MjsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBUWF9TVEFfRklGT19TVFJVQywgKlBUWF9TVEFfRklGT19TVFJVQzsKKy8qIERlYnVnIGNvdW50ZXIgKi8KKyNkZWZpbmUgVFhfQUdHX0NOVAkweDE3MWMKK3R5cGVkZWYgdW5pb24gX1RYX0FHR19DTlRfU1RSVUMgeworCXN0cnVjdCB7CisJCXUxNiBOb25BZ2dUeENvdW50OworCQl1MTYgQWdnVHhDb3VudDsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBUWF9BR0dfQ05UX1NUUlVDLCAqUFRYX0FHR19DTlRfU1RSVUM7CisvKiBEZWJ1ZyBjb3VudGVyICovCisjZGVmaW5lIFRYX0FHR19DTlQwCTB4MTcyMAordHlwZWRlZiB1bmlvbiBfVFhfQUdHX0NOVDBfU1RSVUMgeworCXN0cnVjdCB7CisJCXUxNiBBZ2dTaXplMUNvdW50OworCQl1MTYgQWdnU2l6ZTJDb3VudDsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBUWF9BR0dfQ05UMF9TVFJVQywgKlBUWF9BR0dfQ05UMF9TVFJVQzsKKy8qIERlYnVnIGNvdW50ZXIgKi8KKyNkZWZpbmUgVFhfQUdHX0NOVDEJMHgxNzI0Cit0eXBlZGVmIHVuaW9uIF9UWF9BR0dfQ05UMV9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTE2IEFnZ1NpemUzQ291bnQ7CisJCXUxNiBBZ2dTaXplNENvdW50OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFRYX0FHR19DTlQxX1NUUlVDLCAqUFRYX0FHR19DTlQxX1NUUlVDOworI2RlZmluZSBUWF9BR0dfQ05UMgkweDE3MjgKK3R5cGVkZWYgdW5pb24gX1RYX0FHR19DTlQyX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MTYgQWdnU2l6ZTVDb3VudDsKKwkJdTE2IEFnZ1NpemU2Q291bnQ7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gVFhfQUdHX0NOVDJfU1RSVUMsICpQVFhfQUdHX0NOVDJfU1RSVUM7CisvKiBEZWJ1ZyBjb3VudGVyICovCisjZGVmaW5lIFRYX0FHR19DTlQzCTB4MTcyYwordHlwZWRlZiB1bmlvbiBfVFhfQUdHX0NOVDNfU1RSVUMgeworCXN0cnVjdCB7CisJCXUxNiBBZ2dTaXplN0NvdW50OworCQl1MTYgQWdnU2l6ZThDb3VudDsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBUWF9BR0dfQ05UM19TVFJVQywgKlBUWF9BR0dfQ05UM19TVFJVQzsKKy8qIERlYnVnIGNvdW50ZXIgKi8KKyNkZWZpbmUgVFhfQUdHX0NOVDQJMHgxNzMwCit0eXBlZGVmIHVuaW9uIF9UWF9BR0dfQ05UNF9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTE2IEFnZ1NpemU5Q291bnQ7CisJCXUxNiBBZ2dTaXplMTBDb3VudDsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBUWF9BR0dfQ05UNF9TVFJVQywgKlBUWF9BR0dfQ05UNF9TVFJVQzsKKyNkZWZpbmUgVFhfQUdHX0NOVDUJMHgxNzM0Cit0eXBlZGVmIHVuaW9uIF9UWF9BR0dfQ05UNV9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTE2IEFnZ1NpemUxMUNvdW50OworCQl1MTYgQWdnU2l6ZTEyQ291bnQ7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gVFhfQUdHX0NOVDVfU1RSVUMsICpQVFhfQUdHX0NOVDVfU1RSVUM7CisjZGVmaW5lIFRYX0FHR19DTlQ2CQkweDE3MzgKK3R5cGVkZWYgdW5pb24gX1RYX0FHR19DTlQ2X1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MTYgQWdnU2l6ZTEzQ291bnQ7CisJCXUxNiBBZ2dTaXplMTRDb3VudDsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBUWF9BR0dfQ05UNl9TVFJVQywgKlBUWF9BR0dfQ05UNl9TVFJVQzsKKyNkZWZpbmUgVFhfQUdHX0NOVDcJCTB4MTczYwordHlwZWRlZiB1bmlvbiBfVFhfQUdHX0NOVDdfU1RSVUMgeworCXN0cnVjdCB7CisJCXUxNiBBZ2dTaXplMTVDb3VudDsKKwkJdTE2IEFnZ1NpemUxNkNvdW50OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFRYX0FHR19DTlQ3X1NUUlVDLCAqUFRYX0FHR19DTlQ3X1NUUlVDOworI2RlZmluZSBNUERVX0RFTlNJVFlfQ05UCQkweDE3NDAKK3R5cGVkZWYgdW5pb24gX01QRFVfREVOX0NOVF9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTE2IFRYWmVyb0RlbENvdW50OwkvKlRYIHplcm8gbGVuZ3RoIGRlbGltaXRlciBjb3VudCAqLworCQl1MTYgUlhaZXJvRGVsQ291bnQ7CS8qUlggemVybyBsZW5ndGggZGVsaW1pdGVyIGNvdW50ICovCisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gTVBEVV9ERU5fQ05UX1NUUlVDLCAqUE1QRFVfREVOX0NOVF9TVFJVQzsKKy8qICovCisvKiBUWFJYIGNvbnRyb2wgcmVnaXN0ZXJzIC0gYmFzZSBhZGRyZXNzIDB4MzAwMCAqLworLyogKi8KKy8qIHJ0Mjg2MGIgIFVOS05PV04gcmVnIHVzZSBSL08gUmVnIEFkZHIgMHg3N2QwIGZpcnN0Li4gKi8KKyNkZWZpbmUgVFhSWF9DU1IxICAgICAgICAgICAweDc3ZDAKKworLyogKi8KKy8qIFNlY3VyaXR5IGtleSB0YWJsZSBtZW1vcnksIGJhc2UgYWRkcmVzcyA9IDB4MTAwMCAqLworLyogKi8KKyNkZWZpbmUgTUFDX1dDSURfQkFTRQkJMHgxODAwCS8qOC1ieXRlcyh1c2Ugb25seSA2LWJ5dGVzKSAqIDI1NiBlbnRyeSA9ICovCisjZGVmaW5lIEhXX1dDSURfRU5UUllfU0laRSAgIDgKKyNkZWZpbmUgUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UgICAgIDB4NDAwMAkvKiAzMi1ieXRlICogMjU2LWVudHJ5ID0gIC1ieXRlICovCisjZGVmaW5lIEhXX0tFWV9FTlRSWV9TSVpFICAgICAgICAgICAweDIwCisjZGVmaW5lIFBBSVJXSVNFX0lWRUlWX1RBQkxFX0JBU0UgICAgIDB4NjAwMAkvKiA4LWJ5dGUgKiAyNTYtZW50cnkgPSAgLWJ5dGUgKi8KKyNkZWZpbmUgTUFDX0lWRUlWX1RBQkxFX0JBU0UgICAgIDB4NjAwMAkvKiA4LWJ5dGUgKiAyNTYtZW50cnkgPSAgLWJ5dGUgKi8KKyNkZWZpbmUgSFdfSVZFSVZfRU5UUllfU0laRSAgIDgKKyNkZWZpbmUgTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgICAgIDB4NjgwMAkvKiA0LWJ5dGUgKiAyNTYtZW50cnkgPSAgLWJ5dGUgKi8KKyNkZWZpbmUgSFdfV0NJRF9BVFRSSV9TSVpFICAgNAorI2RlZmluZSBXQ0lEX1JFU0VSVkVECQkJMHg2YmZjCisjZGVmaW5lIFNIQVJFRF9LRVlfVEFCTEVfQkFTRSAgICAgICAweDZjMDAJLyogMzItYnl0ZSAqIDE2LWVudHJ5ID0gNTEyLWJ5dGUgKi8KKyNkZWZpbmUgU0hBUkVEX0tFWV9NT0RFX0JBU0UgICAgICAgMHg3MDAwCS8qIDMyLWJ5dGUgKiAxNi1lbnRyeSA9IDUxMi1ieXRlICovCisjZGVmaW5lIEhXX1NIQVJFRF9LRVlfTU9ERV9TSVpFICAgNAorI2RlZmluZSBTSEFSRURLRVlUQUJMRQkJCTAKKyNkZWZpbmUgUEFJUldJU0VLRVlUQUJMRQkJCTEKKwordHlwZWRlZiB1bmlvbiBfU0hBUkVES0VZX01PREVfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBCc3MwS2V5MENpcGhlckFsZzozOworCQl1MzIgOiAxOworCQl1MzIgQnNzMEtleTFDaXBoZXJBbGc6MzsKKwkJdTMyIDogMTsKKwkJdTMyIEJzczBLZXkyQ2lwaGVyQWxnOjM7CisJCXUzMiA6IDE7CisJCXUzMiBCc3MwS2V5M0NpcGhlckFsZzozOworCQl1MzIgOiAxOworCQl1MzIgQnNzMUtleTBDaXBoZXJBbGc6MzsKKwkJdTMyIDogMTsKKwkJdTMyIEJzczFLZXkxQ2lwaGVyQWxnOjM7CisJCXUzMiA6IDE7CisJCXUzMiBCc3MxS2V5MkNpcGhlckFsZzozOworCQl1MzIgOiAxOworCQl1MzIgQnNzMUtleTNDaXBoZXJBbGc6MzsKKwkJdTMyIDogMTsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBTSEFSRURLRVlfTU9ERV9TVFJVQywgKlBTSEFSRURLRVlfTU9ERV9TVFJVQzsKKworLyogOC1ieXRlIHBlciBlbnRyeSwgNjQtZW50cnkgZm9yIHBhaXJ3aXNlIGtleSB0YWJsZSAqLworc3RydWN0IHJ0X2h3X3djaWRfZW50cnkgeworCXU4IEFkZHJlc3NbNl07CisJdTggUnN2WzJdOworfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiBXQ0lEICBmb3JtYXQgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyo3LjEgICBXQ0lEICBFTlRSWSAgZm9ybWF0ICA6IDhieXRlcyAqLworc3RydWN0IHJ0X3djaWRfZW50cnkgeworCXU4IFJYQkFCaXRtYXA3OwkvKiBiaXQwIGZvciBUSUQ4LCBiaXQ3IGZvciBUSUQgMTUgKi8KKwl1OCBSWEJBQml0bWFwMDsJLyogYml0MCBmb3IgVElEMCwgYml0NyBmb3IgVElEIDcgKi8KKwl1OCBNQUNbNl07CQkvKiAwIGZvciBzaGFyZWQga2V5IHRhYmxlLiAgMSBmb3IgcGFpcndpc2Uga2V5IHRhYmxlICovCit9OworCisvKjguMS4xIFNFQ1VSSVRZICBLRVkgIGZvcm1hdCAgOiA4RFcgKi8KKy8qIDMyLWJ5dGUgcGVyIGVudHJ5LCB0b3RhbCAxNi1lbnRyeSBmb3Igc2hhcmVkIGtleSB0YWJsZSwgNjQtZW50cnkgZm9yIHBhaXJ3aXNlIGtleSB0YWJsZSAqLworc3RydWN0IHJ0X2h3X2tleV9lbnRyeSB7CisJdTggS2V5WzE2XTsKKwl1OCBUeE1pY1s4XTsKKwl1OCBSeE1pY1s4XTsKK307CisKKy8qOC4xLjIgSVYvRUlWICBmb3JtYXQgIDogMkRXICovCisKKy8qOC4xLjMgUlggYXR0cmlidXRlIGVudHJ5IGZvcm1hdCAgOiAxRFcgKi8KK3N0cnVjdCBydF9tYWNfYXR0cmlidXRlIHsKKwl1MzIgS2V5VGFiOjE7CS8qIDAgZm9yIHNoYXJlZCBrZXkgdGFibGUuICAxIGZvciBwYWlyd2lzZSBrZXkgdGFibGUgKi8KKwl1MzIgUGFpcktleU1vZGU6MzsKKwl1MzIgQlNTSURJZHg6MzsJLyptdWx0aXBsZUJTUyBpbmRleCBmb3IgdGhlIFdDSUQgKi8KKwl1MzIgUlhXSVVERjozOworCXUzMiByc3Y6MjI7Cit9OworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIEhPU1QtTUNVIGNvbW11bmljYXRpb24gZGF0YSBzdHJ1Y3R1cmUgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiAqLworLyogSDJNX01BSUxCT1hfQ1NSOiBIb3N0LXRvLU1DVSBNYWlsYm94ICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfSDJNX01BSUxCT1hfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBMb3dCeXRlOjg7CisJCXUzMiBIaWdoQnl0ZTo4OworCQl1MzIgQ21kVG9rZW46ODsKKwkJdTMyIE93bmVyOjg7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gSDJNX01BSUxCT1hfU1RSVUMsICpQSDJNX01BSUxCT1hfU1RSVUM7CisKKy8qICovCisvKiBNMkhfQ01EX0RPTkVfQ1NSOiBNQ1UtdG8tSG9zdCBjb21tYW5kIGNvbXBsZXRlIGluZGljYXRpb24gKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIF9NMkhfQ01EX0RPTkVfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBDbWRUb2tlbjA7CisJCXUzMiBDbWRUb2tlbjE7CisJCXUzMiBDbWRUb2tlbjI7CisJCXUzMiBDbWRUb2tlbjM7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gTTJIX0NNRF9ET05FX1NUUlVDLCAqUE0ySF9DTURfRE9ORV9TVFJVQzsKKworLypOQVZfVElNRV9DRkcgOk5BViAqLwordHlwZWRlZiB1bmlvbiBfTkFWX1RJTUVfQ0ZHX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1OCBTaWZzOwkvKiBpbiB1bml0IG9mIDEtdXMgKi8KKwkJdTggU2xvdFRpbWU7CS8qIGluIHVuaXQgb2YgMS11cyAqLworCQl1MTYgRWlmczo5OwkvKiBpbiB1bml0IG9mIDEtdXMgKi8KKwkJdTE2IFplcm9TaWZzOjE7CS8qIEFwcGxpZWQgemVybyBTSUZTIHRpbWVyIGFmdGVyIE9GRE0gUlggMDogZGlzYWJsZSAqLworCQl1MTYgcnN2OjY7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gTkFWX1RJTUVfQ0ZHX1NUUlVDLCAqUE5BVl9USU1FX0NGR19TVFJVQzsKKworLyogKi8KKy8qIFJYX0ZJTFRSX0NGRzogIC9SWCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfUlhfRklMVFJfQ0ZHX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgRHJvcENSQ0VycjoxOwkvKiBEcm9wIENSQyBlcnJvciAqLworCQl1MzIgRHJvcFBoeUVycjoxOwkvKiBEcm9wIHBoeXNpY2FsIGVycm9yICovCisJCXUzMiBEcm9wTm90VG9NZToxOwkvKiBEcm9wIG5vdCB0byBtZSB1bmljYXN0IGZyYW1lICovCisJCXUzMiBEcm9wTm90TXlCU1NJRDoxOwkvKiBEcm9wIGZyYW0gVG9EcyBiaXQgaXMgdHJ1ZSAqLworCisJCXUzMiBEcm9wVmVyRXJyOjE7CS8qIERyb3AgdmVyc2lvbiBlcnJvciBmcmFtZSAqLworCQl1MzIgRHJvcE1jYXN0OjE7CS8qIERyb3AgbXVsdGljYXN0IGZyYW1lcyAqLworCQl1MzIgRHJvcEJjYXN0OjE7CS8qIERyb3AgYnJvYWRjYXN0IGZyYW1lcyAqLworCQl1MzIgRHJvcER1cGxpY2F0ZToxOwkvKiBEcm9wIGR1cGxpY2F0ZSBmcmFtZSAqLworCisJCXUzMiBEcm9wQ0ZFbmRBY2s6MTsJLyogRHJvcCBQcy1Qb2xsICovCisJCXUzMiBEcm9wQ0ZFbmQ6MTsJLyogRHJvcCBQcy1Qb2xsICovCisJCXUzMiBEcm9wQWNrOjE7CS8qIERyb3AgUHMtUG9sbCAqLworCQl1MzIgRHJvcEN0czoxOwkvKiBEcm9wIFBzLVBvbGwgKi8KKworCQl1MzIgRHJvcFJ0czoxOwkvKiBEcm9wIFBzLVBvbGwgKi8KKwkJdTMyIERyb3BQc1BvbGw6MTsJLyogRHJvcCBQcy1Qb2xsICovCisJCXUzMiBEcm9wQkE6MTsJLyogKi8KKwkJdTMyIERyb3BCQVI6MTsJLyogKi8KKworCQl1MzIgRHJvcFJzdkNudGxUeXBlOjE7CisJCXUzMiA6IDE1OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFJYX0ZJTFRSX0NGR19TVFJVQywgKlBSWF9GSUxUUl9DRkdfU1RSVUM7CisKKy8qICovCisvKiBQSFlfQ1NSNDogUkYgc2VyaWFsIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIF9QSFlfQ1NSNF9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIFJGUmVnVmFsdWU6MjQ7CS8qIFJlZ2lzdGVyICAgICB2YWx1ZSAoaW5jbHVkZSByZWdpc3RlciBpZCkgICAgIHNlcmlhbCBvdXQgdG8gUkYvSUYgICAgIGNoaXAuICovCisJCXUzMiBOdW1iZXJPZkJpdHM6NTsJLyogTnVtYmVyIG9mIGJpdHMgdXNlZCBpbiBSRlJlZ1ZhbHVlIChJOjIwLCAgICAgUkZNRDoyMikgKi8KKwkJdTMyIElGU2VsZWN0OjE7CS8qIDE6IHNlbGVjdCBJRiB0byBwcm9ncmFtLCAgICAgMDogc2VsZWN0IFJGIHRvIHByb2dyYW0gKi8KKwkJdTMyIFBMTF9MRDoxOwkvKiBSRiBQTExfTEQgc3RhdHVzICovCisJCXUzMiBCdXN5OjE7CS8qIDE6IEFTSUMgaXMgYnVzeSBleGVjdXRlIFJGIHByb2dyYW1taW5nLiAqLworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFBIWV9DU1I0X1NUUlVDLCAqUFBIWV9DU1I0X1NUUlVDOworCisvKiAqLworLyogU0VDX0NTUjU6IHNoYXJlZCBrZXkgdGFibGUgc2VjdXJpdHkgbW9kZSByZWdpc3RlciAqLworLyogKi8KK3R5cGVkZWYgdW5pb24gX1NFQ19DU1I1X1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgQnNzMktleTBDaXBoZXJBbGc6MzsKKwkJdTMyIDogMTsKKwkJdTMyIEJzczJLZXkxQ2lwaGVyQWxnOjM7CisJCXUzMiA6IDE7CisJCXUzMiBCc3MyS2V5MkNpcGhlckFsZzozOworCQl1MzIgOiAxOworCQl1MzIgQnNzMktleTNDaXBoZXJBbGc6MzsKKwkJdTMyIDogMTsKKwkJdTMyIEJzczNLZXkwQ2lwaGVyQWxnOjM7CisJCXUzMiA6IDE7CisJCXUzMiBCc3MzS2V5MUNpcGhlckFsZzozOworCQl1MzIgOiAxOworCQl1MzIgQnNzM0tleTJDaXBoZXJBbGc6MzsKKwkJdTMyIDogMTsKKwkJdTMyIEJzczNLZXkzQ2lwaGVyQWxnOjM7CisJCXUzMiA6IDE7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gU0VDX0NTUjVfU1RSVUMsICpQU0VDX0NTUjVfU1RSVUM7CisKKy8qICovCisvKiBIT1NUX0NNRF9DU1I6IEZvciBIT1NUIHRvIGludGVycnVwdCBlbWJlZGRlZCBwcm9jZXNzb3IgKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIF9IT1NUX0NNRF9DU1JfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBIb3N0Q29tbWFuZDo4OworCQl1MzIgUnN2OjI0OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IEhPU1RfQ01EX0NTUl9TVFJVQywgKlBIT1NUX0NNRF9DU1JfU1RSVUM7CisKKy8qICovCisvKiBBSUZTTl9DU1I6IEFJRlNOIGZvciBlYWNoIEVEQ0EgQUMgKi8KKy8qICovCisKKy8qICovCisvKiBFMlBST01fQ1NSOiBFRVBST00gY29udHJvbCByZWdpc3RlciAqLworLyogKi8KK3R5cGVkZWYgdW5pb24gX0UyUFJPTV9DU1JfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBSZWxvYWQ6MTsJLyogUmVsb2FkIEVFUFJPTSBjb250ZW50LCB3cml0ZSBvbmUgdG8gcmVsb2FkLCBzZWxmLWNsZWFyZWQuICovCisJCXUzMiBFZXByb21TSzoxOworCQl1MzIgRWVwcm9tQ1M6MTsKKwkJdTMyIEVlcHJvbURJOjE7CisJCXUzMiBFZXByb21ETzoxOworCQl1MzIgVHlwZToxOwkvKiAxOiA5M0M0NiwgMDo5M0M2NiAqLworCQl1MzIgTG9hZFN0YXR1czoxOwkvKiAxOmxvYWRpbmcsIDA6ZG9uZSAqLworCQl1MzIgUnN2ZDoyNTsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBFMlBST01fQ1NSX1NUUlVDLCAqUEUyUFJPTV9DU1JfU1RSVUM7CisKKy8qICovCisvKiBRT1NfQ1NSMDogVFhPUCBob2xkZXIgYWRkcmVzczAgcmVnaXN0ZXIgKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIF9RT1NfQ1NSMF9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTggQnl0ZTA7CS8qIE1BQyBhZGRyZXNzIGJ5dGUgMCAqLworCQl1OCBCeXRlMTsJLyogTUFDIGFkZHJlc3MgYnl0ZSAxICovCisJCXU4IEJ5dGUyOwkvKiBNQUMgYWRkcmVzcyBieXRlIDIgKi8KKwkJdTggQnl0ZTM7CS8qIE1BQyBhZGRyZXNzIGJ5dGUgMyAqLworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFFPU19DU1IwX1NUUlVDLCAqUFFPU19DU1IwX1NUUlVDOworCisvKiAqLworLyogUU9TX0NTUjE6IFRYT1AgaG9sZGVyIGFkZHJlc3MxIHJlZ2lzdGVyICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfUU9TX0NTUjFfU1RSVUMgeworCXN0cnVjdCB7CisJCXU4IEJ5dGU0OwkvKiBNQUMgYWRkcmVzcyBieXRlIDQgKi8KKwkJdTggQnl0ZTU7CS8qIE1BQyBhZGRyZXNzIGJ5dGUgNSAqLworCQl1OCBSc3ZkMDsKKwkJdTggUnN2ZDE7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gUU9TX0NTUjFfU1RSVUMsICpQUU9TX0NTUjFfU1RSVUM7CisKKyNkZWZpbmUJUkZfQ1NSX0NGRwkweDUwMAordHlwZWRlZiB1bmlvbiBfUkZfQ1NSX0NGR19TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIFJGX0NTUl9EQVRBOjg7CS8qIERBVEEgKi8KKwkJdTMyIFRFU1RDU1JfUkZBQ0NfUkVHTlVNOjU7CS8qIFJGIHJlZ2lzdGVyIElEICovCisJCXUzMiBSc3ZkMjozOwkvKiBSZXNlcnZlZCAqLworCQl1MzIgUkZfQ1NSX1dSOjE7CS8qIDA6IHJlYWQgIDE6IHdyaXRlICovCisJCXUzMiBSRl9DU1JfS0lDSzoxOwkvKiBraWNrIFJGIHJlZ2lzdGVyIHJlYWQvd3JpdGUgKi8KKwkJdTMyIFJzdmQxOjE0OwkvKiBSZXNlcnZlZCAqLworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFJGX0NTUl9DRkdfU1RSVUMsICpQUkZfQ1NSX0NGR19TVFJVQzsKKworLyogKi8KKy8qIE90aGVyIG9uLWNoaXAgc2hhcmVkIG1lbW9yeSBzcGFjZSwgYmFzZSA9IDB4MjAwMCAqLworLyogKi8KKworLyogQ0lTIHNwYWNlIC0gYmFzZSBhZGRyZXNzID0gMHgyMDAwICovCisjZGVmaW5lIEhXX0NJU19CQVNFICAgICAgICAgICAgIDB4MjAwMAorCisvKiBDYXJyaWVyLXNlbnNlIENUUyBmcmFtZSBiYXNlIGFkZHJlc3MuIEl0J3Mgd2hlcmUgbWFjIHN0b3JlcyBjYXJyaWVyLXNlbnNlIGZyYW1lIGZvciBjYXJyaWVyLXNlbnNlIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIV19DU19DVFNfQkFTRQkJCTB4NzcwMAorLyogREZTIENUUyBmcmFtZSBiYXNlIGFkZHJlc3MuIEl0J3Mgd2hlcmUgbWFjIHN0b3JlcyBDVFMgZnJhbWUgZm9yIERGUy4gKi8KKyNkZWZpbmUgSFdfREZTX0NUU19CQVNFCQkJMHg3NzgwCisjZGVmaW5lIEhXX0NUU19GUkFNRV9TSVpFCQkweDgwCisKKy8qIDIwMDQtMTEtMDggam9obiAtIHNpbmNlIE5VTEwgZnJhbWUgd29uJ3QgYmUgdGhhdCBsb25nICgyNTYgYnl0ZSkuIFdlIHN0ZWFsIDE2IHRhaWwgYnl0ZXMgKi8KKy8qIHRvIHNhdmUgZGVidWdnaW5nIHNldHRpbmdzICovCisjZGVmaW5lIEhXX0RFQlVHX1NFVFRJTkdfQkFTRSAgIDB4NzdmMAkvKiAweDc3ZjB+MHg3N2ZmIHRvdGFsIDE2IGJ5dGVzICovCisjZGVmaW5lIEhXX0RFQlVHX1NFVFRJTkdfQkFTRTIgICAweDc3NzAJLyogMHg3N2YwfjB4NzdmZiB0b3RhbCAxNiBieXRlcyAqLworCisvKiBJbiBvcmRlciB0byBzdXBwb3J0IG1heGltdW0gOCBNQlNTIGFuZCBpdHMgbWF4aW11bSBsZW5ndGggaXMgNTEyIGZvciBlYWNoIGJlYWNvbiAqLworLyogVGhyZWUgc2VjdGlvbiBkaXNjb250aW51ZSBtZW1vcnkgc2VnbWVudHMgd2lsbCBiZSB1c2VkLiAqLworLyogMS4gVGhlIG9yaWdpbmFsIHJlZ2lvbiBmb3IgQkNOIDB+MyAqLworLyogMi4gRXh0cmFjdCBtZW1vcnkgZnJvbSBGQ0UgdGFibGUgZm9yIEJDTiA0fjUgKi8KKy8qIDMuIEV4dHJhY3QgbWVtb3J5IGZyb20gUGFpci13aXNlIGtleSB0YWJsZSBmb3IgQkNOIDZ+NyAqLworLyogICAgICAgIEl0IG9jY3VwaWVkIHRob3NlIG1lbW9yeSBvZiB3Y2lkIDIzOH4yNTMgZm9yIEJDTiA2ICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgd2NpZCAyMjJ+MjM3IGZvciBCQ04gNyAqLworI2RlZmluZSBIV19CRUFDT05fTUFYX1NJWkUgICAgICAweDEwMDAJLyogdW5pdDogYnl0ZSAqLworI2RlZmluZSBIV19CRUFDT05fQkFTRTAgICAgICAgICAweDc4MDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0UxICAgICAgICAgMHg3QTAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFMiAgICAgICAgIDB4N0MwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTMgICAgICAgICAweDdFMDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0U0ICAgICAgICAgMHg3MjAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFNSAgICAgICAgIDB4NzQwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTYgICAgICAgICAweDVEQzAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0U3ICAgICAgICAgMHg1QkMwCisKKyNkZWZpbmUgSFdfQkVBQ09OX01BWF9DT1VOVCAgICAgOAorI2RlZmluZSBIV19CRUFDT05fT0ZGU0VUCQkweDAyMDAKKyNkZWZpbmUgSFdfQkVBQ09OX0NPTlRFTlRfTEVOCShIV19CRUFDT05fT0ZGU0VUIC0gVFhXSV9TSVpFKQorCisvKiBIT1NULU1DVSBzaGFyZWQgbWVtb3J5IC0gYmFzZSBhZGRyZXNzID0gMHgyMTAwICovCisjZGVmaW5lIEhPU1RfQ01EX0NTUgkJMHg0MDQKKyNkZWZpbmUgSDJNX01BSUxCT1hfQ1NSICAgICAgICAgMHg3MDEwCisjZGVmaW5lIEgyTV9NQUlMQk9YX0NJRCAgICAgICAgIDB4NzAxNAorI2RlZmluZSBIMk1fTUFJTEJPWF9TVEFUVVMgICAgICAweDcwMWMKKyNkZWZpbmUgSDJNX0lOVF9TUkMgICAgICAgICAgICAgMHg3MDI0CisjZGVmaW5lIEgyTV9CQlBfQUdFTlQgICAgICAgICAgIDB4NzAyOAorI2RlZmluZSBNMkhfQ01EX0RPTkVfQ1NSICAgICAgICAweDAwMGMKKyNkZWZpbmUgTUNVX1RYT1BfQVJSQVlfQkFTRSAgICAgMHgwMDBjCS8qIFRPRE86IHRvIGJlIHByb3ZpZGVkIGJ5IEFsYmVydCAqLworI2RlZmluZSBNQ1VfVFhPUF9FTlRSWV9TSVpFICAgICAzMgkvKiBUT0RPOiB0byBiZSBwcm92aWRlZCBieSBBbGJlcnQgKi8KKyNkZWZpbmUgTUFYX05VTV9PRl9UWE9QX0VOVFJZICAgMTYJLyogVE9ETzogbXVzdCBiZSBzYW1lIHdpdGggODA1MSBmaXJtd2FyZSAqLworI2RlZmluZSBNQ1VfTUJPWF9WRVJTSU9OICAgICAgICAweDAxCS8qIFRPRE86IHRvIGJlIGNvbmZpcm1lZCBieSBBbGJlcnQgKi8KKyNkZWZpbmUgTUNVX01CT1hfVkVSU0lPTl9PRkZTRVQgNQkvKiBUT0RPOiB0byBiZSBwcm92aWRlZCBieSBBbGJlcnQgKi8KKworLyogKi8KKy8qIEhvc3QgRE1BIHJlZ2lzdGVycyAtIGJhc2UgYWRkcmVzcyAweDIwMCAuICBUWDAtMz1FRENBUWlkMC0zLCBUWDQ9SENDQSwgVFg1PU1HTVQsICovCisvKiAqLworLyogKi8KKy8qICBETUEgUklORyBERVNDUklQVE9SICovCisvKiAqLworI2RlZmluZSBFMlBST01fQ1NSICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBJT19DTlRMX0NTUiAgICAgICAgIDB4NzdkMAorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiBUeCAvIFJ4IC8gTWdtdCByaW5nIGRlc2NyaXB0b3IgZGVmaW5pdGlvbiAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiB0aGUgZm9sbG93aW5nIFBJRCB2YWx1ZXMgYXJlIHVzZWQgdG8gbWFyayBvdXRnb2luZyBmcmFtZSB0eXBlIGluIFRYRC0+UElEIHNvIHRoYXQgKi8KKy8qIHByb3BlciBUWCBzdGF0aXN0aWNzIGNhbiBiZSBjb2xsZWN0ZWQgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcyAqLworLyogYjMtMiBvZiBQSUQgZmllbGQgLSAqLworI2RlZmluZSBQSURfTUdNVAkJCTB4MDUKKyNkZWZpbmUgUElEX0JFQUNPTgkJCTB4MGMKKyNkZWZpbmUgUElEX0RBVEFfTk9STUFMVUNBU1QJCTB4MDIKKyNkZWZpbmUgUElEX0RBVEFfQU1QRFUJCTB4MDQKKyNkZWZpbmUgUElEX0RBVEFfTk9fQUNLCQkweDA4CisjZGVmaW5lIFBJRF9EQVRBX05PVF9OT1JNX0FDSwkJMHgwMworLyogdmFsdWUgZG9tYWluIG9mIHBUeEQtPkhvc3RRSWQgKDQtYml0OiAwfjE1KSAqLworI2RlZmluZSBRSURfQUNfQksgICAgICAgICAgICAgICAxCS8qIG1lZXQgQUNJIGRlZmluaXRpb24gaW4gODAyLjExZSAqLworI2RlZmluZSBRSURfQUNfQkUgICAgICAgICAgICAgICAwCS8qIG1lZXQgQUNJIGRlZmluaXRpb24gaW4gODAyLjExZSAqLworI2RlZmluZSBRSURfQUNfVkkgICAgICAgICAgICAgICAyCisjZGVmaW5lIFFJRF9BQ19WTyAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUUlEX0hDQ0EgICAgICAgICAgICAgICAgNAorI2RlZmluZSBOVU1fT0ZfVFhfUklORyAgICAgICAgICA0CisjZGVmaW5lIFFJRF9NR01UICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIFFJRF9SWCAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFFJRF9PVEhFUiAgICAgICAgICAgICAgIDE1CisKKyNlbmRpZiAvKiBfX1JUTVBfTUFDX0hfXyAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0bXBfcGh5LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvcnRtcF9waHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjhiMGY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0bXBfcGh5LmgKQEAgLTAsMCArMSw1NTYgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnRtcF9waHkuaAorCisJQWJzdHJhY3Q6CisJUmFsaW5rIFdpcmVsZXNzIENoaXAgUEhZKEJCUC9SRikgcmVsYXRlZCBkZWZpbml0aW9uICYgc3RydWN0dXJlcworCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkgIFdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBfX1JUTVBfUEhZX0hfXworI2RlZmluZSBfX1JUTVBfUEhZX0hfXworCisvKgorCVJGIHNlY3Rpb25zCisqLworI2RlZmluZSBSRl9SMDAJCQkwCisjZGVmaW5lIFJGX1IwMQkJCTEKKyNkZWZpbmUgUkZfUjAyCQkJMgorI2RlZmluZSBSRl9SMDMJCQkzCisjZGVmaW5lIFJGX1IwNAkJCTQKKyNkZWZpbmUgUkZfUjA1CQkJNQorI2RlZmluZSBSRl9SMDYJCQk2CisjZGVmaW5lIFJGX1IwNwkJCTcKKyNkZWZpbmUgUkZfUjA4CQkJOAorI2RlZmluZSBSRl9SMDkJCQk5CisjZGVmaW5lIFJGX1IxMAkJCTEwCisjZGVmaW5lIFJGX1IxMQkJCTExCisjZGVmaW5lIFJGX1IxMgkJCTEyCisjZGVmaW5lIFJGX1IxMwkJCTEzCisjZGVmaW5lIFJGX1IxNAkJCTE0CisjZGVmaW5lIFJGX1IxNQkJCTE1CisjZGVmaW5lIFJGX1IxNgkJCTE2CisjZGVmaW5lIFJGX1IxNwkJCTE3CisjZGVmaW5lIFJGX1IxOAkJCTE4CisjZGVmaW5lIFJGX1IxOQkJCTE5CisjZGVmaW5lIFJGX1IyMAkJCTIwCisjZGVmaW5lIFJGX1IyMQkJCTIxCisjZGVmaW5lIFJGX1IyMgkJCTIyCisjZGVmaW5lIFJGX1IyMwkJCTIzCisjZGVmaW5lIFJGX1IyNAkJCTI0CisjZGVmaW5lIFJGX1IyNQkJCTI1CisjZGVmaW5lIFJGX1IyNgkJCTI2CisjZGVmaW5lIFJGX1IyNwkJCTI3CisjZGVmaW5lIFJGX1IyOAkJCTI4CisjZGVmaW5lIFJGX1IyOQkJCTI5CisjZGVmaW5lIFJGX1IzMAkJCTMwCisjZGVmaW5lIFJGX1IzMQkJCTMxCisKKy8qIHZhbHVlIGRvbWFpbiBvZiBwQWQtPlJmSWNUeXBlICovCisjZGVmaW5lIFJGSUNfMjgyMCAgICAgICAgICAgICAgICAgICAxCS8qIDIuNEcgMlQzUiAqLworI2RlZmluZSBSRklDXzI4NTAgICAgICAgICAgICAgICAgICAgMgkvKiAyLjRHLzVHIDJUM1IgKi8KKyNkZWZpbmUgUkZJQ18yNzIwICAgICAgICAgICAgICAgICAgIDMJLyogMi40RyAxVDJSICovCisjZGVmaW5lIFJGSUNfMjc1MCAgICAgICAgICAgICAgICAgICA0CS8qIDIuNEcvNUcgMVQyUiAqLworI2RlZmluZSBSRklDXzMwMjAgICAgICAgICAgICAgICAgICAgNQkvKiAyLjRHIDFUMVIgKi8KKyNkZWZpbmUgUkZJQ18yMDIwICAgICAgICAgICAgICAgICAgIDYJLyogMi40RyBCL0cgKi8KKyNkZWZpbmUgUkZJQ18zMDIxICAgICAgICAgICAgICAgICAgIDcJLyogMi40RyAxVDJSICovCisjZGVmaW5lIFJGSUNfMzAyMiAgICAgICAgICAgICAgICAgICA4CS8qIDIuNEcgMlQyUiAqLworI2RlZmluZSBSRklDXzMwNTIgICAgICAgICAgICAgICAgICAgOQkvKiAyLjRHLzVHIDJUMlIgKi8KKworLyoKKwlCQlAgc2VjdGlvbnMKKyovCisjZGVmaW5lIEJCUF9SMAkJCTAJLyogdmVyc2lvbiAqLworI2RlZmluZSBCQlBfUjEJCQkxCS8qIFRTU0kgKi8KKyNkZWZpbmUgQkJQX1IyCQkJMgkvKiBUWCBjb25maWd1cmUgKi8KKyNkZWZpbmUgQkJQX1IzCQkJMworI2RlZmluZSBCQlBfUjQJCQk0CisjZGVmaW5lIEJCUF9SNQkJCTUKKyNkZWZpbmUgQkJQX1I2CQkJNgorI2RlZmluZSBCQlBfUjE0CQkJMTQJLyogUlggY29uZmlndXJlICovCisjZGVmaW5lIEJCUF9SMTYJCQkxNgorI2RlZmluZSBCQlBfUjE3CQkJMTcJLyogUlggc2Vuc2liaWxpdHkgKi8KKyNkZWZpbmUgQkJQX1IxOAkJCTE4CisjZGVmaW5lIEJCUF9SMjEJCQkyMQorI2RlZmluZSBCQlBfUjIyCQkJMjIKKyNkZWZpbmUgQkJQX1IyNAkJCTI0CisjZGVmaW5lIEJCUF9SMjUJCQkyNQorI2RlZmluZSBCQlBfUjI2CQkJMjYKKyNkZWZpbmUgQkJQX1IyNwkJCTI3CisjZGVmaW5lIEJCUF9SMzEJCQkzMQorI2RlZmluZSBCQlBfUjQ5CQkJNDkJLypUU1NJICovCisjZGVmaW5lIEJCUF9SNTAJCQk1MAorI2RlZmluZSBCQlBfUjUxCQkJNTEKKyNkZWZpbmUgQkJQX1I1MgkJCTUyCisjZGVmaW5lIEJCUF9SNTUJCQk1NQorI2RlZmluZSBCQlBfUjYyCQkJNjIJLyogUnggU1EwIFRocmVzaG9sZCBISUdIICovCisjZGVmaW5lIEJCUF9SNjMJCQk2MworI2RlZmluZSBCQlBfUjY0CQkJNjQKKyNkZWZpbmUgQkJQX1I2NQkJCTY1CisjZGVmaW5lIEJCUF9SNjYJCQk2NgorI2RlZmluZSBCQlBfUjY3CQkJNjcKKyNkZWZpbmUgQkJQX1I2OAkJCTY4CisjZGVmaW5lIEJCUF9SNjkJCQk2OQorI2RlZmluZSBCQlBfUjcwCQkJNzAJLyogUnggQUdDIFNRIENDSyBYY29yciB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgQkJQX1I3MwkJCTczCisjZGVmaW5lIEJCUF9SNzUJCQk3NQorI2RlZmluZSBCQlBfUjc3CQkJNzcKKyNkZWZpbmUgQkJQX1I3OAkJCTc4CisjZGVmaW5lIEJCUF9SNzkJCQk3OQorI2RlZmluZSBCQlBfUjgwCQkJODAKKyNkZWZpbmUgQkJQX1I4MQkJCTgxCisjZGVmaW5lIEJCUF9SODIJCQk4MgorI2RlZmluZSBCQlBfUjgzCQkJODMKKyNkZWZpbmUgQkJQX1I4NAkJCTg0CisjZGVmaW5lIEJCUF9SODYJCQk4NgorI2RlZmluZSBCQlBfUjkxCQkJOTEKKyNkZWZpbmUgQkJQX1I5MgkJCTkyCisjZGVmaW5lIEJCUF9SOTQJCQk5NAkvKiBUeCBHYWluIENvbnRyb2wgKi8KKyNkZWZpbmUgQkJQX1IxMDMJCTEwMworI2RlZmluZSBCQlBfUjEwNQkJMTA1CisjZGVmaW5lIEJCUF9SMTA2CQkxMDYKKyNkZWZpbmUgQkJQX1IxMTMJCTExMworI2RlZmluZSBCQlBfUjExNAkJMTE0CisjZGVmaW5lIEJCUF9SMTE1CQkxMTUKKyNkZWZpbmUgQkJQX1IxMTYJCTExNgorI2RlZmluZSBCQlBfUjExNwkJMTE3CisjZGVmaW5lIEJCUF9SMTE4CQkxMTgKKyNkZWZpbmUgQkJQX1IxMTkJCTExOQorI2RlZmluZSBCQlBfUjEyMAkJMTIwCisjZGVmaW5lIEJCUF9SMTIxCQkxMjEKKyNkZWZpbmUgQkJQX1IxMjIJCTEyMgorI2RlZmluZSBCQlBfUjEyMwkJMTIzCisjaWZkZWYgUlQzMHh4CisjZGVmaW5lIEJCUF9SMTM4CQkxMzgJLyogYWRkIGJ5IGpvaG5saSwgUkYgcG93ZXIgc2VxdWVuY2Ugc2V0dXAsIEFEQyBkeW5hbWljIG9uL29mZiBjb250cm9sICovCisjZW5kaWYgLyogUlQzMHh4IC8vICovCisKKyNkZWZpbmUgQkJQUjk0X0RFRkFVTFQJMHgwNgkvKiBBZGQgMSB2YWx1ZSB3aWxsIGdhaW4gMWRiICovCisKKy8qICovCisvKiBCQlAgJiBSRiBhcmUgdXNpbmcgaW5kaXJlY3QgYWNjZXNzLiBCZWZvcmUgd3JpdGUgYW55IHZhbHVlIGludG8gaXQuICovCisvKiBXZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBvdXRzdGFuZGluZyBjb21tYW5kIHBlbmRpbmcgdmlhIGNoZWNraW5nIGJ1c3kgYml0LiAqLworLyogKi8KKyNkZWZpbmUgTUFYX0JVU1lfQ09VTlQgIDEwMAkvKiBOdW1iZXIgb2YgcmV0cnkgYmVmb3JlIGZhaWxpbmcgYWNjZXNzIEJCUCAmIFJGIGluZGlyZWN0IHJlZ2lzdGVyICovCisKKy8qI2RlZmluZSBQSFlfVFJfU1dJVENIX1RJTUUgICAgICAgICAgNSAgLy8gdXNlYyAqLworCisvKiNkZWZpbmUgQkJQX1IxN19MT1dfU0VOU0lCSUxJVFkgICAgIDB4NTAgKi8KKy8qI2RlZmluZSBCQlBfUjE3X01JRF9TRU5TSUJJTElUWSAgICAgMHg0MSAqLworLyojZGVmaW5lIEJCUF9SMTdfRFlOQU1JQ19VUF9CT1VORCAgICAweDQwICovCisKKyNkZWZpbmUgUlNTSV9GT1JfVkVSWV9MT1dfU0VOU0lCSUxJVFkgICAtMzUKKyNkZWZpbmUgUlNTSV9GT1JfTE9XX1NFTlNJQklMSVRZCQktNTgKKyNkZWZpbmUgUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWQktODAKKyNkZWZpbmUgUlNTSV9GT1JfTUlEX1NFTlNJQklMSVRZCQktOTAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJUkYgcmVnaXN0ZXIgUmVhZC9Xcml0ZSBtYXJjbyBkZWZpbml0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgUlRNUF9NQUNfUENJCisjZGVmaW5lIFJUTVBfUkZfSU9fV1JJVEUzMihfQSwgX1YpICAgICAgICAgICAgICAgICAgXAorewkJCQkJCQkJCQkJXAorCWlmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKQkgICAgICAgICAgICAgICAgXAorCXsJCQkJCQkJCQkJCQlcCisJCVBIWV9DU1I0X1NUUlVDICBfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIF9idXN5Q250ID0gMDsgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkJCQkJCQkJXAorCQlkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlSVE1QX0lPX1JFQUQzMigoX0EpLCBSRl9DU1JfQ0ZHMCwgJl92YWx1ZS53b3JkKTsgIFwKKwkJCWlmIChfdmFsdWUuZmllbGQuQnVzeSA9PSBJRExFKSAgICAgICAgICAgICAgIFwKKwkJCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJX2J1c3lDbnQrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQl9d2hpbGUgKF9idXN5Q250IDwgTUFYX0JVU1lfQ09VTlQpOwkJCVwKKwkJaWYoX2J1c3lDbnQgPCBNQVhfQlVTWV9DT1VOVCkgICAgICAgICAgICAgICAgICAgXAorCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlSVE1QX0lPX1dSSVRFMzIoKF9BKSwgUkZfQ1NSX0NGRzAsIChfVikpOyAgICAgICAgICBcCisJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9CQkJCQkJCQlcCit9CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisjaWZkZWYgUlRNUF9NQUNfVVNCCisjZGVmaW5lIFJUTVBfUkZfSU9fV1JJVEUzMihfQSwgX1YpICAgICAgICAgICAgICAgICBSVFVTQldyaXRlUkZSZWdpc3RlcihfQSwgX1YpCisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisKKyNpZmRlZiBSVDMweHgKKyNkZWZpbmUgUlRNUF9SRl9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpICAgIFJUMzB4eFJlYWRSRlJlZ2lzdGVyKF9BLCBfSSwgX3BWKQorI2RlZmluZSBSVE1QX1JGX0lPX1dSSVRFOF9CWV9SRUdfSUQoX0EsIF9JLCBfVikgICAgUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKF9BLCBfSSwgX1YpCisjZW5kaWYgLyogUlQzMHh4IC8vICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCUJCUCByZWdpc3RlciBSZWFkL1dyaXRlIG1hcmNvIGRlZmluaXRpb25zLgorCXdlIHJlYWQvd3JpdGUgdGhlIGJicCB2YWx1ZSBieSByZWdpc3RlcidzIElELgorCUdlbmVyYXRlIFBFUiB0byB0ZXN0IEJBCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgUlRNUF9NQUNfUENJCisvKgorCWJhc2ljIG1hcmNvIGZvciBCQlAgcmVhZCBvcGVyYXRpb24uCisJX3BBZDogdGhlIGRhdGEgc3RydWN0dXJlIHBvaW50ZXIgb2Ygc3RydWN0IHJ0X3J0bXBfYWRhcHRlcgorCV9iYnBJRCA6IHRoZSBiYnAgcmVnaXN0ZXIgSUQKKwlfcFY6IGRhdGEgcG9pbnRlciB1c2VkIHRvIHNhdmUgdGhlIHZhbHVlIG9mIHF1ZXJpZWQgYmJwIHJlZ2lzdGVyLgorCV9iVmlhTUNVOiBpZiB3ZSBuZWVkIGFjY2VzcyB0aGUgYmJwIHZpYSB0aGUgTUNVLgorKi8KKyNkZWZpbmUgUlRNUF9CQlBfSU9fUkVBRDgoX3BBZCwgX2JicElELCBfcFYsIF9iVmlhTUNVKQkJCVwKKwlkb3sJCQkJCQkJCQkJCQkJCQlcCisJCUJCUF9DU1JfQ0ZHX1NUUlVDICBCYnBDc3I7CQkJCQkJCQlcCisJCWludCAgIF9idXN5Q250LCBfc2VjQ250LCBfcmVnSUQ7CQkJCQkJXAorCQkJCQkJCQkJCQkJCQkJCVwKKwkJX3JlZ0lEID0gKChfYlZpYU1DVSkgPT0gVFJVRSA/IEgyTV9CQlBfQUdFTlQgOiBCQlBfQ1NSX0NGRyk7CVwKKwkJZm9yIChfYnVzeUNudD0wOyBfYnVzeUNudDxNQVhfQlVTWV9DT1VOVDsgX2J1c3lDbnQrKykgICAgICBcCisJCXsJCQkJCQkJCQkJCQkJXAorCQkJUlRNUF9JT19SRUFEMzIoX3BBZCwgX3JlZ0lELCAmQmJwQ3NyLndvcmQpOwkJXAorCQkJaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpICAgICAgICAgICAgICAgICAgXAorCQkJCWNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJQmJwQ3NyLndvcmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJQmJwQ3NyLmZpZWxkLmZSZWFkID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJQmJwQ3NyLmZpZWxkLkJCUF9SV19NT0RFID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJQmJwQ3NyLmZpZWxkLlJlZ051bSA9IF9iYnBJRDsgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCVJUTVBfSU9fV1JJVEUzMihfcEFkLCBfcmVnSUQsIEJicENzci53b3JkKTsgICAgIFwKKwkJCWlmICgoX2JWaWFNQ1UpID09IFRSVUUpCQkJCQkJCVwKKwkJCXsJCQkJCQkJCQkJCQkJXAorCQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KF9wQWQsIDB4ODAsIDB4ZmYsIDB4MCwgMHgwKTsgXAorCQkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CVwKKwkJCX0JCQkJCQkJXAorCQkJZm9yIChfc2VjQ250PTA7IF9zZWNDbnQ8TUFYX0JVU1lfQ09VTlQ7IF9zZWNDbnQrKykgICAgICAgXAorCQkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCVJUTVBfSU9fUkVBRDMyKF9wQWQsIF9yZWdJRCwgJkJicENzci53b3JkKTsgXAorCQkJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKSAgICAgICAgICAgICAgXAorCQkJCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJaWYgKChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKSAmJiAgICAgICAgICAgICAgXAorCQkJCShCYnBDc3IuZmllbGQuUmVnTnVtID09IF9iYnBJRCkpICAgICAgICAgICAgICAgIFwKKwkJCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkqKF9wVikgPSAodTgpQmJwQ3NyLmZpZWxkLlZhbHVlOyAgICAgICAgIFwKKwkJCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpICAgICAgICAgICAgICAgICAgICAgIFwKKwkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCURCR1BSSU5UX0VSUigoIkJCUCh2aWFNQ1U9JWQpIHJlYWQgUiVkIGZhaWxcbiIsIChfYlZpYU1DVSksIF9iYnBJRCkpOyAgICAgIFwKKwkJCSooX3BWKSA9IChfcEFkKS0+QmJwV3JpdGVMYXRjaFtfYmJwSURdOyAgICAgICAgICAgICAgIFwKKwkJCWlmICgoX2JWaWFNQ1UpID09IFRSVUUpCQkJCVwKKwkJCXsJCQkJCQkJCQlcCisJCQkJUlRNUF9JT19SRUFEMzIoX3BBZCwgX3JlZ0lELCAmQmJwQ3NyLndvcmQpOwkJCQlcCisJCQkJQmJwQ3NyLmZpZWxkLkJ1c3kgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCVJUTVBfSU9fV1JJVEUzMihfcEFkLCBfcmVnSUQsIEJicENzci53b3JkKTsJCQkJXAorCQkJfQkJCQlcCisJCX0JCQkJCQkJCQkJCQkJXAorCX13aGlsZSgwKQorCisvKgorCVRoaXMgbWFyY28gdXNlZCBmb3IgdGhlIEJCUCByZWFkIG9wZXJhdGlvbiB3aGljaCBkaWRuJ3QgbmVlZCB2aWEgTUNVLgorKi8KKyNkZWZpbmUgQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChfQSwgX0ksIF9wVikJCQlcCisJUlRNUF9CQlBfSU9fUkVBRDgoKF9BKSwgKF9JKSwgKF9wViksIEZBTFNFKQorCisvKgorCVRoaXMgbWFyY28gdXNlZCBmb3IgdGhlIEJCUCByZWFkIG9wZXJhdGlvbiB3aGljaCBuZWVkIHZpYSBNQ1UuCisJQnV0IGZvciBzb21lIGNoaXBzZXQgd2hpY2ggZGlkbid0IGhhdmUgbWN1IChlLmcuLCBSQlVTIGJhc2VkIGNoaXBzZXQpLCB3ZQorCXdpbGwgdXNlIHRoaXMgZnVuY3Rpb24gdG9vIGFuZCBkaWRuJ3QgYWNjZXNzIHRoZSBiYnAgcmVnaXN0ZXIgdmlhIHRoZSBNQ1UuCisqLworLyogUmVhZCBCQlAgcmVnaXN0ZXIgYnkgcmVnaXN0ZXIncyBJRC4gR2VuZXJhdGUgUEVSIHRvIHRlc3QgQkEgKi8KKyNkZWZpbmUgUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKF9BLCBfSSwgX3BWKQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJCQlcCisJQkJQX0NTUl9DRkdfU1RSVUMJQmJwQ3NyOwkJCQkJCQkJCQkJXAorCWludAkJCQkJaSwgazsJCQlcCisJQk9PTEVBTgkJCQkJYnJjOwkJCVwKKwlCYnBDc3IuZmllbGQuQnVzeSA9IElETEU7CQkJXAorCWlmICgoSVNfUlQzMDkwKChfQSkpIHx8IElTX1JUMzU3MigoX0EpKSB8fCBJU19SVDMzOTAoKF9BKSkpICYmICgoX0EpLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQlcCisJCSYmICgoX0EpLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpCVwKKwkJJiYgKChfQSktPmJQQ0ljbGtPZmYgPT0gRkFMU0UpCVwKKwkJJiYgKChfQSktPmJydDMweHhCYW5NY3VDbWQgPT0gRkFMU0UpKQlcCisJewkJCQkJCQkJCQkJCQkJCQkJXAorCQlmb3IgKGk9MDsgaTxNQVhfQlVTWV9DT1VOVDsgaSsrKQkJCQkJCQkJCVwKKwkJewkJCQkJCQkJCQkJCQkJCQkJXAorCQkJUlRNUF9JT19SRUFEMzIoX0EsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CQkJCVwKKwkJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKQkJCQkJCQkJCVwKKwkJCXsJCQkJCQkJCQkJCQkJCQkJXAorCQkJCWNvbnRpbnVlOwkJCQkJCQkJCQkJCQlcCisJCQl9CQkJCQkJCQkJCQkJCQkJCVwKKwkJCUJicENzci53b3JkID0gMDsJCQkJCQkJCQkJCQlcCisJCQlCYnBDc3IuZmllbGQuZlJlYWQgPSAxOwkJCQkJCQkJCQkJXAorCQkJQmJwQ3NyLmZpZWxkLkJCUF9SV19NT0RFID0gMTsJCQkJCQkJCQlcCisJCQlCYnBDc3IuZmllbGQuQnVzeSA9IDE7CQkJCQkJCQkJCQlcCisJCQlCYnBDc3IuZmllbGQuUmVnTnVtID0gX0k7CQkJCQkJCQkJCVwKKwkJCVJUTVBfSU9fV1JJVEUzMihfQSwgSDJNX0JCUF9BR0VOVCwgQmJwQ3NyLndvcmQpOwkJCQlcCisJCQlicmMgPSBBc2ljU2VuZENvbW1hbmRUb01jdShfQSwgMHg4MCwgMHhmZiwgMHgwLCAweDApOwkJCQkJXAorCQkJaWYgKGJyYyA9PSBUUlVFKQkJCQkJCQkJCQkJCQkJCQlcCisJCQl7CQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlmb3IgKGs9MDsgazxNQVhfQlVTWV9DT1VOVDsgaysrKQkJCQkJCQkJXAorCQkJCXsJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQlSVE1QX0lPX1JFQUQzMihfQSwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsJCQlcCisJCQkJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKQkJCQkJCQkJXAorCQkJCQkJYnJlYWs7CQkJCQkJCQkJCQkJCVwKKwkJCQl9CQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoKEJicENzci5maWVsZC5CdXN5ID09IElETEUpICYmCQkJCQkJCQlcCisJCQkJCShCYnBDc3IuZmllbGQuUmVnTnVtID09IF9JKSkJCQkJCQkJCVwKKwkJCQl7CQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKihfcFYpID0gKHU4KUJicENzci5maWVsZC5WYWx1ZTsJCQkJCQkJXAorCQkJCQlicmVhazsJCQkJCQkJCQkJCQkJCVwKKwkJCQl9CQkJCQkJCQkJCQkJCQkJCVwKKwkJCX0JCQkJCQkJCQkJCQkJCQkJXAorCQkJZWxzZQkJCQkJCQkJCQkJCQkJCQlcCisJCQl7CQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlCYnBDc3IuZmllbGQuQnVzeSA9IDA7CQkJCQkJCQkJCQlcCisJCQkJUlRNUF9JT19XUklURTMyKF9BLCBIMk1fQkJQX0FHRU5ULCBCYnBDc3Iud29yZCk7CQkJCVwKKwkJCX0JCQkJCQkJCQkJCQkJCQkJXAorCQl9CQkJCQkJCQkJCQkJCQkJCQlcCisJfQlcCisJZWxzZSBpZiAoISgoSVNfUlQzMDkwKChfQSkpIHx8IElTX1JUMzU3MigoX0EpKSB8fCBJU19SVDMzOTAoKF9BKSkpICYmICgoX0EpLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQlcCisJCSYmICgoX0EpLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpKQlcCisJCSYmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKSkJXAorCXsJCQkJCQkJCQkJCQkJCQkJCVwKKwkJZm9yIChpPTA7IGk8TUFYX0JVU1lfQ09VTlQ7IGkrKykJCQkJCQkJCQlcCisJCXsJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCVJUTVBfSU9fUkVBRDMyKF9BLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOwkJCQlcCisJCQlpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkJCQkJCQkJCQlcCisJCQl7CQkJCQkJCQkJCQkJCQkJCVwKKwkJCQljb250aW51ZTsJCQkJCQkJCQkJCQkJXAorCQkJfQkJCQkJCQkJCQkJCQkJCQlcCisJCQlCYnBDc3Iud29yZCA9IDA7CQkJCQkJCQkJCQkJXAorCQkJQmJwQ3NyLmZpZWxkLmZSZWFkID0gMTsJCQkJCQkJCQkJCVwKKwkJCUJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7CQkJCQkJCQkJXAorCQkJQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOwkJCQkJCQkJCQkJXAorCQkJQmJwQ3NyLmZpZWxkLlJlZ051bSA9IF9JOwkJCQkJCQkJCQlcCisJCQlSVE1QX0lPX1dSSVRFMzIoX0EsIEgyTV9CQlBfQUdFTlQsIEJicENzci53b3JkKTsJCQkJXAorCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UoX0EsIDB4ODAsIDB4ZmYsIDB4MCwgMHgwKTsJCQkJCVwKKwkJCWZvciAoaz0wOyBrPE1BWF9CVVNZX0NPVU5UOyBrKyspCQkJCQkJCQlcCisJCQl7CQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlSVE1QX0lPX1JFQUQzMihfQSwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsJCQlcCisJCQkJaWYgKEJicENzci5maWVsZC5CdXN5ID09IElETEUpCQkJCQkJCQlcCisJCQkJCWJyZWFrOwkJCQkJCQkJCQkJCQlcCisJCQl9CQkJCQkJCQkJCQkJCQkJCVwKKwkJCWlmICgoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gSURMRSkgJiYJCQkJCQkJCVwKKwkJCQkoQmJwQ3NyLmZpZWxkLlJlZ051bSA9PSBfSSkpCQkJCQkJCQlcCisJCQl7CQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkqKF9wVikgPSAodTgpQmJwQ3NyLmZpZWxkLlZhbHVlOwkJCQkJCQlcCisJCQkJYnJlYWs7CQkJCQkJCQkJCQkJCQlcCisJCQl9CQkJCQkJCQkJCQkJCQkJCVwKKwkJfQkJCQkJCQkJCQkJCQkJCQkJXAorCX0JCQkJCQkJCQkJCQkJCQkJCVwKKwllbHNlCQkJCQkJCQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJCQlcCisJCURCR1BSSU5UX0VSUigoIiAsIGJydDMweHhCYW5NY3VDbWQgPSAlZCwgUmVhZCBCQlAgJWQgXG4iLCAoX0EpLT5icnQzMHh4QmFuTWN1Q21kLCAoX0kpKSk7CVwKKwkJKihfcFYpID0gKF9BKS0+QmJwV3JpdGVMYXRjaFtfSV07CQkJCQkJCQlcCisJfQkJCQkJCQkJCQkJCQkJCQkJXAorCWlmICgoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkgfHwgKChfQSktPmJQQ0ljbGtPZmYgPT0gVFJVRSkpCQkJCQkJCQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJCQlcCisJCURCR1BSSU5UX0VSUigoIkJCUCByZWFkIFIlZD0weCV4IGZhaWxcbiIsIF9JLCBCYnBDc3Iud29yZCkpOwlcCisJCSooX3BWKSA9IChfQSktPkJicFdyaXRlTGF0Y2hbX0ldOwkJCQkJCQkJXAorCX0JCQkJCQkJCQkJCQkJCQkJCVwKK30KKworLyoKKwliYXNpYyBtYXJjbyBmb3IgQkJQIHdyaXRlIG9wZXJhdGlvbi4KKwlfcEFkOiB0aGUgZGF0YSBzdHJ1Y3R1cmUgcG9pbnRlciBvZiBzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyCisJX2JicElEIDogdGhlIGJicCByZWdpc3RlciBJRAorCV9wVjogZGF0YSB1c2VkIHRvIHNhdmUgdGhlIHZhbHVlIG9mIHF1ZXJpZWQgYmJwIHJlZ2lzdGVyLgorCV9iVmlhTUNVOiBpZiB3ZSBuZWVkIGFjY2VzcyB0aGUgYmJwIHZpYSB0aGUgTUNVLgorKi8KKyNkZWZpbmUgUlRNUF9CQlBfSU9fV1JJVEU4KF9wQWQsIF9iYnBJRCwgX3BWLCBfYlZpYU1DVSkJCQlcCisJZG97CQkJCQkJCQkJCQkJCQkJXAorCQlCQlBfQ1NSX0NGR19TVFJVQyAgQmJwQ3NyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpbnQgICAgICAgICAgICAgX2J1c3lDbnQsIF9yZWdJRDsJCQkJCQkJXAorCQkJCQkJCQkJCQkJCQkJCVwKKwkJX3JlZ0lEID0gKChfYlZpYU1DVSkgPT0gVFJVRSA/IEgyTV9CQlBfQUdFTlQgOiBCQlBfQ1NSX0NGRyk7CVwKKwkJZm9yIChfYnVzeUNudD0wOyBfYnVzeUNudDxNQVhfQlVTWV9DT1VOVDsgX2J1c3lDbnQrKykgIFwKKwkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCVJUTVBfSU9fUkVBRDMyKChfcEFkKSwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7ICAgICBcCisJCQlpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkgICAgICAgICAgICAgICAgICBcCisJCQkJY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlCYnBDc3Iud29yZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlCYnBDc3IuZmllbGQuZlJlYWQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlCYnBDc3IuZmllbGQuQkJQX1JXX01PREUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlCYnBDc3IuZmllbGQuQnVzeSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlCYnBDc3IuZmllbGQuVmFsdWUgPSBfcFY7ICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJQmJwQ3NyLmZpZWxkLlJlZ051bSA9IF9iYnBJRDsgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCVJUTVBfSU9fV1JJVEUzMigoX3BBZCksIEJCUF9DU1JfQ0ZHLCBCYnBDc3Iud29yZCk7ICAgICBcCisJCQlpZiAoKF9iVmlhTUNVKSA9PSBUUlVFKQkJCQkJCQkJCVwKKwkJCXsJCQkJCQkJCQkJCQkJCVwKKwkJCQlBc2ljU2VuZENvbW1hbmRUb01jdShfcEFkLCAweDgwLCAweGZmLCAweDAsIDB4MCk7CQlcCisJCQkJaWYgKChfcEFkKS0+T3BNb2RlID09IE9QTU9ERV9BUCkJCQkJCQlcCisJCQkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CQkJCQkJCVwKKwkJCX0JCQkJCQkJCQkJCQkJCVwKKwkJCShfcEFkKS0+QmJwV3JpdGVMYXRjaFtfYmJwSURdID0gX3BWOwkJCQkJXAorCQkJYnJlYWs7CQkJCQkJCQkJCQkJCVwKKwkJfQkJCQkJCQkJCQkJCQkJXAorCQlpZiAoX2J1c3lDbnQgPT0gTUFYX0JVU1lfQ09VTlQpCQkJCQkJCQlcCisJCXsJCQkJCQkJCQkJCQkJCVwKKwkJCURCR1BSSU5UX0VSUigoIkJCUCB3cml0ZSBSJWQgZmFpbFxuIiwgX2JicElEKSk7CQkJCVwKKwkJCWlmKChfYlZpYU1DVSkgPT0gVFJVRSkJCQkJCQkJCQlcCisJCQl7CQkJCQkJCQkJCQkJCQlcCisJCQkJUlRNUF9JT19SRUFEMzIoX3BBZCwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsJXAorCQkJCUJicENzci5maWVsZC5CdXN5ID0gMDsJCQkJCQkJCQlcCisJCQkJUlRNUF9JT19XUklURTMyKF9wQWQsIEgyTV9CQlBfQUdFTlQsIEJicENzci53b3JkKTsJXAorCQkJfQkJCQkJCQkJCQkJCQkJXAorCQl9CQkJCQkJCQkJCQkJCQlcCisJfXdoaWxlKDApCisKKy8qCisJVGhpcyBtYXJjbyB1c2VkIGZvciB0aGUgQkJQIHdyaXRlIG9wZXJhdGlvbiB3aGljaCBkaWRuJ3QgbmVlZCB2aWEgTUNVLgorKi8KKyNkZWZpbmUgQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpCQkJXAorCVJUTVBfQkJQX0lPX1dSSVRFOCgoX0EpLCAoX0kpLCAoX3BWKSwgRkFMU0UpCisKKy8qCisJVGhpcyBtYXJjbyB1c2VkIGZvciB0aGUgQkJQIHdyaXRlIG9wZXJhdGlvbiB3aGljaCBuZWVkIHZpYSBNQ1UuCisJQnV0IGZvciBzb21lIGNoaXBzZXQgd2hpY2ggZGlkbid0IGhhdmUgbWN1IChlLmcuLCBSQlVTIGJhc2VkIGNoaXBzZXQpLCB3ZQorCXdpbGwgdXNlIHRoaXMgZnVuY3Rpb24gdG9vIGFuZCBkaWRuJ3QgYWNjZXNzIHRoZSBiYnAgcmVnaXN0ZXIgdmlhIHRoZSBNQ1UuCisqLworLyogV3JpdGUgQkJQIHJlZ2lzdGVyIGJ5IHJlZ2lzdGVyJ3MgSUQgJiB2YWx1ZSAqLworI2RlZmluZSBSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKF9BLCBfSSwgX1YpCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJCVwKKwlCQlBfQ1NSX0NGR19TVFJVQwlCYnBDc3I7CQkJCQkJCQkJCQlcCisJaW50CQkJCQlCdXN5Q250ID0gMDsJCQkJCQkJCQkJXAorCUJPT0xFQU4JCQkJCWJyYzsJCQlcCisJaWYgKF9JIDwgTUFYX05VTV9PRl9CQlBfTEFUQ0gpCQkJCQkJCQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJCQlcCisJCWlmICgoSVNfUlQzMDkwKChfQSkpIHx8IElTX1JUMzU3MigoX0EpKSB8fCBJU19SVDMzOTAoKF9BKSkpICYmICgoX0EpLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQlcCisJCQkmJiAoKF9BKS0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKQlcCisJCQkmJiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkJXAorCQkJJiYgKChfQSktPmJydDMweHhCYW5NY3VDbWQgPT0gRkFMU0UpKQlcCisJCXsJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCWlmIChfQS0+QWNjZXNzQkJQRmFpbENvdW50ID4gMjApCQkJCQkJCQkJXAorCQkJewkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCUFzaWNSZXNldEJCUEFnZW50KF9BKTsJCQkJXAorCQkJCV9BLT5BY2Nlc3NCQlBGYWlsQ291bnQgPSAwOwkJCQkJCQkJCQkJXAorCQkJfQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJZm9yIChCdXN5Q250PTA7IEJ1c3lDbnQ8TUFYX0JVU1lfQ09VTlQ7IEJ1c3lDbnQrKykJCQkJCVwKKwkJCXsJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlSVE1QX0lPX1JFQUQzMihfQSwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsJCQkJXAorCQkJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKQkJCQkJCQkJCVwKKwkJCQkJY29udGludWU7CQkJCQkJCQkJCQkJCVwKKwkJCQlCYnBDc3Iud29yZCA9IDA7CQkJCQkJCQkJCQkJXAorCQkJCUJicENzci5maWVsZC5mUmVhZCA9IDA7CQkJCQkJCQkJCQlcCisJCQkJQmJwQ3NyLmZpZWxkLkJCUF9SV19NT0RFID0gMTsJCQkJCQkJCQlcCisJCQkJQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOwkJCQkJCQkJCQkJXAorCQkJCUJicENzci5maWVsZC5WYWx1ZSA9IF9WOwkJCQkJCQkJCQlcCisJCQkJQmJwQ3NyLmZpZWxkLlJlZ051bSA9IF9JOwkJCQkJCQkJCQlcCisJCQkJUlRNUF9JT19XUklURTMyKF9BLCBIMk1fQkJQX0FHRU5ULCBCYnBDc3Iud29yZCk7CQkJCVwKKwkJCQlicmMgPSBBc2ljU2VuZENvbW1hbmRUb01jdShfQSwgMHg4MCwgMHhmZiwgMHgwLCAweDApOwkJCQkJXAorCQkJCWlmIChicmMgPT0gVFJVRSkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCXsJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoX0EpLT5CYnBXcml0ZUxhdGNoW19JXSA9IF9WOwkJCQkJCQkJCVwKKwkJCQl9CQkJCQkJCQkJCQkJCQkJCVwKKwkJCQllbHNlCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQl7CQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJQmJwQ3NyLmZpZWxkLkJ1c3kgPSAwOwkJCQkJCQkJCQkJXAorCQkJCQlSVE1QX0lPX1dSSVRFMzIoX0EsIEgyTV9CQlBfQUdFTlQsIEJicENzci53b3JkKTsJCQkJXAorCQkJCX0JCQkJCQkJCQkJCQkJCQkJXAorCQkJCWJyZWFrOwkJCQkJCQkJCQkJCQkJCVwKKwkJCX0JCQkJCQkJCQkJCQkJCQkJCVwKKwkJfQkJCQkJCQkJCQkJCQkJCQkJXAorCQllbHNlIGlmICghKChJU19SVDMwOTAoKF9BKSkgfHwgSVNfUlQzNTcyKChfQSkpIHx8IElTX1JUMzM5MCgoX0EpKSkgJiYgKChfQSktPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID09IDMpCVwKKwkJCSYmICgoX0EpLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpKQlcCisJCQkmJiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkpCVwKKwkJewkJCQkJCQkJCQkJCQkJCQkJXAorCQkJaWYgKF9BLT5BY2Nlc3NCQlBGYWlsQ291bnQgPiAyMCkJCQkJCQkJCQlcCisJCQl7CQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJQXNpY1Jlc2V0QkJQQWdlbnQoX0EpOwkJCQlcCisJCQkJX0EtPkFjY2Vzc0JCUEZhaWxDb3VudCA9IDA7CQkJCQkJCQkJCQlcCisJCQl9CQkJCQkJCQkJCQkJCQkJCQlcCisJCQlmb3IgKEJ1c3lDbnQ9MDsgQnVzeUNudDxNQVhfQlVTWV9DT1VOVDsgQnVzeUNudCsrKQkJCQkJXAorCQkJewkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCVJUTVBfSU9fUkVBRDMyKF9BLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOwkJCQlcCisJCQkJaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpCQkJCQkJCQkJXAorCQkJCQljb250aW51ZTsJCQkJCQkJCQkJCQkJXAorCQkJCUJicENzci53b3JkID0gMDsJCQkJCQkJCQkJCQlcCisJCQkJQmJwQ3NyLmZpZWxkLmZSZWFkID0gMDsJCQkJCQkJCQkJCVwKKwkJCQlCYnBDc3IuZmllbGQuQkJQX1JXX01PREUgPSAxOwkJCQkJCQkJCVwKKwkJCQlCYnBDc3IuZmllbGQuQnVzeSA9IDE7CQkJCQkJCQkJCQlcCisJCQkJQmJwQ3NyLmZpZWxkLlZhbHVlID0gX1Y7CQkJCQkJCQkJCVwKKwkJCQlCYnBDc3IuZmllbGQuUmVnTnVtID0gX0k7CQkJCQkJCQkJCVwKKwkJCQlSVE1QX0lPX1dSSVRFMzIoX0EsIEgyTV9CQlBfQUdFTlQsIEJicENzci53b3JkKTsJCQkJXAorCQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KF9BLCAweDgwLCAweGZmLCAweDAsIDB4MCk7CQkJCQlcCisJCQkJKF9BKS0+QmJwV3JpdGVMYXRjaFtfSV0gPSBfVjsJCQkJCQkJCQlcCisJCQkJYnJlYWs7CQkJCQkJCQkJCQkJCQkJXAorCQkJfQkJCQkJCQkJCQkJCQkJCQkJXAorCQl9CQkJCQkJCQkJCQkJCQkJCQlcCisJCWVsc2UJCQkJCQkJCQkJXAorCQl7CQkJCQkJCQkJCQkJCQkJCQlcCisJCQlEQkdQUklOVF9FUlIoKCIgIGJydDMweHhCYW5NY3VDbWQgPSAlZC4gV3JpdGUgQkJQICVkIFxuIiwgIChfQSktPmJydDMweHhCYW5NY3VDbWQsIChfSSkpKTsJXAorCQl9CQkJCQkJCQkJCQkJCQkJCQlcCisJCWlmICgoQnVzeUNudCA9PSBNQVhfQlVTWV9DT1VOVCkgfHwgKChfQSktPmJQQ0ljbGtPZmYgPT0gVFJVRSkpCQkJXAorCQl7CQkJCQkJCQkJCQkJCQkJCQlcCisJCQlpZiAoQnVzeUNudCA9PSBNQVhfQlVTWV9DT1VOVCkJCQkJCVwKKwkJCQkoX0EpLT5BY2Nlc3NCQlBGYWlsQ291bnQrKzsJCQkJCVwKKwkJCURCR1BSSU5UX0VSUigoIkJCUCB3cml0ZSBSJWQ9MHgleCBmYWlsLiBCdXN5Q250PSAlZC5iUENJY2xrT2ZmID0gJWQuIFxuIiwgX0ksIEJicENzci53b3JkLCBCdXN5Q250LCAoX0EpLT5iUENJY2xrT2ZmICkpOwlcCisJCX0JCQkJCQkJCQkJCQkJCQkJCVwKKwl9CQkJCQkJCQkJCQkJCQkJCQkJXAorCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCisJewkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJREJHUFJJTlRfRVJSKCgiKioqKioqIEJCUF9Xcml0ZV9MYXRjaCBCdWZmZXIgZXhjZWVkcyBtYXggYm91bmRyeSAqKioqKiogXG4iKSk7CVwKKwl9CQkJCQkJCQkJCQkJCQkJCQkJXAorfQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCisjaWZkZWYgUlRNUF9NQUNfVVNCCisjZGVmaW5lIFJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChfQSwgX0ksIF9wVikgICBSVFVTQlJlYWRCQlBSZWdpc3RlcihfQSwgX0ksIF9wVikKKyNkZWZpbmUgUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChfQSwgX0ksIF9WKSAgIFJUVVNCV3JpdGVCQlBSZWdpc3RlcihfQSwgX0ksIF9WKQorCisjZGVmaW5lIEJCUF9JT19XUklURThfQllfUkVHX0lEKF9BLCBfSSwgX1YpCQkJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKF9BLCBfSSwgX1YpCisjZGVmaW5lIEJCUF9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpCQlSVFVTQlJlYWRCQlBSZWdpc3RlcihfQSwgX0ksIF9wVikKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKworI2lmZGVmIFJUMzB4eAorI2RlZmluZSBSVE1QX0FTSUNfTU1QU19ESVNBQkxFKF9wQWQpCQkJCQkJCVwKKwlkb3sJCQkJCQkJCQkJCQkJCQlcCisJCXUzMiBfbWFjRGF0YTsgXAorCQl1OCBfYmJwRGF0YSA9IDA7IFwKKwkJLyogZGlzYWJsZSBNTVBTIEJCUCBjb250cm9sIHJlZ2lzdGVyICovCQkJCQkJXAorCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQoX3BBZCwgQkJQX1IzLCAmX2JicERhdGEpOwlcCisJCV9iYnBEYXRhICY9IH4oMHgwNCk7CS8qYml0IDIqLwkJCQkJCQkJXAorCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKF9wQWQsIEJCUF9SMywgX2JicERhdGEpOwlcCisJCQkJCQkJCQkJCQkJCQkJXAorCQkvKiBkaXNhYmxlIE1NUFMgTUFDIGNvbnRyb2wgcmVnaXN0ZXIgKi8JCQkJCQlcCisJCVJUTVBfSU9fUkVBRDMyKF9wQWQsIDB4MTIxMCwgJl9tYWNEYXRhKTsJCQkJXAorCQlfbWFjRGF0YSAmPSB+KDB4MDkpOwkvKmJpdCAwLCAzKi8JCQkJCQkJXAorCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgMHgxMjEwLCBfbWFjRGF0YSk7CQkJCVwKKwl9d2hpbGUoMCkKKworI2RlZmluZSBSVE1QX0FTSUNfTU1QU19FTkFCTEUoX3BBZCkJCQkJCQkJXAorCWRvewkJCQkJCQkJCQkJCQkJCVwKKwkJdTMyIF9tYWNEYXRhOyBcCisJCXU4IF9iYnBEYXRhID0gMDsgXAorCQkvKiBlbmFibGUgTU1QUyBCQlAgY29udHJvbCByZWdpc3RlciAqLwkJCQkJCVwKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKF9wQWQsIEJCUF9SMywgJl9iYnBEYXRhKTsJXAorCQlfYmJwRGF0YSB8PSAoMHgwNCk7CS8qYml0IDIqLwkJCQkJCQkJXAorCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKF9wQWQsIEJCUF9SMywgX2JicERhdGEpOwlcCisJCQkJCQkJCQkJCQkJCQkJXAorCQkvKiBlbmFibGUgTU1QUyBNQUMgY29udHJvbCByZWdpc3RlciAqLwkJCQkJCVwKKwkJUlRNUF9JT19SRUFEMzIoX3BBZCwgMHgxMjEwLCAmX21hY0RhdGEpOwkJCQlcCisJCV9tYWNEYXRhIHw9ICgweDA5KTsJLypiaXQgMCwgMyovCQkJCQkJCVwKKwkJUlRNUF9JT19XUklURTMyKF9wQWQsIDB4MTIxMCwgX21hY0RhdGEpOwkJCQlcCisJfXdoaWxlKDApCisKKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KKworI2VuZGlmIC8qIF9fUlRNUF9QSFlfSF9fIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXBzL3J0MzA3MC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwcy9ydDMwNzAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjdiYWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwcy9ydDMwNzAuYwpAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydDMwNzAuYworCisJQWJzdHJhY3Q6CisJU3BlY2lmaWMgZnVuY2l0b25zIGFuZCB2YXJpYWJsZXMgZm9yIFJUMzA3MAorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKwktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZmRlZiBSVDMwNzAKKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisjaWZuZGVmIFJUTVBfUkZfUldfU1VQUE9SVAorI2Vycm9yICJZb3UgU2hvdWxkIEVuYWJsZSBjb21waWxlIGZsYWcgUlRNUF9SRl9SV19TVVBQT1JUIGZvciB0aGlzIGNoaXAiCisjZW5kaWYgLyogUlRNUF9SRl9SV19TVVBQT1JUIC8vICovCisKK3ZvaWQgTklDSW5pdFJUMzA3MFJGUmVnaXN0ZXJzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlpbnQgaTsKKwl1OCBSRlZhbHVlOworCisJLyogRHJpdmVyIG11c3QgcmVhZCBFRVBST00gdG8gZ2V0IFJmSWNUeXBlIGJlZm9yZSBpbml0aWFsIFJGIHJlZ2lzdGVycyAqLworCS8qIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZSAqLworCWlmIChJU19SVDMwNzAocEFkKSB8fCBJU19SVDMwNzEocEFkKSkgeworCQkvKiBJbml0IFJGIGNhbGlicmF0aW9uICovCisJCS8qIERyaXZlciBzaG91bGQgdG9nZ2xlIFJGIFIzMCBiaXQ3IGJlZm9yZSBpbml0IFJGIHJlZ2lzdGVycyAqLworCQl1MzIgUmZSZWcgPSAwOworCQl1MzIgZGF0YTsKKworCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKHU4ICopJiBSZlJlZyk7CisJCVJmUmVnIHw9IDB4ODA7CisJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKHU4KVJmUmVnKTsKKwkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwkJUmZSZWcgJj0gMHg3RjsKKwkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMwLCAodTgpUmZSZWcpOworCisJCS8qIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1JGX1JFR19QQVJNUzsgaSsrKSB7CisJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLAorCQkJCQkgICAgICBSVDMweHhfUkZSZWdUYWJsZVtpXS5SZWdpc3RlciwKKwkJCQkJICAgICAgUlQzMHh4X1JGUmVnVGFibGVbaV0uVmFsdWUpOworCQl9CisKKwkJLyogYWRkIGJ5IGpvaG5saSAqLworCQlpZiAoSVNfUlQzMDcwKHBBZCkpIHsKKwkJCS8qICovCisJCQkvKiBUaGUgREFDIGlzc3VlKExET19DRkcwKSBoYXMgYmVlbiBmaXhlZCBpbiBSVDMwNzAoRikuICovCisJCQkvKiBUaGUgdm9sdGFnZSByYWlzaW5nIHBhdGNoIGlzIG5vIGxvbmdlciBuZWVkZWQgZm9yIFJUMzA3MChGKSAqLworCQkJLyogKi8KKwkJCWlmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIwMSkgeworCQkJCS8qICBVcGRhdGUgTUFDIDB4MDVENCBmcm9tIDAxeHh4eHh4IHRvIDBEeHh4eHh4ICh2b2x0YWdlIDEuMlYgdG8gMS4zNVYpIGZvciBSVDMwNzAgdG8gaW1wcm92ZSB5aWVsZCByYXRlICovCisJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBMRE9fQ0ZHMCwgJmRhdGEpOworCQkJCWRhdGEgPSAoKGRhdGEgJiAweEYwRkZGRkZGKSB8IDB4MEQwMDAwMDApOworCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIExET19DRkcwLCBkYXRhKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChJU19SVDMwNzEocEFkKSkgeworCQkJLyogRHJpdmVyIHNob3VsZCBzZXQgUkYgUjYgYml0NiBvbiBiZWZvcmUgaW5pdCBSRiByZWdpc3RlcnMgKi8KKwkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjA2LCAodTggKikmIFJmUmVnKTsKKwkJCVJmUmVnIHw9IDB4NDA7CisJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDYsICh1OClSZlJlZyk7CisKKwkJCS8qIGluaXQgUjMxICovCisJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMzEsIDB4MTQpOworCisJCQkvKiBSVDMwNzEgdmVyc2lvbiBFIGhhcyBmaXhlZCB0aGlzIGlzc3VlICovCisJCQlpZiAoKHBBZC0+TmljQ29uZmlnMi5maWVsZC5EQUNUZXN0Qml0ID09IDEpCisJCQkgICAgJiYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjExKSkgeworCQkJCS8qIHBhdGNoIHR4IEVWTSBpc3N1ZSB0ZW1wb3JhcmlseSAqLworCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgTERPX0NGRzAsICZkYXRhKTsKKwkJCQlkYXRhID0gKChkYXRhICYgMHhFMEZGRkZGRikgfCAweDBEMDAwMDAwKTsKKwkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBMRE9fQ0ZHMCwgZGF0YSk7CisJCQl9IGVsc2UgeworCQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTERPX0NGRzAsICZkYXRhKTsKKwkJCQlkYXRhID0gKChkYXRhICYgMHhFMEZGRkZGRikgfCAweDAxMDAwMDAwKTsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBMRE9fQ0ZHMCwgZGF0YSk7CisJCQl9CisKKwkJCS8qIHBhdGNoIExOQV9QRV9HMSBmYWlsZWQgaXNzdWUgKi8KKwkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgR1BJT19TV0lUQ0gsICZkYXRhKTsKKwkJCWRhdGEgJj0gfigweDIwKTsKKwkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIEdQSU9fU1dJVENILCBkYXRhKTsKKwkJfQorCQkvKkZvciBSRiBmaWx0ZXIgQ2FsaWJyYXRpb24gKi8KKwkJUlRNUEZpbHRlckNhbGlicmF0aW9uKHBBZCk7CisKKwkJLyogSW5pdGlhbGl6ZSBSRiBSMjcgcmVnaXN0ZXIsIHNldCBSRiBSMjcgbXVzdCBiZSBiZWhpbmQgUlRNUEZpbHRlckNhbGlicmF0aW9uKCkgKi8KKwkJLyogKi8KKwkJLyogVFggdG8gUlggSVEgZ2xpdGNoKFJGX1IyNykgaGFzIGJlZW4gZml4ZWQgaW4gUlQzMDcwKEYpLiAqLworCQkvKiBSYWlzaW5nIFJGIHZvbHRhZ2UgaXMgbm8gbG9uZ2VyIG5lZWRlZCBmb3IgUlQzMDcwKEYpICovCisJCS8qICovCisJCWlmICgoSVNfUlQzMDcwKHBBZCkpICYmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIwMSkpIHsKKwkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgMHgzKTsKKwkJfSBlbHNlIGlmICgoSVNfUlQzMDcxKHBBZCkpCisJCQkgICAmJiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMTEpKSB7CisJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsIDB4Myk7CisJCX0KKwkJLyogc2V0IGxlZCBvcGVuIGRyYWluIGVuYWJsZSAqLworCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIE9QVF8xNCwgJmRhdGEpOworCQlkYXRhIHw9IDB4MDE7CisJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIE9QVF8xNCwgZGF0YSk7CisKKwkJLyogbW92ZSBmcm9tIFJUMzB4eExvYWRSRk5vcm1hbE1vZGVTZXR1cCBiZWNhdXNlIGl0J3MgbmVlZGVkIGZvciBib3RoIFJUMzA3MCBhbmQgUlQzMDcxICovCisJCS8qIFRYX0xPMV9lbiwgUkYgUjE3IHJlZ2lzdGVyIEJpdCAzIHRvIDAgKi8KKwkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMTcsICZSRlZhbHVlKTsKKwkJUkZWYWx1ZSAmPSAofjB4MDgpOworCQkvKiB0byBmaXggcnggbG9uZyByYW5nZSBpc3N1ZSAqLworCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yRyA9PSAwKSB7CisJCQlpZiAoKElTX1JUMzA3MShwQWQpCisJCQkgICAgICYmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA+PSAweDAyMTEpKQorCQkJICAgIHx8IElTX1JUMzA3MChwQWQpKSB7CisJCQkJUkZWYWx1ZSB8PSAweDIwOworCQkJfQorCQl9CisJCS8qIHNldCBSRl9SMTdfYml0WzI6MF0gZXF1YWwgdG8gRUVQUk9NIHNldHRpbmcgYXQgMHg0OGggKi8KKwkJaWYgKHBBZC0+VHhNaXhlckdhaW4yNEcgPj0gMSkgeworCQkJUkZWYWx1ZSAmPSAofjB4Nyk7CS8qIGNsZWFuIGJpdCBbMjowXSAqLworCQkJUkZWYWx1ZSB8PSBwQWQtPlR4TWl4ZXJHYWluMjRHOworCQl9CisJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IxNywgUkZWYWx1ZSk7CisKKwkJaWYgKElTX1JUMzA3MShwQWQpKSB7CisJCQkvKiBhZGQgYnkgam9obmxpLCBSRiBwb3dlciBzZXF1ZW5jZSBzZXR1cCwgbG9hZCBSRiBub3JtYWwgb3BlcmF0aW9uLW1vZGUgc2V0dXAgKi8KKwkJCVJUMzB4eExvYWRSRk5vcm1hbE1vZGVTZXR1cChwQWQpOworCQl9IGVsc2UgaWYgKElTX1JUMzA3MChwQWQpKSB7CisJCQkvKiBhZGQgYnkgam9obmxpLCByZXNldCBSRl9SMjcgd2hlbiBpbnRlcmZhY2UgZG93biAmIHVwIHRvIGZpeCB0aHJvdWdocHV0IHByb2JsZW0gKi8KKwkJCS8qIExET1JGX1ZDLCBSRiBSMjcgcmVnaXN0ZXIgQml0IDIgdG8gMCAqLworCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsICZSRlZhbHVlKTsKKwkJCS8qIFRYIHRvIFJYIElRIGdsaXRjaChSRl9SMjcpIGhhcyBiZWVuIGZpeGVkIGluIFJUMzA3MChGKS4gKi8KKwkJCS8qIFJhaXNpbmcgUkYgdm9sdGFnZSBpcyBubyBsb25nZXIgbmVlZGVkIGZvciBSVDMwNzAoRikgKi8KKwkJCWlmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIwMSkKKwkJCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAofjB4NzcpKSB8IDB4MzsKKwkJCWVsc2UKKwkJCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAofjB4NzcpKTsKKwkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgUkZWYWx1ZSk7CisJCQkvKiBlbmQgam9obmxpICovCisJCX0KKwl9CisKK30KKyNlbmRpZiAvKiBSVDMwNzAgLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcHMvcnQzMDkwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXBzL3J0MzA5MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MjdiYTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXBzL3J0MzA5MC5jCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXJ0MzA5MC5jCisKKwlBYnN0cmFjdDoKKwlTcGVjaWZpYyBmdW5jaXRvbnMgYW5kIHZhcmlhYmxlcyBmb3IgUlQzMDcwCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmZGVmIFJUMzA5MAorCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKyNpZm5kZWYgUlRNUF9SRl9SV19TVVBQT1JUCisjZXJyb3IgIllvdSBTaG91bGQgRW5hYmxlIGNvbXBpbGUgZmxhZyBSVE1QX1JGX1JXX1NVUFBPUlQgZm9yIHRoaXMgY2hpcCIKKyNlbmRpZiAvKiBSVE1QX1JGX1JXX1NVUFBPUlQgLy8gKi8KKwordm9pZCBOSUNJbml0UlQzMDkwUkZSZWdpc3RlcnMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCWludCBpOworCS8qIERyaXZlciBtdXN0IHJlYWQgRUVQUk9NIHRvIGdldCBSZkljVHlwZSBiZWZvcmUgaW5pdGlhbCBSRiByZWdpc3RlcnMgKi8KKwkvKiBJbml0aWFsaXplIFJGIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUgKi8KKwlpZiAoSVNfUlQzMDkwKHBBZCkpIHsKKwkJLyogSW5pdCBSRiBjYWxpYnJhdGlvbiAqLworCQkvKiBEcml2ZXIgc2hvdWxkIHRvZ2dsZSBSRiBSMzAgYml0NyBiZWZvcmUgaW5pdCBSRiByZWdpc3RlcnMgKi8KKwkJdTMyIFJmUmVnID0gMCwgZGF0YTsKKworCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKHU4ICopJiBSZlJlZyk7CisJCVJmUmVnIHw9IDB4ODA7CisJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKHU4KVJmUmVnKTsKKwkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwkJUmZSZWcgJj0gMHg3RjsKKwkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMwLCAodTgpUmZSZWcpOworCisJCS8qIGluaXQgUjI0LCBSMzEgKi8KKwkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCAweDBGKTsKKwkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCAweDBGKTsKKworCQkvKiBSVDMwOXggdmVyc2lvbiBFIGhhcyBmaXhlZCB0aGlzIGlzc3VlICovCisJCWlmICgocEFkLT5OaWNDb25maWcyLmZpZWxkLkRBQ1Rlc3RCaXQgPT0gMSkKKwkJICAgICYmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIxMSkpIHsKKwkJCS8qIHBhdGNoIHR4IEVWTSBpc3N1ZSB0ZW1wb3JhcmlseSAqLworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBMRE9fQ0ZHMCwgJmRhdGEpOworCQkJZGF0YSA9ICgoZGF0YSAmIDB4RTBGRkZGRkYpIHwgMHgwRDAwMDAwMCk7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBMRE9fQ0ZHMCwgZGF0YSk7CisJCX0gZWxzZSB7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIExET19DRkcwLCAmZGF0YSk7CisJCQlkYXRhID0gKChkYXRhICYgMHhFMEZGRkZGRikgfCAweDAxMDAwMDAwKTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIExET19DRkcwLCBkYXRhKTsKKwkJfQorCisJCS8qIHBhdGNoIExOQV9QRV9HMSBmYWlsZWQgaXNzdWUgKi8KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBHUElPX1NXSVRDSCwgJmRhdGEpOworCQlkYXRhICY9IH4oMHgyMCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEdQSU9fU1dJVENILCBkYXRhKTsKKworCQkvKiBJbml0aWFsaXplIFJGIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUgKi8KKwkJZm9yIChpID0gMDsgaSA8IE5VTV9SRl9SRUdfUEFSTVM7IGkrKykgeworCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwKKwkJCQkJICAgICAgUlQzMHh4X1JGUmVnVGFibGVbaV0uUmVnaXN0ZXIsCisJCQkJCSAgICAgIFJUMzB4eF9SRlJlZ1RhYmxlW2ldLlZhbHVlKTsKKwkJfQorCisJCS8qIERyaXZlciBzaG91bGQgc2V0IFJGIFI2IGJpdDYgb24gYmVmb3JlIGNhbGlicmF0aW9uICovCisJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjA2LCAodTggKikmIFJmUmVnKTsKKwkJUmZSZWcgfD0gMHg0MDsKKwkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA2LCAodTgpUmZSZWcpOworCisJCS8qRm9yIFJGIGZpbHRlciBDYWxpYnJhdGlvbiAqLworCQlSVE1QRmlsdGVyQ2FsaWJyYXRpb24ocEFkKTsKKworCQkvKiBJbml0aWFsaXplIFJGIFIyNyByZWdpc3Rlciwgc2V0IFJGIFIyNyBtdXN0IGJlIGJlaGluZCBSVE1QRmlsdGVyQ2FsaWJyYXRpb24oKSAqLworCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMTEpCisJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsIDB4Myk7CisKKwkJLyogc2V0IGxlZCBvcGVuIGRyYWluIGVuYWJsZSAqLworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE9QVF8xNCwgJmRhdGEpOworCQlkYXRhIHw9IDB4MDE7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE9QVF8xNCwgZGF0YSk7CisKKwkJLyogc2V0IGRlZmF1bHQgYW50ZW5uYSBhcyBtYWluICovCisJCWlmIChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMCkKKwkJCUFzaWNTZXRSeEFudChwQWQsIHBBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQpOworCisJCS8qIGFkZCBieSBqb2hubGksIFJGIHBvd2VyIHNlcXVlbmNlIHNldHVwLCBsb2FkIFJGIG5vcm1hbCBvcGVyYXRpb24tbW9kZSBzZXR1cCAqLworCQlSVDMweHhMb2FkUkZOb3JtYWxNb2RlU2V0dXAocEFkKTsKKwl9CisKK30KKworI2VuZGlmIC8qIFJUMzA5MCAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwcy9ydDMweHguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcHMvcnQzMHh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU2ODRhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcHMvcnQzMHh4LmMKQEAgLTAsMCArMSw1MTggQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnQzMHh4LmMKKworCUFic3RyYWN0OgorCVNwZWNpZmljIGZ1bmNpdG9ucyBhbmQgdmFyaWFibGVzIGZvciBSVDMweHguCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmZGVmIFJUMzB4eAorCisjaWZuZGVmIFJUTVBfUkZfUldfU1VQUE9SVAorI2Vycm9yICJZb3UgU2hvdWxkIEVuYWJsZSBjb21waWxlIGZsYWcgUlRNUF9SRl9SV19TVVBQT1JUIGZvciB0aGlzIGNoaXAiCisjZW5kaWYgLyogUlRNUF9SRl9SV19TVVBQT1JUIC8vICovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworLyogKi8KKy8qIFJGIHJlZ2lzdGVyIGluaXRpYWxpemF0aW9uIHNldCAqLworLyogKi8KK3N0cnVjdCBydF9yZWdfcGFpciBSVDMweHhfUkZSZWdUYWJsZVtdID0geworCXtSRl9SMDQsIDB4NDB9CisJLAorCXtSRl9SMDUsIDB4MDN9CisJLAorCXtSRl9SMDYsIDB4MDJ9CisJLAorCXtSRl9SMDcsIDB4NzB9CisJLAorCXtSRl9SMDksIDB4MEZ9CisJLAorCXtSRl9SMTAsIDB4NDF9CisJLAorCXtSRl9SMTEsIDB4MjF9CisJLAorCXtSRl9SMTIsIDB4N0J9CisJLAorCXtSRl9SMTQsIDB4OTB9CisJLAorCXtSRl9SMTUsIDB4NTh9CisJLAorCXtSRl9SMTYsIDB4QjN9CisJLAorCXtSRl9SMTcsIDB4OTJ9CisJLAorCXtSRl9SMTgsIDB4MkN9CisJLAorCXtSRl9SMTksIDB4MDJ9CisJLAorCXtSRl9SMjAsIDB4QkF9CisJLAorCXtSRl9SMjEsIDB4REJ9CisJLAorCXtSRl9SMjQsIDB4MTZ9CisJLAorCXtSRl9SMjUsIDB4MDF9CisJLAorCXtSRl9SMjksIDB4MUZ9CisJLAorfTsKKwordTggTlVNX1JGX1JFR19QQVJNUyA9IChzaXplb2YoUlQzMHh4X1JGUmVnVGFibGUpIC8gc2l6ZW9mKHN0cnVjdCBydF9yZWdfcGFpcikpOworCisvKiBBbnRlbm5hIGRpdmVzaXR5IHVzZSBHUElPMyBhbmQgRUVTSyBwaW4gZm9yIGNvbnRyb2wgKi8KKy8qIEFudGVubmEgYW5kIEVFUFJPTSBhY2Nlc3MgYXJlIGJvdGggdXNpbmcgRUVTSyBwaW4sICovCisvKiBUaGVyZWZvciB3ZSBzaG91bGQgYXZvaWQgYWNjZXNzaW5nIEVFU0sgYXQgdGhlIHNhbWUgdGltZSAqLworLyogVGhlbiByZXN0b3JlIGFudGVubmEgYWZ0ZXIgRUVQUk9NIGFjY2VzcyAqLworLyogVGhlIG9yaWdpbmFsIG5hbWUgb2YgdGhpcyBmdW5jdGlvbiBpcyBBc2ljU2V0UnhBbnQoKSwgbm93IGNoYW5nZSB0byAqLworLyp2b2lkIEFzaWNTZXRSeEFudCggKi8KK3ZvaWQgUlQzMHh4U2V0UnhBbnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBBbnQpCit7CisJdTMyIFZhbHVlOworI2lmZGVmIFJUTVBfTUFDX1BDSQorCXUzMiB4OworI2VuZGlmCisKKwlpZiAoKHBBZC0+RWVwcm9tQWNjZXNzKSB8fAorCSAgICAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkgfHwKKwkgICAgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgfHwKKwkgICAgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKSB8fAorCSAgICAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkgeworCQlyZXR1cm47CisJfQorCS8qIHRoZSBhbnRlbm5hIHNlbGVjdGlvbiBpcyB0aHJvdWdoIGZpcm13YXJlIGFuZCBNQUMgcmVnaXN0ZXIoR1BJTzMpICovCisJaWYgKEFudCA9PSAwKSB7CisJCS8qIE1haW4gYW50ZW5uYSAqLworI2lmZGVmIFJUTVBfTUFDX1BDSQorCQlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKwkJeCB8PSAoRUVTSyk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworI2Vsc2UKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDczLCAweEZGLCAweDEsIDB4MCk7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBHUElPX0NUUkxfQ0ZHLCAmVmFsdWUpOworCQlWYWx1ZSAmPSB+KDB4MDgwOCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEdQSU9fQ1RSTF9DRkcsIFZhbHVlKTsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJICAgICAoIkFzaWNTZXRSeEFudCwgc3dpdGNoIHRvIG1haW4gYW50ZW5uYVxuIikpOworCX0gZWxzZSB7CisJCS8qIEF1eCBhbnRlbm5hICovCisjaWZkZWYgUlRNUF9NQUNfUENJCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOworCQl4ICY9IH4oRUVTSyk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworI2Vsc2UKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDczLCAweEZGLCAweDAsIDB4MCk7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgR1BJT19DVFJMX0NGRywgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigweDA4MDgpOworCQlWYWx1ZSB8PSAweDA4OworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBHUElPX0NUUkxfQ0ZHLCBWYWx1ZSk7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCSAgICAgKCJBc2ljU2V0UnhBbnQsIHN3aXRjaCB0byBhdXggYW50ZW5uYVxuIikpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUZvciBSRiBmaWx0ZXIgY2FsaWJyYXRpb24gcHVycG9zZQorCisJQXJndW1lbnRzOgorCQlwQWQgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlRNUEZpbHRlckNhbGlicmF0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwl1OCBSNTV4ID0gMCwgdmFsdWUsIEZpbHRlclRhcmdldCA9IDB4MUUsIEJCUFZhbHVlID0gMDsKKwl1MzIgbG9vcCA9IDAsIGNvdW50ID0gMCwgbG9vcGNudCA9IDAsIFJlVHJ5ID0gMDsKKwl1OCBSRl9SMjRfVmFsdWUgPSAwOworCisJLyogR2l2ZSBiYnAgZmlsdGVyIGluaXRpYWwgdmFsdWUgKi8KKwlwQWQtPk1sbWUuQ2FsaUJXMjBSZlIyNCA9IDB4MUY7CisJcEFkLT5NbG1lLkNhbGlCVzQwUmZSMjQgPSAweDJGOwkvKkJpdFs1XSBtdXN0IGJlIDEgZm9yIEJXIDQwICovCisKKwlkbyB7CisJCWlmIChsb29wID09IDEpCS8qQmFuZFdpZHRoID0gNDAgTUh6ICovCisJCXsKKwkJCS8qIFdyaXRlIDB4MjcgdG8gUkZfUjI0IHRvIHByb2dyYW0gZmlsdGVyICovCisJCQlSRl9SMjRfVmFsdWUgPSAweDI3OworCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCBSRl9SMjRfVmFsdWUpOworCQkJaWYgKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKQorCQkJCUZpbHRlclRhcmdldCA9IDB4MTU7CisJCQllbHNlCisJCQkJRmlsdGVyVGFyZ2V0ID0gMHgxOTsKKworCQkJLyogd2hlbiBjYWxpYnJhdGUgQlc0MCwgQkJQIG1hc2sgbXVzdCBzZXQgdG8gQlc0MC4gKi8KKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJCUJCUFZhbHVlICY9ICh+MHgxOCk7CisJCQlCQlBWYWx1ZSB8PSAoMHgxMCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisKKwkJCS8qIHNldCB0byBCVzQwICovCisJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IzMSwgJnZhbHVlKTsKKwkJCXZhbHVlIHw9IDB4MjA7CisJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMzEsIHZhbHVlKTsKKwkJfSBlbHNlCQkvKkJhbmRXaWR0aCA9IDIwIE1IeiAqLworCQl7CisJCQkvKiBXcml0ZSAweDA3IHRvIFJGX1IyNCB0byBwcm9ncmFtIGZpbHRlciAqLworCQkJUkZfUjI0X1ZhbHVlID0gMHgwNzsKKwkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgUkZfUjI0X1ZhbHVlKTsKKwkJCWlmIChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkKKwkJCQlGaWx0ZXJUYXJnZXQgPSAweDEzOworCQkJZWxzZQorCQkJCUZpbHRlclRhcmdldCA9IDB4MTY7CisKKwkJCS8qIHNldCB0byBCVzIwICovCisJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IzMSwgJnZhbHVlKTsKKwkJCXZhbHVlICY9ICh+MHgyMCk7CisJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMzEsIHZhbHVlKTsKKwkJfQorCisJCS8qIFdyaXRlIDB4MDEgdG8gUkZfUjIyIHRvIGVuYWJsZSBiYXNlYmFuZCBsb29wYmFjayBtb2RlICovCisJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIyLCAmdmFsdWUpOworCQl2YWx1ZSB8PSAweDAxOworCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjIsIHZhbHVlKTsKKworCQkvKiBXcml0ZSAweDAwIHRvIEJCUF9SMjQgdG8gc2V0IHBvd2VyICYgZnJlcXVlbmN5IG9mIHBhc3NiYW5kIHRlc3QgdG9uZSAqLworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNCwgMCk7CisKKwkJZG8geworCQkJLyogV3JpdGUgMHg5MCB0byBCQlBfUjI1IHRvIHRyYW5zbWl0IHRlc3QgdG9uZSAqLworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjUsIDB4OTApOworCisJCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCQkJLyogUmVhZCBCQlBfUjU1WzY6MF0gZm9yIHJlY2VpdmVkIHBvd2VyLCBzZXQgUjU1eCA9IEJCUF9SNTVbNjowXSAqLworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I1NSwgJnZhbHVlKTsKKwkJCVI1NXggPSB2YWx1ZSAmIDB4RkY7CisKKwkJfSB3aGlsZSAoKFJlVHJ5KysgPCAxMDApICYmIChSNTV4ID09IDApKTsKKworCQkvKiBXcml0ZSAweDA2IHRvIEJCUF9SMjQgdG8gc2V0IHBvd2VyICYgZnJlcXVlbmN5IG9mIHN0b3BiYW5kIHRlc3QgdG9uZSAqLworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNCwgMHgwNik7CisKKwkJd2hpbGUgKFRSVUUpIHsKKwkJCS8qIFdyaXRlIDB4OTAgdG8gQkJQX1IyNSB0byB0cmFuc21pdCB0ZXN0IHRvbmUgKi8KKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI1LCAweDkwKTsKKworCQkJLypXZSBuZWVkIHRvIHdhaXQgZm9yIGNhbGlicmF0aW9uICovCisJCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I1NSwgJnZhbHVlKTsKKwkJCXZhbHVlICY9IDB4RkY7CisJCQlpZiAoKFI1NXggLSB2YWx1ZSkgPCBGaWx0ZXJUYXJnZXQpIHsKKwkJCQlSRl9SMjRfVmFsdWUrKzsKKwkJCX0gZWxzZSBpZiAoKFI1NXggLSB2YWx1ZSkgPT0gRmlsdGVyVGFyZ2V0KSB7CisJCQkJUkZfUjI0X1ZhbHVlKys7CisJCQkJY291bnQrKzsKKwkJCX0gZWxzZSB7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIHByZXZlbnQgaW5maW5pdGUgbG9vcCBjYXVzZSBkcml2ZXIgaGFuZy4gKi8KKwkJCWlmIChsb29wY250KysgPiAxMDApIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJICgiUlRNUEZpbHRlckNhbGlicmF0aW9uIC0gY2FuJ3QgZmluZCBhIHZhbGlkIHZhbHVlLCBsb29wY250PSVkIHN0b3AgY2FsaWJyYXRpbmciLAorCQkJCQkgIGxvb3BjbnQpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIFdyaXRlIFJGX1IyNCB0byBwcm9ncmFtIGZpbHRlciAqLworCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCBSRl9SMjRfVmFsdWUpOworCQl9CisKKwkJaWYgKGNvdW50ID4gMCkgeworCQkJUkZfUjI0X1ZhbHVlID0gUkZfUjI0X1ZhbHVlIC0gKChjb3VudCkgPyAoMSkgOiAoMCkpOworCQl9CisJCS8qIFN0b3JlIGZvciBmdXR1cmUgdXNhZ2UgKi8KKwkJaWYgKGxvb3BjbnQgPCAxMDApIHsKKwkJCWlmIChsb29wKysgPT0gMCkgeworCQkJCS8qQmFuZFdpZHRoID0gMjAgTUh6ICovCisJCQkJcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQgPSAodTgpUkZfUjI0X1ZhbHVlOworCQkJfSBlbHNlIHsKKwkJCQkvKkJhbmRXaWR0aCA9IDQwIE1IeiAqLworCQkJCXBBZC0+TWxtZS5DYWxpQlc0MFJmUjI0ID0gKHU4KVJGX1IyNF9WYWx1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlCisJCQlicmVhazsKKworCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjQsIFJGX1IyNF9WYWx1ZSk7CisKKwkJLyogcmVzZXQgY291bnQgKi8KKwkJY291bnQgPSAwOworCX0gd2hpbGUgKFRSVUUpOworCisJLyogKi8KKwkvKiBTZXQgYmFjayB0byBpbml0aWFsIHN0YXRlICovCisJLyogKi8KKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNCwgMCk7CisKKwlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgJnZhbHVlKTsKKwl2YWx1ZSAmPSB+KDB4MDEpOworCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgdmFsdWUpOworCisJLyogc2V0IEJCUCBiYWNrIHRvIEJXMjAgKi8KKwlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJQkJQVmFsdWUgJj0gKH4weDE4KTsKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiUlRNUEZpbHRlckNhbGlicmF0aW9uIC0gQ2FsaUJXMjBSZlIyND0weCV4LCBDYWxpQlc0MFJmUjI0PTB4JXhcbiIsCisJCSAgcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQsIHBBZC0+TWxtZS5DYWxpQlc0MFJmUjI0KSk7Cit9CisKKy8qIGFkZCBieSBqb2hubGksIFJGIHBvd2VyIHNlcXVlbmNlIHNldHVwICovCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlMb2FkIFJGIG5vcm1hbCBvcGVyYXRpb24tbW9kZSBzZXR1cAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwordm9pZCBSVDMweHhMb2FkUkZOb3JtYWxNb2RlU2V0dXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXU4IFJGVmFsdWU7CisKKwkvKiBSWDBfUEQgJiBUWDBfUEQsIFJGIFIxIHJlZ2lzdGVyIEJpdCAyICYgQml0IDMgdG8gMCBhbmQgUkZfQkxPQ0tfZW4sUlgxX1BEICYgVFgxX1BELCBCaXQwLCBCaXQgNCAmIEJpdDUgdG8gMSAqLworCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCAmUkZWYWx1ZSk7CisJUkZWYWx1ZSA9IChSRlZhbHVlICYgKH4weDBDKSkgfCAweDMxOworCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgUkZWYWx1ZSk7CisKKwkvKiBUWF9MTzJfZW4sIFJGIFIxNSByZWdpc3RlciBCaXQgMyB0byAwICovCisJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMTUsICZSRlZhbHVlKTsKKwlSRlZhbHVlICY9ICh+MHgwOCk7CisJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjE1LCBSRlZhbHVlKTsKKworCS8qIG1vdmUgdG8gTklDSW5pdFJUMzB4eFJGUmVnaXN0ZXJzCisJICAgLy8gVFhfTE8xX2VuLCBSRiBSMTcgcmVnaXN0ZXIgQml0IDMgdG8gMAorCSAgIFJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjE3LCAmUkZWYWx1ZSk7CisJICAgUkZWYWx1ZSAmPSAofjB4MDgpOworCSAgIC8vIHRvIGZpeCByeCBsb25nIHJhbmdlIGlzc3VlCisJICAgaWYgKCgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA+PSAweDAyMTEpICYmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JHID09IDApKQorCSAgIHsKKwkgICBSRlZhbHVlIHw9IDB4MjA7CisJICAgfQorCSAgIC8vIHNldCBSRl9SMTdfYml0WzI6MF0gZXF1YWwgdG8gRUVQUk9NIHNldHRpbmcgYXQgMHg0OGgKKwkgICBpZiAocEFkLT5UeE1peGVyR2FpbjI0RyA+PSAyKQorCSAgIHsKKwkgICBSRlZhbHVlICY9ICh+MHg3KTsgIC8vIGNsZWFuIGJpdCBbMjowXQorCSAgIFJGVmFsdWUgfD0gcEFkLT5UeE1peGVyR2FpbjI0RzsKKwkgICB9CisJICAgUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjE3LCBSRlZhbHVlKTsKKwkgKi8KKworCS8qIFJYX0xPMV9lbiwgUkYgUjIwIHJlZ2lzdGVyIEJpdCAzIHRvIDAgKi8KKwlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMCwgJlJGVmFsdWUpOworCVJGVmFsdWUgJj0gKH4weDA4KTsKKwlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjAsIFJGVmFsdWUpOworCisJLyogUlhfTE8yX2VuLCBSRiBSMjEgcmVnaXN0ZXIgQml0IDMgdG8gMCAqLworCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIxLCAmUkZWYWx1ZSk7CisJUkZWYWx1ZSAmPSAofjB4MDgpOworCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMSwgUkZWYWx1ZSk7CisKKwkvKiBhZGQgYnkgam9obmxpLCByZXNldCBSRl9SMjcgd2hlbiBpbnRlcmZhY2UgZG93biAmIHVwIHRvIGZpeCB0aHJvdWdocHV0IHByb2JsZW0gKi8KKwkvKiBMRE9SRl9WQywgUkYgUjI3IHJlZ2lzdGVyIEJpdCAyIHRvIDAgKi8KKwlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgJlJGVmFsdWUpOworCS8qIFRYIHRvIFJYIElRIGdsaXRjaChSRl9SMjcpIGhhcyBiZWVuIGZpeGVkIGluIFJUMzA3MChGKS4gKi8KKwkvKiBSYWlzaW5nIFJGIHZvbHRhZ2UgaXMgbm8gbG9uZ2VyIG5lZWRlZCBmb3IgUlQzMDcwKEYpICovCisJaWYgKElTX1JUMzA5MChwQWQpKQkvKiBSVDMwOXggYW5kIFJUMzA3MS83MiAqLworCXsKKwkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjExKQorCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgKH4weDc3KSkgfCAweDM7CisJCWVsc2UKKwkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmICh+MHg3NykpOworCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsIFJGVmFsdWUpOworCX0KKwkvKiBlbmQgam9obmxpICovCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUxvYWQgUkYgc2xlZXAtbW9kZSBzZXR1cAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwordm9pZCBSVDMweHhMb2FkUkZTbGVlcE1vZGVTZXR1cChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJdTggUkZWYWx1ZTsKKwl1MzIgTUFDVmFsdWU7CisKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwlpZiAoIUlTX1JUMzU3MihwQWQpKQorI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCXsKKwkJLyogUkZfQkxPQ0tfZW4uIFJGIFIxIHJlZ2lzdGVyIEJpdCAwIHRvIDAgKi8KKwkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDEsICZSRlZhbHVlKTsKKwkJUkZWYWx1ZSAmPSAofjB4MDEpOworCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDEsIFJGVmFsdWUpOworCisJCS8qIFZDT19JQywgUkYgUjcgcmVnaXN0ZXIgQml0IDQgJiBCaXQgNSB0byAwICovCisJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjA3LCAmUkZWYWx1ZSk7CisJCVJGVmFsdWUgJj0gKH4weDMwKTsKKwkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA3LCBSRlZhbHVlKTsKKworCQkvKiBJZG9oLCBSRiBSOSByZWdpc3RlciBCaXQgMSwgQml0IDIgJiBCaXQgMyB0byAwICovCisJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjA5LCAmUkZWYWx1ZSk7CisJCVJGVmFsdWUgJj0gKH4weDBFKTsKKwkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA5LCBSRlZhbHVlKTsKKworCQkvKiBSWF9DVEJfZW4sIFJGIFIyMSByZWdpc3RlciBCaXQgNyB0byAwICovCisJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIxLCAmUkZWYWx1ZSk7CisJCVJGVmFsdWUgJj0gKH4weDgwKTsKKwkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIxLCBSRlZhbHVlKTsKKwl9CisKKwlpZiAoSVNfUlQzMDkwKHBBZCkgfHwJLyogSVNfUlQzMDkwIGluY2x1ZGluZyBSVDMwOXggYW5kIFJUMzA3MS83MiAqLworCSAgICBJU19SVDM1NzIocEFkKSB8fAorCSAgICAoSVNfUlQzMDcwKHBBZCkgJiYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjAxKSkpIHsKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwkJaWYgKCFJU19SVDM1NzIocEFkKSkKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKwkJeworCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsICZSRlZhbHVlKTsKKwkJCVJGVmFsdWUgfD0gMHg3NzsKKwkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgUkZWYWx1ZSk7CisJCX0KKworCQlSVE1QX0lPX1JFQUQzMihwQWQsIExET19DRkcwLCAmTUFDVmFsdWUpOworCQlNQUNWYWx1ZSB8PSAweDFEMDAwMDAwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBMRE9fQ0ZHMCwgTUFDVmFsdWUpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJUmV2ZXJzZSBSRiBzbGVlcC1tb2RlIHNldHVwCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCit2b2lkIFJUMzB4eFJldmVyc2VSRlNsZWVwTW9kZVNldHVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwl1OCBSRlZhbHVlOworCXUzMiBNQUNWYWx1ZTsKKworI2lmZGVmIFJUTVBfTUFDX1VTQgorCWlmICghSVNfUlQzNTcyKHBBZCkpCisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisJeworCQkvKiBSRl9CTE9DS19lbiwgUkYgUjEgcmVnaXN0ZXIgQml0IDAgdG8gMSAqLworCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgJlJGVmFsdWUpOworCQlSRlZhbHVlIHw9IDB4MDE7CisJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgUkZWYWx1ZSk7CisKKwkJLyogVkNPX0lDLCBSRiBSNyByZWdpc3RlciBCaXQgNCAmIEJpdCA1IHRvIDEgKi8KKwkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsICZSRlZhbHVlKTsKKwkJUkZWYWx1ZSB8PSAweDMwOworCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsIFJGVmFsdWUpOworCisJCS8qIElkb2gsIFJGIFI5IHJlZ2lzdGVyIEJpdCAxLCBCaXQgMiAmIEJpdCAzIHRvIDEgKi8KKwkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDksICZSRlZhbHVlKTsKKwkJUkZWYWx1ZSB8PSAweDBFOworCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDksIFJGVmFsdWUpOworCisJCS8qIFJYX0NUQl9lbiwgUkYgUjIxIHJlZ2lzdGVyIEJpdCA3IHRvIDEgKi8KKwkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjEsICZSRlZhbHVlKTsKKwkJUkZWYWx1ZSB8PSAweDgwOworCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjEsIFJGVmFsdWUpOworCX0KKworCWlmIChJU19SVDMwOTAocEFkKSB8fAkvKiBJU19SVDMwOTAgaW5jbHVkaW5nIFJUMzA5eCBhbmQgUlQzMDcxLzcyICovCisJICAgIElTX1JUMzU3MihwQWQpIHx8CisJICAgIElTX1JUMzM5MChwQWQpIHx8CisJICAgIChJU19SVDMwNzAocEFkKSAmJiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMDEpKSkgeworI2lmZGVmIFJUTVBfTUFDX1VTQgorCQlpZiAoIUlTX1JUMzU3MihwQWQpKQorI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCQl7CisJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgJlJGVmFsdWUpOworCQkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjExKQorCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmICh+MHg3NykpIHwgMHgzOworCQkJZWxzZQorCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmICh+MHg3NykpOworCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCBSRlZhbHVlKTsKKwkJfQorCQkvKiBSVDMwNzEgdmVyc2lvbiBFIGhhcyBmaXhlZCB0aGlzIGlzc3VlICovCisJCWlmICgocEFkLT5OaWNDb25maWcyLmZpZWxkLkRBQ1Rlc3RCaXQgPT0gMSkKKwkJICAgICYmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIxMSkpIHsKKwkJCS8qIHBhdGNoIHR4IEVWTSBpc3N1ZSB0ZW1wb3JhcmlseSAqLworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBMRE9fQ0ZHMCwgJk1BQ1ZhbHVlKTsKKwkJCU1BQ1ZhbHVlID0gKChNQUNWYWx1ZSAmIDB4RTBGRkZGRkYpIHwgMHgwRDAwMDAwMCk7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBMRE9fQ0ZHMCwgTUFDVmFsdWUpOworCQl9IGVsc2UgeworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBMRE9fQ0ZHMCwgJk1BQ1ZhbHVlKTsKKwkJCU1BQ1ZhbHVlID0gKChNQUNWYWx1ZSAmIDB4RTBGRkZGRkYpIHwgMHgwMTAwMDAwMCk7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBMRE9fQ0ZHMCwgTUFDVmFsdWUpOworCQl9CisJfQorCisJaWYgKElTX1JUMzU3MihwQWQpKQorCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDgsIDB4ODApOworfQorCisvKiBlbmQgam9obmxpICovCisKK3ZvaWQgUlQzMHh4SGFsdEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJdTMyIFR4UGluQ2ZnID0gMHgwMDA1MEYwRjsKKworCS8qICovCisJLyogVHVybiBvZmYgTE5BX1BFIG9yIFRSU1dfUE9MICovCisJLyogKi8KKwlpZiAoSVNfUlQzMDcwKHBBZCkgfHwgSVNfUlQzMDcxKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkpIHsKKwkJaWYgKChJU19SVDMwNzEocEFkKSB8fCBJU19SVDM1NzIocEFkKSkKKyNpZmRlZiBSVE1QX0VGVVNFX1NVUFBPUlQKKwkJICAgICYmIChwQWQtPmJVc2VFZnVzZSkKKyNlbmRpZiAvKiBSVE1QX0VGVVNFX1NVUFBPUlQgLy8gKi8KKwkJICAgICkgeworCQkJVHhQaW5DZmcgJj0gMHhGRkZCRjBGMDsJLyogYml0MTggb2ZmICovCisJCX0gZWxzZSB7CisJCQlUeFBpbkNmZyAmPSAweEZGRkZGMEYwOworCQl9CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUElOX0NGRywgVHhQaW5DZmcpOworCX0KK30KKworI2VuZGlmIC8qIFJUMzB4eCAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGxpc3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hsaXN0LmgKaW5kZXggZjQ5YTM1Yy4uYWRhNjVlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGxpc3QuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NobGlzdC5oCkBAIC00MSw3ICs0MSw2IEBACiAjaW5jbHVkZSAicnRtcF90eXBlLmgiCiAjaW5jbHVkZSAicnRtcF9kZWYuaCIKIAotCiAjZGVmaW5lIE9ET1IJCQkwCiAjZGVmaW5lIElET1IJCQkxCiAjZGVmaW5lIEJPVEgJCQkyCkBAIC01MCwxMTk2ICs0OSw2OSBAQAogI2RlZmluZSBCQU5EXzI0RyAgICAgICAgMQogI2RlZmluZSBCQU5EX0JPVEggICAgICAgMgogCi10eXBlZGVmIHN0cnVjdCBfQ0hfREVTUCB7Ci0JVUNIQVIgRmlyc3RDaGFubmVsOwotCVVDSEFSIE51bU9mQ2g7Ci0JQ0hBUiBNYXhUeFB3cjsJCQkvLyBkQm0KLQlVQ0hBUiBHZW9ncmFwaHk7CQkJLy8gMDpvdXQgZG9vciwgMTppbiBkb29yLCAyOmJvdGgKLQlCT09MRUFOIERmc1JlcTsJCQkvLyBEZnMgcmVxdWlyZSwgMDogTm8sIDE6IHllcy4KLX0gQ0hfREVTUCwgKlBDSF9ERVNQOwotCi10eXBlZGVmIHN0cnVjdCBfQ0hfUkVHSU9OIHsKLQlVQ0hBUiBDb3VudFJlZ1szXTsKLQlVQ0hBUiBEZnNUeXBlOwkJCS8vIDA6IENFLCAxOiBGQ0MsIDI6IEpBUCwgMzpKQVBfVzUzLCBKQVBfVzU2Ci0JQ0hfREVTUCBDaERlc3BbMTBdOwotfSBDSF9SRUdJT04sICpQQ0hfUkVHSU9OOwotCi1zdGF0aWMgQ0hfUkVHSU9OIENoUmVnaW9uW10gPQotewotCQl7CS8vIEFudGlndWEgYW5kIEJlcmJ1ZGEKLQkJCSJBRyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEFyZ2VudGluYQotCQkJIkFSIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEFydWJhCi0JCQkiQVciLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBBdXN0cmFsaWEKLQkJCSJBVSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEF1c3RyaWEKLQkJCSJBVCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMywgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9LAkJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEJhaGFtYXMKLQkJCSJCUyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEJhcmJhZG9zCi0JCQkiQkIiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBCZXJtdWRhCi0JCQkiQk0iLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBCcmF6aWwKLQkJCSJCUiIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDE0OSwgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBCZWxnaXVtCi0JCQkiQkUiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMTgsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAxOCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEJ1bGdhcmlhCi0JCQkiQkciLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQ2FuYWRhCi0JCQkiQ0EiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBDYXltYW4gSXNMYW5kcwotCQkJIktZIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQ2hpbGUKLQkJCSJDTCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCA1LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIENoaW5hCi0JCQkiQ04iLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMTQ5LCA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIENvbG9tYmlhCi0JCQkiQ08iLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMTcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAxNDksIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQ29zdGEgUmljYQotCQkJIkNSIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDE3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxNDksIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQ3lwcnVzCi0JCQkiQ1kiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyNCwgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfSwJCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBDemVjaF9SZXB1YmxpYwotCQkJIkNaIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjMsIElET1IsIFRSVUV9LAkJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBEZW5tYXJrCi0JCQkiREsiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyMywgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfSwJCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBEb21pbmljYW4gUmVwdWJsaWMKLQkJCSJETyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAwCi0JCQkJeyAxNDksIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gRXF1YWRvcgotCQkJIkVDIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAxMDAsIDExLCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEVsIFNhbHZhZG9yCi0JCQkiU1YiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCA0LCAgIDM2LCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEZpbmxhbmQKLQkJCSJGSSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gRnJhbmNlCi0JCQkiRlIiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gR2VybWFueQotCQkJIkRFIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBHcmVlY2UKLQkJCSJHUiIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gR3VhbQotCQkJIkdVIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCi0JCQkJeyAzNiwgIDQsICAgMTcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDE0OSwgIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gR3VhdGVtYWxhCi0JCQkiR1QiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgICAxNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gSGFpdGkKLQkJCSJIVCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgIDE3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCAgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBIb25kdXJhcwotCQkJIkhOIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAxNDksICA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEhvbmcgS29uZwotCQkJIkhLIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxNDksICA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEh1bmdhcnkKLQkJCSJIVSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBJY2VsYW5kCi0JCQkiSVMiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEluZGlhCi0JCQkiSU4iLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDE0OSwgCTQsICAyNCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gSW5kb25lc2lhCi0JCQkiSUQiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDE0OSwgCTQsICAyNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gSXJlbGFuZAotCQkJIklFIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gSXNyYWVsCi0JCQkiSUwiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgICAzLCAgMjAsIElET1IsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MwotCQkJCXsgNCwgCTYsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggNH45Ci0JCQkJeyAxMCwgCTQsICAyMCwgSURPUiwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMTB+MTMKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEl0YWx5Ci0JCQkiSVQiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsIAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgT0RPUiwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBKYXBhbgotCQkJIkpQIiwKLQkJCUpBUCwKLQkJCXsKLQkJCQl7IDEsICAgMTQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xNAotCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBKb3JkYW4KLQkJCSJKTyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgSURPUiwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyAxNDksIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIExhdHZpYQotCQkJIkxWIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gTGllY2h0ZW5zdGVpbgotCQkJIkxJIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyA1MiwgCTQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIExpdGh1YW5pYQotCQkJIkxUIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gTHV4ZW1idXJnCi0JCQkiTFUiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsIAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBNYWxheXNpYQotCQkJIk1ZIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMzYsIAk0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgCTQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgIDUsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gTWFsdGEKLQkJCSJNVCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgCTQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIE1hcm9jY28KLQkJCSJNQSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsIAk0LCAgMjQsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBNZXhpY28KLQkJCSJNWCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsIAk0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgCTQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgIDUsICAzMCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gTmV0aGVybGFuZHMKLQkJCSJOTCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgCTQsICAyNCwgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIE5ldyBaZWFsYW5kCi0JCQkiTloiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAJNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsIAk0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxNDksICA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIE5vcndheQotCQkJIk5PIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgCTQsICAyNCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAJNCwgIDI0LCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gUGVydQotCQkJIlBFIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAxNDksICA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFBvcnR1Z2FsCi0JCQkiUFQiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFBvbGFuZAotCQkJIlBMIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBSb21hbmlhCi0JCQkiUk8iLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFJ1c3NpYQotCQkJIlJVIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAxNDksICA0LCAgMjAsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFNhdWRpIEFyYWJpYQotCQkJIlNBIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxNDksICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFNlcmJpYV9hbmRfTW9udGVuZWdybwotCQkJIkNTIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBTaW5nYXBvcmUKLQkJCSJTRyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBTbG92YWtpYQotCQkJIlNLIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBTbG92ZW5pYQotCQkJIlNJIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFNvdXRoIEFmcmljYQotCQkJIlpBIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMTQ5LCAgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBTb3V0aCBLb3JlYQotCQkJIktSIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsICA4LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xMjgKLQkJCQl7IDE0OSwgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gU3BhaW4KLQkJCSJFUyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICAgNCwgIDE3LCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gU3dlZGVuCi0JCQkiU0UiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFN3aXR6ZXJsYW5kCi0JCQkiQ0giLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBUYWl3YW4KLQkJCSJUVyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTEsICAzMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQotCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gVHVya2V5Ci0JCQkiVFIiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKLQkJCQl7IDM2LCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFVLCi0JCQkiR0IiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKLQkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFVrcmFpbmUKLQkJCSJVQSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gVW5pdGVkX0FyYWJfRW1pcmF0ZXMKLQkJCSJBRSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gVW5pdGVkX1N0YXRlcwotCQkJIlVTIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCi0JCQkJeyAzNiwgICA0LCAgMTcsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyA1MiwgICA0LCAgMjQsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAxNDksICA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFZlbmV6dWVsYQotCQkJIlZFIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCi0JCQkJeyAxNDksICA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIERlZmF1bHQKLQkJCSIiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDExLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKLQkJCQl7IDM2LCAgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDUyLCAgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMTQ5LCAgNSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCitzdHJ1Y3QgcnRfY2hfZGVzcCB7CisJdTggRmlyc3RDaGFubmVsOworCXU4IE51bU9mQ2g7CisJY2hhciBNYXhUeFB3cjsJCS8qIGRCbSAqLworCXU4IEdlb2dyYXBoeTsJLyogMDpvdXQgZG9vciwgMTppbiBkb29yLCAyOmJvdGggKi8KKwlCT09MRUFOIERmc1JlcTsJCS8qIERmcyByZXF1aXJlLCAwOiBObywgMTogeWVzLiAqLwogfTsKIAotc3RhdGljIGlubGluZSBQQ0hfUkVHSU9OIEdldENoUmVnaW9uKAotCUlOIFBVQ0hBUiBDbnRyeUNvZGUpCi17Ci0JSU5UIGxvb3AgPSAwOwotCVBDSF9SRUdJT04gcENoUmVnaW9uID0gTlVMTDsKK3N0cnVjdCBydF9jaF9yZWdpb24geworCXU4IENvdW50UmVnWzNdOworCXU4IERmc1R5cGU7CQkvKiAwOiBDRSwgMTogRkNDLCAyOiBKQVAsIDM6SkFQX1c1MywgSkFQX1c1NiAqLworCXN0cnVjdCBydF9jaF9kZXNwIENoRGVzcFsxMF07Cit9OwogCi0Jd2hpbGUgKHN0cmNtcChDaFJlZ2lvbltsb29wXS5Db3VudFJlZywgIiIpICE9IDApCi0JewotCQlpZiAoc3RybmNtcChDaFJlZ2lvbltsb29wXS5Db3VudFJlZywgQ250cnlDb2RlLCAyKSA9PSAwKQotCQl7Ci0JCQlwQ2hSZWdpb24gPSAmQ2hSZWdpb25bbG9vcF07Ci0JCQlicmVhazsKLQkJfQotCQlsb29wKys7Ci0JfQorZXh0ZXJuIHN0cnVjdCBydF9jaF9yZWdpb24gQ2hSZWdpb25bXTsKIAotCWlmIChwQ2hSZWdpb24gPT0gTlVMTCkKLQkJcENoUmVnaW9uID0gJkNoUmVnaW9uW2xvb3BdOwotCXJldHVybiBwQ2hSZWdpb247Ci19CitzdHJ1Y3QgcnRfY2hfZnJlcV9tYXAgeworCXUxNiBjaGFubmVsOworCXUxNiBmcmVxS0h6OworfTsKIAotc3RhdGljIGlubGluZSBWT0lEIENoQmFuZENoZWNrKAotCUlOIFVDSEFSIFBoeU1vZGUsCi0JT1VUIFBVQ0hBUiBwQ2hUeXBlKQotewotCXN3aXRjaChQaHlNb2RlKQotCXsKLQkJY2FzZSBQSFlfMTFBOgotCQljYXNlIFBIWV8xMUFOX01JWEVEOgotCQkJKnBDaFR5cGUgPSBCQU5EXzVHOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExQUJHX01JWEVEOgotCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKLQkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgotCQkJKnBDaFR5cGUgPSBCQU5EX0JPVEg7Ci0JCQlicmVhazsKK2V4dGVybiBzdHJ1Y3QgcnRfY2hfZnJlcV9tYXAgQ0hfSFpfSURfTUFQW107CitleHRlcm4gaW50IENIX0haX0lEX01BUF9OVU07CiAKLQkJZGVmYXVsdDoKLQkJCSpwQ2hUeXBlID0gQkFORF8yNEc7Ci0JCQlicmVhazsKLQl9Ci19CisjZGVmaW5lICAgICBNQVBfQ0hBTk5FTF9JRF9UT19LSFooX2NoLCBfa2h6KQkJCQkJXAorCQlkb3sJCQkJCQkJCQkJCQkJXAorCQkJaW50IF9jaElkeDsJCQkJCQkJCQkJCVwKKwkJCWZvciAoX2NoSWR4ID0gMDsgX2NoSWR4IDwgQ0hfSFpfSURfTUFQX05VTTsgX2NoSWR4KyspXAorCQkJewkJCQkJCQkJCQkJCQlcCisJCQkJaWYgKChfY2gpID09IENIX0haX0lEX01BUFtfY2hJZHhdLmNoYW5uZWwpCQkJXAorCQkJCXsJCQkJCQkJCQkJCQlcCisJCQkJCShfa2h6KSA9IENIX0haX0lEX01BUFtfY2hJZHhdLmZyZXFLSHogKiAxMDAwOwlcCisJCQkJCWJyZWFrOwkJCQkJCQkJCQlcCisJCQkJfQkJCQkJCQkJCQkJCVwKKwkJCX0JCQkJCQkJCQkJCQkJXAorCQkJaWYgKF9jaElkeCA9PSBDSF9IWl9JRF9NQVBfTlVNKQkJCQkJXAorCQkJCShfa2h6KSA9IDI0MTIwMDA7CQkJCQkJCQkJXAorICAgICAgICAgICAgfXdoaWxlKDApCiAKLXN0YXRpYyBpbmxpbmUgVUNIQVIgRmlsbENoTGlzdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQQ0hfREVTUCBwQ2hEZXNwLAotCUlOIFVDSEFSIE9mZnNldCwKLQlJTiBVQ0hBUiBpbmNyZW1lbnQpCi17Ci0JSU5UIGksIGosIGw7Ci0JVUNIQVIgY2hhbm5lbDsKKyNkZWZpbmUgICAgIE1BUF9LSFpfVE9fQ0hBTk5FTF9JRChfa2h6LCBfY2gpICAgICAgICAgICAgICAgICBcCisJCWRvewkJCQkJCQkJCQkJCQlcCisJCQlpbnQgX2NoSWR4OwkJCQkJCQkJCQkJXAorCQkJZm9yIChfY2hJZHggPSAwOyBfY2hJZHggPCBDSF9IWl9JRF9NQVBfTlVNOyBfY2hJZHgrKylcCisJCQl7CQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoKF9raHopID09IENIX0haX0lEX01BUFtfY2hJZHhdLmZyZXFLSHopCQkJXAorCQkJCXsJCQkJCQkJCQkJCQlcCisJCQkJCShfY2gpID0gQ0hfSFpfSURfTUFQW19jaElkeF0uY2hhbm5lbDsJCQlcCisJCQkJCWJyZWFrOwkJCQkJCQkJCQlcCisJCQkJfQkJCQkJCQkJCQkJCVwKKwkJCX0JCQkJCQkJCQkJCQkJXAorCQkJaWYgKF9jaElkeCA9PSBDSF9IWl9JRF9NQVBfTlVNKQkJCQkJXAorCQkJCShfY2gpID0gMTsJCQkJCQkJCQkJCVwKKwkJfXdoaWxlKDApCiAKLQlqID0gT2Zmc2V0OwotCWZvciAoaSA9IDA7IGkgPCBwQ2hEZXNwLT5OdW1PZkNoOyBpKyspCi0JewotCQljaGFubmVsID0gcENoRGVzcC0+Rmlyc3RDaGFubmVsICsgaSAqIGluY3JlbWVudDsKLQkJZm9yIChsPTA7IGw8TUFYX05VTV9PRl9DSEFOTkVMUzsgbCsrKQotCQl7Ci0JCQlpZiAoY2hhbm5lbCA9PSBwQWQtPlR4UG93ZXJbbF0uQ2hhbm5lbCkKLQkJCXsKLQkJCQlwQWQtPkNoYW5uZWxMaXN0W2pdLlBvd2VyID0gcEFkLT5UeFBvd2VyW2xdLlBvd2VyOwotCQkJCXBBZC0+Q2hhbm5lbExpc3Rbal0uUG93ZXIyID0gcEFkLT5UeFBvd2VyW2xdLlBvd2VyMjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAobCA9PSBNQVhfTlVNX09GX0NIQU5ORUxTKQotCQkJY29udGludWU7Cit2b2lkIEJ1aWxkQ2hhbm5lbExpc3RFeChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi0JCXBBZC0+Q2hhbm5lbExpc3Rbal0uQ2hhbm5lbCA9IHBDaERlc3AtPkZpcnN0Q2hhbm5lbCArIGkgKiBpbmNyZW1lbnQ7Ci0JCXBBZC0+Q2hhbm5lbExpc3Rbal0uTWF4VHhQd3IgPSBwQ2hEZXNwLT5NYXhUeFB3cjsKLQkJcEFkLT5DaGFubmVsTGlzdFtqXS5EZnNSZXEgPSBwQ2hEZXNwLT5EZnNSZXE7Ci0JCWorKzsKLQl9Ci0JcEFkLT5DaGFubmVsTGlzdE51bSA9IGo7Cit2b2lkIEJ1aWxkQmVhY29uQ2hMaXN0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIHU4ICpwQnVmLCB1bnNpZ25lZCBsb25nICpwQnVmTGVuKTsKIAotCXJldHVybiBqOwotfQordm9pZCBOX0NoYW5uZWxDaGVjayhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1zdGF0aWMgaW5saW5lIFZPSUQgQ3JlYXRlQ2hMaXN0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBDSF9SRUdJT04gcENoUmVnaW9uLAotCUlOIFVDSEFSIEdlb2dyYXBoeSkKLXsKLQlJTlQgaTsKLQlVQ0hBUiBvZmZzZXQgPSAwOwotCVBDSF9ERVNQIHBDaERlc3A7Ci0JVUNIQVIgQ2hUeXBlOwotCVVDSEFSIGluY3JlbWVudDsKK3ZvaWQgTl9TZXRDZW5DaChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi0JaWYgKHBDaFJlZ2lvbiA9PSBOVUxMKQotCQlyZXR1cm47Cit1OCBHZXRDdW50cnlNYXhUeFB3cihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IGNoYW5uZWwpOwogCi0JQ2hCYW5kQ2hlY2socEFkLT5Db21tb25DZmcuUGh5TW9kZSwgJkNoVHlwZSk7Ci0KLQlmb3IgKGk9MDsgaTwxMDsgaSsrKQotCXsKLQkJcENoRGVzcCA9ICZwQ2hSZWdpb24tPkNoRGVzcFtpXTsKLQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA9PSAwKQotCQkJYnJlYWs7Ci0KLQkJaWYgKENoVHlwZSA9PSBCQU5EXzVHKQotCQl7Ci0JCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsIDw9IDE0KQotCQkJCWNvbnRpbnVlOwotCQl9Ci0JCWVsc2UgaWYgKENoVHlwZSA9PSBCQU5EXzI0RykKLQkJewotCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA+IDE0KQotCQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKChwQ2hEZXNwLT5HZW9ncmFwaHkgPT0gQk9USCkKLQkJCXx8IChwQ2hEZXNwLT5HZW9ncmFwaHkgPT0gR2VvZ3JhcGh5KSkKLSAgICAgICAgewotCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA+IDE0KQotICAgICAgICAgICAgICAgIGluY3JlbWVudCA9IDQ7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgaW5jcmVtZW50ID0gMTsKLQkJCW9mZnNldCA9IEZpbGxDaExpc3QocEFkLCBwQ2hEZXNwLCBvZmZzZXQsIGluY3JlbWVudCk7Ci0gICAgICAgIH0KLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgVk9JRCBCdWlsZENoYW5uZWxMaXN0RXgoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JUENIX1JFR0lPTiBwQ2hSZWc7Ci0KLQlwQ2hSZWcgPSBHZXRDaFJlZ2lvbihwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSk7Ci0JQ3JlYXRlQ2hMaXN0KHBBZCwgcENoUmVnLCBwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkpOwotfQotCi1zdGF0aWMgaW5saW5lIFZPSUQgQnVpbGRCZWFjb25DaExpc3QoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JT1VUIFBVQ0hBUiBwQnVmLAotCU9VVAlQVUxPTkcgcEJ1ZkxlbikKLXsKLQlJTlQgaTsKLQlVTE9ORyBUbXBMZW47Ci0JUENIX1JFR0lPTiBwQ2hSZWdpb247Ci0JUENIX0RFU1AgcENoRGVzcDsKLQlVQ0hBUiBDaFR5cGU7Ci0KLQlwQ2hSZWdpb24gPSBHZXRDaFJlZ2lvbihwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSk7Ci0KLQlpZiAocENoUmVnaW9uID09IE5VTEwpCi0JCXJldHVybjsKLQotCUNoQmFuZENoZWNrKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUsICZDaFR5cGUpOwotCSpwQnVmTGVuID0gMDsKLQotCWZvciAoaT0wOyBpPDEwOyBpKyspCi0JewotCQlwQ2hEZXNwID0gJnBDaFJlZ2lvbi0+Q2hEZXNwW2ldOwotCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsID09IDApCi0JCQlicmVhazsKLQotCQlpZiAoQ2hUeXBlID09IEJBTkRfNUcpCi0JCXsKLQkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPD0gMTQpCi0JCQkJY29udGludWU7Ci0JCX0KLQkJZWxzZSBpZiAoQ2hUeXBlID09IEJBTkRfMjRHKQotCQl7Ci0JCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsID4gMTQpCi0JCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoKHBDaERlc3AtPkdlb2dyYXBoeSA9PSBCT1RIKQotCQkJfHwgKHBDaERlc3AtPkdlb2dyYXBoeSA9PSBwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkpKQotCQl7Ci0JCQlNYWtlT3V0Z29pbmdGcmFtZShwQnVmICsgKnBCdWZMZW4sCQkmVG1wTGVuLAotCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgCSZwQ2hEZXNwLT5GaXJzdENoYW5uZWwsCi0JCQkJCQkJCTEsICAgICAgICAgICAgICAgICAJJnBDaERlc3AtPk51bU9mQ2gsCi0JCQkJCQkJCTEsICAgICAgICAgICAgICAgICAJJnBDaERlc3AtPk1heFR4UHdyLAotCQkJCQkJCQlFTkRfT0ZfQVJHUyk7Ci0JCQkqcEJ1ZkxlbiArPSBUbXBMZW47Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgQk9PTEVBTiBJc1ZhbGlkQ2hhbm5lbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiBjaGFubmVsKQotCi17Ci0JSU5UIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQotCXsKLQkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCA9PSBjaGFubmVsKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkKLQkJcmV0dXJuIEZBTFNFOwotCWVsc2UKLQkJcmV0dXJuIFRSVUU7Ci19Ci0KLQotc3RhdGljIGlubGluZSBVQ0hBUiBHZXRFeHRDaCgKLQlJTiBVQ0hBUiBDaGFubmVsLAotCUlOIFVDSEFSIERpcmVjdGlvbikKLXsKLQlDSEFSIEV4dENoOwotCi0JaWYgKERpcmVjdGlvbiA9PSBFWFRDSEFfQUJPVkUpCi0JCUV4dENoID0gQ2hhbm5lbCArIDQ7Ci0JZWxzZQotCQlFeHRDaCA9IChDaGFubmVsIC0gNCkgPiAwID8gKENoYW5uZWwgLSA0KSA6IDA7Ci0KLQlyZXR1cm4gRXh0Q2g7Ci19Ci0KLQotc3RhdGljIGlubGluZSBWT0lEIE5fQ2hhbm5lbENoZWNrKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCS8vVUNIQVIgQ2hhbm5lbE51bSA9IHBBZC0+Q2hhbm5lbExpc3ROdW07Ci0JVUNIQVIgQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7Ci0KLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPT0gQldfNDApKQotCXsKLQkJaWYgKENoYW5uZWwgPiAxNCkKLQkJewotCQkJaWYgKChDaGFubmVsID09IDM2KSB8fCAoQ2hhbm5lbCA9PSA0NCkgfHwgKENoYW5uZWwgPT0gNTIpIHx8IChDaGFubmVsID09IDYwKSB8fCAoQ2hhbm5lbCA9PSAxMDApIHx8IChDaGFubmVsID09IDEwOCkgfHwKLQkJCSAgICAoQ2hhbm5lbCA9PSAxMTYpIHx8IChDaGFubmVsID09IDEyNCkgfHwgKENoYW5uZWwgPT0gMTMyKSB8fCAoQ2hhbm5lbCA9PSAxNDkpIHx8IChDaGFubmVsID09IDE1NykpCi0JCQl7Ci0JCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKLQkJCX0KLQkJCWVsc2UgaWYgKChDaGFubmVsID09IDQwKSB8fCAoQ2hhbm5lbCA9PSA0OCkgfHwgKENoYW5uZWwgPT0gNTYpIHx8IChDaGFubmVsID09IDY0KSB8fCAoQ2hhbm5lbCA9PSAxMDQpIHx8IChDaGFubmVsID09IDExMikgfHwKLQkJCQkJKENoYW5uZWwgPT0gMTIwKSB8fCAoQ2hhbm5lbCA9PSAxMjgpIHx8IChDaGFubmVsID09IDEzNikgfHwgKENoYW5uZWwgPT0gMTUzKSB8fCAoQ2hhbm5lbCA9PSAxNjEpKQotCQkJewotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQkVMT1c7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJZG8KLQkJCXsKLQkJCQlVQ0hBUiBFeHRDaDsKLQkJCQlVQ0hBUiBEaXIgPSBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBOwotCQkJCUV4dENoID0gR2V0RXh0Q2goQ2hhbm5lbCwgRGlyKTsKLQkJCQlpZiAoSXNWYWxpZENoYW5uZWwocEFkLCBFeHRDaCkpCi0JCQkJCWJyZWFrOwotCi0JCQkJRGlyID0gKERpciA9PSBFWFRDSEFfQUJPVkUpID8gRVhUQ0hBX0JFTE9XIDogRVhUQ0hBX0FCT1ZFOwotCQkJCUV4dENoID0gR2V0RXh0Q2goQ2hhbm5lbCwgRGlyKTsKLQkJCQlpZiAoSXNWYWxpZENoYW5uZWwocEFkLCBFeHRDaCkpCi0JCQkJewotCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRGlyOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOwotCQkJfSB3aGlsZShGQUxTRSk7Ci0KLQkJCWlmIChDaGFubmVsID09IDE0KQotCQkJewotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV18yMDsKLQkJCQkvL3BBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfTk9ORTsJLy8gV2UgZGlkbid0IHNldCB0aGUgRXh0Q2ggYXMgTk9ORSBkdWUgdG8gaXQnbGwgc2V0IGluIFJUTVBTZXRIVCgpCi0JCQl9Ci0JCX0KLQl9Ci0KLQotfQotCi0KLXN0YXRpYyBpbmxpbmUgVk9JRCBOX1NldENlbkNoKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCWlmIChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDApCi0JewotCQlpZiAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9PSBFWFRDSEFfQUJPVkUpCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCArIDI7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9PSAxNCkKLQkJCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgLSAxOwotCQkJZWxzZQotCQkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCAtIDI7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwotCX0KLX0KLQotc3RhdGljIGlubGluZSBVSU5UOCBHZXRDdW50cnlNYXhUeFB3cigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVSU5UOCBjaGFubmVsKQotewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspCi0JewotCQlpZiAocEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsID09IGNoYW5uZWwpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoaSA9PSBwQWQtPkNoYW5uZWxMaXN0TnVtKQotCQlyZXR1cm4gMHhmZjsKLQllbHNlCi0JCXJldHVybiBwQWQtPkNoYW5uZWxMaXN0W2ldLk1heFR4UHdyOwotfQotI2VuZGlmIC8vIF9fQ0hMSVNUX0hfXwotCisjZW5kaWYgLyogX19DSExJU1RfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi8yODYwX3J0bXBfaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vMjg2MF9ydG1wX2luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJjMGZiOTkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vMjg2MF9ydG1wX2luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDg5NyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCTI4NjBfcnRtcF9pbml0LmMKLQotCUFic3RyYWN0OgotCU1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLQktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlQYXVsIExpbiAgICAyMDAyLTA4LTAxICAgIGNyZWF0ZWQKLSAgICBKb2huIENoYW5nICAyMDA0LTA4LTIwICAgIFJUMjU2MS8yNjYxIHVzZSBzY2F0dGVyLWdhdGhlciBzY2hlbWUKLSAgICBKYW4gTGVlICAyMDA2LTA5LTE1ICAgIFJUMjg2MC4gQ2hhbmdlIGZvciA4MDIuMTFuICwgRUVQUk9NLCBMZWQsIEJBLCBIVC4KLSovCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlBbGxvY2F0ZSBETUEgbWVtb3J5IGJsb2NrcyBmb3Igc2VuZCwgcmVjZWl2ZQotCi0JQXJndW1lbnRzOgotCQlBZGFwdGVyCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5ESVNfU1RBVFVTX1NVQ0NFU1MKLQkJTkRJU19TVEFUVVNfRkFJTFVSRQotCQlORElTX1NUQVRVU19SRVNPVVJDRVMKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMJUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnkoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JTkRJU19TVEFUVVMJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JVUxPTkcJCQlSaW5nQmFzZVBhSGlnaDsKLQlVTE9ORwkJCVJpbmdCYXNlUGFMb3c7Ci0JUFZPSUQJCQlSaW5nQmFzZVZhOwotCUlOVAkJCQlpbmRleCwgbnVtOwotCVBUWERfU1RSVUMJCXBUeEQ7Ci0JUFJYRF9TVFJVQwkJcFJ4RDsKLQlVTE9ORwkJCUVycm9yVmFsdWUgPSAwOwotCVBSVE1QX1RYX1JJTkcJcFR4UmluZzsKLQlQUlRNUF9ETUFCVUYJcERtYUJ1ZjsKLQlQTkRJU19QQUNLRVQJcFBhY2tldDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeVxuIikpOwotCWRvCi0JewotCQkvLwotCQkvLyBBbGxvY2F0ZSBhbGwgcmluZyBkZXNjcmlwdG9ycywgaW5jbHVkZSBUeEQsIFJ4RCwgTWdtdEQuCi0JCS8vIEFsdGhvdWdoIGVhY2ggc2l6ZSBpcyBkaWZmZXJlbnQsIHRvIHByZXZlbnQgY2FjaGVsaW5lIGFuZCBhbGlnbm1lbnQKLQkJLy8gaXNzdWUsIEkgaW50ZW50aW9uYWwgc2V0IHRoZW0gYWxsIHRvIDY0IGJ5dGVzLgotCQkvLwotCQlmb3IgKG51bT0wOyBudW08TlVNX09GX1RYX1JJTkc7IG51bSsrKQotCQl7Ci0JCQlVTE9ORyAgQnVmQmFzZVBhSGlnaDsKLQkJCVVMT05HICBCdWZCYXNlUGFMb3c7Ci0JCQlQVk9JRCAgQnVmQmFzZVZhOwotCi0JCQkvLwotCQkJLy8gQWxsb2NhdGUgVHggcmluZyBkZXNjcmlwdG9yJ3MgbWVtb3J5ICg1IFRYIHJpbmdzID0gNCBBQ3MgKyAxIEhDQ0EpCi0JCQkvLwotCQkJcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NTaXplID0gVFhfUklOR19TSVpFICogVFhEX1NJWkU7Ci0JCQlSVE1QX0FsbG9jYXRlVHhEZXNjTWVtb3J5KAotCQkJCXBBZCwKLQkJCQludW0sCi0JCQkJcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NTaXplLAotCQkJCUZBTFNFLAotCQkJCSZwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhLAotCQkJCSZwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1BhKTsKLQotCQkJaWYgKHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEgPT0gTlVMTCkKLQkJCXsKLQkJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOwotCQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpKTsKLQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8vIFplcm8gaW5pdCB0aGlzIG1lbW9yeSBibG9jawotCQkJTmRpc1plcm9NZW1vcnkocEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NWYSwgcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NTaXplKTsKLQotCQkJLy8gU2F2ZSBQQSAmIFZBIGZvciBmdXJ0aGVyIG9wZXJhdGlvbgotCQkJUmluZ0Jhc2VQYUhpZ2ggPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2gocEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NQYSk7Ci0JCQlSaW5nQmFzZVBhTG93ICA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93IChwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1BhKTsKLQkJCVJpbmdCYXNlVmEgICAgID0gcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NWYTsKLQotCQkJLy8KLQkJCS8vIEFsbG9jYXRlIGFsbCAxc3QgVFhCdWYncyBtZW1vcnkgZm9yIHRoaXMgVHhSaW5nCi0JCQkvLwotCQkJcEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NTaXplID0gVFhfUklOR19TSVpFICogVFhfRE1BXzFTVF9CVUZGRVJfU0laRTsKLQkJCVJUTVBfQWxsb2NhdGVGaXJzdFR4QnVmZmVyKAotCQkJCXBBZCwKLQkJCQludW0sCi0JCQkJcEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NTaXplLAotCQkJCUZBTFNFLAotCQkJCSZwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1ZhLAotCQkJCSZwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1BhKTsKLQotCQkJaWYgKHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jVmEgPT0gTlVMTCkKLQkJCXsKLQkJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOwotCQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpKTsKLQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8vIFplcm8gaW5pdCB0aGlzIG1lbW9yeSBibG9jawotCQkJTmRpc1plcm9NZW1vcnkocEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NWYSwgcEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NTaXplKTsKLQotCQkJLy8gU2F2ZSBQQSAmIFZBIGZvciBmdXJ0aGVyIG9wZXJhdGlvbgotCQkJQnVmQmFzZVBhSGlnaCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1BhKTsKLQkJCUJ1ZkJhc2VQYUxvdyAgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyAocEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NQYSk7Ci0JCQlCdWZCYXNlVmEgICAgID0gcEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NWYTsKLQotCQkJLy8KLQkJCS8vIEluaXRpYWxpemUgVHggUmluZyBEZXNjcmlwdG9yIGFuZCBhc3NvY2lhdGVkIGJ1ZmZlciBtZW1vcnkKLQkJCS8vCi0JCQlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW251bV07Ci0JCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBUWF9SSU5HX1NJWkU7IGluZGV4KyspCi0JCQl7Ci0JCQkJcFR4UmluZy0+Q2VsbFtpbmRleF0ucE5kaXNQYWNrZXQgPSBOVUxMOwotCQkJCXBUeFJpbmctPkNlbGxbaW5kZXhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0JCQkJLy8gSW5pdCBUeCBSaW5nIFNpemUsIFZhLCBQYSB2YXJpYWJsZXMKLQkJCQlwVHhSaW5nLT5DZWxsW2luZGV4XS5BbGxvY1NpemUgPSBUWERfU0laRTsKLQkJCQlwVHhSaW5nLT5DZWxsW2luZGV4XS5BbGxvY1ZhID0gUmluZ0Jhc2VWYTsKLQkJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2gocFR4UmluZy0+Q2VsbFtpbmRleF0uQWxsb2NQYSwgUmluZ0Jhc2VQYUhpZ2gpOwotCQkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93IChwVHhSaW5nLT5DZWxsW2luZGV4XS5BbGxvY1BhLCBSaW5nQmFzZVBhTG93KTsKLQotCQkJCS8vIFNldHVwIFR4IEJ1ZmZlciBzaXplICYgYWRkcmVzcy4gb25seSA4MDIuMTEgaGVhZGVyIHdpbGwgc3RvcmUgaW4gdGhpcyBzcGFjZQotCQkJCXBEbWFCdWYgPSAmcFR4UmluZy0+Q2VsbFtpbmRleF0uRG1hQnVmOwotCQkJCXBEbWFCdWYtPkFsbG9jU2l6ZSA9IFRYX0RNQV8xU1RfQlVGRkVSX1NJWkU7Ci0JCQkJcERtYUJ1Zi0+QWxsb2NWYSA9IEJ1ZkJhc2VWYTsKLQkJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2gocERtYUJ1Zi0+QWxsb2NQYSwgQnVmQmFzZVBhSGlnaCk7Ci0JCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3cocERtYUJ1Zi0+QWxsb2NQYSwgQnVmQmFzZVBhTG93KTsKLQotCQkJCS8vIGxpbmsgdGhlIHByZS1hbGxvY2F0ZWQgVHhCdWYgdG8gVFhECi0JCQkJcFR4RCA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW2luZGV4XS5BbGxvY1ZhOwotCQkJCXBUeEQtPlNEUHRyMCA9IEJ1ZkJhc2VQYUxvdzsKLQkJCQkvLyBhZHZhbmNlIHRvIG5leHQgcmluZyBkZXNjcmlwdG9yIGFkZHJlc3MKLQkJCQlwVHhELT5ETUFET05FID0gMTsKLQkJCQlSaW5nQmFzZVBhTG93ICs9IFRYRF9TSVpFOwotCQkJCVJpbmdCYXNlVmEgPSAoUFVDSEFSKSBSaW5nQmFzZVZhICsgVFhEX1NJWkU7Ci0KLQkJCQkvLyBhZHZhbmNlIHRvIG5leHQgVHhCdWYgYWRkcmVzcwotCQkJCUJ1ZkJhc2VQYUxvdyArPSBUWF9ETUFfMVNUX0JVRkZFUl9TSVpFOwotCQkJCUJ1ZkJhc2VWYSA9IChQVUNIQVIpIEJ1ZkJhc2VWYSArIFRYX0RNQV8xU1RfQlVGRkVSX1NJWkU7Ci0JCQl9Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeFJpbmdbJWRdOiB0b3RhbCAlZCBlbnRyeSBhbGxvY2F0ZWRcbiIsIG51bSwgaW5kZXgpKTsKLQkJfQotCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1JFU09VUkNFUykKLQkJCWJyZWFrOwotCi0JCS8vCi0JCS8vIEFsbG9jYXRlIE1HTVQgcmluZyBkZXNjcmlwdG9yJ3MgbWVtb3J5IGV4Y2VwdCBUeCByaW5nIHdoaWNoIGFsbG9jYXRlZCBlYXJpbGVyCi0JCS8vCi0JCXBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSA9IE1HTVRfUklOR19TSVpFICogVFhEX1NJWkU7Ci0JCVJUTVBfQWxsb2NhdGVNZ210RGVzY01lbW9yeSgKLQkJCXBBZCwKLQkJCXBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSwKLQkJCUZBTFNFLAotCQkJJnBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsCi0JCQkmcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NQYSk7Ci0KLQkJaWYgKHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEgPT0gTlVMTCkKLQkJewotCQkJRXJyb3JWYWx1ZSA9IEVSUkxPR19PVVRfT0ZfU0hBUkVEX01FTU9SWTsKLQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpKTsKLQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrCi0JCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSk7Ci0KLQkJLy8gU2F2ZSBQQSAmIFZBIGZvciBmdXJ0aGVyIG9wZXJhdGlvbgotCQlSaW5nQmFzZVBhSGlnaCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1BhKTsKLQkJUmluZ0Jhc2VQYUxvdyAgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyAocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NQYSk7Ci0JCVJpbmdCYXNlVmEgICAgID0gcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYTsKLQotCQkvLwotCQkvLyBJbml0aWFsaXplIE1HTVQgUmluZyBhbmQgYXNzb2NpYXRlZCBidWZmZXIgbWVtb3J5Ci0JCS8vCi0JCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1HTVRfUklOR19TSVpFOyBpbmRleCsrKQotCQl7Ci0JCQlwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0ID0gTlVMTDsKLQkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLQkJCS8vIEluaXQgTUdNVCBSaW5nIFNpemUsIFZhLCBQYSB2YXJpYWJsZXMKLQkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NTaXplID0gVFhEX1NJWkU7Ci0JCQlwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLkFsbG9jVmEgPSBSaW5nQmFzZVZhOwotCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NQYSwgUmluZ0Jhc2VQYUhpZ2gpOwotCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3cgKHBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NQYSwgUmluZ0Jhc2VQYUxvdyk7Ci0KLQkJCS8vIE9mZnNldCB0byBuZXh0IHJpbmcgZGVzY3JpcHRvciBhZGRyZXNzCi0JCQlSaW5nQmFzZVBhTG93ICs9IFRYRF9TSVpFOwotCQkJUmluZ0Jhc2VWYSA9IChQVUNIQVIpIFJpbmdCYXNlVmEgKyBUWERfU0laRTsKLQotCQkJLy8gbGluayB0aGUgcHJlLWFsbG9jYXRlZCBUeEJ1ZiB0byBUWEQKLQkJCXBUeEQgPSAoUFRYRF9TVFJVQykgcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5BbGxvY1ZhOwotCQkJcFR4RC0+RE1BRE9ORSA9IDE7Ci0KLQkJCS8vIG5vIHByZS1hbGxvY2F0ZWQgYnVmZmVyIHJlcXVpcmVkIGluIE1nbXRSaW5nIGZvciBzY2F0dGVyLWdhdGhlciBjYXNlCi0JCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTUdNVCBSaW5nOiB0b3RhbCAlZCBlbnRyeSBhbGxvY2F0ZWRcbiIsIGluZGV4KSk7Ci0KLQkJLy8KLQkJLy8gQWxsb2NhdGUgUlggcmluZyBkZXNjcmlwdG9yJ3MgbWVtb3J5IGV4Y2VwdCBUeCByaW5nIHdoaWNoIGFsbG9jYXRlZCBlYXJpbGVyCi0JCS8vCi0JCXBBZC0+UnhEZXNjUmluZy5BbGxvY1NpemUgPSBSWF9SSU5HX1NJWkUgKiBSWERfU0laRTsKLQkJUlRNUF9BbGxvY2F0ZVJ4RGVzY01lbW9yeSgKLQkJCXBBZCwKLQkJCXBBZC0+UnhEZXNjUmluZy5BbGxvY1NpemUsCi0JCQlGQUxTRSwKLQkJCSZwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSwKLQkJCSZwQWQtPlJ4RGVzY1JpbmcuQWxsb2NQYSk7Ci0KLQkJaWYgKHBBZC0+UnhEZXNjUmluZy5BbGxvY1ZhID09IE5VTEwpCi0JCXsKLQkJCUVycm9yVmFsdWUgPSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlk7Ci0JCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgYSBiaWcgYnVmZmVyXG4iKSk7Ci0JCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8vIFplcm8gaW5pdCB0aGlzIG1lbW9yeSBibG9jawotCQlOZGlzWmVyb01lbW9yeShwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5SeERlc2NSaW5nLkFsbG9jU2l6ZSk7Ci0KLQotCQlwcmludGsoIlJYIERFU0MgJXAgIHNpemUgPSAlbGRcbiIsIHBBZC0+UnhEZXNjUmluZy5BbGxvY1ZhLAotCQkJCQlwQWQtPlJ4RGVzY1JpbmcuQWxsb2NTaXplKTsKLQotCQkvLyBTYXZlIFBBICYgVkEgZm9yIGZ1cnRoZXIgb3BlcmF0aW9uCi0JCVJpbmdCYXNlUGFIaWdoID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+UnhEZXNjUmluZy5BbGxvY1BhKTsKLQkJUmluZ0Jhc2VQYUxvdyAgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyAocEFkLT5SeERlc2NSaW5nLkFsbG9jUGEpOwotCQlSaW5nQmFzZVZhICAgICA9IHBBZC0+UnhEZXNjUmluZy5BbGxvY1ZhOwotCi0JCS8vCi0JCS8vIEluaXRpYWxpemUgUnggUmluZyBhbmQgYXNzb2NpYXRlZCBidWZmZXIgbWVtb3J5Ci0JCS8vCi0JCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFJYX1JJTkdfU0laRTsgaW5kZXgrKykKLQkJewotCQkJLy8gSW5pdCBSWCBSaW5nIFNpemUsIFZhLCBQYSB2YXJpYWJsZXMKLQkJCXBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkFsbG9jU2l6ZSA9IFJYRF9TSVpFOwotCQkJcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NWYSA9IFJpbmdCYXNlVmE7Ci0JCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2gocEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NQYSwgUmluZ0Jhc2VQYUhpZ2gpOwotCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3cgKHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkFsbG9jUGEsIFJpbmdCYXNlUGFMb3cpOwotCi0JCQkvLyBPZmZzZXQgdG8gbmV4dCByaW5nIGRlc2NyaXB0b3IgYWRkcmVzcwotCQkJUmluZ0Jhc2VQYUxvdyArPSBSWERfU0laRTsKLQkJCVJpbmdCYXNlVmEgPSAoUFVDSEFSKSBSaW5nQmFzZVZhICsgUlhEX1NJWkU7Ci0KLQkJCS8vIFNldHVwIFJ4IGFzc29jaWF0ZWQgQnVmZmVyIHNpemUgJiBhbGxvY2F0ZSBzaGFyZSBtZW1vcnkKLQkJCXBEbWFCdWYgPSAmcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uRG1hQnVmOwotCQkJcERtYUJ1Zi0+QWxsb2NTaXplID0gUlhfQlVGRkVSX0FHR1JFU0laRTsKLQkJCXBQYWNrZXQgPSBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIoCi0JCQkJcEFkLAotCQkJCXBEbWFCdWYtPkFsbG9jU2l6ZSwKLQkJCQlGQUxTRSwKLQkJCQkmcERtYUJ1Zi0+QWxsb2NWYSwKLQkJCQkmcERtYUJ1Zi0+QWxsb2NQYSk7Ci0KLQkJCS8qIGtlZXAgYWxsb2NhdGVkIHJ4IHBhY2tldCAqLwotCQkJcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQgPSBwUGFja2V0OwotCi0JCQkvLyBFcnJvciBoYW5kbGluZwotCQkJaWYgKHBEbWFCdWYtPkFsbG9jVmEgPT0gTlVMTCkKLQkJCXsKLQkJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOwotCQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBSeFJpbmcncyAxc3QgYnVmZmVyXG4iKSk7Ci0JCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvLyBaZXJvIGluaXQgdGhpcyBtZW1vcnkgYmxvY2sKLQkJCU5kaXNaZXJvTWVtb3J5KHBEbWFCdWYtPkFsbG9jVmEsIHBEbWFCdWYtPkFsbG9jU2l6ZSk7Ci0KLQkJCS8vIFdyaXRlIFJ4RCBidWZmZXIgYWRkcmVzcyAmIGFsbG9jYXRlZCBidWZmZXIgbGVuZ3RoCi0JCQlwUnhEID0gKFBSWERfU1RSVUMpIHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkFsbG9jVmE7Ci0JCQlwUnhELT5TRFAwID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocERtYUJ1Zi0+QWxsb2NQYSk7Ci0JCQlwUnhELT5ERE9ORSA9IDA7Ci0JCX0KLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSeCBSaW5nOiB0b3RhbCAlZCBlbnRyeSBhbGxvY2F0ZWRcbiIsIGluZGV4KSk7Ci0KLQl9CXdoaWxlIChGQUxTRSk7Ci0KLQotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkZyYWdGcmFtZSwgc2l6ZW9mKEZSQUdNRU5UX0ZSQU1FKSk7Ci0JcEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQgPSAgUlRNUF9BbGxvY2F0ZUZyYWdQYWNrZXRCdWZmZXIocEFkLCBSWF9CVUZGRVJfTk9STVNJWkUpOwotCi0JaWYgKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0ID09IE5VTEwpCi0JewotCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7Ci0JfQotCi0JaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJLy8gTG9nIGVycm9yIGluZm9yYW10aW9uCi0JCU5kaXNXcml0ZUVycm9yTG9nRW50cnkoCi0JCQlwQWQtPkFkYXB0ZXJIYW5kbGUsCi0JCQlORElTX0VSUk9SX0NPREVfT1VUX09GX1JFU09VUkNFUywKLQkJCTEsCi0JCQlFcnJvclZhbHVlKTsKLQl9Ci0KLQlEQkdQUklOVF9TKFN0YXR1cywgKCI8LS0gUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnksIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7Ci0JcmV0dXJuIFN0YXR1czsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJSW5pdGlhbGl6ZSB0cmFuc21pdCBkYXRhIHN0cnVjdHVyZXMKLQotCUFyZ3VtZW50czoKLQkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCU5vdGU6Ci0JCUluaXRpYWxpemUgYWxsIHRyYW5zbWl0IHJlbGVhdGVkIHByaXZhdGUgYnVmZmVyLCBpbmNsdWRlIHRob3NlIGRlZmluZQotCQlpbiBSVE1QX0FEQVBURVIgc3RydWN0dXJlIGFuZCBhbGwgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZXMuCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECU5JQ0luaXRUeFJ4UmluZ0FuZEJhY2tsb2dRdWV1ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQkvL1dQRE1BX0dMT19DRkdfU1RSVUMJR2xvQ2ZnOwotCWludCBpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tPiBOSUNJbml0VHhSeFJpbmdBbmRCYWNrbG9nUXVldWVcbiIpKTsKLQotCS8vIEluaXRpYWxpemUgYWxsIHRyYW5zbWl0IHJlbGF0ZWQgc29mdHdhcmUgcXVldWVzCi0JSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQkVdKTsKLQlJbml0aWFsaXplUXVldWVIZWFkZXIoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CS10pOwotCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmcEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXSk7Ci0JSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dKTsKLQlJbml0aWFsaXplUXVldWVIZWFkZXIoJnBBZC0+VHhTd1F1ZXVlW1FJRF9IQ0NBXSk7Ci0KLQkvLyBJbml0IFJYIFJpbmcgaW5kZXggcG9pbnRlcgotCXBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4ID0gMDsKLQlwQWQtPlJ4UmluZy5SeENwdUlkeCA9IFJYX1JJTkdfU0laRSAtIDE7Ci0KLQkvLyBJbml0IFRYIHJpbmdzIGluZGV4IHBvaW50ZXIKLQkJZm9yIChpPTA7IGk8TlVNX09GX1RYX1JJTkc7IGkrKykKLQkJewotCQkJcEFkLT5UeFJpbmdbaV0uVHhTd0ZyZWVJZHggPSAwOwotCQkJcEFkLT5UeFJpbmdbaV0uVHhDcHVJZHggPSAwOwotCQl9Ci0KLQkvLyBpbml0IE1HTVQgcmluZyBpbmRleCBwb2ludGVyCi0JcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA9IDA7Ci0JcEFkLT5NZ210UmluZy5UeENwdUlkeCA9IDA7Ci0KLQlwQWQtPlByaXZhdGVJbmZvLlR4UmluZ0Z1bGxDbnQgICAgICAgPSAwOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlSZXNldCBOSUMgQXNpY3MuIENhbGwgYWZ0ZXIgcmVzdCBETUEuIFNvIHJlc2V0IFRYX0NUWF9JRFggdG8gemVyby4KLQotCUFyZ3VtZW50czoKLQkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0JCVJlc2V0IE5JQyB0byBpbml0aWFsIHN0YXRlIEFTIElTIHN5c3RlbSBib290IHVwIHRpbWUuCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBSaW5nQ2xlYW5VcCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCVJpbmdUeXBlKQotewotCVBUWERfU1RSVUMJCXBUeEQ7Ci0JUFJYRF9TVFJVQwkJcFJ4RDsKLQlQUVVFVUVfRU5UUlkJcEVudHJ5OwotCVBORElTX1BBQ0tFVAlwUGFja2V0OwotCWludAkJCQlpOwotCVBSVE1QX1RYX1JJTkcJcFR4UmluZzsKLQl1bnNpZ25lZCBsb25nCUlycUZsYWdzOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVE1QUmluZ0NsZWFuVXAoUmluZ0lkeD0lZCwgUGVuZGluZy1ORElTPSVsZClcbiIsIFJpbmdUeXBlLCBwQWQtPlJhbGlua0NvdW50ZXJzLlBlbmRpbmdOZGlzUGFja2V0Q291bnQpKTsKLQlzd2l0Y2ggKFJpbmdUeXBlKQotCXsKLQkJY2FzZSBRSURfQUNfQks6Ci0JCWNhc2UgUUlEX0FDX0JFOgotCQljYXNlIFFJRF9BQ19WSToKLQkJY2FzZSBRSURfQUNfVk86Ci0JCWNhc2UgUUlEX0hDQ0E6Ci0JCQlSVE1QX0lSUV9MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7Ci0JCQlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1JpbmdUeXBlXTsKLQotCQkJLy8gV2UgaGF2ZSB0byBjbGVhbiBhbGwgZGVzY3JpcHRvcnMgaW4gY2FzZSBzb21lIGVycm9yIGhhcHBlbmVkIHdpdGggcmVzZXQKLQkJCWZvciAoaT0wOyBpPFRYX1JJTkdfU0laRTsgaSsrKSAvLyBXZSBoYXZlIHRvIHNjYW4gYWxsIFRYIHJpbmcKLQkJCXsKLQkJCQlwVHhEICA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW2ldLkFsbG9jVmE7Ci0KLQkJCQlwUGFja2V0ID0gKFBORElTX1BBQ0tFVCkgcFR4UmluZy0+Q2VsbFtpXS5wTmRpc1BhY2tldDsKLQkJCQkvLyByZWxlYXNlIHNjYXR0ZXItYW5kLWdhdGhlciBORElTX1BBQ0tFVAotCQkJCWlmIChwUGFja2V0KQotCQkJCXsKLQkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJCQlwVHhSaW5nLT5DZWxsW2ldLnBOZGlzUGFja2V0ID0gTlVMTDsKLQkJCQl9Ci0KLQkJCQlwUGFja2V0ID0gKFBORElTX1BBQ0tFVCkgcFR4UmluZy0+Q2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQ7Ci0JCQkJLy8gcmVsZWFzZSBzY2F0dGVyLWFuZC1nYXRoZXIgTkRJU19QQUNLRVQKLQkJCQlpZiAocFBhY2tldCkKLQkJCQl7Ci0JCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCQkJcFR4UmluZy0+Q2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCQkJCX0KLQkJCX0KLQotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMCArIFJpbmdUeXBlICogMHgxMCwgJnBUeFJpbmctPlR4RG1hSWR4KTsKLQkJCXBUeFJpbmctPlR4U3dGcmVlSWR4ID0gcFR4UmluZy0+VHhEbWFJZHg7Ci0JCQlwVHhSaW5nLT5UeENwdUlkeCA9IHBUeFJpbmctPlR4RG1hSWR4OwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ1RYX0lEWDAgKyBSaW5nVHlwZSAqIDB4MTAsIHBUeFJpbmctPlR4Q3B1SWR4KTsKLQotCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7Ci0JCQlSVE1QX0lSUV9MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7Ci0JCQl3aGlsZSAocEFkLT5UeFN3UXVldWVbUmluZ1R5cGVdLkhlYWQgIT0gTlVMTCkKLQkJCXsKLQkJCQlwRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBBZC0+VHhTd1F1ZXVlW1JpbmdUeXBlXSk7Ci0JCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwRW50cnkpOwotCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJlbGVhc2UgMSBORElTIHBhY2tldCBmcm9tIHMvdyBiYWNrbG9nIHF1ZXVlXG4iKSk7Ci0JCQl9Ci0JCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUUlEX01HTVQ6Ci0JCQkvLyBXZSBoYXZlIHRvIGNsZWFuIGFsbCBkZXNjcmlwdG9ycyBpbiBjYXNlIHNvbWUgZXJyb3IgaGFwcGVuZWQgd2l0aCByZXNldAotCQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOwotCi0JCQlmb3IgKGk9MDsgaTxNR01UX1JJTkdfU0laRTsgaSsrKQotCQkJewotCQkJCXBUeEQgID0gKFBUWERfU1RSVUMpIHBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5BbGxvY1ZhOwotCi0JCQkJcFBhY2tldCA9IChQTkRJU19QQUNLRVQpIHBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5wTmRpc1BhY2tldDsKLQkJCQkvLyBybGVhc2Ugc2NhdHRlci1hbmQtZ2F0aGVyIE5ESVNfUEFDS0VUCi0JCQkJaWYgKHBQYWNrZXQpCi0JCQkJewotCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIwLCBwVHhELT5TRExlbjAsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQkJfQotCQkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5wTmRpc1BhY2tldCA9IE5VTEw7Ci0KLQkJCQlwUGFja2V0ID0gKFBORElTX1BBQ0tFVCkgcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldDsKLQkJCQkvLyByZWxlYXNlIHNjYXR0ZXItYW5kLWdhdGhlciBORElTX1BBQ0tFVAotCQkJCWlmIChwUGFja2V0KQotCQkJCXsKLQkJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgcFR4RC0+U0RMZW4xLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJCX0KLQkJCQlwQWQtPk1nbXRSaW5nLkNlbGxbaV0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLQotCQkJfQotCi0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX01HTVREVFhfSURYLCAmcEFkLT5NZ210UmluZy5UeERtYUlkeCk7Ci0JCQlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID0gcEFkLT5NZ210UmluZy5UeERtYUlkeDsKLQkJCXBBZC0+TWdtdFJpbmcuVHhDcHVJZHggPSBwQWQtPk1nbXRSaW5nLlR4RG1hSWR4OwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTUdNVENUWF9JRFgsIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgpOwotCi0JCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1nbXRSaW5nTG9jayk7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50ID0gMDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUUlEX1JYOgotCQkJLy8gV2UgaGF2ZSB0byBjbGVhbiBhbGwgZGVzY3JpcHRvcnMgaW4gY2FzZSBzb21lIGVycm9yIGhhcHBlbmVkIHdpdGggcmVzZXQKLQkJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+UnhSaW5nTG9jayk7Ci0KLQkJCWZvciAoaT0wOyBpPFJYX1JJTkdfU0laRTsgaSsrKQotCQkJewotCQkJCXBSeEQgID0gKFBSWERfU1RSVUMpIHBBZC0+UnhSaW5nLkNlbGxbaV0uQWxsb2NWYTsKLQkJCQlwUnhELT5ERE9ORSA9IDAgOwotCQkJfQotCi0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX0RSWF9JRFgsICZwQWQtPlJ4UmluZy5SeERtYUlkeCk7Ci0JCQlwQWQtPlJ4UmluZy5SeFN3UmVhZElkeCA9IHBBZC0+UnhSaW5nLlJ4RG1hSWR4OwotCQkJcEFkLT5SeFJpbmcuUnhDcHVJZHggPSAoKHBBZC0+UnhSaW5nLlJ4RG1hSWR4ID09IDApID8gKFJYX1JJTkdfU0laRS0xKSA6IChwQWQtPlJ4UmluZy5SeERtYUlkeC0xKSk7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9DUlhfSURYLCBwQWQtPlJ4UmluZy5SeENwdUlkeCk7Ci0KLQkJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+UnhSaW5nTG9jayk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JfQotfQotCi0KLU5ESVNfU1RBVFVTIEFkYXB0ZXJCbG9ja0FsbG9jYXRlTWVtb3J5KAotCUlOIFBWT0lECWhhbmRsZSwKLQlPVVQJUFZPSUQJKnBwQWQpCi17Ci0JUFBDSV9ERVYgcGNpX2RldjsKLQlkbWFfYWRkcl90CSpwaHlfYWRkcjsKLQlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSkgaGFuZGxlOwotCi0JcGNpX2RldiA9IHBPYmotPnBjaV9kZXY7Ci0JcGh5X2FkZHIgPSAmcE9iai0+cEFkX3BhOwotCi0JKnBwQWQgPSAoUFZPSUQpdm1hbGxvYyhzaXplb2YoUlRNUF9BREFQVEVSKSk7IC8vcGNpX2FsbG9jX2NvbnNpc3RlbnQocGNpX2Rldiwgc2l6ZW9mKFJUTVBfQURBUFRFUiksIHBoeV9hZGRyKTsKLQotCWlmICgqcHBBZCkKLQl7Ci0JCU5kaXNaZXJvTWVtb3J5KCpwcEFkLCBzaXplb2YoUlRNUF9BREFQVEVSKSk7Ci0JCSgoUFJUTVBfQURBUFRFUikqcHBBZCktPk9TX0Nvb2tpZSA9IGhhbmRsZTsKLQkJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKLQl9IGVsc2UgewotCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCX0KLX0KLQotCi12b2lkIFJUTVBfQWxsb2NhdGVUeERlc2NNZW1vcnkoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUlOVAlJbmRleCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JQk9PTEVBTglDYWNoZWQsCi0JT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKLQlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpCi17Ci0JUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7Ci0KLQkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpUENJX0FMTE9DX0NPTlNJU1RFTlQocE9iai0+cGNpX2RldixzaXplb2YoY2hhcikqTGVuZ3RoLCBQaHlzaWNhbEFkZHJlc3MpOwotCi19Ci0KLXZvaWQgUlRNUF9BbGxvY2F0ZU1nbXREZXNjTWVtb3J5KAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAotCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcykKLXsKLQlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKLQotCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRClQQ0lfQUxMT0NfQ09OU0lTVEVOVChwT2JqLT5wY2lfZGV2LHNpemVvZihjaGFyKSpMZW5ndGgsIFBoeXNpY2FsQWRkcmVzcyk7Ci0KLX0KLQotdm9pZCBSVE1QX0FsbG9jYXRlUnhEZXNjTWVtb3J5KAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAotCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcykKLXsKLQlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKLQotCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRClQQ0lfQUxMT0NfQ09OU0lTVEVOVChwT2JqLT5wY2lfZGV2LHNpemVvZihjaGFyKSpMZW5ndGgsIFBoeXNpY2FsQWRkcmVzcyk7Ci0KLX0KLQotdm9pZCBSVE1QX0ZyZWVSeERlc2NNZW1vcnkoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCVBWT0lECVZpcnR1YWxBZGRyZXNzLAotCUlOCU5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpCi17Ci0JUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7Ci0KLQlQQ0lfRlJFRV9DT05TSVNURU5UKHBPYmotPnBjaV9kZXYsIExlbmd0aCwgVmlydHVhbEFkZHJlc3MsIFBoeXNpY2FsQWRkcmVzcyk7Ci19Ci0KLQotdm9pZCBSVE1QX0FsbG9jYXRlRmlyc3RUeEJ1ZmZlcigKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVSU5UCUluZGV4LAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAotCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcykKLXsKLQlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKLQotCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRClQQ0lfQUxMT0NfQ09OU0lTVEVOVChwT2JqLT5wY2lfZGV2LHNpemVvZihjaGFyKSpMZW5ndGgsIFBoeXNpY2FsQWRkcmVzcyk7Ci19Ci0KLS8qCi0gKiBGVU5DVElPTjogQWxsb2NhdGUgYSBjb21tb24gYnVmZmVyIGZvciBETUEKLSAqIEFSR1VNRU5UUzoKLSAqICAgICBBZGFwdGVySGFuZGxlOiAgQWRhcHRlckhhbmRsZQotICogICAgIExlbmd0aDogIE51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZQotICogICAgIENhY2hlZDogIFdoZXRoZXIgb3Igbm90IHRoZSBtZW1vcnkgY2FuIGJlIGNhY2hlZAotICogICAgIFZpcnR1YWxBZGRyZXNzOiAgUG9pbnRlciB0byBtZW1vcnkgaXMgcmV0dXJuZWQgaGVyZQotICogICAgIFBoeXNpY2FsQWRkcmVzczogIFBoeXNpY2FsIGFkZHJlc3MgY29ycmVzcG9uZGluZyB0byB2aXJ0dWFsIGFkZHJlc3MKLSAqLwotCi12b2lkIFJUTVBfQWxsb2NhdGVTaGFyZWRNZW1vcnkoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCi0JT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQotewotCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOwotCi0JKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKVBDSV9BTExPQ19DT05TSVNURU5UKHBPYmotPnBjaV9kZXYsc2l6ZW9mKGNoYXIpKkxlbmd0aCwgUGh5c2ljYWxBZGRyZXNzKTsKLX0KLQotVk9JRCBSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKQotewotCWludCBpbmRleCwgbnVtICwgajsKLQlQUlRNUF9UWF9SSU5HIHBUeFJpbmc7Ci0JUFRYRF9TVFJVQwkgIHBUeEQ7Ci0JUE5ESVNfUEFDS0VUICBwUGFja2V0OwotCXVuc2lnbmVkIGludCAgSXJxRmxhZ3M7Ci0KLQlQT1NfQ09PS0lFIHBPYmogPShQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBSVE1QRnJlZVR4UnhSaW5nTWVtb3J5XG4iKSk7Ci0KLQkvLyBGcmVlIFR4U3dRdWV1ZSBQYWNrZXQKLQlmb3IgKGluZGV4PTA7IGluZGV4IDxOVU1fT0ZfVFhfUklORzsgaW5kZXgrKykKLQl7Ci0JCVBRVUVVRV9FTlRSWSBwRW50cnk7Ci0JCVBORElTX1BBQ0tFVCBwUGFja2V0OwotCQlQUVVFVUVfSEVBREVSICAgcFF1ZXVlOwotCi0JCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLQkJcFF1ZXVlID0gJnBBZC0+VHhTd1F1ZXVlW2luZGV4XTsKLQkJd2hpbGUgKHBRdWV1ZS0+SGVhZCkKLQkJewotCQkJcEVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKHBRdWV1ZSk7Ci0JCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBFbnRyeSk7Ci0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCX0KLQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7Ci0JfQotCi0JLy8gRnJlZSBUeCBSaW5nIFBhY2tldAotCWZvciAoaW5kZXg9MDtpbmRleDwgTlVNX09GX1RYX1JJTkc7aW5kZXgrKykKLQl7Ci0JCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbaW5kZXhdOwotCi0JCWZvciAoaj0wOyBqPCBUWF9SSU5HX1NJWkU7IGorKykKLQkJewotCQkJcFR4RCA9IChQVFhEX1NUUlVDKSAocFR4UmluZy0+Q2VsbFtqXS5BbGxvY1ZhKTsKLQkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW2pdLnBOZGlzUGFja2V0OwotCi0JCQlpZiAocFBhY2tldCkKLQkJCXsKLSAgICAgICAgICAgIAlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIwLCBwVHhELT5TRExlbjAsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQkJCX0KLQkJCS8vQWx3YXlzIGFzc2lnbiBwTmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCi0JCQlwVHhSaW5nLT5DZWxsW2pdLnBOZGlzUGFja2V0ID0gTlVMTDsKLQotCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbal0ucE5leHROZGlzUGFja2V0OwotCi0JCQlpZiAocFBhY2tldCkKLQkJCXsKLSAgICAgICAgICAgIAlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQkJCX0KLQkJCS8vQWx3YXlzIGFzc2lnbiBwTmV4dE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgotCQkJcFR4UmluZy0+Q2VsbFtwVHhSaW5nLT5UeFN3RnJlZUlkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLQotCQl9Ci0JfQotCi0JZm9yIChpbmRleCA9IFJYX1JJTkdfU0laRSAtIDEgOyBpbmRleCA+PSAwOyBpbmRleC0tKQotCXsKLQkJaWYgKChwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5EbWFCdWYuQWxsb2NWYSkgJiYgKHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0KSkKLQkJewotCQkJUENJX1VOTUFQX1NJTkdMRShwT2JqLT5wY2lfZGV2LCBwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5EbWFCdWYuQWxsb2NQYSwgcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uRG1hQnVmLkFsbG9jU2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5wTmRpc1BhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCX0KLQl9Ci0JTmRpc1plcm9NZW1vcnkocEFkLT5SeFJpbmcuQ2VsbCwgUlhfUklOR19TSVpFICogc2l6ZW9mKFJUTVBfRE1BQ0IpKTsKLQotCWlmIChwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSkKLSAgICB7Ci0gICAgCVBDSV9GUkVFX0NPTlNJU1RFTlQocE9iai0+cGNpX2RldiwgcEFkLT5SeERlc2NSaW5nLkFsbG9jU2l6ZSwgcEFkLT5SeERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+UnhEZXNjUmluZy5BbGxvY1BhKTsKLSAgICB9Ci0gICAgTmRpc1plcm9NZW1vcnkoJnBBZC0+UnhEZXNjUmluZywgc2l6ZW9mKFJUTVBfRE1BQlVGKSk7Ci0KLQlpZiAocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSkKLQl7Ci0JCVBDSV9GUkVFX0NPTlNJU1RFTlQocE9iai0+cGNpX2RldiwgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplLAlwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhLCBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1BhKTsKLQl9Ci0JTmRpc1plcm9NZW1vcnkoJnBBZC0+TWdtdERlc2NSaW5nLCBzaXplb2YoUlRNUF9ETUFCVUYpKTsKLQotCWZvciAobnVtID0gMDsgbnVtIDwgTlVNX09GX1RYX1JJTkc7IG51bSsrKQotCXsKLSAgICAJaWYgKHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jVmEpCi0JICAgIHsKLQkgICAgCVBDSV9GUkVFX0NPTlNJU1RFTlQocE9iai0+cGNpX2RldiwgcEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NTaXplLCBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1ZhLCBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1BhKTsKLQkgICAgfQotCSAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5UeEJ1ZlNwYWNlW251bV0sIHNpemVvZihSVE1QX0RNQUJVRikpOwotCi0gICAgCWlmIChwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhKQotCSAgICB7Ci0JICAgIAlQQ0lfRlJFRV9DT05TSVNURU5UKHBPYmotPnBjaV9kZXYsIHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jU2l6ZSwgcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NWYSwgcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NQYSk7Ci0JICAgIH0KLQkgICAgTmRpc1plcm9NZW1vcnkoJnBBZC0+VHhEZXNjUmluZ1tudW1dLCBzaXplb2YoUlRNUF9ETUFCVUYpKTsKLQl9Ci0KLQlpZiAocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQpCi0JCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gUlRNUEZyZWVUeFJ4UmluZ01lbW9yeVxuIikpOwotfQotCi0KLS8qCi0gKiBGVU5DVElPTjogQWxsb2NhdGUgYSBwYWNrZXQgYnVmZmVyIGZvciBETUEKLSAqIEFSR1VNRU5UUzoKLSAqICAgICBBZGFwdGVySGFuZGxlOiAgQWRhcHRlckhhbmRsZQotICogICAgIExlbmd0aDogIE51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZQotICogICAgIENhY2hlZDogIFdoZXRoZXIgb3Igbm90IHRoZSBtZW1vcnkgY2FuIGJlIGNhY2hlZAotICogICAgIFZpcnR1YWxBZGRyZXNzOiAgUG9pbnRlciB0byBtZW1vcnkgaXMgcmV0dXJuZWQgaGVyZQotICogICAgIFBoeXNpY2FsQWRkcmVzczogIFBoeXNpY2FsIGFkZHJlc3MgY29ycmVzcG9uZGluZyB0byB2aXJ0dWFsIGFkZHJlc3MKLSAqIE5vdGVzOgotICogICAgIENhY2hlZCBpcyBpZ25vcmVkOiBhbHdheXMgY2FjaGVkIG1lbW9yeQotICovCi1QTkRJU19QQUNLRVQgUlRNUF9BbGxvY2F0ZVJ4UGFja2V0QnVmZmVyKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAotCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcykKLXsKLQlQTkRJU19QQUNLRVQgcGt0OwotCi0JcGt0ID0gUlRQS1RfVE9fT1NQS1QoREVWX0FMTE9DX1NLQihMZW5ndGgpKTsKLQotCWlmIChwa3QgPT0gTlVMTCkgewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjYW4ndCBhbGxvY2F0ZSByeCAlbGQgc2l6ZSBwYWNrZXRcbiIsTGVuZ3RoKSk7Ci0JfQotCi0JaWYgKHBrdCkgewotCQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKHBrdCwgUEtUU1JDX05ESVMpOwotCQkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpIFJUUEtUX1RPX09TUEtUKHBrdCktPmRhdGE7Ci0JCSpQaHlzaWNhbEFkZHJlc3MgPSBQQ0lfTUFQX1NJTkdMRShwQWQsICpWaXJ0dWFsQWRkcmVzcywgTGVuZ3RoLCAtMSwgUENJX0RNQV9GUk9NREVWSUNFKTsKLQl9IGVsc2UgewotCQkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpIE5VTEw7Ci0JCSpQaHlzaWNhbEFkZHJlc3MgPSAoTkRJU19QSFlTSUNBTF9BRERSRVNTKSBOVUxMOwotCX0KLQotCXJldHVybiAoUE5ESVNfUEFDS0VUKSBwa3Q7Ci19Ci0KLQotVk9JRCBJbnZhbGlkX1JlbWFpbmluZ19QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JIFVMT05HIFZpcnR1YWxBZGRyZXNzKQotewotCU5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3M7Ci0KLQlQaHlzaWNhbEFkZHJlc3MgPSBQQ0lfTUFQX1NJTkdMRShwQWQsICh2b2lkICopKFZpcnR1YWxBZGRyZXNzKzE2MDApLCBSWF9CVUZGRVJfTk9STVNJWkUtMTYwMCwgLTEsIFBDSV9ETUFfRlJPTURFVklDRSk7Ci19Ci0KLVBORElTX1BBQ0tFVCBHZXRQYWNrZXRGcm9tUnhSaW5nKAotCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJCVBSVDI4WFhfUlhEX1NUUlVDCXBTYXZlUnhELAotCU9VVAkJQk9PTEVBTgkJCSpwYlJlc2NoZWR1bGUsCi0JSU4gT1VUCVVJTlQzMgkJCSpwUnhQZW5kaW5nKQotewotCVBSWERfU1RSVUMJCQkJcFJ4RDsKLQlQTkRJU19QQUNLRVQJCQlwUnhQYWNrZXQgPSBOVUxMOwotCVBORElTX1BBQ0tFVAkJCXBOZXdQYWNrZXQ7Ci0JUFZPSUQJCQkJCUFsbG9jVmE7Ci0JTkRJU19QSFlTSUNBTF9BRERSRVNTCUFsbG9jUGE7Ci0JQk9PTEVBTgkJCQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKLQotCVJUTVBfU0VNX0xPQ0soJnBBZC0+UnhSaW5nTG9jayk7Ci0KLQlpZiAoKnBSeFBlbmRpbmcgPT0gMCkKLQl7Ci0JCS8vIEdldCBob3cgbWF5IHBhY2tldHMgaGFkIGJlZW4gcmVjZWl2ZWQKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9EUlhfSURYICwgJnBBZC0+UnhSaW5nLlJ4RG1hSWR4KTsKLQotCQlpZiAocEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPT0gcEFkLT5SeFJpbmcuUnhEbWFJZHgpCi0JCXsKLQkJCS8vIG5vIG1vcmUgcnggcGFja2V0cwotCQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCS8vIGdldCByeCBwZW5kaW5nIGNvdW50Ci0JCWlmIChwQWQtPlJ4UmluZy5SeERtYUlkeCA+IHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4KQotCQkJKnBSeFBlbmRpbmcgPSBwQWQtPlJ4UmluZy5SeERtYUlkeCAtIHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4OwotCQllbHNlCi0JCQkqcFJ4UGVuZGluZwk9IHBBZC0+UnhSaW5nLlJ4RG1hSWR4ICsgUlhfUklOR19TSVpFIC0gcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHg7Ci0KLQl9Ci0KLQkvLyBQb2ludCB0byBSeCBpbmRleGVkIHJ4IHJpbmcgZGVzY3JpcHRvcgotCXBSeEQgPSAoUFJYRF9TVFJVQykgcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0uQWxsb2NWYTsKLQotCWlmIChwUnhELT5ERE9ORSA9PSAwKQotCXsKLQkJKnBSeFBlbmRpbmcgPSAwOwotCQkvLyBETUFJbmR4IGhhZCBkb25lIGJ1dCBERE9ORSBiaXQgbm90IHJlYWR5Ci0JCWJSZXNjaGVkdWxlID0gVFJVRTsKLQkJZ290byBkb25lOwotCX0KLQotCi0JLy8gcmV0dXJuIHJ4IGRlc2NyaXB0b3IKLQlOZGlzTW92ZU1lbW9yeShwU2F2ZVJ4RCwgcFJ4RCwgUlhEX1NJWkUpOwotCi0JcE5ld1BhY2tldCA9IFJUTVBfQWxsb2NhdGVSeFBhY2tldEJ1ZmZlcihwQWQsIFJYX0JVRkZFUl9BR0dSRVNJWkUsIEZBTFNFLCAmQWxsb2NWYSwgJkFsbG9jUGEpOwotCi0JaWYgKHBOZXdQYWNrZXQpCi0JewotCQkvLyB1bm1hcCB0aGUgcnggYnVmZmVyCi0JCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5EbWFCdWYuQWxsb2NQYSwKLQkJCQkJIHBBZC0+UnhSaW5nLkNlbGxbcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHhdLkRtYUJ1Zi5BbGxvY1NpemUsIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCXBSeFBhY2tldCA9IHBBZC0+UnhSaW5nLkNlbGxbcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHhdLnBOZGlzUGFja2V0OwotCi0JCXBBZC0+UnhSaW5nLkNlbGxbcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHhdLkRtYUJ1Zi5BbGxvY1NpemUJPSBSWF9CVUZGRVJfQUdHUkVTSVpFOwotCQlwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5wTmRpc1BhY2tldAkJPSAoUE5ESVNfUEFDS0VUKSBwTmV3UGFja2V0OwotCQlwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5EbWFCdWYuQWxsb2NWYQk9IEFsbG9jVmE7Ci0JCXBBZC0+UnhSaW5nLkNlbGxbcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHhdLkRtYUJ1Zi5BbGxvY1BhCT0gQWxsb2NQYTsKLQkJLyogdXBkYXRlIFNEUDAgdG8gbmV3IGJ1ZmZlciBvZiByeCBwYWNrZXQgKi8KLQkJcFJ4RC0+U0RQMCA9IEFsbG9jUGE7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vcHJpbnRrKCJObyBSeCBCdWZmZXJcbiIpOwotCQlwUnhQYWNrZXQgPSBOVUxMOwotCQliUmVzY2hlZHVsZSA9IFRSVUU7Ci0JfQotCi0JcFJ4RC0+RERPTkUgPSAwOwotCi0JLy8gaGFkIGhhbmRsZWQgb25lIHJ4IHBhY2tldAotCSpwUnhQZW5kaW5nID0gKnBSeFBlbmRpbmcgLSAxOwotCi0JLy8gdXBkYXRlIHJ4IGRlc2NyaXB0b3IgYW5kIGtpY2sgcngKLQlJTkNfUklOR19JTkRFWChwQWQtPlJ4UmluZy5SeFN3UmVhZElkeCwgUlhfUklOR19TSVpFKTsKLQotCXBBZC0+UnhSaW5nLlJ4Q3B1SWR4ID0gKHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4ID09IDApID8gKFJYX1JJTkdfU0laRS0xKSA6IChwQWQtPlJ4UmluZy5SeFN3UmVhZElkeC0xKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9DUlhfSURYLCBwQWQtPlJ4UmluZy5SeENwdUlkeCk7Ci0KLWRvbmU6Ci0JUlRNUF9TRU1fVU5MT0NLKCZwQWQtPlJ4UmluZ0xvY2spOwotCSpwYlJlc2NoZWR1bGUgPSBiUmVzY2hlZHVsZTsKLQlyZXR1cm4gcFJ4UGFja2V0OwotfQotLyogRW5kIG9mIDI4NjBfcnRtcF9pbml0LmMgKi8KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vYWN0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9hY3Rpb24uYwppbmRleCAyNTZjYjY3Li41NmFkMjM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9hY3Rpb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9hY3Rpb24uYwpAQCAtMzksMTAgKzM5LDcgQEAKICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKICNpbmNsdWRlICJhY3Rpb24uaCIKIAotCi1zdGF0aWMgVk9JRCBSZXNlcnZlZEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworc3RhdGljIHZvaWQgUmVzZXJ2ZWRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAogLyoKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNjEsNzUgKzU4LDg5IEBACiAgICAgICAgIE1UMl9DTFMzRVJSICAgICAgICAgICAgICBjbHMzZXJyX2FjdGlvbgogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgQWN0aW9uU3RhdGVNYWNoaW5lSW5pdCgKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKLSAgICBJTiAgU1RBVEVfTUFDSElORSAqUywKLSAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit2b2lkIEFjdGlvblN0YXRlTWFjaGluZUluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lICpTLAorCQkJICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKIHsKLQlTdGF0ZU1hY2hpbmVJbml0KFMsIChTVEFURV9NQUNISU5FX0ZVTkMgKilUcmFucywgTUFYX0FDVF9TVEFURSwgTUFYX0FDVF9NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgQUNUX0lETEUsIEFDVF9NQUNISU5FX0JBU0UpOworCVN0YXRlTWFjaGluZUluaXQoUywgKFNUQVRFX01BQ0hJTkVfRlVOQyAqKSBUcmFucywgTUFYX0FDVF9TVEFURSwKKwkJCSBNQVhfQUNUX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQykgRHJvcCwgQUNUX0lETEUsCisJCQkgQUNUX01BQ0hJTkVfQkFTRSk7CiAKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX1NQRUNUUlVNX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclNwZWN0cnVtQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX1FPU19DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJRT1NBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfU1BFQ1RSVU1fQ0FURSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJTcGVjdHJ1bUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9RT1NfQ0FURSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJRT1NBY3Rpb24pOwogCi0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9ETFNfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylSZXNlcnZlZEFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9ETFNfQ0FURSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFJlc2VydmVkQWN0aW9uKTsKIAotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfQkFfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQkFBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfSFRfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVySFRBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfQUREX0JBX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZUFEREJBQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVERUxCQUFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfTUxNRV9SRUNfREVMQkFfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lREVMQkFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfQkFfQ0FURSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJCQUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9IVF9DQVRFLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgUGVlckhUQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX0FERF9CQV9DQVRFLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgTWxtZUFEREJBQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgTWxtZURFTEJBQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX1JFQ19ERUxCQV9DQVRFLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgTWxtZURFTEJBQWN0aW9uKTsKIAotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfUFVCTElDX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclB1YmxpY0FjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9STV9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJSTUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9QVUJMSUNfQ0FURSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJQdWJsaWNBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfUk1fQ0FURSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJSTUFjdGlvbik7CiAKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX1FPU19DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVRT1NBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfRExTX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZURMU0FjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfQUNUX0lOVkFMSUQsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZUludmFsaWRBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfUU9TX0NBVEUsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBNbG1lUU9TQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX0RMU19DQVRFLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgTWxtZURMU0FjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfQUNUX0lOVkFMSUQsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBNbG1lSW52YWxpZEFjdGlvbik7CiB9CiAKLVZPSUQgTWxtZUFEREJBQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLQordm9pZCBNbG1lQUREQkFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCU1MTUVfQUREQkFfUkVRX1NUUlVDVCAqcEluZm87Ci0JVUNIQVIgICAgICAgICAgIEFkZHJbNl07Ci0JUFVDSEFSICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7Ci0JVUxPTkcJCUlkeDsKLQlGUkFNRV9BRERCQV9SRVEgIEZyYW1lOwotCVVMT05HCQlGcmFtZUxlbjsKLQlCQV9PUklfRU5UUlkJCQkqcEJBRW50cnkgPSBOVUxMOworCXN0cnVjdCBydF9tbG1lX2FkZGJhX3JlcSAqcEluZm87CisJdTggQWRkcls2XTsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJaW50IE5TdGF0dXM7CisJdW5zaWduZWQgbG9uZyBJZHg7CisJc3RydWN0IHJ0X2ZyYW1lX2FkZGJhX3JlcSBGcmFtZTsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuOworCXN0cnVjdCBydF9iYV9vcmlfZW50cnkgKnBCQUVudHJ5ID0gTlVMTDsKIAotCXBJbmZvID0gKE1MTUVfQUREQkFfUkVRX1NUUlVDVCAqKUVsZW0tPk1zZzsKLQlOZGlzWmVyb01lbW9yeSgmRnJhbWUsIHNpemVvZihGUkFNRV9BRERCQV9SRVEpKTsKKwlwSW5mbyA9IChzdHJ1Y3QgcnRfbWxtZV9hZGRiYV9yZXEgKilFbGVtLT5Nc2c7CisJTmRpc1plcm9NZW1vcnkoJkZyYW1lLCBzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2FkZGJhX3JlcSkpOwogCi0JaWYoTWxtZUFkZEJBUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIpKQotCXsKLQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQkJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gTWxtZUFEREJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwlpZiAoTWxtZUFkZEJBUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIpKSB7CisJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CS8qR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkgKi8KKwkJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOwogCQkJcmV0dXJuOwogCQl9Ci0JCS8vIDEuIGZpbmQgZW50cnkKLQkJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQkFPcmlXY2lkQXJyYXlbcEluZm8tPlRJRF07Ci0JCWlmIChJZHggPT0gMCkKLQkJeworCQkvKiAxLiBmaW5kIGVudHJ5ICovCisJCUlkeCA9CisJCSAgICBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5CQU9yaVdjaWRBcnJheVtwSW5mby0+VElEXTsKKwkJaWYgKElkeCA9PSAwKSB7CiAJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJCQSAtIE1sbWVBRERCQUFjdGlvbigpIGNhbid0IGZpbmQgQkFPcmlFbnRyeSBcbiIpKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIkJBIC0gTWxtZUFEREJBQWN0aW9uKCkgY2FuJ3QgZmluZCBCQU9yaUVudHJ5IFxuIikpOwogCQkJcmV0dXJuOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtJZHhdOworCQl9IGVsc2UgeworCQkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKIAkJfQogCiAJCXsKIAkJCWlmIChBREhPQ19PTihwQWQpKQotCQkJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCBwSW5mby0+cEFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEluZm8tPnBBZGRyLAorCQkJCQkgICAgICBwQWQtPkN1cnJlbnRBZGRyZXNzLAorCQkJCQkgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CiAJCQllbHNlCi0JCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwSW5mby0+cEFkZHIpOworCQkJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLAorCQkJCQkgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwKKwkJCQkJICAgICAgcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJCQkJICAgICAgcEluZm8tPnBBZGRyKTsKIAkJfQogCiAJCUZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfQkE7CkBAIC0xNDEsMjAgKzE1MiwyOSBAQAogCQlGcmFtZS5Ub2tlbiA9IHBJbmZvLT5Ub2tlbjsKIAkJRnJhbWUuVGltZU91dFZhbHVlID0gcEluZm8tPlRpbWVPdXRWYWx1ZTsKIAkJRnJhbWUuQmFTdGFydFNlcS5maWVsZC5GcmFnTnVtID0gMDsKLQkJRnJhbWUuQmFTdGFydFNlcS5maWVsZC5TdGFydFNlcSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLlR4U2VxW3BJbmZvLT5USURdOworCQlGcmFtZS5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxID0KKwkJICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLlR4U2VxW3BJbmZvLT5USURdOwogCi0JCSooVVNIT1JUICopKCZGcmFtZS5CYVBhcm0pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJkZyYW1lLkJhUGFybSkpOworCQkqKHUxNiAqKSAoJkZyYW1lLkJhUGFybSkgPQorCQkgICAgY3B1MmxlMTYoKih1MTYgKikgKCZGcmFtZS5CYVBhcm0pKTsKIAkJRnJhbWUuVGltZU91dFZhbHVlID0gY3B1MmxlMTYoRnJhbWUuVGltZU91dFZhbHVlKTsKIAkJRnJhbWUuQmFTdGFydFNlcS53b3JkID0gY3B1MmxlMTYoRnJhbWUuQmFTdGFydFNlcS53b3JkKTsKIAotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJICAgJkZyYW1lTGVuLAotCQkgICAgICAgICAgICAgIHNpemVvZihGUkFNRV9BRERCQV9SRVEpLCAmRnJhbWUsCi0JCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOwotCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAmRnJhbWVMZW4sCisJCQkJICBzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2FkZGJhX3JlcSksICZGcmFtZSwgRU5EX09GX0FSR1MpOworCisJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwKKwkJCQkgIChNR01UX1VTRV9RVUVVRV9GTEFHIHwKKwkJCQkgICBNYXBVc2VyUHJpb3JpdHlUb0FjY2Vzc0NhdGVnb3J5W3BJbmZvLT5USURdKSwKKwkJCQkgIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwogCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwogCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJBIC0gU2VuZCBBRERCQSByZXF1ZXN0LiBTdGFydFNlcSA9ICV4LCAgRnJhbWVMZW4gPSAlbGQuIEJ1ZlNpemUgPSAlZFxuIiwgRnJhbWUuQmFTdGFydFNlcS5maWVsZC5TdGFydFNlcSwgRnJhbWVMZW4sIEZyYW1lLkJhUGFybS5CdWZTaXplKSk7Ci0gICAgfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkJBIC0gU2VuZCBBRERCQSByZXF1ZXN0LiBTdGFydFNlcSA9ICV4LCAgRnJhbWVMZW4gPSAlbGQuIEJ1ZlNpemUgPSAlZFxuIiwKKwkJCSAgRnJhbWUuQmFTdGFydFNlcS5maWVsZC5TdGFydFNlcSwgRnJhbWVMZW4sCisJCQkgIEZyYW1lLkJhUGFybS5CdWZTaXplKSk7CisJfQogfQogCiAvKgpAQCAtMTYyLDI4OCArMTgyLDI3NyBAQAogICAgIERlc2NyaXB0aW9uOgogICAgICAgICBzZW5kIERFTEJBIGFuZCBkZWxldGUgQmFFbnRyeSBpZiBhbnkKICAgICBQYXJhbWV0cnM6Ci0gICAgICAgIEVsZW0gLSBNTE1FIG1lc3NhZ2UgTUxNRV9ERUxCQV9SRVFfU1RSVUNUCisgICAgICAgIEVsZW0gLSBNTE1FIG1lc3NhZ2Ugc3RydWN0IHJ0X21sbWVfZGVsYmFfcmVxCiAKIAlJUlFMID0gRElTUEFUQ0hfTEVWRUwKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgTWxtZURFTEJBQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgTWxtZURFTEJBQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgKnBJbmZvOwotCVBVQ0hBUiAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCVBVQ0hBUgkJICAgcE91dEJ1ZmZlcjIgPSBOVUxMOwotCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOwotCVVMT05HCQlJZHg7Ci0JRlJBTUVfREVMQkFfUkVRICBGcmFtZTsKLQlVTE9ORwkJRnJhbWVMZW47Ci0JRlJBTUVfQkFSCUZyYW1lQmFyOworCXN0cnVjdCBydF9tbG1lX2RlbGJhX3JlcSAqcEluZm87CisJdTggKnBPdXRCdWZmZXIgPSBOVUxMOworCXU4ICpwT3V0QnVmZmVyMiA9IE5VTEw7CisJaW50IE5TdGF0dXM7CisJdW5zaWduZWQgbG9uZyBJZHg7CisJc3RydWN0IHJ0X2ZyYW1lX2RlbGJhX3JlcSBGcmFtZTsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuOworCXN0cnVjdCBydF9mcmFtZV9iYXIgRnJhbWVCYXI7CiAKLQlwSW5mbyA9IChNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgKilFbGVtLT5Nc2c7Ci0JLy8gbXVzdCBzZW5kIGJhY2sgREVMQkEKLQlOZGlzWmVyb01lbW9yeSgmRnJhbWUsIHNpemVvZihGUkFNRV9ERUxCQV9SRVEpKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gTWxtZURFTEJBQWN0aW9uKCksIEluaXRpYXRvciglZCkgXG4iLCBwSW5mby0+SW5pdGlhdG9yKSk7CisJcEluZm8gPSAoc3RydWN0IHJ0X21sbWVfZGVsYmFfcmVxICopRWxlbS0+TXNnOworCS8qIG11c3Qgc2VuZCBiYWNrIERFTEJBICovCisJTmRpc1plcm9NZW1vcnkoJkZyYW1lLCBzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2RlbGJhX3JlcSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCI9PT4gTWxtZURFTEJBQWN0aW9uKCksIEluaXRpYXRvciglZCkgXG4iLCBwSW5mby0+SW5pdGlhdG9yKSk7CiAKLQlpZihNbG1lRGVsQkFSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikpCi0JewotCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIDEuIFxuIikpOworCWlmIChNbG1lRGVsQkFSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikpIHsKKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJLypHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeSAqLworCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCJCQSAtIE1sbWVERUxCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgMS4gXG4iKSk7CiAJCQlyZXR1cm47CiAJCX0KIAotCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQkJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQl7CisJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcjIpOwkvKkdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5ICovCisJCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJCQSAtIE1sbWVERUxCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgMi4gXG4iKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCJCQSAtIE1sbWVERUxCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgMi4gXG4iKSk7CiAJCQlyZXR1cm47CiAJCX0KKwkJLyogU0VORCBCQVIgKFNlbmQgQkFSIHRvIHJlZnJlc2ggcGVlciByZW9yZGVyaW5nIGJ1ZmZlci4pICovCisJCUlkeCA9CisJCSAgICBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5CQU9yaVdjaWRBcnJheVtwSW5mby0+VElEXTsKIAotCQkvLyBTRU5EIEJBUiAoU2VuZCBCQVIgdG8gcmVmcmVzaCBwZWVyIHJlb3JkZXJpbmcgYnVmZmVyLikKLQkJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQkFPcmlXY2lkQXJyYXlbcEluZm8tPlRJRF07CisJCUJhckhlYWRlckluaXQocEFkLCAmRnJhbWVCYXIsCisJCQkgICAgICBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5BZGRyLAorCQkJICAgICAgcEFkLT5DdXJyZW50QWRkcmVzcyk7CiAKLQkJQmFySGVhZGVySW5pdChwQWQsICZGcmFtZUJhciwgcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLkZyYWdOdW0gPSAwOwkvKiBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4gKi8KKwkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgPSBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5UeFNlcVtwSW5mby0+VElEXTsJLyogbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uICovCisJCUZyYW1lQmFyLkJhckNvbnRyb2wuVElEID0gcEluZm8tPlRJRDsJLyogbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uICovCisJCUZyYW1lQmFyLkJhckNvbnRyb2wuQUNLUG9saWN5ID0gSU1NRURfQkE7CS8qIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLiAqLworCQlGcmFtZUJhci5CYXJDb250cm9sLkNvbXByZXNzZWQgPSAxOwkvKiBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4gKi8KKwkJRnJhbWVCYXIuQmFyQ29udHJvbC5NVElEID0gMDsJLyogbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uICovCiAKLQkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuRnJhZ051bSA9IDA7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgotCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLlR4U2VxW3BJbmZvLT5USURdOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KLQkJRnJhbWVCYXIuQmFyQ29udHJvbC5USUQgPSBwSW5mby0+VElEOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KLQkJRnJhbWVCYXIuQmFyQ29udHJvbC5BQ0tQb2xpY3kgPSBJTU1FRF9CQTsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCi0JCUZyYW1lQmFyLkJhckNvbnRyb2wuQ29tcHJlc3NlZCA9IDE7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgotCQlGcmFtZUJhci5CYXJDb250cm9sLk1USUQgPSAwOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KLQotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyMiwJCQkJJkZyYW1lTGVuLAotCQkJCQkgIHNpemVvZihGUkFNRV9CQVIpLAkgICZGcmFtZUJhciwKLQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIyLCAmRnJhbWVMZW4sCisJCQkJICBzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2JhciksICZGcmFtZUJhciwgRU5EX09GX0FSR1MpOwogCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlcjIsIEZyYW1lTGVuKTsKIAkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyMik7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSAuIFNlbmQgQkFSIHRvIHJlZnJlc2ggcGVlciByZW9yZGVyaW5nIGJ1ZmZlciBcbiIpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJCQSAtIE1sbWVERUxCQUFjdGlvbigpIC4gU2VuZCBCQVIgdG8gcmVmcmVzaCBwZWVyIHJlb3JkZXJpbmcgYnVmZmVyIFxuIikpOwogCi0JCS8vIFNFTkQgREVMQkEgRlJBTUUKKwkJLyogU0VORCBERUxCQSBGUkFNRSAqLwogCQlGcmFtZUxlbiA9IDA7CiAKIAkJewogCQkJaWYgKEFESE9DX09OKHBBZCkpCi0JCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwKKwkJCQkJICAgICAgcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uCisJCQkJCSAgICAgIEFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsCisJCQkJCSAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKIAkJCWVsc2UKLQkJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5BZGRyKTsKKwkJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwKKwkJCQkJICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWQsCisJCQkJCSAgICAgIHBBZC0+Q3VycmVudEFkZHJlc3MsCisJCQkJCSAgICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLgorCQkJCQkgICAgICBBZGRyKTsKIAkJfQogCiAJCUZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfQkE7CiAJCUZyYW1lLkFjdGlvbiA9IERFTEJBOwogCQlGcmFtZS5EZWxiYVBhcm0uSW5pdGlhdG9yID0gcEluZm8tPkluaXRpYXRvcjsKIAkJRnJhbWUuRGVsYmFQYXJtLlRJRCA9IHBJbmZvLT5USUQ7Ci0JCUZyYW1lLlJlYXNvbkNvZGUgPSAzOTsgLy8gVGltZSBPdXQKLQkJKihVU0hPUlQgKikoJkZyYW1lLkRlbGJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmRnJhbWUuRGVsYmFQYXJtKSk7CisJCUZyYW1lLlJlYXNvbkNvZGUgPSAzOTsJLyogVGltZSBPdXQgKi8KKwkJKih1MTYgKikgKCZGcmFtZS5EZWxiYVBhcm0pID0KKwkJICAgIGNwdTJsZTE2KCoodTE2ICopICgmRnJhbWUuRGVsYmFQYXJtKSk7CiAJCUZyYW1lLlJlYXNvbkNvZGUgPSBjcHUybGUxNihGcmFtZS5SZWFzb25Db2RlKTsKIAotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJICAgICAgICAgICAgICBzaXplb2YoRlJBTUVfREVMQkFfUkVRKSwgICAgJkZyYW1lLAotCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgJkZyYW1lTGVuLAorCQkJCSAgc2l6ZW9mKHN0cnVjdCBydF9mcmFtZV9kZWxiYV9yZXEpLCAmRnJhbWUsIEVORF9PRl9BUkdTKTsKIAkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIAkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSAuIDMgREVMQkEgc2VudC4gSW5pdGlhdG9yKCVkKVxuIiwgcEluZm8tPkluaXRpYXRvcikpOwotICAgIAl9Ci19Ci0KLVZPSUQgTWxtZVFPU0FjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci19Ci0KLVZPSUQgTWxtZURMU0FjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci19Ci0KLVZPSUQgTWxtZUludmFsaWRBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCS8vUFVDSEFSCQkgICBwT3V0QnVmZmVyID0gTlVMTDsKLQkvL1JldHVybiB0aGUgcmVjZWl2aW5nIGZyYW1lIGV4Y2VwdCB0aGUgTVNCIG9mIGNhdGVnb3J5IGZpbGVkIHNldCB0byAxLiAgNy4zLjEuMTEKLX0KLQotVk9JRCBQZWVyUU9TQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLX0KLQotVk9JRCBQZWVyQkFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVDSEFSCUFjdGlvbiA9IEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzFdOwotCi0Jc3dpdGNoKEFjdGlvbikKLQl7Ci0JCWNhc2UgQUREQkFfUkVROgotCQkJUGVlckFkZEJBUmVxQWN0aW9uKHBBZCxFbGVtKTsKLQkJCWJyZWFrOwotCQljYXNlIEFEREJBX1JFU1A6Ci0JCQlQZWVyQWRkQkFSc3BBY3Rpb24ocEFkLEVsZW0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgREVMQkE6Ci0JCQlQZWVyRGVsQkFBY3Rpb24ocEFkLEVsZW0pOwotCQkJYnJlYWs7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSAuIDMgREVMQkEgc2VudC4gSW5pdGlhdG9yKCVkKVxuIiwKKwkJCSAgcEluZm8tPkluaXRpYXRvcikpOwogCX0KIH0KIAotVk9JRCBQZWVyUHVibGljQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgTWxtZVFPU0FjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCit7Cit9CisKK3ZvaWQgTWxtZURMU0FjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCit7Cit9CisKK3ZvaWQgTWxtZUludmFsaWRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQoreworCS8qdTggKiAgICAgICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOyAqLworCS8qUmV0dXJuIHRoZSByZWNlaXZpbmcgZnJhbWUgZXhjZXB0IHRoZSBNU0Igb2YgY2F0ZWdvcnkgZmlsZWQgc2V0IHRvIDEuICA3LjMuMS4xMSAqLworfQorCit2b2lkIFBlZXJRT1NBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQoreworfQorCit2b2lkIFBlZXJCQUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCit7CisJdTggQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyAxXTsKKworCXN3aXRjaCAoQWN0aW9uKSB7CisJY2FzZSBBRERCQV9SRVE6CisJCVBlZXJBZGRCQVJlcUFjdGlvbihwQWQsIEVsZW0pOworCQlicmVhazsKKwljYXNlIEFEREJBX1JFU1A6CisJCVBlZXJBZGRCQVJzcEFjdGlvbihwQWQsIEVsZW0pOworCQlicmVhazsKKwljYXNlIERFTEJBOgorCQlQZWVyRGVsQkFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJYnJlYWs7CisJfQorfQorCit2b2lkIFBlZXJQdWJsaWNBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewogCWlmIChFbGVtLT5XY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQogCQlyZXR1cm47CiB9CiAKLQotc3RhdGljIFZPSUQgUmVzZXJ2ZWRBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQorc3RhdGljIHZvaWQgUmVzZXJ2ZWRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVDSEFSIENhdGVnb3J5OworCXU4IENhdGVnb3J5OwogCi0JaWYgKEVsZW0tPk1zZ0xlbiA8PSBMRU5HVEhfODAyXzExKQotCXsKKwlpZiAoRWxlbS0+TXNnTGVuIDw9IExFTkdUSF84MDJfMTEpIHsKIAkJcmV0dXJuOwogCX0KIAogCUNhdGVnb3J5ID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTFdOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUmN2IHJlc2VydmVkIGNhdGVnb3J5KCVkKSBBY3Rpb24gRnJhbWVcbiIsIENhdGVnb3J5KSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIlJjdiByZXNlcnZlZCBjYXRlZ29yeSglZCkgQWN0aW9uIEZyYW1lXG4iLCBDYXRlZ29yeSkpOwogCWhleF9kdW1wKCJSZXNlcnZlZCBBY3Rpb24gRnJhbWUiLCAmRWxlbS0+TXNnWzBdLCBFbGVtLT5Nc2dMZW4pOwogfQogCi1WT0lEIFBlZXJSTUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi0KK3ZvaWQgUGVlclJNQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyBWT0lEIHJlc3BvbmRfaHRfaW5mb3JtYXRpb25fZXhjaGFuZ2VfYWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3N0YXRpYyB2b2lkIHJlc3BvbmRfaHRfaW5mb3JtYXRpb25fZXhjaGFuZ2VfYWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJCSAgIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7Ci0JTkRJU19TVEFUVVMJCU5TdGF0dXM7Ci0JVUxPTkcJCQlGcmFtZUxlbjsKLQlGUkFNRV9IVF9JTkZPCUhUSU5GT2ZyYW1lLCAqcEZyYW1lOwotCVVDSEFSICAgCQkqcEFkZHI7CisJdTggKnBPdXRCdWZmZXIgPSBOVUxMOworCWludCBOU3RhdHVzOworCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW47CisJc3RydWN0IHJ0X2ZyYW1lX2h0X2luZm8gSFRJTkZPZnJhbWUsICpwRnJhbWU7CisJdTggKnBBZGRyOwogCisJLyogMi4gQWx3YXlzIHNlbmQgYmFjayBBRERCQSBSZXNwb25zZSAqLworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CS8qR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkgKi8KIAotCS8vIDIuIEFsd2F5cyBzZW5kIGJhY2sgQUREQkEgUmVzcG9uc2UKLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwkgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCi0JaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUSU9OIC0gcmVzcG9uZF9odF9pbmZvcm1hdGlvbl9leGNoYW5nZV9hY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJBQ1RJT04gLSByZXNwb25kX2h0X2luZm9ybWF0aW9uX2V4Y2hhbmdlX2FjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CiAJCXJldHVybjsKIAl9Ci0KLQkvLyBnZXQgUkEKLQlwRnJhbWUgPSAoRlJBTUVfSFRfSU5GTyAqKSAmRWxlbS0+TXNnWzBdOworCS8qIGdldCBSQSAqLworCXBGcmFtZSA9IChzdHJ1Y3QgcnRfZnJhbWVfaHRfaW5mbyAqKSAmIEVsZW0tPk1zZ1swXTsKIAlwQWRkciA9IHBGcmFtZS0+SGRyLkFkZHIyOwogCi0JTmRpc1plcm9NZW1vcnkoJkhUSU5GT2ZyYW1lLCBzaXplb2YoRlJBTUVfSFRfSU5GTykpOwotCS8vIDItMS4gUHJlcGFyZSBBRERCQSBSZXNwb25zZSBmcmFtZS4KKwlOZGlzWmVyb01lbW9yeSgmSFRJTkZPZnJhbWUsIHNpemVvZihzdHJ1Y3QgcnRfZnJhbWVfaHRfaW5mbykpOworCS8qIDItMS4gUHJlcGFyZSBBRERCQSBSZXNwb25zZSBmcmFtZS4gKi8KIAl7CiAJCWlmIChBREhPQ19PTihwQWQpKQotCQkJQWN0SGVhZGVySW5pdChwQWQsICZIVElORk9mcmFtZS5IZHIsIHBBZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkhUSU5GT2ZyYW1lLkhkciwgcEFkZHIsCisJCQkJICAgICAgcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJCQkgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CiAJCWVsc2UKLQkJCUFjdEhlYWRlckluaXQocEFkLCAmSFRJTkZPZnJhbWUuSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkZHIpOworCQkJQWN0SGVhZGVySW5pdChwQWQsICZIVElORk9mcmFtZS5IZHIsCisJCQkJICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsCisJCQkJICAgICAgcEFkZHIpOwogCX0KIAogCUhUSU5GT2ZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfSFQ7CiAJSFRJTkZPZnJhbWUuQWN0aW9uID0gSFRfSU5GT19FWENIQU5HRTsKIAlIVElORk9mcmFtZS5IVF9JbmZvLlJlcXVlc3QgPSAwOwotCUhUSU5GT2ZyYW1lLkhUX0luZm8uRm9ydHlfTUh6X0ludG9sZXJhbnQgPSBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkZvcnR5X01oel9JbnRvbGVyYW50OwotCUhUSU5GT2ZyYW1lLkhUX0luZm8uU1RBX0NoYW5uZWxfV2lkdGgJID0gcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoOworCUhUSU5GT2ZyYW1lLkhUX0luZm8uRm9ydHlfTUh6X0ludG9sZXJhbnQgPQorCSAgICBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkZvcnR5X01oel9JbnRvbGVyYW50OworCUhUSU5GT2ZyYW1lLkhUX0luZm8uU1RBX0NoYW5uZWxfV2lkdGggPQorCSAgICBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGg7CiAKLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkJJkZyYW1lTGVuLAotCQkJCQkgIHNpemVvZihGUkFNRV9IVF9JTkZPKSwJJkhUSU5GT2ZyYW1lLAotCQkJCQkgIEVORF9PRl9BUkdTKTsKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAmRnJhbWVMZW4sCisJCQkgIHNpemVvZihzdHJ1Y3QgcnRfZnJhbWVfaHRfaW5mbyksICZIVElORk9mcmFtZSwgRU5EX09GX0FSR1MpOwogCiAJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIAlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwogfQogCi1WT0lEIFBlZXJIVEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIFBlZXJIVEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVUNIQVIJQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMV07CisJdTggQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyAxXTsKIAogCWlmIChFbGVtLT5XY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQogCQlyZXR1cm47CiAKLQlzd2l0Y2goQWN0aW9uKQotCXsKLQkJY2FzZSBOT1RJRllfQldfQUNUSU9OOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSBIVCBOb3RpZnkgQ2hhbm5lbCBiYW5kd2lkdGggYWN0aW9uLS0tLT4gXG4iKSk7CisJc3dpdGNoIChBY3Rpb24pIHsKKwljYXNlIE5PVElGWV9CV19BQ1RJT046CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQUNUSU9OIC0gSFQgTm90aWZ5IENoYW5uZWwgYmFuZHdpZHRoIGFjdGlvbi0tLS0+IFxuIikpOwogCi0JCQlpZihwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBGQUxTRSkKLQkJCXsKLQkJCQkvLyBOb3RlLCB0aGlzIGlzIHRvIHBhdGNoIERJUi0xMzUzIEFQLiBXaGVuIHRoZSBBUCBzZXQgdG8gV2VwLCBpdCB3aWxsIHVzZSBsZWdhY3kgbW9kZS4gQnV0IEFQIHN0aWxsIGtlZXBzCi0JCQkJLy8gc2VuZGluZyBCV19Ob3RpZnkgQWN0aW9uIGZyYW1lLCBhbmQgY2F1c2UgdXMgdG8gbGlua3VwIGFuZCBsaW5rZG93bi4KLQkJCQkvLyBJbiBsZWdhY3kgbW9kZSwgZG9uJ3QgbmVlZCB0byBwYXJzZSBIVCBhY3Rpb24gZnJhbWUuCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLUlnbm9yZSBIVCBOb3RpZnkgQ2hhbm5lbCBCVyB3aGVuIGxpbmsgYXMgbGVnYWN5IG1vZGUuIEJXID0gJWQtLS0+IFxuIiwKLQkJCQkJCQkJRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl0gKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsyXSA9PSAwKQkvLyA3LjQuOC4yLiBpZiB2YWx1ZSBpcyAxLCBrZWVwIHRoZSBzYW1lIGFzIHN1cHBvcnRlZCBjaGFubmVsIGJhbmR3aWR0aC4KLQkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLkhUUGh5TW9kZS5maWVsZC5CVyA9IDA7Ci0KKwkJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKSB7CisJCQkvKiBOb3RlLCB0aGlzIGlzIHRvIHBhdGNoIERJUi0xMzUzIEFQLiBXaGVuIHRoZSBBUCBzZXQgdG8gV2VwLCBpdCB3aWxsIHVzZSBsZWdhY3kgbW9kZS4gQnV0IEFQIHN0aWxsIGtlZXBzICovCisJCQkvKiBzZW5kaW5nIEJXX05vdGlmeSBBY3Rpb24gZnJhbWUsIGFuZCBjYXVzZSB1cyB0byBsaW5rdXAgYW5kIGxpbmtkb3duLiAqLworCQkJLyogSW4gbGVnYWN5IG1vZGUsIGRvbid0IG5lZWQgdG8gcGFyc2UgSFQgYWN0aW9uIGZyYW1lLiAqLworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQUNUSU9OIC1JZ25vcmUgSFQgTm90aWZ5IENoYW5uZWwgQlcgd2hlbiBsaW5rIGFzIGxlZ2FjeSBtb2RlLiBCVyA9ICVkLS0tPiBcbiIsCisJCQkJICBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIDJdKSk7CiAJCQlicmVhazsKLQkJY2FzZSBTTVBTX0FDVElPTjoKLQkJCS8vIDcuMy4xLjI1Ci0gCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSBTTVBTIGFjdGlvbi0tLS0+IFxuIikpOwotCQkJaWYgKCgoRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl0mMHgxKSA9PSAwKSkKLQkJCXsKLQkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLk1tcHNNb2RlID0gTU1QU19FTkFCTEU7Ci0JCQl9Ci0JCQllbHNlIGlmICgoKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdJjB4MikgPT0gMCkpCi0JCQl7Ci0JCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5NbXBzTW9kZSA9IE1NUFNfU1RBVElDOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uTW1wc01vZGUgPSBNTVBTX0RZTkFNSUM7Ci0JCQl9CisJCX0KIAotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBaWQoJWQpIE1JTU8gUFMgPSAlZFxuIiwgRWxlbS0+V2NpZCwgcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5NbXBzTW9kZSkpOwotCQkJLy8gcnQyODYwYyA6IGFkZCBzb21ldGhpbmcgZm9yIHNtcHMgY2hhbmdlLgotCQkJYnJlYWs7CisJCWlmIChFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIDJdID09IDApCS8qIDcuNC44LjIuIGlmIHZhbHVlIGlzIDEsIGtlZXAgdGhlIHNhbWUgYXMgc3VwcG9ydGVkIGNoYW5uZWwgYmFuZHdpZHRoLiAqLworCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5IVFBoeU1vZGUuZmllbGQuQlcgPSAwOwogCi0JCWNhc2UgU0VUUENPX0FDVElPTjoKLQkJCWJyZWFrOwotCQljYXNlIE1JTU9fQ0hBX01FQVNVUkVfQUNUSU9OOgotCQkJYnJlYWs7Ci0JCWNhc2UgSFRfSU5GT19FWENIQU5HRToKLQkJCXsKLQkJCQlIVF9JTkZPUk1BVElPTl9PQ1RFVAkqcEhUX2luZm87CisJCWJyZWFrOworCWNhc2UgU01QU19BQ1RJT046CisJCS8qIDcuMy4xLjI1ICovCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFDVElPTiAtIFNNUFMgYWN0aW9uLS0tLT4gXG4iKSk7CisJCWlmICgoKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgMl0gJiAweDEpID09IDApKSB7CisJCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLk1tcHNNb2RlID0gTU1QU19FTkFCTEU7CisJCX0gZWxzZSBpZiAoKChFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIDJdICYgMHgyKSA9PSAwKSkgeworCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5NbXBzTW9kZSA9IE1NUFNfU1RBVElDOworCQl9IGVsc2UgeworCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5NbXBzTW9kZSA9IE1NUFNfRFlOQU1JQzsKKwkJfQogCi0JCQkJcEhUX2luZm8gPSAoSFRfSU5GT1JNQVRJT05fT0NURVQgKikgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdOwotICAgIAkJCQkvLyA3LjQuOC4xMAotICAgIAkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFDVElPTiAtIEhUIEluZm9ybWF0aW9uIEV4Y2hhbmdlIGFjdGlvbi0tLS0+IFxuIikpOwotICAgIAkJCQlpZiAocEhUX2luZm8tPlJlcXVlc3QpCi0gICAgCQkJCXsKLSAgICAJCQkJCXJlc3BvbmRfaHRfaW5mb3JtYXRpb25fZXhjaGFuZ2VfYWN0aW9uKHBBZCwgRWxlbSk7Ci0gICAgCQkJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJBaWQoJWQpIE1JTU8gUFMgPSAlZFxuIiwgRWxlbS0+V2NpZCwKKwkJCSAgcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5NbXBzTW9kZSkpOworCQkvKiBydDI4NjBjIDogYWRkIHNvbWV0aGluZyBmb3Igc21wcyBjaGFuZ2UuICovCisJCWJyZWFrOworCisJY2FzZSBTRVRQQ09fQUNUSU9OOgorCQlicmVhazsKKwljYXNlIE1JTU9fQ0hBX01FQVNVUkVfQUNUSU9OOgorCQlicmVhazsKKwljYXNlIEhUX0lORk9fRVhDSEFOR0U6CisJCXsKKwkJCXN0cnVjdCBydF9odF9pbmZvcm1hdGlvbl9vY3RldCAqcEhUX2luZm87CisKKwkJCXBIVF9pbmZvID0KKwkJCSAgICAoc3RydWN0IHJ0X2h0X2luZm9ybWF0aW9uX29jdGV0ICopICYgRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKworCQkJCQkJCQkgMl07CisJCQkvKiA3LjQuOC4xMCAqLworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQUNUSU9OIC0gSFQgSW5mb3JtYXRpb24gRXhjaGFuZ2UgYWN0aW9uLS0tLT4gXG4iKSk7CisJCQlpZiAocEhUX2luZm8tPlJlcXVlc3QpIHsKKwkJCQlyZXNwb25kX2h0X2luZm9ybWF0aW9uX2V4Y2hhbmdlX2FjdGlvbihwQWQsCisJCQkJCQkJCSAgICAgICBFbGVtKTsKIAkJCX0KLSAgICAJCQlicmVhazsKKwkJfQorCQlicmVhazsKIAl9CiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCURlc2NyaXB0aW9uOgpAQCAtNDU4LDEyMCArNDY3LDExNiBAQAogCQkJCUZBTFNFICwgdGhlbiBjb250aW51ZSBpbmRpY2F0ZXJ4IGF0IHRoaXMgbW9tZW50LgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgT1JJQkFUaW1lclRpbWVvdXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCit2b2lkIE9SSUJBVGltZXJUaW1lb3V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeTsKLQlJTlQJCQlpLCB0b3RhbDsKLQlVQ0hBUgkJCVRJRDsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnk7CisJaW50IGksIHRvdGFsOworCXU4IFRJRDsKIAogCXRvdGFsID0gcEFkLT5NYWNUYWIuU2l6ZSAqIE5VTV9PRl9USUQ7CiAKLQlmb3IgKGkgPSAxOyAoKGkgPE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFKSAmJiAodG90YWwgPiAwKSkgOyBpKyspCi0JewotCQlpZiAgKHBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2ldLk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKQotCQl7Ci0JCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXS5XY2lkXTsKKwlmb3IgKGkgPSAxOyAoKGkgPCBNQVhfTEVOX09GX0JBX09SSV9UQUJMRSkgJiYgKHRvdGFsID4gMCkpOyBpKyspIHsKKwkJaWYgKHBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2ldLk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKSB7CisJCQlwRW50cnkgPQorCQkJICAgICZwQWQtPk1hY1RhYi5Db250ZW50W3BBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2ldLgorCQkJCQkJIFdjaWRdOwogCQkJVElEID0gcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaV0uVElEOwogCi0JCQlBU1NFUlQocEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaV0uV2NpZCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKTsKKwkJCUFTU0VSVChwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXS5XY2lkIDwKKwkJCSAgICAgICBNQVhfTEVOX09GX01BQ19UQUJMRSk7CiAJCX0KLQkJdG90YWwgLS07CisJCXRvdGFsLS07CiAJfQogfQogCi0KLVZPSUQgU2VuZFJlZnJlc2hCQVIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnkpCit2b2lkIFNlbmRSZWZyZXNoQkFSKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5KQogewotCUZSQU1FX0JBUgkJRnJhbWVCYXI7Ci0JVUxPTkcJCQlGcmFtZUxlbjsKLQlORElTX1NUQVRVUyAJTlN0YXR1czsKLQlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKLQlVU0hPUlQJCQlTZXF1ZW5jZTsKLQlVQ0hBUgkJCWksIFRJRDsKLQlVU0hPUlQJCQlpZHg7Ci0JQkFfT1JJX0VOVFJZCSpwQkFFbnRyeTsKKwlzdHJ1Y3QgcnRfZnJhbWVfYmFyIEZyYW1lQmFyOworCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW47CisJaW50IE5TdGF0dXM7CisJdTggKnBPdXRCdWZmZXIgPSBOVUxMOworCXUxNiBTZXF1ZW5jZTsKKwl1OCBpLCBUSUQ7CisJdTE2IGlkeDsKKwlzdHJ1Y3QgcnRfYmFfb3JpX2VudHJ5ICpwQkFFbnRyeTsKIAotCWZvciAoaSA9IDA7IGkgPE5VTV9PRl9USUQ7IGkrKykKLQl7CisJZm9yIChpID0gMDsgaSA8IE5VTV9PRl9USUQ7IGkrKykgewogCQlpZHggPSBwRW50cnktPkJBT3JpV2NpZEFycmF5W2ldOwotCQlpZiAoaWR4ID09IDApCi0JCXsKKwkJaWYgKGlkeCA9PSAwKSB7CiAJCQljb250aW51ZTsKIAkJfQogCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpZHhdOwogCi0JCWlmICAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKQotCQl7CisJCWlmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX0RvbmUpIHsKIAkJCVRJRCA9IHBCQUVudHJ5LT5USUQ7CiAKIAkJCUFTU0VSVChwQkFFbnRyeS0+V2NpZCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKTsKIAotCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQkJCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkJBIC0gTWxtZUFEREJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CS8qR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkgKi8KKwkJCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJICgiQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOwogCQkJCXJldHVybjsKIAkJCX0KIAogCQkJU2VxdWVuY2UgPSBwRW50cnktPlR4U2VxW1RJRF07CiAKLQkJCUJhckhlYWRlckluaXQocEFkLCAmRnJhbWVCYXIsIHBFbnRyeS0+QWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJCQlCYXJIZWFkZXJJbml0KHBBZCwgJkZyYW1lQmFyLCBwRW50cnktPkFkZHIsCisJCQkJICAgICAgcEFkLT5DdXJyZW50QWRkcmVzcyk7CiAKLQkJCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLkZyYWdOdW0gPSAwOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jdGlvbi4KLQkJCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxID0gU2VxdWVuY2U7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgotCQkJRnJhbWVCYXIuQmFyQ29udHJvbC5USUQgPSBUSUQ7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgorCQkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuRnJhZ051bSA9IDA7CS8qIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmN0aW9uLiAqLworCQkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgPSBTZXF1ZW5jZTsJLyogbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uICovCisJCQlGcmFtZUJhci5CYXJDb250cm9sLlRJRCA9IFRJRDsJLyogbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uICovCiAKLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKLQkJCQkJCQkgIHNpemVvZihGUkFNRV9CQVIpLAkgICZGcmFtZUJhciwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2JhciksICZGcmFtZUJhciwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkvKmlmICghKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQpKSkgKi8KKwkJCWlmICgxKQkvKiBOb3cgd2UgYWx3YXlzIHNlbmQgQkFSLiAqLworCQkJeworCQkJCS8qTWluaXBvcnRNTVJlcXVlc3RVbmxvY2socEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7ICovCisJCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLAorCQkJCQkJICAoTUdNVF9VU0VfUVVFVUVfRkxBRyB8CisJCQkJCQkgICBNYXBVc2VyUHJpb3JpdHlUb0FjY2Vzc0NhdGVnb3J5CisJCQkJCQkgICBbVElEXSksIHBPdXRCdWZmZXIsCisJCQkJCQkgIEZyYW1lTGVuKTsKIAotCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQorCQkJfQogCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKIAkJfQogCX0KIH0KIAotVk9JRCBBY3RIZWFkZXJJbml0KAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAotICAgIElOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCi0gICAgSU4gUFVDSEFSIEFkZHIxLAotICAgIElOIFBVQ0hBUiBBZGRyMiwKLSAgICBJTiBQVUNIQVIgQWRkcjMpCit2b2lkIEFjdEhlYWRlckluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICBzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBIZHI4MDIxMSwKKwkJICAgdTggKkFkZHIxLCB1OCAqQWRkcjIsIHU4ICpBZGRyMykKIHsKLSAgICBOZGlzWmVyb01lbW9yeShwSGRyODAyMTEsIHNpemVvZihIRUFERVJfODAyXzExKSk7Ci0gICAgcEhkcjgwMjExLT5GQy5UeXBlID0gQlRZUEVfTUdNVDsKLSAgICBwSGRyODAyMTEtPkZDLlN1YlR5cGUgPSBTVUJUWVBFX0FDVElPTjsKKwlOZGlzWmVyb01lbW9yeShwSGRyODAyMTEsIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSkpOworCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX01HTVQ7CisJcEhkcjgwMjExLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9BQ1RJT047CiAKLSAgICBDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjEsIEFkZHIxKTsKKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjEsIEFkZHIxKTsKIAlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjIsIEFkZHIyKTsKLSAgICBDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIEFkZHIzKTsKKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIEFkZHIzKTsKIH0KIAotVk9JRCBCYXJIZWFkZXJJbml0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOIE9VVCBQRlJBTUVfQkFSIHBDbnRsQmFyLAotCUlOIFBVQ0hBUiBwREEsCi0JSU4gUFVDSEFSIHBTQSkKK3ZvaWQgQmFySGVhZGVySW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgIHN0cnVjdCBydF9mcmFtZV9iYXIgKiBwQ250bEJhciwgdTggKnBEQSwgdTggKnBTQSkKIHsKLQlOZGlzWmVyb01lbW9yeShwQ250bEJhciwgc2l6ZW9mKEZSQU1FX0JBUikpOworCU5kaXNaZXJvTWVtb3J5KHBDbnRsQmFyLCBzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2JhcikpOwogCXBDbnRsQmFyLT5GQy5UeXBlID0gQlRZUEVfQ05UTDsKIAlwQ250bEJhci0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfQkxPQ0tfQUNLX1JFUTsKLSAgIAlwQ250bEJhci0+QmFyQ29udHJvbC5NVElEID0gMDsKKwlwQ250bEJhci0+QmFyQ29udHJvbC5NVElEID0gMDsKIAlwQ250bEJhci0+QmFyQ29udHJvbC5Db21wcmVzc2VkID0gMTsKIAlwQ250bEJhci0+QmFyQ29udHJvbC5BQ0tQb2xpY3kgPSAwOwogCi0KLQlwQ250bEJhci0+RHVyYXRpb24gPSAxNiArIFJUTVBDYWxjRHVyYXRpb24ocEFkLCBSQVRFXzEsIHNpemVvZihGUkFNRV9CQSkpOworCXBDbnRsQmFyLT5EdXJhdGlvbiA9CisJICAgIDE2ICsgUlRNUENhbGNEdXJhdGlvbihwQWQsIFJBVEVfMSwgc2l6ZW9mKHN0cnVjdCBydF9mcmFtZV9iYSkpOwogCiAJQ09QWV9NQUNfQUREUihwQ250bEJhci0+QWRkcjEsIHBEQSk7CiAJQ09QWV9NQUNfQUREUihwQ250bEJhci0+QWRkcjIsIHBTQSk7CiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCURlc2NyaXB0aW9uOgpAQCAtNTg2LDE5ICs1OTEsMTQgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgSW5zZXJ0QWN0RmllbGQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCi0JT1VUIFBVTE9ORyBwRnJhbWVMZW4sCi0JSU4gVUlOVDggQ2F0ZWdvcnksCi0JSU4gVUlOVDggQWN0Q29kZSkKK3ZvaWQgSW5zZXJ0QWN0RmllbGQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgdTggKnBGcmFtZUJ1ZiwKKwkJICAgIHVuc2lnbmVkIGxvbmcgKnBGcmFtZUxlbiwgdTggQ2F0ZWdvcnksIHU4IEFjdENvZGUpCiB7Ci0JVUxPTkcgVGVtcExlbjsKKwl1bnNpZ25lZCBsb25nIFRlbXBMZW47CiAKLQlNYWtlT3V0Z29pbmdGcmFtZSgJcEZyYW1lQnVmLAkJJlRlbXBMZW4sCi0JCQkJCQkxLAkJCQkmQ2F0ZWdvcnksCi0JCQkJCQkxLAkJCQkmQWN0Q29kZSwKLQkJCQkJCUVORF9PRl9BUkdTKTsKKwlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsICZUZW1wTGVuLAorCQkJICAxLCAmQ2F0ZWdvcnksIDEsICZBY3RDb2RlLCBFTkRfT0ZfQVJHUyk7CiAKIAkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2FjdGlvbi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vYWN0aW9uLmgKaW5kZXggY2ZjMmE1Zi4uOTc0ZjhiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vYWN0aW9uLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vYWN0aW9uLmgKQEAgLTM5LDIzICszOSwxOCBAQAogI2lmbmRlZglfX0FDVElPTl9IX18KICNkZWZpbmUJX19BQ1RJT05fSF9fCiAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfX0hUX0lORk9fT0NURVQKLXsKLQlVQ0hBUglSZXF1ZXN0OjE7Ci0JVUNIQVIJRm9ydHlfTUh6X0ludG9sZXJhbnQ6MTsKLQlVQ0hBUiAJU1RBX0NoYW5uZWxfV2lkdGg6MTsKLQlVQ0hBUglSZXNlcnZlZDo1OwotfSBIVF9JTkZPUk1BVElPTl9PQ1RFVDsKK3N0cnVjdCBQQUNLRUQgcnRfaHRfaW5mb3JtYXRpb25fb2N0ZXQgeworCXU4IFJlcXVlc3Q6MTsKKwl1OCBGb3J0eV9NSHpfSW50b2xlcmFudDoxOworCXU4IFNUQV9DaGFubmVsX1dpZHRoOjE7CisJdTggUmVzZXJ2ZWQ6NTsKK307CiAKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9fRlJBTUVfSFRfSU5GTwotewotCUhFQURFUl84MDJfMTEgICAJCUhkcjsKLQlVQ0hBUgkJCQkJQ2F0ZWdvcnk7Ci0JVUNIQVIJCQkJCUFjdGlvbjsKLQlIVF9JTkZPUk1BVElPTl9PQ1RFVAlIVF9JbmZvOwotfSAgIEZSQU1FX0hUX0lORk8sICpQRlJBTUVfSFRfSU5GTzsKK3N0cnVjdCBQQUNLRUQgcnRfZnJhbWVfaHRfaW5mbyB7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgSGRyOworCXU4IENhdGVnb3J5OworCXU4IEFjdGlvbjsKKwlzdHJ1Y3QgcnRfaHRfaW5mb3JtYXRpb25fb2N0ZXQgSFRfSW5mbzsKK307CiAKICNlbmRpZiAvKiBfX0FDVElPTl9IX18gKi8KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9iYV9hY3Rpb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2JhX2FjdGlvbi5jCmluZGV4IGI3YmJlOTkuLjE3NGYyYTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9iYV9hY3Rpb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9iYV9hY3Rpb24uYwpAQCAtMjcsNDIgKzI3LDMzIEBACiAKICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKIAotCi0KLSNkZWZpbmUgQkFfT1JJX0lOSVRfU0VRCQkocEVudHJ5LT5UeFNlcVtUSURdKSAvLzEJCQkvLyBpbml0YWwgc2VxdWVuY2UgbnVtYmVyIG9mIEJBIHNlc3Npb24KKyNkZWZpbmUgQkFfT1JJX0lOSVRfU0VRCQkocEVudHJ5LT5UeFNlcVtUSURdKQkvKjEgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbml0YWwgc2VxdWVuY2UgbnVtYmVyIG9mIEJBIHNlc3Npb24gKi8KIAogI2RlZmluZSBPUklfU0VTU0lPTl9NQVhfUkVUUlkJOAotI2RlZmluZSBPUklfQkFfU0VTU0lPTl9USU1FT1VUCSgyMDAwKQkvLyBtcwotI2RlZmluZSBSRUNfQkFfU0VTU0lPTl9JRExFX1RJTUVPVVQJKDEwMDApCS8vIG1zCisjZGVmaW5lIE9SSV9CQV9TRVNTSU9OX1RJTUVPVVQJKDIwMDApCS8qIG1zICovCisjZGVmaW5lIFJFQ19CQV9TRVNTSU9OX0lETEVfVElNRU9VVAkoMTAwMCkJLyogbXMgKi8KIAotI2RlZmluZSBSRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUCQkoKDEwMCAqIEhaKS8xMDAwKQkvLyBzeXN0ZW0gdGlja3MgLS0gMTAwIG1zCi0jZGVmaW5lIE1BWF9SRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUCSgoMzAwMCAqIEhaKS8xMDAwKQkvLyBzeXN0ZW0gdGlja3MgLS0gMTAwIG1zCisjZGVmaW5lIFJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQJCSgoMTAwICogT1NfSFopLzEwMDApCS8qIHN5c3RlbSB0aWNrcyAtLSAxMDAgbXMgKi8KKyNkZWZpbmUgTUFYX1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQJKCgzMDAwICogT1NfSFopLzEwMDApCS8qIHN5c3RlbSB0aWNrcyAtLSAxMDAgbXMgKi8KIAogI2RlZmluZSBSRVNFVF9SQ1ZfU0VRCQkoMHhGRkZGKQogCi1zdGF0aWMgdm9pZCBiYV9tcGR1X2Jsa19mcmVlKFBSVE1QX0FEQVBURVIgcEFkLCBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2Jsayk7CitzdGF0aWMgdm9pZCBiYV9tcGR1X2Jsa19mcmVlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGspOwogCitzdHJ1Y3QgcnRfYmFfb3JpX2VudHJ5ICpCQVRhYmxlQWxsb2NPcmlFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHUxNiAqIElkeCk7CiAKLUJBX09SSV9FTlRSWSAqQkFUYWJsZUFsbG9jT3JpRW50cnkoCi0JCQkJCQkJCSAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JCQkJCQkJCSAgT1VUIFVTSE9SVCAgICAgICAgICAqSWR4KTsKK3N0cnVjdCBydF9iYV9yZWNfZW50cnkgKkJBVGFibGVBbGxvY1JlY0VudHJ5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTE2ICogSWR4KTsKIAotQkFfUkVDX0VOVFJZICpCQVRhYmxlQWxsb2NSZWNFbnRyeSgKLQkJCQkJCQkJICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQkJCQkJCQkJICBPVVQgVVNIT1JUICAgICAgICAgICpJZHgpOwordm9pZCBCQU9yaVNlc3Npb25TZXR1cFRpbWVvdXQodm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkJICAgICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkJICAgICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLAorCQkJICAgICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKTsKIAotVk9JRCBCQU9yaVNlc3Npb25TZXR1cFRpbWVvdXQoCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotVk9JRCBCQVJlY1Nlc3Npb25JZGxlVGltZW91dCgKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0gICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCit2b2lkIEJBUmVjU2Vzc2lvbklkbGVUaW1lb3V0KHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJCSAgICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkJICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsCisJCQkgICAgIHZvaWQgKlN5c3RlbVNwZWNpZmljMyk7CiAKIEJVSUxEX1RJTUVSX0ZVTkNUSU9OKEJBT3JpU2Vzc2lvblNldHVwVGltZW91dCk7CiBCVUlMRF9USU1FUl9GVU5DVElPTihCQVJlY1Nlc3Npb25JZGxlVGltZW91dCk7CkBAIC03MCw5MSArNjEsNzggQEAKICNkZWZpbmUgQU5OT1VOQ0VfUkVPUkRFUklOR19QQUNLRVQoX3BBZCwgX21wZHVfYmxrKQlcCiAJCQlBbm5vdW5jZV9SZW9yZGVyaW5nX1BhY2tldChfcEFkLCBfbXBkdV9ibGspOwogCi1WT0lEIEJBX01heFdpblNpemVSZWFzaWduKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeVBlZXIsCi0JT1VUIFVDSEFSCQkJKnBXaW5TaXplKQordm9pZCBCQV9NYXhXaW5TaXplUmVhc2lnbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeVBlZXIsIHU4ICogcFdpblNpemUpCiB7Ci0JVUNIQVIgTWF4U2l6ZTsKKwl1OCBNYXhTaXplOwogCi0KLQlpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgzX1ZFUlNJT04pIC8vIDMqMworCWlmIChwQWQtPk1BQ1ZlcnNpb24gPj0gUkFMSU5LXzI4ODNfVkVSU0lPTikJLyogMyozICovCiAJewotCQlpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18zMDcwX1ZFUlNJT04pCi0JCXsKLQkJCWlmIChwRW50cnlQZWVyLT5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkKLQkJCQlNYXhTaXplID0gNzsgLy8gZm9yIG5vbi1vcGVuIG1vZGUKKwkJaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMzA3MF9WRVJTSU9OKSB7CisJCQlpZiAocEVudHJ5UGVlci0+V2VwU3RhdHVzICE9CisJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkKKwkJCQlNYXhTaXplID0gNzsJLyogZm9yIG5vbi1vcGVuIG1vZGUgKi8KIAkJCWVsc2UKIAkJCQlNYXhTaXplID0gMTM7Ci0JCX0KLQkJZWxzZQorCQl9IGVsc2UKIAkJCU1heFNpemUgPSAzMTsKLQl9Ci0JZWxzZSBpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgwRV9WRVJTSU9OKSAvLyAyODgwIGUKKwl9IGVsc2UgaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMjg4MEVfVkVSU0lPTikJLyogMjg4MCBlICovCiAJewogCQlpZiAocEVudHJ5UGVlci0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpCi0JCQlNYXhTaXplID0gNzsgLy8gZm9yIG5vbi1vcGVuIG1vZGUKKwkJCU1heFNpemUgPSA3OwkvKiBmb3Igbm9uLW9wZW4gbW9kZSAqLwogCQllbHNlCiAJCQlNYXhTaXplID0gMTM7Ci0JfQotCWVsc2UKKwl9IGVsc2UKIAkJTWF4U2l6ZSA9IDc7CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJiYT4gV2luIFNpemUgPSAlZCwgTWF4IFNpemUgPSAlZFxuIiwKLQkJCSpwV2luU2l6ZSwgTWF4U2l6ZSkpOworCQkJCSAgKnBXaW5TaXplLCBNYXhTaXplKSk7CiAKLQlpZiAoKCpwV2luU2l6ZSkgPiBNYXhTaXplKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiYmE+IHJlYXNzaWduIG1heCB3aW4gc2l6ZSBmcm9tICVkIHRvICVkXG4iLAotCQkJCSpwV2luU2l6ZSwgTWF4U2l6ZSkpOworCWlmICgoKnBXaW5TaXplKSA+IE1heFNpemUpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJiYT4gcmVhc3NpZ24gbWF4IHdpbiBzaXplIGZyb20gJWQgdG8gJWRcbiIsCisJCQkgICpwV2luU2l6ZSwgTWF4U2l6ZSkpOwogCiAJCSpwV2luU2l6ZSA9IE1heFNpemU7CiAJfQogfQogCi12b2lkIEFubm91bmNlX1Jlb3JkZXJpbmdfUGFja2V0KElOIFBSVE1QX0FEQVBURVIJCQlwQWQsCi0JCQkJCQkJCUlOIHN0cnVjdCByZW9yZGVyaW5nX21wZHUJKm1wZHUpCit2b2lkIEFubm91bmNlX1Jlb3JkZXJpbmdfUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQlJTiBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1KQogewotCVBORElTX1BBQ0tFVCAgICBwUGFja2V0OworCXZvaWQgKnBQYWNrZXQ7CiAKIAlwUGFja2V0ID0gbXBkdS0+cFBhY2tldDsKIAotCWlmIChtcGR1LT5iQU1TRFUpCi0JeworCWlmIChtcGR1LT5iQU1TRFUpIHsKIAkJQVNTRVJUKDApOwogCQlCQV9SZW9yZGVyX0FNU0RVX0Fubm5vdW5jZShwQWQsIHBQYWNrZXQpOwotCX0KLQllbHNlCi0JewotCQkvLwotCQkvLyBwYXNzIHRoaXMgODAyLjMgcGFja2V0IHRvIHVwcGVyIGxheWVyIG9yIGZvcndhcmQgdGhpcyBwYWNrZXQgdG8gV00gZGlyZWN0bHkKLQkJLy8KKwl9IGVsc2UgeworCQkvKiAqLworCQkvKiBwYXNzIHRoaXMgODAyLjMgcGFja2V0IHRvIHVwcGVyIGxheWVyIG9yIGZvcndhcmQgdGhpcyBwYWNrZXQgdG8gV00gZGlyZWN0bHkgKi8KKwkJLyogKi8KIAotCQlBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChwQWQsIHBQYWNrZXQsIFJUTVBfR0VUX1BBQ0tFVF9JRihwUGFja2V0KSk7CisJCUFOTk9VTkNFX09SX0ZPUldBUkRfODAyXzNfUEFDS0VUKHBBZCwgcFBhY2tldCwKKwkJCQkJCSBSVE1QX0dFVF9QQUNLRVRfSUYocFBhY2tldCkpOwogCX0KIH0KIAogLyoKICAqIEluc2VydCBhIHJlb3JkZXJpbmcgbXBkdSBpbnRvIHNvcnRlZCBsaW5rZWQgbGlzdCBieSBzZXF1ZW5jZSBuby4KICAqLwotQk9PTEVBTiBiYV9yZW9yZGVyaW5nX21wZHVfaW5zZXJ0c29ydGVkKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QsIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHUpCitCT09MRUFOIGJhX3Jlb3JkZXJpbmdfbXBkdV9pbnNlcnRzb3J0ZWQoc3RydWN0IHJlb3JkZXJpbmdfbGlzdCAqbGlzdCwKKwkJCQkJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdSkKIHsKIAogCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKipwcFNjYW4gPSAmbGlzdC0+bmV4dDsKIAotCXdoaWxlICgqcHBTY2FuICE9IE5VTEwpCi0JewotCQlpZiAoU0VRX1NNQUxMRVIoKCpwcFNjYW4pLT5TZXF1ZW5jZSwgbXBkdS0+U2VxdWVuY2UsIE1BWFNFUSkpCi0JCXsKKwl3aGlsZSAoKnBwU2NhbiAhPSBOVUxMKSB7CisJCWlmIChTRVFfU01BTExFUigoKnBwU2NhbiktPlNlcXVlbmNlLCBtcGR1LT5TZXF1ZW5jZSwgTUFYU0VRKSkgewogCQkJcHBTY2FuID0gJigqcHBTY2FuKS0+bmV4dDsKLQkJfQotCQllbHNlIGlmICgoKnBwU2NhbiktPlNlcXVlbmNlID09IG1wZHUtPlNlcXVlbmNlKQotCQl7CisJCX0gZWxzZSBpZiAoKCpwcFNjYW4pLT5TZXF1ZW5jZSA9PSBtcGR1LT5TZXF1ZW5jZSkgewogCQkJLyogZ2l2ZSB1cCB0aGlzIGR1cGxpY2F0ZWQgZnJhbWUgKi8KLQkJCXJldHVybihGQUxTRSk7Ci0JCX0KLQkJZWxzZQotCQl7CisJCQlyZXR1cm4gKEZBTFNFKTsKKwkJfSBlbHNlIHsKIAkJCS8qIGZpbmQgcG9zaXRpb24gKi8KIAkJCWJyZWFrOwogCQl9CkBAIC0xNjYsMTEgKzE0NCwxMSBAQAogCXJldHVybiBUUlVFOwogfQogCi0KIC8qCiAgKiBjYWxsZXIgbG9jayBjcml0aWNhbCBzZWN0aW9uIGlmIG5lY2Vzc2FyeQogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYmFfZW5xdWV1ZShzdHJ1Y3QgcmVvcmRlcmluZ19saXN0ICpsaXN0LCBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsaykKK3N0YXRpYyBpbmxpbmUgdm9pZCBiYV9lbnF1ZXVlKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QsCisJCQkgICAgICBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsaykKIHsKIAlsaXN0LT5xbGVuKys7CiAJbXBkdV9ibGstPm5leHQgPSBsaXN0LT5uZXh0OwpAQCAtMTgwLDQ3ICsxNTgsNDYgQEAKIC8qCiAgKiBjYWxsZXIgbG9jayBjcml0aWNhbCBzZWN0aW9uIGlmIG5lY2Vzc2FyeQogICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKiBiYV9kZXF1ZXVlKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QpCitzdGF0aWMgaW5saW5lIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKmJhX2RlcXVldWUoc3RydWN0IHJlb3JkZXJpbmdfbGlzdCAqbGlzdCkKIHsKIAlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsayA9IE5VTEw7CiAKIAlBU1NFUlQobGlzdCk7CiAKLQkJaWYgKGxpc3QtPnFsZW4pCi0JCXsKLQkJCWxpc3QtPnFsZW4tLTsKLQkJCW1wZHVfYmxrID0gbGlzdC0+bmV4dDsKLQkJCWlmIChtcGR1X2JsaykKLQkJCXsKLQkJCQlsaXN0LT5uZXh0ID0gbXBkdV9ibGstPm5leHQ7Ci0JCQkJbXBkdV9ibGstPm5leHQgPSBOVUxMOwotCQkJfQorCWlmIChsaXN0LT5xbGVuKSB7CisJCWxpc3QtPnFsZW4tLTsKKwkJbXBkdV9ibGsgPSBsaXN0LT5uZXh0OworCQlpZiAobXBkdV9ibGspIHsKKwkJCWxpc3QtPm5leHQgPSBtcGR1X2Jsay0+bmV4dDsKKwkJCW1wZHVfYmxrLT5uZXh0ID0gTlVMTDsKIAkJfQorCX0KIAlyZXR1cm4gbXBkdV9ibGs7CiB9CiAKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICAqYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoc3RydWN0IHJlb3JkZXJpbmdfbGlzdCAqbGlzdCkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoc3RydWN0CisJCQkJCQkJCSByZW9yZGVyaW5nX2xpc3QKKwkJCQkJCQkJICpsaXN0KQogewotCXJldHVybihiYV9kZXF1ZXVlKGxpc3QpKTsKKwlyZXR1cm4gKGJhX2RlcXVldWUobGlzdCkpOwogfQogCi0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAgKmJhX3Jlb3JkZXJpbmdfbXBkdV9wcm9iZShzdHJ1Y3QgcmVvcmRlcmluZ19saXN0ICpsaXN0KQotCXsKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqYmFfcmVvcmRlcmluZ19tcGR1X3Byb2JlKHN0cnVjdAorCQkJCQkJCSAgICAgICByZW9yZGVyaW5nX2xpc3QKKwkJCQkJCQkgICAgICAgKmxpc3QpCit7CiAJQVNTRVJUKGxpc3QpOwogCi0JCXJldHVybihsaXN0LT5uZXh0KTsKLQl9Ci0KKwlyZXR1cm4gKGxpc3QtPm5leHQpOworfQogCiAvKgogICogZnJlZSBhbGwgcmVzb3VyY2UgZm9yIHJlb3JkZXJpbmcgbWVjaGFuaXNtCiAgKi8KLXZvaWQgYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKFBSVE1QX0FEQVBURVIgcEFkKQordm9pZCBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCUJBX1RBQkxFICAgICAgICAqVGFiOwotCVBCQV9SRUNfRU5UUlkgICBwQkFFbnRyeTsKKwlzdHJ1Y3QgcnRfYmFfdGFibGUgKlRhYjsKKwlzdHJ1Y3QgcnRfYmFfcmVjX2VudHJ5ICpwQkFFbnRyeTsKIAlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKIAlpbnQgaTsKIApAQCAtMjI4LDE1ICsyMDUsMTQgQEAKIAogCS8qIEkuICByZWxlYXNlIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgcGFja2V0ICovCiAJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRTsgaSsrKQotCXsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEU7IGkrKykgewogCQlwQkFFbnRyeSA9ICZUYWItPkJBUmVjRW50cnlbaV07Ci0JCWlmIChwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyAhPSBSZWNpcGllbnRfTk9ORSkKLQkJewotCQkJd2hpbGUgKChtcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9kZXF1ZXVlKCZwQkFFbnRyeS0+bGlzdCkpKQotCQkJeworCQlpZiAocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgIT0gUmVjaXBpZW50X05PTkUpIHsKKwkJCXdoaWxlICgobXBkdV9ibGsgPQorCQkJCWJhX3Jlb3JkZXJpbmdfbXBkdV9kZXF1ZXVlKCZwQkFFbnRyeS0+bGlzdCkpKSB7CiAJCQkJQVNTRVJUKG1wZHVfYmxrLT5wUGFja2V0KTsKLQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgbXBkdV9ibGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBtcGR1X2Jsay0+cFBhY2tldCwKKwkJCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKIAkJCQliYV9tcGR1X2Jsa19mcmVlKHBBZCwgbXBkdV9ibGspOwogCQkJfQogCQl9CkBAIC0yNTAsMTUgKzIyNiwxMyBAQAogCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKIH0KIAotCi0KIC8qCiAgKiBBbGxvY2F0ZSBhbGwgcmVzb3VyY2UgZm9yIHJlb3JkZXJpbmcgbWVjaGFuaXNtCiAgKi8KLUJPT0xFQU4gYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9pbml0KFBSVE1QX0FEQVBURVIgcEFkLCBpbnQgbnVtKQorQk9PTEVBTiBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX2luaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBpbnQgbnVtKQogewotCWludCAgICAgaTsKLQlQVUNIQVIgIG1lbTsKKwlpbnQgaTsKKwl1OCAqbWVtOwogCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOwogCXN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmZyZWVsaXN0OwogCkBAIC0yNzAsMjQgKzI0NCwyNiBAQAogCWZyZWVsaXN0LT5uZXh0ID0gTlVMTDsKIAlmcmVlbGlzdC0+cWxlbiA9IDA7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBbGxvY2F0ZSAlZCBtZW1vcnkgZm9yIEJBIHJlb3JkZXJpbmdcbiIsIChVSU5UMzIpKG51bSpzaXplb2Yoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSkpKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkFsbG9jYXRlICVkIG1lbW9yeSBmb3IgQkEgcmVvcmRlcmluZ1xuIiwKKwkJICAodTMyKShudW0gKiBzaXplb2Yoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSkpKSk7CiAKIAkvKiBhbGxvY2F0ZSBudW1iZXIgb2YgbXBkdV9ibGsgbWVtb3J5ICovCi0Jb3NfYWxsb2NfbWVtKHBBZCwgKFBVQ0hBUiAqKSZtZW0sIChudW0qc2l6ZW9mKHN0cnVjdCByZW9yZGVyaW5nX21wZHUpKSk7CisJb3NfYWxsb2NfbWVtKHBBZCwgKHU4ICoqKSAmIG1lbSwKKwkJICAgICAobnVtICogc2l6ZW9mKHN0cnVjdCByZW9yZGVyaW5nX21wZHUpKSk7CiAKIAlwQWQtPm1wZHVfYmxrX3Bvb2wubWVtID0gbWVtOwogCi0JaWYgKG1lbSA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQ2FuJ3QgQWxsb2NhdGUgTWVtb3J5IGZvciBCQSBSZW9yZGVyaW5nXG4iKSk7Ci0JCXJldHVybihGQUxTRSk7CisJaWYgKG1lbSA9PSBOVUxMKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiQ2FuJ3QgQWxsb2NhdGUgTWVtb3J5IGZvciBCQSBSZW9yZGVyaW5nXG4iKSk7CisJCXJldHVybiAoRkFMU0UpOwogCX0KIAogCS8qIGJ1aWxkIG1wZHVfYmxrIGZyZWUgbGlzdCAqLwotCWZvciAoaT0wOyBpPG51bTsgaSsrKQotCXsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKIAkJLyogZ2V0IG1wZHVfYmxrICovCi0JCW1wZHVfYmxrID0gKHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKikgbWVtOworCQltcGR1X2JsayA9IChzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICopbWVtOwogCQkvKiBpbml0aWFsIG1wZHVfYmxrICovCiAJCU5kaXNaZXJvTWVtb3J5KG1wZHVfYmxrLCBzaXplb2Yoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSkpOwogCQkvKiBuZXh0IG1wZHVfYmxrICovCkBAIC0yOTYsMjAgKzI3MiwxOSBAQAogCQliYV9lbnF1ZXVlKGZyZWVsaXN0LCBtcGR1X2Jsayk7CiAJfQogCi0JcmV0dXJuKFRSVUUpOworCXJldHVybiAoVFJVRSk7CiB9CiAKLS8vc3RhdGljIGludCBibGtfY291bnQ9MDsgLy8gc2FtcGxlIHRha2Ugb2ZmLCBubyB1c2UKKy8qc3RhdGljIGludCBibGtfY291bnQ9MDsgLy8gc2FtcGxlIHRha2Ugb2ZmLCBubyB1c2UgKi8KIAotc3RhdGljIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKmJhX21wZHVfYmxrX2FsbG9jKFBSVE1QX0FEQVBURVIgcEFkKQorc3RhdGljIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKmJhX21wZHVfYmxrX2FsbG9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKIAlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKIAogCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKIAltcGR1X2JsayA9IGJhX2RlcXVldWUoJnBBZC0+bXBkdV9ibGtfcG9vbC5mcmVlbGlzdCk7Ci0JaWYgKG1wZHVfYmxrKQotCXsKLS8vCQlibGtfY291bnQrKzsKKwlpZiAobXBkdV9ibGspIHsKKy8qICAgICAgICAgICAgICBibGtfY291bnQrKzsgKi8KIAkJLyogcmVzZXQgbXBkdV9ibGsgKi8KIAkJTmRpc1plcm9NZW1vcnkobXBkdV9ibGssIHNpemVvZihzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1KSk7CiAJfQpAQCAtMzE3LDQzICsyOTIsNDAgQEAKIAlyZXR1cm4gbXBkdV9ibGs7CiB9CiAKLXN0YXRpYyB2b2lkIGJhX21wZHVfYmxrX2ZyZWUoUFJUTVBfQURBUFRFUiBwQWQsIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrKQorc3RhdGljIHZvaWQgYmFfbXBkdV9ibGtfZnJlZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrKQogewogCUFTU0VSVChtcGR1X2Jsayk7CiAKIAlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPm1wZHVfYmxrX3Bvb2wubG9jayk7Ci0vLwlibGtfY291bnQtLTsKKy8qICAgICAgYmxrX2NvdW50LS07ICovCiAJYmFfZW5xdWV1ZSgmcEFkLT5tcGR1X2Jsa19wb29sLmZyZWVsaXN0LCBtcGR1X2Jsayk7CiAJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOwogfQogCi0KLXN0YXRpYyBVU0hPUlQgYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19pbl9vcmRlcigKLQkJCQkJCQkJCQkJCSAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCQkJCQkJCQkJCQkJICAgSU4gUEJBX1JFQ19FTlRSWSAgICBwQkFFbnRyeSwKLQkJCQkJCQkJCQkJCSAgIElOIFVTSE9SVCAgICAgICAgICAgU3RhcnRTZXEpCitzdGF0aWMgdTE2IGJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfaW5fb3JkZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkJICAgIHN0cnVjdCBydF9iYV9yZWNfZW50cnkgKnBCQUVudHJ5LAorCQkJCQkJICAgIHUxNiBTdGFydFNlcSkKIHsKIAlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKLQlVU0hPUlQgIExhc3RJbmRTZXEgPSBSRVNFVF9SQ1ZfU0VROworCXUxNiBMYXN0SW5kU2VxID0gUkVTRVRfUkNWX1NFUTsKIAogCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOwogCi0Jd2hpbGUgKChtcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9wcm9iZSgmcEJBRW50cnktPmxpc3QpKSkKLQkJewotCQkJLyogZmluZCBpbi1vcmRlciBmcmFtZSAqLwotCQlpZiAoIVNFUV9TVEVQT05FKG1wZHVfYmxrLT5TZXF1ZW5jZSwgU3RhcnRTZXEsIE1BWFNFUSkpCi0JCQl7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvKiBkZXF1ZXVlIGluLW9yZGVyIGZyYW1lIGZyb20gcmVvZGVyaW5nIGxpc3QgKi8KLQkJCW1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoJnBCQUVudHJ5LT5saXN0KTsKLQkJCS8qIHBhc3MgdGhpcyBmcmFtZSB1cCAqLworCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfcHJvYmUoJnBCQUVudHJ5LT5saXN0KSkpIHsKKwkJLyogZmluZCBpbi1vcmRlciBmcmFtZSAqLworCQlpZiAoIVNFUV9TVEVQT05FKG1wZHVfYmxrLT5TZXF1ZW5jZSwgU3RhcnRTZXEsIE1BWFNFUSkpIHsKKwkJCWJyZWFrOworCQl9CisJCS8qIGRlcXVldWUgaW4tb3JkZXIgZnJhbWUgZnJvbSByZW9kZXJpbmcgbGlzdCAqLworCQltcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9kZXF1ZXVlKCZwQkFFbnRyeS0+bGlzdCk7CisJCS8qIHBhc3MgdGhpcyBmcmFtZSB1cCAqLwogCQlBTk5PVU5DRV9SRU9SREVSSU5HX1BBQ0tFVChwQWQsIG1wZHVfYmxrKTsKIAkJLyogbW92ZSB0byBuZXh0IHNlcXVlbmNlICovCi0JCQlTdGFydFNlcSA9IG1wZHVfYmxrLT5TZXF1ZW5jZTsKKwkJU3RhcnRTZXEgPSBtcGR1X2Jsay0+U2VxdWVuY2U7CiAJCUxhc3RJbmRTZXEgPSBTdGFydFNlcTsKIAkJLyogZnJlZSBtcGR1X2JsayAqLwotCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKKwkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKIAl9CiAKIAlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKQEAgLTM2Miw1MSArMzM0LDQ0IEBACiAJcmV0dXJuIExhc3RJbmRTZXE7CiB9CiAKLXN0YXRpYyB2b2lkIGJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfbGVfc2VxKAotCQkJCQkJCQkJCQkgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQkJCQkJCQkJCQkJICAgSU4gUEJBX1JFQ19FTlRSWSAgICBwQkFFbnRyeSwKLQkJCQkJCQkJCQkJICAgSU4gVVNIT1JUICAgICAgICAgICBTZXF1ZW5jZSkKK3N0YXRpYyB2b2lkIGJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfbGVfc2VxKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJCXN0cnVjdCBydF9iYV9yZWNfZW50cnkgKnBCQUVudHJ5LAorCQkJCQkJdTE2IFNlcXVlbmNlKQogewogCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOwogCiAJTmRpc0FjcXVpcmVTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7Ci0Jd2hpbGUgKChtcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9wcm9iZSgmcEJBRW50cnktPmxpc3QpKSkKLQkJewotCQkJLyogZmluZCBpbi1vcmRlciBmcmFtZSAqLwotCQlpZiAoKG1wZHVfYmxrLT5TZXF1ZW5jZSA9PSBTZXF1ZW5jZSkgfHwgU0VRX1NNQUxMRVIobXBkdV9ibGstPlNlcXVlbmNlLCBTZXF1ZW5jZSwgTUFYU0VRKSkKLQkJeworCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfcHJvYmUoJnBCQUVudHJ5LT5saXN0KSkpIHsKKwkJLyogZmluZCBpbi1vcmRlciBmcmFtZSAqLworCQlpZiAoKG1wZHVfYmxrLT5TZXF1ZW5jZSA9PSBTZXF1ZW5jZSkKKwkJICAgIHx8IFNFUV9TTUFMTEVSKG1wZHVfYmxrLT5TZXF1ZW5jZSwgU2VxdWVuY2UsIE1BWFNFUSkpIHsKIAkJCS8qIGRlcXVldWUgaW4tb3JkZXIgZnJhbWUgZnJvbSByZW9kZXJpbmcgbGlzdCAqLwogCQkJbXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfZGVxdWV1ZSgmcEJBRW50cnktPmxpc3QpOwogCQkJLyogcGFzcyB0aGlzIGZyYW1lIHVwICovCiAJCQlBTk5PVU5DRV9SRU9SREVSSU5HX1BBQ0tFVChwQWQsIG1wZHVfYmxrKTsKIAkJCS8qIGZyZWUgbXBkdV9ibGsgKi8KIAkJCWJhX21wZHVfYmxrX2ZyZWUocEFkLCBtcGR1X2Jsayk7CisJCX0gZWxzZSB7CisJCQlicmVhazsKIAkJfQotCQllbHNlCi0JCQl7Ci0JCQkJYnJlYWs7Ci0JCQl9CiAJfQogCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOwogfQogCi0KLXN0YXRpYyB2b2lkIGJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cygKLQkJCQkJCQkJCSAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCQkJCQkJCQkJICAgUEJBX1JFQ19FTlRSWSAgICAgICBwQkFFbnRyeSkKK3N0YXRpYyB2b2lkIGJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCXN0cnVjdCBydF9iYV9yZWNfZW50cnkgKnBCQUVudHJ5KQogewogCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOwogCiAJTmRpc0FjcXVpcmVTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CiAKLQkJCS8qIGRlcXVldWUgaW4tb3JkZXIgZnJhbWUgZnJvbSByZW9kZXJpbmcgbGlzdCAqLwotCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfZGVxdWV1ZSgmcEJBRW50cnktPmxpc3QpKSkKLQl7Ci0JCQkvKiBwYXNzIHRoaXMgZnJhbWUgdXAgKi8KKwkvKiBkZXF1ZXVlIGluLW9yZGVyIGZyYW1lIGZyb20gcmVvZGVyaW5nIGxpc3QgKi8KKwl3aGlsZSAoKG1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoJnBCQUVudHJ5LT5saXN0KSkpIHsKKwkJLyogcGFzcyB0aGlzIGZyYW1lIHVwICovCiAJCUFOTk9VTkNFX1JFT1JERVJJTkdfUEFDS0VUKHBBZCwgbXBkdV9ibGspOwogCiAJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gbXBkdV9ibGstPlNlcXVlbmNlOwotCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKKwkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKIAogCQkvKiB1cGRhdGUgbGFzdCBpbmRpY2F0ZWQgc2VxdWVuY2UgKi8KIAl9CkBAIC00MTUsMjQ4ICszODAsMjQwIEBACiAJTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CiB9CiAKLQotLy9zdGF0aWMKLXZvaWQgYmFfZmx1c2hfcmVvcmRlcmluZ190aW1lb3V0X21wZHVzKAotCQkJCQkJCQkJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JCQkJCQkJCQlJTiBQQkFfUkVDX0VOVFJZICAgIHBCQUVudHJ5LAotCQkJCQkJCQkJSU4gVUxPTkcgICAgICAgICAgICBOb3czMikKLQorLypzdGF0aWMgKi8KK3ZvaWQgYmFfZmx1c2hfcmVvcmRlcmluZ190aW1lb3V0X21wZHVzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgICAgc3RydWN0IHJ0X2JhX3JlY19lbnRyeSAqcEJBRW50cnksCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgTm93MzIpCiB7Ci0JVVNIT1JUIFNlcXVlbmNlOworCXUxNiBTZXF1ZW5jZTsKIAotLy8JaWYgKChSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpICYmCi0vLwkJIChwQkFFbnRyeS0+bGlzdC5xbGVuID4gKChwQkFFbnRyeS0+QkFXaW5TaXplKjcpLzgpKSkgLy98fAotLy8JCShSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrKDEwKlJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQpKSkgJiYKLS8vCQkgKHBCQUVudHJ5LT5saXN0LnFsZW4gPiAocEJBRW50cnktPkJBV2luU2l6ZS84KSkpCi0JaWYgKFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcisoTUFYX1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQvNikpKQotCQkgJiYocEJBRW50cnktPmxpc3QucWxlbiA+IDEpCi0JCSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgidGltZW91dFslZF0gKCUwOGx4LSUwOGx4ID0gJWQgPiAlZCk6ICV4LCBmbHVzaCBhbGwhXG4gIiwgcEJBRW50cnktPmxpc3QucWxlbiwgTm93MzIsIChwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIpLAotCQkJICAgKGludCkoKGxvbmcpIE5vdzMyIC0gKGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcikpLCBNQVhfUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCwKLQkJCSAgIHBCQUVudHJ5LT5MYXN0SW5kU2VxKSk7CisvKiAgICAgIGlmICgoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyK1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQpKSAmJiAqLworLyogICAgICAgICAgICAgICAocEJBRW50cnktPmxpc3QucWxlbiA+ICgocEJBRW50cnktPkJBV2luU2l6ZSo3KS84KSkpIC8vfHwgKi8KKy8qICAgICAgICAgICAgICAoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKygxMCpSRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUKSkpICYmICovCisvKiAgICAgICAgICAgICAgIChwQkFFbnRyeS0+bGlzdC5xbGVuID4gKHBCQUVudHJ5LT5CQVdpblNpemUvOCkpKSAqLworCWlmIChSVE1QX1RJTUVfQUZURVIKKwkgICAgKCh1bnNpZ25lZCBsb25nKU5vdzMyLAorCSAgICAgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciArCisJCQkgICAgIChNQVhfUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCAvIDYpKSkKKwkgICAgJiYgKHBCQUVudHJ5LT5saXN0LnFsZW4gPiAxKQorCSAgICApIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJ0aW1lb3V0WyVkXSAoJTA4bHgtJTA4bHggPSAlZCA+ICVkKTogJXgsIGZsdXNoIGFsbCFcbiAiLAorCQkJICBwQkFFbnRyeS0+bGlzdC5xbGVuLCBOb3czMiwKKwkJCSAgKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciksCisJCQkgIChpbnQpKChsb25nKU5vdzMyIC0KKwkJCQkobG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKSksCisJCQkgIE1BWF9SRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VULCBwQkFFbnRyeS0+TGFzdEluZFNlcSkpOwogCQliYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7CiAJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOwotCX0KLQllbHNlCi0JaWYgKFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcisoUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpKQorCX0gZWxzZQorCSAgICBpZiAoUlRNUF9USU1FX0FGVEVSCisJCSgodW5zaWduZWQgbG9uZylOb3czMiwKKwkJICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgKworCQkJCSAoUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpKQogCQkmJiAocEJBRW50cnktPmxpc3QucWxlbiA+IDApCi0JICAgKQotCQl7Ci0gICAgCQkvLwotCQkvLyBmb3JjZSBMYXN0SW5kU2VxIHRvIHNoaWZ0IHRvIExhc3RJbmRTZXErMQotICAgIAkJLy8KLSAgICAJCVNlcXVlbmNlID0gKHBCQUVudHJ5LT5MYXN0SW5kU2VxKzEpICYgTUFYU0VROwotICAgIAkJYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19sZV9zZXEocEFkLCBwQkFFbnRyeSwgU2VxdWVuY2UpOwotICAgIAkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7CisJICAgICkgeworCQkvKiAqLworCQkvKiBmb3JjZSBMYXN0SW5kU2VxIHRvIHNoaWZ0IHRvIExhc3RJbmRTZXErMSAqLworCQkvKiAqLworCQlTZXF1ZW5jZSA9IChwQkFFbnRyeS0+TGFzdEluZFNlcSArIDEpICYgTUFYU0VROworCQliYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcShwQWQsIHBCQUVudHJ5LCBTZXF1ZW5jZSk7CisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOworCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFNlcXVlbmNlOworCQkvKiAqLworCQkvKiBpbmRpY2F0ZSBpbi1vcmRlciBtcGR1cyAqLworCQkvKiAqLworCQlTZXF1ZW5jZSA9CisJCSAgICBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2luX29yZGVyKHBBZCwgcEJBRW50cnksCisJCQkJCQkJICBTZXF1ZW5jZSk7CisJCWlmIChTZXF1ZW5jZSAhPSBSRVNFVF9SQ1ZfU0VRKSB7CiAJCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFNlcXVlbmNlOwotICAgIAkJLy8KLSAgICAJCS8vIGluZGljYXRlIGluLW9yZGVyIG1wZHVzCi0gICAgCQkvLwotICAgIAkJU2VxdWVuY2UgPSBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2luX29yZGVyKHBBZCwgcEJBRW50cnksIFNlcXVlbmNlKTsKLSAgICAJCWlmIChTZXF1ZW5jZSAhPSBSRVNFVF9SQ1ZfU0VRKQotICAgIAkJewotICAgIAkJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gU2VxdWVuY2U7Ci0gICAgCQl9CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19PRkYsCisJCQkgKCIleCwgZmx1c2ggb25lIVxuIiwgcEJBRW50cnktPkxhc3RJbmRTZXEpKTsKIAogCX0KIH0KIAotCiAvKgogICogZ2VuZXJhdGUgQUREQkEgcmVxdWVzdCB0bwogICogc2V0IHVwIEJBIGFncmVlbWVudAogICovCi1WT0lEIEJBT3JpU2Vzc2lvblNldFVwKAotCQkJCQkgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCQkJCQkgIElOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKLQkJCQkJICBJTiBVQ0hBUiAgICAgICAgICAgIFRJRCwKLQkJCQkJICBJTiBVU0hPUlQgICAgICAgICAgIFRpbWVPdXQsCi0JCQkJCSAgSU4gVUxPTkcgICAgICAgICAgICBEZWxheVRpbWUsCi0JCQkJCSAgSU4gQk9PTEVBTiAgICAgICAgICBpc0ZvcmNlZCkKLQordm9pZCBCQU9yaVNlc3Npb25TZXRVcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksCisJCSAgICAgICB1OCBUSUQsCisJCSAgICAgICB1MTYgVGltZU91dCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgRGVsYXlUaW1lLCBJTiBCT09MRUFOIGlzRm9yY2VkKQogewotCS8vTUxNRV9BRERCQV9SRVFfU1RSVUNUCUFkZGJhUmVxOwotCUJBX09SSV9FTlRSWSAgICAgICAgICAgICpwQkFFbnRyeSA9IE5VTEw7Ci0JVVNIT1JUICAgICAgICAgICAgICAgICAgSWR4OwotCUJPT0xFQU4gICAgICAgICAgICAgICAgIENhbmNlbGxlZDsKKwkvKnN0cnVjdCBydF9tbG1lX2FkZGJhX3JlcSBBZGRiYVJlcTsgKi8KKwlzdHJ1Y3QgcnRfYmFfb3JpX2VudHJ5ICpwQkFFbnRyeSA9IE5VTEw7CisJdTE2IElkeDsKKwlCT09MRUFOIENhbmNlbGxlZDsKIAotCWlmICgocEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSAhPSBUUlVFKSAgJiYgIChpc0ZvcmNlZCA9PSBGQUxTRSkpCisJaWYgKChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBICE9IFRSVUUpCisJICAgICYmIChpc0ZvcmNlZCA9PSBGQUxTRSkpCiAJCXJldHVybjsKIAotCS8vIGlmIHRoaXMgZW50cnkgaXMgbGltaXRlZCB0byB1c2UgbGVnYWN5IHR4IG1vZGUsIGl0IGRvZXNuJ3QgZ2VuZXJhdGUgQkEuCisJLyogaWYgdGhpcyBlbnRyeSBpcyBsaW1pdGVkIHRvIHVzZSBsZWdhY3kgdHggbW9kZSwgaXQgZG9lc24ndCBnZW5lcmF0ZSBCQS4gKi8KIAlpZiAoUlRNUFN0YUZpeGVkVHhNb2RlKHBBZCwgcEVudHJ5KSAhPSBGSVhFRF9UWE1PREVfSFQpCiAJCXJldHVybjsKIAotCWlmICgocEVudHJ5LT5CQURlY2xpbmVCaXRtYXAgJiAoMTw8VElEKSkgJiYgKGlzRm9yY2VkID09IEZBTFNFKSkKLQl7Ci0JCS8vIHRyeSBhZ2FpbiBhZnRlciAzIHNlY3MKKwlpZiAoKHBFbnRyeS0+QkFEZWNsaW5lQml0bWFwICYgKDEgPDwgVElEKSkgJiYgKGlzRm9yY2VkID09IEZBTFNFKSkgeworCQkvKiB0cnkgYWdhaW4gYWZ0ZXIgMyBzZWNzICovCiAJCURlbGF5VGltZSA9IDMwMDA7Ci0vLwkJcHJpbnRrKCJEZUNsaW5lIEJBIGZyb20gUGVlclxuIik7Ci0vLwkJcmV0dXJuOworLyogICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRlQ2xpbmUgQkEgZnJvbSBQZWVyXG4iKSk7ICovCisvKiAgICAgICAgICAgICAgcmV0dXJuOyAqLwogCX0KIAotCiAJSWR4ID0gcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtUSURdOwotCWlmIChJZHggPT0gMCkKLQl7Ci0JCS8vIGFsbG9jYXRlIGEgQkEgc2Vzc2lvbgorCWlmIChJZHggPT0gMCkgeworCQkvKiBhbGxvY2F0ZSBhIEJBIHNlc3Npb24gKi8KIAkJcEJBRW50cnkgPSBCQVRhYmxlQWxsb2NPcmlFbnRyeShwQWQsICZJZHgpOwotCQlpZiAocEJBRW50cnkgPT0gTlVMTCkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBRERCQSAtIE1sbWVBRERCQUFjdGlvbigpIGFsbG9jYXRlIEJBIHNlc3Npb24gZmFpbGVkIFxuIikpOworCQlpZiAocEJBRW50cnkgPT0gTlVMTCkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQUREQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBhbGxvY2F0ZSBCQSBzZXNzaW9uIGZhaWxlZCBcbiIpKTsKIAkJCXJldHVybjsKIAkJfQotCX0KLQllbHNlCi0JewotCQlwQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W0lkeF07CisJfSBlbHNlIHsKKwkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKIAl9CiAKLQlpZiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPj0gT3JpZ2luYXRvcl9XYWl0UmVzKQotCXsKKwlpZiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPj0gT3JpZ2luYXRvcl9XYWl0UmVzKSB7CiAJCXJldHVybjsKIAl9CiAKIAlwRW50cnktPkJBT3JpV2NpZEFycmF5W1RJRF0gPSBJZHg7CiAKLQkvLyBJbml0aWFsaXplIEJBIHNlc3Npb24KKwkvKiBJbml0aWFsaXplIEJBIHNlc3Npb24gKi8KIAlwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfV2FpdFJlczsKIAlwQkFFbnRyeS0+V2NpZCA9IHBFbnRyeS0+QWlkOwogCXBCQUVudHJ5LT5CQVdpblNpemUgPSBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0OwogCXBCQUVudHJ5LT5TZXF1ZW5jZSA9IEJBX09SSV9JTklUX1NFUTsKLQlwQkFFbnRyeS0+VG9rZW4gPSAxOwkvLyAoMjAwOC0wMS0yMSkgSmFuIExlZSByZWNvbW1lbmRzIGl0IC0gdGhpcyB0b2tlbiBjYW4ndCBiZSAwCisJcEJBRW50cnktPlRva2VuID0gMTsJLyogKDIwMDgtMDEtMjEpIEphbiBMZWUgcmVjb21tZW5kcyBpdCAtIHRoaXMgdG9rZW4gY2FuJ3QgYmUgMCAqLwogCXBCQUVudHJ5LT5USUQgPSBUSUQ7CiAJcEJBRW50cnktPlRpbWVPdXRWYWx1ZSA9IFRpbWVPdXQ7CiAJcEJBRW50cnktPnBBZGFwdGVyID0gcEFkOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTZW5kIEFkZEJBIHRvICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFRpZDolZCBpc0ZvcmNlZDolZCBXY2lkOiVkXG4iCi0JCSxwRW50cnktPkFkZHJbMF0scEVudHJ5LT5BZGRyWzFdLHBFbnRyeS0+QWRkclsyXQotCQkscEVudHJ5LT5BZGRyWzNdLHBFbnRyeS0+QWRkcls0XSxwRW50cnktPkFkZHJbNV0KLQkJLFRJRCxpc0ZvcmNlZCxwRW50cnktPkFpZCkpOwotCi0JaWYgKCEocEVudHJ5LT5UWEJBYml0bWFwICYgKDE8PFRJRCkpKQotCXsKLQkJUlRNUEluaXRUaW1lcihwQWQsICZwQkFFbnRyeS0+T1JJQkFUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEJBT3JpU2Vzc2lvblNldHVwVGltZW91dCksIHBCQUVudHJ5LCBGQUxTRSk7Ci0JfQotCWVsc2UKKwlpZiAoIShwRW50cnktPlRYQkFiaXRtYXAgJiAoMSA8PCBUSUQpKSkgeworCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBCQUVudHJ5LT5PUklCQVRpbWVyLAorCQkJICAgICAgR0VUX1RJTUVSX0ZVTkNUSU9OKEJBT3JpU2Vzc2lvblNldHVwVGltZW91dCksCisJCQkgICAgICBwQkFFbnRyeSwgRkFMU0UpOworCX0gZWxzZQogCQlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKIAotCS8vIHNldCB0aW1lciB0byBzZW5kIEFEREJBIHJlcXVlc3QKKwkvKiBzZXQgdGltZXIgdG8gc2VuZCBBRERCQSByZXF1ZXN0ICovCiAJUlRNUFNldFRpbWVyKCZwQkFFbnRyeS0+T1JJQkFUaW1lciwgRGVsYXlUaW1lKTsKIH0KIAotVk9JRCBCQU9yaVNlc3Npb25BZGQoCi0JCQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQkJCQkJSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAotCQkJSU4gUEZSQU1FX0FEREJBX1JTUCBwRnJhbWUpCit2b2lkIEJBT3JpU2Vzc2lvbkFkZChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LCBzdHJ1Y3QgcnRfZnJhbWVfYWRkYmFfcnNwICogcEZyYW1lKQogewotCUJBX09SSV9FTlRSWSAgKnBCQUVudHJ5ID0gTlVMTDsKLQlCT09MRUFOICAgICAgIENhbmNlbGxlZDsKLQlVQ0hBUiAgICAgICAgIFRJRDsKLQlVU0hPUlQgICAgICAgIElkeDsKLQlQVUNIQVIgICAgICAgICAgcE91dEJ1ZmZlcjIgPSBOVUxMOwotCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOwotCVVMT05HICAgICAgICAgICBGcmFtZUxlbjsKLQlGUkFNRV9CQVIgICAgICAgRnJhbWVCYXI7CisJc3RydWN0IHJ0X2JhX29yaV9lbnRyeSAqcEJBRW50cnkgPSBOVUxMOworCUJPT0xFQU4gQ2FuY2VsbGVkOworCXU4IFRJRDsKKwl1MTYgSWR4OworCXU4ICpwT3V0QnVmZmVyMiA9IE5VTEw7CisJaW50IE5TdGF0dXM7CisJdW5zaWduZWQgbG9uZyBGcmFtZUxlbjsKKwlzdHJ1Y3QgcnRfZnJhbWVfYmFyIEZyYW1lQmFyOwogCiAJVElEID0gcEZyYW1lLT5CYVBhcm0uVElEOwogCUlkeCA9IHBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbVElEXTsKLQlwQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W0lkeF07CisJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKIAotCS8vIFN0YXJ0IGZpbGwgaW4gcGFyYW1ldGVycy4KLQlpZiAoKElkeCAhPTApICYmIChwQkFFbnRyeS0+VElEID09IFRJRCkgJiYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfV2FpdFJlcykpCi0JewotCQlwQkFFbnRyeS0+QkFXaW5TaXplID0gbWluKHBCQUVudHJ5LT5CQVdpblNpemUsICgoVUNIQVIpcEZyYW1lLT5CYVBhcm0uQnVmU2l6ZSkpOworCS8qIFN0YXJ0IGZpbGwgaW4gcGFyYW1ldGVycy4gKi8KKwlpZiAoKElkeCAhPSAwKSAmJiAocEJBRW50cnktPlRJRCA9PSBUSUQpCisJICAgICYmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX1dhaXRSZXMpKSB7CisJCXBCQUVudHJ5LT5CQVdpblNpemUgPQorCQkgICAgbWluKHBCQUVudHJ5LT5CQVdpblNpemUsICgodTgpcEZyYW1lLT5CYVBhcm0uQnVmU2l6ZSkpOwogCQlCQV9NYXhXaW5TaXplUmVhc2lnbihwQWQsIHBFbnRyeSwgJnBCQUVudHJ5LT5CQVdpblNpemUpOwogCiAJCXBCQUVudHJ5LT5UaW1lT3V0VmFsdWUgPSBwRnJhbWUtPlRpbWVPdXRWYWx1ZTsKIAkJcEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX0RvbmU7Ci0JCS8vIHJlc2V0IHNlcXVlbmNlIG51bWJlcgorCQlwQWQtPkJBVGFibGUubnVtRG9uZU9yaWdpbmF0b3IrKzsKKworCQkvKiByZXNldCBzZXF1ZW5jZSBudW1iZXIgKi8KIAkJcEJBRW50cnktPlNlcXVlbmNlID0gQkFfT1JJX0lOSVRfU0VROwotCQkvLyBTZXQgQml0bWFwIGZsYWcuCi0JCXBFbnRyeS0+VFhCQWJpdG1hcCB8PSAoMTw8VElEKTsKLQkJCQlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJLyogU2V0IEJpdG1hcCBmbGFnLiAqLworCQlwRW50cnktPlRYQkFiaXRtYXAgfD0gKDEgPDwgVElEKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQkFFbnRyeS0+T1JJQkFUaW1lciwgJkNhbmNlbGxlZCk7CiAKLQkJcEJBRW50cnktPk9SSUJBVGltZXIuVGltZXJWYWx1ZSA9IDA7CS8vcEZyYW1lLT5UaW1lT3V0VmFsdWU7CisJCXBCQUVudHJ5LT5PUklCQVRpbWVyLlRpbWVyVmFsdWUgPSAwOwkvKnBGcmFtZS0+VGltZU91dFZhbHVlOyAqLwogCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXMgOiBUWEJBYml0bWFwID0gJXgsIEJBV2luU2l6ZSA9ICVkLCBUaW1lT3V0ID0gJWxkXG4iLCBfX2Z1bmNfXywgcEVudHJ5LT5UWEJBYml0bWFwLAotCQkJCQkJCQkgcEJBRW50cnktPkJBV2luU2l6ZSwgcEJBRW50cnktPk9SSUJBVGltZXIuVGltZXJWYWx1ZSkpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIiVzIDogVFhCQWJpdG1hcCA9ICV4LCBCQVdpblNpemUgPSAlZCwgVGltZU91dCA9ICVsZFxuIiwKKwkJCSAgX19mdW5jX18sIHBFbnRyeS0+VFhCQWJpdG1hcCwgcEJBRW50cnktPkJBV2luU2l6ZSwKKwkJCSAgcEJBRW50cnktPk9SSUJBVGltZXIuVGltZXJWYWx1ZSkpOwogCi0JCS8vIFNFTkQgQkFSIDsKLQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyMik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBCQU9yaVNlc3Npb25BZGQoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQkvKiBTRU5EIEJBUiA7ICovCisJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcjIpOwkvKkdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5ICovCisJCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkJBIC0gQkFPcmlTZXNzaW9uQWRkKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKIAkJCXJldHVybjsKIAkJfQogCi0JCUJhckhlYWRlckluaXQocEFkLCAmRnJhbWVCYXIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBRW50cnktPldjaWRdLkFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworCQlCYXJIZWFkZXJJbml0KHBBZCwgJkZyYW1lQmFyLAorCQkJICAgICAgcEFkLT5NYWNUYWIuQ29udGVudFtwQkFFbnRyeS0+V2NpZF0uQWRkciwKKwkJCSAgICAgIHBBZC0+Q3VycmVudEFkZHJlc3MpOwogCi0JCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLkZyYWdOdW0gPSAwOwkvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jdGlvbi4KLQkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgPSBwQkFFbnRyeS0+U2VxdWVuY2U7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgotCQlGcmFtZUJhci5CYXJDb250cm9sLlRJRCA9IHBCQUVudHJ5LT5USUQ7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyMiwgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJCQkJCSAgc2l6ZW9mKEZSQU1FX0JBUiksICAgICAgJkZyYW1lQmFyLAotCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuRnJhZ051bSA9IDA7CS8qIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmN0aW9uLiAqLworCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSA9IHBCQUVudHJ5LT5TZXF1ZW5jZTsJLyogbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uICovCisJCUZyYW1lQmFyLkJhckNvbnRyb2wuVElEID0gcEJBRW50cnktPlRJRDsJLyogbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uICovCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIyLCAmRnJhbWVMZW4sCisJCQkJICBzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2JhciksICZGcmFtZUJhciwgRU5EX09GX0FSR1MpOwogCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlcjIsIEZyYW1lTGVuKTsKIAkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyMik7CiAKLQogCQlpZiAocEJBRW50cnktPk9SSUJBVGltZXIuVGltZXJWYWx1ZSkKLQkJCVJUTVBTZXRUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsIHBCQUVudHJ5LT5PUklCQVRpbWVyLlRpbWVyVmFsdWUpOyAvLyBpbiBtU2VjCisJCQlSVE1QU2V0VGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCBwQkFFbnRyeS0+T1JJQkFUaW1lci5UaW1lclZhbHVlKTsJLyogaW4gbVNlYyAqLwogCX0KIH0KIAotQk9PTEVBTiBCQVJlY1Nlc3Npb25BZGQoCi0JCQkJCSAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCQkJCQkgICBJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCi0JCQkJCSAgIElOIFBGUkFNRV9BRERCQV9SRVEgcEZyYW1lKQorQk9PTEVBTiBCQVJlY1Nlc3Npb25BZGQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LCBzdHJ1Y3QgcnRfZnJhbWVfYWRkYmFfcmVxICogcEZyYW1lKQogewotCUJBX1JFQ19FTlRSWSAgICAgICAgICAgICpwQkFFbnRyeSA9IE5VTEw7Ci0JQk9PTEVBTiAgICAgICAgICAgICAgICAgU3RhdHVzID0gVFJVRTsKLQlCT09MRUFOICAgICAgICAgICAgICAgICBDYW5jZWxsZWQ7Ci0JVVNIT1JUICAgICAgICAgICAgICAgICAgSWR4OwotCVVDSEFSICAgICAgICAgICAgICAgICAgIFRJRDsKLQlVQ0hBUiAgICAgICAgICAgICAgICAgICBCQVdpblNpemU7Ci0JLy9VSU5UMzIgICAgICAgICAgICAgICAgICBWYWx1ZTsKLQkvL1VJTlQgICAgICAgICAgICAgICAgICAgIG9mZnNldDsKLQorCXN0cnVjdCBydF9iYV9yZWNfZW50cnkgKnBCQUVudHJ5ID0gTlVMTDsKKwlCT09MRUFOIFN0YXR1cyA9IFRSVUU7CisJQk9PTEVBTiBDYW5jZWxsZWQ7CisJdTE2IElkeDsKKwl1OCBUSUQ7CisJdTggQkFXaW5TaXplOworCS8qdTMyICAgICAgICAgICAgICAgICAgVmFsdWU7ICovCisJLyp1MzIgICAgICAgICAgICAgICAgICAgIG9mZnNldDsgKi8KIAogCUFTU0VSVChwRW50cnkpOwogCi0JLy8gZmluZCBUSUQKKwkvKiBmaW5kIFRJRCAqLwogCVRJRCA9IHBGcmFtZS0+QmFQYXJtLlRJRDsKIAotCUJBV2luU2l6ZSA9IG1pbigoKFVDSEFSKXBGcmFtZS0+QmFQYXJtLkJ1ZlNpemUpLCAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCk7CisJQkFXaW5TaXplID0KKwkgICAgbWluKCgodTgpcEZyYW1lLT5CYVBhcm0uQnVmU2l6ZSksCisJCSh1OClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0KTsKIAotCS8vIEludGVsIHBhdGNoCi0JaWYgKEJBV2luU2l6ZSA9PSAwKQotCXsKKwkvKiBJbnRlbCBwYXRjaCAqLworCWlmIChCQVdpblNpemUgPT0gMCkgewogCQlCQVdpblNpemUgPSA2NDsKIAl9CiAKIAlJZHggPSBwRW50cnktPkJBUmVjV2NpZEFycmF5W1RJRF07CiAKLQotCWlmIChJZHggPT0gMCkKLQl7CisJaWYgKElkeCA9PSAwKSB7CiAJCXBCQUVudHJ5ID0gQkFUYWJsZUFsbG9jUmVjRW50cnkocEFkLCAmSWR4KTsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOwotCQkvLyBmbHVzaCBhbGwgcGVuZGluZyByZW9yZGVyaW5nIG1wZHVzCisJCS8qIGZsdXNoIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgbXBkdXMgKi8KIAkJYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOwogCX0KIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXMoJWxkKTogSWR4ID0gJWQsIEJBV2luU2l6ZShyZXEgJWQpID0gJWRcbiIsIF9fZnVuY19fLCBwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQsIElkeCwKLQkJCQkJCQkgcEZyYW1lLT5CYVBhcm0uQnVmU2l6ZSwgQkFXaW5TaXplKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIiVzKCVsZCk6IElkeCA9ICVkLCBCQVdpblNpemUocmVxICVkKSA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJICBwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQsIElkeCwgcEZyYW1lLT5CYVBhcm0uQnVmU2l6ZSwKKwkJICBCQVdpblNpemUpKTsKIAotCS8vIFN0YXJ0IGZpbGwgaW4gcGFyYW1ldGVycy4KLQlpZiAocEJBRW50cnkgIT0gTlVMTCkKLQl7CisJLyogU3RhcnQgZmlsbCBpbiBwYXJhbWV0ZXJzLiAqLworCWlmIChwQkFFbnRyeSAhPSBOVUxMKSB7CiAJCUFTU0VSVChwQkFFbnRyeS0+bGlzdC5xbGVuID09IDApOwogCiAJCXBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID0gUmVjaXBpZW50X0hhbmRsZVJlczsKQEAgLTY2NSw2NiArNjIyLDYyIEBACiAJCXBCQUVudHJ5LT5USUQgPSBUSUQ7CiAJCXBCQUVudHJ5LT5UaW1lT3V0VmFsdWUgPSBwRnJhbWUtPlRpbWVPdXRWYWx1ZTsKIAkJcEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPSBSZWNpcGllbnRfQWNjZXB0OwotCQkvLyBpbml0aWFsIHNlcXVlbmNlIG51bWJlcgotCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7IC8vcEZyYW1lLT5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxOworCQkvKiBpbml0aWFsIHNlcXVlbmNlIG51bWJlciAqLworCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7CS8qcEZyYW1lLT5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxOyAqLwogCi0JCXByaW50aygiU3RhcnQgU2VxID0gJTA4eFxuIiwgIHBGcmFtZS0+QmFTdGFydFNlcS5maWVsZC5TdGFydFNlcSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwKKwkJCSAoIlN0YXJ0IFNlcSA9ICUwOHhcbiIsCisJCQkgIHBGcmFtZS0+QmFTdGFydFNlcS5maWVsZC5TdGFydFNlcSkpOwogCi0JCWlmIChwRW50cnktPlJYQkFiaXRtYXAgJiAoMTw8VElEKSkKLQkJeworCQlpZiAocEVudHJ5LT5SWEJBYml0bWFwICYgKDEgPDwgVElEKSkgewogCQkJUlRNUENhbmNlbFRpbWVyKCZwQkFFbnRyeS0+UkVDQkFUaW1lciwgJkNhbmNlbGxlZCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBCQUVudHJ5LT5SRUNCQVRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oQkFSZWNTZXNzaW9uSWRsZVRpbWVvdXQpLCBwQkFFbnRyeSwgVFJVRSk7CisJCX0gZWxzZSB7CisJCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBCQUVudHJ5LT5SRUNCQVRpbWVyLAorCQkJCSAgICAgIEdFVF9USU1FUl9GVU5DVElPTgorCQkJCSAgICAgIChCQVJlY1Nlc3Npb25JZGxlVGltZW91dCksIHBCQUVudHJ5LAorCQkJCSAgICAgIFRSVUUpOwogCQl9CiAKLQkJLy8gU2V0IEJpdG1hcCBmbGFnLgotCQlwRW50cnktPlJYQkFiaXRtYXAgfD0gKDE8PFRJRCk7CisJCS8qIFNldCBCaXRtYXAgZmxhZy4gKi8KKwkJcEVudHJ5LT5SWEJBYml0bWFwIHw9ICgxIDw8IFRJRCk7CiAJCXBFbnRyeS0+QkFSZWNXY2lkQXJyYXlbVElEXSA9IElkeDsKIAotCQlwRW50cnktPkJBRGVjbGluZUJpdG1hcCAmPSB+KDE8PFRJRCk7CisJCXBFbnRyeS0+QkFEZWNsaW5lQml0bWFwICY9IH4oMSA8PCBUSUQpOwogCi0JCS8vIFNldCBCQSBzZXNzaW9uIG1hc2sgaW4gV0NJRCB0YWJsZS4KLQkJUlQyOFhYX0FERF9CQV9TRVNTSU9OX1RPX0FTSUMocEFkLCBwRW50cnktPkFpZCwgVElEKTsKKwkJLyogU2V0IEJBIHNlc3Npb24gbWFzayBpbiBXQ0lEIHRhYmxlLiAqLworCQlSVE1QX0FERF9CQV9TRVNTSU9OX1RPX0FTSUMocEFkLCBwRW50cnktPkFpZCwgVElEKTsKIAotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1BQ0VudHJ5WyVkXVJYQkFiaXRtYXAgPSAweCV4LiBCQVJlY1djaWRBcnJheT0lZFxuIiwKLQkJCQlwRW50cnktPkFpZCwgcEVudHJ5LT5SWEJBYml0bWFwLCBwRW50cnktPkJBUmVjV2NpZEFycmF5W1RJRF0pKTsKLQl9Ci0JZWxzZQotCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJNQUNFbnRyeVslZF1SWEJBYml0bWFwID0gMHgleC4gQkFSZWNXY2lkQXJyYXk9JWRcbiIsCisJCQkgIHBFbnRyeS0+QWlkLCBwRW50cnktPlJYQkFiaXRtYXAsCisJCQkgIHBFbnRyeS0+QkFSZWNXY2lkQXJyYXlbVElEXSkpOworCX0gZWxzZSB7CiAJCVN0YXR1cyA9IEZBTFNFOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNhbid0IEFjY2VwdCBBRERCQSBmb3IgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggVElEID0gJWRcbiIsCi0JCQkJUFJJTlRfTUFDKHBFbnRyeS0+QWRkciksIFRJRCkpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkNhbid0IEFjY2VwdCBBRERCQSBmb3IgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggVElEID0gJWRcbiIsCisJCQkgIFBSSU5UX01BQyhwRW50cnktPkFkZHIpLCBUSUQpKTsKIAl9Ci0JcmV0dXJuKFN0YXR1cyk7CisJcmV0dXJuIChTdGF0dXMpOwogfQogCi0KLUJBX1JFQ19FTlRSWSAqQkFUYWJsZUFsbG9jUmVjRW50cnkoCi0JCQkJCQkJCSAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JCQkJCQkJCSAgT1VUIFVTSE9SVCAgICAgICAgICAqSWR4KQorc3RydWN0IHJ0X2JhX3JlY19lbnRyeSAqQkFUYWJsZUFsbG9jUmVjRW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1MTYgKiBJZHgpCiB7Ci0JaW50ICAgICAgICAgICAgIGk7Ci0JQkFfUkVDX0VOVFJZICAgICpwQkFFbnRyeSA9IE5VTEw7Ci0KKwlpbnQgaTsKKwlzdHJ1Y3QgcnRfYmFfcmVjX2VudHJ5ICpwQkFFbnRyeSA9IE5VTEw7CiAKIAlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CiAKLQlpZiAocEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50ID49IE1BWF9CQVJFQ0lfU0VTU0lPTikKLQl7Ci0JCXByaW50aygiQkEgUmVjaXBlaW50IFNlc3Npb24gKCVsZCkgPiAlZFxuIiwgcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50LAotCQkJTUFYX0JBUkVDSV9TRVNTSU9OKTsKKwlpZiAocEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50ID49IE1BWF9CQVJFQ0lfU0VTU0lPTikgeworCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiQkEgUmVjaXBlaW50IFNlc3Npb24gKCVsZCkgPiAlZFxuIiwKKwkJCQkJcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50LAorCQkJCQlNQVhfQkFSRUNJX1NFU1NJT04pKTsKIAkJZ290byBkb25lOwogCX0KLQotCS8vIHJlc2VydmUgaWR4IDAgdG8gaWRlbnRpZnkgQkFXY2lkQXJyYXlbVElEXSBhcyBlbXB0eQotCWZvciAoaT0xOyBpIDwgTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEU7IGkrKykKLQl7Ci0JCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbaV07Ci0JCWlmICgocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPT0gUmVjaXBpZW50X05PTkUpKQotCQl7Ci0JCQkvLyBnZXQgb25lCisJLyogcmVzZXJ2ZSBpZHggMCB0byBpZGVudGlmeSBCQVdjaWRBcnJheVtUSURdIGFzIGVtcHR5ICovCisJZm9yIChpID0gMTsgaSA8IE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFOyBpKyspIHsKKwkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbaV07CisJCWlmICgocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPT0gUmVjaXBpZW50X05PTkUpKSB7CisJCQkvKiBnZXQgb25lICovCiAJCQlwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQrKzsKIAkJCXBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID0gUmVjaXBpZW50X1VTRUQ7CiAJCQkqSWR4ID0gaTsKQEAgLTczNywyNyArNjkwLDIxIEBACiAJcmV0dXJuIHBCQUVudHJ5OwogfQogCi1CQV9PUklfRU5UUlkgKkJBVGFibGVBbGxvY09yaUVudHJ5KAotCQkJCQkJCQkgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCQkJCQkJCQkgIE9VVCBVU0hPUlQgICAgICAgICAgKklkeCkKK3N0cnVjdCBydF9iYV9vcmlfZW50cnkgKkJBVGFibGVBbGxvY09yaUVudHJ5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTE2ICogSWR4KQogewotCWludCAgICAgICAgICAgICBpOwotCUJBX09SSV9FTlRSWSAgICAqcEJBRW50cnkgPSBOVUxMOworCWludCBpOworCXN0cnVjdCBydF9iYV9vcmlfZW50cnkgKnBCQUVudHJ5ID0gTlVMTDsKIAogCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKIAotCWlmIChwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yID49IChNQVhfTEVOX09GX0JBX09SSV9UQUJMRSkpCi0JeworCWlmIChwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yID49IChNQVhfTEVOX09GX0JBX09SSV9UQUJMRSkpIHsKIAkJZ290byBkb25lOwogCX0KLQotCS8vIHJlc2VydmUgaWR4IDAgdG8gaWRlbnRpZnkgQkFXY2lkQXJyYXlbVElEXSBhcyBlbXB0eQotCWZvciAoaT0xOyBpPE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFOyBpKyspCi0JewotCQlwQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2ldOwotCQlpZiAoKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfTk9ORSkpCi0JCXsKLQkJCS8vIGdldCBvbmUKKwkvKiByZXNlcnZlIGlkeCAwIHRvIGlkZW50aWZ5IEJBV2NpZEFycmF5W1RJRF0gYXMgZW1wdHkgKi8KKwlmb3IgKGkgPSAxOyBpIDwgTUFYX0xFTl9PRl9CQV9PUklfVEFCTEU7IGkrKykgeworCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXTsKKwkJaWYgKChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX05PTkUpKSB7CisJCQkvKiBnZXQgb25lICovCiAJCQlwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yKys7CiAJCQlwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfVVNFRDsKIAkJCXBCQUVudHJ5LT5wQWRhcHRlciA9IHBBZDsKQEAgLTc3MSwzMiArNzE4LDI4IEBACiAJcmV0dXJuIHBCQUVudHJ5OwogfQogCi0KLVZPSUQgQkFUYWJsZUZyZWVPcmlFbnRyeSgKLQkJCQkJCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCQkJCQkJSU4gIFVMT05HICAgICAgICAgICBJZHgpCit2b2lkIEJBVGFibGVGcmVlT3JpRW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1bnNpZ25lZCBsb25nIElkeCkKIHsKLQlCQV9PUklfRU5UUlkgICAgKnBCQUVudHJ5ID0gTlVMTDsKLQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKLQorCXN0cnVjdCBydF9iYV9vcmlfZW50cnkgKnBCQUVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnk7CiAKIAlpZiAoKElkeCA9PSAwKSB8fCAoSWR4ID49IE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFKSkKIAkJcmV0dXJuOwogCi0JcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtJZHhdOworCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W0lkeF07CiAKLQlpZiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgIT0gT3JpZ2luYXRvcl9OT05FKQotCXsKKwlpZiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgIT0gT3JpZ2luYXRvcl9OT05FKSB7CiAJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BCQUVudHJ5LT5XY2lkXTsKIAkJcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtwQkFFbnRyeS0+VElEXSA9IDA7CiAKLQogCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7Ci0JCWlmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX0RvbmUpCi0JCXsKLQkJIAlwRW50cnktPlRYQkFiaXRtYXAgJj0gKH4oMTw8KHBCQUVudHJ5LT5USUQpICkpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkFUYWJsZUZyZWVPcmlFbnRyeSBudW1Bc09yaWdpbmF0b3I9ICVsZFxuIiwgcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50KSk7Ci0JCQkvLyBFcmFzZSBCaXRtYXAgZmxhZy4KKwkJaWYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfRG9uZSkgeworCQkJcEFkLT5CQVRhYmxlLm51bURvbmVPcmlnaW5hdG9yIC09IDE7CisJCQlwRW50cnktPlRYQkFiaXRtYXAgJj0gKH4oMSA8PCAocEJBRW50cnktPlRJRCkpKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkJBVGFibGVGcmVlT3JpRW50cnkgbnVtQXNPcmlnaW5hdG9yPSAlbGRcbiIsCisJCQkJICBwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQpKTsKKwkJCS8qIEVyYXNlIEJpdG1hcCBmbGFnLiAqLwogCQl9CiAKIAkJQVNTRVJUKHBBZC0+QkFUYWJsZS5udW1Bc09yaWdpbmF0b3IgIT0gMCk7CkBAIC04MDksMjIgKzc1MiwxNyBAQAogCX0KIH0KIAotCi1WT0lEIEJBVGFibGVGcmVlUmVjRW50cnkoCi0JCQkJCQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQkJCQkJCUlOICBVTE9ORyAgICAgICAgICAgSWR4KQordm9pZCBCQVRhYmxlRnJlZVJlY0VudHJ5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdW5zaWduZWQgbG9uZyBJZHgpCiB7Ci0JQkFfUkVDX0VOVFJZICAgICpwQkFFbnRyeSA9IE5VTEw7Ci0JTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7Ci0KKwlzdHJ1Y3QgcnRfYmFfcmVjX2VudHJ5ICpwQkFFbnRyeSA9IE5VTEw7CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5OwogCiAJaWYgKChJZHggPT0gMCkgfHwgKElkeCA+PSBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRSkpCiAJCXJldHVybjsKIAotCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKKwlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOwogCi0JaWYgKHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzICE9IFJlY2lwaWVudF9OT05FKQotCXsKKwlpZiAocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgIT0gUmVjaXBpZW50X05PTkUpIHsKIAkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBRW50cnktPldjaWRdOwogCQlwRW50cnktPkJBUmVjV2NpZEFycmF5W3BCQUVudHJ5LT5USURdID0gMDsKIApAQCAtODM5LDE3NyArNzc3LDE3NyBAQAogCX0KIH0KIAotCi1WT0lEIEJBT3JpU2Vzc2lvblRlYXJEb3duKAotCQkJCQkJIElOIE9VVCAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQkJCQkJCSBJTiAgICAgIFVDSEFSICAgICAgICAgICBXY2lkLAotCQkJCQkJIElOICAgICAgVUNIQVIgICAgICAgICAgIFRJRCwKLQkJCQkJCSBJTiAgICAgIEJPT0xFQU4gICAgICAgICBiUGFzc2l2ZSwKLQkJCQkJCSBJTiAgICAgIEJPT0xFQU4gICAgICAgICBiRm9yY2VTZW5kKQordm9pZCBCQU9yaVNlc3Npb25UZWFyRG93bihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgIHU4IFdjaWQsCisJCQkgIHU4IFRJRCwKKwkJCSAgSU4gQk9PTEVBTiBiUGFzc2l2ZSwgSU4gQk9PTEVBTiBiRm9yY2VTZW5kKQogewotCVVMT05HICAgICAgICAgICBJZHggPSAwOwotCUJBX09SSV9FTlRSWSAgICAqcEJBRW50cnk7Ci0JQk9PTEVBTiAgICAgICAgIENhbmNlbGxlZDsKKwl1bnNpZ25lZCBsb25nIElkeCA9IDA7CisJc3RydWN0IHJ0X2JhX29yaV9lbnRyeSAqcEJBRW50cnk7CisJQk9PTEVBTiBDYW5jZWxsZWQ7CiAKLQlpZiAoV2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKLQl7CisJaWYgKFdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpIHsKIAkJcmV0dXJuOwogCX0KLQotCS8vCi0JLy8gTG9jYXRlIGNvcnJlc3BvbmRpbmcgQkEgT3JpZ2luYXRvciBFbnRyeSBpbiBCQSBUYWJsZSB3aXRoIHRoZSAocEFkZHIsVElEKS4KLQkvLworCS8qICovCisJLyogTG9jYXRlIGNvcnJlc3BvbmRpbmcgQkEgT3JpZ2luYXRvciBFbnRyeSBpbiBCQSBUYWJsZSB3aXRoIHRoZSAocEFkZHIsVElEKS4gKi8KKwkvKiAqLwogCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQkFPcmlXY2lkQXJyYXlbVElEXTsKLQlpZiAoKElkeCA9PSAwKSB8fCAoSWR4ID49IE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFKSkKLQl7Ci0JCWlmIChiRm9yY2VTZW5kID09IFRSVUUpCi0JCXsKLQkJCS8vIGZvcmNlIHNlbmQgc3BlY2lmaWVkIFRJRCBEZWxCQQotCQkJTUxNRV9ERUxCQV9SRVFfU1RSVUNUICAgRGVsYmFSZXE7Ci0JCQlNTE1FX1FVRVVFX0VMRU0gKkVsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKLQkJCWlmIChFbGVtID09IE5VTEwpCi0JCQkJcmV0dXJuOworCWlmICgoSWR4ID09IDApIHx8IChJZHggPj0gTUFYX0xFTl9PRl9CQV9PUklfVEFCTEUpKSB7CisJCWlmIChiRm9yY2VTZW5kID09IFRSVUUpIHsKKwkJCS8qIGZvcmNlIHNlbmQgc3BlY2lmaWVkIFRJRCBEZWxCQSAqLworCQkJc3RydWN0IHJ0X21sbWVfZGVsYmFfcmVxIERlbGJhUmVxOworCQkJc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSA9CisJCQkgICAgKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSwKKwkJCQkJCQlNRU1fQUxMT0NfRkxBRyk7CisJCQlpZiAoRWxlbSAhPSBOVUxMKSB7CisJCQkJTmRpc1plcm9NZW1vcnkoJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKKwkJCQlOZGlzWmVyb01lbW9yeShFbGVtLCBzaXplb2Yoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSkpOwogCi0JCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOwotCQkJTmRpc1plcm9NZW1vcnkoRWxlbSwgc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSkpOwotCi0JCQlDT1BZX01BQ19BRERSKERlbGJhUmVxLkFkZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7Ci0JCQlEZWxiYVJlcS5XY2lkID0gV2NpZDsKLQkJCURlbGJhUmVxLlRJRCA9IFRJRDsKLQkJCURlbGJhUmVxLkluaXRpYXRvciA9IE9SSUdJTkFUT1I7Ci0jaWYgMQotCQkJRWxlbS0+TXNnTGVuICA9IHNpemVvZihEZWxiYVJlcSk7Ci0JCQlOZGlzTW92ZU1lbW9yeShFbGVtLT5Nc2csICZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7Ci0JCQlNbG1lREVMQkFBY3Rpb24ocEFkLCBFbGVtKTsKLQkJCWtmcmVlKEVsZW0pOwotI2Vsc2UKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgQUNUSU9OX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLCBzaXplb2YoTUxNRV9ERUxCQV9SRVFfU1RSVUNUKSwgKFBWT0lEKSZEZWxiYVJlcSk7Ci0JCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Ci0jZW5kaWYKKwkJCQlDT1BZX01BQ19BRERSKERlbGJhUmVxLkFkZHIsCisJCQkJCSAgICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7CisJCQkJRGVsYmFSZXEuV2NpZCA9IFdjaWQ7CisJCQkJRGVsYmFSZXEuVElEID0gVElEOworCQkJCURlbGJhUmVxLkluaXRpYXRvciA9IE9SSUdJTkFUT1I7CisJCQkJRWxlbS0+TXNnTGVuID0gc2l6ZW9mKERlbGJhUmVxKTsKKwkJCQlOZGlzTW92ZU1lbW9yeShFbGVtLT5Nc2csICZEZWxiYVJlcSwKKwkJCQkJICAgICAgIHNpemVvZihEZWxiYVJlcSkpOworCQkJCU1sbWVERUxCQUFjdGlvbihwQWQsIEVsZW0pOworCQkJCWtmcmVlKEVsZW0pOworCQkJfSBlbHNlIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJICgiJXMoYkZvcmNlU2VuZCk6YWxsb2MgbWVtb3J5IGZhaWxlZCFcbiIsCisJCQkJCSAgX19mdW5jX18pKTsKKwkJCX0KIAkJfQogCiAJCXJldHVybjsKIAl9CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzPT09PldjaWQ9JWQuVElEPSVkIFxuIiwgX19mdW5jX18sIFdjaWQsIFRJRCkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCIlcz09PT5XY2lkPSVkLlRJRD0lZCBcbiIsIF9fZnVuY19fLCBXY2lkLCBUSUQpKTsKIAogCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W0lkeF07Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJcdD09PT5JZHggPSAlbGQsIFdjaWQ9JWQuVElEPSVkLCBPUklfQkFfU3RhdHVzID0gJWQgXG4iLCBJZHgsIFdjaWQsIFRJRCwgcEJBRW50cnktPk9SSV9CQV9TdGF0dXMpKTsKLQkvLwotCS8vIFByZXBhcmUgRGVsQkEgYWN0aW9uIGZyYW1lIGFuZCBzZW5kIHRvIHRoZSBwZWVyLgotCS8vCi0JaWYgKChiUGFzc2l2ZSA9PSBGQUxTRSkgJiYgKFRJRCA9PSBwQkFFbnRyeS0+VElEKSAmJiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKSkKLQl7Ci0JCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAgIERlbGJhUmVxOwotCQlNTE1FX1FVRVVFX0VMRU0gKkVsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKLQkJaWYgKEVsZW0gPT0gTlVMTCkKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiXHQ9PT0+SWR4ID0gJWxkLCBXY2lkPSVkLlRJRD0lZCwgT1JJX0JBX1N0YXR1cyA9ICVkIFxuIiwgSWR4LAorCQkgIFdjaWQsIFRJRCwgcEJBRW50cnktPk9SSV9CQV9TdGF0dXMpKTsKKwkvKiAqLworCS8qIFByZXBhcmUgRGVsQkEgYWN0aW9uIGZyYW1lIGFuZCBzZW5kIHRvIHRoZSBwZWVyLiAqLworCS8qICovCisJaWYgKChiUGFzc2l2ZSA9PSBGQUxTRSkgJiYgKFRJRCA9PSBwQkFFbnRyeS0+VElEKQorCSAgICAmJiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKSkgeworCQlzdHJ1Y3QgcnRfbWxtZV9kZWxiYV9yZXEgRGVsYmFSZXE7CisJCXN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0gPQorCQkgICAgKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSwKKwkJCQkJCU1FTV9BTExPQ19GTEFHKTsKKwkJaWYgKEVsZW0gIT0gTlVMTCkgeworCQkJTmRpc1plcm9NZW1vcnkoJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKKwkJCU5kaXNaZXJvTWVtb3J5KEVsZW0sIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSk7CisKKwkJCUNPUFlfTUFDX0FERFIoRGVsYmFSZXEuQWRkciwKKwkJCQkgICAgICBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHIpOworCQkJRGVsYmFSZXEuV2NpZCA9IFdjaWQ7CisJCQlEZWxiYVJlcS5USUQgPSBwQkFFbnRyeS0+VElEOworCQkJRGVsYmFSZXEuSW5pdGlhdG9yID0gT1JJR0lOQVRPUjsKKwkJCUVsZW0tPk1zZ0xlbiA9IHNpemVvZihEZWxiYVJlcSk7CisJCQlOZGlzTW92ZU1lbW9yeShFbGVtLT5Nc2csICZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7CisJCQlNbG1lREVMQkFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCWtmcmVlKEVsZW0pOworCQl9IGVsc2UgeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiJXMoKTphbGxvYyBtZW1vcnkgZmFpbGVkIVxuIiwgX19mdW5jX18pKTsKIAkJCXJldHVybjsKLQotCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOwotCQlOZGlzWmVyb01lbW9yeShFbGVtLCBzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSk7Ci0KLQkJQ09QWV9NQUNfQUREUihEZWxiYVJlcS5BZGRyLCBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHIpOwotCQlEZWxiYVJlcS5XY2lkID0gV2NpZDsKLQkJRGVsYmFSZXEuVElEID0gcEJBRW50cnktPlRJRDsKLQkJRGVsYmFSZXEuSW5pdGlhdG9yID0gT1JJR0lOQVRPUjsKLSNpZiAxCi0JCUVsZW0tPk1zZ0xlbiAgPSBzaXplb2YoRGVsYmFSZXEpOwotCQlOZGlzTW92ZU1lbW9yeShFbGVtLT5Nc2csICZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7Ci0JCU1sbWVERUxCQUFjdGlvbihwQWQsIEVsZW0pOwotCQlrZnJlZShFbGVtKTsKLSNlbHNlCi0JCU1sbWVFbnF1ZXVlKHBBZCwgQUNUSU9OX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLCBzaXplb2YoTUxNRV9ERUxCQV9SRVFfU1RSVUNUKSwgKFBWT0lEKSZEZWxiYVJlcSk7Ci0JCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKLSNlbmRpZgorCQl9CiAJfQogCVJUTVBDYW5jZWxUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsICZDYW5jZWxsZWQpOwogCUJBVGFibGVGcmVlT3JpRW50cnkocEFkLCBJZHgpOwogCi0JaWYgKGJQYXNzaXZlKQotCXsKLQkJLy9CQU9yaVNlc3Npb25TZXRVcChwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBUSUQsIDAsIDEwMDAwLCBUUlVFKTsKKwlpZiAoYlBhc3NpdmUpIHsKKwkJLypCQU9yaVNlc3Npb25TZXRVcChwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBUSUQsIDAsIDEwMDAwLCBUUlVFKTsgKi8KIAl9CiB9CiAKLVZPSUQgQkFSZWNTZXNzaW9uVGVhckRvd24oCi0JCQkJCQkgSU4gT1VUICBQUlRNUF9BREFQVEVSICAgcEFkLAotCQkJCQkJIElOICAgICAgVUNIQVIgICAgICAgICAgIFdjaWQsCi0JCQkJCQkgSU4gICAgICBVQ0hBUiAgICAgICAgICAgVElELAotCQkJCQkJIElOICAgICAgQk9PTEVBTiAgICAgICAgIGJQYXNzaXZlKQordm9pZCBCQVJlY1Nlc3Npb25UZWFyRG93bihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgIHU4IFdjaWQsIHU4IFRJRCwgSU4gQk9PTEVBTiBiUGFzc2l2ZSkKIHsKLQlVTE9ORyAgICAgICAgICAgSWR4ID0gMDsKLQlCQV9SRUNfRU5UUlkgICAgKnBCQUVudHJ5OworCXVuc2lnbmVkIGxvbmcgSWR4ID0gMDsKKwlzdHJ1Y3QgcnRfYmFfcmVjX2VudHJ5ICpwQkFFbnRyeTsKIAotCWlmIChXY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQotCXsKKwlpZiAoV2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkgewogCQlyZXR1cm47CiAJfQotCi0JLy8KLQkvLyAgTG9jYXRlIGNvcnJlc3BvbmRpbmcgQkEgT3JpZ2luYXRvciBFbnRyeSBpbiBCQSBUYWJsZSB3aXRoIHRoZSAocEFkZHIsVElEKS4KLQkvLworCS8qICovCisJLyogIExvY2F0ZSBjb3JyZXNwb25kaW5nIEJBIE9yaWdpbmF0b3IgRW50cnkgaW4gQkEgVGFibGUgd2l0aCB0aGUgKHBBZGRyLFRJRCkuICovCisJLyogKi8KIAlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkJBUmVjV2NpZEFycmF5W1RJRF07CiAJaWYgKElkeCA9PSAwKQogCQlyZXR1cm47CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzPT09PldjaWQ9JWQuVElEPSVkIFxuIiwgX19mdW5jX18sIFdjaWQsIFRJRCkpOwotCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIiVzPT09PldjaWQ9JWQuVElEPSVkIFxuIiwgX19mdW5jX18sIFdjaWQsIFRJRCkpOwogCiAJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlx0PT09PklkeCA9ICVsZCwgV2NpZD0lZC5USUQ9JWQsIFJFQ19CQV9TdGF0dXMgPSAlZCBcbiIsIElkeCwgV2NpZCwgVElELCBwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cykpOwotCS8vCi0JLy8gUHJlcGFyZSBEZWxCQSBhY3Rpb24gZnJhbWUgYW5kIHNlbmQgdG8gdGhlIHBlZXIuCi0JLy8KLQlpZiAoKFRJRCA9PSBwQkFFbnRyeS0+VElEKSAmJiAocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPT0gUmVjaXBpZW50X0FjY2VwdCkpCi0JewotCQlNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgICBEZWxiYVJlcTsKLQkJQk9PTEVBTiAJCQkJQ2FuY2VsbGVkOwotCQlNTE1FX1FVRVVFX0VMRU0gKkVsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKLQkJLy9VTE9ORyAgIG9mZnNldDsKLQkJLy9VSU5UMzIgIFZBTFVFOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJcdD09PT5JZHggPSAlbGQsIFdjaWQ9JWQuVElEPSVkLCBSRUNfQkFfU3RhdHVzID0gJWQgXG4iLCBJZHgsCisJCSAgV2NpZCwgVElELCBwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cykpOworCS8qICovCisJLyogUHJlcGFyZSBEZWxCQSBhY3Rpb24gZnJhbWUgYW5kIHNlbmQgdG8gdGhlIHBlZXIuICovCisJLyogKi8KKwlpZiAoKFRJRCA9PSBwQkFFbnRyeS0+VElEKQorCSAgICAmJiAocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPT0gUmVjaXBpZW50X0FjY2VwdCkpIHsKKwkJc3RydWN0IHJ0X21sbWVfZGVsYmFfcmVxIERlbGJhUmVxOworCQlCT09MRUFOIENhbmNlbGxlZDsKKwkJLyp1bnNpZ25lZCBsb25nICAgb2Zmc2V0OyAqLworCQkvKnUzMiAgVkFMVUU7ICovCiAKIAkJUlRNUENhbmNlbFRpbWVyKCZwQkFFbnRyeS0+UkVDQkFUaW1lciwgJkNhbmNlbGxlZCk7CiAKLQkJLy8KLQkJLy8gMS4gU2VuZCBERUxCQSBBY3Rpb24gRnJhbWUKLQkJLy8KLQkJaWYgKGJQYXNzaXZlID09IEZBTFNFKQotCQl7Ci0JCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOwotCQkJTmRpc1plcm9NZW1vcnkoRWxlbSwgc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSkpOworCQkvKiAqLworCQkvKiAxLiBTZW5kIERFTEJBIEFjdGlvbiBGcmFtZSAqLworCQkvKiAqLworCQlpZiAoYlBhc3NpdmUgPT0gRkFMU0UpIHsKKwkJCXN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0gPQorCQkJICAgIChzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICopa21hbGxvYyhzaXplb2Yoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSksCisJCQkJCQkJTUVNX0FMTE9DX0ZMQUcpOworCQkJaWYgKEVsZW0gIT0gTlVMTCkgeworCQkJCU5kaXNaZXJvTWVtb3J5KCZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7CisJCQkJTmRpc1plcm9NZW1vcnkoRWxlbSwgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0pKTsKIAotCQkJQ09QWV9NQUNfQUREUihEZWxiYVJlcS5BZGRyLCBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHIpOwotCQkJRGVsYmFSZXEuV2NpZCA9IFdjaWQ7Ci0JCQlEZWxiYVJlcS5USUQgPSBUSUQ7Ci0JCQlEZWxiYVJlcS5Jbml0aWF0b3IgPSBSRUNJUElFTlQ7Ci0jaWYgMQotCQkJRWxlbS0+TXNnTGVuICA9IHNpemVvZihEZWxiYVJlcSk7Ci0JCQlOZGlzTW92ZU1lbW9yeShFbGVtLT5Nc2csICZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7Ci0JCQlNbG1lREVMQkFBY3Rpb24ocEFkLCBFbGVtKTsKLQkJCWtmcmVlKEVsZW0pOwotI2Vsc2UKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgQUNUSU9OX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLCBzaXplb2YoTUxNRV9ERUxCQV9SRVFfU1RSVUNUKSwgKFBWT0lEKSZEZWxiYVJlcSk7Ci0JCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Ci0jZW5kaWYKKwkJCQlDT1BZX01BQ19BRERSKERlbGJhUmVxLkFkZHIsCisJCQkJCSAgICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7CisJCQkJRGVsYmFSZXEuV2NpZCA9IFdjaWQ7CisJCQkJRGVsYmFSZXEuVElEID0gVElEOworCQkJCURlbGJhUmVxLkluaXRpYXRvciA9IFJFQ0lQSUVOVDsKKwkJCQlFbGVtLT5Nc2dMZW4gPSBzaXplb2YoRGVsYmFSZXEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KEVsZW0tPk1zZywgJkRlbGJhUmVxLAorCQkJCQkgICAgICAgc2l6ZW9mKERlbGJhUmVxKSk7CisJCQkJTWxtZURFTEJBQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJa2ZyZWUoRWxlbSk7CisJCQl9IGVsc2UgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkgKCIlcygpOmFsbG9jIG1lbW9yeSBmYWlsZWQhXG4iLAorCQkJCQkgIF9fZnVuY19fKSk7CisJCQkJcmV0dXJuOworCQkJfQogCQl9CiAKLQotCQkvLwotCQkvLyAyLiBGcmVlIHJlc291cmNlIG9mIEJBIHNlc3Npb24KLQkJLy8KLQkJLy8gZmx1c2ggYWxsIHBlbmRpbmcgcmVvcmRlcmluZyBtcGR1cworCQkvKiAqLworCQkvKiAyLiBGcmVlIHJlc291cmNlIG9mIEJBIHNlc3Npb24gKi8KKwkJLyogKi8KKwkJLyogZmx1c2ggYWxsIHBlbmRpbmcgcmVvcmRlcmluZyBtcGR1cyAqLwogCQliYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7CiAKIAkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOwogCi0JCS8vIEVyYXNlIEJpdG1hcCBmbGFnLgorCQkvKiBFcmFzZSBCaXRtYXAgZmxhZy4gKi8KIAkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBSRVNFVF9SQ1ZfU0VROwogCQlwQkFFbnRyeS0+QkFXaW5TaXplID0gMDsKLQkJLy8gRXJhc2UgQml0bWFwIGZsYWcgYXQgc29mdHdhcmUgbWFjdGFibGUKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5SWEJBYml0bWFwICY9ICh+KDE8PChwQkFFbnRyeS0+VElEKSkpOworCQkvKiBFcmFzZSBCaXRtYXAgZmxhZyBhdCBzb2Z0d2FyZSBtYWN0YWJsZSAqLworCQlwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLlJYQkFiaXRtYXAgJj0KKwkJICAgICh+KDEgPDwgKHBCQUVudHJ5LT5USUQpKSk7CiAJCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQkFSZWNXY2lkQXJyYXlbVElEXSA9IDA7CiAKLQkJUlQyOFhYX0RFTF9CQV9TRVNTSU9OX0ZST01fQVNJQyhwQWQsIFdjaWQsIFRJRCk7CisJCVJUTVBfREVMX0JBX1NFU1NJT05fRlJPTV9BU0lDKHBBZCwgV2NpZCwgVElEKTsKIAogCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CiAKQEAgLTEwMTgsMjAgKzk1NiwxNiBAQAogCUJBVGFibGVGcmVlUmVjRW50cnkocEFkLCBJZHgpOwogfQogCi1WT0lEIEJBU2Vzc2lvblRlYXJEb3duQUxMKAotCQkJCQkJIElOIE9VVCAgUFJUTVBfQURBUFRFUiBwQWQsCi0JCQkJCQkgSU4gICAgICBVQ0hBUiBXY2lkKQordm9pZCBCQVNlc3Npb25UZWFyRG93bkFMTChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IFdjaWQpCiB7CiAJaW50IGk7CiAKLQlmb3IgKGk9MDsgaTxOVU1fT0ZfVElEOyBpKyspCi0JeworCWZvciAoaSA9IDA7IGkgPCBOVU1fT0ZfVElEOyBpKyspIHsKIAkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBXY2lkLCBpLCBGQUxTRSwgRkFMU0UpOwogCQlCQVJlY1Nlc3Npb25UZWFyRG93bihwQWQsIFdjaWQsIGksIEZBTFNFKTsKIAl9CiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCURlc2NyaXB0aW9uOgpAQCAtMTA0Niw1MCArOTgwLDUwIEBACiAJCQkJRkFMU0UgLCB0aGVuIGNvbnRpbnVlIGluZGljYXRlcnggYXQgdGhpcyBtb21lbnQuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBCQU9yaVNlc3Npb25TZXR1cFRpbWVvdXQoCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQordm9pZCBCQU9yaVNlc3Npb25TZXR1cFRpbWVvdXQodm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkJICAgICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkJICAgICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLAorCQkJICAgICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKQogewotCUJBX09SSV9FTlRSWSAgICAqcEJBRW50cnkgPSAoQkFfT1JJX0VOVFJZICopRnVuY3Rpb25Db250ZXh0OwotCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OwotCVBSVE1QX0FEQVBURVIgICBwQWQ7CisJc3RydWN0IHJ0X2JhX29yaV9lbnRyeSAqcEJBRW50cnkgPSAoc3RydWN0IHJ0X2JhX29yaV9lbnRyeSAqKUZ1bmN0aW9uQ29udGV4dDsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnk7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOwogCiAJaWYgKHBCQUVudHJ5ID09IE5VTEwpCiAJCXJldHVybjsKIAogCXBBZCA9IHBCQUVudHJ5LT5wQWRhcHRlcjsKIAotCS8vIERvIG5vdGhpbmcgaWYgbW9uaXRvciBtb2RlIGlzIG9uCi0JaWYgKE1PTklUT1JfT04ocEFkKSkKLQkJcmV0dXJuOworCXsKKwkJLyogRG8gbm90aGluZyBpZiBtb25pdG9yIG1vZGUgaXMgb24gKi8KKwkJaWYgKE1PTklUT1JfT04ocEFkKSkKKwkJCXJldHVybjsKKwl9CiAKIAlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwQkFFbnRyeS0+V2NpZF07CiAKLQlpZiAoKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfV2FpdFJlcykgJiYgKHBCQUVudHJ5LT5Ub2tlbiA8IE9SSV9TRVNTSU9OX01BWF9SRVRSWSkpCi0JewotCQlNTE1FX0FEREJBX1JFUV9TVFJVQ1QgICAgQWRkYmFSZXE7CisJaWYgKChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX1dhaXRSZXMpCisJICAgICYmIChwQkFFbnRyeS0+VG9rZW4gPCBPUklfU0VTU0lPTl9NQVhfUkVUUlkpKSB7CisJCXN0cnVjdCBydF9tbG1lX2FkZGJhX3JlcSBBZGRiYVJlcTsKIAogCQlOZGlzWmVyb01lbW9yeSgmQWRkYmFSZXEsIHNpemVvZihBZGRiYVJlcSkpOwogCQlDT1BZX01BQ19BRERSKEFkZGJhUmVxLnBBZGRyLCBwRW50cnktPkFkZHIpOwotCQlBZGRiYVJlcS5XY2lkID0gKFVDSEFSKShwRW50cnktPkFpZCk7CisJCUFkZGJhUmVxLldjaWQgPSAodTgpKHBFbnRyeS0+QWlkKTsKIAkJQWRkYmFSZXEuVElEID0gcEJBRW50cnktPlRJRDsKLQkJQWRkYmFSZXEuQmFCdWZTaXplID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdDsKKwkJQWRkYmFSZXEuQmFCdWZTaXplID0KKwkJICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQ7CiAJCUFkZGJhUmVxLlRpbWVPdXRWYWx1ZSA9IDA7CiAJCUFkZGJhUmVxLlRva2VuID0gcEJBRW50cnktPlRva2VuOwotCQlNbG1lRW5xdWV1ZShwQWQsIEFDVElPTl9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BRERfQkFfQ0FURSwgc2l6ZW9mKE1MTUVfQUREQkFfUkVRX1NUUlVDVCksIChQVk9JRCkmQWRkYmFSZXEpOwotCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgT3JpIFNlc3Npb24gVGltZW91dCglZCkgdG8gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggVGlkOiVkIFdjaWQ6JWRcbiIKLQkJLHBCQUVudHJ5LT5Ub2tlbgotCQkscEVudHJ5LT5BZGRyWzBdLHBFbnRyeS0+QWRkclsxXSxwRW50cnktPkFkZHJbMl0KLQkJLHBFbnRyeS0+QWRkclszXSxwRW50cnktPkFkZHJbNF0scEVudHJ5LT5BZGRyWzVdCi0JCSxwQkFFbnRyeS0+VElELHBFbnRyeS0+QWlkKSk7CisJCU1sbWVFbnF1ZXVlKHBBZCwgQUNUSU9OX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FERF9CQV9DQVRFLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9hZGRiYV9yZXEpLCAodm9pZCAqKSYgQWRkYmFSZXEpOworCQlSVE1QX01MTUVfSEFORExFUihwQWQpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkJBIE9yaSBTZXNzaW9uIFRpbWVvdXQoJWQpIDogU2VuZCBBREQgQkEgYWdhaW5cbiIsCisJCQkgIHBCQUVudHJ5LT5Ub2tlbikpOworCiAJCXBCQUVudHJ5LT5Ub2tlbisrOwogCQlSVE1QU2V0VGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCBPUklfQkFfU0VTU0lPTl9USU1FT1VUKTsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlCQVRhYmxlRnJlZU9yaUVudHJ5KHBBZCwgcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtwQkFFbnRyeS0+VElEXSk7CiAJfQogfQpAQCAtMTEwOCw0MTkgKzEwNDIsMzgzIEBACiAJCQkJRkFMU0UgLCB0aGVuIGNvbnRpbnVlIGluZGljYXRlcnggYXQgdGhpcyBtb21lbnQuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBCQVJlY1Nlc3Npb25JZGxlVGltZW91dCgKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0gICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit2b2lkIEJBUmVjU2Vzc2lvbklkbGVUaW1lb3V0KHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJCSAgICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkJICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMykKIHsKIAotCUJBX1JFQ19FTlRSWSAgICAqcEJBRW50cnkgPSAoQkFfUkVDX0VOVFJZICopRnVuY3Rpb25Db250ZXh0OwotCVBSVE1QX0FEQVBURVIgICBwQWQ7Ci0JVUxPTkcgICAgICAgICAgIE5vdzMyOworCXN0cnVjdCBydF9iYV9yZWNfZW50cnkgKnBCQUVudHJ5ID0gKHN0cnVjdCBydF9iYV9yZWNfZW50cnkgKilGdW5jdGlvbkNvbnRleHQ7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCXVuc2lnbmVkIGxvbmcgTm93MzI7CiAKIAlpZiAocEJBRW50cnkgPT0gTlVMTCkKIAkJcmV0dXJuOwogCi0JaWYgKChwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9PSBSZWNpcGllbnRfQWNjZXB0KSkKLQl7CisJaWYgKChwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9PSBSZWNpcGllbnRfQWNjZXB0KSkgewogCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3czMik7CiAKLQkJaWYgKFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciArIFJFQ19CQV9TRVNTSU9OX0lETEVfVElNRU9VVCkpKQotCQl7CisJCWlmIChSVE1QX1RJTUVfQUZURVIKKwkJICAgICgodW5zaWduZWQgbG9uZylOb3czMiwKKwkJICAgICAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyICsKKwkJCQkgICAgIFJFQ19CQV9TRVNTSU9OX0lETEVfVElNRU9VVCkpKSB7CiAJCQlwQWQgPSBwQkFFbnRyeS0+cEFkYXB0ZXI7Ci0JCQkvLyBmbHVzaCBhbGwgcGVuZGluZyByZW9yZGVyaW5nIG1wZHVzCisJCQkvKiBmbHVzaCBhbGwgcGVuZGluZyByZW9yZGVyaW5nIG1wZHVzICovCiAJCQliYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7Ci0JCQlwcmludGsoIiVsZDogUkVDIEJBIHNlc3Npb24gVGltZW91dFxuIiwgTm93MzIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLAorCQkJCSAoIiVsZDogUkVDIEJBIHNlc3Npb24gVGltZW91dFxuIiwgTm93MzIpKTsKIAkJfQogCX0KIH0KIAotCi1WT0lEIFBlZXJBZGRCQVJlcUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi0KK3ZvaWQgUGVlckFkZEJBUmVxQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQkvLwk3LjQuNC4xCi0JLy9VTE9ORwlJZHg7Ci0JVUNIQVIgICBTdGF0dXMgPSAxOwotCVVDSEFSICAgcEFkZHJbNl07Ci0JRlJBTUVfQUREQkFfUlNQIEFERGZyYW1lOwotCVBVQ0hBUiAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOwotCVBGUkFNRV9BRERCQV9SRVEgIHBBZGRyZXFGcmFtZSA9IE5VTEw7Ci0JLy9VQ0hBUgkJQnVmU2l6ZTsKLQlVTE9ORyAgICAgICBGcmFtZUxlbjsKLQlQVUxPTkcgICAgICBwdGVtcDsKLQlQTUFDX1RBQkxFX0VOVFJZCXBNYWNFbnRyeTsKKwkvKiAgICAgIDcuNC40LjEgKi8KKwkvKnVuc2lnbmVkIGxvbmcgSWR4OyAqLworCXU4IFN0YXR1cyA9IDE7CisJdTggcEFkZHJbNl07CisJc3RydWN0IHJ0X2ZyYW1lX2FkZGJhX3JzcCBBRERmcmFtZTsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJaW50IE5TdGF0dXM7CisJc3RydWN0IHJ0X2ZyYW1lX2FkZGJhX3JlcSAqIHBBZGRyZXFGcmFtZSA9IE5VTEw7CisJLyp1OCAgICAgICAgIEJ1ZlNpemU7ICovCisJdW5zaWduZWQgbG9uZyBGcmFtZUxlbjsKKwl1bnNpZ25lZCBsb25nICpwdGVtcDsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwTWFjRW50cnk7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA9PT4gKFdjaWQgPSAlZClcbiIsIF9fZnVuY19fLCBFbGVtLT5XY2lkKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIiVzID09PiAoV2NpZCA9ICVkKVxuIiwgX19mdW5jX18sIEVsZW0tPldjaWQpKTsKIAotCS8vaGV4X2R1bXAoIkFkZEJBUmVxIiwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4pOworCS8qaGV4X2R1bXAoIkFkZEJBUmVxIiwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4pOyAqLwogCi0JLy9BRERCQSBSZXF1ZXN0IGZyb20gdW5rbm93biBwZWVyLCBpZ25vcmUgdGhpcy4KKwkvKkFEREJBIFJlcXVlc3QgZnJvbSB1bmtub3duIHBlZXIsIGlnbm9yZSB0aGlzLiAqLwogCWlmIChFbGVtLT5XY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQogCQlyZXR1cm47CiAKIAlwTWFjRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gUGVlckFkZEJBUmVxQWN0aW9uLS0tLT4gXG4iKSk7Ci0JcHRlbXAgPSAoUFVMT05HKUVsZW0tPk1zZzsKLQkvL0RCR1BSSU5UX1JBVyhSVF9ERUJVR19FTVUsICgiJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4XG4iLCAqKHB0ZW1wKSwgKihwdGVtcCsxKSwgKihwdGVtcCsyKSwgKihwdGVtcCszKSwgKihwdGVtcCs0KSwgKihwdGVtcCs1KSwgKihwdGVtcCs2KSwgKihwdGVtcCs3KSwgKihwdGVtcCs4KSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJBIC0gUGVlckFkZEJBUmVxQWN0aW9uLS0tLT4gXG4iKSk7CisJcHRlbXAgPSAodW5zaWduZWQgbG9uZyAqKUVsZW0tPk1zZzsKKwkvKkRCR1BSSU5UX1JBVyhSVF9ERUJVR19FTVUsICgiJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4XG4iLCAqKHB0ZW1wKSwgKihwdGVtcCsxKSwgKihwdGVtcCsyKSwgKihwdGVtcCszKSwgKihwdGVtcCs0KSwgKihwdGVtcCs1KSwgKihwdGVtcCs2KSwgKihwdGVtcCs3KSwgKihwdGVtcCs4KSkpOyAqLwogCi0JaWYgKFBlZXJBZGRCQVJlcUFjdGlvblNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBwQWRkcikpCi0JeworCWlmIChQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgcEFkZHIpKSB7CiAKLQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID09IEZBTFNFKSAmJiBJU19IVF9TVEEocE1hY0VudHJ5KSkKLQkJewotCQkJcEFkZHJlcUZyYW1lID0gKFBGUkFNRV9BRERCQV9SRVEpKCZFbGVtLT5Nc2dbMF0pOwotCQkJcHJpbnRrKCJSY3YgV2NpZCglZCkgQWRkQkFSZXFcbiIsIEVsZW0tPldjaWQpOwotCQkJaWYgKEJBUmVjU2Vzc2lvbkFkZChwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLCBwQWRkcmVxRnJhbWUpKQorCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPT0gRkFMU0UpCisJCSAgICAmJiBJU19IVF9TVEEocE1hY0VudHJ5KSkgeworCQkJcEFkZHJlcUZyYW1lID0gKHN0cnVjdCBydF9mcmFtZV9hZGRiYV9yZXEgKikgKCZFbGVtLT5Nc2dbMF0pOworCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLAorCQkJCSAoIlJjdiBXY2lkKCVkKSBBZGRCQVJlcVxuIiwgRWxlbS0+V2NpZCkpOworCQkJaWYgKEJBUmVjU2Vzc2lvbkFkZAorCQkJICAgIChwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLAorCQkJICAgICBwQWRkcmVxRnJhbWUpKQogCQkJCVN0YXR1cyA9IDA7CiAJCQllbHNlCi0JCQkJU3RhdHVzID0gMzg7IC8vIG1vcmUgcGFyYW1ldGVycyBoYXZlIGludmFsaWQgdmFsdWVzCi0JCX0KLQkJZWxzZQotCQl7Ci0JCQlTdGF0dXMgPSAzNzsgLy8gdGhlIHJlcXVlc3QgaGFzIGJlZW4gZGVjbGluZWQuCisJCQkJU3RhdHVzID0gMzg7CS8qIG1vcmUgcGFyYW1ldGVycyBoYXZlIGludmFsaWQgdmFsdWVzICovCisJCX0gZWxzZSB7CisJCQlTdGF0dXMgPSAzNzsJLyogdGhlIHJlcXVlc3QgaGFzIGJlZW4gZGVjbGluZWQuICovCiAJCX0KIAl9CiAKIAlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5WYWxpZEFzQ0xJKQogCQlBU1NFUlQocEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5Tc3QgPT0gU1NUX0FTU09DKTsKIAotCXBBZGRyZXFGcmFtZSA9IChQRlJBTUVfQUREQkFfUkVRKSgmRWxlbS0+TXNnWzBdKTsKLQkvLyAyLiBBbHdheXMgc2VuZCBiYWNrIEFEREJBIFJlc3BvbnNlCi0JTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSBQZWVyQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCXBBZGRyZXFGcmFtZSA9IChzdHJ1Y3QgcnRfZnJhbWVfYWRkYmFfcmVxICopICgmRWxlbS0+TXNnWzBdKTsKKwkvKiAyLiBBbHdheXMgc2VuZCBiYWNrIEFEREJBIFJlc3BvbnNlICovCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJLypHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeSAqLworCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJBQ1RJT04gLSBQZWVyQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOwogCQlyZXR1cm47CiAJfQogCi0JTmRpc1plcm9NZW1vcnkoJkFERGZyYW1lLCBzaXplb2YoRlJBTUVfQUREQkFfUlNQKSk7CisJTmRpc1plcm9NZW1vcnkoJkFERGZyYW1lLCBzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2FkZGJhX3JzcCkpOwogCi0JLy8gMi0xLiBQcmVwYXJlIEFEREJBIFJlc3BvbnNlIGZyYW1lLgorCS8qIDItMS4gUHJlcGFyZSBBRERCQSBSZXNwb25zZSBmcmFtZS4gKi8KIAl7CiAJCWlmIChBREhPQ19PTihwQWQpKQotCQkJQWN0SGVhZGVySW5pdChwQWQsICZBRERmcmFtZS5IZHIsIHBBZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkFERGZyYW1lLkhkciwgcEFkZHIsCisJCQkJICAgICAgcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJCQkgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CiAJCWVsc2UKLQkJCUFjdEhlYWRlckluaXQocEFkLCAmQUREZnJhbWUuSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkZHIpOworCQkJQWN0SGVhZGVySW5pdChwQWQsICZBRERmcmFtZS5IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQkJCSAgICAgIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZGRyKTsKIAl9CiAKIAlBRERmcmFtZS5DYXRlZ29yeSA9IENBVEVHT1JZX0JBOwogCUFERGZyYW1lLkFjdGlvbiA9IEFEREJBX1JFU1A7CiAJQUREZnJhbWUuVG9rZW4gPSBwQWRkcmVxRnJhbWUtPlRva2VuOwotCS8vIFdoYXQgaXMgdGhlIFN0YXR1cyBjb2RlPz8gIG5lZWQgdG8gY2hlY2suCisJLyogV2hhdCBpcyB0aGUgU3RhdHVzIGNvZGU/PyAgbmVlZCB0byBjaGVjay4gKi8KIAlBRERmcmFtZS5TdGF0dXNDb2RlID0gU3RhdHVzOwogCUFERGZyYW1lLkJhUGFybS5CQVBvbGljeSA9IElNTUVEX0JBOwogCUFERGZyYW1lLkJhUGFybS5BTVNEVVN1cHBvcnRlZCA9IDA7CiAJQUREZnJhbWUuQmFQYXJtLlRJRCA9IHBBZGRyZXFGcmFtZS0+QmFQYXJtLlRJRDsKLQlBRERmcmFtZS5CYVBhcm0uQnVmU2l6ZSA9IG1pbigoKFVDSEFSKXBBZGRyZXFGcmFtZS0+QmFQYXJtLkJ1ZlNpemUpLCAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCk7Ci0JaWYgKEFERGZyYW1lLkJhUGFybS5CdWZTaXplID09IDApCi0JeworCUFERGZyYW1lLkJhUGFybS5CdWZTaXplID0KKwkgICAgbWluKCgodTgpcEFkZHJlcUZyYW1lLT5CYVBhcm0uQnVmU2l6ZSksCisJCSh1OClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0KTsKKwlpZiAoQUREZnJhbWUuQmFQYXJtLkJ1ZlNpemUgPT0gMCkgewogCQlBRERmcmFtZS5CYVBhcm0uQnVmU2l6ZSA9IDY0OwogCX0KLQlBRERmcmFtZS5UaW1lT3V0VmFsdWUgPSAwOyAvL3BBZGRyZXFGcmFtZS0+VGltZU91dFZhbHVlOworCUFERGZyYW1lLlRpbWVPdXRWYWx1ZSA9IDA7CS8qcEFkZHJlcUZyYW1lLT5UaW1lT3V0VmFsdWU7ICovCiAKLQkqKFVTSE9SVCAqKSgmQUREZnJhbWUuQmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZBRERmcmFtZS5CYVBhcm0pKTsKKwkqKHUxNiAqKSAoJkFERGZyYW1lLkJhUGFybSkgPQorCSAgICBjcHUybGUxNigqKHUxNiAqKSAoJkFERGZyYW1lLkJhUGFybSkpOwogCUFERGZyYW1lLlN0YXR1c0NvZGUgPSBjcHUybGUxNihBRERmcmFtZS5TdGF0dXNDb2RlKTsKIAlBRERmcmFtZS5UaW1lT3V0VmFsdWUgPSBjcHUybGUxNihBRERmcmFtZS5UaW1lT3V0VmFsdWUpOwogCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCi0JCQkJCSAgc2l6ZW9mKEZSQU1FX0FEREJBX1JTUCksICAmQUREZnJhbWUsCi0JCQkgIEVORF9PRl9BUkdTKTsKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAmRnJhbWVMZW4sCisJCQkgIHNpemVvZihzdHJ1Y3QgcnRfZnJhbWVfYWRkYmFfcnNwKSwgJkFERGZyYW1lLCBFTkRfT0ZfQVJHUyk7CiAJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIAlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoJWQpOiBUSUQoJWQpLCBCdWZTaXplKCVkKSA8PT0gXG4iLCBfX2Z1bmNfXywgRWxlbS0+V2NpZCwgQUREZnJhbWUuQmFQYXJtLlRJRCwKLQkJCQkJCQkgIEFERGZyYW1lLkJhUGFybS5CdWZTaXplKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIiVzKCVkKTogVElEKCVkKSwgQnVmU2l6ZSglZCkgPD09IFxuIiwgX19mdW5jX18sIEVsZW0tPldjaWQsCisJCSAgQUREZnJhbWUuQmFQYXJtLlRJRCwgQUREZnJhbWUuQmFQYXJtLkJ1ZlNpemUpKTsKIH0KIAotCi1WT0lEIFBlZXJBZGRCQVJzcEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi0KK3ZvaWQgUGVlckFkZEJBUnNwQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQkvL1VDSEFSCQlJZHgsIGk7Ci0JLy9QVUNIQVIJCSAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCVBGUkFNRV9BRERCQV9SU1AgICAgcEZyYW1lID0gTlVMTDsKLQkvL1BCQV9PUklfRU5UUlkJCXBCQUVudHJ5OworCS8qdTggICAgICAgICBJZHgsIGk7ICovCisJLyp1OCAqICAgICAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7ICovCisJc3RydWN0IHJ0X2ZyYW1lX2FkZGJhX3JzcCAqIHBGcmFtZSA9IE5VTEw7CisJLypzdHJ1Y3QgcnRfYmFfb3JpX2VudHJ5ICpwQkFFbnRyeTsgKi8KIAotCS8vQUREQkEgUmVzcG9uc2UgZnJvbSB1bmtub3duIHBlZXIsIGlnbm9yZSB0aGlzLgorCS8qQUREQkEgUmVzcG9uc2UgZnJvbSB1bmtub3duIHBlZXIsIGlnbm9yZSB0aGlzLiAqLwogCWlmIChFbGVtLT5XY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQogCQlyZXR1cm47CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA9PT4gV2NpZCglZClcbiIsIF9fZnVuY19fLCBFbGVtLT5XY2lkKSk7CiAKLQkvL2hleF9kdW1wKCJQZWVyQWRkQkFSc3BBY3Rpb24oKSIsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKTsKKwkvKmhleF9kdW1wKCJQZWVyQWRkQkFSc3BBY3Rpb24oKSIsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKTsgKi8KIAotCWlmIChQZWVyQWRkQkFSc3BBY3Rpb25TYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikpCi0JewotCQlwRnJhbWUgPSAoUEZSQU1FX0FEREJBX1JTUCkoJkVsZW0tPk1zZ1swXSk7CisJaWYgKFBlZXJBZGRCQVJzcEFjdGlvblNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKSkgeworCQlwRnJhbWUgPSAoc3RydWN0IHJ0X2ZyYW1lX2FkZGJhX3JzcCAqKSAoJkVsZW0tPk1zZ1swXSk7CiAKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiXHRcdCBTdGF0dXNDb2RlID0gJWRcbiIsIHBGcmFtZS0+U3RhdHVzQ29kZSkpOwotCQlzd2l0Y2ggKHBGcmFtZS0+U3RhdHVzQ29kZSkKLQkJewotCQkJY2FzZSAwOgotCQkJCS8vIEkgd2FudCBhIEJBc2Vzc2lvbiB3aXRoIHRoaXMgcGVlciBhcyBhbiBvcmlnaW5hdG9yLgotCQkJCUJBT3JpU2Vzc2lvbkFkZChwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLCBwRnJhbWUpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQkvLyBjaGVjayBzdGF0dXMgPT0gVVNFRCA/Pz8KLQkJCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWQsIEVsZW0tPldjaWQsIHBGcmFtZS0+QmFQYXJtLlRJRCwgVFJVRSwgRkFMU0UpOwotCQkJCWJyZWFrOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlx0XHQgU3RhdHVzQ29kZSA9ICVkXG4iLCBwRnJhbWUtPlN0YXR1c0NvZGUpKTsKKwkJc3dpdGNoIChwRnJhbWUtPlN0YXR1c0NvZGUpIHsKKwkJY2FzZSAwOgorCQkJLyogSSB3YW50IGEgQkFzZXNzaW9uIHdpdGggdGhpcyBwZWVyIGFzIGFuIG9yaWdpbmF0b3IuICovCisJCQlCQU9yaVNlc3Npb25BZGQocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXSwKKwkJCQkJcEZyYW1lKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogY2hlY2sgc3RhdHVzID09IFVTRUQgPz8/ICovCisJCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWQsIEVsZW0tPldjaWQsCisJCQkJCSAgICAgcEZyYW1lLT5CYVBhcm0uVElELCBUUlVFLCBGQUxTRSk7CisJCQlicmVhazsKIAkJfQotCQkvLyBSY3YgRGVjbGluZSBTdGF0dXNDb2RlCisJCS8qIFJjdiBEZWNsaW5lIFN0YXR1c0NvZGUgKi8KIAkJaWYgKChwRnJhbWUtPlN0YXR1c0NvZGUgPT0gMzcpCi0gICAgICAgICAgICB8fCAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIFNUQV9UR05fV0lGSV9PTihwQWQpICYmIChwRnJhbWUtPlN0YXR1c0NvZGUgIT0gMCkpCi0gICAgICAgICAgICApCi0JCXsKLQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uQkFEZWNsaW5lQml0bWFwIHw9IDE8PHBGcmFtZS0+QmFQYXJtLlRJRDsKKwkJICAgIHx8ICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgU1RBX1RHTl9XSUZJX09OKHBBZCkKKwkJCSYmIChwRnJhbWUtPlN0YXR1c0NvZGUgIT0gMCkpCisJCSAgICApIHsKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uQkFEZWNsaW5lQml0bWFwIHw9CisJCQkgICAgMSA8PCBwRnJhbWUtPkJhUGFybS5USUQ7CiAJCX0KIAl9CiB9CiAKLVZPSUQgUGVlckRlbEJBQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLQordm9pZCBQZWVyRGVsQkFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCS8vVUNIQVIJCQkJSWR4OwotCS8vUFVDSEFSCQkJCXBPdXRCdWZmZXIgPSBOVUxMOwotCVBGUkFNRV9ERUxCQV9SRVEgICAgcERlbEZyYW1lID0gTlVMTDsKKwkvKnU4ICAgICAgICAgICAgICAgICAgICAgICAgIElkeDsgKi8KKwkvKnU4ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7ICovCisJc3RydWN0IHJ0X2ZyYW1lX2RlbGJhX3JlcSAqIHBEZWxGcmFtZSA9IE5VTEw7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzID09PlxuIiwgX19mdW5jX18pKTsKLQkvL0RFTEJBIFJlcXVlc3QgZnJvbSB1bmtub3duIHBlZXIsIGlnbm9yZSB0aGlzLgotCWlmIChQZWVyRGVsQkFBY3Rpb25TYW5pdHkocEFkLCBFbGVtLT5XY2lkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikpCi0JewotCQlwRGVsRnJhbWUgPSAoUEZSQU1FX0RFTEJBX1JFUSkoJkVsZW0tPk1zZ1swXSk7Ci0JCWlmIChwRGVsRnJhbWUtPkRlbGJhUGFybS5Jbml0aWF0b3IgPT0gT1JJR0lOQVRPUikKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSAtIFBlZXJEZWxCQUFjdGlvbi0tLS0+IE9SSUdJTkFUT1JcbiIpKTsKLQkJCUJBUmVjU2Vzc2lvblRlYXJEb3duKHBBZCwgRWxlbS0+V2NpZCwgcERlbEZyYW1lLT5EZWxiYVBhcm0uVElELCBUUlVFKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBQZWVyRGVsQkFBY3Rpb24tLS0tPiBSRUNJUElFTlQsIFJlYXNvbiA9ICVkXG4iLCAgcERlbEZyYW1lLT5SZWFzb25Db2RlKSk7Ci0JCQkvL2hleF9kdW1wKCJEZWxCQSBGcmFtZSIsIHBEZWxGcmFtZSwgRWxlbS0+TXNnTGVuKTsKLQkJCUJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZCwgRWxlbS0+V2NpZCwgcERlbEZyYW1lLT5EZWxiYVBhcm0uVElELCBUUlVFLCBGQUxTRSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgPT0+XG4iLCBfX2Z1bmNfXykpOworCS8qREVMQkEgUmVxdWVzdCBmcm9tIHVua25vd24gcGVlciwgaWdub3JlIHRoaXMuICovCisJaWYgKFBlZXJEZWxCQUFjdGlvblNhbml0eShwQWQsIEVsZW0tPldjaWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKSkgeworCQlwRGVsRnJhbWUgPSAoc3RydWN0IHJ0X2ZyYW1lX2RlbGJhX3JlcSAqKSAoJkVsZW0tPk1zZ1swXSk7CisJCWlmIChwRGVsRnJhbWUtPkRlbGJhUGFybS5Jbml0aWF0b3IgPT0gT1JJR0lOQVRPUikgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQkEgLSBQZWVyRGVsQkFBY3Rpb24tLS0tPiBPUklHSU5BVE9SXG4iKSk7CisJCQlCQVJlY1Nlc3Npb25UZWFyRG93bihwQWQsIEVsZW0tPldjaWQsCisJCQkJCSAgICAgcERlbEZyYW1lLT5EZWxiYVBhcm0uVElELCBUUlVFKTsKKwkJfSBlbHNlIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkJBIC0gUGVlckRlbEJBQWN0aW9uLS0tLT4gUkVDSVBJRU5ULCBSZWFzb24gPSAlZFxuIiwKKwkJCQkgIHBEZWxGcmFtZS0+UmVhc29uQ29kZSkpOworCQkJLypoZXhfZHVtcCgiRGVsQkEgRnJhbWUiLCBwRGVsRnJhbWUsIEVsZW0tPk1zZ0xlbik7ICovCisJCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWQsIEVsZW0tPldjaWQsCisJCQkJCSAgICAgcERlbEZyYW1lLT5EZWxiYVBhcm0uVElELCBUUlVFLAorCQkJCQkgICAgIEZBTFNFKTsKIAkJfQogCX0KIH0KIAotCi1CT09MRUFOIENudGxFbnF1ZXVlRm9yUmVjdigKLQkJCQkJCSAgSU4gUFJUTVBfQURBUFRFUgkJcEFkLAotCQkJCQkJICBJTiBVTE9ORwkJCQlXY2lkLAotCQkJCQkJICBJTiBVTE9ORwkJCQlNc2dMZW4sCi0JCQkJCQkgIElOIFBGUkFNRV9CQV9SRVEJCXBNc2cpCitCT09MRUFOIENudGxFbnF1ZXVlRm9yUmVjdihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB1bnNpZ25lZCBsb25nIFdjaWQsCisJCQkgICB1bnNpZ25lZCBsb25nIE1zZ0xlbiwgc3RydWN0IHJ0X2ZyYW1lX2JhX3JlcSAqIHBNc2cpCiB7Ci0JUEZSQU1FX0JBX1JFUSAgIHBGcmFtZSA9IHBNc2c7Ci0JLy9QUlRNUF9SRU9SREVSQlVGCXBCdWZmZXI7Ci0JLy9QUlRNUF9SRU9SREVSQlVGCXBEbWFCdWY7Ci0JUEJBX1JFQ19FTlRSWSBwQkFFbnRyeTsKLQkvL0JPT0xFQU4gCVJlc3VsdDsKLQlVTE9ORyAgIElkeDsKLQkvL1VDSEFSCU51bVJ4UGt0OwotCVVDSEFSCVRJRDsvLywgaTsKKwlzdHJ1Y3QgcnRfZnJhbWVfYmFfcmVxICogcEZyYW1lID0gcE1zZzsKKwkvKlBSVE1QX1JFT1JERVJCVUYgICAgICBwQnVmZmVyOyAqLworCS8qUFJUTVBfUkVPUkRFUkJVRiAgICAgIHBEbWFCdWY7ICovCisJc3RydWN0IHJ0X2JhX3JlY19lbnRyeSAqcEJBRW50cnk7CisJLypCT09MRUFOICAgICAgIFJlc3VsdDsgKi8KKwl1bnNpZ25lZCBsb25nIElkeDsKKwkvKnU4IE51bVJ4UGt0OyAqLworCXU4IFRJRDsJCS8qLCBpOyAqLwogCi0JVElEID0gKFVDSEFSKXBGcmFtZS0+QkFSQ29udHJvbC5USUQ7CisJVElEID0gKHU4KXBGcmFtZS0+QkFSQ29udHJvbC5USUQ7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpOiBCQVItV2NpZCglbGQpLCBUaWQgKCVkKVxuIiwgX19mdW5jX18sIFdjaWQsIFRJRCkpOwotCS8vaGV4X2R1bXAoIkJBUiIsIChQQ0hBUikgcEZyYW1lLCBNc2dMZW4pOwotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIiVzKCk6IEJBUi1XY2lkKCVsZCksIFRpZCAoJWQpXG4iLCBfX2Z1bmNfXywgV2NpZCwgVElEKSk7CisJLypoZXhfZHVtcCgiQkFSIiwgKGNoYXIgKilwRnJhbWUsIE1zZ0xlbik7ICovCisJLyogRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuICovCisJLyogVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0ICovCisJaWYgKFJUTVBfVEVTVF9GTEFHCisJICAgIChwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCiAJCXJldHVybiBGQUxTRTsKIAotCS8vIEZpcnN0IGNoZWNrIHRoZSBzaXplLCBpdCBNVVNUIG5vdCBleGNlZWQgdGhlIG1sbWUgcXVldWUgc2l6ZQotCWlmIChNc2dMZW4gPiBNR01UX0RNQV9CVUZGRVJfU0laRSkKLQl7CisJLyogRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplICovCisJaWYgKE1zZ0xlbiA+IE1HTVRfRE1BX0JVRkZFUl9TSVpFKSB7CiAJCURCR1BSSU5UX0VSUigoIkNudGxFbnF1ZXVlRm9yUmVjdjogZnJhbWUgdG9vIGxhcmdlLCBzaXplID0gJWxkIFxuIiwgTXNnTGVuKSk7CiAJCXJldHVybiBGQUxTRTsKLQl9Ci0JZWxzZSBpZiAoTXNnTGVuICE9IHNpemVvZihGUkFNRV9CQV9SRVEpKQotCXsKKwl9IGVsc2UgaWYgKE1zZ0xlbiAhPSBzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2JhX3JlcSkpIHsKIAkJREJHUFJJTlRfRVJSKCgiQ250bEVucXVldWVGb3JSZWN2OiBCbG9ja0FjayBSZXF1ZXN0IGZyYW1lIGxlbmd0aCBzaXplID0gJWxkIGluY29ycmVjdFxuIiwgTXNnTGVuKSk7CiAJCXJldHVybiBGQUxTRTsKLQl9Ci0JZWxzZSBpZiAoTXNnTGVuICE9IHNpemVvZihGUkFNRV9CQV9SRVEpKQotCXsKKwl9IGVsc2UgaWYgKE1zZ0xlbiAhPSBzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2JhX3JlcSkpIHsKIAkJREJHUFJJTlRfRVJSKCgiQ250bEVucXVldWVGb3JSZWN2OiBCbG9ja0FjayBSZXF1ZXN0IGZyYW1lIGxlbmd0aCBzaXplID0gJWxkIGluY29ycmVjdFxuIiwgTXNnTGVuKSk7CiAJCXJldHVybiBGQUxTRTsKIAl9CiAKLQlpZiAoKFdjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSkgJiYgKFRJRCA8IDgpKQotCQl7Ci0JCS8vIGlmIHRoaXMgcmVjZWl2aW5nIHBhY2tldCBpcyBmcm9tIFNBIHRoYXQgaXMgaW4gb3VyIE9yaUVudHJ5LiBTaW5jZSBXQ0lEIDw5IGhhcyBkaXJlY3QgbWFwcGluZy4gbm8gbmVlZCBzZWFyY2guCisJaWYgKChXY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpICYmIChUSUQgPCA4KSkgeworCQkvKiBpZiB0aGlzIHJlY2VpdmluZyBwYWNrZXQgaXMgZnJvbSBTQSB0aGF0IGlzIGluIG91ciBPcmlFbnRyeS4gU2luY2UgV0NJRCA8OSBoYXMgZGlyZWN0IG1hcHBpbmcuIG5vIG5lZWQgc2VhcmNoLiAqLwogCQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkJBUmVjV2NpZEFycmF5W1RJRF07CiAJCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W0lkeF07Ci0JCX0KLQkJZWxzZQotCQl7CisJfSBlbHNlIHsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJBUiglbGQpIDogVGlkICglZCkgLSAlMDR4OiUwNHhcbiIsIFdjaWQsIFRJRCwgcEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxLCBwQkFFbnRyeS0+TGFzdEluZFNlcSApKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiQkFSKCVsZCkgOiBUaWQgKCVkKSAtICUwNHg6JTA0eFxuIiwgV2NpZCwgVElELAorCQkgIHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSwgcEJBRW50cnktPkxhc3RJbmRTZXEpKTsKIAotCWlmIChTRVFfU01BTExFUihwQkFFbnRyeS0+TGFzdEluZFNlcSwgcEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxLCBNQVhTRVEpKQotCXsKLQkJLy9wcmludGsoIkJBUiBTZXEgPSAleCwgTGFzdEluZFNlcSA9ICV4XG4iLCBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEsIHBCQUVudHJ5LT5MYXN0SW5kU2VxKTsKLQkJYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19sZV9zZXEocEFkLCBwQkFFbnRyeSwgcEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxKTsKLQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSAocEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxID09IDApID8gTUFYU0VRIDoocEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxIC0xKTsKKwlpZiAoU0VRX1NNQUxMRVIKKwkgICAgKHBCQUVudHJ5LT5MYXN0SW5kU2VxLCBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEsCisJICAgICBNQVhTRVEpKSB7CisJCS8qREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkFSIFNlcSA9ICV4LCBMYXN0SW5kU2VxID0gJXhcbiIsIHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSwgcEJBRW50cnktPkxhc3RJbmRTZXEpKTsgKi8KKwkJYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19sZV9zZXEocEFkLCBwQkFFbnRyeSwKKwkJCQkJCSAgICBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuCisJCQkJCQkgICAgU3RhcnRTZXEpOworCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9CisJCSAgICAocEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxID09CisJCSAgICAgMCkgPyBNQVhTRVEgOiAocEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxIC0gMSk7CiAJfQotCS8vYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOworCS8qYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOyAqLwogCXJldHVybiBUUlVFOwogfQogCiAvKgogRGVzY3JpcHRpb24gOiBTZW5kIFBTTVAgQWN0aW9uIGZyYW1lIElmIFBTTVAgbW9kZSBzd2l0Y2hlcy4KICovCi1WT0lEIFNlbmRQU01QQWN0aW9uKAotCQkJCSAgIElOIFBSVE1QX0FEQVBURVIJCXBBZCwKLQkJCQkgICBJTiBVQ0hBUgkJCQlXY2lkLAotCQkJCSAgIElOIFVDSEFSCQkJCVBzbXApCit2b2lkIFNlbmRQU01QQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggV2NpZCwgdTggUHNtcCkKIHsKLQlQVUNIQVIgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7Ci0JLy9VTE9ORyAgICAgICAgICAgSWR4OwotCUZSQU1FX1BTTVBfQUNUSU9OICAgRnJhbWU7Ci0JVUxPTkcgICAgICAgICAgIEZyYW1lTGVuOwotCVVDSEFSCQkJYmJwZGF0YT0wOwotCVVJTlQzMgkJCW1hY2RhdGE7CisJdTggKnBPdXRCdWZmZXIgPSBOVUxMOworCWludCBOU3RhdHVzOworCS8qdW5zaWduZWQgbG9uZyAgICAgICAgICAgSWR4OyAqLworCXN0cnVjdCBydF9mcmFtZV9wc21wX2FjdGlvbiBGcmFtZTsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuOwogCi0JTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJCQSAtIE1sbWVBRERCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJLypHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeSAqLworCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJCQSAtIE1sbWVBRERCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CiAJCXJldHVybjsKIAl9CiAKLQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7CisJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQkgICAgICBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHIpOwogCiAJRnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9IVDsKIAlGcmFtZS5BY3Rpb24gPSBTTVBTX0FDVElPTjsKLQlzd2l0Y2ggKFBzbXApCi0JewotCQljYXNlIE1NUFNfRU5BQkxFOgotCQkJaWYgKElTX1JUMzA5MChwQWQpKQotCQkJewotCQkJCS8vIGRpc2FibGUgTU1QUyBCQlAgY29udHJvbCByZWdpc3RlcgotCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJmJicGRhdGEpOwotCQkJCWJicGRhdGEgJj0gfigweDA0KTsJLy9iaXQgMgotCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIGJicGRhdGEpOwotCi0JCQkJLy8gZGlzYWJsZSBNTVBTIE1BQyBjb250cm9sIHJlZ2lzdGVyCi0JCQkJUlRNUF9JT19SRUFEMzIocEFkLCAweDEyMTAsICZtYWNkYXRhKTsKLQkJCQltYWNkYXRhICY9IH4oMHgwOSk7CS8vYml0IDAsIDMKLQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCAweDEyMTAsIG1hY2RhdGEpOwotCQkJfQotCQkJRnJhbWUuUHNtcCA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSBNTVBTX0RZTkFNSUM6Ci0JCQlpZiAoSVNfUlQzMDkwKHBBZCkpCi0JCQl7Ci0JCQkJLy8gZW5hYmxlIE1NUFMgQkJQIGNvbnRyb2wgcmVnaXN0ZXIKLQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZiYnBkYXRhKTsKLQkJCQliYnBkYXRhIHw9IDB4MDQ7CS8vYml0IDIKLQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBiYnBkYXRhKTsKLQotCQkJCS8vIGVuYWJsZSBNTVBTIE1BQyBjb250cm9sIHJlZ2lzdGVyCi0JCQkJUlRNUF9JT19SRUFEMzIocEFkLCAweDEyMTAsICZtYWNkYXRhKTsKLQkJCQltYWNkYXRhIHw9IDB4MDk7CS8vYml0IDAsIDMKLQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCAweDEyMTAsIG1hY2RhdGEpOwotCQkJfQotCQkJRnJhbWUuUHNtcCA9IDM7Ci0JCQlicmVhazsKLQkJY2FzZSBNTVBTX1NUQVRJQzoKLQkJCWlmIChJU19SVDMwOTAocEFkKSkKLQkJCXsKLQkJCQkvLyBlbmFibGUgTU1QUyBCQlAgY29udHJvbCByZWdpc3RlcgotCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJmJicGRhdGEpOwotCQkJCWJicGRhdGEgfD0gMHgwNDsJLy9iaXQgMgotCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIGJicGRhdGEpOwotCi0JCQkJLy8gZW5hYmxlIE1NUFMgTUFDIGNvbnRyb2wgcmVnaXN0ZXIKLQkJCQlSVE1QX0lPX1JFQUQzMihwQWQsIDB4MTIxMCwgJm1hY2RhdGEpOwotCQkJCW1hY2RhdGEgfD0gMHgwOTsJLy9iaXQgMCwgMwotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIDB4MTIxMCwgbWFjZGF0YSk7Ci0JCQl9Ci0JCQlGcmFtZS5Qc21wID0gMTsKLQkJCWJyZWFrOworCXN3aXRjaCAoUHNtcCkgeworCWNhc2UgTU1QU19FTkFCTEU6CisjaWZkZWYgUlQzMHh4CisJCWlmIChJU19SVDMweHgocEFkKQorCQkgICAgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPiAxCisJCQl8fCBwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID4gMSkpIHsKKwkJCVJUTVBfQVNJQ19NTVBTX0RJU0FCTEUocEFkKTsKKwkJfQorI2VuZGlmIC8qIFJUMzB4eCAvLyAqLworCQlGcmFtZS5Qc21wID0gMDsKKwkJYnJlYWs7CisJY2FzZSBNTVBTX0RZTkFNSUM6CisJCUZyYW1lLlBzbXAgPSAzOworCQlicmVhazsKKwljYXNlIE1NUFNfU1RBVElDOgorI2lmZGVmIFJUMzB4eAorCQlpZiAoSVNfUlQzMHh4KHBBZCkKKwkJICAgICYmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID4gMQorCQkJfHwgcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA+IDEpKSB7CisJCQlSVE1QX0FTSUNfTU1QU19FTkFCTEUocEFkKTsKKwkJfQorI2VuZGlmIC8qIFJUMzB4eCAvLyAqLworCQlGcmFtZS5Qc21wID0gMTsKKwkJYnJlYWs7CiAJfQotCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotCQkJCQkgIHNpemVvZihGUkFNRV9QU01QX0FDVElPTiksICAgICAgJkZyYW1lLAotCQkJCQkgIEVORF9PRl9BUkdTKTsKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAmRnJhbWVMZW4sCisJCQkgIHNpemVvZihzdHJ1Y3QgcnRfZnJhbWVfcHNtcF9hY3Rpb24pLCAmRnJhbWUsIEVORF9PRl9BUkdTKTsKIAlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwogCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJIVCAtIFNlbmRQU01QQWN0aW9uKCAlZCApICBcbiIsIEZyYW1lLlBzbXApKTsKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJIVCAtIFNlbmRQU01QQWN0aW9uKCAlZCApICBcbiIsIEZyYW1lLlBzbXApKTsKIH0KIAotCiAjZGVmaW5lIFJBRElPX01FQVNVUkVNRU5UX1JFUVVFU1RfQUNUSU9OCTAKIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VECitzdHJ1Y3QgUEFDS0VEIHJ0X2JlYWNvbl9yZXF1ZXN0IHsKKwl1OCBSZWd1bGF0b3J5Q2xhc3M7CisJdTggQ2hhbm5lbE51bWJlcjsKKwl1MTYgUmFuZG9tSW50ZXJ2YWw7CisJdTE2IE1lYXN1cmVtZW50RHVyYXRpb247CisJdTggTWVhc3VyZW1lbnRNb2RlOworCXU4IEJTU0lEW01BQ19BRERSX0xFTl07CisJdTggUmVwb3J0aW5nQ29uZGl0aW9uOworCXU4IFRocmVzaG9sZDsKKwl1OCBTU0lESUVbMl07CS8qIDIgYnl0ZSAqLworfTsKKworc3RydWN0IFBBQ0tFRCBydF9tZWFzdXJlbWVudF9yZXEgeworCXU4IElEOworCXU4IExlbmd0aDsKKwl1OCBUb2tlbjsKKwl1OCBSZXF1ZXN0TW9kZTsKKwl1OCBUeXBlOworfTsKKwordm9pZCBjb252ZXJ0X3Jlb3JkZXJpbmdfcGFja2V0X3RvX3ByZUFNU0RVX29yXzgwMl8zX3BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCQkJICAgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrLAorCQkJCQkJCSAgIHU4CisJCQkJCQkJICAgRnJvbVdoaWNoQlNTSUQpCiB7Ci0JVUNIQVIJUmVndWxhdG9yeUNsYXNzOwotCVVDSEFSCUNoYW5uZWxOdW1iZXI7Ci0JVVNIT1JUCVJhbmRvbUludGVydmFsOwotCVVTSE9SVAlNZWFzdXJlbWVudER1cmF0aW9uOwotCVVDSEFSCU1lYXN1cmVtZW50TW9kZTsKLQlVQ0hBUiAgIEJTU0lEW01BQ19BRERSX0xFTl07Ci0JVUNIQVIJUmVwb3J0aW5nQ29uZGl0aW9uOwotCVVDSEFSCVRocmVzaG9sZDsKLQlVQ0hBUiAgIFNTSURJRVsyXTsJCQkvLyAyIGJ5dGUKLX0gQkVBQ09OX1JFUVVFU1Q7CisJdm9pZCAqcFJ4UGt0OworCXU4IEhlYWRlcjgwMl8zW0xFTkdUSF84MDJfM107CiAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRAotewotCVVDSEFSCUlEOwotCVVDSEFSCUxlbmd0aDsKLQlVQ0hBUglUb2tlbjsKLQlVQ0hBUglSZXF1ZXN0TW9kZTsKLQlVQ0hBUglUeXBlOwotfSBNRUFTVVJFTUVOVF9SRVE7Ci0KLQotCi0KLXZvaWQgY29udmVydF9yZW9yZGVyaW5nX3BhY2tldF90b19wcmVBTVNEVV9vcl84MDJfM19wYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTiAgVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKLXsKLQlQTkRJU19QQUNLRVQJcFJ4UGt0OwotCVVDSEFSCQkJSGVhZGVyODAyXzNbTEVOR1RIXzgwMl8zXTsKLQotCS8vIDEuIGdldCA4MDIuMyBIZWFkZXIKLQkvLyAyLiByZW1vdmUgTExDCi0JLy8gCQlhLiBwb2ludGVyIHBSeEJsay0+cERhdGEgdG8gcGF5bG9hZAotCS8vICAgICAgYi4gbW9kaWZ5IHBSeEJsay0+RGF0YVNpemUKKwkvKiAxLiBnZXQgODAyLjMgSGVhZGVyICovCisJLyogMi4gcmVtb3ZlIExMQyAqLworCS8qICAgICAgICAgICAgICBhLiBwb2ludGVyIHBSeEJsay0+cERhdGEgdG8gcGF5bG9hZCAqLworCS8qICAgICAgYi4gbW9kaWZ5IHBSeEJsay0+RGF0YVNpemUgKi8KIAogCVJUTVBfODAyXzExX1JFTU9WRV9MTENfQU5EX0NPTlZFUlRfVE9fODAyXzMocFJ4QmxrLCBIZWFkZXI4MDJfMyk7CiAKIAlBU1NFUlQocFJ4QmxrLT5wUnhQYWNrZXQpOwogCXBSeFBrdCA9IFJUUEtUX1RPX09TUEtUKHBSeEJsay0+cFJ4UGFja2V0KTsKIAotCVJUUEtUX1RPX09TUEtUKHBSeFBrdCktPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEZyb21XaGljaEJTU0lEKTsKLQlSVFBLVF9UT19PU1BLVChwUnhQa3QpLT5kYXRhID0gcFJ4QmxrLT5wRGF0YTsKLQlSVFBLVF9UT19PU1BLVChwUnhQa3QpLT5sZW4gPSBwUnhCbGstPkRhdGFTaXplOwotCVJUUEtUX1RPX09TUEtUKHBSeFBrdCktPnRhaWwgPSBSVFBLVF9UT19PU1BLVChwUnhQa3QpLT5kYXRhICsgUlRQS1RfVE9fT1NQS1QocFJ4UGt0KS0+bGVuOworCVNFVF9PU19QS1RfTkVUREVWKHBSeFBrdCwgZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgRnJvbVdoaWNoQlNTSUQpKTsKKwlTRVRfT1NfUEtUX0RBVEFQVFIocFJ4UGt0LCBwUnhCbGstPnBEYXRhKTsKKwlTRVRfT1NfUEtUX0xFTihwUnhQa3QsIHBSeEJsay0+RGF0YVNpemUpOworCVNFVF9PU19QS1RfREFUQVRBSUwocFJ4UGt0LCBwUnhCbGstPnBEYXRhLCBwUnhCbGstPkRhdGFTaXplKTsKIAotCS8vCi0JLy8gY29weSA4MDIuMyBoZWFkZXIsIGlmIG5lY2Vzc2FyeQotCS8vCi0JaWYgKCFSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKSkKLQl7CisJLyogKi8KKwkvKiBjb3B5IDgwMi4zIGhlYWRlciwgaWYgbmVjZXNzYXJ5ICovCisJLyogKi8KKwlpZiAoIVJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQU1TRFUpKSB7CisJCXsKICNpZmRlZiBMSU5VWAotCQlOZGlzTW92ZU1lbW9yeShza2JfcHVzaChwUnhQa3QsIExFTkdUSF84MDJfMyksIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMpOworCQkJTmRpc01vdmVNZW1vcnkoc2tiX3B1c2gocFJ4UGt0LCBMRU5HVEhfODAyXzMpLAorCQkJCSAgICAgICBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zKTsKICNlbmRpZgorCQl9CiAJfQogfQogCi0KICNkZWZpbmUgSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKF9wQWQsIF9wUnhCbGssIF9mcm9tV2hpY2hCU1NJRCkJCVwKIAlkbwkJCQkJCQkJCQkJCQkJCQkJXAogCXsJCQkJCQkJCQkJCQkJCQkJCVwKQEAgLTE1MzgsNjEgKzE0MzYsNjAgQEAKICAgICAJfQkJCQkJCQkJCQkJCQkJCQlcCiAJfSB3aGlsZSAoMCk7CiAKLQotCi1zdGF0aWMgVk9JRCBiYV9lbnF1ZXVlX3Jlb3JkZXJpbmdfcGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBCQV9SRUNfRU5UUlkJcEJBRW50cnksCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQorc3RhdGljIHZvaWQgYmFfZW5xdWV1ZV9yZW9yZGVyaW5nX3BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCSBzdHJ1Y3QgcnRfYmFfcmVjX2VudHJ5ICpwQkFFbnRyeSwKKwkJCQkJIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaywKKwkJCQkJIHU4IEZyb21XaGljaEJTU0lEKQogewogCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOwotCVVJTlQxNglTZXF1ZW5jZSA9IChVSU5UMTYpIHBSeEJsay0+cEhlYWRlci0+U2VxdWVuY2U7CisJdTE2IFNlcXVlbmNlID0gKHUxNilwUnhCbGstPnBIZWFkZXItPlNlcXVlbmNlOwogCiAJbXBkdV9ibGsgPSBiYV9tcGR1X2Jsa19hbGxvYyhwQWQpOwotCWlmIChtcGR1X2JsayAhPSBOVUxMKQotCXsKLQkJLy8gV3JpdGUgUnhEIGJ1ZmZlciBhZGRyZXNzICYgYWxsb2NhdGVkIGJ1ZmZlciBsZW5ndGgKKwlpZiAoKG1wZHVfYmxrICE9IE5VTEwpICYmICghUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9FQVApKSkgeworCQkvKiBXcml0ZSBSeEQgYnVmZmVyIGFkZHJlc3MgJiBhbGxvY2F0ZWQgYnVmZmVyIGxlbmd0aCAqLwogCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKIAogCQltcGR1X2Jsay0+U2VxdWVuY2UgPSBTZXF1ZW5jZTsKIAogCQltcGR1X2Jsay0+YkFNU0RVID0gUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSk7CiAKLQkJY29udmVydF9yZW9yZGVyaW5nX3BhY2tldF90b19wcmVBTVNEVV9vcl84MDJfM19wYWNrZXQocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJY29udmVydF9yZW9yZGVyaW5nX3BhY2tldF90b19wcmVBTVNEVV9vcl84MDJfM19wYWNrZXQocEFkLAorCQkJCQkJCQkgICAgICBwUnhCbGssCisJCQkJCQkJCSAgICAgIEZyb21XaGljaEJTU0lEKTsKIAogCQlTVEFUU19JTkNfUlhfUEFDS0VUUyhwQWQsIEZyb21XaGljaEJTU0lEKTsKIAotICAgICAgICAvLwotCQkvLyBpdCBpcyBuZWNlc3NhcnkgZm9yIHJlb3JkZXJpbmcgcGFja2V0IHRvIHJlY29yZAotCQkvLyB3aGljaCBCU1MgaXQgY29tZSBmcm9tCi0JCS8vCisJCS8qICovCisJCS8qIGl0IGlzIG5lY2Vzc2FyeSBmb3IgcmVvcmRlcmluZyBwYWNrZXQgdG8gcmVjb3JkICovCisJCS8qIHdoaWNoIEJTUyBpdCBjb21lIGZyb20gKi8KKwkJLyogKi8KIAkJUlRNUF9TRVRfUEFDS0VUX0lGKHBSeEJsay0+cFJ4UGFja2V0LCBGcm9tV2hpY2hCU1NJRCk7CiAKIAkJbXBkdV9ibGstPnBQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKIAotCQlpZiAoYmFfcmVvcmRlcmluZ19tcGR1X2luc2VydHNvcnRlZCgmcEJBRW50cnktPmxpc3QsIG1wZHVfYmxrKSA9PSBGQUxTRSkKLQkJewotCQkJLy8gaGFkIGJlZW4gYWxyZWFkeSB3aXRoaW4gcmVvcmRlcmluZyBsaXN0Ci0JCQkvLyBkb24ndCBpbmRpY2F0ZQotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJaWYgKGJhX3Jlb3JkZXJpbmdfbXBkdV9pbnNlcnRzb3J0ZWQoJnBCQUVudHJ5LT5saXN0LCBtcGR1X2JsaykKKwkJICAgID09IEZBTFNFKSB7CisJCQkvKiBoYWQgYmVlbiBhbHJlYWR5IHdpdGhpbiByZW9yZGVyaW5nIGxpc3QgKi8KKwkJCS8qIGRvbid0IGluZGljYXRlICovCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsCisJCQkJCSAgICBORElTX1NUQVRVU19TVUNDRVNTKTsKIAkJCWJhX21wZHVfYmxrX2ZyZWUocEFkLCBtcGR1X2Jsayk7CiAJCX0KIAotCQlBU1NFUlQoKDA8PSBwQkFFbnRyeS0+bGlzdC5xbGVuKSAgJiYgKHBCQUVudHJ5LT5saXN0LnFsZW4gPD0gcEJBRW50cnktPkJBV2luU2l6ZSkpOworCQlBU1NFUlQoKDAgPD0gcEJBRW50cnktPmxpc3QucWxlbikKKwkJICAgICAgICYmIChwQkFFbnRyeS0+bGlzdC5xbGVuIDw9IHBCQUVudHJ5LT5CQVdpblNpemUpKTsKIAkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAgKCIhISEgKCVkKSBDYW4ndCBhbGxvY2F0ZSByZW9yZGVyaW5nIG1wZHUgYmxrXG4iLAotCQkJCQkJCQkgICBwQkFFbnRyeS0+bGlzdC5xbGVuKSk7CisJfSBlbHNlIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCIgKCVkKSBDYW4ndCBhbGxvY2F0ZSByZW9yZGVyaW5nIG1wZHUgYmxrXG4iLAorCQkJICBwQkFFbnRyeS0+bGlzdC5xbGVuKSk7CiAKIAkJLyoKIAkJICogZmx1c2ggYWxsIHBlbmRpbmcgcmVvcmRlcmluZyBtcGR1cwogCQkgKiBhbmQgcmVjZXZpbmcgbXBkdSB0byB1cHBlciBsYXllcgogCQkgKiBtYWtlIHRjcC9pcCB0byB0YWtlIGNhcmUgcmVvcmRlcmluZyBtZWNoYW5pc20KIAkJICovCi0JCS8vYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOworCQkvKmJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsgKi8KIAkJYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19sZV9zZXEocEFkLCBwQkFFbnRyeSwgU2VxdWVuY2UpOwogCiAJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gU2VxdWVuY2U7CkBAIC0xNjAwLDcgKzE0OTcsNiBAQAogCX0KIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJRGVzY3JpcHRpb246CkBAIC0xNjE5LDEzOSArMTUxNSwxMzQgQEAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCiAKLVZPSUQgSW5kaWNhdGVfQU1QRFVfUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3ZvaWQgSW5kaWNhdGVfQU1QRFVfUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaywgdTggRnJvbVdoaWNoQlNTSUQpCiB7Ci0JVVNIT1JUCQkJCUlkeDsKLQlQQkFfUkVDX0VOVFJZCQlwQkFFbnRyeSA9IE5VTEw7Ci0JVUlOVDE2CQkJCVNlcXVlbmNlID0gcFJ4QmxrLT5wSGVhZGVyLT5TZXF1ZW5jZTsKLQlVTE9ORwkJCQlOb3czMjsKLQlVQ0hBUgkJCQlXY2lkID0gcFJ4QmxrLT5wUnhXSS0+V2lyZWxlc3NDbGlJRDsKLQlVQ0hBUgkJCQlUSUQgPSBwUnhCbGstPnBSeFdJLT5USUQ7CisJdTE2IElkeDsKKwlzdHJ1Y3QgcnRfYmFfcmVjX2VudHJ5ICpwQkFFbnRyeSA9IE5VTEw7CisJdTE2IFNlcXVlbmNlID0gcFJ4QmxrLT5wSGVhZGVyLT5TZXF1ZW5jZTsKKwl1bnNpZ25lZCBsb25nIE5vdzMyOworCXU4IFdjaWQgPSBwUnhCbGstPnBSeFdJLT5XaXJlbGVzc0NsaUlEOworCXU4IFRJRCA9IHBSeEJsay0+cFJ4V0ktPlRJRDsKIAotCi0JaWYgKCFSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKSAmJiAgKHBSeEJsay0+RGF0YVNpemUgPiBNQVhfUlhfUEtUX0xFTikpCi0JewotCQkvLyByZWxlYXNlIHBhY2tldAotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCWlmICghUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSkKKwkgICAgJiYgKHBSeEJsay0+RGF0YVNpemUgPiBNQVhfUlhfUEtUX0xFTikpIHsKKwkJLyogcmVsZWFzZSBwYWNrZXQgKi8KKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LAorCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChXY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpCi0JeworCWlmIChXY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpIHsKIAkJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5CQVJlY1djaWRBcnJheVtUSURdOwotCQlpZiAoSWR4ID09IDApCi0JCXsKKwkJaWYgKElkeCA9PSAwKSB7CiAJCQkvKiBSZWMgQkEgU2Vzc2lvbiBoYWQgYmVlbiB0b3JuIGRvd24gKi8KIAkJCUlORElDQVRFX0xFR0FDWV9PUl9BTVNEVShwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwogCQkJcmV0dXJuOwogCQl9CiAJCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W0lkeF07Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIGltcG9zc2libGUgISEhCisJfSBlbHNlIHsKKwkJLyogaW1wb3NzaWJsZSAhICovCiAJCUFTU0VSVCgwKTsKLQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJLyogcmVsZWFzZSBwYWNrZXQgKi8KKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LAorCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKIAkJcmV0dXJuOwogCX0KIAogCUFTU0VSVChwQkFFbnRyeSk7CiAKLQkvLyB1cGRhdGUgbGFzdCByeCB0aW1lCisJLyogdXBkYXRlIGxhc3QgcnggdGltZSAqLwogCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdzMyKTsKIAogCXBCQUVudHJ5LT5yY3ZTZXEgPSBTZXF1ZW5jZTsKIAotCiAJYmFfZmx1c2hfcmVvcmRlcmluZ190aW1lb3V0X21wZHVzKHBBZCwgcEJBRW50cnksIE5vdzMyKTsKIAlwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgPSBOb3czMjsKIAotCS8vCi0JLy8gUmVzZXQgTGFzdCBJbmRpY2F0ZSBTZXF1ZW5jZQotCS8vCi0JaWYgKHBCQUVudHJ5LT5MYXN0SW5kU2VxID09IFJFU0VUX1JDVl9TRVEpCi0JewotCQlBU1NFUlQoKHBCQUVudHJ5LT5saXN0LnFsZW4gPT0gMCkgJiYgKHBCQUVudHJ5LT5saXN0Lm5leHQgPT0gTlVMTCkpOworCS8qICovCisJLyogUmVzZXQgTGFzdCBJbmRpY2F0ZSBTZXF1ZW5jZSAqLworCS8qICovCisJaWYgKHBCQUVudHJ5LT5MYXN0SW5kU2VxID09IFJFU0VUX1JDVl9TRVEpIHsKKwkJQVNTRVJUKChwQkFFbnRyeS0+bGlzdC5xbGVuID09IDApCisJCSAgICAgICAmJiAocEJBRW50cnktPmxpc3QubmV4dCA9PSBOVUxMKSk7CiAKLQkJLy8gcmVzZXQgcmN2IHNlcXVlbmNlIG9mIEJBIHNlc3Npb24KKwkJLyogcmVzZXQgcmN2IHNlcXVlbmNlIG9mIEJBIHNlc3Npb24gKi8KIAkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBTZXF1ZW5jZTsKIAkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7CiAJCUlORElDQVRFX0xFR0FDWV9PUl9BTVNEVShwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwogCQlyZXR1cm47CiAJfQogCi0KLQkvLwotCS8vIEkuIENoZWNrIGlmIGluIG9yZGVyLgotCS8vCi0JaWYgKFNFUV9TVEVQT05FKFNlcXVlbmNlLCBwQkFFbnRyeS0+TGFzdEluZFNlcSwgTUFYU0VRKSkKLQl7Ci0JCVVTSE9SVCAgTGFzdEluZFNlcTsKKwkvKiAqLworCS8qIEkuIENoZWNrIGlmIGluIG9yZGVyLiAqLworCS8qICovCisJaWYgKFNFUV9TVEVQT05FKFNlcXVlbmNlLCBwQkFFbnRyeS0+TGFzdEluZFNlcSwgTUFYU0VRKSkgeworCQl1MTYgTGFzdEluZFNlcTsKIAogCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFNlcXVlbmNlOwogCQlJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKLSAJCUxhc3RJbmRTZXEgPSBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2luX29yZGVyKHBBZCwgcEJBRW50cnksIHBCQUVudHJ5LT5MYXN0SW5kU2VxKTsKLQkJaWYgKExhc3RJbmRTZXEgIT0gUkVTRVRfUkNWX1NFUSkKLQkJeworCQlMYXN0SW5kU2VxID0KKwkJICAgIGJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfaW5fb3JkZXIocEFkLCBwQkFFbnRyeSwKKwkJCQkJCQkgIHBCQUVudHJ5LT5MYXN0SW5kU2VxKTsKKwkJaWYgKExhc3RJbmRTZXEgIT0gUkVTRVRfUkNWX1NFUSkgewogCQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBMYXN0SW5kU2VxOwogCQl9CiAJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOwogCX0KLQkvLwotCS8vIElJLiBEcm9wIER1cGxpY2F0ZWQgUGFja2V0Ci0JLy8KLQllbHNlIGlmIChTZXF1ZW5jZSA9PSBwQkFFbnRyeS0+TGFzdEluZFNlcSkKLQl7CisJLyogKi8KKwkvKiBJSS4gRHJvcCBEdXBsaWNhdGVkIFBhY2tldCAqLworCS8qICovCisJZWxzZSBpZiAoU2VxdWVuY2UgPT0gcEJBRW50cnktPkxhc3RJbmRTZXEpIHsKIAotCQkvLyBkcm9wIGFuZCByZWxlYXNlIHBhY2tldAorCQkvKiBkcm9wIGFuZCByZWxlYXNlIHBhY2tldCAqLwogCQlwQkFFbnRyeS0+bkRyb3BQYWNrZXQrKzsKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LAorCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKIAl9Ci0JLy8KLQkvLyBJSUkuIERyb3AgT2xkIFJlY2VpdmVkIFBhY2tldAotCS8vCi0JZWxzZSBpZiAoU0VRX1NNQUxMRVIoU2VxdWVuY2UsIHBCQUVudHJ5LT5MYXN0SW5kU2VxLCBNQVhTRVEpKQotCXsKKwkvKiAqLworCS8qIElJSS4gRHJvcCBPbGQgUmVjZWl2ZWQgUGFja2V0ICovCisJLyogKi8KKwllbHNlIGlmIChTRVFfU01BTExFUihTZXF1ZW5jZSwgcEJBRW50cnktPkxhc3RJbmRTZXEsIE1BWFNFUSkpIHsKIAotCQkvLyBkcm9wIGFuZCByZWxlYXNlIHBhY2tldAorCQkvKiBkcm9wIGFuZCByZWxlYXNlIHBhY2tldCAqLwogCQlwQkFFbnRyeS0+bkRyb3BQYWNrZXQrKzsKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LAorCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKIAl9Ci0JLy8KLQkvLyBJVi4gUmVjZWl2ZSBTZXF1ZW5jZSB3aXRoaW4gV2luZG93IFNpemUKLQkvLwotCWVsc2UgaWYgKFNFUV9TTUFMTEVSKFNlcXVlbmNlLCAoKChwQkFFbnRyeS0+TGFzdEluZFNlcStwQkFFbnRyeS0+QkFXaW5TaXplKzEpKSAmIE1BWFNFUSksIE1BWFNFUSkpCi0JewotCQliYV9lbnF1ZXVlX3Jlb3JkZXJpbmdfcGFja2V0KHBBZCwgcEJBRW50cnksIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCS8qICovCisJLyogSVYuIFJlY2VpdmUgU2VxdWVuY2Ugd2l0aGluIFdpbmRvdyBTaXplICovCisJLyogKi8KKwllbHNlIGlmIChTRVFfU01BTExFUgorCQkgKFNlcXVlbmNlLAorCQkgICgoKHBCQUVudHJ5LT5MYXN0SW5kU2VxICsgcEJBRW50cnktPkJBV2luU2l6ZSArIDEpKSAmIE1BWFNFUSksCisJCSAgTUFYU0VRKSkgeworCQliYV9lbnF1ZXVlX3Jlb3JkZXJpbmdfcGFja2V0KHBBZCwgcEJBRW50cnksIHBSeEJsaywKKwkJCQkJICAgICBGcm9tV2hpY2hCU1NJRCk7CiAJfQotCS8vCi0JLy8gVi4gUmVjZWl2ZSBzZXEgc3VycGFzc2VzIFdpbihsYXN0c2VxICsgbk1TRFUpLiBTbyByZWZyZXNoIGFsbCByZW9yZGVyIGJ1ZmZlcgotCS8vCi0JZWxzZQotCXsKLQkJTE9ORyBXaW5TdGFydFNlcSwgVG1wU2VxOworCS8qICovCisJLyogVi4gUmVjZWl2ZSBzZXEgc3VycGFzc2VzIFdpbihsYXN0c2VxICsgbk1TRFUpLiBTbyByZWZyZXNoIGFsbCByZW9yZGVyIGJ1ZmZlciAqLworCS8qICovCisJZWxzZSB7CisJCWxvbmcgV2luU3RhcnRTZXEsIFRtcFNlcTsKIAotCi0JCVRtcFNlcSA9IFNlcXVlbmNlIC0gKHBCQUVudHJ5LT5CQVdpblNpemUpIC0xOwotCQlpZiAoVG1wU2VxIDwgMCkKLQkJewotCQkJVG1wU2VxID0gKE1BWFNFUSsxKSArIFRtcFNlcTsKKwkJVG1wU2VxID0gU2VxdWVuY2UgLSAocEJBRW50cnktPkJBV2luU2l6ZSkgLSAxOworCQlpZiAoVG1wU2VxIDwgMCkgeworCQkJVG1wU2VxID0gKE1BWFNFUSArIDEpICsgVG1wU2VxOwogCQl9Ci0JCVdpblN0YXJ0U2VxID0gKFRtcFNlcSsxKSAmIE1BWFNFUTsKKwkJV2luU3RhcnRTZXEgPSAoVG1wU2VxICsgMSkgJiBNQVhTRVE7CiAJCWJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfbGVfc2VxKHBBZCwgcEJBRW50cnksIFdpblN0YXJ0U2VxKTsKLQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBXaW5TdGFydFNlcTsgLy9UbXBTZXE7CisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gV2luU3RhcnRTZXE7CS8qVG1wU2VxOyAqLwogCiAJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOwogCi0JCWJhX2VucXVldWVfcmVvcmRlcmluZ19wYWNrZXQocEFkLCBwQkFFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCWJhX2VucXVldWVfcmVvcmRlcmluZ19wYWNrZXQocEFkLCBwQkFFbnRyeSwgcFJ4QmxrLAorCQkJCQkgICAgIEZyb21XaGljaEJTU0lEKTsKIAotCQlUbXBTZXEgPSBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2luX29yZGVyKHBBZCwgcEJBRW50cnksIHBCQUVudHJ5LT5MYXN0SW5kU2VxKTsKLQkJaWYgKFRtcFNlcSAhPSBSRVNFVF9SQ1ZfU0VRKQotCQl7CisJCVRtcFNlcSA9CisJCSAgICBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2luX29yZGVyKHBBZCwgcEJBRW50cnksCisJCQkJCQkJICBwQkFFbnRyeS0+TGFzdEluZFNlcSk7CisJCWlmIChUbXBTZXEgIT0gUkVTRVRfUkNWX1NFUSkgewogCQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBUbXBTZXE7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fYWVzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fYWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUwMzU3YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9hZXMuYwpAQCAtMCwwICsxLDEzMTMgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJY21tX2Flcy5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJUGF1bCBXdQkJMDItMjUtMDIJCUluaXRpYWwKKyovCisKKyNpbmNsdWRlCSIuLi9ydF9jb25maWcuaCIKKworc3RydWN0IGFlc19jb250ZXh0IHsKKwl1MzIgZXJrWzY0XTsJCS8qIGVuY3J5cHRpb24gcm91bmQga2V5cyAqLworCXUzMiBkcmtbNjRdOwkJLyogZGVjcnlwdGlvbiByb3VuZCBrZXlzICovCisJaW50IG5yOwkJCS8qIG51bWJlciBvZiByb3VuZHMgKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKiBTQk9YIFRhYmxlICoqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTggU2JveFRhYmxlWzI1Nl0gPSB7CisJMHg2MywgMHg3YywgMHg3NywgMHg3YiwgMHhmMiwgMHg2YiwgMHg2ZiwgMHhjNSwKKwkweDMwLCAweDAxLCAweDY3LCAweDJiLCAweGZlLCAweGQ3LCAweGFiLCAweDc2LAorCTB4Y2EsIDB4ODIsIDB4YzksIDB4N2QsIDB4ZmEsIDB4NTksIDB4NDcsIDB4ZjAsCisJMHhhZCwgMHhkNCwgMHhhMiwgMHhhZiwgMHg5YywgMHhhNCwgMHg3MiwgMHhjMCwKKwkweGI3LCAweGZkLCAweDkzLCAweDI2LCAweDM2LCAweDNmLCAweGY3LCAweGNjLAorCTB4MzQsIDB4YTUsIDB4ZTUsIDB4ZjEsIDB4NzEsIDB4ZDgsIDB4MzEsIDB4MTUsCisJMHgwNCwgMHhjNywgMHgyMywgMHhjMywgMHgxOCwgMHg5NiwgMHgwNSwgMHg5YSwKKwkweDA3LCAweDEyLCAweDgwLCAweGUyLCAweGViLCAweDI3LCAweGIyLCAweDc1LAorCTB4MDksIDB4ODMsIDB4MmMsIDB4MWEsIDB4MWIsIDB4NmUsIDB4NWEsIDB4YTAsCisJMHg1MiwgMHgzYiwgMHhkNiwgMHhiMywgMHgyOSwgMHhlMywgMHgyZiwgMHg4NCwKKwkweDUzLCAweGQxLCAweDAwLCAweGVkLCAweDIwLCAweGZjLCAweGIxLCAweDViLAorCTB4NmEsIDB4Y2IsIDB4YmUsIDB4MzksIDB4NGEsIDB4NGMsIDB4NTgsIDB4Y2YsCisJMHhkMCwgMHhlZiwgMHhhYSwgMHhmYiwgMHg0MywgMHg0ZCwgMHgzMywgMHg4NSwKKwkweDQ1LCAweGY5LCAweDAyLCAweDdmLCAweDUwLCAweDNjLCAweDlmLCAweGE4LAorCTB4NTEsIDB4YTMsIDB4NDAsIDB4OGYsIDB4OTIsIDB4OWQsIDB4MzgsIDB4ZjUsCisJMHhiYywgMHhiNiwgMHhkYSwgMHgyMSwgMHgxMCwgMHhmZiwgMHhmMywgMHhkMiwKKwkweGNkLCAweDBjLCAweDEzLCAweGVjLCAweDVmLCAweDk3LCAweDQ0LCAweDE3LAorCTB4YzQsIDB4YTcsIDB4N2UsIDB4M2QsIDB4NjQsIDB4NWQsIDB4MTksIDB4NzMsCisJMHg2MCwgMHg4MSwgMHg0ZiwgMHhkYywgMHgyMiwgMHgyYSwgMHg5MCwgMHg4OCwKKwkweDQ2LCAweGVlLCAweGI4LCAweDE0LCAweGRlLCAweDVlLCAweDBiLCAweGRiLAorCTB4ZTAsIDB4MzIsIDB4M2EsIDB4MGEsIDB4NDksIDB4MDYsIDB4MjQsIDB4NWMsCisJMHhjMiwgMHhkMywgMHhhYywgMHg2MiwgMHg5MSwgMHg5NSwgMHhlNCwgMHg3OSwKKwkweGU3LCAweGM4LCAweDM3LCAweDZkLCAweDhkLCAweGQ1LCAweDRlLCAweGE5LAorCTB4NmMsIDB4NTYsIDB4ZjQsIDB4ZWEsIDB4NjUsIDB4N2EsIDB4YWUsIDB4MDgsCisJMHhiYSwgMHg3OCwgMHgyNSwgMHgyZSwgMHgxYywgMHhhNiwgMHhiNCwgMHhjNiwKKwkweGU4LCAweGRkLCAweDc0LCAweDFmLCAweDRiLCAweGJkLCAweDhiLCAweDhhLAorCTB4NzAsIDB4M2UsIDB4YjUsIDB4NjYsIDB4NDgsIDB4MDMsIDB4ZjYsIDB4MGUsCisJMHg2MSwgMHgzNSwgMHg1NywgMHhiOSwgMHg4NiwgMHhjMSwgMHgxZCwgMHg5ZSwKKwkweGUxLCAweGY4LCAweDk4LCAweDExLCAweDY5LCAweGQ5LCAweDhlLCAweDk0LAorCTB4OWIsIDB4MWUsIDB4ODcsIDB4ZTksIDB4Y2UsIDB4NTUsIDB4MjgsIDB4ZGYsCisJMHg4YywgMHhhMSwgMHg4OSwgMHgwZCwgMHhiZiwgMHhlNiwgMHg0MiwgMHg2OCwKKwkweDQxLCAweDk5LCAweDJkLCAweDBmLCAweGIwLCAweDU0LCAweGJiLCAweDE2Cit9OworCit2b2lkIHhvcl8zMih1OCAqYSwgdTggKmIsIHU4ICpvdXQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCW91dFtpXSA9IGFbaV0gXiBiW2ldOworCX0KK30KKwordm9pZCB4b3JfMTI4KHU4ICphLCB1OCAqYiwgdTggKm91dCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCW91dFtpXSA9IGFbaV0gXiBiW2ldOworCX0KK30KKwordTggUlRNUENraXBTYm94KHU4IGEpCit7CisJcmV0dXJuIFNib3hUYWJsZVsoaW50KWFdOworfQorCit2b2lkIG5leHRfa2V5KHU4ICprZXksIGludCByb3VuZCkKK3sKKwl1OCByY29uOworCXU4IHNib3hfa2V5WzRdOworCXU4IHJjb25fdGFibGVbMTJdID0geworCQkweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLAorCQkweDFiLCAweDM2LCAweDM2LCAweDM2CisJfTsKKworCXNib3hfa2V5WzBdID0gUlRNUENraXBTYm94KGtleVsxM10pOworCXNib3hfa2V5WzFdID0gUlRNUENraXBTYm94KGtleVsxNF0pOworCXNib3hfa2V5WzJdID0gUlRNUENraXBTYm94KGtleVsxNV0pOworCXNib3hfa2V5WzNdID0gUlRNUENraXBTYm94KGtleVsxMl0pOworCisJcmNvbiA9IHJjb25fdGFibGVbcm91bmRdOworCisJeG9yXzMyKCZrZXlbMF0sIHNib3hfa2V5LCAma2V5WzBdKTsKKwlrZXlbMF0gPSBrZXlbMF0gXiByY29uOworCisJeG9yXzMyKCZrZXlbNF0sICZrZXlbMF0sICZrZXlbNF0pOworCXhvcl8zMigma2V5WzhdLCAma2V5WzRdLCAma2V5WzhdKTsKKwl4b3JfMzIoJmtleVsxMl0sICZrZXlbOF0sICZrZXlbMTJdKTsKK30KKwordm9pZCBieXRlX3N1Yih1OCAqaW4sIHU4ICpvdXQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlvdXRbaV0gPSBSVE1QQ2tpcFNib3goaW5baV0pOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGJpdHdpc2VfeG9yKCkgICAgICAgICAgICAgICAgICAgICovCisvKiBBIDEyOCBiaXQsIGJpdHdpc2UgZXhjbHVzaXZlIG9yICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBiaXR3aXNlX3hvcih1bnNpZ25lZCBjaGFyICppbmEsIHVuc2lnbmVkIGNoYXIgKmluYiwgdW5zaWduZWQgY2hhciAqb3V0KQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCW91dFtpXSA9IGluYVtpXSBeIGluYltpXTsKKwl9Cit9CisKK3ZvaWQgc2hpZnRfcm93KHU4ICppbiwgdTggKm91dCkKK3sKKwlvdXRbMF0gPSBpblswXTsKKwlvdXRbMV0gPSBpbls1XTsKKwlvdXRbMl0gPSBpblsxMF07CisJb3V0WzNdID0gaW5bMTVdOworCW91dFs0XSA9IGluWzRdOworCW91dFs1XSA9IGluWzldOworCW91dFs2XSA9IGluWzE0XTsKKwlvdXRbN10gPSBpblszXTsKKwlvdXRbOF0gPSBpbls4XTsKKwlvdXRbOV0gPSBpblsxM107CisJb3V0WzEwXSA9IGluWzJdOworCW91dFsxMV0gPSBpbls3XTsKKwlvdXRbMTJdID0gaW5bMTJdOworCW91dFsxM10gPSBpblsxXTsKKwlvdXRbMTRdID0gaW5bNl07CisJb3V0WzE1XSA9IGluWzExXTsKK30KKwordm9pZCBtaXhfY29sdW1uKHU4ICppbiwgdTggKm91dCkKK3sKKwlpbnQgaTsKKwl1OCBhZGQxYls0XTsKKwl1OCBhZGQxYmY3WzRdOworCXU4IHJvdGxbNF07CisJdTggc3dhcF9oYWxmc1s0XTsKKwl1OCBhbmRmN1s0XTsKKwl1OCByb3RyWzRdOworCXU4IHRlbXBbNF07CisJdTggdGVtcGJbNF07CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWlmICgoaW5baV0gJiAweDgwKSA9PSAweDgwKQorCQkJYWRkMWJbaV0gPSAweDFiOworCQllbHNlCisJCQlhZGQxYltpXSA9IDB4MDA7CisJfQorCisJc3dhcF9oYWxmc1swXSA9IGluWzJdOwkvKiBTd2FwIGhhbGZzICovCisJc3dhcF9oYWxmc1sxXSA9IGluWzNdOworCXN3YXBfaGFsZnNbMl0gPSBpblswXTsKKwlzd2FwX2hhbGZzWzNdID0gaW5bMV07CisKKwlyb3RsWzBdID0gaW5bM107CS8qIFJvdGF0ZSBsZWZ0IDggYml0cyAqLworCXJvdGxbMV0gPSBpblswXTsKKwlyb3RsWzJdID0gaW5bMV07CisJcm90bFszXSA9IGluWzJdOworCisJYW5kZjdbMF0gPSBpblswXSAmIDB4N2Y7CisJYW5kZjdbMV0gPSBpblsxXSAmIDB4N2Y7CisJYW5kZjdbMl0gPSBpblsyXSAmIDB4N2Y7CisJYW5kZjdbM10gPSBpblszXSAmIDB4N2Y7CisKKwlmb3IgKGkgPSAzOyBpID4gMDsgaS0tKSB7CS8qIGxvZ2ljYWwgc2hpZnQgbGVmdCAxIGJpdCAqLworCQlhbmRmN1tpXSA9IGFuZGY3W2ldIDw8IDE7CisJCWlmICgoYW5kZjdbaSAtIDFdICYgMHg4MCkgPT0gMHg4MCkgeworCQkJYW5kZjdbaV0gPSAoYW5kZjdbaV0gfCAweDAxKTsKKwkJfQorCX0KKwlhbmRmN1swXSA9IGFuZGY3WzBdIDw8IDE7CisJYW5kZjdbMF0gPSBhbmRmN1swXSAmIDB4ZmU7CisKKwl4b3JfMzIoYWRkMWIsIGFuZGY3LCBhZGQxYmY3KTsKKworCXhvcl8zMihpbiwgYWRkMWJmNywgcm90cik7CisKKwl0ZW1wWzBdID0gcm90clswXTsJLyogUm90YXRlIHJpZ2h0IDggYml0cyAqLworCXJvdHJbMF0gPSByb3RyWzFdOworCXJvdHJbMV0gPSByb3RyWzJdOworCXJvdHJbMl0gPSByb3RyWzNdOworCXJvdHJbM10gPSB0ZW1wWzBdOworCisJeG9yXzMyKGFkZDFiZjcsIHJvdHIsIHRlbXApOworCXhvcl8zMihzd2FwX2hhbGZzLCByb3RsLCB0ZW1wYik7CisJeG9yXzMyKHRlbXAsIHRlbXBiLCBvdXQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogY29uc3RydWN0X21pY19oZWFkZXIxKCkgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEJ1aWxkcyB0aGUgZmlyc3QgTUlDIGhlYWRlciBibG9jayBmcm9tICAgICAgICovCisvKiBoZWFkZXIgZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBjb25zdHJ1Y3RfbWljX2hlYWRlcjEodW5zaWduZWQgY2hhciAqbWljX2hlYWRlcjEsCisJCQkgICBpbnQgaGVhZGVyX2xlbmd0aCwgdW5zaWduZWQgY2hhciAqbXBkdSkKK3sKKwltaWNfaGVhZGVyMVswXSA9ICh1bnNpZ25lZCBjaGFyKSgoaGVhZGVyX2xlbmd0aCAtIDIpIC8gMjU2KTsKKwltaWNfaGVhZGVyMVsxXSA9ICh1bnNpZ25lZCBjaGFyKSgoaGVhZGVyX2xlbmd0aCAtIDIpICUgMjU2KTsKKwltaWNfaGVhZGVyMVsyXSA9IG1wZHVbMF0gJiAweGNmOwkvKiBNdXRlIENGIHBvbGwgJiBDRiBhY2sgYml0cyAqLworCW1pY19oZWFkZXIxWzNdID0gbXBkdVsxXSAmIDB4Yzc7CS8qIE11dGUgcmV0cnksIG1vcmUgZGF0YSBhbmQgcHdyIG1ndCBiaXRzICovCisJbWljX2hlYWRlcjFbNF0gPSBtcGR1WzRdOwkvKiBBMSAqLworCW1pY19oZWFkZXIxWzVdID0gbXBkdVs1XTsKKwltaWNfaGVhZGVyMVs2XSA9IG1wZHVbNl07CisJbWljX2hlYWRlcjFbN10gPSBtcGR1WzddOworCW1pY19oZWFkZXIxWzhdID0gbXBkdVs4XTsKKwltaWNfaGVhZGVyMVs5XSA9IG1wZHVbOV07CisJbWljX2hlYWRlcjFbMTBdID0gbXBkdVsxMF07CS8qIEEyICovCisJbWljX2hlYWRlcjFbMTFdID0gbXBkdVsxMV07CisJbWljX2hlYWRlcjFbMTJdID0gbXBkdVsxMl07CisJbWljX2hlYWRlcjFbMTNdID0gbXBkdVsxM107CisJbWljX2hlYWRlcjFbMTRdID0gbXBkdVsxNF07CisJbWljX2hlYWRlcjFbMTVdID0gbXBkdVsxNV07Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBjb25zdHJ1Y3RfbWljX2hlYWRlcjIoKSAgICAgICAgICAgICAgICAgICAgICAqLworLyogQnVpbGRzIHRoZSBsYXN0IE1JQyBoZWFkZXIgYmxvY2sgZnJvbSAgICAgICAgKi8KKy8qIGhlYWRlciBmaWVsZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGNvbnN0cnVjdF9taWNfaGVhZGVyMih1bnNpZ25lZCBjaGFyICptaWNfaGVhZGVyMiwKKwkJCSAgIHVuc2lnbmVkIGNoYXIgKm1wZHUsIGludCBhNF9leGlzdHMsIGludCBxY19leGlzdHMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJbWljX2hlYWRlcjJbaV0gPSAweDAwOworCisJbWljX2hlYWRlcjJbMF0gPSBtcGR1WzE2XTsJLyogQTMgKi8KKwltaWNfaGVhZGVyMlsxXSA9IG1wZHVbMTddOworCW1pY19oZWFkZXIyWzJdID0gbXBkdVsxOF07CisJbWljX2hlYWRlcjJbM10gPSBtcGR1WzE5XTsKKwltaWNfaGVhZGVyMls0XSA9IG1wZHVbMjBdOworCW1pY19oZWFkZXIyWzVdID0gbXBkdVsyMV07CisKKwkvKiBJbiBTZXF1ZW5jZSBDb250cm9sIGZpZWxkLCBtdXRlIHNlcXVlbmNlIG51bWVyIGJpdHMgKDEyLWJpdCkgKi8KKwltaWNfaGVhZGVyMls2XSA9IG1wZHVbMjJdICYgMHgwZjsJLyogU0MgKi8KKwltaWNfaGVhZGVyMls3XSA9IDB4MDA7CS8qIG1wZHVbMjNdOyAqLworCisJaWYgKCghcWNfZXhpc3RzKSAmIGE0X2V4aXN0cykgeworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJbWljX2hlYWRlcjJbOCArIGldID0gbXBkdVsyNCArIGldOwkvKiBBNCAqLworCisJfQorCisJaWYgKHFjX2V4aXN0cyAmJiAoIWE0X2V4aXN0cykpIHsKKwkJbWljX2hlYWRlcjJbOF0gPSBtcGR1WzI0XSAmIDB4MGY7CS8qIG11dGUgYml0cyAxNSAtIDQgKi8KKwkJbWljX2hlYWRlcjJbOV0gPSBtcGR1WzI1XSAmIDB4MDA7CisJfQorCisJaWYgKHFjX2V4aXN0cyAmJiBhNF9leGlzdHMpIHsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCW1pY19oZWFkZXIyWzggKyBpXSA9IG1wZHVbMjQgKyBpXTsJLyogQTQgKi8KKworCQltaWNfaGVhZGVyMlsxNF0gPSBtcGR1WzMwXSAmIDB4MGY7CisJCW1pY19oZWFkZXIyWzE1XSA9IG1wZHVbMzFdICYgMHgwMDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBjb25zdHJ1Y3RfbWljX2l2KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQnVpbGRzIHRoZSBNSUMgSVYgZnJvbSBoZWFkZXIgZmllbGRzIGFuZCBQTiAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgY29uc3RydWN0X21pY19pdih1bnNpZ25lZCBjaGFyICptaWNfaXYsCisJCSAgICAgIGludCBxY19leGlzdHMsCisJCSAgICAgIGludCBhNF9leGlzdHMsCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgKm1wZHUsCisJCSAgICAgIHVuc2lnbmVkIGludCBwYXlsb2FkX2xlbmd0aCwgdW5zaWduZWQgY2hhciAqcG5fdmVjdG9yKQoreworCWludCBpOworCisJbWljX2l2WzBdID0gMHg1OTsKKwlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykKKwkJbWljX2l2WzFdID0gbXBkdVszMF0gJiAweDBmOwkvKiBRb1NfVEMgICAgICAgICAgICovCisJaWYgKHFjX2V4aXN0cyAmJiAhYTRfZXhpc3RzKQorCQltaWNfaXZbMV0gPSBtcGR1WzI0XSAmIDB4MGY7CS8qIG11dGUgYml0cyA3LTQgICAgKi8KKwlpZiAoIXFjX2V4aXN0cykKKwkJbWljX2l2WzFdID0gMHgwMDsKKwlmb3IgKGkgPSAyOyBpIDwgODsgaSsrKQorCQltaWNfaXZbaV0gPSBtcGR1W2kgKyA4XTsJLyogbWljX2l2WzI6N10gPSBBMlswOjVdID0gbXBkdVsxMDoxNV0gKi8KKyNpZmRlZiBDT05TSVNURU5UX1BOX09SREVSCisJZm9yIChpID0gODsgaSA8IDE0OyBpKyspCisJCW1pY19pdltpXSA9IHBuX3ZlY3RvcltpIC0gOF07CS8qIG1pY19pdls4OjEzXSA9IFBOWzA6NV0gKi8KKyNlbHNlCisJZm9yIChpID0gODsgaSA8IDE0OyBpKyspCisJCW1pY19pdltpXSA9IHBuX3ZlY3RvclsxMyAtIGldOwkvKiBtaWNfaXZbODoxM10gPSBQTls1OjBdICovCisjZW5kaWYKKwlpID0gKHBheWxvYWRfbGVuZ3RoIC8gMjU2KTsKKwlpID0gKHBheWxvYWRfbGVuZ3RoICUgMjU2KTsKKwltaWNfaXZbMTRdID0gKHVuc2lnbmVkIGNoYXIpKHBheWxvYWRfbGVuZ3RoIC8gMjU2KTsKKwltaWNfaXZbMTVdID0gKHVuc2lnbmVkIGNoYXIpKHBheWxvYWRfbGVuZ3RoICUgMjU2KTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGFlczEyOGsxMjhkKCkgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUGVyZm9ybXMgYSAxMjggYml0IEFFUyBlbmNyeXB0IHdpdGggICovCisvKiAxMjggYml0IGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBhZXMxMjhrMTI4ZCh1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCSB1bnNpZ25lZCBjaGFyICpjaXBoZXJ0ZXh0KQoreworCWludCByb3VuZDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIGludGVybWVkaWF0ZWFbMTZdOworCXVuc2lnbmVkIGNoYXIgaW50ZXJtZWRpYXRlYlsxNl07CisJdW5zaWduZWQgY2hhciByb3VuZF9rZXlbMTZdOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCXJvdW5kX2tleVtpXSA9IGtleVtpXTsKKworCWZvciAocm91bmQgPSAwOyByb3VuZCA8IDExOyByb3VuZCsrKSB7CisJCWlmIChyb3VuZCA9PSAwKSB7CisJCQl4b3JfMTI4KHJvdW5kX2tleSwgZGF0YSwgY2lwaGVydGV4dCk7CisJCQluZXh0X2tleShyb3VuZF9rZXksIHJvdW5kKTsKKwkJfSBlbHNlIGlmIChyb3VuZCA9PSAxMCkgeworCQkJYnl0ZV9zdWIoY2lwaGVydGV4dCwgaW50ZXJtZWRpYXRlYSk7CisJCQlzaGlmdF9yb3coaW50ZXJtZWRpYXRlYSwgaW50ZXJtZWRpYXRlYik7CisJCQl4b3JfMTI4KGludGVybWVkaWF0ZWIsIHJvdW5kX2tleSwgY2lwaGVydGV4dCk7CisJCX0gZWxzZSB7CS8qIDEgLSA5ICovCisKKwkJCWJ5dGVfc3ViKGNpcGhlcnRleHQsIGludGVybWVkaWF0ZWEpOworCQkJc2hpZnRfcm93KGludGVybWVkaWF0ZWEsIGludGVybWVkaWF0ZWIpOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYlswXSwgJmludGVybWVkaWF0ZWFbMF0pOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYls0XSwgJmludGVybWVkaWF0ZWFbNF0pOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYls4XSwgJmludGVybWVkaWF0ZWFbOF0pOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYlsxMl0sICZpbnRlcm1lZGlhdGVhWzEyXSk7CisJCQl4b3JfMTI4KGludGVybWVkaWF0ZWEsIHJvdW5kX2tleSwgY2lwaGVydGV4dCk7CisJCQluZXh0X2tleShyb3VuZF9rZXksIHJvdW5kKTsKKwkJfQorCX0KKworfQorCit2b2lkIGNvbnN0cnVjdF9jdHJfcHJlbG9hZCh1bnNpZ25lZCBjaGFyICpjdHJfcHJlbG9hZCwKKwkJCSAgIGludCBhNF9leGlzdHMsCisJCQkgICBpbnQgcWNfZXhpc3RzLAorCQkJICAgdW5zaWduZWQgY2hhciAqbXBkdSwgdW5zaWduZWQgY2hhciAqcG5fdmVjdG9yLCBpbnQgYykKK3sKKworCWludCBpID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJY3RyX3ByZWxvYWRbaV0gPSAweDAwOworCWkgPSAwOworCisJY3RyX3ByZWxvYWRbMF0gPSAweDAxOwkvKiBmbGFnICovCisJaWYgKHFjX2V4aXN0cyAmJiBhNF9leGlzdHMpCisJCWN0cl9wcmVsb2FkWzFdID0gbXBkdVszMF0gJiAweDBmOwkvKiBRb0NfQ29udHJvbCAgKi8KKwlpZiAocWNfZXhpc3RzICYmICFhNF9leGlzdHMpCisJCWN0cl9wcmVsb2FkWzFdID0gbXBkdVsyNF0gJiAweDBmOworCisJZm9yIChpID0gMjsgaSA8IDg7IGkrKykKKwkJY3RyX3ByZWxvYWRbaV0gPSBtcGR1W2kgKyA4XTsJLyogY3RyX3ByZWxvYWRbMjo3XSA9IEEyWzA6NV0gPSBtcGR1WzEwOjE1XSAqLworI2lmZGVmIENPTlNJU1RFTlRfUE5fT1JERVIKKwlmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKKwkJY3RyX3ByZWxvYWRbaV0gPSBwbl92ZWN0b3JbaSAtIDhdOwkvKiBjdHJfcHJlbG9hZFs4OjEzXSA9IFBOWzA6NV0gKi8KKyNlbHNlCisJZm9yIChpID0gODsgaSA8IDE0OyBpKyspCisJCWN0cl9wcmVsb2FkW2ldID0gcG5fdmVjdG9yWzEzIC0gaV07CS8qIGN0cl9wcmVsb2FkWzg6MTNdID0gUE5bNTowXSAqLworI2VuZGlmCisJY3RyX3ByZWxvYWRbMTRdID0gKHVuc2lnbmVkIGNoYXIpKGMgLyAyNTYpOwkvKiBDdHIgKi8KKwljdHJfcHJlbG9hZFsxNV0gPSAodW5zaWduZWQgY2hhcikoYyAlIDI1Nik7CisKK30KKworQk9PTEVBTiBSVE1QU29mdERlY3J5cHRBRVMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdTggKnBEYXRhLAorCQkJICAgdW5zaWduZWQgbG9uZyBEYXRhQnl0ZUNudCwgc3RydWN0IHJ0X2NpcGhlcl9rZXkgKnBXcGFLZXkpCit7CisJdTggS2V5SUQ7CisJdTMyIEhlYWRlckxlbjsKKwl1OCBQTls2XTsKKwl1MzIgcGF5bG9hZF9sZW47CisJdTMyIG51bV9ibG9ja3M7CisJdTMyIHBheWxvYWRfcmVtYWluZGVyOworCXUxNiBmYzsKKwl1OCBmYzA7CisJdTggZmMxOworCXUzMiBmcmFtZV90eXBlOworCXUzMiBmcmFtZV9zdWJ0eXBlOworCXUzMiBmcm9tX2RzOworCXUzMiB0b19kczsKKwlpbnQgYTRfZXhpc3RzOworCWludCBxY19leGlzdHM7CisJdTggYWVzX291dFsxNl07CisJaW50IHBheWxvYWRfaW5kZXg7CisJdTMyIGk7CisJdTggY3RyX3ByZWxvYWRbMTZdOworCXU4IGNoYWluX2J1ZmZlclsxNl07CisJdTggcGFkZGVkX2J1ZmZlclsxNl07CisJdTggbWljX2l2WzE2XTsKKwl1OCBtaWNfaGVhZGVyMVsxNl07CisJdTggbWljX2hlYWRlcjJbMTZdOworCXU4IE1JQ1s4XTsKKwl1OCBUcmFpbE1JQ1s4XTsKKworCWZjMCA9ICpwRGF0YTsKKwlmYzEgPSAqKHBEYXRhICsgMSk7CisKKwlmYyA9ICooKHUxNiAqKXBEYXRhKTsKKworCWZyYW1lX3R5cGUgPSAoKGZjMCA+PiAyKSAmIDB4MDMpOworCWZyYW1lX3N1YnR5cGUgPSAoKGZjMCA+PiA0KSAmIDB4MGYpOworCisJZnJvbV9kcyA9IChmYzEgJiAweDIpID4+IDE7CisJdG9fZHMgPSAoZmMxICYgMHgxKTsKKworCWE0X2V4aXN0cyA9IChmcm9tX2RzICYgdG9fZHMpOworCXFjX2V4aXN0cyA9ICgoZnJhbWVfc3VidHlwZSA9PSAweDA4KSB8fAkvKiBBc3N1bWVkIFFvUyBzdWJ0eXBlcyAqLworCQkgICAgIChmcmFtZV9zdWJ0eXBlID09IDB4MDkpIHx8CS8qIExpa2VseSB0byBjaGFuZ2UuICAgICovCisJCSAgICAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwYSkgfHwgKGZyYW1lX3N1YnR5cGUgPT0gMHgwYikKKwkgICAgKTsKKworCUhlYWRlckxlbiA9IDI0OworCWlmIChhNF9leGlzdHMpCisJCUhlYWRlckxlbiArPSA2OworCisJS2V5SUQgPSAqKCh1OCAqKShwRGF0YSArIEhlYWRlckxlbiArIDMpKTsKKwlLZXlJRCA9IEtleUlEID4+IDY7CisKKwlpZiAocFdwYUtleVtLZXlJRF0uS2V5TGVuID09IDApIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJSVE1QU29mdERlY3J5cHRBRVMgZmFpbGVkIShLZXlJRFslZF0gTGVuZ3RoIGNhbiBub3QgYmUgMClcbiIsCisJCQkgIEtleUlEKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlQTlswXSA9ICoocERhdGEgKyBIZWFkZXJMZW4pOworCVBOWzFdID0gKihwRGF0YSArIEhlYWRlckxlbiArIDEpOworCVBOWzJdID0gKihwRGF0YSArIEhlYWRlckxlbiArIDQpOworCVBOWzNdID0gKihwRGF0YSArIEhlYWRlckxlbiArIDUpOworCVBOWzRdID0gKihwRGF0YSArIEhlYWRlckxlbiArIDYpOworCVBOWzVdID0gKihwRGF0YSArIEhlYWRlckxlbiArIDcpOworCisJcGF5bG9hZF9sZW4gPSBEYXRhQnl0ZUNudCAtIEhlYWRlckxlbiAtIDggLSA4OwkvKiA4IGJ5dGVzIGZvciBDQ01QIGhlYWRlciAsIDggYnl0ZXMgZm9yIE1JQyAqLworCXBheWxvYWRfcmVtYWluZGVyID0gKHBheWxvYWRfbGVuKSAlIDE2OworCW51bV9ibG9ja3MgPSAocGF5bG9hZF9sZW4pIC8gMTY7CisKKwkvKiBGaW5kIHN0YXJ0IG9mIHBheWxvYWQgKi8KKwlwYXlsb2FkX2luZGV4ID0gSGVhZGVyTGVuICsgODsJLypJVitFSVYgKi8KKworCWZvciAoaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKKwkJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLAorCQkJCSAgICAgIGE0X2V4aXN0cywgcWNfZXhpc3RzLCBwRGF0YSwgUE4sIGkgKyAxKTsKKworCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKKworCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwRGF0YSArIHBheWxvYWRfaW5kZXgsIGNoYWluX2J1ZmZlcik7CisJCU5kaXNNb3ZlTWVtb3J5KHBEYXRhICsgcGF5bG9hZF9pbmRleCAtIDgsIGNoYWluX2J1ZmZlciwgMTYpOworCQlwYXlsb2FkX2luZGV4ICs9IDE2OworCX0KKworCS8qICovCisJLyogSWYgdGhlcmUgaXMgYSBzaG9ydCBmaW5hbCBibG9jaywgdGhlbiBwYWQgaXQgKi8KKwkvKiBlbmNyeXB0IGl0IGFuZCBjb3B5IHRoZSB1bnBhZGRlZCBwYXJ0IGJhY2sgKi8KKwkvKiAqLworCWlmIChwYXlsb2FkX3JlbWFpbmRlciA+IDApIHsKKwkJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLAorCQkJCSAgICAgIGE0X2V4aXN0cywKKwkJCQkgICAgICBxY19leGlzdHMsIHBEYXRhLCBQTiwgbnVtX2Jsb2NrcyArIDEpOworCisJCU5kaXNaZXJvTWVtb3J5KHBhZGRlZF9idWZmZXIsIDE2KTsKKwkJTmRpc01vdmVNZW1vcnkocGFkZGVkX2J1ZmZlciwgcERhdGEgKyBwYXlsb2FkX2luZGV4LAorCQkJICAgICAgIHBheWxvYWRfcmVtYWluZGVyKTsKKworCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKKworCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwYWRkZWRfYnVmZmVyLCBjaGFpbl9idWZmZXIpOworCQlOZGlzTW92ZU1lbW9yeShwRGF0YSArIHBheWxvYWRfaW5kZXggLSA4LCBjaGFpbl9idWZmZXIsCisJCQkgICAgICAgcGF5bG9hZF9yZW1haW5kZXIpOworCQlwYXlsb2FkX2luZGV4ICs9IHBheWxvYWRfcmVtYWluZGVyOworCX0KKwkvKiAqLworCS8qIERlc2NyeXB0IHRoZSBNSUMgKi8KKwkvKiAqLworCWNvbnN0cnVjdF9jdHJfcHJlbG9hZChjdHJfcHJlbG9hZCwgYTRfZXhpc3RzLCBxY19leGlzdHMsIHBEYXRhLCBQTiwgMCk7CisJTmRpc1plcm9NZW1vcnkocGFkZGVkX2J1ZmZlciwgMTYpOworCU5kaXNNb3ZlTWVtb3J5KHBhZGRlZF9idWZmZXIsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgOCk7CisKKwlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKKworCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7CisKKwlOZGlzTW92ZU1lbW9yeShUcmFpbE1JQywgY2hhaW5fYnVmZmVyLCA4KTsKKworCS8qICovCisJLyogQ2FsY3VsYXRlIE1JQyAqLworCS8qICovCisKKwkvKkZvcmNlIHRoZSBwcm90ZWN0ZWQgZnJhbWUgYml0IG9uICovCisJKihwRGF0YSArIDEpID0gKihwRGF0YSArIDEpIHwgMHg0MDsKKworCS8qIEZpbmQgc3RhcnQgb2YgcGF5bG9hZCAqLworCS8qIEJlY2F1c2UgdGhlIENDTVAgaGVhZGVyIGhhcyBiZWVuIHJlbW92ZWQgKi8KKwlwYXlsb2FkX2luZGV4ID0gSGVhZGVyTGVuOworCisJY29uc3RydWN0X21pY19pdihtaWNfaXYsIHFjX2V4aXN0cywgYTRfZXhpc3RzLCBwRGF0YSwgcGF5bG9hZF9sZW4sIFBOKTsKKworCWNvbnN0cnVjdF9taWNfaGVhZGVyMShtaWNfaGVhZGVyMSwgSGVhZGVyTGVuLCBwRGF0YSk7CisKKwljb25zdHJ1Y3RfbWljX2hlYWRlcjIobWljX2hlYWRlcjIsIHBEYXRhLCBhNF9leGlzdHMsIHFjX2V4aXN0cyk7CisKKwlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIG1pY19pdiwgYWVzX291dCk7CisJYml0d2lzZV94b3IoYWVzX291dCwgbWljX2hlYWRlcjEsIGNoYWluX2J1ZmZlcik7CisJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOworCWJpdHdpc2VfeG9yKGFlc19vdXQsIG1pY19oZWFkZXIyLCBjaGFpbl9idWZmZXIpOworCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKKworCS8qIGl0ZXJhdGUgdGhyb3VnaCBlYWNoIDE2IGJ5dGUgcGF5bG9hZCBibG9jayAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKKwkJYml0d2lzZV94b3IoYWVzX291dCwgcERhdGEgKyBwYXlsb2FkX2luZGV4LCBjaGFpbl9idWZmZXIpOworCQlwYXlsb2FkX2luZGV4ICs9IDE2OworCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7CisJfQorCisJLyogQWRkIG9uIHRoZSBmaW5hbCBwYXlsb2FkIGJsb2NrIGlmIGl0IG5lZWRzIHBhZGRpbmcgKi8KKwlpZiAocGF5bG9hZF9yZW1haW5kZXIgPiAwKSB7CisJCU5kaXNaZXJvTWVtb3J5KHBhZGRlZF9idWZmZXIsIDE2KTsKKwkJTmRpc01vdmVNZW1vcnkocGFkZGVkX2J1ZmZlciwgcERhdGEgKyBwYXlsb2FkX2luZGV4LAorCQkJICAgICAgIHBheWxvYWRfcmVtYWluZGVyKTsKKworCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwYWRkZWRfYnVmZmVyLCBjaGFpbl9idWZmZXIpOworCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7CisJfQorCS8qIGFlc19vdXQgY29udGFpbnMgcGFkZGVkIG1pYywgZGlzY2FyZCBtb3N0IHNpZ25pZmljYW50ICovCisJLyogOCBieXRlcyB0byBnZW5lcmF0ZSA2NCBiaXQgTUlDICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJTUlDW2ldID0gYWVzX291dFtpXTsKKworCWlmICghTmRpc0VxdWFsTWVtb3J5KE1JQywgVHJhaWxNSUMsIDgpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTb2Z0RGVjcnlwdEFFUywgTUlDIEVycm9yICFcbiIpKTsJLypNSUMgZXJyb3IuICovCisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PSAgQUVTIEVuL0RlY3J5cHRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNpZm5kZWYJdWludDgKKyNkZWZpbmUJdWludDggIHVuc2lnbmVkCWNoYXIKKyNlbmRpZgorCisjaWZuZGVmCXVpbnQzMgorI2RlZmluZQl1aW50MzIgdW5zaWduZWQJaW50CisjZW5kaWYKKworLyogZm9yd2FyZCBTLWJveCAqLworc3RhdGljIHVpbnQzMiBGU2JbMjU2XSA9IHsKKwkweDYzLCAweDdDLCAweDc3LCAweDdCLCAweEYyLCAweDZCLCAweDZGLCAweEM1LAorCTB4MzAsIDB4MDEsIDB4NjcsIDB4MkIsIDB4RkUsIDB4RDcsIDB4QUIsIDB4NzYsCisJMHhDQSwgMHg4MiwgMHhDOSwgMHg3RCwgMHhGQSwgMHg1OSwgMHg0NywgMHhGMCwKKwkweEFELCAweEQ0LCAweEEyLCAweEFGLCAweDlDLCAweEE0LCAweDcyLCAweEMwLAorCTB4QjcsIDB4RkQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M0YsIDB4RjcsIDB4Q0MsCisJMHgzNCwgMHhBNSwgMHhFNSwgMHhGMSwgMHg3MSwgMHhEOCwgMHgzMSwgMHgxNSwKKwkweDA0LCAweEM3LCAweDIzLCAweEMzLCAweDE4LCAweDk2LCAweDA1LCAweDlBLAorCTB4MDcsIDB4MTIsIDB4ODAsIDB4RTIsIDB4RUIsIDB4MjcsIDB4QjIsIDB4NzUsCisJMHgwOSwgMHg4MywgMHgyQywgMHgxQSwgMHgxQiwgMHg2RSwgMHg1QSwgMHhBMCwKKwkweDUyLCAweDNCLCAweEQ2LCAweEIzLCAweDI5LCAweEUzLCAweDJGLCAweDg0LAorCTB4NTMsIDB4RDEsIDB4MDAsIDB4RUQsIDB4MjAsIDB4RkMsIDB4QjEsIDB4NUIsCisJMHg2QSwgMHhDQiwgMHhCRSwgMHgzOSwgMHg0QSwgMHg0QywgMHg1OCwgMHhDRiwKKwkweEQwLCAweEVGLCAweEFBLCAweEZCLCAweDQzLCAweDRELCAweDMzLCAweDg1LAorCTB4NDUsIDB4RjksIDB4MDIsIDB4N0YsIDB4NTAsIDB4M0MsIDB4OUYsIDB4QTgsCisJMHg1MSwgMHhBMywgMHg0MCwgMHg4RiwgMHg5MiwgMHg5RCwgMHgzOCwgMHhGNSwKKwkweEJDLCAweEI2LCAweERBLCAweDIxLCAweDEwLCAweEZGLCAweEYzLCAweEQyLAorCTB4Q0QsIDB4MEMsIDB4MTMsIDB4RUMsIDB4NUYsIDB4OTcsIDB4NDQsIDB4MTcsCisJMHhDNCwgMHhBNywgMHg3RSwgMHgzRCwgMHg2NCwgMHg1RCwgMHgxOSwgMHg3MywKKwkweDYwLCAweDgxLCAweDRGLCAweERDLCAweDIyLCAweDJBLCAweDkwLCAweDg4LAorCTB4NDYsIDB4RUUsIDB4QjgsIDB4MTQsIDB4REUsIDB4NUUsIDB4MEIsIDB4REIsCisJMHhFMCwgMHgzMiwgMHgzQSwgMHgwQSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1QywKKwkweEMyLCAweEQzLCAweEFDLCAweDYyLCAweDkxLCAweDk1LCAweEU0LCAweDc5LAorCTB4RTcsIDB4QzgsIDB4MzcsIDB4NkQsIDB4OEQsIDB4RDUsIDB4NEUsIDB4QTksCisJMHg2QywgMHg1NiwgMHhGNCwgMHhFQSwgMHg2NSwgMHg3QSwgMHhBRSwgMHgwOCwKKwkweEJBLCAweDc4LCAweDI1LCAweDJFLCAweDFDLCAweEE2LCAweEI0LCAweEM2LAorCTB4RTgsIDB4REQsIDB4NzQsIDB4MUYsIDB4NEIsIDB4QkQsIDB4OEIsIDB4OEEsCisJMHg3MCwgMHgzRSwgMHhCNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhGNiwgMHgwRSwKKwkweDYxLCAweDM1LCAweDU3LCAweEI5LCAweDg2LCAweEMxLCAweDFELCAweDlFLAorCTB4RTEsIDB4RjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4RDksIDB4OEUsIDB4OTQsCisJMHg5QiwgMHgxRSwgMHg4NywgMHhFOSwgMHhDRSwgMHg1NSwgMHgyOCwgMHhERiwKKwkweDhDLCAweEExLCAweDg5LCAweDBELCAweEJGLCAweEU2LCAweDQyLCAweDY4LAorCTB4NDEsIDB4OTksIDB4MkQsIDB4MEYsIDB4QjAsIDB4NTQsIDB4QkIsIDB4MTYKK307CisKKy8qIGZvcndhcmQgdGFibGUgKi8KKyNkZWZpbmUJRlQgXAorXAorCVYoQzYsNjMsNjMsQTUpLAlWKEY4LDdDLDdDLDg0KSwJVihFRSw3Nyw3Nyw5OSksCVYoRjYsN0IsN0IsOEQpLAlcCisJVihGRixGMixGMiwwRCksCVYoRDYsNkIsNkIsQkQpLAlWKERFLDZGLDZGLEIxKSwJVig5MSxDNSxDNSw1NCksCVwKKwlWKDYwLDMwLDMwLDUwKSwJVigwMiwwMSwwMSwwMyksCVYoQ0UsNjcsNjcsQTkpLAlWKDU2LDJCLDJCLDdEKSwJXAorCVYoRTcsRkUsRkUsMTkpLAlWKEI1LEQ3LEQ3LDYyKSwJVig0RCxBQixBQixFNiksCVYoRUMsNzYsNzYsOUEpLAlcCisJVig4RixDQSxDQSw0NSksCVYoMUYsODIsODIsOUQpLAlWKDg5LEM5LEM5LDQwKSwJVihGQSw3RCw3RCw4NyksCVwKKwlWKEVGLEZBLEZBLDE1KSwJVihCMiw1OSw1OSxFQiksCVYoOEUsNDcsNDcsQzkpLAlWKEZCLEYwLEYwLDBCKSwJXAorCVYoNDEsQUQsQUQsRUMpLAlWKEIzLEQ0LEQ0LDY3KSwJVig1RixBMixBMixGRCksCVYoNDUsQUYsQUYsRUEpLAlcCisJVigyMyw5Qyw5QyxCRiksCVYoNTMsQTQsQTQsRjcpLAlWKEU0LDcyLDcyLDk2KSwJVig5QixDMCxDMCw1QiksCVwKKwlWKDc1LEI3LEI3LEMyKSwJVihFMSxGRCxGRCwxQyksCVYoM0QsOTMsOTMsQUUpLAlWKDRDLDI2LDI2LDZBKSwJXAorCVYoNkMsMzYsMzYsNUEpLAlWKDdFLDNGLDNGLDQxKSwJVihGNSxGNyxGNywwMiksCVYoODMsQ0MsQ0MsNEYpLAlcCisJVig2OCwzNCwzNCw1QyksCVYoNTEsQTUsQTUsRjQpLAlWKEQxLEU1LEU1LDM0KSwJVihGOSxGMSxGMSwwOCksCVwKKwlWKEUyLDcxLDcxLDkzKSwJVihBQixEOCxEOCw3MyksCVYoNjIsMzEsMzEsNTMpLAlWKDJBLDE1LDE1LDNGKSwJXAorCVYoMDgsMDQsMDQsMEMpLAlWKDk1LEM3LEM3LDUyKSwJVig0NiwyMywyMyw2NSksCVYoOUQsQzMsQzMsNUUpLAlcCisJVigzMCwxOCwxOCwyOCksCVYoMzcsOTYsOTYsQTEpLAlWKDBBLDA1LDA1LDBGKSwJVigyRiw5QSw5QSxCNSksCVwKKwlWKDBFLDA3LDA3LDA5KSwJVigyNCwxMiwxMiwzNiksCVYoMUIsODAsODAsOUIpLAlWKERGLEUyLEUyLDNEKSwJXAorCVYoQ0QsRUIsRUIsMjYpLAlWKDRFLDI3LDI3LDY5KSwJVig3RixCMixCMixDRCksCVYoRUEsNzUsNzUsOUYpLAlcCisJVigxMiwwOSwwOSwxQiksCVYoMUQsODMsODMsOUUpLAlWKDU4LDJDLDJDLDc0KSwJVigzNCwxQSwxQSwyRSksCVwKKwlWKDM2LDFCLDFCLDJEKSwJVihEQyw2RSw2RSxCMiksCVYoQjQsNUEsNUEsRUUpLAlWKDVCLEEwLEEwLEZCKSwJXAorCVYoQTQsNTIsNTIsRjYpLAlWKDc2LDNCLDNCLDREKSwJVihCNyxENixENiw2MSksCVYoN0QsQjMsQjMsQ0UpLAlcCisJVig1MiwyOSwyOSw3QiksCVYoREQsRTMsRTMsM0UpLAlWKDVFLDJGLDJGLDcxKSwJVigxMyw4NCw4NCw5NyksCVwKKwlWKEE2LDUzLDUzLEY1KSwJVihCOSxEMSxEMSw2OCksCVYoMDAsMDAsMDAsMDApLAlWKEMxLEVELEVELDJDKSwJXAorCVYoNDAsMjAsMjAsNjApLAlWKEUzLEZDLEZDLDFGKSwJVig3OSxCMSxCMSxDOCksCVYoQjYsNUIsNUIsRUQpLAlcCisJVihENCw2QSw2QSxCRSksCVYoOEQsQ0IsQ0IsNDYpLAlWKDY3LEJFLEJFLEQ5KSwJVig3MiwzOSwzOSw0QiksCVwKKwlWKDk0LDRBLDRBLERFKSwJVig5OCw0Qyw0QyxENCksCVYoQjAsNTgsNTgsRTgpLAlWKDg1LENGLENGLDRBKSwJXAorCVYoQkIsRDAsRDAsNkIpLAlWKEM1LEVGLEVGLDJBKSwJVig0RixBQSxBQSxFNSksCVYoRUQsRkIsRkIsMTYpLAlcCisJVig4Niw0Myw0MyxDNSksCVYoOUEsNEQsNEQsRDcpLAlWKDY2LDMzLDMzLDU1KSwJVigxMSw4NSw4NSw5NCksCVwKKwlWKDhBLDQ1LDQ1LENGKSwJVihFOSxGOSxGOSwxMCksCVYoMDQsMDIsMDIsMDYpLAlWKEZFLDdGLDdGLDgxKSwJXAorCVYoQTAsNTAsNTAsRjApLAlWKDc4LDNDLDNDLDQ0KSwJVigyNSw5Riw5RixCQSksCVYoNEIsQTgsQTgsRTMpLAlcCisJVihBMiw1MSw1MSxGMyksCVYoNUQsQTMsQTMsRkUpLAlWKDgwLDQwLDQwLEMwKSwJVigwNSw4Riw4Riw4QSksCVwKKwlWKDNGLDkyLDkyLEFEKSwJVigyMSw5RCw5RCxCQyksCVYoNzAsMzgsMzgsNDgpLAlWKEYxLEY1LEY1LDA0KSwJXAorCVYoNjMsQkMsQkMsREYpLAlWKDc3LEI2LEI2LEMxKSwJVihBRixEQSxEQSw3NSksCVYoNDIsMjEsMjEsNjMpLAlcCisJVigyMCwxMCwxMCwzMCksCVYoRTUsRkYsRkYsMUEpLAlWKEZELEYzLEYzLDBFKSwJVihCRixEMixEMiw2RCksCVwKKwlWKDgxLENELENELDRDKSwJVigxOCwwQywwQywxNCksCVYoMjYsMTMsMTMsMzUpLAlWKEMzLEVDLEVDLDJGKSwJXAorCVYoQkUsNUYsNUYsRTEpLAlWKDM1LDk3LDk3LEEyKSwJVig4OCw0NCw0NCxDQyksCVYoMkUsMTcsMTcsMzkpLAlcCisJVig5MyxDNCxDNCw1NyksCVYoNTUsQTcsQTcsRjIpLAlWKEZDLDdFLDdFLDgyKSwJVig3QSwzRCwzRCw0NyksCVwKKwlWKEM4LDY0LDY0LEFDKSwJVihCQSw1RCw1RCxFNyksCVYoMzIsMTksMTksMkIpLAlWKEU2LDczLDczLDk1KSwJXAorCVYoQzAsNjAsNjAsQTApLAlWKDE5LDgxLDgxLDk4KSwJVig5RSw0Riw0RixEMSksCVYoQTMsREMsREMsN0YpLAlcCisJVig0NCwyMiwyMiw2NiksCVYoNTQsMkEsMkEsN0UpLAlWKDNCLDkwLDkwLEFCKSwJVigwQiw4OCw4OCw4MyksCVwKKwlWKDhDLDQ2LDQ2LENBKSwJVihDNyxFRSxFRSwyOSksCVYoNkIsQjgsQjgsRDMpLAlWKDI4LDE0LDE0LDNDKSwJXAorCVYoQTcsREUsREUsNzkpLAlWKEJDLDVFLDVFLEUyKSwJVigxNiwwQiwwQiwxRCksCVYoQUQsREIsREIsNzYpLAlcCisJVihEQixFMCxFMCwzQiksCVYoNjQsMzIsMzIsNTYpLAlWKDc0LDNBLDNBLDRFKSwJVigxNCwwQSwwQSwxRSksCVwKKwlWKDkyLDQ5LDQ5LERCKSwJVigwQywwNiwwNiwwQSksCVYoNDgsMjQsMjQsNkMpLAlWKEI4LDVDLDVDLEU0KSwJXAorCVYoOUYsQzIsQzIsNUQpLAlWKEJELEQzLEQzLDZFKSwJVig0MyxBQyxBQyxFRiksCVYoQzQsNjIsNjIsQTYpLAlcCisJVigzOSw5MSw5MSxBOCksCVYoMzEsOTUsOTUsQTQpLAlWKEQzLEU0LEU0LDM3KSwJVihGMiw3OSw3OSw4QiksCVwKKwlWKEQ1LEU3LEU3LDMyKSwJVig4QixDOCxDOCw0MyksCVYoNkUsMzcsMzcsNTkpLAlWKERBLDZELDZELEI3KSwJXAorCVYoMDEsOEQsOEQsOEMpLAlWKEIxLEQ1LEQ1LDY0KSwJVig5Qyw0RSw0RSxEMiksCVYoNDksQTksQTksRTApLAlcCisJVihEOCw2Qyw2QyxCNCksCVYoQUMsNTYsNTYsRkEpLAlWKEYzLEY0LEY0LDA3KSwJVihDRixFQSxFQSwyNSksCVwKKwlWKENBLDY1LDY1LEFGKSwJVihGNCw3QSw3QSw4RSksCVYoNDcsQUUsQUUsRTkpLAlWKDEwLDA4LDA4LDE4KSwJXAorCVYoNkYsQkEsQkEsRDUpLAlWKEYwLDc4LDc4LDg4KSwJVig0QSwyNSwyNSw2RiksCVYoNUMsMkUsMkUsNzIpLAlcCisJVigzOCwxQywxQywyNCksCVYoNTcsQTYsQTYsRjEpLAlWKDczLEI0LEI0LEM3KSwJVig5NyxDNixDNiw1MSksCVwKKwlWKENCLEU4LEU4LDIzKSwJVihBMSxERCxERCw3QyksCVYoRTgsNzQsNzQsOUMpLAlWKDNFLDFGLDFGLDIxKSwJXAorCVYoOTYsNEIsNEIsREQpLAlWKDYxLEJELEJELERDKSwJVigwRCw4Qiw4Qiw4NiksCVYoMEYsOEEsOEEsODUpLAlcCisJVihFMCw3MCw3MCw5MCksCVYoN0MsM0UsM0UsNDIpLAlWKDcxLEI1LEI1LEM0KSwJVihDQyw2Niw2NixBQSksCVwKKwlWKDkwLDQ4LDQ4LEQ4KSwJVigwNiwwMywwMywwNSksCVYoRjcsRjYsRjYsMDEpLAlWKDFDLDBFLDBFLDEyKSwJXAorCVYoQzIsNjEsNjEsQTMpLAlWKDZBLDM1LDM1LDVGKSwJVihBRSw1Nyw1NyxGOSksCVYoNjksQjksQjksRDApLAlcCisJVigxNyw4Niw4Niw5MSksCVYoOTksQzEsQzEsNTgpLAlWKDNBLDFELDFELDI3KSwJVigyNyw5RSw5RSxCOSksCVwKKwlWKEQ5LEUxLEUxLDM4KSwJVihFQixGOCxGOCwxMyksCVYoMkIsOTgsOTgsQjMpLAlWKDIyLDExLDExLDMzKSwJXAorCVYoRDIsNjksNjksQkIpLAlWKEE5LEQ5LEQ5LDcwKSwJVigwNyw4RSw4RSw4OSksCVYoMzMsOTQsOTQsQTcpLAlcCisJVigyRCw5Qiw5QixCNiksCVYoM0MsMUUsMUUsMjIpLAlWKDE1LDg3LDg3LDkyKSwJVihDOSxFOSxFOSwyMCksCVwKKwlWKDg3LENFLENFLDQ5KSwJVihBQSw1NSw1NSxGRiksCVYoNTAsMjgsMjgsNzgpLAlWKEE1LERGLERGLDdBKSwJXAorCVYoMDMsOEMsOEMsOEYpLAlWKDU5LEExLEExLEY4KSwJVigwOSw4OSw4OSw4MCksCVYoMUEsMEQsMEQsMTcpLAlcCisJVig2NSxCRixCRixEQSksCVYoRDcsRTYsRTYsMzEpLAlWKDg0LDQyLDQyLEM2KSwJVihEMCw2OCw2OCxCOCksCVwKKwlWKDgyLDQxLDQxLEMzKSwJVigyOSw5OSw5OSxCMCksCVYoNUEsMkQsMkQsNzcpLAlWKDFFLDBGLDBGLDExKSwJXAorCVYoN0IsQjAsQjAsQ0IpLAlWKEE4LDU0LDU0LEZDKSwJVig2RCxCQixCQixENiksCVYoMkMsMTYsMTYsM0EpCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYSMjYiMjYyMjZAorc3RhdGljIHVpbnQzMiBGVDBbMjU2XSA9IHsgRlQgfTsKKworI3VuZGVmIFYKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNkIyNhIyNiIyNjCitzdGF0aWMgdWludDMyIEZUMVsyNTZdID0geyBGVCB9OworCisjdW5kZWYgVgorCisjZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2MjI2QjI2EjI2IKK3N0YXRpYyB1aW50MzIgRlQyWzI1Nl0gPSB7IEZUIH07CisKKyN1bmRlZiBWCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYiMjYyMjZCMjYQorc3RhdGljIHVpbnQzMiBGVDNbMjU2XSA9IHsgRlQgfTsKKworI3VuZGVmIFYKKworI3VuZGVmIEZUCisKKy8qIHJldmVyc2UgUy1ib3ggKi8KKworc3RhdGljIHVpbnQzMiBSU2JbMjU2XSA9IHsKKwkweDUyLCAweDA5LCAweDZBLCAweEQ1LCAweDMwLCAweDM2LCAweEE1LCAweDM4LAorCTB4QkYsIDB4NDAsIDB4QTMsIDB4OUUsIDB4ODEsIDB4RjMsIDB4RDcsIDB4RkIsCisJMHg3QywgMHhFMywgMHgzOSwgMHg4MiwgMHg5QiwgMHgyRiwgMHhGRiwgMHg4NywKKwkweDM0LCAweDhFLCAweDQzLCAweDQ0LCAweEM0LCAweERFLCAweEU5LCAweENCLAorCTB4NTQsIDB4N0IsIDB4OTQsIDB4MzIsIDB4QTYsIDB4QzIsIDB4MjMsIDB4M0QsCisJMHhFRSwgMHg0QywgMHg5NSwgMHgwQiwgMHg0MiwgMHhGQSwgMHhDMywgMHg0RSwKKwkweDA4LCAweDJFLCAweEExLCAweDY2LCAweDI4LCAweEQ5LCAweDI0LCAweEIyLAorCTB4NzYsIDB4NUIsIDB4QTIsIDB4NDksIDB4NkQsIDB4OEIsIDB4RDEsIDB4MjUsCisJMHg3MiwgMHhGOCwgMHhGNiwgMHg2NCwgMHg4NiwgMHg2OCwgMHg5OCwgMHgxNiwKKwkweEQ0LCAweEE0LCAweDVDLCAweENDLCAweDVELCAweDY1LCAweEI2LCAweDkyLAorCTB4NkMsIDB4NzAsIDB4NDgsIDB4NTAsIDB4RkQsIDB4RUQsIDB4QjksIDB4REEsCisJMHg1RSwgMHgxNSwgMHg0NiwgMHg1NywgMHhBNywgMHg4RCwgMHg5RCwgMHg4NCwKKwkweDkwLCAweEQ4LCAweEFCLCAweDAwLCAweDhDLCAweEJDLCAweEQzLCAweDBBLAorCTB4RjcsIDB4RTQsIDB4NTgsIDB4MDUsIDB4QjgsIDB4QjMsIDB4NDUsIDB4MDYsCisJMHhEMCwgMHgyQywgMHgxRSwgMHg4RiwgMHhDQSwgMHgzRiwgMHgwRiwgMHgwMiwKKwkweEMxLCAweEFGLCAweEJELCAweDAzLCAweDAxLCAweDEzLCAweDhBLCAweDZCLAorCTB4M0EsIDB4OTEsIDB4MTEsIDB4NDEsIDB4NEYsIDB4NjcsIDB4REMsIDB4RUEsCisJMHg5NywgMHhGMiwgMHhDRiwgMHhDRSwgMHhGMCwgMHhCNCwgMHhFNiwgMHg3MywKKwkweDk2LCAweEFDLCAweDc0LCAweDIyLCAweEU3LCAweEFELCAweDM1LCAweDg1LAorCTB4RTIsIDB4RjksIDB4MzcsIDB4RTgsIDB4MUMsIDB4NzUsIDB4REYsIDB4NkUsCisJMHg0NywgMHhGMSwgMHgxQSwgMHg3MSwgMHgxRCwgMHgyOSwgMHhDNSwgMHg4OSwKKwkweDZGLCAweEI3LCAweDYyLCAweDBFLCAweEFBLCAweDE4LCAweEJFLCAweDFCLAorCTB4RkMsIDB4NTYsIDB4M0UsIDB4NEIsIDB4QzYsIDB4RDIsIDB4NzksIDB4MjAsCisJMHg5QSwgMHhEQiwgMHhDMCwgMHhGRSwgMHg3OCwgMHhDRCwgMHg1QSwgMHhGNCwKKwkweDFGLCAweERELCAweEE4LCAweDMzLCAweDg4LCAweDA3LCAweEM3LCAweDMxLAorCTB4QjEsIDB4MTIsIDB4MTAsIDB4NTksIDB4MjcsIDB4ODAsIDB4RUMsIDB4NUYsCisJMHg2MCwgMHg1MSwgMHg3RiwgMHhBOSwgMHgxOSwgMHhCNSwgMHg0QSwgMHgwRCwKKwkweDJELCAweEU1LCAweDdBLCAweDlGLCAweDkzLCAweEM5LCAweDlDLCAweEVGLAorCTB4QTAsIDB4RTAsIDB4M0IsIDB4NEQsIDB4QUUsIDB4MkEsIDB4RjUsIDB4QjAsCisJMHhDOCwgMHhFQiwgMHhCQiwgMHgzQywgMHg4MywgMHg1MywgMHg5OSwgMHg2MSwKKwkweDE3LCAweDJCLCAweDA0LCAweDdFLCAweEJBLCAweDc3LCAweEQ2LCAweDI2LAorCTB4RTEsIDB4NjksIDB4MTQsIDB4NjMsIDB4NTUsIDB4MjEsIDB4MEMsIDB4N0QKK307CisKKy8qIHJldmVyc2UgdGFibGUgKi8KKworI2RlZmluZQlSVCBcCitcCisJVig1MSxGNCxBNyw1MCksCVYoN0UsNDEsNjUsNTMpLAlWKDFBLDE3LEE0LEMzKSwJVigzQSwyNyw1RSw5NiksCVwKKwlWKDNCLEFCLDZCLENCKSwJVigxRiw5RCw0NSxGMSksCVYoQUMsRkEsNTgsQUIpLAlWKDRCLEUzLDAzLDkzKSwJXAorCVYoMjAsMzAsRkEsNTUpLAlWKEFELDc2LDZELEY2KSwJVig4OCxDQyw3Niw5MSksCVYoRjUsMDIsNEMsMjUpLAlcCisJVig0RixFNSxENyxGQyksCVYoQzUsMkEsQ0IsRDcpLAlWKDI2LDM1LDQ0LDgwKSwJVihCNSw2MixBMyw4RiksCVwKKwlWKERFLEIxLDVBLDQ5KSwJVigyNSxCQSwxQiw2NyksCVYoNDUsRUEsMEUsOTgpLAlWKDVELEZFLEMwLEUxKSwJXAorCVYoQzMsMkYsNzUsMDIpLAlWKDgxLDRDLEYwLDEyKSwJVig4RCw0Niw5NyxBMyksCVYoNkIsRDMsRjksQzYpLAlcCisJVigwMyw4Riw1RixFNyksCVYoMTUsOTIsOUMsOTUpLAlWKEJGLDZELDdBLEVCKSwJVig5NSw1Miw1OSxEQSksCVwKKwlWKEQ0LEJFLDgzLDJEKSwJVig1OCw3NCwyMSxEMyksCVYoNDksRTAsNjksMjkpLAlWKDhFLEM5LEM4LDQ0KSwJXAorCVYoNzUsQzIsODksNkEpLAlWKEY0LDhFLDc5LDc4KSwJVig5OSw1OCwzRSw2QiksCVYoMjcsQjksNzEsREQpLAlcCisJVihCRSxFMSw0RixCNiksCVYoRjAsODgsQUQsMTcpLAlWKEM5LDIwLEFDLDY2KSwJVig3RCxDRSwzQSxCNCksCVwKKwlWKDYzLERGLDRBLDE4KSwJVihFNSwxQSwzMSw4MiksCVYoOTcsNTEsMzMsNjApLAlWKDYyLDUzLDdGLDQ1KSwJXAorCVYoQjEsNjQsNzcsRTApLAlWKEJCLDZCLEFFLDg0KSwJVihGRSw4MSxBMCwxQyksCVYoRjksMDgsMkIsOTQpLAlcCisJVig3MCw0OCw2OCw1OCksCVYoOEYsNDUsRkQsMTkpLAlWKDk0LERFLDZDLDg3KSwJVig1Miw3QixGOCxCNyksCVwKKwlWKEFCLDczLEQzLDIzKSwJVig3Miw0QiwwMixFMiksCVYoRTMsMUYsOEYsNTcpLAlWKDY2LDU1LEFCLDJBKSwJXAorCVYoQjIsRUIsMjgsMDcpLAlWKDJGLEI1LEMyLDAzKSwJVig4NixDNSw3Qiw5QSksCVYoRDMsMzcsMDgsQTUpLAlcCisJVigzMCwyOCw4NyxGMiksCVYoMjMsQkYsQTUsQjIpLAlWKDAyLDAzLDZBLEJBKSwJVihFRCwxNiw4Miw1QyksCVwKKwlWKDhBLENGLDFDLDJCKSwJVihBNyw3OSxCNCw5MiksCVYoRjMsMDcsRjIsRjApLAlWKDRFLDY5LEUyLEExKSwJXAorCVYoNjUsREEsRjQsQ0QpLAlWKDA2LDA1LEJFLEQ1KSwJVihEMSwzNCw2MiwxRiksCVYoQzQsQTYsRkUsOEEpLAlcCisJVigzNCwyRSw1Myw5RCksCVYoQTIsRjMsNTUsQTApLAlWKDA1LDhBLEUxLDMyKSwJVihBNCxGNixFQiw3NSksCVwKKwlWKDBCLDgzLEVDLDM5KSwJVig0MCw2MCxFRixBQSksCVYoNUUsNzEsOUYsMDYpLAlWKEJELDZFLDEwLDUxKSwJXAorCVYoM0UsMjEsOEEsRjkpLAlWKDk2LERELDA2LDNEKSwJVihERCwzRSwwNSxBRSksCVYoNEQsRTYsQkQsNDYpLAlcCisJVig5MSw1NCw4RCxCNSksCVYoNzEsQzQsNUQsMDUpLAlWKDA0LDA2LEQ0LDZGKSwJVig2MCw1MCwxNSxGRiksCVwKKwlWKDE5LDk4LEZCLDI0KSwJVihENixCRCxFOSw5NyksCVYoODksNDAsNDMsQ0MpLAlWKDY3LEQ5LDlFLDc3KSwJXAorCVYoQjAsRTgsNDIsQkQpLAlWKDA3LDg5LDhCLDg4KSwJVihFNywxOSw1QiwzOCksCVYoNzksQzgsRUUsREIpLAlcCisJVihBMSw3QywwQSw0NyksCVYoN0MsNDIsMEYsRTkpLAlWKEY4LDg0LDFFLEM5KSwJVigwMCwwMCwwMCwwMCksCVwKKwlWKDA5LDgwLDg2LDgzKSwJVigzMiwyQixFRCw0OCksCVYoMUUsMTEsNzAsQUMpLAlWKDZDLDVBLDcyLDRFKSwJXAorCVYoRkQsMEUsRkYsRkIpLAlWKDBGLDg1LDM4LDU2KSwJVigzRCxBRSxENSwxRSksCVYoMzYsMkQsMzksMjcpLAlcCisJVigwQSwwRixEOSw2NCksCVYoNjgsNUMsQTYsMjEpLAlWKDlCLDVCLDU0LEQxKSwJVigyNCwzNiwyRSwzQSksCVwKKwlWKDBDLDBBLDY3LEIxKSwJVig5Myw1NyxFNywwRiksCVYoQjQsRUUsOTYsRDIpLAlWKDFCLDlCLDkxLDlFKSwJXAorCVYoODAsQzAsQzUsNEYpLAlWKDYxLERDLDIwLEEyKSwJVig1QSw3Nyw0Qiw2OSksCVYoMUMsMTIsMUEsMTYpLAlcCisJVihFMiw5MyxCQSwwQSksCVYoQzAsQTAsMkEsRTUpLAlWKDNDLDIyLEUwLDQzKSwJVigxMiwxQiwxNywxRCksCVwKKwlWKDBFLDA5LDBELDBCKSwJVihGMiw4QixDNyxBRCksCVYoMkQsQjYsQTgsQjkpLAlWKDE0LDFFLEE5LEM4KSwJXAorCVYoNTcsRjEsMTksODUpLAlWKEFGLDc1LDA3LDRDKSwJVihFRSw5OSxERCxCQiksCVYoQTMsN0YsNjAsRkQpLAlcCisJVihGNywwMSwyNiw5RiksCVYoNUMsNzIsRjUsQkMpLAlWKDQ0LDY2LDNCLEM1KSwJVig1QixGQiw3RSwzNCksCVwKKwlWKDhCLDQzLDI5LDc2KSwJVihDQiwyMyxDNixEQyksCVYoQjYsRUQsRkMsNjgpLAlWKEI4LEU0LEYxLDYzKSwJXAorCVYoRDcsMzEsREMsQ0EpLAlWKDQyLDYzLDg1LDEwKSwJVigxMyw5NywyMiw0MCksCVYoODQsQzYsMTEsMjApLAlcCisJVig4NSw0QSwyNCw3RCksCVYoRDIsQkIsM0QsRjgpLAlWKEFFLEY5LDMyLDExKSwJVihDNywyOSxBMSw2RCksCVwKKwlWKDFELDlFLDJGLDRCKSwJVihEQyxCMiwzMCxGMyksCVYoMEQsODYsNTIsRUMpLAlWKDc3LEMxLEUzLEQwKSwJXAorCVYoMkIsQjMsMTYsNkMpLAlWKEE5LDcwLEI5LDk5KSwJVigxMSw5NCw0OCxGQSksCVYoNDcsRTksNjQsMjIpLAlcCisJVihBOCxGQyw4QyxDNCksCVYoQTAsRjAsM0YsMUEpLAlWKDU2LDdELDJDLEQ4KSwJVigyMiwzMyw5MCxFRiksCVwKKwlWKDg3LDQ5LDRFLEM3KSwJVihEOSwzOCxEMSxDMSksCVYoOEMsQ0EsQTIsRkUpLAlWKDk4LEQ0LDBCLDM2KSwJXAorCVYoQTYsRjUsODEsQ0YpLAlWKEE1LDdBLERFLDI4KSwJVihEQSxCNyw4RSwyNiksCVYoM0YsQUQsQkYsQTQpLAlcCisJVigyQywzQSw5RCxFNCksCVYoNTAsNzgsOTIsMEQpLAlWKDZBLDVGLENDLDlCKSwJVig1NCw3RSw0Niw2MiksCVwKKwlWKEY2LDhELDEzLEMyKSwJVig5MCxEOCxCOCxFOCksCVYoMkUsMzksRjcsNUUpLAlWKDgyLEMzLEFGLEY1KSwJXAorCVYoOUYsNUQsODAsQkUpLAlWKDY5LEQwLDkzLDdDKSwJVig2RixENSwyRCxBOSksCVYoQ0YsMjUsMTIsQjMpLAlcCisJVihDOCxBQyw5OSwzQiksCVYoMTAsMTgsN0QsQTcpLAlWKEU4LDlDLDYzLDZFKSwJVihEQiwzQixCQiw3QiksCVwKKwlWKENELDI2LDc4LDA5KSwJVig2RSw1OSwxOCxGNCksCVYoRUMsOUEsQjcsMDEpLAlWKDgzLDRGLDlBLEE4KSwJXAorCVYoRTYsOTUsNkUsNjUpLAlWKEFBLEZGLEU2LDdFKSwJVigyMSxCQyxDRiwwOCksCVYoRUYsMTUsRTgsRTYpLAlcCisJVihCQSxFNyw5QixEOSksCVYoNEEsNkYsMzYsQ0UpLAlWKEVBLDlGLDA5LEQ0KSwJVigyOSxCMCw3QyxENiksCVwKKwlWKDMxLEE0LEIyLEFGKSwJVigyQSwzRiwyMywzMSksCVYoQzYsQTUsOTQsMzApLAlWKDM1LEEyLDY2LEMwKSwJXAorCVYoNzQsNEUsQkMsMzcpLAlWKEZDLDgyLENBLEE2KSwJVihFMCw5MCxEMCxCMCksCVYoMzMsQTcsRDgsMTUpLAlcCisJVihGMSwwNCw5OCw0QSksCVYoNDEsRUMsREEsRjcpLAlWKDdGLENELDUwLDBFKSwJVigxNyw5MSxGNiwyRiksCVwKKwlWKDc2LDRELEQ2LDhEKSwJVig0MyxFRixCMCw0RCksCVYoQ0MsQUEsNEQsNTQpLAlWKEU0LDk2LDA0LERGKSwJXAorCVYoOUUsRDEsQjUsRTMpLAlWKDRDLDZBLDg4LDFCKSwJVihDMSwyQywxRixCOCksCVYoNDYsNjUsNTEsN0YpLAlcCisJVig5RCw1RSxFQSwwNCksCVYoMDEsOEMsMzUsNUQpLAlWKEZBLDg3LDc0LDczKSwJVihGQiwwQiw0MSwyRSksCVwKKwlWKEIzLDY3LDFELDVBKSwJVig5MixEQixEMiw1MiksCVYoRTksMTAsNTYsMzMpLAlWKDZELEQ2LDQ3LDEzKSwJXAorCVYoOUEsRDcsNjEsOEMpLAlWKDM3LEExLDBDLDdBKSwJVig1OSxGOCwxNCw4RSksCVYoRUIsMTMsM0MsODkpLAlcCisJVihDRSxBOSwyNyxFRSksCVYoQjcsNjEsQzksMzUpLAlWKEUxLDFDLEU1LEVEKSwJVig3QSw0NyxCMSwzQyksCVwKKwlWKDlDLEQyLERGLDU5KSwJVig1NSxGMiw3MywzRiksCVYoMTgsMTQsQ0UsNzkpLAlWKDczLEM3LDM3LEJGKSwJXAorCVYoNTMsRjcsQ0QsRUEpLAlWKDVGLEZELEFBLDVCKSwJVihERiwzRCw2RiwxNCksCVYoNzgsNDQsREIsODYpLAlcCisJVihDQSxBRixGMyw4MSksCVYoQjksNjgsQzQsM0UpLAlWKDM4LDI0LDM0LDJDKSwJVihDMixBMyw0MCw1RiksCVwKKwlWKDE2LDFELEMzLDcyKSwJVihCQyxFMiwyNSwwQyksCVYoMjgsM0MsNDksOEIpLAlWKEZGLDBELDk1LDQxKSwJXAorCVYoMzksQTgsMDEsNzEpLAlWKDA4LDBDLEIzLERFKSwJVihEOCxCNCxFNCw5QyksCVYoNjQsNTYsQzEsOTApLAlcCisJVig3QixDQiw4NCw2MSksCVYoRDUsMzIsQjYsNzApLAlWKDQ4LDZDLDVDLDc0KSwJVihEMCxCOCw1Nyw0MikKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNhIyNiIyNjIyNkCitzdGF0aWMgdWludDMyIFJUMFsyNTZdID0geyBSVCB9OworCisjdW5kZWYgVgorCisjZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2QjI2EjI2IjI2MKK3N0YXRpYyB1aW50MzIgUlQxWzI1Nl0gPSB7IFJUIH07CisKKyN1bmRlZiBWCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYyMjZCMjYSMjYgorc3RhdGljIHVpbnQzMiBSVDJbMjU2XSA9IHsgUlQgfTsKKworI3VuZGVmIFYKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNiIyNjIyNkIyNhCitzdGF0aWMgdWludDMyIFJUM1syNTZdID0geyBSVCB9OworCisjdW5kZWYgVgorCisjdW5kZWYgUlQKKworLyogcm91bmQgY29uc3RhbnRzICovCisKK3N0YXRpYyB1aW50MzIgUkNPTlsxMF0gPSB7CisJMHgwMTAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwNDAwMDAwMCwgMHgwODAwMDAwMCwKKwkweDEwMDAwMDAwLCAweDIwMDAwMDAwLCAweDQwMDAwMDAwLCAweDgwMDAwMDAwLAorCTB4MUIwMDAwMDAsIDB4MzYwMDAwMDAKK307CisKKy8qIGtleSBzY2hlZHVsZQl0YWJsZXMgKi8KKworc3RhdGljIGludCBLVF9pbml0ID0gMTsKKworc3RhdGljIHVpbnQzMiBLVDBbMjU2XTsKK3N0YXRpYyB1aW50MzIgS1QxWzI1Nl07CitzdGF0aWMgdWludDMyIEtUMlsyNTZdOworc3RhdGljIHVpbnQzMiBLVDNbMjU2XTsKKworLyogcGxhdGZvcm0taW5kZXBlbmRhbnQJMzItYml0IGludGVnZXIgbWFuaXB1bGF0aW9uCW1hY3JvcyAqLworCisjZGVmaW5lCUdFVF9VSU5UMzIobixiLGkpCQkJCQkJXAorewkJCQkJCQkJCQkJCVwKKwkobikJPSAoCSh1aW50MzIpIChiKVsoaSkJXSA8PCAyNAkpCQlcCisJCXwgKAkodWludDMyKSAoYilbKGkpICsgMV0gPDwgMTYJKQkJXAorCQl8ICgJKHVpbnQzMikgKGIpWyhpKSArIDJdIDw8ICA4CSkJCVwKKwkJfCAoCSh1aW50MzIpIChiKVsoaSkgKyAzXQkJKTsJCVwKK30KKworI2RlZmluZQlQVVRfVUlOVDMyKG4sYixpKQkJCQkJCVwKK3sJCQkJCQkJCQkJCQlcCisJKGIpWyhpKQkgICBdID0gKHVpbnQ4KSAoIChuKSA+PgkyNCApOwkJXAorCShiKVsoaSkJKyAxXSA9ICh1aW50OCkgKCAobikgPj4JMTYgKTsJCVwKKwkoYilbKGkpCSsgMl0gPSAodWludDgpICggKG4pID4+CSA4ICk7CQlcCisJKGIpWyhpKQkrIDNdID0gKHVpbnQ4KSAoIChuKQkgICApOwkJXAorfQorCitpbnQgcnRfYWVzX3NldF9rZXkoc3RydWN0IGFlc19jb250ZXh0ICogY3R4LCB1aW50OCAqIGtleSwgaW50IG5iaXRzKQoreworCWludCBpOworCXVpbnQzMiAqUkssICpTSzsKKworCXN3aXRjaCAobmJpdHMpIHsKKwljYXNlIDEyODoKKwkJY3R4LT5uciA9IDEwOworCQlicmVhazsKKwljYXNlIDE5MjoKKwkJY3R4LT5uciA9IDEyOworCQlicmVhazsKKwljYXNlIDI1NjoKKwkJY3R4LT5uciA9IDE0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKDEpOworCX0KKworCVJLID0gKHVpbnQzMiAqKSBjdHgtPmVyazsKKworCWZvciAoaSA9IDA7IGkgPCAobmJpdHMgPj4gNSk7IGkrKykgeworCQlHRVRfVUlOVDMyKFJLW2ldLCBrZXksIGkgKiA0KTsKKwl9CisKKwkvKiBzZXR1cCBlbmNyeXB0aW9uICAgICByb3VuZCBrZXlzICovCisKKwlzd2l0Y2ggKG5iaXRzKSB7CisJY2FzZSAxMjg6CisKKwkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyssIFJLICs9IDQpIHsKKwkJCVJLWzRdID0gUktbMF0gXiBSQ09OW2ldIF4KKwkJCSAgICAoRlNiWyh1aW50OCkgKFJLWzNdID4+IDE2KV0gPDwgMjQpIF4KKwkJCSAgICAoRlNiWyh1aW50OCkgKFJLWzNdID4+IDgpXSA8PCAxNikgXgorCQkJICAgIChGU2JbKHVpbnQ4KSAoUktbM10pXSA8PCA4KSBeCisJCQkgICAgKEZTYlsodWludDgpIChSS1szXSA+PiAyNCldKTsKKworCQkJUktbNV0gPSBSS1sxXSBeIFJLWzRdOworCQkJUktbNl0gPSBSS1syXSBeIFJLWzVdOworCQkJUktbN10gPSBSS1szXSBeIFJLWzZdOworCQl9CisJCWJyZWFrOworCisJY2FzZSAxOTI6CisKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKywgUksgKz0gNikgeworCQkJUktbNl0gPSBSS1swXSBeIFJDT05baV0gXgorCQkJICAgIChGU2JbKHVpbnQ4KSAoUktbNV0gPj4gMTYpXSA8PCAyNCkgXgorCQkJICAgIChGU2JbKHVpbnQ4KSAoUktbNV0gPj4gOCldIDw8IDE2KSBeCisJCQkgICAgKEZTYlsodWludDgpIChSS1s1XSldIDw8IDgpIF4KKwkJCSAgICAoRlNiWyh1aW50OCkgKFJLWzVdID4+IDI0KV0pOworCisJCQlSS1s3XSA9IFJLWzFdIF4gUktbNl07CisJCQlSS1s4XSA9IFJLWzJdIF4gUktbN107CisJCQlSS1s5XSA9IFJLWzNdIF4gUktbOF07CisJCQlSS1sxMF0gPSBSS1s0XSBeIFJLWzldOworCQkJUktbMTFdID0gUktbNV0gXiBSS1sxMF07CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDI1NjoKKworCQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrLCBSSyArPSA4KSB7CisJCQlSS1s4XSA9IFJLWzBdIF4gUkNPTltpXSBeCisJCQkgICAgKEZTYlsodWludDgpIChSS1s3XSA+PiAxNildIDw8IDI0KSBeCisJCQkgICAgKEZTYlsodWludDgpIChSS1s3XSA+PiA4KV0gPDwgMTYpIF4KKwkJCSAgICAoRlNiWyh1aW50OCkgKFJLWzddKV0gPDwgOCkgXgorCQkJICAgIChGU2JbKHVpbnQ4KSAoUktbN10gPj4gMjQpXSk7CisKKwkJCVJLWzldID0gUktbMV0gXiBSS1s4XTsKKwkJCVJLWzEwXSA9IFJLWzJdIF4gUktbOV07CisJCQlSS1sxMV0gPSBSS1szXSBeIFJLWzEwXTsKKworCQkJUktbMTJdID0gUktbNF0gXgorCQkJICAgIChGU2JbKHVpbnQ4KSAoUktbMTFdID4+IDI0KV0gPDwgMjQpIF4KKwkJCSAgICAoRlNiWyh1aW50OCkgKFJLWzExXSA+PiAxNildIDw8IDE2KSBeCisJCQkgICAgKEZTYlsodWludDgpIChSS1sxMV0gPj4gOCldIDw8IDgpIF4KKwkJCSAgICAoRlNiWyh1aW50OCkgKFJLWzExXSldKTsKKworCQkJUktbMTNdID0gUktbNV0gXiBSS1sxMl07CisJCQlSS1sxNF0gPSBSS1s2XSBeIFJLWzEzXTsKKwkJCVJLWzE1XSA9IFJLWzddIF4gUktbMTRdOworCQl9CisJCWJyZWFrOworCX0KKworCS8qIHNldHVwIGRlY3J5cHRpb24gICAgIHJvdW5kIGtleXMgKi8KKworCWlmIChLVF9pbml0KSB7CisJCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQkJS1QwW2ldID0gUlQwW0ZTYltpXV07CisJCQlLVDFbaV0gPSBSVDFbRlNiW2ldXTsKKwkJCUtUMltpXSA9IFJUMltGU2JbaV1dOworCQkJS1QzW2ldID0gUlQzW0ZTYltpXV07CisJCX0KKworCQlLVF9pbml0ID0gMDsKKwl9CisKKwlTSyA9ICh1aW50MzIgKikgY3R4LT5kcms7CisKKwkqU0srKyA9ICpSSysrOworCSpTSysrID0gKlJLKys7CisJKlNLKysgPSAqUksrKzsKKwkqU0srKyA9ICpSSysrOworCisJZm9yIChpID0gMTsgaSA8IGN0eC0+bnI7IGkrKykgeworCQlSSyAtPSA4OworCisJCSpTSysrID0gS1QwWyh1aW50OCkgKCpSSyA+PiAyNCldIF4KKwkJICAgIEtUMVsodWludDgpICgqUksgPj4gMTYpXSBeCisJCSAgICBLVDJbKHVpbnQ4KSAoKlJLID4+IDgpXSBeIEtUM1sodWludDgpICgqUkspXTsKKwkJUksrKzsKKworCQkqU0srKyA9IEtUMFsodWludDgpICgqUksgPj4gMjQpXSBeCisJCSAgICBLVDFbKHVpbnQ4KSAoKlJLID4+IDE2KV0gXgorCQkgICAgS1QyWyh1aW50OCkgKCpSSyA+PiA4KV0gXiBLVDNbKHVpbnQ4KSAoKlJLKV07CisJCVJLKys7CisKKwkJKlNLKysgPSBLVDBbKHVpbnQ4KSAoKlJLID4+IDI0KV0gXgorCQkgICAgS1QxWyh1aW50OCkgKCpSSyA+PiAxNildIF4KKwkJICAgIEtUMlsodWludDgpICgqUksgPj4gOCldIF4gS1QzWyh1aW50OCkgKCpSSyldOworCQlSSysrOworCisJCSpTSysrID0gS1QwWyh1aW50OCkgKCpSSyA+PiAyNCldIF4KKwkJICAgIEtUMVsodWludDgpICgqUksgPj4gMTYpXSBeCisJCSAgICBLVDJbKHVpbnQ4KSAoKlJLID4+IDgpXSBeIEtUM1sodWludDgpICgqUkspXTsKKwkJUksrKzsKKwl9CisKKwlSSyAtPSA4OworCisJKlNLKysgPSAqUksrKzsKKwkqU0srKyA9ICpSSysrOworCSpTSysrID0gKlJLKys7CisJKlNLKysgPSAqUksrKzsKKworCXJldHVybiAoMCk7Cit9CisKKy8qIEFFUyAxMjgtYml0IGJsb2NrIGVuY3J5cHRpb24Jcm91dGluZQkqLworCit2b2lkIHJ0X2Flc19lbmNyeXB0KHN0cnVjdCBhZXNfY29udGV4dCAqIGN0eCwgdWludDggaW5wdXRbMTZdLCB1aW50OCBvdXRwdXRbMTZdKQoreworCXVpbnQzMiAqUkssIFgwLCBYMSwgWDIsIFgzLCBZMCwgWTEsIFkyLCBZMzsKKworCVJLID0gKHVpbnQzMiAqKSBjdHgtPmVyazsKKwlHRVRfVUlOVDMyKFgwLCBpbnB1dCwgMCk7CisJWDAgXj0gUktbMF07CisJR0VUX1VJTlQzMihYMSwgaW5wdXQsIDQpOworCVgxIF49IFJLWzFdOworCUdFVF9VSU5UMzIoWDIsIGlucHV0LCA4KTsKKwlYMiBePSBSS1syXTsKKwlHRVRfVUlOVDMyKFgzLCBpbnB1dCwgMTIpOworCVgzIF49IFJLWzNdOworCisjZGVmaW5lCUFFU19GUk9VTkQoWDAsWDEsWDIsWDMsWTAsWTEsWTIsWTMpCQlcCit7CQkJCQkJCQkJCQkJXAorCVJLICs9IDQ7CQkJCQkJCQkJXAorCQkJCQkJCQkJCQkJXAorCVgwID0gUktbMF0gXiBGVDBbICh1aW50OCkgKAlZMCA+PiAyNCApIF0gXglcCisJCQkJIEZUMVsgKHVpbnQ4KSAoCVkxID4+IDE2ICkgXSBeCVwKKwkJCQkgRlQyWyAodWludDgpICgJWTIgPj4gIDggKSBdIF4JXAorCQkJCSBGVDNbICh1aW50OCkgKAlZMwkJICkgXTsJXAorCQkJCQkJCQkJCQkJXAorCVgxID0gUktbMV0gXiBGVDBbICh1aW50OCkgKAlZMSA+PiAyNCApIF0gXglcCisJCQkJIEZUMVsgKHVpbnQ4KSAoCVkyID4+IDE2ICkgXSBeCVwKKwkJCQkgRlQyWyAodWludDgpICgJWTMgPj4gIDggKSBdIF4JXAorCQkJCSBGVDNbICh1aW50OCkgKAlZMAkJICkgXTsJXAorCQkJCQkJCQkJCQkJXAorCVgyID0gUktbMl0gXiBGVDBbICh1aW50OCkgKAlZMiA+PiAyNCApIF0gXglcCisJCQkJIEZUMVsgKHVpbnQ4KSAoCVkzID4+IDE2ICkgXSBeCVwKKwkJCQkgRlQyWyAodWludDgpICgJWTAgPj4gIDggKSBdIF4JXAorCQkJCSBGVDNbICh1aW50OCkgKAlZMQkJICkgXTsJXAorCQkJCQkJCQkJCQkJXAorCVgzID0gUktbM10gXiBGVDBbICh1aW50OCkgKAlZMyA+PiAyNCApIF0gXglcCisJCQkJIEZUMVsgKHVpbnQ4KSAoCVkwID4+IDE2ICkgXSBeCVwKKwkJCQkgRlQyWyAodWludDgpICgJWTEgPj4gIDggKSBdIF4JXAorCQkJCSBGVDNbICh1aW50OCkgKAlZMgkJICkgXTsJXAorfQorCisJQUVTX0ZST1VORChZMCwgWTEsIFkyLCBZMywgWDAsIFgxLCBYMiwgWDMpOwkvKiByb3VuZCAxICovCisJQUVTX0ZST1VORChYMCwgWDEsIFgyLCBYMywgWTAsIFkxLCBZMiwgWTMpOwkvKiByb3VuZCAyICovCisJQUVTX0ZST1VORChZMCwgWTEsIFkyLCBZMywgWDAsIFgxLCBYMiwgWDMpOwkvKiByb3VuZCAzICovCisJQUVTX0ZST1VORChYMCwgWDEsIFgyLCBYMywgWTAsIFkxLCBZMiwgWTMpOwkvKiByb3VuZCA0ICovCisJQUVTX0ZST1VORChZMCwgWTEsIFkyLCBZMywgWDAsIFgxLCBYMiwgWDMpOwkvKiByb3VuZCA1ICovCisJQUVTX0ZST1VORChYMCwgWDEsIFgyLCBYMywgWTAsIFkxLCBZMiwgWTMpOwkvKiByb3VuZCA2ICovCisJQUVTX0ZST1VORChZMCwgWTEsIFkyLCBZMywgWDAsIFgxLCBYMiwgWDMpOwkvKiByb3VuZCA3ICovCisJQUVTX0ZST1VORChYMCwgWDEsIFgyLCBYMywgWTAsIFkxLCBZMiwgWTMpOwkvKiByb3VuZCA4ICovCisJQUVTX0ZST1VORChZMCwgWTEsIFkyLCBZMywgWDAsIFgxLCBYMiwgWDMpOwkvKiByb3VuZCA5ICovCisKKwlpZiAoY3R4LT5uciA+IDEwKSB7CisJCUFFU19GUk9VTkQoWDAsIFgxLCBYMiwgWDMsIFkwLCBZMSwgWTIsIFkzKTsJLyogcm91bmQgMTAgICAgICovCisJCUFFU19GUk9VTkQoWTAsIFkxLCBZMiwgWTMsIFgwLCBYMSwgWDIsIFgzKTsJLyogcm91bmQgMTEgICAgICovCisJfQorCisJaWYgKGN0eC0+bnIgPiAxMikgeworCQlBRVNfRlJPVU5EKFgwLCBYMSwgWDIsIFgzLCBZMCwgWTEsIFkyLCBZMyk7CS8qIHJvdW5kIDEyICAgICAqLworCQlBRVNfRlJPVU5EKFkwLCBZMSwgWTIsIFkzLCBYMCwgWDEsIFgyLCBYMyk7CS8qIHJvdW5kIDEzICAgICAqLworCX0KKworCS8qIGxhc3Qgcm91bmQgKi8KKworCVJLICs9IDQ7CisKKwlYMCA9IFJLWzBdIF4gKEZTYlsodWludDgpIChZMCA+PiAyNCldIDw8IDI0KSBeCisJICAgIChGU2JbKHVpbnQ4KSAoWTEgPj4gMTYpXSA8PCAxNikgXgorCSAgICAoRlNiWyh1aW50OCkgKFkyID4+IDgpXSA8PCA4KSBeIChGU2JbKHVpbnQ4KSAoWTMpXSk7CisKKwlYMSA9IFJLWzFdIF4gKEZTYlsodWludDgpIChZMSA+PiAyNCldIDw8IDI0KSBeCisJICAgIChGU2JbKHVpbnQ4KSAoWTIgPj4gMTYpXSA8PCAxNikgXgorCSAgICAoRlNiWyh1aW50OCkgKFkzID4+IDgpXSA8PCA4KSBeIChGU2JbKHVpbnQ4KSAoWTApXSk7CisKKwlYMiA9IFJLWzJdIF4gKEZTYlsodWludDgpIChZMiA+PiAyNCldIDw8IDI0KSBeCisJICAgIChGU2JbKHVpbnQ4KSAoWTMgPj4gMTYpXSA8PCAxNikgXgorCSAgICAoRlNiWyh1aW50OCkgKFkwID4+IDgpXSA8PCA4KSBeIChGU2JbKHVpbnQ4KSAoWTEpXSk7CisKKwlYMyA9IFJLWzNdIF4gKEZTYlsodWludDgpIChZMyA+PiAyNCldIDw8IDI0KSBeCisJICAgIChGU2JbKHVpbnQ4KSAoWTAgPj4gMTYpXSA8PCAxNikgXgorCSAgICAoRlNiWyh1aW50OCkgKFkxID4+IDgpXSA8PCA4KSBeIChGU2JbKHVpbnQ4KSAoWTIpXSk7CisKKwlQVVRfVUlOVDMyKFgwLCBvdXRwdXQsIDApOworCVBVVF9VSU5UMzIoWDEsIG91dHB1dCwgNCk7CisJUFVUX1VJTlQzMihYMiwgb3V0cHV0LCA4KTsKKwlQVVRfVUlOVDMyKFgzLCBvdXRwdXQsIDEyKTsKK30KKworLyogQUVTIDEyOC1iaXQgYmxvY2sgZGVjcnlwdGlvbglyb3V0aW5lCSovCisKK3ZvaWQgcnRfYWVzX2RlY3J5cHQoc3RydWN0IGFlc19jb250ZXh0ICogY3R4LCB1aW50OCBpbnB1dFsxNl0sIHVpbnQ4IG91dHB1dFsxNl0pCit7CisJdWludDMyICpSSywgWDAsIFgxLCBYMiwgWDMsIFkwLCBZMSwgWTIsIFkzOworCisJUksgPSAodWludDMyICopIGN0eC0+ZHJrOworCisJR0VUX1VJTlQzMihYMCwgaW5wdXQsIDApOworCVgwIF49IFJLWzBdOworCUdFVF9VSU5UMzIoWDEsIGlucHV0LCA0KTsKKwlYMSBePSBSS1sxXTsKKwlHRVRfVUlOVDMyKFgyLCBpbnB1dCwgOCk7CisJWDIgXj0gUktbMl07CisJR0VUX1VJTlQzMihYMywgaW5wdXQsIDEyKTsKKwlYMyBePSBSS1szXTsKKworI2RlZmluZQlBRVNfUlJPVU5EKFgwLFgxLFgyLFgzLFkwLFkxLFkyLFkzKQkJXAorewkJCQkJCQkJCQkJCVwKKwlSSyArPSA0OwkJCQkJCQkJCVwKKwkJCQkJCQkJCQkJCVwKKwlYMCA9IFJLWzBdIF4gUlQwWyAodWludDgpICgJWTAgPj4gMjQgKSBdIF4JXAorCQkJCSBSVDFbICh1aW50OCkgKAlZMyA+PiAxNiApIF0gXglcCisJCQkJIFJUMlsgKHVpbnQ4KSAoCVkyID4+ICA4ICkgXSBeCVwKKwkJCQkgUlQzWyAodWludDgpICgJWTEJCSApIF07CVwKKwkJCQkJCQkJCQkJCVwKKwlYMSA9IFJLWzFdIF4gUlQwWyAodWludDgpICgJWTEgPj4gMjQgKSBdIF4JXAorCQkJCSBSVDFbICh1aW50OCkgKAlZMCA+PiAxNiApIF0gXglcCisJCQkJIFJUMlsgKHVpbnQ4KSAoCVkzID4+ICA4ICkgXSBeCVwKKwkJCQkgUlQzWyAodWludDgpICgJWTIJCSApIF07CVwKKwkJCQkJCQkJCQkJCVwKKwlYMiA9IFJLWzJdIF4gUlQwWyAodWludDgpICgJWTIgPj4gMjQgKSBdIF4JXAorCQkJCSBSVDFbICh1aW50OCkgKAlZMSA+PiAxNiApIF0gXglcCisJCQkJIFJUMlsgKHVpbnQ4KSAoCVkwID4+ICA4ICkgXSBeCVwKKwkJCQkgUlQzWyAodWludDgpICgJWTMJCSApIF07CVwKKwkJCQkJCQkJCQkJCVwKKwlYMyA9IFJLWzNdIF4gUlQwWyAodWludDgpICgJWTMgPj4gMjQgKSBdIF4JXAorCQkJCSBSVDFbICh1aW50OCkgKAlZMiA+PiAxNiApIF0gXglcCisJCQkJIFJUMlsgKHVpbnQ4KSAoCVkxID4+ICA4ICkgXSBeCVwKKwkJCQkgUlQzWyAodWludDgpICgJWTAJCSApIF07CVwKK30KKworCUFFU19SUk9VTkQoWTAsIFkxLCBZMiwgWTMsIFgwLCBYMSwgWDIsIFgzKTsJLyogcm91bmQgMSAqLworCUFFU19SUk9VTkQoWDAsIFgxLCBYMiwgWDMsIFkwLCBZMSwgWTIsIFkzKTsJLyogcm91bmQgMiAqLworCUFFU19SUk9VTkQoWTAsIFkxLCBZMiwgWTMsIFgwLCBYMSwgWDIsIFgzKTsJLyogcm91bmQgMyAqLworCUFFU19SUk9VTkQoWDAsIFgxLCBYMiwgWDMsIFkwLCBZMSwgWTIsIFkzKTsJLyogcm91bmQgNCAqLworCUFFU19SUk9VTkQoWTAsIFkxLCBZMiwgWTMsIFgwLCBYMSwgWDIsIFgzKTsJLyogcm91bmQgNSAqLworCUFFU19SUk9VTkQoWDAsIFgxLCBYMiwgWDMsIFkwLCBZMSwgWTIsIFkzKTsJLyogcm91bmQgNiAqLworCUFFU19SUk9VTkQoWTAsIFkxLCBZMiwgWTMsIFgwLCBYMSwgWDIsIFgzKTsJLyogcm91bmQgNyAqLworCUFFU19SUk9VTkQoWDAsIFgxLCBYMiwgWDMsIFkwLCBZMSwgWTIsIFkzKTsJLyogcm91bmQgOCAqLworCUFFU19SUk9VTkQoWTAsIFkxLCBZMiwgWTMsIFgwLCBYMSwgWDIsIFgzKTsJLyogcm91bmQgOSAqLworCisJaWYgKGN0eC0+bnIgPiAxMCkgeworCQlBRVNfUlJPVU5EKFgwLCBYMSwgWDIsIFgzLCBZMCwgWTEsIFkyLCBZMyk7CS8qIHJvdW5kIDEwICAgICAqLworCQlBRVNfUlJPVU5EKFkwLCBZMSwgWTIsIFkzLCBYMCwgWDEsIFgyLCBYMyk7CS8qIHJvdW5kIDExICAgICAqLworCX0KKworCWlmIChjdHgtPm5yID4gMTIpIHsKKwkJQUVTX1JST1VORChYMCwgWDEsIFgyLCBYMywgWTAsIFkxLCBZMiwgWTMpOwkvKiByb3VuZCAxMiAgICAgKi8KKwkJQUVTX1JST1VORChZMCwgWTEsIFkyLCBZMywgWDAsIFgxLCBYMiwgWDMpOwkvKiByb3VuZCAxMyAgICAgKi8KKwl9CisKKwkvKiBsYXN0IHJvdW5kICovCisKKwlSSyArPSA0OworCisJWDAgPSBSS1swXSBeIChSU2JbKHVpbnQ4KSAoWTAgPj4gMjQpXSA8PCAyNCkgXgorCSAgICAoUlNiWyh1aW50OCkgKFkzID4+IDE2KV0gPDwgMTYpIF4KKwkgICAgKFJTYlsodWludDgpIChZMiA+PiA4KV0gPDwgOCkgXiAoUlNiWyh1aW50OCkgKFkxKV0pOworCisJWDEgPSBSS1sxXSBeIChSU2JbKHVpbnQ4KSAoWTEgPj4gMjQpXSA8PCAyNCkgXgorCSAgICAoUlNiWyh1aW50OCkgKFkwID4+IDE2KV0gPDwgMTYpIF4KKwkgICAgKFJTYlsodWludDgpIChZMyA+PiA4KV0gPDwgOCkgXiAoUlNiWyh1aW50OCkgKFkyKV0pOworCisJWDIgPSBSS1syXSBeIChSU2JbKHVpbnQ4KSAoWTIgPj4gMjQpXSA8PCAyNCkgXgorCSAgICAoUlNiWyh1aW50OCkgKFkxID4+IDE2KV0gPDwgMTYpIF4KKwkgICAgKFJTYlsodWludDgpIChZMCA+PiA4KV0gPDwgOCkgXiAoUlNiWyh1aW50OCkgKFkzKV0pOworCisJWDMgPSBSS1szXSBeIChSU2JbKHVpbnQ4KSAoWTMgPj4gMjQpXSA8PCAyNCkgXgorCSAgICAoUlNiWyh1aW50OCkgKFkyID4+IDE2KV0gPDwgMTYpIF4KKwkgICAgKFJTYlsodWludDgpIChZMSA+PiA4KV0gPDwgOCkgXiAoUlNiWyh1aW50OCkgKFkwKV0pOworCisJUFVUX1VJTlQzMihYMCwgb3V0cHV0LCAwKTsKKwlQVVRfVUlOVDMyKFgxLCBvdXRwdXQsIDQpOworCVBVVF9VSU5UMzIoWDIsIG91dHB1dCwgOCk7CisJUFVUX1VJTlQzMihYMywgb3V0cHV0LCAxMik7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgRU5DUllQVCBBRVMgR1RLIGJlZm9yZSBzZW5kaW5nIGluIEVBUE9MIGZyYW1lLgorICAgICAgICBBRVMgR1RLIGxlbmd0aCA9IDEyOCBiaXQsICBzbyBmaXggYmxvY2tzIGZvciBhZXMta2V5LXdyYXAgYXMgMiBpbiB0aGlzIGZ1bmN0aW9uLgorICAgICAgICBUaGlzIGZ1bmN0aW9uIHJlZmVyZW5jZXMgdG8gUkZDIDMzOTQgZm9yIGFlcyBrZXkgd3JhcCBhbGdvcml0aG0uCisgICAgUmV0dXJuOgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBBRVNfR1RLX0tFWV9XUkFQKHU4ICoga2V5LAorCQkgICAgICB1OCAqIHBsYWludGV4dCwKKwkJICAgICAgdTMyIHBfbGVuLCB1OCAqIGNpcGhlcnRleHQpCit7CisJdTggQVs4XSwgQklOWzE2XSwgQk9VVFsxNl07CisJdTggUls1MTJdOworCWludCBudW1fYmxvY2tzID0gcF9sZW4gLyA4OwkvKiB1bml0OjY0Yml0cyAqLworCWludCBpLCBqOworCXN0cnVjdCBhZXNfY29udGV4dCBhZXNjdHg7CisJdTggeG9yOworCisJcnRfYWVzX3NldF9rZXkoJmFlc2N0eCwga2V5LCAxMjgpOworCisJLyogSW5pdCBJQSAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCUFbaV0gPSAweGE2OworCisJLypJbnB1dCBwbGFpbnRleHQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspCisJCQlSWzggKiAoaSArIDEpICsgal0gPSBwbGFpbnRleHRbOCAqIGkgKyBqXTsKKwl9CisKKwkvKiBLZXkgTWl4ICovCisJZm9yIChqID0gMDsgaiA8IDY7IGorKykgeworCQlmb3IgKGkgPSAxOyBpIDw9IG51bV9ibG9ja3M7IGkrKykgeworCQkJLypwaGFzZSAxICovCisJCQlOZGlzTW92ZU1lbW9yeShCSU4sIEEsIDgpOworCQkJTmRpc01vdmVNZW1vcnkoJkJJTls4XSwgJlJbOCAqIGldLCA4KTsKKwkJCXJ0X2Flc19lbmNyeXB0KCZhZXNjdHgsIEJJTiwgQk9VVCk7CisKKwkJCU5kaXNNb3ZlTWVtb3J5KEEsICZCT1VUWzBdLCA4KTsKKwkJCXhvciA9IG51bV9ibG9ja3MgKiBqICsgaTsKKwkJCUFbN10gPSBCT1VUWzddIF4geG9yOworCQkJTmRpc01vdmVNZW1vcnkoJlJbOCAqIGldLCAmQk9VVFs4XSwgOCk7CisJCX0KKwl9CisKKwkvKiBPdXRwdXQgY2lwaGVydGV4dCAqLworCU5kaXNNb3ZlTWVtb3J5KGNpcGhlcnRleHQsIEEsIDgpOworCisJZm9yIChpID0gMTsgaSA8PSBudW1fYmxvY2tzOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCWNpcGhlcnRleHRbOCAqIGkgKyBqXSA9IFJbOCAqIGkgKyBqXTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlNaXNjIGZ1bmN0aW9uIHRvIGRlY3J5cHQgQUVTIGJvZHkKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisJCVRoaXMgZnVuY3Rpb24gcmVmZXJlbmNlcyB0bwlSRkMJMzM5NCBmb3IgYWVzIGtleSB1bndyYXAgYWxnb3JpdGhtLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBBRVNfR1RLX0tFWV9VTldSQVAodTggKiBrZXksCisJCQl1OCAqIHBsYWludGV4dCwKKwkJCXUzMiBjX2xlbiwgdTggKiBjaXBoZXJ0ZXh0KQoreworCXU4IEFbOF0sIEJJTlsxNl0sIEJPVVRbMTZdOworCXU4IHhvcjsKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgYWVzX2NvbnRleHQgYWVzY3R4OworCXU4ICpSOworCWludCBudW1fYmxvY2tzID0gY19sZW4gLyA4OwkvKiB1bml0OjY0Yml0cyAqLworCisJb3NfYWxsb2NfbWVtKE5VTEwsICh1OCAqKikgJiBSLCA1MTIpOworCisJaWYgKFIgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIkFFU19HVEtfS0VZX1VOV1JBUDogbm8gbWVtb3J5IVxuIikpOworCQlyZXR1cm47CisJfQorCS8qIEVuZCBvZiBpZiAqLworCS8qIEluaXRpYWxpemUgKi8KKwlOZGlzTW92ZU1lbW9yeShBLCBjaXBoZXJ0ZXh0LCA4KTsKKwkvKklucHV0IHBsYWludGV4dCAqLworCWZvciAoaSA9IDA7IGkgPCAoY19sZW4gLSA4KTsgaSsrKSB7CisJCVJbaV0gPSBjaXBoZXJ0ZXh0W2kgKyA4XTsKKwl9CisKKwlydF9hZXNfc2V0X2tleSgmYWVzY3R4LCBrZXksIDEyOCk7CisKKwlmb3IgKGogPSA1OyBqID49IDA7IGotLSkgeworCQlmb3IgKGkgPSAobnVtX2Jsb2NrcyAtIDEpOyBpID4gMDsgaS0tKSB7CisJCQl4b3IgPSAobnVtX2Jsb2NrcyAtIDEpICogaiArIGk7CisJCQlOZGlzTW92ZU1lbW9yeShCSU4sIEEsIDgpOworCQkJQklOWzddID0gQVs3XSBeIHhvcjsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZCSU5bOF0sICZSWyhpIC0gMSkgKiA4XSwgOCk7CisJCQlydF9hZXNfZGVjcnlwdCgmYWVzY3R4LCBCSU4sIEJPVVQpOworCQkJTmRpc01vdmVNZW1vcnkoQSwgJkJPVVRbMF0sIDgpOworCQkJTmRpc01vdmVNZW1vcnkoJlJbKGkgLSAxKSAqIDhdLCAmQk9VVFs4XSwgOCk7CisJCX0KKwl9CisKKwkvKiBPVVRQVVQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY19sZW47IGkrKykgeworCQlwbGFpbnRleHRbaV0gPSBSW2ldOworCX0KKworCW9zX2ZyZWVfbWVtKE5VTEwsIFIpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2FzaWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9hc2ljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3N2U4MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9hc2ljLmMKQEAgLTAsMCArMSwyNTY1IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWNtbV9hc2ljLmMKKworCUFic3RyYWN0OgorCUZ1bmN0aW9ucyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggQVNJQworCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworLyogUmVzZXQgdGhlIFJGSUMgc2V0dGluZyB0byBuZXcgc2VyaWVzICovCitzdHJ1Y3QgcnRfcnRtcF9yZl9yZWdzIFJGMjg1MFJlZ1RhYmxlW10gPSB7CisvKiAgICAgICAgICAgICAgY2ggICAgICAgUjEgICAgICAgICAgICAgIFIyICAgICAgICAgICAgICBSMyhUWDB+ND0wKSBSNCAqLworCXsxLCAweDk4NDAyZWNjLCAweDk4NGMwNzg2LCAweDk4MTZiNDU1LCAweDk4MDA1MTBifQorCSwKKwl7MiwgMHg5ODQwMmVjYywgMHg5ODRjMDc4NiwgMHg5ODE2OGE1NSwgMHg5ODAwNTE5Zn0KKwksCisJezMsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OGEsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9CisJLAorCXs0LCAweDk4NDAyZWNjLCAweDk4NGMwNzhhLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfQorCSwKKwl7NSwgMHg5ODQwMmVjYywgMHg5ODRjMDc4ZSwgMHg5ODE2OGE1NSwgMHg5ODAwNTE4Yn0KKwksCisJezYsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OGUsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9CisJLAorCXs3LCAweDk4NDAyZWNjLCAweDk4NGMwNzkyLCAweDk4MTY4YTU1LCAweDk4MDA1MThifQorCSwKKwl7OCwgMHg5ODQwMmVjYywgMHg5ODRjMDc5MiwgMHg5ODE2OGE1NSwgMHg5ODAwNTE5Zn0KKwksCisJezksIDB4OTg0MDJlY2MsIDB4OTg0YzA3OTYsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9CisJLAorCXsxMCwgMHg5ODQwMmVjYywgMHg5ODRjMDc5NiwgMHg5ODE2OGE1NSwgMHg5ODAwNTE5Zn0KKwksCisJezExLCAweDk4NDAyZWNjLCAweDk4NGMwNzlhLCAweDk4MTY4YTU1LCAweDk4MDA1MThifQorCSwKKwl7MTIsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OWEsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9CisJLAorCXsxMywgMHg5ODQwMmVjYywgMHg5ODRjMDc5ZSwgMHg5ODE2OGE1NSwgMHg5ODAwNTE4Yn0KKwksCisJezE0LCAweDk4NDAyZWNjLCAweDk4NGMwN2EyLCAweDk4MTY4YTU1LCAweDk4MDA1MTkzfQorCSwKKworCS8qIDgwMi4xMSBVTkkgLyBIeXBlckxhbiAyICovCisJezM2LCAweDk4NDAyZWNjLCAweDk4NGMwOTlhLCAweDk4MTU4YTU1LCAweDk4MGVkMWEzfQorCSwKKwl7MzgsIDB4OTg0MDJlY2MsIDB4OTg0YzA5OWUsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9CisJLAorCXs0MCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE4M30KKwksCisJezQ0LCAweDk4NDAyZWM4LCAweDk4NGMwNjgyLCAweDk4MTU4YTU1LCAweDk4MGVkMWEzfQorCSwKKwl7NDYsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODYsIDB4OTgxNThhNTUsIDB4OTgwZWQxOGJ9CisJLAorCXs0OCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4NiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE5Yn0KKwksCisJezUyLCAweDk4NDAyZWM4LCAweDk4NGMwNjhhLCAweDk4MTU4YTU1LCAweDk4MGVkMTkzfQorCSwKKwl7NTQsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OGEsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9CisJLAorCXs1NiwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4ZSwgMHg5ODE1OGE1NSwgMHg5ODBlZDE4Yn0KKwksCisJezYwLCAweDk4NDAyZWM4LCAweDk4NGMwNjkyLCAweDk4MTU4YTU1LCAweDk4MGVkMTgzfQorCSwKKwl7NjIsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OTIsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9CisJLAorCXs2NCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY5MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDFhM30KKwksCQkJLyogUGx1Z2Zlc3QjNCwgRGF5NCwgY2hhbmdlIFJGUjMgbGVmdDR0aCA5LT41LiAqLworCisJLyogODAyLjExIEh5cGVyTGFuIDIgKi8KKwl7MTAwLCAweDk4NDAyZWM4LCAweDk4NGMwNmIyLCAweDk4MTc4YTU1LCAweDk4MGVkNzgzfQorCSwKKworCS8qIDIwMDguMDQuMzAgbW9kaWZpZWQgKi8KKwkvKiBUaGUgc3lzdGVtIHRlYW0gaGFzIEFOIHRvIGltcHJvdmUgdGhlIEVWTSB2YWx1ZSAqLworCS8qIGZvciBjaGFubmVsIDEwMiB0byAxMDggZm9yIHRoZSBSVDI4NTAvUlQyNzUwIGR1YWwgYmFuZCBzb2x1dGlvbi4gKi8KKwl7MTAyLCAweDk4NDAyZWM4LCAweDk4NWMwNmIyLCAweDk4NTc4YTU1LCAweDk4MGVkNzkzfQorCSwKKwl7MTA0LCAweDk4NDAyZWM4LCAweDk4NWMwNmIyLCAweDk4NTc4YTU1LCAweDk4MGVkMWEzfQorCSwKKwl7MTA4LCAweDk4NDAyZWNjLCAweDk4NWMwYTMyLCAweDk4NTc4YTU1LCAweDk4MGVkMTkzfQorCSwKKworCXsxMTAsIDB4OTg0MDJlY2MsIDB4OTg0YzBhMzYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODN9CisJLAorCXsxMTIsIDB4OTg0MDJlY2MsIDB4OTg0YzBhMzYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOWJ9CisJLAorCXsxMTYsIDB4OTg0MDJlY2MsIDB4OTg0YzBhM2EsIDB4OTgxNzhhNTUsIDB4OTgwZWQxYTN9CisJLAorCXsxMTgsIDB4OTg0MDJlY2MsIDB4OTg0YzBhM2UsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOTN9CisJLAorCXsxMjAsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODN9CisJLAorCXsxMjQsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOTN9CisJLAorCXsxMjYsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxNWJ9CisJLAkJCS8qIDB4OTgwZWQxYmItPjB4OTgwZWQxNWIgcmVxdWlyZWQgYnkgUm9yeSAyMDA3MDkyNyAqLworCXsxMjgsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxYTN9CisJLAorCXsxMzIsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOGJ9CisJLAorCXsxMzQsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOTN9CisJLAorCXsxMzYsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOWJ9CisJLAorCXsxNDAsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGEsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODN9CisJLAorCisJLyogODAyLjExIFVOSUkgKi8KKwl7MTQ5LCAweDk4NDAyZWM0LCAweDk4NGMwMzhhLCAweDk4MTc4YTU1LCAweDk4MGVkMWE3fQorCSwKKwl7MTUxLCAweDk4NDAyZWM0LCAweDk4NGMwMzhlLCAweDk4MTc4YTU1LCAweDk4MGVkMTg3fQorCSwKKwl7MTUzLCAweDk4NDAyZWM0LCAweDk4NGMwMzhlLCAweDk4MTc4YTU1LCAweDk4MGVkMThmfQorCSwKKwl7MTU3LCAweDk4NDAyZWM0LCAweDk4NGMwMzhlLCAweDk4MTc4YTU1LCAweDk4MGVkMTlmfQorCSwKKwl7MTU5LCAweDk4NDAyZWM0LCAweDk4NGMwMzhlLCAweDk4MTc4YTU1LCAweDk4MGVkMWE3fQorCSwKKwl7MTYxLCAweDk4NDAyZWM0LCAweDk4NGMwMzkyLCAweDk4MTc4YTU1LCAweDk4MGVkMTg3fQorCSwKKwl7MTY1LCAweDk4NDAyZWM0LCAweDk4NGMwMzkyLCAweDk4MTc4YTU1LCAweDk4MGVkMTk3fQorCSwKKwl7MTY3LCAweDk4NDAyZWM0LCAweDk4NGMwM2QyLCAweDk4MTc5ODU1LCAweDk4MTU1MzFmfQorCSwKKwl7MTY5LCAweDk4NDAyZWM0LCAweDk4NGMwM2QyLCAweDk4MTc5ODU1LCAweDk4MTU1MzI3fQorCSwKKwl7MTcxLCAweDk4NDAyZWM0LCAweDk4NGMwM2Q2LCAweDk4MTc5ODU1LCAweDk4MTU1MzA3fQorCSwKKwl7MTczLCAweDk4NDAyZWM0LCAweDk4NGMwM2Q2LCAweDk4MTc5ODU1LCAweDk4MTU1MzBmfQorCSwKKworCS8qIEphcGFuICovCisJezE4NCwgMHg5NTAwMmNjYywgMHg5NTAwNDkxZSwgMHg5NTA5YmU1NSwgMHg5NTBjMGEwYn0KKwksCisJezE4OCwgMHg5NTAwMmNjYywgMHg5NTAwNDkyMiwgMHg5NTA5YmU1NSwgMHg5NTBjMGExM30KKwksCisJezE5MiwgMHg5NTAwMmNjYywgMHg5NTAwNDkyNiwgMHg5NTA5YmU1NSwgMHg5NTBjMGExYn0KKwksCisJezE5NiwgMHg5NTAwMmNjYywgMHg5NTAwNDkyYSwgMHg5NTA5YmU1NSwgMHg5NTBjMGEyM30KKwksCisJezIwOCwgMHg5NTAwMmNjYywgMHg5NTAwNDkzYSwgMHg5NTA5YmU1NSwgMHg5NTBjMGExM30KKwksCisJezIxMiwgMHg5NTAwMmNjYywgMHg5NTAwNDkzZSwgMHg5NTA5YmU1NSwgMHg5NTBjMGExYn0KKwksCisJezIxNiwgMHg5NTAwMmNjYywgMHg5NTAwNDk4MiwgMHg5NTA5YmU1NSwgMHg5NTBjMGEyM30KKwksCisKKwkvKiBzdGlsbCBsYWNrIG9mIE1NQUMoSmFwYW4pIGNoIDM0LDM4LDQyLDQ2ICovCit9OworCit1OCBOVU1fT0ZfMjg1MF9DSE5MID0gKHNpemVvZihSRjI4NTBSZWdUYWJsZSkgLyBzaXplb2Yoc3RydWN0IHJ0X3J0bXBfcmZfcmVncykpOworCitzdHJ1Y3QgcnRfZnJlcXVlbmN5X2l0ZW0gRnJlcUl0ZW1zMzAyMFtdID0geworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvKiBJU00gOiAyLjQgdG8gMi40ODMgR0h6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vICovCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8qIDExZyAqLworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvKi1DSC0tLU4tLS0tLS0tUi0tLUstLS0tLS0tLS0tLSAqLworCXsxLCAyNDEsIDIsIDJ9CisJLAorCXsyLCAyNDEsIDIsIDd9CisJLAorCXszLCAyNDIsIDIsIDJ9CisJLAorCXs0LCAyNDIsIDIsIDd9CisJLAorCXs1LCAyNDMsIDIsIDJ9CisJLAorCXs2LCAyNDMsIDIsIDd9CisJLAorCXs3LCAyNDQsIDIsIDJ9CisJLAorCXs4LCAyNDQsIDIsIDd9CisJLAorCXs5LCAyNDUsIDIsIDJ9CisJLAorCXsxMCwgMjQ1LCAyLCA3fQorCSwKKwl7MTEsIDI0NiwgMiwgMn0KKwksCisJezEyLCAyNDYsIDIsIDd9CisJLAorCXsxMywgMjQ3LCAyLCAyfQorCSwKKwl7MTQsIDI0OCwgMiwgNH0KKwksCit9OworCit1OCBOVU1fT0ZfMzAyMF9DSE5MID0gKHNpemVvZihGcmVxSXRlbXMzMDIwKSAvIHNpemVvZihzdHJ1Y3QgcnRfZnJlcXVlbmN5X2l0ZW0pKTsKKwordm9pZCBBc2ljVXBkYXRlQXV0b0ZhbGxCYWNrVGFibGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCAqcFJhdGVUYWJsZSkKK3sKKwl1OCBpOworCUhUX0ZCS19DRkcwX1NUUlVDIEh0Q2ZnMDsKKwlIVF9GQktfQ0ZHMV9TVFJVQyBIdENmZzE7CisJTEdfRkJLX0NGRzBfU1RSVUMgTGdDZmcwOworCUxHX0ZCS19DRkcxX1NUUlVDIExnQ2ZnMTsKKwlzdHJ1Y3QgcnRfcnRtcF90eF9yYXRlX3N3aXRjaCAqcEN1cnJUeFJhdGUsICpwTmV4dFR4UmF0ZTsKKworCS8qIHNldCB0byBpbml0aWFsIHZhbHVlICovCisJSHRDZmcwLndvcmQgPSAweDY1NDMyMTAwOworCUh0Q2ZnMS53b3JkID0gMHhlZGNiYTk4ODsKKwlMZ0NmZzAud29yZCA9IDB4ZWRjYmE5ODg7CisJTGdDZmcxLndvcmQgPSAweDAwMDAyMTAwOworCisJcE5leHRUeFJhdGUgPSAoc3RydWN0IHJ0X3J0bXBfdHhfcmF0ZV9zd2l0Y2ggKikgcFJhdGVUYWJsZSArIDE7CisJZm9yIChpID0gMTsgaSA8ICooKHU4ICopcFJhdGVUYWJsZSk7IGkrKykgeworCQlwQ3VyclR4UmF0ZSA9IChzdHJ1Y3QgcnRfcnRtcF90eF9yYXRlX3N3aXRjaCAqKSBwUmF0ZVRhYmxlICsgMSArIGk7CisJCXN3aXRjaCAocEN1cnJUeFJhdGUtPk1vZGUpIHsKKwkJY2FzZSAwOgkvKkNDSyAqLworCQkJYnJlYWs7CisJCWNhc2UgMToJLypPRkRNICovCisJCQl7CisJCQkJc3dpdGNoIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUykgeworCQkJCWNhc2UgMDoKKwkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1MwRkJLID0KKwkJCQkJICAgIChwTmV4dFR4UmF0ZS0+TW9kZSA9PQorCQkJCQkgICAgIE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPgorCQkJCQkJCSAgIEN1cnJNQ1MgKworCQkJCQkJCSAgIDgpIDogcE5leHRUeFJhdGUtPgorCQkJCQkgICAgQ3Vyck1DUzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAxOgorCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzFGQksgPQorCQkJCQkgICAgKHBOZXh0VHhSYXRlLT5Nb2RlID09CisJCQkJCSAgICAgTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+CisJCQkJCQkJICAgQ3Vyck1DUyArCisJCQkJCQkJICAgOCkgOiBwTmV4dFR4UmF0ZS0+CisJCQkJCSAgICBDdXJyTUNTOworCQkJCQlicmVhazsKKwkJCQljYXNlIDI6CisJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTMkZCSyA9CisJCQkJCSAgICAocE5leHRUeFJhdGUtPk1vZGUgPT0KKwkJCQkJICAgICBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT4KKwkJCQkJCQkgICBDdXJyTUNTICsKKwkJCQkJCQkgICA4KSA6IHBOZXh0VHhSYXRlLT4KKwkJCQkJICAgIEN1cnJNQ1M7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMzoKKwkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1MzRkJLID0KKwkJCQkJICAgIChwTmV4dFR4UmF0ZS0+TW9kZSA9PQorCQkJCQkgICAgIE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPgorCQkJCQkJCSAgIEN1cnJNQ1MgKworCQkJCQkJCSAgIDgpIDogcE5leHRUeFJhdGUtPgorCQkJCQkgICAgQ3Vyck1DUzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA0OgorCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzRGQksgPQorCQkJCQkgICAgKHBOZXh0VHhSYXRlLT5Nb2RlID09CisJCQkJCSAgICAgTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+CisJCQkJCQkJICAgQ3Vyck1DUyArCisJCQkJCQkJICAgOCkgOiBwTmV4dFR4UmF0ZS0+CisJCQkJCSAgICBDdXJyTUNTOworCQkJCQlicmVhazsKKwkJCQljYXNlIDU6CisJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTNUZCSyA9CisJCQkJCSAgICAocE5leHRUeFJhdGUtPk1vZGUgPT0KKwkJCQkJICAgICBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT4KKwkJCQkJCQkgICBDdXJyTUNTICsKKwkJCQkJCQkgICA4KSA6IHBOZXh0VHhSYXRlLT4KKwkJCQkJICAgIEN1cnJNQ1M7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNjoKKwkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1M2RkJLID0KKwkJCQkJICAgIChwTmV4dFR4UmF0ZS0+TW9kZSA9PQorCQkJCQkgICAgIE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPgorCQkJCQkJCSAgIEN1cnJNQ1MgKworCQkJCQkJCSAgIDgpIDogcE5leHRUeFJhdGUtPgorCQkJCQkgICAgQ3Vyck1DUzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA3OgorCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzdGQksgPQorCQkJCQkgICAgKHBOZXh0VHhSYXRlLT5Nb2RlID09CisJCQkJCSAgICAgTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+CisJCQkJCQkJICAgQ3Vyck1DUyArCisJCQkJCQkJICAgOCkgOiBwTmV4dFR4UmF0ZS0+CisJCQkJCSAgICBDdXJyTUNTOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAyOgkvKkhULU1JWCAqLworCQljYXNlIDM6CS8qSFQtR0YgKi8KKwkJCXsKKwkJCQlpZiAoKHBOZXh0VHhSYXRlLT5Nb2RlID49IE1PREVfSFRNSVgpCisJCQkJICAgICYmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyAhPQorCQkJCQlwTmV4dFR4UmF0ZS0+Q3Vyck1DUykpIHsKKwkJCQkJc3dpdGNoIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUykgeworCQkJCQljYXNlIDA6CisJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MwRkJLID0KKwkJCQkJCSAgICBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDE6CisJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MxRkJLID0KKwkJCQkJCSAgICBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDI6CisJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MyRkJLID0KKwkJCQkJCSAgICBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDM6CisJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MzRkJLID0KKwkJCQkJCSAgICBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDQ6CisJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1M0RkJLID0KKwkJCQkJCSAgICBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDU6CisJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1M1RkJLID0KKwkJCQkJCSAgICBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDY6CisJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1M2RkJLID0KKwkJCQkJCSAgICBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDc6CisJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1M3RkJLID0KKwkJCQkJCSAgICBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDg6CisJCQkJCQlIdENmZzEuZmllbGQuSFRNQ1M4RkJLID0KKwkJCQkJCSAgICBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDk6CisJCQkJCQlIdENmZzEuZmllbGQuSFRNQ1M5RkJLID0KKwkJCQkJCSAgICBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDEwOgorCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTBGQksgPQorCQkJCQkJICAgIHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMTE6CisJCQkJCQlIdENmZzEuZmllbGQuSFRNQ1MxMUZCSyA9CisJCQkJCQkgICAgcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxMjoKKwkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzEyRkJLID0KKwkJCQkJCSAgICBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDEzOgorCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTNGQksgPQorCQkJCQkJICAgIHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMTQ6CisJCQkJCQlIdENmZzEuZmllbGQuSFRNQ1MxNEZCSyA9CisJCQkJCQkgICAgcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxNToKKwkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzE1RkJLID0KKwkJCQkJCSAgICBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJCQkJICgiQXNpY1VwZGF0ZUF1dG9GYWxsQmFja1RhYmxlOiBub3Qgc3VwcG9ydCBDdXJyTUNTPSVkXG4iLAorCQkJCQkJCSAgcEN1cnJUeFJhdGUtPgorCQkJCQkJCSAgQ3Vyck1DUykpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlwTmV4dFR4UmF0ZSA9IHBDdXJyVHhSYXRlOworCX0KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEhUX0ZCS19DRkcwLCBIdENmZzAud29yZCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgSFRfRkJLX0NGRzEsIEh0Q2ZnMS53b3JkKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBMR19GQktfQ0ZHMCwgTGdDZmcwLndvcmQpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIExHX0ZCS19DRkcxLCBMZ0NmZzEud29yZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTZXQgTUFDIHJlZ2lzdGVyIHZhbHVlIGFjY29yZGluZyBvcGVyYXRpb24gbW9kZS4KKwkJT3BlcmF0aW9uTW9kZSBBTkQgYk5vbkdGRXhpc3QgYXJlIGZvciBNTSBhbmQgR0YgUHJvdGVjaXRvbi4KKwkJSWYgTU0gb3IgR0YgbWFzayBpcyBub3Qgc2V0LCB0aG9zZSBwYXNzaW5nIGFyZ3VtZW50IGRvZXNuJ3Qgbm90IHRha2UgZWZmZWN0LgorCisJCU9wZXJhdGlvbiBtb2RlIG1lYW5pbmc6CisJCT0gMCA6IFB1cmUgSFQsIG5vIHByZW90ZWN0aW9uLgorCQk9IDB4MDE7IHRoZXJlIG1heSBiZSBub24tSFQgZGV2aWNlcyBpbiBib3RoIHRoZSBjb250cm9sIGFuZCBleHRlbnNpb24gY2hhbm5lbCwgcHJvdGVjdGlvbiBpcyBvcHRpb25hbCBpbiBCU1MuCisJCT0gMHgxMDogTm8gVHJhbnNtaXNzaW9uIGluIDQwTSBpcyBwcm90ZWN0ZWQuCisJCT0gMHgxMTogVHJhbnNtaXNzaW9uIGluIGJvdGggNDBNIGFuZCAyME0gc2hhbGwgYmUgcHJvdGVjdGVkCisJCWlmIChiTm9uR0ZFeGlzdCkKKwkJCXdlIHNob3VsZCBjaG9vc2Ugbm90IHRvIHVzZSBHRi4gQnV0IHN0aWxsIHNldCBjb3JyZWN0IEFTSUMgcmVnaXN0ZXJzLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgQXNpY1VwZGF0ZVByb3RlY3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICAgdTE2IE9wZXJhdGlvbk1vZGUsCisJCSAgICAgICB1OCBTZXRNYXNrLAorCQkgICAgICAgSU4gQk9PTEVBTiBiRGlzYWJsZUJHUHJvdGVjdCwgSU4gQk9PTEVBTiBiTm9uR0ZFeGlzdCkKK3sKKwlQUk9UX0NGR19TVFJVQyBQcm90Q2ZnLCBQcm90Q2ZnNDsKKwl1MzIgUHJvdGVjdFs2XTsKKwl1MTYgb2Zmc2V0OworCXU4IGk7CisJdTMyIE1hY1JlZyA9IDA7CisKKwlpZiAoIShwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0KSAmJiAoT3BlcmF0aW9uTW9kZSAhPSA4KSkgeworCQlyZXR1cm47CisJfQorCisJaWYgKHBBZC0+QkFUYWJsZS5udW1Eb25lT3JpZ2luYXRvcikgeworCQkvKiAqLworCQkvKiBlbmFibGUgdGhlIFJUUy9DVFMgdG8gYXZvaWQgY2hhbm5lbCBjb2xsaXNpb24gKi8KKwkJLyogKi8KKwkJU2V0TWFzayA9IEFMTE5fU0VUUFJPVEVDVDsKKwkJT3BlcmF0aW9uTW9kZSA9IDg7CisJfQorCS8qIENvbmZpZyBBU0lDIFJUUyB0aHJlc2hvbGQgcmVnaXN0ZXIgKi8KKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1JUU19DRkcsICZNYWNSZWcpOworCU1hY1JlZyAmPSAweEZGMDAwMEZGOworCS8qIElmIHRoZSB1c2VyIHdhbnQgZGlzYWJsZSBSdHNUaHJlc2hvbGQgYW5kIGVuYWJsZSBBbXNkdS9SYWxpbmstQWdncmVnYXRpb24sIHNldCB0aGUgUnRzVGhyZXNob2xkIGFzIDQwOTYgKi8KKwlpZiAoKChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUpIHx8CisJICAgICAocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9PSBUUlVFKSkKKwkgICAgJiYgcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID09IE1BWF9SVFNfVEhSRVNIT0xEKSB7CisJCU1hY1JlZyB8PSAoMHgxMDAwIDw8IDgpOworCX0gZWxzZSB7CisJCU1hY1JlZyB8PSAocEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkIDw8IDgpOworCX0KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1JUU19DRkcsIE1hY1JlZyk7CisKKwkvKiBJbml0aWFsIGNvbW1vbiBwcm90ZWN0aW9uIHNldHRpbmdzICovCisJUlRNUFplcm9NZW1vcnkoUHJvdGVjdCwgc2l6ZW9mKFByb3RlY3QpKTsKKwlQcm90Q2ZnNC53b3JkID0gMDsKKwlQcm90Q2ZnLndvcmQgPSAwOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93R0Y0MCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dHRjIwID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd01NNDAgPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93TU0yMCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dPZmRtID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0NjayA9IDE7CisJUHJvdENmZy5maWVsZC5SVFNUaEVuID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCisJLyogdXBkYXRlIFBIWSBtb2RlIGFuZCByYXRlICovCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwkJUHJvdENmZy5maWVsZC5Qcm90ZWN0UmF0ZSA9IDB4NDAwMDsKKwlQcm90Q2ZnLmZpZWxkLlByb3RlY3RSYXRlIHw9IHBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGU7CisKKwkvKiBIYW5kbGUgbGVnYWN5KEIvRykgcHJvdGVjdGlvbiAqLworCWlmIChiRGlzYWJsZUJHUHJvdGVjdCkgeworCQkvKlByb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlOyAqLworCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gMDsKKwkJUHJvdGVjdFswXSA9IFByb3RDZmcud29yZDsKKwkJUHJvdGVjdFsxXSA9IFByb3RDZmcud29yZDsKKwkJcEFkLT5GbGdDdHNFbmFibGVkID0gMDsJLyogQ1RTLXNlbGYgaXMgbm90IHVzZWQgKi8KKwl9IGVsc2UgeworCQkvKlByb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlOyAqLworCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gMDsJLyogQ0NLIGRvIG5vdCBuZWVkIHRvIGJlIHByb3RlY3RlZCAqLworCQlQcm90ZWN0WzBdID0gUHJvdENmZy53b3JkOworCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19DVFM7CS8qIE9GRE0gbmVlZHMgdXNpbmcgQ0NLIHRvIHByb3RlY3QgKi8KKwkJUHJvdGVjdFsxXSA9IFByb3RDZmcud29yZDsKKwkJcEFkLT5GbGdDdHNFbmFibGVkID0gMTsJLyogQ1RTLXNlbGYgaXMgdXNlZCAqLworCX0KKworCS8qIERlY2lkZSBIVCBmcmFtZSBwcm90ZWN0aW9uLiAqLworCWlmICgoU2V0TWFzayAmIEFMTE5fU0VUUFJPVEVDVCkgIT0gMCkgeworCQlzd2l0Y2ggKE9wZXJhdGlvbk1vZGUpIHsKKwkJY2FzZSAweDA6CisJCQkvKiBOTyBQUk9URUNUICovCisJCQkvKiAxLkFsbCBTVEFzIGluIHRoZSBCU1MgYXJlIDIwLzQwIE1IeiBIVCAqLworCQkJLyogMi4gaW4gYWkgMjAvNDBNSHogQlNTICovCisJCQkvKiAzLiBhbGwgU1RBcyBhcmUgMjBNSHogaW4gYSAyME1IeiBCU1MgKi8KKwkJCS8qIFB1cmUgSFQuIG5vIHByb3RlY3Rpb24uICovCisKKwkJCS8qIE1NMjBfUFJPVF9DRkcgKi8KKwkJCS8qICAgICAgUmVzZXJ2ZWQgKDMxOjI3KSAqLworCQkJLyogICAgICBQUk9UX1RYT1AoMjU6MjApIC0tIDAxMDExMSAqLworCQkJLyogICAgICBQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikgKi8KKwkJCS8qICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKSAqLworCQkJLyogICAgICBQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDAwNCAoT0ZETSAyNE0pICovCisJCQlQcm90ZWN0WzJdID0gMHgwMTc0NDAwNDsKKworCQkJLyogTU00MF9QUk9UX0NGRyAqLworCQkJLyogICAgICBSZXNlcnZlZCAoMzE6MjcpICovCisJCQkvKiAgICAgIFBST1RfVFhPUCgyNToyMCkgLS0gMTExMTExICovCisJCQkvKiAgICAgIFBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKSAqLworCQkJLyogIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpICovCisJCQkvKiAgICAgIFBST1RfUkFURSgxNTowKSAgLS0gMHg0MDg0IChkdXBsaWNhdGUgT0ZETSAyNE0pICovCisJCQlQcm90ZWN0WzNdID0gMHgwM2Y0NDA4NDsKKworCQkJLyogQ0YyMF9QUk9UX0NGRyAqLworCQkJLyogICAgICBSZXNlcnZlZCAoMzE6MjcpICovCisJCQkvKiAgICAgIFBST1RfVFhPUCgyNToyMCkgLS0gMDEwMTExICovCisJCQkvKiAgICAgIFBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKSAqLworCQkJLyogIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpICovCisJCQkvKiAgICAgIFBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkgKi8KKwkJCVByb3RlY3RbNF0gPSAweDAxNzQ0MDA0OworCisJCQkvKiBDRjQwX1BST1RfQ0ZHICovCisJCQkvKiAgICAgIFJlc2VydmVkICgzMToyNykgKi8KKwkJCS8qICAgICAgUFJPVF9UWE9QKDI1OjIwKSAtLSAxMTExMTEgKi8KKwkJCS8qICAgICAgUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pICovCisJCQkvKiAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkgKi8KKwkJCS8qICAgICAgUFJPVF9SQVRFKDE1OjApICAtLSAweDQwODQgKGR1cGxpY2F0ZSBPRkRNIDI0TSkgKi8KKwkJCVByb3RlY3RbNV0gPSAweDAzZjQ0MDg0OworCisJCQlpZiAoYk5vbkdGRXhpc3QpIHsKKwkJCQkvKiBQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlpb24pICovCisJCQkJLyogUFJPVF9DVFJMKDE3OjE2KSAtLSAwMSAoUlRTL0NUUykgKi8KKwkJCQlQcm90ZWN0WzRdID0gMHgwMTc1NDAwNDsKKwkJCQlQcm90ZWN0WzVdID0gMHgwM2Y1NDA4NDsKKwkJCX0KKwkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBGQUxTRTsKKwkJCWJyZWFrOworCisJCWNhc2UgMToKKwkJCS8qIFRoaXMgaXMgIkhUIG5vbi1tZW1iZXIgcHJvdGVjdGlvbiBtb2RlLiIgKi8KKwkJCS8qIElmIHRoZXJlIG1heSBiZSBub24tSFQgU1RBcyBteSBCU1MgKi8KKwkJCVByb3RDZmcud29yZCA9IDB4MDE3NDQwMDQ7CS8qIFBST1RfQ1RSTCgxNzoxNikgOiAwIChOb25lKSAqLworCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDQwODQ7CS8qIGR1cGxpY2FldCBsZWdhY3kgMjRNLiBCVyBzZXQgMS4gKi8KKwkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcKKwkJCSAgICAocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKSkgeworCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDAwMDM7CS8qRVJQIHVzZSBQcm90ZWN0aW9uIGJpdCBpcyBzZXQsIHVzZSBwcm90ZWN0aW9uIHJhdGUgYXQgQ2xhdXNlIDE4Li4gKi8KKwkJCQlQcm90Q2ZnNC53b3JkID0gMHgwM2Y0MDAwMzsJLyogRG9uJ3QgZHVwbGljYXRlIFJUUy9DVFMgaW4gQ0NLIG1vZGUuIDB4MDNmNDAwODM7ICovCisJCQl9CisJCQkvKkFzc2lnbiBQcm90ZWN0aW9uIG1ldGhvZCBmb3IgMjAmNDAgTUh6IHBhY2tldHMgKi8KKwkJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCVByb3RDZmcuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7CisJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOworCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7CisJCQlQcm90ZWN0WzJdID0gUHJvdENmZy53b3JkOworCQkJUHJvdGVjdFszXSA9IFByb3RDZmc0LndvcmQ7CisJCQlQcm90ZWN0WzRdID0gUHJvdENmZy53b3JkOworCQkJUHJvdGVjdFs1XSA9IFByb3RDZmc0LndvcmQ7CisJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJSVFNMb25nUHJvdE9uID0gVFJVRTsKKwkJCWJyZWFrOworCisJCWNhc2UgMjoKKwkJCS8qIElmIG9ubHkgSFQgU1RBcyBhcmUgaW4gQlNTLiBhdCBsZWFzdCBvbmUgaXMgMjBNSHouIE9ubHkgcHJvdGVjdCA0ME1IeiBwYWNrZXRzICovCisJCQlQcm90Q2ZnLndvcmQgPSAweDAxNzQ0MDA0OwkvKiBQUk9UX0NUUkwoMTc6MTYpIDogMCAoTm9uZSkgKi8KKwkJCVByb3RDZmc0LndvcmQgPSAweDAzZjQ0MDg0OwkvKiBkdXBsaWNhZXQgbGVnYWN5IDI0TS4gQlcgc2V0IDEuICovCisKKwkJCS8qQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciA0ME1IeiBwYWNrZXRzICovCisJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOworCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7CisJCQlQcm90ZWN0WzJdID0gUHJvdENmZy53b3JkOworCQkJUHJvdGVjdFszXSA9IFByb3RDZmc0LndvcmQ7CisJCQlpZiAoYk5vbkdGRXhpc3QpIHsKKwkJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19SVFM7CisJCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKwkJCX0KKwkJCVByb3RlY3RbNF0gPSBQcm90Q2ZnLndvcmQ7CisJCQlQcm90ZWN0WzVdID0gUHJvdENmZzQud29yZDsKKworCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IEZBTFNFOworCQkJYnJlYWs7CisKKwkJY2FzZSAzOgorCQkJLyogSFQgbWl4ZWQgbW9kZS4gICAgICAgIFBST1RFQ1QgQUxMISAqLworCQkJLyogQXNzaWduIFJhdGUgKi8KKwkJCVByb3RDZmcud29yZCA9IDB4MDE3NDQwMDQ7CS8qZHVwbGljYWV0IGxlZ2FjeSAyNE0uIEJXIHNldCAxLiAqLworCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDQwODQ7CisJCQkvKiBib3RoIDIwTUh6IGFuZCA0ME1IeiBhcmUgcHJvdGVjdGVkLiBXaGV0aGVyIHVzZSBSVFMgb3IgQ1RTLXRvLXNlbGYgZGVwZW5kcyBvbiB0aGUgKi8KKwkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcKKwkJCSAgICAocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKSkgeworCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDAwMDM7CS8qRVJQIHVzZSBQcm90ZWN0aW9uIGJpdCBpcyBzZXQsIHVzZSBwcm90ZWN0aW9uIHJhdGUgYXQgQ2xhdXNlIDE4Li4gKi8KKwkJCQlQcm90Q2ZnNC53b3JkID0gMHgwM2Y0MDAwMzsJLyogRG9uJ3QgZHVwbGljYXRlIFJUUy9DVFMgaW4gQ0NLIG1vZGUuIDB4MDNmNDAwODMgKi8KKwkJCX0KKwkJCS8qQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciAyMCY0MCBNSHogcGFja2V0cyAqLworCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOworCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKwkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19SVFM7CisJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKwkJCVByb3RlY3RbMl0gPSBQcm90Q2ZnLndvcmQ7CisJCQlQcm90ZWN0WzNdID0gUHJvdENmZzQud29yZDsKKwkJCVByb3RlY3RbNF0gPSBQcm90Q2ZnLndvcmQ7CisJCQlQcm90ZWN0WzVdID0gUHJvdENmZzQud29yZDsKKwkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBUUlVFOworCQkJYnJlYWs7CisKKwkJY2FzZSA4OgorCQkJLyogU3BlY2lhbCBvbiBmb3IgQXRoZXJvcyBwcm9ibGVtIG4gY2hpcC4gKi8KKwkJCVByb3RlY3RbMl0gPSAweDAxNzU0MDA0OworCQkJUHJvdGVjdFszXSA9IDB4MDNmNTQwODQ7CisJCQlQcm90ZWN0WzRdID0gMHgwMTc1NDAwNDsKKwkJCVByb3RlY3RbNV0gPSAweDAzZjU0MDg0OworCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IFRSVUU7CisJCQlicmVhazsKKwkJfQorCX0KKworCW9mZnNldCA9IENDS19QUk9UX0NGRzsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCWlmICgoU2V0TWFzayAmICgxIDw8IGkpKSkgeworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0ICsgaSAqIDQsIFByb3RlY3RbaV0pOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwordm9pZCBBc2ljU3dpdGNoQ2hhbm5lbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IENoYW5uZWwsIElOIEJPT0xFQU4gYlNjYW4pCit7CisJdW5zaWduZWQgbG9uZyBSMiA9IDAsIFIzID0gREVGQVVMVF9SRl9UWF9QT1dFUiwgUjQgPSAwOworCWNoYXIgVHhQd2VyID0gMCwgVHhQd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CS8qQmJwOTQgPSBCQlBSOTRfREVGQVVMVCwgVHhQd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7ICovCisJdTggaW5kZXg7CisJdTMyIFZhbHVlID0gMDsJLypCYnBSZWcsIFZhbHVlOyAqLworCXN0cnVjdCBydF9ydG1wX3JmX3JlZ3MgKlJGUmVnVGFibGU7CisJdTggUkZWYWx1ZTsKKworCVJGVmFsdWUgPSAwOworCS8qIFNlYXJjaCBUeCBwb3dlciB2YWx1ZSAqLworCS8qIFdlIGNhbid0IHVzZSBDaGFubmVsTGlzdCB0byBzZWFyY2ggY2hhbm5lbCwgc2luY2Ugc29tZSBjZW50cmFsIGNoYW5ubCdzIHR4cG93ciBkb2Vzbid0IGxpc3QgKi8KKwkvKiBpbiBDaGFubmVsTGlzdCwgc28gdXNlIFR4UG93ZXIgYXJyYXkgaW5zdGVhZC4gKi8KKwkvKiAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGluZGV4KyspIHsKKwkJaWYgKENoYW5uZWwgPT0gcEFkLT5UeFBvd2VyW2luZGV4XS5DaGFubmVsKSB7CisJCQlUeFB3ZXIgPSBwQWQtPlR4UG93ZXJbaW5kZXhdLlBvd2VyOworCQkJVHhQd2VyMiA9IHBBZC0+VHhQb3dlcltpbmRleF0uUG93ZXIyOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaW5kZXggPT0gTUFYX05VTV9PRl9DSEFOTkVMUykgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIkFzaWNTd2l0Y2hDaGFubmVsOiBDYW4ndCBmaW5kIHRoZSBDaGFubmVsIyVkIFxuIiwKKwkJCSAgQ2hhbm5lbCkpOworCX0KKyNpZmRlZiBSVDMweHgKKwkvKiBUaGUgUkYgcHJvZ3JhbW1pbmcgc2VxdWVuY2UgaXMgZGlmZmVyZW5jZSBiZXR3ZWVuIDN4eHggYW5kIDJ4eHggKi8KKwlpZiAoKElTX1JUMzA3MChwQWQpIHx8IElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzM5MChwQWQpKQorCSAgICAmJiAoKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIwKSB8fCAocEFkLT5SZkljVHlwZSA9PSBSRklDXzIwMjApCisJCXx8IChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMSkKKwkJfHwgKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIyKSkpIHsKKwkJLyogbW9kaWZ5IGJ5IFdZIGZvciBSZWFkIFJGIFJlZy4gZXJyb3IgKi8KKworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMzAyMF9DSE5MOyBpbmRleCsrKSB7CisJCQlpZiAoQ2hhbm5lbCA9PSBGcmVxSXRlbXMzMDIwW2luZGV4XS5DaGFubmVsKSB7CisJCQkJLyogUHJvZ3JhbW1pbmcgY2hhbm5lbCBwYXJhbWV0ZXJzICovCisJCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjAyLAorCQkJCQkJICAgICAgRnJlcUl0ZW1zMzAyMFtpbmRleF0uTik7CisJCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjAzLAorCQkJCQkJICAgICAgRnJlcUl0ZW1zMzAyMFtpbmRleF0uSyk7CisJCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDYsICZSRlZhbHVlKTsKKwkJCQlSRlZhbHVlID0KKwkJCQkgICAgKFJGVmFsdWUgJiAweEZDKSB8IEZyZXFJdGVtczMwMjBbaW5kZXhdLlI7CisJCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA2LCBSRlZhbHVlKTsKKworCQkJCS8qIFNldCBUeDAgUG93ZXIgKi8KKwkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IxMiwgJlJGVmFsdWUpOworCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmIDB4RTApIHwgVHhQd2VyOworCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IxMiwgUkZWYWx1ZSk7CisKKwkJCQkvKiBTZXQgVHgxIFBvd2VyICovCisJCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMTMsICZSRlZhbHVlKTsKKwkJCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAweEUwKSB8IFR4UHdlcjI7CisJCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjEzLCBSRlZhbHVlKTsKKworCQkJCS8qIFR4L1J4IFN0cmVhbSBzZXR0aW5nICovCisJCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDEsICZSRlZhbHVlKTsKKwkJCQkvKmlmIChJU19SVDMwOTAocEFkKSkgKi8KKwkJCQkvKiAgICAgIFJGVmFsdWUgfD0gMHgwMTsgLy8gRW5hYmxlIFJGIGJsb2NrLiAqLworCQkJCVJGVmFsdWUgJj0gMHgwMzsJLypjbGVhciBiaXRbN34yXSAqLworCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCisJCQkJCVJGVmFsdWUgfD0gMHhBMDsKKwkJCQllbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpCisJCQkJCVJGVmFsdWUgfD0gMHg4MDsKKwkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQorCQkJCQlSRlZhbHVlIHw9IDB4NTA7CisJCQkJZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQorCQkJCQlSRlZhbHVlIHw9IDB4NDA7CisJCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCBSRlZhbHVlKTsKKworCQkJCS8qIFNldCBSRiBvZmZzZXQgKi8KKwkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMywgJlJGVmFsdWUpOworCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmIDB4ODApIHwgcEFkLT5SZkZyZXFPZmZzZXQ7CisJCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIzLCBSRlZhbHVlKTsKKworCQkJCS8qIFNldCBCVyAqLworCQkJCWlmICghYlNjYW4KKwkJCQkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkpIHsKKwkJCQkJUkZWYWx1ZSA9IHBBZC0+TWxtZS5DYWxpQlc0MFJmUjI0OworCQkJCQkvKkRJU0FCTEVfMTFOX0NIRUNLKHBBZCk7ICovCisJCQkJfSBlbHNlIHsKKwkJCQkJUkZWYWx1ZSA9IHBBZC0+TWxtZS5DYWxpQlcyMFJmUjI0OworCQkJCX0KKwkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjQsIFJGVmFsdWUpOworCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMSwgUkZWYWx1ZSk7CisKKwkJCQkvKiBFbmFibGUgUkYgdHVuaW5nICovCisJCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsICZSRlZhbHVlKTsKKwkJCQlSRlZhbHVlID0gUkZWYWx1ZSB8IDB4MTsKKwkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsIFJGVmFsdWUpOworCisJCQkJLyogbGF0Y2ggY2hhbm5lbCBmb3IgZnV0dXJlIHVzYWdlLiAqLworCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA9IENoYW5uZWw7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiU3dpdGNoQ2hhbm5lbCMlZChSRj0lZCwgUHdyMD0lZCwgUHdyMT0lZCwgJWRUKSwgTj0weCUwMlgsIEs9MHglMDJYLCBSPTB4JTAyWFxuIiwKKwkJCQkJICBDaGFubmVsLCBwQWQtPlJmSWNUeXBlLCBUeFB3ZXIsCisJCQkJCSAgVHhQd2VyMiwgcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwKKwkJCQkJICBGcmVxSXRlbXMzMDIwW2luZGV4XS5OLAorCQkJCQkgIEZyZXFJdGVtczMwMjBbaW5kZXhdLkssCisJCQkJCSAgRnJlcUl0ZW1zMzAyMFtpbmRleF0uUikpOworCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UKKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KKwl7CisJCVJGUmVnVGFibGUgPSBSRjI4NTBSZWdUYWJsZTsKKwkJc3dpdGNoIChwQWQtPlJmSWNUeXBlKSB7CisJCWNhc2UgUkZJQ18yODIwOgorCQljYXNlIFJGSUNfMjg1MDoKKwkJY2FzZSBSRklDXzI3MjA6CisJCWNhc2UgUkZJQ18yNzUwOgorCisJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMjg1MF9DSE5MOyBpbmRleCsrKSB7CisJCQkJaWYgKENoYW5uZWwgPT0gUkZSZWdUYWJsZVtpbmRleF0uQ2hhbm5lbCkgeworCQkJCQlSMiA9IFJGUmVnVGFibGVbaW5kZXhdLlIyOworCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKSB7CisJCQkJCQlSMiB8PSAweDQwMDA7CS8qIElmIFRYcGF0aCBpcyAxLCBiaXQgMTQgPSAxOyAqLworCQkJCQl9CisKKwkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikgeworCQkJCQkJUjIgfD0gMHg0MDsJLyogd3JpdGUgMSB0byBvZmYgUnhwYXRoLiAqLworCQkJCQl9IGVsc2UgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0KKwkJCQkJCSAgIDEpIHsKKwkJCQkJCVIyIHw9IDB4MjAwNDA7CS8qIHdyaXRlIDEgdG8gb2ZmIFJ4UGF0aCAqLworCQkJCQl9CisKKwkJCQkJaWYgKENoYW5uZWwgPiAxNCkgeworCQkJCQkJLyogaW5pdGlhbGl6ZSBSMywgUjQgKi8KKwkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLgorCQkJCQkJICAgICAgUjMgJiAweGZmZmZjMWZmKTsKKwkJCQkJCVI0ID0gKFJGUmVnVGFibGVbaW5kZXhdLgorCQkJCQkJICAgICAgUjQgJiAofjB4MDAxZjg3YzApKSB8CisJCQkJCQkgICAgKHBBZC0+UmZGcmVxT2Zmc2V0IDw8IDE1KTsKKworCQkJCQkJLyogNUcgYmFuZCBwb3dlciByYW5nZTogMHhGOX4wWDBGLCBUWDAgUmVnMyBiaXQ5L1RYMSBSZWc0IGJpdDY9IjAiIG1lYW5zIHRoZSBUWCBwb3dlciByZWR1Y2UgN2RCICovCisJCQkJCQkvKiBSMyAqLworCQkJCQkJaWYgKChUeFB3ZXIgPj0gLTcpCisJCQkJCQkgICAgJiYgKFR4UHdlciA8IDApKSB7CisJCQkJCQkJVHhQd2VyID0gKDcgKyBUeFB3ZXIpOworCQkJCQkJCVR4UHdlciA9CisJCQkJCQkJICAgIChUeFB3ZXIgPgorCQkJCQkJCSAgICAgMHhGKSA/ICgweEYpCisJCQkJCQkJICAgIDogKFR4UHdlcik7CisJCQkJCQkJUjMgfD0gKFR4UHdlciA8PCAxMCk7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJCQkJCSAoIkFzaWNTd2l0Y2hDaGFubmVsOiBUeFB3ZXI9JWQgXG4iLAorCQkJCQkJCQkgIFR4UHdlcikpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlUeFB3ZXIgPQorCQkJCQkJCSAgICAoVHhQd2VyID4KKwkJCQkJCQkgICAgIDB4RikgPyAoMHhGKQorCQkJCQkJCSAgICA6IChUeFB3ZXIpOworCQkJCQkJCVIzIHw9CisJCQkJCQkJICAgIChUeFB3ZXIgPDwgMTApIHwgKDEKKwkJCQkJCQkJCSAgICAgIDw8CisJCQkJCQkJCQkgICAgICA5KTsKKwkJCQkJCX0KKworCQkJCQkJLyogUjQgKi8KKwkJCQkJCWlmICgoVHhQd2VyMiA+PSAtNykKKwkJCQkJCSAgICAmJiAoVHhQd2VyMiA8IDApKSB7CisJCQkJCQkJVHhQd2VyMiA9ICg3ICsgVHhQd2VyMik7CisJCQkJCQkJVHhQd2VyMiA9CisJCQkJCQkJICAgIChUeFB3ZXIyID4KKwkJCQkJCQkgICAgIDB4RikgPyAoMHhGKQorCQkJCQkJCSAgICA6IChUeFB3ZXIyKTsKKwkJCQkJCQlSNCB8PSAoVHhQd2VyMiA8PCA3KTsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJCQkJICgiQXNpY1N3aXRjaENoYW5uZWw6IFR4UHdlcjI9JWQgXG4iLAorCQkJCQkJCQkgIFR4UHdlcjIpKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJVHhQd2VyMiA9CisJCQkJCQkJICAgIChUeFB3ZXIyID4KKwkJCQkJCQkgICAgIDB4RikgPyAoMHhGKQorCQkJCQkJCSAgICA6IChUeFB3ZXIyKTsKKwkJCQkJCQlSNCB8PQorCQkJCQkJCSAgICAoVHhQd2VyMiA8PCA3KSB8ICgxCisJCQkJCQkJCQkgICAgICA8PAorCQkJCQkJCQkJICAgICAgNik7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlSMyA9IChSRlJlZ1RhYmxlW2luZGV4XS5SMyAmIDB4ZmZmZmMxZmYpIHwgKFR4UHdlciA8PCA5KTsJLyogc2V0IFRYIHBvd2VyMCAqLworCQkJCQkJUjQgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjQgJiAofjB4MDAxZjg3YzApKSB8IChwQWQtPlJmRnJlcU9mZnNldCA8PCAxNSkgfCAoVHhQd2VyMiA8PCA2KTsJLyogU2V0IGZyZXEgT2Zmc2V0ICYgVHhQd3IxICovCisJCQkJCX0KKworCQkJCQkvKiBCYXNlZCBvbiBCQlAgY3VycmVudCBtb2RlIGJlZm9yZSBjaGFuZ2luZyBSRiBjaGFubmVsLiAqLworCQkJCQlpZiAoIWJTY2FuCisJCQkJCSAgICAmJiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09CisJCQkJCQlCV180MCkpIHsKKwkJCQkJCVI0IHw9IDB4MjAwMDAwOworCQkJCQl9CisJCQkJCS8qIFVwZGF0ZSB2YXJpYWJsZXMgKi8KKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID0gQ2hhbm5lbDsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMSA9CisJCQkJCSAgICBSRlJlZ1RhYmxlW2luZGV4XS5SMTsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMiA9IFIyOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gUjM7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSNDsKKworCQkJCQkvKiBTZXQgUkYgdmFsdWUgMSdzIHNldCBSM1tiaXQyXSA9IFswXSAqLworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLAorCQkJCQkJCSAgIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLAorCQkJCQkJCSAgIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLAorCQkJCQkJCSAgIChwQWQtPkxhdGNoUmZSZWdzLgorCQkJCQkJCSAgICBSMyAmICh+MHgwNCkpKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwKKwkJCQkJCQkgICBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKKworCQkJCQlSVE1QdXNlY0RlbGF5KDIwMCk7CisKKwkJCQkJLyogU2V0IFJGIHZhbHVlIDIncyBzZXQgUjNbYml0Ml0gPSBbMV0gKi8KKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwKKwkJCQkJCQkgICBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwKKwkJCQkJCQkgICBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwKKwkJCQkJCQkgICAocEFkLT5MYXRjaFJmUmVncy4KKwkJCQkJCQkgICAgUjMgfCAweDA0KSk7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsCisJCQkJCQkJICAgcEFkLT5MYXRjaFJmUmVncy5SNCk7CisKKwkJCQkJUlRNUHVzZWNEZWxheSgyMDApOworCisJCQkJCS8qIFNldCBSRiB2YWx1ZSAzJ3Mgc2V0IFIzW2JpdDJdID0gWzBdICovCisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsCisJCQkJCQkJICAgcEFkLT5MYXRjaFJmUmVncy5SMSk7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsCisJCQkJCQkJICAgcEFkLT5MYXRjaFJmUmVncy5SMik7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsCisJCQkJCQkJICAgKHBBZC0+TGF0Y2hSZlJlZ3MuCisJCQkJCQkJICAgIFIzICYgKH4weDA0KSkpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLAorCQkJCQkJCSAgIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiU3dpdGNoQ2hhbm5lbCMlZChSRj0lZCwgUHdyMD0lbHUsIFB3cjE9JWx1LCAlZFQpIHRvICwgUjE9MHglMDhseCwgUjI9MHglMDhseCwgUjM9MHglMDhseCwgUjQ9MHglMDhseFxuIiwKKwkJCSAgQ2hhbm5lbCwgcEFkLT5SZkljVHlwZSwgKFIzICYgMHgwMDAwM2UwMCkgPj4gOSwKKwkJCSAgKFI0ICYgMHgwMDAwMDdjMCkgPj4gNiwgcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwKKwkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMSwgcEFkLT5MYXRjaFJmUmVncy5SMiwKKwkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMywgcEFkLT5MYXRjaFJmUmVncy5SNCkpOworCX0KKworCS8qIENoYW5nZSBCQlAgc2V0dGluZyBkdXJpbmcgc2l3dGNoIGZyb20gYS0+ZywgZy0+YSAqLworCWlmIChDaGFubmVsIDw9IDE0KSB7CisJCXVuc2lnbmVkIGxvbmcgVHhQaW5DZmcgPSAweDAwMDUwRjBBOwkvKkdhcnkgMjAwNy8wOC8wOSAweDA1MEEwQSAqLworCisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYyLAorCQkJCQkgICAgICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjMsCisJCQkJCSAgICAgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NCwKKwkJCQkJICAgICAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg2LCAwKTsJLyooMHg0NCAtIEdFVF9MTkFfR0FJTihwQWQpKSk7ICAgIC8vIEFjY29yZGluZyB0aGUgUm9yeSdzIHN1Z2dlc3Rpb24gdG8gc29sdmUgdGhlIG1pZGRsZSByYW5nZSBpc3N1ZS4gKi8KKwkJLypSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHg2Mik7ICovCisKKwkJLyogUnggSGlnaCBwb3dlciBWR0Egb2Zmc2V0IGZvciBMTkEgc2VsZWN0ICovCisJCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JHKSB7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHg2Mik7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3NSwgMHg0Nik7CisJCX0gZWxzZSB7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHg4NCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3NSwgMHg1MCk7CisJCX0KKworCQkvKiA1RyBiYW5kIHNlbGVjdGlvbiBQSU4sIGJpdDEgYW5kIGJpdDIgYXJlIGNvbXBsZW1lbnQgKi8KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDYpOworCQlWYWx1ZSB8PSAoMHgwNCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisKKwkJLyogVHVybiBvZmYgdW51c2VkIFBBIG9yIExOQSB3aGVuIG9ubHkgMVQgb3IgMVIgKi8KKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkgeworCQkJVHhQaW5DZmcgJj0gMHhGRkZGRkZGMzsKKwkJfQorCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKSB7CisJCQlUeFBpbkNmZyAmPSAweEZGRkZGM0ZGOworCQl9CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUElOX0NGRywgVHhQaW5DZmcpOworCisjaWYgZGVmaW5lZChSVDMwOTApIHx8IGRlZmluZWQoUlQzMzkwKQorCQkvKiBQQ0llIFBIWSBUcmFuc21pdCBhdHRlbnVhdGlvbiBhZGp1c3RtZW50ICovCisJCWlmIChJU19SVDMwOTBBKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpIHsKKwkJCVRYX0FUVEVOVUFUSU9OX0NUUkxfU1RSVUMgVHhBdHRlbnVhdGlvbkN0cmwgPSB7CisJCQkud29yZCA9IDB9OworCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFBDSUVfUEhZX1RYX0FUVEVOVUFUSU9OX0NUUkwsCisJCQkJICAgICAgICZUeEF0dGVudWF0aW9uQ3RybC53b3JkKTsKKworCQkJaWYgKENoYW5uZWwgPT0gMTQpCS8qIENoYW5uZWwgIzE0ICovCisJCQl7CisJCQkJVHhBdHRlbnVhdGlvbkN0cmwuZmllbGQuUENJRV9QSFlfVFhfQVRURU5fRU4gPSAxOwkvKiBFbmFibGUgUENJZSBQSFkgVHggYXR0ZW51YXRpb24gKi8KKwkJCQlUeEF0dGVudWF0aW9uQ3RybC5maWVsZC5QQ0lFX1BIWV9UWF9BVFRFTl9WQUxVRSA9IDQ7CS8qIDkvMTYgZnVsbCBkcml2ZSBsZXZlbCAqLworCQkJfSBlbHNlCS8qIENoYW5uZWwgIzF+IzEzICovCisJCQl7CisJCQkJVHhBdHRlbnVhdGlvbkN0cmwuZmllbGQuUENJRV9QSFlfVFhfQVRURU5fRU4gPSAwOwkvKiBEaXNhYmxlIFBDSWUgUEhZIFR4IGF0dGVudWF0aW9uICovCisJCQkJVHhBdHRlbnVhdGlvbkN0cmwuZmllbGQuUENJRV9QSFlfVFhfQVRURU5fVkFMVUUgPSAwOwkvKiBuL2EgKi8KKwkJCX0KKworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgUENJRV9QSFlfVFhfQVRURU5VQVRJT05fQ1RSTCwKKwkJCQkJVHhBdHRlbnVhdGlvbkN0cmwud29yZCk7CisJCX0KKyNlbmRpZgorCX0gZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcgVHhQaW5DZmcgPSAweDAwMDUwRjA1OwkvKkdhcnkgMjAwNy84LzkgMHgwNTA1MDUgKi8KKworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MiwKKwkJCQkJICAgICAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYzLAorCQkJCQkgICAgICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjQsCisJCQkJCSAgICAgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4NiwgMCk7CS8qKDB4NDQgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOyAgIC8vIEFjY29yZGluZyB0aGUgUm9yeSdzIHN1Z2dlc3Rpb24gdG8gc29sdmUgdGhlIG1pZGRsZSByYW5nZSBpc3N1ZS4gKi8KKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4RjIpOworCisJCS8qIFJ4IEhpZ2ggcG93ZXIgVkdBIG9mZnNldCBmb3IgTE5BIHNlbGVjdCAqLworCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yQSkgeworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzUsIDB4NDYpOworCQl9IGVsc2UgeworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzUsIDB4NTApOworCQl9CisKKwkJLyogNUcgYmFuZCBzZWxlY3Rpb24gUElOLCBiaXQxIGFuZCBiaXQyIGFyZSBjb21wbGVtZW50ICovCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZWYWx1ZSk7CisJCVZhbHVlICY9ICh+MHg2KTsKKwkJVmFsdWUgfD0gKDB4MDIpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgVmFsdWUpOworCisJCS8qIFR1cm4gb2ZmIHVudXNlZCBQQSBvciBMTkEgd2hlbiBvbmx5IDFUIG9yIDFSICovCisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpIHsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkZGRjM7CisJCX0KKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkgeworCQkJVHhQaW5DZmcgJj0gMHhGRkZGRjNGRjsKKwkJfQorCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKKworCX0KKworCS8qIFI2NiBzaG91bGQgYmUgc2V0IGFjY29yZGluZyB0byBDaGFubmVsIGFuZCB1c2UgMjBNSHogd2hlbiBzY2FubmluZyAqLworCS8qUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsICgweDJFICsgR0VUX0xOQV9HQUlOKHBBZCkpKTsgKi8KKwlpZiAoYlNjYW4pCisJCVJUTVBTZXRBR0NJbml0VmFsdWUocEFkLCBCV18yMCk7CisJZWxzZQorCQlSVE1QU2V0QUdDSW5pdFZhbHVlKHBBZCwgcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXKTsKKworCS8qICovCisJLyogT24gMTFBLCBXZSBzaG91bGQgZGVsYXkgYW5kIHdhaXQgUkYvQkJQIHRvIGJlIHN0YWJsZSAqLworCS8qIGFuZCB0aGUgYXBwcm9wcmlhdGUgdGltZSBzaG91bGQgYmUgMTAwMCBtaWNybyBzZWNvbmRzICovCisJLyogMjAwNS8wNi8wNSAtIE9uIDExRywgV2UgYWxzbyBuZWVkIHRoaXMgZGVsYXkgdGltZS4gT3RoZXJ3aXNlIGl0J3MgZGlmZmljdWx0IHRvIHBhc3MgdGhlIFdIUUwuICovCisJLyogKi8KKwlSVE1QdXNlY0RlbGF5KDEwMDApOworfQorCit2b2lkIEFzaWNSZXNldEJCUEFnZW50KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlCQlBfQ1NSX0NGR19TVFJVQyBCYnBDc3I7CisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUmVzZXQgQkJQIEFnZW50IGJ1c3kgYml0IVxuIikpOworCS8qIFN0aWxsIG5lZWQgdG8gZmluZCB3aHkgQkJQIGFnZW50IGtlZXBzIGJ1c3ksIGJ1dCBpbiBmYWN0LCBoYXJkd2FyZSBzdGlsbCBmdW5jdGlvbiBvay4gTm93IGNsZWFyIGJ1c3kgZmlyc3QuICovCisJUlRNUF9JT19SRUFEMzIocEFkLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOworCUJicENzci5maWVsZC5CdXN5ID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fQkJQX0FHRU5ULCBCYnBDc3Iud29yZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgMjQyMSBvbmx5LCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGR1cmluZworCQlzaXRlIHN1cnZleS4gSXQncyBvbmx5IHJlcXVpcmVkIGFmdGVyIE5JQyBkZWNpZGVkIHRvIHN0YXkgYXQgYSBjaGFubmVsCisJCWZvciBhIGxvbmdlciBwZXJpb2QuCisJCVdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIGl0J3MgYWx3YXlzIGFmdGVyIEFzaWNTd2l0Y2hDaGFubmVsKCkuCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwordm9pZCBBc2ljTG9ja0NoYW5uZWwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBDaGFubmVsKQoreworfQorCit2b2lkIEFzaWNSZlR1bmluZ0V4ZWModm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkgICAgICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSAgICAgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKQoreworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUdpdmVzIENDSyBUWCByYXRlIDIgbW9yZSBkQiBUWCBwb3dlci4KKwkJVGhpcyByb3V0aW5lIHdvcmtzIG9ubHkgaW4gTElOSyBVUCBpbiBJTkZSQVNUUlVDVFVSRSBtb2RlLgorCisJCWNhbGN1bGF0ZSBkZXNpcmVkIFR4IHBvd2VyIGluIFJGIFIzLlR4MH41LAlzaG91bGQgY29uc2lkZXIgLQorCQkwLiBpZiBjdXJyZW50IHJhZGlvIGlzIGEgbm9pc3kgZW52aXJvbm1lbnQgKHBBZC0+RHJzQ291bnRlcnMuZk5vaXN5RW52aXJvbm1lbnQpCisJCTEuIFR4UG93ZXJQZXJjZW50YWdlCisJCTIuIGF1dG8gY2FsaWJyYXRpb24gYmFzZWQgb24gVFNTSSBmZWVkYmFjaworCQkzLiBleHRyYSAyIGRiIGZvciBDQ0sKKwkJNC4gLTEwIGRiIHVwb24gdmVyeS1zaG9ydCBkaXN0YW5jZSAoQXZnUlNTSSA+PSAtNDBkYikgdG8gQVAKKworCU5PVEU6IFNpbmNlIHRoaXMgcm91dGluZSByZXF1aXJlcyB0aGUgdmFsdWUgb2YgKHBBZC0+RHJzQ291bnRlcnMuZk5vaXN5RW52aXJvbm1lbnQpLAorCQlpdCBzaG91bGQgYmUgY2FsbGVkIEFGVEVSIE1sbWVEeW5hbWljVHhSYXRTd2l0Y2hpbmcoKQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3ZvaWQgQXNpY0FkanVzdFR4UG93ZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCWludCBpLCBqOworCWNoYXIgRGVsdGFQd3IgPSAwOworCUJPT0xFQU4gYkF1dG9UeEFnYyA9IEZBTFNFOworCXU4IFRzc2lSZWYsICpwVHNzaU1pbnVzQm91bmRhcnksICpwVHNzaVBsdXNCb3VuZGFyeSwgVHhBZ2NTdGVwOworCXU4IEJicFIxID0gMCwgQmJwUjQ5ID0gMCwgaWR4OworCWNoYXIgKnBUeEFnY0NvbXBlbnNhdGU7CisJdW5zaWduZWQgbG9uZyBUeFB3cls1XTsKKwljaGFyIFZhbHVlOworCWNoYXIgUnNzaSA9IC0xMjc7CisKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSB8fAorI2lmZGVmIFJUTVBfTUFDX1BDSQorCSAgICAocEFkLT5iUENJY2xrT2ZmID09IFRSVUUpIHx8CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisJICAgIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRikgfHwKKwkgICAgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwkJcmV0dXJuOworCisJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwKKwkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAsCisJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxLAorCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMik7CisKKwlpZiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKSB7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA+IDE0KSB7CisJCQlUeFB3clswXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzRdOworCQl9IGVsc2UgeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFs0XTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpIHsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbNF07CisJCX0gZWxzZSB7CisJCQlUeFB3clswXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzRdOworCQl9CisJfQorCisJLyogVFggcG93ZXIgY29tcGVuc2F0aW9uIGZvciB0ZW1wZXJhdHVyZSB2YXJpYXRpb24gYmFzZWQgb24gVFNTSS4gdHJ5IGV2ZXJ5IDQgc2Vjb25kICovCisJaWYgKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgNCA9PSAwKSB7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KSB7CisJCQkvKiBiZyBjaGFubmVsICovCisJCQliQXV0b1R4QWdjID0gcEFkLT5iQXV0b1R4QWdjRzsKKwkJCVRzc2lSZWYgPSBwQWQtPlRzc2lSZWZHOworCQkJcFRzc2lNaW51c0JvdW5kYXJ5ID0gJnBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzBdOworCQkJcFRzc2lQbHVzQm91bmRhcnkgPSAmcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1swXTsKKwkJCVR4QWdjU3RlcCA9IHBBZC0+VHhBZ2NTdGVwRzsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVHOworCQl9IGVsc2UgeworCQkJLyogYSBjaGFubmVsICovCisJCQliQXV0b1R4QWdjID0gcEFkLT5iQXV0b1R4QWdjQTsKKwkJCVRzc2lSZWYgPSBwQWQtPlRzc2lSZWZBOworCQkJcFRzc2lNaW51c0JvdW5kYXJ5ID0gJnBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzBdOworCQkJcFRzc2lQbHVzQm91bmRhcnkgPSAmcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVswXTsKKwkJCVR4QWdjU3RlcCA9IHBBZC0+VHhBZ2NTdGVwQTsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVBOworCQl9CisKKwkJaWYgKGJBdXRvVHhBZ2MpIHsKKwkJCS8qIEJicFIxIGlzIHVuc2lnbmVkIGNoYXIgKi8KKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNDksICZCYnBSNDkpOworCisJCQkvKiAocCkgVHNzaVBsdXNCb3VuZGFyeUdbMF0gPSAwID0gKG0pIFRzc2lNaW51c0JvdW5kYXJ5R1swXSAqLworCQkJLyogY29tcGVuc2F0ZTogKzQgICAgICszICAgKzIgICArMSAgICAwICAgLTEgICAtMiAgIC0zICAgLTQgKiBzdGVwcyAqLworCQkJLyogc3RlcCB2YWx1ZSBpcyBkZWZpbmVkIGluIHBBZC0+VHhBZ2NTdGVwRyBmb3IgdHggcG93ZXIgdmFsdWUgKi8KKworCQkJLyogWzRdKzErWzRdICAgcDQgICAgIHAzICAgcDIgICBwMSAgIG8xICAgbTEgICBtMiAgIG0zICAgbTQgKi8KKwkJCS8qIGV4OiAgICAgICAgIDB4MDAgMHgxNSAweDI1IDB4NDUgMHg4OCAweEEwIDB4QjUgMHhEMCAweEYwCisJCQkgICBhYm92ZSB2YWx1ZSBhcmUgZXhhbWluZWQgaW4gbWFzcyBmYWN0b3J5IHByb2R1Y3Rpb24gKi8KKwkJCS8qICAgICAgICAgICAgIFs0XSAgICBbM10gIFsyXSAgWzFdICBbMF0gIFsxXSAgWzJdICBbM10gIFs0XSAqLworCisJCQkvKiBwbHVzICgrKSBpcyAweDAwIH4gMHg0NSwgbWludXMgKC0pIGlzIDB4YTAgfiAweGYwICovCisJCQkvKiBpZiB2YWx1ZSBpcyBiZXR3ZWVuIHAxIH4gbzEgb3IgbzEgfiBzMSwgbm8gbmVlZCB0byBhZGp1c3QgdHggcG93ZXIgKi8KKwkJCS8qIGlmIHZhbHVlIGlzIDB4YTUsIHR4IHBvd2VyIHdpbGwgYmUgLT0gVHhBZ2NTdGVwKigyLTEpICovCisKKwkJCWlmIChCYnBSNDkgPiBwVHNzaU1pbnVzQm91bmRhcnlbMV0pIHsKKwkJCQkvKiBSZWFkaW5nIGlzIGxhcmdlciB0aGFuIHRoZSByZWZlcmVuY2UgdmFsdWUgKi8KKwkJCQkvKiBjaGVjayBmb3IgaG93IGxhcmdlIHdlIG5lZWQgdG8gZGVjcmVhc2UgdGhlIFR4IHBvd2VyICovCisJCQkJZm9yIChpZHggPSAxOyBpZHggPCA1OyBpZHgrKykgeworCQkJCQlpZiAoQmJwUjQ5IDw9IHBUc3NpTWludXNCb3VuZGFyeVtpZHhdKQkvKiBGb3VuZCB0aGUgcmFuZ2UgKi8KKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKiBUaGUgaW5kZXggaXMgdGhlIHN0ZXAgd2Ugc2hvdWxkIGRlY3JlYXNlLCBpZHggPSAwIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGVuc2F0ZSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUjMgPiAodW5zaWduZWQgbG9uZykoVHhBZ2NTdGVwICogKGlkeC0xKSkpICovCisJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSAtKFR4QWdjU3RlcCAqIChpZHggLSAxKSk7CisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFR4QWdjQ29tcGVuc2F0ZSA9IC0oKHU4KVIzKTsgKi8KKworCQkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIi0tIFR4IFBvd2VyLCBCQlAgUjE9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9IC0lZFxuIiwKKwkJCQkJICBCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgaWR4IC0gMSkpOworCQkJfSBlbHNlIGlmIChCYnBSNDkgPCBwVHNzaVBsdXNCb3VuZGFyeVsxXSkgeworCQkJCS8qIFJlYWRpbmcgaXMgc21hbGxlciB0aGFuIHRoZSByZWZlcmVuY2UgdmFsdWUgKi8KKwkJCQkvKiBjaGVjayBmb3IgaG93IGxhcmdlIHdlIG5lZWQgdG8gaW5jcmVhc2UgdGhlIFR4IHBvd2VyICovCisJCQkJZm9yIChpZHggPSAxOyBpZHggPCA1OyBpZHgrKykgeworCQkJCQlpZiAoQmJwUjQ5ID49IHBUc3NpUGx1c0JvdW5kYXJ5W2lkeF0pCS8qIEZvdW5kIHRoZSByYW5nZSAqLworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qIFRoZSBpbmRleCBpcyB0aGUgc3RlcCB3ZSBzaG91bGQgaW5jcmVhc2UsIGlkeCA9IDAgbWVhbnMgdGhlcmUgaXMgbm90aGluZyB0byBjb21wZW5zYXRlICovCisJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSBUeEFnY1N0ZXAgKiAoaWR4IC0gMSk7CisJCQkJRGVsdGFQd3IgKz0gKCpwVHhBZ2NDb21wZW5zYXRlKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiKysgVHggUG93ZXIsIEJCUCBSMT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gKyVkXG4iLAorCQkJCQkgIEJicFI0OSwgVHNzaVJlZiwgVHhBZ2NTdGVwLCBpZHggLSAxKSk7CisJCQl9IGVsc2UgeworCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gMDsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiICAgVHggUG93ZXIsIEJCUCBSNDk9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9ICslZFxuIiwKKwkJCQkJICBCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgMCkpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpIHsKKwkJCWJBdXRvVHhBZ2MgPSBwQWQtPmJBdXRvVHhBZ2NHOworCQkJcFR4QWdjQ29tcGVuc2F0ZSA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUc7CisJCX0gZWxzZSB7CisJCQliQXV0b1R4QWdjID0gcEFkLT5iQXV0b1R4QWdjQTsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVBOworCQl9CisKKwkJaWYgKGJBdXRvVHhBZ2MpCisJCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOworCX0KKworCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJicFIxKTsKKwlCYnBSMSAmPSAweEZDOworCisJLyogY2FsY3VsYXRlIGRlbHRhIHBvd2VyIGJhc2VkIG9uIHRoZSBwZXJjZW50YWdlIHNwZWNpZmllZCBmcm9tIFVJICovCisJLyogRTJQUk9NIHNldHRpbmcgaXMgY2FsaWJyYXRlZCBmb3IgbWF4aW11bSBUWCBwb3dlciAoaS5lLiAxMDAlKSAqLworCS8qIFdlIGxvd2VyIFRYIHBvd2VyIGhlcmUgYWNjb3JkaW5nIHRvIHRoZSBwZXJjZW50YWdlIHNwZWNpZmllZCBmcm9tIFVJICovCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID09IDB4ZmZmZmZmZmYpCS8qIEFVVE8gVFggUE9XRVIgY29udHJvbCAqLworCXsKKwkJeworCQkJLyogdG8gcGF0Y2ggaGlnaCBwb3dlciBpc3N1ZSB3aXRoIHNvbWUgQVBzLCBsaWtlIEJlbGtpbiBOMS4gKi8KKwkJCWlmIChSc3NpID4gLTM1KSB7CisJCQkJQmJwUjEgfD0gMHgwMjsJLyogRGVsdGFQd3IgLT0gMTI7ICovCisJCQl9IGVsc2UgaWYgKFJzc2kgPiAtNDApIHsKKwkJCQlCYnBSMSB8PSAweDAxOwkvKiBEZWx0YVB3ciAtPSA2OyAqLworCQkJfSBlbHNlOworCQl9CisJfSBlbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDkwKQkvKiA5MSB+IDEwMCUgJiBBVVRPLCB0cmVhdCBhcyAxMDAlIGluIHRlcm1zIG9mIG1XICovCisJCTsKKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDYwKQkvKiA2MSB+IDkwJSwgdHJlYXQgYXMgNzUlIGluIHRlcm1zIG9mIG1XICAgICAgICAgICAgICAgLy8gRGVsdGFQd3IgLT0gMTsgKi8KKwl7CisJCURlbHRhUHdyIC09IDE7CisJfSBlbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDMwKQkvKiAzMSB+IDYwJSwgdHJlYXQgYXMgNTAlIGluIHRlcm1zIG9mIG1XICAgICAgICAgICAgICAgLy8gRGVsdGFQd3IgLT0gMzsgKi8KKwl7CisJCURlbHRhUHdyIC09IDM7CisJfSBlbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDE1KQkvKiAxNiB+IDMwJSwgdHJlYXQgYXMgMjUlIGluIHRlcm1zIG9mIG1XICAgICAgICAgICAgICAgLy8gRGVsdGFQd3IgLT0gNjsgKi8KKwl7CisJCUJicFIxIHw9IDB4MDE7CisJfSBlbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDkpCS8qIDEwIH4gMTUlLCB0cmVhdCBhcyAxMi41JSBpbiB0ZXJtcyBvZiBtVyAgICAgICAgICAgICAvLyBEZWx0YVB3ciAtPSA5OyAqLworCXsKKwkJQmJwUjEgfD0gMHgwMTsKKwkJRGVsdGFQd3IgLT0gMzsKKwl9IGVsc2UJCQkvKiAwIH4gOSAlLCB0cmVhdCBhcyBNSU4ofjMlKSBpbiB0ZXJtcyBvZiBtVyAgICAgICAgICAgICAvLyBEZWx0YVB3ciAtPSAxMjsgKi8KKwl7CisJCUJicFIxIHw9IDB4MDI7CisJfQorCisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgQmJwUjEpOworCisJLyogcmVzZXQgZGlmZmVyZW50IG5ldyB0eCBwb3dlciBmb3IgZGlmZmVyZW50IFRYIHJhdGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCWlmIChUeFB3cltpXSAhPSAweGZmZmZmZmZmKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisJCQkJVmFsdWUgPSAoY2hhcikoKFR4UHdyW2ldID4+IGogKiA0KSAmIDB4MEYpOwkvKiAwIH4gMTUgKi8KKworCQkJCWlmICgoVmFsdWUgKyBEZWx0YVB3cikgPCAwKSB7CisJCQkJCVZhbHVlID0gMDsJLyogbWluICovCisJCQkJfSBlbHNlIGlmICgoVmFsdWUgKyBEZWx0YVB3cikgPiAweEYpIHsKKwkJCQkJVmFsdWUgPSAweEY7CS8qIG1heCAqLworCQkJCX0gZWxzZSB7CisJCQkJCVZhbHVlICs9IERlbHRhUHdyOwkvKiB0ZW1wZXJhdHVyZSBjb21wZW5zYXRpb24gKi8KKwkJCQl9CisKKwkJCQkvKiBmaWxsIG5ldyB2YWx1ZSB0byBDU1Igb2Zmc2V0ICovCisJCQkJVHhQd3JbaV0gPQorCQkJCSAgICAoVHhQd3JbaV0gJiB+KDB4MDAwMDAwMEYgPDwgaiAqIDQpKSB8IChWYWx1ZQorCQkJCQkJCQkJICAgPDwgagorCQkJCQkJCQkJICAgKiA0KTsKKwkJCX0KKworCQkJLyogd3JpdGUgdHggcG93ZXIgdmFsdWUgdG8gQ1NSICovCisJCQkvKiBUWF9QV1JfQ0ZHXzAgKDggdHggcmF0ZSkgZm9yIFRYIHBvd2VyIGZvciBPRkRNIDEyTS8xOE0KKwkJCSAgIFRYIHBvd2VyIGZvciBPRkRNIDZNLzlNCisJCQkgICBUWCBwb3dlciBmb3IgQ0NLNS41TS8xMU0KKwkJCSAgIFRYIHBvd2VyIGZvciBDQ0sxTS8yTSAqLworCQkJLyogVFhfUFdSX0NGR18xIH4gVFhfUFdSX0NGR180ICovCisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QV1JfQ0ZHXzAgKyBpICogNCwgVHhQd3JbaV0pOworCQl9CisJfQorCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJcHV0IFBIWSB0byBzbGVlcCBoZXJlLCBhbmQgc2V0IG5leHQgd2FrZXVwIHRpbWVyLiBQSFkgZG9lc24ndCBub3Qgd2FrZXVwCisJCWF1dG9tYXRpY2FsbHkuIEluc3RlYWQsIE1DVSB3aWxsIGlzc3VlIGEgVHdha2VVcEludGVycnVwdCB0byBob3N0IGFmdGVyCisJCXRoZSB3YWtldXAgdGltZXIgdGltZW91dC4gRHJpdmVyIGhhcyB0byBpc3N1ZSBhIHNlcGFyYXRlIGNvbW1hbmQgdG8gd2FrZQorCQlQSFkgdXAuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3ZvaWQgQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB1MTYgVGJ0dE51bVRvTmV4dFdha2VVcCkKK3sKKwlSVE1QX1NUQV9TTEVFUF9USEVOX0FVVE9fV0FLRVVQKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQXNpY0ZvcmNlV2FrZXVwKCkgaXMgdXNlZCB3aGVuZXZlciBtYW51YWwgd2FrZXVwIGlzIHJlcXVpcmVkCisJCUFzaWNGb3JjZVNsZWVwKCkgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIG5vdCBpbiBJTkZSQSBCU1MuIFdoZW4KKwkJaW4gSU5GUkEgQlNTLCB3ZSBzaG91bGQgdXNlIEFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKCkgaW5zdGVhZC4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCit2b2lkIEFzaWNGb3JjZVNsZWVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUFzaWNGb3JjZVdha2V1cCgpIGlzIHVzZWQgd2hlbmV2ZXIgVHdha2V1cCB0aW1lciAoc2V0IHZpYSBBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCkKKwkJZXhwaXJlZC4KKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwordm9pZCBBc2ljRm9yY2VXYWtldXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBCT09MRUFOIGJGcm9tVHgpCit7CisJREJHUFJJTlQoUlRfREVCVUdfSU5GTywgKCItLT4gQXNpY0ZvcmNlV2FrZXVwIFxuIikpOworCVJUTVBfU1RBX0ZPUkNFX1dBS0VVUChwQWQsIGJGcm9tVHgpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVNldCBNeSBCU1NJRAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCit2b2lkIEFzaWNTZXRCc3NpZChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4ICpwQnNzaWQpCit7CisJdW5zaWduZWQgbG9uZyBBZGRyNDsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiPT09PT09PT09PT09PT0+IEFzaWNTZXRCc3NpZCAleDoleDoleDoleDoleDoleFxuIiwgcEJzc2lkWzBdLAorCQkgIHBCc3NpZFsxXSwgcEJzc2lkWzJdLCBwQnNzaWRbM10sIHBCc3NpZFs0XSwgcEJzc2lkWzVdKSk7CisKKwlBZGRyNCA9ICh1bnNpZ25lZCBsb25nKShwQnNzaWRbMF0pIHwKKwkgICAgKHVuc2lnbmVkIGxvbmcpKHBCc3NpZFsxXSA8PCA4KSB8CisJICAgICh1bnNpZ25lZCBsb25nKShwQnNzaWRbMl0gPDwgMTYpIHwgKHVuc2lnbmVkIGxvbmcpKHBCc3NpZFszXSA8PCAyNCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0JTU0lEX0RXMCwgQWRkcjQpOworCisJQWRkcjQgPSAwOworCS8qIGFsd2F5cyBvbmUgQlNTSUQgaW4gU1RBIG1vZGUgKi8KKwlBZGRyNCA9ICh1bnNpZ25lZCBsb25nKShwQnNzaWRbNF0pIHwgKHVuc2lnbmVkIGxvbmcpKHBCc3NpZFs1XSA8PCA4KTsKKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19CU1NJRF9EVzEsIEFkZHI0KTsKK30KKwordm9pZCBBc2ljU2V0TWNhc3RXQyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbTUNBU1RfV0NJRF07CisJdTE2IG9mZnNldDsKKworCXBFbnRyeS0+U3N0ID0gU1NUX0FTU09DOworCXBFbnRyeS0+QWlkID0gTUNBU1RfV0NJRDsJLyogU29mdGFwIHN1cHBvcnRzIDEgQlNTSUQgYW5kIHVzZSBXQ0lEPTAgYXMgbXVsdGljYXN0IFdjaWQgaW5kZXggKi8KKwlwRW50cnktPlBzTW9kZSA9IFBXUl9BQ1RJVkU7CisJcEVudHJ5LT5DdXJyVHhSYXRlID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7CisJb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIEJTUzBNY2FzdF9XQ0lEICogSFdfV0NJRF9FTlRSWV9TSVpFOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3ZvaWQgQXNpY0RlbFdjaWRUYWIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBXY2lkKQoreworCXVuc2lnbmVkIGxvbmcgQWRkcjAgPSAweDAsIEFkZHIxID0gMHgwOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY0RlbFdjaWRUYWI9PT5XY2lkID0gMHgleFxuIiwgV2NpZCkpOworCW9mZnNldCA9IE1BQ19XQ0lEX0JBU0UgKyBXY2lkICogSFdfV0NJRF9FTlRSWV9TSVpFOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgQWRkcjApOworCW9mZnNldCArPSA0OworCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgQWRkcjEpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3ZvaWQgQXNpY0VuYWJsZVJERyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJVFhfTElOS19DRkdfU1RSVUMgVHhMaW5rQ2ZnOworCXUzMiBEYXRhID0gMDsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfTElOS19DRkcsICZUeExpbmtDZmcud29yZCk7CisJVHhMaW5rQ2ZnLmZpZWxkLlR4UkRHRW4gPSAxOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0xJTktfQ0ZHLCBUeExpbmtDZmcud29yZCk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOworCURhdGEgJj0gMHhGRkZGRkYwMDsKKwlEYXRhIHw9IDB4ODA7CisJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBEYXRhKTsKKworCS8qT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsgKi8KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCit2b2lkIEFzaWNEaXNhYmxlUkRHKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlUWF9MSU5LX0NGR19TVFJVQyBUeExpbmtDZmc7CisJdTMyIERhdGEgPSAwOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9MSU5LX0NGRywgJlR4TGlua0NmZy53b3JkKTsKKwlUeExpbmtDZmcuZmllbGQuVHhSREdFbiA9IDA7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTElOS19DRkcsIFR4TGlua0NmZy53b3JkKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmRGF0YSk7CisKKwlEYXRhICY9IDB4RkZGRkZGMDA7CisJLypEYXRhICB8PSAweDIwOyAqLworI2lmbmRlZiBXSUZJX1RFU1QKKwkvKmlmICggcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgKSAqLworCS8qICAgICAgRGF0YSB8PSAweDYwOyAvLyBmb3IgcGVyZm9ybWFuY2UgaXNzdWUgbm90IHNldCB0aGUgVFhPUCB0byAwICovCisjZW5kaWYKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0RZTkFNSUNfQkVfVFhPUF9BQ1RJVkUpCisJICAgICYmIChwQWQtPk1hY1RhYi5mQW55U3RhdGlvbk1JTU9QU0R5bmFtaWMgPT0gRkFMU0UpCisJICAgICkgeworCQkvKiBGb3IgQ1dDIHRlc3QsIGNoYW5nZSB0eG9wIGZyb20gMHgzMCB0byAweDIwIGluIFR4QnVyc3QgbW9kZSAqLworCQlpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpCisJCQlEYXRhIHw9IDB4MjA7CisJfQorCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCit2b2lkIEFzaWNEaXNhYmxlU3luYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT5EaXNhYmxlIFRTRiBzeW5jaHJvbml6YXRpb25cbiIpKTsKKworCS8qIDIwMDMtMTItMjAgZGlzYWJsZSBUU0YgYW5kIFRCVFQgd2hpbGUgTklDIGluIHBvd2VyLXNhdmluZyBoYXZlIHNpZGUgZWZmZWN0ICovCisJLyogICAgICAgICAgICAgICAgICAgICAgICB0aGF0IE5JQyB3aWxsIG5ldmVyIHdha2VzIHVwIGJlY2F1c2UgVFNGIHN0b3BzIGFuZCBubyBtb3JlICovCisJLyogICAgICAgICAgICAgICAgICAgICAgICBUQlRUIGludGVycnVwdHMgKi8KKwlwQWQtPlRidHRUaWNrQ291bnQgPSAwOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOworCWNzci5maWVsZC5iQmVhY29uR2VuID0gMDsKKwljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAwOworCWNzci5maWVsZC5Uc2ZTeW5jTW9kZSA9IDA7CisJY3NyLmZpZWxkLmJUc2ZUaWNraW5nID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3ZvaWQgQXNpY0VuYWJsZUJzc1N5bmMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0+QXNpY0VuYWJsZUJzc1N5bmMoSU5GUkEgbW9kZSlcbiIpKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOworLyogICAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIDB4MDAwMDAwMDApOyAqLworCXsKKwkJY3NyLmZpZWxkLkJlYWNvbkludGVydmFsID0gcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDQ7CS8qIEFTSUMgcmVnaXN0ZXIgaW4gdW5pdHMgb2YgMS8xNiBUVSAqLworCQljc3IuZmllbGQuYlRzZlRpY2tpbmcgPSAxOworCQljc3IuZmllbGQuVHNmU3luY01vZGUgPSAxOwkvKiBzeW5jIFRTRiBpbiBJTkZSQVNUUlVDVFVSRSBtb2RlICovCisJCWNzci5maWVsZC5iQmVhY29uR2VuID0gMDsJLyogZG8gTk9UIGdlbmVyYXRlIEJFQUNPTiAqLworCQljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAxOworCX0KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCU5vdGU6CisJCUJFQUNPTiBmcmFtZSBpbiBzaGFyZWQgbWVtb3J5IHNob3VsZCBiZSBidWlsdCBvayBiZWZvcmUgdGhpcyByb3V0aW5lCisJCWNhbiBiZSBjYWxsZWQuIE90aGVyd2lzZSwgYSBnYXJiYWdlIGZyYW1lIG1heWJlIHRyYW5zbWl0dGVkIG91dCBldmVyeQorCQlCZWFjb24gcGVyaW9kLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCit2b2lkIEFzaWNFbmFibGVJYnNzU3luYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjk7CisJdTggKnB0cjsKKwl1MzIgaTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCItLS0+QXNpY0VuYWJsZUlic3NTeW5jKEFESE9DIG1vZGUuIE1QRFV0b3RhbEJ5dGVDb3VudCA9ICVkKVxuIiwKKwkJICBwQWQtPkJlYWNvblR4V0kuTVBEVXRvdGFsQnl0ZUNvdW50KSk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEJDTl9USU1FX0NGRywgJmNzcjkud29yZCk7CisJY3NyOS5maWVsZC5iQmVhY29uR2VuID0gMDsKKwljc3I5LmZpZWxkLmJUQlRURW5hYmxlID0gMDsKKwljc3I5LmZpZWxkLmJUc2ZUaWNraW5nID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzcjkud29yZCk7CisKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkvKiBtb3ZlIEJFQUNPTiBUWEQgYW5kIGZyYW1lIGNvbnRlbnQgdG8gb24tY2hpcCBtZW1vcnkgKi8KKwlwdHIgPSAodTggKikmIHBBZC0+QmVhY29uVHhXSTsKKwlmb3IgKGkgPSAwOyBpIDwgVFhXSV9TSVpFOyBpICs9IDQpCS8qIDE2LWJ5dGUgVFhXSSBmaWVsZCAqLworCXsKKwkJdTMyIGxvbmdwdHIgPQorCQkgICAgKnB0ciArICgqKHB0ciArIDEpIDw8IDgpICsgKCoocHRyICsgMikgPDwgMTYpICsKKwkJICAgICgqKHB0ciArIDMpIDw8IDI0KTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgSFdfQkVBQ09OX0JBU0UwICsgaSwgbG9uZ3B0cik7CisJCXB0ciArPSA0OworCX0KKworCS8qIHN0YXJ0IHJpZ2h0IGFmdGVyIHRoZSAxNi1ieXRlIFRYV0kgZmllbGQgKi8KKwlwdHIgPSBwQWQtPkJlYWNvbkJ1ZjsKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5CZWFjb25UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudDsgaSArPSA0KSB7CisJCXUzMiBsb25ncHRyID0KKwkJICAgICpwdHIgKyAoKihwdHIgKyAxKSA8PCA4KSArICgqKHB0ciArIDIpIDw8IDE2KSArCisJCSAgICAoKihwdHIgKyAzKSA8PCAyNCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEhXX0JFQUNPTl9CQVNFMCArIFRYV0lfU0laRSArIGksIGxvbmdwdHIpOworCQlwdHIgKz0gNDsKKwl9CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJLyogbW92ZSBCRUFDT04gVFhEIGFuZCBmcmFtZSBjb250ZW50IHRvIG9uLWNoaXAgbWVtb3J5ICovCisJcHRyID0gKHU4ICopJiBwQWQtPkJlYWNvblR4V0k7CisJZm9yIChpID0gMDsgaSA8IFRYV0lfU0laRTsgaSArPSAyKQkvKiAxNi1ieXRlIFRYV0kgZmllbGQgKi8KKwl7CisJCS8qdTMyIGxvbmdwdHIgPSAgKnB0ciArICgqKHB0cisxKTw8OCkgKyAoKihwdHIrMik8PDE2KSArICgqKHB0ciszKTw8MjQpOyAqLworCQkvKlJUTVBfSU9fV1JJVEUzMihwQWQsIEhXX0JFQUNPTl9CQVNFMCArIGksIGxvbmdwdHIpOyAqLworCQlSVFVTQk11bHRpV3JpdGUocEFkLCBIV19CRUFDT05fQkFTRTAgKyBpLCBwdHIsIDIpOworCQlwdHIgKz0gMjsKKwl9CisKKwkvKiBzdGFydCByaWdodCBhZnRlciB0aGUgMTYtYnl0ZSBUWFdJIGZpZWxkICovCisJcHRyID0gcEFkLT5CZWFjb25CdWY7CisJZm9yIChpID0gMDsgaSA8IHBBZC0+QmVhY29uVHhXSS5NUERVdG90YWxCeXRlQ291bnQ7IGkgKz0gMikgeworCQkvKnUzMiBsb25ncHRyID0gICpwdHIgKyAoKihwdHIrMSk8PDgpICsgKCoocHRyKzIpPDwxNikgKyAoKihwdHIrMyk8PDI0KTsgKi8KKwkJLypSVE1QX0lPX1dSSVRFMzIocEFkLCBIV19CRUFDT05fQkFTRTAgKyBUWFdJX1NJWkUgKyBpLCBsb25ncHRyKTsgKi8KKwkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgSFdfQkVBQ09OX0JBU0UwICsgVFhXSV9TSVpFICsgaSwgcHRyLCAyKTsKKwkJcHRyICs9IDI7CisJfQorI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCisJLyogKi8KKwkvKiBGb3IgV2ktRmkgZmFpbHkgZ2VuZXJhdGVkIGJlYWNvbnMgYmV0d2VlbiBwYXJ0aWNpcGF0aW5nIHN0YXRpb25zLiAqLworCS8qIFNldCBUQlRUIHBoYXNlIGFkYXB0aXZlIGFkanVzdG1lbnQgc3RlcCB0byA4dXMgKGRlZmF1bHQgMTZ1cykgKi8KKwkvKiBkb24ndCBjaGFuZ2Ugc2V0dGluZ3MgMjAwNi01LSBieSBKZXJyeSAqLworCS8qUlRNUF9JT19XUklURTMyKHBBZCwgVEJUVF9TWU5DX0NGRywgMHgwMDAwMTAxMCk7ICovCisKKwkvKiBzdGFydCBzZW5kaW5nIEJFQUNPTiAqLworCWNzcjkuZmllbGQuQmVhY29uSW50ZXJ2YWwgPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgNDsJLyogQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVICovCisJY3NyOS5maWVsZC5iVHNmVGlja2luZyA9IDE7CisJY3NyOS5maWVsZC5Uc2ZTeW5jTW9kZSA9IDI7CS8qIHN5bmMgVFNGIGluIElCU1MgbW9kZSAqLworCWNzcjkuZmllbGQuYlRCVFRFbmFibGUgPSAxOworCWNzcjkuZmllbGQuYkJlYWNvbkdlbiA9IDE7CisJUlRNUF9JT19XUklURTMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCBjc3I5LndvcmQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwordm9pZCBBc2ljU2V0RWRjYVBhcm0oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfZWRjYV9wYXJtICpwRWRjYVBhcm0pCit7CisJRURDQV9BQ19DRkdfU1RSVUMgQWMwQ2ZnLCBBYzFDZmcsIEFjMkNmZywgQWMzQ2ZnOworCUFDX1RYT1BfQ1NSMF9TVFJVQyBjc3IwOworCUFDX1RYT1BfQ1NSMV9TVFJVQyBjc3IxOworCUFJRlNOX0NTUl9TVFJVQyBBaWZzbkNzcjsKKwlDV01JTl9DU1JfU1RSVUMgQ3dtaW5Dc3I7CisJQ1dNQVhfQ1NSX1NUUlVDIEN3bWF4Q3NyOworCWludCBpOworCisJQWMwQ2ZnLndvcmQgPSAwOworCUFjMUNmZy53b3JkID0gMDsKKwlBYzJDZmcud29yZCA9IDA7CisJQWMzQ2ZnLndvcmQgPSAwOworCWlmICgocEVkY2FQYXJtID09IE5VTEwpIHx8IChwRWRjYVBhcm0tPmJWYWxpZCA9PSBGQUxTRSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1NldEVkY2FQYXJtXG4iKSk7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpOworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykgeworCQkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSQorCQkJICAgIHx8IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0FwQ2xpKQorCQkJCUNMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRygmcEFkLT5NYWNUYWIuCisJCQkJCQkJIENvbnRlbnRbaV0sCisJCQkJCQkJIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKKwkJfQorCisJCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwkJLyogICAgICBNQUMgUmVnaXN0ZXIgaGFzIGEgY29weSAuICovCisJCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qI2lmbmRlZiBXSUZJX1RFU1QgKi8KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KSB7CisJCQkvKiBGb3IgQ1dDIHRlc3QsIGNoYW5nZSB0eG9wIGZyb20gMHgzMCB0byAweDIwIGluIFR4QnVyc3QgbW9kZSAqLworCQkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9IDB4MjA7CS8qIFN1Z2dlc3QgYnkgSm9obiBmb3IgVHhCdXJzdCBpbiBIVCBNb2RlICovCisJCX0gZWxzZQorCQkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9IDA7CS8qIFFJRF9BQ19CRSAqLworLyojZWxzZSAqLworLyogICAgICAgICAgICAgIEFjMENmZy5maWVsZC5BY1R4b3AgPSAwOyAgICAgICAgLy8gUUlEX0FDX0JFICovCisvKiNlbmRpZiAqLworCQlBYzBDZmcuZmllbGQuQ3dtaW4gPSBDV19NSU5fSU5fQklUUzsKKwkJQWMwQ2ZnLmZpZWxkLkN3bWF4ID0gQ1dfTUFYX0lOX0JJVFM7CisJCUFjMENmZy5maWVsZC5BaWZzbiA9IDI7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgQWMwQ2ZnLndvcmQpOworCisJCUFjMUNmZy5maWVsZC5BY1R4b3AgPSAwOwkvKiBRSURfQUNfQksgKi8KKwkJQWMxQ2ZnLmZpZWxkLkN3bWluID0gQ1dfTUlOX0lOX0JJVFM7CisJCUFjMUNmZy5maWVsZC5Dd21heCA9IENXX01BWF9JTl9CSVRTOworCQlBYzFDZmcuZmllbGQuQWlmc24gPSAyOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMV9DRkcsIEFjMUNmZy53b3JkKTsKKworCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKSB7CisJCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gMTkyOwkvKiBBQ19WSTogMTkyKjMydXMgfj0gNm1zICovCisJCQlBYzNDZmcuZmllbGQuQWNUeG9wID0gOTY7CS8qIEFDX1ZPOiA5NiozMnVzICB+PSAzbXMgKi8KKwkJfSBlbHNlIHsKKwkJCUFjMkNmZy5maWVsZC5BY1R4b3AgPSA5NjsJLyogQUNfVkk6IDk2KjMydXMgfj0gM21zICovCisJCQlBYzNDZmcuZmllbGQuQWNUeG9wID0gNDg7CS8qIEFDX1ZPOiA0OCozMnVzIH49IDEuNW1zICovCisJCX0KKwkJQWMyQ2ZnLmZpZWxkLkN3bWluID0gQ1dfTUlOX0lOX0JJVFM7CisJCUFjMkNmZy5maWVsZC5Dd21heCA9IENXX01BWF9JTl9CSVRTOworCQlBYzJDZmcuZmllbGQuQWlmc24gPSAyOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMl9DRkcsIEFjMkNmZy53b3JkKTsKKwkJQWMzQ2ZnLmZpZWxkLkN3bWluID0gQ1dfTUlOX0lOX0JJVFM7CisJCUFjM0NmZy5maWVsZC5Dd21heCA9IENXX01BWF9JTl9CSVRTOworCQlBYzNDZmcuZmllbGQuQWlmc24gPSAyOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDM19DRkcsIEFjM0NmZy53b3JkKTsKKworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisJCS8qICAgICAgRE1BIFJlZ2lzdGVyIGhhcyBhIGNvcHkgdG9vLiAqLworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisJCWNzcjAuZmllbGQuQWMwVHhvcCA9IDA7CS8qIFFJRF9BQ19CRSAqLworCQljc3IwLmZpZWxkLkFjMVR4b3AgPSAwOwkvKiBRSURfQUNfQksgKi8KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AwX0NGRywgY3NyMC53b3JkKTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikgeworCQkJY3NyMS5maWVsZC5BYzJUeG9wID0gMTkyOwkvKiBBQ19WSTogMTkyKjMydXMgfj0gNm1zICovCisJCQljc3IxLmZpZWxkLkFjM1R4b3AgPSA5NjsJLyogQUNfVk86IDk2KjMydXMgIH49IDNtcyAqLworCQl9IGVsc2UgeworCQkJY3NyMS5maWVsZC5BYzJUeG9wID0gOTY7CS8qIEFDX1ZJOiA5NiozMnVzIH49IDNtcyAqLworCQkJY3NyMS5maWVsZC5BYzNUeG9wID0gNDg7CS8qIEFDX1ZPOiA0OCozMnVzIH49IDEuNW1zICovCisJCX0KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AxX0NGRywgY3NyMS53b3JkKTsKKworCQlDd21pbkNzci53b3JkID0gMDsKKwkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4wID0gQ1dfTUlOX0lOX0JJVFM7CisJCUN3bWluQ3NyLmZpZWxkLkN3bWluMSA9IENXX01JTl9JTl9CSVRTOworCQlDd21pbkNzci5maWVsZC5Dd21pbjIgPSBDV19NSU5fSU5fQklUUzsKKwkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4zID0gQ1dfTUlOX0lOX0JJVFM7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9DV01JTl9DRkcsIEN3bWluQ3NyLndvcmQpOworCisJCUN3bWF4Q3NyLndvcmQgPSAwOworCQlDd21heENzci5maWVsZC5Dd21heDAgPSBDV19NQVhfSU5fQklUUzsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgxID0gQ1dfTUFYX0lOX0JJVFM7CisJCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MiA9IENXX01BWF9JTl9CSVRTOworCQlDd21heENzci5maWVsZC5Dd21heDMgPSBDV19NQVhfSU5fQklUUzsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0NXTUFYX0NGRywgQ3dtYXhDc3Iud29yZCk7CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0FJRlNOX0NGRywgMHgwMDAwMjIyMik7CisKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0sIHNpemVvZihzdHJ1Y3QgcnRfZWRjYV9wYXJtKSk7CisJfSBlbHNlIHsKKwkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpOworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisJCS8qICAgICAgTUFDIFJlZ2lzdGVyIGhhcyBhIGNvcHkuICovCisJCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwkJLyogKi8KKwkJLyogTW9kaWZ5IEN3bWluL0N3bWF4L1R4b3Agb24gcXVldWVbUUlEX0FDX1ZJXSwgUmVjb21tZW5kIGJ5IEplcnJ5IDIwMDUvMDcvMjcgKi8KKwkJLyogVG8gZGVncmFkZSBvdXIgVklETyBRdWV1ZSdzIHRocm91Z2hwdXQgZm9yIFdpRmkgV01NIFMzVDA3IElzc3VlLiAqLworCQkvKiAqLworCQkvKnBFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldID0gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV0gKiA3IC8gMTA7IC8vIHJ0Mjg2MGMgbmVlZCB0aGlzICovCisKKwkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQkVdOworCQlBYzBDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CRV07CisJCUFjMENmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JFXTsKKwkJQWMwQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdOwkvKisxOyAqLworCisJCUFjMUNmZy5maWVsZC5BY1R4b3AgPSBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JLXTsKKwkJQWMxQ2ZnLmZpZWxkLkN3bWluID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQktdOwkvKisyOyAqLworCQlBYzFDZmcuZmllbGQuQ3dtYXggPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CS107CisJCUFjMUNmZy5maWVsZC5BaWZzbiA9IHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JLXTsJLyorMTsgKi8KKworCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gKHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldICogNikgLyAxMDsKKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkgeworCQkJQWMyQ2ZnLmZpZWxkLkN3bWluID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVkldICsgMTsKKwkJCUFjMkNmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZJXSArIDE7CisJCX0gZWxzZSB7CisJCQlBYzJDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WSV07CisJCQlBYzJDZmcuZmllbGQuQ3dtYXggPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19WSV07CisJCX0KKwkJQWMyQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldICsgMTsKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwkJQWMyQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldICsgMzsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKworCQl7CisJCQkvKiBUdW5pbmcgZm9yIFdpLUZpIFdNTSBTMDYgKi8KKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3QgJiYKKwkJCSAgICBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV0gPT0gMTApCisJCQkJQWMyQ2ZnLmZpZWxkLkFpZnNuIC09IDE7CisKKwkJCS8qIFR1bmluZyBmb3IgVEduIFdpLUZpIDUuMi4zMiAqLworCQkJLyogU1RBIFRlc3RCZWQgY2hhbmdlcyBpbiB0aGlzIGl0ZW06IGNvbmV4YW50IGxlZ2FjeSBzdGEgPT0+IGJyb2FkY29tIDExbiBzdGEgKi8KKwkJCWlmIChTVEFfVEdOX1dJRklfT04ocEFkKSAmJgorCQkJICAgIHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9PSAxMCkgeworCQkJCUFjMENmZy5maWVsZC5BaWZzbiA9IDM7CisJCQkJQWMyQ2ZnLmZpZWxkLkFjVHhvcCA9IDU7CisJCQl9CisjaWZkZWYgUlQzMHh4CisJCQlpZiAocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjAKKwkJCSAgICB8fCBwQWQtPlJmSWNUeXBlID09IFJGSUNfMjAyMCkgeworCQkJCS8qIFR1bmluZyBmb3IgV2lGaSBXTU0gUzMtVDA3OiBjb25uZXhhbnQgbGVnYWN5IHN0YSA9PT4gYnJvYWRjb20gMTFuIHN0YS4gKi8KKwkJCQlBYzJDZmcuZmllbGQuQWlmc24gPSA1OworCQkJfQorI2VuZGlmIC8qIFJUMzB4eCAvLyAqLworCQl9CisKKwkJQWMzQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVk9dOworCQlBYzNDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WT107CisJCUFjM0NmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZPXTsKKwkJQWMzQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVk9dOworCisvKiNpZmRlZiBXSUZJX1RFU1QgKi8KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCkgeworCQkJaWYgKEFjM0NmZy5maWVsZC5BY1R4b3AgPT0gMTAyKSB7CisJCQkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9CisJCQkJICAgIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQkVdID8gcEVkY2FQYXJtLT4KKwkJCQkgICAgVHhvcFtRSURfQUNfQkVdIDogMTA7CisJCQkJQWMwQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdIC0gMTsJLyogQUlGU04gbXVzdCA+PSAxICovCisJCQkJQWMxQ2ZnLmZpZWxkLkFjVHhvcCA9CisJCQkJICAgIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQktdOworCQkJCUFjMUNmZy5maWVsZC5BaWZzbiA9CisJCQkJICAgIHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JLXTsKKwkJCQlBYzJDZmcuZmllbGQuQWNUeG9wID0KKwkJCQkgICAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV07CisJCQl9CS8qIEVuZCBvZiBpZiAqLworCQl9CisvKiNlbmRpZiAvLyBXSUZJX1RFU1QgLy8gKi8KKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIEFjMENmZy53b3JkKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzFfQ0ZHLCBBYzFDZmcud29yZCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMyX0NGRywgQWMyQ2ZnLndvcmQpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDM19DRkcsIEFjM0NmZy53b3JkKTsKKworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisJCS8qICAgICAgRE1BIFJlZ2lzdGVyIGhhcyBhIGNvcHkgdG9vLiAqLworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisJCWNzcjAuZmllbGQuQWMwVHhvcCA9IEFjMENmZy5maWVsZC5BY1R4b3A7CisJCWNzcjAuZmllbGQuQWMxVHhvcCA9IEFjMUNmZy5maWVsZC5BY1R4b3A7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9UWE9QMF9DRkcsIGNzcjAud29yZCk7CisKKwkJY3NyMS5maWVsZC5BYzJUeG9wID0gQWMyQ2ZnLmZpZWxkLkFjVHhvcDsKKwkJY3NyMS5maWVsZC5BYzNUeG9wID0gQWMzQ2ZnLmZpZWxkLkFjVHhvcDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AxX0NGRywgY3NyMS53b3JkKTsKKworCQlDd21pbkNzci53b3JkID0gMDsKKwkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4wID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQkVdOworCQlDd21pbkNzci5maWVsZC5Dd21pbjEgPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CS107CisJCUN3bWluQ3NyLmZpZWxkLkN3bWluMiA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX1ZJXTsKKwkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4zID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVk9dIC0gMTsJLypmb3IgVEduIHdpZmkgdGVzdCAqLworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNSU5fQ0ZHLCBDd21pbkNzci53b3JkKTsKKworCQlDd21heENzci53b3JkID0gMDsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgwID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQkVdOworCQlDd21heENzci5maWVsZC5Dd21heDEgPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CS107CisJCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MiA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZJXTsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgzID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVk9dOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNQVhfQ0ZHLCBDd21heENzci53b3JkKTsKKworCQlBaWZzbkNzci53b3JkID0gMDsKKwkJQWlmc25Dc3IuZmllbGQuQWlmc24wID0gQWMwQ2ZnLmZpZWxkLkFpZnNuOwkvKnBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JFXTsgKi8KKwkJQWlmc25Dc3IuZmllbGQuQWlmc24xID0gQWMxQ2ZnLmZpZWxkLkFpZnNuOwkvKnBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JLXTsgKi8KKwkJQWlmc25Dc3IuZmllbGQuQWlmc24yID0gQWMyQ2ZnLmZpZWxkLkFpZnNuOwkvKnBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXTsgKi8KKworCQl7CisJCQkvKiBUdW5pbmcgZm9yIFdpLUZpIFdNTSBTMDYgKi8KKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3QgJiYKKwkJCSAgICBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV0gPT0gMTApCisJCQkJQWlmc25Dc3IuZmllbGQuQWlmc24yID0gQWMyQ2ZnLmZpZWxkLkFpZnNuIC0gNDsKKworCQkJLyogVHVuaW5nIGZvciBUR24gV2ktRmkgNS4yLjMyICovCisJCQkvKiBTVEEgVGVzdEJlZCBjaGFuZ2VzIGluIHRoaXMgaXRlbTogY29ubmV4YW50IGxlZ2FjeSBzdGEgPT0+IGJyb2FkY29tIDExbiBzdGEgKi8KKwkJCWlmIChTVEFfVEdOX1dJRklfT04ocEFkKSAmJgorCQkJICAgIHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9PSAxMCkgeworCQkJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMCA9IDM7CisJCQkJQWlmc25Dc3IuZmllbGQuQWlmc24yID0gNzsKKwkJCX0KKworCQkJaWYgKElORlJBX09OKHBBZCkpCisJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuCisJCQkJCQkgICAgICAgQ29udGVudFtCU1NJRF9XQ0lEXSwKKwkJCQkJCSAgICAgICBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSk7CisJCX0KKworCQl7CisJCQlBaWZzbkNzci5maWVsZC5BaWZzbjMgPSBBYzNDZmcuZmllbGQuQWlmc24gLSAxOwkvKnBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZPXTsgLy9mb3IgVEduIHdpZmkgdGVzdCAqLworI2lmZGVmIFJUMzB4eAorCQkJLyogVE9ETzogU2hpYW5nLCB0aGlzIG1vZGlmaWNhdGlvbiBhbHNvIHN1aXRhYmxlIGZvciBSVDMwNTIvUlQzMDUwID8/PyAqLworCQkJaWYgKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIwCisJCQkgICAgfHwgcEFkLT5SZkljVHlwZSA9PSBSRklDXzIwMjApIHsKKwkJCQlBaWZzbkNzci5maWVsZC5BaWZzbjIgPSAweDI7CS8qcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldOyAvL2ZvciBXaUZpIFdNTSBTNC1UMDQuICovCisJCQl9CisjZW5kaWYgLyogUlQzMHh4IC8vICovCisJCX0KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0FJRlNOX0NGRywgQWlmc25Dc3Iud29yZCk7CisKKwkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0sIHBFZGNhUGFybSwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2VkY2FfcGFybSkpOworCQlpZiAoIUFESE9DX09OKHBBZCkpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkVEQ0EgWyMlZF06IEFJRlNOIENXbWluIENXbWF4ICBUWE9QKHVzKSAgQUNNXG4iLAorCQkJCSAgcEVkY2FQYXJtLT5FZGNhVXBkYXRlQ291bnQpKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIiAgICAgQUNfQkUgICAgICAlMmQgICAgICUyZCAgICAgJTJkICAgICAgJTRkICAgICAlZFxuIiwKKwkJCQkgIHBFZGNhUGFybS0+QWlmc25bMF0sIHBFZGNhUGFybS0+Q3dtaW5bMF0sCisJCQkJICBwRWRjYVBhcm0tPkN3bWF4WzBdLCBwRWRjYVBhcm0tPlR4b3BbMF0gPDwgNSwKKwkJCQkgIHBFZGNhUGFybS0+YkFDTVswXSkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiICAgICBBQ19CSyAgICAgICUyZCAgICAgJTJkICAgICAlMmQgICAgICAlNGQgICAgICVkXG4iLAorCQkJCSAgcEVkY2FQYXJtLT5BaWZzblsxXSwgcEVkY2FQYXJtLT5Dd21pblsxXSwKKwkJCQkgIHBFZGNhUGFybS0+Q3dtYXhbMV0sIHBFZGNhUGFybS0+VHhvcFsxXSA8PCA1LAorCQkJCSAgcEVkY2FQYXJtLT5iQUNNWzFdKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCIgICAgIEFDX1ZJICAgICAgJTJkICAgICAlMmQgICAgICUyZCAgICAgICU0ZCAgICAgJWRcbiIsCisJCQkJICBwRWRjYVBhcm0tPkFpZnNuWzJdLCBwRWRjYVBhcm0tPkN3bWluWzJdLAorCQkJCSAgcEVkY2FQYXJtLT5Dd21heFsyXSwgcEVkY2FQYXJtLT5UeG9wWzJdIDw8IDUsCisJCQkJICBwRWRjYVBhcm0tPmJBQ01bMl0pKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIiAgICAgQUNfVk8gICAgICAlMmQgICAgICUyZCAgICAgJTJkICAgICAgJTRkICAgICAlZFxuIiwKKwkJCQkgIHBFZGNhUGFybS0+QWlmc25bM10sIHBFZGNhUGFybS0+Q3dtaW5bM10sCisJCQkJICBwRWRjYVBhcm0tPkN3bWF4WzNdLCBwRWRjYVBhcm0tPlR4b3BbM10gPDwgNSwKKwkJCQkgIHBFZGNhUGFybS0+YkFDTVszXSkpOworCQl9CisJfQorCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCit2b2lkIEFzaWNTZXRTbG90VGltZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIEJPT0xFQU4gYlVzZVNob3J0U2xvdFRpbWUpCit7CisJdW5zaWduZWQgbG9uZyBTbG90VGltZTsKKwl1MzIgUmVnVmFsdWUgPSAwOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwkJYlVzZVNob3J0U2xvdFRpbWUgPSBUUlVFOworCisJaWYgKGJVc2VTaG9ydFNsb3RUaW1lCisJICAgICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfU0xPVF9JTlVTRUQpKQorCQlyZXR1cm47CisJZWxzZSBpZiAoKCFiVXNlU2hvcnRTbG90VGltZSkKKwkJICYmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCkpKQorCQlyZXR1cm47CisKKwlpZiAoYlVzZVNob3J0U2xvdFRpbWUpCisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCk7CisJZWxzZQorCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCk7CisKKwlTbG90VGltZSA9IChiVXNlU2hvcnRTbG90VGltZSkgPyA5IDogMjA7CisKKwl7CisJCS8qIGZvcmNlIHVzaW5nIHNob3J0IFNMT1QgdGltZSBmb3IgRkFFIHRvIGRlbW8gcGVyZm9ybWFuY2Ugd2hlbiBUeEJ1cnN0IGlzIE9OICovCisJCWlmICgoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKQorCQkgICAgICYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpKSkKKwkJICAgIHx8ICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gVFJVRSkKKwkJCSYmIChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID09CisJCQkgICAgQkFfTk9UVVNFKSkKKwkJICAgICkgeworCQkJLyogSW4gdGhpcyBjYXNlLCB3ZSB3aWxsIHRoaW5rIGl0IGlzIGRvaW5nIFdpLUZpIHRlc3QgKi8KKwkJCS8qIEFuZCB3ZSB3aWxsIG5vdCBzZXQgdG8gc2hvcnQgc2xvdCB3aGVuIGJFbmFibGVUeEJ1cnN0IGlzIFRSVUUuICovCisJCX0gZWxzZSBpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpIHsKKwkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCk7CisJCQlTbG90VGltZSA9IDk7CisJCX0KKwl9CisKKwkvKiAqLworCS8qIEZvciBzb21lIHJlYXNvbnMsIGFsd2F5cyBzZXQgaXQgdG8gc2hvcnQgc2xvdCB0aW1lLiAqLworCS8qICovCisJLyogVG9EbzogU2hvdWxkIGNvbnNpZGVyIGNhcGFiaWxpdHkgd2l0aCAxMUIgKi8KKwkvKiAqLworCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKSB7CisJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCk7CisJCQlTbG90VGltZSA9IDIwOworCQl9CisJfQorCisJUlRNUF9JT19SRUFEMzIocEFkLCBCS09GRl9TTE9UX0NGRywgJlJlZ1ZhbHVlKTsKKwlSZWdWYWx1ZSA9IFJlZ1ZhbHVlICYgMHhGRkZGRkYwMDsKKworCVJlZ1ZhbHVlIHw9IFNsb3RUaW1lOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgQktPRkZfU0xPVF9DRkcsIFJlZ1ZhbHVlKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQWRkIFNoYXJlZCBrZXkgaW5mb3JtYXRpb24gaW50byBBU0lDLgorCQlVcGRhdGUgc2hhcmVkIGtleSwgVHhNaWMgYW5kIFJ4TWljIHRvIEFzaWMgU2hhcmVkIGtleSB0YWJsZQorCQlVcGRhdGUgaXRzIGNpcGhlckFsZyB0byBBc2ljIFNoYXJlZCBrZXkgTW9kZS4KKworICAgIFJldHVybjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB1OCBCc3NJbmRleCwKKwkJCSAgIHU4IEtleUlkeCwKKwkJCSAgIHU4IENpcGhlckFsZywKKwkJCSAgIHU4ICpwS2V5LCB1OCAqcFR4TWljLCB1OCAqcFJ4TWljKQoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwkJLyosIGNzcjA7ICovCisJU0hBUkVES0VZX01PREVfU1RSVUMgY3NyMTsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwlpbnQgaTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJBc2ljQWRkU2hhcmVkS2V5RW50cnkgQnNzSW5kZXg9JWQsIEtleUlkeD0lZFxuIiwgQnNzSW5kZXgsCisJCSAgS2V5SWR4KSk7CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiQXNpY0FkZFNoYXJlZEtleUVudHJ5OiAlcyBrZXkgIyVkXG4iLCBDaXBoZXJOYW1lW0NpcGhlckFsZ10sCisJCSAgQnNzSW5kZXggKiA0ICsgS2V5SWR4KSk7CisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkgICAgICgiCQlLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkgICAgICBwS2V5WzBdLCBwS2V5WzFdLCBwS2V5WzJdLCBwS2V5WzNdLCBwS2V5WzRdLAorCQkgICAgICBwS2V5WzVdLCBwS2V5WzZdLCBwS2V5WzddLCBwS2V5WzhdLCBwS2V5WzldLAorCQkgICAgICBwS2V5WzEwXSwgcEtleVsxMV0sIHBLZXlbMTJdLCBwS2V5WzEzXSwgcEtleVsxNF0sCisJCSAgICAgIHBLZXlbMTVdKSk7CisJaWYgKHBSeE1pYykgeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkgICAgICgiCQlSeCBNSUMgS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJICAgICAgcFJ4TWljWzBdLCBwUnhNaWNbMV0sIHBSeE1pY1syXSwgcFJ4TWljWzNdLAorCQkJICAgICAgcFJ4TWljWzRdLCBwUnhNaWNbNV0sIHBSeE1pY1s2XSwgcFJ4TWljWzddKSk7CisJfQorCWlmIChwVHhNaWMpIHsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJICAgICAoIgkJVHggTUlDIEtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCSAgICAgIHBUeE1pY1swXSwgcFR4TWljWzFdLCBwVHhNaWNbMl0sIHBUeE1pY1szXSwKKwkJCSAgICAgIHBUeE1pY1s0XSwgcFR4TWljWzVdLCBwVHhNaWNbNl0sIHBUeE1pY1s3XSkpOworCX0KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwkvKiAqLworCS8qIGZpbGwga2V5IG1hdGVyaWFsIC0ga2V5ICsgVFggTUlDICsgUlggTUlDICovCisJLyogKi8KKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwlvZmZzZXQgPQorCSAgICBTSEFSRURfS0VZX1RBQkxFX0JBU0UgKyAoNCAqIEJzc0luZGV4ICsgS2V5SWR4KSAqIEhXX0tFWV9FTlRSWV9TSVpFOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX1NIQVJFX0tFWTsgaSsrKSB7CisJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcEtleVtpXSk7CisJfQorCisJb2Zmc2V0ICs9IE1BWF9MRU5fT0ZfU0hBUkVfS0VZOworCWlmIChwVHhNaWMpIHsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwVHhNaWNbaV0pOworCQl9CisJfQorCisJb2Zmc2V0ICs9IDg7CisJaWYgKHBSeE1pYykgeworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBSeE1pY1tpXSk7CisJCX0KKwl9CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJeworCQlvZmZzZXQgPQorCQkgICAgU0hBUkVEX0tFWV9UQUJMRV9CQVNFICsgKDQgKiBCc3NJbmRleCArCisJCQkJCSAgICAgS2V5SWR4KSAqIEhXX0tFWV9FTlRSWV9TSVpFOworCQlSVFVTQk11bHRpV3JpdGUocEFkLCBvZmZzZXQsIHBLZXksIE1BWF9MRU5fT0ZfU0hBUkVfS0VZKTsKKworCQlvZmZzZXQgKz0gTUFYX0xFTl9PRl9TSEFSRV9LRVk7CisJCWlmIChwVHhNaWMpIHsKKwkJCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgcFR4TWljLCA4KTsKKwkJfQorCisJCW9mZnNldCArPSA4OworCQlpZiAocFJ4TWljKSB7CisJCQlSVFVTQk11bHRpV3JpdGUocEFkLCBvZmZzZXQsIHBSeE1pYywgOCk7CisJCX0KKwl9CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisKKwkvKiAqLworCS8qIFVwZGF0ZSBjaXBoZXIgYWxnb3JpdGhtLiBXU1RBIGFsd2F5cyB1c2UgQlNTMCAqLworCS8qICovCisJUlRNUF9JT19SRUFEMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSArIDQgKiAoQnNzSW5kZXggLyAyKSwKKwkJICAgICAgICZjc3IxLndvcmQpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJSZWFkOiBTSEFSRURfS0VZX01PREVfQkFTRSBhdCB0aGlzIEJzc1slZF0gS2V5SWR4WyVkXT0gMHgleCBcbiIsCisJCSAgQnNzSW5kZXgsIEtleUlkeCwgY3NyMS53b3JkKSk7CisJaWYgKChCc3NJbmRleCAlIDIpID09IDApIHsKKwkJaWYgKEtleUlkeCA9PSAwKQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQllbHNlIGlmIChLZXlJZHggPT0gMikKKwkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCWVsc2UKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJfSBlbHNlIHsKKwkJaWYgKEtleUlkeCA9PSAwKQorCQkJY3NyMS5maWVsZC5Cc3MxS2V5MENpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCisJCQljc3IxLmZpZWxkLkJzczFLZXkxQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQllbHNlIGlmIChLZXlJZHggPT0gMikKKwkJCWNzcjEuZmllbGQuQnNzMUtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCWVsc2UKKwkJCWNzcjEuZmllbGQuQnNzMUtleTNDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJfQorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJXcml0ZTogU0hBUkVEX0tFWV9NT0RFX0JBU0UgYXQgdGhpcyBCc3NbJWRdID0gMHgleCBcbiIsCisJCSAgQnNzSW5kZXgsIGNzcjEud29yZCkpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFICsgNCAqIChCc3NJbmRleCAvIDIpLAorCQkJY3NyMS53b3JkKTsKKworfQorCisvKiAgICAgIElSUUwgPSBESVNQQVRDSF9MRVZFTCAqLwordm9pZCBBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgdTggQnNzSW5kZXgsIHU4IEtleUlkeCkKK3sKKwkvKnVuc2lnbmVkIGxvbmcgU2VjQ3NyMDsgKi8KKwlTSEFSRURLRVlfTU9ERV9TVFJVQyBjc3IxOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeTogIyVkIFxuIiwgQnNzSW5kZXggKiA0ICsgS2V5SWR4KSk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFICsgNCAqIChCc3NJbmRleCAvIDIpLAorCQkgICAgICAgJmNzcjEud29yZCk7CisJaWYgKChCc3NJbmRleCAlIDIpID09IDApIHsKKwkJaWYgKEtleUlkeCA9PSAwKQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IDA7CisJCWVsc2UgaWYgKEtleUlkeCA9PSAxKQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IDA7CisJCWVsc2UgaWYgKEtleUlkeCA9PSAyKQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IDA7CisJCWVsc2UKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSAwOworCX0gZWxzZSB7CisJCWlmIChLZXlJZHggPT0gMCkKKwkJCWNzcjEuZmllbGQuQnNzMUtleTBDaXBoZXJBbGcgPSAwOworCQllbHNlIGlmIChLZXlJZHggPT0gMSkKKwkJCWNzcjEuZmllbGQuQnNzMUtleTFDaXBoZXJBbGcgPSAwOworCQllbHNlIGlmIChLZXlJZHggPT0gMikKKwkJCWNzcjEuZmllbGQuQnNzMUtleTJDaXBoZXJBbGcgPSAwOworCQllbHNlCisJCQljc3IxLmZpZWxkLkJzczFLZXkzQ2lwaGVyQWxnID0gMDsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIldyaXRlOiBTSEFSRURfS0VZX01PREVfQkFTRSBhdCB0aGlzIEJzc1slZF0gPSAweCV4IFxuIiwKKwkJICBCc3NJbmRleCwgY3NyMS53b3JkKSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UgKyA0ICogKEJzc0luZGV4IC8gMiksCisJCQljc3IxLndvcmQpOworCUFTU0VSVChCc3NJbmRleCA8IDQpOworCUFTU0VSVChLZXlJZHggPCA0KTsKKworfQorCit2b2lkIEFzaWNVcGRhdGVXQ0lEQXR0cmlidXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgdTE2IFdDSUQsCisJCQkgICAgIHU4IEJzc0luZGV4LAorCQkJICAgICB1OCBDaXBoZXJBbGcsCisJCQkgICAgIElOIEJPT0xFQU4gYlVzZVBhaXJld2lzZUtleVRhYmxlKQoreworCXVuc2lnbmVkIGxvbmcgV0NJREF0dHJpID0gMCwgb2Zmc2V0OworCisJLyogKi8KKwkvKiBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUuICovCisJLyogT25seSBUeEtleSBjb3VsZCB1cGRhdGUgV0NJRCBhdHRyaWJ1dGUuICovCisJLyogKi8KKwlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChXQ0lEICogSFdfV0NJRF9BVFRSSV9TSVpFKTsKKwlXQ0lEQXR0cmkgPQorCSAgICAoQnNzSW5kZXggPDwgNCkgfCAoQ2lwaGVyQWxnIDw8IDEpIHwgKGJVc2VQYWlyZXdpc2VLZXlUYWJsZSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBXQ0lEQXR0cmkpOworfQorCit2b2lkIEFzaWNVcGRhdGVXQ0lESVZFSVYoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHUxNiBXQ0lELCB1bnNpZ25lZCBsb25nIHVJViwgdW5zaWduZWQgbG9uZyB1RUlWKQoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCisJb2Zmc2V0ID0gTUFDX0lWRUlWX1RBQkxFX0JBU0UgKyAoV0NJRCAqIEhXX0lWRUlWX0VOVFJZX1NJWkUpOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCB1SVYpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCArIDQsIHVFSVYpOworfQorCit2b2lkIEFzaWNVcGRhdGVSeFdDSURUYWJsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB1MTYgV0NJRCwgdTggKnBBZGRyKQoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgQWRkcjsKKworCW9mZnNldCA9IE1BQ19XQ0lEX0JBU0UgKyAoV0NJRCAqIEhXX1dDSURfRU5UUllfU0laRSk7CisJQWRkciA9IHBBZGRyWzBdICsgKHBBZGRyWzFdIDw8IDgpICsgKHBBZGRyWzJdIDw8IDE2KSArIChwQWRkclszXSA8PCAyNCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBBZGRyKTsKKwlBZGRyID0gcEFkZHJbNF0gKyAocEFkZHJbNV0gPDwgOCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0ICsgNCwgQWRkcik7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQ2lwaGVyIEtleSwgQ2lwaGVyIGFsZ29yaXRobSwgSVYvRUlWIHRvIEFzaWMKKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgICBXQ0lEICAgICAgICAgICAgICAgICAgICBXQ0lEIEVudHJ5IG51bWJlci4KKyAgICAgICAgQnNzSW5kZXggICAgICAgICAgICAgICAgQlNTSUQgaW5kZXgsIHN0YXRpb24gb3Igbm9uZSBtdWx0aXBsZSBCU1NJRCBzdXBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgdmFsdWUgc2hvdWxkIGJlIDAuCisgICAgICAgIEtleUlkeCAgICAgICAgICAgICAgICAgIFRoaXMgS2V5SWR4IHdpbGwgc2V0IHRvIElWJ3MgS2V5SUQgaWYgYlR4S2V5IGVuYWJsZWQKKyAgICAgICAgcENpcGhlcktleSAgICAgICAgICAgICAgUG9pbnRlciB0byBDaXBoZXIgS2V5LgorICAgICAgICBiVXNlUGFpcmV3aXNlS2V5VGFibGUgICBUUlVFIG1lYW5zIHNhdmVkIHRoZSBrZXkgaW4gU2hhcmVkS2V5IHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgUGFpcmV3aXNlS2V5IHRhYmxlCisgICAgICAgIGJUeEtleSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHRyYW5zbWl0IGtleSBpZiBlbmFibGVkLgorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICBOb3RlOgorICAgICAgICBUaGlzIHJvdXRpbmUgd2lsbCBzZXQgdGhlIHJlbGF0aXZlIGtleSBzdHVmZiB0byBBc2ljIGluY2x1ZGluZyBXQ0lEIGF0dHJpYnV0ZSwKKyAgICAgICAgQ2lwaGVyIEtleSwgQ2lwaGVyIGFsZ29yaXRobSBhbmQgSVYvRUlWLgorCisgICAgICAgIElWL0VJViB3aWxsIGJlIHVwZGF0ZSBpZiB0aGlzIENpcGhlcktleSBpcyB0aGUgdHJhbnNtaXNzaW9uIGtleSBiZWNhdXNlCisgICAgICAgIEFTSUMgd2lsbCBiYXNlIG9uIElWJ3MgS2V5SUQgdmFsdWUgdG8gc2VsZWN0IENpcGhlciBLZXkuCisKKyAgICAgICAgSWYgYlR4S2V5IHNldHMgdG8gRkFMU0UsIHRoaXMgaXMgbm90IHRoZSBUWCBrZXksIGJ1dCBpdCBjb3VsZCBiZQorICAgICAgICBSWCBrZXkKKworCUZvciBBUCBtb2RlIGJUeEtleSBtdXN0IGJlIGFsd2F5cyBzZXQgdG8gVFJVRS4KKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIEFzaWNBZGRLZXlFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgdTE2IFdDSUQsCisJCSAgICAgdTggQnNzSW5kZXgsCisJCSAgICAgdTggS2V5SWR4LAorCQkgICAgIHN0cnVjdCBydF9jaXBoZXJfa2V5ICpwQ2lwaGVyS2V5LAorCQkgICAgIElOIEJPT0xFQU4gYlVzZVBhaXJld2lzZUtleVRhYmxlLCBJTiBCT09MRUFOIGJUeEtleSkKK3sKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKy8qICAgICAgdW5zaWduZWQgbG9uZyAgIFdDSURBdHRyaSA9IDA7ICovCisJdTggSVY0ID0gMDsKKwl1OCAqcEtleSA9IHBDaXBoZXJLZXktPktleTsKKy8qICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgS2V5TGVuID0gcENpcGhlcktleS0+S2V5TGVuOyAqLworCXU4ICpwVHhNaWMgPSBwQ2lwaGVyS2V5LT5UeE1pYzsKKwl1OCAqcFJ4TWljID0gcENpcGhlcktleS0+UnhNaWM7CisJdTggKnBUeHRzYyA9IHBDaXBoZXJLZXktPlR4VHNjOworCXU4IENpcGhlckFsZyA9IHBDaXBoZXJLZXktPkNpcGhlckFsZzsKKwlTSEFSRURLRVlfTU9ERV9TVFJVQyBjc3IxOworI2lmZGVmIFJUTVBfTUFDX1BDSQorCXU4IGk7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisKKy8qICAgICAgQVNTRVJUKEtleUxlbiA8PSBNQVhfTEVOX09GX1BFRVJfS0VZKTsgKi8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBBc2ljQWRkS2V5RW50cnlcbiIpKTsKKwkvKiAqLworCS8qIDEuKSBkZWNpZGUga2V5IHRhYmxlIG9mZnNldCAqLworCS8qICovCisJaWYgKGJVc2VQYWlyZXdpc2VLZXlUYWJsZSkKKwkJb2Zmc2V0ID0gUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UgKyAoV0NJRCAqIEhXX0tFWV9FTlRSWV9TSVpFKTsKKwllbHNlCisJCW9mZnNldCA9CisJCSAgICBTSEFSRURfS0VZX1RBQkxFX0JBU0UgKyAoNCAqIEJzc0luZGV4ICsKKwkJCQkJICAgICBLZXlJZHgpICogSFdfS0VZX0VOVFJZX1NJWkU7CisKKwkvKiAqLworCS8qIDIuKSBTZXQgS2V5IHRvIEFzaWMgKi8KKwkvKiAqLworCS8qZm9yIChpID0gMDsgaSA8IEtleUxlbjsgaSsrKSAqLworI2lmZGVmIFJUTVBfTUFDX1BDSQorCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX1BFRVJfS0VZOyBpKyspIHsKKwkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwS2V5W2ldKTsKKwl9CisJb2Zmc2V0ICs9IE1BWF9MRU5fT0ZfUEVFUl9LRVk7CisKKwkvKiAqLworCS8qIDMuKSBTZXQgTUlDIGtleSBpZiBhdmFpbGFibGUgKi8KKwkvKiAqLworCWlmIChwVHhNaWMpIHsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwVHhNaWNbaV0pOworCQl9CisJfQorCW9mZnNldCArPSBMRU5fVEtJUF9UWE1JQ0s7CisKKwlpZiAocFJ4TWljKSB7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcFJ4TWljW2ldKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKyNpZmRlZiBSVE1QX01BQ19VU0IKKwlSVFVTQk11bHRpV3JpdGUocEFkLCBvZmZzZXQsIHBLZXksIE1BWF9MRU5fT0ZfUEVFUl9LRVkpOworCW9mZnNldCArPSBNQVhfTEVOX09GX1BFRVJfS0VZOworCisJLyogKi8KKwkvKiAzLikgU2V0IE1JQyBrZXkgaWYgYXZhaWxhYmxlICovCisJLyogKi8KKwlpZiAocFR4TWljKSB7CisJCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgcFR4TWljLCA4KTsKKwl9CisJb2Zmc2V0ICs9IExFTl9US0lQX1RYTUlDSzsKKworCWlmIChwUnhNaWMpIHsKKwkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgb2Zmc2V0LCBwUnhNaWMsIDgpOworCX0KKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKworCS8qICovCisJLyogNC4pIE1vZGlmeSBJVi9FSVYgaWYgbmVlZHMgKi8KKwkvKiAgICAgVGhpcyB3aWxsIGZvcmNlIEFzaWMgdG8gdXNlIHRoaXMga2V5IElEIGJ5IHNldHRpbmcgSVYuICovCisJLyogKi8KKwlpZiAoYlR4S2V5KSB7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJCW9mZnNldCA9IE1BQ19JVkVJVl9UQUJMRV9CQVNFICsgKFdDSUQgKiBIV19JVkVJVl9FTlRSWV9TSVpFKTsKKwkJLyogKi8KKwkJLyogV3JpdGUgSVYgKi8KKwkJLyogKi8KKwkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQsIHBUeHRzY1sxXSk7CisJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgMSwgKChwVHh0c2NbMV0gfCAweDIwKSAmIDB4N2YpKTsKKwkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyAyLCBwVHh0c2NbMF0pOworCisJCUlWNCA9IChLZXlJZHggPDwgNik7CisJCWlmICgoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQKQorCQkgICAgfHwgKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpCisJCSAgICB8fCAoQ2lwaGVyQWxnID09IENJUEhFUl9BRVMpKQorCQkJSVY0IHw9IDB4MjA7CS8qIHR1cm4gb24gZXh0ZW5zaW9uIGJpdCBtZWFucyBFSVYgZXhpc3RlbmNlICovCisKKwkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyAzLCBJVjQpOworCisJCS8qICovCisJCS8qIFdyaXRlIEVJViAqLworCQkvKiAqLworCQlvZmZzZXQgKz0gNDsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwVHh0c2NbaSArIDJdKTsKKwkJfQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgorCQl1MzIgdG1wVmFsOworCisJCS8qICovCisJCS8qIFdyaXRlIElWICovCisJCS8qICovCisJCUlWNCA9IChLZXlJZHggPDwgNik7CisJCWlmICgoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQKQorCQkgICAgfHwgKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpCisJCSAgICB8fCAoQ2lwaGVyQWxnID09IENJUEhFUl9BRVMpKQorCQkJSVY0IHw9IDB4MjA7CS8qIHR1cm4gb24gZXh0ZW5zaW9uIGJpdCBtZWFucyBFSVYgZXhpc3RlbmNlICovCisKKwkJdG1wVmFsID0KKwkJICAgIHBUeHRzY1sxXSArICgoKHBUeHRzY1sxXSB8IDB4MjApICYgMHg3ZikgPDwgOCkgKworCQkgICAgKHBUeHRzY1swXSA8PCAxNikgKyAoSVY0IDw8IDI0KTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCB0bXBWYWwpOworCisJCS8qICovCisJCS8qIFdyaXRlIEVJViAqLworCQkvKiAqLworCQlvZmZzZXQgKz0gNDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCAqKHUzMiAqKSYgcENpcGhlcktleS0+VHhUc2NbMl0pOworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCisJCUFzaWNVcGRhdGVXQ0lEQXR0cmlidXRlKHBBZCwgV0NJRCwgQnNzSW5kZXgsIENpcGhlckFsZywKKwkJCQkJYlVzZVBhaXJld2lzZUtleVRhYmxlKTsKKwl9CisKKwlpZiAoIWJVc2VQYWlyZXdpc2VLZXlUYWJsZSkgeworCQkvKiAqLworCQkvKiBPbmx5IHVwZGF0ZSB0aGUgc2hhcmVkIGtleSBzZWN1cml0eSBtb2RlICovCisJCS8qICovCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UgKyA0ICogKEJzc0luZGV4IC8gMiksCisJCQkgICAgICAgJmNzcjEud29yZCk7CisJCWlmICgoQnNzSW5kZXggJSAyKSA9PSAwKSB7CisJCQlpZiAoS2V5SWR4ID09IDApCisJCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCWVsc2UgaWYgKEtleUlkeCA9PSAxKQorCQkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQllbHNlIGlmIChLZXlJZHggPT0gMikKKwkJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJZWxzZQorCQkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCX0gZWxzZSB7CisJCQlpZiAoS2V5SWR4ID09IDApCisJCQkJY3NyMS5maWVsZC5Cc3MxS2V5MENpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCWVsc2UgaWYgKEtleUlkeCA9PSAxKQorCQkJCWNzcjEuZmllbGQuQnNzMUtleTFDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQllbHNlIGlmIChLZXlJZHggPT0gMikKKwkJCQljc3IxLmZpZWxkLkJzczFLZXkyQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJZWxzZQorCQkJCWNzcjEuZmllbGQuQnNzMUtleTNDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCX0KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UgKyA0ICogKEJzc0luZGV4IC8gMiksCisJCQkJY3NyMS53b3JkKTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gQXNpY0FkZEtleUVudHJ5XG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUFkZCBQYWlyLXdpc2Uga2V5IG1hdGVyaWFsIGludG8gQVNJQy4KKwkJVXBkYXRlIHBhaXJ3aXNlIGtleSwgVHhNaWMgYW5kIFJ4TWljIHRvIEFzaWMgUGFpci13aXNlIGtleSB0YWJsZQorCisgICAgUmV0dXJuOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB1OCAqcEFkZHIsCisJCQkgICAgIHU4IFdDSUQsIHN0cnVjdCBydF9jaXBoZXJfa2V5ICpwQ2lwaGVyS2V5KQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXU4ICpwS2V5ID0gcENpcGhlcktleS0+S2V5OworCXU4ICpwVHhNaWMgPSBwQ2lwaGVyS2V5LT5UeE1pYzsKKwl1OCAqcFJ4TWljID0gcENpcGhlcktleS0+UnhNaWM7CisjaWZkZWYgREJHCisJdTggQ2lwaGVyQWxnID0gcENpcGhlcktleS0+Q2lwaGVyQWxnOworI2VuZGlmIC8qIERCRyAvLyAqLworCisJLyogRUtFWSAqLworCW9mZnNldCA9IFBBSVJXSVNFX0tFWV9UQUJMRV9CQVNFICsgKFdDSUQgKiBIV19LRVlfRU5UUllfU0laRSk7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfUEVFUl9LRVk7IGkrKykgeworCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBLZXlbaV0pOworCX0KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKyNpZmRlZiBSVE1QX01BQ19VU0IKKwlSVFVTQk11bHRpV3JpdGUocEFkLCBvZmZzZXQsICZwQ2lwaGVyS2V5LT5LZXlbMF0sIE1BWF9MRU5fT0ZfUEVFUl9LRVkpOworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX1BFRVJfS0VZOyBpICs9IDQpIHsKKwkJdTMyIFZhbHVlOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIG9mZnNldCArIGksICZWYWx1ZSk7CisJfQorCisJb2Zmc2V0ICs9IE1BWF9MRU5fT0ZfUEVFUl9LRVk7CisKKwkvKiAgTUlDIEtFWSAqLworCWlmIChwVHhNaWMpIHsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwVHhNaWNbaV0pOworCQl9CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgJnBDaXBoZXJLZXktPlR4TWljWzBdLCA4KTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKwl9CisJb2Zmc2V0ICs9IDg7CisJaWYgKHBSeE1pYykgeworI2lmZGVmIFJUTVBfTUFDX1BDSQorCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBSeE1pY1tpXSk7CisJCX0KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKyNpZmRlZiBSVE1QX01BQ19VU0IKKwkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgb2Zmc2V0LCAmcENpcGhlcktleS0+UnhNaWNbMF0sIDgpOworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJBc2ljQWRkUGFpcndpc2VLZXlFbnRyeTogV0NJRCAjJWQgQWxnPSVzXG4iLCBXQ0lELAorCQkgIENpcGhlck5hbWVbQ2lwaGVyQWxnXSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCIJS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJICBwS2V5WzBdLCBwS2V5WzFdLCBwS2V5WzJdLCBwS2V5WzNdLCBwS2V5WzRdLCBwS2V5WzVdLAorCQkgIHBLZXlbNl0sIHBLZXlbN10sIHBLZXlbOF0sIHBLZXlbOV0sIHBLZXlbMTBdLCBwS2V5WzExXSwKKwkJICBwS2V5WzEyXSwgcEtleVsxM10sIHBLZXlbMTRdLCBwS2V5WzE1XSkpOworCWlmIChwUnhNaWMpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCIJUnggTUlDIEtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCSAgcFJ4TWljWzBdLCBwUnhNaWNbMV0sIHBSeE1pY1syXSwgcFJ4TWljWzNdLAorCQkJICBwUnhNaWNbNF0sIHBSeE1pY1s1XSwgcFJ4TWljWzZdLCBwUnhNaWNbN10pKTsKKwl9CisJaWYgKHBUeE1pYykgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIglUeCBNSUMgS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJICBwVHhNaWNbMF0sIHBUeE1pY1sxXSwgcFR4TWljWzJdLCBwVHhNaWNbM10sCisJCQkgIHBUeE1pY1s0XSwgcFR4TWljWzVdLCBwVHhNaWNbNl0sIHBUeE1pY1s3XSkpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUmVtb3ZlIFBhaXItd2lzZSBrZXkgbWF0ZXJpYWwgZnJvbSBBU0lDLgorCisgICAgUmV0dXJuOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCXU4IEJzc0lkeCwgdTggV2NpZCkKK3sKKwl1bnNpZ25lZCBsb25nIFdDSURBdHRyaTsKKwl1MTYgb2Zmc2V0OworCisJLyogcmUtc2V0IHRoZSBlbnRyeSdzIFdDSUQgYXR0cmlidXRlIGFzIE9QRU4tTk9ORS4gKi8KKwlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChXY2lkICogSFdfV0NJRF9BVFRSSV9TSVpFKTsKKwlXQ0lEQXR0cmkgPSAoQnNzSWR4IDw8IDQpIHwgUEFJUldJU0VLRVlUQUJMRTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIFdDSURBdHRyaSk7Cit9CisKK0JPT0xFQU4gQXNpY1NlbmRDb21tYW5kVG9NY3Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB1OCBDb21tYW5kLAorCQkJICAgICB1OCBUb2tlbiwgdTggQXJnMCwgdTggQXJnMSkKK3sKKworCWlmIChwQWQtPmNoaXBPcHMuc2VuZENvbW1hbmRUb01jdSkKKwkJcEFkLT5jaGlwT3BzLnNlbmRDb21tYW5kVG9NY3UocEFkLCBDb21tYW5kLCBUb2tlbiwgQXJnMCwgQXJnMSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKwordm9pZCBBc2ljU2V0UnhBbnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBBbnQpCit7CisjaWZkZWYgUlQzMHh4CisJLyogUlQzNTcyIEFURSBuZWVkIG5vdCB0byBkbyB0aGlzLiAqLworCVJUMzB4eFNldFJ4QW50KHBBZCwgQW50KTsKKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KK30KKwordm9pZCBBc2ljVHVybk9mZlJGQ2xrKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggQ2hhbm5lbCkKK3sKKwlpZiAocEFkLT5jaGlwT3BzLkFzaWNSZlR1cm5PZmYpIHsKKwkJcEFkLT5jaGlwT3BzLkFzaWNSZlR1cm5PZmYocEFkKTsKKwl9IGVsc2UgeworCQkvKiBSRiBSMiBiaXQgMTggPSAwICovCisJCXUzMiBSMSA9IDAsIFIyID0gMCwgUjMgPSAwOworCQl1OCBpbmRleDsKKwkJc3RydWN0IHJ0X3J0bXBfcmZfcmVncyAqUkZSZWdUYWJsZTsKKworCQlSRlJlZ1RhYmxlID0gUkYyODUwUmVnVGFibGU7CisKKwkJc3dpdGNoIChwQWQtPlJmSWNUeXBlKSB7CisJCWNhc2UgUkZJQ18yODIwOgorCQljYXNlIFJGSUNfMjg1MDoKKwkJY2FzZSBSRklDXzI3MjA6CisJCWNhc2UgUkZJQ18yNzUwOgorCisJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMjg1MF9DSE5MOyBpbmRleCsrKSB7CisJCQkJaWYgKENoYW5uZWwgPT0gUkZSZWdUYWJsZVtpbmRleF0uQ2hhbm5lbCkgeworCQkJCQlSMSA9IFJGUmVnVGFibGVbaW5kZXhdLlIxICYgMHhmZmZmZGZmZjsKKwkJCQkJUjIgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMiAmIDB4ZmZmYmZmZmY7CisJCQkJCVIzID0gUkZSZWdUYWJsZVtpbmRleF0uUjMgJiAweGZmZjNmZmZmOworCisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIxKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjIpOworCisJCQkJCS8qIFByb2dyYW0gUjFiMTMgdG8gMSwgUjMvYjE4LDE5IHRvIDAsIFIyYjE4IHRvIDAuICovCisJCQkJCS8qIFNldCBSRiBSMiBiaXQxOD0wLCBSMyBiaXRbMTg6MTldPTAgKi8KKwkJCQkJLyppZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKSAqLworCQkJCQlpZiAoMSkgeworCQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjMpOworCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCQkgKCJBc2ljVHVybk9mZlJGQ2xrIyVkKFJGPSVkLCApICwgUjI9MHglMDh4LCAgUjMgPSAweCUwOHggXG4iLAorCQkJCQkJCSAgQ2hhbm5lbCwKKwkJCQkJCQkgIHBBZC0+UmZJY1R5cGUsIFIyLAorCQkJCQkJCSAgUjMpKTsKKwkJCQkJfSBlbHNlCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCQkgKCJBc2ljVHVybk9mZlJGQ2xrIyVkKFJGPSVkLCApICwgUjI9MHglMDh4IFxuIiwKKwkJCQkJCQkgIENoYW5uZWwsCisJCQkJCQkJICBwQWQtPlJmSWNUeXBlLCBSMikpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3ZvaWQgQXNpY1R1cm5PblJGQ2xrKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggQ2hhbm5lbCkKK3sKKwkvKiBSRiBSMiBiaXQgMTggPSAwICovCisJdTMyIFIxID0gMCwgUjIgPSAwLCBSMyA9IDA7CisJdTggaW5kZXg7CisJc3RydWN0IHJ0X3J0bXBfcmZfcmVncyAqUkZSZWdUYWJsZTsKKworI2lmZGVmIFBDSUVfUFNfU1VQUE9SVAorCS8qIFRoZSBSRiBwcm9ncmFtbWluZyBzZXF1ZW5jZSBpcyBkaWZmZXJlbmNlIGJldHdlZW4gM3h4eCBhbmQgMnh4eCAqLworCWlmICgoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpKSB7CisJCXJldHVybjsKKwl9CisjZW5kaWYgLyogUENJRV9QU19TVVBQT1JUIC8vICovCisKKwlSRlJlZ1RhYmxlID0gUkYyODUwUmVnVGFibGU7CisKKwlzd2l0Y2ggKHBBZC0+UmZJY1R5cGUpIHsKKwljYXNlIFJGSUNfMjgyMDoKKwljYXNlIFJGSUNfMjg1MDoKKwljYXNlIFJGSUNfMjcyMDoKKwljYXNlIFJGSUNfMjc1MDoKKworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMjg1MF9DSE5MOyBpbmRleCsrKSB7CisJCQlpZiAoQ2hhbm5lbCA9PSBSRlJlZ1RhYmxlW2luZGV4XS5DaGFubmVsKSB7CisJCQkJUjMgPSBwQWQtPkxhdGNoUmZSZWdzLlIzOworCQkJCVIzICY9IDB4ZmZmM2ZmZmY7CisJCQkJUjMgfD0gMHgwMDA4MDAwMDsKKwkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMyk7CisKKwkJCQlSMSA9IFJGUmVnVGFibGVbaW5kZXhdLlIxOworCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIxKTsKKworCQkJCVIyID0gUkZSZWdUYWJsZVtpbmRleF0uUjI7CisJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkgeworCQkJCQlSMiB8PSAweDQwMDA7CS8qIElmIFRYcGF0aCBpcyAxLCBiaXQgMTQgPSAxOyAqLworCQkJCX0KKworCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpIHsKKwkJCQkJUjIgfD0gMHg0MDsJLyogd3JpdGUgMSB0byBvZmYgUnhwYXRoLiAqLworCQkJCX0gZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKSB7CisJCQkJCVIyIHw9IDB4MjAwNDA7CS8qIHdyaXRlIDEgdG8gb2ZmIFJ4UGF0aCAqLworCQkJCX0KKwkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMik7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNUdXJuT25SRkNsayMlZChSRj0lZCwgKSAsIFIyPTB4JTA4eFxuIiwKKwkJCQkgIENoYW5uZWwsIHBBZC0+UmZJY1R5cGUsIFIyKSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fY2ZnLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fY2ZnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRmNDM5MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9jZmcuYwpAQCAtMCwwICsxLDI1OCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKwljbW1fY2ZnLmMKKworICAgIEFic3RyYWN0OgorICAgIFJhbGluayBXaUZpIERyaXZlciBjb25maWd1cmF0aW9uIHJlbGF0ZWQgc3Vicm91dGluZXMKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworY2hhciAqR2V0UGh5TW9kZShpbnQgTW9kZSkKK3sKKwlzd2l0Y2ggKE1vZGUpIHsKKwljYXNlIE1PREVfQ0NLOgorCQlyZXR1cm4gIkNDSyI7CisKKwljYXNlIE1PREVfT0ZETToKKwkJcmV0dXJuICJPRkRNIjsKKwljYXNlIE1PREVfSFRNSVg6CisJCXJldHVybiAiSFRNSVgiOworCisJY2FzZSBNT0RFX0hUR1JFRU5GSUVMRDoKKwkJcmV0dXJuICJHUkVFTiI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJOL0EiOworCX0KK30KKworY2hhciAqR2V0QlcoaW50IEJXKQoreworCXN3aXRjaCAoQlcpIHsKKwljYXNlIEJXXzEwOgorCQlyZXR1cm4gIjEwTSI7CisKKwljYXNlIEJXXzIwOgorCQlyZXR1cm4gIjIwTSI7CisJY2FzZSBCV180MDoKKwkJcmV0dXJuICI0ME0iOworCWRlZmF1bHQ6CisJCXJldHVybiAiTi9BIjsKKwl9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IENvdW50cnkgUmVnaW9uIHRvIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24uCisgICAgICAgIFRoaXMgY29tbWFuZCB3aWxsIG5vdCB3b3JrLCBpZiB0aGUgZmllbGQgb2YgQ291bnRyeVJlZ2lvbiBpbiBlZXByb20gaXMgcHJvZ3JhbW1lZC4KKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IFJUX0NmZ1NldENvdW50cnlSZWdpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBjaGFyICphcmcsIGludCBiYW5kKQoreworCWxvbmcgcmVnaW9uLCByZWdpb25NYXg7CisJdTggKnBDb3VudHJ5UmVnaW9uOworCisJcmVnaW9uID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChiYW5kID09IEJBTkRfMjRHKSB7CisJCXBDb3VudHJ5UmVnaW9uID0gJnBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb247CisJCXJlZ2lvbk1heCA9IFJFR0lPTl9NQVhJTVVNX0JHX0JBTkQ7CisJfSBlbHNlIHsKKwkJcENvdW50cnlSZWdpb24gPSAmcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kOworCQlyZWdpb25NYXggPSBSRUdJT05fTUFYSU1VTV9BX0JBTkQ7CisJfQorCisJLyogVE9ETzogSXMgaXQgbmVjY2VzYXkgZm9yIGZvbGxvd2luZyBjaGVjaz8/PyAqLworCS8qIENvdW50cnkgY2FuIGJlIHNldCBvbmx5IHdoZW4gRUVQUk9NIG5vdCBwcm9ncmFtbWVkICovCisJaWYgKCpwQ291bnRyeVJlZ2lvbiAmIDB4ODApIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJDZmdTZXRDb3VudHJ5UmVnaW9uKCk6Q291bnRyeVJlZ2lvbiBpbiBlZXByb20gd2FzIHByb2dyYW1tZWRcbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmICgocmVnaW9uID49IDApICYmIChyZWdpb24gPD0gUkVHSU9OX01BWElNVU1fQkdfQkFORCkpIHsKKwkJKnBDb3VudHJ5UmVnaW9uID0gKHU4KXJlZ2lvbjsKKwl9IGVsc2UgaWYgKChyZWdpb24gPT0gUkVHSU9OXzMxX0JHX0JBTkQpICYmIChiYW5kID09IEJBTkRfMjRHKSkgeworCQkqcENvdW50cnlSZWdpb24gPSAodTgpcmVnaW9uOworCX0gZWxzZSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiQ2ZnU2V0Q291bnRyeVJlZ2lvbigpOnJlZ2lvbiglbGQpIG91dCBvZiByYW5nZSFcbiIsCisJCQkgIHJlZ2lvbikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcmV0dXJuIFRSVUU7CisKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV2lyZWxlc3MgTW9kZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IFJUX0NmZ1NldFdpcmVsZXNzTW9kZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIGNoYXIgKmFyZykKK3sKKwlpbnQgTWF4UGh5TW9kZSA9IFBIWV8xMUc7CisJbG9uZyBXaXJlbGVzc01vZGU7CisKKwlNYXhQaHlNb2RlID0gUEhZXzExTl81RzsKKworCVdpcmVsZXNzTW9kZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFdpcmVsZXNzTW9kZSA8PSBNYXhQaHlNb2RlKSB7CisJCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSBXaXJlbGVzc01vZGU7CisJCXJldHVybiBUUlVFOworCX0KKworCXJldHVybiBGQUxTRTsKKworfQorCitpbnQgUlRfQ2ZnU2V0U2hvcnRTbG90KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgY2hhciAqYXJnKQoreworCWxvbmcgU2hvcnRTbG90OworCisJU2hvcnRTbG90ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChTaG9ydFNsb3QgPT0gMSkKKwkJcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSBUUlVFOworCWVsc2UgaWYgKFNob3J0U2xvdCA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IEZBTFNFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOwkvKkludmFsaWQgYXJndW1lbnQgKi8KKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXRVAgS0VZIGJhc2Ugb24gS2V5SWR4CisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgUlRfQ2ZnU2V0V2VwS2V5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgIGNoYXIgKmtleVN0cmluZywKKwkJICAgIHN0cnVjdCBydF9jaXBoZXJfa2V5ICpwU2hhcmVkS2V5LCBpbnQga2V5SWR4KQoreworCWludCBLZXlMZW47CisJaW50IGk7CisJdTggQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJQk9PTEVBTiBiS2V5SXNIZXggPSBGQUxTRTsKKworCS8qIFRPRE86IFNoYWxsIHdlIGRvIG1lbXNldCBmb3IgdGhlIG9yaWdpbmFsIGtleSBpbmZvPz8gKi8KKwltZW1zZXQocFNoYXJlZEtleSwgMCwgc2l6ZW9mKHN0cnVjdCBydF9jaXBoZXJfa2V5KSk7CisJS2V5TGVuID0gc3RybGVuKGtleVN0cmluZyk7CisJc3dpdGNoIChLZXlMZW4pIHsKKwljYXNlIDU6CQkvKndlcCA0MCBBc2NpaSB0eXBlICovCisJY2FzZSAxMzoJCS8qd2VwIDEwNCBBc2NpaSB0eXBlICovCisJCWJLZXlJc0hleCA9IEZBTFNFOworCQlwU2hhcmVkS2V5LT5LZXlMZW4gPSBLZXlMZW47CisJCU5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPktleSwga2V5U3RyaW5nLCBLZXlMZW4pOworCQlicmVhazsKKworCWNhc2UgMTA6CQkvKndlcCA0MCBIZXggdHlwZSAqLworCWNhc2UgMjY6CQkvKndlcCAxMDQgSGV4IHR5cGUgKi8KKwkJZm9yIChpID0gMDsgaSA8IEtleUxlbjsgaSsrKSB7CisJCQlpZiAoIWlzeGRpZ2l0KCooa2V5U3RyaW5nICsgaSkpKQorCQkJCXJldHVybiBGQUxTRTsJLypOb3QgSGV4IHZhbHVlOyAqLworCQl9CisJCWJLZXlJc0hleCA9IFRSVUU7CisJCXBTaGFyZWRLZXktPktleUxlbiA9IEtleUxlbiAvIDI7CisJCUF0b0goa2V5U3RyaW5nLCBwU2hhcmVkS2V5LT5LZXksIHBTaGFyZWRLZXktPktleUxlbik7CisJCWJyZWFrOworCisJZGVmYXVsdDoJCS8qSW52YWxpZCBhcmd1bWVudCAqLworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlJUX0NmZ1NldFdlcEtleShrZXlJZHg9JWQpOkludmFsaWQgYXJndW1lbnQgKGFyZz0lcylcbiIsCisJCQkgIGtleUlkeCwga2V5U3RyaW5nKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSAoKEtleUxlbiAlIDUpID8gQ0lQSEVSX1dFUDEyOCA6IENJUEhFUl9XRVA2NCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIlJUX0NmZ1NldFdlcEtleTooS2V5SWR4PSVkLHR5cGU9JXMsIEFsZz0lcylcbiIsIGtleUlkeCwKKwkJICAoYktleUlzSGV4ID09IEZBTFNFID8gIkFzY2lpIiA6ICJIZXgiKSwKKwkJICBDaXBoZXJOYW1lW0NpcGhlckFsZ10pKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXUEEgUFNLIGtleQorCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWRhcHRlcglQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICAgIGtleVN0cmluZwlXUEEgcHJlLXNoYXJlZCBrZXkgc3RyaW5nCisgICAgICAgIHBIYXNoU3RyCVN0cmluZyB1c2VkIGZvciBwYXNzd29yZCBoYXNoIGZ1bmN0aW9uCisgICAgICAgIGhhc2hTdHJMZW4JTGVuZ2h0IG9mIHRoZSBoYXNoIHN0cmluZworICAgICAgICBwUE1LQnVmCQlPdXRwdXQgYnVmZmVyIG9mIFdQQVBTSyBrZXkKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IFJUX0NmZ1NldFdQQVBTS0tleShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICBjaGFyICprZXlTdHJpbmcsCisJCSAgICAgICB1OCAqIHBIYXNoU3RyLAorCQkgICAgICAgaW50IGhhc2hTdHJMZW4sIHU4ICpwUE1LQnVmKQoreworCWludCBrZXlMZW47CisJdTgga2V5TWF0ZXJpYWxbNDBdOworCisJa2V5TGVuID0gc3RybGVuKGtleVN0cmluZyk7CisJaWYgKChrZXlMZW4gPCA4KSB8fCAoa2V5TGVuID4gNjQpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiV1BBUFNLIEtleSBsZW5ndGgoJWQpIGVycm9yLCByZXF1aXJlZCA4IH4gNjQgY2hhcmFjdGVycyEoa2V5U3RyPSVzKVxuIiwKKwkJCSAga2V5TGVuLCBrZXlTdHJpbmcpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCW1lbXNldChwUE1LQnVmLCAwLCAzMik7CisJaWYgKGtleUxlbiA9PSA2NCkgeworCQlBdG9IKGtleVN0cmluZywgcFBNS0J1ZiwgMzIpOworCX0gZWxzZSB7CisJCVBhc3N3b3JkSGFzaChrZXlTdHJpbmcsIHBIYXNoU3RyLCBoYXNoU3RyTGVuLCBrZXlNYXRlcmlhbCk7CisJCU5kaXNNb3ZlTWVtb3J5KHBQTUtCdWYsIGtleU1hdGVyaWFsLCAzMik7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGEuYwppbmRleCA3NzRmYWJiLi42ODI2M2NlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9kYXRhLmMKQEAgLTI3LDUwICsyNyw1OCBAQAogCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCiAKLSNkZWZpbmUgTUFYX1RYX0lOX1RCVFQJCSgxNikKK3U4IFNOQVBfODAyXzFIW10gPSB7IDB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAgfTsKK3U4IFNOQVBfQlJJREdFX1RVTk5FTFtdID0geyAweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweGY4IH07CiAKKy8qIEFkZCBDaXNjbyBBaXJvbmV0IFNOQVAgaGVhZGUgZm9yIENDWDIgc3VwcG9ydCAqLwordTggU05BUF9BSVJPTkVUW10gPSB7IDB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4NDAsIDB4OTYsIDB4MDAsIDB4MDAgfTsKK3U4IENLSVBfTExDX1NOQVBbXSA9IHsgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHg0MCwgMHg5NiwgMHgwMCwgMHgwMiB9OwordTggRUFQT0xfTExDX1NOQVBbXSA9IHsgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4ZSB9OwordTggRUFQT0xbXSA9IHsgMHg4OCwgMHg4ZSB9OwordTggVFBJRFtdID0geyAweDgxLCAweDAwIH07CS8qIFZMQU4gcmVsYXRlZCAqLwogCi1VQ0hBUglTTkFQXzgwMl8xSFtdID0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDB9OwotVUNIQVIJU05BUF9CUklER0VfVFVOTkVMW10gPSB7MHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHhmOH07Ci0vLyBBZGQgQ2lzY28gQWlyb25ldCBTTkFQIGhlYWRlIGZvciBDQ1gyIHN1cHBvcnQKLVVDSEFSCVNOQVBfQUlST05FVFtdID0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4NDAsIDB4OTYsIDB4MDAsIDB4MDB9OwotVUNIQVIJQ0tJUF9MTENfU05BUFtdID0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4NDAsIDB4OTYsIDB4MDAsIDB4MDJ9OwotVUNIQVIJRUFQT0xfTExDX1NOQVBbXT0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4OGV9OwotVUNIQVIJRUFQT0xbXSA9IHsweDg4LCAweDhlfTsKLVVDSEFSICAgVFBJRFtdID0gezB4ODEsIDB4MDB9OyAvKiBWTEFOIHJlbGF0ZWQgKi8KK3U4IElQWFtdID0geyAweDgxLCAweDM3IH07Cit1OCBBUFBMRV9UQUxLW10gPSB7IDB4ODAsIDB4ZjMgfTsKIAotVUNIQVIJSVBYW10gPSB7MHg4MSwgMHgzN307Ci1VQ0hBUglBUFBMRV9UQUxLW10gPSB7MHg4MCwgMHhmM307Ci1VQ0hBUglSYXRlSWRUb1BsY3BTaWduYWxbMTJdID0gewotCSAwLCAvKiBSQVRFXzEgKi8JMSwgLyogUkFURV8yICovIAkyLCAvKiBSQVRFXzVfNSAqLwkzLCAvKiBSQVRFXzExICovCS8vIHNlZSBCQlAgc3BlYwotCTExLCAvKiBSQVRFXzYgKi8gICAxNSwgLyogUkFURV85ICovICAgIDEwLCAvKiBSQVRFXzEyICovICAgMTQsIC8qIFJBVEVfMTggKi8JLy8gc2VlIElFRUU4MDIuMTFhLTE5OTkgcC4xNAotCSA5LCAvKiBSQVRFXzI0ICovICAxMywgLyogUkFURV8zNiAqLwk4LCAvKiBSQVRFXzQ4ICovICAgMTIgIC8qIFJBVEVfNTQgKi8gfTsgLy8gc2VlIElFRUU4MDIuMTFhLTE5OTkgcC4xNAordTggUmF0ZUlkVG9QbGNwU2lnbmFsWzEyXSA9IHsKKwkwLCAvKiBSQVRFXzEgKi8gMSwgLyogUkFURV8yICovIDIsIC8qIFJBVEVfNV81ICovIDMsCS8qIFJBVEVfMTEgKi8vKiBzZWUgQkJQIHNwZWMgKi8KKwkxMSwgLyogUkFURV82ICovIDE1LCAvKiBSQVRFXzkgKi8gMTAsIC8qIFJBVEVfMTIgKi8gMTQsCS8qIFJBVEVfMTggKi8vKiBzZWUgSUVFRTgwMi4xMWEtMTk5OSBwLjE0ICovCisJOSwgLyogUkFURV8yNCAqLyAxMywgLyogUkFURV8zNiAqLyA4LCAvKiBSQVRFXzQ4ICovIDEyIC8qIFJBVEVfNTQgKi8KK307CQkJCS8qIHNlZSBJRUVFODAyLjExYS0xOTk5IHAuMTQgKi8KIAotVUNIQVIJIE9mZG1TaWduYWxUb1JhdGVJZFsxNl0gPSB7Ci0JUkFURV81NCwgIFJBVEVfNTQsCVJBVEVfNTQsICBSQVRFXzU0LAkvLyBPRkRNIFBMQ1AgU2lnbmFsID0gMCwgIDEsICAyLCAgMyByZXNwZWN0aXZlbHkKLQlSQVRFXzU0LCAgUkFURV81NCwJUkFURV81NCwgIFJBVEVfNTQsCS8vIE9GRE0gUExDUCBTaWduYWwgPSA0LCAgNSwgIDYsICA3IHJlc3BlY3RpdmVseQotCVJBVEVfNDgsICBSQVRFXzI0LAlSQVRFXzEyLCAgUkFURV82LAkvLyBPRkRNIFBMQ1AgU2lnbmFsID0gOCwgIDksICAxMCwgMTEgcmVzcGVjdGl2ZWx5Ci0JUkFURV81NCwgIFJBVEVfMzYsCVJBVEVfMTgsICBSQVRFXzksCS8vIE9GRE0gUExDUCBTaWduYWwgPSAxMiwgMTMsIDE0LCAxNSByZXNwZWN0aXZlbHkKK3U4IE9mZG1TaWduYWxUb1JhdGVJZFsxNl0gPSB7CisJUkFURV81NCwgUkFURV81NCwgUkFURV81NCwgUkFURV81NCwJLyogT0ZETSBQTENQIFNpZ25hbCA9IDAsICAxLCAgMiwgIDMgcmVzcGVjdGl2ZWx5ICovCisJUkFURV81NCwgUkFURV81NCwgUkFURV81NCwgUkFURV81NCwJLyogT0ZETSBQTENQIFNpZ25hbCA9IDQsICA1LCAgNiwgIDcgcmVzcGVjdGl2ZWx5ICovCisJUkFURV80OCwgUkFURV8yNCwgUkFURV8xMiwgUkFURV82LAkvKiBPRkRNIFBMQ1AgU2lnbmFsID0gOCwgIDksICAxMCwgMTEgcmVzcGVjdGl2ZWx5ICovCisJUkFURV81NCwgUkFURV8zNiwgUkFURV8xOCwgUkFURV85LAkvKiBPRkRNIFBMQ1AgU2lnbmFsID0gMTIsIDEzLCAxNCwgMTUgcmVzcGVjdGl2ZWx5ICovCiB9OwogCi1VQ0hBUgkgT2ZkbVJhdGVUb1J4d2lNQ1NbMTJdID0gewotCTAsICAwLAkwLCAgMCwKLQkwLCAgMSwJMiwgIDMsCS8vIE9GRE0gcmF0ZSA2LDksMTIsMTggPSByeHdpIG1jcyAwLDEsMiwzCi0JNCwgIDUsCTYsICA3LAkvLyBPRkRNIHJhdGUgMjQsMzYsNDgsNTQgPSByeHdpIG1jcyA0LDUsNiw3Ci19OwotVUNIQVIJIFJ4d2lNQ1NUb09mZG1SYXRlWzEyXSA9IHsKLQlSQVRFXzYsICBSQVRFXzksCVJBVEVfMTIsICBSQVRFXzE4LAotCVJBVEVfMjQsICBSQVRFXzM2LAlSQVRFXzQ4LCAgUkFURV81NCwJLy8gT0ZETSByYXRlIDYsOSwxMiwxOCA9IHJ4d2kgbWNzIDAsMSwyLDMKLQk0LCAgNSwJNiwgIDcsCS8vIE9GRE0gcmF0ZSAyNCwzNiw0OCw1NCA9IHJ4d2kgbWNzIDQsNSw2LDcKK3U4IE9mZG1SYXRlVG9SeHdpTUNTWzEyXSA9IHsKKwkwLCAwLCAwLCAwLAorCTAsIDEsIDIsIDMsCQkvKiBPRkRNIHJhdGUgNiw5LDEyLDE4ID0gcnh3aSBtY3MgMCwxLDIsMyAqLworCTQsIDUsIDYsIDcsCQkvKiBPRkRNIHJhdGUgMjQsMzYsNDgsNTQgPSByeHdpIG1jcyA0LDUsNiw3ICovCiB9OwogCi1jaGFyKiAgIE1DU1RvTWJwc1tdID0geyIxTWJwcyIsIjJNYnBzIiwiNS41TWJwcyIsIjExTWJwcyIsIjA2TWJwcyIsIjA5TWJwcyIsIjEyTWJwcyIsIjE4TWJwcyIsIjI0TWJwcyIsIjM2TWJwcyIsIjQ4TWJwcyIsIjU0TWJwcyIsIk1NLTAiLCJNTS0xIiwiTU0tMiIsIk1NLTMiLCJNTS00IiwiTU0tNSIsIk1NLTYiLCJNTS03IiwiTU0tOCIsIk1NLTkiLCJNTS0xMCIsIk1NLTExIiwiTU0tMTIiLCJNTS0xMyIsIk1NLTE0IiwiTU0tMTUiLCJNTS0zMiIsImVlMSIsImVlMiIsImVlMyJ9OwordTggUnh3aU1DU1RvT2ZkbVJhdGVbMTJdID0geworCVJBVEVfNiwgUkFURV85LCBSQVRFXzEyLCBSQVRFXzE4LAorCVJBVEVfMjQsIFJBVEVfMzYsIFJBVEVfNDgsIFJBVEVfNTQsCS8qIE9GRE0gcmF0ZSA2LDksMTIsMTggPSByeHdpIG1jcyAwLDEsMiwzICovCisJNCwgNSwgNiwgNywJCS8qIE9GRE0gcmF0ZSAyNCwzNiw0OCw1NCA9IHJ4d2kgbWNzIDQsNSw2LDcgKi8KK307CiAKLVVDSEFSIGRlZmF1bHRfY3dtaW5bXT17Q1dfTUlOX0lOX0JJVFMsIENXX01JTl9JTl9CSVRTLCBDV19NSU5fSU5fQklUUy0xLCBDV19NSU5fSU5fQklUUy0yfTsKLVVDSEFSIGRlZmF1bHRfc3RhX2FpZnNuW109ezMsNywyLDJ9OworY2hhciAqTUNTVG9NYnBzW10gPQorICAgIHsgIjFNYnBzIiwgIjJNYnBzIiwgIjUuNU1icHMiLCAiMTFNYnBzIiwgIjA2TWJwcyIsICIwOU1icHMiLCAiMTJNYnBzIiwKKyIxOE1icHMiLCAiMjRNYnBzIiwgIjM2TWJwcyIsICI0OE1icHMiLCAiNTRNYnBzIiwgIk1NLTAiLCAiTU0tMSIsICJNTS0yIiwgIk1NLTMiLAorIk1NLTQiLCAiTU0tNSIsICJNTS02IiwgIk1NLTciLCAiTU0tOCIsICJNTS05IiwgIk1NLTEwIiwgIk1NLTExIiwgIk1NLTEyIiwgIk1NLTEzIiwKKyJNTS0xNCIsICJNTS0xNSIsICJNTS0zMiIsICJlZTEiLCAiZWUyIiwgImVlMyIgfTsKIAotVUNIQVIgTWFwVXNlclByaW9yaXR5VG9BY2Nlc3NDYXRlZ29yeVs4XSA9IHtRSURfQUNfQkUsIFFJRF9BQ19CSywgUUlEX0FDX0JLLCBRSURfQUNfQkUsIFFJRF9BQ19WSSwgUUlEX0FDX1ZJLCBRSURfQUNfVk8sIFFJRF9BQ19WT307Cit1OCBkZWZhdWx0X2N3bWluW10gPQorICAgIHsgQ1dfTUlOX0lOX0JJVFMsIENXX01JTl9JTl9CSVRTLCBDV19NSU5fSU5fQklUUyAtIDEsIENXX01JTl9JTl9CSVRTIC0gMiB9OworLyp1OCBkZWZhdWx0X2N3bWF4W109e0NXX01BWF9JTl9CSVRTLCBDV19NQVhfSU5fQklUUywgQ1dfTUlOX0lOX0JJVFMsIENXX01JTl9JTl9CSVRTLTF9OyAqLwordTggZGVmYXVsdF9zdGFfYWlmc25bXSA9IHsgMywgNywgMiwgMiB9OwogCit1OCBNYXBVc2VyUHJpb3JpdHlUb0FjY2Vzc0NhdGVnb3J5WzhdID0KKyAgICB7IFFJRF9BQ19CRSwgUUlEX0FDX0JLLCBRSURfQUNfQkssIFFJRF9BQ19CRSwgUUlEX0FDX1ZJLCBRSURfQUNfVkksCitRSURfQUNfVk8sIFFJRF9BQ19WTyB9OwogCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtOTYsMTYyICsxMDQsMTE5IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1ORElTX1NUQVRVUyBNaW5pcG9ydE1NUmVxdWVzdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCVF1ZUlkeCwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVSU5UCQkJTGVuZ3RoKQoraW50IE1pbmlwb3J0TU1SZXF1ZXN0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgIHU4IFF1ZUlkeCwgdTggKnBEYXRhLCB1MzIgTGVuZ3RoKQogewotCVBORElTX1BBQ0tFVAlwUGFja2V0OwotCU5ESVNfU1RBVFVTICAJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQlVTE9ORwkgCQlGcmVlTnVtOwotI2lmZGVmIFJUMjg2MAotCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3MgPSAwOwotI2VuZGlmCi0JVUNIQVIJCQlJcnFTdGF0ZTsKLQlVQ0hBUgkJCXJ0bXBId0hkcltUWElORk9fU0laRSArIFRYV0lfU0laRV07IC8vUlRNUF9IV19IRFJfTEVOXTsKKwl2b2lkICpwUGFja2V0OworCWludCBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgRnJlZU51bTsKKwl1OCBydG1wSHdIZHJbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOwkvKlJUTVBfSFdfSERSX0xFTl07ICovCisjaWZkZWYgUlRNUF9NQUNfUENJCisJdW5zaWduZWQgbG9uZyBJcnFGbGFncyA9IDA7CisJdTggSXJxU3RhdGU7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisJQk9PTEVBTiBiVXNlRGF0YVEgPSBGQUxTRTsKKwlpbnQgcmV0cnlDbnQgPSAwOwogCiAJQVNTRVJUKExlbmd0aCA8PSBNR01UX0RNQV9CVUZGRVJfU0laRSk7CiAKLQlRdWVJZHg9MzsKLQotCS8vIDI4NjBDIHVzZSBUeCBSaW5nCi0KKwlpZiAoKFF1ZUlkeCAmIE1HTVRfVVNFX1FVRVVFX0ZMQUcpID09IE1HTVRfVVNFX1FVRVVFX0ZMQUcpIHsKKwkJYlVzZURhdGFRID0gVFJVRTsKKwkJUXVlSWR4ICY9ICh+TUdNVF9VU0VfUVVFVUVfRkxBRyk7CisJfQorI2lmZGVmIFJUTVBfTUFDX1BDSQorCS8qIDI4NjBDIHVzZSBUeCBSaW5nICovCiAJSXJxU3RhdGUgPSBwQWQtPmlycV9kaXNhYmxlZDsKLQotI2lmZGVmIFJUMjg2MAotCWlmICgocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApICYmICghSXJxU3RhdGUpKQorCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkgeworCQlRdWVJZHggPSAoYlVzZURhdGFRID09IFRSVUUgPyBRdWVJZHggOiAzKTsKKwkJYlVzZURhdGFRID0gVFJVRTsKKwl9CisJaWYgKGJVc2VEYXRhUSAmJiAoIUlycVN0YXRlKSkKIAkJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwotI2VuZGlmCi0JZG8KLQl7Ci0JCS8vIFJlc2V0IGlzIGluIHByb2dyZXNzLCBzdG9wIGltbWVkaWF0ZWx5Ci0JCWlmICggUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAotCQkJIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKXx8Ci0JCQkgIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpCi0JCXsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKworCWRvIHsKKwkJLyogUmVzZXQgaXMgaW4gcHJvZ3Jlc3MsIHN0b3AgaW1tZWRpYXRlbHkgKi8KKwkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykgfHwKKwkJICAgIFJUTVBfVEVTVF9GTEFHKHBBZCwKKwkJCQkgICBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCSAgIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkKKwkJICAgIHx8ICFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApKSB7CiAJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwogCQkJYnJlYWs7CiAJCX0KLQotCQkvLyBDaGVjayBGcmVlIHByaW9yaXR5IHF1ZXVlCi0JCS8vIFNpbmNlIHdlIHVzZSBQQkYgUXVldWUyIGZvciBtYW5hZ2VtZW50IGZyYW1lLiAgSXRzIGNvcnJlc3BvbmRpbmcgRE1BIHJpbmcgc2hvdWxkIGJlIHVzaW5nIFR4UmluZy4KLQotCQkvLyAyODYwQyB1c2UgVHggUmluZwotCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCi0JCXsKKwkJLyogQ2hlY2sgRnJlZSBwcmlvcml0eSBxdWV1ZSAqLworCQkvKiBTaW5jZSB3ZSB1c2UgUEJGIFF1ZXVlMiBmb3IgbWFuYWdlbWVudCBmcmFtZS4gIEl0cyBjb3JyZXNwb25kaW5nIERNQSByaW5nIHNob3VsZCBiZSB1c2luZyBUeFJpbmcuICovCisjaWZkZWYgUlRNUF9NQUNfUENJCisJCWlmIChiVXNlRGF0YVEpIHsKKwkJCXJldHJ5Q250ID0gTUFYX0RBVEFNTV9SRVRSWTsKKwkJCS8qIGZyZWUgVHgoUXVlSWR4KSByZXNvdXJjZXMgKi8KKwkJCVJUTVBGcmVlVFhEVXBvblR4RG1hRG9uZShwQWQsIFF1ZUlkeCk7CiAJCQlGcmVlTnVtID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOwotCQl9Ci0JCWVsc2UKKwkJfSBlbHNlCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiAJCXsKIAkJCUZyZWVOdW0gPSBHRVRfTUdNVFJJTkdfRlJFRU5PKHBBZCk7CiAJCX0KIAotCQlpZiAoKEZyZWVOdW0gPiAwKSkKLQkJewotCQkJLy8gV2UgbmVlZCB0byByZXNlcnZlIHNwYWNlIGZvciBydG1wIGhhcmR3YXJlIGhlYWRlci4gaS5lLiwgVHhXSSBmb3IgUlQyODYwIGFuZCBUeEluZm8rVHhXSSBmb3IgUlQyODcwCisJCWlmICgoRnJlZU51bSA+IDApKSB7CisJCQkvKiBXZSBuZWVkIHRvIHJlc2VydmUgc3BhY2UgZm9yIHJ0bXAgaGFyZHdhcmUgaGVhZGVyLiBpLmUuLCBUeFdJIGZvciBSVDI4NjAgYW5kIFR4SW5mbytUeFdJIGZvciBSVDI4NzAgKi8KIAkJCU5kaXNaZXJvTWVtb3J5KCZydG1wSHdIZHIsIChUWElORk9fU0laRSArIFRYV0lfU0laRSkpOwotCQkJU3RhdHVzID0gUlRNUEFsbG9jYXRlTmRpc1BhY2tldChwQWQsICZwUGFja2V0LCAoUFVDSEFSKSZydG1wSHdIZHIsIChUWElORk9fU0laRSArIFRYV0lfU0laRSksIHBEYXRhLCBMZW5ndGgpOwotCQkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiTWluaXBvcnRNTVJlcXVlc3QgKGVycm9yOjogY2FuJ3QgYWxsb2NhdGUgTkRJUyBQQUNLRVQpXG4iKSk7CisJCQlTdGF0dXMgPQorCQkJICAgIFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQocEFkLCAmcFBhY2tldCwKKwkJCQkJCSAgICh1OCAqKSYgcnRtcEh3SGRyLAorCQkJCQkJICAgKFRYSU5GT19TSVpFICsgVFhXSV9TSVpFKSwKKwkJCQkJCSAgIHBEYXRhLCBMZW5ndGgpOworCQkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwKKwkJCQkJICgiTWluaXBvcnRNTVJlcXVlc3QgKGVycm9yOjogY2FuJ3QgYWxsb2NhdGUgTkRJUyBQQUNLRVQpXG4iKSk7CiAJCQkJYnJlYWs7CiAJCQl9CisJCQkvKnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9DQ0s7ICovCisJCQkvKnBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV8yOyAqLwogCi0JCQkvL3BBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCQkvL3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV8yOwotCi0KLQkJCVN0YXR1cyA9IE1sbWVIYXJkVHJhbnNtaXQocEFkLCBRdWVJZHgsIHBQYWNrZXQpOwotCQkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorI2lmZGVmIFJUTVBfTUFDX1BDSQorCQkJaWYgKGJVc2VEYXRhUSkgeworCQkJCVN0YXR1cyA9CisJCQkJICAgIE1sbWVEYXRhSGFyZFRyYW5zbWl0KHBBZCwgUXVlSWR4LCBwUGFja2V0KTsKKwkJCQlyZXRyeUNudC0tOworCQkJfSBlbHNlCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisJCQkJU3RhdHVzID0gTWxtZUhhcmRUcmFuc21pdChwQWQsIFF1ZUlkeCwgcFBhY2tldCk7CisJCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJcmV0cnlDbnQgPSAwOworCQkJZWxzZQogCQkJCVJUTVBGcmVlTmRpc1BhY2tldChwQWQsIHBQYWNrZXQpOwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJcEFkLT5SYWxpbmtDb3VudGVycy5NZ210UmluZ0Z1bGxDb3VudCsrOwotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUWlkeCglZCksIG5vdCBlbm91Z2ggc3BhY2UgaW4gTWdtdFJpbmcsIE1nbXRSaW5nRnVsbENvdW50PSVsZCFcbiIsCi0JCQkJCQkJCQkJUXVlSWR4LCBwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50KSk7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJCQlpZiAoYlVzZURhdGFRKSB7CisJCQkJcmV0cnlDbnQtLTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgicmV0cnlDbnQgJWRcbiIsIHJldHJ5Q250KSk7CisJCQkJaWYgKHJldHJ5Q250ID09IDApIHsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJCQkgKCJRaWR4KCVkKSwgbm90IGVub3VnaCBzcGFjZSBpbiBEYXRhUmluZywgTWdtdFJpbmdGdWxsQ291bnQ9JWxkIVxuIiwKKwkJCQkJCSAgUXVlSWR4LAorCQkJCQkJICBwQWQtPlJhbGlua0NvdW50ZXJzLgorCQkJCQkJICBNZ210UmluZ0Z1bGxDb3VudCkpOworCQkJCX0KKwkJCX0KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIlFpZHgoJWQpLCBub3QgZW5vdWdoIHNwYWNlIGluIE1nbXRSaW5nLCBNZ210UmluZ0Z1bGxDb3VudD0lbGQhXG4iLAorCQkJCSAgUXVlSWR4LAorCQkJCSAgcEFkLT5SYWxpbmtDb3VudGVycy5NZ210UmluZ0Z1bGxDb3VudCkpOwogCQl9CisJfSB3aGlsZSAocmV0cnlDbnQgPiAwKTsKIAotCX0gd2hpbGUgKEZBTFNFKTsKLQotI2lmZGVmIFJUMjg2MAotCS8vIDI4NjBDIHVzZSBUeCBSaW5nCi0JaWYgKChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkgJiYgKCFJcnFTdGF0ZSkpCisjaWZkZWYgUlRNUF9NQUNfUENJCisJaWYgKGJVc2VEYXRhUSAmJiAoIUlycVN0YXRlKSkKIAkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7Ci0jZW5kaWYKLQlyZXR1cm4gU3RhdHVzOwotfQotCi0jaWZkZWYgUlQyODYwCi1ORElTX1NUQVRVUyBNaW5pcG9ydE1NUmVxdWVzdFVubG9jaygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCVF1ZUlkeCwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVSU5UCQkJTGVuZ3RoKQotewotCVBORElTX1BBQ0tFVAlwUGFja2V0OwotCU5ESVNfU1RBVFVTICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCVVMT05HCSBGcmVlTnVtOwotCVRYV0lfU1RSVUMJCVRYV0k7Ci0JVUxPTkcJU1dfVFhfSURYOwotCVBUWERfU1RSVUMJCXBUeEQ7Ci0KLQlRdWVJZHggPSAzOwotCUFTU0VSVChMZW5ndGggPD0gTUdNVF9ETUFfQlVGRkVSX1NJWkUpOwotCi0JZG8KLQl7Ci0JCS8vIFJlc2V0IGlzIGluIHByb2dyZXNzLCBzdG9wIGltbWVkaWF0ZWx5Ci0JCWlmICggUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAotCQkJIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKXx8Ci0JCQkgIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpCi0JCXsKLQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8vIENoZWNrIEZyZWUgcHJpb3JpdHkgcXVldWUKLQkJLy8gU2luY2Ugd2UgdXNlIFBCRiBRdWV1ZTIgZm9yIG1hbmFnZW1lbnQgZnJhbWUuICBJdHMgY29ycmVzcG9uZGluZyBETUEgcmluZyBzaG91bGQgYmUgdXNpbmcgVHhSaW5nLgotCQkvLyAyODYwQyB1c2UgVHggUmluZwotCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCi0JCXsKLQkJCUZyZWVOdW0gPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7Ci0JCQlTV19UWF9JRFggPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4OwotCQkJcFR4RCAgPSAoUFRYRF9TVFJVQykgcEFkLT5UeFJpbmdbUXVlSWR4XS5DZWxsW1NXX1RYX0lEWF0uQWxsb2NWYTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUZyZWVOdW0gPSBHRVRfTUdNVFJJTkdfRlJFRU5PKHBBZCk7Ci0JCQlTV19UWF9JRFggPSBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4OwotCQkJcFR4RCAgPSAoUFRYRF9TVFJVQykgcEFkLT5NZ210UmluZy5DZWxsW1NXX1RYX0lEWF0uQWxsb2NWYTsKLQkJfQotCQlpZiAoKEZyZWVOdW0gPiAwKSkKLQkJewotCQkJTmRpc1plcm9NZW1vcnkoJlRYV0ksIFRYV0lfU0laRSk7Ci0JCQlTdGF0dXMgPSBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KHBBZCwgJnBQYWNrZXQsIChQVUNIQVIpJlRYV0ksIFRYV0lfU0laRSwgcERhdGEsIExlbmd0aCk7Ci0JCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJNaW5pcG9ydE1NUmVxdWVzdCAoZXJyb3I6OiBjYW4ndCBhbGxvY2F0ZSBORElTIFBBQ0tFVClcbiIpKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJU3RhdHVzID0gTWxtZUhhcmRUcmFuc21pdChwQWQsIFF1ZUlkeCwgcFBhY2tldCk7Ci0JCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCQkJUlRNUEZyZWVOZGlzUGFja2V0KHBBZCwgcFBhY2tldCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50Kys7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJRaWR4KCVkKSwgbm90IGVub3VnaCBzcGFjZSBpbiBNZ210UmluZ1xuIiwgUXVlSWR4KSk7Ci0JCX0KLQotCX0gd2hpbGUgKEZBTFNFKTsKLQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCiAJcmV0dXJuIFN0YXR1czsKIH0KLSNlbmRpZgogCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMjc3LDI3MCArMjQyLDg1IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1ORElTX1NUQVRVUyBNbG1lSGFyZFRyYW5zbWl0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJUXVlSWR4LAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoraW50IE1sbWVIYXJkVHJhbnNtaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB1OCBRdWVJZHgsIHZvaWQgKnBQYWNrZXQpCiB7Ci0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkKLQl7CisJc3RydWN0IHJ0X3BhY2tldF9pbmZvIFBhY2tldEluZm87CisJdTggKnBTcmNCdWZWQTsKKwl1MzIgU3JjQnVmTGVuOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhlYWRlcl84MDJfMTE7CisKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkKKwkgICAgKSB7CiAJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwogCX0KIAotI2lmZGVmIFJUMjg2MAotCWlmICggcEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDAgKQotCQlyZXR1cm4gTWxtZUhhcmRUcmFuc21pdFR4UmluZyhwQWQsUXVlSWR4LHBQYWNrZXQpOworCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFNyY0J1ZlZBLCAmU3JjQnVmTGVuKTsKKwlpZiAocFNyY0J1ZlZBID09IE5VTEwpCisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCisJcEhlYWRlcl84MDJfMTEgPSAoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKikgKHBTcmNCdWZWQSArIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFKTsKKworI2lmZGVmIFJUTVBfTUFDX1BDSQorCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKKwkJcmV0dXJuIE1sbWVIYXJkVHJhbnNtaXRUeFJpbmcocEFkLCBRdWVJZHgsIHBQYWNrZXQpOwogCWVsc2UKLSNlbmRpZgotCQlyZXR1cm4gTWxtZUhhcmRUcmFuc21pdE1nbXRSaW5nKHBBZCxRdWVJZHgscFBhY2tldCk7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisJCXJldHVybiBNbG1lSGFyZFRyYW5zbWl0TWdtdFJpbmcocEFkLCBRdWVJZHgsIHBQYWNrZXQpOwogCiB9CiAKLSNpZmRlZiBSVDI4NjAKLU5ESVNfU1RBVFVTIE1sbWVIYXJkVHJhbnNtaXRUeFJpbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJUXVlSWR4LAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoraW50IE1sbWVIYXJkVHJhbnNtaXRNZ210UmluZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgICB1OCBRdWVJZHgsIHZvaWQgKnBQYWNrZXQpCiB7Ci0JUEFDS0VUX0lORk8gCVBhY2tldEluZm87Ci0JUFVDSEFSCQkJcFNyY0J1ZlZBOwotCVVJTlQJCQlTcmNCdWZMZW47Ci0JUFRYRF9TVFJVQwkJcFR4RDsKLQlQSEVBREVSXzgwMl8xMQlwSGVhZGVyXzgwMl8xMTsKLQlCT09MRUFOIAkJYkFja1JlcXVpcmVkLCBiSW5zZXJ0VGltZXN0YW1wOwotCVVMT05HCQkJU3JjQnVmUEE7Ci0JVUNIQVIJCQlNbG1lUmF0ZTsKLQlVTE9ORwkJCVN3SWR4ID0gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeDsKLQlQVFhXSV9TVFJVQyAJcEZpcnN0VHhXSTsKLQlVTE9ORwkgRnJlZU51bTsKLQlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeSA9IE5VTEw7Ci0KKwlzdHJ1Y3QgcnRfcGFja2V0X2luZm8gUGFja2V0SW5mbzsKKwl1OCAqcFNyY0J1ZlZBOworCXUzMiBTcmNCdWZMZW47CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGVhZGVyXzgwMl8xMTsKKwlCT09MRUFOIGJBY2tSZXF1aXJlZCwgYkluc2VydFRpbWVzdGFtcDsKKwl1OCBNbG1lUmF0ZTsKKwlzdHJ1Y3QgcnRfdHh3aSAqIHBGaXJzdFR4V0k7CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcE1hY0VudHJ5ID0gTlVMTDsKKwl1OCBQSUQ7CiAKIAlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7CiAKLQlpZiAocFNyY0J1ZlZBID09IE5VTEwpCi0JewotCQkvLyBUaGUgYnVmZmVyIHNob3VsZG4ndCBiZSBOVUxMCi0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQotCS8vIE1ha2Ugc3VyZSBNR01UIHJpbmcgcmVzb3VyY2Ugd29uJ3QgYmUgdXNlZCBieSBvdGhlciB0aHJlYWRzCi0JLy9OZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPlR4UmluZ0xvY2spOwotCi0JRnJlZU51bSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKLQotCWlmIChGcmVlTnVtID09IDApCi0JewotCQkvL05kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+VHhSaW5nTG9jayk7Ci0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQotCVN3SWR4ID0gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeDsKLQotCXBUeEQgID0gKFBUWERfU1RSVUMpIHBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0uQWxsb2NWYTsKLQotCWlmIChwQWQtPlR4UmluZ1tRdWVJZHhdLkNlbGxbU3dJZHhdLnBOZGlzUGFja2V0KQotCXsKLQkJcHJpbnRrKCJNbG1lSGFyZFRyYW5zbWl0IEVycm9yXG4iKTsKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0JLy8gb3V0Z29pbmcgZnJhbWUgYWx3YXlzIHdha2V1cCBQSFkgdG8gcHJldmVudCBmcmFtZSBsb3N0Ci0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0JCUFzaWNGb3JjZVdha2V1cChwQWQsIEZST01fVFgpOwotCi0JcEZpcnN0VHhXSQk9KFBUWFdJX1NUUlVDKXBTcmNCdWZWQTsKLQotCXBIZWFkZXJfODAyXzExID0gKFBIRUFERVJfODAyXzExKSAocFNyY0J1ZlZBICsgVFhXSV9TSVpFKTsKLQlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkKLQl7Ci0JCU1sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuQmFzaWNNbG1lUmF0ZTsKLQl9Ci0JZWxzZQotCXsKLQkJTWxtZVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKLQl9Ci0KLQlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlID09IEJUWVBFX0RBVEEpICYmCi0JCShwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1FPU19OVUxMKSkKLQl7Ci0JCXBNYWNFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcEhlYWRlcl84MDJfMTEtPkFkZHIxKTsKLQl9Ci0KLQkvLyBWZXJpZnkgTWxtZSByYXRlIGZvciBhIC8gZyBiYW5kcy4KLQlpZiAoKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KSAmJiAoTWxtZVJhdGUgPCBSQVRFXzYpKSAvLyAxMUEgYmFuZAotCQlNbG1lUmF0ZSA9IFJBVEVfNjsKLQotCS8vCi0JLy8gU2hvdWxkIG5vdCBiZSBoYXJkIGNvZGUgdG8gc2V0IFB3ck1nbXQgdG8gMCAoUFdSX0FDVElWRSkKLQkvLyBTbmljZSBpdCdzIGJlZW4gc2V0IHRvIDAgd2hpbGUgb24gTWd0TWFjSGVhZGVySW5pdAotCS8vIEJ5IHRoZSB3YXkgdGhpcyB3aWxsIGNhdXNlIGZyYW1lIHRvIGJlIHNlbmQgb24gUFdSX1NBVkUgZmFpbGVkLgotCS8vCi0JLy8KLQkvLyBJbiBXTU0tVUFQU0QsIG1sbWUgZnJhbWUgc2hvdWxkIGJlIHNldCBwc20gYXMgcG93ZXIgc2F2aW5nIGJ1dCBwcm9iZSByZXF1ZXN0IGZyYW1lCi0KLSAgICAvLyBEYXRhLU51bGwgcGFja2V0cyBhbHNlIHBhc3MgdGhyb3VnaCBNTVJlcXVlc3QgaW4gUlQyODYwLCBob3dldmVyLCB3ZSBob3BlIGNvbnRyb2wgdGhlIHBzbSBiaXQgdG8gcGFzcyBBUFNECi0JaWYgKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlICE9IEJUWVBFX0RBVEEpCi0gICAgewotICAgIAlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUFJPQkVfUkVRKSB8fCAhKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkpCi0gICAgCXsKLSAgICAJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX0FDVElWRTsKLSAgICAJfQotICAgIAllbHNlCi0gICAgCXsKLSAgICAJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gcEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZTsKLSAgICAJfQotICAgIH0KLQotCWJJbnNlcnRUaW1lc3RhbXAgPSBGQUxTRTsKLQlpZiAocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPT0gQlRZUEVfQ05UTCkgLy8gbXVzdCBiZSBQUy1QT0xMCi0JewotCQliQWNrUmVxdWlyZWQgPSBGQUxTRTsKLQl9Ci0JZWxzZSAvLyBCVFlQRV9NR01UIG9yIEJUWVBFX0RBVEEobXVzdCBiZSBOVUxMIGZyYW1lKQotCXsKLQkJaWYgKHBIZWFkZXJfODAyXzExLT5BZGRyMVswXSAmIDB4MDEpIC8vIE1VTFRJQ0FTVCwgQlJPQURDQVNUCi0JCXsKLQkJCWJBY2tSZXF1aXJlZCA9IEZBTFNFOwotCQkJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gMDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWJBY2tSZXF1aXJlZCA9IFRSVUU7Ci0JCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgTWxtZVJhdGUsIDE0KTsKLQkJCWlmIChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1BST0JFX1JTUCkKLQkJCXsKLQkJCQliSW5zZXJ0VGltZXN0YW1wID0gVFJVRTsKLQkJCX0KLQkJfQotCX0KLQlwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwQWQtPlNlcXVlbmNlKys7Ci0JaWYgKHBBZC0+U2VxdWVuY2UgPiAweGZmZikKLQkJcEFkLT5TZXF1ZW5jZSA9IDA7Ci0JLy8gQmVmb3JlIHJhZGFyIGRldGVjdGlvbiBkb25lLCBtZ210IGZyYW1lIGNhbiBub3QgYmUgc2VudCBidXQgcHJvYmUgcmVxCi0JLy8gQmVjYXVzZSB3ZSBuZWVkIHRvIHVzZSBwcm9iZSByZXEgdG8gdHJpZ2dlciBkcml2ZXIgdG8gc2VuZCBwcm9iZSByZXEgaW4gcGFzc2l2ZSBzY2FuCi0JaWYgKChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSAhPSBTVUJUWVBFX1BST0JFX1JFUSkKLQkJJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpCi0JCSYmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgIT0gUkRfTk9STUFMX01PREUpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJNbG1lSGFyZFRyYW5zbWl0IC0tPiByYWRhciBkZXRlY3Qgbm90IGluIG5vcm1hbCBtb2RlICEhIVxuIikpOwotCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCX0KLQotCS8vCi0JLy8gZmlsbCBzY2F0dGVyLWFuZC1nYXRoZXIgYnVmZmVyIGxpc3QgaW50byBUWEQuIEludGVybmFsbHkgY3JlYXRlZCBORElTIFBBQ0tFVAotCS8vIHNob3VsZCBhbHdheXMgaGFzIG9ubHkgb25lIG9oeXNpY2FsIGJ1ZmZlciwgYW5kIHRoZSB3aG9sZSBmcmFtZSBzaXplIGVxdWFscwotCS8vIHRvIHRoZSBmaXJzdCBzY2F0dGVyIGJ1ZmZlciBzaXplCi0JLy8KLQotCS8vIEluaXRpYWxpemUgVFggRGVzY3JpcHRvcgotCS8vIEZvciBpbnRlci1mcmFtZSBnYXAsIHRoZSBudW1iZXIgaXMgZm9yIHRoaXMgZnJhbWUgYW5kIG5leHQgZnJhbWUKLQkvLyBGb3IgTUxNRSByYXRlLCB3ZSB3aWxsIGZpeCBhcyAyTWIgdG8gbWF0Y2ggb3RoZXIgdmVuZG9yJ3MgaW1wbGVtZW50Ci0KLS8vIG1hbmFnZW1lbnQgZnJhbWUgZG9lc24ndCBuZWVkIGVuY3J5cHRpb24uIHNvIHVzZSBSRVNFUlZFRF9XQ0lEIG5vIG1hdHRlciB1IGFyZSBzZW5kaW5nIHRvIHNwZWNpZmljIHdjaWQgb3Igbm90LgotCS8vIE9ubHkgYmVhY29uIHVzZSBOc2VxPVRSVUUuIFNvIGhlcmUgd2UgdXNlIE5zZXE9RkFMU0UuCi0JaWYgKHBNYWNFbnRyeSA9PSBOVUxMKQotCXsKLQkJUlRNUFdyaXRlVHhXSShwQWQsIHBGaXJzdFR4V0ksIEZBTFNFLCBGQUxTRSwgYkluc2VydFRpbWVzdGFtcCwgRkFMU0UsIGJBY2tSZXF1aXJlZCwgRkFMU0UsCi0JCTAsIFJFU0VSVkVEX1dDSUQsIChTcmNCdWZMZW4gLSBUWFdJX1NJWkUpLCBQSURfTUdNVCwgMCwgIChVQ0hBUilwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTLCBJRlNfQkFDS09GRiwgRkFMU0UsICZwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQpOwotCX0KLQllbHNlCi0JewotCQlSVE1QV3JpdGVUeFdJKHBBZCwgcEZpcnN0VHhXSSwgRkFMU0UsIEZBTFNFLAotCQkJCQliSW5zZXJ0VGltZXN0YW1wLCBGQUxTRSwgYkFja1JlcXVpcmVkLCBGQUxTRSwKLQkJCQkJMCwgcE1hY0VudHJ5LT5BaWQsIChTcmNCdWZMZW4gLSBUWFdJX1NJWkUpLAotCQkJCQlwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MsIDAsCi0JCQkJCShVQ0hBUilwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MsCi0JCQkJCUlGU19CQUNLT0ZGLCBGQUxTRSwgJnBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlKTsKLQl9Ci0KLQlwQWQtPlR4UmluZ1tRdWVJZHhdLkNlbGxbU3dJZHhdLnBOZGlzUGFja2V0ID0gcFBhY2tldDsKLQlwQWQtPlR4UmluZ1tRdWVJZHhdLkNlbGxbU3dJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0KLQlTcmNCdWZQQSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFNyY0J1ZlZBLCBTcmNCdWZMZW4sIDAsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCi0KLQlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBUUlVFLCBGSUZPX0VEQ0EpOwotCXBUeEQtPkxhc3RTZWMwID0gMTsKLQlwVHhELT5MYXN0U2VjMSA9IDE7Ci0JcFR4RC0+U0RMZW4wID0gU3JjQnVmTGVuOwotCXBUeEQtPlNETGVuMSA9IDA7Ci0JcFR4RC0+U0RQdHIwID0gU3JjQnVmUEE7Ci0JcFR4RC0+RE1BRE9ORSA9IDA7Ci0KLQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOwotCi0gICAJLy8gSW5jcmVhc2UgVFhfQ1RYX0lEWCwgYnV0IHdyaXRlIHRvIHJlZ2lzdGVyIGxhdGVyLgotCUlOQ19SSU5HX0lOREVYKHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHgsIFRYX1JJTkdfU0laRSk7Ci0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFF1ZUlkeCoweDEwLCAgcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLSNlbmRpZiAvKiBSVDI4NjAgKi8KLQotTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdE1nbXRSaW5nKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCVF1ZUlkeCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKLXsKLQlQQUNLRVRfSU5GTyAJUGFja2V0SW5mbzsKLQlQVUNIQVIJCQlwU3JjQnVmVkE7Ci0JVUlOVAkJCVNyY0J1ZkxlbjsKLQlQSEVBREVSXzgwMl8xMQlwSGVhZGVyXzgwMl8xMTsKLQlCT09MRUFOIAkJYkFja1JlcXVpcmVkLCBiSW5zZXJ0VGltZXN0YW1wOwotCVVDSEFSCQkJTWxtZVJhdGU7Ci0JUFRYV0lfU1RSVUMgCXBGaXJzdFR4V0k7Ci0JTUFDX1RBQkxFX0VOVFJZCSpwTWFjRW50cnkgPSBOVUxMOwotCi0JUlRNUF9RdWVyeVBhY2tldEluZm8ocFBhY2tldCwgJlBhY2tldEluZm8sICZwU3JjQnVmVkEsICZTcmNCdWZMZW4pOwotCQlSVE1QX1NFTV9MT0NLKCZwQWQtPk1nbXRSaW5nTG9jayk7Ci0KLQotCWlmIChwU3JjQnVmVkEgPT0gTlVMTCkKLQl7CisJLyogTWFrZSBzdXJlIE1HTVQgcmluZyByZXNvdXJjZSB3b24ndCBiZSB1c2VkIGJ5IG90aGVyIHRocmVhZHMgKi8KKwlSVE1QX1NFTV9MT0NLKCZwQWQtPk1nbXRSaW5nTG9jayk7CisJaWYgKHBTcmNCdWZWQSA9PSBOVUxMKSB7CisJCS8qIFRoZSBidWZmZXIgc2hvdWxkbid0IGJlIE5VTEwgKi8KIAkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1nbXRSaW5nTG9jayk7CiAJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwogCX0KIAotCS8vIG91dGdvaW5nIGZyYW1lIGFsd2F5cyB3YWtldXAgUEhZIHRvIHByZXZlbnQgZnJhbWUgbG9zdAotCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQotI2lmZGVmIFJUMjg2MAotCQlBc2ljRm9yY2VXYWtldXAocEFkLCBGUk9NX1RYKTsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKLSNlbmRpZgotCi0JcEZpcnN0VHhXSSA9IChQVFhXSV9TVFJVQykocFNyY0J1ZlZBICsgIFRYSU5GT19TSVpFKTsKLQlwSGVhZGVyXzgwMl8xMSA9IChQSEVBREVSXzgwMl8xMSkgKHBTcmNCdWZWQSArIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFKTsgLy9UWFdJX1NJWkUpOwotCi0JaWYgKHBIZWFkZXJfODAyXzExLT5BZGRyMVswXSAmIDB4MDEpCiAJewotCQlNbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJhc2ljTWxtZVJhdGU7CisJCS8qIG91dGdvaW5nIGZyYW1lIGFsd2F5cyB3YWtldXAgUEhZIHRvIHByZXZlbnQgZnJhbWUgbG9zdCAqLworCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwkJCUFzaWNGb3JjZVdha2V1cChwQWQsIFRSVUUpOwogCX0KLQllbHNlCi0JeworCisJcEZpcnN0VHhXSSA9IChzdHJ1Y3QgcnRfdHh3aSAqKSAocFNyY0J1ZlZBICsgVFhJTkZPX1NJWkUpOworCXBIZWFkZXJfODAyXzExID0gKHN0cnVjdCBydF9oZWFkZXJfODAyXzExICopIChwU3JjQnVmVkEgKyBUWElORk9fU0laRSArIFRYV0lfU0laRSk7CS8qVFhXSV9TSVpFKTsgKi8KKworCWlmIChwSGVhZGVyXzgwMl8xMS0+QWRkcjFbMF0gJiAweDAxKSB7CisJCU1sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuQmFzaWNNbG1lUmF0ZTsKKwl9IGVsc2UgewogCQlNbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlOwogCX0KIAotCS8vIFZlcmlmeSBNbG1lIHJhdGUgZm9yIGEgLyBnIGJhbmRzLgotCWlmICgocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID4gMTQpICYmIChNbG1lUmF0ZSA8IFJBVEVfNikpIC8vIDExQSBiYW5kCisJLyogVmVyaWZ5IE1sbWUgcmF0ZSBmb3IgYSAvIGcgYmFuZHMuICovCisJaWYgKChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkgJiYgKE1sbWVSYXRlIDwgUkFURV82KSkJLyogMTFBIGJhbmQgKi8KIAkJTWxtZVJhdGUgPSBSQVRFXzY7CiAKIAlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlID09IEJUWVBFX0RBVEEpICYmCi0JCShwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1FPU19OVUxMKSkKLQl7CisJICAgIChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1FPU19OVUxMKSkgewogCQlwTWFjRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBIZWFkZXJfODAyXzExLT5BZGRyMSk7CiAJfQogCiAJewotCQkvLyBGaXhlZCBXNTIgd2l0aCBBY3Rpdml0eSBzY2FuIGlzc3VlIGluIEFCR19NSVhFRCBhbmQgQUJHTl9NSVhFRCBtb2RlLgorCQkvKiBGaXhlZCBXNTIgd2l0aCBBY3Rpdml0eSBzY2FuIGlzc3VlIGluIEFCR19NSVhFRCBhbmQgQUJHTl9NSVhFRCBtb2RlLiAqLwogCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdfTUlYRUQKLQkJCXx8IHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRAotCQkpCi0JCXsKKwkJICAgIHx8IHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRCkgewogCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KQogCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gMTsKIAkJCWVsc2UKQEAgLTU0OCwxMDMgKzMyOCwxMjEgQEAKIAkJfQogCX0KIAotCS8vCi0JLy8gU2hvdWxkIG5vdCBiZSBoYXJkIGNvZGUgdG8gc2V0IFB3ck1nbXQgdG8gMCAoUFdSX0FDVElWRSkKLQkvLyBTbmljZSBpdCdzIGJlZW4gc2V0IHRvIDAgd2hpbGUgb24gTWd0TWFjSGVhZGVySW5pdAotCS8vIEJ5IHRoZSB3YXkgdGhpcyB3aWxsIGNhdXNlIGZyYW1lIHRvIGJlIHNlbmQgb24gUFdSX1NBVkUgZmFpbGVkLgotCS8vCi0JLy8gcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSAwOyAvLyAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKTsKLQkvLwotCS8vIEluIFdNTS1VQVBTRCwgbWxtZSBmcmFtZSBzaG91bGQgYmUgc2V0IHBzbSBhcyBwb3dlciBzYXZpbmcgYnV0IHByb2JlIHJlcXVlc3QgZnJhbWUKKwkvKiAqLworCS8qIFNob3VsZCBub3QgYmUgaGFyZCBjb2RlIHRvIHNldCBQd3JNZ210IHRvIDAgKFBXUl9BQ1RJVkUpICovCisJLyogU25pY2UgaXQncyBiZWVuIHNldCB0byAwIHdoaWxlIG9uIE1ndE1hY0hlYWRlckluaXQgKi8KKwkvKiBCeSB0aGUgd2F5IHRoaXMgd2lsbCBjYXVzZSBmcmFtZSB0byBiZSBzZW5kIG9uIFBXUl9TQVZFIGZhaWxlZC4gKi8KKwkvKiAqLworCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX0FDVElWRTsJLyogKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSk7ICovCiAKLSAgICAvLyBEYXRhLU51bGwgcGFja2V0cyBhbHNlIHBhc3MgdGhyb3VnaCBNTVJlcXVlc3QgaW4gUlQyODYwLCBob3dldmVyLCB3ZSBob3BlIGNvbnRyb2wgdGhlIHBzbSBiaXQgdG8gcGFzcyBBUFNECi0JaWYgKChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSAhPSBCVFlQRV9EQVRBKSAmJiAocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgIT0gQlRZUEVfQ05UTCkpCisJLyogKi8KKwkvKiBJbiBXTU0tVUFQU0QsIG1sbWUgZnJhbWUgc2hvdWxkIGJlIHNldCBwc20gYXMgcG93ZXIgc2F2aW5nIGJ1dCBwcm9iZSByZXF1ZXN0IGZyYW1lICovCisJLyogRGF0YS1OdWxsIHBhY2tldHMgYWxzZSBwYXNzIHRocm91Z2ggTU1SZXF1ZXN0IGluIFJUMjg2MCwgaG93ZXZlciwgd2UgaG9wZSBjb250cm9sIHRoZSBwc20gYml0IHRvIHBhc3MgQVBTRCAqLworLyogICAgICBpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlICE9IEJUWVBFX0RBVEEpICYmIChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSAhPSBCVFlQRV9DTlRMKSkgKi8KIAl7Ci0JCWlmICgocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSAmJgotCQkJKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfQUNUSU9OKSkKLQkJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7Ci0JCWVsc2UKLQkJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX0FDVElWRTsKKwkJaWYgKChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX0FDVElPTikgfHwKKwkJICAgICgocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPT0gQlRZUEVfREFUQSkgJiYKKwkJICAgICAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUU9TX05VTEwpIHx8CisJCSAgICAgIChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX05VTExfRlVOQykpKSkgeworCQkJaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkKKwkJCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IFBXUl9TQVZFOworCQkJZWxzZQorCQkJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0KKwkJCQkgICAgcEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZTsKKwkJfQogCX0KIAogCWJJbnNlcnRUaW1lc3RhbXAgPSBGQUxTRTsKLQlpZiAocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPT0gQlRZUEVfQ05UTCkgLy8gbXVzdCBiZSBQUy1QT0xMCisJaWYgKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlID09IEJUWVBFX0NOVEwpCS8qIG11c3QgYmUgUFMtUE9MTCAqLwogCXsKLQkJLy9TZXQgUE0gYml0IGluIHBzLXBvbGwsIHRvIGZpeCBXTEsgMS4yICBQb3dlclNhdmVNb2RlX2V4dCBmYWlsdXJlIGlzc3VlLgotCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1BTX1BPTEwpKQotCQl7CisJCS8qU2V0IFBNIGJpdCBpbiBwcy1wb2xsLCB0byBmaXggV0xLIDEuMiAgUG93ZXJTYXZlTW9kZV9leHQgZmFpbHVyZSBpc3N1ZS4gKi8KKwkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCQkgICAgJiYgKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUFNfUE9MTCkpIHsKIAkJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CiAJCX0KIAkJYkFja1JlcXVpcmVkID0gRkFMU0U7Ci0JfQotCWVsc2UgLy8gQlRZUEVfTUdNVCBvciBCVFlQRV9EQVRBKG11c3QgYmUgTlVMTCBmcmFtZSkKKwl9IGVsc2UJCQkvKiBCVFlQRV9NR01UIG9yIEJUWVBFX0RBVEEobXVzdCBiZSBOVUxMIGZyYW1lKSAqLwogCXsKLQkJaWYgKHBIZWFkZXJfODAyXzExLT5BZGRyMVswXSAmIDB4MDEpIC8vIE1VTFRJQ0FTVCwgQlJPQURDQVNUCisJCS8qcEFkLT5TZXF1ZW5jZSsrOyAqLworCQkvKnBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBBZC0+U2VxdWVuY2U7ICovCisKKwkJaWYgKHBIZWFkZXJfODAyXzExLT5BZGRyMVswXSAmIDB4MDEpCS8qIE1VTFRJQ0FTVCwgQlJPQURDQVNUICovCiAJCXsKIAkJCWJBY2tSZXF1aXJlZCA9IEZBTFNFOwogCQkJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gMDsKLQkJfQotCQllbHNlCi0JCXsKKwkJfSBlbHNlIHsKIAkJCWJBY2tSZXF1aXJlZCA9IFRSVUU7Ci0JCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgTWxtZVJhdGUsIDE0KTsKLQkJCWlmIChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1BST0JFX1JTUCkKLQkJCXsKKwkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9CisJCQkgICAgUlRNUENhbGNEdXJhdGlvbihwQWQsIE1sbWVSYXRlLCAxNCk7CisJCQlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUFJPQkVfUlNQKQorCQkJICAgICYmIChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9PSBCVFlQRV9NR01UKSkgewogCQkJCWJJbnNlcnRUaW1lc3RhbXAgPSBUUlVFOworCQkJCWJBY2tSZXF1aXJlZCA9IEZBTFNFOwkvKiBEaXNhYmxlIEFDSyB0byBwcmV2ZW50IHJldHJ5IDB4MWYgZm9yIFByb2JlIFJlc3BvbnNlICovCisJCQl9IGVsc2UKKwkJCSAgICBpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09CisJCQkJIFNVQlRZUEVfUFJPQkVfUkVRKQorCQkJCSYmIChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9PSBCVFlQRV9NR01UKSkgeworCQkJCWJBY2tSZXF1aXJlZCA9IEZBTFNFOwkvKiBEaXNhYmxlIEFDSyB0byBwcmV2ZW50IHJldHJ5IDB4MWYgZm9yIFByb2JlIFJlcXVlc3QgKi8KIAkJCX0KIAkJfQogCX0KIAogCXBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBBZC0+U2VxdWVuY2UrKzsKLQlpZiAocEFkLT5TZXF1ZW5jZSA+MHhmZmYpCisJaWYgKHBBZC0+U2VxdWVuY2UgPiAweGZmZikKIAkJcEFkLT5TZXF1ZW5jZSA9IDA7CiAKLQkvLyBCZWZvcmUgcmFkYXIgZGV0ZWN0aW9uIGRvbmUsIG1nbXQgZnJhbWUgY2FuIG5vdCBiZSBzZW50IGJ1dCBwcm9iZSByZXEKLQkvLyBCZWNhdXNlIHdlIG5lZWQgdG8gdXNlIHByb2JlIHJlcSB0byB0cmlnZ2VyIGRyaXZlciB0byBzZW5kIHByb2JlIHJlcSBpbiBwYXNzaXZlIHNjYW4KKwkvKiBCZWZvcmUgcmFkYXIgZGV0ZWN0aW9uIGRvbmUsIG1nbXQgZnJhbWUgY2FuIG5vdCBiZSBzZW50IGJ1dCBwcm9iZSByZXEgKi8KKwkvKiBCZWNhdXNlIHdlIG5lZWQgdG8gdXNlIHByb2JlIHJlcSB0byB0cmlnZ2VyIGRyaXZlciB0byBzZW5kIHByb2JlIHJlcSBpbiBwYXNzaXZlIHNjYW4gKi8KIAlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlICE9IFNVQlRZUEVfUFJPQkVfUkVRKQotCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKLQkJJiYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIk1sbWVIYXJkVHJhbnNtaXQgLS0+IHJhZGFyIGRldGVjdCBub3QgaW4gbm9ybWFsIG1vZGUgISEhXG4iKSk7CisJICAgICYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQorCSAgICAmJiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlICE9IFJEX05PUk1BTF9NT0RFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIk1sbWVIYXJkVHJhbnNtaXQgLS0+IHJhZGFyIGRldGVjdCBub3QgaW4gbm9ybWFsIG1vZGUhXG4iKSk7CisvKiAgICAgICAgICAgICAgaWYgKCFJcnFTdGF0ZSkgKi8KIAkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1nbXRSaW5nTG9jayk7CiAJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJfQogCi0JLy8KLQkvLyBmaWxsIHNjYXR0ZXItYW5kLWdhdGhlciBidWZmZXIgbGlzdCBpbnRvIFRYRC4gSW50ZXJuYWxseSBjcmVhdGVkIE5ESVMgUEFDS0VUCi0JLy8gc2hvdWxkIGFsd2F5cyBoYXMgb25seSBvbmUgb2h5c2ljYWwgYnVmZmVyLCBhbmQgdGhlIHdob2xlIGZyYW1lIHNpemUgZXF1YWxzCi0JLy8gdG8gdGhlIGZpcnN0IHNjYXR0ZXIgYnVmZmVyIHNpemUKLQkvLworCS8qICovCisJLyogZmlsbCBzY2F0dGVyLWFuZC1nYXRoZXIgYnVmZmVyIGxpc3QgaW50byBUWEQuIEludGVybmFsbHkgY3JlYXRlZCBORElTIFBBQ0tFVCAqLworCS8qIHNob3VsZCBhbHdheXMgaGFzIG9ubHkgb25lIHBoeXNpY2FsIGJ1ZmZlciwgYW5kIHRoZSB3aG9sZSBmcmFtZSBzaXplIGVxdWFscyAqLworCS8qIHRvIHRoZSBmaXJzdCBzY2F0dGVyIGJ1ZmZlciBzaXplICovCisJLyogKi8KIAotCS8vIEluaXRpYWxpemUgVFggRGVzY3JpcHRvcgotCS8vIEZvciBpbnRlci1mcmFtZSBnYXAsIHRoZSBudW1iZXIgaXMgZm9yIHRoaXMgZnJhbWUgYW5kIG5leHQgZnJhbWUKLQkvLyBGb3IgTUxNRSByYXRlLCB3ZSB3aWxsIGZpeCBhcyAyTWIgdG8gbWF0Y2ggb3RoZXIgdmVuZG9yJ3MgaW1wbGVtZW50CisJLyogSW5pdGlhbGl6ZSBUWCBEZXNjcmlwdG9yICovCisJLyogRm9yIGludGVyLWZyYW1lIGdhcCwgdGhlIG51bWJlciBpcyBmb3IgdGhpcyBmcmFtZSBhbmQgbmV4dCBmcmFtZSAqLworCS8qIEZvciBNTE1FIHJhdGUsIHdlIHdpbGwgZml4IGFzIDJNYiB0byBtYXRjaCBvdGhlciB2ZW5kb3IncyBpbXBsZW1lbnQgKi8KKy8qICAgICAgcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSAxOyAqLwogCi0vLyBtYW5hZ2VtZW50IGZyYW1lIGRvZXNuJ3QgbmVlZCBlbmNyeXB0aW9uLiBzbyB1c2UgUkVTRVJWRURfV0NJRCBubyBtYXR0ZXIgdSBhcmUgc2VuZGluZyB0byBzcGVjaWZpYyB3Y2lkIG9yIG5vdC4KLQlpZiAocE1hY0VudHJ5ID09IE5VTEwpCi0JewotCQlSVE1QV3JpdGVUeFdJKHBBZCwgcEZpcnN0VHhXSSwgRkFMU0UsIEZBTFNFLCBiSW5zZXJ0VGltZXN0YW1wLCBGQUxTRSwgYkFja1JlcXVpcmVkLCBGQUxTRSwKLQkJMCwgUkVTRVJWRURfV0NJRCwgKFNyY0J1ZkxlbiAtIFRYSU5GT19TSVpFIC0gVFhXSV9TSVpFKSwgUElEX01HTVQsIDAsICAoVUNIQVIpcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUywgSUZTX0JBQ0tPRkYsIEZBTFNFLCAmcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0KTsKLQl9Ci0JZWxzZQotCXsKKy8qIG1hbmFnZW1lbnQgZnJhbWUgZG9lc24ndCBuZWVkIGVuY3J5cHRpb24uIHNvIHVzZSBSRVNFUlZFRF9XQ0lEIG5vIG1hdHRlciB1IGFyZSBzZW5kaW5nIHRvIHNwZWNpZmljIHdjaWQgb3Igbm90LiAqLworCVBJRCA9IFBJRF9NR01UOworCisJaWYgKHBNYWNFbnRyeSA9PSBOVUxMKSB7CisJCVJUTVBXcml0ZVR4V0kocEFkLCBwRmlyc3RUeFdJLCBGQUxTRSwgRkFMU0UsIGJJbnNlcnRUaW1lc3RhbXAsCisJCQkgICAgICBGQUxTRSwgYkFja1JlcXVpcmVkLCBGQUxTRSwgMCwgUkVTRVJWRURfV0NJRCwKKwkJCSAgICAgIChTcmNCdWZMZW4gLSBUWElORk9fU0laRSAtIFRYV0lfU0laRSksIFBJRCwgMCwKKwkJCSAgICAgICh1OClwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTLAorCQkJICAgICAgSUZTX0JBQ0tPRkYsIEZBTFNFLCAmcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0KTsKKwl9IGVsc2UgeworCQkvKiBkb250IHVzZSBsb3cgcmF0ZSB0byBzZW5kIFFvUyBOdWxsIGRhdGEgZnJhbWUgKi8KIAkJUlRNUFdyaXRlVHhXSShwQWQsIHBGaXJzdFR4V0ksIEZBTFNFLCBGQUxTRSwKLQkJCQkJYkluc2VydFRpbWVzdGFtcCwgRkFMU0UsIGJBY2tSZXF1aXJlZCwgRkFMU0UsCi0JCQkJCTAsIHBNYWNFbnRyeS0+QWlkLCAoU3JjQnVmTGVuIC0gVFhJTkZPX1NJWkUgLSBUWFdJX1NJWkUpLAotCQkJCQlwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MsIDAsCi0JCQkJCShVQ0hBUilwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MsCi0JCQkJCUlGU19CQUNLT0ZGLCBGQUxTRSwgJnBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlKTsKKwkJCSAgICAgIGJJbnNlcnRUaW1lc3RhbXAsIEZBTFNFLCBiQWNrUmVxdWlyZWQsIEZBTFNFLAorCQkJICAgICAgMCwgcE1hY0VudHJ5LT5BaWQsCisJCQkgICAgICAoU3JjQnVmTGVuIC0gVFhJTkZPX1NJWkUgLSBUWFdJX1NJWkUpLAorCQkJICAgICAgcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTLCAwLAorCQkJICAgICAgKHU4KXBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUywKKwkJCSAgICAgIElGU19CQUNLT0ZGLCBGQUxTRSwgJnBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlKTsKIAl9CiAKLQkvLyBOb3cgZG8gaGFyZHdhcmUtZGVwZW5lZCBraWNrIG91dC4KKwkvKiBOb3cgZG8gaGFyZHdhcmUtZGVwZW5lZCBraWNrIG91dC4gKi8KIAlIQUxfS2lja091dE1nbXRUeChwQWQsIFF1ZUlkeCwgcFBhY2tldCwgcFNyY0J1ZlZBLCBTcmNCdWZMZW4pOwogCi0JLy8gTWFrZSBzdXJlIHRvIHJlbGVhc2UgTUdNVCByaW5nIHJlc291cmNlCisJLyogTWFrZSBzdXJlIHRvIHJlbGVhc2UgTUdNVCByaW5nIHJlc291cmNlICovCisvKiAgICAgIGlmICghSXJxU3RhdGUpICovCiAJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1nbXRSaW5nTG9jayk7CiAJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKIAlOZXcgRGVRdWV1ZSBQcm9jZWR1cmVzLgpAQCAtNzA4LDE3OCArNTA2LDE1MyBAQAogCQkJCQkJCQkoMikuTm9ybWFsCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotc3RhdGljIFVDSEFSIFR4UGt0Q2xhc3NpZmljYXRpb24oCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gUE5ESVNfUEFDS0VUICBwUGFja2V0KQorc3RhdGljIHU4IFR4UGt0Q2xhc3NpZmljYXRpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB2b2lkICpwUGFja2V0KQogewotCVVDSEFSCQkJVHhGcmFtZVR5cGUgPSBUWF9VTktPV05fRlJBTUU7Ci0JVUNIQVIJCQlXY2lkOwotCU1BQ19UQUJMRV9FTlRSWQkqcE1hY0VudHJ5ID0gTlVMTDsKLQlCT09MRUFOCQkJYkhUUmF0ZSA9IEZBTFNFOworCXU4IFR4RnJhbWVUeXBlID0gVFhfVU5LT1dOX0ZSQU1FOworCXU4IFdjaWQ7CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcE1hY0VudHJ5ID0gTlVMTDsKKwlCT09MRUFOIGJIVFJhdGUgPSBGQUxTRTsKIAogCVdjaWQgPSBSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KTsKLQlpZiAoV2NpZCA9PSBNQ0FTVF9XQ0lEKQotCXsJLy8gSGFuZGxlIGZvciBSQSBpcyBCcm9hZGNhc3QvTXVsdGljYXN0IEFkZHJlc3MuCisJaWYgKFdjaWQgPT0gTUNBU1RfV0NJRCkgewkvKiBIYW5kbGUgZm9yIFJBIGlzIEJyb2FkY2FzdC9NdWx0aWNhc3QgQWRkcmVzcy4gKi8KIAkJcmV0dXJuIFRYX01DQVNUX0ZSQU1FOwogCX0KLQotCS8vIEhhbmRsZSBmb3IgdW5pY2FzdCBwYWNrZXRzCisJLyogSGFuZGxlIGZvciB1bmljYXN0IHBhY2tldHMgKi8KIAlwTWFjRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXTsKLQlpZiAoUlRNUF9HRVRfUEFDS0VUX0xPV1JBVEUocFBhY2tldCkpCi0JewkvLyBJdCdzIGEgc3BlY2lmaWMgcGFja2V0IG5lZWQgdG8gZm9yY2UgbG93IHJhdGUsIGkuZS4sIGJESENQRnJhbWUsIGJFQVBPTEZyYW1lLCBiV0FJRnJhbWUKKwlpZiAoUlRNUF9HRVRfUEFDS0VUX0xPV1JBVEUocFBhY2tldCkpIHsJLyogSXQncyBhIHNwZWNpZmljIHBhY2tldCBuZWVkIHRvIGZvcmNlIGxvdyByYXRlLCBpLmUuLCBiREhDUEZyYW1lLCBiRUFQT0xGcmFtZSwgYldBSUZyYW1lICovCiAJCVR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOwotCX0KLQllbHNlIGlmIChJU19IVF9SQVRFKHBNYWNFbnRyeSkpCi0JewkvLyBpdCdzIGEgMTFuIGNhcGFibGUgcGFja2V0CisJfSBlbHNlIGlmIChJU19IVF9SQVRFKHBNYWNFbnRyeSkpIHsJLyogaXQncyBhIDExbiBjYXBhYmxlIHBhY2tldCAqLwogCi0JCS8vIERlcGVuZHMgb24gSFRQaHlNb2RlIHRvIGNoZWNrIGlmIHRoZSBwZWVyIHN1cHBvcnQgdGhlIEhUUmF0ZSB0cmFuc21pc3Npb24uCi0JCS8vIAlDdXJyZW50bHkgZGlkbid0IHN1cHBvcnQgQS1NU0RVIGVtYmVkZGVkIGluIEEtTVBEVQorCQkvKiBEZXBlbmRzIG9uIEhUUGh5TW9kZSB0byBjaGVjayBpZiB0aGUgcGVlciBzdXBwb3J0IHRoZSBIVFJhdGUgdHJhbnNtaXNzaW9uLiAqLworCQkvKiAgICAgIEN1cnJlbnRseSBkaWRuJ3Qgc3VwcG9ydCBBLU1TRFUgZW1iZWRkZWQgaW4gQS1NUERVICovCiAJCWJIVFJhdGUgPSBUUlVFOwotCQlpZiAoUlRNUF9HRVRfUEFDS0VUX01PUkVEQVRBKHBQYWNrZXQpIHx8IChwTWFjRW50cnktPlBzTW9kZSA9PSBQV1JfU0FWRSkpCisJCWlmIChSVE1QX0dFVF9QQUNLRVRfTU9SRURBVEEocFBhY2tldCkKKwkJICAgIHx8IChwTWFjRW50cnktPlBzTW9kZSA9PSBQV1JfU0FWRSkpCiAJCQlUeEZyYW1lVHlwZSA9IFRYX0xFR0FDWV9GUkFNRTsKLSNpZmRlZiBVQVBTRF9BUF9TVVBQT1JUCi0JCWVsc2UgaWYgKFJUTVBfR0VUX1BBQ0tFVF9FT1NQKHBQYWNrZXQpKQotCQkJVHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7Ci0jZW5kaWYgLy8gVUFQU0RfQVBfU1VQUE9SVCAvLwotCQllbHNlIGlmKChwTWFjRW50cnktPlRYQkFiaXRtYXAgJiAoMTw8KFJUTVBfR0VUX1BBQ0tFVF9VUChwUGFja2V0KSkpKSAhPSAwKQorCQllbHNlIGlmICgocE1hY0VudHJ5LT4KKwkJCSAgVFhCQWJpdG1hcCAmICgxIDw8IChSVE1QX0dFVF9QQUNLRVRfVVAocFBhY2tldCkpKSkgIT0KKwkJCSAwKQogCQkJcmV0dXJuIFRYX0FNUERVX0ZSQU1FOwotCQllbHNlIGlmKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VEKSkKKwkJZWxzZSBpZiAoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcKKwkJCSAocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQpKQogCQkJcmV0dXJuIFRYX0FNU0RVX0ZSQU1FOwogCQllbHNlCiAJCQlUeEZyYW1lVHlwZSA9IFRYX0xFR0FDWV9GUkFNRTsKLQl9Ci0JZWxzZQotCXsJLy8gaXQncyBhIGxlZ2FjeSBiL2cgcGFja2V0LgotCQlpZiAoKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSkgJiYgcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkgJiYKLQkJCShSVE1QX0dFVF9QQUNLRVRfVFhSQVRFKHBQYWNrZXQpID49IFJBVEVfNikgJiYKLQkJCSghKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgJiYgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSkpKSkKLQkJewkvLyBpZiBwZWVyIHN1cHBvcnQgUmFsaW5rIEFnZ3JlZ2F0aW9uLCB3ZSB1c2UgaXQuCisJfSBlbHNlIHsJCS8qIGl0J3MgYSBsZWdhY3kgYi9nIHBhY2tldC4gKi8KKwkJaWYgKChDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX0FHR1JFR0FUSU9OX0NBUEFCTEUpICYmIHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpICYmIChSVE1QX0dFVF9QQUNLRVRfVFhSQVRFKHBQYWNrZXQpID49IFJBVEVfNikgJiYgKCEoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSkpKSB7CS8qIGlmIHBlZXIgc3VwcG9ydCBSYWxpbmsgQWdncmVnYXRpb24sIHdlIHVzZSBpdC4gKi8KIAkJCVR4RnJhbWVUeXBlID0gVFhfUkFMSU5LX0ZSQU1FOwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJVHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7CiAJCX0KIAl9CiAKLQkvLyBDdXJyZW50bHksIG91ciBmcmFnbWVudCBvbmx5IHN1cHBvcnQgd2hlbiBhIHVuaWNhc3QgcGFja2V0IHNlbmQgYXMgTk9ULUFSQUxJTkssIE5PVC1BTVNEVSBhbmQgTk9ULUFNUERVLgotCWlmICgoUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0KSA+IDEpICYmIChUeEZyYW1lVHlwZSA9PSBUWF9MRUdBQ1lfRlJBTUUpKQorCS8qIEN1cnJlbnRseSwgb3VyIGZyYWdtZW50IG9ubHkgc3VwcG9ydCB3aGVuIGEgdW5pY2FzdCBwYWNrZXQgc2VuZCBhcyBOT1QtQVJBTElOSywgTk9ULUFNU0RVIGFuZCBOT1QtQU1QRFUuICovCisJaWYgKChSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpID4gMSkKKwkgICAgJiYgKFR4RnJhbWVUeXBlID09IFRYX0xFR0FDWV9GUkFNRSkpCiAJCVR4RnJhbWVUeXBlID0gVFhfRlJBR19GUkFNRTsKIAogCXJldHVybiBUeEZyYW1lVHlwZTsKIH0KIAotCi1CT09MRUFOIFJUTVBfRmlsbFR4QmxrSW5mbygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBUWF9CTEsgKnBUeEJsaykKK0JPT0xFQU4gUlRNUF9GaWxsVHhCbGtJbmZvKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrKQogewotCVBBQ0tFVF9JTkZPCQkJUGFja2V0SW5mbzsKLQlQTkRJU19QQUNLRVQJCXBQYWNrZXQ7Ci0JUE1BQ19UQUJMRV9FTlRSWQlwTWFjRW50cnkgPSBOVUxMOworCXN0cnVjdCBydF9wYWNrZXRfaW5mbyBQYWNrZXRJbmZvOworCXZvaWQgKnBQYWNrZXQ7CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcE1hY0VudHJ5ID0gTlVMTDsKIAogCXBQYWNrZXQgPSBwVHhCbGstPnBQYWNrZXQ7Ci0JUlRNUF9RdWVyeVBhY2tldEluZm8ocFBhY2tldCwgJlBhY2tldEluZm8sICZwVHhCbGstPnBTcmNCdWZIZWFkZXIsICZwVHhCbGstPlNyY0J1Zkxlbik7CisJUlRNUF9RdWVyeVBhY2tldEluZm8ocFBhY2tldCwgJlBhY2tldEluZm8sICZwVHhCbGstPnBTcmNCdWZIZWFkZXIsCisJCQkgICAgICZwVHhCbGstPlNyY0J1Zkxlbik7CiAKLQlwVHhCbGstPldjaWQJIAkgCQk9IFJUTVBfR0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQpOwotCXBUeEJsay0+YXBpZHgJCSAJCT0gUlRNUF9HRVRfUEFDS0VUX0lGKHBQYWNrZXQpOwotCXBUeEJsay0+VXNlclByaW9yaXR5IAkJPSBSVE1QX0dFVF9QQUNLRVRfVVAocFBhY2tldCk7Ci0JcFR4QmxrLT5GcmFtZUdhcCA9IElGU19IVFRYT1A7CQkvLyBBU0lDIGRldGVybWluZSBGcmFtZSBHYXAKKwlwVHhCbGstPldjaWQgPSBSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KTsKKwlwVHhCbGstPmFwaWR4ID0gUlRNUF9HRVRfUEFDS0VUX0lGKHBQYWNrZXQpOworCXBUeEJsay0+VXNlclByaW9yaXR5ID0gUlRNUF9HRVRfUEFDS0VUX1VQKHBQYWNrZXQpOworCXBUeEJsay0+RnJhbWVHYXAgPSBJRlNfSFRUWE9QOwkvKiBBU0lDIGRldGVybWluZSBGcmFtZSBHYXAgKi8KIAogCWlmIChSVE1QX0dFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKHBUeEJsay0+cFBhY2tldCkpCiAJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iQ2xlYXJFQVBGcmFtZSk7CiAJZWxzZQogCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iQ2xlYXJFQVBGcmFtZSk7CiAKLQkvLyBEZWZhdWx0IHRvIGNsZWFyIHRoaXMgZmxhZworCS8qIERlZmF1bHQgdG8gY2xlYXIgdGhpcyBmbGFnICovCiAJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYkZvcmNlTm9uUW9TKTsKIAotCi0JaWYgKHBUeEJsay0+V2NpZCA9PSBNQ0FTVF9XQ0lEKQotCXsKKwlpZiAocFR4QmxrLT5XY2lkID09IE1DQVNUX1dDSUQpIHsKIAkJcFR4QmxrLT5wTWFjRW50cnkgPSBOVUxMOwogCQl7Ci0jaWZkZWYgTUNBU1RfUkFURV9TUEVDSUZJQwotCQkJUFVDSEFSIHBEQSA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKLQkJCWlmICgoKCpwREEgJiAweDAxKSA9PSAweDAxKSAmJiAoKnBEQSAhPSAweGZmKSkKLQkJCQlwVHhCbGstPnBUcmFuc21pdCA9ICZwQWQtPkNvbW1vbkNmZy5NQ2FzdFBoeU1vZGU7Ci0JCQllbHNlCi0jZW5kaWYgLy8gTUNBU1RfUkFURV9TUEVDSUZJQyAvLwotCQkJCXBUeEJsay0+cFRyYW5zbWl0ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbTUNBU1RfV0NJRF0uSFRQaHlNb2RlOworCQkJcFR4QmxrLT5wVHJhbnNtaXQgPQorCQkJICAgICZwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZTsKIAkJfQogCi0JCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7CS8vIEFja1JlcXVpcmVkID0gRkFMU0UsIHdoZW4gYnJvYWRjYXN0IHBhY2tldCBpbiBBZGhvYyBtb2RlLgotCQkvL1RYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iRm9yY2VMb3dSYXRlKTsKKwkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYkFja1JlcXVpcmVkKTsJLyogQWNrUmVxdWlyZWQgPSBGQUxTRSwgd2hlbiBicm9hZGNhc3QgcGFja2V0IGluIEFkaG9jIG1vZGUuICovCisJCS8qVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JGb3JjZUxvd1JhdGUpOyAqLwogCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iQWxsb3dGcmFnKTsKIAkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYldNTSk7Ci0JCWlmIChSVE1QX0dFVF9QQUNLRVRfTU9SRURBVEEocFBhY2tldCkpCi0JCXsKKwkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KSkgewogCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JNb3JlRGF0YSk7CiAJCX0KIAotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCXBUeEJsay0+cE1hY0VudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcFR4QmxrLT5XY2lkXTsKIAkJcFR4QmxrLT5wVHJhbnNtaXQgPSAmcFR4QmxrLT5wTWFjRW50cnktPkhUUGh5TW9kZTsKIAogCQlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKIAotCi0JCS8vIEZvciBhbGwgdW5pY2FzdCBwYWNrZXRzLCBuZWVkIEFjayB1bmxlc3MgdGhlIEFjayBQb2xpY3kgaXMgbm90IHNldCBhcyBOT1JNQUxfQUNLLgorCQkvKiBGb3IgYWxsIHVuaWNhc3QgcGFja2V0cywgbmVlZCBBY2sgdW5sZXNzIHRoZSBBY2sgUG9saWN5IGlzIG5vdCBzZXQgYXMgTk9STUFMX0FDSy4gKi8KIAkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkFja1BvbGljeVtwVHhCbGstPlF1ZUlkeF0gIT0gTk9STUFMX0FDSykKIAkJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7CiAJCWVsc2UKIAkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iQWNrUmVxdWlyZWQpOwogCi0JCXsKLQkJCS8vIElmIHN1cHBvcnQgV01NLCBlbmFibGUgaXQuCi0jaWZkZWYgUlQyODYwCi0JCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSkKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgJiYKLQkJCQlDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSkKLSNlbmRpZgotCQkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iV01NKTsKKwkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJgorCQkgICAgKEFESE9DX09OKHBBZCkpICYmCisJCSAgICAoUlhfRklMVEVSX1RFU1RfRkxBRyhwQWQsIGZSWF9GSUxURVJfQUNDRVBUX1BST01JU0NVT1VTKSkpIHsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5QU1BYbGluaykKKwkJCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iQWNrUmVxdWlyZWQpOwogCQl9CiAKLQkJaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfTEVHQUNZX0ZSQU1FKQogCQl7Ci0JCQlpZiAoIChSVE1QX0dFVF9QQUNLRVRfTE9XUkFURShwUGFja2V0KSkgfHwKLSAgICAgICAgICAgICAgICAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkgJiYgKHBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPT0gTU9ERV9DQ0spICYmIChwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gUkFURV8xKSkpCi0JCQl7CS8vIFNwZWNpZmljIHBhY2tldCwgaS5lLiwgYkRIQ1BGcmFtZSwgYkVBUE9MRnJhbWUsIGJXQUlGcmFtZSwgbmVlZCBmb3JjZSBsb3cgcmF0ZS4KLQkJCQlwVHhCbGstPnBUcmFuc21pdCA9ICZwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZTsKKwkJCXsKIAotCQkJCS8vIE1vZGlmeSB0aGUgV01NIGJpdCBmb3IgSUNWIGlzc3VlLiBJZiB3ZSBoYXZlIGEgcGFja2V0IHdpdGggRU9TUCBmaWVsZCBuZWVkIHRvIHNldCBhcyAxLCBob3cgdG8gaGFuZGxlIGl0Pz8/CisJCQkJLyogSWYgc3VwcG9ydCBXTU0sIGVuYWJsZSBpdC4gKi8KKwkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHCisJCQkJICAgIChwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkKKwkJCQkgICAgJiYgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LAorCQkJCQkJCSAgICAgICBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSkpCisJCQkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iV01NKTsKKworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2gpICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX0F1dG9SYXRlU3dpdGNoKTsgKi8KKwkJCX0KKwkJfQorCisJCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0xFR0FDWV9GUkFNRSkgeworCQkJaWYgKChSVE1QX0dFVF9QQUNLRVRfTE9XUkFURShwUGFja2V0KSkgfHwgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApICYmIChwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID09IE1PREVfQ0NLKSAmJiAocE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID09IFJBVEVfMSkpKSB7CS8qIFNwZWNpZmljIHBhY2tldCwgaS5lLiwgYkRIQ1BGcmFtZSwgYkVBUE9MRnJhbWUsIGJXQUlGcmFtZSwgbmVlZCBmb3JjZSBsb3cgcmF0ZS4gKi8KKwkJCQlwVHhCbGstPnBUcmFuc21pdCA9CisJCQkJICAgICZwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZTsKKworCQkJCS8qIE1vZGlmeSB0aGUgV01NIGJpdCBmb3IgSUNWIGlzc3VlLiBJZiB3ZSBoYXZlIGEgcGFja2V0IHdpdGggRU9TUCBmaWVsZCBuZWVkIHRvIHNldCBhcyAxLCBob3cgdG8gaGFuZGxlIGl0Pz8/ICovCiAJCQkJaWYgKElTX0hUX1NUQShwVHhCbGstPnBNYWNFbnRyeSkgJiYKLQkJCQkJKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQpKSAmJgotCQkJCQkoKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgPT0gVFJVRSkgJiYgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSkpKQorCQkJCSAgICAoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcKKwkJCQkgICAgIChwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKSkKKwkJCQkgICAgJiYgKChwQWQtPkNvbW1vbkNmZy5iUmRnID09IFRSVUUpCisJCQkJCSYmIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwKKwkJCQkJCQkJICAgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpKSkKIAkJCQl7CiAJCQkJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JXTU0pOwotCQkJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYkZvcmNlTm9uUW9TKTsKKwkJCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywKKwkJCQkJCQlmVFhfYkZvcmNlTm9uUW9TKTsKIAkJCQl9CiAJCQl9CiAKLQkJCWlmICggKElTX0hUX1JBVEUocE1hY0VudHJ5KSA9PSBGQUxTRSkgJiYKLQkJCQkoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19QSUdHWUJBQ0tfQ0FQQUJMRSkpKQotCQkJewkvLyBDdXJyZW50bHkgcGlnZ3ktYmFjayBvbmx5IHN1cHBvcnQgd2hlbiBwZWVyIGlzIG9wZXJhdGUgaW4gYi9nIG1vZGUuCisJCQlpZiAoKElTX0hUX1JBVEUocE1hY0VudHJ5KSA9PSBGQUxTRSkgJiYgKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUElHR1lCQUNLX0NBUEFCTEUpKSkgewkvKiBDdXJyZW50bHkgcGlnZ3ktYmFjayBvbmx5IHN1cHBvcnQgd2hlbiBwZWVyIGlzIG9wZXJhdGUgaW4gYi9nIG1vZGUuICovCiAJCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JQaWdneUJhY2spOwogCQkJfQogCi0JCQlpZiAoUlRNUF9HRVRfUEFDS0VUX01PUkVEQVRBKHBQYWNrZXQpKQotCQkJeworCQkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KSkgewogCQkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iTW9yZURhdGEpOwogCQkJfQotI2lmZGVmIFVBUFNEX0FQX1NVUFBPUlQKLQkJCWlmIChSVE1QX0dFVF9QQUNLRVRfRU9TUChwUGFja2V0KSkKLQkJCXsKLQkJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYldNTV9VQVBTRF9FT1NQKTsKLQkJCX0KLSNlbmRpZiAvLyBVQVBTRF9BUF9TVVBQT1JUIC8vCi0JCX0KLQkJZWxzZSBpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9GUkFHX0ZSQU1FKQotCQl7CisJCX0gZWxzZSBpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9GUkFHX0ZSQU1FKSB7CiAJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYkFsbG93RnJhZyk7CiAJCX0KIApAQCAtODg5LDQxICs2NjIsMzMgQEAKIAlyZXR1cm4gVFJVRTsKIH0KIAotCi1CT09MRUFOIENhbkRvQWdncmVnYXRlVHJhbnNtaXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gTkRJU19QQUNLRVQgKnBQYWNrZXQsCi0JSU4gVFhfQkxLCQkqcFR4QmxrKQorQk9PTEVBTiBDYW5Eb0FnZ3JlZ2F0ZVRyYW5zbWl0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgICBjaGFyICogcFBhY2tldCwgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrKQogewogCi0JLy9wcmludGsoIkNoZWNrIGlmIGNhbiBkbyBhZ2dyZWdhdGlvbiEgVHhGcmFtZVR5cGU9JWQhXG4iLCBwVHhCbGstPlR4RnJhbWVUeXBlKTsKKwkvKkRCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoZWNrIGlmIGNhbiBkbyBhZ2dyZWdhdGlvbiEgVHhGcmFtZVR5cGU9JWQhXG4iLCBwVHhCbGstPlR4RnJhbWVUeXBlKSk7ICovCiAKIAlpZiAoUlRNUF9HRVRfUEFDS0VUX1dDSUQocFBhY2tldCkgPT0gTUNBU1RfV0NJRCkKIAkJcmV0dXJuIEZBTFNFOwogCiAJaWYgKFJUTVBfR0VUX1BBQ0tFVF9ESENQKHBQYWNrZXQpIHx8Ci0JCVJUTVBfR0VUX1BBQ0tFVF9FQVBPTChwUGFja2V0KSB8fAotCQlSVE1QX0dFVF9QQUNLRVRfV0FJKHBQYWNrZXQpKQorCSAgICBSVE1QX0dFVF9QQUNLRVRfRUFQT0wocFBhY2tldCkgfHwgUlRNUF9HRVRfUEFDS0VUX1dBSShwUGFja2V0KSkKIAkJcmV0dXJuIEZBTFNFOwogCi0JaWYgKChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNU0RVX0ZSQU1FKSAmJgotCQkoKHBUeEJsay0+VG90YWxGcmFtZUxlbiArIEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpKT4gKFJYX0JVRkZFUl9BR0dSRVNJWkUgLSAxMDApKSkKLQl7CS8vIEZvciBBTVNEVSwgYWxsb3cgdGhlIHBhY2tldHMgd2l0aCB0b3RhbCBsZW5ndGggPCBtYXgtYW1zZHUgc2l6ZQorCWlmICgocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkgJiYgKChwVHhCbGstPlRvdGFsRnJhbWVMZW4gKyBHRVRfT1NfUEtUX0xFTihwUGFja2V0KSkgPiAoUlhfQlVGRkVSX0FHR1JFU0laRSAtIDEwMCkpKSB7CS8qIEZvciBBTVNEVSwgYWxsb3cgdGhlIHBhY2tldHMgd2l0aCB0b3RhbCBsZW5ndGggPCBtYXgtYW1zZHUgc2l6ZSAqLwogCQlyZXR1cm4gRkFMU0U7CiAJfQogCi0JaWYgKChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX1JBTElOS19GUkFNRSkgJiYKLQkJKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlciA9PSAyKSkKLQl7CS8vIEZvciBSQUxJTkstQWdncmVnYXRpb24sIGFsbG93IHR3byBmcmFtZXMgaW4gb25lIGJhdGNoLgorCWlmICgocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUpICYmIChwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIgPT0gMikpIHsJLyogRm9yIFJBTElOSy1BZ2dyZWdhdGlvbiwgYWxsb3cgdHdvIGZyYW1lcyBpbiBvbmUgYmF0Y2guICovCiAJCXJldHVybiBGQUxTRTsKIAl9CiAKLQlpZiAoKElORlJBX09OKHBBZCkpICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkgLy8gbXVzdCBiZSB1bmljYXN0IHRvIEFQCisJaWYgKChJTkZSQV9PTihwQWQpKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCS8qIG11c3QgYmUgdW5pY2FzdCB0byBBUCAqLwogCQlyZXR1cm4gVFJVRTsKIAllbHNlCiAJCXJldHVybiBGQUxTRTsKLX0KIAorfQogCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtOTQ3LDUzICs3MTIsNDIgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgUlRNUERlUXVldWVQYWNrZXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIEJPT0xFQU4gICAgICAgICBiSW50Q29udGV4dCwKLQlJTiAgVUNIQVIJCQlRSWR4LCAvKiBCdWxrT3V0UGlwZUlkICovCi0JSU4gIFVDSEFSICAgICAgICAgICBNYXhfVHhfUGFja2V0cykKK3ZvaWQgUlRNUERlUXVldWVQYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBCT09MRUFOIGJJbnRDb250ZXh0LCB1OCBRSWR4LAkvKiBCdWxrT3V0UGlwZUlkICovCisJCSAgICAgICB1OCBNYXhfVHhfUGFja2V0cykKIHsKLQlQUVVFVUVfRU5UUlkgICAgcEVudHJ5ID0gTlVMTDsKLQlQTkRJU19QQUNLRVQgCXBQYWNrZXQ7Ci0JTkRJU19TVEFUVVMgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JVUNIQVIgICAgICAgICAgIENvdW50PTA7Ci0JUFFVRVVFX0hFQURFUiAgIHBRdWV1ZTsKLQlVTE9ORyAgICAgICAgICAgRnJlZU51bWJlcltOVU1fT0ZfVFhfUklOR107Ci0JVUNIQVIJCQlRdWVJZHgsIHNRSWR4LCBlUUlkeDsKLQl1bnNpZ25lZCBsb25nCUlycUZsYWdzID0gMDsKLQlCT09MRUFOCQkJaGFzVHhEZXNjID0gRkFMU0U7Ci0JVFhfQkxLCQkJVHhCbGs7Ci0JVFhfQkxLCQkJKnBUeEJsazsKKwlzdHJ1Y3QgcnRfcXVldWVfZW50cnkgKnBFbnRyeSA9IE5VTEw7CisJdm9pZCAqcFBhY2tldDsKKwlpbnQgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwl1OCBDb3VudCA9IDA7CisJc3RydWN0IHJ0X3F1ZXVlX2hlYWRlciAqcFF1ZXVlOworCXVuc2lnbmVkIGxvbmcgRnJlZU51bWJlcltOVU1fT0ZfVFhfUklOR107CisJdTggUXVlSWR4LCBzUUlkeCwgZVFJZHg7CisJdW5zaWduZWQgbG9uZyBJcnFGbGFncyA9IDA7CisJQk9PTEVBTiBoYXNUeERlc2MgPSBGQUxTRTsKKwlzdHJ1Y3QgcnRfdHhfYmxrIFR4QmxrOworCXN0cnVjdCBydF90eF9ibGsgKnBUeEJsazsKIAotCi0KLQlpZiAoUUlkeCA9PSBOVU1fT0ZfVFhfUklORykKLQl7CisJaWYgKFFJZHggPT0gTlVNX09GX1RYX1JJTkcpIHsKIAkJc1FJZHggPSAwOwotLy9QUyBwYWNrZXRzIHVzZSBIQ0NBIHF1ZXVlIHdoZW4gZGVxdWV1ZSBmcm9tIFBTIHVuaWNhc3QgcXVldWUgKFdpRmkgV1BBMiBNQTlfRFQxIGZvciBNYXJ2ZWxsIEIgU1RBKQotCQllUUlkeCA9IDM7CS8vIDQgQUNzLCBzdGFydCBmcm9tIDAuCi0JfQotCWVsc2UKLQl7CisJCWVRSWR4ID0gMzsJLyogNCBBQ3MsIHN0YXJ0IGZyb20gMC4gKi8KKwl9IGVsc2UgewogCQlzUUlkeCA9IGVRSWR4ID0gUUlkeDsKIAl9CiAKLQlmb3IgKFF1ZUlkeD1zUUlkeDsgUXVlSWR4IDw9IGVRSWR4OyBRdWVJZHgrKykKLQl7Ci0JCUNvdW50PTA7CisJZm9yIChRdWVJZHggPSBzUUlkeDsgUXVlSWR4IDw9IGVRSWR4OyBRdWVJZHgrKykgeworCQlDb3VudCA9IDA7CiAKLQkJUlQyOFhYX1NUQVJUX0RFUVVFVUUocEFkLCBRdWVJZHgsIElycUZsYWdzKTsKKwkJUlRNUF9TVEFSVF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBJcnFGbGFncyk7CiAKLQotCQl3aGlsZSAoMSkKLQkJewotCQkJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTIHwKLQkJCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8Ci0JCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8Ci0JCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKLQkJCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCi0JCQl7Ci0JCQkJUlQyOFhYX1NUT1BfREVRVUVVRShwQWQsIFF1ZUlkeCwgSXJxRmxhZ3MpOworCQl3aGlsZSAoMSkgeworCQkJaWYgKChSVE1QX1RFU1RfRkxBRworCQkJICAgICAocEFkLAorCQkJICAgICAgKGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MgfAorCQkJICAgICAgIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGIHwKKwkJCSAgICAgICBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCSAgICAgICBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJICAgICAgIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkgeworCQkJCVJUTVBfU1RPUF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBJcnFGbGFncyk7CiAJCQkJcmV0dXJuOwogCQkJfQogCkBAIC0xMDAxLDQzICs3NTUsNDcgQEAKIAkJCQlicmVhazsKIAogCQkJREVRVUVVRV9MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOwotCQkJaWYgKCZwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdID09IE5VTEwpCi0JCQl7Ci0JCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisJCQlpZiAoJnBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0gPT0gTlVMTCkgeworCQkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwKKwkJCQkJICAgICAgIElycUZsYWdzKTsKIAkJCQlicmVhazsKIAkJCX0KLSNpZmRlZiBSVDI4NjAKKyNpZmRlZiBSVE1QX01BQ19QQ0kKIAkJCUZyZWVOdW1iZXJbUXVlSWR4XSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKIAotCi0JCQlpZiAoRnJlZU51bWJlcltRdWVJZHhdIDw9IDUpCi0JCQl7Ci0JCQkJLy8gZnJlZSBUeChRdWVJZHgpIHJlc291cmNlcworCQkJaWYgKEZyZWVOdW1iZXJbUXVlSWR4XSA8PSA1KSB7CisJCQkJLyogZnJlZSBUeChRdWVJZHgpIHJlc291cmNlcyAqLwogCQkJCVJUTVBGcmVlVFhEVXBvblR4RG1hRG9uZShwQWQsIFF1ZUlkeCk7Ci0JCQkJRnJlZU51bWJlcltRdWVJZHhdID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOworCQkJCUZyZWVOdW1iZXJbUXVlSWR4XSA9CisJCQkJICAgIEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKIAkJCX0KLSNlbmRpZiAvKiBSVDI4NjAgKi8KLQkJCS8vIHByb2JlIHRoZSBRdWV1ZSBIZWFkCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisKKwkJCS8qIHByb2JlIHRoZSBRdWV1ZSBIZWFkICovCiAJCQlwUXVldWUgPSAmcEFkLT5UeFN3UXVldWVbUXVlSWR4XTsKLQkJCWlmICgocEVudHJ5ID0gcFF1ZXVlLT5IZWFkKSA9PSBOVUxMKQotCQkJewotCQkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOworCQkJaWYgKChwRW50cnkgPSBwUXVldWUtPkhlYWQpID09IE5VTEwpIHsKKwkJCQlERVFVRVVFX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgYkludENvbnRleHQsCisJCQkJCSAgICAgICBJcnFGbGFncyk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKIAkJCXBUeEJsayA9ICZUeEJsazsKLQkJCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpcFR4QmxrLCBzaXplb2YoVFhfQkxLKSk7CisJCQlOZGlzWmVyb01lbW9yeSgodTggKilwVHhCbGssIHNpemVvZihzdHJ1Y3QgcnRfdHhfYmxrKSk7CisJCQkvKkluaXRpYWxpemVRdWV1ZUhlYWRlcigmcFR4QmxrLT5UeFBhY2tldExpc3QpOyAgICAgICAgIC8vIERpZG4ndCBuZWVkIGl0IGJlY2F1c2Ugd2UgYWxyZWFkeSBtZW16ZXJvIGl0LiAqLwogCQkJcFR4QmxrLT5RdWVJZHggPSBRdWVJZHg7CiAKLQkJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QS1QocEVudHJ5KTsKKwkJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocEVudHJ5KTsKIAotCQkJLy8gRWFybHkgY2hlY2sgdG8gbWFrZSBzdXJlIHdlIGhhdmUgZW5vZ3VoIFR4IFJlc291cmNlLgotCQkJaGFzVHhEZXNjID0gUlQyOFhYX0hBU19FTk9VR0hfRlJFRV9ERVNDKHBBZCwgcFR4QmxrLCBGcmVlTnVtYmVyW1F1ZUlkeF0sIHBQYWNrZXQpOwotCQkJaWYgKCFoYXNUeERlc2MpCi0JCQl7CisJCQkvKiBFYXJseSBjaGVjayB0byBtYWtlIHN1cmUgd2UgaGF2ZSBlbm9ndWggVHggUmVzb3VyY2UuICovCisJCQloYXNUeERlc2MgPQorCQkJICAgIFJUTVBfSEFTX0VOT1VHSF9GUkVFX0RFU0MocEFkLCBwVHhCbGssCisJCQkJCQkgICAgICBGcmVlTnVtYmVyW1F1ZUlkeF0sCisJCQkJCQkgICAgICBwUGFja2V0KTsKKwkJCWlmICghaGFzVHhEZXNjKSB7CiAJCQkJcEFkLT5Qcml2YXRlSW5mby5UeFJpbmdGdWxsQ250Kys7CiAKLQkJCQlERVFVRVVFX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgYkludENvbnRleHQsIElycUZsYWdzKTsKKwkJCQlERVFVRVVFX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgYkludENvbnRleHQsCisJCQkJCSAgICAgICBJcnFGbGFncyk7CiAKIAkJCQlicmVhazsKIAkJCX0KQEAgLTEwNDUsNzQgKzgwMyw4OSBAQAogCQkJcFR4QmxrLT5UeEZyYW1lVHlwZSA9IFR4UGt0Q2xhc3NpZmljYXRpb24ocEFkLCBwUGFja2V0KTsKIAkJCXBFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZShwUXVldWUpOwogCQkJcFR4QmxrLT5Ub3RhbEZyYW1lTnVtKys7Ci0JCQlwVHhCbGstPlRvdGFsRnJhZ051bSArPSBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpOwkvLyBUaGUgcmVhbCBmcmFnbWVudCBudW1iZXIgbWF5YmUgdmFyeQorCQkJcFR4QmxrLT5Ub3RhbEZyYWdOdW0gKz0gUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0KTsJLyogVGhlIHJlYWwgZnJhZ21lbnQgbnVtYmVyIG1heWJlIHZhcnkgKi8KIAkJCXBUeEJsay0+VG90YWxGcmFtZUxlbiArPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKIAkJCXBUeEJsay0+cFBhY2tldCA9IHBQYWNrZXQ7Ci0JCQlJbnNlcnRUYWlsUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0LCBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkpOworCQkJSW5zZXJ0VGFpbFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCwKKwkJCQkJUEFDS0VUX1RPX1FVRVVFX0VOVFJZKHBQYWNrZXQpKTsKIAotCQkJaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfUkFMSU5LX0ZSQU1FIHx8IHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1TRFVfRlJBTUUpCi0JCQl7Ci0JCQkJLy8gRW5oYW5jZSBTVyBBZ2dyZWdhdGlvbiBNZWNoYW5pc20KLQkJCQlpZiAoTkVFRF9RVUVVRV9CQUNLX0ZPUl9BR0cocEFkLCBRdWVJZHgsIEZyZWVOdW1iZXJbUXVlSWR4XSwgcFR4QmxrLT5UeEZyYW1lVHlwZSkpCi0JCQkJewotCQkJCQlJbnNlcnRIZWFkUXVldWUocFF1ZXVlLCBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkpOwotCQkJCQlERVFVRVVFX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgYkludENvbnRleHQsIElycUZsYWdzKTsKKwkJCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX1JBTElOS19GUkFNRQorCQkJICAgIHx8IHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1TRFVfRlJBTUUpIHsKKwkJCQkvKiBFbmhhbmNlIFNXIEFnZ3JlZ2F0aW9uIE1lY2hhbmlzbSAqLworCQkJCWlmIChORUVEX1FVRVVFX0JBQ0tfRk9SX0FHRworCQkJCSAgICAocEFkLCBRdWVJZHgsIEZyZWVOdW1iZXJbUXVlSWR4XSwKKwkJCQkgICAgIHBUeEJsay0+VHhGcmFtZVR5cGUpKSB7CisJCQkJCUluc2VydEhlYWRRdWV1ZShwUXVldWUsCisJCQkJCQkJUEFDS0VUX1RPX1FVRVVFX0VOVFJZCisJCQkJCQkJKHBQYWNrZXQpKTsKKwkJCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssCisJCQkJCQkgICAgICAgYkludENvbnRleHQsIElycUZsYWdzKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCi0JCQkJZG97Ci0JCQkJCWlmKChwRW50cnkgPSBwUXVldWUtPkhlYWQpID09IE5VTEwpCisJCQkJZG8geworCQkJCQlpZiAoKHBFbnRyeSA9IHBRdWV1ZS0+SGVhZCkgPT0gTlVMTCkKIAkJCQkJCWJyZWFrOwogCi0JCQkJCS8vIEZvciBUWF9BTVNEVV9GUkFNRS9UWF9SQUxJTktfRlJBTUUsIE5lZWQgdG8gY2hlY2sgaWYgbmV4dCBwYWtjZXQgY2FuIGRvIGFnZ3JlZ2F0aW9uLgotCQkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEtUKHBFbnRyeSk7Ci0JCQkJCUZyZWVOdW1iZXJbUXVlSWR4XSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKLQkJCQkJaGFzVHhEZXNjID0gUlQyOFhYX0hBU19FTk9VR0hfRlJFRV9ERVNDKHBBZCwgcFR4QmxrLCBGcmVlTnVtYmVyW1F1ZUlkeF0sIHBQYWNrZXQpOwotCQkJCQlpZiAoKGhhc1R4RGVzYyA9PSBGQUxTRSkgfHwgKENhbkRvQWdncmVnYXRlVHJhbnNtaXQocEFkLCBwUGFja2V0LCBwVHhCbGspID09IEZBTFNFKSkKKwkJCQkJLyogRm9yIFRYX0FNU0RVX0ZSQU1FL1RYX1JBTElOS19GUkFNRSwgTmVlZCB0byBjaGVjayBpZiBuZXh0IHBha2NldCBjYW4gZG8gYWdncmVnYXRpb24uICovCisJCQkJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocEVudHJ5KTsKKwkJCQkJRnJlZU51bWJlcltRdWVJZHhdID0KKwkJCQkJICAgIEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKwkJCQkJaGFzVHhEZXNjID0KKwkJCQkJICAgIFJUTVBfSEFTX0VOT1VHSF9GUkVFX0RFU0MocEFkLAorCQkJCQkJCQkgICAgICBwVHhCbGssCisJCQkJCQkJCSAgICAgIEZyZWVOdW1iZXIKKwkJCQkJCQkJICAgICAgW1F1ZUlkeF0sCisJCQkJCQkJCSAgICAgIHBQYWNrZXQpOworCQkJCQlpZiAoKGhhc1R4RGVzYyA9PSBGQUxTRSkKKwkJCQkJICAgIHx8CisJCQkJCSAgICAoQ2FuRG9BZ2dyZWdhdGVUcmFuc21pdAorCQkJCQkgICAgIChwQWQsIHBQYWNrZXQsIHBUeEJsaykgPT0gRkFMU0UpKQogCQkJCQkJYnJlYWs7CiAKLQkJCQkJLy9SZW1vdmUgdGhlIHBhY2tldCBmcm9tIHRoZSBUeFN3UXVldWUgYW5kIGluc2VydCBpbnRvIHBUeEJsaworCQkJCQkvKlJlbW92ZSB0aGUgcGFja2V0IGZyb20gdGhlIFR4U3dRdWV1ZSBhbmQgaW5zZXJ0IGludG8gcFR4QmxrICovCiAJCQkJCXBFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZShwUXVldWUpOwogCQkJCQlBU1NFUlQocEVudHJ5KTsKLQkJCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BLVChwRW50cnkpOworCQkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBFbnRyeSk7CiAJCQkJCXBUeEJsay0+VG90YWxGcmFtZU51bSsrOwotCQkJCQlwVHhCbGstPlRvdGFsRnJhZ051bSArPSBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpOwkvLyBUaGUgcmVhbCBmcmFnbWVudCBudW1iZXIgbWF5YmUgdmFyeQotCQkJCQlwVHhCbGstPlRvdGFsRnJhbWVMZW4gKz0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7Ci0JCQkJCUluc2VydFRhaWxRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QsIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSk7Ci0JCQkJfXdoaWxlKDEpOworCQkJCQlwVHhCbGstPlRvdGFsRnJhZ051bSArPSBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpOwkvKiBUaGUgcmVhbCBmcmFnbWVudCBudW1iZXIgbWF5YmUgdmFyeSAqLworCQkJCQlwVHhCbGstPlRvdGFsRnJhbWVMZW4gKz0KKwkJCQkJICAgIEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworCQkJCQlJbnNlcnRUYWlsUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0LAorCQkJCQkJCVBBQ0tFVF9UT19RVUVVRV9FTlRSWQorCQkJCQkJCShwUGFja2V0KSk7CisJCQkJfSB3aGlsZSAoMSk7CiAKIAkJCQlpZiAocFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyID09IDEpCiAJCQkJCXBUeEJsay0+VHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7CiAJCQl9Ci0KLSNpZmRlZiBSVDI4NzAKKyNpZmRlZiBSVE1QX01BQ19VU0IKIAkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOwotI2VuZGlmIC8vIFJUMjg3MCAvLwotCisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAJCQlDb3VudCArPSBwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXI7CiAKLQkJCS8vIERvIEhhcmRUcmFuc21pdCBub3cuCisJCQkvKiBEbyBIYXJkVHJhbnNtaXQgbm93LiAqLwogCQkJU3RhdHVzID0gU1RBSGFyZFRyYW5zbWl0KHBBZCwgcFR4QmxrLCBRdWVJZHgpOwogCi0jaWZkZWYgUlQyODYwCisjaWZkZWYgUlRNUF9NQUNfUENJCiAJCQlERVFVRVVFX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgYkludENvbnRleHQsIElycUZsYWdzKTsKLQkJCS8vIHN0YXRpYyByYXRlIGFsc28gbmVlZCBOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMoKSBmdW5jdGlvbi4KLQkJCS8vaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkpCi0JCQkJTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKHBBZCk7Ci0jZW5kaWYKKwkJCS8qIHN0YXRpYyByYXRlIGFsc28gbmVlZCBOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMoKSBmdW5jdGlvbi4gKi8KKwkJCS8qaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkpICovCisJCQlOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMocEFkKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKwogCQl9CiAKLQkJUlQyOFhYX1NUT1BfREVRVUVVRShwQWQsIFF1ZUlkeCwgSXJxRmxhZ3MpOworCQlSVE1QX1NUT1BfREVRVUVVRShwQWQsIFF1ZUlkeCwgSXJxRmxhZ3MpOwogCi0jaWZkZWYgUlQyODcwCisjaWZkZWYgUlRNUF9NQUNfVVNCCiAJCWlmICghaGFzVHhEZXNjKQogCQkJUlRVU0JLaWNrQnVsa091dChwQWQpOwotI2VuZGlmIC8vIFJUMjg3MCAvLworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCX0KIAogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTExMzUsNDAgKzkwOCwzNyBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVVNIT1JUCVJUTVBDYWxjRHVyYXRpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlSYXRlLAotCUlOCVVMT05HCQkJU2l6ZSkKK3UxNiBSVE1QQ2FsY0R1cmF0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggUmF0ZSwgdW5zaWduZWQgbG9uZyBTaXplKQogewotCVVMT05HCUR1cmF0aW9uID0gMDsKKwl1bnNpZ25lZCBsb25nIER1cmF0aW9uID0gMDsKIAotCWlmIChSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpIC8vIENDSworCWlmIChSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpCS8qIENDSyAqLwogCXsKLQkJaWYgKChSYXRlID4gUkFURV8xKSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCkpCi0JCQlEdXJhdGlvbiA9IDk2OwkvLyA3MisyNCBwcmVhbWJsZStwbGNwCisJCWlmICgoUmF0ZSA+IFJBVEVfMSkKKwkJICAgICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsCisJCQkJCSAgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpKQorCQkJRHVyYXRpb24gPSA5NjsJLyogNzIrMjQgcHJlYW1ibGUrcGxjcCAqLwogCQllbHNlCi0JCQlEdXJhdGlvbiA9IDE5MjsgLy8gMTQ0KzQ4IHByZWFtYmxlK3BsY3AKKwkJCUR1cmF0aW9uID0gMTkyOwkvKiAxNDQrNDggcHJlYW1ibGUrcGxjcCAqLwogCi0JCUR1cmF0aW9uICs9IChVU0hPUlQpKChTaXplIDw8IDQpIC8gUmF0ZUlkVG81MDBLYnBzW1JhdGVdKTsKKwkJRHVyYXRpb24gKz0gKHUxNikoKFNpemUgPDwgNCkgLyBSYXRlSWRUbzUwMEticHNbUmF0ZV0pOwogCQlpZiAoKFNpemUgPDwgNCkgJSBSYXRlSWRUbzUwMEticHNbUmF0ZV0pCi0JCQlEdXJhdGlvbiArKzsKLQl9Ci0JZWxzZSBpZiAoUmF0ZSA8PSBSQVRFX0xBU1RfT0ZETV9SQVRFKS8vIE9GRE0gcmF0ZXMKKwkJCUR1cmF0aW9uKys7CisJfSBlbHNlIGlmIChSYXRlIDw9IFJBVEVfTEFTVF9PRkRNX1JBVEUpCS8qIE9GRE0gcmF0ZXMgKi8KIAl7Ci0JCUR1cmF0aW9uID0gMjAgKyA2OwkJLy8gMTYrNCBwcmVhbWJsZStwbGNwICsgU2lnbmFsIEV4dGVuc2lvbgotCQlEdXJhdGlvbiArPSA0ICogKFVTSE9SVCkoKDExICsgU2l6ZSAqIDQpIC8gUmF0ZUlkVG81MDBLYnBzW1JhdGVdKTsKKwkJRHVyYXRpb24gPSAyMCArIDY7CS8qIDE2KzQgcHJlYW1ibGUrcGxjcCArIFNpZ25hbCBFeHRlbnNpb24gKi8KKwkJRHVyYXRpb24gKz0KKwkJICAgIDQgKiAodTE2KSgoMTEgKyBTaXplICogNCkgLyBSYXRlSWRUbzUwMEticHNbUmF0ZV0pOwogCQlpZiAoKDExICsgU2l6ZSAqIDQpICUgUmF0ZUlkVG81MDBLYnBzW1JhdGVdKQogCQkJRHVyYXRpb24gKz0gNDsKLQl9Ci0JZWxzZQkvL21pbW8gcmF0ZQorCX0gZWxzZQkJCS8qbWltbyByYXRlICovCiAJewotCQlEdXJhdGlvbiA9IDIwICsgNjsJCS8vIDE2KzQgcHJlYW1ibGUrcGxjcCArIFNpZ25hbCBFeHRlbnNpb24KKwkJRHVyYXRpb24gPSAyMCArIDY7CS8qIDE2KzQgcHJlYW1ibGUrcGxjcCArIFNpZ25hbCBFeHRlbnNpb24gKi8KIAl9CiAKLQlyZXR1cm4gKFVTSE9SVClEdXJhdGlvbjsKKwlyZXR1cm4gKHUxNilEdXJhdGlvbjsKIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0xMTk0LDU4ICs5NjQsNTMgQEAKIAlJUlFMID0gUEFTU0lWRV9MRVZFTAogCUlSUUwgPSBESVNQQVRDSF9MRVZFTAogCi0gICAgU2VlIGFsc28gOiBCQVNtYXJ0SGFyZFRyYW5zbWl0KCkgICAgISEhCisgICAgU2VlIGFsc28gOiBCQVNtYXJ0SGFyZFRyYW5zbWl0KCkgICAgIQogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBSVE1QV3JpdGVUeFdJKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBUWFdJX1NUUlVDIAlwT3V0VHhXSSwKLQlJTglCT09MRUFOCQkJRlJBRywKLQlJTglCT09MRUFOCQkJQ0ZBQ0ssCi0JSU4JQk9PTEVBTgkJCUluc1RpbWVzdGFtcCwKLQlJTglCT09MRUFOIAkJQU1QRFUsCi0JSU4JQk9PTEVBTiAJCUFjaywKLQlJTglCT09MRUFOIAkJTlNlcSwJCS8vIEhXIG5ldyBhIHNlcXVlbmNlLgotCUlOCVVDSEFSCQkJQkFTaXplLAotCUlOCVVDSEFSCQkJV0NJRCwKLQlJTglVTE9ORwkJCUxlbmd0aCwKLQlJTglVQ0hBUiAJCQlQSUQsCi0JSU4JVUNIQVIJCQlUSUQsCi0JSU4JVUNIQVIJCQlUeFJhdGUsCi0JSU4JVUNIQVIJCQlUeG9wbW9kZSwKLQlJTglCT09MRUFOCQkJQ2ZBY2ssCi0JSU4JSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQpCit2b2lkIFJUTVBXcml0ZVR4V0koc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfdHh3aSAqIHBPdXRUeFdJLCBJTiBCT09MRUFOIEZSQUcsIElOIEJPT0xFQU4gQ0ZBQ0ssIElOIEJPT0xFQU4gSW5zVGltZXN0YW1wLCBJTiBCT09MRUFOIEFNUERVLCBJTiBCT09MRUFOIEFjaywgSU4gQk9PTEVBTiBOU2VxLAkvKiBIVyBuZXcgYSBzZXF1ZW5jZS4gKi8KKwkJICAgdTggQkFTaXplLAorCQkgICB1OCBXQ0lELAorCQkgICB1bnNpZ25lZCBsb25nIExlbmd0aCwKKwkJICAgdTggUElELAorCQkgICB1OCBUSUQsCisJCSAgIHU4IFR4UmF0ZSwKKwkJICAgdTggVHhvcG1vZGUsCisJCSAgIElOIEJPT0xFQU4gQ2ZBY2ssIElOIEhUVFJBTlNNSVRfU0VUVElORyAqIHBUcmFuc21pdCkKIHsKLQlQTUFDX1RBQkxFX0VOVFJZCXBNYWMgPSBOVUxMOwotCVRYV0lfU1RSVUMgCQlUeFdJOwotCVBUWFdJX1NUUlVDIAlwVHhXSTsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwTWFjID0gTlVMTDsKKwlzdHJ1Y3QgcnRfdHh3aSBUeFdJOworCXN0cnVjdCBydF90eHdpICogcFR4V0k7CiAKIAlpZiAoV0NJRCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQogCQlwTWFjID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbV0NJRF07CiAKLQkvLwotCS8vIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLgotCS8vIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcwotCS8vCisJLyogKi8KKwkvKiBBbHdheXMgdXNlIExvbmcgcHJlYW1ibGUgYmVmb3JlIHZlcmlmaWF0aW9uIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3Mgd2VsbC4gKi8KKwkvKiBUb2RvOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGlmIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3MgKi8KKwkvKiAqLwogCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7CiAJTmRpc1plcm9NZW1vcnkoJlR4V0ksIFRYV0lfU0laRSk7CiAJcFR4V0kgPSAmVHhXSTsKIAotCXBUeFdJLT5GUkFHPSBGUkFHOworCXBUeFdJLT5GUkFHID0gRlJBRzsKIAogCXBUeFdJLT5DRkFDSyA9IENGQUNLOwotCXBUeFdJLT5UUz0gSW5zVGltZXN0YW1wOworCXBUeFdJLT5UUyA9IEluc1RpbWVzdGFtcDsKIAlwVHhXSS0+QU1QRFUgPSBBTVBEVTsKIAlwVHhXSS0+QUNLID0gQWNrOwotCXBUeFdJLT50eG9wPSBUeG9wbW9kZTsKKwlwVHhXSS0+dHhvcCA9IFR4b3Btb2RlOwogCiAJcFR4V0ktPk5TRVEgPSBOU2VxOwotCS8vIEpvaG4gdHVuZSB0aGUgcGVyZm9ybWFjZSB3aXRoIEludGVsIENsaWVudCBpbiAyMCBNSHogcGVyZm9ybWFuY2UKKwkvKiBKb2huIHR1bmUgdGhlIHBlcmZvcm1hY2Ugd2l0aCBJbnRlbCBDbGllbnQgaW4gMjAgTUh6IHBlcmZvcm1hbmNlICovCiAJQkFTaXplID0gcEFkLT5Db21tb25DZmcuVHhCQVNpemU7Ci0KLQlpZiggQkFTaXplID43ICkKLQkJQkFTaXplID03OworCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODcyMDIwMCkgeworCQlpZiAoQkFTaXplID4gMTMpCisJCQlCQVNpemUgPSAxMzsKKwl9IGVsc2UgeworCQlpZiAoQkFTaXplID4gNykKKwkJCUJBU2l6ZSA9IDc7CisJfQogCXBUeFdJLT5CQVdpblNpemUgPSBCQVNpemU7CiAJcFR4V0ktPlNob3J0R0kgPSBwVHJhbnNtaXQtPmZpZWxkLlNob3J0R0k7CiAJcFR4V0ktPlNUQkMgPSBwVHJhbnNtaXQtPmZpZWxkLlNUQkM7CkBAIC0xMjU0LDkwICsxMDE5LDg0IEBACiAJcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA9IExlbmd0aDsKIAlwVHhXSS0+UGFja2V0SWQgPSBQSUQ7CiAKLQkvLyBJZiBDQ0sgb3IgT0ZETSwgQlcgbXVzdCBiZSAyMAotCXBUeFdJLT5CVyA9IChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisJLyogSWYgQ0NLIG9yIE9GRE0sIEJXIG11c3QgYmUgMjAgKi8KKwlwVHhXSS0+QlcgPQorCSAgICAocFRyYW5zbWl0LT5maWVsZC5NT0RFIDw9CisJICAgICBNT0RFX09GRE0pID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKIAogCXBUeFdJLT5NQ1MgPSBwVHJhbnNtaXQtPmZpZWxkLk1DUzsKIAlwVHhXSS0+UEhZTU9ERSA9IHBUcmFuc21pdC0+ZmllbGQuTU9ERTsKIAlwVHhXSS0+Q0ZBQ0sgPSBDZkFjazsKIAotCWlmIChwTWFjKQotCXsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUpCi0JCXsKLQkJCWlmICgocE1hYy0+TW1wc01vZGUgPT0gTU1QU19EWU5BTUlDKSAmJiAocFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KSkKLQkJCXsKLQkJCQkvLyBEeW5hbWljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCisJaWYgKHBNYWMpIHsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUpIHsKKwkJCWlmICgocE1hYy0+TW1wc01vZGUgPT0gTU1QU19EWU5BTUlDKQorCQkJICAgICYmIChwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpKSB7CisJCQkJLyogRHluYW1pYyBNSU1PIFBvd2VyIFNhdmUgTW9kZSAqLwogCQkJCXBUeFdJLT5NSU1PcHMgPSAxOwotCQkJfQotCQkJZWxzZSBpZiAocE1hYy0+TW1wc01vZGUgPT0gTU1QU19TVEFUSUMpCi0JCQl7Ci0JCQkJLy8gU3RhdGljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCi0JCQkJaWYgKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYICYmIHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykKLQkJCQl7CisJCQl9IGVsc2UgaWYgKHBNYWMtPk1tcHNNb2RlID09IE1NUFNfU1RBVElDKSB7CisJCQkJLyogU3RhdGljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlICovCisJCQkJaWYgKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYCisJCQkJICAgICYmIHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykgewogCQkJCQlwVHhXSS0+TUNTID0gNzsKIAkJCQkJcFR4V0ktPk1JTU9wcyA9IDA7CiAJCQkJfQogCQkJfQogCQl9Ci0JCS8vcFR4V0ktPk1JTU9wcyA9IChwTWFjLT5Qc01vZGUgPT0gUFdSX01NUFMpPyAxOjA7Ci0JCWlmIChwTWFjLT5iSUFtQmFkQXRoZXJvcyAmJiAocE1hYy0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkpCi0JCXsKKwkJLypwVHhXSS0+TUlNT3BzID0gKHBNYWMtPlBzTW9kZSA9PSBQV1JfTU1QUyk/IDE6MDsgKi8KKwkJaWYgKHBNYWMtPmJJQW1CYWRBdGhlcm9zCisJCSAgICAmJiAocE1hYy0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkpIHsKIAkJCXBUeFdJLT5NcGR1RGVuc2l0eSA9IDc7Ci0JCX0KLQkJZWxzZQotCQl7CisJCX0gZWxzZSB7CiAJCQlwVHhXSS0+TXBkdURlbnNpdHkgPSBwTWFjLT5NcGR1RGVuc2l0eTsKIAkJfQogCX0KIAogCXBUeFdJLT5QYWNrZXRJZCA9IHBUeFdJLT5NQ1M7Ci0JTmRpc01vdmVNZW1vcnkocE91dFR4V0ksICZUeFdJLCBzaXplb2YoVFhXSV9TVFJVQykpOworCU5kaXNNb3ZlTWVtb3J5KHBPdXRUeFdJLCAmVHhXSSwgc2l6ZW9mKHN0cnVjdCBydF90eHdpKSk7CiB9CiAKLQotVk9JRCBSVE1QV3JpdGVUeFdJX0RhdGEoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCU9VVCBQVFhXSV9TVFJVQwkJcFR4V0ksCi0JSU4JVFhfQkxLCQkJCSpwVHhCbGspCit2b2lkIFJUTVBXcml0ZVR4V0lfRGF0YShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQlzdHJ1Y3QgcnRfdHh3aSAqIHBUeFdJLCBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGspCiB7Ci0JSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQ7Ci0JUE1BQ19UQUJMRV9FTlRSWQlwTWFjRW50cnk7Ci0JVUNIQVIJCQkJQkFTaXplOworCUhUVFJBTlNNSVRfU0VUVElORyAqcFRyYW5zbWl0OworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBNYWNFbnRyeTsKKwl1OCBCQVNpemU7CiAKIAlBU1NFUlQocFR4V0kpOwogCiAJcFRyYW5zbWl0ID0gcFR4QmxrLT5wVHJhbnNtaXQ7CiAJcE1hY0VudHJ5ID0gcFR4QmxrLT5wTWFjRW50cnk7CiAKLQotCS8vCi0JLy8gQWx3YXlzIHVzZSBMb25nIHByZWFtYmxlIGJlZm9yZSB2ZXJpZmlhdGlvbiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzIHdlbGwuCi0JLy8gVG9kbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBpZiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzCi0JLy8KKwkvKiAqLworCS8qIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLiAqLworCS8qIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyAqLworCS8qICovCiAJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKIAlOZGlzWmVyb01lbW9yeShwVHhXSSwgVFhXSV9TSVpFKTsKIAotCXBUeFdJLT5GUkFHCQk9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkFsbG93RnJhZyk7Ci0JcFR4V0ktPkFDSwkJPSBUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7Ci0JcFR4V0ktPnR4b3AJCT0gcFR4QmxrLT5GcmFtZUdhcDsKKwlwVHhXSS0+RlJBRyA9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkFsbG93RnJhZyk7CisJcFR4V0ktPkFDSyA9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkFja1JlcXVpcmVkKTsKKwlwVHhXSS0+dHhvcCA9IHBUeEJsay0+RnJhbWVHYXA7CiAKLQkJcFR4V0ktPldpcmVsZXNzQ2xpSUQJCT0gcFR4QmxrLT5XY2lkOworCXBUeFdJLT5XaXJlbGVzc0NsaUlEID0gcFR4QmxrLT5XY2lkOwogCi0JcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudAk9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOwotCXBUeFdJLT5DRkFDSwkJCQk9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYlBpZ2d5QmFjayk7CisJcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOworCXBUeFdJLT5DRkFDSyA9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYlBpZ2d5QmFjayk7CiAKLQkvLyBJZiBDQ0sgb3IgT0ZETSwgQlcgbXVzdCBiZSAyMAotCXBUeFdJLT5CVyA9IChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7Ci0JcFR4V0ktPkFNUERVCT0gKChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNUERVX0ZSQU1FKSA/IFRSVUUgOiBGQUxTRSk7CisJLyogSWYgQ0NLIG9yIE9GRE0sIEJXIG11c3QgYmUgMjAgKi8KKwlwVHhXSS0+QlcgPQorCSAgICAocFRyYW5zbWl0LT5maWVsZC5NT0RFIDw9CisJICAgICBNT0RFX09GRE0pID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKKwlwVHhXSS0+QU1QRFUgPSAoKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1QRFVfRlJBTUUpID8gVFJVRSA6IEZBTFNFKTsKIAotCS8vIEpvaG4gdHVuZSB0aGUgcGVyZm9ybWFjZSB3aXRoIEludGVsIENsaWVudCBpbiAyMCBNSHogcGVyZm9ybWFuY2UKKwkvKiBKb2huIHR1bmUgdGhlIHBlcmZvcm1hY2Ugd2l0aCBJbnRlbCBDbGllbnQgaW4gMjAgTUh6IHBlcmZvcm1hbmNlICovCiAJQkFTaXplID0gcEFkLT5Db21tb25DZmcuVHhCQVNpemU7Ci0JaWYoKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1QRFVfRlJBTUUpICYmIChwTWFjRW50cnkpKQotCXsKLQkJVUNIQVIJCVJBQkFPcmlJZHggPSAwOwkvL1RoZSBSQSdzIEJBIE9yaWdpbmF0b3IgdGFibGUgaW5kZXguCisJaWYgKChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNUERVX0ZSQU1FKSAmJiAocE1hY0VudHJ5KSkgeworCQl1OCBSQUJBT3JpSWR4ID0gMDsJLypUaGUgUkEncyBCQSBPcmlnaW5hdG9yIHRhYmxlIGluZGV4LiAqLwogCi0JCVJBQkFPcmlJZHggPSBwVHhCbGstPnBNYWNFbnRyeS0+QkFPcmlXY2lkQXJyYXlbcFR4QmxrLT5Vc2VyUHJpb3JpdHldOworCQlSQUJBT3JpSWR4ID0KKwkJICAgIHBUeEJsay0+cE1hY0VudHJ5LT5CQU9yaVdjaWRBcnJheVtwVHhCbGstPlVzZXJQcmlvcml0eV07CiAJCUJBU2l6ZSA9IHBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W1JBQkFPcmlJZHhdLkJBV2luU2l6ZTsKIAl9CiAKQEAgLTEzNDksMTcyICsxMTA4LDExMiBAQAogCXBUeFdJLT5NQ1MgPSBwVHJhbnNtaXQtPmZpZWxkLk1DUzsKIAlwVHhXSS0+UEhZTU9ERSA9IHBUcmFuc21pdC0+ZmllbGQuTU9ERTsKIAotCWlmIChwTWFjRW50cnkpCi0JewotCQlpZiAoKHBNYWNFbnRyeS0+TW1wc01vZGUgPT0gTU1QU19EWU5BTUlDKSAmJiAocFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KSkKLQkJewotCQkJLy8gRHluYW1pYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQorCWlmIChwTWFjRW50cnkpIHsKKwkJaWYgKChwTWFjRW50cnktPk1tcHNNb2RlID09IE1NUFNfRFlOQU1JQykKKwkJICAgICYmIChwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpKSB7CisJCQkvKiBEeW5hbWljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlICovCiAJCQlwVHhXSS0+TUlNT3BzID0gMTsKLQkJfQotCQllbHNlIGlmIChwTWFjRW50cnktPk1tcHNNb2RlID09IE1NUFNfU1RBVElDKQotCQl7Ci0JCQkvLyBTdGF0aWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKLQkJCWlmIChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCAmJiBwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpCi0JCQl7CisJCX0gZWxzZSBpZiAocE1hY0VudHJ5LT5NbXBzTW9kZSA9PSBNTVBTX1NUQVRJQykgeworCQkJLyogU3RhdGljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlICovCisJCQlpZiAocFRyYW5zbWl0LT5maWVsZC5NT0RFID49IE1PREVfSFRNSVgKKwkJCSAgICAmJiBwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpIHsKIAkJCQlwVHhXSS0+TUNTID0gNzsKIAkJCQlwVHhXSS0+TUlNT3BzID0gMDsKIAkJCX0KIAkJfQogCi0JCWlmIChwTWFjRW50cnktPmJJQW1CYWRBdGhlcm9zICYmIChwTWFjRW50cnktPldlcFN0YXR1cyAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpKQotCQl7CisJCWlmIChwTWFjRW50cnktPmJJQW1CYWRBdGhlcm9zCisJCSAgICAmJiAocE1hY0VudHJ5LT5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKSkgewogCQkJcFR4V0ktPk1wZHVEZW5zaXR5ID0gNzsKLQkJfQotCQllbHNlCi0JCXsKKwkJfSBlbHNlIHsKIAkJCXBUeFdJLT5NcGR1RGVuc2l0eSA9IHBNYWNFbnRyeS0+TXBkdURlbnNpdHk7CiAJCX0KIAl9CiAKLQotCS8vIGZvciByYXRlIGFkYXBhdGlvbgorCS8qIGZvciByYXRlIGFkYXBhdGlvbiAqLwogCXBUeFdJLT5QYWNrZXRJZCA9IHBUeFdJLT5NQ1M7CiB9CiAKLQotVk9JRCBSVE1QV3JpdGVUeFdJX0NhY2hlKAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglPVVQgUFRYV0lfU1RSVUMJCXBUeFdJLAotCUlOCVRYX0JMSwkJCQkqcFR4QmxrKQordm9pZCBSVE1QV3JpdGVUeFdJX0NhY2hlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSBzdHJ1Y3QgcnRfdHh3aSAqIHBUeFdJLCBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGspCiB7Ci0JUEhUVFJBTlNNSVRfU0VUVElORwlwVHJhbnNtaXQ7Ci0JUE1BQ19UQUJMRV9FTlRSWQlwTWFjRW50cnk7CisJUEhUVFJBTlNNSVRfU0VUVElORyAvKnBUeEhUUGh5TW9kZSwgKi8gcFRyYW5zbWl0OworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBNYWNFbnRyeTsKIAotCS8vCi0JLy8gdXBkYXRlIFRYV0kKLQkvLworCS8qICovCisJLyogdXBkYXRlIFRYV0kgKi8KKwkvKiAqLwogCXBNYWNFbnRyeSA9IHBUeEJsay0+cE1hY0VudHJ5OwogCXBUcmFuc21pdCA9IHBUeEJsay0+cFRyYW5zbWl0OwogCi0JaWYgKHBNYWNFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2gpCi0JeworCS8qaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkpICovCisJLyppZiAoUlRNUENoZWNrRW50cnlFbmFibGVBdXRvUmF0ZVN3aXRjaChwQWQsIHBNYWNFbnRyeSkpICovCisJLyppZiAoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9BdXRvUmF0ZVN3aXRjaCkpICovCisJaWYgKHBNYWNFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2gpIHsKIAkJcFR4V0ktPnR4b3AgPSBJRlNfSFRUWE9QOwogCi0JCS8vIElmIENDSyBvciBPRkRNLCBCVyBtdXN0IGJlIDIwCi0JCXBUeFdJLT5CVyA9IChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisJCS8qIElmIENDSyBvciBPRkRNLCBCVyBtdXN0IGJlIDIwICovCisJCXBUeFdJLT5CVyA9CisJCSAgICAocFRyYW5zbWl0LT5maWVsZC5NT0RFIDw9CisJCSAgICAgTU9ERV9PRkRNKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CiAJCXBUeFdJLT5TaG9ydEdJID0gcFRyYW5zbWl0LT5maWVsZC5TaG9ydEdJOwogCQlwVHhXSS0+U1RCQyA9IHBUcmFuc21pdC0+ZmllbGQuU1RCQzsKIAogCQlwVHhXSS0+TUNTID0gcFRyYW5zbWl0LT5maWVsZC5NQ1M7CiAJCXBUeFdJLT5QSFlNT0RFID0gcFRyYW5zbWl0LT5maWVsZC5NT0RFOwogCi0JCS8vIHNldCBQSUQgZm9yIFR4UmF0ZVN3aXRjaGluZworCQkvKiBzZXQgUElEIGZvciBUeFJhdGVTd2l0Y2hpbmcgKi8KIAkJcFR4V0ktPlBhY2tldElkID0gcFRyYW5zbWl0LT5maWVsZC5NQ1M7CiAJfQogCi0JcFR4V0ktPkFNUERVID0gKChwTWFjRW50cnktPk5vQkFEYXRhQ291bnREb3duID09IDApID8gVFJVRTogRkFMU0UpOworCXBUeFdJLT5BTVBEVSA9ICgocE1hY0VudHJ5LT5Ob0JBRGF0YUNvdW50RG93biA9PSAwKSA/IFRSVUUgOiBGQUxTRSk7CiAJcFR4V0ktPk1JTU9wcyA9IDA7CiAKLQlpZiAocEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSkKLQl7Ci0JCS8vIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCi0JCWlmICgocE1hY0VudHJ5LT5NbXBzTW9kZSA9PSBNTVBTX0RZTkFNSUMpICYmIChwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpKQotCQl7Ci0JCQkvLyBEeW5hbWljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUpIHsKKwkJLyogTUlNTyBQb3dlciBTYXZlIE1vZGUgKi8KKwkJaWYgKChwTWFjRW50cnktPk1tcHNNb2RlID09IE1NUFNfRFlOQU1JQykKKwkJICAgICYmIChwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpKSB7CisJCQkvKiBEeW5hbWljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlICovCiAJCQlwVHhXSS0+TUlNT3BzID0gMTsKLQkJfQotCQllbHNlIGlmIChwTWFjRW50cnktPk1tcHNNb2RlID09IE1NUFNfU1RBVElDKQotCQl7Ci0JCQkvLyBTdGF0aWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKLQkJCWlmICgocFRyYW5zbWl0LT5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpICYmIChwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpKQotCQkJeworCQl9IGVsc2UgaWYgKHBNYWNFbnRyeS0+TW1wc01vZGUgPT0gTU1QU19TVEFUSUMpIHsKKwkJCS8qIFN0YXRpYyBNSU1PIFBvd2VyIFNhdmUgTW9kZSAqLworCQkJaWYgKChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKKwkJCSAgICAmJiAocFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KSkgewogCQkJCXBUeFdJLT5NQ1MgPSA3OwogCQkJCXBUeFdJLT5NSU1PcHMgPSAwOwogCQkJfQogCQl9CiAJfQogCi0KIAlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5TcmNCdWZMZW47CiAKIH0KIAotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQ2FsY3VsYXRlcyB0aGUgZHVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gdHJhbnNtaXQgb3V0IGZyYW1lcwotCXdpdGggZ2l2ZW4gc2l6ZSBhbmQgc3BlY2lmaWVkIHJhdGUuCi0KLQlBcmd1bWVudHM6Ci0JCXBUeEQJCVBvaW50ZXIgdG8gdHJhbnNtaXQgZGVzY3JpcHRvcgotCQlBY2sgCQlTZXR0aW5nIGZvciBBY2sgcmVxdWlyZW1lbnQgYml0Ci0JCUZyYWdtZW50CVNldHRpbmcgZm9yIEZyYWdtZW50IGJpdAotCQlSZXRyeU1vZGUJU2V0dGluZyBmb3IgcmV0cnkgbW9kZQotCQlJZnMgCQlTZXR0aW5nIGZvciBJRlMgZ2FwCi0JCVJhdGUJCVNldHRpbmcgZm9yIHRyYW5zbWl0IHJhdGUKLQkJU2VydmljZSAJU2V0dGluZyBmb3Igc2VydmljZQotCQlMZW5ndGgJCUZyYW1lIGxlbmd0aAotCQlUeFByZWFtYmxlCVNob3J0IG9yIExvbmcgcHJlYW1ibGUgd2hlbiB1c2luZyBDQ0sgcmF0ZXMKLQkJUXVlSWR4IC0gMC0zLCBhY2NvcmRpbmcgdG8gODAyLjExZS9kNC40IEp1bmUvMjAwMwotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QV3JpdGVUeERlc2NyaXB0b3IoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFRYRF9TVFJVQwkJcFR4RCwKLQlJTglCT09MRUFOIAkJYldJViwKLQlJTglVQ0hBUgkJCVF1ZXVlU0VMKQotewotCS8vCi0JLy8gQWx3YXlzIHVzZSBMb25nIHByZWFtYmxlIGJlZm9yZSB2ZXJpZmlhdGlvbiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzIHdlbGwuCi0JLy8gVG9kbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBpZiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzCi0JLy8KLQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOwotCi0JcFR4RC0+V0lWCT0gKGJXSVYpID8gMTogMDsKLQlwVHhELT5RU0VMPSAoUXVldWVTRUwpOwotCWlmIChwQWQtPmJHZW5PbmVIQ0NBID09IFRSVUUpCi0JCXBUeEQtPlFTRUw9IEZJRk9fSENDQTsKLQlwVHhELT5ETUFET05FID0gMDsKLX0KLQotCi0vLyBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiAtCi0vLyAxLiBNRUFESUFfQ09OTkVDVEVECi0vLyAyLiBBR0dSRUdBVElPTl9JTl9VU0VECi0vLyAzLiBGcmFnbWVudGF0aW9uIG5vdCBpbiB1c2VkCi0vLyA0LiBlaXRoZXIgbm8gcHJldmlvdXMgZnJhbWUgKHBQcmV2QWRkcjE9TlVMTCkgLk9SLiBwcmV2aW91ZCBmcmFtZSBpcyBhZ2dyZWdhdGlibGUKLUJPT0xFQU4gVHhGcmFtZUlzQWdncmVnYXRpYmxlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBQcmV2QWRkcjEsCi0JSU4JUFVDSEFSCQkJcDgwMjNoZHIpCisvKiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiAtICovCisvKiAxLiBNRUFESUFfQ09OTkVDVEVEICovCisvKiAyLiBBR0dSRUdBVElPTl9JTl9VU0VEICovCisvKiAzLiBGcmFnbWVudGF0aW9uIG5vdCBpbiB1c2VkICovCisvKiA0LiBlaXRoZXIgbm8gcHJldmlvdXMgZnJhbWUgKHBQcmV2QWRkcjE9TlVMTCkgLk9SLiBwcmV2aW91ZCBmcmFtZSBpcyBhZ2dyZWdhdGlibGUgKi8KK0JPT0xFQU4gVHhGcmFtZUlzQWdncmVnYXRpYmxlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgIHU4ICpwUHJldkFkZHIxLCB1OCAqcDgwMjNoZHIpCiB7CiAKLQkvLyBjYW4ndCBhZ2dyZWdhdGUgRUFQT0wgKDgwMi4xeCkgZnJhbWUKKwkvKiBjYW4ndCBhZ2dyZWdhdGUgRUFQT0wgKDgwMi4xeCkgZnJhbWUgKi8KIAlpZiAoKHA4MDIzaGRyWzEyXSA9PSAweDg4KSAmJiAocDgwMjNoZHJbMTNdID09IDB4OGUpKQogCQlyZXR1cm4gRkFMU0U7CiAKLQkvLyBjYW4ndCBhZ2dyZWdhdGUgbXVsdGljYXN0L2Jyb2FkY2FzdCBmcmFtZQorCS8qIGNhbid0IGFnZ3JlZ2F0ZSBtdWx0aWNhc3QvYnJvYWRjYXN0IGZyYW1lICovCiAJaWYgKHA4MDIzaGRyWzBdICYgMHgwMSkKIAkJcmV0dXJuIEZBTFNFOwogCi0JaWYgKElORlJBX09OKHBBZCkpIC8vIG11c3QgYmUgdW5pY2FzdCB0byBBUAorCWlmIChJTkZSQV9PTihwQWQpKQkvKiBtdXN0IGJlIHVuaWNhc3QgdG8gQVAgKi8KIAkJcmV0dXJuIFRSVUU7Ci0JZWxzZSBpZiAoKHBQcmV2QWRkcjEgPT0gTlVMTCkgfHwgTUFDX0FERFJfRVFVQUwocFByZXZBZGRyMSwgcDgwMjNoZHIpKSAvLyB1bmljYXN0IHRvIHNhbWUgU1RBCisJZWxzZSBpZiAoKHBQcmV2QWRkcjEgPT0gTlVMTCkgfHwgTUFDX0FERFJfRVFVQUwocFByZXZBZGRyMSwgcDgwMjNoZHIpKQkvKiB1bmljYXN0IHRvIHNhbWUgU1RBICovCiAJCXJldHVybiBUUlVFOwogCWVsc2UKIAkJcmV0dXJuIEZBTFNFOwogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTE1MzEsMzMgKzEyMzAsMjcgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLUJPT0xFQU4gUGVlcklzQWdncmVPbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVTE9ORwkJICAgVHhSYXRlLAotCUlOCVBNQUNfVEFCTEVfRU5UUlkgcE1hY0VudHJ5KQorQk9PTEVBTiBQZWVySXNBZ2dyZU9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBUeFJhdGUsIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBNYWNFbnRyeSkKIHsKLQlVTE9ORwlBRmxhZ3MgPSAoZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VEIHwgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSk7CisJdW5zaWduZWQgbG9uZyBBRmxhZ3MgPQorCSAgICAoZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VEIHwgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSk7CiAKLQlpZiAocE1hY0VudHJ5ICE9IE5VTEwgJiYgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBBRmxhZ3MpKQotCXsKLQkJaWYgKHBNYWNFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKLQkJeworCWlmIChwTWFjRW50cnkgIT0gTlVMTCAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIEFGbGFncykpIHsKKwkJaWYgKHBNYWNFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkgewogCQkJcmV0dXJuIFRSVUU7CiAJCX0KLQogI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKLQkJaWYgKFR4UmF0ZSA+PSBSQVRFXzYgJiYgcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSAmJiAoIShPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpICYmIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpKSkpCi0JCXsJLy8gbGVnYWN5ICBSYWxpbmsgQWdncmVnYXRpb24gc3VwcG9ydAorCQlpZiAoVHhSYXRlID49IFJBVEVfNiAmJiBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlICYmICghKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgJiYgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSkpKSkgewkvKiBsZWdhY3kgIFJhbGluayBBZ2dyZWdhdGlvbiBzdXBwb3J0ICovCiAJCQlyZXR1cm4gVFJVRTsKIAkJfQotI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KKyNlbmRpZiAvKiBBR0dSRUdBVElPTl9TVVBQT1JUIC8vICovCiAJfQogCiAJcmV0dXJuIEZBTFNFOwogCiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMTU3NiwzMjMgKzEyNjksMzggQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVBRVUVVRV9IRUFERVIJUlRNUENoZWNrVHhTd1F1ZXVlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVCBQVUNIQVIJCQlwUXVlSWR4KQorc3RydWN0IHJ0X3F1ZXVlX2hlYWRlciAqUlRNUENoZWNrVHhTd1F1ZXVlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggKnBRdWVJZHgpCiB7CiAKLQlVTE9ORwlOdW1iZXI7CisJdW5zaWduZWQgbG9uZyBOdW1iZXI7CisJLyogMjAwNC0xMS0xNSB0byBiZSByZW1vdmVkLiB0ZXN0IGFnZ3JlZ2F0aW9uIG9ubHkgKi8KKy8qICAgICAgaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCkpICYmICgqcE51bWJlciA8IDIpKSAqLworLyogICAgICAgICAgICAgICByZXR1cm4gTlVMTDsgKi8KIAogCU51bWJlciA9IHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CS10uTnVtYmVyCi0JCQkgKyBwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQkVdLk51bWJlcgotCQkJICsgcEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXS5OdW1iZXIKLQkJCSArIHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WT10uTnVtYmVyCi0JCQkgKyBwQWQtPlR4U3dRdWV1ZVtRSURfSENDQV0uTnVtYmVyOworCSAgICArIHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0uTnVtYmVyCisJICAgICsgcEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXS5OdW1iZXIKKwkgICAgKyBwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dLk51bWJlcjsKIAotCWlmIChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dLkhlYWQgIT0gTlVMTCkKLQl7CisJaWYgKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WT10uSGVhZCAhPSBOVUxMKSB7CiAJCSpwUXVlSWR4ID0gUUlEX0FDX1ZPOwogCQlyZXR1cm4gKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dKTsKLQl9Ci0JZWxzZSBpZiAocEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXS5IZWFkICE9IE5VTEwpCi0JeworCX0gZWxzZSBpZiAocEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXS5IZWFkICE9IE5VTEwpIHsKIAkJKnBRdWVJZHggPSBRSURfQUNfVkk7CiAJCXJldHVybiAoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WSV0pOwotCX0KLQllbHNlIGlmIChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQkVdLkhlYWQgIT0gTlVMTCkKLQl7CisJfSBlbHNlIGlmIChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQkVdLkhlYWQgIT0gTlVMTCkgewogCQkqcFF1ZUlkeCA9IFFJRF9BQ19CRTsKIAkJcmV0dXJuICgmcEFkLT5UeFN3UXVldWVbUUlEX0FDX0JFXSk7Ci0JfQotCWVsc2UgaWYgKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CS10uSGVhZCAhPSBOVUxMKQotCXsKKwl9IGVsc2UgaWYgKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CS10uSGVhZCAhPSBOVUxMKSB7CiAJCSpwUXVlSWR4ID0gUUlEX0FDX0JLOwogCQlyZXR1cm4gKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdKTsKIAl9Ci0JZWxzZSBpZiAocEFkLT5UeFN3UXVldWVbUUlEX0hDQ0FdLkhlYWQgIT0gTlVMTCkKLQl7Ci0JCSpwUXVlSWR4ID0gUUlEX0hDQ0E7Ci0JCXJldHVybiAoJnBBZC0+VHhTd1F1ZXVlW1FJRF9IQ0NBXSk7Ci0JfQotCi0JLy8gTm8gcGFja2V0IHBlbmRpbmcgaW4gVHggU3cgcXVldWUKKwkvKiBObyBwYWNrZXQgcGVuZGluZyBpbiBUeCBTdyBxdWV1ZSAqLwogCSpwUXVlSWR4ID0gUUlEX0FDX0JLOwogCiAJcmV0dXJuIChOVUxMKTsKIH0KIAotI2lmZGVmIFJUMjg2MAotQk9PTEVBTiAgUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVDSEFSCQkJUXVlSWR4KQotewotCVBSVE1QX1RYX1JJTkcgcFR4UmluZzsKLQlQVFhEX1NUUlVDCSAgcFR4RDsKLQlQTkRJU19QQUNLRVQgIHBQYWNrZXQ7Ci0JVUNIQVIJRlJFRSA9IDA7Ci0JVFhEX1NUUlVDCVR4RCwgKnBPcmlUeEQ7Ci0JLy9VTE9ORwkJSXJxRmxhZ3M7Ci0JQk9PTEVBTgkJCWJSZXNjaGVkdWxlID0gRkFMU0U7Ci0KLQotCUFTU0VSVChRdWVJZHggPCBOVU1fT0ZfVFhfUklORyk7Ci0JcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tRdWVJZHhdOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMCArIFF1ZUlkeCAqIFJJTkdSRUdfRElGRiwgJnBUeFJpbmctPlR4RG1hSWR4KTsKLQl3aGlsZSAocFR4UmluZy0+VHhTd0ZyZWVJZHggIT0gcFR4UmluZy0+VHhEbWFJZHgpCi0JewotCQkvLyBzdGF0aWMgcmF0ZSBhbHNvIG5lZWQgTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKCkgZnVuY3Rpb24uCi0JCS8vaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkpCi0JCQlOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMocEFkKTsKLQotCQkvKiBOb3RlIDogSWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSksIHdlIHdpbGwgbmV2ZXIgcmVhY2ggaGVyZS4gKi8KLQkJRlJFRSsrOwotICAgICAgICAgICAgICAgIHBUeEQgPSAoUFRYRF9TVFJVQykgKHBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLkFsbG9jVmEpOwotCQlwT3JpVHhEID0gcFR4RDsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmVHhELCBwVHhELCBzaXplb2YoVFhEX1NUUlVDKSk7Ci0JCXBUeEQgPSAmVHhEOwotCi0JCXBUeEQtPkRNQURPTkUgPSAwOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQkJewotCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLnBOZGlzUGFja2V0OwotCQkJaWYgKHBQYWNrZXQpCi0JCQl7Ci0jaWZkZWYgQ09ORklHXzVWVF9FTkhBTkNFCi0JCQkJaWYgKFJUTVBfR0VUX1BBQ0tFVF81VlQocFBhY2tldCkpCi0JCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIDE2LCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCQllbHNlCi0jZW5kaWYgLy8gQ09ORklHXzVWVF9FTkhBTkNFIC8vCi0JCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCQkJfQotCQkJLy9BbHdheXMgYXNzaWduIHBOZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKLQkJCXBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLnBOZGlzUGFja2V0ID0gTlVMTDsKLQotCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLnBOZXh0TmRpc1BhY2tldDsKLQotCQkJQVNTRVJUKHBQYWNrZXQgPT0gTlVMTCk7Ci0JCQlpZiAocFBhY2tldCkKLQkJCXsKLSNpZmRlZiBDT05GSUdfNVZUX0VOSEFOQ0UKLQkJCQlpZiAoUlRNUF9HRVRfUEFDS0VUXzVWVChwUGFja2V0KSkKLQkJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgMTYsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCWVsc2UKLSNlbmRpZiAvLyBDT05GSUdfNVZUX0VOSEFOQ0UgLy8KLQkJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgcFR4RC0+U0RMZW4xLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCQl9Ci0JCQkvL0Fsd2F5cyBhc3NpZ24gcE5leHROZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKLQkJCXBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0JCX0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0gIChwVHhELT5TRExlbjEgKyBwVHhELT5TRExlbjApOwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0RtYURvbmVDb3VudFtRdWVJZHhdICsrOwotCQlJTkNfUklOR19JTkRFWChwVHhSaW5nLT5UeFN3RnJlZUlkeCwgVFhfUklOR19TSVpFKTsKLQkJLyogZ2V0IHR4X3RkeF9pZHggYWdhaW4gKi8KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMCArIFF1ZUlkeCAqIFJJTkdSRUdfRElGRiAsICAmcFR4UmluZy0+VHhEbWFJZHgpOwotCi0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBPcmlUeEQsIHBUeEQsIHNpemVvZihUWERfU1RSVUMpKTsKLQl9Ci0KLQotCXJldHVybiAgYlJlc2NoZWR1bGU7Ci0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUHJvY2VzcyBUWCBSaW5ncyBETUEgRG9uZSBpbnRlcnJ1cHQsIHJ1bm5pbmcgaW4gRFBDIGxldmVsCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1CT09MRUFOCVJUTVBIYW5kbGVUeFJpbmdEbWFEb25lSW50ZXJydXB0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCUlOVF9TT1VSQ0VfQ1NSX1NUUlVDIFR4UmluZ0JpdG1hcCkKLXsKLSAgICB1bnNpZ25lZCBsb25nCUlycUZsYWdzOwotCUJPT0xFQU4JCQliUmVzY2hlZHVsZSA9IEZBTFNFOwotCi0JLy8gTWFrZSBzdXJlIFR4IHJpbmcgcmVzb3VyY2Ugd29uJ3QgYmUgdXNlZCBieSBvdGhlciB0aHJlYWRzCi0KLQlSVE1QX0lSUV9MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7Ci0KLQlpZiAoVHhSaW5nQml0bWFwLmZpZWxkLkFjMERtYURvbmUpCi0JCWJSZXNjaGVkdWxlID0gUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKHBBZCwgUUlEX0FDX0JFKTsKLQotCWlmIChUeFJpbmdCaXRtYXAuZmllbGQuSGNjYURtYURvbmUpCi0JCWJSZXNjaGVkdWxlIHw9IFJUTVBGcmVlVFhEVXBvblR4RG1hRG9uZShwQWQsIFFJRF9IQ0NBKTsKLQotCWlmIChUeFJpbmdCaXRtYXAuZmllbGQuQWMzRG1hRG9uZSkKLQkJYlJlc2NoZWR1bGUgfD0gUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKHBBZCwgUUlEX0FDX1ZPKTsKLQotCWlmIChUeFJpbmdCaXRtYXAuZmllbGQuQWMyRG1hRG9uZSkKLQkJYlJlc2NoZWR1bGUgfD0gUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKHBBZCwgUUlEX0FDX1ZJKTsKLQotCWlmIChUeFJpbmdCaXRtYXAuZmllbGQuQWMxRG1hRG9uZSkKLQkJYlJlc2NoZWR1bGUgfD0gUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKHBBZCwgUUlEX0FDX0JLKTsKLQotCS8vIE1ha2Ugc3VyZSB0byByZWxlYXNlIFR4IHJpbmcgcmVzb3VyY2UKLQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLQotCS8vIERlcXVldWUgb3V0Z29pbmcgZnJhbWVzIGZyb20gVHhTd1F1ZXVlW10gYW5kIHByb2Nlc3MgaXQKLQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOwotCi0JcmV0dXJuICBiUmVzY2hlZHVsZTsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUHJvY2VzcyBNR01UIHJpbmcgRE1BIGRvbmUgaW50ZXJydXB0LCBydW5uaW5nIGluIERQQyBsZXZlbAotCi0JQXJndW1lbnRzOgotCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QSGFuZGxlTWdtdFJpbmdEbWFEb25lSW50ZXJydXB0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCVBUWERfU1RSVUMJIHBUeEQ7Ci0JUE5ESVNfUEFDS0VUIHBQYWNrZXQ7Ci0JVUNIQVIJRlJFRSA9IDA7Ci0JUFJUTVBfTUdNVF9SSU5HIHBNZ210UmluZyA9ICZwQWQtPk1nbXRSaW5nOwotCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBUWF9NR01URFRYX0lEWCwgJnBNZ210UmluZy0+VHhEbWFJZHgpOwotCXdoaWxlIChwTWdtdFJpbmctPlR4U3dGcmVlSWR4IT0gcE1nbXRSaW5nLT5UeERtYUlkeCkKLQl7Ci0JCUZSRUUrKzsKLQkJcFR4RCA9IChQVFhEX1NUUlVDKSAocE1nbXRSaW5nLT5DZWxsW3BBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHhdLkFsbG9jVmEpOwotCQlwVHhELT5ETUFET05FID0gMDsKLQkJcFBhY2tldCA9IHBNZ210UmluZy0+Q2VsbFtwTWdtdFJpbmctPlR4U3dGcmVlSWR4XS5wTmRpc1BhY2tldDsKLQotCi0JCWlmIChwUGFja2V0KQotCQl7Ci0JCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIwLCBwVHhELT5TRExlbjAsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCQl9Ci0JCXBNZ210UmluZy0+Q2VsbFtwTWdtdFJpbmctPlR4U3dGcmVlSWR4XS5wTmRpc1BhY2tldCA9IE5VTEw7Ci0KLQkJcFBhY2tldCA9IHBNZ210UmluZy0+Q2VsbFtwTWdtdFJpbmctPlR4U3dGcmVlSWR4XS5wTmV4dE5kaXNQYWNrZXQ7Ci0JCWlmIChwUGFja2V0KQotCQl7Ci0JCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCQl9Ci0JCXBNZ210UmluZy0+Q2VsbFtwTWdtdFJpbmctPlR4U3dGcmVlSWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCQlJTkNfUklOR19JTkRFWChwTWdtdFJpbmctPlR4U3dGcmVlSWR4LCBNR01UX1JJTkdfU0laRSk7Ci0JfQotCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWdtdFJpbmdMb2NrKTsKLQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCUFyZ3VtZW50czoKLQkJQWRhcHRlciAJUG9pbnRlciB0byBvdXIgYWRhcHRlci4gRGVxdWV1ZSBhbGwgcG93ZXIgc2FmZSBkZWxheWVkIGJyYW9kY2FzdCBmcmFtZXMgYWZ0ZXIgYmVhY29uLgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBIYW5kbGVUQlRUSW50ZXJydXB0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCXsKLQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0JCXsKLQkJfQotCX0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIuIFJld3JpdGUgYmVhY29uIGNvbnRlbnQgYmVmb3JlIG5leHQgc2VuZC1vdXQuCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JewotCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQuLi5cbiIpKTsKLQkJfQotCX0KLQotCi19Ci0KLVZPSUQJUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JV1BETUFfR0xPX0NGR19TVFJVQwlHbG9DZmc7Ci0KLQlpZiAocEFkID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBwQWQgaXMgTlVMTCwgcmV0dXJuLlxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFJUTVBIYW5kbGVSeENvaGVyZW50SW50ZXJydXB0IFxuIikpOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHICwgJkdsb0NmZy53b3JkKTsKLQotCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPSAwOwotCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IDA7Ci0JR2xvQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7Ci0KLQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkUpOwotCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CSyk7Ci0JUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZJKTsKLQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVk8pOwotCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9IQ0NBKTsKLQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfTUdNVCk7Ci0JUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX1JYKTsKLQotCVJUTVBFbmFibGVSeFR4KHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQgXG4iKSk7Ci19Ci0jZW5kaWYgLyogUlQyODYwICovCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTE5MDksMjUgKzEzMTcsMjUgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJUlRNUFN1c3BlbmRNc2R1VHJhbnNtaXNzaW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQordm9pZCBSVE1QU3VzcGVuZE1zZHVUcmFuc21pc3Npb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU0NBTk5JTkcsIHN1c3BlbmQgTVNEVSB0cmFuc21pc3Npb24gLi4uXG4iKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU0NBTk5JTkcsIHN1c3BlbmQgTVNEVSB0cmFuc21pc3Npb24gLi4uXG4iKSk7CiAKKwkvKiAqLworCS8qIEJlZm9yZSBCU1NfU0NBTl9JTl9QUk9HUkVTUywgd2UgbmVlZCB0byBrZWVwIEN1cnJlbnQgUjY2IHZhbHVlIGFuZCAqLworCS8qIHVzZSBMb3dib3VuZCBhcyBSNjYgdmFsdWUgb24gU2Nhbk5leHRDaGFubmVsKC4uLikgKi8KKwkvKiAqLworCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsCisJCQkJICAgICZwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUpOwogCi0JLy8KLQkvLyBCZWZvcmUgQlNTX1NDQU5fSU5fUFJPR1JFU1MsIHdlIG5lZWQgdG8ga2VlcCBDdXJyZW50IFI2NiB2YWx1ZSBhbmQKLQkvLyB1c2UgTG93Ym91bmQgYXMgUjY2IHZhbHVlIG9uIFNjYW5OZXh0Q2hhbm5lbCguLi4pCi0JLy8KLQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAmcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlKTsKLQotCS8vIHNldCBCQlBfUjY2IHRvIDB4MzAvMHg0MCB3aGVuIHNjYW5uaW5nIChBc2ljU3dpdGNoQ2hhbm5lbCB3aWxsIHNldCBSNjYgYWNjb3JkaW5nIHRvIGNoYW5uZWwgd2hlbiBzY2FubmluZykKKwkvKiBzZXQgQkJQX1I2NiB0byAweDMwLzB4NDAgd2hlbiBzY2FubmluZyAoQXNpY1N3aXRjaENoYW5uZWwgd2lsbCBzZXQgUjY2IGFjY29yZGluZyB0byBjaGFubmVsIHdoZW4gc2Nhbm5pbmcpICovCisJLypSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgKDB4MjYgKyBHRVRfTE5BX0dBSU4ocEFkKSkpOyAqLwogCVJUTVBTZXRBR0NJbml0VmFsdWUocEFkLCBCV18yMCk7CiAKIAlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7CisJLypSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DTlRMX0NTUiwgMHgwMDBmMDAwMCk7ICAgICAgICAgICAgICAgIC8vIGFib3J0IGFsbCBUWCByaW5ncyAqLwogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTE5NDYsMTQxICsxMzU0LDE0NSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3ZvaWQgUlRNUFJlc3VtZU1zZHVUcmFuc21pc3Npb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU0NBTiBkb25lLCByZXN1bWUgTVNEVSB0cmFuc21pc3Npb24gLi4uXG4iKSk7CisvKiAgICB1OCAgICAgICAgICAgICAgICAgICAgIElycVN0YXRlOyAqLwogCi0JLy8gQWZ0ZXIgZmluaXNoIEJTU19TQ0FOX0lOX1BST0dSRVNTLCB3ZSBuZWVkIHRvIHJlc3RvcmUgQ3VycmVudCBSNjYgdmFsdWUKLQkvLyBSNjYgc2hvdWxkIG5vdCBiZSAwCi0JaWYgKHBBZC0+QmJwVHVuaW5nLlI2NkN1cnJlbnRWYWx1ZSA9PSAwKQotCXsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTQ0FOIGRvbmUsIHJlc3VtZSBNU0RVIHRyYW5zbWlzc2lvbiAuLi5cbiIpKTsKKworCS8qIEFmdGVyIGZpbmlzaCBCU1NfU0NBTl9JTl9QUk9HUkVTUywgd2UgbmVlZCB0byByZXN0b3JlIEN1cnJlbnQgUjY2IHZhbHVlICovCisJLyogUjY2IHNob3VsZCBub3QgYmUgMCAqLworCWlmIChwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUgPT0gMCkgewogCQlwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUgPSAweDM4OwogCQlEQkdQUklOVF9FUlIoKCJSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbiwgUjY2Q3VycmVudFZhbHVlPTAuLi5cbiIpKTsKIAl9CiAKLQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlKTsKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwKKwkJCQkgICAgIHBBZC0+QmJwVHVuaW5nLlI2NkN1cnJlbnRWYWx1ZSk7CiAKIAlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKKy8qIHNhbXBsZSwgZm9yIElSUSBMT0NLIHRvIFNFTSBMT0NLICovCisvKiAgICBJcnFTdGF0ZSA9IHBBZC0+aXJxX2Rpc2FibGVkOyAqLworLyogICAgICBpZiAoSXJxU3RhdGUpICovCisvKiAgICAgICAgICAgICAgUlRNUERlUXVldWVQYWNrZXQocEFkLCBUUlVFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOyAqLworLyogICAgZWxzZSAqLwogCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7CiB9CiAKLQotVUlOVCBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlQTkRJU19QQUNLRVQJCXBQYWNrZXQsCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4JVUxPTkcJCQlEYXRhU2l6ZSkKK3UzMiBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJdm9pZCAqcFBhY2tldCwKKwkJCQl1OCAqcERhdGEsIHVuc2lnbmVkIGxvbmcgRGF0YVNpemUpCiB7Ci0JVVNIT1JUIAkJCVBheWxvYWRTaXplOwotCVVTSE9SVCAJCQlTdWJGcmFtZVNpemU7Ci0JUEhFQURFUl84MDJfMyAJcEFNU0RVc3ViaGVhZGVyOwotCVVJTlQJCQluTVNEVTsKLSAgICBVQ0hBUgkJCUhlYWRlcjgwMl8zWzE0XTsKKwl1MTYgUGF5bG9hZFNpemU7CisJdTE2IFN1YkZyYW1lU2l6ZTsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8zICogcEFNU0RVc3ViaGVhZGVyOworCXUzMiBuTVNEVTsKKwl1OCBIZWFkZXI4MDJfM1sxNF07CiAKLQlQVUNIQVIJCQlwUGF5bG9hZCwgcERBLCBwU0EsIHBSZW1vdmVkTExDU05BUDsKLQlQTkRJU19QQUNLRVQJcENsb25lUGFja2V0OwotCi0KKwl1OCAqcFBheWxvYWQsICpwREEsICpwU0EsICpwUmVtb3ZlZExMQ1NOQVA7CisJdm9pZCAqcENsb25lUGFja2V0OwogCiAJbk1TRFUgPSAwOwogCi0Jd2hpbGUgKERhdGFTaXplID4gTEVOR1RIXzgwMl8zKQotCXsKKwl3aGlsZSAoRGF0YVNpemUgPiBMRU5HVEhfODAyXzMpIHsKIAogCQluTVNEVSsrOwogCi0JCXBBTVNEVXN1YmhlYWRlciA9IChQSEVBREVSXzgwMl8zKXBEYXRhOwotCQlQYXlsb2FkU2l6ZSA9IHBBTVNEVXN1YmhlYWRlci0+T2N0ZXRbMV0gKyAocEFNU0RVc3ViaGVhZGVyLT5PY3RldFswXTw8OCk7CisJCS8qaGV4X2R1bXAoInN1YmhlYWRlciIsIHBEYXRhLCA2NCk7ICovCisJCXBBTVNEVXN1YmhlYWRlciA9IChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8zICopIHBEYXRhOworCQkvKnBEYXRhICs9IExFTkdUSF84MDJfMzsgKi8KKwkJUGF5bG9hZFNpemUgPQorCQkgICAgcEFNU0RVc3ViaGVhZGVyLT5PY3RldFsxXSArCisJCSAgICAocEFNU0RVc3ViaGVhZGVyLT5PY3RldFswXSA8PCA4KTsKIAkJU3ViRnJhbWVTaXplID0gUGF5bG9hZFNpemUgKyBMRU5HVEhfODAyXzM7CiAKLQotCQlpZiAoKERhdGFTaXplIDwgU3ViRnJhbWVTaXplKSB8fCAoUGF5bG9hZFNpemUgPiAxNTE4ICkpCi0JCXsKKwkJaWYgKChEYXRhU2l6ZSA8IFN1YkZyYW1lU2l6ZSkgfHwgKFBheWxvYWRTaXplID4gMTUxOCkpIHsKIAkJCWJyZWFrOwogCQl9CisJCS8qREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlZCBzdWJmcmFtZTogU2l6ZSA9ICVkXG4iLCAgbk1TRFUsIFBheWxvYWRTaXplKSk7ICovCiAKIAkJcFBheWxvYWQgPSBwRGF0YSArIExFTkdUSF84MDJfMzsKIAkJcERBID0gcERhdGE7CiAJCXBTQSA9IHBEYXRhICsgTUFDX0FERFJfTEVOOwogCi0JCS8vIGNvbnZlcnQgdG8gODAyLjMgaGVhZGVyCi0gICAgICAgIENPTlZFUlRfVE9fODAyXzMoSGVhZGVyODAyXzMsIHBEQSwgcFNBLCBwUGF5bG9hZCwgUGF5bG9hZFNpemUsIHBSZW1vdmVkTExDU05BUCk7CisJCS8qIGNvbnZlcnQgdG8gODAyLjMgaGVhZGVyICovCisJCUNPTlZFUlRfVE9fODAyXzMoSGVhZGVyODAyXzMsIHBEQSwgcFNBLCBwUGF5bG9hZCwgUGF5bG9hZFNpemUsCisJCQkJIHBSZW1vdmVkTExDU05BUCk7CiAKLQkJaWYgKChIZWFkZXI4MDJfM1sxMl0gPT0gMHg4OCkgJiYgKEhlYWRlcjgwMl8zWzEzXSA9PSAweDhFKSApCi0JCXsKLQkJICAgIC8vIGF2b2lkIGxvY2FsIGhlYXAgb3ZlcmZsb3csIHVzZSBkeWFuYW1pYyBhbGxvY2F0aW9uCi0JCSAgIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOwotCQkgICBpZiAoRWxlbSA9PSBOVUxMKQotCQkJcmV0dXJuOwotCQkgICBtZW1tb3ZlKEVsZW0tPk1zZysoTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IKSwgcFBheWxvYWQsIFBheWxvYWRTaXplKTsKLQkJICAgRWxlbS0+TXNnTGVuID0gTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgUGF5bG9hZFNpemU7Ci0JCSAgIFdwYUVBUE9MS2V5QWN0aW9uKHBBZCwgRWxlbSk7Ci0JCSAgIGtmcmVlKEVsZW0pOworCQlpZiAoKEhlYWRlcjgwMl8zWzEyXSA9PSAweDg4KSAmJiAoSGVhZGVyODAyXzNbMTNdID09IDB4OEUpKSB7CisJCQkvKiBhdm9pZCBsb2NhbCBoZWFwIG92ZXJmbG93LCB1c2UgZHlhbmFtaWMgYWxsb2NhdGlvbiAqLworCQkJc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSA9CisJCQkgICAgKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSwKKwkJCQkJCQlNRU1fQUxMT0NfRkxBRyk7CisJCQlpZiAoRWxlbSAhPSBOVUxMKSB7CisJCQkJbWVtbW92ZShFbGVtLT5Nc2cgKworCQkJCQkoTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IKSwKKwkJCQkJcFBheWxvYWQsIFBheWxvYWRTaXplKTsKKwkJCQlFbGVtLT5Nc2dMZW4gPQorCQkJCSAgICBMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0ggKworCQkJCSAgICBQYXlsb2FkU2l6ZTsKKwkJCQkvKldwYUVBUE9MS2V5QWN0aW9uKHBBZCwgRWxlbSk7ICovCisJCQkJUkVQT1JUX01HTVRfRlJBTUVfVE9fTUxNRShwQWQsIEJTU0lEX1dDSUQsCisJCQkJCQkJICBFbGVtLT5Nc2csCisJCQkJCQkJICBFbGVtLT5Nc2dMZW4sIDAsIDAsIDAsCisJCQkJCQkJICAwKTsKKwkJCQlrZnJlZShFbGVtKTsKKwkJCX0KIAkJfQogCiAJCXsKLQkgICAgICAgIAlpZiAocFJlbW92ZWRMTENTTkFQKQotCSAgICAgICAgCXsKLQkgICAgCQkJcFBheWxvYWQgLT0gTEVOR1RIXzgwMl8zOwotCSAgICAJCQlQYXlsb2FkU2l6ZSArPSBMRU5HVEhfODAyXzM7Ci0JICAgIAkJCU5kaXNNb3ZlTWVtb3J5KHBQYXlsb2FkLCAmSGVhZGVyODAyXzNbMF0sIExFTkdUSF84MDJfMyk7Ci0JICAgICAgICAJfQorCQkJaWYgKHBSZW1vdmVkTExDU05BUCkgeworCQkJCXBQYXlsb2FkIC09IExFTkdUSF84MDJfMzsKKwkJCQlQYXlsb2FkU2l6ZSArPSBMRU5HVEhfODAyXzM7CisJCQkJTmRpc01vdmVNZW1vcnkocFBheWxvYWQsICZIZWFkZXI4MDJfM1swXSwKKwkJCQkJICAgICAgIExFTkdUSF84MDJfMyk7CisJCQl9CiAJCX0KIAogCQlwQ2xvbmVQYWNrZXQgPSBDbG9uZVBhY2tldChwQWQsIHBQYWNrZXQsIHBQYXlsb2FkLCBQYXlsb2FkU2l6ZSk7Ci0JCWlmIChwQ2xvbmVQYWNrZXQpCi0JCXsKLQkJCUFOTk9VTkNFX09SX0ZPUldBUkRfODAyXzNfUEFDS0VUKHBBZCwgcENsb25lUGFja2V0LCBSVE1QX0dFVF9QQUNLRVRfSUYocFBhY2tldCkpOworCQlpZiAocENsb25lUGFja2V0KSB7CisJCQlBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChwQWQsIHBDbG9uZVBhY2tldCwKKwkJCQkJCQkgUlRNUF9HRVRfUEFDS0VUX0lGCisJCQkJCQkJIChwUGFja2V0KSk7CiAJCX0KIAorCQkvKiBBLU1TRFUgaGFzIHBhZGRpbmcgdG8gbXVsdGlwbGUgb2YgNCBpbmNsdWRpbmcgc3ViZnJhbWUgaGVhZGVyLiAqLworCQkvKiBhbGlnbiBTdWJGcmFtZVNpemUgdXAgdG8gbXVsdGlwbGUgb2YgNCAqLworCQlTdWJGcmFtZVNpemUgPSAoU3ViRnJhbWVTaXplICsgMykgJiAofjB4Myk7CiAKLQkJLy8gQS1NU0RVIGhhcyBwYWRkaW5nIHRvIG11bHRpcGxlIG9mIDQgaW5jbHVkaW5nIHN1YmZyYW1lIGhlYWRlci4KLQkJLy8gYWxpZ24gU3ViRnJhbWVTaXplIHVwIHRvIG11bHRpcGxlIG9mIDQKLQkJU3ViRnJhbWVTaXplID0gKFN1YkZyYW1lU2l6ZSszKSYofjB4Myk7Ci0KLQotCQlpZiAoU3ViRnJhbWVTaXplID4gMTUyOCB8fCBTdWJGcmFtZVNpemUgPCAzMikKLQkJeworCQlpZiAoU3ViRnJhbWVTaXplID4gMTUyOCB8fCBTdWJGcmFtZVNpemUgPCAzMikgewogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoRGF0YVNpemUgPiBTdWJGcmFtZVNpemUpCi0JCXsKKwkJaWYgKERhdGFTaXplID4gU3ViRnJhbWVTaXplKSB7CiAJCQlwRGF0YSArPSBTdWJGcmFtZVNpemU7CiAJCQlEYXRhU2l6ZSAtPSBTdWJGcmFtZVNpemU7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyBlbmQgb2YgQS1NU0RVCisJCX0gZWxzZSB7CisJCQkvKiBlbmQgb2YgQS1NU0RVICovCiAJCQlEYXRhU2l6ZSA9IDA7CiAJCX0KIAl9CiAKLQkvLyBmaW5hbGx5IHJlbGVhc2Ugb3JpZ2luYWwgcnggcGFja2V0CisJLyogZmluYWxseSByZWxlYXNlIG9yaWdpbmFsIHJ4IHBhY2tldCAqLwogCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKIAogCXJldHVybiBuTVNEVTsKIH0KIAotCi1VSU5UIEJBX1Jlb3JkZXJfQU1TRFVfQW5ubm91bmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQordTMyIEJBX1Jlb3JkZXJfQU1TRFVfQW5ubm91bmNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdm9pZCAqcFBhY2tldCkKIHsKLQlQVUNIQVIJCQlwRGF0YTsKLQlVU0hPUlQJCQlEYXRhU2l6ZTsKLQlVSU5UCQkJbk1TRFUgPSAwOworCXU4ICpwRGF0YTsKKwl1MTYgRGF0YVNpemU7CisJdTMyIG5NU0RVID0gMDsKIAotCXBEYXRhID0gKFBVQ0hBUikgR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOwotCURhdGFTaXplID0gKFVTSE9SVCkgR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisJcERhdGEgPSAodTggKilHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJRGF0YVNpemUgPSAodTE2KUdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOwogCiAJbk1TRFUgPSBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZShwQWQsIHBQYWNrZXQsIHBEYXRhLCBEYXRhU2l6ZSk7CiAKIAlyZXR1cm4gbk1TRFU7CiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCURlc2NyaXB0aW9uOgpAQCAtMjA4OSw0MCArMTUwMSwzNyBAQAogCQlwRW50cnkgLSBwb2ludGVyIHRvIHRoZSBNQUMgZW50cnk7IE5VTEwgaXMgbm90IGZvdW5kCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1NQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlTG9va3VwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCVBVQ0hBUiBwQWRkcikKK3N0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKk1hY1RhYmxlTG9va3VwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggKnBBZGRyKQogewotCVVMT05HIEhhc2hJZHg7Ci0JTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgSGFzaElkeDsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkgPSBOVUxMOwogCiAJSGFzaElkeCA9IE1BQ19BRERSX0hBU0hfSU5ERVgocEFkZHIpOwogCXBFbnRyeSA9IHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF07CiAKLQl3aGlsZSAocEVudHJ5ICYmIChwRW50cnktPlZhbGlkQXNDTEkgfHwgcEVudHJ5LT5WYWxpZEFzV0RTIHx8IHBFbnRyeS0+VmFsaWRBc0FwQ2xpIHx8IHBFbnRyeS0+VmFsaWRBc01lc2gpKQotCXsKLQkJaWYgKE1BQ19BRERSX0VRVUFMKHBFbnRyeS0+QWRkciwgcEFkZHIpKQotCQl7CisJd2hpbGUgKHBFbnRyeQorCSAgICAgICAmJiAocEVudHJ5LT5WYWxpZEFzQ0xJIHx8IHBFbnRyeS0+VmFsaWRBc1dEUworCQkgICB8fCBwRW50cnktPlZhbGlkQXNBcENsaSB8fCBwRW50cnktPlZhbGlkQXNNZXNoKSkgeworCQlpZiAoTUFDX0FERFJfRVFVQUwocEVudHJ5LT5BZGRyLCBwQWRkcikpIHsKIAkJCWJyZWFrOwotCQl9Ci0JCWVsc2UKKwkJfSBlbHNlCiAJCQlwRW50cnkgPSBwRW50cnktPnBOZXh0OwogCX0KIAogCXJldHVybiBwRW50cnk7CiB9CiAKLU1BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVJbnNlcnRFbnRyeSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSCQkJcEFkZHIsCi0JSU4JVUNIQVIJCQlhcGlkeCwKLQlJTiBCT09MRUFOCUNsZWFuQWxsKQorc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqTWFjVGFibGVJbnNlcnRFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgICB1OCAqcEFkZHIsCisJCQkJICAgICB1OCBhcGlkeCwgSU4gQk9PTEVBTiBDbGVhbkFsbCkKIHsKLQlVQ0hBUiBIYXNoSWR4OworCXU4IEhhc2hJZHg7CiAJaW50IGksIEZpcnN0V2NpZDsKLQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEwsICpwQ3VyckVudHJ5OworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSA9IE5VTEwsICpwQ3VyckVudHJ5OworLyogICAgICB1MTYgIG9mZnNldDsgKi8KKy8qICAgICAgdW5zaWduZWQgbG9uZyAgIGFkZHI7ICovCiAKLQkvLyBpZiBGVUxMLCByZXR1cm4KKwkvKiBpZiBGVUxMLCByZXR1cm4gKi8KIAlpZiAocEFkLT5NYWNUYWIuU2l6ZSA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTIxMzEsMjMgKzE1NDAsMjEgQEAKIAlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCiAJCUZpcnN0V2NpZCA9IDI7CiAKLQkvLyBhbGxvY2F0ZSBvbmUgTUFDIGVudHJ5CisJLyogYWxsb2NhdGUgb25lIE1BQyBlbnRyeSAqLwogCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0JZm9yIChpID0gRmlyc3RXY2lkOyBpPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKSAgIC8vIHNraXAgZW50cnkjMCBzbyB0aGF0ICJlbnRyeSBpbmRleCA9PSBBSUQiIGZvciBmYXN0IGxvb2t1cAorCWZvciAoaSA9IEZpcnN0V2NpZDsgaSA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCS8qIHNraXAgZW50cnkjMCBzbyB0aGF0ICJlbnRyeSBpbmRleCA9PSBBSUQiIGZvciBmYXN0IGxvb2t1cCAqLwogCXsKLQkJLy8gcGljayB1cCB0aGUgZmlyc3QgYXZhaWxhYmxlIHZhY2FuY3kKKwkJLyogcGljayB1cCB0aGUgZmlyc3QgYXZhaWxhYmxlIHZhY2FuY3kgKi8KIAkJaWYgKChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgPT0gRkFMU0UpICYmCi0JCQkocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzV0RTID09IEZBTFNFKSAmJgotCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0FwQ2xpPT0gRkFMU0UpICYmCi0JCQkocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzTWVzaCA9PSBGQUxTRSkKLQkJCSkKLQkJeworCQkgICAgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc1dEUyA9PSBGQUxTRSkgJiYKKwkJICAgIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNBcENsaSA9PSBGQUxTRSkgJiYKKwkJICAgIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNNZXNoID09IEZBTFNFKQorCQkgICAgKSB7CiAJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKLQkJCWlmIChDbGVhbkFsbCA9PSBUUlVFKQotCQkJeworCQkJaWYgKENsZWFuQWxsID09IFRSVUUpIHsKIAkJCQlwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOwogCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZSA9IFJBVEVfMTE7Ci0JCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoTUFDX1RBQkxFX0VOVFJZKSk7CisJCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2Yoc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSkpOwogCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuS2V5TGVuID0gMDsKIAkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9OT05FOwogCQkJfQpAQCAtMjE2NCw3NyArMTU3MSw3NiBAQAogCQkJcEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9IEZBTFNFOwogCQkJcEVudHJ5LT5wQWQgPSBwQWQ7CiAJCQlwRW50cnktPkNNVGltZXJSdW5uaW5nID0gRkFMU0U7Ci0JCQlwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nID0gRUFQT0xfU1RBUlRfRElTQUJMRTsKKwkJCXBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgPQorCQkJICAgIEVBUE9MX1NUQVJUX0RJU0FCTEU7CiAJCQlwRW50cnktPlJTTklFX0xlbiA9IDA7Ci0JCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlJfQ291bnRlciwgc2l6ZW9mKHBFbnRyeS0+Ul9Db3VudGVyKSk7CisJCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlJfQ291bnRlciwKKwkJCQkgICAgICAgc2l6ZW9mKHBFbnRyeS0+Ul9Db3VudGVyKSk7CiAJCQlwRW50cnktPlJlVHJ5Q291bnRlciA9IFBFRVJfTVNHMV9SRVRSWV9USU1FUl9DVFI7CiAKIAkJCWlmIChwRW50cnktPlZhbGlkQXNNZXNoKQotCQkJCXBFbnRyeS0+YXBpZHggPSAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfTUVTSCk7CisJCQkJcEVudHJ5LT5hcGlkeCA9CisJCQkJICAgIChhcGlkeCAtIE1JTl9ORVRfREVWSUNFX0ZPUl9NRVNIKTsKIAkJCWVsc2UgaWYgKHBFbnRyeS0+VmFsaWRBc0FwQ2xpKQotCQkJCXBFbnRyeS0+YXBpZHggPSAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkpOworCQkJCXBFbnRyeS0+YXBpZHggPQorCQkJCSAgICAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkpOwogCQkJZWxzZSBpZiAocEVudHJ5LT5WYWxpZEFzV0RTKQotCQkJCXBFbnRyeS0+YXBpZHggPSAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTKTsKKwkJCQlwRW50cnktPmFwaWR4ID0KKwkJCQkgICAgKGFwaWR4IC0gTUlOX05FVF9ERVZJQ0VfRk9SX1dEUyk7CiAJCQllbHNlCiAJCQkJcEVudHJ5LT5hcGlkeCA9IGFwaWR4OwogCiAJCQl7CiAJCQkJewogCQkJCQlwRW50cnktPkF1dGhNb2RlID0gcEFkLT5TdGFDZmcuQXV0aE1vZGU7Ci0JCQkJCXBFbnRyeS0+V2VwU3RhdHVzID0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOwotCQkJCQlwRW50cnktPlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbDsKLSNpZmRlZiBSVDI4NjAKLQkJCQkJQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkLCBwRW50cnktPmFwaWR4LCAoVUNIQVIpaSk7Ci0jZW5kaWYKKwkJCQkJcEVudHJ5LT5XZXBTdGF0dXMgPQorCQkJCQkgICAgcEFkLT5TdGFDZmcuV2VwU3RhdHVzOworCQkJCQlwRW50cnktPlByaXZhY3lGaWx0ZXIgPQorCQkJCQkgICAgTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGw7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJCQkJCUFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwKKwkJCQkJCQkJICAgcEVudHJ5LT4KKwkJCQkJCQkJICAgYXBpZHgsCisJCQkJCQkJCSAgICh1OClpKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAkJCQl9CiAJCQl9CiAKIAkJCXBFbnRyeS0+R1RLU3RhdGUgPSBSRUtFWV9ORUdPVElBVElORzsKIAkJCXBFbnRyeS0+UGFpcndpc2VLZXkuS2V5TGVuID0gMDsKIAkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0KLSNpZmRlZiBSVDI4NjAKLQkJCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYKLQkJCQkocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpKQotCQkJCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQkJCWVsc2UKLSNlbmRpZgogCQkJcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKIAogCQkJcEVudHJ5LT5QTUtJRF9DYWNoZUlkeCA9IEVOVFJZX05PVF9GT1VORDsKIAkJCUNPUFlfTUFDX0FERFIocEVudHJ5LT5BZGRyLCBwQWRkcik7CiAJCQlwRW50cnktPlNzdCA9IFNTVF9OT1RfQVVUSDsKIAkJCXBFbnRyeS0+QXV0aFN0YXRlID0gQVNfTk9UX0FVVEg7Ci0JCQlwRW50cnktPkFpZCA9IChVU0hPUlQpaTsgIC8vMDsKKwkJCXBFbnRyeS0+QWlkID0gKHUxNilpOwkvKjA7ICovCiAJCQlwRW50cnktPkNhcGFiaWxpdHlJbmZvID0gMDsKIAkJCXBFbnRyeS0+UHNNb2RlID0gUFdSX0FDVElWRTsKIAkJCXBFbnRyeS0+UHNRSWRsZUNvdW50ID0gMDsKIAkJCXBFbnRyeS0+Tm9EYXRhSWRsZUNvdW50ID0gMDsKKwkJCXBFbnRyeS0+QXNzb2NEZWFkTGluZSA9IE1BQ19UQUJMRV9BU1NPQ19USU1FT1VUOwogCQkJcEVudHJ5LT5Db250aW51ZVR4RmFpbENudCA9IDA7CiAJCQlJbml0aWFsaXplUXVldWVIZWFkZXIoJnBFbnRyeS0+UHNRdWV1ZSk7CiAKKwkJCXBBZC0+TWFjVGFiLlNpemUrKzsKKwkJCS8qIEFkZCB0aGlzIGVudHJ5IGludG8gQVNJQyBSWCBXQ0lEIHNlYXJjaCB0YWJsZSAqLworCQkJUlRNUF9TVEFfRU5UUllfQUREKHBBZCwgcEVudHJ5KTsKIAotCQkJcEFkLT5NYWNUYWIuU2l6ZSArKzsKLQkJCS8vIEFkZCB0aGlzIGVudHJ5IGludG8gQVNJQyBSWCBXQ0lEIHNlYXJjaCB0YWJsZQotCQkJUlQyOFhYX1NUQV9FTlRSWV9BREQocEFkLCBwRW50cnkpOwotCi0KLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjVGFibGVJbnNlcnRFbnRyeSAtIGFsbG9jYXRlIGVudHJ5ICMlZCwgVG90YWw9ICVkXG4iLGksIHBBZC0+TWFjVGFiLlNpemUpKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIk1hY1RhYmxlSW5zZXJ0RW50cnkgLSBhbGxvY2F0ZSBlbnRyeSAjJWQsIFRvdGFsPSAlZFxuIiwKKwkJCQkgIGksIHBBZC0+TWFjVGFiLlNpemUpKTsKIAkJCWJyZWFrOwogCQl9CiAJfQogCi0JLy8gYWRkIHRoaXMgTUFDIGVudHJ5IGludG8gSEFTSCB0YWJsZQotCWlmIChwRW50cnkpCi0JeworCS8qIGFkZCB0aGlzIE1BQyBlbnRyeSBpbnRvIEhBU0ggdGFibGUgKi8KKwlpZiAocEVudHJ5KSB7CiAJCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZGRyKTsKLQkJaWYgKHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPT0gTlVMTCkKLQkJeworCQlpZiAocEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9PSBOVUxMKSB7CiAJCQlwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdID0gcEVudHJ5OwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJcEN1cnJFbnRyeSA9IHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF07CiAJCQl3aGlsZSAocEN1cnJFbnRyeS0+cE5leHQgIT0gTlVMTCkKIAkJCQlwQ3VyckVudHJ5ID0gcEN1cnJFbnRyeS0+cE5leHQ7CkBAIC0yMjUyLDE0ICsxNjU4LDE0IEBACiAJCURlbGV0ZSBhIHNwZWNpZmllZCBjbGllbnQgZnJvbSBNQUMgdGFibGUKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1CT09MRUFOIE1hY1RhYmxlRGVsZXRlRW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIHdjaWQsCi0JSU4gUFVDSEFSIHBBZGRyKQorQk9PTEVBTiBNYWNUYWJsZURlbGV0ZUVudHJ5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICB1MTYgd2NpZCwgdTggKnBBZGRyKQogewotCVVTSE9SVCBIYXNoSWR4OwotCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5LCAqcFByZXZFbnRyeSwgKnBQcm9iZUVudHJ5OworCXUxNiBIYXNoSWR4OworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwgKnBQcmV2RW50cnksICpwUHJvYmVFbnRyeTsKIAlCT09MRUFOIENhbmNlbGxlZDsKKwkvKnUxNiAgICAgICAgb2Zmc2V0OyAvLyB1bnVzZWQgdmFyaWFibGUgKi8KKwkvKnU4IGo7ICAgICAgICAgICAgICAgICAgICAgIC8vIHVudXNlZCB2YXJpYWJsZSAqLwogCiAJaWYgKHdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCiAJCXJldHVybiBGQUxTRTsKQEAgLTIyNjcsMzYgKzE2NzMsMzMgQEAKIAlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwogCiAJSGFzaElkeCA9IE1BQ19BRERSX0hBU0hfSU5ERVgocEFkZHIpOworCS8qcEVudHJ5ID0gcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XTsgKi8KIAlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFt3Y2lkXTsKIAotCWlmIChwRW50cnkgJiYgKHBFbnRyeS0+VmFsaWRBc0NMSSB8fCBwRW50cnktPlZhbGlkQXNBcENsaSB8fCBwRW50cnktPlZhbGlkQXNXRFMgfHwgcEVudHJ5LT5WYWxpZEFzTWVzaAotCQkpKQotCXsKLQkJaWYgKE1BQ19BRERSX0VRVUFMKHBFbnRyeS0+QWRkciwgcEFkZHIpKQotCQl7CisJaWYgKHBFbnRyeQorCSAgICAmJiAocEVudHJ5LT5WYWxpZEFzQ0xJIHx8IHBFbnRyeS0+VmFsaWRBc0FwQ2xpIHx8IHBFbnRyeS0+VmFsaWRBc1dEUworCQl8fCBwRW50cnktPlZhbGlkQXNNZXNoKSkgeworCQlpZiAoTUFDX0FERFJfRVFVQUwocEVudHJ5LT5BZGRyLCBwQWRkcikpIHsKIAotCQkJLy8gRGVsZXRlIHRoaXMgZW50cnkgZnJvbSBBU0lDIG9uLWNoaXAgV0NJRCBUYWJsZQotCQkJUlQyOFhYX1NUQV9FTlRSWV9NQUNfUkVTRVQocEFkLCB3Y2lkKTsKKwkJCS8qIERlbGV0ZSB0aGlzIGVudHJ5IGZyb20gQVNJQyBvbi1jaGlwIFdDSUQgVGFibGUgKi8KKwkJCVJUTVBfU1RBX0VOVFJZX01BQ19SRVNFVChwQWQsIHdjaWQpOwogCi0JCQkvLyBmcmVlIHJlc291cmNlcyBvZiBCQQorCQkJLyogZnJlZSByZXNvdXJjZXMgb2YgQkEgKi8KIAkJCUJBU2Vzc2lvblRlYXJEb3duQUxMKHBBZCwgcEVudHJ5LT5BaWQpOwogCiAJCQlwUHJldkVudHJ5ID0gTlVMTDsKIAkJCXBQcm9iZUVudHJ5ID0gcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XTsKIAkJCUFTU0VSVChwUHJvYmVFbnRyeSk7CiAKLQkJCS8vIHVwZGF0ZSBIYXNoIGxpc3QKLQkJCWRvCi0JCQl7Ci0JCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKLQkJCQl7Ci0JCQkJCWlmIChwUHJldkVudHJ5ID09IE5VTEwpCi0JCQkJCXsKLQkJCQkJCXBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPSBwRW50cnktPnBOZXh0OwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJcFByZXZFbnRyeS0+cE5leHQgPSBwRW50cnktPnBOZXh0OworCQkJLyogdXBkYXRlIEhhc2ggbGlzdCAqLworCQkJZG8geworCQkJCWlmIChwUHJvYmVFbnRyeSA9PSBwRW50cnkpIHsKKwkJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkgeworCQkJCQkJcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9CisJCQkJCQkgICAgcEVudHJ5LT5wTmV4dDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXBQcmV2RW50cnktPnBOZXh0ID0KKwkJCQkJCSAgICBwRW50cnktPnBOZXh0OwogCQkJCQl9CiAJCQkJCWJyZWFrOwogCQkJCX0KQEAgLTIzMDUsNDggKzE3MDgsNDMgQEAKIAkJCQlwUHJvYmVFbnRyeSA9IHBQcm9iZUVudHJ5LT5wTmV4dDsKIAkJCX0gd2hpbGUgKHBQcm9iZUVudHJ5KTsKIAotCQkJLy8gbm90IGZvdW5kICEhIQorCQkJLyogbm90IGZvdW5kICEgKi8KIAkJCUFTU0VSVChwUHJvYmVFbnRyeSAhPSBOVUxMKTsKIAotCQkJUlQyOFhYX1NUQV9FTlRSWV9LRVlfREVMKHBBZCwgQlNTMCwgd2NpZCk7CisJCQlSVE1QX1NUQV9FTlRSWV9LRVlfREVMKHBBZCwgQlNTMCwgd2NpZCk7CiAKKwkJCWlmIChwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nICE9CisJCQkgICAgRUFQT0xfU1RBUlRfRElTQUJMRSkgeworCQkJCVJUTVBDYW5jZWxUaW1lcigmcEVudHJ5LT4KKwkJCQkJCUVucXVldWVTdGFydEZvclBTS1RpbWVyLAorCQkJCQkJJkNhbmNlbGxlZCk7CisJCQkJcEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyA9CisJCQkJICAgIEVBUE9MX1NUQVJUX0RJU0FCTEU7CisJCQl9CiAKLQkJaWYgKHBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgIT0gRUFQT0xfU1RBUlRfRElTQUJMRSkKLQkJewotCQkJUlRNUENhbmNlbFRpbWVyKCZwRW50cnktPkVucXVldWVTdGFydEZvclBTS1RpbWVyLCAmQ2FuY2VsbGVkKTsKLQkJCXBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgPSBFQVBPTF9TVEFSVF9ESVNBQkxFOwotCQl9Ci0KLQotICAgCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoTUFDX1RBQkxFX0VOVFJZKSk7Ci0JCQlwQWQtPk1hY1RhYi5TaXplIC0tOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjVGFibGVEZWxldGVFbnRyeTEgLSBUb3RhbD0gJWRcbiIsIHBBZC0+TWFjVGFiLlNpemUpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXByaW50aygiXG4lczogSW1wb3NzaWJsZSBXY2lkID0gJWQgISEhISFcbiIsIF9fZnVuY19fLCB3Y2lkKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkpKTsKKwkJCXBBZC0+TWFjVGFiLlNpemUtLTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIk1hY1RhYmxlRGVsZXRlRW50cnkxIC0gVG90YWw9ICVkXG4iLAorCQkJCSAgcEFkLT5NYWNUYWIuU2l6ZSkpOworCQl9IGVsc2UgeworCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLAorCQkJCSAoIlxuJXM6IEltcG9zc2libGUgV2NpZCA9ICVkICFcbiIsCisJCQkJICBfX2Z1bmNfXywgd2NpZCkpOwogCQl9CiAJfQogCiAJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKIAotCS8vUmVzZXQgb3BlcmF0aW5nIG1vZGUgd2hlbiBubyBTdGEuCi0JaWYgKHBBZC0+TWFjVGFiLlNpemUgPT0gMCkKLQl7CisJLypSZXNldCBvcGVyYXRpbmcgbW9kZSB3aGVuIG5vIFN0YS4gKi8KKwlpZiAocEFkLT5NYWNUYWIuU2l6ZSA9PSAwKSB7CiAJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSA9IDA7Ci0jaWZkZWYgUlQyODYwCi0JCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgMCAvKnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSovLCAoQUxMTl9TRVRQUk9URUNUKSwgVFJVRSwgMCAvKnBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTm9uR0YqLyk7Ci0jZWxzZQotCQkvLyBlZGl0IGJ5IGpvaG5saSwgZml4ICJpbl9pbnRlcnJ1cHQiIGVycm9yIHdoZW4gY2FsbCAiTWFjVGFibGVEZWxldGVFbnRyeSIgaW4gUnggdGFza2xldAotCQkvLyBTZXQgTUFDIHJlZ2lzdGVyIHZhbHVlIGFjY29yZGluZyBvcGVyYXRpb24gbW9kZQotCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9VUERBVEVfUFJPVEVDVCwgTlVMTCwgMCk7Ci0jZW5kaWYKKwkJUlRNUF9VUERBVEVfUFJPVEVDVChwQWQpOwkvKiBlZGl0IGJ5IGpvaG5saSwgZml4ICJpbl9pbnRlcnJ1cHQiIGVycm9yIHdoZW4gY2FsbCAiTWFjVGFibGVEZWxldGVFbnRyeSIgaW4gUnggdGFza2xldCAqLwogCX0KIAogCXJldHVybiBUUlVFOwogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAlEZXNjcmlwdGlvbjoKQEAgLTIzNTQsMzQgKzE3NTIsMzAgQEAKIAkJdGhlIHBvd2VyLXNhdmluZyBxdWV1ZXMgYXJlIGZyZWVkIGhlcmUuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBNYWNUYWJsZVJlc2V0KAotCUlOICBQUlRNUF9BREFQVEVSICBwQWQpCit2b2lkIE1hY1RhYmxlUmVzZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCWludCAgICAgICAgIGk7CisJaW50IGk7CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNUYWJsZVJlc2V0XG4iKSk7Ci0JLy9OZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCS8qTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsgKi8KIAotCWZvciAoaT0xOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCi0JewotI2lmZGVmIFJUMjg2MAotCQlSVDI4WFhfU1RBX0VOVFJZX01BQ19SRVNFVChwQWQsIGkpOwotI2VuZGlmCi0JCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgPT0gVFJVRSkKLQkgICB7Ci0JCQkvLyBmcmVlIHJlc291cmNlcyBvZiBCQQorCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKSB7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJCVJUTVBfU1RBX0VOVFJZX01BQ19SRVNFVChwQWQsIGkpOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJID09IFRSVUUpIHsKKworCQkJLyogZnJlZSByZXNvdXJjZXMgb2YgQkEgKi8KIAkJCUJBU2Vzc2lvblRlYXJEb3duQUxMKHBBZCwgaSk7CiAKIAkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSA9IEZBTFNFOwogCi0KLQotI2lmZGVmIFJUMjg3MAorI2lmZGVmIFJUTVBfTUFDX1VTQgogCQkJTmRpc1plcm9NZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtpXS5BZGRyLCA2KTsKLQkJCVJUMjhYWF9TVEFfRU5UUllfTUFDX1JFU0VUKHBBZCwgaSk7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCisJCQlSVE1QX1NUQV9FTlRSWV9NQUNfUkVTRVQocEFkLCBpKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotCQkJLy9Bc2ljRGVsV2NpZFRhYihwQWQsIGkpOworCQkJLypBc2ljRGVsV2NpZFRhYihwQWQsIGkpOyAqLwogCQl9CiAJfQogCkBAIC0yMzk2LDIyICsxNzkwLDE5IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgQXNzb2NQYXJtRmlsbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBPVVQgTUxNRV9BU1NPQ19SRVFfU1RSVUNUICpBc3NvY1JlcSwKLQlJTiBQVUNIQVIgICAgICAgICAgICAgICAgICAgICBwQWRkciwKLQlJTiBVU0hPUlQgICAgICAgICAgICAgICAgICAgICBDYXBhYmlsaXR5SW5mbywKLQlJTiBVTE9ORyAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0LAotCUlOIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgIExpc3RlbkludHYpCit2b2lkIEFzc29jUGFybUZpbGwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICBzdHJ1Y3QgcnRfbWxtZV9hc3NvY19yZXEgKkFzc29jUmVxLAorCQkgICB1OCAqcEFkZHIsCisJCSAgIHUxNiBDYXBhYmlsaXR5SW5mbywKKwkJICAgdW5zaWduZWQgbG9uZyBUaW1lb3V0LCB1MTYgTGlzdGVuSW50dikKIHsKIAlDT1BZX01BQ19BRERSKEFzc29jUmVxLT5BZGRyLCBwQWRkcik7Ci0JLy8gQWRkIG1hc2sgdG8gc3VwcG9ydCA4MDIuMTFiIG1vZGUgb25seQotCUFzc29jUmVxLT5DYXBhYmlsaXR5SW5mbyA9IENhcGFiaWxpdHlJbmZvICYgU1VQUE9SVEVEX0NBUEFCSUxJVFlfSU5GTzsgLy8gbm90IGNmLXBvbGxhYmxlLCBub3QgY2YtcG9sbC1yZXF1ZXN0CisJLyogQWRkIG1hc2sgdG8gc3VwcG9ydCA4MDIuMTFiIG1vZGUgb25seSAqLworCUFzc29jUmVxLT5DYXBhYmlsaXR5SW5mbyA9IENhcGFiaWxpdHlJbmZvICYgU1VQUE9SVEVEX0NBUEFCSUxJVFlfSU5GTzsJLyogbm90IGNmLXBvbGxhYmxlLCBub3QgY2YtcG9sbC1yZXF1ZXN0ICovCiAJQXNzb2NSZXEtPlRpbWVvdXQgPSBUaW1lb3V0OwogCUFzc29jUmVxLT5MaXN0ZW5JbnR2ID0gTGlzdGVuSW50djsKIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJRGVzY3JpcHRpb246CkBAIC0yNDIwLDE3ICsxODExLDE0IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgRGlzYXNzb2NQYXJtRmlsbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBPVVQgTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICpEaXNhc3NvY1JlcSwKLQlJTiBQVUNIQVIgcEFkZHIsCi0JSU4gVVNIT1JUIFJlYXNvbikKK3ZvaWQgRGlzYXNzb2NQYXJtRmlsbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgIHN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSAqRGlzYXNzb2NSZXEsCisJCSAgICAgIHU4ICpwQWRkciwgdTE2IFJlYXNvbikKIHsKIAlDT1BZX01BQ19BRERSKERpc2Fzc29jUmVxLT5BZGRyLCBwQWRkcik7CiAJRGlzYXNzb2NSZXEtPlJlYXNvbiA9IFJlYXNvbjsKIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0yNDY1LDc2ICsxODUzLDY5IEBACiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwogCi1CT09MRUFOIFJUTVBDaGVja0RIQ1BGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKK0JPT0xFQU4gUlRNUENoZWNrREhDUEZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdm9pZCAqcFBhY2tldCkKIHsKLQlQQUNLRVRfSU5GTyAJUGFja2V0SW5mbzsKLQlVTE9ORwkJCU51bWJlck9mQnl0ZXNSZWFkID0gMDsKLQlVTE9ORwkJCUN1cnJlbnRPZmZzZXQgPSAwOwotCVBWT0lECQkJcFZpcnR1YWxBZGRyZXNzID0gTlVMTDsKLQlVSU5UCQkJTmRpc0J1ZmZlckxlbmd0aDsKLQlQVUNIQVIJCQlwU3JjOwotCVVTSE9SVAkJCVByb3RvY29sOwotCVVDSEFSCQkJQnl0ZU9mZnNldDM2ID0gMDsKLQlVQ0hBUgkJCUJ5dGVPZmZzZXQzOCA9IDA7Ci0JQk9PTEVBTiAJCVJlYWRGaXJzdFBhcm0gPSBUUlVFOworCXN0cnVjdCBydF9wYWNrZXRfaW5mbyBQYWNrZXRJbmZvOworCXVuc2lnbmVkIGxvbmcgTnVtYmVyT2ZCeXRlc1JlYWQgPSAwOworCXVuc2lnbmVkIGxvbmcgQ3VycmVudE9mZnNldCA9IDA7CisJdm9pZCAqcFZpcnR1YWxBZGRyZXNzID0gTlVMTDsKKwl1MzIgTmRpc0J1ZmZlckxlbmd0aDsKKwl1OCAqcFNyYzsKKwl1MTYgUHJvdG9jb2w7CisJdTggQnl0ZU9mZnNldDM2ID0gMDsKKwl1OCBCeXRlT2Zmc2V0MzggPSAwOworCUJPT0xFQU4gUmVhZEZpcnN0UGFybSA9IFRSVUU7CiAKLQlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgKFBVQ0hBUiAqKSZwVmlydHVhbEFkZHJlc3MsICZOZGlzQnVmZmVyTGVuZ3RoKTsKKwlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgKHU4ICoqKSAmIHBWaXJ0dWFsQWRkcmVzcywKKwkJCSAgICAgJk5kaXNCdWZmZXJMZW5ndGgpOwogCiAJTnVtYmVyT2ZCeXRlc1JlYWQgKz0gTmRpc0J1ZmZlckxlbmd0aDsKLQlwU3JjID0gKFBVQ0hBUikgcFZpcnR1YWxBZGRyZXNzOworCXBTcmMgPSAodTggKilwVmlydHVhbEFkZHJlc3M7CiAJUHJvdG9jb2wgPSAqKHBTcmMgKyAxMikgKiAyNTYgKyAqKHBTcmMgKyAxMyk7CiAKLQkvLwotCS8vIENoZWNrIERIQ1AgJiBCT09UUCBwcm90b2NvbAotCS8vCi0Jd2hpbGUgKE51bWJlck9mQnl0ZXNSZWFkIDw9IFBhY2tldEluZm8uVG90YWxQYWNrZXRMZW5ndGgpCi0JewotCQlpZiAoKE51bWJlck9mQnl0ZXNSZWFkID49IDM1KSAmJiAoUmVhZEZpcnN0UGFybSA9PSBUUlVFKSkKLQkJewotCQkJQ3VycmVudE9mZnNldCA9IDM1IC0gKE51bWJlck9mQnl0ZXNSZWFkIC0gTmRpc0J1ZmZlckxlbmd0aCk7CisJLyogKi8KKwkvKiBDaGVjayBESENQICYgQk9PVFAgcHJvdG9jb2wgKi8KKwkvKiAqLworCXdoaWxlIChOdW1iZXJPZkJ5dGVzUmVhZCA8PSBQYWNrZXRJbmZvLlRvdGFsUGFja2V0TGVuZ3RoKSB7CisJCWlmICgoTnVtYmVyT2ZCeXRlc1JlYWQgPj0gMzUpICYmIChSZWFkRmlyc3RQYXJtID09IFRSVUUpKSB7CisJCQlDdXJyZW50T2Zmc2V0ID0KKwkJCSAgICAzNSAtIChOdW1iZXJPZkJ5dGVzUmVhZCAtIE5kaXNCdWZmZXJMZW5ndGgpOwogCQkJQnl0ZU9mZnNldDM2ID0gKihwU3JjICsgQ3VycmVudE9mZnNldCk7CiAJCQlSZWFkRmlyc3RQYXJtID0gRkFMU0U7CiAJCX0KIAotCQlpZiAoTnVtYmVyT2ZCeXRlc1JlYWQgPj0gMzcpCi0JCXsKLQkJCUN1cnJlbnRPZmZzZXQgPSAzNyAtIChOdW1iZXJPZkJ5dGVzUmVhZCAtIE5kaXNCdWZmZXJMZW5ndGgpOworCQlpZiAoTnVtYmVyT2ZCeXRlc1JlYWQgPj0gMzcpIHsKKwkJCUN1cnJlbnRPZmZzZXQgPQorCQkJICAgIDM3IC0gKE51bWJlck9mQnl0ZXNSZWFkIC0gTmRpc0J1ZmZlckxlbmd0aCk7CiAJCQlCeXRlT2Zmc2V0MzggPSAqKHBTcmMgKyBDdXJyZW50T2Zmc2V0KTsKLQkJCS8vRW5kIG9mIFJlYWQKKwkJCS8qRW5kIG9mIFJlYWQgKi8KIAkJCWJyZWFrOwogCQl9CiAJCXJldHVybiBGQUxTRTsKIAl9CiAKLQkvLyBDaGVjayBmb3IgREhDUCAmIEJPT1RQIHByb3RvY29sCi0JaWYgKChCeXRlT2Zmc2V0MzYgIT0gMHg0NCkgfHwgKEJ5dGVPZmZzZXQzOCAhPSAweDQzKSkKLQkJewotCQkvLwotCQkvLyAyMDU0IChoZXggMDgwNikgZm9yIEFSUCBkYXRhZ3JhbXMKLQkJLy8gaWYgdGhpcyBwYWNrZXQgaXMgbm90IEFSUCBkYXRhZ3JhbXMsIHRoZW4gZG8gbm90aGluZwotCQkvLyBBUlAgZGF0YWdyYW1zIHdpbGwgYWxzbyBiZSBkdXBsaWNhdGUgYXQgMW1iIGJyb2FkY2FzdCBmcmFtZXMKLQkJLy8KLQkJaWYgKFByb3RvY29sICE9IDB4MDgwNiApCisJLyogQ2hlY2sgZm9yIERIQ1AgJiBCT09UUCBwcm90b2NvbCAqLworCWlmICgoQnl0ZU9mZnNldDM2ICE9IDB4NDQpIHx8IChCeXRlT2Zmc2V0MzggIT0gMHg0MykpIHsKKwkJLyogKi8KKwkJLyogMjA1NCAoaGV4IDA4MDYpIGZvciBBUlAgZGF0YWdyYW1zICovCisJCS8qIGlmIHRoaXMgcGFja2V0IGlzIG5vdCBBUlAgZGF0YWdyYW1zLCB0aGVuIGRvIG5vdGhpbmcgKi8KKwkJLyogQVJQIGRhdGFncmFtcyB3aWxsIGFsc28gYmUgZHVwbGljYXRlIGF0IDFtYiBicm9hZGNhc3QgZnJhbWVzICovCisJCS8qICovCisJCWlmIChQcm90b2NvbCAhPSAweDA4MDYpCiAJCQlyZXR1cm4gRkFMU0U7Ci0JCX0KKwl9CiAKIAlyZXR1cm4gVFJVRTsKIH0KIAotCi1CT09MRUFOIFJUTVBDaGVja0V0aGVyVHlwZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKK0JPT0xFQU4gUlRNUENoZWNrRXRoZXJUeXBlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdm9pZCAqcFBhY2tldCkKIHsKLQlVU0hPUlQJVHlwZUxlbjsKLQlVQ0hBUglCeXRlMCwgQnl0ZTE7Ci0JUFVDSEFSCXBTcmNCdWY7Ci0JVUlOVDMyCXBrdExlbjsKLQlVSU5UMTYgCXNyY1BvcnQsIGRzdFBvcnQ7Ci0JQk9PTEVBTglzdGF0dXMgPSBUUlVFOwotCisJdTE2IFR5cGVMZW47CisJdTggQnl0ZTAsIEJ5dGUxOworCXU4ICpwU3JjQnVmOworCXUzMiBwa3RMZW47CisJdTE2IHNyY1BvcnQsIGRzdFBvcnQ7CisJQk9PTEVBTiBzdGF0dXMgPSBUUlVFOwogCiAJcFNyY0J1ZiA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKIAlwa3RMZW4gPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKQEAgLTI1NDMsMzUgKzE5MjQsMzEgQEAKIAogCVJUTVBfU0VUX1BBQ0tFVF9TUEVDSUZJQyhwUGFja2V0LCAwKTsKIAotCS8vIGdldCBFdGhlcm5ldCBwcm90b2NvbCBmaWVsZAotCVR5cGVMZW4gPSAocFNyY0J1ZlsxMl0gPDwgOCkgKyBwU3JjQnVmWzEzXTsKKwkvKiBnZXQgRXRoZXJuZXQgcHJvdG9jb2wgZmllbGQgKi8KKwlUeXBlTGVuID0gKHBTcmNCdWZbMTJdIDw8IDgpIHwgcFNyY0J1ZlsxM107CiAKLQlwU3JjQnVmICs9IExFTkdUSF84MDJfMzsJLy8gU2tpcCB0aGUgRXRoZXJuZXQgSGVhZGVyLgorCXBTcmNCdWYgKz0gTEVOR1RIXzgwMl8zOwkvKiBTa2lwIHRoZSBFdGhlcm5ldCBIZWFkZXIuICovCiAKLQlpZiAoVHlwZUxlbiA8PSAxNTAwKQotCXsJLy8gODAyLjMsIDgwMi4zIExMQworCWlmIChUeXBlTGVuIDw9IDE1MDApIHsJLyogODAyLjMsIDgwMi4zIExMQyAqLwogCQkvKgotCQkJRGVzdE1BQyg2KSArIFNyY01BQyg2KSArIExlbmdodCgyKSArCi0JCQlEU0FQKDEpICsgU1NBUCgxKSArIENvbnRyb2woMSkgKwotCQkJaWYgdGhlIERTQVAgPSAweEFBLCBTU0FQPTB4QUEsIENvbnRvcmwgPSAweDAzLCBpdCBoYXMgYSA1LWJ5dGVzIFNOQVAgaGVhZGVyLgotCQkJCT0+ICsgU05BUCAoNSwgT3JpZ2luYXRpb25JRCgzKSArIGV0aGVyVHlwZSgyKSkKLQkJKi8KLQkJaWYgKHBTcmNCdWZbMF0gPT0gMHhBQSAmJiBwU3JjQnVmWzFdID09IDB4QUEgJiYgcFNyY0J1ZlsyXSA9PSAweDAzKQotCQl7Ci0JCQlTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKHBTcmNCdWYsIDYsICZCeXRlMCwgJkJ5dGUxKTsKKwkJICAgRGVzdE1BQyg2KSArIFNyY01BQyg2KSArIExlbmdodCgyKSArCisJCSAgIERTQVAoMSkgKyBTU0FQKDEpICsgQ29udHJvbCgxKSArCisJCSAgIGlmIHRoZSBEU0FQID0gMHhBQSwgU1NBUD0weEFBLCBDb250b3JsID0gMHgwMywgaXQgaGFzIGEgNS1ieXRlcyBTTkFQIGhlYWRlci4KKwkJICAgPT4gKyBTTkFQICg1LCBPcmlnaW5hdGlvbklEKDMpICsgZXRoZXJUeXBlKDIpKQorCQkgKi8KKwkJaWYgKHBTcmNCdWZbMF0gPT0gMHhBQSAmJiBwU3JjQnVmWzFdID09IDB4QUEKKwkJICAgICYmIHBTcmNCdWZbMl0gPT0gMHgwMykgeworCQkJU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcigoY2hhciAqKXBTcmNCdWYsIDYsCisJCQkJCQkgICZCeXRlMCwgJkJ5dGUxKTsKIAkJCVJUTVBfU0VUX1BBQ0tFVF9MTENTTkFQKHBQYWNrZXQsIDEpOwotCQkJVHlwZUxlbiA9IChVU0hPUlQpKChCeXRlMCA8PCA4KSArIEJ5dGUxKTsKLQkJCXBTcmNCdWYgKz0gODsgLy8gU2tpcCB0aGlzIExMQy9TTkFQIGhlYWRlcgotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy9JdCBqdXN0IGhhcyAzLWJ5dGUgTExDIGhlYWRlciwgbWF5YmUgYSBsZWdhY3kgZXRoZXIgdHlwZSBmcmFtZS4gd2UgZGlkbid0IGhhbmRsZSBpdC4KKwkJCVR5cGVMZW4gPSAodTE2KSgoQnl0ZTAgPDwgOCkgKyBCeXRlMSk7CisJCQlwU3JjQnVmICs9IDg7CS8qIFNraXAgdGhpcyBMTEMvU05BUCBoZWFkZXIgKi8KKwkJfSBlbHNlIHsKKwkJCS8qSXQganVzdCBoYXMgMy1ieXRlIExMQyBoZWFkZXIsIG1heWJlIGEgbGVnYWN5IGV0aGVyIHR5cGUgZnJhbWUuIHdlIGRpZG4ndCBoYW5kbGUgaXQuICovCiAJCX0KIAl9Ci0KLQkvLyBJZiBpdCdzIGEgVkxBTiBwYWNrZXQsIGdldCB0aGUgcmVhbCBUeXBlL0xlbmd0aCBmaWVsZC4KLQlpZiAoVHlwZUxlbiA9PSAweDgxMDApCi0JeworCS8qIElmIGl0J3MgYSBWTEFOIHBhY2tldCwgZ2V0IHRoZSByZWFsIFR5cGUvTGVuZ3RoIGZpZWxkLiAqLworCWlmIChUeXBlTGVuID09IDB4ODEwMCkgewogCQkvKiAweDgxMDAgbWVhbnMgVkxBTiBwYWNrZXRzICovCiAKIAkJLyogRGVzdC4gTUFDIEFkZHJlc3MgKDYtYnl0ZXMpICsKQEAgLTI1ODQsMjQzICsxOTYxLDIyOSBAQAogCQkgICBGcmFtZSBDaGVjayBTZXF1ZW5jZSAoNC1ieXRlcykgKi8KIAogCQlSVE1QX1NFVF9QQUNLRVRfVkxBTihwUGFja2V0LCAxKTsKLQkJU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcihwU3JjQnVmLCAyLCAmQnl0ZTAsICZCeXRlMSk7Ci0JCVR5cGVMZW4gPSAoVVNIT1JUKSgoQnl0ZTAgPDwgOCkgKyBCeXRlMSk7CisJCVNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIoKGNoYXIgKilwU3JjQnVmLCAyLCAmQnl0ZTAsCisJCQkJCSAgJkJ5dGUxKTsKKwkJVHlwZUxlbiA9ICh1MTYpKChCeXRlMCA8PCA4KSArIEJ5dGUxKTsKIAotCQlwU3JjQnVmICs9IDQ7IC8vIFNraXAgdGhlIFZMQU4gSGVhZGVyLgorCQlwU3JjQnVmICs9IDQ7CS8qIFNraXAgdGhlIFZMQU4gSGVhZGVyLiAqLwogCX0KIAotCXN3aXRjaCAoVHlwZUxlbikKLQl7Ci0JCWNhc2UgMHgwODAwOgotCQkJewotCQkJCUFTU0VSVCgocGt0TGVuID4gMzQpKTsKLQkJCQlpZiAoKihwU3JjQnVmICsgOSkgPT0gMHgxMSkKLQkJCQl7CS8vIHVkcCBwYWNrZXQKLQkJCQkJQVNTRVJUKChwa3RMZW4gPiAzNCkpOwkvLyAxNCBmb3IgZXRoZXJuZXQgaGVhZGVyLCAyMCBmb3IgSVAgaGVhZGVyCisJc3dpdGNoIChUeXBlTGVuKSB7CisJY2FzZSAweDA4MDA6CisJCXsKKwkJCUFTU0VSVCgocGt0TGVuID4gMzQpKTsKKwkJCWlmICgqKHBTcmNCdWYgKyA5KSA9PSAweDExKSB7CS8qIHVkcCBwYWNrZXQgKi8KKwkJCQlBU1NFUlQoKHBrdExlbiA+IDM0KSk7CS8qIDE0IGZvciBldGhlcm5ldCBoZWFkZXIsIDIwIGZvciBJUCBoZWFkZXIgKi8KIAotCQkJCQlwU3JjQnVmICs9IDIwOwkvLyBTa2lwIHRoZSBJUCBoZWFkZXIKLQkJCQkJc3JjUG9ydCA9IE9TX05UT0hTKCooKFVJTlQxNiAqKXBTcmNCdWYpKTsKLQkJCQkJZHN0UG9ydCA9IE9TX05UT0hTKCooKFVJTlQxNiAqKShwU3JjQnVmICsyKSkpOworCQkJCXBTcmNCdWYgKz0gMjA7CS8qIFNraXAgdGhlIElQIGhlYWRlciAqLworCQkJCXNyY1BvcnQgPQorCQkJCSAgICBPU19OVE9IUyhnZXRfdW5hbGlnbmVkCisJCQkJCSAgICAgKCh1MTYgKikocFNyY0J1ZikpKTsKKwkJCQlkc3RQb3J0ID0KKwkJCQkgICAgT1NfTlRPSFMoZ2V0X3VuYWxpZ25lZAorCQkJCQkgICAgICgodTE2ICopKHBTcmNCdWYgKyAyKSkpOwogCi0JCQkJCWlmICgoc3JjUG9ydD09MHg0NCAmJiBkc3RQb3J0PT0weDQzKSB8fCAoc3JjUG9ydD09MHg0MyAmJiBkc3RQb3J0PT0weDQ0KSkKLQkJCQkJewkvL0l0J3MgYSBCT09UUC9ESENQIHBhY2tldAotCQkJCQkJUlRNUF9TRVRfUEFDS0VUX0RIQ1AocFBhY2tldCwgMSk7Ci0JCQkJCX0KKwkJCQlpZiAoKHNyY1BvcnQgPT0gMHg0NCAmJiBkc3RQb3J0ID09IDB4NDMpIHx8IChzcmNQb3J0ID09IDB4NDMgJiYgZHN0UG9ydCA9PSAweDQ0KSkgewkvKkl0J3MgYSBCT09UUC9ESENQIHBhY2tldCAqLworCQkJCQlSVE1QX1NFVF9QQUNLRVRfREhDUChwUGFja2V0LCAxKTsKIAkJCQl9CiAJCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAweDA4MDY6Ci0JCQl7Ci0JCQkJLy9BUlAgUGFja2V0LgotCQkJCVJUTVBfU0VUX1BBQ0tFVF9ESENQKHBQYWNrZXQsIDEpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMHg4ODhlOgotCQkJewotCQkJCS8vIEVBUE9MIFBhY2tldC4KLQkJCQlSVE1QX1NFVF9QQUNLRVRfRUFQT0wocFBhY2tldCwgMSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXN0YXR1cyA9IEZBTFNFOwotCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAweDA4MDY6CisJCXsKKwkJCS8qQVJQIFBhY2tldC4gKi8KKwkJCVJUTVBfU0VUX1BBQ0tFVF9ESENQKHBQYWNrZXQsIDEpOworCQl9CisJCWJyZWFrOworCWNhc2UgMHg4ODhlOgorCQl7CisJCQkvKiBFQVBPTCBQYWNrZXQuICovCisJCQlSVE1QX1NFVF9QQUNLRVRfRUFQT0wocFBhY2tldCwgMSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3RhdHVzID0gRkFMU0U7CisJCWJyZWFrOwogCX0KIAogCXJldHVybiBzdGF0dXM7CiAKIH0KIAordm9pZCBVcGRhdGVfUnNzaV9TYW1wbGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJc3RydWN0IHJ0X3Jzc2lfc2FtcGxlICpwUnNzaSwgc3RydWN0IHJ0X3J4d2kgKiBwUnhXSSkKK3sKKwljaGFyIHJzc2kwID0gcFJ4V0ktPlJTU0kwOworCWNoYXIgcnNzaTEgPSBwUnhXSS0+UlNTSTE7CisJY2hhciByc3NpMiA9IHBSeFdJLT5SU1NJMjsKIAotCi1WT0lEIFVwZGF0ZV9Sc3NpX1NhbXBsZSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBSU1NJX1NBTVBMRQkJKnBSc3NpLAotCUlOIFBSWFdJX1NUUlVDCQlwUnhXSSkKLQkJewotCUNIQVIJcnNzaTAgPSBwUnhXSS0+UlNTSTA7Ci0JQ0hBUglyc3NpMSA9IHBSeFdJLT5SU1NJMTsKLQlDSEFSCXJzc2kyID0gcFJ4V0ktPlJTU0kyOwotCi0JaWYgKHJzc2kwICE9IDApCi0JewotCQlwUnNzaS0+TGFzdFJzc2kwCT0gQ29udmVydFRvUnNzaShwQWQsIChDSEFSKXJzc2kwLCBSU1NJXzApOwotCQlwUnNzaS0+QXZnUnNzaTBYOAk9IChwUnNzaS0+QXZnUnNzaTBYOCAtIHBSc3NpLT5BdmdSc3NpMCkgKyBwUnNzaS0+TGFzdFJzc2kwOwotCQlwUnNzaS0+QXZnUnNzaTAJPSBwUnNzaS0+QXZnUnNzaTBYOCA+PiAzOworCWlmIChyc3NpMCAhPSAwKSB7CisJCXBSc3NpLT5MYXN0UnNzaTAgPSBDb252ZXJ0VG9Sc3NpKHBBZCwgKGNoYXIpcnNzaTAsIFJTU0lfMCk7CisJCXBSc3NpLT5BdmdSc3NpMFg4ID0KKwkJICAgIChwUnNzaS0+QXZnUnNzaTBYOCAtIHBSc3NpLT5BdmdSc3NpMCkgKyBwUnNzaS0+TGFzdFJzc2kwOworCQlwUnNzaS0+QXZnUnNzaTAgPSBwUnNzaS0+QXZnUnNzaTBYOCA+PiAzOwogCX0KIAotCWlmIChyc3NpMSAhPSAwKQotCXsKLQkJcFJzc2ktPkxhc3RSc3NpMQk9IENvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUilyc3NpMSwgUlNTSV8xKTsKLQkJcFJzc2ktPkF2Z1Jzc2kxWDgJPSAocFJzc2ktPkF2Z1Jzc2kxWDggLSBwUnNzaS0+QXZnUnNzaTEpICsgcFJzc2ktPkxhc3RSc3NpMTsKLQkJcFJzc2ktPkF2Z1Jzc2kxCT0gcFJzc2ktPkF2Z1Jzc2kxWDggPj4gMzsKKwlpZiAocnNzaTEgIT0gMCkgeworCQlwUnNzaS0+TGFzdFJzc2kxID0gQ29udmVydFRvUnNzaShwQWQsIChjaGFyKXJzc2kxLCBSU1NJXzEpOworCQlwUnNzaS0+QXZnUnNzaTFYOCA9CisJCSAgICAocFJzc2ktPkF2Z1Jzc2kxWDggLSBwUnNzaS0+QXZnUnNzaTEpICsgcFJzc2ktPkxhc3RSc3NpMTsKKwkJcFJzc2ktPkF2Z1Jzc2kxID0gcFJzc2ktPkF2Z1Jzc2kxWDggPj4gMzsKIAl9CiAKLQlpZiAocnNzaTIgIT0gMCkKLQl7Ci0JCXBSc3NpLT5MYXN0UnNzaTIJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpcnNzaTIsIFJTU0lfMik7Ci0JCXBSc3NpLT5BdmdSc3NpMlg4ICA9IChwUnNzaS0+QXZnUnNzaTJYOCAtIHBSc3NpLT5BdmdSc3NpMikgKyBwUnNzaS0+TGFzdFJzc2kyOworCWlmIChyc3NpMiAhPSAwKSB7CisJCXBSc3NpLT5MYXN0UnNzaTIgPSBDb252ZXJ0VG9Sc3NpKHBBZCwgKGNoYXIpcnNzaTIsIFJTU0lfMik7CisJCXBSc3NpLT5BdmdSc3NpMlg4ID0KKwkJICAgIChwUnNzaS0+QXZnUnNzaTJYOCAtIHBSc3NpLT5BdmdSc3NpMikgKyBwUnNzaS0+TGFzdFJzc2kyOwogCQlwUnNzaS0+QXZnUnNzaTIgPSBwUnNzaS0+QXZnUnNzaTJYOCA+PiAzOwogCX0KIH0KIAotCi0KLS8vIE5vcm1hbCBsZWdhY3kgUnggcGFja2V0IGluZGljYXRpb24KLVZPSUQgSW5kaWNhdGVfTGVnYWN5X1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCisvKiBOb3JtYWwgbGVnYWN5IFJ4IHBhY2tldCBpbmRpY2F0aW9uICovCit2b2lkIEluZGljYXRlX0xlZ2FjeV9QYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaywgdTggRnJvbVdoaWNoQlNTSUQpCiB7Ci0JUE5ESVNfUEFDS0VUCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OwotCVVDSEFSCQkJSGVhZGVyODAyXzNbTEVOR1RIXzgwMl8zXTsKKwl2b2lkICpwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKKwl1OCBIZWFkZXI4MDJfM1tMRU5HVEhfODAyXzNdOwogCi0JLy8gMS4gZ2V0IDgwMi4zIEhlYWRlcgotCS8vIDIuIHJlbW92ZSBMTEMKLQkvLyAJCWEuIHBvaW50ZXIgcFJ4QmxrLT5wRGF0YSB0byBwYXlsb2FkCi0JLy8gICAgICBiLiBtb2RpZnkgcFJ4QmxrLT5EYXRhU2l6ZQorCS8qIDEuIGdldCA4MDIuMyBIZWFkZXIgKi8KKwkvKiAyLiByZW1vdmUgTExDICovCisJLyogICAgICAgICAgICAgIGEuIHBvaW50ZXIgcFJ4QmxrLT5wRGF0YSB0byBwYXlsb2FkICovCisJLyogICAgICBiLiBtb2RpZnkgcFJ4QmxrLT5EYXRhU2l6ZSAqLwogCVJUTVBfODAyXzExX1JFTU9WRV9MTENfQU5EX0NPTlZFUlRfVE9fODAyXzMocFJ4QmxrLCBIZWFkZXI4MDJfMyk7CiAKLQlpZiAocFJ4QmxrLT5EYXRhU2l6ZSA+IE1BWF9SWF9QS1RfTEVOKQotCXsKKwlpZiAocFJ4QmxrLT5EYXRhU2l6ZSA+IE1BWF9SWF9QS1RfTEVOKSB7CiAKLQkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJLyogcmVsZWFzZSBwYWNrZXQgKi8KIAkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCXJldHVybjsKIAl9CiAKLQogCVNUQVRTX0lOQ19SWF9QQUNLRVRTKHBBZCwgRnJvbVdoaWNoQlNTSUQpOwogCi0jaWZkZWYgUlQyODcwCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9PSAwKQotCXsKLQkJUEJBX1JFQ19FTlRSWQkJcEJBRW50cnk7Ci0JCVVMT05HCQkJCU5vdzMyOwotCQlVQ0hBUgkJCQlXY2lkID0gcFJ4QmxrLT5wUnhXSS0+V2lyZWxlc3NDbGlJRDsKLQkJVUNIQVIJCQkJVElEID0gcFJ4QmxrLT5wUnhXSS0+VElEOwotCQlVU0hPUlQJCQkJSWR4OworI2lmZGVmIFJUTVBfTUFDX1VTQgorCWlmIChwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPT0gMCkgeworCQlzdHJ1Y3QgcnRfYmFfcmVjX2VudHJ5ICpwQkFFbnRyeTsKKwkJdW5zaWduZWQgbG9uZyBOb3czMjsKKwkJdTggV2NpZCA9IHBSeEJsay0+cFJ4V0ktPldpcmVsZXNzQ2xpSUQ7CisJCXU4IFRJRCA9IHBSeEJsay0+cFJ4V0ktPlRJRDsKKwkJdTE2IElkeDsKIAotI2RlZmluZSBSRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUCQkoKDEwMCAqIEhaKS8xMDAwKQkvLyBzeXN0ZW0gdGlja3MgLS0gMTAwIG1zCisjZGVmaW5lIFJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQJCSgoMTAwICogT1NfSFopLzEwMDApCS8qIHN5c3RlbSB0aWNrcyAtLSAxMDAgbXMgKi8KIAotCQlpZiAoV2NpZCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQotCQl7CisJCWlmIChXY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpIHsKIAkJCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQkFSZWNXY2lkQXJyYXlbVElEXTsKLQkJCWlmIChJZHggIT0gMCkKLQkJCXsKKwkJCWlmIChJZHggIT0gMCkgewogCQkJCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W0lkeF07Ci0JCQkJLy8gdXBkYXRlIGxhc3QgcnggdGltZQorCQkJCS8qIHVwZGF0ZSBsYXN0IHJ4IHRpbWUgKi8KIAkJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3czMik7CiAJCQkJaWYgKChwQkFFbnRyeS0+bGlzdC5xbGVuID4gMCkgJiYKLQkJCQkJIFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcisoUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpKQotCSAgIAkJCQkpCi0JCQkJewotCQkJCQlwcmludGsoIkluZGljYXRlX0xlZ2FjeV9QYWNrZXQoKTpmbHVzaCByZW9yZGVyaW5nX3RpbWVvdXRfbXBkdXMhIFJ4V0ktPkZsYWdzPSVkLCBwUnhXSS5USUQ9JWQsIFJ4RC0+QU1QRFU9JWQhXG4iLCBwUnhCbGstPkZsYWdzLCBwUnhCbGstPnBSeFdJLT5USUQsIHBSeEJsay0+UnhELkFNUERVKTsKLQkJCQkJaGV4X2R1bXAoIkR1bXAgdGhlIGxlZ2FjeSBQYWNrZXQ6IiwgR0VUX09TX1BLVF9EQVRBUFRSKHBSeEJsay0+cFJ4UGFja2V0KSwgNjQpOwotCQkJCQliYV9mbHVzaF9yZW9yZGVyaW5nX3RpbWVvdXRfbXBkdXMocEFkLCBwQkFFbnRyeSwgTm93MzIpOworCQkJCSAgICBSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsCisJCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT4KKwkJCQkJCQkJICAgIExhc3RJbmRTZXFBdFRpbWVyCisJCQkJCQkJCSAgICArCisJCQkJCQkJCSAgICAoUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpKQorCQkJCSAgICApIHsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLAorCQkJCQkJICgiSW5kaWNhdGVfTGVnYWN5X1BhY2tldCgpOmZsdXNoIHJlb3JkZXJpbmdfdGltZW91dF9tcGR1cyEgUnhXSS0+RmxhZ3M9JWQsIHBSeFdJLlRJRD0lZCwgUnhELT5BTVBEVT0lZCFcbiIsCisJCQkJCQkgIHBSeEJsay0+RmxhZ3MsCisJCQkJCQkgIHBSeEJsay0+cFJ4V0ktPlRJRCwKKwkJCQkJCSAgcFJ4QmxrLT5SeEQuQU1QRFUpKTsKKwkJCQkJaGV4X2R1bXAoIkR1bXAgdGhlIGxlZ2FjeSBQYWNrZXQ6IiwKKwkJCQkJCSBHRVRfT1NfUEtUX0RBVEFQVFIocFJ4QmxrLT4KKwkJCQkJCQkJICAgIHBSeFBhY2tldCksCisJCQkJCQkgNjQpOworCQkJCQliYV9mbHVzaF9yZW9yZGVyaW5nX3RpbWVvdXRfbXBkdXMocEFkLAorCQkJCQkJCQkJICBwQkFFbnRyeSwKKwkJCQkJCQkJCSAgTm93MzIpOwogCQkJCX0KIAkJCX0KIAkJfQogCX0KLSNlbmRpZiAvLyBSVDI4NzAgLy8KKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAogCXdsYW5fODAyXzExX3RvXzgwMl8zX3BhY2tldChwQWQsIHBSeEJsaywgSGVhZGVyODAyXzMsIEZyb21XaGljaEJTU0lEKTsKIAotCS8vCi0JLy8gcGFzcyB0aGlzIDgwMi4zIHBhY2tldCB0byB1cHBlciBsYXllciBvciBmb3J3YXJkIHRoaXMgcGFja2V0IHRvIFdNIGRpcmVjdGx5Ci0JLy8KKwkvKiAqLworCS8qIHBhc3MgdGhpcyA4MDIuMyBwYWNrZXQgdG8gdXBwZXIgbGF5ZXIgb3IgZm9yd2FyZCB0aGlzIHBhY2tldCB0byBXTSBkaXJlY3RseSAqLworCS8qICovCiAJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIEZyb21XaGljaEJTU0lEKTsKIH0KIAotCi0vLyBOb3JtYWwsIEFNUERVIG9yIEFNU0RVCi1WT0lEIENtbVJ4bm9uUmFsaW5rRnJhbWVJbmRpY2F0ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCisvKiBOb3JtYWwsIEFNUERVIG9yIEFNU0RVICovCit2b2lkIENtbVJ4bm9uUmFsaW5rRnJhbWVJbmRpY2F0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaywgdTggRnJvbVdoaWNoQlNTSUQpCiB7Ci0JaWYgKFJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQU1QRFUpICYmIChwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPT0gMCkpCi0JeworCWlmIChSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNUERVKQorCSAgICAmJiAocEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID09IDApKSB7CiAJCUluZGljYXRlX0FNUERVX1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwotCX0KLQllbHNlCi0JewotCQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSkpCi0JCXsKLQkJCS8vIGhhbmRsZSBBLU1TRFUKKwl9IGVsc2UgeworCQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSkpIHsKKwkJCS8qIGhhbmRsZSBBLU1TRFUgKi8KIAkJCUluZGljYXRlX0FNU0RVX1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJSW5kaWNhdGVfTGVnYWN5X1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwogCQl9CiAJfQogfQogCi0KLVZPSUQgQ21tUnhSYWxpbmtGcmFtZUluZGljYXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3ZvaWQgQ21tUnhSYWxpbmtGcmFtZUluZGljYXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwKKwkJCSAgICAgIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaywgdTggRnJvbVdoaWNoQlNTSUQpCiB7Ci0JVUNIQVIJCQlIZWFkZXI4MDJfM1tMRU5HVEhfODAyXzNdOwotCVVJTlQxNgkJCU1zZHUyU2l6ZTsKLQlVSU5UMTYgCQkJUGF5bG9hZDFTaXplLCBQYXlsb2FkMlNpemU7Ci0JUFVDSEFSIAkJCXBEYXRhMjsKLQlQTkRJU19QQUNLRVQJcFBhY2tldDIgPSBOVUxMOworCXU4IEhlYWRlcjgwMl8zW0xFTkdUSF84MDJfM107CisJdTE2IE1zZHUyU2l6ZTsKKwl1MTYgUGF5bG9hZDFTaXplLCBQYXlsb2FkMlNpemU7CisJdTggKnBEYXRhMjsKKwl2b2lkICpwUGFja2V0MiA9IE5VTEw7CiAKKwlNc2R1MlNpemUgPSAqKHBSeEJsay0+cERhdGEpICsgKCoocFJ4QmxrLT5wRGF0YSArIDEpIDw8IDgpOwogCi0KLQlNc2R1MlNpemUgPSAqKHBSeEJsay0+cERhdGEpICsgKCoocFJ4QmxrLT5wRGF0YSsxKSA8PCA4KTsKLQotCWlmICgoTXNkdTJTaXplIDw9IDE1MzYpICYmIChNc2R1MlNpemUgPCBwUnhCbGstPkRhdGFTaXplKSkKLQl7CisJaWYgKChNc2R1MlNpemUgPD0gMTUzNikgJiYgKE1zZHUyU2l6ZSA8IHBSeEJsay0+RGF0YVNpemUpKSB7CiAJCS8qIHNraXAgdHdvIGJ5dGUgTVNEVTIgbGVuICovCiAJCXBSeEJsay0+cERhdGEgKz0gMjsKIAkJcFJ4QmxrLT5EYXRhU2l6ZSAtPSAyOwotCX0KLQllbHNlCi0JewotCQkvLyByZWxlYXNlIHBhY2tldAotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0gZWxzZSB7CisJCS8qIHJlbGVhc2UgcGFja2V0ICovCisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwKKwkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCXJldHVybjsKIAl9CiAKLQkvLyBnZXQgODAyLjMgSGVhZGVyIGFuZCAgcmVtb3ZlIExMQworCS8qIGdldCA4MDIuMyBIZWFkZXIgYW5kICByZW1vdmUgTExDICovCiAJUlRNUF84MDJfMTFfUkVNT1ZFX0xMQ19BTkRfQ09OVkVSVF9UT184MDJfMyhwUnhCbGssIEhlYWRlcjgwMl8zKTsKIAogCUFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7CiAKLQkvLyBSYWxpbmsgQWdncmVnYXRpb24gZnJhbWUKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4QWdncmVnYXRpb25Db3VudCArKzsKKwkvKiBSYWxpbmsgQWdncmVnYXRpb24gZnJhbWUgKi8KKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4QWdncmVnYXRpb25Db3VudCsrOwogCVBheWxvYWQxU2l6ZSA9IHBSeEJsay0+RGF0YVNpemUgLSBNc2R1MlNpemU7CiAJUGF5bG9hZDJTaXplID0gTXNkdTJTaXplIC0gTEVOR1RIXzgwMl8zOwogCiAJcERhdGEyID0gcFJ4QmxrLT5wRGF0YSArIFBheWxvYWQxU2l6ZSArIExFTkdUSF84MDJfMzsKIAotCXBQYWNrZXQyID0gZHVwbGljYXRlX3BrdChwQWQsIChwRGF0YTItTEVOR1RIXzgwMl8zKSwgTEVOR1RIXzgwMl8zLCBwRGF0YTIsIFBheWxvYWQyU2l6ZSwgRnJvbVdoaWNoQlNTSUQpOworCXBQYWNrZXQyID0KKwkgICAgZHVwbGljYXRlX3BrdChwQWQsIChwRGF0YTIgLSBMRU5HVEhfODAyXzMpLCBMRU5HVEhfODAyXzMsIHBEYXRhMiwKKwkJCSAgUGF5bG9hZDJTaXplLCBGcm9tV2hpY2hCU1NJRCk7CiAKLQlpZiAoIXBQYWNrZXQyKQotCXsKLQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwlpZiAoIXBQYWNrZXQyKSB7CisJCS8qIHJlbGVhc2UgcGFja2V0ICovCisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwKKwkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCXJldHVybjsKIAl9Ci0KLQkvLyB1cGRhdGUgcGF5bG9hZCBzaXplIG9mIDFzdCBwYWNrZXQKKwkvKiB1cGRhdGUgcGF5bG9hZCBzaXplIG9mIDFzdCBwYWNrZXQgKi8KIAlwUnhCbGstPkRhdGFTaXplID0gUGF5bG9hZDFTaXplOwogCXdsYW5fODAyXzExX3RvXzgwMl8zX3BhY2tldChwQWQsIHBSeEJsaywgSGVhZGVyODAyXzMsIEZyb21XaGljaEJTU0lEKTsKIAotCUFOTk9VTkNFX09SX0ZPUldBUkRfODAyXzNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIEZyb21XaGljaEJTU0lEKTsKKwlBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LAorCQkJCQkgRnJvbVdoaWNoQlNTSUQpOwogCi0JaWYgKHBQYWNrZXQyKQotCXsKKwlpZiAocFBhY2tldDIpIHsKIAkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwUGFja2V0MiwgRnJvbVdoaWNoQlNTSUQpOwogCX0KIH0KIAotCiAjZGVmaW5lIFJFU0VUX0ZSQUdGUkFNRShfZnJhZ0ZyYW1lKSBcCiAJewkJCQkJCQkJXAogCQlfZnJhZ0ZyYW1lLlJ4U2l6ZSA9IDA7CQlcCkBAIC0yODI5LDEwOSArMjE5MiwxMDIgQEAKIAkJX2ZyYWdGcmFtZS5GbGFncyA9IDA7CQlcCiAJfQogCi0KLVBORElTX1BBQ0tFVCBSVE1QRGVGcmFnbWVudERhdGFGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrKQordm9pZCAqUlRNUERlRnJhZ21lbnREYXRhRnJhbWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfcnhfYmxrICpwUnhCbGspCiB7Ci0JUEhFQURFUl84MDJfMTEJcEhlYWRlciA9IHBSeEJsay0+cEhlYWRlcjsKLQlQTkRJU19QQUNLRVQJcFJ4UGFja2V0ID0gcFJ4QmxrLT5wUnhQYWNrZXQ7Ci0JVUNIQVIJCQkqcERhdGEgPSBwUnhCbGstPnBEYXRhOwotCVVTSE9SVAkJCURhdGFTaXplID0gcFJ4QmxrLT5EYXRhU2l6ZTsKLQlQTkRJU19QQUNLRVQJcFJldFBhY2tldCA9IE5VTEw7Ci0JVUNIQVIJCQkqcEZyYWdCdWZmZXIgPSBOVUxMOwotCUJPT0xFQU4gCQliUmVhc3NEb25lID0gRkFMU0U7Ci0JVUNIQVIJCQlIZWFkZXJSb29tID0gMDsKLQorCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhlYWRlciA9IHBSeEJsay0+cEhlYWRlcjsKKwl2b2lkICpwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKKwl1OCAqcERhdGEgPSBwUnhCbGstPnBEYXRhOworCXUxNiBEYXRhU2l6ZSA9IHBSeEJsay0+RGF0YVNpemU7CisJdm9pZCAqcFJldFBhY2tldCA9IE5VTEw7CisJdTggKnBGcmFnQnVmZmVyID0gTlVMTDsKKwlCT09MRUFOIGJSZWFzc0RvbmUgPSBGQUxTRTsKKwl1OCBIZWFkZXJSb29tID0gMDsKIAogCUFTU0VSVChwSGVhZGVyKTsKIAotCUhlYWRlclJvb20gPSBwRGF0YSAtIChVQ0hBUiAqKXBIZWFkZXI7CisJSGVhZGVyUm9vbSA9IHBEYXRhIC0gKHU4ICopIHBIZWFkZXI7CiAKLQkvLyBSZS1hc3NlbWJsZSB0aGUgZnJhZ21lbnRlZCBwYWNrZXRzCi0JaWYgKHBIZWFkZXItPkZyYWcgPT0gMCkJCS8vIEZyYWcuIE51bWJlciBpcyAwIDogRmlyc3QgZnJhZyBvciBvbmx5IG9uZSBwa3QKKwkvKiBSZS1hc3NlbWJsZSB0aGUgZnJhZ21lbnRlZCBwYWNrZXRzICovCisJaWYgKHBIZWFkZXItPkZyYWcgPT0gMCkJLyogRnJhZy4gTnVtYmVyIGlzIDAgOiBGaXJzdCBmcmFnIG9yIG9ubHkgb25lIHBrdCAqLwogCXsKLQkJLy8gdGhlIGZpcnN0IHBrdCBvZiBmcmFnbWVudCwgcmVjb3JkIGl0LgotCQlpZiAocEhlYWRlci0+RkMuTW9yZUZyYWcpCi0JCXsKKwkJLyogdGhlIGZpcnN0IHBrdCBvZiBmcmFnbWVudCwgcmVjb3JkIGl0LiAqLworCQlpZiAocEhlYWRlci0+RkMuTW9yZUZyYWcpIHsKIAkJCUFTU0VSVChwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCk7Ci0JCQlwRnJhZ0J1ZmZlciA9IEdFVF9PU19QS1RfREFUQVBUUihwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCk7Ci0JCQlwQWQtPkZyYWdGcmFtZS5SeFNpemUgICA9IERhdGFTaXplICsgSGVhZGVyUm9vbTsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBGcmFnQnVmZmVyLAkgcEhlYWRlciwgcEFkLT5GcmFnRnJhbWUuUnhTaXplKTsKKwkJCXBGcmFnQnVmZmVyID0KKwkJCSAgICBHRVRfT1NfUEtUX0RBVEFQVFIocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQpOworCQkJcEFkLT5GcmFnRnJhbWUuUnhTaXplID0gRGF0YVNpemUgKyBIZWFkZXJSb29tOworCQkJTmRpc01vdmVNZW1vcnkocEZyYWdCdWZmZXIsIHBIZWFkZXIsCisJCQkJICAgICAgIHBBZC0+RnJhZ0ZyYW1lLlJ4U2l6ZSk7CiAJCQlwQWQtPkZyYWdGcmFtZS5TZXF1ZW5jZSA9IHBIZWFkZXItPlNlcXVlbmNlOwotCQkJcEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgPSBwSGVhZGVyLT5GcmFnOwkgICAvLyBTaG91bGQgYmUgMAorCQkJcEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgPSBwSGVhZGVyLT5GcmFnOwkvKiBTaG91bGQgYmUgMCAqLwogCQkJQVNTRVJUKHBBZC0+RnJhZ0ZyYW1lLkxhc3RGcmFnID09IDApOwotCQkJZ290byBkb25lOwkvLyBlbmQgb2YgcHJvY2Vzc2luZyB0aGlzIGZyYW1lCisJCQlnb3RvIGRvbmU7CS8qIGVuZCBvZiBwcm9jZXNzaW5nIHRoaXMgZnJhbWUgKi8KIAkJfQotCX0KLQllbHNlCS8vTWlkZGxlICYgRW5kIG9mIGZyYWdtZW50CisJfSBlbHNlCQkJLypNaWRkbGUgJiBFbmQgb2YgZnJhZ21lbnQgKi8KIAl7CiAJCWlmICgocEhlYWRlci0+U2VxdWVuY2UgIT0gcEFkLT5GcmFnRnJhbWUuU2VxdWVuY2UpIHx8Ci0JCQkocEhlYWRlci0+RnJhZyAhPSAocEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgKyAxKSkpCi0JCXsKLQkJCS8vIEZyYWdtZW50IGlzIG5vdCB0aGUgc2FtZSBzZXF1ZW5jZSBvciBvdXQgb2YgZnJhZ21lbnQgbnVtYmVyIG9yZGVyCi0JCQkvLyBSZXNldCBGcmFnbWVudCBjb250cm9sIGJsaworCQkgICAgKHBIZWFkZXItPkZyYWcgIT0gKHBBZC0+RnJhZ0ZyYW1lLkxhc3RGcmFnICsgMSkpKSB7CisJCQkvKiBGcmFnbWVudCBpcyBub3QgdGhlIHNhbWUgc2VxdWVuY2Ugb3Igb3V0IG9mIGZyYWdtZW50IG51bWJlciBvcmRlciAqLworCQkJLyogUmVzZXQgRnJhZ21lbnQgY29udHJvbCBibGsgKi8KIAkJCVJFU0VUX0ZSQUdGUkFNRShwQWQtPkZyYWdGcmFtZSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJGcmFnbWVudCBpcyBub3QgdGhlIHNhbWUgc2VxdWVuY2Ugb3Igb3V0IG9mIGZyYWdtZW50IG51bWJlciBvcmRlci5cbiIpKTsKLQkJCWdvdG8gZG9uZTsgLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCi0JCX0KLQkJZWxzZSBpZiAoKHBBZC0+RnJhZ0ZyYW1lLlJ4U2l6ZSArIERhdGFTaXplKSA+IE1BWF9GUkFNRV9TSVpFKQotCQl7Ci0JCQkvLyBGcmFnbWVudCBmcmFtZSBpcyB0b28gbGFyZ2UsIGl0IGV4ZWVkcyB0aGUgbWF4aW11bSBmcmFtZSBzaXplLgotCQkJLy8gUmVzZXQgRnJhZ21lbnQgY29udHJvbCBibGsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIkZyYWdtZW50IGlzIG5vdCB0aGUgc2FtZSBzZXF1ZW5jZSBvciBvdXQgb2YgZnJhZ21lbnQgbnVtYmVyIG9yZGVyLlxuIikpOworCQkJZ290byBkb25lOwkvKiBnaXZlIHVwIHRoaXMgZnJhbWUgKi8KKwkJfSBlbHNlIGlmICgocEFkLT5GcmFnRnJhbWUuUnhTaXplICsgRGF0YVNpemUpID4gTUFYX0ZSQU1FX1NJWkUpIHsKKwkJCS8qIEZyYWdtZW50IGZyYW1lIGlzIHRvbyBsYXJnZSwgaXQgZXhlZWRzIHRoZSBtYXhpbXVtIGZyYW1lIHNpemUuICovCisJCQkvKiBSZXNldCBGcmFnbWVudCBjb250cm9sIGJsayAqLwogCQkJUkVTRVRfRlJBR0ZSQU1FKHBBZC0+RnJhZ0ZyYW1lKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkZyYWdtZW50IGZyYW1lIGlzIHRvbyBsYXJnZSwgaXQgZXhlZWRzIHRoZSBtYXhpbXVtIGZyYW1lIHNpemUuXG4iKSk7Ci0JCQlnb3RvIGRvbmU7IC8vIGdpdmUgdXAgdGhpcyBmcmFtZQorCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiRnJhZ21lbnQgZnJhbWUgaXMgdG9vIGxhcmdlLCBpdCBleGVlZHMgdGhlIG1heGltdW0gZnJhbWUgc2l6ZS5cbiIpKTsKKwkJCWdvdG8gZG9uZTsJLyogZ2l2ZSB1cCB0aGlzIGZyYW1lICovCiAJCX0KLQotICAgICAgICAvLwotCQkvLyBCcm9hZGNvbSBBUChCQ005NDcwNEFHUikgd2lsbCBzZW5kIG91dCBMTEMgaW4gZnJhZ21lbnQncyBwYWNrZXQsIExMQyBvbmx5IGNhbiBhY2NwZXQgYXQgZmlyc3QgZnJhZ21lbnQuCi0JCS8vIEluIHRoaXMgY2FzZSwgd2Ugd2lsbCBkcm9wdCBpdC4KLQkJLy8KLQkJaWYgKE5kaXNFcXVhbE1lbW9yeShwRGF0YSwgU05BUF84MDJfMUgsIHNpemVvZihTTkFQXzgwMl8xSCkpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJGaW5kIGFub3RoZXIgTExDIGF0IE1pZGRsZSBvciBFbmQgZnJhZ21lbnQoU049JWQsIEZyYWc9JWQpXG4iLCBwSGVhZGVyLT5TZXF1ZW5jZSwgcEhlYWRlci0+RnJhZykpOwotCQkJZ290byBkb25lOyAvLyBnaXZlIHVwIHRoaXMgZnJhbWUKKwkJLyogKi8KKwkJLyogQnJvYWRjb20gQVAoQkNNOTQ3MDRBR1IpIHdpbGwgc2VuZCBvdXQgTExDIGluIGZyYWdtZW50J3MgcGFja2V0LCBMTEMgb25seSBjYW4gYWNjcGV0IGF0IGZpcnN0IGZyYWdtZW50LiAqLworCQkvKiBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgZHJvcHQgaXQuICovCisJCS8qICovCisJCWlmIChOZGlzRXF1YWxNZW1vcnkocERhdGEsIFNOQVBfODAyXzFILCBzaXplb2YoU05BUF84MDJfMUgpKSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiRmluZCBhbm90aGVyIExMQyBhdCBNaWRkbGUgb3IgRW5kIGZyYWdtZW50KFNOPSVkLCBGcmFnPSVkKVxuIiwKKwkJCQkgIHBIZWFkZXItPlNlcXVlbmNlLCBwSGVhZGVyLT5GcmFnKSk7CisJCQlnb3RvIGRvbmU7CS8qIGdpdmUgdXAgdGhpcyBmcmFtZSAqLwogCQl9CiAKIAkJcEZyYWdCdWZmZXIgPSBHRVRfT1NfUEtUX0RBVEFQVFIocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQpOwogCi0JCS8vIGNvbmNhdGVuYXRlIHRoaXMgZnJhZ21lbnQgaW50byB0aGUgcmUtYXNzZW1ibHkgYnVmZmVyCi0JCU5kaXNNb3ZlTWVtb3J5KChwRnJhZ0J1ZmZlciArIHBBZC0+RnJhZ0ZyYW1lLlJ4U2l6ZSksIHBEYXRhLCBEYXRhU2l6ZSk7Ci0JCXBBZC0+RnJhZ0ZyYW1lLlJ4U2l6ZSAgKz0gRGF0YVNpemU7Ci0JCXBBZC0+RnJhZ0ZyYW1lLkxhc3RGcmFnID0gcEhlYWRlci0+RnJhZzsJICAgLy8gVXBkYXRlIGZyYWdtZW50IG51bWJlcgorCQkvKiBjb25jYXRlbmF0ZSB0aGlzIGZyYWdtZW50IGludG8gdGhlIHJlLWFzc2VtYmx5IGJ1ZmZlciAqLworCQlOZGlzTW92ZU1lbW9yeSgocEZyYWdCdWZmZXIgKyBwQWQtPkZyYWdGcmFtZS5SeFNpemUpLCBwRGF0YSwKKwkJCSAgICAgICBEYXRhU2l6ZSk7CisJCXBBZC0+RnJhZ0ZyYW1lLlJ4U2l6ZSArPSBEYXRhU2l6ZTsKKwkJcEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgPSBwSGVhZGVyLT5GcmFnOwkvKiBVcGRhdGUgZnJhZ21lbnQgbnVtYmVyICovCiAKLQkJLy8gTGFzdCBmcmFnbWVudAotCQlpZiAocEhlYWRlci0+RkMuTW9yZUZyYWcgPT0gRkFMU0UpCi0JCXsKKwkJLyogTGFzdCBmcmFnbWVudCAqLworCQlpZiAocEhlYWRlci0+RkMuTW9yZUZyYWcgPT0gRkFMU0UpIHsKIAkJCWJSZWFzc0RvbmUgPSBUUlVFOwogCQl9CiAJfQogCiBkb25lOgotCS8vIGFsd2F5cyByZWxlYXNlIHJ4IGZyYWdtZW50ZWQgcGFja2V0CisJLyogYWx3YXlzIHJlbGVhc2UgcnggZnJhZ21lbnRlZCBwYWNrZXQgKi8KIAlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKIAotCS8vIHJldHVybiBkZWZyYWdtZW50ZWQgcGFja2V0IGlmIHBhY2tldCBpcyByZWFzc2VtYmxlZCBjb21wbGV0ZWx5Ci0JLy8gb3RoZXJ3aXNlIHJldHVybiBOVUxMCi0JaWYgKGJSZWFzc0RvbmUpCi0JewotCQlQTkRJU19QQUNLRVQgcE5ld0ZyYWdQYWNrZXQ7CisJLyogcmV0dXJuIGRlZnJhZ21lbnRlZCBwYWNrZXQgaWYgcGFja2V0IGlzIHJlYXNzZW1ibGVkIGNvbXBsZXRlbHkgKi8KKwkvKiBvdGhlcndpc2UgcmV0dXJuIE5VTEwgKi8KKwlpZiAoYlJlYXNzRG9uZSkgeworCQl2b2lkICpwTmV3RnJhZ1BhY2tldDsKIAotCQkvLyBhbGxvY2F0ZSBhIG5ldyBwYWNrZXQgYnVmZmVyIGZvciBmcmFnbWVudAotCQlwTmV3RnJhZ1BhY2tldCA9IFJUTVBfQWxsb2NhdGVGcmFnUGFja2V0QnVmZmVyKHBBZCwgUlhfQlVGRkVSX05PUk1TSVpFKTsKLQkJaWYgKHBOZXdGcmFnUGFja2V0KQotCQl7Ci0JCQkvLyB1cGRhdGUgUnhCbGsKKwkJLyogYWxsb2NhdGUgYSBuZXcgcGFja2V0IGJ1ZmZlciBmb3IgZnJhZ21lbnQgKi8KKwkJcE5ld0ZyYWdQYWNrZXQgPQorCQkgICAgUlRNUF9BbGxvY2F0ZUZyYWdQYWNrZXRCdWZmZXIocEFkLCBSWF9CVUZGRVJfTk9STVNJWkUpOworCQlpZiAocE5ld0ZyYWdQYWNrZXQpIHsKKwkJCS8qIHVwZGF0ZSBSeEJsayAqLwogCQkJcFJldFBhY2tldCA9IHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0OwogCQkJcEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQgPSBwTmV3RnJhZ1BhY2tldDsKLQkJCXBSeEJsay0+cEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgR0VUX09TX1BLVF9EQVRBUFRSKHBSZXRQYWNrZXQpOwotCQkJcFJ4QmxrLT5wRGF0YSA9IChVQ0hBUiAqKXBSeEJsay0+cEhlYWRlciArIEhlYWRlclJvb207CisJCQlwUnhCbGstPnBIZWFkZXIgPQorCQkJICAgIChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqKSBHRVRfT1NfUEtUX0RBVEFQVFIocFJldFBhY2tldCk7CisJCQlwUnhCbGstPnBEYXRhID0gKHU4ICopIHBSeEJsay0+cEhlYWRlciArIEhlYWRlclJvb207CiAJCQlwUnhCbGstPkRhdGFTaXplID0gcEFkLT5GcmFnRnJhbWUuUnhTaXplIC0gSGVhZGVyUm9vbTsKIAkJCXBSeEJsay0+cFJ4UGFja2V0ID0gcFJldFBhY2tldDsKLQkJfQotCQllbHNlCi0JCXsKKwkJfSBlbHNlIHsKIAkJCVJFU0VUX0ZSQUdGUkFNRShwQWQtPkZyYWdGcmFtZSk7CiAJCX0KIAl9CkBAIC0yOTM5LDI1ICsyMjk1LDIyIEBACiAJcmV0dXJuIHBSZXRQYWNrZXQ7CiB9CiAKLQotVk9JRCBJbmRpY2F0ZV9BTVNEVV9QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQordm9pZCBJbmRpY2F0ZV9BTVNEVV9QYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrLCB1OCBGcm9tV2hpY2hCU1NJRCkKIHsKLQlVSU5UCQkJbk1TRFU7CisJdTMyIG5NU0RVOwogCiAJdXBkYXRlX29zX3BhY2tldF9pbmZvKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CiAJUlRNUF9TRVRfUEFDS0VUX0lGKHBSeEJsay0+cFJ4UGFja2V0LCBGcm9tV2hpY2hCU1NJRCk7Ci0Jbk1TRFUgPSBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZShwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBwUnhCbGstPnBEYXRhLCBwUnhCbGstPkRhdGFTaXplKTsKKwluTVNEVSA9CisJICAgIGRlYWdncmVnYXRlX0FNU0RVX2Fubm91bmNlKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIHBSeEJsay0+cERhdGEsCisJCQkJICAgICAgIHBSeEJsay0+RGF0YVNpemUpOwogfQogCi1WT0lEIEluZGljYXRlX0VBUE9MX1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit2b2lkIEluZGljYXRlX0VBUE9MX1BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICBzdHJ1Y3QgcnRfcnhfYmxrICpwUnhCbGssIHU4IEZyb21XaGljaEJTU0lEKQogewotCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkgPSBOVUxMOwogCiAJewogCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKQEAgLTI5NjUsNDggKzIzMTgsNDIgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmIChwRW50cnkgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiSW5kaWNhdGVfRUFQT0xfUGFja2V0OiBkcm9wIGFuZCByZWxlYXNlIHRoZSBpbnZhbGlkIHBhY2tldC5cbiIpKTsKLQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwlpZiAocEVudHJ5ID09IE5VTEwpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwKKwkJCSAoIkluZGljYXRlX0VBUE9MX1BhY2tldDogZHJvcCBhbmQgcmVsZWFzZSB0aGUgaW52YWxpZCBwYWNrZXQuXG4iKSk7CisJCS8qIHJlbGVhc2UgcGFja2V0ICovCisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwKKwkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCXJldHVybjsKIAl9CiB9CiAKLSNkZWZpbmUgQkNOX1RCVFRfT0ZGU0VUCQk2NAkvL2RlZmVyIDY0IHVzCi1WT0lEIFJlU3luY0JlYWNvblRpbWUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCisjZGVmaW5lIEJDTl9UQlRUX09GRlNFVAkJNjQJLypkZWZlciA2NCB1cyAqLwordm9pZCBSZVN5bmNCZWFjb25UaW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKIAotCVVJTlQzMiAgT2Zmc2V0OwotCisJdTMyIE9mZnNldDsKIAogCU9mZnNldCA9IChwQWQtPlRidHRUaWNrQ291bnQpICUgKEJDTl9UQlRUX09GRlNFVCk7CiAKIAlwQWQtPlRidHRUaWNrQ291bnQrKzsKIAotCS8vCi0JLy8gVGhlIHVwZGF0ZWQgQmVhY29uSW50ZXJ2YWwgVmFsdWUgd2lsbCBhZmZlY3QgQmVhY29uIEludGVydmFsIGFmdGVyIHR3byBUQlRUCi0JLy8gYmVhY2FzdWUgdGhlIG9yaWdpbmFsIEJlYWNvbkludGVydmFsIGhhZCBiZWVuIGxvYWRlZCBpbnRvIG5leHQgVEJUVF9USU1FUgotCS8vCi0JaWYgKE9mZnNldCA9PSAoQkNOX1RCVFRfT0ZGU0VULTIpKQotCXsKKwkvKiAqLworCS8qIFRoZSB1cGRhdGVkIEJlYWNvbkludGVydmFsIFZhbHVlIHdpbGwgYWZmZWN0IEJlYWNvbiBJbnRlcnZhbCBhZnRlciB0d28gVEJUVCAqLworCS8qIGJlYWNhc3VlIHRoZSBvcmlnaW5hbCBCZWFjb25JbnRlcnZhbCBoYWQgYmVlbiBsb2FkZWQgaW50byBuZXh0IFRCVFRfVElNRVIgKi8KKwkvKiAqLworCWlmIChPZmZzZXQgPT0gKEJDTl9UQlRUX09GRlNFVCAtIDIpKSB7CiAJCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7CiAJCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOwotCQljc3IuZmllbGQuQmVhY29uSW50ZXJ2YWwgPSAocEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDQpIC0gMSA7CS8vIEFTSUMgcmVnaXN0ZXIgaW4gdW5pdHMgb2YgMS8xNiBUVSA9IDY0dXMKKwkJY3NyLmZpZWxkLkJlYWNvbkludGVydmFsID0gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCA0KSAtIDE7CS8qIEFTSUMgcmVnaXN0ZXIgaW4gdW5pdHMgb2YgMS8xNiBUVSA9IDY0dXMgKi8KIAkJUlRNUF9JT19XUklURTMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCBjc3Iud29yZCk7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChPZmZzZXQgPT0gKEJDTl9UQlRUX09GRlNFVC0xKSkKLQkJeworCX0gZWxzZSB7CisJCWlmIChPZmZzZXQgPT0gKEJDTl9UQlRUX09GRlNFVCAtIDEpKSB7CiAJCQlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOwogCiAJCQlSVE1QX0lPX1JFQUQzMihwQWQsIEJDTl9USU1FX0NGRywgJmNzci53b3JkKTsKLQkJCWNzci5maWVsZC5CZWFjb25JbnRlcnZhbCA9IChwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QpIDw8IDQ7IC8vIEFTSUMgcmVnaXN0ZXIgaW4gdW5pdHMgb2YgMS8xNiBUVQorCQkJY3NyLmZpZWxkLkJlYWNvbkludGVydmFsID0gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCkgPDwgNDsJLyogQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVICovCiAJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKIAkJfQogCX0KIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGFfMjg2MC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGFfMjg2MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTdmZjQ1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9kYXRhXzI4NjAuYworKysgL2Rldi9udWxsCkBAIC0xLDExOTkgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKgotICAgQWxsIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgbXVzdCBiZSBQQ0ktZGVwZW5kZWQsIG9yIHlvdSBzaG91bGQgb3V0IHlvdXIgZnVuY3Rpb24KLQlpbiBvdGhlciBmaWxlcy4KLQotKi8KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotZXh0ZXJuIFJUTVBfUkZfUkVHUyBSRjI4NTBSZWdUYWJsZVtdOwotZXh0ZXJuIFVDSEFSCU5VTV9PRl8yODUwX0NITkw7Ci0KLVVTSE9SVCBSdG1wUENJX1dyaXRlVHhSZXNvdXJjZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCUJPT0xFQU4JCQliSXNMYXN0LAotCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcikKLXsKLQotCVVDSEFSCQkJKnBETUFIZWFkZXJCdWZWQTsKLQlVU0hPUlQJCQlUeElkeCwgUmV0VHhJZHg7Ci0JUFRYRF9TVFJVQwkJcFR4RDsKLQlVSU5UMzIJCQlCdWZCYXNlUGFMb3c7Ci0JUFJUTVBfVFhfUklORwlwVHhSaW5nOwotCVVTSE9SVAkJCWh3SGVhZGVyTGVuOwotCi0JLy8KLQkvLyBnZXQgVHggUmluZyBSZXNvdXJjZQotCS8vCi0JcFR4UmluZyA9ICZwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF07Ci0JVHhJZHggPSBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uVHhDcHVJZHg7Ci0JcERNQUhlYWRlckJ1ZlZBID0gKFBVQ0hBUikgcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7Ci0JQnVmQmFzZVBhTG93ID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOwotCi0JLy8gY29weSBUWElORk8gKyBUWFdJICsgV0xBTiBIZWFkZXIgKyBMTEMgaW50byBETUEgSGVhZGVyIEJ1ZmZlcgotCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNU0RVX0ZSQU1FKQotCXsKLQkJaHdIZWFkZXJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gLSBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEICsgcFR4QmxrLT5IZHJQYWRMZW4gKyBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOwotCX0KLQllbHNlCi0JewotCQlod0hlYWRlckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOwotCX0KLQlOZGlzTW92ZU1lbW9yeShwRE1BSGVhZGVyQnVmVkEsIHBUeEJsay0+SGVhZGVyQnVmLCBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGVhZGVyTGVuKTsKLQotCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0ID0gcFR4QmxrLT5wUGFja2V0OwotCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0KLQkvLwotCS8vIGJ1aWxkIFR4IERlc2NyaXB0b3IKLQkvLwotCi0JcFR4RCA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOwotCU5kaXNaZXJvTWVtb3J5KHBUeEQsIFRYRF9TSVpFKTsKLQotCXBUeEQtPlNEUHRyMCA9IEJ1ZkJhc2VQYUxvdzsKLQlwVHhELT5TRExlbjAgPSBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGVhZGVyTGVuOyAvLyBpbmNsdWRlIHBhZGRpbmcKLQlwVHhELT5TRFB0cjEgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIHBUeEJsaywgMCwgMSwgUENJX0RNQV9UT0RFVklDRSk7OwotCXBUeEQtPlNETGVuMSA9IHBUeEJsay0+U3JjQnVmTGVuOwotCXBUeEQtPkxhc3RTZWMwID0gMDsKLQlwVHhELT5MYXN0U2VjMSA9IChiSXNMYXN0KSA/IDEgOiAwOwotCi0JUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgRkFMU0UsIEZJRk9fRURDQSk7Ci0KLQlSZXRUeElkeCA9IFR4SWR4OwotCS8vCi0JLy8gVXBkYXRlIFR4IGluZGV4Ci0JLy8KLQlJTkNfUklOR19JTkRFWChUeElkeCwgVFhfUklOR19TSVpFKTsKLQlwVHhSaW5nLT5UeENwdUlkeCA9IFR4SWR4OwotCi0JKkZyZWVOdW1iZXIgLT0gMTsKLQotCXJldHVybiBSZXRUeElkeDsKLX0KLQotCi1VU0hPUlQgUnRtcFBDSV9Xcml0ZVNpbmdsZVR4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglCT09MRUFOCQkJYklzTGFzdCwKLQlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpCi17Ci0KLQlVQ0hBUgkJCSpwRE1BSGVhZGVyQnVmVkE7Ci0JVVNIT1JUCQkJVHhJZHgsIFJldFR4SWR4OwotCVBUWERfU1RSVUMJCXBUeEQ7Ci0JVUlOVDMyCQkJQnVmQmFzZVBhTG93OwotCVBSVE1QX1RYX1JJTkcJcFR4UmluZzsKLQlVU0hPUlQJCQlod0hlYWRlckxlbjsKLQotCS8vCi0JLy8gZ2V0IFR4IFJpbmcgUmVzb3VyY2UKLQkvLwotCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdOwotCVR4SWR4ID0gcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdLlR4Q3B1SWR4OwotCXBETUFIZWFkZXJCdWZWQSA9IChQVUNIQVIpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1ZhOwotCUJ1ZkJhc2VQYUxvdyA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1BhKTsKLQotCS8vIGNvcHkgVFhJTkZPICsgVFhXSSArIFdMQU4gSGVhZGVyICsgTExDIGludG8gRE1BIEhlYWRlciBCdWZmZXIKLQlod0hlYWRlckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOwotCi0JTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBLCBwVHhCbGstPkhlYWRlckJ1ZiwgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hlYWRlckxlbik7Ci0KLQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldCA9IHBUeEJsay0+cFBhY2tldDsKLQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCi0JLy8KLQkvLyBidWlsZCBUeCBEZXNjcmlwdG9yCi0JLy8KLQlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7Ci0KLQlOZGlzWmVyb01lbW9yeShwVHhELCBUWERfU0laRSk7Ci0KLQlwVHhELT5TRFB0cjAgPSBCdWZCYXNlUGFMb3c7Ci0JcFR4RC0+U0RMZW4wID0gVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hlYWRlckxlbjsgLy8gaW5jbHVkZSBwYWRkaW5nCi0JcFR4RC0+U0RQdHIxID0gUENJX01BUF9TSU5HTEUocEFkLCBwVHhCbGssIDAsIDEsIFBDSV9ETUFfVE9ERVZJQ0UpOzsKLQlwVHhELT5TRExlbjEgPSBwVHhCbGstPlNyY0J1ZkxlbjsKLQlwVHhELT5MYXN0U2VjMCA9IDA7Ci0JcFR4RC0+TGFzdFNlYzEgPSAoYklzTGFzdCkgPyAxIDogMDsKLQotCVJUTVBXcml0ZVR4RGVzY3JpcHRvcihwQWQsIHBUeEQsIEZBTFNFLCBGSUZPX0VEQ0EpOwotCi0JUmV0VHhJZHggPSBUeElkeDsKLQkvLwotCS8vIFVwZGF0ZSBUeCBpbmRleAotCS8vCi0JSU5DX1JJTkdfSU5ERVgoVHhJZHgsIFRYX1JJTkdfU0laRSk7Ci0JcFR4UmluZy0+VHhDcHVJZHggPSBUeElkeDsKLQotCSpGcmVlTnVtYmVyIC09IDE7Ci0KLQlyZXR1cm4gUmV0VHhJZHg7Ci19Ci0KLQotVVNIT1JUIFJ0bXBQQ0lfV3JpdGVNdWx0aVR4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVQ0hBUgkJCWZyYW1lTnVtLAotCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcikKLXsKLQlCT09MRUFOIGJJc0xhc3Q7Ci0JVUNIQVIJCQkqcERNQUhlYWRlckJ1ZlZBOwotCVVTSE9SVAkJCVR4SWR4LCBSZXRUeElkeDsKLQlQVFhEX1NUUlVDCQlwVHhEOwotCVVJTlQzMgkJCUJ1ZkJhc2VQYUxvdzsKLQlQUlRNUF9UWF9SSU5HCXBUeFJpbmc7Ci0JVVNIT1JUCQkJaHdIZHJMZW47Ci0JVUlOVDMyCQkJZmlyc3RETUFMZW47Ci0KLQliSXNMYXN0ID0gKChmcmFtZU51bSA9PSAocFR4QmxrLT5Ub3RhbEZyYW1lTnVtIC0gMSkpID8gMSA6IDApOwotCi0JLy8KLQkvLyBnZXQgVHggUmluZyBSZXNvdXJjZQotCS8vCi0JcFR4UmluZyA9ICZwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF07Ci0JVHhJZHggPSBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uVHhDcHVJZHg7Ci0JcERNQUhlYWRlckJ1ZlZBID0gKFBVQ0hBUikgcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7Ci0JQnVmQmFzZVBhTG93ID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOwotCi0JaWYgKGZyYW1lTnVtID09IDApCi0JewotCQkvLyBjb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCi0JCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNU0RVX0ZSQU1FKQotCQkJLy9od0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbi1MRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFELCA0KStMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOwotCQkJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gLSBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEICsgcFR4QmxrLT5IZHJQYWRMZW4gKyBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOwotCQllbHNlIGlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX1JBTElOS19GUkFNRSkKLQkJCS8vaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4tTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxELCA0KStMRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQ7Ci0JCQlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiAtIExFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRCArIHBUeEJsay0+SGRyUGFkTGVuICsgTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxEOwotCQllbHNlCi0JCQkvL2h3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLCA0KTsKLQkJCWh3SGRyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5IZHJQYWRMZW47Ci0KLQkJZmlyc3RETUFMZW4gPSBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGRyTGVuOwotCX0KLQllbHNlCi0JewotCQlmaXJzdERNQUxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKLQl9Ci0KLQlOZGlzTW92ZU1lbW9yeShwRE1BSGVhZGVyQnVmVkEsIHBUeEJsay0+SGVhZGVyQnVmLCBmaXJzdERNQUxlbik7Ci0KLQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldCA9IHBUeEJsay0+cFBhY2tldDsKLQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCi0JLy8KLQkvLyBidWlsZCBUeCBEZXNjcmlwdG9yCi0JLy8KLQlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7Ci0KLQlOZGlzWmVyb01lbW9yeShwVHhELCBUWERfU0laRSk7Ci0KLQlwVHhELT5TRFB0cjAgPSBCdWZCYXNlUGFMb3c7Ci0JcFR4RC0+U0RMZW4wID0gZmlyc3RETUFMZW47IC8vIGluY2x1ZGUgcGFkZGluZwotCXBUeEQtPlNEUHRyMSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFR4QmxrLCAwLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTs7Ci0JcFR4RC0+U0RMZW4xID0gcFR4QmxrLT5TcmNCdWZMZW47Ci0JcFR4RC0+TGFzdFNlYzAgPSAwOwotCXBUeEQtPkxhc3RTZWMxID0gKGJJc0xhc3QpID8gMSA6IDA7Ci0KLQlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBGQUxTRSwgRklGT19FRENBKTsKLQotCVJldFR4SWR4ID0gVHhJZHg7Ci0JLy8KLQkvLyBVcGRhdGUgVHggaW5kZXgKLQkvLwotCUlOQ19SSU5HX0lOREVYKFR4SWR4LCBUWF9SSU5HX1NJWkUpOwotCXBUeFJpbmctPlR4Q3B1SWR4ID0gVHhJZHg7Ci0KLQkqRnJlZU51bWJlciAtPSAxOwotCi0JcmV0dXJuIFJldFR4SWR4OwotCi19Ci0KLQotVk9JRCBSdG1wUENJX0ZpbmFsV3JpdGVUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JVVNIT1JUCQkJdG90YWxNUERVU2l6ZSwKLQlJTglVU0hPUlQJCQlGaXJzdFR4SWR4KQotewotCi0JUFRYV0lfU1RSVUMJCXBUeFdJOwotCVBSVE1QX1RYX1JJTkcJcFR4UmluZzsKLQotCS8vCi0JLy8gZ2V0IFR4IFJpbmcgUmVzb3VyY2UKLQkvLwotCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdOwotCXBUeFdJID0gKFBUWFdJX1NUUlVDKSBwVHhSaW5nLT5DZWxsW0ZpcnN0VHhJZHhdLkRtYUJ1Zi5BbGxvY1ZhOwotCXBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPSB0b3RhbE1QRFVTaXplOwotfQotCi0KLVZPSUQgUnRtcFBDSURhdGFMYXN0VHhJZHgoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlRdWVJZHgsCi0JSU4JVVNIT1JUCQkJTGFzdFR4SWR4KQotewotCVBUWERfU1RSVUMJCXBUeEQ7Ci0JUFJUTVBfVFhfUklORwlwVHhSaW5nOwotCi0JLy8KLQkvLyBnZXQgVHggUmluZyBSZXNvdXJjZQotCS8vCi0JcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tRdWVJZHhdOwotCi0JLy8KLQkvLyBidWlsZCBUeCBEZXNjcmlwdG9yCi0JLy8KLQlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbTGFzdFR4SWR4XS5BbGxvY1ZhOwotCi0JcFR4RC0+TGFzdFNlYzEgPSAxOwotfQotCi0KLVVTSE9SVAlSdG1wUENJX1dyaXRlRnJhZ1R4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVQ0hBUgkJCWZyYWdOdW0sCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKQotewotCVVDSEFSCQkJKnBETUFIZWFkZXJCdWZWQTsKLQlVU0hPUlQJCQlUeElkeCwgUmV0VHhJZHg7Ci0JUFRYRF9TVFJVQwkJcFR4RDsKLQlVSU5UMzIJCQlCdWZCYXNlUGFMb3c7Ci0JUFJUTVBfVFhfUklORwlwVHhSaW5nOwotCVVTSE9SVAkJCWh3SGVhZGVyTGVuOwotCVVJTlQzMgkJCWZpcnN0RE1BTGVuOwotCi0JLy8KLQkvLyBHZXQgVHggUmluZyBSZXNvdXJjZQotCS8vCi0JcFR4UmluZyA9ICZwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF07Ci0JVHhJZHggPSBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uVHhDcHVJZHg7Ci0JcERNQUhlYWRlckJ1ZlZBID0gKFBVQ0hBUikgcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7Ci0JQnVmQmFzZVBhTG93ID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOwotCi0JLy8KLQkvLyBDb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCi0JLy8KLQlod0hlYWRlckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOwotCi0JZmlyc3RETUFMZW4gPSBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGVhZGVyTGVuOwotCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQSwgcFR4QmxrLT5IZWFkZXJCdWYsIGZpcnN0RE1BTGVuKTsKLQotCi0JLy8KLQkvLyBCdWlsZCBUeCBEZXNjcmlwdG9yCi0JLy8KLQlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7Ci0KLQlOZGlzWmVyb01lbW9yeShwVHhELCBUWERfU0laRSk7Ci0KLQlpZiAoZnJhZ051bSA9PSBwVHhCbGstPlRvdGFsRnJhZ051bSkKLQl7Ci0JCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0ID0gcFR4QmxrLT5wUGFja2V0OwotCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCX0KLQotCXBUeEQtPlNEUHRyMCA9IEJ1ZkJhc2VQYUxvdzsKLQlwVHhELT5TRExlbjAgPSBmaXJzdERNQUxlbjsgLy8gaW5jbHVkZSBwYWRkaW5nCi0JcFR4RC0+U0RQdHIxID0gUENJX01BUF9TSU5HTEUocEFkLCBwVHhCbGssIDAsIDEsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCXBUeEQtPlNETGVuMSA9IHBUeEJsay0+U3JjQnVmTGVuOwotCXBUeEQtPkxhc3RTZWMwID0gMDsKLQlwVHhELT5MYXN0U2VjMSA9IDE7Ci0KLQlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBGQUxTRSwgRklGT19FRENBKTsKLQotCVJldFR4SWR4ID0gVHhJZHg7Ci0JcFR4QmxrLT5Qcml2ICs9IHBUeEJsay0+U3JjQnVmTGVuOwotCi0JLy8KLQkvLyBVcGRhdGUgVHggaW5kZXgKLQkvLwotCUlOQ19SSU5HX0lOREVYKFR4SWR4LCBUWF9SSU5HX1NJWkUpOwotCXBUeFJpbmctPlR4Q3B1SWR4ID0gVHhJZHg7Ci0KLQkqRnJlZU51bWJlciAtPSAxOwotCi0JcmV0dXJuIFJldFR4SWR4OwotCi19Ci0KLS8qCi0JTXVzdCBiZSBydW4gaW4gSW50ZXJydXB0IGNvbnRleHQKLQlUaGlzIGZ1bmN0aW9uIGhhbmRsZSBQQ0kgc3BlY2lmaWMgVHhEZXNjIGFuZCBjcHUgaW5kZXggdXBkYXRlIGFuZCBraWNrIHRoZSBwYWNrZXQgb3V0LgotICovCi1pbnQgUnRtcFBDSU1nbXRLaWNrT3V0KAotCUlOIFJUTVBfQURBUFRFUiAJKnBBZCwKLQlJTiBVQ0hBUiAJCQlRdWVJZHgsCi0JSU4gUE5ESVNfUEFDS0VUCQlwUGFja2V0LAotCUlOIFBVQ0hBUgkJCXBTcmNCdWZWQSwKLQlJTiBVSU5UIAkJCVNyY0J1ZkxlbikKLXsKLQlQVFhEX1NUUlVDCQlwVHhEOwotCVVMT05HCQkJU3dJZHggPSBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4OwotCi0JcFR4RCAgPSAoUFRYRF9TVFJVQykgcEFkLT5NZ210UmluZy5DZWxsW1N3SWR4XS5BbGxvY1ZhOwotCWlmICghcFR4RCkKLQkJcmV0dXJuIDA7Ci0KLQlwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLnBOZGlzUGFja2V0ID0gcFBhY2tldDsKLQlwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0KLQlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBUUlVFLCBGSUZPX01HTVQpOwotCXBUeEQtPkxhc3RTZWMwID0gMTsKLQlwVHhELT5MYXN0U2VjMSA9IDE7Ci0JcFR4RC0+RE1BRE9ORSA9IDA7Ci0JcFR4RC0+U0RMZW4xID0gMDsKLQlwVHhELT5TRFB0cjAgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIHBTcmNCdWZWQSwgU3JjQnVmTGVuLCAwLCBQQ0lfRE1BX1RPREVWSUNFKTs7Ci0JcFR4RC0+U0RMZW4wID0gU3JjQnVmTGVuOwotCi0JcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKLQotCS8vIEluY3JlYXNlIFRYX0NUWF9JRFgsIGJ1dCB3cml0ZSB0byByZWdpc3RlciBsYXRlci4KLQlJTkNfUklOR19JTkRFWChwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4LCBNR01UX1JJTkdfU0laRSk7Ci0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NR01UQ1RYX0lEWCwgIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlDaGVjayBSeCBkZXNjcmlwdG9yLCByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRSBpZiBhbnkgZXJyb3IgZG91bmQKLQotCUFyZ3VtZW50czoKLQkJcFJ4RAkJUG9pbnRlciB0byB0aGUgUnggZGVzY3JpcHRvcgotCi0JUmV0dXJuIFZhbHVlOgotCQlORElTX1NUQVRVU19TVUNDRVNTIAlObyBlcnIKLQkJTkRJU19TVEFUVVNfRkFJTFVSRSAJRXJyb3IKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTX1NUQVRVUyBSVE1QQ2hlY2tSeEVycm9yKAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglQSEVBREVSXzgwMl8xMQkJcEhlYWRlciwKLQlJTglQUlhXSV9TVFJVQyAJCXBSeFdJLAotCUlOICBQUlQyOFhYX1JYRF9TVFJVQyAJcFJ4RCkKLXsKLQlQQ0lQSEVSX0tFWSBwV3BhS2V5OwotCUlOVCBkQm07Ci0KLQkvLyBQaHkgZXJyb3JzICYgQ1JDIGVycm9ycwotCWlmICgvKihwUnhELT5QaHlFcnIpIHx8Ki8gKHBSeEQtPkNyYykpCi0JewotCQkvLyBDaGVjayBSU1NJIGZvciBOb2lzZSBIaXN0IHN0YXRpc3RpYyBjb2xsZWN0aW9uLgotCQlkQm0gPSAoSU5UKSAocFJ4V0ktPlJTU0kwKSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7Ci0JCWlmIChkQm0gPD0gLTg3KQotCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVswXSArPSAxOwotCQllbHNlIGlmIChkQm0gPD0gLTgyKQotCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVsxXSArPSAxOwotCQllbHNlIGlmIChkQm0gPD0gLTc3KQotCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVsyXSArPSAxOwotCQllbHNlIGlmIChkQm0gPD0gLTcyKQotCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVszXSArPSAxOwotCQllbHNlIGlmIChkQm0gPD0gLTY3KQotCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs0XSArPSAxOwotCQllbHNlIGlmIChkQm0gPD0gLTYyKQotCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs1XSArPSAxOwotCQllbHNlIGlmIChkQm0gPD0gLTU3KQotCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs2XSArPSAxOwotCQllbHNlIGlmIChkQm0gPiAtNTcpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzddICs9IDE7Ci0KLQkJcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCX0KLQotCS8vIEFkZCBSeCBzaXplIHRvIGNoYW5uZWwgbG9hZCBjb3VudGVyLCB3ZSBzaG91bGQgaWdub3JlIGVycm9yIGNvdW50cwotCXBBZC0+U3RhQ2ZnLkNMQnVzeUJ5dGVzICs9IChwUnhELT5TREwwICsgMTQpOwotCi0JLy8gRHJvcCBUb0RzIHByb21pc2NvdXMgZnJhbWUsIGl0IGlzIG9wZW5lZCBkdWUgdG8gQ0NYIDIgY2hhbm5lbCBsb2FkIHN0YXRpc3RpY3MKLQlpZiAocEhlYWRlciAhPSBOVUxMKQotCXsKLQkJaWYgKHBIZWFkZXItPkZDLlRvRHMpCi0JCXsKLQkJCXJldHVybihORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJfQotCX0KLQotCS8vIERyb3Agbm90IFUyTSBmcmFtZXMsIGNhbnQncyBkcm9wIGhlcmUgYmVjYXVzZSB3ZSB3aWxsIGRyb3AgYmVhY29uIGluIHRoaXMgY2FzZQotCS8vIEkgYW0ga2luZCBvZiBkb3VidGluZyB0aGUgVTJNIGJpdCBvcGVyYXRpb24KLQkvLyBpZiAocFJ4RC0+VTJNID09IDApCi0JLy8JcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCi0JLy8gZHJvcCBkZWN5cHRpb24gZmFpbCBmcmFtZQotCWlmIChwUnhELT5DaXBoZXJFcnIpCi0JewotCQlpZiAocFJ4RC0+Q2lwaGVyRXJyID09IDIpCi0JCQl7REJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgicFJ4RCBFUlJPUjogSUNWIG9rIGJ1dCBNSUNFcnIgIikpO30KLQkJZWxzZSBpZiAocFJ4RC0+Q2lwaGVyRXJyID09IDEpCi0JCQl7REJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgicFJ4RCBFUlJPUjogSUNWIEVyciAiKSk7fQotCQllbHNlIGlmIChwUnhELT5DaXBoZXJFcnIgPT0gMykKLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoInBSeEQgRVJST1I6IEtleSBub3QgdmFsaWQgIikpOwotCi0gICAgICAgIGlmICgoKHBSeEQtPkNpcGhlckVyciAmIDEpID09IDEpICYmIHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50ICYmIElORlJBX09OKHBBZCkpCi0gICAgICAgICAgICBSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19JQ1ZfRVJST1JfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLQotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCIgJWQgKGxlbj0lZCwgTWNhc3Q9JWQsIE15QnNzPSVkLCBXY2lkPSVkLCBLZXlJZD0lZClcbiIsCi0JCQlwUnhELT5DaXBoZXJFcnIsCi0JCQlwUnhELT5TREwwLAotCQkJcFJ4RC0+TWNhc3QgfCBwUnhELT5CY2FzdCwKLQkJCXBSeEQtPk15QnNzLAotCQkJcFJ4V0ktPldpcmVsZXNzQ2xpSUQsCi0JCQlwUnhXSS0+S2V5SW5kZXgpKTsKLQotCQkvLwotCQkvLyBNSUMgRXJyb3IKLQkJLy8KLQkJaWYgKHBSeEQtPkNpcGhlckVyciA9PSAyKQotCQl7Ci0JCQlwV3BhS2V5ID0gJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BSeFdJLT5LZXlJbmRleF07Ci0KLSAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApCi0gICAgICAgICAgICAgICAgV3BhU2VuZE1pY0ZhaWx1cmVUb1dwYVN1cHBsaWNhbnQocEFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFdwYUtleS0+VHlwZSA9PSBQQUlSV0lTRUtFWSkgPyBUUlVFOkZBTFNFKTsKLSAgICAgICAgICAgIGVsc2UKLQkJCSAgICBSVE1QUmVwb3J0TWljRXJyb3IocEFkLCBwV3BhS2V5KTsKLQotICAgICAgICAgICAgaWYgKCgocFJ4RC0+Q2lwaGVyRXJyICYgMikgPT0gMikgJiYgcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQgJiYgSU5GUkFfT04ocEFkKSkKLSAgICAgICAgICAgICAgICBSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19NSUNfRVJST1JfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLQotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiUnggTUlDIFZhbHVlIGVycm9yXG4iKSk7Ci0JCX0KLQotCQlpZiAocEhlYWRlciA9PSBOVUxMKQotCQkJcmV0dXJuKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JCXJldHVybihORElTX1NUQVRVU19GQUlMVVJFKTsKLQl9Ci0KLQlyZXR1cm4oTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyByb3V0aW5lIHNlbmRzIGNvbW1hbmQgdG8gZmlybXdhcmUgYW5kIHR1cm4gb3VyIGNoaXAgdG8gcG93ZXIgc2F2ZSBtb2RlLgotCQlCb3RoIFJhZGlvT2ZmIGFuZCAuMTEgcG93ZXIgc2F2ZSBmdW5jdGlvbiBuZWVkcyB0byBjYWxsIHRoaXMgcm91dGluZS4KLQlJbnB1dDoKLQkJTGV2ZWwgPSBHVUlSQURJT19PRkYgIDogR1VJIFJhZGlvIE9mZiBtb2RlCi0JCUxldmVsID0gRE9UMTFQT1dFUlNBVkUgIDogODAyLjExIHBvd2VyIHNhdmUgbW9kZQotCQlMZXZlbCA9IFJUTVBfSEFMVCAgOiBXaGVuIERpc2FibGUgZGV2aWNlLgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBSVDI4eHhQY2lBc2ljUmFkaW9PZmYoCi0JSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JSU4gVUNIQVIgICAgICAgICAgICBMZXZlbCwKLQlJTiBVU0hPUlQgICAgICAgICAgIFRidHROdW1Ub05leHRXYWtlVXApCi17Ci0JV1BETUFfR0xPX0NGR19TVFJVQwlEbWFDZmc7Ci0JVUNIQVIJCWksIHRlbXBCQlBfUjMgPSAwOwotCUJPT0xFQU4JCWJyYyA9IEZBTFNFLCBDYW5jZWxsZWQ7Ci0gICAgVUlOVDMyCQlUYlRUVGltZSA9IDA7Ci0JVUlOVDMyCQlQc1BvbGxUaW1lID0gMCwgTUFDVmFsdWU7Ci0gICAgVUxPTkcJCUJlYWNvblBlcmlvZFRpbWU7Ci0gICAgVUlOVDMyCQlSeERtYUlkeCwgUnhDcHVJZHg7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1JhZGlvT2ZmID09PT4gVHhDcHVJZHggPSAlZCwgVHhEbWFJZHggPSAlZC4gUnhDcHVJZHggPSAlZCwgUnhEbWFJZHggPSAlZC5cbiIsIHBBZC0+VHhSaW5nWzBdLlR4Q3B1SWR4LCBwQWQtPlR4UmluZ1swXS5UeERtYUlkeCwgcEFkLT5SeFJpbmcuUnhDcHVJZHgsIHBBZC0+UnhSaW5nLlJ4RG1hSWR4KSk7Ci0KLSAgICAvLyBDaGVjayBSeCBETUEgYnVzeSBzdGF0dXMsIGlmIG1vcmUgdGhhbiBoYWxmIGlzIG9jY3VwaWVkLCBnaXZlIHVwIHRoaXMgcmFkaW8gb2ZmLgotCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfRFJYX0lEWCAsICZSeERtYUlkeCk7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBSWF9DUlhfSURYICwgJlJ4Q3B1SWR4KTsKLQlpZiAoKFJ4RG1hSWR4ID4gUnhDcHVJZHgpICYmICgoUnhEbWFJZHggLSBSeENwdUlkeCkgPiBSWF9SSU5HX1NJWkUvMykpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljUmFkaW9PZmYgPT09PiByZXR1cm4xLiBSeERtYUlkeCA9ICVkICwgIFJ4Q3B1SWR4ID0gJWQuIFxuIiwgUnhEbWFJZHgsIFJ4Q3B1SWR4KSk7Ci0JCXJldHVybjsKLQl9Ci0JZWxzZSBpZiAoKFJ4Q3B1SWR4ID49IFJ4RG1hSWR4KSAmJiAoKFJ4Q3B1SWR4IC0gUnhEbWFJZHgpIDwgUlhfUklOR19TSVpFLzMpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1JhZGlvT2ZmID09PT4gcmV0dXJuMi4gIFJ4Q3B1SWR4ID0gJWQuIFJ4RG1hSWR4ID0gJWQgLCAgXG4iLCBSeENwdUlkeCwgUnhEbWFJZHgpKTsKLQkJcmV0dXJuOwotCX0KLQotICAgIC8vIE9uY2UgZ28gaW50byB0aGlzIGZ1bmN0aW9uLCBkaXNhYmxlIHR4IGJlY2F1c2UgZG9uJ3Qgd2FudCB0b28gbWFueSBwYWNrZXRzIGluIHF1ZXVlIHRvIHByZXZlbnQgSFcgc3RvcHMuCi0JUlRNUF9TRVRfUFNGTEFHKHBBZCwgZlJUTVBfUFNfRElTQUJMRV9UWCk7Ci0KLQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKQotCXsKLQkgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLAkmQ2FuY2VsbGVkKTsKLQkgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCSZDYW5jZWxsZWQpOwotCi0JICAgIGlmIChMZXZlbCA9PSBET1QxMVBPV0VSU0FWRSkKLQkJewotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUQlRUX1RJTUVSLCAmVGJUVFRpbWUpOwotCQkJVGJUVFRpbWUgJj0gMHgxZmZmZjsKLQkJCS8vIDAwLiBjaGVjayBpZiBuZWVkIHRvIGRvIHNsZWVwIGluIHRoaXMgRFRJTSBwZXJpb2QuICAgSWYgbmV4dCBiZWFjb24gd2lsbCBhcnJpdmUgd2l0aGluIDMwbXMgLCAuLi5kb2Vzbid0IG5lY2Vzc2FyaWx5IHNsZWVwLgotCQkJLy8gVGJUVFRpbWUgdWludCA9IDY0dXMsIExFQURfVElNRSB1bml0ID0gMTAyNHVzLCBQc1BvbGxUaW1lIHVuaXQgPSAxbXMKLQkgICAgICAgIGlmICAoKCg2NCpUYlRUVGltZSkgPCgoTEVBRF9USU1FKjEwMjQpICsgNDAwMDApKSAmJiAoVGJ0dE51bVRvTmV4dFdha2VVcCA9PSAwKSkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUYlRUVGltZSA9IDB4JXggLCBnaXZlIHVwIHRoaXMgc2xlZXAuIFxuIiwgVGJUVFRpbWUpKTsKLQkgICAgICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKLQkJCQlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0RJU0FCTEVfVFgpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlQc1BvbGxUaW1lID0gKDY0KlRiVFRUaW1lLSBMRUFEX1RJTUUqMTAyNCkvMTAwMDsKLQkJCQlQc1BvbGxUaW1lIC09IDM7Ci0KLQkgICAgICAgICAgICBCZWFjb25QZXJpb2RUaW1lID0gcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kKjEwMi8xMDA7Ci0JCQkJaWYgKFRidHROdW1Ub05leHRXYWtlVXAgPiAwKQotCQkJCQlQc1BvbGxUaW1lICs9ICgoVGJ0dE51bVRvTmV4dFdha2VVcCAtMSkgKiBCZWFjb25QZXJpb2RUaW1lKTsKLQotCSAgICAgICAgICAgIHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gVFJVRTsKLQkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwgUHNQb2xsVGltZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLSAgICAvLyAwLiBEaXNhYmxlIFR4IERNQS4KLQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZEbWFDZmcud29yZCk7Ci0JRG1hQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBEbWFDZmcud29yZCk7Ci0KLQkvLyAxLiBXYWl0IERNQSBub3QgYnVzeQotCWkgPSAwOwotCWRvCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZEbWFDZmcud29yZCk7Ci0JCWlmICgoRG1hQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKSAmJiAoRG1hQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKLQkJCWJyZWFrOwotCQlSVE1QdXNlY0RlbGF5KDIwKTsKLQkJaSsrOwotCX13aGlsZShpIDwgNTApOwotCi0JaWYgKGkgPj0gNTApCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJETUEga2VlcHMgYnVzeS4gIHJldHVybiBvbiBSVDI4eHhQY2lBc2ljUmFkaW9PZmYgKClcbiIpKTsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmRG1hQ2ZnLndvcmQpOwotCQlEbWFDZmcuZmllbGQuRW5hYmxlVHhETUEgPSAxOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBEbWFDZmcud29yZCk7Ci0JCXBBZC0+Q2hlY2tEbWFCdXN5Q291bnQrKzsKLQkJcmV0dXJuOwotCX0KLQllbHNlCi0JewotCQlwQWQtPkNoZWNrRG1hQnVzeUNvdW50ID0gMDsKLQl9Ci0KLSAgICBSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRik7Ci0KLSAgICAvLyBTZXQgdG8gMVIuCi0JaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPiAxKQotCXsKLQkJdGVtcEJCUF9SMyA9IChwQWQtPlN0YUNmZy5CQlBSMyAmIDB4RTcpOwotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCB0ZW1wQkJQX1IzKTsKLQl9Ci0KLQkvLyBJbiBSYWRpbyBPZmYsIHdlIHR1cm4gb2ZmIFJGIGNsaywgU28gbm93IG5lZWQgdG8gY2FsbCBBU0lDU3dpdGNoQ2hhbm5lbCBhZ2Fpbi4KLQlpZiAoSU5GUkFfT04ocEFkKSAmJiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQkJJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCi0JewotCQkvLyBNdXN0IHVzaW5nIDQwTUh6LgotCQlBc2ljVHVybk9mZlJGQ2xrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwotCX0KLQllbHNlCi0JewotCQkvLyBNdXN0IHVzaW5nIDIwTUh6LgotCQlBc2ljVHVybk9mZlJGQ2xrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JfQotCi0JaWYgKExldmVsICE9IFJUTVBfSEFMVCkKLQl7Ci0JCS8vIENoYW5nZSBJbnRlcnJ1cHQgYml0bWFzay4KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX01BU0tfQ1NSLCBBdXRvV2FrZXVwSW50KTsKLQl9Ci0JZWxzZQotCXsKLQkJTklDRGlzYWJsZUludGVycnVwdChwQWQpOwotCX0KLQotICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0NSWF9JRFgsIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4KTsKLQkvLyBEaXNhYmxlIE1BQyBSeAotCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMICwgJk1BQ1ZhbHVlKTsKLQlNQUNWYWx1ZSAmPSAweGY3OwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCAsIE1BQ1ZhbHVlKTsKLQotCS8vICAyLiBTZW5kIFNsZWVwIGNvbW1hbmQKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9TVEFUVVMsIDB4ZmZmZmZmZmYpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX0NJRCwgMHhmZmZmZmZmZik7Ci0JLy8gc2VuZCBQT1dFUi1TQVZFIGNvbW1hbmQgdG8gTUNVLiBoaWdoLWJ5dGUgPSAxIHNhdmUgcG93ZXIgYXMgbXVjaCBhcyBwb3NzaWJsZS4gaGlnaCBieXRlID0gMCBzYXZlIGxlc3MgcG93ZXIKLQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIFBvd2VyU2FmZUNJRCwgMHhmZiwgMHgxKTsKLQkvLyAgMi0xLiBXYWl0IGNvbW1hbmQgc3VjY2VzcwotCS8vIFN0YXR1cyA9IDEgOiBzdWNjZXNzLCBTdGF0dXMgPSAyLCBhbHJlYWR5IHNsZWVwLCBTdGF0dXMgPSAzLCBNYXliZSBNQUMgaXMgYnVzeSBzbyBjYW4ndCBmaW5pc2ggdGhpcyB0YXNrLgotCWJyYyA9IEFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJTYWZlQ0lEKTsKLQotICAgIGlmIChicmMgPT0gRkFMU0UpCi0gICAgewotICAgICAgICAvLyB0cnkgYWdhaW4KLSAgICAJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMwLCBQb3dlclNhZmVDSUQsIDB4ZmYsIDB4MDEpOyAgIC8vIHNlbmQgUE9XRVItU0FWRSBjb21tYW5kIHRvIE1DVS4gVGltZW91dCB1bml0OjQwdXMuCi0gICAgCS8vUlRNUHVzZWNEZWxheSgyMDApOwotICAgIAlicmMgPSBBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyU2FmZUNJRCk7Ci0gICAgfQotCi0JLy8gIDMuIEFmdGVyIDB4MzAgY29tbWFuZCBpcyBvaywgc2VuZCByYWRpbyBvZmYgY29tbWFuZC4gbG93Ynl0ZSA9IDAgZm9yIHBvd2VyIHNhZmUuCi0JLy8gSWYgMHgzMCBjb21tYW5kIGlzIG5vdCBvayB0aGlzIHRpbWUsIHdlIGNhbiBpZ25vcmUgMHgzNSBjb21tYW5kLiBJdCB3aWxsIG1ha2Ugc3VyZSBub3QgY2F1c2UgZmlybXdhcmUnciBwcm9ibGVtLgotCWlmICgoTGV2ZWwgPT0gRE9UMTFQT1dFUlNBVkUpICYmIChicmMgPT0gVFJVRSkpCi0JewotCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzUsIFBvd2VyUmFkaW9PZmZDSUQsIDAsIDB4MDApOwkvLyBsb3dieXRlID0gMCBtZWFucyB0byBkbyBwb3dlciBzYWZlLCBOT1QgdHVybiBvZmYgcmFkaW8uCi0JIAkvLyAgMy0xLiBXYWl0IGNvbW1hbmQgc3VjY2VzcwotCSAJQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlclJhZGlvT2ZmQ0lEKTsKLQl9Ci0JZWxzZSBpZiAoYnJjID09IFRSVUUpCi0JewotCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzUsIFBvd2VyUmFkaW9PZmZDSUQsIDEsIDB4MDApOwkvLyBsb3dieXRlID0gMCBtZWFucyB0byBkbyBwb3dlciBzYWZlLCBOT1QgdHVybiBvZmYgcmFkaW8uCi0JIAkvLyAgMy0xLiBXYWl0IGNvbW1hbmQgc3VjY2VzcwotCSAJQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlclJhZGlvT2ZmQ0lEKTsKLQl9Ci0KLSAgICAvLyBXYWl0IERNQSBub3QgYnVzeQotCWkgPSAwOwotCWRvCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZEbWFDZmcud29yZCk7Ci0JCWlmICgoRG1hQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSAmJiAoRG1hQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKSkKLQkJCWJyZWFrOwotCQlSVE1QdXNlY0RlbGF5KDIwKTsKLQkJaSsrOwotCX13aGlsZShpIDwgNTApOwotCi0JaWYgKGkgPj0gNTApCi0JewotCQlwQWQtPkNoZWNrRG1hQnVzeUNvdW50Kys7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRNQSBSeCBrZWVwcyBidXN5LiAgb24gUlQyOHh4UGNpQXNpY1JhZGlvT2ZmICgpXG4iKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCXBBZC0+Q2hlY2tEbWFCdXN5Q291bnQgPSAwOwotCX0KLQotCWlmIChMZXZlbCA9PSBET1QxMVBPV0VSU0FWRSkKLQl7Ci0JCUFVVE9fV0FLRVVQX1NUUlVDCUF1dG9XYWtldXBDZmc7Ci0JCS8vUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsIDkwKTsKLQotCQkvLyB3ZSBoYXZlIGRlY2lkZWQgdG8gU0xFRVAsIHNvIGF0IGxlYXN0IGRvIGl0IGZvciBhIEJFQUNPTiBwZXJpb2QuCi0JCWlmIChUYnR0TnVtVG9OZXh0V2FrZVVwID09IDApCi0JCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gMTsKLQotCQlBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7Ci0KLQkJLy8gMS4gU2V0IGF1dG8gd2FrZSB1cCB0aW1lci4KLQkJQXV0b1dha2V1cENmZy5maWVsZC5OdW1vZlNsZWVwaW5nVGJ0dCA9IFRidHROdW1Ub05leHRXYWtlVXAgLSAxOwotCQlBdXRvV2FrZXVwQ2ZnLmZpZWxkLkVuYWJsZUF1dG9XYWtldXAgPSAxOwotCQlBdXRvV2FrZXVwQ2ZnLmZpZWxkLkF1dG9MZWFkVGltZSA9IExFQURfVElNRTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOwotCX0KLQotCS8vICA0LTEuIElmIGl0J3MgdG8gZGlzYWJsZSBvdXIgZGV2aWNlLiBOZWVkIHRvIHJlc3RvcmUgUENJIENvbmZpZ3VyYXRpb24gU3BhY2UgdG8gaXRzIG9yaWdpbmFsIHZhbHVlLgotCWlmIChMZXZlbCA9PSBSVE1QX0hBTFQpCi0JewotCQlpZiAoKGJyYyA9PSBUUlVFKSAmJiAoaSA8IDUwKSkKLQkJCVJUTVBQQ0llTGlua0N0cmxTZXR0aW5nKHBBZCwgMCk7Ci0JfQotCS8vICA0LiBTZXQgUENJIGNvbmZpZ3VyYXRpb24gU3BhY2UgTGluayBDb210cm9sIGZpZWxkcy4gIE9ubHkgUmFkaW8gT2ZmIG5lZWRzIHRvIGNhbGwgdGhpcyBmdW5jdGlvbgotCWVsc2UKLQl7Ci0JCWlmICgoYnJjID09IFRSVUUpICYmIChpIDwgNTApKQotCQkJUlRNUFBDSWVMaW5rQ3RybFNldHRpbmcocEFkLCAzKTsKLQl9Ci0KLQlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0RJU0FCTEVfVFgpOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyByb3V0aW5lIHNlbmRzIGNvbW1hbmQgdG8gZmlybXdhcmUgYW5kIHR1cm4gb3VyIGNoaXAgdG8gd2FrZSB1cCBtb2RlIGZyb20gcG93ZXIgc2F2ZSBtb2RlLgotCQlCb3RoIFJhZGlvT24gYW5kIC4xMSBwb3dlciBzYXZlIGZ1bmN0aW9uIG5lZWRzIHRvIGNhbGwgdGhpcyByb3V0aW5lLgotCUlucHV0OgotCQlMZXZlbCA9IEdVSVJBRElPX09GRiA6IGNhbGwgdGhpcyBmdW5jdGlvbiBpcyBmcm9tIFJhZGlvIE9mZiB0byBSYWRpbyBPbi4gIE5lZWQgdG8gcmVzdG9yZSBQQ0kgaG9zdCB2YWx1ZS4KLQkJTGV2ZWwgPSBvdGhlciB2YWx1ZSA6IG5vcm1hbCB3YWtlIHVwIGZ1bmN0aW9uLgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotQk9PTEVBTiBSVDI4eHhQY2lBc2ljUmFkaW9PbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiAgICAgTGV2ZWwpCi17Ci0gICAgV1BETUFfR0xPX0NGR19TVFJVQwlEbWFDZmc7Ci0JQk9PTEVBTgkJCQlDYW5jZWxsZWQsIGJydiA9IFRSVUU7Ci0gICAgVUlOVDMyCQkJICAgIE1BQ1ZhbHVlOwotCi0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKLQl7Ci0JICAgIHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7Ci0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAkmQ2FuY2VsbGVkKTsKLQkJaWYgKChMZXZlbCA9PSBHVUlSQURJT19PRkYpIHx8IChMZXZlbCA9PSBHVUlfSURMRV9QT1dFUl9TQVZFKQotCQl8fCAoUlRNUF9URVNUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX1NFVF9QQ0lfQ0xLX09GRl9DT01NQU5EKSkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUMjh4eFBjaUFzaWNSYWRpb09uICgpXG4iKSk7Ci0JCQkvLyAxLiBTZXQgUENJIExpbmsgQ29udHJvbCBpbiBDb25maWd1cmF0aW9uIFNwYWNlLgotCQkJUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsIFJFU1RPUkVfV0FLRVVQKTsKLQkJCVJUTVB1c2VjRGVsYXkoNjAwMCk7Ci0JCX0KLQl9Ci0KLSAgICBwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIDB4M2E4MCk7Ci0JLy8gMi4gU2VuZCB3YWtlIHVwIGNvbW1hbmQuCi0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMxLCBQb3dlcldha2VDSUQsIDB4MDAsIDB4MDIpOwotCi0JLy8gMi0xLiB3YWl0IGNvbW1hbmQgb2suCi0JYnJ2ID0gQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlcldha2VDSUQpOwotICAgIGlmIChicnYpCi0gICAgewotICAgIAlOSUNFbmFibGVJbnRlcnJ1cHQocEFkKTsKLQotICAgIAkvLyAzLiBFbmFibGUgVHggRE1BLgotICAgIAlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZEbWFDZmcud29yZCk7Ci0gICAgCURtYUNmZy5maWVsZC5FbmFibGVUeERNQSA9IDE7Ci0gICAgICAgIERtYUNmZy5maWVsZC5FbmFibGVSeERNQSA9IDE7Ci0gICAgCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIERtYUNmZy53b3JkKTsKLQotICAgICAgICAvLyBFYWJsZSBNQUMgUngKLSAgICAJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwgLCAmTUFDVmFsdWUpOwotICAgIAlNQUNWYWx1ZSB8PSAweDg7Ci0gICAgCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCAsIE1BQ1ZhbHVlKTsKLQotICAgIAlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKTsKLSAgICAJaWYgKExldmVsID09IEdVSV9JRExFX1BPV0VSX1NBVkUpCi0gICAgCXsKLSAgICAJCS8vIEluIFJhZGlvIE9mZiwgd2UgdHVybiBvZmYgUkYgY2xrLCBTbyBub3cgbmVlZCB0byBjYWxsIEFTSUNTd2l0Y2hDaGFubmVsIGFnYWluLgotICAgIAkJaWYgKElORlJBX09OKHBBZCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCi0gICAgCQkJJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCi0gICAgCQl7Ci0gICAgCQkJLy8gTXVzdCB1c2luZyA0ME1Iei4KLSAgICAJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0gICAgCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwotICAgIAkJfQotICAgIAkJZWxzZQotICAgIAkJewotICAgIAkJCS8vIE11c3QgdXNpbmcgMjBNSHouCi0gICAgCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0gICAgCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotfQotCi1WT0lEIFJUMjh4eFBjaVN0YUFzaWNGb3JjZVdha2V1cCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiAgICAJIExldmVsKQotewotICAgIEFVVE9fV0FLRVVQX1NUUlVDCUF1dG9XYWtldXBDZmc7Ci0KLSAgICBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XQUtFVVBfTk9XKSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndha2luZyB1cCBub3chXG4iKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV0FLRVVQX05PVyk7Ci0JUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19HT19UT19TTEVFUF9OT1cpOwotCi0gICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKLSAgICB7Ci0gICAgICAgIC8vIFN1cHBvcnQgUENJZSBBZHZhbmNlIFBvd2VyIFNhdmUKLSAgICAJaWYgKCgoTGV2ZWwgPT0gRlJPTV9UWCkgJiYgKHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID09IFRSVUUpKSB8fAotCQkJKExldmVsID09IFJUTVBfSEFMVCkpCi0gICAgCXsKLSAgICAgICAgICAgIHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7Ci0gICAgCQlSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKHBBZCwgUkVTVE9SRV9XQUtFVVApOwotICAgIAkJUlRNUHVzZWNEZWxheSg1MDAwKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT09PT1Bc2ljRm9yY2VXYWtldXA9PT1iRnJvbVR4XG4iKSk7Ci0gICAgCX0KLQotCQlBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7Ci0KLQkJLy8gSWYgdGhpcyBpcyBjYWxsZWQgZnJvbSBIYWx0LiBBTFdBWVMgZm9yY2Ugd2FrZXVwISEhCi0JCWlmIChMZXZlbCA9PSBSVE1QX0hBTFQpCi0JCXsKLQkJCVJUMjh4eFBjaUFzaWNSYWRpb09uKHBBZCwgUlRNUF9IQUxUKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChSVDI4eHhQY2lBc2ljUmFkaW9PbihwQWQsIERPVDExUE9XRVJTQVZFKSkKLQkJCXsKLQkJCQkvLyBJbiBSYWRpbyBPZmYsIHdlIHR1cm4gb2ZmIFJGIGNsaywgU28gbm93IG5lZWQgdG8gY2FsbCBBU0lDU3dpdGNoQ2hhbm5lbCBhZ2Fpbi4KLQkJCQlpZiAoSU5GUkFfT04ocEFkKSAmJiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQkJCQkJJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCi0JCQkJewotCQkJCQkvLyBNdXN0IHVzaW5nIDQwTUh6LgotCQkJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0JCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJLy8gTXVzdCB1c2luZyAyME1Iei4KLQkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCQkJCX0KLQkJCX0KLQkJfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvLyBQQ0ksIDI4NjAtUENJZQotICAgICAgICBBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIDB4ZmYsIDB4MDAsIDB4MDApOwotCQlBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7Ci0gICAgfQotCi0gICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7Ci0gICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV0FLRVVQX05PVyk7Ci0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PT09PT1SVDI4eHhQY2lTdGFBc2ljRm9yY2VXYWtldXBcbiIpKTsKLX0KLQotVk9JRCBSVDI4eHhQY2lTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQgVGJ0dE51bVRvTmV4dFdha2VVcCkKLXsKLSAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQotCXsKLQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7Ci0JCXJldHVybjsKLQl9Ci0gICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKLSAgICB7Ci0gICAgCVVMT05HCU5vdyA9IDA7Ci0gICAgICAgIGlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dBS0VVUF9OT1cpKQotICAgICAgICB7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3YWtpbmcgdXAgbm93IVxuIikpOwotICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwotCQkvLyBJZiBsYXN0IHNlbmQgTlVMTCBmcmFtIHRpbWUgaXMgdG9vIGNsb3NlIHRvIHRoaXMgcmVjZWl2aW5nIGJlYWNvbiAod2l0aGluIDhtcyksIGRvbid0IGdvIHRvIHNsZWVwIGZvciB0aGlzIERUTS4KLQkJLy8gQmVjYXVzZSBTb21lIEFQIGNhbid0IHF1ZXVpbmcgb3V0Z29pbmcgZnJhbWVzIGltbWVkaWF0ZWx5LgotCQlpZiAoKChwQWQtPk1sbWUuTGFzdFNlbmROVUxMcHNtVGltZSArIDgpID49IE5vdykgJiYgKHBBZC0+TWxtZS5MYXN0U2VuZE5VTExwc21UaW1lIDw9IE5vdykpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vdyA9ICVsdSwgTGFzdFNlbmROVUxMcHNtVGltZT0lbHUgOiAgUnhDb3VudFNpbmNlTGFzdE5VTEwgPSAlbHUuIFxuIiwgTm93LCBwQWQtPk1sbWUuTGFzdFNlbmROVUxMcHNtVGltZSwgcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWVsc2UgaWYgKChwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnRTaW5jZUxhc3ROVUxMID4gMCkgJiYgKChwQWQtPk1sbWUuTGFzdFNlbmROVUxMcHNtVGltZSArIHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCkgPj0gTm93KSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm93ID0gJWx1LCBMYXN0U2VuZE5VTExwc21UaW1lPSVsdTogUnhDb3VudFNpbmNlTGFzdE5VTEwgPSAlbHUgPiAwIFxuIiwgTm93LCBwQWQtPk1sbWUuTGFzdFNlbmROVUxMcHNtVGltZSwgIHBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudFNpbmNlTGFzdE5VTEwpKTsKLQkJCXJldHVybjsKLQkJfQotCi0gICAgICAgIFJUMjh4eFBjaUFzaWNSYWRpb09mZihwQWQsIERPVDExUE9XRVJTQVZFLCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQVVUT19XQUtFVVBfU1RSVUMJQXV0b1dha2V1cENmZzsKLSAgICAgICAgLy8gd2UgaGF2ZSBkZWNpZGVkIHRvIFNMRUVQLCBzbyBhdCBsZWFzdCBkbyBpdCBmb3IgYSBCRUFDT04gcGVyaW9kLgotICAgICAgICBpZiAoVGJ0dE51bVRvTmV4dFdha2VVcCA9PSAwKQotICAgICAgICAgICAgVGJ0dE51bVRvTmV4dFdha2VVcCA9IDE7Ci0KLSAgICAgICAgQXV0b1dha2V1cENmZy53b3JkID0gMDsKLSAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOwotICAgICAgICBBdXRvV2FrZXVwQ2ZnLmZpZWxkLk51bW9mU2xlZXBpbmdUYnR0ID0gVGJ0dE51bVRvTmV4dFdha2VVcCAtIDE7Ci0gICAgICAgIEF1dG9XYWtldXBDZmcuZmllbGQuRW5hYmxlQXV0b1dha2V1cCA9IDE7Ci0gICAgICAgIEF1dG9XYWtldXBDZmcuZmllbGQuQXV0b0xlYWRUaW1lID0gNTsKLSAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOwotICAgICAgICBBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIDB4ZmYsIDB4ZmYsIDB4MDApOyAgIC8vIHNlbmQgUE9XRVItU0FWRSBjb21tYW5kIHRvIE1DVS4gVGltZW91dCA0MHVzLgotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gJXMsIFRidHROdW1Ub05leHRXYWtlVXA9JWQgXG4iLCBfX2Z1bmNfXywgVGJ0dE51bVRvTmV4dFdha2VVcCkpOwotICAgIH0KLSAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7Ci19Ci0KLVZPSUQgUHNQb2xsV2FrZUV4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQotewotCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCItLT5Qc1BvbGxXYWtlRXhlYyBcbiIpKTsKLQlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0gICAgaWYgKHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nKQotICAgIHsKLQkgICAgUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsIFJFU1RPUkVfV0FLRVVQKTsKLSAgICB9Ci0gICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKLQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLX0KLQotVk9JRCAgUmFkaW9PbkV4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQotewotCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKLQlXUERNQV9HTE9fQ0ZHX1NUUlVDCURtYUNmZzsKLQlCT09MRUFOCQkJCUNhbmNlbGxlZDsKLQotCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCItLT5SYWRpb09uRXhlYygpIHJldHVybiBvbiBmT1BfU1RBVFVTX0RPWkUgPT0gVFJVRTsgXG4iKSk7Ci0JCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwgMTApOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIi0tPlJhZGlvT25FeGVjKCkgcmV0dXJuIG9uIFNDQU5fSU5fUFJPR1JFU1M7IFxuIikpOwotCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsIDEwKTsKLQkJcmV0dXJuOwotCX0KLSAgICBwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZyA9IEZBTFNFOwotCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAkmQ2FuY2VsbGVkKTsKLQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCi0JewotCQlwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKLSAgICAgICAgUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JLKTsKLQkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JFKTsKLQkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZJKTsKLQkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZPKTsKLQkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0hDQ0EpOwotCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfTUdNVCk7Ci0JCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9SWCk7Ci0KLQkJLy8gMi4gU2VuZCB3YWtlIHVwIGNvbW1hbmQuCi0JCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMSwgUG93ZXJXYWtlQ0lELCAweDAwLCAweDAyKTsKLQkJLy8gMi0xLiB3YWl0IGNvbW1hbmQgb2suCi0JCUFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJXYWtlQ0lEKTsKLQotCQkvLyBXaGVuIFBDSSBjbG9jayBpcyBvZmYsIGRvbid0IHdhbnQgdG8gc2VydmljZSBpbnRlcnJ1cHQuIFNvIHdoZW4gYmFjayB0byBjbG9jayBvbiwgZW5hYmxlIGludGVycnVwdC4KLQkJTklDRW5hYmxlSW50ZXJydXB0KHBBZCk7Ci0KLQkJLy8gMy4gRW5hYmxlIFR4IERNQS4KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmRG1hQ2ZnLndvcmQpOwotCQlEbWFDZmcuZmllbGQuRW5hYmxlVHhETUEgPSAxOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBEbWFDZmcud29yZCk7Ci0KLQkJLy8gSW4gUmFkaW8gT2ZmLCB3ZSB0dXJuIG9mZiBSRiBjbGssIFNvIG5vdyBuZWVkIHRvIGNhbGwgQVNJQ1N3aXRjaENoYW5uZWwgYWdhaW4uCi0JCWlmIChJTkZSQV9PTihwQWQpICYmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQotCQkJJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCi0JCXsKLQkJCS8vIE11c3QgdXNpbmcgNDBNSHouCi0JCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0JCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyBNdXN0IHVzaW5nIDIwTUh6LgotCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJfQotCi0JCS8vIENsZWFyIFJhZGlvIG9mZiBmbGFnCi0JCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKLQotCQkvLyBTZXQgTEVECi0JCVJUTVBTZXRMRUQocEFkLCBMRURfUkFESU9fT04pOwotCi0gICAgICAgIGlmIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX0FDVElWRSkKLSAgICAgICAgewotICAgIAkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgcEFkLT5TdGFDZmcuQkJQUjMpOwotICAgICAgICB9Ci0JfQotCWVsc2UKLQl7Ci0JCVJUMjh4eFBjaUFzaWNSYWRpb09mZihwQWQsIEdVSVJBRElPX09GRiwgMCk7Ci0JfQotfQotCi1WT0lEIFJUMjh4eFBjaU1sbWVSYWRpb09uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotICAgIGlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCi0gICAJCXJldHVybjsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXM9PT0+XG4iLCBfX2Z1bmNfXykpOwotCi0gICAgaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApIHx8Ci0gICAgICAgICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpKSkKLSAgICB7Ci0gICAgCU5JQ1Jlc2V0RnJvbUVycm9yKHBBZCk7Ci0KLSAgICAJLyoKLSAgICAJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JLKTsKLSAgICAJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JFKTsKLSAgICAJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZJKTsKLSAgICAJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZPKTsKLSAgICAJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0hDQ0EpOwotICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfTUdNVCk7Ci0gICAgCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9SWCk7Ci0JCSovCi0KLSAgICAJLy8gRW5hYmxlIFR4L1J4Ci0gICAgCVJUTVBFbmFibGVSeFR4KHBBZCk7Ci0KLSAgICAJLy8gQ2xlYXIgUmFkaW8gb2ZmIGZsYWcKLSAgICAJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOwotCi0JICAgIC8vIFNldCBMRUQKLQkgICAgUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PTik7Ci0gICAgfQotCi0gICAgaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJgotICAgICAgICAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKSkKLSAgICB7Ci0gICAgICAgIEJPT0xFQU4JCUNhbmNlbGxlZDsKLQotICAgIAlSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKHBBZCwgUkVTVE9SRV9XQUtFVVApOwotCi0gICAgICAgIHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7Ci0gICAgCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAkmQ2FuY2VsbGVkKTsKLSAgICAJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLAkmQ2FuY2VsbGVkKTsKLSAgICAJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCAxMCk7Ci0gICAgfQotfQotCi1WT0lEIFJUMjh4eFBjaU1sbWVSYWRpb09GRigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLSAgICBXUERNQV9HTE9fQ0ZHX1NUUlVDCUdsb0NmZzsKLQlVSU5UMzIJaTsKLQotCWlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiLS0+TWxtZVJhZGlvT2ZmKCkgcmV0dXJuIG9uIGJSYWRpbyA9PSBUUlVFOyBcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotICAgIGlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKLSAgICAJcmV0dXJuOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcz09PT5cbiIsIF9fZnVuY19fKSk7Ci0KLQkvLyBTZXQgTEVECi0JUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PRkYpOwotCi0gICAgewotICAgIAlCT09MRUFOCQlDYW5jZWxsZWQ7Ci0KLSAgICAJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCi0gICAgCXsKLQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgJkNhbmNlbGxlZCk7Ci0JCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKLSAgICAJfQotCi0JCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJPT0xFQU4gQ2FuY2VsbGVkOwotCi0JCQkvLyBBbHdheXMgcmFkaW8gb24gc2luY2UgdGhlIE5JQyBuZWVkcyB0byBzZXQgdGhlIE1DVSBjb21tYW5kIChMRURfUkFESU9fT0ZGKS4NCi0JCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIA0KLQkJCSAgICAgKElETEVfT04ocEFkKSkgJiYgDQotCQkJICAgICAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKSkpDQotCQkJew0KLQkJCQlSVDI4eHhQY2lBc2ljUmFkaW9PbihwQWQsIEdVSV9JRExFX1BPV0VSX1NBVkUpOw0KLQkJCX0KLQotICAgICAgICAgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKLSAgICAgICAgICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAkmQ2FuY2VsbGVkKTsKLQkgICAgICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwJJkNhbmNlbGxlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMaW5rIGRvd24gZmlyc3QgaWYgYW55IGFzc29jaWF0aW9uIGV4aXN0cwotICAgICAgICBpZiAoSU5GUkFfT04ocEFkKSB8fCBBREhPQ19PTihwQWQpKQotICAgICAgICAgICAgTGlua0Rvd24ocEFkLCBGQUxTRSk7Ci0gICAgICAgIFJUTVB1c2VjRGVsYXkoMTAwMDApOwotICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAvLyBDbGVhbiB1cCBvbGQgYnNzIHRhYmxlCi0gICAgICAgIEJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKLQotCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkspOwotICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkUpOwotICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVkkpOwotICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVk8pOwotICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfSENDQSk7Ci0gICAgCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9NR01UKTsKLSAgICAJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX1JYKTsKLQotCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKQotCQl7Ci0JCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsIDUwMCk7Ci0JCQlyZXR1cm47Ci0JCX0KLSAgICB9Ci0KLQkvLyBTZXQgUmFkaW8gb2ZmIGZsYWcKLQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOwotCi0JLy8gRGlzYWJsZSBUeC9SeCBETUEKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7CSAgIC8vIGRpc2FibGUgRE1BCi0JR2xvQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMDsKLQlHbG9DZmcuZmllbGQuRW5hYmxlUnhETUEgPSAwOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsJICAgLy8gYWJvcnQgYWxsIFRYIHJpbmdzCi0KLQotCS8vIE1BQ19TWVNfQ1RSTCA9PiB2YWx1ZSA9IDB4MCA9PiA0MG1BCi0JUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAwKTsKLQotCS8vIFBXUl9QSU5fQ0ZHID0+IHZhbHVlID0gMHgwID0+IDQwbUEKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQV1JfUElOX0NGRywgMCk7Ci0KLQkvLyBUWF9QSU5fQ0ZHID0+IHZhbHVlID0gMHgwID0+IDIwbUEKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QSU5fQ0ZHLCAwKTsKLQotCWlmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApCi0JewotCQkvLyBNdXN0IHVzaW5nIDQwTUh6LgotCQlBc2ljVHVybk9mZlJGQ2xrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwotCX0KLQllbHNlCi0JewotCQkvLyBNdXN0IHVzaW5nIDIwTUh6LgotCQlBc2ljVHVybk9mZlJGQ2xrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JfQotCi0JLy8gV2FpdGluZyBmb3IgRE1BIGlkbGUKLQlpID0gMDsKLQlkbwotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOwotCQlpZiAoKEdsb0NmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkgJiYgKEdsb0NmZy5maWVsZC5SeERNQUJ1c3kgPT0gMCkpCi0JCQlicmVhazsKLQotCQlSVE1QdXNlY0RlbGF5KDEwMDApOwotCX13aGlsZSAoaSsrIDwgMTAwKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9kYXRhX3BjaS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGFfcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNkNzNhMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9kYXRhX3BjaS5jCkBAIC0wLDAgKzEsMTA5NiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoKKyAgIEFsbCBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIG11c3QgYmUgUENJLWRlcGVuZGVkLCBvciB5b3Ugc2hvdWxkIG91dCB5b3VyIGZ1bmN0aW9uCisJaW4gb3RoZXIgZmlsZXMuCisKKyovCisjaW5jbHVkZQkiLi4vcnRfY29uZmlnLmgiCisKK3UxNiBSdG1wUENJX1dyaXRlVHhSZXNvdXJjZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrLAorCQkJICAgICAgIElOIEJPT0xFQU4gYklzTGFzdCwgdTE2ICogRnJlZU51bWJlcikKK3sKKworCXU4ICpwRE1BSGVhZGVyQnVmVkE7CisJdTE2IFR4SWR4LCBSZXRUeElkeDsKKwlzdHJ1Y3QgcnRfdHhkICogcFR4RDsKKwl1MzIgQnVmQmFzZVBhTG93OworCXN0cnVjdCBydF9ydG1wX3R4X3JpbmcgKnBUeFJpbmc7CisJdTE2IGh3SGVhZGVyTGVuOworCisJLyogKi8KKwkvKiBnZXQgVHggUmluZyBSZXNvdXJjZSAqLworCS8qICovCisJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF07CisJVHhJZHggPSBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uVHhDcHVJZHg7CisJcERNQUhlYWRlckJ1ZlZBID0gKHU4ICopcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7CisJQnVmQmFzZVBhTG93ID0KKwkgICAgUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOworCisJLyogY29weSBUWElORk8gKyBUWFdJICsgV0xBTiBIZWFkZXIgKyBMTEMgaW50byBETUEgSGVhZGVyIEJ1ZmZlciAqLworCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNU0RVX0ZSQU1FKSB7CisJCS8qaHdIZWFkZXJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4tTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCwgNCkrTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsgKi8KKwkJaHdIZWFkZXJMZW4gPQorCQkgICAgcFR4QmxrLT5NcGR1SGVhZGVyTGVuIC0gTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArCisJCSAgICBwVHhCbGstPkhkclBhZExlbiArIExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7CisJfSBlbHNlIHsKKwkJLypod0hlYWRlckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbiwgNCk7ICovCisJCWh3SGVhZGVyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5IZHJQYWRMZW47CisJfQorCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQSwgcFR4QmxrLT5IZWFkZXJCdWYsCisJCSAgICAgICBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGVhZGVyTGVuKTsKKworCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0ID0gcFR4QmxrLT5wUGFja2V0OworCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisKKwkvKiAqLworCS8qIGJ1aWxkIFR4IERlc2NyaXB0b3IgKi8KKwkvKiAqLworCisJcFR4RCA9IChzdHJ1Y3QgcnRfdHhkICopIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisJTmRpc1plcm9NZW1vcnkocFR4RCwgVFhEX1NJWkUpOworCisJcFR4RC0+U0RQdHIwID0gQnVmQmFzZVBhTG93OworCXBUeEQtPlNETGVuMCA9IFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZWFkZXJMZW47CS8qIGluY2x1ZGUgcGFkZGluZyAqLworCXBUeEQtPlNEUHRyMSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFR4QmxrLCAwLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlwVHhELT5TRExlbjEgPSBwVHhCbGstPlNyY0J1ZkxlbjsKKwlwVHhELT5MYXN0U2VjMCA9IDA7CisJcFR4RC0+TGFzdFNlYzEgPSAoYklzTGFzdCkgPyAxIDogMDsKKworCVJUTVBXcml0ZVR4RGVzY3JpcHRvcihwQWQsIHBUeEQsIEZBTFNFLCBGSUZPX0VEQ0EpOworCisJUmV0VHhJZHggPSBUeElkeDsKKwkvKiAqLworCS8qIFVwZGF0ZSBUeCBpbmRleCAqLworCS8qICovCisJSU5DX1JJTkdfSU5ERVgoVHhJZHgsIFRYX1JJTkdfU0laRSk7CisJcFR4UmluZy0+VHhDcHVJZHggPSBUeElkeDsKKworCSpGcmVlTnVtYmVyIC09IDE7CisKKwlyZXR1cm4gUmV0VHhJZHg7Cit9CisKK3UxNiBSdG1wUENJX1dyaXRlU2luZ2xlVHhSZXNvdXJjZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssCisJCQkJICAgICBJTiBCT09MRUFOIGJJc0xhc3QsCisJCQkJICAgICB1MTYgKiBGcmVlTnVtYmVyKQoreworCisJdTggKnBETUFIZWFkZXJCdWZWQTsKKwl1MTYgVHhJZHgsIFJldFR4SWR4OworCXN0cnVjdCBydF90eGQgKiBwVHhEOworCXUzMiBCdWZCYXNlUGFMb3c7CisJc3RydWN0IHJ0X3J0bXBfdHhfcmluZyAqcFR4UmluZzsKKwl1MTYgaHdIZWFkZXJMZW47CisKKwkvKiAqLworCS8qIGdldCBUeCBSaW5nIFJlc291cmNlICovCisJLyogKi8KKwlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XTsKKwlUeElkeCA9IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5UeENwdUlkeDsKKwlwRE1BSGVhZGVyQnVmVkEgPSAodTggKilwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NWYTsKKwlCdWZCYXNlUGFMb3cgPQorCSAgICBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NQYSk7CisKKwkvKiBjb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyICovCisJLypod0hlYWRlckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbiwgNCk7ICovCisJaHdIZWFkZXJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKKworCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQSwgcFR4QmxrLT5IZWFkZXJCdWYsCisJCSAgICAgICBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGVhZGVyTGVuKTsKKworCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0ID0gcFR4QmxrLT5wUGFja2V0OworCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisKKwkvKiAqLworCS8qIGJ1aWxkIFR4IERlc2NyaXB0b3IgKi8KKwkvKiAqLworCXBUeEQgPSAoc3RydWN0IHJ0X3R4ZCAqKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOworCU5kaXNaZXJvTWVtb3J5KHBUeEQsIFRYRF9TSVpFKTsKKworCXBUeEQtPlNEUHRyMCA9IEJ1ZkJhc2VQYUxvdzsKKwlwVHhELT5TRExlbjAgPSBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGVhZGVyTGVuOwkvKiBpbmNsdWRlIHBhZGRpbmcgKi8KKwlwVHhELT5TRFB0cjEgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIHBUeEJsaywgMCwgMSwgUENJX0RNQV9UT0RFVklDRSk7OworCXBUeEQtPlNETGVuMSA9IHBUeEJsay0+U3JjQnVmTGVuOworCXBUeEQtPkxhc3RTZWMwID0gMDsKKwlwVHhELT5MYXN0U2VjMSA9IChiSXNMYXN0KSA/IDEgOiAwOworCisJUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgRkFMU0UsIEZJRk9fRURDQSk7CisKKwlSZXRUeElkeCA9IFR4SWR4OworCS8qICovCisJLyogVXBkYXRlIFR4IGluZGV4ICovCisJLyogKi8KKwlJTkNfUklOR19JTkRFWChUeElkeCwgVFhfUklOR19TSVpFKTsKKwlwVHhSaW5nLT5UeENwdUlkeCA9IFR4SWR4OworCisJKkZyZWVOdW1iZXIgLT0gMTsKKworCXJldHVybiBSZXRUeElkeDsKK30KKwordTE2IFJ0bXBQQ0lfV3JpdGVNdWx0aVR4UmVzb3VyY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssCisJCQkJICAgIHU4IGZyYW1lTnVtLCB1MTYgKiBGcmVlTnVtYmVyKQoreworCUJPT0xFQU4gYklzTGFzdDsKKwl1OCAqcERNQUhlYWRlckJ1ZlZBOworCXUxNiBUeElkeCwgUmV0VHhJZHg7CisJc3RydWN0IHJ0X3R4ZCAqIHBUeEQ7CisJdTMyIEJ1ZkJhc2VQYUxvdzsKKwlzdHJ1Y3QgcnRfcnRtcF90eF9yaW5nICpwVHhSaW5nOworCXUxNiBod0hkckxlbjsKKwl1MzIgZmlyc3RETUFMZW47CisKKwliSXNMYXN0ID0gKChmcmFtZU51bSA9PSAocFR4QmxrLT5Ub3RhbEZyYW1lTnVtIC0gMSkpID8gMSA6IDApOworCisJLyogKi8KKwkvKiBnZXQgVHggUmluZyBSZXNvdXJjZSAqLworCS8qICovCisJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF07CisJVHhJZHggPSBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uVHhDcHVJZHg7CisJcERNQUhlYWRlckJ1ZlZBID0gKHU4ICopcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7CisJQnVmQmFzZVBhTG93ID0KKwkgICAgUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOworCisJaWYgKGZyYW1lTnVtID09IDApIHsKKwkJLyogY29weSBUWElORk8gKyBUWFdJICsgV0xBTiBIZWFkZXIgKyBMTEMgaW50byBETUEgSGVhZGVyIEJ1ZmZlciAqLworCQlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkKKwkJCS8qaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4tTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCwgNCkrTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsgKi8KKwkJCWh3SGRyTGVuID0KKwkJCSAgICBwVHhCbGstPk1wZHVIZWFkZXJMZW4gLSBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEICsKKwkJCSAgICBwVHhCbGstPkhkclBhZExlbiArIExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7CisJCWVsc2UgaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfUkFMSU5LX0ZSQU1FKQorCQkJLypod0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbi1MRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQsIDQpK0xFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRDsgKi8KKwkJCWh3SGRyTGVuID0KKwkJCSAgICBwVHhCbGstPk1wZHVIZWFkZXJMZW4gLQorCQkJICAgIExFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRCArIHBUeEJsay0+SGRyUGFkTGVuICsKKwkJCSAgICBMRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQ7CisJCWVsc2UKKwkJCS8qaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4sIDQpOyAqLworCQkJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKKworCQlmaXJzdERNQUxlbiA9IFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW47CisJfSBlbHNlIHsKKwkJZmlyc3RETUFMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CisJfQorCisJTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBLCBwVHhCbGstPkhlYWRlckJ1ZiwgZmlyc3RETUFMZW4pOworCisJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQgPSBwVHhCbGstPnBQYWNrZXQ7CisJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKworCS8qICovCisJLyogYnVpbGQgVHggRGVzY3JpcHRvciAqLworCS8qICovCisJcFR4RCA9IChzdHJ1Y3QgcnRfdHhkICopIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisJTmRpc1plcm9NZW1vcnkocFR4RCwgVFhEX1NJWkUpOworCisJcFR4RC0+U0RQdHIwID0gQnVmQmFzZVBhTG93OworCXBUeEQtPlNETGVuMCA9IGZpcnN0RE1BTGVuOwkvKiBpbmNsdWRlIHBhZGRpbmcgKi8KKwlwVHhELT5TRFB0cjEgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIHBUeEJsaywgMCwgMSwgUENJX0RNQV9UT0RFVklDRSk7OworCXBUeEQtPlNETGVuMSA9IHBUeEJsay0+U3JjQnVmTGVuOworCXBUeEQtPkxhc3RTZWMwID0gMDsKKwlwVHhELT5MYXN0U2VjMSA9IChiSXNMYXN0KSA/IDEgOiAwOworCisJUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgRkFMU0UsIEZJRk9fRURDQSk7CisKKwlSZXRUeElkeCA9IFR4SWR4OworCS8qICovCisJLyogVXBkYXRlIFR4IGluZGV4ICovCisJLyogKi8KKwlJTkNfUklOR19JTkRFWChUeElkeCwgVFhfUklOR19TSVpFKTsKKwlwVHhSaW5nLT5UeENwdUlkeCA9IFR4SWR4OworCisJKkZyZWVOdW1iZXIgLT0gMTsKKworCXJldHVybiBSZXRUeElkeDsKKworfQorCit2b2lkIFJ0bXBQQ0lfRmluYWxXcml0ZVR4UmVzb3VyY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrLAorCQkJCSAgdTE2IHRvdGFsTVBEVVNpemUsIHUxNiBGaXJzdFR4SWR4KQoreworCisJc3RydWN0IHJ0X3R4d2kgKiBwVHhXSTsKKwlzdHJ1Y3QgcnRfcnRtcF90eF9yaW5nICpwVHhSaW5nOworCisJLyogKi8KKwkvKiBnZXQgVHggUmluZyBSZXNvdXJjZSAqLworCS8qICovCisJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF07CisJcFR4V0kgPSAoc3RydWN0IHJ0X3R4d2kgKikgcFR4UmluZy0+Q2VsbFtGaXJzdFR4SWR4XS5EbWFCdWYuQWxsb2NWYTsKKwlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gdG90YWxNUERVU2l6ZTsKKworfQorCit2b2lkIFJ0bXBQQ0lEYXRhTGFzdFR4SWR4KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgdTggUXVlSWR4LCB1MTYgTGFzdFR4SWR4KQoreworCXN0cnVjdCBydF90eGQgKiBwVHhEOworCXN0cnVjdCBydF9ydG1wX3R4X3JpbmcgKnBUeFJpbmc7CisKKwkvKiAqLworCS8qIGdldCBUeCBSaW5nIFJlc291cmNlICovCisJLyogKi8KKwlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1F1ZUlkeF07CisKKwkvKiAqLworCS8qIGJ1aWxkIFR4IERlc2NyaXB0b3IgKi8KKwkvKiAqLworCXBUeEQgPSAoc3RydWN0IHJ0X3R4ZCAqKSBwVHhSaW5nLT5DZWxsW0xhc3RUeElkeF0uQWxsb2NWYTsKKworCXBUeEQtPkxhc3RTZWMxID0gMTsKKworfQorCit1MTYgUnRtcFBDSV9Xcml0ZUZyYWdUeFJlc291cmNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssCisJCQkJICAgdTggZnJhZ051bSwgdTE2ICogRnJlZU51bWJlcikKK3sKKwl1OCAqcERNQUhlYWRlckJ1ZlZBOworCXUxNiBUeElkeCwgUmV0VHhJZHg7CisJc3RydWN0IHJ0X3R4ZCAqIHBUeEQ7CisJdTMyIEJ1ZkJhc2VQYUxvdzsKKwlzdHJ1Y3QgcnRfcnRtcF90eF9yaW5nICpwVHhSaW5nOworCXUxNiBod0hlYWRlckxlbjsKKwl1MzIgZmlyc3RETUFMZW47CisKKwkvKiAqLworCS8qIEdldCBUeCBSaW5nIFJlc291cmNlICovCisJLyogKi8KKwlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XTsKKwlUeElkeCA9IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5UeENwdUlkeDsKKwlwRE1BSGVhZGVyQnVmVkEgPSAodTggKilwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NWYTsKKwlCdWZCYXNlUGFMb3cgPQorCSAgICBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NQYSk7CisKKwkvKiAqLworCS8qIENvcHkgVFhJTkZPICsgVFhXSSArIFdMQU4gSGVhZGVyICsgTExDIGludG8gRE1BIEhlYWRlciBCdWZmZXIgKi8KKwkvKiAqLworCS8qaHdIZWFkZXJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4sIDQpOyAqLworCWh3SGVhZGVyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5IZHJQYWRMZW47CisKKwlmaXJzdERNQUxlbiA9IFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZWFkZXJMZW47CisJTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBLCBwVHhCbGstPkhlYWRlckJ1ZiwgZmlyc3RETUFMZW4pOworCisJLyogKi8KKwkvKiBCdWlsZCBUeCBEZXNjcmlwdG9yICovCisJLyogKi8KKwlwVHhEID0gKHN0cnVjdCBydF90eGQgKikgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKwlOZGlzWmVyb01lbW9yeShwVHhELCBUWERfU0laRSk7CisKKwlpZiAoZnJhZ051bSA9PSBwVHhCbGstPlRvdGFsRnJhZ051bSkgeworCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldCA9IHBUeEJsay0+cFBhY2tldDsKKwkJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKwl9CisKKwlwVHhELT5TRFB0cjAgPSBCdWZCYXNlUGFMb3c7CisJcFR4RC0+U0RMZW4wID0gZmlyc3RETUFMZW47CS8qIGluY2x1ZGUgcGFkZGluZyAqLworCXBUeEQtPlNEUHRyMSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFR4QmxrLCAwLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlwVHhELT5TRExlbjEgPSBwVHhCbGstPlNyY0J1ZkxlbjsKKwlwVHhELT5MYXN0U2VjMCA9IDA7CisJcFR4RC0+TGFzdFNlYzEgPSAxOworCisJUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgRkFMU0UsIEZJRk9fRURDQSk7CisKKwlSZXRUeElkeCA9IFR4SWR4OworCXBUeEJsay0+UHJpdiArPSBwVHhCbGstPlNyY0J1ZkxlbjsKKworCS8qICovCisJLyogVXBkYXRlIFR4IGluZGV4ICovCisJLyogKi8KKwlJTkNfUklOR19JTkRFWChUeElkeCwgVFhfUklOR19TSVpFKTsKKwlwVHhSaW5nLT5UeENwdUlkeCA9IFR4SWR4OworCisJKkZyZWVOdW1iZXIgLT0gMTsKKworCXJldHVybiBSZXRUeElkeDsKKworfQorCisvKgorCU11c3QgYmUgcnVuIGluIEludGVycnVwdCBjb250ZXh0CisJVGhpcyBmdW5jdGlvbiBoYW5kbGUgUENJIHNwZWNpZmljIFR4RGVzYyBhbmQgY3B1IGluZGV4IHVwZGF0ZSBhbmQga2ljayB0aGUgcGFja2V0IG91dC4KKyAqLworaW50IFJ0bXBQQ0lNZ210S2lja091dChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICB1OCBRdWVJZHgsCisJCSAgICAgICB2b2lkICpwUGFja2V0LAorCQkgICAgICAgdTggKnBTcmNCdWZWQSwgdTMyIFNyY0J1ZkxlbikKK3sKKwlzdHJ1Y3QgcnRfdHhkICogcFR4RDsKKwl1bnNpZ25lZCBsb25nIFN3SWR4ID0gcEFkLT5NZ210UmluZy5UeENwdUlkeDsKKworCXBUeEQgPSAoc3RydWN0IHJ0X3R4ZCAqKSBwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLkFsbG9jVmE7CisKKwlwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLnBOZGlzUGFja2V0ID0gcFBhY2tldDsKKwlwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisKKwlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBUUlVFLCBGSUZPX01HTVQpOworCXBUeEQtPkxhc3RTZWMwID0gMTsKKwlwVHhELT5MYXN0U2VjMSA9IDE7CisJcFR4RC0+RE1BRE9ORSA9IDA7CisJcFR4RC0+U0RMZW4xID0gMDsKKwlwVHhELT5TRFB0cjAgPQorCSAgICBQQ0lfTUFQX1NJTkdMRShwQWQsIHBTcmNCdWZWQSwgU3JjQnVmTGVuLCAwLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlwVHhELT5TRExlbjAgPSBTcmNCdWZMZW47CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKglEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiTUxNRUhhcmRUcmFuc21pdFxuIikpOworCWZvciAoaSA9IDA7IGkgPCAoVFhXSV9TSVpFKzI0KTsgaSsrKQorCXsKKworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiJXg6IiwgKihwU3JjQnVmVkEraSkpKTsKKwkJaWYgKCBpJTQgPT0gMykKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIgOjogIikpOworCQlpZiAoIGklMTYgPT0gMTUpCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiXG4gICAgICAiKSk7CisJfQorCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJcbiAgICAgICIpKTsqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKKworCS8qIEluY3JlYXNlIFRYX0NUWF9JRFgsIGJ1dCB3cml0ZSB0byByZWdpc3RlciBsYXRlci4gKi8KKwlJTkNfUklOR19JTkRFWChwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4LCBNR01UX1JJTkdfU0laRSk7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NR01UQ1RYX0lEWCwgcEFkLT5NZ210UmluZy5UeENwdUlkeCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNoZWNrIFJ4IGRlc2NyaXB0b3IsIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFIGlmIGFueSBlcnJvciBkb3VuZAorCisJQXJndW1lbnRzOgorCQlwUnhECQlQb2ludGVyIHRvIHRoZSBSeCBkZXNjcmlwdG9yCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MJTm8gZXJyCisJCU5ESVNfU1RBVFVTX0ZBSUxVUkUJRXJyb3IKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgUlRNUENoZWNrUnhFcnJvcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhlYWRlciwKKwkJCSAgICAgc3RydWN0IHJ0X3J4d2kgKiBwUnhXSSwgSU4gUFJUMjhYWF9SWERfU1RSVUMgcFJ4RCkKK3sKKwlzdHJ1Y3QgcnRfY2lwaGVyX2tleSAqcFdwYUtleTsKKwlpbnQgZEJtOworCisJLyogUGh5IGVycm9ycyAmIENSQyBlcnJvcnMgKi8KKwlpZiAoIC8qKHBSeEQtPlBoeUVycikgfHwgKi8gKHBSeEQtPkNyYykpIHsKKwkJLyogQ2hlY2sgUlNTSSBmb3IgTm9pc2UgSGlzdCBzdGF0aXN0aWMgY29sbGVjdGlvbi4gKi8KKwkJZEJtID0gKGludCkocFJ4V0ktPlJTU0kwKSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7CisJCWlmIChkQm0gPD0gLTg3KQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVswXSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTgyKQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVsxXSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTc3KQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVsyXSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTcyKQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVszXSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTY3KQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs0XSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTYyKQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs1XSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTU3KQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs2XSArPSAxOworCQllbHNlIGlmIChkQm0gPiAtNTcpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzddICs9IDE7CisKKwkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9CisJLyogQWRkIFJ4IHNpemUgdG8gY2hhbm5lbCBsb2FkIGNvdW50ZXIsIHdlIHNob3VsZCBpZ25vcmUgZXJyb3IgY291bnRzICovCisJcEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgKz0gKHBSeEQtPlNETDAgKyAxNCk7CisKKwkvKiBEcm9wIFRvRHMgcHJvbWlzY291cyBmcmFtZSwgaXQgaXMgb3BlbmVkIGR1ZSB0byBDQ1ggMiBjaGFubmVsIGxvYWQgc3RhdGlzdGljcyAqLworCWlmIChwSGVhZGVyICE9IE5VTEwpIHsKKwkJaWYgKHBIZWFkZXItPkZDLlRvRHMpIHsKKwkJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCX0KKwl9CisJLyogRHJvcCBub3QgVTJNIGZyYW1lcywgY2FudCdzIGRyb3AgaGVyZSBiZWNhdXNlIHdlIHdpbGwgZHJvcCBiZWFjb24gaW4gdGhpcyBjYXNlICovCisJLyogSSBhbSBraW5kIG9mIGRvdWJ0aW5nIHRoZSBVMk0gYml0IG9wZXJhdGlvbiAqLworCS8qIGlmIChwUnhELT5VMk0gPT0gMCkgKi8KKwkvKiAgICAgIHJldHVybihORElTX1NUQVRVU19GQUlMVVJFKTsgKi8KKworCS8qIGRyb3AgZGVjeXB0aW9uIGZhaWwgZnJhbWUgKi8KKwlpZiAocFJ4RC0+Q2lwaGVyRXJyKSB7CisJCWlmIChwUnhELT5DaXBoZXJFcnIgPT0gMikgeworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAgICAgKCJwUnhEIEVSUk9SOiBJQ1Ygb2sgYnV0IE1JQ0VyciAiKSk7CisJCX0gZWxzZSBpZiAocFJ4RC0+Q2lwaGVyRXJyID09IDEpIHsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJwUnhEIEVSUk9SOiBJQ1YgRXJyICIpKTsKKwkJfSBlbHNlIGlmIChwUnhELT5DaXBoZXJFcnIgPT0gMykKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkgICAgICgicFJ4RCBFUlJPUjogS2V5IG5vdCB2YWxpZCAiKSk7CisKKwkJaWYgKCgocFJ4RC0+Q2lwaGVyRXJyICYgMSkgPT0gMSkKKwkJICAgICYmIHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50ICYmIElORlJBX09OKHBBZCkpCisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19JQ1ZfRVJST1JfRVZFTlRfRkxBRywKKwkJCQkJICAgICAgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS4KKwkJCQkJICAgICAgQWRkciwgQlNTMCwgMCk7CisKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJICAgICAoIiAlZCAobGVuPSVkLCBNY2FzdD0lZCwgTXlCc3M9JWQsIFdjaWQ9JWQsIEtleUlkPSVkKVxuIiwKKwkJCSAgICAgIHBSeEQtPkNpcGhlckVyciwgcFJ4RC0+U0RMMCwKKwkJCSAgICAgIHBSeEQtPk1jYXN0IHwgcFJ4RC0+QmNhc3QsIHBSeEQtPk15QnNzLAorCQkJICAgICAgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsCisvKiAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJOYW1lW3BSeEQtPkNpcGhlckFsZ10sICovCisJCQkgICAgICBwUnhXSS0+S2V5SW5kZXgpKTsKKworCQkvKiAqLworCQkvKiBNSUMgRXJyb3IgKi8KKwkJLyogKi8KKwkJaWYgKHBSeEQtPkNpcGhlckVyciA9PSAyKSB7CisJCQlwV3BhS2V5ID0gJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BSeFdJLT5LZXlJbmRleF07CisJCQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKQorCQkJCVdwYVNlbmRNaWNGYWlsdXJlVG9XcGFTdXBwbGljYW50KHBBZCwKKwkJCQkJCQkJIChwV3BhS2V5LT4KKwkJCQkJCQkJICBUeXBlID09CisJCQkJCQkJCSAgUEFJUldJU0VLRVkpID8KKwkJCQkJCQkJIFRSVUUgOiBGQUxTRSk7CisJCQllbHNlCisJCQkJUlRNUFJlcG9ydE1pY0Vycm9yKHBBZCwgcFdwYUtleSk7CisKKwkJCWlmICgoKHBSeEQtPkNpcGhlckVyciAmIDIpID09IDIpCisJCQkgICAgJiYgcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQgJiYgSU5GUkFfT04ocEFkKSkKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLAorCQkJCQkJICAgICAgSVdfTUlDX0VSUk9SX0VWRU5UX0ZMQUcsCisJCQkJCQkgICAgICBwQWQtPk1hY1RhYi4KKwkJCQkJCSAgICAgIENvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwKKwkJCQkJCSAgICAgIEJTUzAsIDApOworCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUnggTUlDIFZhbHVlIGVycm9yXG4iKSk7CisJCX0KKworCQlpZiAocEhlYWRlciA9PSBOVUxMKQorCQkJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJLyppZiAoKHBSeEQtPkNpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSAmJgorCQkgICAocEhlYWRlci0+U2VxdWVuY2UgPT0gcEFkLT5GcmFnRnJhbWUuU2VxdWVuY2UpKQorCQkgICB7CisJCSAgIC8vCisJCSAgIC8vIEFjY2VwdGFibGUgc2luY2UgdGhlIEZpcnN0IEZyYWdGcmFtZSBubyBDaXBoZXJFcnIgcHJvYmxlbS4KKwkJICAgLy8KKwkJICAgcmV0dXJuKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkgICB9ICovCisKKwkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9CisKKwlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworfQorCitCT09MRUFOIFJUTVBGcmVlVFhEVXBvblR4RG1hRG9uZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IFF1ZUlkeCkKK3sKKwlzdHJ1Y3QgcnRfcnRtcF90eF9yaW5nICpwVHhSaW5nOworCXN0cnVjdCBydF90eGQgKiBwVHhEOworCXZvaWQgKnBQYWNrZXQ7CisJdTggRlJFRSA9IDA7CisJc3RydWN0IHJ0X3R4ZCBUeEQsICpwT3JpVHhEOworCS8qdW5zaWduZWQgbG9uZyAgICAgICAgIElycUZsYWdzOyAqLworCUJPT0xFQU4gYlJlc2NoZWR1bGUgPSBGQUxTRTsKKworCUFTU0VSVChRdWVJZHggPCBOVU1fT0ZfVFhfUklORyk7CisJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tRdWVJZHhdOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMCArIFF1ZUlkeCAqIFJJTkdSRUdfRElGRiwKKwkJICAgICAgICZwVHhSaW5nLT5UeERtYUlkeCk7CisJd2hpbGUgKHBUeFJpbmctPlR4U3dGcmVlSWR4ICE9IHBUeFJpbmctPlR4RG1hSWR4KSB7CisvKiAgICAgICAgICAgICAgUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOyAqLworCisJCS8qIHN0YXRpYyByYXRlIGFsc28gbmVlZCBOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMoKSBmdW5jdGlvbi4gKi8KKwkJLyppZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSkgKi8KKwkJTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKHBBZCk7CisKKwkJLyogTm90ZSA6IElmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpLCB3ZSB3aWxsIG5ldmVyIHJlYWNoIGhlcmUuICovCisJCUZSRUUrKzsKKwkJcFR4RCA9CisJCSAgICAoc3RydWN0IHJ0X3R4ZCAqKSAocFR4UmluZy0+Q2VsbFtwVHhSaW5nLT5UeFN3RnJlZUlkeF0uQWxsb2NWYSk7CisJCXBPcmlUeEQgPSBwVHhEOworCQlOZGlzTW92ZU1lbW9yeSgmVHhELCBwVHhELCBzaXplb2Yoc3RydWN0IHJ0X3R4ZCkpOworCQlwVHhEID0gJlR4RDsKKworCQlwVHhELT5ETUFET05FID0gMDsKKworCQl7CisJCQlwUGFja2V0ID0KKwkJCSAgICBwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmRpc1BhY2tldDsKKwkJCWlmIChwUGFja2V0KSB7CisJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwKKwkJCQkJCSBwVHhELT5TRExlbjEsCisJCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsCisJCQkJCQkgICAgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJCQl9CisJCQkvKkFsd2F5cyBhc3NpZ24gcE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhciAqLworCQkJcFR4UmluZy0+Q2VsbFtwVHhSaW5nLT5UeFN3RnJlZUlkeF0ucE5kaXNQYWNrZXQgPSBOVUxMOworCisJCQlwUGFja2V0ID0KKwkJCSAgICBwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmV4dE5kaXNQYWNrZXQ7CisKKwkJCUFTU0VSVChwUGFja2V0ID09IE5VTEwpOworCQkJaWYgKHBQYWNrZXQpIHsKKwkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLAorCQkJCQkJIHBUeEQtPlNETGVuMSwKKwkJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwKKwkJCQkJCSAgICBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCX0KKwkJCS8qQWx3YXlzIGFzc2lnbiBwTmV4dE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhciAqLworCQkJcFR4UmluZy0+Q2VsbFtwVHhSaW5nLT5UeFN3RnJlZUlkeF0ucE5leHROZGlzUGFja2V0ID0KKwkJCSAgICBOVUxMOworCQl9CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudCArPQorCQkgICAgKHBUeEQtPlNETGVuMSArIHBUeEQtPlNETGVuMCk7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRG1hRG9uZUNvdW50W1F1ZUlkeF0rKzsKKwkJSU5DX1JJTkdfSU5ERVgocFR4UmluZy0+VHhTd0ZyZWVJZHgsIFRYX1JJTkdfU0laRSk7CisJCS8qIGdldCB0eF90ZHhfaWR4IGFnYWluICovCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDAgKyBRdWVJZHggKiBSSU5HUkVHX0RJRkYsCisJCQkgICAgICAgJnBUeFJpbmctPlR4RG1hSWR4KTsKKwkJTmRpc01vdmVNZW1vcnkocE9yaVR4RCwgcFR4RCwgc2l6ZW9mKHN0cnVjdCBydF90eGQpKTsKKworLyogICAgICAgICBSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsgKi8KKwl9CisKKwlyZXR1cm4gYlJlc2NoZWR1bGU7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVByb2Nlc3MgVFggUmluZ3MgRE1BIERvbmUgaW50ZXJydXB0LCBydW5uaW5nIGluIERQQyBsZXZlbAorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCSBJTlRfU09VUkNFX0NTUl9TVFJVQyBUeFJpbmdCaXRtYXApCit7CisvKiAgICAgIHU4ICAgICAgICAgICAgICAgICAgIENvdW50ID0gMDsgKi8KKwl1bnNpZ25lZCBsb25nIElycUZsYWdzOworCUJPT0xFQU4gYlJlc2NoZWR1bGUgPSBGQUxTRTsKKworCS8qIE1ha2Ugc3VyZSBUeCByaW5nIHJlc291cmNlIHdvbid0IGJlIHVzZWQgYnkgb3RoZXIgdGhyZWFkcyAqLworCS8qTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5UeFJpbmdMb2NrKTsgKi8KKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKworCWlmIChUeFJpbmdCaXRtYXAuZmllbGQuQWMwRG1hRG9uZSkKKwkJYlJlc2NoZWR1bGUgPSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfQkUpOworCisJaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzNEbWFEb25lKQorCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfVk8pOworCisJaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzJEbWFEb25lKQorCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfVkkpOworCisJaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzFEbWFEb25lKQorCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfQkspOworCisJLyogTWFrZSBzdXJlIHRvIHJlbGVhc2UgVHggcmluZyByZXNvdXJjZSAqLworCS8qTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5UeFJpbmdMb2NrKTsgKi8KKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKworCS8qIERlcXVldWUgb3V0Z29pbmcgZnJhbWVzIGZyb20gVHhTd1F1ZXVlW10gYW5kIHByb2Nlc3MgaXQgKi8KKwlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOworCisJcmV0dXJuIGJSZXNjaGVkdWxlOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJvY2VzcyBNR01UIHJpbmcgRE1BIGRvbmUgaW50ZXJydXB0LCBydW5uaW5nIGluIERQQyBsZXZlbAorCisJQXJndW1lbnRzOgorCQlwQWQJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUTVBIYW5kbGVNZ210UmluZ0RtYURvbmVJbnRlcnJ1cHQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXN0cnVjdCBydF90eGQgKiBwVHhEOworCXZvaWQgKnBQYWNrZXQ7CisvKiAgICAgIGludCAgICAgICAgICAgICAgaTsgKi8KKwl1OCBGUkVFID0gMDsKKwlzdHJ1Y3QgcnRfcnRtcF9tZ210X3JpbmcgKnBNZ210UmluZyA9ICZwQWQtPk1nbXRSaW5nOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9NR01URFRYX0lEWCwgJnBNZ210UmluZy0+VHhEbWFJZHgpOworCXdoaWxlIChwTWdtdFJpbmctPlR4U3dGcmVlSWR4ICE9IHBNZ210UmluZy0+VHhEbWFJZHgpIHsKKwkJRlJFRSsrOworCQlwVHhEID0KKwkJICAgIChzdHJ1Y3QgcnRfdHhkICopIChwTWdtdFJpbmctPkNlbGxbcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeF0uCisJCQkJICBBbGxvY1ZhKTsKKwkJcFR4RC0+RE1BRE9ORSA9IDA7CisJCXBQYWNrZXQgPSBwTWdtdFJpbmctPkNlbGxbcE1nbXRSaW5nLT5UeFN3RnJlZUlkeF0ucE5kaXNQYWNrZXQ7CisKKwkJaWYgKHBQYWNrZXQpIHsKKwkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwKKwkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQl9CisJCXBNZ210UmluZy0+Q2VsbFtwTWdtdFJpbmctPlR4U3dGcmVlSWR4XS5wTmRpc1BhY2tldCA9IE5VTEw7CisKKwkJcFBhY2tldCA9CisJCSAgICBwTWdtdFJpbmctPkNlbGxbcE1nbXRSaW5nLT5UeFN3RnJlZUlkeF0ucE5leHROZGlzUGFja2V0OworCQlpZiAocFBhY2tldCkgeworCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgcFR4RC0+U0RMZW4xLAorCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJCX0KKwkJcE1nbXRSaW5nLT5DZWxsW3BNZ210UmluZy0+VHhTd0ZyZWVJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisJCUlOQ19SSU5HX0lOREVYKHBNZ210UmluZy0+VHhTd0ZyZWVJZHgsIE1HTVRfUklOR19TSVpFKTsKKworCX0KKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1nbXRSaW5nTG9jayk7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyLiBEZXF1ZXVlIGFsbCBwb3dlciBzYWZlIGRlbGF5ZWQgYnJhb2RjYXN0IGZyYW1lcyBhZnRlciBiZWFjb24uCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlRNUEhhbmRsZVRCVFRJbnRlcnJ1cHQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXsKKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpIHsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJQXJndW1lbnRzOgorCQlwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIuIFJld3JpdGUgYmVhY29uIGNvbnRlbnQgYmVmb3JlIG5leHQgc2VuZC1vdXQuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXsKKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlJUTVBIYW5kbGVQcmVUQlRUSW50ZXJydXB0Li4uXG4iKSk7CisJCX0KKwl9CisKK30KKwordm9pZCBSVE1QSGFuZGxlUnhDb2hlcmVudEludGVycnVwdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJV1BETUFfR0xPX0NGR19TVFJVQyBHbG9DZmc7CisKKwlpZiAocEFkID09IE5VTEwpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gcEFkIGlzIE5VTEwsIHJldHVybi5cbiIpKTsKKwkJcmV0dXJuOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBSVE1QSGFuZGxlUnhDb2hlcmVudEludGVycnVwdCBcbiIpKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKKworCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPSAwOworCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IDA7CisJR2xvQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7CisKKwlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkUpOworCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CSyk7CisJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZJKTsKKwlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVk8pOworCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9NR01UKTsKKwlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfUlgpOworCisJUlRNUEVuYWJsZVJ4VHgocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBSVE1QSGFuZGxlUnhDb2hlcmVudEludGVycnVwdCBcbiIpKTsKK30KKwordm9pZCAqR2V0UGFja2V0RnJvbVJ4UmluZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIE9VVCBQUlQyOFhYX1JYRF9TVFJVQyBwU2F2ZVJ4RCwKKwkJCQkgT1VUIEJPT0xFQU4gKiBwYlJlc2NoZWR1bGUsCisJCQkJIElOIHUzMiAqIHBSeFBlbmRpbmcpCit7CisJc3RydWN0IHJ0X3J4ZCAqIHBSeEQ7CisJdm9pZCAqcFJ4UGFja2V0ID0gTlVMTDsKKwl2b2lkICpwTmV3UGFja2V0OworCXZvaWQgKkFsbG9jVmE7CisJZG1hX2FkZHJfdCBBbGxvY1BhOworCUJPT0xFQU4gYlJlc2NoZWR1bGUgPSBGQUxTRTsKKwlzdHJ1Y3QgcnRfcnRtcF9kbWFjYiAqcFJ4Q2VsbDsKKworCVJUTVBfU0VNX0xPQ0soJnBBZC0+UnhSaW5nTG9jayk7CisKKwlpZiAoKnBSeFBlbmRpbmcgPT0gMCkgeworCQkvKiBHZXQgaG93IG1heSBwYWNrZXRzIGhhZCBiZWVuIHJlY2VpdmVkICovCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfRFJYX0lEWCwgJnBBZC0+UnhSaW5nLlJ4RG1hSWR4KTsKKworCQlpZiAocEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPT0gcEFkLT5SeFJpbmcuUnhEbWFJZHgpIHsKKwkJCS8qIG5vIG1vcmUgcnggcGFja2V0cyAqLworCQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQkvKiBnZXQgcnggcGVuZGluZyBjb3VudCAqLworCQlpZiAocEFkLT5SeFJpbmcuUnhEbWFJZHggPiBwQWQtPlJ4UmluZy5SeFN3UmVhZElkeCkKKwkJCSpwUnhQZW5kaW5nID0KKwkJCSAgICBwQWQtPlJ4UmluZy5SeERtYUlkeCAtIHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4OworCQllbHNlCisJCQkqcFJ4UGVuZGluZyA9CisJCQkgICAgcEFkLT5SeFJpbmcuUnhEbWFJZHggKyBSWF9SSU5HX1NJWkUgLQorCQkJICAgIHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4OworCisJfQorCisJcFJ4Q2VsbCA9ICZwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XTsKKworCS8qIFBvaW50IHRvIFJ4IGluZGV4ZWQgcnggcmluZyBkZXNjcmlwdG9yICovCisJcFJ4RCA9IChzdHJ1Y3QgcnRfcnhkICopIHBSeENlbGwtPkFsbG9jVmE7CisKKwlpZiAocFJ4RC0+RERPTkUgPT0gMCkgeworCQkqcFJ4UGVuZGluZyA9IDA7CisJCS8qIERNQUluZHggaGFkIGRvbmUgYnV0IERET05FIGJpdCBub3QgcmVhZHkgKi8KKwkJYlJlc2NoZWR1bGUgPSBUUlVFOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogcmV0dXJuIHJ4IGRlc2NyaXB0b3IgKi8KKwlOZGlzTW92ZU1lbW9yeShwU2F2ZVJ4RCwgcFJ4RCwgUlhEX1NJWkUpOworCisJcE5ld1BhY2tldCA9CisJICAgIFJUTVBfQWxsb2NhdGVSeFBhY2tldEJ1ZmZlcihwQWQsIFJYX0JVRkZFUl9BR0dSRVNJWkUsIEZBTFNFLAorCQkJCQkmQWxsb2NWYSwgJkFsbG9jUGEpOworCisJaWYgKHBOZXdQYWNrZXQpIHsKKwkJLyogdW5tYXAgdGhlIHJ4IGJ1ZmZlciAqLworCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFJ4Q2VsbC0+RG1hQnVmLkFsbG9jUGEsCisJCQkJIHBSeENlbGwtPkRtYUJ1Zi5BbGxvY1NpemUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCXBSeFBhY2tldCA9IHBSeENlbGwtPnBOZGlzUGFja2V0OworCisJCXBSeENlbGwtPkRtYUJ1Zi5BbGxvY1NpemUgPSBSWF9CVUZGRVJfQUdHUkVTSVpFOworCQlwUnhDZWxsLT5wTmRpc1BhY2tldCA9ICh2b2lkICopcE5ld1BhY2tldDsKKwkJcFJ4Q2VsbC0+RG1hQnVmLkFsbG9jVmEgPSBBbGxvY1ZhOworCQlwUnhDZWxsLT5EbWFCdWYuQWxsb2NQYSA9IEFsbG9jUGE7CisJCS8qIHVwZGF0ZSBTRFAwIHRvIG5ldyBidWZmZXIgb2YgcnggcGFja2V0ICovCisJCXBSeEQtPlNEUDAgPSBBbGxvY1BhOworCX0gZWxzZSB7CisJCS8qREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJObyBSeCBCdWZmZXJcbiIpKTsgKi8KKwkJcFJ4UGFja2V0ID0gTlVMTDsKKwkJYlJlc2NoZWR1bGUgPSBUUlVFOworCX0KKworCXBSeEQtPkRET05FID0gMDsKKworCS8qIGhhZCBoYW5kbGVkIG9uZSByeCBwYWNrZXQgKi8KKwkqcFJ4UGVuZGluZyA9ICpwUnhQZW5kaW5nIC0gMTsKKworCS8qIHVwZGF0ZSByeCBkZXNjcmlwdG9yIGFuZCBraWNrIHJ4ICovCisJSU5DX1JJTkdfSU5ERVgocEFkLT5SeFJpbmcuUnhTd1JlYWRJZHgsIFJYX1JJTkdfU0laRSk7CisKKwlwQWQtPlJ4UmluZy5SeENwdUlkeCA9CisJICAgIChwQWQtPlJ4UmluZy5SeFN3UmVhZElkeCA9PQorCSAgICAgMCkgPyAoUlhfUklOR19TSVpFIC0gMSkgOiAocEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggLSAxKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9DUlhfSURYLCBwQWQtPlJ4UmluZy5SeENwdUlkeCk7CisKK2RvbmU6CisJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPlJ4UmluZ0xvY2spOworCSpwYlJlc2NoZWR1bGUgPSBiUmVzY2hlZHVsZTsKKwlyZXR1cm4gcFJ4UGFja2V0OworfQorCitpbnQgTWxtZUhhcmRUcmFuc21pdFR4UmluZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgdTggUXVlSWR4LCB2b2lkICpwUGFja2V0KQoreworCXN0cnVjdCBydF9wYWNrZXRfaW5mbyBQYWNrZXRJbmZvOworCXU4ICpwU3JjQnVmVkE7CisJdTMyIFNyY0J1ZkxlbjsKKwlzdHJ1Y3QgcnRfdHhkICogcFR4RDsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBIZWFkZXJfODAyXzExOworCUJPT0xFQU4gYkFja1JlcXVpcmVkLCBiSW5zZXJ0VGltZXN0YW1wOworCXVuc2lnbmVkIGxvbmcgU3JjQnVmUEE7CisJLyp1OCAgICAgICAgICAgICAgICAgVHhCdWZJZHg7ICovCisJdTggTWxtZVJhdGU7CisJdW5zaWduZWQgbG9uZyBTd0lkeCA9IHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHg7CisJc3RydWN0IHJ0X3R4d2kgKiBwRmlyc3RUeFdJOworCS8qdW5zaWduZWQgbG9uZyBpOyAqLworCS8qSFRUUkFOU01JVF9TRVRUSU5HICAgIE1sbWVUcmFuc21pdDsgICAvL1JhdGUgZm9yIHRoaXMgTUdNVCBmcmFtZS4gKi8KKwl1bnNpZ25lZCBsb25nIEZyZWVOdW07CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcE1hY0VudHJ5ID0gTlVMTDsKKworCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFNyY0J1ZlZBLCAmU3JjQnVmTGVuKTsKKworCWlmIChwU3JjQnVmVkEgPT0gTlVMTCkgeworCQkvKiBUaGUgYnVmZmVyIHNob3VsZG4ndCBiZSBOVUxMICovCisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKwkvKiBNYWtlIHN1cmUgTUdNVCByaW5nIHJlc291cmNlIHdvbid0IGJlIHVzZWQgYnkgb3RoZXIgdGhyZWFkcyAqLworCS8qTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5UeFJpbmdMb2NrKTsgKi8KKworCUZyZWVOdW0gPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7CisKKwlpZiAoRnJlZU51bSA9PSAwKSB7CisJCS8qTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5UeFJpbmdMb2NrKTsgKi8KKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJU3dJZHggPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4OworCisJcFR4RCA9IChzdHJ1Y3QgcnRfdHhkICopIHBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0uQWxsb2NWYTsKKworCWlmIChwQWQtPlR4UmluZ1tRdWVJZHhdLkNlbGxbU3dJZHhdLnBOZGlzUGFja2V0KSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJNbG1lSGFyZFRyYW5zbWl0IEVycm9yXG4iKSk7CisJCS8qTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5UeFJpbmdMb2NrKTsgKi8KKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJeworCQkvKiBvdXRnb2luZyBmcmFtZSBhbHdheXMgd2FrZXVwIFBIWSB0byBwcmV2ZW50IGZyYW1lIGxvc3QgKi8KKwkJLyogaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkgKi8KKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKKwl9CisJcEZpcnN0VHhXSSA9IChzdHJ1Y3QgcnRfdHh3aSAqKSBwU3JjQnVmVkE7CisKKwlwSGVhZGVyXzgwMl8xMSA9IChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqKSAocFNyY0J1ZlZBICsgVFhXSV9TSVpFKTsKKwlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkgeworCQlNbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJhc2ljTWxtZVJhdGU7CisJfSBlbHNlIHsKKwkJTWxtZVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKKwl9CisKKwlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlID09IEJUWVBFX0RBVEEpICYmCisJICAgIChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1FPU19OVUxMKSkgeworCQlwTWFjRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBIZWFkZXJfODAyXzExLT5BZGRyMSk7CisJfQorCS8qIFZlcmlmeSBNbG1lIHJhdGUgZm9yIGEgLyBnIGJhbmRzLiAqLworCWlmICgocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID4gMTQpICYmIChNbG1lUmF0ZSA8IFJBVEVfNikpCS8qIDExQSBiYW5kICovCisJCU1sbWVSYXRlID0gUkFURV82OworCisJLyogKi8KKwkvKiBTaG91bGQgbm90IGJlIGhhcmQgY29kZSB0byBzZXQgUHdyTWdtdCB0byAwIChQV1JfQUNUSVZFKSAqLworCS8qIFNuaWNlIGl0J3MgYmVlbiBzZXQgdG8gMCB3aGlsZSBvbiBNZ3RNYWNIZWFkZXJJbml0ICovCisJLyogQnkgdGhlIHdheSB0aGlzIHdpbGwgY2F1c2UgZnJhbWUgdG8gYmUgc2VuZCBvbiBQV1JfU0FWRSBmYWlsZWQuICovCisJLyogKi8KKwkvKiAqLworCS8qIEluIFdNTS1VQVBTRCwgbWxtZSBmcmFtZSBzaG91bGQgYmUgc2V0IHBzbSBhcyBwb3dlciBzYXZpbmcgYnV0IHByb2JlIHJlcXVlc3QgZnJhbWUgKi8KKwkvKiBEYXRhLU51bGwgcGFja2V0cyBhbHNlIHBhc3MgdGhyb3VnaCBNTVJlcXVlc3QgaW4gUlQyODYwLCBob3dldmVyLCB3ZSBob3BlIGNvbnRyb2wgdGhlIHBzbSBiaXQgdG8gcGFzcyBBUFNEICovCisJaWYgKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlICE9IEJUWVBFX0RBVEEpIHsKKwkJaWYgKChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1BST0JFX1JFUSkKKwkJICAgIHx8ICEocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlCisJCQkgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQVBTRENhcGFibGUpKSB7CisJCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IFBXUl9BQ1RJVkU7CisJCX0gZWxzZSB7CisJCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9CisJCQkgICAgcEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZTsKKwkJfQorCX0KKworCWJJbnNlcnRUaW1lc3RhbXAgPSBGQUxTRTsKKwlpZiAocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPT0gQlRZUEVfQ05UTCkJLyogbXVzdCBiZSBQUy1QT0xMICovCisJeworCQliQWNrUmVxdWlyZWQgPSBGQUxTRTsKKwl9IGVsc2UJCQkvKiBCVFlQRV9NR01UIG9yIEJUWVBFX0RBVEEobXVzdCBiZSBOVUxMIGZyYW1lKSAqLworCXsKKwkJaWYgKHBIZWFkZXJfODAyXzExLT5BZGRyMVswXSAmIDB4MDEpCS8qIE1VTFRJQ0FTVCwgQlJPQURDQVNUICovCisJCXsKKwkJCWJBY2tSZXF1aXJlZCA9IEZBTFNFOworCQkJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gMDsKKwkJfSBlbHNlIHsKKwkJCWJBY2tSZXF1aXJlZCA9IFRSVUU7CisJCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPQorCQkJICAgIFJUTVBDYWxjRHVyYXRpb24ocEFkLCBNbG1lUmF0ZSwgMTQpOworCQkJaWYgKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUFJPQkVfUlNQKSB7CisJCQkJYkluc2VydFRpbWVzdGFtcCA9IFRSVUU7CisJCQl9CisJCX0KKwl9CisJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcEFkLT5TZXF1ZW5jZSsrOworCWlmIChwQWQtPlNlcXVlbmNlID4gMHhmZmYpCisJCXBBZC0+U2VxdWVuY2UgPSAwOworCS8qIEJlZm9yZSByYWRhciBkZXRlY3Rpb24gZG9uZSwgbWdtdCBmcmFtZSBjYW4gbm90IGJlIHNlbnQgYnV0IHByb2JlIHJlcSAqLworCS8qIEJlY2F1c2Ugd2UgbmVlZCB0byB1c2UgcHJvYmUgcmVxIHRvIHRyaWdnZXIgZHJpdmVyIHRvIHNlbmQgcHJvYmUgcmVxIGluIHBhc3NpdmUgc2NhbiAqLworCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgIT0gU1VCVFlQRV9QUk9CRV9SRVEpCisJICAgICYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQorCSAgICAmJiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlICE9IFJEX05PUk1BTF9NT0RFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIk1sbWVIYXJkVHJhbnNtaXQgLS0+IHJhZGFyIGRldGVjdCBub3QgaW4gbm9ybWFsIG1vZGUhXG4iKSk7CisJCS8qTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5UeFJpbmdMb2NrKTsgKi8KKwkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9CisJLyogKi8KKwkvKiBmaWxsIHNjYXR0ZXItYW5kLWdhdGhlciBidWZmZXIgbGlzdCBpbnRvIFRYRC4gSW50ZXJuYWxseSBjcmVhdGVkIE5ESVMgUEFDS0VUICovCisJLyogc2hvdWxkIGFsd2F5cyBoYXMgb25seSBvbmUgb2h5c2ljYWwgYnVmZmVyLCBhbmQgdGhlIHdob2xlIGZyYW1lIHNpemUgZXF1YWxzICovCisJLyogdG8gdGhlIGZpcnN0IHNjYXR0ZXIgYnVmZmVyIHNpemUgKi8KKwkvKiAqLworCisJLyogSW5pdGlhbGl6ZSBUWCBEZXNjcmlwdG9yICovCisJLyogRm9yIGludGVyLWZyYW1lIGdhcCwgdGhlIG51bWJlciBpcyBmb3IgdGhpcyBmcmFtZSBhbmQgbmV4dCBmcmFtZSAqLworCS8qIEZvciBNTE1FIHJhdGUsIHdlIHdpbGwgZml4IGFzIDJNYiB0byBtYXRjaCBvdGhlciB2ZW5kb3IncyBpbXBsZW1lbnQgKi8KKy8qICAgICAgcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSAxOyAqLworCisvKiBtYW5hZ2VtZW50IGZyYW1lIGRvZXNuJ3QgbmVlZCBlbmNyeXB0aW9uLiBzbyB1c2UgUkVTRVJWRURfV0NJRCBubyBtYXR0ZXIgdSBhcmUgc2VuZGluZyB0byBzcGVjaWZpYyB3Y2lkIG9yIG5vdC4gKi8KKwkvKiBPbmx5IGJlYWNvbiB1c2UgTnNlcT1UUlVFLiBTbyBoZXJlIHdlIHVzZSBOc2VxPUZBTFNFLiAqLworCWlmIChwTWFjRW50cnkgPT0gTlVMTCkgeworCQlSVE1QV3JpdGVUeFdJKHBBZCwgcEZpcnN0VHhXSSwgRkFMU0UsIEZBTFNFLCBiSW5zZXJ0VGltZXN0YW1wLAorCQkJICAgICAgRkFMU0UsIGJBY2tSZXF1aXJlZCwgRkFMU0UsIDAsIFJFU0VSVkVEX1dDSUQsCisJCQkgICAgICAoU3JjQnVmTGVuIC0gVFhXSV9TSVpFKSwgUElEX01HTVQsIDAsCisJCQkgICAgICAodTgpcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUywKKwkJCSAgICAgIElGU19CQUNLT0ZGLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7CisJfSBlbHNlIHsKKwkJUlRNUFdyaXRlVHhXSShwQWQsIHBGaXJzdFR4V0ksIEZBTFNFLCBGQUxTRSwKKwkJCSAgICAgIGJJbnNlcnRUaW1lc3RhbXAsIEZBTFNFLCBiQWNrUmVxdWlyZWQsIEZBTFNFLAorCQkJICAgICAgMCwgcE1hY0VudHJ5LT5BaWQsIChTcmNCdWZMZW4gLSBUWFdJX1NJWkUpLAorCQkJICAgICAgcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTLCAwLAorCQkJICAgICAgKHU4KXBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUywKKwkJCSAgICAgIElGU19CQUNLT0ZGLCBGQUxTRSwgJnBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlKTsKKwl9CisKKwlwQWQtPlR4UmluZ1tRdWVJZHhdLkNlbGxbU3dJZHhdLnBOZGlzUGFja2V0ID0gcFBhY2tldDsKKwlwQWQtPlR4UmluZ1tRdWVJZHhdLkNlbGxbU3dJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisvKiAgICAgIHBGaXJzdFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA9IFNyY0J1ZkxlbiAtIFRYV0lfU0laRTsgKi8KKwlTcmNCdWZQQSA9CisJICAgIFBDSV9NQVBfU0lOR0xFKHBBZCwgcFNyY0J1ZlZBLCBTcmNCdWZMZW4sIDAsIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgVFJVRSwgRklGT19FRENBKTsKKwlwVHhELT5MYXN0U2VjMCA9IDE7CisJcFR4RC0+TGFzdFNlYzEgPSAxOworCXBUeEQtPlNETGVuMCA9IFNyY0J1ZkxlbjsKKwlwVHhELT5TRExlbjEgPSAwOworCXBUeEQtPlNEUHRyMCA9IFNyY0J1ZlBBOworCXBUeEQtPkRNQURPTkUgPSAwOworCisJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKKworCS8qIEluY3JlYXNlIFRYX0NUWF9JRFgsIGJ1dCB3cml0ZSB0byByZWdpc3RlciBsYXRlci4gKi8KKwlJTkNfUklOR19JTkRFWChwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4LCBUWF9SSU5HX1NJWkUpOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ1RYX0lEWDAgKyBRdWVJZHggKiAweDEwLAorCQkJcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCk7CisKKwkvKiBNYWtlIHN1cmUgdG8gcmVsZWFzZSBNR01UIHJpbmcgcmVzb3VyY2UgKi8KKy8qICAgICAgTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5UeFJpbmdMb2NrKTsgKi8KKworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCitpbnQgTWxtZURhdGFIYXJkVHJhbnNtaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSB1OCBRdWVJZHgsIHZvaWQgKnBQYWNrZXQpCit7CisJaWYgKChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgIT0gUkRfTk9STUFMX01PREUpCisJICAgICkgeworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gTWxtZUhhcmRUcmFuc21pdFR4UmluZyhwQWQsIFF1ZUlkeCwgcFBhY2tldCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDYWxjdWxhdGVzIHRoZSBkdXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byB0cmFuc21pdCBvdXQgZnJhbWVzCisJd2l0aCBnaXZlbiBzaXplIGFuZCBzcGVjaWZpZWQgcmF0ZS4KKworCUFyZ3VtZW50czoKKwkJcFR4RAkJUG9pbnRlciB0byB0cmFuc21pdCBkZXNjcmlwdG9yCisJCUFjawkJU2V0dGluZyBmb3IgQWNrIHJlcXVpcmVtZW50IGJpdAorCQlGcmFnbWVudAlTZXR0aW5nIGZvciBGcmFnbWVudCBiaXQKKwkJUmV0cnlNb2RlCVNldHRpbmcgZm9yIHJldHJ5IG1vZGUKKwkJSWZzCQlTZXR0aW5nIGZvciBJRlMgZ2FwCisJCVJhdGUJCVNldHRpbmcgZm9yIHRyYW5zbWl0IHJhdGUKKwkJU2VydmljZQkJU2V0dGluZyBmb3Igc2VydmljZQorCQlMZW5ndGgJCUZyYW1lIGxlbmd0aAorCQlUeFByZWFtYmxlCVNob3J0IG9yIExvbmcgcHJlYW1ibGUgd2hlbiB1c2luZyBDQ0sgcmF0ZXMKKwkJUXVlSWR4IC0gMC0zLCBhY2NvcmRpbmcgdG8gODAyLjExZS9kNC40IEp1bmUvMjAwMworCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVE1QV3JpdGVUeERlc2NyaXB0b3Ioc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgc3RydWN0IHJ0X3R4ZCAqIHBUeEQsCisJCQkgICBJTiBCT09MRUFOIGJXSVYsIHU4IFF1ZXVlU0VMKQoreworCS8qICovCisJLyogQWx3YXlzIHVzZSBMb25nIHByZWFtYmxlIGJlZm9yZSB2ZXJpZmlhdGlvbiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzIHdlbGwuICovCisJLyogVG9kbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBpZiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzICovCisJLyogKi8KKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOworCisJcFR4RC0+V0lWID0gKGJXSVYpID8gMSA6IDA7CisJcFR4RC0+UVNFTCA9IChRdWV1ZVNFTCk7CisJLypSVDI4NjBjPz8gIGZpeGVkIHVzaW5nIEVEQ0EgcXVldWUgZm9yIHRlc3QuLi4gIFdlIGRvdWJ0IFF1ZXVlMSBoYXMgcHJvYmxlbS4gIDIwMDYtMDktMjYgSmFuICovCisJLypwVHhELT5RU0VMPSBGSUZPX0VEQ0E7ICovCisJcFR4RC0+RE1BRE9ORSA9IDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YV91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9kYXRhX3VzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNTZjMmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YV91c2IuYwpAQCAtMCwwICsxLDk1MSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisvKgorICAgQWxsIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgbXVzdCBiZSBVU0ItZGVwZW5kZWQsIG9yIHlvdSBzaG91bGQgb3V0IHlvdXIgZnVuY3Rpb24KKwlpbiBvdGhlciBmaWxlcy4KKworKi8KKworI2lmZGVmIFJUTVBfTUFDX1VTQgorCisjaW5jbHVkZQkiLi4vcnRfY29uZmlnLmgiCisKKy8qCisJV2UgY2FuIGRvIGNvcHkgdGhlIGZyYW1lIGludG8gcFR4Q29udGV4dCB3aGVuIG1hdGNoIGZvbGxvd2luZyBjb25kaXRpb25zLgorCQk9PgorCQk9PgorCQk9PgorKi8KK3N0YXRpYyBpbmxpbmUgaW50IFJ0bXBVU0JDYW5Eb1dyaXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJICAgIHU4IFF1ZUlkeCwKKwkJCQkJICAgIHN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQpCit7CisJaW50IGNhbldyaXRlID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCisJaWYgKCgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSA8CisJICAgICBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24pCisJICAgICYmIChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyBMT0NBTF9UWEJVRl9TSVpFKSA+CisJICAgIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbikgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSdG1wVVNCQ2FuRG9Xcml0ZSBjMSFcbiIpKTsKKwkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsCisJCQkJICAgIChmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwgPDwgUXVlSWR4KSk7CisJfSBlbHNlIGlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID09IDgpCisJCSAgICYmIChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPCBMT0NBTF9UWEJVRl9TSVpFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSdG1wVVNCQ2FuRG9Xcml0ZSBjMiFcbiIpKTsKKwkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsCisJCQkJICAgIChmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwgPDwgUXVlSWR4KSk7CisJfSBlbHNlIGlmIChwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09IFRSVUUpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUnRtcFVTQkNhbkRvV3JpdGUgYzMhXG4iKSk7CisJfSBlbHNlIHsKKwkJY2FuV3JpdGUgPSBORElTX1NUQVRVU19TVUNDRVNTOworCX0KKworCXJldHVybiBjYW5Xcml0ZTsKK30KKwordTE2IFJ0bXBVU0JfV3JpdGVTdWJUeFJlc291cmNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaywKKwkJCQkgIElOIEJPT0xFQU4gYklzTGFzdCwgdTE2ICogRnJlZU51bWJlcikKK3sKKworCS8qIER1bW15IGZ1bmN0aW9uLiBTaG91bGQgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLiAqLworCXJldHVybiAwOworCit9CisKK3UxNiBSdG1wVVNCX1dyaXRlRnJhZ1R4UmVzb3VyY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaywKKwkJCQkgICB1OCBmcmFnTnVtLCB1MTYgKiBGcmVlTnVtYmVyKQoreworCXN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQ7CisJdTE2IGh3SGRyTGVuOwkvKiBUaGUgaHdIZHJMZW4gY29uc2lzdCBvZiA4MDIuMTEgaGVhZGVyIGxlbmd0aCBwbHVzIHRoZSBoZWFkZXIgcGFkZGluZyBsZW5ndGguICovCisJdTMyIGZpbGxPZmZzZXQ7CisJc3RydWN0IHJ0X3R4aW5mbyAqcFR4SW5mbzsKKwlzdHJ1Y3QgcnRfdHh3aSAqcFR4V0k7CisJdTggKnBXaXJlbGVzc1BhY2tldCA9IE5VTEw7CisJdTggUXVlSWR4OworCWludCBTdGF0dXM7CisJdW5zaWduZWQgbG9uZyBJcnFGbGFnczsKKwl1MzIgVVNCRE1BcGt0TGVuID0gMCwgRE1BSGRyTGVuLCBwYWRkaW5nOworCUJPT0xFQU4gVHhRTGFzdFJvdW5kID0gRkFMU0U7CisKKwkvKiAqLworCS8qIGdldCBUeCBSaW5nIFJlc291cmNlICYgRG1hIEJ1ZmZlciBhZGRyZXNzICovCisJLyogKi8KKwlRdWVJZHggPSBwVHhCbGstPlF1ZUlkeDsKKwlwSFRUWENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbUXVlSWR4XTsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOworCWZpbGxPZmZzZXQgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247CisKKwlpZiAoZnJhZ051bSA9PSAwKSB7CisJCS8qIENoZWNrIGlmIHdlIGhhdmUgZW5vdWdoIHNwYWNlIGZvciB0aGlzIGJ1bGstb3V0IGJhdGNoLiAqLworCQlTdGF0dXMgPSBSdG1wVVNCQ2FuRG9Xcml0ZShwQWQsIFF1ZUlkeCwgcEhUVFhDb250ZXh0KTsKKwkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCQlwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID0gVFJVRTsKKworCQkJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgOCBieXRlcyBwYWRkaW5nLiAqLworCQkJaWYgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID09CisJCQkgICAgIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikpIHsKKwkJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICs9IDg7CisJCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICs9IDg7CisJCQkJZmlsbE9mZnNldCArPSA4OworCQkJfQorCQkJcFR4QmxrLT5Qcml2ID0gMDsKKwkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zID0KKwkJCSAgICBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247CisJCX0gZWxzZSB7CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sCisJCQkJCUlycUZsYWdzKTsKKworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwKKwkJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJcmV0dXJuIChTdGF0dXMpOworCQl9CisJfSBlbHNlIHsKKwkJLyogRm9yIHN1Yi1zZXF1ZW50IGZyYW1lcyBvZiB0aGlzIGJ1bGstb3V0IGJhdGNoLiBKdXN0IGNvcHkgaXQgdG8gb3VyIGJ1bGstb3V0IGJ1ZmZlci4gKi8KKwkJU3RhdHVzID0KKwkJICAgICgocEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9PQorCQkgICAgICBUUlVFKSA/IE5ESVNfU1RBVFVTX1NVQ0NFU1MgOiBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCQlmaWxsT2Zmc2V0ICs9IHBUeEJsay0+UHJpdjsKKwkJfSBlbHNlIHsKKwkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwKKwkJCQkJSXJxRmxhZ3MpOworCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LAorCQkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQlyZXR1cm4gKFN0YXR1cyk7CisJCX0KKwl9CisKKwlOZGlzWmVyb01lbW9yeSgodTggKikoJnBUeEJsay0+SGVhZGVyQnVmWzBdKSwgVFhJTkZPX1NJWkUpOworCXBUeEluZm8gPSAoc3RydWN0IHJ0X3R4aW5mbyAqKSgmcFR4QmxrLT5IZWFkZXJCdWZbMF0pOworCXBUeFdJID0gKHN0cnVjdCBydF90eHdpICopICgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKTsKKworCXBXaXJlbGVzc1BhY2tldCA9CisJICAgICZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtmaWxsT2Zmc2V0XTsKKworCS8qIGNvcHkgVFhXSSArIFdMQU4gSGVhZGVyICsgTExDIGludG8gRE1BIEhlYWRlciBCdWZmZXIgKi8KKwkvKmh3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLCA0KTsgKi8KKwlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOworCisJLyogQnVpbGQgb3VyIFVSQiBmb3IgVVNCRCAqLworCURNQUhkckxlbiA9IFRYV0lfU0laRSArIGh3SGRyTGVuOworCVVTQkRNQXBrdExlbiA9IERNQUhkckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOworCXBhZGRpbmcgPSAoNCAtIChVU0JETUFwa3RMZW4gJSA0KSkgJiAweDAzOwkvKiByb3VuZCB1cCB0byA0IGJ5dGUgYWxpZ25tZW50ICovCisJVVNCRE1BcGt0TGVuICs9IHBhZGRpbmc7CisKKwlwVHhCbGstPlByaXYgKz0gKFRYSU5GT19TSVpFICsgVVNCRE1BcGt0TGVuKTsKKworCS8qIEZvciBUeEluZm8sIHRoZSBsZW5ndGggb2YgVVNCRE1BcGt0TGVuID0gVFhXSV9TSVpFICsgODAyLjExIGhlYWRlciArIHBheWxvYWQgKi8KKwlSVE1QV3JpdGVUeEluZm8ocEFkLCBwVHhJbmZvLCAodTE2KShVU0JETUFwa3RMZW4pLCBGQUxTRSwgRklGT19FRENBLAorCQkJRkFMU0UgLypOZXh0VmFsaWQgKi8gLCBGQUxTRSk7CisKKwlpZiAoZnJhZ051bSA9PSBwVHhCbGstPlRvdGFsRnJhZ051bSkgeworCQlwVHhJbmZvLT5VU0JETUFUeGJ1cnN0ID0gMDsKKwkJaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyBwVHhCbGstPlByaXYgKyAzOTA2KSA+CisJCSAgICBNQVhfVFhCVUxLX0xJTUlUKSB7CisJCQlwVHhJbmZvLT5Td1VzZUxhc3RSb3VuZCA9IDE7CisJCQlUeFFMYXN0Um91bmQgPSBUUlVFOworCQl9CisJfSBlbHNlIHsKKwkJcFR4SW5mby0+VVNCRE1BVHhidXJzdCA9IDE7CisJfQorCisJTmRpc01vdmVNZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwVHhCbGstPkhlYWRlckJ1ZiwKKwkJICAgICAgIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW4pOworCXBXaXJlbGVzc1BhY2tldCArPSAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbik7CisJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgKz0gKFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW4pOworCisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7CisKKwlOZGlzTW92ZU1lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBUeEJsay0+cFNyY0J1ZkRhdGEsIHBUeEJsay0+U3JjQnVmTGVuKTsKKworCS8qICAgICAgWmVybyB0aGUgbGFzdCBwYWRkaW5nLiAqLworCXBXaXJlbGVzc1BhY2tldCArPSBwVHhCbGstPlNyY0J1ZkxlbjsKKwlOZGlzWmVyb01lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBhZGRpbmcgKyA4KTsKKworCWlmIChmcmFnTnVtID09IHBUeEJsay0+VG90YWxGcmFnTnVtKSB7CisJCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCQkvKiBVcGRhdGUgdGhlIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbi4gMzkwNiB1c2VkIHRvIHByZXZlbnQgdGhlIE5leHRCdWxrT3V0IGlzIGEgQS1SQUxJTksvQS1NU0RVIEZyYW1lLiAqLworCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gcFR4QmxrLT5Qcml2OworCQlpZiAoVHhRTGFzdFJvdW5kID09IFRSVUUpCisJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPSA4OworCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKKworCQkvKiBGaW5hbGx5LCBzZXQgYkN1cldyaXRpbmcgYXMgRkFMU0UgKi8KKwkJcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9IEZBTFNFOworCisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisJCS8qIHN1Y2NlZWQgYW5kIHJlbGVhc2UgdGhlIHNrYiBidWZmZXIgKi8KKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJfQorCisJcmV0dXJuIChTdGF0dXMpOworCit9CisKK3UxNiBSdG1wVVNCX1dyaXRlU2luZ2xlVHhSZXNvdXJjZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssCisJCQkJICAgICBJTiBCT09MRUFOIGJJc0xhc3QsCisJCQkJICAgICB1MTYgKiBGcmVlTnVtYmVyKQoreworCXN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQ7CisJdTE2IGh3SGRyTGVuOworCXUzMiBmaWxsT2Zmc2V0OworCXN0cnVjdCBydF90eGluZm8gKnBUeEluZm87CisJc3RydWN0IHJ0X3R4d2kgKnBUeFdJOworCXU4ICpwV2lyZWxlc3NQYWNrZXQ7CisJdTggUXVlSWR4OworCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CisJaW50IFN0YXR1czsKKwl1MzIgVVNCRE1BcGt0TGVuID0gMCwgRE1BSGRyTGVuLCBwYWRkaW5nOworCUJPT0xFQU4gYlR4UUxhc3RSb3VuZCA9IEZBTFNFOworCisJLyogRm9yIFVTQiwgZGlkbid0IG5lZWQgUENJX01BUF9TSU5HTEUoKSAqLworCS8qU3JjQnVmUEEgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIChjaGFyICopIHBUeEJsay0+cFNyY0J1ZkRhdGEsIHBUeEJsay0+U3JjQnVmTGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsgKi8KKworCS8qICovCisJLyogZ2V0IFR4IFJpbmcgUmVzb3VyY2UgJiBEbWEgQnVmZmVyIGFkZHJlc3MgKi8KKwkvKiAqLworCVF1ZUlkeCA9IHBUeEJsay0+UXVlSWR4OworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOworCWZpbGxPZmZzZXQgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247CisKKwkvKiBDaGVjayByaW5nIGZ1bGwuICovCisJU3RhdHVzID0gUnRtcFVTQkNhbkRvV3JpdGUocEFkLCBRdWVJZHgsIHBIVFRYQ29udGV4dCk7CisJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCXBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPSBUUlVFOworCisJCXBUeEluZm8gPSAoc3RydWN0IHJ0X3R4aW5mbyAqKSgmcFR4QmxrLT5IZWFkZXJCdWZbMF0pOworCQlwVHhXSSA9IChzdHJ1Y3QgcnRfdHh3aSAqKSAoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSk7CisKKwkJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgOCBieXRlcyBwYWRkaW5nLiAqLworCQlpZiAoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPT0KKwkJICAgICBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKSB7CisJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICs9IDg7CisJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gODsKKwkJCWZpbGxPZmZzZXQgKz0gODsKKwkJfQorCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKKworCQlwV2lyZWxlc3NQYWNrZXQgPQorCQkgICAgJnBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLgorCQkgICAgV2lyZWxlc3NQYWNrZXRbZmlsbE9mZnNldF07CisKKwkJLyogY29weSBUWFdJICsgV0xBTiBIZWFkZXIgKyBMTEMgaW50byBETUEgSGVhZGVyIEJ1ZmZlciAqLworCQkvKmh3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLCA0KTsgKi8KKwkJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKKworCQkvKiBCdWlsZCBvdXIgVVJCIGZvciBVU0JEICovCisJCURNQUhkckxlbiA9IFRYV0lfU0laRSArIGh3SGRyTGVuOworCQlVU0JETUFwa3RMZW4gPSBETUFIZHJMZW4gKyBwVHhCbGstPlNyY0J1ZkxlbjsKKwkJcGFkZGluZyA9ICg0IC0gKFVTQkRNQXBrdExlbiAlIDQpKSAmIDB4MDM7CS8qIHJvdW5kIHVwIHRvIDQgYnl0ZSBhbGlnbm1lbnQgKi8KKwkJVVNCRE1BcGt0TGVuICs9IHBhZGRpbmc7CisKKwkJcFR4QmxrLT5Qcml2ID0gKFRYSU5GT19TSVpFICsgVVNCRE1BcGt0TGVuKTsKKworCQkvKiBGb3IgVHhJbmZvLCB0aGUgbGVuZ3RoIG9mIFVTQkRNQXBrdExlbiA9IFRYV0lfU0laRSArIDgwMi4xMSBoZWFkZXIgKyBwYXlsb2FkICovCisJCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sICh1MTYpKFVTQkRNQXBrdExlbiksIEZBTFNFLAorCQkJCUZJRk9fRURDQSwgRkFMU0UgLypOZXh0VmFsaWQgKi8gLCBGQUxTRSk7CisKKwkJaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyAzOTA2ICsgcFR4QmxrLT5Qcml2KSA+CisJCSAgICBNQVhfVFhCVUxLX0xJTUlUKSB7CisJCQlwVHhJbmZvLT5Td1VzZUxhc3RSb3VuZCA9IDE7CisJCQliVHhRTGFzdFJvdW5kID0gVFJVRTsKKwkJfQorCQlOZGlzTW92ZU1lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBUeEJsay0+SGVhZGVyQnVmLAorCQkJICAgICAgIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW4pOworCQlwV2lyZWxlc3NQYWNrZXQgKz0gKFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW4pOworCisJCS8qIFdlIHVubG9jayBpdCBoZXJlIHRvIHByZXZlbnQgdGhlIGZpcnN0IDggYnl0ZXMgbWF5YmUgb3Zlci13cml0ZWQgaXNzdWUuICovCisJCS8qICAgICAgMS4gRmlyc3Qgd2UgZ290IEN1cldyaXRlUG9zaXRpb24gYnV0IHRoZSBmaXJzdCA4IGJ5dGVzIHN0aWxsIG5vdCB3cml0ZSB0byB0aGUgcFR4Y29udGV4dC4gKi8KKwkJLyogICAgICAyLiBBbiBpbnRlcnJ1cHQgYnJlYWsgb3VyIHJvdXRpbmUgYW5kIGhhbmRsZSBidWxrLW91dCBjb21wbGV0ZS4gKi8KKwkJLyogICAgICAzLiBJbiB0aGUgYnVsay1vdXQgY29tcGxsZXRlLCBpdCBuZWVkIHRvIGRvIGFub3RoZXIgYnVsay1vdXQsICovCisJCS8qICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSBFTmV4dEJ1bGtPdXRQb3NpdGlvbiBpcyBqdXN0IHRoZSBzYW1lIGFzIEN1cldyaXRlUG9zaXRpb24sIGl0IHdpbGwgc2F2ZSB0aGUgZmlyc3QgOCBieXRlcyBmcm9tIEN1cldyaXRlUG9zaXRpb24sICovCisJCS8qICAgICAgICAgICAgICAgICAgICAgIGJ1dCB0aGUgcGF5bG9hZCBzdGlsbCBub3QgY29weWVkLiB0aGUgcFR4Q29udGV4dC0+U2F2ZWRQYWRbXSB3aWxsIHNhdmUgYXMgYWxsemVyby4gYW5kIHNldCB0aGUgYkNvcHlQYWQgPSBUUlVFLiAqLworCQkvKiAgICAgIDQuIEludGVycnVwdCBjb21wbGV0ZS4gKi8KKwkJLyogIDUuIE91ciBpbnRlcnJ1cHRlZCByb3V0aW5lIGdvIGJhY2sgYW5kIGZpbGwgdGhlIGZpcnN0IDggYnl0ZXMgdG8gcFR4Q29udGV4dC4gKi8KKwkJLyogICAgICA2LiBOZXh0IHRpbWUgd2hlbiBkbyBidWxrLW91dCwgaXQgZm91bmQgdGhlIGJDb3B5UGFkPT1UUlVFIGFuZCB3aWxsIGNvcHkgdGhlIFNhdmVkUGFkW10gdG8gcFR4Q29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbi4gKi8KKwkJLyogICAgICAgICAgICAgIGFuZCB0aGUgcGFja2V0IHdpbGwgd3JvbmcuICovCisJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zICs9CisJCSAgICAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbik7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisJCU5kaXNNb3ZlTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcFR4QmxrLT5wU3JjQnVmRGF0YSwKKwkJCSAgICAgICBwVHhCbGstPlNyY0J1Zkxlbik7CisJCXBXaXJlbGVzc1BhY2tldCArPSBwVHhCbGstPlNyY0J1ZkxlbjsKKwkJTmRpc1plcm9NZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwYWRkaW5nICsgOCk7CisKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArPSBwVHhCbGstPlByaXY7CisJCWlmIChiVHhRTGFzdFJvdW5kKQorCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID0gODsKKwkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247CisKKwkJcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9IEZBTFNFOworCX0KKworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisJLyogc3VjY2VlZCBhbmQgcmVsZWFzZSB0aGUgc2tiIGJ1ZmZlciAqLworCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCisJcmV0dXJuIChTdGF0dXMpOworCit9CisKK3UxNiBSdG1wVVNCX1dyaXRlTXVsdGlUeFJlc291cmNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrLAorCQkJCSAgICB1OCBmcmFtZU51bSwgdTE2ICogRnJlZU51bWJlcikKK3sKKwlzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCAqcEhUVFhDb250ZXh0OworCXUxNiBod0hkckxlbjsJLyogVGhlIGh3SGRyTGVuIGNvbnNpc3Qgb2YgODAyLjExIGhlYWRlciBsZW5ndGggcGx1cyB0aGUgaGVhZGVyIHBhZGRpbmcgbGVuZ3RoLiAqLworCXUzMiBmaWxsT2Zmc2V0OworCXN0cnVjdCBydF90eGluZm8gKnBUeEluZm87CisJc3RydWN0IHJ0X3R4d2kgKnBUeFdJOworCXU4ICpwV2lyZWxlc3NQYWNrZXQgPSBOVUxMOworCXU4IFF1ZUlkeDsKKwlpbnQgU3RhdHVzOworCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CisJLyp1MzIgICAgICAgICAgICAgICAgICAgICAgICBVU0JETUFwa3RMZW4gPSAwLCBETUFIZHJMZW4sIHBhZGRpbmc7ICovCisKKwkvKiAqLworCS8qIGdldCBUeCBSaW5nIFJlc291cmNlICYgRG1hIEJ1ZmZlciBhZGRyZXNzICovCisJLyogKi8KKwlRdWVJZHggPSBwVHhCbGstPlF1ZUlkeDsKKwlwSFRUWENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbUXVlSWR4XTsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCWlmIChmcmFtZU51bSA9PSAwKSB7CisJCS8qIENoZWNrIGlmIHdlIGhhdmUgZW5vdWdoIHNwYWNlIGZvciB0aGlzIGJ1bGstb3V0IGJhdGNoLiAqLworCQlTdGF0dXMgPSBSdG1wVVNCQ2FuRG9Xcml0ZShwQWQsIFF1ZUlkeCwgcEhUVFhDb250ZXh0KTsKKwkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCQlwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID0gVFJVRTsKKworCQkJcFR4SW5mbyA9IChzdHJ1Y3QgcnRfdHhpbmZvICopKCZwVHhCbGstPkhlYWRlckJ1ZlswXSk7CisJCQlwVHhXSSA9IChzdHJ1Y3QgcnRfdHh3aSAqKSAoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSk7CisKKwkJCS8qIFJlc2VydmUgc3BhY2UgZm9yIDggYnl0ZXMgcGFkZGluZy4gKi8KKwkJCWlmICgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PQorCQkJICAgICBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKSB7CisKKwkJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gODsKKwkJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICs9IDg7CisJCQl9CisJCQlmaWxsT2Zmc2V0ID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOworCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgPQorCQkJICAgIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKKworCQkJcFdpcmVsZXNzUGFja2V0ID0KKwkJCSAgICAmcEhUVFhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuCisJCQkgICAgV2lyZWxlc3NQYWNrZXRbZmlsbE9mZnNldF07CisKKwkJCS8qICovCisJCQkvKiBDb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyICovCisJCQkvKiAqLworCQkJaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1TRFVfRlJBTUUpCisJCQkJLypod0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbi1MRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFELCA0KStMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOyAqLworCQkJCWh3SGRyTGVuID0KKwkJCQkgICAgcFR4QmxrLT5NcGR1SGVhZGVyTGVuIC0KKwkJCQkgICAgTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArCisJCQkJICAgIHBUeEJsay0+SGRyUGFkTGVuICsKKwkJCQkgICAgTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKKwkJCWVsc2UgaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfUkFMSU5LX0ZSQU1FKQorCQkJCS8qaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4tTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxELCA0KStMRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQ7ICovCisJCQkJaHdIZHJMZW4gPQorCQkJCSAgICBwVHhCbGstPk1wZHVIZWFkZXJMZW4gLQorCQkJCSAgICBMRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQgKworCQkJCSAgICBwVHhCbGstPkhkclBhZExlbiArCisJCQkJICAgIExFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRDsKKwkJCWVsc2UKKwkJCQkvKmh3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLCA0KTsgKi8KKwkJCQlod0hkckxlbiA9CisJCQkJICAgIHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOworCisJCQkvKiBVcGRhdGUgdGhlIHBUeEJsay0+UHJpdi4gKi8KKwkJCXBUeEJsay0+UHJpdiA9IFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW47CisKKwkJCS8qICAgICAgcFR4SW5mby0+VVNCRE1BcGt0TGVuIG5vdyBqdXN0IGEgdGVtcCB2YWx1ZSBhbmQgd2lsbCB0byBjb3JyZWN0IGxhdHRlci4gKi8KKwkJCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sICh1MTYpKHBUeEJsay0+UHJpdiksCisJCQkJCUZBTFNFLCBGSUZPX0VEQ0EsIEZBTFNFIC8qTmV4dFZhbGlkICovICwKKwkJCQkJRkFMU0UpOworCisJCQkvKiBDb3B5IGl0LiAqLworCQkJTmRpc01vdmVNZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwVHhCbGstPkhlYWRlckJ1ZiwKKwkJCQkgICAgICAgcFR4QmxrLT5Qcml2KTsKKwkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zICs9IHBUeEJsay0+UHJpdjsKKwkJCXBXaXJlbGVzc1BhY2tldCArPSBwVHhCbGstPlByaXY7CisJCX0KKwl9IGVsc2UgewkJLyogRm9yIHN1Yi1zZXF1ZW50IGZyYW1lcyBvZiB0aGlzIGJ1bGstb3V0IGJhdGNoLiBKdXN0IGNvcHkgaXQgdG8gb3VyIGJ1bGstb3V0IGJ1ZmZlci4gKi8KKworCQlTdGF0dXMgPQorCQkgICAgKChwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09CisJCSAgICAgIFRSVUUpID8gTkRJU19TVEFUVVNfU1VDQ0VTUyA6IE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCWZpbGxPZmZzZXQgPQorCQkJICAgIChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyBwVHhCbGstPlByaXYpOworCQkJcFdpcmVsZXNzUGFja2V0ID0KKwkJCSAgICAmcEhUVFhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuCisJCQkgICAgV2lyZWxlc3NQYWNrZXRbZmlsbE9mZnNldF07CisKKwkJCS8qaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47ICovCisJCQlOZGlzTW92ZU1lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBUeEJsay0+SGVhZGVyQnVmLAorCQkJCSAgICAgICBwVHhCbGstPk1wZHVIZWFkZXJMZW4pOworCQkJcFdpcmVsZXNzUGFja2V0ICs9IChwVHhCbGstPk1wZHVIZWFkZXJMZW4pOworCQkJcFR4QmxrLT5Qcml2ICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKKwkJfSBlbHNlIHsJLyogSXQgc2hvdWxkIG5vdCBoYXBwZW5lZCBub3cgdW5sZXNzIHdlIGFyZSBnb2luZyB0byBzaHV0ZG93bi4gKi8KKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIldyaXRlTXVsdGlUeFJlc291cmNlKCk6YkN1cldyaXRpbmcgaXMgRkFMU0Ugd2hlbiBoYW5kbGUgc3ViLXNlcXVlbnQgZnJhbWVzLlxuIikpOworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJfQorCX0KKworCS8qIFdlIHVubG9jayBpdCBoZXJlIHRvIHByZXZlbnQgdGhlIGZpcnN0IDggYnl0ZXMgbWF5YmUgb3Zlci13cml0ZSBpc3N1ZS4gKi8KKwkvKiAgICAgIDEuIEZpcnN0IHdlIGdvdCBDdXJXcml0ZVBvc2l0aW9uIGJ1dCB0aGUgZmlyc3QgOCBieXRlcyBzdGlsbCBub3Qgd3JpdGUgdG8gdGhlIHBUeENvbnRleHQuICovCisJLyogICAgICAyLiBBbiBpbnRlcnJ1cHQgYnJlYWsgb3VyIHJvdXRpbmUgYW5kIGhhbmRsZSBidWxrLW91dCBjb21wbGV0ZS4gKi8KKwkvKiAgICAgIDMuIEluIHRoZSBidWxrLW91dCBjb21wbGxldGUsIGl0IG5lZWQgdG8gZG8gYW5vdGhlciBidWxrLW91dCwgKi8KKwkvKiAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgRU5leHRCdWxrT3V0UG9zaXRpb24gaXMganVzdCB0aGUgc2FtZSBhcyBDdXJXcml0ZVBvc2l0aW9uLCBpdCB3aWxsIHNhdmUgdGhlIGZpcnN0IDggYnl0ZXMgZnJvbSBDdXJXcml0ZVBvc2l0aW9uLCAqLworCS8qICAgICAgICAgICAgICAgICAgICAgIGJ1dCB0aGUgcGF5bG9hZCBzdGlsbCBub3QgY29weWVkLiB0aGUgcFR4Q29udGV4dC0+U2F2ZWRQYWRbXSB3aWxsIHNhdmUgYXMgYWxsemVyby4gYW5kIHNldCB0aGUgYkNvcHlQYWQgPSBUUlVFLiAqLworCS8qICAgICAgNC4gSW50ZXJydXB0IGNvbXBsZXRlLiAqLworCS8qICA1LiBPdXIgaW50ZXJydXB0ZWQgcm91dGluZSBnbyBiYWNrIGFuZCBmaWxsIHRoZSBmaXJzdCA4IGJ5dGVzIHRvIHBUeENvbnRleHQuICovCisJLyogICAgICA2LiBOZXh0IHRpbWUgd2hlbiBkbyBidWxrLW91dCwgaXQgZm91bmQgdGhlIGJDb3B5UGFkPT1UUlVFIGFuZCB3aWxsIGNvcHkgdGhlIFNhdmVkUGFkW10gdG8gcFR4Q29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbi4gKi8KKwkvKiAgICAgICAgICAgICAgYW5kIHRoZSBwYWNrZXQgd2lsbCB3cm9uZy4gKi8KKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIldyaXRlTXVsdGlUeFJlc291cmNlOiBDV1BvcyA9ICVsZCwgTkJPdXRQb3MgPSAlbGQuXG4iLAorCQkJICBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sCisJCQkgIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbikpOworCQlnb3RvIGRvbmU7CisJfQorCS8qIENvcHkgdGhlIGZyYW1lIGNvbnRlbnQgaW50byBETUEgYnVmZmVyIGFuZCB1cGRhdGUgdGhlIHBUeEJsay0+UHJpdiAqLworCU5kaXNNb3ZlTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcFR4QmxrLT5wU3JjQnVmRGF0YSwgcFR4QmxrLT5TcmNCdWZMZW4pOworCXBXaXJlbGVzc1BhY2tldCArPSBwVHhCbGstPlNyY0J1ZkxlbjsKKwlwVHhCbGstPlByaXYgKz0gcFR4QmxrLT5TcmNCdWZMZW47CisKK2RvbmU6CisJLyogUmVsZWFzZSB0aGUgc2tiIGJ1ZmZlciBoZXJlICovCisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisKKwlyZXR1cm4gKFN0YXR1cyk7CisKK30KKwordm9pZCBSdG1wVVNCX0ZpbmFsV3JpdGVUeFJlc291cmNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaywKKwkJCQkgIHUxNiB0b3RhbE1QRFVTaXplLCB1MTYgVHhJZHgpCit7CisJdTggUXVlSWR4OworCXN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQ7CisJdTMyIGZpbGxPZmZzZXQ7CisJc3RydWN0IHJ0X3R4aW5mbyAqcFR4SW5mbzsKKwlzdHJ1Y3QgcnRfdHh3aSAqcFR4V0k7CisJdTMyIFVTQkRNQXBrdExlbiwgcGFkZGluZzsKKwl1bnNpZ25lZCBsb25nIElycUZsYWdzOworCXU4ICpwV2lyZWxlc3NQYWNrZXQ7CisKKwlRdWVJZHggPSBwVHhCbGstPlF1ZUlkeDsKKwlwSFRUWENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbUXVlSWR4XTsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCWlmIChwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09IFRSVUUpIHsKKwkJZmlsbE9mZnNldCA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKKwkJaWYgKCgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PQorCQkgICAgICBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pCisJCSAgICAgfHwgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uIC0gOCkgPT0KKwkJCSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKQorCQkgICAgJiYgKHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkID09IFRSVUUpKQorCQkJcFdpcmVsZXNzUGFja2V0ID0gKHU4ICopKCZwSFRUWENvbnRleHQtPlNhdmVkUGFkWzBdKTsKKwkJZWxzZQorCQkJcFdpcmVsZXNzUGFja2V0ID0KKwkJCSAgICAodTggKikoJnBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLgorCQkJCSAgICAgIFdpcmVsZXNzUGFja2V0W2ZpbGxPZmZzZXRdKTsKKworCQkvKiAqLworCQkvKiBVcGRhdGUgVHhJbmZvLT5VU0JETUFwa3RMZW4gLCAqLworCQkvKiAgICAgICAgICAgICAgdGhlIGxlbmd0aCA9IFRYV0lfU0laRSArIDgwMi4xMV9oZHIgKyA4MDIuMTFfaGRyX3BhZCArIHBheWxvYWRfb2ZfYWxsX2JhdGNoX2ZyYW1lcyArIEJ1bGstT3V0LXBhZGRpbmcgKi8KKwkJLyogKi8KKwkJcFR4SW5mbyA9IChzdHJ1Y3QgcnRfdHhpbmZvICopKHBXaXJlbGVzc1BhY2tldCk7CisKKwkJLyogQ2FsY3VsYXRlIHRoZSBidWxrLW91dCBwYWRkaW5nICovCisJCVVTQkRNQXBrdExlbiA9IHBUeEJsay0+UHJpdiAtIFRYSU5GT19TSVpFOworCQlwYWRkaW5nID0gKDQgLSAoVVNCRE1BcGt0TGVuICUgNCkpICYgMHgwMzsJLyogcm91bmQgdXAgdG8gNCBieXRlIGFsaWdubWVudCAqLworCQlVU0JETUFwa3RMZW4gKz0gcGFkZGluZzsKKworCQlwVHhJbmZvLT5VU0JETUFUeFBrdExlbiA9IFVTQkRNQXBrdExlbjsKKworCQkvKiAqLworCQkvKiBVcGRhdGUgVFhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ICwgKi8KKwkJLyogICAgICAgICAgICAgIHRoZSBsZW5ndGggPSA4MDIuMTEgaGVhZGVyICsgcGF5bG9hZF9vZl9hbGxfYmF0Y2hfZnJhbWVzICovCisJCXBUeFdJID0gKHN0cnVjdCBydF90eHdpICopIChwV2lyZWxlc3NQYWNrZXQgKyBUWElORk9fU0laRSk7CisJCXBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPSB0b3RhbE1QRFVTaXplOworCisJCS8qICovCisJCS8qIFVwZGF0ZSB0aGUgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICovCisJCS8qICovCisJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArPSAoVFhJTkZPX1NJWkUgKyBVU0JETUFwa3RMZW4pOworCQlpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIDM5MDYpID4gTUFYX1RYQlVMS19MSU1JVCkgewkvKiBBZGQgMzkwNiBmb3IgcHJldmVudCB0aGUgTmV4dEJ1bGtPdXQgcGFja2V0IHNpemUgaXMgYSBBLVJBTElOSy9BLU1TRFUgRnJhbWUuICovCisJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPSA4OworCQkJcFR4SW5mby0+U3dVc2VMYXN0Um91bmQgPSAxOworCQl9CisJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOworCisJCS8qICovCisJCS8qICAgICAgWmVybyB0aGUgbGFzdCBwYWRkaW5nLiAqLworCQkvKiAqLworCQlwV2lyZWxlc3NQYWNrZXQgPQorCQkgICAgKCZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC4KKwkJICAgICBXaXJlbGVzc1BhY2tldFtmaWxsT2Zmc2V0ICsgcFR4QmxrLT5Qcml2XSk7CisJCU5kaXNaZXJvTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcGFkZGluZyArIDgpOworCisJCS8qIEZpbmFsbHksIHNldCBiQ3VyV3JpdGluZyBhcyBGQUxTRSAqLworCQlwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID0gRkFMU0U7CisKKwl9IGVsc2UgewkJLyogSXQgc2hvdWxkIG5vdCBoYXBwZW5lZCBub3cgdW5sZXNzIHdlIGFyZSBnb2luZyB0byBzaHV0ZG93bi4gKi8KKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJGaW5hbFdyaXRlVHhSZXNvdXJjZSgpOmJDdXJXcml0aW5nIGlzIEZBTFNFIHdoZW4gaGFuZGxlIGxhc3QgZnJhbWVzLlxuIikpOworCX0KKworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCit9CisKK3ZvaWQgUnRtcFVTQkRhdGFMYXN0VHhJZHgoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICB1OCBRdWVJZHgsIHUxNiBUeElkeCkKK3sKKwkvKiBETyBub3RoaW5nIGZvciBVU0IuICovCit9CisKKy8qCisJV2hlbiBjYW4gZG8gYnVsay1vdXQ6CisJCTEuIFR4U3dGcmVlSWR4IDwgVFhfUklOR19TSVpFOworCQkJSXQgbWVhbnMgaGFzIGF0IGxlYXN0IG9uZSBSaW5nIGVudGl0eSBpcyByZWFkeSBmb3IgYnVsay1vdXQsIGtpY2sgaXQgb3V0LgorCQkyLiBJZiBUeFN3RnJlZUlkeCA9PSBUWF9SSU5HX1NJWkUKKwkJCUNoZWNrIGlmIHRoZSBDdXJXcml0aW5nIGZsYWcgaXMgRkFMU0UsIGlmIGl0J3MgRkFMU0UsIHdlIGNhbiBkbyBraWNrIG91dC4KKworKi8KK3ZvaWQgUnRtcFVTQkRhdGFLaWNrT3V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCXN0cnVjdCBydF90eF9ibGsgKnBUeEJsaywgdTggUXVlSWR4KQoreworCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IFF1ZUlkeCkpOworCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKworfQorCisvKgorCU11c3QgYmUgcnVuIGluIEludGVycnVwdCBjb250ZXh0CisJVGhpcyBmdW5jdGlvbiBoYW5kbGUgUlQyODcwIHNwZWNpZmljIFR4RGVzYyBhbmQgY3B1IGluZGV4IHVwZGF0ZSBhbmQga2ljayB0aGUgcGFja2V0IG91dC4KKyAqLworaW50IFJ0bXBVU0JNZ210S2lja091dChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICB1OCBRdWVJZHgsCisJCSAgICAgICB2b2lkICpwUGFja2V0LAorCQkgICAgICAgdTggKnBTcmNCdWZWQSwgdTMyIFNyY0J1ZkxlbikKK3sKKwlzdHJ1Y3QgcnRfdHhpbmZvICpwVHhJbmZvOworCXVuc2lnbmVkIGxvbmcgQnVsa091dFNpemU7CisJdTggcGFkTGVuOworCXU4ICpwRGVzdDsKKwl1bnNpZ25lZCBsb25nIFN3SWR4ID0gcEFkLT5NZ210UmluZy5UeENwdUlkeDsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcE1MTUVDb250ZXh0ID0KKwkgICAgKHN0cnVjdCBydF90eF9jb250ZXh0ICopcEFkLT5NZ210UmluZy5DZWxsW1N3SWR4XS5BbGxvY1ZhOworCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CisKKwlwVHhJbmZvID0gKHN0cnVjdCBydF90eGluZm8gKikocFNyY0J1ZlZBKTsKKworCS8qIEJ1aWxkIG91ciBVUkIgZm9yIFVTQkQgKi8KKwlCdWxrT3V0U2l6ZSA9IFNyY0J1ZkxlbjsKKwlCdWxrT3V0U2l6ZSA9IChCdWxrT3V0U2l6ZSArIDMpICYgKH4zKTsKKwlSVE1QV3JpdGVUeEluZm8ocEFkLCBwVHhJbmZvLCAodTE2KShCdWxrT3V0U2l6ZSAtIFRYSU5GT19TSVpFKSwKKwkJCVRSVUUsIEVwVG9RdWV1ZVtNR01UUElQRUlEWF0sIEZBTFNFLCBGQUxTRSk7CisKKwlCdWxrT3V0U2l6ZSArPSA0OwkvKiBBbHdheXMgYWRkIDQgZXh0cmEgYnl0ZXMgYXQgZXZlcnkgcGFja2V0LiAqLworCisJLyogSWYgQnVsa091dFNpemUgaXMgbXVsdGlwbGUgb2YgQnVsa091dE1heFBhY2tldFNpemUsIGFkZCBleHRyYSA0IGJ5dGVzIGFnYWluLiAqLworCWlmICgoQnVsa091dFNpemUgJSBwQWQtPkJ1bGtPdXRNYXhQYWNrZXRTaXplKSA9PSAwKQorCQlCdWxrT3V0U2l6ZSArPSA0OworCisJcGFkTGVuID0gQnVsa091dFNpemUgLSBTcmNCdWZMZW47CisJQVNTRVJUKChwYWRMZW4gPD0gUlRNUF9QS1RfVEFJTF9QQURESU5HKSk7CisKKwkvKiBOb3cgbWVtemVybyBhbGwgZXh0cmEgcGFkZGluZyBieXRlcy4gKi8KKwlwRGVzdCA9ICh1OCAqKShwU3JjQnVmVkEgKyBTcmNCdWZMZW4pOworCXNrYl9wdXQoR0VUX09TX1BLVF9UWVBFKHBQYWNrZXQpLCBwYWRMZW4pOworCU5kaXNaZXJvTWVtb3J5KHBEZXN0LCBwYWRMZW4pOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5NTE1FQnVsa091dExvY2ssIElycUZsYWdzKTsKKworCXBBZC0+TWdtdFJpbmcuQ2VsbFtwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4XS5wTmRpc1BhY2tldCA9IHBQYWNrZXQ7CisJcE1MTUVDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9CisJICAgIChzdHJ1Y3QgcnRfdHhfYnVmZmVyICopKEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KSk7CisKKwkvKiBMZW5ndGggaW4gVHhJbmZvIHNob3VsZCBiZSA4IGxlc3MgdGhhbiBidWxrb3V0IHNpemUuICovCisJcE1MTUVDb250ZXh0LT5CdWxrT3V0U2l6ZSA9IEJ1bGtPdXRTaXplOworCXBNTE1FQ29udGV4dC0+SW5Vc2UgPSBUUlVFOworCXBNTE1FQ29udGV4dC0+YldhaXRpbmdCdWxrT3V0ID0gVFJVRTsKKworCS8qZm9yIGRlYnVnICovCisJLypoZXhfZHVtcCgiUnRtcFVTQk1nbXRLaWNrT3V0IiwgJnBNTE1FQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0WzBdLCAocE1MTUVDb250ZXh0LT5CdWxrT3V0U2l6ZSA+IDE2ID8gMTYgOiBwTUxNRUNvbnRleHQtPkJ1bGtPdXRTaXplKSk7ICovCisKKwkvKnBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsgKi8KKwkvKnBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsgKi8KKworCS8qaWYgKHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPT0gTUdNVF9SSU5HX1NJWkUpICovCisJLyogICAgICBuZWVkS2lja091dCA9IFRSVUU7ICovCisKKwkvKiBEZWNyZWFzZSB0aGUgVHhTd0ZyZWVJZHggYW5kIEluY3JlYXNlIHRoZSBUWF9DVFhfSURYICovCisJcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeC0tOworCUlOQ19SSU5HX0lOREVYKHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgsIE1HTVRfUklOR19TSVpFKTsKKworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5NTE1FQnVsa091dExvY2ssIElycUZsYWdzKTsKKworCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfTUxNRSk7CisJLyppZiAobmVlZEtpY2tPdXQpICovCisJUlRVU0JLaWNrQnVsa091dChwQWQpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgUnRtcFVTQk51bGxGcmFtZUtpY2tPdXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB1OCBRdWVJZHgsCisJCQkgICAgIHU4ICogcE51bGxGcmFtZSwgdTMyIGZyYW1lTGVuKQoreworCWlmIChwQWQtPk51bGxDb250ZXh0LkluVXNlID09IEZBTFNFKSB7CisJCXN0cnVjdCBydF90eF9jb250ZXh0ICpwTnVsbENvbnRleHQ7CisJCXN0cnVjdCBydF90eGluZm8gKnBUeEluZm87CisJCXN0cnVjdCBydF90eHdpICogcFR4V0k7CisJCXU4ICpwV2lyZWxlc3NQa3Q7CisKKwkJcE51bGxDb250ZXh0ID0gJihwQWQtPk51bGxDb250ZXh0KTsKKworCQkvKiBTZXQgdGhlIGluIHVzZSBiaXQgKi8KKwkJcE51bGxDb250ZXh0LT5JblVzZSA9IFRSVUU7CisJCXBXaXJlbGVzc1BrdCA9CisJCSAgICAodTggKikmIHBOdWxsQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLgorCQkgICAgV2lyZWxlc3NQYWNrZXRbMF07CisKKwkJUlRNUFplcm9NZW1vcnkoJnBXaXJlbGVzc1BrdFswXSwgMTAwKTsKKwkJcFR4SW5mbyA9IChzdHJ1Y3QgcnRfdHhpbmZvICopJiBwV2lyZWxlc3NQa3RbMF07CisJCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sCisJCQkJKHUxNikoc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSArIFRYV0lfU0laRSksCisJCQkJVFJVRSwgRXBUb1F1ZXVlW01HTVRQSVBFSURYXSwgRkFMU0UsIEZBTFNFKTsKKwkJcFR4SW5mby0+UVNFTCA9IEZJRk9fRURDQTsKKwkJcFR4V0kgPSAoc3RydWN0IHJ0X3R4d2kgKikgJiBwV2lyZWxlc3NQa3RbVFhJTkZPX1NJWkVdOworCQlSVE1QV3JpdGVUeFdJKHBBZCwgcFR4V0ksIEZBTFNFLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBUUlVFLAorCQkJICAgICAgRkFMU0UsIDAsIEJTU0lEX1dDSUQsIChzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpKSwgMCwKKwkJCSAgICAgIDAsICh1OClwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTLAorCQkJICAgICAgSUZTX0hUVFhPUCwgRkFMU0UsICZwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQpOworCisJCVJUTVBNb3ZlTWVtb3J5KCZwV2lyZWxlc3NQa3RbVFhXSV9TSVpFICsgVFhJTkZPX1NJWkVdLAorCQkJICAgICAgICZwQWQtPk51bGxGcmFtZSwgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSk7CisJCXBBZC0+TnVsbENvbnRleHQuQnVsa091dFNpemUgPQorCQkgICAgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBzaXplb2YocEFkLT5OdWxsRnJhbWUpICsgNDsKKworCQkvKiBGaWxsIG91dCBmcmFtZSBsZW5ndGggaW5mb3JtYXRpb24gZm9yIGdsb2JhbCBCdWxrIG91dCBhcmJpdG9yICovCisJCS8qcE51bGxDb250ZXh0LT5CdWxrT3V0U2l6ZSA9IFRyYW5zZmVyQnVmZmVyTGVuZ3RoOyAqLworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlNZTkMgLSBzZW5kIE5VTEwgRnJhbWUgQCVkIE1icHMuLi5cbiIsCisJCQkgIFJhdGVJZFRvTWJwc1twQWQtPkNvbW1vbkNmZy5UeFJhdGVdKSk7CisJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OVUxMKTsKKworCQkvKiBLaWNrIGJ1bGsgb3V0ICovCisJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKwl9CisKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBHZXQgYSByZWNlaXZlZCBwYWNrZXQuCisKK0FyZ3VtZW50czoKKwlwQWQJCQkJCWRldmljZSBjb250cm9sIGJsb2NrCisJcFNhdmVSeEQJCQlyZWNlaXZlIGRlc2NyaXB0b3IgaW5mb3JtYXRpb24KKwkqcGJSZXNjaGVkdWxlCQluZWVkIHJlc2NoZWR1bGUgZmxhZworCSpwUnhQZW5kaW5nCQkJcGVuZGluZyByZWNlaXZlZCBwYWNrZXQgZmxhZworCitSZXR1cm4gVmFsdWU6CisgICAgdGhlIHJlY2lldmVkIHBhY2tldAorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCAqR2V0UGFja2V0RnJvbVJ4UmluZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIE9VVCBQUlQyOFhYX1JYRF9TVFJVQyBwU2F2ZVJ4RCwKKwkJCQkgT1VUIEJPT0xFQU4gKiBwYlJlc2NoZWR1bGUsCisJCQkJIElOIHUzMiAqIHBSeFBlbmRpbmcpCit7CisJc3RydWN0IHJ0X3J4X2NvbnRleHQgKnBSeENvbnRleHQ7CisJdm9pZCAqcFNrYjsKKwl1OCAqcERhdGE7CisJdW5zaWduZWQgbG9uZyBUaGlzRnJhbWVMZW47CisJdW5zaWduZWQgbG9uZyBSeEJ1ZmZlckxlbmd0aDsKKwlzdHJ1Y3QgcnRfcnh3aSAqIHBSeFdJOworCisJcFJ4Q29udGV4dCA9ICZwQWQtPlJ4Q29udGV4dFtwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleF07CisJaWYgKChwUnhDb250ZXh0LT5SZWFkYWJsZSA9PSBGQUxTRSkgfHwgKHBSeENvbnRleHQtPkluVXNlID09IFRSVUUpKQorCQlyZXR1cm4gTlVMTDsKKworCVJ4QnVmZmVyTGVuZ3RoID0gcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0IC0gcEFkLT5SZWFkUG9zaXRpb247CisJaWYgKFJ4QnVmZmVyTGVuZ3RoIDwKKwkgICAgKFJUMjg3MF9SWERNQUxFTl9GSUVMRF9TSVpFICsgc2l6ZW9mKHN0cnVjdCBydF9yeHdpKSArCisJICAgICBzaXplb2Yoc3RydWN0IHJ0X3J4aW5mbykpKSB7CisJCWdvdG8gbGFiZWxfbnVsbDsKKwl9CisKKwlwRGF0YSA9ICZwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlcltwQWQtPlJlYWRQb3NpdGlvbl07CS8qIDRLQiAqLworCS8qIFRoZSBSWERNQSBmaWVsZCBpcyA0IGJ5dGVzLCBub3cganVzdCB1c2UgdGhlIGZpcnN0IDIgYnl0ZXMuIFRoZSBMZW5ndGggaW5jbHVkaW5nIHRoZSAoUlhXSSArIE1TRFUgKyBQYWRkaW5nKSAqLworCVRoaXNGcmFtZUxlbiA9ICpwRGF0YSArICgqKHBEYXRhICsgMSkgPDwgOCk7CisJaWYgKFRoaXNGcmFtZUxlbiA9PSAwKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQklSSWR4KCVkKTogUlhETUFMZW4gaXMgemVyby5bJWxkXSwgQnVsa0luQnVmTGVuID0gJWxkKVxuIiwKKwkJCSAgcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXgsIFRoaXNGcmFtZUxlbiwKKwkJCSAgcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0KSk7CisJCWdvdG8gbGFiZWxfbnVsbDsKKwl9CisJaWYgKChUaGlzRnJhbWVMZW4gJiAweDMpICE9IDApIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJCSVJJZHgoJWQpOiBSWERNQUxlbiBub3QgbXVsdGlwbGUgb2YgNC5bJWxkXSwgQnVsa0luQnVmTGVuID0gJWxkKVxuIiwKKwkJCSAgcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXgsIFRoaXNGcmFtZUxlbiwKKwkJCSAgcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0KSk7CisJCWdvdG8gbGFiZWxfbnVsbDsKKwl9CisKKwlpZiAoKFRoaXNGcmFtZUxlbiArIDgpID4gUnhCdWZmZXJMZW5ndGgpCS8qIDggZm9yIChSVDI4NzBfUlhETUFMRU5fRklFTERfU0laRSArIHNpemVvZihzdHJ1Y3QgcnRfcnhpbmZvKSkgKi8KKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQklSSWR4KCVkKTpGcmFtZUxlbigweCVseCkgb3V0cmFuZ2VzLiBCdWxrSW5MZW49MHglbHgsIHJlbWFpbmluZyBSeEJ1Zkxlbj0weCVseCwgUmVhZFBvcz0weCVseFxuIiwKKwkJCSAgcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXgsIFRoaXNGcmFtZUxlbiwKKwkJCSAgcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0LCBSeEJ1ZmZlckxlbmd0aCwKKwkJCSAgcEFkLT5SZWFkUG9zaXRpb24pKTsKKworCQkvKiBlcnJvciBmcmFtZS4gZmluaXNoIHRoaXMgbG9vcCAqLworCQlnb3RvIGxhYmVsX251bGw7CisJfQorCS8qIHNraXAgVVNCIGZyYW1lIGxlbmd0aCBmaWVsZCAqLworCXBEYXRhICs9IFJUMjg3MF9SWERNQUxFTl9GSUVMRF9TSVpFOworCXBSeFdJID0gKHN0cnVjdCBydF9yeHdpICopIHBEYXRhOworCWlmIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID4gVGhpc0ZyYW1lTGVuKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiJXMoKTpwUnhXSU1QRFV0b3RhbEJ5dGVDb3VudCglZCkgbGFyZ2UgdGhhbiBSeERNQUxlbiglbGQpXG4iLAorCQkJICBfX0ZVTkNUSU9OX18sIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsCisJCQkgIFRoaXNGcmFtZUxlbikpOworCQlnb3RvIGxhYmVsX251bGw7CisJfQorCS8qIGFsbG9jYXRlIGEgcnggcGFja2V0ICovCisJcFNrYiA9IGRldl9hbGxvY19za2IoVGhpc0ZyYW1lTGVuKTsKKwlpZiAocFNrYiA9PSBOVUxMKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiJXMoKTpDYW5ub3QgQWxsb2NhdGUgc2sgYnVmZmVyIGZvciB0aGlzIEJ1bGstSW4gYnVmZmVyIVxuIiwKKwkJCSAgX19GVU5DVElPTl9fKSk7CisJCWdvdG8gbGFiZWxfbnVsbDsKKwl9CisJLyogY29weSB0aGUgcnggcGFja2V0ICovCisJbWVtY3B5KHNrYl9wdXQocFNrYiwgVGhpc0ZyYW1lTGVuKSwgcERhdGEsIFRoaXNGcmFtZUxlbik7CisJUlRQS1RfVE9fT1NQS1QocFNrYiktPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEJTUzApOworCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocFNrYiksIFBLVFNSQ19ORElTKTsKKworCS8qIGNvcHkgUnhEICovCisJKnBTYXZlUnhEID0gKihzdHJ1Y3QgcnRfcnhpbmZvICopIChwRGF0YSArIFRoaXNGcmFtZUxlbik7CisKKwkvKiB1cGRhdGUgbmV4dCBwYWNrZXQgcmVhZCBwb3NpdGlvbi4gKi8KKwlwQWQtPlJlYWRQb3NpdGlvbiArPSAoVGhpc0ZyYW1lTGVuICsgUlQyODcwX1JYRE1BTEVOX0ZJRUxEX1NJWkUgKyBSWElORk9fU0laRSk7CS8qIDggZm9yIChSVDI4NzBfUlhETUFMRU5fRklFTERfU0laRSArIHNpemVvZihzdHJ1Y3QgcnRfcnhpbmZvKSkgKi8KKworCXJldHVybiBwU2tiOworCitsYWJlbF9udWxsOgorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDaGVjayBSeCBkZXNjcmlwdG9yLCByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRSBpZiBhbnkgZXJyb3IgZG91bmQKKworCUFyZ3VtZW50czoKKwkJcFJ4RAkJUG9pbnRlcgl0byB0aGUgUnggZGVzY3JpcHRvcgorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19TVUNDRVNTCQlObyBlcnIKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQkJRXJyb3IKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgUlRNUENoZWNrUnhFcnJvcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhlYWRlciwKKwkJCSAgICAgc3RydWN0IHJ0X3J4d2kgKiBwUnhXSSwgSU4gUFJUMjhYWF9SWERfU1RSVUMgcFJ4SU5GTykKK3sKKwlzdHJ1Y3QgcnRfY2lwaGVyX2tleSAqcFdwYUtleTsKKwlpbnQgZEJtOworCisJaWYgKHBBZC0+YlByb21pc2N1b3VzID09IFRSVUUpCisJCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJaWYgKHBSeElORk8gPT0gTlVMTCkKKwkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKKworCS8qIFBoeSBlcnJvcnMgJiBDUkMgZXJyb3JzICovCisJaWYgKHBSeElORk8tPkNyYykgeworCQkvKiBDaGVjayBSU1NJIGZvciBOb2lzZSBIaXN0IHN0YXRpc3RpYyBjb2xsZWN0aW9uLiAqLworCQlkQm0gPSAoaW50KShwUnhXSS0+UlNTSTApIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKKwkJaWYgKGRCbSA8PSAtODcpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzBdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtODIpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzFdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtNzcpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzJdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtNzIpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzNdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtNjcpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzRdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtNjIpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzVdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtNTcpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzZdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA+IC01NykKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbN10gKz0gMTsKKworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKwkvKiBBZGQgUnggc2l6ZSB0byBjaGFubmVsIGxvYWQgY291bnRlciwgd2Ugc2hvdWxkIGlnbm9yZSBlcnJvciBjb3VudHMgKi8KKwlwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyArPSAocFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCArIDE0KTsKKworCS8qIERyb3AgVG9EcyBwcm9taXNjb3VzIGZyYW1lLCBpdCBpcyBvcGVuZWQgZHVlIHRvIENDWCAyIGNoYW5uZWwgbG9hZCBzdGF0aXN0aWNzICovCisJaWYgKHBIZWFkZXItPkZDLlRvRHMpIHsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIkVycjtGQy5Ub0RzXG4iKSk7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKwkvKiBQYXVsIDA0LTAzIGZvciBPRkRNIFJ4IGxlbmd0aCBpc3N1ZSAqLworCWlmIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID4gTUFYX0FHR1JFR0FUSU9OX1NJWkUpIHsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoInJlY2VpdmVkIHBhY2tldCB0b28gbG9uZ1xuIikpOworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisJLyogRHJvcCBub3QgVTJNIGZyYW1lcywgY2FudCdzIGRyb3AgaGVyZSBiZWNhdXNlIHdlIHdpbGwgZHJvcCBiZWFjb24gaW4gdGhpcyBjYXNlICovCisJLyogSSBhbSBraW5kIG9mIGRvdWJ0aW5nIHRoZSBVMk0gYml0IG9wZXJhdGlvbiAqLworCS8qIGlmIChwUnhELT5VMk0gPT0gMCkgKi8KKwkvKiAgICAgIHJldHVybihORElTX1NUQVRVU19GQUlMVVJFKTsgKi8KKworCS8qIGRyb3AgZGVjeXB0aW9uIGZhaWwgZnJhbWUgKi8KKwlpZiAocFJ4SU5GTy0+RGVjcnlwdGVkICYmIHBSeElORk8tPkNpcGhlckVycikgeworCisJCWlmICgoKHBSeElORk8tPkNpcGhlckVyciAmIDEpID09IDEpCisJCSAgICAmJiBwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCAmJiBJTkZSQV9PTihwQWQpKQorCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfSUNWX0VSUk9SX0VWRU5UX0ZMQUcsCisJCQkJCSAgICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uCisJCQkJCSAgICAgIEFkZHIsIEJTUzAsIDApOworCisJCWlmICgoKHBSeElORk8tPkNpcGhlckVyciAmIDIpID09IDIpCisJCSAgICAmJiBwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCAmJiBJTkZSQV9PTihwQWQpKQorCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfTUlDX0VSUk9SX0VWRU5UX0ZMQUcsCisJCQkJCSAgICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uCisJCQkJCSAgICAgIEFkZHIsIEJTUzAsIDApOworCQkvKiAqLworCQkvKiBNSUMgRXJyb3IgKi8KKwkJLyogKi8KKwkJaWYgKChwUnhJTkZPLT5DaXBoZXJFcnIgPT0gMikgJiYgcFJ4SU5GTy0+TXlCc3MpIHsKKwkJCXBXcGFLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcFJ4V0ktPktleUluZGV4XTsKKwkJCVJUTVBSZXBvcnRNaWNFcnJvcihwQWQsIHBXcGFLZXkpOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlJ4IE1JQyBWYWx1ZSBlcnJvclxuIikpOworCQl9CisKKwkJaWYgKHBSeElORk8tPkRlY3J5cHRlZCAmJgorCQkgICAgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BSeFdJLT5LZXlJbmRleF0uQ2lwaGVyQWxnID09CisJCSAgICAgQ0lQSEVSX0FFUykKKwkJICAgICYmIChwSGVhZGVyLT5TZXF1ZW5jZSA9PSBwQWQtPkZyYWdGcmFtZS5TZXF1ZW5jZSkpIHsKKwkJCS8qICovCisJCQkvKiBBY2NlcHRhYmxlIHNpbmNlIHRoZSBGaXJzdCBGcmFnRnJhbWUgbm8gQ2lwaGVyRXJyIHByb2JsZW0uICovCisJCQkvKiAqLworCQkJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJfQorCisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorCisJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKK30KKwordm9pZCBSdG1wVXNiU3RhQXNpY0ZvcmNlV2FrZXVwVGltZW91dCh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCQkJICAgICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkJCSAgICAgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwKKwkJCQkgICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpCit7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilGdW5jdGlvbkNvbnRleHQ7CisKKwlpZiAocEFkICYmIHBBZC0+TWxtZS5BdXRvV2FrZXVwVGltZXJSdW5uaW5nKSB7CisJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMSwgMHhmZiwgMHgwMCwgMHgwMik7CisKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7CisJCXBBZC0+TWxtZS5BdXRvV2FrZXVwVGltZXJSdW5uaW5nID0gRkFMU0U7CisJfQorfQorCit2b2lkIFJUMjh4eFVzYlN0YUFzaWNGb3JjZVdha2V1cChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIEJPT0xFQU4gYkZyb21UeCkKK3sKKwlCT09MRUFOIENhbmNlbGVkOworCisJaWYgKHBBZC0+TWxtZS5BdXRvV2FrZXVwVGltZXJSdW5uaW5nKQorCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5BdXRvV2FrZXVwVGltZXIsICZDYW5jZWxlZCk7CisKKwlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIDB4ZmYsIDB4MDAsIDB4MDIpOworCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7Cit9CisKK3ZvaWQgUlQyOHh4VXNiU3RhQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkgdTE2IFRidHROdW1Ub05leHRXYWtlVXApCit7CisKKwkvKiB3ZSBoYXZlIGRlY2lkZWQgdG8gU0xFRVAsIHNvIGF0IGxlYXN0IGRvIGl0IGZvciBhIEJFQUNPTiBwZXJpb2QuICovCisJaWYgKFRidHROdW1Ub05leHRXYWtlVXAgPT0gMCkKKwkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IDE7CisKKwlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5BdXRvV2FrZXVwVGltZXIsIEFVVE9fV0FLRVVQX1RJTUVPVVQpOworCXBBZC0+TWxtZS5BdXRvV2FrZXVwVGltZXJSdW5uaW5nID0gVFJVRTsKKworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMCwgMHhmZiwgMHhmZiwgMHgwMik7CS8qIHNlbmQgUE9XRVItU0FWRSBjb21tYW5kIHRvIE1DVS4gVGltZW91dCA0MHVzLiAqLworCisJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOworCit9CisKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9pbmZvLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1faW5mby5jCmluZGV4IDAxOWNjNDQuLjI1MzAyZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9pbmZvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2luZm8uYwpAQCAtMjMsODI2ICsyMywxMSBAQAogICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KKyAqLwogCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKIAotSU5UCVNob3dfU1NJRF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfV2lyZWxlc3NNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19UeEJ1cnN0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19UeFByZWFtYmxlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19UeFBvd2VyX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19DaGFubmVsX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19CR1Byb3RlY3Rpb25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X1JUU1RocmVzaG9sZF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfRnJhZ1RocmVzaG9sZF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfSHRCd19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfSHRNY3NfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0h0R2lfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0h0T3BNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19IdEV4dGNoYV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfSHRNcGR1RGVuc2l0eV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfSHRCYVdpblNpemVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0h0UmRnX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19IdEFtc2R1X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19IdEF1dG9CYV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfQ291bnRyeVJlZ2lvbl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19Db3VudHJ5Q29kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKLUlOVAlTaG93X1BrdEFnZ3JlZ2F0ZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLSNlbmRpZiAvLyBBR0dSRUdBVElPTl9TVVBQT1JUIC8vCi0KLSNpZmRlZiBXTU1fU1VQUE9SVAotSU5UCVNob3dfV21tQ2FwYWJsZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLSNlbmRpZiAvLyBXTU1fU1VQUE9SVCAvLwotCi1JTlQJU2hvd19JRUVFODAyMTFIX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19OZXR3b3JrVHlwZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfQXV0aE1vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0VuY3J5cFR5cGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0RlZmF1bHRLZXlJRF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfS2V5MV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfS2V5Ml9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfS2V5M19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfS2V5NF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfV1BBUFNLX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1zdGF0aWMgc3RydWN0IHsKLQlDSEFSICpuYW1lOwotCUlOVCAoKnNob3dfcHJvYykoUFJUTVBfQURBUFRFUiBwQWRhcHRlciwgUFVDSEFSIGFyZyk7Ci19ICpQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DLCBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0NbXSA9IHsKLQl7IlNTSUQiLAkJCQkJU2hvd19TU0lEX1Byb2N9LAotCXsiV2lyZWxlc3NNb2RlIiwJCQlTaG93X1dpcmVsZXNzTW9kZV9Qcm9jfSwKLQl7IlR4QnVyc3QiLAkJCQkJU2hvd19UeEJ1cnN0X1Byb2N9LAotCXsiVHhQcmVhbWJsZSIsCQkJCVNob3dfVHhQcmVhbWJsZV9Qcm9jfSwKLQl7IlR4UG93ZXIiLAkJCQkJU2hvd19UeFBvd2VyX1Byb2N9LAotCXsiQ2hhbm5lbCIsCQkJCQlTaG93X0NoYW5uZWxfUHJvY30sCi0JeyJCR1Byb3RlY3Rpb24iLAkJCVNob3dfQkdQcm90ZWN0aW9uX1Byb2N9LAotCXsiUlRTVGhyZXNob2xkIiwJCQlTaG93X1JUU1RocmVzaG9sZF9Qcm9jfSwKLQl7IkZyYWdUaHJlc2hvbGQiLAkJCVNob3dfRnJhZ1RocmVzaG9sZF9Qcm9jfSwKLQl7Ikh0QnciLAkJCQkJU2hvd19IdEJ3X1Byb2N9LAotCXsiSHRNY3MiLAkJCQkJU2hvd19IdE1jc19Qcm9jfSwKLQl7Ikh0R2kiLAkJCQkJU2hvd19IdEdpX1Byb2N9LAotCXsiSHRPcE1vZGUiLAkJCQlTaG93X0h0T3BNb2RlX1Byb2N9LAotCXsiSHRFeHRjaGEiLAkJCQlTaG93X0h0RXh0Y2hhX1Byb2N9LAotCXsiSHRNcGR1RGVuc2l0eSIsCQkJU2hvd19IdE1wZHVEZW5zaXR5X1Byb2N9LAotCXsiSHRCYVdpblNpemUiLAkJICAgICAgICBTaG93X0h0QmFXaW5TaXplX1Byb2N9LAotCXsiSHRSZGciLAkJICAgICAgICAJU2hvd19IdFJkZ19Qcm9jfSwKLQl7Ikh0QW1zZHUiLAkJICAgICAgICAJU2hvd19IdEFtc2R1X1Byb2N9LAotCXsiSHRBdXRvQmEiLAkJICAgICAgICBTaG93X0h0QXV0b0JhX1Byb2N9LAotCXsiQ291bnRyeVJlZ2lvbiIsCQkJU2hvd19Db3VudHJ5UmVnaW9uX1Byb2N9LAotCXsiQ291bnRyeVJlZ2lvbkFCYW5kIiwJCVNob3dfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2N9LAotCXsiQ291bnRyeUNvZGUiLAkJCQlTaG93X0NvdW50cnlDb2RlX1Byb2N9LAotI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKLQl7IlBrdEFnZ3JlZ2F0ZSIsCQkJU2hvd19Qa3RBZ2dyZWdhdGVfUHJvY30sCi0jZW5kaWYKLQotI2lmZGVmIFdNTV9TVVBQT1JUCi0JeyJXbW1DYXBhYmxlIiwJCQkJU2hvd19XbW1DYXBhYmxlX1Byb2N9LAotI2VuZGlmCi0JeyJJRUVFODAyMTFIIiwJCQkJU2hvd19JRUVFODAyMTFIX1Byb2N9LAotICAgIHsiTmV0d29ya1R5cGUiLAkJCQlTaG93X05ldHdvcmtUeXBlX1Byb2N9LAotCXsiQXV0aE1vZGUiLAkJCQlTaG93X0F1dGhNb2RlX1Byb2N9LAotCXsiRW5jcnlwVHlwZSIsCQkJCVNob3dfRW5jcnlwVHlwZV9Qcm9jfSwKLQl7IkRlZmF1bHRLZXlJRCIsCQkJU2hvd19EZWZhdWx0S2V5SURfUHJvY30sCi0JeyJLZXkxIiwJCQkJCVNob3dfS2V5MV9Qcm9jfSwKLQl7IktleTIiLAkJCQkJU2hvd19LZXkyX1Byb2N9LAotCXsiS2V5MyIsCQkJCQlTaG93X0tleTNfUHJvY30sCi0JeyJLZXk0IiwJCQkJCVNob3dfS2V5NF9Qcm9jfSwKLQl7IldQQVBTSyIsCQkJCQlTaG93X1dQQVBTS19Qcm9jfSwKLQl7TlVMTCwgTlVMTH0KLX07Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgR2V0IERyaXZlciB2ZXJzaW9uLgotCi0gICAgUmV0dXJuOgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9Ecml2ZXJWZXJzaW9uX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRyaXZlciB2ZXJzaW9uLSVzXG4iLCBTVEFfRFJJVkVSX1ZFUlNJT04pKTsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBDb3VudHJ5IFJlZ2lvbi4KLSAgICAgICAgVGhpcyBjb21tYW5kIHdpbGwgbm90IHdvcmssIGlmIHRoZSBmaWVsZCBvZiBDb3VudHJ5UmVnaW9uIGluIGVlcHJvbSBpcyBwcm9ncmFtbWVkLgotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9Db3VudHJ5UmVnaW9uX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVMT05HIHJlZ2lvbjsKLQotCXJlZ2lvbiA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQkvLyBDb3VudHJ5IGNhbiBiZSBzZXQgb25seSB3aGVuIEVFUFJPTSBub3QgcHJvZ3JhbW1lZAotCWlmIChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICYgMHg4MCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9Db3VudHJ5UmVnaW9uX1Byb2M6OnBhcmFtZXRlciBvZiBDb3VudHJ5UmVnaW9uIGluIGVlcHJvbSBpcyBwcm9ncmFtbWVkIFxuIikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JaWYoKHJlZ2lvbiA+PSAwKSAmJiAocmVnaW9uIDw9IFJFR0lPTl9NQVhJTVVNX0JHX0JBTkQpKQotCXsKLQkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiA9IChVQ0hBUikgcmVnaW9uOwotCX0KLQllbHNlIGlmIChyZWdpb24gPT0gUkVHSU9OXzMxX0JHX0JBTkQpCi0JewotCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uID0gKFVDSEFSKSByZWdpb247Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9Db3VudHJ5UmVnaW9uX1Byb2M6OnBhcmFtZXRlcnMgb3V0IG9mIHJhbmdlXG4iKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQkvLyBpZiBzZXQgY291bnRyeSByZWdpb24sIGRyaXZlciBuZWVkcyB0byBiZSByZXNldAotCUJ1aWxkQ2hhbm5lbExpc3QocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9Db3VudHJ5UmVnaW9uX1Byb2M6OihDb3VudHJ5UmVnaW9uPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbikpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IENvdW50cnkgUmVnaW9uIGZvciBBIGJhbmQuCi0gICAgICAgIFRoaXMgY29tbWFuZCB3aWxsIG5vdCB3b3JrLCBpZiB0aGUgZmllbGQgb2YgQ291bnRyeVJlZ2lvbiBpbiBlZXByb20gaXMgcHJvZ3JhbW1lZC4KLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVMT05HIHJlZ2lvbjsKLQotCXJlZ2lvbiA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQkvLyBDb3VudHJ5IGNhbiBiZSBzZXQgb25seSB3aGVuIEVFUFJPTSBub3QgcHJvZ3JhbW1lZAotCWlmIChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgJiAweDgwKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jOjpwYXJhbWV0ZXIgb2YgQ291bnRyeVJlZ2lvbiBpbiBlZXByb20gaXMgcHJvZ3JhbW1lZCBcbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCWlmKChyZWdpb24gPj0gMCkgJiYgKHJlZ2lvbiA8PSBSRUdJT05fTUFYSU1VTV9BX0JBTkQpKQotCXsKLQkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kID0gKFVDSEFSKSByZWdpb247Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYzo6cGFyYW1ldGVycyBvdXQgb2YgcmFuZ2VcbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCS8vIGlmIHNldCBjb3VudHJ5IHJlZ2lvbiwgZHJpdmVyIG5lZWRzIHRvIGJlIHJlc2V0Ci0JQnVpbGRDaGFubmVsTGlzdChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jOjooQ291bnRyeVJlZ2lvbj0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFdpcmVsZXNzIE1vZGUKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfV2lyZWxlc3NNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVMT05HCVdpcmVsZXNzTW9kZTsKLQlJTlQJCXN1Y2Nlc3MgPSBUUlVFOwotCi0JV2lyZWxlc3NNb2RlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCXsKLQkJSU5UIE1heFBoeU1vZGUgPSBQSFlfMTFHOwotCi0JCU1heFBoeU1vZGUgPSBQSFlfMTFOXzVHOwotCi0JCWlmIChXaXJlbGVzc01vZGUgPD0gTWF4UGh5TW9kZSkKLQkJewotCQkJUlRNUFNldFBoeU1vZGUocEFkLCBXaXJlbGVzc01vZGUpOwotCi0JCQlpZiAoV2lyZWxlc3NNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCi0JCQl7Ci0JCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IFRSVUU7Ci0JCQkJcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IFRSVUU7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IEZBTFNFOwotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKLQkJCX0KLQotCQkJLy8gU2V0IEFkaG9jTW9kZSByYXRlcwotCQkJaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQotCQkJewotCQkJCU1sbWVVcGRhdGVUeFJhdGVzKHBBZCwgRkFMU0UsIDApOwotCQkJCU1ha2VJYnNzQmVhY29uKHBBZCk7ICAgICAgICAgICAvLyByZS1idWlsZCBCRUFDT04gZnJhbWUKLQkJCQlBc2ljRW5hYmxlSWJzc1N5bmMocEFkKTsgICAgICAgLy8gY29weSB0byBvbi1jaGlwIG1lbW9yeQotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJc3VjY2VzcyA9IEZBTFNFOwotCQl9Ci0JfQotCi0JLy8gaXQgaXMgbmVlZGVkIHRvIHNldCBTU0lEIHRvIHRha2UgZWZmZWN0Ci0JaWYgKHN1Y2Nlc3MgPT0gVFJVRSkKLQl7Ci0JCVNldENvbW1vbkhUKHBBZCk7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XaXJlbGVzc01vZGVfUHJvYzo6KD0lbGQpXG4iLCBXaXJlbGVzc01vZGUpKTsKLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X1dpcmVsZXNzTW9kZV9Qcm9jOjpwYXJhbWV0ZXJzIG91dCBvZiByYW5nZVxuIikpOwotCX0KLQotCXJldHVybiBzdWNjZXNzOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBDaGFubmVsCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X0NoYW5uZWxfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0gCUlOVAkJc3VjY2VzcyA9IFRSVUU7Ci0JVUNIQVIJQ2hhbm5lbDsKLQotCUNoYW5uZWwgPSAoVUNIQVIpIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQkvLyBjaGVjayBpZiB0aGlzIGNoYW5uZWwgaXMgdmFsaWQKLQlpZiAoQ2hhbm5lbFNhbml0eShwQWQsIENoYW5uZWwpID09IFRSVUUpCi0JewotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gQ2hhbm5lbDsKLQotCQkJaWYgKE1PTklUT1JfT04ocEFkKSkKLQkJCXsKLQkJCQlOX0NoYW5uZWxDaGVjayhwQWQpOwotCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQgJiYKLQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKQotCQkJCXsKLQkJCQkJTl9TZXRDZW5DaChwQWQpOwotCQkJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0JCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfNDAsIGNvbnRyb2xfY2hhbm5lbCglZCksIENlbnRyYWxDaGFubmVsKCVkKSBcbiIsCi0JCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwotCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfMjAsIENoYW5uZWwoJWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1Y2Nlc3MgPSBUUlVFOwotCX0KLQllbHNlCi0JewotCQlzdWNjZXNzID0gRkFMU0U7Ci0JfQotCi0KLQlpZiAoc3VjY2VzcyA9PSBUUlVFKQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQ2hhbm5lbF9Qcm9jOjooQ2hhbm5lbD0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKLQotCXJldHVybiBzdWNjZXNzOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBTaG9ydCBTbG90IFRpbWUgRW5hYmxlIG9yIERpc2FibGUKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfU2hvcnRTbG90X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVMT05HIFNob3J0U2xvdDsKLQotCVNob3J0U2xvdCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoU2hvcnRTbG90ID09IDEpCi0JCXBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lID0gVFJVRTsKLQllbHNlIGlmIChTaG9ydFNsb3QgPT0gMCkKLQkJcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSBGQUxTRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1Nob3J0U2xvdF9Qcm9jOjooU2hvcnRTbG90PSVkKVxuIiwgcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBUeCBwb3dlcgotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9UeFBvd2VyX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVMT05HIFR4UG93ZXI7Ci0JSU5UICAgc3VjY2VzcyA9IEZBTFNFOwotCi0JVHhQb3dlciA9IChVTE9ORykgc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlpZiAoVHhQb3dlciA8PSAxMDApCi0JewotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IFR4UG93ZXI7Ci0JCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OwotCQl9Ci0JCXN1Y2Nlc3MgPSBUUlVFOwotCX0KLQllbHNlCi0JCXN1Y2Nlc3MgPSBGQUxTRTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9UeFBvd2VyX1Byb2M6OihUeFBvd2VyUGVyY2VudGFnZT0lbGQpXG4iLCBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSkpOwotCi0JcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IDExQi8xMUcgUHJvdGVjdGlvbgotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9CR1Byb3RlY3Rpb25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0Jc3dpdGNoIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApKQotCXsKLQkJY2FzZSAwOiAvL0FVVE8KLQkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSAxOiAvL0Fsd2F5cyBPbgotCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMTsKLQkJCWJyZWFrOwotCQljYXNlIDI6IC8vQWx3YXlzIE9GRgotCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OiAgLy9JbnZhbGlkIGFyZ3VtZW50Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQkdQcm90ZWN0aW9uX1Byb2M6OihCR1Byb3RlY3Rpb249JWxkKVxuIiwgcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgVHhQcmVhbWJsZQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9UeFByZWFtYmxlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVJUXzgwMl8xMV9QUkVBTUJMRQlQcmVhbWJsZTsKLQotCVByZWFtYmxlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCi0Jc3dpdGNoIChQcmVhbWJsZSkKLQl7Ci0JCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZVNob3J0OgotCQkJcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFByZWFtYmxlOwotCi0JCQlNbG1lU2V0VHhQcmVhbWJsZShwQWQsIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCk7Ci0JCQlicmVhazsKLQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlTG9uZzoKLQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlQXV0bzoKLQkJCS8vIGlmIHVzZXIgd2FudHMgQVVUTywgaW5pdGlhbGl6ZSB0byBMT05HIGhlcmUsIHRoZW4gY2hhbmdlIGFjY29yZGluZyB0byBBUCdzCi0JCQkvLyBjYXBhYmlsaXR5IHVwb24gYXNzb2NpYXRpb24uCi0JCQlwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUHJlYW1ibGU7Ci0KLQkJCU1sbWVTZXRUeFByZWFtYmxlKHBBZCwgUnQ4MDJfMTFQcmVhbWJsZUxvbmcpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAotCQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9UeFByZWFtYmxlX1Byb2M6OihUeFByZWFtYmxlPSVsZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBSVFMgVGhyZXNob2xkCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X1JUU1RocmVzaG9sZF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQkgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRCAgICAgICAgICAgUnRzVGhyZXNoOwotCi0JUnRzVGhyZXNoID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmKChSdHNUaHJlc2ggPiAwKSAmJiAoUnRzVGhyZXNoIDw9IE1BWF9SVFNfVEhSRVNIT0xEKSkKLQkJcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkICA9IChVU0hPUlQpUnRzVGhyZXNoOwotCWVsc2UgaWYgKFJ0c1RocmVzaCA9PSAwKQotCQlwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSBNQVhfUlRTX1RIUkVTSE9MRDsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfUlRTVGhyZXNob2xkX1Byb2M6OihSVFNUaHJlc2hvbGQ9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBGcmFnbWVudCBUaHJlc2hvbGQKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfRnJhZ1RocmVzaG9sZF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQkgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgICAgIEZyYWdUaHJlc2g7Ci0KLQlGcmFnVGhyZXNoID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChGcmFnVGhyZXNoID4gTUFYX0ZSQUdfVEhSRVNIT0xEIHx8IEZyYWdUaHJlc2ggPCBNSU5fRlJBR19USFJFU0hPTEQpCi0JewotCQkvL0lsbGVnYWwgRnJhZ1RocmVzaCBzbyB3ZSBzZXQgaXQgdG8gZGVmYXVsdAotCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKLQl9Ci0JZWxzZSBpZiAoRnJhZ1RocmVzaCAlIDIgPT0gMSkKLQl7Ci0JCS8vIFRoZSBsZW5ndGggb2YgZWFjaCBmcmFnbWVudCBzaGFsbCBhbHdheXMgYmUgYW4gZXZlbiBudW1iZXIgb2Ygb2N0ZXRzLCBleGNlcHQgZm9yIHRoZSBsYXN0IGZyYWdtZW50Ci0JCS8vIG9mIGFuIE1TRFUgb3IgTU1QRFUsIHdoaWNoIG1heSBiZSBlaXRoZXIgYW4gZXZlbiBvciBhbiBvZGQgbnVtYmVyIG9mIG9jdGV0cy4KLQkJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSAoVVNIT1JUKShGcmFnVGhyZXNoIC0gMSk7Ci0JfQotCWVsc2UKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gKFVTSE9SVClGcmFnVGhyZXNoOwotCX0KLQotCXsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID09IE1BWF9GUkFHX1RIUkVTSE9MRCkKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBUUlVFOwotCQllbHNlCi0JCQlwQWQtPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gRkFMU0U7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0ZyYWdUaHJlc2hvbGRfUHJvYzo6KEZyYWdUaHJlc2hvbGQ9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFR4QnVyc3QKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfVHhCdXJzdF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlVTE9ORyBUeEJ1cnN0OwotCi0JVHhCdXJzdCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0JaWYgKFR4QnVyc3QgPT0gMSkKLQkJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBUUlVFOwotCWVsc2UgaWYgKFR4QnVyc3QgPT0gMCkKLQkJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBGQUxTRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1R4QnVyc3RfUHJvYzo6KFR4QnVyc3Q9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLSNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBUeEJ1cnN0Ci0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X1BrdEFnZ3JlZ2F0ZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlVTE9ORyBhZ2dyZTsKLQotCWFnZ3JlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChhZ2dyZSA9PSAxKQotCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gVFJVRTsKLQllbHNlIGlmIChhZ2dyZSA9PSAwKQotCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gRkFMU0U7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKLQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1BrdEFnZ3JlZ2F0ZV9Qcm9jOjooQUdHUkU9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLSNlbmRpZgotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBJRUVFODAyMTFILgotICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyAxIHdoZW4gbmVlZHMgcmFkYXIgZGV0ZWN0aW9uLCBvdGhlcndpc2UgMAotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9JRUVFODAyMTFIX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotICAgIFVMT05HIGllZWU4MDIxMWg7Ci0KLQlpZWVlODAyMTFoID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChpZWVlODAyMTFoID09IDEpCi0JCXBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID0gVFJVRTsKLQllbHNlIGlmIChpZWVlODAyMTFoID09IDApCi0JCXBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID0gRkFMU0U7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9JRUVFODAyMTFIX1Byb2M6OihJRUVFODAyMTFIPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUgpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLSNpZmRlZiBEQkcKLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgRm9yIERlYnVnIGluZm9ybWF0aW9uCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X0RlYnVnX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBTZXRfRGVidWdfUHJvYyAqKioqKioqKioqKioqKioqKioqXG4iKSk7Ci0KLSAgICBpZihzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApIDw9IFJUX0RFQlVHX0xPVUQpCi0gICAgICAgIFJURGVidWdMZXZlbCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gU2V0X0RlYnVnX1Byb2MoUlREZWJ1Z0xldmVsID0gJWxkKVxuIiwgUlREZWJ1Z0xldmVsKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLSNlbmRpZgotCi1JTlQJU2hvd19EZXNjSW5mb19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLSNpZmRlZiBSVDI4NjAKLQlJTlQgaSwgUXVlSWR4PTA7Ci0JUFJUMjhYWF9SWERfU1RSVUMgcFJ4RDsKLSAgICBQVFhEX1NUUlVDIHBUeEQ7Ci0JUFJUTVBfVFhfUklORwlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1F1ZUlkeF07Ci0JUFJUTVBfTUdNVF9SSU5HCXBNZ210UmluZyA9ICZwQWQtPk1nbXRSaW5nOwotCVBSVE1QX1JYX1JJTkcJcFJ4UmluZyA9ICZwQWQtPlJ4UmluZzsKLQotCWZvcihpPTA7aTxUWF9SSU5HX1NJWkU7aSsrKQotCXsKLQkgICAgcFR4RCA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW2ldLkFsbG9jVmE7Ci0JICAgIHByaW50aygiRGVzYyAjJWRcbiIsaSk7Ci0JICAgIGhleF9kdW1wKCJUeCBEZXNjcmlwdG9yIiwgKGNoYXIgKilwVHhELCAxNik7Ci0JICAgIHByaW50aygicFR4RC0+RE1BRE9ORSA9ICV4XG4iLCBwVHhELT5ETUFET05FKTsKLQl9Ci0JcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotCWZvcihpPTA7aTxNR01UX1JJTkdfU0laRTtpKyspCi0JewotCSAgICBwVHhEID0gKFBUWERfU1RSVUMpIHBNZ210UmluZy0+Q2VsbFtpXS5BbGxvY1ZhOwotCSAgICBwcmludGsoIkRlc2MgIyVkXG4iLGkpOwotCSAgICBoZXhfZHVtcCgiTWdtdCBEZXNjcmlwdG9yIiwgKGNoYXIgKilwVHhELCAxNik7Ci0JICAgIHByaW50aygicE1nbXQtPkRNQURPTkUgPSAleFxuIiwgcFR4RC0+RE1BRE9ORSk7Ci0JfQotCXByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLQlmb3IoaT0wO2k8UlhfUklOR19TSVpFO2krKykKLQl7Ci0JICAgIHBSeEQgPSAoUFJUMjhYWF9SWERfU1RSVUMpIHBSeFJpbmctPkNlbGxbaV0uQWxsb2NWYTsKLQkgICAgcHJpbnRrKCJEZXNjICMlZFxuIixpKTsKLQkgICAgaGV4X2R1bXAoIlJ4IERlc2NyaXB0b3IiLCAoY2hhciAqKXBSeEQsIDE2KTsKLQkJcHJpbnRrKCJwUnhELT5ERE9ORSA9ICV4XG4iLCBwUnhELT5ERE9ORSk7Ci0JfQotI2VuZGlmIC8qIFJUMjg2MCAqLwotCXJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFJlc2V0IHN0YXRpc3RpY3MgY291bnRlcgotCi0gICAgQXJndW1lbnRzOgotICAgICAgICBwQWRhcHRlciAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLSAgICAgICAgYXJnCi0KLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfUmVzZXRTdGF0Q291bnRlcl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT5TZXRfUmVzZXRTdGF0Q291bnRlcl9Qcm9jXG4iKSk7Ci0KLQkvLyBhZGQgdGhlIG1vc3QgdXAtdG8tZGF0ZSBoL3cgcmF3IGNvdW50ZXJzIGludG8gc29mdHdhcmUgY291bnRlcnMKLQlOSUNVcGRhdGVSYXdDb3VudGVycyhwQWQpOwotCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+V2xhbkNvdW50ZXJzLCBzaXplb2YoQ09VTlRFUl84MDJfMTEpKTsKLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5Db3VudGVyczgwMjMsIHNpemVvZihDT1VOVEVSXzgwMl8zKSk7Ci0JTmRpc1plcm9NZW1vcnkoJnBBZC0+UmFsaW5rQ291bnRlcnMsIHNpemVvZihDT1VOVEVSX1JBTElOSykpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUJPT0xFQU4gUlRNUENoZWNrU3RyUHJpbnRBYmxlKAotICAgIElOICBDSEFSICpwSW5QdXRTdHIsCi0gICAgSU4gIFVDSEFSIHN0ckxlbikKLXsKLSAgICBVQ0hBUiBpPTA7Ci0KLSAgICBmb3IgKGk9MDsgaTxzdHJMZW47IGkrKykKLSAgICB7Ci0gICAgICAgIGlmICgocEluUHV0U3RyW2ldIDwgMHgyMSkgfHwKLSAgICAgICAgICAgIChwSW5QdXRTdHJbaV0gPiAweDdFKSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtODYyLDIxNyArNDcsMTc0IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEICAgIFJUTVBTZXREZXNpcmVkUmF0ZXMoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgTE9ORyAgICAgICAgICAgIFJhdGVzKQordm9pZCBSVE1QU2V0RGVzaXJlZFJhdGVzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyLCBsb25nIFJhdGVzKQogewotICAgIE5ESVNfODAyXzExX1JBVEVTIGFyeVJhdGVzOworCU5ESVNfODAyXzExX1JBVEVTIGFyeVJhdGVzOwogCi0gICAgbWVtc2V0KCZhcnlSYXRlcywgMHgwMCwgc2l6ZW9mKE5ESVNfODAyXzExX1JBVEVTKSk7Ci0gICAgc3dpdGNoIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUpCi0gICAgewotICAgICAgICBjYXNlIFBIWV8xMUE6IC8vIEEgb25seQotICAgICAgICAgICAgc3dpdGNoIChSYXRlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIDYwMDAwMDA6IC8vNk0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDBjOyAvLyA2TQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgOTAwMDAwMDogLy85TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTI7IC8vIDlNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjAwMDAwMDogLy8xMk0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDE4OyAvLyAxMk0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18yOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDE4MDAwMDAwOiAvLzE4TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MjQ7IC8vIDE4TQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjQwMDAwMDA6IC8vMjRNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgzMDsgLy8gMjRNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNjAwMDAwMDogLy8zNk0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDQ4OyAvLyAzNk0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU181OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwMDAwOiAvLzQ4TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NjA7IC8vIDQ4TQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzY7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNTQwMDAwMDA6IC8vNTRNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2YzsgLy8gNTRNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAtMTogLy9BdXRvCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDZjOyAvLyA1NE1icHMKLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMV0gPSAweDYwOyAvLyA0OE1icHMKLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMl0gPSAweDQ4OyAvLyAzNk1icHMKLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbM10gPSAweDMwOyAvLyAyNE1icHMKLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNF0gPSAweDI0OyAvLyAxOE0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNV0gPSAweDE4OyAvLyAxMk0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNl0gPSAweDEyOyAvLyA5TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s3XSA9IDB4MGM7IC8vIDZNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQSFlfMTFCR19NSVhFRDogLy8gQi9HIE1peGVkCi0gICAgICAgIGNhc2UgUEhZXzExQjogLy8gQiBvbmx5Ci0gICAgICAgIGNhc2UgUEhZXzExQUJHX01JWEVEOiAvLyBBL0IvRyBNaXhlZAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgc3dpdGNoIChSYXRlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEwMDAwMDA6IC8vMU0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDAyOwotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjAwMDAwMDogLy8yTQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MDQ7Ci0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA1MDAwMDAwOiAvLzUuNU0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDBiOyAvLyA1LjVNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTAwMDAwMDogLy8xMU0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDE2OyAvLyAxMU0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18zOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDYwMDAwMDA6IC8vNk0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDBjOyAvLyA2TQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgOTAwMDAwMDogLy85TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTI7IC8vIDlNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjAwMDAwMDogLy8xMk0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDE4OyAvLyAxMk0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18yOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDE4MDAwMDAwOiAvLzE4TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MjQ7IC8vIDE4TQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjQwMDAwMDA6IC8vMjRNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgzMDsgLy8gMjRNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNjAwMDAwMDogLy8zNk0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDQ4OyAvLyAzNk0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU181OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwMDAwOiAvLzQ4TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NjA7IC8vIDQ4TQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzY7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNTQwMDAwMDA6IC8vNTRNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2YzsgLy8gNTRNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAtMTogLy9BdXRvCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKQotICAgICAgICAgICAgICAgICAgICB7IC8vQiBPbmx5Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTY7IC8vIDExTWJwcwotICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMV0gPSAweDBiOyAvLyA1LjVNYnBzCi0gICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1syXSA9IDB4MDQ7IC8vIDJNYnBzCi0gICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1szXSA9IDB4MDI7IC8vIDFNYnBzCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7IC8vKEIvRykgTWl4ZWQgb3IgKEEvQi9HKSBNaXhlZAotICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDZjOyAvLyA1NE1icHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzFdID0gMHg2MDsgLy8gNDhNYnBzCi0gICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1syXSA9IDB4NDg7IC8vIDM2TWJwcwotICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbM10gPSAweDMwOyAvLyAyNE1icHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzRdID0gMHgxNjsgLy8gMTFNYnBzCi0gICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s1XSA9IDB4MGI7IC8vIDUuNU1icHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzZdID0gMHgwNDsgLy8gMk1icHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzddID0gMHgwMjsgLy8gMU1icHMKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7Ci0gICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCAmYXJ5UmF0ZXMsIHNpemVvZihORElTXzgwMl8xMV9SQVRFUykpOwotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBSVE1QU2V0RGVzaXJlZFJhdGVzICglMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngpXG4iLAotICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdLAotICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdLAotICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzVdLAotICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICkpOwotICAgIC8vIENoYW5naW5nIERlc2lyZWRSYXRlIG1heSBhZmZlY3QgdGhlIE1BWCBUWCByYXRlIHdlIHVzZWQgdG8gVFggZnJhbWVzIG91dAotICAgIE1sbWVVcGRhdGVUeFJhdGVzKHBBZGFwdGVyLCBGQUxTRSwgMCk7Ci19Ci0KLU5ESVNfU1RBVFVTIFJUTVBXUEFSZW1vdmVLZXlQcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBWT0lECQkJcEJ1ZikKLXsKLQlQTkRJU184MDJfMTFfUkVNT1ZFX0tFWSBwS2V5OwotCVVMT05HCQkJCQlLZXlJZHg7Ci0JTkRJU19TVEFUVVMgCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQlCT09MRUFOIAliVHhLZXk7IAkJLy8gU2V0IHRoZSBrZXkgYXMgdHJhbnNtaXQga2V5Ci0JQk9PTEVBTiAJYlBhaXJ3aXNlOwkJLy8gSW5kaWNhdGUgdGhlIGtleSBpcyBwYWlyd2lzZSBrZXkKLQlCT09MRUFOIAliS2V5UlNDOwkJLy8gaW5kaWNhdGUgdGhlIHJlY2VpdmUgIFNDIHNldCBieSBLZXlSU0MgdmFsdWUuCi0JCQkJCQkJCS8vIE90aGVyd2lzZSwgaXQgd2lsbCBzZXQgYnkgdGhlIE5JQy4KLQlCT09MRUFOIAliQXV0aGVudGljYXRvcjsgLy8gaW5kaWNhdGUga2V5IGlzIHNldCBieSBhdXRoZW50aWNhdG9yLgotCUlOVCAJCWk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIi0tLT4gUlRNUFdQQVJlbW92ZUtleVByb2NcbiIpKTsKLQotCXBLZXkgPSAoUE5ESVNfODAyXzExX1JFTU9WRV9LRVkpIHBCdWY7Ci0JS2V5SWR4ID0gcEtleS0+S2V5SW5kZXggJiAweGZmOwotCS8vIEJpdCAzMSBvZiBBZGQta2V5LCBUeCBLZXkKLQliVHhLZXkJCSAgID0gKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkgPyBUUlVFIDogRkFMU0U7Ci0JLy8gQml0IDMwIG9mIEFkZC1rZXkgUGFpcndpc2VLZXkKLQliUGFpcndpc2UJICAgPSAocEtleS0+S2V5SW5kZXggJiAweDQwMDAwMDAwKSA/IFRSVUUgOiBGQUxTRTsKLQkvLyBCaXQgMjkgb2YgQWRkLWtleSBLZXlSU0MKLQliS2V5UlNDIAkgICA9IChwS2V5LT5LZXlJbmRleCAmIDB4MjAwMDAwMDApID8gVFJVRSA6IEZBTFNFOwotCS8vIEJpdCAyOCBvZiBBZGQta2V5IEF1dGhlbnRpY2F0b3IKLQliQXV0aGVudGljYXRvciA9IChwS2V5LT5LZXlJbmRleCAmIDB4MTAwMDAwMDApID8gVFJVRSA6IEZBTFNFOwotCi0JLy8gMS4gSWYgYlR4IGlzIFRSVUUsIHJldHVybiBmYWlsdXJlIGluZm9ybWF0aW9uCi0JaWYgKGJUeEtleSA9PSBUUlVFKQotCQlyZXR1cm4oTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBKTsKLQotCS8vIDIuIENoZWNrIFBhaXJ3aXNlIEtleQotCWlmIChiUGFpcndpc2UpCi0JewotCQkvLyBhLiBJZiBCU1NJRCBpcyBicm9hZGNhc3QsIHJlbW92ZSBhbGwgcGFpcndpc2Uga2V5cy4KLQkJLy8gYi4gSWYgbm90IGJyb2FkY2FzdCwgcmVtb3ZlIHRoZSBwYWlyd2lzZSBzcGVjaWZpZWQgYnkgQlNTSUQKLQkJZm9yIChpID0gMDsgaSA8IFNIQVJFX0tFWV9OVU07IGkrKykKLQkJewotCQkJaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkJzc0lkLCBwS2V5LT5CU1NJRCkpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVE1QV1BBUmVtb3ZlS2V5UHJvYyhLZXlJZHg9JWQpXG4iLCBpKSk7Ci0JCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uS2V5TGVuID0gMDsKLQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQkJCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCAoVUNIQVIpaSk7Ci0JCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQkJCQlicmVhazsKLQkJCX0KKwltZW1zZXQoJmFyeVJhdGVzLCAweDAwLCBzaXplb2YoTkRJU184MDJfMTFfUkFURVMpKTsKKwlzd2l0Y2ggKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSkgeworCWNhc2UgUEhZXzExQToJCS8qIEEgb25seSAqLworCQlzd2l0Y2ggKFJhdGVzKSB7CisJCWNhc2UgNjAwMDAwMDoJLyo2TSAqLworCQkJYXJ5UmF0ZXNbMF0gPSAweDBjOwkvKiA2TSAqLworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9CisJCQkgICAgTUNTXzA7CisJCQlicmVhazsKKwkJY2FzZSA5MDAwMDAwOgkvKjlNICovCisJCQlhcnlSYXRlc1swXSA9IDB4MTI7CS8qIDlNICovCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0KKwkJCSAgICBNQ1NfMTsKKwkJCWJyZWFrOworCQljYXNlIDEyMDAwMDAwOgkvKjEyTSAqLworCQkJYXJ5UmF0ZXNbMF0gPSAweDE4OwkvKiAxMk0gKi8KKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPQorCQkJICAgIE1DU18yOworCQkJYnJlYWs7CisJCWNhc2UgMTgwMDAwMDA6CS8qMThNICovCisJCQlhcnlSYXRlc1swXSA9IDB4MjQ7CS8qIDE4TSAqLworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9CisJCQkgICAgTUNTXzM7CisJCQlicmVhazsKKwkJY2FzZSAyNDAwMDAwMDoJLyoyNE0gKi8KKwkJCWFyeVJhdGVzWzBdID0gMHgzMDsJLyogMjRNICovCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0KKwkJCSAgICBNQ1NfNDsKKwkJCWJyZWFrOworCQljYXNlIDM2MDAwMDAwOgkvKjM2TSAqLworCQkJYXJ5UmF0ZXNbMF0gPSAweDQ4OwkvKiAzNk0gKi8KKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPQorCQkJICAgIE1DU181OworCQkJYnJlYWs7CisJCWNhc2UgNDgwMDAwMDA6CS8qNDhNICovCisJCQlhcnlSYXRlc1swXSA9IDB4NjA7CS8qIDQ4TSAqLworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9CisJCQkgICAgTUNTXzY7CisJCQlicmVhazsKKwkJY2FzZSA1NDAwMDAwMDoJLyo1NE0gKi8KKwkJCWFyeVJhdGVzWzBdID0gMHg2YzsJLyogNTRNICovCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0KKwkJCSAgICBNQ1NfNzsKKwkJCWJyZWFrOworCQljYXNlIC0xOgkvKkF1dG8gKi8KKwkJZGVmYXVsdDoKKwkJCWFyeVJhdGVzWzBdID0gMHg2YzsJLyogNTRNYnBzICovCisJCQlhcnlSYXRlc1sxXSA9IDB4NjA7CS8qIDQ4TWJwcyAqLworCQkJYXJ5UmF0ZXNbMl0gPSAweDQ4OwkvKiAzNk1icHMgKi8KKwkJCWFyeVJhdGVzWzNdID0gMHgzMDsJLyogMjRNYnBzICovCisJCQlhcnlSYXRlc1s0XSA9IDB4MjQ7CS8qIDE4TSAqLworCQkJYXJ5UmF0ZXNbNV0gPSAweDE4OwkvKiAxMk0gKi8KKwkJCWFyeVJhdGVzWzZdID0gMHgxMjsJLyogOU0gKi8KKwkJCWFyeVJhdGVzWzddID0gMHgwYzsJLyogNk0gKi8KKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPQorCQkJICAgIE1DU19BVVRPOworCQkJYnJlYWs7CiAJCX0KLQl9Ci0JLy8gMy4gR3JvdXAgS2V5Ci0JZWxzZQotCXsKLQkJLy8gYS4gSWYgQlNTSUQgaXMgYnJvYWRjYXN0LCByZW1vdmUgYWxsIGdyb3VwIGtleXMgaW5kZXhlZAotCQkvLyBiLiBJZiBCU1NJRCBtYXRjaGVkLCBkZWxldGUgdGhlIGdyb3VwIGtleSBpbmRleGVkLgotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBXUEFSZW1vdmVLZXlQcm9jKEtleUlkeD0lbGQpXG4iLCBLZXlJZHgpKTsKLQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAwOwotCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOwotCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCAoVUNIQVIpS2V5SWR4KTsKLQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJYnJlYWs7CisJY2FzZSBQSFlfMTFCR19NSVhFRDoJLyogQi9HIE1peGVkICovCisJY2FzZSBQSFlfMTFCOgkJLyogQiBvbmx5ICovCisJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6CS8qIEEvQi9HIE1peGVkICovCisJZGVmYXVsdDoKKwkJc3dpdGNoIChSYXRlcykgeworCQljYXNlIDEwMDAwMDA6CS8qMU0gKi8KKwkJCWFyeVJhdGVzWzBdID0gMHgwMjsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPQorCQkJICAgIE1DU18wOworCQkJYnJlYWs7CisJCWNhc2UgMjAwMDAwMDoJLyoyTSAqLworCQkJYXJ5UmF0ZXNbMF0gPSAweDA0OworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9CisJCQkgICAgTUNTXzE7CisJCQlicmVhazsKKwkJY2FzZSA1MDAwMDAwOgkvKjUuNU0gKi8KKwkJCWFyeVJhdGVzWzBdID0gMHgwYjsJLyogNS41TSAqLworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9CisJCQkgICAgTUNTXzI7CisJCQlicmVhazsKKwkJY2FzZSAxMTAwMDAwMDoJLyoxMU0gKi8KKwkJCWFyeVJhdGVzWzBdID0gMHgxNjsJLyogMTFNICovCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0KKwkJCSAgICBNQ1NfMzsKKwkJCWJyZWFrOworCQljYXNlIDYwMDAwMDA6CS8qNk0gKi8KKwkJCWFyeVJhdGVzWzBdID0gMHgwYzsJLyogNk0gKi8KKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPQorCQkJICAgIE1DU18wOworCQkJYnJlYWs7CisJCWNhc2UgOTAwMDAwMDoJLyo5TSAqLworCQkJYXJ5UmF0ZXNbMF0gPSAweDEyOwkvKiA5TSAqLworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9CisJCQkgICAgTUNTXzE7CisJCQlicmVhazsKKwkJY2FzZSAxMjAwMDAwMDoJLyoxMk0gKi8KKwkJCWFyeVJhdGVzWzBdID0gMHgxODsJLyogMTJNICovCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0KKwkJCSAgICBNQ1NfMjsKKwkJCWJyZWFrOworCQljYXNlIDE4MDAwMDAwOgkvKjE4TSAqLworCQkJYXJ5UmF0ZXNbMF0gPSAweDI0OwkvKiAxOE0gKi8KKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPQorCQkJICAgIE1DU18zOworCQkJYnJlYWs7CisJCWNhc2UgMjQwMDAwMDA6CS8qMjRNICovCisJCQlhcnlSYXRlc1swXSA9IDB4MzA7CS8qIDI0TSAqLworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9CisJCQkgICAgTUNTXzQ7CisJCQlicmVhazsKKwkJY2FzZSAzNjAwMDAwMDoJLyozNk0gKi8KKwkJCWFyeVJhdGVzWzBdID0gMHg0ODsJLyogMzZNICovCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0KKwkJCSAgICBNQ1NfNTsKKwkJCWJyZWFrOworCQljYXNlIDQ4MDAwMDAwOgkvKjQ4TSAqLworCQkJYXJ5UmF0ZXNbMF0gPSAweDYwOwkvKiA0OE0gKi8KKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPQorCQkJICAgIE1DU182OworCQkJYnJlYWs7CisJCWNhc2UgNTQwMDAwMDA6CS8qNTRNICovCisJCQlhcnlSYXRlc1swXSA9IDB4NmM7CS8qIDU0TSAqLworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9CisJCQkgICAgTUNTXzc7CisJCQlicmVhazsKKwkJY2FzZSAtMToJLypBdXRvICovCisJCWRlZmF1bHQ6CisJCQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpIHsJLypCIE9ubHkgKi8KKwkJCQlhcnlSYXRlc1swXSA9IDB4MTY7CS8qIDExTWJwcyAqLworCQkJCWFyeVJhdGVzWzFdID0gMHgwYjsJLyogNS41TWJwcyAqLworCQkJCWFyeVJhdGVzWzJdID0gMHgwNDsJLyogMk1icHMgKi8KKwkJCQlhcnlSYXRlc1szXSA9IDB4MDI7CS8qIDFNYnBzICovCisJCQl9IGVsc2UgewkvKihCL0cpIE1peGVkIG9yIChBL0IvRykgTWl4ZWQgKi8KKwkJCQlhcnlSYXRlc1swXSA9IDB4NmM7CS8qIDU0TWJwcyAqLworCQkJCWFyeVJhdGVzWzFdID0gMHg2MDsJLyogNDhNYnBzICovCisJCQkJYXJ5UmF0ZXNbMl0gPSAweDQ4OwkvKiAzNk1icHMgKi8KKwkJCQlhcnlSYXRlc1szXSA9IDB4MzA7CS8qIDI0TWJwcyAqLworCQkJCWFyeVJhdGVzWzRdID0gMHgxNjsJLyogMTFNYnBzICovCisJCQkJYXJ5UmF0ZXNbNV0gPSAweDBiOwkvKiA1LjVNYnBzICovCisJCQkJYXJ5UmF0ZXNbNl0gPSAweDA0OwkvKiAyTWJwcyAqLworCQkJCWFyeVJhdGVzWzddID0gMHgwMjsJLyogMU1icHMgKi8KKwkJCX0KKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPQorCQkJICAgIE1DU19BVVRPOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CiAJfQogCi0JcmV0dXJuIChTdGF0dXMpOworCU5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZSwKKwkJICAgICAgIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwlOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGUsICZhcnlSYXRlcywKKwkJICAgICAgIHNpemVvZihORElTXzgwMl8xMV9SQVRFUykpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCIgUlRNUFNldERlc2lyZWRSYXRlcyAoJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4KVxuIiwKKwkJICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0sCisJCSAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdLAorCQkgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSwKKwkJICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10sCisJCSAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzRdLAorCQkgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs1XSwKKwkJICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0sCisJCSAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddKSk7CisJLyogQ2hhbmdpbmcgRGVzaXJlZFJhdGUgbWF5IGFmZmVjdCB0aGUgTUFYIFRYIHJhdGUgd2UgdXNlZCB0byBUWCBmcmFtZXMgb3V0ICovCisJTWxtZVVwZGF0ZVR4UmF0ZXMocEFkYXB0ZXIsIEZBTFNFLCAwKTsKIH0KIAogLyoKQEAgLTEwOTMsNDAgKzIzNSw2NSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVE1QV1BBUmVtb3ZlQWxsS2V5cygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3ZvaWQgUlRNUFdQQVJlbW92ZUFsbEtleXMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewogCi0JVUNIQVIgCWk7CisJdTggaTsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFdQQVJlbW92ZUFsbEtleXMoQXV0aE1vZGU9JWQsIFdlcFN0YXR1cz0lZClcbiIsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMpKTsKLQotCS8vIEZvciBXRVAvQ0tJUCwgdGhlcmUgaXMgbm8gbmVlZCB0byByZW1vdmUgaXQsIHNpbmNlIFdpblhQIHdvbid0IHNldCBpdCBhZ2FpbiBhZnRlcgotCS8vIExpbmsgdXAuIEFuZCBpdCB3aWxsIGJlIHJlcGxhY2VkIGlmIHVzZXIgY2hhbmdlZCBpdC4KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiUlRNUFdQQVJlbW92ZUFsbEtleXMoQXV0aE1vZGU9JWQsIFdlcFN0YXR1cz0lZClcbiIsCisJCSAgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykpOworCVJUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsKKwkvKiBGb3IgV0VQL0NLSVAsIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVtb3ZlIGl0LCBzaW5jZSBXaW5YUCB3b24ndCBzZXQgaXQgYWdhaW4gYWZ0ZXIgKi8KKwkvKiBMaW5rIHVwLiBBbmQgaXQgd2lsbCBiZSByZXBsYWNlZCBpZiB1c2VyIGNoYW5nZWQgaXQuICovCiAJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQogCQlyZXR1cm47CiAKLQkvLyBGb3IgV1BBLU5vbmUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVtb3ZlIGl0LCBzaW5jZSBXaW5YUCB3b24ndCBzZXQgaXQgYWdhaW4gYWZ0ZXIKLQkvLyBMaW5rIHVwLiBBbmQgaXQgd2lsbCBiZSByZXBsYWNlZCBpZiB1c2VyIGNoYW5nZWQgaXQuCisJLyogRm9yIFdQQS1Ob25lLCB0aGVyZSBpcyBubyBuZWVkIHRvIHJlbW92ZSBpdCwgc2luY2UgV2luWFAgd29uJ3Qgc2V0IGl0IGFnYWluIGFmdGVyICovCisJLyogTGluayB1cC4gQW5kIGl0IHdpbGwgYmUgcmVwbGFjZWQgaWYgdXNlciBjaGFuZ2VkIGl0LiAqLwogCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQogCQlyZXR1cm47CiAKLQkvLyBzZXQgQlNTSUQgd2NpZCBlbnRyeSBvZiB0aGUgUGFpci13aXNlIEtleSB0YWJsZSBhcyBuby1zZWN1cml0eSBtb2RlCisJLyogc2V0IEJTU0lEIHdjaWQgZW50cnkgb2YgdGhlIFBhaXItd2lzZSBLZXkgdGFibGUgYXMgbm8tc2VjdXJpdHkgbW9kZSAqLwogCUFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwgQlNTMCwgQlNTSURfV0NJRCk7CiAKLQkvLyBzZXQgYWxsIHNoYXJlZCBrZXkgbW9kZSBhcyBuby1zZWN1cml0eS4KLQlmb3IgKGkgPSAwOyBpIDwgU0hBUkVfS0VZX05VTTsgaSsrKQotICAgIHsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJyZW1vdmUgJXMga2V5ICMlZFxuIiwgQ2lwaGVyTmFtZVtwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGddLCBpKSk7Ci0JCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVtpXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKwkvKiBzZXQgYWxsIHNoYXJlZCBrZXkgbW9kZSBhcyBuby1zZWN1cml0eS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgU0hBUkVfS0VZX05VTTsgaSsrKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgicmVtb3ZlICVzIGtleSAjJWRcbiIsCisJCQkgIENpcGhlck5hbWVbcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnXSwgaSkpOworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0sIHNpemVvZihzdHJ1Y3QgcnRfY2lwaGVyX2tleSkpOwogCiAJCUFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIGkpOwogCX0KLQorCVJUTVBfU0VUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7CiB9CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlBcyBTVEEncyBCU1NJRCBpcyBhIFdDIHRvbywgaXQgdXNlcyBzaGFyZWQga2V5IHRhYmxlLgorCQlUaGlzIGZ1bmN0aW9uIHdyaXRlIGNvcnJlY3QgdW5pY2FzdCBUWCBrZXkgdG8gQVNJQyBXQ0lELgorCQlBbmQgd2Ugc3RpbGwgbWFrZSBhIGNvcHkgaW4gb3VyIE1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LgorCQlDYWxsZXIgZ3VhcmFudGVlIFRLSVAvQUVTIGFsd2F5cyBoYXMga2V5aWR4ID0gMC4gKHBhaXJ3aXNlIGtleSkKKwkJQ2FsbGVyIGd1YXJhbnRlZSBXRVAgY2FsbHMgdGhpcyBmdW5jdGlvbiB3aGVuIHNldCBUeGtleSwgIGRlZmF1bHQga2V5IGluZGV4PTB+My4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBLZXkJCQkJCQkJUG9pbnRlciB0byB0aGUgd2hlcmUgdGhlIGtleSBzdG9yZWQKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVUNDRVNTCQkJCQlBZGQga2V5IHN1Y2Nlc3NmdWxseQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAlSb3V0aW5lIERlc2NyaXB0aW9uOgogCQlDaGFuZ2UgTklDIFBIWSBtb2RlLiBSZS1hc3NvY2lhdGlvbiBtYXkgYmUgbmVjZXNzYXJ5LiBwb3NzaWJsZSBzZXR0aW5ncwogCQlpbmNsdWRlIC0gUEhZXzExQiwgUEhZXzExQkdfTUlYRUQsIFBIWV8xMUEsIGFuZCBQSFlfMTFBQkdfTUlYRUQKQEAgLTExNDAsMTE1ICszMDcsMTE5IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUTVBTZXRQaHlNb2RlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVMT05HIHBoeW1vZGUpCit2b2lkIFJUTVBTZXRQaHlNb2RlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdW5zaWduZWQgbG9uZyBwaHltb2RlKQogewotCUlOVCBpOwotCS8vIHRoZSBzZWxlY3RlZCBwaHltb2RlIG11c3QgYmUgc3VwcG9ydGVkIGJ5IHRoZSBSRiBJQyBlbmNvZGVkIGluIEUyUFJPTQorCWludCBpOworCS8qIHRoZSBzZWxlY3RlZCBwaHltb2RlIG11c3QgYmUgc3VwcG9ydGVkIGJ5IHRoZSBSRiBJQyBlbmNvZGVkIGluIEUyUFJPTSAqLwogCi0JcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IChVQ0hBUilwaHltb2RlOworCS8qIGlmIG5vIGNoYW5nZSwgZG8gbm90aGluZyAqLworCS8qIGJ1ZyBmaXgKKwkgICBpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBwaHltb2RlKQorCSAgIHJldHVybjsKKwkgKi8KKwlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gKHU4KXBoeW1vZGU7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBTZXRQaHlNb2RlIDogUGh5TW9kZT0lZCwgY2hhbm5lbD0lZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiUlRNUFNldFBoeU1vZGUgOiBQaHlNb2RlPSVkLCBjaGFubmVsPSVkIFxuIiwKKwkJICBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CiAKIAlCdWlsZENoYW5uZWxMaXN0KHBBZCk7CiAKLQkvLyBzYW5pdHkgY2hlY2sgdXNlciBzZXR0aW5nCi0JZm9yIChpID0gMDsgaSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykKLQl7CisJLyogc2FuaXR5IGNoZWNrIHVzZXIgc2V0dGluZyAqLworCWZvciAoaSA9IDA7IGkgPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspIHsKIAkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQogCQkJYnJlYWs7CiAJfQogCi0JaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkKLQl7CisJaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkgewogCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gRmlyc3RDaGFubmVsKHBBZCk7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTZXRQaHlNb2RlOiBjaGFubmVsIGlzIG91dCBvZiByYW5nZSwgdXNlIGZpcnN0IGNoYW5uZWw9JWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiUlRNUFNldFBoeU1vZGU6IGNoYW5uZWwgaXMgb3V0IG9mIHJhbmdlLCB1c2UgZmlyc3QgY2hhbm5lbD0lZCBcbiIsCisJCQkgIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKIAl9CiAKIAlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5TdXBSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CiAJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuRXh0UmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOwogCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKIAlzd2l0Y2ggKHBoeW1vZGUpIHsKLQkJY2FzZSBQSFlfMTFCOgotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVswXSAgPSAweDgyOwkgIC8vIDEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMV0gID0gMHg4NDsJICAvLyAyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzJdICA9IDB4OEI7CSAgLy8gNS41IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzNdICA9IDB4OTY7CSAgLy8gMTEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW4gID0gNDsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW4gID0gMDsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0gID0gMjsJICAgLy8gMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxXSAgPSA0OwkgICAvLyAyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzJdICA9IDExOyAgICAvLyA1LjUgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10gID0gMjI7ICAgIC8vIDExIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQkvL3BBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7IC8vIFRoaXMgTU9ERSBpcyBvbmx5IEZZSS4gbm90IHVzZQotCQkJYnJlYWs7CisJY2FzZSBQSFlfMTFCOgorCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzBdID0gMHg4MjsJLyogMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZSAqLworCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzFdID0gMHg4NDsJLyogMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZSAqLworCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzJdID0gMHg4QjsJLyogNS41IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlICovCisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbM10gPSAweDk2OwkvKiAxMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZSAqLworCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuID0gNDsKKwkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0gPSAyOwkvKiAxIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0gPSA0OwkvKiAyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0gPSAxMTsJLyogNS41IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10gPSAyMjsJLyogMTEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJLypwQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOyAvLyBUaGlzIE1PREUgaXMgb25seSBGWUkuIG5vdCB1c2UgKi8KKwkJYnJlYWs7CiAKLQkJY2FzZSBQSFlfMTFHOgotCQljYXNlIFBIWV8xMUJHX01JWEVEOgotCQljYXNlIFBIWV8xMUFCR19NSVhFRDoKLQkJY2FzZSBQSFlfMTFOXzJfNEc6Ci0JCWNhc2UgUEhZXzExQUJHTl9NSVhFRDoKLQkJY2FzZSBQSFlfMTFCR05fTUlYRUQ6Ci0JCWNhc2UgUEhZXzExR05fTUlYRUQ6Ci0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzBdICA9IDB4ODI7CSAgLy8gMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsxXSAgPSAweDg0OwkgIC8vIDIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMl0gID0gMHg4QjsJICAvLyA1LjUgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbM10gID0gMHg5NjsJICAvLyAxMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs0XSAgPSAweDEyOwkgIC8vIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNV0gID0gMHgyNDsJICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs2XSAgPSAweDQ4OwkgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzddICA9IDB4NmM7CSAgLy8gNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW4gID0gODsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbMF0gID0gMHgwQzsJICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzFdICA9IDB4MTg7CSAgLy8gMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbMl0gID0gMHgzMDsJICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZVszXSAgPSAweDYwOwkgIC8vIDQ4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuICA9IDQ7Ci0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzBdICA9IDI7CSAgIC8vIDEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0gID0gNDsJICAgLy8gMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSAgPSAxMTsgICAgLy8gNS41IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdICA9IDIyOyAgICAvLyAxMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs0XSAgPSAxMjsgICAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs1XSAgPSAxODsgICAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs2XSAgPSAyNDsgICAgLy8gMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbN10gID0gMzY7ICAgIC8vIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzhdICA9IDQ4OyAgICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs5XSAgPSA3MjsgICAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMTBdID0gOTY7ICAgIC8vIDQ4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzExXSA9IDEwODsgICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJYnJlYWs7CisJY2FzZSBQSFlfMTFHOgorCWNhc2UgUEhZXzExQkdfTUlYRUQ6CisJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6CisJY2FzZSBQSFlfMTFOXzJfNEc6CisJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgorCWNhc2UgUEhZXzExQkdOX01JWEVEOgorCWNhc2UgUEhZXzExR05fTUlYRUQ6CisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF0gPSAweDgyOwkvKiAxIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlICovCisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMV0gPSAweDg0OwkvKiAyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlICovCisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMl0gPSAweDhCOwkvKiA1LjUgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUgKi8KKwkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVszXSA9IDB4OTY7CS8qIDExIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlICovCisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNF0gPSAweDEyOwkvKiA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNV0gPSAweDI0OwkvKiAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzZdID0gMHg0ODsJLyogMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs3XSA9IDB4NmM7CS8qIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW4gPSA4OworCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzBdID0gMHgwQzsJLyogNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzFdID0gMHgxODsJLyogMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZVsyXSA9IDB4MzA7CS8qIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbM10gPSAweDYwOwkvKiA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuID0gNDsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSA9IDI7CS8qIDEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxXSA9IDQ7CS8qIDIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSA9IDExOwkvKiA1LjUgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVszXSA9IDIyOwkvKiAxMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzRdID0gMTI7CS8qIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs1XSA9IDE4OwkvKiA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0gPSAyNDsJLyogMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs3XSA9IDM2OwkvKiAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzhdID0gNDg7CS8qIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbOV0gPSA3MjsJLyogMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxMF0gPSA5NjsJLyogNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxMV0gPSAxMDg7CS8qIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCWJyZWFrOwogCi0JCWNhc2UgUEhZXzExQToKLQkJY2FzZSBQSFlfMTFBTl9NSVhFRDoKLQkJY2FzZSBQSFlfMTFBR05fTUlYRUQ6Ci0JCWNhc2UgUEhZXzExTl81RzoKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF0gID0gMHg4QzsJICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzFdICA9IDB4MTI7CSAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsyXSAgPSAweDk4OwkgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzNdICA9IDB4MjQ7CSAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNF0gID0gMHhiMDsJICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs1XSAgPSAweDQ4OwkgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzZdICA9IDB4NjA7CSAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbN10gID0gMHg2YzsJICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiAgPSA4OwotCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiAgPSAwOwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSAgPSAxMjsgICAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxXSAgPSAxODsgICAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSAgPSAyNDsgICAgLy8gMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10gID0gMzY7ICAgIC8vIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzRdICA9IDQ4OyAgICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs1XSAgPSA3MjsgICAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0gID0gOTY7ICAgIC8vIDQ4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICA9IDEwODsgICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsgLy8gVGhpcyBNT0RFIGlzIG9ubHkgRllJLiBub3QgdXNlCi0JCQlicmVhazsKKwljYXNlIFBIWV8xMUE6CisJY2FzZSBQSFlfMTFBTl9NSVhFRDoKKwljYXNlIFBIWV8xMUFHTl9NSVhFRDoKKwljYXNlIFBIWV8xMU5fNUc6CisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF0gPSAweDhDOwkvKiA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlICovCisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMV0gPSAweDEyOwkvKiA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMl0gPSAweDk4OwkvKiAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZSAqLworCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzNdID0gMHgyNDsJLyogMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs0XSA9IDB4YjA7CS8qIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlICovCisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNV0gPSAweDQ4OwkvKiAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzZdID0gMHg2MDsJLyogNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs3XSA9IDB4NmM7CS8qIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW4gPSA4OworCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuID0gMDsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSA9IDEyOwkvKiA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0gPSAxODsJLyogOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzJdID0gMjQ7CS8qIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10gPSAzNjsJLyogMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs0XSA9IDQ4OwkvKiAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzVdID0gNzI7CS8qIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0gPSA5NjsJLyogNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs3XSA9IDEwODsJLyogNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJLypwQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsgLy8gVGhpcyBNT0RFIGlzIG9ubHkgRllJLiBub3QgdXNlICovCisJCWJyZWFrOwogCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKIAl9CiAKLQogCXBBZC0+Q29tbW9uQ2ZnLkJhbmRTdGF0ZSA9IFVOS05PV05fQkFORDsKIH0KIApAQCAtMTI2NCwzNCArNDM1LDMzIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUTVBTZXRIVCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglPSURfU0VUX0hUX1BIWU1PREUgKnBIVFBoeU1vZGUpCit2b2lkIFJUTVBTZXRIVChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9vaWRfc2V0X2h0X3BoeW1vZGUgKnBIVFBoeU1vZGUpCiB7Ci0JLy9VTE9ORwkqcG1jczsKLQlVSU5UMzIJVmFsdWUgPSAwOwotCVVDSEFSCUJCUFZhbHVlID0gMDsKLQlVQ0hBUglCQlAzVmFsdWUgPSAwOwotCVVDSEFSCVJ4U3RyZWFtID0gcEFkLT5Db21tb25DZmcuUnhTdHJlYW07CisJLyp1bnNpZ25lZCBsb25nICpwbWNzOyAqLworCXUzMiBWYWx1ZSA9IDA7CisJdTggQkJQVmFsdWUgPSAwOworCXU4IEJCUDNWYWx1ZSA9IDA7CisJdTggUnhTdHJlYW0gPSBwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbTsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTZXRIVCA6IEhUX21vZGUoJWQpLCBFeHRPZmZzZXQoJWQpLCBNQ1MoJWQpLCBCVyglZCksIFNUQkMoJWQpLCBTSE9SVEdJKCVkKVxuIiwKLQkJCQkJCQkJCQlwSFRQaHlNb2RlLT5IdE1vZGUsIHBIVFBoeU1vZGUtPkV4dE9mZnNldCwKLQkJCQkJCQkJCQlwSFRQaHlNb2RlLT5NQ1MsIHBIVFBoeU1vZGUtPkJXLAotCQkJCQkJCQkJCXBIVFBoeU1vZGUtPlNUQkMsIHBIVFBoeU1vZGUtPlNIT1JUR0kpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiUlRNUFNldEhUIDogSFRfbW9kZSglZCksIEV4dE9mZnNldCglZCksIE1DUyglZCksIEJXKCVkKSwgU1RCQyglZCksIFNIT1JUR0koJWQpXG4iLAorCQkgIHBIVFBoeU1vZGUtPkh0TW9kZSwgcEhUUGh5TW9kZS0+RXh0T2Zmc2V0LCBwSFRQaHlNb2RlLT5NQ1MsCisJCSAgcEhUUGh5TW9kZS0+QlcsIHBIVFBoeU1vZGUtPlNUQkMsIHBIVFBoeU1vZGUtPlNIT1JUR0kpKTsKIAotCS8vIERvbid0IHplcm8gc3VwcG9ydGVkSHlQaHkgc3RydWN0dXJlLgotCVJUTVBaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksIHNpemVvZihwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkpKTsKLQlSVE1QWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLCBzaXplb2YocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvKSk7Ci0JUlRNUFplcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLk5ld0V4dENoYW5PZmZzZXQsIHNpemVvZihwQWQtPkNvbW1vbkNmZy5OZXdFeHRDaGFuT2Zmc2V0KSk7Ci0JUlRNUFplcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeSwgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeSkpOworCS8qIERvbid0IHplcm8gc3VwcG9ydGVkSHlQaHkgc3RydWN0dXJlLiAqLworCVJUTVBaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCisJCSAgICAgICBzaXplb2YocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5KSk7CisJUlRNUFplcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywKKwkJICAgICAgIHNpemVvZihwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pKTsKKwlSVE1QWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuTmV3RXh0Q2hhbk9mZnNldCwKKwkJICAgICAgIHNpemVvZihwQWQtPkNvbW1vbkNmZy5OZXdFeHRDaGFuT2Zmc2V0KSk7CisJUlRNUFplcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeSwKKwkJICAgICAgIHNpemVvZihwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkpKTsKIAotICAgCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnKQotCXsKKwlpZiAocEFkLT5Db21tb25DZmcuYlJkZykgewogCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMgPSAxOwogCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlJER1N1cHBvcnQgPSAxOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9IDA7CiAJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCA9IDA7CiAJfQpAQCAtMTI5OSw4OSArNDY5LDkyIEBACiAJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3IgPSAzOwogCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NYXhSQW1wZHVGYWN0b3IgPSAzOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNldEhUIDogUnhCQVdpbkxpbWl0ID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiUlRNUFNldEhUIDogUnhCQVdpbkxpbWl0ID0gJWRcbiIsCisJCSAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCkpOwogCi0JLy8gTWltbyBwb3dlciBzYXZlLCBBLU1TRFUgc2l6ZSwKLQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZTsKLQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdVNpemU7Ci0JcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcyA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGU7Ci0JcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eTsKKwkvKiBNaW1vIHBvd2VyIHNhdmUsIEEtTVNEVSBzaXplLCAqLworCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSA9CisJICAgICh1MTYpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlOworCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUgPQorCSAgICAodTgpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1U2l6ZTsKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzID0KKwkgICAgKHU4KXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZTsKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHkgPQorCSAgICAodTgpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5OwogCi0JcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemUgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdVNpemU7Ci0JcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZTsKLQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eTsKKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9CisJICAgICh1MTYpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1U2l6ZTsKKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9CisJICAgICh1MTYpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlOworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHkgPQorCSAgICAodTgpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5OwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNldEhUIDogQU1zZHVTaXplID0gJWQsIE1pbW9QcyA9ICVkLCBNcGR1RGVuc2l0eSA9ICVkLCBNYXhSQW1wZHVGYWN0b3IgPSAlZFxuIiwKLQkJCQkJCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplLAotCQkJCQkJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMsCi0JCQkJCQkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5LAotCQkJCQkJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NYXhSQW1wZHVGYWN0b3IpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiUlRNUFNldEhUIDogQU1zZHVTaXplID0gJWQsIE1pbW9QcyA9ICVkLCBNcGR1RGVuc2l0eSA9ICVkLCBNYXhSQW1wZHVGYWN0b3IgPSAlZFxuIiwKKwkJICBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplLAorCQkgIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMsCisJCSAgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5LAorCQkgIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NYXhSQW1wZHVGYWN0b3IpKTsKIAotCWlmKHBIVFBoeU1vZGUtPkh0TW9kZSA9PSBIVE1PREVfR0YpCi0JeworCWlmIChwSFRQaHlNb2RlLT5IdE1vZGUgPT0gSFRNT0RFX0dGKSB7CiAJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uR0YgPSAxOwogCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YgPSAxOwotCX0KLQllbHNlCisJfSBlbHNlCiAJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRiA9IDA7CiAKLQkvLyBEZWNpZGUgUnggTUNTU2V0Ci0Jc3dpdGNoIChSeFN0cmVhbSkKLQl7Ci0JCWNhc2UgMToKLQkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAgMHhmZjsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAgMHgwMDsKLQkJCWJyZWFrOworCS8qIERlY2lkZSBSeCBNQ1NTZXQgKi8KKwlzd2l0Y2ggKFJ4U3RyZWFtKSB7CisJY2FzZSAxOgorCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMHhmZjsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDB4MDA7CisJCWJyZWFrOwogCi0JCWNhc2UgMjoKLQkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAgMHhmZjsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAgMHhmZjsKLQkJCWJyZWFrOworCWNhc2UgMjoKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDB4ZmY7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAweGZmOworCQlicmVhazsKIAotCQljYXNlIDM6IC8vIDMqMwotCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9ICAweGZmOwotCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9ICAweGZmOwotCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSA9ICAweGZmOwotCQkJYnJlYWs7CisJY2FzZSAzOgkJLyogMyozICovCisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAweGZmOworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMHhmZjsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSA9IDB4ZmY7CisJCWJyZWFrOwogCX0KIAotCWlmIChwQWQtPkNvbW1vbkNmZy5iRm9ydHlfTWh6X0ludG9sZXJhbnQgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpICYmIChwSFRQaHlNb2RlLT5CVyA9PSBCV180MCkgKQotCXsKKwlpZiAocEFkLT5Db21tb25DZmcuYkZvcnR5X01oel9JbnRvbGVyYW50CisJICAgICYmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KSAmJiAocEhUUGh5TW9kZS0+QlcgPT0gQldfNDApKSB7CiAJCXBIVFBoeU1vZGUtPkJXID0gQldfMjA7CiAJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uRm9ydHlfTWh6X0ludG9sZXJhbnQgPSAxOwogCX0KIAotCWlmKHBIVFBoeU1vZGUtPkJXID09IEJXXzQwKQotCXsKLQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFs0XSA9IDB4MTsgLy8gTUNTIDMyCisJaWYgKHBIVFBoeU1vZGUtPkJXID09IEJXXzQwKSB7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0gPSAweDE7CS8qIE1DUyAzMiAqLwogCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9IDE7CiAJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KQogCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DQ0ttb2RlaW40MCA9IDE7CiAKIAkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCA9IDE7CiAJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCA9IDE7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9IChwSFRQaHlNb2RlLT5FeHRPZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKT8gKEVYVENIQV9CRUxPVyk6IEVYVENIQV9BQk9WRTsKLQkJLy8gU2V0IFJlZ3NpdGVyIGZvciBleHRlbnNpb24gY2hhbm5lbCBwb3NpdGlvbi4KKwkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID0KKwkJICAgIChwSFRQaHlNb2RlLT5FeHRPZmZzZXQgPT0KKwkJICAgICBFWFRDSEFfQkVMT1cpID8gKEVYVENIQV9CRUxPVykgOiBFWFRDSEFfQUJPVkU7CisJCS8qIFNldCBSZWdzaXRlciBmb3IgZXh0ZW5zaW9uIGNoYW5uZWwgcG9zaXRpb24uICovCiAJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZWYWx1ZSk7CiAJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJCUDNWYWx1ZSk7Ci0JCWlmICgocEhUUGh5TW9kZS0+RXh0T2Zmc2V0ID09IEVYVENIQV9CRUxPVykpCi0JCXsKKwkJaWYgKChwSFRQaHlNb2RlLT5FeHRPZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKSkgewogCQkJVmFsdWUgfD0gMHgxOwogCQkJQkJQM1ZhbHVlIHw9ICgweDIwKTsKIAkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAoKHBIVFBoeU1vZGUtPkV4dE9mZnNldCA9PSBFWFRDSEFfQUJPVkUpKQotCQl7CisJCX0gZWxzZSBpZiAoKHBIVFBoeU1vZGUtPkV4dE9mZnNldCA9PSBFWFRDSEFfQUJPVkUpKSB7CiAJCQlWYWx1ZSAmPSAweGZlOwogCQkJQkJQM1ZhbHVlICY9ICh+MHgyMCk7CiAJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgVmFsdWUpOwogCQl9Ci0KLQkJLy8gVHVybiBvbiBCQlAgNDBNSHogbW9kZSBub3cgb25seSBhcyBBUCAuCi0JCS8vIFN0YSBjYW4gdHVybiBvbiBCQlAgNDBNSHogYWZ0ZXIgY29ubmVjdGlvbiB3aXRoIDQwTUh6IEFQLiBTdGEgb25seSBicm9hZGNhc3QgNDBNSHogY2FwYWJpbGl0eSBiZWZvcmUgY29ubmVjdGlvbi4KKwkJLyogVHVybiBvbiBCQlAgNDBNSHogbW9kZSBub3cgb25seSBhcyBBUCAuICovCisJCS8qIFN0YSBjYW4gdHVybiBvbiBCQlAgNDBNSHogYWZ0ZXIgY29ubmVjdGlvbiB3aXRoIDQwTUh6IEFQLiBTdGEgb25seSBicm9hZGNhc3QgNDBNSHogY2FwYWJpbGl0eSBiZWZvcmUgY29ubmVjdGlvbi4gKi8KIAkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApIHx8IElORlJBX09OKHBBZCkgfHwgQURIT0NfT04ocEFkKQotCQkJKQotCQl7CisJCSAgICApIHsKIAkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKIAkJCUJCUFZhbHVlICY9ICh+MHgxOCk7CiAJCQlCQlBWYWx1ZSB8PSAweDEwOwpAQCAtMTM5MCwxNSArNTYzLDEzIEBACiAJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlAzVmFsdWUpOwogCQkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CiAJCX0KLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9IDA7CiAJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGggPSAwOwogCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGggPSAwOwogCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPSBFWFRDSEFfTk9ORTsKIAkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwotCQkvLyBUdXJuIG9uIEJCUCAyME1IeiBtb2RlIGJ5IHJlcXVlc3QgaGVyZS4KKwkJLyogVHVybiBvbiBCQlAgMjBNSHogbW9kZSBieSByZXF1ZXN0IGhlcmUuICovCiAJCXsKIAkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKIAkJCUJCUFZhbHVlICY9ICh+MHgxOCk7CkBAIC0xNDA3LDQyICs1NzgsMzUgQEAKIAkJfQogCX0KIAotCWlmKHBIVFBoeU1vZGUtPlNUQkMgPT0gU1RCQ19VU0UpCi0JeworCWlmIChwSFRQaHlNb2RlLT5TVEJDID09IFNUQkNfVVNFKSB7CiAJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDID0gMTsKIAkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQyA9IDE7CiAJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDID0gMTsKIAkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlJ4U1RCQyA9IDE7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQyA9IDA7CiAJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5SeFNUQkMgPSAwOwogCX0KIAotCWlmKHBIVFBoeU1vZGUtPlNIT1JUR0kgPT0gR0lfNDAwKQotCXsKKwlpZiAocEhUUGh5TW9kZS0+U0hPUlRHSSA9PSBHSV80MDApIHsKIAkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjAgPSAxOwogCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCA9IDE7CiAJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjAgPSAxOwogCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwID0gMTsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCA9IDA7CiAJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gMDsKIAkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCA9IDA7CiAJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDAgPSAwOwogCX0KIAotCS8vIFdlIHN1cHBvcnQgbGluayBhZGFwdGF0aW9uIGZvciB1bnNvbGljaXQgTUNTIGZlZWRiYWNrLCBzZXQgdG8gMi4KLQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLk1DU0ZlZWRiYWNrID0gTUNTRkJLX05PTkU7IC8vTUNTRkJLX1VOU09MSUNJVDsKKwkvKiBXZSBzdXBwb3J0IGxpbmsgYWRhcHRhdGlvbiBmb3IgdW5zb2xpY2l0IE1DUyBmZWVkYmFjaywgc2V0IHRvIDIuICovCisJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5NQ1NGZWVkYmFjayA9IE1DU0ZCS19OT05FOwkvKk1DU0ZCS19VTlNPTElDSVQ7ICovCiAJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkNvbnRyb2xDaGFuID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKLQkvLyAxLCB0aGUgZXh0ZW5zaW9uIGNoYW5uZWwgYWJvdmUgdGhlIGNvbnRyb2wgY2hhbm5lbC4KKwkvKiAxLCB0aGUgZXh0ZW5zaW9uIGNoYW5uZWwgYWJvdmUgdGhlIGNvbnRyb2wgY2hhbm5lbC4gKi8KIAotCS8vIEVEQ0EgcGFyYW1ldGVycyB1c2VkIGZvciBBUCdzIG93biB0cmFuc21pc3Npb24KLQlpZiAocEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iVmFsaWQgPT0gRkFMU0UpCi0JeworCS8qIEVEQ0EgcGFyYW1ldGVycyB1c2VkIGZvciBBUCdzIG93biB0cmFuc21pc3Npb24gKi8KKwlpZiAocEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iVmFsaWQgPT0gRkFMU0UpIHsKIAkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iVmFsaWQgPSBUUlVFOwogCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzBdID0gMzsKIAkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblsxXSA9IDc7CkBAIC0xNDU5LDE0ICs2MjMsMTcgQEAKIAkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFsyXSA9IDQ7CiAJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbM10gPSAzOwogCi0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFswXSAgPSAwOwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMV0gID0gMDsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzJdICA9IDk0OwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbM10gID0gNDc7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFswXSA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFsxXSA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFsyXSA9IDk0OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbM10gPSA0NzsKIAl9CiAJQXNpY1NldEVkY2FQYXJtKHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0pOwogCi0JUlRNUFNldEluZGl2aWR1YWxIVChwQWQsIDApOworCXsKKwkJUlRNUFNldEluZGl2aWR1YWxIVChwQWQsIDApOworCX0KKwogfQogCiAvKgpAQCAtMTQ4MSwxMTIgKzY0OCwxMDMgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJUlRNUFNldEluZGl2aWR1YWxIVCgKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JVUNIQVIJCQkJYXBpZHgpCit2b2lkIFJUTVBTZXRJbmRpdmlkdWFsSFQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBhcGlkeCkKIHsKLQlQUlRfSFRfUEhZX0lORk8JCXBEZXNpcmVkX2h0X3BoeSA9IE5VTEw7Ci0JVUNIQVIJVHhTdHJlYW0gPSBwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbTsKLQlVQ0hBUglEZXNpcmVkTWNzCT0gTUNTX0FVVE87CisJc3RydWN0IHJ0X2h0X3BoeV9pbmZvICpwRGVzaXJlZF9odF9waHkgPSBOVUxMOworCXU4IFR4U3RyZWFtID0gcEFkLT5Db21tb25DZmcuVHhTdHJlYW07CisJdTggRGVzaXJlZE1jcyA9IE1DU19BVVRPOwogCi0JZG8KLQl7CisJZG8gewogCQl7CiAJCQlwRGVzaXJlZF9odF9waHkgPSAmcEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mbzsKLQkJCURlc2lyZWRNY3MgPSBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUzsKLQkJCS8vcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTykgPyBUUlVFIDogRkFMU0U7Ci0JCQkJYnJlYWs7CisJCQlEZXNpcmVkTWNzID0KKwkJCSAgICBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUzsKKwkJCS8qcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTykgPyBUUlVFIDogRkFMU0U7ICovCisJCQlicmVhazsKIAkJfQogCX0gd2hpbGUgKEZBTFNFKTsKIAotCWlmIChwRGVzaXJlZF9odF9waHkgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTZXRJbmRpdmlkdWFsSFQ6IGludmFsaWQgYXBpZHgoJWQpXG4iLCBhcGlkeCkpOworCWlmIChwRGVzaXJlZF9odF9waHkgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIlJUTVBTZXRJbmRpdmlkdWFsSFQ6IGludmFsaWQgYXBpZHgoJWQpXG4iLCBhcGlkeCkpOwogCQlyZXR1cm47CiAJfQotCVJUTVBaZXJvTWVtb3J5KHBEZXNpcmVkX2h0X3BoeSwgc2l6ZW9mKFJUX0hUX1BIWV9JTkZPKSk7CisJUlRNUFplcm9NZW1vcnkocERlc2lyZWRfaHRfcGh5LCBzaXplb2Yoc3RydWN0IHJ0X2h0X3BoeV9pbmZvKSk7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SW5kaXZpZHVhbEhUIDogRGVzaXJlZCBNQ1MgPSAlZFxuIiwgRGVzaXJlZE1jcykpOwotCS8vIENoZWNrIHRoZSB2YWxpZGl0eSBvZiBNQ1MKLQlpZiAoKFR4U3RyZWFtID09IDEpICYmICgoRGVzaXJlZE1jcyA+PSBNQ1NfOCkgJiYgKERlc2lyZWRNY3MgPD0gTUNTXzE1KSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlJUTVBTZXRJbmRpdmlkdWFsSFQ6IE1DUyglZCkgaXMgaW52YWxpZCBpbiAxUywgcmVzZXQgaXQgYXMgTUNTXzdcbiIsIERlc2lyZWRNY3MpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiUlRNUFNldEluZGl2aWR1YWxIVCA6IERlc2lyZWQgTUNTID0gJWRcbiIsIERlc2lyZWRNY3MpKTsKKwkvKiBDaGVjayB0aGUgdmFsaWRpdHkgb2YgTUNTICovCisJaWYgKChUeFN0cmVhbSA9PSAxKQorCSAgICAmJiAoKERlc2lyZWRNY3MgPj0gTUNTXzgpICYmIChEZXNpcmVkTWNzIDw9IE1DU18xNSkpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sCisJCQkgKCJSVE1QU2V0SW5kaXZpZHVhbEhUOiBNQ1MoJWQpIGlzIGludmFsaWQgaW4gMVMsIHJlc2V0IGl0IGFzIE1DU183XG4iLAorCQkJICBEZXNpcmVkTWNzKSk7CiAJCURlc2lyZWRNY3MgPSBNQ1NfNzsKIAl9CiAKLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGggPT0gQldfMjApICYmIChEZXNpcmVkTWNzID09IE1DU18zMikpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlJUTVBTZXRJbmRpdmlkdWFsSFQ6IE1DU18zMiBpcyBvbmx5IHN1cHBvcnRlZCBpbiA0MC1NSHosIHJlc2V0IGl0IGFzIE1DU18wXG4iKSk7CisJaWYgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID09IEJXXzIwKQorCSAgICAmJiAoRGVzaXJlZE1jcyA9PSBNQ1NfMzIpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sCisJCQkgKCJSVE1QU2V0SW5kaXZpZHVhbEhUOiBNQ1NfMzIgaXMgb25seSBzdXBwb3J0ZWQgaW4gNDAtTUh6LCByZXNldCBpdCBhcyBNQ1NfMFxuIikpOwogCQlEZXNpcmVkTWNzID0gTUNTXzA7CiAJfQogCiAJcERlc2lyZWRfaHRfcGh5LT5iSHRFbmFibGUgPSBUUlVFOwogCi0JLy8gRGVjaWRlIGRlc2lyZWQgVHggTUNTCi0Jc3dpdGNoIChUeFN0cmVhbSkKLQl7Ci0JCWNhc2UgMToKLQkJCWlmIChEZXNpcmVkTWNzID09IE1DU19BVVRPKQotCQkJewotCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzBdPSAweGZmOwotCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzFdPSAweDAwOwotCQkJfQotCQkJZWxzZSBpZiAoRGVzaXJlZE1jcyA8PSBNQ1NfNykKLQkJCXsKLQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXT0gMTw8RGVzaXJlZE1jczsKLQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXT0gMHgwMDsKLQkJCX0KLQkJCWJyZWFrOworCS8qIERlY2lkZSBkZXNpcmVkIFR4IE1DUyAqLworCXN3aXRjaCAoVHhTdHJlYW0pIHsKKwljYXNlIDE6CisJCWlmIChEZXNpcmVkTWNzID09IE1DU19BVVRPKSB7CisJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXSA9IDB4ZmY7CisJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXSA9IDB4MDA7CisJCX0gZWxzZSBpZiAoRGVzaXJlZE1jcyA8PSBNQ1NfNykgeworCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMF0gPSAxIDw8IERlc2lyZWRNY3M7CisJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXSA9IDB4MDA7CisJCX0KKwkJYnJlYWs7CiAKLQkJY2FzZSAyOgotCQkJaWYgKERlc2lyZWRNY3MgPT0gTUNTX0FVVE8pCi0JCQl7Ci0JCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMF09IDB4ZmY7Ci0JCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMV09IDB4ZmY7Ci0JCQl9Ci0JCQllbHNlIGlmIChEZXNpcmVkTWNzIDw9IE1DU18xNSkKLQkJCXsKLQkJCQlVTE9ORyBtb2RlOworCWNhc2UgMjoKKwkJaWYgKERlc2lyZWRNY3MgPT0gTUNTX0FVVE8pIHsKKwkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzBdID0gMHhmZjsKKwkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzFdID0gMHhmZjsKKwkJfSBlbHNlIGlmIChEZXNpcmVkTWNzIDw9IE1DU18xNSkgeworCQkJdW5zaWduZWQgbG9uZyBtb2RlOwogCi0JCQkJbW9kZSA9IERlc2lyZWRNY3MgLyA4OwotCQkJCWlmIChtb2RlIDwgMikKLQkJCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbbW9kZV0gPSAoMSA8PCAoRGVzaXJlZE1jcyAtIG1vZGUgKiA4KSk7Ci0JCQl9Ci0JCQlicmVhazsKKwkJCW1vZGUgPSBEZXNpcmVkTWNzIC8gODsKKwkJCWlmIChtb2RlIDwgMikKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFttb2RlXSA9CisJCQkJICAgICgxIDw8IChEZXNpcmVkTWNzIC0gbW9kZSAqIDgpKTsKKwkJfQorCQlicmVhazsKIAotCQljYXNlIDM6IC8vIDMqMwotCQkJaWYgKERlc2lyZWRNY3MgPT0gTUNTX0FVVE8pCi0JCQl7Ci0JCQkJLyogTUNTMCB+IE1DUzIzLCAzIGJ5dGVzICovCi0JCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMF09IDB4ZmY7Ci0JCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMV09IDB4ZmY7Ci0JCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMl09IDB4ZmY7Ci0JCQl9Ci0JCQllbHNlIGlmIChEZXNpcmVkTWNzIDw9IE1DU18yMykKLQkJCXsKLQkJCQlVTE9ORyBtb2RlOworCWNhc2UgMzoJCS8qIDMqMyAqLworCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTykgeworCQkJLyogTUNTMCB+IE1DUzIzLCAzIGJ5dGVzICovCisJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXSA9IDB4ZmY7CisJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXSA9IDB4ZmY7CisJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsyXSA9IDB4ZmY7CisJCX0gZWxzZSBpZiAoRGVzaXJlZE1jcyA8PSBNQ1NfMjMpIHsKKwkJCXVuc2lnbmVkIGxvbmcgbW9kZTsKIAotCQkJCW1vZGUgPSBEZXNpcmVkTWNzIC8gODsKLQkJCQlpZiAobW9kZSA8IDMpCi0JCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0W21vZGVdID0gKDEgPDwgKERlc2lyZWRNY3MgLSBtb2RlICogOCkpOwotCQkJfQotCQkJYnJlYWs7CisJCQltb2RlID0gRGVzaXJlZE1jcyAvIDg7CisJCQlpZiAobW9kZSA8IDMpCisJCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbbW9kZV0gPQorCQkJCSAgICAoMSA8PCAoRGVzaXJlZE1jcyAtIG1vZGUgKiA4KSk7CisJCX0KKwkJYnJlYWs7CiAJfQogCi0JaWYocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCA9PSBCV180MCkKLQl7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGggPT0gQldfNDApIHsKIAkJaWYgKERlc2lyZWRNY3MgPT0gTUNTX0FVVE8gfHwgRGVzaXJlZE1jcyA9PSBNQ1NfMzIpCiAJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFs0XSA9IDB4MTsKIAl9Ci0KLQkvLyB1cGRhdGUgSFQgUmF0ZSBzZXR0aW5nCi0gICAgaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCi0gICAgICAgIE1sbWVVcGRhdGVIdFR4UmF0ZXMocEFkLCBCU1MwKTsKLSAgICBlbHNlCi0JICAgIE1sbWVVcGRhdGVIdFR4UmF0ZXMocEFkLCBhcGlkeCk7CisJLyogdXBkYXRlIEhUIFJhdGUgc2V0dGluZyAqLworCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCQlNbG1lVXBkYXRlSHRUeFJhdGVzKHBBZCwgQlNTMCk7CisJZWxzZQorCQlNbG1lVXBkYXRlSHRUeFJhdGVzKHBBZCwgYXBpZHgpOwogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJUm91dGluZSBEZXNjcmlwdGlvbjoKQEAgLTE1OTUsMzYgKzc1MywzNCBAQAogCUFyZ3VtZW50czoKIAkJU2VuZCBhbGwgSFQgSUUgaW4gYmVhY29uL3Byb2JlIHJzcC9hc3NvYyByc3AvYWN0aW9uIGZyYW1lLgogCi0KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUTVBVcGRhdGVIVElFKAotCUlOCVJUX0hUX0NBUEFCSUxJVFkJKnBSdEh0LAotCUlOCQlVQ0hBUgkJCQkqcE1jc1NldCwKLQlPVVQJCUhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCi0JT1VUCQlBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8pCit2b2lkIFJUTVBVcGRhdGVIVElFKHN0cnVjdCBydF9odF9jYXBhYmlsaXR5ICpwUnRIdCwKKwkJICAgIHU4ICogcE1jc1NldCwKKwkJICAgIHN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llICogcEh0Q2FwYWJpbGl0eSwKKwkJICAgIHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSAqIHBBZGRIdEluZm8pCiB7Ci0JUlRNUFplcm9NZW1vcnkocEh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKLQlSVE1QWmVyb01lbW9yeShwQWRkSHRJbmZvLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKwlSVE1QWmVyb01lbW9yeShwSHRDYXBhYmlsaXR5LCBzaXplb2Yoc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHlfaWUpKTsKKwlSVE1QWmVyb01lbW9yeShwQWRkSHRJbmZvLCBzaXplb2Yoc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llKSk7CiAKLQkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9IHBSdEh0LT5DaGFubmVsV2lkdGg7Ci0JCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5NaW1vUHMgPSBwUnRIdC0+TWltb1BzOwotCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uR0YgPSBwUnRIdC0+R0Y7Ci0JCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yMjAgPSBwUnRIdC0+U2hvcnRHSWZvcjIwOwotCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gcFJ0SHQtPlNob3J0R0lmb3I0MDsKLQkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlR4U1RCQyA9IHBSdEh0LT5UeFNUQkM7Ci0JCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5SeFNUQkMgPSBwUnRIdC0+UnhTVEJDOwotCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQU1zZHVTaXplID0gcFJ0SHQtPkFtc2R1U2l6ZTsKLQkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvciA9IHBSdEh0LT5NYXhSQW1wZHVGYWN0b3I7Ci0JCXBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IHBSdEh0LT5NcGR1RGVuc2l0eTsKKwlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID0gcFJ0SHQtPkNoYW5uZWxXaWR0aDsKKwlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uTWltb1BzID0gcFJ0SHQtPk1pbW9QczsKKwlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uR0YgPSBwUnRIdC0+R0Y7CisJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3IyMCA9IHBSdEh0LT5TaG9ydEdJZm9yMjA7CisJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3I0MCA9IHBSdEh0LT5TaG9ydEdJZm9yNDA7CisJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlR4U1RCQyA9IHBSdEh0LT5UeFNUQkM7CisJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlJ4U1RCQyA9IHBSdEh0LT5SeFNUQkM7CisJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkFNc2R1U2l6ZSA9IHBSdEh0LT5BbXNkdVNpemU7CisJcEh0Q2FwYWJpbGl0eS0+SHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvciA9IHBSdEh0LT5NYXhSQW1wZHVGYWN0b3I7CisJcEh0Q2FwYWJpbGl0eS0+SHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gcFJ0SHQtPk1wZHVEZW5zaXR5OwogCi0JCXBBZGRIdEluZm8tPkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID0gcFJ0SHQtPkV4dENoYW5PZmZzZXQgOwotCQlwQWRkSHRJbmZvLT5BZGRIdEluZm8uUmVjb21XaWR0aCA9IHBSdEh0LT5SZWNvbVdpZHRoOwotCQlwQWRkSHRJbmZvLT5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSA9IHBSdEh0LT5PcGVyYWlvbk1vZGU7Ci0JCXBBZGRIdEluZm8tPkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID0gcFJ0SHQtPk5vbkdmUHJlc2VudDsKLQkJUlRNUE1vdmVNZW1vcnkocEFkZEh0SW5mby0+TUNTU2V0LCAvKnBSdEh0LT5NQ1NTZXQqL3BNY3NTZXQsIDQpOyAvLyBydDI4NjAgb25seSBzdXBwb3J0IE1DUyBtYXg9MzIsIG5vIG5lZWQgdG8gY29weSBhbGwgMTYgdWNoYXIuCisJcEFkZEh0SW5mby0+QWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPSBwUnRIdC0+RXh0Q2hhbk9mZnNldDsKKwlwQWRkSHRJbmZvLT5BZGRIdEluZm8uUmVjb21XaWR0aCA9IHBSdEh0LT5SZWNvbVdpZHRoOworCXBBZGRIdEluZm8tPkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlID0gcFJ0SHQtPk9wZXJhaW9uTW9kZTsKKwlwQWRkSHRJbmZvLT5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9IHBSdEh0LT5Ob25HZlByZXNlbnQ7CisJUlRNUE1vdmVNZW1vcnkocEFkZEh0SW5mby0+TUNTU2V0LCAvKnBSdEh0LT5NQ1NTZXQgKi8gcE1jc1NldCwgNCk7CS8qIHJ0Mjg2MCBvbmx5IHN1cHBvcnQgTUNTIG1heD0zMiwgbm8gbmVlZCB0byBjb3B5IGFsbCAxNiB1Y2hhci4gKi8KIAotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBVcGRhdGVIVElFIDw9PSBcbiIpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QVXBkYXRlSFRJRSA8PT0gXG4iKSk7CiB9CiAKIC8qCkBAIC0xNjM0LDc4ICs3OTAsNzEgQEAKICAgICBSZXR1cm46CiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJQnNzSWR4LAotCUlOIAlVQ0hBUgkJIAlLZXlJZHgsCi0JSU4gCVVDSEFSCQkgCUNpcGhlckFsZywKLQlJTiAJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkpCit2b2lkIFJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgIHU4IEJzc0lkeCwKKwkJCSAgICAgICB1OCBLZXlJZHgsCisJCQkgICAgICAgdTggQ2lwaGVyQWxnLCBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkpCiB7Ci0JVUlOVDMyCQlXQ0lEQXR0cmkgPSAwOwotCVVTSE9SVAkJb2Zmc2V0OwotCVVDSEFSCQlJVkVJViA9IDA7Ci0JVVNIT1JUCQlXY2lkID0gMDsKKwl1MzIgV0NJREF0dHJpID0gMDsKKwl1MTYgb2Zmc2V0OworCXU4IElWRUlWID0gMDsKKwl1MTYgV2NpZCA9IDA7CiAKIAl7CiAJCXsKLQkJCWlmIChCc3NJZHggPiBCU1MwKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnk6IFRoZSBCU1MtaW5kZXgoJWQpIGlzIG91dCBvZiByYW5nZSBmb3IgSW5mcmEgbGluay4gXG4iLCBCc3NJZHgpKTsKKwkJCWlmIChCc3NJZHggPiBCU1MwKSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJCSAoIlJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnk6IFRoZSBCU1MtaW5kZXgoJWQpIGlzIG91dCBvZiByYW5nZSBmb3IgSW5mcmEgbGluay4gXG4iLAorCQkJCQkgIEJzc0lkeCkpOwogCQkJCXJldHVybjsKIAkJCX0KLQotCQkJLy8gMS4JSW4gQURIT0MgbW9kZSwgdGhlIEFJRCBpcyB3Y2lkIG51bWJlci4gQW5kIE5PIG1lc2ggbGluayBleGlzdHMuCi0JCQkvLyAyLglJbiBJbmZyYSBtb2RlLCB0aGUgQUlEOjEgTVVTVCBiZSB3Y2lkIG9mIGluZnJhIFNUQS4KLQkJCS8vCQkJCQkgICB0aGUgQUlEOjJ+IGFzc2lnbiB0byBtZXNoIGxpbmsgZW50cnkuCi0JCQlpZiAocEVudHJ5ICYmIEFESE9DX09OKHBBZCkpCisJCQkvKiAxLiAgIEluIEFESE9DIG1vZGUsIHRoZSBBSUQgaXMgd2NpZCBudW1iZXIuIEFuZCBOTyBtZXNoIGxpbmsgZXhpc3RzLiAqLworCQkJLyogMi4gICBJbiBJbmZyYSBtb2RlLCB0aGUgQUlEOjEgTVVTVCBiZSB3Y2lkIG9mIGluZnJhIFNUQS4gKi8KKwkJCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgQUlEOjJ+IGFzc2lnbiB0byBtZXNoIGxpbmsgZW50cnkuICovCisJCQlpZiAocEVudHJ5KQogCQkJCVdjaWQgPSBwRW50cnktPkFpZDsKLQkJCWVsc2UgaWYgKHBFbnRyeSAmJiBJTkZSQV9PTihwQWQpKQotCQkJewotCQkJCVdjaWQgPSBCU1NJRF9XQ0lEOwotCQkJfQogCQkJZWxzZQogCQkJCVdjaWQgPSBNQ0FTVF9XQ0lEOwogCQl9CiAJfQogCi0JLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlCisJLyogVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlICovCiAJb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoV2NpZCAqIEhXX1dDSURfQVRUUklfU0laRSk7CiAKIAl7CiAJCWlmIChwRW50cnkgJiYgcEVudHJ5LT5WYWxpZEFzTWVzaCkKLQkJCVdDSURBdHRyaSA9IChDaXBoZXJBbGc8PDEpIHwgUEFJUldJU0VLRVlUQUJMRTsKKwkJCVdDSURBdHRyaSA9IChDaXBoZXJBbGcgPDwgMSkgfCBQQUlSV0lTRUtFWVRBQkxFOwogCQllbHNlCi0JCQlXQ0lEQXR0cmkgPSAoQ2lwaGVyQWxnPDwxKSB8IFNIQVJFREtFWVRBQkxFOworCQkJV0NJREF0dHJpID0gKENpcGhlckFsZyA8PCAxKSB8IFNIQVJFREtFWVRBQkxFOwogCX0KIAogCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgV0NJREF0dHJpKTsKIAotCi0JLy8gVXBkYXRlIElWL0VJViB0YWJsZQorCS8qIFVwZGF0ZSBJVi9FSVYgdGFibGUgKi8KIAlvZmZzZXQgPSBNQUNfSVZFSVZfVEFCTEVfQkFTRSArIChXY2lkICogSFdfSVZFSVZfRU5UUllfU0laRSk7CiAKLQkvLyBXUEEgbW9kZQotCWlmICgoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQKSB8fCAoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQX05PX01JQykgfHwgKENpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSkKLQl7Ci0JCS8vIEVpdiBiaXQgb24uIGtleWlkIGFsd2F5cyBpcyAwIGZvciBwYWlyd2lzZSBrZXkKLQkJSVZFSVYgPSAoS2V5SWR4IDw8NikgfCAweDIwOwotCX0KLQllbHNlCi0JewotCQkvLyBXRVAgS2V5SWR4IGlzIGRlZmF1bHQgdHgga2V5LgorCS8qIFdQQSBtb2RlICovCisJaWYgKChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApIHx8IChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVBfTk9fTUlDKQorCSAgICB8fCAoQ2lwaGVyQWxnID09IENJUEhFUl9BRVMpKSB7CisJCS8qIEVpdiBiaXQgb24uIGtleWlkIGFsd2F5cyBpcyAwIGZvciBwYWlyd2lzZSBrZXkgKi8KKwkJSVZFSVYgPSAoS2V5SWR4IDw8IDYpIHwgMHgyMDsKKwl9IGVsc2UgeworCQkvKiBXRVAgS2V5SWR4IGlzIGRlZmF1bHQgdHgga2V5LiAqLwogCQlJVkVJViA9IChLZXlJZHggPDwgNik7CiAJfQogCi0JLy8gRm9yIGtleSBpbmRleCBhbmQgZXh0IElWIGJpdCwgc28gb25seSBuZWVkIHRvIHVwZGF0ZSB0aGUgcG9zaXRpb24ob2Zmc2V0KzMpLgotI2lmZGVmIFJUMjg2MAotCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0KzMsIElWRUlWKTsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCVJUVVNCTXVsdGlXcml0ZV9PbmVCeXRlKHBBZCwgb2Zmc2V0KzMsICZJVkVJVik7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCisJLyogRm9yIGtleSBpbmRleCBhbmQgZXh0IElWIGJpdCwgc28gb25seSBuZWVkIHRvIHVwZGF0ZSB0aGUgcG9zaXRpb24ob2Zmc2V0KzMpLiAqLworI2lmZGVmIFJUTVBfTUFDX1BDSQorCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgMywgSVZFSVYpOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgorCVJUVVNCTXVsdGlXcml0ZV9PbmVCeXRlKHBBZCwgb2Zmc2V0ICsgMywgJklWRUlWKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeTogV0NJRCAjJWQsIEtleUluZGV4ICMlZCwgQWxnPSVzXG4iLFdjaWQsIEtleUlkeCwgQ2lwaGVyTmFtZVtDaXBoZXJBbGddKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIJV0NJREF0dHJpID0gMHgleCBcbiIsICBXQ0lEQXR0cmkpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeTogV0NJRCAjJWQsIEtleUluZGV4ICMlZCwgQWxnPSVzXG4iLAorCQkgIFdjaWQsIEtleUlkeCwgQ2lwaGVyTmFtZVtDaXBoZXJBbGddKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiCVdDSURBdHRyaSA9IDB4JXggXG4iLCBXQ0lEQXR0cmkpKTsKIAogfQogCkBAIC0xNzIzLDE1MjQgKzg3Miw4NCBAQAogICAgIE5vdGU6CiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1DSEFSICpHZXRFbmNyeXB0VHlwZShDSEFSIGVuYykKK2NoYXIgKkdldEVuY3J5cHRUeXBlKGNoYXIgZW5jKQogewotICAgIGlmKGVuYyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0gICAgICAgIHJldHVybiAiTk9ORSI7Ci0gICAgaWYoZW5jID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKQotICAgIAlyZXR1cm4gIldFUCI7Ci0gICAgaWYoZW5jID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCi0gICAgCXJldHVybiAiVEtJUCI7Ci0gICAgaWYoZW5jID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0gICAgCXJldHVybiAiQUVTIjsKLQlpZihlbmMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZCkKLSAgICAJcmV0dXJuICJUS0lQQUVTIjsKLSAgICBlbHNlCi0gICAgCXJldHVybiAiVU5LTk9XIjsKLX0KLQotQ0hBUiAqR2V0QXV0aE1vZGUoQ0hBUiBhdXRoKQotewotICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKLSAgICAJcmV0dXJuICJPUEVOIjsKLSAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKLSAgICAJcmV0dXJuICJTSEFSRUQiOwotCWlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkKLSAgICAJcmV0dXJuICJBVVRPV0VQIjsKLSAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLSAgICAJcmV0dXJuICJXUEEiOwotICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKQotICAgIAlyZXR1cm4gIldQQVBTSyI7Ci0gICAgaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotICAgIAlyZXR1cm4gIldQQU5PTkUiOwotICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKLSAgICAJcmV0dXJuICJXUEEyIjsKLSAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCi0gICAgCXJldHVybiAiV1BBMlBTSyI7Ci0JaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMikKLSAgICAJcmV0dXJuICJXUEExV1BBMiI7Ci0JaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSykKLSAgICAJcmV0dXJuICJXUEExUFNLV1BBMlBTSyI7Ci0KLSAgICAJcmV0dXJuICJVTktOT1ciOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIEdldCBzaXRlIHN1cnZleSByZXN1bHRzCi0JQXJndW1lbnRzOgotCSAgICBwQWRhcHRlciAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCSAgICB3cnEgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW9jdGwgYXJndW1lbnQKLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgTm9uZQotCi0gICAgTm90ZToKLSAgICAgICAgVXNhZ2U6Ci0gICAgICAgIAkJMS4pIFVJIG5lZWRzIHRvIHdhaXQgNCBzZWNvbmRzIGFmdGVyIGlzc3VlIGEgc2l0ZSBzdXJ2ZXkgY29tbWFuZAotICAgICAgICAJCTIuKSBpd3ByaXYgcmEwIGdldF9zaXRlX3N1cnZleQotICAgICAgICAJCTMuKSBVSSBuZWVkcyB0byBwcmVwYXJlIGF0IGxlYXN0IDQwOTZieXRlcyB0byBnZXQgdGhlIHJlc3VsdHMKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLSNkZWZpbmUJTElORV9MRU4JKDQrMzMrMjArOCsxMCs5KzcrMykJLy8gQ2hhbm5lbCtTU0lEK0Jzc2lkK1dlcFN0YXR1cytBdXRoTW9kZStTaWduYWwrV2lyZXNzTW9kZStOZXR3b3JrVHlwZQotVk9JRCBSVE1QSW9jdGxHZXRTaXRlU3VydmV5KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEpCi17Ci0JQ0hBUgkJKm1zZzsKLQlJTlQgCQlpPTA7Ci0JSU5UCQkJV2FpdENudDsKLQlJTlQgCQlTdGF0dXM9MDsKLQlDSEFSCQlTc2lkW01BWF9MRU5fT0ZfU1NJRCArMV07Ci0gICAgSU5UICAgICAgICAgUnNzaSA9IDAsIG1heF9sZW4gPSBMSU5FX0xFTjsKLQlVSU5UICAgICAgICBSc3NpX1F1YWxpdHkgPSAwOwotCU5ESVNfODAyXzExX05FVFdPUktfVFlQRSAgICB3aXJlbGVzc19tb2RlOwotCi0Jb3NfYWxsb2NfbWVtKE5VTEwsIChQVUNIQVIgKikmbXNnLCBzaXplb2YoQ0hBUikqKChNQVhfTEVOX09GX0JTU19UQUJMRSkqbWF4X2xlbikpOwotCi0JaWYgKG1zZyA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUElvY3RsR2V0U2l0ZVN1cnZleSAtIG1zZyBtZW1vcnkgYWxsb2MgZmFpbC5cbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCW1lbXNldChtc2csIDAgLChNQVhfTEVOX09GX0JTU19UQUJMRSkqbWF4X2xlbiApOwotCW1lbXNldChTc2lkLCAwICwoTUFYX0xFTl9PRl9TU0lEICsxKSk7Ci0Jc3ByaW50Zihtc2csIiVzIiwiXG4iKTsKLQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS00cyUtMzNzJS0yMHMlLThzJS0xMHMlLTlzJS03cyUtM3NcbiIsCi0JICAgICJDaCIsICJTU0lEIiwgIkJTU0lEIiwgIkVuYyIsICJBdXRoIiwgIlNpZ2FubCglKSIsICJXLU1vZGUiLCAiIE5UIik7Ci0KLQlXYWl0Q250ID0gMDsKLQlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOwotCi0Jd2hpbGUgKChTY2FuUnVubmluZyhwQWRhcHRlcikgPT0gVFJVRSkgJiYgKFdhaXRDbnQrKyA8IDIwMCkpCi0JCU9TX1dBSVQoNTAwKTsKLQotCWZvcihpPTA7IGk8cEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIgO2krKykKLQl7Ci0JCWlmKCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DaGFubmVsPT0wKQotCQkJYnJlYWs7Ci0KLQkJaWYoKHN0cmxlbihtc2cpK21heF9sZW4gKSA+PSBJV19TQ0FOX01BWF9EQVRBKQotCQkJYnJlYWs7Ci0KLQkJLy9DaGFubmVsCi0JCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTRkIiwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2hhbm5lbCk7Ci0JCS8vU1NJRAotCQltZW1jcHkoU3NpZCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbik7Ci0JCVNzaWRbcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbl0gPSAnXDAnOwotCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0zM3MiLCBTc2lkKTsKLQkJLy9CU1NJRAotCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggICAiLAotCQkJcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWRbMF0sCi0JCQlwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZFsxXSwKLQkJCXBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkWzJdLAotCQkJcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWRbM10sCi0JCQlwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZFs0XSwKLQkJCXBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkWzVdKTsKLQkJLy9FbmNyeXB0aW9uIFR5cGUKLQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtOHMiLEdldEVuY3J5cHRUeXBlKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldlcFN0YXR1cykpOwotCQkvL0F1dGhlbnRpY2F0aW9uIE1vZGUKLQkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTEwcyIsICJVTktOT1ciKTsKLQkJZWxzZQotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTBzIixHZXRBdXRoTW9kZShwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5BdXRoTW9kZSkpOwotCQkvLyBSc3NpCi0JCVJzc2kgPSAoSU5UKXBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzc2k7Ci0JCWlmIChSc3NpID49IC01MCkKLQkJCVJzc2lfUXVhbGl0eSA9IDEwMDsKLQkJZWxzZSBpZiAoUnNzaSA+PSAtODApICAgIC8vIGJldHdlZW4gLTUwIH4gLTgwZGJtCi0JCQlSc3NpX1F1YWxpdHkgPSAoVUlOVCkoMjQgKyAoKFJzc2kgKyA4MCkgKiAyNikvMTApOwotCQllbHNlIGlmIChSc3NpID49IC05MCkgICAvLyBiZXR3ZWVuIC04MCB+IC05MGRibQotCQkJUnNzaV9RdWFsaXR5ID0gKFVJTlQpKCgoUnNzaSArIDkwKSAqIDI2KS8xMCk7Ci0JCWVsc2UgICAgLy8gPCAtODQgZGJtCi0JCQlSc3NpX1F1YWxpdHkgPSAwOwotCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS05ZCIsIFJzc2lfUXVhbGl0eSk7Ci0JCS8vIFdpcmVsZXNzIE1vZGUKLQkJd2lyZWxlc3NfbW9kZSA9IE5ldHdvcmtUeXBlSW5Vc2VTYW5pdHkoJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldKTsKLQkJaWYgKHdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMUZIIHx8Ci0JCQl3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFEUykKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTdzIiwgIjExYiIpOwotCQllbHNlIGlmICh3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFPRkRNNSkKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTdzIiwgIjExYSIpOwotCQllbHNlIGlmICh3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFPRkRNNV9OKQotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAiMTFhL24iKTsKLQkJZWxzZSBpZiAod2lyZWxlc3NfbW9kZSA9PSBOZGlzODAyXzExT0ZETTI0KQotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAiMTFiL2ciKTsKLQkJZWxzZSBpZiAod2lyZWxlc3NfbW9kZSA9PSBOZGlzODAyXzExT0ZETTI0X04pCi0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICIxMWIvZy9uIik7Ci0JCWVsc2UKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTdzIiwgInVua25vdyIpOwotCQkvL05ldHdvcmsgVHlwZQotCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzVHlwZSA9PSBCU1NfQURIT0MpCi0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0zcyIsICIgQWQiKTsKLQkJZWxzZQotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtM3MiLCAiIEluIik7Ci0KLSAgICAgICAgc3ByaW50Zihtc2crc3RybGVuKG1zZyksIlxuIik7Ci0JfQotCi0JcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7Ci0Jd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKG1zZyk7Ci0JU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIG1zZywgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBJb2N0bEdldFNpdGVTdXJ2ZXkgLSB3cnEtPnUuZGF0YS5sZW5ndGggPSAlZFxuIiwgd3JxLT51LmRhdGEubGVuZ3RoKSk7Ci0Jb3NfZnJlZV9tZW0oTlVMTCwgKFBVQ0hBUiltc2cpOwotfQotCi0KLSNkZWZpbmUJTUFDX0xJTkVfTEVOCSgxNCs0KzQrMTArMTArMTArNis2KQkvLyBBZGRyK2FpZCtwc20rZGF0YXRpbWUrcnhieXRlK3R4Ynl0ZStjdXJyZW50IHR4IHJhdGUrbGFzdCB0eCByYXRlCi1WT0lEIFJUTVBJb2N0bEdldE1hY1RhYmxlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIHN0cnVjdCBpd3JlcSAqd3JxKQotewotCUlOVCBpOwotCVJUXzgwMl8xMV9NQUNfVEFCTEUgTWFjVGFiOwotCWNoYXIgKm1zZzsKLQotCU1hY1RhYi5OdW0gPSAwOwotCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCi0JewotCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJICYmIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlNzdCA9PSBTU1RfQVNTT0MpKQotCQl7Ci0JCQlDT1BZX01BQ19BRERSKE1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5BZGRyLCAmcEFkLT5NYWNUYWIuQ29udGVudFtpXS5BZGRyKTsKLQkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5BaWQgPSAoVUNIQVIpcEFkLT5NYWNUYWIuQ29udGVudFtpXS5BaWQ7Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uUHNtID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5Qc01vZGU7Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uTWltb1BzID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5NbXBzTW9kZTsKLQotCQkJLy8gRmlsbCBpbiBSU1NJIHBlciBlbnRyeQotCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkF2Z1Jzc2kwID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5Sc3NpU2FtcGxlLkF2Z1Jzc2kwOwotCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkF2Z1Jzc2kxID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5Sc3NpU2FtcGxlLkF2Z1Jzc2kxOwotCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkF2Z1Jzc2kyID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5Sc3NpU2FtcGxlLkF2Z1Jzc2kyOwotCi0JCQkvLyB0aGUgY29ubmVjdGVkIHRpbWUgcGVyIGVudHJ5Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQ29ubmVjdGVkVGltZSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uU3RhQ29ubmVjdFRpbWU7Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLmZpZWxkLk1DUyA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLk1DUzsKLQkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuQlcgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhUUGh5TW9kZS5maWVsZC5CVzsKLQkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuU2hvcnRHSSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLlNob3J0R0k7Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLmZpZWxkLlNUQkMgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhUUGh5TW9kZS5maWVsZC5TVEJDOwotCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5yc3YgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhUUGh5TW9kZS5maWVsZC5yc3Y7Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLmZpZWxkLk1PREUgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhUUGh5TW9kZS5maWVsZC5NT0RFOwotCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS53b3JkID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUud29yZDsKLQotCQkJTWFjVGFiLk51bSArPSAxOwotCQl9Ci0JfQotCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF84MDJfMTFfTUFDX1RBQkxFKTsKLQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZNYWNUYWIsIHdycS0+dS5kYXRhLmxlbmd0aCkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczogY29weV90b191c2VyKCkgZmFpbFxuIiwgX19mdW5jX18pKTsKLQl9Ci0KLQltc2cgPSAoQ0hBUiAqKSBrbWFsbG9jKHNpemVvZihDSEFSKSooTUFYX0xFTl9PRl9NQUNfVEFCTEUqTUFDX0xJTkVfTEVOKSwgTUVNX0FMTE9DX0ZMQUcpOwotCW1lbXNldChtc2csIDAgLE1BWF9MRU5fT0ZfTUFDX1RBQkxFKk1BQ19MSU5FX0xFTiApOwotCXNwcmludGYobXNnLCIlcyIsIlxuIik7Ci0Jc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTRzJS00cyUtNHMlLTEwcyUtMTBzJS0xMHMlLTZzJS02c1xuIiwKLQkJIk1BQyIsICJBSUQiLCAiUFNNIiwgIkxEVCIsICJSeEIiLCAiVHhCIiwiQ1R4UiIsICJMVHhSIik7Ci0KLQlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQotCXsKLQkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKLQkJaWYgKHBFbnRyeS0+VmFsaWRBc0NMSSAmJiAocEVudHJ5LT5Tc3QgPT0gU1NUX0FTU09DKSkKLQkJewotCQkJaWYoKHN0cmxlbihtc2cpK01BQ19MSU5FX0xFTiApID49IChNQVhfTEVOX09GX01BQ19UQUJMRSpNQUNfTElORV9MRU4pICkKLQkJCQlicmVhazsKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggICIsCi0JCQkJcEVudHJ5LT5BZGRyWzBdLCBwRW50cnktPkFkZHJbMV0sIHBFbnRyeS0+QWRkclsyXSwKLQkJCQlwRW50cnktPkFkZHJbM10sIHBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdKTsKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTRkIiwgKGludClwRW50cnktPkFpZCk7Ci0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS00ZCIsIChpbnQpcEVudHJ5LT5Qc01vZGUpOwotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTBkIiwwLypwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhTQ291bnRlci5MYXN0RGF0YVBhY2tldFRpbWUqLyk7IC8vIFRvRG8KLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTEwZCIsMC8qcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IU0NvdW50ZXIuVG90YWxSeEJ5dGVDb3VudCovKTsgLy8gVG9EbwotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTBkIiwwLypwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhTQ291bnRlci5Ub3RhbFR4Qnl0ZUNvdW50Ki8pOyAvLyBUb0RvCi0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS02ZCIsUmF0ZUlkVG9NYnBzW3BBZC0+TWFjVGFiLkNvbnRlbnRbaV0uQ3VyclR4UmF0ZV0pOwotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtNmRcbiIsMC8qUmF0ZUlkVG9NYnBzW3BBZC0+TWFjVGFiLkNvbnRlbnRbaV0uTGFzdFR4UmF0ZV0qLyk7IC8vIFRvRG8KLQkJfQotCX0KLQkvLyBmb3IgY29tcGF0aWJsZSB3aXRoIG9sZCBBUEkganVzdCBkbyB0aGUgcHJpbnRrIHRvIGNvbnNvbGUKLQkvL3dycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihtc2cpOwotCS8vaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBtc2csIHdycS0+dS5kYXRhLmxlbmd0aCkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyIsIG1zZykpOwotCX0KLQotCWtmcmVlKG1zZyk7Ci19Ci0KLUlOVAlTZXRfQkFTZXR1cF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLSAgICBVQ0hBUiBtYWNbNl0sIHRpZDsKLQljaGFyICp0b2tlbiwgc2VwVmFsdWVbXSA9ICI6IiwgREFTSCA9ICctJzsKLQlJTlQgaTsKLSAgICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKLQotLyoKLQlUaGUgQkFTZXR1cCBpbnVwdCBzdHJpbmcgZm9ybWF0IHNob3VsZCBiZSB4eDp4eDp4eDp4eDp4eDp4eC1kLAotCQk9PlRoZSBzaXggMiBkaWdpdCBoZXgtZGVjaW1hbCBudW1iZXIgcHJldmlvdXMgYXJlIHRoZSBNYWMgYWRkcmVzcywKLQkJPT5UaGUgc2V2ZW50aCBkZWNpbWFsIG51bWJlciBpcyB0aGUgdGlkIHZhbHVlLgotKi8KLQotCWlmKHN0cmxlbihhcmcpIDwgMTkpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNyBwbHVzIHRoZSAiLSIgYW5kIHRpZCB2YWx1ZSBpbiBkZWNpbWFsIGZvcm1hdC4KLQkJcmV0dXJuIEZBTFNFOwotCi0JdG9rZW4gPSBzdHJjaHIoYXJnLCBEQVNIKTsKLQlpZiAoKHRva2VuICE9IE5VTEwpICYmIChzdHJsZW4odG9rZW4pPjEpKQotCXsKLQkJdGlkID0gc2ltcGxlX3N0cnRvbCgodG9rZW4rMSksIDAsIDEwKTsKLQkJaWYgKHRpZCA+IDE1KQotCQkJcmV0dXJuIEZBTFNFOwotCi0JCSp0b2tlbiA9ICdcMCc7Ci0JCWZvciAoaSA9IDAsIHRva2VuID0gcnN0cnRvayhhcmcsICZzZXBWYWx1ZVswXSk7IHRva2VuOyB0b2tlbiA9IHJzdHJ0b2soTlVMTCwgJnNlcFZhbHVlWzBdKSwgaSsrKQotCQl7Ci0JCQlpZigoc3RybGVuKHRva2VuKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp0b2tlbikpIHx8ICghaXN4ZGlnaXQoKih0b2tlbisxKSkpKQotCQkJCXJldHVybiBGQUxTRTsKLQkJCUF0b0godG9rZW4sIChQVUNIQVIpKCZtYWNbaV0pLCAxKTsKLQkJfQotCQlpZihpICE9IDYpCi0JCQlyZXR1cm4gRkFMU0U7Ci0KLQkJcHJpbnRrKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LSUwMnhcbiIsIG1hY1swXSwgbWFjWzFdLAotCQkJCW1hY1syXSwgbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSwgdGlkKTsKLQotCSAgICBwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIG1hYyk7Ci0KLSAgICAJaWYgKHBFbnRyeSkgewotICAgICAgICAJcHJpbnRrKCJcblNldHVwIEJBIFNlc3Npb246IFRpZCA9ICVkXG4iLCB0aWQpOwotCSAgICAgICAgQkFPcmlTZXNzaW9uU2V0VXAocEFkLCBwRW50cnksIHRpZCwgMCwgMTAwLCBUUlVFKTsKLSAgICAJfQotCi0JCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKLQotfQotCi1JTlQJU2V0X0JBRGVjbGluZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlVTE9ORyBiQkFEZWNsaW5lOwotCi0JYkJBRGVjbGluZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoYkJBRGVjbGluZSA9PSAwKQotCXsKLQkJcEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9IEZBTFNFOwotCX0KLQllbHNlIGlmIChiQkFEZWNsaW5lID09IDEpCi0JewotCQlwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID0gVFJVRTsKLQl9CisJaWYgKGVuYyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisJCXJldHVybiAiTk9ORSI7CisJaWYgKGVuYyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkKKwkJcmV0dXJuICJXRVAiOworCWlmIChlbmMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJcmV0dXJuICJUS0lQIjsKKwlpZiAoZW5jID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCXJldHVybiAiQUVTIjsKKwlpZiAoZW5jID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQpCisJCXJldHVybiAiVEtJUEFFUyI7CiAJZWxzZQotCXsKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQkFEZWNsaW5lX1Byb2M6OihCQURlY2xpbmU9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lKSk7Ci0KLQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuICJVTktOT1ciOwogfQogCi1JTlQJU2V0X0JBT3JpVGVhckRvd25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCitjaGFyICpHZXRBdXRoTW9kZShjaGFyIGF1dGgpCiB7Ci0gICAgVUNIQVIgbWFjWzZdLCB0aWQ7Ci0JY2hhciAqdG9rZW4sIHNlcFZhbHVlW10gPSAiOiIsIERBU0ggPSAnLSc7Ci0JSU5UIGk7Ci0gICAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisJaWYgKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKwkJcmV0dXJuICJPUEVOIjsKKwlpZiAoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisJCXJldHVybiAiU0hBUkVEIjsKKwlpZiAoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKQorCQlyZXR1cm4gIkFVVE9XRVAiOworCWlmIChhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJcmV0dXJuICJXUEEiOworCWlmIChhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykKKwkJcmV0dXJuICJXUEFQU0siOworCWlmIChhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCXJldHVybiAiV1BBTk9ORSI7CisJaWYgKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKwkJcmV0dXJuICJXUEEyIjsKKwlpZiAoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorCQlyZXR1cm4gIldQQTJQU0siOworCWlmIChhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyKQorCQlyZXR1cm4gIldQQTFXUEEyIjsKKwlpZiAoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSykKKwkJcmV0dXJuICJXUEExUFNLV1BBMlBTSyI7CiAKLS8qCi0JVGhlIEJBT3JpVGVhckRvd24gaW51cHQgc3RyaW5nIGZvcm1hdCBzaG91bGQgYmUgeHg6eHg6eHg6eHg6eHg6eHgtZCwKLQkJPT5UaGUgc2l4IDIgZGlnaXQgaGV4LWRlY2ltYWwgbnVtYmVyIHByZXZpb3VzIGFyZSB0aGUgTWFjIGFkZHJlc3MsCi0JCT0+VGhlIHNldmVudGggZGVjaW1hbCBudW1iZXIgaXMgdGhlIHRpZCB2YWx1ZS4KLSovCi0gICAgaWYoc3RybGVuKGFyZykgPCAxOSkgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3IHBsdXMgdGhlICItIiBhbmQgdGlkIHZhbHVlIGluIGRlY2ltYWwgZm9ybWF0LgotCQlyZXR1cm4gRkFMU0U7Ci0KLQl0b2tlbiA9IHN0cmNocihhcmcsIERBU0gpOwotCWlmICgodG9rZW4gIT0gTlVMTCkgJiYgKHN0cmxlbih0b2tlbik+MSkpCi0JewotCQl0aWQgPSBzaW1wbGVfc3RydG9sKCh0b2tlbisxKSwgMCwgMTApOwotCQlpZiAodGlkID4gTlVNX09GX1RJRCkKLQkJCXJldHVybiBGQUxTRTsKLQotCQkqdG9rZW4gPSAnXDAnOwotCQlmb3IgKGkgPSAwLCB0b2tlbiA9IHJzdHJ0b2soYXJnLCAmc2VwVmFsdWVbMF0pOyB0b2tlbjsgdG9rZW4gPSByc3RydG9rKE5VTEwsICZzZXBWYWx1ZVswXSksIGkrKykKLQkJewotCQkJaWYoKHN0cmxlbih0b2tlbikgIT0gMikgfHwgKCFpc3hkaWdpdCgqdG9rZW4pKSB8fCAoIWlzeGRpZ2l0KCoodG9rZW4rMSkpKSkKLQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQlBdG9IKHRva2VuLCAoUFVDSEFSKSgmbWFjW2ldKSwgMSk7Ci0JCX0KLQkJaWYoaSAhPSA2KQotCQkJcmV0dXJuIEZBTFNFOwotCi0JICAgIHByaW50aygiXG4lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC0lMDJ4IiwgbWFjWzBdLCBtYWNbMV0sCi0JICAgICAgICAgICBtYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0sIHRpZCk7Ci0KLQkgICAgcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBtYWMpOwotCi0JICAgIGlmIChwRW50cnkpIHsKLQkgICAgICAgIHByaW50aygiXG5UZWFyIGRvd24gT3JpIEJBIFNlc3Npb246IFRpZCA9ICVkXG4iLCB0aWQpOwotICAgICAgICBCQU9yaVNlc3Npb25UZWFyRG93bihwQWQsIHBFbnRyeS0+QWlkLCB0aWQsIEZBTFNFLCBUUlVFKTsKLQkgICAgfQotCi0JCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKLQorCXJldHVybiAiVU5LTk9XIjsKIH0KIAotSU5UCVNldF9CQVJlY1RlYXJEb3duX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQoraW50IFNldENvbW1vbkhUKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLSAgICBVQ0hBUiBtYWNbNl0sIHRpZDsKLQljaGFyICp0b2tlbiwgc2VwVmFsdWVbXSA9ICI6IiwgREFTSCA9ICctJzsKLQlJTlQgaTsKLSAgICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKLQotICAgIC8vcHJpbnRrKCJcbiVzXG4iLCBhcmcpOwotLyoKLQlUaGUgQkFSZWNUZWFyRG93biBpbnVwdCBzdHJpbmcgZm9ybWF0IHNob3VsZCBiZSB4eDp4eDp4eDp4eDp4eDp4eC1kLAotCQk9PlRoZSBzaXggMiBkaWdpdCBoZXgtZGVjaW1hbCBudW1iZXIgcHJldmlvdXMgYXJlIHRoZSBNYWMgYWRkcmVzcywKLQkJPT5UaGUgc2V2ZW50aCBkZWNpbWFsIG51bWJlciBpcyB0aGUgdGlkIHZhbHVlLgotKi8KLSAgICBpZihzdHJsZW4oYXJnKSA8IDE5KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcgcGx1cyB0aGUgIi0iIGFuZCB0aWQgdmFsdWUgaW4gZGVjaW1hbCBmb3JtYXQuCi0JCXJldHVybiBGQUxTRTsKLQotCXRva2VuID0gc3RyY2hyKGFyZywgREFTSCk7Ci0JaWYgKCh0b2tlbiAhPSBOVUxMKSAmJiAoc3RybGVuKHRva2VuKT4xKSkKLQl7Ci0JCXRpZCA9IHNpbXBsZV9zdHJ0b2woKHRva2VuKzEpLCAwLCAxMCk7Ci0JCWlmICh0aWQgPiBOVU1fT0ZfVElEKQotCQkJcmV0dXJuIEZBTFNFOwotCi0JCSp0b2tlbiA9ICdcMCc7Ci0JCWZvciAoaSA9IDAsIHRva2VuID0gcnN0cnRvayhhcmcsICZzZXBWYWx1ZVswXSk7IHRva2VuOyB0b2tlbiA9IHJzdHJ0b2soTlVMTCwgJnNlcFZhbHVlWzBdKSwgaSsrKQotCQl7Ci0JCQlpZigoc3RybGVuKHRva2VuKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp0b2tlbikpIHx8ICghaXN4ZGlnaXQoKih0b2tlbisxKSkpKQotCQkJCXJldHVybiBGQUxTRTsKLQkJCUF0b0godG9rZW4sIChQVUNIQVIpKCZtYWNbaV0pLCAxKTsKLQkJfQotCQlpZihpICE9IDYpCi0JCQlyZXR1cm4gRkFMU0U7Ci0KLQkJcHJpbnRrKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LSUwMngiLCBtYWNbMF0sIG1hY1sxXSwKLQkJICAgICAgIG1hY1syXSwgbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSwgdGlkKTsKLQotCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIG1hYyk7Ci0KLQkJaWYgKHBFbnRyeSkgewotCQkgICAgcHJpbnRrKCJcblRlYXIgZG93biBSZWMgQkEgU2Vzc2lvbjogVGlkID0gJWRcbiIsIHRpZCk7Ci0JCSAgICBCQVJlY1Nlc3Npb25UZWFyRG93bihwQWQsIHBFbnRyeS0+QWlkLCB0aWQsIEZBTFNFKTsKLQkJfQotCi0JCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKLQotfQotCi1JTlQJU2V0X0h0QndfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVUxPTkcgSHRCdzsKLQotCUh0QncgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCWlmIChIdEJ3ID09IEJXXzQwKQotCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfNDA7Ci0JZWxzZSBpZiAoSHRCdyA9PSBCV18yMCkKLQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlTZXRDb21tb25IVChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0QndfUHJvYzo6KEh0Qnc9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0TWNzX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVMT05HIEh0TWNzLCBNY3NfdG1wOwotICAgIEJPT0xFQU4gYkF1dG9SYXRlID0gRkFMU0U7Ci0KLQlNY3NfdG1wID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChNY3NfdG1wIDw9IDE1IHx8IE1jc190bXAgPT0gMzIpCi0JCUh0TWNzID0gTWNzX3RtcDsKLQllbHNlCi0JCUh0TWNzID0gTUNTX0FVVE87Ci0KLQl7Ci0JCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gSHRNY3M7Ci0JCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gKEh0TWNzID09IE1DU19BVVRPKSA/IFRSVUU6RkFMU0U7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE1jc19Qcm9jOjooSHRNY3M9JWQsIGJBdXRvVHhSYXRlU3dpdGNoID0gJWQpXG4iLAotCQkJCQkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MsIHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoKSk7Ci0KLQkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDwgUEhZXzExQUJHTl9NSVhFRCkgfHwKLQkJCShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFIDwgTU9ERV9IVE1JWCkpCi0JCXsKLQkgICAgICAgIGlmICgocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgIT0gTUNTX0FVVE8pICYmCi0JCQkJKEh0TWNzID49IDAgJiYgSHRNY3MgPD0gMykgJiYKLQkgICAgICAgICAgICAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSA9PSBGSVhFRF9UWE1PREVfQ0NLKSkKLQkJCXsKLQkJCQlSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgKExPTkcpIChSYXRlSWRUb01icHNbSHRNY3NdICogMTAwMDAwMCkpOwotCQkJfQotCSAgICAgICAgZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICE9IE1DU19BVVRPKSAmJgotCQkJCQkoSHRNY3MgPj0gMCAmJiBIdE1jcyA8PSA3KSAmJgotCSAgICAgICAgICAgIAkocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSA9PSBGSVhFRF9UWE1PREVfT0ZETSkpCi0JCQl7Ci0JCQkJUlRNUFNldERlc2lyZWRSYXRlcyhwQWQsIChMT05HKSAoUmF0ZUlkVG9NYnBzW0h0TWNzKzRdICogMTAwMDAwMCkpOwotCQkJfQotCQkJZWxzZQotCQkJCWJBdXRvUmF0ZSA9IFRSVUU7Ci0KLQkJCWlmIChiQXV0b1JhdGUpCi0JCQl7Ci0JICAgICAgICAgICAgcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKLQkJCQlSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgLTEpOwotCQkJfQotCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0TWNzX1Byb2M6OihGaXhlZFR4TW9kZT0lZClcbiIscEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSkpOwotCQl9Ci0gICAgICAgIGlmIChBREhPQ19PTihwQWQpKQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0JfQotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0R2lfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVUxPTkcgSHRHaTsKLQotCUh0R2kgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKCBIdEdpID09IEdJXzQwMCkKLQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kgPSBHSV80MDA7Ci0JZWxzZSBpZiAoIEh0R2kgPT0gR0lfODAwICkKLQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEdpX1Byb2M6OihTaG9ydEdJPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotSU5UCVNldF9IdFR4QkFTaXplX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVDSEFSIFNpemU7Ci0KLQlTaXplID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChTaXplIDw9MCB8fCBTaXplID49NjQpCi0JewotCQlTaXplID0gODsKLQl9Ci0JcEFkLT5Db21tb25DZmcuVHhCQVNpemUgPSBTaXplLTE7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0h0VHhCQVNpemUgOjooVHhCQVNpemU9ICVkKVxuIiwgU2l6ZSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotSU5UCVNldF9IdE9wTW9kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKFZhbHVlID09IEhUTU9ERV9HRikKLQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSAgPSBIVE1PREVfR0Y7Ci0JZWxzZSBpZiAoIFZhbHVlID09IEhUTU9ERV9NTSApCi0JCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUgID0gSFRNT0RFX01NOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRPcE1vZGVfUHJvYzo6KEh0T3BNb2RlPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLQotfQotCi1JTlQJU2V0X0h0U3RiY19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKFZhbHVlID09IFNUQkNfVVNFKQotCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQyA9IFNUQkNfVVNFOwotCWVsc2UgaWYgKCBWYWx1ZSA9PSBTVEJDX05PTkUgKQotCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlTZXRDb21tb25IVChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1N0YmNfUHJvYzo6KEh0U3RiYz0lZClcbiIscEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkMpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0SHRjX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCi0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0JaWYgKFZhbHVlID09IDApCi0JCXBBZC0+SFRDRW5hYmxlID0gRkFMU0U7Ci0JZWxzZSBpZiAoIFZhbHVlID09MSApCi0gICAgICAgIAlwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0SHRjX1Byb2M6OihIdEh0Yz0lZClcbiIscEFkLT5IVENFbmFibGUpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0RXh0Y2hhX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCi0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoVmFsdWUgPT0gMCkKLQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSAgPSBFWFRDSEFfQkVMT1c7Ci0JZWxzZSBpZiAoIFZhbHVlID09MSApCi0gICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQUJPVkU7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEV4dGNoYV9Qcm9jOjooSHRFeHRjaGE9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0TXBkdURlbnNpdHlfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoVmFsdWUgPD03ICYmIFZhbHVlID49IDApCi0JCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IFZhbHVlOwotCWVsc2UKLQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gNDsKLQotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRNcGR1RGVuc2l0eV9Qcm9jOjooSHRNcGR1RGVuc2l0eT0lZClcbiIscEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5KSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UCVNldF9IdEJhV2luU2l6ZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCi0JaWYgKFZhbHVlID49MSAmJiBWYWx1ZSA8PSA2NCkKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSBWYWx1ZTsKLQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IFZhbHVlOwotCX0KLQllbHNlCi0JewotICAgICAgICBwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gNjQ7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSA2NDsKLQl9Ci0KLQlTZXRDb21tb25IVChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0QmFXaW5TaXplX1Byb2M6OihIdEJhV2luU2l6ZT0lZClcbiIscEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfSHRSZGdfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoVmFsdWUgPT0gMCkKLQkJcEFkLT5Db21tb25DZmcuYlJkZyA9IEZBTFNFOwotCWVsc2UgaWYgKCBWYWx1ZSA9PTEgKQotCXsKLQkJcEFkLT5IVENFbmFibGUgPSBUUlVFOwotICAgICAgICAJcEFkLT5Db21tb25DZmcuYlJkZyA9IFRSVUU7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRSZGdfUHJvYzo6KEh0UmRnPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5iUmRnKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UCVNldF9IdExpbmtBZGFwdF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlpZiAoVmFsdWUgPT0gMCkKLQkJcEFkLT5iTGlua0FkYXB0ID0gRkFMU0U7Ci0JZWxzZSBpZiAoIFZhbHVlID09MSApCi0JewotCQkJcEFkLT5IVENFbmFibGUgPSBUUlVFOwotCQkJcEFkLT5iTGlua0FkYXB0ID0gVFJVRTsKLQl9Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0TGlua0FkYXB0X1Byb2M6OihIdExpbmtBZGFwdD0lZClcbiIscEFkLT5iTGlua0FkYXB0KSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UCVNldF9IdEFtc2R1X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCWlmIChWYWx1ZSA9PSAwKQotCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUgPSBGQUxTRTsKLQllbHNlIGlmICggVmFsdWUgPT0gMSApCi0gICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSA9IFRSVUU7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEFtc2R1X1Byb2M6OihIdEFtc2R1PSVkKVxuIixwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0QXV0b0JhX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCWlmIChWYWx1ZSA9PSAwKQotCXsKLQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IEZBTFNFOwotCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gQkFfTk9UVVNFOwotCX0KLSAgICBlbHNlIGlmIChWYWx1ZSA9PSAxKQotCXsKLQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IFRSVUU7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBJTU1FRF9CQTsKLQl9Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0gICAgcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkE7Ci0gICAgcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3k7Ci0KLQlTZXRDb21tb25IVChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0QXV0b0JhX1Byb2M6OihIdEF1dG9CYT0lZClcbiIscEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSkpOwotCi0JcmV0dXJuIFRSVUU7Ci0KLX0KLQotSU5UCVNldF9IdFByb3RlY3RfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0JaWYgKFZhbHVlID09IDApCi0JCXBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QgPSBGQUxTRTsKLSAgICBlbHNlIGlmIChWYWx1ZSA9PSAxKQotCQlwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0ID0gVFJVRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRQcm90ZWN0X1Byb2M6OihIdFByb3RlY3Q9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X1NlbmRQU01QQWN0aW9uX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotICAgIFVDSEFSIG1hY1s2XSwgbW9kZTsKLQljaGFyICp0b2tlbiwgc2VwVmFsdWVbXSA9ICI6IiwgREFTSCA9ICctJzsKLQlJTlQgaTsKLSAgICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKLQotICAgIC8vcHJpbnRrKCJcbiVzXG4iLCBhcmcpOwotLyoKLQlUaGUgQkFSZWNUZWFyRG93biBpbnVwdCBzdHJpbmcgZm9ybWF0IHNob3VsZCBiZSB4eDp4eDp4eDp4eDp4eDp4eC1kLAotCQk9PlRoZSBzaXggMiBkaWdpdCBoZXgtZGVjaW1hbCBudW1iZXIgcHJldmlvdXMgYXJlIHRoZSBNYWMgYWRkcmVzcywKLQkJPT5UaGUgc2V2ZW50aCBkZWNpbWFsIG51bWJlciBpcyB0aGUgbW9kZSB2YWx1ZS4KLSovCi0gICAgaWYoc3RybGVuKGFyZykgPCAxOSkgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3IHBsdXMgdGhlICItIiBhbmQgbW9kZSB2YWx1ZSBpbiBkZWNpbWFsIGZvcm1hdC4KLQkJcmV0dXJuIEZBTFNFOwotCi0gICAJdG9rZW4gPSBzdHJjaHIoYXJnLCBEQVNIKTsKLQlpZiAoKHRva2VuICE9IE5VTEwpICYmIChzdHJsZW4odG9rZW4pPjEpKQotCXsKLQkJbW9kZSA9IHNpbXBsZV9zdHJ0b2woKHRva2VuKzEpLCAwLCAxMCk7Ci0JCWlmIChtb2RlID4gTU1QU19FTkFCTEUpCi0JCQlyZXR1cm4gRkFMU0U7Ci0KLQkJKnRva2VuID0gJ1wwJzsKLQkJZm9yIChpID0gMCwgdG9rZW4gPSByc3RydG9rKGFyZywgJnNlcFZhbHVlWzBdKTsgdG9rZW47IHRva2VuID0gcnN0cnRvayhOVUxMLCAmc2VwVmFsdWVbMF0pLCBpKyspCi0JCXsKLQkJCWlmKChzdHJsZW4odG9rZW4pICE9IDIpIHx8ICghaXN4ZGlnaXQoKnRva2VuKSkgfHwgKCFpc3hkaWdpdCgqKHRva2VuKzEpKSkpCi0JCQkJcmV0dXJuIEZBTFNFOwotCQkJQXRvSCh0b2tlbiwgKFBVQ0hBUikoJm1hY1tpXSksIDEpOwotCQl9Ci0JCWlmKGkgIT0gNikKLQkJCXJldHVybiBGQUxTRTsKLQotCQlwcmludGsoIlxuJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngtJTAyeCIsIG1hY1swXSwgbWFjWzFdLAotCQkgICAgICAgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdLCBtb2RlKTsKLQotCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIG1hYyk7Ci0KLQkJaWYgKHBFbnRyeSkgewotCQkgICAgcHJpbnRrKCJcblNlbmRQU01QQWN0aW9uIE1JUFMgbW9kZSA9ICVkXG4iLCBtb2RlKTsKLQkJICAgIFNlbmRQU01QQWN0aW9uKHBBZCwgcEVudHJ5LT5BaWQsIG1vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIFRSVUU7Ci0JfQotCi0JcmV0dXJuIEZBTFNFOwotCi0KLX0KLQotSU5UCVNldF9IdE1JTU9QU21vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoVmFsdWUgPD0zICYmIFZhbHVlID49IDApCi0JCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IFZhbHVlOwotCWVsc2UKLQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gMzsKLQotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRNSU1PUFNtb2RlX1Byb2M6OihNSU1PUFMgbW9kZT0lZClcbiIscEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi1JTlQJU2V0X0ZvcmNlU2hvcnRHSV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlpZiAoVmFsdWUgPT0gMCkKLQkJcEFkLT5XSUZJdGVzdGJlZC5iU2hvcnRHSSA9IEZBTFNFOwotCWVsc2UgaWYgKFZhbHVlID09IDEpCi0JCXBBZC0+V0lGSXRlc3RiZWQuYlNob3J0R0kgPSBUUlVFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRm9yY2VTaG9ydEdJX1Byb2M6OihGb3JjZVNob3J0R0k9JWQpXG4iLCBwQWQtPldJRkl0ZXN0YmVkLmJTaG9ydEdJKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0KLUlOVAlTZXRfRm9yY2VHRl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlpZiAoVmFsdWUgPT0gMCkKLQkJcEFkLT5XSUZJdGVzdGJlZC5iR3JlZW5GaWVsZCA9IEZBTFNFOwotCWVsc2UgaWYgKFZhbHVlID09IDEpCi0JCXBBZC0+V0lGSXRlc3RiZWQuYkdyZWVuRmllbGQgPSBUUlVFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRm9yY2VHRl9Qcm9jOjooRm9yY2VHRj0lZClcbiIsIHBBZC0+V0lGSXRlc3RiZWQuYkdyZWVuRmllbGQpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0TWltb1BzX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCWlmIChWYWx1ZSA9PSAwKQotCQlwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlID0gRkFMU0U7Ci0JZWxzZSBpZiAoVmFsdWUgPT0gMSkKLQkJcEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSA9IFRSVUU7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0TWltb1BzX1Byb2M6OihIdE1pbW9Qcz0lZClcbiIscEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRDb21tb25IVCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlPSURfU0VUX0hUX1BIWU1PREUJCVNldEhUOworCXN0cnVjdCBydF9vaWRfc2V0X2h0X3BoeW1vZGUgU2V0SFQ7CiAKIAlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8IFBIWV8xMUFCR05fTUlYRUQpCiAJCXJldHVybiBGQUxTRTsKIAogCVNldEhULlBoeU1vZGUgPSBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlOwotCVNldEhULlRyYW5zbWl0Tm8gPSAoKFVDSEFSKXBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGgpOwotCVNldEhULkh0TW9kZSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFOwotCVNldEhULkV4dE9mZnNldCA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBOworCVNldEhULlRyYW5zbWl0Tm8gPSAoKHU4KXBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGgpOworCVNldEhULkh0TW9kZSA9ICh1OClwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFOworCVNldEhULkV4dE9mZnNldCA9CisJICAgICh1OClwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBOwogCVNldEhULk1DUyA9IE1DU19BVVRPOwotCVNldEhULkJXID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVzsKLQlTZXRIVC5TVEJDID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDOwotCVNldEhULlNIT1JUR0kgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0k7CisJU2V0SFQuQlcgPSAodTgpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXOworCVNldEhULlNUQkMgPSAodTgpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkM7CisJU2V0SFQuU0hPUlRHSSA9ICh1OClwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSTsKIAogCVJUTVBTZXRIVChwQWQsICZTZXRIVCk7CiAKIAlyZXR1cm4gVFJVRTsKIH0KIAotSU5UCVNldF9GaXhlZFR4TW9kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKK2NoYXIgKlJUTVBHZXRSYWxpbmtFbmNyeU1vZGVTdHIodTE2IGVuY3J5TW9kZSkKIHsKLQlVQ0hBUglmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKLQotCWlmIChzdHJjbXAoYXJnLCAiT0ZETSIpID09IDAgfHwgc3RyY21wKGFyZywgIm9mZG0iKSA9PSAwKQotCXsKLQkJZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfT0ZETTsKLQl9Ci0JZWxzZSBpZiAoc3RyY21wKGFyZywgIkNDSyIpID09IDAgfHwgc3RyY21wKGFyZywgImNjayIpID09IDApCi0JewotICAgICAgICBmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9DQ0s7Ci0JfQotCi0JcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSA9IGZpeF90eF9tb2RlOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0ZpeGVkVHhNb2RlX1Byb2M6OihGaXhlZFR4TW9kZT0lZClcbiIsIGZpeF90eF9tb2RlKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotUENIQVIgICBSVE1QR2V0UmFsaW5rQXV0aE1vZGVTdHIoCi0gICAgSU4gIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgYXV0aE1vZGUpCi17Ci0Jc3dpdGNoKGF1dGhNb2RlKQotCXsKLQkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOgotCQkJcmV0dXJuICJPUEVOIjsKLQkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s6Ci0JCQlyZXR1cm4gIldQQVBTSyI7Ci0JCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOgotCQkJcmV0dXJuICJTSEFSRUQiOwotCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQToKLQkJCXJldHVybiAiV1BBIjsKLQkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOgotCQkJcmV0dXJuICJXUEEyIjsKLQkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOgotCQkJcmV0dXJuICJXUEEyUFNLIjsKLSAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSzoKLQkJCXJldHVybiAiV1BBUFNLV1BBMlBTSyI7Ci0gICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMVdQQTI6Ci0JCQlyZXR1cm4gIldQQTFXUEEyIjsKLQkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOgotCQkJcmV0dXJuICJXUEFOT05FIjsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAiVU5LTk9XIjsKKwlzd2l0Y2ggKGVuY3J5TW9kZSkgeworCWNhc2UgTmRpczgwMl8xMVdFUERpc2FibGVkOgorCQlyZXR1cm4gIk5PTkUiOworCWNhc2UgTmRpczgwMl8xMVdFUEVuYWJsZWQ6CisJCXJldHVybiAiV0VQIjsKKwljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ6CisJCXJldHVybiAiVEtJUCI7CisJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOgorCQlyZXR1cm4gIkFFUyI7CisJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkOgorCQlyZXR1cm4gIlRLSVBBRVMiOworCWRlZmF1bHQ6CisJCXJldHVybiAiVU5LTk9XIjsKIAl9CiB9Ci0KLVBDSEFSICAgUlRNUEdldFJhbGlua0VuY3J5TW9kZVN0cigKLSAgICBJTiAgVVNIT1JUIGVuY3J5TW9kZSkKLXsKLQlzd2l0Y2goZW5jcnlNb2RlKQotCXsKLSNpZiBkZWZpbmVkKFJUMjg2MCkgfHwgZGVmaW5lZChSVDMweHgpCi0JICAgIGRlZmF1bHQ6Ci0jZW5kaWYKLQkJY2FzZSBOZGlzODAyXzExV0VQRGlzYWJsZWQ6Ci0JCQlyZXR1cm4gIk5PTkUiOwotCQljYXNlIE5kaXM4MDJfMTFXRVBFbmFibGVkOgotCQkJcmV0dXJuICJXRVAiOwotCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ6Ci0JCQlyZXR1cm4gIlRLSVAiOwotCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ6Ci0JCQlyZXR1cm4gIkFFUyI7Ci0gICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDoKLQkJCXJldHVybiAiVEtJUEFFUyI7Ci0jaWYgIWRlZmluZWQoUlQyODYwKSAmJiAhZGVmaW5lZChSVDMweHgpCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gIlVOS05PVyI7Ci0jZW5kaWYKLQl9Ci19Ci0KLUlOVCBSVE1QU2hvd0NmZ1ZhbHVlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBOYW1lLAotCUlOCVBVQ0hBUgkJCXBCdWYpCi17Ci0JSU5UCVN0YXR1cyA9IDA7Ci0KLQlmb3IgKFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MgPSBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0M7IFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPm5hbWU7IFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MrKykKLQl7Ci0JCWlmICghc3RyY21wKHBOYW1lLCBQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DLT5uYW1lKSkKLQkJewotCQkJaWYoUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+c2hvd19wcm9jKHBBZCwgcEJ1ZikpCi0JCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCWJyZWFrOyAgLy9FeGl0IGZvciBsb29wLgotCQl9Ci0JfQotCi0JaWYoUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZSA9PSBOVUxMKQotCXsKLQkJc3ByaW50ZihwQnVmLCAiXG4iKTsKLQkJZm9yIChQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DID0gUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DOyBQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DLT5uYW1lOyBQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DKyspCi0JCQlzcHJpbnRmKHBCdWYgKyBzdHJsZW4ocEJ1ZiksICIlc1xuIiwgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZSk7Ci0JfQotCi0JcmV0dXJuIFN0YXR1czsKLX0KLQotSU5UCVNob3dfU1NJRF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5Tc2lkKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfV2lyZWxlc3NNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpCi0JewotCQljYXNlIFBIWV8xMUJHX01JWEVEOgotCQkJc3ByaW50ZihwQnVmLCAiXHQxMUIvRyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExQjoKLQkJCXNwcmludGYocEJ1ZiwgIlx0MTFCIik7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFBOgotCQkJc3ByaW50ZihwQnVmLCAiXHQxMUEiKTsKLQkJCWJyZWFrOwotCQljYXNlIFBIWV8xMUFCR19NSVhFRDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0MTFBL0IvRyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExRzoKLQkJCXNwcmludGYocEJ1ZiwgIlx0MTFHIik7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgotCQkJc3ByaW50ZihwQnVmLCAiXHQxMUEvQi9HL04iKTsKLQkJCWJyZWFrOwotCQljYXNlIFBIWV8xMU5fMl80RzoKLQkJCXNwcmludGYocEJ1ZiwgIlx0MTFOIG9ubHkgd2l0aCAyLjRHIik7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFHTl9NSVhFRDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0MTFHL04iKTsKLQkJCWJyZWFrOwotCQljYXNlIFBIWV8xMUFOX01JWEVEOgotCQkJc3ByaW50ZihwQnVmLCAiXHQxMUEvTiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExQkdOX01JWEVEOgotCQkJc3ByaW50ZihwQnVmLCAiXHQxMUIvRy9OIik7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFBR05fTUlYRUQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdDExQS9HL04iKTsKLQkJCWJyZWFrOwotCQljYXNlIFBIWV8xMU5fNUc6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdDExTiBvbmx5IHdpdGggNUciKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJWQpIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSk7Ci0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLQotSU5UCVNob3dfVHhCdXJzdF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA/ICJUUlVFIjoiRkFMU0UiKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfVHhQcmVhbWJsZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCXN3aXRjaChwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlKQotCXsKLQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlU2hvcnQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdFNob3J0Iik7Ci0JCQlicmVhazsKLQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlTG9uZzoKLQkJCXNwcmludGYocEJ1ZiwgIlx0TG9uZyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZUF1dG86Ci0JCQlzcHJpbnRmKHBCdWYsICJcdEF1dG8iKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJWx1KSIsIHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpOwotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X1R4UG93ZXJfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlzcHJpbnRmKHBCdWYsICJcdCVsdSIsIHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfQ2hhbm5lbF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JWQiLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfQkdQcm90ZWN0aW9uX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbikKLQl7Ci0JCWNhc2UgMTogLy9BbHdheXMgT24KLQkJCXNwcmludGYocEJ1ZiwgIlx0T04iKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6IC8vQWx3YXlzIE9GRgotCQkJc3ByaW50ZihwQnVmLCAiXHRPRkYiKTsKLQkJCWJyZWFrOwotCQljYXNlIDA6IC8vQVVUTwotCQkJc3ByaW50ZihwQnVmLCAiXHRBdXRvIik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVsdSkiLCBwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24pOwotCQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19SVFNUaHJlc2hvbGRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlzcHJpbnRmKHBCdWYsICJcdCV1IiwgcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfRnJhZ1RocmVzaG9sZF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0h0QndfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlpZiAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKQotCXsKLQkJc3ByaW50ZihwQnVmLCAiXHQ0MCBNSHoiKTsKLQl9Ci0JZWxzZQotCXsKLSAgICAgICAgc3ByaW50ZihwQnVmLCAiXHQyMCBNSHoiKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0h0TWNzX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQldSIsIHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfSHRHaV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCXN3aXRjaChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSkKLQl7Ci0JCWNhc2UgR0lfNDAwOgotCQkJc3ByaW50ZihwQnVmLCAiXHRHSV80MDAiKTsKLQkJCWJyZWFrOwotCQljYXNlIEdJXzgwMDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0R0lfODAwIik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCV1KSIsIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJKTsKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfSHRPcE1vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlzd2l0Y2gocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSkKLQl7Ci0JCWNhc2UgSFRNT0RFX0dGOgotCQkJc3ByaW50ZihwQnVmLCAiXHRHRiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSFRNT0RFX01NOgotCQkJc3ByaW50ZihwQnVmLCAiXHRNTSIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSgldSkiLCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFKTsKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfSHRFeHRjaGFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlzd2l0Y2gocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSkKLQl7Ci0JCWNhc2UgRVhUQ0hBX0JFTE9XOgotCQkJc3ByaW50ZihwQnVmLCAiXHRCZWxvdyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRVhUQ0hBX0FCT1ZFOgotCQkJc3ByaW50ZihwQnVmLCAiXHRBYm92ZSIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSgldSkiLCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBKTsKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi1JTlQJU2hvd19IdE1wZHVEZW5zaXR5X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQldSIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0h0QmFXaW5TaXplX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQldSIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19IdFJkZ19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5iUmRnID8gIlRSVUUiOiJGQUxTRSIpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19IdEFtc2R1X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSA/ICJUUlVFIjoiRkFMU0UiKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfSHRBdXRvQmFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA/ICJUUlVFIjoiRkFMU0UiKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfQ291bnRyeVJlZ2lvbl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JWQiLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQlZCIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0NvdW50cnlDb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlKTsKLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKLUlOVAlTaG93X1BrdEFnZ3JlZ2F0ZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID8gIlRSVUUiOiJGQUxTRSIpOwotCXJldHVybiAwOwotfQotI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KLQotI2lmZGVmIFdNTV9TVVBQT1JUCi1JTlQJU2hvd19XbW1DYXBhYmxlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID8gIlRSVUUiOiJGQUxTRSIpOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLy8gV01NX1NVUFBPUlQgLy8KLQotSU5UCVNob3dfSUVFRTgwMjExSF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA/ICJUUlVFIjoiRkFMU0UiKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfTmV0d29ya1R5cGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlzd2l0Y2gocEFkLT5TdGFDZmcuQnNzVHlwZSkKLQl7Ci0JCWNhc2UgQlNTX0FESE9DOgotCQkJc3ByaW50ZihwQnVmLCAiXHRBZGhvYyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQlNTX0lORlJBOgotCQkJc3ByaW50ZihwQnVmLCAiXHRJbmZyYSIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQlNTX0FOWToKLQkJCXNwcmludGYocEJ1ZiwgIlx0QW55Iik7Ci0JCQlicmVhazsKLQkJY2FzZSBCU1NfTU9OSVRPUjoKLQkJCXNwcmludGYocEJ1ZiwgIlx0TW9uaXRvciIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglZCkiLCBwQWQtPlN0YUNmZy5Cc3NUeXBlKTsKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfQXV0aE1vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFCUF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKLQotCUF1dGhNb2RlID0gcEFkLT5TdGFDZmcuQXV0aE1vZGU7Ci0KLQlpZiAoKEF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pICYmCi0JCShBdXRoTW9kZSA8PSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSykpCi0JCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBSVE1QR2V0UmFsaW5rQXV0aE1vZGVTdHIoQXV0aE1vZGUpKTsKLQllbHNlCi0JCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVkKSIsIEF1dGhNb2RlKTsKLQotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19FbmNyeXBUeXBlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0JTkRJU184MDJfMTFfV0VQX1NUQVRVUwlXZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0KLQlXZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7Ci0KLQlpZiAoKFdlcFN0YXR1cyA+PSBOZGlzODAyXzExV0VQRW5hYmxlZCkgJiYKLQkJKFdlcFN0YXR1cyA8PSBOZGlzODAyXzExRW5jcnlwdGlvbjRLZXlBYnNlbnQpKQotCQlzcHJpbnRmKHBCdWYsICJcdCVzIiwgUlRNUEdldFJhbGlua0VuY3J5TW9kZVN0cihXZXBTdGF0dXMpKTsKLQllbHNlCi0JCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVkKSIsIFdlcFN0YXR1cyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfRGVmYXVsdEtleUlEX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0JVUNIQVIgRGVmYXVsdEtleUlkID0gMDsKLQotCURlZmF1bHRLZXlJZCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKLQotCXNwcmludGYocEJ1ZiwgIlx0JWQiLCBEZWZhdWx0S2V5SWQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X1dlcEtleV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICBJTlQJCQkJS2V5SWR4LAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCVVDSEFSICAgS2V5WzE2XSA9IHswfSwgS2V5TGVuZ3RoID0gMDsKLQlJTlQJCWluZGV4ID0gQlNTMDsKLQotCUtleUxlbmd0aCA9IHBBZC0+U2hhcmVkS2V5W2luZGV4XVtLZXlJZHhdLktleUxlbjsKLQlOZGlzTW92ZU1lbW9yeShLZXksIHBBZC0+U2hhcmVkS2V5W2luZGV4XVtLZXlJZHhdLktleSwgS2V5TGVuZ3RoKTsKLQotCS8vY2hlY2sga2V5IHN0cmluZyBpcyBBU0NJSSBvciBub3QKLSAgICBpZiAoUlRNUENoZWNrU3RyUHJpbnRBYmxlKEtleSwgS2V5TGVuZ3RoKSkKLSAgICAgICAgc3ByaW50ZihwQnVmLCAiXHQlcyIsIEtleSk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaW50IGlkeDsKLSAgICAgICAgc3ByaW50ZihwQnVmLCAiXHQiKTsKLSAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBLZXlMZW5ndGg7IGlkeCsrKQotICAgICAgICAgICAgc3ByaW50ZihwQnVmK3N0cmxlbihwQnVmKSwgIiUwMlgiLCBLZXlbaWR4XSk7Ci0gICAgfQotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19LZXkxX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0JU2hvd19XZXBLZXlfUHJvYyhwQWQsIDAsIHBCdWYpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19LZXkyX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0JU2hvd19XZXBLZXlfUHJvYyhwQWQsIDEsIHBCdWYpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19LZXkzX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0JU2hvd19XZXBLZXlfUHJvYyhwQWQsIDIsIHBCdWYpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19LZXk0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0JU2hvd19XZXBLZXlfUHJvYyhwQWQsIDMsIHBCdWYpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19XUEFQU0tfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlJTlQgCWlkeDsKLQlVQ0hBUglQTUtbMzJdID0gezB9OwotCi0JTmRpc01vdmVNZW1vcnkoUE1LLCBwQWQtPlN0YUNmZy5QTUssIDMyKTsKLQotICAgIHNwcmludGYocEJ1ZiwgIlx0UE1LID0gIik7Ci0gICAgZm9yIChpZHggPSAwOyBpZHggPCAzMjsgaWR4KyspCi0gICAgICAgIHNwcmludGYocEJ1ZitzdHJsZW4ocEJ1ZiksICIlMDJYIiwgUE1LW2lkeF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9tYWNfcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fbWFjX3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MGViZDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fbWFjX3BjaS5jCkBAIC0wLDAgKzEsMTY2MSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZkZWYgUlRNUF9NQUNfUENJCisjaW5jbHVkZQkiLi4vcnRfY29uZmlnLmgiCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlBbGxvY2F0ZSBETUEgbWVtb3J5IGJsb2NrcyBmb3Igc2VuZCwgcmVjZWl2ZQorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQorCQlORElTX1NUQVRVU19SRVNPVVJDRVMKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlpbnQgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIFJpbmdCYXNlUGFIaWdoOworCXVuc2lnbmVkIGxvbmcgUmluZ0Jhc2VQYUxvdzsKKwl2b2lkICpSaW5nQmFzZVZhOworCWludCBpbmRleCwgbnVtOworCXN0cnVjdCBydF90eGQgKiBwVHhEOworCXN0cnVjdCBydF9yeGQgKiBwUnhEOworCXVuc2lnbmVkIGxvbmcgRXJyb3JWYWx1ZSA9IDA7CisJc3RydWN0IHJ0X3J0bXBfdHhfcmluZyAqcFR4UmluZzsKKwlzdHJ1Y3QgcnRfcnRtcF9kbWFidWYgKnBEbWFCdWY7CisJdm9pZCAqcFBhY2tldDsKKy8qICAgICAgUFJUTVBfUkVPUkRFUkJVRiAgICAgICAgcFJlb3JkZXJCdWY7ICovCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnlcbiIpKTsKKwlkbyB7CisJCS8qICovCisJCS8qIEFsbG9jYXRlIGFsbCByaW5nIGRlc2NyaXB0b3JzLCBpbmNsdWRlIFR4RCwgUnhELCBNZ210RC4gKi8KKwkJLyogQWx0aG91Z2ggZWFjaCBzaXplIGlzIGRpZmZlcmVudCwgdG8gcHJldmVudCBjYWNoZWxpbmUgYW5kIGFsaWdubWVudCAqLworCQkvKiBpc3N1ZSwgSSBpbnRlbnRpb25hbCBzZXQgdGhlbSBhbGwgdG8gNjQgYnl0ZXMuICovCisJCS8qICovCisJCWZvciAobnVtID0gMDsgbnVtIDwgTlVNX09GX1RYX1JJTkc7IG51bSsrKSB7CisJCQl1bnNpZ25lZCBsb25nIEJ1ZkJhc2VQYUhpZ2g7CisJCQl1bnNpZ25lZCBsb25nIEJ1ZkJhc2VQYUxvdzsKKwkJCXZvaWQgKkJ1ZkJhc2VWYTsKKworCQkJLyogKi8KKwkJCS8qIEFsbG9jYXRlIFR4IHJpbmcgZGVzY3JpcHRvcidzIG1lbW9yeSAoNSBUWCByaW5ncyA9IDQgQUNzICsgMSBIQ0NBKSAqLworCQkJLyogKi8KKwkJCXBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jU2l6ZSA9CisJCQkgICAgVFhfUklOR19TSVpFICogVFhEX1NJWkU7CisJCQlSVE1QX0FsbG9jYXRlVHhEZXNjTWVtb3J5KHBBZCwgbnVtLAorCQkJCQkJICBwQWQtPlR4RGVzY1JpbmdbbnVtXS4KKwkJCQkJCSAgQWxsb2NTaXplLCBGQUxTRSwKKwkJCQkJCSAgJnBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEsCisJCQkJCQkgICZwQWQtPlR4RGVzY1JpbmdbbnVtXS4KKwkJCQkJCSAgQWxsb2NQYSk7CisKKwkJCWlmIChwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhID09IE5VTEwpIHsKKwkJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOworCQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpKTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBaZXJvIGluaXQgdGhpcyBtZW1vcnkgYmxvY2sgKi8KKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEsCisJCQkJICAgICAgIHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jU2l6ZSk7CisKKwkJCS8qIFNhdmUgUEEgJiBWQSBmb3IgZnVydGhlciBvcGVyYXRpb24gKi8KKwkJCVJpbmdCYXNlUGFIaWdoID0KKwkJCSAgICBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2gocEFkLT5UeERlc2NSaW5nW251bV0uCisJCQkJCQkJQWxsb2NQYSk7CisJCQlSaW5nQmFzZVBhTG93ID0KKwkJCSAgICBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPlR4RGVzY1JpbmdbbnVtXS4KKwkJCQkJCSAgICAgICBBbGxvY1BhKTsKKwkJCVJpbmdCYXNlVmEgPSBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhOworCisJCQkvKiAqLworCQkJLyogQWxsb2NhdGUgYWxsIDFzdCBUWEJ1ZidzIG1lbW9yeSBmb3IgdGhpcyBUeFJpbmcgKi8KKwkJCS8qICovCisJCQlwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1NpemUgPQorCQkJICAgIFRYX1JJTkdfU0laRSAqIFRYX0RNQV8xU1RfQlVGRkVSX1NJWkU7CisJCQlSVE1QX0FsbG9jYXRlRmlyc3RUeEJ1ZmZlcihwQWQsIG51bSwKKwkJCQkJCSAgIHBBZC0+VHhCdWZTcGFjZVtudW1dLgorCQkJCQkJICAgQWxsb2NTaXplLCBGQUxTRSwKKwkJCQkJCSAgICZwQWQtPlR4QnVmU3BhY2VbbnVtXS4KKwkJCQkJCSAgIEFsbG9jVmEsCisJCQkJCQkgICAmcEFkLT5UeEJ1ZlNwYWNlW251bV0uCisJCQkJCQkgICBBbGxvY1BhKTsKKworCQkJaWYgKHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jVmEgPT0gTlVMTCkgeworCQkJCUVycm9yVmFsdWUgPSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlk7CisJCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIFplcm8gaW5pdCB0aGlzIG1lbW9yeSBibG9jayAqLworCQkJTmRpc1plcm9NZW1vcnkocEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NWYSwKKwkJCQkgICAgICAgcEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NTaXplKTsKKworCQkJLyogU2F2ZSBQQSAmIFZBIGZvciBmdXJ0aGVyIG9wZXJhdGlvbiAqLworCQkJQnVmQmFzZVBhSGlnaCA9CisJCQkgICAgUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+VHhCdWZTcGFjZVtudW1dLgorCQkJCQkJCUFsbG9jUGEpOworCQkJQnVmQmFzZVBhTG93ID0KKwkJCSAgICBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPlR4QnVmU3BhY2VbbnVtXS4KKwkJCQkJCSAgICAgICBBbGxvY1BhKTsKKwkJCUJ1ZkJhc2VWYSA9IHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jVmE7CisKKwkJCS8qICovCisJCQkvKiBJbml0aWFsaXplIFR4IFJpbmcgRGVzY3JpcHRvciBhbmQgYXNzb2NpYXRlZCBidWZmZXIgbWVtb3J5ICovCisJCQkvKiAqLworCQkJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tudW1dOworCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgVFhfUklOR19TSVpFOyBpbmRleCsrKSB7CisJCQkJcFR4UmluZy0+Q2VsbFtpbmRleF0ucE5kaXNQYWNrZXQgPSBOVUxMOworCQkJCXBUeFJpbmctPkNlbGxbaW5kZXhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisJCQkJLyogSW5pdCBUeCBSaW5nIFNpemUsIFZhLCBQYSB2YXJpYWJsZXMgKi8KKwkJCQlwVHhSaW5nLT5DZWxsW2luZGV4XS5BbGxvY1NpemUgPSBUWERfU0laRTsKKwkJCQlwVHhSaW5nLT5DZWxsW2luZGV4XS5BbGxvY1ZhID0gUmluZ0Jhc2VWYTsKKwkJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2gocFR4UmluZy0+CisJCQkJCQkJICAgIENlbGxbaW5kZXhdLkFsbG9jUGEsCisJCQkJCQkJICAgIFJpbmdCYXNlUGFIaWdoKTsKKwkJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyhwVHhSaW5nLT5DZWxsW2luZGV4XS4KKwkJCQkJCQkgICBBbGxvY1BhLAorCQkJCQkJCSAgIFJpbmdCYXNlUGFMb3cpOworCisJCQkJLyogU2V0dXAgVHggQnVmZmVyIHNpemUgJiBhZGRyZXNzLiBvbmx5IDgwMi4xMSBoZWFkZXIgd2lsbCBzdG9yZSBpbiB0aGlzIHNwYWNlICovCisJCQkJcERtYUJ1ZiA9ICZwVHhSaW5nLT5DZWxsW2luZGV4XS5EbWFCdWY7CisJCQkJcERtYUJ1Zi0+QWxsb2NTaXplID0gVFhfRE1BXzFTVF9CVUZGRVJfU0laRTsKKwkJCQlwRG1hQnVmLT5BbGxvY1ZhID0gQnVmQmFzZVZhOworCQkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwRG1hQnVmLT5BbGxvY1BhLAorCQkJCQkJCSAgICBCdWZCYXNlUGFIaWdoKTsKKwkJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyhwRG1hQnVmLT5BbGxvY1BhLAorCQkJCQkJCSAgIEJ1ZkJhc2VQYUxvdyk7CisKKwkJCQkvKiBsaW5rIHRoZSBwcmUtYWxsb2NhdGVkIFR4QnVmIHRvIFRYRCAqLworCQkJCXBUeEQgPQorCQkJCSAgICAoc3RydWN0IHJ0X3R4ZCAqKSBwVHhSaW5nLT5DZWxsW2luZGV4XS5BbGxvY1ZhOworCQkJCXBUeEQtPlNEUHRyMCA9IEJ1ZkJhc2VQYUxvdzsKKwkJCQkvKiBhZHZhbmNlIHRvIG5leHQgcmluZyBkZXNjcmlwdG9yIGFkZHJlc3MgKi8KKwkJCQlwVHhELT5ETUFET05FID0gMTsKKwkJCQlSaW5nQmFzZVBhTG93ICs9IFRYRF9TSVpFOworCQkJCVJpbmdCYXNlVmEgPSAodTggKilSaW5nQmFzZVZhICsgVFhEX1NJWkU7CisKKwkJCQkvKiBhZHZhbmNlIHRvIG5leHQgVHhCdWYgYWRkcmVzcyAqLworCQkJCUJ1ZkJhc2VQYUxvdyArPSBUWF9ETUFfMVNUX0JVRkZFUl9TSVpFOworCQkJCUJ1ZkJhc2VWYSA9CisJCQkJICAgICh1OCAqKUJ1ZkJhc2VWYSArIFRYX0RNQV8xU1RfQlVGRkVSX1NJWkU7CisJCQl9CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJUeFJpbmdbJWRdOiB0b3RhbCAlZCBlbnRyeSBhbGxvY2F0ZWRcbiIsIG51bSwKKwkJCQkgIGluZGV4KSk7CisJCX0KKwkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19SRVNPVVJDRVMpCisJCQlicmVhazsKKworCQkvKiAqLworCQkvKiBBbGxvY2F0ZSBNR01UIHJpbmcgZGVzY3JpcHRvcidzIG1lbW9yeSBleGNlcHQgVHggcmluZyB3aGljaCBhbGxvY2F0ZWQgZWFyaWxlciAqLworCQkvKiAqLworCQlwQWQtPk1nbXREZXNjUmluZy5BbGxvY1NpemUgPSBNR01UX1JJTkdfU0laRSAqIFRYRF9TSVpFOworCQlSVE1QX0FsbG9jYXRlTWdtdERlc2NNZW1vcnkocEFkLAorCQkJCQkgICAgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplLAorCQkJCQkgICAgRkFMU0UsCisJCQkJCSAgICAmcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSwKKwkJCQkJICAgICZwQWQtPk1nbXREZXNjUmluZy5BbGxvY1BhKTsKKworCQlpZiAocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSA9PSBOVUxMKSB7CisJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOworCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCQkJYnJlYWs7CisJCX0KKwkJLyogWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrICovCisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsCisJCQkgICAgICAgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplKTsKKworCQkvKiBTYXZlIFBBICYgVkEgZm9yIGZ1cnRoZXIgb3BlcmF0aW9uICovCisJCVJpbmdCYXNlUGFIaWdoID0KKwkJICAgIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1BhKTsKKwkJUmluZ0Jhc2VQYUxvdyA9CisJCSAgICBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPk1nbXREZXNjUmluZy5BbGxvY1BhKTsKKwkJUmluZ0Jhc2VWYSA9IHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmE7CisKKwkJLyogKi8KKwkJLyogSW5pdGlhbGl6ZSBNR01UIFJpbmcgYW5kIGFzc29jaWF0ZWQgYnVmZmVyIG1lbW9yeSAqLworCQkvKiAqLworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNR01UX1JJTkdfU0laRTsgaW5kZXgrKykgeworCQkJcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5wTmRpc1BhY2tldCA9IE5VTEw7CisJCQlwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisJCQkvKiBJbml0IE1HTVQgUmluZyBTaXplLCBWYSwgUGEgdmFyaWFibGVzICovCisJCQlwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLkFsbG9jU2l6ZSA9IFRYRF9TSVpFOworCQkJcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5BbGxvY1ZhID0gUmluZ0Jhc2VWYTsKKwkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLgorCQkJCQkJICAgIEFsbG9jUGEsIFJpbmdCYXNlUGFIaWdoKTsKKwkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0uCisJCQkJCQkgICBBbGxvY1BhLCBSaW5nQmFzZVBhTG93KTsKKworCQkJLyogT2Zmc2V0IHRvIG5leHQgcmluZyBkZXNjcmlwdG9yIGFkZHJlc3MgKi8KKwkJCVJpbmdCYXNlUGFMb3cgKz0gVFhEX1NJWkU7CisJCQlSaW5nQmFzZVZhID0gKHU4ICopUmluZ0Jhc2VWYSArIFRYRF9TSVpFOworCisJCQkvKiBsaW5rIHRoZSBwcmUtYWxsb2NhdGVkIFR4QnVmIHRvIFRYRCAqLworCQkJcFR4RCA9IChzdHJ1Y3QgcnRfdHhkICopIHBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NWYTsKKwkJCXBUeEQtPkRNQURPTkUgPSAxOworCisJCQkvKiBubyBwcmUtYWxsb2NhdGVkIGJ1ZmZlciByZXF1aXJlZCBpbiBNZ210UmluZyBmb3Igc2NhdHRlci1nYXRoZXIgY2FzZSAqLworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiTUdNVCBSaW5nOiB0b3RhbCAlZCBlbnRyeSBhbGxvY2F0ZWRcbiIsIGluZGV4KSk7CisKKwkJLyogKi8KKwkJLyogQWxsb2NhdGUgUlggcmluZyBkZXNjcmlwdG9yJ3MgbWVtb3J5IGV4Y2VwdCBUeCByaW5nIHdoaWNoIGFsbG9jYXRlZCBlYXJpbGVyICovCisJCS8qICovCisJCXBBZC0+UnhEZXNjUmluZy5BbGxvY1NpemUgPSBSWF9SSU5HX1NJWkUgKiBSWERfU0laRTsKKwkJUlRNUF9BbGxvY2F0ZVJ4RGVzY01lbW9yeShwQWQsCisJCQkJCSAgcEFkLT5SeERlc2NSaW5nLkFsbG9jU2l6ZSwKKwkJCQkJICBGQUxTRSwKKwkJCQkJICAmcEFkLT5SeERlc2NSaW5nLkFsbG9jVmEsCisJCQkJCSAgJnBBZC0+UnhEZXNjUmluZy5BbGxvY1BhKTsKKworCQlpZiAocEFkLT5SeERlc2NSaW5nLkFsbG9jVmEgPT0gTlVMTCkgeworCQkJRXJyb3JWYWx1ZSA9IEVSUkxPR19PVVRfT0ZfU0hBUkVEX01FTU9SWTsKKwkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpKTsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCWJyZWFrOworCQl9CisJCS8qIFplcm8gaW5pdCB0aGlzIG1lbW9yeSBibG9jayAqLworCQlOZGlzWmVyb01lbW9yeShwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSwKKwkJCSAgICAgICBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NTaXplKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19PRkYsCisJCQkgKCJSWCBERVNDICVwICBzaXplID0gJWxkXG4iLCBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSwKKwkJCSAgcEFkLT5SeERlc2NSaW5nLkFsbG9jU2l6ZSkpOworCisJCS8qIFNhdmUgUEEgJiBWQSBmb3IgZnVydGhlciBvcGVyYXRpb24gKi8KKwkJUmluZ0Jhc2VQYUhpZ2ggPQorCQkgICAgUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+UnhEZXNjUmluZy5BbGxvY1BhKTsKKwkJUmluZ0Jhc2VQYUxvdyA9CisJCSAgICBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPlJ4RGVzY1JpbmcuQWxsb2NQYSk7CisJCVJpbmdCYXNlVmEgPSBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYTsKKworCQkvKiAqLworCQkvKiBJbml0aWFsaXplIFJ4IFJpbmcgYW5kIGFzc29jaWF0ZWQgYnVmZmVyIG1lbW9yeSAqLworCQkvKiAqLworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBSWF9SSU5HX1NJWkU7IGluZGV4KyspIHsKKwkJCS8qIEluaXQgUlggUmluZyBTaXplLCBWYSwgUGEgdmFyaWFibGVzICovCisJCQlwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5BbGxvY1NpemUgPSBSWERfU0laRTsKKwkJCXBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkFsbG9jVmEgPSBSaW5nQmFzZVZhOworCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLgorCQkJCQkJICAgIEFsbG9jUGEsIFJpbmdCYXNlUGFIaWdoKTsKKwkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLgorCQkJCQkJICAgQWxsb2NQYSwgUmluZ0Jhc2VQYUxvdyk7CisKKwkJCS8qTmRpc1plcm9NZW1vcnkoUmluZ0Jhc2VWYSwgUlhEX1NJWkUpOyAqLworCisJCQkvKiBPZmZzZXQgdG8gbmV4dCByaW5nIGRlc2NyaXB0b3IgYWRkcmVzcyAqLworCQkJUmluZ0Jhc2VQYUxvdyArPSBSWERfU0laRTsKKwkJCVJpbmdCYXNlVmEgPSAodTggKilSaW5nQmFzZVZhICsgUlhEX1NJWkU7CisKKwkJCS8qIFNldHVwIFJ4IGFzc29jaWF0ZWQgQnVmZmVyIHNpemUgJiBhbGxvY2F0ZSBzaGFyZSBtZW1vcnkgKi8KKwkJCXBEbWFCdWYgPSAmcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uRG1hQnVmOworCQkJcERtYUJ1Zi0+QWxsb2NTaXplID0gUlhfQlVGRkVSX0FHR1JFU0laRTsKKwkJCXBQYWNrZXQgPSBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIocEFkLAorCQkJCQkJCSAgICAgIHBEbWFCdWYtPgorCQkJCQkJCSAgICAgIEFsbG9jU2l6ZSwgRkFMU0UsCisJCQkJCQkJICAgICAgJnBEbWFCdWYtPkFsbG9jVmEsCisJCQkJCQkJICAgICAgJnBEbWFCdWYtPgorCQkJCQkJCSAgICAgIEFsbG9jUGEpOworCisJCQkvKiBrZWVwIGFsbG9jYXRlZCByeCBwYWNrZXQgKi8KKwkJCXBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0ID0gcFBhY2tldDsKKworCQkJLyogRXJyb3IgaGFuZGxpbmcgKi8KKwkJCWlmIChwRG1hQnVmLT5BbGxvY1ZhID09IE5VTEwpIHsKKwkJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOworCQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBSeFJpbmcncyAxc3QgYnVmZmVyXG4iKSk7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrICovCisJCQlOZGlzWmVyb01lbW9yeShwRG1hQnVmLT5BbGxvY1ZhLCBwRG1hQnVmLT5BbGxvY1NpemUpOworCisJCQkvKiBXcml0ZSBSeEQgYnVmZmVyIGFkZHJlc3MgJiBhbGxvY2F0ZWQgYnVmZmVyIGxlbmd0aCAqLworCQkJcFJ4RCA9IChzdHJ1Y3QgcnRfcnhkICopIHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkFsbG9jVmE7CisJCQlwUnhELT5TRFAwID0KKwkJCSAgICBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwRG1hQnVmLT5BbGxvY1BhKTsKKwkJCXBSeEQtPkRET05FID0gMDsKKworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJSeCBSaW5nOiB0b3RhbCAlZCBlbnRyeSBhbGxvY2F0ZWRcbiIsIGluZGV4KSk7CisKKwl9IHdoaWxlIChGQUxTRSk7CisKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5GcmFnRnJhbWUsIHNpemVvZihzdHJ1Y3QgcnRfZnJhZ21lbnRfZnJhbWUpKTsKKwlwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCA9CisJICAgIFJUTVBfQWxsb2NhdGVGcmFnUGFja2V0QnVmZmVyKHBBZCwgUlhfQlVGRkVSX05PUk1TSVpFKTsKKworCWlmIChwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCA9PSBOVUxMKSB7CisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwl9CisKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJLyogTG9nIGVycm9yIGluZm9yYW10aW9uICovCisJCU5kaXNXcml0ZUVycm9yTG9nRW50cnkocEFkLT5BZGFwdGVySGFuZGxlLAorCQkJCSAgICAgICBORElTX0VSUk9SX0NPREVfT1VUX09GX1JFU09VUkNFUywKKwkJCQkgICAgICAgMSwgRXJyb3JWYWx1ZSk7CisJfQorCS8qIEZvbGxvd2luZyBjb2RlIHNlZ21lbnQgZ2V0IGZyb20gb3JpZ2luYWwgZnVuYzpOSUNJbml0VHhSeFJpbmdBbmRCYWNrbG9nUXVldWUoKSwgbm93IHNob3VsZCBpbnRlZ3JhdGUgaXQgdG8gaGVyZS4gKi8KKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiLS0+IE5JQ0luaXRUeFJ4UmluZ0FuZEJhY2tsb2dRdWV1ZVxuIikpOworCisvKgorCQkvLyBEaXNhYmxlIERNQS4KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOworCQlHbG9DZmcud29yZCAmPSAweGZmMDsKKwkJR2xvQ2ZnLmZpZWxkLkVuVFhXcml0ZUJhY2tERE9ORSA9MTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOworKi8KKworCQkvKiBJbml0aWFsaXplIGFsbCB0cmFuc21pdCByZWxhdGVkIHNvZnR3YXJlIHF1ZXVlcyAqLworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfVFhfUklORzsgaW5kZXgrKykgeworCQkJSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwQWQtPlR4U3dRdWV1ZVtpbmRleF0pOworCQkJLyogSW5pdCBUWCByaW5ncyBpbmRleCBwb2ludGVyICovCisJCQlwQWQtPlR4UmluZ1tpbmRleF0uVHhTd0ZyZWVJZHggPSAwOworCQkJcEFkLT5UeFJpbmdbaW5kZXhdLlR4Q3B1SWR4ID0gMDsKKwkJCS8qUlRNUF9JT19XUklURTMyKHBBZCwgKFRYX0NUWF9JRFgwICsgaSAqIDB4MTApICwgIHBBZC0+VHhSaW5nW2ldLlRYX0NUWF9JRFgpOyAqLworCQl9CisKKwkJLyogSW5pdCBSWCBSaW5nIGluZGV4IHBvaW50ZXIgKi8KKwkJcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPSAwOworCQlwQWQtPlJ4UmluZy5SeENwdUlkeCA9IFJYX1JJTkdfU0laRSAtIDE7CisJCS8qUlRNUF9JT19XUklURTMyKHBBZCwgUlhfQ1JYX0lEWCwgcEFkLT5SeFJpbmcuUlhfQ1JYX0lEWDApOyAqLworCisJCS8qIGluaXQgTUdNVCByaW5nIGluZGV4IHBvaW50ZXIgKi8KKwkJcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA9IDA7CisJCXBBZC0+TWdtdFJpbmcuVHhDcHVJZHggPSAwOworCisJCXBBZC0+UHJpdmF0ZUluZm8uVHhSaW5nRnVsbENudCA9IDA7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCI8LS0gTklDSW5pdFR4UnhSaW5nQW5kQmFja2xvZ1F1ZXVlXG4iKSk7CisJfQorCisJREJHUFJJTlRfUyhTdGF0dXMsCisJCSAgICgiPC0tIFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5LCBTdGF0dXM9JXhcbiIsIFN0YXR1cykpOworCXJldHVybiBTdGF0dXM7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSZXNldCBOSUMgQXNpY3MuIENhbGwgYWZ0ZXIgcmVzdCBETUEuIFNvIHJlc2V0IFRYX0NUWF9JRFggdG8gemVyby4KKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisJCVJlc2V0IE5JQyB0byBpbml0aWFsIHN0YXRlIEFTIElTIHN5c3RlbSBib290IHVwIHRpbWUuCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUTVBSaW5nQ2xlYW5VcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IFJpbmdUeXBlKQoreworCXN0cnVjdCBydF90eGQgKiBwVHhEOworCXN0cnVjdCBydF9yeGQgKiBwUnhEOworCXN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqcEVudHJ5OworCXZvaWQgKnBQYWNrZXQ7CisJaW50IGk7CisJc3RydWN0IHJ0X3J0bXBfdHhfcmluZyAqcFR4UmluZzsKKwl1bnNpZ25lZCBsb25nIElycUZsYWdzOworCS8qdTMyICAgICAgICAgICAgICAgICAgICAgICAgUnhTd1JlYWRJZHg7ICovCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiUlRNUFJpbmdDbGVhblVwKFJpbmdJZHg9JWQsIFBlbmRpbmctTkRJUz0lbGQpXG4iLCBSaW5nVHlwZSwKKwkJICBwQWQtPlJhbGlua0NvdW50ZXJzLlBlbmRpbmdOZGlzUGFja2V0Q291bnQpKTsKKwlzd2l0Y2ggKFJpbmdUeXBlKSB7CisJY2FzZSBRSURfQUNfQks6CisJY2FzZSBRSURfQUNfQkU6CisJY2FzZSBRSURfQUNfVkk6CisJY2FzZSBRSURfQUNfVk86CisKKwkJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tSaW5nVHlwZV07CisKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCQkvKiBXZSBoYXZlIHRvIGNsZWFuIGFsbCBkZXNjcmlwdG9ycyBpbiBjYXNlIHNvbWUgZXJyb3IgaGFwcGVuZWQgd2l0aCByZXNldCAqLworCQlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspCS8qIFdlIGhhdmUgdG8gc2NhbiBhbGwgVFggcmluZyAqLworCQl7CisJCQlwVHhEID0gKHN0cnVjdCBydF90eGQgKikgcFR4UmluZy0+Q2VsbFtpXS5BbGxvY1ZhOworCisJCQlwUGFja2V0ID0gKHZvaWQgKilwVHhSaW5nLT5DZWxsW2ldLnBOZGlzUGFja2V0OworCQkJLyogcmVsZWFzZSBzY2F0dGVyLWFuZC1nYXRoZXIgY2hhciAqLworCQkJaWYgKHBQYWNrZXQpIHsKKwkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwKKwkJCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQlwVHhSaW5nLT5DZWxsW2ldLnBOZGlzUGFja2V0ID0gTlVMTDsKKwkJCX0KKworCQkJcFBhY2tldCA9CisJCQkgICAgKHZvaWQgKilwVHhSaW5nLT5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldDsKKwkJCS8qIHJlbGVhc2Ugc2NhdHRlci1hbmQtZ2F0aGVyIGNoYXIgKi8KKwkJCWlmIChwUGFja2V0KSB7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsCisJCQkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJcFR4UmluZy0+Q2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCQkJfQorCQl9CisKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMCArIFJpbmdUeXBlICogMHgxMCwKKwkJCSAgICAgICAmcFR4UmluZy0+VHhEbWFJZHgpOworCQlwVHhSaW5nLT5UeFN3RnJlZUlkeCA9IHBUeFJpbmctPlR4RG1hSWR4OworCQlwVHhSaW5nLT5UeENwdUlkeCA9IHBUeFJpbmctPlR4RG1hSWR4OworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFJpbmdUeXBlICogMHgxMCwKKwkJCQlwVHhSaW5nLT5UeENwdUlkeCk7CisKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7CisKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCQl3aGlsZSAocEFkLT5UeFN3UXVldWVbUmluZ1R5cGVdLkhlYWQgIT0gTlVMTCkgeworCQkJcEVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwQWQtPlR4U3dRdWV1ZVtSaW5nVHlwZV0pOworCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwRW50cnkpOworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiUmVsZWFzZSAxIE5ESVMgcGFja2V0IGZyb20gcy93IGJhY2tsb2cgcXVldWVcbiIpKTsKKwkJfQorCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIFFJRF9NR01UOgorCQkvKiBXZSBoYXZlIHRvIGNsZWFuIGFsbCBkZXNjcmlwdG9ycyBpbiBjYXNlIHNvbWUgZXJyb3IgaGFwcGVuZWQgd2l0aCByZXNldCAqLworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1nbXRSaW5nTG9jayk7CisKKwkJZm9yIChpID0gMDsgaSA8IE1HTVRfUklOR19TSVpFOyBpKyspIHsKKwkJCXBUeEQgPSAoc3RydWN0IHJ0X3R4ZCAqKSBwQWQtPk1nbXRSaW5nLkNlbGxbaV0uQWxsb2NWYTsKKworCQkJcFBhY2tldCA9CisJCQkgICAgKHZvaWQgKilwQWQtPk1nbXRSaW5nLkNlbGxbaV0ucE5kaXNQYWNrZXQ7CisJCQkvKiBybGVhc2Ugc2NhdHRlci1hbmQtZ2F0aGVyIGNoYXIgKi8KKwkJCWlmIChwUGFja2V0KSB7CisJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMCwKKwkJCQkJCSBwVHhELT5TRExlbjAsCisJCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsCisJCQkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQl9CisJCQlwQWQtPk1nbXRSaW5nLkNlbGxbaV0ucE5kaXNQYWNrZXQgPSBOVUxMOworCisJCQlwUGFja2V0ID0KKwkJCSAgICAodm9pZCAqKXBBZC0+TWdtdFJpbmcuQ2VsbFtpXS4KKwkJCSAgICBwTmV4dE5kaXNQYWNrZXQ7CisJCQkvKiByZWxlYXNlIHNjYXR0ZXItYW5kLWdhdGhlciBjaGFyICovCisJCQlpZiAocFBhY2tldCkgeworCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsCisJCQkJCQkgcFR4RC0+U0RMZW4xLAorCQkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LAorCQkJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJfQorCQkJcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisKKwkJfQorCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfTUdNVERUWF9JRFgsICZwQWQtPk1nbXRSaW5nLlR4RG1hSWR4KTsKKwkJcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA9IHBBZC0+TWdtdFJpbmcuVHhEbWFJZHg7CisJCXBBZC0+TWdtdFJpbmcuVHhDcHVJZHggPSBwQWQtPk1nbXRSaW5nLlR4RG1hSWR4OworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NR01UQ1RYX0lEWCwgcEFkLT5NZ210UmluZy5UeENwdUlkeCk7CisKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50ID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFFJRF9SWDoKKwkJLyogV2UgaGF2ZSB0byBjbGVhbiBhbGwgZGVzY3JpcHRvcnMgaW4gY2FzZSBzb21lIGVycm9yIGhhcHBlbmVkIHdpdGggcmVzZXQgKi8KKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5SeFJpbmdMb2NrKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJCXBSeEQgPSAoc3RydWN0IHJ0X3J4ZCAqKSBwQWQtPlJ4UmluZy5DZWxsW2ldLkFsbG9jVmE7CisJCQlwUnhELT5ERE9ORSA9IDA7CisJCX0KKworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX0RSWF9JRFgsICZwQWQtPlJ4UmluZy5SeERtYUlkeCk7CisJCXBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4ID0gcEFkLT5SeFJpbmcuUnhEbWFJZHg7CisJCXBBZC0+UnhSaW5nLlJ4Q3B1SWR4ID0KKwkJICAgICgocEFkLT5SeFJpbmcuUnhEbWFJZHggPT0KKwkJICAgICAgMCkgPyAoUlhfUklOR19TSVpFIC0gMSkgOiAocEFkLT5SeFJpbmcuUnhEbWFJZHggLSAxKSk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0NSWF9JRFgsIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4KTsKKworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPlJ4UmluZ0xvY2spOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKwordm9pZCBSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlpbnQgaW5kZXgsIG51bSwgajsKKwlzdHJ1Y3QgcnRfcnRtcF90eF9yaW5nICpwVHhSaW5nOworCXN0cnVjdCBydF90eGQgKiBwVHhEOworCXZvaWQgKnBQYWNrZXQ7CisJdW5zaWduZWQgaW50IElycUZsYWdzOworCisJLypzdHJ1Y3Qgb3NfY29va2llICpwT2JqID0oc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOyAqLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJUTVBGcmVlVHhSeFJpbmdNZW1vcnlcbiIpKTsKKworCS8qIEZyZWUgVHhTd1F1ZXVlIFBhY2tldCAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl9UWF9SSU5HOyBpbmRleCsrKSB7CisJCXN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqcEVudHJ5OworCQl2b2lkICpwUGFja2V0OworCQlzdHJ1Y3QgcnRfcXVldWVfaGVhZGVyICpwUXVldWU7CisKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCQlwUXVldWUgPSAmcEFkLT5UeFN3UXVldWVbaW5kZXhdOworCQl3aGlsZSAocFF1ZXVlLT5IZWFkKSB7CisJCQlwRW50cnkgPSBSZW1vdmVIZWFkUXVldWUocFF1ZXVlKTsKKwkJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocEVudHJ5KTsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJfQorCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKwl9CisKKwkvKiBGcmVlIFR4IFJpbmcgUGFja2V0ICovCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX09GX1RYX1JJTkc7IGluZGV4KyspIHsKKwkJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tpbmRleF07CisKKwkJZm9yIChqID0gMDsgaiA8IFRYX1JJTkdfU0laRTsgaisrKSB7CisJCQlwVHhEID0gKHN0cnVjdCBydF90eGQgKikgKHBUeFJpbmctPkNlbGxbal0uQWxsb2NWYSk7CisJCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtqXS5wTmRpc1BhY2tldDsKKworCQkJaWYgKHBQYWNrZXQpIHsKKwkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIwLAorCQkJCQkJIHBUeEQtPlNETGVuMCwKKwkJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwKKwkJCQkJCSAgICBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCX0KKwkJCS8qQWx3YXlzIGFzc2lnbiBwTmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyICovCisJCQlwVHhSaW5nLT5DZWxsW2pdLnBOZGlzUGFja2V0ID0gTlVMTDsKKworCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbal0ucE5leHROZGlzUGFja2V0OworCisJCQlpZiAocFBhY2tldCkgeworCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsCisJCQkJCQkgcFR4RC0+U0RMZW4xLAorCQkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LAorCQkJCQkJICAgIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLypBbHdheXMgYXNzaWduIHBOZXh0TmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyICovCisJCQlwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmV4dE5kaXNQYWNrZXQgPQorCQkJICAgIE5VTEw7CisKKwkJfQorCX0KKworCWZvciAoaW5kZXggPSBSWF9SSU5HX1NJWkUgLSAxOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7CisJCWlmICgocEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uRG1hQnVmLkFsbG9jVmEpCisJCSAgICAmJiAocEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQpKSB7CisJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwKKwkJCQkJIHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkRtYUJ1Zi5BbGxvY1BhLAorCQkJCQkgcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uRG1hQnVmLgorCQkJCQkgQWxsb2NTaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsCisJCQkJCSAgICBwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5wTmRpc1BhY2tldCwKKwkJCQkJICAgIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQl9CisJfQorCU5kaXNaZXJvTWVtb3J5KHBBZC0+UnhSaW5nLkNlbGwsIFJYX1JJTkdfU0laRSAqIHNpemVvZihzdHJ1Y3QgcnRfcnRtcF9kbWFjYikpOworCisJaWYgKHBBZC0+UnhEZXNjUmluZy5BbGxvY1ZhKSB7CisJCVJUTVBfRnJlZURlc2NNZW1vcnkocEFkLCBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NTaXplLAorCQkJCSAgICBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSwKKwkJCQkgICAgcEFkLT5SeERlc2NSaW5nLkFsbG9jUGEpOworCX0KKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5SeERlc2NSaW5nLCBzaXplb2Yoc3RydWN0IHJ0X3J0bXBfZG1hYnVmKSk7CisKKwlpZiAocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSkgeworCQlSVE1QX0ZyZWVEZXNjTWVtb3J5KHBBZCwgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplLAorCQkJCSAgICBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhLAorCQkJCSAgICBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1BhKTsKKwl9CisJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWdtdERlc2NSaW5nLCBzaXplb2Yoc3RydWN0IHJ0X3J0bXBfZG1hYnVmKSk7CisKKwlmb3IgKG51bSA9IDA7IG51bSA8IE5VTV9PRl9UWF9SSU5HOyBudW0rKykgeworCQlpZiAocEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NWYSkgeworCQkJUlRNUF9GcmVlRmlyc3RUeEJ1ZmZlcihwQWQsCisJCQkJCSAgICAgICBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1NpemUsCisJCQkJCSAgICAgICBGQUxTRSwKKwkJCQkJICAgICAgIHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jVmEsCisJCQkJCSAgICAgICBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1BhKTsKKwkJfQorCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5UeEJ1ZlNwYWNlW251bV0sIHNpemVvZihzdHJ1Y3QgcnRfcnRtcF9kbWFidWYpKTsKKworCQlpZiAocEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NWYSkgeworCQkJUlRNUF9GcmVlRGVzY01lbW9yeShwQWQsIHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jU2l6ZSwKKwkJCQkJICAgIHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEsCisJCQkJCSAgICBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1BhKTsKKwkJfQorCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5UeERlc2NSaW5nW251bV0sIHNpemVvZihzdHJ1Y3QgcnRfcnRtcF9kbWFidWYpKTsKKwl9CisKKwlpZiAocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQpCisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCwKKwkJCQkgICAgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gUlRNUEZyZWVUeFJ4UmluZ01lbW9yeVxuIikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKglyZWdpc3RlciByZWxhdGVkIHByb2NlZHVyZXMuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIERpc2FibGUgRE1BLgorCitBcmd1bWVudHM6CisJKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKwlOb25lCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUMjhYWERNQURpc2FibGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCVdQRE1BX0dMT19DRkdfU1RSVUMgR2xvQ2ZnOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOworCUdsb0NmZy53b3JkICY9IDB4ZmYwOworCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPSAxOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBFbmFibGUgRE1BLgorCitBcmd1bWVudHM6CisJKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKwlOb25lCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUMjhYWERNQUVuYWJsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJV1BETUFfR0xPX0NGR19TVFJVQyBHbG9DZmc7CisJaW50IGkgPSAwOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDQpOworCWRvIHsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOworCQlpZiAoKEdsb0NmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkKKwkJICAgICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQorCQkJYnJlYWs7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+ICBETUFCdXN5XG4iKSk7CisJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCWkrKzsKKwl9IHdoaWxlIChpIDwgMjAwKTsKKworCVJUTVB1c2VjRGVsYXkoNTApOworCisJR2xvQ2ZnLmZpZWxkLkVuVFhXcml0ZUJhY2tERE9ORSA9IDE7CisJR2xvQ2ZnLmZpZWxkLldQRE1BQnVyc3RTSVpFID0gMjsKKwlHbG9DZmcuZmllbGQuRW5hYmxlUnhETUEgPSAxOworCUdsb0NmZy5maWVsZC5FbmFibGVUeERNQSA9IDE7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiPD09IFdSSVRFIERNQSBvZmZzZXQgMHgyMDggPSAweCV4XG4iLCBHbG9DZmcud29yZCkpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKKworfQorCitCT09MRUFOIEFzaWNDaGVja0NvbW1hbk9rKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggQ29tbWFuZCkKK3sKKwl1MzIgQ21kU3RhdHVzID0gMCwgQ0lEID0gMCwgaTsKKwl1MzIgVGhpc0NJRE1hc2sgPSAwOworCisJaSA9IDA7CisJZG8geworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEgyTV9NQUlMQk9YX0NJRCwgJkNJRCk7CisJCS8qIEZpbmQgd2hlcmUgdGhlIGNvbW1hbmQgaXMuIEJlY2F1c2UgdGhpcyBpcyByYW5kb21seSBzcGVjaWZpZWQgYnkgZmlybXdhcmUuICovCisJCWlmICgoQ0lEICYgQ0lEME1BU0spID09IENvbW1hbmQpIHsKKwkJCVRoaXNDSURNYXNrID0gQ0lEME1BU0s7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICgoKChDSUQgJiBDSUQxTUFTSykgPj4gOCkgJiAweGZmKSA9PSBDb21tYW5kKSB7CisJCQlUaGlzQ0lETWFzayA9IENJRDFNQVNLOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoKCgoQ0lEICYgQ0lEMk1BU0spID4+IDE2KSAmIDB4ZmYpID09IENvbW1hbmQpIHsKKwkJCVRoaXNDSURNYXNrID0gQ0lEMk1BU0s7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICgoKChDSUQgJiBDSUQzTUFTSykgPj4gMjQpICYgMHhmZikgPT0gQ29tbWFuZCkgeworCQkJVGhpc0NJRE1hc2sgPSBDSUQzTUFTSzsKKwkJCWJyZWFrOworCQl9CisKKwkJUlRNUHVzZWNEZWxheSgxMDApOworCQlpKys7CisJfSB3aGlsZSAoaSA8IDIwMCk7CisKKwkvKiBHZXQgQ29tbWFuZFN0YXR1cyBWYWx1ZSAqLworCVJUTVBfSU9fUkVBRDMyKHBBZCwgSDJNX01BSUxCT1hfU1RBVFVTLCAmQ21kU3RhdHVzKTsKKworCS8qIFRoaXMgY29tbWFuZCdzIHN0YXR1cyBpcyBhdCB0aGUgc2FtZSBwb3NpdGlvbiBhcyBjb21tYW5kLiBTbyBBTkQgY29tbWFuZCBwb3NpdGlvbidzIGJpdG1hc2sgdG8gcmVhZCBzdGF0dXMuICovCisJaWYgKGkgPCAyMDApIHsKKwkJLyogSWYgU3RhdHVzIGlzIDEsIHRoZSBjb21hbW5kIGlzIHN1Y2Nlc3MuICovCisJCWlmICgoKENtZFN0YXR1cyAmIFRoaXNDSURNYXNrKSA9PSAweDEpCisJCSAgICB8fCAoKENtZFN0YXR1cyAmIFRoaXNDSURNYXNrKSA9PSAweDEwMCkKKwkJICAgIHx8ICgoQ21kU3RhdHVzICYgVGhpc0NJRE1hc2spID09IDB4MTAwMDApCisJCSAgICB8fCAoKENtZFN0YXR1cyAmIFRoaXNDSURNYXNrKSA9PSAweDEwMDAwMDApKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCItLT4gQXNpY0NoZWNrQ29tbWFuT2sgQ0lEID0gMHgleCwgQ21kU3RhdHVzPSAweCV4IFxuIiwKKwkJCQkgIENJRCwgQ21kU3RhdHVzKSk7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9TVEFUVVMsIDB4ZmZmZmZmZmYpOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfQ0lELCAweGZmZmZmZmZmKTsKKwkJCXJldHVybiBUUlVFOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiLS0+IEFzaWNDaGVja0NvbW1hbkZhaWwxIENJRCA9IDB4JXgsIENtZFN0YXR1cz0gMHgleCBcbiIsCisJCQkgIENJRCwgQ21kU3RhdHVzKSk7CisJfSBlbHNlIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCItLT4gQXNpY0NoZWNrQ29tbWFuRmFpbDIgVGltZW91dCBDb21tYW5kID0gJWQsIENtZFN0YXR1cz0gMHgleCBcbiIsCisJCQkgIENvbW1hbmQsIENtZFN0YXR1cykpOworCX0KKwkvKiBDbGVhciBDb21tYW5kIGFuZCBTdGF0dXMuICovCisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfU1RBVFVTLCAweGZmZmZmZmZmKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DSUQsIDB4ZmZmZmZmZmYpOworCisJcmV0dXJuIEZBTFNFOworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFdyaXRlIEJlYWNvbiBidWZmZXIgdG8gQXNpYy4KKworQXJndW1lbnRzOgorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisJTm9uZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVDI4eHhfVXBkYXRlQmVhY29uVG9Bc2ljKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgICBpbnQgYXBpZHgsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBGcmFtZUxlbiwgdW5zaWduZWQgbG9uZyBVcGRhdGVQb3MpCit7CisJdW5zaWduZWQgbG9uZyBDYXBJbmZvUG9zID0gMDsKKwl1OCAqcHRyLCAqcHRyX3VwZGF0ZSwgKnB0cl9jYXBpbmZvOworCXUzMiBpOworCUJPT0xFQU4gYkJjblJlcSA9IEZBTFNFOworCXU4IGJjbl9pZHggPSAwOworCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIiVzKCkgOiBObyB2YWxpZCBJbnRlcmZhY2UgYmUgZm91bmQuXG4iLCBfX2Z1bmNfXykpOworCQlyZXR1cm47CisJfQorCisJLyppZiAoKHBBZC0+V2RzVGFiLk1vZGUgPT0gV0RTX0JSSURHRV9NT0RFKSAqLworCS8qICAgICAgfHwgKChwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uTVNTSUREZXYgPT0gTlVMTCkgKi8KKwkvKiAgICAgICAgICAgICAgfHwgIShwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uTVNTSUREZXYtPmZsYWdzICYgSUZGX1VQKSkgKi8KKwkvKiAgICAgICkgKi8KKwlpZiAoYkJjblJlcSA9PSBGQUxTRSkgeworCQkvKiB3aGVuIHRoZSByYSBpbnRlcmZhY2UgaXMgZG93biwgZG8gbm90IHNlbmQgaXRzIGJlYWNvbiBmcmFtZSAqLworCQkvKiBjbGVhciBhbGwgemVybyAqLworCQlmb3IgKGkgPSAwOyBpIDwgVFhXSV9TSVpFOyBpICs9IDQpCisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIGksCisJCQkJCTB4MDApOworCX0gZWxzZSB7CisJCXB0ciA9ICh1OCAqKSYgcEFkLT5CZWFjb25UeFdJOworCQlmb3IgKGkgPSAwOyBpIDwgVFhXSV9TSVpFOyBpICs9IDQpCS8qIDE2LWJ5dGUgVFhXSSBmaWVsZCAqLworCQl7CisJCQl1MzIgbG9uZ3B0ciA9CisJCQkgICAgKnB0ciArICgqKHB0ciArIDEpIDw8IDgpICsgKCoocHRyICsgMikgPDwgMTYpICsKKwkJCSAgICAoKihwdHIgKyAzKSA8PCAyNCk7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIGksCisJCQkJCWxvbmdwdHIpOworCQkJcHRyICs9IDQ7CisJCX0KKworCQkvKiBVcGRhdGUgQ2FwYWJpbGl0eUluZm8gaW4gQmVhY29uICovCisJCWZvciAoaSA9IENhcEluZm9Qb3M7IGkgPCAoQ2FwSW5mb1BvcyArIDIpOyBpKyspIHsKKwkJCVJUTVBfSU9fV1JJVEU4KHBBZCwKKwkJCQkgICAgICAgcEFkLT5CZWFjb25PZmZzZXRbYmNuX2lkeF0gKyBUWFdJX1NJWkUgKworCQkJCSAgICAgICBpLCAqcHRyX2NhcGluZm8pOworCQkJcHRyX2NhcGluZm8rKzsKKwkJfQorCisJCWlmIChGcmFtZUxlbiA+IFVwZGF0ZVBvcykgeworCQkJZm9yIChpID0gVXBkYXRlUG9zOyBpIDwgKEZyYW1lTGVuKTsgaSsrKSB7CisJCQkJUlRNUF9JT19XUklURTgocEFkLAorCQkJCQkgICAgICAgcEFkLT5CZWFjb25PZmZzZXRbYmNuX2lkeF0gKworCQkJCQkgICAgICAgVFhXSV9TSVpFICsgaSwgKnB0cl91cGRhdGUpOworCQkJCXB0cl91cGRhdGUrKzsKKwkJCX0KKwkJfQorCisJfQorCit9CisKK3ZvaWQgUlQyOHh4UGNpU3RhQXNpY0ZvcmNlV2FrZXVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgSU4gQk9PTEVBTiBiRnJvbVR4KQoreworCUFVVE9fV0FLRVVQX1NUUlVDIEF1dG9XYWtldXBDZmc7CisKKwlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJCXJldHVybjsKKworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dBS0VVUF9OT1cpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndha2luZyB1cCBub3chXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV0FLRVVQX05PVyk7CisKKwlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0dPX1RPX1NMRUVQX05PVyk7CisKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkKKwkgICAgJiYgcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpIHsKKwkJLyogU3VwcG9ydCBQQ0llIEFkdmFuY2UgUG93ZXIgU2F2ZSAqLworCQlpZiAoYkZyb21UeCA9PSBUUlVFICYmIChwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZyA9PSBUUlVFKSkgeworCQkJcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKKwkJCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLCBSRVNUT1JFX1dBS0VVUCk7CisJCQlSVE1QdXNlY0RlbGF5KDMwMDApOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiPT09PT09PUFzaWNGb3JjZVdha2V1cD09PWJGcm9tVHhcbiIpKTsKKwkJfQorCisJCUF1dG9XYWtldXBDZmcud29yZCA9IDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKKworCQlpZiAoUlQyOHh4UGNpQXNpY1JhZGlvT24ocEFkLCBET1QxMVBPV0VSU0FWRSkpIHsKKyNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKKwkJCS8qIGFkZCBieSBqb2hubGksIFJGIHBvd2VyIHNlcXVlbmNlIHNldHVwLCBsb2FkIFJGIG5vcm1hbCBvcGVyYXRpb24tbW9kZSBzZXR1cCAqLworCQkJaWYgKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkKKwkJCSAgICAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKSkgeworCQkJCXN0cnVjdCBydF9ydG1wX2NoaXBfb3AgKnBDaGlwT3BzID0gJnBBZC0+Y2hpcE9wczsKKworCQkJCWlmIChwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUpCisJCQkJCXBDaGlwT3BzLT4KKwkJCQkJICAgIEFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlKHBBZCk7CisJCQl9IGVsc2UKKyNlbmRpZiAvKiBQQ0lFX1BTX1NVUFBPUlQgLy8gKi8KKwkJCXsKKwkJCQkvKiBlbmQgam9obmxpICovCisJCQkJLyogSW4gUmFkaW8gT2ZmLCB3ZSB0dXJuIG9mZiBSRiBjbGssIFNvIG5vdyBuZWVkIHRvIGNhbGwgQVNJQ1N3aXRjaENoYW5uZWwgYWdhaW4uICovCisJCQkJaWYgKElORlJBX09OKHBBZCkKKwkJCQkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICE9CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCQkJICAgICYmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby4KKwkJCQkJQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkgeworCQkJCQkvKiBNdXN0IHVzaW5nIDQwTUh6LiAqLworCQkJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsCisJCQkJCQkJICBwQWQtPkNvbW1vbkNmZy4KKwkJCQkJCQkgIENlbnRyYWxDaGFubmVsLAorCQkJCQkJCSAgRkFMU0UpOworCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLAorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLgorCQkJCQkJCUNlbnRyYWxDaGFubmVsKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBNdXN0IHVzaW5nIDIwTUh6LiAqLworCQkJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsCisJCQkJCQkJICBwQWQtPkNvbW1vbkNmZy4KKwkJCQkJCQkgIENoYW5uZWwsIEZBTFNFKTsKKwkJCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJCQl9CisJCQl9CisJCX0KKyNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKKwkJLyogMzA5MCBNQ1UgV2FrZXVwIGNvbW1hbmQgbmVlZHMgbW9yZSB0aW1lIHRvIGJlIHN0YWJsZS4gKi8KKwkJLyogQmVmb3JlIHN0YWJsZSwgZG9uJ3QgaXNzdWUgb3RoZXIgTUNVIGNvbW1hbmQgdG8gcHJldmVudCBmcm9tIGZpcm13YXJlIGVycm9yLiAqLworCQlpZiAoKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkKKwkJICAgICAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKSkgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkKKwkJICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID09IDMpCisJCSAgICAmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCI8PT1SVDI4eHhQY2lTdGFBc2ljRm9yY2VXYWtldXA6OlJlbGVhc2UgdGhlIE1DVSBMb2NrKDMwOTApXG4iKSk7CisJCQlSVE1QX1NFTV9MT0NLKCZwQWQtPk1jdUNtZExvY2spOworCQkJcEFkLT5icnQzMHh4QmFuTWN1Q21kID0gRkFMU0U7CisJCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWN1Q21kTG9jayk7CisJCX0KKyNlbmRpZiAvKiBQQ0lFX1BTX1NVUFBPUlQgLy8gKi8KKwl9IGVsc2UgeworCQkvKiBQQ0ksIDI4NjAtUENJZSAqLworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIjw9PVJUMjh4eFBjaVN0YUFzaWNGb3JjZVdha2V1cDo6T3JpZ2luYWwgUENJIFBvd2VyIFNhdmluZ1xuIikpOworCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIDB4ZmYsIDB4MDAsIDB4MDIpOworCQlBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7CisJfQorCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7CisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV0FLRVVQX05PVyk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PT09PT1SVDI4eHhQY2lTdGFBc2ljRm9yY2VXYWtldXBcbiIpKTsKK30KKwordm9pZCBSVDI4eHhQY2lTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCSB1MTYgVGJ0dE51bVRvTmV4dFdha2VVcCkKK3sKKwlCT09MRUFOIGJyYzsKKworCWlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gRkFMU0UpIHsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7CisJCXJldHVybjsKKwl9CisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpCisJICAgICYmIHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSB7CisJCXVuc2lnbmVkIGxvbmcgTm93ID0gMDsKKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV0FLRVVQX05PVykpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndha2luZyB1cCBub3chXG4iKSk7CisJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKKwkJCXJldHVybjsKKwkJfQorCisJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CisJCS8qIElmIGxhc3Qgc2VuZCBOVUxMIGZyYW0gdGltZSBpcyB0b28gY2xvc2UgdG8gdGhpcyByZWNlaXZpbmcgYmVhY29uICh3aXRoaW4gOG1zKSwgZG9uJ3QgZ28gdG8gc2xlZXAgZm9yIHRoaXMgRFRNLiAqLworCQkvKiBCZWNhdXNlIFNvbWUgQVAgY2FuJ3QgcXVldWluZyBvdXRnb2luZyBmcmFtZXMgaW1tZWRpYXRlbHkuICovCisJCWlmICgoKHBBZC0+TWxtZS5MYXN0U2VuZE5VTExwc21UaW1lICsgOCkgPj0gTm93KQorCQkgICAgJiYgKHBBZC0+TWxtZS5MYXN0U2VuZE5VTExwc21UaW1lIDw9IE5vdykpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIk5vdyA9ICVsdSwgTGFzdFNlbmROVUxMcHNtVGltZT0lbHUgOiAgUnhDb3VudFNpbmNlTGFzdE5VTEwgPSAlbHUuIFxuIiwKKwkJCQkgIE5vdywgcEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUsCisJCQkJICBwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnRTaW5jZUxhc3ROVUxMKSk7CisJCQlyZXR1cm47CisJCX0gZWxzZSBpZiAoKHBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudFNpbmNlTGFzdE5VTEwgPiAwKQorCQkJICAgJiYKKwkJCSAgICgocEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUgKworCQkJICAgICBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QpID49IE5vdykpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIk5vdyA9ICVsdSwgTGFzdFNlbmROVUxMcHNtVGltZT0lbHU6IFJ4Q291bnRTaW5jZUxhc3ROVUxMID0gJWx1ID4gMCBcbiIsCisJCQkJICBOb3csIHBBZC0+TWxtZS5MYXN0U2VuZE5VTExwc21UaW1lLAorCQkJCSAgcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCkpOworCQkJcmV0dXJuOworCQl9CisKKwkJYnJjID0KKwkJICAgIFJUMjh4eFBjaUFzaWNSYWRpb09mZihwQWQsIERPVDExUE9XRVJTQVZFLAorCQkJCQkgIFRidHROdW1Ub05leHRXYWtlVXApOworCQlpZiAoYnJjID09IFRSVUUpCisJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7CisJfSBlbHNlIHsKKwkJQVVUT19XQUtFVVBfU1RSVUMgQXV0b1dha2V1cENmZzsKKwkJLyogd2UgaGF2ZSBkZWNpZGVkIHRvIFNMRUVQLCBzbyBhdCBsZWFzdCBkbyBpdCBmb3IgYSBCRUFDT04gcGVyaW9kLiAqLworCQlpZiAoVGJ0dE51bVRvTmV4dFdha2VVcCA9PSAwKQorCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IDE7CisKKwkJLypSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfTUFTS19DU1IsIEF1dG9XYWtldXBJbnQpOyAqLworCisJCUF1dG9XYWtldXBDZmcud29yZCA9IDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKKwkJQXV0b1dha2V1cENmZy5maWVsZC5OdW1vZlNsZWVwaW5nVGJ0dCA9IFRidHROdW1Ub05leHRXYWtlVXAgLSAxOworCQlBdXRvV2FrZXVwQ2ZnLmZpZWxkLkVuYWJsZUF1dG9XYWtldXAgPSAxOworCQlBdXRvV2FrZXVwQ2ZnLmZpZWxkLkF1dG9MZWFkVGltZSA9IDU7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMwLCAweGZmLCAweGZmLCAweDAwKTsJLyogc2VuZCBQT1dFUi1TQVZFIGNvbW1hbmQgdG8gTUNVLiBUaW1lb3V0IDQwdXMuICovCisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCI8LS0gJXMsIFRidHROdW1Ub05leHRXYWtlVXA9JWQgXG4iLCBfX2Z1bmNfXywKKwkJCSAgVGJ0dE51bVRvTmV4dFdha2VVcCkpOworCX0KKworfQorCit2b2lkIFBzUG9sbFdha2VFeGVjKHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJICAgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJICAgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKQoreworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopRnVuY3Rpb25Db250ZXh0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT5Qc1BvbGxXYWtlRXhlYyBcbiIpKTsKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJaWYgKHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nKSB7CisJCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLCBSRVNUT1JFX1dBS0VVUCk7CisJfQorCXBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7CisJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisjaWZkZWYgUENJRV9QU19TVVBQT1JUCisJLyogRm9yIHJ0MzB4eCBwb3dlciBzb2x1dGlvbiAzLCBVc2Ugc29mdHdhcmUgdGltZXIgdG8gd2FrZSB1cCBpbiBwc20uIFNvIGNhbGwgKi8KKwkvKiBBc2ljRm9yY2VXYWtldXAgaGVyZSBpbnN0ZWFkIG9mIGhhbmRsaW5nIHR3YWtldXAgaW50ZXJydXB0LiAqLworCWlmICgoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKQorCSAgICAgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkpCisJICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID09IDMpCisJICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCI8LS1Qc1BvbGxXYWtlRXhlYzo6MzA5MCBjYWxscyBBc2ljRm9yY2VXYWtldXAocEFkLCBET1QxMVBPV0VSU0FWRSkgaW4gYWR2YW5jZSBcbiIpKTsKKwkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgRE9UMTFQT1dFUlNBVkUpOworCX0KKyNlbmRpZiAvKiBQQ0lFX1BTX1NVUFBPUlQgLy8gKi8KK30KKwordm9pZCBSYWRpb09uRXhlYyh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCSB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMykKK3sKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKUZ1bmN0aW9uQ29udGV4dDsKKwlzdHJ1Y3QgcnRfcnRtcF9jaGlwX29wICpwQ2hpcE9wcyA9ICZwQWQtPmNoaXBPcHM7CisJV1BETUFfR0xPX0NGR19TVFJVQyBEbWFDZmc7CisJQk9PTEVBTiBDYW5jZWxsZWQ7CisKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIi0tPlJhZGlvT25FeGVjKCkgcmV0dXJuIG9uIGZPUF9TVEFUVVNfRE9aRSA9PSBUUlVFOyBcbiIpKTsKKy8qS0ggRGVidWc6IEFkZCB0aGUgY29tcGlsZSBmbGFnICJSVDI4NjAgYW5kIGNvbmRpdGlvbiAqLworI2lmZGVmIFJUTVBfUENJX1NVUFBPUlQKKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpCisJCSAgICAmJiBwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkKKwkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwgMTApOworI2VuZGlmIC8qIFJUTVBfUENJX1NVUFBPUlQgLy8gKi8KKwkJcmV0dXJuOworCX0KKworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiLS0+UmFkaW9PbkV4ZWMoKSByZXR1cm4gb24gU0NBTl9JTl9QUk9HUkVTUzsgXG4iKSk7CisjaWZkZWYgUlRNUF9QQ0lfU1VQUE9SVAorCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkKKwkJICAgICYmIHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKQorCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCAxMCk7CisjZW5kaWYgLyogUlRNUF9QQ0lfU1VQUE9SVCAvLyAqLworCQlyZXR1cm47CisJfQorLypLSCBEZWJ1ZzogbmVlZCB0byBjaGVjay4gSSBhZGQgdGhlIGNvbXBpbGUgZmxhZyAiQ09ORklHX1NUQV9TVVBQT1JUIiB0byBlbmNsb3NlIHRoZSBmb2xsb3dpbmcgY29kZXMuICovCisjaWZkZWYgUlRNUF9QQ0lfU1VQUE9SVAorCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKQorCSAgICAmJiBwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkgeworCQlwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZyA9IEZBTFNFOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwgJkNhbmNlbGxlZCk7CisJfQorI2VuZGlmIC8qIFJUTVBfUENJX1NVUFBPUlQgLy8gKi8KKwlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpIHsKKwkJcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7CisJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CSyk7CisJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CRSk7CisJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19WSSk7CisJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19WTyk7CisJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9NR01UKTsKKwkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX1JYKTsKKworCQkvKiAyLiBTZW5kIHdha2UgdXAgY29tbWFuZC4gKi8KKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMxLCBQb3dlcldha2VDSUQsIDB4MDAsIDB4MDIpOworCQkvKiAyLTEuIHdhaXQgY29tbWFuZCBvay4gKi8KKwkJQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlcldha2VDSUQpOworCisJCS8qIFdoZW4gUENJIGNsb2NrIGlzIG9mZiwgZG9uJ3Qgd2FudCB0byBzZXJ2aWNlIGludGVycnVwdC4gU28gd2hlbiBiYWNrIHRvIGNsb2NrIG9uLCBlbmFibGUgaW50ZXJydXB0LiAqLworCQkvKlJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9NQVNLX0NTUiwgKERFTEFZSU5UTUFTS3xSeElOVCkpOyAqLworCQlSVE1QX0FTSUNfSU5URVJSVVBUX0VOQUJMRShwQWQpOworCisJCS8qIDMuIEVuYWJsZSBUeCBETUEuICovCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkRtYUNmZy53b3JkKTsKKwkJRG1hQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgRG1hQ2ZnLndvcmQpOworCisJCS8qIEluIFJhZGlvIE9mZiwgd2UgdHVybiBvZmYgUkYgY2xrLCBTbyBub3cgbmVlZCB0byBjYWxsIEFTSUNTd2l0Y2hDaGFubmVsIGFnYWluLiAqLworCQlpZiAoSU5GUkFfT04ocEFkKQorCQkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCSAgICAmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09CisJCQlCV180MCkpIHsKKwkJCS8qIE11c3QgdXNpbmcgNDBNSHouICovCisJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLAorCQkJCQkgIEZBTFNFKTsKKwkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKwkJfSBlbHNlIHsKKwkJCS8qIE11c3QgdXNpbmcgMjBNSHouICovCisJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQl9CisKKy8qS0ggRGVidWc6VGhlIGZvbGxvd2luZyBjb2RlcyBzaG91bGQgYmUgZW5jbG9zZWQgYnkgUlQzMDkwIGNvbXBpbGUgZmxhZyAqLworCQlpZiAocENoaXBPcHMtPkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlKQorCQkJcENoaXBPcHMtPkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlKHBBZCk7CisKKyNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKKy8qIDMwOTAgTUNVIFdha2V1cCBjb21tYW5kIG5lZWRzIG1vcmUgdGltZSB0byBiZSBzdGFibGUuICovCisvKiBCZWZvcmUgc3RhYmxlLCBkb24ndCBpc3N1ZSBvdGhlciBNQ1UgY29tbWFuZCB0byBwcmV2ZW50IGZyb20gZmlybXdhcmUgZXJyb3IuICovCisJCWlmICgoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpCisJCSAgICAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKQorCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPT0gMykKKwkJICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkpIHsKKwkJCVJUTVBfU0VNX0xPQ0soJnBBZC0+TWN1Q21kTG9jayk7CisJCQlwQWQtPmJydDMweHhCYW5NY3VDbWQgPSBGQUxTRTsKKwkJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NY3VDbWRMb2NrKTsKKwkJfQorI2VuZGlmIC8qIFBDSUVfUFNfU1VQUE9SVCAvLyAqLworCisJCS8qIENsZWFyIFJhZGlvIG9mZiBmbGFnICovCisJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKKworCQkvKiBTZXQgTEVEICovCisJCVJUTVBTZXRMRUQocEFkLCBMRURfUkFESU9fT04pOworCisJCWlmIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX0FDVElWRSkgeworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywKKwkJCQkJCSAgICAgcEFkLT5TdGFDZmcuQkJQUjMpOworCQl9CisJfSBlbHNlIHsKKwkJUlQyOHh4UGNpQXNpY1JhZGlvT2ZmKHBBZCwgR1VJUkFESU9fT0ZGLCAwKTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIHNlbmRzIGNvbW1hbmQgdG8gZmlybXdhcmUgYW5kIHR1cm4gb3VyIGNoaXAgdG8gd2FrZSB1cCBtb2RlIGZyb20gcG93ZXIgc2F2ZSBtb2RlLgorCQlCb3RoIFJhZGlvT24gYW5kIC4xMSBwb3dlciBzYXZlIGZ1bmN0aW9uIG5lZWRzIHRvIGNhbGwgdGhpcyByb3V0aW5lLgorCUlucHV0OgorCQlMZXZlbCA9IEdVSVJBRElPX09GRiA6IGNhbGwgdGhpcyBmdW5jdGlvbiBpcyBmcm9tIFJhZGlvIE9mZiB0byBSYWRpbyBPbi4gIE5lZWQgdG8gcmVzdG9yZSBQQ0kgaG9zdCB2YWx1ZS4KKwkJTGV2ZWwgPSBvdGhlciB2YWx1ZSA6IG5vcm1hbCB3YWtlIHVwIGZ1bmN0aW9uLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBSVDI4eHhQY2lBc2ljUmFkaW9PbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IExldmVsKQoreworCS8qV1BETUFfR0xPX0NGR19TVFJVQyAgICAgICBEbWFDZmc7ICovCisJQk9PTEVBTiBDYW5jZWxsZWQ7CisJLyp1MzIgICAgICAgICAgICAgICAgICAgICAgICBNQUNWYWx1ZTsgKi8KKworCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVAgJiYgTGV2ZWwgPT0gRE9UMTFQT1dFUlNBVkUpCisJCXJldHVybiBGQUxTRTsKKworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkgeworCQlpZiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpIHsKKwkJCXBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwgJkNhbmNlbGxlZCk7CisJCX0KKwkJaWYgKChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSAmJgorCQkgICAgIChMZXZlbCA9PSBHVUlSQURJT19PRkYgfHwgTGV2ZWwgPT0gR1VJX0lETEVfUE9XRVJfU0FWRSkpIHx8CisJCSAgICBSVE1QX1RFU1RfUFNGTEFHKHBBZCwgZlJUTVBfUFNfU0VUX1BDSV9DTEtfT0ZGX0NPTU1BTkQpKSB7CisJCQkvKiBTb21lIGNoaXBzIGRvbid0IG5lZWQgdG8gZGVsYXkgNm1zLCBzbyBjb3B5IFJUTVBQQ0llUG93ZXJMaW5rQ3RybFJlc3RvcmUgKi8KKwkJCS8qIHJldHVybiBjb25kaXRpb24gaGVyZS4gKi8KKwkJCS8qCisJCQkgICBpZiAoKChwQWQtPk1BQ1ZlcnNpb24mMHhmZmZmMDAwMCkgIT0gMHgyODYwMDAwMCkKKwkJCSAgICYmICgocEFkLT5EZXZpY2VJRCA9PSBOSUMyODYwX1BDSWVfREVWSUNFX0lEKQorCQkJICAgfHwocEFkLT5EZXZpY2VJRCA9PSBOSUMyNzkwX1BDSWVfREVWSUNFX0lEKSkpCisJCQkgKi8KKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiUlQyOHh4UGNpQXNpY1JhZGlvT24gKClcbiIpKTsKKwkJCQkvKiAxLiBTZXQgUENJIExpbmsgQ29udHJvbCBpbiBDb25maWd1cmF0aW9uIFNwYWNlLiAqLworCQkJCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLAorCQkJCQkJCSAgICAgUkVTVE9SRV9XQUtFVVApOworCQkJCVJUTVB1c2VjRGVsYXkoNjAwMCk7CisJCQl9CisJCX0KKwl9CisjaWZkZWYgUENJRV9QU19TVVBQT1JUCisJaWYgKCEKKwkgICAgKCgoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpCisJICAgICAgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkKKwkgICAgICAmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQorCSAgICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkpKSkKKyNlbmRpZiAvKiBQQ0lFX1BTX1NVUFBPUlQgLy8gKi8KKwl7CisJCXBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlBTTSA6MzA5eGJQQ0ljbGtPZmYgPT0gJWRcbiIsIHBBZC0+YlBDSWNsa09mZikpOworCX0KKwkvKiAyLiBTZW5kIHdha2UgdXAgY29tbWFuZC4gKi8KKwlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIFBvd2VyV2FrZUNJRCwgMHgwMCwgMHgwMik7CisJcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7CisJLyogMi0xLiB3YWl0IGNvbW1hbmQgb2suICovCisJQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlcldha2VDSUQpOworCVJUTVBfQVNJQ19JTlRFUlJVUFRfRU5BQkxFKHBBZCk7CisKKwlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKTsKKwlpZiAoTGV2ZWwgPT0gR1VJX0lETEVfUE9XRVJfU0FWRSkgeworI2lmZGVmICBQQ0lFX1BTX1NVUFBPUlQKKworCQkvKiBhZGQgYnkgam9obmxpLCBSRiBwb3dlciBzZXF1ZW5jZSBzZXR1cCwgbG9hZCBSRiBub3JtYWwgb3BlcmF0aW9uLW1vZGUgc2V0dXAgKi8KKwkJaWYgKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkpIHsKKwkJCXN0cnVjdCBydF9ydG1wX2NoaXBfb3AgKnBDaGlwT3BzID0gJnBBZC0+Y2hpcE9wczsKKworCQkJaWYgKHBDaGlwT3BzLT5Bc2ljUmV2ZXJzZVJmRnJvbVNsZWVwTW9kZSkKKwkJCQlwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUocEFkKTsKKwkJCS8qIDMwOTAgTUNVIFdha2V1cCBjb21tYW5kIG5lZWRzIG1vcmUgdGltZSB0byBiZSBzdGFibGUuICovCisJCQkvKiBCZWZvcmUgc3RhYmxlLCBkb24ndCBpc3N1ZSBvdGhlciBNQ1UgY29tbWFuZCB0byBwcmV2ZW50IGZyb20gZmlybXdhcmUgZXJyb3IuICovCisJCQlpZiAoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKQorCQkJICAgICYmIElTX1ZFUlNJT05fQUZURVJfRihwQWQpCisJCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPT0KKwkJCQkzKQorCQkJICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0KKwkJCQlUUlVFKSkgeworCQkJCVJUTVBfU0VNX0xPQ0soJnBBZC0+TWN1Q21kTG9jayk7CisJCQkJcEFkLT5icnQzMHh4QmFuTWN1Q21kID0gRkFMU0U7CisJCQkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1jdUNtZExvY2spOworCQkJfQorCQl9IGVsc2UKKwkJCS8qIGVuZCBqb2hubGkgKi8KKyNlbmRpZiAvKiBQQ0lFX1BTX1NVUFBPUlQgLy8gKi8KKwkJeworCQkJLyogSW4gUmFkaW8gT2ZmLCB3ZSB0dXJuIG9mZiBSRiBjbGssIFNvIG5vdyBuZWVkIHRvIGNhbGwgQVNJQ1N3aXRjaENoYW5uZWwgYWdhaW4uICovCisJCQl7CisJCQkJaWYgKElORlJBX09OKHBBZCkKKwkJCQkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICE9CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCQkJICAgICYmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby4KKwkJCQkJQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkgeworCQkJCQkvKiBNdXN0IHVzaW5nIDQwTUh6LiAqLworCQkJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsCisJCQkJCQkJICBwQWQtPkNvbW1vbkNmZy4KKwkJCQkJCQkgIENlbnRyYWxDaGFubmVsLAorCQkJCQkJCSAgRkFMU0UpOworCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLAorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLgorCQkJCQkJCUNlbnRyYWxDaGFubmVsKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBNdXN0IHVzaW5nIDIwTUh6LiAqLworCQkJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsCisJCQkJCQkJICBwQWQtPkNvbW1vbkNmZy4KKwkJCQkJCQkgIENoYW5uZWwsIEZBTFNFKTsKKwkJCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJCQl9CisJCQl9CisKKwkJfQorCX0KKwlyZXR1cm4gVFJVRTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSBzZW5kcyBjb21tYW5kIHRvIGZpcm13YXJlIGFuZCB0dXJuIG91ciBjaGlwIHRvIHBvd2VyIHNhdmUgbW9kZS4KKwkJQm90aCBSYWRpb09mZiBhbmQgLjExIHBvd2VyIHNhdmUgZnVuY3Rpb24gbmVlZHMgdG8gY2FsbCB0aGlzIHJvdXRpbmUuCisJSW5wdXQ6CisJCUxldmVsID0gR1VJUkFESU9fT0ZGICA6IEdVSSBSYWRpbyBPZmYgbW9kZQorCQlMZXZlbCA9IERPVDExUE9XRVJTQVZFICA6IDgwMi4xMSBwb3dlciBzYXZlIG1vZGUKKwkJTGV2ZWwgPSBSVE1QX0hBTFQgIDogV2hlbiBEaXNhYmxlIGRldmljZS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUlQyOHh4UGNpQXNpY1JhZGlvT2ZmKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgIHU4IExldmVsLCB1MTYgVGJ0dE51bVRvTmV4dFdha2VVcCkKK3sKKwlXUERNQV9HTE9fQ0ZHX1NUUlVDIERtYUNmZzsKKwl1OCBpLCB0ZW1wQkJQX1IzID0gMDsKKwlCT09MRUFOIGJyYyA9IEZBTFNFLCBDYW5jZWxsZWQ7CisJdTMyIFRiVFRUaW1lID0gMDsKKwl1MzIgUHNQb2xsVGltZSA9IDAgLyosIE1BQ1ZhbHVlICovIDsKKwl1bnNpZ25lZCBsb25nIEJlYWNvblBlcmlvZFRpbWU7CisJdTMyIFJ4RG1hSWR4LCBSeENwdUlkeDsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiQXNpY1JhZGlvT2ZmID09PT4gTHY9ICVkLCBUeENwdUlkeCA9ICVkLCBUeERtYUlkeCA9ICVkLiBSeENwdUlkeCA9ICVkLCBSeERtYUlkeCA9ICVkLlxuIiwKKwkJICBMZXZlbCwgcEFkLT5UeFJpbmdbMF0uVHhDcHVJZHgsIHBBZC0+VHhSaW5nWzBdLlR4RG1hSWR4LAorCQkgIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4LCBwQWQtPlJ4UmluZy5SeERtYUlkeCkpOworCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCAmJiBMZXZlbCA9PSBET1QxMVBPV0VSU0FWRSkKKwkJcmV0dXJuIEZBTFNFOworCisJLyogQ2hlY2sgUnggRE1BIGJ1c3kgc3RhdHVzLCBpZiBtb3JlIHRoYW4gaGFsZiBpcyBvY2N1cGllZCwgZ2l2ZSB1cCB0aGlzIHJhZGlvIG9mZi4gKi8KKwlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX0RSWF9JRFgsICZSeERtYUlkeCk7CisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9DUlhfSURYLCAmUnhDcHVJZHgpOworCWlmICgoUnhEbWFJZHggPiBSeENwdUlkeCkgJiYgKChSeERtYUlkeCAtIFJ4Q3B1SWR4KSA+IFJYX1JJTkdfU0laRSAvIDMpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQXNpY1JhZGlvT2ZmID09PT4gcmV0dXJuMS4gUnhEbWFJZHggPSAlZCAsICBSeENwdUlkeCA9ICVkLiBcbiIsCisJCQkgIFJ4RG1hSWR4LCBSeENwdUlkeCkpOworCQlyZXR1cm4gRkFMU0U7CisJfSBlbHNlIGlmICgoUnhDcHVJZHggPj0gUnhEbWFJZHgpCisJCSAgICYmICgoUnhDcHVJZHggLSBSeERtYUlkeCkgPCBSWF9SSU5HX1NJWkUgLyAzKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkFzaWNSYWRpb09mZiA9PT0+IHJldHVybjIuICBSeENwdUlkeCA9ICVkLiBSeERtYUlkeCA9ICVkICwgIFxuIiwKKwkJCSAgUnhDcHVJZHgsIFJ4RG1hSWR4KSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLyogT25jZSBnbyBpbnRvIHRoaXMgZnVuY3Rpb24sIGRpc2FibGUgdHggYmVjYXVzZSBkb24ndCB3YW50IHRvbyBtYW55IHBhY2tldHMgaW4gcXVldWUgdG8gcHJldmVudCBIVyBzdG9wcy4gKi8KKwkvKnBBZC0+YlBDSWNsa09mZkRpc2FibGVUeCA9IFRSVUU7ICovCisJUlRNUF9TRVRfUFNGTEFHKHBBZCwgZlJUTVBfUFNfRElTQUJMRV9UWCk7CisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpCisJICAgICYmIHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEKKwkgICAgJiYgcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpIHsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsICZDYW5jZWxsZWQpOworCisJCWlmIChMZXZlbCA9PSBET1QxMVBPV0VSU0FWRSkgeworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUQlRUX1RJTUVSLCAmVGJUVFRpbWUpOworCQkJVGJUVFRpbWUgJj0gMHgxZmZmZjsKKwkJCS8qIDAwLiBjaGVjayBpZiBuZWVkIHRvIGRvIHNsZWVwIGluIHRoaXMgRFRJTSBwZXJpb2QuICAgSWYgbmV4dCBiZWFjb24gd2lsbCBhcnJpdmUgd2l0aGluIDMwbXMgLCAuLi5kb2Vzbid0IG5lY2Vzc2FyaWx5IHNsZWVwLiAqLworCQkJLyogVGJUVFRpbWUgdWludCA9IDY0dXMsIExFQURfVElNRSB1bml0ID0gMTAyNHVzLCBQc1BvbGxUaW1lIHVuaXQgPSAxbXMgKi8KKwkJCWlmICgoKDY0ICogVGJUVFRpbWUpIDwgKChMRUFEX1RJTUUgKiAxMDI0KSArIDQwMDAwKSkKKwkJCSAgICAmJiAoVGJ0dE51bVRvTmV4dFdha2VVcCA9PSAwKSkgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJUYlRUVGltZSA9IDB4JXggLCBnaXZlIHVwIHRoaXMgc2xlZXAuIFxuIiwKKwkJCQkJICBUYlRUVGltZSkpOworCQkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOworCQkJCS8qcEFkLT5iUENJY2xrT2ZmRGlzYWJsZVR4ID0gRkFMU0U7ICovCisJCQkJUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19ESVNBQkxFX1RYKTsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9IGVsc2UgeworCQkJCVBzUG9sbFRpbWUgPQorCQkJCSAgICAoNjQgKiBUYlRUVGltZSAtIExFQURfVElNRSAqIDEwMjQpIC8gMTAwMDsKKyNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKKwkJCQlpZiAoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpCisJCQkJICAgICB8fCBJU19SVDMzOTAocEFkKSkKKwkJCQkgICAgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkKKwkJCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC4KKwkJCQkJcnQzMHh4UG93ZXJNb2RlID09IDMpCisJCQkJICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuCisJCQkJCUVuYWJsZU5ld1BTID09IFRSVUUpKSB7CisJCQkJCVBzUG9sbFRpbWUgLT0gNTsKKwkJCQl9IGVsc2UKKyNlbmRpZiAvKiBQQ0lFX1BTX1NVUFBPUlQgLy8gKi8KKwkJCQkJUHNQb2xsVGltZSAtPSAzOworCisJCQkJQmVhY29uUGVyaW9kVGltZSA9CisJCQkJICAgIHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCAqIDEwMiAvIDEwMDsKKwkJCQlpZiAoVGJ0dE51bVRvTmV4dFdha2VVcCA+IDApCisJCQkJCVBzUG9sbFRpbWUgKz0KKwkJCQkJICAgICgoVGJ0dE51bVRvTmV4dFdha2VVcCAtCisJCQkJCSAgICAgIDEpICogQmVhY29uUGVyaW9kVGltZSk7CisKKwkJCQlwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZyA9IFRSVUU7CisJCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCisJCQkJCSAgICAgUHNQb2xsVGltZSk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlJUMjh4eFBjaUFzaWNSYWRpb09mZjo6TGV2ZWwhPURPVDExUE9XRVJTQVZFIFxuIikpOworCX0KKworCXBBZC0+YlBDSWNsa09mZkRpc2FibGVUeCA9IEZBTFNFOworCisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpOworCisJLyogU2V0IHRvIDFSLiAqLworCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID4gMSAmJiBwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSB7CisJCXRlbXBCQlBfUjMgPSAocEFkLT5TdGFDZmcuQkJQUjMgJiAweEU3KTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgdGVtcEJCUF9SMyk7CisJfQorCS8qIEluIFJhZGlvIE9mZiwgd2UgdHVybiBvZmYgUkYgY2xrLCBTbyBub3cgbmVlZCB0byBjYWxsIEFTSUNTd2l0Y2hDaGFubmVsIGFnYWluLiAqLworCWlmICgoSU5GUkFfT04ocEFkKSB8fCBwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApCisJICAgICYmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCSAgICAmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkgeworCQkvKiBNdXN0IHVzaW5nIDQwTUh6LiAqLworCQlBc2ljVHVybk9mZlJGQ2xrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCX0gZWxzZSB7CisJCS8qIE11c3QgdXNpbmcgMjBNSHouICovCisJCUFzaWNUdXJuT2ZmUkZDbGsocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwl9CisKKwlpZiAoTGV2ZWwgIT0gUlRNUF9IQUxUKSB7CisJCS8qIENoYW5nZSBJbnRlcnJ1cHQgYml0bWFzay4gKi8KKwkJLyogV2hlbiBQQ0kgY2xvY2sgaXMgb2ZmLCBkb24ndCB3YW50IHRvIHNlcnZpY2UgaW50ZXJydXB0LiAqLworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfTUFTS19DU1IsIEF1dG9XYWtldXBJbnQpOworCX0gZWxzZSB7CisJCVJUTVBfQVNJQ19JTlRFUlJVUFRfRElTQUJMRShwQWQpOworCX0KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0NSWF9JRFgsIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4KTsKKwkvKiAgMi4gU2VuZCBTbGVlcCBjb21tYW5kICovCisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfU1RBVFVTLCAweGZmZmZmZmZmKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DSUQsIDB4ZmZmZmZmZmYpOworCS8qIHNlbmQgUE9XRVItU0FWRSBjb21tYW5kIHRvIE1DVS4gaGlnaC1ieXRlID0gMSBzYXZlIHBvd2VyIGFzIG11Y2ggYXMgcG9zc2libGUuIGhpZ2ggYnl0ZSA9IDAgc2F2ZSBsZXNzIHBvd2VyICovCisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMwLCBQb3dlclNhZmVDSUQsIDB4ZmYsIDB4MSk7CisJLyogIDItMS4gV2FpdCBjb21tYW5kIHN1Y2Nlc3MgKi8KKwkvKiBTdGF0dXMgPSAxIDogc3VjY2VzcywgU3RhdHVzID0gMiwgYWxyZWFkeSBzbGVlcCwgU3RhdHVzID0gMywgTWF5YmUgTUFDIGlzIGJ1c3kgc28gY2FuJ3QgZmluaXNoIHRoaXMgdGFzay4gKi8KKwlicmMgPSBBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyU2FmZUNJRCk7CisKKwkvKiAgMy4gQWZ0ZXIgMHgzMCBjb21tYW5kIGlzIG9rLCBzZW5kIHJhZGlvIG9mZiBjb21tYW5kLiBsb3dieXRlID0gMCBmb3IgcG93ZXIgc2FmZS4gKi8KKwkvKiBJZiAweDMwIGNvbW1hbmQgaXMgbm90IG9rIHRoaXMgdGltZSwgd2UgY2FuIGlnbm9yZSAweDM1IGNvbW1hbmQuIEl0IHdpbGwgbWFrZSBzdXJlIG5vdCBjYXVzZSBmaXJtd2FyZSdyIHByb2JsZW0uICovCisJaWYgKChMZXZlbCA9PSBET1QxMVBPV0VSU0FWRSkgJiYgKGJyYyA9PSBUUlVFKSkgeworCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzUsIFBvd2VyUmFkaW9PZmZDSUQsIDAsIDB4MDApOwkvKiBsb3dieXRlID0gMCBtZWFucyB0byBkbyBwb3dlciBzYWZlLCBOT1QgdHVybiBvZmYgcmFkaW8uICovCisJCS8qICAzLTEuIFdhaXQgY29tbWFuZCBzdWNjZXNzICovCisJCUFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJSYWRpb09mZkNJRCk7CisJfSBlbHNlIGlmIChicmMgPT0gVFJVRSkgeworCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzUsIFBvd2VyUmFkaW9PZmZDSUQsIDEsIDB4MDApOwkvKiBsb3dieXRlID0gMCBtZWFucyB0byBkbyBwb3dlciBzYWZlLCBOT1QgdHVybiBvZmYgcmFkaW8uICovCisJCS8qICAzLTEuIFdhaXQgY29tbWFuZCBzdWNjZXNzICovCisJCUFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJSYWRpb09mZkNJRCk7CisJfQorCS8qIDEuIFdhaXQgRE1BIG5vdCBidXN5ICovCisJaSA9IDA7CisJZG8geworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZEbWFDZmcud29yZCk7CisJCWlmICgoRG1hQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKQorCQkgICAgJiYgKERtYUNmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkpCisJCQlicmVhazsKKwkJUlRNUHVzZWNEZWxheSgyMCk7CisJCWkrKzsKKwl9IHdoaWxlIChpIDwgNTApOworCisJLyoKKwkgICBpZiAoaSA+PSA1MCkKKwkgICB7CisJICAgcEFkLT5DaGVja0RtYUJ1c3lDb3VudCsrOworCSAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRNQSBSeCBrZWVwcyBidXN5LiAgcmV0dXJuIG9uIEFzaWNSYWRpb09mZiAoKSBDaGVja0RtYUJ1c3lDb3VudCA9ICVkIFxuIiwgcEFkLT5DaGVja0RtYUJ1c3lDb3VudCkpOworCSAgIH0KKwkgICBlbHNlCisJICAgeworCSAgIHBBZC0+Q2hlY2tEbWFCdXN5Q291bnQgPSAwOworCSAgIH0KKwkgKi8KKy8qS0ggRGVidWc6TXkgb3JpZ2luYWwgY29kZXMgaGF2ZSB0aGUgZm9sbHdvaW5nIGNvZGVzLCBidXQgY3VycmVjbnQgY29kZXMgZG8gbm90IGhhdmUgaXQuICovCisvKiBEaXNhYmxlIGZvciBzdGFiaWxpdHkuIElmIFBDSUUgTGluayBDb250cm9sIGlzIG1vZGlmaWVkIGZvciBhZHZhbmNlIHBvd2VyIHNhdmUsIHJlLWNvdmVyeSB0aGlzIGNvZGUgc2VnbWVudC4gKi8KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIDB4MTI4MCk7CisvKk9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19DTEtTRUxFQ1RfNDBNSFopOyAqLworCisjaWZkZWYgUENJRV9QU19TVVBQT1JUCisJaWYgKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkKKwkgICAgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkKKwkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPT0gMykKKwkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlJUMjh4eFBjaUFzaWNSYWRpb09mZjo6MzA5MCByZXR1cm4gdG8gc2tpcCB0aGUgZm9sbG93aW5nIFRidHROdW1Ub05leHRXYWtlVXAgc2V0dGluZyBmb3IgMjc5eFxuIikpOworCQlwQWQtPmJQQ0ljbGtPZmYgPSBUUlVFOworCQlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0RJU0FCTEVfVFgpOworCQkvKiBGb3IgdGhpcyBjYXNlLCBkb2Vzbid0IG5lZWQgdG8gYmVsb3cgYWN0aW9ucywgc28gcmV0dXJuIGhlcmUuICovCisJCXJldHVybiBicmM7CisJfQorI2VuZGlmIC8qIFBDSUVfUFNfU1VQUE9SVCAvLyAqLworCisJaWYgKExldmVsID09IERPVDExUE9XRVJTQVZFKSB7CisJCUFVVE9fV0FLRVVQX1NUUlVDIEF1dG9XYWtldXBDZmc7CisJCS8qUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsIDkwKTsgKi8KKworCQkvKiB3ZSBoYXZlIGRlY2lkZWQgdG8gU0xFRVAsIHNvIGF0IGxlYXN0IGRvIGl0IGZvciBhIEJFQUNPTiBwZXJpb2QuICovCisJCWlmIChUYnR0TnVtVG9OZXh0V2FrZVVwID09IDApCisJCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gMTsKKworCQlBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7CisKKwkJLyogMS4gU2V0IGF1dG8gd2FrZSB1cCB0aW1lci4gKi8KKwkJQXV0b1dha2V1cENmZy5maWVsZC5OdW1vZlNsZWVwaW5nVGJ0dCA9IFRidHROdW1Ub05leHRXYWtlVXAgLSAxOworCQlBdXRvV2FrZXVwQ2ZnLmZpZWxkLkVuYWJsZUF1dG9XYWtldXAgPSAxOworCQlBdXRvV2FrZXVwQ2ZnLmZpZWxkLkF1dG9MZWFkVGltZSA9IExFQURfVElNRTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOworCX0KKwkvKiAgNC0xLiBJZiBpdCdzIHRvIGRpc2FibGUgb3VyIGRldmljZS4gTmVlZCB0byByZXN0b3JlIFBDSSBDb25maWd1cmF0aW9uIFNwYWNlIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZS4gKi8KKwlpZiAoTGV2ZWwgPT0gUlRNUF9IQUxUICYmIHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpIHsKKwkJaWYgKChicmMgPT0gVFJVRSkgJiYgKGkgPCA1MCkpCisJCQlSVE1QUENJZUxpbmtDdHJsU2V0dGluZyhwQWQsIDEpOworCX0KKwkvKiAgNC4gU2V0IFBDSSBjb25maWd1cmF0aW9uIFNwYWNlIExpbmsgQ29tdHJvbCBmaWVsZHMuICBPbmx5IFJhZGlvIE9mZiBuZWVkcyB0byBjYWxsIHRoaXMgZnVuY3Rpb24gKi8KKwllbHNlIGlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSB7CisJCWlmICgoYnJjID09IFRSVUUpICYmIChpIDwgNTApKQorCQkJUlRNUFBDSWVMaW5rQ3RybFNldHRpbmcocEFkLCAzKTsKKwl9CisJLypwQWQtPmJQQ0ljbGtPZmZEaXNhYmxlVHggPSBGQUxTRTsgKi8KKwlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0RJU0FCTEVfVFgpOworCXJldHVybiBUUlVFOworfQorCit2b2lkIFJUMjh4eFBjaU1sbWVSYWRpb09uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQorCQlyZXR1cm47CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcz09PT5cbiIsIF9fZnVuY19fKSk7CisKKwlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkgfHwgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCQkJCQkgICAmJgorCQkJCQkgICAoIU9QU1RBVFVTX1RFU1RfRkxBRworCQkJCQkgICAgKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkKKwkJCQkJICAgIHx8IHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC4KKwkJCQkJICAgIEVuYWJsZU5ld1BTID09IEZBTFNFKSkpIHsKKwkJUlQyOHh4UGNpQXNpY1JhZGlvT24ocEFkLCBHVUlfSURMRV9QT1dFUl9TQVZFKTsKKwkJLypOSUNSZXNldEZyb21FcnJvcihwQWQpOyAqLworCisJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CSyk7CisJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CRSk7CisJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19WSSk7CisJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19WTyk7CisJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9NR01UKTsKKwkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX1JYKTsKKworCQkvKiBFbmFibGUgVHgvUnggKi8KKwkJUlRNUEVuYWJsZVJ4VHgocEFkKTsKKworCQkvKiBDbGVhciBSYWRpbyBvZmYgZmxhZyAqLworCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CisKKwkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRik7CisKKwkJLyogU2V0IExFRCAqLworCQlSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09OKTsKKwl9CisKKwlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmCisJICAgIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkKKwkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSkgeworCQlCT09MRUFOIENhbmNlbGxlZDsKKworCQlSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKHBBZCwgUkVTVE9SRV9XQUtFVVApOworCisJCXBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCA0MCk7CisJfQorfQorCit2b2lkIFJUMjh4eFBjaU1sbWVSYWRpb09GRihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJQk9PTEVBTiBicmMgPSBUUlVFOworCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQorCQlyZXR1cm47CisKKwkvKiBMaW5rIGRvd24gZmlyc3QgaWYgYW55IGFzc29jaWF0aW9uIGV4aXN0cyAqLworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSB7CisJCWlmIChJTkZSQV9PTihwQWQpIHx8IEFESE9DX09OKHBBZCkpIHsKKwkJCXN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSBEaXNSZXE7CisJCQlzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpwTXNnRWxlbSA9CisJCQkgICAgKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSwKKwkJCQkJCQlNRU1fQUxMT0NfRkxBRyk7CisKKwkJCWlmIChwTXNnRWxlbSkgeworCQkJCUNPUFlfTUFDX0FERFIoJkRpc1JlcS5BZGRyLAorCQkJCQkgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQkJRGlzUmVxLlJlYXNvbiA9IFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORzsKKworCQkJCXBNc2dFbGVtLT5NYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKKwkJCQlwTXNnRWxlbS0+TXNnVHlwZSA9IE1UMl9NTE1FX0RJU0FTU09DX1JFUTsKKwkJCQlwTXNnRWxlbS0+TXNnTGVuID0KKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSk7CisJCQkJTmRpc01vdmVNZW1vcnkocE1zZ0VsZW0tPk1zZywgJkRpc1JlcSwKKwkJCQkJICAgICAgIHNpemVvZgorCQkJCQkgICAgICAgKHN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSkpOworCisJCQkJTWxtZURpc2Fzc29jUmVxQWN0aW9uKHBBZCwgcE1zZ0VsZW0pOworCQkJCWtmcmVlKHBNc2dFbGVtKTsKKworCQkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCQl9CisJCX0KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcz09PT5cbiIsIF9fZnVuY19fKSk7CisKKwkvKiBTZXQgUmFkaW8gb2ZmIGZsYWcgKi8KKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOworCisJeworCQlCT09MRUFOIENhbmNlbGxlZDsKKwkJaWYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSB7CisJCQlpZiAoUlRNUF9URVNUX0ZMQUcKKwkJCSAgICAocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgeworCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwKKwkJCQkJCSZDYW5jZWxsZWQpOworCQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsCisJCQkJCQlmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKKwkJCX0KKwkJCS8qIElmIGR1cmluZyBwb3dlciBzYWZlIG1vZGUuICovCisJCQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiLS0+TWxtZVJhZGlvT2ZmKCkgcmV0dXJuIG9uIGJSYWRpbyA9PSBUUlVFOyBcbiIpKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkvKiBBbHdheXMgcmFkaW8gb24gc2luY2UgdGhlIE5JQyBuZWVkcyB0byBzZXQgdGhlIE1DVSBjb21tYW5kIChMRURfUkFESU9fT0ZGKS4gKi8KKwkJCWlmIChJRExFX09OKHBBZCkgJiYKKwkJCSAgICAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKSkpCisJCQl7CisJCQkJUlQyOHh4UGNpQXNpY1JhZGlvT24ocEFkLCBHVUlfSURMRV9QT1dFUl9TQVZFKTsKKwkJCX0KKwkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkgeworCQkJCUJPT0xFQU4gQ2FuY2VsbGVkOworCQkJCXBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7CisJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCisJCQkJCQkmQ2FuY2VsbGVkKTsKKwkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsCisJCQkJCQkmQ2FuY2VsbGVkKTsKKwkJCX0KKwkJfQorCQkvKiBMaW5rIGRvd24gZmlyc3QgaWYgYW55IGFzc29jaWF0aW9uIGV4aXN0cyAqLworCQlpZiAoSU5GUkFfT04ocEFkKSB8fCBBREhPQ19PTihwQWQpKQorCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CisJCVJUTVB1c2VjRGVsYXkoMTAwMDApOworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCQkvKiBDbGVhbiB1cCBvbGQgYnNzIHRhYmxlICovCisJCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKKworCQkvKgorCQkgICBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpCisJCSAgIHsKKwkJICAgUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCAxMCk7CisJCSAgIHJldHVybjsKKwkJICAgfQorCQkgKi8KKwl9CisKKwkvKiBTZXQgTEVELk1vdmUgdG8gaGVyZSBmb3IgZml4aW5nIExFRCBidWcuIFRoaXMgZmxhZyBtdXN0IGJlIGNhbGxlZCBhZnRlciBMaW5rRG93biAqLworCVJUTVBTZXRMRUQocEFkLCBMRURfUkFESU9fT0ZGKTsKKworLypLSCBEZWJ1ZzpBbGwgUENJZSBkZXZpY2VzIG5lZWQgdG8gdXNlIHRpbWVyIHRvIGV4ZWN1dGUgcmFkaW8gb2ZmIGZ1bmN0aW9uLCBvciB0aGUgUENJZSYmRW5hYmxlTmV3UFMgbmVlZHMuICovCisvKktIIEFuczpJdCBpcyByaWdodCwgYmVjYXVzZSBvbmx5IHdoZW4gdGhlIFBDSWUgYW5kIEVuYWJsZU5ld1BzIGlzIHRydWUsIHdlIG5lZWQgdG8gZGVsYXkgdGhlIFJhZGlvT2ZmVGltZXIgKi8KKy8qdG8gYXZvaWQgdGhlIGRlYWRsb2NrIHdpdGggUENJZSBQb3dlciBzYXZpbmcgZnVuY3Rpb24uICovCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEgJiYKKwkgICAgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkgJiYKKwkgICAgcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpIHsKKwkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCAxMCk7CisJfSBlbHNlIHsKKwkJYnJjID0gUlQyOHh4UGNpQXNpY1JhZGlvT2ZmKHBBZCwgR1VJUkFESU9fT0ZGLCAwKTsKKworCQlpZiAoYnJjID09IEZBTFNFKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCIlcyBjYWxsIFJUMjh4eFBjaUFzaWNSYWRpb09mZiBmYWlsIVxuIiwKKwkJCQkgIF9fZnVuY19fKSk7CisJCX0KKwl9CisvKgorKi8KK30KKworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX21hY191c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9tYWNfdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRkNjk1OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9tYWNfdXNiLmMKQEAgLTAsMCArMSwxMTY1IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZmRlZiBSVE1QX01BQ19VU0IKKworI2luY2x1ZGUJIi4uL3J0X2NvbmZpZy5oIgorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEluaXRpYWxpemUgcmVjZWl2ZSBkYXRhIHN0cnVjdHVyZXMuCisKK0FyZ3VtZW50czoKKyAgICBwQWQJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworUmV0dXJuIFZhbHVlOgorCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwlORElTX1NUQVRVU19SRVNPVVJDRVMKKworTm90ZToKKwlJbml0aWFsaXplIGFsbCByZWNlaXZlIHJlbGVhdGVkIHByaXZhdGUgYnVmZmVyLCBpbmNsdWRlIHRob3NlIGRlZmluZQorCWluIHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgc3RydWN0dXJlIGFuZCBhbGwgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZXMuIFRoZSBtYWhvcgorCXdvcmsgaXMgdG8gYWxsb2NhdGUgYnVmZmVyIGZvciBlYWNoIHBhY2tldCBhbmQgY2hhaW4gYnVmZmVyIHRvCisJTkRJUyBwYWNrZXQgZGVzY3JpcHRvci4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBOSUNJbml0UmVjdihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJdTggaTsKKwlpbnQgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJbml0UmVjdlxuIikpOworCXBPYmogPSBwT2JqOworCisJLypJbnRlcmxvY2tlZEV4Y2hhbmdlKCZwQWQtPlBlbmRpbmdSeCwgMCk7ICovCisJcEFkLT5QZW5kaW5nUnggPSAwOworCXBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4ID0gMDsJLyogTmV4dCBSeCBSZWFkIGluZGV4ICovCisJcEFkLT5OZXh0UnhCdWxrSW5JbmRleCA9IDA7CS8qUlhfUklOR19TSVpFIC0xOyAvLyBSeCBCdWxrIHBvaW50ZXIgKi8KKwlwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFKTsgaSsrKSB7CisJCXN0cnVjdCBydF9yeF9jb250ZXh0ICpwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7CisKKwkJLypBbGxvY2F0ZSBVUkIgKi8KKwkJcFJ4Q29udGV4dC0+cFVyYiA9IFJUVVNCX0FMTE9DX1VSQigwKTsKKwkJaWYgKHBSeENvbnRleHQtPnBVcmIgPT0gTlVMTCkgeworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCQkJZ290byBvdXQxOworCQl9CisJCS8qIEFsbG9jYXRlIHRyYW5zZmVyIGJ1ZmZlciAqLworCQlwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9CisJCSAgICBSVFVTQl9VUkJfQUxMT0NfQlVGRkVSKHBPYmotPnBVc2JfRGV2LCBNQVhfUlhCVUxLX1NJWkUsCisJCQkJCSAgICZwUnhDb250ZXh0LT5kYXRhX2RtYSk7CisJCWlmIChwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9PSBOVUxMKSB7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisJCQlnb3RvIG91dDE7CisJCX0KKworCQlOZGlzWmVyb01lbW9yeShwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwgTUFYX1JYQlVMS19TSVpFKTsKKworCQlwUnhDb250ZXh0LT5wQWQgPSBwQWQ7CisJCXBSeENvbnRleHQtPnBJcnAgPSBOVUxMOworCQlwUnhDb250ZXh0LT5JblVzZSA9IEZBTFNFOworCQlwUnhDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJCXBSeENvbnRleHQtPlJlYWRhYmxlID0gRkFMU0U7CisJCS8qcFJ4Q29udGV4dC0+UmVvcmRlckluVXNlID0gRkFMU0U7ICovCisJCXBSeENvbnRleHQtPmJSeEhhbmRsaW5nID0gRkFMU0U7CisJCXBSeENvbnRleHQtPkJ1bGtJbk9mZnNldCA9IDA7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE5JQ0luaXRSZWN2KFN0YXR1cz0lZClcbiIsIFN0YXR1cykpOworCXJldHVybiBTdGF0dXM7CisKK291dDE6CisJZm9yIChpID0gMDsgaSA8IChSWF9SSU5HX1NJWkUpOyBpKyspIHsKKwkJc3RydWN0IHJ0X3J4X2NvbnRleHQgKnBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKKworCQlpZiAoTlVMTCAhPSBwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlcikgeworCQkJUlRVU0JfVVJCX0ZSRUVfQlVGRkVSKHBPYmotPnBVc2JfRGV2LCBNQVhfUlhCVUxLX1NJWkUsCisJCQkJCSAgICAgIHBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLAorCQkJCQkgICAgICBwUnhDb250ZXh0LT5kYXRhX2RtYSk7CisJCQlwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9IE5VTEw7CisJCX0KKworCQlpZiAoTlVMTCAhPSBwUnhDb250ZXh0LT5wVXJiKSB7CisJCQlSVFVTQl9VTkxJTktfVVJCKHBSeENvbnRleHQtPnBVcmIpOworCQkJUlRVU0JfRlJFRV9VUkIocFJ4Q29udGV4dC0+cFVyYik7CisJCQlwUnhDb250ZXh0LT5wVXJiID0gTlVMTDsKKwkJfQorCX0KKworCXJldHVybiBTdGF0dXM7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgSW5pdGlhbGl6ZSB0cmFuc21pdCBkYXRhIHN0cnVjdHVyZXMuCisKK0FyZ3VtZW50czoKKyAgICBwQWQJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworUmV0dXJuIFZhbHVlOgorCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwlORElTX1NUQVRVU19SRVNPVVJDRVMKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBOSUNJbml0VHJhbnNtaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworI2RlZmluZSBMTV9VU0JfQUxMT0MocE9iaiwgQ29udGV4dCwgVEJfVHlwZSwgQnVmZmVyU2l6ZSwgU3RhdHVzLCBtc2cxLCBlcnIxLCBtc2cyLCBlcnIyKQlcCisJQ29udGV4dC0+cFVyYiA9IFJUVVNCX0FMTE9DX1VSQigwKTsJCVwKKwlpZiAoQ29udGV4dC0+cFVyYiA9PSBOVUxMKSB7CQkJXAorCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgbXNnMSk7CQlcCisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsJCVwKKwkJZ290byBlcnIxOyB9CQkJCQkJXAorCQkJCQkJCQkJCQlcCisJQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPQkJCQlcCisJCShUQl9UeXBlKVJUVVNCX1VSQl9BTExPQ19CVUZGRVIocE9iai0+cFVzYl9EZXYsIEJ1ZmZlclNpemUsICZDb250ZXh0LT5kYXRhX2RtYSk7CVwKKwlpZiAoQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPT0gTlVMTCkgewlcCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCBtc2cyKTsJCVwKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwkJXAorCQlnb3RvIGVycjI7IH0KKworI2RlZmluZSBMTV9VUkJfRlJFRShwT2JqLCBDb250ZXh0LCBCdWZmZXJTaXplKQkJCQlcCisJaWYgKE5VTEwgIT0gQ29udGV4dC0+cFVyYikgewkJCQkJCQlcCisJCVJUVVNCX1VOTElOS19VUkIoQ29udGV4dC0+cFVyYik7CQkJCQlcCisJCVJUVVNCX0ZSRUVfVVJCKENvbnRleHQtPnBVcmIpOwkJCQkJCVwKKwkJQ29udGV4dC0+cFVyYiA9IE5VTEw7IH0JCQkJCQkJCVwKKwlpZiAoTlVMTCAhPSBDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlcikgewkJCQlcCisJCVJUVVNCX1VSQl9GUkVFX0JVRkZFUihwT2JqLT5wVXNiX0RldiwgQnVmZmVyU2l6ZSwJXAorCQkJCQkJCQlDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwJXAorCQkJCQkJCQlDb250ZXh0LT5kYXRhX2RtYSk7CQkJXAorCQlDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9IE5VTEw7IH0KKworCXU4IGksIGFjaWR4OworCWludCBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCXN0cnVjdCBydF90eF9jb250ZXh0ICpwTnVsbENvbnRleHQgPSAmKHBBZC0+TnVsbENvbnRleHQpOworCXN0cnVjdCBydF90eF9jb250ZXh0ICpwUHNQb2xsQ29udGV4dCA9ICYocEFkLT5Qc1BvbGxDb250ZXh0KTsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcFJUU0NvbnRleHQgPSAmKHBBZC0+UlRTQ29udGV4dCk7CisJc3RydWN0IHJ0X3R4X2NvbnRleHQgKnBNTE1FQ29udGV4dCA9IE5VTEw7CisvKiAgICAgIHN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQgPSBOVUxMOyAqLworCXN0cnVjdCBvc19jb29raWUgKnBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCXZvaWQgKlJpbmdCYXNlVmE7CisvKiAgICAgIHN0cnVjdCBydF9ydG1wX3R4X3JpbmcgKnBUeFJpbmc7ICovCisJc3RydWN0IHJ0X3J0bXBfbWdtdF9yaW5nICpwTWdtdFJpbmc7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDSW5pdFRyYW5zbWl0XG4iKSk7CisJcE9iaiA9IHBPYmo7CisKKwkvKiBJbml0IDQgc2V0IG9mIFR4IHBhcmFtZXRlcnMgKi8KKwlmb3IgKGFjaWR4ID0gMDsgYWNpZHggPCBOVU1fT0ZfVFhfUklORzsgYWNpZHgrKykgeworCQkvKiBJbml0aWFsaXplIGFsbCBUcmFuc21pdCByZWxlYXRlZCBxdWV1ZXMgKi8KKwkJSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwQWQtPlR4U3dRdWV1ZVthY2lkeF0pOworCisJCS8qIE5leHQgTG9jYWwgdHggcmluZyBwb2ludGVyIHdhaXRpbmcgZm9yIGJ1Y2sgb3V0ICovCisJCXBBZC0+TmV4dEJ1bGtPdXRJbmRleFthY2lkeF0gPSBhY2lkeDsKKwkJcEFkLT5CdWxrT3V0UGVuZGluZ1thY2lkeF0gPSBGQUxTRTsJLyogQnVjayBPdXQgY29udHJvbCBmbGFnICovCisJCS8qcEFkLT5EYXRhQnVsa0RvbmVJZHhbYWNpZHhdID0gMDsgKi8KKwl9CisKKwkvKnBBZC0+TmV4dE1MTUVJbmRleCAgICA9IDA7ICovCisJLypwQWQtPlB1c2hNZ210SW5kZXggICAgPSAwOyAqLworCS8qcEFkLT5Qb3BNZ210SW5kZXggICAgID0gMDsgKi8KKwkvKkludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+TWdtdFF1ZXVlU2l6ZSwgMCk7ICovCisJLypJbnRlcmxvY2tlZEV4Y2hhbmdlKCZwQWQtPlR4Q291bnQsIDApOyAqLworCisJLypwQWQtPlByaW9SaW5nRmlyc3RJbmRleCAgICAgICA9IDA7ICovCisJLypwQWQtPlByaW9SaW5nVHhDbnQgICAgICAgICAgICA9IDA7ICovCisKKwlkbyB7CisJCS8qICovCisJCS8qIFRYX1JJTkdfU0laRSwgNCBBQ3MgKi8KKwkJLyogKi8KKwkJZm9yIChhY2lkeCA9IDA7IGFjaWR4IDwgNDsgYWNpZHgrKykgeworCQkJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dCA9ICYocEFkLT5UeENvbnRleHRbYWNpZHhdKTsKKworCQkJTmRpc1plcm9NZW1vcnkocEhUVFhDb250ZXh0LCBzaXplb2Yoc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQpKTsKKwkJCS8qQWxsb2NhdGUgVVJCICovCisJCQlMTV9VU0JfQUxMT0MocE9iaiwgcEhUVFhDb250ZXh0LCBzdHJ1Y3QgcnRfaHR0eF9idWZmZXIgKiwKKwkJCQkgICAgIHNpemVvZihzdHJ1Y3QgcnRfaHR0eF9idWZmZXIpLCBTdGF0dXMsCisJCQkJICAgICAoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBUeENvbnRleHRbJWRdIHVyYiFcbiIsCisJCQkJICAgICAgYWNpZHgpLCBkb25lLAorCQkJCSAgICAgKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggVHhDb250ZXh0WyVkXSBzdHJ1Y3QgcnRfaHR0eF9idWZmZXIhXG4iLAorCQkJCSAgICAgIGFjaWR4KSwgb3V0MSk7CisKKwkJCU5kaXNaZXJvTWVtb3J5KHBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPgorCQkJCSAgICAgICBBZ2dyZWdhdGlvbiwgNCk7CisJCQlwSFRUWENvbnRleHQtPnBBZCA9IHBBZDsKKwkJCXBIVFRYQ29udGV4dC0+cElycCA9IE5VTEw7CisJCQlwSFRUWENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwkJCXBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA9IDA7CisJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID0gMDsKKwkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA9IDA7CisJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9IDA7CisJCQlwSFRUWENvbnRleHQtPkJ1bGtPdXRTaXplID0gMDsKKwkJCXBIVFRYQ29udGV4dC0+QnVsa091dFBpcGVJZCA9IGFjaWR4OworCQkJcEhUVFhDb250ZXh0LT5iUmluZ0VtcHR5ID0gVFJVRTsKKwkJCXBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkID0gRkFMU0U7CisJCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW2FjaWR4XSA9IEZBTFNFOworCQl9CisKKwkJLyogKi8KKwkJLyogTUdNVF9SSU5HX1NJWkUgKi8KKwkJLyogKi8KKworCQkvKiBBbGxvY2F0ZSBNR01UIHJpbmcgZGVzY3JpcHRvcidzIG1lbW9yeSAqLworCQlwQWQtPk1nbXREZXNjUmluZy5BbGxvY1NpemUgPQorCQkgICAgTUdNVF9SSU5HX1NJWkUgKiBzaXplb2Yoc3RydWN0IHJ0X3R4X2NvbnRleHQpOworCQlvc19hbGxvY19tZW0ocEFkLCAodTggKiopICgmcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSksCisJCQkgICAgIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSk7CisJCWlmIChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhID09IE5VTEwpIHsKKwkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXIgZm9yIE1nbXREZXNjUmluZyFcbiIpKTsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCWdvdG8gb3V0MTsKKwkJfQorCQlOZGlzWmVyb01lbW9yeShwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhLAorCQkJICAgICAgIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSk7CisJCVJpbmdCYXNlVmEgPSBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhOworCisJCS8qIEluaXRpYWxpemUgTUdNVCBSaW5nIGFuZCBhc3NvY2lhdGVkIGJ1ZmZlciBtZW1vcnkgKi8KKwkJcE1nbXRSaW5nID0gJnBBZC0+TWdtdFJpbmc7CisJCWZvciAoaSA9IDA7IGkgPCBNR01UX1JJTkdfU0laRTsgaSsrKSB7CisJCQkvKiBsaW5rIHRoZSBwcmUtYWxsb2NhdGVkIE1nbXQgYnVmZmVyIHRvIE1nbXRSaW5nLkNlbGwgKi8KKwkJCXBNZ210UmluZy0+Q2VsbFtpXS5BbGxvY1NpemUgPSBzaXplb2Yoc3RydWN0IHJ0X3R4X2NvbnRleHQpOworCQkJcE1nbXRSaW5nLT5DZWxsW2ldLkFsbG9jVmEgPSBSaW5nQmFzZVZhOworCQkJcE1nbXRSaW5nLT5DZWxsW2ldLnBOZGlzUGFja2V0ID0gTlVMTDsKKwkJCXBNZ210UmluZy0+Q2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCisJCQkvKkFsbG9jYXRlIFVSQiBmb3IgTUxNRUNvbnRleHQgKi8KKwkJCXBNTE1FQ29udGV4dCA9CisJCQkgICAgKHN0cnVjdCBydF90eF9jb250ZXh0ICopcEFkLT5NZ210UmluZy5DZWxsW2ldLkFsbG9jVmE7CisJCQlwTUxNRUNvbnRleHQtPnBVcmIgPSBSVFVTQl9BTExPQ19VUkIoMCk7CisJCQlpZiAocE1MTUVDb250ZXh0LT5wVXJiID09IE5VTEwpIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJICgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIE1MTUVDb250ZXh0WyVkXSB1cmIhXG4iLAorCQkJCQkgIGkpKTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisJCQkJZ290byBvdXQyOworCQkJfQorCQkJcE1MTUVDb250ZXh0LT5wQWQgPSBwQWQ7CisJCQlwTUxNRUNvbnRleHQtPnBJcnAgPSBOVUxMOworCQkJcE1MTUVDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9IE5VTEw7CisJCQlwTUxNRUNvbnRleHQtPkluVXNlID0gRkFMU0U7CisJCQlwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwkJCXBNTE1FQ29udGV4dC0+YldhaXRpbmdCdWxrT3V0ID0gRkFMU0U7CisJCQlwTUxNRUNvbnRleHQtPkJ1bGtPdXRTaXplID0gMDsKKwkJCXBNTE1FQ29udGV4dC0+U2VsZklkeCA9IGk7CisKKwkJCS8qIE9mZnNldCB0byBuZXh0IHJpbmcgZGVzY3JpcHRvciBhZGRyZXNzICovCisJCQlSaW5nQmFzZVZhID0gKHU4ICopUmluZ0Jhc2VWYSArIHNpemVvZihzdHJ1Y3QgcnRfdHhfY29udGV4dCk7CisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJNR01UIFJpbmc6IHRvdGFsICVkIGVudHJ5IGFsbG9jYXRlZFxuIiwgaSkpOworCisJCS8qcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA9IChNR01UX1JJTkdfU0laRSAtIDEpOyAqLworCQlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID0gTUdNVF9SSU5HX1NJWkU7CisJCXBBZC0+TWdtdFJpbmcuVHhDcHVJZHggPSAwOworCQlwQWQtPk1nbXRSaW5nLlR4RG1hSWR4ID0gMDsKKworCQkvKiAqLworCQkvKiBCRUFDT05fUklOR19TSVpFICovCisJCS8qICovCisJCWZvciAoaSA9IDA7IGkgPCBCRUFDT05fUklOR19TSVpFOyBpKyspCS8qIDIgKi8KKwkJeworCQkJc3RydWN0IHJ0X3R4X2NvbnRleHQgKnBCZWFjb25Db250ZXh0ID0gJihwQWQtPkJlYWNvbkNvbnRleHRbaV0pOworCisJCQlOZGlzWmVyb01lbW9yeShwQmVhY29uQ29udGV4dCwgc2l6ZW9mKHN0cnVjdCBydF90eF9jb250ZXh0KSk7CisKKwkJCS8qQWxsb2NhdGUgVVJCICovCisJCQlMTV9VU0JfQUxMT0MocE9iaiwgcEJlYWNvbkNvbnRleHQsIHN0cnVjdCBydF90eF9idWZmZXIgKiwKKwkJCQkgICAgIHNpemVvZihzdHJ1Y3QgcnRfdHhfYnVmZmVyKSwgU3RhdHVzLAorCQkJCSAgICAgKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggQmVhY29uQ29udGV4dFslZF0gdXJiIVxuIiwKKwkJCQkgICAgICBpKSwgb3V0MiwKKwkJCQkgICAgICgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIEJlYWNvbkNvbnRleHRbJWRdIHN0cnVjdCBydF90eF9idWZmZXIhXG4iLAorCQkJCSAgICAgIGkpLCBvdXQzKTsKKworCQkJcEJlYWNvbkNvbnRleHQtPnBBZCA9IHBBZDsKKwkJCXBCZWFjb25Db250ZXh0LT5wSXJwID0gTlVMTDsKKwkJCXBCZWFjb25Db250ZXh0LT5JblVzZSA9IEZBTFNFOworCQkJcEJlYWNvbkNvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwkJfQorCisJCS8qICovCisJCS8qIE51bGxDb250ZXh0ICovCisJCS8qICovCisJCU5kaXNaZXJvTWVtb3J5KHBOdWxsQ29udGV4dCwgc2l6ZW9mKHN0cnVjdCBydF90eF9jb250ZXh0KSk7CisKKwkJLypBbGxvY2F0ZSBVUkIgKi8KKwkJTE1fVVNCX0FMTE9DKHBPYmosIHBOdWxsQ29udGV4dCwgc3RydWN0IHJ0X3R4X2J1ZmZlciAqLCBzaXplb2Yoc3RydWN0IHJ0X3R4X2J1ZmZlciksCisJCQkgICAgIFN0YXR1cywKKwkJCSAgICAgKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggTnVsbENvbnRleHQgdXJiIVxuIiksCisJCQkgICAgIG91dDMsCisJCQkgICAgICgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIE51bGxDb250ZXh0IHN0cnVjdCBydF90eF9idWZmZXIhXG4iKSwKKwkJCSAgICAgb3V0NCk7CisKKwkJcE51bGxDb250ZXh0LT5wQWQgPSBwQWQ7CisJCXBOdWxsQ29udGV4dC0+cElycCA9IE5VTEw7CisJCXBOdWxsQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwkJcE51bGxDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisKKwkJLyogKi8KKwkJLyogUlRTQ29udGV4dCAqLworCQkvKiAqLworCQlOZGlzWmVyb01lbW9yeShwUlRTQ29udGV4dCwgc2l6ZW9mKHN0cnVjdCBydF90eF9jb250ZXh0KSk7CisKKwkJLypBbGxvY2F0ZSBVUkIgKi8KKwkJTE1fVVNCX0FMTE9DKHBPYmosIHBSVFNDb250ZXh0LCBzdHJ1Y3QgcnRfdHhfYnVmZmVyICosIHNpemVvZihzdHJ1Y3QgcnRfdHhfYnVmZmVyKSwKKwkJCSAgICAgU3RhdHVzLAorCQkJICAgICAoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBSVFNDb250ZXh0IHVyYiFcbiIpLAorCQkJICAgICBvdXQ0LAorCQkJICAgICAoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBSVFNDb250ZXh0IHN0cnVjdCBydF90eF9idWZmZXIhXG4iKSwKKwkJCSAgICAgb3V0NSk7CisKKwkJcFJUU0NvbnRleHQtPnBBZCA9IHBBZDsKKwkJcFJUU0NvbnRleHQtPnBJcnAgPSBOVUxMOworCQlwUlRTQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwkJcFJUU0NvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKworCQkvKiAqLworCQkvKiBQc1BvbGxDb250ZXh0ICovCisJCS8qICovCisJCS8qTmRpc1plcm9NZW1vcnkocFBzUG9sbENvbnRleHQsIHNpemVvZihzdHJ1Y3QgcnRfdHhfY29udGV4dCkpOyAqLworCQkvKkFsbG9jYXRlIFVSQiAqLworCQlMTV9VU0JfQUxMT0MocE9iaiwgcFBzUG9sbENvbnRleHQsIHN0cnVjdCBydF90eF9idWZmZXIgKiwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBydF90eF9idWZmZXIpLCBTdGF0dXMsCisJCQkgICAgICgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIFBzUG9sbENvbnRleHQgdXJiIVxuIiksCisJCQkgICAgIG91dDUsCisJCQkgICAgICgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIFBzUG9sbENvbnRleHQgc3RydWN0IHJ0X3R4X2J1ZmZlciFcbiIpLAorCQkJICAgICBvdXQ2KTsKKworCQlwUHNQb2xsQ29udGV4dC0+cEFkID0gcEFkOworCQlwUHNQb2xsQ29udGV4dC0+cElycCA9IE5VTEw7CisJCXBQc1BvbGxDb250ZXh0LT5JblVzZSA9IEZBTFNFOworCQlwUHNQb2xsQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQlwUHNQb2xsQ29udGV4dC0+YkFnZ3JlZ2F0aWJsZSA9IEZBTFNFOworCQlwUHNQb2xsQ29udGV4dC0+TGFzdE9uZSA9IFRSVUU7CisKKwl9IHdoaWxlIChGQUxTRSk7CisKK2RvbmU6CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE5JQ0luaXRUcmFuc21pdChTdGF0dXM9JWQpXG4iLCBTdGF0dXMpKTsKKworCXJldHVybiBTdGF0dXM7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRVJST1IgSEFORExFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworb3V0NjoKKwlMTV9VUkJfRlJFRShwT2JqLCBwUHNQb2xsQ29udGV4dCwgc2l6ZW9mKHN0cnVjdCBydF90eF9idWZmZXIpKTsKKworb3V0NToKKwlMTV9VUkJfRlJFRShwT2JqLCBwUlRTQ29udGV4dCwgc2l6ZW9mKHN0cnVjdCBydF90eF9idWZmZXIpKTsKKworb3V0NDoKKwlMTV9VUkJfRlJFRShwT2JqLCBwTnVsbENvbnRleHQsIHNpemVvZihzdHJ1Y3QgcnRfdHhfYnVmZmVyKSk7CisKK291dDM6CisJZm9yIChpID0gMDsgaSA8IEJFQUNPTl9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcEJlYWNvbkNvbnRleHQgPSAmKHBBZC0+QmVhY29uQ29udGV4dFtpXSk7CisJCWlmIChwQmVhY29uQ29udGV4dCkKKwkJCUxNX1VSQl9GUkVFKHBPYmosIHBCZWFjb25Db250ZXh0LCBzaXplb2Yoc3RydWN0IHJ0X3R4X2J1ZmZlcikpOworCX0KKworb3V0MjoKKwlpZiAocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSkgeworCQlwTWdtdFJpbmcgPSAmcEFkLT5NZ210UmluZzsKKwkJZm9yIChpID0gMDsgaSA8IE1HTVRfUklOR19TSVpFOyBpKyspIHsKKwkJCXBNTE1FQ29udGV4dCA9CisJCQkgICAgKHN0cnVjdCBydF90eF9jb250ZXh0ICopcEFkLT5NZ210UmluZy5DZWxsW2ldLkFsbG9jVmE7CisJCQlpZiAocE1MTUVDb250ZXh0KQorCQkJCUxNX1VSQl9GUkVFKHBPYmosIHBNTE1FQ29udGV4dCwKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3QgcnRfdHhfYnVmZmVyKSk7CisJCX0KKwkJb3NfZnJlZV9tZW0ocEFkLCBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhKTsKKwkJcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSA9IE5VTEw7CisJfQorCitvdXQxOgorCWZvciAoYWNpZHggPSAwOyBhY2lkeCA8IDQ7IGFjaWR4KyspIHsKKwkJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBUeENvbnRleHQgPSAmKHBBZC0+VHhDb250ZXh0W2FjaWR4XSk7CisJCWlmIChwVHhDb250ZXh0KQorCQkJTE1fVVJCX0ZSRUUocE9iaiwgcFR4Q29udGV4dCwgc2l6ZW9mKHN0cnVjdCBydF9odHR4X2J1ZmZlcikpOworCX0KKworCS8qIEhlcmUgd2UgZGlkbid0IGhhdmUgYW55IHByZS1hbGxvY2F0ZWQgbWVtb3J5IG5lZWQgdG8gZnJlZS4gKi8KKworCXJldHVybiBTdGF0dXM7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgQWxsb2NhdGUgRE1BIG1lbW9yeSBibG9ja3MgZm9yIHNlbmQsIHJlY2VpdmUuCisKK0FyZ3VtZW50czoKKyAgICBwQWQJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworUmV0dXJuIFZhbHVlOgorCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwlORElTX1NUQVRVU19GQUlMVVJFCisJTkRJU19TVEFUVVNfUkVTT1VSQ0VTCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworLyogICAgICBzdHJ1Y3QgcnRfY291bnRlcl84MDJfMTEgIHBDb3VudGVyID0gJnBBZC0+V2xhbkNvdW50ZXJzOyAqLworCWludCBTdGF0dXM7CisJaW50IG51bTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeVxuIikpOworCisJZG8geworCQkvKiBJbml0IHRoZSBzdHJ1Y3QgcnRfY21kcSBhbmQgQ21kUUxvY2sgKi8KKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKwkJUlRVU0JJbml0aWFsaXplQ21kUSgmcEFkLT5DbWRRKTsKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7CisKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TUxNRUJ1bGtPdXRMb2NrKTsKKwkJLypOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NTE1FV2FpdFF1ZXVlTG9jayk7ICovCisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrWzBdKTsKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbMV0pOworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1syXSk7CisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrWzNdKTsKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbNF0pOworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1s1XSk7CisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJ1bGtJbkxvY2spOworCisJCWZvciAobnVtID0gMDsgbnVtIDwgTlVNX09GX1RYX1JJTkc7IG51bSsrKSB7CisJCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbbnVtXSk7CisJCX0KKworLyogICAgICAgICAgICAgIE5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1lbUxvY2spOyAgICAvLyBOb3QgdXNlZCBpbiBSVDI4WFggKi8KKworLyogICAgICAgICAgICAgIE5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOyAvLyBpbml0IGl0IGluIFVzZXJDZmdJbml0KCkgKi8KKy8qICAgICAgICAgICAgICBOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOyAvLyBpbml0IGl0IGluIEJBVGFibGVJbml0KCkgKi8KKworLyogICAgICAgICAgICAgIGZvcihudW09MDsgbnVtPE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFOyBudW0rKykgKi8KKy8qICAgICAgICAgICAgICB7ICovCisvKiAgICAgICAgICAgICAgICAgICAgICBOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbbnVtXS5SeFJlUmluZ0xvY2spOyAqLworLyogICAgICAgICAgICAgIH0gKi8KKworCQkvKiAqLworCQkvKiBJbml0IE1hYyBUYWJsZSAqLworCQkvKiAqLworLyogICAgICAgICAgICAgIE1hY1RhYmxlSW5pdGlhbGl6ZShwQWQpOyAqLworCisJCS8qICovCisJCS8qIEluaXQgc2VuZCBkYXRhIHN0cnVjdHVyZXMgYW5kIHJlbGF0ZWQgcGFyYW1ldGVycyAqLworCQkvKiAqLworCQlTdGF0dXMgPSBOSUNJbml0VHJhbnNtaXQocEFkKTsKKwkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJYnJlYWs7CisKKwkJLyogKi8KKwkJLyogSW5pdCByZWNlaXZlIGRhdGEgc3RydWN0dXJlcyBhbmQgcmVsYXRlZCBwYXJhbWV0ZXJzICovCisJCS8qICovCisJCVN0YXR1cyA9IE5JQ0luaXRSZWN2KHBBZCk7CisJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCWJyZWFrOworCisJCXBBZC0+UGVuZGluZ0lvQ291bnQgPSAxOworCisJfSB3aGlsZSAoRkFMU0UpOworCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+RnJhZ0ZyYW1lLCBzaXplb2Yoc3RydWN0IHJ0X2ZyYWdtZW50X2ZyYW1lKSk7CisJcEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQgPQorCSAgICBSVE1QX0FsbG9jYXRlRnJhZ1BhY2tldEJ1ZmZlcihwQWQsIFJYX0JVRkZFUl9OT1JNU0laRSk7CisKKwlpZiAocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQgPT0gTlVMTCkgeworCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisJfQorCisJREJHUFJJTlRfUyhTdGF0dXMsCisJCSAgICgiPC0tIFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5LCBTdGF0dXM9JXhcbiIsIFN0YXR1cykpOworCXJldHVybiBTdGF0dXM7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisJQ2FsbHMgVVNCX0ludGVyZmFjZVN0b3AgYW5kIGZyZWVzIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBVUkJzCisgICAgY2FsbHMgTmRpc01EZXJlZ2lzdGVyRGV2aWNlIGFuZCBmcmVlcyB0aGUgbWVtb3J5CisgICAgYWxsb2NhdGVkIGluIFZOZXRJbml0aWFsaXplIGZvciB0aGUgQWRhcHRlciBPYmplY3QKKworQXJndW1lbnRzOgorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisJTm9uZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKyNkZWZpbmUgTE1fVVJCX0ZSRUUocE9iaiwgQ29udGV4dCwgQnVmZmVyU2l6ZSkJCQkJXAorCWlmIChOVUxMICE9IENvbnRleHQtPnBVcmIpIHsJCQkJCQkJXAorCQlSVFVTQl9VTkxJTktfVVJCKENvbnRleHQtPnBVcmIpOwkJCQkJXAorCQlSVFVTQl9GUkVFX1VSQihDb250ZXh0LT5wVXJiKTsJCQkJCQlcCisJCUNvbnRleHQtPnBVcmIgPSBOVUxMOyB9CQkJCQkJCQlcCisJaWYgKE5VTEwgIT0gQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIpIHsJCQkJCVwKKwkJUlRVU0JfVVJCX0ZSRUVfQlVGRkVSKHBPYmotPnBVc2JfRGV2LCBCdWZmZXJTaXplLAlcCisJCQkJCQkJCUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyLAlcCisJCQkJCQkJCUNvbnRleHQtPmRhdGFfZG1hKTsJCQlcCisJCUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyID0gTlVMTDsgfQorCisJdTMyIGksIGFjaWR4OworCXN0cnVjdCBydF90eF9jb250ZXh0ICpwTnVsbENvbnRleHQgPSAmcEFkLT5OdWxsQ29udGV4dDsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcFBzUG9sbENvbnRleHQgPSAmcEFkLT5Qc1BvbGxDb250ZXh0OworCXN0cnVjdCBydF90eF9jb250ZXh0ICpwUlRTQ29udGV4dCA9ICZwQWQtPlJUU0NvbnRleHQ7CisvKiAgICAgIHN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQ7ICovCisJLypQUlRNUF9SRU9SREVSQlVGICAgICAgcFJlb3JkZXJCdWY7ICovCisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisvKiAgICAgIHN0cnVjdCBydF9ydG1wX3R4X3JpbmcgKnBUeFJpbmc7ICovCisKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLS0+IFJUTVBGcmVlVHhSeFJpbmdNZW1vcnlcbiIpKTsKKwlwT2JqID0gcE9iajsKKworCS8qIEZyZWUgYWxsIHJlc291cmNlcyBmb3IgdGhlIFJFQ0VJVkUgYnVmZmVyIHF1ZXVlLiAqLworCWZvciAoaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFKTsgaSsrKSB7CisJCXN0cnVjdCBydF9yeF9jb250ZXh0ICpwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7CisJCWlmIChwUnhDb250ZXh0KQorCQkJTE1fVVJCX0ZSRUUocE9iaiwgcFJ4Q29udGV4dCwgTUFYX1JYQlVMS19TSVpFKTsKKwl9CisKKwkvKiBGcmVlIFBzUG9sbCBmcmFtZSByZXNvdXJjZSAqLworCUxNX1VSQl9GUkVFKHBPYmosIHBQc1BvbGxDb250ZXh0LCBzaXplb2Yoc3RydWN0IHJ0X3R4X2J1ZmZlcikpOworCisJLyogRnJlZSBOVUxMIGZyYW1lIHJlc291cmNlICovCisJTE1fVVJCX0ZSRUUocE9iaiwgcE51bGxDb250ZXh0LCBzaXplb2Yoc3RydWN0IHJ0X3R4X2J1ZmZlcikpOworCisJLyogRnJlZSBSVFMgZnJhbWUgcmVzb3VyY2UgKi8KKwlMTV9VUkJfRlJFRShwT2JqLCBwUlRTQ29udGV4dCwgc2l6ZW9mKHN0cnVjdCBydF90eF9idWZmZXIpKTsKKworCS8qIEZyZWUgYmVhY29uIGZyYW1lIHJlc291cmNlICovCisJZm9yIChpID0gMDsgaSA8IEJFQUNPTl9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcEJlYWNvbkNvbnRleHQgPSAmKHBBZC0+QmVhY29uQ29udGV4dFtpXSk7CisJCWlmIChwQmVhY29uQ29udGV4dCkKKwkJCUxNX1VSQl9GUkVFKHBPYmosIHBCZWFjb25Db250ZXh0LCBzaXplb2Yoc3RydWN0IHJ0X3R4X2J1ZmZlcikpOworCX0KKworCS8qIEZyZWUgbWdtdCBmcmFtZSByZXNvdXJjZSAqLworCWZvciAoaSA9IDA7IGkgPCBNR01UX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBydF90eF9jb250ZXh0ICpwTUxNRUNvbnRleHQgPQorCQkgICAgKHN0cnVjdCBydF90eF9jb250ZXh0ICopcEFkLT5NZ210UmluZy5DZWxsW2ldLkFsbG9jVmE7CisJCS8qTE1fVVJCX0ZSRUUocE9iaiwgcE1MTUVDb250ZXh0LCBzaXplb2Yoc3RydWN0IHJ0X3R4X2J1ZmZlcikpOyAqLworCQlpZiAoTlVMTCAhPSBwQWQtPk1nbXRSaW5nLkNlbGxbaV0ucE5kaXNQYWNrZXQpIHsKKwkJCVJUTVBGcmVlTmRpc1BhY2tldChwQWQsCisJCQkJCSAgIHBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5wTmRpc1BhY2tldCk7CisJCQlwQWQtPk1nbXRSaW5nLkNlbGxbaV0ucE5kaXNQYWNrZXQgPSBOVUxMOworCQkJcE1MTUVDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9IE5VTEw7CisJCX0KKworCQlpZiAocE1MTUVDb250ZXh0KSB7CisJCQlpZiAoTlVMTCAhPSBwTUxNRUNvbnRleHQtPnBVcmIpIHsKKwkJCQlSVFVTQl9VTkxJTktfVVJCKHBNTE1FQ29udGV4dC0+cFVyYik7CisJCQkJUlRVU0JfRlJFRV9VUkIocE1MTUVDb250ZXh0LT5wVXJiKTsKKwkJCQlwTUxNRUNvbnRleHQtPnBVcmIgPSBOVUxMOworCQkJfQorCQl9CisJfQorCWlmIChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhKQorCQlvc19mcmVlX21lbShwQWQsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEpOworCisJLyogRnJlZSBUeCBmcmFtZSByZXNvdXJjZSAqLworCWZvciAoYWNpZHggPSAwOyBhY2lkeCA8IDQ7IGFjaWR4KyspIHsKKwkJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dCA9ICYocEFkLT5UeENvbnRleHRbYWNpZHhdKTsKKwkJaWYgKHBIVFRYQ29udGV4dCkKKwkJCUxNX1VSQl9GUkVFKHBPYmosIHBIVFRYQ29udGV4dCwgc2l6ZW9mKHN0cnVjdCBydF9odHR4X2J1ZmZlcikpOworCX0KKworCWlmIChwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCkKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0LAorCQkJCSAgICBORElTX1NUQVRVU19TVUNDRVNTKTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1tpXSk7CisJfQorCisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5CdWxrSW5Mb2NrKTsKKwlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPk1MTUVCdWxrT3V0TG9jayk7CisKKwlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKwkvKiBDbGVhciBhbGwgcGVuZGluZyBidWxrLW91dCByZXF1ZXN0IGZsYWdzLiAqLworCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsIDB4ZmZmZmZmZmYpOworCisvKiAgICAgIE5kaXNGcmVlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7ICovCisKKy8qICAgICAgZm9yKGk9MDsgaTxNQVhfTEVOX09GX0JBX1JFQ19UQUJMRTsgaSsrKSAqLworLyogICAgICB7ICovCisvKiAgICAgICAgICAgICAgTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbaV0uUnhSZVJpbmdMb2NrKTsgKi8KKy8qICAgICAgfSAqLworCisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPC0tLSBSVE1QRnJlZVR4UnhSaW5nTWVtb3J5XG4iKSk7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgV3JpdGUgV0xBTiBNQUMgYWRkcmVzcyB0byBVU0IgMjg3MC4KKworQXJndW1lbnRzOgorICAgIHBBZAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCitSZXR1cm4gVmFsdWU6CisJTkRJU19TVEFUVVNfU1VDQ0VTUworCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IFJUVVNCV3JpdGVIV01BQ0FkZHJlc3Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCU1BQ19EVzBfU1RSVUMgU3RhTWFjUmVnMDsKKwlNQUNfRFcxX1NUUlVDIFN0YU1hY1JlZzE7CisJaW50IFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJTEFSR0VfSU5URUdFUiBOT1c7CisKKwkvKiBpbml0aWFsaXplIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciAqLworCVJUTVBfR2V0Q3VycmVudFN5c3RlbVRpbWUoJk5PVyk7CisKKwlpZiAocEFkLT5iTG9jYWxBZG1pbk1BQyAhPSBUUlVFKSB7CisJCXBBZC0+Q3VycmVudEFkZHJlc3NbMF0gPSBwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF07CisJCXBBZC0+Q3VycmVudEFkZHJlc3NbMV0gPSBwQWQtPlBlcm1hbmVudEFkZHJlc3NbMV07CisJCXBBZC0+Q3VycmVudEFkZHJlc3NbMl0gPSBwQWQtPlBlcm1hbmVudEFkZHJlc3NbMl07CisJCXBBZC0+Q3VycmVudEFkZHJlc3NbM10gPSBwQWQtPlBlcm1hbmVudEFkZHJlc3NbM107CisJCXBBZC0+Q3VycmVudEFkZHJlc3NbNF0gPSBwQWQtPlBlcm1hbmVudEFkZHJlc3NbNF07CisJCXBBZC0+Q3VycmVudEFkZHJlc3NbNV0gPSBwQWQtPlBlcm1hbmVudEFkZHJlc3NbNV07CisJfQorCS8qIFdyaXRlIE5ldyBNQUMgYWRkcmVzcyB0byBNQUNfQ1NSMiAmIE1BQ19DU1IzICYgbGV0IEFTSUMga25vdyBvdXIgbmV3IE1BQyAqLworCVN0YU1hY1JlZzAuZmllbGQuQnl0ZTAgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzBdOworCVN0YU1hY1JlZzAuZmllbGQuQnl0ZTEgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzFdOworCVN0YU1hY1JlZzAuZmllbGQuQnl0ZTIgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzJdOworCVN0YU1hY1JlZzAuZmllbGQuQnl0ZTMgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzNdOworCVN0YU1hY1JlZzEuZmllbGQuQnl0ZTQgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzRdOworCVN0YU1hY1JlZzEuZmllbGQuQnl0ZTUgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzVdOworCVN0YU1hY1JlZzEuZmllbGQuVTJNZU1hc2sgPSAweGZmOworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJICAgICAoIkxvY2FsIE1BQyA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkgICAgICBwQWQtPkN1cnJlbnRBZGRyZXNzWzBdLCBwQWQtPkN1cnJlbnRBZGRyZXNzWzFdLAorCQkgICAgICBwQWQtPkN1cnJlbnRBZGRyZXNzWzJdLCBwQWQtPkN1cnJlbnRBZGRyZXNzWzNdLAorCQkgICAgICBwQWQtPkN1cnJlbnRBZGRyZXNzWzRdLCBwQWQtPkN1cnJlbnRBZGRyZXNzWzVdKSk7CisKKwlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBNQUNfQUREUl9EVzAsIFN0YU1hY1JlZzAud29yZCk7CisJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgTUFDX0FERFJfRFcxLCBTdGFNYWNSZWcxLndvcmQpOworCXJldHVybiBTdGF0dXM7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgRGlzYWJsZSBETUEuCisKK0FyZ3VtZW50czoKKwkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorCU5vbmUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlQyOFhYRE1BRGlzYWJsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJLyogbm8gdXNlICovCit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgRW5hYmxlIERNQS4KKworQXJndW1lbnRzOgorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisJTm9uZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVDI4WFhETUFFbmFibGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCVdQRE1BX0dMT19DRkdfU1RSVUMgR2xvQ2ZnOworCVVTQl9ETUFfQ0ZHX1NUUlVDIFVzYkNmZzsKKwlpbnQgaSA9IDA7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4NCk7CisJZG8geworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7CisJCWlmICgoR2xvQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKQorCQkgICAgJiYgKEdsb0NmZy5maWVsZC5SeERNQUJ1c3kgPT0gMCkpCisJCQlicmVhazsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gIERNQUJ1c3lcbiIpKTsKKwkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwkJaSsrOworCX0gd2hpbGUgKGkgPCAyMDApOworCisJUlRNUHVzZWNEZWxheSg1MCk7CisJR2xvQ2ZnLmZpZWxkLkVuVFhXcml0ZUJhY2tERE9ORSA9IDE7CisJR2xvQ2ZnLmZpZWxkLkVuYWJsZVJ4RE1BID0gMTsKKwlHbG9DZmcuZmllbGQuRW5hYmxlVHhETUEgPSAxOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCI8PT0gV1JJVEUgRE1BIG9mZnNldCAweDIwOCA9IDB4JXhcbiIsIEdsb0NmZy53b3JkKSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOworCisJVXNiQ2ZnLndvcmQgPSAwOworCVVzYkNmZy5maWVsZC5waHljbGVhciA9IDA7CisJLyogdXNiIHZlcnNpb24gaXMgMS4xLGRvIG5vdCB1c2UgYnVsayBpbiBhZ2dyZWdhdGlvbiAqLworCWlmIChwQWQtPkJ1bGtJbk1heFBhY2tldFNpemUgPT0gNTEyKQorCQlVc2JDZmcuZmllbGQuUnhCdWxrQWdnRW4gPSAxOworCS8qIGZvciBsYXN0IHBhY2tldCwgUEJGIG1pZ2h0IHVzZSBtb3JlIHRoYW4gbGltaXRlZCwgc28gbWludXMgMiB0byBwcmV2ZW50IGZyb20gZXJyb3IgKi8KKwlVc2JDZmcuZmllbGQuUnhCdWxrQWdnTG10ID0gKE1BWF9SWEJVTEtfU0laRSAvIDEwMjQpIC0gMzsKKwlVc2JDZmcuZmllbGQuUnhCdWxrQWdnVE91dCA9IDB4ODA7CS8qIDIwMDYtMTAtMTggKi8KKwlVc2JDZmcuZmllbGQuUnhCdWxrRW4gPSAxOworCVVzYkNmZy5maWVsZC5UeEJ1bGtFbiA9IDE7CisKKwlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBVU0JfRE1BX0NGRywgVXNiQ2ZnLndvcmQpOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCisgICoJMjg3MCBCZWFjb24gVXBkYXRlIFJlbGF0ZWQgZnVuY3Rpb25zLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFdyaXRlIEJlYWNvbiBidWZmZXIgdG8gQXNpYy4KKworQXJndW1lbnRzOgorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisJTm9uZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVDI4eHhfVXBkYXRlQmVhY29uVG9Bc2ljKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgICBpbnQgYXBpZHgsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBGcmFtZUxlbiwgdW5zaWduZWQgbG9uZyBVcGRhdGVQb3MpCit7CisJdTggKnBCZWFjb25GcmFtZSA9IE5VTEw7CisJdTggKnB0cjsKKwl1MzIgaSwgcGFkZGluZzsKKwlzdHJ1Y3QgcnRfYmVhY29uX3N5bmMgKnBCZWFjb25TeW5jID0gcEFkLT5Db21tb25DZmcucEJlYWNvblN5bmM7CisJdTMyIGxvbmdWYWx1ZTsKKy8qICAgICAgdTE2ICAgICAgICAgICAgICAgICAgc2hvcnRWYWx1ZTsgKi8KKwlCT09MRUFOIGJCY25SZXEgPSBGQUxTRTsKKwl1OCBiY25faWR4ID0gMDsKKworCWlmIChwQmVhY29uRnJhbWUgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJwQmVhY29uRnJhbWUgaXMgTlVMTCFcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwQmVhY29uU3luYyA9PSBOVUxMKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInBCZWFjb25TeW5jIGlzIE5VTEwhXG4iKSk7CisJCXJldHVybjsKKwl9CisJLyppZiAoKHBBZC0+V2RzVGFiLk1vZGUgPT0gV0RTX0JSSURHRV9NT0RFKSB8fCAqLworCS8qICAgICAgKChwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uTVNTSUREZXYgPT0gTlVMTCkgfHwgIShwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uTVNTSUREZXYtPmZsYWdzICYgSUZGX1VQKSkgKi8KKwkvKiAgICAgICkgKi8KKwlpZiAoYkJjblJlcSA9PSBGQUxTRSkgeworCQkvKiB3aGVuIHRoZSByYSBpbnRlcmZhY2UgaXMgZG93biwgZG8gbm90IHNlbmQgaXRzIGJlYWNvbiBmcmFtZSAqLworCQkvKiBjbGVhciBhbGwgemVybyAqLworCQlmb3IgKGkgPSAwOyBpIDwgVFhXSV9TSVpFOyBpICs9IDQpIHsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgaSwKKwkJCQkJMHgwMCk7CisJCX0KKwkJcEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCAmPQorCQkgICAgKH4oQkVBQ09OX0JJVE1BUF9NQVNLICYgKDEgPDwgYmNuX2lkeCkpKTsKKwkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvblR4V0lbYmNuX2lkeF0sIFRYV0lfU0laRSk7CisJfSBlbHNlIHsKKwkJcHRyID0gKHU4ICopJiBwQWQtPkJlYWNvblR4V0k7CisJCWlmIChOZGlzRXF1YWxNZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvblR4V0lbYmNuX2lkeF0sICZwQWQtPkJlYWNvblR4V0ksIFRYV0lfU0laRSkgPT0gRkFMU0UpIHsJLyogSWYgQmVhY29uVHhXSSBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHJld3JpdGUgdGhlIFR4V0kgZm9yIHRoZSBCZWFjb24gZnJhbWVzLiAqLworCQkJcEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCAmPQorCQkJICAgICh+KEJFQUNPTl9CSVRNQVBfTUFTSyAmICgxIDw8IGJjbl9pZHgpKSk7CisJCQlOZGlzTW92ZU1lbW9yeShwQmVhY29uU3luYy0+QmVhY29uVHhXSVtiY25faWR4XSwKKwkJCQkgICAgICAgJnBBZC0+QmVhY29uVHhXSSwgVFhXSV9TSVpFKTsKKwkJfQorCisJCWlmICgocEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCAmICgxIDw8IGJjbl9pZHgpKSAhPQorCQkgICAgKDEgPDwgYmNuX2lkeCkpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBUWFdJX1NJWkU7IGkgKz0gNCkJLyogMTYtYnl0ZSBUWFdJIGZpZWxkICovCisJCQl7CisJCQkJbG9uZ1ZhbHVlID0KKwkJCQkgICAgKnB0ciArICgqKHB0ciArIDEpIDw8IDgpICsKKwkJCQkgICAgKCoocHRyICsgMikgPDwgMTYpICsgKCoocHRyICsgMykgPDwgMjQpOworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsCisJCQkJCQlwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIGksCisJCQkJCQlsb25nVmFsdWUpOworCQkJCXB0ciArPSA0OworCQkJfQorCQl9CisKKwkJcHRyID0gcEJlYWNvblN5bmMtPkJlYWNvbkJ1ZltiY25faWR4XTsKKwkJcGFkZGluZyA9IChGcmFtZUxlbiAmIDB4MDEpOworCQlOZGlzWmVyb01lbW9yeSgodTggKikocEJlYWNvbkZyYW1lICsgRnJhbWVMZW4pLCBwYWRkaW5nKTsKKwkJRnJhbWVMZW4gKz0gcGFkZGluZzsKKwkJZm9yIChpID0gMDsgaSA8IEZyYW1lTGVuIC8qSFdfQkVBQ09OX09GRlNFVCAqLyA7IGkgKz0gMikgeworCQkJaWYgKE5kaXNFcXVhbE1lbW9yeShwdHIsIHBCZWFjb25GcmFtZSwgMikgPT0gRkFMU0UpIHsKKwkJCQlOZGlzTW92ZU1lbW9yeShwdHIsIHBCZWFjb25GcmFtZSwgMik7CisJCQkJLypzaG9ydFZhbHVlID0gKnB0ciArICgqKHB0cisxKTw8OCk7ICovCisJCQkJLypSVE1QX0lPX1dSSVRFOChwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgVFhXSV9TSVpFICsgaSwgc2hvcnRWYWx1ZSk7ICovCisJCQkJUlRVU0JNdWx0aVdyaXRlKHBBZCwKKwkJCQkJCXBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsKKwkJCQkJCVRYV0lfU0laRSArIGksIHB0ciwgMik7CisJCQl9CisJCQlwdHIgKz0gMjsKKwkJCXBCZWFjb25GcmFtZSArPSAyOworCQl9CisKKwkJcEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCB8PSAoMSA8PCBiY25faWR4KTsKKworCQkvKiBGb3IgQVAgaW50ZXJmYWNlLCBzZXQgdGhlIER0aW1CaXRPbiBzbyB0aGF0IHdlIGNhbiBzZW5kIEJjYXN0L01jYXN0IGZyYW1lIG91dCBhZnRlciB0aGlzIGJlYWNvbiBmcmFtZS4gKi8KKwl9CisKK30KKwordm9pZCBSVFVTQkJzc0JlYWNvblN0b3Aoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXN0cnVjdCBydF9iZWFjb25fc3luYyAqcEJlYWNvblN5bmM7CisJaW50IGksIG9mZnNldDsKKwlCT09MRUFOIENhbmNlbGxlZCA9IFRSVUU7CisKKwlwQmVhY29uU3luYyA9IHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jOworCWlmIChwQmVhY29uU3luYyAmJiBwQmVhY29uU3luYy0+RW5hYmxlQmVhY29uKSB7CisJCWludCBOdW1PZkJjbjsKKworCQl7CisJCQlOdW1PZkJjbiA9IE1BWF9NRVNIX05VTTsKKwkJfQorCisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5Db21tb25DZmcuQmVhY29uVXBkYXRlVGltZXIsICZDYW5jZWxsZWQpOworCisJCWZvciAoaSA9IDA7IGkgPCBOdW1PZkJjbjsgaSsrKSB7CisJCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uQnVmW2ldLAorCQkJCSAgICAgICBIV19CRUFDT05fT0ZGU0VUKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25UeFdJW2ldLCBUWFdJX1NJWkUpOworCisJCQlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IEhXX0JFQUNPTl9PRkZTRVQ7IG9mZnNldCArPSA0KQorCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsCisJCQkJCQlwQWQtPkJlYWNvbk9mZnNldFtpXSArIG9mZnNldCwKKwkJCQkJCTB4MDApOworCisJCQlwQmVhY29uU3luYy0+Q2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uW2ldID0gMDsKKwkJCXBCZWFjb25TeW5jLT5UaW1JRUxvY2F0aW9uSW5CZWFjb25baV0gPSAwOworCQl9CisJCXBCZWFjb25TeW5jLT5CZWFjb25CaXRNYXAgPSAwOworCQlwQmVhY29uU3luYy0+RHRpbUJpdE9uID0gMDsKKwl9Cit9CisKK3ZvaWQgUlRVU0JCc3NCZWFjb25TdGFydChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJaW50IGFwaWR4OworCXN0cnVjdCBydF9iZWFjb25fc3luYyAqcEJlYWNvblN5bmM7CisvKiAgICAgIExBUkdFX0lOVEVHRVIgICB0c2ZUaW1lLCBkZWx0YVRpbWU7ICovCisKKwlwQmVhY29uU3luYyA9IHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jOworCWlmIChwQmVhY29uU3luYyAmJiBwQmVhY29uU3luYy0+RW5hYmxlQmVhY29uKSB7CisJCWludCBOdW1PZkJjbjsKKworCQl7CisJCQlOdW1PZkJjbiA9IE1BWF9NRVNIX05VTTsKKwkJfQorCisJCWZvciAoYXBpZHggPSAwOyBhcGlkeCA8IE51bU9mQmNuOyBhcGlkeCsrKSB7CisJCQl1OCBDYXBhYmlsaXR5SW5mb0xvY2F0aW9uSW5CZWFjb24gPSAwOworCQkJdTggVGltSUVMb2NhdGlvbkluQmVhY29uID0gMDsKKworCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvbkJ1ZlthcGlkeF0sCisJCQkJICAgICAgIEhXX0JFQUNPTl9PRkZTRVQpOworCQkJcEJlYWNvblN5bmMtPkNhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvblthcGlkeF0gPQorCQkJICAgIENhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvbjsKKwkJCXBCZWFjb25TeW5jLT5UaW1JRUxvY2F0aW9uSW5CZWFjb25bYXBpZHhdID0KKwkJCSAgICBUaW1JRUxvY2F0aW9uSW5CZWFjb247CisJCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uVHhXSVthcGlkeF0sCisJCQkJICAgICAgIFRYV0lfU0laRSk7CisJCX0KKwkJcEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCA9IDA7CisJCXBCZWFjb25TeW5jLT5EdGltQml0T24gPSAwOworCQlwQWQtPkNvbW1vbkNmZy5CZWFjb25VcGRhdGVUaW1lci5SZXBlYXQgPSBUUlVFOworCisJCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvbkFkanVzdCA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvbkZhY3RvciA9CisJCSAgICAweGZmZmZmZmZmIC8gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCAxMCk7CisJCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvblJlbWFpbiA9CisJCSAgICAoMHhmZmZmZmZmZiAlIChwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgMTApKSArIDE7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiUlRVU0JCc3NCZWFjb25TdGFydDpCZWFjb25GYWN0b3I9JWQsIEJlYWNvblJlbWFpbj0lZCFcbiIsCisJCQkgIHBBZC0+Q29tbW9uQ2ZnLkJlYWNvbkZhY3RvciwKKwkJCSAgcEFkLT5Db21tb25DZmcuQmVhY29uUmVtYWluKSk7CisJCVJUTVBTZXRUaW1lcigmcEFkLT5Db21tb25DZmcuQmVhY29uVXBkYXRlVGltZXIsCisJCQkgICAgIDEwIC8qcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kICovICk7CisKKwl9Cit9CisKK3ZvaWQgUlRVU0JCc3NCZWFjb25Jbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlzdHJ1Y3QgcnRfYmVhY29uX3N5bmMgKnBCZWFjb25TeW5jOworCWludCBpOworCisJb3NfYWxsb2NfbWVtKHBBZCwgKHU4ICoqKSAoJnBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jKSwKKwkJICAgICBzaXplb2Yoc3RydWN0IHJ0X2JlYWNvbl9zeW5jKSk7CisJLypOZGlzQWxsb2NNZW1vcnkocEFkLT5Db21tb25DZmcucEJlYWNvblN5bmMsIHNpemVvZihzdHJ1Y3QgcnRfYmVhY29uX3N5bmMpLCBNRU1fQUxMT0NfRkxBRyk7ICovCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jKSB7CisJCXBCZWFjb25TeW5jID0gcEFkLT5Db21tb25DZmcucEJlYWNvblN5bmM7CisJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLCBzaXplb2Yoc3RydWN0IHJ0X2JlYWNvbl9zeW5jKSk7CisJCWZvciAoaSA9IDA7IGkgPCBIV19CRUFDT05fTUFYX0NPVU5UOyBpKyspIHsKKwkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25CdWZbaV0sCisJCQkJICAgICAgIEhXX0JFQUNPTl9PRkZTRVQpOworCQkJcEJlYWNvblN5bmMtPkNhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvbltpXSA9IDA7CisJCQlwQmVhY29uU3luYy0+VGltSUVMb2NhdGlvbkluQmVhY29uW2ldID0gMDsKKwkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25UeFdJW2ldLCBUWFdJX1NJWkUpOworCQl9CisJCXBCZWFjb25TeW5jLT5CZWFjb25CaXRNYXAgPSAwOworCisJCS8qUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPkNvbW1vbkNmZy5CZWFjb25VcGRhdGVUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEJlYWNvblVwZGF0ZUV4ZWMpLCBwQWQsIFRSVUUpOyAqLworCQlwQmVhY29uU3luYy0+RW5hYmxlQmVhY29uID0gVFJVRTsKKwl9Cit9CisKK3ZvaWQgUlRVU0JCc3NCZWFjb25FeGl0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlzdHJ1Y3QgcnRfYmVhY29uX3N5bmMgKnBCZWFjb25TeW5jOworCUJPT0xFQU4gQ2FuY2VsbGVkID0gVFJVRTsKKwlpbnQgaTsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYykgeworCQlwQmVhY29uU3luYyA9IHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jOworCQlwQmVhY29uU3luYy0+RW5hYmxlQmVhY29uID0gRkFMU0U7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5Db21tb25DZmcuQmVhY29uVXBkYXRlVGltZXIsICZDYW5jZWxsZWQpOworCQlwQmVhY29uU3luYy0+QmVhY29uQml0TWFwID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgSFdfQkVBQ09OX01BWF9DT1VOVDsgaSsrKSB7CisJCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uQnVmW2ldLAorCQkJCSAgICAgICBIV19CRUFDT05fT0ZGU0VUKTsKKwkJCXBCZWFjb25TeW5jLT5DYXBhYmlsaXR5SW5mb0xvY2F0aW9uSW5CZWFjb25baV0gPSAwOworCQkJcEJlYWNvblN5bmMtPlRpbUlFTG9jYXRpb25JbkJlYWNvbltpXSA9IDA7CisJCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uVHhXSVtpXSwgVFhXSV9TSVpFKTsKKwkJfQorCisJCW9zX2ZyZWVfbWVtKHBBZCwgcEFkLT5Db21tb25DZmcucEJlYWNvblN5bmMpOworCQlwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYyA9IE5VTEw7CisJfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIEZvciBkZXZpY2Ugd29yayBhcyBBUCBtb2RlIGJ1dCBkaWRuJ3QgaGF2ZSBUQlRUIGludGVycnVwdCBldmVudCwgd2UgbmVlZCBhIG1lY2hhbmlzbQorICAgICAgICB0byB1cGRhdGUgdGhlIGJlYWNvbiBjb250ZXh0IGluIGVhY2ggQmVhY29uIGludGVydmFsLiBIZXJlIHdlIHVzZSBhIHBlcmlvZGljYWwgdGltZXIKKyAgICAgICAgdG8gc2ltdWxhdGUgdGhlIFRCVFQgaW50ZXJydXB0IHRvIGhhbmRsZSB0aGUgYmVhY29uIGNvbnRleHQgdXBkYXRlLgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBTeXN0ZW1TcGVjaWZpYzEgICAgICAgICAtIE5vdCB1c2VkLgorICAgICAgICBGdW5jdGlvbkNvbnRleHQgICAgICAgICAtIFBvaW50ZXIgdG8gb3VyIEFkYXB0ZXIgY29udGV4dC4KKyAgICAgICAgU3lzdGVtU3BlY2lmaWMyICAgICAgICAgLSBOb3QgdXNlZC4KKyAgICAgICAgU3lzdGVtU3BlY2lmaWMzICAgICAgICAgLSBOb3QgdXNlZC4KKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBCZWFjb25VcGRhdGVFeGVjKHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJICAgICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkgICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMykKK3sKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKUZ1bmN0aW9uQ29udGV4dDsKKwlMQVJHRV9JTlRFR0VSIHRzZlRpbWVfYTsJLyosIHRzZlRpbWVfYiwgZGVsdGFUaW1lX2V4cCwgZGVsdGFUaW1lX2FiOyAqLworCXUzMiBkZWx0YSwgZGVsdGEyTVMsIHBlcmlvZDJVUywgcmVtYWluLCByZW1haW5fbG93LCByZW1haW5faGlnaDsKKy8qICAgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgcG9zaXRpdmU7ICovCisKKwlpZiAocEFkLT5Db21tb25DZmcuSXNVcGRhdGVCZWFjb24gPT0gVFJVRSkgeworCQlSZVN5bmNCZWFjb25UaW1lKHBBZCk7CisKKwl9CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRTRl9USU1FUl9EVzAsICZ0c2ZUaW1lX2EudS5Mb3dQYXJ0KTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRTRl9USU1FUl9EVzEsICZ0c2ZUaW1lX2EudS5IaWdoUGFydCk7CisKKwkvKnBvc2l0aXZlPWdldERlbHRhVGltZSh0c2ZUaW1lX2EsIGV4cGVjdGVkVGltZSwgJmRlbHRhVGltZV9leHApOyAqLworCXBlcmlvZDJVUyA9IChwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgMTApOworCXJlbWFpbl9oaWdoID0gcEFkLT5Db21tb25DZmcuQmVhY29uUmVtYWluICogdHNmVGltZV9hLnUuSGlnaFBhcnQ7CisJcmVtYWluX2xvdyA9IHRzZlRpbWVfYS51Lkxvd1BhcnQgJSAocEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDEwKTsKKwlyZW1haW4gPQorCSAgICAocmVtYWluX2hpZ2ggKyByZW1haW5fbG93KSAlIChwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgMTApOworCWRlbHRhID0gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCAxMCkgLSByZW1haW47CisKKwlkZWx0YTJNUyA9IChkZWx0YSA+PiAxMCk7CisJaWYgKGRlbHRhMk1TID4gMTUwKSB7CisJCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvblVwZGF0ZVRpbWVyLlRpbWVyVmFsdWUgPSAxMDA7CisJCXBBZC0+Q29tbW9uQ2ZnLklzVXBkYXRlQmVhY29uID0gRkFMU0U7CisJfSBlbHNlIHsKKwkJcEFkLT5Db21tb25DZmcuQmVhY29uVXBkYXRlVGltZXIuVGltZXJWYWx1ZSA9IGRlbHRhMk1TICsgMTA7CisJCXBBZC0+Q29tbW9uQ2ZnLklzVXBkYXRlQmVhY29uID0gVFJVRTsKKwl9CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKgkyODcwIFJhZGlvIG9uL29mZiBSZWxhdGVkIGZ1bmN0aW9ucy4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUlQyOHh4VXNiTWxtZVJhZGlvT24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXN0cnVjdCBydF9ydG1wX2NoaXBfb3AgKnBDaGlwT3BzID0gJnBBZC0+Y2hpcE9wczsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUMjh4eFVzYk1sbWVSYWRpb09uKClcbiIpKTsKKworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCisJCXJldHVybjsKKworCXsKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMxLCAweGZmLCAweDAwLCAweDAyKTsKKwkJUlRNUHVzZWNEZWxheSgxMDAwMCk7CisJfQorCS8qTklDUmVzZXRGcm9tRXJyb3IocEFkKTsgKi8KKworCS8qIEVuYWJsZSBUeC9SeCAqLworCVJUTVBFbmFibGVSeFR4KHBBZCk7CisKKwlpZiAocENoaXBPcHMtPkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlKQorCQlwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUocEFkKTsKKworCS8qIENsZWFyIFJhZGlvIG9mZiBmbGFnICovCisJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOworCisJUlRVU0JCdWxrUmVjZWl2ZShwQWQpOworCisJLyogU2V0IExFRCAqLworCVJUTVBTZXRMRUQocEFkLCBMRURfUkFESU9fT04pOworfQorCit2b2lkIFJUMjh4eFVzYk1sbWVSYWRpb09GRihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJV1BETUFfR0xPX0NGR19TVFJVQyBHbG9DZmc7CisJdTMyIFZhbHVlLCBpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlQyOHh4VXNiTWxtZVJhZGlvT0ZGKClcbiIpKTsKKworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKKwkJcmV0dXJuOworCisJLyogQ2xlYXIgUE1LSUQgY2FjaGUuICovCisJcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW0gPSAwOworCVJUTVBaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlNhdmVkUE1LLCAoUE1LSURfTk8gKiBzaXplb2Yoc3RydWN0IHJ0X2Jzc2lkX2luZm8pKSk7CisKKwkvKiBMaW5rIGRvd24gZmlyc3QgaWYgYW55IGFzc29jaWF0aW9uIGV4aXN0cyAqLworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSB7CisJCWlmIChJTkZSQV9PTihwQWQpIHx8IEFESE9DX09OKHBBZCkpIHsKKwkJCXN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSBEaXNSZXE7CisJCQlzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpwTXNnRWxlbSA9CisJCQkgICAgKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSwKKwkJCQkJCQlNRU1fQUxMT0NfRkxBRyk7CisKKwkJCWlmIChwTXNnRWxlbSkgeworCQkJCUNPUFlfTUFDX0FERFIoJkRpc1JlcS5BZGRyLAorCQkJCQkgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQkJRGlzUmVxLlJlYXNvbiA9IFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORzsKKworCQkJCXBNc2dFbGVtLT5NYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKKwkJCQlwTXNnRWxlbS0+TXNnVHlwZSA9IE1UMl9NTE1FX0RJU0FTU09DX1JFUTsKKwkJCQlwTXNnRWxlbS0+TXNnTGVuID0KKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSk7CisJCQkJTmRpc01vdmVNZW1vcnkocE1zZ0VsZW0tPk1zZywgJkRpc1JlcSwKKwkJCQkJICAgICAgIHNpemVvZgorCQkJCQkgICAgICAgKHN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSkpOworCisJCQkJTWxtZURpc2Fzc29jUmVxQWN0aW9uKHBBZCwgcE1zZ0VsZW0pOworCQkJCWtmcmVlKHBNc2dFbGVtKTsKKworCQkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCQl9CisJCX0KKwl9CisJLyogU2V0IFJhZGlvIG9mZiBmbGFnICovCisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKKworCXsKKwkJLyogTGluayBkb3duIGZpcnN0IGlmIGFueSBhc3NvY2lhdGlvbiBleGlzdHMgKi8KKwkJaWYgKElORlJBX09OKHBBZCkgfHwgQURIT0NfT04ocEFkKSkKKwkJCUxpbmtEb3duKHBBZCwgRkFMU0UpOworCQlSVE1QdXNlY0RlbGF5KDEwMDAwKTsKKworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCQkvKiBDbGVhbiB1cCBvbGQgYnNzIHRhYmxlICovCisJCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKKwl9CisKKwkvKiBTZXQgTEVEICovCisJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PRkYpOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkgeworCQkvKiBNdXN0IHVzaW5nIDQwTUh6LiAqLworCQlBc2ljVHVybk9mZlJGQ2xrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCX0gZWxzZSB7CisJCS8qIE11c3QgdXNpbmcgMjBNSHouICovCisJCUFzaWNUdXJuT2ZmUkZDbGsocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwl9CisKKwkvKiBEaXNhYmxlIFR4L1J4IERNQSAqLworCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsJLyogZGlzYWJsZSBETUEgKi8KKwlHbG9DZmcuZmllbGQuRW5hYmxlVHhETUEgPSAwOworCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IDA7CisJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOwkvKiBhYm9ydCBhbGwgVFggcmluZ3MgKi8KKworCS8qIFdhaXRpbmcgZm9yIERNQSBpZGxlICovCisJaSA9IDA7CisJZG8geworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7CisJCWlmICgoR2xvQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKQorCQkgICAgJiYgKEdsb0NmZy5maWVsZC5SeERNQUJ1c3kgPT0gMCkpCisJCQlicmVhazsKKworCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCX0gd2hpbGUgKGkrKyA8IDEwMCk7CisKKwkvKiBEaXNhYmxlIE1BQyBUeC9SeCAqLworCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCVZhbHVlICY9ICgweGZmZmZmZmYzKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCXsKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMwLCAweGZmLCAweGZmLCAweDAyKTsKKwl9Cit9CisKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9zYW5pdHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9zYW5pdHkuYwppbmRleCA4NTg1NWY3Zi4uNmIwMDNjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3Nhbml0eS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9zYW5pdHkuYwpAQCAtMzYsMTcgKzM2LDE2IEBACiAqLwogI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgogCitleHRlcm4gdTggQ0lTQ09fT1VJW107CiAKLWV4dGVybiBVQ0hBUglDSVNDT19PVUlbXTsKLQotZXh0ZXJuIFVDSEFSCVdQQV9PVUlbXTsKLWV4dGVybiBVQ0hBUglSU05fT1VJW107Ci1leHRlcm4gVUNIQVIJV01FX0lORk9fRUxFTVtdOwotZXh0ZXJuIFVDSEFSCVdNRV9QQVJNX0VMRU1bXTsKLWV4dGVybiBVQ0hBUglDY3gyUW9zSW5mb1tdOwotZXh0ZXJuIFVDSEFSCVJBTElOS19PVUlbXTsKLWV4dGVybiBVQ0hBUglCUk9BRENPTV9PVUlbXTsKLWV4dGVybiBVQ0hBUiAgICBXUFNfT1VJW107CitleHRlcm4gdTggV1BBX09VSVtdOworZXh0ZXJuIHU4IFJTTl9PVUlbXTsKK2V4dGVybiB1OCBXTUVfSU5GT19FTEVNW107CitleHRlcm4gdTggV01FX1BBUk1fRUxFTVtdOworZXh0ZXJuIHU4IENjeDJRb3NJbmZvW107CitleHRlcm4gdTggUkFMSU5LX09VSVtdOworZXh0ZXJuIHU4IEJST0FEQ09NX09VSVtdOworZXh0ZXJuIHU4IFdQU19PVUlbXTsKIAogLyoKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNTksMTczICs1OCwxNzIgQEAKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLUJPT0xFQU4gTWxtZUFkZEJBUmVxU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0gICAgT1VUIFBVQ0hBUiBwQWRkcjIpCitCT09MRUFOIE1sbWVBZGRCQVJlcVNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB2b2lkICogTXNnLCB1bnNpZ25lZCBsb25nIE1zZ0xlbiwgdTggKnBBZGRyMikKIHsKLSAgICBQTUxNRV9BRERCQV9SRVFfU1RSVUNUICAgcEluZm87CisJc3RydWN0IHJ0X21sbWVfYWRkYmFfcmVxICpwSW5mbzsKIAotICAgIHBJbmZvID0gKE1MTUVfQUREQkFfUkVRX1NUUlVDVCAqKU1zZzsKKwlwSW5mbyA9IChzdHJ1Y3QgcnRfbWxtZV9hZGRiYV9yZXEgKilNc2c7CiAKLSAgICBpZiAoKE1zZ0xlbiAhPSBzaXplb2YoTUxNRV9BRERCQV9SRVFfU1RSVUNUKSkpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lQWRkQkFSZXFTYW5pdHkgZmFpbCAtIG1lc3NhZ2UgbGVuZ2h0IG5vdCBjb3JyZWN0LlxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgaWYgKChwSW5mby0+V2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lQWRkQkFSZXFTYW5pdHkgZmFpbCAtIFRoZSBwZWVyIE1hYyBpcyBub3QgYXNzb2NpYXRlZCB5ZXQuXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpZiAoKHBJbmZvLT5wQWRkclswXSYweDAxKSA9PSAweDAxKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZUFkZEJBUmVxU2FuaXR5IGZhaWwgLSBicm9hZGNhc3QgYWRkcmVzcyBub3Qgc3VwcG9ydCBCQVxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjawotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIE1sbWVEZWxCQVJlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuKQotewotCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAqcEluZm87Ci0JcEluZm8gPSAoTUxNRV9ERUxCQV9SRVFfU1RSVUNUICopTXNnOwotCi0gICAgaWYgKChNc2dMZW4gIT0gc2l6ZW9mKE1MTUVfREVMQkFfUkVRX1NUUlVDVCkpKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTWxtZURlbEJBUmVxU2FuaXR5IGZhaWwgLSBtZXNzYWdlIGxlbmdodCBub3QgY29ycmVjdC5cbiIpKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIGlmICgocEluZm8tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTWxtZURlbEJBUmVxU2FuaXR5IGZhaWwgLSBUaGUgcGVlciBNYWMgaXMgbm90IGFzc29jaWF0ZWQgeWV0LlxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgaWYgKChwSW5mby0+VElEICYgMHhmMCkpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNbG1lRGVsQkFSZXFTYW5pdHkgZmFpbCAtIFRoZSBwZWVyIFRJRCBpcyBpbmNvcnJlY3QuXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLQlpZiAoTmRpc0VxdWFsTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIsIHBJbmZvLT5BZGRyLCBNQUNfQUREUl9MRU4pID09IDApCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNbG1lRGVsQkFSZXFTYW5pdHkgZmFpbCAtIHRoZSBwZWVyIGFkZHIgZG9zZW4ndCBleGlzdC5cbiIpKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi1CT09MRUFOIFBlZXJBZGRCQVJlcUFjdGlvblNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpwTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLQlPVVQgUFVDSEFSIHBBZGRyMikKLXsKLQlQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKXBNc2c7Ci0JUEZSQU1FX0FEREJBX1JFUSBwQWRkRnJhbWU7Ci0JcEFkZEZyYW1lID0gKFBGUkFNRV9BRERCQV9SRVEpKHBNc2cpOwotCWlmIChNc2dMZW4gPCAoc2l6ZW9mKEZSQU1FX0FEREJBX1JFUSkpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pKTsKKwlpZiAoKE1zZ0xlbiAhPSBzaXplb2Yoc3RydWN0IHJ0X21sbWVfYWRkYmFfcmVxKSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJNbG1lQWRkQkFSZXFTYW5pdHkgZmFpbCAtIG1lc3NhZ2UgbGVuZ2h0IG5vdCBjb3JyZWN0LlxuIikpOwogCQlyZXR1cm4gRkFMU0U7CiAJfQotCS8vIHdlIHN1cHBvcnQgaW1tZWRpYXRlIEJBLgotCSooVVNIT1JUICopKCZwQWRkRnJhbWUtPkJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEFkZEZyYW1lLT5CYVBhcm0pKTsKKworCWlmICgocEluZm8tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiTWxtZUFkZEJBUmVxU2FuaXR5IGZhaWwgLSBUaGUgcGVlciBNYWMgaXMgbm90IGFzc29jaWF0ZWQgeWV0LlxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKChwSW5mby0+cEFkZHJbMF0gJiAweDAxKSA9PSAweDAxKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiTWxtZUFkZEJBUmVxU2FuaXR5IGZhaWwgLSBicm9hZGNhc3QgYWRkcmVzcyBub3Qgc3VwcG9ydCBCQVxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1sbWVEZWxCQVJlcVNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHZvaWQgKiBNc2csIHVuc2lnbmVkIGxvbmcgTXNnTGVuKQoreworCXN0cnVjdCBydF9tbG1lX2RlbGJhX3JlcSAqcEluZm87CisJcEluZm8gPSAoc3RydWN0IHJ0X21sbWVfZGVsYmFfcmVxICopTXNnOworCisJaWYgKChNc2dMZW4gIT0gc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2RlbGJhX3JlcSkpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiTWxtZURlbEJBUmVxU2FuaXR5IGZhaWwgLSBtZXNzYWdlIGxlbmdodCBub3QgY29ycmVjdC5cbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmICgocEluZm8tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiTWxtZURlbEJBUmVxU2FuaXR5IGZhaWwgLSBUaGUgcGVlciBNYWMgaXMgbm90IGFzc29jaWF0ZWQgeWV0LlxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKChwSW5mby0+VElEICYgMHhmMCkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJNbG1lRGVsQkFSZXFTYW5pdHkgZmFpbCAtIFRoZSBwZWVyIFRJRCBpcyBpbmNvcnJlY3QuXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoTmRpc0VxdWFsTWVtb3J5CisJICAgIChwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5BZGRyLCBwSW5mby0+QWRkciwKKwkgICAgIE1BQ19BRERSX0xFTikgPT0gMCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIk1sbWVEZWxCQVJlcVNhbml0eSBmYWlsIC0gdGhlIHBlZXIgYWRkciBkb3Nlbid0IGV4aXN0LlxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKK0JPT0xFQU4gUGVlckFkZEJBUmVxQWN0aW9uU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgdm9pZCAqIHBNc2csCisJCQkJIHVuc2lnbmVkIGxvbmcgTXNnTGVuLCB1OCAqcEFkZHIyKQoreworCXN0cnVjdCBydF9mcmFtZV84MDJfMTEgKiBwRnJhbWUgPSAoc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqKSBwTXNnOworCXN0cnVjdCBydF9mcmFtZV9hZGRiYV9yZXEgKiBwQWRkRnJhbWU7CisJcEFkZEZyYW1lID0gKHN0cnVjdCBydF9mcmFtZV9hZGRiYV9yZXEgKikgKHBNc2cpOworCWlmIChNc2dMZW4gPCAoc2l6ZW9mKHN0cnVjdCBydF9mcmFtZV9hZGRiYV9yZXEpKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVxdWVzdCBmcmFtZSBsZW5ndGggc2l6ZSA9ICVsZCBpbmNvcnJlY3RcbiIsCisJCQkgIE1zZ0xlbikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8qIHdlIHN1cHBvcnQgaW1tZWRpYXRlIEJBLiAqLworCSoodTE2ICopICgmcEFkZEZyYW1lLT5CYVBhcm0pID0KKwkgICAgY3B1MmxlMTYoKih1MTYgKikgKCZwQWRkRnJhbWUtPkJhUGFybSkpOwogCXBBZGRGcmFtZS0+VGltZU91dFZhbHVlID0gY3B1MmxlMTYocEFkZEZyYW1lLT5UaW1lT3V0VmFsdWUpOwogCXBBZGRGcmFtZS0+QmFTdGFydFNlcS53b3JkID0gY3B1MmxlMTYocEFkZEZyYW1lLT5CYVN0YXJ0U2VxLndvcmQpOwogCi0JaWYgKHBBZGRGcmFtZS0+QmFQYXJtLkJBUG9saWN5ICE9IElNTUVEX0JBKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlcXVlc3QgQmEgUG9saWN5WyVkXSBub3Qgc3VwcG9ydFxuIiwgcEFkZEZyYW1lLT5CYVBhcm0uQkFQb2xpY3kpKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJBRERCQSBSZXF1ZXN0LiB0aWQ9JXgsIEJ1ZnNpemU9JXgsIEFNU0RVU3VwcG9ydGVkPSV4IFxuIiwgcEFkZEZyYW1lLT5CYVBhcm0uVElELCBwQWRkRnJhbWUtPkJhUGFybS5CdWZTaXplLCBwQWRkRnJhbWUtPkJhUGFybS5BTVNEVVN1cHBvcnRlZCkpOworCWlmIChwQWRkRnJhbWUtPkJhUGFybS5CQVBvbGljeSAhPSBJTU1FRF9CQSkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVxdWVzdCBCYSBQb2xpY3lbJWRdIG5vdCBzdXBwb3J0XG4iLAorCQkJICBwQWRkRnJhbWUtPkJhUGFybS5CQVBvbGljeSkpOworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIkFEREJBIFJlcXVlc3QuIHRpZD0leCwgQnVmc2l6ZT0leCwgQU1TRFVTdXBwb3J0ZWQ9JXggXG4iLAorCQkJICBwQWRkRnJhbWUtPkJhUGFybS5USUQsIHBBZGRGcmFtZS0+QmFQYXJtLkJ1ZlNpemUsCisJCQkgIHBBZGRGcmFtZS0+QmFQYXJtLkFNU0RVU3VwcG9ydGVkKSk7CiAJCXJldHVybiBGQUxTRTsKIAl9Ci0KLQkvLyB3ZSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4KLQlpZiAocEFkZEZyYW1lLT5CYVBhcm0uVElEICYweGZmZjApCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVxdWVzdCBpbmNvcnJlY3QgVElEID0gJWRcbiIsIHBBZGRGcmFtZS0+QmFQYXJtLlRJRCkpOworCS8qIHdlIHN1cHBvcnQgaW1tZWRpYXRlIEJBLiAqLworCWlmIChwQWRkRnJhbWUtPkJhUGFybS5USUQgJiAweGZmZjApIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlcXVlc3QgaW5jb3JyZWN0IFRJRCA9ICVkXG4iLAorCQkJICBwQWRkRnJhbWUtPkJhUGFybS5USUQpKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIAlDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOwogCXJldHVybiBUUlVFOwogfQogCi1CT09MRUFOIFBlZXJBZGRCQVJzcEFjdGlvblNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpwTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbikKK0JPT0xFQU4gUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgdm9pZCAqIHBNc2csIHVuc2lnbmVkIGxvbmcgTXNnTGVuKQogewotCVBGUkFNRV9BRERCQV9SU1AgcEFkZEZyYW1lOworCXN0cnVjdCBydF9mcmFtZV9hZGRiYV9yc3AgKiBwQWRkRnJhbWU7CiAKLQlwQWRkRnJhbWUgPSAoUEZSQU1FX0FEREJBX1JTUCkocE1zZyk7Ci0JaWYgKE1zZ0xlbiA8IChzaXplb2YoRlJBTUVfQUREQkFfUlNQKSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJzcEFjdGlvblNhbml0eTogQUREQkEgUmVzcG9uc2UgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pKTsKKwlwQWRkRnJhbWUgPSAoc3RydWN0IHJ0X2ZyYW1lX2FkZGJhX3JzcCAqKSAocE1zZyk7CisJaWYgKE1zZ0xlbiA8IChzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2FkZGJhX3JzcCkpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5OiBBRERCQSBSZXNwb25zZSBmcmFtZSBsZW5ndGggc2l6ZSA9ICVsZCBpbmNvcnJlY3RcbiIsCisJCQkgIE1zZ0xlbikpOwogCQlyZXR1cm4gRkFMU0U7CiAJfQotCS8vIHdlIHN1cHBvcnQgaW1tZWRpYXRlIEJBLgotCSooVVNIT1JUICopKCZwQWRkRnJhbWUtPkJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEFkZEZyYW1lLT5CYVBhcm0pKTsKKwkvKiB3ZSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4gKi8KKwkqKHUxNiAqKSAoJnBBZGRGcmFtZS0+QmFQYXJtKSA9CisJICAgIGNwdTJsZTE2KCoodTE2ICopICgmcEFkZEZyYW1lLT5CYVBhcm0pKTsKIAlwQWRkRnJhbWUtPlN0YXR1c0NvZGUgPSBjcHUybGUxNihwQWRkRnJhbWUtPlN0YXR1c0NvZGUpOwogCXBBZGRGcmFtZS0+VGltZU91dFZhbHVlID0gY3B1MmxlMTYocEFkZEZyYW1lLT5UaW1lT3V0VmFsdWUpOwogCi0JaWYgKHBBZGRGcmFtZS0+QmFQYXJtLkJBUG9saWN5ICE9IElNTUVEX0JBKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlc3BvbnNlIEJhIFBvbGljeVslZF0gbm90IHN1cHBvcnRcbiIsIHBBZGRGcmFtZS0+QmFQYXJtLkJBUG9saWN5KSk7CisJaWYgKHBBZGRGcmFtZS0+QmFQYXJtLkJBUG9saWN5ICE9IElNTUVEX0JBKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiUGVlckFkZEJBUmVxQWN0aW9uU2FuaXR5OiBBRERCQSBSZXNwb25zZSBCYSBQb2xpY3lbJWRdIG5vdCBzdXBwb3J0XG4iLAorCQkJICBwQWRkRnJhbWUtPkJhUGFybS5CQVBvbGljeSkpOwogCQlyZXR1cm4gRkFMU0U7CiAJfQotCi0JLy8gd2Ugc3VwcG9ydCBpbW1lZGlhdGUgQkEuCi0JaWYgKHBBZGRGcmFtZS0+QmFQYXJtLlRJRCAmMHhmZmYwKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSc3BBY3Rpb25TYW5pdHk6IEFEREJBIFJlc3BvbnNlIGluY29ycmVjdCBUSUQgPSAlZFxuIiwgcEFkZEZyYW1lLT5CYVBhcm0uVElEKSk7CisJLyogd2Ugc3VwcG9ydCBpbW1lZGlhdGUgQkEuICovCisJaWYgKHBBZGRGcmFtZS0+QmFQYXJtLlRJRCAmIDB4ZmZmMCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIlBlZXJBZGRCQVJzcEFjdGlvblNhbml0eTogQUREQkEgUmVzcG9uc2UgaW5jb3JyZWN0IFRJRCA9ICVkXG4iLAorCQkJICBwQWRkRnJhbWUtPkJhUGFybS5USUQpKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIAlyZXR1cm4gVFJVRTsKIAogfQogCi1CT09MRUFOIFBlZXJEZWxCQUFjdGlvblNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBVQ0hBUiBXY2lkLAotICAgIElOIFZPSUQgKnBNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuICkKK0JPT0xFQU4gUGVlckRlbEJBQWN0aW9uU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgIHU4IFdjaWQsIHZvaWQgKiBwTXNnLCB1bnNpZ25lZCBsb25nIE1zZ0xlbikKIHsKLQkvL1BGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKLQlQRlJBTUVfREVMQkFfUkVRICBwRGVsRnJhbWU7Ci0JaWYgKE1zZ0xlbiAhPSAoc2l6ZW9mKEZSQU1FX0RFTEJBX1JFUSkpKQorCS8qc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqIHBGcmFtZSA9IChzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICopcE1zZzsgKi8KKwlzdHJ1Y3QgcnRfZnJhbWVfZGVsYmFfcmVxICogcERlbEZyYW1lOworCWlmIChNc2dMZW4gIT0gKHNpemVvZihzdHJ1Y3QgcnRfZnJhbWVfZGVsYmFfcmVxKSkpCiAJCXJldHVybiBGQUxTRTsKIAogCWlmIChXY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQogCQlyZXR1cm4gRkFMU0U7CiAKLQlwRGVsRnJhbWUgPSAoUEZSQU1FX0RFTEJBX1JFUSkocE1zZyk7CisJcERlbEZyYW1lID0gKHN0cnVjdCBydF9mcmFtZV9kZWxiYV9yZXEgKikgKHBNc2cpOwogCi0JKihVU0hPUlQgKikoJnBEZWxGcmFtZS0+RGVsYmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwRGVsRnJhbWUtPkRlbGJhUGFybSkpOworCSoodTE2ICopICgmcERlbEZyYW1lLT5EZWxiYVBhcm0pID0KKwkgICAgY3B1MmxlMTYoKih1MTYgKikgKCZwRGVsRnJhbWUtPkRlbGJhUGFybSkpOwogCXBEZWxGcmFtZS0+UmVhc29uQ29kZSA9IGNwdTJsZTE2KHBEZWxGcmFtZS0+UmVhc29uQ29kZSk7CiAKLQlpZiAocERlbEZyYW1lLT5EZWxiYVBhcm0uVElEICYweGZmZjApCisJaWYgKHBEZWxGcmFtZS0+RGVsYmFQYXJtLlRJRCAmIDB4ZmZmMCkKIAkJcmV0dXJuIEZBTFNFOwogCiAJcmV0dXJuIFRSVUU7CkBAIC0yNDIsNDcyICsyNDAsNDY5IEBACiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1CT09MRUFOIFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIElOIFVDSEFSICBNc2dDaGFubmVsLAotICAgIE9VVCBQVUNIQVIgcEFkZHIyLAotICAgIE9VVCBQVUNIQVIgcEJzc2lkLAotICAgIE9VVCBDSEFSIFNzaWRbXSwKLSAgICBPVVQgVUNIQVIgKnBTc2lkTGVuLAotICAgIE9VVCBVQ0hBUiAqcEJzc1R5cGUsCi0gICAgT1VUIFVTSE9SVCAqcEJlYWNvblBlcmlvZCwKLSAgICBPVVQgVUNIQVIgKnBDaGFubmVsLAotICAgIE9VVCBVQ0hBUiAqcE5ld0NoYW5uZWwsCi0gICAgT1VUIExBUkdFX0lOVEVHRVIgKnBUaW1lc3RhbXAsCi0gICAgT1VUIENGX1BBUk0gKnBDZlBhcm0sCi0gICAgT1VUIFVTSE9SVCAqcEF0aW1XaW4sCi0gICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAotICAgIE9VVCBVQ0hBUiAqcEVycCwKLSAgICBPVVQgVUNIQVIgKnBEdGltQ291bnQsCi0gICAgT1VUIFVDSEFSICpwRHRpbVBlcmlvZCwKLSAgICBPVVQgVUNIQVIgKnBCY2FzdEZsYWcsCi0gICAgT1VUIFVDSEFSICpwTWVzc2FnZVRvTWUsCi0gICAgT1VUIFVDSEFSIFN1cFJhdGVbXSwKLSAgICBPVVQgVUNIQVIgKnBTdXBSYXRlTGVuLAotICAgIE9VVCBVQ0hBUiBFeHRSYXRlW10sCi0gICAgT1VUIFVDSEFSICpwRXh0UmF0ZUxlbiwKLSAgICBPVVQJVUNIQVIgKnBDa2lwRmxhZywKLSAgICBPVVQJVUNIQVIgKnBBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCi0gICAgT1VUIFBFRENBX1BBUk0gICAgICAgcEVkY2FQYXJtLAotICAgIE9VVCBQUUJTU19MT0FEX1BBUk0gIHBRYnNzTG9hZCwKLSAgICBPVVQgUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCi0gICAgT1VUIFVMT05HICpwUmFsaW5rSWUsCi0gICAgT1VUIFVDSEFSCQkgKnBIdENhcGFiaWxpdHlMZW4sCi0gICAgT1VUIFVDSEFSCQkgKnBQcmVOSHRDYXBhYmlsaXR5TGVuLAotICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAotCU9VVCBVQ0hBUgkJICpBZGRIdEluZm9MZW4sCi0JT1VUIEFERF9IVF9JTkZPX0lFICpBZGRIdEluZm8sCi0JT1VUIFVDSEFSICpOZXdFeHRDaGFubmVsT2Zmc2V0LAkJLy8gSHQgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0KGFib3ZlIG9yIGJlbG93KQotICAgIE9VVCBVU0hPUlQgKkxlbmd0aFZJRSwKLSAgICBPVVQJUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKQorQk9PTEVBTiBQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB2b2lkICogTXNnLCB1bnNpZ25lZCBsb25nIE1zZ0xlbiwgdTggTXNnQ2hhbm5lbCwgdTggKnBBZGRyMiwgdTggKnBCc3NpZCwgY2hhciBTc2lkW10sIHU4ICogcFNzaWRMZW4sIHU4ICogcEJzc1R5cGUsIHUxNiAqIHBCZWFjb25QZXJpb2QsIHU4ICogcENoYW5uZWwsIHU4ICogcE5ld0NoYW5uZWwsIE9VVCBMQVJHRV9JTlRFR0VSICogcFRpbWVzdGFtcCwgc3RydWN0IHJ0X2NmX3Bhcm0gKiBwQ2ZQYXJtLCB1MTYgKiBwQXRpbVdpbiwgdTE2ICogcENhcGFiaWxpdHlJbmZvLCB1OCAqIHBFcnAsIHU4ICogcER0aW1Db3VudCwgdTggKiBwRHRpbVBlcmlvZCwgdTggKiBwQmNhc3RGbGFnLCB1OCAqIHBNZXNzYWdlVG9NZSwgdTggU3VwUmF0ZVtdLCB1OCAqIHBTdXBSYXRlTGVuLCB1OCBFeHRSYXRlW10sIHU4ICogcEV4dFJhdGVMZW4sIHU4ICogcENraXBGbGFnLCB1OCAqIHBBaXJvbmV0Q2VsbFBvd2VyTGltaXQsIHN0cnVjdCBydF9lZGNhX3Bhcm0gKnBFZGNhUGFybSwgc3RydWN0IHJ0X3Fic3NfbG9hZF9wYXJtICpwUWJzc0xvYWQsIHN0cnVjdCBydF9xb3NfY2FwYWJpbGl0eV9wYXJtICpwUW9zQ2FwYWJpbGl0eSwgdW5zaWduZWQgbG9uZyAqIHBSYWxpbmtJZSwgdTggKiBwSHRDYXBhYmlsaXR5TGVuLCB1OCAqIHBQcmVOSHRDYXBhYmlsaXR5TGVuLCBzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSAqIHBIdENhcGFiaWxpdHksIHU4ICogQWRkSHRJbmZvTGVuLCBzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUgKiBBZGRIdEluZm8sIHU4ICogTmV3RXh0Q2hhbm5lbE9mZnNldCwJLyogSHQgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0KGFib3ZlIG9yIGJlbG93KSAqLworCQkJCSAgICB1MTYgKiBMZW5ndGhWSUUsCisJCQkJICAgIHN0cnVjdCBydF9uZGlzXzgwMl8xMV92YXJpYWJsZV9pZXMgKnBWSUUpCiB7Ci0gICAgQ0hBUgkJCQkqUHRyOwotCUNIQVIgCQkJCVRpbUxlbjsKLSAgICBQRlJBTUVfODAyXzExCQlwRnJhbWU7Ci0gICAgUEVJRF9TVFJVQ1QgICAgICAgICBwRWlkOwotICAgIFVDSEFSCQkJCVN1YlR5cGU7Ci0gICAgVUNIQVIJCQkJU2FuaXR5OwotICAgIC8vVUNIQVIJCQkJRUNXTWluLCBFQ1dNYXg7Ci0gICAgLy9NQUNfQ1NSOV9TVFJVQwkJQ3NyOTsKLSAgICBVTE9ORwkJCQlMZW5ndGggPSAwOworCXU4ICpQdHI7CisJdTggVGltTGVuOworCXN0cnVjdCBydF9mcmFtZV84MDJfMTEgKiBwRnJhbWU7CisJc3RydWN0IHJ0X2VpZCAqIHBFaWQ7CisJdTggU3ViVHlwZTsKKwl1OCBTYW5pdHk7CisJLyp1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUNXTWluLCBFQ1dNYXg7ICovCisJLypNQUNfQ1NSOV9TVFJVQyAgICAgICAgICAgIENzcjk7ICovCisJdW5zaWduZWQgbG9uZyBMZW5ndGggPSAwOwogCi0JLy8gRm9yIHNvbWUgMTFhIEFQIHdoaWNoIGRpZG4ndCBoYXZlIERTX0lFLCB3ZSB1c2UgdHdvIGNvbmRpdGlvbnMgdG8gZGVjaWRlIHRoZSBjaGFubmVsCi0JLy8JMS4gSWYgdGhlIEFQIGlzIDExbiBlbmFibGVkLCB0aGVuIGNoZWNrIHRoZSBjb250cm9sIGNoYW5uZWwuCi0JLy8JMi4gSWYgdGhlIEFQIGRpZG4ndCBoYXZlIGFueSBpbmZvIGFib3V0IGNoYW5uZWwsIHVzZSB0aGUgY2hhbm5lbCB3ZSByZWNlaXZlZCB0aGlzIGZyYW1lIGFzIHRoZSBjaGFubmVsLiAoTWF5IGluYWNjdXJhY3khISkKLQlVQ0hBUgkJCUN0cmxDaGFubmVsID0gMDsKKwkvKiBGb3Igc29tZSAxMWEgQVAgd2hpY2ggZGlkbid0IGhhdmUgRFNfSUUsIHdlIHVzZSB0d28gY29uZGl0aW9ucyB0byBkZWNpZGUgdGhlIGNoYW5uZWwgKi8KKwkvKiAgICAgIDEuIElmIHRoZSBBUCBpcyAxMW4gZW5hYmxlZCwgdGhlbiBjaGVjayB0aGUgY29udHJvbCBjaGFubmVsLiAqLworCS8qICAgICAgMi4gSWYgdGhlIEFQIGRpZG4ndCBoYXZlIGFueSBpbmZvIGFib3V0IGNoYW5uZWwsIHVzZSB0aGUgY2hhbm5lbCB3ZSByZWNlaXZlZCB0aGlzIGZyYW1lIGFzIHRoZSBjaGFubmVsLiAoTWF5IGluYWNjdXJhY3khKSAqLworCXU4IEN0cmxDaGFubmVsID0gMDsKIAotICAgIC8vIEFkZCBmb3IgMyBuZWNlc3NhcnkgRUlEIGZpZWxkIGNoZWNrCi0gICAgU2FuaXR5ID0gMDsKKwkvKiBBZGQgZm9yIDMgbmVjZXNzYXJ5IEVJRCBmaWVsZCBjaGVjayAqLworCVNhbml0eSA9IDA7CiAKLSAgICAqcEF0aW1XaW4gPSAwOwotICAgICpwRXJwID0gMDsKLSAgICAqcER0aW1Db3VudCA9IDA7Ci0gICAgKnBEdGltUGVyaW9kID0gMDsKLSAgICAqcEJjYXN0RmxhZyA9IDA7Ci0gICAgKnBNZXNzYWdlVG9NZSA9IDA7Ci0gICAgKnBFeHRSYXRlTGVuID0gMDsKLSAgICAqcENraXBGbGFnID0gMDsJCQkgICAgICAgIC8vIERlZmF1bHQgb2YgQ2tpcEZsYWcgaXMgMAotICAgICpwQWlyb25ldENlbGxQb3dlckxpbWl0ID0gMHhGRjsgIC8vIERlZmF1bHQgb2YgQWlyb25ldENlbGxQb3dlckxpbWl0IGlzIDB4RkYKLSAgICAqTGVuZ3RoVklFID0gMDsJCQkJCS8vIFNldCB0aGUgbGVuZ3RoIG9mIFZJRSB0byBpbml0IHZhbHVlIDAKLSAgICAqcEh0Q2FwYWJpbGl0eUxlbiA9IDA7CQkJCQkvLyBTZXQgdGhlIGxlbmd0aCBvZiBWSUUgdG8gaW5pdCB2YWx1ZSAwCisJKnBBdGltV2luID0gMDsKKwkqcEVycCA9IDA7CisJKnBEdGltQ291bnQgPSAwOworCSpwRHRpbVBlcmlvZCA9IDA7CisJKnBCY2FzdEZsYWcgPSAwOworCSpwTWVzc2FnZVRvTWUgPSAwOworCSpwRXh0UmF0ZUxlbiA9IDA7CisJKnBDa2lwRmxhZyA9IDA7CQkvKiBEZWZhdWx0IG9mIENraXBGbGFnIGlzIDAgKi8KKwkqcEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA9IDB4RkY7CS8qIERlZmF1bHQgb2YgQWlyb25ldENlbGxQb3dlckxpbWl0IGlzIDB4RkYgKi8KKwkqTGVuZ3RoVklFID0gMDsJCS8qIFNldCB0aGUgbGVuZ3RoIG9mIFZJRSB0byBpbml0IHZhbHVlIDAgKi8KKwkqcEh0Q2FwYWJpbGl0eUxlbiA9IDA7CS8qIFNldCB0aGUgbGVuZ3RoIG9mIFZJRSB0byBpbml0IHZhbHVlIDAgKi8KIAlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLQkJKnBQcmVOSHRDYXBhYmlsaXR5TGVuID0gMDsJCQkJCS8vIFNldCB0aGUgbGVuZ3RoIG9mIFZJRSB0byBpbml0IHZhbHVlIDAKLSAgICAqQWRkSHRJbmZvTGVuID0gMDsJCQkJCS8vIFNldCB0aGUgbGVuZ3RoIG9mIFZJRSB0byBpbml0IHZhbHVlIDAKLSAgICAqcFJhbGlua0llID0gMDsKLSAgICAqcE5ld0NoYW5uZWwgPSAwOwotICAgICpOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsJLy9EZWZhdWx0IDB4ZmYgbWVhbnMgbm8gc3VjaCBJRQotICAgIHBDZlBhcm0tPmJWYWxpZCA9IEZBTFNFOyAgICAgICAgLy8gZGVmYXVsdDogbm8gSUVfQ0YgZm91bmQKLSAgICBwUWJzc0xvYWQtPmJWYWxpZCA9IEZBTFNFOyAgICAgIC8vIGRlZmF1bHQ6IG5vIElFX1FCU1NfTE9BRCBmb3VuZAotICAgIHBFZGNhUGFybS0+YlZhbGlkID0gRkFMU0U7ICAgICAgLy8gZGVmYXVsdDogbm8gSUVfRURDQV9QQVJBTUVURVIgZm91bmQKLSAgICBwUW9zQ2FwYWJpbGl0eS0+YlZhbGlkID0gRkFMU0U7IC8vIGRlZmF1bHQ6IG5vIElFX1FPU19DQVBBQklMSVRZIGZvdW5kCisJCSpwUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IDA7CS8qIFNldCB0aGUgbGVuZ3RoIG9mIFZJRSB0byBpbml0IHZhbHVlIDAgKi8KKwkqQWRkSHRJbmZvTGVuID0gMDsJLyogU2V0IHRoZSBsZW5ndGggb2YgVklFIHRvIGluaXQgdmFsdWUgMCAqLworCSpwUmFsaW5rSWUgPSAwOworCSpwTmV3Q2hhbm5lbCA9IDA7CisJKk5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOwkvKkRlZmF1bHQgMHhmZiBtZWFucyBubyBzdWNoIElFICovCisJcENmUGFybS0+YlZhbGlkID0gRkFMU0U7CS8qIGRlZmF1bHQ6IG5vIElFX0NGIGZvdW5kICovCisJcFFic3NMb2FkLT5iVmFsaWQgPSBGQUxTRTsJLyogZGVmYXVsdDogbm8gSUVfUUJTU19MT0FEIGZvdW5kICovCisJcEVkY2FQYXJtLT5iVmFsaWQgPSBGQUxTRTsJLyogZGVmYXVsdDogbm8gSUVfRURDQV9QQVJBTUVURVIgZm91bmQgKi8KKwlwUW9zQ2FwYWJpbGl0eS0+YlZhbGlkID0gRkFMU0U7CS8qIGRlZmF1bHQ6IG5vIElFX1FPU19DQVBBQklMSVRZIGZvdW5kICovCiAKLSAgICBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisJcEZyYW1lID0gKHN0cnVjdCBydF9mcmFtZV84MDJfMTEgKikgTXNnOwogCi0gICAgLy8gZ2V0IHN1YnR5cGUgZnJvbSBoZWFkZXIKLSAgICBTdWJUeXBlID0gKFVDSEFSKXBGcmFtZS0+SGRyLkZDLlN1YlR5cGU7CisJLyogZ2V0IHN1YnR5cGUgZnJvbSBoZWFkZXIgKi8KKwlTdWJUeXBlID0gKHU4KXBGcmFtZS0+SGRyLkZDLlN1YlR5cGU7CiAKLSAgICAvLyBnZXQgQWRkcjIgYW5kIEJTU0lEIGZyb20gaGVhZGVyCi0gICAgQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKLSAgICBDT1BZX01BQ19BRERSKHBCc3NpZCwgcEZyYW1lLT5IZHIuQWRkcjMpOworCS8qIGdldCBBZGRyMiBhbmQgQlNTSUQgZnJvbSBoZWFkZXIgKi8KKwlDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOworCUNPUFlfTUFDX0FERFIocEJzc2lkLCBwRnJhbWUtPkhkci5BZGRyMyk7CiAKLSAgICBQdHIgPSBwRnJhbWUtPk9jdGV0OwotICAgIExlbmd0aCArPSBMRU5HVEhfODAyXzExOworCVB0ciA9IHBGcmFtZS0+T2N0ZXQ7CisJTGVuZ3RoICs9IExFTkdUSF84MDJfMTE7CiAKLSAgICAvLyBnZXQgdGltZXN0YW1wIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIE5kaXNNb3ZlTWVtb3J5KHBUaW1lc3RhbXAsIFB0ciwgVElNRVNUQU1QX0xFTik7CisJLyogZ2V0IHRpbWVzdGFtcCBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIgKi8KKwlOZGlzTW92ZU1lbW9yeShwVGltZXN0YW1wLCBQdHIsIFRJTUVTVEFNUF9MRU4pOwogCiAJcFRpbWVzdGFtcC0+dS5Mb3dQYXJ0ID0gY3B1MmxlMzIocFRpbWVzdGFtcC0+dS5Mb3dQYXJ0KTsKIAlwVGltZXN0YW1wLT51LkhpZ2hQYXJ0ID0gY3B1MmxlMzIocFRpbWVzdGFtcC0+dS5IaWdoUGFydCk7CiAKLSAgICBQdHIgKz0gVElNRVNUQU1QX0xFTjsKLSAgICBMZW5ndGggKz0gVElNRVNUQU1QX0xFTjsKKwlQdHIgKz0gVElNRVNUQU1QX0xFTjsKKwlMZW5ndGggKz0gVElNRVNUQU1QX0xFTjsKIAotICAgIC8vIGdldCBiZWFjb24gaW50ZXJ2YWwgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgTmRpc01vdmVNZW1vcnkocEJlYWNvblBlcmlvZCwgUHRyLCAyKTsKLSAgICBQdHIgKz0gMjsKLSAgICBMZW5ndGggKz0gMjsKKwkvKiBnZXQgYmVhY29uIGludGVydmFsIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlciAqLworCU5kaXNNb3ZlTWVtb3J5KHBCZWFjb25QZXJpb2QsIFB0ciwgMik7CisJUHRyICs9IDI7CisJTGVuZ3RoICs9IDI7CiAKLSAgICAvLyBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIE5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgUHRyLCAyKTsKLSAgICBQdHIgKz0gMjsKLSAgICBMZW5ndGggKz0gMjsKKwkvKiBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlciAqLworCU5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgUHRyLCAyKTsKKwlQdHIgKz0gMjsKKwlMZW5ndGggKz0gMjsKIAotICAgIGlmIChDQVBfSVNfRVNTX09OKCpwQ2FwYWJpbGl0eUluZm8pKQotICAgICAgICAqcEJzc1R5cGUgPSBCU1NfSU5GUkE7Ci0gICAgZWxzZQotICAgICAgICAqcEJzc1R5cGUgPSBCU1NfQURIT0M7CisJaWYgKENBUF9JU19FU1NfT04oKnBDYXBhYmlsaXR5SW5mbykpCisJCSpwQnNzVHlwZSA9IEJTU19JTkZSQTsKKwllbHNlCisJCSpwQnNzVHlwZSA9IEJTU19BREhPQzsKIAotICAgIHBFaWQgPSAoUEVJRF9TVFJVQ1QpIFB0cjsKKwlwRWlkID0gKHN0cnVjdCBydF9laWQgKikgUHRyOwogCi0gICAgLy8gZ2V0IHZhcmlhYmxlIGZpZWxkcyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKLSAgICB3aGlsZSAoKExlbmd0aCArIDIgKyBwRWlkLT5MZW4pIDw9IE1zZ0xlbikKLSAgICB7Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIFNlY3VyZSBjb3B5IFZJRSB0byBWYXJJRVtNQVhfVklFX0xFTl0gZGlkbid0IG92ZXJmbG93LgotICAgICAgICAvLwotICAgICAgICBpZiAoKCpMZW5ndGhWSUUgKyBwRWlkLT5MZW4gKyAyKSA+PSBNQVhfVklFX0xFTikKLSAgICAgICAgewotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSBWYXJpYWJsZSBJRXMgb3V0IG9mIHJlc291cmNlIFtsZW4oPSVkKSA+IE1BWF9WSUVfTEVOKD0lZCldXG4iLAotICAgICAgICAgICAgICAgICAgICAoKkxlbmd0aFZJRSArIHBFaWQtPkxlbiArIDIpLCBNQVhfVklFX0xFTikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKwkvKiBnZXQgdmFyaWFibGUgZmllbGRzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlciAqLworCXdoaWxlICgoTGVuZ3RoICsgMiArIHBFaWQtPkxlbikgPD0gTXNnTGVuKSB7CisJCS8qICovCisJCS8qIFNlY3VyZSBjb3B5IFZJRSB0byBWYXJJRVtNQVhfVklFX0xFTl0gZGlkbid0IG92ZXJmbG93LiAqLworCQkvKiAqLworCQlpZiAoKCpMZW5ndGhWSUUgKyBwRWlkLT5MZW4gKyAyKSA+PSBNQVhfVklFX0xFTikgeworCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwKKwkJCQkgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSBWYXJpYWJsZSBJRXMgb3V0IG9mIHJlc291cmNlIFtsZW4oPSVkKSA+IE1BWF9WSUVfTEVOKD0lZCldXG4iLAorCQkJCSAgKCpMZW5ndGhWSUUgKyBwRWlkLT5MZW4gKyAyKSwgTUFYX1ZJRV9MRU4pKTsKKwkJCWJyZWFrOworCQl9CiAKLSAgICAgICAgc3dpdGNoKHBFaWQtPkVpZCkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBJRV9TU0lEOgotICAgICAgICAgICAgICAgIC8vIEFscmVhZHkgaGFzIG9uZSBTU0lEIEVJRCBpbiB0aGlzIGJlYWNvbiwgaWdub3JlIHRoZSBzZWNvbmQgb25lCi0gICAgICAgICAgICAgICAgaWYgKFNhbml0eSAmIDB4MSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgaWYocEVpZC0+TGVuIDw9IE1BWF9MRU5fT0ZfU1NJRCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFNzaWQsIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOwotICAgICAgICAgICAgICAgICAgICAqcFNzaWRMZW4gPSBwRWlkLT5MZW47Ci0gICAgICAgICAgICAgICAgICAgIFNhbml0eSB8PSAweDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX1NTSUQgKGxlbj0lZClcbiIscEVpZC0+TGVuKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJCXN3aXRjaCAocEVpZC0+RWlkKSB7CisJCWNhc2UgSUVfU1NJRDoKKwkJCS8qIEFscmVhZHkgaGFzIG9uZSBTU0lEIEVJRCBpbiB0aGlzIGJlYWNvbiwgaWdub3JlIHRoZSBzZWNvbmQgb25lICovCisJCQlpZiAoU2FuaXR5ICYgMHgxKQorCQkJCWJyZWFrOworCQkJaWYgKHBFaWQtPkxlbiA8PSBNQVhfTEVOX09GX1NTSUQpIHsKKwkJCQlOZGlzTW92ZU1lbW9yeShTc2lkLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKKwkJCQkqcFNzaWRMZW4gPSBwRWlkLT5MZW47CisJCQkJU2FuaXR5IHw9IDB4MTsKKwkJCX0gZWxzZSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX1NTSUQgKGxlbj0lZClcbiIsCisJCQkJCSAgcEVpZC0+TGVuKSk7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJYnJlYWs7CiAKLSAgICAgICAgICAgIGNhc2UgSUVfU1VQUF9SQVRFUzoKLSAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTYW5pdHkgfD0gMHgyOwotICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShTdXBSYXRlLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKLSAgICAgICAgICAgICAgICAgICAgKnBTdXBSYXRlTGVuID0gcEVpZC0+TGVuOworCQljYXNlIElFX1NVUFBfUkFURVM6CisJCQlpZiAocEVpZC0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKSB7CisJCQkJU2FuaXR5IHw9IDB4MjsKKwkJCQlOZGlzTW92ZU1lbW9yeShTdXBSYXRlLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKKwkJCQkqcFN1cFJhdGVMZW4gPSBwRWlkLT5MZW47CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogMjAwNC0wOS0xNCBub3QgYSBnb29kIGRlc2lnbiBoZXJlLCBjYXVzZSBpdCBleGNsdWRlIGV4dHJhIHJhdGVzCi0gICAgICAgICAgICAgICAgICAgIC8vIGZyb20gU2NhblRhYi4gV2Ugc2hvdWxkIHJlcG9ydCBhcyBpcy4gQW5kIGZpbHRlciBvdXQgdW5zdXBwb3J0ZWQKLSAgICAgICAgICAgICAgICAgICAgLy8gcmF0ZXMgaW4gTWxtZUF1eC4KLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgYWdhaW5zdCB0aGUgc3VwcG9ydGVkIHJhdGVzCi0gICAgICAgICAgICAgICAgICAgIC8vIFJUTVBDaGVja1JhdGVzKHBBZCwgU3VwUmF0ZSwgcFN1cFJhdGVMZW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9TVVBQX1JBVEVTIChsZW49JWQpXG4iLHBFaWQtPkxlbikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOworCQkJCS8qIFRPRE86IDIwMDQtMDktMTQgbm90IGEgZ29vZCBkZXNpZ24gaGVyZSwgY2F1c2UgaXQgZXhjbHVkZSBleHRyYSByYXRlcyAqLworCQkJCS8qIGZyb20gU2NhblRhYi4gV2Ugc2hvdWxkIHJlcG9ydCBhcyBpcy4gQW5kIGZpbHRlciBvdXQgdW5zdXBwb3J0ZWQgKi8KKwkJCQkvKiByYXRlcyBpbiBNbG1lQXV4LiAqLworCQkJCS8qIENoZWNrIGFnYWluc3QgdGhlIHN1cHBvcnRlZCByYXRlcyAqLworCQkJCS8qIFJUTVBDaGVja1JhdGVzKHBBZCwgU3VwUmF0ZSwgcFN1cFJhdGVMZW4pOyAqLworCQkJfSBlbHNlIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfU1VQUF9SQVRFUyAobGVuPSVkKVxuIiwKKwkJCQkJICBwRWlkLT5MZW4pKTsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQlicmVhazsKIAotICAgICAgICAgICAgY2FzZSBJRV9IVF9DQVA6Ci0JCQlpZiAocEVpZC0+TGVuID49IFNJWkVfSFRfQ0FQX0lFKSAgLy9Ob3RlOiBhbGxvdyBleHRlbnNpb24uISEKKwkJY2FzZSBJRV9IVF9DQVA6CisJCQlpZiAocEVpZC0+TGVuID49IFNJWkVfSFRfQ0FQX0lFKQkvKk5vdGU6IGFsbG93IGV4dGVuc2lvbiEgKi8KIAkJCXsKLQkJCQlOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LCBwRWlkLT5PY3RldCwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKLQkJCQkqcEh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOwkvLyBObm93IHdlIG9ubHkgc3VwcG9ydCAyNiBieXRlcy4KKwkJCQlOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LCBwRWlkLT5PY3RldCwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSkpOworCQkJCSpwSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7CS8qIE5ub3cgd2Ugb25seSBzdXBwb3J0IDI2IGJ5dGVzLiAqLwogCi0JCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSk7Ci0JCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSk7CisJCQkJKih1MTYgKikgKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pID0KKwkJCQkgICAgY3B1MmxlMTYoKih1MTYgKikKKwkJCQkJICAgICAoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykpOworCQkJCSoodTE2ICopICgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSA9CisJCQkJICAgIGNwdTJsZTE2KCoodTE2ICopCisJCQkJCSAgICAgKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pKTsKIAogCQkJCXsKLQkJCQkJKnBQcmVOSHRDYXBhYmlsaXR5TGVuID0gMDsJLy8gTm5vdyB3ZSBvbmx5IHN1cHBvcnQgMjYgYnl0ZXMuCisJCQkJCSpwUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IDA7CS8qIE5ub3cgd2Ugb25seSBzdXBwb3J0IDI2IGJ5dGVzLiAqLwogCi0JCQkJCVB0ciA9IChQVUNIQVIpIHBWSUU7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOworCQkJCQlQdHIgPSAodTggKilwVklFOworCQkJCQlOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLAorCQkJCQkJICAgICAgICZwRWlkLT5FaWQsCisJCQkJCQkgICAgICAgcEVpZC0+TGVuICsgMik7CiAJCQkJCSpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOwogCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX0hUX0NBUC4gcEVpZC0+TGVuID0gJWRcbiIsIHBFaWQtPkxlbikpOworCQkJfSBlbHNlIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLAorCQkJCQkgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9IVF9DQVAuIHBFaWQtPkxlbiA9ICVkXG4iLAorCQkJCQkgIHBFaWQtPkxlbikpOwogCQkJfQogCi0JCWJyZWFrOwotICAgICAgICAgICAgY2FzZSBJRV9BRERfSFQ6Ci0JCQlpZiAocEVpZC0+TGVuID49IHNpemVvZihBRERfSFRfSU5GT19JRSkpCi0JCQl7Ci0JCQkJLy8gVGhpcyBJRSBhbGxvd3MgZXh0ZW5zaW9uLCBidXQgd2UgY2FuIGlnbm9yZSBleHRyYSBieXRlcyBiZXlvbmQgb3VyIGtub3dsZWRnZSAsIHNvIG9ubHkKLQkJCQkvLyBjb3B5IGZpcnN0IHNpemVvZihBRERfSFRfSU5GT19JRSkKLQkJCQlOZGlzTW92ZU1lbW9yeShBZGRIdEluZm8sIHBFaWQtPk9jdGV0LCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKwkJCWJyZWFrOworCQljYXNlIElFX0FERF9IVDoKKwkJCWlmIChwRWlkLT5MZW4gPj0gc2l6ZW9mKHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSkpIHsKKwkJCQkvKiBUaGlzIElFIGFsbG93cyBleHRlbnNpb24sIGJ1dCB3ZSBjYW4gaWdub3JlIGV4dHJhIGJ5dGVzIGJleW9uZCBvdXIga25vd2xlZGdlICwgc28gb25seSAqLworCQkJCS8qIGNvcHkgZmlyc3Qgc2l6ZW9mKHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSkgKi8KKwkJCQlOZGlzTW92ZU1lbW9yeShBZGRIdEluZm8sIHBFaWQtPk9jdGV0LAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSkpOwogCQkJCSpBZGRIdEluZm9MZW4gPSBTSVpFX0FERF9IVF9JTkZPX0lFOwogCiAJCQkJQ3RybENoYW5uZWwgPSBBZGRIdEluZm8tPkNvbnRyb2xDaGFuOwogCi0JCQkJKihVU0hPUlQgKikoJkFkZEh0SW5mby0+QWRkSHRJbmZvMikgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmQWRkSHRJbmZvLT5BZGRIdEluZm8yKSk7Ci0JCQkJKihVU0hPUlQgKikoJkFkZEh0SW5mby0+QWRkSHRJbmZvMykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmQWRkSHRJbmZvLT5BZGRIdEluZm8zKSk7CisJCQkJKih1MTYgKikgKCZBZGRIdEluZm8tPkFkZEh0SW5mbzIpID0KKwkJCQkgICAgY3B1MmxlMTYoKih1MTYgKikKKwkJCQkJICAgICAoJkFkZEh0SW5mby0+QWRkSHRJbmZvMikpOworCQkJCSoodTE2ICopICgmQWRkSHRJbmZvLT5BZGRIdEluZm8zKSA9CisJCQkJICAgIGNwdTJsZTE2KCoodTE2ICopCisJCQkJCSAgICAgKCZBZGRIdEluZm8tPkFkZEh0SW5mbzMpKTsKIAogCQkJCXsKLQkJCSAgICAgICAgICAgICAgICBQdHIgPSAoUFVDSEFSKSBwVklFOwotCQkJICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOwotCQkJICAgICAgICAgICAgICAgICpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCQlQdHIgPSAodTggKilwVklFOworCQkJCQlOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLAorCQkJCQkJICAgICAgICZwRWlkLT5FaWQsCisJCQkJCQkgICAgICAgcEVpZC0+TGVuICsgMik7CisJCQkJCSpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOwogCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX0FERF9IVC4gXG4iKSk7CisJCQl9IGVsc2UgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sCisJCQkJCSAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX0FERF9IVC4gXG4iKSk7CiAJCQl9CiAKLQkJYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElFX1NFQ09OREFSWV9DSF9PRkZTRVQ6Ci0JCQlpZiAocEVpZC0+TGVuID09IDEpCi0JCQl7CisJCQlicmVhazsKKwkJY2FzZSBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VUOgorCQkJaWYgKHBFaWQtPkxlbiA9PSAxKSB7CiAJCQkJKk5ld0V4dENoYW5uZWxPZmZzZXQgPSBwRWlkLT5PY3RldFswXTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX1NFQ09OREFSWV9DSF9PRkZTRVQuIFxuIikpOworCQkJfSBlbHNlIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLAorCQkJCQkgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VULiBcbiIpKTsKIAkJCX0KIAotCQlicmVhazsKLSAgICAgICAgICAgIGNhc2UgSUVfRkhfUEFSTToKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkoSUVfRkhfUEFSTSkgXG4iKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJCQlicmVhazsKKwkJY2FzZSBJRV9GSF9QQVJNOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5KElFX0ZIX1BBUk0pIFxuIikpOworCQkJYnJlYWs7CiAKLSAgICAgICAgICAgIGNhc2UgSUVfRFNfUEFSTToKLSAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPT0gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICpwQ2hhbm5lbCA9ICpwRWlkLT5PY3RldDsKKwkJY2FzZSBJRV9EU19QQVJNOgorCQkJaWYgKHBFaWQtPkxlbiA9PSAxKSB7CisJCQkJKnBDaGFubmVsID0gKnBFaWQtPk9jdGV0OwogCi0JCQkJCXsKLQkJCQkJCWlmIChDaGFubmVsU2FuaXR5KHBBZCwgKnBDaGFubmVsKSA9PSAwKQotCQkJCQkJeworCQkJCXsKKwkJCQkJaWYgKENoYW5uZWxTYW5pdHkocEFkLCAqcENoYW5uZWwpID09IDApIHsKIAotCQkJCQkJCXJldHVybiBGQUxTRTsKLQkJCQkJCX0KKwkJCQkJCXJldHVybiBGQUxTRTsKIAkJCQkJfQorCQkJCX0KIAotICAgICAgICAgICAgICAgICAgICBTYW5pdHkgfD0gMHg0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9EU19QQVJNIChsZW49JWQpXG4iLHBFaWQtPkxlbikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOworCQkJCVNhbml0eSB8PSAweDQ7CisJCQl9IGVsc2UgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9EU19QQVJNIChsZW49JWQpXG4iLAorCQkJCQkgIHBFaWQtPkxlbikpOworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWJyZWFrOwogCi0gICAgICAgICAgICBjYXNlIElFX0NGX1BBUk06Ci0gICAgICAgICAgICAgICAgaWYocEVpZC0+TGVuID09IDYpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5iVmFsaWQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBDb3VudCA9IHBFaWQtPk9jdGV0WzBdOwotICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBQZXJpb2QgPSBwRWlkLT5PY3RldFsxXTsKLSAgICAgICAgICAgICAgICAgICAgcENmUGFybS0+Q2ZwTWF4RHVyYXRpb24gPSBwRWlkLT5PY3RldFsyXSArIDI1NiAqIHBFaWQtPk9jdGV0WzNdOwotICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBEdXJSZW1haW5pbmcgPSBwRWlkLT5PY3RldFs0XSArIDI1NiAqIHBFaWQtPk9jdGV0WzVdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9DRl9QQVJNXG4iKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgSUVfQ0ZfUEFSTToKKwkJCWlmIChwRWlkLT5MZW4gPT0gNikgeworCQkJCXBDZlBhcm0tPmJWYWxpZCA9IFRSVUU7CisJCQkJcENmUGFybS0+Q2ZwQ291bnQgPSBwRWlkLT5PY3RldFswXTsKKwkJCQlwQ2ZQYXJtLT5DZnBQZXJpb2QgPSBwRWlkLT5PY3RldFsxXTsKKwkJCQlwQ2ZQYXJtLT5DZnBNYXhEdXJhdGlvbiA9CisJCQkJICAgIHBFaWQtPk9jdGV0WzJdICsgMjU2ICogcEVpZC0+T2N0ZXRbM107CisJCQkJcENmUGFybS0+Q2ZwRHVyUmVtYWluaW5nID0KKwkJCQkgICAgcEVpZC0+T2N0ZXRbNF0gKyAyNTYgKiBwRWlkLT5PY3RldFs1XTsKKwkJCX0gZWxzZSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX0NGX1BBUk1cbiIpKTsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQlicmVhazsKIAotICAgICAgICAgICAgY2FzZSBJRV9JQlNTX1BBUk06Ci0gICAgICAgICAgICAgICAgaWYocEVpZC0+TGVuID09IDIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQXRpbVdpbiwgcEVpZC0+T2N0ZXQsIHBFaWQtPkxlbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX0lCU1NfUEFSTVxuIikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOworCQljYXNlIElFX0lCU1NfUEFSTToKKwkJCWlmIChwRWlkLT5MZW4gPT0gMikgeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBdGltV2luLCBwRWlkLT5PY3RldCwKKwkJCQkJICAgICAgIHBFaWQtPkxlbik7CisJCQl9IGVsc2UgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9JQlNTX1BBUk1cbiIpKTsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQlicmVhazsKIAotICAgICAgICAgICAgY2FzZSBJRV9USU06Ci0gICAgICAgICAgICAgICAgaWYoSU5GUkFfT04ocEFkKSAmJiBTdWJUeXBlID09IFNVQlRZUEVfQkVBQ09OKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgR2V0VGltQml0KChQVUNIQVIpcEVpZCwgcEFkLT5TdGFBY3RpdmUuQWlkLCAmVGltTGVuLCBwQmNhc3RGbGFnLCBwRHRpbUNvdW50LCBwRHRpbVBlcmlvZCwgcE1lc3NhZ2VUb01lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgSUVfVElNOgorCQkJaWYgKElORlJBX09OKHBBZCkgJiYgU3ViVHlwZSA9PSBTVUJUWVBFX0JFQUNPTikgeworCQkJCUdldFRpbUJpdCgoY2hhciAqKXBFaWQsIHBBZC0+U3RhQWN0aXZlLkFpZCwKKwkJCQkJICAmVGltTGVuLCBwQmNhc3RGbGFnLCBwRHRpbUNvdW50LAorCQkJCQkgIHBEdGltUGVyaW9kLCBwTWVzc2FnZVRvTWUpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UOgorCQkJaWYgKHBFaWQtPkxlbiA9PSAzKSB7CisJCQkJKnBOZXdDaGFubmVsID0gcEVpZC0+T2N0ZXRbMV07CS8qZXh0cmFjdCBuZXcgY2hhbm5lbCBudW1iZXIgKi8KKwkJCX0KKwkJCWJyZWFrOwogCi0gICAgICAgICAgICBjYXNlIElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVDoKLSAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPT0gMykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgCSpwTmV3Q2hhbm5lbCA9IHBFaWQtPk9jdGV0WzFdOwkvL2V4dHJhY3QgbmV3IGNoYW5uZWwgbnVtYmVyCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOworCQkJLyogTmV3IGZvciBXUEEgKi8KKwkJCS8qIENDWCB2MiBoYXMgdGhlIHNhbWUgSUUsIHdlIG5lZWQgdG8gcGFyc2UgdGhhdCB0b28gKi8KKwkJCS8qIFdpZmkgV01NIHVzZSB0aGUgc2FtZSBJRSB2YWxlLCBuZWVkIHRvIHBhcnNlIHRoYXQgdG9vICovCisJCQkvKiBjYXNlIElFX1dQQTogKi8KKwkJY2FzZSBJRV9WRU5ET1JfU1BFQ0lGSUM6CisJCQkvKiBDaGVjayBCcm9hZGNvbS9BdGhlcm9zIDgwMi4xMW4gT1VJIHZlcnNpb24sIGZvciBIVCBDYXBhYmlsaXR5IElFLiAqLworCQkJLyogVGhpcyBIVCBJRSBpcyBiZWZvcmUgSUVFRSBkcmFmdCBzZXQgSFQgSUUgdmFsdWUuMjAwNi0wOS0yOCBieSBKYW4uICovCisJCQkvKmlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIEJST0FEQ09NX09VSSwgMykgJiYgKHBFaWQtPkxlbiA+PSA0KSkKKwkJCSAgIHsKKwkJCSAgIGlmICgocEVpZC0+T2N0ZXRbM10gPT0gT1VJX0JST0FEQ09NX0hUKSAmJiAocEVpZC0+TGVuID49IDMwKSkKKwkJCSAgIHsKKwkJCSAgIHsKKwkJCSAgIE5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksICZwRWlkLT5PY3RldFs0XSwgc2l6ZW9mKHN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llKSk7CisJCQkgICAqcEh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOyAgLy8gTm5vdyB3ZSBvbmx5IHN1cHBvcnQgMjYgYnl0ZXMuCisJCQkgICB9CisJCQkgICB9CisJCQkgICBpZiAoKHBFaWQtPk9jdGV0WzNdID09IE9VSV9CUk9BRENPTV9IVCkgJiYgKHBFaWQtPkxlbiA+PSAyNikpCisJCQkgICB7CisJCQkgICB7CisJCQkgICBOZGlzTW92ZU1lbW9yeShBZGRIdEluZm8sICZwRWlkLT5PY3RldFs0XSwgc2l6ZW9mKHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSkpOworCQkJICAgKkFkZEh0SW5mb0xlbiA9IFNJWkVfQUREX0hUX0lORk9fSUU7IC8vIE5ub3cgd2Ugb25seSBzdXBwb3J0IDI2IGJ5dGVzLgorCQkJICAgfQorCQkJICAgfQorCQkJICAgfQorCQkJICovCisJCQkvKiBDaGVjayB0aGUgT1VJIHZlcnNpb24sIGZpbHRlciBvdXQgbm9uLXN0YW5kYXJkIHVzYWdlICovCisJCQlpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBSQUxJTktfT1VJLCAzKQorCQkJICAgICYmIChwRWlkLT5MZW4gPT0gNykpIHsKKwkJCQkvKipwUmFsaW5rSWUgPSBwRWlkLT5PY3RldFszXTsgKi8KKwkJCQlpZiAocEVpZC0+T2N0ZXRbM10gIT0gMCkKKwkJCQkJKnBSYWxpbmtJZSA9IHBFaWQtPk9jdGV0WzNdOworCQkJCWVsc2UKKwkJCQkJKnBSYWxpbmtJZSA9IDB4ZjAwMDAwMDA7CS8qIFNldCB0byBub24temVybyB2YWx1ZSAoY2FuJ3Qgc2V0IGJpdDAtMikgdG8gcmVwcmVzZW50IHRoaXMgaXMgUmFsaW5rIENoaXAuIFNvIGF0IGxpbmt1cCwgd2Ugd2lsbCBzZXQgcmFsaW5rY2hpcCBmbGFnLiAqLworCQkJfQorCQkJLyogVGhpcyBIVCBJRSBpcyBiZWZvcmUgSUVFRSBkcmFmdCBzZXQgSFQgSUUgdmFsdWUuMjAwNi0wOS0yOCBieSBKYW4uICovCiAKLSAgICAgICAgICAgIC8vIE5ldyBmb3IgV1BBCi0gICAgICAgICAgICAvLyBDQ1ggdjIgaGFzIHRoZSBzYW1lIElFLCB3ZSBuZWVkIHRvIHBhcnNlIHRoYXQgdG9vCi0gICAgICAgICAgICAvLyBXaWZpIFdNTSB1c2UgdGhlIHNhbWUgSUUgdmFsZSwgbmVlZCB0byBwYXJzZSB0aGF0IHRvbwotICAgICAgICAgICAgLy8gY2FzZSBJRV9XUEE6Ci0gICAgICAgICAgICBjYXNlIElFX1ZFTkRPUl9TUEVDSUZJQzoKLSAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgT1VJIHZlcnNpb24sIGZpbHRlciBvdXQgbm9uLXN0YW5kYXJkIHVzYWdlCi0gICAgICAgICAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgUkFMSU5LX09VSSwgMykgJiYgKHBFaWQtPkxlbiA9PSA3KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vKnBSYWxpbmtJZSA9IHBFaWQtPk9jdGV0WzNdOwotICAgICAgICAgICAgICAgICAgICBpZiAocEVpZC0+T2N0ZXRbM10gIT0gMCkKLSAgICAgICAgCQkJCSpwUmFsaW5rSWUgPSBwRWlkLT5PY3RldFszXTsKLSAgICAgICAgCQkJZWxzZQotICAgICAgICAJCQkJKnBSYWxpbmtJZSA9IDB4ZjAwMDAwMDA7IC8vIFNldCB0byBub24temVybyB2YWx1ZSAoY2FuJ3Qgc2V0IGJpdDAtMikgdG8gcmVwcmVzZW50IHRoaXMgaXMgUmFsaW5rIENoaXAuIFNvIGF0IGxpbmt1cCwgd2Ugd2lsbCBzZXQgcmFsaW5rY2hpcCBmbGFnLgotICAgICAgICAgICAgICAgIH0KLQkJLy8gVGhpcyBIVCBJRSBpcyBiZWZvcmUgSUVFRSBkcmFmdCBzZXQgSFQgSUUgdmFsdWUuMjAwNi0wOS0yOCBieSBKYW4uCisJCQkvKiBPdGhlciB2ZW5kb3JzIGhhZCBwcm9kdWN0aW9uIGJlZm9yZSBJRV9IVF9DQVAgdmFsdWUgaXMgYXNzaWduZWQuIFRvIGJhY2t3YXJkIHN1cHBvcnQgdGhvc2Ugb2xkLWZpcm13YXJlIEFQLCAqLworCQkJLyogQ2hlY2sgYnJvYWRjb20tZGVmaWVuZCBwcmUtODAyLjExbkQxLjAgT1VJIGZvciBIVCByZWxhdGVkIElFLCBpbmNsdWRpbmcgSFQgQ2FwYXRpbGl0aWVzIElFIGFuZCBIVCBJbmZvcm1hdGlvbiBJRSAqLworCQkJZWxzZSBpZiAoKCpwSHRDYXBhYmlsaXR5TGVuID09IDApCisJCQkJICYmIE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgUFJFX05fSFRfT1VJLAorCQkJCQkJICAgIDMpICYmIChwRWlkLT5MZW4gPj0gNCkKKwkJCQkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKSB7CisJCQkJaWYgKChwRWlkLT5PY3RldFszXSA9PSBPVUlfUFJFTl9IVF9DQVApCisJCQkJICAgICYmIChwRWlkLT5MZW4gPj0gMzApCisJCQkJICAgICYmICgqcEh0Q2FwYWJpbGl0eUxlbiA9PSAwKSkgeworCQkJCQlOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LAorCQkJCQkJICAgICAgICZwRWlkLT5PY3RldFs0XSwKKwkJCQkJCSAgICAgICBzaXplb2YKKwkJCQkJCSAgICAgICAoc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHlfaWUpKTsKKwkJCQkJKnBQcmVOSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7CisJCQkJfQogCi0gICAgICAgICAgICAgICAgLy8gT3RoZXIgdmVuZG9ycyBoYWQgcHJvZHVjdGlvbiBiZWZvcmUgSUVfSFRfQ0FQIHZhbHVlIGlzIGFzc2lnbmVkLiBUbyBiYWNrd2FyZCBzdXBwb3J0IHRob3NlIG9sZC1maXJtd2FyZSBBUCwKLSAgICAgICAgICAgICAgICAvLyBDaGVjayBicm9hZGNvbS1kZWZpZW5kIHByZS04MDIuMTFuRDEuMCBPVUkgZm9yIEhUIHJlbGF0ZWQgSUUsIGluY2x1ZGluZyBIVCBDYXBhdGlsaXRpZXMgSUUgYW5kIEhUIEluZm9ybWF0aW9uIElFCi0gICAgICAgICAgICAgICAgZWxzZSBpZiAoKCpwSHRDYXBhYmlsaXR5TGVuID09IDApICYmIE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgUFJFX05fSFRfT1VJLCAzKSAmJiAocEVpZC0+TGVuID49IDQpICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgocEVpZC0+T2N0ZXRbM10gPT0gT1VJX1BSRU5fSFRfQ0FQKSAmJiAocEVpZC0+TGVuID49IDMwKSAmJiAoKnBIdENhcGFiaWxpdHlMZW4gPT0gMCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksICZwRWlkLT5PY3RldFs0XSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpwUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOwotICAgICAgICAgICAgICAgICAgICB9CisJCQkJaWYgKChwRWlkLT5PY3RldFszXSA9PSBPVUlfUFJFTl9BRERfSFQpCisJCQkJICAgICYmIChwRWlkLT5MZW4gPj0gMjYpKSB7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KEFkZEh0SW5mbywKKwkJCQkJCSAgICAgICAmcEVpZC0+T2N0ZXRbNF0sCisJCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSkpOworCQkJCQkqQWRkSHRJbmZvTGVuID0gU0laRV9BRERfSFRfSU5GT19JRTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpIHsKKwkJCQkvKiBDb3B5IHRvIHBWSUUgd2hpY2ggd2lsbCByZXBvcnQgdG8gbWljcm9zb2Z0IGJzc2lkIGxpc3QuICovCisJCQkJUHRyID0gKHU4ICopcFZJRTsKKwkJCQlOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLCAmcEVpZC0+RWlkLAorCQkJCQkgICAgICAgcEVpZC0+TGVuICsgMik7CisJCQkJKkxlbmd0aFZJRSArPSAocEVpZC0+TGVuICsgMik7CisJCQl9IGVsc2UKKwkJCSAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXTUVfUEFSTV9FTEVNLCA2KQorCQkJCSYmIChwRWlkLT5MZW4gPT0gMjQpKSB7CisJCQkJdTggKnB0cjsKKwkJCQlpbnQgaTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoKHBFaWQtPk9jdGV0WzNdID09IE9VSV9QUkVOX0FERF9IVCkgJiYgKHBFaWQtPkxlbiA+PSAyNikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KEFkZEh0SW5mbywgJnBFaWQtPk9jdGV0WzRdLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpBZGRIdEluZm9MZW4gPSBTSVpFX0FERF9IVF9JTkZPX0lFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IHRvIHBWSUUgd2hpY2ggd2lsbCByZXBvcnQgdG8gbWljcm9zb2Z0IGJzc2lkIGxpc3QuCi0gICAgICAgICAgICAgICAgICAgIFB0ciA9IChQVUNIQVIpIHBWSUU7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOwotICAgICAgICAgICAgICAgICAgICAqTGVuZ3RoVklFICs9IChwRWlkLT5MZW4gKyAyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXTUVfUEFSTV9FTEVNLCA2KSAmJiAocEVpZC0+TGVuID09IDI0KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFBVQ0hBUiBwdHI7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpOworCQkJCS8qIHBhcnNpbmcgRURDQSBwYXJhbWV0ZXJzICovCisJCQkJcEVkY2FQYXJtLT5iVmFsaWQgPSBUUlVFOworCQkJCXBFZGNhUGFybS0+YlFBY2sgPSBGQUxTRTsJLyogcEVpZC0+T2N0ZXRbMF0gJiAweDEwOyAqLworCQkJCXBFZGNhUGFybS0+YlF1ZXVlUmVxdWVzdCA9IEZBTFNFOwkvKiBwRWlkLT5PY3RldFswXSAmIDB4MjA7ICovCisJCQkJcEVkY2FQYXJtLT5iVHhvcFJlcXVlc3QgPSBGQUxTRTsJLyogcEVpZC0+T2N0ZXRbMF0gJiAweDQwOyAqLworCQkJCXBFZGNhUGFybS0+RWRjYVVwZGF0ZUNvdW50ID0KKwkJCQkgICAgcEVpZC0+T2N0ZXRbNl0gJiAweDBmOworCQkJCXBFZGNhUGFybS0+YkFQU0RDYXBhYmxlID0KKwkJCQkgICAgKHBFaWQtPk9jdGV0WzZdICYgMHg4MCkgPyAxIDogMDsKKwkJCQlwdHIgPSAmcEVpZC0+T2N0ZXRbOF07CisJCQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJCQl1OCBhY2kgPSAoKnB0ciAmIDB4NjApID4+IDU7CS8qIGI1fjYgaXMgQUMgSU5ERVggKi8KKwkJCQkJcEVkY2FQYXJtLT5iQUNNW2FjaV0gPSAoKCgqcHRyKSAmIDB4MTApID09IDB4MTApOwkvKiBiNSBpcyBBQ00gKi8KKwkJCQkJcEVkY2FQYXJtLT5BaWZzblthY2ldID0gKCpwdHIpICYgMHgwZjsJLyogYjB+MyBpcyBBSUZTTiAqLworCQkJCQlwRWRjYVBhcm0tPkN3bWluW2FjaV0gPSAqKHB0ciArIDEpICYgMHgwZjsJLyogYjB+NCBpcyBDd21pbiAqLworCQkJCQlwRWRjYVBhcm0tPkN3bWF4W2FjaV0gPSAqKHB0ciArIDEpID4+IDQ7CS8qIGI1fjggaXMgQ3dtYXggKi8KKwkJCQkJcEVkY2FQYXJtLT5UeG9wW2FjaV0gPSAqKHB0ciArIDIpICsgMjU2ICogKCoocHRyICsgMykpOwkvKiBpbiB1bml0IG9mIDMyLXVzICovCisJCQkJCXB0ciArPSA0OwkvKiBwb2ludCB0byBuZXh0IEFDICovCisJCQkJfQorCQkJfSBlbHNlCisJCQkgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV01FX0lORk9fRUxFTSwgNikKKwkJCQkmJiAocEVpZC0+TGVuID09IDcpKSB7CisJCQkJLyogcGFyc2luZyBFRENBIHBhcmFtZXRlcnMgKi8KKwkJCQlwRWRjYVBhcm0tPmJWYWxpZCA9IFRSVUU7CisJCQkJcEVkY2FQYXJtLT5iUUFjayA9IEZBTFNFOwkvKiBwRWlkLT5PY3RldFswXSAmIDB4MTA7ICovCisJCQkJcEVkY2FQYXJtLT5iUXVldWVSZXF1ZXN0ID0gRkFMU0U7CS8qIHBFaWQtPk9jdGV0WzBdICYgMHgyMDsgKi8KKwkJCQlwRWRjYVBhcm0tPmJUeG9wUmVxdWVzdCA9IEZBTFNFOwkvKiBwRWlkLT5PY3RldFswXSAmIDB4NDA7ICovCisJCQkJcEVkY2FQYXJtLT5FZGNhVXBkYXRlQ291bnQgPQorCQkJCSAgICBwRWlkLT5PY3RldFs2XSAmIDB4MGY7CisJCQkJcEVkY2FQYXJtLT5iQVBTRENhcGFibGUgPQorCQkJCSAgICAocEVpZC0+T2N0ZXRbNl0gJiAweDgwKSA/IDEgOiAwOwogCi0gICAgICAgICAgICAgICAgICAgIC8vIHBhcnNpbmcgRURDQSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlZhbGlkICAgICAgICAgID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUUFjayAgICAgICAgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDEwOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJRdWV1ZVJlcXVlc3QgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4MjA7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlR4b3BSZXF1ZXN0ICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHg0MDsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5FZGNhVXBkYXRlQ291bnQgPSBwRWlkLT5PY3RldFs2XSAmIDB4MGY7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFQU0RDYXBhYmxlICAgID0gKHBFaWQtPk9jdGV0WzZdICYgMHg4MCkgPyAxIDogMDsKLSAgICAgICAgICAgICAgICAgICAgcHRyID0gJnBFaWQtPk9jdGV0WzhdOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGFjaSA9ICgqcHRyICYgMHg2MCkgPj4gNTsgLy8gYjV+NiBpcyBBQyBJTkRFWAotICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW2FjaV0gID0gKCgoKnB0cikgJiAweDEwKSA9PSAweDEwKTsgICAvLyBiNSBpcyBBQ00KLSAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bYWNpXSA9ICgqcHRyKSAmIDB4MGY7ICAgICAgICAgICAgICAgLy8gYjB+MyBpcyBBSUZTTgotICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pblthY2ldID0gKihwdHIrMSkgJiAweDBmOyAgICAgICAgICAgICAvLyBiMH40IGlzIEN3bWluCi0gICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W2FjaV0gPSAqKHB0cisxKSA+PiA0OyAgICAgICAgICAgICAgIC8vIGI1fjggaXMgQ3dtYXgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFthY2ldICA9ICoocHRyKzIpICsgMjU2ICogKCoocHRyKzMpKTsgLy8gaW4gdW5pdCBvZiAzMi11cwotICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IDQ7IC8vIHBvaW50IHRvIG5leHQgQUMKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdNRV9JTkZPX0VMRU0sIDYpICYmIChwRWlkLT5MZW4gPT0gNykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBwYXJzaW5nIEVEQ0EgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJWYWxpZCAgICAgICAgICA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlFBY2sgICAgICAgICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHgxMDsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUXVldWVSZXF1ZXN0ICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDIwOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJUeG9wUmVxdWVzdCAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4NDA7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+RWRjYVVwZGF0ZUNvdW50ID0gcEVpZC0+T2N0ZXRbNl0gJiAweDBmOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBUFNEQ2FwYWJsZSAgICA9IChwRWlkLT5PY3RldFs2XSAmIDB4ODApID8gMSA6IDA7CisJCQkJLyogdXNlIGRlZmF1bHQgRURDQSBwYXJhbWV0ZXIgKi8KKwkJCQlwRWRjYVBhcm0tPmJBQ01bUUlEX0FDX0JFXSA9IDA7CisJCQkJcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdID0gMzsKKwkJCQlwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CRV0gPSBDV19NSU5fSU5fQklUUzsKKwkJCQlwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CRV0gPSBDV19NQVhfSU5fQklUUzsKKwkJCQlwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JFXSA9IDA7CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGRlZmF1bHQgRURDQSBwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW1FJRF9BQ19CRV0gID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdID0gMzsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQkVdID0gQ1dfTUlOX0lOX0JJVFM7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JFXSA9IENXX01BWF9JTl9CSVRTOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JFXSAgPSAwOworCQkJCXBFZGNhUGFybS0+YkFDTVtRSURfQUNfQktdID0gMDsKKwkJCQlwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CS10gPSA3OworCQkJCXBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JLXSA9IENXX01JTl9JTl9CSVRTOworCQkJCXBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JLXSA9IENXX01BWF9JTl9CSVRTOworCQkJCXBFZGNhUGFybS0+VHhvcFtRSURfQUNfQktdID0gMDsKIAotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBQ01bUUlEX0FDX0JLXSAgPSAwOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CS10gPSA3OwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CS10gPSBDV19NSU5fSU5fQklUUzsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQktdID0gQ1dfTUFYX0lOX0JJVFM7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQktdICA9IDA7CisJCQkJcEVkY2FQYXJtLT5iQUNNW1FJRF9BQ19WSV0gPSAwOworCQkJCXBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9IDI7CisJCQkJcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVkldID0KKwkJCQkgICAgQ1dfTUlOX0lOX0JJVFMgLSAxOworCQkJCXBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZJXSA9IENXX01BWF9JTl9CSVRTOworCQkJCXBFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldID0gOTY7CS8qIEFDX1ZJOiA5NiozMnVzIH49IDNtcyAqLwogCi0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFDTVtRSURfQUNfVkldICA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9IDI7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX1ZJXSA9IENXX01JTl9JTl9CSVRTLTE7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZJXSA9IENXX01BWF9JTl9CSVRTOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZJXSAgPSA5NjsgICAvLyBBQ19WSTogOTYqMzJ1cyB+PSAzbXMKKwkJCQlwRWRjYVBhcm0tPmJBQ01bUUlEX0FDX1ZPXSA9IDA7CisJCQkJcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVk9dID0gMjsKKwkJCQlwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WT10gPQorCQkJCSAgICBDV19NSU5fSU5fQklUUyAtIDI7CisJCQkJcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVk9dID0KKwkJCQkgICAgQ1dfTUFYX0lOX0JJVFMgLSAxOworCQkJCXBFZGNhUGFybS0+VHhvcFtRSURfQUNfVk9dID0gNDg7CS8qIEFDX1ZPOiA0OCozMnVzIH49IDEuNW1zICovCisJCQl9CiAKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW1FJRF9BQ19WT10gID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVk9dID0gMjsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVk9dID0gQ1dfTUlOX0lOX0JJVFMtMjsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVk9dID0gQ1dfTUFYX0lOX0JJVFMtMTsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WT10gID0gNDg7ICAgLy8gQUNfVk86IDQ4KjMydXMgfj0gMS41bXMKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJCQlicmVhazsKIAotICAgICAgICAgICAgY2FzZSBJRV9FWFRfU1VQUF9SQVRFUzoKLSAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoRXh0UmF0ZSwgcEVpZC0+T2N0ZXQsIHBFaWQtPkxlbik7Ci0gICAgICAgICAgICAgICAgICAgICpwRXh0UmF0ZUxlbiA9IHBFaWQtPkxlbjsKKwkJY2FzZSBJRV9FWFRfU1VQUF9SQVRFUzoKKwkJCWlmIChwRWlkLT5MZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpIHsKKwkJCQlOZGlzTW92ZU1lbW9yeShFeHRSYXRlLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKKwkJCQkqcEV4dFJhdGVMZW4gPSBwRWlkLT5MZW47CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogMjAwNC0wOS0xNCBub3QgYSBnb29kIGRlc2lnbiBoZXJlLCBjYXVzZSBpdCBleGNsdWRlIGV4dHJhIHJhdGVzCi0gICAgICAgICAgICAgICAgICAgIC8vIGZyb20gU2NhblRhYi4gV2Ugc2hvdWxkIHJlcG9ydCBhcyBpcy4gQW5kIGZpbHRlciBvdXQgdW5zdXBwb3J0ZWQKLSAgICAgICAgICAgICAgICAgICAgLy8gcmF0ZXMgaW4gTWxtZUF1eC4KLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgYWdhaW5zdCB0aGUgc3VwcG9ydGVkIHJhdGVzCi0gICAgICAgICAgICAgICAgICAgIC8vIFJUTVBDaGVja1JhdGVzKHBBZCwgRXh0UmF0ZSwgcEV4dFJhdGVMZW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKKwkJCQkvKiBUT0RPOiAyMDA0LTA5LTE0IG5vdCBhIGdvb2QgZGVzaWduIGhlcmUsIGNhdXNlIGl0IGV4Y2x1ZGUgZXh0cmEgcmF0ZXMgKi8KKwkJCQkvKiBmcm9tIFNjYW5UYWIuIFdlIHNob3VsZCByZXBvcnQgYXMgaXMuIEFuZCBmaWx0ZXIgb3V0IHVuc3VwcG9ydGVkICovCisJCQkJLyogcmF0ZXMgaW4gTWxtZUF1eC4gKi8KKwkJCQkvKiBDaGVjayBhZ2FpbnN0IHRoZSBzdXBwb3J0ZWQgcmF0ZXMgKi8KKwkJCQkvKiBSVE1QQ2hlY2tSYXRlcyhwQWQsIEV4dFJhdGUsIHBFeHRSYXRlTGVuKTsgKi8KKwkJCX0KKwkJCWJyZWFrOwogCi0gICAgICAgICAgICBjYXNlIElFX0VSUDoKLSAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuID09IDEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqcEVycCA9IChVQ0hBUilwRWlkLT5PY3RldFswXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgSUVfRVJQOgorCQkJaWYgKHBFaWQtPkxlbiA9PSAxKSB7CisJCQkJKnBFcnAgPSAodTgpcEVpZC0+T2N0ZXRbMF07CisJCQl9CisJCQlicmVhazsKIAotICAgICAgICAgICAgY2FzZSBJRV9BSVJPTkVUX0NLSVA6Ci0gICAgICAgICAgICAgICAgLy8gMC4gQ2hlY2sgQWlyb25ldCBJRSBsZW5ndGgsIGl0IG11c3QgYmUgbGFyZ2VyIG9yIGVxdWFsIHRvIDI4Ci0gICAgICAgICAgICAgICAgLy8gQ2lzY28gQVAzNTAgdXNlZCBsZW5ndGggYXMgMjgKLSAgICAgICAgICAgICAgICAvLyBDaXNjbyBBUDEyWFggdXNlZCBsZW5ndGggYXMgMzAKLSAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuIDwgKENLSVBfTkVHT1RJQVRJT05fTEVOR1RIIC0gMikpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQljYXNlIElFX0FJUk9ORVRfQ0tJUDoKKwkJCS8qIDAuIENoZWNrIEFpcm9uZXQgSUUgbGVuZ3RoLCBpdCBtdXN0IGJlIGxhcmdlciBvciBlcXVhbCB0byAyOCAqLworCQkJLyogQ2lzY28gQVAzNTAgdXNlZCBsZW5ndGggYXMgMjggKi8KKwkJCS8qIENpc2NvIEFQMTJYWCB1c2VkIGxlbmd0aCBhcyAzMCAqLworCQkJaWYgKHBFaWQtPkxlbiA8IChDS0lQX05FR09USUFUSU9OX0xFTkdUSCAtIDIpKQorCQkJCWJyZWFrOwogCi0gICAgICAgICAgICAgICAgLy8gMS4gQ29weSBDS0lQIGZsYWcgYnl0ZSB0byBidWZmZXIgZm9yIHByb2Nlc3MKLSAgICAgICAgICAgICAgICAqcENraXBGbGFnID0gKihwRWlkLT5PY3RldCArIDgpOwotICAgICAgICAgICAgICAgIGJyZWFrOworCQkJLyogMS4gQ29weSBDS0lQIGZsYWcgYnl0ZSB0byBidWZmZXIgZm9yIHByb2Nlc3MgKi8KKwkJCSpwQ2tpcEZsYWcgPSAqKHBFaWQtPk9jdGV0ICsgOCk7CisJCQlicmVhazsKIAotICAgICAgICAgICAgY2FzZSBJRV9BUF9UWF9QT1dFUjoKLSAgICAgICAgICAgICAgICAvLyBBUCBDb250cm9sIG9mIENsaWVudCBUcmFuc21pdCBQb3dlcgotICAgICAgICAgICAgICAgIC8vMC4gQ2hlY2sgQWlyb25ldCBJRSBsZW5ndGgsIGl0IG11c3QgYmUgNgotICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gIT0gMHgwNikKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgSUVfQVBfVFhfUE9XRVI6CisJCQkvKiBBUCBDb250cm9sIG9mIENsaWVudCBUcmFuc21pdCBQb3dlciAqLworCQkJLyowLiBDaGVjayBBaXJvbmV0IElFIGxlbmd0aCwgaXQgbXVzdCBiZSA2ICovCisJCQlpZiAocEVpZC0+TGVuICE9IDB4MDYpCisJCQkJYnJlYWs7CiAKLSAgICAgICAgICAgICAgICAvLyBHZXQgY2VsbCBwb3dlciBsaW1pdCBpbiBkQm0KLSAgICAgICAgICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBDSVNDT19PVUksIDMpID09IDEpCi0gICAgICAgICAgICAgICAgICAgICpwQWlyb25ldENlbGxQb3dlckxpbWl0ID0gKihwRWlkLT5PY3RldCArIDQpOwotICAgICAgICAgICAgICAgIGJyZWFrOworCQkJLyogR2V0IGNlbGwgcG93ZXIgbGltaXQgaW4gZEJtICovCisJCQlpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBDSVNDT19PVUksIDMpID09IDEpCisJCQkJKnBBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPSAqKHBFaWQtPk9jdGV0ICsgNCk7CisJCQlicmVhazsKIAotICAgICAgICAgICAgLy8gV1BBMiAmIDgwMi4xMWkgUlNOCi0gICAgICAgICAgICBjYXNlIElFX1JTTjoKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBPVUkgZm9yIHZlcnNpb24gYW55bW9yZSwgY2hlY2sgdGhlIGdyb3VwIGNpcGhlciBPVUkgYmVmb3JlIGNvcHlpbmcKLSAgICAgICAgICAgICAgICBpZiAoUlRNUEVxdWFsTWVtb3J5KHBFaWQtPk9jdGV0ICsgMiwgUlNOX09VSSwgMykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IHRvIHBWSUUgd2hpY2ggd2lsbCByZXBvcnQgdG8gbWljcm9zb2Z0IGJzc2lkIGxpc3QuCi0gICAgICAgICAgICAgICAgICAgIFB0ciA9IChQVUNIQVIpIHBWSUU7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOwotICAgICAgICAgICAgICAgICAgICAqTGVuZ3RoVklFICs9IChwRWlkLT5MZW4gKyAyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJCQkvKiBXUEEyICYgODAyLjExaSBSU04gKi8KKwkJY2FzZSBJRV9SU046CisJCQkvKiBUaGVyZSBpcyBubyBPVUkgZm9yIHZlcnNpb24gYW55bW9yZSwgY2hlY2sgdGhlIGdyb3VwIGNpcGhlciBPVUkgYmVmb3JlIGNvcHlpbmcgKi8KKwkJCWlmIChSVE1QRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkgeworCQkJCS8qIENvcHkgdG8gcFZJRSB3aGljaCB3aWxsIHJlcG9ydCB0byBtaWNyb3NvZnQgYnNzaWQgbGlzdC4gKi8KKwkJCQlQdHIgPSAodTggKilwVklFOworCQkJCU5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsCisJCQkJCSAgICAgICBwRWlkLT5MZW4gKyAyKTsKKwkJCQkqTGVuZ3RoVklFICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCX0KKwkJCWJyZWFrOwogCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQogCi0gICAgICAgIExlbmd0aCA9IExlbmd0aCArIDIgKyBwRWlkLT5MZW47ICAvLyBFaWRbMV0gKyBMZW5bMV0rIGNvbnRlbnRbTGVuXQotICAgICAgICBwRWlkID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKXBFaWQgKyAyICsgcEVpZC0+TGVuKTsKLSAgICB9CisJCUxlbmd0aCA9IExlbmd0aCArIDIgKyBwRWlkLT5MZW47CS8qIEVpZFsxXSArIExlblsxXSsgY29udGVudFtMZW5dICovCisJCXBFaWQgPSAoc3RydWN0IHJ0X2VpZCAqKSAoKHU4ICopIHBFaWQgKyAyICsgcEVpZC0+TGVuKTsKKwl9CiAKLSAgICAvLyBGb3Igc29tZSAxMWEgQVAuIGl0IGRpZCBub3QgaGF2ZSB0aGUgY2hhbm5lbCBFSUQsIHBhdGNoIGhlcmUKKwkvKiBGb3Igc29tZSAxMWEgQVAuIGl0IGRpZCBub3QgaGF2ZSB0aGUgY2hhbm5lbCBFSUQsIHBhdGNoIGhlcmUgKi8KIAl7Ci0JCVVDSEFSIExhdGNoUmZDaGFubmVsID0gTXNnQ2hhbm5lbDsKLQkJaWYgKChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkgJiYgKChTYW5pdHkgJiAweDQpID09IDApKQotCQl7CisJCXU4IExhdGNoUmZDaGFubmVsID0gTXNnQ2hhbm5lbDsKKwkJaWYgKChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkgJiYgKChTYW5pdHkgJiAweDQpID09IDApKSB7CiAJCQlpZiAoQ3RybENoYW5uZWwgIT0gMCkKIAkJCQkqcENoYW5uZWwgPSBDdHJsQ2hhbm5lbDsKIAkJCWVsc2UKQEAgLTcxNiwxMyArNzExLDEyIEBACiAJCX0KIAl9CiAKLQlpZiAoU2FuaXR5ICE9IDB4NykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gbWlzc2luZyBmaWVsZCwgU2FuaXR5PTB4JTAyeFxuIiwgU2FuaXR5KSk7CisJaWYgKFNhbml0eSAhPSAweDcpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfTE9VRCwKKwkJCSAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIG1pc3NpbmcgZmllbGQsIFNhbml0eT0weCUwMnhcbiIsCisJCQkgIFNhbml0eSkpOwogCQlyZXR1cm4gRkFMU0U7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJcmV0dXJuIFRSVUU7CiAJfQogCkBAIC03MzYsNTEgKzczMCw0MiBAQAogICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotQk9PTEVBTiBNbG1lU2NhblJlcVNhbml0eSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBWT0lEICpNc2csCi0JSU4gVUxPTkcgTXNnTGVuLAotCU9VVCBVQ0hBUiAqcEJzc1R5cGUsCi0JT1VUIENIQVIgU3NpZFtdLAotCU9VVCBVQ0hBUiAqcFNzaWRMZW4sCi0JT1VUIFVDSEFSICpwU2NhblR5cGUpCitCT09MRUFOIE1sbWVTY2FuUmVxU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgdm9pZCAqIE1zZywKKwkJCSAgdW5zaWduZWQgbG9uZyBNc2dMZW4sCisJCQkgIHU4ICogcEJzc1R5cGUsCisJCQkgIGNoYXIgU3NpZFtdLAorCQkJICB1OCAqIHBTc2lkTGVuLCB1OCAqIHBTY2FuVHlwZSkKIHsKLQlNTE1FX1NDQU5fUkVRX1NUUlVDVCAqSW5mbzsKKwlzdHJ1Y3QgcnRfbWxtZV9zY2FuX3JlcSAqSW5mbzsKIAotCUluZm8gPSAoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgKikoTXNnKTsKKwlJbmZvID0gKHN0cnVjdCBydF9tbG1lX3NjYW5fcmVxICopKE1zZyk7CiAJKnBCc3NUeXBlID0gSW5mby0+QnNzVHlwZTsKIAkqcFNzaWRMZW4gPSBJbmZvLT5Tc2lkTGVuOwogCU5kaXNNb3ZlTWVtb3J5KFNzaWQsIEluZm8tPlNzaWQsICpwU3NpZExlbik7CiAJKnBTY2FuVHlwZSA9IEluZm8tPlNjYW5UeXBlOwogCi0JaWYgKCgqcEJzc1R5cGUgPT0gQlNTX0lORlJBIHx8ICpwQnNzVHlwZSA9PSBCU1NfQURIT0MgfHwgKnBCc3NUeXBlID09IEJTU19BTlkpCi0JCSYmICgqcFNjYW5UeXBlID09IFNDQU5fQUNUSVZFIHx8ICpwU2NhblR5cGUgPT0gU0NBTl9QQVNTSVZFCi0JCXx8ICpwU2NhblR5cGUgPT0gU0NBTl9DSVNDT19QQVNTSVZFIHx8ICpwU2NhblR5cGUgPT0gU0NBTl9DSVNDT19BQ1RJVkUKLQkJfHwgKnBTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRCB8fCAqcFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fTk9JU0UKLQkJKSkKLQl7CisJaWYgKCgqcEJzc1R5cGUgPT0gQlNTX0lORlJBIHx8ICpwQnNzVHlwZSA9PSBCU1NfQURIT0MKKwkgICAgIHx8ICpwQnNzVHlwZSA9PSBCU1NfQU5ZKQorCSAgICAmJiAoKnBTY2FuVHlwZSA9PSBTQ0FOX0FDVElWRSB8fCAqcFNjYW5UeXBlID09IFNDQU5fUEFTU0lWRSkpIHsKIAkJcmV0dXJuIFRSVUU7Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTY2FuUmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBCc3NUeXBlIG9yIFNjYW5UeXBlXG4iKSk7CisJfSBlbHNlIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJNbG1lU2NhblJlcVNhbml0eSBmYWlsIC0gd3JvbmcgQnNzVHlwZSBvciBTY2FuVHlwZVxuIikpOwogCQlyZXR1cm4gRkFMU0U7CiAJfQogfQogCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVVDSEFSIENoYW5uZWxTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVUNIQVIgY2hhbm5lbCkKKy8qIElSUUwgPSBESVNQQVRDSF9MRVZFTCAqLwordTggQ2hhbm5lbFNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IGNoYW5uZWwpCiB7Ci0gICAgaW50IGk7CisJaW50IGk7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSArKykKLSAgICB7Ci0gICAgICAgIGlmIChjaGFubmVsID09IHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCkKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm4gMDsKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKSB7CisJCWlmIChjaGFubmVsID09IHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTc5NCwxOSArNzc5LDE3IEBACiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1CT09MRUFOIFBlZXJEZWF1dGhTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBBZGRyMiwKLSAgICBPVVQgVVNIT1JUICpwUmVhc29uKQorQk9PTEVBTiBQZWVyRGVhdXRoU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSB2b2lkICogTXNnLAorCQkJIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkJIHU4ICpwQWRkcjIsIHUxNiAqIHBSZWFzb24pCiB7Ci0gICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisJc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqIHBGcmFtZSA9IChzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICopIE1zZzsKIAotICAgIENPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7Ci0gICAgTmRpc01vdmVNZW1vcnkocFJlYXNvbiwgJnBGcmFtZS0+T2N0ZXRbMF0sIDIpOworCUNPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisJTmRpc01vdmVNZW1vcnkocFJlYXNvbiwgJnBGcmFtZS0+T2N0ZXRbMF0sIDIpOwogCi0gICAgcmV0dXJuIFRSVUU7CisJcmV0dXJuIFRSVUU7CiB9CiAKIC8qCkBAIC04MjAsNTggKzgwMyw0NiBAQAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotQk9PTEVBTiBQZWVyQXV0aFNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIsCi0gICAgT1VUIFVTSE9SVCAqcEFsZywKLSAgICBPVVQgVVNIT1JUICpwU2VxLAotICAgIE9VVCBVU0hPUlQgKnBTdGF0dXMsCi0gICAgQ0hBUiAqcENobGdUZXh0KQorQk9PTEVBTiBQZWVyQXV0aFNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICB2b2lkICogTXNnLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBNc2dMZW4sCisJCSAgICAgICB1OCAqcEFkZHIsCisJCSAgICAgICB1MTYgKiBwQWxnLAorCQkgICAgICAgdTE2ICogcFNlcSwKKwkJICAgICAgIHUxNiAqIHBTdGF0dXMsIGNoYXIgKiBwQ2hsZ1RleHQpCiB7Ci0gICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisJc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqIHBGcmFtZSA9IChzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICopIE1zZzsKIAotICAgIENPUFlfTUFDX0FERFIocEFkZHIsICAgcEZyYW1lLT5IZHIuQWRkcjIpOwotICAgIE5kaXNNb3ZlTWVtb3J5KHBBbGcsICAgICZwRnJhbWUtPk9jdGV0WzBdLCAyKTsKLSAgICBOZGlzTW92ZU1lbW9yeShwU2VxLCAgICAmcEZyYW1lLT5PY3RldFsyXSwgMik7Ci0gICAgTmRpc01vdmVNZW1vcnkocFN0YXR1cywgJnBGcmFtZS0+T2N0ZXRbNF0sIDIpOworCUNPUFlfTUFDX0FERFIocEFkZHIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKKwlOZGlzTW92ZU1lbW9yeShwQWxnLCAmcEZyYW1lLT5PY3RldFswXSwgMik7CisJTmRpc01vdmVNZW1vcnkocFNlcSwgJnBGcmFtZS0+T2N0ZXRbMl0sIDIpOworCU5kaXNNb3ZlTWVtb3J5KHBTdGF0dXMsICZwRnJhbWUtPk9jdGV0WzRdLCAyKTsKIAotICAgIGlmICgoKnBBbGcgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKLSAgICAgICkKLSAgICB7Ci0gICAgICAgIGlmICgqcFNlcSA9PSAxIHx8ICpwU2VxID09IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckF1dGhTYW5pdHkgZmFpbCAtIHdyb25nIFNlZyNcbiIpKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICgqcEFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCi0gICAgewotICAgICAgICBpZiAoKnBTZXEgPT0gMSB8fCAqcFNlcSA9PSA0KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgqcFNlcSA9PSAyIHx8ICpwU2VxID09IDMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBDaGxnVGV4dCwgJnBGcmFtZS0+T2N0ZXRbOF0sIENJUEhFUl9URVhUX0xFTik7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBdXRoU2FuaXR5IGZhaWwgLSB3cm9uZyBTZWcjXG4iKSk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckF1dGhTYW5pdHkgZmFpbCAtIHdyb25nIGFsZ29yaXRobVxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQorCWlmICgqcEFsZyA9PSBBVVRIX01PREVfT1BFTikgeworCQlpZiAoKnBTZXEgPT0gMSB8fCAqcFNlcSA9PSAyKSB7CisJCQlyZXR1cm4gVFJVRTsKKwkJfSBlbHNlIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlBlZXJBdXRoU2FuaXR5IGZhaWwgLSB3cm9uZyBTZWcjXG4iKSk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9IGVsc2UgaWYgKCpwQWxnID09IEFVVEhfTU9ERV9LRVkpIHsKKwkJaWYgKCpwU2VxID09IDEgfHwgKnBTZXEgPT0gNCkgeworCQkJcmV0dXJuIFRSVUU7CisJCX0gZWxzZSBpZiAoKnBTZXEgPT0gMiB8fCAqcFNlcSA9PSAzKSB7CisJCQlOZGlzTW92ZU1lbW9yeShwQ2hsZ1RleHQsICZwRnJhbWUtPk9jdGV0WzhdLAorCQkJCSAgICAgICBDSVBIRVJfVEVYVF9MRU4pOworCQkJcmV0dXJuIFRSVUU7CisJCX0gZWxzZSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJQZWVyQXV0aFNhbml0eSBmYWlsIC0gd3JvbmcgU2VnI1xuIikpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfSBlbHNlIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJQZWVyQXV0aFNhbml0eSBmYWlsIC0gd3JvbmcgYWxnb3JpdGhtXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CiB9CiAKIC8qCkBAIC04ODIsMzIgKzg1MywyNyBAQAogICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotQk9PTEVBTiBNbG1lQXV0aFJlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIsCi0gICAgT1VUIFVMT05HICpwVGltZW91dCwKLSAgICBPVVQgVVNIT1JUICpwQWxnKQorQk9PTEVBTiBNbG1lQXV0aFJlcVNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgIHZvaWQgKiBNc2csCisJCQkgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkJICB1OCAqcEFkZHIsCisJCQkgIHVuc2lnbmVkIGxvbmcgKiBwVGltZW91dCwgdTE2ICogcEFsZykKIHsKLSAgICBNTE1FX0FVVEhfUkVRX1NUUlVDVCAqcEluZm87CisJc3RydWN0IHJ0X21sbWVfYXV0aF9yZXEgKnBJbmZvOwogCi0gICAgcEluZm8gID0gKE1MTUVfQVVUSF9SRVFfU1RSVUNUICopTXNnOwotICAgIENPUFlfTUFDX0FERFIocEFkZHIsIHBJbmZvLT5BZGRyKTsKLSAgICAqcFRpbWVvdXQgPSBwSW5mby0+VGltZW91dDsKLSAgICAqcEFsZyA9IHBJbmZvLT5BbGc7CisJcEluZm8gPSAoc3RydWN0IHJ0X21sbWVfYXV0aF9yZXEgKilNc2c7CisJQ09QWV9NQUNfQUREUihwQWRkciwgcEluZm8tPkFkZHIpOworCSpwVGltZW91dCA9IHBJbmZvLT5UaW1lb3V0OworCSpwQWxnID0gcEluZm8tPkFsZzsKIAotICAgIGlmICgoKCpwQWxnID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkgfHwoKnBBbGcgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKLSAgICAgCSkgJiYKLSAgICAgICAgKCgqcEFkZHIgJiAweDAxKSA9PSAwKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lQXV0aFJlcVNhbml0eSBmYWlsIC0gd3JvbmcgYWxnb3JpdGhtXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisJaWYgKCgoKnBBbGcgPT0gQVVUSF9NT0RFX0tFWSkgfHwgKCpwQWxnID09IEFVVEhfTU9ERV9PUEVOKQorCSAgICApICYmICgoKnBBZGRyICYgMHgwMSkgPT0gMCkpIHsKKwkJcmV0dXJuIFRSVUU7CisJfSBlbHNlIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJNbG1lQXV0aFJlcVNhbml0eSBmYWlsIC0gd3JvbmcgYWxnb3JpdGhtXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CiB9CiAKIC8qCkBAIC05MjEsMjQgKzg4NywyMiBAQAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotQk9PTEVBTiBNbG1lQXNzb2NSZXFTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBBcEFkZHIsCi0gICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAotICAgIE9VVCBVTE9ORyAqcFRpbWVvdXQsCi0gICAgT1VUIFVTSE9SVCAqcExpc3RlbkludHYpCitCT09MRUFOIE1sbWVBc3NvY1JlcVNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB2b2lkICogTXNnLAorCQkJICAgdW5zaWduZWQgbG9uZyBNc2dMZW4sCisJCQkgICB1OCAqcEFwQWRkciwKKwkJCSAgIHUxNiAqIHBDYXBhYmlsaXR5SW5mbywKKwkJCSAgIHVuc2lnbmVkIGxvbmcgKiBwVGltZW91dCwgdTE2ICogcExpc3RlbkludHYpCiB7Ci0gICAgTUxNRV9BU1NPQ19SRVFfU1RSVUNUICpwSW5mbzsKKwlzdHJ1Y3QgcnRfbWxtZV9hc3NvY19yZXEgKnBJbmZvOwogCi0gICAgcEluZm8gPSAoTUxNRV9BU1NPQ19SRVFfU1RSVUNUICopTXNnOwotICAgICpwVGltZW91dCA9IHBJbmZvLT5UaW1lb3V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGltZW91dAotICAgIENPUFlfTUFDX0FERFIocEFwQWRkciwgcEluZm8tPkFkZHIpOyAgICAgICAgICAgICAgICAgICAvLyBBUCBhZGRyZXNzCi0gICAgKnBDYXBhYmlsaXR5SW5mbyA9IHBJbmZvLT5DYXBhYmlsaXR5SW5mbzsgICAgICAgICAgICAgICAvLyBjYXBhYmlsaXR5IGluZm8KLSAgICAqcExpc3RlbkludHYgPSBwSW5mby0+TGlzdGVuSW50djsKKwlwSW5mbyA9IChzdHJ1Y3QgcnRfbWxtZV9hc3NvY19yZXEgKilNc2c7CisJKnBUaW1lb3V0ID0gcEluZm8tPlRpbWVvdXQ7CS8qIHRpbWVvdXQgKi8KKwlDT1BZX01BQ19BRERSKHBBcEFkZHIsIHBJbmZvLT5BZGRyKTsJLyogQVAgYWRkcmVzcyAqLworCSpwQ2FwYWJpbGl0eUluZm8gPSBwSW5mby0+Q2FwYWJpbGl0eUluZm87CS8qIGNhcGFiaWxpdHkgaW5mbyAqLworCSpwTGlzdGVuSW50diA9IHBJbmZvLT5MaXN0ZW5JbnR2OwogCi0gICAgcmV0dXJuIFRSVUU7CisJcmV0dXJuIFRSVUU7CiB9CiAKIC8qCkBAIC05NTIsMTkgKzkxNiwxNyBAQAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotQk9PTEVBTiBQZWVyRGlzYXNzb2NTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBBZGRyMiwKLSAgICBPVVQgVVNIT1JUICpwUmVhc29uKQorQk9PTEVBTiBQZWVyRGlzYXNzb2NTYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdm9pZCAqIE1zZywKKwkJCSAgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkJICAgdTggKnBBZGRyMiwgdTE2ICogcFJlYXNvbikKIHsKLSAgICBQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKKwlzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICogcEZyYW1lID0gKHN0cnVjdCBydF9mcmFtZV84MDJfMTEgKikgTXNnOwogCi0gICAgQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKLSAgICBOZGlzTW92ZU1lbW9yeShwUmVhc29uLCAmcEZyYW1lLT5PY3RldFswXSwgMik7CisJQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKKwlOZGlzTW92ZU1lbW9yeShwUmVhc29uLCAmcEZyYW1lLT5PY3RldFswXSwgMik7CiAKLSAgICByZXR1cm4gVFJVRTsKKwlyZXR1cm4gVFJVRTsKIH0KIAogLyoKQEAgLTk4NCw3MSArOTQ2LDI2MCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotTkRJU184MDJfMTFfTkVUV09SS19UWVBFIE5ldHdvcmtUeXBlSW5Vc2VTYW5pdHkoCi0gICAgSU4gUEJTU19FTlRSWSBwQnNzKQorTkRJU184MDJfMTFfTkVUV09SS19UWVBFIE5ldHdvcmtUeXBlSW5Vc2VTYW5pdHkoc3RydWN0IHJ0X2Jzc19lbnRyeSAqcEJzcykKIHsKLQlORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUJTmV0V29ya1R5cGU7Ci0JVUNIQVIJCQkJCQlyYXRlLCBpOworCU5ESVNfODAyXzExX05FVFdPUktfVFlQRSBOZXRXb3JrVHlwZTsKKwl1OCByYXRlLCBpOwogCiAJTmV0V29ya1R5cGUgPSBOZGlzODAyXzExRFM7CiAKLQlpZiAocEJzcy0+Q2hhbm5lbCA8PSAxNCkKLQl7Ci0JCS8vCi0JCS8vIEZpcnN0IGNoZWNrIHN1cHBvcnQgUmF0ZS4KLQkJLy8KLQkJZm9yIChpID0gMDsgaSA8IHBCc3MtPlN1cFJhdGVMZW47IGkrKykKLQkJewotCQkJcmF0ZSA9IHBCc3MtPlN1cFJhdGVbaV0gJiAweDdmOyAvLyBNYXNrIG91dCBiYXNpYyByYXRlIHNldCBiaXQKLQkJCWlmICgocmF0ZSA9PSAyKSB8fCAocmF0ZSA9PSA0KSB8fCAocmF0ZSA9PSAxMSkgfHwgKHJhdGUgPT0gMjIpKQotCQkJeworCWlmIChwQnNzLT5DaGFubmVsIDw9IDE0KSB7CisJCS8qICovCisJCS8qIEZpcnN0IGNoZWNrIHN1cHBvcnQgUmF0ZS4gKi8KKwkJLyogKi8KKwkJZm9yIChpID0gMDsgaSA8IHBCc3MtPlN1cFJhdGVMZW47IGkrKykgeworCQkJcmF0ZSA9IHBCc3MtPlN1cFJhdGVbaV0gJiAweDdmOwkvKiBNYXNrIG91dCBiYXNpYyByYXRlIHNldCBiaXQgKi8KKwkJCWlmICgocmF0ZSA9PSAyKSB8fCAocmF0ZSA9PSA0KSB8fCAocmF0ZSA9PSAxMSkKKwkJCSAgICB8fCAocmF0ZSA9PSAyMikpIHsKIAkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLwotCQkJCS8vIE90aGVyd2lzZSAoZXZlbiByYXRlID4gMTA4KSBtZWFucyBOZGlzODAyXzExT0ZETTI0Ci0JCQkJLy8KKwkJCX0gZWxzZSB7CisJCQkJLyogKi8KKwkJCQkvKiBPdGhlcndpc2UgKGV2ZW4gcmF0ZSA+IDEwOCkgbWVhbnMgTmRpczgwMl8xMU9GRE0yNCAqLworCQkJCS8qICovCiAJCQkJTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTI0OwogCQkJCWJyZWFrOwogCQkJfQogCQl9CiAKLQkJLy8KLQkJLy8gU2Vjb25kIGNoZWNrIEV4dGVuZCBSYXRlLgotCQkvLwotCQlpZiAoTmV0V29ya1R5cGUgIT0gTmRpczgwMl8xMU9GRE0yNCkKLQkJewotCQkJZm9yIChpID0gMDsgaSA8IHBCc3MtPkV4dFJhdGVMZW47IGkrKykKLQkJCXsKLQkJCQlyYXRlID0gcEJzcy0+U3VwUmF0ZVtpXSAmIDB4N2Y7IC8vIE1hc2sgb3V0IGJhc2ljIHJhdGUgc2V0IGJpdAotCQkJCWlmICgocmF0ZSA9PSAyKSB8fCAocmF0ZSA9PSA0KSB8fCAocmF0ZSA9PSAxMSkgfHwgKHJhdGUgPT0gMjIpKQotCQkJCXsKKwkJLyogKi8KKwkJLyogU2Vjb25kIGNoZWNrIEV4dGVuZCBSYXRlLiAqLworCQkvKiAqLworCQlpZiAoTmV0V29ya1R5cGUgIT0gTmRpczgwMl8xMU9GRE0yNCkgeworCQkJZm9yIChpID0gMDsgaSA8IHBCc3MtPkV4dFJhdGVMZW47IGkrKykgeworCQkJCXJhdGUgPSBwQnNzLT5TdXBSYXRlW2ldICYgMHg3ZjsJLyogTWFzayBvdXQgYmFzaWMgcmF0ZSBzZXQgYml0ICovCisJCQkJaWYgKChyYXRlID09IDIpIHx8IChyYXRlID09IDQpIHx8IChyYXRlID09IDExKQorCQkJCSAgICB8fCAocmF0ZSA9PSAyMikpIHsKIAkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCS8vCi0JCQkJCS8vIE90aGVyd2lzZSAoZXZlbiByYXRlID4gMTA4KSBtZWFucyBOZGlzODAyXzExT0ZETTI0Ci0JCQkJCS8vCisJCQkJfSBlbHNlIHsKKwkJCQkJLyogKi8KKwkJCQkJLyogT3RoZXJ3aXNlIChldmVuIHJhdGUgPiAxMDgpIG1lYW5zIE5kaXM4MDJfMTFPRkRNMjQgKi8KKwkJCQkJLyogKi8KIAkJCQkJTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTI0OwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CiAJCX0KLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNNTsKIAl9CiAKLSAgICBpZiAocEJzcy0+SHRDYXBhYmlsaXR5TGVuICE9IDApCi0gICAgewotICAgICAgICBpZiAoTmV0V29ya1R5cGUgPT0gTmRpczgwMl8xMU9GRE01KQotICAgICAgICAgICAgTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTVfTjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTI0X047Ci0gICAgfQorCWlmIChwQnNzLT5IdENhcGFiaWxpdHlMZW4gIT0gMCkgeworCQlpZiAoTmV0V29ya1R5cGUgPT0gTmRpczgwMl8xMU9GRE01KQorCQkJTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTVfTjsKKwkJZWxzZQorCQkJTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTI0X047CisJfQogCiAJcmV0dXJuIE5ldFdvcmtUeXBlOwogfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIENoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgcmVjZWl2ZWQgRUFQb0wgZnJhbWUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLAorICAgICAgICBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFBlZXJXcGFNZXNzYWdlU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgc3RydWN0IHJ0X2VhcG9sX3BhY2tldCAqIHBNc2csCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkJICAgICB1OCBNc2dUeXBlLCBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkpCit7CisJdTggbWljW0xFTl9LRVlfREVTQ19NSUNdLCBkaWdlc3RbODBdLCBLRVlEQVRBW01BWF9MRU5fT0ZfUlNOSUVdOworCUJPT0xFQU4gYlJlcGxheURpZmYgPSBGQUxTRTsKKwlCT09MRUFOIGJXUEEyID0gRkFMU0U7CisJc3RydWN0IHJ0X2tleV9pbmZvIEVhcG9sS2V5SW5mbzsKKwl1OCBHcm91cEtleUluZGV4ID0gMDsKKworCU5kaXNaZXJvTWVtb3J5KG1pYywgc2l6ZW9mKG1pYykpOworCU5kaXNaZXJvTWVtb3J5KGRpZ2VzdCwgc2l6ZW9mKGRpZ2VzdCkpOworCU5kaXNaZXJvTWVtb3J5KEtFWURBVEEsIHNpemVvZihLRVlEQVRBKSk7CisJTmRpc1plcm9NZW1vcnkoKHU4ICopJiBFYXBvbEtleUluZm8sIHNpemVvZihFYXBvbEtleUluZm8pKTsKKworCU5kaXNNb3ZlTWVtb3J5KCh1OCAqKSYgRWFwb2xLZXlJbmZvLAorCQkgICAgICAgKHU4ICopJiBwTXNnLT5LZXlEZXNjLktleUluZm8sIHNpemVvZihzdHJ1Y3QgcnRfa2V5X2luZm8pKTsKKworCSooKHUxNiAqKSAmIEVhcG9sS2V5SW5mbykgPSBjcHUybGUxNigqKCh1MTYgKikgJiBFYXBvbEtleUluZm8pKTsKKworCS8qIENob29zZSBXUEEyIG9yIG5vdCAqLworCWlmICgocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorCSAgICB8fCAocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwkJYldQQTIgPSBUUlVFOworCisJLyogMC4gQ2hlY2sgTXNnVHlwZSAqLworCWlmICgoTXNnVHlwZSA+IEVBUE9MX0dST1VQX01TR18yKSB8fCAoTXNnVHlwZSA8IEVBUE9MX1BBSVJfTVNHXzEpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiVGhlIG1lc3NhZ2UgdHlwZSBpcyBpbnZhbGlkKCVkKSEgXG4iLCBNc2dUeXBlKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLyogMS4gUmVwbGF5IGNvdW50ZXIgY2hlY2sgKi8KKwlpZiAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xIHx8IE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMyB8fCBNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKQkvKiBGb3Igc3VwcGxpY2FudCAqLworCXsKKwkJLyogRmlyc3QgdmFsaWRhdGUgcmVwbGF5IGNvdW50ZXIsIG9ubHkgYWNjZXB0IG1lc3NhZ2Ugd2l0aCBsYXJnZXIgcmVwbGF5IGNvdW50ZXIuICovCisJCS8qIExldCBlcXVhbCBwYXNzLCBzb21lIEFQIHN0YXJ0IHdpdGggYWxsIHplcm8gcmVwbGF5IGNvdW50ZXIgKi8KKwkJdTggWmVyb1JlcGxheVtMRU5fS0VZX0RFU0NfUkVQTEFZXTsKKworCQlOZGlzWmVyb01lbW9yeShaZXJvUmVwbGF5LCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKwkJaWYgKChSVE1QQ29tcGFyZU1lbW9yeQorCQkgICAgIChwTXNnLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBFbnRyeS0+Ul9Db3VudGVyLAorCQkgICAgICBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAxKQorCQkgICAgJiYKKwkJICAgIChSVE1QQ29tcGFyZU1lbW9yeQorCQkgICAgIChwTXNnLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIFplcm9SZXBsYXksCisJCSAgICAgIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDApKSB7CisJCQliUmVwbGF5RGlmZiA9IFRSVUU7CisJCX0KKwl9IGVsc2UgaWYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMiB8fCBNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzQgfHwgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMikJLyogRm9yIGF1dGhlbnRpY2F0b3IgKi8KKwl7CisJCS8qIGNoZWNrIFJlcGxheSBDb3VudGVyIGNvcmVzcG9uZHMgdG8gTVNHIGZyb20gYXV0aGVudGljYXRvciwgb3RoZXJ3aXNlIGRpc2NhcmQgKi8KKwkJaWYgKCFOZGlzRXF1YWxNZW1vcnkKKwkJICAgIChwTXNnLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBFbnRyeS0+Ul9Db3VudGVyLAorCQkgICAgIExFTl9LRVlfREVTQ19SRVBMQVkpKSB7CisJCQliUmVwbGF5RGlmZiA9IFRSVUU7CisJCX0KKwl9CisJLyogUmVwbGF5IENvdW50ZXIgZGlmZmVyZW50IGNvbmRpdGlvbiAqLworCWlmIChiUmVwbGF5RGlmZikgeworCQkvKiBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIHJlcGxheSBjb3VudGVyIGRpZmZlcmVudCAqLworCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLAorCQkJCQkgICAgICBJV19SRVBMQVlfQ09VTlRFUl9ESUZGX0VWRU5UX0ZMQUcsCisJCQkJCSAgICAgIHBFbnRyeS0+QWRkciwgcEVudHJ5LT5hcGlkeCwgMCk7CisKKwkJaWYgKE1zZ1R5cGUgPCBFQVBPTF9HUk9VUF9NU0dfMSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiUmVwbGF5IENvdW50ZXIgRGlmZmVyZW50IGluIHBhaXJ3aXNlIG1zZyAlZCBvZiA0LXdheSBoYW5kc2hha2UhXG4iLAorCQkJCSAgTXNnVHlwZSkpOworCQl9IGVsc2UgeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiUmVwbGF5IENvdW50ZXIgRGlmZmVyZW50IGluIGdyb3VwIG1zZyAlZCBvZiAyLXdheSBoYW5kc2hha2UhXG4iLAorCQkJCSAgKE1zZ1R5cGUgLSBFQVBPTF9QQUlSX01TR180KSkpOworCQl9CisKKwkJaGV4X2R1bXAoIlJlY2VpdmUgcmVwbGF5IGNvdW50ZXIgIiwgcE1zZy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLAorCQkJIExFTl9LRVlfREVTQ19SRVBMQVkpOworCQloZXhfZHVtcCgiQ3VycmVudCByZXBsYXkgY291bnRlciAiLCBwRW50cnktPlJfQ291bnRlciwKKwkJCSBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKiAyLiBWZXJpZnkgTUlDIGV4Y2VwdCBQYWlyd2lzZSBNc2cxICovCisJaWYgKE1zZ1R5cGUgIT0gRUFQT0xfUEFJUl9NU0dfMSkgeworCQl1OCByY3ZkX21pY1tMRU5fS0VZX0RFU0NfTUlDXTsKKworCQkvKiBSZWNvcmQgdGhlIHJlY2VpdmVkIE1JQyBmb3IgY2hlY2sgbGF0ZXIgKi8KKwkJTmRpc01vdmVNZW1vcnkocmN2ZF9taWMsIHBNc2ctPktleURlc2MuS2V5TWljLAorCQkJICAgICAgIExFTl9LRVlfREVTQ19NSUMpOworCQlOZGlzWmVyb01lbW9yeShwTXNnLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwkJaWYgKEVhcG9sS2V5SW5mby5LZXlEZXNjVmVyID09IERFU0NfVFlQRV9US0lQKQkvKiBUS0lQICovCisJCXsKKwkJCUhNQUNfTUQ1KHBFbnRyeS0+UFRLLCBMRU5fRUFQX01JQ0ssICh1OCAqKXBNc2csCisJCQkJIE1zZ0xlbiwgbWljLCBNRDVfRElHRVNUX1NJWkUpOworCQl9IGVsc2UgaWYgKEVhcG9sS2V5SW5mby5LZXlEZXNjVmVyID09IERFU0NfVFlQRV9BRVMpCS8qIEFFUyAqLworCQl7CisJCQlITUFDX1NIQTEocEVudHJ5LT5QVEssIExFTl9FQVBfTUlDSywgKHU4ICopcE1zZywKKwkJCQkgIE1zZ0xlbiwgZGlnZXN0LCBTSEExX0RJR0VTVF9TSVpFKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KG1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwkJfQorCisJCWlmICghTmRpc0VxdWFsTWVtb3J5KHJjdmRfbWljLCBtaWMsIExFTl9LRVlfREVTQ19NSUMpKSB7CisJCQkvKiBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIE1JQyBkaWZmZXJlbnQgKi8KKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLAorCQkJCQkJICAgICAgSVdfTUlDX0RJRkZfRVZFTlRfRkxBRywKKwkJCQkJCSAgICAgIHBFbnRyeS0+QWRkciwKKwkJCQkJCSAgICAgIHBFbnRyeS0+YXBpZHgsIDApOworCisJCQlpZiAoTXNnVHlwZSA8IEVBUE9MX0dST1VQX01TR18xKSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJCSAoIk1JQyBEaWZmZXJlbnQgaW4gcGFpcndpc2UgbXNnICVkIG9mIDQtd2F5IGhhbmRzaGFrZSFcbiIsCisJCQkJCSAgTXNnVHlwZSkpOworCQkJfSBlbHNlIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJICgiTUlDIERpZmZlcmVudCBpbiBncm91cCBtc2cgJWQgb2YgMi13YXkgaGFuZHNoYWtlIVxuIiwKKwkJCQkJICAoTXNnVHlwZSAtIEVBUE9MX1BBSVJfTVNHXzQpKSk7CisJCQl9CisKKwkJCWhleF9kdW1wKCJSZWNlaXZlZCBNSUMiLCByY3ZkX21pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJCQloZXhfZHVtcCgiRGVzaXJlZCAgTUlDIiwgbWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorCS8qIDEuIERlY3J5cHQgdGhlIEtleSBEYXRhIGZpZWxkIGlmIEdUSyBpcyBpbmNsdWRlZC4gKi8KKwkvKiAyLiBFeHRyYWN0IHRoZSBjb250ZXh0IG9mIHRoZSBLZXkgRGF0YSBmaWVsZCBpZiBpdCBleGlzdC4gKi8KKwkvKiBUaGUgZmllbGQgaW4gcGFpcndpc2VfbXNnXzJfV1BBMShXUEEyKSAmIHBhaXJ3aXNlX21zZ18zX1dQQTEgaXMgY2xlYXIuICovCisJLyogVGhlIGZpZWxkIGluIGdyb3VwX21zZ18xX1dQQTEoV1BBMikgJiBwYWlyd2lzZV9tc2dfM19XUEEyIGlzIGVuY3J5cHRlZC4gKi8KKwlpZiAoQ09OVl9BUlJBUllfVE9fdTE2KHBNc2ctPktleURlc2MuS2V5RGF0YUxlbikgPiAwKSB7CisJCS8qIERlY3J5cHQgdGhpcyBmaWVsZCAqLworCQlpZiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMyAmJiBiV1BBMikKKwkJICAgIHx8IChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkgeworCQkJaWYgKChFYXBvbEtleUluZm8uS2V5RGVzY1ZlciA9PSBERVNDX1RZUEVfQUVTKSkgeworCQkJCS8qIEFFUyAqLworCQkJCUFFU19HVEtfS0VZX1VOV1JBUCgmcEVudHJ5LT5QVEtbMTZdLCBLRVlEQVRBLAorCQkJCQkJICAgQ09OVl9BUlJBUllfVE9fdTE2KHBNc2ctPgorCQkJCQkJCQkJIEtleURlc2MuCisJCQkJCQkJCQkgS2V5RGF0YUxlbiksCisJCQkJCQkgICBwTXNnLT5LZXlEZXNjLktleURhdGEpOworCQkJfSBlbHNlIHsKKwkJCQlpbnQgaTsKKwkJCQl1OCBLZXlbMzJdOworCQkJCS8qIERlY3J5cHQgVEtJUCBHVEsgKi8KKwkJCQkvKiBDb25zdHJ1Y3QgMzIgYnl0ZXMgUkM0IEtleSAqLworCQkJCU5kaXNNb3ZlTWVtb3J5KEtleSwgcE1zZy0+S2V5RGVzYy5LZXlJdiwgMTYpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZLZXlbMTZdLCAmcEVudHJ5LT5QVEtbMTZdLCAxNik7CisJCQkJQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIEtleSwKKwkJCQkJICAgICAzMik7CisJCQkJLypkaXNjYXJkIGZpcnN0IDI1NiBieXRlcyAqLworCQkJCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJCQkJQVJDRk9VUl9CWVRFKCZwQWQtPlByaXZhdGVJbmZvLgorCQkJCQkJICAgICBXRVBDT05URVhUKTsKKwkJCQkvKiBEZWNyeXB0IEdUSy4gQmVjYXJlZnVsLCB0aGVyZSBpcyBubyBJQ1YgdG8gY2hlY2sgdGhlIHJlc3VsdCBpcyBjb3JyZWN0IG9yIG5vdCAqLworCQkJCUFSQ0ZPVVJfREVDUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULAorCQkJCQkJS0VZREFUQSwgcE1zZy0+S2V5RGVzYy5LZXlEYXRhLAorCQkJCQkJQ09OVl9BUlJBUllfVE9fdTE2KHBNc2ctPgorCQkJCQkJCQkgICAgICBLZXlEZXNjLgorCQkJCQkJCQkgICAgICBLZXlEYXRhTGVuKSk7CisJCQl9CisKKwkJCWlmICghYldQQTIgJiYgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKQorCQkJCUdyb3VwS2V5SW5kZXggPSBFYXBvbEtleUluZm8uS2V5SW5kZXg7CisKKwkJfSBlbHNlIGlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18yKQorCQkJICAgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMyAmJiAhYldQQTIpKSB7CisJCQlOZGlzTW92ZU1lbW9yeShLRVlEQVRBLCBwTXNnLT5LZXlEZXNjLktleURhdGEsCisJCQkJICAgICAgIENPTlZfQVJSQVJZX1RPX3UxNihwTXNnLT5LZXlEZXNjLgorCQkJCQkJCSAgICAgS2V5RGF0YUxlbikpOworCQl9IGVsc2UgeworCisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCisJCS8qIFBhcnNlIEtleSBEYXRhIGZpZWxkIHRvICovCisJCS8qIDEuIHZlcmlmeSBSU04gSUUgZm9yIHBhaXJ3aXNlX21zZ18yX1dQQTEoV1BBMikgLHBhaXJ3aXNlX21zZ18zX1dQQTEoV1BBMikgKi8KKwkJLyogMi4gdmVyaWZ5IEtERSBmb3JtYXQgZm9yIHBhaXJ3aXNlX21zZ18zX1dQQTIsIGdyb3VwX21zZ18xX1dQQTIgKi8KKwkJLyogMy4gdXBkYXRlIHNoYXJlZCBrZXkgZm9yIHBhaXJ3aXNlX21zZ18zX1dQQTIsIGdyb3VwX21zZ18xX1dQQTEoV1BBMikgKi8KKwkJaWYgKCFSVE1QUGFyc2VFYXBvbEtleURhdGEocEFkLCBLRVlEQVRBLAorCQkJCQkgICBDT05WX0FSUkFSWV9UT191MTYocE1zZy0+S2V5RGVzYy4KKwkJCQkJCQkJIEtleURhdGFMZW4pLAorCQkJCQkgICBHcm91cEtleUluZGV4LCBNc2dUeXBlLCBiV1BBMiwKKwkJCQkJICAgcEVudHJ5KSkgeworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorCisJcmV0dXJuIFRSVUU7CisKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9zeW5jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fc3luYy5jCmluZGV4IGE2ZTFiNmQuLmY4NDE5NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9zeW5jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3N5bmMuYwpAQCAtMjUsNyArMjUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogCU1vZHVsZSBOYW1lOgotCXN5bmMuYworCWNtbV9zeW5jLmMKIAogCUFic3RyYWN0OgogCkBAIC0zNiw0MiArMzYsNjIgQEAKICovCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCiAKLS8vIDIuNCBHaHogY2hhbm5lbCBwbGFuIGluZGV4IGluIHRoZSBUeFBvd2VyIGFycmF5cy4KLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fMF9TVEFSVAkwCQkJLy8gMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEKKy8qIDIuNCBHaHogY2hhbm5lbCBwbGFuIGluZGV4IGluIHRoZSBUeFBvd2VyIGFycmF5cy4gKi8KKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fMF9TVEFSVAkwCS8qIDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExICovCiAjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzBfU0laRQkxMQotI2RlZmluZQlCR19CQU5EX1JFR0lPTl8xX1NUQVJUCTAJCQkvLyAxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMworI2RlZmluZQlCR19CQU5EX1JFR0lPTl8xX1NUQVJUCTAJLyogMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMgKi8KICNkZWZpbmUJQkdfQkFORF9SRUdJT05fMV9TSVpFCTEzCi0jZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzJfU1RBUlQJOQkJCS8vIDEwLDExCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzJfU1RBUlQJOQkvKiAxMCwxMSAqLwogI2RlZmluZQlCR19CQU5EX1JFR0lPTl8yX1NJWkUJMgotI2RlZmluZQlCR19CQU5EX1JFR0lPTl8zX1NUQVJUCTkJCQkvLyAxMCwxMSwxMiwxMworI2RlZmluZQlCR19CQU5EX1JFR0lPTl8zX1NUQVJUCTkJLyogMTAsMTEsMTIsMTMgKi8KICNkZWZpbmUJQkdfQkFORF9SRUdJT05fM19TSVpFCTQKLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fNF9TVEFSVAkxMwkJCS8vIDE0CisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzRfU1RBUlQJMTMJLyogMTQgKi8KICNkZWZpbmUJQkdfQkFORF9SRUdJT05fNF9TSVpFCTEKLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fNV9TVEFSVAkwCQkJLy8gMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fNV9TVEFSVAkwCS8qIDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0ICovCiAjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzVfU0laRQkxNAotI2RlZmluZQlCR19CQU5EX1JFR0lPTl82X1NUQVJUCTIJCQkvLyAzLDQsNSw2LDcsOCw5CisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzZfU1RBUlQJMgkvKiAzLDQsNSw2LDcsOCw5ICovCiAjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzZfU0laRQk3Ci0jZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzdfU1RBUlQJNAkJCS8vIDUsNiw3LDgsOSwxMCwxMSwxMiwxMworI2RlZmluZQlCR19CQU5EX1JFR0lPTl83X1NUQVJUCTQJLyogNSw2LDcsOCw5LDEwLDExLDEyLDEzICovCiAjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzdfU0laRQk5Ci0jZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzMxX1NUQVJUCTAJCQkvLyAxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNAorI2RlZmluZQlCR19CQU5EX1JFR0lPTl8zMV9TVEFSVAkwCS8qIDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0ICovCiAjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzMxX1NJWkUJMTQKIAotLy8gNSBHaHogY2hhbm5lbCBwbGFuIGluZGV4IGluIHRoZSBUeFBvd2VyIGFycmF5cy4KLVVDSEFSIEFfQkFORF9SRUdJT05fMF9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzFfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDB9OwotVUNIQVIgQV9CQU5EX1JFR0lPTl8yX0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjR9OwotVUNIQVIgQV9CQU5EX1JFR0lPTl8zX0NIQU5ORUxfTElTVFtdPXs1MiwgNTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxfTsKLVVDSEFSIEFfQkFORF9SRUdJT05fNF9DSEFOTkVMX0xJU1RbXT17MTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9OwotVUNIQVIgQV9CQU5EX1JFR0lPTl81X0NIQU5ORUxfTElTVFtdPXsxNDksIDE1MywgMTU3LCAxNjF9OwotVUNIQVIgQV9CQU5EX1JFR0lPTl82X0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OH07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzdfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fTsKLVVDSEFSIEFfQkFORF9SRUdJT05fOF9DSEFOTkVMX0xJU1RbXT17NTIsIDU2LCA2MCwgNjR9OwotVUNIQVIgQV9CQU5EX1JFR0lPTl85X0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzEwX0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9OwotVUNIQVIgQV9CQU5EX1JFR0lPTl8xMV9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxNDksIDE1MywgMTU3LCAxNjF9OworLyogNSBHaHogY2hhbm5lbCBwbGFuIGluZGV4IGluIHRoZSBUeFBvd2VyIGFycmF5cy4gKi8KK3U4IEFfQkFORF9SRUdJT05fMF9DSEFOTkVMX0xJU1RbXSA9CisgICAgeyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1IH07Cit1OCBBX0JBTkRfUkVHSU9OXzFfQ0hBTk5FTF9MSVNUW10gPQorICAgIHsgMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwKKzEzMiwgMTM2LCAxNDAgfTsKK3U4IEFfQkFORF9SRUdJT05fMl9DSEFOTkVMX0xJU1RbXSA9IHsgMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0IH07Cit1OCBBX0JBTkRfUkVHSU9OXzNfQ0hBTk5FTF9MSVNUW10gPSB7IDUyLCA1NiwgNjAsIDY0LCAxNDksIDE1MywgMTU3LCAxNjEgfTsKK3U4IEFfQkFORF9SRUdJT05fNF9DSEFOTkVMX0xJU1RbXSA9IHsgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUgfTsKK3U4IEFfQkFORF9SRUdJT05fNV9DSEFOTkVMX0xJU1RbXSA9IHsgMTQ5LCAxNTMsIDE1NywgMTYxIH07Cit1OCBBX0JBTkRfUkVHSU9OXzZfQ0hBTk5FTF9MSVNUW10gPSB7IDM2LCA0MCwgNDQsIDQ4IH07Cit1OCBBX0JBTkRfUkVHSU9OXzdfQ0hBTk5FTF9MSVNUW10gPQorICAgIHsgMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwKKzEzMiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1LCAxNjksIDE3MyB9OwordTggQV9CQU5EX1JFR0lPTl84X0NIQU5ORUxfTElTVFtdID0geyA1MiwgNTYsIDYwLCA2NCB9OwordTggQV9CQU5EX1JFR0lPTl85X0NIQU5ORUxfTElTVFtdID0KKyAgICB7IDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEzMiwgMTM2LCAxNDAsCisxNDksIDE1MywgMTU3LCAxNjEsIDE2NSB9OwordTggQV9CQU5EX1JFR0lPTl8xMF9DSEFOTkVMX0xJU1RbXSA9CisgICAgeyAzNiwgNDAsIDQ0LCA0OCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUgfTsKK3U4IEFfQkFORF9SRUdJT05fMTFfQ0hBTk5FTF9MSVNUW10gPQorICAgIHsgMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxNDksIDE1MywKKzE1NywgMTYxIH07Cit1OCBBX0JBTkRfUkVHSU9OXzEyX0NIQU5ORUxfTElTVFtdID0KKyAgICB7IDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsCisxMzIsIDEzNiwgMTQwIH07Cit1OCBBX0JBTkRfUkVHSU9OXzEzX0NIQU5ORUxfTElTVFtdID0KKyAgICB7IDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MCwKKzE0OSwgMTUzLCAxNTcsIDE2MSB9OwordTggQV9CQU5EX1JFR0lPTl8xNF9DSEFOTkVMX0xJU1RbXSA9CisgICAgeyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMzYsIDE0MCwgMTQ5LAorMTUzLCAxNTcsIDE2MSwgMTY1IH07Cit1OCBBX0JBTkRfUkVHSU9OXzE1X0NIQU5ORUxfTElTVFtdID0geyAxNDksIDE1MywgMTU3LCAxNjEsIDE2NSwgMTY5LCAxNzMgfTsKIAotLy9CYVNpemVBcnJheSBmb2xsb3dzIHRoZSA4MDIuMTFuIGRlZmluaXRpb24gYXMgTWF4UnhGYWN0b3IuICAyXigxMytmYWN0b3IpIGJ5dGVzLiBXaGVuIGZhY3RvciA9MCwgaXQncyBhYm91dCBCYSBidWZmZXIgc2l6ZSA9OC4KLVVDSEFSIEJhU2l6ZUFycmF5WzRdID0gezgsMTYsMzIsNjR9OworLypCYVNpemVBcnJheSBmb2xsb3dzIHRoZSA4MDIuMTFuIGRlZmluaXRpb24gYXMgTWF4UnhGYWN0b3IuICAyXigxMytmYWN0b3IpIGJ5dGVzLiBXaGVuIGZhY3RvciA9MCwgaXQncyBhYm91dCBCYSBidWZmZXIgc2l6ZSA9OC4gKi8KK3U4IEJhU2l6ZUFycmF5WzRdID0geyA4LCAxNiwgMzIsIDY0IH07CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTg1LDE1NSArMTA1LDI0MyBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBCdWlsZENoYW5uZWxMaXN0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQordm9pZCBCdWlsZENoYW5uZWxMaXN0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlVQ0hBUiBpLCBqLCBpbmRleD0wLCBudW09MDsKLQlQVUNIQVIJcENoYW5uZWxMaXN0ID0gTlVMTDsKKwl1OCBpLCBqLCBpbmRleCA9IDAsIG51bSA9IDA7CisJdTggKnBDaGFubmVsTGlzdCA9IE5VTEw7CiAKLQlOZGlzWmVyb01lbW9yeShwQWQtPkNoYW5uZWxMaXN0LCBNQVhfTlVNX09GX0NIQU5ORUxTICogc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpKTsKKwlOZGlzWmVyb01lbW9yeShwQWQtPkNoYW5uZWxMaXN0LAorCQkgICAgICAgTUFYX05VTV9PRl9DSEFOTkVMUyAqIHNpemVvZihzdHJ1Y3QgcnRfY2hhbm5lbF90eF9wb3dlcikpOwogCi0JLy8gaWYgbm90IDExYS1vbmx5IG1vZGUsIGNoYW5uZWwgbGlzdCBzdGFydHMgZnJvbSAyLjRHaHogYmFuZAorCS8qIGlmIG5vdCAxMWEtb25seSBtb2RlLCBjaGFubmVsIGxpc3Qgc3RhcnRzIGZyb20gMi40R2h6IGJhbmQgKi8KIAlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgIT0gUEhZXzExQSkKLQkJJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgIT0gUEhZXzExQU5fTUlYRUQpICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlICE9IFBIWV8xMU5fNUcpCi0JKQotCXsKLQkJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICAmIDB4N2YpCi0JCXsKLQkJCWNhc2UgUkVHSU9OXzBfQkdfQkFORDoJLy8gMSAtMTEKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fMF9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzBfU0laRSk7Ci0JCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fMF9TSVpFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fMV9CR19CQU5EOgkvLyAxIC0gMTMKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fMV9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzFfU0laRSk7Ci0JCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fMV9TSVpFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fMl9CR19CQU5EOgkvLyAxMCAtIDExCi0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzJfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl8yX1NJWkUpOwotCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzJfU0laRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzNfQkdfQkFORDoJLy8gMTAgLSAxMwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl8zX1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fM19TSVpFKTsKLQkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8zX1NJWkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl80X0JHX0JBTkQ6CS8vIDE0Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzRfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl80X1NJWkUpOwotCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzRfU0laRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzVfQkdfQkFORDoJLy8gMSAtIDE0Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzVfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl81X1NJWkUpOwotCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzVfU0laRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzZfQkdfQkFORDoJLy8gMyAtIDkKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fNl9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzZfU0laRSk7Ci0JCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fNl9TSVpFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fN19CR19CQU5EOiAgLy8gNSAtIDEzCi0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzdfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl83X1NJWkUpOwotCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzdfU0laRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzMxX0JHX0JBTkQ6CS8vIDEgLSAxNAotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl8zMV9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzMxX1NJWkUpOwotCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzMxX1NJWkU7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OiAgICAgICAgICAgIC8vIEVycm9yLiBzaG91bGQgbmV2ZXIgaGFwcGVuCi0JCQkJYnJlYWs7CisJICAgICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlICE9IFBIWV8xMUFOX01JWEVEKQorCSAgICAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSAhPSBQSFlfMTFOXzVHKQorCSAgICApIHsKKwkJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICYgMHg3ZikgeworCQljYXNlIFJFR0lPTl8wX0JHX0JBTkQ6CS8qIDEgLTExICovCisJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sCisJCQkJICAgICAgICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fMF9TVEFSVF0sCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfY2hhbm5lbF90eF9wb3dlcikgKgorCQkJCSAgICAgICBCR19CQU5EX1JFR0lPTl8wX1NJWkUpOworCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fMF9TSVpFOworCQkJYnJlYWs7CisJCWNhc2UgUkVHSU9OXzFfQkdfQkFORDoJLyogMSAtIDEzICovCisJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sCisJCQkJICAgICAgICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fMV9TVEFSVF0sCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfY2hhbm5lbF90eF9wb3dlcikgKgorCQkJCSAgICAgICBCR19CQU5EX1JFR0lPTl8xX1NJWkUpOworCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fMV9TSVpFOworCQkJYnJlYWs7CisJCWNhc2UgUkVHSU9OXzJfQkdfQkFORDoJLyogMTAgLSAxMSAqLworCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLAorCQkJCSAgICAgICAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzJfU1RBUlRdLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2NoYW5uZWxfdHhfcG93ZXIpICoKKwkJCQkgICAgICAgQkdfQkFORF9SRUdJT05fMl9TSVpFKTsKKwkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzJfU0laRTsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl8zX0JHX0JBTkQ6CS8qIDEwIC0gMTMgKi8KKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwKKwkJCQkgICAgICAgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl8zX1NUQVJUXSwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9jaGFubmVsX3R4X3Bvd2VyKSAqCisJCQkJICAgICAgIEJHX0JBTkRfUkVHSU9OXzNfU0laRSk7CisJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8zX1NJWkU7CisJCQlicmVhazsKKwkJY2FzZSBSRUdJT05fNF9CR19CQU5EOgkvKiAxNCAqLworCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLAorCQkJCSAgICAgICAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzRfU1RBUlRdLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2NoYW5uZWxfdHhfcG93ZXIpICoKKwkJCQkgICAgICAgQkdfQkFORF9SRUdJT05fNF9TSVpFKTsKKwkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzRfU0laRTsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl81X0JHX0JBTkQ6CS8qIDEgLSAxNCAqLworCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLAorCQkJCSAgICAgICAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzVfU1RBUlRdLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2NoYW5uZWxfdHhfcG93ZXIpICoKKwkJCQkgICAgICAgQkdfQkFORF9SRUdJT05fNV9TSVpFKTsKKwkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzVfU0laRTsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl82X0JHX0JBTkQ6CS8qIDMgLSA5ICovCisJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sCisJCQkJICAgICAgICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fNl9TVEFSVF0sCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfY2hhbm5lbF90eF9wb3dlcikgKgorCQkJCSAgICAgICBCR19CQU5EX1JFR0lPTl82X1NJWkUpOworCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fNl9TSVpFOworCQkJYnJlYWs7CisJCWNhc2UgUkVHSU9OXzdfQkdfQkFORDoJLyogNSAtIDEzICovCisJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sCisJCQkJICAgICAgICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fN19TVEFSVF0sCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfY2hhbm5lbF90eF9wb3dlcikgKgorCQkJCSAgICAgICBCR19CQU5EX1JFR0lPTl83X1NJWkUpOworCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fN19TSVpFOworCQkJYnJlYWs7CisJCWNhc2UgUkVHSU9OXzMxX0JHX0JBTkQ6CS8qIDEgLSAxNCAqLworCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLAorCQkJCSAgICAgICAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzMxX1NUQVJUXSwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9jaGFubmVsX3R4X3Bvd2VyKSAqCisJCQkJICAgICAgIEJHX0JBTkRfUkVHSU9OXzMxX1NJWkUpOworCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fMzFfU0laRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgkvKiBFcnJvci4gc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQkJYnJlYWs7CiAJCX0KLQkJZm9yIChpPTA7IGk8aW5kZXg7IGkrKykKKwkJZm9yIChpID0gMDsgaSA8IGluZGV4OyBpKyspCiAJCQlwQWQtPkNoYW5uZWxMaXN0W2ldLk1heFR4UHdyID0gMjA7CiAJfQogCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUEpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR19NSVhFRCkKLQkJfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQU5fTUlYRUQpCi0JCXx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFHTl9NSVhFRCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl81RykKLQkpCi0JewotCQlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCAmIDB4N2YpCi0JCXsKLQkJCWNhc2UgUkVHSU9OXzBfQV9CQU5EOgotCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzBfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMF9DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl8xX0FfQkFORDoKLQkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8xX0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKLQkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzFfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fMl9BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMl9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8yX0NIQU5ORUxfTElTVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzNfQV9CQU5EOgotCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzNfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fM19DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl80X0FfQkFORDoKLQkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl80X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKLQkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzRfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fNV9BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fNV9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl81X0NIQU5ORUxfTElTVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzZfQV9CQU5EOgotCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzZfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fNl9DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl83X0FfQkFORDoKLQkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl83X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKLQkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzdfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fOF9BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fOF9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl84X0NIQU5ORUxfTElTVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzlfQV9CQU5EOgotCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzlfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fOV9DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7CisJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUEpCisJICAgIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR19NSVhFRCkKKwkgICAgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRCkKKwkgICAgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQU5fTUlYRUQpCisJICAgIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFHTl9NSVhFRCkKKwkgICAgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl81RykKKwkgICAgKSB7CisJCXN3aXRjaCAocEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kICYgMHg3ZikgeworCQljYXNlIFJFR0lPTl8wX0FfQkFORDoKKwkJCW51bSA9CisJCQkgICAgc2l6ZW9mKEFfQkFORF9SRUdJT05fMF9DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8wX0NIQU5ORUxfTElTVDsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl8xX0FfQkFORDoKKwkJCW51bSA9CisJCQkgICAgc2l6ZW9mKEFfQkFORF9SRUdJT05fMV9DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xX0NIQU5ORUxfTElTVDsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl8yX0FfQkFORDoKKwkJCW51bSA9CisJCQkgICAgc2l6ZW9mKEFfQkFORF9SRUdJT05fMl9DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8yX0NIQU5ORUxfTElTVDsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl8zX0FfQkFORDoKKwkJCW51bSA9CisJCQkgICAgc2l6ZW9mKEFfQkFORF9SRUdJT05fM19DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8zX0NIQU5ORUxfTElTVDsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl80X0FfQkFORDoKKwkJCW51bSA9CisJCQkgICAgc2l6ZW9mKEFfQkFORF9SRUdJT05fNF9DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl80X0NIQU5ORUxfTElTVDsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl81X0FfQkFORDoKKwkJCW51bSA9CisJCQkgICAgc2l6ZW9mKEFfQkFORF9SRUdJT05fNV9DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl81X0NIQU5ORUxfTElTVDsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl82X0FfQkFORDoKKwkJCW51bSA9CisJCQkgICAgc2l6ZW9mKEFfQkFORF9SRUdJT05fNl9DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl82X0NIQU5ORUxfTElTVDsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl83X0FfQkFORDoKKwkJCW51bSA9CisJCQkgICAgc2l6ZW9mKEFfQkFORF9SRUdJT05fN19DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl83X0NIQU5ORUxfTElTVDsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl84X0FfQkFORDoKKwkJCW51bSA9CisJCQkgICAgc2l6ZW9mKEFfQkFORF9SRUdJT05fOF9DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl84X0NIQU5ORUxfTElTVDsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl85X0FfQkFORDoKKwkJCW51bSA9CisJCQkgICAgc2l6ZW9mKEFfQkFORF9SRUdJT05fOV9DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl85X0NIQU5ORUxfTElTVDsKKwkJCWJyZWFrOwogCi0JCQljYXNlIFJFR0lPTl8xMF9BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMTBfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMTBfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOworCQljYXNlIFJFR0lPTl8xMF9BX0JBTkQ6CisJCQludW0gPQorCQkJICAgIHNpemVvZihBX0JBTkRfUkVHSU9OXzEwX0NIQU5ORUxfTElTVCkgLworCQkJICAgIHNpemVvZih1OCk7CisJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzEwX0NIQU5ORUxfTElTVDsKKwkJCWJyZWFrOwogCi0JCQljYXNlIFJFR0lPTl8xMV9BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMTFfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMTFfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OiAgICAgICAgICAgIC8vIEVycm9yLiBzaG91bGQgbmV2ZXIgaGFwcGVuCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwoImNvdW50cnlyZWdpb249JWQgbm90IHN1cHBvcnQiLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQpKTsKLQkJCQlicmVhazsKKwkJY2FzZSBSRUdJT05fMTFfQV9CQU5EOgorCQkJbnVtID0KKwkJCSAgICBzaXplb2YoQV9CQU5EX1JFR0lPTl8xMV9DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xMV9DSEFOTkVMX0xJU1Q7CisJCQlicmVhazsKKwkJY2FzZSBSRUdJT05fMTJfQV9CQU5EOgorCQkJbnVtID0KKwkJCSAgICBzaXplb2YoQV9CQU5EX1JFR0lPTl8xMl9DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xMl9DSEFOTkVMX0xJU1Q7CisJCQlicmVhazsKKwkJY2FzZSBSRUdJT05fMTNfQV9CQU5EOgorCQkJbnVtID0KKwkJCSAgICBzaXplb2YoQV9CQU5EX1JFR0lPTl8xM19DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xM19DSEFOTkVMX0xJU1Q7CisJCQlicmVhazsKKwkJY2FzZSBSRUdJT05fMTRfQV9CQU5EOgorCQkJbnVtID0KKwkJCSAgICBzaXplb2YoQV9CQU5EX1JFR0lPTl8xNF9DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xNF9DSEFOTkVMX0xJU1Q7CisJCQlicmVhazsKKwkJY2FzZSBSRUdJT05fMTVfQV9CQU5EOgorCQkJbnVtID0KKwkJCSAgICBzaXplb2YoQV9CQU5EX1JFR0lPTl8xNV9DSEFOTkVMX0xJU1QpIC8KKwkJCSAgICBzaXplb2YodTgpOworCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xNV9DSEFOTkVMX0xJU1Q7CisJCQlicmVhazsKKwkJZGVmYXVsdDoJLyogRXJyb3IuIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sCisJCQkJICgiY291bnRyeXJlZ2lvbj0lZCBub3Qgc3VwcG9ydCIsCisJCQkJICBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQpKTsKKwkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKG51bSAhPSAwKQotCQl7Ci0JCQlVQ0hBUiBSYWRhckNoWzE1XT17NTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwfTsKLQkJCWZvciAoaT0wOyBpPG51bTsgaSsrKQotCQkJewotCQkJCWZvciAoaj0wOyBqPE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGorKykKLQkJCQl7Ci0JCQkJCWlmIChwQ2hhbm5lbExpc3RbaV0gPT0gcEFkLT5UeFBvd2VyW2pdLkNoYW5uZWwpCi0JCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleCtpXSwgJnBBZC0+VHhQb3dlcltqXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpKTsKLQkJCQkJfQotCQkJCWZvciAoaj0wOyBqPDE1OyBqKyspCi0JCQkJewotCQkJCQlpZiAocENoYW5uZWxMaXN0W2ldID09IFJhZGFyQ2hbal0pCi0JCQkJCQlwQWQtPkNoYW5uZWxMaXN0W2luZGV4K2ldLkRmc1JlcSA9IFRSVUU7CisJCWlmIChudW0gIT0gMCkgeworCQkJdTggUmFkYXJDaFsxNV0gPQorCQkJICAgIHsgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwKKwkJICAgIDEyOCwgMTMyLCAxMzYsIDE0MCB9OworCQkJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCQkJZm9yIChqID0gMDsgaiA8IE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGorKykgeworCQkJCQlpZiAocENoYW5uZWxMaXN0W2ldID09CisJCQkJCSAgICBwQWQtPlR4UG93ZXJbal0uQ2hhbm5lbCkKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPgorCQkJCQkJCSAgICAgICBDaGFubmVsTGlzdFtpbmRleAorCQkJCQkJCQkJICAgKyBpXSwKKwkJCQkJCQkgICAgICAgJnBBZC0+VHhQb3dlcltqXSwKKwkJCQkJCQkgICAgICAgc2l6ZW9mCisJCQkJCQkJICAgICAgIChzdHJ1Y3QgcnRfY2hhbm5lbF90eF9wb3dlcikpOwogCQkJCX0KLQkJCQlwQWQtPkNoYW5uZWxMaXN0W2luZGV4K2ldLk1heFR4UHdyID0gMjA7CisJCQkJZm9yIChqID0gMDsgaiA8IDE1OyBqKyspIHsKKwkJCQkJaWYgKHBDaGFubmVsTGlzdFtpXSA9PSBSYWRhckNoW2pdKQorCQkJCQkJcEFkLT5DaGFubmVsTGlzdFtpbmRleCArCisJCQkJCQkJCSBpXS5EZnNSZXEgPQorCQkJCQkJICAgIFRSVUU7CisJCQkJfQorCQkJCXBBZC0+Q2hhbm5lbExpc3RbaW5kZXggKyBpXS5NYXhUeFB3ciA9IDIwOwogCQkJfQogCQkJaW5kZXggKz0gbnVtOwogCQl9CiAJfQogCiAJcEFkLT5DaGFubmVsTGlzdE51bSA9IGluZGV4OwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiY291bnRyeSBjb2RlPSVkLyVkLCBSRklDPSVkLCBQSFkgbW9kZT0lZCwgc3VwcG9ydCAlZCBjaGFubmVsc1xuIiwKLQkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kLCBwQWQtPlJmSWNUeXBlLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlLCBwQWQtPkNoYW5uZWxMaXN0TnVtKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoImNvdW50cnkgY29kZT0lZC8lZCwgUkZJQz0lZCwgUEhZIG1vZGU9JWQsIHN1cHBvcnQgJWQgY2hhbm5lbHNcbiIsCisJCSAgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiwKKwkJICBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQsIHBBZC0+UmZJY1R5cGUsCisJCSAgcEFkLT5Db21tb25DZmcuUGh5TW9kZSwgcEFkLT5DaGFubmVsTGlzdE51bSkpOwogI2lmZGVmIERCRwotCWZvciAoaT0wO2k8cEFkLT5DaGFubmVsTGlzdE51bTtpKyspCi0JewotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJCdWlsZENoYW5uZWwgIyAlZCA6OiBQd3IwID0gJWQsIFB3cjEgPSVkLCBcbiAiLCBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3RbaV0uUG93ZXIsIHBBZC0+Q2hhbm5lbExpc3RbaV0uUG93ZXIyKSk7CisJZm9yIChpID0gMDsgaSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykgeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkgICAgICgiQnVpbGRDaGFubmVsICMgJWQgOjogUHdyMCA9ICVkLCBQd3IxID0lZCwgXG4gIiwKKwkJCSAgICAgIHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCwKKwkJCSAgICAgIHBBZC0+Q2hhbm5lbExpc3RbaV0uUG93ZXIsCisJCQkgICAgICBwQWQtPkNoYW5uZWxMaXN0W2ldLlBvd2VyMikpOwogCX0KICNlbmRpZgogfQpAQCAtMjUxLDggKzM1OSw3IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1VQ0hBUiBGaXJzdENoYW5uZWwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCit1OCBGaXJzdENoYW5uZWwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewogCXJldHVybiBwQWQtPkNoYW5uZWxMaXN0WzBdLkNoYW5uZWw7CiB9CkBAIC0yNjgsMTkgKzM3NSwxNiBAQAogCQlyZXR1cm4gMCBpZiBubyBtb3JlIG5leHQgY2hhbm5lbAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVVDSEFSIE5leHRDaGFubmVsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSIGNoYW5uZWwpCit1OCBOZXh0Q2hhbm5lbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IGNoYW5uZWwpCiB7CiAJaW50IGk7Ci0JVUNIQVIgbmV4dF9jaGFubmVsID0gMDsKKwl1OCBuZXh0X2NoYW5uZWwgPSAwOwogCiAJZm9yIChpID0gMDsgaSA8IChwQWQtPkNoYW5uZWxMaXN0TnVtIC0gMSk7IGkrKykKLQkJaWYgKGNoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQotCQl7Ci0JCQluZXh0X2NoYW5uZWwgPSBwQWQtPkNoYW5uZWxMaXN0W2krMV0uQ2hhbm5lbDsKKwkJaWYgKGNoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKSB7CisJCQluZXh0X2NoYW5uZWwgPSBwQWQtPkNoYW5uZWxMaXN0W2kgKyAxXS5DaGFubmVsOwogCQkJYnJlYWs7Ci0JfQorCQl9CiAJcmV0dXJuIG5leHRfY2hhbm5lbDsKIH0KIApAQCAtMzA0LDE2ICs0MDgsMTUgQEAKIAkJdGhlIG1pbmltdW0gdmFsdWUgb3IgbmV4dCBsb3dlciB2YWx1ZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIENoYW5nZVRvQ2VsbFBvd2VyTGltaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgICAgICAgICBBaXJvbmV0Q2VsbFBvd2VyTGltaXQpCit2b2lkIENoYW5nZVRvQ2VsbFBvd2VyTGltaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHU4IEFpcm9uZXRDZWxsUG93ZXJMaW1pdCkKIHsKLQkvL3ZhbHVkIDB4RkYgbWVhbnMgdGhhdCBoYXNuJ3QgZm91bmQgcG93ZXIgbGltaXQgaW5mb3JtYXRpb24KLQkvL2Zyb20gdGhlIEFQJ3MgQmVhY29uL1Byb2JlIHJlc3BvbnNlLgorCS8qdmFsdWQgMHhGRiBtZWFucyB0aGF0IGhhc24ndCBmb3VuZCBwb3dlciBsaW1pdCBpbmZvcm1hdGlvbiAqLworCS8qZnJvbSB0aGUgQVAncyBCZWFjb24vUHJvYmUgcmVzcG9uc2UuICovCiAJaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA9PSAweEZGKQogCQlyZXR1cm47CiAKLQlpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0IDwgNikgLy9Vc2VkIExvd2VzdCBQb3dlciBQZXJjZW50YWdlLgorCWlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPCA2KQkvKlVzZWQgTG93ZXN0IFBvd2VyIFBlcmNlbnRhZ2UuICovCiAJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gNjsKIAllbHNlIGlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPCA5KQogCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDEwOwpAQCAtMzI0LDQ1ICs0MjcsNDAgQEAKIAllbHNlIGlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPCAxNSkKIAkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSA3NTsKIAllbHNlCi0JCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gMTAwOyAvL2Vsc2UgdXNlZCBtYXhpbXVtCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gMTAwOwkvKmVsc2UgdXNlZCBtYXhpbXVtICovCiAKIAlpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCkKLQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdDsKKwkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPQorCQkgICAgcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7CiAKIH0KIAotQ0hBUglDb252ZXJ0VG9Sc3NpKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOCUNIQVIJCQlSc3NpLAotCUlOICBVQ0hBUiAgIFJzc2lOdW1iZXIpCitjaGFyIENvbnZlcnRUb1Jzc2koc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBjaGFyIFJzc2ksIHU4IFJzc2lOdW1iZXIpCiB7Ci0JVUNIQVIJUnNzaU9mZnNldCwgTE5BR2FpbjsKKwl1OCBSc3NpT2Zmc2V0LCBMTkFHYWluOwogCi0JLy8gUnNzaSBlcXVhbHMgdG8gemVybyBzaG91bGQgYmUgYW4gaW52YWxpZCB2YWx1ZQorCS8qIFJzc2kgZXF1YWxzIHRvIHplcm8gc2hvdWxkIGJlIGFuIGludmFsaWQgdmFsdWUgKi8KIAlpZiAoUnNzaSA9PSAwKQogCQlyZXR1cm4gLTk5OwogCiAJTE5BR2FpbiA9IEdFVF9MTkFfR0FJTihwQWQpOwotICAgIGlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkKLSAgICB7Ci0gICAgICAgIGlmIChSc3NpTnVtYmVyID09IDApCisJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KSB7CisJCWlmIChSc3NpTnVtYmVyID09IDApCiAJCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDA7CiAJCWVsc2UgaWYgKFJzc2lOdW1iZXIgPT0gMSkKIAkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MTsKIAkJZWxzZQogCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoUnNzaU51bWJlciA9PSAwKQorCX0gZWxzZSB7CisJCWlmIChSc3NpTnVtYmVyID09IDApCiAJCQlSc3NpT2Zmc2V0ID0gcEFkLT5CR1Jzc2lPZmZzZXQwOwogCQllbHNlIGlmIChSc3NpTnVtYmVyID09IDEpCiAJCQlSc3NpT2Zmc2V0ID0gcEFkLT5CR1Jzc2lPZmZzZXQxOwogCQllbHNlCiAJCQlSc3NpT2Zmc2V0ID0gcEFkLT5CR1Jzc2lPZmZzZXQyOwotICAgIH0KKwl9CiAKLSAgICByZXR1cm4gKC0xMiAtIFJzc2lPZmZzZXQgLSBMTkFHYWluIC0gUnNzaSk7CisJcmV0dXJuICgtMTIgLSBSc3NpT2Zmc2V0IC0gTE5BR2FpbiAtIFJzc2kpOwogfQogCiAvKgpAQCAtMzcxLDYzICs0NjksNzUgQEAKIAkJU2NhbiBuZXh0IGNoYW5uZWwKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIFNjYW5OZXh0Q2hhbm5lbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3ZvaWQgU2Nhbk5leHRDaGFubmVsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlIRUFERVJfODAyXzExICAgSGRyODAyMTE7Ci0JUFVDSEFSICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOwotCVVMT05HICAgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0JVUNIQVIgICAgICAgICAgIFNzaWRMZW4gPSAwLCBTY2FuVHlwZSA9IHBBZC0+TWxtZUF1eC5TY2FuVHlwZSwgQkJQVmFsdWUgPSAwOwotCVVTSE9SVCAgICAgICAgICBTdGF0dXM7Ci0JUEhFQURFUl84MDJfMTEgIHBIZHI4MDIxMTsKLQlVSU5UCQkJU2NhblRpbWVJbjVnQ2hhbm5lbCA9IFNIT1JUX0NIQU5ORUxfVElNRTsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBIZHI4MDIxMTsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJaW50IE5TdGF0dXM7CisJdW5zaWduZWQgbG9uZyBGcmFtZUxlbiA9IDA7CisJdTggU3NpZExlbiA9IDAsIFNjYW5UeXBlID0gcEFkLT5NbG1lQXV4LlNjYW5UeXBlLCBCQlBWYWx1ZSA9IDA7CisJdTE2IFN0YXR1czsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBIZHI4MDIxMTsKKwl1MzIgU2NhblRpbWVJbjVnQ2hhbm5lbCA9IFNIT1JUX0NIQU5ORUxfVElNRTsKIAotCWlmIChNT05JVE9SX09OKHBBZCkpCi0JCXJldHVybjsKLQotCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA9PSAwKQogCXsKKwkJaWYgKE1PTklUT1JfT04ocEFkKSkKKwkJCXJldHVybjsKKwl9CisKKwlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPT0gMCkgewogCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkKLQkJCSYmIChJTkZSQV9PTihwQWQpCi0JCQkJfHwgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkpCi0JCQkpCi0JCXsKLQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkJICAgICYmIChJTkZSQV9PTihwQWQpCisJCQl8fCAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKSkKKwkJICAgICkgeworCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwKKwkJCQkJICBGQUxTRSk7CiAJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CiAJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CiAJCQlCQlBWYWx1ZSAmPSAofjB4MTgpOwogCQkJQkJQVmFsdWUgfD0gMHgxMDsKIAkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBFbmQgb2YgU0NBTiwgcmVzdG9yZSB0byA0ME1IeiBjaGFubmVsICVkLCBUb3RhbCBCU1NbJTAyZF1cbiIscEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIHBBZC0+U2NhblRhYi5Cc3NOcikpOwotCQl9Ci0JCWVsc2UKLQkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiU1lOQyAtIEVuZCBvZiBTQ0FOLCByZXN0b3JlIHRvIDQwTUh6IGNoYW5uZWwgJWQsIFRvdGFsIEJTU1slMDJkXVxuIiwKKwkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLAorCQkJCSAgcEFkLT5TY2FuVGFiLkJzc05yKSk7CisJCX0gZWxzZSB7CiAJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKIAkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEVuZCBvZiBTQ0FOLCByZXN0b3JlIHRvIGNoYW5uZWwgJWQsIFRvdGFsIEJTU1slMDJkXVxuIixwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPlNjYW5UYWIuQnNzTnIpKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlNZTkMgLSBFbmQgb2YgU0NBTiwgcmVzdG9yZSB0byBjaGFubmVsICVkLCBUb3RhbCBCU1NbJTAyZF1cbiIsCisJCQkJICBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPlNjYW5UYWIuQnNzTnIpKTsKIAkJfQogCiAJCXsKLQkJCS8vCi0JCQkvLyBUbyBwcmV2ZW50IGRhdGEgbG9zdC4KLQkJCS8vIFNlbmQgYW4gTlVMTCBkYXRhIHdpdGggdHVybmVkIFBTTSBiaXQgb24gdG8gY3VycmVudCBhc3NvY2lhdGVkIEFQIGJlZm9yZSBTQ0FOIHByb2dyZXNzLgotCQkJLy8gTm93LCB3ZSBuZWVkIHRvIHNlbmQgYW4gTlVMTCBkYXRhIHdpdGggdHVybmVkIFBTTSBiaXQgb2ZmIHRvIEFQLCB3aGVuIHNjYW4gcHJvZ3Jlc3MgZG9uZQotCQkJLy8KLQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkgJiYgKElORlJBX09OKHBBZCkpKQotCQkJewotCQkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOwotCQkJCWlmIChOU3RhdHVzCT09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCQkJewotCQkJCQlwSGRyODAyMTEgPSAoUEhFQURFUl84MDJfMTEpIHBPdXRCdWZmZXI7Ci0JCQkJCU1ndE1hY0hlYWRlckluaXQocEFkLCBwSGRyODAyMTEsIFNVQlRZUEVfTlVMTF9GVU5DLCAxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJLyogKi8KKwkJCS8qIFRvIHByZXZlbnQgZGF0YSBsb3N0LiAqLworCQkJLyogU2VuZCBhbiBOVUxMIGRhdGEgd2l0aCB0dXJuZWQgUFNNIGJpdCBvbiB0byBjdXJyZW50IGFzc29jaWF0ZWQgQVAgYmVmb3JlIFNDQU4gcHJvZ3Jlc3MuICovCisJCQkvKiBOb3csIHdlIG5lZWQgdG8gc2VuZCBhbiBOVUxMIGRhdGEgd2l0aCB0dXJuZWQgUFNNIGJpdCBvZmYgdG8gQVAsIHdoZW4gc2NhbiBwcm9ncmVzcyBkb25lICovCisJCQkvKiAqLworCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRworCQkJICAgIChwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKQorCQkJICAgICYmIChJTkZSQV9PTihwQWQpKSkgeworCQkJCU5TdGF0dXMgPQorCQkJCSAgICBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLAorCQkJCQkJICAgICAgICh2b2lkICopJiBwT3V0QnVmZmVyKTsKKwkJCQlpZiAoTlN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCQkJCXBIZHI4MDIxMSA9IChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqKSBwT3V0QnVmZmVyOworCQkJCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcEhkcjgwMjExLAorCQkJCQkJCSBTVUJUWVBFX05VTExfRlVOQywgMSwKKwkJCQkJCQkgcEFkLT5Db21tb25DZmcuQnNzaWQsCisJCQkJCQkJIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKIAkJCQkJcEhkcjgwMjExLT5EdXJhdGlvbiA9IDA7CiAJCQkJCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX0RBVEE7Ci0JCQkJCXBIZHI4MDIxMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOworCQkJCQlwSGRyODAyMTEtPkZDLlB3ck1nbXQgPQorCQkJCQkgICAgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSk7CiAKLQkJCQkJLy8gU2VuZCB1c2luZyBwcmlvcml0eSBxdWV1ZQotCQkJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIHNpemVvZihIRUFERVJfODAyXzExKSk7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTY2FuUmVxQWN0aW9uIC0tIFNlbmQgUFNNIERhdGEgZnJhbWVcbiIpKTsKKwkJCQkJLyogU2VuZCB1c2luZyBwcmlvcml0eSBxdWV1ZSAqLworCQkJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsCisJCQkJCQkJICBzaXplb2YKKwkJCQkJCQkgIChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSkpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAoIk1sbWVTY2FuUmVxQWN0aW9uIC0tIFNlbmQgUFNNIERhdGEgZnJhbWVcbiIpKTsKIAkJCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKIAkJCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKIAkJCQl9CkBAIC00MzUsMTU1ICs1NDUsMTQ4IEBACiAKIAkJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CiAJCQlTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU0NBTl9DT05GLCAyLCAmU3RhdHVzKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TQ0FOX0NPTkYsCisJCQkJICAgIDIsICZTdGF0dXMpOwogCQl9CiAKIAkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7CiAJfQotI2lmZGVmIFJUMjg3MAotCWVsc2UgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCi0JeworI2lmZGVmIFJUTVBfTUFDX1VTQgorCWVsc2UgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKQorCQkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKSB7CiAJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CiAJCU1sbWVDbnRsQ29uZmlybShwQWQsIE1UMl9TQ0FOX0NPTkYsIE1MTUVfRkFJTF9OT19SRVNPVVJDRSk7CiAJfQotI2VuZGlmIC8vIFJUMjg3MCAvLwotCWVsc2UKLQl7CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisJZWxzZSB7CiAJCXsKLQkJLy8gQkJQIGFuZCBSRiBhcmUgbm90IGFjY2Vzc2libGUgaW4gUFMgbW9kZSwgd2UgaGFzIHRvIHdha2UgdGhlbSB1cCBmaXJzdAotCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLSNpZmRlZiBSVDI4NjAKLQkJCQlBc2ljRm9yY2VXYWtldXAocEFkLCBGUk9NX1RYKTsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7Ci0jZW5kaWYKLQkJCS8vIGxlYXZlIFBTTSBkdXJpbmcgc2Nhbm5pbmcuIG90aGVyd2lzZSB3ZSBtYXkgbG9zdCBQcm9iZVJzcCAmIEJFQUNPTgorCQkJLyogQkJQIGFuZCBSRiBhcmUgbm90IGFjY2Vzc2libGUgaW4gUFMgbW9kZSwgd2UgaGFzIHRvIHdha2UgdGhlbSB1cCBmaXJzdCAqLworCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJCQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7CisKKwkJCS8qIGxlYXZlIFBTTSBkdXJpbmcgc2Nhbm5pbmcuIG90aGVyd2lzZSB3ZSBtYXkgbG9zdCBQcm9iZVJzcCAmIEJFQUNPTiAqLwogCQkJaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkKLQkJCQlNbG1lU2V0UHNtQml0KHBBZCwgUFdSX0FDVElWRSk7CisJCQkJUlRNUF9TRVRfUFNNX0JJVChwQWQsIFBXUl9BQ1RJVkUpOwogCQl9CiAKIAkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCwgVFJVRSk7CiAJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKTsKIAogCQl7Ci0JCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPiAxNCkKLQkJCXsKLQkJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpKQotCQkJCXsKKwkJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+IDE0KSB7CisJCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQorCQkJCSAgICAmJiBSYWRhckNoYW5uZWxDaGVjayhwQWQsCisJCQkJCQkJIHBBZC0+TWxtZUF1eC4KKwkJCQkJCQkgQ2hhbm5lbCkpIHsKIAkJCQkJU2NhblR5cGUgPSBTQ0FOX1BBU1NJVkU7CiAJCQkJCVNjYW5UaW1lSW41Z0NoYW5uZWwgPSBNSU5fQ0hBTk5FTF9USU1FOwogCQkJCX0KIAkJCX0KIAkJfQogCi0JCS8vR2xvYmFsIGNvdW50cnkgZG9tYWluKGNoMS0xMTphY3RpdmUgc2NhbiwgY2gxMi0xNCBwYXNzaXZlIHNjYW4pCi0JCWlmICgocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpICYmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+PSAxMikgJiYgKChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICYgMHg3ZikgPT0gUkVHSU9OXzMxX0JHX0JBTkQpKQotCQl7CisJCS8qR2xvYmFsIGNvdW50cnkgZG9tYWluKGNoMS0xMTphY3RpdmUgc2NhbiwgY2gxMi0xNCBwYXNzaXZlIHNjYW4pICovCisJCWlmICgocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpICYmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+PSAxMikKKwkJICAgICYmICgocEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiAmIDB4N2YpID09CisJCQlSRUdJT05fMzFfQkdfQkFORCkpIHsKIAkJCVNjYW5UeXBlID0gU0NBTl9QQVNTSVZFOwogCQl9Ci0KLQkJLy8gV2UgbmVlZCB0byBzaG9ydGVuIGFjdGl2ZSBzY2FuIHRpbWUgaW4gb3JkZXIgZm9yIFdaQyBjb25uZWN0IGlzc3VlCi0JCS8vIENobmFnZSB0aGUgY2hhbm5lbCBzY2FuIHRpbWUgZm9yIENJU0NPIHN0dWZmIGJhc2VkIG9uIGl0cyBJQVBQIGFubm91bmNlbWVudAorCQkvKiBXZSBuZWVkIHRvIHNob3J0ZW4gYWN0aXZlIHNjYW4gdGltZSBpbiBvcmRlciBmb3IgV1pDIGNvbm5lY3QgaXNzdWUgKi8KKwkJLyogQ2huYWdlIHRoZSBjaGFubmVsIHNjYW4gdGltZSBmb3IgQ0lTQ08gc3R1ZmYgYmFzZWQgb24gaXRzIElBUFAgYW5ub3VuY2VtZW50ICovCiAJCWlmIChTY2FuVHlwZSA9PSBGQVNUX1NDQU5fQUNUSVZFKQotCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCBGQVNUX0FDVElWRV9TQ0FOX1RJTUUpOwotCQllbHNlIGlmICgoKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQUNUSVZFKSB8fAotCQkJCShTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX1BBU1NJVkUpIHx8Ci0JCQkJKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEKSB8fAotCQkJCShTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX05PSVNFKSkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQotCQl7Ci0JCQlpZiAocEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUgPCAyNSkKLQkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIHBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lICogMik7Ci0JCQllbHNlCi0JCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCBwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSk7Ci0JCX0KLQkJZWxzZSAvLyBtdXN0IGJlIFNDQU5fUEFTU0lWRSBvciBTQ0FOX0FDVElWRQorCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLAorCQkJCSAgICAgRkFTVF9BQ1RJVkVfU0NBTl9USU1FKTsKKwkJZWxzZQkJLyogbXVzdCBiZSBTQ0FOX1BBU1NJVkUgb3IgU0NBTl9BQ1RJVkUgKi8KIAkJewogCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR19NSVhFRCkKLQkJCQl8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdOX01JWEVEKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBR05fTUlYRUQpCi0JCQkpCi0JCQl7CisJCQkgICAgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRCkKKwkJCSAgICB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBR05fTUlYRUQpCisJCQkgICAgKSB7CiAJCQkJaWYgKHBBZC0+TWxtZUF1eC5DaGFubmVsID4gMTQpCi0JCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgU2NhblRpbWVJbjVnQ2hhbm5lbCk7CisJCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwKKwkJCQkJCSAgICAgU2NhblRpbWVJbjVnQ2hhbm5lbCk7CiAJCQkJZWxzZQotCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgTUlOX0NIQU5ORUxfVElNRSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCBNQVhfQ0hBTk5FTF9USU1FKTsKKwkJCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLAorCQkJCQkJICAgICBNSU5fQ0hBTk5FTF9USU1FKTsKKwkJCX0gZWxzZQorCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwKKwkJCQkJICAgICBNQVhfQ0hBTk5FTF9USU1FKTsKIAkJfQogCi0JCWlmICgoU2NhblR5cGUgPT0gU0NBTl9BQ1RJVkUpIHx8IChTY2FuVHlwZSA9PSBGQVNUX1NDQU5fQUNUSVZFKSB8fAotCQkJKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQUNUSVZFKSkKLQkJewotCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQkJCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIFNjYW5OZXh0Q2hhbm5lbCgpIGFsbG9jYXRlIG1lbW9yeSBmYWlsXG4iKSk7CisJCWlmICgoU2NhblR5cGUgPT0gU0NBTl9BQ1RJVkUpCisJCSAgICB8fCAoU2NhblR5cGUgPT0gRkFTVF9TQ0FOX0FDVElWRSkKKwkJICAgICkgeworCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJLypHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeSAqLworCQkJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJTWU5DIC0gU2Nhbk5leHRDaGFubmVsKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxcbiIpKTsKIAogCQkJCXsKLQkJCQkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwkJCQkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9CisJCQkJCSAgICBTWU5DX0lETEU7CiAJCQkJCVN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKLQkJCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwgMiwgJlN0YXR1cyk7CisJCQkJCU1sbWVFbnF1ZXVlKHBBZCwKKwkJCQkJCSAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkJCSAgICBNVDJfU0NBTl9DT05GLCAyLCAmU3RhdHVzKTsKIAkJCQl9CiAKIAkJCQlyZXR1cm47CiAJCQl9Ci0KLQkJCS8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2VuZCBicm9hZGNhc3QgcHJvYmUgcmVxdWVzdCBpZiBhY3RpdmUgc2NhbiBpcyBpbiBlZmZlY3QuCi0JCQlpZiAoKFNjYW5UeXBlID09IFNDQU5fQUNUSVZFKSB8fCAoU2NhblR5cGUgPT0gRkFTVF9TQ0FOX0FDVElWRSkKLQkJCQkpCisJCQkvKiBUaGVyZSBpcyBubyBuZWVkIHRvIHNlbmQgYnJvYWRjYXN0IHByb2JlIHJlcXVlc3QgaWYgYWN0aXZlIHNjYW4gaXMgaW4gZWZmZWN0LiAqLworCQkJaWYgKChTY2FuVHlwZSA9PSBTQ0FOX0FDVElWRSkKKwkJCSAgICB8fCAoU2NhblR5cGUgPT0gRkFTVF9TQ0FOX0FDVElWRSkKKwkJCSAgICApCiAJCQkJU3NpZExlbiA9IHBBZC0+TWxtZUF1eC5Tc2lkTGVuOwogCQkJZWxzZQogCQkJCVNzaWRMZW4gPSAwOwogCi0JCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLCBTVUJUWVBFX1BST0JFX1JFUSwgMCwgQlJPQURDQVNUX0FERFIsIEJST0FEQ0FTVF9BRERSKTsKLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotCQkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAmSGRyODAyMTEsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkTGVuLAotCQkJCQkJCSAgU3NpZExlbiwJCQkgICAgICAgIHBBZC0+TWxtZUF1eC5Tc2lkLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiwKLQkJCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW4sICBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlLAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZIZHI4MDIxMSwgU1VCVFlQRV9QUk9CRV9SRVEsIDAsCisJCQkJCSBCUk9BRENBU1RfQUREUiwgQlJPQURDQVNUX0FERFIpOworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgJkZyYW1lTGVuLAorCQkJCQkgIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSksICZIZHI4MDIxMSwgMSwKKwkJCQkJICAmU3NpZEllLCAxLCAmU3NpZExlbiwgU3NpZExlbiwKKwkJCQkJICBwQWQtPk1sbWVBdXguU3NpZCwgMSwgJlN1cFJhdGVJZSwgMSwKKwkJCQkJICAmcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiwKKwkJCQkJICBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuLAorCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGUsIEVORF9PRl9BUkdTKTsKIAotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW4pCi0JCQl7Ci0JCQkJVUxPTkcgVG1wOwotCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wLAotCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAotCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiwKLQkJCQkJCQkJICBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuLCAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlLAotCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuKSB7CisJCQkJdW5zaWduZWQgbG9uZyBUbXA7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmVG1wLAorCQkJCQkJICAxLCAmRXh0UmF0ZUllLAorCQkJCQkJICAxLCAmcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiwKKwkJCQkJCSAgcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiwKKwkJCQkJCSAgcEFkLT5Db21tb25DZmcuRXh0UmF0ZSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOwogCQkJCUZyYW1lTGVuICs9IFRtcDsKIAkJCX0KIAotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKLQkJCXsKLQkJCQlVTE9ORwlUbXA7Ci0JCQkJVUNIQVIJSHRMZW47Ci0JCQkJVUNIQVIJQlJPQURDT01bNF0gPSB7MHgwLCAweDkwLCAweDRjLCAweDMzfTsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpIHsKKwkJCQl1bnNpZ25lZCBsb25nIFRtcDsKKwkJCQl1OCBIdExlbjsKKwkJCQl1OCBCUk9BRENPTVs0XSA9IHsgMHgwLCAweDkwLCAweDRjLCAweDMzIH07CiAKLQkJCQlpZiAocEFkLT5iQnJvYWRDb21IVCA9PSBUUlVFKQotCQkJCXsKLQkJCQkJSHRMZW4gPSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuICsgNDsKKwkJCQlpZiAocEFkLT5iQnJvYWRDb21IVCA9PSBUUlVFKSB7CisJCQkJCUh0TGVuID0KKwkJCQkJICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gKyA0OwogCi0JCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgJlRtcCwKLQkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCi0JCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAotCQkJCQkJCQkJNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKLQkJCQkJCQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkJCUVORF9PRl9BUkdTKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKKwkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAorCQkJCQkJCSAgJlRtcCwgMSwgJldwYUllLCAxLAorCQkJCQkJCSAgJkh0TGVuLCA0LAorCQkJCQkJCSAgJkJST0FEQ09NWzBdLAorCQkJCQkJCSAgcEFkLT5NbG1lQXV4LgorCQkJCQkJCSAgSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCSAgJnBBZC0+TWxtZUF1eC4KKwkJCQkJCQkgIEh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCQl9IGVsc2UgewogCQkJCQlIdExlbiA9IHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW47CiAKLQkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAmVG1wLAotCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAotCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKLQkJCQkJCQkJCUh0TGVuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LAotCQkJCQkJCQkJRU5EX09GX0FSR1MpOworCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCisJCQkJCQkJICAmVG1wLCAxLCAmSHRDYXBJZSwgMSwKKwkJCQkJCQkgICZIdExlbiwgSHRMZW4sCisJCQkJCQkJICAmcEFkLT5Db21tb25DZmcuCisJCQkJCQkJICBIdENhcGFiaWxpdHksCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CiAJCQkJfQogCQkJCUZyYW1lTGVuICs9IFRtcDsKIAkJCX0KQEAgLTU5MSwyMiArNjk0LDE4IEBACiAJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIAkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CiAJCX0KLQotCQkvLyBGb3IgU0NBTl9DSVNDT19QQVNTSVZFLCBkbyBub3RoaW5nIGFuZCBzaWxlbnRseSB3YWl0IGZvciBiZWFjb24gb3Igb3RoZXIgcHJvYmUgcmVwb25zZQorCQkvKiBGb3IgU0NBTl9DSVNDT19QQVNTSVZFLCBkbyBub3RoaW5nIGFuZCBzaWxlbnRseSB3YWl0IGZvciBiZWFjb24gb3Igb3RoZXIgcHJvYmUgcmVwb25zZSAqLwogCiAJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTQ0FOX0xJU1RFTjsKIAl9CiB9CiAKLVZPSUQgTWd0UHJvYlJlcU1hY0hlYWRlckluaXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gT1VUIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKLQlJTiBVQ0hBUiBTdWJUeXBlLAotCUlOIFVDSEFSIFRvRHMsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBQVUNIQVIgcEJzc2lkKQordm9pZCBNZ3RQcm9iUmVxTWFjSGVhZGVySW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhkcjgwMjExLAorCQkJICAgICB1OCBTdWJUeXBlLAorCQkJICAgICB1OCBUb0RzLCB1OCAqcERBLCB1OCAqcEJzc2lkKQogewotCU5kaXNaZXJvTWVtb3J5KHBIZHI4MDIxMSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwlOZGlzWmVyb01lbW9yeShwSGRyODAyMTEsIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSkpOwogCiAJcEhkcjgwMjExLT5GQy5UeXBlID0gQlRZUEVfTUdNVDsKIAlwSGRyODAyMTEtPkZDLlN1YlR5cGUgPSBTdWJUeXBlOwpAQCAtNjE3LDUgKzcxNiwzIEBACiAJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKIAlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIHBCc3NpZCk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3RraXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV90a2lwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg4MWVmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV90a2lwLmMKQEAgLTAsMCArMSw4MzMgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJY21tX3RraXAuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgV3UJCTAyLTI1LTAyCQlJbml0aWFsCisqLworCisjaW5jbHVkZQkiLi4vcnRfY29uZmlnLmgiCisKKy8qIFJvdGF0aW9uIGZ1bmN0aW9ucyBvbiAzMiBiaXQgdmFsdWVzICovCisjZGVmaW5lIFJPTDMyKCBBLCBuICkgXAorCSggKChBKSA8PCAobikpIHwgKCAoKEEpPj4oMzItKG4pKSkgJiAoICgxVUwgPDwgKG4pKSAtIDEgKSApICkKKyNkZWZpbmUgUk9SMzIoIEEsIG4gKSBST0wzMiggKEEpLCAzMi0obikgKQorCit1MzIgVGtpcF9TYm94X0xvd2VyWzI1Nl0gPSB7CisJMHhBNSwgMHg4NCwgMHg5OSwgMHg4RCwgMHgwRCwgMHhCRCwgMHhCMSwgMHg1NCwKKwkweDUwLCAweDAzLCAweEE5LCAweDdELCAweDE5LCAweDYyLCAweEU2LCAweDlBLAorCTB4NDUsIDB4OUQsIDB4NDAsIDB4ODcsIDB4MTUsIDB4RUIsIDB4QzksIDB4MEIsCisJMHhFQywgMHg2NywgMHhGRCwgMHhFQSwgMHhCRiwgMHhGNywgMHg5NiwgMHg1QiwKKwkweEMyLCAweDFDLCAweEFFLCAweDZBLCAweDVBLCAweDQxLCAweDAyLCAweDRGLAorCTB4NUMsIDB4RjQsIDB4MzQsIDB4MDgsIDB4OTMsIDB4NzMsIDB4NTMsIDB4M0YsCisJMHgwQywgMHg1MiwgMHg2NSwgMHg1RSwgMHgyOCwgMHhBMSwgMHgwRiwgMHhCNSwKKwkweDA5LCAweDM2LCAweDlCLCAweDNELCAweDI2LCAweDY5LCAweENELCAweDlGLAorCTB4MUIsIDB4OUUsIDB4NzQsIDB4MkUsIDB4MkQsIDB4QjIsIDB4RUUsIDB4RkIsCisJMHhGNiwgMHg0RCwgMHg2MSwgMHhDRSwgMHg3QiwgMHgzRSwgMHg3MSwgMHg5NywKKwkweEY1LCAweDY4LCAweDAwLCAweDJDLCAweDYwLCAweDFGLCAweEM4LCAweEVELAorCTB4QkUsIDB4NDYsIDB4RDksIDB4NEIsIDB4REUsIDB4RDQsIDB4RTgsIDB4NEEsCisJMHg2QiwgMHgyQSwgMHhFNSwgMHgxNiwgMHhDNSwgMHhENywgMHg1NSwgMHg5NCwKKwkweENGLCAweDEwLCAweDA2LCAweDgxLCAweEYwLCAweDQ0LCAweEJBLCAweEUzLAorCTB4RjMsIDB4RkUsIDB4QzAsIDB4OEEsIDB4QUQsIDB4QkMsIDB4NDgsIDB4MDQsCisJMHhERiwgMHhDMSwgMHg3NSwgMHg2MywgMHgzMCwgMHgxQSwgMHgwRSwgMHg2RCwKKwkweDRDLCAweDE0LCAweDM1LCAweDJGLCAweEUxLCAweEEyLCAweENDLCAweDM5LAorCTB4NTcsIDB4RjIsIDB4ODIsIDB4NDcsIDB4QUMsIDB4RTcsIDB4MkIsIDB4OTUsCisJMHhBMCwgMHg5OCwgMHhEMSwgMHg3RiwgMHg2NiwgMHg3RSwgMHhBQiwgMHg4MywKKwkweENBLCAweDI5LCAweEQzLCAweDNDLCAweDc5LCAweEUyLCAweDFELCAweDc2LAorCTB4M0IsIDB4NTYsIDB4NEUsIDB4MUUsIDB4REIsIDB4MEEsIDB4NkMsIDB4RTQsCisJMHg1RCwgMHg2RSwgMHhFRiwgMHhBNiwgMHhBOCwgMHhBNCwgMHgzNywgMHg4QiwKKwkweDMyLCAweDQzLCAweDU5LCAweEI3LCAweDhDLCAweDY0LCAweEQyLCAweEUwLAorCTB4QjQsIDB4RkEsIDB4MDcsIDB4MjUsIDB4QUYsIDB4OEUsIDB4RTksIDB4MTgsCisJMHhENSwgMHg4OCwgMHg2RiwgMHg3MiwgMHgyNCwgMHhGMSwgMHhDNywgMHg1MSwKKwkweDIzLCAweDdDLCAweDlDLCAweDIxLCAweERELCAweERDLCAweDg2LCAweDg1LAorCTB4OTAsIDB4NDIsIDB4QzQsIDB4QUEsIDB4RDgsIDB4MDUsIDB4MDEsIDB4MTIsCisJMHhBMywgMHg1RiwgMHhGOSwgMHhEMCwgMHg5MSwgMHg1OCwgMHgyNywgMHhCOSwKKwkweDM4LCAweDEzLCAweEIzLCAweDMzLCAweEJCLCAweDcwLCAweDg5LCAweEE3LAorCTB4QjYsIDB4MjIsIDB4OTIsIDB4MjAsIDB4NDksIDB4RkYsIDB4NzgsIDB4N0EsCisJMHg4RiwgMHhGOCwgMHg4MCwgMHgxNywgMHhEQSwgMHgzMSwgMHhDNiwgMHhCOCwKKwkweEMzLCAweEIwLCAweDc3LCAweDExLCAweENCLCAweEZDLCAweEQ2LCAweDNBCit9OworCit1MzIgVGtpcF9TYm94X1VwcGVyWzI1Nl0gPSB7CisJMHhDNiwgMHhGOCwgMHhFRSwgMHhGNiwgMHhGRiwgMHhENiwgMHhERSwgMHg5MSwKKwkweDYwLCAweDAyLCAweENFLCAweDU2LCAweEU3LCAweEI1LCAweDRELCAweEVDLAorCTB4OEYsIDB4MUYsIDB4ODksIDB4RkEsIDB4RUYsIDB4QjIsIDB4OEUsIDB4RkIsCisJMHg0MSwgMHhCMywgMHg1RiwgMHg0NSwgMHgyMywgMHg1MywgMHhFNCwgMHg5QiwKKwkweDc1LCAweEUxLCAweDNELCAweDRDLCAweDZDLCAweDdFLCAweEY1LCAweDgzLAorCTB4NjgsIDB4NTEsIDB4RDEsIDB4RjksIDB4RTIsIDB4QUIsIDB4NjIsIDB4MkEsCisJMHgwOCwgMHg5NSwgMHg0NiwgMHg5RCwgMHgzMCwgMHgzNywgMHgwQSwgMHgyRiwKKwkweDBFLCAweDI0LCAweDFCLCAweERGLCAweENELCAweDRFLCAweDdGLCAweEVBLAorCTB4MTIsIDB4MUQsIDB4NTgsIDB4MzQsIDB4MzYsIDB4REMsIDB4QjQsIDB4NUIsCisJMHhBNCwgMHg3NiwgMHhCNywgMHg3RCwgMHg1MiwgMHhERCwgMHg1RSwgMHgxMywKKwkweEE2LCAweEI5LCAweDAwLCAweEMxLCAweDQwLCAweEUzLCAweDc5LCAweEI2LAorCTB4RDQsIDB4OEQsIDB4NjcsIDB4NzIsIDB4OTQsIDB4OTgsIDB4QjAsIDB4ODUsCisJMHhCQiwgMHhDNSwgMHg0RiwgMHhFRCwgMHg4NiwgMHg5QSwgMHg2NiwgMHgxMSwKKwkweDhBLCAweEU5LCAweDA0LCAweEZFLCAweEEwLCAweDc4LCAweDI1LCAweDRCLAorCTB4QTIsIDB4NUQsIDB4ODAsIDB4MDUsIDB4M0YsIDB4MjEsIDB4NzAsIDB4RjEsCisJMHg2MywgMHg3NywgMHhBRiwgMHg0MiwgMHgyMCwgMHhFNSwgMHhGRCwgMHhCRiwKKwkweDgxLCAweDE4LCAweDI2LCAweEMzLCAweEJFLCAweDM1LCAweDg4LCAweDJFLAorCTB4OTMsIDB4NTUsIDB4RkMsIDB4N0EsIDB4QzgsIDB4QkEsIDB4MzIsIDB4RTYsCisJMHhDMCwgMHgxOSwgMHg5RSwgMHhBMywgMHg0NCwgMHg1NCwgMHgzQiwgMHgwQiwKKwkweDhDLCAweEM3LCAweDZCLCAweDI4LCAweEE3LCAweEJDLCAweDE2LCAweEFELAorCTB4REIsIDB4NjQsIDB4NzQsIDB4MTQsIDB4OTIsIDB4MEMsIDB4NDgsIDB4QjgsCisJMHg5RiwgMHhCRCwgMHg0MywgMHhDNCwgMHgzOSwgMHgzMSwgMHhEMywgMHhGMiwKKwkweEQ1LCAweDhCLCAweDZFLCAweERBLCAweDAxLCAweEIxLCAweDlDLCAweDQ5LAorCTB4RDgsIDB4QUMsIDB4RjMsIDB4Q0YsIDB4Q0EsIDB4RjQsIDB4NDcsIDB4MTAsCisJMHg2RiwgMHhGMCwgMHg0QSwgMHg1QywgMHgzOCwgMHg1NywgMHg3MywgMHg5NywKKwkweENCLCAweEExLCAweEU4LCAweDNFLCAweDk2LCAweDYxLCAweDBELCAweDBGLAorCTB4RTAsIDB4N0MsIDB4NzEsIDB4Q0MsIDB4OTAsIDB4MDYsIDB4RjcsIDB4MUMsCisJMHhDMiwgMHg2QSwgMHhBRSwgMHg2OSwgMHgxNywgMHg5OSwgMHgzQSwgMHgyNywKKwkweEQ5LCAweEVCLCAweDJCLCAweDIyLCAweEQyLCAweEE5LCAweDA3LCAweDMzLAorCTB4MkQsIDB4M0MsIDB4MTUsIDB4QzksIDB4ODcsIDB4QUEsIDB4NTAsIDB4QTUsCisJMHgwMywgMHg1OSwgMHgwOSwgMHgxQSwgMHg2NSwgMHhENywgMHg4NCwgMHhEMCwKKwkweDgyLCAweDI5LCAweDVBLCAweDFFLCAweDdCLCAweEE4LCAweDZELCAweDJDCit9OworCisvKiAqLworLyogRXhwYW5kZWQgSVYgZm9yIFRLSVAgZnVuY3Rpb24uICovCisvKiAqLworc3RydWN0IFBBQ0tFRCBydF90a2lwX2l2IHsKKwl1bmlvbiBQQUNLRUQgeworCQlzdHJ1Y3QgUEFDS0VEIHsKKwkJCXU4IHJjMDsKKwkJCXU4IHJjMTsKKwkJCXU4IHJjMjsKKworCQkJdW5pb24gUEFDS0VEIHsKKwkJCQlzdHJ1Y3QgUEFDS0VEIHsKKwkJCQkJdTggUnN2ZDo1OworCQkJCQl1OCBFeHRJVjoxOworCQkJCQl1OCBLZXlJRDoyOworCQkJCX0gZmllbGQ7CisJCQkJdTggQnl0ZTsKKwkJCX0gQ09OVFJPTDsKKwkJfSBmaWVsZDsKKworCQl1bnNpZ25lZCBsb25nIHdvcmQ7CisJfSBJVjE2OworCisJdW5zaWduZWQgbG9uZyBJVjMyOworfTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNvbnZlcnQgZnJvbSB1OFtdIHRvIHVuc2lnbmVkIGxvbmcgaW4gYSBwb3J0YWJsZSB3YXkKKworCUFyZ3VtZW50czoKKyAgICAgIHBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordW5zaWduZWQgbG9uZyBSVE1QVGtpcEdldFVJbnQzMih1OCAqcE1JQ0tleSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlcyA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXJlcyB8PSAoKnBNSUNLZXkrKykgPDwgKDggKiBpKTsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ29udmVydCBmcm9tIHVuc2lnbmVkIGxvbmcgdG8gdThbXSBpbiBhIHBvcnRhYmxlIHdheQorCisJQXJndW1lbnRzOgorICAgICAgcERzdAkJCXBvaW50ZXIgdG8gZGVzdGluYXRpb24gZm9yIGNvbnZlcnQgdW5zaWduZWQgbG9uZyB0byB1OFtdCisgICAgICB2YWwJCQl0aGUgdmFsdWUgZm9yIGNvbnZlcnQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVE1QVGtpcFB1dFVJbnQzMihJTiB1OCAqcERzdCwgdW5zaWduZWQgbG9uZyB2YWwpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCSpwRHN0KysgPSAodTgpKHZhbCAmIDB4ZmYpOworCQl2YWwgPj49IDg7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJU2V0IHRoZSBNSUMgS2V5LgorCisJQXJndW1lbnRzOgorICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICBwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVE1QVGtpcFNldE1JQ0tleShzdHJ1Y3QgcnRfdGtpcF9rZXlfaW5mbyAqcFRraXAsIHU4ICpwTUlDS2V5KQoreworCS8qIFNldCB0aGUga2V5ICovCisJcFRraXAtPkswID0gUlRNUFRraXBHZXRVSW50MzIocE1JQ0tleSk7CisJcFRraXAtPksxID0gUlRNUFRraXBHZXRVSW50MzIocE1JQ0tleSArIDQpOworCS8qIGFuZCByZXNldCB0aGUgbWVzc2FnZSAqLworCXBUa2lwLT5MID0gcFRraXAtPkswOworCXBUa2lwLT5SID0gcFRraXAtPksxOworCXBUa2lwLT5uQnl0ZXNJbk0gPSAwOworCXBUa2lwLT5NID0gMDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNhbGN1bGF0ZSB0aGUgTUlDIFZhbHVlLgorCisJQXJndW1lbnRzOgorICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICB1Q2hhcgkJCUFwcGVuZCB0aGlzIHVDaGFyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlRNUFRraXBBcHBlbmRCeXRlKHN0cnVjdCBydF90a2lwX2tleV9pbmZvICpwVGtpcCwgdTggdUNoYXIpCit7CisJLyogQXBwZW5kIHRoZSBieXRlIHRvIG91ciB3b3JkLXNpemVkIGJ1ZmZlciAqLworCXBUa2lwLT5NIHw9ICh1Q2hhciA8PCAoOCAqIHBUa2lwLT5uQnl0ZXNJbk0pKTsKKwlwVGtpcC0+bkJ5dGVzSW5NKys7CisJLyogUHJvY2VzcyB0aGUgd29yZCBpZiBpdCBpcyBmdWxsLiAqLworCWlmIChwVGtpcC0+bkJ5dGVzSW5NID49IDQpIHsKKwkJcFRraXAtPkwgXj0gcFRraXAtPk07CisJCXBUa2lwLT5SIF49IFJPTDMyKHBUa2lwLT5MLCAxNyk7CisJCXBUa2lwLT5MICs9IHBUa2lwLT5SOworCQlwVGtpcC0+UiBePQorCQkgICAgKChwVGtpcC0+TCAmIDB4ZmYwMGZmMDApID4+IDgpIHwgKChwVGtpcC0+CisJCQkJCQkgICAgICAgTCAmIDB4MDBmZjAwZmYpIDw8IDgpOworCQlwVGtpcC0+TCArPSBwVGtpcC0+UjsKKwkJcFRraXAtPlIgXj0gUk9MMzIocFRraXAtPkwsIDMpOworCQlwVGtpcC0+TCArPSBwVGtpcC0+UjsKKwkJcFRraXAtPlIgXj0gUk9SMzIocFRraXAtPkwsIDIpOworCQlwVGtpcC0+TCArPSBwVGtpcC0+UjsKKwkJLyogQ2xlYXIgdGhlIGJ1ZmZlciAqLworCQlwVGtpcC0+TSA9IDA7CisJCXBUa2lwLT5uQnl0ZXNJbk0gPSAwOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNhbGN1bGF0ZSB0aGUgTUlDIFZhbHVlLgorCisJQXJndW1lbnRzOgorICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICBwU3JjCQkJUG9pbnRlciB0byBzb3VyY2UgZGF0YSBmb3IgQ2FsY3VsYXRlIE1JQyBWYWx1ZQorICAgICAgTGVuCQkJSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgc291cmNlIGRhdGEKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVE1QVGtpcEFwcGVuZChzdHJ1Y3QgcnRfdGtpcF9rZXlfaW5mbyAqcFRraXAsIHU4ICpwU3JjLCB1MzIgbkJ5dGVzKQoreworCS8qIFRoaXMgaXMgc2ltcGxlICovCisJd2hpbGUgKG5CeXRlcyA+IDApIHsKKwkJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAqcFNyYysrKTsKKwkJbkJ5dGVzLS07CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJR2V0IHRoZSBNSUMgVmFsdWUuCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQl0aGUgTUlDIFZhbHVlIGlzIHN0b3JlIGluIHBBZC0+UHJpdmF0ZUluZm8uTUlDCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVE1QVGtpcEdldE1JQyhzdHJ1Y3QgcnRfdGtpcF9rZXlfaW5mbyAqcFRraXApCit7CisJLyogQXBwZW5kIHRoZSBtaW5pbXVtIHBhZGRpbmcgKi8KKwlSVE1QVGtpcEFwcGVuZEJ5dGUocFRraXAsIDB4NWEpOworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCk7CisJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAwKTsKKwlSVE1QVGtpcEFwcGVuZEJ5dGUocFRraXAsIDApOworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCk7CisJLyogYW5kIHRoZW4gemVyb2VzIHVudGlsIHRoZSBsZW5ndGggaXMgYSBtdWx0aXBsZSBvZiA0ICovCisJd2hpbGUgKHBUa2lwLT5uQnl0ZXNJbk0gIT0gMCkgeworCQlSVE1QVGtpcEFwcGVuZEJ5dGUocFRraXAsIDApOworCX0KKwkvKiBUaGUgYXBwZW5kQnl0ZSBmdW5jdGlvbiBoYXMgYWxyZWFkeSBjb21wdXRlZCB0aGUgcmVzdWx0LiAqLworCVJUTVBUa2lwUHV0VUludDMyKHBUa2lwLT5NSUMsIHBUa2lwLT5MKTsKKwlSVE1QVGtpcFB1dFVJbnQzMihwVGtpcC0+TUlDICsgNCwgcFRraXAtPlIpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJSW5pdCBUa2lwIGZ1bmN0aW9uLgorCisJQXJndW1lbnRzOgorICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBUS2V5ICAgICAgIFBvaW50ZXIgdG8gdGhlIFRlbXBvcmFsIEtleSAoVEspLCBUSyBzaGFsbCBiZSAxMjhiaXRzLgorCQlLZXlJZAkJVEsgS2V5IElECisJCXBUQQkJCVBvaW50ZXIgdG8gdHJhbnNtaXR0ZXIgYWRkcmVzcworCQlwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVE1QSW5pdFRraXBFbmdpbmUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJdTggKnBLZXksCisJCQl1OCBLZXlJZCwKKwkJCXU4ICpwVEEsCisJCQl1OCAqcE1JQ0tleSwKKwkJCXU4ICpwVFNDLCB1bnNpZ25lZCBsb25nICpwSVYxNiwgdW5zaWduZWQgbG9uZyAqcElWMzIpCit7CisJc3RydWN0IHJ0X3RraXBfaXYgdGtpcEl2OworCisJLyogUHJlcGFyZSA4IGJ5dGVzIFRLSVAgZW5jYXBzdWxhdGlvbiBmb3IgTVBEVSAqLworCU5kaXNaZXJvTWVtb3J5KCZ0a2lwSXYsIHNpemVvZihzdHJ1Y3QgcnRfdGtpcF9pdikpOworCXRraXBJdi5JVjE2LmZpZWxkLnJjMCA9ICoocFRTQyArIDEpOworCXRraXBJdi5JVjE2LmZpZWxkLnJjMSA9ICh0a2lwSXYuSVYxNi5maWVsZC5yYzAgfCAweDIwKSAmIDB4N2Y7CisJdGtpcEl2LklWMTYuZmllbGQucmMyID0gKnBUU0M7CisJdGtpcEl2LklWMTYuZmllbGQuQ09OVFJPTC5maWVsZC5FeHRJViA9IDE7CS8qIDA6IG5vbi1leHRlbmRlZCBJViwgMTogYW4gZXh0ZW5kZWQgSVYgKi8KKwl0a2lwSXYuSVYxNi5maWVsZC5DT05UUk9MLmZpZWxkLktleUlEID0gS2V5SWQ7CisvKiAgICAgIHRraXBJdi5JVjMyID0gKih1bnNpZ25lZCBsb25nICopKHBUU0MgKyAyKTsgKi8KKwlOZGlzTW92ZU1lbW9yeSgmdGtpcEl2LklWMzIsIChwVFNDICsgMiksIDQpOwkvKiBDb3B5IElWICovCisKKwkqcElWMTYgPSB0a2lwSXYuSVYxNi53b3JkOworCSpwSVYzMiA9IHRraXBJdi5JVjMyOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJSW5pdCBNSUMgVmFsdWUgY2FsY3VsYXRpb24gZnVuY3Rpb24gd2hpY2ggaW5jbHVkZSBzZXQgTUlDIGtleSAmCisJCWNhbGN1bGF0ZSBmaXJzdCAxNiBieXRlcyAoREEgKyBTQSArIHByaW9yaXR5ICsgIDApCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFRLZXkgICAgICAgUG9pbnRlciB0byB0aGUgVGVtcG9yYWwgS2V5IChUSyksIFRLIHNoYWxsIGJlIDEyOGJpdHMuCisJCXBEQQkJCVBvaW50ZXIgdG8gREEgYWRkcmVzcworCQlwU0EJCQlQb2ludGVyIHRvIFNBIGFkZHJlc3MKKwkJcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUTVBJbml0TUlDRW5naW5lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIHU4ICpwS2V5LAorCQkgICAgICAgdTggKnBEQSwKKwkJICAgICAgIHU4ICpwU0EsIHU4IFVzZXJQcmlvcml0eSwgdTggKnBNSUNLZXkpCit7CisJdW5zaWduZWQgbG9uZyBQcmlvcml0eSA9IFVzZXJQcmlvcml0eTsKKworCS8qIEluaXQgTUlDIHZhbHVlIGNhbGN1bGF0aW9uICovCisJUlRNUFRraXBTZXRNSUNLZXkoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBNSUNLZXkpOworCS8qIERBICovCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBEQSwgTUFDX0FERFJfTEVOKTsKKwkvKiBTQSAqLworCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwU0EsIE1BQ19BRERSX0xFTik7CisJLyogUHJpb3JpdHkgKyAzIGJ5dGVzIG9mIDAgKi8KKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgKHU4ICopJiBQcmlvcml0eSwgNCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDb21wYXJlIE1JQyB2YWx1ZSBvZiByZWNlaXZlZCBNU0RVCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHJlY2VpdmVkIFBsYWluIHRleHQgZGF0YQorCQlwREEJCQlQb2ludGVyIHRvIERBIGFkZHJlc3MKKwkJcFNBCQkJUG9pbnRlciB0byBTQSBhZGRyZXNzCisJCXBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQorCQlMZW4gICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSByZWNlaXZlZCBwbGFpbiB0ZXh0IGRhdGEgZXhjbHVkZSBNSUMgdmFsdWUKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRSAgICAgICAgTUlDIHZhbHVlIG1hdGNoZWQKKwkJRkFMU0UgICAgICAgTUlDIHZhbHVlIG1pc21hdGNoZWQKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUlRNUFRraXBDb21wYXJlTUlDVmFsdWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCXU4ICpwU3JjLAorCQkJCXU4ICpwREEsCisJCQkJdTggKnBTQSwKKwkJCQl1OCAqcE1JQ0tleSwKKwkJCQl1OCBVc2VyUHJpb3JpdHksIHUzMiBMZW4pCit7CisJdTggT2xkTWljWzhdOworCXVuc2lnbmVkIGxvbmcgUHJpb3JpdHkgPSBVc2VyUHJpb3JpdHk7CisKKwkvKiBJbml0IE1JQyB2YWx1ZSBjYWxjdWxhdGlvbiAqLworCVJUTVBUa2lwU2V0TUlDS2V5KCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwTUlDS2V5KTsKKwkvKiBEQSAqLworCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwREEsIE1BQ19BRERSX0xFTik7CisJLyogU0EgKi8KKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcFNBLCBNQUNfQUREUl9MRU4pOworCS8qIFByaW9yaXR5ICsgMyBieXRlcyBvZiAwICovCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsICh1OCAqKSYgUHJpb3JpdHksIDQpOworCisJLyogQ2FsY3VsYXRlIE1JQyB2YWx1ZSBmcm9tIHBsYWluIHRleHQgZGF0YSAqLworCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwU3JjLCBMZW4pOworCisJLyogR2V0IE1JQyB2YWx1ZGUgZnJvbSByZWNlaXZlZCBmcmFtZSAqLworCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcFNyYyArIExlbiwgOCk7CisKKwkvKiBHZXQgTUlDIHZhbHVlIGZyb20gZGVjcnlwdGVkIHBsYWluIGRhdGEgKi8KKwlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5SeCk7CisKKwkvKiBNb3ZlIE1JQyB2YWx1ZSBmcm9tIE1TRFUsIHRoaXMgc3RlcHMgc2hvdWxkIG1vdmUgdG8gZGF0YSBwYXRoLiAqLworCS8qIFNpbmNlIHRoZSBNSUMgdmFsdWUgbWlnaHQgY3Jvc3MgTVBEVXMuICovCisJaWYgKCFOZGlzRXF1YWxNZW1vcnkocEFkLT5Qcml2YXRlSW5mby5SeC5NSUMsIE9sZE1pYywgOCkpIHsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlKCk6IFRLSVAgTUlDIEVycm9yICFcbiIpKTsJLypNSUMgZXJyb3IuICovCisKKwkJcmV0dXJuIChGQUxTRSk7CisJfQorCXJldHVybiAoVFJVRSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDb3B5IGZyYW1lIGZyb20gd2FpdGluZyBxdWV1ZSBpbnRvIHJlbGF0aXZlIHJpbmcgYnVmZmVyIGFuZCBzZXQKKwlhcHByb3ByaWF0ZSBBU0lDIHJlZ2lzdGVyIHRvIGtpY2sgaGFyZHdhcmUgdHJhbnNtaXQgZnVuY3Rpb24KKworCUFyZ3VtZW50czoKKwkJcEFkCQlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCXZvaWQgKglQb2ludGVyIHRvIE5kaXMgUGFja2V0IGZvciBNSUMgY2FsY3VsYXRpb24KKwkJcEVuY2FwCQkJUG9pbnRlciB0byBMTEMgZW5jYXAgZGF0YQorCQlMZW5FbmNhcAkJVG90YWwgZW5jYXAgbGVuZ3RoLCBtaWdodCBiZSAwIHdoaWNoIGluZGljYXRlcyBubyBlbmNhcAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUTVBDYWxjdWxhdGVNSUNWYWx1ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB2b2lkICpwUGFja2V0LAorCQkJICAgdTggKnBFbmNhcCwKKwkJCSAgIHN0cnVjdCBydF9jaXBoZXJfa2V5ICpwS2V5LCB1OCBhcGlkeCkKK3sKKwlzdHJ1Y3QgcnRfcGFja2V0X2luZm8gUGFja2V0SW5mbzsKKwl1OCAqcFNyY0J1ZlZBOworCXUzMiBTcmNCdWZMZW47CisJdTggKnBTcmM7CisJdTggVXNlclByaW9yaXR5OworCXU4IHZsYW5fb2Zmc2V0ID0gMDsKKworCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFNyY0J1ZlZBLCAmU3JjQnVmTGVuKTsKKworCVVzZXJQcmlvcml0eSA9IFJUTVBfR0VUX1BBQ0tFVF9VUChwUGFja2V0KTsKKwlwU3JjID0gcFNyY0J1ZlZBOworCisJLyogZGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSB2bGFuIHBhY2tldCAqLworCWlmICgoKCoocFNyYyArIDEyKSA8PCA4KSArICoocFNyYyArIDEzKSkgPT0gMHg4MTAwKQorCQl2bGFuX29mZnNldCA9IDQ7CisKKwl7CisJCVJUTVBJbml0TUlDRW5naW5lKHBBZCwKKwkJCQkgIHBLZXktPktleSwKKwkJCQkgIHBTcmMsIHBTcmMgKyA2LCBVc2VyUHJpb3JpdHksIHBLZXktPlR4TWljKTsKKwl9CisKKwlpZiAocEVuY2FwICE9IE5VTEwpIHsKKwkJLyogTExDIGVuY2Fwc3VsYXRpb24gKi8KKwkJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBFbmNhcCwgNik7CisJCS8qIFByb3RvY29sIFR5cGUgKi8KKwkJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBTcmMgKyAxMiArIHZsYW5fb2Zmc2V0LAorCQkJICAgICAgIDIpOworCX0KKwlTcmNCdWZMZW4gLT0gKDE0ICsgdmxhbl9vZmZzZXQpOworCXBTcmMgKz0gKDE0ICsgdmxhbl9vZmZzZXQpOworCWRvIHsKKwkJaWYgKFNyY0J1ZkxlbiA+IDApIHsKKwkJCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwU3JjLCBTcmNCdWZMZW4pOworCQl9CisKKwkJYnJlYWs7CQkvKiBObyBuZWVkIGhhbmRsZSBuZXh0IHBhY2tldCAqLworCisJfSB3aGlsZSAoVFJVRSk7CQkvKiBFbmQgb2YgY29weWluZyBwYXlsb2FkICovCisKKwkvKiBDb21wdXRlIHRoZSBmaW5hbCBNSUMgVmFsdWUgKi8KKwlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5UeCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiB0a2lwX3Nib3goKQkJCQkJCQkJCQkJCQkJCQkqLworLyogUmV0dXJucyBhIDE2IGJpdCB2YWx1ZSBmcm9tIGEgNjRLIGVudHJ5IHRhYmxlLiBUaGUgVGFibGUgKi8KKy8qIGlzIHN5bnRoZXNpemVkIGZyb20gdHdvIDI1NiBlbnRyeSBieXRlIHdpZGUgdGFibGVzLgkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3UzMiB0a2lwX3Nib3godTMyIGluZGV4KQoreworCXUzMiBpbmRleF9sb3c7CisJdTMyIGluZGV4X2hpZ2g7CisJdTMyIGxlZnQsIHJpZ2h0OworCisJaW5kZXhfbG93ID0gKGluZGV4ICUgMjU2KTsKKwlpbmRleF9oaWdoID0gKChpbmRleCA+PiA4KSAlIDI1Nik7CisKKwlsZWZ0ID0gVGtpcF9TYm94X0xvd2VyW2luZGV4X2xvd10gKyAoVGtpcF9TYm94X1VwcGVyW2luZGV4X2xvd10gKiAyNTYpOworCXJpZ2h0ID0KKwkgICAgVGtpcF9TYm94X1VwcGVyW2luZGV4X2hpZ2hdICsgKFRraXBfU2JveF9Mb3dlcltpbmRleF9oaWdoXSAqIDI1Nik7CisKKwlyZXR1cm4gKGxlZnQgXiByaWdodCk7Cit9CisKK3UzMiByb3RyMSh1MzIgYSkKK3sKKwl1bnNpZ25lZCBpbnQgYjsKKworCWlmICgoYSAmIDB4MDEpID09IDB4MDEpIHsKKwkJYiA9IChhID4+IDEpIHwgMHg4MDAwOworCX0gZWxzZSB7CisJCWIgPSAoYSA+PiAxKSAmIDB4N2ZmZjsKKwl9CisJYiA9IGIgJSA2NTUzNjsKKwlyZXR1cm4gYjsKK30KKwordm9pZCBSVE1QVGtpcE1peEtleSh1OCAqIGtleSwgdTggKiB0YSwgdW5zaWduZWQgbG9uZyBwbmwsCS8qIExlYXN0IHNpZ25pZmljYW50IDE2IGJpdHMgb2YgUE4gKi8KKwkJICAgIHVuc2lnbmVkIGxvbmcgcG5oLAkvKiBNb3N0IHNpZ25pZmljYW50IDMyIGJpdHMgb2YgUE4gKi8KKwkJICAgIHU4ICogcmM0a2V5LCB1MzIgKiBwMWspCit7CisKKwl1MzIgdHNjMDsKKwl1MzIgdHNjMTsKKwl1MzIgdHNjMjsKKworCXUzMiBwcGswOworCXUzMiBwcGsxOworCXUzMiBwcGsyOworCXUzMiBwcGszOworCXUzMiBwcGs0OworCXUzMiBwcGs1OworCisJaW50IGk7CisJaW50IGo7CisKKwl0c2MwID0gKHVuc2lnbmVkIGludCkoKHBuaCA+PiAxNikgJSA2NTUzNik7CS8qIG1zYiAqLworCXRzYzEgPSAodW5zaWduZWQgaW50KShwbmggJSA2NTUzNik7CisJdHNjMiA9ICh1bnNpZ25lZCBpbnQpKHBubCAlIDY1NTM2KTsJLyogbHNiICovCisKKwkvKiBQaGFzZSAxLCBzdGVwIDEgKi8KKwlwMWtbMF0gPSB0c2MxOworCXAxa1sxXSA9IHRzYzA7CisJcDFrWzJdID0gKHUzMikodGFbMF0gKyAodGFbMV0gKiAyNTYpKTsKKwlwMWtbM10gPSAodTMyKSh0YVsyXSArICh0YVszXSAqIDI1NikpOworCXAxa1s0XSA9ICh1MzIpKHRhWzRdICsgKHRhWzVdICogMjU2KSk7CisKKwkvKiBQaGFzZSAxLCBzdGVwIDIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWogPSAyICogKGkgJiAxKTsKKwkJcDFrWzBdID0KKwkJICAgIChwMWtbMF0gKworCQkgICAgIHRraXBfc2JveCgocDFrWzRdIF4gKCgyNTYgKiBrZXlbMSArIGpdKSArIGtleVtqXSkpICUKKwkJCSAgICAgICA2NTUzNikpICUgNjU1MzY7CisJCXAxa1sxXSA9CisJCSAgICAocDFrWzFdICsKKwkJICAgICB0a2lwX3Nib3goKHAxa1swXSBeICgoMjU2ICoga2V5WzUgKyBqXSkgKyBrZXlbNCArIGpdKSkgJQorCQkJICAgICAgIDY1NTM2KSkgJSA2NTUzNjsKKwkJcDFrWzJdID0KKwkJICAgIChwMWtbMl0gKworCQkgICAgIHRraXBfc2JveCgocDFrWzFdIF4gKCgyNTYgKiBrZXlbOSArIGpdKSArIGtleVs4ICsgal0pKSAlCisJCQkgICAgICAgNjU1MzYpKSAlIDY1NTM2OworCQlwMWtbM10gPQorCQkgICAgKHAxa1szXSArCisJCSAgICAgdGtpcF9zYm94KChwMWtbMl0gXiAoKDI1NiAqIGtleVsxMyArIGpdKSArIGtleVsxMiArIGpdKSkgJQorCQkJICAgICAgIDY1NTM2KSkgJSA2NTUzNjsKKwkJcDFrWzRdID0KKwkJICAgIChwMWtbNF0gKworCQkgICAgIHRraXBfc2JveCgocDFrWzNdIF4gKCgoMjU2ICoga2V5WzEgKyBqXSkgKyBrZXlbal0pKSkgJQorCQkJICAgICAgIDY1NTM2KSkgJSA2NTUzNjsKKwkJcDFrWzRdID0gKHAxa1s0XSArIGkpICUgNjU1MzY7CisJfQorCisJLyogUGhhc2UgMiwgU3RlcCAxICovCisJcHBrMCA9IHAxa1swXTsKKwlwcGsxID0gcDFrWzFdOworCXBwazIgPSBwMWtbMl07CisJcHBrMyA9IHAxa1szXTsKKwlwcGs0ID0gcDFrWzRdOworCXBwazUgPSAocDFrWzRdICsgdHNjMikgJSA2NTUzNjsKKworCS8qIFBoYXNlMiwgU3RlcCAyICovCisJcHBrMCA9IHBwazAgKyB0a2lwX3Nib3goKHBwazUgXiAoKDI1NiAqIGtleVsxXSkgKyBrZXlbMF0pKSAlIDY1NTM2KTsKKwlwcGsxID0gcHBrMSArIHRraXBfc2JveCgocHBrMCBeICgoMjU2ICoga2V5WzNdKSArIGtleVsyXSkpICUgNjU1MzYpOworCXBwazIgPSBwcGsyICsgdGtpcF9zYm94KChwcGsxIF4gKCgyNTYgKiBrZXlbNV0pICsga2V5WzRdKSkgJSA2NTUzNik7CisJcHBrMyA9IHBwazMgKyB0a2lwX3Nib3goKHBwazIgXiAoKDI1NiAqIGtleVs3XSkgKyBrZXlbNl0pKSAlIDY1NTM2KTsKKwlwcGs0ID0gcHBrNCArIHRraXBfc2JveCgocHBrMyBeICgoMjU2ICoga2V5WzldKSArIGtleVs4XSkpICUgNjU1MzYpOworCXBwazUgPSBwcGs1ICsgdGtpcF9zYm94KChwcGs0IF4gKCgyNTYgKiBrZXlbMTFdKSArIGtleVsxMF0pKSAlIDY1NTM2KTsKKworCXBwazAgPSBwcGswICsgcm90cjEocHBrNSBeICgoMjU2ICoga2V5WzEzXSkgKyBrZXlbMTJdKSk7CisJcHBrMSA9IHBwazEgKyByb3RyMShwcGswIF4gKCgyNTYgKiBrZXlbMTVdKSArIGtleVsxNF0pKTsKKwlwcGsyID0gcHBrMiArIHJvdHIxKHBwazEpOworCXBwazMgPSBwcGszICsgcm90cjEocHBrMik7CisJcHBrNCA9IHBwazQgKyByb3RyMShwcGszKTsKKwlwcGs1ID0gcHBrNSArIHJvdHIxKHBwazQpOworCisJLyogUGhhc2UgMiwgU3RlcCAzICovCisJLyogUGhhc2UgMiwgU3RlcCAzICovCisKKwl0c2MwID0gKHVuc2lnbmVkIGludCkoKHBuaCA+PiAxNikgJSA2NTUzNik7CS8qIG1zYiAqLworCXRzYzEgPSAodW5zaWduZWQgaW50KShwbmggJSA2NTUzNik7CisJdHNjMiA9ICh1bnNpZ25lZCBpbnQpKHBubCAlIDY1NTM2KTsJLyogbHNiICovCisKKwlyYzRrZXlbMF0gPSAodHNjMiA+PiA4KSAlIDI1NjsKKwlyYzRrZXlbMV0gPSAoKCh0c2MyID4+IDgpICUgMjU2KSB8IDB4MjApICYgMHg3ZjsKKwlyYzRrZXlbMl0gPSB0c2MyICUgMjU2OworCXJjNGtleVszXSA9ICgocHBrNSBeICgoMjU2ICoga2V5WzFdKSArIGtleVswXSkpID4+IDEpICUgMjU2OworCisJcmM0a2V5WzRdID0gcHBrMCAlIDI1NjsKKwlyYzRrZXlbNV0gPSAocHBrMCA+PiA4KSAlIDI1NjsKKworCXJjNGtleVs2XSA9IHBwazEgJSAyNTY7CisJcmM0a2V5WzddID0gKHBwazEgPj4gOCkgJSAyNTY7CisKKwlyYzRrZXlbOF0gPSBwcGsyICUgMjU2OworCXJjNGtleVs5XSA9IChwcGsyID4+IDgpICUgMjU2OworCisJcmM0a2V5WzEwXSA9IHBwazMgJSAyNTY7CisJcmM0a2V5WzExXSA9IChwcGszID4+IDgpICUgMjU2OworCisJcmM0a2V5WzEyXSA9IHBwazQgJSAyNTY7CisJcmM0a2V5WzEzXSA9IChwcGs0ID4+IDgpICUgMjU2OworCisJcmM0a2V5WzE0XSA9IHBwazUgJSAyNTY7CisJcmM0a2V5WzE1XSA9IChwcGs1ID4+IDgpICUgMjU2OworfQorCisvKiAqLworLyogVFJVRTogU3VjY2VzcyEgKi8KKy8qIEZBTFNFOiBEZWNyeXB0IEVycm9yISAqLworLyogKi8KK0JPT0xFQU4gUlRNUFNvZnREZWNyeXB0VEtJUChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgdTggKnBEYXRhLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgRGF0YUJ5dGVDbnQsCisJCQkgICAgdTggVXNlclByaW9yaXR5LCBzdHJ1Y3QgcnRfY2lwaGVyX2tleSAqcFdwYUtleSkKK3sKKwl1OCBLZXlJRDsKKwl1MzIgSGVhZGVyTGVuOworCXU4IGZjMDsKKwl1OCBmYzE7CisJdTE2IGZjOworCXUzMiBmcmFtZV90eXBlOworCXUzMiBmcmFtZV9zdWJ0eXBlOworCXUzMiBmcm9tX2RzOworCXUzMiB0b19kczsKKwlpbnQgYTRfZXhpc3RzOworCWludCBxY19leGlzdHM7CisJdTE2IGR1cmF0aW9uOworCXUxNiBzZXFfY29udHJvbDsKKwl1MTYgcW9zX2NvbnRyb2w7CisJdTggVEFbTUFDX0FERFJfTEVOXTsKKwl1OCBEQVtNQUNfQUREUl9MRU5dOworCXU4IFNBW01BQ19BRERSX0xFTl07CisJdTggUkM0S2V5WzE2XTsKKwl1MzIgcDFrWzVdOwkJLypmb3IgbWl4X2tleTsgKi8KKwl1bnNpZ25lZCBsb25nIHBubDsJCS8qIExlYXN0IHNpZ25pZmljYW50IDE2IGJpdHMgb2YgUE4gKi8KKwl1bnNpZ25lZCBsb25nIHBuaDsJCS8qIE1vc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyBvZiBQTiAqLworCXUzMiBudW1fYmxvY2tzOworCXUzMiBwYXlsb2FkX3JlbWFpbmRlcjsKKwlzdHJ1Y3QgcnRfYXJjZm91cmNvbnRleHQgQXJjRm91ckNvbnRleHQ7CisJdTMyIGNyYzMyID0gMDsKKwl1MzIgdHJhaWxmY3MgPSAwOworCXU4IE1JQ1s4XTsKKwl1OCBUcmFpbE1JQ1s4XTsKKworCWZjMCA9ICpwRGF0YTsKKwlmYzEgPSAqKHBEYXRhICsgMSk7CisKKwlmYyA9ICooKHUxNiAqKXBEYXRhKTsKKworCWZyYW1lX3R5cGUgPSAoKGZjMCA+PiAyKSAmIDB4MDMpOworCWZyYW1lX3N1YnR5cGUgPSAoKGZjMCA+PiA0KSAmIDB4MGYpOworCisJZnJvbV9kcyA9IChmYzEgJiAweDIpID4+IDE7CisJdG9fZHMgPSAoZmMxICYgMHgxKTsKKworCWE0X2V4aXN0cyA9IChmcm9tX2RzICYgdG9fZHMpOworCXFjX2V4aXN0cyA9ICgoZnJhbWVfc3VidHlwZSA9PSAweDA4KSB8fAkvKiBBc3N1bWVkIFFvUyBzdWJ0eXBlcyAqLworCQkgICAgIChmcmFtZV9zdWJ0eXBlID09IDB4MDkpIHx8CS8qIExpa2VseSB0byBjaGFuZ2UuICAgICovCisJCSAgICAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwYSkgfHwgKGZyYW1lX3N1YnR5cGUgPT0gMHgwYikKKwkgICAgKTsKKworCUhlYWRlckxlbiA9IDI0OworCWlmIChhNF9leGlzdHMpCisJCUhlYWRlckxlbiArPSA2OworCisJS2V5SUQgPSAqKCh1OCAqKShwRGF0YSArIEhlYWRlckxlbiArIDMpKTsKKwlLZXlJRCA9IEtleUlEID4+IDY7CisKKwlpZiAocFdwYUtleVtLZXlJRF0uS2V5TGVuID09IDApIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJSVE1QU29mdERlY3J5cHRUS0lQIGZhaWxlZCEoS2V5SURbJWRdIExlbmd0aCBjYW4gbm90IGJlIDApXG4iLAorCQkJICBLZXlJRCkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJZHVyYXRpb24gPSAqKCh1MTYgKikocERhdGEgKyAyKSk7CisKKwlzZXFfY29udHJvbCA9ICooKHUxNiAqKShwRGF0YSArIDIyKSk7CisKKwlpZiAocWNfZXhpc3RzKSB7CisJCWlmIChhNF9leGlzdHMpIHsKKwkJCXFvc19jb250cm9sID0gKigodTE2ICopKHBEYXRhICsgMzApKTsKKwkJfSBlbHNlIHsKKwkJCXFvc19jb250cm9sID0gKigodTE2ICopKHBEYXRhICsgMjQpKTsKKwkJfQorCX0KKworCWlmICh0b19kcyA9PSAwICYmIGZyb21fZHMgPT0gMSkgeworCQlOZGlzTW92ZU1lbW9yeShEQSwgcERhdGEgKyA0LCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShTQSwgcERhdGEgKyAxNiwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoVEEsIHBEYXRhICsgMTAsIE1BQ19BRERSX0xFTik7CS8qQlNTSUQgKi8KKwl9IGVsc2UgaWYgKHRvX2RzID09IDAgJiYgZnJvbV9kcyA9PSAwKSB7CisJCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSArIDEwLCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShEQSwgcERhdGEgKyA0LCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShTQSwgcERhdGEgKyAxMCwgTUFDX0FERFJfTEVOKTsKKwl9IGVsc2UgaWYgKHRvX2RzID09IDEgJiYgZnJvbV9kcyA9PSAwKSB7CisJCU5kaXNNb3ZlTWVtb3J5KFNBLCBwRGF0YSArIDEwLCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShUQSwgcERhdGEgKyAxMCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhICsgMTYsIE1BQ19BRERSX0xFTik7CisJfSBlbHNlIGlmICh0b19kcyA9PSAxICYmIGZyb21fZHMgPT0gMSkgeworCQlOZGlzTW92ZU1lbW9yeShUQSwgcERhdGEgKyAxMCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhICsgMTYsIE1BQ19BRERSX0xFTik7CisJCU5kaXNNb3ZlTWVtb3J5KFNBLCBwRGF0YSArIDIyLCBNQUNfQUREUl9MRU4pOworCX0KKworCW51bV9ibG9ja3MgPSAoRGF0YUJ5dGVDbnQgLSAxNikgLyAxNjsKKwlwYXlsb2FkX3JlbWFpbmRlciA9IChEYXRhQnl0ZUNudCAtIDE2KSAlIDE2OworCisJcG5sID0gKCoocERhdGEgKyBIZWFkZXJMZW4pKSAqIDI1NiArICoocERhdGEgKyBIZWFkZXJMZW4gKyAyKTsKKwlwbmggPSAqKCh1bnNpZ25lZCBsb25nICopKHBEYXRhICsgSGVhZGVyTGVuICsgNCkpOworCXBuaCA9IGNwdTJsZTMyKHBuaCk7CisJUlRNUFRraXBNaXhLZXkocFdwYUtleVtLZXlJRF0uS2V5LCBUQSwgcG5sLCBwbmgsIFJDNEtleSwgcDFrKTsKKworCUFSQ0ZPVVJfSU5JVCgmQXJjRm91ckNvbnRleHQsIFJDNEtleSwgMTYpOworCisJQVJDRk9VUl9ERUNSWVBUKCZBcmNGb3VyQ29udGV4dCwgcERhdGEgKyBIZWFkZXJMZW4sCisJCQlwRGF0YSArIEhlYWRlckxlbiArIDgsIERhdGFCeXRlQ250IC0gSGVhZGVyTGVuIC0gOCk7CisJTmRpc01vdmVNZW1vcnkoJnRyYWlsZmNzLCBwRGF0YSArIERhdGFCeXRlQ250IC0gOCAtIDQsIDQpOworCWNyYzMyID0gUlRNUF9DQUxDX0ZDUzMyKFBQUElOSVRGQ1MzMiwgcERhdGEgKyBIZWFkZXJMZW4sIERhdGFCeXRlQ250IC0gSGVhZGVyTGVuIC0gOCAtIDQpOwkvKlNraXAgSVYrRUlWIDggYnl0ZXMgJiBTa2lwIGxhc3QgNCBieXRlcyhGQ1MpLiAqLworCWNyYzMyIF49IDB4ZmZmZmZmZmY7CS8qIGNvbXBsZW1lbnQgKi8KKworCWlmIChjcmMzMiAhPSBjcHUybGUzMih0cmFpbGZjcykpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNvZnREZWNyeXB0VEtJUCwgV0VQIERhdGEgSUNWIEVycm9yICFcbiIpKTsJLypJQ1YgZXJyb3IuICovCisKKwkJcmV0dXJuIChGQUxTRSk7CisJfQorCisJTmRpc01vdmVNZW1vcnkoVHJhaWxNSUMsIHBEYXRhICsgRGF0YUJ5dGVDbnQgLSA4IC0gOCAtIDQsIDgpOworCVJUTVBJbml0TUlDRW5naW5lKHBBZCwgcFdwYUtleVtLZXlJRF0uS2V5LCBEQSwgU0EsIFVzZXJQcmlvcml0eSwKKwkJCSAgcFdwYUtleVtLZXlJRF0uUnhNaWMpOworCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwRGF0YSArIEhlYWRlckxlbiwKKwkJICAgICAgIERhdGFCeXRlQ250IC0gSGVhZGVyTGVuIC0gOCAtIDEyKTsKKwlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5UeCk7CisJTmRpc01vdmVNZW1vcnkoTUlDLCBwQWQtPlByaXZhdGVJbmZvLlR4Lk1JQywgOCk7CisKKwlpZiAoIU5kaXNFcXVhbE1lbW9yeShNSUMsIFRyYWlsTUlDLCA4KSkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVE1QU29mdERlY3J5cHRUS0lQLCBXRVAgRGF0YSBNSUMgRXJyb3IgIVxuIikpOwkvKk1JQyBlcnJvci4gKi8KKwkJLypSVE1QUmVwb3J0TWljRXJyb3IocEFkLCAmcFdwYUtleVtLZXlJRF0pOyAgICAgLy8gbWFya2VkIGJ5IEFsYmVydFkgQCAyMDA2MDYzMCAqLworCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisJLypEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgIlJUTVBTb2Z0RGVjcnlwdFRLSVAgRGVjcmlwdCBkb25lIVxuIik7ICovCisJcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fd2VwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fd2VwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZmODgwYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV93ZXAuYwpAQCAtMCwwICsxLDQ3MyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydG1wX3dlcC5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJUGF1bCBXdQkJMTAtMjgtMDIJCUluaXRpYWwKKyovCisKKyNpbmNsdWRlCSIuLi9ydF9jb25maWcuaCIKKwordTMyIEZDU1RBQl8zMlsyNTZdID0geworCTB4MDAwMDAwMDAsIDB4NzcwNzMwOTYsIDB4ZWUwZTYxMmMsIDB4OTkwOTUxYmEsCisJMHgwNzZkYzQxOSwgMHg3MDZhZjQ4ZiwgMHhlOTYzYTUzNSwgMHg5ZTY0OTVhMywKKwkweDBlZGI4ODMyLCAweDc5ZGNiOGE0LCAweGUwZDVlOTFlLCAweDk3ZDJkOTg4LAorCTB4MDliNjRjMmIsIDB4N2ViMTdjYmQsIDB4ZTdiODJkMDcsIDB4OTBiZjFkOTEsCisJMHgxZGI3MTA2NCwgMHg2YWIwMjBmMiwgMHhmM2I5NzE0OCwgMHg4NGJlNDFkZSwKKwkweDFhZGFkNDdkLCAweDZkZGRlNGViLCAweGY0ZDRiNTUxLCAweDgzZDM4NWM3LAorCTB4MTM2Yzk4NTYsIDB4NjQ2YmE4YzAsIDB4ZmQ2MmY5N2EsIDB4OGE2NWM5ZWMsCisJMHgxNDAxNWM0ZiwgMHg2MzA2NmNkOSwgMHhmYTBmM2Q2MywgMHg4ZDA4MGRmNSwKKwkweDNiNmUyMGM4LCAweDRjNjkxMDVlLCAweGQ1NjA0MWU0LCAweGEyNjc3MTcyLAorCTB4M2MwM2U0ZDEsIDB4NGIwNGQ0NDcsIDB4ZDIwZDg1ZmQsIDB4YTUwYWI1NmIsCisJMHgzNWI1YThmYSwgMHg0MmIyOTg2YywgMHhkYmJiYzlkNiwgMHhhY2JjZjk0MCwKKwkweDMyZDg2Y2UzLCAweDQ1ZGY1Yzc1LCAweGRjZDYwZGNmLCAweGFiZDEzZDU5LAorCTB4MjZkOTMwYWMsIDB4NTFkZTAwM2EsIDB4YzhkNzUxODAsIDB4YmZkMDYxMTYsCisJMHgyMWI0ZjRiNSwgMHg1NmIzYzQyMywgMHhjZmJhOTU5OSwgMHhiOGJkYTUwZiwKKwkweDI4MDJiODllLCAweDVmMDU4ODA4LCAweGM2MGNkOWIyLCAweGIxMGJlOTI0LAorCTB4MmY2ZjdjODcsIDB4NTg2ODRjMTEsIDB4YzE2MTFkYWIsIDB4YjY2NjJkM2QsCisJMHg3NmRjNDE5MCwgMHgwMWRiNzEwNiwgMHg5OGQyMjBiYywgMHhlZmQ1MTAyYSwKKwkweDcxYjE4NTg5LCAweDA2YjZiNTFmLCAweDlmYmZlNGE1LCAweGU4YjhkNDMzLAorCTB4NzgwN2M5YTIsIDB4MGYwMGY5MzQsIDB4OTYwOWE4OGUsIDB4ZTEwZTk4MTgsCisJMHg3ZjZhMGRiYiwgMHgwODZkM2QyZCwgMHg5MTY0NmM5NywgMHhlNjYzNWMwMSwKKwkweDZiNmI1MWY0LCAweDFjNmM2MTYyLCAweDg1NjUzMGQ4LCAweGYyNjIwMDRlLAorCTB4NmMwNjk1ZWQsIDB4MWIwMWE1N2IsIDB4ODIwOGY0YzEsIDB4ZjUwZmM0NTcsCisJMHg2NWIwZDljNiwgMHgxMmI3ZTk1MCwgMHg4YmJlYjhlYSwgMHhmY2I5ODg3YywKKwkweDYyZGQxZGRmLCAweDE1ZGEyZDQ5LCAweDhjZDM3Y2YzLCAweGZiZDQ0YzY1LAorCTB4NGRiMjYxNTgsIDB4M2FiNTUxY2UsIDB4YTNiYzAwNzQsIDB4ZDRiYjMwZTIsCisJMHg0YWRmYTU0MSwgMHgzZGQ4OTVkNywgMHhhNGQxYzQ2ZCwgMHhkM2Q2ZjRmYiwKKwkweDQzNjllOTZhLCAweDM0NmVkOWZjLCAweGFkNjc4ODQ2LCAweGRhNjBiOGQwLAorCTB4NDQwNDJkNzMsIDB4MzMwMzFkZTUsIDB4YWEwYTRjNWYsIDB4ZGQwZDdjYzksCisJMHg1MDA1NzEzYywgMHgyNzAyNDFhYSwgMHhiZTBiMTAxMCwgMHhjOTBjMjA4NiwKKwkweDU3NjhiNTI1LCAweDIwNmY4NWIzLCAweGI5NjZkNDA5LCAweGNlNjFlNDlmLAorCTB4NWVkZWY5MGUsIDB4MjlkOWM5OTgsIDB4YjBkMDk4MjIsIDB4YzdkN2E4YjQsCisJMHg1OWIzM2QxNywgMHgyZWI0MGQ4MSwgMHhiN2JkNWMzYiwgMHhjMGJhNmNhZCwKKwkweGVkYjg4MzIwLCAweDlhYmZiM2I2LCAweDAzYjZlMjBjLCAweDc0YjFkMjlhLAorCTB4ZWFkNTQ3MzksIDB4OWRkMjc3YWYsIDB4MDRkYjI2MTUsIDB4NzNkYzE2ODMsCisJMHhlMzYzMGIxMiwgMHg5NDY0M2I4NCwgMHgwZDZkNmEzZSwgMHg3YTZhNWFhOCwKKwkweGU0MGVjZjBiLCAweDkzMDlmZjlkLCAweDBhMDBhZTI3LCAweDdkMDc5ZWIxLAorCTB4ZjAwZjkzNDQsIDB4ODcwOGEzZDIsIDB4MWUwMWYyNjgsIDB4NjkwNmMyZmUsCisJMHhmNzYyNTc1ZCwgMHg4MDY1NjdjYiwgMHgxOTZjMzY3MSwgMHg2ZTZiMDZlNywKKwkweGZlZDQxYjc2LCAweDg5ZDMyYmUwLCAweDEwZGE3YTVhLCAweDY3ZGQ0YWNjLAorCTB4ZjliOWRmNmYsIDB4OGViZWVmZjksIDB4MTdiN2JlNDMsIDB4NjBiMDhlZDUsCisJMHhkNmQ2YTNlOCwgMHhhMWQxOTM3ZSwgMHgzOGQ4YzJjNCwgMHg0ZmRmZjI1MiwKKwkweGQxYmI2N2YxLCAweGE2YmM1NzY3LCAweDNmYjUwNmRkLCAweDQ4YjIzNjRiLAorCTB4ZDgwZDJiZGEsIDB4YWYwYTFiNGMsIDB4MzYwMzRhZjYsIDB4NDEwNDdhNjAsCisJMHhkZjYwZWZjMywgMHhhODY3ZGY1NSwgMHgzMTZlOGVlZiwgMHg0NjY5YmU3OSwKKwkweGNiNjFiMzhjLCAweGJjNjY4MzFhLCAweDI1NmZkMmEwLCAweDUyNjhlMjM2LAorCTB4Y2MwYzc3OTUsIDB4YmIwYjQ3MDMsIDB4MjIwMjE2YjksIDB4NTUwNTI2MmYsCisJMHhjNWJhM2JiZSwgMHhiMmJkMGIyOCwgMHgyYmI0NWE5MiwgMHg1Y2IzNmEwNCwKKwkweGMyZDdmZmE3LCAweGI1ZDBjZjMxLCAweDJjZDk5ZThiLCAweDViZGVhZTFkLAorCTB4OWI2NGMyYjAsIDB4ZWM2M2YyMjYsIDB4NzU2YWEzOWMsIDB4MDI2ZDkzMGEsCisJMHg5YzA5MDZhOSwgMHhlYjBlMzYzZiwgMHg3MjA3Njc4NSwgMHgwNTAwNTcxMywKKwkweDk1YmY0YTgyLCAweGUyYjg3YTE0LCAweDdiYjEyYmFlLCAweDBjYjYxYjM4LAorCTB4OTJkMjhlOWIsIDB4ZTVkNWJlMGQsIDB4N2NkY2VmYjcsIDB4MGJkYmRmMjEsCisJMHg4NmQzZDJkNCwgMHhmMWQ0ZTI0MiwgMHg2OGRkYjNmOCwgMHgxZmRhODM2ZSwKKwkweDgxYmUxNmNkLCAweGY2YjkyNjViLCAweDZmYjA3N2UxLCAweDE4Yjc0Nzc3LAorCTB4ODgwODVhZTYsIDB4ZmYwZjZhNzAsIDB4NjYwNjNiY2EsIDB4MTEwMTBiNWMsCisJMHg4ZjY1OWVmZiwgMHhmODYyYWU2OSwgMHg2MTZiZmZkMywgMHgxNjZjY2Y0NSwKKwkweGEwMGFlMjc4LCAweGQ3MGRkMmVlLCAweDRlMDQ4MzU0LCAweDM5MDNiM2MyLAorCTB4YTc2NzI2NjEsIDB4ZDA2MDE2ZjcsIDB4NDk2OTQ3NGQsIDB4M2U2ZTc3ZGIsCisJMHhhZWQxNmE0YSwgMHhkOWQ2NWFkYywgMHg0MGRmMGI2NiwgMHgzN2Q4M2JmMCwKKwkweGE5YmNhZTUzLCAweGRlYmI5ZWM1LCAweDQ3YjJjZjdmLCAweDMwYjVmZmU5LAorCTB4YmRiZGYyMWMsIDB4Y2FiYWMyOGEsIDB4NTNiMzkzMzAsIDB4MjRiNGEzYTYsCisJMHhiYWQwMzYwNSwgMHhjZGQ3MDY5MywgMHg1NGRlNTcyOSwgMHgyM2Q5NjdiZiwKKwkweGIzNjY3YTJlLCAweGM0NjE0YWI4LCAweDVkNjgxYjAyLCAweDJhNmYyYjk0LAorCTB4YjQwYmJlMzcsIDB4YzMwYzhlYTEsIDB4NWEwNWRmMWIsIDB4MmQwMmVmOGQKK307CisKKy8qCit1OCAgIFdFUEtFWVtdID0geworCQkvL0lWCisJCTB4MDAsIDB4MTEsIDB4MjIsCisJCS8vV0VQIEtFWQorCQkweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LCAweDg4LCAweDk5LCAweEFBLCAweEJCLCAweENDCisJfTsKKyAqLworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJSW5pdCBXRVAgZnVuY3Rpb24uCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcEtleSAgICAgICAgUG9pbnRlciB0byB0aGUgV0VQIEtFWQorCQlLZXlJZAkJICAgV0VQIEtleSBJRAorCQlLZXlMZW4gICAgICB0aGUgbGVuZ3RoIG9mIFdFUCBLRVkKKwkJcERlc3QgICAgICAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gd2hpY2ggRW5jcnlwdGlvbiBkYXRhIHdpbGwgc3RvcmUgaW4uCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlRNUEluaXRXZXBFbmdpbmUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICAgdTggKnBLZXksCisJCSAgICAgICB1OCBLZXlJZCwgdTggS2V5TGVuLCBJTiB1OCAqcERlc3QpCit7CisJdTMyIGk7CisJdTggV0VQS0VZW10gPSB7CisJCS8qSVYgKi8KKwkJMHgwMCwgMHgxMSwgMHgyMiwKKwkJLypXRVAgS0VZICovCisJCTB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OTksCisJCSAgICAweEFBLCAweEJCLCAweENDCisJfTsKKworCXBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIgPSBQUFBJTklURkNTMzI7CS8qSW5pdCBjcmMzMi4gKi8KKworCXsKKwkJTmRpc01vdmVNZW1vcnkoV0VQS0VZICsgMywgcEtleSwgS2V5TGVuKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJV0VQS0VZW2ldID0gUmFuZG9tQnl0ZShwQWQpOwkvKkNhbGwgbWxtZSBSYW5kb21CeXRlKCkgZnVuY3Rpb24uICovCisJCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBXRVBLRVksIEtleUxlbiArIDMpOwkvKklOSVQgU0JPWCwgS0VZTEVOKzMoSVYpICovCisKKwkJTmRpc01vdmVNZW1vcnkocERlc3QsIFdFUEtFWSwgMyk7CS8qQXBwZW5kIEluaXQgVmVjdG9yICovCisJfQorCSoocERlc3QgKyAzKSA9IChLZXlJZCA8PCA2KTsJLypBcHBlbmQgS0VZSUQgKi8KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJRW5jcnlwdCB0cmFuc2ltaXR0ZWQgZGF0YQorCisJQXJndW1lbnRzOgorICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICBwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSB0cmFuc2ltaXR0ZWQgc291cmNlIGRhdGEgdGhhdCB3aWxsIGJlIGVuY3J5cHQKKyAgICAgIHBEZXN0ICAgICAgIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIHdoZXJlIGVudHJ5cHRpb24gZGF0YSB3aWxsIGJlIHN0b3JlIGluLgorICAgICAgTGVuCQkJSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgc291cmNlIGRhdGEKKworCVJldHVybiBWYWx1ZToKKyAgICAgIE5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlRNUEVuY3J5cHREYXRhKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICB1OCAqcFNyYywgdTggKnBEZXN0LCB1MzIgTGVuKQoreworCXBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIgPQorCSAgICBSVE1QX0NBTENfRkNTMzIocEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiwgcFNyYywgTGVuKTsKKwlBUkNGT1VSX0VOQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcERlc3QsIHBTcmMsIExlbik7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlEZWNyeXB0IHJlY2VpdmVkIFdFUCBkYXRhCisKKwlBcmd1bWVudHM6CisJCXBBZGFwdGVyCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHJlY2VpdmVkIGRhdGEKKwkJTGVuICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgcmVjZWl2ZWQgZGF0YQorCisJUmV0dXJuIFZhbHVlOgorCQlUUlVFICAgICAgICBEZWNyeXB0IFdFUCBkYXRhIHN1Y2Nlc3MKKwkJRkFMU0UgICAgICAgRGVjcnlwdCBXRVAgZGF0YSBmYWlsZWQKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFJUTVBTb2Z0RGVjcnlwdFdFUChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB1OCAqcERhdGEsCisJCQkgICB1bnNpZ25lZCBsb25nIERhdGFCeXRlQ250LCBzdHJ1Y3QgcnRfY2lwaGVyX2tleSAqcEdyb3VwS2V5KQoreworCXUzMiB0cmFpbGZjczsKKwl1MzIgY3JjMzI7CisJdTggS2V5SWR4OworCXU4IFdFUEtFWVtdID0geworCQkvKklWICovCisJCTB4MDAsIDB4MTEsIDB4MjIsCisJCS8qV0VQIEtFWSAqLworCQkweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LCAweDg4LCAweDk5LAorCQkgICAgMHhBQSwgMHhCQiwgMHhDQworCX07CisJdTggKnBQYXlsb2FkID0gKHU4ICopIHBEYXRhICsgTEVOR1RIXzgwMl8xMTsKKwl1bnNpZ25lZCBsb25nIHBheWxvYWRfbGVuID0gRGF0YUJ5dGVDbnQgLSBMRU5HVEhfODAyXzExOworCisJTmRpc01vdmVNZW1vcnkoV0VQS0VZLCBwUGF5bG9hZCwgMyk7CS8qR2V0IFdFUCBJViAqLworCisJS2V5SWR4ID0gKCoocFBheWxvYWQgKyAzKSAmIDB4YzApID4+IDY7CisJaWYgKHBHcm91cEtleVtLZXlJZHhdLktleUxlbiA9PSAwKQorCQlyZXR1cm4gKEZBTFNFKTsKKworCU5kaXNNb3ZlTWVtb3J5KFdFUEtFWSArIDMsIHBHcm91cEtleVtLZXlJZHhdLktleSwKKwkJICAgICAgIHBHcm91cEtleVtLZXlJZHhdLktleUxlbik7CisJQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIFdFUEtFWSwKKwkJICAgICBwR3JvdXBLZXlbS2V5SWR4XS5LZXlMZW4gKyAzKTsKKwlBUkNGT1VSX0RFQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcFBheWxvYWQsIHBQYXlsb2FkICsgNCwKKwkJCXBheWxvYWRfbGVuIC0gNCk7CisJTmRpc01vdmVNZW1vcnkoJnRyYWlsZmNzLCBwUGF5bG9hZCArIHBheWxvYWRfbGVuIC0gOCwgNCk7CisJY3JjMzIgPSBSVE1QX0NBTENfRkNTMzIoUFBQSU5JVEZDUzMyLCBwUGF5bG9hZCwgcGF5bG9hZF9sZW4gLSA4KTsJLypTa2lwIGxhc3QgNCBieXRlcyhGQ1MpLiAqLworCWNyYzMyIF49IDB4ZmZmZmZmZmY7CS8qIGNvbXBsZW1lbnQgKi8KKworCWlmIChjcmMzMiAhPSBjcHUybGUzMih0cmFpbGZjcykpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV0VQIERhdGEgQ1JDIEVycm9yIVxuIikpOwkvKkNSQyBlcnJvci4gKi8KKwkJcmV0dXJuIChGQUxTRSk7CisJfQorCXJldHVybiAoVFJVRSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlUaGUgU3RyZWFtIENpcGhlciBFbmNyeXB0aW9uIEFsZ29yaXRobSAic3RydWN0IHJ0X2FyY2ZvdXIiIGluaXRpYWxpemUKKworCUFyZ3VtZW50czoKKwkgICBDdHggICAgICAgICBQb2ludGVyIHRvIHN0cnVjdCBydF9hcmNmb3VyIENPTlRFWFQgKFNCT1gpCisJCXBLZXkgICAgICAgIFBvaW50ZXIgdG8gdGhlIFdFUCBLRVkKKwkJS2V5TGVuICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBmbyB0aGUgV0VQIEtFWQorCisJUmV0dXJuIFZhbHVlOgorCSAgIE5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgQVJDRk9VUl9JTklUKHN0cnVjdCBydF9hcmNmb3VyY29udGV4dCAqQ3R4LCB1OCAqcEtleSwgdTMyIEtleUxlbikKK3sKKwl1OCB0LCB1OworCXUzMiBrZXlpbmRleDsKKwl1MzIgc3RhdGVpbmRleDsKKwl1OCAqc3RhdGU7CisJdTMyIGNvdW50ZXI7CisKKwlzdGF0ZSA9IEN0eC0+U1RBVEU7CisJQ3R4LT5YID0gMDsKKwlDdHgtPlkgPSAwOworCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCAyNTY7IGNvdW50ZXIrKykKKwkJc3RhdGVbY291bnRlcl0gPSAodTgpY291bnRlcjsKKwlrZXlpbmRleCA9IDA7CisJc3RhdGVpbmRleCA9IDA7CisJZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IDI1NjsgY291bnRlcisrKSB7CisJCXQgPSBzdGF0ZVtjb3VudGVyXTsKKwkJc3RhdGVpbmRleCA9IChzdGF0ZWluZGV4ICsgcEtleVtrZXlpbmRleF0gKyB0KSAmIDB4ZmY7CisJCXUgPSBzdGF0ZVtzdGF0ZWluZGV4XTsKKwkJc3RhdGVbc3RhdGVpbmRleF0gPSB0OworCQlzdGF0ZVtjb3VudGVyXSA9IHU7CisJCWlmICgrK2tleWluZGV4ID49IEtleUxlbikKKwkJCWtleWluZGV4ID0gMDsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlHZXQgYnl0ZXMgZnJvbSBzdHJ1Y3QgcnRfYXJjZm91ciBDT05URVhUIChTLUJPWCkKKworCUFyZ3VtZW50czoKKwkgICBDdHggICAgICAgICBQb2ludGVyIHRvIHN0cnVjdCBydF9hcmNmb3VyIENPTlRFWFQgKFNCT1gpCisKKwlSZXR1cm4gVmFsdWU6CisJICAgdTggIC0gdGhlIHZhbHVlIG9mIHRoZSBzdHJ1Y3QgcnRfYXJjZm91ciBDT05URVhUIChTLUJPWCkKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit1OCBBUkNGT1VSX0JZVEUoc3RydWN0IHJ0X2FyY2ZvdXJjb250ZXh0ICpDdHgpCit7CisJdTMyIHg7CisJdTMyIHk7CisJdTggc3gsIHN5OworCXU4ICpzdGF0ZTsKKworCXN0YXRlID0gQ3R4LT5TVEFURTsKKwl4ID0gKEN0eC0+WCArIDEpICYgMHhmZjsKKwlzeCA9IHN0YXRlW3hdOworCXkgPSAoc3ggKyBDdHgtPlkpICYgMHhmZjsKKwlzeSA9IHN0YXRlW3ldOworCUN0eC0+WCA9IHg7CisJQ3R4LT5ZID0geTsKKwlzdGF0ZVt5XSA9IHN4OworCXN0YXRlW3hdID0gc3k7CisKKwlyZXR1cm4gKHN0YXRlWyhzeCArIHN5KSAmIDB4ZmZdKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJVGhlIFN0cmVhbSBDaXBoZXIgRGVjcnlwdGlvbiBBbGdvcml0aG0KKworCUFyZ3VtZW50czoKKwkJQ3R4ICAgICAgICAgUG9pbnRlciB0byBzdHJ1Y3QgcnRfYXJjZm91ciBDT05URVhUIChTQk9YKQorCQlwRGVzdAkJCVBvaW50ZXIgdG8gdGhlIERlc3RpbmF0aW9uCisJCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIFNvdXJjZSBkYXRhCisJCUxlbiAgICAgICAgIEluZGljYXRlIHRoZSBsZW5ndGggb2YgdGhlIFNvdXJjZSBkYXRhCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIEFSQ0ZPVVJfREVDUllQVChzdHJ1Y3QgcnRfYXJjZm91cmNvbnRleHQgKkN0eCwKKwkJICAgICB1OCAqcERlc3QsIHU4ICpwU3JjLCB1MzIgTGVuKQoreworCXUzMiBpOworCisJZm9yIChpID0gMDsgaSA8IExlbjsgaSsrKQorCQlwRGVzdFtpXSA9IHBTcmNbaV0gXiBBUkNGT1VSX0JZVEUoQ3R4KTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCVRoZSBTdHJlYW0gQ2lwaGVyIEVuY3J5cHRpb24gQWxnb3JpdGhtCisKKwlBcmd1bWVudHM6CisJCUN0eCAgICAgICAgIFBvaW50ZXIgdG8gc3RydWN0IHJ0X2FyY2ZvdXIgQ09OVEVYVCAoU0JPWCkKKwkJcERlc3QJCQlQb2ludGVyIHRvIHRoZSBEZXN0aW5hdGlvbgorCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSBTb3VyY2UgZGF0YQorCQlMZW4gICAgICAgICBJbmRpY2F0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBTb3VyY2UgZHRhCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgQVJDRk9VUl9FTkNSWVBUKHN0cnVjdCBydF9hcmNmb3VyY29udGV4dCAqQ3R4LAorCQkgICAgIHU4ICpwRGVzdCwgdTggKnBTcmMsIHUzMiBMZW4pCit7CisJdTMyIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTGVuOyBpKyspCisJCXBEZXN0W2ldID0gcFNyY1tpXSBeIEFSQ0ZPVVJfQllURShDdHgpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJVGhlIFN0cmVhbSBDaXBoZXIgRW5jcnlwdGlvbiBBbGdvcml0aG0gd2hpY2ggY29uZm9ybSB0byB0aGUgc3BlY2lhbCByZXF1aXJlbWVudCB0byBlbmNyeXB0ICBHVEsuCisKKwlBcmd1bWVudHM6CisJCUN0eCAgICAgICAgIFBvaW50ZXIgdG8gc3RydWN0IHJ0X2FyY2ZvdXIgQ09OVEVYVCAoU0JPWCkKKwkJcERlc3QJCQlQb2ludGVyIHRvIHRoZSBEZXN0aW5hdGlvbgorCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSBTb3VyY2UgZGF0YQorCQlMZW4gICAgICAgICBJbmRpY2F0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBTb3VyY2UgZHRhCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK3ZvaWQgV1BBQVJDRk9VUl9FTkNSWVBUKHN0cnVjdCBydF9hcmNmb3VyY29udGV4dCAqQ3R4LAorCQkJdTggKnBEZXN0LCB1OCAqcFNyYywgdTMyIExlbikKK3sKKwl1MzIgaTsKKwkvKmRpc2NhcmQgZmlyc3QgMjU2IGJ5dGVzICovCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorCQlBUkNGT1VSX0JZVEUoQ3R4KTsKKworCWZvciAoaSA9IDA7IGkgPCBMZW47IGkrKykKKwkJcERlc3RbaV0gPSBwU3JjW2ldIF4gQVJDRk9VUl9CWVRFKEN0eCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDYWxjdWxhdGUgYSBuZXcgRkNTIGdpdmVuIHRoZSBjdXJyZW50IEZDUyBhbmQgdGhlIG5ldyBkYXRhLgorCisJQXJndW1lbnRzOgorCQlGY3MJICAgICAgdGhlIG9yaWdpbmFsIEZDUyB2YWx1ZQorCQlDcCAgICAgICAgICBwb2ludGVyIHRvIHRoZSBkYXRhIHdoaWNoIHdpbGwgYmUgY2FsY3VsYXRlIHRoZSBGQ1MKKwkJTGVuICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YQorCisJUmV0dXJuIFZhbHVlOgorCQl1MzIgLSBGQ1MgMzIgYml0cworCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordTMyIFJUTVBfQ0FMQ19GQ1MzMih1MzIgRmNzLCB1OCAqQ3AsIGludCBMZW4pCit7CisJd2hpbGUgKExlbi0tKQorCQlGY3MgPSAoKChGY3MpID4+IDgpIF4gRkNTVEFCXzMyWygoRmNzKSBeICgqQ3ArKykpICYgMHhmZl0pOworCisJcmV0dXJuIChGY3MpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJR2V0IGxhc3QgRkNTIGFuZCBlbmNyeXB0IGl0IHRvIHRoZSBkZXN0aW5hdGlvbgorCisJQXJndW1lbnRzOgorCQlwRGVzdAkJCVBvaW50ZXIgdG8gdGhlIERlc3RpbmF0aW9uCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUTVBTZXRJQ1Yoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCAqcERlc3QpCit7CisJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiBePSAweGZmZmZmZmZmOwkvKiBjb21wbGVtZW50ICovCisJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IGNwdTJsZTMyKHBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIpOworCisJQVJDRk9VUl9FTkNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIHBEZXN0LAorCQkJKHU4ICopJiBwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCA0KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV93cGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV93cGEuYwppbmRleCAyZGUyOWZkLi45NGUxMTlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fd3BhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3dwYS5jCkBAIC0zNiwyNSArMzYsMTIxOSBAQAogCVBhdWwgTGluCTAzLTExLTI4CQlNb2RpZnkgZm9yIHN1cHBsaWNhbnQKICovCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0vLyBXUEEgT1VJCi1VQ0hBUgkJT1VJX1dQQV9OT05FX0FLTVs0XQkJPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwMH07Ci1VQ0hBUiAgICAgICBPVUlfV1BBX1ZFUlNJT05bNF0gICAgICA9IHsweDAwLCAweDUwLCAweEYyLCAweDAxfTsKLVVDSEFSICAgICAgIE9VSV9XUEFfV0VQNDBbNF0gICAgICA9IHsweDAwLCAweDUwLCAweEYyLCAweDAxfTsKLVVDSEFSICAgICAgIE9VSV9XUEFfVEtJUFs0XSAgICAgPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwMn07Ci1VQ0hBUiAgICAgICBPVUlfV1BBX0NDTVBbNF0gICAgID0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDR9OwotVUNIQVIgICAgICAgT1VJX1dQQV9XRVAxMDRbNF0gICAgICA9IHsweDAwLCAweDUwLCAweEYyLCAweDA1fTsKLVVDSEFSICAgICAgIE9VSV9XUEFfODAyMVhfQUtNWzRdCT0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDF9OwotVUNIQVIgICAgICAgT1VJX1dQQV9QU0tfQUtNWzRdICAgICAgPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwMn07Ci0vLyBXUEEyIE9VSQotVUNIQVIgICAgICAgT1VJX1dQQTJfV0VQNDBbNF0gICA9IHsweDAwLCAweDBGLCAweEFDLCAweDAxfTsKLVVDSEFSICAgICAgIE9VSV9XUEEyX1RLSVBbNF0gICAgICAgID0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDJ9OwotVUNIQVIgICAgICAgT1VJX1dQQTJfQ0NNUFs0XSAgICAgICAgPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwNH07Ci1VQ0hBUiAgICAgICBPVUlfV1BBMl84MDIxWF9BS01bNF0gICA9IHsweDAwLCAweDBGLCAweEFDLCAweDAxfTsKLVVDSEFSICAgICAgIE9VSV9XUEEyX1BTS19BS01bNF0gICAJPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwMn07Ci1VQ0hBUiAgICAgICBPVUlfV1BBMl9XRVAxMDRbNF0gICA9IHsweDAwLCAweDBGLCAweEFDLCAweDA1fTsKLS8vIE1TQSBPVUkKLVVDSEFSICAgCU9VSV9NU0FfODAyMVhfQUtNWzRdICAgID0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDV9OwkJLy8gTm90IHlldCBmaW5hbCAtIElFRUUgODAyLjExcy1EMS4wNgotVUNIQVIgICAJT1VJX01TQV9QU0tfQUtNWzRdICAgCT0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDZ9OwkJLy8gTm90IHlldCBmaW5hbCAtIElFRUUgODAyLjExcy1EMS4wNgorLyogV1BBIE9VSSAqLwordTggT1VJX1dQQV9OT05FX0FLTVs0XSA9IHsgMHgwMCwgMHg1MCwgMHhGMiwgMHgwMCB9OwordTggT1VJX1dQQV9WRVJTSU9OWzRdID0geyAweDAwLCAweDUwLCAweEYyLCAweDAxIH07Cit1OCBPVUlfV1BBX1dFUDQwWzRdID0geyAweDAwLCAweDUwLCAweEYyLCAweDAxIH07Cit1OCBPVUlfV1BBX1RLSVBbNF0gPSB7IDB4MDAsIDB4NTAsIDB4RjIsIDB4MDIgfTsKK3U4IE9VSV9XUEFfQ0NNUFs0XSA9IHsgMHgwMCwgMHg1MCwgMHhGMiwgMHgwNCB9OwordTggT1VJX1dQQV9XRVAxMDRbNF0gPSB7IDB4MDAsIDB4NTAsIDB4RjIsIDB4MDUgfTsKK3U4IE9VSV9XUEFfODAyMVhfQUtNWzRdID0geyAweDAwLCAweDUwLCAweEYyLCAweDAxIH07Cit1OCBPVUlfV1BBX1BTS19BS01bNF0gPSB7IDB4MDAsIDB4NTAsIDB4RjIsIDB4MDIgfTsKKworLyogV1BBMiBPVUkgKi8KK3U4IE9VSV9XUEEyX1dFUDQwWzRdID0geyAweDAwLCAweDBGLCAweEFDLCAweDAxIH07Cit1OCBPVUlfV1BBMl9US0lQWzRdID0geyAweDAwLCAweDBGLCAweEFDLCAweDAyIH07Cit1OCBPVUlfV1BBMl9DQ01QWzRdID0geyAweDAwLCAweDBGLCAweEFDLCAweDA0IH07Cit1OCBPVUlfV1BBMl84MDIxWF9BS01bNF0gPSB7IDB4MDAsIDB4MEYsIDB4QUMsIDB4MDEgfTsKK3U4IE9VSV9XUEEyX1BTS19BS01bNF0gPSB7IDB4MDAsIDB4MEYsIDB4QUMsIDB4MDIgfTsKK3U4IE9VSV9XUEEyX1dFUDEwNFs0XSA9IHsgMHgwMCwgMHgwRiwgMHhBQywgMHgwNSB9OworCitzdGF0aWMgdm9pZCBDb25zdHJ1Y3RFYXBvbEtleURhdGEoc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LAorCQkJCSAgdTggR3JvdXBLZXlXZXBTdGF0dXMsCisJCQkJICB1OCBrZXlEZXNjVmVyLAorCQkJCSAgdTggTXNnVHlwZSwKKwkJCQkgIHU4IERlZmF1bHRLZXlJZHgsCisJCQkJICB1OCAqIEdUSywKKwkJCQkgIHU4ICogUlNOSUUsCisJCQkJICB1OCBSU05JRV9MRU4sIHN0cnVjdCBydF9lYXBvbF9wYWNrZXQgKiBwTXNnKTsKKworc3RhdGljIHZvaWQgQ2FsY3VsYXRlTUlDKHU4IEtleURlc2NWZXIsCisJCQkgdTggKiBQVEssIHN0cnVjdCBydF9lYXBvbF9wYWNrZXQgKiBwTXNnKTsKKworc3RhdGljIHZvaWQgV3BhRUFQUGFja2V0QWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CisKK3N0YXRpYyB2b2lkIFdwYUVBUE9MQVNGQWxlcnRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOworCitzdGF0aWMgdm9pZCBXcGFFQVBPTExvZ29mZkFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOworCitzdGF0aWMgdm9pZCBXcGFFQVBPTFN0YXJ0QWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQlzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKKworc3RhdGljIHZvaWQgV3BhRUFQT0xLZXlBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lIGluaXQsIGluY2x1ZGluZyBzdGF0ZSB0cmFuc2l0aW9uIGFuZCB0aW1lciBpbml0CisgICAgUGFyYW1ldGVyczoKKyAgICAgICAgUyAtIHBvaW50ZXIgdG8gdGhlIGFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCit2b2lkIFdwYVN0YXRlTWFjaGluZUluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lICpTLCBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisJU3RhdGVNYWNoaW5lSW5pdChTLCAoU1RBVEVfTUFDSElORV9GVU5DICopIFRyYW5zLCBNQVhfV1BBX1BUS19TVEFURSwKKwkJCSBNQVhfV1BBX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQykgRHJvcCwgV1BBX1BUSywKKwkJCSBXUEFfTUFDSElORV9CQVNFKTsKKworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBXUEFfUFRLLCBNVDJfRUFQUGFja2V0LAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgV3BhRUFQUGFja2V0QWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgV1BBX1BUSywgTVQyX0VBUE9MU3RhcnQsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBXcGFFQVBPTFN0YXJ0QWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgV1BBX1BUSywgTVQyX0VBUE9MTG9nb2ZmLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgV3BhRUFQT0xMb2dvZmZBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBXUEFfUFRLLCBNVDJfRUFQT0xLZXksCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBXcGFFQVBPTEtleUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFdQQV9QVEssIE1UMl9FQVBPTEFTRkFsZXJ0LAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgV3BhRUFQT0xBU0ZBbGVydEFjdGlvbik7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgdGhpcyBpcyBzdGF0ZSBtYWNoaW5lIGZ1bmN0aW9uLgorICAgICAgICBXaGVuIHJlY2VpdmluZyBFQVAgcGFja2V0cyB3aGljaCBpcyAgZm9yIDgwMi4xeCBhdXRoZW50aWNhdGlvbiB1c2UuCisgICAgICAgIE5vdCB1c2UgaW4gUFNLIGNhc2UKKyAgICBSZXR1cm46CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFdwYUVBUFBhY2tldEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCit7Cit9CisKK3ZvaWQgV3BhRUFQT0xBU0ZBbGVydEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCit7Cit9CisKK3ZvaWQgV3BhRUFQT0xMb2dvZmZBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQoreworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgU3RhcnQgNC13YXkgSFMgd2hlbiByY3YgRUFQT0xfU1RBUlQgd2hpY2ggbWF5IGNyZWF0ZSBieSBvdXIgZHJpdmVyIGluIGFzc29jLmMKKyAgICBSZXR1cm46CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFdwYUVBUE9MU3RhcnRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQoreworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeTsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBIZWFkZXI7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFFQVBPTFN0YXJ0QWN0aW9uID09PT4gXG4iKSk7CisKKwlwSGVhZGVyID0gKHN0cnVjdCBydF9oZWFkZXJfODAyXzExICopIEVsZW0tPk1zZzsKKworCS8qRm9yIG5vcm1hb2wgUFNLLCB3ZSBlbnF1ZXVlIGFuIEVBUE9MLVN0YXJ0IGNvbW1hbmQgdG8gdHJpZ2dlciB0aGUgcHJvY2Vzcy4gKi8KKwlpZiAoRWxlbS0+TXNnTGVuID09IDYpCisJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgRWxlbS0+TXNnKTsKKwllbHNlIHsKKwkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwSGVhZGVyLT5BZGRyMik7CisJfQorCisJaWYgKHBFbnRyeSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIiBQb3J0U2VjdXJlZCglZCksIFdwYVN0YXRlKCVkKSwgQXV0aE1vZGUoJWQpLCBQTUtJRF9DYWNoZUlkeCglZCkgXG4iLAorCQkJICBwRW50cnktPlBvcnRTZWN1cmVkLCBwRW50cnktPldwYVN0YXRlLAorCQkJICBwRW50cnktPkF1dGhNb2RlLCBwRW50cnktPlBNS0lEX0NhY2hlSWR4KSk7CisKKwkJaWYgKChwRW50cnktPlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkKKwkJICAgICYmIChwRW50cnktPldwYVN0YXRlIDwgQVNfUFRLU1RBUlQpCisJCSAgICAmJiAoKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKQorCQkJfHwgKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKKwkJCXx8ICgocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorCQkJICAgICYmIChwRW50cnktPlBNS0lEX0NhY2hlSWR4ICE9IEVOVFJZX05PVF9GT1VORCkpKSkgeworCQkJcEVudHJ5LT5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUDsKKwkJCXBFbnRyeS0+V3BhU3RhdGUgPSBBU19JTklUUFNLOworCQkJcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKwkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+Ul9Db3VudGVyLAorCQkJCSAgICAgICBzaXplb2YocEVudHJ5LT5SX0NvdW50ZXIpKTsKKwkJCXBFbnRyeS0+UmVUcnlDb3VudGVyID0gUEVFUl9NU0cxX1JFVFJZX1RJTUVSX0NUUjsKKworCQkJV1BBU3RhcnQ0V2F5SFMocEFkLCBwRW50cnksIFBFRVJfTVNHMV9SRVRSWV9FWEVDX0lOVFYpOworCQl9CisJfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFRoaXMgaXMgc3RhdGUgbWFjaGluZSBmdW5jdGlvbi4KKyAgICAgICAgV2hlbiByZWNlaXZpbmcgRUFQT0wgcGFja2V0cyB3aGljaCBpcyAgZm9yIDgwMi4xeCBrZXkgbWFuYWdlbWVudC4KKyAgICAgICAgVXNlIGJvdGggaW4gV1BBLCBhbmQgV1BBUFNLIGNhc2UuCisgICAgICAgIEluIHRoaXMgZnVuY3Rpb24sIGZ1cnRoZXIgZGlzcGF0Y2ggdG8gZGlmZmVyZW50IGZ1bmN0aW9ucyBhY2NvcmRpbmcgdG8gdGhlIHJlY2VpdmVkIHBhY2tldC4gIDMgY2F0ZWdvcmllcyBhcmUgOgorICAgICAgICAgIDEuICBub3JtYWwgNC13YXkgcGFpcndpc2VrZXkgYW5kIDItd2F5IGdyb3Vwa2V5IGhhbmRzaGFrZQorICAgICAgICAgIDIuICBNSUMgZXJyb3IgKENvdW50ZXJtZWFzdXJlcyBhdHRhY2spICByZXBvcnQgcGFja2V0IGZyb20gU1RBLgorICAgICAgICAgIDMuICBSZXF1ZXN0IGZvciBwYWlyd2lzZS9ncm91cCBrZXkgdXBkYXRlIGZyb20gU1RBCisgICAgUmV0dXJuOgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBXcGFFQVBPTEtleUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCit7CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5OworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhlYWRlcjsKKwlzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0ICogcEVhcG9sX3BhY2tldDsKKwlzdHJ1Y3QgcnRfa2V5X2luZm8gcGVlcktleUluZm87CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFFQVBPTEtleUFjdGlvbiA9PT0+XG4iKSk7CisKKwlwSGVhZGVyID0gKHN0cnVjdCBydF9oZWFkZXJfODAyXzExICopIEVsZW0tPk1zZzsKKwlwRWFwb2xfcGFja2V0ID0KKwkgICAgKHN0cnVjdCBydF9lYXBvbF9wYWNrZXQgKikgJiBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKKworCU5kaXNaZXJvTWVtb3J5KCh1OCAqKSYgcGVlcktleUluZm8sIHNpemVvZihwZWVyS2V5SW5mbykpOworCU5kaXNNb3ZlTWVtb3J5KCh1OCAqKSYgcGVlcktleUluZm8sCisJCSAgICAgICAodTggKikmIHBFYXBvbF9wYWNrZXQtPktleURlc2MuS2V5SW5mbywKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfa2V5X2luZm8pKTsKKworCWhleF9kdW1wKCJSZWNlaXZlZCBFYXBvbCBmcmFtZSIsICh1bnNpZ25lZCBjaGFyICopcEVhcG9sX3BhY2tldCwKKwkJIChFbGVtLT5Nc2dMZW4gLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIXzgwMl8xX0gpKTsKKworCSooKHUxNiAqKSAmIHBlZXJLZXlJbmZvKSA9IGNwdTJsZTE2KCooKHUxNiAqKSAmIHBlZXJLZXlJbmZvKSk7CisKKwlkbyB7CisJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcEhlYWRlci0+QWRkcjIpOworCisJCWlmICghcEVudHJ5CisJCSAgICB8fCAoKCFwRW50cnktPlZhbGlkQXNDTEkpICYmICghcEVudHJ5LT5WYWxpZEFzQXBDbGkpKSkKKwkJCWJyZWFrOworCisJCWlmIChwRW50cnktPkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQkJYnJlYWs7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJSZWNlaXZlIEVBUG9MLUtleSBmcmFtZSBmcm9tIFNUQSAlMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWFxuIiwKKwkJCSAgUFJJTlRfTUFDKHBFbnRyeS0+QWRkcikpKTsKKworCQlpZiAoKChwRWFwb2xfcGFja2V0LT5Qcm9WZXIgIT0gRUFQT0xfVkVSKQorCQkgICAgICYmIChwRWFwb2xfcGFja2V0LT5Qcm9WZXIgIT0gRUFQT0xfVkVSMikpCisJCSAgICB8fCAoKHBFYXBvbF9wYWNrZXQtPktleURlc2MuVHlwZSAhPSBXUEExX0tFWV9ERVNDKQorCQkJJiYgKHBFYXBvbF9wYWNrZXQtPktleURlc2MuVHlwZSAhPSBXUEEyX0tFWV9ERVNDKSkpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIktleSBkZXNjcmlwdGVyIGRvZXMgbm90IG1hdGNoIHdpdGggV1BBIHJ1bGVcbiIpKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIFRoZSB2YWx1ZSAxIHNoYWxsIGJlIHVzZWQgZm9yIGFsbCBFQVBPTC1LZXkgZnJhbWVzIHRvIGFuZCBmcm9tIGEgU1RBIHdoZW4gKi8KKwkJLyogbmVpdGhlciB0aGUgZ3JvdXAgbm9yIHBhaXJ3aXNlIGNpcGhlcnMgYXJlIENDTVAgZm9yIEtleSBEZXNjcmlwdG9yIDEuICovCisJCWlmICgocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJICAgICYmIChwZWVyS2V5SW5mby5LZXlEZXNjVmVyICE9IERFU0NfVFlQRV9US0lQKSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiS2V5IGRlc2NyaXB0ZXIgdmVyc2lvbiBub3QgbWF0Y2goVEtJUCkgXG4iKSk7CisJCQlicmVhazsKKwkJfQorCQkvKiBUaGUgdmFsdWUgMiBzaGFsbCBiZSB1c2VkIGZvciBhbGwgRUFQT0wtS2V5IGZyYW1lcyB0byBhbmQgZnJvbSBhIFNUQSB3aGVuICovCisJCS8qIGVpdGhlciB0aGUgcGFpcndpc2Ugb3IgdGhlIGdyb3VwIGNpcGhlciBpcyBBRVMtQ0NNUCBmb3IgS2V5IERlc2NyaXB0b3IgMi4gKi8KKwkJZWxzZSBpZiAoKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQkgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIgIT0gREVTQ19UWVBFX0FFUykpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIktleSBkZXNjcmlwdGVyIHZlcnNpb24gbm90IG1hdGNoKEFFUykgXG4iKSk7CisJCQlicmVhazsKKwkJfQorCQkvKiBDaGVjayBpZiB0aGlzIFNUQSBpcyBpbiBjbGFzcyAzIHN0YXRlIGFuZCB0aGUgV1BBIHN0YXRlIGlzIHN0YXJ0ZWQgKi8KKwkJaWYgKChwRW50cnktPlNzdCA9PSBTU1RfQVNTT0MpCisJCSAgICAmJiAocEVudHJ5LT5XcGFTdGF0ZSA+PSBBU19JTklUUFNLKSkgeworCQkJLyogQ2hlY2sgdGhlIEtleSBBY2sgKGJpdCA3KSBvZiB0aGUgS2V5IEluZm9ybWF0aW9uIHRvIGRldGVybWluZSB0aGUgQXV0aGVudGljYXRvciAqLworCQkJLyogb3Igbm90LiAqLworCQkJLyogQW4gRUFQT0wtS2V5IGZyYW1lIHRoYXQgaXMgc2VudCBieSB0aGUgU3VwcGxpY2FudCBpbiByZXNwb25zZSB0byBhbiBFQVBPTC0gKi8KKwkJCS8qIEtleSBmcmFtZSBmcm9tIHRoZSBBdXRoZW50aWNhdG9yIG11c3Qgbm90IGhhdmUgdGhlIEFjayBiaXQgc2V0LiAqLworCQkJaWYgKHBlZXJLZXlJbmZvLktleUFjayA9PSAxKSB7CisJCQkJLyogVGhlIGZyYW1lIGlzIHNuZXQgYnkgQXV0aGVudGljYXRvci4gKi8KKwkJCQkvKiBTbyB0aGUgU3VwcGxpY2FudCBzaWRlIHNoYWxsIGhhbmRsZSB0aGlzLiAqLworCisJCQkJaWYgKChwZWVyS2V5SW5mby5TZWN1cmUgPT0gMCkKKwkJCQkgICAgJiYgKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkKKwkJCQkgICAgJiYgKHBlZXJLZXlJbmZvLkVycm9yID09IDApCisJCQkJICAgICYmIChwZWVyS2V5SW5mby5LZXlUeXBlID09IFBBSVJXSVNFS0VZKSkgeworCQkJCQkvKiBQcm9jZXNzIDEuIHRoZSBtZXNzYWdlIDEgb2YgNC13YXkgSFMgaW4gV1BBIG9yIFdQQTIgKi8KKwkJCQkJLyogICAgICAgICAgICAgICAgICAgICAgICBFQVBPTC1LZXkoMCwwLDEsMCxQLDAsMCxBTm9uY2UsMCxEYXRhS0RfTTEpICovCisJCQkJCS8qICAgICAgICAgICAgICAgICAyLiB0aGUgbWVzc2FnZSAzIG9mIDQtd2F5IEhTIGluIFdQQSAqLworCQkJCQkvKiAgICAgICAgICAgICAgICAgICAgICAgIEVBUE9MLUtleSgwLDEsMSwxLFAsMCxLZXlSU0MsQU5vbmNlLE1JQyxEYXRhS0RfTTMpICovCisJCQkJCWlmIChwZWVyS2V5SW5mby5LZXlNaWMgPT0gMCkKKwkJCQkJCVBlZXJQYWlyTXNnMUFjdGlvbihwQWQsIHBFbnRyeSwKKwkJCQkJCQkJICAgRWxlbSk7CisJCQkJCWVsc2UKKwkJCQkJCVBlZXJQYWlyTXNnM0FjdGlvbihwQWQsIHBFbnRyeSwKKwkJCQkJCQkJICAgRWxlbSk7CisJCQkJfSBlbHNlIGlmICgocGVlcktleUluZm8uU2VjdXJlID09IDEpCisJCQkJCSAgICYmIChwZWVyS2V5SW5mby5LZXlNaWMgPT0gMSkKKwkJCQkJICAgJiYgKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkKKwkJCQkJICAgJiYgKHBlZXJLZXlJbmZvLkVycm9yID09IDApKSB7CisJCQkJCS8qIFByb2Nlc3MgMS4gdGhlIG1lc3NhZ2UgMyBvZiA0LXdheSBIUyBpbiBXUEEyICovCisJCQkJCS8qICAgICAgICAgICAgICAgICAgICAgICAgRUFQT0wtS2V5KDEsMSwxLDEsUCwwLEtleVJTQyxBTm9uY2UsTUlDLERhdGFLRF9NMykgKi8KKwkJCQkJLyogICAgICAgICAgICAgICAgIDIuIHRoZSBtZXNzYWdlIDEgb2YgZ3JvdXAgS1MgaW4gV1BBIG9yIFdQQTIgKi8KKwkJCQkJLyogICAgICAgICAgICAgICAgICAgICAgICBFQVBPTC1LZXkoMSwxLDEsMCxHLDAsS2V5IFJTQywwLCBNSUMsR1RLW05dKSAqLworCQkJCQlpZiAocGVlcktleUluZm8uS2V5VHlwZSA9PSBQQUlSV0lTRUtFWSkKKwkJCQkJCVBlZXJQYWlyTXNnM0FjdGlvbihwQWQsIHBFbnRyeSwKKwkJCQkJCQkJICAgRWxlbSk7CisJCQkJCWVsc2UKKwkJCQkJCVBlZXJHcm91cE1zZzFBY3Rpb24ocEFkLCBwRW50cnksCisJCQkJCQkJCSAgICBFbGVtKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIFRoZSBmcmFtZSBpcyBzbmV0IGJ5IFN1cHBsaWNhbnQuICovCisJCQkJLyogU28gdGhlIEF1dGhlbnRpY2F0b3Igc2lkZSBzaGFsbCBoYW5kbGUgdGhpcy4gKi8KKwkJCQlpZiAoKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkgJiYKKwkJCQkgICAgKHBlZXJLZXlJbmZvLkVycm9yID09IDApICYmCisJCQkJICAgIChwZWVyS2V5SW5mby5LZXlNaWMgPT0gMSkpIHsKKwkJCQkJaWYgKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAwCisJCQkJCSAgICAmJiBwZWVyS2V5SW5mby5LZXlUeXBlID09CisJCQkJCSAgICBQQUlSV0lTRUtFWSkgeworCQkJCQkJLyogRUFQT0wtS2V5KDAsMSwwLDAsUCwwLDAsU05vbmNlLE1JQyxEYXRhKSAqLworCQkJCQkJLyogUHJvY2VzcyAxLiBtZXNzYWdlIDIgb2YgNC13YXkgSFMgaW4gV1BBIG9yIFdQQTIgKi8KKwkJCQkJCS8qICAgICAgICAgICAgICAgICAyLiBtZXNzYWdlIDQgb2YgNC13YXkgSFMgaW4gV1BBICovCisJCQkJCQlpZiAoQ09OVl9BUlJBUllfVE9fdTE2CisJCQkJCQkgICAgKHBFYXBvbF9wYWNrZXQtPktleURlc2MuCisJCQkJCQkgICAgIEtleURhdGFMZW4pID09IDApIHsKKwkJCQkJCQlQZWVyUGFpck1zZzRBY3Rpb24ocEFkLAorCQkJCQkJCQkJICAgcEVudHJ5LAorCQkJCQkJCQkJICAgRWxlbSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCVBlZXJQYWlyTXNnMkFjdGlvbihwQWQsCisJCQkJCQkJCQkgICBwRW50cnksCisJCQkJCQkJCQkgICBFbGVtKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIGlmIChwZWVyS2V5SW5mby5TZWN1cmUgPT0gMQorCQkJCQkJICAgJiYgcGVlcktleUluZm8uS2V5VHlwZSA9PQorCQkJCQkJICAgUEFJUldJU0VLRVkpIHsKKwkJCQkJCS8qIEVBUE9MLUtleSgxLDEsMCwwLFAsMCwwLDAsTUlDLDApICovCisJCQkJCQkvKiBQcm9jZXNzIG1lc3NhZ2UgNCBvZiA0LXdheSBIUyBpbiBXUEEyICovCisJCQkJCQlQZWVyUGFpck1zZzRBY3Rpb24ocEFkLCBwRW50cnksCisJCQkJCQkJCSAgIEVsZW0pOworCQkJCQl9IGVsc2UgaWYgKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAxCisJCQkJCQkgICAmJiBwZWVyS2V5SW5mby5LZXlUeXBlID09CisJCQkJCQkgICBHUk9VUEtFWSkgeworCQkJCQkJLyogRUFQT0wtS2V5KDEsMSwwLDAsRywwLDAsMCxNSUMsMCkgKi8KKwkJCQkJCS8qIFByb2Nlc3MgbWVzc2FnZSAyIG9mIEdyb3VwIGtleSBIUyBpbiBXUEEgb3IgV1BBMiAqLworCQkJCQkJUGVlckdyb3VwTXNnMkFjdGlvbihwQWQsIHBFbnRyeSwKKwkJCQkJCQkJICAgICZFbGVtLT4KKwkJCQkJCQkJICAgIE1zZworCQkJCQkJCQkgICAgW0xFTkdUSF84MDJfMTFdLAorCQkJCQkJCQkgICAgKEVsZW0tPgorCQkJCQkJCQkgICAgIE1zZ0xlbiAtCisJCQkJCQkJCSAgICAgTEVOR1RIXzgwMl8xMSkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfSB3aGlsZSAoRkFMU0UpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ29weSBmcmFtZSBmcm9tIHdhaXRpbmcgcXVldWUgaW50byByZWxhdGl2ZSByaW5nIGJ1ZmZlciBhbmQgc2V0CisJYXBwcm9wcmlhdGUgQVNJQyByZWdpc3RlciB0byBraWNrIGhhcmR3YXJlIGVuY3J5cHRpb24gYmVmb3JlIHJlYWxseQorCXNlbnQgb3V0IHRvIGFpci4KKworCUFyZ3VtZW50czoKKwkJcEFkCQlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCXZvaWQgKglQb2ludGVyIHRvIG91dGdvaW5nIE5kaXMgZnJhbWUKKwkJTnVtYmVyT2ZGcmFnCU51bWJlciBvZiBmcmFnbWVudCByZXF1aXJlZAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVE1QVG9XaXJlbGVzc1N0YShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksCisJCSAgICAgICB1OCAqcEhlYWRlcjgwMl8zLAorCQkgICAgICAgdTMyIEhkckxlbiwKKwkJICAgICAgIHU4ICpwRGF0YSwgdTMyIERhdGFMZW4sIElOIEJPT0xFQU4gYkNsZWFyRnJhbWUpCit7CisJdm9pZCAqcFBhY2tldDsKKwlpbnQgU3RhdHVzOworCisJaWYgKCghcEVudHJ5KSB8fCAoKCFwRW50cnktPlZhbGlkQXNDTEkpICYmICghcEVudHJ5LT5WYWxpZEFzQXBDbGkpKSkKKwkJcmV0dXJuOworCisJZG8geworCQkvKiBidWlsZCBhIE5ESVMgcGFja2V0ICovCisJCVN0YXR1cyA9CisJCSAgICBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KHBBZCwgJnBQYWNrZXQsIHBIZWFkZXI4MDJfMywgSGRyTGVuLAorCQkJCQkgICBwRGF0YSwgRGF0YUxlbik7CisJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCWJyZWFrOworCisJCWlmIChiQ2xlYXJGcmFtZSkKKwkJCVJUTVBfU0VUX1BBQ0tFVF9DTEVBUl9FQVBfRlJBTUUocFBhY2tldCwgMSk7CisJCWVsc2UKKwkJCVJUTVBfU0VUX1BBQ0tFVF9DTEVBUl9FQVBfRlJBTUUocFBhY2tldCwgMCk7CisJCXsKKwkJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UocFBhY2tldCwgUEtUU1JDX05ESVMpOworCisJCQlSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9NQlNTSUQocFBhY2tldCwgTUFJTl9NQlNTSUQpOwkvKiBzZXQgYSBkZWZhdWx0IHZhbHVlICovCisJCQlpZiAocEVudHJ5LT5hcGlkeCAhPSAwKQorCQkJCVJUTVBfU0VUX1BBQ0tFVF9ORVRfREVWSUNFX01CU1NJRChwUGFja2V0LAorCQkJCQkJCQkgIHBFbnRyeS0+CisJCQkJCQkJCSAgYXBpZHgpOworCisJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCAodTgpcEVudHJ5LT5BaWQpOworCQkJUlRNUF9TRVRfUEFDS0VUX01PUkVEQVRBKHBQYWNrZXQsIEZBTFNFKTsKKwkJfQorCisJCXsKKwkJCS8qIHNlbmQgb3V0IHRoZSBwYWNrZXQgKi8KKwkJCVN0YXR1cyA9IFNUQVNlbmRQYWNrZXQocEFkLCBwUGFja2V0KTsKKwkJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQkJCXU4IEluZGV4OworCisJCQkJLyogRGVxdWV1ZSBvbmUgZnJhbWUgZnJvbSBUeFN3UXVldWUwLi4zIHF1ZXVlIGFuZCBwcm9jZXNzIGl0ICovCisJCQkJLyogVGhlcmUgYXJlIHRocmVlIHBsYWNlIGNhbGxpbmcgZGVxdWV1ZSBmb3IgVFggcmluZy4gKi8KKwkJCQkvKiAxLiBIZXJlLCByaWdodCBhZnRlciBxdWV1ZWluZyB0aGUgZnJhbWUuICovCisJCQkJLyogMi4gQXQgdGhlIGVuZCBvZiBUeFJpbmdUeERvbmUgc2VydmljZSByb3V0aW5lLiAqLworCQkJCS8qIDMuIFVwb24gTkRJUyBjYWxsIFJUTVBTZW5kUGFja2V0cyAqLworCQkJCWlmICgoIVJUTVBfVEVTVF9GTEFHCisJCQkJICAgICAocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwkJCQkgICAgJiYKKwkJCQkgICAgKCFSVE1QX1RFU1RfRkxBRworCQkJCSAgICAgKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpKSB7CisJCQkJCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IDU7IEluZGV4KyspCisJCQkJCQlpZiAocEFkLT5UeFN3UXVldWVbSW5kZXhdLgorCQkJCQkJICAgIE51bWJlciA+IDApCisJCQkJCQkJUlRNUERlUXVldWVQYWNrZXQocEFkLAorCQkJCQkJCQkJICBGQUxTRSwKKwkJCQkJCQkJCSAgSW5kZXgsCisJCQkJCQkJCQkgIE1BWF9UWF9QUk9DRVNTKTsKKwkJCQl9CisJCQl9CisJCX0KKworCX0gd2hpbGUgKEZBTFNFKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBUaGlzIGlzIGEgZnVuY3Rpb24gdG8gaW5pdGlsaXplIDQtd2F5IGhhbmRzaGFrZQorCisgICAgUmV0dXJuOgorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFdQQVN0YXJ0NFdheUhTKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwgdW5zaWduZWQgbG9uZyBUaW1lSW50ZXJ2YWwpCit7CisJdTggSGVhZGVyODAyXzNbMTRdOworCXN0cnVjdCBydF9lYXBvbF9wYWNrZXQgRUFQT0xQS1Q7CisJdTggKnBCc3NpZCA9IE5VTEw7CisJdTggZ3JvdXBfY2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBXUEFTdGFydDRXYXlIU1xuIikpOworCisJaWYgKFJUTVBfVEVTVF9GTEFHCisJICAgIChwQWQsCisJICAgICBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiW0VSUk9SXVdQQVN0YXJ0NFdheUhTIDogVGhlIGludGVyZmFjZSBpcyBjbG9zZWQuLi5cbiIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwQnNzaWQgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIltFUlJPUl1XUEFTdGFydDRXYXlIUyA6IE5vIGNvcnJlc3BvbmRpbmcgQXV0aGVudGljYXRvci5cbiIpKTsKKwkJcmV0dXJuOworCX0KKwkvKiBDaGVjayB0aGUgc3RhdHVzICovCisJaWYgKChwRW50cnktPldwYVN0YXRlID4gQVNfUFRLU1RBUlQpIHx8IChwRW50cnktPldwYVN0YXRlIDwgQVNfSU5JVFBNSykpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJbRVJST1JdV1BBU3RhcnQ0V2F5SFMgOiBOb3QgZXhwZWN0IGNhbGxpbmdcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEluY3JlbWVudCByZXBsYXkgY291bnRlciBieSAxICovCisJQUREX09ORV9Ub182NEJJVF9WQVIocEVudHJ5LT5SX0NvdW50ZXIpOworCisJLyogUmFuZG9tbHkgZ2VuZXJhdGUgQU5vbmNlICovCisJR2VuUmFuZG9tKHBBZCwgKHU4ICopIHBCc3NpZCwgcEVudHJ5LT5BTm9uY2UpOworCisJLyogQ29uc3RydWN0IEVBUG9MIG1lc3NhZ2UgLSBQYWlyd2lzZSBNc2cgMSAqLworCS8qIEVBUE9MLUtleSgwLDAsMSwwLFAsMCwwLEFOb25jZSwwLERhdGFLRF9NMSkgKi8KKwlOZGlzWmVyb01lbW9yeSgmRUFQT0xQS1QsIHNpemVvZihzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0KSk7CisJQ29uc3RydWN0RWFwb2xNc2cocEVudHJ5LCBncm91cF9jaXBoZXIsIEVBUE9MX1BBSVJfTVNHXzEsIDAsCS8qIERlZmF1bHQga2V5IGluZGV4ICovCisJCQkgIHBFbnRyeS0+QU5vbmNlLCBOVUxMLAkvKiBUeFJTQyAqLworCQkJICBOVUxMLAkvKiBHVEsgKi8KKwkJCSAgTlVMTCwJLyogUlNOSUUgKi8KKwkJCSAgMCwJLyogUlNOSUUgbGVuZ3RoICovCisJCQkgICZFQVBPTFBLVCk7CisKKwkvKiBNYWtlIG91dGdvaW5nIGZyYW1lICovCisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBFbnRyeS0+QWRkciwgcEJzc2lkLCBFQVBPTCk7CisJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBwRW50cnksIEhlYWRlcjgwMl8zLAorCQkJICBMRU5HVEhfODAyXzMsICh1OCAqKSYgRUFQT0xQS1QsCisJCQkgIENPTlZfQVJSQVJZX1RPX3UxNihFQVBPTFBLVC5Cb2R5X0xlbikgKyA0LAorCQkJICAocEVudHJ5LT5Qb3J0U2VjdXJlZCA9PQorCQkJICAgV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpID8gRkFMU0UgOiBUUlVFKTsKKworCS8qIFRyaWdnZXIgUmV0cnkgVGltZXIgKi8KKwlSVE1QTW9kVGltZXIoJnBFbnRyeS0+UmV0cnlUaW1lciwgVGltZUludGVydmFsKTsKKworCS8qIFVwZGF0ZSBTdGF0ZSAqLworCXBFbnRyeS0+V3BhU3RhdGUgPSBBU19QVEtTVEFSVDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCI8PT09IFdQQVN0YXJ0NFdheUhTOiBzZW5kIE1zZzEgb2YgNC13YXkgXG4iKSk7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVByb2Nlc3MgUGFpcndpc2Uga2V5IE1zZy0xIG9mIDQtd2F5IGhhbmRzaGFraW5nIGFuZCBzZW5kIE1zZy0yCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJRWxlbQkJTWVzc2FnZSBib2R5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFBlZXJQYWlyTXNnMUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCit7CisJdTggUFRLWzgwXTsKKwl1OCBIZWFkZXI4MDJfM1sxNF07CisJc3RydWN0IHJ0X2VhcG9sX3BhY2tldCAqIHBNc2cxOworCXUzMiBNc2dMZW47CisJc3RydWN0IHJ0X2VhcG9sX3BhY2tldCBFQVBPTFBLVDsKKwl1OCAqcEN1cnJlbnRBZGRyID0gTlVMTDsKKwl1OCAqcG1rX3B0ciA9IE5VTEw7CisJdTggZ3JvdXBfY2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCXU4ICpyc25pZV9wdHIgPSBOVUxMOworCXU4IHJzbmllX2xlbiA9IDA7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IFBlZXJQYWlyTXNnMUFjdGlvbiBcbiIpKTsKKworCWlmICgoIXBFbnRyeSkgfHwgKCghcEVudHJ5LT5WYWxpZEFzQ0xJKSAmJiAoIXBFbnRyeS0+VmFsaWRBc0FwQ2xpKSkpCisJCXJldHVybjsKKworCWlmIChFbGVtLT5Nc2dMZW4gPAorCSAgICAoTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgTEVOR1RIX0VBUE9MX0ggKworCSAgICAgc2l6ZW9mKHN0cnVjdCBydF9rZXlfZGVzY3JpcHRlcikgLSBNQVhfTEVOX09GX1JTTklFIC0gMikpCisJCXJldHVybjsKKworCXsKKwkJcEN1cnJlbnRBZGRyID0gcEFkLT5DdXJyZW50QWRkcmVzczsKKwkJcG1rX3B0ciA9IHBBZC0+U3RhQ2ZnLlBNSzsKKwkJZ3JvdXBfY2lwaGVyID0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXI7CisJCXJzbmllX3B0ciA9IHBBZC0+U3RhQ2ZnLlJTTl9JRTsKKwkJcnNuaWVfbGVuID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuOworCX0KKworCS8qIFN0b3JlIHRoZSByZWNlaXZlZCBmcmFtZSAqLworCXBNc2cxID0gKHN0cnVjdCBydF9lYXBvbF9wYWNrZXQgKikgJiBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKKwlNc2dMZW4gPSBFbGVtLT5Nc2dMZW4gLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIXzgwMl8xX0g7CisKKwkvKiBTYW5pdHkgQ2hlY2sgcGVlciBQYWlyd2lzZSBtZXNzYWdlIDEgLSBSZXBsYXkgQ291bnRlciAqLworCWlmIChQZWVyV3BhTWVzc2FnZVNhbml0eShwQWQsIHBNc2cxLCBNc2dMZW4sIEVBUE9MX1BBSVJfTVNHXzEsIHBFbnRyeSkKKwkgICAgPT0gRkFMU0UpCisJCXJldHVybjsKKworCS8qIFN0b3JlIFJlcGxheSBjb3VudGVyLCBpdCB3aWxsIHVzZSB0byB2ZXJpZnkgbWVzc2FnZSAzIGFuZCBjb25zdHJ1Y3QgbWVzc2FnZSAyICovCisJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5SX0NvdW50ZXIsIHBNc2cxLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsCisJCSAgICAgICBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8qIFN0b3JlIEFOb25jZSAqLworCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+QU5vbmNlLCBwTXNnMS0+S2V5RGVzYy5LZXlOb25jZSwKKwkJICAgICAgIExFTl9LRVlfREVTQ19OT05DRSk7CisKKwkvKiBHZW5lcmF0ZSByYW5kb20gU05vbmNlICovCisJR2VuUmFuZG9tKHBBZCwgKHU4ICopIHBDdXJyZW50QWRkciwgcEVudHJ5LT5TTm9uY2UpOworCisJeworCQkvKiBDYWxjdWxhdGUgUFRLKEFOb25jZSwgU05vbmNlKSAqLworCQlXcGFEZXJpdmVQVEsocEFkLAorCQkJICAgICBwbWtfcHRyLAorCQkJICAgICBwRW50cnktPkFOb25jZSwKKwkJCSAgICAgcEVudHJ5LT5BZGRyLAorCQkJICAgICBwRW50cnktPlNOb25jZSwgcEN1cnJlbnRBZGRyLCBQVEssIExFTl9QVEspOworCisJCS8qIFNhdmUga2V5IHRvIFBUSyBlbnRyeSAqLworCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBUSywgUFRLLCBMRU5fUFRLKTsKKwl9CisKKwkvKiBVcGRhdGUgV3BhU3RhdGUgKi8KKwlwRW50cnktPldwYVN0YXRlID0gQVNfUFRLSU5JVF9ORUdPVElBVElORzsKKworCS8qIENvbnN0cnVjdCBFQVBvTCBtZXNzYWdlIC0gUGFpcndpc2UgTXNnIDIgKi8KKwkvKiAgRUFQT0wtS2V5KDAsMSwwLDAsUCwwLDAsU05vbmNlLE1JQyxEYXRhS0RfTTIpICovCisJTmRpc1plcm9NZW1vcnkoJkVBUE9MUEtULCBzaXplb2Yoc3RydWN0IHJ0X2VhcG9sX3BhY2tldCkpOworCUNvbnN0cnVjdEVhcG9sTXNnKHBFbnRyeSwgZ3JvdXBfY2lwaGVyLCBFQVBPTF9QQUlSX01TR18yLCAwLAkvKiBEZWZhdWx0S2V5SWR4ICovCisJCQkgIHBFbnRyeS0+U05vbmNlLCBOVUxMLAkvKiBUeFJzYyAqLworCQkJICBOVUxMLAkvKiBHVEsgKi8KKwkJCSAgKHU4ICopIHJzbmllX3B0ciwgcnNuaWVfbGVuLCAmRUFQT0xQS1QpOworCisJLyogTWFrZSBvdXRnb2luZyBmcmFtZSAqLworCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwRW50cnktPkFkZHIsIHBDdXJyZW50QWRkciwgRUFQT0wpOworCisJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBwRW50cnksCisJCQkgIEhlYWRlcjgwMl8zLCBzaXplb2YoSGVhZGVyODAyXzMpLCAodTggKikmIEVBUE9MUEtULAorCQkJICBDT05WX0FSUkFSWV9UT191MTYoRUFQT0xQS1QuQm9keV9MZW4pICsgNCwgVFJVRSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiPD09PSBQZWVyUGFpck1zZzFBY3Rpb246IHNlbmQgTXNnMiBvZiA0LXdheSBcbiIpKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBXaGVuIHJlY2VpdmluZyB0aGUgc2Vjb25kIHBhY2tldCBvZiA0LXdheSBwYWlyd2lzZWtleSBoYW5kc2hha2UuCisgICAgUmV0dXJuOgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBQZWVyUGFpck1zZzJBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQoreworCXU4IFBUS1s4MF07CisJQk9PTEVBTiBDYW5jZWxsZWQ7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGVhZGVyOworCXN0cnVjdCBydF9lYXBvbF9wYWNrZXQgRUFQT0xQS1Q7CisJc3RydWN0IHJ0X2VhcG9sX3BhY2tldCAqIHBNc2cyOworCXUzMiBNc2dMZW47CisJdTggSGVhZGVyODAyXzNbTEVOR1RIXzgwMl8zXTsKKwl1OCBUeFRzY1s2XTsKKwl1OCAqcEJzc2lkID0gTlVMTDsKKwl1OCAqcG1rX3B0ciA9IE5VTEw7CisJdTggKmd0a19wdHIgPSBOVUxMOworCXU4IGRlZmF1bHRfa2V5ID0gMDsKKwl1OCBncm91cF9jaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJdTggKnJzbmllX3B0ciA9IE5VTEw7CisJdTggcnNuaWVfbGVuID0gMDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gUGVlclBhaXJNc2cyQWN0aW9uIFxuIikpOworCisJaWYgKCghcEVudHJ5KSB8fCAoIXBFbnRyeS0+VmFsaWRBc0NMSSkpCisJCXJldHVybjsKKworCWlmIChFbGVtLT5Nc2dMZW4gPAorCSAgICAoTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgTEVOR1RIX0VBUE9MX0ggKworCSAgICAgc2l6ZW9mKHN0cnVjdCBydF9rZXlfZGVzY3JpcHRlcikgLSBNQVhfTEVOX09GX1JTTklFIC0gMikpCisJCXJldHVybjsKKworCS8qIGNoZWNrIEVudHJ5IGluIHZhbGlkIFN0YXRlICovCisJaWYgKHBFbnRyeS0+V3BhU3RhdGUgPCBBU19QVEtTVEFSVCkKKwkJcmV0dXJuOworCisJLyogcG9pbnRlciB0byA4MDIuMTEgaGVhZGVyICovCisJcEhlYWRlciA9IChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqKSBFbGVtLT5Nc2c7CisKKwkvKiBza2lwIDgwMi4xMV9oZWFkZXIoMjQtYnl0ZSkgYW5kIExMQ19oZWFkZXIoOCkgKi8KKwlwTXNnMiA9IChzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0ICopICYgRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSF07CisJTXNnTGVuID0gRWxlbS0+TXNnTGVuIC0gTEVOR1RIXzgwMl8xMSAtIExFTkdUSF84MDJfMV9IOworCisJLyogU3RvcmUgU05vbmNlICovCisJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5TTm9uY2UsIHBNc2cyLT5LZXlEZXNjLktleU5vbmNlLAorCQkgICAgICAgTEVOX0tFWV9ERVNDX05PTkNFKTsKKworCXsKKwkJLyogRGVyaXZlIFBUSyAqLworCQlXcGFEZXJpdmVQVEsocEFkLCAodTggKikgcG1rX3B0ciwgcEVudHJ5LT5BTm9uY2UsCS8qIEFOT05DRSAqLworCQkJICAgICAodTggKikgcEJzc2lkLCBwRW50cnktPlNOb25jZSwJLyogU05PTkNFICovCisJCQkgICAgIHBFbnRyeS0+QWRkciwgUFRLLCBMRU5fUFRLKTsKKworCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBUSywgUFRLLCBMRU5fUFRLKTsKKwl9CisKKwkvKiBTYW5pdHkgQ2hlY2sgcGVlciBQYWlyd2lzZSBtZXNzYWdlIDIgLSBSZXBsYXkgQ291bnRlciwgTUlDLCBSU05JRSAqLworCWlmIChQZWVyV3BhTWVzc2FnZVNhbml0eShwQWQsIHBNc2cyLCBNc2dMZW4sIEVBUE9MX1BBSVJfTVNHXzIsIHBFbnRyeSkKKwkgICAgPT0gRkFMU0UpCisJCXJldHVybjsKKworCWRvIHsKKwkJLyogZGVsZXRlIHJldHJ5IHRpbWVyICovCisJCVJUTVBDYW5jZWxUaW1lcigmcEVudHJ5LT5SZXRyeVRpbWVyLCAmQ2FuY2VsbGVkKTsKKworCQkvKiBDaGFuZ2Ugc3RhdGUgKi8KKwkJcEVudHJ5LT5XcGFTdGF0ZSA9IEFTX1BUS0lOSVRfTkVHT1RJQVRJTkc7CisKKwkJLyogSW5jcmVtZW50IHJlcGxheSBjb3VudGVyIGJ5IDEgKi8KKwkJQUREX09ORV9Ub182NEJJVF9WQVIocEVudHJ5LT5SX0NvdW50ZXIpOworCisJCS8qIENvbnN0cnVjdCBFQVBvTCBtZXNzYWdlIC0gUGFpcndpc2UgTXNnIDMgKi8KKwkJTmRpc1plcm9NZW1vcnkoJkVBUE9MUEtULCBzaXplb2Yoc3RydWN0IHJ0X2VhcG9sX3BhY2tldCkpOworCQlDb25zdHJ1Y3RFYXBvbE1zZyhwRW50cnksCisJCQkJICBncm91cF9jaXBoZXIsCisJCQkJICBFQVBPTF9QQUlSX01TR18zLAorCQkJCSAgZGVmYXVsdF9rZXksCisJCQkJICBwRW50cnktPkFOb25jZSwKKwkJCQkgIFR4VHNjLAorCQkJCSAgKHU4ICopIGd0a19wdHIsCisJCQkJICAodTggKikgcnNuaWVfcHRyLCByc25pZV9sZW4sICZFQVBPTFBLVCk7CisKKwkJLyogTWFrZSBvdXRnb2luZyBmcmFtZSAqLworCQlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEVudHJ5LT5BZGRyLCBwQnNzaWQsIEVBUE9MKTsKKwkJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBwRW50cnksIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsCisJCQkJICAodTggKikmIEVBUE9MUEtULAorCQkJCSAgQ09OVl9BUlJBUllfVE9fdTE2KEVBUE9MUEtULkJvZHlfTGVuKSArIDQsCisJCQkJICAocEVudHJ5LT5Qb3J0U2VjdXJlZCA9PQorCQkJCSAgIFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSA/IEZBTFNFIDogVFJVRSk7CisKKwkJcEVudHJ5LT5SZVRyeUNvdW50ZXIgPSBQRUVSX01TRzNfUkVUUllfVElNRVJfQ1RSOworCQlSVE1QU2V0VGltZXIoJnBFbnRyeS0+UmV0cnlUaW1lciwgUEVFUl9NU0czX1JFVFJZX0VYRUNfSU5UVik7CisKKwkJLyogVXBkYXRlIFN0YXRlICovCisJCXBFbnRyeS0+V3BhU3RhdGUgPSBBU19QVEtJTklUX05FR09USUFUSU5HOworCX0gd2hpbGUgKEZBTFNFKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCI8PT09IFBlZXJQYWlyTXNnMkFjdGlvbjogc2VuZCBNc2czIG9mIDQtd2F5IFxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJvY2VzcyBQYWlyd2lzZSBrZXkgTXNnIDMgb2YgNC13YXkgaGFuZHNoYWtpbmcgYW5kIHNlbmQgTXNnIDQKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJRWxlbQkJTWVzc2FnZSBib2R5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFBlZXJQYWlyTXNnM0FjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCit7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGVhZGVyOworCXU4IEhlYWRlcjgwMl8zWzE0XTsKKwlzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0IEVBUE9MUEtUOworCXN0cnVjdCBydF9lYXBvbF9wYWNrZXQgKiBwTXNnMzsKKwl1MzIgTXNnTGVuOworCXU4ICpwQ3VycmVudEFkZHIgPSBOVUxMOworCXU4IGdyb3VwX2NpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gUGVlclBhaXJNc2czQWN0aW9uIFxuIikpOworCisJaWYgKCghcEVudHJ5KSB8fCAoKCFwRW50cnktPlZhbGlkQXNDTEkpICYmICghcEVudHJ5LT5WYWxpZEFzQXBDbGkpKSkKKwkJcmV0dXJuOworCisJaWYgKEVsZW0tPk1zZ0xlbiA8CisJICAgIChMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0ggKyBMRU5HVEhfRUFQT0xfSCArCisJICAgICBzaXplb2Yoc3RydWN0IHJ0X2tleV9kZXNjcmlwdGVyKSAtIE1BWF9MRU5fT0ZfUlNOSUUgLSAyKSkKKwkJcmV0dXJuOworCisJeworCQlwQ3VycmVudEFkZHIgPSBwQWQtPkN1cnJlbnRBZGRyZXNzOworCQlncm91cF9jaXBoZXIgPSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcjsKKworCX0KKworCS8qIFJlY29yZCA4MDIuMTEgaGVhZGVyICYgdGhlIHJlY2VpdmVkIEVBUE9MIHBhY2tldCBNc2czICovCisJcEhlYWRlciA9IChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqKSBFbGVtLT5Nc2c7CisJcE1zZzMgPSAoc3RydWN0IHJ0X2VhcG9sX3BhY2tldCAqKSAmIEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOworCU1zZ0xlbiA9IEVsZW0tPk1zZ0xlbiAtIExFTkdUSF84MDJfMTEgLSBMRU5HVEhfODAyXzFfSDsKKworCS8qIFNhbml0eSBDaGVjayBwZWVyIFBhaXJ3aXNlIG1lc3NhZ2UgMyAtIFJlcGxheSBDb3VudGVyLCBNSUMsIFJTTklFICovCisJaWYgKFBlZXJXcGFNZXNzYWdlU2FuaXR5KHBBZCwgcE1zZzMsIE1zZ0xlbiwgRUFQT0xfUEFJUl9NU0dfMywgcEVudHJ5KQorCSAgICA9PSBGQUxTRSkKKwkJcmV0dXJuOworCisJLyogU2F2ZSBSZXBsYXkgY291bnRlciwgaXQgd2lsbCB1c2UgY29uc3RydWN0IG1lc3NhZ2UgNCAqLworCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+Ul9Db3VudGVyLCBwTXNnMy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLAorCQkgICAgICAgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvKiBEb3VibGUgY2hlY2sgQU5vbmNlICovCisJaWYgKCFOZGlzRXF1YWxNZW1vcnkKKwkgICAgKHBFbnRyeS0+QU5vbmNlLCBwTXNnMy0+S2V5RGVzYy5LZXlOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKSkgeworCQlyZXR1cm47CisJfQorCS8qIENvbnN0cnVjdCBFQVBvTCBtZXNzYWdlIC0gUGFpcndpc2UgTXNnIDQgKi8KKwlOZGlzWmVyb01lbW9yeSgmRUFQT0xQS1QsIHNpemVvZihzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0KSk7CisJQ29uc3RydWN0RWFwb2xNc2cocEVudHJ5LCBncm91cF9jaXBoZXIsIEVBUE9MX1BBSVJfTVNHXzQsIDAsCS8qIGdyb3VwIGtleSBpbmRleCBub3QgdXNlZCBpbiBtZXNzYWdlIDQgKi8KKwkJCSAgTlVMTCwJLyogTm9uY2Ugbm90IHVzZWQgaW4gbWVzc2FnZSA0ICovCisJCQkgIE5VTEwsCS8qIFR4UlNDIG5vdCB1c2VkIGluIG1lc3NhZ2UgNCAqLworCQkJICBOVUxMLAkvKiBHVEsgbm90IHVzZWQgaW4gbWVzc2FnZSA0ICovCisJCQkgIE5VTEwsCS8qIFJTTiBJRSBub3QgdXNlZCBpbiBtZXNzYWdlIDQgKi8KKwkJCSAgMCwgJkVBUE9MUEtUKTsKKworCS8qIFVwZGF0ZSBXcGFTdGF0ZSAqLworCXBFbnRyeS0+V3BhU3RhdGUgPSBBU19QVEtJTklURE9ORTsKKworCS8qIFVwZGF0ZSBwYWlyd2lzZSBrZXkgKi8KKwl7CisJCXN0cnVjdCBydF9jaXBoZXJfa2V5ICpwU2hhcmVkS2V5OworCisJCXBTaGFyZWRLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF07CisKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUFRLLCBwRW50cnktPlBUSywgTEVOX1BUSyk7CisKKwkJLyogUHJlcGFyZSBwYWlyLXdpc2Uga2V5IGluZm9ybWF0aW9uIGludG8gc2hhcmVkIGtleSB0YWJsZSAqLworCQlOZGlzWmVyb01lbW9yeShwU2hhcmVkS2V5LCBzaXplb2Yoc3RydWN0IHJ0X2NpcGhlcl9rZXkpKTsKKwkJcFNoYXJlZEtleS0+S2V5TGVuID0gTEVOX1RLSVBfRUs7CisJCU5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPktleSwgJnBBZC0+U3RhQ2ZnLlBUS1szMl0sCisJCQkgICAgICAgTEVOX1RLSVBfRUspOworCQlOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OF0sCisJCQkgICAgICAgTEVOX1RLSVBfUlhNSUNLKTsKKwkJTmRpc01vdmVNZW1vcnkocFNoYXJlZEtleS0+VHhNaWMsCisJCQkgICAgICAgJnBBZC0+U3RhQ2ZnLlBUS1s0OCArIExFTl9US0lQX1JYTUlDS10sCisJCQkgICAgICAgTEVOX1RLSVBfVFhNSUNLKTsKKworCQkvKiBEZWNpZGUgaXRzIENoaXBlckFsZyAqLworCQlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisJCWVsc2UKKwkJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCisJCS8qIFVwZGF0ZSB0aGVzZSByZWxhdGVkIGluZm9ybWF0aW9uIHRvIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKi8KKwkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisJCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LCAmcEFkLT5TdGFDZmcuUFRLWzMyXSwKKwkJCSAgICAgICBMRU5fVEtJUF9FSyk7CisJCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuUnhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDhdLAorCQkJICAgICAgIExFTl9US0lQX1JYTUlDSyk7CisJCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuVHhNaWMsCisJCQkgICAgICAgJnBBZC0+U3RhQ2ZnLlBUS1s0OCArIExFTl9US0lQX1JYTUlDS10sCisJCQkgICAgICAgTEVOX1RLSVBfVFhNSUNLKTsKKwkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBwU2hhcmVkS2V5LT5DaXBoZXJBbGc7CisKKwkJLyogVXBkYXRlIHBhaXJ3aXNlIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUgKi8KKwkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKwkJCQkgICAgICBCU1MwLAorCQkJCSAgICAgIDAsCisJCQkJICAgICAgcFNoYXJlZEtleS0+Q2lwaGVyQWxnLAorCQkJCSAgICAgIHBTaGFyZWRLZXktPktleSwKKwkJCQkgICAgICBwU2hhcmVkS2V5LT5UeE1pYywgcFNoYXJlZEtleS0+UnhNaWMpOworCisJCS8qIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSAqLworCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJICBCU1MwLAorCQkJCQkgIDAsIHBTaGFyZWRLZXktPkNpcGhlckFsZywgcEVudHJ5KTsKKworCX0KKworCS8qIG9wZW4gODAyLjF4IHBvcnQgY29udHJvbCBhbmQgcHJpdmFjeSBmaWx0ZXIgKi8KKwlpZiAocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLIHx8CisJICAgIHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgeworCQlwRW50cnktPlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCXBFbnRyeS0+UHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyQWNjZXB0QWxsOworCisJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKKwkJLyogSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkgKi8KKwkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJQZWVyUGFpck1zZzNBY3Rpb246IEF1dGhNb2RlKCVzKSBQYWlyd2lzZUNpcGhlciglcykgR3JvdXBDaXBoZXIoJXMpIFxuIiwKKwkJCSAgR2V0QXV0aE1vZGUocEVudHJ5LT5BdXRoTW9kZSksCisJCQkgIEdldEVuY3J5cHRUeXBlKHBFbnRyeS0+V2VwU3RhdHVzKSwKKwkJCSAgR2V0RW5jcnlwdFR5cGUoZ3JvdXBfY2lwaGVyKSkpOworCX0gZWxzZSB7CisJfQorCisJLyogSW5pdCA4MDIuMyBoZWFkZXIgYW5kIHNlbmQgb3V0ICovCisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBFbnRyeS0+QWRkciwgcEN1cnJlbnRBZGRyLCBFQVBPTCk7CisJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBwRW50cnksCisJCQkgIEhlYWRlcjgwMl8zLCBzaXplb2YoSGVhZGVyODAyXzMpLAorCQkJICAodTggKikmIEVBUE9MUEtULAorCQkJICBDT05WX0FSUkFSWV9UT191MTYoRUFQT0xQS1QuQm9keV9MZW4pICsgNCwgVFJVRSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiPD09PSBQZWVyUGFpck1zZzNBY3Rpb246IHNlbmQgTXNnNCBvZiA0LXdheSBcbiIpKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBXaGVuIHJlY2VpdmluZyB0aGUgbGFzdCBwYWNrZXQgb2YgNC13YXkgcGFpcndpc2VrZXkgaGFuZHNoYWtlLgorICAgICAgICBJbml0aWxpemUgMi13YXkgZ3JvdXBrZXkgaGFuZHNoYWtlIGZvbGxvd2luZy4KKyAgICBSZXR1cm46CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFBlZXJQYWlyTXNnNEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCit7CisJc3RydWN0IHJ0X2VhcG9sX3BhY2tldCAqIHBNc2c0OworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhlYWRlcjsKKwl1MzIgTXNnTGVuOworCUJPT0xFQU4gQ2FuY2VsbGVkOworCXU4IGdyb3VwX2NpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gUGVlclBhaXJNc2c0QWN0aW9uXG4iKSk7CisKKwlkbyB7CisJCWlmICgoIXBFbnRyeSkgfHwgKCFwRW50cnktPlZhbGlkQXNDTEkpKQorCQkJYnJlYWs7CisKKwkJaWYgKEVsZW0tPk1zZ0xlbiA8CisJCSAgICAoTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgTEVOR1RIX0VBUE9MX0ggKworCQkgICAgIHNpemVvZihzdHJ1Y3QgcnRfa2V5X2Rlc2NyaXB0ZXIpIC0gTUFYX0xFTl9PRl9SU05JRSAtIDIpKQorCQkJYnJlYWs7CisKKwkJaWYgKHBFbnRyeS0+V3BhU3RhdGUgPCBBU19QVEtJTklUX05FR09USUFUSU5HKQorCQkJYnJlYWs7CisKKwkJLyogcG9pbnRlciB0byA4MDIuMTEgaGVhZGVyICovCisJCXBIZWFkZXIgPSAoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKikgRWxlbS0+TXNnOworCisJCS8qIHNraXAgODAyLjExX2hlYWRlcigyNC1ieXRlKSBhbmQgTExDX2hlYWRlcig4KSAqLworCQlwTXNnNCA9CisJCSAgICAoc3RydWN0IHJ0X2VhcG9sX3BhY2tldCAqKSAmIEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOworCQlNc2dMZW4gPSBFbGVtLT5Nc2dMZW4gLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIXzgwMl8xX0g7CisKKwkJLyogU2FuaXR5IENoZWNrIHBlZXIgUGFpcndpc2UgbWVzc2FnZSA0IC0gUmVwbGF5IENvdW50ZXIsIE1JQyAqLworCQlpZiAoUGVlcldwYU1lc3NhZ2VTYW5pdHkKKwkJICAgIChwQWQsIHBNc2c0LCBNc2dMZW4sIEVBUE9MX1BBSVJfTVNHXzQsIHBFbnRyeSkgPT0gRkFMU0UpCisJCQlicmVhazsKKworCQkvKiAzLiB1c2VzIHRoZSBNTE1FLlNFVEtFWVMucmVxdWVzdCB0byBjb25maWd1cmUgUFRLIGludG8gTUFDICovCisJCU5kaXNaZXJvTWVtb3J5KCZwRW50cnktPlBhaXJ3aXNlS2V5LCBzaXplb2Yoc3RydWN0IHJ0X2NpcGhlcl9rZXkpKTsKKworCQkvKiByZXNldCBJVkVJViBpbiBBc2ljICovCisJCUFzaWNVcGRhdGVXQ0lESVZFSVYocEFkLCBwRW50cnktPkFpZCwgMSwgMCk7CisKKwkJcEVudHJ5LT5QYWlyd2lzZUtleS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKwkJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5LZXksICZwRW50cnktPlBUS1szMl0sCisJCQkgICAgICAgTEVOX1RLSVBfRUspOworCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlJ4TWljLAorCQkJICAgICAgICZwRW50cnktPlBUS1tUS0lQX0FQX1JYTUlDS19PRkZTRVRdLAorCQkJICAgICAgIExFTl9US0lQX1JYTUlDSyk7CisJCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuVHhNaWMsCisJCQkgICAgICAgJnBFbnRyeS0+UFRLW1RLSVBfQVBfVFhNSUNLX09GRlNFVF0sCisJCQkgICAgICAgTEVOX1RLSVBfVFhNSUNLKTsKKworCQkvKiBTZXQgcGFpcndpc2Uga2V5IHRvIEFzaWMgKi8KKwkJeworCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCWlmIChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisJCQllbHNlIGlmIChwRW50cnktPldlcFN0YXR1cyA9PQorCQkJCSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKworCQkJLyogQWRkIFBhaXItd2lzZSBrZXkgdG8gQXNpYyAqLworCQkJQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnkocEFkLAorCQkJCQkJcEVudHJ5LT5BZGRyLAorCQkJCQkJKHU4KXBFbnRyeS0+QWlkLAorCQkJCQkJJnBFbnRyeS0+UGFpcndpc2VLZXkpOworCisJCQkvKiB1cGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGVudHJ5ICovCisJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCSAgcEVudHJ5LT5hcGlkeCwKKwkJCQkJCSAgMCwKKwkJCQkJCSAgcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcsCisJCQkJCQkgIHBFbnRyeSk7CisJCX0KKworCQkvKiA0LiB1cGdyYWRlIHN0YXRlICovCisJCXBFbnRyeS0+UHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyQWNjZXB0QWxsOworCQlwRW50cnktPldwYVN0YXRlID0gQVNfUFRLSU5JVERPTkU7CisJCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKworCQlpZiAocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyIHx8CisJCSAgICBwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spIHsKKwkJCXBFbnRyeS0+R1RLU3RhdGUgPSBSRUtFWV9FU1RBQkxJU0hFRDsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEVudHJ5LT5SZXRyeVRpbWVyLCAmQ2FuY2VsbGVkKTsKKworCQkJLyogc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBzZXQga2V5IGRvbmUgV1BBMiAqLworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsCisJCQkJCQkgICAgICBJV19TRVRfS0VZX0RPTkVfV1BBMl9FVkVOVF9GTEFHLAorCQkJCQkJICAgICAgcEVudHJ5LT5BZGRyLAorCQkJCQkJICAgICAgcEVudHJ5LT5hcGlkeCwgMCk7CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwKKwkJCQkgKCJBUCBTRVRLRVlTIERPTkUgLSBXUEEyLCBBdXRoTW9kZSglZCk9JXMsIFdlcFN0YXR1cyglZCk9JXMsIEdyb3VwV2VwU3RhdHVzKCVkKT0lc1xuXG4iLAorCQkJCSAgcEVudHJ5LT5BdXRoTW9kZSwKKwkJCQkgIEdldEF1dGhNb2RlKHBFbnRyeS0+QXV0aE1vZGUpLAorCQkJCSAgcEVudHJ5LT5XZXBTdGF0dXMsCisJCQkJICBHZXRFbmNyeXB0VHlwZShwRW50cnktPldlcFN0YXR1cyksCisJCQkJICBncm91cF9jaXBoZXIsIEdldEVuY3J5cHRUeXBlKGdyb3VwX2NpcGhlcikpKTsKKwkJfSBlbHNlIHsKKwkJCS8qIDUuIGluaXQgR3JvdXAgMi13YXkgaGFuZHNoYWtlIGlmIG5lY2Vzc2FyeS4gKi8KKwkJCVdQQVN0YXJ0MldheUdyb3VwSFMocEFkLCBwRW50cnkpOworCisJCQlwRW50cnktPlJlVHJ5Q291bnRlciA9IEdST1VQX01TRzFfUkVUUllfVElNRVJfQ1RSOworCQkJUlRNUE1vZFRpbWVyKCZwRW50cnktPlJldHJ5VGltZXIsCisJCQkJICAgICBQRUVSX01TRzNfUkVUUllfRVhFQ19JTlRWKTsKKwkJfQorCX0gd2hpbGUgKEZBTFNFKTsKKworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFRoaXMgaXMgYSBmdW5jdGlvbiB0byBzZW5kIHRoZSBmaXJzdCBwYWNrZXQgb2YgMi13YXkgZ3JvdXBrZXkgaGFuZHNoYWtlCisgICAgUmV0dXJuOgorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFdQQVN0YXJ0MldheUdyb3VwSFMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkpCit7CisJdTggSGVhZGVyODAyXzNbMTRdOworCXU4IFR4VHNjWzZdOworCXN0cnVjdCBydF9lYXBvbF9wYWNrZXQgRUFQT0xQS1Q7CisJdTggZ3JvdXBfY2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCXU4IGRlZmF1bHRfa2V5ID0gMDsKKwl1OCAqZ25vbmNlX3B0ciA9IE5VTEw7CisJdTggKmd0a19wdHIgPSBOVUxMOworCXU4ICpwQnNzaWQgPSBOVUxMOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBXUEFTdGFydDJXYXlHcm91cEhTXG4iKSk7CisKKwlpZiAoKCFwRW50cnkpIHx8ICghcEVudHJ5LT5WYWxpZEFzQ0xJKSkKKwkJcmV0dXJuOworCisJZG8geworCQkvKiBJbmNyZW1lbnQgcmVwbGF5IGNvdW50ZXIgYnkgMSAqLworCQlBRERfT05FX1RvXzY0QklUX1ZBUihwRW50cnktPlJfQ291bnRlcik7CisKKwkJLyogQ29uc3RydWN0IEVBUG9MIG1lc3NhZ2UgLSBHcm91cCBNc2cgMSAqLworCQlOZGlzWmVyb01lbW9yeSgmRUFQT0xQS1QsIHNpemVvZihzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0KSk7CisJCUNvbnN0cnVjdEVhcG9sTXNnKHBFbnRyeSwKKwkJCQkgIGdyb3VwX2NpcGhlciwKKwkJCQkgIEVBUE9MX0dST1VQX01TR18xLAorCQkJCSAgZGVmYXVsdF9rZXksCisJCQkJICAodTggKikgZ25vbmNlX3B0ciwKKwkJCQkgIFR4VHNjLCAodTggKikgZ3RrX3B0ciwgTlVMTCwgMCwgJkVBUE9MUEtUKTsKKworCQkvKiBNYWtlIG91dGdvaW5nIGZyYW1lICovCisJCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwRW50cnktPkFkZHIsIHBCc3NpZCwgRUFQT0wpOworCQlSVE1QVG9XaXJlbGVzc1N0YShwQWQsIHBFbnRyeSwKKwkJCQkgIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsCisJCQkJICAodTggKikmIEVBUE9MUEtULAorCQkJCSAgQ09OVl9BUlJBUllfVE9fdTE2KEVBUE9MUEtULkJvZHlfTGVuKSArIDQsCisJCQkJICBGQUxTRSk7CisKKwl9IHdoaWxlIChGQUxTRSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiPD09PSBXUEFTdGFydDJXYXlHcm91cEhTIDogc2VuZCBvdXQgR3JvdXAgTWVzc2FnZSAxIFxuIikpOworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJvY2VzcyBHcm91cCBrZXkgMi13YXkgaGFuZHNoYWtpbmcKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJRWxlbQkJTWVzc2FnZSBib2R5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFBlZXJHcm91cE1zZzFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKK3sKKwl1OCBIZWFkZXI4MDJfM1sxNF07CisJc3RydWN0IHJ0X2VhcG9sX3BhY2tldCBFQVBPTFBLVDsKKwlzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0ICogcEdyb3VwOworCXUzMiBNc2dMZW47CisJQk9PTEVBTiBDYW5jZWxsZWQ7CisJdTggZGVmYXVsdF9rZXkgPSAwOworCXU4IGdyb3VwX2NpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwl1OCAqcEN1cnJlbnRBZGRyID0gTlVMTDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gUGVlckdyb3VwTXNnMUFjdGlvbiBcbiIpKTsKKworCWlmICgoIXBFbnRyeSkgfHwgKCghcEVudHJ5LT5WYWxpZEFzQ0xJKSAmJiAoIXBFbnRyeS0+VmFsaWRBc0FwQ2xpKSkpCisJCXJldHVybjsKKworCXsKKwkJcEN1cnJlbnRBZGRyID0gcEFkLT5DdXJyZW50QWRkcmVzczsKKwkJZ3JvdXBfY2lwaGVyID0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXI7CisJCWRlZmF1bHRfa2V5ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOworCX0KKworCS8qIFByb2Nlc3MgR3JvdXAgTWVzc2FnZSAxIGZyYW1lLiBza2lwIDgwMi4xMSBoZWFkZXIoMjQpICYgTExDX1NOQVAgaGVhZGVyKDgpICovCisJcEdyb3VwID0gKHN0cnVjdCBydF9lYXBvbF9wYWNrZXQgKikgJiBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKKwlNc2dMZW4gPSBFbGVtLT5Nc2dMZW4gLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIXzgwMl8xX0g7CisKKwkvKiBTYW5pdHkgQ2hlY2sgcGVlciBncm91cCBtZXNzYWdlIDEgLSBSZXBsYXkgQ291bnRlciwgTUlDLCBSU05JRSAqLworCWlmIChQZWVyV3BhTWVzc2FnZVNhbml0eShwQWQsIHBHcm91cCwgTXNnTGVuLCBFQVBPTF9HUk9VUF9NU0dfMSwgcEVudHJ5KQorCSAgICA9PSBGQUxTRSkKKwkJcmV0dXJuOworCisJLyogZGVsZXRlIHJldHJ5IHRpbWVyICovCisJUlRNUENhbmNlbFRpbWVyKCZwRW50cnktPlJldHJ5VGltZXIsICZDYW5jZWxsZWQpOworCisJLyogU2F2ZSBSZXBsYXkgY291bnRlciwgaXQgd2lsbCB1c2UgdG8gY29uc3RydWN0IG1lc3NhZ2UgMiAqLworCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+Ul9Db3VudGVyLCBwR3JvdXAtPktleURlc2MuUmVwbGF5Q291bnRlciwKKwkJICAgICAgIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLyogQ29uc3RydWN0IEVBUG9MIG1lc3NhZ2UgLSBHcm91cCBNc2cgMiAqLworCU5kaXNaZXJvTWVtb3J5KCZFQVBPTFBLVCwgc2l6ZW9mKHN0cnVjdCBydF9lYXBvbF9wYWNrZXQpKTsKKwlDb25zdHJ1Y3RFYXBvbE1zZyhwRW50cnksIGdyb3VwX2NpcGhlciwgRUFQT0xfR1JPVVBfTVNHXzIsIGRlZmF1bHRfa2V5LCBOVUxMLAkvKiBOb25jZSBub3QgdXNlZCAqLworCQkJICBOVUxMLAkvKiBUeFJTQyBub3QgdXNlZCAqLworCQkJICBOVUxMLAkvKiBHVEsgbm90IHVzZWQgKi8KKwkJCSAgTlVMTCwJLyogUlNOIElFIG5vdCB1c2VkICovCisJCQkgIDAsICZFQVBPTFBLVCk7CisKKwkvKiBvcGVuIDgwMi4xeCBwb3J0IGNvbnRyb2wgYW5kIHByaXZhY3kgZmlsdGVyICovCisJcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCXBFbnRyeS0+UHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyQWNjZXB0QWxsOworCisJU1RBX1BPUlRfU0VDVVJFRChwQWQpOworCS8qIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJICovCisJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJQZWVyR3JvdXBNc2cxQWN0aW9uOiBBdXRoTW9kZSglcykgUGFpcndpc2VDaXBoZXIoJXMpIEdyb3VwQ2lwaGVyKCVzKSBcbiIsCisJCSAgR2V0QXV0aE1vZGUocEVudHJ5LT5BdXRoTW9kZSksCisJCSAgR2V0RW5jcnlwdFR5cGUocEVudHJ5LT5XZXBTdGF0dXMpLAorCQkgIEdldEVuY3J5cHRUeXBlKGdyb3VwX2NpcGhlcikpKTsKKworCS8qIGluaXQgaGVhZGVyIGFuZCBGaWxsIFBhY2tldCBhbmQgc2VuZCBNc2cgMiB0byBhdXRoZW50aWNhdG9yICovCisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBFbnRyeS0+QWRkciwgcEN1cnJlbnRBZGRyLCBFQVBPTCk7CisJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBwRW50cnksCisJCQkgIEhlYWRlcjgwMl8zLCBzaXplb2YoSGVhZGVyODAyXzMpLAorCQkJICAodTggKikmIEVBUE9MUEtULAorCQkJICBDT05WX0FSUkFSWV9UT191MTYoRUFQT0xQS1QuQm9keV9MZW4pICsgNCwgRkFMU0UpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIjw9PT0gUGVlckdyb3VwTXNnMUFjdGlvbjogc25lZCBncm91cCBtZXNzYWdlIDJcbiIpKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBXaGVuIHJlY2VpdmluZyB0aGUgbGFzdCBwYWNrZXQgb2YgMi13YXkgZ3JvdXBrZXkgaGFuZHNoYWtlLgorICAgIFJldHVybjoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUGVlckdyb3VwTXNnMkFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LAorCQkJIHZvaWQgKiBNc2csIHUzMiBNc2dMZW4pCit7CisJdTMyIExlbjsKKwl1OCAqcERhdGE7CisJQk9PTEVBTiBDYW5jZWxsZWQ7CisJc3RydWN0IHJ0X2VhcG9sX3BhY2tldCAqIHBNc2cyOworCXU4IGdyb3VwX2NpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gUGVlckdyb3VwTXNnMkFjdGlvbiBcbiIpKTsKKworCWRvIHsKKwkJaWYgKCghcEVudHJ5KSB8fCAoIXBFbnRyeS0+VmFsaWRBc0NMSSkpCisJCQlicmVhazsKKworCQlpZiAoTXNnTGVuIDwKKwkJICAgIChMRU5HVEhfODAyXzFfSCArIExFTkdUSF9FQVBPTF9IICsgc2l6ZW9mKHN0cnVjdCBydF9rZXlfZGVzY3JpcHRlcikgLQorCQkgICAgIE1BWF9MRU5fT0ZfUlNOSUUgLSAyKSkKKwkJCWJyZWFrOworCisJCWlmIChwRW50cnktPldwYVN0YXRlICE9IEFTX1BUS0lOSVRET05FKQorCQkJYnJlYWs7CisKKwkJcERhdGEgPSAodTggKilNc2c7CisJCXBNc2cyID0gKHN0cnVjdCBydF9lYXBvbF9wYWNrZXQgKikgKHBEYXRhICsgTEVOR1RIXzgwMl8xX0gpOworCQlMZW4gPSBNc2dMZW4gLSBMRU5HVEhfODAyXzFfSDsKKworCQkvKiBTYW5pdHkgQ2hlY2sgcGVlciBncm91cCBtZXNzYWdlIDIgLSBSZXBsYXkgQ291bnRlciwgTUlDICovCisJCWlmIChQZWVyV3BhTWVzc2FnZVNhbml0eQorCQkgICAgKHBBZCwgcE1zZzIsIExlbiwgRUFQT0xfR1JPVVBfTVNHXzIsIHBFbnRyeSkgPT0gRkFMU0UpCisJCQlicmVhazsKKworCQkvKiAzLiAgdXBncmFkZSBzdGF0ZSAqLworCisJCVJUTVBDYW5jZWxUaW1lcigmcEVudHJ5LT5SZXRyeVRpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJcEVudHJ5LT5HVEtTdGF0ZSA9IFJFS0VZX0VTVEFCTElTSEVEOworCisJCWlmICgocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorCQkgICAgfHwgKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpIHsKKwkJCS8qIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3Igc2V0IGtleSBkb25lIFdQQTIgKi8KKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLAorCQkJCQkJICAgICAgSVdfU0VUX0tFWV9ET05FX1dQQTJfRVZFTlRfRkxBRywKKwkJCQkJCSAgICAgIHBFbnRyeS0+QWRkciwKKwkJCQkJCSAgICAgIHBFbnRyeS0+YXBpZHgsIDApOworCisJCQlEQkdQUklOVChSVF9ERUJVR19PRkYsCisJCQkJICgiQVAgU0VUS0VZUyBET05FIC0gV1BBMiwgQXV0aE1vZGUoJWQpPSVzLCBXZXBTdGF0dXMoJWQpPSVzLCBHcm91cFdlcFN0YXR1cyglZCk9JXNcblxuIiwKKwkJCQkgIHBFbnRyeS0+QXV0aE1vZGUsCisJCQkJICBHZXRBdXRoTW9kZShwRW50cnktPkF1dGhNb2RlKSwKKwkJCQkgIHBFbnRyeS0+V2VwU3RhdHVzLAorCQkJCSAgR2V0RW5jcnlwdFR5cGUocEVudHJ5LT5XZXBTdGF0dXMpLAorCQkJCSAgZ3JvdXBfY2lwaGVyLCBHZXRFbmNyeXB0VHlwZShncm91cF9jaXBoZXIpKSk7CisJCX0gZWxzZSB7CisJCQkvKiBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIHNldCBrZXkgZG9uZSBXUEEgKi8KKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLAorCQkJCQkJICAgICAgSVdfU0VUX0tFWV9ET05FX1dQQTFfRVZFTlRfRkxBRywKKwkJCQkJCSAgICAgIHBFbnRyeS0+QWRkciwKKwkJCQkJCSAgICAgIHBFbnRyeS0+YXBpZHgsIDApOworCisJCQlEQkdQUklOVChSVF9ERUJVR19PRkYsCisJCQkJICgiQVAgU0VUS0VZUyBET05FIC0gV1BBMSwgQXV0aE1vZGUoJWQpPSVzLCBXZXBTdGF0dXMoJWQpPSVzLCBHcm91cFdlcFN0YXR1cyglZCk9JXNcblxuIiwKKwkJCQkgIHBFbnRyeS0+QXV0aE1vZGUsCisJCQkJICBHZXRBdXRoTW9kZShwRW50cnktPkF1dGhNb2RlKSwKKwkJCQkgIHBFbnRyeS0+V2VwU3RhdHVzLAorCQkJCSAgR2V0RW5jcnlwdFR5cGUocEVudHJ5LT5XZXBTdGF0dXMpLAorCQkJCSAgZ3JvdXBfY2lwaGVyLCBHZXRFbmNyeXB0VHlwZShncm91cF9jaXBoZXIpKSk7CisJCX0KKwl9IHdoaWxlIChGQUxTRSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDbGFzc2lmeSBXUEEgRUFQIG1lc3NhZ2UgdHlwZQorCisJQXJndW1lbnRzOgorCQlFQVBUeXBlCQlWYWx1ZSBvZiBFQVAgbWVzc2FnZSB0eXBlCisJCU1zZ1R5cGUJCUludGVybmFsIE1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgTUxNRSBzdGF0ZSBtYWNoaW5lCisKKwlSZXR1cm4gVmFsdWU6CisJCVRSVUUJCUZvdW5kIGFwcHJvcHJpYXRlIG1lc3NhZ2UgdHlwZQorCQlGQUxTRQkJTm8gYXBwcm9wcmlhdGUgbWVzc2FnZSB0eXBlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisJCUFsbCB0aGVzZSBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gd3BhLmgKKwkJRm9yIHN1cHBsaWNhbnQsIHRoZXJlIGlzIG9ubHkgRUFQT0wgS2V5IG1lc3NhZ2UgYXZhbGlhYmxlCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFdwYU1zZ1R5cGVTdWJzdCh1OCBFQVBUeXBlLCBpbnQgKiBNc2dUeXBlKQoreworCXN3aXRjaCAoRUFQVHlwZSkgeworCWNhc2UgRUFQUGFja2V0OgorCQkqTXNnVHlwZSA9IE1UMl9FQVBQYWNrZXQ7CisJCWJyZWFrOworCWNhc2UgRUFQT0xTdGFydDoKKwkJKk1zZ1R5cGUgPSBNVDJfRUFQT0xTdGFydDsKKwkJYnJlYWs7CisJY2FzZSBFQVBPTExvZ29mZjoKKwkJKk1zZ1R5cGUgPSBNVDJfRUFQT0xMb2dvZmY7CisJCWJyZWFrOworCWNhc2UgRUFQT0xLZXk6CisJCSpNc2dUeXBlID0gTVQyX0VBUE9MS2V5OworCQlicmVhazsKKwljYXNlIEVBUE9MQVNGQWxlcnQ6CisJCSpNc2dUeXBlID0gTVQyX0VBUE9MQVNGQWxlcnQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBGQUxTRTsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC02Nyw3MiArMTI2MSwxMTggQEAKIAkJSXQgaXMgdXNlZCB0byBnZW5lcmF0ZSBQVEssIEdUSyBvciBzb21lIHNwZWNpZmljIHJhbmRvbSB2YWx1ZS4KIAogCUFyZ3VtZW50czoKLQkJVUNIQVIJKmtleSwJCS0JdGhlIGtleSBtYXRlcmlhbCBmb3IgSE1BQ19TSEExIHVzZQotCQlJTlQJCWtleV9sZW4JCS0JdGhlIGxlbmd0aCBvZiBrZXkKLQkJVUNIQVIJKnByZWZpeAkJLQlhIHByZWZpeCBsYWJlbAotCQlJTlQJCXByZWZpeF9sZW4JLQl0aGUgbGVuZ3RoIG9mIHRoZSBsYWJlbAotCQlVQ0hBUgkqZGF0YQkJLQlhIHNwZWNpZmljIGRhdGEgd2l0aCB2YXJpYWJsZSBsZW5ndGgKLQkJSU5UCQlkYXRhX2xlbgktCXRoZSBsZW5ndGggb2YgYSBzcGVjaWZpYyBkYXRhCi0JCUlOVAkJbGVuCQkJLQl0aGUgb3V0cHV0IGxlbmdodAorCQl1OAkqa2V5LAkJLQl0aGUga2V5IG1hdGVyaWFsIGZvciBITUFDX1NIQTEgdXNlCisJCWludAkJa2V5X2xlbgkJLQl0aGUgbGVuZ3RoIG9mIGtleQorCQl1OAkqcHJlZml4CQktCWEgcHJlZml4IGxhYmVsCisJCWludAkJcHJlZml4X2xlbgktCXRoZSBsZW5ndGggb2YgdGhlIGxhYmVsCisJCXU4CSpkYXRhCQktCWEgc3BlY2lmaWMgZGF0YSB3aXRoIHZhcmlhYmxlIGxlbmd0aAorCQlpbnQJCWRhdGFfbGVuCS0JdGhlIGxlbmd0aCBvZiBhIHNwZWNpZmljIGRhdGEKKwkJaW50CQlsZW4JCQktCXRoZSBvdXRwdXQgbGVuZ2h0CiAKIAlSZXR1cm4gVmFsdWU6Ci0JCVVDSEFSCSpvdXRwdXQJCS0JdGhlIGNhbGN1bGF0ZWQgcmVzdWx0CisJCXU4CSpvdXRwdXQJCS0JdGhlIGNhbGN1bGF0ZWQgcmVzdWx0CiAKIAlOb3RlOgogCQk4MDIuMTFpLTIwMDQJQW5uZXggSC4zCiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVBSRigKLQlJTglVQ0hBUgkqa2V5LAotCUlOCUlOVAkJa2V5X2xlbiwKLQlJTglVQ0hBUgkqcHJlZml4LAotCUlOCUlOVAkJcHJlZml4X2xlbiwKLQlJTglVQ0hBUgkqZGF0YSwKLQlJTglJTlQJCWRhdGFfbGVuLAotCU9VVAlVQ0hBUgkqb3V0cHV0LAotCUlOCUlOVAkJbGVuKQordm9pZCBQUkYodTggKiBrZXksCisJIGludCBrZXlfbGVuLAorCSB1OCAqIHByZWZpeCwKKwkgaW50IHByZWZpeF9sZW4sCisJIHU4ICogZGF0YSwgaW50IGRhdGFfbGVuLCB1OCAqIG91dHB1dCwgaW50IGxlbikKIHsKLQlJTlQJCWk7Ci0gICAgVUNIQVIgICAqaW5wdXQ7Ci0JSU5UCQljdXJyZW50aW5kZXggPSAwOwotCUlOVAkJdG90YWxfbGVuOworCWludCBpOworCXU4ICppbnB1dDsKKwlpbnQgY3VycmVudGluZGV4ID0gMDsKKwlpbnQgdG90YWxfbGVuOwogCi0JLy8gQWxsb2NhdGUgbWVtb3J5IGZvciBpbnB1dAotCW9zX2FsbG9jX21lbShOVUxMLCAoUFVDSEFSICopJmlucHV0LCAxMDI0KTsKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGlucHV0ICovCisJb3NfYWxsb2NfbWVtKE5VTEwsICh1OCAqKikgJiBpbnB1dCwgMTAyNCk7CiAKLSAgICBpZiAoaW5wdXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiEhIVBSRjogbm8gbWVtb3J5ISEhXG4iKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLQkvLyBHZW5lcmF0ZSBjb25jYXRlbmF0aW9uIGlucHV0CisJaWYgKGlucHV0ID09IE5VTEwpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUFJGOiBubyBtZW1vcnkhXG4iKSk7CisJCXJldHVybjsKKwl9CisJLyogR2VuZXJhdGUgY29uY2F0ZW5hdGlvbiBpbnB1dCAqLwogCU5kaXNNb3ZlTWVtb3J5KGlucHV0LCBwcmVmaXgsIHByZWZpeF9sZW4pOwogCi0JLy8gQ29uY2F0ZW5hdGUgYSBzaW5nbGUgb2N0ZXQgY29udGFpbmluZyAwCi0JaW5wdXRbcHJlZml4X2xlbl0gPQkwOworCS8qIENvbmNhdGVuYXRlIGEgc2luZ2xlIG9jdGV0IGNvbnRhaW5pbmcgMCAqLworCWlucHV0W3ByZWZpeF9sZW5dID0gMDsKIAotCS8vIENvbmNhdGVuYXRlIHNwZWNpZmljIGRhdGEKKwkvKiBDb25jYXRlbmF0ZSBzcGVjaWZpYyBkYXRhICovCiAJTmRpc01vdmVNZW1vcnkoJmlucHV0W3ByZWZpeF9sZW4gKyAxXSwgZGF0YSwgZGF0YV9sZW4pOwotCXRvdGFsX2xlbiA9CXByZWZpeF9sZW4gKyAxICsgZGF0YV9sZW47CisJdG90YWxfbGVuID0gcHJlZml4X2xlbiArIDEgKyBkYXRhX2xlbjsKIAotCS8vIENvbmNhdGVuYXRlIGEgc2luZ2xlIG9jdGV0IGNvbnRhaW5pbmcgMAotCS8vIFRoaXMgb2N0ZXQgc2hhbGwgYmUgdXBkYXRlIGxhdGVyCisJLyogQ29uY2F0ZW5hdGUgYSBzaW5nbGUgb2N0ZXQgY29udGFpbmluZyAwICovCisJLyogVGhpcyBvY3RldCBzaGFsbCBiZSB1cGRhdGUgbGF0ZXIgKi8KIAlpbnB1dFt0b3RhbF9sZW5dID0gMDsKIAl0b3RhbF9sZW4rKzsKIAotCS8vIEl0ZXJhdGUgdG8gY2FsY3VsYXRlIHRoZSByZXN1bHQgYnkgaG1hYy1zaGEtMQotCS8vIFRoZW4gY29uY2F0ZW5hdGUgdG8gbGFzdCByZXN1bHQKLQlmb3IJKGkgPSAwOwlpIDwJKGxlbiArIDE5KSAvIDIwOyBpKyspCi0JewotCQlITUFDX1NIQTEoaW5wdXQsIHRvdGFsX2xlbiwJa2V5LCBrZXlfbGVuLCAmb3V0cHV0W2N1cnJlbnRpbmRleF0pOwotCQljdXJyZW50aW5kZXggKz0JMjA7CisJLyogSXRlcmF0ZSB0byBjYWxjdWxhdGUgdGhlIHJlc3VsdCBieSBobWFjLXNoYS0xICovCisJLyogVGhlbiBjb25jYXRlbmF0ZSB0byBsYXN0IHJlc3VsdCAqLworCWZvciAoaSA9IDA7IGkgPCAobGVuICsgMTkpIC8gMjA7IGkrKykgeworCQlITUFDX1NIQTEoa2V5LCBrZXlfbGVuLCBpbnB1dCwgdG90YWxfbGVuLCAmb3V0cHV0W2N1cnJlbnRpbmRleF0sCisJCQkgIFNIQTFfRElHRVNUX1NJWkUpOworCQljdXJyZW50aW5kZXggKz0gMjA7CiAKLQkJLy8gdXBkYXRlIHRoZSBsYXN0IG9jdGV0CisJCS8qIHVwZGF0ZSB0aGUgbGFzdCBvY3RldCAqLwogCQlpbnB1dFt0b3RhbF9sZW4gLSAxXSsrOwogCX0KLSAgICBvc19mcmVlX21lbShOVUxMLCBpbnB1dCk7CisJb3NfZnJlZV9tZW0oTlVMTCwgaW5wdXQpOworfQorCisvKgorKiBGKFAsIFMsIGMsIGkpID0gVTEgeG9yIFUyIHhvciAuLi4gVWMKKyogVTEgPSBQUkYoUCwgUyB8fCBJbnQoaSkpCisqIFUyID0gUFJGKFAsIFUxKQorKiBVYyA9IFBSRihQLCBVYy0xKQorKi8KKworc3RhdGljIHZvaWQgRihjaGFyICpwYXNzd29yZCwgdW5zaWduZWQgY2hhciAqc3NpZCwgaW50IHNzaWRsZW5ndGgsCisJICAgICAgaW50IGl0ZXJhdGlvbnMsIGludCBjb3VudCwgdW5zaWduZWQgY2hhciAqb3V0cHV0KQoreworCXVuc2lnbmVkIGNoYXIgZGlnZXN0WzM2XSwgZGlnZXN0MVtTSEExX0RJR0VTVF9TSVpFXTsKKwlpbnQgaSwgajsKKworCS8qIFUxID0gUFJGKFAsIFMgfHwgaW50KGkpKSAqLworCW1lbWNweShkaWdlc3QsIHNzaWQsIHNzaWRsZW5ndGgpOworCWRpZ2VzdFtzc2lkbGVuZ3RoXSA9ICh1bnNpZ25lZCBjaGFyKSgoY291bnQgPj4gMjQpICYgMHhmZik7CisJZGlnZXN0W3NzaWRsZW5ndGggKyAxXSA9ICh1bnNpZ25lZCBjaGFyKSgoY291bnQgPj4gMTYpICYgMHhmZik7CisJZGlnZXN0W3NzaWRsZW5ndGggKyAyXSA9ICh1bnNpZ25lZCBjaGFyKSgoY291bnQgPj4gOCkgJiAweGZmKTsKKwlkaWdlc3Rbc3NpZGxlbmd0aCArIDNdID0gKHVuc2lnbmVkIGNoYXIpKGNvdW50ICYgMHhmZik7CisJSE1BQ19TSEExKCh1bnNpZ25lZCBjaGFyICopcGFzc3dvcmQsIChpbnQpc3RybGVuKHBhc3N3b3JkKSwgZGlnZXN0LCBzc2lkbGVuZ3RoICsgNCwgZGlnZXN0MSwgU0hBMV9ESUdFU1RfU0laRSk7CS8qIGZvciBXUEEgdXBkYXRlICovCisKKwkvKiBvdXRwdXQgPSBVMSAqLworCW1lbWNweShvdXRwdXQsIGRpZ2VzdDEsIFNIQTFfRElHRVNUX1NJWkUpOworCisJZm9yIChpID0gMTsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgeworCQkvKiBVbiA9IFBSRihQLCBVbi0xKSAqLworCQlITUFDX1NIQTEoKHVuc2lnbmVkIGNoYXIgKilwYXNzd29yZCwgKGludClzdHJsZW4ocGFzc3dvcmQpLCBkaWdlc3QxLCBTSEExX0RJR0VTVF9TSVpFLCBkaWdlc3QsIFNIQTFfRElHRVNUX1NJWkUpOwkvKiBmb3IgV1BBIHVwZGF0ZSAqLworCQltZW1jcHkoZGlnZXN0MSwgZGlnZXN0LCBTSEExX0RJR0VTVF9TSVpFKTsKKworCQkvKiBvdXRwdXQgPSBvdXRwdXQgeG9yIFVuICovCisJCWZvciAoaiA9IDA7IGogPCBTSEExX0RJR0VTVF9TSVpFOyBqKyspIHsKKwkJCW91dHB1dFtqXSBePSBkaWdlc3Rbal07CisJCX0KKwl9Cit9CisKKy8qCisqIHBhc3N3b3JkIC0gYXNjaWkgc3RyaW5nIHVwIHRvIDYzIGNoYXJhY3RlcnMgaW4gbGVuZ3RoCisqIHNzaWQgLSBvY3RldCBzdHJpbmcgdXAgdG8gMzIgb2N0ZXRzCisqIHNzaWRsZW5ndGggLSBsZW5ndGggb2Ygc3NpZCBpbiBvY3RldHMKKyogb3V0cHV0IG11c3QgYmUgNDAgb2N0ZXRzIGluIGxlbmd0aCBhbmQgb3V0cHV0cyAyNTYgYml0cyBvZiBrZXkKKyovCitpbnQgUGFzc3dvcmRIYXNoKGNoYXIgKnBhc3N3b3JkLCB1OCAqc3NpZCwgaW50IHNzaWRsZW5ndGgsIHU4ICpvdXRwdXQpCit7CisJaWYgKChzdHJsZW4ocGFzc3dvcmQpID4gNjMpIHx8IChzc2lkbGVuZ3RoID4gMzIpKQorCQlyZXR1cm4gMDsKKworCUYocGFzc3dvcmQsIHNzaWQsIHNzaWRsZW5ndGgsIDQwOTYsIDEsIG91dHB1dCk7CisJRihwYXNzd29yZCwgc3NpZCwgc3NpZGxlbmd0aCwgNDA5NiwgMiwgJm91dHB1dFtTSEExX0RJR0VTVF9TSVpFXSk7CisJcmV0dXJuIDE7CiB9CiAKIC8qCkBAIC0xNDMsNyArMTM4Myw3IEBACiAJCUl0IHNoYWxsIGJlIGNhbGxlZCBieSA0LXdheSBoYW5kc2hha2UgcHJvY2Vzc2luZy4KIAogCUFyZ3VtZW50czoKLQkJcEFkIAktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKwkJcEFkCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAogCQlQTUsJCS0JcG9pbnRlciB0byBQTUsKIAkJQU5vbmNlCS0JcG9pbnRlciB0byBBTm9uY2UKIAkJQUEJCS0JcG9pbnRlciB0byBBdXRoZW50aWNhdG9yIEFkZHJlc3MKQEAgLTE1OSw1NiArMTM5OSw1NSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBXcGFDb3VudFBUSygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkqUE1LLAotCUlOCVVDSEFSCSpBTm9uY2UsCi0JSU4JVUNIQVIJKkFBLAotCUlOCVVDSEFSCSpTTm9uY2UsCi0JSU4JVUNIQVIJKlNBLAotCU9VVAlVQ0hBUgkqb3V0cHV0LAotCUlOCVVJTlQJbGVuKQordm9pZCBXcGFEZXJpdmVQVEsoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgIHU4ICogUE1LLAorCQkgIHU4ICogQU5vbmNlLAorCQkgIHU4ICogQUEsCisJCSAgdTggKiBTTm9uY2UsCisJCSAgdTggKiBTQSwgdTggKiBvdXRwdXQsIHUzMiBsZW4pCiB7Ci0JVUNIQVIJY29uY2F0ZW5hdGlvbls3Nl07Ci0JVUlOVAlDdXJyUG9zID0gMDsKLQlVQ0hBUgl0ZW1wWzMyXTsKLQlVQ0hBUglQcmVmaXhbXSA9IHsnUCcsICdhJywgJ2knLCAncicsICd3JywgJ2knLCAncycsICdlJywgJyAnLCAnaycsICdlJywgJ3knLCAnICcsCi0JCQkJCQknZScsICd4JywgJ3AnLCAnYScsICduJywgJ3MnLCAnaScsICdvJywgJ24nfTsKKwl1OCBjb25jYXRlbmF0aW9uWzc2XTsKKwl1MzIgQ3VyclBvcyA9IDA7CisJdTggdGVtcFszMl07CisJdTggUHJlZml4W10gPQorCSAgICB7ICdQJywgJ2EnLCAnaScsICdyJywgJ3cnLCAnaScsICdzJywgJ2UnLCAnICcsICdrJywgJ2UnLCAneScsICcgJywKKwkJJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdzJywgJ2knLCAnbycsICduJworCX07CiAKLQkvLyBpbml0aWF0ZSB0aGUgY29uY2F0ZW5hdGlvbiBpbnB1dAorCS8qIGluaXRpYXRlIHRoZSBjb25jYXRlbmF0aW9uIGlucHV0ICovCiAJTmRpc1plcm9NZW1vcnkodGVtcCwgc2l6ZW9mKHRlbXApKTsKIAlOZGlzWmVyb01lbW9yeShjb25jYXRlbmF0aW9uLCA3Nik7CiAKLQkvLyBHZXQgc21hbGxlciBhZGRyZXNzCisJLyogR2V0IHNtYWxsZXIgYWRkcmVzcyAqLwogCWlmIChSVE1QQ29tcGFyZU1lbW9yeShTQSwgQUEsIDYpID09IDEpCiAJCU5kaXNNb3ZlTWVtb3J5KGNvbmNhdGVuYXRpb24sIEFBLCA2KTsKIAllbHNlCiAJCU5kaXNNb3ZlTWVtb3J5KGNvbmNhdGVuYXRpb24sIFNBLCA2KTsKIAlDdXJyUG9zICs9IDY7CiAKLQkvLyBHZXQgbGFyZ2VyIGFkZHJlc3MKKwkvKiBHZXQgbGFyZ2VyIGFkZHJlc3MgKi8KIAlpZiAoUlRNUENvbXBhcmVNZW1vcnkoU0EsIEFBLCA2KSA9PSAxKQogCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgU0EsIDYpOwogCWVsc2UKIAkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIEFBLCA2KTsKIAotCS8vIHN0b3JlIHRoZSBsYXJnZXIgbWFjIGFkZHJlc3MgZm9yIGJhY2t3YXJkIGNvbXBhdGlibGUgb2YKLQkvLyByYWxpbmsgcHJvcHJpZXRhcnkgU1RBLWtleSBpc3N1ZQorCS8qIHN0b3JlIHRoZSBsYXJnZXIgbWFjIGFkZHJlc3MgZm9yIGJhY2t3YXJkIGNvbXBhdGlibGUgb2YgKi8KKwkvKiByYWxpbmsgcHJvcHJpZXRhcnkgU1RBLWtleSBpc3N1ZSAqLwogCU5kaXNNb3ZlTWVtb3J5KHRlbXAsICZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBNQUNfQUREUl9MRU4pOwogCUN1cnJQb3MgKz0gNjsKIAotCS8vIEdldCBzbWFsbGVyIE5vbmNlCisJLyogR2V0IHNtYWxsZXIgTm9uY2UgKi8KIAlpZiAoUlRNUENvbXBhcmVNZW1vcnkoQU5vbmNlLCBTTm9uY2UsIDMyKSA9PSAwKQotCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgdGVtcCwgMzIpOwkvLyBwYXRjaCBmb3IgcmFsaW5rIHByb3ByaWV0YXJ5IFNUQS1rZXkgaXNzdWUKKwkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIHRlbXAsIDMyKTsJLyogcGF0Y2ggZm9yIHJhbGluayBwcm9wcmlldGFyeSBTVEEta2V5IGlzc3VlICovCiAJZWxzZSBpZiAoUlRNUENvbXBhcmVNZW1vcnkoQU5vbmNlLCBTTm9uY2UsIDMyKSA9PSAxKQogCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgU05vbmNlLCAzMik7CiAJZWxzZQogCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgQU5vbmNlLCAzMik7CiAJQ3VyclBvcyArPSAzMjsKIAotCS8vIEdldCBsYXJnZXIgTm9uY2UKKwkvKiBHZXQgbGFyZ2VyIE5vbmNlICovCiAJaWYgKFJUTVBDb21wYXJlTWVtb3J5KEFOb25jZSwgU05vbmNlLCAzMikgPT0gMCkKLQkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIHRlbXAsIDMyKTsJLy8gcGF0Y2ggZm9yIHJhbGluayBwcm9wcmlldGFyeSBTVEEta2V5IGlzc3VlCisJCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCB0ZW1wLCAzMik7CS8qIHBhdGNoIGZvciByYWxpbmsgcHJvcHJpZXRhcnkgU1RBLWtleSBpc3N1ZSAqLwogCWVsc2UgaWYgKFJUTVBDb21wYXJlTWVtb3J5KEFOb25jZSwgU05vbmNlLCAzMikgPT0gMSkKIAkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIEFOb25jZSwgMzIpOwogCWVsc2UKQEAgLTIxNyw3ICsxNDU2LDcgQEAKIAogCWhleF9kdW1wKCJjb25jYXRlbmF0aW9uPSIsIGNvbmNhdGVuYXRpb24sIDc2KTsKIAotCS8vIFVzZSBQUkYgdG8gZ2VuZXJhdGUgUFRLCisJLyogVXNlIFBSRiB0byBnZW5lcmF0ZSBQVEsgKi8KIAlQUkYoUE1LLCBMRU5fTUFTVEVSX0tFWSwgUHJlZml4LCAyMiwgY29uY2F0ZW5hdGlvbiwgNzYsIG91dHB1dCwgbGVuKTsKIAogfQpAQCAtMjM5LDQ2ICsxNDc4LDQzIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECUdlblJhbmRvbSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCSptYWNBZGRyLAotCU9VVAlVQ0hBUgkJCSpyYW5kb20pCit2b2lkIEdlblJhbmRvbShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4ICogbWFjQWRkciwgdTggKiByYW5kb20pCiB7Ci0JSU5UCQlpLCBjdXJyOwotCVVDSEFSCWxvY2FsWzgwXSwgS2V5Q291bnRlclszMl07Ci0JVUNIQVIJcmVzdWx0WzgwXTsKLQlVTE9ORwlDdXJyZW50VGltZTsKLQlVQ0hBUglwcmVmaXhbXSA9IHsnSScsICduJywgJ2knLCAndCcsICcgJywgJ0MnLCAnbycsICd1JywgJ24nLCAndCcsICdlJywgJ3InfTsKKwlpbnQgaSwgY3VycjsKKwl1OCBsb2NhbFs4MF0sIEtleUNvdW50ZXJbMzJdOworCXU4IHJlc3VsdFs4MF07CisJdW5zaWduZWQgbG9uZyBDdXJyZW50VGltZTsKKwl1OCBwcmVmaXhbXSA9CisJICAgIHsgJ0knLCAnbicsICdpJywgJ3QnLCAnICcsICdDJywgJ28nLCAndScsICduJywgJ3QnLCAnZScsICdyJyB9OwogCi0JLy8gWmVybyB0aGUgcmVsYXRlZCBpbmZvcm1hdGlvbgorCS8qIFplcm8gdGhlIHJlbGF0ZWQgaW5mb3JtYXRpb24gKi8KIAlOZGlzWmVyb01lbW9yeShyZXN1bHQsIDgwKTsKIAlOZGlzWmVyb01lbW9yeShsb2NhbCwgODApOwogCU5kaXNaZXJvTWVtb3J5KEtleUNvdW50ZXIsIDMyKTsKIAotCWZvcgkoaSA9IDA7CWkgPAkzMjsJaSsrKQotCXsKLQkJLy8gY29weSB0aGUgbG9jYWwgTUFDIGFkZHJlc3MKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQkvKiBjb3B5IHRoZSBsb2NhbCBNQUMgYWRkcmVzcyAqLwogCQlDT1BZX01BQ19BRERSKGxvY2FsLCBtYWNBZGRyKTsKLQkJY3VyciA9CU1BQ19BRERSX0xFTjsKKwkJY3VyciA9IE1BQ19BRERSX0xFTjsKIAotCQkvLyBjb25jYXRlbmF0ZSB0aGUgY3VycmVudCB0aW1lCisJCS8qIGNvbmNhdGVuYXRlIHRoZSBjdXJyZW50IHRpbWUgKi8KIAkJTmRpc0dldFN5c3RlbVVwVGltZSgmQ3VycmVudFRpbWUpOwotCQlOZGlzTW92ZU1lbW9yeSgmbG9jYWxbY3Vycl0sICAmQ3VycmVudFRpbWUsCXNpemVvZihDdXJyZW50VGltZSkpOwotCQljdXJyICs9CXNpemVvZihDdXJyZW50VGltZSk7CisJCU5kaXNNb3ZlTWVtb3J5KCZsb2NhbFtjdXJyXSwgJkN1cnJlbnRUaW1lLCBzaXplb2YoQ3VycmVudFRpbWUpKTsKKwkJY3VyciArPSBzaXplb2YoQ3VycmVudFRpbWUpOwogCi0JCS8vIGNvbmNhdGVuYXRlIHRoZSBsYXN0IHJlc3VsdAotCQlOZGlzTW92ZU1lbW9yeSgmbG9jYWxbY3Vycl0sICByZXN1bHQsIDMyKTsKLQkJY3VyciArPQkzMjsKKwkJLyogY29uY2F0ZW5hdGUgdGhlIGxhc3QgcmVzdWx0ICovCisJCU5kaXNNb3ZlTWVtb3J5KCZsb2NhbFtjdXJyXSwgcmVzdWx0LCAzMik7CisJCWN1cnIgKz0gMzI7CiAKLQkJLy8gY29uY2F0ZW5hdGUgYSB2YXJpYWJsZQotCQlOZGlzTW92ZU1lbW9yeSgmbG9jYWxbY3Vycl0sICAmaSwgIDIpOwotCQljdXJyICs9CTI7CisJCS8qIGNvbmNhdGVuYXRlIGEgdmFyaWFibGUgKi8KKwkJTmRpc01vdmVNZW1vcnkoJmxvY2FsW2N1cnJdLCAmaSwgMik7CisJCWN1cnIgKz0gMjsKIAotCQkvLyBjYWxjdWxhdGUgdGhlIHJlc3VsdAotCQlQUkYoS2V5Q291bnRlciwgMzIsIHByZWZpeCwxMiwgbG9jYWwsIGN1cnIsIHJlc3VsdCwgMzIpOworCQkvKiBjYWxjdWxhdGUgdGhlIHJlc3VsdCAqLworCQlQUkYoS2V5Q291bnRlciwgMzIsIHByZWZpeCwgMTIsIGxvY2FsLCBjdXJyLCByZXN1bHQsIDMyKTsKIAl9CiAKLQlOZGlzTW92ZU1lbW9yeShyYW5kb20sIHJlc3VsdCwJMzIpOworCU5kaXNNb3ZlTWVtb3J5KHJhbmRvbSwgcmVzdWx0LCAzMik7CiB9CiAKIC8qCkBAIC0yOTAsOCArMTUyNiw4IEBACiAKIAlBcmd1bWVudHM6CiAJCXBBZAkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAotICAgIAlFbGVtZW50SUQJLQlpbmRpY2F0ZSB0aGUgV1BBMSBvciBXUEEyCi0gICAgCVdlcFN0YXR1cwktCWluZGljYXRlIHRoZSBlbmNyeXB0aW9uIHR5cGUKKwlFbGVtZW50SUQJLQlpbmRpY2F0ZSB0aGUgV1BBMSBvciBXUEEyCisJV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQogCQliTWl4Q2lwaGVyCS0JYSBib29sZWFuIHRvIGluZGljYXRlIHRoZSBwYWlyd2lzZSBjaXBoZXIgYW5kIGdyb3VwCiAJCQkJCQljaXBoZXIgYXJlIHRoZSBzYW1lIG9yIG5vdAogCkBAIC0zMDEsMTcwICsxNTM3LDE2OSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotc3RhdGljIFZPSUQgUlRNUEluc2VydFJzbkllQ2lwaGVyKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCVVDSEFSCQkJRWxlbWVudElELAotCUlOCVVJTlQJCQlXZXBTdGF0dXMsCi0JSU4JQk9PTEVBTgkJCWJNaXhDaXBoZXIsCi0JSU4JVUNIQVIJCQlGbGV4aWJsZUNpcGhlciwKLQlPVVQJUFVDSEFSCQkJcFJzbkllLAotCU9VVAlVQ0hBUgkJCSpyc25fbGVuKQorc3RhdGljIHZvaWQgUlRNUE1ha2VSc25JZUNpcGhlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJdTggRWxlbWVudElELAorCQkJCXUzMiBXZXBTdGF0dXMsCisJCQkJSU4gQk9PTEVBTiBiTWl4Q2lwaGVyLAorCQkJCXU4IEZsZXhpYmxlQ2lwaGVyLAorCQkJCXU4ICpwUnNuSWUsIHU4ICogcnNuX2xlbikKIHsKLQlVQ0hBUglQYWlyd2lzZUNudDsKKwl1OCBQYWlyd2lzZUNudDsKIAogCSpyc25fbGVuID0gMDsKIAotCS8vIGRlY2lkZSBXUEEyIG9yIFdQQTEKLQlpZiAoRWxlbWVudElEID09IFdwYTJJZSkKLQl7Ci0JCVJTTklFMgkqcFJzbmllX2NpcGhlciA9IChSU05JRTIqKXBSc25JZTsKKwkvKiBkZWNpZGUgV1BBMiBvciBXUEExICovCisJaWYgKEVsZW1lbnRJRCA9PSBXcGEySWUpIHsKKwkJc3RydWN0IHJ0X3JzbmllMiAqcFJzbmllX2NpcGhlciA9IChzdHJ1Y3QgcnRfcnNuaWUyICopcFJzbkllOwogCi0JCS8vIEFzc2lnbiB0aGUgdmVyc29uIGFzIDEKKwkJLyogQXNzaWduIHRoZSB2ZXJzb24gYXMgMSAqLwogCQlwUnNuaWVfY2lwaGVyLT52ZXJzaW9uID0gMTsKIAotICAgICAgICBzd2l0Y2ggKFdlcFN0YXR1cykKLSAgICAgICAgewotICAgICAgICAJLy8gVEtJUCBtb2RlCi0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ6Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEEyX1RLSVAsIDQpOwotICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IDE7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBMl9US0lQLCA0KTsKLSAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRTIpOwotICAgICAgICAgICAgICAgIGJyZWFrOworCQlzd2l0Y2ggKFdlcFN0YXR1cykgeworCQkJLyogVEtJUCBtb2RlICovCisJCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDoKKwkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9US0lQLCA0KTsKKwkJCXBSc25pZV9jaXBoZXItPnVjb3VudCA9IDE7CisJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksCisJCQkJICAgICAgIE9VSV9XUEEyX1RLSVAsIDQpOworCQkJKnJzbl9sZW4gPSBzaXplb2Yoc3RydWN0IHJ0X3JzbmllMik7CisJCQlicmVhazsKIAotCQkJLy8gQUVTIG1vZGUKLSAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDoKLQkJCQlpZiAoYk1peENpcGhlcikKLQkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEEyX1RLSVAsIDQpOwotCQkJCWVsc2UKLQkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEEyX0NDTVAsIDQpOwotICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IDE7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBMl9DQ01QLCA0KTsKLSAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRTIpOwotICAgICAgICAgICAgICAgIGJyZWFrOworCQkJLyogQUVTIG1vZGUgKi8KKwkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOgorCQkJaWYgKGJNaXhDaXBoZXIpCisJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsCisJCQkJCSAgICAgICBPVUlfV1BBMl9US0lQLCA0KTsKKwkJCWVsc2UKKwkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwKKwkJCQkJICAgICAgIE9VSV9XUEEyX0NDTVAsIDQpOworCQkJcFJzbmllX2NpcGhlci0+dWNvdW50ID0gMTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwKKwkJCQkgICAgICAgT1VJX1dQQTJfQ0NNUCwgNCk7CisJCQkqcnNuX2xlbiA9IHNpemVvZihzdHJ1Y3QgcnRfcnNuaWUyKTsKKwkJCWJyZWFrOwogCi0JCQkvLyBUS0lQLUFFUyBtaXggbW9kZQotICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkOgotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9US0lQLCA0KTsKKwkJCS8qIFRLSVAtQUVTIG1peCBtb2RlICovCisJCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDoKKwkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9US0lQLCA0KTsKIAotCQkJCVBhaXJ3aXNlQ250ID0gMTsKLQkJCQkvLyBJbnNlcnQgV1BBMiBUS0lQIGFzIHRoZSBmaXJzdCBwYWlyd2lzZSBjaXBoZXIKLQkJCQlpZiAoTUlYX0NJUEhFUl9XUEEyX1RLSVBfT04oRmxleGlibGVDaXBoZXIpKQotCQkJCXsKLSAgICAgICAgICAgICAgICAJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBMl9US0lQLCA0KTsKLQkJCQkJLy8gSW5zZXJ0IFdQQTIgQUVTIGFzIHRoZSBzZWNvbmRhcnkgcGFpcndpc2UgY2lwaGVyCi0JCQkJCWlmIChNSVhfQ0lQSEVSX1dQQTJfQUVTX09OKEZsZXhpYmxlQ2lwaGVyKSkKLQkJCQkJewotICAgICAgICAgICAgICAgIAkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpICsgNCwgT1VJX1dQQTJfQ0NNUCwgNCk7Ci0JCQkJCQlQYWlyd2lzZUNudCA9IDI7Ci0JCQkJCX0KKwkJCVBhaXJ3aXNlQ250ID0gMTsKKwkJCS8qIEluc2VydCBXUEEyIFRLSVAgYXMgdGhlIGZpcnN0IHBhaXJ3aXNlIGNpcGhlciAqLworCQkJaWYgKE1JWF9DSVBIRVJfV1BBMl9US0lQX09OKEZsZXhpYmxlQ2lwaGVyKSkgeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwKKwkJCQkJICAgICAgIE9VSV9XUEEyX1RLSVAsIDQpOworCQkJCS8qIEluc2VydCBXUEEyIEFFUyBhcyB0aGUgc2Vjb25kYXJ5IHBhaXJ3aXNlIGNpcGhlciAqLworCQkJCWlmIChNSVhfQ0lQSEVSX1dQQTJfQUVTX09OKEZsZXhpYmxlQ2lwaGVyKSkgeworCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS4KKwkJCQkJCSAgICAgICBvdWkgKyA0LCBPVUlfV1BBMl9DQ01QLAorCQkJCQkJICAgICAgIDQpOworCQkJCQlQYWlyd2lzZUNudCA9IDI7CiAJCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCS8vIEluc2VydCBXUEEyIEFFUyBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyCi0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQTJfQ0NNUCwgNCk7Ci0JCQkJfQotCi0gICAgICAgICAgICAgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gUGFpcndpc2VDbnQ7Ci0gICAgICAgICAgICAgICAgKnJzbl9sZW4gPSBzaXplb2YoUlNOSUUyKSArICg0ICogKFBhaXJ3aXNlQ250IC0gMSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLQkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJgotCQkJKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCi0JCQkocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpCi0JCXsKLQkJCVVJTlQgR3JvdXBDaXBoZXIgPSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcjsKLQkJCXN3aXRjaChHcm91cENpcGhlcikKLQkJCXsKLQkJCQljYXNlIE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZDoKLQkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEEyX1dFUDQwLCA0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkOgotCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfV0VQMTA0LCA0KTsKLQkJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCS8qIEluc2VydCBXUEEyIEFFUyBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyICovCisJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLAorCQkJCQkgICAgICAgT1VJX1dQQTJfQ0NNUCwgNCk7CiAJCQl9CisKKwkJCXBSc25pZV9jaXBoZXItPnVjb3VudCA9IFBhaXJ3aXNlQ250OworCQkJKnJzbl9sZW4gPSBzaXplb2Yoc3RydWN0IHJ0X3JzbmllMikgKyAoNCAqIChQYWlyd2lzZUNudCAtIDEpKTsKKwkJCWJyZWFrOwogCQl9CiAKLQkJLy8gc3dhcCBmb3IgYmlnLWVuZGlhbiBwbGF0Zm9ybQorCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmCisJCSAgICAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgJiYKKwkJICAgIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciAhPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkgeworCQkJdTMyIEdyb3VwQ2lwaGVyID0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXI7CisJCQlzd2l0Y2ggKEdyb3VwQ2lwaGVyKSB7CisJCQljYXNlIE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZDoKKwkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwKKwkJCQkJICAgICAgIE9VSV9XUEEyX1dFUDQwLCA0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZDoKKwkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwKKwkJCQkJICAgICAgIE9VSV9XUEEyX1dFUDEwNCwgNCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLyogc3dhcCBmb3IgYmlnLWVuZGlhbiBwbGF0Zm9ybSAqLwogCQlwUnNuaWVfY2lwaGVyLT52ZXJzaW9uID0gY3B1MmxlMTYocFJzbmllX2NpcGhlci0+dmVyc2lvbik7Ci0JICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IGNwdTJsZTE2KHBSc25pZV9jaXBoZXItPnVjb3VudCk7Ci0JfQotCWVsc2UKLQl7Ci0JCVJTTklFCSpwUnNuaWVfY2lwaGVyID0gKFJTTklFKilwUnNuSWU7CisJCXBSc25pZV9jaXBoZXItPnVjb3VudCA9IGNwdTJsZTE2KHBSc25pZV9jaXBoZXItPnVjb3VudCk7CisJfSBlbHNlIHsKKwkJc3RydWN0IHJ0X3JzbmllICpwUnNuaWVfY2lwaGVyID0gKHN0cnVjdCBydF9yc25pZSAqKXBSc25JZTsKIAotCQkvLyBBc3NpZ24gT1VJIGFuZCB2ZXJzaW9uCisJCS8qIEFzc2lnbiBPVUkgYW5kIHZlcnNpb24gKi8KIAkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+b3VpLCBPVUlfV1BBX1ZFUlNJT04sIDQpOwotICAgICAgICBwUnNuaWVfY2lwaGVyLT52ZXJzaW9uID0gMTsKKwkJcFJzbmllX2NpcGhlci0+dmVyc2lvbiA9IDE7CiAKLQkJc3dpdGNoIChXZXBTdGF0dXMpCi0JCXsKLQkJCS8vIFRLSVAgbW9kZQotICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOgotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX1RLSVAsIDQpOwotICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IDE7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBX1RLSVAsIDQpOwotICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFKTsKLSAgICAgICAgICAgICAgICBicmVhazsKKwkJc3dpdGNoIChXZXBTdGF0dXMpIHsKKwkJCS8qIFRLSVAgbW9kZSAqLworCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ6CisJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQV9US0lQLCA0KTsKKwkJCXBSc25pZV9jaXBoZXItPnVjb3VudCA9IDE7CisJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksCisJCQkJICAgICAgIE9VSV9XUEFfVEtJUCwgNCk7CisJCQkqcnNuX2xlbiA9IHNpemVvZihzdHJ1Y3QgcnRfcnNuaWUpOworCQkJYnJlYWs7CiAKLQkJCS8vIEFFUyBtb2RlCi0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ6Ci0JCQkJaWYgKGJNaXhDaXBoZXIpCi0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX1RLSVAsIDQpOwotCQkJCWVsc2UKLQkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfQ0NNUCwgNCk7Ci0gICAgICAgICAgICAgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gMTsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEFfQ0NNUCwgNCk7Ci0gICAgICAgICAgICAgICAgKnJzbl9sZW4gPSBzaXplb2YoUlNOSUUpOwotICAgICAgICAgICAgICAgIGJyZWFrOworCQkJLyogQUVTIG1vZGUgKi8KKwkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOgorCQkJaWYgKGJNaXhDaXBoZXIpCisJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsCisJCQkJCSAgICAgICBPVUlfV1BBX1RLSVAsIDQpOworCQkJZWxzZQorCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LAorCQkJCQkgICAgICAgT1VJX1dQQV9DQ01QLCA0KTsKKwkJCXBSc25pZV9jaXBoZXItPnVjb3VudCA9IDE7CisJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksCisJCQkJICAgICAgIE9VSV9XUEFfQ0NNUCwgNCk7CisJCQkqcnNuX2xlbiA9IHNpemVvZihzdHJ1Y3QgcnRfcnNuaWUpOworCQkJYnJlYWs7CiAKLQkJCS8vIFRLSVAtQUVTIG1peCBtb2RlCi0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ6Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfVEtJUCwgNCk7CisJCQkvKiBUS0lQLUFFUyBtaXggbW9kZSAqLworCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ6CisJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQV9US0lQLCA0KTsKIAotCQkJCVBhaXJ3aXNlQ250ID0gMTsKLQkJCQkvLyBJbnNlcnQgV1BBIFRLSVAgYXMgdGhlIGZpcnN0IHBhaXJ3aXNlIGNpcGhlcgotCQkJCWlmIChNSVhfQ0lQSEVSX1dQQV9US0lQX09OKEZsZXhpYmxlQ2lwaGVyKSkKLQkJCQl7Ci0gICAgICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQV9US0lQLCA0KTsKLQkJCQkJLy8gSW5zZXJ0IFdQQSBBRVMgYXMgdGhlIHNlY29uZGFyeSBwYWlyd2lzZSBjaXBoZXIKLQkJCQkJaWYgKE1JWF9DSVBIRVJfV1BBX0FFU19PTihGbGV4aWJsZUNpcGhlcikpCi0JCQkJCXsKLSAgICAgICAgICAgICAgICAJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSArIDQsIE9VSV9XUEFfQ0NNUCwgNCk7Ci0JCQkJCQlQYWlyd2lzZUNudCA9IDI7Ci0JCQkJCX0KKwkJCVBhaXJ3aXNlQ250ID0gMTsKKwkJCS8qIEluc2VydCBXUEEgVEtJUCBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyICovCisJCQlpZiAoTUlYX0NJUEhFUl9XUEFfVEtJUF9PTihGbGV4aWJsZUNpcGhlcikpIHsKKwkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksCisJCQkJCSAgICAgICBPVUlfV1BBX1RLSVAsIDQpOworCQkJCS8qIEluc2VydCBXUEEgQUVTIGFzIHRoZSBzZWNvbmRhcnkgcGFpcndpc2UgY2lwaGVyICovCisJCQkJaWYgKE1JWF9DSVBIRVJfV1BBX0FFU19PTihGbGV4aWJsZUNpcGhlcikpIHsKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0uCisJCQkJCQkgICAgICAgb3VpICsgNCwgT1VJX1dQQV9DQ01QLAorCQkJCQkJICAgICAgIDQpOworCQkJCQlQYWlyd2lzZUNudCA9IDI7CiAJCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCS8vIEluc2VydCBXUEEgQUVTIGFzIHRoZSBmaXJzdCBwYWlyd2lzZSBjaXBoZXIKLQkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBX0NDTVAsIDQpOwotCQkJCX0KLQotICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IFBhaXJ3aXNlQ250OwotICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFKSArICg0ICogKFBhaXJ3aXNlQ250IC0gMSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLQkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJgotCQkJKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCi0JCQkocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpCi0JCXsKLQkJCVVJTlQgR3JvdXBDaXBoZXIgPSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcjsKLQkJCXN3aXRjaChHcm91cENpcGhlcikKLQkJCXsKLQkJCQljYXNlIE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZDoKLQkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfV0VQNDAsIDQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQ6Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX1dFUDEwNCwgNCk7Ci0JCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQkvKiBJbnNlcnQgV1BBIEFFUyBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyICovCisJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLAorCQkJCQkgICAgICAgT1VJX1dQQV9DQ01QLCA0KTsKIAkJCX0KKworCQkJcFJzbmllX2NpcGhlci0+dWNvdW50ID0gUGFpcndpc2VDbnQ7CisJCQkqcnNuX2xlbiA9IHNpemVvZihzdHJ1Y3QgcnRfcnNuaWUpICsgKDQgKiAoUGFpcndpc2VDbnQgLSAxKSk7CisJCQlicmVhazsKIAkJfQogCi0JCS8vIHN3YXAgZm9yIGJpZy1lbmRpYW4gcGxhdGZvcm0KKwkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJgorCQkgICAgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCisJCSAgICAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpIHsKKwkJCXUzMiBHcm91cENpcGhlciA9IHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyOworCQkJc3dpdGNoIChHcm91cENpcGhlcikgeworCQkJY2FzZSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQ6CisJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsCisJCQkJCSAgICAgICBPVUlfV1BBX1dFUDQwLCA0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZDoKKwkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwKKwkJCQkJICAgICAgIE9VSV9XUEFfV0VQMTA0LCA0KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKiBzd2FwIGZvciBiaWctZW5kaWFuIHBsYXRmb3JtICovCiAJCXBSc25pZV9jaXBoZXItPnZlcnNpb24gPSBjcHUybGUxNihwUnNuaWVfY2lwaGVyLT52ZXJzaW9uKTsKLQkgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gY3B1MmxlMTYocFJzbmllX2NpcGhlci0+dWNvdW50KTsKKwkJcFJzbmllX2NpcGhlci0+dWNvdW50ID0gY3B1MmxlMTYocFJzbmllX2NpcGhlci0+dWNvdW50KTsKIAl9CiB9CiAKQEAgLTQ3Nyw4ICsxNzEyLDggQEAKIAogCUFyZ3VtZW50czoKIAkJcEFkCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0Ci0gICAgCUVsZW1lbnRJRAktCWluZGljYXRlIHRoZSBXUEExIG9yIFdQQTIKLSAgICAJQXV0aE1vZGUJLQlpbmRpY2F0ZSB0aGUgYXV0aGVudGljYXRpb24gbW9kZQorCUVsZW1lbnRJRAktCWluZGljYXRlIHRoZSBXUEExIG9yIFdQQTIKKwlBdXRoTW9kZQktCWluZGljYXRlIHRoZSBhdXRoZW50aWNhdGlvbiBtb2RlCiAJCWFwaWR4CQktCWluZGljYXRlIHRoZSBpbnRlcmZhY2UgaW5kZXgKIAogCVJldHVybiBWYWx1ZToKQEAgLTQ4Nyw2MiArMTcyMiw2NiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotc3RhdGljIFZPSUQgUlRNUEluc2VydFJzbkllQUtNKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCVVDSEFSCQkJRWxlbWVudElELAotCUlOCVVJTlQJCQlBdXRoTW9kZSwKLQlJTglVQ0hBUgkJCWFwaWR4LAotCU9VVAlQVUNIQVIJCQlwUnNuSWUsCi0JT1VUCVVDSEFSCQkJKnJzbl9sZW4pCitzdGF0aWMgdm9pZCBSVE1QTWFrZVJzbkllQUtNKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgdTggRWxlbWVudElELAorCQkJICAgICB1MzIgQXV0aE1vZGUsCisJCQkgICAgIHU4IGFwaWR4LAorCQkJICAgICB1OCAqcFJzbkllLCB1OCAqIHJzbl9sZW4pCiB7Ci0JUlNOSUVfQVVUSAkJKnBSc25pZV9hdXRoOworCXN0cnVjdCBydF9yc25pZV9hdXRoICpwUnNuaWVfYXV0aDsKKwl1OCBBa21DbnQgPSAxOwkvKiBkZWZhdWx0IGFzIDEgKi8KIAotCXBSc25pZV9hdXRoID0gKFJTTklFX0FVVEgqKShwUnNuSWUgKyAoKnJzbl9sZW4pKTsKKwlwUnNuaWVfYXV0aCA9IChzdHJ1Y3QgcnRfcnNuaWVfYXV0aCAqKSAocFJzbkllICsgKCpyc25fbGVuKSk7CiAKLQkvLyBkZWNpZGUgV1BBMiBvciBXUEExCi0JaWYgKEVsZW1lbnRJRCA9PSBXcGEySWUpCi0JewotCQlzd2l0Y2ggKEF1dGhNb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI6Ci0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyOgotICAgICAgICAgICAgICAgIHBSc25pZV9hdXRoLT5hY291bnQgPSAxOwotICAgICAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksIE9VSV9XUEEyXzgwMjFYX0FLTSwgNCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJLyogZGVjaWRlIFdQQTIgb3IgV1BBMSAqLworCWlmIChFbGVtZW50SUQgPT0gV3BhMkllKSB7CiAKLSAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzoKLSAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0s6Ci0gICAgICAgICAgICAgICAgcFJzbmllX2F1dGgtPmFjb3VudCA9IDE7Ci0gICAgICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwgT1VJX1dQQTJfUFNLX0FLTSwgNCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQl9Ci0JZWxzZQotCXsKLQkJc3dpdGNoIChBdXRoTW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEE6Ci0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyOgotICAgICAgICAgICAgICAgIHBSc25pZV9hdXRoLT5hY291bnQgPSAxOwotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwgT1VJX1dQQV84MDIxWF9BS00sIDQpOwotICAgICAgICAgICAgICAgIGJyZWFrOworCQlzd2l0Y2ggKEF1dGhNb2RlKSB7CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMjoKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMjoKKwkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwKKwkJCQkgICAgICAgT1VJX1dQQTJfODAyMVhfQUtNLCA0KTsKKwkJCWJyZWFrOwogCi0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzoKLSAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0s6Ci0gICAgICAgICAgICAgICAgcFJzbmllX2F1dGgtPmFjb3VudCA9IDE7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2F1dGgtPmF1dGhbMF0ub3VpLCBPVUlfV1BBX1BTS19BS00sIDQpOwotICAgICAgICAgICAgICAgIGJyZWFrOworCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s6CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0s6CisJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksCisJCQkJICAgICAgIE9VSV9XUEEyX1BTS19BS00sIDQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlBa21DbnQgPSAwOworCQkJYnJlYWs7CiAKLQkJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZToKLSAgICAgICAgICAgICAgICBwUnNuaWVfYXV0aC0+YWNvdW50ID0gMTsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksIE9VSV9XUEFfTk9ORV9BS00sIDQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKEF1dGhNb2RlKSB7CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBOgorCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyOgorCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2F1dGgtPmF1dGhbMF0ub3VpLAorCQkJCSAgICAgICBPVUlfV1BBXzgwMjFYX0FLTSwgNCk7CisJCQlicmVhazsKKworCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzoKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSzoKKwkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwKKwkJCQkgICAgICAgT1VJX1dQQV9QU0tfQUtNLCA0KTsKKwkJCWJyZWFrOworCisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZToKKwkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwKKwkJCQkgICAgICAgT1VJX1dQQV9OT05FX0FLTSwgNCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFrbUNudCA9IDA7CisJCQlicmVhazsKKwkJfQogCX0KIAorCXBSc25pZV9hdXRoLT5hY291bnQgPSBBa21DbnQ7CiAJcFJzbmllX2F1dGgtPmFjb3VudCA9IGNwdTJsZTE2KHBSc25pZV9hdXRoLT5hY291bnQpOwogCi0JKCpyc25fbGVuKSArPSBzaXplb2YoUlNOSUVfQVVUSCk7CS8vIHVwZGF0ZSBjdXJyZW50IFJTTklFIGxlbmd0aAorCS8qIHVwZGF0ZSBjdXJyZW50IFJTTklFIGxlbmd0aCAqLworCSgqcnNuX2xlbikgKz0gKHNpemVvZihzdHJ1Y3QgcnRfcnNuaWVfYXV0aCkgKyAoNCAqIChBa21DbnQgLSAxKSkpOwogCiB9CiAKQEAgLTU1NSw3ICsxNzk0LDcgQEAKIAogCUFyZ3VtZW50czoKIAkJcEFkCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0Ci0gICAgCUVsZW1lbnRJRAktCWluZGljYXRlIHRoZSBXUEExIG9yIFdQQTIKKwlFbGVtZW50SUQJLQlpbmRpY2F0ZSB0aGUgV1BBMSBvciBXUEEyCiAJCWFwaWR4CQktCWluZGljYXRlIHRoZSBpbnRlcmZhY2UgaW5kZXgKIAogCVJldHVybiBWYWx1ZToKQEAgLTU2NCwyOSArMTgwMywyNSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotc3RhdGljIFZPSUQgUlRNUEluc2VydFJzbkllQ2FwKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCVVDSEFSCQkJRWxlbWVudElELAotCUlOCVVDSEFSCQkJYXBpZHgsCi0JT1VUCVBVQ0hBUgkJCXBSc25JZSwKLQlPVVQJVUNIQVIJCQkqcnNuX2xlbikKK3N0YXRpYyB2b2lkIFJUTVBNYWtlUnNuSWVDYXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB1OCBFbGVtZW50SUQsCisJCQkgICAgIHU4IGFwaWR4LAorCQkJICAgICB1OCAqcFJzbkllLCB1OCAqIHJzbl9sZW4pCiB7Ci0JUlNOX0NBUEFCSUxJVElFUyAgICAqcFJTTl9DYXA7CisJUlNOX0NBUEFCSUxJVElFUyAqcFJTTl9DYXA7CiAKLQkvLyBpdCBjb3VsZCBiZSBpZ25vcmVkIGluIFdQQTEgbW9kZQorCS8qIGl0IGNvdWxkIGJlIGlnbm9yZWQgaW4gV1BBMSBtb2RlICovCiAJaWYgKEVsZW1lbnRJRCA9PSBXcGFJZSkKIAkJcmV0dXJuOwogCi0JcFJTTl9DYXAgPSAoUlNOX0NBUEFCSUxJVElFUyopKHBSc25JZSArICgqcnNuX2xlbikpOwotCisJcFJTTl9DYXAgPSAoUlNOX0NBUEFCSUxJVElFUyAqKSAocFJzbkllICsgKCpyc25fbGVuKSk7CiAKIAlwUlNOX0NhcC0+d29yZCA9IGNwdTJsZTE2KHBSU05fQ2FwLT53b3JkKTsKIAotCSgqcnNuX2xlbikgKz0gc2l6ZW9mKFJTTl9DQVBBQklMSVRJRVMpOwkvLyB1cGRhdGUgY3VycmVudCBSU05JRSBsZW5ndGgKKwkoKnJzbl9sZW4pICs9IHNpemVvZihSU05fQ0FQQUJJTElUSUVTKTsJLyogdXBkYXRlIGN1cnJlbnQgUlNOSUUgbGVuZ3RoICovCiAKIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC01OTUsOCArMTgzMCw4IEBACiAKIAlBcmd1bWVudHM6CiAJCXBBZAkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAotICAgIAlBdXRoTW9kZQktCWluZGljYXRlIHRoZSBhdXRoZW50aWNhdGlvbiBtb2RlCi0gICAgCVdlcFN0YXR1cwktCWluZGljYXRlIHRoZSBlbmNyeXB0aW9uIHR5cGUKKwlBdXRoTW9kZQktCWluZGljYXRlIHRoZSBhdXRoZW50aWNhdGlvbiBtb2RlCisJV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQogCQlhcGlkeAkJLQlpbmRpY2F0ZSB0aGUgaW50ZXJmYWNlIGluZGV4CiAKIAlSZXR1cm4gVmFsdWU6CkBAIC02MDUsNDggKzE4NDAsNDMgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgUlRNUE1ha2VSU05JRSgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgVUlOVCAgICAgICAgICAgIEF1dGhNb2RlLAotICAgIElOICBVSU5UICAgICAgICAgICAgV2VwU3RhdHVzLAotCUlOCVVDSEFSCQkJYXBpZHgpCit2b2lkIFJUTVBNYWtlUlNOSUUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICB1MzIgQXV0aE1vZGUsIHUzMiBXZXBTdGF0dXMsIHU4IGFwaWR4KQogewotCVBVQ0hBUgkJcFJzbkllID0gTlVMTDsJCQkvLyBwcmltYXJ5IFJTTklFCi0JVUNIQVIgCQkqcnNuaWVsZW5fY3VyX3AgPSAwOwkvLyB0aGUgbGVuZ3RoIG9mIHRoZSBwcmltYXJ5IFJTTklFCi0JVUNIQVIJCSpyc25pZWxlbl9leF9jdXJfcCA9IDA7CS8vIHRoZSBsZW5ndGggb2YgdGhlIHNlY29uZGFyeSBSU05JRQotCVVDSEFSCQlQcmltYXJ5UnNuaWU7Ci0JQk9PTEVBTgkJYk1peENpcGhlciA9IEZBTFNFOwkvLyBpbmRpY2F0ZSB0aGUgcGFpcndpc2UgYW5kIGdyb3VwIGNpcGhlciBhcmUgZGlmZmVyZW50Ci0JVUNIQVIJCXBfb2Zmc2V0OwotCVdQQV9NSVhfUEFJUl9DSVBIRVIJCUZsZXhpYmxlQ2lwaGVyID0gV1BBX1RLSVBBRVNfV1BBMl9US0lQQUVTOwkvLyBpdCBwcm92aWRlIHRoZSBtb3JlIGZsZXhpYmxlIGNpcGhlciBjb21iaW5hdGlvbiBpbiBXUEEtV1BBMiBhbmQgVEtJUEFFUyBtb2RlCisJdTggKnBSc25JZSA9IE5VTEw7CS8qIHByaW1hcnkgUlNOSUUgKi8KKwl1OCAqcnNuaWVsZW5fY3VyX3AgPSAwOwkvKiB0aGUgbGVuZ3RoIG9mIHRoZSBwcmltYXJ5IFJTTklFICovCisJdTggKnJzbmllbGVuX2V4X2N1cl9wID0gMDsJLyogdGhlIGxlbmd0aCBvZiB0aGUgc2Vjb25kYXJ5IFJTTklFICovCisJdTggUHJpbWFyeVJzbmllOworCUJPT0xFQU4gYk1peENpcGhlciA9IEZBTFNFOwkvKiBpbmRpY2F0ZSB0aGUgcGFpcndpc2UgYW5kIGdyb3VwIGNpcGhlciBhcmUgZGlmZmVyZW50ICovCisJdTggcF9vZmZzZXQ7CisJV1BBX01JWF9QQUlSX0NJUEhFUiBGbGV4aWJsZUNpcGhlciA9IFdQQV9US0lQQUVTX1dQQTJfVEtJUEFFUzsJLyogaXQgcHJvdmlkZSB0aGUgbW9yZSBmbGV4aWJsZSBjaXBoZXIgY29tYmluYXRpb24gaW4gV1BBLVdQQTIgYW5kIFRLSVBBRVMgbW9kZSAqLwogCiAJcnNuaWVsZW5fY3VyX3AgPSBOVUxMOwogCXJzbmllbGVuX2V4X2N1cl9wID0gTlVMTDsKIAogCXsKIAkJewotCQkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQotCQkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPQorCQkJICAgIFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpIHsKIAkJCQlpZiAoQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCiAJCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyBTdXBwb3J0IFdQQVBTSyBvciBXUEEyUFNLIGluIFNUQS1JbmZyYSBtb2RlCi0JCQkJLy8gU3VwcG9ydCBXUEFOb25lIGluIFNUQS1BZGhvYyBtb2RlCisJCQl9IGVsc2UgeworCQkJCS8qIFN1cHBvcnQgV1BBUFNLIG9yIFdQQTJQU0sgaW4gU1RBLUluZnJhIG1vZGUgKi8KKwkJCQkvKiBTdXBwb3J0IFdQQU5vbmUgaW4gU1RBLUFkaG9jIG1vZGUgKi8KIAkJCQlpZiAoKEF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKLQkJCQkJKEF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCi0JCQkJCShBdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotCQkJCQkpCisJCQkJICAgIChBdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgorCQkJCSAgICAoQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJCQkgICAgKQogCQkJCQlyZXR1cm47CiAJCQl9CiAKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiPT0+IFJUTVBNYWtlUlNOSUUoU1RBKVxuIikpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFJUTVBNYWtlUlNOSUUoU1RBKVxuIikpOwogCi0JCQkvLyBaZXJvIFJTTklFIGNvbnRleHQKKwkJCS8qIFplcm8gUlNOSUUgY29udGV4dCAqLwogCQkJcEFkLT5TdGFDZmcuUlNOSUVfTGVuID0gMDsKIAkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJTTl9JRSwgTUFYX0xFTl9PRl9SU05JRSk7CiAKLQkJCS8vIFBvaW50ZXIgdG8gUlNOSUUKKwkJCS8qIFBvaW50ZXIgdG8gUlNOSUUgKi8KIAkJCXJzbmllbGVuX2N1cl9wID0gJnBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKIAkJCXBSc25JZSA9IHBBZC0+U3RhQ2ZnLlJTTl9JRTsKIApAQCAtNjU0LDM0ICsxODg0LDM1IEBACiAJCX0KIAl9CiAKLQkvLyBpbmRpY2F0ZSBwcmltYXJ5IFJTTklFIGFzIFdQQSBvciBXUEEyCisJLyogaW5kaWNhdGUgcHJpbWFyeSBSU05JRSBhcyBXUEEgb3IgV1BBMiAqLwogCWlmICgoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAotCQkoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAotCQkoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgfHwKLQkJKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyKSB8fAotCQkoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0spKQorCSAgICAoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorCSAgICAoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgfHwKKwkgICAgKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyKSB8fAorCSAgICAoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0spKQogCQlQcmltYXJ5UnNuaWUgPSBXcGFJZTsKIAllbHNlCiAJCVByaW1hcnlSc25pZSA9IFdwYTJJZTsKIAogCXsKLQkJLy8gQnVpbGQgdGhlIHByaW1hcnkgUlNOSUUKLQkJLy8gMS4gaW5zZXJ0IGNpcGhlciBzdWl0ZQotCQlSVE1QSW5zZXJ0UnNuSWVDaXBoZXIocEFkLCBQcmltYXJ5UnNuaWUsIFdlcFN0YXR1cywgYk1peENpcGhlciwgRmxleGlibGVDaXBoZXIsIHBSc25JZSwgJnBfb2Zmc2V0KTsKKwkJLyogQnVpbGQgdGhlIHByaW1hcnkgUlNOSUUgKi8KKwkJLyogMS4gaW5zZXJ0IGNpcGhlciBzdWl0ZSAqLworCQlSVE1QTWFrZVJzbkllQ2lwaGVyKHBBZCwgUHJpbWFyeVJzbmllLCBXZXBTdGF0dXMsIGJNaXhDaXBoZXIsCisJCQkJICAgIEZsZXhpYmxlQ2lwaGVyLCBwUnNuSWUsICZwX29mZnNldCk7CiAKLQkJLy8gMi4gaW5zZXJ0IEFLTQotCQlSVE1QSW5zZXJ0UnNuSWVBS00ocEFkLCBQcmltYXJ5UnNuaWUsIEF1dGhNb2RlLCBhcGlkeCwgcFJzbkllLCAmcF9vZmZzZXQpOworCQkvKiAyLiBpbnNlcnQgQUtNICovCisJCVJUTVBNYWtlUnNuSWVBS00ocEFkLCBQcmltYXJ5UnNuaWUsIEF1dGhNb2RlLCBhcGlkeCwgcFJzbkllLAorCQkJCSAmcF9vZmZzZXQpOwogCi0JCS8vIDMuIGluc2VydCBjYXBhYmlsaXR5Ci0JCVJUTVBJbnNlcnRSc25JZUNhcChwQWQsIFByaW1hcnlSc25pZSwgYXBpZHgsIHBSc25JZSwgJnBfb2Zmc2V0KTsKKwkJLyogMy4gaW5zZXJ0IGNhcGFiaWxpdHkgKi8KKwkJUlRNUE1ha2VSc25JZUNhcChwQWQsIFByaW1hcnlSc25pZSwgYXBpZHgsIHBSc25JZSwgJnBfb2Zmc2V0KTsKIAl9CiAKLQkvLyA0LiB1cGRhdGUgdGhlIFJTTklFIGxlbmd0aAorCS8qIDQuIHVwZGF0ZSB0aGUgUlNOSUUgbGVuZ3RoICovCiAJKnJzbmllbGVuX2N1cl9wID0gcF9vZmZzZXQ7CiAKIAloZXhfZHVtcCgiVGhlIHByaW1hcnkgUlNOSUUiLCBwUnNuSWUsICgqcnNuaWVsZW5fY3VyX3ApKTsKIAotCiB9CiAKIC8qCkBAIC02OTMsMTQ0ICsxOTI0LDEwOTMgQEAKIAkJcEFkCQkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAogCQlwRW50cnkJCQktCXBvaW50ZXIgdG8gYWN0aXZlIGVudHJ5CiAJCXBEYXRhCQkJLQl0aGUgcmVjZWl2ZWQgZnJhbWUKLQkJRGF0YUJ5dGVDb3VudCAJLQl0aGUgcmVjZWl2ZWQgZnJhbWUncyBsZW5ndGgKKwkJRGF0YUJ5dGVDb3VudAktCXRoZSByZWNlaXZlZCBmcmFtZSdzIGxlbmd0aAogCQlGcm9tV2hpY2hCU1NJRAktCWluZGljYXRlIHRoZSBpbnRlcmZhY2UgaW5kZXgKIAogICAgIFJldHVybjoKLSAgICAgICAgIFRSVUUgCQkJLQlUaGlzIGZyYW1lIGlzIEVBUCBmcmFtZQotICAgICAgICAgRkFMU0UgCQkJLQlvdGhlcndpc2UKKyAgICAgICAgIFRSVUUJCQktCVRoaXMgZnJhbWUgaXMgRUFQIGZyYW1lCisgICAgICAgICBGQUxTRQkJCS0Jb3RoZXJ3aXNlCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1CT09MRUFOIFJUTVBDaGVja1dQQWZyYW1lKAotICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5LAotICAgIElOIFBVQ0hBUiAgICAgICAgICAgcERhdGEsCi0gICAgSU4gVUxPTkcgICAgICAgICAgICBEYXRhQnl0ZUNvdW50LAotCUlOIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCitCT09MRUFOIFJUTVBDaGVja1dQQWZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LAorCQkJICB1OCAqcERhdGEsCisJCQkgIHVuc2lnbmVkIGxvbmcgRGF0YUJ5dGVDb3VudCwgdTggRnJvbVdoaWNoQlNTSUQpCiB7Ci0JVUxPTkcJQm9keV9sZW47CisJdW5zaWduZWQgbG9uZyBCb2R5X2xlbjsKIAlCT09MRUFOIENhbmNlbGxlZDsKIAorCWlmIChEYXRhQnl0ZUNvdW50IDwgKExFTkdUSF84MDJfMV9IICsgTEVOR1RIX0VBUE9MX0gpKQorCQlyZXR1cm4gRkFMU0U7CiAKLSAgICBpZihEYXRhQnl0ZUNvdW50IDwgKExFTkdUSF84MDJfMV9IICsgTEVOR1RIX0VBUE9MX0gpKQotICAgICAgICByZXR1cm4gRkFMU0U7CisJLyogU2tpcCBMTEMgaGVhZGVyICovCisJaWYgKE5kaXNFcXVhbE1lbW9yeShTTkFQXzgwMl8xSCwgcERhdGEsIDYpIHx8CisJICAgIC8qIENpc2NvIDEyMDAgQVAgbWF5IHNlbmQgcGFja2V0IHdpdGggU05BUF9CUklER0VfVFVOTkVMICovCisJICAgIE5kaXNFcXVhbE1lbW9yeShTTkFQX0JSSURHRV9UVU5ORUwsIHBEYXRhLCA2KSkgeworCQlwRGF0YSArPSA2OworCX0KKwkvKiBTa2lwIDItYnl0ZXMgRUFQb0wgdHlwZSAqLworCWlmIChOZGlzRXF1YWxNZW1vcnkoRUFQT0wsIHBEYXRhLCAyKSkgeworCQlwRGF0YSArPSAyOworCX0gZWxzZQorCQlyZXR1cm4gRkFMU0U7CiAKKwlzd2l0Y2ggKCoocERhdGEgKyAxKSkgeworCWNhc2UgRUFQUGFja2V0OgorCQlCb2R5X2xlbiA9ICgqKHBEYXRhICsgMikgPDwgOCkgfCAoKihwRGF0YSArIDMpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJSZWNlaXZlIEVBUC1QYWNrZXQgZnJhbWUsIFRZUEUgPSAwLCBMZW5ndGggPSAlbGRcbiIsCisJCQkgIEJvZHlfbGVuKSk7CisJCWJyZWFrOworCWNhc2UgRUFQT0xTdGFydDoKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJSZWNlaXZlIEVBUE9MLVN0YXJ0IGZyYW1lLCBUWVBFID0gMSBcbiIpKTsKKwkJaWYgKHBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgIT0KKwkJICAgIEVBUE9MX1NUQVJUX0RJU0FCTEUpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkNhbmNlbCB0aGUgRW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgXG4iKSk7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBFbnRyeS0+RW5xdWV1ZVN0YXJ0Rm9yUFNLVGltZXIsCisJCQkJCSZDYW5jZWxsZWQpOworCQkJcEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyA9CisJCQkgICAgRUFQT0xfU1RBUlRfRElTQUJMRTsKKwkJfQorCQlicmVhazsKKwljYXNlIEVBUE9MTG9nb2ZmOgorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlJlY2VpdmUgRUFQT0xMb2dvZmYgZnJhbWUsIFRZUEUgPSAyIFxuIikpOworCQlicmVhazsKKwljYXNlIEVBUE9MS2V5OgorCQlCb2R5X2xlbiA9ICgqKHBEYXRhICsgMikgPDwgOCkgfCAoKihwRGF0YSArIDMpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJSZWNlaXZlIEVBUE9MLUtleSBmcmFtZSwgVFlQRSA9IDMsIExlbmd0aCA9ICVsZFxuIiwKKwkJCSAgQm9keV9sZW4pKTsKKwkJYnJlYWs7CisJY2FzZSBFQVBPTEFTRkFsZXJ0OgorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlJlY2VpdmUgRUFQT0xBU0ZBbGVydCBmcmFtZSwgVFlQRSA9IDQgXG4iKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBGQUxTRTsKIAotCS8vIFNraXAgTExDIGhlYWRlcgotICAgIGlmIChOZGlzRXF1YWxNZW1vcnkoU05BUF84MDJfMUgsIHBEYXRhLCA2KSB8fAotICAgICAgICAvLyBDaXNjbyAxMjAwIEFQIG1heSBzZW5kIHBhY2tldCB3aXRoIFNOQVBfQlJJREdFX1RVTk5FTAotICAgICAgICBOZGlzRXF1YWxNZW1vcnkoU05BUF9CUklER0VfVFVOTkVMLCBwRGF0YSwgNikpCi0gICAgewotICAgICAgICBwRGF0YSArPSA2OwotICAgIH0KLQkvLyBTa2lwIDItYnl0ZXMgRUFQb0wgdHlwZQotICAgIGlmIChOZGlzRXF1YWxNZW1vcnkoRUFQT0wsIHBEYXRhLCAyKSkKLSAgICB7Ci0gICAgICAgIHBEYXRhICs9IDI7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIEZBTFNFOworCX0KKwlyZXR1cm4gVFJVRTsKK30KIAotICAgIHN3aXRjaCAoKihwRGF0YSsxKSkKLSAgICB7Ci0gICAgICAgIGNhc2UgRUFQUGFja2V0OgotCQkJQm9keV9sZW4gPSAoKihwRGF0YSsyKTw8OCkgfCAoKihwRGF0YSszKSk7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUC1QYWNrZXQgZnJhbWUsIFRZUEUgPSAwLCBMZW5ndGggPSAlbGRcbiIsIEJvZHlfbGVuKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFQVBPTFN0YXJ0OgotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTC1TdGFydCBmcmFtZSwgVFlQRSA9IDEgXG4iKSk7Ci0JCQlpZiAocEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyAhPSBFQVBPTF9TVEFSVF9ESVNBQkxFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNhbmNlbCB0aGUgRW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgXG4iKSk7Ci0gICAgICAgICAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwRW50cnktPkVucXVldWVTdGFydEZvclBTS1RpbWVyLCAmQ2FuY2VsbGVkKTsKLSAgICAgICAgICAgICAgICBwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nID0gRUFQT0xfU1RBUlRfRElTQUJMRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVBUE9MTG9nb2ZmOgotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTExvZ29mZiBmcmFtZSwgVFlQRSA9IDIgXG4iKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFQVBPTEtleToKLQkJCUJvZHlfbGVuID0gKCoocERhdGErMik8PDgpIHwgKCoocERhdGErMykpOwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTC1LZXkgZnJhbWUsIFRZUEUgPSAzLCBMZW5ndGggPSAlbGRcbiIsIEJvZHlfbGVuKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFQVBPTEFTRkFsZXJ0OgotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTEFTRkFsZXJ0IGZyYW1lLCBUWVBFID0gNCBcbiIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCQlSZXBvcnQgdGhlIEVBUCBtZXNzYWdlIHR5cGUKIAotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKwlBcmd1bWVudHM6CisJCW1zZwkJLQlFQVBPTF9QQUlSX01TR18xCisJCQkJCUVBUE9MX1BBSVJfTVNHXzIKKwkJCQkJRUFQT0xfUEFJUl9NU0dfMworCQkJCQlFQVBPTF9QQUlSX01TR180CisJCQkJCUVBUE9MX0dST1VQX01TR18xCisJCQkJCUVBUE9MX0dST1VQX01TR18yCisKKyAgICBSZXR1cm46CisgICAgICAgICBtZXNzYWdlIHR5cGUgc3RyaW5nCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2NoYXIgKkdldEVhcG9sTXNnVHlwZShjaGFyIG1zZykKK3sKKwlpZiAobXNnID09IEVBUE9MX1BBSVJfTVNHXzEpCisJCXJldHVybiAiUGFpcndpc2UgTWVzc2FnZSAxIjsKKwllbHNlIGlmIChtc2cgPT0gRUFQT0xfUEFJUl9NU0dfMikKKwkJcmV0dXJuICJQYWlyd2lzZSBNZXNzYWdlIDIiOworCWVsc2UgaWYgKG1zZyA9PSBFQVBPTF9QQUlSX01TR18zKQorCQlyZXR1cm4gIlBhaXJ3aXNlIE1lc3NhZ2UgMyI7CisJZWxzZSBpZiAobXNnID09IEVBUE9MX1BBSVJfTVNHXzQpCisJCXJldHVybiAiUGFpcndpc2UgTWVzc2FnZSA0IjsKKwllbHNlIGlmIChtc2cgPT0gRUFQT0xfR1JPVVBfTVNHXzEpCisJCXJldHVybiAiR3JvdXAgTWVzc2FnZSAxIjsKKwllbHNlIGlmIChtc2cgPT0gRUFQT0xfR1JPVVBfTVNHXzIpCisJCXJldHVybiAiR3JvdXAgTWVzc2FnZSAyIjsKKwllbHNlCisJCXJldHVybiAiSW52YWxpZCBNZXNzYWdlIjsKIH0KIAogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCU1pc2MgZnVuY3Rpb24gdG8gZGVjcnlwdCBBRVMgYm9keQorICAgIENoZWNrIFNhbml0eSBSU04gSUUgb2YgRUFQb0wgbWVzc2FnZQorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSVE1QQ2hlY2tSU05JRShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICB1OCAqcERhdGEsCisJCSAgICAgICB1OCBEYXRhTGVuLAorCQkgICAgICAgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LCB1OCAqIE9mZnNldCkKK3sKKwl1OCAqcFZJRTsKKwl1OCBsZW47CisJc3RydWN0IHJ0X2VpZCAqIHBFaWQ7CisJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKKworCXBWSUUgPSBwRGF0YTsKKwlsZW4gPSBEYXRhTGVuOworCSpPZmZzZXQgPSAwOworCisJd2hpbGUgKGxlbiA+IHNpemVvZihzdHJ1Y3QgcnRfcnNuaWUyKSkgeworCQlwRWlkID0gKHN0cnVjdCBydF9laWQgKikgcFZJRTsKKwkJLyogV1BBIFJTTiBJRSAqLworCQlpZiAoKHBFaWQtPkVpZCA9PSBJRV9XUEEpCisJCSAgICAmJiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXUEFfT1VJLCA0KSkpIHsKKwkJCWlmICgocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEKKwkJCSAgICAgfHwgcEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spCisJCQkgICAgJiYKKwkJCSAgICAoTmRpc0VxdWFsTWVtb3J5CisJCQkgICAgIChwVklFLCBwRW50cnktPlJTTl9JRSwgcEVudHJ5LT5SU05JRV9MZW4pKQorCQkJICAgICYmIChwRW50cnktPlJTTklFX0xlbiA9PSAocEVpZC0+TGVuICsgMikpKSB7CisJCQkJcmVzdWx0ID0gVFJVRTsKKwkJCX0KKworCQkJKk9mZnNldCArPSAocEVpZC0+TGVuICsgMik7CisJCX0KKwkJLyogV1BBMiBSU04gSUUgKi8KKwkJZWxzZSBpZiAoKHBFaWQtPkVpZCA9PSBJRV9SU04pCisJCQkgJiYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCArIDIsIFJTTl9PVUksIDMpKSkgeworCQkJaWYgKChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIKKwkJCSAgICAgfHwgcEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorCQkJICAgICYmIChwRWlkLT5FaWQgPT0gcEVudHJ5LT5SU05fSUVbMF0pCisJCQkgICAgJiYgKChwRWlkLT5MZW4gKyAyKSA+PSBwRW50cnktPlJTTklFX0xlbikKKwkJCSAgICAmJgorCQkJICAgIChOZGlzRXF1YWxNZW1vcnkKKwkJCSAgICAgKHBFaWQtPk9jdGV0LCAmcEVudHJ5LT5SU05fSUVbMl0sCisJCQkgICAgICBwRW50cnktPlJTTklFX0xlbiAtIDIpKSkgeworCisJCQkJcmVzdWx0ID0gVFJVRTsKKwkJCX0KKworCQkJKk9mZnNldCArPSAocEVpZC0+TGVuICsgMik7CisJCX0gZWxzZSB7CisJCQlicmVhazsKKwkJfQorCisJCXBWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworCQlsZW4gLT0gKHBFaWQtPkxlbiArIDIpOworCX0KKworCXJldHVybiByZXN1bHQ7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgUGFyc2UgS0VZREFUQSBmaWVsZC4gIEtFWURBVEFbXSBNYXkgY29udGFpbiAyIFJTTiBJRSBhbmQgb3B0aW9uYWxseSBHVEsuCisgICAgR1RLICBpcyBlbmNhcHR1bGF0ZWQgaW4gS0RFIGZvcm1hdCBhdCAgcC44MyA4MDIuMTFpIEQxMAogCiAJQXJndW1lbnRzOgogCiAJUmV0dXJuIFZhbHVlOgogCiAJTm90ZToKLQkJVGhpcyBmdW5jdGlvbiByZWZlcmVuY2VzIHRvCVJGQwkzMzk0IGZvciBhZXMga2V5IHVud3JhcCBhbGdvcml0aG0uCisgICAgICAgIDgwMi4xMWkgRDEwCiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECUFFU19HVEtfS0VZX1VOV1JBUCgKLQlJTglVQ0hBUgkqa2V5LAotCU9VVAlVQ0hBUgkqcGxhaW50ZXh0LAotCUlOCVVDSEFSICAgIGNfbGVuLAotCUlOCVVDSEFSCSpjaXBoZXJ0ZXh0KQotCitCT09MRUFOIFJUTVBQYXJzZUVhcG9sS2V5RGF0YShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICB1OCAqcEtleURhdGEsCisJCQkgICAgICB1OCBLZXlEYXRhTGVuLAorCQkJICAgICAgdTggR3JvdXBLZXlJbmRleCwKKwkJCSAgICAgIHU4IE1zZ1R5cGUsCisJCQkgICAgICBJTiBCT09MRUFOIGJXUEEyLCBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkpCiB7Ci0JVUNIQVIgICAgICAgQVs4XSwgQklOWzE2XSwgQk9VVFsxNl07Ci0JVUNIQVIgICAgICAgeG9yOwotCUlOVCAgICAgICAgIGksIGo7Ci0JYWVzX2NvbnRleHQgYWVzY3R4OwotCVVDSEFSICAgICAgICpSOwotCUlOVCAgICAgICAgIG51bV9ibG9ja3MgPSBjX2xlbi84OwkvLyB1bml0OjY0Yml0cworCXN0cnVjdCBydF9rZGVfZW5jYXAgKiBwS0RFID0gTlVMTDsKKwl1OCAqcE15S2V5RGF0YSA9IHBLZXlEYXRhOworCXU4IEtleURhdGFMZW5ndGggPSBLZXlEYXRhTGVuOworCXU4IEdUS0xFTiA9IDA7CisJdTggRGVmYXVsdElkeCA9IDA7CisJdTggc2tpcF9vZmZzZXQ7CiAKKwkvKiBWZXJpZnkgVGhlIFJTTiBJRSBjb250YWluZWQgaW4gcGFpcmV3aXNlX21zZ18yICYmIHBhaXJld2lzZV9tc2dfMyBhbmQgc2tpcCBpdCAqLworCWlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzIgfHwgTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKSB7CisJCS8qIENoZWNrIFJTTiBJRSB3aGV0aGVyIGl0IGlzIFdQQTIvV1BBMlBTSyAqLworCQlpZiAoIVJUTVBDaGVja1JTTklFCisJCSAgICAocEFkLCBwS2V5RGF0YSwgS2V5RGF0YUxlbiwgcEVudHJ5LCAmc2tpcF9vZmZzZXQpKSB7CisJCQkvKiBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIFJTTiBJRSBkaWZmZXJlbnQgKi8KKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLAorCQkJCQkJICAgICAgSVdfUlNOSUVfRElGRl9FVkVOVF9GTEFHLAorCQkJCQkJICAgICAgcEVudHJ5LT5BZGRyLAorCQkJCQkJICAgICAgcEVudHJ5LT5hcGlkeCwgMCk7CiAKLQlvc19hbGxvY19tZW0oTlVMTCwgKFBVQ0hBUiAqKSZSLCA1MTIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiUlNOX0lFIERpZmZlcmVudCBpbiBtc2cgJWQgb2YgNC13YXkgaGFuZHNoYWtlIVxuIiwKKwkJCQkgIE1zZ1R5cGUpKTsKKwkJCWhleF9kdW1wKCJSZWNlaXZlIFJTTl9JRSAiLCBwS2V5RGF0YSwgS2V5RGF0YUxlbik7CisJCQloZXhfZHVtcCgiRGVzaXJlZCBSU05fSUUgIiwgcEVudHJ5LT5SU05fSUUsCisJCQkJIHBFbnRyeS0+UlNOSUVfTGVuKTsKIAotCWlmIChSID09IE5VTEwpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIhISFBRVNfR1RLX0tFWV9VTldSQVA6IG5vIG1lbW9yeSEhIVxuIikpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KKwkJCXJldHVybiBGQUxTRTsKKwkJfSBlbHNlIHsKKwkJCWlmIChiV1BBMiAmJiBNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpIHsKKwkJCQlXcGFTaG93QWxsc3VpdGUocE15S2V5RGF0YSwgc2tpcF9vZmZzZXQpOwogCi0JLy8gSW5pdGlhbGl6ZQotCU5kaXNNb3ZlTWVtb3J5KEEsIGNpcGhlcnRleHQsIDgpOwotCS8vSW5wdXQgcGxhaW50ZXh0Ci0JZm9yKGkgPSAwOyBpIDwgKGNfbGVuLTgpOyBpKyspCi0JewotCQlSWyBpXSA9IGNpcGhlcnRleHRbaSArIDhdOwotCX0KLQotCXJ0bXBfYWVzX3NldF9rZXkoJmFlc2N0eCwga2V5LCAxMjgpOwotCi0JZm9yKGogPSA1OyBqID49IDA7IGotLSkKLQl7Ci0JCWZvcihpID0gKG51bV9ibG9ja3MtMSk7IGkgPiAwOyBpLS0pCi0JCXsKLQkJCXhvciA9IChudW1fYmxvY2tzIC0xICkqIGogKyBpOwotCQkJTmRpc01vdmVNZW1vcnkoQklOLCBBLCA4KTsKLQkJCUJJTls3XSA9IEFbN10gXiB4b3I7Ci0JCQlOZGlzTW92ZU1lbW9yeSgmQklOWzhdLCAmUlsoaS0xKSo4XSwgOCk7Ci0JCQlydG1wX2Flc19kZWNyeXB0KCZhZXNjdHgsIEJJTiwgQk9VVCk7Ci0JCQlOZGlzTW92ZU1lbW9yeShBLCAmQk9VVFswXSwgOCk7Ci0JCQlOZGlzTW92ZU1lbW9yeSgmUlsoaS0xKSo4XSwgJkJPVVRbOF0sIDgpOworCQkJCS8qIHNraXAgUlNOIElFICovCisJCQkJcE15S2V5RGF0YSArPSBza2lwX29mZnNldDsKKwkJCQlLZXlEYXRhTGVuZ3RoIC09IHNraXBfb2Zmc2V0OworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJSVE1QUGFyc2VFYXBvbEtleURhdGEgPT0+IFdQQTIvV1BBMlBTSyBSU04gSUUgbWF0Y2hlZCBpbiBNc2cgMywgTGVuZ3RoKCVkKSBcbiIsCisJCQkJCSAgc2tpcF9vZmZzZXQpKTsKKwkJCX0gZWxzZQorCQkJCXJldHVybiBUUlVFOwogCQl9CiAJfQogCi0JLy8gT1VUUFVUCi0JZm9yKGkgPSAwOyBpIDwgY19sZW47IGkrKykKLQl7Ci0JCXBsYWludGV4dFtpXSA9IFJbaV07CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIlJUTVBQYXJzZUVhcG9sS2V5RGF0YSA9PT4gS2V5RGF0YUxlbmd0aCAlZCB3aXRob3V0IFJTTl9JRSBcbiIsCisJCSAgS2V5RGF0YUxlbmd0aCkpOworCS8qaGV4X2R1bXAoInJlbWFpbiBkYXRhIiwgcE15S2V5RGF0YSwgS2V5RGF0YUxlbmd0aCk7ICovCisKKwkvKiBQYXJzZSBFS0QgZm9ybWF0IGluIHBhaXJ3aXNlX21zZ18zX1dQQTIgJiYgZ3JvdXBfbXNnXzFfV1BBMiAqLworCWlmIChiV1BBMgorCSAgICAmJiAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zIHx8IE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKSB7CisJCWlmIChLZXlEYXRhTGVuZ3RoID49IDgpCS8qIEtERSBmb3JtYXQgZXhjbHVkZSBHVEsgbGVuZ3RoICovCisJCXsKKwkJCXBLREUgPSAoc3RydWN0IHJ0X2tkZV9lbmNhcCAqKSBwTXlLZXlEYXRhOworCisJCQlEZWZhdWx0SWR4ID0gcEtERS0+R1RLRW5jYXAuS2lkOworCisJCQkvKiBTYW5pdHkgY2hlY2sgLSBLRUQgbGVuZ3RoICovCisJCQlpZiAoS2V5RGF0YUxlbmd0aCA8IChwS0RFLT5MZW4gKyAyKSkgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkgKCJFUlJPUjogVGhlIGxlbiBmcm9tIEtERSBpcyB0b28gc2hvcnQgXG4iKSk7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJLyogR2V0IEdUSyBsZW5ndGggLSByZWZlciB0byBJRUVFIDgwMi4xMWktMjAwNCBwLjgyICovCisJCQlHVEtMRU4gPSBwS0RFLT5MZW4gLSA2OworCQkJaWYgKEdUS0xFTiA8IExFTl9BRVNfS0VZKSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJCSAoIkVSUk9SOiBHVEsgS2V5IGxlbmd0aCBpcyB0b28gc2hvcnQgKCVkKSBcbiIsCisJCQkJCSAgR1RLTEVOKSk7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCisJCX0gZWxzZSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCJFUlJPUjogS0RFIGZvcm1hdCBsZW5ndGggaXMgdG9vIHNob3J0IFxuIikpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJHVEsgaW4gS0RFIGZvcm1hdCAsRGVmYXVsdEtleUlEPSVkLCBLZXlMZW49JWQgXG4iLAorCQkJICBEZWZhdWx0SWR4LCBHVEtMRU4pKTsKKwkJLyogc2tpcCBpdCAqLworCQlwTXlLZXlEYXRhICs9IDg7CisJCUtleURhdGFMZW5ndGggLT0gODsKKworCX0gZWxzZSBpZiAoIWJXUEEyICYmIE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpIHsKKwkJRGVmYXVsdElkeCA9IEdyb3VwS2V5SW5kZXg7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiR1RLIERlZmF1bHRLZXlJRD0lZCBcbiIsIERlZmF1bHRJZHgpKTsKKwl9CisJLyogU2FuaXR5IGNoZWNrIC0gc2hhcmVkIGtleSBpbmRleCBtdXN0IGJlIDEgfiAzICovCisJaWYgKERlZmF1bHRJZHggPCAxIHx8IERlZmF1bHRJZHggPiAzKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiRVJST1I6IEdUSyBLZXkgaW5kZXgoJWQpIGlzIGludmFsaWQgaW4gJXMgJXMgXG4iLAorCQkJICBEZWZhdWx0SWR4LCAoKGJXUEEyKSA/ICJXUEEyIiA6ICJXUEEiKSwKKwkJCSAgR2V0RWFwb2xNc2dUeXBlKE1zZ1R5cGUpKSk7CisJCXJldHVybiBGQUxTRTsKIAl9CiAKKwl7CisJCXN0cnVjdCBydF9jaXBoZXJfa2V5ICpwU2hhcmVkS2V5OwogCi0Jb3NfZnJlZV9tZW0oTlVMTCwgUik7CisJCS8qIHNldCBrZXkgbWF0ZXJpYWwsIFR4TWljIGFuZCBSeE1pYyAqLworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5HVEssIHBNeUtleURhdGEsIDMyKTsKKwkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gRGVmYXVsdElkeDsKKworCQlwU2hhcmVkS2V5ID0gJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF07CisKKwkJLyogUHJlcGFyZSBwYWlyLXdpc2Uga2V5IGluZm9ybWF0aW9uIGludG8gc2hhcmVkIGtleSB0YWJsZSAqLworCQlOZGlzWmVyb01lbW9yeShwU2hhcmVkS2V5LCBzaXplb2Yoc3RydWN0IHJ0X2NpcGhlcl9rZXkpKTsKKwkJcFNoYXJlZEtleS0+S2V5TGVuID0gTEVOX1RLSVBfRUs7CisJCU5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPktleSwgcEFkLT5TdGFDZmcuR1RLLCBMRU5fVEtJUF9FSyk7CisJCU5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPlJ4TWljLCAmcEFkLT5TdGFDZmcuR1RLWzE2XSwKKwkJCSAgICAgICBMRU5fVEtJUF9SWE1JQ0spOworCQlOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5UeE1pYywgJnBBZC0+U3RhQ2ZnLkdUS1syNF0sCisJCQkgICAgICAgTEVOX1RLSVBfVFhNSUNLKTsKKworCQkvKiBVcGRhdGUgU2hhcmVkIEtleSBDaXBoZXJBbGcgKi8KKwkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCWlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09CisJCQkgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCkKKwkJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0KKwkJCSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkKQorCQkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKworCQkvKiBVcGRhdGUgZ3JvdXAga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZSAqLworCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorCQkJCSAgICAgIEJTUzAsCisJCQkJICAgICAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorCQkJCSAgICAgIHBTaGFyZWRLZXktPkNpcGhlckFsZywKKwkJCQkgICAgICBwU2hhcmVkS2V5LT5LZXksCisJCQkJICAgICAgcFNoYXJlZEtleS0+VHhNaWMsIHBTaGFyZWRLZXktPlJ4TWljKTsKKworCQkvKiBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgKi8KKwkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisJCQkJCSAgQlNTMCwKKwkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisJCQkJCSAgcFNoYXJlZEtleS0+Q2lwaGVyQWxnLCBOVUxMKTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ29uc3RydWN0IEVBUG9MIG1lc3NhZ2UgZm9yIFdQQSBoYW5kc2hha2luZworCQlJdHMgZm9ybWF0IGlzIGJlbG93LAorCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBQcm90b2NvbCBWZXJzaW9uCSB8ICAxIG9jdGV0CisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBQcm90b2NvbCBUeXBlCQkgfAkxIG9jdGV0CisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBCb2R5IExlbmd0aAkJIHwgIDIgb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBEZXNjcmlwdG9yIFR5cGUJIHwJMSBvY3RldAorCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IEluZm9ybWF0aW9uICAgIHwJMiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBMZW5ndGgJICAgICB8ICAxIG9jdGV0CisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgUmVwYWx5IENvdW50ZXIgfAk4IG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IE5vbmNlCQkgICAgIHwgIDMyIG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IElWCQkJIHwgIDE2IG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IFJTQwkJCSB8ICA4IG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IElEIG9yIFJlc2VydmVkIHwJOCBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBNSUMJCQkgfAkxNiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBEYXRhIExlbmd0aAkgfAkyIG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IERhdGEJCQkgfAluIG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgQ29uc3RydWN0RWFwb2xNc2coc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LAorCQkgICAgICAgdTggR3JvdXBLZXlXZXBTdGF0dXMsCisJCSAgICAgICB1OCBNc2dUeXBlLAorCQkgICAgICAgdTggRGVmYXVsdEtleUlkeCwKKwkJICAgICAgIHU4ICogS2V5Tm9uY2UsCisJCSAgICAgICB1OCAqIFR4UlNDLAorCQkgICAgICAgdTggKiBHVEssCisJCSAgICAgICB1OCAqIFJTTklFLAorCQkgICAgICAgdTggUlNOSUVfTGVuLCBzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0ICogcE1zZykKK3sKKwlCT09MRUFOIGJXUEEyID0gRkFMU0U7CisJdTggS2V5RGVzY1ZlcjsKKworCS8qIENob29zZSBXUEEyIG9yIG5vdCAqLworCWlmICgocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAorCSAgICAocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwkJYldQQTIgPSBUUlVFOworCisJLyogSW5pdCBQYWNrZXQgYW5kIEZpbGwgaGVhZGVyICovCisJcE1zZy0+UHJvVmVyID0gRUFQT0xfVkVSOworCXBNc2ctPlByb1R5cGUgPSBFQVBPTEtleTsKKworCS8qIERlZmF1bHQgOTUgYnl0ZXMsIHRoZSBFQVBvTC1LZXkgZGVzY3JpcHRvciBleGNsdWRlIEtleS1kYXRhIGZpZWxkICovCisJU0VUX3UxNl9UT19BUlJBUlkocE1zZy0+Qm9keV9MZW4sIExFTl9FQVBPTF9LRVlfTVNHKTsKKworCS8qIEZpbGwgaW4gRUFQb0wgZGVzY3JpcHRvciAqLworCWlmIChiV1BBMikKKwkJcE1zZy0+S2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKKwllbHNlCisJCXBNc2ctPktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7CisKKwkvKiBLZXkgRGVzY3JpcHRvciBWZXJzaW9uIChiaXRzIDAtMikgc3BlY2lmaWVzIHRoZSBrZXkgZGVzY3JpcHRvciB2ZXJzaW9uIHR5cGUgKi8KKwl7CisJCS8qIEZpbGwgaW4gS2V5IGluZm9ybWF0aW9uLCByZWZlciB0byBJRUVFIFN0ZCA4MDIuMTFpLTIwMDQgcGFnZSA3OCAqLworCQkvKiBXaGVuIGVpdGhlciB0aGUgcGFpcndpc2Ugb3IgdGhlIGdyb3VwIGNpcGhlciBpcyBBRVMsIHRoZSBERVNDX1RZUEVfQUVTKDIpIHNoYWxsIGJlIHVzZWQuICovCisJCUtleURlc2NWZXIgPQorCQkgICAgKCgocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJICAgICAgfHwgKEdyb3VwS2V5V2VwU3RhdHVzID09CisJCQkgIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKSA/IChERVNDX1RZUEVfQUVTKQorCQkgICAgIDogKERFU0NfVFlQRV9US0lQKSk7CisJfQorCisJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSBLZXlEZXNjVmVyOworCisJLyogU3BlY2lmeSBLZXkgVHlwZSBhcyBHcm91cCgwKSBvciBQYWlyd2lzZSgxKSAqLworCWlmIChNc2dUeXBlID49IEVBUE9MX0dST1VQX01TR18xKQorCQlwTXNnLT5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IEdST1VQS0VZOworCWVsc2UKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSBQQUlSV0lTRUtFWTsKKworCS8qIFNwZWNpZnkgS2V5IEluZGV4LCBvbmx5IGdyb3VwX21zZzFfV1BBMSAqLworCWlmICghYldQQTIgJiYgKE1zZ1R5cGUgPj0gRUFQT0xfR1JPVVBfTVNHXzEpKQorCQlwTXNnLT5LZXlEZXNjLktleUluZm8uS2V5SW5kZXggPSBEZWZhdWx0S2V5SWR4OworCisJaWYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLkluc3RhbGwgPSAxOworCisJaWYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEpIHx8IChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCisJICAgIHx8IChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleUFjayA9IDE7CisKKwlpZiAoTXNnVHlwZSAhPSBFQVBPTF9QQUlSX01TR18xKQorCQlwTXNnLT5LZXlEZXNjLktleUluZm8uS2V5TWljID0gMTsKKworCWlmICgoYldQQTIgJiYgKE1zZ1R5cGUgPj0gRUFQT0xfUEFJUl9NU0dfMykpIHx8CisJICAgICghYldQQTIgJiYgKE1zZ1R5cGUgPj0gRUFQT0xfR1JPVVBfTVNHXzEpKSkgeworCQlwTXNnLT5LZXlEZXNjLktleUluZm8uU2VjdXJlID0gMTsKKwl9CisKKwlpZiAoYldQQTIgJiYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpIHx8CisJCSAgICAgIChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkpIHsKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLkVLRF9ETCA9IDE7CisJfQorCS8qIGtleSBJbmZvcm1hdGlvbiBlbGVtZW50IGhhcyBkb25lLiAqLworCSoodTE2ICopICgmcE1zZy0+S2V5RGVzYy5LZXlJbmZvKSA9CisJICAgIGNwdTJsZTE2KCoodTE2ICopICgmcE1zZy0+S2V5RGVzYy5LZXlJbmZvKSk7CisKKwkvKiBGaWxsIGluIEtleSBMZW5ndGggKi8KKwl7CisJCWlmIChNc2dUeXBlID49IEVBUE9MX0dST1VQX01TR18xKSB7CisJCQkvKiB0aGUgbGVuZ3RoIG9mIGdyb3VwIGtleSBjaXBoZXIgKi8KKwkJCXBNc2ctPktleURlc2MuS2V5TGVuZ3RoWzFdID0KKwkJCSAgICAoKEdyb3VwS2V5V2VwU3RhdHVzID09CisJCQkgICAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSA/IFRLSVBfR1RLX0xFTkdUSCA6CisJCQkgICAgIExFTl9BRVNfS0VZKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHRoZSBsZW5ndGggb2YgcGFpcndpc2Uga2V5IGNpcGhlciAqLworCQkJcE1zZy0+S2V5RGVzYy5LZXlMZW5ndGhbMV0gPQorCQkJICAgICgocEVudHJ5LT5XZXBTdGF0dXMgPT0KKwkJCSAgICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpID8gTEVOX1RLSVBfS0VZIDoKKwkJCSAgICAgTEVOX0FFU19LRVkpOworCQl9CisJfQorCisJLyogRmlsbCBpbiByZXBsYXkgY291bnRlciAqLworCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuUmVwbGF5Q291bnRlciwgcEVudHJ5LT5SX0NvdW50ZXIsCisJCSAgICAgICBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8qIEZpbGwgS2V5IE5vbmNlIGZpZWxkICovCisJLyogQU5vbmNlIDogcGFpcndpc2VfbXNnMSAmIHBhaXJ3aXNlX21zZzMgKi8KKwkvKiBTTm9uY2UgOiBwYWlyd2lzZV9tc2cyICovCisJLyogR05vbmNlIDogZ3JvdXBfbXNnMV93cGExICovCisJaWYgKChNc2dUeXBlIDw9IEVBUE9MX1BBSVJfTVNHXzMpCisJICAgIHx8ICgoIWJXUEEyICYmIChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkpKQorCQlOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLktleU5vbmNlLCBLZXlOb25jZSwKKwkJCSAgICAgICBMRU5fS0VZX0RFU0NfTk9OQ0UpOworCisJLyogRmlsbCBrZXkgSVYgLSBXUEEyIGFzIDAsIFdQQTEgYXMgcmFuZG9tICovCisJaWYgKCFiV1BBMiAmJiAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpIHsKKwkJLyogU3VnZ2VzdCBJViBiZSByYW5kb20gbnVtYmVyIHBsdXMgc29tZSBudW1iZXIsICovCisJCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5SXYsICZLZXlOb25jZVsxNl0sCisJCQkgICAgICAgTEVOX0tFWV9ERVNDX0lWKTsKKwkJcE1zZy0+S2V5RGVzYy5LZXlJdlsxNV0gKz0gMjsKKwl9CisJLyogRmlsbCBLZXkgUlNDIGZpZWxkICovCisJLyogSXQgY29udGFpbnMgdGhlIFJTQyBmb3IgdGhlIEdUSyBiZWluZyBpbnN0YWxsZWQuICovCisJaWYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgJiYgYldQQTIpCisJICAgIHx8IChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkgeworCQlOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLktleVJzYywgVHhSU0MsIDYpOworCX0KKwkvKiBDbGVhciBLZXkgTUlDIGZpZWxkIGZvciBNSUMgY2FsY3VsYXRpb24gbGF0ZXIgKi8KKwlOZGlzWmVyb01lbW9yeShwTXNnLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwlDb25zdHJ1Y3RFYXBvbEtleURhdGEocEVudHJ5LAorCQkJICAgICAgR3JvdXBLZXlXZXBTdGF0dXMsCisJCQkgICAgICBLZXlEZXNjVmVyLAorCQkJICAgICAgTXNnVHlwZSwKKwkJCSAgICAgIERlZmF1bHRLZXlJZHgsIEdUSywgUlNOSUUsIFJTTklFX0xlbiwgcE1zZyk7CisKKwkvKiBDYWxjdWxhdGUgTUlDIGFuZCBmaWxsIGluIEtleU1pYyBGaWVsZCBleGNlcHQgUGFpcndpc2UgTXNnIDEuICovCisJaWYgKE1zZ1R5cGUgIT0gRUFQT0xfUEFJUl9NU0dfMSkgeworCQlDYWxjdWxhdGVNSUMoS2V5RGVzY1ZlciwgcEVudHJ5LT5QVEssIHBNc2cpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCI9PT0+IENvbnN0cnVjdEVhcG9sTXNnIGZvciAlcyAlc1xuIiwKKwkJICAoKGJXUEEyKSA/ICJXUEEyIiA6ICJXUEEiKSwgR2V0RWFwb2xNc2dUeXBlKE1zZ1R5cGUpKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIgkgICAgIEJvZHkgbGVuZ3RoID0gJWQgXG4iLAorCQkgIENPTlZfQVJSQVJZX1RPX3UxNihwTXNnLT5Cb2R5X0xlbikpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiCSAgICAgS2V5IGxlbmd0aCAgPSAlZCBcbiIsCisJCSAgQ09OVl9BUlJBUllfVE9fdTE2KHBNc2ctPktleURlc2MuS2V5TGVuZ3RoKSkpOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDb25zdHJ1Y3QgdGhlIEtleSBEYXRhIGZpZWxkIG9mIEVBUG9MIG1lc3NhZ2UKKworCUFyZ3VtZW50czoKKwkJcEFkCQkJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgorCQlFbGVtCQlNZXNzYWdlIGJvZHkKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgQ29uc3RydWN0RWFwb2xLZXlEYXRhKHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwKKwkJCSAgIHU4IEdyb3VwS2V5V2VwU3RhdHVzLAorCQkJICAgdTgga2V5RGVzY1ZlciwKKwkJCSAgIHU4IE1zZ1R5cGUsCisJCQkgICB1OCBEZWZhdWx0S2V5SWR4LAorCQkJICAgdTggKiBHVEssCisJCQkgICB1OCAqIFJTTklFLAorCQkJICAgdTggUlNOSUVfTEVOLCBzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0ICogcE1zZykKK3sKKwl1OCAqbXBvb2wsICpLZXlfRGF0YSwgKlJjNEdUSzsKKwl1OCBla2V5WyhMRU5fS0VZX0RFU0NfSVYgKyBMRU5fRUFQX0VLKV07CisJdW5zaWduZWQgbG9uZyBkYXRhX29mZnNldDsKKwlCT09MRUFOIGJXUEEyQ2FwYWJsZSA9IEZBTFNFOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IHBFbnRyeS0+cEFkOworCUJPT0xFQU4gR1RLX0luY2x1ZGVkID0gRkFMU0U7CisKKwkvKiBDaG9vc2UgV1BBMiBvciBub3QgKi8KKwlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKKwkgICAgKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCWJXUEEyQ2FwYWJsZSA9IFRSVUU7CisKKwlpZiAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xIHx8CisJICAgIE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfNCB8fCBNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18yKQorCQlyZXR1cm47CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgcG9vbCAqLworCW9zX2FsbG9jX21lbShOVUxMLCAodTggKiopICYgbXBvb2wsIDE1MDApOworCisJaWYgKG1wb29sID09IE5VTEwpCisJCXJldHVybjsKKworCS8qIFJjNEdUSyBMZW4gPSA1MTIgKi8KKwlSYzRHVEsgPSAodTggKikgUk9VTkRfVVAobXBvb2wsIDQpOworCS8qIEtleV9EYXRhIExlbiA9IDUxMiAqLworCUtleV9EYXRhID0gKHU4ICopIFJPVU5EX1VQKFJjNEdUSyArIDUxMiwgNCk7CisKKwlOZGlzWmVyb01lbW9yeShLZXlfRGF0YSwgNTEyKTsKKwlTRVRfdTE2X1RPX0FSUkFSWShwTXNnLT5LZXlEZXNjLktleURhdGFMZW4sIDApOworCWRhdGFfb2Zmc2V0ID0gMDsKKworCS8qIEVuY2Fwc3VsYXRlIFJTTklFIGluIHBhaXJ3aXNlX21zZzIgJiBwYWlyd2lzZV9tc2czICovCisJaWYgKFJTTklFX0xFTgorCSAgICAmJiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMikKKwkJfHwgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykpKSB7CisJCXU4ICpwbWtpZF9wdHIgPSBOVUxMOworCQl1OCBwbWtpZF9sZW4gPSAwOworCisJCVJUTVBJbnNlcnRSU05JRSgmS2V5X0RhdGFbZGF0YV9vZmZzZXRdLAorCQkJCSZkYXRhX29mZnNldCwKKwkJCQlSU05JRSwgUlNOSUVfTEVOLCBwbWtpZF9wdHIsIHBta2lkX2xlbik7CisJfQorCisJLyogRW5jYXBzdWxhdGUgS0RFIGZvcm1hdCBpbiBwYWlyd2lzZV9tc2czX1dQQTIgJiBncm91cF9tc2cxX1dQQTIgKi8KKwlpZiAoYldQQTJDYXBhYmxlCisJICAgICYmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQorCQl8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpKSB7CisJCS8qIEtleSBEYXRhIEVuY2Fwc3VsYXRpb24gKEtERSkgZm9ybWF0IC0gODAyLjExaS0yMDA0ICBGaWd1cmUtNDN3IGFuZCBUYWJsZS0yMGggKi8KKwkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAwXSA9IDB4REQ7CisKKwkJaWYgKEdyb3VwS2V5V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpIHsKKwkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMV0gPSAweDE2OwkvKiA0KzIrMTYoT1VJK0RhdGFUeXBlK0RhdGFGaWVsZCkgKi8KKwkJfSBlbHNlIHsKKwkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMV0gPSAweDI2OwkvKiA0KzIrMzIoT1VJK0RhdGFUeXBlK0RhdGFGaWVsZCkgKi8KKwkJfQorCisJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMl0gPSAweDAwOworCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDNdID0gMHgwRjsKKwkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyA0XSA9IDB4QUM7CisJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgNV0gPSAweDAxOworCisJCS8qIEdUSyBLREUgZm9ybWF0IC0gODAyLjExaS0yMDA0ICBGaWd1cmUtNDN4ICovCisJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgNl0gPSAoRGVmYXVsdEtleUlkeCAmIDB4MDMpOworCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDddID0gMHgwMDsJLyogUmVzZXJ2ZWQgQnl0ZSAqLworCisJCWRhdGFfb2Zmc2V0ICs9IDg7CisJfQorCisJLyogRW5jYXBzdWxhdGUgR1RLICovCisJLyogT25seSBmb3IgcGFpcndpc2VfbXNnM19XUEEyIGFuZCBncm91cF9tc2cxICovCisJaWYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgJiYgYldQQTJDYXBhYmxlKQorCSAgICB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpIHsKKwkJLyogRmlsbCBpbiBHVEsgKi8KKwkJaWYgKEdyb3VwS2V5V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpIHsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZLZXlfRGF0YVtkYXRhX29mZnNldF0sIEdUSywKKwkJCQkgICAgICAgTEVOX0FFU19LRVkpOworCQkJZGF0YV9vZmZzZXQgKz0gTEVOX0FFU19LRVk7CisJCX0gZWxzZSB7CisJCQlOZGlzTW92ZU1lbW9yeSgmS2V5X0RhdGFbZGF0YV9vZmZzZXRdLCBHVEssCisJCQkJICAgICAgIFRLSVBfR1RLX0xFTkdUSCk7CisJCQlkYXRhX29mZnNldCArPSBUS0lQX0dUS19MRU5HVEg7CisJCX0KKworCQlHVEtfSW5jbHVkZWQgPSBUUlVFOworCX0KKworCS8qIFRoaXMgd2hvbGUga2V5LWRhdGEgZmllbGQgc2hhbGwgYmUgZW5jcnlwdGVkIGlmIGEgR1RLIGlzIGluY2x1ZGVkLiAqLworCS8qIEVuY3J5cHQgdGhlIGRhdGEgbWF0ZXJpYWwgaW4ga2V5IGRhdGEgZmllbGQgd2l0aCBLRUsgKi8KKwlpZiAoR1RLX0luY2x1ZGVkKSB7CisJCS8qaGV4X2R1bXAoIkdUS19JbmNsdWRlZCIsIEtleV9EYXRhLCBkYXRhX29mZnNldCk7ICovCisKKwkJaWYgKChrZXlEZXNjVmVyID09IERFU0NfVFlQRV9BRVMpKSB7CisJCQl1OCByZW1haW5kZXIgPSAwOworCQkJdTggcGFkX2xlbiA9IDA7CisKKwkJCS8qIEtleSBEZXNjcmlwdG9yIFZlcnNpb24gMiBvciAzOiBBRVMga2V5IHdyYXAsIGRlZmluZWQgaW4gSUVURiBSRkMgMzM5NCwgKi8KKwkJCS8qIHNoYWxsIGJlIHVzZWQgdG8gZW5jcnlwdCB0aGUgS2V5IERhdGEgZmllbGQgdXNpbmcgdGhlIEtFSyBmaWVsZCBmcm9tICovCisJCQkvKiB0aGUgZGVyaXZlZCBQVEsuICovCisKKwkJCS8qIElmIHRoZSBLZXkgRGF0YSBmaWVsZCB1c2VzIHRoZSBOSVNUIEFFUyBrZXkgd3JhcCwgdGhlbiB0aGUgS2V5IERhdGEgZmllbGQgKi8KKwkJCS8qIHNoYWxsIGJlIHBhZGRlZCBiZWZvcmUgZW5jcnlwdGluZyBpZiB0aGUga2V5IGRhdGEgbGVuZ3RoIGlzIGxlc3MgdGhhbiAxNiAqLworCQkJLyogb2N0ZXRzIG9yIGlmIGl0IGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIFRoZSBwYWRkaW5nIGNvbnNpc3RzIG9mIGFwcGVuZGluZyAqLworCQkJLyogYSBzaW5nbGUgb2N0ZXQgMHhkZCBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgMHgwMCBvY3RldHMuICovCisJCQlpZiAoKHJlbWFpbmRlciA9IGRhdGFfb2Zmc2V0ICYgMHgwNykgIT0gMCkgeworCQkJCWludCBpOworCisJCQkJcGFkX2xlbiA9ICg4IC0gcmVtYWluZGVyKTsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldF0gPSAweEREOworCQkJCWZvciAoaSA9IDE7IGkgPCBwYWRfbGVuOyBpKyspCisJCQkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgaV0gPSAwOworCisJCQkJZGF0YV9vZmZzZXQgKz0gcGFkX2xlbjsKKwkJCX0KKworCQkJQUVTX0dUS19LRVlfV1JBUCgmcEVudHJ5LT5QVEtbMTZdLCBLZXlfRGF0YSwKKwkJCQkJIGRhdGFfb2Zmc2V0LCBSYzRHVEspOworCQkJLyogQUVTIHdyYXAgZnVuY3Rpb24gd2lsbCBncm93IDggYnl0ZXMgaW4gbGVuZ3RoICovCisJCQlkYXRhX29mZnNldCArPSA4OworCQl9IGVsc2UgeworCQkJLyogICAgICBLZXkgRGVzY3JpcHRvciBWZXJzaW9uIDE6IEFSQzQgaXMgdXNlZCB0byBlbmNyeXB0IHRoZSBLZXkgRGF0YSBmaWVsZAorCQkJICAgdXNpbmcgdGhlIEtFSyBmaWVsZCBmcm9tIHRoZSBkZXJpdmVkIFBUSy4gKi8KKworCQkJLyogUFJFUEFSRSBFbmNyeXB0ZWQgICJLZXkgREFUQSIgZmllbGQuICAoRW5jcnlwdCBHVEsgd2l0aCBSQzQsIHVzaW5mIFBUS1sxNl0tPlszMV0gYXMgS2V5LCBJVi1maWVsZCBhcyBJVikgKi8KKwkJCS8qIHB1dCBUeFRzYyBpbiBLZXkgUlNDIGZpZWxkICovCisJCQlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyID0gUFBQSU5JVEZDUzMyOwkvKkluaXQgY3JjMzIuICovCisKKwkJCS8qIGVrZXkgaXMgdGhlIGNvbnRhbmV0aW9uIG9mIElWLWZpZWxkLCBhbmQgUFRLWzE2XS0+UFRLWzMxXSAqLworCQkJTmRpc01vdmVNZW1vcnkoZWtleSwgcE1zZy0+S2V5RGVzYy5LZXlJdiwKKwkJCQkgICAgICAgTEVOX0tFWV9ERVNDX0lWKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZla2V5W0xFTl9LRVlfREVTQ19JVl0sICZwRW50cnktPlBUS1sxNl0sCisJCQkJICAgICAgIExFTl9FQVBfRUspOworCQkJQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIGVrZXksIHNpemVvZihla2V5KSk7CS8qSU5JVCBTQk9YLCBLRVlMRU4rMyhJVikgKi8KKwkJCXBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIgPQorCQkJICAgIFJUTVBfQ0FMQ19GQ1MzMihwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCBLZXlfRGF0YSwKKwkJCQkJICAgIGRhdGFfb2Zmc2V0KTsKKwkJCVdQQUFSQ0ZPVVJfRU5DUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBSYzRHVEssCisJCQkJCSAgIEtleV9EYXRhLCBkYXRhX29mZnNldCk7CisJCX0KKworCQlOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLktleURhdGEsIFJjNEdUSywgZGF0YV9vZmZzZXQpOworCX0gZWxzZSB7CisJCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5RGF0YSwgS2V5X0RhdGEsIGRhdGFfb2Zmc2V0KTsKKwl9CisKKwkvKiBVcGRhdGUga2V5IGRhdGEgbGVuZ3RoIGZpZWxkIGFuZCB0b3RhbCBib2R5IGxlbmd0aCAqLworCVNFVF91MTZfVE9fQVJSQVJZKHBNc2ctPktleURlc2MuS2V5RGF0YUxlbiwgZGF0YV9vZmZzZXQpOworCUlOQ191MTZfVE9fQVJSQVJZKHBNc2ctPkJvZHlfTGVuLCBkYXRhX29mZnNldCk7CisKKwlvc19mcmVlX21lbShOVUxMLCBtcG9vbCk7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNhbGNhdWxhdGUgTUlDLiBJdCBpcyB1c2VkIGR1cmluZyA0LXdheXMgaGFuZHNoYXJraW5nLgorCisJQXJndW1lbnRzOgorCQlwQWQJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKwlQZWVyV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyB2b2lkIENhbGN1bGF0ZU1JQyh1OCBLZXlEZXNjVmVyLAorCQkJIHU4ICogUFRLLCBzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0ICogcE1zZykKK3sKKwl1OCAqT3V0QnVmZmVyOworCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW4gPSAwOworCXU4IG1pY1tMRU5fS0VZX0RFU0NfTUlDXTsKKwl1OCBkaWdlc3RbODBdOworCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBNSUMgY2FsY3VsYXRpb24gKi8KKwlvc19hbGxvY19tZW0oTlVMTCwgKHU4ICoqKSAmIE91dEJ1ZmZlciwgNTEyKTsKKworCWlmIChPdXRCdWZmZXIgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJDYWxjdWxhdGVNSUM6IG5vIG1lbW9yeSFcbiIpKTsKKwkJcmV0dXJuOworCX0KKwkvKiBtYWtlIGEgZnJhbWUgZm9yIGNhbGN1bGF0aW5nIE1JQy4gKi8KKwlNYWtlT3V0Z29pbmdGcmFtZShPdXRCdWZmZXIsICZGcmFtZUxlbiwKKwkJCSAgQ09OVl9BUlJBUllfVE9fdTE2KHBNc2ctPkJvZHlfTGVuKSArIDQsIHBNc2csCisJCQkgIEVORF9PRl9BUkdTKTsKKworCU5kaXNaZXJvTWVtb3J5KG1pYywgc2l6ZW9mKG1pYykpOworCisJLyogQ2FsY3VsYXRlIE1JQyAqLworCWlmIChLZXlEZXNjVmVyID09IERFU0NfVFlQRV9BRVMpIHsKKwkJSE1BQ19TSEExKFBUSywgTEVOX0VBUF9NSUNLLCBPdXRCdWZmZXIsIEZyYW1lTGVuLCBkaWdlc3QsCisJCQkgIFNIQTFfRElHRVNUX1NJWkUpOworCQlOZGlzTW92ZU1lbW9yeShtaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfSBlbHNlIHsKKwkJSE1BQ19NRDUoUFRLLCBMRU5fRUFQX01JQ0ssIE91dEJ1ZmZlciwgRnJhbWVMZW4sIG1pYywKKwkJCSBNRDVfRElHRVNUX1NJWkUpOworCX0KKworCS8qIHN0b3JlIHRoZSBjYWxjdWxhdGVkIE1JQyAqLworCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5TWljLCBtaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisJb3NfZnJlZV9tZW0oTlVMTCwgT3V0QnVmZmVyKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVNvbWUgcmVjZWl2ZWQgZnJhbWVzIGNhbid0IGRlY3J5cHQgYnkgQXNpYywgc28gZGVjcnlwdCB0aGVtIGJ5IHNvZnR3YXJlLgorCisJQXJndW1lbnRzOgorCQlwQWQJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKwlQZWVyV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19TVUNDRVNTCQktCWRlY3J5cHRpb24gc3VjY2Vzc2Z1bAorCQlORElTX1NUQVRVU19GQUlMVVJFCQktCWRlY3J5cHRpb24gZmFpbHVyZQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IFJUTVBTb2Z0RGVjcnlwdEJyb2FkQ2FzdERhdGEoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrLAorCQkJCQkgSU4gTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMKKwkJCQkJIEdyb3VwQ2lwaGVyLCBzdHJ1Y3QgcnRfY2lwaGVyX2tleSAqcFNoYXJkX2tleSkKK3sKKwlzdHJ1Y3QgcnRfcnh3aSAqIHBSeFdJID0gcFJ4QmxrLT5wUnhXSTsKKworCS8qIGhhbmRsZSBXRVAgZGVjcnlwdGlvbiAqLworCWlmIChHcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSB7CisJCWlmIChSVE1QU29mdERlY3J5cHRXRVAKKwkJICAgIChwQWQsIHBSeEJsay0+cERhdGEsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsCisJCSAgICAgcFNoYXJkX2tleSkpIHsKKworCQkJLypNaW51cyBJVls0XSAmIElDVls0XSAqLworCQkJcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCAtPSA4OworCQl9IGVsc2UgeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiRVJST1IgOiBTb2Z0d2FyZSBkZWNyeXB0IFdFUCBkYXRhIGZhaWxzLlxuIikpOworCQkJLyogZ2l2ZSB1cCB0aGlzIGZyYW1lICovCisJCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJfQorCX0KKwkvKiBoYW5kbGUgVEtJUCBkZWNyeXB0aW9uICovCisJZWxzZSBpZiAoR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgeworCQlpZiAoUlRNUFNvZnREZWNyeXB0VEtJUAorCQkgICAgKHBBZCwgcFJ4QmxrLT5wRGF0YSwgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCwgMCwKKwkJICAgICBwU2hhcmRfa2V5KSkgeworCisJCQkvKk1pbnVzIDggYnl0ZXMgTUlDLCA4IGJ5dGVzIElWL0VJViwgNCBieXRlcyBJQ1YgKi8KKwkJCXBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgLT0gMjA7CisJCX0gZWxzZSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCJFUlJPUiA6IFJUTVBTb2Z0RGVjcnlwdFRLSVAgRmFpbGVkXG4iKSk7CisJCQkvKiBnaXZlIHVwIHRoaXMgZnJhbWUgKi8KKwkJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCQl9CisJfQorCS8qIGhhbmRsZSBBRVMgZGVjcnlwdGlvbiAqLworCWVsc2UgaWYgKEdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpIHsKKwkJaWYgKFJUTVBTb2Z0RGVjcnlwdEFFUworCQkgICAgKHBBZCwgcFJ4QmxrLT5wRGF0YSwgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCwKKwkJICAgICBwU2hhcmRfa2V5KSkgeworCisJCQkvKjggYnl0ZXMgTUlDLCA4IGJ5dGVzIElWL0VJViAoQ0NNUCBIZWFkZXIpICovCisJCQlwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50IC09IDE2OworCQl9IGVsc2UgeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiRVJST1IgOiBSVE1QU29mdERlY3J5cHRBRVMgRmFpbGVkXG4iKSk7CisJCQkvKiBnaXZlIHVwIHRoaXMgZnJhbWUgKi8KKwkJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCQl9CisJfSBlbHNlIHsKKwkJLyogZ2l2ZSB1cCB0aGlzIGZyYW1lICovCisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworCit9CisKK3U4ICpHZXRTdWl0ZUZyb21SU05JRSh1OCAqcnNuaWUsCisJCQkgdTMyIHJzbmllX2xlbiwgdTggdHlwZSwgdTggKiBjb3VudCkKK3sKKwlzdHJ1Y3QgcnRfZWlkICogcEVpZDsKKwlpbnQgbGVuOworCXU4ICpwQnVmOworCWludCBvZmZzZXQgPSAwOworCXN0cnVjdCBydF9yc25pZV9hdXRoICpwQWttOworCXUxNiBhY291bnQ7CisJQk9PTEVBTiBpc1dQQTIgPSBGQUxTRTsKKworCXBFaWQgPSAoc3RydWN0IHJ0X2VpZCAqKSByc25pZTsKKwlsZW4gPSByc25pZV9sZW4gLSAyOwkvKiBleGNsdWRlIElFIGFuZCBsZW5ndGggKi8KKwlwQnVmID0gKHU4ICopJiBwRWlkLT5PY3RldFswXTsKKworCS8qIHNldCBkZWZhdWx0IHZhbHVlICovCisJKmNvdW50ID0gMDsKKworCS8qIENoZWNrIGxlbmd0aCAqLworCWlmICgobGVuIDw9IDApIHx8IChwRWlkLT5MZW4gIT0gbGVuKSkgeworCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBsZW5ndGggaXMgaW52YWxpZFxuIiwgX19mdW5jX18pKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8qIENoZWNrIFdQQSBvciBXUEEyICovCisJaWYgKHBFaWQtPkVpZCA9PSBJRV9XUEEpIHsKKwkJc3RydWN0IHJ0X3JzbmllICpwUnNuaWUgPSAoc3RydWN0IHJ0X3JzbmllICopcEJ1ZjsKKwkJdTE2IHVjb3VudDsKKworCQlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCBydF9yc25pZSkpIHsKKwkJCURCR1BSSU5UX0VSUigoIiVzIDogVGhlIGxlbmd0aCBpcyB0b28gc2hvcnQgZm9yIFdQQVxuIiwKKwkJCQkgICAgICBfX2Z1bmNfXykpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJLyogR2V0IHRoZSBjb3VudCBvZiBwYWlyd2lzZSBjaXBoZXIgKi8KKwkJdWNvdW50ID0gY3B1MmxlMTYocFJzbmllLT51Y291bnQpOworCQlpZiAodWNvdW50ID4gMikgeworCQkJREJHUFJJTlRfRVJSKCgiJXMgOiBUaGUgY291bnQoJWQpIG9mIHBhaXJ3aXNlIGNpcGhlciBpcyBpbnZsYWlkXG4iLCBfX2Z1bmNfXywgdWNvdW50KSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQkvKiBHZXQgdGhlIGdyb3VwIGNpcGhlciAqLworCQlpZiAodHlwZSA9PSBHUk9VUF9TVUlURSkgeworCQkJKmNvdW50ID0gMTsKKwkJCXJldHVybiBwUnNuaWUtPm1jYXN0OworCQl9CisJCS8qIEdldCB0aGUgcGFpcndpc2UgY2lwaGVyIHN1aXRlICovCisJCWVsc2UgaWYgKHR5cGUgPT0gUEFJUldJU0VfU1VJVEUpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIiVzIDogVGhlIGNvdW50IG9mIHBhaXJ3aXNlIGNpcGhlciBpcyAlZFxuIiwKKwkJCQkgIF9fZnVuY19fLCB1Y291bnQpKTsKKwkJCSpjb3VudCA9IHVjb3VudDsKKwkJCXJldHVybiBwUnNuaWUtPnVjYXN0WzBdLm91aTsKKwkJfQorCisJCW9mZnNldCA9IHNpemVvZihzdHJ1Y3QgcnRfcnNuaWUpICsgKDQgKiAodWNvdW50IC0gMSkpOworCisJfSBlbHNlIGlmIChwRWlkLT5FaWQgPT0gSUVfUlNOKSB7CisJCXN0cnVjdCBydF9yc25pZTIgKnBSc25pZSA9IChzdHJ1Y3QgcnRfcnNuaWUyICopcEJ1ZjsKKwkJdTE2IHVjb3VudDsKKworCQlpc1dQQTIgPSBUUlVFOworCisJCWlmIChsZW4gPCBzaXplb2Yoc3RydWN0IHJ0X3JzbmllMikpIHsKKwkJCURCR1BSSU5UX0VSUigoIiVzIDogVGhlIGxlbmd0aCBpcyB0b28gc2hvcnQgZm9yIFdQQTJcbiIsCisJCQkJICAgICAgX19mdW5jX18pKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCS8qIEdldCB0aGUgY291bnQgb2YgcGFpcndpc2UgY2lwaGVyICovCisJCXVjb3VudCA9IGNwdTJsZTE2KHBSc25pZS0+dWNvdW50KTsKKwkJaWYgKHVjb3VudCA+IDIpIHsKKwkJCURCR1BSSU5UX0VSUigoIiVzIDogVGhlIGNvdW50KCVkKSBvZiBwYWlyd2lzZSBjaXBoZXIgaXMgaW52bGFpZFxuIiwgX19mdW5jX18sIHVjb3VudCkpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJLyogR2V0IHRoZSBncm91cCBjaXBoZXIgKi8KKwkJaWYgKHR5cGUgPT0gR1JPVVBfU1VJVEUpIHsKKwkJCSpjb3VudCA9IDE7CisJCQlyZXR1cm4gcFJzbmllLT5tY2FzdDsKKwkJfQorCQkvKiBHZXQgdGhlIHBhaXJ3aXNlIGNpcGhlciBzdWl0ZSAqLworCQllbHNlIGlmICh0eXBlID09IFBBSVJXSVNFX1NVSVRFKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCIlcyA6IFRoZSBjb3VudCBvZiBwYWlyd2lzZSBjaXBoZXIgaXMgJWRcbiIsCisJCQkJICBfX2Z1bmNfXywgdWNvdW50KSk7CisJCQkqY291bnQgPSB1Y291bnQ7CisJCQlyZXR1cm4gcFJzbmllLT51Y2FzdFswXS5vdWk7CisJCX0KKworCQlvZmZzZXQgPSBzaXplb2Yoc3RydWN0IHJ0X3JzbmllMikgKyAoNCAqICh1Y291bnQgLSAxKSk7CisKKwl9IGVsc2UgeworCQlEQkdQUklOVF9FUlIoKCIlcyA6IFVua25vd24gSUUgKCVkKVxuIiwgX19mdW5jX18sIHBFaWQtPkVpZCkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBza2lwIGdyb3VwIGNpcGhlciBhbmQgcGFpcndpc2UgY2lwaGVyIHN1aXRlICovCisJcEJ1ZiArPSBvZmZzZXQ7CisJbGVuIC09IG9mZnNldDsKKworCWlmIChsZW4gPCBzaXplb2Yoc3RydWN0IHJ0X3JzbmllX2F1dGgpKSB7CisJCURCR1BSSU5UX0VSUigoIiVzIDogVGhlIGxlbmd0aCBvZiBSU05JRSBpcyB0b28gc2hvcnRcbiIsCisJCQkgICAgICBfX2Z1bmNfXykpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLyogcG9pbnRlciB0byBBS00gY291bnQgKi8KKwlwQWttID0gKHN0cnVjdCBydF9yc25pZV9hdXRoICopcEJ1ZjsKKworCS8qIEdldCB0aGUgY291bnQgb2YgcGFpcndpc2UgY2lwaGVyICovCisJYWNvdW50ID0gY3B1MmxlMTYocEFrbS0+YWNvdW50KTsKKwlpZiAoYWNvdW50ID4gMikgeworCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBjb3VudCglZCkgb2YgQUtNIGlzIGludmxhaWRcbiIsCisJCQkgICAgICBfX2Z1bmNfXywgYWNvdW50KSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvKiBHZXQgdGhlIEFLTSBzdWl0ZSAqLworCWlmICh0eXBlID09IEFLTV9TVUlURSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA6IFRoZSBjb3VudCBvZiBBS00gaXMgJWRcbiIsCisJCQkJCSAgX19mdW5jX18sIGFjb3VudCkpOworCQkqY291bnQgPSBhY291bnQ7CisJCXJldHVybiBwQWttLT5hdXRoWzBdLm91aTsKKwl9CisJb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBydF9yc25pZV9hdXRoKSArICg0ICogKGFjb3VudCAtIDEpKTsKKworCXBCdWYgKz0gb2Zmc2V0OworCWxlbiAtPSBvZmZzZXQ7CisKKwkvKiBUaGUgcmVtYWluaW5nIGxlbmd0aCBtdXN0IGxhcmdlciB0aGFuIChSU04tQ2FwYWJpbGl0eSgyKSArIFBNS0lELUNvdW50KDIpICsgUE1LSUQoMTZ+KSkgKi8KKwlpZiAobGVuID49IChzaXplb2YoUlNOX0NBUEFCSUxJVElFUykgKyAyICsgTEVOX1BNS0lEKSkgeworCQkvKiBTa2lwIFJTTiBjYXBhYmlsaXR5IGFuZCBQTUtJRC1Db3VudCAqLworCQlwQnVmICs9IChzaXplb2YoUlNOX0NBUEFCSUxJVElFUykgKyAyKTsKKwkJbGVuIC09IChzaXplb2YoUlNOX0NBUEFCSUxJVElFUykgKyAyKTsKKworCQkvKiBHZXQgUE1LSUQgKi8KKwkJaWYgKHR5cGUgPT0gUE1LSURfTElTVCkgeworCQkJKmNvdW50ID0gMTsKKwkJCXJldHVybiBwQnVmOworCQl9CisJfSBlbHNlIHsKKwkJREJHUFJJTlRfRVJSKCgiJXMgOiBpdCBjYW4ndCBnZXQgYW55IG1vcmUgaW5mb3JtYXRpb24gYmV5b25kIEFLTSBcbiIsIF9fZnVuY19fKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCSpjb3VudCA9IDA7CisJLypEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSB0eXBlKCVkKSBkb2Vzbid0IHN1cHBvcnQgXG4iLCBfX2Z1bmNfXywgdHlwZSkpOyAqLworCXJldHVybiBOVUxMOworCit9CisKK3ZvaWQgV3BhU2hvd0FsbHN1aXRlKHU4ICpyc25pZSwgdTMyIHJzbmllX2xlbikKK3sKKwl1OCAqcFN1aXRlID0gTlVMTDsKKwl1OCBjb3VudDsKKworCWhleF9kdW1wKCJSU05JRSIsIHJzbmllLCByc25pZV9sZW4pOworCisJLyogZ3JvdXAgY2lwaGVyICovCisJaWYgKChwU3VpdGUgPQorCSAgICAgR2V0U3VpdGVGcm9tUlNOSUUocnNuaWUsIHJzbmllX2xlbiwgR1JPVVBfU1VJVEUsCisJCQkgICAgICAgJmNvdW50KSkgIT0gTlVMTCkgeworCQloZXhfZHVtcCgiZ3JvdXAgY2lwaGVyIiwgcFN1aXRlLCA0ICogY291bnQpOworCX0KKwkvKiBwYWlyd2lzZSBjaXBoZXIgKi8KKwlpZiAoKHBTdWl0ZSA9CisJICAgICBHZXRTdWl0ZUZyb21SU05JRShyc25pZSwgcnNuaWVfbGVuLCBQQUlSV0lTRV9TVUlURSwKKwkJCSAgICAgICAmY291bnQpKSAhPSBOVUxMKSB7CisJCWhleF9kdW1wKCJwYWlyd2lzZSBjaXBoZXIiLCBwU3VpdGUsIDQgKiBjb3VudCk7CisJfQorCS8qIEFLTSAqLworCWlmICgocFN1aXRlID0KKwkgICAgIEdldFN1aXRlRnJvbVJTTklFKHJzbmllLCByc25pZV9sZW4sIEFLTV9TVUlURSwgJmNvdW50KSkgIT0gTlVMTCkgeworCQloZXhfZHVtcCgiQUtNIHN1aXRlIiwgcFN1aXRlLCA0ICogY291bnQpOworCX0KKwkvKiBQTUtJRCAqLworCWlmICgocFN1aXRlID0KKwkgICAgIEdldFN1aXRlRnJvbVJTTklFKHJzbmllLCByc25pZV9sZW4sIFBNS0lEX0xJU1QsICZjb3VudCkpICE9IE5VTEwpIHsKKwkJaGV4X2R1bXAoIlBNS0lEIiwgcFN1aXRlLCBMRU5fUE1LSUQpOworCX0KKworfQorCit2b2lkIFJUTVBJbnNlcnRSU05JRSh1OCAqcEZyYW1lQnVmLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgKnBGcmFtZUxlbiwKKwkJICAgICB1OCAqcnNuaWVfcHRyLAorCQkgICAgIHU4IHJzbmllX2xlbiwKKwkJICAgICB1OCAqcG1raWRfcHRyLCB1OCBwbWtpZF9sZW4pCit7CisJdTggKnBUbXBCdWY7CisJdW5zaWduZWQgbG9uZyBUZW1wTGVuID0gMDsKKwl1OCBleHRyYV9sZW4gPSAwOworCXUxNiBwbWtfY291bnQgPSAwOworCXU4IGllX251bTsKKwl1OCB0b3RhbF9sZW4gPSAwOworCXU4IFdQQTJfT1VJWzNdID0geyAweDAwLCAweDBGLCAweEFDIH07CisKKwlwVG1wQnVmID0gcEZyYW1lQnVmOworCisJLyogUE1LSUQtTGlzdCBNdXN0IGxhcmdlciB0aGFuIDAgYW5kIHRoZSBtdWx0aXBsZSBvZiAxNi4gKi8KKwlpZiAocG1raWRfbGVuID4gMCAmJiAoKHBta2lkX2xlbiAmIDB4MGYpID09IDApKSB7CisJCWV4dHJhX2xlbiA9IHNpemVvZih1MTYpKyBwbWtpZF9sZW47CisKKwkJcG1rX2NvdW50ID0gKHBta2lkX2xlbiA+PiA0KTsKKwkJcG1rX2NvdW50ID0gY3B1MmxlMTYocG1rX2NvdW50KTsKKwl9IGVsc2UgeworCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLAorCQkJICgiJXMgOiBUaGUgbGVuZ3RoIGlzIFBNS0lELUxpc3QgaXMgaW52YWxpZCAoJWQpLCBzbyBkb24ndCBpbnNlcnQgaXQuXG4iLAorCQkJICBfX2Z1bmNfXywgcG1raWRfbGVuKSk7CisJfQorCisJaWYgKHJzbmllX2xlbiAhPSAwKSB7CisJCWllX251bSA9IElFX1dQQTsKKwkJdG90YWxfbGVuID0gcnNuaWVfbGVuOworCisJCWlmIChOZGlzRXF1YWxNZW1vcnkocnNuaWVfcHRyICsgMiwgV1BBMl9PVUksIHNpemVvZihXUEEyX09VSSkpKSB7CisJCQlpZV9udW0gPSBJRV9SU047CisJCQl0b3RhbF9sZW4gKz0gZXh0cmFfbGVuOworCQl9CisKKwkJLyogY29uc3RydWN0IFJTTklFIGJvZHkgKi8KKwkJTWFrZU91dGdvaW5nRnJhbWUocFRtcEJ1ZiwgJlRlbXBMZW4sCisJCQkJICAxLCAmaWVfbnVtLAorCQkJCSAgMSwgJnRvdGFsX2xlbiwKKwkJCQkgIHJzbmllX2xlbiwgcnNuaWVfcHRyLCBFTkRfT0ZfQVJHUyk7CisKKwkJcFRtcEJ1ZiArPSBUZW1wTGVuOworCQkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CisKKwkJaWYgKGllX251bSA9PSBJRV9SU04pIHsKKwkJCS8qIEluc2VydCBQTUtJRC1MaXN0IGZpZWxkICovCisJCQlpZiAoZXh0cmFfbGVuID4gMCkgeworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBUbXBCdWYsICZUZW1wTGVuLAorCQkJCQkJICAyLCAmcG1rX2NvdW50LAorCQkJCQkJICBwbWtpZF9sZW4sIHBta2lkX3B0ciwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCisJCQkJcFRtcEJ1ZiArPSBUZW1wTGVuOworCQkJCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NyeXB0X2htYWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NyeXB0X2htYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2FiMDhlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY3J5cHRfaG1hYy5jCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9jcnlwdF9obWFjLmgiCisKKyNpZmRlZiBITUFDX1NIQTFfU1VQUE9SVAorLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBITUFDIHVzaW5nIFNIQTEgaGFzaCBmdW5jdGlvbgorCitBcmd1bWVudHM6CisgICAga2V5ICAgICAgICAgICAgIFNlY3JldCBrZXkKKyAgICBrZXlfbGVuICAgICAgICAgVGhlIGxlbmd0aCBvZiB0aGUga2V5IGluIGJ5dGVzCisgICAgbWVzc2FnZSAgICAgICAgIE1lc3NhZ2UgY29udGV4dAorICAgIG1lc3NhZ2VfbGVuICAgICBUaGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gYnl0ZXMKKyAgICBtYWNMZW4gICAgICAgICAgUmVxdWVzdCB0aGUgbGVuZ3RoIG9mIG1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZQorCitSZXR1cm4gVmFsdWU6CisgICAgbWFjICAgICAgICAgICAgIE1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZQorCitOb3RlOgorICAgIE5vbmUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgSE1BQ19TSEExKElOIGNvbnN0IHU4IEtleVtdLAorCSAgICAgICB1MzIgS2V5TGVuLAorCSAgICAgICBJTiBjb25zdCB1OCBNZXNzYWdlW10sCisJICAgICAgIHUzMiBNZXNzYWdlTGVuLCB1OCBNQUNbXSwgdTMyIE1BQ0xlbikKK3sKKwlzdHJ1Y3QgcnRfc2hhMV9jdHggc2hhX2N0eDE7CisJc3RydWN0IHJ0X3NoYTFfY3R4IHNoYV9jdHgyOworCXU4IEswW1NIQTFfQkxPQ0tfU0laRV07CisJdTggRGlnZXN0W1NIQTFfRElHRVNUX1NJWkVdOworCXUzMiBpbmRleDsKKworCU5kaXNaZXJvTWVtb3J5KCZzaGFfY3R4MSwgc2l6ZW9mKHN0cnVjdCBydF9zaGExX2N0eCkpOworCU5kaXNaZXJvTWVtb3J5KCZzaGFfY3R4Miwgc2l6ZW9mKHN0cnVjdCBydF9zaGExX2N0eCkpOworCS8qCisJICogSWYgdGhlIGxlbmd0aCBvZiBLID0gQihCbG9jayBzaXplKTogSzAgPSBLLgorCSAqIElmIHRoZSBsZW5ndGggb2YgSyA+IEI6IGhhc2ggSyB0byBvYnRhaW4gYW4gTCBieXRlIHN0cmluZywKKwkgKiB0aGVuIGFwcGVuZCAoQi1MKSB6ZXJvcyB0byBjcmVhdGUgYSBCLWJ5dGUgc3RyaW5nIEswIChpLmUuLCBLMCA9IEgoSykgfHwgMDAuLi4wMCkuCisJICogSWYgdGhlIGxlbmd0aCBvZiBLIDwgQjogYXBwZW5kIHplcm9zIHRvIHRoZSBlbmQgb2YgSyB0byBjcmVhdGUgYSBCLWJ5dGUgc3RyaW5nIEswCisJICovCisJTmRpc1plcm9NZW1vcnkoSzAsIFNIQTFfQkxPQ0tfU0laRSk7CisJaWYgKEtleUxlbiA8PSBTSEExX0JMT0NLX1NJWkUpCisJCU5kaXNNb3ZlTWVtb3J5KEswLCBLZXksIEtleUxlbik7CisJZWxzZQorCQlSVF9TSEExKEtleSwgS2V5TGVuLCBLMCk7CisJLyogRW5kIG9mIGlmICovCisKKwkvKiBFeGNsdXNpdmUtT3IgSzAgd2l0aCBpcGFkICovCisJLyogaXBhZDogSW5uZXIgcGFkOyB0aGUgYnl0ZSB4wqHCpjM2wqHCpiByZXBlYXRlZCBCIHRpbWVzLiAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNIQTFfQkxPQ0tfU0laRTsgaW5kZXgrKykKKwkJSzBbaW5kZXhdIF49IDB4MzY7CisJLyogRW5kIG9mIGZvciAqLworCisJUlRfU0hBMV9Jbml0KCZzaGFfY3R4MSk7CisJLyogSChLMF5pcGFkKSAqLworCVNIQTFfQXBwZW5kKCZzaGFfY3R4MSwgSzAsIHNpemVvZihLMCkpOworCS8qIEgoKEswXmlwYWQpfHx0ZXh0KSAqLworCVNIQTFfQXBwZW5kKCZzaGFfY3R4MSwgTWVzc2FnZSwgTWVzc2FnZUxlbik7CisJU0hBMV9FbmQoJnNoYV9jdHgxLCBEaWdlc3QpOworCisJLyogRXhjbHVzaXZlLU9yIEswIHdpdGggb3BhZCBhbmQgcmVtb3ZlIGlwYWQgKi8KKwkvKiBvcGFkOiBPdXRlciBwYWQ7IHRoZSBieXRlIHjCocKmNWPCocKmIHJlcGVhdGVkIEIgdGltZXMuICovCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU0hBMV9CTE9DS19TSVpFOyBpbmRleCsrKQorCQlLMFtpbmRleF0gXj0gMHgzNiBeIDB4NWM7CisJLyogRW5kIG9mIGZvciAqLworCisJUlRfU0hBMV9Jbml0KCZzaGFfY3R4Mik7CisJLyogSChLMF5vcGFkKSAqLworCVNIQTFfQXBwZW5kKCZzaGFfY3R4MiwgSzAsIHNpemVvZihLMCkpOworCS8qIEgoIChLMF5vcGFkKSB8fCBIKChLMF5pcGFkKXx8dGV4dCkgKSAqLworCVNIQTFfQXBwZW5kKCZzaGFfY3R4MiwgRGlnZXN0LCBTSEExX0RJR0VTVF9TSVpFKTsKKwlTSEExX0VuZCgmc2hhX2N0eDIsIERpZ2VzdCk7CisKKwlpZiAoTUFDTGVuID4gU0hBMV9ESUdFU1RfU0laRSkKKwkJTmRpc01vdmVNZW1vcnkoTUFDLCBEaWdlc3QsIFNIQTFfRElHRVNUX1NJWkUpOworCWVsc2UKKwkJTmRpc01vdmVNZW1vcnkoTUFDLCBEaWdlc3QsIE1BQ0xlbik7Cit9CQkJCS8qIEVuZCBvZiBITUFDX1NIQTEgKi8KKyNlbmRpZiAvKiBITUFDX1NIQTFfU1VQUE9SVCAqLworCisjaWZkZWYgSE1BQ19NRDVfU1VQUE9SVAorLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBITUFDIHVzaW5nIE1ENSBoYXNoIGZ1bmN0aW9uCisKK0FyZ3VtZW50czoKKyAgICBrZXkgICAgICAgICAgICAgU2VjcmV0IGtleQorICAgIGtleV9sZW4gICAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBrZXkgaW4gYnl0ZXMKKyAgICBtZXNzYWdlICAgICAgICAgTWVzc2FnZSBjb250ZXh0CisgICAgbWVzc2FnZV9sZW4gICAgIFRoZSBsZW5ndGggb2YgbWVzc2FnZSBpbiBieXRlcworICAgIG1hY0xlbiAgICAgICAgICBSZXF1ZXN0IHRoZSBsZW5ndGggb2YgbWVzc2FnZSBhdXRoZW50aWNhdGlvbiBjb2RlCisKK1JldHVybiBWYWx1ZToKKyAgICBtYWMgICAgICAgICAgICAgTWVzc2FnZSBhdXRoZW50aWNhdGlvbiBjb2RlCisKK05vdGU6CisgICAgTm9uZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBITUFDX01ENShJTiBjb25zdCB1OCBLZXlbXSwKKwkgICAgICB1MzIgS2V5TGVuLAorCSAgICAgIElOIGNvbnN0IHU4IE1lc3NhZ2VbXSwKKwkgICAgICB1MzIgTWVzc2FnZUxlbiwgdTggTUFDW10sIHUzMiBNQUNMZW4pCit7CisJc3RydWN0IHJ0X21kNV9jdHhfc3RydWMgbWQ1X2N0eDE7CisJc3RydWN0IHJ0X21kNV9jdHhfc3RydWMgbWQ1X2N0eDI7CisJdTggSzBbTUQ1X0JMT0NLX1NJWkVdOworCXU4IERpZ2VzdFtNRDVfRElHRVNUX1NJWkVdOworCXUzMiBpbmRleDsKKworCU5kaXNaZXJvTWVtb3J5KCZtZDVfY3R4MSwgc2l6ZW9mKHN0cnVjdCBydF9tZDVfY3R4X3N0cnVjKSk7CisJTmRpc1plcm9NZW1vcnkoJm1kNV9jdHgyLCBzaXplb2Yoc3RydWN0IHJ0X21kNV9jdHhfc3RydWMpKTsKKwkvKgorCSAqIElmIHRoZSBsZW5ndGggb2YgSyA9IEIoQmxvY2sgc2l6ZSk6IEswID0gSy4KKwkgKiBJZiB0aGUgbGVuZ3RoIG9mIEsgPiBCOiBoYXNoIEsgdG8gb2J0YWluIGFuIEwgYnl0ZSBzdHJpbmcsCisJICogdGhlbiBhcHBlbmQgKEItTCkgemVyb3MgdG8gY3JlYXRlIGEgQi1ieXRlIHN0cmluZyBLMCAoaS5lLiwgSzAgPSBIKEspIHx8IDAwLi4uMDApLgorCSAqIElmIHRoZSBsZW5ndGggb2YgSyA8IEI6IGFwcGVuZCB6ZXJvcyB0byB0aGUgZW5kIG9mIEsgdG8gY3JlYXRlIGEgQi1ieXRlIHN0cmluZyBLMAorCSAqLworCU5kaXNaZXJvTWVtb3J5KEswLCBNRDVfQkxPQ0tfU0laRSk7CisJaWYgKEtleUxlbiA8PSBNRDVfQkxPQ0tfU0laRSkgeworCQlOZGlzTW92ZU1lbW9yeShLMCwgS2V5LCBLZXlMZW4pOworCX0gZWxzZSB7CisJCVJUX01ENShLZXksIEtleUxlbiwgSzApOworCX0KKworCS8qIEV4Y2x1c2l2ZS1PciBLMCB3aXRoIGlwYWQgKi8KKwkvKiBpcGFkOiBJbm5lciBwYWQ7IHRoZSBieXRlIHjCocKmMzbCocKmIHJlcGVhdGVkIEIgdGltZXMuICovCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUQ1X0JMT0NLX1NJWkU7IGluZGV4KyspCisJCUswW2luZGV4XSBePSAweDM2OworCS8qIEVuZCBvZiBmb3IgKi8KKworCU1ENV9Jbml0KCZtZDVfY3R4MSk7CisJLyogSChLMF5pcGFkKSAqLworCU1ENV9BcHBlbmQoJm1kNV9jdHgxLCBLMCwgc2l6ZW9mKEswKSk7CisJLyogSCgoSzBeaXBhZCl8fHRleHQpICovCisJTUQ1X0FwcGVuZCgmbWQ1X2N0eDEsIE1lc3NhZ2UsIE1lc3NhZ2VMZW4pOworCU1ENV9FbmQoJm1kNV9jdHgxLCBEaWdlc3QpOworCisJLyogRXhjbHVzaXZlLU9yIEswIHdpdGggb3BhZCBhbmQgcmVtb3ZlIGlwYWQgKi8KKwkvKiBvcGFkOiBPdXRlciBwYWQ7IHRoZSBieXRlIHjCocKmNWPCocKmIHJlcGVhdGVkIEIgdGltZXMuICovCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUQ1X0JMT0NLX1NJWkU7IGluZGV4KyspCisJCUswW2luZGV4XSBePSAweDM2IF4gMHg1YzsKKwkvKiBFbmQgb2YgZm9yICovCisKKwlNRDVfSW5pdCgmbWQ1X2N0eDIpOworCS8qIEgoSzBeb3BhZCkgKi8KKwlNRDVfQXBwZW5kKCZtZDVfY3R4MiwgSzAsIHNpemVvZihLMCkpOworCS8qIEgoIChLMF5vcGFkKSB8fCBIKChLMF5pcGFkKXx8dGV4dCkgKSAqLworCU1ENV9BcHBlbmQoJm1kNV9jdHgyLCBEaWdlc3QsIE1ENV9ESUdFU1RfU0laRSk7CisJTUQ1X0VuZCgmbWQ1X2N0eDIsIERpZ2VzdCk7CisKKwlpZiAoTUFDTGVuID4gTUQ1X0RJR0VTVF9TSVpFKQorCQlOZGlzTW92ZU1lbW9yeShNQUMsIERpZ2VzdCwgTUQ1X0RJR0VTVF9TSVpFKTsKKwllbHNlCisJCU5kaXNNb3ZlTWVtb3J5KE1BQywgRGlnZXN0LCBNQUNMZW4pOworfQkJCQkvKiBFbmQgb2YgSE1BQ19TSEEyNTYgKi8KKyNlbmRpZiAvKiBITUFDX01ENV9TVVBQT1JUICovCisKKy8qIEVuZCBvZiBjcnlwdF9obWFjLmMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NyeXB0X21kNS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY3J5cHRfbWQ1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRlYWI2NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NyeXB0X21kNS5jCkBAIC0wLDAgKzEsMzM5IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9jcnlwdF9tZDUuaCIKKworI2lmZGVmIE1ENV9TVVBQT1JUCisvKgorICogRiwgRywgSCBhbmQgSSBhcmUgYmFzaWMgTUQ1IGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZSBGKHgsIHksIHopICgoKHgpICYgKHkpKSB8ICgofngpICYgKHopKSkKKyNkZWZpbmUgRyh4LCB5LCB6KSAoKCh4KSAmICh6KSkgfCAoKHkpICYgKH56KSkpCisjZGVmaW5lIEgoeCwgeSwgeikgKCh4KSBeICh5KSBeICh6KSkKKyNkZWZpbmUgSSh4LCB5LCB6KSAoKHkpIF4gKCh4KSB8ICh+eikpKQorCisjZGVmaW5lIFJPVEwoeCxuLHcpICgoeCA8PCBuKSB8ICh4ID4+ICh3IC0gbikpKQorI2RlZmluZSBST1RMMzIoeCxuKSBST1RMKHgsbiwzMikJLyogMzIgYml0cyB3b3JkICovCisKKyNkZWZpbmUgUk9VTkQxKGEsIGIsIGMsIGQsIHgsIHMsIGFjKSB7ICAgICAgICAgIFwKKyAgICAoYSkgKz0gRigoYiksKGMpLChkKSkgKyAoeCkgKyAodTMyKShhYyk7IFwKKyAgICAoYSkgID0gUk9UTDMyKChhKSwocykpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYSkgKz0gKGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNkZWZpbmUgUk9VTkQyKGEsIGIsIGMsIGQsIHgsIHMsIGFjKSB7ICAgICAgICAgIFwKKyAgICAoYSkgKz0gRygoYiksKGMpLChkKSkgKyAoeCkgKyAodTMyKShhYyk7IFwKKyAgICAoYSkgID0gUk9UTDMyKChhKSwocykpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYSkgKz0gKGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNkZWZpbmUgUk9VTkQzKGEsIGIsIGMsIGQsIHgsIHMsIGFjKSB7ICAgICAgICAgIFwKKyAgICAoYSkgKz0gSCgoYiksKGMpLChkKSkgKyAoeCkgKyAodTMyKShhYyk7IFwKKyAgICAoYSkgID0gUk9UTDMyKChhKSwocykpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYSkgKz0gKGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNkZWZpbmUgUk9VTkQ0KGEsIGIsIGMsIGQsIHgsIHMsIGFjKSB7ICAgICAgICAgIFwKKyAgICAoYSkgKz0gSSgoYiksKGMpLChkKSkgKyAoeCkgKyAodTMyKShhYyk7IFwKKyAgICAoYSkgID0gUk9UTDMyKChhKSwocykpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYSkgKz0gKGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KK3N0YXRpYyBjb25zdCB1MzIgTUQ1X0RlZmF1bHRIYXNoVmFsdWVbNF0gPSB7CisJMHg2NzQ1MjMwMVVMLCAweGVmY2RhYjg5VUwsIDB4OThiYWRjZmVVTCwgMHgxMDMyNTQ3NlVMCit9OworI2VuZGlmIC8qIE1ENV9TVVBQT1JUICovCisKKyNpZmRlZiBNRDVfU1VQUE9SVAorLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBJbml0aWFsIE1kNV9DVFhfU1RSVUMKKworQXJndW1lbnRzOgorICAgIHBNRDVfQ1RYICAgICAgICBQb2ludGVyIHRvIE1kNV9DVFhfU1RSVUMKKworUmV0dXJuIFZhbHVlOgorICAgIE5vbmUKKworTm90ZToKKyAgICBOb25lCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIE1ENV9Jbml0KHN0cnVjdCBydF9tZDVfY3R4X3N0cnVjICpwTUQ1X0NUWCkKK3sKKwlOZGlzTW92ZU1lbW9yeShwTUQ1X0NUWC0+SGFzaFZhbHVlLCBNRDVfRGVmYXVsdEhhc2hWYWx1ZSwKKwkJICAgICAgIHNpemVvZihNRDVfRGVmYXVsdEhhc2hWYWx1ZSkpOworCU5kaXNaZXJvTWVtb3J5KHBNRDVfQ1RYLT5CbG9jaywgTUQ1X0JMT0NLX1NJWkUpOworCXBNRDVfQ1RYLT5CbG9ja0xlbiA9IDA7CisJcE1ENV9DVFgtPk1lc3NhZ2VMZW4gPSAwOworfQkJCQkvKiBFbmQgb2YgTUQ1X0luaXQgKi8KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBNRDUgY29tcHV0YXRpb24gZm9yIG9uZSBibG9jayAoNTEyIGJpdHMpCisKK0FyZ3VtZW50czoKKyAgICBwTUQ1X0NUWCAgICAgICAgUG9pbnRlciB0byBNZDVfQ1RYX1NUUlVDCisKK1JldHVybiBWYWx1ZToKKyAgICBOb25lCisKK05vdGU6CisgICAgVFtpXSA6PSBmbG9vcihhYnMoc2luKGkgKyAxKSkgKiAoMiBwb3cgMzIpKSwgaSBpcyBudW1iZXIgb2Ygcm91bmQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgTUQ1X0hhc2goc3RydWN0IHJ0X21kNV9jdHhfc3RydWMgKnBNRDVfQ1RYKQoreworCXUzMiBYX2k7CisJdTMyIFhbMTZdOworCXUzMiBhLCBiLCBjLCBkOworCisJLyogUHJlcGFyZSB0aGUgbWVzc2FnZSBzY2hlZHVsZSwge1hfaX0gKi8KKwlOZGlzTW92ZU1lbW9yeShYLCBwTUQ1X0NUWC0+QmxvY2ssIE1ENV9CTE9DS19TSVpFKTsKKwlmb3IgKFhfaSA9IDA7IFhfaSA8IDE2OyBYX2krKykKKwkJWFtYX2ldID0gY3B1MmxlMzIoWFtYX2ldKTsJLyogRW5kaWFuIFN3YXAgKi8KKwkvKiBFbmQgb2YgZm9yICovCisKKwkvKiBNRDUgaGFzaCBjb21wdXRhdGlvbiAqLworCS8qIEluaXRpYWxpemUgdGhlIHdvcmtpbmcgdmFyaWFibGVzICovCisJYSA9IHBNRDVfQ1RYLT5IYXNoVmFsdWVbMF07CisJYiA9IHBNRDVfQ1RYLT5IYXNoVmFsdWVbMV07CisJYyA9IHBNRDVfQ1RYLT5IYXNoVmFsdWVbMl07CisJZCA9IHBNRDVfQ1RYLT5IYXNoVmFsdWVbM107CisKKwkvKgorCSAqICBSb3VuZCAxCisJICogIExldCBbYWJjZCBrIHMgaV0gZGVub3RlIHRoZSBvcGVyYXRpb24KKwkgKiAgYSA9IGIgKyAoKGEgKyBGKGIsYyxkKSArIFhba10gKyBUW2ldKSA8PDwgcykKKwkgKi8KKwlST1VORDEoYSwgYiwgYywgZCwgWFswXSwgNywgMHhkNzZhYTQ3OCk7CS8qIDEgKi8KKwlST1VORDEoZCwgYSwgYiwgYywgWFsxXSwgMTIsIDB4ZThjN2I3NTYpOwkvKiAyICovCisJUk9VTkQxKGMsIGQsIGEsIGIsIFhbMl0sIDE3LCAweDI0MjA3MGRiKTsJLyogMyAqLworCVJPVU5EMShiLCBjLCBkLCBhLCBYWzNdLCAyMiwgMHhjMWJkY2VlZSk7CS8qIDQgKi8KKwlST1VORDEoYSwgYiwgYywgZCwgWFs0XSwgNywgMHhmNTdjMGZhZik7CS8qIDUgKi8KKwlST1VORDEoZCwgYSwgYiwgYywgWFs1XSwgMTIsIDB4NDc4N2M2MmEpOwkvKiA2ICovCisJUk9VTkQxKGMsIGQsIGEsIGIsIFhbNl0sIDE3LCAweGE4MzA0NjEzKTsJLyogNyAqLworCVJPVU5EMShiLCBjLCBkLCBhLCBYWzddLCAyMiwgMHhmZDQ2OTUwMSk7CS8qIDggKi8KKwlST1VORDEoYSwgYiwgYywgZCwgWFs4XSwgNywgMHg2OTgwOThkOCk7CS8qIDkgKi8KKwlST1VORDEoZCwgYSwgYiwgYywgWFs5XSwgMTIsIDB4OGI0NGY3YWYpOwkvKiAxMCAqLworCVJPVU5EMShjLCBkLCBhLCBiLCBYWzEwXSwgMTcsIDB4ZmZmZjViYjEpOwkvKiAxMSAqLworCVJPVU5EMShiLCBjLCBkLCBhLCBYWzExXSwgMjIsIDB4ODk1Y2Q3YmUpOwkvKiAxMiAqLworCVJPVU5EMShhLCBiLCBjLCBkLCBYWzEyXSwgNywgMHg2YjkwMTEyMik7CS8qIDEzICovCisJUk9VTkQxKGQsIGEsIGIsIGMsIFhbMTNdLCAxMiwgMHhmZDk4NzE5Myk7CS8qIDE0ICovCisJUk9VTkQxKGMsIGQsIGEsIGIsIFhbMTRdLCAxNywgMHhhNjc5NDM4ZSk7CS8qIDE1ICovCisJUk9VTkQxKGIsIGMsIGQsIGEsIFhbMTVdLCAyMiwgMHg0OWI0MDgyMSk7CS8qIDE2ICovCisKKwkvKgorCSAqICBSb3VuZCAyCisJICogIExldCBbYWJjZCBrIHMgaV0gZGVub3RlIHRoZSBvcGVyYXRpb24KKwkgKiAgYSA9IGIgKyAoKGEgKyBHKGIsYyxkKSArIFhba10gKyBUW2ldKSA8PDwgcykKKwkgKi8KKwlST1VORDIoYSwgYiwgYywgZCwgWFsxXSwgNSwgMHhmNjFlMjU2Mik7CS8qIDE3ICovCisJUk9VTkQyKGQsIGEsIGIsIGMsIFhbNl0sIDksIDB4YzA0MGIzNDApOwkvKiAxOCAqLworCVJPVU5EMihjLCBkLCBhLCBiLCBYWzExXSwgMTQsIDB4MjY1ZTVhNTEpOwkvKiAxOSAqLworCVJPVU5EMihiLCBjLCBkLCBhLCBYWzBdLCAyMCwgMHhlOWI2YzdhYSk7CS8qIDIwICovCisJUk9VTkQyKGEsIGIsIGMsIGQsIFhbNV0sIDUsIDB4ZDYyZjEwNWQpOwkvKiAyMSAqLworCVJPVU5EMihkLCBhLCBiLCBjLCBYWzEwXSwgOSwgMHgyNDQxNDUzKTsJLyogMjIgKi8KKwlST1VORDIoYywgZCwgYSwgYiwgWFsxNV0sIDE0LCAweGQ4YTFlNjgxKTsJLyogMjMgKi8KKwlST1VORDIoYiwgYywgZCwgYSwgWFs0XSwgMjAsIDB4ZTdkM2ZiYzgpOwkvKiAyNCAqLworCVJPVU5EMihhLCBiLCBjLCBkLCBYWzldLCA1LCAweDIxZTFjZGU2KTsJLyogMjUgKi8KKwlST1VORDIoZCwgYSwgYiwgYywgWFsxNF0sIDksIDB4YzMzNzA3ZDYpOwkvKiAyNiAqLworCVJPVU5EMihjLCBkLCBhLCBiLCBYWzNdLCAxNCwgMHhmNGQ1MGQ4Nyk7CS8qIDI3ICovCisJUk9VTkQyKGIsIGMsIGQsIGEsIFhbOF0sIDIwLCAweDQ1NWExNGVkKTsJLyogMjggKi8KKwlST1VORDIoYSwgYiwgYywgZCwgWFsxM10sIDUsIDB4YTllM2U5MDUpOwkvKiAyOSAqLworCVJPVU5EMihkLCBhLCBiLCBjLCBYWzJdLCA5LCAweGZjZWZhM2Y4KTsJLyogMzAgKi8KKwlST1VORDIoYywgZCwgYSwgYiwgWFs3XSwgMTQsIDB4Njc2ZjAyZDkpOwkvKiAzMSAqLworCVJPVU5EMihiLCBjLCBkLCBhLCBYWzEyXSwgMjAsIDB4OGQyYTRjOGEpOwkvKiAzMiAqLworCisJLyoKKwkgKiAgUm91bmQgMworCSAqICBMZXQgW2FiY2QgayBzIHRdIGRlbm90ZSB0aGUgb3BlcmF0aW9uCisJICogIGEgPSBiICsgKChhICsgSChiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpCisJICovCisJUk9VTkQzKGEsIGIsIGMsIGQsIFhbNV0sIDQsIDB4ZmZmYTM5NDIpOwkvKiAzMyAqLworCVJPVU5EMyhkLCBhLCBiLCBjLCBYWzhdLCAxMSwgMHg4NzcxZjY4MSk7CS8qIDM0ICovCisJUk9VTkQzKGMsIGQsIGEsIGIsIFhbMTFdLCAxNiwgMHg2ZDlkNjEyMik7CS8qIDM1ICovCisJUk9VTkQzKGIsIGMsIGQsIGEsIFhbMTRdLCAyMywgMHhmZGU1MzgwYyk7CS8qIDM2ICovCisJUk9VTkQzKGEsIGIsIGMsIGQsIFhbMV0sIDQsIDB4YTRiZWVhNDQpOwkvKiAzNyAqLworCVJPVU5EMyhkLCBhLCBiLCBjLCBYWzRdLCAxMSwgMHg0YmRlY2ZhOSk7CS8qIDM4ICovCisJUk9VTkQzKGMsIGQsIGEsIGIsIFhbN10sIDE2LCAweGY2YmI0YjYwKTsJLyogMzkgKi8KKwlST1VORDMoYiwgYywgZCwgYSwgWFsxMF0sIDIzLCAweGJlYmZiYzcwKTsJLyogNDAgKi8KKwlST1VORDMoYSwgYiwgYywgZCwgWFsxM10sIDQsIDB4Mjg5YjdlYzYpOwkvKiA0MSAqLworCVJPVU5EMyhkLCBhLCBiLCBjLCBYWzBdLCAxMSwgMHhlYWExMjdmYSk7CS8qIDQyICovCisJUk9VTkQzKGMsIGQsIGEsIGIsIFhbM10sIDE2LCAweGQ0ZWYzMDg1KTsJLyogNDMgKi8KKwlST1VORDMoYiwgYywgZCwgYSwgWFs2XSwgMjMsIDB4NDg4MWQwNSk7CS8qIDQ0ICovCisJUk9VTkQzKGEsIGIsIGMsIGQsIFhbOV0sIDQsIDB4ZDlkNGQwMzkpOwkvKiA0NSAqLworCVJPVU5EMyhkLCBhLCBiLCBjLCBYWzEyXSwgMTEsIDB4ZTZkYjk5ZTUpOwkvKiA0NiAqLworCVJPVU5EMyhjLCBkLCBhLCBiLCBYWzE1XSwgMTYsIDB4MWZhMjdjZjgpOwkvKiA0NyAqLworCVJPVU5EMyhiLCBjLCBkLCBhLCBYWzJdLCAyMywgMHhjNGFjNTY2NSk7CS8qIDQ4ICovCisKKwkvKgorCSAqICBSb3VuZCA0CisJICogIExldCBbYWJjZCBrIHMgdF0gZGVub3RlIHRoZSBvcGVyYXRpb24KKwkgKiAgYSA9IGIgKyAoKGEgKyBJKGIsYyxkKSArIFhba10gKyBUW2ldKSA8PDwgcykKKwkgKi8KKwlST1VORDQoYSwgYiwgYywgZCwgWFswXSwgNiwgMHhmNDI5MjI0NCk7CS8qIDQ5ICovCisJUk9VTkQ0KGQsIGEsIGIsIGMsIFhbN10sIDEwLCAweDQzMmFmZjk3KTsJLyogNTAgKi8KKwlST1VORDQoYywgZCwgYSwgYiwgWFsxNF0sIDE1LCAweGFiOTQyM2E3KTsJLyogNTEgKi8KKwlST1VORDQoYiwgYywgZCwgYSwgWFs1XSwgMjEsIDB4ZmM5M2EwMzkpOwkvKiA1MiAqLworCVJPVU5ENChhLCBiLCBjLCBkLCBYWzEyXSwgNiwgMHg2NTViNTljMyk7CS8qIDUzICovCisJUk9VTkQ0KGQsIGEsIGIsIGMsIFhbM10sIDEwLCAweDhmMGNjYzkyKTsJLyogNTQgKi8KKwlST1VORDQoYywgZCwgYSwgYiwgWFsxMF0sIDE1LCAweGZmZWZmNDdkKTsJLyogNTUgKi8KKwlST1VORDQoYiwgYywgZCwgYSwgWFsxXSwgMjEsIDB4ODU4NDVkZDEpOwkvKiA1NiAqLworCVJPVU5ENChhLCBiLCBjLCBkLCBYWzhdLCA2LCAweDZmYTg3ZTRmKTsJLyogNTcgKi8KKwlST1VORDQoZCwgYSwgYiwgYywgWFsxNV0sIDEwLCAweGZlMmNlNmUwKTsJLyogNTggKi8KKwlST1VORDQoYywgZCwgYSwgYiwgWFs2XSwgMTUsIDB4YTMwMTQzMTQpOwkvKiA1OSAqLworCVJPVU5ENChiLCBjLCBkLCBhLCBYWzEzXSwgMjEsIDB4NGUwODExYTEpOwkvKiA2MCAqLworCVJPVU5ENChhLCBiLCBjLCBkLCBYWzRdLCA2LCAweGY3NTM3ZTgyKTsJLyogNjEgKi8KKwlST1VORDQoZCwgYSwgYiwgYywgWFsxMV0sIDEwLCAweGJkM2FmMjM1KTsJLyogNjIgKi8KKwlST1VORDQoYywgZCwgYSwgYiwgWFsyXSwgMTUsIDB4MmFkN2QyYmIpOwkvKiA2MyAqLworCVJPVU5ENChiLCBjLCBkLCBhLCBYWzldLCAyMSwgMHhlYjg2ZDM5MSk7CS8qIDY0ICovCisKKwkvKiBDb21wdXRlIHRoZSBpXnRoIGludGVybWVkaWF0ZSBoYXNoIHZhbHVlIEheKGkpICovCisJcE1ENV9DVFgtPkhhc2hWYWx1ZVswXSArPSBhOworCXBNRDVfQ1RYLT5IYXNoVmFsdWVbMV0gKz0gYjsKKwlwTUQ1X0NUWC0+SGFzaFZhbHVlWzJdICs9IGM7CisJcE1ENV9DVFgtPkhhc2hWYWx1ZVszXSArPSBkOworCisJTmRpc1plcm9NZW1vcnkocE1ENV9DVFgtPkJsb2NrLCBNRDVfQkxPQ0tfU0laRSk7CisJcE1ENV9DVFgtPkJsb2NrTGVuID0gMDsKK30JCQkJLyogRW5kIG9mIE1ENV9IYXNoICovCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgVGhlIG1lc3NhZ2UgaXMgYXBwZW5kZWQgdG8gYmxvY2suIElmIGJsb2NrIHNpemUgPiA2NCBieXRlcywgdGhlIE1ENV9IYXNoCit3aWxsIGJlIGNhbGxlZC4KKworQXJndW1lbnRzOgorICAgIHBNRDVfQ1RYICAgICAgICBQb2ludGVyIHRvIHN0cnVjdCBydF9tZDVfY3R4X3N0cnVjCisgICAgbWVzc2FnZSAgICAgICAgIE1lc3NhZ2UgY29udGV4dAorICAgIG1lc3NhZ2VMZW4gICAgICBUaGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gYnl0ZXMKKworUmV0dXJuIFZhbHVlOgorICAgIE5vbmUKKworTm90ZToKKyAgICBOb25lCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIE1ENV9BcHBlbmQoc3RydWN0IHJ0X21kNV9jdHhfc3RydWMgKnBNRDVfQ1RYLAorCQlJTiBjb25zdCB1OCBNZXNzYWdlW10sIHUzMiBNZXNzYWdlTGVuKQoreworCXUzMiBhcHBlbmRMZW4gPSAwOworCXUzMiBkaWZmTGVuID0gMDsKKworCXdoaWxlIChhcHBlbmRMZW4gIT0gTWVzc2FnZUxlbikgeworCQlkaWZmTGVuID0gTWVzc2FnZUxlbiAtIGFwcGVuZExlbjsKKwkJaWYgKChwTUQ1X0NUWC0+QmxvY2tMZW4gKyBkaWZmTGVuKSA8IE1ENV9CTE9DS19TSVpFKSB7CisJCQlOZGlzTW92ZU1lbW9yeShwTUQ1X0NUWC0+QmxvY2sgKyBwTUQ1X0NUWC0+QmxvY2tMZW4sCisJCQkJICAgICAgIE1lc3NhZ2UgKyBhcHBlbmRMZW4sIGRpZmZMZW4pOworCQkJcE1ENV9DVFgtPkJsb2NrTGVuICs9IGRpZmZMZW47CisJCQlhcHBlbmRMZW4gKz0gZGlmZkxlbjsKKwkJfSBlbHNlIHsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBNRDVfQ1RYLT5CbG9jayArIHBNRDVfQ1RYLT5CbG9ja0xlbiwKKwkJCQkgICAgICAgTWVzc2FnZSArIGFwcGVuZExlbiwKKwkJCQkgICAgICAgTUQ1X0JMT0NLX1NJWkUgLSBwTUQ1X0NUWC0+QmxvY2tMZW4pOworCQkJYXBwZW5kTGVuICs9IChNRDVfQkxPQ0tfU0laRSAtIHBNRDVfQ1RYLT5CbG9ja0xlbik7CisJCQlwTUQ1X0NUWC0+QmxvY2tMZW4gPSBNRDVfQkxPQ0tfU0laRTsKKwkJCU1ENV9IYXNoKHBNRDVfQ1RYKTsKKwkJfQkJLyogRW5kIG9mIGlmICovCisJfQkJCS8qIEVuZCBvZiB3aGlsZSAqLworCXBNRDVfQ1RYLT5NZXNzYWdlTGVuICs9IE1lc3NhZ2VMZW47Cit9CQkJCS8qIEVuZCBvZiBNRDVfQXBwZW5kICovCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgMS4gQXBwZW5kIGJpdCAxIHRvIGVuZCBvZiB0aGUgbWVzc2FnZQorICAgIDIuIEFwcGVuZCB0aGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gcmlnaHRtb3N0IDY0IGJpdHMKKyAgICAzLiBUcmFuc2Zvcm0gdGhlIEhhc2ggVmFsdWUgdG8gZGlnZXN0IG1lc3NhZ2UKKworQXJndW1lbnRzOgorICAgIHBNRDVfQ1RYICAgICAgICBQb2ludGVyIHRvIHN0cnVjdCBydF9tZDVfY3R4X3N0cnVjCisKK1JldHVybiBWYWx1ZToKKyAgICBkaWdlc3RNZXNzYWdlICAgRGlnZXN0IG1lc3NhZ2UKKworTm90ZToKKyAgICBOb25lCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIE1ENV9FbmQoc3RydWN0IHJ0X21kNV9jdHhfc3RydWMgKnBNRDVfQ1RYLCB1OCBEaWdlc3RNZXNzYWdlW10pCit7CisJdTMyIGluZGV4OworCXU2NCBtZXNzYWdlX2xlbmd0aF9iaXRzOworCisJLyogYXBwZW5kIDEgYml0cyB0byBlbmQgb2YgdGhlIG1lc3NhZ2UgKi8KKwlOZGlzRmlsbE1lbW9yeShwTUQ1X0NUWC0+QmxvY2sgKyBwTUQ1X0NUWC0+QmxvY2tMZW4sIDEsIDB4ODApOworCisJLyogNTUgPSA2NCAtIDggLSAxOiBhcHBlbmQgMSBiaXQoMSBieXRlKSBhbmQgbWVzc2FnZSBsZW5ndGggKDggYnl0ZXMpICovCisJaWYgKHBNRDVfQ1RYLT5CbG9ja0xlbiA+IDU1KQorCQlNRDVfSGFzaChwTUQ1X0NUWCk7CisJLyogRW5kIG9mIGlmICovCisKKwkvKiBBcHBlbmQgdGhlIGxlbmd0aCBvZiBtZXNzYWdlIGluIHJpZ2h0bW9zdCA2NCBiaXRzICovCisJbWVzc2FnZV9sZW5ndGhfYml0cyA9IHBNRDVfQ1RYLT5NZXNzYWdlTGVuICogODsKKwltZXNzYWdlX2xlbmd0aF9iaXRzID0gY3B1MmxlNjQobWVzc2FnZV9sZW5ndGhfYml0cyk7CisJTmRpc01vdmVNZW1vcnkoJnBNRDVfQ1RYLT5CbG9ja1s1Nl0sICZtZXNzYWdlX2xlbmd0aF9iaXRzLCA4KTsKKwlNRDVfSGFzaChwTUQ1X0NUWCk7CisKKwkvKiBSZXR1cm4gbWVzc2FnZSBkaWdlc3QsIHRyYW5zZm9ybSB0aGUgdTMyIGhhc2ggdmFsdWUgdG8gYnl0ZXMgKi8KKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA0OyBpbmRleCsrKQorCQlwTUQ1X0NUWC0+SGFzaFZhbHVlW2luZGV4XSA9CisJCSAgICBjcHUybGUzMihwTUQ1X0NUWC0+SGFzaFZhbHVlW2luZGV4XSk7CisJLyogRW5kIG9mIGZvciAqLworCU5kaXNNb3ZlTWVtb3J5KERpZ2VzdE1lc3NhZ2UsIHBNRDVfQ1RYLT5IYXNoVmFsdWUsIE1ENV9ESUdFU1RfU0laRSk7Cit9CQkJCS8qIEVuZCBvZiBNRDVfRW5kICovCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgTUQ1IGFsZ29yaXRobQorCitBcmd1bWVudHM6CisgICAgbWVzc2FnZSAgICAgICAgIE1lc3NhZ2UgY29udGV4dAorICAgIG1lc3NhZ2VMZW4gICAgICBUaGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gYnl0ZXMKKworUmV0dXJuIFZhbHVlOgorICAgIGRpZ2VzdE1lc3NhZ2UgICBEaWdlc3QgbWVzc2FnZQorCitOb3RlOgorICAgIE5vbmUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlRfTUQ1KElOIGNvbnN0IHU4IE1lc3NhZ2VbXSwKKwkgICAgdTMyIE1lc3NhZ2VMZW4sIHU4IERpZ2VzdE1lc3NhZ2VbXSkKK3sKKwlzdHJ1Y3QgcnRfbWQ1X2N0eF9zdHJ1YyBtZDVfY3R4OworCisJTmRpc1plcm9NZW1vcnkoJm1kNV9jdHgsIHNpemVvZihzdHJ1Y3QgcnRfbWQ1X2N0eF9zdHJ1YykpOworCU1ENV9Jbml0KCZtZDVfY3R4KTsKKwlNRDVfQXBwZW5kKCZtZDVfY3R4LCBNZXNzYWdlLCBNZXNzYWdlTGVuKTsKKwlNRDVfRW5kKCZtZDVfY3R4LCBEaWdlc3RNZXNzYWdlKTsKK30JCQkJLyogRW5kIG9mIFJUX01ENSAqLworCisjZW5kaWYgLyogTUQ1X1NVUFBPUlQgKi8KKworLyogRW5kIG9mIGNyeXB0X21kNS5jICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jcnlwdF9zaGEyLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jcnlwdF9zaGEyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE4M2ZiMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NyeXB0X3NoYTIuYwpAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiLi4vY3J5cHRfc2hhMi5oIgorCisvKiBCYXNpYyBvcGVyYXRpb25zICovCisjZGVmaW5lIFNIUih4LG4pICh4ID4+IG4pCS8qIFNIUih4KV5uLCByaWdodCBzaGlmdCBuIGJpdHMgLCB4IGlzIHctYml0IHdvcmQsIDAgPD0gbiA8PSB3ICovCisjZGVmaW5lIFJPVFIoeCxuLHcpICgoeCA+PiBuKSB8ICh4IDw8ICh3IC0gbikpKQkvKiBST1RSKHgpXm4sIGNpcmN1bGFyIHJpZ2h0IHNoaWZ0IG4gYml0cyAsIHggaXMgdy1iaXQgd29yZCwgMCA8PSBuIDw9IHcgKi8KKyNkZWZpbmUgUk9UTCh4LG4sdykgKCh4IDw8IG4pIHwgKHggPj4gKHcgLSBuKSkpCS8qIFJPVEwoeClebiwgY2lyY3VsYXIgbGVmdCBzaGlmdCBuIGJpdHMgLCB4IGlzIHctYml0IHdvcmQsIDAgPD0gbiA8PSB3ICovCisjZGVmaW5lIFJPVFIzMih4LG4pIFJPVFIoeCxuLDMyKQkvKiAzMiBiaXRzIHdvcmQgKi8KKyNkZWZpbmUgUk9UTDMyKHgsbikgUk9UTCh4LG4sMzIpCS8qIDMyIGJpdHMgd29yZCAqLworCisvKiBCYXNpYyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgQ2goeCx5LHopICgoeCAmIHkpIF4gKCh+eCkgJiB6KSkKKyNkZWZpbmUgTWFqKHgseSx6KSAoKHggJiB5KSBeICh4ICYgeikgXiAoeSAmIHopKQorI2RlZmluZSBQYXJpdHkoeCx5LHopICh4IF4geSBeIHopCisKKyNpZmRlZiBTSEExX1NVUFBPUlQKKy8qIFNIQTEgY29uc3RhbnRzICovCisjZGVmaW5lIFNIQTFfTUFTSyAweDAwMDAwMDBmCitzdGF0aWMgY29uc3QgdTMyIFNIQTFfS1s0XSA9IHsKKwkweDVhODI3OTk5VUwsIDB4NmVkOWViYTFVTCwgMHg4ZjFiYmNkY1VMLCAweGNhNjJjMWQ2VUwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgU0hBMV9EZWZhdWx0SGFzaFZhbHVlWzVdID0geworCTB4Njc0NTIzMDFVTCwgMHhlZmNkYWI4OVVMLCAweDk4YmFkY2ZlVUwsIDB4MTAzMjU0NzZVTCwgMHhjM2QyZTFmMFVMCit9OworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEluaXRpYWwgc3RydWN0IHJ0X3NoYTFfY3R4CisKK0FyZ3VtZW50czoKKyAgICBwU0hBX0NUWCAgICAgICAgUG9pbnRlciB0byBzdHJ1Y3QgcnRfc2hhMV9jdHgKKworUmV0dXJuIFZhbHVlOgorICAgIE5vbmUKKworTm90ZToKKyAgICBOb25lCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUX1NIQTFfSW5pdChzdHJ1Y3QgcnRfc2hhMV9jdHggKnBTSEFfQ1RYKQoreworCU5kaXNNb3ZlTWVtb3J5KHBTSEFfQ1RYLT5IYXNoVmFsdWUsIFNIQTFfRGVmYXVsdEhhc2hWYWx1ZSwKKwkJICAgICAgIHNpemVvZihTSEExX0RlZmF1bHRIYXNoVmFsdWUpKTsKKwlOZGlzWmVyb01lbW9yeShwU0hBX0NUWC0+QmxvY2ssIFNIQTFfQkxPQ0tfU0laRSk7CisJcFNIQV9DVFgtPk1lc3NhZ2VMZW4gPSAwOworCXBTSEFfQ1RYLT5CbG9ja0xlbiA9IDA7Cit9CQkJCS8qIEVuZCBvZiBSVF9TSEExX0luaXQgKi8KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBTSEExIGNvbXB1dGF0aW9uIGZvciBvbmUgYmxvY2sgKDUxMiBiaXRzKQorCitBcmd1bWVudHM6CisgICAgcFNIQV9DVFggICAgICAgIFBvaW50ZXIgdG8gc3RydWN0IHJ0X3NoYTFfY3R4CisKK1JldHVybiBWYWx1ZToKKyAgICBOb25lCisKK05vdGU6CisgICAgTm9uZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBTSEExX0hhc2goc3RydWN0IHJ0X3NoYTFfY3R4ICpwU0hBX0NUWCkKK3sKKwl1MzIgV19pLCB0LCBzOworCXUzMiBXWzE2XTsKKwl1MzIgYSwgYiwgYywgZCwgZSwgVCwgZl90ID0gMDsKKworCS8qIFByZXBhcmUgdGhlIG1lc3NhZ2Ugc2NoZWR1bGUsIHtXX2l9LCAwIDwgdCA8IDE1ICovCisJTmRpc01vdmVNZW1vcnkoVywgcFNIQV9DVFgtPkJsb2NrLCBTSEExX0JMT0NLX1NJWkUpOworCWZvciAoV19pID0gMDsgV19pIDwgMTY7IFdfaSsrKQorCQlXW1dfaV0gPSBjcHUyYmUzMihXW1dfaV0pOwkvKiBFbmRpYW4gU3dhcCAqLworCS8qIEVuZCBvZiBmb3IgKi8KKworCS8qIFNIQTI1NiBoYXNoIGNvbXB1dGF0aW9uICovCisJLyogSW5pdGlhbGl6ZSB0aGUgd29ya2luZyB2YXJpYWJsZXMgKi8KKwlhID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVswXTsKKwliID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVsxXTsKKwljID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVsyXTsKKwlkID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVszXTsKKwllID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVs0XTsKKworCS8qIDgwIHJvdW5kcyAqLworCWZvciAodCA9IDA7IHQgPCA4MDsgdCsrKSB7CisJCXMgPSB0ICYgU0hBMV9NQVNLOworCQlpZiAodCA+IDE1KSB7CS8qIFByZXBhcmUgdGhlIG1lc3NhZ2Ugc2NoZWR1bGUsIHtXX2l9LCAxNiA8IHQgPCA3OSAqLworCQkJV1tzXSA9CisJCQkgICAgKFdbKHMgKyAxMykgJiBTSEExX01BU0tdKSBeIChXWyhzICsgOCkgJiBTSEExX01BU0tdKQorCQkJICAgIF4gKFdbKHMgKyAyKSAmIFNIQTFfTUFTS10pIF4gV1tzXTsKKwkJCVdbc10gPSBST1RMMzIoV1tzXSwgMSk7CisJCX0JCS8qIEVuZCBvZiBpZiAqLworCQlzd2l0Y2ggKHQgLyAyMCkgeworCQljYXNlIDA6CisJCQlmX3QgPSBDaChiLCBjLCBkKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlmX3QgPSBQYXJpdHkoYiwgYywgZCk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJZl90ID0gTWFqKGIsIGMsIGQpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWZfdCA9IFBhcml0eShiLCBjLCBkKTsKKwkJCWJyZWFrOworCQl9CQkvKiBFbmQgb2Ygc3dpdGNoICovCisJCVQgPSBST1RMMzIoYSwgNSkgKyBmX3QgKyBlICsgU0hBMV9LW3QgLyAyMF0gKyBXW3NdOworCQllID0gZDsKKwkJZCA9IGM7CisJCWMgPSBST1RMMzIoYiwgMzApOworCQliID0gYTsKKwkJYSA9IFQ7CisJfQkJCS8qIEVuZCBvZiBmb3IgKi8KKworCS8qIENvbXB1dGUgdGhlIGledGggaW50ZXJtZWRpYXRlIGhhc2ggdmFsdWUgSF4oaSkgKi8KKwlwU0hBX0NUWC0+SGFzaFZhbHVlWzBdICs9IGE7CisJcFNIQV9DVFgtPkhhc2hWYWx1ZVsxXSArPSBiOworCXBTSEFfQ1RYLT5IYXNoVmFsdWVbMl0gKz0gYzsKKwlwU0hBX0NUWC0+SGFzaFZhbHVlWzNdICs9IGQ7CisJcFNIQV9DVFgtPkhhc2hWYWx1ZVs0XSArPSBlOworCisJTmRpc1plcm9NZW1vcnkocFNIQV9DVFgtPkJsb2NrLCBTSEExX0JMT0NLX1NJWkUpOworCXBTSEFfQ1RYLT5CbG9ja0xlbiA9IDA7Cit9CQkJCS8qIEVuZCBvZiBTSEExX0hhc2ggKi8KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBUaGUgbWVzc2FnZSBpcyBhcHBlbmRlZCB0byBibG9jay4gSWYgYmxvY2sgc2l6ZSA+IDY0IGJ5dGVzLCB0aGUgU0hBMV9IYXNoCit3aWxsIGJlIGNhbGxlZC4KKworQXJndW1lbnRzOgorICAgIHBTSEFfQ1RYICAgICAgICBQb2ludGVyIHRvIHN0cnVjdCBydF9zaGExX2N0eAorICAgIG1lc3NhZ2UgICAgICAgICBNZXNzYWdlIGNvbnRleHQKKyAgICBtZXNzYWdlTGVuICAgICAgVGhlIGxlbmd0aCBvZiBtZXNzYWdlIGluIGJ5dGVzCisKK1JldHVybiBWYWx1ZToKKyAgICBOb25lCisKK05vdGU6CisgICAgTm9uZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBTSEExX0FwcGVuZChzdHJ1Y3QgcnRfc2hhMV9jdHggKnBTSEFfQ1RYLAorCQkgSU4gY29uc3QgdTggTWVzc2FnZVtdLCB1MzIgTWVzc2FnZUxlbikKK3sKKwl1MzIgYXBwZW5kTGVuID0gMDsKKwl1MzIgZGlmZkxlbiA9IDA7CisKKwl3aGlsZSAoYXBwZW5kTGVuICE9IE1lc3NhZ2VMZW4pIHsKKwkJZGlmZkxlbiA9IE1lc3NhZ2VMZW4gLSBhcHBlbmRMZW47CisJCWlmICgocFNIQV9DVFgtPkJsb2NrTGVuICsgZGlmZkxlbikgPCBTSEExX0JMT0NLX1NJWkUpIHsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBTSEFfQ1RYLT5CbG9jayArIHBTSEFfQ1RYLT5CbG9ja0xlbiwKKwkJCQkgICAgICAgTWVzc2FnZSArIGFwcGVuZExlbiwgZGlmZkxlbik7CisJCQlwU0hBX0NUWC0+QmxvY2tMZW4gKz0gZGlmZkxlbjsKKwkJCWFwcGVuZExlbiArPSBkaWZmTGVuOworCQl9IGVsc2UgeworCQkJTmRpc01vdmVNZW1vcnkocFNIQV9DVFgtPkJsb2NrICsgcFNIQV9DVFgtPkJsb2NrTGVuLAorCQkJCSAgICAgICBNZXNzYWdlICsgYXBwZW5kTGVuLAorCQkJCSAgICAgICBTSEExX0JMT0NLX1NJWkUgLSBwU0hBX0NUWC0+QmxvY2tMZW4pOworCQkJYXBwZW5kTGVuICs9IChTSEExX0JMT0NLX1NJWkUgLSBwU0hBX0NUWC0+QmxvY2tMZW4pOworCQkJcFNIQV9DVFgtPkJsb2NrTGVuID0gU0hBMV9CTE9DS19TSVpFOworCQkJU0hBMV9IYXNoKHBTSEFfQ1RYKTsKKwkJfQkJLyogRW5kIG9mIGlmICovCisJfQkJCS8qIEVuZCBvZiB3aGlsZSAqLworCXBTSEFfQ1RYLT5NZXNzYWdlTGVuICs9IE1lc3NhZ2VMZW47Cit9CQkJCS8qIEVuZCBvZiBTSEExX0FwcGVuZCAqLworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIDEuIEFwcGVuZCBiaXQgMSB0byBlbmQgb2YgdGhlIG1lc3NhZ2UKKyAgICAyLiBBcHBlbmQgdGhlIGxlbmd0aCBvZiBtZXNzYWdlIGluIHJpZ2h0bW9zdCA2NCBiaXRzCisgICAgMy4gVHJhbnNmb3JtIHRoZSBIYXNoIFZhbHVlIHRvIGRpZ2VzdCBtZXNzYWdlCisKK0FyZ3VtZW50czoKKyAgICBwU0hBX0NUWCAgICAgICAgUG9pbnRlciB0byBzdHJ1Y3QgcnRfc2hhMV9jdHgKKworUmV0dXJuIFZhbHVlOgorICAgIGRpZ2VzdE1lc3NhZ2UgICBEaWdlc3QgbWVzc2FnZQorCitOb3RlOgorICAgIE5vbmUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgU0hBMV9FbmQoc3RydWN0IHJ0X3NoYTFfY3R4ICpwU0hBX0NUWCwgdTggRGlnZXN0TWVzc2FnZVtdKQoreworCXUzMiBpbmRleDsKKwl1NjQgbWVzc2FnZV9sZW5ndGhfYml0czsKKworCS8qIEFwcGVuZCBiaXQgMSB0byBlbmQgb2YgdGhlIG1lc3NhZ2UgKi8KKwlOZGlzRmlsbE1lbW9yeShwU0hBX0NUWC0+QmxvY2sgKyBwU0hBX0NUWC0+QmxvY2tMZW4sIDEsIDB4ODApOworCisJLyogNTUgPSA2NCAtIDggLSAxOiBhcHBlbmQgMSBiaXQoMSBieXRlKSBhbmQgbWVzc2FnZSBsZW5ndGggKDggYnl0ZXMpICovCisJaWYgKHBTSEFfQ1RYLT5CbG9ja0xlbiA+IDU1KQorCQlTSEExX0hhc2gocFNIQV9DVFgpOworCS8qIEVuZCBvZiBpZiAqLworCisJLyogQXBwZW5kIHRoZSBsZW5ndGggb2YgbWVzc2FnZSBpbiByaWdodG1vc3QgNjQgYml0cyAqLworCW1lc3NhZ2VfbGVuZ3RoX2JpdHMgPSBwU0hBX0NUWC0+TWVzc2FnZUxlbiAqIDg7CisJbWVzc2FnZV9sZW5ndGhfYml0cyA9IGNwdTJiZTY0KG1lc3NhZ2VfbGVuZ3RoX2JpdHMpOworCU5kaXNNb3ZlTWVtb3J5KCZwU0hBX0NUWC0+QmxvY2tbNTZdLCAmbWVzc2FnZV9sZW5ndGhfYml0cywgOCk7CisJU0hBMV9IYXNoKHBTSEFfQ1RYKTsKKworCS8qIFJldHVybiBtZXNzYWdlIGRpZ2VzdCwgdHJhbnNmb3JtIHRoZSB1MzIgaGFzaCB2YWx1ZSB0byBieXRlcyAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IDU7IGluZGV4KyspCisJCXBTSEFfQ1RYLT5IYXNoVmFsdWVbaW5kZXhdID0KKwkJICAgIGNwdTJiZTMyKHBTSEFfQ1RYLT5IYXNoVmFsdWVbaW5kZXhdKTsKKwkvKiBFbmQgb2YgZm9yICovCisJTmRpc01vdmVNZW1vcnkoRGlnZXN0TWVzc2FnZSwgcFNIQV9DVFgtPkhhc2hWYWx1ZSwgU0hBMV9ESUdFU1RfU0laRSk7Cit9CQkJCS8qIEVuZCBvZiBTSEExX0VuZCAqLworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFNIQTEgYWxnb3JpdGhtCisKK0FyZ3VtZW50czoKKyAgICBtZXNzYWdlICAgICAgICAgTWVzc2FnZSBjb250ZXh0CisgICAgbWVzc2FnZUxlbiAgICAgIFRoZSBsZW5ndGggb2YgbWVzc2FnZSBpbiBieXRlcworCitSZXR1cm4gVmFsdWU6CisgICAgZGlnZXN0TWVzc2FnZSAgIERpZ2VzdCBtZXNzYWdlCisKK05vdGU6CisgICAgTm9uZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVF9TSEExKElOIGNvbnN0IHU4IE1lc3NhZ2VbXSwKKwkgICAgIHUzMiBNZXNzYWdlTGVuLCB1OCBEaWdlc3RNZXNzYWdlW10pCit7CisKKwlzdHJ1Y3QgcnRfc2hhMV9jdHggc2hhX2N0eDsKKworCU5kaXNaZXJvTWVtb3J5KCZzaGFfY3R4LCBzaXplb2Yoc3RydWN0IHJ0X3NoYTFfY3R4KSk7CisJUlRfU0hBMV9Jbml0KCZzaGFfY3R4KTsKKwlTSEExX0FwcGVuZCgmc2hhX2N0eCwgTWVzc2FnZSwgTWVzc2FnZUxlbik7CisJU0hBMV9FbmQoJnNoYV9jdHgsIERpZ2VzdE1lc3NhZ2UpOworfQkJCQkvKiBFbmQgb2YgUlRfU0hBMSAqLworI2VuZGlmIC8qIFNIQTFfU1VQUE9SVCAqLworCisvKiBFbmQgb2YgY3J5cHRfc2hhMi5jICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9kZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2Rmcy5jCmluZGV4IDIzMzMwZjIuLjcxY2JiMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2Rmcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2Rmcy5jCkBAIC0zMywxNjQgKzMzLDEwIEBACiAgICAgUmV2aXNpb24gSGlzdG9yeToKICAgICBXaG8gICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKICAgICAtLS0tLS0tLSAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBGb25jaGkgICAgMDMtMTItMjAwNyAgICAgIGNyZWF0ZWQKICovCiAKICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKIAotdHlwZWRlZiBzdHJ1Y3QgX1JBREFSX0RVUkFUSU9OX1RBQkxFCi17Ci0JVUxPTkcgUkREdXJSZWdpb247Ci0JVUxPTkcgUmFkYXJTaWduYWxEdXJhdGlvbjsKLQlVTE9ORyBUb2xlcmFuY2U7Ci19IFJBREFSX0RVUkFUSU9OX1RBQkxFLCAqUFJBREFSX0RVUkFUSU9OX1RBQkxFOwotCi0KLXN0YXRpYyBVQ0hBUiBSZElkbGVUaW1lVGFibGVbTUFYX1JEX1JFR0lPTl1bNF0gPQotewotCXs5LCAyNTAsIDI1MCwgMjUwfSwJCS8vIENFCi0JezQsIDI1MCwgMjUwLCAyNTB9LAkJLy8gRkNDCi0JezQsIDI1MCwgMjUwLCAyNTB9LAkJLy8gSkFQCi0JezE1LCAyNTAsIDI1MCwgMjUwfSwJLy8gSkFQX1c1MwotCXs0LCAyNTAsIDI1MCwgMjUwfQkJLy8gSkFQX1c1NgotfTsKLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUJicCBSYWRhciBkZXRlY3Rpb24gcm91dGluZQotCi0JQXJndW1lbnRzOgotCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQmJwUmFkYXJEZXRlY3Rpb25TdGFydCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlVSU5UOCBSYWRhclBlcmlvZDsKLQotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMTQsIDB4MDIpOwotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjEsIDB4MjApOwotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjIsIDB4MDApOwotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjMsIDB4MDgvKjB4ODAqLyk7Ci0JUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIDEyNCwgMHgyOCk7Ci0JUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIDEyNSwgMHhmZik7Ci0KLQlSYWRhclBlcmlvZCA9ICgoVUlOVClSZElkbGVUaW1lVGFibGVbcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb25dWzBdICsgKFVJTlQpcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUpIDwgMjUwID8KLQkJCShSZElkbGVUaW1lVGFibGVbcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb25dWzBdICsgcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUpIDogMjUwOwotCi0JUlRNUF9JT19XUklURTgocEFkLCAweDcwMjAsIDB4MWQpOwotCVJUTVBfSU9fV1JJVEU4KHBBZCwgMHg3MDIxLCAweDQwKTsKLQotCVJhZGFyRGV0ZWN0aW9uU3RhcnQocEFkLCAwLCBSYWRhclBlcmlvZCk7Ci0JcmV0dXJuOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQmJwIFJhZGFyIGRldGVjdGlvbiByb3V0aW5lCi0KLQlBcmd1bWVudHM6Ci0JCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBCYnBSYWRhckRldGVjdGlvblN0b3AoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JUlRNUF9JT19XUklURTgocEFkLCAweDcwMjAsIDB4MWQpOwotCVJUTVBfSU9fV1JJVEU4KHBBZCwgMHg3MDIxLCAweDYwKTsKLQotCVJhZGFyRGV0ZWN0aW9uU3RvcChwQWQpOwotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVJhZGFyIGRldGVjdGlvbiByb3V0aW5lCi0KLQlBcmd1bWVudHM6Ci0JCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSYWRhckRldGVjdGlvblN0YXJ0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIEJPT0xFQU4gQ1RTUHJvdGVjdCwKLQlJTiBVSU5UOCBDVFNQZXJpb2QpCi17Ci0JVUlOVDggRGZzQWN0aXZlVGltZSA9IChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSAmIDB4MWYpOwotCVVJTlQ4IEN0c1Byb3RlY3QgPSAoQ1RTUHJvdGVjdCA9PSAxKSA/IDB4MDIgOiAweDAxOyAvLyBDVFMgcHJvdGVjdC4KLQotCWlmIChDVFNQcm90ZWN0ICE9IDApCi0JewotCQlzd2l0Y2gocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24pCi0JCXsKLQkJY2FzZSBGQ0M6Ci0JCWNhc2UgSkFQX1c1NjoKLQkJCUN0c1Byb3RlY3QgPSAweDAzOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRToKLQkJY2FzZSBKQVBfVzUzOgotCQlkZWZhdWx0OgotCQkJQ3RzUHJvdGVjdCA9IDB4MDI7Ci0JCQlicmVhazsKLQkJfQotCX0KLQllbHNlCi0JCUN0c1Byb3RlY3QgPSAweDAxOwotCi0KLQkvLyBzZW5kIHN0YXJ0LVJEIHdpdGggQ1RTIHByb3RlY3Rpb24gY29tbWFuZCB0byBNQ1UKLQkvLyBoaWdoYnl0ZSBbN10JCXJlc2VydmUKLQkvLyBoaWdoYnl0ZSBbNjo1XQkweDogc3RvcCBDYXJyaWVyL1JhZGFyIGRldGVjdGlvbgotCS8vIGhpZ2hieXRlIFsxMF06CVN0YXJ0IENhcnJpZXIvUmFkYXIgZGV0ZWN0aW9uIHdpdGhvdXQgQ1RTIHByb3RlY3Rpb24sIDExOiBTdGFydCBDYXJyaWVyL1JhZGFyIGRldGVjdGlvbiB3aXRoIENUUyBwcm90ZWN0aW9uCi0JLy8gaGlnaGJ5dGUgWzQ6MF0JUmFkYXIvY2FycmllciBkZXRlY3Rpb24gZHVyYXRpb24uIEluIDFtcy4KLQotCS8vIGxvd2J5dGUgWzc6MF0JUmFkYXIvY2FycmllciBkZXRlY3Rpb24gcGVyaW9kLCBpbiAxbXMuCi0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDYwLCAweGZmLCBDVFNQZXJpb2QsIERmc0FjdGl2ZVRpbWUgfCAoQ3RzUHJvdGVjdCA8PCA1KSk7Ci0JLy9Bc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NjMsIDB4ZmYsIDEwLCAwKTsKLQotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVJhZGFyIGRldGVjdGlvbiByb3V0aW5lCi0KLQlBcmd1bWVudHM6Ci0JCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlUUlVFCUZvdW5kIHJhZGFyIHNpZ25hbAotCQlGQUxTRQlOb3QgZm91bmQgcmFkYXIgc2lnbmFsCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJhZGFyRGV0ZWN0aW9uU3RvcCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJhZGFyRGV0ZWN0aW9uU3RvcC5cbiIpKTsKLQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NjAsIDB4ZmYsIDB4MDAsIDB4MDApOwkvLyBzZW5kIHN0YXJ0LVJEIHdpdGggQ1RTIHByb3RlY3Rpb24gY29tbWFuZCB0byBNQ1UKLQotCXJldHVybjsKLX0KLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMjA2LDIyNyArNTIsMTcgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLUJPT0xFQU4gUmFkYXJDaGFubmVsQ2hlY2soCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUNIQVIJCQlDaCkKK0JPT0xFQU4gUmFkYXJDaGFubmVsQ2hlY2soc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBDaCkKIHsKLSNpZiAxCi0JSU5UCQlpOworCWludCBpOwogCUJPT0xFQU4gcmVzdWx0ID0gRkFMU0U7CiAKLQlmb3IgKGk9MDsgaTxwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspCi0JewotCQlpZiAoQ2ggPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQotCQl7CisJZm9yIChpID0gMDsgaSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykgeworCQlpZiAoQ2ggPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKSB7CiAJCQlyZXN1bHQgPSBwQWQtPkNoYW5uZWxMaXN0W2ldLkRmc1JlcTsKIAkJCWJyZWFrOwogCQl9CiAJfQogCiAJcmV0dXJuIHJlc3VsdDsKLSNlbHNlCi0JSU5UCQlpOwotCVVDSEFSCUNoYW5uZWxbMTVdPXs1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDB9OwotCi0JZm9yIChpPTA7IGk8MTU7IGkrKykKLQl7Ci0JCWlmIChDaCA9PSBDaGFubmVsW2ldKQotCQl7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChpICE9IDE1KQotCQlyZXR1cm4gVFJVRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsKLSNlbmRpZgogfQotCi1VTE9ORyBKYXBSYWRhclR5cGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JVUxPTkcJCWk7Ci0JY29uc3QgVUNIQVIJQ2hhbm5lbFsxNV09ezUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH07Ci0KLQlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gIT0gSkFQKQotCXsKLQkJcmV0dXJuIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uOwotCX0KLQotCWZvciAoaT0wOyBpPDE1OyBpKyspCi0JewotCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9PSBDaGFubmVsW2ldKQotCQl7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChpIDwgNCkKLQkJcmV0dXJuIEpBUF9XNTM7Ci0JZWxzZSBpZiAoaSA8IDE1KQotCQlyZXR1cm4gSkFQX1c1NjsKLQllbHNlCi0JCXJldHVybiBKQVA7IC8vIFc1MgotCi19Ci0KLVVMT05HIFJUTVBCYnBSZWFkUmFkYXJEdXJhdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVSU5UOCBieXRlVmFsdWUgPSAwOwotCVVMT05HIHJlc3VsdDsKLQotCUJCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjExNSwgJmJ5dGVWYWx1ZSk7Ci0KLQlyZXN1bHQgPSAwOwotCXN3aXRjaCAoYnl0ZVZhbHVlKQotCXsKLQljYXNlIDE6IC8vIHJhZGFyIHNpZ25hbCBkZXRlY3RlZCBieSBwdWxzZSBtb2RlLgotCWNhc2UgMjogLy8gcmFkYXIgc2lnbmFsIGRldGVjdGVkIGJ5IHdpZHRoIG1vZGUuCi0JCXJlc3VsdCA9IFJUTVBSZWFkUmFkYXJEdXJhdGlvbihwQWQpOwotCQlicmVhazsKLQotCWNhc2UgMDogLy8gTm8gcmFkYXIgc2lnbmFsLgotCWRlZmF1bHQ6Ci0KLQkJcmVzdWx0ID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotVUxPTkcgUlRNUFJlYWRSYWRhckR1cmF0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotCVVMT05HIHJlc3VsdCA9IDA7Ci0KLQlyZXR1cm4gcmVzdWx0OwotCi19Ci0KLVZPSUQgUlRNUENsZWFuUmFkYXJEdXJhdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlyZXR1cm47Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICAgICAgUmFkYXIgd2F2ZSBkZXRlY3Rpb24uIFRoZSBBUEkgc2hvdWxkIGJlIGludm9rZSBlYWNoIHNlY29uZC4KLQotICAgIEFyZ3VtZW50czoKLSAgICAgICAgcEFkICAgICAgICAgLSBBZGFwdGVyIHBvaW50ZXIKLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgTm9uZQotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBcFJhZGFyRGV0ZWN0UGVyaW9kaWMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JSU5UCWk7Ci0KLQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5JblNlcnZpY2VNb25pdG9yQ291bnQrKzsKLQotCWZvciAoaT0wOyBpPHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykKLQl7Ci0JCWlmIChwQWQtPkNoYW5uZWxMaXN0W2ldLlJlbWFpbmluZ1RpbWVGb3JVc2UgPiAwKQotCQl7Ci0JCQlwQWQtPkNoYW5uZWxMaXN0W2ldLlJlbWFpbmluZ1RpbWVGb3JVc2UgLS07Ci0JCQlpZiAoKHBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kJTUpID09IDApCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFkYXJEZXRlY3RQZXJpb2RpYyAtIGNoPSVkLCBSZW1haW5pbmdUaW1lRm9yVXNlPSVkXG4iLCBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLy9yYWRhciBkZXRlY3QKLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKLQkJJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpCi0JCSYmIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpCi0JewotCQlSYWRhckRldGVjdFBlcmlvZGljKHBBZCk7Ci0JfQotCi0JcmV0dXJuOwotfQotCi0vLyBQZXJpb2RpYyBSYWRhciBkZXRlY3Rpb24sIHN3aXRjaCBjaGFubmVsIHdpbGwgb2NjdXIgaW4gUlRNUEhhbmRsZVRCVFRJbnRlcnJ1cHQoKQotLy8gQmVmb3JlIHN3aXRjaCBjaGFubmVsLCBkcml2ZXIgbmVlZHMgZG9pbmcgY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50LgotVk9JRCBSYWRhckRldGVjdFBlcmlvZGljKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotCS8vIG5lZWQgdG8gY2hlY2sgY2hhbm5lbCBhdmFpbGFiaWxpdHksIGFmdGVyIHN3aXRjaCBjaGFubmVsCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9TSUxFTkNFX01PREUpCi0JCQlyZXR1cm47Ci0KLQkvLyBjaGFubmVsIGF2YWlsYWJpbGl0eSBjaGVjayB0aW1lIGlzIDYwc2VjLCB1c2UgNjUgZm9yIGFzc3VyYW5jZQotCWlmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRENvdW50KysgPiBwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DaE1vdmluZ1RpbWUpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOb3QgZm91bmQgcmFkYXIgc2lnbmFsLCBzdGFydCBzZW5kIGJlYWNvbiBhbmQgcmFkYXIgZGV0ZWN0aW9uIGluIHNlcnZpY2UgbW9uaXRvclxuXG4iKSk7Ci0JCQlCYnBSYWRhckRldGVjdGlvblN0b3AocEFkKTsKLQkJQXNpY0VuYWJsZUJzc1N5bmMocEFkKTsKLQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0gUkRfTk9STUFMX01PREU7Ci0KLQotCQlyZXR1cm47Ci0JfQotCi0JcmV0dXJuOwotfQotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLQkJY2hhbmdlIGNoYW5uZWwgbW92aW5nIHRpbWUgZm9yIERGUyB0ZXN0aW5nLgotCi0JQXJndW1lbnRzOgotCSAgICBwQWRhcHRlciAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCSAgICB3cnEgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW9jdGwgYXJndW1lbnQKLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgTm9uZQotCi0gICAgTm90ZToKLSAgICAgICAgVXNhZ2U6Ci0gICAgICAgICAgICAgICAxLikgaXdwcml2IHJhMCBzZXQgQ2hNb3ZUaW1lPVt2YWx1ZV0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBTZXRfQ2hNb3ZpbmdUaW1lX1Byb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIGFyZykKLXsKLQlVSU5UOCBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNoTW92aW5nVGltZSA9IFZhbHVlOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OiAlZFxuIiwgX19mdW5jX18sCi0JCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNoTW92aW5nVGltZSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVCBTZXRfTG9uZ1B1bHNlUmFkYXJUaF9Qcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBhcmcpCi17Ci0JVUlOVDggVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPiAxMCA/IDEwIDogc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkxvbmdQdWxzZVJhZGFyVGggPSBWYWx1ZTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjogJWRcbiIsIF9fZnVuY19fLAotCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5Mb25nUHVsc2VSYWRhclRoKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9lZV9lZnVzZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZWVfZWZ1c2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzQxMmY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZWVfZWZ1c2UuYwpAQCAtMCwwICsxLDM0NCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwllZV9lZnVzZS5jCisKKwlBYnN0cmFjdDoKKwlNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisJLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZQkiLi4vcnRfY29uZmlnLmgiCisKKyNkZWZpbmUgRUZVU0VfVVNBR0VfTUFQX1NUQVJUCTB4MmQwCisjZGVmaW5lIEVGVVNFX1VTQUdFX01BUF9FTkQJCTB4MmZjCisjZGVmaW5lIEVGVVNFX1VTQUdFX01BUF9TSVpFCTQ1CisKKyNkZWZpbmUgRUZVU0VfRUVQUk9NX0RFRlVMVF9GSUxFCSJSVDMweHhFRVBST00uYmluIgorI2RlZmluZSBNQVhfRUVQUk9NX0JJTl9GSUxFX1NJWkUJMTAyNAorCisjZGVmaW5lIEVGVVNFX1RBRwkJCQkweDJmZQorCit0eXBlZGVmIHVuaW9uIF9FRlVTRV9DVFJMX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgRUZTUk9NX0FPVVQ6NjsKKwkJdTMyIEVGU1JPTV9NT0RFOjI7CisJCXUzMiBFRlNST01fTERPX09GRl9USU1FOjY7CisJCXUzMiBFRlNST01fTERPX09OX1RJTUU6MjsKKwkJdTMyIEVGU1JPTV9BSU46MTA7CisJCXUzMiBSRVNFUlZFRDo0OworCQl1MzIgRUZTUk9NX0tJQ0s6MTsKKwkJdTMyIFNFTF9FRlVTRToxOworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IEVGVVNFX0NUUkxfU1RSVUMsICpQRUZVU0VfQ1RSTF9TVFJVQzsKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3U4IGVGdXNlUmVhZFJlZ2lzdGVycyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgdTE2IE9mZnNldCwgdTE2IExlbmd0aCwgdTE2ICogcERhdGEpCit7CisJRUZVU0VfQ1RSTF9TVFJVQyBlRnVzZUN0cmxTdHJ1YzsKKwlpbnQgaTsKKwl1MTYgZWZ1c2VEYXRhT2Zmc2V0OworCXUzMiBkYXRhOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAmZUZ1c2VDdHJsU3RydWMud29yZCk7CisKKwkvKlN0ZXAwLiBXcml0ZSAxMC1iaXQgb2YgYWRkcmVzcyB0byBFRlNST01fQUlOICgweDU4MCwgYml0MjU6Yml0MTYpLiBUaGUgYWRkcmVzcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25tZW50LiAqLworCS8qVXNlIHRoZSBlZXByb20gbG9naWNhbCBhZGRyZXNzIGFuZCBjb3ZlcnQgdG8gYWRkcmVzcyB0byBibG9jayBudW1iZXIgKi8KKwllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fQUlOID0gT2Zmc2V0ICYgMHhmZmYwOworCisJLypTdGVwMS4gV3JpdGUgRUZTUk9NX01PREUgKDB4NTgwLCBiaXQ3OmJpdDYpIHRvIDAuICovCisJZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX01PREUgPSAwOworCisJLypTdGVwMi4gV3JpdGUgRUZTUk9NX0tJQ0sgKDB4NTgwLCBiaXQzMCkgdG8gMSB0byBraWNrLW9mZiBwaHlzaWNhbCByZWFkIHByb2NlZHVyZS4gKi8KKwllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fS0lDSyA9IDE7CisKKwlOZGlzTW92ZU1lbW9yeSgmZGF0YSwgJmVGdXNlQ3RybFN0cnVjLCA0KTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRlVTRV9DVFJMLCBkYXRhKTsKKworCS8qU3RlcDMuIFBvbGxpbmcgRUZTUk9NX0tJQ0soMHg1ODAsIGJpdDMwKSB1bnRpbCBpdCBiZWNvbWUgMCBhZ2Fpbi4gKi8KKwlpID0gMDsKKwl3aGlsZSAoaSA8IDUwMCkgeworCQkvKnJ0bXAuSHdNZW1vcnlSZWFkRHdvcmQoRUZVU0VfQ1RSTCwgKERXT1JEICopICZlRnVzZUN0cmxTdHJ1YywgNCk7ICovCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRUZVU0VfQ1RSTCwgJmVGdXNlQ3RybFN0cnVjLndvcmQpOworCQlpZiAoZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKwkJUlRNUHVzZWNEZWxheSgyKTsKKwkJaSsrOworCX0KKworCS8qaWYgRUZTUk9NX0FPVVQgaXMgbm90IGZvdW5kIGluIHBoeXNpY2FsIGFkZHJlc3MsIHdyaXRlIDB4ZmZmZiAqLworCWlmIChlRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fQU9VVCA9PSAweDNmKSB7CisJCWZvciAoaSA9IDA7IGkgPCBMZW5ndGggLyAyOyBpKyspCisJCQkqKHBEYXRhICsgMiAqIGkpID0gMHhmZmZmOworCX0gZWxzZSB7CisJCS8qU3RlcDQuIFJlYWQgMTYtYnl0ZSBvZiBkYXRhIGZyb20gRUZVU0VfREFUQTAtMyAoMHg1OTAtMHg1OUMpICovCisJCWVmdXNlRGF0YU9mZnNldCA9IEVGVVNFX0RBVEEzIC0gKE9mZnNldCAmIDB4Qyk7CisJCS8qZGF0YSBob2xkIDQgYnl0ZXMgZGF0YS4gKi8KKwkJLypJbiBSVE1QX0lPX1JFQUQzMiB3aWxsIGF1dG9tYXRpY2FsbHkgZXhlY3V0ZSAzMi1ieXRlcyBzd2FwcGluZyAqLworCQlSVE1QX0lPX1JFQUQzMihwQWQsIGVmdXNlRGF0YU9mZnNldCwgJmRhdGEpOworCQkvKkRlY2lkZSB0aGUgdXBwZXIgMiBieXRlcyBvciB0aGUgYm90dG9tIDIgYnl0ZXMuICovCisJCS8qIExpdHRsZS1lbmRpYW4gICAgICAgICAgICAgICAgUyAgICAgICB8ICAgICAgIFMgICAgICAgQmlnLWVuZGlhbiAqLworCQkvKiBhZGRyIDMgICAgICAgMiAgICAgICAxICAgICAgIDAgICAgICAgfCAgICAgICAwICAgICAgIDEgICAgICAgMiAgICAgICAzICovCisJCS8qIE9yaS1WICAgICAgICBEICAgICAgIEMgICAgICAgQiAgICAgICBBICAgICAgIHwgICAgICAgQSAgICAgICBCICAgICAgIEMgICAgICAgRCAqLworCQkvKkFmdGVyIHN3YXBwaW5nICovCisJCS8qICAgICAgICAgICAgICBEICAgICAgIEMgICAgICAgQiAgICAgICBBICAgICAgIHwgICAgICAgRCAgICAgICBDICAgICAgIEIgICAgICAgQSAqLworCQkvKlJldHVybiAyLWJ5dGVzICovCisJCS8qVGhlIHJldHVybiBieXRlIHN0YXRycyBmcm9tIFMuIFRoZXJlZm9yZSwgdGhlIGxpdHRsZS1lbmRpYW4gd2lsbCByZXR1cm4gQkEsIHRoZSBCaWctZW5kaWFuIHdpbGwgcmV0dXJuIERDLiAqLworCQkvKkZvciByZXR1cm5pbmcgdGhlIGJvdHRvbSAyIGJ5dGVzLCB0aGUgQmlnLWVuZGlhbiBzaG91bGQgc2hpZnQgcmlnaHQgMi1ieXRlcy4gKi8KKwkJZGF0YSA9IGRhdGEgPj4gKDggKiAoT2Zmc2V0ICYgMHgzKSk7CisKKwkJTmRpc01vdmVNZW1vcnkocERhdGEsICZkYXRhLCBMZW5ndGgpOworCX0KKworCXJldHVybiAodTgpZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0FPVVQ7CisKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgZUZ1c2VQaHlzaWNhbFJlYWRSZWdpc3RlcnMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCXUxNiBPZmZzZXQsCisJCQkJdTE2IExlbmd0aCwgdTE2ICogcERhdGEpCit7CisJRUZVU0VfQ1RSTF9TVFJVQyBlRnVzZUN0cmxTdHJ1YzsKKwlpbnQgaTsKKwl1MTYgZWZ1c2VEYXRhT2Zmc2V0OworCXUzMiBkYXRhOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAmZUZ1c2VDdHJsU3RydWMud29yZCk7CisKKwkvKlN0ZXAwLiBXcml0ZSAxMC1iaXQgb2YgYWRkcmVzcyB0byBFRlNST01fQUlOICgweDU4MCwgYml0MjU6Yml0MTYpLiBUaGUgYWRkcmVzcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25tZW50LiAqLworCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9BSU4gPSBPZmZzZXQgJiAweGZmZjA7CisKKwkvKlN0ZXAxLiBXcml0ZSBFRlNST01fTU9ERSAoMHg1ODAsIGJpdDc6Yml0NikgdG8gMS4gKi8KKwkvKlJlYWQgaW4gcGh5c2ljYWwgdmlldyAqLworCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9NT0RFID0gMTsKKworCS8qU3RlcDIuIFdyaXRlIEVGU1JPTV9LSUNLICgweDU4MCwgYml0MzApIHRvIDEgdG8ga2ljay1vZmYgcGh5c2ljYWwgcmVhZCBwcm9jZWR1cmUuICovCisJZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPSAxOworCisJTmRpc01vdmVNZW1vcnkoJmRhdGEsICZlRnVzZUN0cmxTdHJ1YywgNCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgRUZVU0VfQ1RSTCwgZGF0YSk7CisKKwkvKlN0ZXAzLiBQb2xsaW5nIEVGU1JPTV9LSUNLKDB4NTgwLCBiaXQzMCkgdW50aWwgaXQgYmVjb21lIDAgYWdhaW4uICovCisJaSA9IDA7CisJd2hpbGUgKGkgPCA1MDApIHsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAmZUZ1c2VDdHJsU3RydWMud29yZCk7CisJCWlmIChlRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fS0lDSyA9PSAwKQorCQkJYnJlYWs7CisJCVJUTVB1c2VjRGVsYXkoMik7CisJCWkrKzsKKwl9CisKKwkvKlN0ZXA0LiBSZWFkIDE2LWJ5dGUgb2YgZGF0YSBmcm9tIEVGVVNFX0RBVEEwLTMgKDB4NTlDLTB4NTkwKSAqLworCS8qQmVjYXVzZSB0aGUgc2l6ZSBvZiBlYWNoIEVGVVNFX0RBVEEgaXMgNCBCeXRlcywgdGhlIHNpemUgb2YgYWRkcmVzcyBvZiBlYWNoIGlzIDIgYml0cy4gKi8KKwkvKlRoZSBwcmV2aW91cyAyIGJpdHMgaXMgdGhlIEVGVVNFX0RBVEEgbnVtYmVyLCB0aGUgbGFzdCAyIGJpdHMgaXMgdXNlZCB0byBkZWNpZGUgd2hpY2ggYnl0ZXMgKi8KKwkvKkRlY2lkZSB3aGljaCBFRlVTRV9EQVRBIHRvIHJlYWQgKi8KKwkvKjU5MDpGIEUgRCBDICovCisJLyo1OTQ6QiBBIDkgOCAqLworCS8qNTk4OjcgNiA1IDQgKi8KKwkvKjU5QzozIDIgMSAwICovCisJZWZ1c2VEYXRhT2Zmc2V0ID0gRUZVU0VfREFUQTMgLSAoT2Zmc2V0ICYgMHhDKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgZWZ1c2VEYXRhT2Zmc2V0LCAmZGF0YSk7CisKKwlkYXRhID0gZGF0YSA+PiAoOCAqIChPZmZzZXQgJiAweDMpKTsKKworCU5kaXNNb3ZlTWVtb3J5KHBEYXRhLCAmZGF0YSwgTGVuZ3RoKTsKKworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIHZvaWQgZUZ1c2VSZWFkUGh5c2ljYWwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgdTE2ICpscEluQnVmZmVyLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBuSW5CdWZmZXJTaXplLAorCQkJICAgICAgdTE2ICpscE91dEJ1ZmZlciwgdW5zaWduZWQgbG9uZyBuT3V0QnVmZmVyU2l6ZSkKK3sKKwl1MTYgKnBJbkJ1ZiA9ICh1MTYgKikgbHBJbkJ1ZmZlcjsKKwl1MTYgKnBPdXRCdWYgPSAodTE2ICopIGxwT3V0QnVmZmVyOworCisJdTE2IE9mZnNldCA9IHBJbkJ1ZlswXTsJLyphZGRyICovCisJdTE2IExlbmd0aCA9IHBJbkJ1ZlsxXTsJLypsZW5ndGggKi8KKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBMZW5ndGg7IGkgKz0gMikgeworCQllRnVzZVBoeXNpY2FsUmVhZFJlZ2lzdGVycyhwQWQsIE9mZnNldCArIGksIDIsICZwT3V0QnVmW2kgLyAyXSk7CisJfQorfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IHNldF9lRnVzZUdldEZyZWVCbG9ja0NvdW50X1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBjaGFyICphcmcpCit7CisJdTE2IGk7CisJdTE2IExvZ2ljYWxBZGRyZXNzOworCXUxNiBlZnVzZWZyZWVudW0gPSAwOworCWlmICghcEFkLT5iVXNlRWZ1c2UpCisJCXJldHVybiBGQUxTRTsKKwlmb3IgKGkgPSBFRlVTRV9VU0FHRV9NQVBfU1RBUlQ7IGkgPD0gRUZVU0VfVVNBR0VfTUFQX0VORDsgaSArPSAyKSB7CisJCWVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKHBBZCwgaSwgMiwgJkxvZ2ljYWxBZGRyZXNzKTsKKwkJaWYgKChMb2dpY2FsQWRkcmVzcyAmIDB4ZmYpID09IDApIHsKKwkJCWVmdXNlZnJlZW51bSA9ICh1OCkoRUZVU0VfVVNBR0VfTUFQX0VORCAtIGkgKyAxKTsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKCgoTG9naWNhbEFkZHJlc3MgPj4gOCkgJiAweGZmKSA9PSAwKSB7CisJCQllZnVzZWZyZWVudW0gPSAodTgpKEVGVVNFX1VTQUdFX01BUF9FTkQgLSBpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGkgPT0gRUZVU0VfVVNBR0VfTUFQX0VORCkKKwkJCWVmdXNlZnJlZW51bSA9IDA7CisJfQorCXByaW50aygiZWZ1c2VGcmVlTnVtYmVyIGlzICVkXG4iLCBlZnVzZWZyZWVudW0pOworCXJldHVybiBUUlVFOworfQorCitpbnQgc2V0X2VGdXNlZHVtcF9Qcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgY2hhciAqYXJnKQoreworCXUxNiBJbkJ1ZlszXTsKKwlpbnQgaSA9IDA7CisJaWYgKCFwQWQtPmJVc2VFZnVzZSkKKwkJcmV0dXJuIEZBTFNFOworCWZvciAoaSA9IDA7IGkgPCBFRlVTRV9VU0FHRV9NQVBfRU5EIC8gMjsgaSsrKSB7CisJCUluQnVmWzBdID0gMiAqIGk7CisJCUluQnVmWzFdID0gMjsKKwkJSW5CdWZbMl0gPSAweDA7CisKKwkJZUZ1c2VSZWFkUGh5c2ljYWwocEFkLCAmSW5CdWZbMF0sIDQsICZJbkJ1ZlsyXSwgMik7CisJCWlmIChpICUgNCA9PSAwKQorCQkJcHJpbnRrKCJcbkJsb2NrICV4OiIsIGkgLyA4KTsKKwkJcHJpbnRrKCIlMDR4ICIsIEluQnVmWzJdKTsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKK2ludCBydG1wX2VlX2VmdXNlX3JlYWQxNihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgdTE2IE9mZnNldCwgdTE2ICogcFZhbHVlKQoreworCWVGdXNlUmVhZFJlZ2lzdGVycyhwQWQsIE9mZnNldCwgMiwgcFZhbHVlKTsKKwlyZXR1cm4gKCpwVmFsdWUpOworfQorCitpbnQgUnRtcEVmdXNlU3VwcG9ydENoZWNrKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwl1MTYgdmFsdWU7CisKKwlpZiAoSVNfUlQzMHh4KHBBZCkpIHsKKwkJZUZ1c2VQaHlzaWNhbFJlYWRSZWdpc3RlcnMocEFkLCBFRlVTRV9UQUcsIDIsICZ2YWx1ZSk7CisJCXBBZC0+RUZ1c2VUYWcgPSAodmFsdWUgJiAweGZmKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZUZ1c2VHZXRGcmVlQmxvY2tDb3VudChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHUzMiAqRWZ1c2VGcmVlQmxvY2spCit7CisJdTE2IGk7CisJdTE2IExvZ2ljYWxBZGRyZXNzOworCWlmICghcEFkLT5iVXNlRWZ1c2UpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJlRnVzZUdldEZyZWVCbG9ja0NvdW50IE9ubHkgc3VwcG9ydHMgZWZ1c2UgTW9kZVxuIikpOworCQlyZXR1cm47CisJfQorCWZvciAoaSA9IEVGVVNFX1VTQUdFX01BUF9TVEFSVDsgaSA8PSBFRlVTRV9VU0FHRV9NQVBfRU5EOyBpICs9IDIpIHsKKwkJZUZ1c2VQaHlzaWNhbFJlYWRSZWdpc3RlcnMocEFkLCBpLCAyLCAmTG9naWNhbEFkZHJlc3MpOworCQlpZiAoKExvZ2ljYWxBZGRyZXNzICYgMHhmZikgPT0gMCkgeworCQkJKkVmdXNlRnJlZUJsb2NrID0gKHU4KShFRlVTRV9VU0FHRV9NQVBfRU5EIC0gaSArIDEpOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoKChMb2dpY2FsQWRkcmVzcyA+PiA4KSAmIDB4ZmYpID09IDApIHsKKwkJCSpFZnVzZUZyZWVCbG9jayA9ICh1OCkoRUZVU0VfVVNBR0VfTUFQX0VORCAtIGkpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaSA9PSBFRlVTRV9VU0FHRV9NQVBfRU5EKQorCQkJKkVmdXNlRnJlZUJsb2NrID0gMDsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoImVGdXNlR2V0RnJlZUJsb2NrQ291bnQgaXMgMHgleFxuIiwgKkVmdXNlRnJlZUJsb2NrKSk7Cit9CisKK2ludCBlRnVzZV9pbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwl1MzIgRWZ1c2VGcmVlQmxvY2sgPSAwOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkgKCJOVk0gaXMgRWZ1c2UgYW5kIGl0cyBzaXplID0leFsleC0leF0gXG4iLAorCQkgIEVGVVNFX1VTQUdFX01BUF9TSVpFLCBFRlVTRV9VU0FHRV9NQVBfU1RBUlQsCisJCSAgRUZVU0VfVVNBR0VfTUFQX0VORCkpOworCWVGdXNlR2V0RnJlZUJsb2NrQ291bnQocEFkLCAmRWZ1c2VGcmVlQmxvY2spOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9lZV9wcm9tLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9lZV9wcm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA4Mzc0MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2VlX3Byb20uYwpAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwllZV9wcm9tLmMKKworCUFic3RyYWN0OgorCU1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKwktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlCSIuLi9ydF9jb25maWcuaCIKKworLyogSVJRTCA9IFBBU1NJVkVfTEVWRUwgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBSYWlzZUNsb2NrKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTMyICogeCkKK3sKKwkqeCA9ICp4IHwgRUVTSzsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCAqeCk7CisJUlRNUHVzZWNEZWxheSgxKTsJLyogTWF4IGZyZXF1ZW5jeSA9IDFNSHogaW4gU3BlYy4gZGVmaW5pdGlvbiAqLworfQorCisvKiBJUlFMID0gUEFTU0lWRV9MRVZFTCAqLworc3RhdGljIGlubGluZSB2b2lkIExvd2VyQ2xvY2soc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1MzIgKiB4KQoreworCSp4ID0gKnggJiB+RUVTSzsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCAqeCk7CisJUlRNUHVzZWNEZWxheSgxKTsKK30KKworLyogSVJRTCA9IFBBU1NJVkVfTEVWRUwgKi8KK3N0YXRpYyBpbmxpbmUgdTE2IFNoaWZ0SW5CaXRzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwl1MzIgeCwgaTsKKwl1MTYgZGF0YSA9IDA7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKworCXggJj0gfihFRURPIHwgRUVESSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlkYXRhID0gZGF0YSA8PCAxOworCQlSYWlzZUNsb2NrKHBBZCwgJngpOworCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOworCQlMb3dlckNsb2NrKHBBZCwgJngpOwkvKnByZXZlbnQgcmVhZCBmYWlsZWQgKi8KKworCQl4ICY9IH4oRUVESSk7CisJCWlmICh4ICYgRUVETykKKwkJCWRhdGEgfD0gMTsKKwl9CisKKwlyZXR1cm4gZGF0YTsKK30KKworLyogSVJRTCA9IFBBU1NJVkVfTEVWRUwgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBTaGlmdE91dEJpdHMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCXUxNiBkYXRhLCB1MTYgY291bnQpCit7CisJdTMyIHgsIG1hc2s7CisKKwltYXNrID0gMHgwMSA8PCAoY291bnQgLSAxKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKworCXggJj0gfihFRURPIHwgRUVESSk7CisKKwlkbyB7CisJCXggJj0gfkVFREk7CisJCWlmIChkYXRhICYgbWFzaykKKwkJCXggfD0gRUVESTsKKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKKworCQlSYWlzZUNsb2NrKHBBZCwgJngpOworCQlMb3dlckNsb2NrKHBBZCwgJngpOworCisJCW1hc2sgPSBtYXNrID4+IDE7CisJfSB3aGlsZSAobWFzayk7CisKKwl4ICY9IH5FRURJOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworfQorCisvKiBJUlFMID0gUEFTU0lWRV9MRVZFTCAqLworc3RhdGljIGlubGluZSB2b2lkIEVFcHJvbUNsZWFudXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXUzMiB4OworCisJUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisKKwl4ICY9IH4oRUVDUyB8IEVFREkpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworCisJUmFpc2VDbG9jayhwQWQsICZ4KTsKKwlMb3dlckNsb2NrKHBBZCwgJngpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgRVdFTihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJdTMyIHg7CisKKwkvKiByZXNldCBiaXRzIGFuZCBzZXQgRUVDUyAqLworCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOworCXggJj0gfihFRURJIHwgRUVETyB8IEVFU0spOworCXggfD0gRUVDUzsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKKworCS8qIGtpY2sgYSBwdWxzZSAqLworCVJhaXNlQ2xvY2socEFkLCAmeCk7CisJTG93ZXJDbG9jayhwQWQsICZ4KTsKKworCS8qIG91dHB1dCB0aGUgcmVhZF9vcGNvZGUgYW5kIHNpeCBwdWxzZSBpbiB0aGF0IG9yZGVyICovCisJU2hpZnRPdXRCaXRzKHBBZCwgRUVQUk9NX0VXRU5fT1BDT0RFLCA1KTsKKwlTaGlmdE91dEJpdHMocEFkLCAwLCA2KTsKKworCUVFcHJvbUNsZWFudXAocEFkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIEVXRFMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXUzMiB4OworCisJLyogcmVzZXQgYml0cyBhbmQgc2V0IEVFQ1MgKi8KKwlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKwl4ICY9IH4oRUVESSB8IEVFRE8gfCBFRVNLKTsKKwl4IHw9IEVFQ1M7CisJUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7CisKKwkvKiBraWNrIGEgcHVsc2UgKi8KKwlSYWlzZUNsb2NrKHBBZCwgJngpOworCUxvd2VyQ2xvY2socEFkLCAmeCk7CisKKwkvKiBvdXRwdXQgdGhlIHJlYWRfb3Bjb2RlIGFuZCBzaXggcHVsc2UgaW4gdGhhdCBvcmRlciAqLworCVNoaWZ0T3V0Qml0cyhwQWQsIEVFUFJPTV9FV0RTX09QQ09ERSwgNSk7CisJU2hpZnRPdXRCaXRzKHBBZCwgMCwgNik7CisKKwlFRXByb21DbGVhbnVwKHBBZCk7Cit9CisKKy8qIElSUUwgPSBQQVNTSVZFX0xFVkVMICovCitpbnQgcnRtcF9lZV9wcm9tX3JlYWQxNihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQl1MTYgT2Zmc2V0LCB1MTYgKiBwVmFsdWUpCit7CisJdTMyIHg7CisJdTE2IGRhdGE7CisKKwlPZmZzZXQgLz0gMjsKKwkvKiByZXNldCBiaXRzIGFuZCBzZXQgRUVDUyAqLworCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOworCXggJj0gfihFRURJIHwgRUVETyB8IEVFU0spOworCXggfD0gRUVDUzsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKKworCS8qIHBhdGNoIGNhbiBub3QgYWNjZXNzIGUtRnVzZSBpc3N1ZSAqLworCWlmICghKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSkgeworCQkvKiBraWNrIGEgcHVsc2UgKi8KKwkJUmFpc2VDbG9jayhwQWQsICZ4KTsKKwkJTG93ZXJDbG9jayhwQWQsICZ4KTsKKwl9CisJLyogb3V0cHV0IHRoZSByZWFkX29wY29kZSBhbmQgcmVnaXN0ZXIgbnVtYmVyIGluIHRoYXQgb3JkZXIgKi8KKwlTaGlmdE91dEJpdHMocEFkLCBFRVBST01fUkVBRF9PUENPREUsIDMpOworCVNoaWZ0T3V0Qml0cyhwQWQsIE9mZnNldCwgcEFkLT5FRVBST01BZGRyZXNzTnVtKTsKKworCS8qIE5vdyByZWFkIHRoZSBkYXRhICgxNiBiaXRzKSBpbiBmcm9tIHRoZSBzZWxlY3RlZCBFRVBST00gd29yZCAqLworCWRhdGEgPSBTaGlmdEluQml0cyhwQWQpOworCisJRUVwcm9tQ2xlYW51cChwQWQpOworCisJKnBWYWx1ZSA9IGRhdGE7CisKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2VlcHJvbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZWVwcm9tLmMKaW5kZXggZmZjYjRjZS4uOTQ2NzAwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZWVwcm9tLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZWVwcm9tLmMKQEAgLTM2LDE0NDQgKzM2LDU2IEBACiAqLwogI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgogCi0vLyBJUlFMID0gUEFTU0lWRV9MRVZFTAotVk9JRCBSYWlzZUNsb2NrKAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAotICAgIElOICBVSU5UMzIgKngpCitpbnQgUnRtcENoaXBPcHNFZXByb21Ib29rKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgaW50IGluZlR5cGUpCiB7Ci0gICAgKnggPSAqeCB8IEVFU0s7Ci0gICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgKngpOwotICAgIFJUTVB1c2VjRGVsYXkoMSk7CQkJCS8vIE1heCBmcmVxdWVuY3kgPSAxTUh6IGluIFNwZWMuIGRlZmluaXRpb24KLX0KKwlzdHJ1Y3QgcnRfcnRtcF9jaGlwX29wICpwQ2hpcE9wcyA9ICZwQWQtPmNoaXBPcHM7CisjaWZkZWYgUlQzMHh4CisjaWZkZWYgUlRNUF9FRlVTRV9TVVBQT1JUCisJdTMyIGVGdXNlQ3RybCwgTWFjQ3NyMDsKKwlpbnQgaW5kZXg7CiAKLS8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCi1WT0lEIExvd2VyQ2xvY2soCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCi0gICAgSU4gIFVJTlQzMiAqeCkKLXsKLSAgICAqeCA9ICp4ICYgfkVFU0s7Ci0gICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgKngpOwotICAgIFJUTVB1c2VjRGVsYXkoMSk7Ci19CisJaW5kZXggPSAwOworCWRvIHsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfQ1NSMCwgJk1hY0NzcjApOworCQlwQWQtPk1BQ1ZlcnNpb24gPSBNYWNDc3IwOwogCi0vLyBJUlFMID0gUEFTU0lWRV9MRVZFTAotVVNIT1JUIFNoaWZ0SW5CaXRzKAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkKQotewotICAgIFVJTlQzMgkJeCxpOwotCVVTSE9SVCAgICAgIGRhdGE9MDsKLQotICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOwotCi0gICAgeCAmPSB+KCBFRURPIHwgRUVESSk7Ci0KLSAgICBmb3IoaT0wOyBpPDE2OyBpKyspCi0gICAgewotICAgICAgICBkYXRhID0gZGF0YSA8PCAxOwotICAgICAgICBSYWlzZUNsb2NrKHBBZCwgJngpOwotCi0gICAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOwotCi0JTG93ZXJDbG9jayhwQWQsICZ4KTsgLyogcHJldmVudCByZWFkIGZhaWxlZCAqLwotCi0gICAgICAgIHggJj0gfihFRURJKTsKLSAgICAgICAgaWYoeCAmIEVFRE8pCi0gICAgICAgICAgICBkYXRhIHw9IDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIGRhdGE7Ci19Ci0KLS8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCi1WT0lEIFNoaWZ0T3V0Qml0cygKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKLSAgICBJTiAgVVNIT1JUIGRhdGEsCi0gICAgSU4gIFVTSE9SVCBjb3VudCkKLXsKLSAgICBVSU5UMzIgICAgICAgeCxtYXNrOwotCi0gICAgbWFzayA9IDB4MDEgPDwgKGNvdW50IC0gMSk7Ci0gICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7Ci0KLSAgICB4ICY9IH4oRUVETyB8IEVFREkpOwotCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIHggJj0gfkVFREk7Ci0gICAgICAgIGlmKGRhdGEgJiBtYXNrKQkJeCB8PSBFRURJOwotCi0gICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOwotCi0gICAgICAgIFJhaXNlQ2xvY2socEFkLCAmeCk7Ci0gICAgICAgIExvd2VyQ2xvY2socEFkLCAmeCk7Ci0KLSAgICAgICAgbWFzayA9IG1hc2sgPj4gMTsKLSAgICB9IHdoaWxlKG1hc2spOwotCi0gICAgeCAmPSB+RUVESTsKLSAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKLX0KLQotLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLVZPSUQgRUVwcm9tQ2xlYW51cCgKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLSAgICBVSU5UMzIgeDsKLQotICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOwotCi0gICAgeCAmPSB+KEVFQ1MgfCBFRURJKTsKLSAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKLQotICAgIFJhaXNlQ2xvY2socEFkLCAmeCk7Ci0gICAgTG93ZXJDbG9jayhwQWQsICZ4KTsKLX0KLQotVk9JRCBFV0VOKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotICAgIFVJTlQzMgl4OwotCi0gICAgLy8gcmVzZXQgYml0cyBhbmQgc2V0IEVFQ1MKLSAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKLSAgICB4ICY9IH4oRUVESSB8IEVFRE8gfCBFRVNLKTsKLSAgICB4IHw9IEVFQ1M7Ci0gICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7Ci0KLQkvLyBraWNrIGEgcHVsc2UKLQlSYWlzZUNsb2NrKHBBZCwgJngpOwotCUxvd2VyQ2xvY2socEFkLCAmeCk7Ci0KLSAgICAvLyBvdXRwdXQgdGhlIHJlYWRfb3Bjb2RlIGFuZCBzaXggcHVsc2UgaW4gdGhhdCBvcmRlcgotICAgIFNoaWZ0T3V0Qml0cyhwQWQsIEVFUFJPTV9FV0VOX09QQ09ERSwgNSk7Ci0gICAgU2hpZnRPdXRCaXRzKHBBZCwgMCwgNik7Ci0KLSAgICBFRXByb21DbGVhbnVwKHBBZCk7Ci19Ci0KLVZPSUQgRVdEUygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLSAgICBVSU5UMzIJeDsKLQotICAgIC8vIHJlc2V0IGJpdHMgYW5kIHNldCBFRUNTCi0gICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7Ci0gICAgeCAmPSB+KEVFREkgfCBFRURPIHwgRUVTSyk7Ci0gICAgeCB8PSBFRUNTOwotICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOwotCi0JLy8ga2ljayBhIHB1bHNlCi0JUmFpc2VDbG9jayhwQWQsICZ4KTsKLQlMb3dlckNsb2NrKHBBZCwgJngpOwotCi0gICAgLy8gb3V0cHV0IHRoZSByZWFkX29wY29kZSBhbmQgc2l4IHB1bHNlIGluIHRoYXQgb3JkZXIKLSAgICBTaGlmdE91dEJpdHMocEFkLCBFRVBST01fRVdEU19PUENPREUsIDUpOwotICAgIFNoaWZ0T3V0Qml0cyhwQWQsIDAsIDYpOwotCi0gICAgRUVwcm9tQ2xlYW51cChwQWQpOwotfQotCi0vLyBJUlFMID0gUEFTU0lWRV9MRVZFTAotVVNIT1JUIFJUTVBfRUVQUk9NX1JFQUQxNigKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKLSAgICBJTiAgVVNIT1JUIE9mZnNldCkKLXsKLSAgICBVSU5UMzIJCXg7Ci0gICAgVVNIT1JUCQlkYXRhOwotCi0jaWZkZWYgUlQyODcwCi0JaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5BbnREaXZlcnNpdHkpCi0gICAgewotICAgIAlwQWQtPkVlcHJvbUFjY2VzcyA9IFRSVUU7Ci0gICAgfQotI2VuZGlmCi0gICAgT2Zmc2V0IC89IDI7Ci0gICAgLy8gcmVzZXQgYml0cyBhbmQgc2V0IEVFQ1MKLSAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKLSAgICB4ICY9IH4oRUVESSB8IEVFRE8gfCBFRVNLKTsKLSAgICB4IHw9IEVFQ1M7Ci0gICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7Ci0KLQkvLyBwYXRjaCBjYW4gbm90IGFjY2VzcyBlLUZ1c2UgaXNzdWUKLSAgICBpZiAoIUlTX1JUMzA5MChwQWQpKQotICAgIHsKLQkvLyBraWNrIGEgcHVsc2UKLQlSYWlzZUNsb2NrKHBBZCwgJngpOwotCUxvd2VyQ2xvY2socEFkLCAmeCk7Ci0gICAgfQotCi0gICAgLy8gb3V0cHV0IHRoZSByZWFkX29wY29kZSBhbmQgcmVnaXN0ZXIgbnVtYmVyIGluIHRoYXQgb3JkZXIKLSAgICBTaGlmdE91dEJpdHMocEFkLCBFRVBST01fUkVBRF9PUENPREUsIDMpOwotICAgIFNoaWZ0T3V0Qml0cyhwQWQsIE9mZnNldCwgcEFkLT5FRVBST01BZGRyZXNzTnVtKTsKLQotICAgIC8vIE5vdyByZWFkIHRoZSBkYXRhICgxNiBiaXRzKSBpbiBmcm9tIHRoZSBzZWxlY3RlZCBFRVBST00gd29yZAotICAgIGRhdGEgPSBTaGlmdEluQml0cyhwQWQpOwotCi0gICAgRUVwcm9tQ2xlYW51cChwQWQpOwotCi0jaWZkZWYgUlQyODcwCi0JLy8gQW50ZW5uYSBhbmQgRUVQUk9NIGFjY2VzcyBhcmUgYm90aCB1c2luZyBFRVNLIHBpbiwKLSAgICAvLyBUaGVyZWZvciB3ZSBzaG91bGQgYXZvaWQgYWNjZXNzaW5nIEVFU0sgYXQgdGhlIHNhbWUgdGltZQotICAgIC8vIFRoZW4gcmVzdG9yZSBhbnRlbm5hIGFmdGVyIEVFUFJPTSBhY2Nlc3MKLQlpZiAoKHBBZC0+TmljQ29uZmlnMi5maWVsZC5BbnREaXZlcnNpdHkpIHx8IChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMCkpCi0gICAgewotCSAgICBwQWQtPkVlcHJvbUFjY2VzcyA9IEZBTFNFOwotCSAgICBBc2ljU2V0UnhBbnQocEFkLCBwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50KTsKLSAgICB9Ci0jZW5kaWYKLSAgICByZXR1cm4gZGF0YTsKLX0JLy9SZWFkRUVwcm9tCi0KLVZPSUQgUlRNUF9FRVBST01fV1JJVEUxNigKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKLSAgICBJTiAgVVNIT1JUIE9mZnNldCwKLSAgICBJTiAgVVNIT1JUIERhdGEpCi17Ci0gICAgVUlOVDMyIHg7Ci0KLSNpZmRlZiBSVDI4NzAKLQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkFudERpdmVyc2l0eSkKLSAgICB7Ci0gICAgCXBBZC0+RWVwcm9tQWNjZXNzID0gVFJVRTsKLSAgICB9Ci0jZW5kaWYKLQlPZmZzZXQgLz0gMjsKLQotCUVXRU4ocEFkKTsKLQotICAgIC8vIHJlc2V0IGJpdHMgYW5kIHNldCBFRUNTCi0gICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7Ci0gICAgeCAmPSB+KEVFREkgfCBFRURPIHwgRUVTSyk7Ci0gICAgeCB8PSBFRUNTOwotICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOwotCi0JLy8gcGF0Y2ggY2FuIG5vdCBhY2Nlc3MgZS1GdXNlIGlzc3VlCi0gICAgaWYgKCFJU19SVDMwOTAocEFkKSkKLSAgICB7Ci0JLy8ga2ljayBhIHB1bHNlCi0JUmFpc2VDbG9jayhwQWQsICZ4KTsKLQlMb3dlckNsb2NrKHBBZCwgJngpOwotICAgIH0KLQotICAgIC8vIG91dHB1dCB0aGUgcmVhZF9vcGNvZGUgLHJlZ2lzdGVyIG51bWJlciBhbmQgZGF0YSBpbiB0aGF0IG9yZGVyCi0gICAgU2hpZnRPdXRCaXRzKHBBZCwgRUVQUk9NX1dSSVRFX09QQ09ERSwgMyk7Ci0gICAgU2hpZnRPdXRCaXRzKHBBZCwgT2Zmc2V0LCBwQWQtPkVFUFJPTUFkZHJlc3NOdW0pOwotCVNoaWZ0T3V0Qml0cyhwQWQsIERhdGEsIDE2KTsJCS8vIDE2LWJpdCBhY2Nlc3MKLQotICAgIC8vIHJlYWQgRE8gc3RhdHVzCi0gICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7Ci0KLQlFRXByb21DbGVhbnVwKHBBZCk7Ci0KLQlSVE1QdXNlY0RlbGF5KDEwMDAwKTsJLy9kZWxheSBmb3IgdHdwKE1BWCk9MTBtcwotCi0JRVdEUyhwQWQpOwotCi0gICAgRUVwcm9tQ2xlYW51cChwQWQpOwotCi0jaWZkZWYgUlQyODcwCi0JLy8gQW50ZW5uYSBhbmQgRUVQUk9NIGFjY2VzcyBhcmUgYm90aCB1c2luZyBFRVNLIHBpbiwKLSAgICAvLyBUaGVyZWZvciB3ZSBzaG91bGQgYXZvaWQgYWNjZXNzaW5nIEVFU0sgYXQgdGhlIHNhbWUgdGltZQotICAgIC8vIFRoZW4gcmVzdG9yZSBhbnRlbm5hIGFmdGVyIEVFUFJPTSBhY2Nlc3MKLQlpZiAoKHBBZC0+TmljQ29uZmlnMi5maWVsZC5BbnREaXZlcnNpdHkpIHx8IChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMCkpCi0gICAgewotCSAgICBwQWQtPkVlcHJvbUFjY2VzcyA9IEZBTFNFOwotCSAgICBBc2ljU2V0UnhBbnQocEFkLCBwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50KTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotI2lmZGVmIFJUMjg3MAotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0KLQlBcmd1bWVudHM6Ci0KLQlSZXR1cm4gVmFsdWU6Ci0KLQlJUlFMID0KLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VQ0hBUiBlRnVzZVJlYWRSZWdpc3RlcnMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUIE9mZnNldCwKLQlJTglVU0hPUlQgTGVuZ3RoLAotCU9VVAlVU0hPUlQqIHBEYXRhKQotewotCUVGVVNFX0NUUkxfU1RSVUMJCWVGdXNlQ3RybFN0cnVjOwotCWludAlpOwotCVVTSE9SVAllZnVzZURhdGFPZmZzZXQ7Ci0JVUlOVDMyCWRhdGE7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIEVGVVNFX0NUUkwsIChQVUlOVDMyKSAmZUZ1c2VDdHJsU3RydWMpOwotCi0JLy9TdGVwMC4gV3JpdGUgMTAtYml0IG9mIGFkZHJlc3MgdG8gRUZTUk9NX0FJTiAoMHg1ODAsIGJpdDI1OmJpdDE2KS4gVGhlIGFkZHJlc3MgbXVzdCBiZSAxNi1ieXRlIGFsaWdubWVudC4KLQkvL1VzZSB0aGUgZWVwcm9tIGxvZ2ljYWwgYWRkcmVzcyBhbmQgY292ZXJ0IHRvIGFkZHJlc3MgdG8gYmxvY2sgbnVtYmVyCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0FJTiA9IE9mZnNldCAmIDB4ZmZmMDsKLQotCS8vU3RlcDEuIFdyaXRlIEVGU1JPTV9NT0RFICgweDU4MCwgYml0NzpiaXQ2KSB0byAwLgotCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9NT0RFID0gMDsKLQotCS8vU3RlcDIuIFdyaXRlIEVGU1JPTV9LSUNLICgweDU4MCwgYml0MzApIHRvIDEgdG8ga2ljay1vZmYgcGh5c2ljYWwgcmVhZCBwcm9jZWR1cmUuCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPSAxOwotCi0JTmRpc01vdmVNZW1vcnkoJmRhdGEsICZlRnVzZUN0cmxTdHJ1YywgNCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgRUZVU0VfQ1RSTCwgZGF0YSk7Ci0KLQkvL1N0ZXAzLiBQb2xsaW5nIEVGU1JPTV9LSUNLKDB4NTgwLCBiaXQzMCkgdW50aWwgaXQgYmVjb21lIDAgYWdhaW4uCi0JaSA9IDA7Ci0Jd2hpbGUoaSA8IDEwMCkKLQl7Ci0JCS8vcnRtcC5Id01lbW9yeVJlYWREd29yZChFRlVTRV9DVFJMLCAoRFdPUkQgKikgJmVGdXNlQ3RybFN0cnVjLCA0KTsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAoUFVJTlQzMikgJmVGdXNlQ3RybFN0cnVjKTsKLQkJaWYoZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPT0gMCkKLQkJewotCQkJYnJlYWs7Ci0JCX0KLQkJUlRNUHVzZWNEZWxheSgyKTsKLQkJaSsrOwotCX0KLQotCS8vaWYgRUZTUk9NX0FPVVQgaXMgbm90IGZvdW5kIGluIHBoeXNpY2FsIGFkZHJlc3MsIHdyaXRlIDB4ZmZmZgotCWlmIChlRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fQU9VVCA9PSAweDNmKQotCXsKLQkJZm9yKGk9MDsgaTxMZW5ndGgvMjsgaSsrKQotCQkJKihwRGF0YSsyKmkpID0gMHhmZmZmOwotCX0KLQllbHNlCi0JewotCQkvL1N0ZXA0LiBSZWFkIDE2LWJ5dGUgb2YgZGF0YSBmcm9tIEVGVVNFX0RBVEEwLTMgKDB4NTkwLTB4NTlDKQotCQllZnVzZURhdGFPZmZzZXQgPSAgRUZVU0VfREFUQTMgLSAoT2Zmc2V0ICYgMHhDKSAgOwotCQkvL2RhdGEgaG9sZCA0IGJ5dGVzIGRhdGEuCi0JCS8vSW4gUlRNUF9JT19SRUFEMzIgd2lsbCBhdXRvbWF0aWNhbGx5IGV4ZWN1dGUgMzItYnl0ZXMgc3dhcHBpbmcKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBlZnVzZURhdGFPZmZzZXQsICZkYXRhKTsKLQkJLy9EZWNpZGUgdGhlIHVwcGVyIDIgYnl0ZXMgb3IgdGhlIGJvdHRvbSAyIGJ5dGVzLgotCQkvLyBMaXR0bGUtZW5kaWFuCQlTCXwJUwlCaWctZW5kaWFuCi0JCS8vIGFkZHIJMwkyCTEJMAl8CTAJMQkyCTMKLQkJLy8gT3JpLVYJRAlDCUIJQQl8CUEJQglDCUQKLQkJLy9BZnRlciBzd2FwcGluZwotCQkvLwkJRAlDCUIJQQl8CUQJQwlCCUEKLQkJLy9SZXR1cm4gMi1ieXRlcwotCQkvL1RoZSByZXR1cm4gYnl0ZSBzdGF0cnMgZnJvbSBTLiBUaGVyZWZvcmUsIHRoZSBsaXR0bGUtZW5kaWFuIHdpbGwgcmV0dXJuIEJBLCB0aGUgQmlnLWVuZGlhbiB3aWxsIHJldHVybiBEQy4KLQkJLy9Gb3IgcmV0dXJuaW5nIHRoZSBib3R0b20gMiBieXRlcywgdGhlIEJpZy1lbmRpYW4gc2hvdWxkIHNoaWZ0IHJpZ2h0IDItYnl0ZXMuCi0JCWRhdGEgPSBkYXRhID4+ICg4KihPZmZzZXQgJiAweDMpKTsKLQotCQlOZGlzTW92ZU1lbW9yeShwRGF0YSwgJmRhdGEsIExlbmd0aCk7Ci0JfQotCi0JcmV0dXJuIChVQ0hBUikgZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0FPVVQ7Ci0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0KLQlBcmd1bWVudHM6Ci0KLQlSZXR1cm4gVmFsdWU6Ci0KLQlJUlFMID0KLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIGVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVCBPZmZzZXQsCi0JSU4JVVNIT1JUIExlbmd0aCwKLQlPVVQJVVNIT1JUKiBwRGF0YSkKLXsKLQlFRlVTRV9DVFJMX1NUUlVDCQllRnVzZUN0cmxTdHJ1YzsKLQlpbnQJaTsKLQlVU0hPUlQJZWZ1c2VEYXRhT2Zmc2V0OwotCVVJTlQzMglkYXRhOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAoUFVJTlQzMikgJmVGdXNlQ3RybFN0cnVjKTsKLQotCS8vU3RlcDAuIFdyaXRlIDEwLWJpdCBvZiBhZGRyZXNzIHRvIEVGU1JPTV9BSU4gKDB4NTgwLCBiaXQyNTpiaXQxNikuIFRoZSBhZGRyZXNzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbm1lbnQuCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0FJTiA9IE9mZnNldCAmIDB4ZmZmMDsKLQotCS8vU3RlcDEuIFdyaXRlIEVGU1JPTV9NT0RFICgweDU4MCwgYml0NzpiaXQ2KSB0byAxLgotCS8vUmVhZCBpbiBwaHlzaWNhbCB2aWV3Ci0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX01PREUgPSAxOwotCi0JLy9TdGVwMi4gV3JpdGUgRUZTUk9NX0tJQ0sgKDB4NTgwLCBiaXQzMCkgdG8gMSB0byBraWNrLW9mZiBwaHlzaWNhbCByZWFkIHByb2NlZHVyZS4KLQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fS0lDSyA9IDE7Ci0KLQlOZGlzTW92ZU1lbW9yeSgmZGF0YSwgJmVGdXNlQ3RybFN0cnVjLCA0KTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRlVTRV9DVFJMLCBkYXRhKTsKLQotCS8vU3RlcDMuIFBvbGxpbmcgRUZTUk9NX0tJQ0soMHg1ODAsIGJpdDMwKSB1bnRpbCBpdCBiZWNvbWUgMCBhZ2Fpbi4KLQlpID0gMDsKLQl3aGlsZShpIDwgMTAwKQotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAoUFVJTlQzMikgJmVGdXNlQ3RybFN0cnVjKTsKLQkJaWYoZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPT0gMCkKLQkJCWJyZWFrOwotCQlSVE1QdXNlY0RlbGF5KDIpOwotCQlpKys7Ci0JfQotCi0JLy9TdGVwNC4gUmVhZCAxNi1ieXRlIG9mIGRhdGEgZnJvbSBFRlVTRV9EQVRBMC0zICgweDU5Qy0weDU5MCkKLQkvL0JlY2F1c2UgdGhlIHNpemUgb2YgZWFjaCBFRlVTRV9EQVRBIGlzIDQgQnl0ZXMsIHRoZSBzaXplIG9mIGFkZHJlc3Mgb2YgZWFjaCBpcyAyIGJpdHMuCi0JLy9UaGUgcHJldmlvdXMgMiBiaXRzIGlzIHRoZSBFRlVTRV9EQVRBIG51bWJlciwgdGhlIGxhc3QgMiBiaXRzIGlzIHVzZWQgdG8gZGVjaWRlIHdoaWNoIGJ5dGVzCi0JLy9EZWNpZGUgd2hpY2ggRUZVU0VfREFUQSB0byByZWFkCi0JLy81OTA6RiBFIEQgQwotCS8vNTk0OkIgQSA5IDgKLQkvLzU5ODo3IDYgNSA0Ci0JLy81OUM6MyAyIDEgMAotCWVmdXNlRGF0YU9mZnNldCA9ICBFRlVTRV9EQVRBMyAtIChPZmZzZXQgJiAweEMpICA7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIGVmdXNlRGF0YU9mZnNldCwgJmRhdGEpOwotCi0JZGF0YSA9IGRhdGEgPj4gKDgqKE9mZnNldCAmIDB4MykpOwotCi0JTmRpc01vdmVNZW1vcnkocERhdGEsICZkYXRhLCBMZW5ndGgpOwotCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JSVJRTCA9Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBlRnVzZVJlYWRQaHlzaWNhbCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLSAgCUlOCVBVU0hPUlQgbHBJbkJ1ZmZlciwKLSAgCUlOCVVMT05HIG5JbkJ1ZmZlclNpemUsCi0gIAlPVVQJUFVTSE9SVCBscE91dEJ1ZmZlciwKLSAgCUlOCVVMT05HIG5PdXRCdWZmZXJTaXplCi0pCi17Ci0JVVNIT1JUKiBwSW5CdWYgPSAoVVNIT1JUKilscEluQnVmZmVyOwotCVVTSE9SVCogcE91dEJ1ZiA9IChVU0hPUlQqKWxwT3V0QnVmZmVyOwotCi0JVVNIT1JUIE9mZnNldCA9IHBJbkJ1ZlswXTsJCQkJCS8vYWRkcgotCVVTSE9SVCBMZW5ndGggPSBwSW5CdWZbMV07CQkJCQkvL2xlbmd0aAotCWludCAJCWk7Ci0KLQlmb3IoaT0wOyBpPExlbmd0aDsgaSs9MikKLQl7Ci0JCWVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKHBBZCxPZmZzZXQraSwgMiwgJnBPdXRCdWZbaS8yXSk7Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCUlSUUwgPQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5UU1RBVFVTIGVGdXNlUmVhZCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQJCQlPZmZzZXQsCi0JT1VUCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVTSE9SVAkJCUxlbmd0aCkKLXsKLQlVU0hPUlQqIHBPdXRCdWYgPSAoVVNIT1JUKilwRGF0YTsKLQlOVFNUQVRVUwlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKLQlVQ0hBUglFRlNST01fQU9VVDsKLQlpbnQJaTsKLQotCWZvcihpPTA7IGk8TGVuZ3RoOyBpKz0yKQotCXsKLQkJRUZTUk9NX0FPVVQgPSBlRnVzZVJlYWRSZWdpc3RlcnMocEFkLCBPZmZzZXQraSwgMiwgJnBPdXRCdWZbaS8yXSk7Ci0JfQotCXJldHVybiBTdGF0dXM7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JSVJRTCA9Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBlRnVzZVBoeXNpY2FsV3JpdGVSZWdpc3RlcnMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUIE9mZnNldCwKLQlJTglVU0hPUlQgTGVuZ3RoLAotCU9VVAlVU0hPUlQqIHBEYXRhKQotewotCUVGVVNFX0NUUkxfU1RSVUMJCWVGdXNlQ3RybFN0cnVjOwotCWludAlpOwotCVVTSE9SVAllZnVzZURhdGFPZmZzZXQ7Ci0JVUlOVDMyCWRhdGEsIGVGdXNlRGF0YUJ1ZmZlcls0XTsKLQotCS8vU3RlcDAuIFdyaXRlIDE2LWJ5dGUgb2YgZGF0YSB0byBFRlVTRV9EQVRBMC0zICgweDU5MC0weDU5QyksIHdoZXJlIEVGVVNFX0RBVEEwIGlzIHRoZSBMU0IgRFcsIEVGVVNFX0RBVEEzIGlzIHRoZSBNU0IgRFcuCi0KLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8vcmVhZCBjdXJyZW50IHZhbHVlcyBvZiAxNi1ieXRlIGJsb2NrCi0JUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAoUFVJTlQzMikgJmVGdXNlQ3RybFN0cnVjKTsKLQotCS8vU3RlcDAuIFdyaXRlIDEwLWJpdCBvZiBhZGRyZXNzIHRvIEVGU1JPTV9BSU4gKDB4NTgwLCBiaXQyNTpiaXQxNikuIFRoZSBhZGRyZXNzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbm1lbnQuCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0FJTiA9IE9mZnNldCAmIDB4ZmZmMDsKLQotCS8vU3RlcDEuIFdyaXRlIEVGU1JPTV9NT0RFICgweDU4MCwgYml0NzpiaXQ2KSB0byAxLgotCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9NT0RFID0gMTsKLQotCS8vU3RlcDIuIFdyaXRlIEVGU1JPTV9LSUNLICgweDU4MCwgYml0MzApIHRvIDEgdG8ga2ljay1vZmYgcGh5c2ljYWwgcmVhZCBwcm9jZWR1cmUuCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPSAxOwotCi0JTmRpc01vdmVNZW1vcnkoJmRhdGEsICZlRnVzZUN0cmxTdHJ1YywgNCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgRUZVU0VfQ1RSTCwgZGF0YSk7Ci0KLQkvL1N0ZXAzLiBQb2xsaW5nIEVGU1JPTV9LSUNLKDB4NTgwLCBiaXQzMCkgdW50aWwgaXQgYmVjb21lIDAgYWdhaW4uCi0JaSA9IDA7Ci0Jd2hpbGUoaSA8IDEwMCkKLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgRUZVU0VfQ1RSTCwgKFBVSU5UMzIpICZlRnVzZUN0cmxTdHJ1Yyk7Ci0KLQkJaWYoZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPT0gMCkKLQkJCWJyZWFrOwotCQlSVE1QdXNlY0RlbGF5KDIpOwotCQlpKys7Ci0JfQotCi0JLy9TdGVwNC4gUmVhZCAxNi1ieXRlIG9mIGRhdGEgZnJvbSBFRlVTRV9EQVRBMC0zICgweDU5Qy0weDU5MCkKLQllZnVzZURhdGFPZmZzZXQgPSAgRUZVU0VfREFUQTM7Ci0JZm9yKGk9MDsgaTwgNDsgaSsrKQotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBlZnVzZURhdGFPZmZzZXQsIChQVUlOVDMyKSAmZUZ1c2VEYXRhQnVmZmVyW2ldKTsKLQkJZWZ1c2VEYXRhT2Zmc2V0IC09ICA0OwotCX0KLQotCS8vVXBkYXRlIHRoZSB2YWx1ZSwgdGhlIG9mZnNldCBpcyBtdWx0aXBsZSBvZiAyLCBsZW5ndGggaXMgMgotCWVmdXNlRGF0YU9mZnNldCA9IChPZmZzZXQgJiAweGMpID4+IDI7Ci0JZGF0YSA9IHBEYXRhWzBdICYgMHhmZmZmOwotCS8vVGhlIG9mZnNldCBzaG91bGQgYmUgMHgqKioxMCBvciAweCoqKjAwCi0JaWYoKE9mZnNldCAlIDQpICE9IDApCi0JewotCQllRnVzZURhdGFCdWZmZXJbZWZ1c2VEYXRhT2Zmc2V0XSA9IChlRnVzZURhdGFCdWZmZXJbZWZ1c2VEYXRhT2Zmc2V0XSAmIDB4ZmZmZikgfCAoZGF0YSA8PCAxNik7Ci0JfQotCWVsc2UKLQl7Ci0JCWVGdXNlRGF0YUJ1ZmZlcltlZnVzZURhdGFPZmZzZXRdID0gKGVGdXNlRGF0YUJ1ZmZlcltlZnVzZURhdGFPZmZzZXRdICYgMHhmZmZmMDAwMCkgfCBkYXRhOwotCX0KLQotCWVmdXNlRGF0YU9mZnNldCA9ICBFRlVTRV9EQVRBMzsKLQlmb3IoaT0wOyBpPCA0OyBpKyspCi0JewotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBlZnVzZURhdGFPZmZzZXQsIGVGdXNlRGF0YUJ1ZmZlcltpXSk7Ci0JCWVmdXNlRGF0YU9mZnNldCAtPSA0OwotCX0KLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0JLy9TdGVwMS4gV3JpdGUgMTAtYml0IG9mIGFkZHJlc3MgdG8gRUZTUk9NX0FJTiAoMHg1ODAsIGJpdDI1OmJpdDE2KS4gVGhlIGFkZHJlc3MgbXVzdCBiZSAxNi1ieXRlIGFsaWdubWVudC4KLQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fQUlOID0gT2Zmc2V0ICYgMHhmZmYwOwotCi0JLy9TdGVwMi4gV3JpdGUgRUZTUk9NX01PREUgKDB4NTgwLCBiaXQ3OmJpdDYpIHRvIDMuCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX01PREUgPSAzOwotCi0JLy9TdGVwMy4gV3JpdGUgRUZTUk9NX0tJQ0sgKDB4NTgwLCBiaXQzMCkgdG8gMSB0byBraWNrLW9mZiBwaHlzaWNhbCB3cml0ZSBwcm9jZWR1cmUuCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPSAxOwotCi0JTmRpc01vdmVNZW1vcnkoJmRhdGEsICZlRnVzZUN0cmxTdHJ1YywgNCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgRUZVU0VfQ1RSTCwgZGF0YSk7Ci0KLQkvL1N0ZXA0LiBQb2xsaW5nIEVGU1JPTV9LSUNLKDB4NTgwLCBiaXQzMCkgdW50aWwgaXQgYmVjb21lIDAgYWdhaW4uIEl077+977+9cyBkb25lLgotCWkgPSAwOwotCXdoaWxlKGkgPCAxMDApCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVGVVNFX0NUUkwsIChQVUlOVDMyKSAmZUZ1c2VDdHJsU3RydWMpOwotCi0JCWlmKGVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9LSUNLID09IDApCisJCWlmICgocEFkLT5NQUNWZXJzaW9uICE9IDB4MDApCisJCSAgICAmJiAocEFkLT5NQUNWZXJzaW9uICE9IDB4RkZGRkZGRkYpKQogCQkJYnJlYWs7CiAKLQkJUlRNUHVzZWNEZWxheSgyKTsKLQkJaSsrOworCQlSVE1QdXNlY0RlbGF5KDEwKTsKKwl9IHdoaWxlIChpbmRleCsrIDwgMTAwKTsKKworCXBBZC0+YlVzZUVmdXNlID0gRkFMU0U7CisJUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAmZUZ1c2VDdHJsKTsKKwlwQWQtPmJVc2VFZnVzZSA9ICgoZUZ1c2VDdHJsICYgMHg4MDAwMDAwMCkgPT0gMHg4MDAwMDAwMCkgPyAxIDogMDsKKwlpZiAocEFkLT5iVXNlRWZ1c2UpIHsKKwkJcENoaXBPcHMtPmVlaW5pdCA9IGVGdXNlX2luaXQ7CisJCXBDaGlwT3BzLT5lZXJlYWQgPSBydG1wX2VlX2VmdXNlX3JlYWQxNjsKKwkJcmV0dXJuIDA7CisJfSBlbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5WTSBpcyBFRVBST01cbiIpKTsKKyNlbmRpZiAvKiBSVE1QX0VGVVNFX1NVUFBPUlQgLy8gKi8KKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KKworCXN3aXRjaCAoaW5mVHlwZSkgeworI2lmZGVmIFJUTVBfUENJX1NVUFBPUlQKKwljYXNlIFJUTVBfREVWX0lORl9QQ0k6CisJCXBDaGlwT3BzLT5lZWluaXQgPSBOVUxMOworCQlwQ2hpcE9wcy0+ZWVyZWFkID0gcnRtcF9lZV9wcm9tX3JlYWQxNjsKKwkJYnJlYWs7CisjZW5kaWYgLyogUlRNUF9QQ0lfU1VQUE9SVCAvLyAqLworI2lmZGVmIFJUTVBfVVNCX1NVUFBPUlQKKwljYXNlIFJUTVBfREVWX0lORl9VU0I6CisJCXBDaGlwT3BzLT5lZWluaXQgPSBOVUxMOworCQlwQ2hpcE9wcy0+ZWVyZWFkID0gUlRVU0JSZWFkRUVQUk9NMTY7CisJCWJyZWFrOworI2VuZGlmIC8qIFJUTVBfVVNCX1NVUFBPUlQgLy8gKi8KKworCWRlZmF1bHQ6CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJ0bXBDaGlwT3BzRWVwcm9tSG9vaygpIGZhaWxlZCFcbiIpKTsKKwkJYnJlYWs7CiAJfQorCisJcmV0dXJuIDA7CiB9Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JSVJRTCA9Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTlRTVEFUVVMgZUZ1c2VXcml0ZVJlZ2lzdGVycygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQgT2Zmc2V0LAotCUlOCVVTSE9SVCBMZW5ndGgsCi0JSU4JVVNIT1JUKiBwRGF0YSkKLXsKLQlVU0hPUlQJaTsKLQlVU0hPUlQJZUZ1c2VEYXRhOwotCVVTSE9SVAlMb2dpY2FsQWRkcmVzcywgQmxrTnVtID0gMHhmZmZmOwotCVVDSEFSCUVGU1JPTV9BT1VUOwotCi0JVVNIT1JUIGFkZHIsdG1wYWRkciwgSW5CdWZbM10sIHRtcE9mZnNldDsKLQlVU0hPUlQgYnVmZmVyWzhdOwotCUJPT0xFQU4JCWJXcml0ZVN1Y2Nlc3MgPSBUUlVFOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZUZ1c2VXcml0ZVJlZ2lzdGVycyBPZmZzZXQ9JXgsIHBEYXRhPSV4XG4iLCBPZmZzZXQsICpwRGF0YSkpOwotCi0JLy9TdGVwIDAuIGZpbmQgdGhlIGVudHJ5IGluIHRoZSBtYXBwaW5nIHRhYmxlCi0JLy9UaGUgYWRkcmVzcyBvZiBFRVBST00gaXMgMi1ieXRlcyBhbGlnbm1lbnQuCi0JLy9UaGUgbGFzdCBiaXQgaXMgdXNlZCBmb3IgYWxpZ25tZW50LCBzbyBpdCBtdXN0IGJlIDAuCi0JdG1wT2Zmc2V0ID0gT2Zmc2V0ICYgMHhmZmZlOwotCUVGU1JPTV9BT1VUID0gZUZ1c2VSZWFkUmVnaXN0ZXJzKHBBZCwgdG1wT2Zmc2V0LCAyLCAmZUZ1c2VEYXRhKTsKLQotCWlmKCBFRlNST01fQU9VVCA9PSAweDNmKQotCXsJLy9maW5kIGF2YWlsYWJsZSBsb2dpY2FsIGFkZHJlc3MgcG9pbnRlcgotCQkvL3RoZSBsb2dpY2FsIGFkZHJlc3MgZG9lcyBub3QgZXhpc3QsIGZpbmQgYW4gZW1wdHkgb25lCi0JCS8vZnJvbSB0aGUgZmlyc3QgYWRkcmVzcyBvZiBibG9jayA0NT0xNio0NT0weDJkMCB0byB0aGUgbGFzdCBhZGRyZXNzIG9mIGJsb2NrIDQ3Ci0JCS8vPT0+NDgqMTYtMyhyZXNlcnZlZCk9MkZDCi0JCWZvciAoaT1FRlVTRV9VU0FHRV9NQVBfU1RBUlQ7IGk8PUVGVVNFX1VTQUdFX01BUF9FTkQ7IGkrPTIpCi0JCXsKLQkJCS8vUmV0cml2ZSB0aGUgbG9naWNhbCBibG9jayBudWJtZXIgZm9ybSBlYWNoIGxvZ2ljYWwgYWRkcmVzcyBwb2ludGVyCi0JCQkvL0l0IHdpbGwgYWNjZXNzIHR3byBsb2dpY2FsIGFkZHJlc3MgcG9pbnRlciBlYWNoIHRpbWUuCi0JCQllRnVzZVBoeXNpY2FsUmVhZFJlZ2lzdGVycyhwQWQsIGksIDIsICZMb2dpY2FsQWRkcmVzcyk7Ci0JCQlpZiggKExvZ2ljYWxBZGRyZXNzICYgMHhmZikgPT0gMCkKLQkJCXsvL05vdCB1c2VkIGxvZ2ljYWwgYWRkcmVzcyBwb2ludGVyCi0JCQkJQmxrTnVtID0gaS1FRlVTRV9VU0FHRV9NQVBfU1RBUlQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmKCggKExvZ2ljYWxBZGRyZXNzID4+IDgpICYgMHhmZikgPT0gMCkKLQkJCXsvL05vdCB1c2VkIGxvZ2ljYWwgYWRkcmVzcyBwb2ludGVyCi0JCQkJaWYgKGkgIT0gRUZVU0VfVVNBR0VfTUFQX0VORCkKLQkJCQl7Ci0JCQkJCUJsa051bSA9IGktRUZVU0VfVVNBR0VfTUFQX1NUQVJUKzE7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCUJsa051bSA9IEVGU1JPTV9BT1VUOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImVGdXNlV3JpdGVSZWdpc3RlcnMgQmxrTnVtID0gJWQgXG4iLCBCbGtOdW0pKTsKLQotCWlmKEJsa051bSA9PSAweGZmZmYpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJlRnVzZVdyaXRlUmVnaXN0ZXJzOiBvdXQgb2YgZnJlZSBFLWZ1c2Ugc3BhY2UhISFcbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCS8vU3RlcCAxLiBTYXZlIGRhdGEgb2YgdGhpcyBibG9jawl3aGljaCBpcyBwb2ludGVkIGJ5IHRoZSBhdmFpYmxlIGxvZ2ljYWwgYWRkcmVzcyBwb2ludGVyCi0JLy8gcmVhZCBhbmQgc2F2ZSB0aGUgb3JpZ2luYWwgYmxvY2sgZGF0YQotCWZvcihpID0wOyBpPDg7IGkrKykKLQl7Ci0JCWFkZHIgPSBCbGtOdW0gKiAweDEwIDsKLQotCQlJbkJ1ZlswXSA9IGFkZHIrMippOwotCQlJbkJ1ZlsxXSA9IDI7Ci0JCUluQnVmWzJdID0gMHgwOwotCi0JCWVGdXNlUmVhZFBoeXNpY2FsKHBBZCwgJkluQnVmWzBdLCA0LCAmSW5CdWZbMl0sIDIpOwotCi0JCWJ1ZmZlcltpXSA9IEluQnVmWzJdOwotCX0KLQotCS8vU3RlcCAyLiBVcGRhdGUgdGhlIGRhdGEgaW4gYnVmZmVyLCBhbmQgd3JpdGUgdGhlIGRhdGEgdG8gRWZ1c2UKLQlidWZmZXJbIChPZmZzZXQgPj4gMSkgJSA4XSA9IHBEYXRhWzBdOwotCi0JZG8KLQl7Ci0JCS8vU3RlcCAzLiBXcml0ZSB0aGUgZGF0YSB0byBFZnVzZQotCQlpZighYldyaXRlU3VjY2VzcykKLQkJewotCQkJZm9yKGkgPTA7IGk8ODsgaSsrKQotCQkJewotCQkJCWFkZHIgPSBCbGtOdW0gKiAweDEwIDsKLQotCQkJCUluQnVmWzBdID0gYWRkcisyKmk7Ci0JCQkJSW5CdWZbMV0gPSAyOwotCQkJCUluQnVmWzJdID0gYnVmZmVyW2ldOwotCi0JCQkJZUZ1c2VXcml0ZVBoeXNpY2FsKHBBZCwgJkluQnVmWzBdLCA2LCBOVUxMLCAyKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCQlhZGRyID0gQmxrTnVtICogMHgxMCA7Ci0KLQkJCQlJbkJ1ZlswXSA9IGFkZHIrKE9mZnNldCAlIDE2KTsKLQkJCQlJbkJ1ZlsxXSA9IDI7Ci0JCQkJSW5CdWZbMl0gPSBwRGF0YVswXTsKLQotCQkJCWVGdXNlV3JpdGVQaHlzaWNhbChwQWQsICZJbkJ1ZlswXSwgNiwgTlVMTCwgMik7Ci0JCX0KLQotCQkvL1N0ZXAgNC4gV3JpdGUgbWFwcGluZyB0YWJsZQotCQlhZGRyID0gRUZVU0VfVVNBR0VfTUFQX1NUQVJUK0Jsa051bTsKLQotCQl0bXBhZGRyID0gYWRkcjsKLQotCQlpZihhZGRyICUgMiAhPSAwKQotCQkJYWRkciA9IGFkZHIgLTE7Ci0JCUluQnVmWzBdID0gYWRkcjsKLQkJSW5CdWZbMV0gPSAyOwotCi0JCS8vY29udmVydCB0aGUgYWRkcmVzcyBmcm9tIDEwIHRvIDggYml0ICggYml0NywgNiA9IHBhcml0eSBhbmQgYml0NSB+IDAgPSBiaXQ5fjQpLCBhbmQgd3JpdGUgdG8gbG9naWNhbCBtYXAgZW50cnkKLQkJdG1wT2Zmc2V0ID0gT2Zmc2V0OwotCQl0bXBPZmZzZXQgPj49IDQ7Ci0JCXRtcE9mZnNldCB8PSAoKH4oKHRtcE9mZnNldCAmIDB4MDEpIF4gKCB0bXBPZmZzZXQgPj4gMSAmIDB4MDEpIF4gICh0bXBPZmZzZXQgPj4gMiAmIDB4MDEpIF4gICh0bXBPZmZzZXQgPj4gMyAmIDB4MDEpKSkgPDwgNikgJiAweDQwOwotCQl0bXBPZmZzZXQgfD0gKCh+KCAodG1wT2Zmc2V0ID4+IDIgJiAweDAxKSBeICh0bXBPZmZzZXQgPj4gMyAmIDB4MDEpIF4gKHRtcE9mZnNldCA+PiA0ICYgMHgwMSkgXiAoIHRtcE9mZnNldCA+PiA1ICYgMHgwMSkpKSA8PCA3KSAmIDB4ODA7Ci0KLQkJLy8gd3JpdGUgdGhlIGxvZ2ljYWwgYWRkcmVzcwotCQlpZih0bXBhZGRyJTIgIT0gMCkKLQkJCUluQnVmWzJdID0gdG1wT2Zmc2V0PDw4OwotCQllbHNlCi0JCQlJbkJ1ZlsyXSA9IHRtcE9mZnNldDsKLQotCQllRnVzZVdyaXRlUGh5c2ljYWwocEFkLCZJbkJ1ZlswXSwgNiwgTlVMTCwgMCk7Ci0KLQkJLy9TdGVwIDUuIENvbXBhcmUgZGF0YSBpZiBub3QgdGhlIHNhbWUsIGludmFsaWRhdGUgdGhlIG1hcHBpbmcgZW50cnksIHRoZW4gcmUtd3JpdGUgdGhlIGRhdGEgdW50aWwgRS1mdXNlIGlzIGV4aGF1c3RlZAotCQliV3JpdGVTdWNjZXNzID0gVFJVRTsKLQkJZm9yKGkgPTA7IGk8ODsgaSsrKQotCQl7Ci0JCQlhZGRyID0gQmxrTnVtICogMHgxMCA7Ci0KLQkJCUluQnVmWzBdID0gYWRkcisyKmk7Ci0JCQlJbkJ1ZlsxXSA9IDI7Ci0JCQlJbkJ1ZlsyXSA9IDB4MDsKLQotCQkJZUZ1c2VSZWFkUGh5c2ljYWwocEFkLCAmSW5CdWZbMF0sIDQsICZJbkJ1ZlsyXSwgMik7Ci0KLQkJCWlmKGJ1ZmZlcltpXSAhPSBJbkJ1ZlsyXSkKLQkJCXsKLQkJCQliV3JpdGVTdWNjZXNzID0gRkFMU0U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvL1N0ZXAgNi4gaW52bGlkYXRlIG1hcHBpbmcgZW50cnkgYW5kIGZpbmQgYSBmcmVlIG1hcHBpbmcgZW50cnkgaWYgbm90IHN1Y2NlZWQKLQkJaWYgKCFiV3JpdGVTdWNjZXNzKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOb3QgYldyaXRlU3VjY2VzcyBCbGtOdW0gPSAlZFxuIiwgQmxrTnVtKSk7Ci0KLQkJCS8vIHRoZSBvZmZzZXQgb2YgY3VycmVudCBtYXBwaW5nIGVudHJ5Ci0JCQlhZGRyID0gRUZVU0VfVVNBR0VfTUFQX1NUQVJUK0Jsa051bTsKLQotCQkJLy9maW5kIGEgbmV3IG1hcHBpbmcgZW50cnkKLQkJCUJsa051bSA9IDB4ZmZmZjsKLQkJCWZvciAoaT1FRlVTRV9VU0FHRV9NQVBfU1RBUlQ7IGk8PUVGVVNFX1VTQUdFX01BUF9FTkQ7IGkrPTIpCi0JCQl7Ci0JCQkJZUZ1c2VQaHlzaWNhbFJlYWRSZWdpc3RlcnMocEFkLCBpLCAyLCAmTG9naWNhbEFkZHJlc3MpOwotCQkJCWlmKCAoTG9naWNhbEFkZHJlc3MgJiAweGZmKSA9PSAwKQotCQkJCXsKLQkJCQkJQmxrTnVtID0gaS1FRlVTRV9VU0FHRV9NQVBfU1RBUlQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQllbHNlIGlmKCggKExvZ2ljYWxBZGRyZXNzID4+IDgpICYgMHhmZikgPT0gMCkKLQkJCQl7Ci0JCQkJCWlmIChpICE9IEVGVVNFX1VTQUdFX01BUF9FTkQpCi0JCQkJCXsKLQkJCQkJCUJsa051bSA9IGkrMS1FRlVTRV9VU0FHRV9NQVBfU1RBUlQ7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm90IGJXcml0ZVN1Y2Nlc3MgbmV3IEJsa051bSA9ICVkXG4iLCBCbGtOdW0pKTsKLQkJCWlmKEJsa051bSA9PSAweGZmZmYpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZUZ1c2VXcml0ZVJlZ2lzdGVyczogb3V0IG9mIGZyZWUgRS1mdXNlIHNwYWNlISEhXG4iKSk7Ci0JCQkJcmV0dXJuIEZBTFNFOwotCQkJfQotCi0JCQkvL2ludmFsaWRhdGUgdGhlIG9yaWdpbmFsIG1hcHBpbmcgZW50cnkgaWYgbmV3IGVudHJ5IGlzIG5vdCBmb3VuZAotCQkJdG1wYWRkciA9IGFkZHI7Ci0KLQkJCWlmKGFkZHIgJSAyICE9IDApCi0JCQkJYWRkciA9IGFkZHIgLTE7Ci0JCQlJbkJ1ZlswXSA9IGFkZHI7Ci0JCQlJbkJ1ZlsxXSA9IDI7Ci0KLQkJCWVGdXNlUmVhZFBoeXNpY2FsKHBBZCwgJkluQnVmWzBdLCA0LCAmSW5CdWZbMl0sIDIpOwotCi0JCQkvLyB3cml0ZSB0aGUgbG9naWNhbCBhZGRyZXNzCi0JCQlpZih0bXBhZGRyJTIgIT0gMCkKLQkJCXsKLQkJCQkvLyBJbnZhbGlkYXRlIHRoZSBoaWdoIGJ5dGUKLQkJCQlmb3IgKGk9ODsgaTwxNTsgaSsrKQotCQkJCXsKLQkJCQkJaWYoICggKEluQnVmWzJdID4+IGkpICYgMHgwMSkgPT0gMCkKLQkJCQkJewotCQkJCQkJSW5CdWZbMl0gfD0gKDB4MSA8PGkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gaW52YWxpZGF0ZSB0aGUgbG93IGJ5dGUKLQkJCQlmb3IgKGk9MDsgaTw4OyBpKyspCi0JCQkJewotCQkJCQlpZiggKCAoSW5CdWZbMl0gPj4gaSkgJiAweDAxKSA9PSAwKQotCQkJCQl7Ci0JCQkJCQlJbkJ1ZlsyXSB8PSAoMHgxIDw8aSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVGdXNlV3JpdGVQaHlzaWNhbChwQWQsICZJbkJ1ZlswXSwgNiwgTlVMTCwgMCk7Ci0JCX0KLQl9Ci0Jd2hpbGUoIWJXcml0ZVN1Y2Nlc3MpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JSVJRTCA9Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBlRnVzZVdyaXRlUGh5c2ljYWwoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0gIAlQVVNIT1JUIGxwSW5CdWZmZXIsCi0JVUxPTkcgbkluQnVmZmVyU2l6ZSwKLSAgCVBVQ0hBUiBscE91dEJ1ZmZlciwKLSAgCVVMT05HIG5PdXRCdWZmZXJTaXplCi0pCi17Ci0JVVNIT1JUKiBwSW5CdWYgPSAoVVNIT1JUKilscEluQnVmZmVyOwotCWludCAJCWk7Ci0JLy9VU0hPUlQqIHBPdXRCdWYgPSAoVVNIT1JUKilpb0J1ZmZlcjsKLQotCVVTSE9SVCBPZmZzZXQgPSBwSW5CdWZbMF07CQkJCQkvL2FkZHIKLQlVU0hPUlQgTGVuZ3RoID0gcEluQnVmWzFdOwkJCQkJLy9sZW5ndGgKLQlVU0hPUlQqIHBWYWx1ZVggPSAmcEluQnVmWzJdOwkJCQkvL3ZhbHVlIC4uLgotCQkvLyBMaXR0bGUtZW5kaWFuCQlTCXwJUwlCaWctZW5kaWFuCi0JCS8vIGFkZHIJMwkyCTEJMAl8CTAJMQkyCTMKLQkJLy8gT3JpLVYJRAlDCUIJQQl8CUEJQglDCUQKLQkJLy9BZnRlciBzd2FwcGluZwotCQkvLwkJRAlDCUIJQQl8CUQJQwlCCUEKLQkJLy9Cb3RoIHRoZSBsaXR0bGUgYW5kIGJpZy1lbmRpYW4gdXNlIHRoZSBzYW1lIHNlcXVlbmNlIHRvIHdyaXRlICBkYXRhLgotCQkvL1RoZXJlZm9yZSwgd2Ugb25seSBuZWVkIHN3YXAgZGF0YSB3aGVuIHJlYWQgdGhlIGRhdGEuCi0JZm9yKGk9MDsgaTxMZW5ndGg7IGkrPTIpCi0JewotCQllRnVzZVBoeXNpY2FsV3JpdGVSZWdpc3RlcnMocEFkLCBPZmZzZXQraSwgMiwgJnBWYWx1ZVhbaS8yXSk7Ci0JfQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JSVJRTCA9Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTlRTVEFUVVMgZUZ1c2VXcml0ZSgKLSAgIAlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQJCQlPZmZzZXQsCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4JVVNIT1JUCQkJbGVuZ3RoKQotewotCWludCBpOwotCi0JVVNIT1JUKiBwVmFsdWVYID0gKFBVU0hPUlQpIHBEYXRhOwkJCQkvL3ZhbHVlIC4uLgotCQkvL1RoZSBpbnB1dCB2YWx1ZT0zMDcwIHdpbGwgYmUgc3RvcmVkIGFzIGZvbGxvd2luZwotIAkJLy8gTGl0dGxlLWVuZGlhbgkJUwl8CVMJQmlnLWVuZGlhbgotCQkvLyBhZGRyCQkJMQkwCXwJMAkxCi0JCS8vIE9yaS1WCQkJMzAJNzAJfAkzMAk3MAotCQkvL0FmdGVyIHN3YXBwaW5nCi0JCS8vCQkJCTMwCTcwCXwJNzAJMzAKLQkJLy9DYXN0aW5nCi0JCS8vCQkJCTMwNzAJfAk3MDMwICh4KQotCQkvL1RoZSBzd2FwcGluZyBzaG91bGQgYmUgcmVtb3ZlZCBmb3IgYmlnLWVuZGlhbgotCWZvcihpPTA7IGk8bGVuZ3RoOyBpKz0yKQotCXsKLQkJZUZ1c2VXcml0ZVJlZ2lzdGVycyhwQWQsIE9mZnNldCtpLCAyLCAmcFZhbHVlWFtpLzJdKTsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0KLQlBcmd1bWVudHM6Ci0KLQlSZXR1cm4gVmFsdWU6Ci0KLQlJUlFMID0KLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgc2V0X2VGdXNlR2V0RnJlZUJsb2NrQ291bnRfUHJvYygKLSAgIAlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVVNIT1JUIGk7Ci0JVVNIT1JUCUxvZ2ljYWxBZGRyZXNzOwotCVVTSE9SVCBlZnVzZWZyZWVudW09MDsKLQlpZighcEFkLT5iVXNlRWZ1c2UpCi0JCXJldHVybiBGQUxTRTsKLQlmb3IgKGkgPSBFRlVTRV9VU0FHRV9NQVBfU1RBUlQ7IGkgPD0gRUZVU0VfVVNBR0VfTUFQX0VORDsgaSs9MikKLQl7Ci0JCWVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKHBBZCwgaSwgMiwgJkxvZ2ljYWxBZGRyZXNzKTsKLQkJaWYoIChMb2dpY2FsQWRkcmVzcyAmIDB4ZmYpID09IDApCi0JCXsKLQkJCWVmdXNlZnJlZW51bT0gKFVDSEFSKSAoRUZVU0VfVVNBR0VfTUFQX0VORC1pKzEpOwotCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZSBpZigoIChMb2dpY2FsQWRkcmVzcyA+PiA4KSAmIDB4ZmYpID09IDApCi0JCXsKLQkJCWVmdXNlZnJlZW51bSA9IChVQ0hBUikgKEVGVVNFX1VTQUdFX01BUF9FTkQtaSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmKGkgPT0gRUZVU0VfVVNBR0VfTUFQX0VORCkKLQkJCWVmdXNlZnJlZW51bSA9IDA7Ci0JfQotCXByaW50aygiZWZ1c2VGcmVlTnVtYmVyIGlzICVkXG4iLGVmdXNlZnJlZW51bSk7Ci0JcmV0dXJuIFRSVUU7Ci19Ci1JTlQgc2V0X2VGdXNlZHVtcF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLVVTSE9SVCBJbkJ1ZlszXTsKLQlJTlQgaT0wOwotCWlmKCFwQWQtPmJVc2VFZnVzZSkKLQkJcmV0dXJuIEZBTFNFOwotCWZvcihpID0wOyBpPEVGVVNFX1VTQUdFX01BUF9FTkQvMjsgaSsrKQotCXsKLQkJSW5CdWZbMF0gPSAyKmk7Ci0JCUluQnVmWzFdID0gMjsKLQkJSW5CdWZbMl0gPSAweDA7Ci0KLQkJZUZ1c2VSZWFkUGh5c2ljYWwocEFkLCAmSW5CdWZbMF0sIDQsICZJbkJ1ZlsyXSwgMik7Ci0JCWlmKGklND09MCkKLQkJcHJpbnRrKCJcbkJsb2NrICV4OiIsaS84KTsKLQkJcHJpbnRrKCIlMDR4ICIsSW5CdWZbMl0pOwotCX0KLQlyZXR1cm4gVFJVRTsKLX0KLUlOVAlzZXRfZUZ1c2VMb2FkRnJvbUJpbl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlDSEFSCQkJCQkqc3JjOwotCXN0cnVjdCBmaWxlCQkJCSpzcmNmOwotCUlOVCAJCQkJCXJldHZhbDsKLSAgIAltbV9zZWdtZW50X3QJCQlvcmdmczsKLQlVQ0hBUgkJCQkJKmJ1ZmZlcjsKLQlVQ0hBUgkJCQkJQmluRmlsZVNpemU9MDsKLQlJTlQJCQkJCQlpID0gMCxqPTAsaz0xOwotCVVTSE9SVAkJCQkJKlBEQVRBOwotCVVTSE9SVAkJCQkJREFUQTsKLQlCaW5GaWxlU2l6ZT1zdHJsZW4oIlJUMzB4eEVFUFJPTS5iaW4iKTsKLQlzcmMgPSBrbWFsbG9jKDEyOCwgTUVNX0FMTE9DX0ZMQUcpOwotCU5kaXNaZXJvTWVtb3J5KHNyYywgMTI4KTsKLQotIAlpZihzdHJsZW4oYXJnKT4wKQotCXsKLQotCQlOZGlzTW92ZU1lbW9yeShzcmMsIGFyZywgc3RybGVuKGFyZykpOwotIAl9Ci0KLQllbHNlCi0JewotCi0JCU5kaXNNb3ZlTWVtb3J5KHNyYywgIlJUMzB4eEVFUFJPTS5iaW4iLCBCaW5GaWxlU2l6ZSk7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRmlsZU5hbWU9JXNcbiIsc3JjKSk7Ci0JYnVmZmVyID0ga21hbGxvYyhNQVhfRUVQUk9NX0JJTl9GSUxFX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKLQotCWlmKGJ1ZmZlciA9PSBOVUxMKQotCXsKLQkJa2ZyZWUoc3JjKTsKLQkJIHJldHVybiBGQUxTRTsKLX0KLQlQREFUQT1rbWFsbG9jKHNpemVvZihVU0hPUlQpKjgsTUVNX0FMTE9DX0ZMQUcpOwotCi0JaWYoUERBVEE9PU5VTEwpCi0JewotCQlrZnJlZShzcmMpOwotCi0JCWtmcmVlKGJ1ZmZlcik7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLSAgICAJb3JnZnMgPSBnZXRfZnMoKTsKLSAgIAkgc2V0X2ZzKEtFUk5FTF9EUyk7Ci0KLQlpZiAoc3JjICYmICpzcmMpCi0JewotCQlzcmNmID0gZmlscF9vcGVuKHNyYywgT19SRE9OTFksIDApOwotCQlpZiAoSVNfRVJSKHNyY2YpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsIC1QVFJfRVJSKHNyY2YpLHNyYykpOwotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gVGhlIG9iamVjdCBtdXN0IGhhdmUgYSByZWFkIG1ldGhvZAotCQkJaWYgKHNyY2YtPmZfb3AgJiYgc3JjZi0+Zl9vcC0+cmVhZCkKLQkJCXsKLQkJCQltZW1zZXQoYnVmZmVyLCAweDAwLCBNQVhfRUVQUk9NX0JJTl9GSUxFX1NJWkUpOwotCQkJCXdoaWxlKHNyY2YtPmZfb3AtPnJlYWQoc3JjZiwgJmJ1ZmZlcltpXSwgMSwgJnNyY2YtPmZfcG9zKT09MSkKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiUwMlggIixidWZmZXJbaV0pKTsKLQkJCQkJaWYoKGkrMSklOD09MCkKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlxuIikpOwotICAgICAgICAgICAgICAJCQlpKys7Ci0JCQkJCQlpZihpPj1NQVhfRUVQUk9NX0JJTl9GSUxFX1NJWkUpCi0JCQkJCQkJewotCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gRXJyb3IgJWxkIHJlYWRpbmcgJXMsIFRoZSBmaWxlIGlzIHRvbyBsYXJnZVsxMDI0XVxuIiwgLVBUUl9FUlIoc3JjZiksc3JjKSk7Ci0JCQkJCQkJCWtmcmVlKFBEQVRBKTsKLQkJCQkJCQkJa2ZyZWUoYnVmZmVyKTsKLQkJCQkJCQkJa2ZyZWUoc3JjKTsKLQkJCQkJCQkJcmV0dXJuIEZBTFNFOwotCQkJCQkJCX0KLQkJCSAgICAgICB9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gRXJyb3IhISBTeXN0ZW0gZG9lc3Qgbm90IHN1cHBvcnQgcmVhZCBmdW5jdGlvblxuIikpOwotCQkJCQkJa2ZyZWUoUERBVEEpOwotCQkJCQkJa2ZyZWUoYnVmZmVyKTsKLQkJCQkJCWtmcmVlKHNyYyk7Ci0JCQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQl9Ci0gICAgICAJCX0KLQotCi0JfQotCWVsc2UKLQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gRXJyb3Igc3JjICBvciBzcmNmIGlzIG51bGxcbiIpKTsKLQkJCQkJa2ZyZWUoUERBVEEpOwotCQkJCQlrZnJlZShidWZmZXIpOwotCQkJCQlyZXR1cm4gRkFMU0U7Ci0KLQkJfQotCi0KLQlyZXR2YWw9ZmlscF9jbG9zZShzcmNmLE5VTEwpOwotCi0JaWYgKHJldHZhbCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBFcnJvciAlZCBjbG9zaW5nICVzXG4iLCAtcmV0dmFsLCBzcmMpKTsKLQl9Ci0Jc2V0X2ZzKG9yZ2ZzKTsKLQotCWZvcihqPTA7ajxpO2orKykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiUwMlggIixidWZmZXJbal0pKTsKLQkJaWYoKGorMSklMj09MCkKLQkJCVBEQVRBW2ovMiU4XT0oKGJ1ZmZlcltqXTw8OCkmMHhmZjAwKXwoYnVmZmVyW2otMV0mMHhmZik7Ci0JCWlmKGolMTY9PTApCi0JCXsKLQkJCWs9YnVmZmVyW2pdOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJayY9YnVmZmVyW2pdOwotCQkJaWYoKGorMSklMTY9PTApCi0JCQl7Ci0KLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgcmVzdWx0PSUwMlgsYmxrPSUwMnhcbiIsayxqLzE2KSk7Ci0KLQkJCQlpZihrIT0weGZmKQotCQkJCQllRnVzZVdyaXRlUmVnaXN0ZXJzRnJvbUJpbihwQWQsKFVTSE9SVClqLTE1LCAxNiwgUERBVEEpOwotCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJaWYoZUZ1c2VSZWFkUmVnaXN0ZXJzKHBBZCxqLCAyLChQVVNIT1JUKSZEQVRBKSE9MHgzZikKLQkJCQkJCQllRnVzZVdyaXRlUmVnaXN0ZXJzRnJvbUJpbihwQWQsKFVTSE9SVClqLTE1LCAxNiwgUERBVEEpOwotCQkJCQl9Ci0JCQkJLyoKLQkJCQlmb3IobD0wO2w8ODtsKyspCi0JCQkJCXByaW50aygiJTA0eCAiLFBEQVRBW2xdKTsKLQkJCQlwcmludGsoIlxuIik7Ci0JCQkJKi8KLQkJCQlOZGlzWmVyb01lbW9yeShQREFUQSwxNik7Ci0KLQotCQkJfQotCQl9Ci0KLQotCX0KLQotCi0Ja2ZyZWUoUERBVEEpOwotCWtmcmVlKGJ1ZmZlcik7Ci0Ja2ZyZWUoc3JjKTsKLQlyZXR1cm4gVFJVRTsKLX0KLU5UU1RBVFVTIGVGdXNlV3JpdGVSZWdpc3RlcnNGcm9tQmluKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVCBPZmZzZXQsCi0JSU4JVVNIT1JUIExlbmd0aCwKLQlJTglVU0hPUlQqIHBEYXRhKQotewotCVVTSE9SVAlpOwotCVVTSE9SVAllRnVzZURhdGE7Ci0JVVNIT1JUCUxvZ2ljYWxBZGRyZXNzLCBCbGtOdW0gPSAweGZmZmY7Ci0JVUNIQVIJRUZTUk9NX0FPVVQsTG9vcD0wOwotCUVGVVNFX0NUUkxfU1RSVUMJCWVGdXNlQ3RybFN0cnVjOwotCVVTSE9SVAllZnVzZURhdGFPZmZzZXQ7Ci0JVUlOVDMyCWRhdGEsdGVtcGJ1ZmZlcjsKLQlVU0hPUlQgYWRkcix0bXBhZGRyLCBJbkJ1ZlszXSwgdG1wT2Zmc2V0OwotCVVJTlQzMiBidWZmZXJbNF07Ci0JQk9PTEVBTgkJYldyaXRlU3VjY2VzcyA9IFRSVUU7Ci0JQk9PTEVBTgkJYk5vdFdyaXRlPVRSVUU7Ci0JQk9PTEVBTgkJYkFsbG9jYXRlTmV3QmxrPVRSVUU7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJlRnVzZVdyaXRlUmVnaXN0ZXJzRnJvbUJpbiBPZmZzZXQ9JXgsIHBEYXRhPSUwNHg6JTA0eDolMDR4OiUwNHhcbiIsIE9mZnNldCwgKnBEYXRhLCoocERhdGErMSksKihwRGF0YSsyKSwqKHBEYXRhKzMpKSk7Ci0KLQlkbwotCXsKLQkvL1N0ZXAgMC4gZmluZCB0aGUgZW50cnkgaW4gdGhlIG1hcHBpbmcgdGFibGUKLQkvL1RoZSBhZGRyZXNzIG9mIEVFUFJPTSBpcyAyLWJ5dGVzIGFsaWdubWVudC4KLQkvL1RoZSBsYXN0IGJpdCBpcyB1c2VkIGZvciBhbGlnbm1lbnQsIHNvIGl0IG11c3QgYmUgMC4KLQlMb29wKys7Ci0JdG1wT2Zmc2V0ID0gT2Zmc2V0ICYgMHhmZmZlOwotCUVGU1JPTV9BT1VUID0gZUZ1c2VSZWFkUmVnaXN0ZXJzKHBBZCwgdG1wT2Zmc2V0LCAyLCAmZUZ1c2VEYXRhKTsKLQotCWlmKCBFRlNST01fQU9VVCA9PSAweDNmKQotCXsJLy9maW5kIGF2YWlsYWJsZSBsb2dpY2FsIGFkZHJlc3MgcG9pbnRlcgotCQkvL3RoZSBsb2dpY2FsIGFkZHJlc3MgZG9lcyBub3QgZXhpc3QsIGZpbmQgYW4gZW1wdHkgb25lCi0JCS8vZnJvbSB0aGUgZmlyc3QgYWRkcmVzcyBvZiBibG9jayA0NT0xNio0NT0weDJkMCB0byB0aGUgbGFzdCBhZGRyZXNzIG9mIGJsb2NrIDQ3Ci0JCS8vPT0+NDgqMTYtMyhyZXNlcnZlZCk9MkZDCi0JCWJBbGxvY2F0ZU5ld0Jsaz1UUlVFOwotCQlmb3IgKGk9RUZVU0VfVVNBR0VfTUFQX1NUQVJUOyBpPD1FRlVTRV9VU0FHRV9NQVBfRU5EOyBpKz0yKQotCQl7Ci0JCQkvL1JldHJpdmUgdGhlIGxvZ2ljYWwgYmxvY2sgbnVibWVyIGZvcm0gZWFjaCBsb2dpY2FsIGFkZHJlc3MgcG9pbnRlcgotCQkJLy9JdCB3aWxsIGFjY2VzcyB0d28gbG9naWNhbCBhZGRyZXNzIHBvaW50ZXIgZWFjaCB0aW1lLgotCQkJZUZ1c2VQaHlzaWNhbFJlYWRSZWdpc3RlcnMocEFkLCBpLCAyLCAmTG9naWNhbEFkZHJlc3MpOwotCQkJaWYoIChMb2dpY2FsQWRkcmVzcyAmIDB4ZmYpID09IDApCi0JCQl7Ly9Ob3QgdXNlZCBsb2dpY2FsIGFkZHJlc3MgcG9pbnRlcgotCQkJCUJsa051bSA9IGktRUZVU0VfVVNBR0VfTUFQX1NUQVJUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZigoIChMb2dpY2FsQWRkcmVzcyA+PiA4KSAmIDB4ZmYpID09IDApCi0JCQl7Ly9Ob3QgdXNlZCBsb2dpY2FsIGFkZHJlc3MgcG9pbnRlcgotCQkJCWlmIChpICE9IEVGVVNFX1VTQUdFX01BUF9FTkQpCi0JCQkJewotCQkJCQlCbGtOdW0gPSBpLUVGVVNFX1VTQUdFX01BUF9TVEFSVCsxOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JewotCQliQWxsb2NhdGVOZXdCbGs9RkFMU0U7Ci0JCUJsa051bSA9IEVGU1JPTV9BT1VUOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImVGdXNlV3JpdGVSZWdpc3RlcnMgQmxrTnVtID0gJWQgXG4iLCBCbGtOdW0pKTsKLQotCWlmKEJsa051bSA9PSAweGZmZmYpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJlRnVzZVdyaXRlUmVnaXN0ZXJzOiBvdXQgb2YgZnJlZSBFLWZ1c2Ugc3BhY2UhISFcbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQkvL1N0ZXAgMS4xLjAKLQkvL0lmIHRoZSBibG9jayBpcyBub3QgZXhpc3RpbmcgaW4gbWFwcGluZyB0YWJsZSwgY3JlYXRlIG9uZQotCS8vYW5kIHdyaXRlIGRvd24gdGhlIDE2LWJ5dGVzIGRhdGEgdG8gdGhlIG5ldyBibG9jawotCWlmKGJBbGxvY2F0ZU5ld0JsaykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFsbG9jYXRlIE5ldyBCbGtcbiIpKTsKLQkJZWZ1c2VEYXRhT2Zmc2V0ID0gIEVGVVNFX0RBVEEzOwotCQlmb3IoaT0wOyBpPCA0OyBpKyspCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFsbG9jYXRlIE5ldyBCbGssIERhdGElZD0lMDR4JTA0eFxuIiwzLWkscERhdGFbMippKzFdLHBEYXRhWzIqaV0pKTsKLQkJCXRlbXBidWZmZXI9KChwRGF0YVsyKmkrMV08PDE2KSYweGZmZmYwMDAwKXxwRGF0YVsyKmldOwotCi0KLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIGVmdXNlRGF0YU9mZnNldCx0ZW1wYnVmZmVyKTsKLQkJCWVmdXNlRGF0YU9mZnNldCAtPSA0OwotCi0JCX0KLQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCQkvL1N0ZXAxLjEuMS4gV3JpdGUgMTAtYml0IG9mIGFkZHJlc3MgdG8gRUZTUk9NX0FJTiAoMHg1ODAsIGJpdDI1OmJpdDE2KS4gVGhlIGFkZHJlc3MgbXVzdCBiZSAxNi1ieXRlIGFsaWdubWVudC4KLQkJZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0FJTiA9IEJsa051bSogMHgxMCA7Ci0KLQkJLy9TdGVwMS4xLjIuIFdyaXRlIEVGU1JPTV9NT0RFICgweDU4MCwgYml0NzpiaXQ2KSB0byAzLgotCQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fTU9ERSA9IDM7Ci0KLQkJLy9TdGVwMS4xLjMuIFdyaXRlIEVGU1JPTV9LSUNLICgweDU4MCwgYml0MzApIHRvIDEgdG8ga2ljay1vZmYgcGh5c2ljYWwgd3JpdGUgcHJvY2VkdXJlLgotCQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fS0lDSyA9IDE7Ci0KLQkJTmRpc01vdmVNZW1vcnkoJmRhdGEsICZlRnVzZUN0cmxTdHJ1YywgNCk7Ci0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRUZVU0VfQ1RSTCwgZGF0YSk7Ci0KLQkJLy9TdGVwMS4xLjQuIFBvbGxpbmcgRUZTUk9NX0tJQ0soMHg1ODAsIGJpdDMwKSB1bnRpbCBpdCBiZWNvbWUgMCBhZ2Fpbi4gSXTvv73vv71zIGRvbmUuCi0JCWkgPSAwOwotCQl3aGlsZShpIDwgMTAwKQotCQl7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVGVVNFX0NUUkwsIChQVUlOVDMyKSAmZUZ1c2VDdHJsU3RydWMpOwotCi0JCQlpZihlRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fS0lDSyA9PSAwKQotCQkJCWJyZWFrOwotCi0JCQlSVE1QdXNlY0RlbGF5KDIpOwotCQkJaSsrOwotCQl9Ci0KLQl9Ci0JZWxzZQotCXsJLy9TdGVwMS4yLgotCQkvL0lmIHRoZSBzYW1lIGxvZ2ljYWwgbnVtYmVyIGlzIGV4aXN0aW5nLCBjaGVjayBpZiB0aGUgd3JpdHRpbmcgZGF0YSBhbmQgdGhlIGRhdGEKLQkJLy9zYXZpbmcgaW4gdGhpcyBibG9jayBhcmUgdGhlIHNhbWUuCi0JCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCS8vcmVhZCBjdXJyZW50IHZhbHVlcyBvZiAxNi1ieXRlIGJsb2NrCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgRUZVU0VfQ1RSTCwgKFBVSU5UMzIpICZlRnVzZUN0cmxTdHJ1Yyk7Ci0KLQkJLy9TdGVwMS4yLjAuIFdyaXRlIDEwLWJpdCBvZiBhZGRyZXNzIHRvIEVGU1JPTV9BSU4gKDB4NTgwLCBiaXQyNTpiaXQxNikuIFRoZSBhZGRyZXNzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbm1lbnQuCi0JCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9BSU4gPSBPZmZzZXQgJiAweGZmZjA7Ci0KLQkJLy9TdGVwMS4yLjEuIFdyaXRlIEVGU1JPTV9NT0RFICgweDU4MCwgYml0NzpiaXQ2KSB0byAxLgotCQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fTU9ERSA9IDA7Ci0KLQkJLy9TdGVwMS4yLjIuIFdyaXRlIEVGU1JPTV9LSUNLICgweDU4MCwgYml0MzApIHRvIDEgdG8ga2ljay1vZmYgcGh5c2ljYWwgcmVhZCBwcm9jZWR1cmUuCi0JCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9LSUNLID0gMTsKLQotCQlOZGlzTW92ZU1lbW9yeSgmZGF0YSwgJmVGdXNlQ3RybFN0cnVjLCA0KTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRUZVU0VfQ1RSTCwgZGF0YSk7Ci0KLQkJLy9TdGVwMS4yLjMuIFBvbGxpbmcgRUZTUk9NX0tJQ0soMHg1ODAsIGJpdDMwKSB1bnRpbCBpdCBiZWNvbWUgMCBhZ2Fpbi4KLQkJaSA9IDA7Ci0JCXdoaWxlKGkgPCAxMDApCi0JCXsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRUZVU0VfQ1RSTCwgKFBVSU5UMzIpICZlRnVzZUN0cmxTdHJ1Yyk7Ci0KLQkJCWlmKGVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9LSUNLID09IDApCi0JCQkJYnJlYWs7Ci0JCQlSVE1QdXNlY0RlbGF5KDIpOwotCQkJaSsrOwotCQl9Ci0KLQkJLy9TdGVwMS4yLjQuIFJlYWQgMTYtYnl0ZSBvZiBkYXRhIGZyb20gRUZVU0VfREFUQTAtMyAoMHg1OUMtMHg1OTApCi0JCWVmdXNlRGF0YU9mZnNldCA9ICBFRlVTRV9EQVRBMzsKLQkJZm9yKGk9MDsgaTwgNDsgaSsrKQotCQl7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIGVmdXNlRGF0YU9mZnNldCwgKFBVSU5UMzIpICZidWZmZXJbaV0pOwotCQkJZWZ1c2VEYXRhT2Zmc2V0IC09ICA0OwotCQl9Ci0JCS8vU3RlcDEuMi41LiBDaGVjayBpZiB0aGUgZGF0YSBvZiBlZnVzZSBhbmQgdGhlIHdyaXRpbmcgZGF0YSBhcmUgdGhlIHNhbWUuCi0JCWZvcihpID0wOyBpPDQ7IGkrKykKLQkJewotCQkJdGVtcGJ1ZmZlcj0oKHBEYXRhWzIqaSsxXTw8MTYpJjB4ZmZmZjAwMDApfHBEYXRhWzIqaV07Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJidWZmZXJbJWRdPSV4LHBEYXRhWyVkXT0leCxwRGF0YVslZF09JXgsdGVtcGJ1ZmZlcj0leFxuIixpLGJ1ZmZlcltpXSwyKmkscERhdGFbMippXSwyKmkrMSxwRGF0YVsyKmkrMV0sdGVtcGJ1ZmZlcikpOwotCi0JCQlpZigoKGJ1ZmZlcltpXSYweGZmZmYwMDAwKT09KHBEYXRhWzIqaSsxXTw8MTYpKSYmKChidWZmZXJbaV0mMHhmZmZmKT09cERhdGFbMippXSkpCi0JCQkJYk5vdFdyaXRlJj1UUlVFOwotCQkJZWxzZQotCQkJewotCQkJCWJOb3RXcml0ZSY9RkFMU0U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYoIWJOb3RXcml0ZSkKLQkJewotCQlwcmludGsoIlRoZSBkYXRhIGlzIG5vdCB0aGUgc2FtZVxuIik7Ci0KLQkJCWZvcihpID0wOyBpPDg7IGkrKykKLQkJCXsKLQkJCQlhZGRyID0gQmxrTnVtICogMHgxMCA7Ci0KLQkJCQlJbkJ1ZlswXSA9IGFkZHIrMippOwotCQkJCUluQnVmWzFdID0gMjsKLQkJCQlJbkJ1ZlsyXSA9IHBEYXRhW2ldOwotCi0JCQkJZUZ1c2VXcml0ZVBoeXNpY2FsKHBBZCwgJkluQnVmWzBdLCA2LCBOVUxMLCAyKTsKLQkJCX0KLQotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBUUlVFOwotCSAgICAgfQotCi0KLQotCQkvL1N0ZXAgMi4gV3JpdGUgbWFwcGluZyB0YWJsZQotCQlhZGRyID0gRUZVU0VfVVNBR0VfTUFQX1NUQVJUK0Jsa051bTsKLQotCQl0bXBhZGRyID0gYWRkcjsKLQotCQlpZihhZGRyICUgMiAhPSAwKQotCQkJYWRkciA9IGFkZHIgLTE7Ci0JCUluQnVmWzBdID0gYWRkcjsKLQkJSW5CdWZbMV0gPSAyOwotCi0JCS8vY29udmVydCB0aGUgYWRkcmVzcyBmcm9tIDEwIHRvIDggYml0ICggYml0NywgNiA9IHBhcml0eSBhbmQgYml0NSB+IDAgPSBiaXQ5fjQpLCBhbmQgd3JpdGUgdG8gbG9naWNhbCBtYXAgZW50cnkKLQkJdG1wT2Zmc2V0ID0gT2Zmc2V0OwotCQl0bXBPZmZzZXQgPj49IDQ7Ci0JCXRtcE9mZnNldCB8PSAoKH4oKHRtcE9mZnNldCAmIDB4MDEpIF4gKCB0bXBPZmZzZXQgPj4gMSAmIDB4MDEpIF4gICh0bXBPZmZzZXQgPj4gMiAmIDB4MDEpIF4gICh0bXBPZmZzZXQgPj4gMyAmIDB4MDEpKSkgPDwgNikgJiAweDQwOwotCQl0bXBPZmZzZXQgfD0gKCh+KCAodG1wT2Zmc2V0ID4+IDIgJiAweDAxKSBeICh0bXBPZmZzZXQgPj4gMyAmIDB4MDEpIF4gKHRtcE9mZnNldCA+PiA0ICYgMHgwMSkgXiAoIHRtcE9mZnNldCA+PiA1ICYgMHgwMSkpKSA8PCA3KSAmIDB4ODA7Ci0KLQkJLy8gd3JpdGUgdGhlIGxvZ2ljYWwgYWRkcmVzcwotCQlpZih0bXBhZGRyJTIgIT0gMCkKLQkJCUluQnVmWzJdID0gdG1wT2Zmc2V0PDw4OwotCQllbHNlCi0JCQlJbkJ1ZlsyXSA9IHRtcE9mZnNldDsKLQotCQllRnVzZVdyaXRlUGh5c2ljYWwocEFkLCZJbkJ1ZlswXSwgNiwgTlVMTCwgMCk7Ci0KLQkJLy9TdGVwIDMuIENvbXBhcmUgZGF0YSBpZiBub3QgdGhlIHNhbWUsIGludmFsaWRhdGUgdGhlIG1hcHBpbmcgZW50cnksIHRoZW4gcmUtd3JpdGUgdGhlIGRhdGEgdW50aWwgRS1mdXNlIGlzIGV4aGF1c3RlZAotCQliV3JpdGVTdWNjZXNzID0gVFJVRTsKLQkJZm9yKGkgPTA7IGk8ODsgaSsrKQotCQl7Ci0JCQlhZGRyID0gQmxrTnVtICogMHgxMCA7Ci0KLQkJCUluQnVmWzBdID0gYWRkcisyKmk7Ci0JCQlJbkJ1ZlsxXSA9IDI7Ci0JCQlJbkJ1ZlsyXSA9IDB4MDsKLQotCQkJZUZ1c2VSZWFkUGh5c2ljYWwocEFkLCAmSW5CdWZbMF0sIDQsICZJbkJ1ZlsyXSwgMik7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJhZGRyPSV4LCBidWZmZXJbaV09JXgsSW5CdWZbMl09JXhcbiIsSW5CdWZbMF0scERhdGFbaV0sSW5CdWZbMl0pKTsKLQkJCWlmKHBEYXRhW2ldICE9IEluQnVmWzJdKQotCQkJewotCQkJCWJXcml0ZVN1Y2Nlc3MgPSBGQUxTRTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCS8vU3RlcCA0LiBpbnZsaWRhdGUgbWFwcGluZyBlbnRyeSBhbmQgZmluZCBhIGZyZWUgbWFwcGluZyBlbnRyeSBpZiBub3Qgc3VjY2VlZAotCi0JCWlmICghYldyaXRlU3VjY2VzcyYmTG9vcDwyKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJlRnVzZVdyaXRlUmVnaXN0ZXJzRnJvbUJpbjo6Tm90IGJXcml0ZVN1Y2Nlc3MgQmxrTnVtID0gJWRcbiIsIEJsa051bSkpOwotCi0JCQkvLyB0aGUgb2Zmc2V0IG9mIGN1cnJlbnQgbWFwcGluZyBlbnRyeQotCQkJYWRkciA9IEVGVVNFX1VTQUdFX01BUF9TVEFSVCtCbGtOdW07Ci0KLQkJCS8vZmluZCBhIG5ldyBtYXBwaW5nIGVudHJ5Ci0JCQlCbGtOdW0gPSAweGZmZmY7Ci0JCQlmb3IgKGk9RUZVU0VfVVNBR0VfTUFQX1NUQVJUOyBpPD1FRlVTRV9VU0FHRV9NQVBfRU5EOyBpKz0yKQotCQkJewotCQkJCWVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKHBBZCwgaSwgMiwgJkxvZ2ljYWxBZGRyZXNzKTsKLQkJCQlpZiggKExvZ2ljYWxBZGRyZXNzICYgMHhmZikgPT0gMCkKLQkJCQl7Ci0JCQkJCUJsa051bSA9IGktRUZVU0VfVVNBR0VfTUFQX1NUQVJUOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZWxzZSBpZigoIChMb2dpY2FsQWRkcmVzcyA+PiA4KSAmIDB4ZmYpID09IDApCi0JCQkJewotCQkJCQlpZiAoaSAhPSBFRlVTRV9VU0FHRV9NQVBfRU5EKQotCQkJCQl7Ci0JCQkJCQlCbGtOdW0gPSBpKzEtRUZVU0VfVVNBR0VfTUFQX1NUQVJUOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImVGdXNlV3JpdGVSZWdpc3RlcnNGcm9tQmluOjpOb3QgYldyaXRlU3VjY2VzcyBuZXcgQmxrTnVtID0gJWRcbiIsIEJsa051bSkpOwotCQkJaWYoQmxrTnVtID09IDB4ZmZmZikKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJlRnVzZVdyaXRlUmVnaXN0ZXJzRnJvbUJpbjogb3V0IG9mIGZyZWUgRS1mdXNlIHNwYWNlISEhXG4iKSk7Ci0JCQkJcmV0dXJuIEZBTFNFOwotCQkJfQotCi0JCQkvL2ludmFsaWRhdGUgdGhlIG9yaWdpbmFsIG1hcHBpbmcgZW50cnkgaWYgbmV3IGVudHJ5IGlzIG5vdCBmb3VuZAotCQkJdG1wYWRkciA9IGFkZHI7Ci0KLQkJCWlmKGFkZHIgJSAyICE9IDApCi0JCQkJYWRkciA9IGFkZHIgLTE7Ci0JCQlJbkJ1ZlswXSA9IGFkZHI7Ci0JCQlJbkJ1ZlsxXSA9IDI7Ci0KLQkJCWVGdXNlUmVhZFBoeXNpY2FsKHBBZCwgJkluQnVmWzBdLCA0LCAmSW5CdWZbMl0sIDIpOwotCi0JCQkvLyB3cml0ZSB0aGUgbG9naWNhbCBhZGRyZXNzCi0JCQlpZih0bXBhZGRyJTIgIT0gMCkKLQkJCXsKLQkJCQkvLyBJbnZhbGlkYXRlIHRoZSBoaWdoIGJ5dGUKLQkJCQlmb3IgKGk9ODsgaTwxNTsgaSsrKQotCQkJCXsKLQkJCQkJaWYoICggKEluQnVmWzJdID4+IGkpICYgMHgwMSkgPT0gMCkKLQkJCQkJewotCQkJCQkJSW5CdWZbMl0gfD0gKDB4MSA8PGkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gaW52YWxpZGF0ZSB0aGUgbG93IGJ5dGUKLQkJCQlmb3IgKGk9MDsgaTw4OyBpKyspCi0JCQkJewotCQkJCQlpZiggKCAoSW5CdWZbMl0gPj4gaSkgJiAweDAxKSA9PSAwKQotCQkJCQl7Ci0JCQkJCQlJbkJ1ZlsyXSB8PSAoMHgxIDw8aSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVGdXNlV3JpdGVQaHlzaWNhbChwQWQsICZJbkJ1ZlswXSwgNiwgTlVMTCwgMCk7Ci0JCX0KLQotCX0KLQl3aGlsZSghYldyaXRlU3VjY2VzcyYmTG9vcDwyKTsKLQotCXJldHVybiBUUlVFOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9maXJtd2FyZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZmlybXdhcmUuaAppbmRleCBlNzI5OTZmLi4yZmVjZDMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9maXJtd2FyZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2Zpcm13YXJlLmgKQEAgLTQzLDcgKzQzLDcgQEAKIC8qIEFVVE8gR0VOIFBMRUFTRSBETyBOT1QgTU9ESUZZIElUICovCiAKIAotVUNIQVIgRmlybXdhcmVJbWFnZSBbXSA9IHsKK3U4IEZpcm13YXJlSW1hZ2VfMjg2MCBbXSA9IHsKIDB4MDIsIDB4MDMsIDB4NWUsIDB4MDIsIDB4MDIsIDB4YjEsIDB4MjIsIDB4MjIsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDIsIDB4MDEsIDB4ODIsIDB4ZmYsIDB4ZmYsCiAweGZmLCAweGZmLCAweGZmLCAweDAyLCAweDAwLCAweDFlLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAyLCAweDAxLCAweDMzLCAweGMwLCAweGUwLAogMHhjMCwgMHhmMCwgMHhjMCwgMHg4MywgMHhjMCwgMHg4MiwgMHhjMCwgMHhkMCwgMHg3NSwgMHhkMCwgMHgxOCwgMHhjMiwgMHhhZiwgMHgzMCwgMHg0NSwgMHgwMywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2Zpcm13YXJlXzMwNzAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2Zpcm13YXJlXzMwNzAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzEwZDQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZmlybXdhcmVfMzA3MC5oCkBAIC0wLDAgKzEsNTE3IEBACisvKiBBVVRPIEdFTiBQTEVBU0UgRE8gTk9UIE1PRElGWSBJVCAqLworLyogQVVUTyBHRU4gUExFQVNFIERPIE5PVCBNT0RJRlkgSVQgKi8KKworCit1OCBGaXJtd2FyZUltYWdlXzMwNzAgW10gPSB7CisweGZmLCAweGZmLCAweGZmLCAweDAyLCAweDEwLCAweDI4LCAweDAyLCAweDEwLCAweDMyLCAweDAyLCAweDEwLCAweDc4LCAweDAyLCAweDEzLCAweDFmLCAweDAyLAorMHgxMywgMHgyMCwgMHgwMiwgMHgxMywgMHgzZiwgMHgwMiwgMHgxMywgMHg0NCwgMHgxMiwgMHgxMywgMHg0MCwgMHgyMiwgMHgwMiwgMHgxNywgMHhhZSwgMHgwMiwKKzB4MTgsIDB4ZDIsIDB4MDIsIDB4MTQsIDB4M2QsIDB4MDIsIDB4MTMsIDB4NzgsIDB4MzAsIDB4MDUsIDB4MDYsIDB4MjAsIDB4MGQsIDB4MDMsIDB4MTIsIDB4MTksCisweDk1LCAweDIyLCAweDkwLCAweDAxLCAweDhjLCAweGUwLCAweDMwLCAweGUzLCAweDFiLCAweGU1LCAweDRjLCAweDMwLCAweGUwLCAweDA0LCAweDdmLCAweDQwLAorMHg4MCwgMHgwMiwgMHg3ZiwgMHgwMCwgMHg5MCwgMHgxMCwgMHgyZiwgMHhlZiwgMHhmMCwgMHg5MCwgMHgwMSwgMHg4YywgMHg3NCwgMHgwOCwgMHhmMCwgMHhlNCwKKzB4OTAsIDB4MDEsIDB4YTcsIDB4ZjAsIDB4OTAsIDB4MDEsIDB4OGMsIDB4ZTAsIDB4MzAsIDB4ZTAsIDB4MWMsIDB4OTAsIDB4MDEsIDB4ODAsIDB4ZTAsIDB4YjQsCisweDAyLCAweDE1LCAweGEzLCAweGUwLCAweGI0LCAweDAxLCAweDEwLCAweDkwLCAweDAxLCAweDg0LCAweGUwLCAweGI0LCAweDgxLCAweDA5LCAweDkwLCAweDAxLAorMHg4YywgMHg3NCwgMHgwMSwgMHhmMCwgMHgxMiwgMHgwZCwgMHhjOCwgMHgyMiwgMHg5MCwgMHgwNCwgMHgxNCwgMHhlMCwgMHgyMCwgMHhlNywgMHgwMywgMHgwMiwKKzB4MTMsIDB4MWUsIDB4OTAsIDB4NzAsIDB4MTIsIDB4ZTAsIDB4ZjUsIDB4NTYsIDB4OTAsIDB4MDQsIDB4MDQsIDB4ZTAsIDB4MTIsIDB4MGEsIDB4OWQsIDB4MTAsCisweGQ5LCAweDMxLCAweDEwLCAweGJkLCAweDM2LCAweDExLCAweDAyLCAweDUwLCAweDExLCAweDM5LCAweDUxLCAweDExLCAweDQyLCAweDUyLCAweDExLCAweDQyLAorMHg1MywgMHgxMSwgMHg0MiwgMHg1NCwgMHgxMSwgMHg4MywgMHg1NSwgMHgxMSwgMHhkMiwgMHg1NiwgMHgxMiwgMHgyNSwgMHg3MCwgMHgxMiwgMHg1MCwgMHg3MSwKKzB4MTIsIDB4N2UsIDB4NzIsIDB4MTIsIDB4ZDUsIDB4NzMsIDB4MTIsIDB4ZjYsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MWUsIDB4OTAsIDB4NzAsIDB4MTEsCisweGUwLCAweGY1LCAweDNjLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU1LCAweDU2LAorMHhmNCwgMHg3MCwgMHgwMywgMHgwMiwgMHgxMywgMHgxZSwgMHgwMiwgMHgxMywgMHgxNywgMHgyMCwgMHgwMiwgMHgwMywgMHgzMCwgMHgwMywgMHgxZCwgMHg3ZCwKKzB4MDIsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsIDB4OTEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsCisweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDcwLCAweDAzLCAweDAyLCAweDEzLCAweDFlLCAweDAyLCAweDEzLCAweDE3LCAweDg1LCAweDU2LCAweDQxLCAweGQyLAorMHgwMiwgMHgyMiwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHg1NCwgMHg3ZiwgMHhmZiwgMHhiZiwgMHgwYSwgMHgwZCwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwKKzB4YjQsIDB4MDgsIDB4MDYsIDB4NzUsIDB4NGUsIDB4MDEsIDB4NzUsIDB4NGYsIDB4ODQsIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4NTQsIDB4N2YsIDB4ZmYsCisweGJmLCAweDAyLCAweDEyLCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweDY0LCAweDA4LCAweDYwLCAweDA0LCAweGUwLCAweGI0LCAweDIwLCAweDA2LCAweDc1LAorMHg0ZSwgMHgwMywgMHg3NSwgMHg0ZiwgMHgyMCwgMHhlNCwgMHhmNSwgMHgyNywgMHgyMiwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHgyNCwgMHhmZiwgMHg5MiwKKzB4NDcsIDB4MjIsIDB4OTAsIDB4MDQsIDB4MDQsIDB4ZTAsIDB4MjUsIDB4ZTAsIDB4MjQsIDB4NWQsIDB4ZjUsIDB4NTcsIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsCisweGZmLCAweDc0LCAweDQ3LCAweDI1LCAweDU3LCAweGY4LCAweGM2LCAweGVmLCAweGM2LCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweGZmLCAweDc0LCAweDQ4LAorMHgyNSwgMHg1NywgMHhmOCwgMHhjNiwgMHhlZiwgMHhjNiwgMHhlNCwgMHhmZCwgMHhhZiwgMHg1NiwgMHgxMiwgMHgwYiwgMHg5MSwgMHg5MCwgMHgwNCwgMHgxNCwKKzB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsIDB4NzAsIDB4MDMsIDB4MDIsIDB4MTMsIDB4MWUsCisweDAyLCAweDEzLCAweDE3LCAweGU1LCAweDQ3LCAweDY0LCAweDA3LCAweDYwLCAweDFkLCAweGU1LCAweDQ3LCAweDY0LCAweDA4LCAweDYwLCAweDE3LCAweGU1LAorMHg0NywgMHg2NCwgMHgwOSwgMHg2MCwgMHgxMSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwYSwgMHg2MCwgMHgwYiwgMHhlNSwgMHg0NywgMHg2NCwgMHgwYiwgMHg2MCwKKzB4MDUsIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MGMsIDB4MDgsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4M2EsIDB4ZTUsIDB4NDcsCisweGI0LCAweDA5LCAweDA4LCAweGU1LCAweDNhLCAweGI0LCAweDAzLCAweDAzLCAweGU0LCAweGY1LCAweDQ2LCAweGU1LCAweDQ3LCAweGI0LCAweDBhLCAweDA4LAorMHhlNSwgMHgzYSwgMHhiNCwgMHgwMSwgMHgwMywgMHhlNCwgMHhmNSwgMHg0NiwgMHhlNCwgMHhmZCwgMHhhZiwgMHg1NiwgMHgxMiwgMHgwYiwgMHg5MSwgMHhkMiwKKzB4MDQsIDB4MjIsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4ZjQsIDB4ZmYsIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4NWYsIDB4ZmYsIDB4OTAsIDB4NzAsCisweDExLCAweGUwLCAweDU1LCAweDI3LCAweDRmLCAweDkwLCAweDcwLCAweDE4LCAweGYwLCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweDkwLCAweDcwLCAweDE5LAorMHhmMCwgMHhlNCwgMHhmZCwgMHhhZiwgMHg1NiwgMHgxMiwgMHgwYiwgMHg5MSwgMHgzMCwgMHgxNSwgMHgwMywgMHhkMiwgMHgxNCwgMHgyMiwgMHg5MCwgMHg3MCwKKzB4MTgsIDB4ZTAsIDB4ZjUsIDB4MjcsIDB4OTAsIDB4MDIsIDB4MjksIDB4ZTAsIDB4ZmYsIDB4OTAsIDB4NzAsIDB4MTksIDB4ZTAsIDB4ZmUsIDB4ZWYsIDB4NWUsCisweDkwLCAweDAyLCAweDI5LCAweGYwLCAweDMwLCAweDQ3LCAweDA0LCAweGFmLCAweDI3LCAweDgwLCAweDA0LCAweGU1LCAweDI3LCAweGY0LCAweGZmLCAweDkwLAorMHgwMiwgMHgyOCwgMHhlZiwgMHhmMCwgMHgyMiwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHhmZSwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHhmZCwgMHhlZCwKKzB4ZjgsIDB4ZTYsIDB4ZjUsIDB4NTcsIDB4ZmQsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsIDB4OTEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsCisweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDcwLCAweDAzLCAweDAyLCAweDEzLCAweDFlLCAweDAyLCAweDEzLCAweDE3LAorMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHhmZSwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHhmZCwgMHhlZCwgMHhmNSwgMHg4MiwgMHg4ZSwgMHg4MywgMHhlMCwKKzB4ZjUsIDB4NTcsIDB4ZmQsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsIDB4OTEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsCisweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDcwLCAweDAzLCAweDAyLCAweDEzLCAweDFlLCAweDAyLCAweDEzLCAweDE3LCAweDkwLCAweDEwLAorMHgwMCwgMHhlMCwgMHhmNSwgMHg1NywgMHg5MCwgMHgxMCwgMHgwMiwgMHhlMCwgMHhmNSwgMHg1OCwgMHhhMywgMHhlMCwgMHhmNSwgMHg1OSwgMHhlNSwgMHg1OCwKKzB4YjQsIDB4NzAsIDB4MWUsIDB4ZTUsIDB4NTksIDB4YjQsIDB4MzAsIDB4MTksIDB4OTAsIDB4MDUsIDB4MDgsIDB4ZTAsIDB4NDQsIDB4MDEsIDB4ZjAsIDB4ZmQsCisweDkwLCAweDA1LCAweDA1LCAweGUwLCAweDU0LCAweGZiLCAweGYwLCAweDQ0LCAweDA0LCAweGYwLCAweGVkLCAweDU0LCAweGZlLCAweDkwLCAweDA1LCAweDA4LAorMHhmMCwgMHhlNCwgMHhmNSwgMHg0ZSwgMHhmNSwgMHg0ZiwgMHg3NSwgMHgzYSwgMHhmZiwgMHg3NSwgMHgzYywgMHhmZiwgMHhhZCwgMHg1NywgMHhhZiwgMHg1NiwKKzB4MTIsIDB4MGIsIDB4OTEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsCisweGY0LCAweDYwLCAweDRiLCAweDgwLCAweDQyLCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweDI0LCAweGZmLCAweDkyLCAweDkzLCAweGU0LCAweGZkLCAweGFmLAorMHg1NiwgMHgxMiwgMHgwYiwgMHg5MSwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwKKzB4NTYsIDB4ZjQsIDB4NjAsIDB4MmEsIDB4ODAsIDB4MjEsIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4NGEsIDB4ZDIsIDB4MDUsCisweGFkLCAweDU3LCAweGFmLCAweDU2LCAweDEyLCAweDBiLCAweDkxLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLAorMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg2MCwgMHgwNywgMHg5MCwgMHg3MCwgMHgyNSwgMHhlMCwgMHg0NCwgMHgwMSwgMHhmMCwgMHgyMiwgMHgyMiwKKzB4ZTUsIDB4NTMsIDB4NzAsIDB4MWEsIDB4MzAsIDB4NjAsIDB4MDksIDB4YjIsIDB4NGQsIDB4MzAsIDB4NGQsIDB4MDQsIDB4MDUsIDB4NDYsIDB4YzIsIDB4MDQsCisweGU1LCAweDRmLCAweDQ1LCAweDRlLCAweDYwLCAweDA4LCAweGU1LCAweDRmLCAweDE1LCAweDRmLCAweDcwLCAweDAyLCAweDE1LCAweDRlLCAweDIyLCAweDIyLAorMHhjMiwgMHg0MiwgMHhkMywgMHgyMiwgMHgzMCwgMHgxNCwgMHgzMCwgMHg5MCwgMHg3MCwgMHgxOSwgMHhlMCwgMHg1NSwgMHgyNywgMHhmZiwgMHg5MCwgMHg3MCwKKzB4MTgsIDB4ZTAsIDB4NGYsIDB4ZjUsIDB4MjcsIDB4OTAsIDB4MDIsIDB4MjksIDB4ZTAsIDB4ZmYsIDB4OTAsIDB4NzAsIDB4MTksIDB4ZTAsIDB4ZmUsIDB4ZWYsCisweDVlLCAweDkwLCAweDAyLCAweDI5LCAweGYwLCAweDMwLCAweDQ3LCAweDA0LCAweGFmLCAweDI3LCAweDgwLCAweDA0LCAweGU1LCAweDI3LCAweGY0LCAweGZmLAorMHg5MCwgMHgwMiwgMHgyOCwgMHhlZiwgMHhmMCwgMHhjMiwgMHgxNCwgMHgyMiwgMHhjMiwgMHg0YiwgMHhjMiwgMHg0YywgMHhlNSwgMHg0NCwgMHgxMiwgMHgwYSwKKzB4OWQsIDB4MTMsIDB4OWEsIDB4MDAsIDB4MTQsIDB4MjgsIDB4MDQsIDB4MTQsIDB4MjQsIDB4MDgsIDB4MTQsIDB4MDQsIDB4MTAsIDB4MTMsIDB4YWUsIDB4MjAsCisweDEzLCAweGNlLCAweDYwLCAweDEzLCAweGRmLCAweGEwLCAweDAwLCAweDAwLCAweDE0LCAweDJhLCAweDg1LCAweDQ4LCAweDQzLCAweDg1LCAweDRhLCAweDQyLAorMHg4NSwgMHg0YywgMHg1ZSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNiwgMHg2MCwgMHgwMywgMHgwMiwgMHgxNCwgMHgyYSwgMHg4MCwgMHgxYiwgMHhlNSwgMHg0OCwKKzB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NDMsIDB4ZTUsIDB4NGEsIDB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NDIsIDB4ZTUsIDB4NGMsIDB4YzQsIDB4NTQsCisweDBmLCAweGY1LCAweDVlLCAweGU1LCAweDQ3LCAweDY0LCAweDA2LCAweDcwLCAweDYxLCAweDUzLCAweDQzLCAweDBmLCAweDgwLCAweDVjLCAweDg1LCAweDQ5LAorMHg0MywgMHg4NSwgMHg0YiwgMHg0MiwgMHg4NSwgMHg0ZCwgMHg1ZSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNiwgMHg3MCwgMHg0ZCwgMHg4MCwgMHgxYiwgMHhlNSwKKzB4NDksIDB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NDMsIDB4ZTUsIDB4NGIsIDB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NDIsIDB4ZTUsIDB4NGQsIDB4YzQsCisweDU0LCAweDBmLCAweGY1LCAweDVlLCAweGU1LCAweDQ3LCAweDY0LCAweDA2LCAweDcwLCAweDMwLCAweGU1LCAweDQzLCAweDU0LCAweDBmLCAweDQ0LCAweDEwLAorMHhmNSwgMHg0MywgMHg4MCwgMHgyNiwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNCwgMHg2MCwgMHgwNSwgMHhlNSwgMHg0NywgMHhiNCwgMHgwNSwgMHgwNiwgMHg0MywKKzB4NWUsIDB4MDQsIDB4NzUsIDB4NDIsIDB4MDksIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MDYsIDB4MTAsIDB4ZTUsIDB4NDMsIDB4NTQsIDB4MGYsIDB4NDQsIDB4MzAsCisweGY1LCAweDQzLCAweDgwLCAweDA2LCAweGQyLCAweDRiLCAweDgwLCAweDAyLCAweGQyLCAweDRjLCAweGU0LCAweGY1LCAweDI1LCAweGU1LCAweDQyLCAweGM0LAorMHg1NCwgMHhmMCwgMHhmZiwgMHhlNSwgMHg0MywgMHg1NCwgMHgwZiwgMHg0ZiwgMHhmNSwgMHg1ZiwgMHhkMiwgMHg2MCwgMHgyMiwgMHhkMiwgMHgxNSwgMHhlNSwKKzB4NDcsIDB4MjQsIDB4ZjUsIDB4NjAsIDB4MGIsIDB4MjQsIDB4Y2IsIDB4NjAsIDB4MDcsIDB4MjQsIDB4NDAsIDB4NzAsIDB4MDYsIDB4YzIsIDB4MTUsIDB4MjIsCisweDEyLCAweDE3LCAweDc5LCAweDEyLCAweDE0LCAweDVmLCAweGMyLCAweDE1LCAweGMyLCAweGFmLCAweGMyLCAweDA0LCAweGQyLCAweGFmLCAweDIyLCAweGMyLAorMHhhZiwgMHg5MCwgMHgwNCwgMHgxNCwgMHhlMCwgMHg1NCwgMHgwZSwgMHg2MCwgMHgwNCwgMHhkMiwgMHgxOCwgMHg4MCwgMHgwOCwgMHhlNSwgMHg0ZSwgMHg0NSwKKzB4NGYsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4MTgsIDB4ZDIsIDB4YWYsIDB4OTAsIDB4MDQsIDB4MTQsIDB4ZTAsIDB4YTIsIDB4ZTQsIDB4OTIsIDB4MTksIDB4NzQsCisweDFlLCAweGYwLCAweGU1LCAweDVmLCAweDU0LCAweDBmLCAweGY1LCAweDJkLCAweGU1LCAweDI1LCAweDcwLCAweDEzLCAweDMwLCAweDE4LCAweDA1LCAweGU1LAorMHg1ZiwgMHgyMCwgMHhlNSwgMHgwYiwgMHgzMCwgMHgxOSwgMHgxOSwgMHhlNSwgMHg1ZiwgMHg1NCwgMHgzMCwgMHhmZiwgMHhiZiwgMHgzMCwgMHgxMSwgMHhlNSwKKzB4MjUsIDB4NzAsIDB4MDUsIDB4NzUsIDB4MjUsIDB4MGMsIDB4ODAsIDB4MDIsIDB4MTUsIDB4MjUsIDB4ZDIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4ODAsIDB4MGYsCisweGU1LCAweDVmLCAweDMwLCAweGU2LCAweDA2LCAweGMyLCAweDZjLCAweGQyLCAweDZkLCAweDgwLCAweDA0LCAweGQyLCAweDZjLCAweGMyLCAweDZkLCAweGU1LAorMHg0NywgMHg2NCwgMHgwMywgMHg3MCwgMHgyMSwgMHgzMCwgMHg0YiwgMHgwNiwgMHhjMiwgMHg2YywgMHhkMiwgMHg2ZCwgMHg4MCwgMHgxOCwgMHhlNSwgMHgyNSwKKzB4NzAsIDB4MDMsIDB4MzAsIDB4NGMsIDB4MTEsIDB4YzIsIDB4NGMsIDB4ZTUsIDB4MjUsIDB4NzAsIDB4MDUsIDB4NzUsIDB4MjUsIDB4MDcsIDB4ODAsIDB4MDIsCisweDE1LCAweDI1LCAweGQyLCAweDZjLCAweGQyLCAweDZkLCAweGU1LCAweDQ3LCAweGI0LCAweDA5LCAweDE0LCAweGU1LCAweDQ0LCAweDIwLCAweGUzLCAweDBiLAorMHhlNSwgMHgzYSwgMHg2NCwgMHgwMiwgMHg2MCwgMHgwNSwgMHhlNSwgMHgzYSwgMHhiNCwgMHgwMywgMHgwNCwgMHhjMiwgMHg2YywgMHhkMiwgMHg2ZCwgMHhlNSwKKzB4NDcsIDB4YjQsIDB4MGEsIDB4MTMsIDB4ZTUsIDB4M2EsIDB4YjQsIDB4MDEsIDB4MDYsIDB4YzIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4ODAsIDB4MDgsIDB4ZTUsCisweDNhLCAweDcwLCAweDA0LCAweGQyLCAweDZjLCAweGMyLCAweDZkLCAweDIwLCAweDY5LCAweDA3LCAweGU1LCAweDVlLCAweDIwLCAweGUwLCAweDAyLCAweGIyLAorMHg2OCwgMHgyMCwgMHg2YiwgMHgwNywgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMSwgMHgwMiwgMHhiMiwgMHg2YSwgMHgyMCwgMHg2ZCwgMHgwNywgMHhlNSwgMHg1ZSwKKzB4MjAsIDB4ZTIsIDB4MDIsIDB4YjIsIDB4NmMsIDB4NzUsIDB4MmUsIDB4NDAsIDB4MjAsIDB4NjksIDB4MDQsIDB4YTIsIDB4NjgsIDB4ODAsIDB4MjYsIDB4MzAsCisweDY4LCAweDA2LCAweGU1LCAweDQ2LCAweGEyLCAweGUyLCAweDgwLCAweDFkLCAweGU1LCAweDVlLCAweDIwLCAweGUyLCAweDA0LCAweDdmLCAweDAxLCAweDgwLAorMHgwMiwgMHg3ZiwgMHgwMCwgMHhlNSwgMHg0NiwgMHg1NCwgMHhmMCwgMHhmZSwgMHhiZSwgMHhmMCwgMHgwNCwgMHg3ZSwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3ZSwKKzB4MDAsIDB4ZWUsIDB4NmYsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4NzMsIDB4OTIsIDB4NzIsIDB4MjAsIDB4NmIsIDB4MDQsIDB4YTIsIDB4NmEsIDB4ODAsIDB4MjYsCisweDMwLCAweDZhLCAweDA2LCAweGU1LCAweDQ2LCAweGEyLCAweGUyLCAweDgwLCAweDFkLCAweGU1LCAweDVlLCAweDIwLCAweGUwLCAweDA0LCAweDdmLCAweDAxLAorMHg4MCwgMHgwMiwgMHg3ZiwgMHgwMCwgMHhlNSwgMHg0NiwgMHg1NCwgMHhmMCwgMHhmZSwgMHhiZSwgMHhmMCwgMHgwNCwgMHg3ZSwgMHgwMSwgMHg4MCwgMHgwMiwKKzB4N2UsIDB4MDAsIDB4ZWUsIDB4NmYsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4NzUsIDB4OTIsIDB4NzQsIDB4MjAsIDB4NmQsIDB4MDQsIDB4YTIsIDB4NmMsIDB4ODAsCisweDI2LCAweGU1LCAweDQ3LCAweDY0LCAweDBhLCAweDcwLCAweDIyLCAweDMwLCAweDZjLCAweDA2LCAweGU1LCAweDQ2LCAweGEyLCAweGUzLCAweDgwLCAweDE3LAorMHhlNSwgMHgzYSwgMHhiNCwgMHgwMSwgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwgMHhlMywgMHg4MCwgMHgzNCwgMHhlNSwgMHg0NiwgMHgyMCwgMHhlNCwgMHgwMywKKzB4MzAsIDB4ZTUsIDB4MDMsIDB4ZDMsIDB4ODAsIDB4MDEsIDB4YzMsIDB4ODAsIDB4MjYsIDB4MzAsIDB4NmMsIDB4MDYsIDB4ZTUsIDB4NDYsIDB4YTIsIDB4ZTIsCisweDgwLCAweDFkLCAweGU1LCAweDVlLCAweDIwLCAweGUxLCAweDA0LCAweDdmLCAweDAxLCAweDgwLCAweDAyLCAweDdmLCAweDAwLCAweGU1LCAweDQ2LCAweDU0LAorMHhmMCwgMHhmZSwgMHhiZSwgMHhmMCwgMHgwNCwgMHg3ZSwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3ZSwgMHgwMCwgMHhlZSwgMHg2ZiwgMHgyNCwgMHhmZiwgMHg5MiwKKzB4NzEsIDB4OTIsIDB4NzAsIDB4OTAsIDB4MTAsIDB4MDAsIDB4ZTAsIDB4OTAsIDB4MTAsIDB4MmMsIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MDMsIDB4ZTAsIDB4YzMsCisweDk0LCAweDMwLCAweDQwLCAweDE0LCAweGEyLCAweDcxLCAweDkyLCAweDc3LCAweGEyLCAweDcwLCAweDkyLCAweDc2LCAweGU1LCAweDJlLCAweDEzLCAweDEzLAorMHg1NCwgMHgzZiwgMHhmNSwgMHgyZSwgMHhjMiwgMHg3NywgMHhkMiwgMHg3NiwgMHg5MCwgMHgxMCwgMHgyZiwgMHhlNSwgMHgyZSwgMHhmMCwgMHhlNSwgMHg0NywKKzB4NjQsIDB4MDYsIDB4NzAsIDB4MzksIDB4OTAsIDB4MDIsIDB4MjksIDB4ZTAsIDB4NTQsIDB4ZmUsIDB4ZjAsIDB4ZTUsIDB4NDMsIDB4YzQsIDB4NTQsIDB4MGYsCisweDE0LCAweDYwLCAweDBjLCAweDI0LCAweGZlLCAweDYwLCAweDBjLCAweDI0LCAweDAzLCAweDcwLCAweDEzLCAweGMyLCAweDM4LCAweDgwLCAweDBmLCAweGQyLAorMHgzOCwgMHg4MCwgMHgwYiwgMHhlNSwgMHg0NiwgMHgzMCwgMHhlMiwgMHgwMywgMHhkMywgMHg4MCwgMHgwMSwgMHhjMywgMHg5MiwgMHgzOCwgMHgzMCwgMHg0NywKKzB4MDUsIDB4YWYsIDB4MjcsIDB4MDIsIDB4MTcsIDB4NzMsIDB4ZTUsIDB4MjcsIDB4ZjQsIDB4ZmYsIDB4MDIsIDB4MTcsIDB4NzMsIDB4ZTUsIDB4NDcsIDB4NjQsCisweDA3LCAweDYwLCAweDBmLCAweGU1LCAweDQ3LCAweDY0LCAweDA4LCAweDYwLCAweDA5LCAweGU1LCAweDQ3LCAweDY0LCAweDA5LCAweDYwLCAweDAzLCAweDAyLAorMHgxNiwgMHhmMiwgMHg5MCwgMHgwMiwgMHgyOSwgMHhlMCwgMHg1NCwgMHhmYywgMHhmMCwgMHhlNSwgMHgzYSwgMHgxNCwgMHg2MCwgMHgyMiwgMHgxNCwgMHg2MCwKKzB4MjUsIDB4MTQsIDB4NjAsIDB4MmQsIDB4MjQsIDB4ZmMsIDB4NjAsIDB4NDksIDB4MjQsIDB4ZjksIDB4NjAsIDB4MTQsIDB4MjQsIDB4MGUsIDB4NzAsIDB4NTAsCisweGU1LCAweDQ2LCAweDEzLCAweDEzLCAweDU0LCAweDNmLCAweDc1LCAweGYwLCAweDAzLCAweDg0LCAweGU1LCAweGYwLCAweDI0LCAweGZmLCAweDgwLCAweDNhLAorMHhkMiwgMHgzOSwgMHhjMiwgMHgzOCwgMHg4MCwgMHgzZSwgMHhlNSwgMHg0NiwgMHgzMCwgMHhlMiwgMHgwMywgMHhkMywgMHg4MCwgMHgxZCwgMHhjMywgMHg4MCwKKzB4MWEsIDB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTIsIDB4MGQsIDB4NTQsIDB4MzgsIDB4YzMsIDB4OTQsIDB4MzAsIDB4NTAsIDB4MDYsIDB4N2UsIDB4MDAsIDB4N2YsCisweDAxLCAweDgwLCAweDA0LCAweDdlLCAweDAwLCAweDdmLCAweDAwLCAweGVlLCAweDRmLCAweDI0LCAweGZmLCAweDkyLCAweDM4LCAweGMyLCAweDM5LCAweDgwLAorMHgxMywgMHhlNSwgMHg0NiwgMHgzMCwgMHhlMiwgMHgwMywgMHhkMywgMHg4MCwgMHgwMSwgMHhjMywgMHg5MiwgMHgzOSwgMHhjMiwgMHgzOCwgMHg4MCwgMHgwNCwKKzB4YzIsIDB4MzgsIDB4YzIsIDB4MzksIDB4MzAsIDB4NDcsIDB4MDQsIDB4YWYsIDB4MjcsIDB4ODAsIDB4MDQsIDB4ZTUsIDB4MjcsIDB4ZjQsIDB4ZmYsIDB4MDIsCisweDE3LCAweDczLCAweGU1LCAweDQ3LCAweDY0LCAweDBjLCAweDYwLCAweDA2LCAweGU1LCAweDQ3LCAweDY0LCAweDBiLCAweDcwLCAweDdhLCAweDkwLCAweDAyLAorMHgyOSwgMHhlMCwgMHg1NCwgMHhmZCwgMHhmMCwgMHhlNSwgMHgzYSwgMHgxNCwgMHg2MCwgMHgyMCwgMHgxNCwgMHg2MCwgMHgyMSwgMHgxNCwgMHg2MCwgMHgyYiwKKzB4MjQsIDB4ZmMsIDB4NjAsIDB4NDUsIDB4MjQsIDB4ZjksIDB4NjAsIDB4MTIsIDB4MjQsIDB4MGUsIDB4NzAsIDB4NGEsIDB4ZTUsIDB4NDYsIDB4MTMsIDB4MTMsCisweDU0LCAweDNmLCAweDc1LCAweGYwLCAweDAzLCAweDg0LCAweGU1LCAweGYwLCAweDgwLCAweDI5LCAweGQyLCAweDM5LCAweDgwLCAweDNhLCAweGU1LCAweDQ2LAorMHgzMCwgMHhlMiwgMHgwMywgMHhkMywgMHg4MCwgMHgwMSwgMHhjMywgMHg5MiwgMHgzOSwgMHg4MCwgMHgyZCwgMHhlNSwgMHg0NiwgMHgzMCwgMHhlMiwgMHgwZCwKKzB4NTQsIDB4MzgsIDB4YzMsIDB4OTQsIDB4MzAsIDB4NTAsIDB4MDYsIDB4N2UsIDB4MDAsIDB4N2YsIDB4MDEsIDB4ODAsIDB4MDQsIDB4N2UsIDB4MDAsIDB4N2YsCisweDAwLCAweGVlLCAweDRmLCAweDI0LCAweGZmLCAweDkyLCAweDM5LCAweDgwLCAweDBmLCAweGU1LCAweDQ2LCAweDMwLCAweGUyLCAweDAzLCAweGQzLCAweDgwLAorMHgwMSwgMHhjMywgMHg5MiwgMHgzOSwgMHg4MCwgMHgwMiwgMHhjMiwgMHgzOSwgMHgzMCwgMHg0NywgMHgwNCwgMHhhZiwgMHgyNywgMHg4MCwgMHgwNCwgMHhlNSwKKzB4MjcsIDB4ZjQsIDB4ZmYsIDB4OTAsIDB4MDIsIDB4MjgsIDB4ZWYsIDB4ZjAsIDB4MjIsIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MGIsIDB4MTAsIDB4OTAsIDB4MDIsCisweDI5LCAweGUwLCAweDU0LCAweGViLCAweGYwLCAweGU1LCAweDI3LCAweDU0LCAweGViLCAweDQ1LCAweDQ1LCAweGY1LCAweDI3LCAweDIyLCAweGU0LCAweDkwLAorMHgwMiwgMHgyOSwgMHhmMCwgMHgzMCwgMHg0NywgMHgwNCwgMHhhZiwgMHg0NSwgMHg4MCwgMHgwNCwgMHhlNSwgMHg0NSwgMHhmNCwgMHhmZiwgMHg5MCwgMHgwMiwKKzB4MjgsIDB4ZWYsIDB4ZjAsIDB4MjIsIDB4OGYsIDB4NTAsIDB4ZDIsIDB4NTksIDB4MjIsIDB4OGYsIDB4NTQsIDB4ZDIsIDB4NTgsIDB4MjIsIDB4ZTQsIDB4ZjUsCisweDYyLCAweGMyLCAweGFmLCAweGU1LCAweDUxLCAweDE0LCAweDYwLCAweDQ4LCAweDE0LCAweDYwLCAweDY2LCAweDI0LCAweDAyLCAweDYwLCAweDAzLCAweDAyLAorMHgxOCwgMHhiNiwgMHhkMiwgMHg1OSwgMHg3NSwgMHg1NSwgMHgwMSwgMHg5MCwgMHgwMiwgMHhhMiwgMHhlMCwgMHg1NCwgMHg3ZiwgMHhmMCwgMHhhMywgMHhlMCwKKzB4MjAsIDB4ZTcsIDB4MjMsIDB4OTAsIDB4MDQsIDB4MzQsIDB4ZTAsIDB4YjQsIDB4MDIsIDB4MWMsIDB4YTMsIDB4ZTAsIDB4YjQsIDB4MDIsIDB4MTcsIDB4YTMsCisweGUwLCAweGI0LCAweDAyLCAweDEyLCAweDdmLCAweDIwLCAweDEyLCAweDE3LCAweGE0LCAweDkwLCAweDEwLCAweDA0LCAweGUwLCAweDU0LCAweGYzLCAweGYwLAorMHg3NSwgMHg1MSwgMHgwMSwgMHgwMiwgMHgxOCwgMHhiNiwgMHhlNSwgMHg1MCwgMHg3MCwgMHgwNiwgMHg3NSwgMHg2MiwgMHgwMywgMHgwMiwgMHgxOCwgMHhiNiwKKzB4OTAsIDB4MTIsIDB4MDAsIDB4ZTAsIDB4NTQsIDB4MDMsIDB4NzAsIDB4MTIsIDB4N2YsIDB4MjAsIDB4MTIsIDB4MTcsIDB4YTQsIDB4OTAsIDB4MDIsIDB4YTIsCisweGUwLCAweDU0LCAweGJmLCAweGYwLCAweDc1LCAweDUxLCAweDAyLCAweDAyLCAweDE4LCAweGI2LCAweGU1LCAweDUwLCAweDcwLCAweDAzLCAweDAyLCAweDE4LAorMHhiMSwgMHg5MCwgMHgwMiwgMHhhMywgMHhlMCwgMHgzMCwgMHhlNiwgMHgwMywgMHgwMiwgMHgxOCwgMHhhZCwgMHg5MCwgMHgwNCwgMHgzNywgMHhlMCwgMHg2NCwKKzB4MjIsIDB4NzAsIDB4N2EsIDB4OTAsIDB4MDEsIDB4OGEsIDB4NzQsIDB4N2UsIDB4ZjAsIDB4OTAsIDB4MDEsIDB4OTYsIDB4ZjAsIDB4OTAsIDB4MTIsIDB4MDQsCisweDc0LCAweDBhLCAweGYwLCAweGU1LCAweDU4LCAweGI0LCAweDcyLCAweDE1LCAweGU1LCAweDU5LCAweGI0LCAweDM1LCAweDEwLCAweGU0LCAweDkwLCAweDA1LAorMHgwMCwgMHhmMCwgMHhhMywgMHg3NCwgMHgwOCwgMHhmMCwgMHhhMywgMHg3NCwgMHgwMSwgMHhmMCwgMHg3NCwgMHgwMywgMHhmMCwgMHg3ZiwgMHgwMSwgMHgxMiwKKzB4MGQsIDB4MmEsIDB4OTAsIDB4MTMsIDB4MjgsIDB4ZTAsIDB4NTQsIDB4ZjAsIDB4ZjAsIDB4YTMsIDB4ZTAsIDB4NTQsIDB4ZjAsIDB4ZjAsIDB4ZTUsIDB4NTksCisweGI0LCAweDM1LCAweDE0LCAweGU1LCAweDNjLCAweGY0LCAweDYwLCAweDA2LCAweGEzLCAweGUwLCAweDU0LCAweGYzLCAweDgwLCAweDE0LCAweDkwLCAweDEzLAorMHgyYSwgMHhlMCwgMHg1NCwgMHhmYiwgMHhmMCwgMHg4MCwgMHgxNCwgMHhlNSwgMHgzYywgMHhmNCwgMHg5MCwgMHgxMywgMHgyYSwgMHg2MCwgMHgwOCwgMHhlMCwKKzB4NTQsIDB4ZjIsIDB4NDUsIDB4M2MsIDB4ZjAsIDB4ODAsIDB4MDQsIDB4ZTAsIDB4NTQsIDB4ZmEsIDB4ZjAsIDB4OTAsIDB4MDQsIDB4MDEsIDB4ZTAsIDB4NTQsCisweGZkLCAweGYwLCAweDc1LCAweDYyLCAweDAxLCAweDc1LCAweDU1LCAweDAyLCAweGU0LCAweGY1LCAweDUxLCAweDgwLCAweDA5LCAweGU1LCAweDUwLCAweDcwLAorMHgwNSwgMHg3NSwgMHg2MiwgMHgwMywgMHhmNSwgMHg1MSwgMHhlNSwgMHg2MiwgMHg2MCwgMHgxNSwgMHhjMiwgMHgwMSwgMHhlNCwgMHhmNSwgMHg1MSwgMHhjMiwKKzB4NTksIDB4YWQsIDB4NjIsIDB4YWYsIDB4NDAsIDB4MTIsIDB4MTksIDB4NjEsIDB4ZTUsIDB4NjIsIDB4YjQsIDB4MDMsIDB4MDIsIDB4ZDIsIDB4MDMsIDB4ZDIsCisweGFmLCAweDIyLCAweGMyLCAweGFmLCAweDMwLCAweDAxLCAweDEyLCAweGU0LCAweDkwLCAweDAxLCAweDk2LCAweGYwLCAweGY1LCAweDUxLCAweGMyLCAweDU5LAorMHhjMiwgMHgwMSwgMHg3ZCwgMHgwMiwgMHhhZiwgMHg0MCwgMHgxMiwgMHgxOSwgMHg2MSwgMHhlNSwgMHg1MiwgMHgxNCwgMHg2MCwgMHgwOSwgMHgwNCwgMHg3MCwKKzB4NmQsIDB4NzUsIDB4NTIsIDB4MDEsIDB4NzUsIDB4NTUsIDB4MDMsIDB4OTAsIDB4MDQsIDB4MDEsIDB4ZTAsIDB4NDQsIDB4MGUsIDB4ZjAsIDB4OTAsIDB4MTMsCisweDI4LCAweGUwLCAweDQ0LCAweDBmLCAweGYwLCAweGEzLCAweGUwLCAweDQ0LCAweDBmLCAweGYwLCAweGEzLCAweGUwLCAweDQ0LCAweDA1LCAweGYwLCAweDkwLAorMHgxMiwgMHgwNCwgMHg3NCwgMHgwMywgMHhmMCwgMHhlNSwgMHg1OCwgMHhiNCwgMHg3MiwgMHgxNiwgMHhlNSwgMHg1OSwgMHhiNCwgMHgzNSwgMHgxMSwgMHg5MCwKKzB4MDUsIDB4MDAsIDB4NzQsIDB4ZTIsIDB4ZjAsIDB4YTMsIDB4NzQsIDB4MDgsIDB4ZjAsIDB4YTMsIDB4NzQsIDB4MDEsIDB4ZjAsIDB4NzQsIDB4MDMsIDB4ZjAsCisweDdmLCAweDAxLCAweDEyLCAweDBkLCAweDJhLCAweDkwLCAweDAyLCAweGEyLCAweGUwLCAweDQ0LCAweGMwLCAweGYwLCAweDkwLCAweDEwLCAweDA0LCAweGUwLAorMHg0NCwgMHgwYywgMHhmMCwgMHhlNCwgMHhmNSwgMHg1MiwgMHhmNSwgMHg1NSwgMHgzMCwgMHgwMiwgMHgwOSwgMHhjMiwgMHgwMiwgMHg3ZCwgMHgwMSwgMHhhZiwKKzB4NDEsIDB4MTIsIDB4MTksIDB4NjEsIDB4MzAsIDB4MDMsIDB4MDIsIDB4YzIsIDB4MDMsIDB4ZTQsIDB4OTAsIDB4MDEsIDB4OTYsIDB4ZjAsIDB4ZDIsIDB4YWYsCisweDIyLCAweGVmLCAweGY0LCAweDYwLCAweDJkLCAweGU0LCAweGZlLCAweDc0LCAweDE0LCAweDJlLCAweGY1LCAweDgyLCAweGU0LCAweDM0LCAweDcwLCAweGY1LAorMHg4MywgMHhlMCwgMHhiNCwgMHhmZiwgMHgxOSwgMHg3NCwgMHgxNCwgMHgyZSwgMHhmNSwgMHg4MiwgMHhlNCwgMHgzNCwgMHg3MCwgMHhmNSwgMHg4MywgMHhlZiwKKzB4ZjAsIDB4NzQsIDB4MWMsIDB4MmUsIDB4ZjUsIDB4ODIsIDB4ZTQsIDB4MzQsIDB4NzAsIDB4ZjUsIDB4ODMsIDB4ZWQsIDB4ZjAsIDB4MjIsIDB4MGUsIDB4YmUsCisweDA0LCAweGQ1LCAweDIyLCAweDIyLCAweDIyLCAweDkwLCAweDcwLCAweDJhLCAweGUwLCAweDMwLCAweGUxLCAweDRkLCAweGMyLCAweGFmLCAweDkwLCAweDcwLAorMHgyOCwgMHhlMCwgMHg5MCwgMHgxMCwgMHgxYywgMHhmMCwgMHg5MCwgMHg3MCwgMHgyOSwgMHhlMCwgMHg5MCwgMHgxMCwgMHgxZCwgMHhmMCwgMHg5MCwgMHg3MCwKKzB4MmEsIDB4ZTAsIDB4OTAsIDB4MTAsIDB4MWUsIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MWMsIDB4ZTAsIDB4ZjUsIDB4NjIsIDB4OTAsIDB4MTAsIDB4MWUsIDB4ZTAsCisweDIwLCAweGUxLCAweGYzLCAweDkwLCAweDEwLCAweDFjLCAweGUwLCAweDkwLCAweDcwLCAweDI4LCAweGYwLCAweDkwLCAweDEwLCAweDFkLCAweGUwLCAweDkwLAorMHg3MCwgMHgyOSwgMHhmMCwgMHg5MCwgMHgxMCwgMHgxZSwgMHhlMCwgMHg5MCwgMHg3MCwgMHgyYSwgMHhmMCwgMHgzMCwgMHg0YSwgMHgwNywgMHg5MCwgMHg3MCwKKzB4MjQsIDB4ZTAsIDB4NDQsIDB4MDEsIDB4ZjAsIDB4YzIsIDB4MDUsIDB4ZDIsIDB4YWYsIDB4MjIsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDExLCAweDdiLCAweGM0LAorMHhmZiwgMHhmZiwgMHhmZiwgMHgwMiwgMHgxMCwgMHgyOCwgMHgwMiwgMHgxMCwgMHgzMiwgMHgwMiwgMHgxMCwgMHg3OCwgMHgwMiwgMHgxMywgMHgxZiwgMHgwMiwKKzB4MTMsIDB4MjAsIDB4MDIsIDB4MTMsIDB4M2YsIDB4MDIsIDB4MTMsIDB4NDQsIDB4MTIsIDB4MTMsIDB4NDAsIDB4MjIsIDB4MDIsIDB4MTcsIDB4YWUsIDB4MDIsCisweDE4LCAweGQyLCAweDAyLCAweDE0LCAweDNkLCAweDAyLCAweDEzLCAweDc4LCAweDMwLCAweDA1LCAweDA2LCAweDIwLCAweDBkLCAweDAzLCAweDEyLCAweDE5LAorMHg5NSwgMHgyMiwgMHg5MCwgMHgwMSwgMHg4YywgMHhlMCwgMHgzMCwgMHhlMywgMHgxYiwgMHhlNSwgMHg0YywgMHgzMCwgMHhlMCwgMHgwNCwgMHg3ZiwgMHg0MCwKKzB4ODAsIDB4MDIsIDB4N2YsIDB4MDAsIDB4OTAsIDB4MTAsIDB4MmYsIDB4ZWYsIDB4ZjAsIDB4OTAsIDB4MDEsIDB4OGMsIDB4NzQsIDB4MDgsIDB4ZjAsIDB4ZTQsCisweDkwLCAweDAxLCAweGE3LCAweGYwLCAweDkwLCAweDAxLCAweDhjLCAweGUwLCAweDMwLCAweGUwLCAweDFjLCAweDkwLCAweDAxLCAweDgwLCAweGUwLCAweGI0LAorMHgwMiwgMHgxNSwgMHhhMywgMHhlMCwgMHhiNCwgMHgwMSwgMHgxMCwgMHg5MCwgMHgwMSwgMHg4NCwgMHhlMCwgMHhiNCwgMHg4MSwgMHgwOSwgMHg5MCwgMHgwMSwKKzB4OGMsIDB4NzQsIDB4MDEsIDB4ZjAsIDB4MTIsIDB4MGQsIDB4ZGQsIDB4MjIsIDB4OTAsIDB4MDQsIDB4MTQsIDB4ZTAsIDB4MjAsIDB4ZTcsIDB4MDMsIDB4MDIsCisweDEzLCAweDFlLCAweDkwLCAweDcwLCAweDEyLCAweGUwLCAweGY1LCAweDU2LCAweDkwLCAweDA0LCAweDA0LCAweGUwLCAweDEyLCAweDBhLCAweGI2LCAweDEwLAorMHhkOSwgMHgzMSwgMHgxMCwgMHhiZCwgMHgzNiwgMHgxMSwgMHgwMiwgMHg1MCwgMHgxMSwgMHgzOSwgMHg1MSwgMHgxMSwgMHg0MiwgMHg1MiwgMHgxMSwgMHg0MiwKKzB4NTMsIDB4MTEsIDB4NDIsIDB4NTQsIDB4MTEsIDB4ODMsIDB4NTUsIDB4MTEsIDB4ZDIsIDB4NTYsIDB4MTIsIDB4MjUsIDB4NzAsIDB4MTIsIDB4NTAsIDB4NzEsCisweDEyLCAweDdlLCAweDcyLCAweDEyLCAweGQ1LCAweDczLCAweDEyLCAweGY2LCAweDgwLCAweDAwLCAweDAwLCAweDEzLCAweDFlLCAweDkwLCAweDcwLCAweDExLAorMHhlMCwgMHhmNSwgMHgzYywgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNSwgMHg1NiwKKzB4ZjQsIDB4NzAsIDB4MDMsIDB4MDIsIDB4MTMsIDB4MWUsIDB4MDIsIDB4MTMsIDB4MTcsIDB4MjAsIDB4MDIsIDB4MDMsIDB4MzAsIDB4MDMsIDB4MWQsIDB4N2QsCisweDAyLCAweGFmLCAweDU2LCAweDEyLCAweDBiLCAweGFhLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLAorMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg3MCwgMHgwMywgMHgwMiwgMHgxMywgMHgxZSwgMHgwMiwgMHgxMywgMHgxNywgMHg4NSwgMHg1NiwgMHg0MSwgMHhkMiwKKzB4MDIsIDB4MjIsIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4NTQsIDB4N2YsIDB4ZmYsIDB4YmYsIDB4MGEsIDB4MGQsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsCisweGI0LCAweDA4LCAweDA2LCAweDc1LCAweDRlLCAweDAxLCAweDc1LCAweDRmLCAweDg0LCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweDU0LCAweDdmLCAweGZmLAorMHhiZiwgMHgwMiwgMHgxMiwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgwNCwgMHhlMCwgMHhiNCwgMHgyMCwgMHgwNiwgMHg3NSwKKzB4NGUsIDB4MDMsIDB4NzUsIDB4NGYsIDB4MjAsIDB4ZTQsIDB4ZjUsIDB4MjcsIDB4MjIsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4MjQsIDB4ZmYsIDB4OTIsCisweDQ3LCAweDIyLCAweDkwLCAweDA0LCAweDA0LCAweGUwLCAweDI1LCAweGUwLCAweDI0LCAweDVkLCAweGY1LCAweDU3LCAweDkwLCAweDcwLCAweDEwLCAweGUwLAorMHhmZiwgMHg3NCwgMHg0NywgMHgyNSwgMHg1NywgMHhmOCwgMHhjNiwgMHhlZiwgMHhjNiwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHhmZiwgMHg3NCwgMHg0OCwKKzB4MjUsIDB4NTcsIDB4ZjgsIDB4YzYsIDB4ZWYsIDB4YzYsIDB4ZTQsIDB4ZmQsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsIDB4YWEsIDB4OTAsIDB4MDQsIDB4MTQsCisweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDcwLCAweDAzLCAweDAyLCAweDEzLCAweDFlLAorMHgwMiwgMHgxMywgMHgxNywgMHhlNSwgMHg0NywgMHg2NCwgMHgwNywgMHg2MCwgMHgxZCwgMHhlNSwgMHg0NywgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNywgMHhlNSwKKzB4NDcsIDB4NjQsIDB4MDksIDB4NjAsIDB4MTEsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MGEsIDB4NjAsIDB4MGIsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MGIsIDB4NjAsCisweDA1LCAweGU1LCAweDQ3LCAweGI0LCAweDBjLCAweDA4LCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweDU0LCAweDBmLCAweGY1LCAweDNhLCAweGU1LCAweDQ3LAorMHhiNCwgMHgwOSwgMHgwOCwgMHhlNSwgMHgzYSwgMHhiNCwgMHgwMywgMHgwMywgMHhlNCwgMHhmNSwgMHg0NiwgMHhlNSwgMHg0NywgMHhiNCwgMHgwYSwgMHgwOCwKKzB4ZTUsIDB4M2EsIDB4YjQsIDB4MDEsIDB4MDMsIDB4ZTQsIDB4ZjUsIDB4NDYsIDB4ZTQsIDB4ZmQsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsIDB4YWEsIDB4ZDIsCisweDA0LCAweDIyLCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweGY0LCAweGZmLCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweDVmLCAweGZmLCAweDkwLCAweDcwLAorMHgxMSwgMHhlMCwgMHg1NSwgMHgyNywgMHg0ZiwgMHg5MCwgMHg3MCwgMHgxOCwgMHhmMCwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHg5MCwgMHg3MCwgMHgxOSwKKzB4ZjAsIDB4ZTQsIDB4ZmQsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsIDB4YWEsIDB4MzAsIDB4MTUsIDB4MDMsIDB4ZDIsIDB4MTQsIDB4MjIsIDB4OTAsIDB4NzAsCisweDE4LCAweGUwLCAweGY1LCAweDI3LCAweDkwLCAweDAyLCAweDI5LCAweGUwLCAweGZmLCAweDkwLCAweDcwLCAweDE5LCAweGUwLCAweGZlLCAweGVmLCAweDVlLAorMHg5MCwgMHgwMiwgMHgyOSwgMHhmMCwgMHgzMCwgMHg0NywgMHgwNCwgMHhhZiwgMHgyNywgMHg4MCwgMHgwNCwgMHhlNSwgMHgyNywgMHhmNCwgMHhmZiwgMHg5MCwKKzB4MDIsIDB4MjgsIDB4ZWYsIDB4ZjAsIDB4MjIsIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4ZmUsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4ZmQsIDB4ZWQsCisweGY4LCAweGU2LCAweGY1LCAweDU3LCAweGZkLCAweGFmLCAweDU2LCAweDEyLCAweDBiLCAweGFhLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLAorMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg3MCwgMHgwMywgMHgwMiwgMHgxMywgMHgxZSwgMHgwMiwgMHgxMywgMHgxNywKKzB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4ZmUsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4ZmQsIDB4ZWQsIDB4ZjUsIDB4ODIsIDB4OGUsIDB4ODMsIDB4ZTAsCisweGY1LCAweDU3LCAweGZkLCAweGFmLCAweDU2LCAweDEyLCAweDBiLCAweGFhLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLAorMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg3MCwgMHgwMywgMHgwMiwgMHgxMywgMHgxZSwgMHgwMiwgMHgxMywgMHgxNywgMHg5MCwgMHgxMCwKKzB4MDAsIDB4ZTAsIDB4ZjUsIDB4NTcsIDB4OTAsIDB4MTAsIDB4MDIsIDB4ZTAsIDB4ZjUsIDB4NTgsIDB4YTMsIDB4ZTAsIDB4ZjUsIDB4NTksIDB4ZTUsIDB4NTgsCisweGI0LCAweDcwLCAweDFlLCAweGU1LCAweDU5LCAweGI0LCAweDMwLCAweDE5LCAweDkwLCAweDA1LCAweDA4LCAweGUwLCAweDQ0LCAweDAxLCAweGYwLCAweGZkLAorMHg5MCwgMHgwNSwgMHgwNSwgMHhlMCwgMHg1NCwgMHhmYiwgMHhmMCwgMHg0NCwgMHgwNCwgMHhmMCwgMHhlZCwgMHg1NCwgMHhmZSwgMHg5MCwgMHgwNSwgMHgwOCwKKzB4ZjAsIDB4ZTQsIDB4ZjUsIDB4NGUsIDB4ZjUsIDB4NGYsIDB4NzUsIDB4M2EsIDB4ZmYsIDB4NzUsIDB4M2MsIDB4ZmYsIDB4YWQsIDB4NTcsIDB4YWYsIDB4NTYsCisweDEyLCAweDBiLCAweGFhLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LAorMHhmNCwgMHg2MCwgMHg0YiwgMHg4MCwgMHg0MiwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHgyNCwgMHhmZiwgMHg5MiwgMHg5MywgMHhlNCwgMHhmZCwgMHhhZiwKKzB4NTYsIDB4MTIsIDB4MGIsIDB4YWEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsCisweDU2LCAweGY0LCAweDYwLCAweDJhLCAweDgwLCAweDIxLCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweDI0LCAweGZmLCAweDkyLCAweDRhLCAweGQyLCAweDA1LAorMHhhZCwgMHg1NywgMHhhZiwgMHg1NiwgMHgxMiwgMHgwYiwgMHhhYSwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwKKzB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsIDB4NjAsIDB4MDcsIDB4OTAsIDB4NzAsIDB4MjUsIDB4ZTAsIDB4NDQsIDB4MDEsIDB4ZjAsIDB4MjIsIDB4MjIsCisweGU1LCAweDUzLCAweDcwLCAweDFhLCAweDMwLCAweDYwLCAweDA5LCAweGIyLCAweDRkLCAweDMwLCAweDRkLCAweDA0LCAweDA1LCAweDQ2LCAweGMyLCAweDA0LAorMHhlNSwgMHg0ZiwgMHg0NSwgMHg0ZSwgMHg2MCwgMHgwOCwgMHhlNSwgMHg0ZiwgMHgxNSwgMHg0ZiwgMHg3MCwgMHgwMiwgMHgxNSwgMHg0ZSwgMHgyMiwgMHgyMiwKKzB4YzIsIDB4NDIsIDB4ZDMsIDB4MjIsIDB4MzAsIDB4MTQsIDB4MzAsIDB4OTAsIDB4NzAsIDB4MTksIDB4ZTAsIDB4NTUsIDB4MjcsIDB4ZmYsIDB4OTAsIDB4NzAsCisweDE4LCAweGUwLCAweDRmLCAweGY1LCAweDI3LCAweDkwLCAweDAyLCAweDI5LCAweGUwLCAweGZmLCAweDkwLCAweDcwLCAweDE5LCAweGUwLCAweGZlLCAweGVmLAorMHg1ZSwgMHg5MCwgMHgwMiwgMHgyOSwgMHhmMCwgMHgzMCwgMHg0NywgMHgwNCwgMHhhZiwgMHgyNywgMHg4MCwgMHgwNCwgMHhlNSwgMHgyNywgMHhmNCwgMHhmZiwKKzB4OTAsIDB4MDIsIDB4MjgsIDB4ZWYsIDB4ZjAsIDB4YzIsIDB4MTQsIDB4MjIsIDB4YzIsIDB4NGIsIDB4YzIsIDB4NGMsIDB4ZTUsIDB4NDQsIDB4MTIsIDB4MGEsCisweGI2LCAweDEzLCAweDlhLCAweDAwLCAweDE0LCAweDI4LCAweDA0LCAweDE0LCAweDI0LCAweDA4LCAweDE0LCAweDA0LCAweDEwLCAweDEzLCAweGFlLCAweDIwLAorMHgxMywgMHhjZSwgMHg2MCwgMHgxMywgMHhkZiwgMHhhMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgyYSwgMHg4NSwgMHg0OCwgMHg0MywgMHg4NSwgMHg0YSwgMHg0MiwKKzB4ODUsIDB4NGMsIDB4NWUsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDYsIDB4NjAsIDB4MDMsIDB4MDIsIDB4MTQsIDB4MmEsIDB4ODAsIDB4MWIsIDB4ZTUsIDB4NDgsCisweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDQzLCAweGU1LCAweDRhLCAweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDQyLCAweGU1LCAweDRjLCAweGM0LCAweDU0LAorMHgwZiwgMHhmNSwgMHg1ZSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNiwgMHg3MCwgMHg2MSwgMHg1MywgMHg0MywgMHgwZiwgMHg4MCwgMHg1YywgMHg4NSwgMHg0OSwKKzB4NDMsIDB4ODUsIDB4NGIsIDB4NDIsIDB4ODUsIDB4NGQsIDB4NWUsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDYsIDB4NzAsIDB4NGQsIDB4ODAsIDB4MWIsIDB4ZTUsCisweDQ5LCAweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDQzLCAweGU1LCAweDRiLCAweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDQyLCAweGU1LCAweDRkLCAweGM0LAorMHg1NCwgMHgwZiwgMHhmNSwgMHg1ZSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNiwgMHg3MCwgMHgzMCwgMHhlNSwgMHg0MywgMHg1NCwgMHgwZiwgMHg0NCwgMHgxMCwKKzB4ZjUsIDB4NDMsIDB4ODAsIDB4MjYsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDQsIDB4NjAsIDB4MDUsIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MDUsIDB4MDYsIDB4NDMsCisweDVlLCAweDA0LCAweDc1LCAweDQyLCAweDA5LCAweGU1LCAweDQ3LCAweGI0LCAweDA2LCAweDEwLCAweGU1LCAweDQzLCAweDU0LCAweDBmLCAweDQ0LCAweDMwLAorMHhmNSwgMHg0MywgMHg4MCwgMHgwNiwgMHhkMiwgMHg0YiwgMHg4MCwgMHgwMiwgMHhkMiwgMHg0YywgMHhlNCwgMHhmNSwgMHgyNSwgMHhlNSwgMHg0MiwgMHhjNCwKKzB4NTQsIDB4ZjAsIDB4ZmYsIDB4ZTUsIDB4NDMsIDB4NTQsIDB4MGYsIDB4NGYsIDB4ZjUsIDB4NWYsIDB4ZDIsIDB4NjAsIDB4MjIsIDB4ZDIsIDB4MTUsIDB4ZTUsCisweDQ3LCAweDI0LCAweGY1LCAweDYwLCAweDBiLCAweDI0LCAweGNiLCAweDYwLCAweDA3LCAweDI0LCAweDQwLCAweDcwLCAweDA2LCAweGMyLCAweDE1LCAweDIyLAorMHgxMiwgMHgxNywgMHg3OSwgMHgxMiwgMHgxNCwgMHg1ZiwgMHhjMiwgMHgxNSwgMHhjMiwgMHhhZiwgMHhjMiwgMHgwNCwgMHhkMiwgMHhhZiwgMHgyMiwgMHhjMiwKKzB4YWYsIDB4OTAsIDB4MDQsIDB4MTQsIDB4ZTAsIDB4NTQsIDB4MGUsIDB4NjAsIDB4MDQsIDB4ZDIsIDB4MTgsIDB4ODAsIDB4MDgsIDB4ZTUsIDB4NGUsIDB4NDUsCisweDRmLCAweDI0LCAweGZmLCAweDkyLCAweDE4LCAweGQyLCAweGFmLCAweDkwLCAweDA0LCAweDE0LCAweGUwLCAweGEyLCAweGU0LCAweDkyLCAweDE5LCAweDc0LAorMHgxZSwgMHhmMCwgMHhlNSwgMHg1ZiwgMHg1NCwgMHgwZiwgMHhmNSwgMHgyZCwgMHhlNSwgMHgyNSwgMHg3MCwgMHgxMywgMHgzMCwgMHgxOCwgMHgwNSwgMHhlNSwKKzB4NWYsIDB4MjAsIDB4ZTUsIDB4MGIsIDB4MzAsIDB4MTksIDB4MTksIDB4ZTUsIDB4NWYsIDB4NTQsIDB4MzAsIDB4ZmYsIDB4YmYsIDB4MzAsIDB4MTEsIDB4ZTUsCisweDI1LCAweDcwLCAweDA1LCAweDc1LCAweDI1LCAweDBjLCAweDgwLCAweDAyLCAweDE1LCAweDI1LCAweGQyLCAweDZjLCAweGQyLCAweDZkLCAweDgwLCAweDBmLAorMHhlNSwgMHg1ZiwgMHgzMCwgMHhlNiwgMHgwNiwgMHhjMiwgMHg2YywgMHhkMiwgMHg2ZCwgMHg4MCwgMHgwNCwgMHhkMiwgMHg2YywgMHhjMiwgMHg2ZCwgMHhlNSwKKzB4NDcsIDB4NjQsIDB4MDMsIDB4NzAsIDB4MjEsIDB4MzAsIDB4NGIsIDB4MDYsIDB4YzIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4ODAsIDB4MTgsIDB4ZTUsIDB4MjUsCisweDcwLCAweDAzLCAweDMwLCAweDRjLCAweDExLCAweGMyLCAweDRjLCAweGU1LCAweDI1LCAweDcwLCAweDA1LCAweDc1LCAweDI1LCAweDA3LCAweDgwLCAweDAyLAorMHgxNSwgMHgyNSwgMHhkMiwgMHg2YywgMHhkMiwgMHg2ZCwgMHhlNSwgMHg0NywgMHhiNCwgMHgwOSwgMHgxNCwgMHhlNSwgMHg0NCwgMHgyMCwgMHhlMywgMHgwYiwKKzB4ZTUsIDB4M2EsIDB4NjQsIDB4MDIsIDB4NjAsIDB4MDUsIDB4ZTUsIDB4M2EsIDB4YjQsIDB4MDMsIDB4MDQsIDB4YzIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4ZTUsCisweDQ3LCAweGI0LCAweDBhLCAweDEzLCAweGU1LCAweDNhLCAweGI0LCAweDAxLCAweDA2LCAweGMyLCAweDZjLCAweGQyLCAweDZkLCAweDgwLCAweDA4LCAweGU1LAorMHgzYSwgMHg3MCwgMHgwNCwgMHhkMiwgMHg2YywgMHhjMiwgMHg2ZCwgMHgyMCwgMHg2OSwgMHgwNywgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMCwgMHgwMiwgMHhiMiwKKzB4NjgsIDB4MjAsIDB4NmIsIDB4MDcsIDB4ZTUsIDB4NWUsIDB4MjAsIDB4ZTEsIDB4MDIsIDB4YjIsIDB4NmEsIDB4MjAsIDB4NmQsIDB4MDcsIDB4ZTUsIDB4NWUsCisweDIwLCAweGUyLCAweDAyLCAweGIyLCAweDZjLCAweDc1LCAweDJlLCAweDQwLCAweDIwLCAweDY5LCAweDA0LCAweGEyLCAweDY4LCAweDgwLCAweDI2LCAweDMwLAorMHg2OCwgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwgMHhlMiwgMHg4MCwgMHgxZCwgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMiwgMHgwNCwgMHg3ZiwgMHgwMSwgMHg4MCwKKzB4MDIsIDB4N2YsIDB4MDAsIDB4ZTUsIDB4NDYsIDB4NTQsIDB4ZjAsIDB4ZmUsIDB4YmUsIDB4ZjAsIDB4MDQsIDB4N2UsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N2UsCisweDAwLCAweGVlLCAweDZmLCAweDI0LCAweGZmLCAweDkyLCAweDczLCAweDkyLCAweDcyLCAweDIwLCAweDZiLCAweDA0LCAweGEyLCAweDZhLCAweDgwLCAweDI2LAorMHgzMCwgMHg2YSwgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwgMHhlMiwgMHg4MCwgMHgxZCwgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMCwgMHgwNCwgMHg3ZiwgMHgwMSwKKzB4ODAsIDB4MDIsIDB4N2YsIDB4MDAsIDB4ZTUsIDB4NDYsIDB4NTQsIDB4ZjAsIDB4ZmUsIDB4YmUsIDB4ZjAsIDB4MDQsIDB4N2UsIDB4MDEsIDB4ODAsIDB4MDIsCisweDdlLCAweDAwLCAweGVlLCAweDZmLCAweDI0LCAweGZmLCAweDkyLCAweDc1LCAweDkyLCAweDc0LCAweDIwLCAweDZkLCAweDA0LCAweGEyLCAweDZjLCAweDgwLAorMHgyNiwgMHhlNSwgMHg0NywgMHg2NCwgMHgwYSwgMHg3MCwgMHgyMiwgMHgzMCwgMHg2YywgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwgMHhlMywgMHg4MCwgMHgxNywKKzB4ZTUsIDB4M2EsIDB4YjQsIDB4MDEsIDB4MDYsIDB4ZTUsIDB4NDYsIDB4YTIsIDB4ZTMsIDB4ODAsIDB4MzQsIDB4ZTUsIDB4NDYsIDB4MjAsIDB4ZTQsIDB4MDMsCisweDMwLCAweGU1LCAweDAzLCAweGQzLCAweDgwLCAweDAxLCAweGMzLCAweDgwLCAweDI2LCAweDMwLCAweDZjLCAweDA2LCAweGU1LCAweDQ2LCAweGEyLCAweGUyLAorMHg4MCwgMHgxZCwgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMSwgMHgwNCwgMHg3ZiwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3ZiwgMHgwMCwgMHhlNSwgMHg0NiwgMHg1NCwKKzB4ZjAsIDB4ZmUsIDB4YmUsIDB4ZjAsIDB4MDQsIDB4N2UsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N2UsIDB4MDAsIDB4ZWUsIDB4NmYsIDB4MjQsIDB4ZmYsIDB4OTIsCisweDcxLCAweDkyLCAweDcwLCAweDkwLCAweDEwLCAweDAwLCAweGUwLCAweDkwLCAweDEwLCAweDJjLCAweGYwLCAweDkwLCAweDEwLCAweDAzLCAweGUwLCAweGMzLAorMHg5NCwgMHgzMCwgMHg0MCwgMHgxNCwgMHhhMiwgMHg3MSwgMHg5MiwgMHg3NywgMHhhMiwgMHg3MCwgMHg5MiwgMHg3NiwgMHhlNSwgMHgyZSwgMHgxMywgMHgxMywKKzB4NTQsIDB4M2YsIDB4ZjUsIDB4MmUsIDB4YzIsIDB4NzcsIDB4ZDIsIDB4NzYsIDB4OTAsIDB4MTAsIDB4MmYsIDB4ZTUsIDB4MmUsIDB4ZjAsIDB4ZTUsIDB4NDcsCisweDY0LCAweDA2LCAweDcwLCAweDM5LCAweDkwLCAweDAyLCAweDI5LCAweGUwLCAweDU0LCAweGZlLCAweGYwLCAweGU1LCAweDQzLCAweGM0LCAweDU0LCAweDBmLAorMHgxNCwgMHg2MCwgMHgwYywgMHgyNCwgMHhmZSwgMHg2MCwgMHgwYywgMHgyNCwgMHgwMywgMHg3MCwgMHgxMywgMHhjMiwgMHgzOCwgMHg4MCwgMHgwZiwgMHhkMiwKKzB4MzgsIDB4ODAsIDB4MGIsIDB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTIsIDB4MDMsIDB4ZDMsIDB4ODAsIDB4MDEsIDB4YzMsIDB4OTIsIDB4MzgsIDB4MzAsIDB4NDcsCisweDA1LCAweGFmLCAweDI3LCAweDAyLCAweDE3LCAweDczLCAweGU1LCAweDI3LCAweGY0LCAweGZmLCAweDAyLCAweDE3LCAweDczLCAweGU1LCAweDQ3LCAweDY0LAorMHgwNywgMHg2MCwgMHgwZiwgMHhlNSwgMHg0NywgMHg2NCwgMHgwOCwgMHg2MCwgMHgwOSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwOSwgMHg2MCwgMHgwMywgMHgwMiwKKzB4MTYsIDB4ZjIsIDB4OTAsIDB4MDIsIDB4MjksIDB4ZTAsIDB4NTQsIDB4ZmMsIDB4ZjAsIDB4ZTUsIDB4M2EsIDB4MTQsIDB4NjAsIDB4MjIsIDB4MTQsIDB4NjAsCisweDI1LCAweDE0LCAweDYwLCAweDJkLCAweDI0LCAweGZjLCAweDYwLCAweDQ5LCAweDI0LCAweGY5LCAweDYwLCAweDE0LCAweDI0LCAweDBlLCAweDcwLCAweDUwLAorMHhlNSwgMHg0NiwgMHgxMywgMHgxMywgMHg1NCwgMHgzZiwgMHg3NSwgMHhmMCwgMHgwMywgMHg4NCwgMHhlNSwgMHhmMCwgMHgyNCwgMHhmZiwgMHg4MCwgMHgzYSwKKzB4ZDIsIDB4MzksIDB4YzIsIDB4MzgsIDB4ODAsIDB4M2UsIDB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTIsIDB4MDMsIDB4ZDMsIDB4ODAsIDB4MWQsIDB4YzMsIDB4ODAsCisweDFhLCAweGU1LCAweDQ2LCAweDMwLCAweGUyLCAweDBkLCAweDU0LCAweDM4LCAweGMzLCAweDk0LCAweDMwLCAweDUwLCAweDA2LCAweDdlLCAweDAwLCAweDdmLAorMHgwMSwgMHg4MCwgMHgwNCwgMHg3ZSwgMHgwMCwgMHg3ZiwgMHgwMCwgMHhlZSwgMHg0ZiwgMHgyNCwgMHhmZiwgMHg5MiwgMHgzOCwgMHhjMiwgMHgzOSwgMHg4MCwKKzB4MTMsIDB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTIsIDB4MDMsIDB4ZDMsIDB4ODAsIDB4MDEsIDB4YzMsIDB4OTIsIDB4MzksIDB4YzIsIDB4MzgsIDB4ODAsIDB4MDQsCisweGMyLCAweDM4LCAweGMyLCAweDM5LCAweDMwLCAweDQ3LCAweDA0LCAweGFmLCAweDI3LCAweDgwLCAweDA0LCAweGU1LCAweDI3LCAweGY0LCAweGZmLCAweDAyLAorMHgxNywgMHg3MywgMHhlNSwgMHg0NywgMHg2NCwgMHgwYywgMHg2MCwgMHgwNiwgMHhlNSwgMHg0NywgMHg2NCwgMHgwYiwgMHg3MCwgMHg3YSwgMHg5MCwgMHgwMiwKKzB4MjksIDB4ZTAsIDB4NTQsIDB4ZmQsIDB4ZjAsIDB4ZTUsIDB4M2EsIDB4MTQsIDB4NjAsIDB4MjAsIDB4MTQsIDB4NjAsIDB4MjEsIDB4MTQsIDB4NjAsIDB4MmIsCisweDI0LCAweGZjLCAweDYwLCAweDQ1LCAweDI0LCAweGY5LCAweDYwLCAweDEyLCAweDI0LCAweDBlLCAweDcwLCAweDRhLCAweGU1LCAweDQ2LCAweDEzLCAweDEzLAorMHg1NCwgMHgzZiwgMHg3NSwgMHhmMCwgMHgwMywgMHg4NCwgMHhlNSwgMHhmMCwgMHg4MCwgMHgyOSwgMHhkMiwgMHgzOSwgMHg4MCwgMHgzYSwgMHhlNSwgMHg0NiwKKzB4MzAsIDB4ZTIsIDB4MDMsIDB4ZDMsIDB4ODAsIDB4MDEsIDB4YzMsIDB4OTIsIDB4MzksIDB4ODAsIDB4MmQsIDB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTIsIDB4MGQsCisweDU0LCAweDM4LCAweGMzLCAweDk0LCAweDMwLCAweDUwLCAweDA2LCAweDdlLCAweDAwLCAweDdmLCAweDAxLCAweDgwLCAweDA0LCAweDdlLCAweDAwLCAweDdmLAorMHgwMCwgMHhlZSwgMHg0ZiwgMHgyNCwgMHhmZiwgMHg5MiwgMHgzOSwgMHg4MCwgMHgwZiwgMHhlNSwgMHg0NiwgMHgzMCwgMHhlMiwgMHgwMywgMHhkMywgMHg4MCwKKzB4MDEsIDB4YzMsIDB4OTIsIDB4MzksIDB4ODAsIDB4MDIsIDB4YzIsIDB4MzksIDB4MzAsIDB4NDcsIDB4MDQsIDB4YWYsIDB4MjcsIDB4ODAsIDB4MDQsIDB4ZTUsCisweDI3LCAweGY0LCAweGZmLCAweDkwLCAweDAyLCAweDI4LCAweGVmLCAweGYwLCAweDIyLCAweGU1LCAweDQ3LCAweGI0LCAweDBiLCAweDEwLCAweDkwLCAweDAyLAorMHgyOSwgMHhlMCwgMHg1NCwgMHhlYiwgMHhmMCwgMHhlNSwgMHgyNywgMHg1NCwgMHhlYiwgMHg0NSwgMHg0NSwgMHhmNSwgMHgyNywgMHgyMiwgMHhlNCwgMHg5MCwKKzB4MDIsIDB4MjksIDB4ZjAsIDB4MzAsIDB4NDcsIDB4MDQsIDB4YWYsIDB4NDUsIDB4ODAsIDB4MDQsIDB4ZTUsIDB4NDUsIDB4ZjQsIDB4ZmYsIDB4OTAsIDB4MDIsCisweDI4LCAweGVmLCAweGYwLCAweDIyLCAweDhmLCAweDUwLCAweGQyLCAweDU5LCAweDIyLCAweDhmLCAweDU0LCAweGQyLCAweDU4LCAweDIyLCAweGU0LCAweGY1LAorMHg2MiwgMHhjMiwgMHhhZiwgMHhlNSwgMHg1MSwgMHgxNCwgMHg2MCwgMHg0OCwgMHgxNCwgMHg2MCwgMHg2NiwgMHgyNCwgMHgwMiwgMHg2MCwgMHgwMywgMHgwMiwKKzB4MTgsIDB4YjYsIDB4ZDIsIDB4NTksIDB4NzUsIDB4NTUsIDB4MDEsIDB4OTAsIDB4MDIsIDB4YTIsIDB4ZTAsIDB4NTQsIDB4N2YsIDB4ZjAsIDB4YTMsIDB4ZTAsCisweDIwLCAweGU3LCAweDIzLCAweDkwLCAweDA0LCAweDM0LCAweGUwLCAweGI0LCAweDAyLCAweDFjLCAweGEzLCAweGUwLCAweGI0LCAweDAyLCAweDE3LCAweGEzLAorMHhlMCwgMHhiNCwgMHgwMiwgMHgxMiwgMHg3ZiwgMHgyMCwgMHgxMiwgMHgxNywgMHhhNCwgMHg5MCwgMHgxMCwgMHgwNCwgMHhlMCwgMHg1NCwgMHhmMywgMHhmMCwKKzB4NzUsIDB4NTEsIDB4MDEsIDB4MDIsIDB4MTgsIDB4YjYsIDB4ZTUsIDB4NTAsIDB4NzAsIDB4MDYsIDB4NzUsIDB4NjIsIDB4MDMsIDB4MDIsIDB4MTgsIDB4YjYsCisweDkwLCAweDEyLCAweDAwLCAweGUwLCAweDU0LCAweDAzLCAweDcwLCAweDEyLCAweDdmLCAweDIwLCAweDEyLCAweDE3LCAweGE0LCAweDkwLCAweDAyLCAweGEyLAorMHhlMCwgMHg1NCwgMHhiZiwgMHhmMCwgMHg3NSwgMHg1MSwgMHgwMiwgMHgwMiwgMHgxOCwgMHhiNiwgMHhlNSwgMHg1MCwgMHg3MCwgMHgwMywgMHgwMiwgMHgxOCwKKzB4YjEsIDB4OTAsIDB4MDIsIDB4YTMsIDB4ZTAsIDB4MzAsIDB4ZTYsIDB4MDMsIDB4MDIsIDB4MTgsIDB4YWQsIDB4OTAsIDB4MDQsIDB4MzcsIDB4ZTAsIDB4NjQsCisweDIyLCAweDcwLCAweDdhLCAweDkwLCAweDAxLCAweDhhLCAweDc0LCAweDdlLCAweGYwLCAweDkwLCAweDAxLCAweDk2LCAweGYwLCAweDkwLCAweDEyLCAweDA0LAorMHg3NCwgMHgwYSwgMHhmMCwgMHhlNSwgMHg1OCwgMHhiNCwgMHg3MiwgMHgxNSwgMHhlNSwgMHg1OSwgMHhiNCwgMHgzNSwgMHgxMCwgMHhlNCwgMHg5MCwgMHgwNSwKKzB4MDAsIDB4ZjAsIDB4YTMsIDB4NzQsIDB4MDgsIDB4ZjAsIDB4YTMsIDB4NzQsIDB4MDEsIDB4ZjAsIDB4NzQsIDB4MDMsIDB4ZjAsIDB4N2YsIDB4MDEsIDB4MTIsCisweDBkLCAweDQ4LCAweDkwLCAweDEzLCAweDI4LCAweGUwLCAweDU0LCAweGYwLCAweGYwLCAweGEzLCAweGUwLCAweDU0LCAweGYwLCAweGYwLCAweGU1LCAweDU5LAorMHhiNCwgMHgzNSwgMHgxNCwgMHhlNSwgMHgzYywgMHhmNCwgMHg2MCwgMHgwNiwgMHhhMywgMHhlMCwgMHg1NCwgMHhmMywgMHg4MCwgMHgxNCwgMHg5MCwgMHgxMywKKzB4MmEsIDB4ZTAsIDB4NTQsIDB4ZmIsIDB4ZjAsIDB4ODAsIDB4MTQsIDB4ZTUsIDB4M2MsIDB4ZjQsIDB4OTAsIDB4MTMsIDB4MmEsIDB4NjAsIDB4MDgsIDB4ZTAsCisweDU0LCAweGYyLCAweDQ1LCAweDNjLCAweGYwLCAweDgwLCAweDA0LCAweGUwLCAweDU0LCAweGZhLCAweGYwLCAweDkwLCAweDA0LCAweDAxLCAweGUwLCAweDU0LAorMHhmZCwgMHhmMCwgMHg3NSwgMHg2MiwgMHgwMSwgMHg3NSwgMHg1NSwgMHgwMiwgMHhlNCwgMHhmNSwgMHg1MSwgMHg4MCwgMHgwOSwgMHhlNSwgMHg1MCwgMHg3MCwKKzB4MDUsIDB4NzUsIDB4NjIsIDB4MDMsIDB4ZjUsIDB4NTEsIDB4ZTUsIDB4NjIsIDB4NjAsIDB4MTUsIDB4YzIsIDB4MDEsIDB4ZTQsIDB4ZjUsIDB4NTEsIDB4YzIsCisweDU5LCAweGFkLCAweDYyLCAweGFmLCAweDQwLCAweDEyLCAweDE5LCAweDYxLCAweGU1LCAweDYyLCAweGI0LCAweDAzLCAweDAyLCAweGQyLCAweDAzLCAweGQyLAorMHhhZiwgMHgyMiwgMHhjMiwgMHhhZiwgMHgzMCwgMHgwMSwgMHgxMiwgMHhlNCwgMHg5MCwgMHgwMSwgMHg5NiwgMHhmMCwgMHhmNSwgMHg1MSwgMHhjMiwgMHg1OSwKKzB4YzIsIDB4MDEsIDB4N2QsIDB4MDIsIDB4YWYsIDB4NDAsIDB4MTIsIDB4MTksIDB4NjEsIDB4ZTUsIDB4NTIsIDB4MTQsIDB4NjAsIDB4MDksIDB4MDQsIDB4NzAsCisweDZkLCAweDc1LCAweDUyLCAweDAxLCAweDc1LCAweDU1LCAweDAzLCAweDkwLCAweDA0LCAweDAxLCAweGUwLCAweDQ0LCAweDBlLCAweGYwLCAweDkwLCAweDEzLAorMHgyOCwgMHhlMCwgMHg0NCwgMHgwZiwgMHhmMCwgMHhhMywgMHhlMCwgMHg0NCwgMHgwZiwgMHhmMCwgMHhhMywgMHhlMCwgMHg0NCwgMHgwNSwgMHhmMCwgMHg5MCwKKzB4MTIsIDB4MDQsIDB4NzQsIDB4MDMsIDB4ZjAsIDB4ZTUsIDB4NTgsIDB4YjQsIDB4NzIsIDB4MTYsIDB4ZTUsIDB4NTksIDB4YjQsIDB4MzUsIDB4MTEsIDB4OTAsCisweDA1LCAweDAwLCAweDc0LCAweGUyLCAweGYwLCAweGEzLCAweDc0LCAweDA4LCAweGYwLCAweGEzLCAweDc0LCAweDAxLCAweGYwLCAweDc0LCAweDAzLCAweGYwLAorMHg3ZiwgMHgwMSwgMHgxMiwgMHgwZCwgMHg0OCwgMHg5MCwgMHgwMiwgMHhhMiwgMHhlMCwgMHg0NCwgMHhjMCwgMHhmMCwgMHg5MCwgMHgxMCwgMHgwNCwgMHhlMCwKKzB4NDQsIDB4MGMsIDB4ZjAsIDB4ZTQsIDB4ZjUsIDB4NTIsIDB4ZjUsIDB4NTUsIDB4MzAsIDB4MDIsIDB4MDksIDB4YzIsIDB4MDIsIDB4N2QsIDB4MDEsIDB4YWYsCisweDQxLCAweDEyLCAweDE5LCAweDYxLCAweDMwLCAweDAzLCAweDAyLCAweGMyLCAweDAzLCAweGU0LCAweDkwLCAweDAxLCAweDk2LCAweGYwLCAweGQyLCAweGFmLAorMHgyMiwgMHhlZiwgMHhmNCwgMHg2MCwgMHgyZCwgMHhlNCwgMHhmZSwgMHg3NCwgMHgxNCwgMHgyZSwgMHhmNSwgMHg4MiwgMHhlNCwgMHgzNCwgMHg3MCwgMHhmNSwKKzB4ODMsIDB4ZTAsIDB4YjQsIDB4ZmYsIDB4MTksIDB4NzQsIDB4MTQsIDB4MmUsIDB4ZjUsIDB4ODIsIDB4ZTQsIDB4MzQsIDB4NzAsIDB4ZjUsIDB4ODMsIDB4ZWYsCisweGYwLCAweDc0LCAweDFjLCAweDJlLCAweGY1LCAweDgyLCAweGU0LCAweDM0LCAweDcwLCAweGY1LCAweDgzLCAweGVkLCAweGYwLCAweDIyLCAweDBlLCAweGJlLAorMHgwNCwgMHhkNSwgMHgyMiwgMHgyMiwgMHgyMiwgMHg5MCwgMHg3MCwgMHgyYSwgMHhlMCwgMHgzMCwgMHhlMSwgMHg0ZCwgMHhjMiwgMHhhZiwgMHg5MCwgMHg3MCwKKzB4MjgsIDB4ZTAsIDB4OTAsIDB4MTAsIDB4MWMsIDB4ZjAsIDB4OTAsIDB4NzAsIDB4MjksIDB4ZTAsIDB4OTAsIDB4MTAsIDB4MWQsIDB4ZjAsIDB4OTAsIDB4NzAsCisweDJhLCAweGUwLCAweDkwLCAweDEwLCAweDFlLCAweGYwLCAweDkwLCAweDEwLCAweDFjLCAweGUwLCAweGY1LCAweDYyLCAweDkwLCAweDEwLCAweDFlLCAweGUwLAorMHgyMCwgMHhlMSwgMHhmMywgMHg5MCwgMHgxMCwgMHgxYywgMHhlMCwgMHg5MCwgMHg3MCwgMHgyOCwgMHhmMCwgMHg5MCwgMHgxMCwgMHgxZCwgMHhlMCwgMHg5MCwKKzB4NzAsIDB4MjksIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MWUsIDB4ZTAsIDB4OTAsIDB4NzAsIDB4MmEsIDB4ZjAsIDB4MzAsIDB4NGEsIDB4MDcsIDB4OTAsIDB4NzAsCisweDI0LCAweGUwLCAweDQ0LCAweDAxLCAweGYwLCAweGMyLCAweDA1LCAweGQyLCAweGFmLCAweDIyLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMSwgMHg2NSwgMHhkMywgfSA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9tZDUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL21kNS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDg4M2NhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL21kNS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQxNSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIG1kNS5jCi0KLQlBYnN0cmFjdDoKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCi0JamFuCQkJMTAtMjgtMDMJCUluaXRpYWwKLQlSaXRhICAgIAkxMS0yMy0wNAkJTW9kaWZ5IE1ENSBhbmQgU0hBLTEKLQlSaXRhCQkxMC0xNC0wNQkJTW9kaWZ5IFNIQS0xIGluIGJpZy1lbmRpYW4gcGxhdGZvcm0KLSAqLwotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0vKioKLSAqIG1kNV9tYWM6Ci0gKiBAa2V5OiBwb2ludGVyIHRvCXRoZQlrZXkJdXNlZCBmb3IgTUFDIGdlbmVyYXRpb24KLSAqIEBrZXlfbGVuOiBsZW5ndGgJb2YgdGhlIGtleSBpbiBieXRlcwotICogQGRhdGE6IHBvaW50ZXIgdG8gdGhlIGRhdGEgYXJlYSBmb3Igd2hpY2ggdGhlIE1BQyBpcwlnZW5lcmF0ZWQKLSAqIEBkYXRhX2xlbjogbGVuZ3RoIG9mCXRoZQlkYXRhIGluCWJ5dGVzCi0gKiBAbWFjOiBwb2ludGVyIHRvCXRoZQlidWZmZXIgaG9sZGluZyBzcGFjZSBmb3IgdGhlIE1BQzsgdGhlIGJ1ZmZlciBzaG91bGQKLSAqIGhhdmUJc3BhY2UgZm9yIDEyOC1iaXQgKDE2IGJ5dGVzKSBNRDUgaGFzaCB2YWx1ZQotICoKLSAqIG1kNV9tYWMoKSBkZXRlcm1pbmVzCXRoZQltZXNzYWdlCWF1dGhlbnRpY2F0aW9uIGNvZGUJYnkgdXNpbmcgc2VjdXJlCWhhc2gKLSAqIE1ENShrZXkgfCBkYXRhIHwJa2V5KS4KLSAqLwotdm9pZCBtZDVfbWFjKHU4ICprZXksIHNpemVfdCBrZXlfbGVuLCB1OCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuLCB1OCAqbWFjKQotewotCU1ENV9DVFgJY29udGV4dDsKLQotCU1ENUluaXQoJmNvbnRleHQpOwotCU1ENVVwZGF0ZSgmY29udGV4dCwJa2V5LCBrZXlfbGVuKTsKLQlNRDVVcGRhdGUoJmNvbnRleHQsCWRhdGEsIGRhdGFfbGVuKTsKLQlNRDVVcGRhdGUoJmNvbnRleHQsCWtleSwga2V5X2xlbik7Ci0JTUQ1RmluYWwobWFjLCAmY29udGV4dCk7Ci19Ci0KLS8qKgotICogaG1hY19tZDU6Ci0gKiBAa2V5OiBwb2ludGVyIHRvCXRoZQlrZXkJdXNlZCBmb3IgTUFDIGdlbmVyYXRpb24KLSAqIEBrZXlfbGVuOiBsZW5ndGgJb2YgdGhlIGtleSBpbiBieXRlcwotICogQGRhdGE6IHBvaW50ZXIgdG8gdGhlIGRhdGEgYXJlYSBmb3Igd2hpY2ggdGhlIE1BQyBpcwlnZW5lcmF0ZWQKLSAqIEBkYXRhX2xlbjogbGVuZ3RoIG9mCXRoZQlkYXRhIGluCWJ5dGVzCi0gKiBAbWFjOiBwb2ludGVyIHRvCXRoZQlidWZmZXIgaG9sZGluZyBzcGFjZSBmb3IgdGhlIE1BQzsgdGhlIGJ1ZmZlciBzaG91bGQKLSAqIGhhdmUJc3BhY2UgZm9yIDEyOC1iaXQgKDE2IGJ5dGVzKSBNRDUgaGFzaCB2YWx1ZQotICoKLSAqIGhtYWNfbWQ1KCkgZGV0ZXJtaW5lcyB0aGUgbWVzc2FnZSBhdXRoZW50aWNhdGlvbgljb2RlIHVzaW5nIEhNQUMtTUQ1LgotICogVGhpcwlpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZAlvbiB0aGUgc2FtcGxlIGNvZGUgcHJlc2VudGVkIGluCVJGQwkyMTA0LgotICovCi12b2lkIGhtYWNfbWQ1KHU4ICprZXksIHNpemVfdCBrZXlfbGVuLCB1OCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuLCB1OCAqbWFjKQotewotCU1ENV9DVFgJY29udGV4dDsKLSAgICB1OCBrX2lwYWRbNjVdOyAvKiBpbm5lciBwYWRkaW5nIC0ga2V5IFhPUmQgd2l0aCBpcGFkICovCi0gICAgdTgga19vcGFkWzY1XTsgLyogb3V0ZXIgcGFkZGluZyAtIGtleSBYT1JkIHdpdGggb3BhZCAqLwotICAgIHU4IHRrWzE2XTsKLQlpbnQJaTsKLQotCS8vYXNzZXJ0KGtleSAhPSBOVUxMICYmIGRhdGEgIT0gTlVMTCAmJiBtYWMgIT0gTlVMTCk7Ci0KLQkvKiBpZiBrZXkgaXMgbG9uZ2VyCXRoYW4gNjQJYnl0ZXMgcmVzZXQJaXQgdG8ga2V5ID0JTUQ1KGtleSkgKi8KLQlpZiAoa2V5X2xlbgk+IDY0KSB7Ci0JCU1ENV9DVFgJdHRjb250ZXh0OwotCi0JCU1ENUluaXQoJnR0Y29udGV4dCk7Ci0JCU1ENVVwZGF0ZSgmdHRjb250ZXh0LCBrZXksIGtleV9sZW4pOwotCQlNRDVGaW5hbCh0aywgJnR0Y29udGV4dCk7Ci0JCS8va2V5PShQVUNIQVIpdHRjb250ZXh0LmJ1ZjsKLQkJa2V5CT0gdGs7Ci0JCWtleV9sZW4JPSAxNjsKLQl9Ci0KLQkvKiB0aGUgSE1BQ19NRDUJdHJhbnNmb3JtIGxvb2tzCWxpa2U6Ci0JICoKLQkgKiBNRDUoSyBYT1Igb3BhZCwgTUQ1KEsgWE9SIGlwYWQsIHRleHQpKQotCSAqCi0JICogd2hlcmUgSyBpcyBhbiBuIGJ5dGUJa2V5Ci0JICogaXBhZAlpcyB0aGUgYnl0ZQkweDM2IHJlcGVhdGVkIDY0IHRpbWVzCi0JICogb3BhZAlpcyB0aGUgYnl0ZQkweDVjIHJlcGVhdGVkIDY0IHRpbWVzCi0JICogYW5kIHRleHQJaXMgdGhlIGRhdGEJYmVpbmcgcHJvdGVjdGVkCSovCi0KLQkvKiBzdGFydCBvdXQgYnkJc3RvcmluZwlrZXkJaW4gcGFkcwkqLwotCU5kaXNaZXJvTWVtb3J5KGtfaXBhZCwgc2l6ZW9mKGtfaXBhZCkpOwotCU5kaXNaZXJvTWVtb3J5KGtfb3BhZCwJc2l6ZW9mKGtfb3BhZCkpOwotCS8vYXNzZXJ0KGtleV9sZW4gPCBzaXplb2Yoa19pcGFkKSk7Ci0JTmRpc01vdmVNZW1vcnkoa19pcGFkLCBrZXksCWtleV9sZW4pOwotCU5kaXNNb3ZlTWVtb3J5KGtfb3BhZCwga2V5LAlrZXlfbGVuKTsKLQotCS8qIFhPUiBrZXkgd2l0aAlpcGFkIGFuZCBvcGFkIHZhbHVlcyAqLwotCWZvcgkoaSA9IDA7CWkgPAk2NDsJaSsrKSB7Ci0JCWtfaXBhZFtpXSBePSAweDM2OwotCQlrX29wYWRbaV0gXj0gMHg1YzsKLQl9Ci0KLQkvKiBwZXJmb3JtIGlubmVyIE1ENSAqLwotCU1ENUluaXQoJmNvbnRleHQpOwkJCQkJIC8qCWluaXQgY29udGV4dCBmb3IgMXN0IHBhc3MgKi8KLQlNRDVVcGRhdGUoJmNvbnRleHQsCWtfaXBhZCwJNjQpOwkgLyoJc3RhcnQgd2l0aCBpbm5lciBwYWQgKi8KLQlNRDVVcGRhdGUoJmNvbnRleHQsCWRhdGEsIGRhdGFfbGVuKTsgLyoJdGhlbiB0ZXh0IG9mIGRhdGFncmFtICovCi0JTUQ1RmluYWwobWFjLCAmY29udGV4dCk7CQkJIC8qCWZpbmlzaCB1cCAxc3QgcGFzcyAqLwotCi0JLyogcGVyZm9ybSBvdXRlciBNRDUgKi8KLQlNRDVJbml0KCZjb250ZXh0KTsJCQkJCSAvKglpbml0IGNvbnRleHQgZm9yIDJuZCBwYXNzICovCi0JTUQ1VXBkYXRlKCZjb250ZXh0LAlrX29wYWQsCTY0KTsJIC8qCXN0YXJ0IHdpdGggb3V0ZXIgcGFkICovCi0JTUQ1VXBkYXRlKCZjb250ZXh0LAltYWMsIDE2KTsJCSAvKgl0aGVuIHJlc3VsdHMgb2YJMXN0CWhhc2ggKi8KLQlNRDVGaW5hbChtYWMsICZjb250ZXh0KTsJCQkgLyoJZmluaXNoIHVwIDJuZCBwYXNzICovCi19Ci0KLSNkZWZpbmUgYnl0ZVJldmVyc2UoYnVmLCBsZW4pICAgLyogTm90aGluZyAqLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PSAgTUQ1IGltcGxlbWVudGF0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLy8gZm91ciBiYXNlIGZ1bmN0aW9ucyBmb3IgTUQ1Ci0jZGVmaW5lIE1ENV9GMSh4LCB5LCB6KSAoKCh4KSAmICh5KSkgfCAoKH54KSAmICh6KSkpCi0jZGVmaW5lIE1ENV9GMih4LCB5LCB6KSAoKCh4KSAmICh6KSkgfCAoKHkpICYgKH56KSkpCi0jZGVmaW5lIE1ENV9GMyh4LCB5LCB6KSAoKHgpIF4gKHkpIF4gKHopKQotI2RlZmluZSBNRDVfRjQoeCwgeSwgeikgKCh5KSBeICgoeCkgfCAofnopKSkKLSNkZWZpbmUgQ1lDTElDX0xFRlRfU0hJRlQodywgcykgKCgodykgPDwgKHMpKSB8ICgodykgPj4gKDMyLShzKSkpKQotCi0jZGVmaW5lCU1ENVN0ZXAoZiwgdywgeCwgeSwJeiwgZGF0YSwgdCwgcykJXAotCSggdwkrPSBmKHgsCXksIHopICsJZGF0YSArIHQsICB3ID0gKENZQ0xJQ19MRUZUX1NISUZUKHcsIHMpKSAmIDB4ZmZmZmZmZmYsIHcgKz0JeCApCi0KLQotLyoKLSAqICBGdW5jdGlvbiBEZXNjcmlwdGlvbjoKLSAqICAgICAgSW5pdGlhdGUgTUQ1IENvbnRleHQgc2F0aXNmaWVkIGluIFJGQyAxMzIxCi0gKgotICogIEFyZ3VtZW50czoKLSAqICAgICAgcEN0eCAgICAgICAgUG9pbnRlcgl0byBNRDUgY29udGV4dAotICoKLSAqICBSZXR1cm4gVmFsdWU6Ci0gKiAgICAgIE5vbmUKLSAqLwotVk9JRCBNRDVJbml0KE1ENV9DVFggKnBDdHgpCi17Ci0gICAgcEN0eC0+QnVmWzBdPTB4Njc0NTIzMDE7Ci0gICAgcEN0eC0+QnVmWzFdPTB4ZWZjZGFiODk7Ci0gICAgcEN0eC0+QnVmWzJdPTB4OThiYWRjZmU7Ci0gICAgcEN0eC0+QnVmWzNdPTB4MTAzMjU0NzY7Ci0KLSAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzBdPTA7Ci0gICAgcEN0eC0+TGVuSW5CaXRDb3VudFsxXT0wOwotfQotCi0KLS8qCi0gKiAgRnVuY3Rpb24gRGVzY3JpcHRpb246Ci0gKiAgICAgIFVwZGF0ZSBNRDUgQ29udGV4dCwgYWxsb3cgb2YgYW4gYXJyYXJ5IG9mIG9jdGV0cyBhcyB0aGUgbmV4dCBwb3J0aW9uCi0gKiAgICAgIG9mIHRoZSBtZXNzYWdlCi0gKgotICogIEFyZ3VtZW50czoKLSAqICAgICAgcEN0eAkJUG9pbnRlcgl0byBNRDUgY29udGV4dAotICogCSAgICBwRGF0YSAgICAgICBQb2ludGVyIHRvIGlucHV0IGRhdGEKLSAqICAgICAgTGVuSW5CeXRlcyAgVGhlIGxlbmd0aCBvZiBpbnB1dCBkYXRhICh1bml0OiBieXRlKQotICoKLSAqICBSZXR1cm4gVmFsdWU6Ci0gKiAgICAgIE5vbmUKLSAqCi0gKiAgTm90ZToKLSAqICAgICAgQ2FsbGVkIGFmdGVyIE1ENUluaXQgb3IgTUQ1VXBkYXRlKGl0c2VsZikKLSAqLwotVk9JRCBNRDVVcGRhdGUoTUQ1X0NUWCAqcEN0eCwgVUNIQVIgKnBEYXRhLCBVSU5UMzIgTGVuSW5CeXRlcykKLXsKLQotICAgIFVJTlQzMiBUZlRpbWVzOwotICAgIFVJTlQzMiB0ZW1wOwotCXVuc2lnbmVkIGludCBpOwotCi0gICAgdGVtcCA9IHBDdHgtPkxlbkluQml0Q291bnRbMF07Ci0KLSAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzBdID0gKFVJTlQzMikgKHBDdHgtPkxlbkluQml0Q291bnRbMF0gKyAoTGVuSW5CeXRlcyA8PCAzKSk7Ci0KLSAgICBpZiAocEN0eC0+TGVuSW5CaXRDb3VudFswXSA8IHRlbXApCi0gICAgICAgIHBDdHgtPkxlbkluQml0Q291bnRbMV0rKzsgICAvL2NhcnJ5IGluCi0KLSAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzFdICs9IExlbkluQnl0ZXMgPj4gMjk7Ci0KLSAgICAvLyBtb2QgNjQgYnl0ZXMKLSAgICB0ZW1wID0gKHRlbXAgPj4gMykgJiAweDNmOwotCi0gICAgLy8gcHJvY2VzcyBsYWNrcyBvZiA2NC1ieXRlIGRhdGEKLSAgICBpZiAodGVtcCkKLSAgICB7Ci0gICAgICAgIFVDSEFSICpwQWRzID0gKFVDSEFSICopIHBDdHgtPklucHV0ICsgdGVtcDsKLQotICAgICAgICBpZiAoKHRlbXArTGVuSW5CeXRlcykgPCA2NCkKLSAgICAgICAgewotICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkcywgKFVDSEFSICopcERhdGEsIExlbkluQnl0ZXMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkcywgKFVDSEFSICopcERhdGEsIDY0LXRlbXApOwotICAgICAgICBieXRlUmV2ZXJzZShwQ3R4LT5JbnB1dCwgMTYpOwotICAgICAgICBNRDVUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOwotCi0gICAgICAgIHBEYXRhICs9IDY0LXRlbXA7Ci0gICAgICAgIExlbkluQnl0ZXMgLT0gNjQtdGVtcDsKLSAgICB9IC8vIGVuZCBvZiBpZiAodGVtcCkKLQotCi0gICAgVGZUaW1lcyA9IChMZW5JbkJ5dGVzID4+IDYpOwotCi0gICAgZm9yIChpPVRmVGltZXM7IGk+MDsgaS0tKQotICAgIHsKLSAgICAgICAgTmRpc01vdmVNZW1vcnkocEN0eC0+SW5wdXQsIChVQ0hBUiAqKXBEYXRhLCA2NCk7Ci0gICAgICAgIGJ5dGVSZXZlcnNlKHBDdHgtPklucHV0LCAxNik7Ci0gICAgICAgIE1ENVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7Ci0gICAgICAgIHBEYXRhICs9IDY0OwotICAgICAgICBMZW5JbkJ5dGVzIC09IDY0OwotICAgIH0gLy8gZW5kIG9mIGZvcgotCi0gICAgLy8gYnVmZmVyaW5nIGxhY2tzIG9mIDY0LWJ5dGUgZGF0YQotICAgIGlmKExlbkluQnl0ZXMpCi0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBDdHgtPklucHV0LCAoVUNIQVIgKilwRGF0YSwgTGVuSW5CeXRlcyk7Ci0KLX0KLQotCi0vKgotICogIEZ1bmN0aW9uIERlc2NyaXB0aW9uOgotICogICAgICBBcHBlbmQgcGFkZGluZyBiaXRzIGFuZCBsZW5ndGggb2Ygb3JpZ2luYWwgbWVzc2FnZSBpbiB0aGUgdGFpbAotICogICAgICBUaGUgbWVzc2FnZSBkaWdlc3QgaGFzIHRvIGJlIGNvbXBsZXRlZCBpbiB0aGUgZW5kCi0gKgotICogIEFyZ3VtZW50czoKLSAqICAgICAgRGlnZXN0CQlPdXRwdXQgb2YgRGlnZXN0LU1lc3NhZ2UgZm9yIE1ENQotICogIAlwQ3R4ICAgICAgICBQb2ludGVyCXRvIE1ENSBjb250ZXh0Ci0gKgotICogIFJldHVybiBWYWx1ZToKLSAqICAgICAgTm9uZQotICoKLSAqICBOb3RlOgotICogICAgICBDYWxsZWQgYWZ0ZXIgTUQ1VXBkYXRlCi0gKi8KLVZPSUQgTUQ1RmluYWwoVUNIQVIgRGlnZXN0WzE2XSwgTUQ1X0NUWCAqcEN0eCkKLXsKLSAgICBVQ0hBUiBSZW1haW5kZXI7Ci0gICAgVUNIQVIgUGFkTGVuSW5CeXRlczsKLSAgICBVQ0hBUiAqcEFwcGVuZD0wOwotICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgUmVtYWluZGVyID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFswXSA+PiAzKSAmIDB4M2YpOwotCi0gICAgUGFkTGVuSW5CeXRlcyA9IChSZW1haW5kZXIgPCA1NikgPyAoNTYtUmVtYWluZGVyKSA6ICgxMjAtUmVtYWluZGVyKTsKLQotICAgIHBBcHBlbmQgPSAoVUNIQVIgKilwQ3R4LT5JbnB1dCArIFJlbWFpbmRlcjsKLQotICAgIC8vIHBhZGRpbmcgYml0cyB3aXRob3V0IGNyb3NzaW5nIGJsb2NrKDY0LWJ5dGUgYmFzZWQpIGJvdW5kYXJ5Ci0gICAgaWYgKFJlbWFpbmRlciA8IDU2KQotICAgIHsKLSAgICAgICAgKnBBcHBlbmQgPSAweDgwOwotICAgICAgICBQYWRMZW5JbkJ5dGVzIC0tOwotCi0gICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgUmVtYWluZGVyKzEsIFBhZExlbkluQnl0ZXMpOwotCi0JCS8vIGFkZCBkYXRhLWxlbmd0aCBmaWVsZCwgZnJvbSBsb3cgdG8gaGlnaAotICAgICAgIAlmb3IgKGk9MDsgaTw0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgCXBDdHgtPklucHV0WzU2K2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFswXSA+PiAoaSA8PCAzKSkgJiAweGZmKTsKLSAgICAgICAgCXBDdHgtPklucHV0WzYwK2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFsxXSA+PiAoaSA8PCAzKSkgJiAweGZmKTsKLSAgICAgIAl9Ci0KLSAgICAgICAgYnl0ZVJldmVyc2UocEN0eC0+SW5wdXQsIDE2KTsKLSAgICAgICAgTUQ1VHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKLSAgICB9IC8vIGVuZCBvZiBpZgotCi0gICAgLy8gcGFkZGluZyBiaXRzIHdpdGggY3Jvc3NpbmcgYmxvY2soNjQtYnl0ZSBiYXNlZCkgYm91bmRhcnkKLSAgICBlbHNlCi0gICAgewotICAgICAgICAvLyB0aGUgZmlyc3QgYmxvY2sgPT09Ci0gICAgICAgICpwQXBwZW5kID0gMHg4MDsKLSAgICAgICAgUGFkTGVuSW5CeXRlcyAtLTsKLQotICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIFJlbWFpbmRlcisxLCAoNjQtUmVtYWluZGVyLTEpKTsKLSAgICAgICAgUGFkTGVuSW5CeXRlcyAtPSAoNjQgLSBSZW1haW5kZXIgLSAxKTsKLQotICAgICAgICBieXRlUmV2ZXJzZShwQ3R4LT5JbnB1dCwgMTYpOwotICAgICAgICBNRDVUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOwotCi0KLSAgICAgICAgLy8gdGhlIHNlY29uZCBibG9jayA9PT0KLSAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQsIFBhZExlbkluQnl0ZXMpOwotCi0gICAgICAgIC8vIGFkZCBkYXRhLWxlbmd0aCBmaWVsZAotICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgCXBDdHgtPklucHV0WzU2K2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFswXSA+PiAoaSA8PCAzKSkgJiAweGZmKTsKLSAgICAgICAgCXBDdHgtPklucHV0WzYwK2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFsxXSA+PiAoaSA8PCAzKSkgJiAweGZmKTsKLSAgICAgIAl9Ci0KLSAgICAgICAgYnl0ZVJldmVyc2UocEN0eC0+SW5wdXQsIDE2KTsKLSAgICAgICAgTUQ1VHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKLSAgICB9IC8vIGVuZCBvZiBlbHNlCi0KLQotICAgIE5kaXNNb3ZlTWVtb3J5KChVQ0hBUiAqKURpZ2VzdCwgKFVJTlQzMiAqKXBDdHgtPkJ1ZiwgMTYpOyAvLyBvdXRwdXQKLSAgICBieXRlUmV2ZXJzZSgoVUNIQVIgKilEaWdlc3QsIDQpOwotICAgIE5kaXNaZXJvTWVtb3J5KHBDdHgsIHNpemVvZihwQ3R4KSk7IC8vIG1lbW9yeSBmcmVlCi19Ci0KLQotLyoKLSAqICBGdW5jdGlvbiBEZXNjcmlwdGlvbjoKLSAqICAgICAgVGhlIGNlbnRyYWwgYWxnb3JpdGhtIG9mIE1ENSwgY29uc2lzdHMgb2YgZm91ciByb3VuZHMgYW5kIHNpeHRlZW4KLSAqICAJc3RlcHMgcGVyIHJvdW5kCi0gKgotICogIEFyZ3VtZW50czoKLSAqICAgICAgQnVmICAgICBCdWZmZXJzIG9mIGZvdXIgc3RhdGVzIChvdXRwdXQ6IDE2IGJ5dGVzKQotICogCSAgICBNZXMgICAgIElucHV0IGRhdGEgKGlucHV0OiA2NCBieXRlcykKLSAqCi0gKiAgUmV0dXJuIFZhbHVlOgotICogICAgICBOb25lCi0gKgotICogIE5vdGU6Ci0gKiAgICAgIENhbGxlZCBieSBNRDVVcGRhdGUgb3IgTUQ1RmluYWwKLSAqLwotVk9JRCBNRDVUcmFuc2Zvcm0oVUlOVDMyIEJ1Zls0XSwgVUlOVDMyIE1lc1sxNl0pCi17Ci0gICAgVUlOVDMyIFJlZ1s0XSwgVGVtcDsKLQl1bnNpZ25lZCBpbnQgaTsKLQotICAgIHN0YXRpYyBVQ0hBUiBMU2hpZnRWYWxbMTZdID0KLSAgICB7Ci0gICAgICAgIDcsIDEyLCAxNywgMjIsCi0JCTUsIDkgLCAxNCwgMjAsCi0JCTQsIDExLCAxNiwgMjMsCi0gCQk2LCAxMCwgMTUsIDIxLAotIAl9OwotCi0KLQkvLyBbZXF1YWwgdG8gNDI5NDk2NzI5NiphYnMoc2luKGluZGV4KSldCi0gICAgc3RhdGljIFVJTlQzMiBNRDVUYWJsZVs2NF0gPQotCXsKLQkJMHhkNzZhYTQ3OCwJMHhlOGM3Yjc1NiwJMHgyNDIwNzBkYiwJMHhjMWJkY2VlZSwKLQkJMHhmNTdjMGZhZiwJMHg0Nzg3YzYyYSwJMHhhODMwNDYxMywgMHhmZDQ2OTUwMSwKLQkJMHg2OTgwOThkOCwJMHg4YjQ0ZjdhZiwJMHhmZmZmNWJiMSwJMHg4OTVjZDdiZSwKLSAgICAJMHg2YjkwMTEyMiwJMHhmZDk4NzE5MywJMHhhNjc5NDM4ZSwJMHg0OWI0MDgyMSwKLQotICAgIAkweGY2MWUyNTYyLAkweGMwNDBiMzQwLAkweDI2NWU1YTUxLAkweGU5YjZjN2FhLAotICAgIAkweGQ2MmYxMDVkLAkweDAyNDQxNDUzLAkweGQ4YTFlNjgxLAkweGU3ZDNmYmM4LAotICAgIAkweDIxZTFjZGU2LAkweGMzMzcwN2Q2LAkweGY0ZDUwZDg3LAkweDQ1NWExNGVkLAotICAgIAkweGE5ZTNlOTA1LAkweGZjZWZhM2Y4LAkweDY3NmYwMmQ5LAkweDhkMmE0YzhhLAotCi0gICAgCTB4ZmZmYTM5NDIsCTB4ODc3MWY2ODEsCTB4NmQ5ZDYxMjIsCTB4ZmRlNTM4MGMsCi0gICAgCTB4YTRiZWVhNDQsCTB4NGJkZWNmYTksCTB4ZjZiYjRiNjAsCTB4YmViZmJjNzAsCi0gICAgCTB4Mjg5YjdlYzYsCTB4ZWFhMTI3ZmEsCTB4ZDRlZjMwODUsCTB4MDQ4ODFkMDUsCi0gICAgCTB4ZDlkNGQwMzksCTB4ZTZkYjk5ZTUsCTB4MWZhMjdjZjgsCTB4YzRhYzU2NjUsCi0KLSAgICAJMHhmNDI5MjI0NCwJMHg0MzJhZmY5NywJMHhhYjk0MjNhNywJMHhmYzkzYTAzOSwKLSAgIAkJMHg2NTViNTljMywJMHg4ZjBjY2M5MiwJMHhmZmVmZjQ3ZCwJMHg4NTg0NWRkMSwKLSAgICAJMHg2ZmE4N2U0ZiwJMHhmZTJjZTZlMCwJMHhhMzAxNDMxNCwJMHg0ZTA4MTFhMSwKLSAgICAJMHhmNzUzN2U4MiwJMHhiZDNhZjIzNSwJMHgyYWQ3ZDJiYiwJMHhlYjg2ZDM5MQotCX07Ci0KLQotICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKLSAgICAgICAgUmVnW2ldPUJ1ZltpXTsKLQotCi0gICAgLy8gNjQgc3RlcHMgaW4gTUQ1IGFsZ29yaXRobQotICAgIGZvciAoaT0wOyBpPDE2OyBpKyspCi0gICAgewotICAgICAgICBNRDVTdGVwKE1ENV9GMSwgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBNZXNbaV0sCi0gICAgICAgICAgICAgICAgTUQ1VGFibGVbaV0sIExTaGlmdFZhbFtpICYgMHgzXSk7Ci0KLSAgICAgICAgLy8gb25lLXdvcmQgcmlnaHQgc2hpZnQKLSAgICAgICAgVGVtcCAgID0gUmVnWzNdOwotICAgICAgICBSZWdbM10gPSBSZWdbMl07Ci0gICAgICAgIFJlZ1syXSA9IFJlZ1sxXTsKLSAgICAgICAgUmVnWzFdID0gUmVnWzBdOwotICAgICAgICBSZWdbMF0gPSBUZW1wOwotICAgIH0KLSAgICBmb3IgKGk9MTY7IGk8MzI7IGkrKykKLSAgICB7Ci0gICAgICAgIE1ENVN0ZXAoTUQ1X0YyLCBSZWdbMF0sIFJlZ1sxXSwgUmVnWzJdLCBSZWdbM10sIE1lc1soNSooaSAmIDB4ZikrMSkgJiAweGZdLAotICAgICAgICAgICAgICAgIE1ENVRhYmxlW2ldLCBMU2hpZnRWYWxbKDB4MSA8PCAyKSsoaSAmIDB4MyldKTsKLQotICAgICAgICAvLyBvbmUtd29yZCByaWdodCBzaGlmdAotICAgICAgICBUZW1wICAgPSBSZWdbM107Ci0gICAgICAgIFJlZ1szXSA9IFJlZ1syXTsKLSAgICAgICAgUmVnWzJdID0gUmVnWzFdOwotICAgICAgICBSZWdbMV0gPSBSZWdbMF07Ci0gICAgICAgIFJlZ1swXSA9IFRlbXA7Ci0gICAgfQotICAgIGZvciAoaT0zMjsgaTw0ODsgaSsrKQotICAgIHsKLSAgICAgICAgTUQ1U3RlcChNRDVfRjMsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgTWVzWygzKihpICYgMHhmKSs1KSAmIDB4Zl0sCi0gICAgICAgICAgICAgICAgTUQ1VGFibGVbaV0sIExTaGlmdFZhbFsoMHgxIDw8IDMpKyhpICYgMHgzKV0pOwotCi0gICAgICAgIC8vIG9uZS13b3JkIHJpZ2h0IHNoaWZ0Ci0gICAgICAgIFRlbXAgICA9IFJlZ1szXTsKLSAgICAgICAgUmVnWzNdID0gUmVnWzJdOwotICAgICAgICBSZWdbMl0gPSBSZWdbMV07Ci0gICAgICAgIFJlZ1sxXSA9IFJlZ1swXTsKLSAgICAgICAgUmVnWzBdID0gVGVtcDsKLSAgICB9Ci0gICAgZm9yIChpPTQ4OyBpPDY0OyBpKyspCi0gICAgewotICAgICAgICBNRDVTdGVwKE1ENV9GNCwgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBNZXNbKDcqKGkgJiAweGYpKSAmIDB4Zl0sCi0gICAgICAgICAgICAgICAgTUQ1VGFibGVbaV0sIExTaGlmdFZhbFsoMHgzIDw8IDIpKyhpICYgMHgzKV0pOwotCi0gICAgICAgIC8vIG9uZS13b3JkIHJpZ2h0IHNoaWZ0Ci0gICAgICAgIFRlbXAgICA9IFJlZ1szXTsKLSAgICAgICAgUmVnWzNdID0gUmVnWzJdOwotICAgICAgICBSZWdbMl0gPSBSZWdbMV07Ci0gICAgICAgIFJlZ1sxXSA9IFJlZ1swXTsKLSAgICAgICAgUmVnWzBdID0gVGVtcDsKLSAgICB9Ci0KLQotICAgIC8vICh0ZW1wb3Jhcnkpb3V0cHV0Ci0gICAgZm9yIChpPTA7IGk8NDsgaSsrKQotICAgICAgICBCdWZbaV0gKz0gUmVnW2ldOwotCi19Ci0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09ICBTSEEtMSBpbXBsZW1lbnRhdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLy8gZm91ciBiYXNlIGZ1bmN0aW9ucyBmb3IgU0hBLTEKLSNkZWZpbmUgU0hBMV9GMShiLCBjLCBkKSAgICAoKChiKSAmIChjKSkgfCAoKH5iKSAmIChkKSkpCi0jZGVmaW5lIFNIQTFfRjIoYiwgYywgZCkgICAgKChiKSBeIChjKSBeIChkKSkKLSNkZWZpbmUgU0hBMV9GMyhiLCBjLCBkKSAgICAoKChiKSAmIChjKSkgfCAoKGIpICYgKGQpKSB8ICgoYykgJiAoZCkpKQotCi0KLSNkZWZpbmUgU0hBMVN0ZXAoZiwgYSwgYiwgYywgZCwgZSwgdywgaykgICAgXAotICAgICggZQkrPSAoIGYoYiwgYywgZCkgKyB3ICsgayArIENZQ0xJQ19MRUZUX1NISUZUKGEsIDUpKSAmIDB4ZmZmZmZmZmYsIFwKLSAgICAgIGIgPSBDWUNMSUNfTEVGVF9TSElGVChiLCAzMCkgKQotCi0vL0luaXRpYXRlIFNIQS0xIENvbnRleHQgc2F0aXNmaWVkIGluIFJGQyAzMTc0Ci1WT0lEIFNIQUluaXQoU0hBX0NUWCAqcEN0eCkKLXsKLSAgICBwQ3R4LT5CdWZbMF09MHg2NzQ1MjMwMTsKLSAgICBwQ3R4LT5CdWZbMV09MHhlZmNkYWI4OTsKLSAgICBwQ3R4LT5CdWZbMl09MHg5OGJhZGNmZTsKLSAgICBwQ3R4LT5CdWZbM109MHgxMDMyNTQ3NjsKLSAgICBwQ3R4LT5CdWZbNF09MHhjM2QyZTFmMDsKLQotICAgIHBDdHgtPkxlbkluQml0Q291bnRbMF09MDsKLSAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzFdPTA7Ci19Ci0KLS8qCi0gKiAgRnVuY3Rpb24gRGVzY3JpcHRpb246Ci0gKiAgICAgIFVwZGF0ZSBTSEEtMSBDb250ZXh0LCBhbGxvdyBvZiBhbiBhcnJhcnkgb2Ygb2N0ZXRzIGFzIHRoZSBuZXh0Ci0gKiAgICAgIHBvcnRpb24gb2YgdGhlIG1lc3NhZ2UKLSAqCi0gKiAgQXJndW1lbnRzOgotICogICAgICBwQ3R4CQlQb2ludGVyCXRvIFNIQS0xIGNvbnRleHQKLSAqIAkgICAgcERhdGEgICAgICAgUG9pbnRlciB0byBpbnB1dCBkYXRhCi0gKiAgICAgIExlbkluQnl0ZXMgIFRoZSBsZW5ndGggb2YgaW5wdXQgZGF0YSAodW5pdDogYnl0ZSkKLSAqCi0gKiAgUmV0dXJuIFZhbHVlOgotICogICAgICBlcnJvciAgICAgICBpbmRpY2F0ZSBtb3JlIHRoYW4gcG93KDIsNjQpIGJpdHMgb2YgZGF0YQotICoKLSAqICBOb3RlOgotICogICAgICBDYWxsZWQgYWZ0ZXIgU0hBSW5pdCBvciBTSEFVcGRhdGUoaXRzZWxmKQotICovCi1VQ0hBUiBTSEFVcGRhdGUoU0hBX0NUWCAqcEN0eCwgVUNIQVIgKnBEYXRhLCBVSU5UMzIgTGVuSW5CeXRlcykKLXsKLSAgICBVSU5UMzIgVGZUaW1lczsKLSAgICBVSU5UMzIgdGVtcDEsdGVtcDI7Ci0JdW5zaWduZWQgaW50IGk7Ci0JVUNIQVIgZXJyPTE7Ci0KLSAgICB0ZW1wMSA9IHBDdHgtPkxlbkluQml0Q291bnRbMF07Ci0gICAgdGVtcDIgPSBwQ3R4LT5MZW5JbkJpdENvdW50WzFdOwotCi0gICAgcEN0eC0+TGVuSW5CaXRDb3VudFswXSA9IChVSU5UMzIpIChwQ3R4LT5MZW5JbkJpdENvdW50WzBdICsgKExlbkluQnl0ZXMgPDwgMykpOwotICAgIGlmIChwQ3R4LT5MZW5JbkJpdENvdW50WzBdIDwgdGVtcDEpCi0gICAgICAgIHBDdHgtPkxlbkluQml0Q291bnRbMV0rKzsgICAvL2NhcnJ5IGluCi0KLQotICAgIHBDdHgtPkxlbkluQml0Q291bnRbMV0gPSAoVUlOVDMyKSAocEN0eC0+TGVuSW5CaXRDb3VudFsxXSArKExlbkluQnl0ZXMgPj4gMjkpKTsKLSAgICBpZiAocEN0eC0+TGVuSW5CaXRDb3VudFsxXSA8IHRlbXAyKQotICAgICAgICByZXR1cm4gKGVycik7ICAgLy9jaGVjayB0b3RhbCBsZW5ndGggb2Ygb3JpZ2luYWwgZGF0YQotCi0KLSAgICAvLyBtb2QgNjQgYnl0ZXMKLSAgICB0ZW1wMSA9ICh0ZW1wMSA+PiAzKSAmIDB4M2Y7Ci0KLSAgICAvLyBwcm9jZXNzIGxhY2tzIG9mIDY0LWJ5dGUgZGF0YQotICAgIGlmICh0ZW1wMSkKLSAgICB7Ci0gICAgICAgIFVDSEFSICpwQWRzID0gKFVDSEFSICopIHBDdHgtPklucHV0ICsgdGVtcDE7Ci0KLSAgICAgICAgaWYgKCh0ZW1wMStMZW5JbkJ5dGVzKSA8IDY0KQotICAgICAgICB7Ci0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRzLCAoVUNIQVIgKilwRGF0YSwgTGVuSW5CeXRlcyk7Ci0gICAgICAgICAgICByZXR1cm4gKDApOwotICAgICAgICB9Ci0KLSAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkcywgKFVDSEFSICopcERhdGEsIDY0LXRlbXAxKTsKLSAgICAgICAgYnl0ZVJldmVyc2UoKFVDSEFSICopcEN0eC0+SW5wdXQsIDE2KTsKLQotICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIDY0LCAxNik7Ci0gICAgICAgIFNIQVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7Ci0KLSAgICAgICAgcERhdGEgKz0gNjQtdGVtcDE7Ci0gICAgICAgIExlbkluQnl0ZXMgLT0gNjQtdGVtcDE7Ci0gICAgfSAvLyBlbmQgb2YgaWYgKHRlbXAxKQotCi0KLSAgICBUZlRpbWVzID0gKExlbkluQnl0ZXMgPj4gNik7Ci0KLSAgICBmb3IgKGk9VGZUaW1lczsgaT4wOyBpLS0pCi0gICAgewotICAgICAgICBOZGlzTW92ZU1lbW9yeShwQ3R4LT5JbnB1dCwgKFVDSEFSICopcERhdGEsIDY0KTsKLSAgICAgICAgYnl0ZVJldmVyc2UoKFVDSEFSICopcEN0eC0+SW5wdXQsIDE2KTsKLQotICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIDY0LCAxNik7Ci0gICAgICAgIFNIQVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7Ci0gICAgICAgIHBEYXRhICs9IDY0OwotICAgICAgICBMZW5JbkJ5dGVzIC09IDY0OwotICAgIH0gLy8gZW5kIG9mIGZvcgotCi0gICAgLy8gYnVmZmVyaW5nIGxhY2tzIG9mIDY0LWJ5dGUgZGF0YQotICAgIGlmKExlbkluQnl0ZXMpCi0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBDdHgtPklucHV0LCAoVUNIQVIgKilwRGF0YSwgTGVuSW5CeXRlcyk7Ci0KLQlyZXR1cm4gKDApOwotCi19Ci0KLS8vIEFwcGVuZCBwYWRkaW5nIGJpdHMgYW5kIGxlbmd0aCBvZiBvcmlnaW5hbCBtZXNzYWdlIGluIHRoZSB0YWlsCi0vLyBUaGUgbWVzc2FnZSBkaWdlc3QgaGFzIHRvIGJlIGNvbXBsZXRlZCBpbiB0aGUgZW5kCi1WT0lEIFNIQUZpbmFsKFNIQV9DVFggKnBDdHgsIFVDSEFSIERpZ2VzdFsyMF0pCi17Ci0gICAgVUNIQVIgUmVtYWluZGVyOwotICAgIFVDSEFSIFBhZExlbkluQnl0ZXM7Ci0gICAgVUNIQVIgKnBBcHBlbmQ9MDsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgIFJlbWFpbmRlciA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPj4gMykgJiAweDNmKTsKLQotICAgIHBBcHBlbmQgPSAoVUNIQVIgKilwQ3R4LT5JbnB1dCArIFJlbWFpbmRlcjsKLQotICAgIFBhZExlbkluQnl0ZXMgPSAoUmVtYWluZGVyIDwgNTYpID8gKDU2LVJlbWFpbmRlcikgOiAoMTIwLVJlbWFpbmRlcik7Ci0KLSAgICAvLyBwYWRkaW5nIGJpdHMgd2l0aG91dCBjcm9zc2luZyBibG9jayg2NC1ieXRlIGJhc2VkKSBib3VuZGFyeQotICAgIGlmIChSZW1haW5kZXIgPCA1NikKLSAgICB7Ci0gICAgICAgICpwQXBwZW5kID0gMHg4MDsKLSAgICAgICAgUGFkTGVuSW5CeXRlcyAtLTsKLQotICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIFJlbWFpbmRlcisxLCBQYWRMZW5JbkJ5dGVzKTsKLQotCQkvLyBhZGQgZGF0YS1sZW5ndGggZmllbGQsIGZyb20gaGlnaCB0byBsb3cKLSAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgIAlwQ3R4LT5JbnB1dFs1NitpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMV0gPj4gKCgzLWkpIDw8IDMpKSAmIDB4ZmYpOwotICAgICAgICAJcEN0eC0+SW5wdXRbNjAraV0gPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzBdID4+ICgoMy1pKSA8PCAzKSkgJiAweGZmKTsKLSAgICAgIAl9Ci0KLSAgICAgICAgYnl0ZVJldmVyc2UoKFVDSEFSICopcEN0eC0+SW5wdXQsIDE2KTsKLSAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyA2NCwgMTQpOwotICAgICAgICBTSEFUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOwotICAgIH0gLy8gZW5kIG9mIGlmCi0KLSAgICAvLyBwYWRkaW5nIGJpdHMgd2l0aCBjcm9zc2luZyBibG9jayg2NC1ieXRlIGJhc2VkKSBib3VuZGFyeQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8vIHRoZSBmaXJzdCBibG9jayA9PT0KLSAgICAgICAgKnBBcHBlbmQgPSAweDgwOwotICAgICAgICBQYWRMZW5JbkJ5dGVzIC0tOwotCi0gICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgUmVtYWluZGVyKzEsICg2NC1SZW1haW5kZXItMSkpOwotICAgICAgICBQYWRMZW5JbkJ5dGVzIC09ICg2NCAtIFJlbWFpbmRlciAtIDEpOwotCi0gICAgICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKXBDdHgtPklucHV0LCAxNik7Ci0gICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgNjQsIDE2KTsKLSAgICAgICAgU0hBVHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKLQotCi0gICAgICAgIC8vIHRoZSBzZWNvbmQgYmxvY2sgPT09Ci0gICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0LCBQYWRMZW5JbkJ5dGVzKTsKLQotCQkvLyBhZGQgZGF0YS1sZW5ndGggZmllbGQKLQkJZm9yIChpPTA7IGk8NDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgIAlwQ3R4LT5JbnB1dFs1NitpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMV0gPj4gKCgzLWkpIDw8IDMpKSAmIDB4ZmYpOwotICAgICAgICAJcEN0eC0+SW5wdXRbNjAraV0gPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzBdID4+ICgoMy1pKSA8PCAzKSkgJiAweGZmKTsKLSAgICAgIAl9Ci0KLSAgICAgICAgYnl0ZVJldmVyc2UoKFVDSEFSICopcEN0eC0+SW5wdXQsIDE2KTsKLSAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyA2NCwgMTYpOwotICAgICAgICBTSEFUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOwotICAgIH0gLy8gZW5kIG9mIGVsc2UKLQotCi0gICAgLy9PdXRwdXQsIGJ5dGVyZXZlcnNlCi0gICAgZm9yIChpPTA7IGk8MjA7IGkrKykKLSAgICB7Ci0gICAgICAgIERpZ2VzdCBbaV0gPSAoVUNIQVIpKHBDdHgtPkJ1ZltpPj4yXSA+PiA4KigzLShpICYgMHgzKSkpOwotICAgIH0KLQotICAgIE5kaXNaZXJvTWVtb3J5KHBDdHgsIHNpemVvZihwQ3R4KSk7IC8vIG1lbW9yeSBmcmVlCi19Ci0KLQotLy8gVGhlIGNlbnRyYWwgYWxnb3JpdGhtIG9mIFNIQS0xLCBjb25zaXN0cyBvZiBmb3VyIHJvdW5kcyBhbmQKLS8vIHR3ZW50eSBzdGVwcyBwZXIgcm91bmQKLVZPSUQgU0hBVHJhbnNmb3JtKFVJTlQzMiBCdWZbNV0sIFVJTlQzMiBNZXNbMjBdKQotewotICAgIFVJTlQzMiBSZWdbNV0sVGVtcDsKLQl1bnNpZ25lZCBpbnQgaTsKLSAgICBVSU5UMzIgV1s4MF07Ci0KLSAgICBzdGF0aWMgVUlOVDMyIFNIQTFUYWJsZVs0XSA9IHsgMHg1YTgyNzk5OSwgMHg2ZWQ5ZWJhMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhmMWJiY2RjLCAweGNhNjJjMWQ2IH07Ci0KLSAgICBSZWdbMF09QnVmWzBdOwotCVJlZ1sxXT1CdWZbMV07Ci0JUmVnWzJdPUJ1ZlsyXTsKLQlSZWdbM109QnVmWzNdOwotCVJlZ1s0XT1CdWZbNF07Ci0KLSAgICAvL3RoZSBmaXJzdCBvY3RldCBvZiBhIHdvcmQgaXMgc3RvcmVkIGluIHRoZSAwdGggZWxlbWVudCwgYnl0ZXJldmVyc2UKLQlmb3IoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAJV1tpXSAgPSAoTWVzW2ldID4+IDI0KSAmIDB4ZmY7Ci0gICAgICAgIFdbaV0gfD0gKE1lc1tpXSA+PiA4ICkgJiAweGZmMDA7Ci0gICAgICAgIFdbaV0gfD0gKE1lc1tpXSA8PCA4ICkgJiAweGZmMDAwMDsKLSAgICAgICAgV1tpXSB8PSAoTWVzW2ldIDw8IDI0KSAmIDB4ZmYwMDAwMDA7Ci0gICAgfQotCi0KLSAgICBmb3IJKGkgPSAwOyBpIDwgNjQ7IGkrKykKLQkgICAgV1sxNitpXSA9IENZQ0xJQ19MRUZUX1NISUZUKFdbaV0gXiBXWzIraV0gXiBXWzgraV0gXiBXWzEzK2ldLCAxKTsKLQotCi0gICAgLy8gODAgc3RlcHMgaW4gU0hBLTEgYWxnb3JpdGhtCi0gICAgZm9yIChpPTA7IGk8ODA7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChpPDIwKQotICAgICAgICAgICAgU0hBMVN0ZXAoU0hBMV9GMSwgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBSZWdbNF0sCi0gICAgICAgICAgICAgICAgICAgICBXW2ldLCBTSEExVGFibGVbMF0pOwotCi0gICAgICAgIGVsc2UgaWYgKGk+PTIwICYmIGk8NDApCi0gICAgICAgICAgICBTSEExU3RlcChTSEExX0YyLCBSZWdbMF0sIFJlZ1sxXSwgUmVnWzJdLCBSZWdbM10sIFJlZ1s0XSwKLSAgICAgICAgICAgICAgICAgICAgIFdbaV0sIFNIQTFUYWJsZVsxXSk7Ci0KLQkJZWxzZSBpZiAoaT49NDAgJiYgaTw2MCkKLSAgICAgICAgICAgIFNIQTFTdGVwKFNIQTFfRjMsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgUmVnWzRdLAotICAgICAgICAgICAgICAgICAgICAgIFdbaV0sIFNIQTFUYWJsZVsyXSk7Ci0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgU0hBMVN0ZXAoU0hBMV9GMiwgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBSZWdbNF0sCi0gICAgICAgICAgICAgICAgICAgICBXW2ldLCBTSEExVGFibGVbM10pOwotCi0KLSAgICAgICAvLyBvbmUtd29yZCByaWdodCBzaGlmdAotCQlUZW1wICAgPSBSZWdbNF07Ci0gICAgICAgIFJlZ1s0XSA9IFJlZ1szXTsKLSAgICAgICAgUmVnWzNdID0gUmVnWzJdOwotICAgICAgICBSZWdbMl0gPSBSZWdbMV07Ci0gICAgICAgIFJlZ1sxXSA9IFJlZ1swXTsKLSAgICAgICAgUmVnWzBdID0gVGVtcDsKLQotICAgIH0gLy8gZW5kIG9mIGZvci1sb29wCi0KLQotICAgIC8vICh0ZW1wb3Jhcnkpb3V0cHV0Ci0gICAgZm9yIChpPTA7IGk8NTsgaSsrKQotICAgICAgICBCdWZbaV0gKz0gUmVnW2ldOwotCi19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PSAgQUVTIEVuL0RlY3J5cHRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotLyogZm9yd2FyZCBTLWJveCAqLwotc3RhdGljIHVpbnQzMiBGU2JbMjU2XSA9Ci17Ci0JMHg2MywgMHg3QywJMHg3NywgMHg3QiwJMHhGMiwgMHg2QiwJMHg2RiwgMHhDNSwKLQkweDMwLCAweDAxLAkweDY3LCAweDJCLAkweEZFLCAweEQ3LAkweEFCLCAweDc2LAotCTB4Q0EsIDB4ODIsCTB4QzksIDB4N0QsCTB4RkEsIDB4NTksCTB4NDcsIDB4RjAsCi0JMHhBRCwgMHhENCwJMHhBMiwgMHhBRiwJMHg5QywgMHhBNCwJMHg3MiwgMHhDMCwKLQkweEI3LCAweEZELAkweDkzLCAweDI2LAkweDM2LCAweDNGLAkweEY3LCAweENDLAotCTB4MzQsIDB4QTUsCTB4RTUsIDB4RjEsCTB4NzEsIDB4RDgsCTB4MzEsIDB4MTUsCi0JMHgwNCwgMHhDNywJMHgyMywgMHhDMywJMHgxOCwgMHg5NiwJMHgwNSwgMHg5QSwKLQkweDA3LCAweDEyLAkweDgwLCAweEUyLAkweEVCLCAweDI3LAkweEIyLCAweDc1LAotCTB4MDksIDB4ODMsCTB4MkMsIDB4MUEsCTB4MUIsIDB4NkUsCTB4NUEsIDB4QTAsCi0JMHg1MiwgMHgzQiwJMHhENiwgMHhCMywJMHgyOSwgMHhFMywJMHgyRiwgMHg4NCwKLQkweDUzLCAweEQxLAkweDAwLCAweEVELAkweDIwLCAweEZDLAkweEIxLCAweDVCLAotCTB4NkEsIDB4Q0IsCTB4QkUsIDB4MzksCTB4NEEsIDB4NEMsCTB4NTgsIDB4Q0YsCi0JMHhEMCwgMHhFRiwJMHhBQSwgMHhGQiwJMHg0MywgMHg0RCwJMHgzMywgMHg4NSwKLQkweDQ1LCAweEY5LAkweDAyLCAweDdGLAkweDUwLCAweDNDLAkweDlGLCAweEE4LAotCTB4NTEsIDB4QTMsCTB4NDAsIDB4OEYsCTB4OTIsIDB4OUQsCTB4MzgsIDB4RjUsCi0JMHhCQywgMHhCNiwJMHhEQSwgMHgyMSwJMHgxMCwgMHhGRiwJMHhGMywgMHhEMiwKLQkweENELCAweDBDLAkweDEzLCAweEVDLAkweDVGLCAweDk3LAkweDQ0LCAweDE3LAotCTB4QzQsIDB4QTcsCTB4N0UsIDB4M0QsCTB4NjQsIDB4NUQsCTB4MTksIDB4NzMsCi0JMHg2MCwgMHg4MSwJMHg0RiwgMHhEQywJMHgyMiwgMHgyQSwJMHg5MCwgMHg4OCwKLQkweDQ2LCAweEVFLAkweEI4LCAweDE0LAkweERFLCAweDVFLAkweDBCLCAweERCLAotCTB4RTAsIDB4MzIsCTB4M0EsIDB4MEEsCTB4NDksIDB4MDYsCTB4MjQsIDB4NUMsCi0JMHhDMiwgMHhEMywJMHhBQywgMHg2MiwJMHg5MSwgMHg5NSwJMHhFNCwgMHg3OSwKLQkweEU3LCAweEM4LAkweDM3LCAweDZELAkweDhELCAweEQ1LAkweDRFLCAweEE5LAotCTB4NkMsIDB4NTYsCTB4RjQsIDB4RUEsCTB4NjUsIDB4N0EsCTB4QUUsIDB4MDgsCi0JMHhCQSwgMHg3OCwJMHgyNSwgMHgyRSwJMHgxQywgMHhBNiwJMHhCNCwgMHhDNiwKLQkweEU4LCAweERELAkweDc0LCAweDFGLAkweDRCLCAweEJELAkweDhCLCAweDhBLAotCTB4NzAsIDB4M0UsCTB4QjUsIDB4NjYsCTB4NDgsIDB4MDMsCTB4RjYsIDB4MEUsCi0JMHg2MSwgMHgzNSwJMHg1NywgMHhCOSwJMHg4NiwgMHhDMSwJMHgxRCwgMHg5RSwKLQkweEUxLCAweEY4LAkweDk4LCAweDExLAkweDY5LCAweEQ5LAkweDhFLCAweDk0LAotCTB4OUIsIDB4MUUsCTB4ODcsIDB4RTksCTB4Q0UsIDB4NTUsCTB4MjgsIDB4REYsCi0JMHg4QywgMHhBMSwJMHg4OSwgMHgwRCwJMHhCRiwgMHhFNiwJMHg0MiwgMHg2OCwKLQkweDQxLCAweDk5LAkweDJELCAweDBGLAkweEIwLCAweDU0LAkweEJCLCAweDE2Ci19OwotCi0vKiBmb3J3YXJkIHRhYmxlICovCi0jZGVmaW5lCUZUIFwKLVwKLQlWKEM2LDYzLDYzLEE1KSwJVihGOCw3Qyw3Qyw4NCksCVYoRUUsNzcsNzcsOTkpLAlWKEY2LDdCLDdCLDhEKSwJXAotCVYoRkYsRjIsRjIsMEQpLAlWKEQ2LDZCLDZCLEJEKSwJVihERSw2Riw2RixCMSksCVYoOTEsQzUsQzUsNTQpLAlcCi0JVig2MCwzMCwzMCw1MCksCVYoMDIsMDEsMDEsMDMpLAlWKENFLDY3LDY3LEE5KSwJVig1NiwyQiwyQiw3RCksCVwKLQlWKEU3LEZFLEZFLDE5KSwJVihCNSxENyxENyw2MiksCVYoNEQsQUIsQUIsRTYpLAlWKEVDLDc2LDc2LDlBKSwJXAotCVYoOEYsQ0EsQ0EsNDUpLAlWKDFGLDgyLDgyLDlEKSwJVig4OSxDOSxDOSw0MCksCVYoRkEsN0QsN0QsODcpLAlcCi0JVihFRixGQSxGQSwxNSksCVYoQjIsNTksNTksRUIpLAlWKDhFLDQ3LDQ3LEM5KSwJVihGQixGMCxGMCwwQiksCVwKLQlWKDQxLEFELEFELEVDKSwJVihCMyxENCxENCw2NyksCVYoNUYsQTIsQTIsRkQpLAlWKDQ1LEFGLEFGLEVBKSwJXAotCVYoMjMsOUMsOUMsQkYpLAlWKDUzLEE0LEE0LEY3KSwJVihFNCw3Miw3Miw5NiksCVYoOUIsQzAsQzAsNUIpLAlcCi0JVig3NSxCNyxCNyxDMiksCVYoRTEsRkQsRkQsMUMpLAlWKDNELDkzLDkzLEFFKSwJVig0QywyNiwyNiw2QSksCVwKLQlWKDZDLDM2LDM2LDVBKSwJVig3RSwzRiwzRiw0MSksCVYoRjUsRjcsRjcsMDIpLAlWKDgzLENDLENDLDRGKSwJXAotCVYoNjgsMzQsMzQsNUMpLAlWKDUxLEE1LEE1LEY0KSwJVihEMSxFNSxFNSwzNCksCVYoRjksRjEsRjEsMDgpLAlcCi0JVihFMiw3MSw3MSw5MyksCVYoQUIsRDgsRDgsNzMpLAlWKDYyLDMxLDMxLDUzKSwJVigyQSwxNSwxNSwzRiksCVwKLQlWKDA4LDA0LDA0LDBDKSwJVig5NSxDNyxDNyw1MiksCVYoNDYsMjMsMjMsNjUpLAlWKDlELEMzLEMzLDVFKSwJXAotCVYoMzAsMTgsMTgsMjgpLAlWKDM3LDk2LDk2LEExKSwJVigwQSwwNSwwNSwwRiksCVYoMkYsOUEsOUEsQjUpLAlcCi0JVigwRSwwNywwNywwOSksCVYoMjQsMTIsMTIsMzYpLAlWKDFCLDgwLDgwLDlCKSwJVihERixFMixFMiwzRCksCVwKLQlWKENELEVCLEVCLDI2KSwJVig0RSwyNywyNyw2OSksCVYoN0YsQjIsQjIsQ0QpLAlWKEVBLDc1LDc1LDlGKSwJXAotCVYoMTIsMDksMDksMUIpLAlWKDFELDgzLDgzLDlFKSwJVig1OCwyQywyQyw3NCksCVYoMzQsMUEsMUEsMkUpLAlcCi0JVigzNiwxQiwxQiwyRCksCVYoREMsNkUsNkUsQjIpLAlWKEI0LDVBLDVBLEVFKSwJVig1QixBMCxBMCxGQiksCVwKLQlWKEE0LDUyLDUyLEY2KSwJVig3NiwzQiwzQiw0RCksCVYoQjcsRDYsRDYsNjEpLAlWKDdELEIzLEIzLENFKSwJXAotCVYoNTIsMjksMjksN0IpLAlWKERELEUzLEUzLDNFKSwJVig1RSwyRiwyRiw3MSksCVYoMTMsODQsODQsOTcpLAlcCi0JVihBNiw1Myw1MyxGNSksCVYoQjksRDEsRDEsNjgpLAlWKDAwLDAwLDAwLDAwKSwJVihDMSxFRCxFRCwyQyksCVwKLQlWKDQwLDIwLDIwLDYwKSwJVihFMyxGQyxGQywxRiksCVYoNzksQjEsQjEsQzgpLAlWKEI2LDVCLDVCLEVEKSwJXAotCVYoRDQsNkEsNkEsQkUpLAlWKDhELENCLENCLDQ2KSwJVig2NyxCRSxCRSxEOSksCVYoNzIsMzksMzksNEIpLAlcCi0JVig5NCw0QSw0QSxERSksCVYoOTgsNEMsNEMsRDQpLAlWKEIwLDU4LDU4LEU4KSwJVig4NSxDRixDRiw0QSksCVwKLQlWKEJCLEQwLEQwLDZCKSwJVihDNSxFRixFRiwyQSksCVYoNEYsQUEsQUEsRTUpLAlWKEVELEZCLEZCLDE2KSwJXAotCVYoODYsNDMsNDMsQzUpLAlWKDlBLDRELDRELEQ3KSwJVig2NiwzMywzMyw1NSksCVYoMTEsODUsODUsOTQpLAlcCi0JVig4QSw0NSw0NSxDRiksCVYoRTksRjksRjksMTApLAlWKDA0LDAyLDAyLDA2KSwJVihGRSw3Riw3Riw4MSksCVwKLQlWKEEwLDUwLDUwLEYwKSwJVig3OCwzQywzQyw0NCksCVYoMjUsOUYsOUYsQkEpLAlWKDRCLEE4LEE4LEUzKSwJXAotCVYoQTIsNTEsNTEsRjMpLAlWKDVELEEzLEEzLEZFKSwJVig4MCw0MCw0MCxDMCksCVYoMDUsOEYsOEYsOEEpLAlcCi0JVigzRiw5Miw5MixBRCksCVYoMjEsOUQsOUQsQkMpLAlWKDcwLDM4LDM4LDQ4KSwJVihGMSxGNSxGNSwwNCksCVwKLQlWKDYzLEJDLEJDLERGKSwJVig3NyxCNixCNixDMSksCVYoQUYsREEsREEsNzUpLAlWKDQyLDIxLDIxLDYzKSwJXAotCVYoMjAsMTAsMTAsMzApLAlWKEU1LEZGLEZGLDFBKSwJVihGRCxGMyxGMywwRSksCVYoQkYsRDIsRDIsNkQpLAlcCi0JVig4MSxDRCxDRCw0QyksCVYoMTgsMEMsMEMsMTQpLAlWKDI2LDEzLDEzLDM1KSwJVihDMyxFQyxFQywyRiksCVwKLQlWKEJFLDVGLDVGLEUxKSwJVigzNSw5Nyw5NyxBMiksCVYoODgsNDQsNDQsQ0MpLAlWKDJFLDE3LDE3LDM5KSwJXAotCVYoOTMsQzQsQzQsNTcpLAlWKDU1LEE3LEE3LEYyKSwJVihGQyw3RSw3RSw4MiksCVYoN0EsM0QsM0QsNDcpLAlcCi0JVihDOCw2NCw2NCxBQyksCVYoQkEsNUQsNUQsRTcpLAlWKDMyLDE5LDE5LDJCKSwJVihFNiw3Myw3Myw5NSksCVwKLQlWKEMwLDYwLDYwLEEwKSwJVigxOSw4MSw4MSw5OCksCVYoOUUsNEYsNEYsRDEpLAlWKEEzLERDLERDLDdGKSwJXAotCVYoNDQsMjIsMjIsNjYpLAlWKDU0LDJBLDJBLDdFKSwJVigzQiw5MCw5MCxBQiksCVYoMEIsODgsODgsODMpLAlcCi0JVig4Qyw0Niw0NixDQSksCVYoQzcsRUUsRUUsMjkpLAlWKDZCLEI4LEI4LEQzKSwJVigyOCwxNCwxNCwzQyksCVwKLQlWKEE3LERFLERFLDc5KSwJVihCQyw1RSw1RSxFMiksCVYoMTYsMEIsMEIsMUQpLAlWKEFELERCLERCLDc2KSwJXAotCVYoREIsRTAsRTAsM0IpLAlWKDY0LDMyLDMyLDU2KSwJVig3NCwzQSwzQSw0RSksCVYoMTQsMEEsMEEsMUUpLAlcCi0JVig5Miw0OSw0OSxEQiksCVYoMEMsMDYsMDYsMEEpLAlWKDQ4LDI0LDI0LDZDKSwJVihCOCw1Qyw1QyxFNCksCVwKLQlWKDlGLEMyLEMyLDVEKSwJVihCRCxEMyxEMyw2RSksCVYoNDMsQUMsQUMsRUYpLAlWKEM0LDYyLDYyLEE2KSwJXAotCVYoMzksOTEsOTEsQTgpLAlWKDMxLDk1LDk1LEE0KSwJVihEMyxFNCxFNCwzNyksCVYoRjIsNzksNzksOEIpLAlcCi0JVihENSxFNyxFNywzMiksCVYoOEIsQzgsQzgsNDMpLAlWKDZFLDM3LDM3LDU5KSwJVihEQSw2RCw2RCxCNyksCVwKLQlWKDAxLDhELDhELDhDKSwJVihCMSxENSxENSw2NCksCVYoOUMsNEUsNEUsRDIpLAlWKDQ5LEE5LEE5LEUwKSwJXAotCVYoRDgsNkMsNkMsQjQpLAlWKEFDLDU2LDU2LEZBKSwJVihGMyxGNCxGNCwwNyksCVYoQ0YsRUEsRUEsMjUpLAlcCi0JVihDQSw2NSw2NSxBRiksCVYoRjQsN0EsN0EsOEUpLAlWKDQ3LEFFLEFFLEU5KSwJVigxMCwwOCwwOCwxOCksCVwKLQlWKDZGLEJBLEJBLEQ1KSwJVihGMCw3OCw3OCw4OCksCVYoNEEsMjUsMjUsNkYpLAlWKDVDLDJFLDJFLDcyKSwJXAotCVYoMzgsMUMsMUMsMjQpLAlWKDU3LEE2LEE2LEYxKSwJVig3MyxCNCxCNCxDNyksCVYoOTcsQzYsQzYsNTEpLAlcCi0JVihDQixFOCxFOCwyMyksCVYoQTEsREQsREQsN0MpLAlWKEU4LDc0LDc0LDlDKSwJVigzRSwxRiwxRiwyMSksCVwKLQlWKDk2LDRCLDRCLEREKSwJVig2MSxCRCxCRCxEQyksCVYoMEQsOEIsOEIsODYpLAlWKDBGLDhBLDhBLDg1KSwJXAotCVYoRTAsNzAsNzAsOTApLAlWKDdDLDNFLDNFLDQyKSwJVig3MSxCNSxCNSxDNCksCVYoQ0MsNjYsNjYsQUEpLAlcCi0JVig5MCw0OCw0OCxEOCksCVYoMDYsMDMsMDMsMDUpLAlWKEY3LEY2LEY2LDAxKSwJVigxQywwRSwwRSwxMiksCVwKLQlWKEMyLDYxLDYxLEEzKSwJVig2QSwzNSwzNSw1RiksCVYoQUUsNTcsNTcsRjkpLAlWKDY5LEI5LEI5LEQwKSwJXAotCVYoMTcsODYsODYsOTEpLAlWKDk5LEMxLEMxLDU4KSwJVigzQSwxRCwxRCwyNyksCVYoMjcsOUUsOUUsQjkpLAlcCi0JVihEOSxFMSxFMSwzOCksCVYoRUIsRjgsRjgsMTMpLAlWKDJCLDk4LDk4LEIzKSwJVigyMiwxMSwxMSwzMyksCVwKLQlWKEQyLDY5LDY5LEJCKSwJVihBOSxEOSxEOSw3MCksCVYoMDcsOEUsOEUsODkpLAlWKDMzLDk0LDk0LEE3KSwJXAotCVYoMkQsOUIsOUIsQjYpLAlWKDNDLDFFLDFFLDIyKSwJVigxNSw4Nyw4Nyw5MiksCVYoQzksRTksRTksMjApLAlcCi0JVig4NyxDRSxDRSw0OSksCVYoQUEsNTUsNTUsRkYpLAlWKDUwLDI4LDI4LDc4KSwJVihBNSxERixERiw3QSksCVwKLQlWKDAzLDhDLDhDLDhGKSwJVig1OSxBMSxBMSxGOCksCVYoMDksODksODksODApLAlWKDFBLDBELDBELDE3KSwJXAotCVYoNjUsQkYsQkYsREEpLAlWKEQ3LEU2LEU2LDMxKSwJVig4NCw0Miw0MixDNiksCVYoRDAsNjgsNjgsQjgpLAlcCi0JVig4Miw0MSw0MSxDMyksCVYoMjksOTksOTksQjApLAlWKDVBLDJELDJELDc3KSwJVigxRSwwRiwwRiwxMSksCVwKLQlWKDdCLEIwLEIwLENCKSwJVihBOCw1NCw1NCxGQyksCVYoNkQsQkIsQkIsRDYpLAlWKDJDLDE2LDE2LDNBKQotCi0jZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2EjI2IjI2MjI2QKLXN0YXRpYyB1aW50MzIgRlQwWzI1Nl0gPSB7IEZUIH07Ci0jdW5kZWYgVgotCi0jZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2QjI2EjI2IjI2MKLXN0YXRpYyB1aW50MzIgRlQxWzI1Nl0gPSB7IEZUIH07Ci0jdW5kZWYgVgotCi0jZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2MjI2QjI2EjI2IKLXN0YXRpYyB1aW50MzIgRlQyWzI1Nl0gPSB7IEZUIH07Ci0jdW5kZWYgVgotCi0jZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2IjI2MjI2QjI2EKLXN0YXRpYyB1aW50MzIgRlQzWzI1Nl0gPSB7IEZUIH07Ci0jdW5kZWYgVgotCi0jdW5kZWYgRlQKLQotLyogcmV2ZXJzZSBTLWJveCAqLwotCi1zdGF0aWMgdWludDMyIFJTYlsyNTZdID0KLXsKLQkweDUyLCAweDA5LAkweDZBLCAweEQ1LAkweDMwLCAweDM2LAkweEE1LCAweDM4LAotCTB4QkYsIDB4NDAsCTB4QTMsIDB4OUUsCTB4ODEsIDB4RjMsCTB4RDcsIDB4RkIsCi0JMHg3QywgMHhFMywJMHgzOSwgMHg4MiwJMHg5QiwgMHgyRiwJMHhGRiwgMHg4NywKLQkweDM0LCAweDhFLAkweDQzLCAweDQ0LAkweEM0LCAweERFLAkweEU5LCAweENCLAotCTB4NTQsIDB4N0IsCTB4OTQsIDB4MzIsCTB4QTYsIDB4QzIsCTB4MjMsIDB4M0QsCi0JMHhFRSwgMHg0QywJMHg5NSwgMHgwQiwJMHg0MiwgMHhGQSwJMHhDMywgMHg0RSwKLQkweDA4LCAweDJFLAkweEExLCAweDY2LAkweDI4LCAweEQ5LAkweDI0LCAweEIyLAotCTB4NzYsIDB4NUIsCTB4QTIsIDB4NDksCTB4NkQsIDB4OEIsCTB4RDEsIDB4MjUsCi0JMHg3MiwgMHhGOCwJMHhGNiwgMHg2NCwJMHg4NiwgMHg2OCwJMHg5OCwgMHgxNiwKLQkweEQ0LCAweEE0LAkweDVDLCAweENDLAkweDVELCAweDY1LAkweEI2LCAweDkyLAotCTB4NkMsIDB4NzAsCTB4NDgsIDB4NTAsCTB4RkQsIDB4RUQsCTB4QjksIDB4REEsCi0JMHg1RSwgMHgxNSwJMHg0NiwgMHg1NywJMHhBNywgMHg4RCwJMHg5RCwgMHg4NCwKLQkweDkwLCAweEQ4LAkweEFCLCAweDAwLAkweDhDLCAweEJDLAkweEQzLCAweDBBLAotCTB4RjcsIDB4RTQsCTB4NTgsIDB4MDUsCTB4QjgsIDB4QjMsCTB4NDUsIDB4MDYsCi0JMHhEMCwgMHgyQywJMHgxRSwgMHg4RiwJMHhDQSwgMHgzRiwJMHgwRiwgMHgwMiwKLQkweEMxLCAweEFGLAkweEJELCAweDAzLAkweDAxLCAweDEzLAkweDhBLCAweDZCLAotCTB4M0EsIDB4OTEsCTB4MTEsIDB4NDEsCTB4NEYsIDB4NjcsCTB4REMsIDB4RUEsCi0JMHg5NywgMHhGMiwJMHhDRiwgMHhDRSwJMHhGMCwgMHhCNCwJMHhFNiwgMHg3MywKLQkweDk2LCAweEFDLAkweDc0LCAweDIyLAkweEU3LCAweEFELAkweDM1LCAweDg1LAotCTB4RTIsIDB4RjksCTB4MzcsIDB4RTgsCTB4MUMsIDB4NzUsCTB4REYsIDB4NkUsCi0JMHg0NywgMHhGMSwJMHgxQSwgMHg3MSwJMHgxRCwgMHgyOSwJMHhDNSwgMHg4OSwKLQkweDZGLCAweEI3LAkweDYyLCAweDBFLAkweEFBLCAweDE4LAkweEJFLCAweDFCLAotCTB4RkMsIDB4NTYsCTB4M0UsIDB4NEIsCTB4QzYsIDB4RDIsCTB4NzksIDB4MjAsCi0JMHg5QSwgMHhEQiwJMHhDMCwgMHhGRSwJMHg3OCwgMHhDRCwJMHg1QSwgMHhGNCwKLQkweDFGLCAweERELAkweEE4LCAweDMzLAkweDg4LCAweDA3LAkweEM3LCAweDMxLAotCTB4QjEsIDB4MTIsCTB4MTAsIDB4NTksCTB4MjcsIDB4ODAsCTB4RUMsIDB4NUYsCi0JMHg2MCwgMHg1MSwJMHg3RiwgMHhBOSwJMHgxOSwgMHhCNSwJMHg0QSwgMHgwRCwKLQkweDJELCAweEU1LAkweDdBLCAweDlGLAkweDkzLCAweEM5LAkweDlDLCAweEVGLAotCTB4QTAsIDB4RTAsCTB4M0IsIDB4NEQsCTB4QUUsIDB4MkEsCTB4RjUsIDB4QjAsCi0JMHhDOCwgMHhFQiwJMHhCQiwgMHgzQywJMHg4MywgMHg1MywJMHg5OSwgMHg2MSwKLQkweDE3LCAweDJCLAkweDA0LCAweDdFLAkweEJBLCAweDc3LAkweEQ2LCAweDI2LAotCTB4RTEsIDB4NjksCTB4MTQsIDB4NjMsCTB4NTUsIDB4MjEsCTB4MEMsIDB4N0QKLX07Ci0KLS8qIHJldmVyc2UgdGFibGUgKi8KLQotI2RlZmluZQlSVCBcCi1cCi0JVig1MSxGNCxBNyw1MCksCVYoN0UsNDEsNjUsNTMpLAlWKDFBLDE3LEE0LEMzKSwJVigzQSwyNyw1RSw5NiksCVwKLQlWKDNCLEFCLDZCLENCKSwJVigxRiw5RCw0NSxGMSksCVYoQUMsRkEsNTgsQUIpLAlWKDRCLEUzLDAzLDkzKSwJXAotCVYoMjAsMzAsRkEsNTUpLAlWKEFELDc2LDZELEY2KSwJVig4OCxDQyw3Niw5MSksCVYoRjUsMDIsNEMsMjUpLAlcCi0JVig0RixFNSxENyxGQyksCVYoQzUsMkEsQ0IsRDcpLAlWKDI2LDM1LDQ0LDgwKSwJVihCNSw2MixBMyw4RiksCVwKLQlWKERFLEIxLDVBLDQ5KSwJVigyNSxCQSwxQiw2NyksCVYoNDUsRUEsMEUsOTgpLAlWKDVELEZFLEMwLEUxKSwJXAotCVYoQzMsMkYsNzUsMDIpLAlWKDgxLDRDLEYwLDEyKSwJVig4RCw0Niw5NyxBMyksCVYoNkIsRDMsRjksQzYpLAlcCi0JVigwMyw4Riw1RixFNyksCVYoMTUsOTIsOUMsOTUpLAlWKEJGLDZELDdBLEVCKSwJVig5NSw1Miw1OSxEQSksCVwKLQlWKEQ0LEJFLDgzLDJEKSwJVig1OCw3NCwyMSxEMyksCVYoNDksRTAsNjksMjkpLAlWKDhFLEM5LEM4LDQ0KSwJXAotCVYoNzUsQzIsODksNkEpLAlWKEY0LDhFLDc5LDc4KSwJVig5OSw1OCwzRSw2QiksCVYoMjcsQjksNzEsREQpLAlcCi0JVihCRSxFMSw0RixCNiksCVYoRjAsODgsQUQsMTcpLAlWKEM5LDIwLEFDLDY2KSwJVig3RCxDRSwzQSxCNCksCVwKLQlWKDYzLERGLDRBLDE4KSwJVihFNSwxQSwzMSw4MiksCVYoOTcsNTEsMzMsNjApLAlWKDYyLDUzLDdGLDQ1KSwJXAotCVYoQjEsNjQsNzcsRTApLAlWKEJCLDZCLEFFLDg0KSwJVihGRSw4MSxBMCwxQyksCVYoRjksMDgsMkIsOTQpLAlcCi0JVig3MCw0OCw2OCw1OCksCVYoOEYsNDUsRkQsMTkpLAlWKDk0LERFLDZDLDg3KSwJVig1Miw3QixGOCxCNyksCVwKLQlWKEFCLDczLEQzLDIzKSwJVig3Miw0QiwwMixFMiksCVYoRTMsMUYsOEYsNTcpLAlWKDY2LDU1LEFCLDJBKSwJXAotCVYoQjIsRUIsMjgsMDcpLAlWKDJGLEI1LEMyLDAzKSwJVig4NixDNSw3Qiw5QSksCVYoRDMsMzcsMDgsQTUpLAlcCi0JVigzMCwyOCw4NyxGMiksCVYoMjMsQkYsQTUsQjIpLAlWKDAyLDAzLDZBLEJBKSwJVihFRCwxNiw4Miw1QyksCVwKLQlWKDhBLENGLDFDLDJCKSwJVihBNyw3OSxCNCw5MiksCVYoRjMsMDcsRjIsRjApLAlWKDRFLDY5LEUyLEExKSwJXAotCVYoNjUsREEsRjQsQ0QpLAlWKDA2LDA1LEJFLEQ1KSwJVihEMSwzNCw2MiwxRiksCVYoQzQsQTYsRkUsOEEpLAlcCi0JVigzNCwyRSw1Myw5RCksCVYoQTIsRjMsNTUsQTApLAlWKDA1LDhBLEUxLDMyKSwJVihBNCxGNixFQiw3NSksCVwKLQlWKDBCLDgzLEVDLDM5KSwJVig0MCw2MCxFRixBQSksCVYoNUUsNzEsOUYsMDYpLAlWKEJELDZFLDEwLDUxKSwJXAotCVYoM0UsMjEsOEEsRjkpLAlWKDk2LERELDA2LDNEKSwJVihERCwzRSwwNSxBRSksCVYoNEQsRTYsQkQsNDYpLAlcCi0JVig5MSw1NCw4RCxCNSksCVYoNzEsQzQsNUQsMDUpLAlWKDA0LDA2LEQ0LDZGKSwJVig2MCw1MCwxNSxGRiksCVwKLQlWKDE5LDk4LEZCLDI0KSwJVihENixCRCxFOSw5NyksCVYoODksNDAsNDMsQ0MpLAlWKDY3LEQ5LDlFLDc3KSwJXAotCVYoQjAsRTgsNDIsQkQpLAlWKDA3LDg5LDhCLDg4KSwJVihFNywxOSw1QiwzOCksCVYoNzksQzgsRUUsREIpLAlcCi0JVihBMSw3QywwQSw0NyksCVYoN0MsNDIsMEYsRTkpLAlWKEY4LDg0LDFFLEM5KSwJVigwMCwwMCwwMCwwMCksCVwKLQlWKDA5LDgwLDg2LDgzKSwJVigzMiwyQixFRCw0OCksCVYoMUUsMTEsNzAsQUMpLAlWKDZDLDVBLDcyLDRFKSwJXAotCVYoRkQsMEUsRkYsRkIpLAlWKDBGLDg1LDM4LDU2KSwJVigzRCxBRSxENSwxRSksCVYoMzYsMkQsMzksMjcpLAlcCi0JVigwQSwwRixEOSw2NCksCVYoNjgsNUMsQTYsMjEpLAlWKDlCLDVCLDU0LEQxKSwJVigyNCwzNiwyRSwzQSksCVwKLQlWKDBDLDBBLDY3LEIxKSwJVig5Myw1NyxFNywwRiksCVYoQjQsRUUsOTYsRDIpLAlWKDFCLDlCLDkxLDlFKSwJXAotCVYoODAsQzAsQzUsNEYpLAlWKDYxLERDLDIwLEEyKSwJVig1QSw3Nyw0Qiw2OSksCVYoMUMsMTIsMUEsMTYpLAlcCi0JVihFMiw5MyxCQSwwQSksCVYoQzAsQTAsMkEsRTUpLAlWKDNDLDIyLEUwLDQzKSwJVigxMiwxQiwxNywxRCksCVwKLQlWKDBFLDA5LDBELDBCKSwJVihGMiw4QixDNyxBRCksCVYoMkQsQjYsQTgsQjkpLAlWKDE0LDFFLEE5LEM4KSwJXAotCVYoNTcsRjEsMTksODUpLAlWKEFGLDc1LDA3LDRDKSwJVihFRSw5OSxERCxCQiksCVYoQTMsN0YsNjAsRkQpLAlcCi0JVihGNywwMSwyNiw5RiksCVYoNUMsNzIsRjUsQkMpLAlWKDQ0LDY2LDNCLEM1KSwJVig1QixGQiw3RSwzNCksCVwKLQlWKDhCLDQzLDI5LDc2KSwJVihDQiwyMyxDNixEQyksCVYoQjYsRUQsRkMsNjgpLAlWKEI4LEU0LEYxLDYzKSwJXAotCVYoRDcsMzEsREMsQ0EpLAlWKDQyLDYzLDg1LDEwKSwJVigxMyw5NywyMiw0MCksCVYoODQsQzYsMTEsMjApLAlcCi0JVig4NSw0QSwyNCw3RCksCVYoRDIsQkIsM0QsRjgpLAlWKEFFLEY5LDMyLDExKSwJVihDNywyOSxBMSw2RCksCVwKLQlWKDFELDlFLDJGLDRCKSwJVihEQyxCMiwzMCxGMyksCVYoMEQsODYsNTIsRUMpLAlWKDc3LEMxLEUzLEQwKSwJXAotCVYoMkIsQjMsMTYsNkMpLAlWKEE5LDcwLEI5LDk5KSwJVigxMSw5NCw0OCxGQSksCVYoNDcsRTksNjQsMjIpLAlcCi0JVihBOCxGQyw4QyxDNCksCVYoQTAsRjAsM0YsMUEpLAlWKDU2LDdELDJDLEQ4KSwJVigyMiwzMyw5MCxFRiksCVwKLQlWKDg3LDQ5LDRFLEM3KSwJVihEOSwzOCxEMSxDMSksCVYoOEMsQ0EsQTIsRkUpLAlWKDk4LEQ0LDBCLDM2KSwJXAotCVYoQTYsRjUsODEsQ0YpLAlWKEE1LDdBLERFLDI4KSwJVihEQSxCNyw4RSwyNiksCVYoM0YsQUQsQkYsQTQpLAlcCi0JVigyQywzQSw5RCxFNCksCVYoNTAsNzgsOTIsMEQpLAlWKDZBLDVGLENDLDlCKSwJVig1NCw3RSw0Niw2MiksCVwKLQlWKEY2LDhELDEzLEMyKSwJVig5MCxEOCxCOCxFOCksCVYoMkUsMzksRjcsNUUpLAlWKDgyLEMzLEFGLEY1KSwJXAotCVYoOUYsNUQsODAsQkUpLAlWKDY5LEQwLDkzLDdDKSwJVig2RixENSwyRCxBOSksCVYoQ0YsMjUsMTIsQjMpLAlcCi0JVihDOCxBQyw5OSwzQiksCVYoMTAsMTgsN0QsQTcpLAlWKEU4LDlDLDYzLDZFKSwJVihEQiwzQixCQiw3QiksCVwKLQlWKENELDI2LDc4LDA5KSwJVig2RSw1OSwxOCxGNCksCVYoRUMsOUEsQjcsMDEpLAlWKDgzLDRGLDlBLEE4KSwJXAotCVYoRTYsOTUsNkUsNjUpLAlWKEFBLEZGLEU2LDdFKSwJVigyMSxCQyxDRiwwOCksCVYoRUYsMTUsRTgsRTYpLAlcCi0JVihCQSxFNyw5QixEOSksCVYoNEEsNkYsMzYsQ0UpLAlWKEVBLDlGLDA5LEQ0KSwJVigyOSxCMCw3QyxENiksCVwKLQlWKDMxLEE0LEIyLEFGKSwJVigyQSwzRiwyMywzMSksCVYoQzYsQTUsOTQsMzApLAlWKDM1LEEyLDY2LEMwKSwJXAotCVYoNzQsNEUsQkMsMzcpLAlWKEZDLDgyLENBLEE2KSwJVihFMCw5MCxEMCxCMCksCVYoMzMsQTcsRDgsMTUpLAlcCi0JVihGMSwwNCw5OCw0QSksCVYoNDEsRUMsREEsRjcpLAlWKDdGLENELDUwLDBFKSwJVigxNyw5MSxGNiwyRiksCVwKLQlWKDc2LDRELEQ2LDhEKSwJVig0MyxFRixCMCw0RCksCVYoQ0MsQUEsNEQsNTQpLAlWKEU0LDk2LDA0LERGKSwJXAotCVYoOUUsRDEsQjUsRTMpLAlWKDRDLDZBLDg4LDFCKSwJVihDMSwyQywxRixCOCksCVYoNDYsNjUsNTEsN0YpLAlcCi0JVig5RCw1RSxFQSwwNCksCVYoMDEsOEMsMzUsNUQpLAlWKEZBLDg3LDc0LDczKSwJVihGQiwwQiw0MSwyRSksCVwKLQlWKEIzLDY3LDFELDVBKSwJVig5MixEQixEMiw1MiksCVYoRTksMTAsNTYsMzMpLAlWKDZELEQ2LDQ3LDEzKSwJXAotCVYoOUEsRDcsNjEsOEMpLAlWKDM3LEExLDBDLDdBKSwJVig1OSxGOCwxNCw4RSksCVYoRUIsMTMsM0MsODkpLAlcCi0JVihDRSxBOSwyNyxFRSksCVYoQjcsNjEsQzksMzUpLAlWKEUxLDFDLEU1LEVEKSwJVig3QSw0NyxCMSwzQyksCVwKLQlWKDlDLEQyLERGLDU5KSwJVig1NSxGMiw3MywzRiksCVYoMTgsMTQsQ0UsNzkpLAlWKDczLEM3LDM3LEJGKSwJXAotCVYoNTMsRjcsQ0QsRUEpLAlWKDVGLEZELEFBLDVCKSwJVihERiwzRCw2RiwxNCksCVYoNzgsNDQsREIsODYpLAlcCi0JVihDQSxBRixGMyw4MSksCVYoQjksNjgsQzQsM0UpLAlWKDM4LDI0LDM0LDJDKSwJVihDMixBMyw0MCw1RiksCVwKLQlWKDE2LDFELEMzLDcyKSwJVihCQyxFMiwyNSwwQyksCVYoMjgsM0MsNDksOEIpLAlWKEZGLDBELDk1LDQxKSwJXAotCVYoMzksQTgsMDEsNzEpLAlWKDA4LDBDLEIzLERFKSwJVihEOCxCNCxFNCw5QyksCVYoNjQsNTYsQzEsOTApLAlcCi0JVig3QixDQiw4NCw2MSksCVYoRDUsMzIsQjYsNzApLAlWKDQ4LDZDLDVDLDc0KSwJVihEMCxCOCw1Nyw0MikKLQotI2RlZmluZQlWKGEsYixjLGQpIDB4IyNhIyNiIyNjIyNkCi1zdGF0aWMgdWludDMyIFJUMFsyNTZdID0geyBSVCB9OwotI3VuZGVmIFYKLQotI2RlZmluZQlWKGEsYixjLGQpIDB4IyNkIyNhIyNiIyNjCi1zdGF0aWMgdWludDMyIFJUMVsyNTZdID0geyBSVCB9OwotI3VuZGVmIFYKLQotI2RlZmluZQlWKGEsYixjLGQpIDB4IyNjIyNkIyNhIyNiCi1zdGF0aWMgdWludDMyIFJUMlsyNTZdID0geyBSVCB9OwotI3VuZGVmIFYKLQotI2RlZmluZQlWKGEsYixjLGQpIDB4IyNiIyNjIyNkIyNhCi1zdGF0aWMgdWludDMyIFJUM1syNTZdID0geyBSVCB9OwotI3VuZGVmIFYKLQotI3VuZGVmIFJUCi0KLS8qIHJvdW5kIGNvbnN0YW50cyAqLwotCi1zdGF0aWMgdWludDMyIFJDT05bMTBdID0KLXsKLQkweDAxMDAwMDAwLAkweDAyMDAwMDAwLAkweDA0MDAwMDAwLAkweDA4MDAwMDAwLAotCTB4MTAwMDAwMDAsCTB4MjAwMDAwMDAsCTB4NDAwMDAwMDAsCTB4ODAwMDAwMDAsCi0JMHgxQjAwMDAwMCwJMHgzNjAwMDAwMAotfTsKLQotLyoga2V5IHNjaGVkdWxlCXRhYmxlcyAqLwotCi1zdGF0aWMgaW50IEtUX2luaXQgPSAxOwotCi1zdGF0aWMgdWludDMyIEtUMFsyNTZdOwotc3RhdGljIHVpbnQzMiBLVDFbMjU2XTsKLXN0YXRpYyB1aW50MzIgS1QyWzI1Nl07Ci1zdGF0aWMgdWludDMyIEtUM1syNTZdOwotCi0vKiBwbGF0Zm9ybS1pbmRlcGVuZGFudAkzMi1iaXQgaW50ZWdlciBtYW5pcHVsYXRpb24JbWFjcm9zICovCi0KLSNkZWZpbmUJR0VUX1VJTlQzMihuLGIsaSkJCQkJCQlcCi17CQkJCQkJCQkJCQkJXAotCShuKQk9ICgJKHVpbnQzMikgKGIpWyhpKQldIDw8IDI0CSkJCVwKLQkJfCAoCSh1aW50MzIpIChiKVsoaSkgKyAxXSA8PCAxNgkpCQlcCi0JCXwgKAkodWludDMyKSAoYilbKGkpICsgMl0gPDwgIDgJKQkJXAotCQl8ICgJKHVpbnQzMikgKGIpWyhpKSArIDNdCQkpOwkJXAotfQotCi0jZGVmaW5lCVBVVF9VSU5UMzIobixiLGkpCQkJCQkJXAotewkJCQkJCQkJCQkJCVwKLQkoYilbKGkpCSAgIF0gPSAodWludDgpICggKG4pID4+CTI0ICk7CQlcCi0JKGIpWyhpKQkrIDFdID0gKHVpbnQ4KSAoIChuKSA+PgkxNiApOwkJXAotCShiKVsoaSkJKyAyXSA9ICh1aW50OCkgKCAobikgPj4JIDggKTsJCVwKLQkoYilbKGkpCSsgM10gPSAodWludDgpICggKG4pCSAgICk7CQlcCi19Ci0KLS8qIEFFUyBrZXkgc2NoZWR1bGluZyByb3V0aW5lICovCi0KLWludAlydG1wX2Flc19zZXRfa2V5KCBhZXNfY29udGV4dCAqY3R4LCB1aW50OCAqa2V5LCBpbnQgbmJpdHMgKQotewotCWludAlpOwotCXVpbnQzMiAqUkssCSpTSzsKLQotCXN3aXRjaCgJbmJpdHMgKQotCXsKLQkJY2FzZSAxMjg6IGN0eC0+bnIgPQkxMDsJYnJlYWs7Ci0JCWNhc2UgMTkyOiBjdHgtPm5yID0JMTI7CWJyZWFrOwotCQljYXNlIDI1NjogY3R4LT5uciA9CTE0OwlicmVhazsKLQkJZGVmYXVsdAk6IHJldHVybiggMQkpOwotCX0KLQotCVJLID0gY3R4LT5lcms7Ci0KLQlmb3IoIGkgPSAwOwlpIDwJKG5iaXRzID4+IDUpOyBpKysgKQotCXsKLQkJR0VUX1VJTlQzMigJUktbaV0sIGtleSwJaSAqCTQgKTsKLQl9Ci0KLQkvKiBzZXR1cCBlbmNyeXB0aW9uCXJvdW5kIGtleXMgKi8KLQotCXN3aXRjaCgJbmJpdHMgKQotCXsKLQljYXNlIDEyODoKLQotCQlmb3IoIGkgPSAwOwlpIDwJMTA7CWkrKywgUksJKz0gNCApCi0JCXsKLQkJCVJLWzRdICA9IFJLWzBdIF4gUkNPTltpXSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzNdID4+IDE2ICkgXSA8PAkyNCApIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbM10gPj4gIDggKSBdIDw8CTE2ICkgXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1szXQkJICkgXSA8PAkgOCApIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbM10gPj4gMjQgKSBdCSAgICk7Ci0KLQkJCVJLWzVdICA9IFJLWzFdIF4gUktbNF07Ci0JCQlSS1s2XSAgPSBSS1syXSBeIFJLWzVdOwotCQkJUktbN10gID0gUktbM10gXiBSS1s2XTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgMTkyOgotCi0JCWZvciggaSA9IDA7CWkgPAk4OyBpKyssCVJLICs9IDYJKQotCQl7Ci0JCQlSS1s2XSAgPSBSS1swXSBeIFJDT05baV0gXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s1XSA+PiAxNiApIF0gPDwJMjQgKSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzVdID4+ICA4ICkgXSA8PAkxNiApIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbNV0JCSApIF0gPDwJIDggKSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzVdID4+IDI0ICkgXQkgICApOwotCi0JCQlSS1s3XSAgPSBSS1sxXSBeIFJLWzZdOwotCQkJUktbOF0gID0gUktbMl0gXiBSS1s3XTsKLQkJCVJLWzldICA9IFJLWzNdIF4gUktbOF07Ci0JCQlSS1sxMF0gPSBSS1s0XSBeIFJLWzldOwotCQkJUktbMTFdID0gUktbNV0gXiBSS1sxMF07Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIDI1NjoKLQotCQlmb3IoIGkgPSAwOwlpIDwJNzsgaSsrLAlSSyArPSA4CSkKLQkJewotCQkJUktbOF0gID0gUktbMF0gXiBSQ09OW2ldIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbN10gPj4gMTYgKSBdIDw8CTI0ICkgXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s3XSA+PiAgOCApIF0gPDwJMTYgKSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzddCQkgKSBdIDw8CSA4ICkgXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s3XSA+PiAyNCApIF0JICAgKTsKLQotCQkJUktbOV0gID0gUktbMV0gXiBSS1s4XTsKLQkJCVJLWzEwXSA9IFJLWzJdIF4gUktbOV07Ci0JCQlSS1sxMV0gPSBSS1szXSBeIFJLWzEwXTsKLQotCQkJUktbMTJdID0gUktbNF0gXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1sxMV0JPj4gMjQgKQldIDw8IDI0CSkgXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1sxMV0JPj4gMTYgKQldIDw8IDE2CSkgXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1sxMV0JPj4JOCApCV0gPDwgIDgJKSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzExXQkJICApCV0JCSk7Ci0KLQkJCVJLWzEzXSA9IFJLWzVdIF4gUktbMTJdOwotCQkJUktbMTRdID0gUktbNl0gXiBSS1sxM107Ci0JCQlSS1sxNV0gPSBSS1s3XSBeIFJLWzE0XTsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQkvKiBzZXR1cCBkZWNyeXB0aW9uCXJvdW5kIGtleXMgKi8KLQotCWlmKAlLVF9pbml0CSkKLQl7Ci0JCWZvciggaSA9IDA7CWkgPAkyNTY7IGkrKyApCi0JCXsKLQkJCUtUMFtpXSA9IFJUMFsgRlNiW2ldIF07Ci0JCQlLVDFbaV0gPSBSVDFbIEZTYltpXSBdOwotCQkJS1QyW2ldID0gUlQyWyBGU2JbaV0gXTsKLQkJCUtUM1tpXSA9IFJUM1sgRlNiW2ldIF07Ci0JCX0KLQotCQlLVF9pbml0CT0gMDsKLQl9Ci0KLQlTSyA9IGN0eC0+ZHJrOwotCi0JKlNLKysgPQkqUksrKzsKLQkqU0srKyA9CSpSSysrOwotCSpTSysrID0JKlJLKys7Ci0JKlNLKysgPQkqUksrKzsKLQotCWZvciggaSA9IDE7CWkgPAljdHgtPm5yOyBpKysgKQotCXsKLQkJUksgLT0gODsKLQotCQkqU0srKyA9CUtUMFsgKHVpbnQ4KSAoICpSSyA+PiAyNCApIF0gXgotCQkJCUtUMVsgKHVpbnQ4KSAoICpSSyA+PiAxNiApIF0gXgotCQkJCUtUMlsgKHVpbnQ4KSAoICpSSyA+PiAgOCApIF0gXgotCQkJCUtUM1sgKHVpbnQ4KSAoICpSSwkJICkgXTsgUksrKzsKLQotCQkqU0srKyA9CUtUMFsgKHVpbnQ4KSAoICpSSyA+PiAyNCApIF0gXgotCQkJCUtUMVsgKHVpbnQ4KSAoICpSSyA+PiAxNiApIF0gXgotCQkJCUtUMlsgKHVpbnQ4KSAoICpSSyA+PiAgOCApIF0gXgotCQkJCUtUM1sgKHVpbnQ4KSAoICpSSwkJICkgXTsgUksrKzsKLQotCQkqU0srKyA9CUtUMFsgKHVpbnQ4KSAoICpSSyA+PiAyNCApIF0gXgotCQkJCUtUMVsgKHVpbnQ4KSAoICpSSyA+PiAxNiApIF0gXgotCQkJCUtUMlsgKHVpbnQ4KSAoICpSSyA+PiAgOCApIF0gXgotCQkJCUtUM1sgKHVpbnQ4KSAoICpSSwkJICkgXTsgUksrKzsKLQotCQkqU0srKyA9CUtUMFsgKHVpbnQ4KSAoICpSSyA+PiAyNCApIF0gXgotCQkJCUtUMVsgKHVpbnQ4KSAoICpSSyA+PiAxNiApIF0gXgotCQkJCUtUMlsgKHVpbnQ4KSAoICpSSyA+PiAgOCApIF0gXgotCQkJCUtUM1sgKHVpbnQ4KSAoICpSSwkJICkgXTsgUksrKzsKLQl9Ci0KLQlSSyAtPSA4OwotCi0JKlNLKysgPQkqUksrKzsKLQkqU0srKyA9CSpSSysrOwotCSpTSysrID0JKlJLKys7Ci0JKlNLKysgPQkqUksrKzsKLQotCXJldHVybigJMCApOwotfQotCi0vKiBBRVMgMTI4LWJpdCBibG9jayBlbmNyeXB0aW9uCXJvdXRpbmUJKi8KLQotdm9pZCBydG1wX2Flc19lbmNyeXB0KGFlc19jb250ZXh0ICpjdHgsIHVpbnQ4IGlucHV0WzE2XSwJdWludDggb3V0cHV0WzE2XSApCi17Ci0JdWludDMyICpSSywJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzOwotCi0JUksgPSBjdHgtPmVyazsKLQlHRVRfVUlOVDMyKAlYMCwJaW5wdXQsCTAgKTsgWDAJXj0gUktbMF07Ci0JR0VUX1VJTlQzMigJWDEsCWlucHV0LAk0ICk7IFgxCV49IFJLWzFdOwotCUdFVF9VSU5UMzIoCVgyLAlpbnB1dCwJOCApOyBYMglePSBSS1syXTsKLQlHRVRfVUlOVDMyKAlYMywJaW5wdXQsIDEyICk7IFgzCV49IFJLWzNdOwotCi0jZGVmaW5lCUFFU19GUk9VTkQoWDAsWDEsWDIsWDMsWTAsWTEsWTIsWTMpCQlcCi17CQkJCQkJCQkJCQkJXAotCVJLICs9IDQ7CQkJCQkJCQkJXAotCQkJCQkJCQkJCQkJXAotCVgwID0gUktbMF0gXiBGVDBbICh1aW50OCkgKAlZMCA+PiAyNCApIF0gXglcCi0JCQkJIEZUMVsgKHVpbnQ4KSAoCVkxID4+IDE2ICkgXSBeCVwKLQkJCQkgRlQyWyAodWludDgpICgJWTIgPj4gIDggKSBdIF4JXAotCQkJCSBGVDNbICh1aW50OCkgKAlZMwkJICkgXTsJXAotCQkJCQkJCQkJCQkJXAotCVgxID0gUktbMV0gXiBGVDBbICh1aW50OCkgKAlZMSA+PiAyNCApIF0gXglcCi0JCQkJIEZUMVsgKHVpbnQ4KSAoCVkyID4+IDE2ICkgXSBeCVwKLQkJCQkgRlQyWyAodWludDgpICgJWTMgPj4gIDggKSBdIF4JXAotCQkJCSBGVDNbICh1aW50OCkgKAlZMAkJICkgXTsJXAotCQkJCQkJCQkJCQkJXAotCVgyID0gUktbMl0gXiBGVDBbICh1aW50OCkgKAlZMiA+PiAyNCApIF0gXglcCi0JCQkJIEZUMVsgKHVpbnQ4KSAoCVkzID4+IDE2ICkgXSBeCVwKLQkJCQkgRlQyWyAodWludDgpICgJWTAgPj4gIDggKSBdIF4JXAotCQkJCSBGVDNbICh1aW50OCkgKAlZMQkJICkgXTsJXAotCQkJCQkJCQkJCQkJXAotCVgzID0gUktbM10gXiBGVDBbICh1aW50OCkgKAlZMyA+PiAyNCApIF0gXglcCi0JCQkJIEZUMVsgKHVpbnQ4KSAoCVkwID4+IDE2ICkgXSBeCVwKLQkJCQkgRlQyWyAodWludDgpICgJWTEgPj4gIDggKSBdIF4JXAotCQkJCSBGVDNbICh1aW50OCkgKAlZMgkJICkgXTsJXAotfQotCi0JQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCAxICovCi0JQUVTX0ZST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCAyICovCi0JQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCAzICovCi0JQUVTX0ZST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA0ICovCi0JQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA1ICovCi0JQUVTX0ZST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA2ICovCi0JQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA3ICovCi0JQUVTX0ZST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA4ICovCi0JQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA5ICovCi0KLQlpZigJY3R4LT5ucgk+IDEwICkKLQl7Ci0JCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkvKiByb3VuZCAxMAkqLwotCQlBRVNfRlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJLyogcm91bmQgMTEJKi8KLQl9Ci0KLQlpZigJY3R4LT5ucgk+IDEyICkKLQl7Ci0JCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkvKiByb3VuZCAxMgkqLwotCQlBRVNfRlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJLyogcm91bmQgMTMJKi8KLQl9Ci0KLQkvKiBsYXN0CXJvdW5kICovCi0KLQlSSyArPSA0OwotCi0JWDAgPSBSS1swXSBeICggRlNiWwkodWludDgpCSggWTAgPj4JMjQgKSBdIDw8IDI0ICkgXgotCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkxID4+CTE2ICkgXSA8PCAxNiApIF4KLQkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMiA+PgkgOCApIF0gPDwgIDggKSBeCi0JCQkJICggRlNiWwkodWludDgpCSggWTMJICAgKSBdCQkgKTsKLQotCVgxID0gUktbMV0gXiAoIEZTYlsJKHVpbnQ4KQkoIFkxID4+CTI0ICkgXSA8PCAyNCApIF4KLQkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMiA+PgkxNiApIF0gPDwgMTYgKSBeCi0JCQkJICggRlNiWwkodWludDgpCSggWTMgPj4JIDggKSBdIDw8ICA4ICkgXgotCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkwCSAgICkgXQkJICk7Ci0KLQlYMiA9IFJLWzJdIF4gKCBGU2JbCSh1aW50OCkJKCBZMiA+PgkyNCApIF0gPDwgMjQgKSBeCi0JCQkJICggRlNiWwkodWludDgpCSggWTMgPj4JMTYgKSBdIDw8IDE2ICkgXgotCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkwID4+CSA4ICkgXSA8PCAgOCApIF4KLQkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMQkgICApIF0JCSApOwotCi0JWDMgPSBSS1szXSBeICggRlNiWwkodWludDgpCSggWTMgPj4JMjQgKSBdIDw8IDI0ICkgXgotCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkwID4+CTE2ICkgXSA8PCAxNiApIF4KLQkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMSA+PgkgOCApIF0gPDwgIDggKSBeCi0JCQkJICggRlNiWwkodWludDgpCSggWTIJICAgKSBdCQkgKTsKLQotCVBVVF9VSU5UMzIoCVgwLAlvdXRwdXQsCSAwICk7Ci0JUFVUX1VJTlQzMigJWDEsCW91dHB1dCwJIDQgKTsKLQlQVVRfVUlOVDMyKAlYMiwJb3V0cHV0LAkgOCApOwotCVBVVF9VSU5UMzIoCVgzLAlvdXRwdXQsCTEyICk7Ci19Ci0KLS8qIEFFUyAxMjgtYml0IGJsb2NrIGRlY3J5cHRpb24Jcm91dGluZQkqLwotCi12b2lkIHJ0bXBfYWVzX2RlY3J5cHQoIGFlc19jb250ZXh0ICpjdHgsCXVpbnQ4IGlucHV0WzE2XSwgdWludDggb3V0cHV0WzE2XSApCi17Ci0JdWludDMyICpSSywJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzOwotCi0JUksgPSBjdHgtPmRyazsKLQotCUdFVF9VSU5UMzIoCVgwLAlpbnB1dCwJMCApOyBYMAlePSBSS1swXTsKLQlHRVRfVUlOVDMyKAlYMSwJaW5wdXQsCTQgKTsgWDEJXj0gUktbMV07Ci0JR0VUX1VJTlQzMigJWDIsCWlucHV0LAk4ICk7IFgyCV49IFJLWzJdOwotCUdFVF9VSU5UMzIoCVgzLAlpbnB1dCwgMTIgKTsgWDMJXj0gUktbM107Ci0KLSNkZWZpbmUJQUVTX1JST1VORChYMCxYMSxYMixYMyxZMCxZMSxZMixZMykJCVwKLXsJCQkJCQkJCQkJCQlcCi0JUksgKz0gNDsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JWDAgPSBSS1swXSBeIFJUMFsgKHVpbnQ4KSAoCVkwID4+IDI0ICkgXSBeCVwKLQkJCQkgUlQxWyAodWludDgpICgJWTMgPj4gMTYgKSBdIF4JXAotCQkJCSBSVDJbICh1aW50OCkgKAlZMiA+PiAgOCApIF0gXglcCi0JCQkJIFJUM1sgKHVpbnQ4KSAoCVkxCQkgKSBdOwlcCi0JCQkJCQkJCQkJCQlcCi0JWDEgPSBSS1sxXSBeIFJUMFsgKHVpbnQ4KSAoCVkxID4+IDI0ICkgXSBeCVwKLQkJCQkgUlQxWyAodWludDgpICgJWTAgPj4gMTYgKSBdIF4JXAotCQkJCSBSVDJbICh1aW50OCkgKAlZMyA+PiAgOCApIF0gXglcCi0JCQkJIFJUM1sgKHVpbnQ4KSAoCVkyCQkgKSBdOwlcCi0JCQkJCQkJCQkJCQlcCi0JWDIgPSBSS1syXSBeIFJUMFsgKHVpbnQ4KSAoCVkyID4+IDI0ICkgXSBeCVwKLQkJCQkgUlQxWyAodWludDgpICgJWTEgPj4gMTYgKSBdIF4JXAotCQkJCSBSVDJbICh1aW50OCkgKAlZMCA+PiAgOCApIF0gXglcCi0JCQkJIFJUM1sgKHVpbnQ4KSAoCVkzCQkgKSBdOwlcCi0JCQkJCQkJCQkJCQlcCi0JWDMgPSBSS1szXSBeIFJUMFsgKHVpbnQ4KSAoCVkzID4+IDI0ICkgXSBeCVwKLQkJCQkgUlQxWyAodWludDgpICgJWTIgPj4gMTYgKSBdIF4JXAotCQkJCSBSVDJbICh1aW50OCkgKAlZMSA+PiAgOCApIF0gXglcCi0JCQkJIFJUM1sgKHVpbnQ4KSAoCVkwCQkgKSBdOwlcCi19Ci0KLQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDEgKi8KLQlBRVNfUlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDIgKi8KLQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDMgKi8KLQlBRVNfUlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDQgKi8KLQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDUgKi8KLQlBRVNfUlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDYgKi8KLQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDcgKi8KLQlBRVNfUlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDggKi8KLQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDkgKi8KLQotCWlmKAljdHgtPm5yCT4gMTAgKQotCXsKLQkJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CS8qIHJvdW5kIDEwCSovCi0JCUFFU19SUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkvKiByb3VuZCAxMQkqLwotCX0KLQotCWlmKAljdHgtPm5yCT4gMTIgKQotCXsKLQkJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CS8qIHJvdW5kIDEyCSovCi0JCUFFU19SUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkvKiByb3VuZCAxMwkqLwotCX0KLQotCS8qIGxhc3QJcm91bmQgKi8KLQotCVJLICs9IDQ7Ci0KLQlYMCA9IFJLWzBdIF4gKCBSU2JbCSh1aW50OCkJKCBZMCA+PgkyNCApIF0gPDwgMjQgKSBeCi0JCQkJICggUlNiWwkodWludDgpCSggWTMgPj4JMTYgKSBdIDw8IDE2ICkgXgotCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkyID4+CSA4ICkgXSA8PCAgOCApIF4KLQkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMQkgICApIF0JCSApOwotCi0JWDEgPSBSS1sxXSBeICggUlNiWwkodWludDgpCSggWTEgPj4JMjQgKSBdIDw8IDI0ICkgXgotCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkwID4+CTE2ICkgXSA8PCAxNiApIF4KLQkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMyA+PgkgOCApIF0gPDwgIDggKSBeCi0JCQkJICggUlNiWwkodWludDgpCSggWTIJICAgKSBdCQkgKTsKLQotCVgyID0gUktbMl0gXiAoIFJTYlsJKHVpbnQ4KQkoIFkyID4+CTI0ICkgXSA8PCAyNCApIF4KLQkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMSA+PgkxNiApIF0gPDwgMTYgKSBeCi0JCQkJICggUlNiWwkodWludDgpCSggWTAgPj4JIDggKSBdIDw8ICA4ICkgXgotCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkzCSAgICkgXQkJICk7Ci0KLQlYMyA9IFJLWzNdIF4gKCBSU2JbCSh1aW50OCkJKCBZMyA+PgkyNCApIF0gPDwgMjQgKSBeCi0JCQkJICggUlNiWwkodWludDgpCSggWTIgPj4JMTYgKSBdIDw8IDE2ICkgXgotCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkxID4+CSA4ICkgXSA8PCAgOCApIF4KLQkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMAkgICApIF0JCSApOwotCi0JUFVUX1VJTlQzMigJWDAsCW91dHB1dCwJIDAgKTsKLQlQVVRfVUlOVDMyKAlYMSwJb3V0cHV0LAkgNCApOwotCVBVVF9VSU5UMzIoCVgyLAlvdXRwdXQsCSA4ICk7Ci0JUFVUX1VJTlQzMigJWDMsCW91dHB1dCwJMTIgKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVNIQTEgZnVuY3Rpb24KLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECUhNQUNfU0hBMSgKLQlJTglVQ0hBUgkqdGV4dCwKLQlJTglVSU5UCXRleHRfbGVuLAotCUlOCVVDSEFSCSprZXksCi0JSU4JVUlOVAlrZXlfbGVuLAotCUlOCVVDSEFSCSpkaWdlc3QpCi17Ci0JU0hBX0NUWAljb250ZXh0OwotCVVDSEFSCWtfaXBhZFs2NV07IC8qIGlubmVyIHBhZGRpbmcgLSBrZXkgWE9SZCB3aXRoIGlwYWQJKi8KLQlVQ0hBUglrX29wYWRbNjVdOyAvKiBvdXRlciBwYWRkaW5nIC0ga2V5IFhPUmQgd2l0aCBvcGFkCSovCi0JSU5UCQlpOwotCi0JLy8gaWYga2V5IGlzIGxvbmdlcgl0aGFuIDY0CWJ5dGVzIHJlc2V0CWl0IHRvIGtleT1TSEExKGtleSkKLQlpZiAoa2V5X2xlbgk+IDY0KQotCXsKLQkJU0hBX0NUWAkJIHRjdHg7Ci0JCVNIQUluaXQoJnRjdHgpOwotCQlTSEFVcGRhdGUoJnRjdHgsIGtleSwga2V5X2xlbik7Ci0JCVNIQUZpbmFsKCZ0Y3R4LAlrZXkpOwotCQlrZXlfbGVuCT0gMjA7Ci0JfQotCU5kaXNaZXJvTWVtb3J5KGtfaXBhZCwgc2l6ZW9mKGtfaXBhZCkpOwotCU5kaXNaZXJvTWVtb3J5KGtfb3BhZCwgc2l6ZW9mKGtfb3BhZCkpOwotCU5kaXNNb3ZlTWVtb3J5KGtfaXBhZCwga2V5LAlrZXlfbGVuKTsKLQlOZGlzTW92ZU1lbW9yeShrX29wYWQsIGtleSwJa2V5X2xlbik7Ci0KLQkvLyBYT1Iga2V5IHdpdGgJaXBhZCBhbmQgb3BhZCB2YWx1ZXMKLQlmb3IJKGkgPSAwOwlpIDwJNjQ7CWkrKykKLQl7Ci0JCWtfaXBhZFtpXSBePSAweDM2OwotCQlrX29wYWRbaV0gXj0gMHg1YzsKLQl9Ci0KLQkvLyBwZXJmb3JtIGlubmVyIFNIQTEKLQlTSEFJbml0KCZjb250ZXh0KTsgCQkJCQkJLyogaW5pdCBjb250ZXh0IGZvciAxc3QgcGFzcyAqLwotCVNIQVVwZGF0ZSgmY29udGV4dCwJa19pcGFkLAk2NCk7CQkvKglzdGFydCB3aXRoIGlubmVyIHBhZCAqLwotCVNIQVVwZGF0ZSgmY29udGV4dCwJdGV4dCwgdGV4dF9sZW4pOwkvKgl0aGVuIHRleHQgb2YgZGF0YWdyYW0gKi8KLQlTSEFGaW5hbCgmY29udGV4dCwgZGlnZXN0KTsJCQkJLyogZmluaXNoIHVwIDFzdCBwYXNzICovCi0KLQkvL3BlcmZvcm0gb3V0ZXIJU0hBMQotCVNIQUluaXQoJmNvbnRleHQpOwkJCQkJLyogaW5pdCBjb250ZXh0IGZvciAybmQgcGFzcyAqLwotCVNIQVVwZGF0ZSgmY29udGV4dCwJa19vcGFkLAk2NCk7CS8qCXN0YXJ0IHdpdGggb3V0ZXIgcGFkICovCi0JU0hBVXBkYXRlKCZjb250ZXh0LAlkaWdlc3QsCTIwKTsJLyoJdGhlbiByZXN1bHRzIG9mCTFzdAloYXNoICovCi0JU0hBRmluYWwoJmNvbnRleHQsIGRpZ2VzdCk7CQkJLyogZmluaXNoIHVwIDJuZCBwYXNzICovCi0KLX0KLQotLyoKLSogRihQLCBTLCBjLCBpKSA9IFUxIHhvciBVMiB4b3IgLi4uIFVjCi0qIFUxID0gUFJGKFAsIFMgfHwgSW50KGkpKQotKiBVMiA9IFBSRihQLCBVMSkKLSogVWMgPSBQUkYoUCwgVWMtMSkKLSovCi0KLXZvaWQgRihjaGFyICpwYXNzd29yZCwgdW5zaWduZWQgY2hhciAqc3NpZCwgaW50IHNzaWRsZW5ndGgsIGludCBpdGVyYXRpb25zLCBpbnQgY291bnQsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCkKLXsKLSAgICB1bnNpZ25lZCBjaGFyIGRpZ2VzdFszNl0sIGRpZ2VzdDFbU0hBX0RJR0VTVF9MRU5dOwotICAgIGludCBpLCBqOwotCi0gICAgLyogVTEgPSBQUkYoUCwgUyB8fCBpbnQoaSkpICovCi0gICAgbWVtY3B5KGRpZ2VzdCwgc3NpZCwgc3NpZGxlbmd0aCk7Ci0gICAgZGlnZXN0W3NzaWRsZW5ndGhdID0gKHVuc2lnbmVkIGNoYXIpKChjb3VudD4+MjQpICYgMHhmZik7Ci0gICAgZGlnZXN0W3NzaWRsZW5ndGgrMV0gPSAodW5zaWduZWQgY2hhcikoKGNvdW50Pj4xNikgJiAweGZmKTsKLSAgICBkaWdlc3Rbc3NpZGxlbmd0aCsyXSA9ICh1bnNpZ25lZCBjaGFyKSgoY291bnQ+PjgpICYgMHhmZik7Ci0gICAgZGlnZXN0W3NzaWRsZW5ndGgrM10gPSAodW5zaWduZWQgY2hhcikoY291bnQgJiAweGZmKTsKLSAgICBITUFDX1NIQTEoZGlnZXN0LCBzc2lkbGVuZ3RoKzQsICh1bnNpZ25lZCBjaGFyKikgcGFzc3dvcmQsIChpbnQpIHN0cmxlbihwYXNzd29yZCksIGRpZ2VzdDEpOyAvLyBmb3IgV1BBIHVwZGF0ZQotCi0gICAgLyogb3V0cHV0ID0gVTEgKi8KLSAgICBtZW1jcHkob3V0cHV0LCBkaWdlc3QxLCBTSEFfRElHRVNUX0xFTik7Ci0KLSAgICBmb3IgKGkgPSAxOyBpIDwgaXRlcmF0aW9uczsgaSsrKQotICAgIHsKLSAgICAgICAgLyogVW4gPSBQUkYoUCwgVW4tMSkgKi8KLSAgICAgICAgSE1BQ19TSEExKGRpZ2VzdDEsIFNIQV9ESUdFU1RfTEVOLCAodW5zaWduZWQgY2hhciopIHBhc3N3b3JkLCAoaW50KSBzdHJsZW4ocGFzc3dvcmQpLCBkaWdlc3QpOyAvLyBmb3IgV1BBIHVwZGF0ZQotICAgICAgICBtZW1jcHkoZGlnZXN0MSwgZGlnZXN0LCBTSEFfRElHRVNUX0xFTik7Ci0KLSAgICAgICAgLyogb3V0cHV0ID0gb3V0cHV0IHhvciBVbiAqLwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgU0hBX0RJR0VTVF9MRU47IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0W2pdIF49IGRpZ2VzdFtqXTsKLSAgICAgICAgfQotICAgIH0KLX0KLS8qCi0qIHBhc3N3b3JkIC0gYXNjaWkgc3RyaW5nIHVwIHRvIDYzIGNoYXJhY3RlcnMgaW4gbGVuZ3RoCi0qIHNzaWQgLSBvY3RldCBzdHJpbmcgdXAgdG8gMzIgb2N0ZXRzCi0qIHNzaWRsZW5ndGggLSBsZW5ndGggb2Ygc3NpZCBpbiBvY3RldHMKLSogb3V0cHV0IG11c3QgYmUgNDAgb2N0ZXRzIGluIGxlbmd0aCBhbmQgb3V0cHV0cyAyNTYgYml0cyBvZiBrZXkKLSovCi1pbnQgUGFzc3dvcmRIYXNoKGNoYXIgKnBhc3N3b3JkLCB1bnNpZ25lZCBjaGFyICpzc2lkLCBpbnQgc3NpZGxlbmd0aCwgdW5zaWduZWQgY2hhciAqb3V0cHV0KQotewotICAgIGlmICgoc3RybGVuKHBhc3N3b3JkKSA+IDYzKSB8fCAoc3NpZGxlbmd0aCA+IDMyKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBGKHBhc3N3b3JkLCBzc2lkLCBzc2lkbGVuZ3RoLCA0MDk2LCAxLCBvdXRwdXQpOwotICAgIEYocGFzc3dvcmQsIHNzaWQsIHNzaWRsZW5ndGgsIDQwOTYsIDIsICZvdXRwdXRbU0hBX0RJR0VTVF9MRU5dKTsKLSAgICByZXR1cm4gMTsKLX0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9tbG1lLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9tbG1lLmMKaW5kZXggNjFhMmE0ZS4uOWZjMzRhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vbWxtZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL21sbWUuYwpAQCAtMzksNDEzICszOSwzMDkgQEAKICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKICNpbmNsdWRlIDxzdGRhcmcuaD4KIAotVUNIQVIJQ0lTQ09fT1VJW10gPSB7MHgwMCwgMHg0MCwgMHg5Nn07Cit1OCBDSVNDT19PVUlbXSA9IHsgMHgwMCwgMHg0MCwgMHg5NiB9OwogCi1VQ0hBUglXUEFfT1VJW10gPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwMX07Ci1VQ0hBUglSU05fT1VJW10gPSB7MHgwMCwgMHgwZiwgMHhhY307Ci1VQ0hBUiAgIFdNRV9JTkZPX0VMRU1bXSAgPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwMCwgMHgwMX07Ci1VQ0hBUiAgIFdNRV9QQVJNX0VMRU1bXSA9IHsweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAxLCAweDAxfTsKLVVDSEFSCUNjeDJRb3NJbmZvW10gPSB7MHgwMCwgMHg0MCwgMHg5NiwgMHgwNH07Ci1VQ0hBUiAgIFJBTElOS19PVUlbXSAgPSB7MHgwMCwgMHgwYywgMHg0M307Ci1VQ0hBUiAgIEJST0FEQ09NX09VSVtdICA9IHsweDAwLCAweDkwLCAweDRjfTsKLVVDSEFSICAgV1BTX09VSVtdID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDR9OwotVUNIQVIJUFJFX05fSFRfT1VJW10JPSB7MHgwMCwgMHg5MCwgMHg0Y307Cit1OCBXUEFfT1VJW10gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEgfTsKK3U4IFJTTl9PVUlbXSA9IHsgMHgwMCwgMHgwZiwgMHhhYyB9OwordTggV01FX0lORk9fRUxFTVtdID0geyAweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAwLCAweDAxIH07Cit1OCBXTUVfUEFSTV9FTEVNW10gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDEsIDB4MDEgfTsKK3U4IENjeDJRb3NJbmZvW10gPSB7IDB4MDAsIDB4NDAsIDB4OTYsIDB4MDQgfTsKK3U4IFJBTElOS19PVUlbXSA9IHsgMHgwMCwgMHgwYywgMHg0MyB9OwordTggQlJPQURDT01fT1VJW10gPSB7IDB4MDAsIDB4OTAsIDB4NGMgfTsKK3U4IFdQU19PVUlbXSA9IHsgMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCB9OwordTggUFJFX05fSFRfT1VJW10gPSB7IDB4MDAsIDB4OTAsIDB4NGMgfTsKIAotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlW10gPSB7Ci0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgxMSwgMHgwMCwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MDAsICAwLCA0MCwgMTAxLAotICAgIDB4MDEsIDB4MDAsICAxLCA0MCwgNTAsCi0gICAgMHgwMiwgMHgwMCwgIDIsIDM1LCA0NSwKLSAgICAweDAzLCAweDAwLCAgMywgMjAsIDQ1LAotICAgIDB4MDQsIDB4MjEsICAwLCAzMCwgNTAsCi0gICAgMHgwNSwgMHgyMSwgIDEsIDIwLCA1MCwKLSAgICAweDA2LCAweDIxLCAgMiwgMjAsIDUwLAotICAgIDB4MDcsIDB4MjEsICAzLCAxNSwgNTAsCi0gICAgMHgwOCwgMHgyMSwgIDQsIDE1LCAzMCwKLSAgICAweDA5LCAweDIxLCAgNSwgMTAsIDI1LAotICAgIDB4MGEsIDB4MjEsICA2LCAgOCwgMjUsCi0gICAgMHgwYiwgMHgyMSwgIDcsICA4LCAyNSwKLSAgICAweDBjLCAweDIwLCAxMiwgIDE1LCAzMCwKLSAgICAweDBkLCAweDIwLCAxMywgIDgsIDIwLAotICAgIDB4MGUsIDB4MjAsIDE0LCAgOCwgMjAsCi0gICAgMHgwZiwgMHgyMCwgMTUsICA4LCAyNSwKLSAgICAweDEwLCAweDIyLCAxNSwgIDgsIDI1LAotICAgIDB4MTEsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxMiwgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDEzLCAweDAwLCAgMCwgIDAsICAwLAotICAgIDB4MTQsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxNSwgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDE2LCAweDAwLCAgMCwgIDAsICAwLAotICAgIDB4MTcsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxOCwgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDE5LCAweDAwLCAgMCwgIDAsICAwLAotICAgIDB4MWEsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxYiwgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDFjLCAweDAwLCAgMCwgIDAsICAwLAotICAgIDB4MWQsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxZSwgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDFmLCAweDAwLCAgMCwgIDAsICAwLAordTggUmF0ZVN3aXRjaFRhYmxlW10gPSB7CisvKiBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24gICAgICAgICAgICAgLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikgKi8KKwkweDExLCAweDAwLCAwLCAwLCAwLAkvKiBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbiAqLworCTB4MDAsIDB4MDAsIDAsIDQwLCAxMDEsCisJMHgwMSwgMHgwMCwgMSwgNDAsIDUwLAorCTB4MDIsIDB4MDAsIDIsIDM1LCA0NSwKKwkweDAzLCAweDAwLCAzLCAyMCwgNDUsCisJMHgwNCwgMHgyMSwgMCwgMzAsIDUwLAorCTB4MDUsIDB4MjEsIDEsIDIwLCA1MCwKKwkweDA2LCAweDIxLCAyLCAyMCwgNTAsCisJMHgwNywgMHgyMSwgMywgMTUsIDUwLAorCTB4MDgsIDB4MjEsIDQsIDE1LCAzMCwKKwkweDA5LCAweDIxLCA1LCAxMCwgMjUsCisJMHgwYSwgMHgyMSwgNiwgOCwgMjUsCisJMHgwYiwgMHgyMSwgNywgOCwgMjUsCisJMHgwYywgMHgyMCwgMTIsIDE1LCAzMCwKKwkweDBkLCAweDIwLCAxMywgOCwgMjAsCisJMHgwZSwgMHgyMCwgMTQsIDgsIDIwLAorCTB4MGYsIDB4MjAsIDE1LCA4LCAyNSwKKwkweDEwLCAweDIyLCAxNSwgOCwgMjUsCisJMHgxMSwgMHgwMCwgMCwgMCwgMCwKKwkweDEyLCAweDAwLCAwLCAwLCAwLAorCTB4MTMsIDB4MDAsIDAsIDAsIDAsCisJMHgxNCwgMHgwMCwgMCwgMCwgMCwKKwkweDE1LCAweDAwLCAwLCAwLCAwLAorCTB4MTYsIDB4MDAsIDAsIDAsIDAsCisJMHgxNywgMHgwMCwgMCwgMCwgMCwKKwkweDE4LCAweDAwLCAwLCAwLCAwLAorCTB4MTksIDB4MDAsIDAsIDAsIDAsCisJMHgxYSwgMHgwMCwgMCwgMCwgMCwKKwkweDFiLCAweDAwLCAwLCAwLCAwLAorCTB4MWMsIDB4MDAsIDAsIDAsIDAsCisJMHgxZCwgMHgwMCwgMCwgMCwgMCwKKwkweDFlLCAweDAwLCAwLCAwLCAwLAorCTB4MWYsIDB4MDAsIDAsIDAsIDAsCiB9OwogCi1VQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUJbXSA9IHsKLS8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKLSAgICAweDA0LCAweDAzLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCi0gICAgMHgwMCwgMHgwMCwgIDAsIDQwLCAxMDEsCi0gICAgMHgwMSwgMHgwMCwgIDEsIDQwLCA1MCwKLSAgICAweDAyLCAweDAwLCAgMiwgMzUsIDQ1LAotICAgIDB4MDMsIDB4MDAsICAzLCAyMCwgNDUsCit1OCBSYXRlU3dpdGNoVGFibGUxMUJbXSA9IHsKKy8qIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93biAgICAgICAgICAgICAvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKSAqLworCTB4MDQsIDB4MDMsIDAsIDAsIDAsCS8qIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uICovCisJMHgwMCwgMHgwMCwgMCwgNDAsIDEwMSwKKwkweDAxLCAweDAwLCAxLCA0MCwgNTAsCisJMHgwMiwgMHgwMCwgMiwgMzUsIDQ1LAorCTB4MDMsIDB4MDAsIDMsIDIwLCA0NSwKIH07CiAKLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExQkdbXSA9IHsKLS8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKLSAgICAweDBhLCAweDAwLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCi0gICAgMHgwMCwgMHgwMCwgIDAsIDQwLCAxMDEsCi0gICAgMHgwMSwgMHgwMCwgIDEsIDQwLCA1MCwKLSAgICAweDAyLCAweDAwLCAgMiwgMzUsIDQ1LAotICAgIDB4MDMsIDB4MDAsICAzLCAyMCwgNDUsCi0gICAgMHgwNCwgMHgxMCwgIDIsIDIwLCAzNSwKLSAgICAweDA1LCAweDEwLCAgMywgMTYsIDM1LAotICAgIDB4MDYsIDB4MTAsICA0LCAxMCwgMjUsCi0gICAgMHgwNywgMHgxMCwgIDUsIDE2LCAyNSwKLSAgICAweDA4LCAweDEwLCAgNiwgMTAsIDI1LAotICAgIDB4MDksIDB4MTAsICA3LCAxMCwgMTMsCit1OCBSYXRlU3dpdGNoVGFibGUxMUJHW10gPSB7CisvKiBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24gICAgICAgICAgICAgLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikgKi8KKwkweDBhLCAweDAwLCAwLCAwLCAwLAkvKiBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbiAqLworCTB4MDAsIDB4MDAsIDAsIDQwLCAxMDEsCisJMHgwMSwgMHgwMCwgMSwgNDAsIDUwLAorCTB4MDIsIDB4MDAsIDIsIDM1LCA0NSwKKwkweDAzLCAweDAwLCAzLCAyMCwgNDUsCisJMHgwNCwgMHgxMCwgMiwgMjAsIDM1LAorCTB4MDUsIDB4MTAsIDMsIDE2LCAzNSwKKwkweDA2LCAweDEwLCA0LCAxMCwgMjUsCisJMHgwNywgMHgxMCwgNSwgMTYsIDI1LAorCTB4MDgsIDB4MTAsIDYsIDEwLCAyNSwKKwkweDA5LCAweDEwLCA3LCAxMCwgMTMsCiB9OwogCi1VQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUdbXSA9IHsKLS8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKLSAgICAweDA4LCAweDAwLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCi0gICAgMHgwMCwgMHgxMCwgIDAsIDIwLCAxMDEsCi0gICAgMHgwMSwgMHgxMCwgIDEsIDIwLCAzNSwKLSAgICAweDAyLCAweDEwLCAgMiwgMjAsIDM1LAotICAgIDB4MDMsIDB4MTAsICAzLCAxNiwgMzUsCi0gICAgMHgwNCwgMHgxMCwgIDQsIDEwLCAyNSwKLSAgICAweDA1LCAweDEwLCAgNSwgMTYsIDI1LAotICAgIDB4MDYsIDB4MTAsICA2LCAxMCwgMjUsCi0gICAgMHgwNywgMHgxMCwgIDcsIDEwLCAxMywKK3U4IFJhdGVTd2l0Y2hUYWJsZTExR1tdID0geworLyogSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duICAgICAgICAgICAgIC8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpICovCisJMHgwOCwgMHgwMCwgMCwgMCwgMCwJLyogSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24gKi8KKwkweDAwLCAweDEwLCAwLCAyMCwgMTAxLAorCTB4MDEsIDB4MTAsIDEsIDIwLCAzNSwKKwkweDAyLCAweDEwLCAyLCAyMCwgMzUsCisJMHgwMywgMHgxMCwgMywgMTYsIDM1LAorCTB4MDQsIDB4MTAsIDQsIDEwLCAyNSwKKwkweDA1LCAweDEwLCA1LCAxNiwgMjUsCisJMHgwNiwgMHgxMCwgNiwgMTAsIDI1LAorCTB4MDcsIDB4MTAsIDcsIDEwLCAxMywKIH07CiAKLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExTjFTW10gPSB7Ci0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwOSwgMHgwMCwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MjEsICAwLCAzMCwgMTAxLAotICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCi0gICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKLSAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAotICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCi0gICAgMHgwNSwgMHgyMSwgIDUsIDEwLCAyNSwKLSAgICAweDA2LCAweDIxLCAgNiwgIDgsIDE0LAotICAgIDB4MDcsIDB4MjEsICA3LCAgOCwgMTQsCi0gICAgMHgwOCwgMHgyMywgIDcsICA4LCAxNCwKK3U4IFJhdGVTd2l0Y2hUYWJsZTExTjFTW10gPSB7CisvKiBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24gICAgICAgICAgICAgLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikgKi8KKwkweDBjLCAweDBhLCAwLCAwLCAwLAkvKiBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbiAqLworCTB4MDAsIDB4MDAsIDAsIDQwLCAxMDEsCisJMHgwMSwgMHgwMCwgMSwgNDAsIDUwLAorCTB4MDIsIDB4MDAsIDIsIDI1LCA0NSwKKwkweDAzLCAweDIxLCAwLCAyMCwgMzUsCisJMHgwNCwgMHgyMSwgMSwgMjAsIDM1LAorCTB4MDUsIDB4MjEsIDIsIDIwLCAzNSwKKwkweDA2LCAweDIxLCAzLCAxNSwgMzUsCisJMHgwNywgMHgyMSwgNCwgMTUsIDMwLAorCTB4MDgsIDB4MjEsIDUsIDEwLCAyNSwKKwkweDA5LCAweDIxLCA2LCA4LCAxNCwKKwkweDBhLCAweDIxLCA3LCA4LCAxNCwKKwkweDBiLCAweDIzLCA3LCA4LCAxNCwKIH07CiAKLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExTjJTW10gPSB7Ci0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwYSwgMHgwMCwgIDAsICAwLCAgMCwgICAgICAvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MjEsICAwLCAzMCwgMTAxLAotICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCi0gICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKLSAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAotICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCi0gICAgMHgwNSwgMHgyMCwgMTIsICAxNSwgMzAsCi0gICAgMHgwNiwgMHgyMCwgMTMsICA4LCAyMCwKLSAgICAweDA3LCAweDIwLCAxNCwgIDgsIDIwLAotICAgIDB4MDgsIDB4MjAsIDE1LCAgOCwgMjUsCi0gICAgMHgwOSwgMHgyMiwgMTUsICA4LCAyNSwKK3U4IFJhdGVTd2l0Y2hUYWJsZTExTjJTW10gPSB7CisvKiBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24gICAgICAgICAgICAgLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikgKi8KKwkweDBlLCAweDBjLCAwLCAwLCAwLAkvKiBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbiAqLworCTB4MDAsIDB4MDAsIDAsIDQwLCAxMDEsCisJMHgwMSwgMHgwMCwgMSwgNDAsIDUwLAorCTB4MDIsIDB4MDAsIDIsIDI1LCA0NSwKKwkweDAzLCAweDIxLCAwLCAyMCwgMzUsCisJMHgwNCwgMHgyMSwgMSwgMjAsIDM1LAorCTB4MDUsIDB4MjEsIDIsIDIwLCAzNSwKKwkweDA2LCAweDIxLCAzLCAxNSwgMzUsCisJMHgwNywgMHgyMSwgNCwgMTUsIDMwLAorCTB4MDgsIDB4MjAsIDExLCAxNSwgMzAsCisJMHgwOSwgMHgyMCwgMTIsIDE1LCAzMCwKKwkweDBhLCAweDIwLCAxMywgOCwgMjAsCisJMHgwYiwgMHgyMCwgMTQsIDgsIDIwLAorCTB4MGMsIDB4MjAsIDE1LCA4LCAyNSwKKwkweDBkLCAweDIyLCAxNSwgOCwgMTUsCiB9OwogCi1VQ0hBUiBSYXRlU3dpdGNoVGFibGUxMU4zU1tdID0gewotLy8gSXRlbSBOby4JTW9kZQlDdXJyLU1DUwlUcmFpblVwCVRyYWluRG93bgkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQotICAgIDB4MGEsIDB4MDAsICAwLCAgMCwgIDAsICAgICAgLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KLSAgICAweDAwLCAweDIxLCAgMCwgMzAsIDEwMSwKLSAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAotICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCi0gICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKLSAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAotICAgIDB4MDUsIDB4MjAsIDEyLCAgMTUsIDMwLAotICAgIDB4MDYsIDB4MjAsIDEzLCAgOCwgMjAsCi0gICAgMHgwNywgMHgyMCwgMTQsICA4LCAyMCwKLSAgICAweDA4LCAweDIwLCAxNSwgIDgsIDI1LAotICAgIDB4MDksIDB4MjIsIDE1LCAgOCwgMjUsCit1OCBSYXRlU3dpdGNoVGFibGUxMU4zU1tdID0geworLyogSXRlbSBOby4gICAgIE1vZGUgICAgQ3Vyci1NQ1MgICAgICAgIFRyYWluVXAgVHJhaW5Eb3duICAgICAgIC8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpICovCisJMHgwYiwgMHgwMCwgMCwgMCwgMCwJLyogMHgwYSwgMHgwMCwgIDAsICAwLCAgMCwgICAgICAvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbiAqLworCTB4MDAsIDB4MjEsIDAsIDMwLCAxMDEsCisJMHgwMSwgMHgyMSwgMSwgMjAsIDUwLAorCTB4MDIsIDB4MjEsIDIsIDIwLCA1MCwKKwkweDAzLCAweDIxLCAzLCAxNSwgNTAsCisJMHgwNCwgMHgyMSwgNCwgMTUsIDMwLAorCTB4MDUsIDB4MjAsIDExLCAxNSwgMzAsCS8qIFJlcXVpcmVkIGJ5IFN5c3RlbS1BbGFuIEAgMjAwODA4MTIgKi8KKwkweDA2LCAweDIwLCAxMiwgMTUsIDMwLAkvKiAweDA1LCAweDIwLCAxMiwgMTUsIDMwLCAqLworCTB4MDcsIDB4MjAsIDEzLCA4LCAyMCwJLyogMHgwNiwgMHgyMCwgMTMsICA4LCAyMCwgKi8KKwkweDA4LCAweDIwLCAxNCwgOCwgMjAsCS8qIDB4MDcsIDB4MjAsIDE0LCAgOCwgMjAsICovCisJMHgwOSwgMHgyMCwgMTUsIDgsIDI1LAkvKiAweDA4LCAweDIwLCAxNSwgIDgsIDI1LCAqLworCTB4MGEsIDB4MjIsIDE1LCA4LCAyNSwJLyogMHgwOSwgMHgyMiwgMTUsICA4LCAyNSwgKi8KIH07CiAKLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbXSA9IHsKLS8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKLSAgICAweDBiLCAweDA5LCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCi0gICAgMHgwMCwgMHgyMSwgIDAsIDMwLCAxMDEsCi0gICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKLSAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAotICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCi0gICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKLSAgICAweDA1LCAweDIxLCAgNSwgMTUsIDMwLAotICAgIDB4MDYsIDB4MjAsIDEyLCAgMTUsIDMwLAotICAgIDB4MDcsIDB4MjAsIDEzLCAgOCwgMjAsCi0gICAgMHgwOCwgMHgyMCwgMTQsICA4LCAyMCwKLSAgICAweDA5LCAweDIwLCAxNSwgIDgsIDI1LAotICAgIDB4MGEsIDB4MjIsIDE1LCAgOCwgMjUsCit1OCBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kW10gPSB7CisvKiBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24gICAgICAgICAgICAgLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikgKi8KKwkweDBiLCAweDA5LCAwLCAwLCAwLAkvKiBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbiAqLworCTB4MDAsIDB4MjEsIDAsIDMwLCAxMDEsCisJMHgwMSwgMHgyMSwgMSwgMjAsIDUwLAorCTB4MDIsIDB4MjEsIDIsIDIwLCA1MCwKKwkweDAzLCAweDIxLCAzLCAxNSwgNTAsCisJMHgwNCwgMHgyMSwgNCwgMTUsIDMwLAorCTB4MDUsIDB4MjEsIDUsIDE1LCAzMCwKKwkweDA2LCAweDIwLCAxMiwgMTUsIDMwLAorCTB4MDcsIDB4MjAsIDEzLCA4LCAyMCwKKwkweDA4LCAweDIwLCAxNCwgOCwgMjAsCisJMHgwOSwgMHgyMCwgMTUsIDgsIDI1LAorCTB4MGEsIDB4MjIsIDE1LCA4LCAyNSwKIH07CiAKLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExTjNTRm9yQUJhbmRbXSA9IHsgLy8gMyozCi0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwYiwgMHgwOSwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MjEsICAwLCAzMCwgMTAxLAotICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCi0gICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKLSAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAotICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCi0gICAgMHgwNSwgMHgyMSwgIDUsIDE1LCAzMCwKLSAgICAweDA2LCAweDIwLCAxMiwgIDE1LCAzMCwKLSAgICAweDA3LCAweDIwLCAxMywgIDgsIDIwLAotICAgIDB4MDgsIDB4MjAsIDE0LCAgOCwgMjAsCi0gICAgMHgwOSwgMHgyMCwgMTUsICA4LCAyNSwKLSAgICAweDBhLCAweDIyLCAxNSwgIDgsIDI1LAordTggUmF0ZVN3aXRjaFRhYmxlMTFOM1NGb3JBQmFuZFtdID0gewkvKiAzKjMgKi8KKy8qIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93biAgICAgICAgICAgICAvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKSAqLworCTB4MGIsIDB4MDksIDAsIDAsIDAsCS8qIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uICovCisJMHgwMCwgMHgyMSwgMCwgMzAsIDEwMSwKKwkweDAxLCAweDIxLCAxLCAyMCwgNTAsCisJMHgwMiwgMHgyMSwgMiwgMjAsIDUwLAorCTB4MDMsIDB4MjEsIDMsIDE1LCA1MCwKKwkweDA0LCAweDIxLCA0LCAxNSwgMzAsCisJMHgwNSwgMHgyMSwgNSwgMTUsIDMwLAorCTB4MDYsIDB4MjAsIDEyLCAxNSwgMzAsCisJMHgwNywgMHgyMCwgMTMsIDgsIDIwLAorCTB4MDgsIDB4MjAsIDE0LCA4LCAyMCwKKwkweDA5LCAweDIwLCAxNSwgOCwgMjUsCisJMHgwYSwgMHgyMiwgMTUsIDgsIDI1LAogfTsKIAotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04xU1tdID0gewotLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQotICAgIDB4MGQsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KLSAgICAweDAwLCAweDAwLCAgMCwgNDAsIDEwMSwKLSAgICAweDAxLCAweDAwLCAgMSwgNDAsIDUwLAotICAgIDB4MDIsIDB4MDAsICAyLCAzNSwgNDUsCi0gICAgMHgwMywgMHgwMCwgIDMsIDIwLCA0NSwKLSAgICAweDA0LCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCi0gICAgMHgwNSwgMHgyMSwgIDEsIDIwLCA1MCwKLSAgICAweDA2LCAweDIxLCAgMiwgMjAsIDUwLAotICAgIDB4MDcsIDB4MjEsICAzLCAxNSwgNTAsCi0gICAgMHgwOCwgMHgyMSwgIDQsIDE1LCAzMCwKLSAgICAweDA5LCAweDIxLCAgNSwgMTAsIDI1LAotICAgIDB4MGEsIDB4MjEsICA2LCAgOCwgMTQsCi0gICAgMHgwYiwgMHgyMSwgIDcsICA4LCAxNCwKLQkweDBjLCAweDIzLCAgNywgIDgsIDE0LAordTggUmF0ZVN3aXRjaFRhYmxlMTFCR04xU1tdID0geworLyogSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duICAgICAgICAgICAgIC8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpICovCisJMHgwYywgMHgwYSwgMCwgMCwgMCwJLyogSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24gKi8KKwkweDAwLCAweDAwLCAwLCA0MCwgMTAxLAorCTB4MDEsIDB4MDAsIDEsIDQwLCA1MCwKKwkweDAyLCAweDAwLCAyLCAyNSwgNDUsCisJMHgwMywgMHgyMSwgMCwgMjAsIDM1LAorCTB4MDQsIDB4MjEsIDEsIDIwLCAzNSwKKwkweDA1LCAweDIxLCAyLCAyMCwgMzUsCisJMHgwNiwgMHgyMSwgMywgMTUsIDM1LAorCTB4MDcsIDB4MjEsIDQsIDE1LCAzMCwKKwkweDA4LCAweDIxLCA1LCAxMCwgMjUsCisJMHgwOSwgMHgyMSwgNiwgOCwgMTQsCisJMHgwYSwgMHgyMSwgNywgOCwgMTQsCisJMHgwYiwgMHgyMywgNywgOCwgMTQsCiB9OwogCi1VQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUJHTjJTW10gPSB7Ci0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwYSwgMHgwMCwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MjEsICAwLCAzMCwxMDEsCS8vNTAKLSAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAotICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCi0gICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKLSAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAotICAgIDB4MDUsIDB4MjAsIDEyLCAxNSwgMzAsCi0gICAgMHgwNiwgMHgyMCwgMTMsICA4LCAyMCwKLSAgICAweDA3LCAweDIwLCAxNCwgIDgsIDIwLAotICAgIDB4MDgsIDB4MjAsIDE1LCAgOCwgMjUsCi0gICAgMHgwOSwgMHgyMiwgMTUsICA4LCAyNSwKK3U4IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNbXSA9IHsKKy8qIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93biAgICAgICAgICAgICAvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKSAqLworCTB4MGUsIDB4MGMsIDAsIDAsIDAsCS8qIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uICovCisJMHgwMCwgMHgwMCwgMCwgNDAsIDEwMSwKKwkweDAxLCAweDAwLCAxLCA0MCwgNTAsCisJMHgwMiwgMHgwMCwgMiwgMjUsIDQ1LAorCTB4MDMsIDB4MjEsIDAsIDIwLCAzNSwKKwkweDA0LCAweDIxLCAxLCAyMCwgMzUsCisJMHgwNSwgMHgyMSwgMiwgMjAsIDM1LAorCTB4MDYsIDB4MjEsIDMsIDE1LCAzNSwKKwkweDA3LCAweDIxLCA0LCAxNSwgMzAsCisJMHgwOCwgMHgyMCwgMTEsIDE1LCAzMCwKKwkweDA5LCAweDIwLCAxMiwgMTUsIDMwLAorCTB4MGEsIDB4MjAsIDEzLCA4LCAyMCwKKwkweDBiLCAweDIwLCAxNCwgOCwgMjAsCisJMHgwYywgMHgyMCwgMTUsIDgsIDI1LAorCTB4MGQsIDB4MjIsIDE1LCA4LCAxNSwKIH07CiAKLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExQkdOM1NbXSA9IHsgLy8gMyozCi0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwYSwgMHgwMCwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MjEsICAwLCAzMCwxMDEsCS8vNTAKLSAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAotICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCi0gICAgMHgwMywgMHgyMSwgIDMsIDIwLCA1MCwKLSAgICAweDA0LCAweDIxLCAgNCwgMTUsIDUwLAotICAgIDB4MDUsIDB4MjAsIDIwLCAxNSwgMzAsCi0gICAgMHgwNiwgMHgyMCwgMjEsICA4LCAyMCwKLSAgICAweDA3LCAweDIwLCAyMiwgIDgsIDIwLAotICAgIDB4MDgsIDB4MjAsIDIzLCAgOCwgMjUsCi0gICAgMHgwOSwgMHgyMiwgMjMsICA4LCAyNSwKK3U4IFJhdGVTd2l0Y2hUYWJsZTExQkdOM1NbXSA9IHsJLyogMyozICovCisvKiBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24gICAgICAgICAgICAgLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikgKi8KKwkweDBhLCAweDAwLCAwLCAwLCAwLAkvKiBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbiAqLworCTB4MDAsIDB4MjEsIDAsIDMwLCAxMDEsCS8qNTAgKi8KKwkweDAxLCAweDIxLCAxLCAyMCwgNTAsCisJMHgwMiwgMHgyMSwgMiwgMjAsIDUwLAorCTB4MDMsIDB4MjEsIDMsIDIwLCA1MCwKKwkweDA0LCAweDIxLCA0LCAxNSwgNTAsCisJMHgwNSwgMHgyMCwgMjAsIDE1LCAzMCwKKwkweDA2LCAweDIwLCAyMSwgOCwgMjAsCisJMHgwNywgMHgyMCwgMjIsIDgsIDIwLAorCTB4MDgsIDB4MjAsIDIzLCA4LCAyNSwKKwkweDA5LCAweDIyLCAyMywgOCwgMjUsCiB9OwogCi1VQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmRbXSA9IHsKLS8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKLSAgICAweDBiLCAweDA5LCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCi0gICAgMHgwMCwgMHgyMSwgIDAsIDMwLDEwMSwJLy81MAotICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCi0gICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKLSAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAotICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCi0gICAgMHgwNSwgMHgyMSwgIDUsIDE1LCAzMCwKLSAgICAweDA2LCAweDIwLCAxMiwgMTUsIDMwLAotICAgIDB4MDcsIDB4MjAsIDEzLCAgOCwgMjAsCi0gICAgMHgwOCwgMHgyMCwgMTQsICA4LCAyMCwKLSAgICAweDA5LCAweDIwLCAxNSwgIDgsIDI1LAotICAgIDB4MGEsIDB4MjIsIDE1LCAgOCwgMjUsCit1OCBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmRbXSA9IHsKKy8qIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93biAgICAgICAgICAgICAvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKSAqLworCTB4MGIsIDB4MDksIDAsIDAsIDAsCS8qIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uICovCisJMHgwMCwgMHgyMSwgMCwgMzAsIDEwMSwJLyo1MCAqLworCTB4MDEsIDB4MjEsIDEsIDIwLCA1MCwKKwkweDAyLCAweDIxLCAyLCAyMCwgNTAsCisJMHgwMywgMHgyMSwgMywgMTUsIDUwLAorCTB4MDQsIDB4MjEsIDQsIDE1LCAzMCwKKwkweDA1LCAweDIxLCA1LCAxNSwgMzAsCisJMHgwNiwgMHgyMCwgMTIsIDE1LCAzMCwKKwkweDA3LCAweDIwLCAxMywgOCwgMjAsCisJMHgwOCwgMHgyMCwgMTQsIDgsIDIwLAorCTB4MDksIDB4MjAsIDE1LCA4LCAyNSwKKwkweDBhLCAweDIyLCAxNSwgOCwgMjUsCiB9OwogCi1VQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUJHTjNTRm9yQUJhbmRbXSA9IHsgLy8gMyozCi0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwYywgMHgwOSwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MjEsICAwLCAzMCwxMDEsCS8vNTAKLSAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAotICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCi0gICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKLSAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAotICAgIDB4MDUsIDB4MjEsICA1LCAxNSwgMzAsCi0gICAgMHgwNiwgMHgyMSwgMTIsIDE1LCAzMCwKLSAgICAweDA3LCAweDIwLCAyMCwgMTUsIDMwLAotICAgIDB4MDgsIDB4MjAsIDIxLCAgOCwgMjAsCi0gICAgMHgwOSwgMHgyMCwgMjIsICA4LCAyMCwKLSAgICAweDBhLCAweDIwLCAyMywgIDgsIDI1LAotICAgIDB4MGIsIDB4MjIsIDIzLCAgOCwgMjUsCit1OCBSYXRlU3dpdGNoVGFibGUxMUJHTjNTRm9yQUJhbmRbXSA9IHsJLyogMyozICovCisvKiBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24gICAgICAgICAgICAgLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikgKi8KKwkweDBjLCAweDA5LCAwLCAwLCAwLAkvKiBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbiAqLworCTB4MDAsIDB4MjEsIDAsIDMwLCAxMDEsCS8qNTAgKi8KKwkweDAxLCAweDIxLCAxLCAyMCwgNTAsCisJMHgwMiwgMHgyMSwgMiwgMjAsIDUwLAorCTB4MDMsIDB4MjEsIDMsIDE1LCA1MCwKKwkweDA0LCAweDIxLCA0LCAxNSwgMzAsCisJMHgwNSwgMHgyMSwgNSwgMTUsIDMwLAorCTB4MDYsIDB4MjEsIDEyLCAxNSwgMzAsCisJMHgwNywgMHgyMCwgMjAsIDE1LCAzMCwKKwkweDA4LCAweDIwLCAyMSwgOCwgMjAsCisJMHgwOSwgMHgyMCwgMjIsIDgsIDIwLAorCTB4MGEsIDB4MjAsIDIzLCA4LCAyNSwKKwkweDBiLCAweDIyLCAyMywgOCwgMjUsCiB9OwogCi1QVUNIQVIgUmVhc29uU3RyaW5nW10gPSB7Ci0JLyogMCAgKi8JICJSZXNlcnZlZCIsCi0JLyogMSAgKi8JICJVbnNwZWNpZmllZCBSZWFzb24iLAotCS8qIDIgICovCSAiUHJldmlvdXMgQXV0aCBubyBsb25nZXIgdmFsaWQiLAotCS8qIDMgICovCSAiU1RBIGlzIGxlYXZpbmcgLyBoYXMgbGVmdCIsCi0JLyogNCAgKi8JICJESVMtQVNTT0MgZHVlIHRvIGluYWN0aXZpdHkiLAotCS8qIDUgICovCSAiQVAgdW5hYmxlIHRvIGhhbmxlIGFsbCBhc3NvY2lhdGlvbnMiLAotCS8qIDYgICovCSAiY2xhc3MgMiBlcnJvciIsCi0JLyogNyAgKi8JICJjbGFzcyAzIGVycm9yIiwKLQkvKiA4ICAqLwkgIlNUQSBpcyBsZWF2aW5nIC8gaGFzIGxlZnQiLAotCS8qIDkgICovCSAicmVxdWlyZSBhdXRoIGJlZm9yZSBhc3NvYy9yZS1hc3NvYyIsCi0JLyogMTAgKi8JICJSZXNlcnZlZCIsCi0JLyogMTEgKi8JICJSZXNlcnZlZCIsCi0JLyogMTIgKi8JICJSZXNlcnZlZCIsCi0JLyogMTMgKi8JICJpbnZhbGlkIElFIiwKLQkvKiAxNCAqLwkgIk1JQyBlcnJvciIsCi0JLyogMTUgKi8JICI0LXdheSBoYW5kc2hha2UgdGltZW91dCIsCi0JLyogMTYgKi8JICIyLXdheSAoZ3JvdXAga2V5KSBoYW5kc2hha2UgdGltZW91dCIsCi0JLyogMTcgKi8JICI0LXdheSBoYW5kc2hha2UgSUUgZGlmZiBhbW9uZyBBc3Nvc1JlcS9Sc3AvQmVhY29uIiwKLQkvKiAxOCAqLworZXh0ZXJuIHU4IE9mZG1SYXRlVG9SeHdpTUNTW107CisvKiBzaW5jZSBSVDYxIGhhcyBiZXR0ZXIgUlggc2Vuc2liaWxpdHksIHdlIGhhdmUgdG8gbGltaXQgVFggQUNLIHJhdGUgbm90IHRvIGV4Y2VlZCBvdXIgbm9ybWFsIGRhdGEgVFggcmF0ZS4gKi8KKy8qIG90aGVyd2lzZSB0aGUgV0xBTiBwZWVyIG1heSBub3QgYmUgYWJsZSB0byByZWNlaXZlIHRoZSBBQ0sgdGh1cyBkb3duZ3JhZGUgaXRzIGRhdGEgVFggcmF0ZSAqLwordW5zaWduZWQgbG9uZyBCYXNpY1JhdGVNYXNrWzEyXSA9CisgICAgeyAweGZmZmZmMDAxIC8qIDEtTWJwcyAqLyAsIDB4ZmZmZmYwMDMgLyogMiBNYnBzICovICwgMHhmZmZmZjAwNyAvKiA1LjUgKi8gLAorMHhmZmZmZjAwZiAvKiAxMSAqLyAsCisJMHhmZmZmZjAxZiAvKiA2ICovICwgMHhmZmZmZjAzZiAvKiA5ICovICwgMHhmZmZmZjA3ZiAvKiAxMiAqLyAsCisJICAgIDB4ZmZmZmYwZmYgLyogMTggKi8gLAorCTB4ZmZmZmYxZmYgLyogMjQgKi8gLCAweGZmZmZmM2ZmIC8qIDM2ICovICwgMHhmZmZmZjdmZiAvKiA0OCAqLyAsCisJICAgIDB4ZmZmZmZmZmYgLyogNTQgKi8KIH07CiAKLWV4dGVybiBVQ0hBUgkgT2ZkbVJhdGVUb1J4d2lNQ1NbXTsKLS8vIHNpbmNlIFJUNjEgaGFzIGJldHRlciBSWCBzZW5zaWJpbGl0eSwgd2UgaGF2ZSB0byBsaW1pdCBUWCBBQ0sgcmF0ZSBub3QgdG8gZXhjZWVkIG91ciBub3JtYWwgZGF0YSBUWCByYXRlLgotLy8gb3RoZXJ3aXNlIHRoZSBXTEFOIHBlZXIgbWF5IG5vdCBiZSBhYmxlIHRvIHJlY2VpdmUgdGhlIEFDSyB0aHVzIGRvd25ncmFkZSBpdHMgZGF0YSBUWCByYXRlCi1VTE9ORyBCYXNpY1JhdGVNYXNrWzEyXQkJCQk9IHsweGZmZmZmMDAxIC8qIDEtTWJwcyAqLywgMHhmZmZmZjAwMyAvKiAyIE1icHMgKi8sIDB4ZmZmZmYwMDcgLyogNS41ICovLCAweGZmZmZmMDBmIC8qIDExICovLAotCQkJCQkJCQkJICAweGZmZmZmMDFmIC8qIDYgKi8JICwgMHhmZmZmZjAzZiAvKiA5ICovCSAgLCAweGZmZmZmMDdmIC8qIDEyICovICwgMHhmZmZmZjBmZiAvKiAxOCAqLywKLQkJCQkJCQkJCSAgMHhmZmZmZjFmZiAvKiAyNCAqLwkgLCAweGZmZmZmM2ZmIC8qIDM2ICovCSAgLCAweGZmZmZmN2ZmIC8qIDQ4ICovICwgMHhmZmZmZmZmZiAvKiA1NCAqL307Cit1OCBCUk9BRENBU1RfQUREUltNQUNfQUREUl9MRU5dID0geyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmIH07Cit1OCBaRVJPX01BQ19BRERSW01BQ19BRERSX0xFTl0gPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKIAotVUNIQVIgTVVMVElDQVNUX0FERFJbTUFDX0FERFJfTEVOXSA9IHsweDEsICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKLVVDSEFSIEJST0FEQ0FTVF9BRERSW01BQ19BRERSX0xFTl0gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07Ci1VQ0hBUiBaRVJPX01BQ19BRERSW01BQ19BRERSX0xFTl0gID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworLyogZS5nLiBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW1JBVEVfMzZdIiBtZWFucyBpZiB0aGUgY3VycmVudCBSU1NJIGlzIGdyZWF0ZXIgdGhhbiAqLworLyogICAgICAgICAgICAgIHRoaXMgdmFsdWUsIHRoZW4gaXQncyBxdWFyYW50ZWVkIGNhcGFibGUgb2Ygb3BlcmF0aW5nIGluIDM2IG1icHMgVFggcmF0ZSBpbiAqLworLyogICAgICAgICAgICAgIGNsZWFuIGVudmlyb25tZW50LiAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHhSYXRlOiAxICAgMiAgIDUuNSAgIDExICAgICAgIDYgICAgICAgIDkgICAgMTIgICAgICAgMTggICAgICAgMjQgICAzNiAgIDQ4ICAgNTQgICAgICAgNzIgIDEwMCAqLworY2hhciBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW10gPQorICAgIHsgLTkyLCAtOTEsIC05MCwgLTg3LCAtODgsIC04NiwgLTg1LCAtODMsIC04MSwgLTc4LCAtNzIsIC03MSwgLTQwLCAtNDAgfTsKIAotLy8gZS5nLiBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW1JBVEVfMzZdIiBtZWFucyBpZiB0aGUgY3VycmVudCBSU1NJIGlzIGdyZWF0ZXIgdGhhbgotLy8JCXRoaXMgdmFsdWUsIHRoZW4gaXQncyBxdWFyYW50ZWVkIGNhcGFibGUgb2Ygb3BlcmF0aW5nIGluIDM2IG1icHMgVFggcmF0ZSBpbgotLy8JCWNsZWFuIGVudmlyb25tZW50LgotLy8JCQkJCQkJCSAgVHhSYXRlOiAxICAgMiAgIDUuNQkxMQkgNgkgIDkgICAgMTIJMTgJIDI0ICAgMzYgICA0OAk1NAkgNzIgIDEwMAotQ0hBUiBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW10gPXsgIC05MiwgLTkxLCAtOTAsIC04NywgLTg4LCAtODYsIC04NSwgLTgzLCAtODEsIC03OCwgLTcyLCAtNzEsIC00MCwgLTQwIH07Cit1OCBSYXRlSWRUb01icHNbXSA9IHsgMSwgMiwgNSwgMTEsIDYsIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQsIDcyLCAxMDAgfTsKK3UxNiBSYXRlSWRUbzUwMEticHNbXSA9CisgICAgeyAyLCA0LCAxMSwgMjIsIDEyLCAxOCwgMjQsIDM2LCA0OCwgNzIsIDk2LCAxMDgsIDE0NCwgMjAwIH07CiAKLVVDSEFSICBSYXRlSWRUb01icHNbXQkgPSB7IDEsIDIsIDUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0LCA3MiwgMTAwfTsKLVVTSE9SVCBSYXRlSWRUbzUwMEticHNbXSA9IHsgMiwgNCwgMTEsIDIyLCAxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4LCAxNDQsIDIwMH07Cit1OCBTc2lkSWUgPSBJRV9TU0lEOwordTggU3VwUmF0ZUllID0gSUVfU1VQUF9SQVRFUzsKK3U4IEV4dFJhdGVJZSA9IElFX0VYVF9TVVBQX1JBVEVTOwordTggSHRDYXBJZSA9IElFX0hUX0NBUDsKK3U4IEFkZEh0SW5mb0llID0gSUVfQUREX0hUOwordTggTmV3RXh0Q2hhbkllID0gSUVfU0VDT05EQVJZX0NIX09GRlNFVDsKK3U4IEVycEllID0gSUVfRVJQOwordTggRHNJZSA9IElFX0RTX1BBUk07Cit1OCBUaW1JZSA9IElFX1RJTTsKK3U4IFdwYUllID0gSUVfV1BBOwordTggV3BhMkllID0gSUVfV1BBMjsKK3U4IElic3NJZSA9IElFX0lCU1NfUEFSTTsKIAotVUNIQVIgIFNzaWRJZQkgPSBJRV9TU0lEOwotVUNIQVIgIFN1cFJhdGVJZSA9IElFX1NVUFBfUkFURVM7Ci1VQ0hBUiAgRXh0UmF0ZUllID0gSUVfRVhUX1NVUFBfUkFURVM7Ci1VQ0hBUiAgSHRDYXBJZSA9IElFX0hUX0NBUDsKLVVDSEFSICBBZGRIdEluZm9JZSA9IElFX0FERF9IVDsKLVVDSEFSICBOZXdFeHRDaGFuSWUgPSBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VUOwotVUNIQVIgIEVycEllCSA9IElFX0VSUDsKLVVDSEFSICBEc0llIAkgPSBJRV9EU19QQVJNOwotVUNIQVIgIFRpbUllCSA9IElFX1RJTTsKLVVDSEFSICBXcGFJZQkgPSBJRV9XUEE7Ci1VQ0hBUiAgV3BhMkllCSA9IElFX1dQQTI7Ci1VQ0hBUiAgSWJzc0llCSA9IElFX0lCU1NfUEFSTTsKLVVDSEFSICBDY3gySWUJID0gSUVfQ0NYX1YyOworZXh0ZXJuIHU4IFdQQV9PVUlbXTsKIAotZXh0ZXJuIFVDSEFSCVdQQV9PVUlbXTsKK3U4IFNFU19PVUlbXSA9IHsgMHgwMCwgMHg5MCwgMHg0YyB9OwogCi1VQ0hBUglTRVNfT1VJW10gPSB7MHgwMCwgMHg5MCwgMHg0Y307Ci0KLVVDSEFSCVplcm9Tc2lkWzMyXSA9IHsweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9OwotCi0vLyBSZXNldCB0aGUgUkZJQyBzZXR0aW5nIHRvIG5ldyBzZXJpZXMKLVJUTVBfUkZfUkVHUyBSRjI4NTBSZWdUYWJsZVtdID0gewotLy8JCWNoCSBSMSAJCSBSMiAJCSBSMyhUWDB+ND0wKSBSNAotCQl7MSwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3ODYsIDB4OTgxNmI0NTUsIDB4OTgwMDUxMGJ9LAotCQl7MiwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3ODYsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAotCQl7MywgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OGEsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAotCQl7NCwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OGEsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAotCQl7NSwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OGUsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAotCQl7NiwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OGUsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAotCQl7NywgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OTIsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAotCQl7OCwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OTIsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAotCQl7OSwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OTYsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAotCQl7MTAsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OTYsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAotCQl7MTEsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OWEsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAotCQl7MTIsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OWEsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAotCQl7MTMsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OWUsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAotCQl7MTQsIDB4OTg0MDJlY2MsIDB4OTg0YzA3YTIsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOTN9LAotCi0JCS8vIDgwMi4xMSBVTkkgLyBIeXBlckxhbiAyCi0JCXszNiwgMHg5ODQwMmVjYywgMHg5ODRjMDk5YSwgMHg5ODE1OGE1NSwgMHg5ODBlZDFhM30sCi0JCXszOCwgMHg5ODQwMmVjYywgMHg5ODRjMDk5ZSwgMHg5ODE1OGE1NSwgMHg5ODBlZDE5M30sCi0JCXs0MCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE4M30sCi0JCXs0NCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDFhM30sCi0JCXs0NiwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4NiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE4Yn0sCi0JCXs0OCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4NiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE5Yn0sCi0JCXs1MiwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4YSwgMHg5ODE1OGE1NSwgMHg5ODBlZDE5M30sCi0JCXs1NCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4YSwgMHg5ODE1OGE1NSwgMHg5ODBlZDFhM30sCi0JCXs1NiwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4ZSwgMHg5ODE1OGE1NSwgMHg5ODBlZDE4Yn0sCi0JCXs2MCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY5MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE4M30sCi0JCXs2MiwgMHg5ODQwMmVjOCwgMHg5ODRjMDY5MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE5M30sCi0JCXs2NCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY5MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDFhM30sIC8vIFBsdWdmZXN0IzQsIERheTQsIGNoYW5nZSBSRlIzIGxlZnQ0dGggOS0+NS4KLQotCQkvLyA4MDIuMTEgSHlwZXJMYW4gMgotCQl7MTAwLCAweDk4NDAyZWM4LCAweDk4NGMwNmIyLCAweDk4MTc4YTU1LCAweDk4MGVkNzgzfSwKLQotCQkvLyAyMDA4LjA0LjMwIG1vZGlmaWVkCi0JCS8vIFRoZSBzeXN0ZW0gdGVhbSBoYXMgQU4gdG8gaW1wcm92ZSB0aGUgRVZNIHZhbHVlCi0JCS8vIGZvciBjaGFubmVsIDEwMiB0byAxMDggZm9yIHRoZSBSVDI4NTAvUlQyNzUwIGR1YWwgYmFuZCBzb2x1dGlvbi4KLQkJezEwMiwgMHg5ODQwMmVjOCwgMHg5ODVjMDZiMiwgMHg5ODU3OGE1NSwgMHg5ODBlZDc5M30sCi0JCXsxMDQsIDB4OTg0MDJlYzgsIDB4OTg1YzA2YjIsIDB4OTg1NzhhNTUsIDB4OTgwZWQxYTN9LAotCQl7MTA4LCAweDk4NDAyZWNjLCAweDk4NWMwYTMyLCAweDk4NTc4YTU1LCAweDk4MGVkMTkzfSwKLQotCQl7MTEwLCAweDk4NDAyZWNjLCAweDk4NGMwYTM2LCAweDk4MTc4YTU1LCAweDk4MGVkMTgzfSwKLQkJezExMiwgMHg5ODQwMmVjYywgMHg5ODRjMGEzNiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5Yn0sCi0JCXsxMTYsIDB4OTg0MDJlY2MsIDB4OTg0YzBhM2EsIDB4OTgxNzhhNTUsIDB4OTgwZWQxYTN9LAotCQl7MTE4LCAweDk4NDAyZWNjLCAweDk4NGMwYTNlLCAweDk4MTc4YTU1LCAweDk4MGVkMTkzfSwKLQkJezEyMCwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4M30sCi0JCXsxMjQsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOTN9LAotCQl7MTI2LCAweDk4NDAyZWM0LCAweDk4NGMwMzgyLCAweDk4MTc4YTU1LCAweDk4MGVkMTVifSwgLy8gMHg5ODBlZDFiYi0+MHg5ODBlZDE1YiByZXF1aXJlZCBieSBSb3J5IDIwMDcwOTI3Ci0JCXsxMjgsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxYTN9LAotCQl7MTMyLCAweDk4NDAyZWM0LCAweDk4NGMwMzg2LCAweDk4MTc4YTU1LCAweDk4MGVkMThifSwKLQkJezEzNCwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4NiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5M30sCi0JCXsxMzYsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOWJ9LAotCQl7MTQwLCAweDk4NDAyZWM0LCAweDk4NGMwMzhhLCAweDk4MTc4YTU1LCAweDk4MGVkMTgzfSwKLQotCQkvLyA4MDIuMTEgVU5JSQotCQl7MTQ5LCAweDk4NDAyZWM0LCAweDk4NGMwMzhhLCAweDk4MTc4YTU1LCAweDk4MGVkMWE3fSwKLQkJezE1MSwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4ZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4N30sCi0JCXsxNTMsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGUsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOGZ9LAotCQl7MTU3LCAweDk4NDAyZWM0LCAweDk4NGMwMzhlLCAweDk4MTc4YTU1LCAweDk4MGVkMTlmfSwKLQkJezE1OSwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4ZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDFhN30sCi0JCXsxNjEsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOTIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODd9LAotCQl7MTY1LCAweDk4NDAyZWM0LCAweDk4NGMwMzkyLCAweDk4MTc4YTU1LCAweDk4MGVkMTk3fSwKLQotCQkvLyBKYXBhbgotCQl7MTg0LCAweDk1MDAyY2NjLCAweDk1MDA0OTFlLCAweDk1MDliZTU1LCAweDk1MGMwYTBifSwKLQkJezE4OCwgMHg5NTAwMmNjYywgMHg5NTAwNDkyMiwgMHg5NTA5YmU1NSwgMHg5NTBjMGExM30sCi0JCXsxOTIsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5MjYsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMWJ9LAotCQl7MTk2LCAweDk1MDAyY2NjLCAweDk1MDA0OTJhLCAweDk1MDliZTU1LCAweDk1MGMwYTIzfSwKLQkJezIwOCwgMHg5NTAwMmNjYywgMHg5NTAwNDkzYSwgMHg5NTA5YmU1NSwgMHg5NTBjMGExM30sCi0JCXsyMTIsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5M2UsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMWJ9LAotCQl7MjE2LCAweDk1MDAyY2NjLCAweDk1MDA0OTgyLCAweDk1MDliZTU1LCAweDk1MGMwYTIzfSwKLQotCQkvLyBzdGlsbCBsYWNrIG9mIE1NQUMoSmFwYW4pIGNoIDM0LDM4LDQyLDQ2Cit1OCBaZXJvU3NpZFszMl0gPQorICAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAogfTsKLVVDSEFSCU5VTV9PRl8yODUwX0NITkwgPSAoc2l6ZW9mKFJGMjg1MFJlZ1RhYmxlKSAvIHNpemVvZihSVE1QX1JGX1JFR1MpKTsKLQotRlJFUVVFTkNZX0lURU0gRnJlcUl0ZW1zMzAyMFtdID0KLXsKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLy8gSVNNIDogMi40IHRvIDIuNDgzIEdIeiAgICAgICAgICAgICAgICAgICAgICAgICAvLwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkvLyAxMWcKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLy8tQ0gtLS1OLS0tLS0tLVItLS1LLS0tLS0tLS0tLS0KLQl7MSwgICAgMjQxLCAgMiwgIDJ9LAotCXsyLCAgICAyNDEsCSAyLCAgN30sCi0JezMsICAgIDI0MiwJIDIsICAyfSwKLQl7NCwgICAgMjQyLAkgMiwgIDd9LAotCXs1LCAgICAyNDMsCSAyLCAgMn0sCi0JezYsICAgIDI0MywJIDIsICA3fSwKLQl7NywgICAgMjQ0LAkgMiwgIDJ9LAotCXs4LCAgICAyNDQsCSAyLCAgN30sCi0JezksICAgIDI0NSwJIDIsICAyfSwKLQl7MTAsICAgMjQ1LAkgMiwgIDd9LAotCXsxMSwgICAyNDYsCSAyLCAgMn0sCi0JezEyLCAgIDI0NiwJIDIsICA3fSwKLQl7MTMsICAgMjQ3LAkgMiwgIDJ9LAotCXsxNCwgICAyNDgsCSAyLCAgNH0sCi19OwotVUNIQVIJTlVNX09GXzMwMjBfQ0hOTD0oc2l6ZW9mKEZyZXFJdGVtczMwMjApIC8gc2l6ZW9mKEZSRVFVRU5DWV9JVEVNKSk7CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTQ2MCwxNyArMzU2LDE1IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLU5ESVNfU1RBVFVTIE1sbWVJbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoraW50IE1sbWVJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlORElTX1NUQVRVUyBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCWludCBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE1MTUUgSW5pdGlhbGl6ZVxuIikpOwogCi0JZG8KLQl7CisJZG8gewogCQlTdGF0dXMgPSBNbG1lUXVldWVJbml0KCZwQWQtPk1sbWUuUXVldWUpOwotCQlpZihTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQogCQkJYnJlYWs7CiAKIAkJcEFkLT5NbG1lLmJSdW5uaW5nID0gRkFMU0U7CkBAIC00NzksNDAgKzM3Myw2NSBAQAogCQl7CiAJCQlCc3NUYWJsZUluaXQoJnBBZC0+U2NhblRhYik7CiAKLQkJCS8vIGluaXQgU1RBIHN0YXRlIG1hY2hpbmVzCi0JCQlBc3NvY1N0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLkFzc29jTWFjaGluZSwgcEFkLT5NbG1lLkFzc29jRnVuYyk7Ci0JCQlBdXRoU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQXV0aE1hY2hpbmUsIHBBZC0+TWxtZS5BdXRoRnVuYyk7Ci0JCQlBdXRoUnNwU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQXV0aFJzcE1hY2hpbmUsIHBBZC0+TWxtZS5BdXRoUnNwRnVuYyk7Ci0JCQlTeW5jU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuU3luY01hY2hpbmUsIHBBZC0+TWxtZS5TeW5jRnVuYyk7Ci0JCQlXcGFQc2tTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5XcGFQc2tNYWNoaW5lLCBwQWQtPk1sbWUuV3BhUHNrRnVuYyk7Ci0JCQlBaXJvbmV0U3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUsIHBBZC0+TWxtZS5BaXJvbmV0RnVuYyk7CisJCQkvKiBpbml0IFNUQSBzdGF0ZSBtYWNoaW5lcyAqLworCQkJQXNzb2NTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5Bc3NvY01hY2hpbmUsCisJCQkJCSAgICAgIHBBZC0+TWxtZS5Bc3NvY0Z1bmMpOworCQkJQXV0aFN0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLkF1dGhNYWNoaW5lLAorCQkJCQkgICAgIHBBZC0+TWxtZS5BdXRoRnVuYyk7CisJCQlBdXRoUnNwU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQXV0aFJzcE1hY2hpbmUsCisJCQkJCQlwQWQtPk1sbWUuQXV0aFJzcEZ1bmMpOworCQkJU3luY1N0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLlN5bmNNYWNoaW5lLAorCQkJCQkgICAgIHBBZC0+TWxtZS5TeW5jRnVuYyk7CiAKLQkJCS8vIFNpbmNlIHdlIGFyZSB1c2luZyBzd2l0Y2gvY2FzZSB0byBpbXBsZW1lbnQgaXQsIHRoZSBpbml0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBhYm92ZQotCQkJLy8gc3RhdGUgbWFjaGluZSBpbml0CisJCQkvKiBTaW5jZSB3ZSBhcmUgdXNpbmcgc3dpdGNoL2Nhc2UgdG8gaW1wbGVtZW50IGl0LCB0aGUgaW5pdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgYWJvdmUgKi8KKwkJCS8qIHN0YXRlIG1hY2hpbmUgaW5pdCAqLwogCQkJTWxtZUNudGxJbml0KHBBZCwgJnBBZC0+TWxtZS5DbnRsTWFjaGluZSwgTlVMTCk7CiAJCX0KIAotCQlBY3Rpb25TdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5BY3RNYWNoaW5lLCBwQWQtPk1sbWUuQWN0RnVuYyk7CisJCVdwYVN0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLldwYU1hY2hpbmUsCisJCQkJICAgIHBBZC0+TWxtZS5XcGFGdW5jKTsKIAotCQkvLyBJbml0IG1sbWUgcGVyaW9kaWMgdGltZXIKLQkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKE1sbWVQZXJpb2RpY0V4ZWMpLCBwQWQsIFRSVUUpOworCQlBY3Rpb25TdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5BY3RNYWNoaW5lLAorCQkJCSAgICAgICBwQWQtPk1sbWUuQWN0RnVuYyk7CiAKLQkJLy8gU2V0IG1sbWUgcGVyaW9kaWMgdGltZXIKKwkJLyogSW5pdCBtbG1lIHBlcmlvZGljIHRpbWVyICovCisJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lLlBlcmlvZGljVGltZXIsCisJCQkgICAgICBHRVRfVElNRVJfRlVOQ1RJT04oTWxtZVBlcmlvZGljRXhlYyksIHBBZCwgVFJVRSk7CisKKwkJLyogU2V0IG1sbWUgcGVyaW9kaWMgdGltZXIgKi8KIAkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwgTUxNRV9UQVNLX0VYRUNfSU5UVik7CiAKLQkJLy8gc29mdHdhcmUtYmFzZWQgUlggQW50ZW5uYSBkaXZlcnNpdHkKLQkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuUnhBbnRFdmFsVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihBc2ljUnhBbnRFdmFsVGltZW91dCksIHBBZCwgRkFMU0UpOworCQkvKiBzb2Z0d2FyZS1iYXNlZCBSWCBBbnRlbm5hIGRpdmVyc2l0eSAqLworCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZS5SeEFudEV2YWxUaW1lciwKKwkJCSAgICAgIEdFVF9USU1FUl9GVU5DVElPTihBc2ljUnhBbnRFdmFsVGltZW91dCksIHBBZCwKKwkJCSAgICAgIEZBTFNFKTsKIAotI2lmZGVmIFJUMjg2MAogCQl7Ci0JICAgICAgICBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKQotCSAgICAgICAgewotCSAgICAgICAgICAgIC8vIG9ubHkgUENJZSBjYXJkcyBuZWVkIHRoZXNlIHR3byB0aW1lcnMKLQkgICAgCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFBzUG9sbFdha2VFeGVjKSwgcEFkLCBGQUxTRSk7Ci0JICAgIAkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oUmFkaW9PbkV4ZWMpLCBwQWQsIEZBTFNFKTsKLQkgICAgICAgIH0KKyNpZmRlZiBSVE1QX1BDSV9TVVBQT1JUCisJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpIHsKKwkJCQkvKiBvbmx5IFBDSWUgY2FyZHMgbmVlZCB0aGVzZSB0d28gdGltZXJzICovCisJCQkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCisJCQkJCSAgICAgIEdFVF9USU1FUl9GVU5DVElPTgorCQkJCQkgICAgICAoUHNQb2xsV2FrZUV4ZWMpLCBwQWQsIEZBTFNFKTsKKwkJCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsCisJCQkJCSAgICAgIEdFVF9USU1FUl9GVU5DVElPTihSYWRpb09uRXhlYyksCisJCQkJCSAgICAgIHBBZCwgRkFMU0UpOworCQkJfQorI2VuZGlmIC8qIFJUTVBfUENJX1NVUFBPUlQgLy8gKi8KKworCQkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuTGlua0Rvd25UaW1lciwKKwkJCQkgICAgICBHRVRfVElNRVJfRlVOQ1RJT04oTGlua0Rvd25FeGVjKSwgcEFkLAorCQkJCSAgICAgIEZBTFNFKTsKKworI2lmZGVmIFJUTVBfTUFDX1VTQgorCQkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuQXV0b1dha2V1cFRpbWVyLAorCQkJCSAgICAgIEdFVF9USU1FUl9GVU5DVElPTgorCQkJCSAgICAgIChSdG1wVXNiU3RhQXNpY0ZvcmNlV2FrZXVwVGltZW91dCksIHBBZCwKKwkJCQkgICAgICBGQUxTRSk7CisJCQlwQWQtPk1sbWUuQXV0b1dha2V1cFRpbWVyUnVubmluZyA9IEZBTFNFOworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCQl9Ci0jZW5kaWYKKwogCX0gd2hpbGUgKEZBTFNFKTsKIAogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBNTE1FIEluaXRpYWxpemVcbiIpKTsKQEAgLTUzNCw5MyArNDUzLDEwMiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBNbG1lSGFuZGxlcigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3ZvaWQgTWxtZUhhbmRsZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCU1MTUVfUVVFVUVfRUxFTSAJICAgKkVsZW0gPSBOVUxMOworCXN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0gPSBOVUxMOwogCi0JLy8gT25seSBhY2NlcHQgTUxNRSBhbmQgRnJhbWUgZnJvbSBwZWVyIHNpZGUsIG5vIG90aGVyIChjb250cm9sL2RhdGEpIGZyYW1lIHNob3VsZAotCS8vIGdldCBpbnRvIHRoaXMgc3RhdGUgbWFjaGluZQorCS8qIE9ubHkgYWNjZXB0IE1MTUUgYW5kIEZyYW1lIGZyb20gcGVlciBzaWRlLCBubyBvdGhlciAoY29udHJvbC9kYXRhKSBmcmFtZSBzaG91bGQgKi8KKwkvKiBnZXQgaW50byB0aGlzIHN0YXRlIG1hY2hpbmUgKi8KIAogCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7Ci0JaWYocEFkLT5NbG1lLmJSdW5uaW5nKQotCXsKKwlpZiAocEFkLT5NbG1lLmJSdW5uaW5nKSB7CiAJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7CiAJCXJldHVybjsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlwQWQtPk1sbWUuYlJ1bm5pbmcgPSBUUlVFOwogCX0KIAlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOwogCi0Jd2hpbGUgKCFNbG1lUXVldWVFbXB0eSgmcEFkLT5NbG1lLlF1ZXVlKSkKLQl7CisJd2hpbGUgKCFNbG1lUXVldWVFbXB0eSgmcEFkLT5NbG1lLlF1ZXVlKSkgewogCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX01MTUVfUkVTRVRfSU5fUFJPR1JFU1MpIHx8Ci0JCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykgfHwKLQkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRGV2aWNlIEhhbHRlZCBvciBSZW1vdmVkIG9yIE1sbWVSZXN0LCBleGl0IE1sbWVIYW5kbGVyISAocXVldWUgbnVtID0gJWxkKVxuIiwgcEFkLT5NbG1lLlF1ZXVlLk51bSkpOworCQkgICAgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpIHx8CisJCSAgICBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkRldmljZSBIYWx0ZWQgb3IgUmVtb3ZlZCBvciBNbG1lUmVzdCwgZXhpdCBNbG1lSGFuZGxlciEgKHF1ZXVlIG51bSA9ICVsZClcbiIsCisJCQkJICBwQWQtPk1sbWUuUXVldWUuTnVtKSk7CiAJCQlicmVhazsKIAkJfQotCi0JCS8vRnJvbSBtZXNzYWdlIHR5cGUsIGRldGVybWluZSB3aGljaCBzdGF0ZSBtYWNoaW5lIEkgc2hvdWxkIGRyaXZlCi0JCWlmIChNbG1lRGVxdWV1ZSgmcEFkLT5NbG1lLlF1ZXVlLCAmRWxlbSkpCi0JCXsKLSNpZmRlZiBSVDI4NzAKLQkJCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9SRVNFVF9DT05GKQotCQkJewotCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIhISEgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworCQkvKkZyb20gbWVzc2FnZSB0eXBlLCBkZXRlcm1pbmUgd2hpY2ggc3RhdGUgbWFjaGluZSBJIHNob3VsZCBkcml2ZSAqLworCQlpZiAoTWxtZURlcXVldWUoJnBBZC0+TWxtZS5RdWV1ZSwgJkVsZW0pKSB7CisjaWZkZWYgUlRNUF9NQUNfVVNCCisJCQlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfUkVTRVRfQ09ORikgeworCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkJICAgICAoInJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSFcbiIpKTsKIAkJCQlNbG1lUmVzdGFydFN0YXRlTWFjaGluZShwQWQpOwogCQkJCUVsZW0tPk9jY3VwaWVkID0gRkFMU0U7CiAJCQkJRWxlbS0+TXNnTGVuID0gMDsKIAkJCQljb250aW51ZTsKIAkJCX0KLSNlbmRpZiAvLyBSVDI4NzAgLy8KKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotCQkJLy8gaWYgZGVxdWV1ZSBzdWNjZXNzCi0JCQlzd2l0Y2ggKEVsZW0tPk1hY2hpbmUpCi0JCQl7Ci0JCQkJLy8gU1RBIHN0YXRlIG1hY2hpbmVzCi0JCQkJY2FzZSBBU1NPQ19TVEFURV9NQUNISU5FOgotCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5Bc3NvY01hY2hpbmUsIEVsZW0pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEFVVEhfU1RBVEVfTUFDSElORToKLQkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuQXV0aE1hY2hpbmUsIEVsZW0pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEFVVEhfUlNQX1NUQVRFX01BQ0hJTkU6Ci0JCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkF1dGhSc3BNYWNoaW5lLCBFbGVtKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTWU5DX1NUQVRFX01BQ0hJTkU6Ci0JCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLlN5bmNNYWNoaW5lLCBFbGVtKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBNTE1FX0NOVExfU1RBVEVfTUFDSElORToKLQkJCQkJTWxtZUNudGxNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuQ250bE1hY2hpbmUsIEVsZW0pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFdQQV9QU0tfU1RBVEVfTUFDSElORToKLQkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuV3BhUHNrTWFjaGluZSwgRWxlbSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQUlST05FVF9TVEFURV9NQUNISU5FOgotCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZSwgRWxlbSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQUNUSU9OX1NUQVRFX01BQ0hJTkU6Ci0JCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkFjdE1hY2hpbmUsIEVsZW0pOwotCQkJCQlicmVhazsKKwkJCS8qIGlmIGRlcXVldWUgc3VjY2VzcyAqLworCQkJc3dpdGNoIChFbGVtLT5NYWNoaW5lKSB7CisJCQkJLyogU1RBIHN0YXRlIG1hY2hpbmVzICovCisJCQljYXNlIEFTU09DX1NUQVRFX01BQ0hJTkU6CisJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsCisJCQkJCQkJICAmcEFkLT5NbG1lLgorCQkJCQkJCSAgQXNzb2NNYWNoaW5lLCBFbGVtKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQVVUSF9TVEFURV9NQUNISU5FOgorCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLAorCQkJCQkJCSAgJnBBZC0+TWxtZS4KKwkJCQkJCQkgIEF1dGhNYWNoaW5lLCBFbGVtKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQVVUSF9SU1BfU1RBVEVfTUFDSElORToKKwkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwKKwkJCQkJCQkgICZwQWQtPk1sbWUuCisJCQkJCQkJICBBdXRoUnNwTWFjaGluZSwgRWxlbSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNZTkNfU1RBVEVfTUFDSElORToKKwkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwKKwkJCQkJCQkgICZwQWQtPk1sbWUuCisJCQkJCQkJICBTeW5jTWFjaGluZSwgRWxlbSk7CisJCQkJYnJlYWs7CisJCQljYXNlIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FOgorCQkJCU1sbWVDbnRsTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLAorCQkJCQkJCSAgICAgJnBBZC0+TWxtZS4KKwkJCQkJCQkgICAgIENudGxNYWNoaW5lLCBFbGVtKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgV1BBX1BTS19TVEFURV9NQUNISU5FOgorCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLAorCQkJCQkJCSAgJnBBZC0+TWxtZS4KKwkJCQkJCQkgIFdwYVBza01hY2hpbmUsIEVsZW0pOworCQkJCWJyZWFrOwogCisJCQljYXNlIEFDVElPTl9TVEFURV9NQUNISU5FOgorCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLAorCQkJCQkJCSAgJnBBZC0+TWxtZS5BY3RNYWNoaW5lLAorCQkJCQkJCSAgRWxlbSk7CisJCQkJYnJlYWs7CiAKKwkJCWNhc2UgV1BBX1NUQVRFX01BQ0hJTkU6CisJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsCisJCQkJCQkJICAmcEFkLT5NbG1lLldwYU1hY2hpbmUsCisJCQkJCQkJICBFbGVtKTsKKwkJCQlicmVhazsKIAorCQkJZGVmYXVsdDoKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiRVJST1I6IElsbGVnYWwgbWFjaGluZSAlbGQgaW4gTWxtZUhhbmRsZXIoKVxuIiwKKwkJCQkJICBFbGVtLT5NYWNoaW5lKSk7CisJCQkJYnJlYWs7CisJCQl9CS8qIGVuZCBvZiBzd2l0Y2ggKi8KIAotCQkJCWRlZmF1bHQ6Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkVSUk9SOiBJbGxlZ2FsIG1hY2hpbmUgJWxkIGluIE1sbWVIYW5kbGVyKClcbiIsIEVsZW0tPk1hY2hpbmUpKTsKLQkJCQkJYnJlYWs7Ci0JCQl9IC8vIGVuZCBvZiBzd2l0Y2gKLQotCQkJLy8gZnJlZSBNTE1FIGVsZW1lbnQKKwkJCS8qIGZyZWUgTUxNRSBlbGVtZW50ICovCiAJCQlFbGVtLT5PY2N1cGllZCA9IEZBTFNFOwogCQkJRWxlbS0+TXNnTGVuID0gMDsKIAotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJREJHUFJJTlRfRVJSKCgiTWxtZUhhbmRsZXI6IE1sbWVRdWV1ZSBlbXB0eVxuIikpOwogCQl9CiAJfQpAQCAtNjQzLDczICs1NzEsNjcgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgTWxtZUhhbHQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCit2b2lkIE1sbWVIYWx0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlCT09MRUFOIAkgIENhbmNlbGxlZDsKLSNpZmRlZiBSVDMwNzAKLQlVSU5UMzIJCVR4UGluQ2ZnID0gMHgwMDA1MEYwRjsKLSNlbmRpZiAvLyBSVDMwNzAgLy8KKwlCT09MRUFOIENhbmNlbGxlZDsKIAogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBNbG1lSGFsdFxuIikpOwogCi0JaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JewotCQkvLyBkaXNhYmxlIEJFQUNPTiBnZW5lcmF0aW9uIGFuZCBvdGhlciBCRUFDT04gcmVsYXRlZCBoYXJkd2FyZSB0aW1lcnMKKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkgeworCQkvKiBkaXNhYmxlIEJFQUNPTiBnZW5lcmF0aW9uIGFuZCBvdGhlciBCRUFDT04gcmVsYXRlZCBoYXJkd2FyZSB0aW1lcnMgKi8KIAkJQXNpY0Rpc2FibGVTeW5jKHBBZCk7CiAJfQogCiAJewotCQkvLyBDYW5jZWwgcGVuZGluZyB0aW1lcnMKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwJCSZDYW5jZWxsZWQpOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsCQkmQ2FuY2VsbGVkKTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwJJkNhbmNlbGxlZCk7Ci0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwJCSZDYW5jZWxsZWQpOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwJCSZDYW5jZWxsZWQpOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsCQkmQ2FuY2VsbGVkKTsKLSNpZmRlZiBSVDI4NjAKLQkgICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKLQkgICAgewotCSAgIAkgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCQkmQ2FuY2VsbGVkKTsKLQkJICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwJCSZDYW5jZWxsZWQpOworCQkvKiBDYW5jZWwgcGVuZGluZyB0aW1lcnMgKi8KKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgJkNhbmNlbGxlZCk7CisKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpCisJCSAgICAmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpKSB7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwgJkNhbmNlbGxlZCk7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsICZDYW5jZWxsZWQpOwogCQl9Ci0jZW5kaWYKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5MaW5rRG93blRpbWVyLCAmQ2FuY2VsbGVkKTsKKworI2lmZGVmIFJUTVBfTUFDX1VTQgorCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5BdXRvV2FrZXVwVGltZXIsICZDYW5jZWxsZWQpOworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCX0KIAotCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBlcmlvZGljVGltZXIsCQkmQ2FuY2VsbGVkKTsKLQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5SeEFudEV2YWxUaW1lciwJCSZDYW5jZWxsZWQpOworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBlcmlvZGljVGltZXIsICZDYW5jZWxsZWQpOworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlJ4QW50RXZhbFRpbWVyLCAmQ2FuY2VsbGVkKTsKIAorCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSB7CisJCXN0cnVjdCBydF9ydG1wX2NoaXBfb3AgKnBDaGlwT3BzID0gJnBBZC0+Y2hpcE9wczsKIAotCi0JaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JewotCQkvLyBTZXQgTEVECisJCS8qIFNldCBMRUQgKi8KIAkJUlRNUFNldExFRChwQWQsIExFRF9IQUxUKTsKLSAgICAgICAgUlRNUFNldFNpZ25hbExFRChwQWQsIC0xMDApOwkvLyBGb3JjZSBzaWduYWwgc3RyZW5ndGggTGVkIHRvIGJlIHR1cm5lZCBvZmYsIGZpcm13YXJlIGlzIG5vdCBkb25lIGl0LgotI2lmZGVmIFJUMjg3MAotICAgICAgICB7Ci0gICAgICAgICAgICBMRURfQ0ZHX1NUUlVDIExlZENmZzsKLSAgICAgICAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgTEVEX0NGRywgJkxlZENmZy53b3JkKTsKLSAgICAgICAgICAgIExlZENmZy5maWVsZC5MZWRQb2xhciA9IDA7Ci0gICAgICAgICAgICBMZWRDZmcuZmllbGQuUkxlZE1vZGUgPSAwOwotICAgICAgICAgICAgTGVkQ2ZnLmZpZWxkLkdMZWRNb2RlID0gMDsKLSAgICAgICAgICAgIExlZENmZy5maWVsZC5ZTGVkTW9kZSA9IDA7Ci0gICAgICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBMRURfQ0ZHLCBMZWRDZmcud29yZCk7Ci0gICAgICAgIH0KLSNlbmRpZiAvLyBSVDI4NzAgLy8KLSNpZmRlZiBSVDMwNzAKLQkJLy8KLQkJLy8gVHVybiBvZmYgTE5BX1BFCi0JCS8vCi0JCWlmIChJU19SVDMwNzAocEFkKSB8fCBJU19SVDMwNzEocEFkKSkKKwkJUlRNUFNldFNpZ25hbExFRChwQWQsIC0xMDApOwkvKiBGb3JjZSBzaWduYWwgc3RyZW5ndGggTGVkIHRvIGJlIHR1cm5lZCBvZmYsIGZpcm13YXJlIGlzIG5vdCBkb25lIGl0LiAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgogCQl7Ci0JCQlUeFBpbkNmZyAmPSAweEZGRkZGMEYwOwotCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgVFhfUElOX0NGRywgVHhQaW5DZmcpOworCQkJTEVEX0NGR19TVFJVQyBMZWRDZmc7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIExFRF9DRkcsICZMZWRDZmcud29yZCk7CisJCQlMZWRDZmcuZmllbGQuTGVkUG9sYXIgPSAwOworCQkJTGVkQ2ZnLmZpZWxkLlJMZWRNb2RlID0gMDsKKwkJCUxlZENmZy5maWVsZC5HTGVkTW9kZSA9IDA7CisJCQlMZWRDZmcuZmllbGQuWUxlZE1vZGUgPSAwOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTEVEX0NGRywgTGVkQ2ZnLndvcmQpOwogCQl9Ci0jZW5kaWYgLy8gUlQzMDcwIC8vCisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisKKwkJaWYgKHBDaGlwT3BzLT5Bc2ljSGFsdEFjdGlvbikKKwkJCXBDaGlwT3BzLT5Bc2ljSGFsdEFjdGlvbihwQWQpOwogCX0KIAotCVJUTVB1c2VjRGVsYXkoNTAwMCk7ICAgIC8vICA1IG1zZWMgdG8gZ3VyYW50ZWUgQW50IERpdmVyc2l0eSB0aW1lciBjYW5jZWxlZAorCVJUTVB1c2VjRGVsYXkoNTAwMCk7CS8qICA1IG1zZWMgdG8gZ3VyYW50ZWUgQW50IERpdmVyc2l0eSB0aW1lciBjYW5jZWxlZCAqLwogCiAJTWxtZVF1ZXVlRGVzdHJveSgmcEFkLT5NbG1lLlF1ZXVlKTsKIAlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOwpAQCAtNzE3LDExICs2MzksMTEgQEAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gTWxtZUhhbHRcbiIpKTsKIH0KIAotVk9JRCBNbG1lUmVzZXRSYWxpbmtDb3VudGVycygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCkKK3ZvaWQgTWxtZVJlc2V0UmFsaW5rQ291bnRlcnMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCXBBZC0+UmFsaW5rQ291bnRlcnMuTGFzdE9uZVNlY1J4T2tEYXRhQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rRGF0YUNudDsKLQkvLyBjbGVhciBhbGwgT25lU2VjeHh4IGNvdW50ZXJzLgorCXBBZC0+UmFsaW5rQ291bnRlcnMuTGFzdE9uZVNlY1J4T2tEYXRhQ250ID0KKwkgICAgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rRGF0YUNudDsKKwkvKiBjbGVhciBhbGwgT25lU2VjeHh4IGNvdW50ZXJzLiAqLwogCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjQmVhY29uU2VudENudCA9IDA7CiAJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNGYWxzZUNDQUNudCA9IDA7CiAJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEZjc0VyckNudCA9IDA7CkBAIC03MzAsOCArNjUyLDEwIEBACiAJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ID0gMDsKIAlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ID0gMDsKIAlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4T2tEYXRhQ250ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1JlY2VpdmVkQnl0ZUNvdW50ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1RyYW5zbWl0dGVkQnl0ZUNvdW50ID0gMDsKIAotCS8vIFRPRE86IGZvciBkZWJ1ZyBvbmx5LiB0byBiZSByZW1vdmVkCisJLyogVE9ETzogZm9yIGRlYnVnIG9ubHkuIHRvIGJlIHJlbW92ZWQgKi8KIAlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY09zVHhDb3VudFtRSURfQUNfQkVdID0gMDsKIAlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY09zVHhDb3VudFtRSURfQUNfQktdID0gMDsKIAlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY09zVHhDb3VudFtRSURfQUNfVkldID0gMDsKQEAgLTc0OCw5ICs2NzIsNiBAQAogCXJldHVybjsKIH0KIAotdW5zaWduZWQgbG9uZyByeF9BTVNEVTsKLXVuc2lnbmVkIGxvbmcgcnhfVG90YWw7Ci0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAlEZXNjcmlwdGlvbjoKQEAgLTc2NywyMjkgKzY4OCwxODggQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLSNkZWZpbmUgQURIT0NfQkVBQ09OX0xPU1RfVElNRQkJKDgqT1NfSFopICAvLyA4IHNlYwotVk9JRCBNbG1lUGVyaW9kaWNFeGVjKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKKyNkZWZpbmUgQURIT0NfQkVBQ09OX0xPU1RfVElNRQkJKDgqT1NfSFopCS8qIDggc2VjICovCit2b2lkIE1sbWVQZXJpb2RpY0V4ZWModm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkgICAgICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSAgICAgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKQogewotCVVMT05HCQkJVHhUb3RhbENudDsKLQlQUlRNUF9BREFQVEVSCXBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisJdW5zaWduZWQgbG9uZyBUeFRvdGFsQ250OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopRnVuY3Rpb25Db250ZXh0OwogCi0jaWZkZWYgUlQyODYwCi0JLy9CYXJvbiAyMDA4LzA3LzEwCi0JLy9wcmludGsoIkJhcm9uX1Rlc3Q6XHQlcyIsIFJUTVBHZXRSYWxpbmtFbmNyeU1vZGVTdHIocEFkLT5TdGFDZmcuV2VwU3RhdHVzKSk7Ci0JLy9JZiB0aGUgU1RBIHNlY3VyaXR5IHNldHRpbmcgaXMgT1BFTiBvciBXRVAsIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IDAuCi0JLy9JZiB0aGUgU1RBIHNlY3VyaXR5IHNldHRpbmcgaXMgV1BBUFNLIG9yIFdQQTJQU0ssIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IDEuCi0JaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzPDIpCisjaWZkZWYgUlRNUF9NQUNfUENJCiAJewotCQlwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSAwOwotCX0KLQllbHNlCi0JewotCQlwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSAxOwotCX0KKwkJLyogSWYgSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBlbmFibGVkLCB3ZSBoYXZlIHRvIGNoZWNrIEdQSU8gcGluMiBldmVyeSAyIHNlY29uZC4gKi8KKwkJLyogTW92ZSBjb2RlIHRvIGhlcmUsIGJlY2F1c2UgZm9sbG93aW5nIGNvZGUgd2lsbCByZXR1cm4gd2hlbiByYWRpbyBpcyBvZmYgKi8KKwkJaWYgKChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCAlIChNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSAqIDIpID09CisJCSAgICAgMCkgJiYgKHBBZC0+U3RhQ2ZnLmJIYXJkd2FyZVJhZGlvID09IFRSVUUpCisJCSAgICAmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJICAgICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKQorCQkgICAgLyomJihwQWQtPmJQQ0ljbGtPZmYgPT0gRkFMU0UpICovCisJCSAgICApIHsKKwkJCXUzMiBkYXRhID0gMDsKIAotCXsKLQkgICAgLy8gSWYgSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBlbmFibGVkLCB3ZSBoYXZlIHRvIGNoZWNrIEdQSU8gcGluMiBldmVyeSAyIHNlY29uZC4KLQkJLy8gTW92ZSBjb2RlIHRvIGhlcmUsIGJlY2F1c2UgZm9sbG93aW5nIGNvZGUgd2lsbCByZXR1cm4gd2hlbiByYWRpbyBpcyBvZmYKLQkJaWYgKChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCAlIChNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSAqIDIpID09IDApICYmCi0JCQkocEFkLT5TdGFDZmcuYkhhcmR3YXJlUmFkaW8gPT0gVFJVRSkgJiYKLQkJCShSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpICYmCi0JCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkgJiYKLQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSkKLQkJewotCQkJVUlOVDMyCQkJCWRhdGEgPSAwOworCQkJLyogUmVhZCBHUElPIHBpbjIgYXMgSGFyZHdhcmUgY29udHJvbGxlZCByYWRpbyBzdGF0ZSAqLworI2lmbmRlZiBSVDMwOTAKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgR1BJT19DVFJMX0NGRywgJmRhdGEpOworI2VuZGlmIC8qIFJUMzA5MCAvLyAqLworLypLSChQQ0lFIFBTKTpBZGRlZCBiYXNlZCBvbiBKYW5lPC0tICovCisjaWZkZWYgUlQzMDkwCisvKiBSZWFkIEdQSU8gcGluMiBhcyBIYXJkd2FyZSBjb250cm9sbGVkIHJhZGlvIHN0YXRlICovCisvKiBXZSBuZWVkIHRvIFJlYWQgR1BJTyBpZiBIVyBzYWlkIHNvIG5vIG1hdGVyIHdoYXQgYWR2YW5jZSBwb3dlciBzYXZpbmcgKi8KKwkJCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgKElETEVfT04ocEFkKSkKKwkJCSAgICAmJgorCQkJICAgIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpKQorCQkJICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlUFNpbklkbGUgPT0KKwkJCQlUUlVFKSkgeworCQkJCS8qIFdhbnQgdG8gbWFrZSBzdXJlIGRldmljZSBnb2VzIHRvIEwwIHN0YXRlIGJlZm9yZSByZWFkaW5nIHJlZ2lzdGVyLiAqLworCQkJCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLCAwKTsKKwkJCQlSVE1QX0lPX0ZPUkNFX1JFQUQzMihwQWQsIEdQSU9fQ1RSTF9DRkcsICZkYXRhKTsKKwkJCQlSVE1QUENJZUxpbmtDdHJsU2V0dGluZyhwQWQsIDMpOworCQkJfSBlbHNlCisJCQkJUlRNUF9JT19GT1JDRV9SRUFEMzIocEFkLCBHUElPX0NUUkxfQ0ZHLCAmZGF0YSk7CisjZW5kaWYgLyogUlQzMDkwIC8vICovCisvKktIKFBDSUUgUFMpOkFkZGVkIGJhc2VkIG9uIEphbmUtLT4gKi8KIAotCQkJLy8gUmVhZCBHUElPIHBpbjIgYXMgSGFyZHdhcmUgY29udHJvbGxlZCByYWRpbyBzdGF0ZQotCQkJUlRNUF9JT19GT1JDRV9SRUFEMzIocEFkLCBHUElPX0NUUkxfQ0ZHLCAmZGF0YSk7Ci0JCQlpZiAoZGF0YSAmIDB4MDQpCi0JCQl7CisJCQlpZiAoZGF0YSAmIDB4MDQpIHsKIAkJCQlwQWQtPlN0YUNmZy5iSHdSYWRpbyA9IFRSVUU7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7CisJCQl9IGVsc2UgewogCQkJCXBBZC0+U3RhQ2ZnLmJId1JhZGlvID0gRkFMU0U7CiAJCQl9Ci0JCQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvICE9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpCi0JCQl7Ci0JCQkJcEFkLT5TdGFDZmcuYlJhZGlvID0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKTsKLQkJCQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCi0JCQkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyAhPQorCQkJICAgIChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpIHsKKwkJCQlwQWQtPlN0YUNmZy5iUmFkaW8gPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8KKwkJCQkJCSAgICAgICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKTsKKwkJCQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpIHsKIAkJCQkJTWxtZVJhZGlvT24ocEFkKTsKLQkJCQkJLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCisJCQkJCS8qIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbiAqLwogCQkJCQlwQWQtPkV4dHJhSW5mbyA9IEVYVFJBX0lORk9fQ0xFQVI7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7CisJCQkJfSBlbHNlIHsKIAkJCQkJTWxtZVJhZGlvT2ZmKHBBZCk7Ci0JCQkJCS8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQkvKiBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gKi8KIAkJCQkJcEFkLT5FeHRyYUluZm8gPSBIV19SQURJT19PRkY7CiAJCQkJfQogCQkJfQogCQl9CiAJfQotI2VuZGlmIC8qIFJUMjg2MCAqLworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJLyogRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuICovCisJLyogVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0ICovCiAJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8Ci0JCQkJCQkJCWZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkpKQorCQkJCSAgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAorCQkJCSAgZlJUTVBfQURBUFRFUl9SQURJT19NRUFTVVJFTUVOVCB8CisJCQkJICBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkpKQogCQlyZXR1cm47CiAKLSNpZmRlZiBSVDI4NjAKLQl7Ci0JCWlmICgocEFkLT5SYWxpbmtDb3VudGVycy5MYXN0UmVjZWl2ZWRCeXRlQ291bnQgPT0gcEFkLT5SYWxpbmtDb3VudGVycy5SZWNlaXZlZEJ5dGVDb3VudCkgJiYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKSkKLQkJewotCQkJLy8gSWYgUmVjZWl2ZUJ5dGVDb3VudCBkb2Vzbid0IGNoYW5nZSwgIGluY3JlYXNlIFNhbWVSeEJ5dGVDb3VudCBieSAxLgotCQkJcEFkLT5TYW1lUnhCeXRlQ291bnQrKzsKLQkJfQotCQllbHNlCi0JCQlwQWQtPlNhbWVSeEJ5dGVDb3VudCA9IDA7Ci0KLQkJLy8gSWYgYWZ0ZXIgQkJQLCBzdGlsbCBub3Qgd29yay4uLm5lZWQgdG8gY2hlY2sgdG8gcmVzZXQgUEJGJk1BQy4KLQkJaWYgKHBBZC0+U2FtZVJ4Qnl0ZUNvdW50ID09IDcwMikKLQkJewotCQkJcEFkLT5TYW1lUnhCeXRlQ291bnQgPSAwOwotCQkJQXNpY1Jlc2V0UEJGKHBBZCk7Ci0JCQlBc2ljUmVzZXRNQUMocEFkKTsKLQkJfQotCi0JCS8vIElmIFNhbWVSeEJ5dGVDb3VudCBrZWVwcyBoYXBwZW5zIGZvciAyIHNlY29uZCBpbiBpbmZyYSBtb2RlLCBvciBmb3IgNjAgc2Vjb25kcyBpbiBpZGxlIG1vZGUuCi0JCWlmICgoKElORlJBX09OKHBBZCkpICYmIChwQWQtPlNhbWVSeEJ5dGVDb3VudCA+IDIwKSkgfHwgKChJRExFX09OKHBBZCkpICYmIChwQWQtPlNhbWVSeEJ5dGVDb3VudCA+IDYwMCkpKQotCQl7Ci0JCQlpZiAoKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKSAmJiAocEFkLT5TYW1lUnhCeXRlQ291bnQgPCA3MDApKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT4gIFNhbWVSeEJ5dGVDb3VudCA9ICVsdSAhISEhISEhISEhISEhISEgXG4iLCBwQWQtPlNhbWVSeEJ5dGVDb3VudCkpOwotCQkJCXBBZC0+U2FtZVJ4Qnl0ZUNvdW50ID0gNzAwOwotCQkJCUFzaWNSZXNldEJCUChwQWQpOwotCQkJfQotCQl9Ci0KLQkJLy8gVXBkYXRlIGxhc3RSZWNlaXZlQnl0ZUNvdW50LgotCQlwQWQtPlJhbGlua0NvdW50ZXJzLkxhc3RSZWNlaXZlZEJ5dGVDb3VudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuUmVjZWl2ZWRCeXRlQ291bnQ7Ci0KLQkJaWYgKChwQWQtPkNoZWNrRG1hQnVzeUNvdW50ID4gMykgJiYgKElETEVfT04ocEFkKSkpCi0JCXsKLQkJCXBBZC0+Q2hlY2tEbWFCdXN5Q291bnQgPSAwOwotCQkJQXNpY1Jlc2V0RnJvbURNQUJ1c3kocEFkKTsKLQkJfQotCX0KLSNlbmRpZiAvKiBSVDI4NjAgKi8KLQlSVDI4WFhfTUxNRV9QUkVfU0FOSVRZX0NIRUNLKHBBZCk7CisJUlRNUF9NTE1FX1BSRV9TQU5JVFlfQ0hFQ0socEFkKTsKIAogCXsKLQkJLy8gRG8gbm90aGluZyBpZiBtb25pdG9yIG1vZGUgaXMgb24KKwkJLyogRG8gbm90aGluZyBpZiBtb25pdG9yIG1vZGUgaXMgb24gKi8KIAkJaWYgKE1PTklUT1JfT04ocEFkKSkKIAkJCXJldHVybjsKIAotCQlpZiAocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJiAweDEpCi0JCXsKLQkJCS8vIFRoaXMgaXMgdGhlIGZpeCBmb3Igd2lmaSAxMW4gZXh0ZW5zaW9uIGNoYW5uZWwgb3ZlcmxhcHBpbmcgdGVzdCBjYXNlLiAgZm9yIDI4NjBECisJCWlmIChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCAmIDB4MSkgeworCQkJLyogVGhpcyBpcyB0aGUgZml4IGZvciB3aWZpIDExbiBleHRlbnNpb24gY2hhbm5lbCBvdmVybGFwcGluZyB0ZXN0IGNhc2UuICBmb3IgMjg2MEQgKi8KIAkJCWlmICgoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPT0gMHgwMTAxKSAmJgotCQkJCShTVEFfVEdOX1dJRklfT04ocEFkKSkgJiYKLQkJCQkocEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iVG9nZ2xlID09IEZBTFNFKSkKLQotCQkJCXsKLQkJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhPUF9DVFJMX0NGRywgMHgyNEJmKTsKLQkJCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iVG9nZ2xlID0gVFJVRTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKFNUQV9UR05fV0lGSV9PTihwQWQpKSAmJgotCQkJCQkJKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpID09IDB4MDEwMSkpCi0JCQkJewotCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWE9QX0NUUkxfQ0ZHLCAweDI0M2YpOwotCQkJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJUb2dnbGUgPSBGQUxTRTsKLQkJCQl9CisJCQkgICAgKFNUQV9UR05fV0lGSV9PTihwQWQpKSAmJgorCQkJICAgIChwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJUb2dnbGUgPT0gRkFMU0UpKQorCQkJeworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYT1BfQ1RSTF9DRkcsIDB4MjRCZik7CisJCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iVG9nZ2xlID0gVFJVRTsKKwkJCX0gZWxzZSBpZiAoKFNUQV9UR05fV0lGSV9PTihwQWQpKSAmJgorCQkJCSAgICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA9PSAweDAxMDEpKSB7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhPUF9DVFJMX0NGRywgMHgyNDNmKTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJUb2dnbGUgPSBGQUxTRTsKKwkJCX0KIAkJfQogCX0KIAogCXBBZC0+YlVwZGF0ZUJjbkNudERvbmUgPSBGQUxTRTsKIAotLy8JUkVDQkFUaW1lclRpbWVvdXQoU3lzdGVtU3BlY2lmaWMxLEZ1bmN0aW9uQ29udGV4dCxTeXN0ZW1TcGVjaWZpYzIsU3lzdGVtU3BlY2lmaWMzKTsKLQlwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCArKzsKKy8qICAgICAgUkVDQkFUaW1lclRpbWVvdXQoU3lzdGVtU3BlY2lmaWMxLEZ1bmN0aW9uQ29udGV4dCxTeXN0ZW1TcGVjaWZpYzIsU3lzdGVtU3BlY2lmaWMzKTsgKi8KKwlwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCsrOwogCi0jaWZkZWYgUlQzMDcwCi0JLy8gZXhlY3V0ZSBldmVyeSAxMDBtcywgdXBkYXRlIHRoZSBUeCBGSUZPIENudCBmb3IgdXBkYXRlIFR4IFJhdGUuCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJLyogZXhlY3V0ZSBldmVyeSAxMDBtcywgdXBkYXRlIHRoZSBUeCBGSUZPIENudCBmb3IgdXBkYXRlIFR4IFJhdGUuICovCiAJTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKHBBZCk7Ci0jZW5kaWYgLy8gUlQzMDcwIC8vCi0JLy8gZXhlY3V0ZSBldmVyeSA1MDBtcwotCWlmICgocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJSA1ID09IDApICYmIFJUTVBBdXRvUmF0ZVN3aXRjaENoZWNrKHBBZCkvKihPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpKSovKQorI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCisJLyogZXhlY3V0ZSBldmVyeSA1MDBtcyAqLworCWlmICgocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJSA1ID09IDApCisJICAgICYmIFJUTVBBdXRvUmF0ZVN3aXRjaENoZWNrKHBBZCkKKwkgICAgLyooT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSkgKi8gKQogCXsKLQkJLy8gcGVyZm9ybSBkeW5hbWljIHR4IHJhdGUgc3dpdGNoaW5nIGJhc2VkIG9uIHBhc3QgVFggaGlzdG9yeQorCQkvKiBwZXJmb3JtIGR5bmFtaWMgdHggcmF0ZSBzd2l0Y2hpbmcgYmFzZWQgb24gcGFzdCBUWCBoaXN0b3J5ICovCiAJCXsKLQkJCWlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpCi0JCQkJCSkKLQkJCQkmJiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpKQorCQkJaWYgKChPUFNUQVRVU19URVNUX0ZMQUcKKwkJCSAgICAgKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpCisJCQkgICAgKQorCQkJICAgICYmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkpCiAJCQkJTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcocEFkKTsKIAkJfQogCX0KKwkvKiBOb3JtYWwgMSBzZWNvbmQgTWxtZSBQZXJpb2RpY0V4ZWMuICovCisJaWYgKHBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kICUgTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgPT0gMCkgeworCQlwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCsrOwogCi0JLy8gTm9ybWFsIDEgc2Vjb25kIE1sbWUgUGVyaW9kaWNFeGVjLgotCWlmIChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCAlTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgPT0gMCkKLQl7Ci0gICAgICAgICAgICAgICAgcEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgKys7CisJCS8qT1JJQkFUaW1lclRpbWVvdXQocEFkKTsgKi8KIAotCQlpZiAocnhfVG90YWwpCi0JCXsKLQotCQkJLy8gcmVzZXQgY291bnRlcnMKLQkJCXJ4X0FNU0RVID0gMDsKLQkJCXJ4X1RvdGFsID0gMDsKLQkJfQotCi0JCS8vIE1lZGlhIHN0YXR1cyBjaGFuZ2VkLCByZXBvcnQgdG8gTkRJUwotCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX01FRElBX1NUQVRFX0NIQU5HRSkpCi0JCXsKKwkJLyogTWVkaWEgc3RhdHVzIGNoYW5nZWQsIHJlcG9ydCB0byBORElTICovCisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfQ0hBTkdFKSkgewogCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9NRURJQV9TVEFURV9DSEFOR0UpOwotCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJCXsKLQkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRworCQkJICAgIChwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkgeworCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0KKwkJCQkgICAgTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CiAJCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKIAotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisJCQl9IGVsc2UgeworCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0KKwkJCQkgICAgTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CiAJCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKIAkJCX0KIAkJfQogCiAJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJnBBZC0+TWxtZS5Ob3czMik7CiAKLQkJLy8gYWRkIHRoZSBtb3N0IHVwLXRvLWRhdGUgaC93IHJhdyBjb3VudGVycyBpbnRvIHNvZnR3YXJlIHZhcmlhYmxlLCBzbyB0aGF0Ci0JCS8vIHRoZSBkeW5hbWljIHR1bmluZyBtZWNoYW5pc20gYmVsb3cgYXJlIGJhc2VkIG9uIG1vc3QgdXAtdG8tZGF0ZSBpbmZvcm1hdGlvbgorCQkvKiBhZGQgdGhlIG1vc3QgdXAtdG8tZGF0ZSBoL3cgcmF3IGNvdW50ZXJzIGludG8gc29mdHdhcmUgdmFyaWFibGUsIHNvIHRoYXQgKi8KKwkJLyogdGhlIGR5bmFtaWMgdHVuaW5nIG1lY2hhbmlzbSBiZWxvdyBhcmUgYmFzZWQgb24gbW9zdCB1cC10by1kYXRlIGluZm9ybWF0aW9uICovCiAJCU5JQ1VwZGF0ZVJhd0NvdW50ZXJzKHBBZCk7CiAKLSNpZmRlZiBSVDI4NzAKLQkJUlQyODcwX1dhdGNoRG9nKHBBZCk7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJCVJUVVNCV2F0Y2hEb2cocEFkKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotICAgCQkvLyBOZWVkIHN0YXRpc3RpY3MgYWZ0ZXIgcmVhZCBjb3VudGVyLiBTbyBwdXQgYWZ0ZXIgTklDVXBkYXRlUmF3Q291bnRlcnMKKwkJLyogTmVlZCBzdGF0aXN0aWNzIGFmdGVyIHJlYWQgY291bnRlci4gU28gcHV0IGFmdGVyIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzICovCiAJCU9SSUJBVGltZXJUaW1lb3V0KHBBZCk7CiAKLQkJLy8gVGhlIHRpbWUgcGVyaW9kIGZvciBjaGVja2luZyBhbnRlbm5hIGlzIGFjY29yZGluZyB0byB0cmFmZmljCi0JCWlmIChwQWQtPk1sbWUuYkVuYWJsZUF1dG9BbnRlbm5hQ2hlY2spCi0JCXsKLQkJCVR4VG90YWxDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKwotCQkJCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKLQkJCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKKwkJLyogaWYgTUdNVCBSSU5HIGlzIGZ1bGwgbW9yZSB0aGFuIHR3aWNlIHdpdGhpbiAxIHNlY29uZCwgd2UgY29uc2lkZXIgdGhlcmUncyAqLworCQkvKiBhIGhhcmR3YXJlIHByb2JsZW0gc3R1Y2tpbmcgdGhlIFRYIHBhdGguIEluIHRoaXMgY2FzZSwgdHJ5IGEgaGFyZHdhcmUgcmVzZXQgKi8KKwkJLyogdG8gcmVjb3ZlciB0aGUgc3lzdGVtICovCisJCS8qICAgICAgaWYgKHBBZC0+UmFsaW5rQ291bnRlcnMuTWdtdFJpbmdGdWxsQ291bnQgPj0gMikgKi8KKwkJLyogICAgICAgICAgICAgIFJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBUkRXQVJFX0VSUk9SKTsgKi8KKwkJLyogICAgICBlbHNlICovCisJCS8qICAgICAgICAgICAgICBwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50ID0gMDsgKi8KIAotCQkJLy8gZHluYW1pYyBhZGp1c3QgYW50ZW5uYSBldmFsdWF0aW9uIHBlcmlvZCBhY2NvcmRpbmcgdG8gdGhlIHRyYWZmaWMKLQkJCWlmIChUeFRvdGFsQ250ID4gNTApCi0JCQl7Ci0JCQkJaWYgKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgMTAgPT0gMCkKLQkJCQl7Ci0JCQkJCUFzaWNFdmFsdWF0ZVJ4QW50KHBBZCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDMgPT0gMCkKLQkJCQl7Ci0JCQkJCUFzaWNFdmFsdWF0ZVJ4QW50KHBBZCk7CisJCS8qIFRoZSB0aW1lIHBlcmlvZCBmb3IgY2hlY2tpbmcgYW50ZW5uYSBpcyBhY2NvcmRpbmcgdG8gdHJhZmZpYyAqLworCQl7CisJCQlpZiAocEFkLT5NbG1lLmJFbmFibGVBdXRvQW50ZW5uYUNoZWNrKSB7CisJCQkJVHhUb3RhbENudCA9CisJCQkJICAgIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArCisJCQkJICAgIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKworCQkJCSAgICBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50OworCisJCQkJLyogZHluYW1pYyBhZGp1c3QgYW50ZW5uYSBldmFsdWF0aW9uIHBlcmlvZCBhY2NvcmRpbmcgdG8gdGhlIHRyYWZmaWMgKi8KKwkJCQlpZiAoVHhUb3RhbENudCA+IDUwKSB7CisJCQkJCWlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlCisJCQkJCSAgICAxMCA9PSAwKSB7CisJCQkJCQlBc2ljRXZhbHVhdGVSeEFudChwQWQpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgMyA9PQorCQkJCQkgICAgMCkgeworCQkJCQkJQXNpY0V2YWx1YXRlUnhBbnQocEFkKTsKKwkJCQkJfQogCQkJCX0KIAkJCX0KIAkJfQpAQCAtOTk5LDM4MiArODc5LDQwIEBACiAJCU1sbWVSZXNldFJhbGlua0NvdW50ZXJzKHBBZCk7CiAKIAkJewotI2lmZGVmIFJUMjg2MAotCQkJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkgJiYgKHBBZC0+YlBDSWNsa09mZiA9PSBGQUxTRSkpCi0jZW5kaWYKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkJCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpCisJCQkgICAgJiYgKHBBZC0+YlBDSWNsa09mZiA9PSBGQUxTRSkpCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiAJCQl7Ci0JCQkJLy8gV2hlbiBBZGhvYyBiZWFjb24gaXMgZW5hYmxlZCBhbmQgUlRTL0NUUyBpcyBlbmFibGVkLCB0aGVyZSBpcyBhIGNoYW5jZSB0aGF0IGhhcmR3YXJlIE1BQyBGU00gd2lsbCBydW4gaW50byBhIGRlYWRsb2NrCi0JCQkJLy8gYW5kIHNlbmRpbmcgQ1RTLXRvLXNlbGYgb3ZlciBhbmQgb3Zlci4KLQkJCQkvLyBTb2Z0d2FyZSBQYXRjaCBTb2x1dGlvbjoKLQkJCQkvLyAxLiBQb2xsaW5nIGRlYnVnIHN0YXRlIHJlZ2lzdGVyIDB4MTBGNCBldmVyeSBvbmUgc2Vjb25kLgotCQkJCS8vIDIuIElmIGluIDB4MTBGNCB0aGUgKChiaXQyOT09MSkgJiYgKGJpdDc9PTEpKSBPUiAoKGJpdDI5PT0xKSAmJiAoYml0NT09MSkpLCBpdCBtZWFucyB0aGUgZGVhZGxvY2sgaGFzIG9jY3VycmVkLgotCQkJCS8vIDMuIElmIHRoZSBkZWFkbG9jayBvY2N1cnJlZCwgcmVzZXQgTUFDL0JCUCBieSBzZXR0aW5nIDB4MTAwNCB0byAweDAwMDEgZm9yIGEgd2hpbGUgdGhlbiBzZXR0aW5nIGl0IGJhY2sgdG8gMHgwMDBDIGFnYWluLgorCQkJCS8qIFdoZW4gQWRob2MgYmVhY29uIGlzIGVuYWJsZWQgYW5kIFJUUy9DVFMgaXMgZW5hYmxlZCwgdGhlcmUgaXMgYSBjaGFuY2UgdGhhdCBoYXJkd2FyZSBNQUMgRlNNIHdpbGwgcnVuIGludG8gYSBkZWFkbG9jayAqLworCQkJCS8qIGFuZCBzZW5kaW5nIENUUy10by1zZWxmIG92ZXIgYW5kIG92ZXIuICovCisJCQkJLyogU29mdHdhcmUgUGF0Y2ggU29sdXRpb246ICovCisJCQkJLyogMS4gUG9sbGluZyBkZWJ1ZyBzdGF0ZSByZWdpc3RlciAweDEwRjQgZXZlcnkgb25lIHNlY29uZC4gKi8KKwkJCQkvKiAyLiBJZiBpbiAweDEwRjQgdGhlICgoYml0Mjk9PTEpICYmIChiaXQ3PT0xKSkgT1IgKChiaXQyOT09MSkgJiYgKGJpdDU9PTEpKSwgaXQgbWVhbnMgdGhlIGRlYWRsb2NrIGhhcyBvY2N1cnJlZC4gKi8KKwkJCQkvKiAzLiBJZiB0aGUgZGVhZGxvY2sgb2NjdXJyZWQsIHJlc2V0IE1BQy9CQlAgYnkgc2V0dGluZyAweDEwMDQgdG8gMHgwMDAxIGZvciBhIHdoaWxlIHRoZW4gc2V0dGluZyBpdCBiYWNrIHRvIDB4MDAwQyBhZ2Fpbi4gKi8KIAotCQkJCVVJTlQzMglNYWNSZWcgPSAwOworCQkJCXUzMiBNYWNSZWcgPSAwOwogCiAJCQkJUlRNUF9JT19SRUFEMzIocEFkLCAweDEwRjQsICZNYWNSZWcpOwotCQkJCWlmICgoKE1hY1JlZyAmIDB4MjAwMDAwMDApICYmIChNYWNSZWcgJiAweDgwKSkgfHwgKChNYWNSZWcgJiAweDIwMDAwMDAwKSAmJiAoTWFjUmVnICYgMHgyMCkpKQotCQkJCXsKKwkJCQlpZiAoKChNYWNSZWcgJiAweDIwMDAwMDAwKSAmJiAoTWFjUmVnICYgMHg4MCkpCisJCQkJICAgIHx8ICgoTWFjUmVnICYgMHgyMDAwMDAwMCkKKwkJCQkJJiYgKE1hY1JlZyAmIDB4MjApKSkgewogCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MSk7CiAJCQkJCVJUTVB1c2VjRGVsYXkoMSk7CiAJCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHhDKTsKIAotCQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCgiV2FybmluZywgTUFDIHNwZWNpZmljIGNvbmRpdGlvbiBvY2N1cnMgXG4iKSk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sCisJCQkJCQkgKCJXYXJuaW5nLCBNQUMgc3BlY2lmaWMgY29uZGl0aW9uIG9jY3VycyBcbiIpKTsKIAkJCQl9CiAJCQl9CiAJCX0KIAotCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7CiAJfQogCiAJcEFkLT5iVXBkYXRlQmNuQ250RG9uZSA9IEZBTFNFOwogfQogCi1WT0lEIFNUQU1sbWVQZXJpb2RpY0V4ZWMoCi0JUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0jaWZkZWYgUlQyODYwCi0JVUxPTkcJCQkgICAgVHhUb3RhbENudDsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCVVMT05HCVR4VG90YWxDbnQ7Ci0JaW50IAlpOwotI2VuZGlmCi0KLSAgICBpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCi0gICAgewotICAgIAkvLyBXUEEgTUlDIGVycm9yIHNob3VsZCBibG9jayBhc3NvY2lhdGlvbiBhdHRlbXB0IGZvciA2MCBzZWNvbmRzCi0gICAgCWlmIChwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyAmJiAocEFkLT5TdGFDZmcuTGFzdE1pY0Vycm9yVGltZSArICg2MCAqIE9TX0haKSA8IHBBZC0+TWxtZS5Ob3czMikpCi0gICAgCQlwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9IEZBTFNFOwotICAgIH0KLQotI2lmZGVmIFJUMjg2MAotCS8vQmFyb24gMjAwOC8wNy8xMAotCS8vcHJpbnRrKCJCYXJvbl9UZXN0Olx0JXMiLCBSVE1QR2V0UmFsaW5rRW5jcnlNb2RlU3RyKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykpOwotCS8vSWYgdGhlIFNUQSBzZWN1cml0eSBzZXR0aW5nIGlzIE9QRU4gb3IgV0VQLCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSAwLgotCS8vSWYgdGhlIFNUQSBzZWN1cml0eSBzZXR0aW5nIGlzIFdQQVBTSyBvciBXUEEyUFNLLCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSAxLgotCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1czwyKQotCXsKLQkJcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gMDsKLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gMTsKLQl9Ci0jZW5kaWYKLQotICAgIGlmICgocEFkLT5QcmVNZWRpYVN0YXRlICE9IHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlKSAmJiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpKQotCXsKLQkJaWYgKHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQotCQl7Ci0JCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS1VQX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7Ci0JCX0KLQkJcEFkLT5QcmVNZWRpYVN0YXRlID0gcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGU7Ci0JfQotCi0jaWZkZWYgUlQyODYwCi0JaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiAoSURMRV9PTihwQWQpKSAmJgotICAgICAgICAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKSAmJgotCQkocEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9PSBTWU5DX0lETEUpICYmCi0JCShwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkgJiYKLQkJKFJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1NUQVJUX1VQKSkgJiYKLQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpKSkKLQl7Ci0JCVJUMjh4eFBjaUFzaWNSYWRpb09mZihwQWQsIEdVSV9JRExFX1BPV0VSX1NBVkUsIDApOwotCX0KLSNlbmRpZgotCi0KLQotICAgCUFzaWNTdGFCYnBUdW5pbmcocEFkKTsKLQotCVR4VG90YWxDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKwotCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArCi0JCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50OwotCi0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQl7Ci0JCS8vIHVwZGF0ZSBjaGFubmVsIHF1YWxpdHkgZm9yIFJvYW1pbmcgYW5kIFVJIExpbmtRdWFsaXR5IGRpc3BsYXkKLQkJTWxtZUNhbGN1bGF0ZUNoYW5uZWxRdWFsaXR5KHBBZCwgcEFkLT5NbG1lLk5vdzMyKTsKLQl9Ci0KLQkvLyBtdXN0IGJlIEFGVEVSIE1sbWVEeW5hbWljVHhSYXRlU3dpdGNoaW5nKCkgYmVjYXVzZSBpdCBuZWVkcyB0byBrbm93IGlmCi0JLy8gUmFkaW8gaXMgY3VycmVudGx5IGluIG5vaXN5IGVudmlyb25tZW50Ci0JaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQotCQlBc2ljQWRqdXN0VHhQb3dlcihwQWQpOwotCi0JaWYgKElORlJBX09OKHBBZCkpCi0JewotCQkvLyBJcyBQU00gYml0IGNvbnNpc3RlbnQgd2l0aCB1c2VyIHBvd2VyIG1hbmFnZW1lbnQgcG9saWN5PwotCQkvLyBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIHRoYXQgd2lsbCBzZXQgUFNNIGJpdCBPTi4KLQkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQotCQlNbG1lQ2hlY2tQc21DaGFuZ2UocEFkLCBwQWQtPk1sbWUuTm93MzIpOwotCi0JCXBBZC0+UmFsaW5rQ291bnRlcnMuTGFzdE9uZVNlY1RvdGFsVHhDb3VudCA9IFR4VG90YWxDbnQ7Ci0KLQkJaWYgKChwQWQtPlN0YUNmZy5MYXN0QmVhY29uUnhUaW1lICsgMSpPU19IWiA8IHBBZC0+TWxtZS5Ob3czMikgJiYKLQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgJiYKLQkJCSgoVHhUb3RhbENudCArIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0NudCA8IDYwMCkpKQotCQl7Ci0JCQlSVE1QU2V0QUdDSW5pdFZhbHVlKHBBZCwgQldfMjApOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBObyBCRUFDT04uIHJlc3RvcmUgUjY2IHRvIHRoZSBsb3cgYm91bmQoJWQpIFxuIiwgKDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKSkpKTsKLQkJfQotCi0gICAgICAgIHsKLSAgICAJCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQVBTRENhcGFibGUpCi0gICAgCQl7Ci0gICAgCQkgICAgLy8gV2hlbiBBUFNEIGlzIGVuYWJsZWQsIHRoZSBwZXJpb2QgY2hhbmdlcyBhcyAyMCBzZWMKLSAgICAJCQlpZiAoKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgMjApID09IDgpCi0gICAgCQkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwgcEFkLT5Db21tb25DZmcuVHhSYXRlLCBUUlVFKTsKLSAgICAJCX0KLSAgICAJCWVsc2UKLSAgICAJCXsKLSAgICAJCSAgICAvLyBTZW5kIG91dCBhIE5VTEwgZnJhbWUgZXZlcnkgMTAgc2VjIHRvIGluZm9ybSBBUCB0aGF0IFNUQSBpcyBzdGlsbCBhbGl2ZSAoQXZvaWQgYmVpbmcgYWdlIG91dCkKLSAgICAJCQlpZiAoKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgMTApID09IDgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAocEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpCi0gICAgCQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLQkJCQkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwgcEFkLT5Db21tb25DZmcuVHhSYXRlLCBGQUxTRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgIAkJfQotICAgICAgICB9Ci0KLQkJaWYgKENRSV9JU19ERUFEKHBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSkpCi0JCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIE5vIEJFQUNPTi4gRGVhZCBDUUkuIEF1dG8gUmVjb3ZlcnkgYXR0ZW1wdCAjJWxkXG4iLCBwQWQtPlJhbGlua0NvdW50ZXJzLkJhZENRSUF1dG9SZWNvdmVyeUNvdW50KSk7Ci0JCQlwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQUmVwb3J0RmxhZyA9IFRSVUU7Ci0JCQlwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQTGlua0Rvd25UaW1lID0gcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZTsKLQotCQkJLy8gTG9zdCBBUCwgc2VuZCBkaXNjb25uZWN0ICYgbGluayBkb3duIGV2ZW50Ci0JCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKLQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKLSAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7Ci0gICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOwotICAgICAgICAgICAgfQotCi0JCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7Ci0JCX0KLQkJZWxzZSBpZiAoQ1FJX0lTX0JBRChwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkpKQotCQl7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLkJhZENRSUF1dG9SZWNvdmVyeUNvdW50ICsrOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBCYWQgQ1FJLiBBdXRvIFJlY292ZXJ5IGF0dGVtcHQgIyVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5CYWRDUUlBdXRvUmVjb3ZlcnlDb3VudCkpOwotCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOwotCQl9Ci0KLQkJLy8gQWRkIGF1dG8gc2VhbWxlc3Mgcm9hbWluZwotCQlpZiAocEFkLT5TdGFDZmcuYkZhc3RSb2FtaW5nKQotCQl7Ci0JCQlTSE9SVAlkQm1Ub1JvYW0gPSAoU0hPUlQpcEFkLT5TdGFDZmcuZEJtVG9Sb2FtOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSc3NpPSVkLCBkQm1Ub1JvYW09JWRcbiIsIFJUTVBNYXhSc3NpKHBBZCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMiksIChDSEFSKWRCbVRvUm9hbSkpOwotCi0JCQlpZiAoUlRNUE1heFJzc2kocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKSA8PSAoQ0hBUilkQm1Ub1JvYW0pCi0JCQl7Ci0JCQkJTWxtZUNoZWNrRm9yRmFzdFJvYW1pbmcocEFkLCBwQWQtPk1sbWUuTm93MzIpOwotCQkJfQotCQl9Ci0JfQotCWVsc2UgaWYgKEFESE9DX09OKHBBZCkpCi0JewotI2lmZGVmIFJUMjg2MAotCQkvLyAyMDAzLTA0LTE3IGpvaG4uIHRoaXMgaXMgYSBwYXRjaCB0aGF0IGRyaXZlciBmb3JjZXMgYSBCRUFDT04gb3V0IGlmIEFTSUMgZmFpbHMKLQkJLy8gdGhlICJUWCBCRUFDT04gY29tcGV0aXRpb24iIGZvciB0aGUgZW50aXJlIHBhc3QgMSBzZWMuCi0JCS8vIFNvIHRoYXQgZXZlbiB3aGVuIEFTSUMncyBCRUFDT05nZW4gZW5naW5lIGJlZW4gYmxvY2tlZAotCQkvLyBieSBwZWVyJ3MgQkVBQ09OIGR1ZSB0byBzbG93ZXIgc3lzdGVtIGNsb2NrLCB0aGlzIFNUQSBzdGlsbCBjYW4gc2VuZCBvdXQKLQkJLy8gbWluaW11bSBCRUFDT04gdG8gdGVsbCB0aGUgcGVlciBJJ20gYWxpdmUuCi0JCS8vIGRyYXdiYWNrIGlzIHRoYXQgdGhpcyBCRUFDT04gd29uJ3QgYmUgd2VsbCBhbGlnbmVkIGF0IFRCVFQgYm91bmRhcnkuCi0JCS8vIEVucXVldWVCZWFjb25GcmFtZShwQWQpOwkJCSAgLy8gc29mdHdhcmUgc2VuZCBCRUFDT04KLQotCQkvLyBpZiBhbGwgMTFiIHBlZXJzIGxlYXZlIHRoaXMgQlNTIG1vcmUgdGhhbiA1IHNlY29uZHMsIHVwZGF0ZSBUeCByYXRlLAotCQkvLyByZXN0b3JlIG91dGdvaW5nIEJFQUNPTiB0byBzdXBwb3J0IEIvRy1taXhlZCBtb2RlCi0JCWlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkJCQkgICAmJgotCQkJKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA8PSBSQVRFXzExKQkgICAmJgotCQkJKHBBZC0+Q29tbW9uQ2ZnLk1heERlc2lyZWRSYXRlID4gUkFURV8xMSkgICYmCi0JCQkoKHBBZC0+U3RhQ2ZnLkxhc3QxMWJCZWFjb25SeFRpbWUgKyA1Kk9TX0haKSA8IHBBZC0+TWxtZS5Ob3czMikpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gbGFzdCAxMUIgcGVlciBsZWZ0LCB1cGRhdGUgVHggcmF0ZXNcbiIpKTsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cFJhdGUsIHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKLQkJCXBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuOwotCQkJTWxtZVVwZGF0ZVR4UmF0ZXMocEFkLCBGQUxTRSwgMCk7Ci0JCQlNYWtlSWJzc0JlYWNvbihwQWQpOwkJLy8gcmUtYnVpbGQgQkVBQ09OIGZyYW1lCi0JCQlBc2ljRW5hYmxlSWJzc1N5bmMocEFkKTsJLy8gY29weSB0byBvbi1jaGlwIG1lbW9yeQotCQkJcEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCA9IEZBTFNFOwotCQl9Ci0KLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKLQkJewotCQkJaWYgKChwQWQtPlN0YUNmZy5BZGhvY0JHSm9pbmVkKSAmJgotCQkJCSgocEFkLT5TdGFDZmcuTGFzdDExZ0JlYWNvblJ4VGltZSArIDUgKiBPU19IWikgPCBwQWQtPk1sbWUuTm93MzIpKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gbGFzdCAxMUcgcGVlciBsZWZ0XG4iKSk7Ci0JCQkJcEFkLT5TdGFDZmcuQWRob2NCR0pvaW5lZCA9IEZBTFNFOwotCQkJfQotCi0JCQlpZiAoKHBBZC0+U3RhQ2ZnLkFkaG9jMjBOSm9pbmVkKSAmJgotCQkJCSgocEFkLT5TdGFDZmcuTGFzdDIwTkJlYWNvblJ4VGltZSArIDUgKiBPU19IWikgPCBwQWQtPk1sbWUuTm93MzIpKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gbGFzdCAyME1IeiBOIHBlZXIgbGVmdFxuIikpOwotCQkJCXBBZC0+U3RhQ2ZnLkFkaG9jMjBOSm9pbmVkID0gRkFMU0U7Ci0JCQl9Ci0JCX0KLSNlbmRpZiAvKiBSVDI4NjAgKi8KLQotCQkvL3JhZGFyIGRldGVjdAotCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKLQkJCSYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQotCQkJJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSkKLQkJewotCQkJUmFkYXJEZXRlY3RQZXJpb2RpYyhwQWQpOwotCQl9Ci0KLQkJLy8gSWYgYWxsIHBlZXJzIGxlYXZlLCBhbmQgdGhpcyBTVEEgYmVjb21lcyB0aGUgbGFzdCBvbmUgaW4gdGhpcyBJQlNTLCB0aGVuIGNoYW5nZSBNZWRpYVN0YXRlCi0JCS8vIHRvIERJU0NPTk5FQ1RFRC4gQnV0IHN0aWxsIGhvbGRpbmcgdGhpcyBJQlNTIChpLmUuIHNlbmRpbmcgQkVBQ09OKSBzbyB0aGF0IG90aGVyIFNUQXMgY2FuCi0JCS8vIGpvaW4gbGF0ZXIuCi0JCWlmICgocEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSArIEFESE9DX0JFQUNPTl9MT1NUX1RJTUUgPCBwQWQtPk1sbWUuTm93MzIpICYmCi0JCQlPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCi0JCXsKLQkJCU1MTUVfU1RBUlRfUkVRX1NUUlVDVCAgICAgU3RhcnRSZXE7Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gZXhjZXNzaXZlIEJFQUNPTiBsb3N0LCBsYXN0IFNUQSBpbiB0aGlzIElCU1MsIE1lZGlhU3RhdGU9RGlzY29ubmVjdGVkXG4iKSk7Ci0JCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKLQotCQkJU3RhcnRQYXJtRmlsbChwQWQsICZTdGFydFJlcSwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TVEFSVF9SRVEsIHNpemVvZihNTE1FX1NUQVJUX1JFUV9TVFJVQ1QpLCAmU3RhcnRSZXEpOwotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9TVEFSVDsKLQkJfQotCi0jaWZkZWYgUlQyODcwCi0JCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQotCQl7Ci0JCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOwotCi0JCQlpZiAocEVudHJ5LT5WYWxpZEFzQ0xJID09IEZBTFNFKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAocEVudHJ5LT5MYXN0QmVhY29uUnhUaW1lICsgQURIT0NfQkVBQ09OX0xPU1RfVElNRSA8IHBBZC0+TWxtZS5Ob3czMikKLQkJCQlNYWNUYWJsZURlbGV0ZUVudHJ5KHBBZCwgcEVudHJ5LT5BaWQsIHBFbnRyeS0+QWRkcik7Ci0JCX0KLSNlbmRpZgotCX0KLQllbHNlIC8vIG5vIElORlJBIG5vciBBREhPQyBjb25uZWN0aW9uCi0JewotCi0JCWlmIChwQWQtPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJICYmCi0gICAgICAgICAgICAoKHBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSArIDMwICogT1NfSFopID4gcEFkLT5NbG1lLk5vdzMyKSkKLQkJCWdvdG8gU0tJUF9BVVRPX1NDQU5fQ09OTjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOwotCi0JCWlmICgocEFkLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPT0gVFJVRSkKLQkJCSYmIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkKLQkJCSYmIChNbG1lVmFsaWRhdGVTU0lEKHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKSA9PSBUUlVFKSkKLQkJewotCQkJaWYgKChwQWQtPlNjYW5UYWIuQnNzTnI9PTApICYmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkpCi0JCQl7Ci0JCQkJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QJICAgU2NhblJlcTsKLQotCQkJCWlmICgocEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lICsgMTAgKiBPU19IWikgPCBwQWQtPk1sbWUuTm93MzIpCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTVEFNbG1lUGVyaW9kaWNFeGVjKCk6Q05UTCAtIFNjYW5UYWIuQnNzTnI9PTAsIHN0YXJ0IGEgbmV3IEFDVElWRSBzY2FuIFNTSURbJXNdXG4iLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQpKTsKLQkJCQkJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuLCBCU1NfQU5ZLCBTQ0FOX0FDVElWRSk7Ci0JCQkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwgc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOwotCQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47Ci0JCQkJCS8vIFJlc2V0IE1pc3NlZCBzY2FuIG51bWJlcgotCQkJCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBwQWQtPk1sbWUuTm93MzI7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQkvLyBRdWl0IHRoZSBmb3JldmVyIHNjYW4gd2hlbiBpbiBhIHZlcnkgY2xlYW4gcm9vbQotCQkJCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkKLQkJCXsKLQkJCQlpZiAoKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgNykgPT0gMCkKLQkJCQl7Ci0JCQkJCU1sbWVBdXRvU2NhbihwQWQpOwotCQkJCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBwQWQtPk1sbWUuTm93MzI7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi1TS0lQX0FVVE9fU0NBTl9DT05OOgotCi0gICAgaWYgKChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlRYQkFiaXRtYXAgIT0wKSAmJiAocEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbiA9PSBGQUxTRSkpCi0JewotCQlwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uID0gVFJVRTsKLQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBIVF9GT1JDRVJUU0NUUywgIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIEZBTFNFKTsKLQl9Ci0JZWxzZSBpZiAoKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uVFhCQWJpdG1hcCA9PTApICYmIChwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uID09IFRSVUUpKQotCXsKLQkJcEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbiA9IEZBTFNFOwotCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsICBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBGQUxTRSk7Ci0JfQotCi0JcmV0dXJuOwotfQotCi0vLyBMaW5rIGRvd24gcmVwb3J0Ci1WT0lEIExpbmtEb3duRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCi17Ci0KLQlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7Ci0KLQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOwotCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7Ci0gICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKLX0KLQotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIE1sbWVBdXRvU2NhbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQkvLyBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdAotCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gRHJpdmVyIGF1dG8gc2NhblxuIikpOwotCQlNbG1lRW5xdWV1ZShwQWQsCi0JCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAotCQkJCQlPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwKLQkJCQkJMCwKLQkJCQkJTlVMTCk7Ci0JCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKLQl9Ci19Ci0KLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRCBNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCi0KLQkvLyBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdAotCWlmICgocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpICYmCi0JCShNbG1lVmFsaWRhdGVTU0lEKHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKSA9PSBUUlVFKSkKLQl7Ci0JCU5ESVNfODAyXzExX1NTSUQgT2lkU3NpZDsKLQkJT2lkU3NpZC5Tc2lkTGVuZ3RoID0gcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuOwotCQlOZGlzTW92ZU1lbW9yeShPaWRTc2lkLlNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEcml2ZXIgYXV0byByZWNvbm5lY3QgdG8gbGFzdCBPSURfODAyXzExX1NTSUQgc2V0dGluZyAtICVzLCBsZW4gLSAlZFxuIiwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pKTsKLQkJTWxtZUVucXVldWUocEFkLAotCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKLQkJCQkJT0lEXzgwMl8xMV9TU0lELAotCQkJCQlzaXplb2YoTkRJU184MDJfMTFfU1NJRCksCi0JCQkJCSZPaWRTc2lkKTsKLQkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOwotCX0KLX0KLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCVZhbGlkYXRlIFNTSUQgZm9yIGNvbm5lY3Rpb24gdHJ5IGFuZCByZXNjYW4gcHVycG9zZQpAQCAtMTM4MywzOCArOTIxLDMxIEBACiAJSVJRTCA9IERJU1BBVENIX0xFVkVMCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotQk9PTEVBTiBNbG1lVmFsaWRhdGVTU0lEKAotCUlOIFBVQ0hBUglwU3NpZCwKLQlJTiBVQ0hBUglTc2lkTGVuKQorQk9PTEVBTiBNbG1lVmFsaWRhdGVTU0lEKHU4ICpwU3NpZCwgdTggU3NpZExlbikKIHsKLQlpbnQJaW5kZXg7CisJaW50IGluZGV4OwogCiAJaWYgKFNzaWRMZW4gPiBNQVhfTEVOX09GX1NTSUQpCiAJCXJldHVybiAoRkFMU0UpOwogCi0JLy8gQ2hlY2sgZWFjaCBjaGFyYWN0ZXIgdmFsdWUKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTc2lkTGVuOyBpbmRleCsrKQotCXsKKwkvKiBDaGVjayBlYWNoIGNoYXJhY3RlciB2YWx1ZSAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNzaWRMZW47IGluZGV4KyspIHsKIAkJaWYgKHBTc2lkW2luZGV4XSA8IDB4MjApCiAJCQlyZXR1cm4gKEZBTFNFKTsKIAl9CiAKLQkvLyBBbGwgY2hlY2tlZAorCS8qIEFsbCBjaGVja2VkICovCiAJcmV0dXJuIChUUlVFKTsKIH0KIAotVk9JRCBNbG1lU2VsZWN0VHhSYXRlVGFibGUoCi0JSU4gUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOIFBNQUNfVEFCTEVfRU5UUlkJCXBFbnRyeSwKLQlJTiBQVUNIQVIJCQkJKnBwVGFibGUsCi0JSU4gUFVDSEFSCQkJCXBUYWJsZVNpemUsCi0JSU4gUFVDSEFSCQkJCXBJbml0VHhSYXRlSWR4KQordm9pZCBNbG1lU2VsZWN0VHhSYXRlVGFibGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LAorCQkJICAgdTggKiogcHBUYWJsZSwKKwkJCSAgIHU4ICpwVGFibGVTaXplLCB1OCAqcEluaXRUeFJhdGVJZHgpCiB7Ci0JZG8KLQl7Ci0JCS8vIGRlY2lkZSB0aGUgcmF0ZSB0YWJsZSBmb3IgdHVuaW5nCi0JCWlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGVUYWJsZVNpemUgPiAwKQotCQl7CisJZG8geworCQkvKiBkZWNpZGUgdGhlIHJhdGUgdGFibGUgZm9yIHR1bmluZyAqLworCQlpZiAocEFkLT5Db21tb25DZmcuVHhSYXRlVGFibGVTaXplID4gMCkgewogCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGU7CiAJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZVswXTsKIAkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZVsxXTsKQEAgLTE0MjIsODQgKzk1Myw0MCBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIEFESE9DX09OKHBBZCkpCi0JCXsKLQkJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSAmJgotI2lmZGVmIFJUMjg2MAotCQkJCSFwQWQtPlN0YUNmZy5BZGhvY0JPbmx5Sm9pbmVkICYmCi0JCQkJIXBBZC0+U3RhQ2ZnLkFkaG9jQkdKb2luZWQgJiYKLQkJCQkocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMHhmZikgJiYKLQkJCQkoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDB4MDApIHx8IChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpKSkKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQkJCShwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMHhmZikgJiYKLQkJCQkoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweDAwKSB8fCAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKSkpCi0jZW5kaWYKLQkJCXsvLyAxMU4gMVMgQWRob2MKKwkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiBBREhPQ19PTihwQWQpKSB7CisJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJiAoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweDAwKSB8fCAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKSkpIHsJLyogMTFOIDFTIEFkaG9jICovCiAJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4xUzsKIAkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzBdOwogCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzFdOwogCi0JCQl9Ci0JCQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSAmJgotI2lmZGVmIFJUMjg2MAotCQkJCQkhcEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCAmJgotCQkJCQkhcEFkLT5TdGFDZmcuQWRob2NCR0pvaW5lZCAmJgotCQkJCQkocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMHhmZikgJiYKLQkJCQkJKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDB4ZmYpICYmCi0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQkJCQkJKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJgotCQkJCQkocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4ZmYpICYmCi0jZW5kaWYKLQkJCQkJKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCi0JCQl7Ly8gMTFOIDJTIEFkaG9jCi0JCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKLQkJCQl7CisJCQl9IGVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMHhmZikgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweGZmKSAmJiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkgewkvKiAxMU4gMlMgQWRob2MgKi8KKwkJCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KSB7CiAJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlM7CiAJCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMF07Ci0JCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTWzFdOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJeworCQkJCQkqcEluaXRUeFJhdGVJZHggPQorCQkJCQkgICAgUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMV07CisJCQkJfSBlbHNlIHsKIAkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kOwotCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMF07Ci0JCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMV07CisJCQkJCSpwVGFibGVTaXplID0KKwkJCQkJICAgIFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9CisJCQkJCSAgICBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzFdOwogCQkJCX0KIAotCQkJfQotCQkJZWxzZQotI2lmZGVmIFJUMjg2MAotCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCi0JCQl7CisJCQl9IGVsc2UgaWYgKChwRW50cnktPlJhdGVMZW4gPT0gNCkKKwkJCQkgICAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApCisJCQkJICAgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKQorCQkJICAgICkgewogCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCOwogCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzBdOwogCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQlsxXTsKIAotCQkJfQotCSAgICAgICAgZWxzZSBpZigocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KSAmJiAocEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCA9PSBUUlVFKSkKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQkJCWlmICgocEVudHJ5LT5SYXRlTGVuID09IDQpCi0JCQkJCSYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKQotCQkJCQkpCi0jZW5kaWYKLQkJCXsKLQkJCQkvLyBVU2UgQiBUYWJsZSB3aGVuIE9ubHkgYi1vbmx5IFN0YXRpb24gaW4gbXkgSUJTUyAuCi0JCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUI7Ci0JCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJbMF07Ci0JCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzFdOwotCi0JCQl9Ci0JCQllbHNlIGlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCi0JCQl7CisJCQl9IGVsc2UgaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkgewogCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCRzsKIAkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdbMF07CiAJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCR1sxXTsKIAotCQkJfQotCQkJZWxzZQotCQkJeworCQkJfSBlbHNlIHsKIAkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExRzsKIAkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExR1swXTsKIAkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUdbMV07CkBAIC0xNTA3LDkxICs5OTQsODIgQEAKIAkJCX0KIAkJCWJyZWFrOwogCQl9Ci0KLQkJaWYgKChwRW50cnktPlJhdGVMZW4gPT0gMTIpICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMHhmZikgJiYKLQkJCSgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4MDApIHx8IChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAxKSkpCi0JCXsvLyAxMUJHTiAxUyBBUAorCQkvKmlmICgocEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiArIHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPT0gMTIpICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAweGZmKSAmJiAqLworCQkvKiAgICAgICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMHgwMCkgfHwgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkpKSAqLworCQlpZiAoKChwRW50cnktPlJhdGVMZW4gPT0gMTIpIHx8IChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJiAoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweDAwKSB8fCAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkpKSB7CS8qIDExQkdOIDFTIEFQICovCiAJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMVM7CiAJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMVNbMF07CiAJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHTjFTWzFdOwogCiAJCQlicmVhazsKIAkJfQotCi0JCWlmICgocEVudHJ5LT5SYXRlTGVuID09IDEyKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmCi0JCQkocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAyKSkKLQkJey8vIDExQkdOIDJTIEFQCi0JCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQotCQkJeworCQkvKmVsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuICsgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9PSAxMikgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDB4ZmYpICYmICovCisJCS8qICAgICAgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKSAqLworCQlpZiAoKChwRW50cnktPlJhdGVMZW4gPT0gMTIpIHx8IChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAyKSkgewkvKiAxMUJHTiAyUyBBUCAqLworCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkgewogCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yUzsKIAkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNbMF07CiAJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yU1sxXTsKIAotCQkJfQotCQkJZWxzZQotCQkJeworCQkJfSBlbHNlIHsKIAkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZDsKIAkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZFswXTsKLQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmRbMV07CisJCQkJKnBJbml0VHhSYXRlSWR4ID0KKwkJCQkgICAgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kWzFdOwogCiAJCQl9CiAJCQlicmVhazsKIAkJfQotCi0JCWlmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4MDApIHx8IChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAxKSkpCi0JCXsvLyAxMU4gMVMgQVAKKwkJLyplbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMHhmZikgJiYgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAweDAwKSB8fCAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKSkpICovCisJCWlmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4MDApIHx8IChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAxKSkpIHsJLyogMTFOIDFTIEFQICovCiAJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTOwogCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4xU1swXTsKIAkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzFdOwogCiAJCQlicmVhazsKIAkJfQotCi0JCWlmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMHhmZikgJiYgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDIpKQotCQl7Ly8gMTFOIDJTIEFQCi0JCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQotCQkJewotCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yUzsKLQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMF07Ci0JCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU1sxXTsKLSAgICAgICAgICAgIH0KLQkJCWVsc2UKLQkJCXsKKwkJLyplbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMHhmZikgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKSAqLworCQlpZiAoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAyKSkgewkvKiAxMU4gMlMgQVAgKi8KKwkJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpIHsKKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTOworCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMF07CisJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMV07CisJCQl9IGVsc2UgewogCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZDsKIAkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMF07Ci0JCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFsxXTsKKwkJCQkqcEluaXRUeFJhdGVJZHggPQorCQkJCSAgICBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzFdOwogCQkJfQogCiAJCQlicmVhazsKIAkJfQotCi0JCS8vZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gPT0gNCkgJiYgKHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPT0gMCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAwKSkKLQkJaWYgKHBFbnRyeS0+UmF0ZUxlbiA9PSA0KQotCQl7Ly8gQiBvbmx5IEFQCisJCS8qZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gPT0gNCkgJiYgKHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPT0gMCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAwKSkgKi8KKwkJaWYgKChwRW50cnktPlJhdGVMZW4gPT0gNCB8fCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCisJCSAgICAvKkl2ZXJzb24gbWFyayBmb3IgQWRob2MgYiBtb2RlLHN0YSB3aWxsIHVzZSByYXRlIDU0ICBNYnBzIHdoZW4gY29ubmVjdCB3aXRoIHN0YSBiL2cvbiBtb2RlICovCisJCSAgICAvKiAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkgKi8KKwkJICAgICkgewkJLyogQiBvbmx5IEFQICovCiAJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQjsKIAkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzBdOwogCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzFdOwogCiAJCQlicmVhazsKIAkJfQotCi0JCS8vZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gKyBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID4gOCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAwKSkKKwkJLyplbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiArIHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPiA4KSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDApKSAqLwogCQlpZiAoKHBFbnRyeS0+UmF0ZUxlbiA+IDgpCi0JCQkmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkKLQkJCSkKLQkJey8vIEIvRyAgbWl4ZWQgQVAKKwkJICAgICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkKKwkJICAgICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkKKwkJICAgICkgewkJLyogQi9HICBtaXhlZCBBUCAqLwogCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUJHOwogCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHWzBdOwogCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCR1sxXTsKIAogCQkJYnJlYWs7CiAJCX0KLQotCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuICsgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9PSA4KSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDApKQorCQkvKmVsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuICsgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9PSA4KSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDApKSAqLwogCQlpZiAoKHBFbnRyeS0+UmF0ZUxlbiA9PSA4KQotCQkJJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAwKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDApCi0JCQkpCi0JCXsvLyBHIG9ubHkgQVAKKwkJICAgICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkKKwkJICAgICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkKKwkJICAgICkgewkJLyogRyBvbmx5IEFQICovCiAJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExRzsKIAkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFHWzBdOwogCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFHWzFdOwpAQCAtMTYwMCw3MCArMTA3OCw0OTYgQEAKIAkJfQogCiAJCXsKLQkJCS8vZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAwKSkKLQkJCWlmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkpCi0JCQl7CS8vIExlZ2FjeSBtb2RlCi0JCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA8PSBSQVRFXzExKQotCQkJCXsKKwkJCS8qZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAwKSkgKi8KKwkJCWlmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkpIHsJLyogTGVnYWN5IG1vZGUgKi8KKwkJCQlpZiAocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlIDw9IFJBVEVfMTEpIHsKIAkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUI7CiAJCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzBdOwogCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJbMV07Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPiBSQVRFXzExKSAmJiAocEFkLT5Db21tb25DZmcuTWluVHhSYXRlID4gUkFURV8xMSkpCi0JCQkJeworCQkJCX0gZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA+IFJBVEVfMTEpCisJCQkJCSAgICYmIChwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPgorCQkJCQkgICAgICAgUkFURV8xMSkpIHsKIAkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUc7CiAJCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFHWzBdOwogCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUdbMV07CiAKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKKwkJCQl9IGVsc2UgewogCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkc7CiAJCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCR1swXTsKLQkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCR1sxXTsKKwkJCQkJKnBJbml0VHhSYXRlSWR4ID0KKwkJCQkJICAgIFJhdGVTd2l0Y2hUYWJsZTExQkdbMV07CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJfQotCi0JCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQotCQkJewotCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAxKQotCQkJCXsKKwkJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpIHsKKwkJCQlpZiAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkgewogCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTOwogCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzBdOwotCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4xU1sxXTsKLQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiRFJTOiB1bmtvd24gbW9kZSxkZWZhdWx0IHVzZSAxMU4gMVMgQVAgXG4iKSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9CisJCQkJCSAgICBSYXRlU3dpdGNoVGFibGUxMU4xU1sxXTsKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJICAgICAoIkRSUzogdW5rb3duIG1vZGUsZGVmYXVsdCB1c2UgMTFOIDFTIEFQIFxuIikpOworCQkJCX0gZWxzZSB7CiAJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlM7CiAJCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMF07Ci0JCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTWzFdOwotCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlLGRlZmF1bHQgdXNlIDExTiAyUyBBUCBcbiIpKTsKKwkJCQkJKnBJbml0VHhSYXRlSWR4ID0KKwkJCQkJICAgIFJhdGVTd2l0Y2hUYWJsZTExTjJTWzFdOworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsCisJCQkJCQkgICAgICgiRFJTOiB1bmtvd24gbW9kZSxkZWZhdWx0IHVzZSAxMU4gMlMgQVAgXG4iKSk7CiAJCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAxKQotCQkJCXsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpIHsKIAkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4xUzsKIAkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4xU1swXTsKLQkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMV07Ci0JCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIkRSUzogdW5rb3duIG1vZGUsZGVmYXVsdCB1c2UgMTFOIDFTIEFQIFxuIikpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJeworCQkJCQkqcEluaXRUeFJhdGVJZHggPQorCQkJCQkgICAgUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMV07CisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwKKwkJCQkJCSAgICAgKCJEUlM6IHVua293biBtb2RlLGRlZmF1bHQgdXNlIDExTiAxUyBBUCBcbiIpKTsKKwkJCQl9IGVsc2UgewogCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmQ7Ci0JCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFswXTsKLQkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFsxXTsKLQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiRFJTOiB1bmtvd24gbW9kZSxkZWZhdWx0IHVzZSAxMU4gMlMgQVAgXG4iKSk7CisJCQkJCSpwVGFibGVTaXplID0KKwkJCQkJICAgIFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9CisJCQkJCSAgICBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzFdOworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsCisJCQkJCQkgICAgICgiRFJTOiB1bmtvd24gbW9kZSxkZWZhdWx0IHVzZSAxMU4gMlMgQVAgXG4iKSk7CiAJCQkJfQogCQkJfQotCi0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlIChTdXBSYXRlTGVuPSVkLCBFeHRSYXRlTGVuPSVkLCBNQ1NTZXRbMF09MHgleCwgTUNTU2V0WzFdPTB4JXgpXG4iLAotCQkJCXBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sIHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4sIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdLCBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSkpOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAgICAgKCJEUlM6IHVua293biBtb2RlIChTdXBSYXRlTGVuPSVkLCBFeHRSYXRlTGVuPSVkLCBNQ1NTZXRbMF09MHgleCwgTUNTU2V0WzFdPTB4JXgpXG4iLAorCQkJCSAgICAgIHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sCisJCQkJICAgICAgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiwKKwkJCQkgICAgICBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSwKKwkJCQkgICAgICBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLgorCQkJCSAgICAgIE1DU1NldFsxXSkpOwogCQl9Ci0JfSB3aGlsZShGQUxTRSk7CisJfSB3aGlsZSAoRkFMU0UpOworfQorCit2b2lkIFNUQU1sbWVQZXJpb2RpY0V4ZWMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXVuc2lnbmVkIGxvbmcgVHhUb3RhbENudDsKKwlpbnQgaTsKKworCS8qCisJICAgV2UgcmV0dXJuIGhlcmUgaW4gQVRFIG1vZGUsIGJlY2F1c2UgdGhlIHN0YXRpc3RpY3MKKwkgICB0aGF0IEFURSBuZWVkIGFyZSBub3QgY29sbGVjdGVkIHZpYSB0aGlzIHJvdXRpbmUuCisJICovCisjaWYgZGVmaW5lZChSVDMwNXgpfHxkZWZpbmVkKFJUMzA3MCkKKwkvKiByZXF1ZXN0IGJ5IEdhcnksIGlmIFJzc2kwID4gLTQyLCBCQlAgODIgbmVlZCB0byBiZSBjaGFuZ2VkIGZyb20gMHg2MiB0byAweDQyLCAsIGJicCA2NyBuZWVkIHRvIGJlIGNoYW5nZWQgZnJvbSAweDIwIHRvIDB4MTggKi8KKwlpZiAoIXBBZC0+Q29tbW9uQ2ZnLkhpZ2hQb3dlclBhdGNoRGlzYWJsZWQpIHsKKyNpZmRlZiBSVDMwNzAKKwkJaWYgKChJU19SVDMwNzAocEFkKSAmJiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMDEpKSkKKyNlbmRpZiAvKiBSVDMwNzAgLy8gKi8KKwkJeworCQkJaWYgKChwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwICE9IDApCisJCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAgPgorCQkJCShwQWQtPkJicFJzc2lUb0RibURlbHRhIC0gMzUpKSkgeworCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgMHgyMCk7CisJCQl9IGVsc2UgeworCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgMHgyMyk7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKyNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKKy8qIGRvbid0IHBlcmZvcm0gaWRsZS1wb3dlci1zYXZlIG1lY2hhbmlzbSB3aXRoaW4gMyBtaW4gYWZ0ZXIgZHJpdmVyIGluaXRpYWxpemF0aW9uLiAqLworLyogVGhpcyBjYW4gbWFrZSByZWJvb3RlciB0ZXN0IG1vcmUgcm9idXN0ICovCisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKSB7CisJCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgKElETEVfT04ocEFkKSkKKwkJICAgICYmIChwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID09IFNZTkNfSURMRSkKKwkJICAgICYmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkKKwkJICAgICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKSkpIHsKKwkJCWlmIChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkgeworCQkJCWlmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0KKwkJCQkgICAgVFJVRSkgeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAoIiVzXG4iLCBfX2Z1bmNfXykpOworCQkJCQlSVDI4eHhQY2lBc2ljUmFkaW9PZmYocEFkLAorCQkJCQkJCSAgICAgIEdVSV9JRExFX1BPV0VSX1NBVkUsCisJCQkJCQkJICAgICAgMCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMwLAorCQkJCQkJCSAgICAgUG93ZXJTYWZlQ0lELCAweGZmLAorCQkJCQkJCSAgICAgMHgyKTsKKwkJCQkJLyogV2FpdCBjb21tYW5kIHN1Y2Nlc3MgKi8KKwkJCQkJQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlclNhZmVDSUQpOworCQkJCQlSVE1QX1NFVF9GTEFHKHBBZCwKKwkJCQkJCSAgICAgIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAoIlBTTSAtIHJ0MzB4eCBJc3N1ZSBTbGVlcCBjb21tYW5kKVxuIikpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgPiAxODApIHsKKwkJCQlpZiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09CisJCQkJICAgIFRSVUUpIHsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgKCIlc1xuIiwgX19mdW5jX18pKTsKKwkJCQkJUlQyOHh4UGNpQXNpY1JhZGlvT2ZmKHBBZCwKKwkJCQkJCQkgICAgICBHVUlfSURMRV9QT1dFUl9TQVZFLAorCQkJCQkJCSAgICAgIDApOworCQkJCX0gZWxzZSB7CisJCQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMCwKKwkJCQkJCQkgICAgIFBvd2VyU2FmZUNJRCwgMHhmZiwKKwkJCQkJCQkgICAgIDB4MDIpOworCQkJCQkvKiBXYWl0IGNvbW1hbmQgc3VjY2VzcyAqLworCQkJCQlBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyU2FmZUNJRCk7CisJCQkJCVJUTVBfU0VUX0ZMQUcocEFkLAorCQkJCQkJICAgICAgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRik7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICgiUFNNIC0gIHJ0Mjh4eCBJc3N1ZSBTbGVlcCBjb21tYW5kKVxuIikpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlNUQU1sbWVQZXJpb2RpY0V4ZWMgTU1DSEsgLSBDb21tb25DZmcuU3NpZFslZF09JWMlYyVjJWMuLi4gTWxtZUF1eC5Tc2lkWyVkXT0lYyVjJWMlYy4uLlxuIiwKKwkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sCisJCQkJICBwQWQtPkNvbW1vbkNmZy5Tc2lkWzBdLAorCQkJCSAgcEFkLT5Db21tb25DZmcuU3NpZFsxXSwKKwkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRbMl0sCisJCQkJICBwQWQtPkNvbW1vbkNmZy5Tc2lkWzNdLCBwQWQtPk1sbWVBdXguU3NpZExlbiwKKwkJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkWzBdLCBwQWQtPk1sbWVBdXguU3NpZFsxXSwKKwkJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkWzJdLCBwQWQtPk1sbWVBdXguU3NpZFszXSkpOworCQl9CisJfQorI2VuZGlmIC8qIFBDSUVfUFNfU1VQUE9SVCAvLyAqLworCisJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKSB7CisJCS8qIFdQQSBNSUMgZXJyb3Igc2hvdWxkIGJsb2NrIGFzc29jaWF0aW9uIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMgKi8KKwkJaWYgKHBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jICYmCisJCSAgICBSVE1QX1RJTUVfQUZURVIocEFkLT5NbG1lLk5vdzMyLAorCQkJCSAgICBwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lICsKKwkJCQkgICAgKDYwICogT1NfSFopKSkKKwkJCXBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID0gRkFMU0U7CisJfQorCisJaWYgKChwQWQtPlByZU1lZGlhU3RhdGUgIT0gcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUpCisJICAgICYmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkpIHsKKwkJaWYgKHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKSB7CisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS1VQX0VWRU5UX0ZMQUcsCisJCQkJCSAgICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uCisJCQkJCSAgICAgIEFkZHIsIEJTUzAsIDApOworCQl9CisJCXBBZC0+UHJlTWVkaWFTdGF0ZSA9IHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlOworCX0KKworCWlmIChwQWQtPkNvbW1vbkNmZy5QU1BYbGluayAmJiBBREhPQ19PTihwQWQpKSB7CisJfSBlbHNlIHsKKwkJQXNpY1N0YUJicFR1bmluZyhwQWQpOworCX0KKworCVR4VG90YWxDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKworCSAgICBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkgICAgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKKworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpIHsKKwkJLyogdXBkYXRlIGNoYW5uZWwgcXVhbGl0eSBmb3IgUm9hbWluZyBhbmQgVUkgTGlua1F1YWxpdHkgZGlzcGxheSAqLworCQlNbG1lQ2FsY3VsYXRlQ2hhbm5lbFF1YWxpdHkocEFkLCBOVUxMLCBwQWQtPk1sbWUuTm93MzIpOworCX0KKwkvKiBtdXN0IGJlIEFGVEVSIE1sbWVEeW5hbWljVHhSYXRlU3dpdGNoaW5nKCkgYmVjYXVzZSBpdCBuZWVkcyB0byBrbm93IGlmICovCisJLyogUmFkaW8gaXMgY3VycmVudGx5IGluIG5vaXN5IGVudmlyb25tZW50ICovCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorCQlBc2ljQWRqdXN0VHhQb3dlcihwQWQpOworCisJaWYgKElORlJBX09OKHBBZCkpIHsKKworCQkvKiBJcyBQU00gYml0IGNvbnNpc3RlbnQgd2l0aCB1c2VyIHBvd2VyIG1hbmFnZW1lbnQgcG9saWN5PyAqLworCQkvKiBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIHRoYXQgd2lsbCBzZXQgUFNNIGJpdCBPTi4gKi8KKwkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCQkJTWxtZUNoZWNrUHNtQ2hhbmdlKHBBZCwgcEFkLT5NbG1lLk5vdzMyKTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNUb3RhbFR4Q291bnQgPSBUeFRvdGFsQ250OworCisJCWlmICgoUlRNUF9USU1FX0FGVEVSCisJCSAgICAgKHBBZC0+TWxtZS5Ob3czMiwKKwkJICAgICAgcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSArICgxICogT1NfSFopKSkKKwkJICAgICYmCisJCSAgICAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCSAgICAmJgorCQkgICAgKCgoVHhUb3RhbENudCArIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0NudCkgPAorCQkgICAgICA2MDApKSkgeworCQkJUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIEJXXzIwKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIk1NQ0hLIC0gTm8gQkVBQ09OLiByZXN0b3JlIFI2NiB0byB0aGUgbG93IGJvdW5kKCVkKSBcbiIsCisJCQkJICAoMHgyRSArIEdFVF9MTkFfR0FJTihwQWQpKSkpOworCQl9CisJCS8qaWYgKChwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgPT0gMCkgJiYgKi8KKwkJLyogICAgKHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgPT0gMCkpICovCisJCXsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUKKwkJCSAgICAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkgeworCQkJCS8qIFdoZW4gQVBTRCBpcyBlbmFibGVkLCB0aGUgcGVyaW9kIGNoYW5nZXMgYXMgMjAgc2VjICovCisJCQkJaWYgKChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDIwKSA9PSA4KQorCQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsCisJCQkJCQkJICBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsCisJCQkJCQkJICBUUlVFKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogU2VuZCBvdXQgYSBOVUxMIGZyYW1lIGV2ZXJ5IDEwIHNlYyB0byBpbmZvcm0gQVAgdGhhdCBTVEEgaXMgc3RpbGwgYWxpdmUgKEF2b2lkIGJlaW5nIGFnZSBvdXQpICovCisJCQkJaWYgKChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDEwKSA9PSA4KSB7CisJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkKKwkJCQkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwKKwkJCQkJCQkJICBwQWQtPgorCQkJCQkJCQkgIENvbW1vbkNmZy4KKwkJCQkJCQkJICBUeFJhdGUsIFRSVUUpOworCQkJCQllbHNlCisJCQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsCisJCQkJCQkJCSAgcEFkLT4KKwkJCQkJCQkJICBDb21tb25DZmcuCisJCQkJCQkJCSAgVHhSYXRlLAorCQkJCQkJCQkgIEZBTFNFKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoQ1FJX0lTX0RFQUQocEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5KSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiTU1DSEsgLSBObyBCRUFDT04uIERlYWQgQ1FJLiBBdXRvIFJlY292ZXJ5IGF0dGVtcHQgIyVsZFxuIiwKKwkJCQkgIHBBZC0+UmFsaW5rQ291bnRlcnMuQmFkQ1FJQXV0b1JlY292ZXJ5Q291bnQpKTsKKworCQkJLyogTG9zdCBBUCwgc2VuZCBkaXNjb25uZWN0ICYgbGluayBkb3duIGV2ZW50ICovCisJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKKworCQkJUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQocEFkLCBTSU9DR0lXQVAsIC0xLCBOVUxMLCBOVUxMLAorCQkJCQkJMCk7CisKKwkJCS8qIFJUTVBQYXRjaE1hY0JicEJ1ZyhwQWQpOyAqLworCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOworCQl9IGVsc2UgaWYgKENRSV9JU19CQUQocEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5KSkgeworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5CYWRDUUlBdXRvUmVjb3ZlcnlDb3VudCsrOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiTU1DSEsgLSBCYWQgQ1FJLiBBdXRvIFJlY292ZXJ5IGF0dGVtcHQgIyVsZFxuIiwKKwkJCQkgIHBBZC0+UmFsaW5rQ291bnRlcnMuQmFkQ1FJQXV0b1JlY292ZXJ5Q291bnQpKTsKKwkJCU1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQocEFkKTsKKwkJfQorCisJCWlmIChwQWQtPlN0YUNmZy5iQXV0b1JvYW1pbmcpIHsKKwkJCUJPT0xFQU4gcnYgPSBGQUxTRTsKKwkJCWNoYXIgZEJtVG9Sb2FtID0gcEFkLT5TdGFDZmcuZEJtVG9Sb2FtOworCQkJY2hhciBNYXhSc3NpID0gUlRNUE1heFJzc2kocEFkLAorCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS4KKwkJCQkJCSAgIExhc3RSc3NpMCwKKwkJCQkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuCisJCQkJCQkgICBMYXN0UnNzaTEsCisJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLgorCQkJCQkJICAgTGFzdFJzc2kyKTsKKworCQkJLyogU2Nhbm5pbmcsIGlnbm9yZSBSb2FtaW5nICovCisJCQlpZiAoIVJUTVBfVEVTVF9GTEFHCisJCQkgICAgKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykKKwkJCSAgICAmJiAocEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9PSBTWU5DX0lETEUpCisJCQkgICAgJiYgKE1heFJzc2kgPD0gZEJtVG9Sb2FtKSkgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJSc3NpPSVkLCBkQm1Ub1JvYW09JWRcbiIsIE1heFJzc2ksCisJCQkJCSAgKGNoYXIpZEJtVG9Sb2FtKSk7CisKKwkJCQkvKiBBZGQgYXV0byBzZWFtbGVzcyByb2FtaW5nICovCisJCQkJaWYgKHJ2ID09IEZBTFNFKQorCQkJCQlydiA9IE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nKHBBZCk7CisKKwkJCQlpZiAocnYgPT0gRkFMU0UpIHsKKwkJCQkJaWYgKChwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgKworCQkJCQkgICAgIDEwICogT1NfSFopIDwgcEFkLT5NbG1lLk5vdzMyKSB7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCQkgKCJNTUNISyAtIFJvYW1pbmcsIE5vIGVsaWdhYmxlIGVudHJ5LCB0cnkgbmV3IHNjYW4hXG4iKSk7CisJCQkJCQlwQWQtPlN0YUNmZy5TY2FuQ250ID0gMjsKKwkJCQkJCXBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9CisJCQkJCQkgICAgcEFkLT5NbG1lLk5vdzMyOworCQkJCQkJTWxtZUF1dG9TY2FuKHBBZCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKEFESE9DX09OKHBBZCkpIHsKKwkJLyogSWYgYWxsIHBlZXJzIGxlYXZlLCBhbmQgdGhpcyBTVEEgYmVjb21lcyB0aGUgbGFzdCBvbmUgaW4gdGhpcyBJQlNTLCB0aGVuIGNoYW5nZSBNZWRpYVN0YXRlICovCisJCS8qIHRvIERJU0NPTk5FQ1RFRC4gQnV0IHN0aWxsIGhvbGRpbmcgdGhpcyBJQlNTIChpLmUuIHNlbmRpbmcgQkVBQ09OKSBzbyB0aGF0IG90aGVyIFNUQXMgY2FuICovCisJCS8qIGpvaW4gbGF0ZXIuICovCisJCWlmIChSVE1QX1RJTUVfQUZURVIKKwkJICAgIChwQWQtPk1sbWUuTm93MzIsCisJCSAgICAgcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSArIEFESE9DX0JFQUNPTl9MT1NUX1RJTUUpCisJCSAgICAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLAorCQkJCQkgIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkgeworCQkJc3RydWN0IHJ0X21sbWVfc3RhcnRfcmVxIFN0YXJ0UmVxOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJNTUNISyAtIGV4Y2Vzc2l2ZSBCRUFDT04gbG9zdCwgbGFzdCBTVEEgaW4gdGhpcyBJQlNTLCBNZWRpYVN0YXRlPURpc2Nvbm5lY3RlZFxuIikpOworCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CisKKwkJCVN0YXJ0UGFybUZpbGwocEFkLCAmU3RhcnRSZXEsCisJCQkJICAgICAgKGNoYXIgKikgcEFkLT5NbG1lQXV4LlNzaWQsCisJCQkJICAgICAgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NUQVJUX1JFUSwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX3N0YXJ0X3JlcSksICZTdGFydFJlcSk7CisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX1NUQVJUOworCQl9CisKKwkJZm9yIChpID0gMTsgaSA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspIHsKKwkJCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOworCisJCQlpZiAocEVudHJ5LT5WYWxpZEFzQ0xJID09IEZBTFNFKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoUlRNUF9USU1FX0FGVEVSCisJCQkgICAgKHBBZC0+TWxtZS5Ob3czMiwKKwkJCSAgICAgcEVudHJ5LT5MYXN0QmVhY29uUnhUaW1lICsgQURIT0NfQkVBQ09OX0xPU1RfVElNRSkpCisJCQkJTWFjVGFibGVEZWxldGVFbnRyeShwQWQsIHBFbnRyeS0+QWlkLAorCQkJCQkJICAgIHBFbnRyeS0+QWRkcik7CisJCX0KKwl9IGVsc2UJCQkvKiBubyBJTkZSQSBub3IgQURIT0MgY29ubmVjdGlvbiAqLworCXsKKworCQlpZiAocEFkLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSAmJgorCQkgICAgUlRNUF9USU1FX0JFRk9SRShwQWQtPk1sbWUuTm93MzIsCisJCQkJICAgICBwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgKyAoMzAgKiBPU19IWikpKQorCQkJZ290byBTS0lQX0FVVE9fU0NBTl9DT05OOworCQllbHNlCisJCQlwQWQtPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CisKKwkJaWYgKChwQWQtPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9PSBUUlVFKQorCQkgICAgJiYgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1NUQVJUX1VQKQorCQkgICAgJiYKKwkJICAgIChNbG1lVmFsaWRhdGVTU0lECisJCSAgICAgKHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwKKwkJICAgICAgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKSA9PSBUUlVFKSkgeworCQkJaWYgKChwQWQtPlNjYW5UYWIuQnNzTnIgPT0gMCkKKwkJCSAgICAmJiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpKSB7CisJCQkJc3RydWN0IHJ0X21sbWVfc2Nhbl9yZXEgU2NhblJlcTsKKworCQkJCWlmIChSVE1QX1RJTUVfQUZURVIKKwkJCQkgICAgKHBBZC0+TWxtZS5Ob3czMiwKKwkJCQkgICAgIHBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSArICgxMCAqIE9TX0haKSkpIHsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgKCJTVEFNbG1lUGVyaW9kaWNFeGVjKCk6Q05UTCAtIFNjYW5UYWIuQnNzTnI9PTAsIHN0YXJ0IGEgbmV3IEFDVElWRSBzY2FuIFNTSURbJXNdXG4iLAorCQkJCQkJICBwQWQtPk1sbWVBdXguCisJCQkJCQkgIEF1dG9SZWNvbm5lY3RTc2lkKSk7CisJCQkJCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLAorCQkJCQkJICAgICAoY2hhciAqKXBBZC0+TWxtZUF1eC4KKwkJCQkJCSAgICAgQXV0b1JlY29ubmVjdFNzaWQsCisJCQkJCQkgICAgIHBBZC0+TWxtZUF1eC4KKwkJCQkJCSAgICAgQXV0b1JlY29ubmVjdFNzaWRMZW4sCisJCQkJCQkgICAgIEJTU19BTlksIFNDQU5fQUNUSVZFKTsKKwkJCQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsCisJCQkJCQkgICAgTVQyX01MTUVfU0NBTl9SRVEsCisJCQkJCQkgICAgc2l6ZW9mCisJCQkJCQkgICAgKHN0cnVjdCBydF9tbG1lX3NjYW5fcmVxKSwKKwkJCQkJCSAgICAmU2NhblJlcSk7CisJCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPQorCQkJCQkgICAgQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CisJCQkJCS8qIFJlc2V0IE1pc3NlZCBzY2FuIG51bWJlciAqLworCQkJCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPQorCQkJCQkgICAgcEFkLT5NbG1lLk5vdzMyOworCQkJCX0gZWxzZSBpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCS8qIFF1aXQgdGhlIGZvcmV2ZXIgc2NhbiB3aGVuIGluIGEgdmVyeSBjbGVhbiByb29tICovCisJCQkJCU1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQocEFkKTsKKwkJCX0gZWxzZSBpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpIHsKKwkJCQlpZiAoKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgNykgPT0gMCkgeworCQkJCQlNbG1lQXV0b1NjYW4ocEFkKTsKKwkJCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0KKwkJCQkJICAgIHBBZC0+TWxtZS5Ob3czMjsKKwkJCQl9IGVsc2UgeworCQkJCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCitTS0lQX0FVVE9fU0NBTl9DT05OOgorCisJaWYgKChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlRYQkFiaXRtYXAgIT0gMCkKKwkgICAgJiYgKHBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24gPT0gRkFMU0UpKSB7CisJCXBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24gPSBUUlVFOworCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIEhUX0ZPUkNFUlRTQ1RTLCBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLAorCQkJCSAgRkFMU0UpOworCX0gZWxzZSBpZiAoKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uVFhCQWJpdG1hcCA9PSAwKQorCQkgICAmJiAocEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbiA9PSBUUlVFKSkgeworCQlwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uID0gRkFMU0U7CisJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwKKwkJCQkgIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi4KKwkJCQkgIE9wZXJhaW9uTW9kZSwgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgRkFMU0UpOworCX0KKworCXJldHVybjsKK30KKworLyogTGluayBkb3duIHJlcG9ydCAqLwordm9pZCBMaW5rRG93bkV4ZWModm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMykKK3sKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKUZ1bmN0aW9uQ29udGV4dDsKKworCWlmIChwQWQgIT0gTlVMTCkgeworCQlzdHJ1Y3QgcnRfbWxtZV9kaXNhc3NvY19yZXEgRGlzYXNzb2NSZXE7CisKKwkJaWYgKChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpICYmCisJCSAgICAoSU5GUkFfT04ocEFkKSkpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkxpbmtEb3duRXhlYygpOiBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQLi4uXG4iKSk7CisJCQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLAorCQkJCQkgcEFkLT5Db21tb25DZmcuQnNzaWQsCisJCQkJCSBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOworCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLAorCQkJCSAgICBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9kaXNhc3NvY19yZXEpLAorCQkJCSAgICAmRGlzYXNzb2NSZXEpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKKworCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisJCQlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOworCQl9CisJfQorfQorCisvKiBJUlFMID0gRElTUEFUQ0hfTEVWRUwgKi8KK3ZvaWQgTWxtZUF1dG9TY2FuKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwkvKiBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdCAqLworCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIERyaXZlciBhdXRvIHNjYW5cbiIpKTsKKwkJTWxtZUVucXVldWUocEFkLAorCQkJICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJICAgIE9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLAorCQkJICAgIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiwKKwkJCSAgICBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQpOworCQlSVE1QX01MTUVfSEFORExFUihwQWQpOworCX0KK30KKworLyogSVJRTCA9IERJU1BBVENIX0xFVkVMICovCit2b2lkIE1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCWlmIChwQWQtPlN0YUNmZy5iQXV0b0Nvbm5lY3RCeUJzc2lkKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiRHJpdmVyIGF1dG8gcmVjb25uZWN0IHRvIGxhc3QgT0lEXzgwMl8xMV9CU1NJRCBzZXR0aW5nIC0gJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJCQkgIHBBZC0+TWxtZUF1eC5Cc3NpZFswXSwgcEFkLT5NbG1lQXV4LkJzc2lkWzFdLAorCQkJICBwQWQtPk1sbWVBdXguQnNzaWRbMl0sIHBBZC0+TWxtZUF1eC5Cc3NpZFszXSwKKwkJCSAgcEFkLT5NbG1lQXV4LkJzc2lkWzRdLCBwQWQtPk1sbWVBdXguQnNzaWRbNV0pKTsKKworCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJCU1sbWVFbnF1ZXVlKHBBZCwKKwkJCSAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCSAgICBPSURfODAyXzExX0JTU0lELCBNQUNfQUREUl9MRU4sIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKworCQlSVE1QX01MTUVfSEFORExFUihwQWQpOworCX0KKwkvKiBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdCAqLworCWVsc2UgaWYgKChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkgJiYKKwkJIChNbG1lVmFsaWRhdGVTU0lECisJCSAgKHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwKKwkJICAgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKSA9PSBUUlVFKSkgeworCQlzdHJ1Y3QgcnRfbmRpc184MDJfMTFfc3NpZCBPaWRTc2lkOworCQlPaWRTc2lkLlNzaWRMZW5ndGggPSBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW47CisJCU5kaXNNb3ZlTWVtb3J5KE9pZFNzaWQuU3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLAorCQkJICAgICAgIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJEcml2ZXIgYXV0byByZWNvbm5lY3QgdG8gbGFzdCBPSURfODAyXzExX1NTSUQgc2V0dGluZyAtICVzLCBsZW4gLSAlZFxuIiwKKwkJCSAgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLAorCQkJICBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pKTsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgT0lEXzgwMl8xMV9TU0lELAorCQkJICAgIHNpemVvZihzdHJ1Y3QgcnRfbmRpc184MDJfMTFfc3NpZCksICZPaWRTc2lkKTsKKwkJUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKKwl9CiB9CiAKIC8qCkBAIC0xNjc4LDQ3ICsxNTgyLDUwIEBACiAJT3V0cHV0OgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgTWxtZUNoZWNrRm9yUm9hbWluZygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVTE9ORwlOb3czMikKK3ZvaWQgTWxtZUNoZWNrRm9yUm9hbWluZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHVuc2lnbmVkIGxvbmcgTm93MzIpCiB7Ci0JVVNIT1JUCSAgIGk7Ci0JQlNTX1RBQkxFICAqcFJvYW1UYWIgPSAmcEFkLT5NbG1lQXV4LlJvYW1UYWI7Ci0JQlNTX0VOVFJZICAqcEJzczsKKwl1MTYgaTsKKwlzdHJ1Y3QgcnRfYnNzX3RhYmxlICpwUm9hbVRhYiA9ICZwQWQtPk1sbWVBdXguUm9hbVRhYjsKKwlzdHJ1Y3QgcnRfYnNzX2VudHJ5ICpwQnNzOwogCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IE1sbWVDaGVja0ZvclJvYW1pbmdcbiIpKTsKLQkvLyBwdXQgYWxsIHJvYW1pbmcgY2FuZGlkYXRlcyBpbnRvIFJvYW1UYWIsIGFuZCBzb3J0IGluIFJTU0kgb3JkZXIKKwkvKiBwdXQgYWxsIHJvYW1pbmcgY2FuZGlkYXRlcyBpbnRvIFJvYW1UYWIsIGFuZCBzb3J0IGluIFJTU0kgb3JkZXIgKi8KIAlCc3NUYWJsZUluaXQocFJvYW1UYWIpOwotCWZvciAoaSA9IDA7IGkgPCBwQWQtPlNjYW5UYWIuQnNzTnI7IGkrKykKLQl7CisJZm9yIChpID0gMDsgaSA8IHBBZC0+U2NhblRhYi5Cc3NOcjsgaSsrKSB7CiAJCXBCc3MgPSAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldOwogCi0JCWlmICgocEJzcy0+TGFzdEJlYWNvblJ4VGltZSArIEJFQUNPTl9MT1NUX1RJTUUpIDwgTm93MzIpCi0JCQljb250aW51ZTsJIC8vIEFQIGRpc2FwcGVhcgorCQlpZiAoKHBCc3MtPkxhc3RCZWFjb25SeFRpbWUgKyBwQWQtPlN0YUNmZy5CZWFjb25Mb3N0VGltZSkgPAorCQkgICAgTm93MzIpCisJCQljb250aW51ZTsJLyogQVAgZGlzYXBwZWFyICovCiAJCWlmIChwQnNzLT5Sc3NpIDw9IFJTU0lfVEhSRVNIT0xEX0ZPUl9ST0FNSU5HKQotCQkJY29udGludWU7CSAvLyBSU1NJIHRvbyB3ZWFrLiBmb3JnZXQgaXQuCisJCQljb250aW51ZTsJLyogUlNTSSB0b28gd2Vhay4gZm9yZ2V0IGl0LiAqLwogCQlpZiAoTUFDX0FERFJfRVFVQUwocEJzcy0+QnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKSkKLQkJCWNvbnRpbnVlOwkgLy8gc2tpcCBjdXJyZW50IEFQCi0JCWlmIChwQnNzLT5Sc3NpIDwgKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwICsgUlNTSV9ERUxUQSkpCi0JCQljb250aW51ZTsJIC8vIG9ubHkgQVAgd2l0aCBzdHJvbmdlciBSU1NJIGlzIGVsaWdpYmxlIGZvciByb2FtaW5nCisJCQljb250aW51ZTsJLyogc2tpcCBjdXJyZW50IEFQICovCisJCWlmIChwQnNzLT5Sc3NpIDwKKwkJICAgIChwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCArIFJTU0lfREVMVEEpKQorCQkJY29udGludWU7CS8qIG9ubHkgQVAgd2l0aCBzdHJvbmdlciBSU1NJIGlzIGVsaWdpYmxlIGZvciByb2FtaW5nICovCiAKLQkJLy8gQVAgcGFzc2luZyBhbGwgYWJvdmUgcnVsZXMgaXMgcHV0IGludG8gcm9hbWluZyBjYW5kaWRhdGUgdGFibGUKLQkJTmRpc01vdmVNZW1vcnkoJnBSb2FtVGFiLT5Cc3NFbnRyeVtwUm9hbVRhYi0+QnNzTnJdLCBwQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCS8qIEFQIHBhc3NpbmcgYWxsIGFib3ZlIHJ1bGVzIGlzIHB1dCBpbnRvIHJvYW1pbmcgY2FuZGlkYXRlIHRhYmxlICovCisJCU5kaXNNb3ZlTWVtb3J5KCZwUm9hbVRhYi0+QnNzRW50cnlbcFJvYW1UYWItPkJzc05yXSwgcEJzcywKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2Jzc19lbnRyeSkpOwogCQlwUm9hbVRhYi0+QnNzTnIgKz0gMTsKIAl9CiAKLQlpZiAocFJvYW1UYWItPkJzc05yID4gMCkKLQl7Ci0JCS8vIGNoZWNrIENudGxNYWNoaW5lLkN1cnJTdGF0ZSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBORElTIFNldE9JRCByZXF1ZXN0Ci0JCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkKLQkJewotCQkJcEFkLT5SYWxpbmtDb3VudGVycy5Qb29yQ1FJUm9hbWluZ0NvdW50ICsrOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBSb2FtaW5nIGF0dGVtcHQgIyVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5Qb29yQ1FJUm9hbWluZ0NvdW50KSk7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ST0FNSU5HX1JFUSwgMCwgTlVMTCk7Ci0JCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJaWYgKHBSb2FtVGFiLT5Cc3NOciA+IDApIHsKKwkJLyogY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QgKi8KKwkJaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKSB7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlBvb3JDUUlSb2FtaW5nQ291bnQrKzsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIk1NQ0hLIC0gUm9hbWluZyBhdHRlbXB0ICMlbGRcbiIsCisJCQkJICBwQWQtPlJhbGlua0NvdW50ZXJzLlBvb3JDUUlSb2FtaW5nQ291bnQpKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJICAgIE1UMl9NTE1FX1JPQU1JTkdfUkVRLCAwLCBOVUxMKTsKKwkJCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7CiAJCX0KIAl9Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IE1sbWVDaGVja0ZvclJvYW1pbmcoIyBvZiBjYW5kaWRhdGU9ICVkKVxuIixwUm9hbVRhYi0+QnNzTnIpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiPD09IE1sbWVDaGVja0ZvclJvYW1pbmcoIyBvZiBjYW5kaWRhdGU9ICVkKVxuIiwKKwkJICBwUm9hbVRhYi0+QnNzTnIpKTsKIH0KIAogLyoKQEAgLTE3MzMsMTU5ICsxNjQwLDc0IEBACiAJT3V0cHV0OgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgTWxtZUNoZWNrRm9yRmFzdFJvYW1pbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUxPTkcJCQlOb3cpCitCT09MRUFOIE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlVU0hPUlQJCWk7Ci0JQlNTX1RBQkxFCSpwUm9hbVRhYiA9ICZwQWQtPk1sbWVBdXguUm9hbVRhYjsKLQlCU1NfRU5UUlkJKnBCc3M7CisJdTE2IGk7CisJc3RydWN0IHJ0X2Jzc190YWJsZSAqcFJvYW1UYWIgPSAmcEFkLT5NbG1lQXV4LlJvYW1UYWI7CisJc3RydWN0IHJ0X2Jzc19lbnRyeSAqcEJzczsKIAogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBNbG1lQ2hlY2tGb3JGYXN0Um9hbWluZ1xuIikpOwotCS8vIHB1dCBhbGwgcm9hbWluZyBjYW5kaWRhdGVzIGludG8gUm9hbVRhYiwgYW5kIHNvcnQgaW4gUlNTSSBvcmRlcgorCS8qIHB1dCBhbGwgcm9hbWluZyBjYW5kaWRhdGVzIGludG8gUm9hbVRhYiwgYW5kIHNvcnQgaW4gUlNTSSBvcmRlciAqLwogCUJzc1RhYmxlSW5pdChwUm9hbVRhYik7Ci0JZm9yIChpID0gMDsgaSA8IHBBZC0+U2NhblRhYi5Cc3NOcjsgaSsrKQotCXsKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5TY2FuVGFiLkJzc05yOyBpKyspIHsKIAkJcEJzcyA9ICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV07CiAKLSAgICAgICAgaWYgKChwQnNzLT5Sc3NpIDw9IC01MCkgJiYgKHBCc3MtPkNoYW5uZWwgPT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpCi0JCQljb250aW51ZTsJIC8vIFJTU0kgdG9vIHdlYWsuIGZvcmdldCBpdC4KKwkJaWYgKChwQnNzLT5Sc3NpIDw9IC01MCkKKwkJICAgICYmIChwQnNzLT5DaGFubmVsID09IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKQorCQkJY29udGludWU7CS8qIFJTU0kgdG9vIHdlYWsuIGZvcmdldCBpdC4gKi8KIAkJaWYgKE1BQ19BRERSX0VRVUFMKHBCc3MtPkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCkpCi0JCQljb250aW51ZTsJIC8vIHNraXAgY3VycmVudCBBUAotCQlpZiAoIVNTSURfRVFVQUwocEJzcy0+U3NpZCwgcEJzcy0+U3NpZExlbiwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbikpCi0JCQljb250aW51ZTsJIC8vIHNraXAgZGlmZmVyZW50IFNTSUQKLSAgICAgICAgaWYgKHBCc3MtPlJzc2kgPCAoUlRNUE1heFJzc2kocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKSArIFJTU0lfREVMVEEpKQotCQkJY29udGludWU7CSAvLyBza2lwIEFQIHdpdGhvdXQgYmV0dGVyIFJTU0kKKwkJCWNvbnRpbnVlOwkvKiBza2lwIGN1cnJlbnQgQVAgKi8KKwkJaWYgKCFTU0lEX0VRVUFMCisJCSAgICAocEJzcy0+U3NpZCwgcEJzcy0+U3NpZExlbiwgcEFkLT5Db21tb25DZmcuU3NpZCwKKwkJICAgICBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKSkKKwkJCWNvbnRpbnVlOwkvKiBza2lwIGRpZmZlcmVudCBTU0lEICovCisJCWlmIChwQnNzLT5Sc3NpIDwKKwkJICAgIChSVE1QTWF4UnNzaQorCQkgICAgIChwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLAorCQkgICAgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwKKwkJICAgICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpICsgUlNTSV9ERUxUQSkpCisJCQljb250aW51ZTsJLyogc2tpcCBBUCB3aXRob3V0IGJldHRlciBSU1NJICovCiAKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTGFzdFJzc2kwID0gJWQsIHBCc3MtPlJzc2kgPSAlZFxuIiwgUlRNUE1heFJzc2kocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKSwgcEJzcy0+UnNzaSkpOwotCQkvLyBBUCBwYXNzaW5nIGFsbCBhYm92ZSBydWxlcyBpcyBwdXQgaW50byByb2FtaW5nIGNhbmRpZGF0ZSB0YWJsZQotCQlOZGlzTW92ZU1lbW9yeSgmcFJvYW1UYWItPkJzc0VudHJ5W3BSb2FtVGFiLT5Cc3NOcl0sIHBCc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJMYXN0UnNzaTAgPSAlZCwgcEJzcy0+UnNzaSA9ICVkXG4iLAorCQkJICBSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLAorCQkJCSAgICAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLAorCQkJCSAgICAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKSwKKwkJCSAgcEJzcy0+UnNzaSkpOworCQkvKiBBUCBwYXNzaW5nIGFsbCBhYm92ZSBydWxlcyBpcyBwdXQgaW50byByb2FtaW5nIGNhbmRpZGF0ZSB0YWJsZSAqLworCQlOZGlzTW92ZU1lbW9yeSgmcFJvYW1UYWItPkJzc0VudHJ5W3BSb2FtVGFiLT5Cc3NOcl0sIHBCc3MsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9ic3NfZW50cnkpKTsKIAkJcFJvYW1UYWItPkJzc05yICs9IDE7CiAJfQogCi0JaWYgKHBSb2FtVGFiLT5Cc3NOciA+IDApCi0JewotCQkvLyBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdAotCQlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpCi0JCXsKLQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuUG9vckNRSVJvYW1pbmdDb3VudCArKzsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gUm9hbWluZyBhdHRlbXB0ICMlbGRcbiIsIHBBZC0+UmFsaW5rQ291bnRlcnMuUG9vckNRSVJvYW1pbmdDb3VudCkpOwotCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfUk9BTUlOR19SRVEsIDAsIE5VTEwpOwotCQkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOwotCQl9Ci0JfQotCS8vIE1heWJlIHNpdGUgc3VydmV5IHJlcXVpcmVkCi0JZWxzZQotCXsKLQkJaWYgKChwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgKyAxMCAqIDEwMDApIDwgTm93KQotCQl7Ci0JCQkvLyBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdAotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBSb2FtaW5nLCBObyBlbGlnYWJsZSBlbnRyeSwgdHJ5IG5ldyBzY2FuIVxuIikpOwotCQkJcEFkLT5TdGFDZmcuU2NhbkNudCA9IDI7Ci0JCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBOb3c7Ci0JCQlNbG1lQXV0b1NjYW4ocEFkKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiPD09IE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nIChCc3NOcj0lZClcbiIsIHBSb2FtVGFiLT5Cc3NOcikpOworCWlmIChwUm9hbVRhYi0+QnNzTnIgPiAwKSB7CisJCS8qIGNoZWNrIENudGxNYWNoaW5lLkN1cnJTdGF0ZSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBORElTIFNldE9JRCByZXF1ZXN0ICovCisJCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkgeworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5Qb29yQ1FJUm9hbWluZ0NvdW50Kys7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJNTUNISyAtIFJvYW1pbmcgYXR0ZW1wdCAjJWxkXG4iLAorCQkJCSAgcEFkLT5SYWxpbmtDb3VudGVycy5Qb29yQ1FJUm9hbWluZ0NvdW50KSk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCSAgICBNVDJfTUxNRV9ST0FNSU5HX1JFUSwgMCwgTlVMTCk7CisJCQlSVE1QX01MTUVfSEFORExFUihwQWQpOworCQkJcmV0dXJuIFRSVUU7CiAJCX0KIAl9CiAKLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gTWxtZUNoZWNrRm9yRmFzdFJvYW1pbmcgKEJzc05yPSVkKVxuIiwgcFJvYW1UYWItPkJzc05yKSk7CisJcmV0dXJuIEZBTFNFOwogfQogCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVRoaXMgcm91dGluZSBjYWxjdWxhdGVzIFR4UEVSLCBSeFBFUiBvZiB0aGUgcGFzdCBOLXNlYyBwZXJpb2QuIEFuZAotCQlhY2NvcmRpbmcgdG8gdGhlIGNhbGN1bGF0aW9uIHJlc3VsdCwgQ2hhbm5lbFF1YWxpdHkgaXMgY2FsY3VsYXRlZCBoZXJlCi0JCXRvIGRlY2lkZSBpZiBjdXJyZW50IEFQIGlzIHN0aWxsIGRvaW5nIHRoZSBqb2IuCi0KLQkJSWYgQ2hhbm5lbFF1YWxpdHkgaXMgbm90IGdvb2QsIGEgUk9BTWluZyBhdHRlbXB0IG1heSBiZSB0cmllZCBsYXRlci4KLQlPdXRwdXQ6Ci0JCVN0YUNmZy5DaGFubmVsUXVhbGl0eSAtIDAuLjEwMAotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOT1RFOiBUaGlzIHJvdXRpbmUgZGVjaWRlIGNoYW5ubGUgcXVhbGl0eSBiYXNlZCBvbiBSWCBDUkMgZXJyb3IgcmF0aW8uCi0JCUNhbGxlciBzaG91bGQgbWFrZSBzdXJlIGEgZnVuY3Rpb24gY2FsbCB0byBOSUNVcGRhdGVSYXdDb3VudGVycyhwQWQpCi0JCWlzIHBlcmZvcm1lZCByaWdodCBiZWZvcmUgdGhpcyByb3V0aW5lLCBzbyB0aGF0IHRoaXMgcm91dGluZSBjYW4gZGVjaWRlCi0JCWNoYW5uZWwgcXVhbGl0eSBiYXNlZCBvbiB0aGUgbW9zdCB1cC10by1kYXRlIGluZm9ybWF0aW9uCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNbG1lQ2FsY3VsYXRlQ2hhbm5lbFF1YWxpdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUxPTkcgTm93MzIpCit2b2lkIE1sbWVTZXRUeFJhdGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksIHN0cnVjdCBydF9ydG1wX3R4X3JhdGVfc3dpdGNoICogcFR4UmF0ZSkKIHsKLQlVTE9ORyBUeE9rQ250LCBUeENudCwgVHhQRVIsIFR4UFJSOwotCVVMT05HIFJ4Q250LCBSeFBFUjsKLQlVQ0hBUiBOb3JSc3NpOwotCUNIQVIgIE1heFJzc2k7Ci0JVUxPTkcgQmVhY29uTG9zdFRpbWUgPSBCRUFDT05fTE9TVF9USU1FOwotCi0JTWF4UnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMik7Ci0KLQkvLwotCS8vIGNhbGN1bGF0ZSBUWCBwYWNrZXQgZXJyb3IgcmF0aW8gYW5kIFRYIHJldHJ5IHJhdGlvIC0gaWYgdG9vIGZldyBUWCBzYW1wbGVzLCBza2lwIFRYIHJlbGF0ZWQgc3RhdGlzdGljcwotCS8vCi0JVHhPa0NudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQ7Ci0JVHhDbnQgPSBUeE9rQ250ICsgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKLQlpZiAoVHhDbnQgPCA1KQotCXsKLQkJVHhQRVIgPSAwOwotCQlUeFBSUiA9IDA7Ci0JfQotCWVsc2UKLQl7Ci0JCVR4UEVSID0gKHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQgKiAxMDApIC8gVHhDbnQ7Ci0JCVR4UFJSID0gKChUeENudCAtIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCkgKiAxMDApIC8gVHhDbnQ7Ci0JfQotCi0JLy8KLQkvLyBjYWxjdWxhdGUgUlggUEVSIC0gZG9uJ3QgdGFrZSBSeFBFUiBpbnRvIGNvbnNpZGVyYXRpb24gaWYgdG9vIGZldyBzYW1wbGUKLQkvLwotCVJ4Q250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rQ250ICsgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEZjc0VyckNudDsKLQlpZiAoUnhDbnQgPCA1KQotCQlSeFBFUiA9IDA7Ci0JZWxzZQotCQlSeFBFUiA9IChwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4RmNzRXJyQ250ICogMTAwKSAvIFJ4Q250OwotCi0JLy8KLQkvLyBkZWNpZGUgQ2hhbm5lbFF1YWxpdHkgYmFzZWQgb246IDEpbGFzdCBCRUFDT04gcmVjZWl2ZWQgdGltZSwgMilsYXN0IFJTU0ksIDMpVHhQRVIsIGFuZCA0KVJ4UEVSCi0JLy8KLQlpZiAoSU5GUkFfT04ocEFkKSAmJgotCQkocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50IDwgMikgJiYgLy8gbm8gaGVhdnkgdHJhZmZpYwotCQkocEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSArIEJlYWNvbkxvc3RUaW1lIDwgTm93MzIpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkVBQ09OIGxvc3QgPiAlbGQgbXNlYyB3aXRoIFR4T2tDbnQ9JWxkIC0+IENRST0wXG4iLCBCZWFjb25Mb3N0VGltZSwgVHhPa0NudCkpOwotCQlwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkgPSAwOwotCX0KLQllbHNlCi0JewotCQkvLyBOb3JtYWxpemUgUnNzaQotCQlpZiAoTWF4UnNzaSA+IC00MCkKLQkJCU5vclJzc2kgPSAxMDA7Ci0JCWVsc2UgaWYgKE1heFJzc2kgPCAtOTApCi0JCQlOb3JSc3NpID0gMDsKLQkJZWxzZQotCQkJTm9yUnNzaSA9IChNYXhSc3NpICsgOTApICogMjsKLQotCQkvLyBDaGFubmVsUXVhbGl0eSA9IFcxKlJTU0kgKyBXMipUeFBSUiArIFczKlJ4UEVSCSAoUlNTSSAwLi4xMDApLCAoVHhQRVIgMTAwLi4wKSwgKFJ4UEVSIDEwMC4uMCkKLQkJcEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ID0gKFJTU0lfV0VJR0hUSU5HICogTm9yUnNzaSArCi0JCQkJCQkJCSAgIFRYX1dFSUdIVElORyAqICgxMDAgLSBUeFBSUikgKwotCQkJCQkJCQkgICBSWF9XRUlHSFRJTkcqICgxMDAgLSBSeFBFUikpIC8gMTAwOwotCQlpZiAocEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ID49IDEwMCkKLQkJCXBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSA9IDEwMDsKLQl9Ci0KLX0KLQotVk9JRCBNbG1lU2V0VHhSYXRlKAotCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCi0JSU4gUFJUTVBfVFhfUkFURV9TV0lUQ0gJcFR4UmF0ZSkKLXsKLQlVQ0hBUglNYXhNb2RlID0gTU9ERV9PRkRNOworCXU4IE1heE1vZGUgPSBNT0RFX09GRE07CiAKIAlNYXhNb2RlID0gTU9ERV9IVEdSRUVORklFTEQ7CiAKLQlpZiAocFR4UmF0ZS0+U1RCQyAmJiAocEFkLT5TdGFDZmcuTWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMpICYmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKQorCWlmIChwVHhSYXRlLT5TVEJDICYmIChwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQykKKwkgICAgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCiAJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TVEJDID0gU1RCQ19VU0U7CiAJZWxzZQogCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKQEAgLTE4OTYsODcgKzE3MTgsMTA5IEBACiAJaWYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPiA3KQogCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKIAotICAgCWlmIChBREhPQ19PTihwQWQpKQotCXsKLQkJLy8gSWYgcGVlciBhZGhvYyBpcyBiLW9ubHkgbW9kZSwgd2UgY2FuJ3Qgc2VuZCAxMWcgcmF0ZS4KKwlpZiAoQURIT0NfT04ocEFkKSkgeworCQkvKiBJZiBwZWVyIGFkaG9jIGlzIGItb25seSBtb2RlLCB3ZSBjYW4ndCBzZW5kIDExZyByYXRlLiAqLwogCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKLQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU1RCQwk9IFNUQkNfTk9ORTsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKIAotCQkvLwotCQkvLyBGb3IgQWRob2MgTU9ERV9DQ0ssIGRyaXZlciB3aWxsIHVzZSBBZGhvY0JPbmx5Sm9pbmVkIGZsYWcgdG8gcm9sbCBiYWNrIHRvIEIgb25seSBpZiBuZWNlc3NhcnkKLQkJLy8KLQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBUeFJhdGUtPk1vZGU7Ci0JCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKLQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCS8qICovCisJCS8qIEZvciBBZGhvYyBNT0RFX0NDSywgZHJpdmVyIHdpbGwgdXNlIEFkaG9jQk9ubHlKb2luZWQgZmxhZyB0byByb2xsIGJhY2sgdG8gQiBvbmx5IGlmIG5lY2Vzc2FyeSAqLworCQkvKiAqLworCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gcFR4UmF0ZS0+TW9kZTsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9CisJCSAgICBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKIAotCQkvLyBQYXRjaCBzcGVlZCBlcnJvciBpbiBzdGF0dXMgcGFnZQorCQkvKiBQYXRjaCBzcGVlZCBlcnJvciBpbiBzdGF0dXMgcGFnZSAqLwogCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREU7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJaWYgKHBUeFJhdGUtPk1vZGUgPD0gTWF4TW9kZSkKIAkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gcFR4UmF0ZS0+TW9kZTsKIAotCQlpZiAocFR4UmF0ZS0+U2hvcnRHSSAmJiAocEFkLT5TdGFDZmcuTWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kpKQorCQlpZiAocFR4UmF0ZS0+U2hvcnRHSQorCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJKSkKIAkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfNDAwOwogCQllbHNlCiAJCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKIAotCQkvLyBSZWV4YW0gZWFjaCBiYW5kd2lkdGgncyBTR0kgc3VwcG9ydC4KLQkJaWYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID09IEdJXzQwMCkKLQkJewotCQkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5CVyA9PSBCV18yMCkgJiYgKCFDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpKSkKKwkJLyogUmVleGFtIGVhY2ggYmFuZHdpZHRoJ3MgU0dJIHN1cHBvcnQuICovCisJCWlmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9PSBHSV80MDApIHsKKwkJCWlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuQlcgPT0gQldfMjApCisJCQkgICAgJiYKKwkJCSAgICAoIUNMSUVOVF9TVEFUVVNfVEVTVF9GTEFHCisJCQkgICAgIChwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpKSkKIAkJCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKLQkJCWlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuQlcgPT0gQldfNDApICYmICghQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKSkpCisJCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLkJXID09IEJXXzQwKQorCQkJICAgICYmCisJCQkgICAgKCFDTElFTlRfU1RBVFVTX1RFU1RfRkxBRworCQkJICAgICAocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKSkpCiAJCQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CiAJCX0KKwkJLyogVHVybiBSVFMvQ1RTIHJhdGUgdG8gNk1icHMuICovCisJCWlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID09IDApCisJCSAgICAmJiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyAhPSAwKSkgeworCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0KKwkJCSAgICBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJaWYgKHBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24pIHsKKwkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIEhUX0ZPUkNFUlRTQ1RTLAorCQkJCQkJICBBTExOX1NFVFBST1RFQ1QsIFRSVUUsCisJCQkJCQkgIChCT09MRUFOKSBwQWQtPk1sbWVBdXguCisJCQkJCQkgIEFkZEh0SW5mby5BZGRIdEluZm8yLgorCQkJCQkJICBOb25HZlByZXNlbnQpOworCQkJfSBlbHNlIHsKKwkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uCisJCQkJCQkgIEFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLAorCQkJCQkJICBBTExOX1NFVFBST1RFQ1QsIFRSVUUsCisJCQkJCQkgIChCT09MRUFOKSBwQWQtPk1sbWVBdXguCisJCQkJCQkgIEFkZEh0SW5mby5BZGRIdEluZm8yLgorCQkJCQkJICBOb25HZlByZXNlbnQpOworCQkJfQorCQl9IGVsc2UgaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gOCkKKwkJCSAgICYmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTICE9IDgpKSB7CisJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPQorCQkJICAgIHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCQlpZiAocEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbikgeworCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfRk9SQ0VSVFNDVFMsCisJCQkJCQkgIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwKKwkJCQkJCSAgKEJPT0xFQU4pIHBBZC0+TWxtZUF1eC4KKwkJCQkJCSAgQWRkSHRJbmZvLkFkZEh0SW5mbzIuCisJCQkJCQkgIE5vbkdmUHJlc2VudCk7CisJCQl9IGVsc2UgeworCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwKKwkJCQkJCSAgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby4KKwkJCQkJCSAgQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsCisJCQkJCQkgIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwKKwkJCQkJCSAgKEJPT0xFQU4pIHBBZC0+TWxtZUF1eC4KKwkJCQkJCSAgQWRkSHRJbmZvLkFkZEh0SW5mbzIuCisJCQkJCQkgIE5vbkdmUHJlc2VudCk7CisJCQl9CisJCX0gZWxzZSBpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyAhPSAwKQorCQkJICAgJiYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gMCkpIHsKKwkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfUlRTQ1RTXzZNLCBBTExOX1NFVFBST1RFQ1QsCisJCQkJCSAgVFJVRSwKKwkJCQkJICAoQk9PTEVBTikgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby4KKwkJCQkJICBBZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7CiAKLQkJLy8gVHVybiBSVFMvQ1RTIHJhdGUgdG8gNk1icHMuCi0JCWlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID09IDApICYmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTICE9IDApKQotCQl7Ci0JCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKLQkJCWlmIChwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uKQotCQkJewotCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfRk9SQ0VSVFNDVFMsIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gOCkgJiYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgIT0gOCkpCi0JCXsKLQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUwkJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOwotCQkJaWYgKHBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24pCi0JCQl7Ci0JCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBIVF9GT1JDRVJUU0NUUywgQUxMTl9TRVRQUk9URUNULCBUUlVFLCAoQk9PTEVBTilwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50KTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyAhPSAwKSAmJiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAwKSkKLQkJewotCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBIVF9SVFNDVFNfNk0sIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7Ci0KLQkJfQotCQllbHNlIGlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTICE9IDgpICYmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTID09IDgpKQotCQl7Ci0JCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIEhUX1JUU0NUU182TSwgQUxMTl9TRVRQUk9URUNULCBUUlVFLCAoQk9PTEVBTilwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50KTsKKwkJfSBlbHNlIGlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTICE9IDgpCisJCQkgICAmJiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9PSA4KSkgeworCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBIVF9SVFNDVFNfNk0sIEFMTE5fU0VUUFJPVEVDVCwKKwkJCQkJICBUUlVFLAorCQkJCQkgIChCT09MRUFOKSBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLgorCQkJCQkgIEFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50KTsKIAkJfQogCi0JCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQzsKLQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJOwotCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKLQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFOwotCi0JCWlmICgocEFkLT5TdGFDZmcuTWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPT0gTU9ERV9IVEdSRUVORklFTEQpICYmCi0JCSAgICBwQWQtPldJRkl0ZXN0YmVkLmJHcmVlbkZpZWxkKQotCQkgICAgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRHUkVFTkZJRUxEOworCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkM7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPQorCQkgICAgcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0k7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKwkJaWYgKChwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9PSBNT0RFX0hUR1JFRU5GSUVMRCkKKwkJICAgICYmIHBBZC0+V0lGSXRlc3RiZWQuYkdyZWVuRmllbGQpCisJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7CiAJfQogCi0JcEFkLT5MYXN0VHhSYXRlID0gKFVTSE9SVCkocEVudHJ5LT5IVFBoeU1vZGUud29yZCk7CisJcEFkLT5MYXN0VHhSYXRlID0gKHUxNikocEVudHJ5LT5IVFBoeU1vZGUud29yZCk7CiB9CiAKIC8qCkBAIC0xOTk2LDQ3ICsxODQwLDM5IEBACiAJCWNhbGwgdGhpcyByb3V0aW5lIGV2ZXJ5IHNlY29uZAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCit2b2lkIE1sbWVEeW5hbWljVHhSYXRlU3dpdGNoaW5nKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlVQ0hBUgkJCQkJVXBSYXRlSWR4ID0gMCwgRG93blJhdGVJZHggPSAwLCBDdXJyUmF0ZUlkeDsKLQlVTE9ORwkJCQkJaSwgQWNjdVR4VG90YWxDbnQgPSAwLCBUeFRvdGFsQ250OwotCVVMT05HCQkJCQlUeEVycm9yUmF0aW8gPSAwOwotCUJPT0xFQU4JCQkJCWJUeFJhdGVDaGFuZ2VkLCBiVXBncmFkZVF1YWxpdHkgPSBGQUxTRTsKLQlQUlRNUF9UWF9SQVRFX1NXSVRDSAlwQ3VyclR4UmF0ZSwgcE5leHRUeFJhdGUgPSBOVUxMOwotCVBVQ0hBUgkJCQkJcFRhYmxlOwotCVVDSEFSCQkJCQlUYWJsZVNpemUgPSAwOwotCVVDSEFSCQkJCQlJbml0VHhSYXRlSWR4ID0gMCwgVHJhaW5VcCwgVHJhaW5Eb3duOwotCUNIQVIJCQkJCVJzc2ksIFJzc2lPZmZzZXQgPSAwOwotCVRYX1NUQV9DTlQxX1NUUlVDCQlTdGFUeDE7Ci0JVFhfU1RBX0NOVDBfU1RSVUMJCVR4U3RhQ250MDsKLQlVTE9ORwkJCQkJVHhSZXRyYW5zbWl0ID0gMCwgVHhTdWNjZXNzID0gMCwgVHhGYWlsQ291bnQgPSAwOwotCU1BQ19UQUJMRV9FTlRSWQkJCSpwRW50cnk7CisJdTggVXBSYXRlSWR4ID0gMCwgRG93blJhdGVJZHggPSAwLCBDdXJyUmF0ZUlkeDsKKwl1bnNpZ25lZCBsb25nIGksIEFjY3VUeFRvdGFsQ250ID0gMCwgVHhUb3RhbENudDsKKwl1bnNpZ25lZCBsb25nIFR4RXJyb3JSYXRpbyA9IDA7CisJQk9PTEVBTiBiVHhSYXRlQ2hhbmdlZCA9IEZBTFNFLCBiVXBncmFkZVF1YWxpdHkgPSBGQUxTRTsKKwlzdHJ1Y3QgcnRfcnRtcF90eF9yYXRlX3N3aXRjaCAqcEN1cnJUeFJhdGUsICpwTmV4dFR4UmF0ZSA9IE5VTEw7CisJdTggKnBUYWJsZTsKKwl1OCBUYWJsZVNpemUgPSAwOworCXU4IEluaXRUeFJhdGVJZHggPSAwLCBUcmFpblVwLCBUcmFpbkRvd247CisJY2hhciBSc3NpLCBSc3NpT2Zmc2V0ID0gMDsKKwlUWF9TVEFfQ05UMV9TVFJVQyBTdGFUeDE7CisJVFhfU1RBX0NOVDBfU1RSVUMgVHhTdGFDbnQwOworCXVuc2lnbmVkIGxvbmcgVHhSZXRyYW5zbWl0ID0gMCwgVHhTdWNjZXNzID0gMCwgVHhGYWlsQ291bnQgPSAwOworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeTsKKwlzdHJ1Y3QgcnRfcnNzaV9zYW1wbGUgKnBSc3NpID0gJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGU7CiAKLQkvLwotCS8vIHdhbGsgdGhyb3VnaCBNQUMgdGFibGUsIHNlZSBpZiBuZWVkIHRvIGNoYW5nZSBBUCdzIFRYIHJhdGUgdG93YXJkIGVhY2ggZW50cnkKLQkvLwotICAgCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQotCXsKKwkvKiAqLworCS8qIHdhbGsgdGhyb3VnaCBNQUMgdGFibGUsIHNlZSBpZiBuZWVkIHRvIGNoYW5nZSBBUCdzIFRYIHJhdGUgdG93YXJkIGVhY2ggZW50cnkgKi8KKwkvKiAqLworCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKSB7CiAJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOwogCi0JCS8vIGNoZWNrIGlmIHRoaXMgZW50cnkgbmVlZCB0byBzd2l0Y2ggcmF0ZSBhdXRvbWF0aWNhbGx5CisJCS8qIGNoZWNrIGlmIHRoaXMgZW50cnkgbmVlZCB0byBzd2l0Y2ggcmF0ZSBhdXRvbWF0aWNhbGx5ICovCiAJCWlmIChSVE1QQ2hlY2tFbnRyeUVuYWJsZUF1dG9SYXRlU3dpdGNoKHBBZCwgcEVudHJ5KSA9PSBGQUxTRSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmICgocEFkLT5NYWNUYWIuU2l6ZSA9PSAxKSB8fCAocEVudHJ5LT5WYWxpZEFzRGxzKSkKLQkJewotI2lmZGVmIFJUMjg2MAotCQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgKENIQVIpcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCwgKENIQVIpcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSwgKENIQVIpcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMik7Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKKwkJaWYgKChwQWQtPk1hY1RhYi5TaXplID09IDEpIHx8IChwRW50cnktPlZhbGlkQXNEbHMpKSB7CiAJCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLAotCQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAsCi0JCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSwKLQkJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKLSNlbmRpZgorCQkJCQkgICBwUnNzaS0+QXZnUnNzaTAsCisJCQkJCSAgIHBSc3NpLT5BdmdSc3NpMSwgcFJzc2ktPkF2Z1Jzc2kyKTsKIAotCQkJLy8gVXBkYXRlIHN0YXRpc3RpYyBjb3VudGVyCisJCQkvKiBVcGRhdGUgc3RhdGlzdGljIGNvdW50ZXIgKi8KIAkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDAsICZUeFN0YUNudDAud29yZCk7CiAJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQxLCAmU3RhVHgxLndvcmQpOwogCQkJcEFkLT5iVXBkYXRlQmNuQ250RG9uZSA9IFRSVUU7CkBAIC0yMDQ1LDI5MSArMTg4MSwyOTMgQEAKIAkJCVR4RmFpbENvdW50ID0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OwogCQkJVHhUb3RhbENudCA9IFR4UmV0cmFuc21pdCArIFR4U3VjY2VzcyArIFR4RmFpbENvdW50OwogCi0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICs9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKLQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OwotCQkJcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LnUuTG93UGFydCArPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOwotCQkJcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKLQkJCXBBZC0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LnUuTG93UGFydCArPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICs9CisJCQkgICAgU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArPQorCQkJICAgIFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50ICs9CisJCQkgICAgVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OworCQkJcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LnUuTG93UGFydCArPQorCQkJICAgIFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJCQlwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LnUuTG93UGFydCArPQorCQkJICAgIFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJCQlwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC51Lkxvd1BhcnQgKz0KKwkJCSAgICBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CiAKLQkJCS8vIGlmIG5vIHRyYWZmaWMgaW4gdGhlIHBhc3QgMS1zZWMgcGVyaW9kLCBkb24ndCBjaGFuZ2UgVFggcmF0ZSwKLQkJCS8vIGJ1dCBjbGVhciBhbGwgYmFkIGhpc3RvcnkuIGJlY2F1c2UgdGhlIGJhZCBoaXN0b3J5IG1heSBhZmZlY3QgdGhlIG5leHQKLQkJCS8vIENoYXJpb3QgdGhyb3VnaHB1dCB0ZXN0Ci0JCQlBY2N1VHhUb3RhbENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArCi0JCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArCi0JCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKKwkJCS8qIGlmIG5vIHRyYWZmaWMgaW4gdGhlIHBhc3QgMS1zZWMgcGVyaW9kLCBkb24ndCBjaGFuZ2UgVFggcmF0ZSwgKi8KKwkJCS8qIGJ1dCBjbGVhciBhbGwgYmFkIGhpc3RvcnkuIGJlY2F1c2UgdGhlIGJhZCBoaXN0b3J5IG1heSBhZmZlY3QgdGhlIG5leHQgKi8KKwkJCS8qIENoYXJpb3QgdGhyb3VnaHB1dCB0ZXN0ICovCisJCQlBY2N1VHhUb3RhbENudCA9CisJCQkgICAgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKKwkJCSAgICBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCSAgICBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50OwogCiAJCQlpZiAoVHhUb3RhbENudCkKLQkJCQlUeEVycm9yUmF0aW8gPSAoKFR4UmV0cmFuc21pdCArIFR4RmFpbENvdW50KSAqIDEwMCkgLyBUeFRvdGFsQ250OwotCQl9Ci0JCWVsc2UKLQkJewotI2lmZGVmIFJUMjg2MAotCQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgKENIQVIpcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kwLCAoQ0hBUilwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTEsIChDSEFSKXBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMik7Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKKwkJCQlUeEVycm9yUmF0aW8gPQorCQkJCSAgICAoKFR4UmV0cmFuc21pdCArCisJCQkJICAgICAgVHhGYWlsQ291bnQpICogMTAwKSAvIFR4VG90YWxDbnQ7CisJCX0gZWxzZSB7CiAJCQlpZiAoSU5GUkFfT04ocEFkKSAmJiAoaSA9PSAxKSkKIAkJCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLAotCQkJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwLAotCQkJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxLAotCQkJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKKwkJCQkJCSAgIHBSc3NpLT5BdmdSc3NpMCwKKwkJCQkJCSAgIHBSc3NpLT5BdmdSc3NpMSwKKwkJCQkJCSAgIHBSc3NpLT5BdmdSc3NpMik7CiAJCQllbHNlCiAJCQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwKLQkJCQkJCQkJICAgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kwLAotCQkJCQkJCQkgICBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTEsCi0JCQkJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMik7Ci0jZW5kaWYKKwkJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMCwKKwkJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMSwKKwkJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMik7CiAKIAkJCVR4VG90YWxDbnQgPSBwRW50cnktPk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKwotCQkJCSBwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKLQkJCQkgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudDsKKwkJCSAgICBwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCSAgICBwRW50cnktPk9uZVNlY1R4RmFpbENvdW50OwogCiAJCQlpZiAoVHhUb3RhbENudCkKLQkJCQlUeEVycm9yUmF0aW8gPSAoKHBFbnRyeS0+T25lU2VjVHhSZXRyeU9rQ291bnQgKyBwRW50cnktPk9uZVNlY1R4RmFpbENvdW50KSAqIDEwMCkgLyBUeFRvdGFsQ250OworCQkJCVR4RXJyb3JSYXRpbyA9CisJCQkJICAgICgocEVudHJ5LT5PbmVTZWNUeFJldHJ5T2tDb3VudCArCisJCQkJICAgICAgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudCkgKiAxMDApIC8KKwkJCQkgICAgVHhUb3RhbENudDsKKwkJfQorCisJCWlmIChUeFRvdGFsQ250KSB7CisJCQkvKgorCQkJICAgVGhyZWUgQWRIb2MgY29ubmVjdGlvbnMgY2FuIG5vdCB3b3JrIG5vcm1hbGx5IGlmIG9uZSBBZEhvYyBjb25uZWN0aW9uIGlzIGRpc2FwcGVhcmVkIGZyb20gYSBoZWF2eSB0cmFmZmljIGVudmlyb25tZW50IGdlbmVyYXRlZCBieSBwaW5nIHRvb2wKKwkJCSAgIFdlIGZvcmNlIHRvIHNldCBMb25nUnR5TGltaXQgYW5kIFNob3J0UnR5TGltaXQgdG8gMCB0byBzdG9wIHJldHJhbnNtaXR0aW5nIHBhY2tldCwgYWZ0ZXIgYSB3aGlsZSwgcmVzb3Jpbmcgb3JpZ2luYWwgc2V0dGluZ3MKKwkJCSAqLworCQkJaWYgKFR4RXJyb3JSYXRpbyA9PSAxMDApIHsKKwkJCQlUWF9SVFlfQ0ZHX1NUUlVDIFR4UnR5Q2ZnLCBUeFJ0eUNmZ3RtcDsKKwkJCQl1bnNpZ25lZCBsb25nIEluZGV4OworCQkJCXVuc2lnbmVkIGxvbmcgTUFDVmFsdWU7CisKKwkJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1JUWV9DRkcsICZUeFJ0eUNmZy53b3JkKTsKKwkJCQlUeFJ0eUNmZ3RtcC53b3JkID0gVHhSdHlDZmcud29yZDsKKwkJCQlUeFJ0eUNmZy5maWVsZC5Mb25nUnR5TGltaXQgPSAweDA7CisJCQkJVHhSdHlDZmcuZmllbGQuU2hvcnRSdHlMaW1pdCA9IDB4MDsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9SVFlfQ0ZHLCBUeFJ0eUNmZy53b3JkKTsKKworCQkJCVJUTVB1c2VjRGVsYXkoMSk7CisKKwkJCQlJbmRleCA9IDA7CisJCQkJTUFDVmFsdWUgPSAwOworCQkJCWRvIHsKKwkJCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWFJYUV9QQ05ULAorCQkJCQkJICAgICAgICZNQUNWYWx1ZSk7CisJCQkJCWlmICgoTUFDVmFsdWUgJiAweGZmZmZmZikgPT0gMCkKKwkJCQkJCWJyZWFrOworCQkJCQlJbmRleCsrOworCQkJCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCQkJCX0gd2hpbGUgKChJbmRleCA8IDMzMCkKKwkJCQkJICYmCisJCQkJCSAoIVJUTVBfVEVTVF9GTEFHCisJCQkJCSAgKHBBZCwKKwkJCQkJICAgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkpOworCisJCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9SVFlfQ0ZHLCAmVHhSdHlDZmcud29yZCk7CisJCQkJVHhSdHlDZmcuZmllbGQuTG9uZ1J0eUxpbWl0ID0KKwkJCQkgICAgVHhSdHlDZmd0bXAuZmllbGQuTG9uZ1J0eUxpbWl0OworCQkJCVR4UnR5Q2ZnLmZpZWxkLlNob3J0UnR5TGltaXQgPQorCQkJCSAgICBUeFJ0eUNmZ3RtcC5maWVsZC5TaG9ydFJ0eUxpbWl0OworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1JUWV9DRkcsIFR4UnR5Q2ZnLndvcmQpOworCQkJfQogCQl9CiAKIAkJQ3VyclJhdGVJZHggPSBwRW50cnktPkN1cnJUeFJhdGVJbmRleDsKIAotCQlNbG1lU2VsZWN0VHhSYXRlVGFibGUocEFkLCBwRW50cnksICZwVGFibGUsICZUYWJsZVNpemUsICZJbml0VHhSYXRlSWR4KTsKKwkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLAorCQkJCSAgICAgICZJbml0VHhSYXRlSWR4KTsKIAotCQlpZiAoQ3VyclJhdGVJZHggPj0gVGFibGVTaXplKQotCQl7CisJCWlmIChDdXJyUmF0ZUlkeCA+PSBUYWJsZVNpemUpIHsKIAkJCUN1cnJSYXRlSWR4ID0gVGFibGVTaXplIC0gMTsKIAkJfQotCi0JCS8vIFdoZW4gc3dpdGNoIGZyb20gRml4ZWQgcmF0ZSAtPiBhdXRvIHJhdGUsIHRoZSBSRUFMIFRYIHJhdGUgbWlnaHQgYmUgZGlmZmVyZW50IGZyb20gcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXguCi0JCS8vIFNvIG5lZWQgdG8gc3luYyBoZXJlLgotCQlwQ3VyclR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsoQ3VyclJhdGVJZHgrMSkqNV07CisJCS8qIFdoZW4gc3dpdGNoIGZyb20gRml4ZWQgcmF0ZSAtPiBhdXRvIHJhdGUsIHRoZSBSRUFMIFRYIHJhdGUgbWlnaHQgYmUgZGlmZmVyZW50IGZyb20gcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXguICovCisJCS8qIFNvIG5lZWQgdG8gc3luYyBoZXJlLiAqLworCQlwQ3VyclR4UmF0ZSA9CisJCSAgICAoc3RydWN0IHJ0X3J0bXBfdHhfcmF0ZV9zd2l0Y2ggKikgJiBwVGFibGVbKEN1cnJSYXRlSWR4ICsgMSkgKiA1XTsKIAkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgIT0gcEN1cnJUeFJhdGUtPkN1cnJNQ1MpCi0JCQkvLyYmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBUUlVFKQotCQkJKQotCQl7CisJCSAgICAvKiYmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBUUlVFKSAqLworCQkgICAgKSB7CiAKLQkJCS8vIE5lZWQgdG8gc3luYyBSZWFsIFR4IHJhdGUgYW5kIG91ciByZWNvcmQuCi0JCQkvLyBUaGVuIHJldHVybiBmb3IgbmV4dCBEUlMuCi0JCQlwQ3VyclR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsoSW5pdFR4UmF0ZUlkeCsxKSo1XTsKKwkJCS8qIE5lZWQgdG8gc3luYyBSZWFsIFR4IHJhdGUgYW5kIG91ciByZWNvcmQuICovCisJCQkvKiBUaGVuIHJldHVybiBmb3IgbmV4dCBEUlMuICovCisJCQlwQ3VyclR4UmF0ZSA9CisJCQkgICAgKHN0cnVjdCBydF9ydG1wX3R4X3JhdGVfc3dpdGNoICopICYgcFRhYmxlWyhJbml0VHhSYXRlSWR4ICsgMSkKKwkJCQkJCQkgICAgKiA1XTsKIAkJCXBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID0gSW5pdFR4UmF0ZUlkeDsKIAkJCU1sbWVTZXRUeFJhdGUocEFkLCBwRW50cnksIHBDdXJyVHhSYXRlKTsKIAotCQkJLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCisJCQkvKiByZXNldCBhbGwgT25lU2VjVHggY291bnRlcnMgKi8KIAkJCVJFU0VUX09ORV9TRUNfVFhfQ05UKHBFbnRyeSk7CiAJCQljb250aW51ZTsKIAkJfQotCi0JCS8vIGRlY2lkZSB0aGUgbmV4dCB1cGdyYWRlIHJhdGUgYW5kIGRvd25ncmFkZSByYXRlLCBpZiBhbnkKLQkJaWYgKChDdXJyUmF0ZUlkeCA+IDApICYmIChDdXJyUmF0ZUlkeCA8IChUYWJsZVNpemUgLSAxKSkpCi0JCXsKKwkJLyogZGVjaWRlIHRoZSBuZXh0IHVwZ3JhZGUgcmF0ZSBhbmQgZG93bmdyYWRlIHJhdGUsIGlmIGFueSAqLworCQlpZiAoKEN1cnJSYXRlSWR4ID4gMCkgJiYgKEN1cnJSYXRlSWR4IDwgKFRhYmxlU2l6ZSAtIDEpKSkgewogCQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHggKyAxOwotCQkJRG93blJhdGVJZHggPSBDdXJyUmF0ZUlkeCAtMTsKLQkJfQotCQllbHNlIGlmIChDdXJyUmF0ZUlkeCA9PSAwKQotCQl7CisJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4IC0gMTsKKwkJfSBlbHNlIGlmIChDdXJyUmF0ZUlkeCA9PSAwKSB7CiAJCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeCArIDE7CiAJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4OwotCQl9Ci0JCWVsc2UgaWYgKEN1cnJSYXRlSWR4ID09IChUYWJsZVNpemUgLSAxKSkKLQkJeworCQl9IGVsc2UgaWYgKEN1cnJSYXRlSWR4ID09IChUYWJsZVNpemUgLSAxKSkgewogCQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHg7CiAJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4IC0gMTsKIAkJfQogCi0JCXBDdXJyVHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhDdXJyUmF0ZUlkeCsxKSo1XTsKKwkJcEN1cnJUeFJhdGUgPQorCQkgICAgKHN0cnVjdCBydF9ydG1wX3R4X3JhdGVfc3dpdGNoICopICYgcFRhYmxlWyhDdXJyUmF0ZUlkeCArIDEpICogNV07CiAKLQkJaWYgKChSc3NpID4gLTY1KSAmJiAocEN1cnJUeFJhdGUtPk1vZGUgPj0gTU9ERV9IVE1JWCkpCi0JCXsKLQkJCVRyYWluVXAJCT0gKHBDdXJyVHhSYXRlLT5UcmFpblVwICsgKHBDdXJyVHhSYXRlLT5UcmFpblVwID4+IDEpKTsKLQkJCVRyYWluRG93bgk9IChwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duICsgKHBDdXJyVHhSYXRlLT5UcmFpbkRvd24gPj4gMSkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJVHJhaW5VcAkJPSBwQ3VyclR4UmF0ZS0+VHJhaW5VcDsKLQkJCVRyYWluRG93bgk9IHBDdXJyVHhSYXRlLT5UcmFpbkRvd247CisJCWlmICgoUnNzaSA+IC02NSkgJiYgKHBDdXJyVHhSYXRlLT5Nb2RlID49IE1PREVfSFRNSVgpKSB7CisJCQlUcmFpblVwID0KKwkJCSAgICAocEN1cnJUeFJhdGUtPlRyYWluVXAgKworCQkJICAgICAocEN1cnJUeFJhdGUtPlRyYWluVXAgPj4gMSkpOworCQkJVHJhaW5Eb3duID0KKwkJCSAgICAocEN1cnJUeFJhdGUtPlRyYWluRG93biArCisJCQkgICAgIChwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duID4+IDEpKTsKKwkJfSBlbHNlIHsKKwkJCVRyYWluVXAgPSBwQ3VyclR4UmF0ZS0+VHJhaW5VcDsKKwkJCVRyYWluRG93biA9IHBDdXJyVHhSYXRlLT5UcmFpbkRvd247CiAJCX0KIAotCQkvL3BBZC0+RHJzQ291bnRlcnMuTGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb24gPSBwQWQtPkRyc0NvdW50ZXJzLkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb247CisJCS8qcEFkLT5EcnNDb3VudGVycy5MYXN0VGltZVR4UmF0ZUNoYW5nZUFjdGlvbiA9IHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbjsgKi8KIAotCQkvLwotCQkvLyBLZWVwIHRoZSBsYXN0IHRpbWUgVHhSYXRlQ2hhbmdlQWN0aW9uIHN0YXR1cy4KLQkJLy8KLQkJcEVudHJ5LT5MYXN0VGltZVR4UmF0ZUNoYW5nZUFjdGlvbiA9IHBFbnRyeS0+TGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbjsKKwkJLyogKi8KKwkJLyogS2VlcCB0aGUgbGFzdCB0aW1lIFR4UmF0ZUNoYW5nZUFjdGlvbiBzdGF0dXMuICovCisJCS8qICovCisJCXBFbnRyeS0+TGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb24gPQorCQkgICAgcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOwogCisJCS8qICovCisJCS8qIENBU0UgMS4gd2hlbiBUWCBzYW1wbGVzIGFyZSBmZXdlciB0aGFuIDE1LCB0aGVuIGRlY2lkZSBUWCByYXRlIHNvbGVseSBvbiBSU1NJICovCisJCS8qICAgICAgICAgKGNyaXRlcmlhIGNvcGllZCBmcm9tIFJUMjUwMCBmb3IgTmV0b3BpYSBjYXNlKSAqLworCQkvKiAqLworCQlpZiAoVHhUb3RhbENudCA8PSAxNSkgeworCQkJY2hhciBpZHggPSAwOworCQkJdTggVHhSYXRlSWR4OworCQkJdTggTUNTMCA9IDAsIE1DUzEgPSAwLCBNQ1MyID0gMCwgTUNTMyA9IDAsIE1DUzQgPQorCQkJICAgIDAsIE1DUzUgPSAwLCBNQ1M2ID0gMCwgTUNTNyA9IDA7CisJCQl1OCBNQ1MxMiA9IDAsIE1DUzEzID0gMCwgTUNTMTQgPSAwLCBNQ1MxNSA9IDA7CisJCQl1OCBNQ1MyMCA9IDAsIE1DUzIxID0gMCwgTUNTMjIgPSAwLCBNQ1MyMyA9IDA7CS8qIDMqMyAqLwogCisJCQkvKiBjaGVjayB0aGUgZXhpc3RlbmNlIGFuZCBpbmRleCBvZiBlYWNoIG5lZWRlZCBNQ1MgKi8KKwkJCXdoaWxlIChpZHggPCBwVGFibGVbMF0pIHsKKwkJCQlwQ3VyclR4UmF0ZSA9CisJCQkJICAgIChzdHJ1Y3QgcnRfcnRtcF90eF9yYXRlX3N3aXRjaCAqKSAmIHBUYWJsZVsoaWR4ICsgMSkgKgorCQkJCQkJCQkgICAgNV07CiAKLQkJLy8KLQkJLy8gQ0FTRSAxLiB3aGVuIFRYIHNhbXBsZXMgYXJlIGZld2VyIHRoYW4gMTUsIHRoZW4gZGVjaWRlIFRYIHJhdGUgc29sZWx5IG9uIFJTU0kKLQkJLy8gICAgICAgICAoY3JpdGVyaWEgY29waWVkIGZyb20gUlQyNTAwIGZvciBOZXRvcGlhIGNhc2UpCi0JCS8vCi0JCWlmIChUeFRvdGFsQ250IDw9IDE1KQotCQl7Ci0JCQlDSEFSCWlkeCA9IDA7Ci0JCQlVQ0hBUglUeFJhdGVJZHg7Ci0JCQkvL1VDSEFSCU1DUzAgPSAwLCBNQ1MxID0gMCwgTUNTMiA9IDAsIE1DUzMgPSAwLCBNQ1M0ID0gMCwgTUNTNyA9IDAsIE1DUzEyID0gMCwgTUNTMTMgPSAwLCBNQ1MxNCA9IDAsIE1DUzE1ID0gMDsKLQkJCVVDSEFSCU1DUzAgPSAwLCBNQ1MxID0gMCwgTUNTMiA9IDAsIE1DUzMgPSAwLCBNQ1M0ID0gMCwgIE1DUzUgPTAsIE1DUzYgPSAwLCBNQ1M3ID0gMDsKLQkgICAgICAgIFVDSEFSCU1DUzEyID0gMCwgTUNTMTMgPSAwLCBNQ1MxNCA9IDAsIE1DUzE1ID0gMDsKLQkJCVVDSEFSCU1DUzIwID0gMCwgTUNTMjEgPSAwLCBNQ1MyMiA9IDAsIE1DUzIzID0gMDsgLy8gMyozCi0KLQkJCS8vIGNoZWNrIHRoZSBleGlzdGVuY2UgYW5kIGluZGV4IG9mIGVhY2ggbmVlZGVkIE1DUwotCQkJd2hpbGUgKGlkeCA8IHBUYWJsZVswXSkKLQkJCXsKLQkJCQlwQ3VyclR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsoaWR4KzEpKjVdOwotCi0JCQkJaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18wKQotCQkJCXsKKwkJCQlpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzApIHsKIAkJCQkJTUNTMCA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzEpCi0JCQkJeworCQkJCX0gZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzEpIHsKIAkJCQkJTUNTMSA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIpCi0JCQkJeworCQkJCX0gZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIpIHsKIAkJCQkJTUNTMiA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzMpCi0JCQkJeworCQkJCX0gZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzMpIHsKIAkJCQkJTUNTMyA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzQpCi0JCQkJeworCQkJCX0gZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzQpIHsKIAkJCQkJTUNTNCA9IGlkeDsKKwkJCQl9IGVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU181KSB7CisJCQkJCU1DUzUgPSBpZHg7CisJCQkJfSBlbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfNikgeworCQkJCQlNQ1M2ID0gaWR4OwogCQkJCX0KLQkgICAgICAgICAgICBlbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfNSkKLQkgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgIE1DUzUgPSBpZHg7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU182KQotCSAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgTUNTNiA9IGlkeDsKLQkgICAgICAgICAgICB9Ci0JCQkJLy9lbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfNykKLQkJCQllbHNlIGlmICgocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzcpICYmIChwQ3VyclR4UmF0ZS0+U2hvcnRHSSA9PSBHSV84MDApKQkvLyBwcmV2ZW50IHRoZSBoaWdoZXN0IE1DUyB1c2luZyBzaG9ydCBHSSB3aGVuIDFUIGFuZCBsb3cgdGhyb3VnaHB1dAorCQkJCS8qZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzcpICovCisJCQkJZWxzZSBpZiAoKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU183KSAmJiAocEN1cnJUeFJhdGUtPlNob3J0R0kgPT0gR0lfODAwKSkJLyogcHJldmVudCB0aGUgaGlnaGVzdCBNQ1MgdXNpbmcgc2hvcnQgR0kgd2hlbiAxVCBhbmQgbG93IHRocm91Z2hwdXQgKi8KIAkJCQl7CiAJCQkJCU1DUzcgPSBpZHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xMikKLQkJCQl7CisJCQkJfSBlbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTIpIHsKIAkJCQkJTUNTMTIgPSBpZHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xMykKLQkJCQl7CisJCQkJfSBlbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTMpIHsKIAkJCQkJTUNTMTMgPSBpZHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xNCkKLQkJCQl7CisJCQkJfSBlbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTQpIHsKIAkJCQkJTUNTMTQgPSBpZHg7CiAJCQkJfQotCQkJCWVsc2UgaWYgKChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTUpICYmIChwQ3VyclR4UmF0ZS0+U2hvcnRHSSA9PSBHSV84MDApKQkvL3dlIGhvcGUgdG8gdXNlIFNob3J0R0kgYXMgaW5pdGlhbCByYXRlLCBob3dldmVyIEF0aGVyb3MncyBjaGlwIGhhcyBidWdzIHdoZW4gc2hvcnQgR0kKKwkJCQllbHNlIGlmICgocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzE1KSAmJiAocEN1cnJUeFJhdGUtPlNob3J0R0kgPT0gR0lfODAwKSkJLyp3ZSBob3BlIHRvIHVzZSBTaG9ydEdJIGFzIGluaXRpYWwgcmF0ZSwgaG93ZXZlciBBdGhlcm9zJ3MgY2hpcCBoYXMgYnVncyB3aGVuIHNob3J0IEdJICovCiAJCQkJewogCQkJCQlNQ1MxNSA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIwKSAvLyAzKjMKKwkJCQl9IGVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yMCkJLyogMyozICovCiAJCQkJewogCQkJCQlNQ1MyMCA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIxKQotCQkJCXsKKwkJCQl9IGVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yMSkgewogCQkJCQlNQ1MyMSA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIyKQotCQkJCXsKKwkJCQl9IGVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yMikgewogCQkJCQlNQ1MyMiA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIzKQotCQkJCXsKKwkJCQl9IGVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yMykgewogCQkJCQlNQ1MyMyA9IGlkeDsKIAkJCQl9Ci0JCQkJaWR4ICsrOworCQkJCWlkeCsrOwogCQkJfQogCi0JCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQotCQkJewotCQkJCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JHKQotCQkJCXsKKwkJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpIHsKKwkJCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yRykgewogCQkJCQlSc3NpT2Zmc2V0ID0gMjsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKKwkJCQl9IGVsc2UgewogCQkJCQlSc3NpT2Zmc2V0ID0gNTsKIAkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckEpCi0JCQkJeworCQkJfSBlbHNlIHsKKwkJCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yQSkgewogCQkJCQlSc3NpT2Zmc2V0ID0gNTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKKwkJCQl9IGVsc2UgewogCQkJCQlSc3NpT2Zmc2V0ID0gODsKIAkJCQl9CiAJCQl9CiAKLQkJCS8qaWYgKE1DUzE1KSovCi0JCQlpZiAoKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjNTKSB8fAotCQkJCShwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFOM1MpIHx8Ci0JCQkJKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUpKQotCQkJey8vIE4gbW9kZSB3aXRoIDMgc3RyZWFtIC8vIDMqMworCQkJLyppZiAoTUNTMTUpICovCisJCQlpZiAoKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjNTKSB8fCAocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjNTKSB8fCAocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZSkpIHsJLyogTiBtb2RlIHdpdGggMyBzdHJlYW0gLy8gMyozICovCiAJCQkJaWYgKE1DUzIzICYmIChSc3NpID49IC03MCkpCi0JCQkJCVR4UmF0ZUlkeCA9IE1DUzE1OworCQkJCQlUeFJhdGVJZHggPSBNQ1MyMzsKIAkJCQllbHNlIGlmIChNQ1MyMiAmJiAoUnNzaSA+PSAtNzIpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MxNDsKLSAgICAgICAgCSAgICBlbHNlIGlmIChNQ1MyMSAmJiAoUnNzaSA+PSAtNzYpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MxMzsKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMjI7CisJCQkJZWxzZSBpZiAoTUNTMjEgJiYgKFJzc2kgPj0gLTc2KSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMjE7CiAJCQkJZWxzZSBpZiAoTUNTMjAgJiYgKFJzc2kgPj0gLTc4KSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTMTI7Ci0JCQllbHNlIGlmIChNQ1M0ICYmIChSc3NpID49IC04MikpCi0JCQkJVHhSYXRlSWR4ID0gTUNTNDsKLQkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPj0gLTg0KSkKLQkJCQlUeFJhdGVJZHggPSBNQ1MzOwotCQkJZWxzZSBpZiAoTUNTMiAmJiAoUnNzaSA+PSAtODYpKQotCQkJCVR4UmF0ZUlkeCA9IE1DUzI7Ci0JCQllbHNlIGlmIChNQ1MxICYmIChSc3NpID49IC04OCkpCi0JCQkJVHhSYXRlSWR4ID0gTUNTMTsKLQkJCWVsc2UKLQkJCQlUeFJhdGVJZHggPSBNQ1MwOwotCQl9Ci0JCWVsc2UgaWYgKChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yUykgfHwgKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmQpIHx8KHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4yUykgfHwocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmQpKSAvLyAzKjMKLQkJCXsvLyBOIG1vZGUgd2l0aCAyIHN0cmVhbQotCQkJCWlmIChNQ1MxNSAmJiAoUnNzaSA+PSAoLTcwK1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMjA7CisJCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+PSAtODIpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M0OworCQkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPj0gLTg0KSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMzsKKwkJCQllbHNlIGlmIChNQ1MyICYmIChSc3NpID49IC04NikpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzI7CisJCQkJZWxzZSBpZiAoTUNTMSAmJiAoUnNzaSA+PSAtODgpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MxOworCQkJCWVsc2UKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMDsKKwkJCX0KKy8qICAgICAgICAgICAgICBlbHNlIGlmICgocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlMpIHx8IChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kKSB8fChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFOMlMpIHx8KHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kKSB8fCAocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZSkpICovCisJCQllbHNlIGlmICgocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlMpIHx8IChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kKSB8fCAocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjJTKSB8fCAocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmQpKQkvKiAzKjMgKi8KKwkJCXsJLyogTiBtb2RlIHdpdGggMiBzdHJlYW0gKi8KKwkJCQlpZiAoTUNTMTUgJiYgKFJzc2kgPj0gKC03MCArIFJzc2lPZmZzZXQpKSkKIAkJCQkJVHhSYXRlSWR4ID0gTUNTMTU7Ci0JCQkJZWxzZSBpZiAoTUNTMTQgJiYgKFJzc2kgPj0gKC03MitSc3NpT2Zmc2V0KSkpCisJCQkJZWxzZSBpZiAoTUNTMTQgJiYgKFJzc2kgPj0gKC03MiArIFJzc2lPZmZzZXQpKSkKIAkJCQkJVHhSYXRlSWR4ID0gTUNTMTQ7Ci0JCQkJZWxzZSBpZiAoTUNTMTMgJiYgKFJzc2kgPj0gKC03NitSc3NpT2Zmc2V0KSkpCisJCQkJZWxzZSBpZiAoTUNTMTMgJiYgKFJzc2kgPj0gKC03NiArIFJzc2lPZmZzZXQpKSkKIAkJCQkJVHhSYXRlSWR4ID0gTUNTMTM7Ci0JCQkJZWxzZSBpZiAoTUNTMTIgJiYgKFJzc2kgPj0gKC03OCtSc3NpT2Zmc2V0KSkpCisJCQkJZWxzZSBpZiAoTUNTMTIgJiYgKFJzc2kgPj0gKC03OCArIFJzc2lPZmZzZXQpKSkKIAkJCQkJVHhSYXRlSWR4ID0gTUNTMTI7Ci0JCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+PSAoLTgyK1Jzc2lPZmZzZXQpKSkKKwkJCQllbHNlIGlmIChNQ1M0ICYmIChSc3NpID49ICgtODIgKyBSc3NpT2Zmc2V0KSkpCiAJCQkJCVR4UmF0ZUlkeCA9IE1DUzQ7Ci0JCQkJZWxzZSBpZiAoTUNTMyAmJiAoUnNzaSA+PSAoLTg0K1Jzc2lPZmZzZXQpKSkKKwkJCQllbHNlIGlmIChNQ1MzICYmIChSc3NpID49ICgtODQgKyBSc3NpT2Zmc2V0KSkpCiAJCQkJCVR4UmF0ZUlkeCA9IE1DUzM7Ci0JCQkJZWxzZSBpZiAoTUNTMiAmJiAoUnNzaSA+PSAoLTg2K1Jzc2lPZmZzZXQpKSkKKwkJCQllbHNlIGlmIChNQ1MyICYmIChSc3NpID49ICgtODYgKyBSc3NpT2Zmc2V0KSkpCiAJCQkJCVR4UmF0ZUlkeCA9IE1DUzI7Ci0JCQkJZWxzZSBpZiAoTUNTMSAmJiAoUnNzaSA+PSAoLTg4K1Jzc2lPZmZzZXQpKSkKKwkJCQllbHNlIGlmIChNQ1MxICYmIChSc3NpID49ICgtODggKyBSc3NpT2Zmc2V0KSkpCiAJCQkJCVR4UmF0ZUlkeCA9IE1DUzE7CiAJCQkJZWxzZQogCQkJCQlUeFJhdGVJZHggPSBNQ1MwOwotCQkJfQotCQkJZWxzZSBpZiAoKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjFTKSB8fCAocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjFTKSkKLQkJCXsvLyBOIG1vZGUgd2l0aCAxIHN0cmVhbQotCQkJCWlmIChNQ1M3ICYmIChSc3NpID4gKC03MitSc3NpT2Zmc2V0KSkpCisJCQl9IGVsc2UgaWYgKChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04xUykgfHwgKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4xUykpIHsJLyogTiBtb2RlIHdpdGggMSBzdHJlYW0gKi8KKwkJCQlpZiAoTUNTNyAmJiAoUnNzaSA+ICgtNzIgKyBSc3NpT2Zmc2V0KSkpCiAJCQkJCVR4UmF0ZUlkeCA9IE1DUzc7Ci0JCQkJZWxzZSBpZiAoTUNTNiAmJiAoUnNzaSA+ICgtNzQrUnNzaU9mZnNldCkpKQorCQkJCWVsc2UgaWYgKE1DUzYgJiYgKFJzc2kgPiAoLTc0ICsgUnNzaU9mZnNldCkpKQogCQkJCQlUeFJhdGVJZHggPSBNQ1M2OwotCQkJCWVsc2UgaWYgKE1DUzUgJiYgKFJzc2kgPiAoLTc3K1Jzc2lPZmZzZXQpKSkKKwkJCQllbHNlIGlmIChNQ1M1ICYmIChSc3NpID4gKC03NyArIFJzc2lPZmZzZXQpKSkKIAkJCQkJVHhSYXRlSWR4ID0gTUNTNTsKLQkJCQllbHNlIGlmIChNQ1M0ICYmIChSc3NpID4gKC03OStSc3NpT2Zmc2V0KSkpCisJCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+ICgtNzkgKyBSc3NpT2Zmc2V0KSkpCiAJCQkJCVR4UmF0ZUlkeCA9IE1DUzQ7Ci0JCQkJZWxzZSBpZiAoTUNTMyAmJiAoUnNzaSA+ICgtODErUnNzaU9mZnNldCkpKQorCQkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPiAoLTgxICsgUnNzaU9mZnNldCkpKQogCQkJCQlUeFJhdGVJZHggPSBNQ1MzOwotCQkJCWVsc2UgaWYgKE1DUzIgJiYgKFJzc2kgPiAoLTgzK1Jzc2lPZmZzZXQpKSkKKwkJCQllbHNlIGlmIChNQ1MyICYmIChSc3NpID4gKC04MyArIFJzc2lPZmZzZXQpKSkKIAkJCQkJVHhSYXRlSWR4ID0gTUNTMjsKLQkJCQllbHNlIGlmIChNQ1MxICYmIChSc3NpID4gKC04NitSc3NpT2Zmc2V0KSkpCisJCQkJZWxzZSBpZiAoTUNTMSAmJiAoUnNzaSA+ICgtODYgKyBSc3NpT2Zmc2V0KSkpCiAJCQkJCVR4UmF0ZUlkeCA9IE1DUzE7CiAJCQkJZWxzZQogCQkJCQlUeFJhdGVJZHggPSBNQ1MwOwotCQkJfQotCQkJZWxzZQotCQkJey8vIExlZ2FjeSBtb2RlCisJCQl9IGVsc2UgewkvKiBMZWdhY3kgbW9kZSAqLwogCQkJCWlmIChNQ1M3ICYmIChSc3NpID4gLTcwKSkKIAkJCQkJVHhSYXRlSWR4ID0gTUNTNzsKIAkJCQllbHNlIGlmIChNQ1M2ICYmIChSc3NpID4gLTc0KSkKQEAgLTIzMzgsNyArMjE3Niw3IEBACiAJCQkJCVR4UmF0ZUlkeCA9IE1DUzU7CiAJCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+IC04MikpCiAJCQkJCVR4UmF0ZUlkeCA9IE1DUzQ7Ci0JCQkJZWxzZSBpZiAoTUNTNCA9PSAwKQkvLyBmb3IgQi1vbmx5IG1vZGUKKwkJCQllbHNlIGlmIChNQ1M0ID09IDApCS8qIGZvciBCLW9ubHkgbW9kZSAqLwogCQkJCQlUeFJhdGVJZHggPSBNQ1MzOwogCQkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPiAtODUpKQogCQkJCQlUeFJhdGVJZHggPSBNQ1MzOwpAQCAtMjM1MCwxMjkgKzIxODgsMTU4IEBACiAJCQkJCVR4UmF0ZUlkeCA9IE1DUzA7CiAJCQl9CiAKKwkJCS8qICAgICAgICAgICAgICBpZiAoVHhSYXRlSWR4ICE9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4KSAqLwogCQkJewogCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID0gVHhSYXRlSWR4OwotCQkJCXBOZXh0VHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhwRW50cnktPkN1cnJUeFJhdGVJbmRleCsxKSo1XTsKKwkJCQlwTmV4dFR4UmF0ZSA9CisJCQkJICAgIChzdHJ1Y3QgcnRfcnRtcF90eF9yYXRlX3N3aXRjaCAqKSAmCisJCQkJICAgIHBUYWJsZVsocEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggKyAxKSAqIDVdOwogCQkJCU1sbWVTZXRUeFJhdGUocEFkLCBwRW50cnksIHBOZXh0VHhSYXRlKTsKIAkJCX0KIAotCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LT5UeFF1YWxpdHksIHNpemVvZihVU0hPUlQpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOwotCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LT5QRVIsIHNpemVvZihVQ0hBUikgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisJCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlR4UXVhbGl0eSwKKwkJCQkgICAgICAgc2l6ZW9mKHUxNikqCisJCQkJICAgICAgIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+UEVSLAorCQkJCSAgICAgICBzaXplb2YodTgpKgorCQkJCSAgICAgICBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CiAJCQlwRW50cnktPmZMYXN0U2VjQWNjb3JkaW5nUlNTSSA9IFRSVUU7Ci0JCQkvLyByZXNldCBhbGwgT25lU2VjVHggY291bnRlcnMKKwkJCS8qIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycyAqLwogCQkJUkVTRVRfT05FX1NFQ19UWF9DTlQocEVudHJ5KTsKIAogCQkJY29udGludWU7CiAJCX0KIAotCQlpZiAocEVudHJ5LT5mTGFzdFNlY0FjY29yZGluZ1JTU0kgPT0gVFJVRSkKLQkJeworCQlpZiAocEVudHJ5LT5mTGFzdFNlY0FjY29yZGluZ1JTU0kgPT0gVFJVRSkgewogCQkJcEVudHJ5LT5mTGFzdFNlY0FjY29yZGluZ1JTU0kgPSBGQUxTRTsKIAkJCXBFbnRyeS0+TGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9IDA7Ci0JCQkvLyByZXNldCBhbGwgT25lU2VjVHggY291bnRlcnMKKwkJCS8qIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycyAqLwogCQkJUkVTRVRfT05FX1NFQ19UWF9DTlQocEVudHJ5KTsKIAogCQkJY29udGludWU7CiAJCX0KIAotCQlkbwotCQl7Ci0JCQlCT09MRUFOCWJUcmFpblVwRG93biA9IEZBTFNFOworCQlkbyB7CisJCQlCT09MRUFOIGJUcmFpblVwRG93biA9IEZBTFNFOwogCi0JCQlwRW50cnktPkN1cnJUeFJhdGVTdGFibGVUaW1lICsrOworCQkJcEVudHJ5LT5DdXJyVHhSYXRlU3RhYmxlVGltZSsrOwogCi0JCQkvLyBkb3duZ3JhZGUgVFggcXVhbGl0eSBpZiBQRVIgPj0gUmF0ZS1Eb3duIHRocmVzaG9sZAotCQkJaWYgKFR4RXJyb3JSYXRpbyA+PSBUcmFpbkRvd24pCi0JCQl7CisJCQkvKiBkb3duZ3JhZGUgVFggcXVhbGl0eSBpZiBQRVIgPj0gUmF0ZS1Eb3duIHRocmVzaG9sZCAqLworCQkJaWYgKFR4RXJyb3JSYXRpbyA+PSBUcmFpbkRvd24pIHsKIAkJCQliVHJhaW5VcERvd24gPSBUUlVFOwotCQkJCXBFbnRyeS0+VHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA9IERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EOworCQkJCXBFbnRyeS0+VHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA9CisJCQkJICAgIERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EOwogCQkJfQotCQkJLy8gdXBncmFkZSBUWCBxdWFsaXR5IGlmIFBFUiA8PSBSYXRlLVVwIHRocmVzaG9sZAotCQkJZWxzZSBpZiAoVHhFcnJvclJhdGlvIDw9IFRyYWluVXApCi0JCQl7CisJCQkvKiB1cGdyYWRlIFRYIHF1YWxpdHkgaWYgUEVSIDw9IFJhdGUtVXAgdGhyZXNob2xkICovCisJCQllbHNlIGlmIChUeEVycm9yUmF0aW8gPD0gVHJhaW5VcCkgewogCQkJCWJUcmFpblVwRG93biA9IFRSVUU7CiAJCQkJYlVwZ3JhZGVRdWFsaXR5ID0gVFJVRTsKIAkJCQlpZiAocEVudHJ5LT5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdKQotCQkJCQlwRW50cnktPlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gLS07ICAvLyBxdWFsaXR5IHZlcnkgZ29vZCBpbiBDdXJyUmF0ZQorCQkJCQlwRW50cnktPlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0tLTsJLyogcXVhbGl0eSB2ZXJ5IGdvb2QgaW4gQ3VyclJhdGUgKi8KIAogCQkJCWlmIChwRW50cnktPlR4UmF0ZVVwUGVuYWx0eSkKLQkJCQkJcEVudHJ5LT5UeFJhdGVVcFBlbmFsdHkgLS07CisJCQkJCXBFbnRyeS0+VHhSYXRlVXBQZW5hbHR5LS07CiAJCQkJZWxzZSBpZiAocEVudHJ5LT5UeFF1YWxpdHlbVXBSYXRlSWR4XSkKLQkJCQkJcEVudHJ5LT5UeFF1YWxpdHlbVXBSYXRlSWR4XSAtLTsgICAgLy8gbWF5IGltcHJvdmUgbmV4dCBVUCByYXRlJ3MgcXVhbGl0eQorCQkJCQlwRW50cnktPlR4UXVhbGl0eVtVcFJhdGVJZHhdLS07CS8qIG1heSBpbXByb3ZlIG5leHQgVVAgcmF0ZSdzIHF1YWxpdHkgKi8KIAkJCX0KIAotCQkJcEVudHJ5LT5QRVJbQ3VyclJhdGVJZHhdID0gKFVDSEFSKVR4RXJyb3JSYXRpbzsKKwkJCXBFbnRyeS0+UEVSW0N1cnJSYXRlSWR4XSA9ICh1OClUeEVycm9yUmF0aW87CiAKLQkJCWlmIChiVHJhaW5VcERvd24pCi0JCQl7Ci0JCQkJLy8gcGVyZm9ybSBEUlMgLSBjb25zaWRlciBUeFJhdGUgRG93biBmaXJzdCwgdGhlbiByYXRlIHVwLgotCQkJCWlmICgoQ3VyclJhdGVJZHggIT0gRG93blJhdGVJZHgpICYmIChwRW50cnktPlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPj0gRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQpKQotCQkJCXsKKwkJCWlmIChiVHJhaW5VcERvd24pIHsKKwkJCQkvKiBwZXJmb3JtIERSUyAtIGNvbnNpZGVyIFR4UmF0ZSBEb3duIGZpcnN0LCB0aGVuIHJhdGUgdXAuICovCisJCQkJaWYgKChDdXJyUmF0ZUlkeCAhPSBEb3duUmF0ZUlkeCkKKwkJCQkgICAgJiYgKHBFbnRyeS0+VHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA+PQorCQkJCQlEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORCkpIHsKIAkJCQkJcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggPSBEb3duUmF0ZUlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKEN1cnJSYXRlSWR4ICE9IFVwUmF0ZUlkeCkgJiYgKHBFbnRyeS0+VHhRdWFsaXR5W1VwUmF0ZUlkeF0gPD0gMCkpCi0JCQkJeworCQkJCX0gZWxzZSBpZiAoKEN1cnJSYXRlSWR4ICE9IFVwUmF0ZUlkeCkKKwkJCQkJICAgJiYgKHBFbnRyeS0+VHhRdWFsaXR5W1VwUmF0ZUlkeF0gPD0KKwkJCQkJICAgICAgIDApKSB7CiAJCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID0gVXBSYXRlSWR4OwogCQkJCX0KIAkJCX0KIAkJfSB3aGlsZSAoRkFMU0UpOwogCi0JCS8vIGlmIHJhdGUtdXAgaGFwcGVuLCBjbGVhciBhbGwgYmFkIGhpc3Rvcnkgb2YgYWxsIFRYIHJhdGVzCi0JCWlmIChwRW50cnktPkN1cnJUeFJhdGVJbmRleCA+IEN1cnJSYXRlSWR4KQotCQl7CisJCS8qIGlmIHJhdGUtdXAgaGFwcGVuLCBjbGVhciBhbGwgYmFkIGhpc3Rvcnkgb2YgYWxsIFRYIHJhdGVzICovCisJCWlmIChwRW50cnktPkN1cnJUeFJhdGVJbmRleCA+IEN1cnJSYXRlSWR4KSB7CiAJCQlwRW50cnktPkN1cnJUeFJhdGVTdGFibGVUaW1lID0gMDsKIAkJCXBFbnRyeS0+VHhSYXRlVXBQZW5hbHR5ID0gMDsKLQkJCXBFbnRyeS0+TGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9IDE7IC8vIHJhdGUgVVAKLQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+VHhRdWFsaXR5LCBzaXplb2YoVVNIT1JUKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKLQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+UEVSLCBzaXplb2YoVUNIQVIpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOworCQkJcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID0gMTsJLyogcmF0ZSBVUCAqLworCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LT5UeFF1YWxpdHksCisJCQkJICAgICAgIHNpemVvZih1MTYpKgorCQkJCSAgICAgICBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisJCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlBFUiwKKwkJCQkgICAgICAgc2l6ZW9mKHU4KSoKKwkJCQkgICAgICAgTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOwogCi0JCQkvLwotCQkJLy8gRm9yIFR4UmF0ZSBmYXN0IHRyYWluIHVwCi0JCQkvLwotCQkJaWYgKCFwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcpCi0JCQl7Ci0JCQkJUlRNUFNldFRpbWVyKCZwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lciwgMTAwKTsKKwkJCS8qICovCisJCQkvKiBGb3IgVHhSYXRlIGZhc3QgdHJhaW4gdXAgKi8KKwkJCS8qICovCisJCQlpZiAoIXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZykgeworCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5TdGFDZmcuCisJCQkJCSAgICAgU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsCisJCQkJCSAgICAgMTAwKTsKIAotCQkJCXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZyA9IFRSVUU7CisJCQkJcEFkLT5TdGFDZmcuCisJCQkJICAgIFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZyA9IFRSVUU7CiAJCQl9CiAJCQliVHhSYXRlQ2hhbmdlZCA9IFRSVUU7CiAJCX0KLQkJLy8gaWYgcmF0ZS1kb3duIGhhcHBlbiwgb25seSBjbGVhciBEb3duUmF0ZSdzIGJhZCBoaXN0b3J5Ci0JCWVsc2UgaWYgKHBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4IDwgQ3VyclJhdGVJZHgpCi0JCXsKKwkJLyogaWYgcmF0ZS1kb3duIGhhcHBlbiwgb25seSBjbGVhciBEb3duUmF0ZSdzIGJhZCBoaXN0b3J5ICovCisJCWVsc2UgaWYgKHBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4IDwgQ3VyclJhdGVJZHgpIHsKIAkJCXBFbnRyeS0+Q3VyclR4UmF0ZVN0YWJsZVRpbWUgPSAwOwotCQkJcEVudHJ5LT5UeFJhdGVVcFBlbmFsdHkgPSAwOyAgICAgICAgICAgLy8gbm8gcGVuYWx0eQotCQkJcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID0gMjsgLy8gcmF0ZSBET1dOCisJCQlwRW50cnktPlR4UmF0ZVVwUGVuYWx0eSA9IDA7CS8qIG5vIHBlbmFsdHkgKi8KKwkJCXBFbnRyeS0+TGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9IDI7CS8qIHJhdGUgRE9XTiAqLwogCQkJcEVudHJ5LT5UeFF1YWxpdHlbcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXhdID0gMDsKIAkJCXBFbnRyeS0+UEVSW3BFbnRyeS0+Q3VyclR4UmF0ZUluZGV4XSA9IDA7CiAKLQkJCS8vCi0JCQkvLyBGb3IgVHhSYXRlIGZhc3QgdHJhaW4gZG93bgotCQkJLy8KLQkJCWlmICghcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nKQotCQkJewotCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsIDEwMCk7CisJCQkvKiAqLworCQkJLyogRm9yIFR4UmF0ZSBmYXN0IHRyYWluIGRvd24gKi8KKwkJCS8qICovCisJCQlpZiAoIXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZykgeworCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5TdGFDZmcuCisJCQkJCSAgICAgU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsCisJCQkJCSAgICAgMTAwKTsKIAotCQkJCXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZyA9IFRSVUU7CisJCQkJcEFkLT5TdGFDZmcuCisJCQkJICAgIFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZyA9IFRSVUU7CiAJCQl9CiAJCQliVHhSYXRlQ2hhbmdlZCA9IFRSVUU7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwRW50cnktPkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPSAwOyAvLyByYXRlIG5vIGNoYW5nZQorCQl9IGVsc2UgeworCQkJcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID0gMDsJLyogcmF0ZSBubyBjaGFuZ2UgKi8KIAkJCWJUeFJhdGVDaGFuZ2VkID0gRkFMU0U7CiAJCX0KIAogCQlwRW50cnktPkxhc3RUeE9rQ291bnQgPSBUeFN1Y2Nlc3M7Ci0KLQkJLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCi0JCVJFU0VUX09ORV9TRUNfVFhfQ05UKHBFbnRyeSk7Ci0KLQkJcE5leHRUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKHBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KzEpKjVdOwotCQlpZiAoYlR4UmF0ZUNoYW5nZWQgJiYgcE5leHRUeFJhdGUpCiAJCXsKKwkJCXU4IHRtcFR4UmF0ZTsKKworCQkJLyogdG8gZml4IHRjcCBhY2sgaXNzdWUgKi8KKwkJCWlmICghYlR4UmF0ZUNoYW5nZWQKKwkJCSAgICAmJiAocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSZWNlaXZlZEJ5dGVDb3VudCA+CisJCQkJKHBBZC0+UmFsaW5rQ291bnRlcnMuCisJCQkJIE9uZVNlY1RyYW5zbWl0dGVkQnl0ZUNvdW50ICogNSkpKSB7CisJCQkJdG1wVHhSYXRlID0gRG93blJhdGVJZHg7CisJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgICAgICgiRFJTOiBSeCglZCkgaXMgNSB0aW1lcyBsYXJnZXIgdGhhbiBUeCglZCksIHVzZSBsb3cgcmF0ZSAoY3Vycj0lZCwgdG1wPSVkKVxuIiwKKwkJCQkJICAgICAgcEFkLT5SYWxpbmtDb3VudGVycy4KKwkJCQkJICAgICAgT25lU2VjUmVjZWl2ZWRCeXRlQ291bnQsCisJCQkJCSAgICAgIHBBZC0+UmFsaW5rQ291bnRlcnMuCisJCQkJCSAgICAgIE9uZVNlY1RyYW5zbWl0dGVkQnl0ZUNvdW50LAorCQkJCQkgICAgICBwRW50cnktPkN1cnJUeFJhdGVJbmRleCwKKwkJCQkJICAgICAgdG1wVHhSYXRlKSk7CisJCQl9IGVsc2UgeworCQkJCXRtcFR4UmF0ZSA9IHBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4OworCQkJfQorCisJCQlwTmV4dFR4UmF0ZSA9CisJCQkgICAgKHN0cnVjdCBydF9ydG1wX3R4X3JhdGVfc3dpdGNoICopICYgcFRhYmxlWyh0bXBUeFJhdGUgKyAxKSAqCisJCQkJCQkJICAgIDVdOworCQl9CisJCWlmIChiVHhSYXRlQ2hhbmdlZCAmJiBwTmV4dFR4UmF0ZSkgewogCQkJTWxtZVNldFR4UmF0ZShwQWQsIHBFbnRyeSwgcE5leHRUeFJhdGUpOwogCQl9CisJCS8qIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycyAqLworCQlSRVNFVF9PTkVfU0VDX1RYX0NOVChwRW50cnkpOwogCX0KIH0KIApAQCAtMjQ5MiwxMDMgKzIzNTksODQgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit2b2lkIFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWModm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkJCSAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkJCSAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLAorCQkJCSAgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKQogewotCVBSVE1QX0FEQVBURVIJCQlwQWQgPSAoUFJUTVBfQURBUFRFUilGdW5jdGlvbkNvbnRleHQ7Ci0JVUNIQVIJCQkJCVVwUmF0ZUlkeCA9IDAsIERvd25SYXRlSWR4ID0gMCwgQ3VyclJhdGVJZHggPSAwOwotCVVMT05HCQkJCQlUeFRvdGFsQ250OwotCVVMT05HCQkJCQlUeEVycm9yUmF0aW8gPSAwOwotI2lmZGVmIFJUMjg2MAotCUJPT0xFQU4JCQkJCWJUeFJhdGVDaGFuZ2VkID0gVFJVRTsgLy8sIGJVcGdyYWRlUXVhbGl0eSA9IEZBTFNFOwotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JQk9PTEVBTgkJCQkJYlR4UmF0ZUNoYW5nZWQ7IC8vLCBiVXBncmFkZVF1YWxpdHkgPSBGQUxTRTsKLSNlbmRpZgotCVBSVE1QX1RYX1JBVEVfU1dJVENICXBDdXJyVHhSYXRlLCBwTmV4dFR4UmF0ZSA9IE5VTEw7Ci0JUFVDSEFSCQkJCQlwVGFibGU7Ci0JVUNIQVIJCQkJCVRhYmxlU2l6ZSA9IDA7Ci0JVUNIQVIJCQkJCUluaXRUeFJhdGVJZHggPSAwLCBUcmFpblVwLCBUcmFpbkRvd247Ci0JVFhfU1RBX0NOVDFfU1RSVUMJCVN0YVR4MTsKLQlUWF9TVEFfQ05UMF9TVFJVQwkJVHhTdGFDbnQwOwotCUNIQVIJCQkJCVJzc2ksIHJhdGlvOwotCVVMT05HCQkJCQlUeFJldHJhbnNtaXQgPSAwLCBUeFN1Y2Nlc3MgPSAwLCBUeEZhaWxDb3VudCA9IDA7Ci0JTUFDX1RBQkxFX0VOVFJZCQkJKnBFbnRyeTsKLQlVTE9ORwkJCQkJaTsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKUZ1bmN0aW9uQ29udGV4dDsKKwl1OCBVcFJhdGVJZHggPSAwLCBEb3duUmF0ZUlkeCA9IDAsIEN1cnJSYXRlSWR4ID0gMDsKKwl1bnNpZ25lZCBsb25nIFR4VG90YWxDbnQ7CisJdW5zaWduZWQgbG9uZyBUeEVycm9yUmF0aW8gPSAwOworCUJPT0xFQU4gYlR4UmF0ZUNoYW5nZWQ7CS8qLCBiVXBncmFkZVF1YWxpdHkgPSBGQUxTRTsgKi8KKwlzdHJ1Y3QgcnRfcnRtcF90eF9yYXRlX3N3aXRjaCAqcEN1cnJUeFJhdGUsICpwTmV4dFR4UmF0ZSA9IE5VTEw7CisJdTggKnBUYWJsZTsKKwl1OCBUYWJsZVNpemUgPSAwOworCXU4IEluaXRUeFJhdGVJZHggPSAwLCBUcmFpblVwLCBUcmFpbkRvd247CisJVFhfU1RBX0NOVDFfU1RSVUMgU3RhVHgxOworCVRYX1NUQV9DTlQwX1NUUlVDIFR4U3RhQ250MDsKKwljaGFyIFJzc2ksIHJhdGlvOworCXVuc2lnbmVkIGxvbmcgVHhSZXRyYW5zbWl0ID0gMCwgVHhTdWNjZXNzID0gMCwgVHhGYWlsQ291bnQgPSAwOworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeTsKKwl1bnNpZ25lZCBsb25nIGk7CiAKIAlwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcgPSBGQUxTRTsKIAotICAgIC8vCi0gICAgLy8gd2FsayB0aHJvdWdoIE1BQyB0YWJsZSwgc2VlIGlmIG5lZWQgdG8gY2hhbmdlIEFQJ3MgVFggcmF0ZSB0b3dhcmQgZWFjaCBlbnRyeQotICAgIC8vCi0JZm9yIChpID0gMTsgaSA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCi0JeworCS8qICovCisJLyogd2FsayB0aHJvdWdoIE1BQyB0YWJsZSwgc2VlIGlmIG5lZWQgdG8gY2hhbmdlIEFQJ3MgVFggcmF0ZSB0b3dhcmQgZWFjaCBlbnRyeSAqLworCS8qICovCisJZm9yIChpID0gMTsgaSA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspIHsKIAkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CiAKLQkJLy8gY2hlY2sgaWYgdGhpcyBlbnRyeSBuZWVkIHRvIHN3aXRjaCByYXRlIGF1dG9tYXRpY2FsbHkKKwkJLyogY2hlY2sgaWYgdGhpcyBlbnRyeSBuZWVkIHRvIHN3aXRjaCByYXRlIGF1dG9tYXRpY2FsbHkgKi8KIAkJaWYgKFJUTVBDaGVja0VudHJ5RW5hYmxlQXV0b1JhdGVTd2l0Y2gocEFkLCBwRW50cnkpID09IEZBTFNFKQogCQkJY29udGludWU7CiAKLSNpZmRlZiBSVDI4NjAKLQkJLy9Sc3NpID0gUlRNUE1heFJzc2kocEFkLCAoQ0hBUilwQWQtPlN0YUNmZy5BdmdSc3NpMCwgKENIQVIpcEFkLT5TdGFDZmcuQXZnUnNzaTEsIChDSEFSKXBBZC0+U3RhQ2ZnLkF2Z1Jzc2kyKTsKLQkgICAgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPiAxKQotCQkJUnNzaSA9IChwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwICsgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSkgPj4gMTsKLQkJZWxzZQotCQkJUnNzaSA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTA7Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKIAkJaWYgKElORlJBX09OKHBBZCkgJiYgKGkgPT0gMSkpCiAJCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLAotCQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAsCi0JCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSwKLQkJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKKwkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCwKKwkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSwKKwkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMik7CiAJCWVsc2UKIAkJCVJzc2kgPSBSVE1QTWF4UnNzaShwQWQsCi0JCQkJCQkJICAgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kwLAotCQkJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMSwKLQkJCQkJCQkgICBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTIpOwotI2VuZGlmCisJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMCwKKwkJCQkJICAgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kxLAorCQkJCQkgICBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTIpOwogCiAJCUN1cnJSYXRlSWR4ID0gcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXg7CiAKLQkJCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsIHBFbnRyeSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJkluaXRUeFJhdGVJZHgpOworCQlNbG1lU2VsZWN0VHhSYXRlVGFibGUocEFkLCBwRW50cnksICZwVGFibGUsICZUYWJsZVNpemUsCisJCQkJICAgICAgJkluaXRUeFJhdGVJZHgpOwogCi0JCS8vIGRlY2lkZSB0aGUgbmV4dCB1cGdyYWRlIHJhdGUgYW5kIGRvd25ncmFkZSByYXRlLCBpZiBhbnkKLQkJaWYgKChDdXJyUmF0ZUlkeCA+IDApICYmIChDdXJyUmF0ZUlkeCA8IChUYWJsZVNpemUgLSAxKSkpCi0JCXsKKwkJLyogZGVjaWRlIHRoZSBuZXh0IHVwZ3JhZGUgcmF0ZSBhbmQgZG93bmdyYWRlIHJhdGUsIGlmIGFueSAqLworCQlpZiAoKEN1cnJSYXRlSWR4ID4gMCkgJiYgKEN1cnJSYXRlSWR4IDwgKFRhYmxlU2l6ZSAtIDEpKSkgewogCQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHggKyAxOwotCQkJRG93blJhdGVJZHggPSBDdXJyUmF0ZUlkeCAtMTsKLQkJfQotCQllbHNlIGlmIChDdXJyUmF0ZUlkeCA9PSAwKQotCQl7CisJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4IC0gMTsKKwkJfSBlbHNlIGlmIChDdXJyUmF0ZUlkeCA9PSAwKSB7CiAJCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeCArIDE7CiAJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4OwotCQl9Ci0JCWVsc2UgaWYgKEN1cnJSYXRlSWR4ID09IChUYWJsZVNpemUgLSAxKSkKLQkJeworCQl9IGVsc2UgaWYgKEN1cnJSYXRlSWR4ID09IChUYWJsZVNpemUgLSAxKSkgewogCQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHg7CiAJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4IC0gMTsKIAkJfQogCi0JCXBDdXJyVHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhDdXJyUmF0ZUlkeCsxKSo1XTsKKwkJcEN1cnJUeFJhdGUgPQorCQkgICAgKHN0cnVjdCBydF9ydG1wX3R4X3JhdGVfc3dpdGNoICopICYgcFRhYmxlWyhDdXJyUmF0ZUlkeCArIDEpICogNV07CiAKLQkJaWYgKChSc3NpID4gLTY1KSAmJiAocEN1cnJUeFJhdGUtPk1vZGUgPj0gTU9ERV9IVE1JWCkpCi0JCXsKLQkJCVRyYWluVXAJCT0gKHBDdXJyVHhSYXRlLT5UcmFpblVwICsgKHBDdXJyVHhSYXRlLT5UcmFpblVwID4+IDEpKTsKLQkJCVRyYWluRG93bgk9IChwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duICsgKHBDdXJyVHhSYXRlLT5UcmFpbkRvd24gPj4gMSkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJVHJhaW5VcAkJPSBwQ3VyclR4UmF0ZS0+VHJhaW5VcDsKLQkJCVRyYWluRG93bgk9IHBDdXJyVHhSYXRlLT5UcmFpbkRvd247CisJCWlmICgoUnNzaSA+IC02NSkgJiYgKHBDdXJyVHhSYXRlLT5Nb2RlID49IE1PREVfSFRNSVgpKSB7CisJCQlUcmFpblVwID0KKwkJCSAgICAocEN1cnJUeFJhdGUtPlRyYWluVXAgKworCQkJICAgICAocEN1cnJUeFJhdGUtPlRyYWluVXAgPj4gMSkpOworCQkJVHJhaW5Eb3duID0KKwkJCSAgICAocEN1cnJUeFJhdGUtPlRyYWluRG93biArCisJCQkgICAgIChwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duID4+IDEpKTsKKwkJfSBlbHNlIHsKKwkJCVRyYWluVXAgPSBwQ3VyclR4UmF0ZS0+VHJhaW5VcDsKKwkJCVRyYWluRG93biA9IHBDdXJyVHhSYXRlLT5UcmFpbkRvd247CiAJCX0KIAotCQlpZiAocEFkLT5NYWNUYWIuU2l6ZSA9PSAxKQotCQl7Ci0JCQkvLyBVcGRhdGUgc3RhdGlzdGljIGNvdW50ZXIKKwkJaWYgKHBBZC0+TWFjVGFiLlNpemUgPT0gMSkgeworCQkJLyogVXBkYXRlIHN0YXRpc3RpYyBjb3VudGVyICovCiAJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQwLCAmVHhTdGFDbnQwLndvcmQpOwogCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMSwgJlN0YVR4MS53b3JkKTsKIApAQCAtMjU5NywxMjMgKzI0NDUsMTM4IEBACiAJCQlUeEZhaWxDb3VudCA9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKIAkJCVR4VG90YWxDbnQgPSBUeFJldHJhbnNtaXQgKyBUeFN1Y2Nlc3MgKyBUeEZhaWxDb3VudDsKIAotCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OwotCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKLQkJCXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKLQkJCXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7Ci0JCQlwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC51Lkxvd1BhcnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArPQorCQkJICAgIFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKz0KKwkJCSAgICBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudCArPQorCQkJICAgIFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwkJCXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQgKz0KKwkJCSAgICBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQkJcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC51Lkxvd1BhcnQgKz0KKwkJCSAgICBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OworCQkJcEFkLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQudS5Mb3dQYXJ0ICs9CisJCQkgICAgVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OwogCiAJCQlpZiAoVHhUb3RhbENudCkKLQkJCQlUeEVycm9yUmF0aW8gPSAoKFR4UmV0cmFuc21pdCArIFR4RmFpbENvdW50KSAqIDEwMCkgLyBUeFRvdGFsQ250OwotCQl9Ci0JCWVsc2UKLQkJeworCQkJCVR4RXJyb3JSYXRpbyA9CisJCQkJICAgICgoVHhSZXRyYW5zbWl0ICsKKwkJCQkgICAgICBUeEZhaWxDb3VudCkgKiAxMDApIC8gVHhUb3RhbENudDsKKwkJfSBlbHNlIHsKIAkJCVR4VG90YWxDbnQgPSBwRW50cnktPk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKwotCQkJCSBwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKLQkJCQkgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudDsKKwkJCSAgICBwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCSAgICBwRW50cnktPk9uZVNlY1R4RmFpbENvdW50OwogCiAJCQlpZiAoVHhUb3RhbENudCkKLQkJCQlUeEVycm9yUmF0aW8gPSAoKHBFbnRyeS0+T25lU2VjVHhSZXRyeU9rQ291bnQgKyBwRW50cnktPk9uZVNlY1R4RmFpbENvdW50KSAqIDEwMCkgLyBUeFRvdGFsQ250OworCQkJCVR4RXJyb3JSYXRpbyA9CisJCQkJICAgICgocEVudHJ5LT5PbmVTZWNUeFJldHJ5T2tDb3VudCArCisJCQkJICAgICAgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudCkgKiAxMDApIC8KKwkJCQkgICAgVHhUb3RhbENudDsKIAkJfQogCisJCS8qICovCisJCS8qIENBU0UgMS4gd2hlbiBUWCBzYW1wbGVzIGFyZSBmZXdlciB0aGFuIDE1LCB0aGVuIGRlY2lkZSBUWCByYXRlIHNvbGVseSBvbiBSU1NJICovCisJCS8qICAgICAgICAgKGNyaXRlcmlhIGNvcGllZCBmcm9tIFJUMjUwMCBmb3IgTmV0b3BpYSBjYXNlKSAqLworCQkvKiAqLworCQlpZiAoVHhUb3RhbENudCA8PSAxMikgeworCQkJTmRpc1plcm9NZW1vcnkocEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHksCisJCQkJICAgICAgIHNpemVvZih1MTYpKgorCQkJCSAgICAgICBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPkRyc0NvdW50ZXJzLlBFUiwKKwkJCQkgICAgICAgc2l6ZW9mKHU4KSoKKwkJCQkgICAgICAgTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOwogCi0JCS8vCi0JCS8vIENBU0UgMS4gd2hlbiBUWCBzYW1wbGVzIGFyZSBmZXdlciB0aGFuIDE1LCB0aGVuIGRlY2lkZSBUWCByYXRlIHNvbGVseSBvbiBSU1NJCi0JCS8vICAgICAgICAgKGNyaXRlcmlhIGNvcGllZCBmcm9tIFJUMjUwMCBmb3IgTmV0b3BpYSBjYXNlKQotCQkvLwotCQlpZiAoVHhUb3RhbENudCA8PSAxMikKLQkJewotCQkJTmRpc1plcm9NZW1vcnkocEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHksIHNpemVvZihVU0hPUlQpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOwotCQkJTmRpc1plcm9NZW1vcnkocEFkLT5EcnNDb3VudGVycy5QRVIsIHNpemVvZihVQ0hBUikgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7Ci0KLQkJCWlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID09IDEpICYmIChDdXJyUmF0ZUlkeCAhPSBEb3duUmF0ZUlkeCkpCi0JCQl7CisJCQlpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9PSAxKQorCQkJICAgICYmIChDdXJyUmF0ZUlkeCAhPSBEb3duUmF0ZUlkeCkpIHsKIAkJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA9IERvd25SYXRlSWR4OwotCQkJCXBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA9IERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EOwotCQkJfQotCQkJZWxzZSBpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9PSAyKSAmJiAoQ3VyclJhdGVJZHggIT0gVXBSYXRlSWR4KSkKLQkJCXsKKwkJCQlwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPQorCQkJCSAgICBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKKwkJCX0gZWxzZQorCQkJICAgIGlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID09CisJCQkJIDIpICYmIChDdXJyUmF0ZUlkeCAhPSBVcFJhdGVJZHgpKSB7CiAJCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPSBVcFJhdGVJZHg7CiAJCQl9CiAKLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIlF1aWNrRFJTOiBUeFRvdGFsQ250IDw9IDE1LCB0cmFpbiBiYWNrIHRvIG9yaWdpbmFsIHJhdGUgXG4iKSk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkJICAgICAoIlF1aWNrRFJTOiBUeFRvdGFsQ250IDw9IDE1LCB0cmFpbiBiYWNrIHRvIG9yaWdpbmFsIHJhdGUgXG4iKSk7CiAJCQlyZXR1cm47CiAJCX0KIAotCQlkbwotCQl7Ci0JCQlVTE9ORyBPbmVTZWNUeE5vUmV0cnlPS1JhdGlvbkNvdW50OworCQlkbyB7CisJCQl1bnNpZ25lZCBsb25nIE9uZVNlY1R4Tm9SZXRyeU9LUmF0aW9uQ291bnQ7CiAKIAkJCWlmIChwQWQtPkRyc0NvdW50ZXJzLkxhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uID09IDApCiAJCQkJcmF0aW8gPSA1OwogCQkJZWxzZQogCQkJCXJhdGlvID0gNDsKIAotCQkJLy8gZG93bmdyYWRlIFRYIHF1YWxpdHkgaWYgUEVSID49IFJhdGUtRG93biB0aHJlc2hvbGQKLQkJCWlmIChUeEVycm9yUmF0aW8gPj0gVHJhaW5Eb3duKQotCQkJewotCQkJCXBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA9IERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EOworCQkJLyogZG93bmdyYWRlIFRYIHF1YWxpdHkgaWYgUEVSID49IFJhdGUtRG93biB0aHJlc2hvbGQgKi8KKwkJCWlmIChUeEVycm9yUmF0aW8gPj0gVHJhaW5Eb3duKSB7CisJCQkJcEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdID0KKwkJCQkgICAgRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQ7CiAJCQl9CiAKLQkJCXBBZC0+RHJzQ291bnRlcnMuUEVSW0N1cnJSYXRlSWR4XSA9IChVQ0hBUilUeEVycm9yUmF0aW87CisJCQlwQWQtPkRyc0NvdW50ZXJzLlBFUltDdXJyUmF0ZUlkeF0gPQorCQkJICAgICh1OClUeEVycm9yUmF0aW87CiAKIAkJCU9uZVNlY1R4Tm9SZXRyeU9LUmF0aW9uQ291bnQgPSAoVHhTdWNjZXNzICogcmF0aW8pOwogCi0JCQkvLyBwZXJmb3JtIERSUyAtIGNvbnNpZGVyIFR4UmF0ZSBEb3duIGZpcnN0LCB0aGVuIHJhdGUgdXAuCi0JCQlpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9PSAxKSAmJiAoQ3VyclJhdGVJZHggIT0gRG93blJhdGVJZHgpKQotCQkJewotCQkJCWlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0VHhPa0NvdW50ICsgMikgPj0gT25lU2VjVHhOb1JldHJ5T0tSYXRpb25Db3VudCkKLQkJCQl7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID0gRG93blJhdGVJZHg7Ci0JCQkJCXBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA9IERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EOworCQkJLyogcGVyZm9ybSBEUlMgLSBjb25zaWRlciBUeFJhdGUgRG93biBmaXJzdCwgdGhlbiByYXRlIHVwLiAqLworCQkJaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPT0gMSkKKwkJCSAgICAmJiAoQ3VyclJhdGVJZHggIT0gRG93blJhdGVJZHgpKSB7CisJCQkJaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RUeE9rQ291bnQgKyAyKSA+PQorCQkJCSAgICBPbmVTZWNUeE5vUmV0cnlPS1JhdGlvbkNvdW50KSB7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID0KKwkJCQkJICAgIERvd25SYXRlSWR4OworCQkJCQlwQWQtPkRyc0NvdW50ZXJzLgorCQkJCQkgICAgVHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA9CisJCQkJCSAgICBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKIAogCQkJCX0KIAotCQkJfQotCQkJZWxzZSBpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9PSAyKSAmJiAoQ3VyclJhdGVJZHggIT0gVXBSYXRlSWR4KSkKLQkJCXsKLQkJCQlpZiAoKFR4RXJyb3JSYXRpbyA+PSA1MCkgfHwgKFR4RXJyb3JSYXRpbyA+PSBUcmFpbkRvd24pKQotCQkJCXsKKwkJCX0gZWxzZQorCQkJICAgIGlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID09CisJCQkJIDIpICYmIChDdXJyUmF0ZUlkeCAhPSBVcFJhdGVJZHgpKSB7CisJCQkJaWYgKChUeEVycm9yUmF0aW8gPj0gNTApCisJCQkJICAgIHx8IChUeEVycm9yUmF0aW8gPj0gVHJhaW5Eb3duKSkgewogCi0JCQkJfQotCQkJCWVsc2UgaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RUeE9rQ291bnQgKyAyKSA+PSBPbmVTZWNUeE5vUmV0cnlPS1JhdGlvbkNvdW50KQotCQkJCXsKKwkJCQl9IGVsc2UgaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RUeE9rQ291bnQgKyAyKQorCQkJCQkgICA+PSBPbmVTZWNUeE5vUmV0cnlPS1JhdGlvbkNvdW50KSB7CiAJCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID0gVXBSYXRlSWR4OwogCQkJCX0KIAkJCX0KLQkJfXdoaWxlIChGQUxTRSk7CisJCX0gd2hpbGUgKEZBTFNFKTsKIAotCQkvLyBpZiByYXRlLXVwIGhhcHBlbiwgY2xlYXIgYWxsIGJhZCBoaXN0b3J5IG9mIGFsbCBUWCByYXRlcwotCQlpZiAocEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPiBDdXJyUmF0ZUlkeCkKLQkJeworCQkvKiBpZiByYXRlLXVwIGhhcHBlbiwgY2xlYXIgYWxsIGJhZCBoaXN0b3J5IG9mIGFsbCBUWCByYXRlcyAqLworCQlpZiAocEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPiBDdXJyUmF0ZUlkeCkgewogCQkJcEFkLT5EcnNDb3VudGVycy5UeFJhdGVVcFBlbmFsdHkgPSAwOwotCQkJTmRpc1plcm9NZW1vcnkocEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHksIHNpemVvZihVU0hPUlQpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOwotCQkJTmRpc1plcm9NZW1vcnkocEFkLT5EcnNDb3VudGVycy5QRVIsIHNpemVvZihVQ0hBUikgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7Ci0jaWZkZWYgUlQyODcwCisJCQlOZGlzWmVyb01lbW9yeShwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eSwKKwkJCQkgICAgICAgc2l6ZW9mKHUxNikqCisJCQkJICAgICAgIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+RHJzQ291bnRlcnMuUEVSLAorCQkJCSAgICAgICBzaXplb2YodTgpKgorCQkJCSAgICAgICBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CiAJCQliVHhSYXRlQ2hhbmdlZCA9IFRSVUU7Ci0jZW5kaWYKIAkJfQotCQkvLyBpZiByYXRlLWRvd24gaGFwcGVuLCBvbmx5IGNsZWFyIERvd25SYXRlJ3MgYmFkIGhpc3RvcnkKLQkJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPCBDdXJyUmF0ZUlkeCkKLQkJewotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiUXVpY2tEUlM6IC0tVFggcmF0ZSBmcm9tICVkIHRvICVkIFxuIiwgQ3VyclJhdGVJZHgsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4KSk7CisJCS8qIGlmIHJhdGUtZG93biBoYXBwZW4sIG9ubHkgY2xlYXIgRG93blJhdGUncyBiYWQgaGlzdG9yeSAqLworCQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA8IEN1cnJSYXRlSWR4KSB7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkJICAgICAoIlF1aWNrRFJTOiAtLVRYIHJhdGUgZnJvbSAlZCB0byAlZCBcbiIsCisJCQkJICAgICAgQ3VyclJhdGVJZHgsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4KSk7CiAKLQkJCXBBZC0+RHJzQ291bnRlcnMuVHhSYXRlVXBQZW5hbHR5ID0gMDsgICAgICAgICAgIC8vIG5vIHBlbmFsdHkKLQkJCXBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5W3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4XSA9IDA7CisJCQlwQWQtPkRyc0NvdW50ZXJzLlR4UmF0ZVVwUGVuYWx0eSA9IDA7CS8qIG5vIHBlbmFsdHkgKi8KKwkJCXBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5W3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4XSA9CisJCQkgICAgMDsKIAkJCXBBZC0+RHJzQ291bnRlcnMuUEVSW3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4XSA9IDA7Ci0jaWZkZWYgUlQyODcwCiAJCQliVHhSYXRlQ2hhbmdlZCA9IFRSVUU7Ci0jZW5kaWYKLQkJfQotCQllbHNlCi0JCXsKKwkJfSBlbHNlIHsKIAkJCWJUeFJhdGVDaGFuZ2VkID0gRkFMU0U7CiAJCX0KIAotCQlwTmV4dFR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsocEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXgrMSkqNV07Ci0JCWlmIChiVHhSYXRlQ2hhbmdlZCAmJiBwTmV4dFR4UmF0ZSkKLQkJeworCQlwTmV4dFR4UmF0ZSA9CisJCSAgICAoc3RydWN0IHJ0X3J0bXBfdHhfcmF0ZV9zd2l0Y2ggKikgJgorCQkgICAgcFRhYmxlWyhwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCArIDEpICogNV07CisJCWlmIChiVHhSYXRlQ2hhbmdlZCAmJiBwTmV4dFR4UmF0ZSkgewogCQkJTWxtZVNldFR4UmF0ZShwQWQsIHBFbnRyeSwgcE5leHRUeFJhdGUpOwogCQl9CiAJfQpAQCAtMjczOCw5OCArMjYwMSwxNzYgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgTWxtZUNoZWNrUHNtQ2hhbmdlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVMT05HCU5vdzMyKQordm9pZCBNbG1lQ2hlY2tQc21DaGFuZ2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1bnNpZ25lZCBsb25nIE5vdzMyKQogewotCVVMT05HCVBvd2VyTW9kZTsKKwl1bnNpZ25lZCBsb25nIFBvd2VyTW9kZTsKIAotCS8vIGNvbmRpdGlvbiAtCi0JLy8gMS4gUHNtIG1heWJlIE9OIG9ubHkgaGFwcGVuIGluIElORlJBU1RSVUNUVVJFIG1vZGUKLQkvLyAyLiB1c2VyIHdhbnRzIGVpdGhlciBNQVhfUFNQIG9yIEZBU1RfUFNQCi0JLy8gMy4gYnV0IGN1cnJlbnQgcHNtIGlzIG5vdCBpbiBQV1JfU0FWRQotCS8vIDQuIENOVEwgc3RhdGUgbWFjaGluZSBpcyBub3QgZG9pbmcgU0NBTm5pbmcKLQkvLyA1LiBubyBUWCBTVUNDRVNTIGV2ZW50IGZvciB0aGUgcGFzdCAxLXNlYyBwZXJpb2QKLSNpZmRlZiBORElTNTFfTUlOSVBPUlQKLQlpZiAocEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyUHJvZmlsZSA9PSBOZGlzUG93ZXJQcm9maWxlQmF0dGVyeSkKLQkJUG93ZXJNb2RlID0gcEFkLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGU7Ci0JZWxzZQotI2VuZGlmCi0JCVBvd2VyTW9kZSA9IHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGU7CisJLyogY29uZGl0aW9uIC0gKi8KKwkvKiAxLiBQc20gbWF5YmUgT04gb25seSBoYXBwZW4gaW4gSU5GUkFTVFJVQ1RVUkUgbW9kZSAqLworCS8qIDIuIHVzZXIgd2FudHMgZWl0aGVyIE1BWF9QU1Agb3IgRkFTVF9QU1AgKi8KKwkvKiAzLiBidXQgY3VycmVudCBwc20gaXMgbm90IGluIFBXUl9TQVZFICovCisJLyogNC4gQ05UTCBzdGF0ZSBtYWNoaW5lIGlzIG5vdCBkb2luZyBTQ0FObmluZyAqLworCS8qIDUuIG5vIFRYIFNVQ0NFU1MgZXZlbnQgZm9yIHRoZSBwYXN0IDEtc2VjIHBlcmlvZCAqLworCVBvd2VyTW9kZSA9IHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGU7CiAKIAlpZiAoSU5GUkFfT04ocEFkKSAmJgotCQkoUG93ZXJNb2RlICE9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU0pICYmCi0JCShwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX0FDVElWRSkgJiYKLSNpZmRlZiBSVDI4NjAKLQkJUlRNUF9URVNUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCkpCi0jZWxzZQotCQkocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpKQotI2VuZGlmCi0JewotCQkvLyBhZGQgYnkgam9obmxpLCB1c2UgUnggT0sgZGF0YSBjb3VudCBwZXIgc2Vjb25kIHRvIGNhbGN1bGF0ZSB0aHJvdWdocHV0Ci0JCS8vIElmIFR0cmFmZmljIGlzIHRvbyBoaWdoICggPiA0MDAgUnggcGVyIHNlY29uZCksIGRvbid0IGdvIHRvIHNsZWVwIG1vZGUuIElmIHR4IHJhdGUgaXMgbG93LCB1c2UgbG93IGNyaXRlcmlhCi0JCS8vIE1vZGU9Q0NLL01DUz0zID0+IDExIE1icHMsIE1vZGU9T0ZETS9NQ1M9MyA9PiAxOCBNYnBzCi0JCWlmICgoKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPD0gMykgJiYKLQkJCQkocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rRGF0YUNudCA8IChVTE9ORykxMDApKSB8fAotCQkJKChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTID4gMykgJiYKLQkJCShwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4T2tEYXRhQ250IDwgKFVMT05HKTQwMCkpKQotCQl7Ci0JCQkJLy8gR2V0IHRoaXMgdGltZQotCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmcEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUpOwotCQkJcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCA9IDA7Ci0JCQlNbG1lU2V0UHNtQml0KHBBZCwgUFdSX1NBVkUpOwotCQkJaWYgKCEocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKSkKLQkJCXsKLQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgRkFMU0UpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwgcEFkLT5Db21tb25DZmcuVHhSYXRlLCBUUlVFKTsKLQkJCX0KKwkgICAgKFBvd2VyTW9kZSAhPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNKSAmJgorCSAgICAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9BQ1RJVkUpICYmCisvKiAgICAgICAgICAgICAgKCEgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgKi8KKwkgICAgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKSAmJgorCSAgICBSVE1QX1RFU1RfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKQorCSAgICAvKiYmCisJICAgICAgIChwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgPT0gMCkgJiYKKwkgICAgICAgKHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgPT0gMCkgKi8KKwkgICAgKSB7CisJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJnBBZC0+TWxtZS5MYXN0U2VuZE5VTExwc21UaW1lKTsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCA9IDA7CisJCVJUTVBfU0VUX1BTTV9CSVQocEFkLCBQV1JfU0FWRSk7CisJCWlmICghCisJCSAgICAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlCisJCSAgICAgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQVBTRENhcGFibGUpKSB7CisJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgRkFMU0UpOworCQl9IGVsc2UgeworCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkLCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsIFRSVUUpOwogCQl9CiAJfQogfQogCi0vLyBJUlFMID0gUEFTU0lWRV9MRVZFTAotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIE1sbWVTZXRQc21CaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIHBzbSkKKy8qIElSUUwgPSBQQVNTSVZFX0xFVkVMICovCisvKiBJUlFMID0gRElTUEFUQ0hfTEVWRUwgKi8KK3ZvaWQgTWxtZVNldFBzbUJpdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHUxNiBwc20pCiB7CiAJQVVUT19SU1BfQ0ZHX1NUUlVDIGNzcjQ7CiAKIAlwQWQtPlN0YUNmZy5Qc20gPSBwc207CiAJUlRNUF9JT19SRUFEMzIocEFkLCBBVVRPX1JTUF9DRkcsICZjc3I0LndvcmQpOwotCWNzcjQuZmllbGQuQWNrQ3RzUHNtQml0ID0gKHBzbSA9PSBQV1JfU0FWRSk/IDE6MDsKKwljc3I0LmZpZWxkLkFja0N0c1BzbUJpdCA9IChwc20gPT0gUFdSX1NBVkUpID8gMSA6IDA7CiAJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19SU1BfQ0ZHLCBjc3I0LndvcmQpOwogCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNldFBzbUJpdCA9ICVkXG4iLCBwc20pKTsKIH0KIAotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIE1sbWVTZXRUeFByZWFtYmxlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVCBUeFByZWFtYmxlKQorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIHJvdXRpbmUgY2FsY3VsYXRlcyBUeFBFUiwgUnhQRVIgb2YgdGhlIHBhc3QgTi1zZWMgcGVyaW9kLiBBbmQKKwkJYWNjb3JkaW5nIHRvIHRoZSBjYWxjdWxhdGlvbiByZXN1bHQsIENoYW5uZWxRdWFsaXR5IGlzIGNhbGN1bGF0ZWQgaGVyZQorCQl0byBkZWNpZGUgaWYgY3VycmVudCBBUCBpcyBzdGlsbCBkb2luZyB0aGUgam9iLgorCisJCUlmIENoYW5uZWxRdWFsaXR5IGlzIG5vdCBnb29kLCBhIFJPQU1pbmcgYXR0ZW1wdCBtYXkgYmUgdHJpZWQgbGF0ZXIuCisJT3V0cHV0OgorCQlTdGFDZmcuQ2hhbm5lbFF1YWxpdHkgLSAwLi4xMDAKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTk9URTogVGhpcyByb3V0aW5lIGRlY2lkZSBjaGFubmxlIHF1YWxpdHkgYmFzZWQgb24gUlggQ1JDIGVycm9yIHJhdGlvLgorCQlDYWxsZXIgc2hvdWxkIG1ha2Ugc3VyZSBhIGZ1bmN0aW9uIGNhbGwgdG8gTklDVXBkYXRlUmF3Q291bnRlcnMocEFkKQorCQlpcyBwZXJmb3JtZWQgcmlnaHQgYmVmb3JlIHRoaXMgcm91dGluZSwgc28gdGhhdCB0aGlzIHJvdXRpbmUgY2FuIGRlY2lkZQorCQljaGFubmVsIHF1YWxpdHkgYmFzZWQgb24gdGhlIG1vc3QgdXAtdG8tZGF0ZSBpbmZvcm1hdGlvbgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3ZvaWQgTWxtZUNhbGN1bGF0ZUNoYW5uZWxRdWFsaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcE1hY0VudHJ5LCB1bnNpZ25lZCBsb25nIE5vdzMyKQoreworCXVuc2lnbmVkIGxvbmcgVHhPa0NudCwgVHhDbnQsIFR4UEVSLCBUeFBSUjsKKwl1bnNpZ25lZCBsb25nIFJ4Q250LCBSeFBFUjsKKwl1OCBOb3JSc3NpOworCWNoYXIgTWF4UnNzaTsKKwlzdHJ1Y3QgcnRfcnNzaV9zYW1wbGUgKnBSc3NpU2FtcGxlID0gTlVMTDsKKwl1MzIgT25lU2VjVHhOb1JldHJ5T2tDb3VudCA9IDA7CisJdTMyIE9uZVNlY1R4UmV0cnlPa0NvdW50ID0gMDsKKwl1MzIgT25lU2VjVHhGYWlsQ291bnQgPSAwOworCXUzMiBPbmVTZWNSeE9rQ250ID0gMDsKKwl1MzIgT25lU2VjUnhGY3NFcnJDbnQgPSAwOworCXVuc2lnbmVkIGxvbmcgQ2hhbm5lbFF1YWxpdHkgPSAwOwkvKiAwLi4xMDAsIENoYW5uZWwgUXVhbGl0eSBJbmRpY2F0aW9uIGZvciBSb2FtaW5nICovCisJdW5zaWduZWQgbG9uZyBCZWFjb25Mb3N0VGltZSA9IHBBZC0+U3RhQ2ZnLkJlYWNvbkxvc3RUaW1lOworCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpIHsKKwkJcFJzc2lTYW1wbGUgPSAmcEFkLT5TdGFDZmcuUnNzaVNhbXBsZTsKKwkJT25lU2VjVHhOb1JldHJ5T2tDb3VudCA9CisJCSAgICBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQ7CisJCU9uZVNlY1R4UmV0cnlPa0NvdW50ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudDsKKwkJT25lU2VjVHhGYWlsQ291bnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50OworCQlPbmVTZWNSeE9rQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rQ250OworCQlPbmVTZWNSeEZjc0VyckNudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhGY3NFcnJDbnQ7CisJfQorCisJTWF4UnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgcFJzc2lTYW1wbGUtPkxhc3RSc3NpMCwKKwkJCSAgICAgIHBSc3NpU2FtcGxlLT5MYXN0UnNzaTEsIHBSc3NpU2FtcGxlLT5MYXN0UnNzaTIpOworCisJLyogKi8KKwkvKiBjYWxjdWxhdGUgVFggcGFja2V0IGVycm9yIHJhdGlvIGFuZCBUWCByZXRyeSByYXRpbyAtIGlmIHRvbyBmZXcgVFggc2FtcGxlcywgc2tpcCBUWCByZWxhdGVkIHN0YXRpc3RpY3MgKi8KKwkvKiAqLworCVR4T2tDbnQgPSBPbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsgT25lU2VjVHhSZXRyeU9rQ291bnQ7CisJVHhDbnQgPSBUeE9rQ250ICsgT25lU2VjVHhGYWlsQ291bnQ7CisJaWYgKFR4Q250IDwgNSkgeworCQlUeFBFUiA9IDA7CisJCVR4UFJSID0gMDsKKwl9IGVsc2UgeworCQlUeFBFUiA9IChPbmVTZWNUeEZhaWxDb3VudCAqIDEwMCkgLyBUeENudDsKKwkJVHhQUlIgPSAoKFR4Q250IC0gT25lU2VjVHhOb1JldHJ5T2tDb3VudCkgKiAxMDApIC8gVHhDbnQ7CisJfQorCisJLyogKi8KKwkvKiBjYWxjdWxhdGUgUlggUEVSIC0gZG9uJ3QgdGFrZSBSeFBFUiBpbnRvIGNvbnNpZGVyYXRpb24gaWYgdG9vIGZldyBzYW1wbGUgKi8KKwkvKiAqLworCVJ4Q250ID0gT25lU2VjUnhPa0NudCArIE9uZVNlY1J4RmNzRXJyQ250OworCWlmIChSeENudCA8IDUpCisJCVJ4UEVSID0gMDsKKwllbHNlCisJCVJ4UEVSID0gKE9uZVNlY1J4RmNzRXJyQ250ICogMTAwKSAvIFJ4Q250OworCisJLyogKi8KKwkvKiBkZWNpZGUgQ2hhbm5lbFF1YWxpdHkgYmFzZWQgb246IDEpbGFzdCBCRUFDT04gcmVjZWl2ZWQgdGltZSwgMilsYXN0IFJTU0ksIDMpVHhQRVIsIGFuZCA0KVJ4UEVSICovCisJLyogKi8KKwlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIElORlJBX09OKHBBZCkgJiYgKE9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgPCAyKSAmJgkvKiBubyBoZWF2eSB0cmFmZmljICovCisJICAgICgocEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSArIEJlYWNvbkxvc3RUaW1lKSA8IE5vdzMyKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkJFQUNPTiBsb3N0ID4gJWxkIG1zZWMgd2l0aCBUeE9rQ250PSVsZCAtPiBDUUk9MFxuIiwKKwkJCSAgQmVhY29uTG9zdFRpbWUsIFR4T2tDbnQpKTsKKwkJQ2hhbm5lbFF1YWxpdHkgPSAwOworCX0gZWxzZSB7CisJCS8qIE5vcm1hbGl6ZSBSc3NpICovCisJCWlmIChNYXhSc3NpID4gLTQwKQorCQkJTm9yUnNzaSA9IDEwMDsKKwkJZWxzZSBpZiAoTWF4UnNzaSA8IC05MCkKKwkJCU5vclJzc2kgPSAwOworCQllbHNlCisJCQlOb3JSc3NpID0gKE1heFJzc2kgKyA5MCkgKiAyOworCisJCS8qIENoYW5uZWxRdWFsaXR5ID0gVzEqUlNTSSArIFcyKlR4UFJSICsgVzMqUnhQRVIgICAgICAgIChSU1NJIDAuLjEwMCksIChUeFBFUiAxMDAuLjApLCAoUnhQRVIgMTAwLi4wKSAqLworCQlDaGFubmVsUXVhbGl0eSA9IChSU1NJX1dFSUdIVElORyAqIE5vclJzc2kgKworCQkJCSAgVFhfV0VJR0hUSU5HICogKDEwMCAtIFR4UFJSKSArCisJCQkJICBSWF9XRUlHSFRJTkcgKiAoMTAwIC0gUnhQRVIpKSAvIDEwMDsKKwl9CisKKwlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKKwkJcEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ID0KKwkJICAgIChDaGFubmVsUXVhbGl0eSA+IDEwMCkgPyAxMDAgOiBDaGFubmVsUXVhbGl0eTsKKworfQorCisvKiBJUlFMID0gRElTUEFUQ0hfTEVWRUwgKi8KK3ZvaWQgTWxtZVNldFR4UHJlYW1ibGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1MTYgVHhQcmVhbWJsZSkKIHsKIAlBVVRPX1JTUF9DRkdfU1RSVUMgY3NyNDsKIAotCS8vCi0JLy8gQWx3YXlzIHVzZSBMb25nIHByZWFtYmxlIGJlZm9yZSB2ZXJpZmlhdGlvbiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzIHdlbGwuCi0JLy8gVG9kbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBpZiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzCi0JLy8KLQkvL1R4UHJlYW1ibGUgPSBSdDgwMl8xMVByZWFtYmxlTG9uZzsKKwkvKiAqLworCS8qIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLiAqLworCS8qIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyAqLworCS8qICovCisJLypUeFByZWFtYmxlID0gUnQ4MDJfMTFQcmVhbWJsZUxvbmc7ICovCiAKIAlSVE1QX0lPX1JFQUQzMihwQWQsIEFVVE9fUlNQX0NGRywgJmNzcjQud29yZCk7Ci0JaWYgKFR4UHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZUxvbmcpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU2V0VHhQcmVhbWJsZSAoPSBMT05HIFBSRUFNQkxFKVxuIikpOworCWlmIChUeFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVMb25nKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiTWxtZVNldFR4UHJlYW1ibGUgKD0gbG9uZyBQUkVBTUJMRSlcbiIpKTsKIAkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKIAkJY3NyNC5maWVsZC5BdXRvUmVzcG9uZGVyUHJlYW1ibGUgPSAwOwotCX0KLQllbHNlCi0JewotCQkvLyBOT1RFOiAxTWJwcyBzaG91bGQgYWx3YXlzIHVzZSBsb25nIHByZWFtYmxlCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTZXRUeFByZWFtYmxlICg9IFNIT1JUIFBSRUFNQkxFKVxuIikpOworCX0gZWxzZSB7CisJCS8qIE5PVEU6IDFNYnBzIHNob3VsZCBhbHdheXMgdXNlIGxvbmcgcHJlYW1ibGUgKi8KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJNbG1lU2V0VHhQcmVhbWJsZSAoPSBzaG9ydCBQUkVBTUJMRSlcbiIpKTsKIAkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7CiAJCWNzcjQuZmllbGQuQXV0b1Jlc3BvbmRlclByZWFtYmxlID0gMTsKIAl9CkBAIC0yODQ0LDExNyArMjc4NSwxNDAgQEAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCiAKLVZPSUQgVXBkYXRlQmFzaWNSYXRlQml0bWFwKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIpCit2b2lkIFVwZGF0ZUJhc2ljUmF0ZUJpdG1hcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlcikKIHsKLSAgICBJTlQgIGksIGo7Ci0gICAgICAgICAgICAgICAgICAvKiAxICAyICA1LjUsIDExLCAgNiwgIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgIDU0ICovCi0gICAgVUNIQVIgcmF0ZVtdID0geyAyLCA0LCAgMTEsIDIyLCAxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4IH07Ci0gICAgVUNIQVIgKnN1cF9wID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5TdXBSYXRlOwotICAgIFVDSEFSICpleHRfcCA9IHBBZGFwdGVyLT5Db21tb25DZmcuRXh0UmF0ZTsKLSAgICBVTE9ORyBiaXRtYXAgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJhc2ljUmF0ZUJpdG1hcDsKKwlpbnQgaSwgajsKKwkvKiAxICAyICA1LjUsIDExLCAgNiwgIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgIDU0ICovCisJdTggcmF0ZVtdID0geyAyLCA0LCAxMSwgMjIsIDEyLCAxOCwgMjQsIDM2LCA0OCwgNzIsIDk2LCAxMDggfTsKKwl1OCAqc3VwX3AgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlN1cFJhdGU7CisJdTggKmV4dF9wID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5FeHRSYXRlOworCXVuc2lnbmVkIGxvbmcgYml0bWFwID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXA7CiAKLQotICAgIC8qIGlmIEEgbW9kZSwgYWx3YXlzIHVzZSBmaXggQmFzaWNSYXRlQml0TWFwICovCi0gICAgLy9pZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsID09IFBIWV8xMUEpCisJLyogaWYgQSBtb2RlLCBhbHdheXMgdXNlIGZpeCBCYXNpY1JhdGVCaXRNYXAgKi8KKwkvKmlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgPT0gUEhZXzExQSkgKi8KIAlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCi0gICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQmFzaWNSYXRlQml0bWFwID0gMHgxNTA7IC8qIDYsIDEyLCAyNE0gKi8KLSAgICAvKiBFbmQgb2YgaWYgKi8KKwkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXAgPSAweDE1MDsJLyogNiwgMTIsIDI0TSAqLworCS8qIEVuZCBvZiBpZiAqLwogCi0gICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuQmFzaWNSYXRlQml0bWFwID4gNDA5NSkKLSAgICB7Ci0gICAgICAgIC8qICgyIF4gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpIC0xICovCi0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLworCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkJhc2ljUmF0ZUJpdG1hcCA+IDQwOTUpIHsKKwkJLyogKDIgXiBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykgLTEgKi8KKwkJcmV0dXJuOworCX0KKwkvKiBFbmQgb2YgaWYgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGkrKykgeworCQlzdXBfcFtpXSAmPSAweDdmOworCQlleHRfcFtpXSAmPSAweDdmOworCX0JCQkvKiBFbmQgb2YgZm9yICovCiAKLSAgICBmb3IoaT0wOyBpPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBpKyspCi0gICAgewotICAgICAgICBzdXBfcFtpXSAmPSAweDdmOwotICAgICAgICBleHRfcFtpXSAmPSAweDdmOwotICAgIH0gLyogRW5kIG9mIGZvciAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaSsrKSB7CisJCWlmIChiaXRtYXAgJiAoMSA8PCBpKSkgeworCQkJZm9yIChqID0gMDsgaiA8IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBqKyspIHsKKwkJCQlpZiAoc3VwX3Bbal0gPT0gcmF0ZVtpXSkKKwkJCQkJc3VwX3Bbal0gfD0gMHg4MDsKKwkJCQkvKiBFbmQgb2YgaWYgKi8KKwkJCX0JLyogRW5kIG9mIGZvciAqLwogCi0gICAgZm9yKGk9MDsgaTxNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKGJpdG1hcCAmICgxIDw8IGkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3Ioaj0wOyBqPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHN1cF9wW2pdID09IHJhdGVbaV0pCi0gICAgICAgICAgICAgICAgICAgIHN1cF9wW2pdIHw9IDB4ODA7Ci0gICAgICAgICAgICAgICAgLyogRW5kIG9mIGlmICovCi0gICAgICAgICAgICB9IC8qIEVuZCBvZiBmb3IgKi8KKwkJCWZvciAoaiA9IDA7IGogPCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaisrKSB7CisJCQkJaWYgKGV4dF9wW2pdID09IHJhdGVbaV0pCisJCQkJCWV4dF9wW2pdIHw9IDB4ODA7CisJCQkJLyogRW5kIG9mIGlmICovCisJCQl9CS8qIEVuZCBvZiBmb3IgKi8KKwkJfQkJLyogRW5kIG9mIGlmICovCisJfQkJCS8qIEVuZCBvZiBmb3IgKi8KK30JCQkJLyogRW5kIG9mIFVwZGF0ZUJhc2ljUmF0ZUJpdG1hcCAqLwogCi0gICAgICAgICAgICBmb3Ioaj0wOyBqPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGV4dF9wW2pdID09IHJhdGVbaV0pCi0gICAgICAgICAgICAgICAgICAgIGV4dF9wW2pdIHw9IDB4ODA7Ci0gICAgICAgICAgICAgICAgLyogRW5kIG9mIGlmICovCi0gICAgICAgICAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLSAgICAgICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLX0gLyogRW5kIG9mIFVwZGF0ZUJhc2ljUmF0ZUJpdG1hcCAqLwotCi0vLyBJUlFMID0gUEFTU0lWRV9MRVZFTAotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi0vLyBiTGlua1VwIGlzIHRvIGlkZW50aWZ5IHRoZSBpbml0YWwgbGluayBzcGVlZC4KLS8vIFRSVUUgaW5kaWNhdGVzIHRoZSByYXRlIHVwZGF0ZSBhdCBsaW5rdXAsIHdlIHNob3VsZCBub3QgdHJ5IHRvIHNldCB0aGUgcmF0ZSBhdCA1NE1icHMuCi1WT0lEIE1sbWVVcGRhdGVUeFJhdGVzKAotCUlOIFBSVE1QX0FEQVBURVIgCQlwQWQsCi0JSU4gCUJPT0xFQU4JCSAJCWJMaW5rVXAsCi0JSU4JVUNIQVIJCQkJYXBpZHgpCisvKiBJUlFMID0gUEFTU0lWRV9MRVZFTCAqLworLyogSVJRTCA9IERJU1BBVENIX0xFVkVMICovCisvKiBiTGlua1VwIGlzIHRvIGlkZW50aWZ5IHRoZSBpbml0YWwgbGluayBzcGVlZC4gKi8KKy8qIFRSVUUgaW5kaWNhdGVzIHRoZSByYXRlIHVwZGF0ZSBhdCBsaW5rdXAsIHdlIHNob3VsZCBub3QgdHJ5IHRvIHNldCB0aGUgcmF0ZSBhdCA1NE1icHMuICovCit2b2lkIE1sbWVVcGRhdGVUeFJhdGVzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgSU4gQk9PTEVBTiBiTGlua1VwLCB1OCBhcGlkeCkKIHsKIAlpbnQgaSwgbnVtOwotCVVDSEFSIFJhdGUgPSBSQVRFXzYsIE1heERlc2lyZSA9IFJBVEVfMSwgTWF4U3VwcG9ydCA9IFJBVEVfMTsKLQlVQ0hBUiBNaW5TdXBwb3J0ID0gUkFURV81NDsKLQlVTE9ORyBCYXNpY1JhdGVCaXRtYXAgPSAwOwotCVVDSEFSIEN1cnJCYXNpY1JhdGUgPSBSQVRFXzE7Ci0JVUNIQVIgKnBTdXBSYXRlLCBTdXBSYXRlTGVuLCAqcEV4dFJhdGUsIEV4dFJhdGVMZW47Ci0JUEhUVFJBTlNNSVRfU0VUVElORwkJcEh0UGh5ID0gTlVMTDsKLQlQSFRUUkFOU01JVF9TRVRUSU5HCQlwTWF4SHRQaHkgPSBOVUxMOwotCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBNaW5IdFBoeSA9IE5VTEw7Ci0JQk9PTEVBTiAJCQkJKmF1dG9fcmF0ZV9jdXJfcDsKLQlVQ0hBUgkJCQkJSHRNY3MgPSBNQ1NfQVVUTzsKKwl1OCBSYXRlID0gUkFURV82LCBNYXhEZXNpcmUgPSBSQVRFXzEsIE1heFN1cHBvcnQgPSBSQVRFXzE7CisJdTggTWluU3VwcG9ydCA9IFJBVEVfNTQ7CisJdW5zaWduZWQgbG9uZyBCYXNpY1JhdGVCaXRtYXAgPSAwOworCXU4IEN1cnJCYXNpY1JhdGUgPSBSQVRFXzE7CisJdTggKnBTdXBSYXRlLCBTdXBSYXRlTGVuLCAqcEV4dFJhdGUsIEV4dFJhdGVMZW47CisJUEhUVFJBTlNNSVRfU0VUVElORyBwSHRQaHkgPSBOVUxMOworCVBIVFRSQU5TTUlUX1NFVFRJTkcgcE1heEh0UGh5ID0gTlVMTDsKKwlQSFRUUkFOU01JVF9TRVRUSU5HIHBNaW5IdFBoeSA9IE5VTEw7CisJQk9PTEVBTiAqYXV0b19yYXRlX2N1cl9wOworCXU4IEh0TWNzID0gTUNTX0FVVE87CiAKLQkvLyBmaW5kIG1heCBkZXNpcmVkIHJhdGUKKwkvKiBmaW5kIG1heCBkZXNpcmVkIHJhdGUgKi8KIAlVcGRhdGVCYXNpY1JhdGVCaXRtYXAocEFkKTsKIAogCW51bSA9IDA7CiAJYXV0b19yYXRlX2N1cl9wID0gTlVMTDsKLQlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaSsrKQotCXsKLQkJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlW2ldICYgMHg3ZikKLQkJewotCQkJY2FzZSAyOiAgUmF0ZSA9IFJBVEVfMTsgICBudW0rKzsgICBicmVhazsKLQkJCWNhc2UgNDogIFJhdGUgPSBSQVRFXzI7ICAgbnVtKys7ICAgYnJlYWs7Ci0JCQljYXNlIDExOiBSYXRlID0gUkFURV81XzU7IG51bSsrOyAgIGJyZWFrOwotCQkJY2FzZSAyMjogUmF0ZSA9IFJBVEVfMTE7ICBudW0rKzsgICBicmVhazsKLQkJCWNhc2UgMTI6IFJhdGUgPSBSQVRFXzY7ICAgbnVtKys7ICAgYnJlYWs7Ci0JCQljYXNlIDE4OiBSYXRlID0gUkFURV85OyAgIG51bSsrOyAgIGJyZWFrOwotCQkJY2FzZSAyNDogUmF0ZSA9IFJBVEVfMTI7ICBudW0rKzsgICBicmVhazsKLQkJCWNhc2UgMzY6IFJhdGUgPSBSQVRFXzE4OyAgbnVtKys7ICAgYnJlYWs7Ci0JCQljYXNlIDQ4OiBSYXRlID0gUkFURV8yNDsgIG51bSsrOyAgIGJyZWFrOwotCQkJY2FzZSA3MjogUmF0ZSA9IFJBVEVfMzY7ICBudW0rKzsgICBicmVhazsKLQkJCWNhc2UgOTY6IFJhdGUgPSBSQVRFXzQ4OyAgbnVtKys7ICAgYnJlYWs7Ci0JCQljYXNlIDEwODogUmF0ZSA9IFJBVEVfNTQ7IG51bSsrOyAgIGJyZWFrOwotCQkJLy9kZWZhdWx0OiBSYXRlID0gUkFURV8xOyAgIGJyZWFrOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaSsrKSB7CisJCXN3aXRjaCAocEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVtpXSAmIDB4N2YpIHsKKwkJY2FzZSAyOgorCQkJUmF0ZSA9IFJBVEVfMTsKKwkJCW51bSsrOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCVJhdGUgPSBSQVRFXzI7CisJCQludW0rKzsKKwkJCWJyZWFrOworCQljYXNlIDExOgorCQkJUmF0ZSA9IFJBVEVfNV81OworCQkJbnVtKys7CisJCQlicmVhazsKKwkJY2FzZSAyMjoKKwkJCVJhdGUgPSBSQVRFXzExOworCQkJbnVtKys7CisJCQlicmVhazsKKwkJY2FzZSAxMjoKKwkJCVJhdGUgPSBSQVRFXzY7CisJCQludW0rKzsKKwkJCWJyZWFrOworCQljYXNlIDE4OgorCQkJUmF0ZSA9IFJBVEVfOTsKKwkJCW51bSsrOworCQkJYnJlYWs7CisJCWNhc2UgMjQ6CisJCQlSYXRlID0gUkFURV8xMjsKKwkJCW51bSsrOworCQkJYnJlYWs7CisJCWNhc2UgMzY6CisJCQlSYXRlID0gUkFURV8xODsKKwkJCW51bSsrOworCQkJYnJlYWs7CisJCWNhc2UgNDg6CisJCQlSYXRlID0gUkFURV8yNDsKKwkJCW51bSsrOworCQkJYnJlYWs7CisJCWNhc2UgNzI6CisJCQlSYXRlID0gUkFURV8zNjsKKwkJCW51bSsrOworCQkJYnJlYWs7CisJCWNhc2UgOTY6CisJCQlSYXRlID0gUkFURV80ODsKKwkJCW51bSsrOworCQkJYnJlYWs7CisJCWNhc2UgMTA4OgorCQkJUmF0ZSA9IFJBVEVfNTQ7CisJCQludW0rKzsKKwkJCWJyZWFrOworCQkJLypkZWZhdWx0OiBSYXRlID0gUkFURV8xOyAgIGJyZWFrOyAqLwogCQl9Ci0JCWlmIChNYXhEZXNpcmUgPCBSYXRlKSAgTWF4RGVzaXJlID0gUmF0ZTsKKwkJaWYgKE1heERlc2lyZSA8IFJhdGUpCisJCQlNYXhEZXNpcmUgPSBSYXRlOwogCX0KIAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAl7Ci0JCXBIdFBoeSAJCT0gJnBBZC0+U3RhQ2ZnLkhUUGh5TW9kZTsKLQkJcE1heEh0UGh5CT0gJnBBZC0+U3RhQ2ZnLk1heEhUUGh5TW9kZTsKLQkJcE1pbkh0UGh5CT0gJnBBZC0+U3RhQ2ZnLk1pbkhUUGh5TW9kZTsKKwkJcEh0UGh5ID0gJnBBZC0+U3RhQ2ZnLkhUUGh5TW9kZTsKKwkJcE1heEh0UGh5ID0gJnBBZC0+U3RhQ2ZnLk1heEhUUGh5TW9kZTsKKwkJcE1pbkh0UGh5ID0gJnBBZC0+U3RhQ2ZnLk1pbkhUUGh5TW9kZTsKIAogCQlhdXRvX3JhdGVfY3VyX3AgPSAmcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2g7Ci0JCUh0TWNzIAkJPSBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUzsKKwkJSHRNY3MgPSBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUzsKIAogCQlpZiAoKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKSAmJgotCQkJKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikgJiYKLQkJCShNYXhEZXNpcmUgPiBSQVRFXzExKSkKLQkJeworCQkgICAgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikgJiYKKwkJICAgIChNYXhEZXNpcmUgPiBSQVRFXzExKSkgewogCQkJTWF4RGVzaXJlID0gUkFURV8xMTsKIAkJfQogCX0KQEAgLTI5NjQsMTExICsyOTI4LDIxMSBAQAogCXBNYXhIdFBoeS0+d29yZCA9IDA7CiAJcEh0UGh5LT53b3JkID0gMDsKIAotCS8vIEF1dG8gcmF0ZSBzd2l0Y2hpbmcgaXMgZW5hYmxlZCBvbmx5IGlmIG1vcmUgdGhhbiBvbmUgREVTSVJFRCBSQVRFUyBhcmUKLQkvLyBzcGVjaWZpZWQ7IG90aGVyd2lzZSBkaXNhYmxlZAotCWlmIChudW0gPD0gMSkKLQl7CisJLyogQXV0byByYXRlIHN3aXRjaGluZyBpcyBlbmFibGVkIG9ubHkgaWYgbW9yZSB0aGFuIG9uZSBERVNJUkVEIFJBVEVTIGFyZSAqLworCS8qIHNwZWNpZmllZDsgb3RoZXJ3aXNlIGRpc2FibGVkICovCisJaWYgKG51bSA8PSAxKSB7CisJCS8qT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCk7ICovCisJCS8qcEFkLT5Db21tb25DZmcuYkF1dG9UeFJhdGVTd2l0Y2ggICAgICA9IEZBTFNFOyAqLwogCQkqYXV0b19yYXRlX2N1cl9wID0gRkFMU0U7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKKwkJLypPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCk7ICovCisJCS8qcEFkLT5Db21tb25DZmcuYkF1dG9UeFJhdGVTd2l0Y2ggICAgICA9IFRSVUU7ICovCiAJCSphdXRvX3JhdGVfY3VyX3AgPSBUUlVFOwogCX0KIAotI2lmIDEKLQlpZiAoSHRNY3MgIT0gTUNTX0FVVE8pCi0JeworCWlmIChIdE1jcyAhPSBNQ1NfQVVUTykgeworCQkvKk9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpOyAqLworCQkvKnBBZC0+Q29tbW9uQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoICAgICAgPSBGQUxTRTsgKi8KIAkJKmF1dG9fcmF0ZV9jdXJfcCA9IEZBTFNFOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CisJCS8qT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpOyAqLworCQkvKnBBZC0+Q29tbW9uQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoICAgICAgPSBUUlVFOyAqLwogCQkqYXV0b19yYXRlX2N1cl9wID0gVFJVRTsKIAl9Ci0jZW5kaWYKIAotCWlmICgoQURIT0NfT04ocEFkKSB8fCBJTkZSQV9PTihwQWQpKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCi0JeworCWlmICgoQURIT0NfT04ocEFkKSB8fCBJTkZSQV9PTihwQWQpKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpIHsKIAkJcFN1cFJhdGUgPSAmcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZVswXTsKIAkJcEV4dFJhdGUgPSAmcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZVswXTsKIAkJU3VwUmF0ZUxlbiA9IHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW47CiAJCUV4dFJhdGVMZW4gPSBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCXBTdXBSYXRlID0gJnBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF07CiAJCXBFeHRSYXRlID0gJnBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbMF07CiAJCVN1cFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuOwogCQlFeHRSYXRlTGVuID0gcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbjsKIAl9CiAKLQkvLyBmaW5kIG1heCBzdXBwb3J0ZWQgcmF0ZQotCWZvciAoaT0wOyBpPFN1cFJhdGVMZW47IGkrKykKLQl7Ci0JCXN3aXRjaCAocFN1cFJhdGVbaV0gJiAweDdmKQotCQl7Ci0JCQljYXNlIDI6ICAgUmF0ZSA9IFJBVEVfMTsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwMTsJIGJyZWFrOwotCQkJY2FzZSA0OiAgIFJhdGUgPSBSQVRFXzI7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDI7CSBicmVhazsKLQkJCWNhc2UgMTE6ICBSYXRlID0gUkFURV81XzU7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDQ7CSBicmVhazsKLQkJCWNhc2UgMjI6ICBSYXRlID0gUkFURV8xMTsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwODsJIGJyZWFrOwotCQkJY2FzZSAxMjogIFJhdGUgPSBSQVRFXzY7CS8qaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAxMDsgIGJyZWFrOwotCQkJY2FzZSAxODogIFJhdGUgPSBSQVRFXzk7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMjA7CSBicmVhazsKLQkJCWNhc2UgMjQ6ICBSYXRlID0gUkFURV8xMjsJLyppZiAocFN1cFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDQwOyAgYnJlYWs7Ci0JCQljYXNlIDM2OiAgUmF0ZSA9IFJBVEVfMTg7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwODA7CSBicmVhazsKLQkJCWNhc2UgNDg6ICBSYXRlID0gUkFURV8yNDsJLyppZiAocFN1cFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMTAwOyAgYnJlYWs7Ci0JCQljYXNlIDcyOiAgUmF0ZSA9IFJBVEVfMzY7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAyMDA7CSBicmVhazsKLQkJCWNhc2UgOTY6ICBSYXRlID0gUkFURV80ODsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDQwMDsJIGJyZWFrOwotCQkJY2FzZSAxMDg6IFJhdGUgPSBSQVRFXzU0OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwODAwOwkgYnJlYWs7Ci0JCQlkZWZhdWx0OiAgUmF0ZSA9IFJBVEVfMTsJYnJlYWs7CisJLyogZmluZCBtYXggc3VwcG9ydGVkIHJhdGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU3VwUmF0ZUxlbjsgaSsrKSB7CisJCXN3aXRjaCAocFN1cFJhdGVbaV0gJiAweDdmKSB7CisJCWNhc2UgMjoKKwkJCVJhdGUgPSBSQVRFXzE7CisJCQlpZiAocFN1cFJhdGVbaV0gJiAweDgwKQorCQkJCUJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDE7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJUmF0ZSA9IFJBVEVfMjsKKwkJCWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApCisJCQkJQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwMjsKKwkJCWJyZWFrOworCQljYXNlIDExOgorCQkJUmF0ZSA9IFJBVEVfNV81OworCQkJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkKKwkJCQlCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDA0OworCQkJYnJlYWs7CisJCWNhc2UgMjI6CisJCQlSYXRlID0gUkFURV8xMTsKKwkJCWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApCisJCQkJQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwODsKKwkJCWJyZWFrOworCQljYXNlIDEyOgorCQkJUmF0ZSA9IFJBVEVfNjsJLyppZiAocFN1cFJhdGVbaV0gJiAweDgwKSAqLworCQkJQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAxMDsKKwkJCWJyZWFrOworCQljYXNlIDE4OgorCQkJUmF0ZSA9IFJBVEVfOTsKKwkJCWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApCisJCQkJQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAyMDsKKwkJCWJyZWFrOworCQljYXNlIDI0OgorCQkJUmF0ZSA9IFJBVEVfMTI7CS8qaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgKi8KKwkJCUJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwNDA7CisJCQlicmVhazsKKwkJY2FzZSAzNjoKKwkJCVJhdGUgPSBSQVRFXzE4OworCQkJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkKKwkJCQlCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDgwOworCQkJYnJlYWs7CisJCWNhc2UgNDg6CisJCQlSYXRlID0gUkFURV8yNDsJLyppZiAocFN1cFJhdGVbaV0gJiAweDgwKSAqLworCQkJQmFzaWNSYXRlQml0bWFwIHw9IDB4MDEwMDsKKwkJCWJyZWFrOworCQljYXNlIDcyOgorCQkJUmF0ZSA9IFJBVEVfMzY7CisJCQlpZiAocFN1cFJhdGVbaV0gJiAweDgwKQorCQkJCUJhc2ljUmF0ZUJpdG1hcCB8PSAweDAyMDA7CisJCQlicmVhazsKKwkJY2FzZSA5NjoKKwkJCVJhdGUgPSBSQVRFXzQ4OworCQkJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkKKwkJCQlCYXNpY1JhdGVCaXRtYXAgfD0gMHgwNDAwOworCQkJYnJlYWs7CisJCWNhc2UgMTA4OgorCQkJUmF0ZSA9IFJBVEVfNTQ7CisJCQlpZiAocFN1cFJhdGVbaV0gJiAweDgwKQorCQkJCUJhc2ljUmF0ZUJpdG1hcCB8PSAweDA4MDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVJhdGUgPSBSQVRFXzE7CisJCQlicmVhazsKIAkJfQotCQlpZiAoTWF4U3VwcG9ydCA8IFJhdGUpCU1heFN1cHBvcnQgPSBSYXRlOworCQlpZiAoTWF4U3VwcG9ydCA8IFJhdGUpCisJCQlNYXhTdXBwb3J0ID0gUmF0ZTsKIAotCQlpZiAoTWluU3VwcG9ydCA+IFJhdGUpIE1pblN1cHBvcnQgPSBSYXRlOworCQlpZiAoTWluU3VwcG9ydCA+IFJhdGUpCisJCQlNaW5TdXBwb3J0ID0gUmF0ZTsKIAl9CiAKLQlmb3IgKGk9MDsgaTxFeHRSYXRlTGVuOyBpKyspCi0JewotCQlzd2l0Y2ggKHBFeHRSYXRlW2ldICYgMHg3ZikKLQkJewotCQkJY2FzZSAyOiAgIFJhdGUgPSBSQVRFXzE7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDE7CSBicmVhazsKLQkJCWNhc2UgNDogICBSYXRlID0gUkFURV8yOwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDAyOwkgYnJlYWs7Ci0JCQljYXNlIDExOiAgUmF0ZSA9IFJBVEVfNV81OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDA0OwkgYnJlYWs7Ci0JCQljYXNlIDIyOiAgUmF0ZSA9IFJBVEVfMTE7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDg7CSBicmVhazsKLQkJCWNhc2UgMTI6ICBSYXRlID0gUkFURV82OwkvKmlmIChwRXh0UmF0ZVtpXSAmIDB4ODApKi8gIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMTA7ICBicmVhazsKLQkJCWNhc2UgMTg6ICBSYXRlID0gUkFURV85OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDIwOwkgYnJlYWs7Ci0JCQljYXNlIDI0OiAgUmF0ZSA9IFJBVEVfMTI7CS8qaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDA0MDsgIGJyZWFrOwotCQkJY2FzZSAzNjogIFJhdGUgPSBSQVRFXzE4OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDgwOwkgYnJlYWs7Ci0JCQljYXNlIDQ4OiAgUmF0ZSA9IFJBVEVfMjQ7CS8qaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDEwMDsgIGJyZWFrOwotCQkJY2FzZSA3MjogIFJhdGUgPSBSQVRFXzM2OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMjAwOwkgYnJlYWs7Ci0JCQljYXNlIDk2OiAgUmF0ZSA9IFJBVEVfNDg7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDA0MDA7CSBicmVhazsKLQkJCWNhc2UgMTA4OiBSYXRlID0gUkFURV81NDsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDgwMDsJIGJyZWFrOwotCQkJZGVmYXVsdDogIFJhdGUgPSBSQVRFXzE7CWJyZWFrOworCWZvciAoaSA9IDA7IGkgPCBFeHRSYXRlTGVuOyBpKyspIHsKKwkJc3dpdGNoIChwRXh0UmF0ZVtpXSAmIDB4N2YpIHsKKwkJY2FzZSAyOgorCQkJUmF0ZSA9IFJBVEVfMTsKKwkJCWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApCisJCQkJQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwMTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlSYXRlID0gUkFURV8yOworCQkJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkKKwkJCQlCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDAyOworCQkJYnJlYWs7CisJCWNhc2UgMTE6CisJCQlSYXRlID0gUkFURV81XzU7CisJCQlpZiAocEV4dFJhdGVbaV0gJiAweDgwKQorCQkJCUJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDQ7CisJCQlicmVhazsKKwkJY2FzZSAyMjoKKwkJCVJhdGUgPSBSQVRFXzExOworCQkJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkKKwkJCQlCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDA4OworCQkJYnJlYWs7CisJCWNhc2UgMTI6CisJCQlSYXRlID0gUkFURV82OwkvKmlmIChwRXh0UmF0ZVtpXSAmIDB4ODApICovCisJCQlCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDEwOworCQkJYnJlYWs7CisJCWNhc2UgMTg6CisJCQlSYXRlID0gUkFURV85OworCQkJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkKKwkJCQlCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDIwOworCQkJYnJlYWs7CisJCWNhc2UgMjQ6CisJCQlSYXRlID0gUkFURV8xMjsJLyppZiAocEV4dFJhdGVbaV0gJiAweDgwKSAqLworCQkJQmFzaWNSYXRlQml0bWFwIHw9IDB4MDA0MDsKKwkJCWJyZWFrOworCQljYXNlIDM2OgorCQkJUmF0ZSA9IFJBVEVfMTg7CisJCQlpZiAocEV4dFJhdGVbaV0gJiAweDgwKQorCQkJCUJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwODA7CisJCQlicmVhazsKKwkJY2FzZSA0ODoKKwkJCVJhdGUgPSBSQVRFXzI0OwkvKmlmIChwRXh0UmF0ZVtpXSAmIDB4ODApICovCisJCQlCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMTAwOworCQkJYnJlYWs7CisJCWNhc2UgNzI6CisJCQlSYXRlID0gUkFURV8zNjsKKwkJCWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApCisJCQkJQmFzaWNSYXRlQml0bWFwIHw9IDB4MDIwMDsKKwkJCWJyZWFrOworCQljYXNlIDk2OgorCQkJUmF0ZSA9IFJBVEVfNDg7CisJCQlpZiAocEV4dFJhdGVbaV0gJiAweDgwKQorCQkJCUJhc2ljUmF0ZUJpdG1hcCB8PSAweDA0MDA7CisJCQlicmVhazsKKwkJY2FzZSAxMDg6CisJCQlSYXRlID0gUkFURV81NDsKKwkJCWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApCisJCQkJQmFzaWNSYXRlQml0bWFwIHw9IDB4MDgwMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJUmF0ZSA9IFJBVEVfMTsKKwkJCWJyZWFrOwogCQl9Ci0JCWlmIChNYXhTdXBwb3J0IDwgUmF0ZSkJTWF4U3VwcG9ydCA9IFJhdGU7CisJCWlmIChNYXhTdXBwb3J0IDwgUmF0ZSkKKwkJCU1heFN1cHBvcnQgPSBSYXRlOwogCi0JCWlmIChNaW5TdXBwb3J0ID4gUmF0ZSkgTWluU3VwcG9ydCA9IFJhdGU7CisJCWlmIChNaW5TdXBwb3J0ID4gUmF0ZSkKKwkJCU1pblN1cHBvcnQgPSBSYXRlOwogCX0KIAogCVJUTVBfSU9fV1JJVEUzMihwQWQsIExFR0FDWV9CQVNJQ19SQVRFLCBCYXNpY1JhdGVCaXRtYXApOwogCi0JLy8gY2FsY3VsYXRlIHRoZSBleHB0ZWN0ZWQgQUNLIHJhdGUgZm9yIGVhY2ggVFggcmF0ZS4gVGhpcyBpbmZvIGlzIHVzZWQgdG8gY2FjdWxhdGUKLQkvLyB0aGUgRFVSQVRJT04gZmllbGQgb2Ygb3V0Z29pbmcgdW5paWNhc3QgREFUQS9NR01UIGZyYW1lCi0JZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGkrKykKLQl7CisJLyogYnVnIGZpeCAqLworCS8qIHBBZC0+Q29tbW9uQ2ZnLkJhc2ljUmF0ZUJpdG1hcCA9IEJhc2ljUmF0ZUJpdG1hcDsgKi8KKworCS8qIGNhbGN1bGF0ZSB0aGUgZXhwdGVjdGVkIEFDSyByYXRlIGZvciBlYWNoIFRYIHJhdGUuIFRoaXMgaW5mbyBpcyB1c2VkIHRvIGNhY3VsYXRlICovCisJLyogdGhlIERVUkFUSU9OIGZpZWxkIG9mIG91dGdvaW5nIHVuaWljYXN0IERBVEEvTUdNVCBmcmFtZSAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaSsrKSB7CiAJCWlmIChCYXNpY1JhdGVCaXRtYXAgJiAoMHgwMSA8PCBpKSkKLQkJCUN1cnJCYXNpY1JhdGUgPSAoVUNIQVIpaTsKKwkJCUN1cnJCYXNpY1JhdGUgPSAodTgpaTsKIAkJcEFkLT5Db21tb25DZmcuRXhwZWN0ZWRBQ0tSYXRlW2ldID0gQ3VyckJhc2ljUmF0ZTsKIAl9CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1sbWVVcGRhdGVUeFJhdGVzW01heFN1cHBvcnQgPSAlZF0gPSBNYXhEZXNpcmUgJWQgTWJwc1xuIiwgUmF0ZUlkVG9NYnBzW01heFN1cHBvcnRdLCBSYXRlSWRUb01icHNbTWF4RGVzaXJlXSkpOwotCS8vIG1heCB0eCByYXRlID0gbWluIHttYXggZGVzaXJlIHJhdGUsIG1heCBzdXBwb3J0ZWQgcmF0ZX0KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiTWxtZVVwZGF0ZVR4UmF0ZXNbTWF4U3VwcG9ydCA9ICVkXSA9IE1heERlc2lyZSAlZCBNYnBzXG4iLAorCQkgIFJhdGVJZFRvTWJwc1tNYXhTdXBwb3J0XSwgUmF0ZUlkVG9NYnBzW01heERlc2lyZV0pKTsKKwkvKiBtYXggdHggcmF0ZSA9IG1pbiB7bWF4IGRlc2lyZSByYXRlLCBtYXggc3VwcG9ydGVkIHJhdGV9ICovCiAJaWYgKE1heFN1cHBvcnQgPCBNYXhEZXNpcmUpCiAJCXBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA9IE1heFN1cHBvcnQ7CiAJZWxzZQogCQlwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPSBNYXhEZXNpcmU7CiAKIAlwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPSBNaW5TdXBwb3J0OwotCWlmICgqYXV0b19yYXRlX2N1cl9wKQotCXsKKwkvKiAyMDAzLTA3LTMxIGpvaG4gLSAyNTAwIGRvZXNuJ3QgaGF2ZSBnb29kIHNlbnNpdGl2aXR5IGF0IGhpZ2ggT0ZETSByYXRlcy4gdG8gaW5jcmVhc2UgdGhlIHN1Y2Nlc3MgKi8KKwkvKiByYXRpbyBvZiBpbml0aWFsIERIQ1AgcGFja2V0IGV4Y2hhbmdlLCBUWCByYXRlIHN0YXJ0cyBmcm9tIGEgbG93ZXIgcmF0ZSBkZXBlbmRpbmcgKi8KKwkvKiBvbiBhdmVyYWdlIFJTU0kgKi8KKwkvKiAgICAgICAxLiBSU1NJID49IC03MGRiLCBzdGFydCBhdCA1NCBNYnBzIChzaG9ydCBkaXN0YW5jZSkgKi8KKwkvKiAgICAgICAyLiAtNzAgPiBSU1NJID49IC03NSwgc3RhcnQgYXQgMjQgTWJwcyAobWlkIGRpc3RhbmNlKSAqLworCS8qICAgICAgIDMuIC03NSA+IFJTU0ksIHN0YXJ0IGF0IDExIE1icHMgKGxvbmcgZGlzdGFuY2UpICovCisJaWYgKCphdXRvX3JhdGVfY3VyX3ApIHsKIAkJc2hvcnQgZGJtID0gMDsKIAogCQlkYm0gPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKQEAgLTMwODMsMTEzICszMTQ3LDEzNyBAQAogCQllbHNlIGlmIChkYm0gPCAtNzApCiAJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBSQVRFXzI0OwogCi0JCS8vIHNob3VsZCBuZXZlciBleGNlZWQgTWF4VHhSYXRlIChjb25zaWRlciAxMUItb25seSBtb2RlKQorCQkvKiBzaG91bGQgbmV2ZXIgZXhjZWVkIE1heFR4UmF0ZSAoY29uc2lkZXIgMTFCLW9ubHkgbW9kZSkgKi8KIAkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA+IHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSkKIAkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZTsKIAogCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA9IDA7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlOwotCQlwSHRQaHktPmZpZWxkLk1DUwk9IChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPiAzKSA/IChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgLSA0KSA6IHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZTsKLQkJcEh0UGh5LT5maWVsZC5NT0RFCT0gKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA+IDMpID8gTU9ERV9PRkRNIDogTU9ERV9DQ0s7CisJCXBIdFBoeS0+ZmllbGQuTUNTID0KKwkJICAgIChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPgorCQkgICAgIDMpID8gKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSAtCisJCQkgICA0KSA6IHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZTsKKwkJcEh0UGh5LT5maWVsZC5NT0RFID0KKwkJICAgIChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPiAzKSA/IE1PREVfT0ZETSA6IE1PREVfQ0NLOwogCi0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLlNUQkMJPSBwSHRQaHktPmZpZWxkLlNUQkM7Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kJPSBwSHRQaHktPmZpZWxkLlNob3J0R0k7Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUwkJPSBwSHRQaHktPmZpZWxkLk1DUzsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBIdFBoeS0+ZmllbGQuTU9ERTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuU1RCQyA9CisJCSAgICBwSHRQaHktPmZpZWxkLlNUQkM7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPQorCQkgICAgcEh0UGh5LT5maWVsZC5TaG9ydEdJOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPQorCQkgICAgcEh0UGh5LT5maWVsZC5NQ1M7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPQorCQkgICAgcEh0UGh5LT5maWVsZC5NT0RFOwogCX0KIAotCWlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPD0gUkFURV8xMSkKLQl7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA8PSBSQVRFXzExKSB7CiAJCXBNYXhIdFBoeS0+ZmllbGQuTU9ERSA9IE1PREVfQ0NLOwogCQlwTWF4SHRQaHktPmZpZWxkLk1DUyA9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZTsKIAkJcE1pbkh0UGh5LT5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGU7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJcE1heEh0UGh5LT5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwogCQlwTWF4SHRQaHktPmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZV07Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPj0gUkFURV82ICYmIChwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPD0gUkFURV81NCkpCi0JCQl7cE1pbkh0UGh5LT5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGVdO30KLQkJZWxzZQotCQkJe3BNaW5IdFBoeS0+ZmllbGQuTUNTID0gcEFkLT5Db21tb25DZmcuTWluVHhSYXRlO30KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZSA+PSBSQVRFXzYKKwkJICAgICYmIChwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPD0gUkFURV81NCkpIHsKKwkJCXBNaW5IdFBoeS0+ZmllbGQuTUNTID0KKwkJCSAgICBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGVdOworCQl9IGVsc2UgeworCQkJcE1pbkh0UGh5LT5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGU7CisJCX0KIAl9CiAKIAlwSHRQaHktPndvcmQgPSAocE1heEh0UGh5LT53b3JkKTsKLQlpZiAoYkxpbmtVcCAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCi0JewotCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZCA9IHBIdFBoeS0+d29yZDsKLQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWF4SFRQaHlNb2RlLndvcmQgPSBwTWF4SHRQaHktPndvcmQ7Ci0JCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1pbkhUUGh5TW9kZS53b3JkID0gcE1pbkh0UGh5LT53b3JkOwotCX0KLQllbHNlCi0JewotCQlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpCi0JCXsKLQkJCWNhc2UgUEhZXzExQkdfTUlYRUQ6Ci0JCQljYXNlIFBIWV8xMUI6Ci0JCQljYXNlIFBIWV8xMUJHTl9NSVhFRDoKKwlpZiAoYkxpbmtVcCAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpIHsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZCA9IHBIdFBoeS0+d29yZDsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NYXhIVFBoeU1vZGUud29yZCA9CisJCSAgICBwTWF4SHRQaHktPndvcmQ7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWluSFRQaHlNb2RlLndvcmQgPQorCQkgICAgcE1pbkh0UGh5LT53b3JkOworCX0gZWxzZSB7CisJCXN3aXRjaCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSkgeworCQljYXNlIFBIWV8xMUJHX01JWEVEOgorCQljYXNlIFBIWV8xMUI6CisJCWNhc2UgUEhZXzExQkdOX01JWEVEOgorCQkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzE7CisJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IFJBVEVfMTsKKworLyojaWZkZWYgICAgICAgIFdJRklfVEVTVCAqLworCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfMTE7CisvKiNlbHNlICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzE7ICovCisvKiNlbmRpZiAqLworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExRzoKKwkJY2FzZSBQSFlfMTFBOgorCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFHTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFOXzJfNEc6CisJCWNhc2UgUEhZXzExQU5fTUlYRUQ6CisJCWNhc2UgUEhZXzExTl81RzoKKwkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV82OworCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfNjsKKwkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9CisJCQkgICAgT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQUJHX01JWEVEOgorCQljYXNlIFBIWV8xMUFCR05fTUlYRUQ6CisJCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkgewogCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV8xOwotCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfMTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9CisJCQkJICAgIE1PREVfQ0NLOwogCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBSQVRFXzE7Ci0JCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfMTE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBIWV8xMUc6Ci0JCQljYXNlIFBIWV8xMUE6Ci0JCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKLQkJCWNhc2UgUEhZXzExR05fTUlYRUQ6Ci0JCQljYXNlIFBIWV8xMU5fMl80RzoKLQkJCWNhc2UgUEhZXzExQU5fTUlYRUQ6Ci0JCQljYXNlIFBIWV8xMU5fNUc6CisJCQl9IGVsc2UgewogCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV82OwogCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzY7Ci0JCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUEhZXzExQUJHX01JWEVEOgotCQkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgotCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KQotCQkJCXsKLQkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzE7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzE7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBSQVRFXzE7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV82OwotCQkJCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV82OwotCQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OiAvLyBlcnJvcgotCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV82OwotICAgICAgICAgICAgICAgICAgICAgICAgCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07Ci0JCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfMTsKLQkJCQlicmVhazsKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9CisJCQkJICAgIE1PREVfT0ZETTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0KKwkJCQkgICAgT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CS8qIGVycm9yICovCisJCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfNjsKKwkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9CisJCQkgICAgT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOworCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfMTsKKwkJCWJyZWFrOwogCQl9Ci0JCS8vCi0JCS8vIEtlZXAgQmFzaWMgTWxtZSBSYXRlLgotCQkvLwotCQlwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZS53b3JkID0gcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LndvcmQ7CisJCS8qICovCisJCS8qIEtlZXAgQmFzaWMgTWxtZSBSYXRlLiAqLworCQkvKiAqLworCQlwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZS53b3JkID0KKwkJICAgIHBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC53b3JkOwogCQlpZiAocEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPT0gTU9ERV9PRkRNKQotCQkJcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbUkFURV8yNF07CisJCQlwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPQorCQkJICAgIE9mZG1SYXRlVG9SeHdpTUNTW1JBVEVfMjRdOwogCQllbHNlCi0JCQlwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBSQVRFXzE7CisJCQlwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPQorCQkJICAgIFJBVEVfMTsKIAkJcEFkLT5Db21tb25DZmcuQmFzaWNNbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlOwogCX0KIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoTWF4RGVzaXJlPSVkLCBNYXhTdXBwb3J0PSVkLCBNYXhUeFJhdGU9JWQsIE1pblJhdGU9JWQsIFJhdGUgU3dpdGNoaW5nID0lZClcbiIsCi0JCQkgUmF0ZUlkVG9NYnBzW01heERlc2lyZV0sIFJhdGVJZFRvTWJwc1tNYXhTdXBwb3J0XSwgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZV0sIFJhdGVJZFRvTWJwc1twQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGVdLAotCQkJIC8qT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSovKmF1dG9fcmF0ZV9jdXJfcCkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoVHhSYXRlPSVkLCBSdHNSYXRlPSVkLCBCYXNpY1JhdGVCaXRtYXA9MHglMDRseClcbiIsCi0JCQkgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZV0sIFJhdGVJZFRvTWJwc1twQWQtPkNvbW1vbkNmZy5SdHNSYXRlXSwgQmFzaWNSYXRlQml0bWFwKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVVwZGF0ZVR4UmF0ZXMgKE1sbWVUcmFuc21pdD0weCV4LCBNaW5IVFBoeU1vZGU9JXgsIE1heEhUUGh5TW9kZT0weCV4LCBIVFBoeU1vZGU9MHgleClcbiIsCi0JCQkgcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LndvcmQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWluSFRQaHlNb2RlLndvcmQgLHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWF4SFRQaHlNb2RlLndvcmQgLHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQgKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoTWF4RGVzaXJlPSVkLCBNYXhTdXBwb3J0PSVkLCBNYXhUeFJhdGU9JWQsIE1pblJhdGU9JWQsIFJhdGUgU3dpdGNoaW5nID0lZClcbiIsCisJCSAgUmF0ZUlkVG9NYnBzW01heERlc2lyZV0sIFJhdGVJZFRvTWJwc1tNYXhTdXBwb3J0XSwKKwkJICBSYXRlSWRUb01icHNbcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlXSwKKwkJICBSYXRlSWRUb01icHNbcEFkLT5Db21tb25DZmcuTWluVHhSYXRlXSwKKwkJICAvKk9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkgKi8KKwkJICAqYXV0b19yYXRlX2N1cl9wKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoVHhSYXRlPSVkLCBSdHNSYXRlPSVkLCBCYXNpY1JhdGVCaXRtYXA9MHglMDRseClcbiIsCisJCSAgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZV0sCisJCSAgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGVdLCBCYXNpY1JhdGVCaXRtYXApKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiTWxtZVVwZGF0ZVR4UmF0ZXMgKE1sbWVUcmFuc21pdD0weCV4LCBNaW5IVFBoeU1vZGU9JXgsIE1heEhUUGh5TW9kZT0weCV4LCBIVFBoeU1vZGU9MHgleClcbiIsCisJCSAgcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LndvcmQsCisJCSAgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NaW5IVFBoeU1vZGUud29yZCwKKwkJICBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1heEhUUGh5TW9kZS53b3JkLAorCQkgIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQpKTsKIH0KIAogLyoKQEAgLTMxOTgsMTY4ICszMjg2LDE5NiBAQAogCQlUaGlzIGZ1bmN0aW9uIHVwZGF0ZSBIVCBSYXRlIHNldHRpbmcuCiAJCUlucHV0IFdjaWQgdmFsdWUgaXMgdmFsaWQgZm9yIDIgY2FzZSA6CiAJCTEuIGl0J3MgdXNlZCBmb3IgU3RhdGlvbiBpbiBpbmZyYSBtb2RlIHRoYXQgY29weSBBUCByYXRlIHRvIE1hY3RhYmxlLgotCQkyLiBPUiBTdGF0aW9uIAlpbiBhZGhvYyBtb2RlIHRvIGNvcHkgcGVlcidzIEhUIHJhdGUgdG8gTWFjdGFibGUuCisJCTIuIE9SIFN0YXRpb24JaW4gYWRob2MgbW9kZSB0byBjb3B5IHBlZXIncyBIVCByYXRlIHRvIE1hY3RhYmxlLgogCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIE1sbWVVcGRhdGVIdFR4UmF0ZXMoCi0JSU4gUFJUTVBfQURBUFRFUiAJCXBBZCwKLQlJTglVQ0hBUgkJCQlhcGlkeCkKK3ZvaWQgTWxtZVVwZGF0ZUh0VHhSYXRlcyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IGFwaWR4KQogewotCVVDSEFSCVN0YmNNY3M7IC8vaiwgU3RiY01jcywgYml0bWFzazsKLQlDSEFSIAlpOyAvLyAzKjMKLQlSVF9IVF9DQVBBQklMSVRZIAkqcFJ0SHRDYXAgPSBOVUxMOwotCVJUX0hUX1BIWV9JTkZPCQkqcEFjdGl2ZUh0UGh5ID0gTlVMTDsKLQlVTE9ORwkJQmFzaWNNQ1M7Ci0JVUNIQVIgaiwgYml0bWFzazsKLQlQUlRfSFRfUEhZX0lORk8JCQlwRGVzaXJlSHRQaHkgPSBOVUxMOwotCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBIdFBoeSA9IE5VTEw7Ci0JUEhUVFJBTlNNSVRfU0VUVElORwkJcE1heEh0UGh5ID0gTlVMTDsKLQlQSFRUUkFOU01JVF9TRVRUSU5HCQlwTWluSHRQaHkgPSBOVUxMOwotCUJPT0xFQU4gCQkJCSphdXRvX3JhdGVfY3VyX3A7CisJdTggU3RiY01jczsJCS8qaiwgU3RiY01jcywgYml0bWFzazsgKi8KKwljaGFyIGk7CQkJLyogMyozICovCisJc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHkgKnBSdEh0Q2FwID0gTlVMTDsKKwlzdHJ1Y3QgcnRfaHRfcGh5X2luZm8gKnBBY3RpdmVIdFBoeSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBCYXNpY01DUzsKKwl1OCBqLCBiaXRtYXNrOworCXN0cnVjdCBydF9odF9waHlfaW5mbyAqcERlc2lyZUh0UGh5ID0gTlVMTDsKKwlQSFRUUkFOU01JVF9TRVRUSU5HIHBIdFBoeSA9IE5VTEw7CisJUEhUVFJBTlNNSVRfU0VUVElORyBwTWF4SHRQaHkgPSBOVUxMOworCVBIVFRSQU5TTUlUX1NFVFRJTkcgcE1pbkh0UGh5ID0gTlVMTDsKKwlCT09MRUFOICphdXRvX3JhdGVfY3VyX3A7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1sbWVVcGRhdGVIdFR4UmF0ZXM9PT0+IFxuIikpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVVcGRhdGVIdFR4UmF0ZXM9PT0+IFxuIikpOwogCiAJYXV0b19yYXRlX2N1cl9wID0gTlVMTDsKIAogCXsKLQkJcERlc2lyZUh0UGh5CT0gJnBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm87Ci0JCXBBY3RpdmVIdFBoeQk9ICZwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvOwotCQlwSHRQaHkgCQk9ICZwQWQtPlN0YUNmZy5IVFBoeU1vZGU7Ci0JCXBNYXhIdFBoeQk9ICZwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGU7Ci0JCXBNaW5IdFBoeQk9ICZwQWQtPlN0YUNmZy5NaW5IVFBoeU1vZGU7CisJCXBEZXNpcmVIdFBoeSA9ICZwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvOworCQlwQWN0aXZlSHRQaHkgPSAmcEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mbzsKKwkJcEh0UGh5ID0gJnBBZC0+U3RhQ2ZnLkhUUGh5TW9kZTsKKwkJcE1heEh0UGh5ID0gJnBBZC0+U3RhQ2ZnLk1heEhUUGh5TW9kZTsKKwkJcE1pbkh0UGh5ID0gJnBBZC0+U3RhQ2ZnLk1pbkhUUGh5TW9kZTsKIAogCQlhdXRvX3JhdGVfY3VyX3AgPSAmcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2g7CiAJfQogCi0JaWYgKChBREhPQ19PTihwQWQpIHx8IElORlJBX09OKHBBZCkpICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkKLQl7CisJaWYgKChBREhPQ19PTihwQWQpIHx8IElORlJBX09OKHBBZCkpICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkgewogCQlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpCiAJCQlyZXR1cm47CiAKIAkJcFJ0SHRDYXAgPSAmcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHk7CiAJCXBBY3RpdmVIdFBoeSA9ICZwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvOwotCQlTdGJjTWNzID0gKFVDSEFSKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMy5TdGJjTWNzOwotCQlCYXNpY01DUyA9cEFkLT5NbG1lQXV4LkFkZEh0SW5mby5NQ1NTZXRbMF0rKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uTUNTU2V0WzFdPDw4KSsoU3RiY01jczw8MTYpOwotCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpICYmIChwUnRIdENhcC0+UnhTVEJDKSAmJiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkKKwkJU3RiY01jcyA9ICh1OClwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzMuU3RiY01jczsKKwkJQmFzaWNNQ1MgPQorCQkgICAgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5NQ1NTZXRbMF0gKworCQkgICAgKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uTUNTU2V0WzFdIDw8IDgpICsgKFN0YmNNY3MgPDwgMTYpOworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpICYmIChwUnRIdENhcC0+UnhTVEJDKQorCQkgICAgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCiAJCQlwTWF4SHRQaHktPmZpZWxkLlNUQkMgPSBTVEJDX1VTRTsKIAkJZWxzZQogCQkJcE1heEh0UGh5LT5maWVsZC5TVEJDID0gU1RCQ19OT05FOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCWlmIChwRGVzaXJlSHRQaHktPmJIdEVuYWJsZSA9PSBGQUxTRSkKIAkJCXJldHVybjsKIAogCQlwUnRIdENhcCA9ICZwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHk7Ci0JCVN0YmNNY3MgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzMuU3RiY01jczsKLQkJQmFzaWNNQ1MgPSBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uTUNTU2V0WzBdKyhwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uTUNTU2V0WzFdPDw4KSsoU3RiY01jczw8MTYpOwotCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpICYmIChwUnRIdENhcC0+UnhTVEJDKSAmJiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkKKwkJU3RiY01jcyA9ICh1OClwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMy5TdGJjTWNzOworCQlCYXNpY01DUyA9CisJCSAgICBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uTUNTU2V0WzBdICsKKwkJICAgIChwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uTUNTU2V0WzFdIDw8IDgpICsgKFN0YmNNY3MgPDwgMTYpOworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpICYmIChwUnRIdENhcC0+UnhTVEJDKQorCQkgICAgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCiAJCQlwTWF4SHRQaHktPmZpZWxkLlNUQkMgPSBTVEJDX1VTRTsKIAkJZWxzZQogCQkJcE1heEh0UGh5LT5maWVsZC5TVEJDID0gU1RCQ19OT05FOwogCX0KIAotCS8vIERlY2lkZSBNQVggaHQgcmF0ZS4KKwkvKiBEZWNpZGUgTUFYIGh0IHJhdGUuICovCiAJaWYgKChwUnRIdENhcC0+R0YpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YpKQogCQlwTWF4SHRQaHktPmZpZWxkLk1PREUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKIAllbHNlCiAJCXBNYXhIdFBoeS0+ZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7CiAKLSAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgpICYmIChwUnRIdENhcC0+Q2hhbm5lbFdpZHRoKSkKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgpCisJICAgICYmIChwUnRIdENhcC0+Q2hhbm5lbFdpZHRoKSkKIAkJcE1heEh0UGh5LT5maWVsZC5CVyA9IEJXXzQwOwogCWVsc2UKIAkJcE1heEh0UGh5LT5maWVsZC5CVyA9IEJXXzIwOwogCi0gICAgaWYgKHBNYXhIdFBoeS0+ZmllbGQuQlcgPT0gQldfMjApCi0JCXBNYXhIdFBoeS0+ZmllbGQuU2hvcnRHSSA9IChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwICYgcFJ0SHRDYXAtPlNob3J0R0lmb3IyMCk7CisJaWYgKHBNYXhIdFBoeS0+ZmllbGQuQlcgPT0gQldfMjApCisJCXBNYXhIdFBoeS0+ZmllbGQuU2hvcnRHSSA9CisJCSAgICAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCAmIHBSdEh0Q2FwLT4KKwkJICAgICBTaG9ydEdJZm9yMjApOwogCWVsc2UKLQkJcE1heEh0UGh5LT5maWVsZC5TaG9ydEdJID0gKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDAgJiBwUnRIdENhcC0+U2hvcnRHSWZvcjQwKTsKKwkJcE1heEh0UGh5LT5maWVsZC5TaG9ydEdJID0KKwkJICAgIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwICYgcFJ0SHRDYXAtPgorCQkgICAgIFNob3J0R0lmb3I0MCk7CiAKLQlmb3IgKGk9MjM7IGk+PTA7IGktLSkgLy8gMyozCisJaWYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0WzRdICE9IDApIHsKKwkJcE1heEh0UGh5LT5maWVsZC5NQ1MgPSAzMjsKKwl9CisKKwlmb3IgKGkgPSAyMzsgaSA+PSAwOyBpLS0pCS8qIDMqMyAqLwogCXsKLQkJaiA9IGkvODsKLQkJYml0bWFzayA9ICgxPDwoaS0oaio4KSkpOworCQlqID0gaSAvIDg7CisJCWJpdG1hc2sgPSAoMSA8PCAoaSAtIChqICogOCkpKTsKIAotCQlpZiAoKHBBY3RpdmVIdFBoeS0+TUNTU2V0W2pdICYgYml0bWFzaykgJiYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0W2pdICYgYml0bWFzaykpCi0JCXsKKwkJaWYgKChwQWN0aXZlSHRQaHktPk1DU1NldFtqXSAmIGJpdG1hc2spCisJCSAgICAmJiAocERlc2lyZUh0UGh5LT5NQ1NTZXRbal0gJiBiaXRtYXNrKSkgewogCQkJcE1heEh0UGh5LT5maWVsZC5NQ1MgPSBpOwogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoaT09MCkKKwkJaWYgKGkgPT0gMCkKIAkJCWJyZWFrOwogCX0KIAotCS8vIENvcHkgTUlOIGh0IHJhdGUuICBydDI4NjA/Pz8KKwkvKiBDb3B5IE1JTiBodCByYXRlLiAgcnQyODYwPz8/ICovCiAJcE1pbkh0UGh5LT5maWVsZC5CVyA9IEJXXzIwOwogCXBNaW5IdFBoeS0+ZmllbGQuTUNTID0gMDsKIAlwTWluSHRQaHktPmZpZWxkLlNUQkMgPSAwOwogCXBNaW5IdFBoeS0+ZmllbGQuU2hvcnRHSSA9IDA7Ci0JLy9JZiBTVEEgYXNzaWducyBmaXhlZCByYXRlLiB1cGRhdGUgdG8gZml4ZWQgaGVyZS4KLQlpZiAoIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiAocERlc2lyZUh0UGh5LT5NQ1NTZXRbMF0gIT0gMHhmZikpCi0JewotCQlpZiAocERlc2lyZUh0UGh5LT5NQ1NTZXRbNF0gIT0gMCkKLQkJeworCS8qSWYgU1RBIGFzc2lnbnMgZml4ZWQgcmF0ZS4gdXBkYXRlIHRvIGZpeGVkIGhlcmUuICovCisJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiAocERlc2lyZUh0UGh5LT5NQ1NTZXRbMF0gIT0gMHhmZikpIHsKKwkJaWYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0WzRdICE9IDApIHsKIAkJCXBNYXhIdFBoeS0+ZmllbGQuTUNTID0gMzI7CiAJCQlwTWluSHRQaHktPmZpZWxkLk1DUyA9IDMyOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJNbG1lVXBkYXRlSHRUeFJhdGVzPD09PSBVc2UgRml4ZWQgTUNTID0gJWRcbiIscE1pbkh0UGh5LT5maWVsZC5NQ1MpKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIk1sbWVVcGRhdGVIdFR4UmF0ZXM8PT09IFVzZSBGaXhlZCBNQ1MgPSAlZFxuIiwKKwkJCQkgIHBNaW5IdFBoeS0+ZmllbGQuTUNTKSk7CiAJCX0KIAotCQlmb3IgKGk9MjM7IChDSEFSKWkgPj0gMDsgaS0tKSAvLyAzKjMKKwkJZm9yIChpID0gMjM7IChjaGFyKWkgPj0gMDsgaS0tKQkvKiAzKjMgKi8KIAkJewotCQkJaiA9IGkvODsKLQkJCWJpdG1hc2sgPSAoMTw8KGktKGoqOCkpKTsKLQkJCWlmICggKHBEZXNpcmVIdFBoeS0+TUNTU2V0W2pdICYgYml0bWFzaykgJiYgKHBBY3RpdmVIdFBoeS0+TUNTU2V0W2pdICYgYml0bWFzaykpCi0JCQl7CisJCQlqID0gaSAvIDg7CisJCQliaXRtYXNrID0gKDEgPDwgKGkgLSAoaiAqIDgpKSk7CisJCQlpZiAoKHBEZXNpcmVIdFBoeS0+TUNTU2V0W2pdICYgYml0bWFzaykKKwkJCSAgICAmJiAocEFjdGl2ZUh0UGh5LT5NQ1NTZXRbal0gJiBiaXRtYXNrKSkgewogCQkJCXBNYXhIdFBoeS0+ZmllbGQuTUNTID0gaTsKIAkJCQlwTWluSHRQaHktPmZpZWxkLk1DUyA9IGk7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQlpZiAoaT09MCkKKwkJCWlmIChpID09IDApCiAJCQkJYnJlYWs7CiAJCX0KIAl9CiAKLQkvLyBEZWNpZGUgaHQgcmF0ZQorCS8qIERlY2lkZSBodCByYXRlICovCiAJcEh0UGh5LT5maWVsZC5TVEJDID0gcE1heEh0UGh5LT5maWVsZC5TVEJDOwogCXBIdFBoeS0+ZmllbGQuQlcgPSBwTWF4SHRQaHktPmZpZWxkLkJXOwogCXBIdFBoeS0+ZmllbGQuTU9ERSA9IHBNYXhIdFBoeS0+ZmllbGQuTU9ERTsKIAlwSHRQaHktPmZpZWxkLk1DUyA9IHBNYXhIdFBoeS0+ZmllbGQuTUNTOwogCXBIdFBoeS0+ZmllbGQuU2hvcnRHSSA9IHBNYXhIdFBoeS0+ZmllbGQuU2hvcnRHSTsKIAotCS8vIHVzZSBkZWZhdWx0IG5vdy4gcnQyODYwCisJLyogdXNlIGRlZmF1bHQgbm93LiBydDI4NjAgKi8KIAlpZiAocERlc2lyZUh0UGh5LT5NQ1NTZXRbMF0gIT0gMHhmZikKIAkJKmF1dG9fcmF0ZV9jdXJfcCA9IEZBTFNFOwogCWVsc2UKIAkJKmF1dG9fcmF0ZV9jdXJfcCA9IFRSVUU7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTWxtZVVwZGF0ZUh0VHhSYXRlczwtLS0uQU1zZHVTaXplID0gJWQgIFxuIiwgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZSApKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlRYOiBNQ1NbMF0gPSAleCAoY2hvb3NlICVkKSwgQlcgPSAlZCwgU2hvcnRHSSA9ICVkLCBNT0RFID0gJWQsICBcbiIsIHBBY3RpdmVIdFBoeS0+TUNTU2V0WzBdLHBIdFBoeS0+ZmllbGQuTUNTLAotCQlwSHRQaHktPmZpZWxkLkJXLCBwSHRQaHktPmZpZWxkLlNob3J0R0ksIHBIdFBoeS0+ZmllbGQuTU9ERSkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiTWxtZVVwZGF0ZUh0VHhSYXRlczw9PT0gXG4iKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIiBNbG1lVXBkYXRlSHRUeFJhdGVzPC0tLS5BTXNkdVNpemUgPSAlZCAgXG4iLAorCQkgIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiVFg6IE1DU1swXSA9ICV4IChjaG9vc2UgJWQpLCBCVyA9ICVkLCBTaG9ydEdJID0gJWQsIE1PREUgPSAlZCwgIFxuIiwKKwkJICBwQWN0aXZlSHRQaHktPk1DU1NldFswXSwgcEh0UGh5LT5maWVsZC5NQ1MsIHBIdFBoeS0+ZmllbGQuQlcsCisJCSAgcEh0UGh5LT5maWVsZC5TaG9ydEdJLCBwSHRQaHktPmZpZWxkLk1PREUpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lVXBkYXRlSHRUeFJhdGVzPD09PSBcbiIpKTsKIH0KIAotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIE1sbWVSYWRpb09mZigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3ZvaWQgQkFUYWJsZUluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfYmFfdGFibGUgKlRhYikKIHsKLQlSVDI4WFhfTUxNRV9SQURJT19PRkYocEFkKTsKKwlpbnQgaTsKKworCVRhYi0+bnVtQXNPcmlnaW5hdG9yID0gMDsKKwlUYWItPm51bUFzUmVjaXBpZW50ID0gMDsKKwlUYWItPm51bURvbmVPcmlnaW5hdG9yID0gMDsKKwlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRTsgaSsrKSB7CisJCVRhYi0+QkFSZWNFbnRyeVtpXS5SRUNfQkFfU3RhdHVzID0gUmVjaXBpZW50X05PTkU7CisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCYoVGFiLT5CQVJlY0VudHJ5W2ldLlJ4UmVSaW5nTG9jaykpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9CQV9PUklfVEFCTEU7IGkrKykgeworCQlUYWItPkJBT3JpRW50cnlbaV0uT1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfTk9ORTsKKwl9CiB9CiAKLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRCBNbG1lUmFkaW9PbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKKy8qIElSUUwgPSBESVNQQVRDSF9MRVZFTCAqLwordm9pZCBNbG1lUmFkaW9PZmYoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCVJUMjhYWF9NTE1FX1JBRElPX09OKHBBZCk7CisJUlRNUF9NTE1FX1JBRElPX09GRihwQWQpOwogfQogCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBic3NfdGFibGUuYwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLyogSVJRTCA9IERJU1BBVENIX0xFVkVMICovCit2b2lkIE1sbWVSYWRpb09uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlSVE1QX01MTUVfUkFESU9fT04ocEFkKTsKK30KIAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogYnNzX3RhYmxlLmMgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAogLyohIFxicmllZiBpbml0aWFsaXplIEJTUyB0YWJsZQogICoJXHBhcmFtIHBfdGFiIHBvaW50ZXIgdG8gdGhlIHRhYmxlCkBAIC0zMzcxLDM3ICszNDg3LDE1IEBACiAgSVJRTCA9IERJU1BBVENIX0xFVkVMCiAKICAqLwotVk9JRCBCc3NUYWJsZUluaXQoCi0JSU4gQlNTX1RBQkxFICpUYWIpCit2b2lkIEJzc1RhYmxlSW5pdChzdHJ1Y3QgcnRfYnNzX3RhYmxlICpUYWIpCiB7CiAJaW50IGk7CiAKIAlUYWItPkJzc05yID0gMDsKLSAgICBUYWItPkJzc092ZXJsYXBOciA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfQlNTX1RBQkxFOyBpKyspCi0JewotCQlOZGlzWmVyb01lbW9yeSgmVGFiLT5Cc3NFbnRyeVtpXSwgc2l6ZW9mKEJTU19FTlRSWSkpOwotCQlUYWItPkJzc0VudHJ5W2ldLlJzc2kgPSAtMTI3OwkvLyBpbml0aWFsIHRoZSByc3NpIGFzIGEgbWluaW11bSB2YWx1ZQotCX0KLX0KLQotVk9JRCBCQVRhYmxlSW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBCQV9UQUJMRSAqVGFiKQotewotCWludCBpOwotCi0JVGFiLT5udW1Bc09yaWdpbmF0b3IgPSAwOwotCVRhYi0+bnVtQXNSZWNpcGllbnQgPSAwOwotCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFOyBpKyspCi0JewotCQlUYWItPkJBUmVjRW50cnlbaV0uUkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9OT05FOwotCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmKFRhYi0+QkFSZWNFbnRyeVtpXS5SeFJlUmluZ0xvY2spKTsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFOyBpKyspCi0JewotCQlUYWItPkJBT3JpRW50cnlbaV0uT1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfTk9ORTsKKwlUYWItPkJzc092ZXJsYXBOciA9IDA7CisJZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfQlNTX1RBQkxFOyBpKyspIHsKKwkJTmRpc1plcm9NZW1vcnkoJlRhYi0+QnNzRW50cnlbaV0sIHNpemVvZihzdHJ1Y3QgcnRfYnNzX2VudHJ5KSk7CisJCVRhYi0+QnNzRW50cnlbaV0uUnNzaSA9IC0xMjc7CS8qIGluaXRpYWwgdGhlIHJzc2kgYXMgYSBtaW5pbXVtIHZhbHVlICovCiAJfQogfQogCkBAIC0zNDE2LDk3ICszNTEwLDEwMiBAQAogIElSUUwgPSBESVNQQVRDSF9MRVZFTAogCiAgKi8KLVVMT05HIEJzc1RhYmxlU2VhcmNoKAotCUlOIEJTU19UQUJMRSAqVGFiLAotCUlOIFBVQ0hBUgkgcEJzc2lkLAotCUlOIFVDSEFSCSBDaGFubmVsKQordW5zaWduZWQgbG9uZyBCc3NUYWJsZVNlYXJjaChzdHJ1Y3QgcnRfYnNzX3RhYmxlICpUYWIsIHU4ICpwQnNzaWQsIHU4IENoYW5uZWwpCiB7Ci0JVUNIQVIgaTsKKwl1OCBpOwogCi0JZm9yIChpID0gMDsgaSA8IFRhYi0+QnNzTnI7IGkrKykKLQl7Ci0JCS8vCi0JCS8vIFNvbWUgQVAgdGhhdCBzdXBwb3J0IEEvQi9HIG1vZGUgdGhhdCBtYXkgdXNlZCB0aGUgc2FtZSBCU1NJRCBvbiAxMUEgYW5kIDExQi9HLgotCQkvLyBXZSBzaG91bGQgZGlzdGluZ3Vpc2ggdGhpcyBjYXNlLgotCQkvLworCWZvciAoaSA9IDA7IGkgPCBUYWItPkJzc05yOyBpKyspIHsKKwkJLyogKi8KKwkJLyogU29tZSBBUCB0aGF0IHN1cHBvcnQgQS9CL0cgbW9kZSB0aGF0IG1heSB1c2VkIHRoZSBzYW1lIEJTU0lEIG9uIDExQSBhbmQgMTFCL0cuICovCisJCS8qIFdlIHNob3VsZCBkaXN0aW5ndWlzaCB0aGlzIGNhc2UuICovCisJCS8qICovCiAJCWlmICgoKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPD0gMTQpICYmIChDaGFubmVsIDw9IDE0KSkgfHwKLQkJCSAoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA+IDE0KSAmJiAoQ2hhbm5lbCA+IDE0KSkpICYmCi0JCQlNQUNfQUREUl9FUVVBTChUYWItPkJzc0VudHJ5W2ldLkJzc2lkLCBwQnNzaWQpKQotCQl7CisJCSAgICAgKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPiAxNCkgJiYgKENoYW5uZWwgPiAxNCkpKSAmJgorCQkgICAgTUFDX0FERFJfRVFVQUwoVGFiLT5Cc3NFbnRyeVtpXS5Cc3NpZCwgcEJzc2lkKSkgewogCQkJcmV0dXJuIGk7CiAJCX0KIAl9Ci0JcmV0dXJuIChVTE9ORylCU1NfTk9UX0ZPVU5EOworCXJldHVybiAodW5zaWduZWQgbG9uZylCU1NfTk9UX0ZPVU5EOwogfQogCi1VTE9ORyBCc3NTc2lkVGFibGVTZWFyY2goCi0JSU4gQlNTX1RBQkxFICpUYWIsCi0JSU4gUFVDSEFSCSBwQnNzaWQsCi0JSU4gUFVDSEFSCSBwU3NpZCwKLQlJTiBVQ0hBUgkgU3NpZExlbiwKLQlJTiBVQ0hBUgkgQ2hhbm5lbCkKK3Vuc2lnbmVkIGxvbmcgQnNzU3NpZFRhYmxlU2VhcmNoKHN0cnVjdCBydF9ic3NfdGFibGUgKlRhYiwKKwkJCSB1OCAqcEJzc2lkLAorCQkJIHU4ICpwU3NpZCwgdTggU3NpZExlbiwgdTggQ2hhbm5lbCkKIHsKLQlVQ0hBUiBpOworCXU4IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgVGFiLT5Cc3NOcjsgaSsrKQotCXsKLQkJLy8KLQkJLy8gU29tZSBBUCB0aGF0IHN1cHBvcnQgQS9CL0cgbW9kZSB0aGF0IG1heSB1c2VkIHRoZSBzYW1lIEJTU0lEIG9uIDExQSBhbmQgMTFCL0cuCi0JCS8vIFdlIHNob3VsZCBkaXN0aW5ndWlzaCB0aGlzIGNhc2UuCi0JCS8vCisJZm9yIChpID0gMDsgaSA8IFRhYi0+QnNzTnI7IGkrKykgeworCQkvKiAqLworCQkvKiBTb21lIEFQIHRoYXQgc3VwcG9ydCBBL0IvRyBtb2RlIHRoYXQgbWF5IHVzZWQgdGhlIHNhbWUgQlNTSUQgb24gMTFBIGFuZCAxMUIvRy4gKi8KKwkJLyogV2Ugc2hvdWxkIGRpc3Rpbmd1aXNoIHRoaXMgY2FzZS4gKi8KKwkJLyogKi8KIAkJaWYgKCgoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA8PSAxNCkgJiYgKENoYW5uZWwgPD0gMTQpKSB8fAotCQkJICgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsID4gMTQpICYmIChDaGFubmVsID4gMTQpKSkgJiYKLQkJCU1BQ19BRERSX0VRVUFMKFRhYi0+QnNzRW50cnlbaV0uQnNzaWQsIHBCc3NpZCkgJiYKLQkJCVNTSURfRVFVQUwocFNzaWQsIFNzaWRMZW4sIFRhYi0+QnNzRW50cnlbaV0uU3NpZCwgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkTGVuKSkKLQkJeworCQkgICAgICgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsID4gMTQpICYmIChDaGFubmVsID4gMTQpKSkgJiYKKwkJICAgIE1BQ19BRERSX0VRVUFMKFRhYi0+QnNzRW50cnlbaV0uQnNzaWQsIHBCc3NpZCkgJiYKKwkJICAgIFNTSURfRVFVQUwocFNzaWQsIFNzaWRMZW4sIFRhYi0+QnNzRW50cnlbaV0uU3NpZCwKKwkJCSAgICAgICBUYWItPkJzc0VudHJ5W2ldLlNzaWRMZW4pKSB7CiAJCQlyZXR1cm4gaTsKIAkJfQogCX0KLQlyZXR1cm4gKFVMT05HKUJTU19OT1RfRk9VTkQ7CisJcmV0dXJuICh1bnNpZ25lZCBsb25nKUJTU19OT1RfRk9VTkQ7CiB9CiAKLVVMT05HIEJzc1RhYmxlU2VhcmNoV2l0aFNTSUQoCi0JSU4gQlNTX1RBQkxFICpUYWIsCi0JSU4gUFVDSEFSCSBCc3NpZCwKLQlJTiBQVUNIQVIJIHBTc2lkLAotCUlOIFVDSEFSCSBTc2lkTGVuLAotCUlOIFVDSEFSCSBDaGFubmVsKQordW5zaWduZWQgbG9uZyBCc3NUYWJsZVNlYXJjaFdpdGhTU0lEKHN0cnVjdCBydF9ic3NfdGFibGUgKlRhYiwKKwkJCSAgICAgdTggKkJzc2lkLAorCQkJICAgICB1OCAqcFNzaWQsCisJCQkgICAgIHU4IFNzaWRMZW4sIHU4IENoYW5uZWwpCiB7Ci0JVUNIQVIgaTsKKwl1OCBpOwogCi0JZm9yIChpID0gMDsgaSA8IFRhYi0+QnNzTnI7IGkrKykKLQl7CisJZm9yIChpID0gMDsgaSA8IFRhYi0+QnNzTnI7IGkrKykgewogCQlpZiAoKCgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsIDw9IDE0KSAmJiAoQ2hhbm5lbCA8PSAxNCkpIHx8Ci0JCQkoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA+IDE0KSAmJiAoQ2hhbm5lbCA+IDE0KSkpICYmCi0JCQlNQUNfQUREUl9FUVVBTCgmKFRhYi0+QnNzRW50cnlbaV0uQnNzaWQpLCBCc3NpZCkgJiYKLQkJCShTU0lEX0VRVUFMKHBTc2lkLCBTc2lkTGVuLCBUYWItPkJzc0VudHJ5W2ldLlNzaWQsIFRhYi0+QnNzRW50cnlbaV0uU3NpZExlbikgfHwKLQkJCShOZGlzRXF1YWxNZW1vcnkocFNzaWQsIFplcm9Tc2lkLCBTc2lkTGVuKSkgfHwKLQkJCShOZGlzRXF1YWxNZW1vcnkoVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkLCBaZXJvU3NpZCwgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkTGVuKSkpKQotCQl7CisJCSAgICAgKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPiAxNCkgJiYgKENoYW5uZWwgPiAxNCkpKSAmJgorCQkgICAgTUFDX0FERFJfRVFVQUwoJihUYWItPkJzc0VudHJ5W2ldLkJzc2lkKSwgQnNzaWQpICYmCisJCSAgICAoU1NJRF9FUVVBTAorCQkgICAgIChwU3NpZCwgU3NpZExlbiwgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkLAorCQkgICAgICBUYWItPkJzc0VudHJ5W2ldLlNzaWRMZW4pCisJCSAgICAgfHwgKE5kaXNFcXVhbE1lbW9yeShwU3NpZCwgWmVyb1NzaWQsIFNzaWRMZW4pKQorCQkgICAgIHx8CisJCSAgICAgKE5kaXNFcXVhbE1lbW9yeQorCQkgICAgICAoVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkLCBaZXJvU3NpZCwKKwkJICAgICAgIFRhYi0+QnNzRW50cnlbaV0uU3NpZExlbikpKSkgewogCQkJcmV0dXJuIGk7CiAJCX0KIAl9Ci0JcmV0dXJuIChVTE9ORylCU1NfTk9UX0ZPVU5EOworCXJldHVybiAodW5zaWduZWQgbG9uZylCU1NfTk9UX0ZPVU5EOwogfQogCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVZPSUQgQnNzVGFibGVEZWxldGVFbnRyeSgKLQlJTiBPVVQJQlNTX1RBQkxFICpUYWIsCi0JSU4JCVBVQ0hBUgkgIHBCc3NpZCwKLQlJTgkJVUNIQVIJICBDaGFubmVsKQordW5zaWduZWQgbG9uZyBCc3NTc2lkVGFibGVTZWFyY2hCeVNTSUQoc3RydWN0IHJ0X2Jzc190YWJsZSAqVGFiLAorCQkJICAgICAgIHU4ICpwU3NpZCwgdTggU3NpZExlbikKIHsKLQlVQ0hBUiBpLCBqOworCXU4IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgVGFiLT5Cc3NOcjsgaSsrKQotCXsKKwlmb3IgKGkgPSAwOyBpIDwgVGFiLT5Cc3NOcjsgaSsrKSB7CisJCWlmIChTU0lEX0VRVUFMCisJCSAgICAocFNzaWQsIFNzaWRMZW4sIFRhYi0+QnNzRW50cnlbaV0uU3NpZCwKKwkJICAgICBUYWItPkJzc0VudHJ5W2ldLlNzaWRMZW4pKSB7CisJCQlyZXR1cm4gaTsKKwkJfQorCX0KKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpQlNTX05PVF9GT1VORDsKK30KKworLyogSVJRTCA9IERJU1BBVENIX0xFVkVMICovCit2b2lkIEJzc1RhYmxlRGVsZXRlRW50cnkoc3RydWN0IHJ0X2Jzc190YWJsZSAqVGFiLAorCQkJIHU4ICpwQnNzaWQsIHU4IENoYW5uZWwpCit7CisJdTggaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCBUYWItPkJzc05yOyBpKyspIHsKIAkJaWYgKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPT0gQ2hhbm5lbCkgJiYKLQkJCShNQUNfQUREUl9FUVVBTChUYWItPkJzc0VudHJ5W2ldLkJzc2lkLCBwQnNzaWQpKSkKLQkJewotCQkJZm9yIChqID0gaTsgaiA8IFRhYi0+QnNzTnIgLSAxOyBqKyspCi0JCQl7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJihUYWItPkJzc0VudHJ5W2pdKSwgJihUYWItPkJzc0VudHJ5W2ogKyAxXSksIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJICAgIChNQUNfQUREUl9FUVVBTChUYWItPkJzc0VudHJ5W2ldLkJzc2lkLCBwQnNzaWQpKSkgeworCQkJZm9yIChqID0gaTsgaiA8IFRhYi0+QnNzTnIgLSAxOyBqKyspIHsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmKFRhYi0+QnNzRW50cnlbal0pLAorCQkJCQkgICAgICAgJihUYWItPkJzc0VudHJ5W2ogKyAxXSksCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2Jzc19lbnRyeSkpOwogCQkJfQotCQkJTmRpc1plcm9NZW1vcnkoJihUYWItPkJzc0VudHJ5W1RhYi0+QnNzTnIgLSAxXSksIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJCU5kaXNaZXJvTWVtb3J5KCYoVGFiLT5Cc3NFbnRyeVtUYWItPkJzc05yIC0gMV0pLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2Jzc19lbnRyeSkpOwogCQkJVGFiLT5Cc3NOciAtPSAxOwogCQkJcmV0dXJuOwogCQl9CkBAIC0zNTIyLDI1ICszNjIxLDI0IEBACiAJLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBCQVRhYmxlRGVsZXRlT1JJRW50cnkoCi0JSU4gT1VUCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCQlCQV9PUklfRU5UUlkJKnBCQU9SSUVudHJ5KQordm9pZCBCQVRhYmxlRGVsZXRlT1JJRW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgc3RydWN0IHJ0X2JhX29yaV9lbnRyeSAqcEJBT1JJRW50cnkpCiB7CiAKLQlpZiAocEJBT1JJRW50cnktPk9SSV9CQV9TdGF0dXMgIT0gT3JpZ2luYXRvcl9OT05FKQotCXsKKwlpZiAocEJBT1JJRW50cnktPk9SSV9CQV9TdGF0dXMgIT0gT3JpZ2luYXRvcl9OT05FKSB7CiAJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKLQkJaWYgKHBCQU9SSUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfRG9uZSkKLQkJeworCQlpZiAocEJBT1JJRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKSB7CiAJCQlwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yIC09IDE7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCQVRhYmxlRGVsZXRlT1JJRW50cnkgbnVtQXNPcmlnaW5hdG9yPSAlbGRcbiIsIHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCkpOwotCQkJLy8gRXJhc2UgQml0bWFwIGZsYWcuCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJCQVRhYmxlRGVsZXRlT1JJRW50cnkgbnVtQXNPcmlnaW5hdG9yPSAlbGRcbiIsCisJCQkJICBwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQpKTsKKwkJCS8qIEVyYXNlIEJpdG1hcCBmbGFnLiAqLwogCQl9Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBT1JJRW50cnktPldjaWRdLlRYQkFiaXRtYXAgJj0gKH4oMTw8KHBCQU9SSUVudHJ5LT5USUQpICkpOwkvLyBJZiBTVEEgbW9kZSwgIGVyYXNlIGZsYWcgaGVyZQotCQlwQWQtPk1hY1RhYi5Db250ZW50W3BCQU9SSUVudHJ5LT5XY2lkXS5CQU9yaVdjaWRBcnJheVtwQkFPUklFbnRyeS0+VElEXSA9IDA7CS8vIElmIFNUQSBtb2RlLCAgZXJhc2UgZmxhZyBoZXJlCisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBT1JJRW50cnktPldjaWRdLlRYQkFiaXRtYXAgJj0gKH4oMSA8PCAocEJBT1JJRW50cnktPlRJRCkpKTsJLyogSWYgU1RBIG1vZGUsICBlcmFzZSBmbGFnIGhlcmUgKi8KKwkJcEFkLT5NYWNUYWIuQ29udGVudFtwQkFPUklFbnRyeS0+V2NpZF0uQkFPcmlXY2lkQXJyYXlbcEJBT1JJRW50cnktPlRJRF0gPSAwOwkvKiBJZiBTVEEgbW9kZSwgIGVyYXNlIGZsYWcgaGVyZSAqLwogCQlwQkFPUklFbnRyeS0+T1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfTk9ORTsKIAkJcEJBT1JJRW50cnktPlRva2VuID0gMTsKLQkJLy8gTm90IGNsZWFyIFNlcXVlbmNlIGhlcmUuCisJCS8qIE5vdCBjbGVhciBTZXF1ZW5jZSBoZXJlLiAqLwogCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CiAJfQogfQpAQCAtMzU1NCwxOTAgKzM2NTIsMTY0IEBACiAgSVJRTCA9IERJU1BBVENIX0xFVkVMCiAKICAqLwotVk9JRCBCc3NFbnRyeVNldCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQgQlNTX0VOVFJZICpwQnNzLAotCUlOIFBVQ0hBUiBwQnNzaWQsCi0JSU4gQ0hBUiBTc2lkW10sCi0JSU4gVUNIQVIgU3NpZExlbiwKLQlJTiBVQ0hBUiBCc3NUeXBlLAotCUlOIFVTSE9SVCBCZWFjb25QZXJpb2QsCi0JSU4gUENGX1BBUk0gcENmUGFybSwKLQlJTiBVU0hPUlQgQXRpbVdpbiwKLQlJTiBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCi0JSU4gVUNIQVIgU3VwUmF0ZVtdLAotCUlOIFVDSEFSIFN1cFJhdGVMZW4sCi0JSU4gVUNIQVIgRXh0UmF0ZVtdLAotCUlOIFVDSEFSIEV4dFJhdGVMZW4sCi0JSU4gSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKLQlJTiBBRERfSFRfSU5GT19JRSAqcEFkZEh0SW5mbywJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCi0JSU4gVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sCi0JSU4gVUNIQVIJCQlBZGRIdEluZm9MZW4sCi0JSU4gVUNIQVIJCQlOZXdFeHRDaGFuT2Zmc2V0LAotCUlOIFVDSEFSIENoYW5uZWwsCi0JSU4gQ0hBUiBSc3NpLAotCUlOIExBUkdFX0lOVEVHRVIgVGltZVN0YW1wLAotCUlOIFVDSEFSIENraXBGbGFnLAotCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAotCUlOIFBRT1NfQ0FQQUJJTElUWV9QQVJNIHBRb3NDYXBhYmlsaXR5LAotCUlOIFBRQlNTX0xPQURfUEFSTSBwUWJzc0xvYWQsCi0JSU4gVVNIT1JUIExlbmd0aFZJRSwKLQlJTiBQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzIHBWSUUpCit2b2lkIEJzc0VudHJ5U2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X2Jzc19lbnRyeSAqcEJzcywgdTggKnBCc3NpZCwgY2hhciBTc2lkW10sIHU4IFNzaWRMZW4sIHU4IEJzc1R5cGUsIHUxNiBCZWFjb25QZXJpb2QsIHN0cnVjdCBydF9jZl9wYXJtICogcENmUGFybSwgdTE2IEF0aW1XaW4sIHUxNiBDYXBhYmlsaXR5SW5mbywgdTggU3VwUmF0ZVtdLCB1OCBTdXBSYXRlTGVuLCB1OCBFeHRSYXRlW10sIHU4IEV4dFJhdGVMZW4sIHN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llICogcEh0Q2FwYWJpbGl0eSwgc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llICogcEFkZEh0SW5mbywJLyogQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFICovCisJCSB1OCBIdENhcGFiaWxpdHlMZW4sCisJCSB1OCBBZGRIdEluZm9MZW4sCisJCSB1OCBOZXdFeHRDaGFuT2Zmc2V0LAorCQkgdTggQ2hhbm5lbCwKKwkJIGNoYXIgUnNzaSwKKwkJIElOIExBUkdFX0lOVEVHRVIgVGltZVN0YW1wLAorCQkgdTggQ2tpcEZsYWcsCisJCSBzdHJ1Y3QgcnRfZWRjYV9wYXJtICpwRWRjYVBhcm0sCisJCSBzdHJ1Y3QgcnRfcW9zX2NhcGFiaWxpdHlfcGFybSAqcFFvc0NhcGFiaWxpdHksCisJCSBzdHJ1Y3QgcnRfcWJzc19sb2FkX3Bhcm0gKnBRYnNzTG9hZCwKKwkJIHUxNiBMZW5ndGhWSUUsIHN0cnVjdCBydF9uZGlzXzgwMl8xMV92YXJpYWJsZV9pZXMgKnBWSUUpCiB7CiAJQ09QWV9NQUNfQUREUihwQnNzLT5Cc3NpZCwgcEJzc2lkKTsKLQkvLyBEZWZhdWx0IEhpZGRlbiBTU0lEIHRvIGJlIFRSVUUsIGl0IHdpbGwgYmUgdHVybmVkIHRvIEZBTFNFIGFmdGVyIGNvcGluZyBTU0lECisJLyogRGVmYXVsdCBIaWRkZW4gU1NJRCB0byBiZSBUUlVFLCBpdCB3aWxsIGJlIHR1cm5lZCB0byBGQUxTRSBhZnRlciBjb3BpbmcgU1NJRCAqLwogCXBCc3MtPkhpZGRlbiA9IDE7Ci0JaWYgKFNzaWRMZW4gPiAwKQotCXsKLQkJLy8gRm9yIGhpZGRlbiBTU0lEIEFQLCBpdCBtaWdodCBzZW5kIGJlYWNvbiB3aXRoIFNTSUQgbGVuIGVxdWFsIHRvIDAKLQkJLy8gT3Igc2VuZCBiZWFjb24gL3Byb2JlIHJlc3BvbnNlIHdpdGggU1NJRCBsZW4gbWF0Y2hpbmcgcmVhbCBTU0lEIGxlbmd0aCwKLQkJLy8gYnV0IFNTSUQgaXMgYWxsIHplcm8uIHN1Y2ggYXMgIjAwLTAwLTAwLTAwIiB3aXRoIGxlbmd0aCA0LgotCQkvLyBXZSBoYXZlIHRvIHByZXZlbnQgdGhpcyBjYXNlIG92ZXJ3cml0ZSBjb3JyZWN0IHRhYmxlCi0JCWlmIChOZGlzRXF1YWxNZW1vcnkoU3NpZCwgWmVyb1NzaWQsIFNzaWRMZW4pID09IDApCi0JCXsKLQkJICAgIE5kaXNaZXJvTWVtb3J5KHBCc3MtPlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisJaWYgKFNzaWRMZW4gPiAwKSB7CisJCS8qIEZvciBoaWRkZW4gU1NJRCBBUCwgaXQgbWlnaHQgc2VuZCBiZWFjb24gd2l0aCBTU0lEIGxlbiBlcXVhbCB0byAwICovCisJCS8qIE9yIHNlbmQgYmVhY29uIC9wcm9iZSByZXNwb25zZSB3aXRoIFNTSUQgbGVuIG1hdGNoaW5nIHJlYWwgU1NJRCBsZW5ndGgsICovCisJCS8qIGJ1dCBTU0lEIGlzIGFsbCB6ZXJvLiBzdWNoIGFzICIwMC0wMC0wMC0wMCIgd2l0aCBsZW5ndGggNC4gKi8KKwkJLyogV2UgaGF2ZSB0byBwcmV2ZW50IHRoaXMgY2FzZSBvdmVyd3JpdGUgY29ycmVjdCB0YWJsZSAqLworCQlpZiAoTmRpc0VxdWFsTWVtb3J5KFNzaWQsIFplcm9Tc2lkLCBTc2lkTGVuKSA9PSAwKSB7CisJCQlOZGlzWmVyb01lbW9yeShwQnNzLT5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOwogCQkJTmRpc01vdmVNZW1vcnkocEJzcy0+U3NpZCwgU3NpZCwgU3NpZExlbik7CiAJCQlwQnNzLT5Tc2lkTGVuID0gU3NpZExlbjsKIAkJCXBCc3MtPkhpZGRlbiA9IDA7CiAJCX0KLQl9Ci0JZWxzZQorCX0gZWxzZQogCQlwQnNzLT5Tc2lkTGVuID0gMDsKIAlwQnNzLT5Cc3NUeXBlID0gQnNzVHlwZTsKIAlwQnNzLT5CZWFjb25QZXJpb2QgPSBCZWFjb25QZXJpb2Q7Ci0JaWYgKEJzc1R5cGUgPT0gQlNTX0lORlJBKQotCXsKLQkJaWYgKHBDZlBhcm0tPmJWYWxpZCkKLQkJeworCWlmIChCc3NUeXBlID09IEJTU19JTkZSQSkgeworCQlpZiAocENmUGFybS0+YlZhbGlkKSB7CiAJCQlwQnNzLT5DZnBDb3VudCA9IHBDZlBhcm0tPkNmcENvdW50OwogCQkJcEJzcy0+Q2ZwUGVyaW9kID0gcENmUGFybS0+Q2ZwUGVyaW9kOwogCQkJcEJzcy0+Q2ZwTWF4RHVyYXRpb24gPSBwQ2ZQYXJtLT5DZnBNYXhEdXJhdGlvbjsKIAkJCXBCc3MtPkNmcER1clJlbWFpbmluZyA9IHBDZlBhcm0tPkNmcER1clJlbWFpbmluZzsKIAkJfQotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCXBCc3MtPkF0aW1XaW4gPSBBdGltV2luOwogCX0KIAogCXBCc3MtPkNhcGFiaWxpdHlJbmZvID0gQ2FwYWJpbGl0eUluZm87Ci0JLy8gVGhlIHByaXZhY3kgYml0IGluZGljYXRlIHNlY3VyaXR5IGlzIE9OLCBpdCBtYWlnaHQgYmUgV0VQLCBUS0lQIG9yIEFFUwotCS8vIENvbWJpbmUgd2l0aCBBdXRoTW9kZSwgdGhleSB3aWxsIGRlY2lkZSB0aGUgY29ubmVjdGlvbiBtZXRob2RzLgorCS8qIFRoZSBwcml2YWN5IGJpdCBpbmRpY2F0ZSBzZWN1cml0eSBpcyBPTiwgaXQgbWFpZ2h0IGJlIFdFUCwgVEtJUCBvciBBRVMgKi8KKwkvKiBDb21iaW5lIHdpdGggQXV0aE1vZGUsIHRoZXkgd2lsbCBkZWNpZGUgdGhlIGNvbm5lY3Rpb24gbWV0aG9kcy4gKi8KIAlwQnNzLT5Qcml2YWN5ID0gQ0FQX0lTX1BSSVZBQ1lfT04ocEJzcy0+Q2FwYWJpbGl0eUluZm8pOwogCUFTU0VSVChTdXBSYXRlTGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKIAlpZiAoU3VwUmF0ZUxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKIAkJTmRpc01vdmVNZW1vcnkocEJzcy0+U3VwUmF0ZSwgU3VwUmF0ZSwgU3VwUmF0ZUxlbik7CiAJZWxzZQotCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5TdXBSYXRlLCBTdXBSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPlN1cFJhdGUsIFN1cFJhdGUsCisJCQkgICAgICAgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOwogCXBCc3MtPlN1cFJhdGVMZW4gPSBTdXBSYXRlTGVuOwogCUFTU0VSVChFeHRSYXRlTGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKIAlOZGlzTW92ZU1lbW9yeShwQnNzLT5FeHRSYXRlLCBFeHRSYXRlLCBFeHRSYXRlTGVuKTsKLQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+SHRDYXBhYmlsaXR5LCBwSHRDYXBhYmlsaXR5LCBIdENhcGFiaWxpdHlMZW4pOwotCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5BZGRIdEluZm8sIHBBZGRIdEluZm8sIEFkZEh0SW5mb0xlbik7CiAJcEJzcy0+TmV3RXh0Q2hhbk9mZnNldCA9IE5ld0V4dENoYW5PZmZzZXQ7CiAJcEJzcy0+RXh0UmF0ZUxlbiA9IEV4dFJhdGVMZW47CiAJcEJzcy0+Q2hhbm5lbCA9IENoYW5uZWw7CiAJcEJzcy0+Q2VudHJhbENoYW5uZWwgPSBDaGFubmVsOwogCXBCc3MtPlJzc2kgPSBSc3NpOwotCS8vIFVwZGF0ZSBDa2lwRmxhZy4gaWYgbm90IGV4aXN0cywgdGhlIHZhbHVlIGlzIDB4MAorCS8qIFVwZGF0ZSBDa2lwRmxhZy4gaWYgbm90IGV4aXN0cywgdGhlIHZhbHVlIGlzIDB4MCAqLwogCXBCc3MtPkNraXBGbGFnID0gQ2tpcEZsYWc7CiAKLQkvLyBOZXcgZm9yIG1pY3Jvc29mdCBGaXhlZCBJRXMKKwkvKiBOZXcgZm9yIG1pY3Jvc29mdCBGaXhlZCBJRXMgKi8KIAlOZGlzTW92ZU1lbW9yeShwQnNzLT5GaXhJRXMuVGltZXN0YW1wLCAmVGltZVN0YW1wLCA4KTsKIAlwQnNzLT5GaXhJRXMuQmVhY29uSW50ZXJ2YWwgPSBCZWFjb25QZXJpb2Q7CiAJcEJzcy0+Rml4SUVzLkNhcGFiaWxpdGllcyA9IENhcGFiaWxpdHlJbmZvOwogCi0JLy8gTmV3IGZvciBtaWNyb3NvZnQgVmFyaWFibGUgSUVzCi0JaWYgKExlbmd0aFZJRSAhPSAwKQotCXsKKwkvKiBOZXcgZm9yIG1pY3Jvc29mdCBWYXJpYWJsZSBJRXMgKi8KKwlpZiAoTGVuZ3RoVklFICE9IDApIHsKIAkJcEJzcy0+VmFySUVMZW4gPSBMZW5ndGhWSUU7CiAJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPlZhcklFcywgcFZJRSwgcEJzcy0+VmFySUVMZW4pOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCXBCc3MtPlZhcklFTGVuID0gMDsKIAl9CiAKIAlwQnNzLT5BZGRIdEluZm9MZW4gPSAwOwogCXBCc3MtPkh0Q2FwYWJpbGl0eUxlbiA9IDA7Ci0KLQlpZiAoSHRDYXBhYmlsaXR5TGVuPiAwKQotCXsKKwlpZiAoSHRDYXBhYmlsaXR5TGVuID4gMCkgewogCQlwQnNzLT5IdENhcGFiaWxpdHlMZW4gPSBIdENhcGFiaWxpdHlMZW47Ci0JCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5IdENhcGFiaWxpdHksIHBIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbik7Ci0JCWlmIChBZGRIdEluZm9MZW4gPiAwKQotCQl7CisJCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5IdENhcGFiaWxpdHksIHBIdENhcGFiaWxpdHksCisJCQkgICAgICAgSHRDYXBhYmlsaXR5TGVuKTsKKwkJaWYgKEFkZEh0SW5mb0xlbiA+IDApIHsKIAkJCXBCc3MtPkFkZEh0SW5mb0xlbiA9IEFkZEh0SW5mb0xlbjsKLQkJCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5BZGRIdEluZm8sIHBBZGRIdEluZm8sIEFkZEh0SW5mb0xlbik7CisJCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+QWRkSHRJbmZvLCBwQWRkSHRJbmZvLAorCQkJCSAgICAgICBBZGRIdEluZm9MZW4pOwogCi0JIAkJCWlmICgocEFkZEh0SW5mby0+Q29udHJvbENoYW4gPiAyKSYmIChwQWRkSHRJbmZvLT5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQkVMT1cpICYmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKLQkgCQkJewotCSAJCQkJcEJzcy0+Q2VudHJhbENoYW5uZWwgPSBwQWRkSHRJbmZvLT5Db250cm9sQ2hhbiAtIDI7Ci0JIAkJCX0KLQkgCQkJZWxzZSBpZiAoKHBBZGRIdEluZm8tPkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9BQk9WRSkgJiYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQotCQkJCXsKLQkJIAkJCQlwQnNzLT5DZW50cmFsQ2hhbm5lbCA9IHBBZGRIdEluZm8tPkNvbnRyb2xDaGFuICsgMjsKLQkJCQl9CisJCQlpZiAoKHBBZGRIdEluZm8tPkNvbnRyb2xDaGFuID4gMikKKwkJCSAgICAmJiAocEFkZEh0SW5mby0+QWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0KKwkJCQlFWFRDSEFfQkVMT1cpCisJCQkgICAgJiYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0KKwkJCQlCV180MCkpIHsKKwkJCQlwQnNzLT5DZW50cmFsQ2hhbm5lbCA9CisJCQkJICAgIHBBZGRIdEluZm8tPkNvbnRyb2xDaGFuIC0gMjsKKwkJCX0gZWxzZQorCQkJICAgIGlmICgocEFkZEh0SW5mby0+QWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0KKwkJCQkgRVhUQ0hBX0FCT1ZFKQorCQkJCSYmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09CisJCQkJICAgIEJXXzQwKSkgeworCQkJCXBCc3MtPkNlbnRyYWxDaGFubmVsID0KKwkJCQkgICAgcEFkZEh0SW5mby0+Q29udHJvbENoYW4gKyAyOworCQkJfQogCQl9CiAJfQogCiAJQnNzQ2lwaGVyUGFyc2UocEJzcyk7CiAKLQkvLyBuZXcgZm9yIFFPUworCS8qIG5ldyBmb3IgUU9TICovCiAJaWYgKHBFZGNhUGFybSkKLQkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPkVkY2FQYXJtLCBwRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKKwkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPkVkY2FQYXJtLCBwRWRjYVBhcm0sIHNpemVvZihzdHJ1Y3QgcnRfZWRjYV9wYXJtKSk7CiAJZWxzZQogCQlwQnNzLT5FZGNhUGFybS5iVmFsaWQgPSBGQUxTRTsKIAlpZiAocFFvc0NhcGFiaWxpdHkpCi0JCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5Rb3NDYXBhYmlsaXR5LCBwUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTsKKwkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPlFvc0NhcGFiaWxpdHksIHBRb3NDYXBhYmlsaXR5LAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfcW9zX2NhcGFiaWxpdHlfcGFybSkpOwogCWVsc2UKIAkJcEJzcy0+UW9zQ2FwYWJpbGl0eS5iVmFsaWQgPSBGQUxTRTsKIAlpZiAocFFic3NMb2FkKQotCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+UWJzc0xvYWQsIHBRYnNzTG9hZCwgc2l6ZW9mKFFCU1NfTE9BRF9QQVJNKSk7CisJCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5RYnNzTG9hZCwgcFFic3NMb2FkLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfcWJzc19sb2FkX3Bhcm0pKTsKIAllbHNlCiAJCXBCc3MtPlFic3NMb2FkLmJWYWxpZCA9IEZBTFNFOwogCiAJewotCQlQRUlEX1NUUlVDVCAgICAgcEVpZDsKLQkJVVNIT1JUICAgICAgICAgIExlbmd0aCA9IDA7Ci0KKwkJc3RydWN0IHJ0X2VpZCAqIHBFaWQ7CisJCXUxNiBMZW5ndGggPSAwOwogCiAJCU5kaXNaZXJvTWVtb3J5KCZwQnNzLT5XcGFJRS5JRVswXSwgTUFYX0NVU1RPTV9MRU4pOwogCQlOZGlzWmVyb01lbW9yeSgmcEJzcy0+UnNuSUUuSUVbMF0sIE1BWF9DVVNUT01fTEVOKTsKLQotCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwVklFOwotCi0JCXdoaWxlICgoTGVuZ3RoICsgMiArIChVU0hPUlQpcEVpZC0+TGVuKSA8PSBMZW5ndGhWSUUpCi0JCXsKLQkJCXN3aXRjaChwRWlkLT5FaWQpCi0JCQl7Ci0JCQkJY2FzZSBJRV9XUEE6Ci0JCQkJCWlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpKQotCQkJCQl7Ci0JCQkJCQlpZiAoKHBFaWQtPkxlbiArIDIpID4gTUFYX0NVU1RPTV9MRU4pCi0JCQkJCQl7Ci0JCQkJCQkJcEJzcy0+V3BhSUUuSUVMZW4gPSAwOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJcEJzcy0+V3BhSUUuSUVMZW4gPSBwRWlkLT5MZW4gKyAyOwotCQkJCQkJTmRpc01vdmVNZW1vcnkocEJzcy0+V3BhSUUuSUUsIHBFaWQsIHBCc3MtPldwYUlFLklFTGVuKTsKKwkJcEVpZCA9IChzdHJ1Y3QgcnRfZWlkICopIHBWSUU7CisJCXdoaWxlICgoTGVuZ3RoICsgMiArICh1MTYpcEVpZC0+TGVuKSA8PSBMZW5ndGhWSUUpIHsKKwkJCXN3aXRjaCAocEVpZC0+RWlkKSB7CisJCQljYXNlIElFX1dQQToKKwkJCQlpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXUEFfT1VJLCA0KSkgeworCQkJCQlpZiAoKHBFaWQtPkxlbiArIDIpID4gTUFYX0NVU1RPTV9MRU4pIHsKKwkJCQkJCXBCc3MtPldwYUlFLklFTGVuID0gMDsKKwkJCQkJCWJyZWFrOwogCQkJCQl9Ci0JCQkJCWJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSUVfUlNOOgotICAgICAgICAgICAgICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0ICsgMiwgUlNOX09VSSwgMykpCi0JCQkJCXsKLQkJCQkJCWlmICgocEVpZC0+TGVuICsgMikgPiBNQVhfQ1VTVE9NX0xFTikKLQkJCQkJCXsKLQkJCQkJCQlwQnNzLT5Sc25JRS5JRUxlbiA9IDA7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlwQnNzLT5Sc25JRS5JRUxlbiA9IHBFaWQtPkxlbiArIDI7Ci0JCQkJCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5Sc25JRS5JRSwgcEVpZCwgcEJzcy0+UnNuSUUuSUVMZW4pOwotCQkJfQorCQkJCQlwQnNzLT5XcGFJRS5JRUxlbiA9IHBFaWQtPkxlbiArIDI7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPldwYUlFLklFLCBwRWlkLAorCQkJCQkJICAgICAgIHBCc3MtPldwYUlFLklFTGVuKTsKKwkJCQl9CiAJCQkJYnJlYWs7Ci0gICAgICAgICAgICB9Ci0JCQlMZW5ndGggPSBMZW5ndGggKyAyICsgKFVTSE9SVClwRWlkLT5MZW47ICAvLyBFaWRbMV0gKyBMZW5bMV0rIGNvbnRlbnRbTGVuXQotCQkJcEVpZCA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKilwRWlkICsgMiArIHBFaWQtPkxlbik7CisJCQljYXNlIElFX1JTTjoKKwkJCQlpZiAoTmRpc0VxdWFsTWVtb3J5CisJCQkJICAgIChwRWlkLT5PY3RldCArIDIsIFJTTl9PVUksIDMpKSB7CisJCQkJCWlmICgocEVpZC0+TGVuICsgMikgPiBNQVhfQ1VTVE9NX0xFTikgeworCQkJCQkJcEJzcy0+UnNuSUUuSUVMZW4gPSAwOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJcEJzcy0+UnNuSUUuSUVMZW4gPSBwRWlkLT5MZW4gKyAyOworCQkJCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5Sc25JRS5JRSwgcEVpZCwKKwkJCQkJCSAgICAgICBwQnNzLT5Sc25JRS5JRUxlbik7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJTGVuZ3RoID0gTGVuZ3RoICsgMiArICh1MTYpcEVpZC0+TGVuOwkvKiBFaWRbMV0gKyBMZW5bMV0rIGNvbnRlbnRbTGVuXSAqLworCQkJcEVpZCA9IChzdHJ1Y3QgcnRfZWlkICopICgodTggKikgcEVpZCArIDIgKyBwRWlkLT5MZW4pOwogCQl9CiAJfQogfQpAQCAtMzc2NSwzMDEgKzM4MzcsMzM3IEBACiAgSVJRTCA9IERJU1BBVENIX0xFVkVMCiAKICAqLwotVUxPTkcgQnNzVGFibGVTZXRFbnRyeSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQgQlNTX1RBQkxFICpUYWIsCi0JSU4gUFVDSEFSIHBCc3NpZCwKLQlJTiBDSEFSIFNzaWRbXSwKLQlJTiBVQ0hBUiBTc2lkTGVuLAotCUlOIFVDSEFSIEJzc1R5cGUsCi0JSU4gVVNIT1JUIEJlYWNvblBlcmlvZCwKLQlJTiBDRl9QQVJNICpDZlBhcm0sCi0JSU4gVVNIT1JUIEF0aW1XaW4sCi0JSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAotCUlOIFVDSEFSIFN1cFJhdGVbXSwKLQlJTiBVQ0hBUiBTdXBSYXRlTGVuLAotCUlOIFVDSEFSIEV4dFJhdGVbXSwKLQlJTiBVQ0hBUiBFeHRSYXRlTGVuLAotCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCi0JSU4gQUREX0hUX0lORk9fSUUgKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotCUlOIFVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLAotCUlOIFVDSEFSCQkJQWRkSHRJbmZvTGVuLAotCUlOIFVDSEFSCQkJTmV3RXh0Q2hhbk9mZnNldCwKLQlJTiBVQ0hBUiBDaGFubmVsTm8sCi0JSU4gQ0hBUiBSc3NpLAotCUlOIExBUkdFX0lOVEVHRVIgVGltZVN0YW1wLAotCUlOIFVDSEFSIENraXBGbGFnLAotCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAotCUlOIFBRT1NfQ0FQQUJJTElUWV9QQVJNIHBRb3NDYXBhYmlsaXR5LAotCUlOIFBRQlNTX0xPQURfUEFSTSBwUWJzc0xvYWQsCi0JSU4gVVNIT1JUIExlbmd0aFZJRSwKLQlJTiBQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzIHBWSUUpCit1bnNpZ25lZCBsb25nIEJzc1RhYmxlU2V0RW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfYnNzX3RhYmxlICpUYWIsIHU4ICpwQnNzaWQsIGNoYXIgU3NpZFtdLCB1OCBTc2lkTGVuLCB1OCBCc3NUeXBlLCB1MTYgQmVhY29uUGVyaW9kLCBzdHJ1Y3QgcnRfY2ZfcGFybSAqIENmUGFybSwgdTE2IEF0aW1XaW4sIHUxNiBDYXBhYmlsaXR5SW5mbywgdTggU3VwUmF0ZVtdLCB1OCBTdXBSYXRlTGVuLCB1OCBFeHRSYXRlW10sIHU4IEV4dFJhdGVMZW4sIHN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llICogcEh0Q2FwYWJpbGl0eSwgc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llICogcEFkZEh0SW5mbywJLyogQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFICovCisJCSAgICAgICB1OCBIdENhcGFiaWxpdHlMZW4sCisJCSAgICAgICB1OCBBZGRIdEluZm9MZW4sCisJCSAgICAgICB1OCBOZXdFeHRDaGFuT2Zmc2V0LAorCQkgICAgICAgdTggQ2hhbm5lbE5vLAorCQkgICAgICAgY2hhciBSc3NpLAorCQkgICAgICAgSU4gTEFSR0VfSU5URUdFUiBUaW1lU3RhbXAsCisJCSAgICAgICB1OCBDa2lwRmxhZywKKwkJICAgICAgIHN0cnVjdCBydF9lZGNhX3Bhcm0gKnBFZGNhUGFybSwKKwkJICAgICAgIHN0cnVjdCBydF9xb3NfY2FwYWJpbGl0eV9wYXJtICpwUW9zQ2FwYWJpbGl0eSwKKwkJICAgICAgIHN0cnVjdCBydF9xYnNzX2xvYWRfcGFybSAqcFFic3NMb2FkLAorCQkgICAgICAgdTE2IExlbmd0aFZJRSwgc3RydWN0IHJ0X25kaXNfODAyXzExX3ZhcmlhYmxlX2llcyAqcFZJRSkKIHsKLQlVTE9ORwlJZHg7CisJdW5zaWduZWQgbG9uZyBJZHg7CiAKLQlJZHggPSBCc3NUYWJsZVNlYXJjaFdpdGhTU0lEKFRhYiwgcEJzc2lkLCAgU3NpZCwgU3NpZExlbiwgQ2hhbm5lbE5vKTsKLQlpZiAoSWR4ID09IEJTU19OT1RfRk9VTkQpCi0JewotCQlpZiAoVGFiLT5Cc3NOciA+PSBNQVhfTEVOX09GX0JTU19UQUJMRSkKLQkgICAgewotCQkJLy8KLQkJCS8vIEl0IG1heSBoYXBwZW4gd2hlbiBCU1MgVGFibGUgd2FzIGZ1bGwuCi0JCQkvLyBUaGUgZGVzaXJlZCBBUCB3aWxsIG5vdCBiZSBhZGRlZCBpbnRvIEJTUyBUYWJsZQotCQkJLy8gSW4gdGhpcyBjYXNlLCBpZiB3ZSBmb3VuZCB0aGUgZGVzaXJlZCBBUCB0aGVuIG92ZXJ3cml0ZSBCU1MgVGFibGUuCi0JCQkvLwotCQkJaWYoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJCXsKLQkJCQlpZiAoTUFDX0FERFJfRVFVQUwocEFkLT5NbG1lQXV4LkJzc2lkLCBwQnNzaWQpIHx8Ci0JCQkJCVNTSURfRVFVQUwocEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCBTc2lkLCBTc2lkTGVuKSkKLQkJCQl7CisJSWR4ID0KKwkgICAgQnNzVGFibGVTZWFyY2hXaXRoU1NJRChUYWIsIHBCc3NpZCwgKHU4ICopIFNzaWQsIFNzaWRMZW4sCisJCQkJICAgQ2hhbm5lbE5vKTsKKwlpZiAoSWR4ID09IEJTU19OT1RfRk9VTkQpIHsKKwkJaWYgKFRhYi0+QnNzTnIgPj0gTUFYX0xFTl9PRl9CU1NfVEFCTEUpIHsKKwkJCS8qICovCisJCQkvKiBJdCBtYXkgaGFwcGVuIHdoZW4gQlNTIFRhYmxlIHdhcyBmdWxsLiAqLworCQkJLyogVGhlIGRlc2lyZWQgQVAgd2lsbCBub3QgYmUgYWRkZWQgaW50byBCU1MgVGFibGUgKi8KKwkJCS8qIEluIHRoaXMgY2FzZSwgaWYgd2UgZm91bmQgdGhlIGRlc2lyZWQgQVAgdGhlbiBvdmVyd3JpdGUgQlNTIFRhYmxlLiAqLworCQkJLyogKi8KKwkJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHCisJCQkgICAgKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKSB7CisJCQkJaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEJzc2lkKQorCQkJCSAgICB8fCBTU0lEX0VRVUFMKHBBZC0+TWxtZUF1eC5Tc2lkLAorCQkJCQkJICBwQWQtPk1sbWVBdXguU3NpZExlbiwgU3NpZCwKKwkJCQkJCSAgU3NpZExlbikpIHsKIAkJCQkJSWR4ID0gVGFiLT5Cc3NPdmVybGFwTnI7Ci0JCQkJCUJzc0VudHJ5U2V0KHBBZCwgJlRhYi0+QnNzRW50cnlbSWR4XSwgcEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsIENmUGFybSwgQXRpbVdpbiwKLQkJCQkJCUNhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLHBIdENhcGFiaWxpdHksIHBBZGRIdEluZm8sSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sCi0JCQkJCQlOZXdFeHRDaGFuT2Zmc2V0LCBDaGFubmVsTm8sIFJzc2ksIFRpbWVTdGFtcCwgQ2tpcEZsYWcsIHBFZGNhUGFybSwgcFFvc0NhcGFiaWxpdHksIHBRYnNzTG9hZCwgTGVuZ3RoVklFLCBwVklFKTsKLSAgICAgICAgICAgICAgICAgICAgVGFiLT5Cc3NPdmVybGFwTnIgPSAoVGFiLT5Cc3NPdmVybGFwTnIrKykgJSBNQVhfTEVOX09GX0JTU19UQUJMRTsKKwkJCQkJQnNzRW50cnlTZXQocEFkLCAmVGFiLT5Cc3NFbnRyeVtJZHhdLAorCQkJCQkJICAgIHBCc3NpZCwgU3NpZCwgU3NpZExlbiwKKwkJCQkJCSAgICBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCisJCQkJCQkgICAgQ2ZQYXJtLCBBdGltV2luLAorCQkJCQkJICAgIENhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLAorCQkJCQkJICAgIFN1cFJhdGVMZW4sIEV4dFJhdGUsCisJCQkJCQkgICAgRXh0UmF0ZUxlbiwgcEh0Q2FwYWJpbGl0eSwKKwkJCQkJCSAgICBwQWRkSHRJbmZvLCBIdENhcGFiaWxpdHlMZW4sCisJCQkJCQkgICAgQWRkSHRJbmZvTGVuLAorCQkJCQkJICAgIE5ld0V4dENoYW5PZmZzZXQsIENoYW5uZWxObywKKwkJCQkJCSAgICBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLAorCQkJCQkJICAgIHBFZGNhUGFybSwgcFFvc0NhcGFiaWxpdHksCisJCQkJCQkgICAgcFFic3NMb2FkLCBMZW5ndGhWSUUsIHBWSUUpOworCQkJCQlUYWItPkJzc092ZXJsYXBOciA9CisJCQkJCSAgICAoVGFiLT5Cc3NPdmVybGFwTnIrKykgJQorCQkJCQkgICAgTUFYX0xFTl9PRl9CU1NfVEFCTEU7CiAJCQkJfQogCQkJCXJldHVybiBJZHg7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQlyZXR1cm4gQlNTX05PVF9GT1VORDsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIEJTU19OT1RfRk9VTkQ7CiAJCQl9CiAJCX0KIAkJSWR4ID0gVGFiLT5Cc3NOcjsKLQkJQnNzRW50cnlTZXQocEFkLCAmVGFiLT5Cc3NFbnRyeVtJZHhdLCBwQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCwgQ2ZQYXJtLCBBdGltV2luLAotCQkJCQlDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbixwSHRDYXBhYmlsaXR5LCBwQWRkSHRJbmZvLEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLAotCQkJCQlOZXdFeHRDaGFuT2Zmc2V0LCBDaGFubmVsTm8sIFJzc2ksIFRpbWVTdGFtcCwgQ2tpcEZsYWcsIHBFZGNhUGFybSwgcFFvc0NhcGFiaWxpdHksIHBRYnNzTG9hZCwgTGVuZ3RoVklFLCBwVklFKTsKKwkJQnNzRW50cnlTZXQocEFkLCAmVGFiLT5Cc3NFbnRyeVtJZHhdLCBwQnNzaWQsIFNzaWQsIFNzaWRMZW4sCisJCQkgICAgQnNzVHlwZSwgQmVhY29uUGVyaW9kLCBDZlBhcm0sIEF0aW1XaW4sCisJCQkgICAgQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsCisJCQkgICAgRXh0UmF0ZUxlbiwgcEh0Q2FwYWJpbGl0eSwgcEFkZEh0SW5mbywKKwkJCSAgICBIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwgTmV3RXh0Q2hhbk9mZnNldCwKKwkJCSAgICBDaGFubmVsTm8sIFJzc2ksIFRpbWVTdGFtcCwgQ2tpcEZsYWcsIHBFZGNhUGFybSwKKwkJCSAgICBwUW9zQ2FwYWJpbGl0eSwgcFFic3NMb2FkLCBMZW5ndGhWSUUsIHBWSUUpOwogCQlUYWItPkJzc05yKys7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJLyogYXZvaWQgIEhpZGRlbiBTU0lEIGZvcm0gYmVhY29uIHRvIG92ZXJ3aXJpdGUgY29ycmVjdCBTU0lEIGZyb20gcHJvYmUgcmVzcG9uc2UgKi8KLQkJaWYgKChTU0lEX0VRVUFMKFNzaWQsIFNzaWRMZW4sIFRhYi0+QnNzRW50cnlbSWR4XS5Tc2lkLCBUYWItPkJzc0VudHJ5W0lkeF0uU3NpZExlbikpIHx8Ci0JCQkoTmRpc0VxdWFsTWVtb3J5KFRhYi0+QnNzRW50cnlbSWR4XS5Tc2lkLCBaZXJvU3NpZCwgVGFiLT5Cc3NFbnRyeVtJZHhdLlNzaWRMZW4pKSkKLQkJewotCQlCc3NFbnRyeVNldChwQWQsICZUYWItPkJzc0VudHJ5W0lkeF0sIHBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLENmUGFybSwgQXRpbVdpbiwKLQkJCQkJQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4scEh0Q2FwYWJpbGl0eSwgcEFkZEh0SW5mbyxIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwKLQkJCQkJTmV3RXh0Q2hhbk9mZnNldCwgQ2hhbm5lbE5vLCBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLCBwRWRjYVBhcm0sIHBRb3NDYXBhYmlsaXR5LCBwUWJzc0xvYWQsIExlbmd0aFZJRSwgcFZJRSk7CisJCWlmICgoU1NJRF9FUVVBTAorCQkgICAgIChTc2lkLCBTc2lkTGVuLCBUYWItPkJzc0VudHJ5W0lkeF0uU3NpZCwKKwkJICAgICAgVGFiLT5Cc3NFbnRyeVtJZHhdLlNzaWRMZW4pKQorCQkgICAgfHwKKwkJICAgIChOZGlzRXF1YWxNZW1vcnkKKwkJICAgICAoVGFiLT5Cc3NFbnRyeVtJZHhdLlNzaWQsIFplcm9Tc2lkLAorCQkgICAgICBUYWItPkJzc0VudHJ5W0lkeF0uU3NpZExlbikpKSB7CisJCQlCc3NFbnRyeVNldChwQWQsICZUYWItPkJzc0VudHJ5W0lkeF0sIHBCc3NpZCwgU3NpZCwKKwkJCQkgICAgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLCBDZlBhcm0sCisJCQkJICAgIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLAorCQkJCSAgICBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLAorCQkJCSAgICBwSHRDYXBhYmlsaXR5LCBwQWRkSHRJbmZvLCBIdENhcGFiaWxpdHlMZW4sCisJCQkJICAgIEFkZEh0SW5mb0xlbiwgTmV3RXh0Q2hhbk9mZnNldCwgQ2hhbm5lbE5vLAorCQkJCSAgICBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLCBwRWRjYVBhcm0sCisJCQkJICAgIHBRb3NDYXBhYmlsaXR5LCBwUWJzc0xvYWQsIExlbmd0aFZJRSwgcFZJRSk7CiAJCX0KIAl9CiAKIAlyZXR1cm4gSWR4OwogfQogCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVZPSUQgQnNzVGFibGVTc2lkU29ydCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQgQlNTX1RBQkxFICpPdXRUYWIsCi0JSU4JQ0hBUiBTc2lkW10sCi0JSU4JVUNIQVIgU3NpZExlbikKKy8qIElSUUwgPSBESVNQQVRDSF9MRVZFTCAqLwordm9pZCBCc3NUYWJsZVNzaWRTb3J0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgc3RydWN0IHJ0X2Jzc190YWJsZSAqT3V0VGFiLCBjaGFyIFNzaWRbXSwgdTggU3NpZExlbikKIHsKLQlJTlQgaTsKKwlpbnQgaTsKIAlCc3NUYWJsZUluaXQoT3V0VGFiKTsKIAotCWZvciAoaSA9IDA7IGkgPCBwQWQtPlNjYW5UYWIuQnNzTnI7IGkrKykKLQl7Ci0JCUJTU19FTlRSWSAqcEluQnNzID0gJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXTsKLQkJQk9PTEVBTgliSXNIaWRkZW5BcEluY2x1ZGVkID0gRkFMU0U7CisJZm9yIChpID0gMDsgaSA8IHBBZC0+U2NhblRhYi5Cc3NOcjsgaSsrKSB7CisJCXN0cnVjdCBydF9ic3NfZW50cnkgKnBJbkJzcyA9ICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV07CisJCUJPT0xFQU4gYklzSGlkZGVuQXBJbmNsdWRlZCA9IEZBTFNFOwogCiAJCWlmICgoKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmCi0gICAgICAgICAgICAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPiAxNCkgJiYKLSAgICAgICAgICAgICBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBJbkJzcy0+Q2hhbm5lbCkpCi0gICAgICAgICAgICApCi0JCXsKKwkJICAgICAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPiAxNCkgJiYKKwkJICAgICBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBJbkJzcy0+Q2hhbm5lbCkpCisJCSAgICApIHsKIAkJCWlmIChwSW5Cc3MtPkhpZGRlbikKIAkJCQliSXNIaWRkZW5BcEluY2x1ZGVkID0gVFJVRTsKIAkJfQogCiAJCWlmICgocEluQnNzLT5Cc3NUeXBlID09IHBBZC0+U3RhQ2ZnLkJzc1R5cGUpICYmCi0JCQkoU1NJRF9FUVVBTChTc2lkLCBTc2lkTGVuLCBwSW5Cc3MtPlNzaWQsIHBJbkJzcy0+U3NpZExlbikgfHwgYklzSGlkZGVuQXBJbmNsdWRlZCkpCi0JCXsKLQkJCUJTU19FTlRSWSAqcE91dEJzcyA9ICZPdXRUYWItPkJzc0VudHJ5W091dFRhYi0+QnNzTnJdOworCQkgICAgKFNTSURfRVFVQUwoU3NpZCwgU3NpZExlbiwgcEluQnNzLT5Tc2lkLCBwSW5Cc3MtPlNzaWRMZW4pCisJCSAgICAgfHwgYklzSGlkZGVuQXBJbmNsdWRlZCkpIHsKKwkJCXN0cnVjdCBydF9ic3NfZW50cnkgKnBPdXRCc3MgPSAmT3V0VGFiLT5Cc3NFbnRyeVtPdXRUYWItPkJzc05yXTsKIAotCQkJLy8gMi40Ry81RyBOIG9ubHkgbW9kZQorCQkJLyogMi40Ry81RyBOIG9ubHkgbW9kZSAqLwogCQkJaWYgKChwSW5Cc3MtPkh0Q2FwYWJpbGl0eUxlbiA9PSAwKSAmJgotCQkJCSgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzJfNEcpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKSkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQSBpcyBpbiBOLW9ubHkgTW9kZSwgdGhpcyBBUCBkb24ndCBoYXZlIEh0IGNhcGFiaWxpdHkgaW4gQmVhY29uLlxuIikpOworCQkJICAgICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzJfNEcpCisJCQkgICAgIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKSkgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJTVEEgaXMgaW4gTi1vbmx5IE1vZGUsIHRoaXMgQVAgZG9uJ3QgaGF2ZSBIdCBjYXBhYmlsaXR5IGluIEJlYWNvbi5cbiIpKTsKIAkJCQljb250aW51ZTsKIAkJCX0KLQotCQkJLy8gTmV3IGZvciBXUEEyCi0JCQkvLyBDaGVjayB0aGUgQXV0aG1vZGUgZmlyc3QKLQkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0JCQl7Ci0JCQkJLy8gQ2hlY2sgQXV0aE1vZGUgYW5kIEF1dGhNb2RlQXV4IGZvciBtYXRjaGluZywgaW4gY2FzZSBBUCBzdXBwb3J0IGR1YWwtbW9kZQotCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gcEluQnNzLT5BdXRoTW9kZSkgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IHBJbkJzcy0+QXV0aE1vZGVBdXgpKQotCQkJCQkvLyBOb25lIG1hdGNoZWQKKwkJCS8qIE5ldyBmb3IgV1BBMiAqLworCQkJLyogQ2hlY2sgdGhlIEF1dGhtb2RlIGZpcnN0ICovCisJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB7CisJCQkJLyogQ2hlY2sgQXV0aE1vZGUgYW5kIEF1dGhNb2RlQXV4IGZvciBtYXRjaGluZywgaW4gY2FzZSBBUCBzdXBwb3J0IGR1YWwtbW9kZSAqLworCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gcEluQnNzLT5BdXRoTW9kZSkKKwkJCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9CisJCQkJCXBJbkJzcy0+QXV0aE1vZGVBdXgpKQorCQkJCQkvKiBOb25lIG1hdGNoZWQgKi8KIAkJCQkJY29udGludWU7CiAKLQkJCQkvLyBDaGVjayBjaXBoZXIgc3VpdGUsIEFQIG11c3QgaGF2ZSBtb3JlIHNlY3VyZWQgY2lwaGVyIHRoYW4gc3RhdGlvbiBzZXR0aW5nCi0JCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQotCQkJCXsKLQkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgorCQkJCS8qIENoZWNrIGNpcGhlciBzdWl0ZSwgQVAgbXVzdCBoYXZlIG1vcmUgc2VjdXJlZCBjaXBoZXIgdGhhbiBzdGF0aW9uIHNldHRpbmcgKi8KKwkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09CisJCQkJICAgICBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCQkJICAgIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkJCQlOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKSB7CisJCQkJCS8qIElmIGl0J3Mgbm90IG1peGVkIG1vZGUsIHdlIHNob3VsZCBvbmx5IGxldCBCU1MgcGFzcyB3aXRoIHRoZSBzYW1lIGVuY3J5cHRpb24gKi8KIAkJCQkJaWYgKHBJbkJzcy0+V1BBLmJNaXhNb2RlID09IEZBTFNFKQotCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0KKwkJCQkJCSAgICBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikKIAkJCQkJCQljb250aW51ZTsKIAotCQkJCQkvLyBjaGVjayBncm91cCBjaXBoZXIKLQkJCQkJaWYgKHBJbkJzcy0+V1BBLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCAmJgotCQkJCQkgICAgcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCAmJgotCQkJCQkgICAgcEFkLT5TdGFDZmcuV2VwU3RhdHVzIDwgcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpCisJCQkJCS8qIGNoZWNrIGdyb3VwIGNpcGhlciAqLworCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA8CisJCQkJCSAgICAgcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpCisJCQkJCSAgICAmJiAocEluQnNzLT5XUEEuR3JvdXBDaXBoZXIgIT0KKwkJCQkJCU5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCkKKwkJCQkJICAgICYmIChwSW5Cc3MtPldQQS5Hcm91cENpcGhlciAhPQorCQkJCQkJTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCkpCiAJCQkJCQljb250aW51ZTsKIAotCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCi0JCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KLQkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAotCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgotCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyKSAmJgotCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyQXV4KSkKKwkJCQkJLyogY2hlY2sgcGFpcndpc2UgY2lwaGVyLCBza2lwIGlmIG5vbmUgbWF0Y2hlZCAqLworCQkJCQkvKiBJZiBwcm9maWxlIHNldCB0byBBRVMsIGxldCBpdCBwYXNzIHdpdGhvdXQgcXVlc3Rpb24uICovCisJCQkJCS8qIElmIHByb2ZpbGUgc2V0IHRvIFRLSVAsIHdlIG11c3QgZmluZCBvbmUgbWF0ZWNoZWQgKi8KKwkJCQkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0KKwkJCQkJICAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPQorCQkJCQkJcEluQnNzLT5XUEEuUGFpckNpcGhlcikKKwkJCQkJICAgICYmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0KKwkJCQkJCXBJbkJzcy0+V1BBLlBhaXJDaXBoZXJBdXgpKQogCQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCi0JCQkJewotCQkJCQkvLyBJZiBpdCdzIG5vdCBtaXhlZCBtb2RlLCB3ZSBzaG91bGQgb25seSBsZXQgQlNTIHBhc3Mgd2l0aCB0aGUgc2FtZSBlbmNyeXB0aW9uCisJCQkJfSBlbHNlCisJCQkJICAgIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0KKwkJCQkJIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisJCQkJCXx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkJCQkgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpIHsKKwkJCQkJLyogSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbiAqLwogCQkJCQlpZiAocEluQnNzLT5XUEEyLmJNaXhNb2RlID09IEZBTFNFKQotCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCisJCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9CisJCQkJCQkgICAgcEluQnNzLT5XUEEyLkdyb3VwQ2lwaGVyKQogCQkJCQkJCWNvbnRpbnVlOwogCi0JCQkJCS8vIGNoZWNrIGdyb3VwIGNpcGhlcgotCQkJCQlpZiAocEluQnNzLT5XUEEyLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCAmJgotCQkJCQkgICAgcEluQnNzLT5XUEEyLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQgJiYKLQkJCQkJICAgIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA8IHBJbkJzcy0+V1BBMi5Hcm91cENpcGhlcikKKwkJCQkJLyogY2hlY2sgZ3JvdXAgY2lwaGVyICovCisJCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDwKKwkJCQkJICAgICBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikKKwkJCQkJICAgICYmIChwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIgIT0KKwkJCQkJCU5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCkKKwkJCQkJICAgICYmIChwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIgIT0KKwkJCQkJCU5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQpKQogCQkJCQkJY29udGludWU7CiAKLQkJCQkJLy8gY2hlY2sgcGFpcndpc2UgY2lwaGVyLCBza2lwIGlmIG5vbmUgbWF0Y2hlZAotCQkJCQkvLyBJZiBwcm9maWxlIHNldCB0byBBRVMsIGxldCBpdCBwYXNzIHdpdGhvdXQgcXVlc3Rpb24uCi0JCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIFRLSVAsIHdlIG11c3QgZmluZCBvbmUgbWF0ZWNoZWQKLQkJCQkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgJiYKLQkJCQkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEyLlBhaXJDaXBoZXIpICYmCi0JCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4KSkKKwkJCQkJLyogY2hlY2sgcGFpcndpc2UgY2lwaGVyLCBza2lwIGlmIG5vbmUgbWF0Y2hlZCAqLworCQkJCQkvKiBJZiBwcm9maWxlIHNldCB0byBBRVMsIGxldCBpdCBwYXNzIHdpdGhvdXQgcXVlc3Rpb24uICovCisJCQkJCS8qIElmIHByb2ZpbGUgc2V0IHRvIFRLSVAsIHdlIG11c3QgZmluZCBvbmUgbWF0ZWNoZWQgKi8KKwkJCQkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0KKwkJCQkJICAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPQorCQkJCQkJcEluQnNzLT5XUEEyLlBhaXJDaXBoZXIpCisJCQkJCSAgICAmJiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9CisJCQkJCQlwSW5Cc3MtPldQQTIuUGFpckNpcGhlckF1eCkpCiAJCQkJCQljb250aW51ZTsKIAkJCQl9CiAJCQl9Ci0JCQkvLyBCc3MgVHlwZSBtYXRjaGVkLCBTU0lEIG1hdGNoZWQuCi0JCQkvLyBXZSB3aWxsIGNoZWNrIHdlcHN0YXR1cyBmb3IgcXVhbGlmaWNhdGlvbiBCc3MKLQkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldlcFN0YXR1cykKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlN0YUNmZy5XZXBTdGF0dXM9JWQsIHdoaWxlIHBJbkJzcy0+V2VwU3RhdHVzPSVkXG4iLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIHBJbkJzcy0+V2VwU3RhdHVzKSk7Ci0JCQkJLy8KLQkJCQkvLyBGb3IgdGhlIFNFU3YyIGNhc2UsIHdlIHdpbGwgbm90IHF1YWxpZnkgV2VwU3RhdHVzLgotCQkJCS8vCisJCQkvKiBCc3MgVHlwZSBtYXRjaGVkLCBTU0lEIG1hdGNoZWQuICovCisJCQkvKiBXZSB3aWxsIGNoZWNrIHdlcHN0YXR1cyBmb3IgcXVhbGlmaWNhdGlvbiBCc3MgKi8KKwkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldlcFN0YXR1cykgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJTdGFDZmcuV2VwU3RhdHVzPSVkLCB3aGlsZSBwSW5Cc3MtPldlcFN0YXR1cz0lZFxuIiwKKwkJCQkJICBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsCisJCQkJCSAgcEluQnNzLT5XZXBTdGF0dXMpKTsKKwkJCQkvKiAqLworCQkJCS8qIEZvciB0aGUgU0VTdjIgY2FzZSwgd2Ugd2lsbCBub3QgcXVhbGlmeSBXZXBTdGF0dXMuICovCisJCQkJLyogKi8KIAkJCQlpZiAoIXBJbkJzcy0+YlNFUykKIAkJCQkJY29udGludWU7CiAJCQl9Ci0KLQkJCS8vIFNpbmNlIHRoZSBBUCBpcyB1c2luZyBoaWRkZW4gU1NJRCwgYW5kIHdlIGFyZSB0cnlpbmcgdG8gY29ubmVjdCB0byBBTlkKLQkJCS8vIEl0IGRlZmluaXRlbHkgd2lsbCBmYWlsLiBTbywgc2tpcCBpdC4KLQkJCS8vIENDWCBhbHNvIHJlcXVpcmUgbm90IGV2ZW4gdHJ5IHRvIGNvbm5lY3QgaXQhIQorCQkJLyogU2luY2UgdGhlIEFQIGlzIHVzaW5nIGhpZGRlbiBTU0lELCBhbmQgd2UgYXJlIHRyeWluZyB0byBjb25uZWN0IHRvIEFOWSAqLworCQkJLyogSXQgZGVmaW5pdGVseSB3aWxsIGZhaWwuIFNvLCBza2lwIGl0LiAqLworCQkJLyogQ0NYIGFsc28gcmVxdWlyZSBub3QgZXZlbiB0cnkgdG8gY29ubmVjdCBpdCEgKi8KIAkJCWlmIChTc2lkTGVuID09IDApCiAJCQkJY29udGludWU7CiAKLQkJCS8vIElmIGJvdGggc3RhdGlvbiBhbmQgQVAgdXNlIDQwTUh6LCBzdGlsbCBuZWVkIHRvIGNoZWNrIGlmIHRoZSA0ME1IWiBiYW5kJ3MgbGVnYWxpdHkgaW4gbXkgY291bnRyeSByZWdpb24KLQkJCS8vIElmIHRoaXMgNDBNSHogd2lkZWJhbmQgaXMgbm90IGFsbG93ZWQgaW4gbXkgY291bnRyeSBsaXN0LCB1c2UgYmFuZHdpZHRoIDIwTUhaIGluc3RlYWQsCisJCQkvKiBJZiBib3RoIHN0YXRpb24gYW5kIEFQIHVzZSA0ME1Ieiwgc3RpbGwgbmVlZCB0byBjaGVjayBpZiB0aGUgNDBNSFogYmFuZCdzIGxlZ2FsaXR5IGluIG15IGNvdW50cnkgcmVnaW9uICovCisJCQkvKiBJZiB0aGlzIDQwTUh6IHdpZGViYW5kIGlzIG5vdCBhbGxvd2VkIGluIG15IGNvdW50cnkgbGlzdCwgdXNlIGJhbmR3aWR0aCAyME1IWiBpbnN0ZWFkLCAqLwogCQkJaWYgKChwSW5Cc3MtPkNlbnRyYWxDaGFubmVsICE9IHBJbkJzcy0+Q2hhbm5lbCkgJiYKLQkJCQkocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKSkKLQkJCXsKLQkJCQlpZiAoUlRNUENoZWNrQ2hhbm5lbChwQWQsIHBJbkJzcy0+Q2VudHJhbENoYW5uZWwsIHBJbkJzcy0+Q2hhbm5lbCkgPT0gRkFMU0UpCi0JCQkJewotCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPSBCV18yMDsKKwkJCSAgICAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09CisJCQkgICAgIEJXXzQwKSkgeworCQkJCWlmIChSVE1QQ2hlY2tDaGFubmVsCisJCQkJICAgIChwQWQsIHBJbkJzcy0+Q2VudHJhbENoYW5uZWwsCisJCQkJICAgICBwSW5Cc3MtPkNoYW5uZWwpID09IEZBTFNFKSB7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC4KKwkJCQkJICAgIEJXID0gQldfMjA7CiAJCQkJCVNldENvbW1vbkhUKHBBZCk7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9IEJXXzQwOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlpZiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCA9PSBCQU5EX1dJRFRIXzIwKQotCQkJCQl7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC4KKwkJCQkJICAgIEJXID0gQldfNDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS4KKwkJCQkJICAgIENoYW5uZWxXaWR0aCA9PSBCQU5EX1dJRFRIXzIwKSB7CiAJCQkJCQlTZXRDb21tb25IVChwQWQpOwogCQkJCQl9CiAJCQkJfQogCQkJfQotCi0JCQkvLyBjb3B5IG1hdGNoaW5nIEJTUyBmcm9tIEluVGFiIHRvIE91dFRhYgotCQkJTmRpc01vdmVNZW1vcnkocE91dEJzcywgcEluQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCQkvKiBjb3B5IG1hdGNoaW5nIEJTUyBmcm9tIEluVGFiIHRvIE91dFRhYiAqLworCQkJTmRpc01vdmVNZW1vcnkocE91dEJzcywgcEluQnNzLCBzaXplb2Yoc3RydWN0IHJ0X2Jzc19lbnRyeSkpOwogCiAJCQlPdXRUYWItPkJzc05yKys7Ci0JCX0KLQkJZWxzZSBpZiAoKHBJbkJzcy0+QnNzVHlwZSA9PSBwQWQtPlN0YUNmZy5Cc3NUeXBlKSAmJiAoU3NpZExlbiA9PSAwKSkKLQkJewotCQkJQlNTX0VOVFJZICpwT3V0QnNzID0gJk91dFRhYi0+QnNzRW50cnlbT3V0VGFiLT5Cc3NOcl07CisJCX0gZWxzZSBpZiAoKHBJbkJzcy0+QnNzVHlwZSA9PSBwQWQtPlN0YUNmZy5Cc3NUeXBlKQorCQkJICAgJiYgKFNzaWRMZW4gPT0gMCkpIHsKKwkJCXN0cnVjdCBydF9ic3NfZW50cnkgKnBPdXRCc3MgPSAmT3V0VGFiLT5Cc3NFbnRyeVtPdXRUYWItPkJzc05yXTsKIAotCQkJLy8gMi40Ry81RyBOIG9ubHkgbW9kZQorCQkJLyogMi40Ry81RyBOIG9ubHkgbW9kZSAqLwogCQkJaWYgKChwSW5Cc3MtPkh0Q2FwYWJpbGl0eUxlbiA9PSAwKSAmJgotCQkJCSgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzJfNEcpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKSkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQSBpcyBpbiBOLW9ubHkgTW9kZSwgdGhpcyBBUCBkb24ndCBoYXZlIEh0IGNhcGFiaWxpdHkgaW4gQmVhY29uLlxuIikpOworCQkJICAgICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzJfNEcpCisJCQkgICAgIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKSkgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJTVEEgaXMgaW4gTi1vbmx5IE1vZGUsIHRoaXMgQVAgZG9uJ3QgaGF2ZSBIdCBjYXBhYmlsaXR5IGluIEJlYWNvbi5cbiIpKTsKIAkJCQljb250aW51ZTsKIAkJCX0KLQotCQkJLy8gTmV3IGZvciBXUEEyCi0JCQkvLyBDaGVjayB0aGUgQXV0aG1vZGUgZmlyc3QKLQkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0JCQl7Ci0JCQkJLy8gQ2hlY2sgQXV0aE1vZGUgYW5kIEF1dGhNb2RlQXV4IGZvciBtYXRjaGluZywgaW4gY2FzZSBBUCBzdXBwb3J0IGR1YWwtbW9kZQotCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gcEluQnNzLT5BdXRoTW9kZSkgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IHBJbkJzcy0+QXV0aE1vZGVBdXgpKQotCQkJCQkvLyBOb25lIG1hdGNoZWQKKwkJCS8qIE5ldyBmb3IgV1BBMiAqLworCQkJLyogQ2hlY2sgdGhlIEF1dGhtb2RlIGZpcnN0ICovCisJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB7CisJCQkJLyogQ2hlY2sgQXV0aE1vZGUgYW5kIEF1dGhNb2RlQXV4IGZvciBtYXRjaGluZywgaW4gY2FzZSBBUCBzdXBwb3J0IGR1YWwtbW9kZSAqLworCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gcEluQnNzLT5BdXRoTW9kZSkKKwkJCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9CisJCQkJCXBJbkJzcy0+QXV0aE1vZGVBdXgpKQorCQkJCQkvKiBOb25lIG1hdGNoZWQgKi8KIAkJCQkJY29udGludWU7CiAKLQkJCQkvLyBDaGVjayBjaXBoZXIgc3VpdGUsIEFQIG11c3QgaGF2ZSBtb3JlIHNlY3VyZWQgY2lwaGVyIHRoYW4gc3RhdGlvbiBzZXR0aW5nCi0JCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQotCQkJCXsKLQkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgorCQkJCS8qIENoZWNrIGNpcGhlciBzdWl0ZSwgQVAgbXVzdCBoYXZlIG1vcmUgc2VjdXJlZCBjaXBoZXIgdGhhbiBzdGF0aW9uIHNldHRpbmcgKi8KKwkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09CisJCQkJICAgICBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCQkJICAgIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkJCQlOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKSB7CisJCQkJCS8qIElmIGl0J3Mgbm90IG1peGVkIG1vZGUsIHdlIHNob3VsZCBvbmx5IGxldCBCU1MgcGFzcyB3aXRoIHRoZSBzYW1lIGVuY3J5cHRpb24gKi8KIAkJCQkJaWYgKHBJbkJzcy0+V1BBLmJNaXhNb2RlID09IEZBTFNFKQotCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0KKwkJCQkJCSAgICBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikKIAkJCQkJCQljb250aW51ZTsKIAotCQkJCQkvLyBjaGVjayBncm91cCBjaXBoZXIKLQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA8IHBJbkJzcy0+V1BBLkdyb3VwQ2lwaGVyKQorCQkJCQkvKiBjaGVjayBncm91cCBjaXBoZXIgKi8KKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA8CisJCQkJCSAgICBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikKIAkJCQkJCWNvbnRpbnVlOwogCi0JCQkJCS8vIGNoZWNrIHBhaXJ3aXNlIGNpcGhlciwgc2tpcCBpZiBub25lIG1hdGNoZWQKLQkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gQUVTLCBsZXQgaXQgcGFzcyB3aXRob3V0IHF1ZXN0aW9uLgotCQkJCQkvLyBJZiBwcm9maWxlIHNldCB0byBUS0lQLCB3ZSBtdXN0IGZpbmQgb25lIG1hdGVjaGVkCi0JCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCi0JCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBLlBhaXJDaXBoZXIpICYmCi0JCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBLlBhaXJDaXBoZXJBdXgpKQorCQkJCQkvKiBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkICovCisJCQkJCS8qIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4gKi8KKwkJCQkJLyogSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZCAqLworCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PQorCQkJCQkgICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCQkJCSAgICAmJiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9CisJCQkJCQlwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyKQorCQkJCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPQorCQkJCQkJcEluQnNzLT5XUEEuUGFpckNpcGhlckF1eCkpCiAJCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKLQkJCQl7Ci0JCQkJCS8vIElmIGl0J3Mgbm90IG1peGVkIG1vZGUsIHdlIHNob3VsZCBvbmx5IGxldCBCU1MgcGFzcyB3aXRoIHRoZSBzYW1lIGVuY3J5cHRpb24KKwkJCQl9IGVsc2UKKwkJCQkgICAgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkJCQkgTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKwkJCQkJfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09CisJCQkJCSAgICBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkgeworCQkJCQkvKiBJZiBpdCdzIG5vdCBtaXhlZCBtb2RlLCB3ZSBzaG91bGQgb25seSBsZXQgQlNTIHBhc3Mgd2l0aCB0aGUgc2FtZSBlbmNyeXB0aW9uICovCiAJCQkJCWlmIChwSW5Cc3MtPldQQTIuYk1peE1vZGUgPT0gRkFMU0UpCi0JCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBMi5Hcm91cENpcGhlcikKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0KKwkJCQkJCSAgICBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCiAJCQkJCQkJY29udGludWU7CiAKLQkJCQkJLy8gY2hlY2sgZ3JvdXAgY2lwaGVyCi0JCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPCBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCisJCQkJCS8qIGNoZWNrIGdyb3VwIGNpcGhlciAqLworCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDwKKwkJCQkJICAgIHBJbkJzcy0+V1BBMi5Hcm91cENpcGhlcikKIAkJCQkJCWNvbnRpbnVlOwogCi0JCQkJCS8vIGNoZWNrIHBhaXJ3aXNlIGNpcGhlciwgc2tpcCBpZiBub25lIG1hdGNoZWQKLQkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gQUVTLCBsZXQgaXQgcGFzcyB3aXRob3V0IHF1ZXN0aW9uLgotCQkJCQkvLyBJZiBwcm9maWxlIHNldCB0byBUS0lQLCB3ZSBtdXN0IGZpbmQgb25lIG1hdGVjaGVkCi0JCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCi0JCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBMi5QYWlyQ2lwaGVyKSAmJgotCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuUGFpckNpcGhlckF1eCkpCisJCQkJCS8qIGNoZWNrIHBhaXJ3aXNlIGNpcGhlciwgc2tpcCBpZiBub25lIG1hdGNoZWQgKi8KKwkJCQkJLyogSWYgcHJvZmlsZSBzZXQgdG8gQUVTLCBsZXQgaXQgcGFzcyB3aXRob3V0IHF1ZXN0aW9uLiAqLworCQkJCQkvKiBJZiBwcm9maWxlIHNldCB0byBUS0lQLCB3ZSBtdXN0IGZpbmQgb25lIG1hdGVjaGVkICovCisJCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09CisJCQkJCSAgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJCQkJICAgICYmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0KKwkJCQkJCXBJbkJzcy0+V1BBMi5QYWlyQ2lwaGVyKQorCQkJCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPQorCQkJCQkJcEluQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXgpKQogCQkJCQkJY29udGludWU7CiAJCQkJfQogCQkJfQotCQkJLy8gQnNzIFR5cGUgbWF0Y2hlZCwgU1NJRCBtYXRjaGVkLgotCQkJLy8gV2Ugd2lsbCBjaGVjayB3ZXBzdGF0dXMgZm9yIHF1YWxpZmljYXRpb24gQnNzCisJCQkvKiBCc3MgVHlwZSBtYXRjaGVkLCBTU0lEIG1hdGNoZWQuICovCisJCQkvKiBXZSB3aWxsIGNoZWNrIHdlcHN0YXR1cyBmb3IgcXVhbGlmaWNhdGlvbiBCc3MgKi8KIAkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldlcFN0YXR1cykKLQkJCQkJY29udGludWU7CisJCQkJY29udGludWU7CiAKLQkJCS8vIElmIGJvdGggc3RhdGlvbiBhbmQgQVAgdXNlIDQwTUh6LCBzdGlsbCBuZWVkIHRvIGNoZWNrIGlmIHRoZSA0ME1IWiBiYW5kJ3MgbGVnYWxpdHkgaW4gbXkgY291bnRyeSByZWdpb24KLQkJCS8vIElmIHRoaXMgNDBNSHogd2lkZWJhbmQgaXMgbm90IGFsbG93ZWQgaW4gbXkgY291bnRyeSBsaXN0LCB1c2UgYmFuZHdpZHRoIDIwTUhaIGluc3RlYWQsCisJCQkvKiBJZiBib3RoIHN0YXRpb24gYW5kIEFQIHVzZSA0ME1Ieiwgc3RpbGwgbmVlZCB0byBjaGVjayBpZiB0aGUgNDBNSFogYmFuZCdzIGxlZ2FsaXR5IGluIG15IGNvdW50cnkgcmVnaW9uICovCisJCQkvKiBJZiB0aGlzIDQwTUh6IHdpZGViYW5kIGlzIG5vdCBhbGxvd2VkIGluIG15IGNvdW50cnkgbGlzdCwgdXNlIGJhbmR3aWR0aCAyME1IWiBpbnN0ZWFkLCAqLwogCQkJaWYgKChwSW5Cc3MtPkNlbnRyYWxDaGFubmVsICE9IHBJbkJzcy0+Q2hhbm5lbCkgJiYKLQkJCQkocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKSkKLQkJCXsKLQkJCQlpZiAoUlRNUENoZWNrQ2hhbm5lbChwQWQsIHBJbkJzcy0+Q2VudHJhbENoYW5uZWwsIHBJbkJzcy0+Q2hhbm5lbCkgPT0gRkFMU0UpCi0JCQkJewotCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPSBCV18yMDsKKwkJCSAgICAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09CisJCQkgICAgIEJXXzQwKSkgeworCQkJCWlmIChSVE1QQ2hlY2tDaGFubmVsCisJCQkJICAgIChwQWQsIHBJbkJzcy0+Q2VudHJhbENoYW5uZWwsCisJCQkJICAgICBwSW5Cc3MtPkNoYW5uZWwpID09IEZBTFNFKSB7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC4KKwkJCQkJICAgIEJXID0gQldfMjA7CiAJCQkJCVNldENvbW1vbkhUKHBBZCk7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9IEJXXzQwOworCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuCisJCQkJCSAgICBCVyA9IEJXXzQwOwogCQkJCX0KIAkJCX0KLQotCQkJLy8gY29weSBtYXRjaGluZyBCU1MgZnJvbSBJblRhYiB0byBPdXRUYWIKLQkJCU5kaXNNb3ZlTWVtb3J5KHBPdXRCc3MsIHBJbkJzcywgc2l6ZW9mKEJTU19FTlRSWSkpOworCQkJLyogY29weSBtYXRjaGluZyBCU1MgZnJvbSBJblRhYiB0byBPdXRUYWIgKi8KKwkJCU5kaXNNb3ZlTWVtb3J5KHBPdXRCc3MsIHBJbkJzcywgc2l6ZW9mKHN0cnVjdCBydF9ic3NfZW50cnkpKTsKIAogCQkJT3V0VGFiLT5Cc3NOcisrOwogCQl9CkBAIC00MDcxLDM3OCArNDE3OSwzNjYgQEAKIAlCc3NUYWJsZVNvcnRCeVJzc2koT3V0VGFiKTsKIH0KIAotCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVZPSUQgQnNzVGFibGVTb3J0QnlSc3NpKAotCUlOIE9VVCBCU1NfVEFCTEUgKk91dFRhYikKKy8qIElSUUwgPSBESVNQQVRDSF9MRVZFTCAqLwordm9pZCBCc3NUYWJsZVNvcnRCeVJzc2koc3RydWN0IHJ0X2Jzc190YWJsZSAqT3V0VGFiKQogewotCUlOVCAJICBpLCBqOwotCUJTU19FTlRSWSBUbXBCc3M7CisJaW50IGksIGo7CisJc3RydWN0IHJ0X2Jzc19lbnRyeSBUbXBCc3M7CiAKLQlmb3IgKGkgPSAwOyBpIDwgT3V0VGFiLT5Cc3NOciAtIDE7IGkrKykKLQl7Ci0JCWZvciAoaiA9IGkrMTsgaiA8IE91dFRhYi0+QnNzTnI7IGorKykKLQkJewotCQkJaWYgKE91dFRhYi0+QnNzRW50cnlbal0uUnNzaSA+IE91dFRhYi0+QnNzRW50cnlbaV0uUnNzaSkKLQkJCXsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmVG1wQnNzLCAmT3V0VGFiLT5Cc3NFbnRyeVtqXSwgc2l6ZW9mKEJTU19FTlRSWSkpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZPdXRUYWItPkJzc0VudHJ5W2pdLCAmT3V0VGFiLT5Cc3NFbnRyeVtpXSwgc2l6ZW9mKEJTU19FTlRSWSkpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZPdXRUYWItPkJzc0VudHJ5W2ldLCAmVG1wQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJZm9yIChpID0gMDsgaSA8IE91dFRhYi0+QnNzTnIgLSAxOyBpKyspIHsKKwkJZm9yIChqID0gaSArIDE7IGogPCBPdXRUYWItPkJzc05yOyBqKyspIHsKKwkJCWlmIChPdXRUYWItPkJzc0VudHJ5W2pdLlJzc2kgPiBPdXRUYWItPkJzc0VudHJ5W2ldLlJzc2kpIHsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmVG1wQnNzLCAmT3V0VGFiLT5Cc3NFbnRyeVtqXSwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfYnNzX2VudHJ5KSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJk91dFRhYi0+QnNzRW50cnlbal0sCisJCQkJCSAgICAgICAmT3V0VGFiLT5Cc3NFbnRyeVtpXSwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfYnNzX2VudHJ5KSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJk91dFRhYi0+QnNzRW50cnlbaV0sICZUbXBCc3MsCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2Jzc19lbnRyeSkpOwogCQkJfQogCQl9CiAJfQogfQogCi1WT0lEIEJzc0NpcGhlclBhcnNlKAotCUlOIE9VVAlQQlNTX0VOVFJZCXBCc3MpCit2b2lkIEJzc0NpcGhlclBhcnNlKHN0cnVjdCBydF9ic3NfZW50cnkgKnBCc3MpCiB7Ci0JUEVJRF9TVFJVQ1QgCQkgcEVpZDsKLQlQVUNIQVIJCQkJcFRtcDsKLQlQUlNOX0lFX0hFQURFUl9TVFJVQ1QJCQlwUnNuSGVhZGVyOwotCVBDSVBIRVJfU1VJVEVfU1RSVUNUCQkJcENpcGhlcjsKLQlQQUtNX1NVSVRFX1NUUlVDVAkJCQlwQUtNOwotCVVTSE9SVAkJCQkJCQlDb3VudDsKLQlJTlQJCQkJCQkJCUxlbmd0aDsKLQlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlUbXBDaXBoZXI7CisJc3RydWN0IHJ0X2VpZCAqIHBFaWQ7CisJdTggKnBUbXA7CisJc3RydWN0IHJ0X3Jzbl9pZV9oZWFkZXIgKiBwUnNuSGVhZGVyOworCXN0cnVjdCBydF9jaXBoZXJfc3VpdGVfc3RydWN0ICogcENpcGhlcjsKKwlzdHJ1Y3QgcnRfYWttX3N1aXRlICogcEFLTTsKKwl1MTYgQ291bnQ7CisJaW50IExlbmd0aDsKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUyBUbXBDaXBoZXI7CiAKLQkvLwotCS8vIFdlcFN0YXR1cyB3aWxsIGJlIHJlc2V0IGxhdGVyLCBpZiBBUCBhbm5vdW5jZSBUS0lQIG9yIEFFUyBvbiB0aGUgYmVhY29uIGZyYW1lLgotCS8vCi0JaWYgKHBCc3MtPlByaXZhY3kpCi0JewotCQlwQnNzLT5XZXBTdGF0dXMgCT0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJLyogKi8KKwkvKiBXZXBTdGF0dXMgd2lsbCBiZSByZXNldCBsYXRlciwgaWYgQVAgYW5ub3VuY2UgVEtJUCBvciBBRVMgb24gdGhlIGJlYWNvbiBmcmFtZS4gKi8KKwkvKiAqLworCWlmIChwQnNzLT5Qcml2YWN5KSB7CisJCXBCc3MtPldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCX0gZWxzZSB7CisJCXBCc3MtPldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKIAl9Ci0JZWxzZQotCXsKLQkJcEJzcy0+V2VwU3RhdHVzIAk9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQl9Ci0JLy8gU2V0IGRlZmF1bHQgdG8gZGlzYWJsZSAmIG9wZW4gYXV0aGVudGljYXRpb24gYmVmb3JlIHBhcnNpbmcgdmFyaWFibGUgSUUKLQlwQnNzLT5BdXRoTW9kZQkJPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOwotCXBCc3MtPkF1dGhNb2RlQXV4CT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKwkvKiBTZXQgZGVmYXVsdCB0byBkaXNhYmxlICYgb3BlbiBhdXRoZW50aWNhdGlvbiBiZWZvcmUgcGFyc2luZyB2YXJpYWJsZSBJRSAqLworCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKwlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CiAKLQkvLyBJbml0IFdQQSBzZXR0aW5nCi0JcEJzcy0+V1BBLlBhaXJDaXBoZXIJPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJLyogSW5pdCBXUEEgc2V0dGluZyAqLworCXBCc3MtPldQQS5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwogCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCXBCc3MtPldQQS5Hcm91cENpcGhlcgk9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CiAJcEJzcy0+V1BBLlJzbkNhcGFiaWxpdHkgPSAwOwotCXBCc3MtPldQQS5iTWl4TW9kZQkJPSBGQUxTRTsKKwlwQnNzLT5XUEEuYk1peE1vZGUgPSBGQUxTRTsKIAotCS8vIEluaXQgV1BBMiBzZXR0aW5nCi0JcEJzcy0+V1BBMi5QYWlyQ2lwaGVyCSA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwkvKiBJbml0IFdQQTIgc2V0dGluZyAqLworCXBCc3MtPldQQTIuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKIAlwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXggPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0JcEJzcy0+V1BBMi5Hcm91cENpcGhlcgkgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKIAlwQnNzLT5XUEEyLlJzbkNhcGFiaWxpdHkgPSAwOwotCXBCc3MtPldQQTIuYk1peE1vZGUgCSA9IEZBTFNFOworCXBCc3MtPldQQTIuYk1peE1vZGUgPSBGQUxTRTsKIAorCUxlbmd0aCA9IChpbnQpcEJzcy0+VmFySUVMZW47CiAKLQlMZW5ndGggPSAoSU5UKSBwQnNzLT5WYXJJRUxlbjsKLQotCXdoaWxlIChMZW5ndGggPiAwKQotCXsKLQkJLy8gUGFyc2UgY2lwaGVyIHN1aXRlIGJhc2Ugb24gV1BBMSAmIFdQQTIsIHRoZXkgc2hvdWxkIGJlIHBhcnNlZCBkaWZmZXJlbnRseQotCQlwVG1wID0gKChQVUNIQVIpIHBCc3MtPlZhcklFcykgKyBwQnNzLT5WYXJJRUxlbiAtIExlbmd0aDsKLQkJcEVpZCA9IChQRUlEX1NUUlVDVCkgcFRtcDsKLQkJc3dpdGNoIChwRWlkLT5FaWQpCi0JCXsKLQkJCWNhc2UgSUVfV1BBOgotCQkJCS8vUGFyc2UgQ2lzY28gSUVfV1BBIChMRUFQLCBDQ0tNLCBldGMuKQotCQkJCWlmICggTmRpc0VxdWFsTWVtb3J5KChwVG1wKzgpLCBDSVNDT19PVUksIDMpKQotCQkJCXsKLQkJCQkJcFRtcCAgICs9IDExOwotCQkJCQlzd2l0Y2ggKCpwVG1wKQotCQkJCQl7Ci0JCQkJCQljYXNlIDE6Ci0JCQkJCQljYXNlIDU6CS8vIEFsdGhvdWdoIFdFUCBpcyBub3QgYWxsb3dlZCBpbiBXUEEgcmVsYXRlZCBhdXRoIG1vZGUsIHdlIHBhcnNlIGl0IGFueXdheQotCQkJCQkJCXBCc3MtPldlcFN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7Ci0JCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOwotCQkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDI6Ci0JCQkJCQkJcEJzcy0+V2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLQkJCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7Ci0JCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgNDoKLQkJCQkJCQlwQnNzLT5XZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotCQkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKLQkJCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCi0JCQkJCS8vIGlmIENpc2NvIElFX1dQQSwgYnJlYWsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgU0VTX09VSSwgMykgJiYgKHBFaWQtPkxlbiA9PSA3KSkKLQkJCQl7Ci0JCQkJCXBCc3MtPmJTRVMgPSBUUlVFOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXUEFfT1VJLCA0KSAhPSAxKQotCQkJCXsKLQkJCQkJLy8gaWYgdW5zdXBwb3J0ZWQgdmVuZG9yIHNwZWNpZmljIElFCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvLyBTa2lwIE9VSSwgdmVyc2lvbiwgYW5kIG11bHRpY2FzdCBzdWl0ZQotCQkJCS8vIFRoaXMgcGFydCBzaG91bGQgYmUgaW1wcm92ZWQgaW4gdGhlIGZ1dHVyZSB3aGVuIEFQIHN1cHBvcnRlZCBtdWx0aXBsZSBjaXBoZXIgc3VpdGUuCi0JCQkJLy8gRm9yIG5vdywgaXQncyBPSyBzaW5jZSBhbG1vc3QgYWxsIEFQcyBoYXZlIGZpeGVkIGNpcGhlciBzdWl0ZSBzdXBwb3J0ZWQuCi0JCQkJLy8gcFRtcCA9IChQVUNIQVIpIHBFaWQtPk9jdGV0OwotCQkJCXBUbXAgICArPSAxMTsKLQotCQkJCS8vIENpcGhlciBTdWl0ZSBTZWxlY3RvcnMgZnJvbSBTcGVjIFA4MDIuMTFpL0QzLjIgUDI2LgotCQkJCS8vCVZhbHVlCSAgIE1lYW5pbmcKLQkJCQkvLwkwCQkJTm9uZQotCQkJCS8vCTEJCQlXRVAtNDAKLQkJCQkvLwkyCQkJVGtpcAotCQkJCS8vCTMJCQlXUkFQCi0JCQkJLy8JNAkJCUFFUwotCQkJCS8vCTUJCQlXRVAtMTA0Ci0JCQkJLy8gUGFyc2UgZ3JvdXAgY2lwaGVyCi0JCQkJc3dpdGNoICgqcFRtcCkKLQkJCQl7Ci0JCQkJCWNhc2UgMToKLQkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDU6Ci0JCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgMjoKLQkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSA0OgotCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8vIG51bWJlciBvZiB1bmljYXN0IHN1aXRlCi0JCQkJcFRtcCAgICs9IDE7Ci0KLQkJCQkvLyBza2lwIGFsbCB1bmljYXN0IGNpcGhlciBzdWl0ZXMKLQkJCQkvL0NvdW50ID0gKihQVVNIT1JUKSBwVG1wOwotCQkJCUNvdW50ID0gKHBUbXBbMV08PDgpICsgcFRtcFswXTsKLQkJCQlwVG1wICAgKz0gc2l6ZW9mKFVTSE9SVCk7Ci0KLQkJCQkvLyBQYXJzaW5nIGFsbCB1bmljYXN0IGNpcGhlciBzdWl0ZQotCQkJCXdoaWxlIChDb3VudCA+IDApCi0JCQkJewotCQkJCQkvLyBTa2lwIE9VSQotCQkJCQlwVG1wICs9IDM7Ci0JCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQkJCQkJc3dpdGNoICgqcFRtcCkKLQkJCQkJewotCQkJCQkJY2FzZSAxOgotCQkJCQkJY2FzZSA1OiAvLyBBbHRob3VnaCBXRVAgaXMgbm90IGFsbG93ZWQgaW4gV1BBIHJlbGF0ZWQgYXV0aCBtb2RlLCB3ZSBwYXJzZSBpdCBhbnl3YXkKLQkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAyOgotCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDQ6Ci0JCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKFRtcENpcGhlciA+IHBCc3MtPldQQS5QYWlyQ2lwaGVyKQotCQkJCQl7Ci0JCQkJCQkvLyBNb3ZlIHRoZSBsb3dlciBjaXBoZXIgc3VpdGUgdG8gUGFpckNpcGhlckF1eAotCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBwQnNzLT5XUEEuUGFpckNpcGhlcjsKLQkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyCT0gVG1wQ2lwaGVyOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBUbXBDaXBoZXI7Ci0JCQkJCX0KLQkJCQkJcFRtcCsrOwotCQkJCQlDb3VudC0tOwotCQkJCX0KLQotCQkJCS8vIDQuIGdldCBBS00gc3VpdGUgY291bnRzCi0JCQkJLy9Db3VudAk9ICooUFVTSE9SVCkgcFRtcDsKLQkJCQlDb3VudCA9IChwVG1wWzFdPDw4KSArIHBUbXBbMF07Ci0JCQkJcFRtcCAgICs9IHNpemVvZihVU0hPUlQpOwotCQkJCXBUbXAgICArPSAzOwotCi0JCQkJc3dpdGNoICgqcFRtcCkKLQkJCQl7Ci0JCQkJCWNhc2UgMToKLQkJCQkJCS8vIFNldCBBUCBzdXBwb3J0IFdQQSBtb2RlCi0JCQkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKLQkJCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDI6Ci0JCQkJCQkvLyBTZXQgQVAgc3VwcG9ydCBXUEEgbW9kZQotCQkJCQkJaWYgKHBCc3MtPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCi0JCQkJCQkJcEJzcy0+QXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlwVG1wICAgKz0gMTsKLQotCQkJCS8vIEZpeGVkIGZvciBXUEEtTm9uZQotCQkJCWlmIChwQnNzLT5Cc3NUeXBlID09IEJTU19BREhPQykKLQkJCQl7Ci0JCQkJCXBCc3MtPkF1dGhNb2RlCSAgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOwotCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7Ci0JCQkJCXBCc3MtPldlcFN0YXR1cyAgID0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOwotCQkJCQlpZiAocEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQotCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBwQnNzLT5XUEEuR3JvdXBDaXBoZXI7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJcEJzcy0+V2VwU3RhdHVzICAgPSBwQnNzLT5XUEEuUGFpckNpcGhlcjsKLQotCQkJCS8vIENoZWNrIHRoZSBQYWlyICYgR3JvdXAsIGlmIGRpZmZlcmVudCwgdHVybiBvbiBtaXhlZCBtb2RlIGZsYWcKLQkJCQlpZiAocEJzcy0+V1BBLkdyb3VwQ2lwaGVyICE9IHBCc3MtPldQQS5QYWlyQ2lwaGVyKQotCQkJCQlwQnNzLT5XUEEuYk1peE1vZGUgPSBUUlVFOwotCisJd2hpbGUgKExlbmd0aCA+IDApIHsKKwkJLyogUGFyc2UgY2lwaGVyIHN1aXRlIGJhc2Ugb24gV1BBMSAmIFdQQTIsIHRoZXkgc2hvdWxkIGJlIHBhcnNlZCBkaWZmZXJlbnRseSAqLworCQlwVG1wID0gKCh1OCAqKXBCc3MtPlZhcklFcykgKyBwQnNzLT5WYXJJRUxlbiAtIExlbmd0aDsKKwkJcEVpZCA9IChzdHJ1Y3QgcnRfZWlkICopIHBUbXA7CisJCXN3aXRjaCAocEVpZC0+RWlkKSB7CisJCWNhc2UgSUVfV1BBOgorCQkJaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgU0VTX09VSSwgMykKKwkJCSAgICAmJiAocEVpZC0+TGVuID09IDcpKSB7CisJCQkJcEJzcy0+YlNFUyA9IFRSVUU7CiAJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkgIT0KKwkJCQkgICAxKSB7CisJCQkJLyogaWYgdW5zdXBwb3J0ZWQgdmVuZG9yIHNwZWNpZmljIElFICovCisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBTa2lwIE9VSSwgdmVyc2lvbiwgYW5kIG11bHRpY2FzdCBzdWl0ZSAqLworCQkJLyogVGhpcyBwYXJ0IHNob3VsZCBiZSBpbXByb3ZlZCBpbiB0aGUgZnV0dXJlIHdoZW4gQVAgc3VwcG9ydGVkIG11bHRpcGxlIGNpcGhlciBzdWl0ZS4gKi8KKwkJCS8qIEZvciBub3csIGl0J3MgT0sgc2luY2UgYWxtb3N0IGFsbCBBUHMgaGF2ZSBmaXhlZCBjaXBoZXIgc3VpdGUgc3VwcG9ydGVkLiAqLworCQkJLyogcFRtcCA9ICh1OCAqKXBFaWQtPk9jdGV0OyAqLworCQkJcFRtcCArPSAxMTsKIAotCQkJY2FzZSBJRV9SU046Ci0JCQkJcFJzbkhlYWRlciA9IChQUlNOX0lFX0hFQURFUl9TVFJVQ1QpIHBUbXA7Ci0KLQkJCQkvLyAwLiBWZXJzaW9uIG11c3QgYmUgMQotCQkJCWlmIChsZTJjcHUxNihwUnNuSGVhZGVyLT5WZXJzaW9uKSAhPSAxKQotCQkJCQlicmVhazsKLQkJCQlwVG1wICAgKz0gc2l6ZW9mKFJTTl9JRV9IRUFERVJfU1RSVUNUKTsKLQotCQkJCS8vIDEuIENoZWNrIGdyb3VwIGNpcGhlcgotCQkJCXBDaXBoZXIgPSAoUENJUEhFUl9TVUlURV9TVFJVQ1QpIHBUbXA7Ci0JCQkJaWYgKCFSVE1QRXF1YWxNZW1vcnkocFRtcCwgUlNOX09VSSwgMykpCi0JCQkJCWJyZWFrOwotCi0JCQkJLy8gUGFyc2UgZ3JvdXAgY2lwaGVyCi0JCQkJc3dpdGNoIChwQ2lwaGVyLT5UeXBlKQotCQkJCXsKLQkJCQkJY2FzZSAxOgotCQkJCQkJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDU6Ci0JCQkJCQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDI6Ci0JCQkJCQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDQ6Ci0JCQkJCQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8vIHNldCB0byBjb3JyZWN0IG9mZnNldCBmb3IgbmV4dCBwYXJzaW5nCi0JCQkJcFRtcCAgICs9IHNpemVvZihDSVBIRVJfU1VJVEVfU1RSVUNUKTsKLQotCQkJCS8vIDIuIEdldCBwYWlyd2lzZSBjaXBoZXIgY291bnRzCi0JCQkJLy9Db3VudCA9ICooUFVTSE9SVCkgcFRtcDsKLQkJCQlDb3VudCA9IChwVG1wWzFdPDw4KSArIHBUbXBbMF07Ci0JCQkJcFRtcCAgICs9IHNpemVvZihVU0hPUlQpOwotCi0JCQkJLy8gMy4gR2V0IHBhaXJ3aXNlIGNpcGhlcgotCQkJCS8vIFBhcnNpbmcgYWxsIHVuaWNhc3QgY2lwaGVyIHN1aXRlCi0JCQkJd2hpbGUgKENvdW50ID4gMCkKLQkJCQl7Ci0JCQkJCS8vIFNraXAgT1VJCi0JCQkJCXBDaXBoZXIgPSAoUENJUEhFUl9TVUlURV9TVFJVQ1QpIHBUbXA7Ci0JCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQkJCQkJc3dpdGNoIChwQ2lwaGVyLT5UeXBlKQotCQkJCQl7Ci0JCQkJCQljYXNlIDE6Ci0JCQkJCQljYXNlIDU6IC8vIEFsdGhvdWdoIFdFUCBpcyBub3QgYWxsb3dlZCBpbiBXUEEgcmVsYXRlZCBhdXRoIG1vZGUsIHdlIHBhcnNlIGl0IGFueXdheQotCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDI6Ci0JCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgNDoKLQkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpZiAoVG1wQ2lwaGVyID4gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyKQotCQkJCQl7Ci0JCQkJCQkvLyBNb3ZlIHRoZSBsb3dlciBjaXBoZXIgc3VpdGUgdG8gUGFpckNpcGhlckF1eAotCQkJCQkJcEJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4ID0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyOwotCQkJCQkJcEJzcy0+V1BBMi5QYWlyQ2lwaGVyCSA9IFRtcENpcGhlcjsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCXBCc3MtPldQQTIuUGFpckNpcGhlckF1eCA9IFRtcENpcGhlcjsKLQkJCQkJfQotCQkJCQlwVG1wICs9IHNpemVvZihDSVBIRVJfU1VJVEVfU1RSVUNUKTsKLQkJCQkJQ291bnQtLTsKLQkJCQl9Ci0KLQkJCQkvLyA0LiBnZXQgQUtNIHN1aXRlIGNvdW50cwotCQkJCS8vQ291bnQJPSAqKFBVU0hPUlQpIHBUbXA7Ci0JCQkJQ291bnQgPSAocFRtcFsxXTw8OCkgKyBwVG1wWzBdOwotCQkJCXBUbXAgICArPSBzaXplb2YoVVNIT1JUKTsKLQotCQkJCS8vIDUuIEdldCBBS00gY2lwaGVycwotCQkJCXBBS00gPSAoUEFLTV9TVUlURV9TVFJVQ1QpIHBUbXA7Ci0JCQkJaWYgKCFSVE1QRXF1YWxNZW1vcnkocFRtcCwgUlNOX09VSSwgMykpCi0JCQkJCWJyZWFrOwotCi0JCQkJc3dpdGNoIChwQUtNLT5UeXBlKQotCQkJCXsKLQkJCQkJY2FzZSAxOgotCQkJCQkJLy8gU2V0IEFQIHN1cHBvcnQgV1BBIG1vZGUKLQkJCQkJCWlmIChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQotCQkJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKLQkJCQkJCWVsc2UKLQkJCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAyOgotCQkJCQkJLy8gU2V0IEFQIHN1cHBvcnQgV1BBIG1vZGUKLQkJCQkJCWlmIChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQotCQkJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKLQkJCQkJCWVsc2UKLQkJCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlwVG1wICAgKz0gKENvdW50ICogc2l6ZW9mKEFLTV9TVUlURV9TVFJVQ1QpKTsKLQotCQkJCS8vIEZpeGVkIGZvciBXUEEtTm9uZQotCQkJCWlmIChwQnNzLT5Cc3NUeXBlID09IEJTU19BREhPQykKLQkJCQl7Ci0JCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKLQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOwotCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9IHBCc3MtPldQQTIuUGFpckNpcGhlckF1eDsKLQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyCT0gcEJzcy0+V1BBMi5Hcm91cENpcGhlcjsKLQkJCQkJcEJzcy0+V2VwU3RhdHVzIAkJPSBwQnNzLT5XUEEuR3JvdXBDaXBoZXI7Ci0JCQkJCWlmIChwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0JCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9IHBCc3MtPldQQS5Hcm91cENpcGhlcjsKLQkJCQl9Ci0JCQkJcEJzcy0+V2VwU3RhdHVzICAgPSBwQnNzLT5XUEEyLlBhaXJDaXBoZXI7Ci0KLQkJCQkvLyA2LiBHZXQgUlNOIGNhcGFiaWxpdHkKLQkJCQkvL3BCc3MtPldQQTIuUnNuQ2FwYWJpbGl0eSA9ICooUFVTSE9SVCkgcFRtcDsKLQkJCQlwQnNzLT5XUEEyLlJzbkNhcGFiaWxpdHkgPSAocFRtcFsxXTw8OCkgKyBwVG1wWzBdOwotCQkJCXBUbXAgKz0gc2l6ZW9mKFVTSE9SVCk7Ci0KLQkJCQkvLyBDaGVjayB0aGUgUGFpciAmIEdyb3VwLCBpZiBkaWZmZXJlbnQsIHR1cm4gb24gbWl4ZWQgbW9kZSBmbGFnCi0JCQkJaWYgKHBCc3MtPldQQTIuR3JvdXBDaXBoZXIgIT0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyKQotCQkJCQlwQnNzLT5XUEEyLmJNaXhNb2RlID0gVFJVRTsKLQorCQkJLyogQ2lwaGVyIFN1aXRlIFNlbGVjdG9ycyBmcm9tIFNwZWMgUDgwMi4xMWkvRDMuMiBQMjYuICovCisJCQkvKiAgICAgIFZhbHVlICAgICAgTWVhbmluZyAqLworCQkJLyogICAgICAwICAgICAgICAgICAgICAgICAgICAgICBOb25lICovCisJCQkvKiAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgIFdFUC00MCAqLworCQkJLyogICAgICAyICAgICAgICAgICAgICAgICAgICAgICBUa2lwICovCisJCQkvKiAgICAgIDMgICAgICAgICAgICAgICAgICAgICAgIFdSQVAgKi8KKwkJCS8qICAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgQUVTICovCisJCQkvKiAgICAgIDUgICAgICAgICAgICAgICAgICAgICAgIFdFUC0xMDQgKi8KKwkJCS8qIFBhcnNlIGdyb3VwIGNpcGhlciAqLworCQkJc3dpdGNoICgqcFRtcCkgeworCQkJY2FzZSAxOgorCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9CisJCQkJICAgIE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNToKKwkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPQorCQkJCSAgICBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9CisJCQkJICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0KKwkJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6CiAJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBudW1iZXIgb2YgdW5pY2FzdCBzdWl0ZSAqLworCQkJcFRtcCArPSAxOworCisJCQkvKiBza2lwIGFsbCB1bmljYXN0IGNpcGhlciBzdWl0ZXMgKi8KKwkJCS8qQ291bnQgPSAqKHUxNiAqKXBUbXA7ICovCisJCQlDb3VudCA9IChwVG1wWzFdIDw8IDgpICsgcFRtcFswXTsKKwkJCXBUbXAgKz0gc2l6ZW9mKHUxNik7CisKKwkJCS8qIFBhcnNpbmcgYWxsIHVuaWNhc3QgY2lwaGVyIHN1aXRlICovCisJCQl3aGlsZSAoQ291bnQgPiAwKSB7CisJCQkJLyogU2tpcCBPVUkgKi8KKwkJCQlwVG1wICs9IDM7CisJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCQkJCXN3aXRjaCAoKnBUbXApIHsKKwkJCQljYXNlIDE6CisJCQkJY2FzZSA1OgkvKiBBbHRob3VnaCBXRVAgaXMgbm90IGFsbG93ZWQgaW4gV1BBIHJlbGF0ZWQgYXV0aCBtb2RlLCB3ZSBwYXJzZSBpdCBhbnl3YXkgKi8KKwkJCQkJVG1wQ2lwaGVyID0KKwkJCQkJICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMjoKKwkJCQkJVG1wQ2lwaGVyID0KKwkJCQkJICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNDoKKwkJCQkJVG1wQ2lwaGVyID0KKwkJCQkJICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAoVG1wQ2lwaGVyID4gcEJzcy0+V1BBLlBhaXJDaXBoZXIpIHsKKwkJCQkJLyogTW92ZSB0aGUgbG93ZXIgY2lwaGVyIHN1aXRlIHRvIFBhaXJDaXBoZXJBdXggKi8KKwkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPQorCQkJCQkgICAgcEJzcy0+V1BBLlBhaXJDaXBoZXI7CisJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyID0gVG1wQ2lwaGVyOworCQkJCX0gZWxzZSB7CisJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gVG1wQ2lwaGVyOworCQkJCX0KKwkJCQlwVG1wKys7CisJCQkJQ291bnQtLTsKKwkJCX0KKworCQkJLyogNC4gZ2V0IEFLTSBzdWl0ZSBjb3VudHMgKi8KKwkJCS8qQ291bnQgPSAqKHUxNiAqKXBUbXA7ICovCisJCQlDb3VudCA9IChwVG1wWzFdIDw8IDgpICsgcFRtcFswXTsKKwkJCXBUbXAgKz0gc2l6ZW9mKHUxNik7CisJCQlwVG1wICs9IDM7CisKKwkJCXN3aXRjaCAoKnBUbXApIHsKKwkJCWNhc2UgMToKKwkJCQkvKiBTZXQgQVAgc3VwcG9ydCBXUEEtZW50ZXJwcmlzZSBtb2RlICovCisJCQkJaWYgKHBCc3MtPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCisJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBOworCQkJCWVsc2UKKwkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPQorCQkJCQkgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCS8qIFNldCBBUCBzdXBwb3J0IFdQQS1QU0sgbW9kZSAqLworCQkJCWlmIChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorCQkJCQlwQnNzLT5BdXRoTW9kZSA9CisJCQkJCSAgICBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7CisJCQkJZWxzZQorCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9CisJCQkJCSAgICBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQkJcFRtcCArPSAxOworCisJCQkvKiBGaXhlZCBmb3IgV1BBLU5vbmUgKi8KKwkJCWlmIChwQnNzLT5Cc3NUeXBlID09IEJTU19BREhPQykgeworCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKwkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7CisJCQkJcEJzcy0+V2VwU3RhdHVzID0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOworCQkJCS8qIFBhdGNoZWQgYnVncyBmb3Igb2xkIGRyaXZlciAqLworCQkJCWlmIChwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9PQorCQkJCSAgICBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0KKwkJCQkJICAgIHBCc3MtPldQQS5Hcm91cENpcGhlcjsKKwkJCX0gZWxzZQorCQkJCXBCc3MtPldlcFN0YXR1cyA9IHBCc3MtPldQQS5QYWlyQ2lwaGVyOworCisJCQkvKiBDaGVjayB0aGUgUGFpciAmIEdyb3VwLCBpZiBkaWZmZXJlbnQsIHR1cm4gb24gbWl4ZWQgbW9kZSBmbGFnICovCisJCQlpZiAocEJzcy0+V1BBLkdyb3VwQ2lwaGVyICE9IHBCc3MtPldQQS5QYWlyQ2lwaGVyKQorCQkJCXBCc3MtPldQQS5iTWl4TW9kZSA9IFRSVUU7CisKKwkJCWJyZWFrOworCisJCWNhc2UgSUVfUlNOOgorCQkJcFJzbkhlYWRlciA9IChzdHJ1Y3QgcnRfcnNuX2llX2hlYWRlciAqKSBwVG1wOworCisJCQkvKiAwLiBWZXJzaW9uIG11c3QgYmUgMSAqLworCQkJaWYgKGxlMmNwdTE2KHBSc25IZWFkZXItPlZlcnNpb24pICE9IDEpCisJCQkJYnJlYWs7CisJCQlwVG1wICs9IHNpemVvZihzdHJ1Y3QgcnRfcnNuX2llX2hlYWRlcik7CisKKwkJCS8qIDEuIENoZWNrIGdyb3VwIGNpcGhlciAqLworCQkJcENpcGhlciA9IChzdHJ1Y3QgcnRfY2lwaGVyX3N1aXRlX3N0cnVjdCAqKSBwVG1wOworCQkJaWYgKCFSVE1QRXF1YWxNZW1vcnkocFRtcCwgUlNOX09VSSwgMykpCisJCQkJYnJlYWs7CisKKwkJCS8qIFBhcnNlIGdyb3VwIGNpcGhlciAqLworCQkJc3dpdGNoIChwQ2lwaGVyLT5UeXBlKSB7CisJCQljYXNlIDE6CisJCQkJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9CisJCQkJICAgIE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNToKKwkJCQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyID0KKwkJCQkgICAgTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyID0KKwkJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyID0KKwkJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBzZXQgdG8gY29ycmVjdCBvZmZzZXQgZm9yIG5leHQgcGFyc2luZyAqLworCQkJcFRtcCArPSBzaXplb2Yoc3RydWN0IHJ0X2NpcGhlcl9zdWl0ZV9zdHJ1Y3QpOworCisJCQkvKiAyLiBHZXQgcGFpcndpc2UgY2lwaGVyIGNvdW50cyAqLworCQkJLypDb3VudCA9ICoodTE2ICopcFRtcDsgKi8KKwkJCUNvdW50ID0gKHBUbXBbMV0gPDwgOCkgKyBwVG1wWzBdOworCQkJcFRtcCArPSBzaXplb2YodTE2KTsKKworCQkJLyogMy4gR2V0IHBhaXJ3aXNlIGNpcGhlciAqLworCQkJLyogUGFyc2luZyBhbGwgdW5pY2FzdCBjaXBoZXIgc3VpdGUgKi8KKwkJCXdoaWxlIChDb3VudCA+IDApIHsKKwkJCQkvKiBTa2lwIE9VSSAqLworCQkJCXBDaXBoZXIgPSAoc3RydWN0IHJ0X2NpcGhlcl9zdWl0ZV9zdHJ1Y3QgKikgcFRtcDsKKwkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJCQkJc3dpdGNoIChwQ2lwaGVyLT5UeXBlKSB7CisJCQkJY2FzZSAxOgorCQkJCWNhc2UgNToJLyogQWx0aG91Z2ggV0VQIGlzIG5vdCBhbGxvd2VkIGluIFdQQSByZWxhdGVkIGF1dGggbW9kZSwgd2UgcGFyc2UgaXQgYW55d2F5ICovCisJCQkJCVRtcENpcGhlciA9CisJCQkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQlicmVhazsKKwkJCQljYXNlIDI6CisJCQkJCVRtcENpcGhlciA9CisJCQkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQkJCQlicmVhazsKKwkJCQljYXNlIDQ6CisJCQkJCVRtcENpcGhlciA9CisJCQkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKFRtcENpcGhlciA+IHBCc3MtPldQQTIuUGFpckNpcGhlcikgeworCQkJCQkvKiBNb3ZlIHRoZSBsb3dlciBjaXBoZXIgc3VpdGUgdG8gUGFpckNpcGhlckF1eCAqLworCQkJCQlwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXggPQorCQkJCQkgICAgcEJzcy0+V1BBMi5QYWlyQ2lwaGVyOworCQkJCQlwQnNzLT5XUEEyLlBhaXJDaXBoZXIgPSBUbXBDaXBoZXI7CisJCQkJfSBlbHNlIHsKKwkJCQkJcEJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4ID0gVG1wQ2lwaGVyOworCQkJCX0KKwkJCQlwVG1wICs9IHNpemVvZihzdHJ1Y3QgcnRfY2lwaGVyX3N1aXRlX3N0cnVjdCk7CisJCQkJQ291bnQtLTsKKwkJCX0KKworCQkJLyogNC4gZ2V0IEFLTSBzdWl0ZSBjb3VudHMgKi8KKwkJCS8qQ291bnQgPSAqKHUxNiAqKXBUbXA7ICovCisJCQlDb3VudCA9IChwVG1wWzFdIDw8IDgpICsgcFRtcFswXTsKKwkJCXBUbXAgKz0gc2l6ZW9mKHUxNik7CisKKwkJCS8qIDUuIEdldCBBS00gY2lwaGVycyAqLworCQkJLyogUGFyc2luZyBhbGwgQUtNIGNpcGhlcnMgKi8KKwkJCXdoaWxlIChDb3VudCA+IDApIHsKKwkJCQlwQUtNID0gKHN0cnVjdCBydF9ha21fc3VpdGUgKikgcFRtcDsKKwkJCQlpZiAoIVJUTVBFcXVhbE1lbW9yeShwVG1wLCBSU05fT1VJLCAzKSkKKwkJCQkJYnJlYWs7CisKKwkJCQlzd2l0Y2ggKHBBS00tPlR5cGUpIHsKKwkJCQljYXNlIDE6CisJCQkJCS8qIFNldCBBUCBzdXBwb3J0IFdQQS1lbnRlcnByaXNlIG1vZGUgKi8KKwkJCQkJaWYgKHBCc3MtPkF1dGhNb2RlID09CisJCQkJCSAgICBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorCQkJCQkJcEJzcy0+QXV0aE1vZGUgPQorCQkJCQkJICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7CisJCQkJCWVsc2UKKwkJCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0KKwkJCQkJCSAgICBOZGlzODAyXzExQXV0aE1vZGVXUEEyOworCQkJCQlicmVhazsKKwkJCQljYXNlIDI6CisJCQkJCS8qIFNldCBBUCBzdXBwb3J0IFdQQS1QU0sgbW9kZSAqLworCQkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0KKwkJCQkJICAgIE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCisJCQkJCQlwQnNzLT5BdXRoTW9kZSA9CisJCQkJCQkgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKKwkJCQkJZWxzZQorCQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPQorCQkJCQkJICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWlmIChwQnNzLT5BdXRoTW9kZSA9PQorCQkJCQkgICAgTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKwkJCQkJCXBCc3MtPkF1dGhNb2RlID0KKwkJCQkJCSAgICBOZGlzODAyXzExQXV0aE1vZGVNYXg7CisJCQkJCWVsc2UKKwkJCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0KKwkJCQkJCSAgICBOZGlzODAyXzExQXV0aE1vZGVNYXg7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlwVG1wICs9IChDb3VudCAqIHNpemVvZihzdHJ1Y3QgcnRfYWttX3N1aXRlKSk7CisJCQkJQ291bnQtLTsKKwkJCX0KKworCQkJLyogRml4ZWQgZm9yIFdQQS1Ob25lICovCisJCQlpZiAocEJzcy0+QnNzVHlwZSA9PSBCU1NfQURIT0MpIHsKKwkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7CisJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0KKwkJCQkgICAgcEJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4OworCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IHBCc3MtPldQQTIuR3JvdXBDaXBoZXI7CisJCQkJcEJzcy0+V2VwU3RhdHVzID0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOworCQkJCS8qIFBhdGNoZWQgYnVncyBmb3Igb2xkIGRyaXZlciAqLworCQkJCWlmIChwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9PQorCQkJCSAgICBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0KKwkJCQkJICAgIHBCc3MtPldQQS5Hcm91cENpcGhlcjsKKwkJCX0KKwkJCXBCc3MtPldlcFN0YXR1cyA9IHBCc3MtPldQQTIuUGFpckNpcGhlcjsKKworCQkJLyogNi4gR2V0IFJTTiBjYXBhYmlsaXR5ICovCisJCQkvKnBCc3MtPldQQTIuUnNuQ2FwYWJpbGl0eSA9ICoodTE2ICopcFRtcDsgKi8KKwkJCXBCc3MtPldQQTIuUnNuQ2FwYWJpbGl0eSA9IChwVG1wWzFdIDw8IDgpICsgcFRtcFswXTsKKwkJCXBUbXAgKz0gc2l6ZW9mKHUxNik7CisKKwkJCS8qIENoZWNrIHRoZSBQYWlyICYgR3JvdXAsIGlmIGRpZmZlcmVudCwgdHVybiBvbiBtaXhlZCBtb2RlIGZsYWcgKi8KKwkJCWlmIChwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyICE9IHBCc3MtPldQQTIuUGFpckNpcGhlcikKKwkJCQlwQnNzLT5XUEEyLmJNaXhNb2RlID0gVFJVRTsKKworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKIAkJfQogCQlMZW5ndGggLT0gKHBFaWQtPkxlbiArIDIpOwogCX0KIH0KIAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gbWFjX3RhYmxlLmMKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIG1hY190YWJsZS5jICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKIC8qISBcYnJpZWYgZ2VuZXJhdGVzIGEgcmFuZG9tIG1hYyBhZGRyZXNzIHZhbHVlIGZvciBJQlNTIEJTU0lECiAgKglccGFyYW0gQWRkciB0aGUgYnNzaWQgbG9jYXRpb24KQEAgLTQ0NTAsMTggKzQ1NDYsMTUgQEAKICAqCVxwcmUKICAqCVxwb3N0CiAgKi8KLVZPSUQgTWFjQWRkclJhbmRvbUJzc2lkKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEFkZHIpCit2b2lkIE1hY0FkZHJSYW5kb21Cc3NpZChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4ICpwQWRkcikKIHsKLQlJTlQgaTsKKwlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBNQUNfQUREUl9MRU47IGkrKykKLQl7CisJZm9yIChpID0gMDsgaSA8IE1BQ19BRERSX0xFTjsgaSsrKSB7CiAJCXBBZGRyW2ldID0gUmFuZG9tQnl0ZShwQWQpOwogCX0KIAotCXBBZGRyWzBdID0gKHBBZGRyWzBdICYgMHhmZSkgfCAweDAyOyAgLy8gdGhlIGZpcnN0IDIgYml0cyBtdXN0IGJlIDAxeHh4eHh4eHgKKwlwQWRkclswXSA9IChwQWRkclswXSAmIDB4ZmUpIHwgMHgwMjsJLyogdGhlIGZpcnN0IDIgYml0cyBtdXN0IGJlIDAxeHh4eHh4eHggKi8KIH0KIAogLyohIFxicmllZiBpbml0IHRoZSBtYW5hZ2VtZW50IG1hYyBmcmFtZSBoZWFkZXIKQEAgLTQ0NzUsMzMgKzQ1NjgsMzAgQEAKICAqCVxwb3N0CiAgKglcbm90ZSB0aGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBmb2xsb3dpbmcgZmllbGQKIAotIElSUUwgPSBQQVNTSVZFX0xFVkVMCi0gSVJRTCA9IERJU1BBVENIX0xFVkVMCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKIAogICovCi1WT0lEIE1ndE1hY0hlYWRlckluaXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gT1VUIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKLQlJTiBVQ0hBUiBTdWJUeXBlLAotCUlOIFVDSEFSIFRvRHMsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBQVUNIQVIgcEJzc2lkKQordm9pZCBNZ3RNYWNIZWFkZXJJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGRyODAyMTEsCisJCSAgICAgIHU4IFN1YlR5cGUsCisJCSAgICAgIHU4IFRvRHMsIHU4ICpwREEsIHU4ICpwQnNzaWQpCiB7Ci0JTmRpc1plcm9NZW1vcnkocEhkcjgwMjExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCU5kaXNaZXJvTWVtb3J5KHBIZHI4MDIxMSwgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSk7CiAKIAlwSGRyODAyMTEtPkZDLlR5cGUgPSBCVFlQRV9NR01UOwogCXBIZHI4MDIxMS0+RkMuU3ViVHlwZSA9IFN1YlR5cGU7CisvKiAgICAgIGlmIChTdWJUeXBlID09IFNVQlRZUEVfQUNLKSAgICAgLy8gc2FtcGxlLCBubyB1c2UsIGl0IHdpbGwgY29uZmxpY3Qgd2l0aCBBQ1RJT04gZnJhbWUgc3ViIHR5cGUgKi8KKy8qICAgICAgICAgICAgICBwSGRyODAyMTEtPkZDLlR5cGUgPSBCVFlQRV9DTlRMOyAqLwogCXBIZHI4MDIxMS0+RkMuVG9EcyA9IFRvRHM7CiAJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIxLCBwREEpOwotCiAJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKLQogCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMywgcEJzc2lkKTsKIH0KIAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gbWVtX21nbXQuYwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogbWVtX21nbXQuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCiAvKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFRoaXMgcm91dGluZSBidWlsZCBhbiBvdXRnb2luZyBmcmFtZSwgYW5kIGZpbGwgYWxsIGluZm9ybWF0aW9uIHNwZWNpZmllZApAQCAtNDUxMCw0OSArNDYwMCw0NSBAQAogICogaW5wdXQgcGFyYW1zOgogICoJCUJ1ZmZlciAtIHBvaW50ZXIgdG8gYSBwcmUtYWxsb2NhdGVkIG1lbW9yeSBzZWdtZW50CiAgKgkJYXJncyAtIGEgbGlzdCBvZiA8aW50IGFyZ19zaXplLCBhcmc+IHBhaXJzLgotICoJCU5PVEUgTk9URSBOT1RFISEhISB0aGUgbGFzdCBhcmd1bWVudCBtdXN0IGJlIE5VTEwsIG90aGVyd2lzZSB0aGlzCi0gKgkJCQkJCSAgIGZ1bmN0aW9uIHdpbGwgRkFJTCEhIQorICoJCU5PVEUgTk9URSBOT1RFISB0aGUgbGFzdCBhcmd1bWVudCBtdXN0IGJlIE5VTEwsIG90aGVyd2lzZSB0aGlzCisgKgkJCQkJCSAgIGZ1bmN0aW9uIHdpbGwgRkFJTCEKICAqIHJldHVybjoKICAqCQlTaXplIG9mIHRoZSBidWZmZXIKICAqIHVzYWdlOgogICoJCU1ha2VPdXRnb2luZ0ZyYW1lKEJ1ZmZlciwgb3V0cHV0X2xlbmd0aCwgMiwgJmZjLCAyLCAmZHVyLCA2LCBwX2FkZHIxLCA2LHBfYWRkcjIsIEVORF9PRl9BUkdTKTsKIAogIElSUUwgPSBQQVNTSVZFX0xFVkVMCi0gSVJRTCA9IERJU1BBVENIX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCiAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotVUxPTkcgTWFrZU91dGdvaW5nRnJhbWUoCi0JT1VUIENIQVIgKkJ1ZmZlciwKLQlPVVQgVUxPTkcgKkZyYW1lTGVuLCAuLi4pCit1bnNpZ25lZCBsb25nIE1ha2VPdXRnb2luZ0ZyYW1lKHU4ICogQnVmZmVyLCB1bnNpZ25lZCBsb25nICogRnJhbWVMZW4sIC4uLikKIHsKLQlDSEFSICAgKnA7Ci0JaW50IAlsZW5nOwotCVVMT05HCVRvdExlbmc7CisJdTggKnA7CisJaW50IGxlbmc7CisJdW5zaWduZWQgbG9uZyBUb3RMZW5nOwogCXZhX2xpc3QgQXJnczsKIAotCS8vIGNhbGN1bGF0ZXMgdGhlIHRvdGFsIGxlbmd0aAorCS8qIGNhbGN1bGF0ZXMgdGhlIHRvdGFsIGxlbmd0aCAqLwogCVRvdExlbmcgPSAwOwogCXZhX3N0YXJ0KEFyZ3MsIEZyYW1lTGVuKTsKLQlkbwotCXsKKwlkbyB7CiAJCWxlbmcgPSB2YV9hcmcoQXJncywgaW50KTsKLQkJaWYgKGxlbmcgPT0gRU5EX09GX0FSR1MpCi0JCXsKKwkJaWYgKGxlbmcgPT0gRU5EX09GX0FSR1MpIHsKIAkJCWJyZWFrOwogCQl9Ci0JCXAgPSB2YV9hcmcoQXJncywgUFZPSUQpOworCQlwID0gdmFfYXJnKEFyZ3MsIHZvaWQgKik7CiAJCU5kaXNNb3ZlTWVtb3J5KCZCdWZmZXJbVG90TGVuZ10sIHAsIGxlbmcpOwogCQlUb3RMZW5nID0gVG90TGVuZyArIGxlbmc7Ci0JfSB3aGlsZShUUlVFKTsKKwl9IHdoaWxlIChUUlVFKTsKIAotCXZhX2VuZChBcmdzKTsgLyogY2xlYW4gdXAgKi8KKwl2YV9lbmQoQXJncyk7CQkvKiBjbGVhbiB1cCAqLwogCSpGcmFtZUxlbiA9IFRvdExlbmc7CiAJcmV0dXJuIFRvdExlbmc7CiB9CiAKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIG1sbWVfcXVldWUuYwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogbWxtZV9xdWV1ZS5jICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKIC8qISBcYnJpZWYJSW5pdGlhbGl6ZSBUaGUgTUxNRSBRdWV1ZSwgdXNlZCBieSBNTE1FIEZ1bmN0aW9ucwogICoJXHBhcmFtCSpRdWV1ZQkgICBUaGUgTUxNRSBRdWV1ZQpAQCAtNDU2NCwxOSArNDY1MCwxNyBAQAogIElSUUwgPSBQQVNTSVZFX0xFVkVMCiAKICAqLwotTkRJU19TVEFUVVMgTWxtZVF1ZXVlSW5pdCgKLQlJTiBNTE1FX1FVRVVFICpRdWV1ZSkKK2ludCBNbG1lUXVldWVJbml0KHN0cnVjdCBydF9tbG1lX3F1ZXVlICpRdWV1ZSkKIHsKLQlJTlQgaTsKKwlpbnQgaTsKIAogCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZRdWV1ZS0+TG9jayk7CiAKLQlRdWV1ZS0+TnVtCT0gMDsKKwlRdWV1ZS0+TnVtID0gMDsKIAlRdWV1ZS0+SGVhZCA9IDA7CiAJUXVldWUtPlRhaWwgPSAwOwogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRTsgaSsrKQotCXsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9NTE1FX1FVRVVFOyBpKyspIHsKIAkJUXVldWUtPkVudHJ5W2ldLk9jY3VwaWVkID0gRkFMU0U7CiAJCVF1ZXVlLT5FbnRyeVtpXS5Nc2dMZW4gPSAwOwogCQlOZGlzWmVyb01lbW9yeShRdWV1ZS0+RW50cnlbaV0uTXNnLCBNR01UX0RNQV9CVUZGRVJfU0laRSk7CkBAIC00NTk2LDM0ICs0NjgwLDMxIEBACiAgKglccG9zdAogICoJXG5vdGUJIFRoZSBtZXNzYWdlIGhhcyB0byBiZSBpbml0aWFsaXplZAogCi0gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLSBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAogCiAgKi8KLUJPT0xFQU4gTWxtZUVucXVldWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUxPTkcgTWFjaGluZSwKLQlJTiBVTE9ORyBNc2dUeXBlLAotCUlOIFVMT05HIE1zZ0xlbiwKLQlJTiBWT0lEICpNc2cpCitCT09MRUFOIE1sbWVFbnF1ZXVlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgIHVuc2lnbmVkIGxvbmcgTWFjaGluZSwKKwkJICAgIHVuc2lnbmVkIGxvbmcgTXNnVHlwZSwgdW5zaWduZWQgbG9uZyBNc2dMZW4sIHZvaWQgKiBNc2cpCiB7Ci0JSU5UIFRhaWw7Ci0JTUxNRV9RVUVVRQkqUXVldWUgPSAoTUxNRV9RVUVVRSAqKSZwQWQtPk1sbWUuUXVldWU7CisJaW50IFRhaWw7CisJc3RydWN0IHJ0X21sbWVfcXVldWUgKlF1ZXVlID0gKHN0cnVjdCBydF9tbG1lX3F1ZXVlICopJiBwQWQtPk1sbWUuUXVldWU7CiAKLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCS8qIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLiAqLworCS8qIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdCAqLworCWlmIChSVE1QX1RFU1RfRkxBRworCSAgICAocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQogCQlyZXR1cm4gRkFMU0U7CiAKLQkvLyBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUKLQlpZiAoTXNnTGVuID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpCi0JewotCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZTogbXNnIHRvbyBsYXJnZSwgc2l6ZSA9ICVsZCBcbiIsIE1zZ0xlbikpOworCS8qIEZpcnN0IGNoZWNrIHRoZSBzaXplLCBpdCBNVVNUIG5vdCBleGNlZWQgdGhlIG1sbWUgcXVldWUgc2l6ZSAqLworCWlmIChNc2dMZW4gPiBNR01UX0RNQV9CVUZGRVJfU0laRSkgeworCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZTogbXNnIHRvbyBsYXJnZSwgc2l6ZSA9ICVsZCBcbiIsCisJCQkgICAgICBNc2dMZW4pKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIAotCWlmIChNbG1lUXVldWVGdWxsKFF1ZXVlKSkKLQl7CisJaWYgKE1sbWVRdWV1ZUZ1bGwoUXVldWUpKSB7CiAJCXJldHVybiBGQUxTRTsKIAl9CiAKQEAgLTQ2MzEsOCArNDcxMiw3IEBACiAJVGFpbCA9IFF1ZXVlLT5UYWlsOwogCVF1ZXVlLT5UYWlsKys7CiAJUXVldWUtPk51bSsrOwotCWlmIChRdWV1ZS0+VGFpbCA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUpCi0JeworCWlmIChRdWV1ZS0+VGFpbCA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUpIHsKIAkJUXVldWUtPlRhaWwgPSAwOwogCX0KIApAQCAtNDY0MCwxMCArNDcyMCw5IEBACiAJUXVldWUtPkVudHJ5W1RhaWxdLk9jY3VwaWVkID0gVFJVRTsKIAlRdWV1ZS0+RW50cnlbVGFpbF0uTWFjaGluZSA9IE1hY2hpbmU7CiAJUXVldWUtPkVudHJ5W1RhaWxdLk1zZ1R5cGUgPSBNc2dUeXBlOwotCVF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2dMZW4gID0gTXNnTGVuOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2dMZW4gPSBNc2dMZW47CiAKLQlpZiAoTXNnICE9IE5VTEwpCi0JeworCWlmIChNc2cgIT0gTlVMTCkgewogCQlOZGlzTW92ZU1lbW9yeShRdWV1ZS0+RW50cnlbVGFpbF0uTXNnLCBNc2csIE1zZ0xlbik7CiAJfQogCkBAIC00NjU2LDcgKzQ3MzUsNyBAQAogICoJXHBhcmFtCSBUaW1lU3RhbXBIaWdoCSBUaGUgdXBwZXIgMzIgYml0IG9mIHRpbWVzdGFtcAogICoJXHBhcmFtCSBUaW1lU3RhbXBMb3cJIFRoZSBsb3dlciAzMiBiaXQgb2YgdGltZXN0YW1wCiAgKglccGFyYW0JIFJzc2kJCQkgVGhlIHJlY2VpdmluZyBSU1NJIHN0cmVuZ3RoCi0gKglccGFyYW0JIE1zZ0xlbiAJCSBUaGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlCisgKglccGFyYW0JIE1zZ0xlbgkJCSBUaGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlCiAgKglccGFyYW0JKk1zZwkJCSBUaGUgbWVzc2FnZSBwb2ludGVyCiAgKglccmV0dXJuICBUUlVFIGlmIGV2ZXJ5dGhpbmcgb2ssIEZBTFNFIG90aGVyd2lzZSAobGlrZSBRdWV1ZSBGdWxsKQogICoJXHByZQpAQCAtNDY2NSw4NyArNDc0NCw3OCBAQAogIElSUUwgPSBESVNQQVRDSF9MRVZFTAogCiAgKi8KLUJPT0xFQU4gTWxtZUVucXVldWVGb3JSZWN2KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVMT05HIFdjaWQsCi0JSU4gVUxPTkcgVGltZVN0YW1wSGlnaCwKLQlJTiBVTE9ORyBUaW1lU3RhbXBMb3csCi0JSU4gVUNIQVIgUnNzaTAsCi0JSU4gVUNIQVIgUnNzaTEsCi0JSU4gVUNIQVIgUnNzaTIsCi0JSU4gVUxPTkcgTXNnTGVuLAotCUlOIFZPSUQgKk1zZywKLQlJTiBVQ0hBUiBTaWduYWwpCitCT09MRUFOIE1sbWVFbnF1ZXVlRm9yUmVjdihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB1bnNpZ25lZCBsb25nIFdjaWQsCisJCQkgICB1bnNpZ25lZCBsb25nIFRpbWVTdGFtcEhpZ2gsCisJCQkgICB1bnNpZ25lZCBsb25nIFRpbWVTdGFtcExvdywKKwkJCSAgIHU4IFJzc2kwLAorCQkJICAgdTggUnNzaTEsCisJCQkgICB1OCBSc3NpMiwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLCB2b2lkICogTXNnLCB1OCBTaWduYWwpCiB7Ci0JSU5UIAkJIFRhaWwsIE1hY2hpbmU7Ci0JUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7Ci0JSU5UCQkgTXNnVHlwZTsKLQlNTE1FX1FVRVVFCSpRdWV1ZSA9IChNTE1FX1FVRVVFICopJnBBZC0+TWxtZS5RdWV1ZTsKKwlpbnQgVGFpbCwgTWFjaGluZTsKKwlzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICogcEZyYW1lID0gKHN0cnVjdCBydF9mcmFtZV84MDJfMTEgKikgTXNnOworCWludCBNc2dUeXBlOworCXN0cnVjdCBydF9tbG1lX3F1ZXVlICpRdWV1ZSA9IChzdHJ1Y3QgcnRfbWxtZV9xdWV1ZSAqKSYgcEFkLT5NbG1lLlF1ZXVlOwogCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQl7CisJLyogRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuICovCisJLyogVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0ICovCisJaWYgKFJUTVBfVEVTVF9GTEFHCisJICAgIChwQWQsCisJICAgICBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSB7CiAJCURCR1BSSU5UX0VSUigoIk1sbWVFbnF1ZXVlRm9yUmVjdjogZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTXG4iKSk7CiAJCXJldHVybiBGQUxTRTsKIAl9Ci0KLQkvLyBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUKLQlpZiAoTXNnTGVuID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpCi0JeworCS8qIEZpcnN0IGNoZWNrIHRoZSBzaXplLCBpdCBNVVNUIG5vdCBleGNlZWQgdGhlIG1sbWUgcXVldWUgc2l6ZSAqLworCWlmIChNc2dMZW4gPiBNR01UX0RNQV9CVUZGRVJfU0laRSkgewogCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZUZvclJlY3Y6IGZyYW1lIHRvbyBsYXJnZSwgc2l6ZSA9ICVsZCBcbiIsIE1zZ0xlbikpOwogCQlyZXR1cm4gRkFMU0U7CiAJfQogCi0JaWYgKE1sbWVRdWV1ZUZ1bGwoUXVldWUpKQotCXsKKwlpZiAoTWxtZVF1ZXVlRnVsbChRdWV1ZSkpIHsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIAogCXsKLQkJaWYgKCFNc2dUeXBlU3Vic3QocEFkLCBwRnJhbWUsICZNYWNoaW5lLCAmTXNnVHlwZSkpCi0JCXsKLQkJCURCR1BSSU5UX0VSUigoIk1sbWVFbnF1ZXVlRm9yUmVjdjogdW4tcmVjb25nbml6ZWQgbWdtdC0+c3VidHlwZT0lZFxuIixwRnJhbWUtPkhkci5GQy5TdWJUeXBlKSk7CisJCWlmICghTXNnVHlwZVN1YnN0KHBBZCwgcEZyYW1lLCAmTWFjaGluZSwgJk1zZ1R5cGUpKSB7CisJCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZUZvclJlY3Y6IHVuLXJlY29uZ25pemVkIG1nbXQtPnN1YnR5cGU9JWRcbiIsIHBGcmFtZS0+SGRyLkZDLlN1YlR5cGUpKTsKIAkJCXJldHVybiBGQUxTRTsKIAkJfQogCX0KIAotCS8vIE9LLCB3ZSBnb3QgYWxsIHRoZSBpbmZvcm1hdGlvbnMsIGl0IGlzIHRpbWUgdG8gcHV0IHRoaW5ncyBpbnRvIHF1ZXVlCisJLyogT0ssIHdlIGdvdCBhbGwgdGhlIGluZm9ybWF0aW9ucywgaXQgaXMgdGltZSB0byBwdXQgdGhpbmdzIGludG8gcXVldWUgKi8KIAlOZGlzQWNxdWlyZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKIAlUYWlsID0gUXVldWUtPlRhaWw7CiAJUXVldWUtPlRhaWwrKzsKIAlRdWV1ZS0+TnVtKys7Ci0JaWYgKFF1ZXVlLT5UYWlsID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSkKLQl7CisJaWYgKFF1ZXVlLT5UYWlsID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSkgewogCQlRdWV1ZS0+VGFpbCA9IDA7CiAJfQogCVF1ZXVlLT5FbnRyeVtUYWlsXS5PY2N1cGllZCA9IFRSVUU7CiAJUXVldWUtPkVudHJ5W1RhaWxdLk1hY2hpbmUgPSBNYWNoaW5lOwogCVF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2dUeXBlID0gTXNnVHlwZTsKLQlRdWV1ZS0+RW50cnlbVGFpbF0uTXNnTGVuICA9IE1zZ0xlbjsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uTXNnTGVuID0gTXNnTGVuOwogCVF1ZXVlLT5FbnRyeVtUYWlsXS5UaW1lU3RhbXAudS5Mb3dQYXJ0ID0gVGltZVN0YW1wTG93OwogCVF1ZXVlLT5FbnRyeVtUYWlsXS5UaW1lU3RhbXAudS5IaWdoUGFydCA9IFRpbWVTdGFtcEhpZ2g7CiAJUXVldWUtPkVudHJ5W1RhaWxdLlJzc2kwID0gUnNzaTA7CiAJUXVldWUtPkVudHJ5W1RhaWxdLlJzc2kxID0gUnNzaTE7CiAJUXVldWUtPkVudHJ5W1RhaWxdLlJzc2kyID0gUnNzaTI7CiAJUXVldWUtPkVudHJ5W1RhaWxdLlNpZ25hbCA9IFNpZ25hbDsKLQlRdWV1ZS0+RW50cnlbVGFpbF0uV2NpZCA9IChVQ0hBUilXY2lkOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5XY2lkID0gKHU4KVdjaWQ7CiAKIAlRdWV1ZS0+RW50cnlbVGFpbF0uQ2hhbm5lbCA9IHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbDsKIAotCWlmIChNc2cgIT0gTlVMTCkKLQl7CisJaWYgKE1zZyAhPSBOVUxMKSB7CiAJCU5kaXNNb3ZlTWVtb3J5KFF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2csIE1zZywgTXNnTGVuKTsKIAl9CiAKIAlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKIAotCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwlSVE1QX01MTUVfSEFORExFUihwQWQpOwogCiAJcmV0dXJuIFRSVUU7CiB9CiAKLQogLyohIFxicmllZgkgRGVxdWV1ZSBhIG1lc3NhZ2UgZnJvbSB0aGUgTUxNRSBRdWV1ZQogICoJXHBhcmFtCSpRdWV1ZQkgIFRoZSBNTE1FIFF1ZXVlCiAgKglccGFyYW0JKkVsZW0JICBUaGUgbWVzc2FnZSBkZXF1ZXVlZCBmcm9tIE1MTUUgUXVldWUKQEAgLTQ3NTYsOTcgKzQ4MjYsODggQEAKICBJUlFMID0gRElTUEFUQ0hfTEVWRUwKIAogICovCi1CT09MRUFOIE1sbWVEZXF1ZXVlKAotCUlOIE1MTUVfUVVFVUUgKlF1ZXVlLAotCU9VVCBNTE1FX1FVRVVFX0VMRU0gKipFbGVtKQorQk9PTEVBTiBNbG1lRGVxdWV1ZShzdHJ1Y3QgcnRfbWxtZV9xdWV1ZSAqUXVldWUsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKiogRWxlbSkKIHsKIAlOZGlzQWNxdWlyZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKIAkqRWxlbSA9ICYoUXVldWUtPkVudHJ5W1F1ZXVlLT5IZWFkXSk7CiAJUXVldWUtPk51bS0tOwogCVF1ZXVlLT5IZWFkKys7Ci0JaWYgKFF1ZXVlLT5IZWFkID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSkKLQl7CisJaWYgKFF1ZXVlLT5IZWFkID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSkgewogCQlRdWV1ZS0+SGVhZCA9IDA7CiAJfQogCU5kaXNSZWxlYXNlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOwogCXJldHVybiBUUlVFOwogfQogCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVZPSUQJTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCisvKiBJUlFMID0gRElTUEFUQ0hfTEVWRUwgKi8KK3ZvaWQgTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotI2lmZGVmIFJUMjg2MAotCU1MTUVfUVVFVUVfRUxFTQkJKkVsZW0gPSBOVUxMOwotI2VuZGlmCi0JQk9PTEVBTgkJCQlDYW5jZWxsZWQ7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSA9IE5VTEw7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisJQk9PTEVBTiBDYW5jZWxsZWQ7CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lUmVzdGFydFN0YXRlTWFjaGluZSBcbiIpKTsKIAotI2lmZGVmIFJUMjg2MAorI2lmZGVmIFJUTVBfTUFDX1BDSQogCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7Ci0JaWYocEFkLT5NbG1lLmJSdW5uaW5nKQotCXsKKwlpZiAocEFkLT5NbG1lLmJSdW5uaW5nKSB7CiAJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7CiAJCXJldHVybjsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlwQWQtPk1sbWUuYlJ1bm5pbmcgPSBUUlVFOwogCX0KIAlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOwogCi0JLy8gUmVtb3ZlIGFsbCBNbG1lIHF1ZXVlcyBlbGVtZW50cwotCXdoaWxlICghTWxtZVF1ZXVlRW1wdHkoJnBBZC0+TWxtZS5RdWV1ZSkpCi0JewotCQkvL0Zyb20gbWVzc2FnZSB0eXBlLCBkZXRlcm1pbmUgd2hpY2ggc3RhdGUgbWFjaGluZSBJIHNob3VsZCBkcml2ZQotCQlpZiAoTWxtZURlcXVldWUoJnBBZC0+TWxtZS5RdWV1ZSwgJkVsZW0pKQotCQl7Ci0JCQkvLyBmcmVlIE1MTUUgZWxlbWVudAorCS8qIFJlbW92ZSBhbGwgTWxtZSBxdWV1ZXMgZWxlbWVudHMgKi8KKwl3aGlsZSAoIU1sbWVRdWV1ZUVtcHR5KCZwQWQtPk1sbWUuUXVldWUpKSB7CisJCS8qRnJvbSBtZXNzYWdlIHR5cGUsIGRldGVybWluZSB3aGljaCBzdGF0ZSBtYWNoaW5lIEkgc2hvdWxkIGRyaXZlICovCisJCWlmIChNbG1lRGVxdWV1ZSgmcEFkLT5NbG1lLlF1ZXVlLCAmRWxlbSkpIHsKKwkJCS8qIGZyZWUgTUxNRSBlbGVtZW50ICovCiAJCQlFbGVtLT5PY2N1cGllZCA9IEZBTFNFOwogCQkJRWxlbS0+TXNnTGVuID0gMDsKIAotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJREJHUFJJTlRfRVJSKCgiTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmU6IE1sbWVRdWV1ZSBlbXB0eVxuIikpOwogCQl9CiAJfQotI2VuZGlmIC8qIFJUMjg2MCAqLworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCiAJewotCQkvLyBDYW5jZWwgYWxsIHRpbWVyIGV2ZW50cwotCQkvLyBCZSBjYXJlZnVsIHRvIGNhbmNlbCBuZXcgYWRkZWQgdGltZXIKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwJICAmQ2FuY2VsbGVkKTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCAgICZDYW5jZWxsZWQpOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAgJkNhbmNlbGxlZCk7Ci0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwJICAgJkNhbmNlbGxlZCk7Ci0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLAkgICAmQ2FuY2VsbGVkKTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLAkgICAmQ2FuY2VsbGVkKTsKKwkJLyogQ2FuY2VsIGFsbCB0aW1lciBldmVudHMgKi8KKwkJLyogQmUgY2FyZWZ1bCB0byBjYW5jZWwgbmV3IGFkZGVkIHRpbWVyICovCisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsICZDYW5jZWxsZWQpOworCiAJfQogCi0JLy8gQ2hhbmdlIGJhY2sgdG8gb3JpZ2luYWwgY2hhbm5lbCBpbiBjYXNlIG9mIGRvaW5nIHNjYW4KKwkvKiBDaGFuZ2UgYmFjayB0byBvcmlnaW5hbCBjaGFubmVsIGluIGNhc2Ugb2YgZG9pbmcgc2NhbiAqLwogCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwogCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwogCi0JLy8gUmVzdW1lIE1TRFUgd2hpY2ggaXMgdHVybmVkIG9mZiBkdXJuaW5nIHNjYW4KKwkvKiBSZXN1bWUgTVNEVSB3aGljaCBpcyB0dXJuZWQgb2ZmIGR1cm5pbmcgc2NhbiAqLwogCVJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKHBBZCk7CiAKIAl7Ci0JCS8vIFNldCBhbGwgc3RhdGUgbWFjaGluZXMgYmFjayBJRExFCi0JCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgICAgPSBDTlRMX0lETEU7Ci0JCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlICAgPSBBU1NPQ19JRExFOwotCQlwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlICAgID0gQVVUSF9SRVFfSURMRTsKKwkJLyogU2V0IGFsbCBzdGF0ZSBtYWNoaW5lcyBiYWNrIElETEUgKi8KKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQlwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKIAkJcEFkLT5NbG1lLkF1dGhSc3BNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUlNQX0lETEU7Ci0JCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgICAgPSBTWU5DX0lETEU7Ci0JCXBBZC0+TWxtZS5BY3RNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IEFDVF9JRExFOworCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCQlwQWQtPk1sbWUuQWN0TWFjaGluZS5DdXJyU3RhdGUgPSBBQ1RfSURMRTsKIAl9CiAKLSNpZmRlZiBSVDI4NjAKLQkvLyBSZW1vdmUgcnVubmluZyBzdGF0ZQorI2lmZGVmIFJUTVBfTUFDX1BDSQorCS8qIFJlbW92ZSBydW5uaW5nIHN0YXRlICovCiAJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKIAlwQWQtPk1sbWUuYlJ1bm5pbmcgPSBGQUxTRTsKIAlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOwotI2VuZGlmCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiB9CiAKIC8qISBcYnJpZWYJdGVzdCBpZiB0aGUgTUxNRSBRdWV1ZSBpcyBlbXB0eQpAQCAtNDg1OCw4ICs0OTE5LDcgQEAKICBJUlFMID0gRElTUEFUQ0hfTEVWRUwKIAogICovCi1CT09MRUFOIE1sbWVRdWV1ZUVtcHR5KAotCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKQorQk9PTEVBTiBNbG1lUXVldWVFbXB0eShzdHJ1Y3QgcnRfbWxtZV9xdWV1ZSAqUXVldWUpCiB7CiAJQk9PTEVBTiBBbnM7CiAKQEAgLTQ4NzEsNyArNDkzMSw3IEBACiB9CiAKIC8qISBcYnJpZWYJIHRlc3QgaWYgdGhlIE1MTUUgUXVldWUgaXMgZnVsbAotICoJXHBhcmFtCSAqUXVldWUgCSBUaGUgTUxNRSBRdWV1ZQorICoJXHBhcmFtCSAqUXVldWUJCSBUaGUgTUxNRSBRdWV1ZQogICoJXHJldHVybiAgVFJVRSBpZiB0aGUgUXVldWUgaXMgZW1wdHksIEZBTFNFIG90aGVyd2lzZQogICoJXHByZQogICoJXHBvc3QKQEAgLTQ4ODAsMTMgKzQ5NDAsMTMgQEAKICBJUlFMID0gRElTUEFUQ0hfTEVWRUwKIAogICovCi1CT09MRUFOIE1sbWVRdWV1ZUZ1bGwoCi0JSU4gTUxNRV9RVUVVRSAqUXVldWUpCitCT09MRUFOIE1sbWVRdWV1ZUZ1bGwoc3RydWN0IHJ0X21sbWVfcXVldWUgKlF1ZXVlKQogewogCUJPT0xFQU4gQW5zOwogCiAJTmRpc0FjcXVpcmVTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7Ci0JQW5zID0gKFF1ZXVlLT5OdW0gPT0gTUFYX0xFTl9PRl9NTE1FX1FVRVVFIHx8IFF1ZXVlLT5FbnRyeVtRdWV1ZS0+VGFpbF0uT2NjdXBpZWQpOworCUFucyA9IChRdWV1ZS0+TnVtID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRQorCSAgICAgICB8fCBRdWV1ZS0+RW50cnlbUXVldWUtPlRhaWxdLk9jY3VwaWVkKTsKIAlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKIAogCXJldHVybiBBbnM7CkBAIC00OTAyLDExICs0OTYyLDEwIEBACiAgSVJRTCA9IFBBU1NJVkVfTEVWRUwKIAogICovCi1WT0lEIE1sbWVRdWV1ZURlc3Ryb3koCi0JSU4gTUxNRV9RVUVVRSAqcFF1ZXVlKQordm9pZCBNbG1lUXVldWVEZXN0cm95KHN0cnVjdCBydF9tbG1lX3F1ZXVlICpwUXVldWUpCiB7CiAJTmRpc0FjcXVpcmVTcGluTG9jaygmKHBRdWV1ZS0+TG9jaykpOwotCXBRdWV1ZS0+TnVtICA9IDA7CisJcFF1ZXVlLT5OdW0gPSAwOwogCXBRdWV1ZS0+SGVhZCA9IDA7CiAJcFF1ZXVlLT5UYWlsID0gMDsKIAlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYocFF1ZXVlLT5Mb2NrKSk7CkBAIC00OTI0LDEyNiArNDk4MywxMTIgQEAKICBJUlFMID0gRElTUEFUQ0hfTEVWRUwKIAogICovCi1CT09MRUFOIE1zZ1R5cGVTdWJzdCgKLQlJTiBQUlRNUF9BREFQVEVSICBwQWQsCi0JSU4gUEZSQU1FXzgwMl8xMSBwRnJhbWUsCi0JT1VUIElOVCAqTWFjaGluZSwKLQlPVVQgSU5UICpNc2dUeXBlKQorQk9PTEVBTiBNc2dUeXBlU3Vic3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgIHN0cnVjdCBydF9mcmFtZV84MDJfMTEgKiBwRnJhbWUsCisJCSAgICAgaW50ICogTWFjaGluZSwgaW50ICogTXNnVHlwZSkKIHsKLQlVU0hPUlQJU2VxOwotCVVDSEFSCUVBUFR5cGU7Ci0JUFVDSEFSCXBEYXRhOworCXUxNiBTZXEsIEFsZzsKKwl1OCBFQVBUeXBlOworCXU4ICpwRGF0YTsKIAotCS8vIFBvaW50ZXIgdG8gc3RhcnQgb2YgZGF0YSBmcmFtZXMgaW5jbHVkaW5nIFNOQVAgaGVhZGVyCi0JcERhdGEgPSAoUFVDSEFSKSBwRnJhbWUgKyBMRU5HVEhfODAyXzExOworCS8qIFBvaW50ZXIgdG8gc3RhcnQgb2YgZGF0YSBmcmFtZXMgaW5jbHVkaW5nIFNOQVAgaGVhZGVyICovCisJcERhdGEgPSAodTggKilwRnJhbWUgKyBMRU5HVEhfODAyXzExOwogCi0JLy8gVGhlIG9ubHkgZGF0YSB0eXBlIHdpbGwgcGFzcyB0byB0aGlzIGZ1bmN0aW9uIGlzIEVBUE9MIGZyYW1lCi0JaWYgKHBGcmFtZS0+SGRyLkZDLlR5cGUgPT0gQlRZUEVfREFUQSkKLQl7Ci0JCWlmIChOZGlzRXF1YWxNZW1vcnkoU05BUF9BSVJPTkVULCBwRGF0YSwgTEVOR1RIXzgwMl8xX0gpKQorCS8qIFRoZSBvbmx5IGRhdGEgdHlwZSB3aWxsIHBhc3MgdG8gdGhpcyBmdW5jdGlvbiBpcyBFQVBPTCBmcmFtZSAqLworCWlmIChwRnJhbWUtPkhkci5GQy5UeXBlID09IEJUWVBFX0RBVEEpIHsKIAkJewotCQkJLy8gQ2lzY28gQWlyb25ldCBTTkFQIGhlYWRlcgotCQkJKk1hY2hpbmUgPSBBSVJPTkVUX1NUQVRFX01BQ0hJTkU7Ci0JCQkqTXNnVHlwZSA9IE1UMl9BSVJPTkVUX01TRzsKLQkJCXJldHVybiAoVFJVRSk7Ci0JCX0KLQkJewotCQkJKk1hY2hpbmUgPSBXUEFfUFNLX1NUQVRFX01BQ0hJTkU7Ci0JCQlFQVBUeXBlID0gKigoVUNIQVIqKXBGcmFtZSArIExFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSCArIDEpOwotCQkJcmV0dXJuKFdwYU1zZ1R5cGVTdWJzdChFQVBUeXBlLCBNc2dUeXBlKSk7CisJCQkqTWFjaGluZSA9IFdQQV9TVEFURV9NQUNISU5FOworCQkJRUFQVHlwZSA9CisJCQkgICAgKigodTggKikgcEZyYW1lICsgTEVOR1RIXzgwMl8xMSArCisJCQkgICAgICBMRU5HVEhfODAyXzFfSCArIDEpOworCQkJcmV0dXJuIChXcGFNc2dUeXBlU3Vic3QoRUFQVHlwZSwgKGludCAqKSBNc2dUeXBlKSk7CiAJCX0KIAl9CiAKLQlzd2l0Y2ggKHBGcmFtZS0+SGRyLkZDLlN1YlR5cGUpCi0JewotCQljYXNlIFNVQlRZUEVfQVNTT0NfUkVROgotCQkJKk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOwotCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BU1NPQ19SRVE7Ci0JCQlicmVhazsKLQkJY2FzZSBTVUJUWVBFX0FTU09DX1JTUDoKLQkJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKLQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQVNTT0NfUlNQOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1VCVFlQRV9SRUFTU09DX1JFUToKLQkJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKLQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfUkVBU1NPQ19SRVE7Ci0JCQlicmVhazsKLQkJY2FzZSBTVUJUWVBFX1JFQVNTT0NfUlNQOgotCQkJKk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOwotCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9SRUFTU09DX1JTUDsKLQkJCWJyZWFrOwotCQljYXNlIFNVQlRZUEVfUFJPQkVfUkVROgotCQkJKk1hY2hpbmUgPSBTWU5DX1NUQVRFX01BQ0hJTkU7Ci0JCQkqTXNnVHlwZSA9IE1UMl9QRUVSX1BST0JFX1JFUTsKLQkJCWJyZWFrOwotCQljYXNlIFNVQlRZUEVfUFJPQkVfUlNQOgotCQkJKk1hY2hpbmUgPSBTWU5DX1NUQVRFX01BQ0hJTkU7Ci0JCQkqTXNnVHlwZSA9IE1UMl9QRUVSX1BST0JFX1JTUDsKLQkJCWJyZWFrOwotCQljYXNlIFNVQlRZUEVfQkVBQ09OOgotCQkJKk1hY2hpbmUgPSBTWU5DX1NUQVRFX01BQ0hJTkU7Ci0JCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0JFQUNPTjsKLQkJCWJyZWFrOwotCQljYXNlIFNVQlRZUEVfQVRJTToKLQkJCSpNYWNoaW5lID0gU1lOQ19TVEFURV9NQUNISU5FOwotCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BVElNOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1VCVFlQRV9ESVNBU1NPQzoKLQkJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKLQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfRElTQVNTT0NfUkVROwotCQkJYnJlYWs7Ci0JCWNhc2UgU1VCVFlQRV9BVVRIOgotCQkJLy8gZ2V0IHRoZSBzZXF1ZW5jZSBudW1iZXIgZnJvbSBwYXlsb2FkIDI0IE1hYyBIZWFkZXIgKyAyIGJ5dGVzIGFsZ29yaXRobQotCQkJTmRpc01vdmVNZW1vcnkoJlNlcSwgJnBGcmFtZS0+T2N0ZXRbMl0sIHNpemVvZihVU0hPUlQpKTsKLQkJCWlmIChTZXEgPT0gMSB8fCBTZXEgPT0gMykKLQkJCXsKLQkJCQkqTWFjaGluZSA9IEFVVEhfUlNQX1NUQVRFX01BQ0hJTkU7Ci0JCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BVVRIX09ERDsKLQkJCX0KLQkJCWVsc2UgaWYgKFNlcSA9PSAyIHx8IFNlcSA9PSA0KQotCQkJeworCXN3aXRjaCAocEZyYW1lLT5IZHIuRkMuU3ViVHlwZSkgeworCWNhc2UgU1VCVFlQRV9BU1NPQ19SRVE6CisJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKKwkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BU1NPQ19SRVE7CisJCWJyZWFrOworCWNhc2UgU1VCVFlQRV9BU1NPQ19SU1A6CisJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKKwkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BU1NPQ19SU1A7CisJCWJyZWFrOworCWNhc2UgU1VCVFlQRV9SRUFTU09DX1JFUToKKwkJKk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkqTXNnVHlwZSA9IE1UMl9QRUVSX1JFQVNTT0NfUkVROworCQlicmVhazsKKwljYXNlIFNVQlRZUEVfUkVBU1NPQ19SU1A6CisJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKKwkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9SRUFTU09DX1JTUDsKKwkJYnJlYWs7CisJY2FzZSBTVUJUWVBFX1BST0JFX1JFUToKKwkJKk1hY2hpbmUgPSBTWU5DX1NUQVRFX01BQ0hJTkU7CisJCSpNc2dUeXBlID0gTVQyX1BFRVJfUFJPQkVfUkVROworCQlicmVhazsKKwljYXNlIFNVQlRZUEVfUFJPQkVfUlNQOgorCQkqTWFjaGluZSA9IFNZTkNfU1RBVEVfTUFDSElORTsKKwkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9QUk9CRV9SU1A7CisJCWJyZWFrOworCWNhc2UgU1VCVFlQRV9CRUFDT046CisJCSpNYWNoaW5lID0gU1lOQ19TVEFURV9NQUNISU5FOworCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0JFQUNPTjsKKwkJYnJlYWs7CisJY2FzZSBTVUJUWVBFX0FUSU06CisJCSpNYWNoaW5lID0gU1lOQ19TVEFURV9NQUNISU5FOworCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FUSU07CisJCWJyZWFrOworCWNhc2UgU1VCVFlQRV9ESVNBU1NPQzoKKwkJKk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0RJU0FTU09DX1JFUTsKKwkJYnJlYWs7CisJY2FzZSBTVUJUWVBFX0FVVEg6CisJCS8qIGdldCB0aGUgc2VxdWVuY2UgbnVtYmVyIGZyb20gcGF5bG9hZCAyNCBNYWMgSGVhZGVyICsgMiBieXRlcyBhbGdvcml0aG0gKi8KKwkJTmRpc01vdmVNZW1vcnkoJlNlcSwgJnBGcmFtZS0+T2N0ZXRbMl0sIHNpemVvZih1MTYpKTsKKwkJTmRpc01vdmVNZW1vcnkoJkFsZywgJnBGcmFtZS0+T2N0ZXRbMF0sIHNpemVvZih1MTYpKTsKKwkJaWYgKFNlcSA9PSAxIHx8IFNlcSA9PSAzKSB7CisJCQkqTWFjaGluZSA9IEFVVEhfUlNQX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FVVEhfT0REOworCQl9IGVsc2UgaWYgKFNlcSA9PSAyIHx8IFNlcSA9PSA0KSB7CisJCQlpZiAoQWxnID09IEFVVEhfTU9ERV9PUEVOIHx8IEFsZyA9PSBBVVRIX01PREVfS0VZKSB7CiAJCQkJKk1hY2hpbmUgPSBBVVRIX1NUQVRFX01BQ0hJTkU7CiAJCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BVVRIX0VWRU47CiAJCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcmV0dXJuIEZBTFNFOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgU1VCVFlQRV9ERUFVVEg6Ci0JCQkqTWFjaGluZSA9IEFVVEhfUlNQX1NUQVRFX01BQ0hJTkU7Ci0JCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0RFQVVUSDsKLQkJCWJyZWFrOwotCQljYXNlIFNVQlRZUEVfQUNUSU9OOgotCQkJKk1hY2hpbmUgPSBBQ1RJT05fU1RBVEVfTUFDSElORTsKLQkJCS8vICBTb21ldGltZXMgU3RhIHdpbGwgcmV0dXJuIHdpdGggY2F0ZWdvcnkgYnl0ZXMgd2l0aCBNU0IgPSAxLCBpZiB0aGV5IHJlY2VpdmUgY2F0b2dvcnkgb3V0IG9mIHRoZWlyIHN1cHBvcnQKLQkJCWlmICgocEZyYW1lLT5PY3RldFswXSYweDdGKSA+IE1BWF9QRUVSX0NBVEVfTVNHKQotCQkJewotCQkJCSpNc2dUeXBlID0gTVQyX0FDVF9JTlZBTElEOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCSpNc2dUeXBlID0gKHBGcmFtZS0+T2N0ZXRbMF0mMHg3Rik7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKKwkJfSBlbHNlIHsKIAkJCXJldHVybiBGQUxTRTsKLQkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgU1VCVFlQRV9ERUFVVEg6CisJCSpNYWNoaW5lID0gQVVUSF9SU1BfU1RBVEVfTUFDSElORTsKKwkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9ERUFVVEg7CisJCWJyZWFrOworCWNhc2UgU1VCVFlQRV9BQ1RJT046CisJCSpNYWNoaW5lID0gQUNUSU9OX1NUQVRFX01BQ0hJTkU7CisJCS8qICBTb21ldGltZXMgU3RhIHdpbGwgcmV0dXJuIHdpdGggY2F0ZWdvcnkgYnl0ZXMgd2l0aCBNU0IgPSAxLCBpZiB0aGV5IHJlY2VpdmUgY2F0b2dvcnkgb3V0IG9mIHRoZWlyIHN1cHBvcnQgKi8KKwkJaWYgKChwRnJhbWUtPk9jdGV0WzBdICYgMHg3RikgPiBNQVhfUEVFUl9DQVRFX01TRykgeworCQkJKk1zZ1R5cGUgPSBNVDJfQUNUX0lOVkFMSUQ7CisJCX0gZWxzZSB7CisJCQkqTXNnVHlwZSA9IChwRnJhbWUtPk9jdGV0WzBdICYgMHg3Rik7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIEZBTFNFOworCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gVFJVRTsKIH0KIAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gc3RhdGVfbWFjaGluZS5jCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiBzdGF0ZV9tYWNoaW5lLmMgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAogLyohIFxicmllZiBJbml0aWFsaXplIHRoZSBzdGF0ZSBtYWNoaW5lLgogICoJXHBhcmFtICpTCQkJcG9pbnRlciB0byB0aGUgc3RhdGUgbWFjaGluZQogICoJXHBhcmFtCVRyYW5zCQlTdGF0ZSBtYWNoaW5lIHRyYW5zaXRpb24gZnVuY3Rpb24KICAqCVxwYXJhbQlTdE5yCQludW1iZXIgb2Ygc3RhdGVzCiAgKglccGFyYW0JTXNnTnIJCW51bWJlciBvZiBtZXNzYWdlcwotICoJXHBhcmFtCURlZkZ1bmMgCWRlZmF1bHQgZnVuY3Rpb24sIHdoZW4gdGhlcmUgaXMgaW52YWxpZCBzdGF0ZS9tZXNzYWdlIGNvbWJpbmF0aW9uCisgKglccGFyYW0JRGVmRnVuYwkJZGVmYXVsdCBmdW5jdGlvbiwgd2hlbiB0aGVyZSBpcyBpbnZhbGlkIHN0YXRlL21lc3NhZ2UgY29tYmluYXRpb24KICAqCVxwYXJhbQlJbml0U3RhdGUJaW5pdGlhbCBzdGF0ZSBvZiB0aGUgc3RhdGUgbWFjaGluZQogICoJXHBhcmFtCUJhc2UJCVN0YXRlTWFjaGluZSBiYXNlLCBpbnRlcm5hbCB1c2Ugb25seQogICoJXHByZSBwX3NtIHNob3VsZCBiZSBhIGxlZ2FsIHBvaW50ZXIKQEAgLTUwNTIsMzQgKzUwOTcsMzAgQEAKICBJUlFMID0gUEFTU0lWRV9MRVZFTAogCiAgKi8KLVZPSUQgU3RhdGVNYWNoaW5lSW5pdCgKLQlJTiBTVEFURV9NQUNISU5FICpTLAotCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdLAotCUlOIFVMT05HIFN0TnIsCi0JSU4gVUxPTkcgTXNnTnIsCi0JSU4gU1RBVEVfTUFDSElORV9GVU5DIERlZkZ1bmMsCi0JSU4gVUxPTkcgSW5pdFN0YXRlLAotCUlOIFVMT05HIEJhc2UpCit2b2lkIFN0YXRlTWFjaGluZUluaXQoc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgKlMsCisJCSAgICAgIElOIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdLAorCQkgICAgICB1bnNpZ25lZCBsb25nIFN0TnIsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgTXNnTnIsCisJCSAgICAgIElOIFNUQVRFX01BQ0hJTkVfRlVOQyBEZWZGdW5jLAorCQkgICAgICB1bnNpZ25lZCBsb25nIEluaXRTdGF0ZSwgdW5zaWduZWQgbG9uZyBCYXNlKQogewotCVVMT05HIGksIGo7CisJdW5zaWduZWQgbG9uZyBpLCBqOwogCi0JLy8gc2V0IG51bWJlciBvZiBzdGF0ZXMgYW5kIG1lc3NhZ2VzCisJLyogc2V0IG51bWJlciBvZiBzdGF0ZXMgYW5kIG1lc3NhZ2VzICovCiAJUy0+TnJTdGF0ZSA9IFN0TnI7Ci0JUy0+TnJNc2cgICA9IE1zZ05yOwotCVMtPkJhc2UgICAgPSBCYXNlOworCVMtPk5yTXNnID0gTXNnTnI7CisJUy0+QmFzZSA9IEJhc2U7CiAKLQlTLT5UcmFuc0Z1bmMgID0gVHJhbnM7CisJUy0+VHJhbnNGdW5jID0gVHJhbnM7CiAKLQkvLyBpbml0IGFsbCBzdGF0ZSB0cmFuc2l0aW9uIHRvIGRlZmF1bHQgZnVuY3Rpb24KLQlmb3IgKGkgPSAwOyBpIDwgU3ROcjsgaSsrKQotCXsKLQkJZm9yIChqID0gMDsgaiA8IE1zZ05yOyBqKyspCi0JCXsKKwkvKiBpbml0IGFsbCBzdGF0ZSB0cmFuc2l0aW9uIHRvIGRlZmF1bHQgZnVuY3Rpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgU3ROcjsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBNc2dOcjsgaisrKSB7CiAJCQlTLT5UcmFuc0Z1bmNbaSAqIE1zZ05yICsgal0gPSBEZWZGdW5jOwogCQl9CiAJfQogCi0JLy8gc2V0IHRoZSBzdGFydGluZyBzdGF0ZQorCS8qIHNldCB0aGUgc3RhcnRpbmcgc3RhdGUgKi8KIAlTLT5DdXJyU3RhdGUgPSBJbml0U3RhdGU7CiB9CiAKQEAgLTUwOTQsMzggKzUxMzUsMzQgQEAKICBJUlFMID0gUEFTU0lWRV9MRVZFTAogCiAgKi8KLVZPSUQgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKAotCUlOIFNUQVRFX01BQ0hJTkUgKlMsCi0JSU4gVUxPTkcgU3QsCi0JSU4gVUxPTkcgTXNnLAotCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBGdW5jKQordm9pZCBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgKlMsCisJCQkgICB1bnNpZ25lZCBsb25nIFN0LAorCQkJICAgdW5zaWduZWQgbG9uZyBNc2csIElOIFNUQVRFX01BQ0hJTkVfRlVOQyBGdW5jKQogewotCVVMT05HIE1zZ0lkeDsKKwl1bnNpZ25lZCBsb25nIE1zZ0lkeDsKIAogCU1zZ0lkeCA9IE1zZyAtIFMtPkJhc2U7CiAKLQlpZiAoU3QgPCBTLT5OclN0YXRlICYmIE1zZ0lkeCA8IFMtPk5yTXNnKQotCXsKLQkJLy8gYm91bmRhcnkgY2hlY2tpbmcgYmVmb3JlIHNldHRpbmcgdGhlIGFjdGlvbgorCWlmIChTdCA8IFMtPk5yU3RhdGUgJiYgTXNnSWR4IDwgUy0+TnJNc2cpIHsKKwkJLyogYm91bmRhcnkgY2hlY2tpbmcgYmVmb3JlIHNldHRpbmcgdGhlIGFjdGlvbiAqLwogCQlTLT5UcmFuc0Z1bmNbU3QgKiBTLT5Ock1zZyArIE1zZ0lkeF0gPSBGdW5jOwogCX0KIH0KIAogLyohIFxicmllZgkgVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSBzdGF0ZSB0cmFuc2l0aW9uCiAgKglccGFyYW0JICpBZGFwdGVyIHRoZSBOSUMgYWRhcHRlciBwb2ludGVyCi0gKglccGFyYW0JICpTIAkgIHRoZSBzdGF0ZSBtYWNoaW5lCisgKglccGFyYW0JICpTCSAgdGhlIHN0YXRlIG1hY2hpbmUKICAqCVxwYXJhbQkgKkVsZW0JICB0aGUgbWVzc2FnZSB0byBiZSBleGVjdXRlZAogICoJXHJldHVybiAgIE5vbmUKIAogIElSUUwgPSBESVNQQVRDSF9MRVZFTAogCiAgKi8KLVZPSUQgU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBTVEFURV9NQUNISU5FICpTLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgKlMsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JKCooUy0+VHJhbnNGdW5jW1MtPkN1cnJTdGF0ZSAqIFMtPk5yTXNnICsgRWxlbS0+TXNnVHlwZSAtIFMtPkJhc2VdKSkocEFkLCBFbGVtKTsKKwkoKihTLT5UcmFuc0Z1bmNbUy0+Q3VyclN0YXRlICogUy0+TnJNc2cgKyBFbGVtLT5Nc2dUeXBlIC0gUy0+QmFzZV0pKQorCSAgICAocEFkLCBFbGVtKTsKIH0KIAogLyoKQEAgLTUxMzYsMTUgKzUxNzMsMTMgQEAKIAkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbigpCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBEcm9wKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgRHJvcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7CiB9CiAKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGxmc3IuYwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogbGZzci5jICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTUxNTQsOSArNTE4OSw3IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIExmc3JJbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVMT05HIFNlZWQpCit2b2lkIExmc3JJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdW5zaWduZWQgbG9uZyBTZWVkKQogewogCWlmIChTZWVkID09IDApCiAJCXBBZC0+TWxtZS5TaGlmdFJlZyA9IDE7CkBAIC01MTY5LDI2ICs1MjAyLDIzIEBACiAJRGVzY3JpcHRpb246CiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVUNIQVIgUmFuZG9tQnl0ZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3U4IFJhbmRvbUJ5dGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCVVMT05HIGk7Ci0JVUNIQVIgUiwgUmVzdWx0OworCXVuc2lnbmVkIGxvbmcgaTsKKwl1OCBSLCBSZXN1bHQ7CiAKIAlSID0gMDsKIAogCWlmIChwQWQtPk1sbWUuU2hpZnRSZWcgPT0gMCkKLQlOZGlzR2V0U3lzdGVtVXBUaW1lKChVTE9ORyAqKSZwQWQtPk1sbWUuU2hpZnRSZWcpOworCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCh1bnNpZ25lZCBsb25nICopICYgcEFkLT5NbG1lLlNoaWZ0UmVnKTsKIAotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JewotCQlpZiAocEFkLT5NbG1lLlNoaWZ0UmVnICYgMHgwMDAwMDAwMSkKLQkJewotCQkJcEFkLT5NbG1lLlNoaWZ0UmVnID0gKChwQWQtPk1sbWUuU2hpZnRSZWcgXiBMRlNSX01BU0spID4+IDEpIHwgMHg4MDAwMDAwMDsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWlmIChwQWQtPk1sbWUuU2hpZnRSZWcgJiAweDAwMDAwMDAxKSB7CisJCQlwQWQtPk1sbWUuU2hpZnRSZWcgPQorCQkJICAgICgocEFkLT5NbG1lLgorCQkJICAgICAgU2hpZnRSZWcgXiBMRlNSX01BU0spID4+IDEpIHwgMHg4MDAwMDAwMDsKIAkJCVJlc3VsdCA9IDE7Ci0JCX0KLQkJZWxzZQotCQl7CisJCX0gZWxzZSB7CiAJCQlwQWQtPk1sbWUuU2hpZnRSZWcgPSBwQWQtPk1sbWUuU2hpZnRSZWcgPj4gMTsKIAkJCVJlc3VsdCA9IDA7CiAJCX0KQEAgLTUxOTgsMjQ1NCArNTIyOCw2IEBACiAJcmV0dXJuIFI7CiB9CiAKLVZPSUQgQXNpY1VwZGF0ZUF1dG9GYWxsQmFja1RhYmxlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBSYXRlVGFibGUpCi17Ci0JVUNIQVIJCQkJCWk7Ci0JSFRfRkJLX0NGRzBfU1RSVUMJCUh0Q2ZnMDsKLQlIVF9GQktfQ0ZHMV9TVFJVQwkJSHRDZmcxOwotCUxHX0ZCS19DRkcwX1NUUlVDCQlMZ0NmZzA7Ci0JTEdfRkJLX0NGRzFfU1RSVUMJCUxnQ2ZnMTsKLQlQUlRNUF9UWF9SQVRFX1NXSVRDSAlwQ3VyclR4UmF0ZSwgcE5leHRUeFJhdGU7Ci0KLQkvLyBzZXQgdG8gaW5pdGlhbCB2YWx1ZQotCUh0Q2ZnMC53b3JkID0gMHg2NTQzMjEwMDsKLQlIdENmZzEud29yZCA9IDB4ZWRjYmE5ODg7Ci0JTGdDZmcwLndvcmQgPSAweGVkY2JhOTg4OwotCUxnQ2ZnMS53b3JkID0gMHgwMDAwMjEwMDsKLQotCXBOZXh0VHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKXBSYXRlVGFibGUrMTsKLQlmb3IgKGkgPSAxOyBpIDwgKigoUFVDSEFSKSBwUmF0ZVRhYmxlKTsgaSsrKQotCXsKLQkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpcFJhdGVUYWJsZSsxK2k7Ci0JCXN3aXRjaCAocEN1cnJUeFJhdGUtPk1vZGUpCi0JCXsKLQkJCWNhc2UgMDoJCS8vQ0NLCi0JCQkJYnJlYWs7Ci0JCQljYXNlIDE6CQkvL09GRE0KLQkJCQl7Ci0JCQkJCXN3aXRjaChwQ3VyclR4UmF0ZS0+Q3Vyck1DUykKLQkJCQkJewotCQkJCQkJY2FzZSAwOgotCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTMEZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgMToKLQkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzFGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDI6Ci0JCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1MyRkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAzOgotCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTM0ZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgNDoKLQkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzRGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDU6Ci0JCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1M1RkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSA2OgotCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTNkZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgNzoKLQkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzdGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6CQkvL0hULU1JWAotCQkJY2FzZSAzOgkJLy9IVC1HRgotCQkJCXsKLQkJCQkJaWYgKChwTmV4dFR4UmF0ZS0+TW9kZSA+PSBNT0RFX0hUTUlYKSAmJiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgIT0gcE5leHRUeFJhdGUtPkN1cnJNQ1MpKQotCQkJCQl7Ci0JCQkJCQlzd2l0Y2gocEN1cnJUeFJhdGUtPkN1cnJNQ1MpCi0JCQkJCQl7Ci0JCQkJCQkJY2FzZSAwOgotCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MwRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMToKLQkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTMUZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDI6Ci0JCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzJGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAzOgotCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MzRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgNDoKLQkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTNEZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDU6Ci0JCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzVGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSA2OgotCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1M2RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgNzoKLQkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTN0ZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDg6Ci0JCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzhGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSA5OgotCQkJCQkJCQlIdENmZzEuZmllbGQuSFRNQ1M5RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMTA6Ci0JCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzEwRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMTE6Ci0JCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzExRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMTI6Ci0JCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzEyRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMTM6Ci0JCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzEzRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMTQ6Ci0JCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzE0RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMTU6Ci0JCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzE1RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFzaWNVcGRhdGVBdXRvRmFsbEJhY2tUYWJsZTogbm90IHN1cHBvcnQgQ3Vyck1DUz0lZFxuIiwgcEN1cnJUeFJhdGUtPkN1cnJNQ1MpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJfQotCi0JCXBOZXh0VHhSYXRlID0gcEN1cnJUeFJhdGU7Ci0JfQotCi0JUlRNUF9JT19XUklURTMyKHBBZCwgSFRfRkJLX0NGRzAsIEh0Q2ZnMC53b3JkKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIVF9GQktfQ0ZHMSwgSHRDZmcxLndvcmQpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIExHX0ZCS19DRkcwLCBMZ0NmZzAud29yZCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgTEdfRkJLX0NGRzEsIExnQ2ZnMS53b3JkKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVNldCBNQUMgcmVnaXN0ZXIgdmFsdWUgYWNjb3JkaW5nIG9wZXJhdGlvbiBtb2RlLgotCQlPcGVyYXRpb25Nb2RlIEFORCBiTm9uR0ZFeGlzdCBhcmUgZm9yIE1NIGFuZCBHRiBQcm90ZWNpdG9uLgotCQlJZiBNTSBvciBHRiBtYXNrIGlzIG5vdCBzZXQsIHRob3NlIHBhc3NpbmcgYXJndW1lbnQgZG9lc24ndCBub3QgdGFrZSBlZmZlY3QuCi0KLQkJT3BlcmF0aW9uIG1vZGUgbWVhbmluZzoKLQkJPSAwIDogUHVyZSBIVCwgbm8gcHJlb3RlY3Rpb24uCi0JCT0gMHgwMTsgdGhlcmUgbWF5IGJlIG5vbi1IVCBkZXZpY2VzIGluIGJvdGggdGhlIGNvbnRyb2wgYW5kIGV4dGVuc2lvbiBjaGFubmVsLCBwcm90ZWN0aW9uIGlzIG9wdGlvbmFsIGluIEJTUy4KLQkJPSAweDEwOiBObyBUcmFuc21pc3Npb24gaW4gNDBNIGlzIHByb3RlY3RlZC4KLQkJPSAweDExOiBUcmFuc21pc3Npb24gaW4gYm90aCA0ME0gYW5kIDIwTSBzaGFsbCBiZSBwcm90ZWN0ZWQKLQkJaWYgKGJOb25HRkV4aXN0KQotCQkJd2Ugc2hvdWxkIGNob29zZSBub3QgdG8gdXNlIEdGLiBCdXQgc3RpbGwgc2V0IGNvcnJlY3QgQVNJQyByZWdpc3RlcnMuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCAJQXNpY1VwZGF0ZVByb3RlY3QoCi0JSU4JCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOIAkJVVNIT1JUCQkJT3BlcmF0aW9uTW9kZSwKLQlJTiAJCVVDSEFSCQkJU2V0TWFzaywKLQlJTgkJQk9PTEVBTgkJCWJEaXNhYmxlQkdQcm90ZWN0LAotCUlOCQlCT09MRUFOCQkJYk5vbkdGRXhpc3QpCi17Ci0JUFJPVF9DRkdfU1RSVUMJUHJvdENmZywgUHJvdENmZzQ7Ci0JVUlOVDMyIFByb3RlY3RbNl07Ci0JVVNIT1JUCQkJb2Zmc2V0OwotCVVDSEFSCQkJaTsKLQlVSU5UMzIgTWFjUmVnID0gMDsKLQotCWlmICghKHBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QpICYmIChPcGVyYXRpb25Nb2RlICE9IDgpKQotCXsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yKQotCXsKLQkJLy8KLQkJLy8gZW5hYmxlIHRoZSBSVFMvQ1RTIHRvIGF2b2lkIGNoYW5uZWwgY29sbGlzaW9uCi0JCS8vCi0JCVNldE1hc2sgPSBBTExOX1NFVFBST1RFQ1Q7Ci0JCU9wZXJhdGlvbk1vZGUgPSA4OwotCX0KLQotCS8vIENvbmZpZyBBU0lDIFJUUyB0aHJlc2hvbGQgcmVnaXN0ZXIKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1JUU19DRkcsICZNYWNSZWcpOwotCU1hY1JlZyAmPSAweEZGMDAwMEZGOwotCi0JLy8gSWYgdGhlIHVzZXIgd2FudCBkaXNhYmxlIFJ0c1RocmVzaG9sZCBhbmQgZW5hYmxlIEFtc2R1L1JhbGluay1BZ2dyZWdhdGlvbiwgc2V0IHRoZSBSdHNUaHJlc2hvbGQgYXMgNDA5NgotICAgICAgICBpZiAoKAotCQkJKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSkgfHwKLQkJCShwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID09IFRSVUUpKQotICAgICAgICAgICAgJiYgcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID09IE1BWF9SVFNfVEhSRVNIT0xEKQotICAgICAgICB7Ci0JCQlNYWNSZWcgfD0gKDB4MTAwMCA8PCA4KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLQkJCU1hY1JlZyB8PSAocEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkIDw8IDgpOwotICAgICAgICB9Ci0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9SVFNfQ0ZHLCBNYWNSZWcpOwotCi0JLy8gSW5pdGlhbCBjb21tb24gcHJvdGVjdGlvbiBzZXR0aW5ncwotCVJUTVBaZXJvTWVtb3J5KFByb3RlY3QsIHNpemVvZihQcm90ZWN0KSk7Ci0JUHJvdENmZzQud29yZCA9IDA7Ci0JUHJvdENmZy53b3JkID0gMDsKLQlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0dGNDAgPSAxOwotCVByb3RDZmcuZmllbGQuVHhvcEFsbG93R0YyMCA9IDE7Ci0JUHJvdENmZy5maWVsZC5UeG9wQWxsb3dNTTQwID0gMTsKLQlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd01NMjAgPSAxOwotCVByb3RDZmcuZmllbGQuVHhvcEFsbG93T2ZkbSA9IDE7Ci0JUHJvdENmZy5maWVsZC5UeG9wQWxsb3dDY2sgPSAxOwotCVByb3RDZmcuZmllbGQuUlRTVGhFbiA9IDE7Ci0JUHJvdENmZy5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKLQotCS8vIHVwZGF0ZSBQSFkgbW9kZSBhbmQgcmF0ZQotCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCi0JCVByb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgPSAweDQwMDA7Ci0JUHJvdENmZy5maWVsZC5Qcm90ZWN0UmF0ZSB8PSBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlOwotCi0JLy8gSGFuZGxlIGxlZ2FjeShCL0cpIHByb3RlY3Rpb24KLQlpZiAoYkRpc2FibGVCR1Byb3RlY3QpCi0JewotCQkvL1Byb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlOwotCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gMDsKLQkJUHJvdGVjdFswXSA9IFByb3RDZmcud29yZDsKLQkJUHJvdGVjdFsxXSA9IFByb3RDZmcud29yZDsKLQl9Ci0JZWxzZQotCXsKLQkJLy9Qcm90Q2ZnLmZpZWxkLlByb3RlY3RSYXRlID0gcEFkLT5Db21tb25DZmcuUnRzUmF0ZTsKLQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IDA7CQkJLy8gQ0NLIGRvIG5vdCBuZWVkIHRvIGJlIHByb3RlY3RlZAotCQlQcm90ZWN0WzBdID0gUHJvdENmZy53b3JkOwotCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19DVFM7CS8vIE9GRE0gbmVlZHMgdXNpbmcgQ0NLIHRvIHByb3RlY3QKLQkJUHJvdGVjdFsxXSA9IFByb3RDZmcud29yZDsKLQl9Ci0KLQkvLyBEZWNpZGUgSFQgZnJhbWUgcHJvdGVjdGlvbi4KLQlpZiAoKFNldE1hc2sgJiBBTExOX1NFVFBST1RFQ1QpICE9IDApCi0JewotCQlzd2l0Y2goT3BlcmF0aW9uTW9kZSkKLQkJewotCQkJY2FzZSAweDA6Ci0JCQkJLy8gTk8gUFJPVEVDVAotCQkJCS8vIDEuQWxsIFNUQXMgaW4gdGhlIEJTUyBhcmUgMjAvNDAgTUh6IEhUCi0JCQkJLy8gMi4gaW4gYWkgMjAvNDBNSHogQlNTCi0JCQkJLy8gMy4gYWxsIFNUQXMgYXJlIDIwTUh6IGluIGEgMjBNSHogQlNTCi0JCQkJLy8gUHVyZSBIVC4gbm8gcHJvdGVjdGlvbi4KLQotCQkJCS8vIE1NMjBfUFJPVF9DRkcKLQkJCQkvLwlSZXNlcnZlZCAoMzE6MjcpCi0JCQkJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMDEwMTExCi0JCQkJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCi0JCQkJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCi0JCQkJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkKLQkJCQlQcm90ZWN0WzJdID0gMHgwMTc0NDAwNDsKLQotCQkJCS8vIE1NNDBfUFJPVF9DRkcKLQkJCQkvLwlSZXNlcnZlZCAoMzE6MjcpCi0JCQkJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMTExMTExCi0JCQkJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCi0JCQkJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCi0JCQkJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDg0IChkdXBsaWNhdGUgT0ZETSAyNE0pCi0JCQkJUHJvdGVjdFszXSA9IDB4MDNmNDQwODQ7Ci0KLQkJCQkvLyBDRjIwX1BST1RfQ0ZHCi0JCQkJLy8JUmVzZXJ2ZWQgKDMxOjI3KQotCQkJCS8vIAlQUk9UX1RYT1AoMjU6MjApIC0tIDAxMDExMQotCQkJCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQotCQkJCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQotCQkJCS8vIAlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDAwNCAoT0ZETSAyNE0pCi0JCQkJUHJvdGVjdFs0XSA9IDB4MDE3NDQwMDQ7Ci0KLQkJCQkvLyBDRjQwX1BST1RfQ0ZHCi0JCQkJLy8JUmVzZXJ2ZWQgKDMxOjI3KQotCQkJCS8vIAlQUk9UX1RYT1AoMjU6MjApIC0tIDExMTExMQotCQkJCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQotCQkJCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQotCQkJCS8vIAlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDA4NCAoZHVwbGljYXRlIE9GRE0gMjRNKQotCQkJCVByb3RlY3RbNV0gPSAweDAzZjQ0MDg0OwotCi0JCQkJaWYgKGJOb25HRkV4aXN0KQotCQkJCXsKLQkJCQkJLy8gUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3RpaW9uKQotCQkJCQkvLyBQUk9UX0NUUkwoMTc6MTYpIC0tIDAxIChSVFMvQ1RTKQotCQkJCQlQcm90ZWN0WzRdID0gMHgwMTc1NDAwNDsKLQkJCQkJUHJvdGVjdFs1XSA9IDB4MDNmNTQwODQ7Ci0JCQkJfQotCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBGQUxTRTsKLQkJCQlicmVhazsKLQotIAkJCWNhc2UgMToKLQkJCQkvLyBUaGlzIGlzICJIVCBub24tbWVtYmVyIHByb3RlY3Rpb24gbW9kZS4iCi0JCQkJLy8gSWYgdGhlcmUgbWF5IGJlIG5vbi1IVCBTVEFzIG15IEJTUwotCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDQwMDQ7CS8vIFBST1RfQ1RSTCgxNzoxNikgOiAwIChOb25lKQotCQkJCVByb3RDZmc0LndvcmQgPSAweDAzZjQ0MDg0OyAvLyBkdXBsaWNhZXQgbGVnYWN5IDI0TS4gQlcgc2V0IDEuCi0JCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpKQotCQkJCXsKLQkJCQkJUHJvdENmZy53b3JkID0gMHgwMTc0MDAwMzsJLy9FUlAgdXNlIFByb3RlY3Rpb24gYml0IGlzIHNldCwgdXNlIHByb3RlY3Rpb24gcmF0ZSBhdCBDbGF1c2UgMTguLgotCQkJCQlQcm90Q2ZnNC53b3JkID0gMHgwM2Y0MDAwMzsgLy8gRG9uJ3QgZHVwbGljYXRlIFJUUy9DVFMgaW4gQ0NLIG1vZGUuIDB4MDNmNDAwODM7Ci0JCQkJfQotCQkJCS8vQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciAyMCY0MCBNSHogcGFja2V0cwotCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKLQkJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOwotCQkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19SVFM7Ci0JCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7Ci0JCQkJUHJvdGVjdFsyXSA9IFByb3RDZmcud29yZDsKLQkJCQlQcm90ZWN0WzNdID0gUHJvdENmZzQud29yZDsKLQkJCQlQcm90ZWN0WzRdID0gUHJvdENmZy53b3JkOwotCQkJCVByb3RlY3RbNV0gPSBQcm90Q2ZnNC53b3JkOwotCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBUUlVFOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIDI6Ci0JCQkJLy8gSWYgb25seSBIVCBTVEFzIGFyZSBpbiBCU1MuIGF0IGxlYXN0IG9uZSBpcyAyME1Iei4gT25seSBwcm90ZWN0IDQwTUh6IHBhY2tldHMKLQkJCQlQcm90Q2ZnLndvcmQgPSAweDAxNzQ0MDA0OyAgLy8gUFJPVF9DVFJMKDE3OjE2KSA6IDAgKE5vbmUpCi0JCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDQwODQ7IC8vIGR1cGxpY2FldCBsZWdhY3kgMjRNLiBCVyBzZXQgMS4KLQotCQkJCS8vQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciA0ME1IeiBwYWNrZXRzCi0JCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKLQkJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKLQkJCQlQcm90ZWN0WzJdID0gUHJvdENmZy53b3JkOwotCQkJCVByb3RlY3RbM10gPSBQcm90Q2ZnNC53b3JkOwotCQkJCWlmIChiTm9uR0ZFeGlzdCkKLQkJCQl7Ci0JCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKLQkJCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKLQkJCQl9Ci0JCQkJUHJvdGVjdFs0XSA9IFByb3RDZmcud29yZDsKLQkJCQlQcm90ZWN0WzVdID0gUHJvdENmZzQud29yZDsKLQotCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBGQUxTRTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSAzOgotCQkJCS8vIEhUIG1peGVkIG1vZGUuCSBQUk9URUNUIEFMTCEKLQkJCQkvLyBBc3NpZ24gUmF0ZQotCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDQwMDQ7CS8vZHVwbGljYWV0IGxlZ2FjeSAyNE0uIEJXIHNldCAxLgotCQkJCVByb3RDZmc0LndvcmQgPSAweDAzZjQ0MDg0OwotCQkJCS8vIGJvdGggMjBNSHogYW5kIDQwTUh6IGFyZSBwcm90ZWN0ZWQuIFdoZXRoZXIgdXNlIFJUUyBvciBDVFMtdG8tc2VsZiBkZXBlbmRzIG9uIHRoZQotCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKSkKLQkJCQl7Ci0JCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDAwMDM7CS8vRVJQIHVzZSBQcm90ZWN0aW9uIGJpdCBpcyBzZXQsIHVzZSBwcm90ZWN0aW9uIHJhdGUgYXQgQ2xhdXNlIDE4Li4KLQkJCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDAwMDM7IC8vIERvbid0IGR1cGxpY2F0ZSBSVFMvQ1RTIGluIENDSyBtb2RlLiAweDAzZjQwMDgzCi0JCQkJfQotCQkJCS8vQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciAyMCY0MCBNSHogcGFja2V0cwotCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKLQkJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOwotCQkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19SVFM7Ci0JCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7Ci0JCQkJUHJvdGVjdFsyXSA9IFByb3RDZmcud29yZDsKLQkJCQlQcm90ZWN0WzNdID0gUHJvdENmZzQud29yZDsKLQkJCQlQcm90ZWN0WzRdID0gUHJvdENmZy53b3JkOwotCQkJCVByb3RlY3RbNV0gPSBQcm90Q2ZnNC53b3JkOwotCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBUUlVFOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIDg6Ci0JCQkJLy8gU3BlY2lhbCBvbiBmb3IgQXRoZXJvcyBwcm9ibGVtIG4gY2hpcC4KLQkJCQlQcm90ZWN0WzJdID0gMHgwMTc1NDAwNDsKLQkJCQlQcm90ZWN0WzNdID0gMHgwM2Y1NDA4NDsKLQkJCQlQcm90ZWN0WzRdID0gMHgwMTc1NDAwNDsKLQkJCQlQcm90ZWN0WzVdID0gMHgwM2Y1NDA4NDsKLQkJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJSVFNMb25nUHJvdE9uID0gVFJVRTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCW9mZnNldCA9IENDS19QUk9UX0NGRzsKLQlmb3IgKGkgPSAwO2kgPCA2O2krKykKLQl7Ci0JCWlmICgoU2V0TWFzayAmICgxPDwgaSkpKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQgKyBpKjQsIFByb3RlY3RbaV0pOwotCQl9Ci0JfQotfQotCi0jaWZkZWYgUlQyODcwCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlMb2FkIFJGIG5vcm1hbCBvcGVyYXRpb24tbW9kZSBzZXR1cAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBSVDMweHhMb2FkUkZOb3JtYWxNb2RlU2V0dXAoCi0JSU4gUFJUTVBfQURBUFRFUiAJcEFkKQotewotCVVDSEFSIFJGVmFsdWU7Ci0KLQkvLyBSWDBfUEQgJiBUWDBfUEQsIFJGIFIxIHJlZ2lzdGVyIEJpdCAyICYgQml0IDMgdG8gMCBhbmQgUkZfQkxPQ0tfZW4sUlgxX1BEICYgVFgxX1BELCBCaXQwLCBCaXQgNCAmIEJpdDUgdG8gMQotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCAmUkZWYWx1ZSk7Ci0JUkZWYWx1ZSA9IChSRlZhbHVlICYgKH4weDBDKSkgfCAweDMxOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgUkZWYWx1ZSk7Ci0KLQkvLyBUWF9MTzJfZW4sIFJGIFIxNSByZWdpc3RlciBCaXQgMyB0byAwCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMTUsICZSRlZhbHVlKTsKLQlSRlZhbHVlICY9ICh+MHgwOCk7Ci0JUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjE1LCBSRlZhbHVlKTsKLQotCS8vIFRYX0xPMV9lbiwgUkYgUjE3IHJlZ2lzdGVyIEJpdCAzIHRvIDAKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IxNywgJlJGVmFsdWUpOwotCVJGVmFsdWUgJj0gKH4weDA4KTsKLQkvLyB0byBmaXggcnggbG9uZyByYW5nZSBpc3N1ZQotCWlmICgoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPj0gMHgwMjExKSAmJiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yRyA9PSAwKSkKLQl7Ci0JCVJGVmFsdWUgfD0gMHgyMDsKLQl9Ci0JUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjE3LCBSRlZhbHVlKTsKLQotCS8vIFJYX0xPMV9lbiwgUkYgUjIwIHJlZ2lzdGVyIEJpdCAzIHRvIDAKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMCwgJlJGVmFsdWUpOwotCVJGVmFsdWUgJj0gKH4weDA4KTsKLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjAsIFJGVmFsdWUpOwotCi0JLy8gUlhfTE8yX2VuLCBSRiBSMjEgcmVnaXN0ZXIgQml0IDMgdG8gMAotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIxLCAmUkZWYWx1ZSk7Ci0JUkZWYWx1ZSAmPSAofjB4MDgpOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMSwgUkZWYWx1ZSk7Ci0KLQkvLyBMRE9SRl9WQywgUkYgUjI3IHJlZ2lzdGVyIEJpdCAyIHRvIDAKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgJlJGVmFsdWUpOwotCWlmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIxMSkKLQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgKH4weDc3KSkgfCAweDM7Ci0JZWxzZQotCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAofjB4NzcpKTsKLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsIFJGVmFsdWUpOwotCS8qIGVuZCBqb2hubGkgKi8KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JTG9hZCBSRiBzbGVlcC1tb2RlIHNldHVwCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFJUMzB4eExvYWRSRlNsZWVwTW9kZVNldHVwKAotCUlOIFBSVE1QX0FEQVBURVIgCXBBZCkKLXsKLQlVQ0hBUiBSRlZhbHVlOwotCVVJTlQzMiBNQUNWYWx1ZTsKLQotCS8vIFJGX0JMT0NLX2VuLiBSRiBSMSByZWdpc3RlciBCaXQgMCB0byAwCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDEsICZSRlZhbHVlKTsKLQlSRlZhbHVlICY9ICh+MHgwMSk7Ci0JUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCBSRlZhbHVlKTsKLQotCS8vIFZDT19JQywgUkYgUjcgcmVnaXN0ZXIgQml0IDQgJiBCaXQgNSB0byAwCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsICZSRlZhbHVlKTsKLQlSRlZhbHVlICY9ICh+MHgzMCk7Ci0JUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA3LCBSRlZhbHVlKTsKLQotCS8vIElkb2gsIFJGIFI5IHJlZ2lzdGVyIEJpdCAxLCBCaXQgMiAmIEJpdCAzIHRvIDAKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwOSwgJlJGVmFsdWUpOwotCVJGVmFsdWUgJj0gKH4weDBFKTsKLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDksIFJGVmFsdWUpOwotCi0JLy8gUlhfQ1RCX2VuLCBSRiBSMjEgcmVnaXN0ZXIgQml0IDcgdG8gMAotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIxLCAmUkZWYWx1ZSk7Ci0JUkZWYWx1ZSAmPSAofjB4ODApOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMSwgUkZWYWx1ZSk7Ci0KLQkvLyBMRE9SRl9WQywgUkYgUjI3IHJlZ2lzdGVyIEJpdCAwLCBCaXQgMSAmIEJpdCAyIHRvIDEKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgJlJGVmFsdWUpOwotCVJGVmFsdWUgfD0gMHg3NzsKLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsIFJGVmFsdWUpOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBMRE9fQ0ZHMCwgJk1BQ1ZhbHVlKTsKLQlNQUNWYWx1ZSB8PSAweDFEMDAwMDAwOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIExET19DRkcwLCBNQUNWYWx1ZSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCVJldmVyc2UgUkYgc2xlZXAtbW9kZSBzZXR1cAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBSVDMweHhSZXZlcnNlUkZTbGVlcE1vZGVTZXR1cCgKLQlJTiBQUlRNUF9BREFQVEVSIAlwQWQpCi17Ci0JVUNIQVIgUkZWYWx1ZTsKLQlVSU5UMzIgTUFDVmFsdWU7Ci0KLQkvLyBSRl9CTE9DS19lbiwgUkYgUjEgcmVnaXN0ZXIgQml0IDAgdG8gMQotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCAmUkZWYWx1ZSk7Ci0JUkZWYWx1ZSB8PSAweDAxOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgUkZWYWx1ZSk7Ci0KLQkvLyBWQ09fSUMsIFJGIFI3IHJlZ2lzdGVyIEJpdCA0ICYgQml0IDUgdG8gMQotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjA3LCAmUkZWYWx1ZSk7Ci0JUkZWYWx1ZSB8PSAweDMwOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwNywgUkZWYWx1ZSk7Ci0KLQkvLyBJZG9oLCBSRiBSOSByZWdpc3RlciBCaXQgMSwgQml0IDIgJiBCaXQgMyB0byAxCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDksICZSRlZhbHVlKTsKLQlSRlZhbHVlIHw9IDB4MEU7Ci0JUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA5LCBSRlZhbHVlKTsKLQotCS8vIFJYX0NUQl9lbiwgUkYgUjIxIHJlZ2lzdGVyIEJpdCA3IHRvIDEKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMSwgJlJGVmFsdWUpOwotCVJGVmFsdWUgfD0gMHg4MDsKLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjEsIFJGVmFsdWUpOwotCi0JLy8gTERPUkZfVkMsIFJGIFIyNyByZWdpc3RlciBCaXQgMiB0byAwCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsICZSRlZhbHVlKTsKLQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMTEpCi0JCVJGVmFsdWUgPSAoUkZWYWx1ZSAmICh+MHg3NykpIHwgMHgzOwotCWVsc2UKLQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgKH4weDc3KSk7Ci0JUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCBSRlZhbHVlKTsKLQotCS8vIFJUMzA3MSB2ZXJzaW9uIEUgaGFzIGZpeGVkIHRoaXMgaXNzdWUKLQlpZiAoKHBBZC0+TmljQ29uZmlnMi5maWVsZC5EQUNUZXN0Qml0ID09IDEpICYmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIxMSkpCi0JewotCQkvLyBwYXRjaCB0eCBFVk0gaXNzdWUgdGVtcG9yYXJpbHkKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBMRE9fQ0ZHMCwgJk1BQ1ZhbHVlKTsKLQkJTUFDVmFsdWUgPSAoKE1BQ1ZhbHVlICYgMHhFMEZGRkZGRikgfCAweDBEMDAwMDAwKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTERPX0NGRzAsIE1BQ1ZhbHVlKTsKLQl9Ci0JZWxzZQotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBMRE9fQ0ZHMCwgJk1BQ1ZhbHVlKTsKLQkJTUFDVmFsdWUgPSAoKE1BQ1ZhbHVlICYgMHhFMEZGRkZGRikgfCAweDAxMDAwMDAwKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTERPX0NGRzAsIE1BQ1ZhbHVlKTsKLQl9Ci19Ci0jZW5kaWYKLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXNpY1N3aXRjaENoYW5uZWwoCi0JCQkJCSAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUNIQVIJCQlDaGFubmVsLAotCUlOCUJPT0xFQU4JCQliU2NhbikKLXsKLQlVTE9ORwkJCVIyID0gMCwgUjMgPSBERUZBVUxUX1JGX1RYX1BPV0VSLCBSNCA9IDA7Ci0JQ0hBUiAgICBUeFB3ZXIgPSAwLCBUeFB3ZXIyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsgLy9CYnA5NCA9IEJCUFI5NF9ERUZBVUxULCBUeFB3ZXIyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQlVQ0hBUglpbmRleDsKLQlVSU5UMzIgCVZhbHVlID0gMDsgLy9CYnBSZWcsIFZhbHVlOwotCVJUTVBfUkZfUkVHUyAqUkZSZWdUYWJsZTsKLQotCS8vIFNlYXJjaCBUeCBwb3dlciB2YWx1ZQotCS8vIFdlIGNhbid0IHVzZSBDaGFubmVsTGlzdCB0byBzZWFyY2ggY2hhbm5lbCwgc2luY2Ugc29tZSBjZW50cmFsIGNoYW5ubCdzIHR4cG93ciBkb2Vzbid0IGxpc3QKLQkvLyBpbiBDaGFubmVsTGlzdCwgc28gdXNlIFR4UG93ZXIgYXJyYXkgaW5zdGVhZC4KLQkvLwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGluZGV4KyspCi0JewotCQlpZiAoQ2hhbm5lbCA9PSBwQWQtPlR4UG93ZXJbaW5kZXhdLkNoYW5uZWwpCi0JewotCQkJVHhQd2VyID0gcEFkLT5UeFBvd2VyW2luZGV4XS5Qb3dlcjsKLQkJCVR4UHdlcjIgPSBwQWQtPlR4UG93ZXJbaW5kZXhdLlBvd2VyMjsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKGluZGV4ID09IE1BWF9OVU1fT0ZfQ0hBTk5FTFMpCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFzaWNTd2l0Y2hDaGFubmVsOiBDYW4ndCBmaW5kIHRoZSBDaGFubmVsIyVkIFxuIiwgQ2hhbm5lbCkpOwotCi0jaWZkZWYgUlQyODcwCi0JLy8gVGhlIFJGIHByb2dyYW1taW5nIHNlcXVlbmNlIGlzIGRpZmZlcmVuY2UgYmV0d2VlbiAzeHh4IGFuZCAyeHh4Ci0JaWYgKChJU19SVDMwNzAocEFkKSB8fCBJU19SVDMwOTAocEFkKSkgJiYgKAotCSAgICAgKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIyKSB8fCAocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjEpIHx8Ci0JICAgICAocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjApIHx8IChwQWQtPlJmSWNUeXBlID09IFJGSUNfMjAyMCkpKQotCXsKLQkJLyogbW9kaWZ5IGJ5IFdZIGZvciBSZWFkIFJGIFJlZy4gZXJyb3IgKi8KLQkJVUNIQVIgUkZWYWx1ZTsKLQotCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMzAyMF9DSE5MOyBpbmRleCsrKQotCQl7Ci0JCQlpZiAoQ2hhbm5lbCA9PSBGcmVxSXRlbXMzMDIwW2luZGV4XS5DaGFubmVsKQotCQkJewotCQkJCS8vIFByb2dyYW1taW5nIGNoYW5uZWwgcGFyYW1ldGVycwotCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwMiwgRnJlcUl0ZW1zMzAyMFtpbmRleF0uTik7Ci0JCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjAzLCBGcmVxSXRlbXMzMDIwW2luZGV4XS5LKTsKLQotCQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjA2LCAmUkZWYWx1ZSk7Ci0JCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgMHhGQykgfCBGcmVxSXRlbXMzMDIwW2luZGV4XS5SOwotCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwNiwgUkZWYWx1ZSk7Ci0KLQkJCQkvLyBTZXQgVHgwIFBvd2VyCi0JCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMTIsICZSRlZhbHVlKTsKLQkJCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAweEUwKSB8IFR4UHdlcjsKLQkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMTIsIFJGVmFsdWUpOwotCi0JCQkJLy8gU2V0IFR4MSBQb3dlcgotCQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjEzLCAmUkZWYWx1ZSk7Ci0JCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgMHhFMCkgfCBUeFB3ZXIyOwotCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IxMywgUkZWYWx1ZSk7Ci0KLQkJCQkvLyBUeC9SeCBTdHJlYW0gc2V0dGluZwotCQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCAmUkZWYWx1ZSk7Ci0JCQkJLy9pZiAoSVNfUlQzMDkwKHBBZCkpCi0JCQkJLy8JUkZWYWx1ZSB8PSAweDAxOyAvLyBFbmFibGUgUkYgYmxvY2suCi0JCQkJUkZWYWx1ZSAmPSAweDAzOwkvL2NsZWFyIGJpdFs3fjJdCi0JCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKLQkJCQkJUkZWYWx1ZSB8PSAweEEwOwotCQkJCWVsc2UgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikKLQkJCQkJUkZWYWx1ZSB8PSAweDgwOwotCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCi0JCQkJCVJGVmFsdWUgfD0gMHg1MDsKLQkJCQllbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCi0JCQkJCVJGVmFsdWUgfD0gMHg0MDsKLQkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDEsIFJGVmFsdWUpOwotCi0JCQkJLy8gU2V0IFJGIG9mZnNldAotCQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIzLCAmUkZWYWx1ZSk7Ci0JCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgMHg4MCkgfCBwQWQtPlJmRnJlcU9mZnNldDsKLQkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjMsIFJGVmFsdWUpOwotCi0JCQkJLy8gU2V0IEJXCi0JCQkJaWYgKCFiU2NhbiAmJiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKSkKLQkJCQl7Ci0JCQkJCVJGVmFsdWUgPSBwQWQtPk1sbWUuQ2FsaUJXNDBSZlIyNDsKLQkJCQkJLy9ESVNBQkxFXzExTl9DSEVDSyhwQWQpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlSRlZhbHVlID0gcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQ7Ci0JCQkJfQotCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgUkZWYWx1ZSk7Ci0JCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCBSRlZhbHVlKTsKLQotCQkJCS8vIEVuYWJsZSBSRiB0dW5pbmcKLQkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNywgJlJGVmFsdWUpOwotCQkJCVJGVmFsdWUgPSBSRlZhbHVlIHwgMHgxOwotCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwNywgUkZWYWx1ZSk7Ci0KLQkJCQkvLyBsYXRjaCBjaGFubmVsIGZvciBmdXR1cmUgdXNhZ2UuCi0JCQkJcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID0gQ2hhbm5lbDsKLQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaENoYW5uZWwjJWQoUkY9JWQsIFB3cjA9JWQsIFB3cjE9JWQsICVkVCksIE49MHglMDJYLCBLPTB4JTAyWCwgUj0weCUwMlhcbiIsCi0JCQkJCUNoYW5uZWwsCi0JCQkJCXBBZC0+UmZJY1R5cGUsCi0JCQkJCVR4UHdlciwKLQkJCQkJVHhQd2VyMiwKLQkJCQkJcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwKLQkJCQkJRnJlcUl0ZW1zMzAyMFtpbmRleF0uTiwKLQkJCQkJRnJlcUl0ZW1zMzAyMFtpbmRleF0uSywKLQkJCQkJRnJlcUl0ZW1zMzAyMFtpbmRleF0uUikpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3dpdGNoQ2hhbm5lbCMlZChSRj0lZCwgUHdyMD0lZCwgUHdyMT0lZCwgJWRUKSwgTj0weCUwMlgsIEs9MHglMDJYLCBSPTB4JTAyWFxuIiwKLQkJCUNoYW5uZWwsCi0JCQlwQWQtPlJmSWNUeXBlLAotCQkJVHhQd2VyLAotCQkJVHhQd2VyMiwKLQkJCXBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGgsCi0JCQlGcmVxSXRlbXMzMDIwW2luZGV4XS5OLAotCQkJRnJlcUl0ZW1zMzAyMFtpbmRleF0uSywKLQkJCUZyZXFJdGVtczMwMjBbaW5kZXhdLlIpKTsKLQl9Ci0JZWxzZQotI2VuZGlmIC8vIFJUMjg3MCAvLwotCXsKLQkJUkZSZWdUYWJsZSA9IFJGMjg1MFJlZ1RhYmxlOwotCi0JCXN3aXRjaCAocEFkLT5SZkljVHlwZSkKLQkJewotCQkJY2FzZSBSRklDXzI4MjA6Ci0JCQljYXNlIFJGSUNfMjg1MDoKLQkJCWNhc2UgUkZJQ18yNzIwOgotCQkJY2FzZSBSRklDXzI3NTA6Ci0KLQkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl8yODUwX0NITkw7IGluZGV4KyspCi0JCQl7Ci0JCQkJaWYgKENoYW5uZWwgPT0gUkZSZWdUYWJsZVtpbmRleF0uQ2hhbm5lbCkKLQkJCQl7Ci0JCQkJCVIyID0gUkZSZWdUYWJsZVtpbmRleF0uUjI7Ci0JCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCi0JCQkJCXsKLQkJCQkJCVIyIHw9IDB4NDAwMDsJLy8gSWYgVFhwYXRoIGlzIDEsIGJpdCAxNCA9IDE7Ci0JCQkJCX0KLQotCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQotCQkJCQl7Ci0JCQkJCQlSMiB8PSAweDQwOwkvLyB3cml0ZSAxIHRvIG9mZiBSeHBhdGguCi0JCQkJCX0KLQkJCQkJZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQotCQkJCQl7Ci0JCQkJCQlSMiB8PSAweDIwMDQwOwkvLyB3cml0ZSAxIHRvIG9mZiBSeFBhdGgKLQkJCQkJfQotCi0JCQkJCWlmIChDaGFubmVsID4gMTQpCi0JCQkJCXsKLQkJCQkJCS8vIGluaXRpYWxpemUgUjMsIFI0Ci0JCQkJCQlSMyA9IChSRlJlZ1RhYmxlW2luZGV4XS5SMyAmIDB4ZmZmZmMxZmYpOwotCQkJCQkJUjQgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjQgJiAofjB4MDAxZjg3YzApKSB8IChwQWQtPlJmRnJlcU9mZnNldCA8PCAxNSk7Ci0KLQkJCQkJCS8vIDVHIGJhbmQgcG93ZXIgcmFuZ2U6IDB4Rjl+MFgwRiwgVFgwIFJlZzMgYml0OS9UWDEgUmVnNCBiaXQ2PSIwIiBtZWFucyB0aGUgVFggcG93ZXIgcmVkdWNlIDdkQgotCQkJCQkJLy8gUjMKLQkJCQkJCWlmICgoVHhQd2VyID49IC03KSAmJiAoVHhQd2VyIDwgMCkpCi0JCQkJCQl7Ci0JCQkJCQkJVHhQd2VyID0gKDcrVHhQd2VyKTsKLQkJCQkJCQlUeFB3ZXIgPSAoVHhQd2VyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcik7Ci0JCQkJCQkJUjMgfD0gKFR4UHdlciA8PCAxMCk7Ci0JCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQXNpY1N3aXRjaENoYW5uZWw6IFR4UHdlcj0lZCBcbiIsIFR4UHdlcikpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCVR4UHdlciA9IChUeFB3ZXIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyKTsKLQkJCQkJCQlSMyB8PSAoVHhQd2VyIDw8IDEwKSB8ICgxIDw8IDkpOwotCQkJCQkJfQotCi0JCQkJCQkvLyBSNAotCQkJCQkJaWYgKChUeFB3ZXIyID49IC03KSAmJiAoVHhQd2VyMiA8IDApKQotCQkJCQkJewotCQkJCQkJCVR4UHdlcjIgPSAoNytUeFB3ZXIyKTsKLQkJCQkJCQlUeFB3ZXIyID0gKFR4UHdlcjIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyMik7Ci0JCQkJCQkJUjQgfD0gKFR4UHdlcjIgPDwgNyk7Ci0JCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQXNpY1N3aXRjaENoYW5uZWw6IFR4UHdlcjI9JWQgXG4iLCBUeFB3ZXIyKSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJVHhQd2VyMiA9IChUeFB3ZXIyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcjIpOwotCQkJCQkJCVI0IHw9IChUeFB3ZXIyIDw8IDcpIHwgKDEgPDwgNik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlSMyA9IChSRlJlZ1RhYmxlW2luZGV4XS5SMyAmIDB4ZmZmZmMxZmYpIHwgKFR4UHdlciA8PCA5KTsgLy8gc2V0IFRYIHBvd2VyMAotCQkJCQlSNCA9IChSRlJlZ1RhYmxlW2luZGV4XS5SNCAmICh+MHgwMDFmODdjMCkpIHwgKHBBZC0+UmZGcmVxT2Zmc2V0IDw8IDE1KSB8IChUeFB3ZXIyIDw8Nik7Ly8gU2V0IGZyZXEgT2Zmc2V0ICYgVHhQd3IxCi0JCQkJCX0KLQotCQkJCQkvLyBCYXNlZCBvbiBCQlAgY3VycmVudCBtb2RlIGJlZm9yZSBjaGFuZ2luZyBSRiBjaGFubmVsLgotCQkJCQlpZiAoIWJTY2FuICYmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApKQotCQkJCQl7Ci0JCQkJCQlSNCB8PTB4MjAwMDAwOwotCQkJCQl9Ci0KLQkJCQkJLy8gVXBkYXRlIHZhcmlhYmxlcwotCQkJCQlwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPSBDaGFubmVsOwotCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIxID0gUkZSZWdUYWJsZVtpbmRleF0uUjE7Ci0JCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjIgPSBSMjsKLQkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMyA9IFIzOwotCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlI0ID0gUjQ7Ci0KLQkJCQkJLy8gU2V0IFJGIHZhbHVlIDEncyBzZXQgUjNbYml0Ml0gPSBbMF0KLQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMSk7Ci0JCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOwotCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCAocEFkLT5MYXRjaFJmUmVncy5SMyAmICh+MHgwNCkpKTsKLQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SNCk7Ci0KLQkJCQkJUlRNUHVzZWNEZWxheSgyMDApOwotCi0JCQkJCS8vIFNldCBSRiB2YWx1ZSAyJ3Mgc2V0IFIzW2JpdDJdID0gWzFdCi0JCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOwotCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKLQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgfCAweDA0KSk7Ci0JCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOwotCi0JCQkJCVJUTVB1c2VjRGVsYXkoMjAwKTsKLQotCQkJCQkvLyBTZXQgUkYgdmFsdWUgMydzIHNldCBSM1tiaXQyXSA9IFswXQotCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKLQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMik7Ci0JCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIChwQWQtPkxhdGNoUmZSZWdzLlIzICYgKH4weDA0KSkpOwotCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKLQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLy8gQ2hhbmdlIEJCUCBzZXR0aW5nIGR1cmluZyBzaXd0Y2ggZnJvbSBhLT5nLCBnLT5hCi0JaWYgKENoYW5uZWwgPD0gMTQpCi0JewotCSAgICBVTE9ORwlUeFBpbkNmZyA9IDB4MDAwNTBGMEE7Ly9HYXJ5IDIwMDcvMDgvMDkgMHgwNTBBMEEKLQotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MiwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOwotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MywgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOwotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NCwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOwotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4NiwgMCk7Ly8oMHg0NCAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CS8vIEFjY29yZGluZyB0aGUgUm9yeSdzIHN1Z2dlc3Rpb24gdG8gc29sdmUgdGhlIG1pZGRsZSByYW5nZSBpc3N1ZS4KLQkJLy9SVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHg2Mik7Ci0KLQkJLy8gUnggSGlnaCBwb3dlciBWR0Egb2Zmc2V0IGZvciBMTkEgc2VsZWN0Ci0JICAgIGlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JHKQotCSAgICB7Ci0JICAgICAgICBSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHg2Mik7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3NSwgMHg0Nik7Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JICAgICAgICBSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHg4NCk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3NSwgMHg1MCk7Ci0JICAgIH0KLQotCQkvLyA1RyBiYW5kIHNlbGVjdGlvbiBQSU4sIGJpdDEgYW5kIGJpdDIgYXJlIGNvbXBsZW1lbnQKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKLQkJVmFsdWUgJj0gKH4weDYpOwotCQlWYWx1ZSB8PSAoMHgwNCk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7Ci0KLSAgICAgICAgLy8gVHVybiBvZmYgdW51c2VkIFBBIG9yIExOQSB3aGVuIG9ubHkgMVQgb3IgMVIKLQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKLQkJewotCQkJVHhQaW5DZmcgJj0gMHhGRkZGRkZGMzsKLQkJfQotCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQotCQl7Ci0JCQlUeFBpbkNmZyAmPSAweEZGRkZGM0ZGOwotCQl9Ci0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUElOX0NGRywgVHhQaW5DZmcpOwotCX0KLQllbHNlCi0JewotCSAgICBVTE9ORwlUeFBpbkNmZyA9IDB4MDAwNTBGMDU7Ly9HYXJ5IDIwMDcvOC85IDB4MDUwNTA1Ci0KLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjIsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjMsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjQsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODYsIDApOy8vKDB4NDQgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOyAgIC8vIEFjY29yZGluZyB0aGUgUm9yeSdzIHN1Z2dlc3Rpb24gdG8gc29sdmUgdGhlIG1pZGRsZSByYW5nZSBpc3N1ZS4KLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4RjIpOwotCi0JCS8vIFJ4IEhpZ2ggcG93ZXIgVkdBIG9mZnNldCBmb3IgTE5BIHNlbGVjdAotCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yQSkKLQkJewotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzUsIDB4NDYpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzUsIDB4NTApOwotCQl9Ci0KLQkJLy8gNUcgYmFuZCBzZWxlY3Rpb24gUElOLCBiaXQxIGFuZCBiaXQyIGFyZSBjb21wbGVtZW50Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZWYWx1ZSk7Ci0JCVZhbHVlICY9ICh+MHg2KTsKLQkJVmFsdWUgfD0gKDB4MDIpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgVmFsdWUpOwotCi0gICAgICAgIC8vIFR1cm4gb2ZmIHVudXNlZCBQQSBvciBMTkEgd2hlbiBvbmx5IDFUIG9yIDFSCi0JCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCi0JCXsKLQkJCVR4UGluQ2ZnICY9IDB4RkZGRkZGRjM7Ci0JfQotCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQotCQl7Ci0JCQlUeFBpbkNmZyAmPSAweEZGRkZGM0ZGOwotCX0KLQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QSU5fQ0ZHLCBUeFBpbkNmZyk7Ci0JfQotCi0gICAgLy8gUjY2IHNob3VsZCBiZSBzZXQgYWNjb3JkaW5nIHRvIENoYW5uZWwgYW5kIHVzZSAyME1IeiB3aGVuIHNjYW5uaW5nCi0JLy9SVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgKDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKSkpOwotCWlmIChiU2NhbikKLQkJUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIEJXXzIwKTsKLQllbHNlCi0JCVJUTVBTZXRBR0NJbml0VmFsdWUocEFkLCBwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcpOwotCi0JLy8KLQkvLyBPbiAxMUEsIFdlIHNob3VsZCBkZWxheSBhbmQgd2FpdCBSRi9CQlAgdG8gYmUgc3RhYmxlCi0JLy8gYW5kIHRoZSBhcHByb3ByaWF0ZSB0aW1lIHNob3VsZCBiZSAxMDAwIG1pY3JvIHNlY29uZHMKLQkvLyAyMDA1LzA2LzA1IC0gT24gMTFHLCBXZSBhbHNvIG5lZWQgdGhpcyBkZWxheSB0aW1lLiBPdGhlcndpc2UgaXQncyBkaWZmaWN1bHQgdG8gcGFzcyB0aGUgV0hRTC4KLQkvLwotCVJUTVB1c2VjRGVsYXkoMTAwMCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTd2l0Y2hDaGFubmVsIyVkKFJGPSVkLCBQd3IwPSVsdSwgUHdyMT0lbHUsICVkVCkgdG8gLCBSMT0weCUwOGx4LCBSMj0weCUwOGx4LCBSMz0weCUwOGx4LCBSND0weCUwOGx4XG4iLAotCQkJCQkJCSAgQ2hhbm5lbCwKLQkJCQkJCQkgIHBBZC0+UmZJY1R5cGUsCi0JCQkJCQkJICAoUjMgJiAweDAwMDAzZTAwKSA+PiA5LAotCQkJCQkJCSAgKFI0ICYgMHgwMDAwMDdjMCkgPj4gNiwKLQkJCQkJCQkgIHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGgsCi0JCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIxLAotCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMiwKLQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjMsCi0JCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlI0KSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgMjQyMSBvbmx5LCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGR1cmluZwotCQlzaXRlIHN1cnZleS4gSXQncyBvbmx5IHJlcXVpcmVkIGFmdGVyIE5JQyBkZWNpZGVkIHRvIHN0YXkgYXQgYSBjaGFubmVsCi0JCWZvciBhIGxvbmdlciBwZXJpb2QuCi0JCVdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIGl0J3MgYWx3YXlzIGFmdGVyIEFzaWNTd2l0Y2hDaGFubmVsKCkuCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljTG9ja0NoYW5uZWwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgQ2hhbm5lbCkKLXsKLX0KLQotVk9JRCBBc2ljUmZUdW5pbmdFeGVjKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKLXsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlHaXZlcyBDQ0sgVFggcmF0ZSAyIG1vcmUgZEIgVFggcG93ZXIuCi0JCVRoaXMgcm91dGluZSB3b3JrcyBvbmx5IGluIExJTksgVVAgaW4gSU5GUkFTVFJVQ1RVUkUgbW9kZS4KLQotCQljYWxjdWxhdGUgZGVzaXJlZCBUeCBwb3dlciBpbiBSRiBSMy5UeDB+NSwJc2hvdWxkIGNvbnNpZGVyIC0KLQkJMC4gaWYgY3VycmVudCByYWRpbyBpcyBhIG5vaXN5IGVudmlyb25tZW50IChwQWQtPkRyc0NvdW50ZXJzLmZOb2lzeUVudmlyb25tZW50KQotCQkxLiBUeFBvd2VyUGVyY2VudGFnZQotCQkyLiBhdXRvIGNhbGlicmF0aW9uIGJhc2VkIG9uIFRTU0kgZmVlZGJhY2sKLQkJMy4gZXh0cmEgMiBkYiBmb3IgQ0NLCi0JCTQuIC0xMCBkYiB1cG9uIHZlcnktc2hvcnQgZGlzdGFuY2UgKEF2Z1JTU0kgPj0gLTQwZGIpIHRvIEFQCi0KLQlOT1RFOiBTaW5jZSB0aGlzIHJvdXRpbmUgcmVxdWlyZXMgdGhlIHZhbHVlIG9mIChwQWQtPkRyc0NvdW50ZXJzLmZOb2lzeUVudmlyb25tZW50KSwKLQkJaXQgc2hvdWxkIGJlIGNhbGxlZCBBRlRFUiBNbG1lRHluYW1pY1R4UmF0U3dpdGNoaW5nKCkKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNBZGp1c3RUeFBvd2VyKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCUlOVAkJCWksIGo7Ci0JQ0hBUgkJRGVsdGFQd3IgPSAwOwotCUJPT0xFQU4JCWJBdXRvVHhBZ2MgPSBGQUxTRTsKLQlVQ0hBUgkJVHNzaVJlZiwgKnBUc3NpTWludXNCb3VuZGFyeSwgKnBUc3NpUGx1c0JvdW5kYXJ5LCBUeEFnY1N0ZXA7Ci0JVUNIQVIJCUJicFIxID0gMCwgQmJwUjQ5ID0gMCwgaWR4OwotCVBDSEFSCQlwVHhBZ2NDb21wZW5zYXRlOwotCVVMT05HCQlUeFB3cls1XTsKLQlDSEFSCQlWYWx1ZTsKLQotI2lmZGVmIFJUMjg2MAotCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpCi0JCXx8IChwQWQtPmJQQ0ljbGtPZmYgPT0gVFJVRSkKLQkJfHwgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKQotCQl8fCBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQotCQlyZXR1cm47Ci0jZW5kaWYKLQotCWlmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApCi0JewotCQlpZiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPiAxNCkKLQkJewotCQkJVHhQd3JbMF0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMF07Ci0JCQlUeFB3clsxXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFsxXTsKLQkJCVR4UHdyWzJdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzJdOwotCQkJVHhQd3JbM10gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbM107Ci0JCQlUeFB3cls0XSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFs0XTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVR4UHdyWzBdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzBdOwotCQkJVHhQd3JbMV0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMV07Ci0JCQlUeFB3clsyXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFsyXTsKLQkJCVR4UHdyWzNdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzNdOwotCQkJVHhQd3JbNF0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbNF07Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKLQkJewotCQkJVHhQd3JbMF0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMF07Ci0JCQlUeFB3clsxXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFsxXTsKLQkJCVR4UHdyWzJdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzJdOwotCQkJVHhQd3JbM10gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbM107Ci0JCQlUeFB3cls0XSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFs0XTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVR4UHdyWzBdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzBdOwotCQkJVHhQd3JbMV0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMV07Ci0JCQlUeFB3clsyXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFsyXTsKLQkJCVR4UHdyWzNdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzNdOwotCQkJVHhQd3JbNF0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbNF07Ci0JCX0KLQl9Ci0KLQkvLyBUWCBwb3dlciBjb21wZW5zYXRpb24gZm9yIHRlbXBlcmF0dXJlIHZhcmlhdGlvbiBiYXNlZCBvbiBUU1NJLiB0cnkgZXZlcnkgNCBzZWNvbmQKLQlpZiAocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSA0ID09IDApCi0JewotCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkKLQkJewotCQkJLyogYmcgY2hhbm5lbCAqLwotCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjRzsKLQkJCVRzc2lSZWYgICAgICAgICAgICA9IHBBZC0+VHNzaVJlZkc7Ci0JCQlwVHNzaU1pbnVzQm91bmRhcnkgPSAmcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMF07Ci0JCQlwVHNzaVBsdXNCb3VuZGFyeSAgPSAmcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1swXTsKLQkJCVR4QWdjU3RlcCAgICAgICAgICA9IHBBZC0+VHhBZ2NTdGVwRzsKLQkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUc7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvKiBhIGNoYW5uZWwgKi8KLQkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0E7Ci0JCQlUc3NpUmVmICAgICAgICAgICAgPSBwQWQtPlRzc2lSZWZBOwotCQkJcFRzc2lNaW51c0JvdW5kYXJ5ID0gJnBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzBdOwotCQkJcFRzc2lQbHVzQm91bmRhcnkgID0gJnBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMF07Ci0JCQlUeEFnY1N0ZXAgICAgICAgICAgPSBwQWQtPlR4QWdjU3RlcEE7Ci0JCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVBOwotCQl9Ci0KLQkJaWYgKGJBdXRvVHhBZ2MpCi0JCXsKLQkJCS8qIEJicFIxIGlzIHVuc2lnbmVkIGNoYXIgKi8KLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNDksICZCYnBSNDkpOwotCi0JCQkvKiAocCkgVHNzaVBsdXNCb3VuZGFyeUdbMF0gPSAwID0gKG0pIFRzc2lNaW51c0JvdW5kYXJ5R1swXSAqLwotCQkJLyogY29tcGVuc2F0ZTogKzQgICAgICszICAgKzIgICArMSAgICAwICAgLTEgICAtMiAgIC0zICAgLTQgKiBzdGVwcyAqLwotCQkJLyogc3RlcCB2YWx1ZSBpcyBkZWZpbmVkIGluIHBBZC0+VHhBZ2NTdGVwRyBmb3IgdHggcG93ZXIgdmFsdWUgKi8KLQotCQkJLyogWzRdKzErWzRdICAgcDQgICAgIHAzICAgcDIgICBwMSAgIG8xICAgbTEgICBtMiAgIG0zICAgbTQgKi8KLQkJCS8qIGV4OiAgICAgICAgIDB4MDAgMHgxNSAweDI1IDB4NDUgMHg4OCAweEEwIDB4QjUgMHhEMCAweEYwCi0JCQkgICBhYm92ZSB2YWx1ZSBhcmUgZXhhbWluZWQgaW4gbWFzcyBmYWN0b3J5IHByb2R1Y3Rpb24gKi8KLQkJCS8qICAgICAgICAgICAgIFs0XSAgICBbM10gIFsyXSAgWzFdICBbMF0gIFsxXSAgWzJdICBbM10gIFs0XSAqLwotCi0JCQkvKiBwbHVzICgrKSBpcyAweDAwIH4gMHg0NSwgbWludXMgKC0pIGlzIDB4YTAgfiAweGYwICovCi0JCQkvKiBpZiB2YWx1ZSBpcyBiZXR3ZWVuIHAxIH4gbzEgb3IgbzEgfiBzMSwgbm8gbmVlZCB0byBhZGp1c3QgdHggcG93ZXIgKi8KLQkJCS8qIGlmIHZhbHVlIGlzIDB4YTUsIHR4IHBvd2VyIHdpbGwgYmUgLT0gVHhBZ2NTdGVwKigyLTEpICovCi0KLQkJCWlmIChCYnBSNDkgPiBwVHNzaU1pbnVzQm91bmRhcnlbMV0pCi0JCQl7Ci0JCQkJLy8gUmVhZGluZyBpcyBsYXJnZXIgdGhhbiB0aGUgcmVmZXJlbmNlIHZhbHVlCi0JCQkJLy8gY2hlY2sgZm9yIGhvdyBsYXJnZSB3ZSBuZWVkIHRvIGRlY3JlYXNlIHRoZSBUeCBwb3dlcgotCQkJCWZvciAoaWR4ID0gMTsgaWR4IDwgNTsgaWR4KyspCi0JCQkJewotCQkJCQlpZiAoQmJwUjQ5IDw9IHBUc3NpTWludXNCb3VuZGFyeVtpZHhdKSAgLy8gRm91bmQgdGhlIHJhbmdlCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLy8gVGhlIGluZGV4IGlzIHRoZSBzdGVwIHdlIHNob3VsZCBkZWNyZWFzZSwgaWR4ID0gMCBtZWFucyB0aGVyZSBpcyBub3RoaW5nIHRvIGNvbXBlbnNhdGUKLQkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IC0oVHhBZ2NTdGVwICogKGlkeC0xKSk7Ci0KLQkJCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tIFR4IFBvd2VyLCBCQlAgUjE9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9IC0lZFxuIiwKLQkJCQkJQmJwUjQ5LCBUc3NpUmVmLCBUeEFnY1N0ZXAsIGlkeC0xKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChCYnBSNDkgPCBwVHNzaVBsdXNCb3VuZGFyeVsxXSkKLQkJCXsKLQkJCQkvLyBSZWFkaW5nIGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVmZXJlbmNlIHZhbHVlCi0JCQkJLy8gY2hlY2sgZm9yIGhvdyBsYXJnZSB3ZSBuZWVkIHRvIGluY3JlYXNlIHRoZSBUeCBwb3dlcgotCQkJCWZvciAoaWR4ID0gMTsgaWR4IDwgNTsgaWR4KyspCi0JCQkJewotCQkJCQlpZiAoQmJwUjQ5ID49IHBUc3NpUGx1c0JvdW5kYXJ5W2lkeF0pICAgLy8gRm91bmQgdGhlIHJhbmdlCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLy8gVGhlIGluZGV4IGlzIHRoZSBzdGVwIHdlIHNob3VsZCBpbmNyZWFzZSwgaWR4ID0gMCBtZWFucyB0aGVyZSBpcyBub3RoaW5nIHRvIGNvbXBlbnNhdGUKLQkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IFR4QWdjU3RlcCAqIChpZHgtMSk7Ci0JCQkJRGVsdGFQd3IgKz0gKCpwVHhBZ2NDb21wZW5zYXRlKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIrKyBUeCBQb3dlciwgQkJQIFIxPSV4LCBUc3NpUmVmPSV4LCBUeEFnY1N0ZXA9JXgsIHN0ZXAgPSArJWRcbiIsCi0JCQkJCUJicFI0OSwgVHNzaVJlZiwgVHhBZ2NTdGVwLCBpZHgtMSkpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gMDsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgICBUeCBQb3dlciwgQkJQIFI0OT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gKyVkXG4iLAotCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgMCkpOwotCQkJfQotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KQotCQl7Ci0JCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NHOwotCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlRzsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0E7Ci0JCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVBOwotCQl9Ci0KLQkJaWYgKGJBdXRvVHhBZ2MpCi0JCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOwotCX0KLQotCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJicFIxKTsKLQlCYnBSMSAmPSAweEZDOwotCi0JLyogY2FsY3VsYXRlIGRlbHRhIHBvd2VyIGJhc2VkIG9uIHRoZSBwZXJjZW50YWdlIHNwZWNpZmllZCBmcm9tIFVJICovCi0JLy8gRTJQUk9NIHNldHRpbmcgaXMgY2FsaWJyYXRlZCBmb3IgbWF4aW11bSBUWCBwb3dlciAoaS5lLiAxMDAlKQotCS8vIFdlIGxvd2VyIFRYIHBvd2VyIGhlcmUgYWNjb3JkaW5nIHRvIHRoZSBwZXJjZW50YWdlIHNwZWNpZmllZCBmcm9tIFVJCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID09IDB4ZmZmZmZmZmYpICAgICAgIC8vIEFVVE8gVFggUE9XRVIgY29udHJvbAotCQk7Ci0JZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA5MCkgIC8vIDkxIH4gMTAwJSAmIEFVVE8sIHRyZWF0IGFzIDEwMCUgaW4gdGVybXMgb2YgbVcKLQkJOwotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gNjApICAvLyA2MSB+IDkwJSwgdHJlYXQgYXMgNzUlIGluIHRlcm1zIG9mIG1XCQkvLyBEZWx0YVB3ciAtPSAxOwotCXsKLQkJRGVsdGFQd3IgLT0gMTsKLQl9Ci0JZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiAzMCkgIC8vIDMxIH4gNjAlLCB0cmVhdCBhcyA1MCUgaW4gdGVybXMgb2YgbVcJCS8vIERlbHRhUHdyIC09IDM7Ci0JewotCQlEZWx0YVB3ciAtPSAzOwotCX0KLQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDE1KSAgLy8gMTYgfiAzMCUsIHRyZWF0IGFzIDI1JSBpbiB0ZXJtcyBvZiBtVwkJLy8gRGVsdGFQd3IgLT0gNjsKLQl7Ci0JCUJicFIxIHw9IDB4MDE7Ci0JfQotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gOSkgICAvLyAxMCB+IDE1JSwgdHJlYXQgYXMgMTIuNSUgaW4gdGVybXMgb2YgbVcJCS8vIERlbHRhUHdyIC09IDk7Ci0JewotCQlCYnBSMSB8PSAweDAxOwotCQlEZWx0YVB3ciAtPSAzOwotCX0KLQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgfiA5ICUsIHRyZWF0IGFzIE1JTih+MyUpIGluIHRlcm1zIG9mIG1XCQkvLyBEZWx0YVB3ciAtPSAxMjsKLQl7Ci0JCUJicFIxIHw9IDB4MDI7Ci0JfQotCi0JUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgQmJwUjEpOwotCi0JLyogcmVzZXQgZGlmZmVyZW50IG5ldyB0eCBwb3dlciBmb3IgZGlmZmVyZW50IFRYIHJhdGUgKi8KLQlmb3IoaT0wOyBpPDU7IGkrKykKLQl7Ci0JCWlmIChUeFB3cltpXSAhPSAweGZmZmZmZmZmKQotCQl7Ci0JCQlmb3IgKGo9MDsgajw4OyBqKyspCi0JCQl7Ci0JCQkJVmFsdWUgPSAoQ0hBUikoKFR4UHdyW2ldID4+IGoqNCkgJiAweDBGKTsgLyogMCB+IDE1ICovCi0KLQkJCQlpZiAoKFZhbHVlICsgRGVsdGFQd3IpIDwgMCkKLQkJCQl7Ci0JCQkJCVZhbHVlID0gMDsgLyogbWluICovCi0JCQkJfQotCQkJCWVsc2UgaWYgKChWYWx1ZSArIERlbHRhUHdyKSA+IDB4RikKLQkJCQl7Ci0JCQkJCVZhbHVlID0gMHhGOyAvKiBtYXggKi8KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJVmFsdWUgKz0gRGVsdGFQd3I7IC8qIHRlbXBlcmF0dXJlIGNvbXBlbnNhdGlvbiAqLwotCQkJCX0KLQotCQkJCS8qIGZpbGwgbmV3IHZhbHVlIHRvIENTUiBvZmZzZXQgKi8KLQkJCQlUeFB3cltpXSA9IChUeFB3cltpXSAmIH4oMHgwMDAwMDAwRiA8PCBqKjQpKSB8IChWYWx1ZSA8PCBqKjQpOwotCQkJfQotCi0JCQkvKiB3cml0ZSB0eCBwb3dlciB2YWx1ZSB0byBDU1IgKi8KLQkJCS8qIFRYX1BXUl9DRkdfMCAoOCB0eCByYXRlKSBmb3IJVFggcG93ZXIgZm9yIE9GRE0gMTJNLzE4TQotCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgT0ZETSA2TS85TQotCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgQ0NLNS41TS8xMU0KLQkJCQkJCQkJCQkJVFggcG93ZXIgZm9yIENDSzFNLzJNICovCi0JCQkvKiBUWF9QV1JfQ0ZHXzEgfiBUWF9QV1JfQ0ZHXzQgKi8KLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgVHhQd3JbaV0pOwotCQl9Ci0JfQotCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJcHV0IFBIWSB0byBzbGVlcCBoZXJlLCBhbmQgc2V0IG5leHQgd2FrZXVwIHRpbWVyLiBQSFkgZG9lc24ndCBub3Qgd2FrZXVwCi0JCWF1dG9tYXRpY2FsbHkuIEluc3RlYWQsIE1DVSB3aWxsIGlzc3VlIGEgVHdha2VVcEludGVycnVwdCB0byBob3N0IGFmdGVyCi0JCXRoZSB3YWtldXAgdGltZXIgdGltZW91dC4gRHJpdmVyIGhhcyB0byBpc3N1ZSBhIHNlcGFyYXRlIGNvbW1hbmQgdG8gd2FrZQotCQlQSFkgdXAuCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIFRidHROdW1Ub05leHRXYWtlVXApCi17Ci0gICAgUlQyOFhYX1NUQV9TTEVFUF9USEVOX0FVVE9fV0FLRVVQKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJQXNpY0ZvcmNlV2FrZXVwKCkgaXMgdXNlZCB3aGVuZXZlciBtYW51YWwgd2FrZXVwIGlzIHJlcXVpcmVkCi0JCUFzaWNGb3JjZVNsZWVwKCkgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIG5vdCBpbiBJTkZSQSBCU1MuIFdoZW4KLQkJaW4gSU5GUkEgQlNTLCB3ZSBzaG91bGQgdXNlIEFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKCkgaW5zdGVhZC4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNGb3JjZVNsZWVwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJQXNpY0ZvcmNlV2FrZXVwKCkgaXMgdXNlZCB3aGVuZXZlciBUd2FrZXVwIHRpbWVyIChzZXQgdmlhIEFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKQotCQlleHBpcmVkLgotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNGb3JjZVdha2V1cCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSNpZmRlZiBSVDI4NjAKLQlJTiBVQ0hBUiAgICAJIExldmVsKQotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JSU4gQk9PTEVBTiAgICBiRnJvbVR4KQotI2VuZGlmCi17Ci0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEFzaWNGb3JjZVdha2V1cCBcbiIpKTsKLSNpZmRlZiBSVDI4NjAKLSAgICBSVDI4WFhfU1RBX0ZPUkNFX1dBS0VVUChwQWQsIExldmVsKTsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotICAgIFJUMjhYWF9TVEFfRk9SQ0VfV0FLRVVQKHBBZCwgYkZyb21UeCk7Ci0jZW5kaWYKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlTZXQgTXkgQlNTSUQKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljU2V0QnNzaWQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBCc3NpZCkKLXsKLQlVTE9ORwkJICBBZGRyNDsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PT09PT09PT09PT4gQXNpY1NldEJzc2lkICV4OiV4OiV4OiV4OiV4OiV4XG4iLAotCQlwQnNzaWRbMF0scEJzc2lkWzFdLHBCc3NpZFsyXSxwQnNzaWRbM10sIHBCc3NpZFs0XSxwQnNzaWRbNV0pKTsKLQotCUFkZHI0ID0gKFVMT05HKShwQnNzaWRbMF0pCQkgfAotCQkJKFVMT05HKShwQnNzaWRbMV0gPDwgOCkgIHwKLQkJCShVTE9ORykocEJzc2lkWzJdIDw8IDE2KSB8Ci0JCQkoVUxPTkcpKHBCc3NpZFszXSA8PCAyNCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0JTU0lEX0RXMCwgQWRkcjQpOwotCi0JQWRkcjQgPSAwOwotCS8vIGFsd2F5cyBvbmUgQlNTSUQgaW4gU1RBIG1vZGUKLQlBZGRyNCA9IChVTE9ORykocEJzc2lkWzRdKSB8IChVTE9ORykocEJzc2lkWzVdIDw8IDgpOwotCi0JUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0JTU0lEX0RXMSwgQWRkcjQpOwotfQotCi1WT0lEIEFzaWNTZXRNY2FzdFdDKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbTUNBU1RfV0NJRF07Ci0JVVNIT1JUCQlvZmZzZXQ7Ci0KLQlwRW50cnktPlNzdCAgICAgICAgPSBTU1RfQVNTT0M7Ci0JcEVudHJ5LT5BaWQgICAgICAgID0gTUNBU1RfV0NJRDsJLy8gU29mdGFwIHN1cHBvcnRzIDEgQlNTSUQgYW5kIHVzZSBXQ0lEPTAgYXMgbXVsdGljYXN0IFdjaWQgaW5kZXgKLQlwRW50cnktPlBzTW9kZSAgICAgPSBQV1JfQUNUSVZFOwotCXBFbnRyeS0+Q3VyclR4UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlOwotCW9mZnNldCA9IE1BQ19XQ0lEX0JBU0UgKyBCU1MwTWNhc3RfV0NJRCAqIEhXX1dDSURfRU5UUllfU0laRTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNEZWxXY2lkVGFiKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSCVdjaWQpCi17Ci0JVUxPTkcJCSAgQWRkcjAgPSAweDAsIEFkZHIxID0gMHgwOwotCVVMT05HIAkJb2Zmc2V0OwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY0RlbFdjaWRUYWI9PT5XY2lkID0gMHgleFxuIixXY2lkKSk7Ci0Jb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIFdjaWQgKiBIV19XQ0lEX0VOVFJZX1NJWkU7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBBZGRyMCk7Ci0Jb2Zmc2V0ICs9IDQ7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBBZGRyMSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljRW5hYmxlUkRHKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVRYX0xJTktfQ0ZHX1NUUlVDCVR4TGlua0NmZzsKLQlVSU5UMzIJCQkJRGF0YSA9IDA7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0xJTktfQ0ZHLCAmVHhMaW5rQ2ZnLndvcmQpOwotCVR4TGlua0NmZy5maWVsZC5UeFJER0VuID0gMTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9MSU5LX0NGRywgVHhMaW5rQ2ZnLndvcmQpOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBFRENBX0FDMF9DRkcsICZEYXRhKTsKLQlEYXRhICAmPSAweEZGRkZGRjAwOwotCURhdGEgIHw9IDB4ODA7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBEYXRhKTsKLQotCS8vT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNEaXNhYmxlUkRHKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVRYX0xJTktfQ0ZHX1NUUlVDCVR4TGlua0NmZzsKLQlVSU5UMzIJCQkJRGF0YSA9IDA7Ci0KLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfTElOS19DRkcsICZUeExpbmtDZmcud29yZCk7Ci0JVHhMaW5rQ2ZnLmZpZWxkLlR4UkRHRW4gPSAwOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0xJTktfQ0ZHLCBUeExpbmtDZmcud29yZCk7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOwotCi0JRGF0YSAgJj0gMHhGRkZGRkYwMDsKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0RZTkFNSUNfQkVfVFhPUF9BQ1RJVkUpCi0JCSYmIChwQWQtPk1hY1RhYi5mQW55U3RhdGlvbk1JTU9QU0R5bmFtaWMgPT0gRkFMU0UpCi0JKQotCXsKLQkJLy8gRm9yIENXQyB0ZXN0LCBjaGFuZ2UgdHhvcCBmcm9tIDB4MzAgdG8gMHgyMCBpbiBUeEJ1cnN0IG1vZGUKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KQotCQkJRGF0YSB8PSAweDIwOwotCX0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIERhdGEpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljRGlzYWJsZVN5bmMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT5EaXNhYmxlIFRTRiBzeW5jaHJvbml6YXRpb25cbiIpKTsKLQotCS8vIDIwMDMtMTItMjAgZGlzYWJsZSBUU0YgYW5kIFRCVFQgd2hpbGUgTklDIGluIHBvd2VyLXNhdmluZyBoYXZlIHNpZGUgZWZmZWN0Ci0JLy8JCQkgIHRoYXQgTklDIHdpbGwgbmV2ZXIgd2FrZXMgdXAgYmVjYXVzZSBUU0Ygc3RvcHMgYW5kIG5vIG1vcmUKLQkvLwkJCSAgVEJUVCBpbnRlcnJ1cHRzCi0JcEFkLT5UYnR0VGlja0NvdW50ID0gMDsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIEJDTl9USU1FX0NGRywgJmNzci53b3JkKTsKLQljc3IuZmllbGQuYkJlYWNvbkdlbiA9IDA7Ci0JY3NyLmZpZWxkLmJUQlRURW5hYmxlID0gMDsKLQljc3IuZmllbGQuVHNmU3luY01vZGUgPSAwOwotCWNzci5maWVsZC5iVHNmVGlja2luZyA9IDA7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCBjc3Iud29yZCk7Ci0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNFbmFibGVCc3NTeW5jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0+QXNpY0VuYWJsZUJzc1N5bmMoSU5GUkEgbW9kZSlcbiIpKTsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOwotCi0JewotCQljc3IuZmllbGQuQmVhY29uSW50ZXJ2YWwgPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgNDsgLy8gQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVCi0JCWNzci5maWVsZC5iVHNmVGlja2luZyA9IDE7Ci0JCWNzci5maWVsZC5Uc2ZTeW5jTW9kZSA9IDE7IC8vIHN5bmMgVFNGIGluIElORlJBU1RSVUNUVVJFIG1vZGUKLQkJY3NyLmZpZWxkLmJCZWFjb25HZW4gID0gMDsgLy8gZG8gTk9UIGdlbmVyYXRlIEJFQUNPTgotCQljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAxOwotCX0KLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyLndvcmQpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JTm90ZToKLQkJQkVBQ09OIGZyYW1lIGluIHNoYXJlZCBtZW1vcnkgc2hvdWxkIGJlIGJ1aWx0IG9rIGJlZm9yZSB0aGlzIHJvdXRpbmUKLQkJY2FuIGJlIGNhbGxlZC4gT3RoZXJ3aXNlLCBhIGdhcmJhZ2UgZnJhbWUgbWF5YmUgdHJhbnNtaXR0ZWQgb3V0IGV2ZXJ5Ci0JCUJlYWNvbiBwZXJpb2QuCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXNpY0VuYWJsZUlic3NTeW5jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCUJDTl9USU1FX0NGR19TVFJVQyBjc3I5OwotCVBVQ0hBUgkJCXB0cjsKLQlVSU5UIGk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0+QXNpY0VuYWJsZUlic3NTeW5jKEFESE9DIG1vZGUuIE1QRFV0b3RhbEJ5dGVDb3VudCA9ICVkKVxuIiwgcEFkLT5CZWFjb25UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudCkpOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBCQ05fVElNRV9DRkcsICZjc3I5LndvcmQpOwotCWNzcjkuZmllbGQuYkJlYWNvbkdlbiA9IDA7Ci0JY3NyOS5maWVsZC5iVEJUVEVuYWJsZSA9IDA7Ci0JY3NyOS5maWVsZC5iVHNmVGlja2luZyA9IDA7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCBjc3I5LndvcmQpOwotCi0jaWZkZWYgUlQyODYwCi0JLy8gbW92ZSBCRUFDT04gVFhEIGFuZCBmcmFtZSBjb250ZW50IHRvIG9uLWNoaXAgbWVtb3J5Ci0JcHRyID0gKFBVQ0hBUikmcEFkLT5CZWFjb25UeFdJOwotCWZvciAoaT0wOyBpPFRYV0lfU0laRTsgaSs9NCkgIC8vIDE2LWJ5dGUgVFhXSSBmaWVsZAotCXsKLQkJVUlOVDMyIGxvbmdwdHIgPSAgKnB0ciArICgqKHB0cisxKTw8OCkgKyAoKihwdHIrMik8PDE2KSArICgqKHB0ciszKTw8MjQpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIV19CRUFDT05fQkFTRTAgKyBpLCBsb25ncHRyKTsKLQkJcHRyICs9IDQ7Ci0JfQotCi0JLy8gc3RhcnQgcmlnaHQgYWZ0ZXIgdGhlIDE2LWJ5dGUgVFhXSSBmaWVsZAotCXB0ciA9IHBBZC0+QmVhY29uQnVmOwotCWZvciAoaT0wOyBpPCBwQWQtPkJlYWNvblR4V0kuTVBEVXRvdGFsQnl0ZUNvdW50OyBpKz00KQotCXsKLQkJVUlOVDMyIGxvbmdwdHIgPSAgKnB0ciArICgqKHB0cisxKTw8OCkgKyAoKihwdHIrMik8PDE2KSArICgqKHB0ciszKTw8MjQpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIV19CRUFDT05fQkFTRTAgKyBUWFdJX1NJWkUgKyBpLCBsb25ncHRyKTsKLQkJcHRyICs9NDsKLQl9Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQkvLyBtb3ZlIEJFQUNPTiBUWEQgYW5kIGZyYW1lIGNvbnRlbnQgdG8gb24tY2hpcCBtZW1vcnkKLQlwdHIgPSAoUFVDSEFSKSZwQWQtPkJlYWNvblR4V0k7Ci0JZm9yIChpPTA7IGk8VFhXSV9TSVpFOyBpKz0yKSAgLy8gMTYtYnl0ZSBUWFdJIGZpZWxkCi0JewotCQlSVFVTQk11bHRpV3JpdGUocEFkLCBIV19CRUFDT05fQkFTRTAgKyBpLCBwdHIsIDIpOwotCQlwdHIgKz0gMjsKLQl9Ci0KLQkvLyBzdGFydCByaWdodCBhZnRlciB0aGUgMTYtYnl0ZSBUWFdJIGZpZWxkCi0JcHRyID0gcEFkLT5CZWFjb25CdWY7Ci0JZm9yIChpPTA7IGk8IHBBZC0+QmVhY29uVHhXSS5NUERVdG90YWxCeXRlQ291bnQ7IGkrPTIpCi0JewotCQlSVFVTQk11bHRpV3JpdGUocEFkLCBIV19CRUFDT05fQkFTRTAgKyBUWFdJX1NJWkUgKyBpLCBwdHIsIDIpOwotCQlwdHIgKz0yOwotCX0KLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQotCS8vIHN0YXJ0IHNlbmRpbmcgQkVBQ09OCi0JY3NyOS5maWVsZC5CZWFjb25JbnRlcnZhbCA9IHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCA0OyAvLyBBU0lDIHJlZ2lzdGVyIGluIHVuaXRzIG9mIDEvMTYgVFUKLQljc3I5LmZpZWxkLmJUc2ZUaWNraW5nID0gMTsKLQljc3I5LmZpZWxkLlRzZlN5bmNNb2RlID0gMjsgLy8gc3luYyBUU0YgaW4gSUJTUyBtb2RlCi0JY3NyOS5maWVsZC5iVEJUVEVuYWJsZSA9IDE7Ci0JY3NyOS5maWVsZC5iQmVhY29uR2VuID0gMTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzcjkud29yZCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNTZXRFZGNhUGFybSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQRURDQV9QQVJNCSBwRWRjYVBhcm0pCi17Ci0JRURDQV9BQ19DRkdfU1RSVUMgICBBYzBDZmcsIEFjMUNmZywgQWMyQ2ZnLCBBYzNDZmc7Ci0JQUNfVFhPUF9DU1IwX1NUUlVDIGNzcjA7Ci0JQUNfVFhPUF9DU1IxX1NUUlVDIGNzcjE7Ci0JQUlGU05fQ1NSX1NUUlVDICAgIEFpZnNuQ3NyOwotCUNXTUlOX0NTUl9TVFJVQyAgICBDd21pbkNzcjsKLQlDV01BWF9DU1JfU1RSVUMgICAgQ3dtYXhDc3I7Ci0JaW50IGk7Ci0KLQlBYzBDZmcud29yZCA9IDA7Ci0JQWMxQ2ZnLndvcmQgPSAwOwotCUFjMkNmZy53b3JkID0gMDsKLQlBYzNDZmcud29yZCA9IDA7Ci0JaWYgKChwRWRjYVBhcm0gPT0gTlVMTCkgfHwgKHBFZGNhUGFybS0+YlZhbGlkID09IEZBTFNFKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXNpY1NldEVkY2FQYXJtXG4iKSk7Ci0JCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpOwotCQlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQotCQl7Ci0JCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJIHx8IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0FwQ2xpKQotCQkJCUNMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtpXSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpOwotCQl9Ci0KLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQkvLyAgICAgIE1BQyBSZWdpc3RlciBoYXMgYSBjb3B5IC4KLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQlpZiggcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgKQotCQl7Ci0JCQkvLyBGb3IgQ1dDIHRlc3QsIGNoYW5nZSB0eG9wIGZyb20gMHgzMCB0byAweDIwIGluIFR4QnVyc3QgbW9kZQotCQkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9IDB4MjA7IC8vIFN1Z2dlc3QgYnkgSm9obiBmb3IgVHhCdXJzdCBpbiBIVCBNb2RlCi0JCX0KLQkJZWxzZQotCQkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9IDA7CS8vIFFJRF9BQ19CRQotCQlBYzBDZmcuZmllbGQuQ3dtaW4gPSBDV19NSU5fSU5fQklUUzsKLQkJQWMwQ2ZnLmZpZWxkLkN3bWF4ID0gQ1dfTUFYX0lOX0JJVFM7Ci0JCUFjMENmZy5maWVsZC5BaWZzbiA9IDI7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgQWMwQ2ZnLndvcmQpOwotCi0JCUFjMUNmZy5maWVsZC5BY1R4b3AgPSAwOwkvLyBRSURfQUNfQksKLQkJQWMxQ2ZnLmZpZWxkLkN3bWluID0gQ1dfTUlOX0lOX0JJVFM7Ci0JCUFjMUNmZy5maWVsZC5Dd21heCA9IENXX01BWF9JTl9CSVRTOwotCQlBYzFDZmcuZmllbGQuQWlmc24gPSAyOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMV9DRkcsIEFjMUNmZy53b3JkKTsKLQotCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKQotCQl7Ci0JCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gMTkyOwkvLyBBQ19WSTogMTkyKjMydXMgfj0gNm1zCi0JCQlBYzNDZmcuZmllbGQuQWNUeG9wID0gOTY7CS8vIEFDX1ZPOiA5NiozMnVzICB+PSAzbXMKLQkJfQotCQllbHNlCi0JCXsKLQkJCUFjMkNmZy5maWVsZC5BY1R4b3AgPSA5NjsJLy8gQUNfVkk6IDk2KjMydXMgfj0gM21zCi0JCQlBYzNDZmcuZmllbGQuQWNUeG9wID0gNDg7CS8vIEFDX1ZPOiA0OCozMnVzIH49IDEuNW1zCi0JCX0KLQkJQWMyQ2ZnLmZpZWxkLkN3bWluID0gQ1dfTUlOX0lOX0JJVFM7Ci0JCUFjMkNmZy5maWVsZC5Dd21heCA9IENXX01BWF9JTl9CSVRTOwotCQlBYzJDZmcuZmllbGQuQWlmc24gPSAyOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMl9DRkcsIEFjMkNmZy53b3JkKTsKLQkJQWMzQ2ZnLmZpZWxkLkN3bWluID0gQ1dfTUlOX0lOX0JJVFM7Ci0JCUFjM0NmZy5maWVsZC5Dd21heCA9IENXX01BWF9JTl9CSVRTOwotCQlBYzNDZmcuZmllbGQuQWlmc24gPSAyOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDM19DRkcsIEFjM0NmZy53b3JkKTsKLQotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCS8vICAgICAgRE1BIFJlZ2lzdGVyIGhhcyBhIGNvcHkgdG9vLgotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCWNzcjAuZmllbGQuQWMwVHhvcCA9IDA7CQkvLyBRSURfQUNfQkUKLQkJY3NyMC5maWVsZC5BYzFUeG9wID0gMDsJCS8vIFFJRF9BQ19CSwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDBfQ0ZHLCBjc3IwLndvcmQpOwotCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKQotCQl7Ci0JCQljc3IxLmZpZWxkLkFjMlR4b3AgPSAxOTI7CQkvLyBBQ19WSTogMTkyKjMydXMgfj0gNm1zCi0JCQljc3IxLmZpZWxkLkFjM1R4b3AgPSA5NjsJCS8vIEFDX1ZPOiA5NiozMnVzICB+PSAzbXMKLQkJfQotCQllbHNlCi0JCXsKLQkJCWNzcjEuZmllbGQuQWMyVHhvcCA9IDk2OwkJLy8gQUNfVkk6IDk2KjMydXMgfj0gM21zCi0JCQljc3IxLmZpZWxkLkFjM1R4b3AgPSA0ODsJCS8vIEFDX1ZPOiA0OCozMnVzIH49IDEuNW1zCi0JCX0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AxX0NGRywgY3NyMS53b3JkKTsKLQotCQlDd21pbkNzci53b3JkID0gMDsKLQkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4wID0gQ1dfTUlOX0lOX0JJVFM7Ci0JCUN3bWluQ3NyLmZpZWxkLkN3bWluMSA9IENXX01JTl9JTl9CSVRTOwotCQlDd21pbkNzci5maWVsZC5Dd21pbjIgPSBDV19NSU5fSU5fQklUUzsKLQkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4zID0gQ1dfTUlOX0lOX0JJVFM7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9DV01JTl9DRkcsIEN3bWluQ3NyLndvcmQpOwotCi0JCUN3bWF4Q3NyLndvcmQgPSAwOwotCQlDd21heENzci5maWVsZC5Dd21heDAgPSBDV19NQVhfSU5fQklUUzsKLQkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgxID0gQ1dfTUFYX0lOX0JJVFM7Ci0JCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MiA9IENXX01BWF9JTl9CSVRTOwotCQlDd21heENzci5maWVsZC5Dd21heDMgPSBDV19NQVhfSU5fQklUUzsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0NXTUFYX0NGRywgQ3dtYXhDc3Iud29yZCk7Ci0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0FJRlNOX0NGRywgMHgwMDAwMjIyMik7Ci0KLQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKLQl9Ci0JZWxzZQotCXsKLQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpOwotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCS8vICAgICAgTUFDIFJlZ2lzdGVyIGhhcyBhIGNvcHkuCi0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJLy8KLQkJLy8gTW9kaWZ5IEN3bWluL0N3bWF4L1R4b3Agb24gcXVldWVbUUlEX0FDX1ZJXSwgUmVjb21tZW5kIGJ5IEplcnJ5IDIwMDUvMDcvMjcKLQkJLy8gVG8gZGVncmFkZSBvdXIgVklETyBRdWV1ZSdzIHRocm91Z2hwdXQgZm9yIFdpRmkgV01NIFMzVDA3IElzc3VlLgotCQkvLwotCQkvL3BFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldID0gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV0gKiA3IC8gMTA7IC8vIHJ0Mjg2MGMgbmVlZCB0aGlzCi0KLQkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9ICBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JFXTsKLQkJQWMwQ2ZnLmZpZWxkLkN3bWluPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CRV07Ci0JCUFjMENmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JFXTsKLQkJQWMwQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdOyAvLysxOwotCi0JCUFjMUNmZy5maWVsZC5BY1R4b3AgPSAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CS107Ci0JCUFjMUNmZy5maWVsZC5Dd21pbiA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JLXTsgLy8rMjsKLQkJQWMxQ2ZnLmZpZWxkLkN3bWF4ID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQktdOwotCQlBYzFDZmcuZmllbGQuQWlmc24gPSBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CS107IC8vKzE7Ci0KLQkJQWMyQ2ZnLmZpZWxkLkFjVHhvcCA9IChwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZJXSAqIDYpIC8gMTA7Ci0JCUFjMkNmZy5maWVsZC5Dd21pbiA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX1ZJXTsKLQkJQWMyQ2ZnLmZpZWxkLkN3bWF4ID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVkldOwotCQlBYzJDZmcuZmllbGQuQWlmc24gPSBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV07Ci0KLQkJewotCQkJLy8gVHVuaW5nIGZvciBXaS1GaSBXTU0gUzA2Ci0JCQlpZiAocEFkLT5Db21tb25DZmcuYldpRmlUZXN0ICYmCi0JCQkJcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldID09IDEwKQotCQkJCUFjMkNmZy5maWVsZC5BaWZzbiAtPSAxOwotCi0JCQkvLyBUdW5pbmcgZm9yIFRHbiBXaS1GaSA1LjIuMzIKLQkJCS8vIFNUQSBUZXN0QmVkIGNoYW5nZXMgaW4gdGhpcyBpdGVtOiBjb25uZXhhbnQgbGVnYWN5IHN0YSA9PT4gYnJvYWRjb20gMTFuIHN0YQotCQkJaWYgKFNUQV9UR05fV0lGSV9PTihwQWQpICYmCi0JCQkJcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldID09IDEwKQotCQkJewotCQkJCUFjMENmZy5maWVsZC5BaWZzbiA9IDM7Ci0JCQkJQWMyQ2ZnLmZpZWxkLkFjVHhvcCA9IDU7Ci0JCQl9Ci0KLSNpZmRlZiBSVDI4NzAKLQkJCWlmIChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMCB8fCBwQWQtPlJmSWNUeXBlID09IFJGSUNfMjAyMCkKLQkJCXsKLQkJCQkvLyBUdW5pbmcgZm9yIFdpRmkgV01NIFMzLVQwNzogY29ubmV4YW50IGxlZ2FjeSBzdGEgPT0+IGJyb2FkY29tIDExbiBzdGEuCi0JCQkJQWMyQ2ZnLmZpZWxkLkFpZnNuID0gNTsKLQkJCX0KLSNlbmRpZgotCQl9Ci0KLQkJQWMzQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVk9dOwotCQlBYzNDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WT107Ci0JCUFjM0NmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZPXTsKLQkJQWMzQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVk9dOwotCi0vLyNpZmRlZiBXSUZJX1RFU1QKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCkKLQkJewotCQkJaWYgKEFjM0NmZy5maWVsZC5BY1R4b3AgPT0gMTAyKQotCQkJewotCQkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQkVdID8gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CRV0gOiAxMDsKLQkJCQlBYzBDZmcuZmllbGQuQWlmc24gID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdLTE7IC8qIEFJRlNOIG11c3QgPj0gMSAqLwotCQkJQWMxQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQktdOwotCQkJCUFjMUNmZy5maWVsZC5BaWZzbiAgPSBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CS107Ci0JCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV07Ci0JCQl9IC8qIEVuZCBvZiBpZiAqLwotCQl9Ci0vLyNlbmRpZiAvLyBXSUZJX1RFU1QgLy8KLQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIEFjMENmZy53b3JkKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzFfQ0ZHLCBBYzFDZmcud29yZCk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMyX0NGRywgQWMyQ2ZnLndvcmQpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDM19DRkcsIEFjM0NmZy53b3JkKTsKLQotCi0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJLy8gICAgICBETUEgUmVnaXN0ZXIgaGFzIGEgY29weSB0b28uCi0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJY3NyMC5maWVsZC5BYzBUeG9wID0gQWMwQ2ZnLmZpZWxkLkFjVHhvcDsKLQkJY3NyMC5maWVsZC5BYzFUeG9wID0gQWMxQ2ZnLmZpZWxkLkFjVHhvcDsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AwX0NGRywgY3NyMC53b3JkKTsKLQotCQljc3IxLmZpZWxkLkFjMlR4b3AgPSBBYzJDZmcuZmllbGQuQWNUeG9wOwotCQljc3IxLmZpZWxkLkFjM1R4b3AgPSBBYzNDZmcuZmllbGQuQWNUeG9wOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDFfQ0ZHLCBjc3IxLndvcmQpOwotCi0JCUN3bWluQ3NyLndvcmQgPSAwOwotCQlDd21pbkNzci5maWVsZC5Dd21pbjAgPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CRV07Ci0JCUN3bWluQ3NyLmZpZWxkLkN3bWluMSA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JLXTsKLQkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4yID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVkldOwotCi0JCUN3bWluQ3NyLmZpZWxkLkN3bWluMyA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX1ZPXSAtIDE7IC8vZm9yIFRHbiB3aWZpIHRlc3QKLQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNSU5fQ0ZHLCBDd21pbkNzci53b3JkKTsKLQotCQlDd21heENzci53b3JkID0gMDsKLQkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgwID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQkVdOwotCQlDd21heENzci5maWVsZC5Dd21heDEgPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CS107Ci0JCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MiA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZJXTsKLQkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgzID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVk9dOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNQVhfQ0ZHLCBDd21heENzci53b3JkKTsKLQotCQlBaWZzbkNzci53b3JkID0gMDsKLQkJQWlmc25Dc3IuZmllbGQuQWlmc24wID0gQWMwQ2ZnLmZpZWxkLkFpZnNuOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JFXTsKLQkJQWlmc25Dc3IuZmllbGQuQWlmc24xID0gQWMxQ2ZnLmZpZWxkLkFpZnNuOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JLXTsKLQkJQWlmc25Dc3IuZmllbGQuQWlmc24yID0gQWMyQ2ZnLmZpZWxkLkFpZnNuOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXTsKLQotCQl7Ci0JCQkvLyBUdW5pbmcgZm9yIFdpLUZpIFdNTSBTMDYKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3QgJiYKLQkJCQlwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV0gPT0gMTApCi0JCQkJQWlmc25Dc3IuZmllbGQuQWlmc24yID0gQWMyQ2ZnLmZpZWxkLkFpZnNuIC0gNDsKLQotCQkJLy8gVHVuaW5nIGZvciBUR24gV2ktRmkgNS4yLjMyCi0JCQkvLyBTVEEgVGVzdEJlZCBjaGFuZ2VzIGluIHRoaXMgaXRlbTogY29ubmV4YW50IGxlZ2FjeSBzdGEgPT0+IGJyb2FkY29tIDExbiBzdGEKLQkJCWlmIChTVEFfVEdOX1dJRklfT04ocEFkKSAmJgotCQkJCXBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9PSAxMCkKLQkJCXsKLQkJCQlBaWZzbkNzci5maWVsZC5BaWZzbjAgPSAzOwotCQkJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMiA9IDc7Ci0JCQl9Ci0jaWZkZWYgUlQyODcwCi0JCQlpZiAoSU5GUkFfT04ocEFkKSkKLQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSk7Ci0jZW5kaWYKLQkJfQotCi0JCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMyA9IEFjM0NmZy5maWVsZC5BaWZzbiAtIDE7IC8vcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVk9dOyAvL2ZvciBUR24gd2lmaSB0ZXN0Ci0jaWZkZWYgUlQyODcwCi0JCWlmIChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMCB8fCBwQWQtPlJmSWNUeXBlID09IFJGSUNfMjAyMCkKLQkJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMiA9IDB4MjsgLy9wRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV07IC8vZm9yIFdpRmkgV01NIFM0LVQwNC4KLSNlbmRpZgotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQUlGU05fQ0ZHLCBBaWZzbkNzci53b3JkKTsKLQotCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybSwgcEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7Ci0JCWlmICghQURIT0NfT04ocEFkKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJFRENBIFsjJWRdOiBBSUZTTiBDV21pbiBDV21heCAgVFhPUCh1cykgIEFDTVxuIiwgcEVkY2FQYXJtLT5FZGNhVXBkYXRlQ291bnQpKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiICAgICBBQ19CRSAgICAgICUyZCAgICAgJTJkICAgICAlMmQgICAgICAlNGQgICAgICVkXG4iLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+QWlmc25bMF0sCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21pblswXSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWF4WzBdLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+VHhvcFswXTw8NSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPmJBQ01bMF0pKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiICAgICBBQ19CSyAgICAgICUyZCAgICAgJTJkICAgICAlMmQgICAgICAlNGQgICAgICVkXG4iLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+QWlmc25bMV0sCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21pblsxXSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWF4WzFdLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+VHhvcFsxXTw8NSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPmJBQ01bMV0pKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiICAgICBBQ19WSSAgICAgICUyZCAgICAgJTJkICAgICAlMmQgICAgICAlNGQgICAgICVkXG4iLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+QWlmc25bMl0sCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21pblsyXSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWF4WzJdLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+VHhvcFsyXTw8NSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPmJBQ01bMl0pKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiICAgICBBQ19WTyAgICAgICUyZCAgICAgJTJkICAgICAlMmQgICAgICAlNGQgICAgICVkXG4iLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+QWlmc25bM10sCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21pblszXSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWF4WzNdLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+VHhvcFszXTw8NSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPmJBQ01bM10pKTsKLQkJfQotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgCUFzaWNTZXRTbG90VGltZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBCT09MRUFOIGJVc2VTaG9ydFNsb3RUaW1lKQotewotCVVMT05HCVNsb3RUaW1lOwotCVVJTlQzMglSZWdWYWx1ZSA9IDA7Ci0KLQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQotCQliVXNlU2hvcnRTbG90VGltZSA9IFRSVUU7Ci0KLQlpZiAoYlVzZVNob3J0U2xvdFRpbWUpCi0JCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCk7Ci0JZWxzZQotCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCk7Ci0KLQlTbG90VGltZSA9IChiVXNlU2hvcnRTbG90VGltZSk/IDkgOiAyMDsKLQotCXsKLQkJLy8gZm9yY2UgdXNpbmcgc2hvcnQgU0xPVCB0aW1lIGZvciBGQUUgdG8gZGVtbyBwZXJmb3JtYW5jZSB3aGVuIFR4QnVyc3QgaXMgT04KLQkJaWYgKCgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpICYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpKSkKLQkJCXx8ICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gVFJVRSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPT0gQkFfTk9UVVNFKSkKLQkJCSkKLQkJewotCQkJLy8gSW4gdGhpcyBjYXNlLCB3ZSB3aWxsIHRoaW5rIGl0IGlzIGRvaW5nIFdpLUZpIHRlc3QKLQkJCS8vIEFuZCB3ZSB3aWxsIG5vdCBzZXQgdG8gc2hvcnQgc2xvdCB3aGVuIGJFbmFibGVUeEJ1cnN0IGlzIFRSVUUuCi0JCX0KLQkJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpCi0JCQlTbG90VGltZSA9IDk7Ci0JfQotCi0JLy8KLQkvLyBGb3Igc29tZSByZWFzb25zLCBhbHdheXMgc2V0IGl0IHRvIHNob3J0IHNsb3QgdGltZS4KLQkvLwotCS8vIFRvRG86IFNob3VsZCBjb25zaWRlciBjYXBhYmlsaXR5IHdpdGggMTFCCi0JLy8KLQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCi0JCVNsb3RUaW1lID0gMjA7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIEJLT0ZGX1NMT1RfQ0ZHLCAmUmVnVmFsdWUpOwotCVJlZ1ZhbHVlID0gUmVnVmFsdWUgJiAweEZGRkZGRjAwOwotCi0JUmVnVmFsdWUgfD0gU2xvdFRpbWU7Ci0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBCS09GRl9TTE9UX0NGRywgUmVnVmFsdWUpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlBZGQgU2hhcmVkIGtleSBpbmZvcm1hdGlvbiBpbnRvIEFTSUMuCi0JCVVwZGF0ZSBzaGFyZWQga2V5LCBUeE1pYyBhbmQgUnhNaWMgdG8gQXNpYyBTaGFyZWQga2V5IHRhYmxlCi0JCVVwZGF0ZSBpdHMgY2lwaGVyQWxnIHRvIEFzaWMgU2hhcmVkIGtleSBNb2RlLgotCi0gICAgUmV0dXJuOgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQXNpY0FkZFNoYXJlZEtleUVudHJ5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSCQkgQnNzSW5kZXgsCi0JSU4gVUNIQVIJCSBLZXlJZHgsCi0JSU4gVUNIQVIJCSBDaXBoZXJBbGcsCi0JSU4gUFVDSEFSCQkgcEtleSwKLQlJTiBQVUNIQVIJCSBwVHhNaWMsCi0JSU4gUFVDSEFSCQkgcFJ4TWljKQotewotCVVMT05HIG9mZnNldDsgLy8sIGNzcjA7Ci0JU0hBUkVES0VZX01PREVfU1RSVUMgY3NyMTsKLSNpZmRlZiBSVDI4NjAKLQlJTlQgICBpOwotI2VuZGlmCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljQWRkU2hhcmVkS2V5RW50cnkgQnNzSW5kZXg9JWQsIEtleUlkeD0lZFxuIiwgQnNzSW5kZXgsS2V5SWR4KSk7Ci0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGRTaGFyZWRLZXlFbnRyeTogJXMga2V5ICMlZFxuIiwgQ2lwaGVyTmFtZVtDaXBoZXJBbGddLCBCc3NJbmRleCo0ICsgS2V5SWR4KSk7Ci0JREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiAJS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJcEtleVswXSxwS2V5WzFdLHBLZXlbMl0scEtleVszXSxwS2V5WzRdLHBLZXlbNV0scEtleVs2XSxwS2V5WzddLHBLZXlbOF0scEtleVs5XSxwS2V5WzEwXSxwS2V5WzExXSxwS2V5WzEyXSxwS2V5WzEzXSxwS2V5WzE0XSxwS2V5WzE1XSkpOwotCWlmIChwUnhNaWMpCi0JewotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiIAlSeCBNSUMgS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQkJcFJ4TWljWzBdLHBSeE1pY1sxXSxwUnhNaWNbMl0scFJ4TWljWzNdLHBSeE1pY1s0XSxwUnhNaWNbNV0scFJ4TWljWzZdLHBSeE1pY1s3XSkpOwotCX0KLQlpZiAocFR4TWljKQotCXsKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiAJVHggTUlDIEtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCXBUeE1pY1swXSxwVHhNaWNbMV0scFR4TWljWzJdLHBUeE1pY1szXSxwVHhNaWNbNF0scFR4TWljWzVdLHBUeE1pY1s2XSxwVHhNaWNbN10pKTsKLQl9Ci0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JLy8KLQkvLyBmaWxsIGtleSBtYXRlcmlhbCAtIGtleSArIFRYIE1JQyArIFJYIE1JQwotCS8vCi0KLQlvZmZzZXQgPSBTSEFSRURfS0VZX1RBQkxFX0JBU0UgKyAoNCpCc3NJbmRleCArIEtleUlkeCkqSFdfS0VZX0VOVFJZX1NJWkU7Ci0jaWZkZWYgUlQyODYwCi0JZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9TSEFSRV9LRVk7IGkrKykKLQl7Ci0JCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcEtleVtpXSk7Ci0JfQotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JUlRVU0JNdWx0aVdyaXRlKHBBZCwgb2Zmc2V0LCBwS2V5LCBNQVhfTEVOX09GX1NIQVJFX0tFWSk7Ci0jZW5kaWYKLQlvZmZzZXQgKz0gTUFYX0xFTl9PRl9TSEFSRV9LRVk7Ci0JaWYgKHBUeE1pYykKLQl7Ci0jaWZkZWYgUlQyODYwCi0JCWZvciAoaT0wOyBpPDg7IGkrKykKLQkJewotCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwVHhNaWNbaV0pOwotCQl9Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgb2Zmc2V0LCBwVHhNaWMsIDgpOwotI2VuZGlmCi0JfQotCi0Jb2Zmc2V0ICs9IDg7Ci0JaWYgKHBSeE1pYykKLQl7Ci0jaWZkZWYgUlQyODYwCi0JCWZvciAoaT0wOyBpPDg7IGkrKykKLQkJewotCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwUnhNaWNbaV0pOwotCQl9Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgb2Zmc2V0LCBwUnhNaWMsIDgpOwotI2VuZGlmCi0JfQotCi0KLQkvLwotCS8vIFVwZGF0ZSBjaXBoZXIgYWxnb3JpdGhtLiBXU1RBIGFsd2F5cyB1c2UgQlNTMAotCS8vCi0JUlRNUF9JT19SRUFEMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSs0KihCc3NJbmRleC8yKSwgJmNzcjEud29yZCk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSZWFkOiBTSEFSRURfS0VZX01PREVfQkFTRSBhdCB0aGlzIEJzc1slZF0gS2V5SWR4WyVkXT0gMHgleCBcbiIsIEJzc0luZGV4LEtleUlkeCwgY3NyMS53b3JkKSk7Ci0JaWYgKChCc3NJbmRleCUyKSA9PSAwKQotCXsKLQkJaWYgKEtleUlkeCA9PSAwKQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCi0JCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQllbHNlIGlmIChLZXlJZHggPT0gMikKLQkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCWVsc2UKLQkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChLZXlJZHggPT0gMCkKLQkJCWNzcjEuZmllbGQuQnNzMUtleTBDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCWVsc2UgaWYgKEtleUlkeCA9PSAxKQotCQkJY3NyMS5maWVsZC5Cc3MxS2V5MUNpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCi0JCQljc3IxLmZpZWxkLkJzczFLZXkyQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQllbHNlCi0JCQljc3IxLmZpZWxkLkJzczFLZXkzQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCX0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIldyaXRlOiBTSEFSRURfS0VZX01PREVfQkFTRSBhdCB0aGlzIEJzc1slZF0gPSAweCV4IFxuIiwgQnNzSW5kZXgsIGNzcjEud29yZCkpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFKzQqKEJzc0luZGV4LzIpLCBjc3IxLndvcmQpOwotCi19Ci0KLS8vCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRCBBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIJCSBCc3NJbmRleCwKLQlJTiBVQ0hBUgkJIEtleUlkeCkKLXsKLQkvL1VMT05HIFNlY0NzcjA7Ci0JU0hBUkVES0VZX01PREVfU1RSVUMgY3NyMTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5OiAjJWQgXG4iLCBCc3NJbmRleCo0ICsgS2V5SWR4KSk7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFKzQqKEJzc0luZGV4LzIpLCAmY3NyMS53b3JkKTsKLQlpZiAoKEJzc0luZGV4JTIpID09IDApCi0JewotCQlpZiAoS2V5SWR4ID09IDApCi0JCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gMDsKLQkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCi0JCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gMDsKLQkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCi0JCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gMDsKLQkJZWxzZQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IDA7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChLZXlJZHggPT0gMCkKLQkJCWNzcjEuZmllbGQuQnNzMUtleTBDaXBoZXJBbGcgPSAwOwotCQllbHNlIGlmIChLZXlJZHggPT0gMSkKLQkJCWNzcjEuZmllbGQuQnNzMUtleTFDaXBoZXJBbGcgPSAwOwotCQllbHNlIGlmIChLZXlJZHggPT0gMikKLQkJCWNzcjEuZmllbGQuQnNzMUtleTJDaXBoZXJBbGcgPSAwOwotCQllbHNlCi0JCQljc3IxLmZpZWxkLkJzczFLZXkzQ2lwaGVyQWxnID0gMDsKLQl9Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJXcml0ZTogU0hBUkVEX0tFWV9NT0RFX0JBU0UgYXQgdGhpcyBCc3NbJWRdID0gMHgleCBcbiIsIEJzc0luZGV4LCBjc3IxLndvcmQpKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSs0KihCc3NJbmRleC8yKSwgY3NyMS53b3JkKTsKLQlBU1NFUlQoQnNzSW5kZXggPCA0KTsKLQlBU1NFUlQoS2V5SWR4IDwgNCk7Ci0KLX0KLQotCi1WT0lEIEFzaWNVcGRhdGVXQ0lEQXR0cmlidXRlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVAkJV0NJRCwKLQlJTiBVQ0hBUgkJQnNzSW5kZXgsCi0JSU4gVUNIQVIgICAgICAgIENpcGhlckFsZywKLQlJTiBCT09MRUFOCQliVXNlUGFpcmV3aXNlS2V5VGFibGUpCi17Ci0JVUxPTkcgICBXQ0lEQXR0cmkgPSAwLCBvZmZzZXQ7Ci0KLQkvLwotCS8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZS4KLQkvLyBPbmx5IFR4S2V5IGNvdWxkIHVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZS4KLQkvLwotCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKFdDSUQgKiBIV19XQ0lEX0FUVFJJX1NJWkUpOwotCVdDSURBdHRyaSA9IChCc3NJbmRleCA8PCA0KSB8IChDaXBoZXJBbGcgPDwgMSkgfCAoYlVzZVBhaXJld2lzZUtleVRhYmxlKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIFdDSURBdHRyaSk7Ci19Ci0KLVZPSUQgQXNpY1VwZGF0ZVdDSURJVkVJVigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQJCVdDSUQsCi0JSU4gVUxPTkcgICAgICAgIHVJViwKLQlJTiBVTE9ORyAgICAgICAgdUVJVikKLXsKLQlVTE9ORwlvZmZzZXQ7Ci0KLQlvZmZzZXQgPSBNQUNfSVZFSVZfVEFCTEVfQkFTRSArIChXQ0lEICogSFdfSVZFSVZfRU5UUllfU0laRSk7Ci0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIHVJVik7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0ICsgNCwgdUVJVik7Ci19Ci0KLVZPSUQgQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVAkJV0NJRCwKLQlJTiBQVUNIQVIgICAgICAgIHBBZGRyKQotewotCVVMT05HIG9mZnNldDsKLQlVTE9ORyBBZGRyOwotCi0Jb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIChXQ0lEICogSFdfV0NJRF9FTlRSWV9TSVpFKTsKLQlBZGRyID0gcEFkZHJbMF0gKyAocEFkZHJbMV0gPDwgOCkgKyhwQWRkclsyXSA8PCAxNikgKyhwQWRkclszXSA8PCAyNCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBBZGRyKTsKLQlBZGRyID0gcEFkZHJbNF0gKyAocEFkZHJbNV0gPDwgOCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0ICsgNCwgQWRkcik7Ci19Ci0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIFJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBDaXBoZXIgS2V5LCBDaXBoZXIgYWxnb3JpdGhtLCBJVi9FSVYgdG8gQXNpYwotCi0gICAgQXJndW1lbnRzOgotICAgICAgICBwQWQgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0gICAgICAgIFdDSUQgICAgICAgICAgICAgICAgICAgIFdDSUQgRW50cnkgbnVtYmVyLgotICAgICAgICBCc3NJbmRleCAgICAgICAgICAgICAgICBCU1NJRCBpbmRleCwgc3RhdGlvbiBvciBub25lIG11bHRpcGxlIEJTU0lEIHN1cHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyB2YWx1ZSBzaG91bGQgYmUgMC4KLSAgICAgICAgS2V5SWR4ICAgICAgICAgICAgICAgICAgVGhpcyBLZXlJZHggd2lsbCBzZXQgdG8gSVYncyBLZXlJRCBpZiBiVHhLZXkgZW5hYmxlZAotICAgICAgICBwQ2lwaGVyS2V5ICAgICAgICAgICAgICBQb2ludGVyIHRvIENpcGhlciBLZXkuCi0gICAgICAgIGJVc2VQYWlyZXdpc2VLZXlUYWJsZSAgIFRSVUUgbWVhbnMgc2F2ZWQgdGhlIGtleSBpbiBTaGFyZWRLZXkgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSBQYWlyZXdpc2VLZXkgdGFibGUKLSAgICAgICAgYlR4S2V5ICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgdHJhbnNtaXQga2V5IGlmIGVuYWJsZWQuCi0KLSAgICBSZXR1cm4gVmFsdWU6Ci0gICAgICAgIE5vbmUKLQotICAgIE5vdGU6Ci0gICAgICAgIFRoaXMgcm91dGluZSB3aWxsIHNldCB0aGUgcmVsYXRpdmUga2V5IHN0dWZmIHRvIEFzaWMgaW5jbHVkaW5nIFdDSUQgYXR0cmlidXRlLAotICAgICAgICBDaXBoZXIgS2V5LCBDaXBoZXIgYWxnb3JpdGhtIGFuZCBJVi9FSVYuCi0KLSAgICAgICAgSVYvRUlWIHdpbGwgYmUgdXBkYXRlIGlmIHRoaXMgQ2lwaGVyS2V5IGlzIHRoZSB0cmFuc21pc3Npb24ga2V5IGJlY2F1c2UKLSAgICAgICAgQVNJQyB3aWxsIGJhc2Ugb24gSVYncyBLZXlJRCB2YWx1ZSB0byBzZWxlY3QgQ2lwaGVyIEtleS4KLQotICAgICAgICBJZiBiVHhLZXkgc2V0cyB0byBGQUxTRSwgdGhpcyBpcyBub3QgdGhlIFRYIGtleSwgYnV0IGl0IGNvdWxkIGJlCi0gICAgICAgIFJYIGtleQotCi0gICAgCUZvciBBUCBtb2RlIGJUeEtleSBtdXN0IGJlIGFsd2F5cyBzZXQgdG8gVFJVRS4KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEFzaWNBZGRLZXlFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQJCVdDSUQsCi0JSU4gVUNIQVIJCUJzc0luZGV4LAotCUlOIFVDSEFSCQlLZXlJZHgsCi0JSU4gUENJUEhFUl9LRVkJcENpcGhlcktleSwKLQlJTiBCT09MRUFOCQliVXNlUGFpcmV3aXNlS2V5VGFibGUsCi0JSU4gQk9PTEVBTgkJYlR4S2V5KQotewotCVVMT05HCW9mZnNldDsKLQlVQ0hBUglJVjQgPSAwOwotCVBVQ0hBUgkJcEtleSA9IHBDaXBoZXJLZXktPktleTsKLQlQVUNIQVIJCXBUeE1pYyA9IHBDaXBoZXJLZXktPlR4TWljOwotCVBVQ0hBUgkJcFJ4TWljID0gcENpcGhlcktleS0+UnhNaWM7Ci0JUFVDSEFSCQlwVHh0c2MgPSBwQ2lwaGVyS2V5LT5UeFRzYzsKLQlVQ0hBUgkJQ2lwaGVyQWxnID0gcENpcGhlcktleS0+Q2lwaGVyQWxnOwotCVNIQVJFREtFWV9NT0RFX1NUUlVDIGNzcjE7Ci0jaWZkZWYgUlQyODYwCi0JVUNIQVIJCWk7Ci0jZW5kaWYKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBBc2ljQWRkS2V5RW50cnlcbiIpKTsKLQkvLwotCS8vIDEuKSBkZWNpZGUga2V5IHRhYmxlIG9mZnNldAotCS8vCi0JaWYgKGJVc2VQYWlyZXdpc2VLZXlUYWJsZSkKLQkJb2Zmc2V0ID0gUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UgKyAoV0NJRCAqIEhXX0tFWV9FTlRSWV9TSVpFKTsKLQllbHNlCi0JCW9mZnNldCA9IFNIQVJFRF9LRVlfVEFCTEVfQkFTRSArICg0ICogQnNzSW5kZXggKyBLZXlJZHgpICogSFdfS0VZX0VOVFJZX1NJWkU7Ci0KLQkvLwotCS8vIDIuKSBTZXQgS2V5IHRvIEFzaWMKLQkvLwotCS8vZm9yIChpID0gMDsgaSA8IEtleUxlbjsgaSsrKQotI2lmZGVmIFJUMjg2MAotCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX1BFRVJfS0VZOyBpKyspCi0JewotCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBLZXlbaV0pOwotCX0KLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgcEtleSwgTUFYX0xFTl9PRl9QRUVSX0tFWSk7Ci0jZW5kaWYKLQlvZmZzZXQgKz0gTUFYX0xFTl9PRl9QRUVSX0tFWTsKLQotCS8vCi0JLy8gMy4pIFNldCBNSUMga2V5IGlmIGF2YWlsYWJsZQotCS8vCi0JaWYgKHBUeE1pYykKLQl7Ci0jaWZkZWYgUlQyODYwCi0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCXsKLQkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcFR4TWljW2ldKTsKLQkJfQotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgcFR4TWljLCA4KTsKLSNlbmRpZgotCX0KLQlvZmZzZXQgKz0gTEVOX1RLSVBfVFhNSUNLOwotCi0JaWYgKHBSeE1pYykKLQl7Ci0jaWZkZWYgUlQyODYwCi0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCXsKLQkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcFJ4TWljW2ldKTsKLQkJfQotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgcFJ4TWljLCA4KTsKLSNlbmRpZgotCX0KLQotCi0JLy8KLQkvLyA0LikgTW9kaWZ5IElWL0VJViBpZiBuZWVkcwotCS8vICAgICBUaGlzIHdpbGwgZm9yY2UgQXNpYyB0byB1c2UgdGhpcyBrZXkgSUQgYnkgc2V0dGluZyBJVi4KLQkvLwotCWlmIChiVHhLZXkpCi0JewotI2lmZGVmIFJUMjg2MAotCQlvZmZzZXQgPSBNQUNfSVZFSVZfVEFCTEVfQkFTRSArIChXQ0lEICogSFdfSVZFSVZfRU5UUllfU0laRSk7Ci0JCS8vCi0JCS8vIFdyaXRlIElWCi0JCS8vCi0JCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0LCBwVHh0c2NbMV0pOwotCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIDEsICgocFR4dHNjWzFdIHwgMHgyMCkgJiAweDdmKSk7Ci0JCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgMiwgcFR4dHNjWzBdKTsKLQotCQlJVjQgPSAoS2V5SWR4IDw8IDYpOwotCQlpZiAoKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkgfHwgKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpIHx8KENpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSkKLQkJCUlWNCB8PSAweDIwOyAgLy8gdHVybiBvbiBleHRlbnNpb24gYml0IG1lYW5zIEVJViBleGlzdGVuY2UKLQotCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIDMsIElWNCk7Ci0KLQkJLy8KLQkJLy8gV3JpdGUgRUlWCi0JCS8vCi0JCW9mZnNldCArPSA0OwotCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBUeHRzY1tpICsgMl0pOwotCQl9Ci0KLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQlVSU5UMzIgdG1wVmFsOwotCi0JCS8vCi0JCS8vIFdyaXRlIElWCi0JCS8vCi0JCUlWNCA9IChLZXlJZHggPDwgNik7Ci0JCWlmICgoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQKSB8fCAoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQX05PX01JQykgfHwoQ2lwaGVyQWxnID09IENJUEhFUl9BRVMpKQotCQkJSVY0IHw9IDB4MjA7ICAvLyB0dXJuIG9uIGV4dGVuc2lvbiBiaXQgbWVhbnMgRUlWIGV4aXN0ZW5jZQotCi0JCXRtcFZhbCA9IHBUeHRzY1sxXSArICgoKHBUeHRzY1sxXSB8IDB4MjApICYgMHg3ZikgPDwgOCkgKyAocFR4dHNjWzBdIDw8IDE2KSArIChJVjQgPDwgMjQpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIHRtcFZhbCk7Ci0KLQkJLy8KLQkJLy8gV3JpdGUgRUlWCi0JCS8vCi0JCW9mZnNldCArPSA0OwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsICooUFVJTlQzMikmcENpcGhlcktleS0+VHhUc2NbMl0pOwotI2VuZGlmIC8vIFJUMjg3MCAvLwotCQlBc2ljVXBkYXRlV0NJREF0dHJpYnV0ZShwQWQsIFdDSUQsIEJzc0luZGV4LCBDaXBoZXJBbGcsIGJVc2VQYWlyZXdpc2VLZXlUYWJsZSk7Ci0JfQotCi0JaWYgKCFiVXNlUGFpcmV3aXNlS2V5VGFibGUpCi0JewotCQkvLwotCQkvLyBPbmx5IHVwZGF0ZSB0aGUgc2hhcmVkIGtleSBzZWN1cml0eSBtb2RlCi0JCS8vCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UgKyA0ICogKEJzc0luZGV4IC8gMiksICZjc3IxLndvcmQpOwotCQlpZiAoKEJzc0luZGV4ICUgMikgPT0gMCkKLQkJewotCQkJaWYgKEtleUlkeCA9PSAwKQotCQkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCQllbHNlIGlmIChLZXlJZHggPT0gMSkKLQkJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCi0JCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJCWVsc2UKLQkJCQljc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKEtleUlkeCA9PSAwKQotCQkJCWNzcjEuZmllbGQuQnNzMUtleTBDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCQllbHNlIGlmIChLZXlJZHggPT0gMSkKLQkJCQljc3IxLmZpZWxkLkJzczFLZXkxQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCi0JCQkJY3NyMS5maWVsZC5Cc3MxS2V5MkNpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJCWVsc2UKLQkJCQljc3IxLmZpZWxkLkJzczFLZXkzQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQl9Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFICsgNCAqIChCc3NJbmRleCAvIDIpLCBjc3IxLndvcmQpOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBBc2ljQWRkS2V5RW50cnlcbiIpKTsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlBZGQgUGFpci13aXNlIGtleSBtYXRlcmlhbCBpbnRvIEFTSUMuCi0JCVVwZGF0ZSBwYWlyd2lzZSBrZXksIFR4TWljIGFuZCBSeE1pYyB0byBBc2ljIFBhaXItd2lzZSBrZXkgdGFibGUKLQotICAgIFJldHVybjoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIsCi0JSU4gVUNIQVIJCVdDSUQsCi0JSU4gQ0lQSEVSX0tFWQkJICpwQ2lwaGVyS2V5KQotewotCUlOVCBpOwotCVVMT05HIAkJb2Zmc2V0OwotCVBVQ0hBUgkJIHBLZXkgPSBwQ2lwaGVyS2V5LT5LZXk7Ci0JUFVDSEFSCQkgcFR4TWljID0gcENpcGhlcktleS0+VHhNaWM7Ci0JUFVDSEFSCQkgcFJ4TWljID0gcENpcGhlcktleS0+UnhNaWM7Ci0jaWZkZWYgREJHCi0JVUNIQVIJCUNpcGhlckFsZyA9IHBDaXBoZXJLZXktPkNpcGhlckFsZzsKLSNlbmRpZiAvLyBEQkcgLy8KLQotCS8vIEVLRVkKLQlvZmZzZXQgPSBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRSArIChXQ0lEICogSFdfS0VZX0VOVFJZX1NJWkUpOwotI2lmZGVmIFJUMjg2MAotCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfUEVFUl9LRVk7IGkrKykKLQl7Ci0JCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcEtleVtpXSk7Ci0JfQotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JUlRVU0JNdWx0aVdyaXRlKHBBZCwgb2Zmc2V0LCAmcENpcGhlcktleS0+S2V5WzBdLCBNQVhfTEVOX09GX1BFRVJfS0VZKTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX1BFRVJfS0VZOyBpKz00KQotCXsKLQkJVUlOVDMyIFZhbHVlOwotCQlSVE1QX0lPX1JFQUQzMihwQWQsIG9mZnNldCArIGksICZWYWx1ZSk7Ci0JfQotCi0Jb2Zmc2V0ICs9IE1BWF9MRU5fT0ZfUEVFUl9LRVk7Ci0KLQkvLyAgTUlDIEtFWQotCWlmIChwVHhNaWMpCi0JewotI2lmZGVmIFJUMjg2MAotCQlmb3IgKGk9MDsgaTw4OyBpKyspCi0JCXsKLQkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0K2ksIHBUeE1pY1tpXSk7Ci0JCX0KLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQlSVFVTQk11bHRpV3JpdGUocEFkLCBvZmZzZXQsICZwQ2lwaGVyS2V5LT5UeE1pY1swXSwgOCk7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi0JfQotCW9mZnNldCArPSA4OwotCWlmIChwUnhNaWMpCi0JewotI2lmZGVmIFJUMjg2MAotCQlmb3IgKGk9MDsgaTw4OyBpKyspCi0JCXsKLQkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0K2ksIHBSeE1pY1tpXSk7Ci0JCX0KLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQlSVFVTQk11bHRpV3JpdGUocEFkLCBvZmZzZXQsICZwQ2lwaGVyS2V5LT5SeE1pY1swXSwgOCk7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRkUGFpcndpc2VLZXlFbnRyeTogV0NJRCAjJWQgQWxnPSVzXG4iLFdDSUQsIENpcGhlck5hbWVbQ2lwaGVyQWxnXSkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiCUtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCXBLZXlbMF0scEtleVsxXSxwS2V5WzJdLHBLZXlbM10scEtleVs0XSxwS2V5WzVdLHBLZXlbNl0scEtleVs3XSxwS2V5WzhdLHBLZXlbOV0scEtleVsxMF0scEtleVsxMV0scEtleVsxMl0scEtleVsxM10scEtleVsxNF0scEtleVsxNV0pKTsKLQlpZiAocFJ4TWljKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiCVJ4IE1JQyBLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCQlwUnhNaWNbMF0scFJ4TWljWzFdLHBSeE1pY1syXSxwUnhNaWNbM10scFJ4TWljWzRdLHBSeE1pY1s1XSxwUnhNaWNbNl0scFJ4TWljWzddKSk7Ci0JfQotCWlmIChwVHhNaWMpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIJVHggTUlDIEtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCXBUeE1pY1swXSxwVHhNaWNbMV0scFR4TWljWzJdLHBUeE1pY1szXSxwVHhNaWNbNF0scFR4TWljWzVdLHBUeE1pY1s2XSxwVHhNaWNbN10pKTsKLQl9Ci19Ci0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlSZW1vdmUgUGFpci13aXNlIGtleSBtYXRlcmlhbCBmcm9tIEFTSUMuCi0KLSAgICBSZXR1cm46Ci0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUgkJIEJzc0lkeCwKLQlJTiBVQ0hBUgkJIFdjaWQpCi17Ci0JVUxPTkcJCVdDSURBdHRyaTsKLQlVU0hPUlQJCW9mZnNldDsKLQotCS8vIHJlLXNldCB0aGUgZW50cnkncyBXQ0lEIGF0dHJpYnV0ZSBhcyBPUEVOLU5PTkUuCi0Jb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoV2NpZCAqIEhXX1dDSURfQVRUUklfU0laRSk7Ci0JV0NJREF0dHJpID0gKEJzc0lkeDw8NCkgfCBQQUlSV0lTRUtFWVRBQkxFOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgV0NJREF0dHJpKTsKLX0KLQotQk9PTEVBTiBBc2ljU2VuZENvbW1hbmRUb01jdSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUgkJIENvbW1hbmQsCi0JSU4gVUNIQVIJCSBUb2tlbiwKLQlJTiBVQ0hBUgkJIEFyZzAsCi0JSU4gVUNIQVIJCSBBcmcxKQotewotCUhPU1RfQ01EX0NTUl9TVFJVQwlIMk1DbWQ7Ci0JSDJNX01BSUxCT1hfU1RSVUMJSDJNTWFpbGJveDsKLQlVTE9ORwkJCQlpID0gMDsKLQotCWRvCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEgyTV9NQUlMQk9YX0NTUiwgJkgyTU1haWxib3gud29yZCk7Ci0JCWlmIChIMk1NYWlsYm94LmZpZWxkLk93bmVyID09IDApCi0JCQlicmVhazsKLQotCQlSVE1QdXNlY0RlbGF5KDIpOwotCX0gd2hpbGUoaSsrIDwgMTAwKTsKLQotCWlmIChpID4gMTAwKQotCXsKLQkJewotI2lmZGVmIFJUMjg2MAotCQkJVUlOVDMyIERhdGE7Ci0KLQkJCS8vIFJlc2V0IERNQQotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBQQkZfU1lTX0NUUkwsICZEYXRhKTsKLQkJCURhdGEgfD0gMHgyOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX1NZU19DVFJMLCBEYXRhKTsKLQotCQkJLy8gQWZ0ZXIgUmVzZXQgRE1BLCBETUEgaW5kZXggd2lsbCBiZWNvbWUgWmVyby4gU28gRHJpdmVyIG5lZWQgdG8gcmVzZXQgYWxsIHJpbmcgaW5kZXhzIHRvby4KLQkJCS8vIFJlc2V0IERNQS9DUFUgcmluZyBpbmRleAotCQkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JLKTsKLQkJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CRSk7Ci0JCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVkkpOwotCQkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZPKTsKLQkJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9IQ0NBKTsKLQkJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9NR01UKTsKLQkJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9SWCk7Ci0KLQkJCS8vIENsZWFyIFJlc2V0Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFBCRl9TWVNfQ1RSTCwgJkRhdGEpOwotCQkJRGF0YSAmPSAweGZmZmZmZmZkOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX1NZU19DVFJMLCBEYXRhKTsKLSNlbmRpZiAvKiBSVDI4NjAgKi8KLQkJREJHUFJJTlRfRVJSKCgiSDJNX01BSUxCT1ggc3RpbGwgaG9sZCBieSBNQ1UuIGNvbW1hbmQgZmFpbFxuIikpOwotCQl9Ci0JCS8vcmV0dXJuIEZBTFNFOwotI2lmZGVmIFJUMjg3MAotCQlyZXR1cm4gRkFMU0U7Ci0jZW5kaWYKLQl9Ci0KLQlIMk1NYWlsYm94LmZpZWxkLk93bmVyCSAgPSAxOwkgICAvLyBwYXNzIG93bmVyc2hpcCB0byBNQ1UKLQlIMk1NYWlsYm94LmZpZWxkLkNtZFRva2VuID0gVG9rZW47Ci0JSDJNTWFpbGJveC5maWVsZC5IaWdoQnl0ZSA9IEFyZzE7Ci0JSDJNTWFpbGJveC5maWVsZC5Mb3dCeXRlICA9IEFyZzA7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfQ1NSLCBIMk1NYWlsYm94LndvcmQpOwotCi0JSDJNQ21kLndvcmQgCQkJICA9IDA7Ci0JSDJNQ21kLmZpZWxkLkhvc3RDb21tYW5kICA9IENvbW1hbmQ7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgSE9TVF9DTURfQ1NSLCBIMk1DbWQud29yZCk7Ci0KLQlpZiAoQ29tbWFuZCAhPSAweDgwKQotCXsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotI2lmZGVmIFJUMjg2MAotQk9PTEVBTiBBc2ljQ2hlY2tDb21tYW5PaygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUgkJIENvbW1hbmQpCi17Ci0JVUlOVDMyCUNtZFN0YXR1cyA9IDAsIENJRCA9IDAsIGk7Ci0JVUlOVDMyCVRoaXNDSURNYXNrID0gMDsKLQotCWkgPSAwOwotCWRvCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEgyTV9NQUlMQk9YX0NJRCwgJkNJRCk7Ci0JCS8vIEZpbmQgd2hlcmUgdGhlIGNvbW1hbmQgaXMuIEJlY2F1c2UgdGhpcyBpcyByYW5kb21seSBzcGVjaWZpZWQgYnkgZmlybXdhcmUuCi0JCWlmICgoQ0lEICYgQ0lEME1BU0spID09IENvbW1hbmQpCi0JCXsKLQkJCVRoaXNDSURNYXNrID0gQ0lEME1BU0s7Ci0JCQlicmVhazsKLQkJfQotCQllbHNlIGlmICgoKChDSUQgJiBDSUQxTUFTSyk+PjgpICYgMHhmZikgPT0gQ29tbWFuZCkKLQkJewotCQkJVGhpc0NJRE1hc2sgPSBDSUQxTUFTSzsKLQkJCWJyZWFrOwotCQl9Ci0JCWVsc2UgaWYgKCgoKENJRCAmIENJRDJNQVNLKT4+MTYpICYgMHhmZikgPT0gQ29tbWFuZCkKLQkJewotCQkJVGhpc0NJRE1hc2sgPSBDSUQyTUFTSzsKLQkJCWJyZWFrOwotCQl9Ci0JCWVsc2UgaWYgKCgoKENJRCAmIENJRDNNQVNLKT4+MjQpICYgMHhmZikgPT0gQ29tbWFuZCkKLQkJewotCQkJVGhpc0NJRE1hc2sgPSBDSUQzTUFTSzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJUlRNUHVzZWNEZWxheSgxMDApOwotCQlpKys7Ci0JfXdoaWxlIChpIDwgMjAwKTsKLQotCS8vIEdldCBDb21tYW5kU3RhdHVzIFZhbHVlCi0JUlRNUF9JT19SRUFEMzIocEFkLCBIMk1fTUFJTEJPWF9TVEFUVVMsICZDbWRTdGF0dXMpOwotCi0JLy8gVGhpcyBjb21tYW5kJ3Mgc3RhdHVzIGlzIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGFzIGNvbW1hbmQuIFNvIEFORCBjb21tYW5kIHBvc2l0aW9uJ3MgYml0bWFzayB0byByZWFkIHN0YXR1cy4KLQlpZiAoaSA8IDIwMCkKLQl7Ci0JCS8vIElmIFN0YXR1cyBpcyAxLCB0aGUgY29tYW1uZCBpcyBzdWNjZXNzLgotCQlpZiAoKChDbWRTdGF0dXMgJiBUaGlzQ0lETWFzaykgPT0gMHgxKSB8fCAoKENtZFN0YXR1cyAmIFRoaXNDSURNYXNrKSA9PSAweDEwMCkKLQkJCXx8ICgoQ21kU3RhdHVzICYgVGhpc0NJRE1hc2spID09IDB4MTAwMDApIHx8ICgoQ21kU3RhdHVzICYgVGhpc0NJRE1hc2spID09IDB4MTAwMDAwMCkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBBc2ljQ2hlY2tDb21tYW5PayBDSUQgPSAweCV4LCBDbWRTdGF0dXM9IDB4JXggXG4iLCBDSUQsIENtZFN0YXR1cykpOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfU1RBVFVTLCAweGZmZmZmZmZmKTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX0NJRCwgMHhmZmZmZmZmZik7Ci0JCQlyZXR1cm4gVFJVRTsKLQkJfQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gQXNpY0NoZWNrQ29tbWFuRmFpbDEgQ0lEID0gMHgleCwgQ21kU3RhdHVzPSAweCV4IFxuIiwgQ0lELCBDbWRTdGF0dXMpKTsKLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEFzaWNDaGVja0NvbW1hbkZhaWwyIFRpbWVvdXQgQ29tbWFuZCA9ICVkLCBDbWRTdGF0dXM9IDB4JXggXG4iLCBDb21tYW5kLCBDbWRTdGF0dXMpKTsKLQl9Ci0JLy8gQ2xlYXIgQ29tbWFuZCBhbmQgU3RhdHVzLgotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX1NUQVRVUywgMHhmZmZmZmZmZik7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfQ0lELCAweGZmZmZmZmZmKTsKLQotCXJldHVybiBGQUxTRTsKLX0KLSNlbmRpZiAvKiBSVDgyNjAgKi8KLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtNzY2MiwxMyArNTI0NCwxMSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVE1QQ2hlY2tSYXRlcygKLQlJTgkJUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gT1VUCVVDSEFSCQkJU3VwUmF0ZVtdLAotCUlOIE9VVAlVQ0hBUgkJCSpTdXBSYXRlTGVuKQordm9pZCBSVE1QQ2hlY2tSYXRlcyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICBJTiB1OCBTdXBSYXRlW10sIElOIHU4ICogU3VwUmF0ZUxlbikKIHsKLQlVQ0hBUglSYXRlSWR4LCBpLCBqOwotCVVDSEFSCU5ld1JhdGVbMTJdLCBOZXdSYXRlTGVuOworCXU4IFJhdGVJZHgsIGksIGo7CisJdTggTmV3UmF0ZVsxMl0sIE5ld1JhdGVMZW47CiAKIAlOZXdSYXRlTGVuID0gMDsKIApAQCAtNzY3Nyw3ICs1MjU3LDcgQEAKIAllbHNlCiAJCVJhdGVJZHggPSAxMjsKIAotCS8vIENoZWNrIGZvciBzdXBwb3J0IHJhdGVzIGV4Y2x1ZGUgYmFzaWMgcmF0ZSBiaXQKKwkvKiBDaGVjayBmb3Igc3VwcG9ydCByYXRlcyBleGNsdWRlIGJhc2ljIHJhdGUgYml0ICovCiAJZm9yIChpID0gMDsgaSA8ICpTdXBSYXRlTGVuOyBpKyspCiAJCWZvciAoaiA9IDA7IGogPCBSYXRlSWR4OyBqKyspCiAJCQlpZiAoKFN1cFJhdGVbaV0gJiAweDdmKSA9PSBSYXRlSWRUbzUwMEticHNbal0pCkBAIC03Njg3LDQzICs1MjY3LDM3IEBACiAJTmRpc01vdmVNZW1vcnkoU3VwUmF0ZSwgTmV3UmF0ZSwgTmV3UmF0ZUxlbik7CiB9CiAKLUJPT0xFQU4gUlRNUENoZWNrQ2hhbm5lbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUgkJQ2VudHJhbENoYW5uZWwsCi0JSU4gVUNIQVIJCUNoYW5uZWwpCitCT09MRUFOIFJUTVBDaGVja0NoYW5uZWwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHU4IENlbnRyYWxDaGFubmVsLCB1OCBDaGFubmVsKQogewotCVVDSEFSCQlrOwotCVVDSEFSCQlVcHBlckNoYW5uZWwgPSAwLCBMb3dlckNoYW5uZWwgPSAwOwotCVVDSEFSCQlOb0VmZmVjdENoYW5uZWxpbkxpc3QgPSAwOworCXU4IGs7CisJdTggVXBwZXJDaGFubmVsID0gMCwgTG93ZXJDaGFubmVsID0gMDsKKwl1OCBOb0VmZmVjdENoYW5uZWxpbkxpc3QgPSAwOwogCi0JLy8gRmluZCB1cHBlciBhbmQgbG93ZXIgY2hhbm5lbCBhY2NvcmRpbmcgdG8gNDBNSHogY3VycmVudCBvcGVyYXRpb24uCi0JaWYgKENlbnRyYWxDaGFubmVsIDwgQ2hhbm5lbCkKLQl7CisJLyogRmluZCB1cHBlciBhbmQgbG93ZXIgY2hhbm5lbCBhY2NvcmRpbmcgdG8gNDBNSHogY3VycmVudCBvcGVyYXRpb24uICovCisJaWYgKENlbnRyYWxDaGFubmVsIDwgQ2hhbm5lbCkgewogCQlVcHBlckNoYW5uZWwgPSBDaGFubmVsOwogCQlpZiAoQ2VudHJhbENoYW5uZWwgPiAyKQogCQkJTG93ZXJDaGFubmVsID0gQ2VudHJhbENoYW5uZWwgLSAyOwogCQllbHNlCiAJCQlyZXR1cm4gRkFMU0U7Ci0JfQotCWVsc2UgaWYgKENlbnRyYWxDaGFubmVsID4gQ2hhbm5lbCkKLQl7CisJfSBlbHNlIGlmIChDZW50cmFsQ2hhbm5lbCA+IENoYW5uZWwpIHsKIAkJVXBwZXJDaGFubmVsID0gQ2VudHJhbENoYW5uZWwgKyAyOwogCQlMb3dlckNoYW5uZWwgPSBDaGFubmVsOwogCX0KIAotCWZvciAoayA9IDA7ayA8IHBBZC0+Q2hhbm5lbExpc3ROdW07aysrKQotCXsKLQkJaWYgKHBBZC0+Q2hhbm5lbExpc3Rba10uQ2hhbm5lbCA9PSBVcHBlckNoYW5uZWwpCi0JCXsKLQkJCU5vRWZmZWN0Q2hhbm5lbGluTGlzdCArKzsKKwlmb3IgKGsgPSAwOyBrIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaysrKSB7CisJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2tdLkNoYW5uZWwgPT0gVXBwZXJDaGFubmVsKSB7CisJCQlOb0VmZmVjdENoYW5uZWxpbkxpc3QrKzsKIAkJfQotCQlpZiAocEFkLT5DaGFubmVsTGlzdFtrXS5DaGFubmVsID09IExvd2VyQ2hhbm5lbCkKLQkJewotCQkJTm9FZmZlY3RDaGFubmVsaW5MaXN0ICsrOworCQlpZiAocEFkLT5DaGFubmVsTGlzdFtrXS5DaGFubmVsID09IExvd2VyQ2hhbm5lbCkgeworCQkJTm9FZmZlY3RDaGFubmVsaW5MaXN0Kys7CiAJCX0KIAl9CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlRvdGFsIENoYW5uZWwgaW4gQ2hhbm5lbCBMaXN0ID0gWyVkXVxuIiwgTm9FZmZlY3RDaGFubmVsaW5MaXN0KSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIlRvdGFsIENoYW5uZWwgaW4gQ2hhbm5lbCBMaXN0ID0gWyVkXVxuIiwKKwkJICBOb0VmZmVjdENoYW5uZWxpbkxpc3QpKTsKIAlpZiAoTm9FZmZlY3RDaGFubmVsaW5MaXN0ID09IDIpCiAJCXJldHVybiBUUlVFOwogCWVsc2UKQEAgLTc3NDYsODggKzUzMjAsMTE0IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1CT09MRUFOIAlSVE1QQ2hlY2tIdCgKLQlJTglQUlRNUF9BREFQVEVSCQkJcEFkLAotCUlOCVVDSEFSCQkJCQlXY2lkLAotCUlOIAlIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKLQlJTiAJQUREX0hUX0lORk9fSUUJCQkqcEFkZEh0SW5mbykKK0JPT0xFQU4gUlRNUENoZWNrSHQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgdTggV2NpZCwKKwkJICAgIHN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llICogcEh0Q2FwYWJpbGl0eSwKKwkJICAgIHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSAqIHBBZGRIdEluZm8pCiB7CiAJaWYgKFdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCiAJCXJldHVybiBGQUxTRTsKIAotCS8vIElmIHVzZSBBTVNEVSwgc2V0IGZsYWcuCisJLyogSWYgdXNlIEFNU0RVLCBzZXQgZmxhZy4gKi8KIAlpZiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlKQotCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQpOwotCS8vIFNhdmUgUGVlciBDYXBhYmlsaXR5CisJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sCisJCQkJICAgICAgIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRCk7CisJLyogU2F2ZSBQZWVyIENhcGFiaWxpdHkgKi8KIAlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3IyMCkKLQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRSk7CisJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sCisJCQkJICAgICAgIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpOwogCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjQwKQotCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKTsKKwkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwKKwkJCQkgICAgICAgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRSk7CiAJaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5UeFNUQkMpCi0JCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX1R4U1RCQ19DQVBBQkxFKTsKKwkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwKKwkJCQkgICAgICAgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUpOwogCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uUnhTVEJDKQotCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRSk7Ci0JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgJiYgcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlJER1N1cHBvcnQpCi0JewotCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7CisJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sCisJCQkJICAgICAgIGZDTElFTlRfU1RBVFVTX1J4U1RCQ19DQVBBQkxFKTsKKwlpZiAocEFkLT5Db21tb25DZmcuYlJkZyAmJiBwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCkgeworCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLAorCQkJCSAgICAgICBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7CiAJfQogCi0JaWYgKFdjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSkKLQl7Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uTXBkdURlbnNpdHkgPSBwSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTXBkdURlbnNpdHk7CisJaWYgKFdjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSkgeworCQlwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLk1wZHVEZW5zaXR5ID0KKwkJICAgIHBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKIAl9Ci0KLQkvLyBXaWxsIGNoZWNrIENoYW5uZWxXaWR0aCBmb3IgTUNTU2V0WzRdIGJlbG93CisJLyogV2lsbCBjaGVjayBDaGFubmVsV2lkdGggZm9yIE1DU1NldFs0XSBiZWxvdyAqLwogCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzRdID0gMHgxOwotICAgIHN3aXRjaCAocEFkLT5Db21tb25DZmcuUnhTdHJlYW0pCi0JewotCQljYXNlIDE6Ci0JCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDB4ZmY7Ci0JCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDB4MDA7Ci0gICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSA9IDB4MDA7Ci0gICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFszXSA9IDB4MDA7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAweGZmOwotCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAweGZmOwotICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMl0gPSAweDAwOwotICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbM10gPSAweDAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMHhmZjsKLQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMHhmZjsKLSAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzJdID0gMHhmZjsKLSAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzNdID0gMHgwMDsKLQkJCWJyZWFrOworCXN3aXRjaCAocEFkLT5Db21tb25DZmcuUnhTdHJlYW0pIHsKKwljYXNlIDE6CisJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMHhmZjsKKwkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAweDAwOworCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSA9IDB4MDA7CisJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzNdID0gMHgwMDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDB4ZmY7CisJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMHhmZjsKKwkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMl0gPSAweDAwOworCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFszXSA9IDB4MDA7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAweGZmOworCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDB4ZmY7CisJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzJdID0gMHhmZjsKKwkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbM10gPSAweDAwOworCQlicmVhazsKIAl9CiAKLQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPSBwQWRkSHRJbmZvLT5BZGRIdEluZm8uUmVjb21XaWR0aCAmIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGg7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID0KKwkgICAgcEFkZEh0SW5mby0+QWRkSHRJbmZvLlJlY29tV2lkdGggJiBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuCisJICAgIENoYW5uZWxXaWR0aDsKIAotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBDaGVja0h0OjogSHRDYXBJbmZvLkNoYW5uZWxXaWR0aD0lZCwgUmVjb21XaWR0aD0lZCwgRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aD0lZCwgQlc0ME1BdmFpbEZvckEvRz0lZC8lZCwgUGh5TW9kZT0lZCBcbiIsCi0JCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCwgcEFkZEh0SW5mby0+QWRkSHRJbmZvLlJlY29tV2lkdGgsIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgsCi0JCXBBZC0+TmljQ29uZmlnMi5maWVsZC5CVzQwTUF2YWlsRm9yQSwgcEFkLT5OaWNDb25maWcyLmZpZWxkLkJXNDBNQXZhaWxGb3JHLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIlJUTVBDaGVja0h0OjogSHRDYXBJbmZvLkNoYW5uZWxXaWR0aD0lZCwgUmVjb21XaWR0aD0lZCwgRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aD0lZCwgQlc0ME1BdmFpbEZvckEvRz0lZC8lZCwgUGh5TW9kZT0lZCBcbiIsCisJCSAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoLAorCQkgIHBBZGRIdEluZm8tPkFkZEh0SW5mby5SZWNvbVdpZHRoLAorCQkgIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgsCisJCSAgcEFkLT5OaWNDb25maWcyLmZpZWxkLkJXNDBNQXZhaWxGb3JBLAorCQkgIHBBZC0+TmljQ29uZmlnMi5maWVsZC5CVzQwTUF2YWlsRm9yRywKKwkJICBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKSk7CiAKLQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRiA9ICBwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uR0YgJnBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRjsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRiA9CisJICAgIHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5HRiAmIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRjsKIAotCS8vIFNlbmQgQXNzb2MgUmVxIHdpdGggbXkgSFQgY2FwYWJpbGl0eS4KLQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemUgPSAgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZTsKLQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSAgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QczsKLQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjAgPSAgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjApICYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApOwotCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCA9ICAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCkgJiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3I0MCk7Ci0JcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDID0gIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSYocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlJ4U1RCQyk7Ci0JcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDID0gIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuUnhTVEJDKSYocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlR4U1RCQyk7Ci0JcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yID0gcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1heFJBbXBkdUZhY3RvcjsKLSAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHk7Ci0JcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9IHBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mby5QbHVzSFRDOwotCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uSFRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlBsdXNIVEM7Ci0JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcpCi0JewotCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0ID0gcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlJER1N1cHBvcnQ7Ci0gICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMgPSAxOworCS8qIFNlbmQgQXNzb2MgUmVxIHdpdGggbXkgSFQgY2FwYWJpbGl0eS4gKi8KKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemUgPQorCSAgICBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplOworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9CisJICAgIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHM7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwID0KKwkgICAgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjApICYgKHBIdENhcGFiaWxpdHktPgorCQkJCQkJCSAgSHRDYXBJbmZvLgorCQkJCQkJCSAgU2hvcnRHSWZvcjIwKTsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDAgPQorCSAgICAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCkgJiAocEh0Q2FwYWJpbGl0eS0+CisJCQkJCQkJICBIdENhcEluZm8uCisJCQkJCQkJICBTaG9ydEdJZm9yNDApOworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlR4U1RCQyA9CisJICAgIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSAmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uCisJCQkJCQkgICAgUnhTVEJDKTsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMgPQorCSAgICAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlJ4U1RCQykgJiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLgorCQkJCQkJICAgIFR4U1RCQyk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yID0KKwkgICAgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1heFJBbXBkdUZhY3RvcjsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9CisJICAgIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9CisJICAgIHBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mby5QbHVzSFRDOworCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uSFRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0KKwkgICAgcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlBsdXNIVEM7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcpIHsKKwkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCA9CisJCSAgICBwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUkRHU3VwcG9ydDsKKwkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9IDE7CiAJfQogCi0gICAgaWYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV18yMCkKLSAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0gPSAweDA7ICAvLyBCVzIwIGNhbid0IHRyYW5zbWl0IE1DUzMyCisJaWYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV18yMCkKKwkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0gPSAweDA7CS8qIEJXMjAgY2FuJ3QgdHJhbnNtaXQgTUNTMzIgKi8KIAogCUNPUFlfQVBfSFRTRVRUSU5HU19GUk9NX0JFQUNPTihwQWQsIHBIdENhcGFiaWxpdHkpOwogCXJldHVybiBUUlVFOwpAQCAtNzg0OSw2NSArNTQ0OSw2MCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBSVE1QVXBkYXRlTWxtZVJhdGUoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpCit2b2lkIFJUTVBVcGRhdGVNbG1lUmF0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JVUNIQVIJTWluaW11bVJhdGU7Ci0JVUNIQVIJUHJvcGVyTWxtZVJhdGU7IC8vPSBSQVRFXzU0OwotCVVDSEFSCWksIGosIFJhdGVJZHggPSAxMjsgLy8xLCAyLCA1LjUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0Ci0JQk9PTEVBTgliTWF0Y2ggPSBGQUxTRTsKKwl1OCBNaW5pbXVtUmF0ZTsKKwl1OCBQcm9wZXJNbG1lUmF0ZTsJLyo9IFJBVEVfNTQ7ICovCisJdTggaSwgaiwgUmF0ZUlkeCA9IDEyOwkvKjEsIDIsIDUuNSwgMTEsIDYsIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQgKi8KKwlCT09MRUFOIGJNYXRjaCA9IEZBTFNFOwogCi0Jc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKQotCXsKLQkJY2FzZSBQSFlfMTFCOgorCXN3aXRjaCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSkgeworCWNhc2UgUEhZXzExQjoKKwkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzExOworCQlNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKKwkJYnJlYWs7CisJY2FzZSBQSFlfMTFCR19NSVhFRDoKKwljYXNlIFBIWV8xMUFCR05fTUlYRUQ6CisJY2FzZSBQSFlfMTFCR05fTUlYRUQ6CisJCWlmICgocEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4gPT0gNCkgJiYKKwkJICAgIChwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiA9PSAwKSkKKwkJCS8qIEIgb25seSBBUCAqLwogCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzExOwotCQkJTWluaW11bVJhdGUgPSBSQVRFXzE7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFCR19NSVhFRDoKLQkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgotCQljYXNlIFBIWV8xMUJHTl9NSVhFRDoKLQkJCWlmICgocEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4gPT0gNCkgJiYKLQkJCQkocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gPT0gMCkpCi0JCQkJLy8gQiBvbmx5IEFQCi0JCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzExOwotCQkJZWxzZQotCQkJCVByb3Blck1sbWVSYXRlID0gUkFURV8yNDsKKwkJZWxzZQorCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzI0OwogCi0JCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpCi0JCQkJTWluaW11bVJhdGUgPSBSQVRFXzE7Ci0JCQllbHNlCi0JCQkJTWluaW11bVJhdGUgPSBSQVRFXzY7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFBOgotCQljYXNlIFBIWV8xMU5fMl80RzoJLy8gcnQyODYwIG5lZWQgdG8gY2hlY2sgbWxtZXJhdGUgZm9yIDgwMi4xMW4KLQkJY2FzZSBQSFlfMTFHTl9NSVhFRDoKLQkJY2FzZSBQSFlfMTFBR05fTUlYRUQ6Ci0JCWNhc2UgUEhZXzExQU5fTUlYRUQ6Ci0JCWNhc2UgUEhZXzExTl81RzoKLQkJCVByb3Blck1sbWVSYXRlID0gUkFURV8yNDsKLQkJCU1pbmltdW1SYXRlID0gUkFURV82OwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExQUJHX01JWEVEOgotCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzI0OwotCQkJaWYgKHBBZC0+TWxtZUF1eC5DaGFubmVsIDw9IDE0KQotCQkJICAgTWluaW11bVJhdGUgPSBSQVRFXzE7Ci0JCQllbHNlCi0JCQkJTWluaW11bVJhdGUgPSBSQVRFXzY7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDogLy8gZXJyb3IKLQkJCVByb3Blck1sbWVSYXRlID0gUkFURV8xOworCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpCiAJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKLQkJCWJyZWFrOworCQllbHNlCisJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfNjsKKwkJYnJlYWs7CisJY2FzZSBQSFlfMTFBOgorCWNhc2UgUEhZXzExTl8yXzRHOgkvKiBydDI4NjAgbmVlZCB0byBjaGVjayBtbG1lcmF0ZSBmb3IgODAyLjExbiAqLworCWNhc2UgUEhZXzExR05fTUlYRUQ6CisJY2FzZSBQSFlfMTFBR05fTUlYRUQ6CisJY2FzZSBQSFlfMTFBTl9NSVhFRDoKKwljYXNlIFBIWV8xMU5fNUc6CisJCVByb3Blck1sbWVSYXRlID0gUkFURV8yNDsKKwkJTWluaW11bVJhdGUgPSBSQVRFXzY7CisJCWJyZWFrOworCWNhc2UgUEhZXzExQUJHX01JWEVEOgorCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMjQ7CisJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA8PSAxNCkKKwkJCU1pbmltdW1SYXRlID0gUkFURV8xOworCQllbHNlCisJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfNjsKKwkJYnJlYWs7CisJZGVmYXVsdDoJCS8qIGVycm9yICovCisJCVByb3Blck1sbWVSYXRlID0gUkFURV8xOworCQlNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKKwkJYnJlYWs7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuOyBpKyspCi0JewotCQlmb3IgKGogPSAwOyBqIDwgUmF0ZUlkeDsgaisrKQotCQl7Ci0JCQlpZiAoKHBBZC0+TWxtZUF1eC5TdXBSYXRlW2ldICYgMHg3ZikgPT0gUmF0ZUlkVG81MDBLYnBzW2pdKQotCQkJewotCQkJCWlmIChqID09IFByb3Blck1sbWVSYXRlKQotCQkJCXsKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW47IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgUmF0ZUlkeDsgaisrKSB7CisJCQlpZiAoKHBBZC0+TWxtZUF1eC5TdXBSYXRlW2ldICYgMHg3ZikgPT0KKwkJCSAgICBSYXRlSWRUbzUwMEticHNbal0pIHsKKwkJCQlpZiAoaiA9PSBQcm9wZXJNbG1lUmF0ZSkgewogCQkJCQliTWF0Y2ggPSBUUlVFOwogCQkJCQlicmVhazsKIAkJCQl9CkBAIC03OTE4LDE2ICs1NTEzLDEyIEBACiAJCQlicmVhazsKIAl9CiAKLQlpZiAoYk1hdGNoID09IEZBTFNFKQotCXsKLQkJZm9yIChpID0gMDsgaSA8IHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuOyBpKyspCi0JCXsKLQkJCWZvciAoaiA9IDA7IGogPCBSYXRlSWR4OyBqKyspCi0JCQl7Ci0JCQkJaWYgKChwQWQtPk1sbWVBdXguRXh0UmF0ZVtpXSAmIDB4N2YpID09IFJhdGVJZFRvNTAwS2Jwc1tqXSkKLQkJCQl7Ci0JCQkJCWlmIChqID09IFByb3Blck1sbWVSYXRlKQotCQkJCQl7CisJaWYgKGJNYXRjaCA9PSBGQUxTRSkgeworCQlmb3IgKGkgPSAwOyBpIDwgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW47IGkrKykgeworCQkJZm9yIChqID0gMDsgaiA8IFJhdGVJZHg7IGorKykgeworCQkJCWlmICgocEFkLT5NbG1lQXV4LkV4dFJhdGVbaV0gJiAweDdmKSA9PQorCQkJCSAgICBSYXRlSWRUbzUwMEticHNbal0pIHsKKwkJCQkJaWYgKGogPT0gUHJvcGVyTWxtZVJhdGUpIHsKIAkJCQkJCWJNYXRjaCA9IFRSVUU7CiAJCQkJCQlicmVhazsKIAkJCQkJfQpAQCAtNzkzOSw1MSArNTUzMCw0OCBAQAogCQl9CiAJfQogCi0JaWYgKGJNYXRjaCA9PSBGQUxTRSkKLQl7CisJaWYgKGJNYXRjaCA9PSBGQUxTRSkgewogCQlQcm9wZXJNbG1lUmF0ZSA9IE1pbmltdW1SYXRlOwogCX0KIAogCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gTWluaW11bVJhdGU7CiAJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFByb3Blck1sbWVSYXRlOwotCWlmIChwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA+PSBSQVRFXzYpCi0JeworCWlmIChwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA+PSBSQVRFXzYpIHsKIAkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTUzBNY2FzdF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOwotCX0KLQllbHNlCi0JeworCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0KKwkJICAgIE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPQorCQkgICAgTU9ERV9PRkRNOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTUzBNY2FzdF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0KKwkJICAgIE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKKwl9IGVsc2UgewogCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfQ0NLOwogCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPQorCQkgICAgTU9ERV9DQ0s7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPQorCQkgICAgcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7CiAJfQogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFVwZGF0ZU1sbWVSYXRlID09PiAgIE1sbWVUcmFuc21pdCA9IDB4JXggIFxuIiAsIHBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC53b3JkKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIlJUTVBVcGRhdGVNbG1lUmF0ZSA9PT4gICBNbG1lVHJhbnNtaXQgPSAweCV4ICBcbiIsCisJCSAgcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LndvcmQpKTsKIH0KIAotQ0hBUiBSVE1QTWF4UnNzaSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBDSEFSCQkJCVJzc2kwLAotCUlOIENIQVIJCQkJUnNzaTEsCi0JSU4gQ0hBUgkJCQlSc3NpMikKK2NoYXIgUlRNUE1heFJzc2koc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgY2hhciBSc3NpMCwgY2hhciBSc3NpMSwgY2hhciBSc3NpMikKIHsKLQlDSEFSCWxhcmdlciA9IC0xMjc7CisJY2hhciBsYXJnZXIgPSAtMTI3OwogCi0JaWYgKChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpICYmIChSc3NpMCAhPSAwKSkKLQl7CisJaWYgKChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpICYmIChSc3NpMCAhPSAwKSkgewogCQlsYXJnZXIgPSBSc3NpMDsKIAl9CiAKLQlpZiAoKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMikgJiYgKFJzc2kxICE9IDApKQotCXsKKwlpZiAoKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMikgJiYgKFJzc2kxICE9IDApKSB7CiAJCWxhcmdlciA9IG1heChSc3NpMCwgUnNzaTEpOwogCX0KIAotCWlmICgocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKSAmJiAoUnNzaTIgIT0gMCkpCi0JeworCWlmICgocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKSAmJiAoUnNzaTIgIT0gMCkpIHsKIAkJbGFyZ2VyID0gbWF4KGxhcmdlciwgUnNzaTIpOwogCX0KIApAQCAtNzk5Myw1NiArNTU4MSw2IEBACiAJcmV0dXJuIGxhcmdlcjsKIH0KIAotI2lmZGVmIFJUMjg3MAotLy8gQW50ZW5uYSBkaXZlc2l0eSB1c2UgR1BJTzMgYW5kIEVFU0sgcGluIGZvciBjb250cm9sCi0vLyBBbnRlbm5hIGFuZCBFRVBST00gYWNjZXNzIGFyZSBib3RoIHVzaW5nIEVFU0sgcGluLAotLy8gVGhlcmVmb3Igd2Ugc2hvdWxkIGF2b2lkIGFjY2Vzc2luZyBFRVNLIGF0IHRoZSBzYW1lIHRpbWUKLS8vIFRoZW4gcmVzdG9yZSBhbnRlbm5hIGFmdGVyIEVFUFJPTSBhY2Nlc3MKLVZPSUQgQXNpY1NldFJ4QW50KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVDSEFSCQkJQW50KQotewotCVVJTlQzMglWYWx1ZTsKLQlVSU5UMzIJeDsKLQotCWlmICgocEFkLT5FZXByb21BY2Nlc3MpCQkJCQkJCQkJCXx8Ci0JCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKQl8fAotCQkoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKQl8fAotCQkoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCQkJfHwKLQkJKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCi0JewotCQlyZXR1cm47Ci0JfQotCi0JLy8gdGhlIGFudGVubmEgc2VsZWN0aW9uIGlzIHRocm91Z2ggZmlybXdhcmUgYW5kIE1BQyByZWdpc3RlcihHUElPMykKLQlpZiAoQW50ID09IDApCi0JewotCQkvLyBNYWluIGFudGVubmEKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7Ci0JCXggfD0gKEVFU0spOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKLQotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEdQSU9fQ1RSTF9DRkcsICZWYWx1ZSk7Ci0JCVZhbHVlICY9IH4oMHgwODA4KTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgR1BJT19DVFJMX0NGRywgVmFsdWUpOwotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1NldFJ4QW50LCBzd2l0Y2ggdG8gbWFpbiBhbnRlbm5hXG4iKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIEF1eCBhbnRlbm5hCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOwotCQl4ICY9IH4oRUVTSyk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOwotCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgR1BJT19DVFJMX0NGRywgJlZhbHVlKTsKLQkJVmFsdWUgJj0gfigweDA4MDgpOwotCQlWYWx1ZSB8PSAweDA4OwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBHUElPX0NUUkxfQ0ZHLCBWYWx1ZSk7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJBc2ljU2V0UnhBbnQsIHN3aXRjaCB0byBhdXggYW50ZW5uYVxuIikpOwotCX0KLX0KLSNlbmRpZgotCiAvKgogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CkBAIC04MDU2LDkxICs1NTk0LDcwIEBACiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIEFzaWNFdmFsdWF0ZVJ4QW50KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQordm9pZCBBc2ljRXZhbHVhdGVSeEFudChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JVUNIQVIJQkJQUjMgPSAwOworCXU4IEJCUFIzID0gMDsKIAogCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAotCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8Ci0JCQkJZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAotCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCB8Ci0JCQkJZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykKLQkJCQl8fCBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpCi0jaWZkZWYgUlQyODcwCi0JCQkJfHwgKHBBZC0+RWVwcm9tQWNjZXNzKQotI2VuZGlmCi0JCQkJKQotCQkJcmV0dXJuOwotCisJCQkgICBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJICAgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAorCQkJICAgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwKKwkJCSAgIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpIHx8CisJICAgIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkKICNpZmRlZiBSVDMweHgKLQkvLyB0d28gYW50ZW5uYSBzZWxlY3Rpb24gbWVjaGFuaXNtLSBvbmUgaXMgYW50ZW5uYSBkaXZlcnNpdHksIHRoZSBvdGhlciBpcyBmYWlsZWQgYW50ZW5uYSByZW1vdmUKLQkvLyBvbmUgaXMgYW50ZW5uYSBkaXZlcnNpdHk6dGhlcmUgaXMgb25seSBvbmUgYW50ZW5uYSBjYW4gcnggYW5kIHR4Ci0JLy8gdGhlIG90aGVyIGlzIGZhaWxlZCBhbnRlbm5hIHJlbW92ZTp0d28gcGh5c2ljYWwgYW50ZW5uYSBjYW4gcnggYW5kIHR4Ci0JaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5BbnREaXZlcnNpdHkpCisJICAgIHx8IChwQWQtPkVlcHJvbUFjY2VzcykKKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KKyNpZmRlZiBSVDMwOTAKKwkgICAgfHwgKHBBZC0+YlBDSWNsa09mZiA9PSBUUlVFKQorI2VuZGlmIC8qIFJUMzA5MCAvLyAqLworCSAgICApCisJCXJldHVybjsKKwogCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBbnREaXYgLSBiZWZvcmUgZXZhbHVhdGUgUGFpcjEtQW50ICglZCwlZClcbiIsCi0JCQlwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50LCBwQWQtPlJ4QW50LlBhaXIxU2Vjb25kYXJ5UnhBbnQpKTsKKwkJLyppZiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSAqLworCQkvKiAgICAgIHJldHVybjsgKi8KIAotCQlBc2ljU2V0UnhBbnQocEFkLCBwQWQtPlJ4QW50LlBhaXIxU2Vjb25kYXJ5UnhBbnQpOwotCi0JCXBBZC0+UnhBbnQuRXZhbHVhdGVQZXJpb2QgPSAxOyAvLyAxOk1lYW5zIHN3aXRjaCB0byBTZWNvbmRhcnlSeEFudCwgMDpNZWFucyBzd2l0Y2ggdG8gUGFpcjFQcmltYXJ5UnhBbnQKLQkJcEFkLT5SeEFudC5GaXJzdFBrdEFycml2ZWRXaGVuRXZhbHVhdGUgPSBGQUxTRTsKLQkJcEFkLT5SeEFudC5SY3ZQa3ROdW1XaGVuRXZhbHVhdGUgPSAwOwotCi0JCS8vIGEgb25lLXNob3QgdGltZXIgdG8gZW5kIHRoZSBldmFsdXRpb24KLQkJLy8gZHluYW1pYyBhZGp1c3QgYW50ZW5uYSBldmFsdWF0aW9uIHBlcmlvZCBhY2NvcmRpbmcgdG8gdGhlIHRyYWZmaWMKLQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJ4QW50RXZhbFRpbWVyLCAxMDApOwotCQllbHNlCi0JCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SeEFudEV2YWxUaW1lciwgMzAwKTsKLQl9Ci0JZWxzZQotI2VuZGlmCi0JewotCQlpZiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKQotCQkJcmV0dXJuOwotCi0JCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJCUFIzKTsKLQkJQkJQUjMgJj0gKH4weDE4KTsKLQkJaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKQogCQl7Ci0JCQlCQlBSMyB8PSAoMHgxMCk7Ci0JCX0KLQkJZWxzZSBpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCi0JCXsKLQkJCUJCUFIzIHw9ICgweDgpOwotCQl9Ci0JCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQotCQl7Ci0JCQlCQlBSMyB8PSAoMHgwKTsKLQkJfQotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBSMyk7CiAKLSNpZmRlZiBSVDI4NjAKLQkJcEFkLT5TdGFDZmcuQkJQUjMgPSBCQlBSMzsKLSNlbmRpZgorCQkJaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkKKwkJCQlyZXR1cm47CisKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJCUFIzKTsKKwkJCUJCUFIzICY9ICh+MHgxOCk7CisJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKSB7CisJCQkJQkJQUjMgfD0gKDB4MTApOworCQkJfSBlbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpIHsKKwkJCQlCQlBSMyB8PSAoMHg4KTsKKwkJCX0gZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKSB7CisJCQkJQkJQUjMgfD0gKDB4MCk7CisJCQl9CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBSMyk7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJCQlwQWQtPlN0YUNmZy5CQlBSMyA9IEJCUFIzOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRworCQkJICAgIChwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKQorCQkJICAgICkgeworCQkJCXVuc2lnbmVkIGxvbmcgVHhUb3RhbENudCA9CisJCQkJICAgIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArCisJCQkJICAgIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKworCQkJCSAgICBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50OworCisJCQkJLyogZHluYW1pYyBhZGp1c3QgYW50ZW5uYSBldmFsdWF0aW9uIHBlcmlvZCBhY2NvcmRpbmcgdG8gdGhlIHRyYWZmaWMgKi8KKwkJCQlpZiAoVHhUb3RhbENudCA+IDUwKSB7CisJCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJ4QW50RXZhbFRpbWVyLAorCQkJCQkJICAgICAyMCk7CisJCQkJCXBBZC0+TWxtZS5iTG93VGhyb3VnaHB1dCA9IEZBTFNFOworCQkJCX0gZWxzZSB7CisJCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJ4QW50RXZhbFRpbWVyLAorCQkJCQkJICAgICAzMDApOworCQkJCQlwQWQtPk1sbWUuYkxvd1Rocm91Z2hwdXQgPSBUUlVFOworCQkJCX0KKwkJCX0KKwkJfQorCiAJfQogCi0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKQotCQkpCi0JewotCQlVTE9ORwlUeFRvdGFsQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKLQkJCQkJCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArCi0JCQkJCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7Ci0KLQkJCS8vIGR5bmFtaWMgYWRqdXN0IGFudGVubmEgZXZhbHVhdGlvbiBwZXJpb2QgYWNjb3JkaW5nIHRvIHRoZSB0cmFmZmljCi0JCWlmIChUeFRvdGFsQ250ID4gNTApCi0JCXsKLQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJ4QW50RXZhbFRpbWVyLCAyMCk7Ci0JCQlwQWQtPk1sbWUuYkxvd1Rocm91Z2hwdXQgPSBGQUxTRTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJ4QW50RXZhbFRpbWVyLCAzMDApOwotCQkJcEFkLT5NbG1lLmJMb3dUaHJvdWdocHV0ID0gVFJVRTsKLQkJfQotCX0KIH0KIAogLyoKQEAgLTgxNTYsOTAgKzU2NzMsNTQgQEAKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgQXNpY1J4QW50RXZhbFRpbWVvdXQoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQordm9pZCBBc2ljUnhBbnRFdmFsVGltZW91dCh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCQkgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJCSAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpCiB7Ci0JUlRNUF9BREFQVEVSCSpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OwotCVVDSEFSCQkJQkJQUjMgPSAwOwotCUNIQVIJCQlsYXJnZXIgPSAtMTI3LCByc3NpMCwgcnNzaTEsIHJzc2kyOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopRnVuY3Rpb25Db250ZXh0OworCXU4IEJCUFIzID0gMDsKKwljaGFyIGxhcmdlciA9IC0xMjcsIHJzc2kwLCByc3NpMSwgcnNzaTI7CiAKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTCXwKLQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MJfAotCQkJCQkJCWZSVE1QX0FEQVBURVJfUkFESU9fT0ZGCQkJfAotCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkKLQkJCQkJCQl8fCBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpCi0jaWZkZWYgUlQyODcwCi0JCQkJCQkJfHwgKHBBZC0+RWVwcm9tQWNjZXNzKQotI2VuZGlmCi0JCQkJCQkJKQorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJICAgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCSAgIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGIHwKKwkJCSAgIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkgfHwKKwkgICAgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKQorI2lmZGVmIFJUMzB4eAorCSAgICB8fCAocEFkLT5FZXByb21BY2Nlc3MpCisjZW5kaWYgLyogUlQzMHh4IC8vICovCisjaWZkZWYgUlQzMDkwCisJICAgIHx8IChwQWQtPmJQQ0ljbGtPZmYgPT0gVFJVRSkKKyNlbmRpZiAvKiBSVDMwOTAgLy8gKi8KKwkgICAgKQogCQlyZXR1cm47CiAKIAl7Ci0jaWZkZWYgUlQzMHh4Ci0JCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuQW50RGl2ZXJzaXR5KQotCQl7Ci0JCQlpZiAoKHBBZC0+UnhBbnQuUmN2UGt0TnVtV2hlbkV2YWx1YXRlICE9IDApICYmIChwQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVtwQWQtPlJ4QW50LlBhaXIxU2Vjb25kYXJ5UnhBbnRdID49IHBBZC0+UnhBbnQuUGFpcjFBdmdSc3NpW3BBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnRdKSkKLQkJCXsKLQkJCQlVQ0hBUgkJCXRlbXA7Ci0KLQkJCQkvLwotCQkJCS8vIHNlbGVjdCBQcmltYXJ5UnhBbnRQYWlyCi0JCQkJLy8gICAgUm9sZSBjaGFuZ2UsIFVzZWQgUGFpcjFTZWNvbmRhcnlSeEFudCBhcyBQcmltYXJ5UnhBbnRQYWlyLgotCQkJCS8vICAgIFNpbmNlIFBhaXIxU2Vjb25kYXJ5UnhBbnQgUXVhbGl0eSBnb29kIHRoYW4gUGFpcjFQcmltYXJ5UnhBbnQKLQkJCQkvLwotCQkJCXRlbXAgPSBwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50OwotCQkJCXBBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQgPSBwQWQtPlJ4QW50LlBhaXIxU2Vjb25kYXJ5UnhBbnQ7Ci0JCQkJcEFkLT5SeEFudC5QYWlyMVNlY29uZGFyeVJ4QW50ID0gdGVtcDsKLQotCQkJCXBBZC0+UnhBbnQuUGFpcjFMYXN0QXZnUnNzaSA9IChwQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVtwQWQtPlJ4QW50LlBhaXIxU2Vjb25kYXJ5UnhBbnRdID4+IDMpOwotCQkJCXBBZC0+UnhBbnQuRXZhbHVhdGVTdGFibGVDbnQgPSAwOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vIGlmIHRoZSBldmFsdWF0ZWQgYW50ZW5uYSBpcyBub3QgYmV0dGVyIHRoYW4gb3JpZ2luYWwsIHN3aXRjaCBiYWNrIHRvIG9yaWdpbmFsIGFudGVubmEKLQkJCQlBc2ljU2V0UnhBbnQocEFkLCBwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50KTsKLQkJCQlwQWQtPlJ4QW50LkV2YWx1YXRlU3RhYmxlQ250ICsrOwotCQkJfQotCi0JCQlwQWQtPlJ4QW50LkV2YWx1YXRlUGVyaW9kID0gMDsgLy8gMTpNZWFucyBzd2l0Y2ggdG8gU2Vjb25kYXJ5UnhBbnQsIDA6TWVhbnMgc3dpdGNoIHRvIFBhaXIxUHJpbWFyeVJ4QW50Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXNpY1J4QW50RXZhbEFjdGlvbjo6QWZ0ZXIgRXZhbChmaXggaW4gIyVkKSwgPCVkLCAlZD4sIFJjdlBrdE51bVdoZW5FdmFsdWF0ZT0lbGRcbiIsCi0JCQkJCXBBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQsIChwQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVswXSA+PiAzKSwgKHBBZC0+UnhBbnQuUGFpcjFBdmdSc3NpWzFdID4+IDMpLCBwQWQtPlJ4QW50LlJjdlBrdE51bVdoZW5FdmFsdWF0ZSkpOwotCQl9Ci0JCWVsc2UKLSNlbmRpZgorCQkvKmlmIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpICovCisJCS8qICAgICAgcmV0dXJuOyAqLwogCQl7CiAJCQlpZiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKQogCQkJCXJldHVybjsKIAotCQkJLy8gaWYgdGhlIHRyYWZmaWMgaXMgbG93LCB1c2UgYXZlcmFnZSByc3NpIGFzIHRoZSBjcml0ZXJpYQotCQkJaWYgKHBBZC0+TWxtZS5iTG93VGhyb3VnaHB1dCA9PSBUUlVFKQotCQkJeworCQkJLyogaWYgdGhlIHRyYWZmaWMgaXMgbG93LCB1c2UgYXZlcmFnZSByc3NpIGFzIHRoZSBjcml0ZXJpYSAqLworCQkJaWYgKHBBZC0+TWxtZS5iTG93VGhyb3VnaHB1dCA9PSBUUlVFKSB7CiAJCQkJcnNzaTAgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMDsKIAkJCQlyc3NpMSA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxOwogCQkJCXJzc2kyID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTI7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7CisJCQl9IGVsc2UgewogCQkJCXJzc2kwID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMDsKIAkJCQlyc3NpMSA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTE7CiAJCQkJcnNzaTIgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyOwogCQkJfQogCi0JCQlpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpCi0JCQl7CisJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKSB7CiAJCQkJbGFyZ2VyID0gbWF4KHJzc2kwLCByc3NpMSk7CiAKIAkJCQlpZiAobGFyZ2VyID4gKHJzc2kyICsgMjApKQogCQkJCQlwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9IDI7CiAJCQkJZWxzZQogCQkJCQlwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9IDM7Ci0JCQl9Ci0JCQllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKLQkJCXsKKwkJCX0gZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKSB7CiAJCQkJaWYgKHJzc2kwID4gKHJzc2kxICsgMjApKQogCQkJCQlwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9IDE7CiAJCQkJZWxzZQpAQCAtODI0OCwzOSArNTcyOSw0NSBAQAogCiAJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlBSMyk7CiAJCQlCQlBSMyAmPSAofjB4MTgpOwotCQkJaWYocEFkLT5NbG1lLlJlYWxSeFBhdGggPT0gMykKLQkJCXsKKwkJCWlmIChwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9PSAzKSB7CiAJCQkJQkJQUjMgfD0gKDB4MTApOwotCQkJfQotCQkJZWxzZSBpZihwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9PSAyKQotCQkJeworCQkJfSBlbHNlIGlmIChwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9PSAyKSB7CiAJCQkJQkJQUjMgfD0gKDB4OCk7Ci0JCQl9Ci0JCQllbHNlIGlmKHBBZC0+TWxtZS5SZWFsUnhQYXRoID09IDEpCi0JCQl7CisJCQl9IGVsc2UgaWYgKHBBZC0+TWxtZS5SZWFsUnhQYXRoID09IDEpIHsKIAkJCQlCQlBSMyB8PSAoMHgwKTsKIAkJCX0KIAkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJCUFIzKTsKLSNpZmRlZiBSVDI4NjAKKyNpZmRlZiBSVE1QX01BQ19QQ0kKIAkJCXBBZC0+U3RhQ2ZnLkJCUFIzID0gQkJQUjM7Ci0jZW5kaWYKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAkJfQogCX0KKwogfQogCi1WT0lEIEFQU0RQZXJpb2RpY0V4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQordm9pZCBBUFNEUGVyaW9kaWNFeGVjKHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJICAgICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkgICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMykKIHsKLQlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilGdW5jdGlvbkNvbnRleHQ7CiAKIAlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKIAkJcmV0dXJuOwogCiAJcEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQrKzsKIAorLyogRHJpdmVyIHNob3VsZCBub3Qgc2VuZCB0cmlnZ2VyIGZyYW1lLCBpdCBzaG91bGQgYmUgc2VuZCBieSBhcHBsaWNhdGlvbiBsYXllciAqLworLyoKKwlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlCisJCSYmIChwQWQtPkNvbW1vbkNmZy5iTmVlZFNlbmRUcmlnZ2VyRnJhbWUgfHwKKwkJKCgocEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQlMjApID09IDE5KSAmJiAoIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUgfHwgIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgfHwgIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgfHwgIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8pKSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNlbmRpbmcgdHJpZ2dlciBmcmFtZSBhbmQgZW50ZXIgc2VydmljZSBwZXJpb2Qgd2hlbiBzdXBwb3J0IEFQU0RcbiIpKTsKKwkJUlRNUFNlbmROdWxsRnJhbWUocEFkLCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsIFRSVUUpOworCQlwQWQtPkNvbW1vbkNmZy5iTmVlZFNlbmRUcmlnZ2VyRnJhbWUgPSBGQUxTRTsKKwkJcEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5iSW5TZXJ2aWNlUGVyaW9kID0gVFJVRTsKKwl9Ki8KIH0KIAogLyoKQEAgLTgyOTcsMTEgKzU3ODQsOSBAQAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBSVE1QU2V0UGlnZ3lCYWNrKAotICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOIEJPT0xFQU4gICAgICAgICAgYlBpZ2d5QmFjaykKK3ZvaWQgUlRNUFNldFBpZ2d5QmFjayhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIEJPT0xFQU4gYlBpZ2d5QmFjaykKIHsKLQlUWF9MSU5LX0NGR19TVFJVQyAgVHhMaW5rQ2ZnOworCVRYX0xJTktfQ0ZHX1NUUlVDIFR4TGlua0NmZzsKIAogCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfTElOS19DRkcsICZUeExpbmtDZmcud29yZCk7CiAKQEAgLTgzMjQsMzYgKzU4MDksMzIgQEAKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLUJPT0xFQU4gUlRNUENoZWNrRW50cnlFbmFibGVBdXRvUmF0ZVN3aXRjaCgKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQlJTiBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSkKK0JPT0xFQU4gUlRNUENoZWNrRW50cnlFbmFibGVBdXRvUmF0ZVN3aXRjaChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCSAgIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSkKIHsKLQlCT09MRUFOCQlyZXN1bHQgPSBUUlVFOworCUJPT0xFQU4gcmVzdWx0ID0gVFJVRTsKIAogCXsKLQkJLy8gb25seSBhc3NvY2lhdGVkIFNUQSBjb3VudHMKLQkJaWYgKHBFbnRyeSAmJiAocEVudHJ5LT5WYWxpZEFzQ0xJKSAmJiAocEVudHJ5LT5Tc3QgPT0gU1NUX0FTU09DKSkKLQkJeworCQkvKiBvbmx5IGFzc29jaWF0ZWQgU1RBIGNvdW50cyAqLworCQlpZiAocEVudHJ5ICYmIChwRW50cnktPlZhbGlkQXNDTEkpCisJCSAgICAmJiAocEVudHJ5LT5Tc3QgPT0gU1NUX0FTU09DKSkgewogCQkJcmVzdWx0ID0gcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2g7Ci0JCX0KLQkJZWxzZQorCQl9IGVsc2UKIAkJCXJlc3VsdCA9IEZBTFNFOwogCX0KIAogCXJldHVybiByZXN1bHQ7CiB9CiAKLQotQk9PTEVBTiBSVE1QQXV0b1JhdGVTd2l0Y2hDaGVjaygKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCkKK0JPT0xFQU4gUlRNUEF1dG9SYXRlU3dpdGNoQ2hlY2soc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCkKLQkJcmV0dXJuIFRSVUU7Ci0KKwl7CisJCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCkKKwkJCXJldHVybiBUUlVFOworCX0KIAlyZXR1cm4gRkFMU0U7CiB9CiAKLQogLyoKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgpAQCAtODM2OSwxMyArNTg1MCwxNSBAQAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVUNIQVIgUlRNUFN0YUZpeGVkVHhNb2RlKAotCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCUlOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KQordTggUlRNUFN0YUZpeGVkVHhNb2RlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5KQogewotCVVDSEFSCXR4X21vZGUgPSBGSVhFRF9UWE1PREVfSFQ7CisJdTggdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKIAotCXR4X21vZGUgPSAoVUNIQVIpcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZTsKKwl7CisJCXR4X21vZGUgPQorCQkgICAgKHU4KXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuCisJCSAgICBGaXhlZFR4TW9kZTsKKwl9CiAKIAlyZXR1cm4gdHhfbW9kZTsKIH0KQEAgLTgzOTUsOSArNTg3OCw3IEBACiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIFJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoCi0JCVVDSEFSCQkJCWZpeGVkX3R4X21vZGUsCi0JCVBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KQordm9pZCBSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKHU4IGZpeGVkX3R4X21vZGUsIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSkKIHsKIAlIVFRSQU5TTUlUX1NFVFRJTkcgVHJhbnNtaXRTZXR0aW5nOwogCkBAIC04NDA5LDI2ICs1ODkwLDI0IEBACiAJVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1PREUgPSBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFOwogCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1M7CiAKLQlpZiAoZml4ZWRfdHhfbW9kZSA9PSBGSVhFRF9UWE1PREVfQ0NLKQotCXsKKwlpZiAoZml4ZWRfdHhfbW9kZSA9PSBGSVhFRF9UWE1PREVfQ0NLKSB7CiAJCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCS8vIENDSyBtb2RlIGFsbG93IE1DUyAwfjMKKwkJLyogQ0NLIG1vZGUgYWxsb3cgTUNTIDB+MyAqLwogCQlpZiAoVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA+IE1DU18zKQogCQkJVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18zOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQkvLyBPRkRNIG1vZGUgYWxsb3cgTUNTIDB+NworCQkvKiBPRkRNIG1vZGUgYWxsb3cgTUNTIDB+NyAqLwogCQlpZiAoVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA+IE1DU183KQogCQkJVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU183OwogCX0KIAotCWlmIChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID49IFRyYW5zbWl0U2V0dGluZy5maWVsZC5NT0RFKQotCXsKKwlpZiAocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBUcmFuc21pdFNldHRpbmcuZmllbGQuTU9ERSkgewogCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gVHJhbnNtaXRTZXR0aW5nLndvcmQ7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcgOiB3Y2lkLSVkLCBNT0RFPSVzLCBNQ1M9JWQgXG4iLAotCQkJCXBFbnRyeS0+QWlkLCBHZXRQaHlNb2RlKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUpLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nIDogd2NpZC0lZCwgTU9ERT0lcywgTUNTPSVkIFxuIiwKKwkJCSAgcEVudHJ5LT5BaWQsIEdldFBoeU1vZGUocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSksCisJCQkgIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUykpOwogCX0KIH0KIApAQCAtODQ0MiwzODEgKzU5MjEsMTUwIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEFzaWNTdGFCYnBUdW5pbmcoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCit2b2lkIEFzaWNTdGFCYnBUdW5pbmcoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCVVDSEFSCU9yaWdSNjZWYWx1ZSA9IDAsIFI2NjsvLywgUjY2VXBwZXJCb3VuZCA9IDB4MzAsIFI2Nkxvd2VyQm91bmQgPSAweDMwOwotCUNIQVIJUnNzaTsKKwl1OCBPcmlnUjY2VmFsdWUgPSAwLCBSNjY7CS8qLCBSNjZVcHBlckJvdW5kID0gMHgzMCwgUjY2TG93ZXJCb3VuZCA9IDB4MzA7ICovCisJY2hhciBSc3NpOwogCi0JLy8gMjg2MEMgZGlkIG5vdCBzdXBwb3J0IEZhc2UgQ0NBLCB0aGVyZWZvcmUgY2FuJ3QgdHVuZQorCS8qIDI4NjBDIGRpZCBub3Qgc3VwcG9ydCBGYXNlIENDQSwgdGhlcmVmb3JlIGNhbid0IHR1bmUgKi8KIAlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCiAJCXJldHVybjsKIAotCS8vCi0JLy8gd29yayBhcyBhIFNUQQotCS8vCi0JaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKSAgLy8gbm8gUjY2IHR1bmluZyB3aGVuIFNDQU5OSU5HCisJLyogKi8KKwkvKiB3b3JrIGFzIGEgU1RBICovCisJLyogKi8KKwlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCS8qIG5vIFI2NiB0dW5pbmcgd2hlbiBTQ0FOTklORyAqLwogCQlyZXR1cm47CiAKIAlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCi0JCSYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkKLQkJCSkKLQkJJiYgIShPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQotI2lmZGVmIFJUMjg2MAotCQkmJiAocEFkLT5iUENJY2xrT2ZmID09IEZBTFNFKSkKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQkpCi0jZW5kaWYKLQl7CisJICAgICYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkKKwkgICAgKQorCSAgICAmJiAhKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisjaWZkZWYgUlRNUF9NQUNfUENJCisJICAgICYmIChwQWQtPmJQQ0ljbGtPZmYgPT0gRkFMU0UpCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisJICAgICkgewogCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAmT3JpZ1I2NlZhbHVlKTsKIAkJUjY2ID0gT3JpZ1I2NlZhbHVlOwogCiAJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID4gMSkKLQkJCVJzc2kgPSAocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCArIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEpID4+IDE7CisJCQlSc3NpID0KKwkJCSAgICAocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCArCisJCQkgICAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEpID4+IDE7CiAJCWVsc2UKIAkJCVJzc2kgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwOwogCi0JCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCi0JCXsJLy9CRyBiYW5kCi0jaWZkZWYgUlQyODcwCi0JCQkvLyBSVDMwNzAgaXMgYSBubyBMTkEgc29sdXRpb24sIGl0IHNob3VsZCBoYXZlIGRpZmZlcmVudCBjb250cm9sIHJlZ2FyZGluZyB0byBBR0MgZ2FpbiBjb250cm9sCi0JCQkvLyBPdGhlcndpc2UsIGl0IHdpbGwgaGF2ZSBzb21lIHRocm91Z2hwdXQgc2lkZSBlZmZlY3Qgd2hlbiBsb3cgUlNTSQotCQkJaWYgKElTX1JUMzB4eChwQWQpKQotCQkJewotCQkJCWlmIChSc3NpID4gUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWSkKLQkJCQl7Ci0JCQkJCVI2NiA9IDB4MUMgKyAyKkdFVF9MTkFfR0FJTihwQWQpICsgMHgyMDsKLQkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCi0JCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkgewkvKkJHIGJhbmQgKi8KKyNpZmRlZiBSVDMweHgKKwkJCS8qIFJUMzA3MCBpcyBhIG5vIExOQSBzb2x1dGlvbiwgaXQgc2hvdWxkIGhhdmUgZGlmZmVyZW50IGNvbnRyb2wgcmVnYXJkaW5nIHRvIEFHQyBnYWluIGNvbnRyb2wgKi8KKwkJCS8qIE90aGVyd2lzZSwgaXQgd2lsbCBoYXZlIHNvbWUgdGhyb3VnaHB1dCBzaWRlIGVmZmVjdCB3aGVuIGxvdyBSU1NJICovCisKKwkJCWlmIChJU19SVDMwNzAocEFkKSB8fCBJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKQorCQkJICAgIHx8IElTX1JUMzM5MChwQWQpKSB7CisJCQkJaWYgKFJzc2kgPiBSU1NJX0ZPUl9NSURfTE9XX1NFTlNJQklMSVRZKSB7CisJCQkJCVI2NiA9CisJCQkJCSAgICAweDFDICsgMiAqIEdFVF9MTkFfR0FJTihwQWQpICsgMHgyMDsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpIHsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQKKwkJCQkJCSAgICAocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJUjY2ID0gMHgxQyArIDIgKiBHRVRfTE5BX0dBSU4ocEFkKTsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpIHsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQKKwkJCQkJCSAgICAocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQl9CiAJCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCVI2NiA9IDB4MUMgKyAyKkdFVF9MTkFfR0FJTihwQWQpOwotCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKLQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLSNlbmRpZiAvLyBSVDI4NzAgLy8KKwkJCX0gZWxzZQorI2VuZGlmIC8qIFJUMzB4eCAvLyAqLwogCQkJewotCQkJCWlmIChSc3NpID4gUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWSkKLQkJCQl7CisJCQkJaWYgKFJzc2kgPiBSU1NJX0ZPUl9NSURfTE9XX1NFTlNJQklMSVRZKSB7CiAJCQkJCVI2NiA9ICgweDJFICsgR0VUX0xOQV9HQUlOKHBBZCkpICsgMHgxMDsKLQkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCi0JCQkJCXsKLQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikgeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRAorCQkJCQkJICAgIChwQWQsIEJCUF9SNjYsIFI2Nik7CiAJCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKKwkJCQl9IGVsc2UgewogCQkJCQlSNjYgPSAweDJFICsgR0VUX0xOQV9HQUlOKHBBZCk7Ci0JCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQotCQkJCQl7Ci0JCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpIHsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQKKwkJCQkJCSAgICAocEFkLCBCQlBfUjY2LCBSNjYpOwogCQkJCQl9CiAJCQkJfQogCQkJfQotCQl9Ci0JCWVsc2UKLQkJewkvL0EgYmFuZAotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV18yMCkKLQkJCXsKLQkJCQlpZiAoUnNzaSA+IFJTU0lfRk9SX01JRF9MT1dfU0VOU0lCSUxJVFkpCi0JCQkJewotCQkJCQlSNjYgPSAweDMyICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzMgKyAweDEwOwotCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKLQkJCQkJewotCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCX0gZWxzZSB7CS8qQSBiYW5kICovCisJCQlpZiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzIwKSB7CisJCQkJaWYgKFJzc2kgPiBSU1NJX0ZPUl9NSURfTE9XX1NFTlNJQklMSVRZKSB7CisJCQkJCVI2NiA9CisJCQkJCSAgICAweDMyICsgKEdFVF9MTkFfR0FJTihwQWQpICogNSkgLyAzICsKKwkJCQkJICAgIDB4MTA7CisJCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KSB7CisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lECisJCQkJCQkgICAgKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCVI2NiA9CisJCQkJCSAgICAweDMyICsgKEdFVF9MTkFfR0FJTihwQWQpICogNSkgLyAzOworCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikgeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRAorCQkJCQkJICAgIChwQWQsIEJCUF9SNjYsIFI2Nik7CiAJCQkJCX0KIAkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJUjY2ID0gMHgzMiArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zOwotCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKLQkJCQkJewotCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCQl9IGVsc2UgeworCQkJCWlmIChSc3NpID4gUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWSkgeworCQkJCQlSNjYgPQorCQkJCQkgICAgMHgzQSArIChHRVRfTE5BX0dBSU4ocEFkKSAqIDUpIC8gMyArCisJCQkJCSAgICAweDEwOworCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikgeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRAorCQkJCQkJICAgIChwQWQsIEJCUF9SNjYsIFI2Nik7CiAJCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKFJzc2kgPiBSU1NJX0ZPUl9NSURfTE9XX1NFTlNJQklMSVRZKQotCQkJCXsKLQkJCQkJUjY2ID0gMHgzQSArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zICsgMHgxMDsKLQkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCi0JCQkJCXsKLQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCVI2NiA9IDB4M0EgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMzsKLQkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCi0JCQkJCXsKLQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCX0gZWxzZSB7CisJCQkJCVI2NiA9CisJCQkJCSAgICAweDNBICsgKEdFVF9MTkFfR0FJTihwQWQpICogNSkgLyAzOworCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikgeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRAorCQkJCQkJICAgIChwQWQsIEJCUF9SNjYsIFI2Nik7CiAJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCX0KIAotCiAJfQogfQogCi0jaWZkZWYgUlQyODYwCi1WT0lEIEFzaWNSZXNldEZyb21ETUFCdXN5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQordm9pZCBSVE1QU2V0QUdDSW5pdFZhbHVlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggQmFuZFdpZHRoKQogewotCVVJTlQzMgkJRGF0YTsKLQlCT09MRUFOCQliQ3RybCA9IEZBTFNFOworCXU4IFI2NiA9IDB4MzA7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0+ICBBc2ljUmVzZXRGcm9tRE1BQnVzeSAgISEhISEhISEhISEhISEhISEhISEhISEgXG4iKSk7CisJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkgewkvKiBCRyBiYW5kICovCisjaWZkZWYgUlQzMHh4CisJCS8qIEdhcnkgd2FzIHZlcmlmaWVkIEFtYXpvbiBBUCBhbmQgZmluZCB0aGF0IFJUMzA3eCBoYXMgQkJQX1I2NiBpbnZhbGlkIGRlZmF1bHQgdmFsdWUgKi8KIAotCS8vIEJlIHN1cmUgcmVzdG9yZSBsaW5rIGNvbnRyb2wgdmFsdWUgc28gd2UgY2FuIHdyaXRlIHJlZ2lzdGVyLgotCVJUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsKLQlpZiAoUlRNUF9URVNUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX1NFVF9QQ0lfQ0xLX09GRl9DT01NQU5EKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXNpY1Jlc2V0RnJvbURNQUJ1c3k9PT5cbiIpKTsKLQkJUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsIFJFU1RPUkVfSEFMVCk7Ci0JCVJUTVB1c2VjRGVsYXkoNjAwMCk7Ci0JCXBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOwotCQliQ3RybCA9IFRSVUU7Ci0JfQotCS8vIFJlc2V0IERNQQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgUEJGX1NZU19DVFJMLCAmRGF0YSk7Ci0JRGF0YSB8PSAweDI7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX1NZU19DVFJMLCBEYXRhKTsKLQotCS8vIEFmdGVyIFJlc2V0IERNQSwgRE1BIGluZGV4IHdpbGwgYmVjb21lIFplcm8uIFNvIERyaXZlciBuZWVkIHRvIHJlc2V0IGFsbCByaW5nIGluZGV4cyB0b28uCi0JLy8gUmVzZXQgRE1BL0NQVSByaW5nIGluZGV4Ci0JUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JLKTsKLQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkUpOwotCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19WSSk7Ci0JUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZPKTsKLQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfSENDQSk7Ci0JUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX01HTVQpOwotCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9SWCk7Ci0KLQkvLyBDbGVhciBSZXNldAotCVJUTVBfSU9fUkVBRDMyKHBBZCwgUEJGX1NZU19DVFJMLCAmRGF0YSk7Ci0JRGF0YSAmPSAweGZmZmZmZmZkOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgRGF0YSk7Ci0KLQkvLyBJZiBpbiBSYWRpbyBvZmYsIHNob3VsZCBjYWxsIFJUTVBQQ0llUG93ZXJMaW5rQ3RybCBhZ2Fpbi4KLQlpZiAoKGJDdHJsID09IFRSVUUpICYmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gRkFMU0UpKQotCQlSVE1QUENJZUxpbmtDdHJsU2V0dGluZyhwQWQsIDMpOwotCi0JUlRNUF9TRVRfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsKLQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QgfCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS0gIEFzaWNSZXNldEZyb21ETUFCdXN5ICEhISEhISEhISEhISEhISEhISEhISEhICBcbiIpKTsKLX0KLQotVk9JRCBBc2ljUmVzZXRCQlAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPiAgQXNpYyBIYXJkUmVzZXQgQkJQICAhISEhISEhISEhISEhISEhISEhISEhISBcbiIpKTsKLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgwKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4Mik7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweGMpOwotCi0JLy8gQWZ0ZXIgaGFyZC1yZXNldCBCQlAsIGluaXRpYWxpemUgYWxsIEJCUCB2YWx1ZXMuCi0JTklDUmVzdG9yZUJCUFZhbHVlKHBBZCk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tLSAgQXNpYyBIYXJkUmVzZXQgQkJQICEhISEhISEhISEhISEhISEhISEhISEhICBcbiIpKTsKLX0KLQotVk9JRCBBc2ljUmVzZXRNQUMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JVUxPTkcJCURhdGE7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0+ICBBc2ljUmVzZXRNQUMgICAhISEhIFxuIikpOwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgUEJGX1NZU19DVFJMLCAmRGF0YSk7Ci0JRGF0YSB8PSAweDQ7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX1NZU19DVFJMLCBEYXRhKTsKLQlEYXRhICY9IDB4ZmZmZmZmZmI7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX1NZU19DVFJMLCBEYXRhKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS0gIEFzaWNSZXNldE1BQyAgICEhISEgXG4iKSk7Ci19Ci0KLVZPSUQgQXNpY1Jlc2V0UEJGKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVVMT05HCQlWYWx1ZTEsIFZhbHVlMjsKLQlVTE9ORwkJRGF0YTsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhSWFFfUENOVCwgJlZhbHVlMSk7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBQQkZfREJHLCAmVmFsdWUyKTsKLQotCVZhbHVlMiAmPSAweGZmOwotCS8vIHN1bSBzaG91bGQgYmUgZXF1YWxzIHRvIDB4ZmYsIHdoaWNoIGlzIHRoZSB0b3RhbCBidWZmZXIgc2l6ZS4KLQlpZiAoKFZhbHVlMSArIFZhbHVlMikgPCAweGZmKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPiAgQXNpYyBIYXJkUmVzZXQgUEJGICEhISEgXG4iKSk7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgUEJGX1NZU19DVFJMLCAmRGF0YSk7Ci0JCURhdGEgfD0gMHg4OwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIERhdGEpOwotCQlEYXRhICY9IDB4ZmZmZmZmZjc7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgRGF0YSk7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tLSAgQXNpYyBIYXJkUmVzZXQgUEJGICEhISEgXG4iKSk7Ci0JfQotfQotI2VuZGlmIC8qIFJUMjg2MCAqLwotCi1WT0lEIFJUTVBTZXRBR0NJbml0VmFsdWUoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUNIQVIJCQlCYW5kV2lkdGgpCi17Ci0JVUNIQVIJUjY2ID0gMHgzMDsKLQotCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCi0JewkvLyBCRyBiYW5kCi0JCVI2NiA9IDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7Ci0JfQotCWVsc2UKLQl7CS8vQSBiYW5kCi0JCWlmIChCYW5kV2lkdGggPT0gQldfMjApCisJCWlmIChJU19SVDMwNzAocEFkKSB8fCBJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKQorCQkgICAgfHwgSVNfUlQzMzkwKHBBZCkpIHsKKwkJCVI2NiA9IDB4MUMgKyAyICogR0VUX0xOQV9HQUlOKHBBZCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJfSBlbHNlCisjZW5kaWYgLyogUlQzMHh4IC8vICovCiAJCXsKLQkJCVI2NiA9IChVQ0hBUikoMHgzMiArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zKTsKKwkJCVI2NiA9IDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKTsKIAkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOwogCQl9Ci0JCWVsc2UKKwl9IGVsc2UgewkJLypBIGJhbmQgKi8KIAkJewotCQkJUjY2ID0gKFVDSEFSKSgweDNBICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzMpOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCQlpZiAoQmFuZFdpZHRoID09IEJXXzIwKSB7CisJCQkJUjY2ID0KKwkJCQkgICAgKHU4KSgweDMyICsKKwkJCQkJICAgICAoR0VUX0xOQV9HQUlOKHBBZCkgKiA1KSAvIDMpOworCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJfSBlbHNlIHsKKwkJCQlSNjYgPQorCQkJCSAgICAodTgpKDB4M0EgKworCQkJCQkgICAgIChHRVRfTE5BX0dBSU4ocEFkKSAqIDUpIC8gMyk7CisJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCQl9CiAJCX0KIAl9CiAKIH0KLQotVk9JRCBBc2ljVHVybk9mZlJGQ2xrKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVDSEFSCQlDaGFubmVsKQotewotCi0JLy8gUkYgUjIgYml0IDE4ID0gMAotCVVJTlQzMgkJCVIxID0gMCwgUjIgPSAwLCBSMyA9IDA7Ci0JVUNIQVIJCQlpbmRleDsKLQlSVE1QX1JGX1JFR1MJKlJGUmVnVGFibGU7Ci0KLQkvLyBUaGUgUkYgcHJvZ3JhbW1pbmcgc2VxdWVuY2UgaXMgZGlmZmVyZW5jZSBiZXR3ZWVuIDN4eHggYW5kIDJ4eHgKLQlpZiAoSVNfUlQzMDkwKHBBZCkpCi0JewotCQlSVDMweHhMb2FkUkZTbGVlcE1vZGVTZXR1cChwQWQpOyAgLy8gYWRkIGJ5IGpvaG5saSwgIFJGIHBvd2VyIHNlcXVlbmNlIHNldHVwLCBsb2FkIFJGIHNsZWVwLW1vZGUgc2V0dXAKLQkJcmV0dXJuOwotCX0KLQotCVJGUmVnVGFibGUgPSBSRjI4NTBSZWdUYWJsZTsKLQotCXN3aXRjaCAocEFkLT5SZkljVHlwZSkKLQl7Ci0JCWNhc2UgUkZJQ18yODIwOgotCQljYXNlIFJGSUNfMjg1MDoKLQkJY2FzZSBSRklDXzI3MjA6Ci0JCWNhc2UgUkZJQ18yNzUwOgotCi0JCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMjg1MF9DSE5MOyBpbmRleCsrKQotCQkJewotCQkJCWlmIChDaGFubmVsID09IFJGUmVnVGFibGVbaW5kZXhdLkNoYW5uZWwpCi0JCQkJewotCQkJCQlSMSA9IFJGUmVnVGFibGVbaW5kZXhdLlIxICYgMHhmZmZmZGZmZjsKLQkJCQkJUjIgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMiAmIDB4ZmZmYmZmZmY7Ci0JCQkJCVIzID0gUkZSZWdUYWJsZVtpbmRleF0uUjMgJiAweGZmZjNmZmZmOwotCi0JCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIxKTsKLQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjIpOwotCi0JCQkJCS8vIFByb2dyYW0gUjFiMTMgdG8gMSwgUjMvYjE4LDE5IHRvIDAsIFIyYjE4IHRvIDAuCi0JCQkJCS8vIFNldCBSRiBSMiBiaXQxOD0wLCBSMyBiaXRbMTg6MTldPTAKLQkJCQkJLy9pZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQotCQkJCQlpZiAoMSkKLQkJCQkJewotCQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjMpOwotCi0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljVHVybk9mZlJGQ2xrIyVkKFJGPSVkLCApICwgUjI9MHglMDh4LCAgUjMgPSAweCUwOHggXG4iLAotCQkJCQkJCUNoYW5uZWwsIHBBZC0+UmZJY1R5cGUsIFIyLCBSMykpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNUdXJuT2ZmUkZDbGsjJWQoUkY9JWQsICkgLCBSMj0weCUwOHggXG4iLAotCQkJCQkJCUNoYW5uZWwsIHBBZC0+UmZJY1R5cGUsIFIyKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQl9Ci19Ci0KLQotVk9JRCBBc2ljVHVybk9uUkZDbGsoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUNIQVIJCQlDaGFubmVsKQotewotCi0JLy8gUkYgUjIgYml0IDE4ID0gMAotCVVJTlQzMgkJCVIxID0gMCwgUjIgPSAwLCBSMyA9IDA7Ci0JVUNIQVIJCQlpbmRleDsKLQlSVE1QX1JGX1JFR1MJKlJGUmVnVGFibGU7Ci0KLQkvLyBUaGUgUkYgcHJvZ3JhbW1pbmcgc2VxdWVuY2UgaXMgZGlmZmVyZW5jZSBiZXR3ZWVuIDN4eHggYW5kIDJ4eHgKLQlpZiAoSVNfUlQzMDkwKHBBZCkpCi0JCXJldHVybjsKLQotCVJGUmVnVGFibGUgPSBSRjI4NTBSZWdUYWJsZTsKLQotCXN3aXRjaCAocEFkLT5SZkljVHlwZSkKLQl7Ci0JCWNhc2UgUkZJQ18yODIwOgotCQljYXNlIFJGSUNfMjg1MDoKLQkJY2FzZSBSRklDXzI3MjA6Ci0JCWNhc2UgUkZJQ18yNzUwOgotCi0JCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMjg1MF9DSE5MOyBpbmRleCsrKQotCQkJewotCQkJCWlmIChDaGFubmVsID09IFJGUmVnVGFibGVbaW5kZXhdLkNoYW5uZWwpCi0JCQkJewotCQkJCQlSMyA9IHBBZC0+TGF0Y2hSZlJlZ3MuUjM7Ci0JCQkJCVIzICY9IDB4ZmZmM2ZmZmY7Ci0JCQkJCVIzIHw9IDB4MDAwODAwMDA7Ci0JCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIzKTsKLQotCQkJCQlSMSA9IFJGUmVnVGFibGVbaW5kZXhdLlIxOwotCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMSk7Ci0KLQkJCQkJUjIgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMjsKLQkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKLQkJCQkJewotCQkJCQkJUjIgfD0gMHg0MDAwOwkvLyBJZiBUWHBhdGggaXMgMSwgYml0IDE0ID0gMTsKLQkJCQkJfQotCi0JCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCi0JCQkJCXsKLQkJCQkJCVIyIHw9IDB4NDA7CS8vIHdyaXRlIDEgdG8gb2ZmIFJ4cGF0aC4KLQkJCQkJfQotCQkJCQllbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCi0JCQkJCXsKLQkJCQkJCVIyIHw9IDB4MjAwNDA7CS8vIHdyaXRlIDEgdG8gb2ZmIFJ4UGF0aAotCQkJCQl9Ci0JCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIyKTsKLQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1R1cm5PblJGQ2xrIyVkKFJGPSVkLCApICwgUjI9MHglMDh4XG4iLAotCQlDaGFubmVsLAotCQlwQWQtPlJmSWNUeXBlLAotCQlSMikpOwotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydF9jaGFubmVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydF9jaGFubmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM4Nzk4OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0X2NoYW5uZWwuYwpAQCAtMCwwICsxLDE3MDUgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworc3RydWN0IHJ0X2NoX2ZyZXFfbWFwIENIX0haX0lEX01BUFtdID0geworCXsxLCAyNDEyfQorCSwKKwl7MiwgMjQxN30KKwksCisJezMsIDI0MjJ9CisJLAorCXs0LCAyNDI3fQorCSwKKwl7NSwgMjQzMn0KKwksCisJezYsIDI0Mzd9CisJLAorCXs3LCAyNDQyfQorCSwKKwl7OCwgMjQ0N30KKwksCisJezksIDI0NTJ9CisJLAorCXsxMCwgMjQ1N30KKwksCisJezExLCAyNDYyfQorCSwKKwl7MTIsIDI0Njd9CisJLAorCXsxMywgMjQ3Mn0KKwksCisJezE0LCAyNDg0fQorCSwKKworCS8qICBVTklJICovCisJezM2LCA1MTgwfQorCSwKKwl7NDAsIDUyMDB9CisJLAorCXs0NCwgNTIyMH0KKwksCisJezQ4LCA1MjQwfQorCSwKKwl7NTIsIDUyNjB9CisJLAorCXs1NiwgNTI4MH0KKwksCisJezYwLCA1MzAwfQorCSwKKwl7NjQsIDUzMjB9CisJLAorCXsxNDksIDU3NDV9CisJLAorCXsxNTMsIDU3NjV9CisJLAorCXsxNTcsIDU3ODV9CisJLAorCXsxNjEsIDU4MDV9CisJLAorCXsxNjUsIDU4MjV9CisJLAorCXsxNjcsIDU4MzV9CisJLAorCXsxNjksIDU4NDV9CisJLAorCXsxNzEsIDU4NTV9CisJLAorCXsxNzMsIDU4NjV9CisJLAorCisJLyogSGlwZXJMQU4yICovCisJezEwMCwgNTUwMH0KKwksCisJezEwNCwgNTUyMH0KKwksCisJezEwOCwgNTU0MH0KKwksCisJezExMiwgNTU2MH0KKwksCisJezExNiwgNTU4MH0KKwksCisJezEyMCwgNTYwMH0KKwksCisJezEyNCwgNTYyMH0KKwksCisJezEyOCwgNTY0MH0KKwksCisJezEzMiwgNTY2MH0KKwksCisJezEzNiwgNTY4MH0KKwksCisJezE0MCwgNTcwMH0KKwksCisKKwkvKiBKYXBhbiBNTUFDICovCisJezM0LCA1MTcwfQorCSwKKwl7MzgsIDUxOTB9CisJLAorCXs0MiwgNTIxMH0KKwksCisJezQ2LCA1MjMwfQorCSwKKworCS8qICBKYXBhbiAqLworCXsxODQsIDQ5MjB9CisJLAorCXsxODgsIDQ5NDB9CisJLAorCXsxOTIsIDQ5NjB9CisJLAorCXsxOTYsIDQ5ODB9CisJLAorCisJezIwOCwgNTA0MH0KKwksCQkJLyogSmFwYW4sIG1lYW5zIEowOCAqLworCXsyMTIsIDUwNjB9CisJLAkJCS8qIEphcGFuLCBtZWFucyBKMTIgKi8KKwl7MjE2LCA1MDgwfQorCSwJCQkvKiBKYXBhbiwgbWVhbnMgSjE2ICovCit9OworCitpbnQgQ0hfSFpfSURfTUFQX05VTSA9IChzaXplb2YoQ0hfSFpfSURfTUFQKSAvIHNpemVvZihzdHJ1Y3QgcnRfY2hfZnJlcV9tYXApKTsKKworc3RydWN0IHJ0X2NoX3JlZ2lvbiBDaFJlZ2lvbltdID0geworCXsJCQkvKiBBbnRpZ3VhIGFuZCBCZXJidWRhICovCisJICJBRyIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEFyZ2VudGluYSAqLworCSAiQVIiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHs1MiwgNCwgMjQsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezE0OSwgNCwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTYxICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBBcnViYSAqLworCSAiQVciLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBBdXN0cmFsaWEgKi8KKwkgIkFVIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjQsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezE0OSwgNSwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTY1ICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBBdXN0cmlhICovCisJICJBVCIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEJhaGFtYXMgKi8KKwkgIkJTIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjQsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezE0OSwgNSwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTY1ICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBCYXJiYWRvcyAqLworCSAiQkIiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyNCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBCZXJtdWRhICovCisJICJCTSIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDI0LCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEJyYXppbCAqLworCSAiQlIiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyNCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMjQsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MTQ5LCA1LCAzMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEJlbGdpdW0gKi8KKwkgIkJFIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDE4LCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMTgsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogQnVsZ2FyaWEgKi8KKwkgIkJHIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIE9ET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIENhbmFkYSAqLworCSAiQ0EiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTQ5LCA1LCAzMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjUgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIENheW1hbiBJc0xhbmRzICovCisJICJLWSIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDI0LCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIENoaWxlICovCisJICJDTCIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxNDksIDUsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2NSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogQ2hpbmEgKi8KKwkgIkNOIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MTQ5LCA0LCAyNywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjEgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIENvbG9tYmlhICovCisJICJDTyIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAxNywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDI0LCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHsxNDksIDUsIDMwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2NSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogQ29zdGEgUmljYSAqLworCSAiQ1IiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMTcsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyNCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTQ5LCA0LCAzMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjEgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEN5cHJ1cyAqLworCSAiQ1kiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyNCwgSURPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgQk9USCwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggMTAwfjE0MCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogQ3plY2hfUmVwdWJsaWMgKi8KKwkgIkNaIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBEZW5tYXJrICovCisJICJESyIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBEb21pbmljYW4gUmVwdWJsaWMgKi8KKwkgIkRPIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAwLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDAgKi8KKwkgIHsxNDksIDQsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2MSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogRXF1YWRvciAqLworCSAiRUMiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHsxMDAsIDExLCAyNywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEVsIFNhbHZhZG9yICovCisJICJTViIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDMwLCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezE0OSwgNCwgMzYsIEJPVEgsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjUgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEZpbmxhbmQgKi8KKwkgIkZJIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEZyYW5jZSAqLworCSAiRlIiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgSURPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEdlcm1hbnkgKi8KKwkgIkRFIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEdyZWVjZSAqLworCSAiR1IiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgSURPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgT0RPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggMTAwfjE0MCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogR3VhbSAqLworCSAiR1UiLAorCSBDRSwKKwkgeworCSAgezEsIDExLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTEgKi8KKwkgIHszNiwgNCwgMTcsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyNCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MTQ5LCA1LCAzMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjUgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEd1YXRlbWFsYSAqLworCSAiR1QiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMTcsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyNCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTQ5LCA0LCAzMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjEgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEhhaXRpICovCisJICJIVCIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAxNywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDI0LCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxNDksIDQsIDMwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2MSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogSG9uZHVyYXMgKi8KKwkgIkhOIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MTQ5LCA0LCAyNywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjEgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEhvbmcgS29uZyAqLworCSAiSEsiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTQ5LCA0LCAzMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjEgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEh1bmdhcnkgKi8KKwkgIkhVIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBJY2VsYW5kICovCisJICJJUyIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBJbmRpYSAqLworCSAiSU4iLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHsxNDksIDQsIDI0LCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2MSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogSW5kb25lc2lhICovCisJICJJRCIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezE0OSwgNCwgMjcsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTYxICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBJcmVsYW5kICovCisJICJJRSIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBPRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBJc3JhZWwgKi8KKwkgIklMIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAzLCAyMCwgSURPUiwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MyAqLworCSAgezQsIDYsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggNH45ICovCisJICB7MTAsIDQsIDIwLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMTB+MTMgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEl0YWx5ICovCisJICJJVCIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBPRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBKYXBhbiAqLworCSAiSlAiLAorCSBKQVAsCisJIHsKKwkgIHsxLCAxNCwgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjE0ICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEpvcmRhbiAqLworCSAiSk8iLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgSURPUiwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezE0OSwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTYxICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBMYXR2aWEgKi8KKwkgIkxWIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIExpZWNodGVuc3RlaW4gKi8KKwkgIkxJIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBMaXRodWFuaWEgKi8KKwkgIkxUIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEx1eGVtYnVyZyAqLworCSAiTFUiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgSURPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgQk9USCwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggMTAwfjE0MCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogTWFsYXlzaWEgKi8KKwkgIk1ZIiwKKwkgQ0UsCisJIHsKKwkgIHszNiwgNCwgMjMsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTQ5LCA1LCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjUgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIE1hbHRhICovCisJICJNVCIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBNYXJvY2NvICovCisJICJNQSIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyNCwgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBNZXhpY28gKi8KKwkgIk1YIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjQsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezE0OSwgNSwgMzAsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTY1ICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBOZXRoZXJsYW5kcyAqLworCSAiTkwiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyNCwgSURPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgQk9USCwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggMTAwfjE0MCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogTmV3IFplYWxhbmQgKi8KKwkgIk5aIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDI0LCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjQsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezE0OSwgNCwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTYxICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBOb3J3YXkgKi8KKwkgIk5PIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDI0LCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjQsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjEgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIFBlcnUgKi8KKwkgIlBFIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MTQ5LCA0LCAyNywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjEgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIFBvcnR1Z2FsICovCisJICJQVCIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBQb2xhbmQgKi8KKwkgIlBMIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIFJvbWFuaWEgKi8KKwkgIlJPIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIFJ1c3NpYSAqLworCSAiUlUiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHsxNDksIDQsIDIwLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2MSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogU2F1ZGkgQXJhYmlhICovCisJICJTQSIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxNDksIDQsIDIzLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2MSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogU2VyYmlhX2FuZF9Nb250ZW5lZ3JvICovCisJICJDUyIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogU2luZ2Fwb3JlICovCisJICJTRyIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxNDksIDQsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2MSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogU2xvdmFraWEgKi8KKwkgIlNLIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIFNsb3ZlbmlhICovCisJICJTSSIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogU291dGggQWZyaWNhICovCisJICJaQSIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgQk9USCwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggMTAwfjE0MCAqLworCSAgezE0OSwgNCwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTYxICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBTb3V0aCBLb3JlYSAqLworCSAiS1IiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCA4LCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xMjggKi8KKwkgIHsxNDksIDQsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2MSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogU3BhaW4gKi8KKwkgIkVTIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDE3LCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIFN3ZWRlbiAqLworCSAiU0UiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgSURPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgQk9USCwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggMTAwfjE0MCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogU3dpdHplcmxhbmQgKi8KKwkgIkNIIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgSURPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIFRhaXdhbiAqLworCSAiVFciLAorCSBDRSwKKwkgeworCSAgezEsIDExLCAzMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTEgKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogVHVya2V5ICovCisJICJUUiIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMSAqLworCSAgezM2LCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIFVLICovCisJICJHQiIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMSAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBVa3JhaW5lICovCisJICJVQSIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogVW5pdGVkX0FyYWJfRW1pcmF0ZXMgKi8KKwkgIkFFIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjExICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBVbml0ZWRfU3RhdGVzICovCisJICJVUyIsCisJIENFLAorCSB7CisJICB7MSwgMTEsIDMwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMSAqLworCSAgezM2LCA0LCAxNywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7NTIsIDQsIDI0LCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MTQ5LCA1LCAzMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjUgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIFZlbmV6dWVsYSAqLworCSAiVkUiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTEgKi8KKwkgIHsxNDksIDQsIDI3LCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2MSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogRGVmYXVsdCAqLworCSAiIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMSwgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjExICovCisJICB7MzYsIDQsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHs1MiwgNCwgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTAwfjE0MCAqLworCSAgezE0OSwgNSwgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTY1ICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcnRfY2hfcmVnaW9uICpHZXRDaFJlZ2lvbih1OCAqQ250cnlDb2RlKQoreworCWludCBsb29wID0gMDsKKwlzdHJ1Y3QgcnRfY2hfcmVnaW9uICpwQ2hSZWdpb24gPSBOVUxMOworCisJd2hpbGUgKHN0cmNtcCgoY2hhciAqKUNoUmVnaW9uW2xvb3BdLkNvdW50UmVnLCAiIikgIT0gMCkgeworCQlpZiAoc3RybmNtcAorCQkgICAgKChjaGFyICopQ2hSZWdpb25bbG9vcF0uQ291bnRSZWcsIChjaGFyICopQ250cnlDb2RlLAorCQkgICAgIDIpID09IDApIHsKKwkJCXBDaFJlZ2lvbiA9ICZDaFJlZ2lvbltsb29wXTsKKwkJCWJyZWFrOworCQl9CisJCWxvb3ArKzsKKwl9CisKKwlpZiAocENoUmVnaW9uID09IE5VTEwpCisJCXBDaFJlZ2lvbiA9ICZDaFJlZ2lvbltsb29wXTsKKwlyZXR1cm4gcENoUmVnaW9uOworfQorCitzdGF0aWMgdm9pZCBDaEJhbmRDaGVjayh1OCBQaHlNb2RlLCB1OCAqcENoVHlwZSkKK3sKKwlzd2l0Y2ggKFBoeU1vZGUpIHsKKwljYXNlIFBIWV8xMUE6CisJY2FzZSBQSFlfMTFBTl9NSVhFRDoKKwkJKnBDaFR5cGUgPSBCQU5EXzVHOworCQlicmVhazsKKwljYXNlIFBIWV8xMUFCR19NSVhFRDoKKwljYXNlIFBIWV8xMUFHTl9NSVhFRDoKKwljYXNlIFBIWV8xMUFCR05fTUlYRUQ6CisJCSpwQ2hUeXBlID0gQkFORF9CT1RIOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCSpwQ2hUeXBlID0gQkFORF8yNEc7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHU4IEZpbGxDaExpc3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJc3RydWN0IHJ0X2NoX2Rlc3AgKnBDaERlc3AsCisJCQl1OCBPZmZzZXQsIHU4IGluY3JlbWVudCkKK3sKKwlpbnQgaSwgaiwgbDsKKwl1OCBjaGFubmVsOworCisJaiA9IE9mZnNldDsKKwlmb3IgKGkgPSAwOyBpIDwgcENoRGVzcC0+TnVtT2ZDaDsgaSsrKSB7CisJCWNoYW5uZWwgPSBwQ2hEZXNwLT5GaXJzdENoYW5uZWwgKyBpICogaW5jcmVtZW50OworCQlmb3IgKGwgPSAwOyBsIDwgTUFYX05VTV9PRl9DSEFOTkVMUzsgbCsrKSB7CisJCQlpZiAoY2hhbm5lbCA9PSBwQWQtPlR4UG93ZXJbbF0uQ2hhbm5lbCkgeworCQkJCXBBZC0+Q2hhbm5lbExpc3Rbal0uUG93ZXIgPQorCQkJCSAgICBwQWQtPlR4UG93ZXJbbF0uUG93ZXI7CisJCQkJcEFkLT5DaGFubmVsTGlzdFtqXS5Qb3dlcjIgPQorCQkJCSAgICBwQWQtPlR4UG93ZXJbbF0uUG93ZXIyOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChsID09IE1BWF9OVU1fT0ZfQ0hBTk5FTFMpCisJCQljb250aW51ZTsKKworCQlwQWQtPkNoYW5uZWxMaXN0W2pdLkNoYW5uZWwgPQorCQkgICAgcENoRGVzcC0+Rmlyc3RDaGFubmVsICsgaSAqIGluY3JlbWVudDsKKwkJcEFkLT5DaGFubmVsTGlzdFtqXS5NYXhUeFB3ciA9IHBDaERlc3AtPk1heFR4UHdyOworCQlwQWQtPkNoYW5uZWxMaXN0W2pdLkRmc1JlcSA9IHBDaERlc3AtPkRmc1JlcTsKKwkJaisrOworCX0KKwlwQWQtPkNoYW5uZWxMaXN0TnVtID0gajsKKworCXJldHVybiBqOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgQ3JlYXRlQ2hMaXN0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQlzdHJ1Y3QgcnRfY2hfcmVnaW9uICpwQ2hSZWdpb24sIHU4IEdlb2dyYXBoeSkKK3sKKwlpbnQgaTsKKwl1OCBvZmZzZXQgPSAwOworCXN0cnVjdCBydF9jaF9kZXNwICpwQ2hEZXNwOworCXU4IENoVHlwZTsKKwl1OCBpbmNyZW1lbnQ7CisKKwlpZiAocENoUmVnaW9uID09IE5VTEwpCisJCXJldHVybjsKKworCUNoQmFuZENoZWNrKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUsICZDaFR5cGUpOworCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJcENoRGVzcCA9ICZwQ2hSZWdpb24tPkNoRGVzcFtpXTsKKwkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA9PSAwKQorCQkJYnJlYWs7CisKKwkJaWYgKENoVHlwZSA9PSBCQU5EXzVHKSB7CisJCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsIDw9IDE0KQorCQkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKENoVHlwZSA9PSBCQU5EXzI0RykgeworCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA+IDE0KQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKChwQ2hEZXNwLT5HZW9ncmFwaHkgPT0gQk9USCkKKwkJICAgIHx8IChwQ2hEZXNwLT5HZW9ncmFwaHkgPT0gR2VvZ3JhcGh5KSkgeworCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA+IDE0KQorCQkJCWluY3JlbWVudCA9IDQ7CisJCQllbHNlCisJCQkJaW5jcmVtZW50ID0gMTsKKwkJCW9mZnNldCA9IEZpbGxDaExpc3QocEFkLCBwQ2hEZXNwLCBvZmZzZXQsIGluY3JlbWVudCk7CisJCX0KKwl9Cit9CisKK3ZvaWQgQnVpbGRDaGFubmVsTGlzdEV4KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlzdHJ1Y3QgcnRfY2hfcmVnaW9uICpwQ2hSZWc7CisKKwlwQ2hSZWcgPSBHZXRDaFJlZ2lvbihwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSk7CisJQ3JlYXRlQ2hMaXN0KHBBZCwgcENoUmVnLCBwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkpOworfQorCit2b2lkIEJ1aWxkQmVhY29uQ2hMaXN0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIHU4ICpwQnVmLCB1bnNpZ25lZCBsb25nICpwQnVmTGVuKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgVG1wTGVuOworCXN0cnVjdCBydF9jaF9yZWdpb24gKnBDaFJlZ2lvbjsKKwlzdHJ1Y3QgcnRfY2hfZGVzcCAqcENoRGVzcDsKKwl1OCBDaFR5cGU7CisKKwlwQ2hSZWdpb24gPSBHZXRDaFJlZ2lvbihwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSk7CisKKwlpZiAocENoUmVnaW9uID09IE5VTEwpCisJCXJldHVybjsKKworCUNoQmFuZENoZWNrKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUsICZDaFR5cGUpOworCSpwQnVmTGVuID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCXBDaERlc3AgPSAmcENoUmVnaW9uLT5DaERlc3BbaV07CisJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPT0gMCkKKwkJCWJyZWFrOworCisJCWlmIChDaFR5cGUgPT0gQkFORF81RykgeworCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA8PSAxNCkKKwkJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChDaFR5cGUgPT0gQkFORF8yNEcpIHsKKwkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPiAxNCkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgocENoRGVzcC0+R2VvZ3JhcGh5ID09IEJPVEgpCisJCSAgICB8fCAocENoRGVzcC0+R2VvZ3JhcGh5ID09IHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSkpIHsKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBCdWYgKyAqcEJ1ZkxlbiwgJlRtcExlbiwKKwkJCQkJICAxLCAmcENoRGVzcC0+Rmlyc3RDaGFubmVsLAorCQkJCQkgIDEsICZwQ2hEZXNwLT5OdW1PZkNoLAorCQkJCQkgIDEsICZwQ2hEZXNwLT5NYXhUeFB3ciwgRU5EX09GX0FSR1MpOworCQkJKnBCdWZMZW4gKz0gVG1wTGVuOworCQl9CisJfQorfQorCitzdGF0aWMgQk9PTEVBTiBJc1ZhbGlkQ2hhbm5lbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IGNoYW5uZWwpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKSB7CisJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwgPT0gY2hhbm5lbCkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IHBBZC0+Q2hhbm5lbExpc3ROdW0pCisJCXJldHVybiBGQUxTRTsKKwllbHNlCisJCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgdTggR2V0RXh0Q2godTggQ2hhbm5lbCwgdTggRGlyZWN0aW9uKQoreworCWNoYXIgRXh0Q2g7CisKKwlpZiAoRGlyZWN0aW9uID09IEVYVENIQV9BQk9WRSkKKwkJRXh0Q2ggPSBDaGFubmVsICsgNDsKKwllbHNlCisJCUV4dENoID0gKENoYW5uZWwgLSA0KSA+IDAgPyAoQ2hhbm5lbCAtIDQpIDogMDsKKworCXJldHVybiBFeHRDaDsKK30KKwordm9pZCBOX0NoYW5uZWxDaGVjayhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJLyp1OCBDaGFubmVsTnVtID0gcEFkLT5DaGFubmVsTGlzdE51bTsgKi8KKwl1OCBDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKworCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQorCSAgICAmJiAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKSkgeworCQlpZiAoQ2hhbm5lbCA+IDE0KSB7CisJCQlpZiAoKENoYW5uZWwgPT0gMzYpIHx8IChDaGFubmVsID09IDQ0KQorCQkJICAgIHx8IChDaGFubmVsID09IDUyKSB8fCAoQ2hhbm5lbCA9PSA2MCkKKwkJCSAgICB8fCAoQ2hhbm5lbCA9PSAxMDApIHx8IChDaGFubmVsID09IDEwOCkKKwkJCSAgICB8fCAoQ2hhbm5lbCA9PSAxMTYpIHx8IChDaGFubmVsID09IDEyNCkKKwkJCSAgICB8fCAoQ2hhbm5lbCA9PSAxMzIpIHx8IChDaGFubmVsID09IDE0OSkKKwkJCSAgICB8fCAoQ2hhbm5lbCA9PSAxNTcpKSB7CisJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9CisJCQkJICAgIEVYVENIQV9BQk9WRTsKKwkJCX0gZWxzZSBpZiAoKENoYW5uZWwgPT0gNDApIHx8IChDaGFubmVsID09IDQ4KQorCQkJCSAgIHx8IChDaGFubmVsID09IDU2KSB8fCAoQ2hhbm5lbCA9PSA2NCkKKwkJCQkgICB8fCAoQ2hhbm5lbCA9PSAxMDQpIHx8IChDaGFubmVsID09IDExMikKKwkJCQkgICB8fCAoQ2hhbm5lbCA9PSAxMjApIHx8IChDaGFubmVsID09IDEyOCkKKwkJCQkgICB8fCAoQ2hhbm5lbCA9PSAxMzYpIHx8IChDaGFubmVsID09IDE1MykKKwkJCQkgICB8fCAoQ2hhbm5lbCA9PSAxNjEpKSB7CisJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9CisJCQkJICAgIEVYVENIQV9CRUxPVzsKKwkJCX0gZWxzZSB7CisJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID0KKwkJCQkgICAgQldfMjA7CisJCQl9CisJCX0gZWxzZSB7CisJCQlkbyB7CisJCQkJdTggRXh0Q2g7CisJCQkJdTggRGlyID0KKwkJCQkgICAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLgorCQkJCSAgICBFWFRDSEE7CisJCQkJRXh0Q2ggPSBHZXRFeHRDaChDaGFubmVsLCBEaXIpOworCQkJCWlmIChJc1ZhbGlkQ2hhbm5lbChwQWQsIEV4dENoKSkKKwkJCQkJYnJlYWs7CisKKwkJCQlEaXIgPQorCQkJCSAgICAoRGlyID09CisJCQkJICAgICBFWFRDSEFfQUJPVkUpID8gRVhUQ0hBX0JFTE9XIDoKKwkJCQkgICAgRVhUQ0hBX0FCT1ZFOworCQkJCUV4dENoID0gR2V0RXh0Q2goQ2hhbm5lbCwgRGlyKTsKKwkJCQlpZiAoSXNWYWxpZENoYW5uZWwocEFkLCBFeHRDaCkpIHsKKwkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLgorCQkJCQkgICAgRVhUQ0hBID0gRGlyOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID0KKwkJCQkgICAgQldfMjA7CisJCQl9IHdoaWxlIChGQUxTRSk7CisKKwkJCWlmIChDaGFubmVsID09IDE0KSB7CisJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID0KKwkJCQkgICAgQldfMjA7CisJCQkJLypwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX05PTkU7IC8vIFdlIGRpZG4ndCBzZXQgdGhlIEV4dENoIGFzIE5PTkUgZHVlIHRvIGl0J2xsIHNldCBpbiBSVE1QU2V0SFQoKSAqLworCQkJfQorCQl9CisJfQorCit9CisKK3ZvaWQgTl9TZXRDZW5DaChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCkgeworCQlpZiAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9PQorCQkgICAgRVhUQ0hBX0FCT1ZFKSB7CisJCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9CisJCQkgICAgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCArIDI7CisJCX0gZWxzZSB7CisJCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9PSAxNCkKKwkJCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9CisJCQkJICAgIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgLSAxOworCQkJZWxzZQorCQkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0KKwkJCQkgICAgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCAtIDI7CisJCX0KKwl9IGVsc2UgeworCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJfQorfQorCit1OCBHZXRDdW50cnlNYXhUeFB3cihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IGNoYW5uZWwpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykgeworCQlpZiAocEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsID09IGNoYW5uZWwpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA9PSBwQWQtPkNoYW5uZWxMaXN0TnVtKQorCQlyZXR1cm4gMHhmZjsKKwllbHNlCisJCXJldHVybiBwQWQtPkNoYW5uZWxMaXN0W2ldLk1heFR4UHdyOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRfcmYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0X3JmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE5MTIxZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0X3JmLmMKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnRfcmYuYworCisJQWJzdHJhY3Q6CisJUmFsaW5rIFdpcmVsZXNzIGRyaXZlciBSRiByZWxhdGVkIGZ1bmN0aW9ucworCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKwktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworI2lmZGVmIFJUTVBfUkZfUldfU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246IFdyaXRlIFJUMzB4eCBSRiByZWdpc3RlciB0aHJvdWdoIE1BQworCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IFJUMzB4eFdyaXRlUkZSZWdpc3RlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICB1OCByZWdJRCwgdTggdmFsdWUpCit7CisJUkZfQ1NSX0NGR19TVFJVQyByZmNzcjsKKwl1MzIgaSA9IDA7CisKKwlkbyB7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgUkZfQ1NSX0NGRywgJnJmY3NyLndvcmQpOworCisJCWlmICghcmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0spCisJCQlicmVhazsKKwkJaSsrOworCX0KKwl3aGlsZSAoKGkgPCBSRVRSWV9MSU1JVCkKKwkgICAgICAgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKTsKKworCWlmICgoaSA9PSBSRVRSWV9MSU1JVCkKKwkgICAgfHwgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpIHsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAorCQkJICAgICAoIlJldHJ5IGNvdW50IGV4aGF1c3RlZCBvciBkZXZpY2UgcmVtb3ZlZCFcbiIpKTsKKwkJcmV0dXJuIFNUQVRVU19VTlNVQ0NFU1NGVUw7CisJfQorCisJcmZjc3IuZmllbGQuUkZfQ1NSX1dSID0gMTsKKwlyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9IDE7CisJcmZjc3IuZmllbGQuVEVTVENTUl9SRkFDQ19SRUdOVU0gPSByZWdJRDsKKwlyZmNzci5maWVsZC5SRl9DU1JfREFUQSA9IHZhbHVlOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgUkZfQ1NSX0NGRywgcmZjc3Iud29yZCk7CisKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246IFJlYWQgUlQzMHh4IFJGIHJlZ2lzdGVyIHRocm91Z2ggTUFDCisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgUlQzMHh4UmVhZFJGUmVnaXN0ZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSB1OCByZWdJRCwgdTggKnBWYWx1ZSkKK3sKKwlSRl9DU1JfQ0ZHX1NUUlVDIHJmY3NyOworCXUzMiBpID0gMCwgayA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0JVU1lfQ09VTlQ7IGkrKykgeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFJGX0NTUl9DRkcsICZyZmNzci53b3JkKTsKKworCQlpZiAocmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0sgPT0gQlVTWSkgeworCQkJY29udGludWU7CisJCX0KKwkJcmZjc3Iud29yZCA9IDA7CisJCXJmY3NyLmZpZWxkLlJGX0NTUl9XUiA9IDA7CisJCXJmY3NyLmZpZWxkLlJGX0NTUl9LSUNLID0gMTsKKwkJcmZjc3IuZmllbGQuVEVTVENTUl9SRkFDQ19SRUdOVU0gPSByZWdJRDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUkZfQ1NSX0NGRywgcmZjc3Iud29yZCk7CisJCWZvciAoayA9IDA7IGsgPCBNQVhfQlVTWV9DT1VOVDsgaysrKSB7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFJGX0NTUl9DRkcsICZyZmNzci53b3JkKTsKKworCQkJaWYgKHJmY3NyLmZpZWxkLlJGX0NTUl9LSUNLID09IElETEUpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKChyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9PSBJRExFKSAmJgorCQkgICAgKHJmY3NyLmZpZWxkLlRFU1RDU1JfUkZBQ0NfUkVHTlVNID09IHJlZ0lEKSkgeworCQkJKnBWYWx1ZSA9ICh1OClyZmNzci5maWVsZC5SRl9DU1JfREFUQTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9PSBCVVNZKSB7CisJCURCR1BSSU5UX0VSUigoIlJGIHJlYWQgUiVkPTB4JXggZmFpbCwgaVslZF0sIGtbJWRdXG4iLCByZWdJRCwKKwkJCSAgICAgIHJmY3NyLndvcmQsIGksIGspKTsKKwkJcmV0dXJuIFNUQVRVU19VTlNVQ0NFU1NGVUw7CisJfQorCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCit2b2lkIE5JQ0luaXRSRlJlZ2lzdGVycyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJaWYgKHBBZC0+Y2hpcE9wcy5Bc2ljUmZJbml0KQorCQlwQWQtPmNoaXBPcHMuQXNpY1JmSW5pdChwQWQpOworfQorCit2b2lkIFJ0bXBDaGlwT3BzUkZIb29rKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlzdHJ1Y3QgcnRfcnRtcF9jaGlwX29wICpwQ2hpcE9wcyA9ICZwQWQtPmNoaXBPcHM7CisKKwlwQ2hpcE9wcy0+cFJGUmVnVGFibGUgPSBOVUxMOworCXBDaGlwT3BzLT5Bc2ljUmZJbml0ID0gTlVMTDsKKwlwQ2hpcE9wcy0+QXNpY1JmVHVybk9uID0gTlVMTDsKKwlwQ2hpcE9wcy0+QXNpY1JmVHVybk9mZiA9IE5VTEw7CisJcENoaXBPcHMtPkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlID0gTlVMTDsKKwlwQ2hpcE9wcy0+QXNpY0hhbHRBY3Rpb24gPSBOVUxMOworCS8qIFdlIGRlcGVuZHMgb24gUmZJQ1R5cGUgYW5kIE1BQ1ZlcnNpb24gdG8gYXNzaWduIHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbiBjYWxsYmFja3MuICovCisKKyNpZmRlZiBSVDMweHgKKwlpZiAoSVNfUlQzMHh4KHBBZCkpIHsKKwkJcENoaXBPcHMtPnBSRlJlZ1RhYmxlID0gUlQzMHh4X1JGUmVnVGFibGU7CisJCXBDaGlwT3BzLT5Bc2ljSGFsdEFjdGlvbiA9IFJUMzB4eEhhbHRBY3Rpb247CisjaWZkZWYgUlQzMDcwCisJCWlmICgoSVNfUlQzMDcwKHBBZCkgfHwgSVNfUlQzMDcxKHBBZCkpCisJCSAgICAmJiAocEFkLT5pbmZUeXBlID09IFJUTVBfREVWX0lORl9VU0IpKSB7CisJCQlwQ2hpcE9wcy0+QXNpY1JmSW5pdCA9IE5JQ0luaXRSVDMwNzBSRlJlZ2lzdGVyczsKKwkJCWlmIChJU19SVDMwNzEocEFkKSkgeworCQkJCXBDaGlwT3BzLT5Bc2ljUmZUdXJuT2ZmID0KKwkJCQkgICAgUlQzMHh4TG9hZFJGU2xlZXBNb2RlU2V0dXA7CisJCQkJcENoaXBPcHMtPkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlID0KKwkJCQkgICAgUlQzMHh4UmV2ZXJzZVJGU2xlZXBNb2RlU2V0dXA7CisJCQl9CisJCX0KKyNlbmRpZiAvKiBSVDMwNzAgLy8gKi8KKyNpZmRlZiBSVDMwOTAKKwkJaWYgKElTX1JUMzA5MChwQWQpICYmIChwQWQtPmluZlR5cGUgPT0gUlRNUF9ERVZfSU5GX1BDSSkpIHsKKwkJCXBDaGlwT3BzLT5Bc2ljUmZUdXJuT2ZmID0gUlQzMHh4TG9hZFJGU2xlZXBNb2RlU2V0dXA7CisJCQlwQ2hpcE9wcy0+QXNpY1JmSW5pdCA9IE5JQ0luaXRSVDMwOTBSRlJlZ2lzdGVyczsKKwkJCXBDaGlwT3BzLT5Bc2ljUmV2ZXJzZVJmRnJvbVNsZWVwTW9kZSA9CisJCQkgICAgUlQzMHh4UmV2ZXJzZVJGU2xlZXBNb2RlU2V0dXA7CisJCX0KKyNlbmRpZiAvKiBSVDMwOTAgLy8gKi8KKwl9CisjZW5kaWYgLyogUlQzMHh4IC8vICovCit9CisKKyNlbmRpZiAvKiBSVE1QX1JGX1JXX1NVUFBPUlQgLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF9pbml0LmMKaW5kZXggMjBjMmNlMi4uMjFhOTVmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF9pbml0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF9pbml0LmMKQEAgLTMzLDE3MiArMzMsMTExIEBACiAJUmV2aXNpb24gSGlzdG9yeToKIAlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKIAktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlQYXVsIExpbiAgICAyMDAyLTA4LTAxICAgIGNyZWF0ZWQKLSAgICBKb2huIENoYW5nICAyMDA0LTA4LTIwICAgIFJUMjU2MS8yNjYxIHVzZSBzY2F0dGVyLWdhdGhlciBzY2hlbWUKLSAgICBKYW4gTGVlICAyMDA2LTA5LTE1ICAgIFJUMjg2MC4gQ2hhbmdlIGZvciA4MDIuMTFuICwgRUVQUk9NLCBMZWQsIEJBLCBIVC4KICovCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0jaWZkZWYgUlQyODYwCi0jaW5jbHVkZSAiZmlybXdhcmUuaCIKLSNpbmNsdWRlIDxsaW51eC9iaXRyZXYuaD4KLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotLyogTmV3IGZpcm13YXJlIGhhbmRsZXMgYm90aCBSVDI4NzAgYW5kIFJUMzA3MC4gKi8KLSNpbmNsdWRlICIuLi8uLi9ydDMwNzAvZmlybXdhcmUuaCIKLSNlbmRpZgogCi1VQ0hBUiAgICBCSVQ4W10gPSB7MHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MH07Ci1VTE9ORyAgICBCSVQzMltdID0gezB4MDAwMDAwMDEsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDgsCi0JCQkJCTB4MDAwMDAwMTAsIDB4MDAwMDAwMjAsIDB4MDAwMDAwNDAsIDB4MDAwMDAwODAsCi0JCQkJCTB4MDAwMDAxMDAsIDB4MDAwMDAyMDAsIDB4MDAwMDA0MDAsIDB4MDAwMDA4MDAsCi0JCQkJCTB4MDAwMDEwMDAsIDB4MDAwMDIwMDAsIDB4MDAwMDQwMDAsIDB4MDAwMDgwMDAsCi0JCQkJCTB4MDAwMTAwMDAsIDB4MDAwMjAwMDAsIDB4MDAwNDAwMDAsIDB4MDAwODAwMDAsCi0JCQkJCTB4MDAxMDAwMDAsIDB4MDAyMDAwMDAsIDB4MDA0MDAwMDAsIDB4MDA4MDAwMDAsCi0JCQkJCTB4MDEwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDQwMDAwMDAsIDB4MDgwMDAwMDAsCi0JCQkJCTB4MTAwMDAwMDAsIDB4MjAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4ODAwMDAwMDB9OwordTggQklUOFtdID0geyAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwIH07CitjaGFyICpDaXBoZXJOYW1lW10gPQorICAgIHsgIm5vbmUiLCAid2VwNjQiLCAid2VwMTI4IiwgIlRLSVAiLCAiQUVTIiwgIkNLSVA2NCIsICJDS0lQMTI4IiB9OwogCi1jaGFyKiAgIENpcGhlck5hbWVbXSA9IHsibm9uZSIsIndlcDY0Iiwid2VwMTI4IiwiVEtJUCIsIkFFUyIsIkNLSVA2NCIsIkNLSVAxMjgifTsKLQotLy8KLS8vIEJCUCByZWdpc3RlciBpbml0aWFsaXphdGlvbiBzZXQKLS8vCi1SRUdfUEFJUiAgIEJCUFJlZ1RhYmxlW10gPSB7Ci0Je0JCUF9SNjUsCQkweDJDfSwJCS8vIGZpeCByc3NpIGlzc3VlCi0Je0JCUF9SNjYsCQkweDM4fSwJLy8gQWxzbyBzZXQgdGhpcyBkZWZhdWx0IHZhbHVlIHRvIHBBZC0+QmJwVHVuaW5nLlI2NkN1cnJlbnRWYWx1ZSBhdCBpbml0aWFsCi0Je0JCUF9SNjksCQkweDEyfSwKLQl7QkJQX1I3MCwJCTB4YX0sCS8vIEJCUF9SNzAgd2lsbCBjaGFuZ2UgdG8gMHg4IGluIEFwU3RhcnRVcCBhbmQgTGlua1VwIGZvciBydDI4NjBDLCBvdGhlcndpc2UgdmFsdWUgaXMgMHhhCi0Je0JCUF9SNzMsCQkweDEwfSwKLQl7QkJQX1I4MSwJCTB4Mzd9LAotCXtCQlBfUjgyLAkJMHg2Mn0sCi0Je0JCUF9SODMsCQkweDZBfSwKLQl7QkJQX1I4NCwJCTB4OTl9LAkvLyAweDE5IGlzIGZvciBydDI4NjBFIGFuZCBhZnRlci4gVGhpcyBpcyBmb3IgZXh0ZW5zaW9uIGNoYW5uZWwgb3ZlcmxhcHBpbmcgSU9ULiAweDk5IGlzIGZvciBydDI4NjBEIGFuZCBiZWZvcmUKLQl7QkJQX1I4NiwJCTB4MDB9LAkvLyBtaWRkbGUgcmFuZ2UgaXNzdWUsIFJvcnkgQDIwMDgtMDEtMjgKLQl7QkJQX1I5MSwJCTB4MDR9LAkvLyBtaWRkbGUgcmFuZ2UgaXNzdWUsIFJvcnkgQDIwMDgtMDEtMjgKLQl7QkJQX1I5MiwJCTB4MDB9LAkvLyBtaWRkbGUgcmFuZ2UgaXNzdWUsIFJvcnkgQDIwMDgtMDEtMjgKLQl7QkJQX1IxMDMsICAJMHgwMH0sIAkvLyBuZWFyIHJhbmdlIGhpZ2gtcG93ZXIgaXNzdWUsIHJlcXVlc3RlZCBmcm9tIEdhcnkgQDIwMDgtMDUyOAotCXtCQlBfUjEwNSwJCTB4MDV9LAkvLyAweDA1IGlzIGZvciBydDI4NjBFIHRvIHR1cm4gb24gRkVRIGNvbnRyb2wuIEl0IGlzIHNhZmUgZm9yIHJ0Mjg2MEQgYW5kIGJlZm9yZSwgYmVjYXVzZSBCaXQgNzoyIGFyZSByZXNlcnZlZCBpbiBydDI4NjBEIGFuZCBiZWZvcmUuCisvKiAqLworLyogQkJQIHJlZ2lzdGVyIGluaXRpYWxpemF0aW9uIHNldCAqLworLyogKi8KK3N0cnVjdCBydF9yZWdfcGFpciBCQlBSZWdUYWJsZVtdID0geworCXtCQlBfUjY1LCAweDJDfSwJLyogZml4IHJzc2kgaXNzdWUgKi8KKwl7QkJQX1I2NiwgMHgzOH0sCS8qIEFsc28gc2V0IHRoaXMgZGVmYXVsdCB2YWx1ZSB0byBwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUgYXQgaW5pdGlhbCAqLworCXtCQlBfUjY5LCAweDEyfSwKKwl7QkJQX1I3MCwgMHhhfSwJCS8qIEJCUF9SNzAgd2lsbCBjaGFuZ2UgdG8gMHg4IGluIEFwU3RhcnRVcCBhbmQgTGlua1VwIGZvciBydDI4NjBDLCBvdGhlcndpc2UgdmFsdWUgaXMgMHhhICovCisJe0JCUF9SNzMsIDB4MTB9LAorCXtCQlBfUjgxLCAweDM3fSwKKwl7QkJQX1I4MiwgMHg2Mn0sCisJe0JCUF9SODMsIDB4NkF9LAorCXtCQlBfUjg0LCAweDk5fSwJLyogMHgxOSBpcyBmb3IgcnQyODYwRSBhbmQgYWZ0ZXIuIFRoaXMgaXMgZm9yIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIElPVC4gMHg5OSBpcyBmb3IgcnQyODYwRCBhbmQgYmVmb3JlICovCisJe0JCUF9SODYsIDB4MDB9LAkvKiBtaWRkbGUgcmFuZ2UgaXNzdWUsIFJvcnkgQDIwMDgtMDEtMjggKi8KKwl7QkJQX1I5MSwgMHgwNH0sCS8qIG1pZGRsZSByYW5nZSBpc3N1ZSwgUm9yeSBAMjAwOC0wMS0yOCAqLworCXtCQlBfUjkyLCAweDAwfSwJLyogbWlkZGxlIHJhbmdlIGlzc3VlLCBSb3J5IEAyMDA4LTAxLTI4ICovCisJe0JCUF9SMTAzLCAweDAwfSwJLyogbmVhciByYW5nZSBoaWdoLXBvd2VyIGlzc3VlLCByZXF1ZXN0ZWQgZnJvbSBHYXJ5IEAyMDA4LTA1MjggKi8KKwl7QkJQX1IxMDUsIDB4MDV9LAkvKiAweDA1IGlzIGZvciBydDI4NjBFIHRvIHR1cm4gb24gRkVRIGNvbnRyb2wuIEl0IGlzIHNhZmUgZm9yIHJ0Mjg2MEQgYW5kIGJlZm9yZSwgYmVjYXVzZSBCaXQgNzoyIGFyZSByZXNlcnZlZCBpbiBydDI4NjBEIGFuZCBiZWZvcmUuICovCisJe0JCUF9SMTA2LCAweDM1fSwJLyogZm9yIFNob3J0R0kgdGhyb3VnaHB1dCAqLwogfTsKLSNkZWZpbmUJTlVNX0JCUF9SRUdfUEFSTVMJKHNpemVvZihCQlBSZWdUYWJsZSkgLyBzaXplb2YoUkVHX1BBSVIpKQogCi0vLwotLy8gUkYgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gc2V0Ci0vLwotI2lmZGVmIFJUMjg3MAotUkVHX1BBSVIgICBSVDMweHhfUkZSZWdUYWJsZVtdID0gewotICAgICAgICB7UkZfUjA0LCAgICAgICAgICAweDQwfSwKLSAgICAgICAge1JGX1IwNSwgICAgICAgICAgMHgwM30sCi0gICAgICAgIHtSRl9SMDYsICAgICAgICAgIDB4MDJ9LAotICAgICAgICB7UkZfUjA3LCAgICAgICAgICAweDcwfSwKLSAgICAgICAge1JGX1IwOSwgICAgICAgICAgMHgwRn0sCi0gICAgICAgIHtSRl9SMTAsICAgICAgICAgIDB4NDF9LAotICAgICAgICB7UkZfUjExLCAgICAgICAgICAweDIxfSwKLSAgICAgICAge1JGX1IxMiwgICAgICAgICAgMHg3Qn0sCi0gICAgICAgIHtSRl9SMTQsICAgICAgICAgIDB4OTB9LAotICAgICAgICB7UkZfUjE1LCAgICAgICAgICAweDU4fSwKLSAgICAgICAge1JGX1IxNiwgICAgICAgICAgMHhCM30sCi0gICAgICAgIHtSRl9SMTcsICAgICAgICAgIDB4OTJ9LAotICAgICAgICB7UkZfUjE4LCAgICAgICAgICAweDJDfSwKLSAgICAgICAge1JGX1IxOSwgICAgICAgICAgMHgwMn0sCi0gICAgICAgIHtSRl9SMjAsICAgICAgICAgIDB4QkF9LAotICAgICAgICB7UkZfUjIxLCAgICAgICAgICAweERCfSwKLSAgICAgICAge1JGX1IyNCwgICAgICAgICAgMHgxNn0sCi0gICAgICAgIHtSRl9SMjUsICAgICAgICAgIDB4MDF9LAotICAgICAgICB7UkZfUjI5LCAgICAgICAgICAweDFGfSwKLX07Ci0jZGVmaW5lCU5VTV9SRl9SRUdfUEFSTVMJKHNpemVvZihSVDMweHhfUkZSZWdUYWJsZSkgLyBzaXplb2YoUkVHX1BBSVIpKQotI2VuZGlmIC8vIFJUMjg3MCAvLworI2RlZmluZQlOVU1fQkJQX1JFR19QQVJNUwkoc2l6ZW9mKEJCUFJlZ1RhYmxlKSAvIHNpemVvZihzdHJ1Y3QgcnRfcmVnX3BhaXIpKQogCi0vLwotLy8gQVNJQyByZWdpc3RlciBpbml0aWFsaXphdGlvbiBzZXRzCi0vLworLyogKi8KKy8qIEFTSUMgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gc2V0cyAqLworLyogKi8KIAotUlRNUF9SRUdfUEFJUglNQUNSZWdUYWJsZVtdID0Jeworc3RydWN0IHJ0X3J0bXBfcmVnX3BhaXIgTUFDUmVnVGFibGVbXSA9IHsKICNpZiBkZWZpbmVkKEhXX0JFQUNPTl9PRkZTRVQpICYmIChIV19CRUFDT05fT0ZGU0VUID09IDB4MjAwKQotCXtCQ05fT0ZGU0VUMCwJCQkweGY4ZjBlOGUwfSwgLyogMHgzODAwKGUwKSwgMHgzQTAwKGU4KSwgMHgzQzAwKGYwKSwgMHgzRTAwKGY4KSwgNTEyQiBmb3IgZWFjaCBiZWFjb24gKi8KLQl7QkNOX09GRlNFVDEsCQkJMHg2Zjc3ZDBjOH0sIC8qIDB4MzIwMChjOCksIDB4MzQwMChkMCksIDB4MURDMCg3NyksIDB4MUJDMCg2ZiksIDUxMkIgZm9yIGVhY2ggYmVhY29uICovCisJe0JDTl9PRkZTRVQwLCAweGY4ZjBlOGUwfSwJLyogMHgzODAwKGUwKSwgMHgzQTAwKGU4KSwgMHgzQzAwKGYwKSwgMHgzRTAwKGY4KSwgNTEyQiBmb3IgZWFjaCBiZWFjb24gKi8KKwl7QkNOX09GRlNFVDEsIDB4NmY3N2QwYzh9LAkvKiAweDMyMDAoYzgpLCAweDM0MDAoZDApLCAweDFEQzAoNzcpLCAweDFCQzAoNmYpLCA1MTJCIGZvciBlYWNoIGJlYWNvbiAqLwogI2VsaWYgZGVmaW5lZChIV19CRUFDT05fT0ZGU0VUKSAmJiAoSFdfQkVBQ09OX09GRlNFVCA9PSAweDEwMCkKLQl7QkNOX09GRlNFVDAsCQkJMHhlY2U4ZTRlMH0sIC8qIDB4MzgwMCwgMHgzQTAwLCAweDNDMDAsIDB4M0UwMCwgNTEyQiBmb3IgZWFjaCBiZWFjb24gKi8KLQl7QkNOX09GRlNFVDEsCQkJMHhmY2Y4ZjRmMH0sIC8qIDB4MzgwMCwgMHgzQTAwLCAweDNDMDAsIDB4M0UwMCwgNTEyQiBmb3IgZWFjaCBiZWFjb24gKi8KKwl7QkNOX09GRlNFVDAsIDB4ZWNlOGU0ZTB9LAkvKiAweDM4MDAsIDB4M0EwMCwgMHgzQzAwLCAweDNFMDAsIDUxMkIgZm9yIGVhY2ggYmVhY29uICovCisJe0JDTl9PRkZTRVQxLCAweGZjZjhmNGYwfSwJLyogMHgzODAwLCAweDNBMDAsIDB4M0MwMCwgMHgzRTAwLCA1MTJCIGZvciBlYWNoIGJlYWNvbiAqLwogI2Vsc2UKLSAgICAjZXJyb3IgWW91IG11c3QgcmUtY2FsY3VsYXRlIG5ldyB2YWx1ZSBmb3IgQkNOX09GRlNFVDAgJiBCQ05fT0ZGU0VUMSBpbiBNQUNSZWdUYWJsZVtdISEhCi0jZW5kaWYgLy8gSFdfQkVBQ09OX09GRlNFVCAvLworI2Vycm9yIFlvdSBtdXN0IHJlLWNhbGN1bGF0ZSBuZXcgdmFsdWUgZm9yIEJDTl9PRkZTRVQwICYgQkNOX09GRlNFVDEgaW4gTUFDUmVnVGFibGVbXSEKKyNlbmRpZiAvKiBIV19CRUFDT05fT0ZGU0VUIC8vICovCiAKLQl7TEVHQUNZX0JBU0lDX1JBVEUsCQkweDAwMDAwMTNmfSwgLy8gIEJhc2ljIHJhdGUgc2V0IGJpdG1hcAotCXtIVF9CQVNJQ19SQVRFLAkJMHgwMDAwODAwM30sIC8vIEJhc2ljIEhUIHJhdGUgc2V0ICwgMjBNLCBNQ1M9MywgTU0uIEZvcm1hdCBpcyB0aGUgc2FtZSBhcyBpbiBUWFdJLgotCXtNQUNfU1lTX0NUUkwsCQkweDAwfSwgLy8gMHgxMDA0LCAsIGRlZmF1bHQgRGlzYWJsZSBSWAotCXtSWF9GSUxUUl9DRkcsCQkweDE3Zjk3fSwgLy8weDE0MDAgICwgUlggZmlsdGVyIGNvbnRyb2wsCi0Je0JLT0ZGX1NMT1RfQ0ZHLAkweDIwOX0sIC8vIGRlZmF1bHQgc2V0IHNob3J0IHNsb3QgdGltZSwgQ0NfREVMQVlfVElNRSBzaG91bGQgYmUgMgotCXtUWF9TV19DRkcwLAkJMHgwfSwgCQkvLyBHYXJ5LDIwMDgtMDUtMjEgZm9yIENXQyB0ZXN0Ci0Je1RYX1NXX0NGRzEsCQkweDgwNjA2fSwgLy8gR2FyeSwyMDA2LTA4LTIzCi0Je1RYX0xJTktfQ0ZHLAkJMHgxMDIwfSwJCS8vIEdhcnksMjAwNi0wOC0yMwotCXtUWF9USU1FT1VUX0NGRywJMHgwMDBhMjA5MH0sCS8vIENDSyBoYXMgc29tZSBwcm9ibGVtLiBTbyBpbmNyZWFzZSB0aW1pZW91dCB2YWx1ZS4gMjAwNi0xMC0wOS8vIE1BcnZlayBSVCAsIE1vZGlmeSBmb3IgMjg2MEUgLDIwMDctMDgtMDEKLQl7TUFYX0xFTl9DRkcsCQlNQVhfQUdHUkVHQVRJT05fU0laRSB8IDB4MDAwMDEwMDB9LAkvLyAweDMwMTgsIE1BWCBmcmFtZSBsZW5ndGguIE1heCBQU0RVID0gMTZrYnl0ZXMuCi0Je0xFRF9DRkcsCQkweDdmMDMxZTQ2fSwgLy8gR2FyeSwgMjAwNi0wOC0yMwotCXtQQkZfTUFYX1BDTlQsCQkJMHgxRjNGQkY5Rn0sIAkvLzB4MUYzZjdmOWZ9LAkJLy9KYW4sIDIwMDYvMDQvMjAKLQl7VFhfUlRZX0NGRywJCQkweDQ3ZDAxZjBmfSwJLy8gSmFuLCAyMDA2LzExLzE2LCBTZXQgVHhXSS0+QUNLID0wIGluIFByb2JlIFJzcCBNb2RpZnkgZm9yIDI4NjBFICwyMDA3LTA4LTAzCi0Je0FVVE9fUlNQX0NGRywJCQkweDAwMDAwMDEzfSwJLy8gSW5pdGlhbCBBdXRvX1Jlc3BvbmRlciwgYmVjYXVzZSBRQSB3aWxsIHR1cm4gb2ZmIEF1dG8tUmVzcG9uZGVyCi0Je0NDS19QUk9UX0NGRywJCQkweDA1NzQwMDAzIC8qMHgwMTc0MDAwMyovfSwJLy8gSW5pdGlhbCBBdXRvX1Jlc3BvbmRlciwgYmVjYXVzZSBRQSB3aWxsIHR1cm4gb2ZmIEF1dG8tUmVzcG9uZGVyLiBBbmQgUlRTIHRocmVzaG9sZCBpcyBlbmFibGVkLgotCXtPRkRNX1BST1RfQ0ZHLAkJCTB4MDU3NDAwMDMgLyoweDAxNzQwMDAzKi99LAkvLyBJbml0aWFsIEF1dG9fUmVzcG9uZGVyLCBiZWNhdXNlIFFBIHdpbGwgdHVybiBvZmYgQXV0by1SZXNwb25kZXIuIEFuZCBSVFMgdGhyZXNob2xkIGlzIGVuYWJsZWQuCi0vL1BTIHBhY2tldHMgdXNlIFR4MVEgKGZvciBIQ0NBKSB3aGVuIGRlcXVldWUgZnJvbSBQUyB1bmljYXN0IHF1ZXVlIChXaUZpIFdQQTIgTUE5X0RUMSBmb3IgTWFydmVsbCBCIFNUQSkKLSNpZmRlZiBSVDI4NzAKLQl7UEJGX0NGRywgCQkJCTB4ZjQwMDA2fSwgCQkvLyBPbmx5IGVuYWJsZSBRdWV1ZSAyCi0Je01NNDBfUFJPVF9DRkcsCQkJMHgzRjQ0MDg0fSwJCS8vIEluaXRpYWwgQXV0b19SZXNwb25kZXIsIGJlY2F1c2UgUUEgd2lsbCB0dXJuIG9mZiBBdXRvLVJlc3BvbmRlcgotCXtXUERNQV9HTE9fQ0ZHLAkJCTB4MDAwMDAwMzB9LAotI2VuZGlmIC8vIFJUMjg3MCAvLwotCXtHRjIwX1BST1RfQ0ZHLAkJCTB4MDE3NDQwMDR9LCAgICAvLyBzZXQgMTk6MTggLS0+IFNob3J0IE5BViBmb3IgTUlNTyBQUwotCXtHRjQwX1BST1RfQ0ZHLAkJCTB4MDNGNDQwODR9LAotCXtNTTIwX1BST1RfQ0ZHLAkJCTB4MDE3NDQwMDR9LAotI2lmZGVmIFJUMjg2MAotCXtNTTQwX1BST1RfQ0ZHLAkJCTB4MDNGNTQwODR9LAotI2VuZGlmCi0Je1RYT1BfQ1RSTF9DRkcsCQkJMHgwMDAwNTgzZiwgLyoweDAwMDAyNDNmKi8gLyoweDAwMDAyNGJmKi99LAkvL0V4dGVuc2lvbiBjaGFubmVsIGJhY2tvZmYuCi0Je1RYX1JUU19DRkcsCQkJMHgwMDA5MmIyMH0sCi0Je0VYUF9BQ0tfVElNRSwJCQkweDAwMjQwMGNhfSwJLy8gZGVmYXVsdCB2YWx1ZQotCXtUWE9QX0hMRFJfRVQsIAkJCTB4MDAwMDAwMDJ9LAorCXtMRUdBQ1lfQkFTSUNfUkFURSwgMHgwMDAwMDEzZn0sCS8qICBCYXNpYyByYXRlIHNldCBiaXRtYXAgKi8KKwl7SFRfQkFTSUNfUkFURSwgMHgwMDAwODAwM30sCS8qIEJhc2ljIEhUIHJhdGUgc2V0ICwgMjBNLCBNQ1M9MywgTU0uIEZvcm1hdCBpcyB0aGUgc2FtZSBhcyBpbiBUWFdJLiAqLworCXtNQUNfU1lTX0NUUkwsIDB4MDB9LAkvKiAweDEwMDQsICwgZGVmYXVsdCBEaXNhYmxlIFJYICovCisJe1JYX0ZJTFRSX0NGRywgMHgxN2Y5N30sCS8qMHgxNDAwICAsIFJYIGZpbHRlciBjb250cm9sLCAqLworCXtCS09GRl9TTE9UX0NGRywgMHgyMDl9LAkvKiBkZWZhdWx0IHNldCBzaG9ydCBzbG90IHRpbWUsIENDX0RFTEFZX1RJTUUgc2hvdWxkIGJlIDIgKi8KKwkvKntUWF9TV19DRkcwLCAgICAgICAgICAweDQwYTA2fSwgLy8gR2FyeSwyMDA2LTA4LTIzICovCisJe1RYX1NXX0NGRzAsIDB4MH0sCS8qIEdhcnksMjAwOC0wNS0yMSBmb3IgQ1dDIHRlc3QgKi8KKwl7VFhfU1dfQ0ZHMSwgMHg4MDYwNn0sCS8qIEdhcnksMjAwNi0wOC0yMyAqLworCXtUWF9MSU5LX0NGRywgMHgxMDIwfSwJLyogR2FyeSwyMDA2LTA4LTIzICovCisJLyp7VFhfVElNRU9VVF9DRkcsICAgICAgMHgwMDE4MjA5MH0sICAgIC8vIENDSyBoYXMgc29tZSBwcm9ibGVtLiBTbyBpbmNyZWFzZSB0aW1pZW91dCB2YWx1ZS4gMjAwNi0xMC0wOS8vIE1BcnZlayBSVCAqLworCXtUWF9USU1FT1VUX0NGRywgMHgwMDBhMjA5MH0sCS8qIENDSyBoYXMgc29tZSBwcm9ibGVtLiBTbyBpbmNyZWFzZSB0aW1pZW91dCB2YWx1ZS4gMjAwNi0xMC0wOS8vIE1BcnZlayBSVCAsIE1vZGlmeSBmb3IgMjg2MEUgLDIwMDctMDgtMDEgKi8KKwl7TUFYX0xFTl9DRkcsIE1BWF9BR0dSRUdBVElPTl9TSVpFIHwgMHgwMDAwMTAwMH0sCS8qIDB4MzAxOCwgTUFYIGZyYW1lIGxlbmd0aC4gTWF4IFBTRFUgPSAxNmtieXRlcy4gKi8KKwl7TEVEX0NGRywgMHg3ZjAzMWU0Nn0sCS8qIEdhcnksIDIwMDYtMDgtMjMgKi8KKworCXtQQkZfTUFYX1BDTlQsIDB4MUYzRkJGOUZ9LAkvKjB4MUYzZjdmOWZ9LCAgICAgICAgICAvL0phbiwgMjAwNi8wNC8yMCAqLworCisJe1RYX1JUWV9DRkcsIDB4NDdkMDFmMGZ9LAkvKiBKYW4sIDIwMDYvMTEvMTYsIFNldCBUeFdJLT5BQ0sgPTAgaW4gUHJvYmUgUnNwIE1vZGlmeSBmb3IgMjg2MEUgLDIwMDctMDgtMDMgKi8KKworCXtBVVRPX1JTUF9DRkcsIDB4MDAwMDAwMTN9LAkvKiBJbml0aWFsIEF1dG9fUmVzcG9uZGVyLCBiZWNhdXNlIFFBIHdpbGwgdHVybiBvZmYgQXV0by1SZXNwb25kZXIgKi8KKwl7Q0NLX1BST1RfQ0ZHLCAweDA1NzQwMDAzIC8qMHgwMTc0MDAwMyAqLyB9LAkvKiBJbml0aWFsIEF1dG9fUmVzcG9uZGVyLCBiZWNhdXNlIFFBIHdpbGwgdHVybiBvZmYgQXV0by1SZXNwb25kZXIuIEFuZCBSVFMgdGhyZXNob2xkIGlzIGVuYWJsZWQuICovCisJe09GRE1fUFJPVF9DRkcsIDB4MDU3NDAwMDMgLyoweDAxNzQwMDAzICovIH0sCS8qIEluaXRpYWwgQXV0b19SZXNwb25kZXIsIGJlY2F1c2UgUUEgd2lsbCB0dXJuIG9mZiBBdXRvLVJlc3BvbmRlci4gQW5kIFJUUyB0aHJlc2hvbGQgaXMgZW5hYmxlZC4gKi8KKyNpZmRlZiBSVE1QX01BQ19VU0IKKwl7UEJGX0NGRywgMHhmNDAwMDZ9LAkvKiBPbmx5IGVuYWJsZSBRdWV1ZSAyICovCisJe01NNDBfUFJPVF9DRkcsIDB4M0Y0NDA4NH0sCS8qIEluaXRpYWwgQXV0b19SZXNwb25kZXIsIGJlY2F1c2UgUUEgd2lsbCB0dXJuIG9mZiBBdXRvLVJlc3BvbmRlciAqLworCXtXUERNQV9HTE9fQ0ZHLCAweDAwMDAwMDMwfSwKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKwl7R0YyMF9QUk9UX0NGRywgMHgwMTc0NDAwNH0sCS8qIHNldCAxOToxOCAtLT4gU2hvcnQgTkFWIGZvciBNSU1PIFBTICovCisJe0dGNDBfUFJPVF9DRkcsIDB4MDNGNDQwODR9LAorCXtNTTIwX1BST1RfQ0ZHLCAweDAxNzQ0MDA0fSwKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwl7TU00MF9QUk9UX0NGRywgMHgwM0Y1NDA4NH0sCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisJe1RYT1BfQ1RSTF9DRkcsIDB4MDAwMDU4M2YsIC8qMHgwMDAwMjQzZiAqLy8qMHgwMDAwMjRiZiAqLyB9LAkvKkV4dGVuc2lvbiBjaGFubmVsIGJhY2tvZmYuICovCisJe1RYX1JUU19DRkcsIDB4MDAwOTJiMjB9LAorCXtFWFBfQUNLX1RJTUUsIDB4MDAyNDAwY2F9LAkvKiBkZWZhdWx0IHZhbHVlICovCisKKwl7VFhPUF9ITERSX0VULCAweDAwMDAwMDAyfSwKIAogCS8qIEplcnJ5IGNvbW1lbnRzIDIwMDgvMDEvMTY6IHdlIHVzZSBTSUZTID0gMTB1cyBpbiBDQ0sgZGVmYXVsdGx5LCBidXQgaXQgc2VlbXMgdGhhdCAxMHVzCi0JCWlzIHRvbyBzbWFsbCBmb3IgSU5URUwgMjIwMGJnIGNhcmQsIHNvIGluIE1CU1MgbW9kZSwgdGhlIGRlbHRhIHRpbWUgYmV0d2VlbiBiZWFjb24wCi0JCWFuZCBiZWFjb24xIGlzIFNJRlMgKDEwdXMpLCBzbyBpZiBJTlRFTCAyMjAwYmcgY2FyZCBjb25uZWN0cyB0byBCU1MwLCB0aGUgcGluZwotCQl3aWxsIGFsd2F5cyBsb3N0LiBTbyB3ZSBjaGFuZ2UgdGhlIFNJRlMgb2YgQ0NLIGZyb20gMTB1cyB0byAxNnVzLiAqLwotCXtYSUZTX1RJTUVfQ0ZHLAkJCTB4MzNhNDEwMTB9LAotCXtQV1JfUElOX0NGRywJCQkweDAwMDAwMDAzfSwJLy8gcGF0Y2ggZm9yIDI4ODAtRQorCSAgIGlzIHRvbyBzbWFsbCBmb3IgSU5URUwgMjIwMGJnIGNhcmQsIHNvIGluIE1CU1MgbW9kZSwgdGhlIGRlbHRhIHRpbWUgYmV0d2VlbiBiZWFjb24wCisJICAgYW5kIGJlYWNvbjEgaXMgU0lGUyAoMTB1cyksIHNvIGlmIElOVEVMIDIyMDBiZyBjYXJkIGNvbm5lY3RzIHRvIEJTUzAsIHRoZSBwaW5nCisJICAgd2lsbCBhbHdheXMgbG9zdC4gU28gd2UgY2hhbmdlIHRoZSBTSUZTIG9mIENDSyBmcm9tIDEwdXMgdG8gMTZ1cy4gKi8KKwl7WElGU19USU1FX0NGRywgMHgzM2E0MTAxMH0sCisJe1BXUl9QSU5fQ0ZHLCAweDAwMDAwMDAzfSwJLyogcGF0Y2ggZm9yIDI4ODAtRSAqLwogfTsKIAotUlRNUF9SRUdfUEFJUglTVEFNQUNSZWdUYWJsZVtdID0JewotCXtXTU1fQUlGU05fQ0ZHLAkJMHgwMDAwMjI3M30sCi0Je1dNTV9DV01JTl9DRkcsCTB4MDAwMDIzNDR9LAotCXtXTU1fQ1dNQVhfQ0ZHLAkweDAwMDAzNGFhfSwKK3N0cnVjdCBydF9ydG1wX3JlZ19wYWlyIFNUQU1BQ1JlZ1RhYmxlW10gPSB7CisJe1dNTV9BSUZTTl9DRkcsIDB4MDAwMDIyNzN9LAorCXtXTU1fQ1dNSU5fQ0ZHLCAweDAwMDAyMzQ0fSwKKwl7V01NX0NXTUFYX0NGRywgMHgwMDAwMzRhYX0sCiB9OwogCi0jZGVmaW5lCU5VTV9NQUNfUkVHX1BBUk1TCQkoc2l6ZW9mKE1BQ1JlZ1RhYmxlKSAvIHNpemVvZihSVE1QX1JFR19QQUlSKSkKLSNkZWZpbmUJTlVNX1NUQV9NQUNfUkVHX1BBUk1TCShzaXplb2YoU1RBTUFDUmVnVGFibGUpIC8gc2l6ZW9mKFJUTVBfUkVHX1BBSVIpKQotCi0jaWZkZWYgUlQyODcwCi0vLwotLy8gUlQyODcwIEZpcm13YXJlIFNwZWMgb25seSB1c2VkIDEgb2N0IGZvciB2ZXJzaW9uIGV4cHJlc3Npb24KLS8vCi0jZGVmaW5lIEZJUk1XQVJFX01JTk9SX1ZFUlNJT04JNwotCi0jZW5kaWYgLy8gUlQyODcwIC8vCi0KLS8vIE5ldyA4ayBieXRlIGZpcm13YXJlIHNpemUgZm9yIFJUMzA3MS9SVDMwNzIKLSNkZWZpbmUgRklSTVdBUkVJTUFHRV9NQVhfTEVOR1RICTB4MjAwMAotI2RlZmluZSBGSVJNV0FSRUlNQUdFX0xFTkdUSAkJKHNpemVvZiAoRmlybXdhcmVJbWFnZSkgLyBzaXplb2YoVUNIQVIpKQotI2RlZmluZSBGSVJNV0FSRV9NQUpPUl9WRVJTSU9OCTAKLQotI2RlZmluZSBGSVJNV0FSRUlNQUdFVjFfTEVOR1RICTB4MTAwMAotI2RlZmluZSBGSVJNV0FSRUlNQUdFVjJfTEVOR1RICTB4MTAwMAotCi0jaWZkZWYgUlQyODYwCi0jZGVmaW5lIEZJUk1XQVJFX01JTk9SX1ZFUlNJT04JMgotI2VuZGlmCi0KKyNkZWZpbmUJTlVNX01BQ19SRUdfUEFSTVMJCShzaXplb2YoTUFDUmVnVGFibGUpIC8gc2l6ZW9mKHN0cnVjdCBydF9ydG1wX3JlZ19wYWlyKSkKKyNkZWZpbmUJTlVNX1NUQV9NQUNfUkVHX1BBUk1TCShzaXplb2YoU1RBTUFDUmVnVGFibGUpIC8gc2l6ZW9mKHN0cnVjdCBydF9ydG1wX3JlZ19wYWlyKSkKIAogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUFsbG9jYXRlIFJUTVBfQURBUFRFUiBkYXRhIGJsb2NrIGFuZCBkbyBzb21lIGluaXRpYWxpemF0aW9uCisJCUFsbG9jYXRlIHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgZGF0YSBibG9jayBhbmQgZG8gc29tZSBpbml0aWFsaXphdGlvbgogCiAJQXJndW1lbnRzOgogCQlBZGFwdGVyCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCkBAIC0yMTMsNDggKzE1Miw0OCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotTkRJU19TVEFUVVMJUlRNUEFsbG9jQWRhcHRlckJsb2NrKAotCUlOICBQVk9JRAloYW5kbGUsCi0JT1VUCVBSVE1QX0FEQVBURVIJKnBwQWRhcHRlcikKK2ludCBSVE1QQWxsb2NBZGFwdGVyQmxvY2sodm9pZCAqaGFuZGxlLAorCQkJCSAgc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqICogcHBBZGFwdGVyKQogewotCVBSVE1QX0FEQVBURVIJcEFkOwotCU5ESVNfU1RBVFVTCQlTdGF0dXM7Ci0JSU5UIAkJCWluZGV4OwotCVVDSEFSCQkJKnBCZWFjb25CdWYgPSBOVUxMOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZDsKKwlpbnQgU3RhdHVzOworCWludCBpbmRleDsKKwl1OCAqcEJlYWNvbkJ1ZiA9IE5VTEw7CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gUlRNUEFsbG9jQWRhcHRlckJsb2NrXG4iKSk7CiAKIAkqcHBBZGFwdGVyID0gTlVMTDsKIAotCWRvCi0JewotCQkvLyBBbGxvY2F0ZSBSVE1QX0FEQVBURVIgbWVtb3J5IGJsb2NrCisJZG8geworCQkvKiBBbGxvY2F0ZSBzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyIG1lbW9yeSBibG9jayAqLwogCQlwQmVhY29uQnVmID0ga21hbGxvYyhNQVhfQkVBQ09OX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKLQkJaWYgKHBCZWFjb25CdWYgPT0gTlVMTCkKLQkJeworCQlpZiAocEJlYWNvbkJ1ZiA9PSBOVUxMKSB7CiAJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwogCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSAtIEJlYWNvbkJ1ZiFcbiIpKTsKIAkJCWJyZWFrOwogCQl9CisJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25CdWYsIE1BWF9CRUFDT05fU0laRSk7CiAKLQkJU3RhdHVzID0gQWRhcHRlckJsb2NrQWxsb2NhdGVNZW1vcnkoaGFuZGxlLCAoUFZPSUQgKikmcEFkKTsKLQkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQl7CisJCVN0YXR1cyA9IEFkYXB0ZXJCbG9ja0FsbG9jYXRlTWVtb3J5KGhhbmRsZSwgKHZvaWQgKiopICYgcEFkKTsKKwkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CiAJCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IC0gQURBUFRFUlxuIikpOwogCQkJYnJlYWs7CiAJCX0KIAkJcEFkLT5CZWFjb25CdWYgPSBwQmVhY29uQnVmOwotCQlwcmludGsoIlxuXG49PT0gcEFkID0gJXAsIHNpemUgPSAlZCA9PT1cblxuIiwgcEFkLCAoVUlOVDMyKXNpemVvZihSVE1QX0FEQVBURVIpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLAorCQkJICgiPT09IHBBZCA9ICVwLCBzaXplID0gJWQgPT09XG4iLCBwQWQsCisJCQkgICh1MzIpc2l6ZW9mKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIpKSk7CiAKLQotCQkvLyBJbml0IHNwaW4gbG9ja3MKKwkJLyogSW5pdCBzcGluIGxvY2tzICovCiAJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1nbXRSaW5nTG9jayk7Ci0jaWZkZWYgUlQyODYwCisjaWZkZWYgUlRNUF9NQUNfUENJCiAJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPlJ4UmluZ0xvY2spOwotI2VuZGlmCisjaWZkZWYgUlQzMDkwCisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1jdUNtZExvY2spOworI2VuZGlmIC8qIFJUMzA5MCAvLyAqLworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCi0JCWZvciAoaW5kZXggPTAgOyBpbmRleCA8IE5VTV9PRl9UWF9SSU5HOyBpbmRleCsrKQotCQl7CisJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl9UWF9SSU5HOyBpbmRleCsrKSB7CiAJCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5UeFN3UXVldWVMb2NrW2luZGV4XSk7CiAJCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5EZVF1ZXVlTG9ja1tpbmRleF0pOwogCQkJcEFkLT5EZVF1ZXVlUnVubmluZ1tpbmRleF0gPSBGQUxTRTsKQEAgLTI5MSw1MTggKzIzMCwxOTkgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJUlRNUFJlYWRUeFB3clBlclJhdGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCit2b2lkIFJUTVBSZWFkVHhQd3JQZXJSYXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlVTE9ORwkJZGF0YSwgQWRhdGEsIEdkYXRhOwotCVVTSE9SVAkJaSwgdmFsdWUsIHZhbHVlMjsKLQlJTlQJCQlBcHdyZGVsdGEsIEdwd3JkZWx0YTsKLQlVQ0hBUgkJdDEsdDIsdDMsdDQ7Ci0JQk9PTEVBTgkJYlZhbGlkLCBiQXB3cmRlbHRhTWludXMgPSBUUlVFLCBiR3B3cmRlbHRhTWludXMgPSBUUlVFOworCXVuc2lnbmVkIGxvbmcgZGF0YSwgQWRhdGEsIEdkYXRhOworCXUxNiBpLCB2YWx1ZSwgdmFsdWUyOworCWludCBBcHdyZGVsdGEsIEdwd3JkZWx0YTsKKwl1OCB0MSwgdDIsIHQzLCB0NDsKKwlCT09MRUFOIGJBcHdyZGVsdGFNaW51cyA9IFRSVUUsIGJHcHdyZGVsdGFNaW51cyA9IFRSVUU7CiAKLQkvLwotCS8vIEdldCBwb3dlciBkZWx0YSBmb3IgMjBNSHogYW5kIDQwTUh6LgotCS8vCisJLyogKi8KKwkvKiBHZXQgcG93ZXIgZGVsdGEgZm9yIDIwTUh6IGFuZCA0ME1Iei4gKi8KKwkvKiAqLwogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4cG93ZXIgcGVyIFJhdGVcbiIpKTsKIAlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0RFTFRBLCB2YWx1ZTIpOwogCUFwd3JkZWx0YSA9IDA7CiAJR3B3cmRlbHRhID0gMDsKIAotCWlmICgodmFsdWUyICYgMHhmZikgIT0gMHhmZikKLQl7CisJaWYgKCh2YWx1ZTIgJiAweGZmKSAhPSAweGZmKSB7CiAJCWlmICgodmFsdWUyICYgMHg4MCkpCi0JCQlHcHdyZGVsdGEgPSAodmFsdWUyJjB4Zik7CisJCQlHcHdyZGVsdGEgPSAodmFsdWUyICYgMHhmKTsKIAogCQlpZiAoKHZhbHVlMiAmIDB4NDApKQogCQkJYkdwd3JkZWx0YU1pbnVzID0gRkFMU0U7CiAJCWVsc2UKIAkJCWJHcHdyZGVsdGFNaW51cyA9IFRSVUU7CiAJfQotCWlmICgodmFsdWUyICYgMHhmZjAwKSAhPSAweGZmMDApCi0JeworCWlmICgodmFsdWUyICYgMHhmZjAwKSAhPSAweGZmMDApIHsKIAkJaWYgKCh2YWx1ZTIgJiAweDgwMDApKQotCQkJQXB3cmRlbHRhID0gKCh2YWx1ZTImMHhmMDApPj44KTsKKwkJCUFwd3JkZWx0YSA9ICgodmFsdWUyICYgMHhmMDApID4+IDgpOwogCiAJCWlmICgodmFsdWUyICYgMHg0MDAwKSkKIAkJCWJBcHdyZGVsdGFNaW51cyA9IEZBTFNFOwogCQllbHNlCiAJCQliQXB3cmRlbHRhTWludXMgPSBUUlVFOwogCX0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJHcHdyZGVsdGEgPSAleCwgQXB3cmRlbHRhID0gJXggLlxuIiwgR3B3cmRlbHRhLCBBcHdyZGVsdGEpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiR3B3cmRlbHRhID0gJXgsIEFwd3JkZWx0YSA9ICV4IC5cbiIsIEdwd3JkZWx0YSwgQXB3cmRlbHRhKSk7CiAKLQkvLwotCS8vIEdldCBUeHBvd2VyIHBlciBNQ1MgZm9yIDIwTUh6IGluIDIuNEcuCi0JLy8KLQlmb3IgKGk9MDsgaTw1OyBpKyspCi0JewotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV8yME1IWl8yXzRHICsgaSo0LCB2YWx1ZSk7CisJLyogKi8KKwkvKiBHZXQgVHhwb3dlciBwZXIgTUNTIGZvciAyME1IeiBpbiAyLjRHLiAqLworCS8qICovCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsCisJCQkJICAgICBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfMl80RyArIGkgKiA0LAorCQkJCSAgICAgdmFsdWUpOwogCQlkYXRhID0gdmFsdWU7Ci0JCWlmIChiQXB3cmRlbHRhTWludXMgPT0gRkFMU0UpCi0JCXsKLQkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7CisJCWlmIChiQXB3cmRlbHRhTWludXMgPT0gRkFMU0UpIHsKKwkJCXQxID0gKHZhbHVlICYgMHhmKSArIChBcHdyZGVsdGEpOwogCQkJaWYgKHQxID4gMHhmKQogCQkJCXQxID0gMHhmOwotCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoQXB3cmRlbHRhKTsKKwkJCXQyID0gKCh2YWx1ZSAmIDB4ZjApID4+IDQpICsgKEFwd3JkZWx0YSk7CiAJCQlpZiAodDIgPiAweGYpCiAJCQkJdDIgPSAweGY7Ci0JCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoQXB3cmRlbHRhKTsKKwkJCXQzID0gKCh2YWx1ZSAmIDB4ZjAwKSA+PiA4KSArIChBcHdyZGVsdGEpOwogCQkJaWYgKHQzID4gMHhmKQogCQkJCXQzID0gMHhmOwotCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoQXB3cmRlbHRhKTsKKwkJCXQ0ID0gKCh2YWx1ZSAmIDB4ZjAwMCkgPj4gMTIpICsgKEFwd3JkZWx0YSk7CiAJCQlpZiAodDQgPiAweGYpCiAJCQkJdDQgPSAweGY7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAoKHZhbHVlJjB4ZikgPiBBcHdyZGVsdGEpCi0JCQkJdDEgPSAodmFsdWUmMHhmKS0oQXB3cmRlbHRhKTsKKwkJfSBlbHNlIHsKKwkJCWlmICgodmFsdWUgJiAweGYpID4gQXB3cmRlbHRhKQorCQkJCXQxID0gKHZhbHVlICYgMHhmKSAtIChBcHdyZGVsdGEpOwogCQkJZWxzZQogCQkJCXQxID0gMDsKLQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEFwd3JkZWx0YSkKLQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShBcHdyZGVsdGEpOworCQkJaWYgKCgodmFsdWUgJiAweGYwKSA+PiA0KSA+IEFwd3JkZWx0YSkKKwkJCQl0MiA9ICgodmFsdWUgJiAweGYwKSA+PiA0KSAtIChBcHdyZGVsdGEpOwogCQkJZWxzZQogCQkJCXQyID0gMDsKLQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBBcHdyZGVsdGEpCi0JCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEFwd3JkZWx0YSk7CisJCQlpZiAoKCh2YWx1ZSAmIDB4ZjAwKSA+PiA4KSA+IEFwd3JkZWx0YSkKKwkJCQl0MyA9ICgodmFsdWUgJiAweGYwMCkgPj4gOCkgLSAoQXB3cmRlbHRhKTsKIAkJCWVsc2UKIAkJCQl0MyA9IDA7Ci0JCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCi0JCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oQXB3cmRlbHRhKTsKKwkJCWlmICgoKHZhbHVlICYgMHhmMDAwKSA+PiAxMikgPiBBcHdyZGVsdGEpCisJCQkJdDQgPSAoKHZhbHVlICYgMHhmMDAwKSA+PiAxMikgLSAoQXB3cmRlbHRhKTsKIAkJCWVsc2UKIAkJCQl0NCA9IDA7CiAJCX0KLQkJQWRhdGEgPSB0MSArICh0Mjw8NCkgKyAodDM8PDgpICsgKHQ0PDwxMik7Ci0JCWlmIChiR3B3cmRlbHRhTWludXMgPT0gRkFMU0UpCi0JCXsKLQkJCXQxID0gKHZhbHVlJjB4ZikrKEdwd3JkZWx0YSk7CisJCUFkYXRhID0gdDEgKyAodDIgPDwgNCkgKyAodDMgPDwgOCkgKyAodDQgPDwgMTIpOworCQlpZiAoYkdwd3JkZWx0YU1pbnVzID09IEZBTFNFKSB7CisJCQl0MSA9ICh2YWx1ZSAmIDB4ZikgKyAoR3B3cmRlbHRhKTsKIAkJCWlmICh0MSA+IDB4ZikKIAkJCQl0MSA9IDB4ZjsKLQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEdwd3JkZWx0YSk7CisJCQl0MiA9ICgodmFsdWUgJiAweGYwKSA+PiA0KSArIChHcHdyZGVsdGEpOwogCQkJaWYgKHQyID4gMHhmKQogCQkJCXQyID0gMHhmOwotCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEdwd3JkZWx0YSk7CisJCQl0MyA9ICgodmFsdWUgJiAweGYwMCkgPj4gOCkgKyAoR3B3cmRlbHRhKTsKIAkJCWlmICh0MyA+IDB4ZikKIAkJCQl0MyA9IDB4ZjsKLQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEdwd3JkZWx0YSk7CisJCQl0NCA9ICgodmFsdWUgJiAweGYwMDApID4+IDEyKSArIChHcHdyZGVsdGEpOwogCQkJaWYgKHQ0ID4gMHhmKQogCQkJCXQ0ID0gMHhmOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKCh2YWx1ZSYweGYpID4gR3B3cmRlbHRhKQotCQkJCXQxID0gKHZhbHVlJjB4ZiktKEdwd3JkZWx0YSk7CisJCX0gZWxzZSB7CisJCQlpZiAoKHZhbHVlICYgMHhmKSA+IEdwd3JkZWx0YSkKKwkJCQl0MSA9ICh2YWx1ZSAmIDB4ZikgLSAoR3B3cmRlbHRhKTsKIAkJCWVsc2UKIAkJCQl0MSA9IDA7Ci0JCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBHcHdyZGVsdGEpCi0JCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oR3B3cmRlbHRhKTsKKwkJCWlmICgoKHZhbHVlICYgMHhmMCkgPj4gNCkgPiBHcHdyZGVsdGEpCisJCQkJdDIgPSAoKHZhbHVlICYgMHhmMCkgPj4gNCkgLSAoR3B3cmRlbHRhKTsKIAkJCWVsc2UKIAkJCQl0MiA9IDA7Ci0JCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gR3B3cmRlbHRhKQotCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShHcHdyZGVsdGEpOworCQkJaWYgKCgodmFsdWUgJiAweGYwMCkgPj4gOCkgPiBHcHdyZGVsdGEpCisJCQkJdDMgPSAoKHZhbHVlICYgMHhmMDApID4+IDgpIC0gKEdwd3JkZWx0YSk7CiAJCQllbHNlCiAJCQkJdDMgPSAwOwotCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gR3B3cmRlbHRhKQotCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEdwd3JkZWx0YSk7CisJCQlpZiAoKCh2YWx1ZSAmIDB4ZjAwMCkgPj4gMTIpID4gR3B3cmRlbHRhKQorCQkJCXQ0ID0gKCh2YWx1ZSAmIDB4ZjAwMCkgPj4gMTIpIC0gKEdwd3JkZWx0YSk7CiAJCQllbHNlCiAJCQkJdDQgPSAwOwogCQl9Ci0JCUdkYXRhID0gdDEgKyAodDI8PDQpICsgKHQzPDw4KSArICh0NDw8MTIpOworCQlHZGF0YSA9IHQxICsgKHQyIDw8IDQpICsgKHQzIDw8IDgpICsgKHQ0IDw8IDEyKTsKIAotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV8yME1IWl8yXzRHICsgaSo0ICsgMiwgdmFsdWUpOwotCQlpZiAoYkFwd3JkZWx0YU1pbnVzID09IEZBTFNFKQotCQl7Ci0JCQl0MSA9ICh2YWx1ZSYweGYpKyhBcHdyZGVsdGEpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsCisJCQkJICAgICBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfMl80RyArIGkgKiA0ICsKKwkJCQkgICAgIDIsIHZhbHVlKTsKKwkJaWYgKGJBcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkgeworCQkJdDEgPSAodmFsdWUgJiAweGYpICsgKEFwd3JkZWx0YSk7CiAJCQlpZiAodDEgPiAweGYpCiAJCQkJdDEgPSAweGY7Ci0JCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOworCQkJdDIgPSAoKHZhbHVlICYgMHhmMCkgPj4gNCkgKyAoQXB3cmRlbHRhKTsKIAkJCWlmICh0MiA+IDB4ZikKIAkJCQl0MiA9IDB4ZjsKLQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhBcHdyZGVsdGEpOworCQkJdDMgPSAoKHZhbHVlICYgMHhmMDApID4+IDgpICsgKEFwd3JkZWx0YSk7CiAJCQlpZiAodDMgPiAweGYpCiAJCQkJdDMgPSAweGY7Ci0JCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOworCQkJdDQgPSAoKHZhbHVlICYgMHhmMDAwKSA+PiAxMikgKyAoQXB3cmRlbHRhKTsKIAkJCWlmICh0NCA+IDB4ZikKIAkJCQl0NCA9IDB4ZjsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmICgodmFsdWUmMHhmKSA+IEFwd3JkZWx0YSkKLQkJCQl0MSA9ICh2YWx1ZSYweGYpLShBcHdyZGVsdGEpOworCQl9IGVsc2UgeworCQkJaWYgKCh2YWx1ZSAmIDB4ZikgPiBBcHdyZGVsdGEpCisJCQkJdDEgPSAodmFsdWUgJiAweGYpIC0gKEFwd3JkZWx0YSk7CiAJCQllbHNlCiAJCQkJdDEgPSAwOwotCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gQXB3cmRlbHRhKQotCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7CisJCQlpZiAoKCh2YWx1ZSAmIDB4ZjApID4+IDQpID4gQXB3cmRlbHRhKQorCQkJCXQyID0gKCh2YWx1ZSAmIDB4ZjApID4+IDQpIC0gKEFwd3JkZWx0YSk7CiAJCQllbHNlCiAJCQkJdDIgPSAwOwotCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKLQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKKwkJCWlmICgoKHZhbHVlICYgMHhmMDApID4+IDgpID4gQXB3cmRlbHRhKQorCQkJCXQzID0gKCh2YWx1ZSAmIDB4ZjAwKSA+PiA4KSAtIChBcHdyZGVsdGEpOwogCQkJZWxzZQogCQkJCXQzID0gMDsKLQkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEFwd3JkZWx0YSkKLQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShBcHdyZGVsdGEpOworCQkJaWYgKCgodmFsdWUgJiAweGYwMDApID4+IDEyKSA+IEFwd3JkZWx0YSkKKwkJCQl0NCA9ICgodmFsdWUgJiAweGYwMDApID4+IDEyKSAtIChBcHdyZGVsdGEpOwogCQkJZWxzZQogCQkJCXQ0ID0gMDsKIAkJfQotCQlBZGF0YSB8PSAoKHQxPDwxNikgKyAodDI8PDIwKSArICh0Mzw8MjQpICsgKHQ0PDwyOCkpOwotCQlpZiAoYkdwd3JkZWx0YU1pbnVzID09IEZBTFNFKQotCQl7Ci0JCQl0MSA9ICh2YWx1ZSYweGYpKyhHcHdyZGVsdGEpOworCQlBZGF0YSB8PSAoKHQxIDw8IDE2KSArICh0MiA8PCAyMCkgKyAodDMgPDwgMjQpICsgKHQ0IDw8IDI4KSk7CisJCWlmIChiR3B3cmRlbHRhTWludXMgPT0gRkFMU0UpIHsKKwkJCXQxID0gKHZhbHVlICYgMHhmKSArIChHcHdyZGVsdGEpOwogCQkJaWYgKHQxID4gMHhmKQogCQkJCXQxID0gMHhmOwotCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoR3B3cmRlbHRhKTsKKwkJCXQyID0gKCh2YWx1ZSAmIDB4ZjApID4+IDQpICsgKEdwd3JkZWx0YSk7CiAJCQlpZiAodDIgPiAweGYpCiAJCQkJdDIgPSAweGY7Ci0JCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoR3B3cmRlbHRhKTsKKwkJCXQzID0gKCh2YWx1ZSAmIDB4ZjAwKSA+PiA4KSArIChHcHdyZGVsdGEpOwogCQkJaWYgKHQzID4gMHhmKQogCQkJCXQzID0gMHhmOwotCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoR3B3cmRlbHRhKTsKKwkJCXQ0ID0gKCh2YWx1ZSAmIDB4ZjAwMCkgPj4gMTIpICsgKEdwd3JkZWx0YSk7CiAJCQlpZiAodDQgPiAweGYpCiAJCQkJdDQgPSAweGY7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAoKHZhbHVlJjB4ZikgPiBHcHdyZGVsdGEpCi0JCQkJdDEgPSAodmFsdWUmMHhmKS0oR3B3cmRlbHRhKTsKKwkJfSBlbHNlIHsKKwkJCWlmICgodmFsdWUgJiAweGYpID4gR3B3cmRlbHRhKQorCQkJCXQxID0gKHZhbHVlICYgMHhmKSAtIChHcHdyZGVsdGEpOwogCQkJZWxzZQogCQkJCXQxID0gMDsKLQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEdwd3JkZWx0YSkKLQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShHcHdyZGVsdGEpOworCQkJaWYgKCgodmFsdWUgJiAweGYwKSA+PiA0KSA+IEdwd3JkZWx0YSkKKwkJCQl0MiA9ICgodmFsdWUgJiAweGYwKSA+PiA0KSAtIChHcHdyZGVsdGEpOwogCQkJZWxzZQogCQkJCXQyID0gMDsKLQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBHcHdyZGVsdGEpCi0JCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEdwd3JkZWx0YSk7CisJCQlpZiAoKCh2YWx1ZSAmIDB4ZjAwKSA+PiA4KSA+IEdwd3JkZWx0YSkKKwkJCQl0MyA9ICgodmFsdWUgJiAweGYwMCkgPj4gOCkgLSAoR3B3cmRlbHRhKTsKIAkJCWVsc2UKIAkJCQl0MyA9IDA7Ci0JCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBHcHdyZGVsdGEpCi0JCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oR3B3cmRlbHRhKTsKKwkJCWlmICgoKHZhbHVlICYgMHhmMDAwKSA+PiAxMikgPiBHcHdyZGVsdGEpCisJCQkJdDQgPSAoKHZhbHVlICYgMHhmMDAwKSA+PiAxMikgLSAoR3B3cmRlbHRhKTsKIAkJCWVsc2UKIAkJCQl0NCA9IDA7CiAJCX0KLQkJR2RhdGEgfD0gKCh0MTw8MTYpICsgKHQyPDwyMCkgKyAodDM8PDI0KSArICh0NDw8MjgpKTsKLQkJZGF0YSB8PSAodmFsdWU8PDE2KTsKKwkJR2RhdGEgfD0gKCh0MSA8PCAxNikgKyAodDIgPDwgMjApICsgKHQzIDw8IDI0KSArICh0NCA8PCAyOCkpOworCQlkYXRhIHw9ICh2YWx1ZSA8PCAxNik7CiAKLQkJcEFkLT5UeDIwTVB3ckNmZ0FCYW5kW2ldID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kW2ldID0gQWRhdGE7Ci0JCXBBZC0+VHgyME1Qd3JDZmdHQmFuZFtpXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFtpXSA9IEdkYXRhOworCQkvKiBGb3IgMjBNLzQwTSBQb3dlciBEZWx0YSBpc3N1ZSAqLworCQlwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbaV0gPSBkYXRhOworCQlwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbaV0gPSBkYXRhOworCQlwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbaV0gPSBBZGF0YTsKKwkJcEFkLT5UeDQwTVB3ckNmZ0dCYW5kW2ldID0gR2RhdGE7CiAKIAkJaWYgKGRhdGEgIT0gMHhmZmZmZmZmZikKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgZGF0YSk7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIyME1IeiBCVywgMi40RyBiYW5kLSVseCwgIEFkYXRhID0gJWx4LCAgR2RhdGEgPSAlbHggXG4iLCBkYXRhLCBBZGF0YSwgR2RhdGEpKTsKLQl9Ci0KLQkvLwotCS8vIENoZWNrIHRoaXMgYmxvY2sgaXMgdmFsaWQgZm9yIDQwTUh6IGluIDIuNEcuIElmIGludmFsaWQsIHVzZSBwYXJhbWV0ZXIgZm9yIDIwTUh6IGluIDIuNEcKLQkvLwotCWJWYWxpZCA9IFRSVUU7Ci0JZm9yIChpPTA7IGk8NjsgaSsrKQotCXsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfNDBNSFpfMl80RyArIDIgKyBpKjIsIHZhbHVlKTsKLQkJaWYgKCgodmFsdWUgJiAweDAwRkYpID09IDB4MDBGRikgfHwgKCh2YWx1ZSAmIDB4RkYwMCkgPT0gMHhGRjAwKSkKLQkJewotCQkJYlZhbGlkID0gRkFMU0U7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8vCi0JLy8gR2V0IFR4cG93ZXIgcGVyIE1DUyBmb3IgNDBNSHogaW4gMi40Ry4KLQkvLwotCWlmIChiVmFsaWQpCi0JewotCQlmb3IgKGk9MDsgaTw0OyBpKyspCi0JCXsKLQkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzJfNEcgKyBpKjQsIHZhbHVlKTsKLQkJCWlmIChiR3B3cmRlbHRhTWludXMgPT0gRkFMU0UpCi0JCQl7Ci0JCQkJdDEgPSAodmFsdWUmMHhmKSsoR3B3cmRlbHRhKTsKLQkJCQlpZiAodDEgPiAweGYpCi0JCQkJCXQxID0gMHhmOwotCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEdwd3JkZWx0YSk7Ci0JCQkJaWYgKHQyID4gMHhmKQotCQkJCQl0MiA9IDB4ZjsKLQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoR3B3cmRlbHRhKTsKLQkJCQlpZiAodDMgPiAweGYpCi0JCQkJCXQzID0gMHhmOwotCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEdwd3JkZWx0YSk7Ci0JCQkJaWYgKHQ0ID4gMHhmKQotCQkJCQl0NCA9IDB4ZjsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAoKHZhbHVlJjB4ZikgPiBHcHdyZGVsdGEpCi0JCQkJCXQxID0gKHZhbHVlJjB4ZiktKEdwd3JkZWx0YSk7Ci0JCQkJZWxzZQotCQkJCQl0MSA9IDA7Ci0JCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gR3B3cmRlbHRhKQotCQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShHcHdyZGVsdGEpOwotCQkJCWVsc2UKLQkJCQkJdDIgPSAwOwotCQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBHcHdyZGVsdGEpCi0JCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShHcHdyZGVsdGEpOwotCQkJCWVsc2UKLQkJCQkJdDMgPSAwOwotCQkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEdwd3JkZWx0YSkKLQkJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oR3B3cmRlbHRhKTsKLQkJCQllbHNlCi0JCQkJCXQ0ID0gMDsKLQkJCX0KLQkJCUdkYXRhID0gdDEgKyAodDI8PDQpICsgKHQzPDw4KSArICh0NDw8MTIpOwotCi0JCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl8yXzRHICsgaSo0ICsgMiwgdmFsdWUpOwotCQkJaWYgKGJHcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKLQkJCXsKLQkJCQl0MSA9ICh2YWx1ZSYweGYpKyhHcHdyZGVsdGEpOwotCQkJCWlmICh0MSA+IDB4ZikKLQkJCQkJdDEgPSAweGY7Ci0JCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoR3B3cmRlbHRhKTsKLQkJCQlpZiAodDIgPiAweGYpCi0JCQkJCXQyID0gMHhmOwotCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhHcHdyZGVsdGEpOwotCQkJCWlmICh0MyA+IDB4ZikKLQkJCQkJdDMgPSAweGY7Ci0JCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoR3B3cmRlbHRhKTsKLQkJCQlpZiAodDQgPiAweGYpCi0JCQkJCXQ0ID0gMHhmOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmICgodmFsdWUmMHhmKSA+IEdwd3JkZWx0YSkKLQkJCQkJdDEgPSAodmFsdWUmMHhmKS0oR3B3cmRlbHRhKTsKLQkJCQllbHNlCi0JCQkJCXQxID0gMDsKLQkJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBHcHdyZGVsdGEpCi0JCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEdwd3JkZWx0YSk7Ci0JCQkJZWxzZQotCQkJCQl0MiA9IDA7Ci0JCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEdwd3JkZWx0YSkKLQkJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEdwd3JkZWx0YSk7Ci0JCQkJZWxzZQotCQkJCQl0MyA9IDA7Ci0JCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gR3B3cmRlbHRhKQotCQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShHcHdyZGVsdGEpOwotCQkJCWVsc2UKLQkJCQkJdDQgPSAwOwotCQkJfQotCQkJR2RhdGEgfD0gKCh0MTw8MTYpICsgKHQyPDwyMCkgKyAodDM8PDI0KSArICh0NDw8MjgpKTsKLQotCQkJaWYgKGkgPT0gMCkKLQkJCQlwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbaSsxXSA9IChwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbaSsxXSAmIDB4MDAwMEZGRkYpIHwgKEdkYXRhICYgMHhGRkZGMDAwMCk7Ci0JCQllbHNlCi0JCQkJcEFkLT5UeDQwTVB3ckNmZ0dCYW5kW2krMV0gPSBHZGF0YTsKLQotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIjQwTUh6IEJXLCAyLjRHIGJhbmQsIEdkYXRhID0gJWx4IFxuIiwgR2RhdGEpKTsKLQkJfQotCX0KLQotCS8vCi0JLy8gQ2hlY2sgdGhpcyBibG9jayBpcyB2YWxpZCBmb3IgMjBNSHogaW4gNUcuIElmIGludmFsaWQsIHVzZSBwYXJhbWV0ZXIgZm9yIDIwTUh6IGluIDIuNEcKLQkvLwotCWJWYWxpZCA9IFRSVUU7Ci0JZm9yIChpPTA7IGk8ODsgaSsrKQotCXsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfNUcgKyAyICsgaSoyLCB2YWx1ZSk7Ci0JCWlmICgoKHZhbHVlICYgMHgwMEZGKSA9PSAweDAwRkYpIHx8ICgodmFsdWUgJiAweEZGMDApID09IDB4RkYwMCkpCi0JCXsKLQkJCWJWYWxpZCA9IEZBTFNFOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvLwotCS8vIEdldCBUeHBvd2VyIHBlciBNQ1MgZm9yIDIwTUh6IGluIDVHLgotCS8vCi0JaWYgKGJWYWxpZCkKLQl7Ci0JCWZvciAoaT0wOyBpPDU7IGkrKykKLQkJewotCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfNUcgKyBpKjQsIHZhbHVlKTsKLQkJCWlmIChiQXB3cmRlbHRhTWludXMgPT0gRkFMU0UpCi0JCQl7Ci0JCQkJdDEgPSAodmFsdWUmMHhmKSsoQXB3cmRlbHRhKTsKLQkJCQlpZiAodDEgPiAweGYpCi0JCQkJCXQxID0gMHhmOwotCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEFwd3JkZWx0YSk7Ci0JCQkJaWYgKHQyID4gMHhmKQotCQkJCQl0MiA9IDB4ZjsKLQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoQXB3cmRlbHRhKTsKLQkJCQlpZiAodDMgPiAweGYpCi0JCQkJCXQzID0gMHhmOwotCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEFwd3JkZWx0YSk7Ci0JCQkJaWYgKHQ0ID4gMHhmKQotCQkJCQl0NCA9IDB4ZjsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAoKHZhbHVlJjB4ZikgPiBBcHdyZGVsdGEpCi0JCQkJCXQxID0gKHZhbHVlJjB4ZiktKEFwd3JkZWx0YSk7Ci0JCQkJZWxzZQotCQkJCQl0MSA9IDA7Ci0JCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gQXB3cmRlbHRhKQotCQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShBcHdyZGVsdGEpOwotCQkJCWVsc2UKLQkJCQkJdDIgPSAwOwotCQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBBcHdyZGVsdGEpCi0JCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShBcHdyZGVsdGEpOwotCQkJCWVsc2UKLQkJCQkJdDMgPSAwOwotCQkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEFwd3JkZWx0YSkKLQkJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oQXB3cmRlbHRhKTsKLQkJCQllbHNlCi0JCQkJCXQ0ID0gMDsKLQkJCX0KLQkJCUFkYXRhID0gdDEgKyAodDI8PDQpICsgKHQzPDw4KSArICh0NDw8MTIpOwotCi0JCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV8yME1IWl81RyArIGkqNCArIDIsIHZhbHVlKTsKLQkJCWlmIChiQXB3cmRlbHRhTWludXMgPT0gRkFMU0UpCi0JCQl7Ci0JCQkJdDEgPSAodmFsdWUmMHhmKSsoQXB3cmRlbHRhKTsKLQkJCQlpZiAodDEgPiAweGYpCi0JCQkJCXQxID0gMHhmOwotCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEFwd3JkZWx0YSk7Ci0JCQkJaWYgKHQyID4gMHhmKQotCQkJCQl0MiA9IDB4ZjsKLQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoQXB3cmRlbHRhKTsKLQkJCQlpZiAodDMgPiAweGYpCi0JCQkJCXQzID0gMHhmOwotCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEFwd3JkZWx0YSk7Ci0JCQkJaWYgKHQ0ID4gMHhmKQotCQkJCQl0NCA9IDB4ZjsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAoKHZhbHVlJjB4ZikgPiBBcHdyZGVsdGEpCi0JCQkJCXQxID0gKHZhbHVlJjB4ZiktKEFwd3JkZWx0YSk7Ci0JCQkJZWxzZQotCQkJCQl0MSA9IDA7Ci0JCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gQXB3cmRlbHRhKQotCQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShBcHdyZGVsdGEpOwotCQkJCWVsc2UKLQkJCQkJdDIgPSAwOwotCQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBBcHdyZGVsdGEpCi0JCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShBcHdyZGVsdGEpOwotCQkJCWVsc2UKLQkJCQkJdDMgPSAwOwotCQkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEFwd3JkZWx0YSkKLQkJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oQXB3cmRlbHRhKTsKLQkJCQllbHNlCi0JCQkJCXQ0ID0gMDsKLQkJCX0KLQkJCUFkYXRhIHw9ICgodDE8PDE2KSArICh0Mjw8MjApICsgKHQzPDwyNCkgKyAodDQ8PDI4KSk7Ci0KLQkJCWlmIChpID09IDApCi0JCQkJcEFkLT5UeDIwTVB3ckNmZ0FCYW5kW2ldID0gKHBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSAmIDB4MDAwMEZGRkYpIHwgKEFkYXRhICYgMHhGRkZGMDAwMCk7Ci0JCQllbHNlCi0JCQkJcEFkLT5UeDIwTVB3ckNmZ0FCYW5kW2ldID0gQWRhdGE7Ci0KLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIyME1IeiBCVywgNUdIeiBiYW5kLCBBZGF0YSA9ICVseCBcbiIsIEFkYXRhKSk7Ci0JCX0KLQl9Ci0KLQkvLwotCS8vIENoZWNrIHRoaXMgYmxvY2sgaXMgdmFsaWQgZm9yIDQwTUh6IGluIDVHLiBJZiBpbnZhbGlkLCB1c2UgcGFyYW1ldGVyIGZvciAyME1IeiBpbiAyLjRHCi0JLy8KLQliVmFsaWQgPSBUUlVFOwotCWZvciAoaT0wOyBpPDY7IGkrKykKLQl7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzVHICsgMiArIGkqMiwgdmFsdWUpOwotCQlpZiAoKCh2YWx1ZSAmIDB4MDBGRikgPT0gMHgwMEZGKSB8fCAoKHZhbHVlICYgMHhGRjAwKSA9PSAweEZGMDApKQotCQl7Ci0JCQliVmFsaWQgPSBGQUxTRTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLy8KLQkvLyBHZXQgVHhwb3dlciBwZXIgTUNTIGZvciA0ME1IeiBpbiA1Ry4KLQkvLwotCWlmIChiVmFsaWQpCi0JewotCQlmb3IgKGk9MDsgaTw0OyBpKyspCi0JCXsKLQkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzVHICsgaSo0LCB2YWx1ZSk7Ci0JCQlpZiAoYkFwd3JkZWx0YU1pbnVzID09IEZBTFNFKQotCQkJewotCQkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7Ci0JCQkJaWYgKHQxID4gMHhmKQotCQkJCQl0MSA9IDB4ZjsKLQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOwotCQkJCWlmICh0MiA+IDB4ZikKLQkJCQkJdDIgPSAweGY7Ci0JCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7Ci0JCQkJaWYgKHQzID4gMHhmKQotCQkJCQl0MyA9IDB4ZjsKLQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOwotCQkJCWlmICh0NCA+IDB4ZikKLQkJCQkJdDQgPSAweGY7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQotCQkJCQl0MSA9ICh2YWx1ZSYweGYpLShBcHdyZGVsdGEpOwotCQkJCWVsc2UKLQkJCQkJdDEgPSAwOwotCQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEFwd3JkZWx0YSkKLQkJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oQXB3cmRlbHRhKTsKLQkJCQllbHNlCi0JCQkJCXQyID0gMDsKLQkJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gQXB3cmRlbHRhKQotCQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKLQkJCQllbHNlCi0JCQkJCXQzID0gMDsKLQkJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCi0JCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEFwd3JkZWx0YSk7Ci0JCQkJZWxzZQotCQkJCQl0NCA9IDA7Ci0JCQl9Ci0JCQlBZGF0YSA9IHQxICsgKHQyPDw0KSArICh0Mzw8OCkgKyAodDQ8PDEyKTsKLQotCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfNDBNSFpfNUcgKyBpKjQgKyAyLCB2YWx1ZSk7Ci0JCQlpZiAoYkFwd3JkZWx0YU1pbnVzID09IEZBTFNFKQotCQkJewotCQkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7Ci0JCQkJaWYgKHQxID4gMHhmKQotCQkJCQl0MSA9IDB4ZjsKLQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOwotCQkJCWlmICh0MiA+IDB4ZikKLQkJCQkJdDIgPSAweGY7Ci0JCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7Ci0JCQkJaWYgKHQzID4gMHhmKQotCQkJCQl0MyA9IDB4ZjsKLQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOwotCQkJCWlmICh0NCA+IDB4ZikKLQkJCQkJdDQgPSAweGY7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQotCQkJCQl0MSA9ICh2YWx1ZSYweGYpLShBcHdyZGVsdGEpOwotCQkJCWVsc2UKLQkJCQkJdDEgPSAwOwotCQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEFwd3JkZWx0YSkKLQkJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oQXB3cmRlbHRhKTsKLQkJCQllbHNlCi0JCQkJCXQyID0gMDsKLQkJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gQXB3cmRlbHRhKQotCQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKLQkJCQllbHNlCi0JCQkJCXQzID0gMDsKLQkJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCi0JCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEFwd3JkZWx0YSk7Ci0JCQkJZWxzZQotCQkJCQl0NCA9IDA7Ci0JCQl9Ci0JCQlBZGF0YSB8PSAoKHQxPDwxNikgKyAodDI8PDIwKSArICh0Mzw8MjQpICsgKHQ0PDwyOCkpOwotCi0JCQlpZiAoaSA9PSAwKQotCQkJCXBBZC0+VHg0ME1Qd3JDZmdBQmFuZFtpKzFdID0gKHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFtpKzFdICYgMHgwMDAwRkZGRikgfCAoQWRhdGEgJiAweEZGRkYwMDAwKTsKLQkJCWVsc2UKLQkJCQlwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbaSsxXSA9IEFkYXRhOwotCi0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiNDBNSHogQlcsIDVHSHogYmFuZCwgQWRhdGEgPSAlbHggXG4iLCBBZGF0YSkpOwotCQl9CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QV1JfQ0ZHXzAgKyBpICogNCwgZGF0YSk7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCSAgICAgKCIyME1IeiBCVywgMi40RyBiYW5kLSVseCwgIEFkYXRhID0gJWx4LCAgR2RhdGEgPSAlbHggXG4iLAorCQkJICAgICAgZGF0YSwgQWRhdGEsIEdkYXRhKSk7CiAJfQogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTgyMSwyMyArNDQxLDIzIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUTVBSZWFkQ2hhbm5lbFB3cigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3ZvaWQgUlRNUFJlYWRDaGFubmVsUHdyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlVQ0hBUgkJCQlpLCBjaG9mZnNldDsKLQlFRVBST01fVFhfUFdSX1NUUlVDCSAgICBQb3dlcjsKLQlFRVBST01fVFhfUFdSX1NUUlVDCSAgICBQb3dlcjI7CisJdTggaSwgY2hvZmZzZXQ7CisJRUVQUk9NX1RYX1BXUl9TVFJVQyBQb3dlcjsKKwlFRVBST01fVFhfUFdSX1NUUlVDIFBvd2VyMjsKIAotCS8vIFJlYWQgVHggcG93ZXIgdmFsdWUgZm9yIGFsbCBjaGFubmVscwotCS8vIFZhbHVlIGZyb20gMSAtIDB4N2YuIERlZmF1bHQgdmFsdWUgaXMgMjQuCi0JLy8gUG93ZXIgdmFsdWUgOiAyLjRHIDB4MDAgKDApIH4gMHgxRiAoMzEpCi0JLy8gICAgICAgICAgICAgOiA1LjVHIDB4RjkgKC03KSB+IDB4MEYgKDE1KQorCS8qIFJlYWQgVHggcG93ZXIgdmFsdWUgZm9yIGFsbCBjaGFubmVscyAqLworCS8qIFZhbHVlIGZyb20gMSAtIDB4N2YuIERlZmF1bHQgdmFsdWUgaXMgMjQuICovCisJLyogUG93ZXIgdmFsdWUgOiAyLjRHIDB4MDAgKDApIH4gMHgxRiAoMzEpICovCisJLyogICAgICAgICAgICAgOiA1LjVHIDB4RjkgKC03KSB+IDB4MEYgKDE1KSAqLwogCi0JLy8gMC4gMTFiL2csIGNoMSAtIGNoIDE0Ci0JZm9yIChpID0gMDsgaSA8IDc7IGkrKykKLQl7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0dfVFhfUFdSX09GRlNFVCArIGkgKiAyLCBQb3dlci53b3JkKTsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fR19UWDJfUFdSX09GRlNFVCArIGkgKiAyLCBQb3dlcjIud29yZCk7CisJLyogMC4gMTFiL2csIGNoMSAtIGNoIDE0ICovCisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9HX1RYX1BXUl9PRkZTRVQgKyBpICogMiwKKwkJCQkgICAgIFBvd2VyLndvcmQpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9HX1RYMl9QV1JfT0ZGU0VUICsgaSAqIDIsCisJCQkJICAgICBQb3dlcjIud29yZCk7CiAJCXBBZC0+VHhQb3dlcltpICogMl0uQ2hhbm5lbCA9IGkgKiAyICsgMTsKIAkJcEFkLT5UeFBvd2VyW2kgKiAyICsgMV0uQ2hhbm5lbCA9IGkgKiAyICsgMjsKIApAQCAtODYyLDEyNSArNDgyLDE0OSBAQAogCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgMV0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUxOwogCX0KIAotCS8vIDEuIFUtTklJIGxvd2VyL21pZGRsZSBiYW5kOiAzNiwgMzgsIDQwOyA0NCwgNDYsIDQ4OyA1MiwgNTQsIDU2OyA2MCwgNjIsIDY0IChpbmNsdWRpbmcgY2VudHJhbCBmcmVxdWVuY3kgaW4gQlcgNDBNSHopCi0JLy8gMS4xIEZpbGwgdXAgY2hhbm5lbAorCS8qIDEuIFUtTklJIGxvd2VyL21pZGRsZSBiYW5kOiAzNiwgMzgsIDQwOyA0NCwgNDYsIDQ4OyA1MiwgNTQsIDU2OyA2MCwgNjIsIDY0IChpbmNsdWRpbmcgY2VudHJhbCBmcmVxdWVuY3kgaW4gQlcgNDBNSHopICovCisJLyogMS4xIEZpbGwgdXAgY2hhbm5lbCAqLwogCWNob2Zmc2V0ID0gMTQ7Ci0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLQl7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbAk9IDM2ICsgaSAqIDggKyAwOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5DaGFubmVsID0gMzYgKyBpICogOCArIDA7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CiAKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5DaGFubmVsCT0gMzYgKyBpICogOCArIDI7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uQ2hhbm5lbCA9IDM2ICsgaSAqIDggKyAyOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOwogCi0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uQ2hhbm5lbAk9IDM2ICsgaSAqIDggKyA0OwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLkNoYW5uZWwgPSAzNiArIGkgKiA4ICsgNDsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKIAl9CiAKLQkvLyAxLjIgRmlsbCB1cCBwb3dlcgotCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JewotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgKyBpICogMiwgUG93ZXIud29yZCk7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgKyBpICogMiwgUG93ZXIyLndvcmQpOworCS8qIDEuMiBGaWxsIHVwIHBvd2VyICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgKyBpICogMiwKKwkJCQkgICAgIFBvd2VyLndvcmQpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICsgaSAqIDIsCisJCQkJICAgICBQb3dlcjIud29yZCk7CiAKIAkJaWYgKChQb3dlci5maWVsZC5CeXRlMCA8IDE2KSAmJiAoUG93ZXIuZmllbGQuQnl0ZTAgPj0gLTcpKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlciA9CisJCQkgICAgUG93ZXIuZmllbGQuQnl0ZTA7CiAKIAkJaWYgKChQb3dlci5maWVsZC5CeXRlMSA8IDE2KSAmJiAoUG93ZXIuZmllbGQuQnl0ZTEgPj0gLTcpKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlciA9CisJCQkgICAgUG93ZXIuZmllbGQuQnl0ZTE7CiAKIAkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMCA+PSAtNykpCi0JCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMDsKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIyID0KKwkJCSAgICBQb3dlcjIuZmllbGQuQnl0ZTA7CiAKIAkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTEgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMSA+PSAtNykpCi0JCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMTsKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIyID0KKwkJCSAgICBQb3dlcjIuZmllbGQuQnl0ZTE7CiAJfQogCi0JLy8gMi4gSGlwcGVyTEFOIDIgMTAwLCAxMDIgLDEwNDsgMTA4LCAxMTAsIDExMjsgMTE2LCAxMTgsIDEyMDsgMTI0LCAxMjYsIDEyODsgMTMyLCAxMzQsIDEzNjsgMTQwIChpbmNsdWRpbmcgY2VudHJhbCBmcmVxdWVuY3kgaW4gQlcgNDBNSHopCi0JLy8gMi4xIEZpbGwgdXAgY2hhbm5lbAorCS8qIDIuIEhpcHBlckxBTiAyIDEwMCwgMTAyICwxMDQ7IDEwOCwgMTEwLCAxMTI7IDExNiwgMTE4LCAxMjA7IDEyNCwgMTI2LCAxMjg7IDEzMiwgMTM0LCAxMzY7IDE0MCAoaW5jbHVkaW5nIGNlbnRyYWwgZnJlcXVlbmN5IGluIEJXIDQwTUh6KSAqLworCS8qIDIuMSBGaWxsIHVwIGNoYW5uZWwgKi8KIAljaG9mZnNldCA9IDE0ICsgMTI7Ci0JZm9yIChpID0gMDsgaSA8IDU7IGkrKykKLQl7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbAk9IDEwMCArIGkgKiA4ICsgMDsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbCA9IDEwMCArIGkgKiA4ICsgMDsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKIAotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLkNoYW5uZWwJPSAxMDAgKyBpICogOCArIDI7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uQ2hhbm5lbCA9IDEwMCArIGkgKiA4ICsgMjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKIAotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLkNoYW5uZWwJPSAxMDAgKyBpICogOCArIDQ7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uQ2hhbm5lbCA9IDEwMCArIGkgKiA4ICsgNDsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKIAl9Ci0JcEFkLT5UeFBvd2VyWzMgKiA1ICsgY2hvZmZzZXQgKyAwXS5DaGFubmVsCQk9IDE0MDsKLQlwQWQtPlR4UG93ZXJbMyAqIDUgKyBjaG9mZnNldCArIDBdLlBvd2VyCQk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JcEFkLT5UeFBvd2VyWzMgKiA1ICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIJCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwlwQWQtPlR4UG93ZXJbMyAqIDUgKyBjaG9mZnNldCArIDBdLkNoYW5uZWwgPSAxNDA7CisJcEFkLT5UeFBvd2VyWzMgKiA1ICsgY2hvZmZzZXQgKyAwXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJcEFkLT5UeFBvd2VyWzMgKiA1ICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOwogCi0JLy8gMi4yIEZpbGwgdXAgcG93ZXIKLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCXsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWF9QV1JfT0ZGU0VUICsgKGNob2Zmc2V0IC0gMTQpICsgaSAqIDIsIFBvd2VyLndvcmQpOwotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICsgKGNob2Zmc2V0IC0gMTQpICsgaSAqIDIsIFBvd2VyMi53b3JkKTsKKwkvKiAyLjIgRmlsbCB1cCBwb3dlciAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLAorCQkJCSAgICAgRUVQUk9NX0FfVFhfUFdSX09GRlNFVCArIChjaG9mZnNldCAtIDE0KSArCisJCQkJICAgICBpICogMiwgUG93ZXIud29yZCk7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwKKwkJCQkgICAgIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICsgKGNob2Zmc2V0IC0gMTQpICsKKwkJCQkgICAgIGkgKiAyLCBQb3dlcjIud29yZCk7CiAKIAkJaWYgKChQb3dlci5maWVsZC5CeXRlMCA8IDE2KSAmJiAoUG93ZXIuZmllbGQuQnl0ZTAgPj0gLTcpKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlciA9CisJCQkgICAgUG93ZXIuZmllbGQuQnl0ZTA7CiAKIAkJaWYgKChQb3dlci5maWVsZC5CeXRlMSA8IDE2KSAmJiAoUG93ZXIuZmllbGQuQnl0ZTEgPj0gLTcpKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlciA9CisJCQkgICAgUG93ZXIuZmllbGQuQnl0ZTE7CiAKIAkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMCA+PSAtNykpCi0JCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMDsKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIyID0KKwkJCSAgICBQb3dlcjIuZmllbGQuQnl0ZTA7CiAKIAkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTEgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMSA+PSAtNykpCi0JCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMTsKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIyID0KKwkJCSAgICBQb3dlcjIuZmllbGQuQnl0ZTE7CiAJfQogCi0JLy8gMy4gVS1OSUkgdXBwZXIgYmFuZDogMTQ5LCAxNTEsIDE1MzsgMTU3LCAxNTksIDE2MTsgMTY1IChpbmNsdWRpbmcgY2VudHJhbCBmcmVxdWVuY3kgaW4gQlcgNDBNSHopCi0JLy8gMy4xIEZpbGwgdXAgY2hhbm5lbAorCS8qIDMuIFUtTklJIHVwcGVyIGJhbmQ6IDE0OSwgMTUxLCAxNTM7IDE1NywgMTU5LCAxNjE7IDE2NSwgMTY3LCAxNjk7IDE3MSwgMTczIChpbmNsdWRpbmcgY2VudHJhbCBmcmVxdWVuY3kgaW4gQlcgNDBNSHopICovCisJLyogMy4xIEZpbGwgdXAgY2hhbm5lbCAqLwogCWNob2Zmc2V0ID0gMTQgKyAxMiArIDE2OwotCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0JewotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLkNoYW5uZWwJPSAxNDkgKyBpICogOCArIDA7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJLypmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSAqLworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5DaGFubmVsID0gMTQ5ICsgaSAqIDggKyAwOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOwogCi0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uQ2hhbm5lbAk9IDE0OSArIGkgKiA4ICsgMjsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5DaGFubmVsID0gMTQ5ICsgaSAqIDggKyAyOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOwogCi0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uQ2hhbm5lbAk9IDE0OSArIGkgKiA4ICsgNDsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5DaGFubmVsID0gMTQ5ICsgaSAqIDggKyA0OworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOwogCX0KLQlwQWQtPlR4UG93ZXJbMyAqIDIgKyBjaG9mZnNldCArIDBdLkNoYW5uZWwJCT0gMTY1OwotCXBBZC0+VHhQb3dlclszICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIJCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQlwQWQtPlR4UG93ZXJbMyAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMgkJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCXBBZC0+VHhQb3dlclszICogMyArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbCA9IDE3MTsKKwlwQWQtPlR4UG93ZXJbMyAqIDMgKyBjaG9mZnNldCArIDBdLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwlwQWQtPlR4UG93ZXJbMyAqIDMgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CiAKLQkvLyAzLjIgRmlsbCB1cCBwb3dlcgotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JewotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMiwgUG93ZXIud29yZCk7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMiwgUG93ZXIyLndvcmQpOworCXBBZC0+VHhQb3dlclszICogMyArIGNob2Zmc2V0ICsgMV0uQ2hhbm5lbCA9IDE3MzsKKwlwQWQtPlR4UG93ZXJbMyAqIDMgKyBjaG9mZnNldCArIDFdLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwlwQWQtPlR4UG93ZXJbMyAqIDMgKyBjaG9mZnNldCArIDFdLlBvd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkvKiAzLjIgRmlsbCB1cCBwb3dlciAqLworCS8qZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwKKwkJCQkgICAgIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKworCQkJCSAgICAgaSAqIDIsIFBvd2VyLndvcmQpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsCisJCQkJICAgICBFRVBST01fQV9UWDJfUFdSX09GRlNFVCArIChjaG9mZnNldCAtIDE0KSArCisJCQkJICAgICBpICogMiwgUG93ZXIyLndvcmQpOwogCiAJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUwID49IC03KSkKLQkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPQorCQkJICAgIFBvd2VyLmZpZWxkLkJ5dGUwOwogCiAJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTEgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUxID49IC03KSkKLQkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIgPQorCQkJICAgIFBvd2VyLmZpZWxkLkJ5dGUxOwogCiAJCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUwIDwgMTYpICYmIChQb3dlcjIuZmllbGQuQnl0ZTAgPj0gLTcpKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTA7CisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9CisJCQkgICAgUG93ZXIyLmZpZWxkLkJ5dGUwOwogCiAJCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlcjIuZmllbGQuQnl0ZTEgPj0gLTcpKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTE7CisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyMiA9CisJCQkgICAgUG93ZXIyLmZpZWxkLkJ5dGUxOwogCX0KIAotCS8vIDQuIFByaW50IGFuZCBEZWJ1ZwotCWNob2Zmc2V0ID0gMTQgKyAxMiArIDE2ICsgNzsKKwkvKiA0LiBQcmludCBhbmQgRGVidWcgKi8KKwkvKmNob2Zmc2V0ID0gMTQgKyAxMiArIDE2ICsgNzsgKi8KKwljaG9mZnNldCA9IDE0ICsgMTIgKyAxNiArIDExOworCiB9CiAKIC8qCkBAIC0xMDA2LDI3OCArNjUwLDE0IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1ORElTX1NUQVRVUwlOSUNSZWFkUmVnUGFyYW1ldGVycygKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JTkRJU19IQU5ETEUJCQlXcmFwcGVyQ29uZmlndXJhdGlvbkNvbnRleHQKLQkpCitpbnQgTklDUmVhZFJlZ1BhcmFtZXRlcnMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSB2b2lkICpXcmFwcGVyQ29uZmlndXJhdGlvbkNvbnRleHQpCiB7Ci0JTkRJU19TVEFUVVMJCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCWludCBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCURCR1BSSU5UX1MoU3RhdHVzLCAoIjwtLSBOSUNSZWFkUmVnUGFyYW1ldGVycywgU3RhdHVzPSV4XG4iLCBTdGF0dXMpKTsKIAlyZXR1cm4gU3RhdHVzOwogfQogCi0KLSNpZmRlZiBSVDI4NzAKLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlGb3IgUkYgZmlsdGVyIGNhbGlicmF0aW9uIHB1cnBvc2UKLQotCUFyZ3VtZW50czoKLQkJcEFkICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUTVBGaWx0ZXJDYWxpYnJhdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlVQ0hBUglSNTV4ID0gMCwgdmFsdWUsIEZpbHRlclRhcmdldCA9IDB4MUUsIEJCUFZhbHVlPTA7Ci0JVUlOVAlsb29wID0gMCwgY291bnQgPSAwLCBsb29wY250ID0gMCwgUmVUcnkgPSAwOwotCVVDSEFSCVJGX1IyNF9WYWx1ZSA9IDA7Ci0KLQkvLyBHaXZlIGJicCBmaWx0ZXIgaW5pdGlhbCB2YWx1ZQotI2lmbmRlZiBSVDI4NzAKLQlwQWQtPk1sbWUuQ2FsaUJXMjBSZlIyNCA9IDB4MTY7Ci0JcEFkLT5NbG1lLkNhbGlCVzQwUmZSMjQgPSAweDM2OyAgLy9CaXRbNV0gbXVzdCBiZSAxIGZvciBCVyA0MAotI2Vsc2UKLQlwQWQtPk1sbWUuQ2FsaUJXMjBSZlIyNCA9IDB4MUY7Ci0JcEFkLT5NbG1lLkNhbGlCVzQwUmZSMjQgPSAweDJGOyAvL0JpdFs1XSBtdXN0IGJlIDEgZm9yIEJXIDQwCi0jZW5kaWYKLQlkbwotCXsKLQkJaWYgKGxvb3AgPT0gMSkJLy9CYW5kV2lkdGggPSA0MCBNSHoKLQkJewotCQkJLy8gV3JpdGUgMHgyNyB0byBSRl9SMjQgdG8gcHJvZ3JhbSBmaWx0ZXIKLQkJCVJGX1IyNF9WYWx1ZSA9IDB4Mjc7Ci0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjQsIFJGX1IyNF9WYWx1ZSk7Ci0JCQlpZiAoSVNfUlQzMDkwKHBBZCkpCi0JCQkJRmlsdGVyVGFyZ2V0ID0gMHgxNTsKLQkJCWVsc2UKLQkJCQlGaWx0ZXJUYXJnZXQgPSAweDE5OwotCi0JCQkvLyB3aGVuIGNhbGlicmF0ZSBCVzQwLCBCQlAgbWFzayBtdXN0IHNldCB0byBCVzQwLgotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOwotCQkJQkJQVmFsdWUmPSAofjB4MTgpOwotCQkJQkJQVmFsdWV8PSAoMHgxMCk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7Ci0jaWZkZWYgUlQyODcwCi0JCQkvLyBzZXQgdG8gQlc0MAotCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMzEsICZ2YWx1ZSk7Ci0JCQl2YWx1ZSB8PSAweDIwOwotCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCB2YWx1ZSk7Ci0jZW5kaWYKLQkJfQotCQllbHNlCQkJLy9CYW5kV2lkdGggPSAyMCBNSHoKLQkJewotCQkJLy8gV3JpdGUgMHgwNyB0byBSRl9SMjQgdG8gcHJvZ3JhbSBmaWx0ZXIKLQkJCVJGX1IyNF9WYWx1ZSA9IDB4MDc7Ci0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjQsIFJGX1IyNF9WYWx1ZSk7Ci0JCQlpZiAoSVNfUlQzMDkwKHBBZCkpCi0JCQkJRmlsdGVyVGFyZ2V0ID0gMHgxMzsKLQkJCWVsc2UKLQkJCQlGaWx0ZXJUYXJnZXQgPSAweDE2OwotI2lmZGVmIFJUMjg3MAotCQkJLy8gc2V0IHRvIEJXMjAKLQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCAmdmFsdWUpOwotCQkJdmFsdWUgJj0gKH4weDIwKTsKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMSwgdmFsdWUpOwotI2VuZGlmCi0JCX0KLQotCQkvLyBXcml0ZSAweDAxIHRvIFJGX1IyMiB0byBlbmFibGUgYmFzZWJhbmQgbG9vcGJhY2sgbW9kZQotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgJnZhbHVlKTsKLQkJdmFsdWUgfD0gMHgwMTsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIyLCB2YWx1ZSk7Ci0KLQkJLy8gV3JpdGUgMHgwMCB0byBCQlBfUjI0IHRvIHNldCBwb3dlciAmIGZyZXF1ZW5jeSBvZiBwYXNzYmFuZCB0ZXN0IHRvbmUKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjQsIDApOwotCi0JCWRvCi0JCXsKLQkJCS8vIFdyaXRlIDB4OTAgdG8gQkJQX1IyNSB0byB0cmFuc21pdCB0ZXN0IHRvbmUKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI1LCAweDkwKTsKLQotCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQkJCS8vIFJlYWQgQkJQX1I1NVs2OjBdIGZvciByZWNlaXZlZCBwb3dlciwgc2V0IFI1NXggPSBCQlBfUjU1WzY6MF0KLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNTUsICZ2YWx1ZSk7Ci0JCQlSNTV4ID0gdmFsdWUgJiAweEZGOwotCi0JCX0gd2hpbGUgKChSZVRyeSsrIDwgMTAwKSAmJiAoUjU1eCA9PSAwKSk7Ci0KLQkJLy8gV3JpdGUgMHgwNiB0byBCQlBfUjI0IHRvIHNldCBwb3dlciAmIGZyZXF1ZW5jeSBvZiBzdG9wYmFuZCB0ZXN0IHRvbmUKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjQsIDB4MDYpOwotCi0JCXdoaWxlKFRSVUUpCi0JCXsKLQkJCS8vIFdyaXRlIDB4OTAgdG8gQkJQX1IyNSB0byB0cmFuc21pdCB0ZXN0IHRvbmUKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI1LCAweDkwKTsKLQotCQkJLy9XZSBuZWVkIHRvIHdhaXQgZm9yIGNhbGlicmF0aW9uCi0JCQlSVE1QdXNlY0RlbGF5KDEwMDApOwotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I1NSwgJnZhbHVlKTsKLQkJCXZhbHVlICY9IDB4RkY7Ci0JCQlpZiAoKFI1NXggLSB2YWx1ZSkgPCBGaWx0ZXJUYXJnZXQpCi0JCQl7Ci0JCQkJUkZfUjI0X1ZhbHVlICsrOwotCQkJfQotCQkJZWxzZSBpZiAoKFI1NXggLSB2YWx1ZSkgPT0gRmlsdGVyVGFyZ2V0KQotCQkJewotCQkJCVJGX1IyNF9WYWx1ZSArKzsKLQkJCQljb3VudCArKzsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLy8gcHJldmVudCBpbmZpbml0ZSBsb29wIGNhdXNlIGRyaXZlciBoYW5nLgotCQkJaWYgKGxvb3BjbnQrKyA+IDEwMCkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVE1QRmlsdGVyQ2FsaWJyYXRpb24gLSBjYW4ndCBmaW5kIGEgdmFsaWQgdmFsdWUsIGxvb3BjbnQ9JWQgc3RvcCBjYWxpYnJhdGluZyIsIGxvb3BjbnQpKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLy8gV3JpdGUgUkZfUjI0IHRvIHByb2dyYW0gZmlsdGVyCi0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjQsIFJGX1IyNF9WYWx1ZSk7Ci0JCX0KLQotCQlpZiAoY291bnQgPiAwKQotCQl7Ci0JCQlSRl9SMjRfVmFsdWUgPSBSRl9SMjRfVmFsdWUgLSAoKGNvdW50KSA/ICgxKSA6ICgwKSk7Ci0JCX0KLQotCQkvLyBTdG9yZSBmb3IgZnV0dXJlIHVzYWdlCi0JCWlmIChsb29wY250IDwgMTAwKQotCQl7Ci0JCQlpZiAobG9vcCsrID09IDApCi0JCQl7Ci0JCQkJLy9CYW5kV2lkdGggPSAyMCBNSHoKLQkJCQlwQWQtPk1sbWUuQ2FsaUJXMjBSZlIyNCA9IChVQ0hBUilSRl9SMjRfVmFsdWU7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy9CYW5kV2lkdGggPSA0MCBNSHoKLQkJCQlwQWQtPk1sbWUuQ2FsaUJXNDBSZlIyNCA9IChVQ0hBUilSRl9SMjRfVmFsdWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJYnJlYWs7Ci0KLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCBSRl9SMjRfVmFsdWUpOwotCi0JCS8vIHJlc2V0IGNvdW50Ci0JCWNvdW50ID0gMDsKLQl9IHdoaWxlKFRSVUUpOwotCi0JLy8KLQkvLyBTZXQgYmFjayB0byBpbml0aWFsIHN0YXRlCi0JLy8KLQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNCwgMCk7Ci0KLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgJnZhbHVlKTsKLQl2YWx1ZSAmPSB+KDB4MDEpOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgdmFsdWUpOwotCi0JLy8gc2V0IEJCUCBiYWNrIHRvIEJXMjAKLQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7Ci0JQkJQVmFsdWUmPSAofjB4MTgpOwotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBGaWx0ZXJDYWxpYnJhdGlvbiAtIENhbGlCVzIwUmZSMjQ9MHgleCwgQ2FsaUJXNDBSZlIyND0weCV4XG4iLCBwQWQtPk1sbWUuQ2FsaUJXMjBSZlIyNCwgcEFkLT5NbG1lLkNhbGlCVzQwUmZSMjQpKTsKLX0KLQotVk9JRCBOSUNJbml0UlQzMHh4UkZSZWdpc3RlcnMoSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JSU5UIGk7Ci0JLy8gRHJpdmVyIG11c3QgcmVhZCBFRVBST00gdG8gZ2V0IFJmSWNUeXBlIGJlZm9yZSBpbml0aWFsIFJGIHJlZ2lzdGVycwotCS8vIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQotCWlmIChJU19SVDMwNzAocEFkKSB8fCBJU19SVDMwNzEocEFkKSkKLQl7Ci0JCS8vIEluaXQgUkYgY2FsaWJyYXRpb24KLQkJLy8gRHJpdmVyIHNob3VsZCB0b2dnbGUgUkYgUjMwIGJpdDcgYmVmb3JlIGluaXQgUkYgcmVnaXN0ZXJzCi0JCVVJTlQzMiBSZlJlZyA9IDA7Ci0JCVVJTlQzMiBkYXRhOwotCi0JCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjMwLCAoUFVDSEFSKSZSZlJlZyk7Ci0JCVJmUmVnIHw9IDB4ODA7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKFVDSEFSKVJmUmVnKTsKLQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQkJUmZSZWcgJj0gMHg3RjsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMwLCAoVUNIQVIpUmZSZWcpOwotCi0JCS8vIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQotCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1JGX1JFR19QQVJNUzsgaSsrKQotCQl7Ci0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSVDMweHhfUkZSZWdUYWJsZVtpXS5SZWdpc3RlciwgUlQzMHh4X1JGUmVnVGFibGVbaV0uVmFsdWUpOwotCQl9Ci0KLQkJaWYgKElTX1JUMzA3MChwQWQpKQotCQl7Ci0JCQkvLyAgVXBkYXRlIE1BQyAweDA1RDQgZnJvbSAwMXh4eHh4eCB0byAwRHh4eHh4eCAodm9sdGFnZSAxLjJWIHRvIDEuMzVWKSBmb3IgUlQzMDcwIHRvIGltcHJvdmUgeWllbGQgcmF0ZQotCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBMRE9fQ0ZHMCwgJmRhdGEpOwotCQkJZGF0YSA9ICgoZGF0YSAmIDB4RjBGRkZGRkYpIHwgMHgwRDAwMDAwMCk7Ci0JCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBMRE9fQ0ZHMCwgZGF0YSk7Ci0JCX0KLQkJZWxzZSBpZiAoSVNfUlQzMDcxKHBBZCkpCi0JCXsKLQkJCS8vIERyaXZlciBzaG91bGQgc2V0IFJGIFI2IGJpdDYgb24gYmVmb3JlIGluaXQgUkYgcmVnaXN0ZXJzCi0JCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNiwgKFBVQ0hBUikmUmZSZWcpOwotCQkJUmZSZWcgfD0gMHg0MDsKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwNiwgKFVDSEFSKVJmUmVnKTsKLQotCQkJLy8gaW5pdCBSMzEKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMSwgMHgxNCk7Ci0KLQkJCS8vIFJUMzA3MSB2ZXJzaW9uIEUgaGFzIGZpeGVkIHRoaXMgaXNzdWUKLQkJCWlmICgocEFkLT5OaWNDb25maWcyLmZpZWxkLkRBQ1Rlc3RCaXQgPT0gMSkgJiYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjExKSkKLQkJCXsKLQkJCQkvLyBwYXRjaCB0eCBFVk0gaXNzdWUgdGVtcG9yYXJpbHkKLQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIExET19DRkcwLCAmZGF0YSk7Ci0JCQkJZGF0YSA9ICgoZGF0YSAmIDB4RTBGRkZGRkYpIHwgMHgwRDAwMDAwMCk7Ci0JCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgTERPX0NGRzAsIGRhdGEpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTERPX0NGRzAsICZkYXRhKTsKLQkJCQlkYXRhID0gKChkYXRhICYgMHhFMEZGRkZGRikgfCAweDAxMDAwMDAwKTsKLQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBMRE9fQ0ZHMCwgZGF0YSk7Ci0JCQl9Ci0KLQkJCS8vIHBhdGNoIExOQV9QRV9HMSBmYWlsZWQgaXNzdWUKLQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgR1BJT19TV0lUQ0gsICZkYXRhKTsKLQkJCWRhdGEgJj0gfigweDIwKTsKLQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIEdQSU9fU1dJVENILCBkYXRhKTsKLQkJfQotCi0JCS8vRm9yIFJGIGZpbHRlciBDYWxpYnJhdGlvbgotCQlSVE1QRmlsdGVyQ2FsaWJyYXRpb24ocEFkKTsKLQotCQkvLyBJbml0aWFsaXplIFJGIFIyNyByZWdpc3Rlciwgc2V0IFJGIFIyNyBtdXN0IGJlIGJlaGluZCBSVE1QRmlsdGVyQ2FsaWJyYXRpb24oKQotCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMTEpCi0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsIDB4Myk7Ci0KLQkJLy8gc2V0IGxlZCBvcGVuIGRyYWluIGVuYWJsZQotCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIE9QVF8xNCwgJmRhdGEpOwotCQlkYXRhIHw9IDB4MDE7Ci0JCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIE9QVF8xNCwgZGF0YSk7Ci0KLQkJaWYgKElTX1JUMzA3MShwQWQpKQotCQl7Ci0JCQkvLyBhZGQgYnkgam9obmxpLCBSRiBwb3dlciBzZXF1ZW5jZSBzZXR1cCwgbG9hZCBSRiBub3JtYWwgb3BlcmF0aW9uLW1vZGUgc2V0dXAKLQkJCVJUMzB4eExvYWRSRk5vcm1hbE1vZGVTZXR1cChwQWQpOwotCQl9Ci0JfQotfQotI2VuZGlmIC8vIFJUMjg3MCAvLwotCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTEyOTYsODggKzY3Niw5MSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlOSUNSZWFkRUVQUk9NUGFyYW1ldGVycygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQltYWNfYWRkcikKK3ZvaWQgTklDUmVhZEVFUFJPTVBhcmFtZXRlcnMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCAqbWFjX2FkZHIpCiB7Ci0JVUlOVDMyCQkJZGF0YSA9IDA7Ci0JVVNIT1JUCQkJaSwgdmFsdWUsIHZhbHVlMjsKLQlVQ0hBUgkJCVRtcFBoeTsKLQlFRVBST01fVFhfUFdSX1NUUlVDCSAgICBQb3dlcjsKLQlFRVBST01fVkVSU0lPTl9TVFJVQyAgICBWZXJzaW9uOwotCUVFUFJPTV9BTlRFTk5BX1NUUlVDCUFudGVubmE7Ci0JRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDICAgIE5pY0NvbmZpZzI7CisJdTMyIGRhdGEgPSAwOworCXUxNiBpLCB2YWx1ZSwgdmFsdWUyOworCXU4IFRtcFBoeTsKKwlFRVBST01fVFhfUFdSX1NUUlVDIFBvd2VyOworCUVFUFJPTV9WRVJTSU9OX1NUUlVDIFZlcnNpb247CisJRUVQUk9NX0FOVEVOTkFfU1RSVUMgQW50ZW5uYTsKKwlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMgTmljQ29uZmlnMjsKIAogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNSZWFkRUVQUk9NUGFyYW1ldGVyc1xuIikpOwogCi0JLy8gSW5pdCBFRVBST00gQWRkcmVzcyBOdW1iZXIsIGJlZm9yZSBhY2Nlc3MgRUVQUk9NOyBpZiA5M2M0NiwgRUVQUk9NQWRkcmVzc051bT02LCBlbHNlIGlmIDkzYzY2LCBFRVBST01BZGRyZXNzTnVtPTgKKwlpZiAocEFkLT5jaGlwT3BzLmVlaW5pdCkKKwkJcEFkLT5jaGlwT3BzLmVlaW5pdChwQWQpOworCisJLyogSW5pdCBFRVBST00gQWRkcmVzcyBOdW1iZXIsIGJlZm9yZSBhY2Nlc3MgRUVQUk9NOyBpZiA5M2M0NiwgRUVQUk9NQWRkcmVzc051bT02LCBlbHNlIGlmIDkzYzY2LCBFRVBST01BZGRyZXNzTnVtPTggKi8KIAlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZkYXRhKTsKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gRTJQUk9NX0NTUiA9IDB4JXhcbiIsIGRhdGEpKTsKIAotCWlmKChkYXRhICYgMHgzMCkgPT0gMCkKLQkJcEFkLT5FRVBST01BZGRyZXNzTnVtID0gNjsJCS8vIDkzQzQ2Ci0JZWxzZSBpZigoZGF0YSAmIDB4MzApID09IDB4MTApCi0JCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDg7ICAgICAvLyA5M0M2NgorCWlmICgoZGF0YSAmIDB4MzApID09IDApCisJCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDY7CS8qIDkzQzQ2ICovCisJZWxzZSBpZiAoKGRhdGEgJiAweDMwKSA9PSAweDEwKQorCQlwQWQtPkVFUFJPTUFkZHJlc3NOdW0gPSA4OwkvKiA5M0M2NiAqLwogCWVsc2UKLQkJcEFkLT5FRVBST01BZGRyZXNzTnVtID0gODsgICAgIC8vIDkzQzg2Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEVFUFJPTUFkZHJlc3NOdW0gPSAlZFxuIiwgcEFkLT5FRVBST01BZGRyZXNzTnVtICkpOworCQlwQWQtPkVFUFJPTUFkZHJlc3NOdW0gPSA4OwkvKiA5M0M4NiAqLworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCItLT4gRUVQUk9NQWRkcmVzc051bSA9ICVkXG4iLCBwQWQtPkVFUFJPTUFkZHJlc3NOdW0pKTsKIAotCS8vIFJUMjg2MCBNQUMgbm8gbG9uZ2VyIGF1dG8gbG9hZCBNQUMgYWRkcmVzcyBmcm9tIEUyUFJPTS4gRHJpdmVyIGhhcyB0byBpbnRpYWxpemUKLQkvLyBNQUMgYWRkcmVzcyByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIEUyUFJPTSBzZXR0aW5nCisJLyogUlQyODYwIE1BQyBubyBsb25nZXIgYXV0byBsb2FkIE1BQyBhZGRyZXNzIGZyb20gRTJQUk9NLiBEcml2ZXIgaGFzIHRvIGludGlhbGl6ZSAqLworCS8qIE1BQyBhZGRyZXNzIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gRTJQUk9NIHNldHRpbmcgKi8KIAlpZiAobWFjX2FkZHIgPT0gTlVMTCB8fAotCQlzdHJsZW4obWFjX2FkZHIpICE9IDE3IHx8Ci0JCW1hY19hZGRyWzJdICE9ICc6JyAgfHwgbWFjX2FkZHJbNV0gIT0gJzonICB8fCBtYWNfYWRkcls4XSAhPSAnOicgfHwKLQkJbWFjX2FkZHJbMTFdICE9ICc6JyB8fCBtYWNfYWRkclsxNF0gIT0gJzonKQotCXsKLQkJVVNIT1JUICBBZGRyMDEsQWRkcjIzLEFkZHI0NSA7CisJICAgIHN0cmxlbigoY2hhciAqKW1hY19hZGRyKSAhPSAxNyB8fAorCSAgICBtYWNfYWRkclsyXSAhPSAnOicgfHwgbWFjX2FkZHJbNV0gIT0gJzonIHx8IG1hY19hZGRyWzhdICE9ICc6JyB8fAorCSAgICBtYWNfYWRkclsxMV0gIT0gJzonIHx8IG1hY19hZGRyWzE0XSAhPSAnOicpIHsKKwkJdTE2IEFkZHIwMSwgQWRkcjIzLCBBZGRyNDU7CiAKIAkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDA0LCBBZGRyMDEpOwogCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDYsIEFkZHIyMyk7CiAJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgwOCwgQWRkcjQ1KTsKIAotCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0gPSAoVUNIQVIpKEFkZHIwMSAmIDB4ZmYpOwotCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMV0gPSAoVUNIQVIpKEFkZHIwMSA+PiA4KTsKLQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzJdID0gKFVDSEFSKShBZGRyMjMgJiAweGZmKTsKLQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzNdID0gKFVDSEFSKShBZGRyMjMgPj4gOCk7Ci0JCXBBZC0+UGVybWFuZW50QWRkcmVzc1s0XSA9IChVQ0hBUikoQWRkcjQ1ICYgMHhmZik7Ci0JCXBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSA9IChVQ0hBUikoQWRkcjQ1ID4+IDgpOworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0gPSAodTgpKEFkZHIwMSAmIDB4ZmYpOworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMV0gPSAodTgpKEFkZHIwMSA+PiA4KTsKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzJdID0gKHU4KShBZGRyMjMgJiAweGZmKTsKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzNdID0gKHU4KShBZGRyMjMgPj4gOCk7CisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1s0XSA9ICh1OCkoQWRkcjQ1ICYgMHhmZik7CisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSA9ICh1OCkoQWRkcjQ1ID4+IDgpOwogCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkluaXRpYWxpemUgTUFDIEFkZHJlc3MgZnJvbSBFMlBST00gXG4iKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCUlOVAkJajsKLQkJUFVDSEFSCW1hY3B0cjsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJJbml0aWFsaXplIE1BQyBBZGRyZXNzIGZyb20gRTJQUk9NIFxuIikpOworCX0gZWxzZSB7CisJCWludCBqOworCQljaGFyICptYWNwdHI7CiAKLQkJbWFjcHRyID0gbWFjX2FkZHI7CisJCW1hY3B0ciA9IChjaGFyICopbWFjX2FkZHI7CiAKLQkJZm9yIChqPTA7IGo8TUFDX0FERFJfTEVOOyBqKyspCi0JCXsKKwkJZm9yIChqID0gMDsgaiA8IE1BQ19BRERSX0xFTjsgaisrKSB7CiAJCQlBdG9IKG1hY3B0ciwgJnBBZC0+UGVybWFuZW50QWRkcmVzc1tqXSwgMSk7Ci0JCQltYWNwdHI9bWFjcHRyKzM7CisJCQltYWNwdHIgPSBtYWNwdHIgKyAzOwogCQl9CiAKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW5pdGlhbGl6ZSBNQUMgQWRkcmVzcyBmcm9tIG1vZHVsZSBwYXJhbWV0ZXIgXG4iKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiSW5pdGlhbGl6ZSBNQUMgQWRkcmVzcyBmcm9tIG1vZHVsZSBwYXJhbWV0ZXIgXG4iKSk7CiAJfQogCi0KIAl7Ci0JCS8vbW9yZSBjb252ZW5pbmV0IHRvIHRlc3QgbWJzc2lkLCBzbyBhcCdzIGJzc2lkICYweGYxCisJCS8qbW9yZSBjb252ZW5pbmV0IHRvIHRlc3QgbWJzc2lkLCBzbyBhcCdzIGJzc2lkICYweGYxICovCiAJCWlmIChwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0gPT0gMHhmZikKLQkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1swXSA9IFJhbmRvbUJ5dGUocEFkKSYweGY4OworCQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzBdID0gUmFuZG9tQnl0ZShwQWQpICYgMHhmODsKIAotCQkvL2lmIChwQWQtPlBlcm1hbmVudEFkZHJlc3NbNV0gPT0gMHhmZikKLQkJLy8JcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzVdID0gUmFuZG9tQnl0ZShwQWQpJjB4Zjg7CisJCS8qaWYgKHBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSA9PSAweGZmKSAqLworCQkvKiAgICAgIHBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSA9IFJhbmRvbUJ5dGUocEFkKSYweGY4OyAqLwogCi0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkUyUFJPTSBNQUM6ID0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1swXSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzFdLAotCQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzJdLCBwQWQtPlBlcm1hbmVudEFkZHJlc3NbM10sCi0JCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNF0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSkpOwotCQlpZiAocEFkLT5iTG9jYWxBZG1pbk1BQyA9PSBGQUxTRSkKLQkJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkgICAgICgiRTJQUk9NIE1BQzogPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJICAgICAgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzBdLAorCQkJICAgICAgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzFdLAorCQkJICAgICAgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzJdLAorCQkJICAgICAgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzNdLAorCQkJICAgICAgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzRdLAorCQkJICAgICAgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzVdKSk7CisJCWlmIChwQWQtPmJMb2NhbEFkbWluTUFDID09IEZBTFNFKSB7CiAJCQlNQUNfRFcwX1NUUlVDIGNzcjI7CiAJCQlNQUNfRFcxX1NUUlVDIGNzcjM7Ci0JCQlDT1BZX01BQ19BRERSKHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+UGVybWFuZW50QWRkcmVzcyk7CisJCQlDT1BZX01BQ19BRERSKHBBZC0+Q3VycmVudEFkZHJlc3MsCisJCQkJICAgICAgcEFkLT5QZXJtYW5lbnRBZGRyZXNzKTsKIAkJCWNzcjIuZmllbGQuQnl0ZTAgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzBdOwogCQkJY3NyMi5maWVsZC5CeXRlMSA9IHBBZC0+Q3VycmVudEFkZHJlc3NbMV07CiAJCQljc3IyLmZpZWxkLkJ5dGUyID0gcEFkLT5DdXJyZW50QWRkcmVzc1syXTsKQEAgLTEzODgsMTE4ICs3NzEsMTE2IEBACiAJCQljc3IzLmZpZWxkLkJ5dGU1ID0gcEFkLT5DdXJyZW50QWRkcmVzc1s1XTsKIAkJCWNzcjMuZmllbGQuVTJNZU1hc2sgPSAweGZmOwogCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0FERFJfRFcxLCBjc3IzLndvcmQpOwotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiRTJQUk9NIE1BQzogPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1swXSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzFdLAotCQkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1syXSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzNdLAotCQkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1s0XSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzVdKSk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkJICAgICAoIkUyUFJPTSBNQUM6ID0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQkgICAgICBQUklOVF9NQUMocEFkLT5QZXJtYW5lbnRBZGRyZXNzKSkpOwogCQl9CiAJfQogCi0JLy8gaWYgbm90IHJldHVybiBlYXJseS4gY2F1c2UgZmFpbCBhdCBlbXVsYXRpb24uCi0JLy8gSW5pdCB0aGUgY2hhbm5lbCBudW1iZXIgZm9yIFRYIGNoYW5uZWwgcG93ZXIKKwkvKiBpZiBub3QgcmV0dXJuIGVhcmx5LiBjYXVzZSBmYWlsIGF0IGVtdWxhdGlvbi4gKi8KKwkvKiBJbml0IHRoZSBjaGFubmVsIG51bWJlciBmb3IgVFggY2hhbm5lbCBwb3dlciAqLwogCVJUTVBSZWFkQ2hhbm5lbFB3cihwQWQpOwogCi0JLy8gaWYgRTJQUk9NIHZlcnNpb24gbWlzbWF0Y2ggd2l0aCBkcml2ZXIncyBleHBlY3RhdGlvbiwgdGhlbiBza2lwCi0JLy8gYWxsIHN1YnNlcXVlbnQgRTJSUE9NIHJldGlldmFsIGFuZCBzZXQgYSBzeXN0ZW0gZXJyb3IgYml0IHRvIG5vdGlmeSBHVUkKKwkvKiBpZiBFMlBST00gdmVyc2lvbiBtaXNtYXRjaCB3aXRoIGRyaXZlcidzIGV4cGVjdGF0aW9uLCB0aGVuIHNraXAgKi8KKwkvKiBhbGwgc3Vic2VxdWVudCBFMlJQT00gcmV0aWV2YWwgYW5kIHNldCBhIHN5c3RlbSBlcnJvciBiaXQgdG8gbm90aWZ5IEdVSSAqLwogCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1ZFUlNJT05fT0ZGU0VULCBWZXJzaW9uLndvcmQpOwotCXBBZC0+RWVwcm9tVmVyc2lvbiA9IFZlcnNpb24uZmllbGQuVmVyc2lvbiArIFZlcnNpb24uZmllbGQuRmFlUmVsZWFzZU51bWJlciAqIDI1NjsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJFMlBST006IFZlcnNpb24gPSAlZCwgRkFFIHJlbGVhc2UgIyVkXG4iLCBWZXJzaW9uLmZpZWxkLlZlcnNpb24sIFZlcnNpb24uZmllbGQuRmFlUmVsZWFzZU51bWJlcikpOworCXBBZC0+RWVwcm9tVmVyc2lvbiA9CisJICAgIFZlcnNpb24uZmllbGQuVmVyc2lvbiArIFZlcnNpb24uZmllbGQuRmFlUmVsZWFzZU51bWJlciAqIDI1NjsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiRTJQUk9NOiBWZXJzaW9uID0gJWQsIEZBRSByZWxlYXNlICMlZFxuIiwKKwkJICBWZXJzaW9uLmZpZWxkLlZlcnNpb24sIFZlcnNpb24uZmllbGQuRmFlUmVsZWFzZU51bWJlcikpOwogCi0JaWYgKFZlcnNpb24uZmllbGQuVmVyc2lvbiA+IFZBTElEX0VFUFJPTV9WRVJTSU9OKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiRTJQUk9NOiBXUk9ORyBWRVJTSU9OIDB4JXgsIHNob3VsZCBiZSAlZFxuIixWZXJzaW9uLmZpZWxkLlZlcnNpb24sIFZBTElEX0VFUFJPTV9WRVJTSU9OKSk7CisJaWYgKFZlcnNpb24uZmllbGQuVmVyc2lvbiA+IFZBTElEX0VFUFJPTV9WRVJTSU9OKSB7CisJCURCR1BSSU5UX0VSUigoIkUyUFJPTTogV1JPTkcgVkVSU0lPTiAweCV4LCBzaG91bGQgYmUgJWRcbiIsCisJCQkgICAgICBWZXJzaW9uLmZpZWxkLlZlcnNpb24sIFZBTElEX0VFUFJPTV9WRVJTSU9OKSk7CiAJCS8qcEFkLT5TeXN0ZW1FcnJvckJpdG1hcCB8PSAweDAwMDAwMDAxOwogCi0JCS8vIGhhcmQtY29kZSBkZWZhdWx0IHZhbHVlIHdoZW4gbm8gcHJvcGVyIEUyUFJPTSBpbnN0YWxsZWQKLQkJcEFkLT5iQXV0b1R4QWdjQSA9IEZBTFNFOwotCQlwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7CisJCSAgIC8vIGhhcmQtY29kZSBkZWZhdWx0IHZhbHVlIHdoZW4gbm8gcHJvcGVyIEUyUFJPTSBpbnN0YWxsZWQKKwkJICAgcEFkLT5iQXV0b1R4QWdjQSA9IEZBTFNFOworCQkgICBwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7CiAKLQkJLy8gRGVmYXVsdCB0aGUgY2hhbm5lbCBwb3dlcgotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9PRl9DSEFOTkVMUzsgaSsrKQotCQkJcEFkLT5UeFBvd2VyW2ldLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJICAgLy8gRGVmYXVsdCB0aGUgY2hhbm5lbCBwb3dlcgorCQkgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9PRl9DSEFOTkVMUzsgaSsrKQorCQkgICBwQWQtPlR4UG93ZXJbaV0uUG93ZXIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOwogCi0JCS8vIERlZmF1bHQgdGhlIGNoYW5uZWwgcG93ZXIKLQkJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfMTFKQ0hBTk5FTFM7IGkrKykKLQkJCXBBZC0+VHhQb3dlcjExSltpXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCSAgIC8vIERlZmF1bHQgdGhlIGNoYW5uZWwgcG93ZXIKKwkJICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfMTFKQ0hBTk5FTFM7IGkrKykKKwkJICAgcEFkLT5UeFBvd2VyMTFKW2ldLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKIAotCQlmb3IoaSA9IDA7IGkgPCBOVU1fRUVQUk9NX0JCUF9QQVJNUzsgaSsrKQotCQkJcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbaV0gPSAweGZmZmY7Ci0JCXJldHVybjsgICovCisJCSAgIGZvcihpID0gMDsgaSA8IE5VTV9FRVBST01fQkJQX1BBUk1TOyBpKyspCisJCSAgIHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2ldID0gMHhmZmZmOworCQkgICByZXR1cm47ICAqLwogCX0KLQotCS8vIFJlYWQgQkJQIGRlZmF1bHQgdmFsdWUgZnJvbSBFRVBST00gYW5kIHN0b3JlIHRvIGFycmF5KEVFUFJPTURlZmF1bHRWYWx1ZSkgaW4gcEFkCisJLyogUmVhZCBCQlAgZGVmYXVsdCB2YWx1ZSBmcm9tIEVFUFJPTSBhbmQgc3RvcmUgdG8gYXJyYXkoRUVQUk9NRGVmYXVsdFZhbHVlKSBpbiBwQWQgKi8KIAlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9OSUMxX09GRlNFVCwgdmFsdWUpOwogCXBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzBdID0gdmFsdWU7CiAKIAlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9OSUMyX09GRlNFVCwgdmFsdWUpOwogCXBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzFdID0gdmFsdWU7CiAKLQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MzgsIHZhbHVlKTsJLy8gQ291bnRyeSBSZWdpb24KKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MzgsIHZhbHVlKTsJLyogQ291bnRyeSBSZWdpb24gKi8KIAlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsyXSA9IHZhbHVlOwogCi0JZm9yKGkgPSAwOyBpIDwgODsgaSsrKQotCXsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQkJQX0JBU0VfT0ZGU0VUICsgaSoyLCB2YWx1ZSk7Ci0JCXBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2krM10gPSB2YWx1ZTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0JCUF9CQVNFX09GRlNFVCArIGkgKiAyLAorCQkJCSAgICAgdmFsdWUpOworCQlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpICsgM10gPSB2YWx1ZTsKIAl9CiAKLQkvLyBXZSBoYXZlIHRvIHBhcnNlIE5JQyBjb25maWd1cmF0aW9uIDAgYXQgaGVyZS4KLQkvLyBJZiBUU1NJIGRpZCBub3QgaGF2ZSBwcmVsb2FkZWQgdmFsdWUsIGl0IHNob3VsZCByZXNldCB0aGUgVHhBdXRvQWdjIHRvIGZhbHNlCi0JLy8gVGhlcmVmb3JlLCB3ZSBoYXZlIHRvIHJlYWQgVHhBdXRvQWdjIGNvbnRyb2wgYmVmb3JlaGFuZC4KLQkvLyBSZWFkIFR4IEFHQyBjb250cm9sIGJpdAorCS8qIFdlIGhhdmUgdG8gcGFyc2UgTklDIGNvbmZpZ3VyYXRpb24gMCBhdCBoZXJlLiAqLworCS8qIElmIFRTU0kgZGlkIG5vdCBoYXZlIHByZWxvYWRlZCB2YWx1ZSwgaXQgc2hvdWxkIHJlc2V0IHRoZSBUeEF1dG9BZ2MgdG8gZmFsc2UgKi8KKwkvKiBUaGVyZWZvcmUsIHdlIGhhdmUgdG8gcmVhZCBUeEF1dG9BZ2MgY29udHJvbCBiZWZvcmVoYW5kLiAqLworCS8qIFJlYWQgVHggQUdDIGNvbnRyb2wgYml0ICovCiAJQW50ZW5uYS53b3JkID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMF07Ci0JaWYgKEFudGVubmEud29yZCA9PSAweEZGRkYpCi0JewotCQlpZihJU19SVDMwOTAocEFkKSkKLQkJeworCWlmIChBbnRlbm5hLndvcmQgPT0gMHhGRkZGKSB7CisjaWZkZWYgUlQzMHh4CisJCWlmIChJU19SVDMwOTAocEFkKSB8fCBJU19SVDMzOTAocEFkKSkgewogCQkJQW50ZW5uYS53b3JkID0gMDsKIAkJCUFudGVubmEuZmllbGQuUmZJY1R5cGUgPSBSRklDXzMwMjA7CiAJCQlBbnRlbm5hLmZpZWxkLlR4UGF0aCA9IDE7CiAJCQlBbnRlbm5hLmZpZWxkLlJ4UGF0aCA9IDE7Ci0JCX0KLQkJZWxzZQorCQl9IGVsc2UKKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KIAkJewotCQlBbnRlbm5hLndvcmQgPSAwOwotCQlBbnRlbm5hLmZpZWxkLlJmSWNUeXBlID0gUkZJQ18yODIwOwotCQlBbnRlbm5hLmZpZWxkLlR4UGF0aCA9IDE7Ci0JCUFudGVubmEuZmllbGQuUnhQYXRoID0gMjsKLQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJFMlBST00gZXJyb3IsIGhhcmQgY29kZSBhcyAweCUwNHhcbiIsIEFudGVubmEud29yZCkpOworCisJCQlBbnRlbm5hLndvcmQgPSAwOworCQkJQW50ZW5uYS5maWVsZC5SZkljVHlwZSA9IFJGSUNfMjgyMDsKKwkJCUFudGVubmEuZmllbGQuVHhQYXRoID0gMTsKKwkJCUFudGVubmEuZmllbGQuUnhQYXRoID0gMjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sCisJCQkJICgiRTJQUk9NIGVycm9yLCBoYXJkIGNvZGUgYXMgMHglMDR4XG4iLAorCQkJCSAgQW50ZW5uYS53b3JkKSk7CiAJCX0KIAl9Ci0KLQkvLyBDaG9vc2UgdGhlIGRlc2lyZWQgVHgmUnggc3RyZWFtLgotCWlmICgocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID4gQW50ZW5uYS5maWVsZC5UeFBhdGgpKQorCS8qIENob29zZSB0aGUgZGVzaXJlZCBUeCZSeCBzdHJlYW0uICovCisJaWYgKChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAwKQorCSAgICB8fCAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPiBBbnRlbm5hLmZpZWxkLlR4UGF0aCkpCiAJCXBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID0gQW50ZW5uYS5maWVsZC5UeFBhdGg7CiAKLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID09IDApIHx8IChwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA+IEFudGVubmEuZmllbGQuUnhQYXRoKSkKLQl7CisJaWYgKChwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9PSAwKQorCSAgICB8fCAocEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPiBBbnRlbm5hLmZpZWxkLlJ4UGF0aCkpIHsKIAkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSBBbnRlbm5hLmZpZWxkLlJ4UGF0aDsKIAogCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18yODgzX1ZFUlNJT04pICYmCi0JCQkocEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPiAyKSkKLQkJewotCQkJLy8gb25seSAyIFJ4IHN0cmVhbXMgZm9yIFJUMjg2MCBzZXJpZXMKKwkJICAgIChwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA+IDIpKSB7CisJCQkvKiBvbmx5IDIgUnggc3RyZWFtcyBmb3IgUlQyODYwIHNlcmllcyAqLwogCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAyOwogCQl9CiAJfQotCi0JLy8gMyozCi0JLy8gcmVhZCB2YWx1ZSBmcm9tIEVFUFJPTSBhbmQgc2V0IHRoZW0gdG8gQ1NSMTc0IH4gMTc3IGluIGNoYWluMCB+IGNoYWluMgotCS8vIHlldCBpbXBsZW1lbnQKLQlmb3IoaT0wOyBpPDM7IGkrKykKLQl7CisJLyogMyozICovCisJLyogcmVhZCB2YWx1ZSBmcm9tIEVFUFJPTSBhbmQgc2V0IHRoZW0gdG8gQ1NSMTc0IH4gMTc3IGluIGNoYWluMCB+IGNoYWluMiAqLworCS8qIHlldCBpbXBsZW1lbnQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAJfQogCiAJTmljQ29uZmlnMi53b3JkID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMV07CiAKIAl7Ci0JCWlmICgoTmljQ29uZmlnMi53b3JkICYgMHgwMGZmKSA9PSAweGZmKQotCQl7CisJCWlmICgoTmljQ29uZmlnMi53b3JkICYgMHgwMGZmKSA9PSAweGZmKSB7CiAJCQlOaWNDb25maWcyLndvcmQgJj0gMHhmZjAwOwogCQl9CiAKLQkJaWYgKChOaWNDb25maWcyLndvcmQgPj4gOCkgPT0gMHhmZikKLQkJeworCQlpZiAoKE5pY0NvbmZpZzIud29yZCA+PiA4KSA9PSAweGZmKSB7CiAJCQlOaWNDb25maWcyLndvcmQgJj0gMHgwMGZmOwogCQl9CiAJfQpAQCAtMTUwOSwyOSArODkwLDQzIEBACiAJZWxzZQogCQlwQWQtPmJBdXRvVHhBZ2NBID0gcEFkLT5iQXV0b1R4QWdjRyA9IEZBTFNFOwogCi0JREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIk5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzOiBSeFBhdGggPSAlZCwgVHhQYXRoID0gJWRcbiIsIEFudGVubmEuZmllbGQuUnhQYXRoLCBBbnRlbm5hLmZpZWxkLlR4UGF0aCkpOworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJICAgICAoIk5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzOiBSeFBhdGggPSAlZCwgVHhQYXRoID0gJWRcbiIsCisJCSAgICAgIEFudGVubmEuZmllbGQuUnhQYXRoLCBBbnRlbm5hLmZpZWxkLlR4UGF0aCkpOwogCi0JLy8gU2F2ZSB0aGUgYW50ZW5uYSBmb3IgZnV0dXJlIHVzZQorCS8qIFNhdmUgdGhlIGFudGVubmEgZm9yIGZ1dHVyZSB1c2UgKi8KIAlwQWQtPkFudGVubmEud29yZCA9IEFudGVubmEud29yZDsKIAotCS8vCi0JLy8gUmVzZXQgUGh5TW9kZSBpZiB3ZSBkb24ndCBzdXBwb3J0IDgwMi4xMWEKLQkvLyBPbmx5IFJGSUNfMjg1MCAmIFJGSUNfMjc1MCBzdXBwb3J0IDgwMi4xMWEKLQkvLwotCWlmICgoQW50ZW5uYS5maWVsZC5SZkljVHlwZSAhPSBSRklDXzI4NTApICYmIChBbnRlbm5hLmZpZWxkLlJmSWNUeXBlICE9IFJGSUNfMjc1MCkpCi0JeworCS8qIFNldCB0aGUgUmZJQ1R5cGUgaGVyZSwgdGhlbiB3ZSBjYW4gaW5pdGlhbGl6ZSBSRklDIHJlbGF0ZWQgb3BlcmF0aW9uIGNhbGxiYWNrcyAqLworCXBBZC0+TWxtZS5SZWFsUnhQYXRoID0gKHU4KUFudGVubmEuZmllbGQuUnhQYXRoOworCXBBZC0+UmZJY1R5cGUgPSAodTgpQW50ZW5uYS5maWVsZC5SZkljVHlwZTsKKworI2lmZGVmIFJUTVBfUkZfUldfU1VQUE9SVAorCVJ0bXBDaGlwT3BzUkZIb29rKHBBZCk7CisjZW5kaWYgLyogUlRNUF9SRl9SV19TVVBQT1JUIC8vICovCisKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwlzcHJpbnRmKChjaGFyICopcEFkLT5uaWNrbmFtZSwgIlJUMjg2MFNUQSIpOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCisJLyogKi8KKwkvKiBSZXNldCBQaHlNb2RlIGlmIHdlIGRvbid0IHN1cHBvcnQgODAyLjExYSAqLworCS8qIE9ubHkgUkZJQ18yODUwICYgUkZJQ18yNzUwIHN1cHBvcnQgODAyLjExYSAqLworCS8qICovCisJaWYgKChBbnRlbm5hLmZpZWxkLlJmSWNUeXBlICE9IFJGSUNfMjg1MCkKKwkgICAgJiYgKEFudGVubmEuZmllbGQuUmZJY1R5cGUgIT0gUkZJQ18yNzUwKQorCSAgICAmJiAoQW50ZW5uYS5maWVsZC5SZkljVHlwZSAhPSBSRklDXzMwNTIpKSB7CiAJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdfTUlYRUQpIHx8Ci0JCQkocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBKSkKKwkJICAgIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUEpKQogCQkJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IFBIWV8xMUJHX01JWEVEOwotCQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdOX01JWEVEKQl8fAotCQkJCSAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBTl9NSVhFRCkgCXx8Ci0JCQkJIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFHTl9NSVhFRCkgCXx8Ci0JCQkJIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKQorCQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdOX01JWEVEKSB8fAorCQkJIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFOX01JWEVEKSB8fAorCQkJIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFHTl9NSVhFRCkgfHwKKwkJCSAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzVHKSkKIAkJCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSBQSFlfMTFCR05fTUlYRUQ7CiAJfQotCi0JLy8gUmVhZCBUU1NJIHJlZmVyZW5jZSBhbmQgVFNTSSBib3VuZGFyeSBmb3IgdGVtcGVyYXR1cmUgY29tcGVuc2F0aW9uLiBUaGlzIGlzIHVnbHkKLQkvLyAwLiAxMWIvZworCS8qIFJlYWQgVFNTSSByZWZlcmVuY2UgYW5kIFRTU0kgYm91bmRhcnkgZm9yIHRlbXBlcmF0dXJlIGNvbXBlbnNhdGlvbi4gVGhpcyBpcyB1Z2x5ICovCisJLyogMC4gMTFiL2cgKi8KIAl7CiAJCS8qIHRoZXNlIGFyZSB0ZW1wYXR1cmUgcmVmZXJlbmNlIHZhbHVlICgweDAwIH4gMHhGRSkKIAkJICAgZXg6IDB4MDAgMHgxNSAweDI1IDB4NDUgMHg4OCAweEEwIDB4QjUgMHhEMCAweEYwCkBAIC0xNTQ0LDcgKzkzOSw3IEBACiAJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzJdID0gUG93ZXIuZmllbGQuQnl0ZTA7CiAJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzFdID0gUG93ZXIuZmllbGQuQnl0ZTE7CiAJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHg3MiwgUG93ZXIud29yZCk7Ci0JCXBBZC0+VHNzaVJlZkcgICA9IFBvd2VyLmZpZWxkLkJ5dGUwOyAvKiByZWZlcmVuY2UgdmFsdWUgWzBdICovCisJCXBBZC0+VHNzaVJlZkcgPSBQb3dlci5maWVsZC5CeXRlMDsJLyogcmVmZXJlbmNlIHZhbHVlIFswXSAqLwogCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzFdID0gUG93ZXIuZmllbGQuQnl0ZTE7CiAJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHg3NCwgUG93ZXIud29yZCk7CiAJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMl0gPSBQb3dlci5maWVsZC5CeXRlMDsKQEAgLTE1NTQsMTkgKzk0OSwyMyBAQAogCQlwQWQtPlR4QWdjU3RlcEcgPSBQb3dlci5maWVsZC5CeXRlMTsKIAkJcEFkLT5UeEFnY0NvbXBlbnNhdGVHID0gMDsKIAkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMF0gPSBwQWQtPlRzc2lSZWZHOwotCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzBdICA9IHBBZC0+VHNzaVJlZkc7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMF0gPSBwQWQtPlRzc2lSZWZHOwogCi0JCS8vIERpc2FibGUgVHhBZ2MgaWYgdGhlIGJhc2VkIHZhbHVlIGlzIG5vdCByaWdodAorCQkvKiBEaXNhYmxlIFR4QWdjIGlmIHRoZSBiYXNlZCB2YWx1ZSBpcyBub3QgcmlnaHQgKi8KIAkJaWYgKHBBZC0+VHNzaVJlZkcgPT0gMHhmZikKIAkJCXBBZC0+YkF1dG9UeEFnY0cgPSBGQUxTRTsKIAotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkUyUFJPTTogRyBUc3NpWy00IC4uICs0XSA9ICVkICVkICVkICVkIC0gJWQgLSVkICVkICVkICVkLCBzdGVwPSVkLCB0dW5pbmc9JWRcbiIsCi0JCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1s0XSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbM10sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzJdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1sxXSwKLQkJCXBBZC0+VHNzaVJlZkcsCi0JCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzFdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzJdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzNdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzRdLAotCQkJcEFkLT5UeEFnY1N0ZXBHLCBwQWQtPmJBdXRvVHhBZ2NHKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiRTJQUk9NOiBHIFRzc2lbLTQgLi4gKzRdID0gJWQgJWQgJWQgJWQgLSAlZCAtJWQgJWQgJWQgJWQsIHN0ZXA9JWQsIHR1bmluZz0lZFxuIiwKKwkJCSAgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbNF0sCisJCQkgIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzNdLAorCQkJICBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1syXSwKKwkJCSAgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMV0sIHBBZC0+VHNzaVJlZkcsCisJCQkgIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMV0sIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMl0sCisJCQkgIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbM10sIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbNF0sCisJCQkgIHBBZC0+VHhBZ2NTdGVwRywgcEFkLT5iQXV0b1R4QWdjRykpOwogCX0KLQkvLyAxLiAxMWEKKwkvKiAxLiAxMWEgKi8KIAl7CiAJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhENCwgUG93ZXIud29yZCk7CiAJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzRdID0gUG93ZXIuZmllbGQuQnl0ZTA7CkBAIC0xNTc1LDcgKzk3NCw3IEBACiAJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzJdID0gUG93ZXIuZmllbGQuQnl0ZTA7CiAJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzFdID0gUG93ZXIuZmllbGQuQnl0ZTE7CiAJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhEOCwgUG93ZXIud29yZCk7Ci0JCXBBZC0+VHNzaVJlZkEgICA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCQlwQWQtPlRzc2lSZWZBID0gUG93ZXIuZmllbGQuQnl0ZTA7CiAJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMV0gPSBQb3dlci5maWVsZC5CeXRlMTsKIAkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweERBLCBQb3dlci53b3JkKTsKIAkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVsyXSA9IFBvd2VyLmZpZWxkLkJ5dGUwOwpAQCAtMTU4NSw5NyArOTg0LDExOSBAQAogCQlwQWQtPlR4QWdjU3RlcEEgPSBQb3dlci5maWVsZC5CeXRlMTsKIAkJcEFkLT5UeEFnY0NvbXBlbnNhdGVBID0gMDsKIAkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMF0gPSBwQWQtPlRzc2lSZWZBOwotCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzBdICA9IHBBZC0+VHNzaVJlZkE7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMF0gPSBwQWQtPlRzc2lSZWZBOwogCi0JCS8vIERpc2FibGUgVHhBZ2MgaWYgdGhlIGJhc2VkIHZhbHVlIGlzIG5vdCByaWdodAorCQkvKiBEaXNhYmxlIFR4QWdjIGlmIHRoZSBiYXNlZCB2YWx1ZSBpcyBub3QgcmlnaHQgKi8KIAkJaWYgKHBBZC0+VHNzaVJlZkEgPT0gMHhmZikKIAkJCXBBZC0+YkF1dG9UeEFnY0EgPSBGQUxTRTsKIAotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkUyUFJPTTogQSBUc3NpWy00IC4uICs0XSA9ICVkICVkICVkICVkIC0gJWQgLSVkICVkICVkICVkLCBzdGVwPSVkLCB0dW5pbmc9JWRcbiIsCi0JCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVs0XSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbM10sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzJdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVsxXSwKLQkJCXBBZC0+VHNzaVJlZkEsCi0JCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzFdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzJdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzNdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzRdLAotCQkJcEFkLT5UeEFnY1N0ZXBBLCBwQWQtPmJBdXRvVHhBZ2NBKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiRTJQUk9NOiBBIFRzc2lbLTQgLi4gKzRdID0gJWQgJWQgJWQgJWQgLSAlZCAtJWQgJWQgJWQgJWQsIHN0ZXA9JWQsIHR1bmluZz0lZFxuIiwKKwkJCSAgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbNF0sCisJCQkgIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzNdLAorCQkJICBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVsyXSwKKwkJCSAgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMV0sIHBBZC0+VHNzaVJlZkEsCisJCQkgIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMV0sIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMl0sCisJCQkgIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbM10sIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbNF0sCisJCQkgIHBBZC0+VHhBZ2NTdGVwQSwgcEFkLT5iQXV0b1R4QWdjQSkpOwogCX0KIAlwQWQtPkJicFJzc2lUb0RibURlbHRhID0gMHgwOwogCi0JLy8gUmVhZCBmcmVxdWVuY3kgb2Zmc2V0IHNldHRpbmcgZm9yIFJGCisJLyogUmVhZCBmcmVxdWVuY3kgb2Zmc2V0IHNldHRpbmcgZm9yIFJGICovCiAJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fRlJFUV9PRkZTRVQsIHZhbHVlKTsKIAlpZiAoKHZhbHVlICYgMHgwMEZGKSAhPSAweDAwRkYpCi0JCXBBZC0+UmZGcmVxT2Zmc2V0ID0gKFVMT05HKSAodmFsdWUgJiAweDAwRkYpOworCQlwQWQtPlJmRnJlcU9mZnNldCA9ICh1bnNpZ25lZCBsb25nKSh2YWx1ZSAmIDB4MDBGRik7CiAJZWxzZQogCQlwQWQtPlJmRnJlcU9mZnNldCA9IDA7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRTJQUk9NOiBSRiBGcmVxT2Zmc2V0PTB4JWx4IFxuIiwgcEFkLT5SZkZyZXFPZmZzZXQpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiRTJQUk9NOiBSRiBGcmVxT2Zmc2V0PTB4JWx4IFxuIiwgcEFkLT5SZkZyZXFPZmZzZXQpKTsKIAotCS8vQ291bnRyeVJlZ2lvbiBieXRlIG9mZnNldCAoMzhoKQotCXZhbHVlID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMl0gPj4gODsJCS8vIDIuNEcgYmFuZAotCXZhbHVlMiA9IHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzJdICYgMHgwMEZGOwkvLyA1RyBiYW5kCisJLypDb3VudHJ5UmVnaW9uIGJ5dGUgb2Zmc2V0ICgzOGgpICovCisJdmFsdWUgPSBwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsyXSA+PiA4OwkvKiAyLjRHIGJhbmQgKi8KKwl2YWx1ZTIgPSBwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsyXSAmIDB4MDBGRjsJLyogNUcgYmFuZCAqLwogCi0JaWYgKCh2YWx1ZSA8PSBSRUdJT05fTUFYSU1VTV9CR19CQU5EKSAmJiAodmFsdWUyIDw9IFJFR0lPTl9NQVhJTVVNX0FfQkFORCkpCi0JewotCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uID0gKChVQ0hBUikgdmFsdWUpIHwgMHg4MDsKLQkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kID0gKChVQ0hBUikgdmFsdWUyKSB8IDB4ODA7CisJaWYgKCh2YWx1ZSA8PSBSRUdJT05fTUFYSU1VTV9CR19CQU5EKQorCSAgICAmJiAodmFsdWUyIDw9IFJFR0lPTl9NQVhJTVVNX0FfQkFORCkpIHsKKwkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiA9ICgodTgpdmFsdWUpIHwgMHg4MDsKKwkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kID0gKCh1OCl2YWx1ZTIpIHwgMHg4MDsKIAkJVG1wUGh5ID0gcEFkLT5Db21tb25DZmcuUGh5TW9kZTsKIAkJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IDB4ZmY7CiAJCVJUTVBTZXRQaHlNb2RlKHBBZCwgVG1wUGh5KTsKIAkJU2V0Q29tbW9uSFQocEFkKTsKIAl9Ci0KLQkvLwotCS8vIEdldCBSU1NJIE9mZnNldCBvbiBFRVBST00gMHg5QWggJiAweDlDaC4KLQkvLyBUaGUgdmFsaWQgdmFsdWUgYXJlICgtMTAgfiAxMCkKLQkvLworCS8qICovCisJLyogR2V0IFJTU0kgT2Zmc2V0IG9uIEVFUFJPTSAweDlBaCAmIDB4OUNoLiAqLworCS8qIFRoZSB2YWxpZCB2YWx1ZSBhcmUgKC0xMCB+IDEwKSAqLworCS8qICovCiAJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9CR19PRkZTRVQsIHZhbHVlKTsKIAlwQWQtPkJHUnNzaU9mZnNldDAgPSB2YWx1ZSAmIDB4MDBmZjsKIAlwQWQtPkJHUnNzaU9mZnNldDEgPSAodmFsdWUgPj4gOCk7Ci0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9CR19PRkZTRVQrMiwgdmFsdWUpOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1JTU0lfQkdfT0ZGU0VUICsgMiwgdmFsdWUpOwogCXBBZC0+QkdSc3NpT2Zmc2V0MiA9IHZhbHVlICYgMHgwMGZmOwogCXBBZC0+QUxOQUdhaW4xID0gKHZhbHVlID4+IDgpOwogCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0xOQV9PRkZTRVQsIHZhbHVlKTsKIAlwQWQtPkJMTkFHYWluID0gdmFsdWUgJiAweDAwZmY7CiAJcEFkLT5BTE5BR2FpbjAgPSAodmFsdWUgPj4gOCk7CiAKLQkvLyBWYWxpZGF0ZSAxMWIvZyBSU1NJXzAgb2Zmc2V0LgorCS8qIFZhbGlkYXRlIDExYi9nIFJTU0lfMCBvZmZzZXQuICovCiAJaWYgKChwQWQtPkJHUnNzaU9mZnNldDAgPCAtMTApIHx8IChwQWQtPkJHUnNzaU9mZnNldDAgPiAxMCkpCiAJCXBBZC0+QkdSc3NpT2Zmc2V0MCA9IDA7CiAKLQkvLyBWYWxpZGF0ZSAxMWIvZyBSU1NJXzEgb2Zmc2V0LgorCS8qIFZhbGlkYXRlIDExYi9nIFJTU0lfMSBvZmZzZXQuICovCiAJaWYgKChwQWQtPkJHUnNzaU9mZnNldDEgPCAtMTApIHx8IChwQWQtPkJHUnNzaU9mZnNldDEgPiAxMCkpCiAJCXBBZC0+QkdSc3NpT2Zmc2V0MSA9IDA7CiAKLQkvLyBWYWxpZGF0ZSAxMWIvZyBSU1NJXzIgb2Zmc2V0LgorCS8qIFZhbGlkYXRlIDExYi9nIFJTU0lfMiBvZmZzZXQuICovCiAJaWYgKChwQWQtPkJHUnNzaU9mZnNldDIgPCAtMTApIHx8IChwQWQtPkJHUnNzaU9mZnNldDIgPiAxMCkpCiAJCXBBZC0+QkdSc3NpT2Zmc2V0MiA9IDA7CiAKIAlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9SU1NJX0FfT0ZGU0VULCB2YWx1ZSk7CiAJcEFkLT5BUnNzaU9mZnNldDAgPSB2YWx1ZSAmIDB4MDBmZjsKIAlwQWQtPkFSc3NpT2Zmc2V0MSA9ICh2YWx1ZSA+PiA4KTsKLQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIChFRVBST01fUlNTSV9BX09GRlNFVCsyKSwgdmFsdWUpOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgKEVFUFJPTV9SU1NJX0FfT0ZGU0VUICsgMiksIHZhbHVlKTsKIAlwQWQtPkFSc3NpT2Zmc2V0MiA9IHZhbHVlICYgMHgwMGZmOwogCXBBZC0+QUxOQUdhaW4yID0gKHZhbHVlID4+IDgpOwogCi0JaWYgKCgoVUNIQVIpcEFkLT5BTE5BR2FpbjEgPT0gMHhGRikgfHwgKHBBZC0+QUxOQUdhaW4xID09IDB4MDApKQorCWlmICgoKHU4KXBBZC0+QUxOQUdhaW4xID09IDB4RkYpIHx8IChwQWQtPkFMTkFHYWluMSA9PSAweDAwKSkKIAkJcEFkLT5BTE5BR2FpbjEgPSBwQWQtPkFMTkFHYWluMDsKLQlpZiAoKChVQ0hBUilwQWQtPkFMTkFHYWluMiA9PSAweEZGKSB8fCAocEFkLT5BTE5BR2FpbjIgPT0gMHgwMCkpCisJaWYgKCgodTgpcEFkLT5BTE5BR2FpbjIgPT0gMHhGRikgfHwgKHBBZC0+QUxOQUdhaW4yID09IDB4MDApKQogCQlwQWQtPkFMTkFHYWluMiA9IHBBZC0+QUxOQUdhaW4wOwogCi0JLy8gVmFsaWRhdGUgMTFhIFJTU0lfMCBvZmZzZXQuCisJLyogVmFsaWRhdGUgMTFhIFJTU0lfMCBvZmZzZXQuICovCiAJaWYgKChwQWQtPkFSc3NpT2Zmc2V0MCA8IC0xMCkgfHwgKHBBZC0+QVJzc2lPZmZzZXQwID4gMTApKQogCQlwQWQtPkFSc3NpT2Zmc2V0MCA9IDA7CiAKLQkvLyBWYWxpZGF0ZSAxMWEgUlNTSV8xIG9mZnNldC4KKwkvKiBWYWxpZGF0ZSAxMWEgUlNTSV8xIG9mZnNldC4gKi8KIAlpZiAoKHBBZC0+QVJzc2lPZmZzZXQxIDwgLTEwKSB8fCAocEFkLT5BUnNzaU9mZnNldDEgPiAxMCkpCiAJCXBBZC0+QVJzc2lPZmZzZXQxID0gMDsKIAotCS8vVmFsaWRhdGUgMTFhIFJTU0lfMiBvZmZzZXQuCisJLypWYWxpZGF0ZSAxMWEgUlNTSV8yIG9mZnNldC4gKi8KIAlpZiAoKHBBZC0+QVJzc2lPZmZzZXQyIDwgLTEwKSB8fCAocEFkLT5BUnNzaU9mZnNldDIgPiAxMCkpCiAJCXBBZC0+QVJzc2lPZmZzZXQyID0gMDsKIAotCS8vCi0JLy8gR2V0IExFRCBTZXR0aW5nLgotCS8vCisjaWZkZWYgUlQzMHh4CisJLyogKi8KKwkvKiBHZXQgVFggbWl4ZXIgZ2FpbiBzZXR0aW5nICovCisJLyogMHhmZiBhcmUgaW52YWxpZCB2YWx1ZSAqLworCS8qIE5vdGU6IFJUMzB4WCBkZWZhdWx0IHZhbHVlIGlzIDB4MDAgYW5kIHdpbGwgcHJvZ3JhbSB0byBSRl9SMTcgb25seSB3aGVuIHRoaXMgdmFsdWUgaXMgbm90IHplcm8uICovCisJLyogICAgICAgUlQzNTlYIGRlZmF1bHQgdmFsdWUgaXMgMHgwMiAqLworCS8qICovCisJaWYgKElTX1JUMzB4eChwQWQpIHx8IElTX1JUMzU3MihwQWQpKSB7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYTUlYRVJfR0FJTl8yXzRHLCB2YWx1ZSk7CisJCXBBZC0+VHhNaXhlckdhaW4yNEcgPSAwOworCQl2YWx1ZSAmPSAweDAwZmY7CisJCWlmICh2YWx1ZSAhPSAweGZmKSB7CisJCQl2YWx1ZSAmPSAweDA3OworCQkJcEFkLT5UeE1peGVyR2FpbjI0RyA9ICh1OCl2YWx1ZTsKKwkJfQorCX0KKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KKworCS8qICovCisJLyogR2V0IExFRCBTZXR0aW5nLiAqLworCS8qICovCiAJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDNhLCB2YWx1ZSk7Ci0JcEFkLT5MZWRDbnRsLndvcmQgPSAodmFsdWUmMHhmZjAwKSA+PiA4OworCXBBZC0+TGVkQ250bC53b3JkID0gKHZhbHVlID4+IDgpOwogCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0xFRDFfT0ZGU0VULCB2YWx1ZSk7CiAJcEFkLT5MZWQxID0gdmFsdWU7CiAJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTEVEMl9PRkZTRVQsIHZhbHVlKTsKQEAgLTE2ODUsNiArMTEwNiwxMiBAQAogCiAJUlRNUFJlYWRUeFB3clBlclJhdGUocEFkKTsKIAorI2lmZGVmIFJUMzB4eAorI2lmZGVmIFJUTVBfRUZVU0VfU1VQUE9SVAorCVJ0bXBFZnVzZVN1cHBvcnRDaGVjayhwQWQpOworI2VuZGlmIC8qIFJUTVBfRUZVU0VfU1VQUE9SVCAvLyAqLworI2VuZGlmIC8qIFJUMzB4eCAvLyAqLworCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzXG4iKSk7CiB9CiAKQEAgLTE3MDYsMTcwICsxMTMzLDIxOCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlOSUNJbml0QXNpY0Zyb21FRVBST00oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCit2b2lkIE5JQ0luaXRBc2ljRnJvbUVFUFJPTShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JVUlOVDMyCQkJCQlkYXRhID0gMDsKLQlVQ0hBUglCQlBSMSA9IDA7Ci0JVVNIT1JUCQkJCQlpOwotCUVFUFJPTV9BTlRFTk5BX1NUUlVDCUFudGVubmE7Ci0JRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDICAgIE5pY0NvbmZpZzI7Ci0JVUNIQVIJQkJQUjMgPSAwOworCXUzMiBkYXRhID0gMDsKKwl1OCBCQlBSMSA9IDA7CisJdTE2IGk7CisvKiAgICAgIEVFUFJPTV9BTlRFTk5BX1NUUlVDICAgIEFudGVubmE7ICovCisJRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDIE5pY0NvbmZpZzI7CisJdTggQkJQUjMgPSAwOwogCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ0luaXRBc2ljRnJvbUVFUFJPTVxuIikpOwotCWZvcihpID0gMzsgaSA8IE5VTV9FRVBST01fQkJQX1BBUk1TOyBpKyspCi0JewotCQlVQ0hBUiBCYnBSZWdJZHgsIEJicFZhbHVlOworCWZvciAoaSA9IDM7IGkgPCBOVU1fRUVQUk9NX0JCUF9QQVJNUzsgaSsrKSB7CisJCXU4IEJicFJlZ0lkeCwgQmJwVmFsdWU7CiAKLQkJaWYgKChwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSAhPSAweEZGRkYpICYmIChwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSAhPSAwKSkKLQkJewotCQkJQmJwUmVnSWR4ID0gKFVDSEFSKShwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSA+PiA4KTsKLQkJCUJicFZhbHVlICA9IChVQ0hBUikocEFkLT5FRVBST01EZWZhdWx0VmFsdWVbaV0gJiAweGZmKTsKKwkJaWYgKChwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSAhPSAweEZGRkYpCisJCSAgICAmJiAocEFkLT5FRVBST01EZWZhdWx0VmFsdWVbaV0gIT0gMCkpIHsKKwkJCUJicFJlZ0lkeCA9ICh1OCkocEFkLT5FRVBST01EZWZhdWx0VmFsdWVbaV0gPj4gOCk7CisJCQlCYnBWYWx1ZSA9ICh1OCkocEFkLT5FRVBST01EZWZhdWx0VmFsdWVbaV0gJiAweGZmKTsKIAkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCYnBSZWdJZHgsIEJicFZhbHVlKTsKIAkJfQogCX0KIAotI2lmbmRlZiBSVDI4NzAKLQlBbnRlbm5hLndvcmQgPSBwQWQtPkFudGVubmEud29yZDsKLSNlbHNlCi0JQW50ZW5uYS53b3JkID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMF07Ci0JaWYgKEFudGVubmEud29yZCA9PSAweEZGRkYpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFMlBST00gZXJyb3IsIGhhcmQgY29kZSBhcyAweCUwNHhcbiIsIEFudGVubmEud29yZCkpOwotCQlCVUdfT04oQW50ZW5uYS53b3JkID09IDB4RkZGRik7Ci0JfQotI2VuZGlmCi0JcEFkLT5NbG1lLlJlYWxSeFBhdGggPSAoVUNIQVIpIEFudGVubmEuZmllbGQuUnhQYXRoOwotCXBBZC0+UmZJY1R5cGUgPSAoVUNIQVIpIEFudGVubmEuZmllbGQuUmZJY1R5cGU7Ci0KLSNpZmRlZiBSVDI4NzAKLQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoInBBZC0+UmZJY1R5cGUgPSAlZCwgUmVhbFJ4UGF0aD0lZCwgVHhQYXRoID0gJWRcbiIsIHBBZC0+UmZJY1R5cGUsIHBBZC0+TWxtZS5SZWFsUnhQYXRoLEFudGVubmEuZmllbGQuVHhQYXRoKSk7Ci0KLQkvLyBTYXZlIHRoZSBhbnRlbm5hIGZvciBmdXR1cmUgdXNlCi0JcEFkLT5BbnRlbm5hLndvcmQgPSBBbnRlbm5hLndvcmQ7Ci0jZW5kaWYKIAlOaWNDb25maWcyLndvcmQgPSBwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsxXTsKIAotI2lmZGVmIFJUMjg3MAogCXsKLQkJaWYgKChOaWNDb25maWcyLndvcmQgJiAweDAwZmYpID09IDB4ZmYpCi0JCXsKKwkJaWYgKChOaWNDb25maWcyLndvcmQgJiAweDAwZmYpID09IDB4ZmYpIHsKIAkJCU5pY0NvbmZpZzIud29yZCAmPSAweGZmMDA7CiAJCX0KIAotCQlpZiAoKE5pY0NvbmZpZzIud29yZCA+PiA4KSA9PSAweGZmKQotCQl7CisJCWlmICgoTmljQ29uZmlnMi53b3JkID4+IDgpID09IDB4ZmYpIHsKIAkJCU5pY0NvbmZpZzIud29yZCAmPSAweDAwZmY7CiAJCX0KIAl9Ci0jZW5kaWYKLQkvLyBTYXZlIHRoZSBhbnRlbm5hIGZvciBmdXR1cmUgdXNlCisKKwkvKiBTYXZlIHRoZSBhbnRlbm5hIGZvciBmdXR1cmUgdXNlICovCiAJcEFkLT5OaWNDb25maWcyLndvcmQgPSBOaWNDb25maWcyLndvcmQ7CiAKLSNpZmRlZiBSVDI4NzAKLQkvLyBzZXQgZGVmYXVsdCBhbnRlbm5hIGFzIG1haW4KKyNpZmRlZiBSVDMweHgKKwkvKiBzZXQgZGVmYXVsdCBhbnRlbm5hIGFzIG1haW4gKi8KIAlpZiAocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjApCiAJCUFzaWNTZXRSeEFudChwQWQsIHBBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQpOwotI2VuZGlmCi0JLy8KLQkvLyBTZW5kIExFRCBTZXR0aW5nIHRvIE1DVS4KLQkvLwotCWlmIChwQWQtPkxlZENudGwud29yZCA9PSAweEZGKQotCXsKKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KKworCS8qICovCisJLyogU2VuZCBMRUQgU2V0dGluZyB0byBNQ1UuICovCisJLyogKi8KKwlpZiAocEFkLT5MZWRDbnRsLndvcmQgPT0gMHhGRikgewogCQlwQWQtPkxlZENudGwud29yZCA9IDB4MDE7CiAJCXBBZC0+TGVkMSA9IDB4NTU1NTsKIAkJcEFkLT5MZWQyID0gMHgyMjIxOwotI2lmZGVmIFJUMjg2MAotCQlwQWQtPkxlZDMgPSAweEE5Rjg7Ci0jZW5kaWYKIAotI2lmZGVmIFJUMjg3MAorI2lmZGVmIFJUTVBfTUFDX1BDSQorCQlwQWQtPkxlZDMgPSAweEE5Rjg7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisjaWZkZWYgUlRNUF9NQUNfVVNCCiAJCXBBZC0+TGVkMyA9IDB4NTYyNzsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAl9CiAKLQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTIsIDB4ZmYsIChVQ0hBUilwQWQtPkxlZDEsIChVQ0hBUikocEFkLT5MZWQxID4+IDgpKTsKLQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTMsIDB4ZmYsIChVQ0hBUilwQWQtPkxlZDIsIChVQ0hBUikocEFkLT5MZWQyID4+IDgpKTsKLQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTQsIDB4ZmYsIChVQ0hBUilwQWQtPkxlZDMsIChVQ0hBUikocEFkLT5MZWQzID4+IDgpKTsKLSAgICBwQWQtPkxlZEluZGljYXRvclN0cmVndGggPSAweEZGOwotICAgIFJUTVBTZXRTaWduYWxMRUQocEFkLCAtMTAwKTsJLy8gRm9yY2Ugc2lnbmFsIHN0cmVuZ3RoIExlZCB0byBiZSB0dXJuZWQgb2ZmLCBiZWZvcmUgbGluayB1cAorCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MiwgMHhmZiwgKHU4KXBBZC0+TGVkMSwKKwkJCSAgICAgKHU4KShwQWQtPkxlZDEgPj4gOCkpOworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MywgMHhmZiwgKHU4KXBBZC0+TGVkMiwKKwkJCSAgICAgKHU4KShwQWQtPkxlZDIgPj4gOCkpOworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1NCwgMHhmZiwgKHU4KXBBZC0+TGVkMywKKwkJCSAgICAgKHU4KShwQWQtPkxlZDMgPj4gOCkpOworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MSwgMHhmZiwgMCwgcEFkLT5MZWRDbnRsLmZpZWxkLlBvbGFyaXR5KTsKKworCXBBZC0+TGVkSW5kaWNhdG9yU3RyZW5ndGggPSAweEZGOworCVJUTVBTZXRTaWduYWxMRUQocEFkLCAtMTAwKTsJLyogRm9yY2Ugc2lnbmFsIHN0cmVuZ3RoIExlZCB0byBiZSB0dXJuZWQgb2ZmLCBiZWZvcmUgbGluayB1cCAqLwogCiAJewotCQkvLyBSZWFkIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gc3RhdGUgZW5hYmxlIGJpdAotCQlpZiAoTmljQ29uZmlnMi5maWVsZC5IYXJkd2FyZVJhZGlvQ29udHJvbCA9PSAxKQotCQl7CisJCS8qIFJlYWQgSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBzdGF0ZSBlbmFibGUgYml0ICovCisJCWlmIChOaWNDb25maWcyLmZpZWxkLkhhcmR3YXJlUmFkaW9Db250cm9sID09IDEpIHsKIAkJCXBBZC0+U3RhQ2ZnLmJIYXJkd2FyZVJhZGlvID0gVFJVRTsKIAotCQkJLy8gUmVhZCBHUElPIHBpbjIgYXMgSGFyZHdhcmUgY29udHJvbGxlZCByYWRpbyBzdGF0ZQorCQkJLyogUmVhZCBHUElPIHBpbjIgYXMgSGFyZHdhcmUgY29udHJvbGxlZCByYWRpbyBzdGF0ZSAqLwogCQkJUlRNUF9JT19SRUFEMzIocEFkLCBHUElPX0NUUkxfQ0ZHLCAmZGF0YSk7Ci0JCQlpZiAoKGRhdGEgJiAweDA0KSA9PSAwKQotCQkJeworCQkJaWYgKChkYXRhICYgMHgwNCkgPT0gMCkgewogCQkJCXBBZC0+U3RhQ2ZnLmJId1JhZGlvID0gRkFMU0U7CiAJCQkJcEFkLT5TdGFDZmcuYlJhZGlvID0gRkFMU0U7CisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIFBXUl9QSU5fQ0ZHLCAweDAwMDAxODE4KTsgKi8KIAkJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOwogCQkJfQotCQl9Ci0JCWVsc2UKKwkJfSBlbHNlCiAJCQlwQWQtPlN0YUNmZy5iSGFyZHdhcmVSYWRpbyA9IEZBTFNFOwogCi0JCWlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gRkFMU0UpCi0JCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkgewogCQkJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PRkYpOwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PTik7Ci0jaWZkZWYgUlQyODYwCisjaWZkZWYgUlRNUF9NQUNfUENJCisjaWZkZWYgUlQzMDkwCisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIFBvd2VyUmFkaW9PZmZDSUQsIDB4ZmYsCisJCQkJCSAgICAgMHgwMik7CisJCQlBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyUmFkaW9PZmZDSUQpOworI2VuZGlmIC8qIFJUMzA5MCAvLyAqLworI2lmbmRlZiBSVDMwOTAKIAkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMCwgMHhmZiwgMHhmZiwgMHgwMik7Ci0JCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIFBvd2VyV2FrZUNJRCwgMHgwMCwgMHgwMCk7Ci0JCQkvLyAyLTEuIHdhaXQgY29tbWFuZCBvay4KKyNlbmRpZiAvKiBSVDMwOTAgLy8gKi8KKwkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMSwgUG93ZXJXYWtlQ0lELCAweDAwLAorCQkJCQkgICAgIDB4MDApOworCQkJLyogMi0xLiB3YWl0IGNvbW1hbmQgb2suICovCiAJCQlBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyV2FrZUNJRCk7Ci0jZW5kaWYKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAkJfQogCX0KIAotCS8vIFR1cm4gb2ZmIHBhdGNoaW5nIGZvciBjYXJkYnVzIGNvbnRyb2xsZXIKLQlpZiAoTmljQ29uZmlnMi5maWVsZC5DYXJkYnVzQWNjZWxlcmF0aW9uID09IDEpCi0JeworI2lmZGVmIFJUTVBfTUFDX1BDSQorI2lmZGVmIFJUMzB4eAorCWlmIChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkgeworCQlzdHJ1Y3QgcnRfcnRtcF9jaGlwX29wICpwQ2hpcE9wcyA9ICZwQWQtPmNoaXBPcHM7CisJCWlmIChwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUpCisJCQlwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUocEFkKTsKKwl9CisJLyogMzA5MCBNQ1UgV2FrZXVwIGNvbW1hbmQgbmVlZHMgbW9yZSB0aW1lIHRvIGJlIHN0YWJsZS4gKi8KKwkvKiBCZWZvcmUgc3RhYmxlLCBkb24ndCBpc3N1ZSBvdGhlciBNQ1UgY29tbWFuZCB0byBwcmV2ZW50IGZyb20gZmlybXdhcmUgZXJyb3IuICovCisKKwlpZiAoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKQorCSAgICAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKQorCSAgICAmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQorCSAgICAmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzLCByZWxlYXNlIE1jdSBMb2NrXG4iLCBfX2Z1bmNfXykpOworCQlSVE1QX1NFTV9MT0NLKCZwQWQtPk1jdUNtZExvY2spOworCQlwQWQtPmJydDMweHhCYW5NY3VDbWQgPSBGQUxTRTsKKwkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1jdUNtZExvY2spOworCX0KKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKworCS8qIFR1cm4gb2ZmIHBhdGNoaW5nIGZvciBjYXJkYnVzIGNvbnRyb2xsZXIgKi8KKwlpZiAoTmljQ29uZmlnMi5maWVsZC5DYXJkYnVzQWNjZWxlcmF0aW9uID09IDEpIHsKKy8qICAgICAgICAgICAgICBwQWQtPmJUZXN0MSA9IFRSVUU7ICovCiAJfQogCiAJaWYgKE5pY0NvbmZpZzIuZmllbGQuRHluYW1pY1R4QWdjQ29udHJvbCA9PSAxKQogCQlwQWQtPmJBdXRvVHhBZ2NBID0gcEFkLT5iQXV0b1R4QWdjRyA9IFRSVUU7CiAJZWxzZQogCQlwQWQtPmJBdXRvVHhBZ2NBID0gcEFkLT5iQXV0b1R4QWdjRyA9IEZBTFNFOwotCi0JLyogQkJQIGhhcyBiZWVuIHByb2dyYW1tZWQgc28gcmVzZXQgdG8gVU5LTk9XTl9CQU5EICovCisJLyogKi8KKwkvKiBTaW5jZSBCQlAgaGFzIGJlZW4gcHJvZ2FtZWQsIHRvIG1ha2Ugc3VyZSBCQlAgc2V0dGluZyB3aWxsIGJlICovCisJLyogdXBhdGUgaW5zaWRlIG9mIEFzaWNBbnRlbm5hU2VsZWN0LCBzbyByZXNldCB0byBVTktOT1dOX0JBTkQhICovCisJLyogKi8KIAlwQWQtPkNvbW1vbkNmZy5CYW5kU3RhdGUgPSBVTktOT1dOX0JBTkQ7CiAKIAlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlBSMyk7CiAJQkJQUjMgJj0gKH4weDE4KTsKLQlpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpCi0JeworCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpIHsKIAkJQkJQUjMgfD0gKDB4MTApOwotCX0KLQllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKLQl7CisJfSBlbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpIHsKIAkJQkJQUjMgfD0gKDB4OCk7Ci0JfQotCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQotCXsKKwl9IGVsc2UgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkgewogCQlCQlBSMyB8PSAoMHgwKTsKIAl9CiAJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQkJQUjMpOwogCiAJewotCQkvLyBIYW5kbGUgdGhlIGRpZmZlcmVuY2Ugd2hlbiAxVAorCQkvKiBIYW5kbGUgdGhlIGRpZmZlcmVuY2Ugd2hlbiAxVCAqLwogCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZCQlBSMSk7Ci0JCWlmKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKLQkJewotCQlCQlBSMSAmPSAofjB4MTgpOworCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKSB7CisJCQlCQlBSMSAmPSAofjB4MTgpOwogCQl9CiAJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIEJCUFIxKTsKIAotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJVc2UgSHcgUmFkaW8gQ29udHJvbCBQaW49JWQ7IGlmIHVzZWQgUGluPSVkO1xuIiwgcEFkLT5Db21tb25DZmcuYkhhcmR3YXJlUmFkaW8sIHBBZC0+Q29tbW9uQ2ZnLmJIYXJkd2FyZVJhZGlvKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiVXNlIEh3IFJhZGlvIENvbnRyb2wgUGluPSVkOyBpZiB1c2VkIFBpbj0lZDtcbiIsCisJCQkgIHBBZC0+Q29tbW9uQ2ZnLmJIYXJkd2FyZVJhZGlvLAorCQkJICBwQWQtPkNvbW1vbkNmZy5iSGFyZHdhcmVSYWRpbykpOwogCX0KIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4UGF0aCA9ICVkLCBSeFBhdGggPSAlZCwgUkZJQz0lZCwgUG9sYXIrTEVEIG1vZGU9JXhcbiIsIHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGgsIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGgsIHBBZC0+UmZJY1R5cGUsIHBBZC0+TGVkQ250bC53b3JkKSk7CisjaWZkZWYgUlRNUF9NQUNfVVNCCisjaWZkZWYgUlQzMHh4CisJLyogdXBkYXRlIHJlZ2lzdGVycyBmcm9tIEVFUFJPTSBmb3IgUlQzMDcxIG9yIGxhdGVyKDM1NzIvMzU5MikuICovCisKKwlpZiAoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpIHsKKwkJdTggUmVnSWR4LCBSZWdWYWx1ZTsKKwkJdTE2IHZhbHVlOworCisJCS8qIGFmdGVyIFJUMzA3MSwgd3JpdGUgQkJQIGZyb20gRUVQUk9NIDB4RjAgdG8gMHgxMDIgKi8KKwkJZm9yIChpID0gMHhGMDsgaSA8PSAweDEwMjsgaSA9IGkgKyAyKSB7CisJCQl2YWx1ZSA9IDB4RkZGRjsKKwkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgaSwgdmFsdWUpOworCQkJaWYgKCh2YWx1ZSAhPSAweEZGRkYpICYmICh2YWx1ZSAhPSAwKSkgeworCQkJCVJlZ0lkeCA9ICh1OCkodmFsdWUgPj4gOCk7CisJCQkJUmVnVmFsdWUgPSAodTgpKHZhbHVlICYgMHhmZik7CisJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIFJlZ0lkeCwKKwkJCQkJCQkgICAgIFJlZ1ZhbHVlKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiVXBkYXRlIEJCUCBSZWdpc3RlcnMgZnJvbSBFRVBST00oMHglMHgpLCBCQlAoMHgleCkgPSAweCV4XG4iLAorCQkJCQkgIGksIFJlZ0lkeCwgUmVnVmFsdWUpKTsKKwkJCX0KKwkJfQorCisJCS8qIGFmdGVyIFJUMzA3MSwgd3JpdGUgUkYgZnJvbSBFRVBST00gMHgxMDQgdG8gMHgxMTYgKi8KKwkJZm9yIChpID0gMHgxMDQ7IGkgPD0gMHgxMTY7IGkgPSBpICsgMikgeworCQkJdmFsdWUgPSAweEZGRkY7CisJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIGksIHZhbHVlKTsKKwkJCWlmICgodmFsdWUgIT0gMHhGRkZGKSAmJiAodmFsdWUgIT0gMCkpIHsKKwkJCQlSZWdJZHggPSAodTgpKHZhbHVlID4+IDgpOworCQkJCVJlZ1ZhbHVlID0gKHU4KSh2YWx1ZSAmIDB4ZmYpOworCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJlZ0lkeCwgUmVnVmFsdWUpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJVcGRhdGUgUkYgUmVnaXN0ZXJzIGZyb20gRUVQUk9NMHgleCksIEJCUCgweCV4KSA9IDB4JXhcbiIsCisJCQkJCSAgaSwgUmVnSWR4LCBSZWdWYWx1ZSkpOworCQkJfQorCQl9CisJfQorI2VuZGlmIC8qIFJUMzB4eCAvLyAqLworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIlR4UGF0aCA9ICVkLCBSeFBhdGggPSAlZCwgUkZJQz0lZCwgUG9sYXIrTEVEIG1vZGU9JXhcbiIsCisJCSAgcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwgcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCwKKwkJICBwQWQtPlJmSWNUeXBlLCBwQWQtPkxlZENudGwud29yZCkpOwogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJbml0QXNpY0Zyb21FRVBST01cbiIpKTsKIH0KIApAQCAtMTg5MSwzOSArMTM2NiwzOSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotTkRJU19TVEFUVVMJTklDSW5pdGlhbGl6ZUFkYXB0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gICBCT09MRUFOICAgIGJIYXJkUmVzZXQpCitpbnQgTklDSW5pdGlhbGl6ZUFkYXB0ZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBCT09MRUFOIGJIYXJkUmVzZXQpCiB7Ci0JTkRJU19TVEFUVVMgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JV1BETUFfR0xPX0NGR19TVFJVQwlHbG9DZmc7Ci0jaWZkZWYgUlQyODYwCi0JVUlOVDMyCQkJVmFsdWU7Ci0JREVMQVlfSU5UX0NGR19TVFJVQwlJbnRDZmc7Ci0jZW5kaWYKLQlVTE9ORwlpID0wLCBqPTA7Ci0JQUNfVFhPUF9DU1IwX1NUUlVDCWNzcjA7CisJaW50IFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJV1BETUFfR0xPX0NGR19TVFJVQyBHbG9DZmc7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJdTMyIFZhbHVlOworCURFTEFZX0lOVF9DRkdfU1RSVUMgSW50Q2ZnOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworLyogICAgICBJTlRfTUFTS19DU1JfU1RSVUMgICAgICAgICAgICAgIEludE1hc2s7ICovCisJdW5zaWduZWQgbG9uZyBpID0gMCwgaiA9IDA7CisJQUNfVFhPUF9DU1IwX1NUUlVDIGNzcjA7CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDSW5pdGlhbGl6ZUFkYXB0ZXJcbiIpKTsKIAotCS8vIDMuIFNldCBETUEgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gZXhjZXB0IFRYX0RNQV9FTiBhbmQgUlhfRE1BX0VOIGJpdHM6CisJLyogMy4gU2V0IERNQSBnbG9iYWwgY29uZmlndXJhdGlvbiBleGNlcHQgVFhfRE1BX0VOIGFuZCBSWF9ETUFfRU4gYml0czogKi8KIHJldHJ5OgogCWkgPSAwOwotCWRvCi0JeworCWRvIHsKIAkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOwotCQlpZiAoKEdsb0NmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkgICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQorCQlpZiAoKEdsb0NmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkKKwkJICAgICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQogCQkJYnJlYWs7CiAKIAkJUlRNUHVzZWNEZWxheSgxMDAwKTsKIAkJaSsrOwotCX13aGlsZSAoIGk8MTAwKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gRE1BIG9mZnNldCAweDIwOCA9IDB4JXhcbiIsIEdsb0NmZy53b3JkKSk7CisJfSB3aGlsZSAoaSA8IDEwMCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIjw9PSBETUEgb2Zmc2V0IDB4MjA4ID0gMHgleFxuIiwgR2xvQ2ZnLndvcmQpKTsKIAlHbG9DZmcud29yZCAmPSAweGZmMDsKLQlHbG9DZmcuZmllbGQuRW5UWFdyaXRlQmFja0RET05FID0xOworCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPSAxOwogCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKIAotCS8vIFJlY29yZCBIVyBCZWFjb24gb2Zmc2V0CisJLyogUmVjb3JkIEhXIEJlYWNvbiBvZmZzZXQgKi8KIAlwQWQtPkJlYWNvbk9mZnNldFswXSA9IEhXX0JFQUNPTl9CQVNFMDsKIAlwQWQtPkJlYWNvbk9mZnNldFsxXSA9IEhXX0JFQUNPTl9CQVNFMTsKIAlwQWQtPkJlYWNvbk9mZnNldFsyXSA9IEhXX0JFQUNPTl9CQVNFMjsKQEAgLTE5MzMsOTEgKzE0MDgsODcgQEAKIAlwQWQtPkJlYWNvbk9mZnNldFs2XSA9IEhXX0JFQUNPTl9CQVNFNjsKIAlwQWQtPkJlYWNvbk9mZnNldFs3XSA9IEhXX0JFQUNPTl9CQVNFNzsKIAotCS8vCi0JLy8gd3JpdGUgYWxsIHNoYXJlZCBSaW5nJ3MgYmFzZSBhZGRyZXNzIGludG8gQVNJQwotCS8vCisJLyogKi8KKwkvKiB3cml0ZSBhbGwgc2hhcmVkIFJpbmcncyBiYXNlIGFkZHJlc3MgaW50byBBU0lDICovCisJLyogKi8KIAotCS8vIGFzaWMgc2ltdWxhdGlvbiBzZXF1ZW5jZSBwdXQgdGhpcyBhaGVhZCBiZWZvcmUgbG9hZGluZyBmaXJtd2FyZS4KLQkvLyBwYmYgaGFyZHdhcmUgcmVzZXQKLSNpZmRlZiBSVDI4NjAKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9SU1RfSURYLCAweDEwMDNmKTsJLy8gMHgxMDAwMCBmb3IgcmVzZXQgcngsIDB4M2YgcmVzZXRzIGFsbCA2IHR4IHJpbmdzLgorCS8qIGFzaWMgc2ltdWxhdGlvbiBzZXF1ZW5jZSBwdXQgdGhpcyBhaGVhZCBiZWZvcmUgbG9hZGluZyBmaXJtd2FyZS4gKi8KKwkvKiBwYmYgaGFyZHdhcmUgcmVzZXQgKi8KKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9SU1RfSURYLCAweDEwMDNmKTsJLyogMHgxMDAwMCBmb3IgcmVzZXQgcngsIDB4M2YgcmVzZXRzIGFsbCA2IHR4IHJpbmdzLiAqLwogCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHhlMWYpOwogCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHhlMDApOwotI2VuZGlmCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiAKLQkvLyBJbml0aWFsemUgQVNJQyBmb3IgVFggJiBSeCBvcGVyYXRpb24KLQlpZiAoTklDSW5pdGlhbGl6ZUFzaWMocEFkICwgYkhhcmRSZXNldCkgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCWlmIChqKysgPT0gMCkKLQkJeworCS8qIEluaXRpYWx6ZSBBU0lDIGZvciBUWCAmIFJ4IG9wZXJhdGlvbiAqLworCWlmIChOSUNJbml0aWFsaXplQXNpYyhwQWQsIGJIYXJkUmVzZXQpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJaWYgKGorKyA9PSAwKSB7CiAJCQlOSUNMb2FkRmlybXdhcmUocEFkKTsKIAkJCWdvdG8gcmV0cnk7CiAJCX0KIAkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CiAJfQogCi0KLSNpZmRlZiBSVDI4NjAKLQkvLyBXcml0ZSBBQ19CSyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIKLQlWYWx1ZSA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhSaW5nW1FJRF9BQ19CS10uQ2VsbFswXS5BbGxvY1BhKTsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkvKiBXcml0ZSBBQ19CSyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKwlWYWx1ZSA9CisJICAgIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhSaW5nW1FJRF9BQ19CS10uQ2VsbFswXS5BbGxvY1BhKTsKIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQVNFX1BUUjEsIFZhbHVlKTsKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVFhfQkFTRV9QVFIxIDogMHgleFxuIiwgVmFsdWUpKTsKIAotCS8vIFdyaXRlIEFDX0JFIGJhc2UgYWRkcmVzcyByZWdpc3RlcgotCVZhbHVlID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5DZWxsWzBdLkFsbG9jUGEpOworCS8qIFdyaXRlIEFDX0JFIGJhc2UgYWRkcmVzcyByZWdpc3RlciAqLworCVZhbHVlID0KKwkgICAgUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5DZWxsWzBdLkFsbG9jUGEpOwogCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBU0VfUFRSMCwgVmFsdWUpOwogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBUWF9CQVNFX1BUUjAgOiAweCV4XG4iLCBWYWx1ZSkpOwogCi0JLy8gV3JpdGUgQUNfVkkgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyCi0JVmFsdWUgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPlR4UmluZ1tRSURfQUNfVkldLkNlbGxbMF0uQWxsb2NQYSk7CisJLyogV3JpdGUgQUNfVkkgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyICovCisJVmFsdWUgPQorCSAgICBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPlR4UmluZ1tRSURfQUNfVkldLkNlbGxbMF0uQWxsb2NQYSk7CiAJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFTRV9QVFIyLCBWYWx1ZSk7CiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFRYX0JBU0VfUFRSMiA6IDB4JXhcbiIsIFZhbHVlKSk7CiAKLQkvLyBXcml0ZSBBQ19WTyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIKLQlWYWx1ZSA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhSaW5nW1FJRF9BQ19WT10uQ2VsbFswXS5BbGxvY1BhKTsKKwkvKiBXcml0ZSBBQ19WTyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKwlWYWx1ZSA9CisJICAgIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhSaW5nW1FJRF9BQ19WT10uQ2VsbFswXS5BbGxvY1BhKTsKIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQVNFX1BUUjMsIFZhbHVlKTsKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVFhfQkFTRV9QVFIzIDogMHgleFxuIiwgVmFsdWUpKTsKIAotCS8vIFdyaXRlIEhDQ0EgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyCi0JICBWYWx1ZSA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhSaW5nW1FJRF9IQ0NBXS5DZWxsWzBdLkFsbG9jUGEpOwotCSAgUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFTRV9QVFI0LCBWYWx1ZSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFRYX0JBU0VfUFRSNCA6IDB4JXhcbiIsIFZhbHVlKSk7Ci0KLQkvLyBXcml0ZSBNR01UX0JBU0VfQ1NSIHJlZ2lzdGVyCisJLyogV3JpdGUgTUdNVF9CQVNFX0NTUiByZWdpc3RlciAqLwogCVZhbHVlID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5NZ210UmluZy5DZWxsWzBdLkFsbG9jUGEpOwogCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBU0VfUFRSNSwgVmFsdWUpOwogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBUWF9CQVNFX1BUUjUgOiAweCV4XG4iLCBWYWx1ZSkpOwogCi0JLy8gV3JpdGUgUlhfQkFTRV9DU1IgcmVnaXN0ZXIKKwkvKiBXcml0ZSBSWF9CQVNFX0NTUiByZWdpc3RlciAqLwogCVZhbHVlID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5SeFJpbmcuQ2VsbFswXS5BbGxvY1BhKTsKIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9CQVNFX1BUUiwgVmFsdWUpOwogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBSWF9CQVNFX1BUUiA6IDB4JXhcbiIsIFZhbHVlKSk7CiAKLQkvLyBJbml0IFJYIFJpbmcgaW5kZXggcG9pbnRlcgorCS8qIEluaXQgUlggUmluZyBpbmRleCBwb2ludGVyICovCiAJcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPSAwOwotCXBBZC0+UnhSaW5nLlJ4Q3B1SWR4ID0gUlhfUklOR19TSVpFLTE7CisJcEFkLT5SeFJpbmcuUnhDcHVJZHggPSBSWF9SSU5HX1NJWkUgLSAxOwogCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0NSWF9JRFgsIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4KTsKIAotCS8vIEluaXQgVFggcmluZ3MgaW5kZXggcG9pbnRlcgorCS8qIEluaXQgVFggcmluZ3MgaW5kZXggcG9pbnRlciAqLwogCXsKLQkJZm9yIChpPTA7IGk8TlVNX09GX1RYX1JJTkc7IGkrKykKLQkJeworCQlmb3IgKGkgPSAwOyBpIDwgTlVNX09GX1RYX1JJTkc7IGkrKykgewogCQkJcEFkLT5UeFJpbmdbaV0uVHhTd0ZyZWVJZHggPSAwOwogCQkJcEFkLT5UeFJpbmdbaV0uVHhDcHVJZHggPSAwOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgKFRYX0NUWF9JRFgwICsgaSAqIDB4MTApICwgIHBBZC0+VHhSaW5nW2ldLlR4Q3B1SWR4KTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIChUWF9DVFhfSURYMCArIGkgKiAweDEwKSwKKwkJCQkJcEFkLT5UeFJpbmdbaV0uVHhDcHVJZHgpOwogCQl9CiAJfQogCi0JLy8gaW5pdCBNR01UIHJpbmcgaW5kZXggcG9pbnRlcgorCS8qIGluaXQgTUdNVCByaW5nIGluZGV4IHBvaW50ZXIgKi8KIAlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID0gMDsKIAlwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4ID0gMDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NR01UQ1RYX0lEWCwgIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01HTVRDVFhfSURYLCBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4KTsKIAotCS8vCi0JLy8gc2V0IGVhY2ggUmluZydzIFNJWkUgIGludG8gQVNJQy4gRGVzY3JpcHRvciBTaXplIGlzIGZpeGVkIGJ5IGRlc2lnbi4KLQkvLworCS8qICovCisJLyogc2V0IGVhY2ggUmluZydzIFNJWkUgIGludG8gQVNJQy4gRGVzY3JpcHRvciBTaXplIGlzIGZpeGVkIGJ5IGRlc2lnbi4gKi8KKwkvKiAqLwogCi0JLy8gV3JpdGUgVFhfUklOR19DU1IwIHJlZ2lzdGVyCisJLyogV3JpdGUgVFhfUklOR19DU1IwIHJlZ2lzdGVyICovCiAJVmFsdWUgPSBUWF9SSU5HX1NJWkU7CiAJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTUFYX0NOVDAsIFZhbHVlKTsKIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NQVhfQ05UMSwgVmFsdWUpOwpAQCAtMjAyNyw1MyArMTQ5OCw0NyBAQAogCVZhbHVlID0gTUdNVF9SSU5HX1NJWkU7CiAJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTUdNVE1BWF9DTlQsIFZhbHVlKTsKIAotCS8vIFdyaXRlIFJYX1JJTkdfQ1NSIHJlZ2lzdGVyCisJLyogV3JpdGUgUlhfUklOR19DU1IgcmVnaXN0ZXIgKi8KIAlWYWx1ZSA9IFJYX1JJTkdfU0laRTsKIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9NQVhfQ05ULCBWYWx1ZSk7Ci0jZW5kaWYgLyogUlQyODYwICovCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiAKLQotCS8vIFdNTSBwYXJhbWV0ZXIKKwkvKiBXTU0gcGFyYW1ldGVyICovCiAJY3NyMC53b3JkID0gMDsKIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDBfQ0ZHLCBjc3IwLndvcmQpOwotCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCi0JewotCQljc3IwLmZpZWxkLkFjMFR4b3AgPSAxOTI7CS8vIEFDX1ZJOiAxOTIqMzJ1cyB+PSA2bXMKLQkJY3NyMC5maWVsZC5BYzFUeG9wID0gOTY7CS8vIEFDX1ZPOiA5NiozMnVzICB+PSAzbXMKLQl9Ci0JZWxzZQotCXsKLQkJY3NyMC5maWVsZC5BYzBUeG9wID0gOTY7CS8vIEFDX1ZJOiA5NiozMnVzIH49IDNtcwotCQljc3IwLmZpZWxkLkFjMVR4b3AgPSA0ODsJLy8gQUNfVk86IDQ4KjMydXMgfj0gMS41bXMKKwlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKSB7CisJCWNzcjAuZmllbGQuQWMwVHhvcCA9IDE5MjsJLyogQUNfVkk6IDE5MiozMnVzIH49IDZtcyAqLworCQljc3IwLmZpZWxkLkFjMVR4b3AgPSA5NjsJLyogQUNfVk86IDk2KjMydXMgIH49IDNtcyAqLworCX0gZWxzZSB7CisJCWNzcjAuZmllbGQuQWMwVHhvcCA9IDk2OwkvKiBBQ19WSTogOTYqMzJ1cyB+PSAzbXMgKi8KKwkJY3NyMC5maWVsZC5BYzFUeG9wID0gNDg7CS8qIEFDX1ZPOiA0OCozMnVzIH49IDEuNW1zICovCiAJfQogCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9UWE9QMV9DRkcsIGNzcjAud29yZCk7CiAKLQotI2lmZGVmIFJUMjg2MAotCS8vIDMuIFNldCBETUEgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gZXhjZXB0IFRYX0RNQV9FTiBhbmQgUlhfRE1BX0VOIGJpdHM6CisjaWZkZWYgUlRNUF9NQUNfUENJCisJLyogMy4gU2V0IERNQSBnbG9iYWwgY29uZmlndXJhdGlvbiBleGNlcHQgVFhfRE1BX0VOIGFuZCBSWF9ETUFfRU4gYml0czogKi8KIAlpID0gMDsKLQlkbwotCXsKKwlkbyB7CiAJCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKLQkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApICAmJiAoR2xvQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKKwkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApCisJCSAgICAmJiAoR2xvQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKIAkJCWJyZWFrOwogCiAJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CiAJCWkrKzsKLQl9d2hpbGUgKCBpIDwgMTAwKTsKKwl9IHdoaWxlIChpIDwgMTAwKTsKIAogCUdsb0NmZy53b3JkICY9IDB4ZmYwOwotCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPTE7CisJR2xvQ2ZnLmZpZWxkLkVuVFhXcml0ZUJhY2tERE9ORSA9IDE7CiAJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOwogCiAJSW50Q2ZnLndvcmQgPSAwOwogCVJUTVBfSU9fV1JJVEUzMihwQWQsIERFTEFZX0lOVF9DRkcsIEludENmZy53b3JkKTsKLSNlbmRpZgorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCi0KLQkvLyByZXNldCBhY3Rpb24KLQkvLyBMb2FkIGZpcm13YXJlCi0JLy8gIFN0YXR1cyA9IE5JQ0xvYWRGaXJtd2FyZShwQWQpOworCS8qIHJlc2V0IGFjdGlvbiAqLworCS8qIExvYWQgZmlybXdhcmUgKi8KKwkvKiAgU3RhdHVzID0gTklDTG9hZEZpcm13YXJlKHBBZCk7ICovCiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSW5pdGlhbGl6ZUFkYXB0ZXJcbiIpKTsKIAlyZXR1cm4gU3RhdHVzOwpAQCAtMjA5Nyw0MiArMTU2Miw1NSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotTkRJU19TVEFUVVMJTklDSW5pdGlhbGl6ZUFzaWMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gIEJPT0xFQU4JCWJIYXJkUmVzZXQpCitpbnQgTklDSW5pdGlhbGl6ZUFzaWMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBCT09MRUFOIGJIYXJkUmVzZXQpCiB7Ci0JVUxPTkcJCQlJbmRleCA9IDA7Ci0JVUNIQVIJCQlSMCA9IDB4ZmY7Ci0JVUlOVDMyCQkJTWFjQ3NyMTIgPSAwLCBDb3VudGVyID0gMDsKLSNpZmRlZiBSVDI4NzAKLQlVSU5UMzIJCQlNYWNDc3IwID0gMDsKLQlOVFNUQVRVUwkJU3RhdHVzOwotCVVDSEFSCQkJVmFsdWUgPSAweGZmOwotCVVJTlQzMgkJCWVGdXNlQ3RybDsKLSNlbmRpZgotCVVTSE9SVAkJCUtleUlkeDsKLQlJTlQJCQkJaSxhcGlkeDsKKwl1bnNpZ25lZCBsb25nIEluZGV4ID0gMDsKKwl1OCBSMCA9IDB4ZmY7CisJdTMyIE1hY0NzcjEyID0gMCwgQ291bnRlciA9IDA7CisjaWZkZWYgUlRNUF9NQUNfVVNCCisJdTMyIE1hY0NzcjAgPSAwOworCWludCBTdGF0dXM7CisJdTggVmFsdWUgPSAweGZmOworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworI2lmZGVmIFJUMzB4eAorCXU4IGJicHJlZyA9IDA7CisJdTggUkZWYWx1ZSA9IDA7CisjZW5kaWYgLyogUlQzMHh4IC8vICovCisJdTE2IEtleUlkeDsKKwlpbnQgaSwgYXBpZHg7CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDSW5pdGlhbGl6ZUFzaWNcbiIpKTsKIAotI2lmZGVmIFJUMjg2MAotCWlmIChiSGFyZFJlc2V0ID09IFRSVUUpCi0JeworI2lmZGVmIFJUTVBfTUFDX1BDSQorCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBXUl9QSU5fQ0ZHLCAweDMpOwkvKiBUbyBmaXggZHJpdmVyIGRpc2FibGUvZW5hYmxlIGhhbmcgaXNzdWUgd2hlbiByYWRpbyBvZmYgKi8KKwlpZiAoYkhhcmRSZXNldCA9PSBUUlVFKSB7CiAJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgzKTsKLQl9Ci0JZWxzZQorCX0gZWxzZQogCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MSk7Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQkvLwotCS8vIE1ha2Ugc3VyZSBNQUMgZ2V0cyByZWFkeSBhZnRlciBOSUNMb2FkRmlybXdhcmUoKS4KLQkvLworCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDApOworCS8qIEluaXRpYWxpemUgTUFDIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUgKi8KKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOVU1fTUFDX1JFR19QQVJNUzsgSW5kZXgrKykgeworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIsCisJCQkJTUFDUmVnVGFibGVbSW5kZXhdLlZhbHVlKTsKKwl9CisKKwl7CisJCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9TVEFfTUFDX1JFR19QQVJNUzsgSW5kZXgrKykgeworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgU1RBTUFDUmVnVGFibGVbSW5kZXhdLlJlZ2lzdGVyLAorCQkJCQlTVEFNQUNSZWdUYWJsZVtJbmRleF0uVmFsdWUpOworCQl9CisJfQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgorCS8qICovCisJLyogTWFrZSBzdXJlIE1BQyBnZXRzIHJlYWR5IGFmdGVyIE5JQ0xvYWRGaXJtd2FyZSgpLiAqLworCS8qICovCiAJSW5kZXggPSAwOwogCi0JLy9UbyBhdm9pZCBoYW5nLW9uIGlzc3VlIHdoZW4gaW50ZXJmYWNlIHVwIGluIGtlcm5lbCAyLjQsCi0JLy93ZSB1c2UgYSBsb2NhbCB2YXJpYWJsZSAiTWFjQ3NyMCIgaW5zdGVhZCBvZiB1c2luZyAicEFkLT5NQUNWZXJzaW9uIiBkaXJlY3RseS4KLQlkbwotCXsKKwkvKlRvIGF2b2lkIGhhbmctb24gaXNzdWUgd2hlbiBpbnRlcmZhY2UgdXAgaW4ga2VybmVsIDIuNCwgKi8KKwkvKndlIHVzZSBhIGxvY2FsIHZhcmlhYmxlICJNYWNDc3IwIiBpbnN0ZWFkIG9mIHVzaW5nICJwQWQtPk1BQ1ZlcnNpb24iIGRpcmVjdGx5LiAqLworCWRvIHsKIAkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfQ1NSMCwgJk1hY0NzcjApOwogCiAJCWlmICgoTWFjQ3NyMCAhPSAweDAwKSAmJiAoTWFjQ3NyMCAhPSAweEZGRkZGRkZGKSkKQEAgLTIxNDIsOCArMTYyMCw5IEBACiAJfSB3aGlsZSAoSW5kZXgrKyA8IDEwMCk7CiAKIAlwQWQtPk1BQ1ZlcnNpb24gPSBNYWNDc3IwOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1BQ19DU1IwICBbIFZlcjpSZXY9MHglMDh4XVxuIiwgcEFkLT5NQUNWZXJzaW9uKSk7Ci0JLy8gdHVybiBvbiBiaXQxMyAoc2V0IHRvIHplcm8pIGFmdGVyIHJ0Mjg2MEQuIFRoaXMgaXMgdG8gc29sdmUgaGlnaC1jdXJyZW50IGlzc3VlLgorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJNQUNfQ1NSMCAgWyBWZXI6UmV2PTB4JTA4eF1cbiIsIHBBZC0+TUFDVmVyc2lvbikpOworCS8qIHR1cm4gb24gYml0MTMgKHNldCB0byB6ZXJvKSBhZnRlciBydDI4NjBELiBUaGlzIGlzIHRvIHNvbHZlIGhpZ2gtY3VycmVudCBpc3N1ZS4gKi8KIAlSVE1QX0lPX1JFQUQzMihwQWQsIFBCRl9TWVNfQ1RSTCwgJk1hY0NzcjEyKTsKIAlNYWNDc3IxMiAmPSAofjB4MjAwMCk7CiAJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX1NZU19DVFJMLCBNYWNDc3IxMik7CkBAIC0yMTUxLDIwMyArMTYzMCwyMjMgQEAKIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4Myk7CiAJUlRNUF9JT19XUklURTMyKHBBZCwgVVNCX0RNQV9DRkcsIDB4MCk7CiAJU3RhdHVzID0gUlRVU0JWZW5kZXJSZXNldChwQWQpOwotI2VuZGlmCiAKIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MCk7CiAKLQkvLyBJbml0aWFsaXplIE1BQyByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlCi0jaWZkZWYgUlQyODYwCi0JZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTlVNX01BQ19SRUdfUEFSTVM7IEluZGV4KyspCi0JewotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIsIE1BQ1JlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7Ci0JfQotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JZm9yKEluZGV4PTA7IEluZGV4PE5VTV9NQUNfUkVHX1BBUk1TOyBJbmRleCsrKQotCXsKLSNpZmRlZiBSVDMwNzAKLQkJaWYgKChNQUNSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIgPT0gVFhfU1dfQ0ZHMCkgJiYgKElTX1JUMzA3MChwQWQpIHx8IElTX1JUMzA3MShwQWQpKSkKLQkJeworCS8qIEluaXRpYWxpemUgTUFDIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUgKi8KKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOVU1fTUFDX1JFR19QQVJNUzsgSW5kZXgrKykgeworI2lmZGVmIFJUMzB4eAorCQlpZiAoKE1BQ1JlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciA9PSBUWF9TV19DRkcwKQorCQkgICAgJiYgKElTX1JUMzA3MChwQWQpIHx8IElTX1JUMzA3MShwQWQpIHx8IElTX1JUMzU3MihwQWQpCisJCQl8fCBJU19SVDMwOTAocEFkKSB8fCBJU19SVDMzOTAocEFkKSkpIHsKIAkJCU1BQ1JlZ1RhYmxlW0luZGV4XS5WYWx1ZSA9IDB4MDAwMDA0MDA7CiAJCX0KLSNlbmRpZiAvLyBSVDMwNzAgLy8KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgKFVTSE9SVClNQUNSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIsIE1BQ1JlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7CisjZW5kaWYgLyogUlQzMHh4IC8vICovCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsICh1MTYpTUFDUmVnVGFibGVbSW5kZXhdLlJlZ2lzdGVyLAorCQkJCU1BQ1JlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7CiAJfQotI2VuZGlmIC8vIFJUMjg3MCAvLwogCiAJewotCQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOVU1fU1RBX01BQ19SRUdfUEFSTVM7IEluZGV4KyspCi0JCXsKLSNpZmRlZiBSVDI4NjAKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNUQU1BQ1JlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgU1RBTUFDUmVnVGFibGVbSW5kZXhdLlZhbHVlKTsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgKFVTSE9SVClTVEFNQUNSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIsIFNUQU1BQ1JlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7Ci0jZW5kaWYKKwkJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTlVNX1NUQV9NQUNfUkVHX1BBUk1TOyBJbmRleCsrKSB7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLAorCQkJCQkodTE2KVNUQU1BQ1JlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwKKwkJCQkJU1RBTUFDUmVnVGFibGVbSW5kZXhdLlZhbHVlKTsKIAkJfQogCX0KKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotCS8vIEluaXRpYWxpemUgUlQzMDcwIHNlcmlhbCBNQWMgcmVnaXN0ZXJzIHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIFJUMjg3MCBzZXJpYWwKLQlpZiAoSVNfUlQzMDkwKHBBZCkpCi0JeworI2lmZGVmIFJUMzB4eAorCS8qIEluaXRpYWxpemUgUlQzMDcwIHNlcmlhbCBNQUMgcmVnaXN0ZXJzIHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIFJUMjg3MCBzZXJpYWwgKi8KKwlpZiAoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpIHsKIAkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfU1dfQ0ZHMSwgMCk7CiAKLQkJLy8gUlQzMDcxIHZlcnNpb24gRSBoYXMgZml4ZWQgdGhpcyBpc3N1ZQotCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMTEpCi0JCXsKLQkJCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuREFDVGVzdEJpdCA9PSAxKQotCQkJewotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1NXX0NGRzIsIDB4MUYpOwkvLyBUbyBmaXggdGhyb3VnaHB1dCBkcm9wIGRyYXN0aWNhbGx5CisJCS8qIFJUMzA3MSB2ZXJzaW9uIEUgaGFzIGZpeGVkIHRoaXMgaXNzdWUgKi8KKwkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjExKSB7CisJCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkRBQ1Rlc3RCaXQgPT0gMSkgeworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1NXX0NGRzIsIDB4MkMpOwkvKiBUbyBmaXggdGhyb3VnaHB1dCBkcm9wIGRyYXN0aWNhbGx5ICovCisJCQl9IGVsc2UgeworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1NXX0NGRzIsIDB4MEYpOwkvKiBUbyBmaXggdGhyb3VnaHB1dCBkcm9wIGRyYXN0aWNhbGx5ICovCiAJCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfU1dfQ0ZHMiwgMHgwRik7CS8vIFRvIGZpeCB0aHJvdWdocHV0IGRyb3AgZHJhc3RpY2FsbHkKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKKwkJfSBlbHNlIHsKIAkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1NXX0NGRzIsIDB4MCk7CiAJCX0KKwl9IGVsc2UgaWYgKElTX1JUMzA3MChwQWQpKSB7CisJCWlmICgoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMDEpKSB7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9TV19DRkcxLCAwKTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1NXX0NGRzIsIDB4MkMpOwkvKiBUbyBmaXggdGhyb3VnaHB1dCBkcm9wIGRyYXN0aWNhbGx5ICovCisJCX0gZWxzZSB7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9TV19DRkcyLCAwKTsKKwkJfQogCX0KLSNpZmRlZiBSVDI4NzAKLQllbHNlIGlmIChJU19SVDMwNzAocEFkKSkKLQl7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1NXX0NGRzEsIDApOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9TV19DRkcyLCAweDFGKTsJLy8gVG8gZml4IHRocm91Z2hwdXQgZHJvcCBkcmFzdGljYWxseQotCX0KLSNlbmRpZiAvLyBSVDMweHggLy8KKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KIAotCS8vCi0JLy8gQmVmb3JlIHByb2dyYW0gQkJQLCB3ZSBuZWVkIHRvIHdhaXQgQkJQL1JGIGdldCB3YWtlIHVwLgotCS8vCisJLyogKi8KKwkvKiBCZWZvcmUgcHJvZ3JhbSBCQlAsIHdlIG5lZWQgdG8gd2FpdCBCQlAvUkYgZ2V0IHdha2UgdXAuICovCisJLyogKi8KIAlJbmRleCA9IDA7Ci0JZG8KLQl7CisJZG8gewogCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TVEFUVVNfQ0ZHLCAmTWFjQ3NyMTIpOwogCi0JCWlmICgoTWFjQ3NyMTIgJiAweDAzKSA9PSAwKQkvLyBpZiBCQi5SRiBpcyBzdGFibGUKKwkJaWYgKChNYWNDc3IxMiAmIDB4MDMpID09IDApCS8qIGlmIEJCLlJGIGlzIHN0YWJsZSAqLwogCQkJYnJlYWs7CiAKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hlY2sgTUFDX1NUQVRVU19DRkcgID0gQnVzeSA9ICV4XG4iLCBNYWNDc3IxMikpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkNoZWNrIE1BQ19TVEFUVVNfQ0ZHICA9IEJ1c3kgPSAleFxuIiwgTWFjQ3NyMTIpKTsKIAkJUlRNUHVzZWNEZWxheSgxMDAwKTsKIAl9IHdoaWxlIChJbmRleCsrIDwgMTAwKTsKIAotICAgIC8vIFRoZSBjb21tYW5kcyB0byBmaXJtd2FyZSBzaG91bGQgYmUgYWZ0ZXIgdGhlc2UgY29tbWFuZHMsIHRoZXNlIGNvbW1hbmRzIHdpbGwgaW5pdCBmaXJtd2FyZQotCS8vIFBDSSBhbmQgVVNCIGFyZSBub3QgdGhlIHNhbWUgYmVjYXVzZSBQQ0kgZHJpdmVyIG5lZWRzIHRvIHdhaXQgZm9yIFBDSSBidXMgcmVhZHkKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fQkJQX0FHRU5ULCAwKTsJLy8gaW5pdGlhbGl6ZSBCQlAgUi9XIGFjY2VzcyBhZ2VudAorCS8qIFRoZSBjb21tYW5kcyB0byBmaXJtd2FyZSBzaG91bGQgYmUgYWZ0ZXIgdGhlc2UgY29tbWFuZHMsIHRoZXNlIGNvbW1hbmRzIHdpbGwgaW5pdCBmaXJtd2FyZSAqLworCS8qIFBDSSBhbmQgVVNCIGFyZSBub3QgdGhlIHNhbWUgYmVjYXVzZSBQQ0kgZHJpdmVyIG5lZWRzIHRvIHdhaXQgZm9yIFBDSSBidXMgcmVhZHkgKi8KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fQkJQX0FHRU5ULCAwKTsJLyogaW5pdGlhbGl6ZSBCQlAgUi9XIGFjY2VzcyBhZ2VudCAqLwogCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX0NTUiwgMCk7CisjaWZkZWYgUlQzMDkwCisJLyoyMDA4LzExLzI4OktIIGFkZCB0byBmaXggdGhlIGRlYWQgcmYgZnJlcXVlbmN5IG9mZnNldCBidWc8LS0gKi8KKwlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NzIsIDAsIDAsIDApOworCS8qMjAwOC8xMS8yODpLSCBhZGQgdG8gZml4IHRoZSBkZWFkIHJmIGZyZXF1ZW5jeSBvZmZzZXQgYnVnLS0+ICovCisjZW5kaWYgLyogUlQzMDkwIC8vICovCiAJUlRNUHVzZWNEZWxheSgxMDAwKTsKIAotCS8vIFJlYWQgQkJQIHJlZ2lzdGVyLCBtYWtlIHN1cmUgQkJQIGlzIHVwIGFuZCBydW5uaW5nIGJlZm9yZSB3cml0ZSBuZXcgZGF0YQorCS8qIFJlYWQgQkJQIHJlZ2lzdGVyLCBtYWtlIHN1cmUgQkJQIGlzIHVwIGFuZCBydW5uaW5nIGJlZm9yZSB3cml0ZSBuZXcgZGF0YSAqLwogCUluZGV4ID0gMDsKLQlkbwotCXsKKwlkbyB7CiAJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMCwgJlIwKTsKIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkJQIHZlcnNpb24gPSAleFxuIiwgUjApKTsKIAl9IHdoaWxlICgoKytJbmRleCA8IDIwKSAmJiAoKFIwID09IDB4ZmYpIHx8IChSMCA9PSAweDAwKSkpOwotCS8vQVNTRVJUKEluZGV4IDwgMjApOyAvL3RoaXMgd2lsbCBjYXVzZSBCU09EIG9uIENoZWNrLWJ1aWxkIGRyaXZlcgorCS8qQVNTRVJUKEluZGV4IDwgMjApOyAvL3RoaXMgd2lsbCBjYXVzZSBCU09EIG9uIENoZWNrLWJ1aWxkIGRyaXZlciAqLwogCiAJaWYgKChSMCA9PSAweGZmKSB8fCAoUjAgPT0gMHgwMCkpCiAJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwogCi0JLy8gSW5pdGlhbGl6ZSBCQlAgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQotCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9CQlBfUkVHX1BBUk1TOyBJbmRleCsrKQotCXsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUFJlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgQkJQUmVnVGFibGVbSW5kZXhdLlZhbHVlKTsKKwkvKiBJbml0aWFsaXplIEJCUCByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlICovCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTlVNX0JCUF9SRUdfUEFSTVM7IEluZGV4KyspIHsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUFJlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwKKwkJCQkJICAgICBCQlBSZWdUYWJsZVtJbmRleF0uVmFsdWUpOwogCX0KIAotI2lmbmRlZiBSVDI4NzAKLQkvLyBmb3IgcnQyODYwRSBhbmQgYWZ0ZXIsIGluaXQgQkJQX1I4NCB3aXRoIDB4MTkuIFRoaXMgaXMgZm9yIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIElPVC4KLQlpZiAoKHBBZC0+TUFDVmVyc2lvbiYweGZmZmYpICE9IDB4MDEwMSkKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODQsIDB4MTkpOwotI2Vsc2UKLQkvLyBmb3IgcnQyODYwRSBhbmQgYWZ0ZXIsIGluaXQgQkJQX1I4NCB3aXRoIDB4MTkuIFRoaXMgaXMgZm9yIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIElPVC4KLQkvLyBSVDMwOTAgc2hvdWxkIG5vdCBwcm9ncmFtIEJCUCBSODQgdG8gMHgxOSwgb3RoZXJ3aXNlIFRYIHdpbGwgYmxvY2suCi0JaWYgKCgocEFkLT5NQUNWZXJzaW9uJjB4ZmZmZikgIT0gMHgwMTAxKSAmJiAoIUlTX1JUMzB4eChwQWQpKSkKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkvKiBUT0RPOiBzaGlhbmcsIGNoZWNrIE1BQ1ZlcnNpb24sIGN1cnJlbnRseSwgcmJ1cy1iYXNlZCBjaGlwIHVzZSB0aGlzLiAqLworCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODcyMDIwMCkgeworCQkvKnU4IHZhbHVlOyAqLworCQl1bnNpZ25lZCBsb25nIHZhbHVlMjsKKworCQkvKmRpc2FibGUgTUxEIGJ5IEJydWNlIDIwMDgwNzA0ICovCisJCS8qQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMTA1LCAmdmFsdWUpOyAqLworCQkvKkJCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxMDUsIHZhbHVlIHwgNCk7ICovCisKKwkJLypNYXhpbXVtIFBTRFUgbGVuZ3RoIGZyb20gMTZLIHRvIDMySyBieXRlcyAqLworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BWF9MRU5fQ0ZHLCAmdmFsdWUyKTsKKwkJdmFsdWUyICY9IH4oMHgzIDw8IDEyKTsKKwkJdmFsdWUyIHw9ICgweDIgPDwgMTIpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQVhfTEVOX0NGRywgdmFsdWUyKTsKKwl9CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisKKwkvKiBmb3IgcnQyODYwRSBhbmQgYWZ0ZXIsIGluaXQgQkJQX1I4NCB3aXRoIDB4MTkuIFRoaXMgaXMgZm9yIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIElPVC4gKi8KKwkvKiBSVDMwOTAgc2hvdWxkIG5vdCBwcm9ncmFtIEJCUCBSODQgdG8gMHgxOSwgb3RoZXJ3aXNlIFRYIHdpbGwgYmxvY2suICovCisJLyozMDcwLzcxLzcyLDMwOTAsMzA5MEEoIGFyZSBpbmNsdWRlZCBpbiBSVDMweHgpLDM1NzIsMzM5MCAqLworCWlmICgoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgIT0gMHgwMTAxKQorCSAgICAmJiAhKElTX1JUMzB4eChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSkKIAkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODQsIDB4MTkpOwogCi0vLyBhZGQgYnkgam9obmxpLCBSRiBwb3dlciBzZXF1ZW5jZSBzZXR1cAotCWlmIChJU19SVDMweHgocEFkKSkKLQl7CS8vdXBkYXRlIGZvciBSVDMwNzAvNzEvNzIvOTAvOTEvOTIuCisjaWZkZWYgUlQzMHh4CisvKiBhZGQgYnkgam9obmxpLCBSRiBwb3dlciBzZXF1ZW5jZSBzZXR1cCAqLworCWlmIChJU19SVDMweHgocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkgewkvKnVwZGF0ZSBmb3IgUlQzMDcwLzcxLzcyLzkwLzkxLzkyLDM1NzIsMzM5MC4gKi8KIAkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzksIDB4MTMpOwogCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MCwgMHgwNSk7CiAJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgxLCAweDMzKTsKIAl9CiAKLQlpZiAoSVNfUlQzMDkwKHBBZCkpCisJaWYgKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzM5MChwQWQpKQkvKiBSVDMwOXgsIFJUMzA3MS83MiAqLwogCXsKLQkJVUNIQVIJCWJicHJlZz0wOwotCi0JCS8vIGVuYWJsZSBEQyBmaWx0ZXIKLQkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpID49IDB4MDIxMSkKLQkJeworCQkvKiBlbmFibGUgREMgZmlsdGVyICovCisJCWlmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA+PSAweDAyMTEpIHsKIAkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEwMywgMHhjMCk7CiAJCX0KLQotCQkvLyBpbXByb3ZlIHBvd2VyIGNvbnN1bXB0aW9uCisJCS8qIGltcHJvdmUgcG93ZXIgY29uc3VtcHRpb24gKi8KIAkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxMzgsICZiYnByZWcpOwotCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQotCQl7Ci0JCQkvLyB0dXJuIG9mZiB0eCBEQUNfMQorCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKSB7CisJCQkvKiB0dXJuIG9mZiB0eCBEQUNfMSAqLwogCQkJYmJwcmVnID0gKGJicHJlZyB8IDB4MjApOwogCQl9CiAKLQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKLQkJewotCQkJLy8gdHVybiBvZmYgdHggQURDXzEKKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkgeworCQkJLyogdHVybiBvZmYgdHggQURDXzEgKi8KIAkJCWJicHJlZyAmPSAofjB4Mik7CiAJCX0KIAkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMTM4LCBiYnByZWcpOwogCi0JCS8vIGltcHJvdmUgcG93ZXIgY29uc3VtcHRpb24gaW4gUlQzMDcxIFZlci5FCi0JCWlmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA+PSAweDAyMTEpCi0JCXsKKwkJLyogaW1wcm92ZSBwb3dlciBjb25zdW1wdGlvbiBpbiBSVDMwNzEgVmVyLkUgKi8KKwkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpID49IDB4MDIxMSkgewogCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzMSwgJmJicHJlZyk7CiAJCQliYnByZWcgJj0gKH4weDMpOwogCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMzEsIGJicHJlZyk7CiAJCX0KKwl9IGVsc2UgaWYgKElTX1JUMzA3MChwQWQpKSB7CisJCWlmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA+PSAweDAyMDEpIHsKKwkJCS8qIGVuYWJsZSBEQyBmaWx0ZXIgKi8KKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEwMywgMHhjMCk7CisKKwkJCS8qIGltcHJvdmUgcG93ZXIgY29uc3VtcHRpb24gaW4gUlQzMDcwIFZlci5GICovCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMxLCAmYmJwcmVnKTsKKwkJCWJicHJlZyAmPSAofjB4Myk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzMSwgYmJwcmVnKTsKKwkJfQorCQkvKiBUWF9MTzFfZW4sIFJGIFIxNyByZWdpc3RlciBCaXQgMyB0byAwICovCisJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjE3LCAmUkZWYWx1ZSk7CisJCVJGVmFsdWUgJj0gKH4weDA4KTsKKwkJLyogdG8gZml4IHJ4IGxvbmcgcmFuZ2UgaXNzdWUgKi8KKwkJaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckcgPT0gMCkgeworCQkJUkZWYWx1ZSB8PSAweDIwOworCQl9CisJCS8qIHNldCBSRl9SMTdfYml0WzI6MF0gZXF1YWwgdG8gRUVQUk9NIHNldHRpbmcgYXQgMHg0OGggKi8KKwkJaWYgKHBBZC0+VHhNaXhlckdhaW4yNEcgPj0gMSkgeworCQkJUkZWYWx1ZSAmPSAofjB4Nyk7CS8qIGNsZWFuIGJpdCBbMjowXSAqLworCQkJUkZWYWx1ZSB8PSBwQWQtPlR4TWl4ZXJHYWluMjRHOworCQl9CisJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IxNywgUkZWYWx1ZSk7CiAJfQotI2VuZGlmCi0JaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQotCXsKKy8qIGVuZCBqb2hubGkgKi8KKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KKworCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkgewogCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxNik7CiAJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDEyKTsKLSAgICB9CisJfQogCi0JaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMjg4MEVfVkVSU0lPTiAmJiBwQWQtPk1BQ1ZlcnNpb24gPCBSQUxJTktfMzA3MF9WRVJTSU9OKSAvLyAzKjMKKwlpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgwRV9WRVJTSU9OICYmIHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18zMDcwX1ZFUlNJT04pCS8qIDMqMyAqLwogCXsKLQkJLy8gZW5sYXJnZSBNQVhfTEVOX0NGRwotCQlVSU5UMzIgY3NyOworCQkvKiBlbmxhcmdlIE1BWF9MRU5fQ0ZHICovCisJCXUzMiBjc3I7CiAJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFYX0xFTl9DRkcsICZjc3IpOwogCQljc3IgJj0gMHhGRkY7CiAJCWNzciB8PSAweDIwMDA7CiAJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BWF9MRU5fQ0ZHLCBjc3IpOwogCX0KLQotI2lmZGVmIFJUMjg3MAotewotCVVDSEFSCU1BQ19WYWx1ZVtdPXsweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDAsMH07Ci0KLQkvL0luaXRpYWxpemUgV0NJRCB0YWJsZQotCVZhbHVlID0gMHhmZjsKLQlmb3IoSW5kZXggPTAgO0luZGV4IDwgMjU0O0luZGV4KyspCisjaWZkZWYgUlRNUF9NQUNfVVNCCiAJewotCQlSVFVTQk11bHRpV3JpdGUocEFkLCAoVVNIT1JUKShNQUNfV0NJRF9CQVNFICsgSW5kZXggKiA4KSwgTUFDX1ZhbHVlLCA4KTsKKwkJdTggTUFDX1ZhbHVlW10gPQorCQkgICAgeyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAwLCAwIH07CisKKwkJLypJbml0aWFsaXplIFdDSUQgdGFibGUgKi8KKwkJVmFsdWUgPSAweGZmOworCQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCAyNTQ7IEluZGV4KyspIHsKKwkJCVJUVVNCTXVsdGlXcml0ZShwQWQsCisJCQkJCSh1MTYpKE1BQ19XQ0lEX0JBU0UgKyBJbmRleCAqIDgpLAorCQkJCQlNQUNfVmFsdWUsIDgpOworCQl9CiAJfQotfQotI2VuZGlmIC8vIFJUMjg3MCAvLworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCi0JLy8gQWRkIHJhZGlvIG9mZiBjb250cm9sCisJLyogQWRkIHJhZGlvIG9mZiBjb250cm9sICovCiAJewotCQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQotCQl7Ci0vLwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBXUl9QSU5fQ0ZHLCAweDAwMDAxODE4KTsKKwkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkgeworLyogICAgICAgICAgICAgICAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgUFdSX1BJTl9DRkcsIDB4MDAwMDE4MTgpOyAqLwogCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCBSYWRpbyBPZmZcbiIpKTsKIAkJfQogCX0KIAotCS8vIENsZWFyIHJhdyBjb3VudGVycworCS8qIENsZWFyIHJhdyBjb3VudGVycyAqLwogCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDAsICZDb3VudGVyKTsKIAlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQxLCAmQ291bnRlcik7CiAJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMiwgJkNvdW50ZXIpOwpAQCAtMjM1NSw2NSArMTg1NCw1NSBAQAogCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZDb3VudGVyKTsKIAlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQyLCAmQ291bnRlcik7CiAKLQkvLyBBU0lDIHdpbGwga2VlcCBnYXJiYWdlIHZhbHVlIGFmdGVyIGJvb3QKLQkvLyBDbGVhciBhbGwgc2VhcmVkIGtleSB0YWJsZSB3aGVuIGluaXRpYWwKLQkvLyBUaGlzIHJvdXRpbmUgY2FuIGJlIGlnbm9yZWQgaW4gcmFkaW8tT04vT0ZGIG9wZXJhdGlvbi4KLQlpZiAoYkhhcmRSZXNldCkKLQl7Ci0JCWZvciAoS2V5SWR4ID0gMDsgS2V5SWR4IDwgNDsgS2V5SWR4KyspCi0JCXsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFICsgNCpLZXlJZHgsIDApOworCS8qIEFTSUMgd2lsbCBrZWVwIGdhcmJhZ2UgdmFsdWUgYWZ0ZXIgYm9vdCAqLworCS8qIENsZWFyIGFsbCBzaGFyZWQga2V5IHRhYmxlIHdoZW4gaW5pdGlhbCAqLworCS8qIFRoaXMgcm91dGluZSBjYW4gYmUgaWdub3JlZCBpbiByYWRpby1PTi9PRkYgb3BlcmF0aW9uLiAqLworCWlmIChiSGFyZFJlc2V0KSB7CisJCWZvciAoS2V5SWR4ID0gMDsgS2V5SWR4IDwgNDsgS2V5SWR4KyspIHsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFICsgNCAqIEtleUlkeCwKKwkJCQkJMCk7CiAJCX0KIAotCQkvLyBDbGVhciBhbGwgcGFpcndpc2Uga2V5IHRhYmxlIHdoZW4gaW5pdGlhbAotCQlmb3IgKEtleUlkeCA9IDA7IEtleUlkeCA8IDI1NjsgS2V5SWR4KyspCi0JCXsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKEtleUlkeCAqIEhXX1dDSURfQVRUUklfU0laRSksIDEpOworCQkvKiBDbGVhciBhbGwgcGFpcndpc2Uga2V5IHRhYmxlIHdoZW4gaW5pdGlhbCAqLworCQlmb3IgKEtleUlkeCA9IDA7IEtleUlkeCA8IDI1NjsgS2V5SWR4KyspIHsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsCisJCQkJCU1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsKKwkJCQkJKEtleUlkeCAqIEhXX1dDSURfQVRUUklfU0laRSksIDEpOwogCQl9CiAJfQorCS8qIGFzc2VydCBIT1NUIHJlYWR5IGJpdCAqLworLyogIFJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19DU1IxLCAweDApOyAvLyAyMDA0LTA5LTE0IGFza2VkIGJ5IE1hcmsgKi8KKy8qICBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMSwgMHg0KTsgKi8KIAotCi0JLy8gSXQgaXNuJ3QgbmVjZXNzYXJ5IHRvIGNsZWFyIHRoaXMgc3BhY2Ugd2hlbiBub3QgaGFyZCByZXNldC4KLQlpZiAoYkhhcmRSZXNldCA9PSBUUlVFKQotCXsKLQkJLy8gY2xlYXIgYWxsIG9uLWNoaXAgQkVBQ09OIGZyYW1lIHNwYWNlCi0JCWZvciAoYXBpZHggPSAwOyBhcGlkeCA8IEhXX0JFQUNPTl9NQVhfQ09VTlQ7IGFwaWR4KyspCi0JCXsKLQkJCWZvciAoaSA9IDA7IGkgPCBIV19CRUFDT05fT0ZGU0VUPj4yOyBpKz00KQotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2FwaWR4XSArIGksIDB4MDApOworCS8qIEl0IGlzbid0IG5lY2Vzc2FyeSB0byBjbGVhciB0aGlzIHNwYWNlIHdoZW4gbm90IGhhcmQgcmVzZXQuICovCisJaWYgKGJIYXJkUmVzZXQgPT0gVFJVRSkgeworCQkvKiBjbGVhciBhbGwgb24tY2hpcCBCRUFDT04gZnJhbWUgc3BhY2UgKi8KKwkJZm9yIChhcGlkeCA9IDA7IGFwaWR4IDwgSFdfQkVBQ09OX01BWF9DT1VOVDsgYXBpZHgrKykgeworCQkJZm9yIChpID0gMDsgaSA8IEhXX0JFQUNPTl9PRkZTRVQgPj4gMjsgaSArPSA0KQorCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsCisJCQkJCQlwQWQtPkJlYWNvbk9mZnNldFthcGlkeF0gKyBpLAorCQkJCQkJMHgwMCk7CiAJCX0KIAl9Ci0jaWZkZWYgUlQyODcwCisjaWZkZWYgUlRNUF9NQUNfVVNCCiAJQXNpY0Rpc2FibGVTeW5jKHBBZCk7Ci0JLy8gQ2xlYXIgcmF3IGNvdW50ZXJzCisJLyogQ2xlYXIgcmF3IGNvdW50ZXJzICovCiAJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMCwgJkNvdW50ZXIpOwogCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDEsICZDb3VudGVyKTsKIAlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQyLCAmQ291bnRlcik7CiAJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJkNvdW50ZXIpOwogCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZDb3VudGVyKTsKIAlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQyLCAmQ291bnRlcik7Ci0JLy8gRGVmYXVsdCBQQ0kgY2xvY2sgY3ljbGUgcGVyIG1zIGlzIGRpZmZlcmVudCBhcyBkZWZhdWx0IHNldHRpbmcsIHdoaWNoIGlzIGJhc2VkIG9uIFBDSS4KKwkvKiBEZWZhdWx0IFBDSSBjbG9jayBjeWNsZSBwZXIgbXMgaXMgZGlmZmVyZW50IGFzIGRlZmF1bHQgc2V0dGluZywgd2hpY2ggaXMgYmFzZWQgb24gUENJLiAqLwogCVJUTVBfSU9fUkVBRDMyKHBBZCwgVVNCX0NZQ19DRkcsICZDb3VudGVyKTsKLQlDb3VudGVyJj0weGZmZmZmZjAwOwotCUNvdW50ZXJ8PTB4MDAwMDAxZTsKKwlDb3VudGVyICY9IDB4ZmZmZmZmMDA7CisJQ291bnRlciB8PSAweDAwMDAwMWU7CiAJUlRNUF9JT19XUklURTMyKHBBZCwgVVNCX0NZQ19DRkcsIENvdW50ZXIpOwotCi0JcEFkLT5iVXNlRWZ1c2U9RkFMU0U7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAmZUZ1c2VDdHJsKTsKLQlwQWQtPmJVc2VFZnVzZSA9ICggKGVGdXNlQ3RybCAmIDB4ODAwMDAwMDApID09IDB4ODAwMDAwMDApID8gMSA6IDA7Ci0JaWYocEFkLT5iVXNlRWZ1c2UpCi0JewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTlZNIGlzIEVmdXNlXG4iKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOVk0gaXMgRUVQUk9NXG4iKSk7Ci0JfQotI2VuZGlmCisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAKIAl7Ci0JCS8vIGZvciBydDI4NjBFIGFuZCBhZnRlciwgaW5pdCBUWE9QX0NUUkxfQ0ZHIHdpdGggMHg1ODNmLiBUaGlzIGlzIGZvciBleHRlbnNpb24gY2hhbm5lbCBvdmVybGFwcGluZyBJT1QuCi0JCWlmICgocEFkLT5NQUNWZXJzaW9uJjB4ZmZmZikgIT0gMHgwMTAxKQorCQkvKiBmb3IgcnQyODYwRSBhbmQgYWZ0ZXIsIGluaXQgVFhPUF9DVFJMX0NGRyB3aXRoIDB4NTgzZi4gVGhpcyBpcyBmb3IgZXh0ZW5zaW9uIGNoYW5uZWwgb3ZlcmxhcHBpbmcgSU9ULiAqLworCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgIT0gMHgwMTAxKQogCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhPUF9DVFJMX0NGRywgMHg1ODNmKTsKIAl9CiAKQEAgLTI0MjEsMTMzICsxOTEwLDYgQEAKIAlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIH0KIAotCi0jaWZkZWYgUlQyODYwCi1WT0lEIE5JQ1Jlc3RvcmVCQlBWYWx1ZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlVQ0hBUgkJaW5kZXg7Ci0JVUNIQVIJCVZhbHVlID0gMDsKLQlVTE9ORwkJRGF0YTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT4gIE5JQ1Jlc3RvcmVCQlBWYWx1ZSAhISEhISEhISEhISEhISEhISEhISEhISAgXG4iKSk7Ci0JLy8gSW5pdGlhbGl6ZSBCQlAgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZSAocnRtcF9pbml0LmMpCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX0JCUF9SRUdfUEFSTVM7IGluZGV4KyspCi0JewotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQUmVnVGFibGVbaW5kZXhdLlJlZ2lzdGVyLCBCQlBSZWdUYWJsZVtpbmRleF0uVmFsdWUpOwotCX0KLQkvLyBjb3B5IGZyb20gKHJ0bXBfaW5pdC5jKQotCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKLQl7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCAweDE2KTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIDB4MTIpOwotCX0KLQotCS8vIGNvcHkgZnJvbSAoY29ubmVjdC5jIExpbmtVcCBmdW5jdGlvbikKLQlpZiAoSU5GUkFfT04ocEFkKSkKLQl7Ci0JCS8vIENoYW5nZSB0byBBUCBjaGFubmVsCi0JCWlmICgocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPiBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSAmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKLQkJewotCQkJLy8gTXVzdCB1c2luZyA0ME1Iei4KLQkJCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOwotCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOwotCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwotCi0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZWYWx1ZSk7Ci0JCQlWYWx1ZSAmPSAofjB4MTgpOwotCQkJVmFsdWUgfD0gMHgxMDsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIFZhbHVlKTsKLQotCQkJLy8gIFJYIDogY29udHJvbCBjaGFubmVsIGF0IGxvd2VyCi0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZWYWx1ZSk7Ci0JCQlWYWx1ZSAmPSAofjB4MjApOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgVmFsdWUpOwotCQkJLy8gUmVjb3JkIEJCUFIzIHNldHRpbmcsIEJ1dCBkb24ndCBrZWVwIFIgQW50ZW5uYSAjIGluZm9ybWF0aW9uLgotCQkJcEFkLT5TdGFDZmcuQkJQUjMgPSBWYWx1ZTsKLQotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJkRhdGEpOwotCQkJRGF0YSAmPSAweGZmZmZmZmZlOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIERhdGEpOwotCi0JCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCi0JCQl7Ci0JCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIDB4MUEpOwotCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAweDBBKTsKLQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgMHgxNik7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcnQyODYwQyAhISEgXG4iICkpOwotCQkJfQotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISE0ME1IeiBMb3dlciBMSU5LIFVQICEhISBDb250cm9sIENoYW5uZWwgYXQgQmVsb3cuIENlbnRyYWwgPSAlZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICkpOwotCQl9Ci0JCWVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA8IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpICYmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQotCQl7Ci0JCQkvLyBNdXN0IHVzaW5nIDQwTUh6LgotCQkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7Ci0JCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0JCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0KLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJlZhbHVlKTsKLQkJCVZhbHVlICY9ICh+MHgxOCk7Ci0JCQlWYWx1ZSB8PSAweDEwOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgVmFsdWUpOwotCi0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmRGF0YSk7Ci0JCQlEYXRhIHw9IDB4MTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBEYXRhKTsKLQotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmVmFsdWUpOwotCQkJVmFsdWUgfD0gKDB4MjApOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgVmFsdWUpOwotCQkJLy8gUmVjb3JkIEJCUFIzIHNldHRpbmcsIEJ1dCBkb24ndCBrZWVwIFIgQW50ZW5uYSAjIGluZm9ybWF0aW9uLgotCQkJcEFkLT5TdGFDZmcuQkJQUjMgPSBWYWx1ZTsKLQotCQkJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQotCQkJewotCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCAweDFBKTsKLQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgMHgwQSk7Ci0JCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIDB4MTYpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIXJ0Mjg2MEMgISEhIFxuIiApKTsKLQkJCX0KLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhNDBNSHogVXBwZXIgTElOSyBVUCAhISEgQ29udHJvbCBDaGFubmVsIGF0IFVwcGVyQ2VudHJhbCA9ICVkIFxuIiwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKLQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwotCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0KLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJlZhbHVlKTsKLQkJCVZhbHVlICY9ICh+MHgxOCk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBWYWx1ZSk7Ci0KLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZEYXRhKTsKLQkJCURhdGEgJj0gMHhmZmZmZmZmZTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBEYXRhKTsKLQotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmVmFsdWUpOwotCQkJVmFsdWUgJj0gKH4weDIwKTsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIFZhbHVlKTsKLQkJCS8vIFJlY29yZCBCQlBSMyBzZXR0aW5nLCBCdXQgZG9uJ3Qga2VlcCBSIEFudGVubmEgIyBpbmZvcm1hdGlvbi4KLQkJCXBBZC0+U3RhQ2ZnLkJCUFIzID0gVmFsdWU7Ci0KLQkJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKLQkJCXsKLQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxNik7Ci0JCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIDB4MDgpOwotCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDExKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFydDI4NjBDICEhISBcbiIgKSk7Ci0JCQl9Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhITIwTUh6IExJTksgVVAgISEhIFxuIiApKTsKLQkJfQotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS0gIE5JQ1Jlc3RvcmVCQlBWYWx1ZSAhISEhISEhISEhISEhISEhISEhISEhISAgXG4iKSk7Ci19Ci0jZW5kaWYgLyogUlQyODYwICovCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTI1NjcsMTkgKzE5MjksMjEgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJTklDSXNzdWVSZXNldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3ZvaWQgTklDSXNzdWVSZXNldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JVUlOVDMyCVZhbHVlID0gMDsKKwl1MzIgVmFsdWUgPSAwOwogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJc3N1ZVJlc2V0XG4iKSk7CiAKLQkvLyBEaXNhYmxlIFJ4LCByZWdpc3RlciB2YWx1ZSBzdXBwb3NlZCB3aWxsIHJlbWFpbiBhZnRlciByZXNldAorCS8qIEFib3J0IFR4LCBwcmV2ZW50IEFTSUMgZnJvbSB3cml0aW5nIHRvIEhvc3QgbWVtb3J5ICovCisJLypSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DTlRMX0NTUiwgMHgwMDFmMDAwMCk7ICovCisKKwkvKiBEaXNhYmxlIFJ4LCByZWdpc3RlciB2YWx1ZSBzdXBwb3NlZCB3aWxsIHJlbWFpbiBhZnRlciByZXNldCAqLwogCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwogCVZhbHVlICY9ICgweGZmZmZmZmYzKTsKIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKIAotCS8vIElzc3VlIHJlc2V0IGFuZCBjbGVhciBmcm9tIHJlc2V0IHN0YXRlCi0JUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDAzKTsgLy8gMjAwNC0wOS0xNyBjaGFuZ2UgZnJvbSAweDAxCisJLyogSXNzdWUgcmVzZXQgYW5kIGNsZWFyIGZyb20gcmVzZXQgc3RhdGUgKi8KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MDMpOwkvKiAyMDA0LTA5LTE3IGNoYW5nZSBmcm9tIDB4MDEgKi8KIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MDApOwogCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE5JQ0lzc3VlUmVzZXRcbiIpKTsKQEAgLTI2MDEsMTM0ICsxOTY1LDExNSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotQk9PTEVBTglOSUNDaGVja0ZvckhhbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCitCT09MRUFOIE5JQ0NoZWNrRm9ySGFuZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7CiAJcmV0dXJuIChGQUxTRSk7CiB9CiAKLVZPSUQgTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQordm9pZCBOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCVRYX1NUQV9GSUZPX1NUUlVDCVN0YUZpZm87Ci0JTUFDX1RBQkxFX0VOVFJZCQkqcEVudHJ5OwotCVVDSEFSCQkJCWkgPSAwOwotCVVDSEFSCQkJcGlkID0gMCwgd2NpZCA9IDA7Ci0JQ0hBUgkJCQlyZVRyeTsKLQlVQ0hBUgkJCQlzdWNjTUNTOworCVRYX1NUQV9GSUZPX1NUUlVDIFN0YUZpZm87CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5OworCXU4IGkgPSAwOworCXU4IHBpZCA9IDAsIHdjaWQgPSAwOworCWNoYXIgcmVUcnk7CisJdTggc3VjY01DUzsKIAotCQlkbwotCQl7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9GSUZPLCAmU3RhRmlmby53b3JkKTsKKwlkbyB7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0ZJRk8sICZTdGFGaWZvLndvcmQpOwogCi0JCQlpZiAoU3RhRmlmby5maWVsZC5iVmFsaWQgPT0gMCkKLQkJCQlicmVhazsKKwkJaWYgKFN0YUZpZm8uZmllbGQuYlZhbGlkID09IDApCisJCQlicmVhazsKIAotCQkJd2NpZCA9IChVQ0hBUilTdGFGaWZvLmZpZWxkLndjaWQ7Ci0KKwkJd2NpZCA9ICh1OClTdGFGaWZvLmZpZWxkLndjaWQ7CiAKIAkJLyogaWdub3JlIE5vQUNLIGFuZCBNR01UIGZyYW1lIHVzZSAweEZGIGFzIFdDSUQgKi8KLQkJCWlmICgoU3RhRmlmby5maWVsZC5UeEFja1JlcXVpcmVkID09IDApIHx8ICh3Y2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKSkKLQkJCXsKLQkJCQlpKys7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8qIFBJRCBzdG9yZSBUeCBNQ1MgUmF0ZSAqLwotCQkJcGlkID0gKFVDSEFSKVN0YUZpZm8uZmllbGQuUGlkVHlwZTsKLQotCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbd2NpZF07Ci0KLQkJCXBFbnRyeS0+RGVidWdGSUZPQ291bnQrKzsKLQotCQkJaWYgKFN0YUZpZm8uZmllbGQuVHhCRikgLy8gMyozCi0JCQkJcEVudHJ5LT5UeEJGQ291bnQrKzsKLQotI2lmZGVmIFVBUFNEX0FQX1NVUFBPUlQKLQkJCVVBUFNEX1NQX0FVRV9IYW5kbGUocEFkLCBwRW50cnksIFN0YUZpZm8uZmllbGQuVHhTdWNjZXNzKTsKLSNlbmRpZiAvLyBVQVBTRF9BUF9TVVBQT1JUIC8vCi0KLQkJCWlmICghU3RhRmlmby5maWVsZC5UeFN1Y2Nlc3MpCi0JCQl7Ci0JCQkJcEVudHJ5LT5GSUZPQ291bnQrKzsKLQkJCQlwRW50cnktPk9uZVNlY1R4RmFpbENvdW50Kys7Ci0KLQkJCQlpZiAocEVudHJ5LT5GSUZPQ291bnQgPj0gMSkKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiMiKSk7Ci0JCQkJCXBFbnRyeS0+Tm9CQURhdGFDb3VudERvd24gPSA2NDsKLQotCQkJCQlpZihwRW50cnktPlBzTW9kZSA9PSBQV1JfQUNUSVZFKQotCQkJCQl7Ci0JCQkJCQlpbnQgdGlkOwotCQkJCQkJZm9yICh0aWQ9MDsgdGlkPE5VTV9PRl9USUQ7IHRpZCsrKQotCQkJCQkJewotCQkJCQkJCUJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZCwgcEVudHJ5LT5BaWQsICB0aWQsIEZBTFNFLCBGQUxTRSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIFVwZGF0ZSB0aGUgY29udGludW91cyB0cmFuc21pc3Npb24gY291bnRlciBleGNlcHQgUFMgbW9kZQotCQkJCQkJcEVudHJ5LT5Db250aW51ZVR4RmFpbENudCsrOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJLy8gQ2xlYXIgdGhlIEZJRk9Db3VudCB3aGVuIHN0YSBpbiBQb3dlciBTYXZlIG1vZGUuIEJhc2ljYWxseSB3ZSBhc3N1bWUKLQkJCQkJCS8vICAgICB0aGlzIHR4IGVycm9yIGhhcHBlbmVkIGR1ZSB0byBzdGEganVzdCBnbyB0byBzbGVlcC4KLQkJCQkJCXBFbnRyeS0+RklGT0NvdW50ID0gMDsKLQkJCQkJCXBFbnRyeS0+Q29udGludWVUeEZhaWxDbnQgPSAwOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmICgocEVudHJ5LT5Qc01vZGUgIT0gUFdSX1NBVkUpICYmIChwRW50cnktPk5vQkFEYXRhQ291bnREb3duID4gMCkpCi0JCQkJewotCQkJCQlwRW50cnktPk5vQkFEYXRhQ291bnREb3duLS07Ci0JCQkJCWlmIChwRW50cnktPk5vQkFEYXRhQ291bnREb3duPT0wKQotCQkJCQl7Ci0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJAXG4iKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlwRW50cnktPkZJRk9Db3VudCA9IDA7Ci0JCQkJcEVudHJ5LT5PbmVTZWNUeE5vUmV0cnlPa0NvdW50Kys7Ci0JCQkJLy8gdXBkYXRlIE5vRGF0YUlkbGVDb3VudCB3aGVuIHN1Y2Vzc2Z1bCBzZW5kIHBhY2tldCB0byBTVEEuCi0JCQkJcEVudHJ5LT5Ob0RhdGFJZGxlQ291bnQgPSAwOwotCQkJCXBFbnRyeS0+Q29udGludWVUeEZhaWxDbnQgPSAwOwotCQkJfQotCi0JCQlzdWNjTUNTID0gU3RhRmlmby5maWVsZC5TdWNjZXNzUmF0ZSAmIDB4N0Y7Ci0KLQkJCXJlVHJ5ID0gcGlkIC0gc3VjY01DUzsKLQotCQkJaWYgKFN0YUZpZm8uZmllbGQuVHhTdWNjZXNzKQotCQkJewotCQkJCXBFbnRyeS0+VFhNQ1NFeHBlY3RlZFtwaWRdKys7Ci0JCQkJaWYgKHBpZCA9PSBzdWNjTUNTKQotCQkJCXsKLQkJCQkJcEVudHJ5LT5UWE1DU1N1Y2Nlc3NmdWxbcGlkXSsrOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlwRW50cnktPlRYTUNTQXV0b0ZhbGxCYWNrW3BpZF1bc3VjY01DU10rKzsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcEVudHJ5LT5UWE1DU0ZhaWxlZFtwaWRdKys7Ci0JCQl9Ci0KLQkJCWlmIChyZVRyeSA+IDApCi0JCQl7Ci0JCQkJaWYgKChwaWQgPj0gMTIpICYmIHN1Y2NNQ1MgPD03KQotCQkJCXsKLQkJCQkJcmVUcnkgLT0gNDsKLQkJCQl9Ci0JCQkJcEVudHJ5LT5PbmVTZWNUeFJldHJ5T2tDb3VudCArPSByZVRyeTsKLQkJCX0KLQorCQlpZiAoKFN0YUZpZm8uZmllbGQuVHhBY2tSZXF1aXJlZCA9PSAwKQorCQkgICAgfHwgKHdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpKSB7CiAJCQlpKys7Ci0JCQkvLyBBU0lDIHN0b3JlIDE2IHN0YWNrCi0JCX0gd2hpbGUgKCBpIDwgKDIqVFhfUklOR19TSVpFKSApOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBQSUQgc3RvcmUgVHggTUNTIFJhdGUgKi8KKwkJcGlkID0gKHU4KVN0YUZpZm8uZmllbGQuUGlkVHlwZTsKKworCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFt3Y2lkXTsKKworCQlwRW50cnktPkRlYnVnRklGT0NvdW50Kys7CisKKwkJaWYgKFN0YUZpZm8uZmllbGQuVHhCRikJLyogMyozICovCisJCQlwRW50cnktPlR4QkZDb3VudCsrOworCisJCWlmICghU3RhRmlmby5maWVsZC5UeFN1Y2Nlc3MpIHsKKwkJCXBFbnRyeS0+RklGT0NvdW50Kys7CisJCQlwRW50cnktPk9uZVNlY1R4RmFpbENvdW50Kys7CisKKwkJCWlmIChwRW50cnktPkZJRk9Db3VudCA+PSAxKSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIyIpKTsKKwkJCQlwRW50cnktPk5vQkFEYXRhQ291bnREb3duID0gNjQ7CisKKwkJCQlpZiAocEVudHJ5LT5Qc01vZGUgPT0gUFdSX0FDVElWRSkgeworCQkJCQlpbnQgdGlkOworCQkJCQlmb3IgKHRpZCA9IDA7IHRpZCA8IE5VTV9PRl9USUQ7IHRpZCsrKSB7CisJCQkJCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWQsCisJCQkJCQkJCSAgICAgcEVudHJ5LT4KKwkJCQkJCQkJICAgICBBaWQsIHRpZCwKKwkJCQkJCQkJICAgICBGQUxTRSwKKwkJCQkJCQkJICAgICBGQUxTRSk7CisJCQkJCX0KKworCQkJCQkvKiBVcGRhdGUgdGhlIGNvbnRpbnVvdXMgdHJhbnNtaXNzaW9uIGNvdW50ZXIgZXhjZXB0IFBTIG1vZGUgKi8KKwkJCQkJcEVudHJ5LT5Db250aW51ZVR4RmFpbENudCsrOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIENsZWFyIHRoZSBGSUZPQ291bnQgd2hlbiBzdGEgaW4gUG93ZXIgU2F2ZSBtb2RlLiBCYXNpY2FsbHkgd2UgYXNzdW1lICovCisJCQkJCS8qICAgICB0aGlzIHR4IGVycm9yIGhhcHBlbmVkIGR1ZSB0byBzdGEganVzdCBnbyB0byBzbGVlcC4gKi8KKwkJCQkJcEVudHJ5LT5GSUZPQ291bnQgPSAwOworCQkJCQlwRW50cnktPkNvbnRpbnVlVHhGYWlsQ250ID0gMDsKKwkJCQl9CisJCQkJLypwRW50cnktPkZJRk9Db3VudCA9IDA7ICovCisJCQl9CisJCQkvKnBFbnRyeS0+YlNlbmRCQVIgPSBUUlVFOyAqLworCQl9IGVsc2UgeworCQkJaWYgKChwRW50cnktPlBzTW9kZSAhPSBQV1JfU0FWRSkKKwkJCSAgICAmJiAocEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93biA+IDApKSB7CisJCQkJcEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93bi0tOworCQkJCWlmIChwRW50cnktPk5vQkFEYXRhQ291bnREb3duID09IDApIHsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQFxuIikpOworCQkJCX0KKwkJCX0KKworCQkJcEVudHJ5LT5GSUZPQ291bnQgPSAwOworCQkJcEVudHJ5LT5PbmVTZWNUeE5vUmV0cnlPa0NvdW50Kys7CisJCQkvKiB1cGRhdGUgTm9EYXRhSWRsZUNvdW50IHdoZW4gc3VjZXNzZnVsIHNlbmQgcGFja2V0IHRvIFNUQS4gKi8KKwkJCXBFbnRyeS0+Tm9EYXRhSWRsZUNvdW50ID0gMDsKKwkJCXBFbnRyeS0+Q29udGludWVUeEZhaWxDbnQgPSAwOworCQl9CisKKwkJc3VjY01DUyA9IFN0YUZpZm8uZmllbGQuU3VjY2Vzc1JhdGUgJiAweDdGOworCisJCXJlVHJ5ID0gcGlkIC0gc3VjY01DUzsKKworCQlpZiAoU3RhRmlmby5maWVsZC5UeFN1Y2Nlc3MpIHsKKwkJCXBFbnRyeS0+VFhNQ1NFeHBlY3RlZFtwaWRdKys7CisJCQlpZiAocGlkID09IHN1Y2NNQ1MpIHsKKwkJCQlwRW50cnktPlRYTUNTU3VjY2Vzc2Z1bFtwaWRdKys7CisJCQl9IGVsc2UgeworCQkJCXBFbnRyeS0+VFhNQ1NBdXRvRmFsbEJhY2tbcGlkXVtzdWNjTUNTXSsrOworCQkJfQorCQl9IGVsc2UgeworCQkJcEVudHJ5LT5UWE1DU0ZhaWxlZFtwaWRdKys7CisJCX0KKworCQlpZiAocmVUcnkgPiAwKSB7CisJCQlpZiAoKHBpZCA+PSAxMikgJiYgc3VjY01DUyA8PSA3KSB7CisJCQkJcmVUcnkgLT0gNDsKKwkJCX0KKwkJCXBFbnRyeS0+T25lU2VjVHhSZXRyeU9rQ291bnQgKz0gcmVUcnk7CisJCX0KKworCQlpKys7CisJCS8qIEFTSUMgc3RvcmUgMTYgc3RhY2sgKi8KKwl9IHdoaWxlIChpIDwgKDIgKiBUWF9SSU5HX1NJWkUpKTsKIAogfQogCkBAIC0yNzQ5LDg3ICsyMDk0LDk5IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQordm9pZCBOSUNVcGRhdGVSYXdDb3VudGVycyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JVUlOVDMyCU9sZFZhbHVlOwotCVJYX1NUQV9DTlQwX1NUUlVDCSBSeFN0YUNudDA7Ci0JUlhfU1RBX0NOVDFfU1RSVUMgICBSeFN0YUNudDE7Ci0JUlhfU1RBX0NOVDJfU1RSVUMgICBSeFN0YUNudDI7Ci0JVFhfU1RBX0NOVDBfU1RSVUMgCSBUeFN0YUNudDA7Ci0JVFhfU1RBX0NOVDFfU1RSVUMJIFN0YVR4MTsKLQlUWF9TVEFfQ05UMl9TVFJVQwkgU3RhVHgyOwotCVRYX0FHR19DTlRfU1RSVUMJVHhBZ2dDbnQ7Ci0JVFhfQUdHX0NOVDBfU1RSVUMJVHhBZ2dDbnQwOwotCVRYX0FHR19DTlQxX1NUUlVDCVR4QWdnQ250MTsKLQlUWF9BR0dfQ05UMl9TVFJVQwlUeEFnZ0NudDI7Ci0JVFhfQUdHX0NOVDNfU1RSVUMJVHhBZ2dDbnQzOwotCVRYX0FHR19DTlQ0X1NUUlVDCVR4QWdnQ250NDsKLQlUWF9BR0dfQ05UNV9TVFJVQwlUeEFnZ0NudDU7Ci0JVFhfQUdHX0NOVDZfU1RSVUMJVHhBZ2dDbnQ2OwotCVRYX0FHR19DTlQ3X1NUUlVDCVR4QWdnQ250NzsKKwl1MzIgT2xkVmFsdWU7CS8qLCBWYWx1ZTI7ICovCisJLyp1bnNpZ25lZCBsb25nIFBhZ2VTdW0sIE9uZVNlY1RyYW5zbWl0Q291bnQ7ICovCisJLyp1bnNpZ25lZCBsb25nIFR4RXJyb3JSYXRpbywgUmV0cnksIEZhaWw7ICovCisJUlhfU1RBX0NOVDBfU1RSVUMgUnhTdGFDbnQwOworCVJYX1NUQV9DTlQxX1NUUlVDIFJ4U3RhQ250MTsKKwlSWF9TVEFfQ05UMl9TVFJVQyBSeFN0YUNudDI7CisJVFhfU1RBX0NOVDBfU1RSVUMgVHhTdGFDbnQwOworCVRYX1NUQV9DTlQxX1NUUlVDIFN0YVR4MTsKKwlUWF9TVEFfQ05UMl9TVFJVQyBTdGFUeDI7CisJVFhfQUdHX0NOVF9TVFJVQyBUeEFnZ0NudDsKKwlUWF9BR0dfQ05UMF9TVFJVQyBUeEFnZ0NudDA7CisJVFhfQUdHX0NOVDFfU1RSVUMgVHhBZ2dDbnQxOworCVRYX0FHR19DTlQyX1NUUlVDIFR4QWdnQ250MjsKKwlUWF9BR0dfQ05UM19TVFJVQyBUeEFnZ0NudDM7CisJVFhfQUdHX0NOVDRfU1RSVUMgVHhBZ2dDbnQ0OworCVRYX0FHR19DTlQ1X1NUUlVDIFR4QWdnQ250NTsKKwlUWF9BR0dfQ05UNl9TVFJVQyBUeEFnZ0NudDY7CisJVFhfQUdHX0NOVDdfU1RSVUMgVHhBZ2dDbnQ3OworCXN0cnVjdCBydF9jb3VudGVyX3JhbGluayAqcFJhbGlua0NvdW50ZXJzOworCisJcFJhbGlua0NvdW50ZXJzID0gJnBBZC0+UmFsaW5rQ291bnRlcnM7CiAKIAlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQwLCAmUnhTdGFDbnQwLndvcmQpOwogCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDIsICZSeFN0YUNudDIud29yZCk7CiAKIAl7CiAJCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDEsICZSeFN0YUNudDEud29yZCk7Ci0JICAgIC8vIFVwZGF0ZSBSWCBQTENQIGVycm9yIGNvdW50ZXIKLQkgICAgcEFkLT5Qcml2YXRlSW5mby5QaHlSeEVyckNudCArPSBSeFN0YUNudDEuZmllbGQuUGxjcEVycjsKLQkJLy8gVXBkYXRlIEZhbHNlIENDQSBjb3VudGVyCi0JCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRmFsc2VDQ0FDbnQgKz0gUnhTdGFDbnQxLmZpZWxkLkZhbHNlQ2NhOworCQkvKiBVcGRhdGUgUlggUExDUCBlcnJvciBjb3VudGVyICovCisJCXBBZC0+UHJpdmF0ZUluZm8uUGh5UnhFcnJDbnQgKz0gUnhTdGFDbnQxLmZpZWxkLlBsY3BFcnI7CisJCS8qIFVwZGF0ZSBGYWxzZSBDQ0EgY291bnRlciAqLworCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0ZhbHNlQ0NBQ250ICs9CisJCSAgICBSeFN0YUNudDEuZmllbGQuRmFsc2VDY2E7CiAJfQogCi0JLy8gVXBkYXRlIEZDUyBjb3VudGVycwotCU9sZFZhbHVlPSBwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuTG93UGFydDsKLQlwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuTG93UGFydCArPSAoUnhTdGFDbnQwLmZpZWxkLkNyY0Vycik7IC8vID4+IDcpOworCS8qIFVwZGF0ZSBGQ1MgY291bnRlcnMgKi8KKwlPbGRWYWx1ZSA9IHBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5Mb3dQYXJ0OworCXBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5Mb3dQYXJ0ICs9IChSeFN0YUNudDAuZmllbGQuQ3JjRXJyKTsJLyogPj4gNyk7ICovCiAJaWYgKHBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5Mb3dQYXJ0IDwgT2xkVmFsdWUpCiAJCXBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5IaWdoUGFydCsrOwogCi0JLy8gQWRkIEZDUyBlcnJvciBjb3VudCB0byBwcml2YXRlIGNvdW50ZXJzCi0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEZjc0VyckNudCArPSBSeFN0YUNudDAuZmllbGQuQ3JjRXJyOwotCU9sZFZhbHVlID0gcEFkLT5SYWxpbmtDb3VudGVycy5SZWFsRmNzRXJyQ291bnQudS5Mb3dQYXJ0OwotCXBBZC0+UmFsaW5rQ291bnRlcnMuUmVhbEZjc0VyckNvdW50LnUuTG93UGFydCArPSBSeFN0YUNudDAuZmllbGQuQ3JjRXJyOwotCWlmIChwQWQtPlJhbGlua0NvdW50ZXJzLlJlYWxGY3NFcnJDb3VudC51Lkxvd1BhcnQgPCBPbGRWYWx1ZSkKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5SZWFsRmNzRXJyQ291bnQudS5IaWdoUGFydCsrOworCS8qIEFkZCBGQ1MgZXJyb3IgY291bnQgdG8gcHJpdmF0ZSBjb3VudGVycyAqLworCXBSYWxpbmtDb3VudGVycy0+T25lU2VjUnhGY3NFcnJDbnQgKz0gUnhTdGFDbnQwLmZpZWxkLkNyY0VycjsKKwlPbGRWYWx1ZSA9IHBSYWxpbmtDb3VudGVycy0+UmVhbEZjc0VyckNvdW50LnUuTG93UGFydDsKKwlwUmFsaW5rQ291bnRlcnMtPlJlYWxGY3NFcnJDb3VudC51Lkxvd1BhcnQgKz0gUnhTdGFDbnQwLmZpZWxkLkNyY0VycjsKKwlpZiAocFJhbGlua0NvdW50ZXJzLT5SZWFsRmNzRXJyQ291bnQudS5Mb3dQYXJ0IDwgT2xkVmFsdWUpCisJCXBSYWxpbmtDb3VudGVycy0+UmVhbEZjc0VyckNvdW50LnUuSGlnaFBhcnQrKzsKIAotCS8vIFVwZGF0ZSBEdXBsaWNhdGUgUmN2IGNoZWNrCi0JcEFkLT5SYWxpbmtDb3VudGVycy5EdXBsaWNhdGVSY3YgKz0gUnhTdGFDbnQyLmZpZWxkLlJ4RHVwbGlDb3VudDsKLQlwQWQtPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LnUuTG93UGFydCArPSBSeFN0YUNudDIuZmllbGQuUnhEdXBsaUNvdW50OwotCS8vIFVwZGF0ZSBSWCBPdmVyZmxvdyBjb3VudGVyCisJLyogVXBkYXRlIER1cGxpY2F0ZSBSY3YgY2hlY2sgKi8KKwlwUmFsaW5rQ291bnRlcnMtPkR1cGxpY2F0ZVJjdiArPSBSeFN0YUNudDIuZmllbGQuUnhEdXBsaUNvdW50OworCXBBZC0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQudS5Mb3dQYXJ0ICs9CisJICAgIFJ4U3RhQ250Mi5maWVsZC5SeER1cGxpQ291bnQ7CisJLyogVXBkYXRlIFJYIE92ZXJmbG93IGNvdW50ZXIgKi8KIAlwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyICs9IChSeFN0YUNudDIuZmllbGQuUnhGaWZvT3ZlcmZsb3dDb3VudCk7CiAKLSNpZmRlZiBSVDI4NzAKLQlpZiAocEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50ICE9IHBBZC0+d2F0Y2hEb2dSeENudCkKLQl7Ci0JCXBBZC0+d2F0Y2hEb2dSeENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudDsKKwkvKnBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudCA9IDA7ICovCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJaWYgKHBSYWxpbmtDb3VudGVycy0+UnhDb3VudCAhPSBwQWQtPndhdGNoRG9nUnhDbnQpIHsKKwkJcEFkLT53YXRjaERvZ1J4Q250ID0gcFJhbGlua0NvdW50ZXJzLT5SeENvdW50OwogCQlwQWQtPndhdGNoRG9nUnhPdmVyRmxvd0NudCA9IDA7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJaWYgKFJ4U3RhQ250Mi5maWVsZC5SeEZpZm9PdmVyZmxvd0NvdW50KQogCQkJcEFkLT53YXRjaERvZ1J4T3ZlckZsb3dDbnQrKzsKIAkJZWxzZQogCQkJcEFkLT53YXRjaERvZ1J4T3ZlckZsb3dDbnQgPSAwOwogCX0KLSNlbmRpZiAvLyBSVDI4NzAgLy8KKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotCi0JaWYgKCFwQWQtPmJVcGRhdGVCY25DbnREb25lKQotCXsKLQkvLyBVcGRhdGUgQkVBQ09OIHNlbnQgY291bnQKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQwLCAmVHhTdGFDbnQwLndvcmQpOwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZTdGFUeDEud29yZCk7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMiwgJlN0YVR4Mi53b3JkKTsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0JlYWNvblNlbnRDbnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4QmVhY29uQ291bnQ7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OwotCXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKLQlwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LnUuTG93UGFydCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OwotCXBBZC0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LnUuTG93UGFydCArPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJLyppZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkgfHwgKi8KKwkvKiAgICAgIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpICYmIChwQWQtPk1hY1RhYi5TaXplICE9IDEpKSkgKi8KKwlpZiAoIXBBZC0+YlVwZGF0ZUJjbkNudERvbmUpIHsKKwkJLyogVXBkYXRlIEJFQUNPTiBzZW50IGNvdW50ICovCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDAsICZUeFN0YUNudDAud29yZCk7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZTdGFUeDEud29yZCk7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDIsICZTdGFUeDIud29yZCk7CisJCXBSYWxpbmtDb3VudGVycy0+T25lU2VjQmVhY29uU2VudENudCArPQorCQkgICAgVHhTdGFDbnQwLmZpZWxkLlR4QmVhY29uQ291bnQ7CisJCXBSYWxpbmtDb3VudGVycy0+T25lU2VjVHhSZXRyeU9rQ291bnQgKz0KKwkJICAgIFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJCXBSYWxpbmtDb3VudGVycy0+T25lU2VjVHhOb1JldHJ5T2tDb3VudCArPQorCQkgICAgU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKKwkJcFJhbGlua0NvdW50ZXJzLT5PbmVTZWNUeEZhaWxDb3VudCArPQorCQkgICAgVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OworCQlwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQlwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LnUuTG93UGFydCArPQorCQkgICAgU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwkJcEFkLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CiAJfQogCisJLyppZiAocEFkLT5iU3RhRmlmb1Rlc3QgPT0gVFJVRSkgKi8KIAl7CiAJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQUdHX0NOVCwgJlR4QWdnQ250LndvcmQpOwogCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQwLCAmVHhBZ2dDbnQwLndvcmQpOwpAQCAtMjg0MCw2MCArMjE5Nyw4OSBAQAogCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQ1LCAmVHhBZ2dDbnQ1LndvcmQpOwogCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQ2LCAmVHhBZ2dDbnQ2LndvcmQpOwogCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQ3LCAmVHhBZ2dDbnQ3LndvcmQpOwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnQ291bnQgKz0gVHhBZ2dDbnQuZmllbGQuQWdnVHhDb3VudDsKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5UeE5vbkFnZ0NvdW50ICs9IFR4QWdnQ250LmZpZWxkLk5vbkFnZ1R4Q291bnQ7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxTVBEVUNvdW50ICs9IFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMUNvdW50OwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMk1QRFVDb3VudCArPSBUeEFnZ0NudDAuZmllbGQuQWdnU2l6ZTJDb3VudDsKKwkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZ0NvdW50ICs9IFR4QWdnQ250LmZpZWxkLkFnZ1R4Q291bnQ7CisJCXBSYWxpbmtDb3VudGVycy0+VHhOb25BZ2dDb3VudCArPSBUeEFnZ0NudC5maWVsZC5Ob25BZ2dUeENvdW50OworCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnMU1QRFVDb3VudCArPQorCQkgICAgVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUxQ291bnQ7CisJCXBSYWxpbmtDb3VudGVycy0+VHhBZ2cyTVBEVUNvdW50ICs9CisJCSAgICBUeEFnZ0NudDAuZmllbGQuQWdnU2l6ZTJDb3VudDsKIAotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnM01QRFVDb3VudCArPSBUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTNDb3VudDsKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzRNUERVQ291bnQgKz0gVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemU0Q291bnQ7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2c1TVBEVUNvdW50ICs9IFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNUNvdW50OwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnNk1QRFVDb3VudCArPSBUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTZDb3VudDsKKwkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzNNUERVQ291bnQgKz0KKwkJICAgIFR4QWdnQ250MS5maWVsZC5BZ2dTaXplM0NvdW50OworCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnNE1QRFVDb3VudCArPQorCQkgICAgVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemU0Q291bnQ7CisJCXBSYWxpbmtDb3VudGVycy0+VHhBZ2c1TVBEVUNvdW50ICs9CisJCSAgICBUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTVDb3VudDsKKwkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzZNUERVQ291bnQgKz0KKwkJICAgIFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNkNvdW50OwogCi0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2c3TVBEVUNvdW50ICs9IFR4QWdnQ250My5maWVsZC5BZ2dTaXplN0NvdW50OwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnOE1QRFVDb3VudCArPSBUeEFnZ0NudDMuZmllbGQuQWdnU2l6ZThDb3VudDsKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzlNUERVQ291bnQgKz0gVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemU5Q291bnQ7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxME1QRFVDb3VudCArPSBUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTEwQ291bnQ7CisJCXBSYWxpbmtDb3VudGVycy0+VHhBZ2c3TVBEVUNvdW50ICs9CisJCSAgICBUeEFnZ0NudDMuZmllbGQuQWdnU2l6ZTdDb3VudDsKKwkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzhNUERVQ291bnQgKz0KKwkJICAgIFR4QWdnQ250My5maWVsZC5BZ2dTaXplOENvdW50OworCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnOU1QRFVDb3VudCArPQorCQkgICAgVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemU5Q291bnQ7CisJCXBSYWxpbmtDb3VudGVycy0+VHhBZ2cxME1QRFVDb3VudCArPQorCQkgICAgVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemUxMENvdW50OwogCi0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxMU1QRFVDb3VudCArPSBUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTExQ291bnQ7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxMk1QRFVDb3VudCArPSBUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTEyQ291bnQ7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxM01QRFVDb3VudCArPSBUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTEzQ291bnQ7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxNE1QRFVDb3VudCArPSBUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTE0Q291bnQ7CisJCXBSYWxpbmtDb3VudGVycy0+VHhBZ2cxMU1QRFVDb3VudCArPQorCQkgICAgVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMUNvdW50OworCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnMTJNUERVQ291bnQgKz0KKwkJICAgIFR4QWdnQ250NS5maWVsZC5BZ2dTaXplMTJDb3VudDsKKwkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzEzTVBEVUNvdW50ICs9CisJCSAgICBUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTEzQ291bnQ7CisJCXBSYWxpbmtDb3VudGVycy0+VHhBZ2cxNE1QRFVDb3VudCArPQorCQkgICAgVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxNENvdW50OwogCi0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxNU1QRFVDb3VudCArPSBUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE1Q291bnQ7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxNk1QRFVDb3VudCArPSBUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE2Q291bnQ7CisJCXBSYWxpbmtDb3VudGVycy0+VHhBZ2cxNU1QRFVDb3VudCArPQorCQkgICAgVHhBZ2dDbnQ3LmZpZWxkLkFnZ1NpemUxNUNvdW50OworCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnMTZNUERVQ291bnQgKz0KKwkJICAgIFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTZDb3VudDsKIAotCQkvLyBDYWxjdWxhdGUgdGhlIHRyYW5zbWl0dGVkIEEtTVBEVSBjb3VudAotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUxQ291bnQ7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUyQ291bnQgLyAyKTsKKwkJLyogQ2FsY3VsYXRlIHRoZSB0cmFuc21pdHRlZCBBLU1QRFUgY291bnQgKi8KKwkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICBUeEFnZ0NudDAuZmllbGQuQWdnU2l6ZTFDb3VudDsKKwkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICAoVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUyQ291bnQgLyAyKTsKIAotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250MS5maWVsZC5BZ2dTaXplM0NvdW50IC8gMyk7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemU0Q291bnQgLyA0KTsKKwkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICAoVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemUzQ291bnQgLyAzKTsKKwkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICAoVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemU0Q291bnQgLyA0KTsKIAotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNUNvdW50IC8gNSk7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU2Q291bnQgLyA2KTsKKwkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICAoVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU1Q291bnQgLyA1KTsKKwkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICAoVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU2Q291bnQgLyA2KTsKIAotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250My5maWVsZC5BZ2dTaXplN0NvdW50IC8gNyk7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQzLmZpZWxkLkFnZ1NpemU4Q291bnQgLyA4KTsKKwkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICAoVHhBZ2dDbnQzLmZpZWxkLkFnZ1NpemU3Q291bnQgLyA3KTsKKwkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICAoVHhBZ2dDbnQzLmZpZWxkLkFnZ1NpemU4Q291bnQgLyA4KTsKIAotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250NC5maWVsZC5BZ2dTaXplOUNvdW50IC8gOSk7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemUxMENvdW50IC8gMTApOworCQlwUmFsaW5rQ291bnRlcnMtPlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0KKwkJICAgIChUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTlDb3VudCAvIDkpOworCQlwUmFsaW5rQ291bnRlcnMtPlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0KKwkJICAgIChUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTEwQ291bnQgLyAxMCk7CiAKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTExQ291bnQgLyAxMSk7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMkNvdW50IC8gMTIpOworCQlwUmFsaW5rQ291bnRlcnMtPlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0KKwkJICAgIChUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTExQ291bnQgLyAxMSk7CisJCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPQorCQkgICAgKFR4QWdnQ250NS5maWVsZC5BZ2dTaXplMTJDb3VudCAvIDEyKTsKIAotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Ni5maWVsZC5BZ2dTaXplMTNDb3VudCAvIDEzKTsKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTE0Q291bnQgLyAxNCk7CisJCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPQorCQkgICAgKFR4QWdnQ250Ni5maWVsZC5BZ2dTaXplMTNDb3VudCAvIDEzKTsKKwkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICAoVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxNENvdW50IC8gMTQpOwogCi0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ3LmZpZWxkLkFnZ1NpemUxNUNvdW50IC8gMTUpOwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTZDb3VudCAvIDE2KTsKKwkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICAoVHhBZ2dDbnQ3LmZpZWxkLkFnZ1NpemUxNUNvdW50IC8gMTUpOworCQlwUmFsaW5rQ291bnRlcnMtPlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0KKwkJICAgIChUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE2Q291bnQgLyAxNik7CiAJfQogCi0KLQogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTI5MTMsMjUgKzIyOTksMzMgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJTklDUmVzZXRGcm9tRXJyb3IoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCit2b2lkIE5JQ1Jlc2V0RnJvbUVycm9yKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQkvLyBSZXNldCBCQlAgKGFjY29yZGluZyB0byBhbGV4LCByZXNldCBBU0lDIHdpbGwgZm9yY2UgcmVzZXQgQkJQCi0JLy8gVGhlcmVmb3JlLCBza2lwIHRoZSByZXNldCBCQlAKLQkvLyBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMSwgMHgyKTsKKwkvKiBSZXNldCBCQlAgKGFjY29yZGluZyB0byBhbGV4LCByZXNldCBBU0lDIHdpbGwgZm9yY2UgcmVzZXQgQkJQICovCisJLyogVGhlcmVmb3JlLCBza2lwIHRoZSByZXNldCBCQlAgKi8KKwkvKiBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMSwgMHgyKTsgKi8KIAogCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgxKTsKLQkvLyBSZW1vdmUgQVNJQyBmcm9tIHJlc2V0IHN0YXRlCisJLyogUmVtb3ZlIEFTSUMgZnJvbSByZXNldCBzdGF0ZSAqLwogCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgwKTsKIAogCU5JQ0luaXRpYWxpemVBZGFwdGVyKHBBZCwgRkFMU0UpOwogCU5JQ0luaXRBc2ljRnJvbUVFUFJPTShwQWQpOwogCi0JLy8gU3dpdGNoIHRvIGN1cnJlbnQgY2hhbm5lbCwgc2luY2UgZHVyaW5nIHJlc2V0IHByb2Nlc3MsIHRoZSBjb25uZWN0aW9uIHNob3VsZCByZW1haW5zIG9uLgorCS8qIFN3aXRjaCB0byBjdXJyZW50IGNoYW5uZWwsIHNpbmNlIGR1cmluZyByZXNldCBwcm9jZXNzLCB0aGUgY29ubmVjdGlvbiBzaG91bGQgcmVtYWlucyBvbi4gKi8KIAlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CiAJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwogfQogCitpbnQgTklDTG9hZEZpcm13YXJlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlpbnQgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlpZiAocEFkLT5jaGlwT3BzLmxvYWRGaXJtd2FyZSkKKwkJc3RhdHVzID0gcEFkLT5jaGlwT3BzLmxvYWRGaXJtd2FyZShwQWQpOworCisJcmV0dXJuIHN0YXR1czsKK30KKwogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMjk0NSwxMDAgKzIzMzksMTIgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgTklDRXJhc2VGaXJtd2FyZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3ZvaWQgTklDRXJhc2VGaXJtd2FyZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JVUxPTkcgaTsKKwlpZiAocEFkLT5jaGlwT3BzLmVyYXNlRmlybXdhcmUpCisJCXBBZC0+Y2hpcE9wcy5lcmFzZUZpcm13YXJlKHBBZCk7CiAKLQlmb3IoaT0wOyBpPE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFOyBpKz00KQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBGSVJNV0FSRV9JTUFHRV9CQVNFICsgaSwgMCk7Ci0KLX0vKiBFbmQgb2YgTklDRXJhc2VGaXJtd2FyZSAqLwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJTG9hZCA4MDUxIGZpcm13YXJlIFJUMjU2MS5CSU4gZmlsZSBpbnRvIE1BQyBBU0lDCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5ESVNfU1RBVFVTX1NVQ0NFU1MgICAgICAgICBmaXJtd2FyZSBpbWFnZSBsb2FkIG9rCi0JCU5ESVNfU1RBVFVTX0ZBSUxVUkUgICAgICAgICBpbWFnZSBub3QgZm91bmQKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTX1NUQVRVUyBOSUNMb2FkRmlybXdhcmUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JTkRJU19TVEFUVVMJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JUFVDSEFSCQkJcEZpcm13YXJlSW1hZ2U7Ci0JVUxPTkcJCQlGaWxlTGVuZ3RoLCBJbmRleDsKLQkvL1VMT05HCQkJZmlybTsKLQlVSU5UMzIJCQlNYWNSZWcgPSAwOwotI2lmZGVmIFJUMjg3MAotCVVJTlQzMgkJCVZlcnNpb24gPSAocEFkLT5NQUNWZXJzaW9uID4+IDE2KTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQotCXBGaXJtd2FyZUltYWdlID0gRmlybXdhcmVJbWFnZTsKLQlGaWxlTGVuZ3RoID0gc2l6ZW9mKEZpcm13YXJlSW1hZ2UpOwotI2lmZGVmIFJUMjg3MAotCS8vIE5ldyA4ayBieXRlIGZpcm13YXJlIHNpemUgZm9yIFJUMzA3MS9SVDMwNzIKLQkvL3ByaW50aygiVXNiIENoaXBcbiIpOwotCWlmIChGSVJNV0FSRUlNQUdFX0xFTkdUSCA9PSBGSVJNV0FSRUlNQUdFX01BWF9MRU5HVEgpCi0JLy9UaGUgZmlybXdhcmUgaW1hZ2UgY29uc2lzdHMgb2YgdHdvIHBhcnRzLiBPbmUgaXMgdGhlIG9yaWdpYW5sIGFuZCB0aGUgb3RoZXIgaXMgdGhlIG5ldy4KLQkvL1VzZSBTZWNvbmQgUGFydAotCXsKLQkJaWYgKChWZXJzaW9uICE9IDB4Mjg2MCkgJiYgKFZlcnNpb24gIT0gMHgyODcyKSAmJiAoVmVyc2lvbiAhPSAweDMwNzApKQotCQl7CS8vIFVzZSBGaXJtd2FyZSBWMi4KLQkJCS8vcHJpbnRrKCJLSDpVc2UgTmV3IFZlcnNpb24scGFydDJcbiIpOwotCQkJcEZpcm13YXJlSW1hZ2UgPSAoUFVDSEFSKSZGaXJtd2FyZUltYWdlW0ZJUk1XQVJFSU1BR0VWMV9MRU5HVEhdOwotCQkJRmlsZUxlbmd0aCA9IEZJUk1XQVJFSU1BR0VWMl9MRU5HVEg7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvL3ByaW50aygiS0g6VXNlIE5ldyBWZXJzaW9uLHBhcnQxXG4iKTsKLQkJCXBGaXJtd2FyZUltYWdlID0gRmlybXdhcmVJbWFnZTsKLQkJCUZpbGVMZW5ndGggPSBGSVJNV0FSRUlNQUdFVjFfTEVOR1RIOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIktIOiBiaW4gZmlsZSBzaG91bGQgYmUgOEtCLlxuIikpOwotCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQotI2VuZGlmIC8vIFJUMjg3MCAvLwotCi0JUlQyOFhYX1dSSVRFX0ZJUk1XQVJFKHBBZCwgcEZpcm13YXJlSW1hZ2UsIEZpbGVMZW5ndGgpOwotCi0JLyogY2hlY2sgaWYgTUNVIGlzIHJlYWR5ICovCi0JSW5kZXggPSAwOwotCWRvCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFBCRl9TWVNfQ1RSTCwgJk1hY1JlZyk7Ci0KLQkJaWYgKE1hY1JlZyAmIDB4ODApCi0JCQlicmVhazsKLQotCQlSVE1QdXNlY0RlbGF5KDEwMDApOwotCX0gd2hpbGUgKEluZGV4KysgPCAxMDAwKTsKLQotICAgIGlmIChJbmRleCA+IDEwMDApCi0JewotCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJOSUNMb2FkRmlybXdhcmU6IE1DVSBpcyBub3QgcmVhZHlcblxuXG4iKSk7Ci0JfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAotCQkJICgiPD09PSAlcyAoc3RhdHVzPSVkKVxuIiwgX19mdW5jX18sIFN0YXR1cykpOwotICAgIHJldHVybiBTdGF0dXM7Ci19IC8qIEVuZCBvZiBOSUNMb2FkRmlybXdhcmUgKi8KLQorfQkJCQkvKiBFbmQgb2YgTklDRXJhc2VGaXJtd2FyZSAqLwogCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMzA2MSw4ICsyMzY3LDcgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLU5ESVNfU1RBVFVTIE5JQ0xvYWRSYXRlU3dpdGNoaW5nUGFyYW1zKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoraW50IE5JQ0xvYWRSYXRlU3dpdGNoaW5nUGFyYW1zKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKIAlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTMwNzEsNTMgKzIzNzYsNiBAQAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiAJUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJaWYgIHBTcmMxIGFsbCB6ZXJvIHdpdGggbGVuZ3RoIExlbmd0aCwgcmV0dXJuIDAuCi0JCUlmIG5vdCBhbGwgemVybywgcmV0dXJuIDEKLQotCUFyZ3VtZW50czoKLQkJcFNyYzEKLQotCVJldHVybiBWYWx1ZToKLQkJMToJCQlub3QgYWxsIHplcm8KLQkJMDoJCQlhbGwgemVybwotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVUxPTkcJUlRNUE5vdEFsbFplcm8oCi0JSU4JUFZPSUQJcFNyYzEsCi0JSU4JVUxPTkcJTGVuZ3RoKQotewotCVBVQ0hBUglwTWVtMTsKLQlVTE9ORwlJbmRleCA9IDA7Ci0KLQlwTWVtMSA9IChQVUNIQVIpIHBTcmMxOwotCi0JZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTGVuZ3RoOyBJbmRleCsrKQotCXsKLQkJaWYgKHBNZW0xW0luZGV4XSAhPSAweDApCi0JCXsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKEluZGV4ID09IExlbmd0aCkKLQl7Ci0JCXJldHVybiAoMCk7Ci0JfQotCWVsc2UKLQl7Ci0JCXJldHVybiAoMSk7Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKIAkJQ29tcGFyZSB0d28gbWVtb3J5IGJsb2NrCiAKIAlBcmd1bWVudHM6CkBAIC0zMTM1LDI3ICsyMzkzLDIzIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1VTE9ORwlSVE1QQ29tcGFyZU1lbW9yeSgKLQlJTglQVk9JRAlwU3JjMSwKLQlJTglQVk9JRAlwU3JjMiwKLQlJTglVTE9ORwlMZW5ndGgpCit1bnNpZ25lZCBsb25nIFJUTVBDb21wYXJlTWVtb3J5KHZvaWQgKnBTcmMxLCB2b2lkICpwU3JjMiwgdW5zaWduZWQgbG9uZyBMZW5ndGgpCiB7Ci0JUFVDSEFSCXBNZW0xOwotCVBVQ0hBUglwTWVtMjsKLQlVTE9ORwlJbmRleCA9IDA7CisJdTggKnBNZW0xOworCXU4ICpwTWVtMjsKKwl1bnNpZ25lZCBsb25nIEluZGV4ID0gMDsKIAotCXBNZW0xID0gKFBVQ0hBUikgcFNyYzE7Ci0JcE1lbTIgPSAoUFVDSEFSKSBwU3JjMjsKKwlwTWVtMSA9ICh1OCAqKXBTcmMxOworCXBNZW0yID0gKHU4ICopcFNyYzI7CiAKLQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspCi0JeworCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IExlbmd0aDsgSW5kZXgrKykgewogCQlpZiAocE1lbTFbSW5kZXhdID4gcE1lbTJbSW5kZXhdKQogCQkJcmV0dXJuICgxKTsKIAkJZWxzZSBpZiAocE1lbTFbSW5kZXhdIDwgcE1lbTJbSW5kZXhdKQogCQkJcmV0dXJuICgyKTsKIAl9CiAKLQkvLyBFcXVhbAorCS8qIEVxdWFsICovCiAJcmV0dXJuICgwKTsKIH0KIApAQCAtMzE3OSwzNyArMjQzMywxOCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVE1QWmVyb01lbW9yeSgKLQlJTglQVk9JRAlwU3JjLAotCUlOCVVMT05HCUxlbmd0aCkKK3ZvaWQgUlRNUFplcm9NZW1vcnkodm9pZCAqcFNyYywgdW5zaWduZWQgbG9uZyBMZW5ndGgpCiB7Ci0JUFVDSEFSCXBNZW07Ci0JVUxPTkcJSW5kZXggPSAwOworCXU4ICpwTWVtOworCXVuc2lnbmVkIGxvbmcgSW5kZXggPSAwOwogCi0JcE1lbSA9IChQVUNIQVIpIHBTcmM7CisJcE1lbSA9ICh1OCAqKXBTcmM7CiAKLQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspCi0JeworCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IExlbmd0aDsgSW5kZXgrKykgewogCQlwTWVtW0luZGV4XSA9IDB4MDA7CiAJfQogfQogCi1WT0lECVJUTVBGaWxsTWVtb3J5KAotCUlOCVBWT0lECXBTcmMsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCVVDSEFSCUZpbGwpCi17Ci0JUFVDSEFSCXBNZW07Ci0JVUxPTkcJSW5kZXggPSAwOwotCi0JcE1lbSA9IChQVUNIQVIpIHBTcmM7Ci0KLQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspCi0JewotCQlwTWVtW0luZGV4XSA9IEZpbGw7Ci0JfQotfQotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0zMjMxLDIyICsyNDY2LDE4IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUTVBNb3ZlTWVtb3J5KAotCU9VVAlQVk9JRAlwRGVzdCwKLQlJTglQVk9JRAlwU3JjLAotCUlOCVVMT05HCUxlbmd0aCkKK3ZvaWQgUlRNUE1vdmVNZW1vcnkodm9pZCAqcERlc3QsIHZvaWQgKnBTcmMsIHVuc2lnbmVkIGxvbmcgTGVuZ3RoKQogewotCVBVQ0hBUglwTWVtMTsKLQlQVUNIQVIJcE1lbTI7Ci0JVUlOVAlJbmRleDsKKwl1OCAqcE1lbTE7CisJdTggKnBNZW0yOworCXUzMiBJbmRleDsKIAotCUFTU0VSVCgoTGVuZ3RoPT0wKSB8fCAocERlc3QgJiYgcFNyYykpOworCUFTU0VSVCgoTGVuZ3RoID09IDApIHx8IChwRGVzdCAmJiBwU3JjKSk7CiAKLQlwTWVtMSA9IChQVUNIQVIpIHBEZXN0OwotCXBNZW0yID0gKFBVQ0hBUikgcFNyYzsKKwlwTWVtMSA9ICh1OCAqKXBEZXN0OworCXBNZW0yID0gKHU4ICopcFNyYzsKIAotCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IExlbmd0aDsgSW5kZXgrKykKLQl7CisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTGVuZ3RoOyBJbmRleCsrKSB7CiAJCXBNZW0xW0luZGV4XSA9IHBNZW0yW0luZGV4XTsKIAl9CiB9CkBAIC0zMjY5LDE3ICsyNTAwLDE2IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVVzZXJDZmdJbml0KAotCUlOCVBSVE1QX0FEQVBURVIgcEFkKQordm9pZCBVc2VyQ2ZnSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0gICAgVUlOVCBrZXlfaW5kZXgsIGJzc19pbmRleDsKKwl1MzIga2V5X2luZGV4LCBic3NfaW5kZXg7CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVXNlckNmZ0luaXRcbiIpKTsKIAotCS8vCi0JLy8gIHBhcnQgSS4gaW50aWFsaXplIGNvbW1vbiBjb25maWd1cmF0aW9uCi0JLy8KLSNpZmRlZiBSVDI4NzAKKwkvKiAqLworCS8qICBwYXJ0IEkuIGludGlhbGl6ZSBjb21tb24gY29uZmlndXJhdGlvbiAqLworCS8qICovCisjaWZkZWYgUlRNUF9NQUNfVVNCCiAJcEFkLT5CdWxrT3V0UmVxID0gMDsKIAogCXBBZC0+QnVsa091dENvbXBsZXRlID0gMDsKQEAgLTMyODksNzIgKzI1MTksNzEgQEAKIAlwQWQtPkJ1bGtJbkNvbXBsZXRlID0gMDsKIAlwQWQtPkJ1bGtJbkNvbXBsZXRlRmFpbCA9IDA7CiAKLQkvL3BBZC0+UXVpY2tUaW1lclAgPSAxMDA7Ci0JLy9wQWQtPlR1cm5BZ2dyQnVsa0luQ291bnQgPSAwOworCS8qcEFkLT5RdWlja1RpbWVyUCA9IDEwMDsgKi8KKwkvKnBBZC0+VHVybkFnZ3JCdWxrSW5Db3VudCA9IDA7ICovCiAJcEFkLT5iVXNiVHhCdWxrQWdncmUgPSAwOwogCi0JLy8gaW5pdCBhcyB1bnNlZCB2YWx1ZSB0byBlbnN1cmUgZHJpdmVyIHdpbGwgc2V0IHRvIE1DVSBvbmNlLgotCXBBZC0+TGVkSW5kaWNhdG9yU3RyZWd0aCA9IDB4RkY7CisJLyogaW5pdCBhcyB1bnNlZCB2YWx1ZSB0byBlbnN1cmUgZHJpdmVyIHdpbGwgc2V0IHRvIE1DVSBvbmNlLiAqLworCXBBZC0+TGVkSW5kaWNhdG9yU3RyZW5ndGggPSAweEZGOwogCiAJcEFkLT5Db21tb25DZmcuTWF4UGt0T25lVHhCdWxrID0gMjsKIAlwQWQtPkNvbW1vbkNmZy5UeEJ1bGtGYWN0b3IgPSAxOwotCXBBZC0+Q29tbW9uQ2ZnLlJ4QnVsa0ZhY3RvciA9MTsKKwlwQWQtPkNvbW1vbkNmZy5SeEJ1bGtGYWN0b3IgPSAxOwogCi0JcEFkLT5Db21tb25DZmcuVHhQb3dlciA9IDEwMDsgLy9tVworCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXIgPSAxMDA7CS8qbVcgKi8KIAotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLCBzaXplb2YocEFkLT5Db21tb25DZmcuSU9UZXN0UGFybSkpOwotI2VuZGlmIC8vIFJUMjg3MCAvLworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLAorCQkgICAgICAgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0pKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotCWZvcihrZXlfaW5kZXg9MDsga2V5X2luZGV4PFNIQVJFX0tFWV9OVU07IGtleV9pbmRleCsrKQotCXsKLQkJZm9yKGJzc19pbmRleCA9IDA7IGJzc19pbmRleCA8IE1BWF9NQlNTSURfTlVNOyBic3NfaW5kZXgrKykKLQkJeworCWZvciAoa2V5X2luZGV4ID0gMDsga2V5X2luZGV4IDwgU0hBUkVfS0VZX05VTTsga2V5X2luZGV4KyspIHsKKwkJZm9yIChic3NfaW5kZXggPSAwOyBic3NfaW5kZXggPCBNQVhfTUJTU0lEX05VTTsgYnNzX2luZGV4KyspIHsKIAkJCXBBZC0+U2hhcmVkS2V5W2Jzc19pbmRleF1ba2V5X2luZGV4XS5LZXlMZW4gPSAwOwotCQkJcEFkLT5TaGFyZWRLZXlbYnNzX2luZGV4XVtrZXlfaW5kZXhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQkJcEFkLT5TaGFyZWRLZXlbYnNzX2luZGV4XVtrZXlfaW5kZXhdLkNpcGhlckFsZyA9CisJCQkgICAgQ0lQSEVSX05PTkU7CiAJCX0KIAl9CiAKLSNpZmRlZiBSVDI4NzAKIAlwQWQtPkVlcHJvbUFjY2VzcyA9IEZBTFNFOwotI2VuZGlmCisKIAlwQWQtPkFudGVubmEud29yZCA9IDA7CiAJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7CiAKIAlwQWQtPkxlZENudGwud29yZCA9IDA7Ci0jaWZkZWYgUlQyODYwCi0JcEFkLT5MZWRJbmRpY2F0b3JTdHJlZ3RoID0gMDsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwlwQWQtPkxlZEluZGljYXRvclN0cmVuZ3RoID0gMDsKIAlwQWQtPlJMbmtDdHJsT2Zmc2V0ID0gMDsKIAlwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0ID0gMDsKKwlwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPSBUUlVFOwogCXBBZC0+Q2hlY2tEbWFCdXN5Q291bnQgPSAwOwotI2VuZGlmCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiAKLQlwQWQtPmJBdXRvVHhBZ2NBID0gRkFMU0U7CQkJLy8gRGVmYXVsdCBpcyBPRkYKLQlwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7CQkJLy8gRGVmYXVsdCBpcyBPRkYKKwlwQWQtPmJBdXRvVHhBZ2NBID0gRkFMU0U7CS8qIERlZmF1bHQgaXMgT0ZGICovCisJcEFkLT5iQXV0b1R4QWdjRyA9IEZBTFNFOwkvKiBEZWZhdWx0IGlzIE9GRiAqLwogCXBBZC0+UmZJY1R5cGUgPSBSRklDXzI4MjA7CiAKLQkvLyBJbml0IHRpbWVyIGZvciByZXNldCBjb21wbGV0ZSBldmVudAorCS8qIEluaXQgdGltZXIgZm9yIHJlc2V0IGNvbXBsZXRlIGV2ZW50ICovCiAJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSAxOwogCXBBZC0+YkZvcmNlUHJpbnRUWCA9IEZBTFNFOwogCXBBZC0+YkZvcmNlUHJpbnRSWCA9IEZBTFNFOwogCXBBZC0+YlN0YUZpZm9UZXN0ID0gRkFMU0U7CiAJcEFkLT5iUHJvdGVjdGlvblRlc3QgPSBGQUxTRTsKLQlwQWQtPmJIQ0NBVGVzdCA9IEZBTFNFOwotCXBBZC0+Ykdlbk9uZUhDQ0EgPSBGQUxTRTsKLQlwQWQtPkNvbW1vbkNmZy5Ec2lmcyA9IDEwOyAgICAgIC8vIGluIHVuaXRzIG9mIHVzZWMKLQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyID0gMTAwOyAvL21XCi0JcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSAweGZmZmZmZmZmOyAvLyBBVVRPCi0JcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQgPSAweGZmZmZmZmZmOyAvLyBBVVRPCi0JcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFJ0ODAyXzExUHJlYW1ibGVBdXRvOyAvLyB1c2UgTG9uZyBwcmVhbWJsZSBvbiBUWCBieSBkZWZhdXQKKwlwQWQtPkNvbW1vbkNmZy5Ec2lmcyA9IDEwOwkvKiBpbiB1bml0cyBvZiB1c2VjICovCisJcEFkLT5Db21tb25DZmcuVHhQb3dlciA9IDEwMDsJLyptVyAqLworCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gMHhmZmZmZmZmZjsJLyogQVVUTyAqLworCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0ID0gMHhmZmZmZmZmZjsJLyogQVVUTyAqLworCXBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBSdDgwMl8xMVByZWFtYmxlQXV0bzsJLyogdXNlIExvbmcgcHJlYW1ibGUgb24gVFggYnkgZGVmYXV0ICovCiAJcEFkLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IEZBTFNFOwogCXBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA9IDIzNDc7CiAJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSAyMzQ2OwotCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDA7ICAgIC8vIDA6IEFVVE8KLQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA9IFRSVUU7IC8vMDsKLQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gMHhmZjsgICAgIC8vIHVua25vd24KKwlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAwOwkvKiAwOiBBVVRPICovCisJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBUUlVFOwkvKjA7ICovCisJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IDB4ZmY7CS8qIHVua25vd24gKi8KIAlwQWQtPkNvbW1vbkNmZy5CYW5kU3RhdGUgPSBVTktOT1dOX0JBTkQ7CiAJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ1NQZXJpb2QgPSAxMDsKIAlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DU0NvdW50ID0gMDsKIAlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgPSBSRF9OT1JNQUxfTU9ERTsKKwogCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNoTW92aW5nVGltZSA9IDY1OwogCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkxvbmdQdWxzZVJhZGFyVGggPSAzOwogCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSA9IEZBTFNFOwpAQCAtMzM2NywxOCArMjU5NiwyMiBAQAogCiAJTmRpc1plcm9NZW1vcnkoJnBBZC0+QmVhY29uVHhXSSwgc2l6ZW9mKHBBZC0+QmVhY29uVHhXSSkpOwogCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSkpOworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCisJCSAgICAgICBzaXplb2YocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5KSk7CiAJcEFkLT5IVENFbmFibGUgPSBGQUxTRTsKIAlwQWQtPmJCcm9hZENvbUhUID0gRkFMU0U7CiAJcEFkLT5Db21tb25DZmcuYlJkZyA9IEZBTFNFOwogCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbykpOworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sCisJCSAgICAgICBzaXplb2YocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvKSk7CiAJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gTU1QU19FTkFCTEU7CiAJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gMDsKIAlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gSU1NRURfQkE7Ci0JcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDY0OyAvLzMyOwotCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5UeEJBV2luTGltaXQgPSA2NDsgLy8zMjsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVXNlckNmZ0luaXQuIEJBQ2FwYWJpbGl0eSA9IDB4JXhcbiIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkKSk7CisJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDY0OwkvKjMyOyAqLworCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5UeEJBV2luTGltaXQgPSA2NDsJLyozMjsgKi8KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiLS0+IFVzZXJDZmdJbml0LiBCQUNhcGFiaWxpdHkgPSAweCV4XG4iLAorCQkgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkKSk7CiAKIAlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gRkFMU0U7CiAJQkFUYWJsZUluaXQocEFkLCAmcEFkLT5CQVRhYmxlKTsKQEAgLTMzODYsMjggKzI2MTksMzUgQEAKIAlwQWQtPkNvbW1vbkNmZy5iRXh0Q2hhbm5lbFN3aXRjaEFubm91bmNlbWVudCA9IDE7CiAJcEFkLT5Db21tb25DZmcuYkhUUHJvdGVjdCA9IDE7CiAJcEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSA9IFRSVUU7CisJLyoyMDA4LzExLzA1OktIIGFkZCB0byBzdXBwb3J0IEFudGVubmEgcG93ZXItc2F2aW5nIG9mIEFQPC0tICovCisJcEFkLT5Db21tb25DZmcuYkdyZWVuQVBFbmFibGUgPSBGQUxTRTsKKwkvKjIwMDgvMTEvMDU6S0ggYWRkIHRvIHN1cHBvcnQgQW50ZW5uYSBwb3dlci1zYXZpbmcgb2YgQVAtLT4gKi8KIAlwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID0gRkFMU0U7CiAJcEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID0gRkFMU0U7CiAKLQlwQWQtPkNvbW1vbkNmZy5UeEJBU2l6ZSA9IDc7CisJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NzIwMjAwKSB7CisJCXBBZC0+Q29tbW9uQ2ZnLlR4QkFTaXplID0gMTM7CS8qYnkgSmVycnkgcmVjb21tZW5kICovCisJfSBlbHNlIHsKKwkJcEFkLT5Db21tb25DZmcuVHhCQVNpemUgPSA3OworCX0KIAogCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS53b3JkID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQ7CiAKLQkvL3BBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOwotCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE1DU19BVVRPOwotCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7Ci0JLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKKwkvKnBBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOyAqLworCS8qcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE1DU19BVVRPOyAqLworCS8qcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7ICovCisJLypwQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsgKi8KIAlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBSQVRFXzY7CiAKIAlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gTUNTX1JBVEVfNjsKIAlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuQlcgPSBCV18yMDsKIAlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKIAotCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA9IDEwMDsgICAgIC8vIGluIG1TZWMKKwlwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPSAxMDA7CS8qIGluIG1TZWMgKi8KIAotCS8vCi0JLy8gcGFydCBJSS4gaW50aWFsaXplIFNUQSBzcGVjaWZpYyBjb25maWd1cmF0aW9uCi0JLy8KKwkvKiAqLworCS8qIHBhcnQgSUkuIGludGlhbGl6ZSBTVEEgc3BlY2lmaWMgY29uZmlndXJhdGlvbiAqLworCS8qICovCiAJewogCQlSWF9GSUxURVJfU0VUX0ZMQUcocEFkLCBmUlhfRklMVEVSX0FDQ0VQVF9ESVJFQ1QpOwogCQlSWF9GSUxURVJfQ0xFQVJfRkxBRyhwQWQsIGZSWF9GSUxURVJfQUNDRVBUX01VTFRJQ0FTVCk7CkBAIC0zNDIyLDIyICsyNjYyLDIzIEBACiAJCXBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgPSBGQUxTRTsKIAkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gMDsKIAotCQkvLyA4MDIuMXggcG9ydCBjb250cm9sCisJCS8qIDgwMi4xeCBwb3J0IGNvbnRyb2wgKi8KIAkJcEFkLT5TdGFDZmcuUHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyODAyMXhXRVA7CiAJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOwogCQlwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lID0gMDsKLQkJcEFkLT5TdGFDZmcuTWljRXJyQ250ICAgICAgICA9IDA7Ci0JCXBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jICAgICAgPSBGQUxTRTsKLQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgICAgICAgICA9IFNTX05PVFVTRTsKKwkJcEFkLT5TdGFDZmcuTWljRXJyQ250ID0gMDsKKwkJcEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CiAKLQkJcEFkLT5Db21tb25DZmcuTmRpc1JhZGlvU3RhdGVPZmYgPSBGQUxTRTsJCS8vIE5ldyB0byBzdXBwb3J0IG1pY3Jvc29mdCBkaXNhYmxlIHJhZGlvIHdpdGggT0lEIGNvbW1hbmQKKwkJcEFkLT5Db21tb25DZmcuTmRpc1JhZGlvU3RhdGVPZmYgPSBGQUxTRTsJLyogTmV3IHRvIHN1cHBvcnQgbWljcm9zb2Z0IGRpc2FibGUgcmFkaW8gd2l0aCBPSUQgY29tbWFuZCAqLwogCiAJCXBBZC0+U3RhQ2ZnLlJzc2lUcmlnZ2VyID0gMDsKLQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUsIHNpemVvZihSU1NJX1NBTVBMRSkpOwotCQlwQWQtPlN0YUNmZy5Sc3NpVHJpZ2dlck1vZGUgPSBSU1NJX1RSSUdHRVJFRF9VUE9OX0JFTE9XX1RIUkVTSE9MRDsKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUsIHNpemVvZihzdHJ1Y3QgcnRfcnNzaV9zYW1wbGUpKTsKKwkJcEFkLT5TdGFDZmcuUnNzaVRyaWdnZXJNb2RlID0KKwkJICAgIFJTU0lfVFJJR0dFUkVEX1VQT05fQkVMT1dfVEhSRVNIT0xEOwogCQlwQWQtPlN0YUNmZy5BdGltV2luID0gMDsKLQkJcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsvL2RlZmF1bHQgbGlzdGVuIGNvdW50OwotCQlwQWQtPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOyAgLy8gQlNTX0lORlJBIG9yIEJTU19BREhPQyBvciBCU1NfTU9OSVRPUgorCQlwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOwkvKmRlZmF1bHQgbGlzdGVuIGNvdW50OyAqLworCQlwQWQtPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOwkvKiBCU1NfSU5GUkEgb3IgQlNTX0FESE9DIG9yIEJTU19NT05JVE9SICovCiAJCXBBZC0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKIAkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7CiAJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dBS0VVUF9OT1cpOwpAQCAtMzQ0NiwxNTggKzI2ODcsMTc0IEBACiAJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CiAJfQogCi0JLy8gZ2xvYmFsIHZhcmlhYmxlcyBtWFhYWCB1c2VkIGluIE1BQyBwcm90b2NvbCBzdGF0ZSBtYWNoaW5lcworI2lmZGVmIFBDSUVfUFNfU1VQUE9SVAorCXBBZC0+YnJ0MzB4eEJhbk1jdUNtZCA9IEZBTFNFOworCXBBZC0+YjMwOTBFU3BlY2lhbENoaXAgPSBGQUxTRTsKKy8qS0ggRGVidWc6dGhlIGZvbGxvd2luZyBtdXN0IGJlIHJlbW92ZWQgKi8KKwlwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID0gMzsKKwlwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4Rm9yY2VBU1BNVGVzdCA9IDA7CisJcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eEZvbGxvd0hvc3RBU1BNID0gMTsKKyNlbmRpZiAvKiBQQ0lFX1BTX1NVUFBPUlQgLy8gKi8KKworCS8qIGdsb2JhbCB2YXJpYWJsZXMgbVhYWFggdXNlZCBpbiBNQUMgcHJvdG9jb2wgc3RhdGUgbWFjaGluZXMgKi8KIAlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKIAlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BREhPQ19PTik7CiAJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfSU5GUkFfT04pOwogCi0JLy8gUEhZIHNwZWNpZmljYXRpb24KLQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gUEhZXzExQkdfTUlYRUQ7CQkvLyBkZWZhdWx0IFBIWSBtb2RlCi0JT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsgIC8vIENDSyB1c2UgTE9ORyBwcmVhbWJsZQorCS8qIFBIWSBzcGVjaWZpY2F0aW9uICovCisJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IFBIWV8xMUJHX01JWEVEOwkvKiBkZWZhdWx0IFBIWSBtb2RlICovCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsJLyogQ0NLIHVzZSBsb25nIHByZWFtYmxlICovCiAKIAl7Ci0JCS8vIHVzZXIgZGVzaXJlZCBwb3dlciBtb2RlCisJCS8qIHVzZXIgZGVzaXJlZCBwb3dlciBtb2RlICovCiAJCXBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOwogCQlwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07CiAJCXBBZC0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPSBGQUxTRTsKIAotCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYyksIHBBZCwgRkFMU0UpOworCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyLAorCQkJICAgICAgR0VUX1RJTUVSX0ZVTkNUSU9OKFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMpLAorCQkJICAgICAgcEFkLCBGQUxTRSk7CiAJCXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZyA9IEZBTFNFOwogCi0JCS8vIFBhdGNoIGZvciBOZHRlc3QKKwkJLyogUGF0Y2ggZm9yIE5kdGVzdCAqLwogCQlwQWQtPlN0YUNmZy5TY2FuQ250ID0gMDsKIAotCQkvLyBDQ1ggMi4wIGNvbnRyb2wgZmxhZyBpbml0Ci0JCXBBZC0+U3RhQ2ZnLkNDWEVuYWJsZSA9IEZBTFNFOwotCQlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlID0gTVNSTl9UWVBFX1VOVVNFRDsKLQkJcEFkLT5TdGFDZmcuQ0NYUW9zRUNXTWluCT0gNDsKLQkJcEFkLT5TdGFDZmcuQ0NYUW9zRUNXTWF4CT0gMTA7CisJCXBBZC0+U3RhQ2ZnLmJId1JhZGlvID0gVFJVRTsJLyogRGVmYXVsdCBIYXJkd2FyZSBSYWRpbyBzdGF0dXMgaXMgT24gKi8KKwkJcEFkLT5TdGFDZmcuYlN3UmFkaW8gPSBUUlVFOwkvKiBEZWZhdWx0IFNvZnR3YXJlIFJhZGlvIHN0YXR1cyBpcyBPbiAqLworCQlwQWQtPlN0YUNmZy5iUmFkaW8gPSBUUlVFOwkvKiBiSHdSYWRpbyAmJiBiU3dSYWRpbyAqLworCQlwQWQtPlN0YUNmZy5iSGFyZHdhcmVSYWRpbyA9IEZBTFNFOwkvKiBEZWZhdWx0IGlzIE9GRiAqLworCQlwQWQtPlN0YUNmZy5iU2hvd0hpZGRlblNTSUQgPSBGQUxTRTsJLyogRGVmYXVsdCBubyBzaG93ICovCiAKLQkJcEFkLT5TdGFDZmcuYkh3UmFkaW8gID0gVFJVRTsgLy8gRGVmYXVsdCBIYXJkd2FyZSBSYWRpbyBzdGF0dXMgaXMgT24KLQkJcEFkLT5TdGFDZmcuYlN3UmFkaW8gID0gVFJVRTsgLy8gRGVmYXVsdCBTb2Z0d2FyZSBSYWRpbyBzdGF0dXMgaXMgT24KLQkJcEFkLT5TdGFDZmcuYlJhZGlvICAgID0gVFJVRTsgLy8gYkh3UmFkaW8gJiYgYlN3UmFkaW8KLQkJcEFkLT5TdGFDZmcuYkhhcmR3YXJlUmFkaW8gPSBGQUxTRTsJCS8vIERlZmF1bHQgaXMgT0ZGCi0JCXBBZC0+U3RhQ2ZnLmJTaG93SGlkZGVuU1NJRCA9IEZBTFNFOwkJLy8gRGVmYXVsdCBubyBzaG93Ci0KLQkJLy8gTml0cm8gbW9kZSBjb250cm9sCisJCS8qIE5pdHJvIG1vZGUgY29udHJvbCAqLwogCQlwQWQtPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IFRSVUU7CiAKLQkJLy8gU2F2ZSB0aGUgaW5pdCB0aW1lIGFzIGxhc3Qgc2NhbiB0aW1lLCB0aGUgc3lzdGVtIHNob3VsZCBkbyBzY2FuIGFmdGVyIDIgc2Vjb25kcy4KLQkJLy8gVGhpcyBwYXRjaCBpcyBmb3IgZHJpdmVyIHdha2UgdXAgZnJvbSBzdGFuZGJ5IG1vZGUsIHN5c3RlbSB3aWxsIGRvIHNjYW4gcmlnaHQgYXdheS4KLQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gMDsKLQkJTmRpc1plcm9NZW1vcnkocEFkLT5uaWNrbmFtZSwgSVdfRVNTSURfTUFYX1NJWkUrMSk7Ci0JCXNwcmludGYocEFkLT5uaWNrbmFtZSwgIiVzIiwgU1RBX05JQ19ERVZJQ0VfTkFNRSk7Ci0JCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5TdGFDZmcuV3BhRGlzYXNzb2NBbmRCbG9ja0Fzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihXcGFEaXNhc3NvY0FwQW5kQmxvY2tBc3NvYyksIHBBZCwgRkFMU0UpOworCQkvKiBTYXZlIHRoZSBpbml0IHRpbWUgYXMgbGFzdCBzY2FuIHRpbWUsIHRoZSBzeXN0ZW0gc2hvdWxkIGRvIHNjYW4gYWZ0ZXIgMiBzZWNvbmRzLiAqLworCQkvKiBUaGlzIHBhdGNoIGlzIGZvciBkcml2ZXIgd2FrZSB1cCBmcm9tIHN0YW5kYnkgbW9kZSwgc3lzdGVtIHdpbGwgZG8gc2NhbiByaWdodCBhd2F5LiAqLworCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUpOworCQlpZiAocEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID4gMTAgKiBPU19IWikKKwkJCXBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSAtPSAoMTAgKiBPU19IWik7CisKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5uaWNrbmFtZSwgSVdfRVNTSURfTUFYX1NJWkUgKyAxKTsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkJc3ByaW50ZigoY2hhciAqKXBBZC0+bmlja25hbWUsICJSVDI4NjBTVEEiKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKyNpZmRlZiBSVE1QX01BQ19VU0IKKwkJc3ByaW50ZigoY2hhciAqKXBBZC0+bmlja25hbWUsICJSVDI4NzBTVEEiKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKwkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPlN0YUNmZy5XcGFEaXNhc3NvY0FuZEJsb2NrQXNzb2NUaW1lciwKKwkJCSAgICAgIEdFVF9USU1FUl9GVU5DVElPTihXcGFEaXNhc3NvY0FwQW5kQmxvY2tBc3NvYyksCisJCQkgICAgICBwQWQsIEZBTFNFKTsKIAkJcEFkLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7CiAJCXBBZC0+U3RhQ2ZnLklFRUU4MDIxeF9yZXF1aXJlZF9rZXlzID0gRkFMU0U7CiAJCXBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEU7CisJCXBBZC0+U3RhQ2ZnLmJSU05fSUVfRnJvbVdwYVN1cHBsaWNhbnQgPSBGQUxTRTsKIAkJcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFOworCisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIDgpOworCisJCXBBZC0+U3RhQ2ZnLmJBdXRvQ29ubmVjdEJ5QnNzaWQgPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuQmVhY29uTG9zdFRpbWUgPSBCRUFDT05fTE9TVF9USU1FOworCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5XcGFQYXNzUGhyYXNlLCA2NCk7CisJCXBBZC0+U3RhQ2ZnLldwYVBhc3NQaHJhc2VMZW4gPSAwOworCQlwQWQtPlN0YUNmZy5iQXV0b1JvYW1pbmcgPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuYkZvcmNlVHhCdXJzdCA9IEZBTFNFOwogCX0KIAotCS8vIERlZmF1bHQgZm9yIGV4dHJhIGluZm9ybWF0aW9uIGlzIG5vdCB2YWxpZAorCS8qIERlZmF1bHQgZm9yIGV4dHJhIGluZm9ybWF0aW9uIGlzIG5vdCB2YWxpZCAqLwogCXBBZC0+RXh0cmFJbmZvID0gRVhUUkFfSU5GT19DTEVBUjsKIAotCS8vIERlZmF1bHQgQ29uZmlnIGNoYW5nZSBmbGFnCisJLyogRGVmYXVsdCBDb25maWcgY2hhbmdlIGZsYWcgKi8KIAlwQWQtPmJDb25maWdDaGFuZ2VkID0gRkFMU0U7CiAKLQkvLwotCS8vIHBhcnQgSUlJLiBBUCBjb25maWd1cmF0aW9ucwotCS8vCisJLyogKi8KKwkvKiBwYXJ0IElJSS4gQVAgY29uZmlndXJhdGlvbnMgKi8KKwkvKiAqLwogCi0KLQkvLwotCS8vIHBhcnQgSVYuIG90aGVycwotCS8vCi0JLy8gZHluYW1pYyBCQlAgUjY2OnNlbnNpYml0eSB0dW5pbmcgdG8gb3ZlcmNvbWUgYmFja2dyb3VuZCBub2lzZQotCXBBZC0+QmJwVHVuaW5nLmJFbmFibGUgICAgICAgICAgICAgICAgPSBUUlVFOworCS8qICovCisJLyogcGFydCBJVi4gb3RoZXJzICovCisJLyogKi8KKwkvKiBkeW5hbWljIEJCUCBSNjY6c2Vuc2liaXR5IHR1bmluZyB0byBvdmVyY29tZSBiYWNrZ3JvdW5kIG5vaXNlICovCisJcEFkLT5CYnBUdW5pbmcuYkVuYWJsZSA9IFRSVUU7CiAJcEFkLT5CYnBUdW5pbmcuRmFsc2VDY2FMb3dlclRocmVzaG9sZCA9IDEwMDsKIAlwQWQtPkJicFR1bmluZy5GYWxzZUNjYVVwcGVyVGhyZXNob2xkID0gNTEyOwotCXBBZC0+QmJwVHVuaW5nLlI2NkRlbHRhICAgICAgICAgICAgICAgPSA0OworCXBBZC0+QmJwVHVuaW5nLlI2NkRlbHRhID0gNDsKIAlwQWQtPk1sbWUuYkVuYWJsZUF1dG9BbnRlbm5hQ2hlY2sgPSBUUlVFOwogCi0JLy8KLQkvLyBBbHNvIGluaXRpYWwgUjY2Q3VycmVudFZhbHVlLCBSVFVTQlJlc3VtZU1zZHVUcmFuc21pc3Npb24gbWlnaHQgdXNlIHRoaXMgdmFsdWUuCi0JLy8gaWYgbm90IGluaXRpYWwgdGhpcyB2YWx1ZSwgdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSAwLgotCS8vCisJLyogKi8KKwkvKiBBbHNvIGluaXRpYWwgUjY2Q3VycmVudFZhbHVlLCBSVFVTQlJlc3VtZU1zZHVUcmFuc21pc3Npb24gbWlnaHQgdXNlIHRoaXMgdmFsdWUuICovCisJLyogaWYgbm90IGluaXRpYWwgdGhpcyB2YWx1ZSwgdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSAwLiAqLworCS8qICovCiAJcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlID0gMHgzODsKIAogCXBBZC0+QmJwOTQgPSBCQlBSOTRfREVGQVVMVDsKIAlwQWQtPkJicEZvckNDSyA9IEZBTFNFOwogCi0JLy8gaW5pdGlhbGl6ZSBNQUMgdGFibGUgYW5kIGFsbG9jYXRlIHNwaW4gbG9jawotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1hY1RhYiwgc2l6ZW9mKE1BQ19UQUJMRSkpOworCS8qIERlZmF1bHQgaXMgRkFMU0UgZm9yIHRlc3QgYml0IDEgKi8KKwkvKnBBZC0+YlRlc3QxID0gRkFMU0U7ICovCisKKwkvKiBpbml0aWFsaXplIE1BQyB0YWJsZSBhbmQgYWxsb2NhdGUgc3BpbiBsb2NrICovCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWFjVGFiLCBzaXplb2Yoc3RydWN0IHJ0X21hY190YWJsZSkpOwogCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmcEFkLT5NYWNUYWIuTWNhc3RQc1F1ZXVlKTsKIAlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKIAorCS8qUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPlJFQ0JBVGltZXIsIFJFQ0JBVGltZXJUaW1lb3V0LCBwQWQsIFRSVUUpOyAqLworCS8qUlRNUFNldFRpbWVyKCZwQWQtPlJFQ0JBVGltZXIsIFJFT1JERVJfRVhFQ19JTlRWKTsgKi8KKwogCXBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCA9IEZBTFNFOwotI2lmZGVmIFJUMjg2MAorI2lmZGVmIFJUTVBfTUFDX1BDSQogCXBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCiAJUlRNUF9TRVRfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsKLSNlbmRpZgogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBVc2VyQ2ZnSW5pdFxuIikpOwogfQogCi0vLyBJUlFMID0gUEFTU0lWRV9MRVZFTAotVUNIQVIgQnRvSChjaGFyIGNoKQorLyogSVJRTCA9IFBBU1NJVkVfTEVWRUwgKi8KK3U4IEJ0b0goY2hhciBjaCkKIHsKLQlpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgcmV0dXJuIChjaCAtICcwJyk7ICAgICAgICAvLyBIYW5kbGUgbnVtZXJhbHMKLQlpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykgcmV0dXJuIChjaCAtICdBJyArIDB4QSk7ICAvLyBIYW5kbGUgY2FwaXRvbCBoZXggZGlnaXRzCi0JaWYgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpIHJldHVybiAoY2ggLSAnYScgKyAweEEpOyAgLy8gSGFuZGxlIHNtYWxsIGhleCBkaWdpdHMKLQlyZXR1cm4oMjU1KTsKKwlpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykKKwkJcmV0dXJuIChjaCAtICcwJyk7CS8qIEhhbmRsZSBudW1lcmFscyAqLworCWlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKQorCQlyZXR1cm4gKGNoIC0gJ0EnICsgMHhBKTsJLyogSGFuZGxlIGNhcGl0b2wgaGV4IGRpZ2l0cyAqLworCWlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKQorCQlyZXR1cm4gKGNoIC0gJ2EnICsgMHhBKTsJLyogSGFuZGxlIHNtYWxsIGhleCBkaWdpdHMgKi8KKwlyZXR1cm4gKDI1NSk7CiB9CiAKLS8vCi0vLyAgRlVOQ1RJT046IEF0b0goY2hhciAqLCBVQ0hBUiAqLCBpbnQpCi0vLwotLy8gIFBVUlBPU0U6ICBDb252ZXJ0cyBhc2NpaSBzdHJpbmcgdG8gbmV0d29yayBvcmRlciBoZXgKLS8vCi0vLyAgUEFSQU1FVEVSUzoKLS8vICAgIHNyYyAgICAtIHBvaW50ZXIgdG8gaW5wdXQgYXNjaWkgc3RyaW5nCi0vLyAgICBkZXN0ICAgLSBwb2ludGVyIHRvIG91dHB1dCBoZXgKLS8vICAgIGRlc3RsZW4gLSBzaXplIG9mIGRlc3QKLS8vCi0vLyAgQ09NTUVOVFM6Ci0vLwotLy8gICAgMiBhc2NpaSBieXRlcyBtYWtlIGEgaGV4IGJ5dGUgc28gbXVzdCBwdXQgMXN0IGFzY2lpIGJ5dGUgb2YgcGFpcgotLy8gICAgaW50byB1cHBlciBuaWJibGUgYW5kIDJuZCBhc2NpaSBieXRlIG9mIHBhaXIgaW50byBsb3dlciBuaWJibGUuCi0vLwotLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKKy8qICovCisvKiAgRlVOQ1RJT046IEF0b0goY2hhciAqLCB1OCAqLCBpbnQpICovCisvKiAqLworLyogIFBVUlBPU0U6ICBDb252ZXJ0cyBhc2NpaSBzdHJpbmcgdG8gbmV0d29yayBvcmRlciBoZXggKi8KKy8qICovCisvKiAgUEFSQU1FVEVSUzogKi8KKy8qICAgIHNyYyAgICAtIHBvaW50ZXIgdG8gaW5wdXQgYXNjaWkgc3RyaW5nICovCisvKiAgICBkZXN0ICAgLSBwb2ludGVyIHRvIG91dHB1dCBoZXggKi8KKy8qICAgIGRlc3RsZW4gLSBzaXplIG9mIGRlc3QgKi8KKy8qICovCisvKiAgQ09NTUVOVFM6ICovCisvKiAqLworLyogICAgMiBhc2NpaSBieXRlcyBtYWtlIGEgaGV4IGJ5dGUgc28gbXVzdCBwdXQgMXN0IGFzY2lpIGJ5dGUgb2YgcGFpciAqLworLyogICAgaW50byB1cHBlciBuaWJibGUgYW5kIDJuZCBhc2NpaSBieXRlIG9mIHBhaXIgaW50byBsb3dlciBuaWJibGUuICovCisvKiAqLworLyogSVJRTCA9IFBBU1NJVkVfTEVWRUwgKi8KIAotdm9pZCBBdG9IKGNoYXIgKiBzcmMsIFVDSEFSICogZGVzdCwgaW50IGRlc3RsZW4pCit2b2lkIEF0b0goY2hhciAqc3JjLCB1OCAqZGVzdCwgaW50IGRlc3RsZW4pCiB7Ci0JY2hhciAqIHNyY3B0cjsKLQlQVUNIQVIgZGVzdFRlbXA7CisJY2hhciAqc3JjcHRyOworCXU4ICpkZXN0VGVtcDsKIAogCXNyY3B0ciA9IHNyYzsKLQlkZXN0VGVtcCA9IChQVUNIQVIpIGRlc3Q7CisJZGVzdFRlbXAgPSAodTggKilkZXN0OwogCi0Jd2hpbGUoZGVzdGxlbi0tKQotCXsKLQkJKmRlc3RUZW1wID0gQnRvSCgqc3JjcHRyKyspIDw8IDQ7ICAgIC8vIFB1dCAxc3QgYXNjaWkgYnl0ZSBpbiB1cHBlciBuaWJibGUuCi0JCSpkZXN0VGVtcCArPSBCdG9IKCpzcmNwdHIrKyk7ICAgICAgLy8gQWRkIDJuZCBhc2NpaSBieXRlIHRvIGFib3ZlLgorCXdoaWxlIChkZXN0bGVuLS0pIHsKKwkJKmRlc3RUZW1wID0gQnRvSCgqc3JjcHRyKyspIDw8IDQ7CS8qIFB1dCAxc3QgYXNjaWkgYnl0ZSBpbiB1cHBlciBuaWJibGUuICovCisJCSpkZXN0VGVtcCArPSBCdG9IKCpzcmNwdHIrKyk7CS8qIEFkZCAybmQgYXNjaWkgYnl0ZSB0byBhYm92ZS4gKi8KIAkJZGVzdFRlbXArKzsKIAl9CiB9CiAKLVZPSUQJUlRNUFBhdGNoTWFjQmJwQnVnKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCVVMT05HCUluZGV4OwotCi0JLy8gSW5pdGlhbGl6ZSBCQlAgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQotCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9CQlBfUkVHX1BBUk1TOyBJbmRleCsrKQotCXsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUFJlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgKFVDSEFSKUJCUFJlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7Ci0JfQotCi0JLy8gSW5pdGlhbGl6ZSBSRiByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlCi0JQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0KLQkvLyBSZS1pbml0IEJCUCByZWdpc3RlciBmcm9tIEVFUFJPTSB2YWx1ZQotCU5JQ0luaXRBc2ljRnJvbUVFUFJPTShwQWQpOwotfQorLyorKytNYXJrIGJ5IHNoaWFuZywgbm90IHVzZSBub3csIG5lZWQgdG8gcmVtb3ZlIGFmdGVyIGNvbmZpcm0gKi8KKy8qLS0tTWFyayBieSBzaGlhbmcsIG5vdCB1c2Ugbm93LCBuZWVkIHRvIHJlbW92ZSBhZnRlciBjb25maXJtICovCiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0zNjE4LDI5ICsyODc1LDI2IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUTVBJbml0VGltZXIoCi0JSU4JUFJUTVBfQURBUFRFUgkJCXBBZCwKLQlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCi0JSU4JUFZPSUQJCQkJCXBUaW1lckZ1bmMsCi0JSU4JUFZPSUQJCQkJCXBEYXRhLAotCUlOCUJPT0xFQU4JCQkJCVJlcGVhdCkKK3ZvaWQgUlRNUEluaXRUaW1lcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgIHN0cnVjdCBydF9yYWxpbmtfdGltZXIgKnBUaW1lciwKKwkJICAgdm9pZCAqcFRpbWVyRnVuYywgdm9pZCAqcERhdGEsIElOIEJPT0xFQU4gUmVwZWF0KQogewotCS8vCi0JLy8gU2V0IFZhbGlkIHRvIFRSVUUgZm9yIGxhdGVyIHVzZWQuCi0JLy8gSXQgd2lsbCBjcmFzaCBpZiB3ZSBjYW5jZWwgYSB0aW1lciBvciBzZXQgYSB0aW1lcgotCS8vIHRoYXQgd2UgaGF2ZW4ndCBpbml0aWFsaXplIGJlZm9yZS4KLQkvLwotCXBUaW1lci0+VmFsaWQgICAgICA9IFRSVUU7CisJLyogKi8KKwkvKiBTZXQgVmFsaWQgdG8gVFJVRSBmb3IgbGF0ZXIgdXNlZC4gKi8KKwkvKiBJdCB3aWxsIGNyYXNoIGlmIHdlIGNhbmNlbCBhIHRpbWVyIG9yIHNldCBhIHRpbWVyICovCisJLyogdGhhdCB3ZSBoYXZlbid0IGluaXRpYWxpemUgYmVmb3JlLiAqLworCS8qICovCisJcFRpbWVyLT5WYWxpZCA9IFRSVUU7CiAKIAlwVGltZXItPlBlcmlvZGljVHlwZSA9IFJlcGVhdDsKLQlwVGltZXItPlN0YXRlICAgICAgPSBGQUxTRTsKLQlwVGltZXItPmNvb2tpZSA9IChVTE9ORykgcERhdGE7CisJcFRpbWVyLT5TdGF0ZSA9IEZBTFNFOworCXBUaW1lci0+Y29va2llID0gKHVuc2lnbmVkIGxvbmcpcERhdGE7CiAKLSNpZmRlZiBSVDI4NzAKKyNpZmRlZiBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVAogCXBUaW1lci0+cEFkID0gcEFkOwotI2VuZGlmIC8vIFJUMjg3MCAvLworI2VuZGlmIC8qIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUIC8vICovCiAKLQlSVE1QX09TX0luaXRfVGltZXIocEFkLAkmcFRpbWVyLT5UaW1lck9iaiwJcFRpbWVyRnVuYywgKFBWT0lEKSBwVGltZXIpOworCVJUTVBfT1NfSW5pdF9UaW1lcihwQWQsICZwVGltZXItPlRpbWVyT2JqLCBwVGltZXJGdW5jLCAodm9pZCAqKXBUaW1lcik7CiB9CiAKIC8qCkBAIC0zNjYxLDMyICsyOTE1LDIzIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUTVBTZXRUaW1lcigKLQlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCi0JSU4JVUxPTkcJCQkJCVZhbHVlKQordm9pZCBSVE1QU2V0VGltZXIoc3RydWN0IHJ0X3JhbGlua190aW1lciAqcFRpbWVyLCB1bnNpZ25lZCBsb25nIFZhbHVlKQogewotCWlmIChwVGltZXItPlZhbGlkKQotCXsKKwlpZiAocFRpbWVyLT5WYWxpZCkgewogCQlwVGltZXItPlRpbWVyVmFsdWUgPSBWYWx1ZTsKLQkJcFRpbWVyLT5TdGF0ZSAgICAgID0gRkFMU0U7Ci0JCWlmIChwVGltZXItPlBlcmlvZGljVHlwZSA9PSBUUlVFKQotCQl7CisJCXBUaW1lci0+U3RhdGUgPSBGQUxTRTsKKwkJaWYgKHBUaW1lci0+UGVyaW9kaWNUeXBlID09IFRSVUUpIHsKIAkJCXBUaW1lci0+UmVwZWF0ID0gVFJVRTsKIAkJCVJUTVBfU2V0UGVyaW9kaWNUaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgVmFsdWUpOwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJcFRpbWVyLT5SZXBlYXQgPSBGQUxTRTsKIAkJCVJUTVBfT1NfQWRkX1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBWYWx1ZSk7CiAJCX0KLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlEQkdQUklOVF9FUlIoKCJSVE1QU2V0VGltZXIgZmFpbGVkLCBUaW1lciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplIVxuIikpOwogCX0KIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0zNzA1LDI4ICsyOTUwLDIwIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUTVBNb2RUaW1lcigKLQlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCi0JSU4JVUxPTkcJCQkJCVZhbHVlKQordm9pZCBSVE1QTW9kVGltZXIoc3RydWN0IHJ0X3JhbGlua190aW1lciAqcFRpbWVyLCB1bnNpZ25lZCBsb25nIFZhbHVlKQogewotCUJPT0xFQU4JQ2FuY2VsOworCUJPT0xFQU4gQ2FuY2VsOwogCi0JaWYgKHBUaW1lci0+VmFsaWQpCi0JeworCWlmIChwVGltZXItPlZhbGlkKSB7CiAJCXBUaW1lci0+VGltZXJWYWx1ZSA9IFZhbHVlOwotCQlwVGltZXItPlN0YXRlICAgICAgPSBGQUxTRTsKLQkJaWYgKHBUaW1lci0+UGVyaW9kaWNUeXBlID09IFRSVUUpCi0JCXsKKwkJcFRpbWVyLT5TdGF0ZSA9IEZBTFNFOworCQlpZiAocFRpbWVyLT5QZXJpb2RpY1R5cGUgPT0gVFJVRSkgewogCQkJUlRNUENhbmNlbFRpbWVyKHBUaW1lciwgJkNhbmNlbCk7CiAJCQlSVE1QU2V0VGltZXIocFRpbWVyLCBWYWx1ZSk7Ci0JCX0KLQkJZWxzZQotCQl7CisJCX0gZWxzZSB7CiAJCQlSVE1QX09TX01vZF9UaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgVmFsdWUpOwogCQl9Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJREJHUFJJTlRfRVJSKCgiUlRNUE1vZFRpbWVyIGZhaWxlZCwgVGltZXIgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZSFcbiIpKTsKIAl9CiB9CkBAIC0zNzUyLDMyICsyOTg5LDIzIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUTVBDYW5jZWxUaW1lcigKLQlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCi0JT1VUCUJPT0xFQU4JCQkJCSpwQ2FuY2VsbGVkKQordm9pZCBSVE1QQ2FuY2VsVGltZXIoc3RydWN0IHJ0X3JhbGlua190aW1lciAqcFRpbWVyLCBPVVQgQk9PTEVBTiAqIHBDYW5jZWxsZWQpCiB7Ci0JaWYgKHBUaW1lci0+VmFsaWQpCi0JeworCWlmIChwVGltZXItPlZhbGlkKSB7CiAJCWlmIChwVGltZXItPlN0YXRlID09IEZBTFNFKQogCQkJcFRpbWVyLT5SZXBlYXQgPSBGQUxTRTsKLQkJCVJUTVBfT1NfRGVsX1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBwQ2FuY2VsbGVkKTsKKworCQlSVE1QX09TX0RlbF9UaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgcENhbmNlbGxlZCk7CiAKIAkJaWYgKCpwQ2FuY2VsbGVkID09IFRSVUUpCiAJCQlwVGltZXItPlN0YXRlID0gVFJVRTsKIAotI2lmZGVmIFJUMjg3MAotCQkvLyBXZSBuZWVkIHRvIGdvLXRocm91Z2ggdGhlIFRpbWVyUSB0byBmaW5kb3V0IHRoaXMgdGltZXIgaGFuZGxlciBhbmQgcmVtb3ZlIGl0IGlmCi0JCS8vCQlpdCdzIHN0aWxsIHdhaXRpbmcgZm9yIGV4ZWN1dGlvbi4KLQotCQlSVDI4NzBfVGltZXJRX1JlbW92ZShwVGltZXItPnBBZCwgcFRpbWVyKTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQl9Ci0JZWxzZQotCXsKLQkJLy8KLQkJLy8gTmRpc01DYW5jZWxUaW1lciBqdXN0IGNhbmNlZCB0aGUgdGltZXIgYW5kIG5vdCBtZWFuIHJlbGVhc2UgdGhlIHRpbWVyLgotCQkvLyBBbmQgZG9uJ3Qgc2V0IHRoZSAiVmFsaWQiIHRvIEZhbHNlLiBTbyB0aGF0IHdlIGNhbiB1c2UgdGhpcyB0aW1lciBhZ2Fpbi4KLQkJLy8KKyNpZmRlZiBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVAorCQkvKiBXZSBuZWVkIHRvIGdvLXRocm91Z2ggdGhlIFRpbWVyUSB0byBmaW5kb3V0IHRoaXMgdGltZXIgaGFuZGxlciBhbmQgcmVtb3ZlIGl0IGlmICovCisJCS8qICAgICAgICAgICAgICBpdCdzIHN0aWxsIHdhaXRpbmcgZm9yIGV4ZWN1dGlvbi4gKi8KKwkJUnRtcFRpbWVyUVJlbW92ZShwVGltZXItPnBBZCwgcFRpbWVyKTsKKyNlbmRpZiAvKiBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVCAvLyAqLworCX0gZWxzZSB7CiAJCURCR1BSSU5UX0VSUigoIlJUTVBDYW5jZWxUaW1lciBmYWlsZWQsIFRpbWVyIGhhc24ndCBiZWVuIGluaXRpYWxpemUhXG4iKSk7CiAJfQogfQpAQCAtMzgwMiw2NCArMzAzMCw2NCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBSVE1QU2V0TEVEKAotCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKLQlJTiBVQ0hBUgkJCVN0YXR1cykKK3ZvaWQgUlRNUFNldExFRChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IFN0YXR1cykKIHsKLQkvL1VMT05HCQkJZGF0YTsKLQlVQ0hBUgkJCUhpZ2hCeXRlID0gMDsKLQlVQ0hBUgkJCUxvd0J5dGU7CisJLyp1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICBkYXRhOyAqLworCXU4IEhpZ2hCeXRlID0gMDsKKwl1OCBMb3dCeXRlOwogCi0JTG93Qnl0ZSA9IHBBZC0+TGVkQ250bC5maWVsZC5MZWRNb2RlJjB4N2Y7Ci0Jc3dpdGNoIChTdGF0dXMpCi0JewotCQljYXNlIExFRF9MSU5LX0RPV046Ci0JCQlIaWdoQnl0ZSA9IDB4MjA7Ci0JCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKLQkJCXBBZC0+TGVkSW5kaWNhdG9yU3RyZWd0aCA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSBMRURfTElOS19VUDoKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCi0JCQkJSGlnaEJ5dGUgPSAweGEwOwotCQkJZWxzZQotCQkJCUhpZ2hCeXRlID0gMHg2MDsKLQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTEVEX1JBRElPX09OOgotCQkJSGlnaEJ5dGUgPSAweDIwOwotCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBMRURfSEFMVDoKLQkJCUxvd0J5dGUgPSAwOyAvLyBEcml2ZXIgc2V0cyBNQUMgcmVnaXN0ZXIgYW5kIE1BQyBjb250cm9scyBMRUQKLQkJY2FzZSBMRURfUkFESU9fT0ZGOgotCQkJSGlnaEJ5dGUgPSAwOwotCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7Ci0JCQlicmVhazsKLSAgICAgICAgY2FzZSBMRURfV1BTOgotCQkJSGlnaEJ5dGUgPSAweDEwOwotCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBMRURfT05fU0lURV9TVVJWRVk6Ci0JCQlIaWdoQnl0ZSA9IDB4MDg7Ci0JCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKLQkJCWJyZWFrOwotCQljYXNlIExFRF9QT1dFUl9VUDoKLQkJCUhpZ2hCeXRlID0gMHgwNDsKLQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlJUTVBTZXRMRUQ6OlVua25vd24gU3RhdHVzICVkXG4iLCBTdGF0dXMpKTsKLQkJCWJyZWFrOworCUxvd0J5dGUgPSBwQWQtPkxlZENudGwuZmllbGQuTGVkTW9kZSAmIDB4N2Y7CisJc3dpdGNoIChTdGF0dXMpIHsKKwljYXNlIExFRF9MSU5LX0RPV046CisJCUhpZ2hCeXRlID0gMHgyMDsKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7CisJCXBBZC0+TGVkSW5kaWNhdG9yU3RyZW5ndGggPSAwOworCQlicmVhazsKKwljYXNlIExFRF9MSU5LX1VQOgorCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorCQkJSGlnaEJ5dGUgPSAweGEwOworCQllbHNlCisJCQlIaWdoQnl0ZSA9IDB4NjA7CisJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOworCQlicmVhazsKKwljYXNlIExFRF9SQURJT19PTjoKKwkJSGlnaEJ5dGUgPSAweDIwOworCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJYnJlYWs7CisJY2FzZSBMRURfSEFMVDoKKwkJTG93Qnl0ZSA9IDA7CS8qIERyaXZlciBzZXRzIE1BQyByZWdpc3RlciBhbmQgTUFDIGNvbnRyb2xzIExFRCAqLworCWNhc2UgTEVEX1JBRElPX09GRjoKKwkJSGlnaEJ5dGUgPSAwOworCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJYnJlYWs7CisJY2FzZSBMRURfV1BTOgorCQlIaWdoQnl0ZSA9IDB4MTA7CisJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOworCQlicmVhazsKKwljYXNlIExFRF9PTl9TSVRFX1NVUlZFWToKKwkJSGlnaEJ5dGUgPSAweDA4OworCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJYnJlYWs7CisJY2FzZSBMRURfUE9XRVJfVVA6CisJCUhpZ2hCeXRlID0gMHgwNDsKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sCisJCQkgKCJSVE1QU2V0TEVEOjpVbmtub3duIFN0YXR1cyAlZFxuIiwgU3RhdHVzKSk7CisJCWJyZWFrOwogCX0KIAotICAgIC8vCi0JLy8gS2VlcCBMRUQgc3RhdHVzIGZvciBMRUQgU2l0ZVN1cnZleSBtb2RlLgotCS8vIEFmdGVyIFNpdGVTdXJ2ZXksIHdlIHdpbGwgc2V0IHRoZSBMRUQgbW9kZSB0byBwcmV2aW91cyBzdGF0dXMuCi0JLy8KKwkvKiAqLworCS8qIEtlZXAgTEVEIHN0YXR1cyBmb3IgTEVEIFNpdGVTdXJ2ZXkgbW9kZS4gKi8KKwkvKiBBZnRlciBTaXRlU3VydmV5LCB3ZSB3aWxsIHNldCB0aGUgTEVEIG1vZGUgdG8gcHJldmlvdXMgc3RhdHVzLiAqLworCS8qICovCiAJaWYgKChTdGF0dXMgIT0gTEVEX09OX1NJVEVfU1VSVkVZKSAmJiAoU3RhdHVzICE9IExFRF9QT1dFUl9VUCkpCiAJCXBBZC0+TGVkU3RhdHVzID0gU3RhdHVzOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNldExFRDo6TW9kZT0lZCxIaWdoQnl0ZT0weCUwMngsTG93Qnl0ZT0weCUwMnhcbiIsIHBBZC0+TGVkQ250bC5maWVsZC5MZWRNb2RlLCBIaWdoQnl0ZSwgTG93Qnl0ZSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJSVE1QU2V0TEVEOjpNb2RlPSVkLEhpZ2hCeXRlPTB4JTAyeCxMb3dCeXRlPTB4JTAyeFxuIiwKKwkJICBwQWQtPkxlZENudGwuZmllbGQuTGVkTW9kZSwgSGlnaEJ5dGUsIExvd0J5dGUpKTsKIH0KIAogLyoKQEAgLTM4ODksNDAgKzMxMTcsMzIgQEAKIAkJID4gLTU3ICBFeGNlbGxlbnQKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIFJUTVBTZXRTaWduYWxMRUQoCi0JSU4gUFJUTVBfQURBUFRFUiAJcEFkLAotCUlOIE5ESVNfODAyXzExX1JTU0kgRGJtKQordm9pZCBSVE1QU2V0U2lnbmFsTEVEKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgSU4gTkRJU184MDJfMTFfUlNTSSBEYm0pCiB7Ci0JVUNIQVIJCW5MZWQgPSAwOworCXU4IG5MZWQgPSAwOwogCi0JLy8KLQkvLyBpZiBub3QgU2lnbmFsIFN0cmVndGgsIHRoZW4gZG8gbm90aGluZy4KLQkvLwotCWlmIChwQWQtPkxlZENudGwuZmllbGQuTGVkTW9kZSAhPSBMRURfTU9ERV9TSUdOQUxfU1RSRUdUSCkKLQl7Ci0JCXJldHVybjsKLQl9CisJaWYgKHBBZC0+TGVkQ250bC5maWVsZC5MZWRNb2RlID09IExFRF9NT0RFX1NJR05BTF9TVFJFR1RIKSB7CisJCWlmIChEYm0gPD0gLTkwKQorCQkJbkxlZCA9IDA7CisJCWVsc2UgaWYgKERibSA8PSAtODEpCisJCQluTGVkID0gMTsKKwkJZWxzZSBpZiAoRGJtIDw9IC03MSkKKwkJCW5MZWQgPSAzOworCQllbHNlIGlmIChEYm0gPD0gLTY3KQorCQkJbkxlZCA9IDc7CisJCWVsc2UgaWYgKERibSA8PSAtNTcpCisJCQluTGVkID0gMTU7CisJCWVsc2UKKwkJCW5MZWQgPSAzMTsKIAotCWlmIChEYm0gPD0gLTkwKQotCQluTGVkID0gMDsKLQllbHNlIGlmIChEYm0gPD0gLTgxKQotCQluTGVkID0gMTsKLQllbHNlIGlmIChEYm0gPD0gLTcxKQotCQluTGVkID0gMzsKLQllbHNlIGlmIChEYm0gPD0gLTY3KQotCQluTGVkID0gNzsKLQllbHNlIGlmIChEYm0gPD0gLTU3KQotCQluTGVkID0gMTU7Ci0JZWxzZQotCQluTGVkID0gMzE7Ci0KLQkvLwotCS8vIFVwZGF0ZSBTaWduYWwgU3RyZWd0aCB0byBmaXJtd2FyZSBpZiBjaGFuZ2VkLgotCS8vCi0JaWYgKHBBZC0+TGVkSW5kaWNhdG9yU3RyZWd0aCAhPSBuTGVkKQotCXsKLQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUxLCAweGZmLCBuTGVkLCBwQWQtPkxlZENudGwuZmllbGQuUG9sYXJpdHkpOwotCQlwQWQtPkxlZEluZGljYXRvclN0cmVndGggPSBuTGVkOworCQkvKiAqLworCQkvKiBVcGRhdGUgU2lnbmFsIFN0cmVndGggdG8gZmlybXdhcmUgaWYgY2hhbmdlZC4gKi8KKwkJLyogKi8KKwkJaWYgKHBBZC0+TGVkSW5kaWNhdG9yU3RyZW5ndGggIT0gbkxlZCkgeworCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUxLCAweGZmLCBuTGVkLAorCQkJCQkgICAgIHBBZC0+TGVkQ250bC5maWVsZC5Qb2xhcml0eSk7CisJCQlwQWQtPkxlZEluZGljYXRvclN0cmVuZ3RoID0gbkxlZDsKKwkJfQogCX0KIH0KIApAQCAtMzk0NCwyOSArMzE2NCwzOTQgQEAKIAkJQmVmb3JlIEVuYWJsZSBSWCwgbWFrZSBzdXJlIHlvdSBoYXZlIGVuYWJsZWQgSW50ZXJydXB0LgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgUlRNUEVuYWJsZVJ4VHgoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpCit2b2lkIFJUTVBFbmFibGVSeFR4KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKKy8qICAgICAgV1BETUFfR0xPX0NGR19TVFJVQyAgICAgR2xvQ2ZnOyAqLworLyogICAgICB1bnNpZ25lZCBsb25nICAgaSA9IDA7ICovCisJdTMyIHJ4X2ZpbHRlcl9mbGFnOworCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFJUTVBFbmFibGVSeFR4XG4iKSk7CiAKLQkvLyBFbmFibGUgUnggRE1BLgorCS8qIEVuYWJsZSBSeCBETUEuICovCiAJUlQyOFhYRE1BRW5hYmxlKHBBZCk7CiAKLQkvLyBlbmFibGUgUlggb2YgTUFDIGJsb2NrCi0JaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKLQl7Ci0JCVVJTlQzMiByeF9maWx0ZXJfZmxhZyA9IEFQTk9STUFMOworCS8qIGVuYWJsZSBSWCBvZiBNQUMgYmxvY2sgKi8KKwlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKSB7CisJCXJ4X2ZpbHRlcl9mbGFnID0gQVBOT1JNQUw7CiAKLQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9GSUxUUl9DRkcsIHJ4X2ZpbHRlcl9mbGFnKTsgICAgIC8vIGVuYWJsZSBSWCBvZiBETUEgYmxvY2sKLQl9Ci0JZWxzZQotCXsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCBTVEFOT1JNQUwpOyAgICAgLy8gU3RhaW9uIG5vdCBkcm9wIGNvbnRyb2wgZnJhbWUgd2lsbCBmYWlsIFdpRmkgQ2VydGlmaWNhdGlvbi4KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCByeF9maWx0ZXJfZmxhZyk7CS8qIGVuYWJsZSBSWCBvZiBETUEgYmxvY2sgKi8KKwl9IGVsc2UgeworCQlpZiAocEFkLT5Db21tb25DZmcuUFNQWGxpbmspCisJCQlyeF9maWx0ZXJfZmxhZyA9IFBTUFhMSU5LOworCQllbHNlCisJCQlyeF9maWx0ZXJfZmxhZyA9IFNUQU5PUk1BTDsJLyogU3RhaW9uIG5vdCBkcm9wIGNvbnRyb2wgZnJhbWUgd2lsbCBmYWlsIFdpRmkgQ2VydGlmaWNhdGlvbi4gKi8KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCByeF9maWx0ZXJfZmxhZyk7CiAJfQogCiAJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweGMpOwogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBSVE1QRW5hYmxlUnhUeFxuIikpOwogfQogCisvKisrK0FkZCBieSBzaGlhbmcsIG1vdmUgZnJvbSBvcy9saW51eC9ydF9tYWluX2Rldi5jICovCit2b2lkIENmZ0luaXRIb29rKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlwQWQtPmJCcm9hZENvbUhUID0gVFJVRTsKK30KIAoraW50IHJ0Mjh4eF9pbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJY2hhciAqcERlZmF1bHRNYWMsIGNoYXIgKnBIb3N0TmFtZSkKK3sKKwl1MzIgaW5kZXg7CisJdTggVG1wUGh5OworCWludCBTdGF0dXM7CisJdTMyIE1hY0NzcjAgPSAwOworCisjaWZkZWYgUlRNUF9NQUNfUENJCisJeworCQkvKiBJZiBkaXJ2ZXIgZG9lc24ndCB3YWtlIHVwIGZpcm13YXJlIGhlcmUsICovCisJCS8qIE5JQ0xvYWRGaXJtd2FyZSB3aWxsIGhhbmcgZm9yZXZlciB3aGVuIGludGVyZmFjZSBpcyB1cCBhZ2Fpbi4gKi8KKwkJLyogUlQyODYwIFBDSSAqLworCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSAmJgorCQkgICAgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpIHsKKwkJCUFVVE9fV0FLRVVQX1NUUlVDIEF1dG9XYWtldXBDZmc7CisJCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKKwkJCUF1dG9XYWtldXBDZmcud29yZCA9IDA7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsCisJCQkJCUF1dG9XYWtldXBDZmcud29yZCk7CisJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKworCS8qIHJlc2V0IEFkYXB0ZXIgZmxhZ3MgKi8KKwlSVE1QX0NMRUFSX0ZMQUdTKHBBZCk7CisKKwkvKiBJbml0IEJzc1RhYiAmIENoYW5uZWxJbmZvIHRhYmJsZXMgZm9yIGF1dG8gY2hhbm5lbCBzZWxlY3QuICovCisKKwkvKiBBbGxvY2F0ZSBCQSBSZW9yZGVyaW5nIG1lbW9yeSAqLworCWJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfaW5pdChwQWQsIE1BWF9SRU9SREVSSU5HX01QRFVfTlVNKTsKKworCS8qIE1ha2Ugc3VyZSBNQUMgZ2V0cyByZWFkeS4gKi8KKwlpbmRleCA9IDA7CisJZG8geworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19DU1IwLCAmTWFjQ3NyMCk7CisJCXBBZC0+TUFDVmVyc2lvbiA9IE1hY0NzcjA7CisKKwkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gIT0gMHgwMCkKKwkJICAgICYmIChwQWQtPk1BQ1ZlcnNpb24gIT0gMHhGRkZGRkZGRikpCisJCQlicmVhazsKKworCQlSVE1QdXNlY0RlbGF5KDEwKTsKKwl9IHdoaWxlIChpbmRleCsrIDwgMTAwKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiTUFDX0NTUjAgIFsgVmVyOlJldj0weCUwOHhdXG4iLCBwQWQtPk1BQ1ZlcnNpb24pKTsKKworI2lmZGVmIFJUTVBfTUFDX1BDSQorI2lmZGVmIFBDSUVfUFNfU1VQUE9SVAorCS8qSXZlcnNvbiBwYXRjaCBQQ0lFIEwxIGlzc3VlIHRvIG1ha2Ugc3VyZSB0aGF0IGRyaXZlciBjYW4gYmUgcmVhZCx3cml0ZSAsQkJQIGFuZCBSRiByZWdpc3RlciAgYXQgcGNpZSBMLjEgbGV2ZWwgKi8KKwlpZiAoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKQorCSAgICAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkgeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEFVWF9DVFJMLCAmTWFjQ3NyMCk7CisJCU1hY0NzcjAgfD0gMHg0MDI7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVWF9DVFJMLCBNYWNDc3IwKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVYX0NUUkwgPSAweCV4XG4iLCBNYWNDc3IwKSk7CisJfQorI2VuZGlmIC8qIFBDSUVfUFNfU1VQUE9SVCAvLyAqLworCisJLyogVG8gZml4IGRyaXZlciBkaXNhYmxlL2VuYWJsZSBoYW5nIGlzc3VlIHdoZW4gcmFkaW8gb2ZmICovCisJUlRNUF9JT19XUklURTMyKHBBZCwgUFdSX1BJTl9DRkcsIDB4Mik7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisKKwkvKiBEaXNhYmxlIERNQSAqLworCVJUMjhYWERNQURpc2FibGUocEFkKTsKKworCS8qIExvYWQgODA1MSBmaXJtd2FyZSAqLworCVN0YXR1cyA9IE5JQ0xvYWRGaXJtd2FyZShwQWQpOworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQlEQkdQUklOVF9FUlIoKCJOSUNMb2FkRmlybXdhcmUgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsCisJCQkgICAgICBTdGF0dXMpKTsKKwkJZ290byBlcnIxOworCX0KKworCU5JQ0xvYWRSYXRlU3dpdGNoaW5nUGFyYW1zKHBBZCk7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgaGVyZSB3aGljaCBpcyBhcyBzb29uIGFzIHBvc3NpYmxlICovCisJLyogVGhpcyBzdGF0ZW1lbnQgc2hvdWxkIG5ldmVyIGJlIHRydWUuIFdlIG1pZ2h0IGNvbnNpZGVyIHRvIHJlbW92ZSBpdCBsYXRlciAqLworI2lmZGVmIFJUTVBfTUFDX1BDSQorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSkpIHsKKwkJUlRNUF9BU0lDX0lOVEVSUlVQVF9ESVNBQkxFKHBBZCk7CisJfQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCisJU3RhdHVzID0gUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnkocEFkKTsKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJREJHUFJJTlRfRVJSKCgiUlRNUEFsbG9jRE1BTWVtb3J5IGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLAorCQkJICAgICAgU3RhdHVzKSk7CisJCWdvdG8gZXJyMTsKKwl9CisKKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKTsKKworCS8qIGluaXRpYWxpemUgTUxNRSAqLworCS8qICovCisKKwlTdGF0dXMgPSBSdG1wTWdtdFRhc2tJbml0KHBBZCk7CisJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlnb3RvIGVycjI7CisKKwlTdGF0dXMgPSBNbG1lSW5pdChwQWQpOworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQlEQkdQUklOVF9FUlIoKCJNbG1lSW5pdCBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7CisJCWdvdG8gZXJyMjsKKwl9CisJLyogSW5pdGlhbGl6ZSBwQWQtPlN0YUNmZywgcEFkLT5BcENmZywgcEFkLT5Db21tb25DZmcgdG8gbWFudWZhY3R1cmUgZGVmYXVsdCAqLworCS8qICovCisJVXNlckNmZ0luaXQocEFkKTsKKwlTdGF0dXMgPSBSdG1wTmV0VGFza0luaXQocEFkKTsKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gZXJyMzsKKworLyogICAgICBDT1BZX01BQ19BRERSKHBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5Cc3NpZCwgbmV0aWYtPmh3YWRkcik7ICovCisvKiAgICAgIHBBZC0+YkZvcmNlUHJpbnRUWCA9IFRSVUU7ICovCisKKwlDZmdJbml0SG9vayhwQWQpOworCisJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisKKwlNZWFzdXJlUmVxVGFiSW5pdChwQWQpOworCVRwY1JlcVRhYkluaXQocEFkKTsKKworCS8qICovCisJLyogSW5pdCB0aGUgaGFyZHdhcmUsIHdlIG5lZWQgdG8gaW5pdCBhc2ljIGJlZm9yZSByZWFkIHJlZ2lzdHJ5LCBvdGhlcndpc2UgbWFjIHJlZ2lzdGVyIHdpbGwgYmUgcmVzZXQgKi8KKwkvKiAqLworCVN0YXR1cyA9IE5JQ0luaXRpYWxpemVBZGFwdGVyKHBBZCwgVFJVRSk7CisJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCURCR1BSSU5UX0VSUigoIk5JQ0luaXRpYWxpemVBZGFwdGVyIGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLAorCQkJICAgICAgU3RhdHVzKSk7CisJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCWdvdG8gZXJyMzsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiMS4gUGh5IE1vZGUgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSkpOworCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJcEFkLT5Db21tb25DZmcuYk11bHRpcGxlSVJQID0gRkFMU0U7CisKKwlpZiAocEFkLT5Db21tb25DZmcuYk11bHRpcGxlSVJQKQorCQlwQWQtPkNvbW1vbkNmZy5OdW1PZkJ1bGtJbklSUCA9IFJYX1JJTkdfU0laRTsKKwllbHNlCisJCXBBZC0+Q29tbW9uQ2ZnLk51bU9mQnVsa0luSVJQID0gMTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKworCS8qSW5pdCBCYSBDYXBhYmlsaXR5IHBhcmFtZXRlcnMuICovCisvKiAgICAgIFJUMjhYWF9CQV9JTklUKHBBZCk7ICovCisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0KKwkgICAgKHU4KXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eTsKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgPQorCSAgICAodTE2KXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZTsKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplID0KKwkgICAgKHUxNilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOworCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMgPQorCSAgICAodTE2KXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZTsKKwkvKiBVUGRhdGEgdG8gSFQgSUUgKi8KKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9CisJICAgICh1MTYpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlOworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0KKwkgICAgKHUxNilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHkgPQorCSAgICAodTgpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5OworCisJLyogYWZ0ZXIgcmVhZGluZyBSZWdpc3RyeSwgd2Ugbm93IGtub3cgaWYgaW4gQVAgbW9kZSBvciBTVEEgbW9kZSAqLworCisJLyogTG9hZCA4MDUxIGZpcm13YXJlOyBjcmFzaCB3aGVuIEZXIGltYWdlIG5vdCBleGlzdGVudCAqLworCS8qIFN0YXR1cyA9IE5JQ0xvYWRGaXJtd2FyZShwQWQpOyAqLworCS8qIGlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgKi8KKwkvKiAgICBicmVhazsgKi8KKworCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIyLiBQaHkgTW9kZSA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKSk7CisKKwkvKiBXZSBzaG91bGQgcmVhZCBFRVBST00gZm9yIGFsbCBjYXNlcy4gIHJ0Mjg2MGIgKi8KKwlOSUNSZWFkRUVQUk9NUGFyYW1ldGVycyhwQWQsICh1OCAqKXBEZWZhdWx0TWFjKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIzLiBQaHkgTW9kZSA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKSk7CisKKwlOSUNJbml0QXNpY0Zyb21FRVBST00ocEFkKTsJLypydDI4NjBiICovCisKKwkvKiBTZXQgUEhZIHRvIGFwcHJvcHJpYXRlIG1vZGUgKi8KKwlUbXBQaHkgPSBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlOworCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSAweGZmOworCVJUTVBTZXRQaHlNb2RlKHBBZCwgVG1wUGh5KTsKKwlTZXRDb21tb25IVChwQWQpOworCisJLyogTm8gdmFsaWQgY2hhbm5lbHMuICovCisJaWYgKHBBZC0+Q2hhbm5lbExpc3ROdW0gPT0gMCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIldyb25nIGNvbmZpZ3VyYXRpb24uIE5vIHZhbGlkIGNoYW5uZWwgZm91bmQuIENoZWNrIFwiQ29udHJ5Q29kZVwiIGFuZCBcIkNoYW5uZWxHZW9ncmFwaHlcIiBzZXR0aW5nLlxuIikpOworCQlnb3RvIGVycjQ7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfT0ZGLAorCQkgKCJNQ1MgU2V0ID0gJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkgIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0sCisJCSAgcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSwKKwkJICBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzJdLAorCQkgIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbM10sCisJCSAgcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFs0XSkpOworCisjaWZkZWYgUlRNUF9SRl9SV19TVVBQT1JUCisJLypJbml0IFJUMzB4eCBSRlJlZ2lzdGVycyBhZnRlciByZWFkIFJGSUMgdHlwZSBmcm9tIEVFUFJPTSAqLworCU5JQ0luaXRSRlJlZ2lzdGVycyhwQWQpOworI2VuZGlmIC8qIFJUTVBfUkZfUldfU1VQUE9SVCAvLyAqLworCisvKiAgICAgICAgICAgICAgQVBJbml0aWFsaXplKHBBZCk7ICovCisKKwkvKiAqLworCS8qIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZSAqLworCS8qICovCisJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisKKwkvKiA4MDUxIGZpcm13YXJlIHJlcXVpcmUgdGhlIHNpZ25hbCBkdXJpbmcgYm9vdGluZyB0aW1lLiAqLworCS8qMjAwOC8xMS8yODpLSCBtYXJrZWQgdGhlIGZvbGxvd2luZyBjb2RlcyB0byBwYXRjaCBGcmVxdWVuY3kgb2Zmc2V0IGJ1ZyAqLworCS8qQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDcyLCAweEZGLCAweDAwLCAweDAwKTsgKi8KKworCWlmIChwQWQgJiYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSkgeworCQkvKiAqLworCQkvKiBVbmRvIGV2ZXJ5dGhpbmcgaWYgaXQgZmFpbGVkICovCisJCS8qICovCisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpIHsKKy8qICAgICAgICAgICAgICAgICAgICAgIE5kaXNNRGVyZWdpc3RlckludGVycnVwdCgmcEFkLT5JbnRlcnJ1cHQpOyAqLworCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKTsKKwkJfQorLyogICAgICAgICAgICAgIFJUTVBGcmVlQWRhcHRlcihwQWQpOyAvLyB3ZSB3aWxsIGZyZWUgaXQgaW4gZGlzY29ubmVjdCgpICovCisJfSBlbHNlIGlmIChwQWQpIHsKKwkJLyogTWljcm9zb2Z0IEhDVCByZXF1aXJlIGRyaXZlciBzZW5kIGEgZGlzY29ubmVjdCBldmVudCBhZnRlciBkcml2ZXIgaW5pdGlhbGl6YXRpb24uICovCisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisvKiAgICAgICAgICAgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsgKi8KKwkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfQ0hBTkdFKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQiFcbiIpKTsKKworI2lmZGVmIFJUTVBfTUFDX1VTQgorCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKTsKKwkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MpOworCisJCS8qICovCisJCS8qIFN1cHBvcnQgbXVsdGlwbGUgQnVsa0luIElSUCwgKi8KKwkJLyogdGhlIHZhbHVlIG9uIHBBZC0+Q29tbW9uQ2ZnLk51bU9mQnVsa0luSVJQIG1heSBiZSBsYXJnZSB0aGFuIDEuICovCisJCS8qICovCisJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBBZC0+Q29tbW9uQ2ZnLk51bU9mQnVsa0luSVJQOyBpbmRleCsrKSB7CisJCQlSVFVTQkJ1bGtSZWNlaXZlKHBBZCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVFVTQkJ1bGtSZWNlaXZlIVxuIikpOworCQl9CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisJfQkJCS8qIGVuZCBvZiBlbHNlICovCisKKwkvKiBTZXQgdXAgdGhlIE1hYyBhZGRyZXNzICovCisJUnRtcE9TTmV0RGV2QWRkclNldChwQWQtPm5ldF9kZXYsICZwQWQtPkN1cnJlbnRBZGRyZXNzWzBdKTsKKworCURCR1BSSU5UX1MoU3RhdHVzLCAoIjw9PT09IHJ0Mjh4eF9pbml0LCBTdGF0dXM9JXhcbiIsIFN0YXR1cykpOworCisJcmV0dXJuIFRSVUU7CisKK2VycjQ6CitlcnIzOgorCU1sbWVIYWx0KHBBZCk7CitlcnIyOgorCVJUTVBGcmVlVHhSeFJpbmdNZW1vcnkocEFkKTsKK2VycjE6CisKKwlvc19mcmVlX21lbShwQWQsIHBBZC0+bXBkdV9ibGtfcG9vbC5tZW0pOwkvKiBmcmVlIEJBIHBvb2wgKi8KKworCS8qIHNoYWxsIG5vdCBzZXQgcHJpdiB0byBOVUxMIGhlcmUgYmVjYXVzZSB0aGUgcHJpdiBkaWRuJ3QgYmVlbiBmcmVlIHlldC4gKi8KKwkvKm5ldF9kZXYtPm1sX3ByaXYgPSAwOyAqLworI2lmZGVmIFNUCitlcnIwOgorI2VuZGlmIC8qIFNUIC8vICovCisKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJydDI4eHggSW5pdGlhbGl6ZWQgZmFpbCFcbiIpKTsKKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8qLS0tQWRkIGJ5IHNoaWFuZywgbW92ZSBmcm9tIG9zL2xpbnV4L3J0X21haW5fZGV2LmMgKi8KKworc3RhdGljIGludCBSdG1wQ2hpcE9wc1JlZ2lzdGVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgaW50IGluZlR5cGUpCit7CisJc3RydWN0IHJ0X3J0bXBfY2hpcF9vcCAqcENoaXBPcHMgPSAmcEFkLT5jaGlwT3BzOworCWludCBzdGF0dXM7CisKKwltZW1zZXQocENoaXBPcHMsIDAsIHNpemVvZihzdHJ1Y3QgcnRfcnRtcF9jaGlwX29wKSk7CisKKwkvKiBzZXQgZWVwcm9tIHJlbGF0ZWQgaG9vayBmdW5jdGlvbnMgKi8KKwlzdGF0dXMgPSBSdG1wQ2hpcE9wc0VlcHJvbUhvb2socEFkLCBpbmZUeXBlKTsKKworCS8qIHNldCBtY3UgcmVsYXRlZCBob29rIGZ1bmN0aW9ucyAqLworCXN3aXRjaCAoaW5mVHlwZSkgeworI2lmZGVmIFJUTVBfUENJX1NVUFBPUlQKKwljYXNlIFJUTVBfREVWX0lORl9QQ0k6CisJCXBDaGlwT3BzLT5sb2FkRmlybXdhcmUgPSBSdG1wQXNpY0xvYWRGaXJtd2FyZTsKKwkJcENoaXBPcHMtPmVyYXNlRmlybXdhcmUgPSBSdG1wQXNpY0VyYXNlRmlybXdhcmU7CisJCXBDaGlwT3BzLT5zZW5kQ29tbWFuZFRvTWN1ID0gUnRtcEFzaWNTZW5kQ29tbWFuZFRvTWN1OworCQlicmVhazsKKyNlbmRpZiAvKiBSVE1QX1BDSV9TVVBQT1JUIC8vICovCisjaWZkZWYgUlRNUF9VU0JfU1VQUE9SVAorCWNhc2UgUlRNUF9ERVZfSU5GX1VTQjoKKwkJcENoaXBPcHMtPmxvYWRGaXJtd2FyZSA9IFJ0bXBBc2ljTG9hZEZpcm13YXJlOworCQlwQ2hpcE9wcy0+c2VuZENvbW1hbmRUb01jdSA9IFJ0bXBBc2ljU2VuZENvbW1hbmRUb01jdTsKKwkJYnJlYWs7CisjZW5kaWYgLyogUlRNUF9VU0JfU1VQUE9SVCAvLyAqLworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBSdG1wUmFEZXZDdHJsSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIFJUTVBfSU5GX1RZUEUgaW5mVHlwZSkKK3sKKwkvKnZvaWQgICpoYW5kbGU7ICovCisKKwkvKiBBc3NpZ24gdGhlIGludGVyZmFjZSB0eXBlLiBXZSBuZWVkIHVzZSBpdCB3aGVuIGRvIHJlZ2lzdGVyL0VFUFJPTSBhY2Nlc3MuICovCisJcEFkLT5pbmZUeXBlID0gaW5mVHlwZTsKKworCXBBZC0+T3BNb2RlID0gT1BNT0RFX1NUQTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiU1RBIERyaXZlciB2ZXJzaW9uLSVzXG4iLCBTVEFfRFJJVkVSX1ZFUlNJT04pKTsKKworI2lmZGVmIFJUTVBfTUFDX1VTQgorCWluaXRfTVVURVgoJihwQWQtPlVzYlZlbmRvclJlcV9zZW1hcGhvcmUpKTsKKwlvc19hbGxvY19tZW0ocEFkLCAodTggKiopICYgcEFkLT5Vc2JWZW5kb3JSZXFCdWYsCisJCSAgICAgTUFYX1BBUkFNX0JVRkZFUl9TSVpFIC0gMSk7CisJaWYgKHBBZC0+VXNiVmVuZG9yUmVxQnVmID09IE5VTEwpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJBbGxvY2F0ZSB2ZW5kb3IgcmVxdWVzdCB0ZW1wIGJ1ZmZlciBmYWlsZWQhXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisKKwlSdG1wQ2hpcE9wc1JlZ2lzdGVyKHBBZCwgaW5mVHlwZSk7CisKKwlyZXR1cm4gMDsKK30KKworQk9PTEVBTiBSdG1wUmFEZXZDdHJsRXhpdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisKKwlSVE1QRnJlZUFkYXB0ZXIocEFkKTsKKworCXJldHVybiBUUlVFOworfQorCisvKiBub3QgeWV0IHN1cHBvcnQgTUJTUyAqLworc3RydWN0IG5ldF9kZXZpY2UgKmdldF9uZXRkZXZfZnJvbV9ic3NpZChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IEZyb21XaGljaEJTU0lEKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXZfcCA9IE5VTEw7CisKKwl7CisJCWRldl9wID0gcEFkLT5uZXRfZGV2OworCX0KKworCUFTU0VSVChkZXZfcCk7CisJcmV0dXJuIGRldl9wOwkJLyogcmV0dXJuIG9uZSBvZiBNQlNTICovCit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX21jdS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF9tY3UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjAzOTAxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF9tY3UuYwpAQCAtMCwwICsxLDI5MSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydG1wX21jdS5jCisKKwlBYnN0cmFjdDoKKwlNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisJLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZQkiLi4vcnRfY29uZmlnLmgiCisKKyNpZiBkZWZpbmVkKFJUMjg2MCkgfHwgZGVmaW5lZChSVDMwOTApCisjaW5jbHVkZSAiZmlybXdhcmUuaCIKKyNpbmNsdWRlICIuLi8uLi9ydDMwOTAvZmlybXdhcmUuaCIKKyNlbmRpZgorI2lmZGVmIFJUMjg3MAorI2luY2x1ZGUgIi4uLy4uL3J0MzA3MC9maXJtd2FyZS5oIgorI2luY2x1ZGUgImZpcm13YXJlXzMwNzAuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvYml0cmV2Lmg+CisKKyNpZmRlZiBSVE1QX01BQ19VU0IKKy8qICovCisvKiBSVDI4NzAgRmlybXdhcmUgU3BlYyBvbmx5IHVzZWQgMSBvY3QgZm9yIHZlcnNpb24gZXhwcmVzc2lvbiAqLworLyogKi8KKyNkZWZpbmUgRklSTVdBUkVfTUlOT1JfVkVSU0lPTgk3CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisKKy8qIE5ldyA4ayBieXRlIGZpcm13YXJlIHNpemUgZm9yIFJUMzA3MS9SVDMwNzIgKi8KKyNkZWZpbmUgRklSTVdBUkVJTUFHRV9NQVhfTEVOR1RICTB4MjAwMAorI2RlZmluZSBGSVJNV0FSRUlNQUdFX0xFTkdUSAkJCShzaXplb2YgKEZpcm13YXJlSW1hZ2UpIC8gc2l6ZW9mKHU4KSkKKyNkZWZpbmUgRklSTVdBUkVfTUFKT1JfVkVSU0lPTgkJMAorCisjZGVmaW5lIEZJUk1XQVJFSU1BR0VWMV9MRU5HVEgJCTB4MTAwMAorI2RlZmluZSBGSVJNV0FSRUlNQUdFVjJfTEVOR1RICQkweDEwMDAKKworI2lmZGVmIFJUTVBfTUFDX1BDSQorI2RlZmluZSBGSVJNV0FSRV9NSU5PUl9WRVJTSU9OCQkyCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQllcmFzZSA4MDUxIGZpcm13YXJlIGltYWdlIGluIE1BQyBBU0lDCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IFJ0bXBBc2ljRXJhc2VGaXJtd2FyZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJdW5zaWduZWQgbG9uZyBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFOyBpICs9IDQpCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEZJUk1XQVJFX0lNQUdFX0JBU0UgKyBpLCAwKTsKKworCXJldHVybiAwOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJTG9hZCA4MDUxIGZpcm13YXJlIGZpbGUgaW50byBNQUMgQVNJQworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19TVUNDRVNTICAgICAgICAgZmlybXdhcmUgaW1hZ2UgbG9hZCBvaworCQlORElTX1NUQVRVU19GQUlMVVJFICAgICAgICAgaW1hZ2Ugbm90IGZvdW5kCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IFJ0bXBBc2ljTG9hZEZpcm13YXJlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKworCWludCBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCXU4ICpwRmlybXdhcmVJbWFnZSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBGaWxlTGVuZ3RoLCBJbmRleDsKKwl1MzIgTWFjUmVnID0gMDsKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwl1MzIgVmVyc2lvbiA9IChwQWQtPk1BQ1ZlcnNpb24gPj4gMTYpOworI2VuZGlmCisKKwkvKiBOZXcgOGsgYnl0ZSBmaXJtd2FyZSBzaXplIGZvciBSVDMwNzEvUlQzMDcyICovCisJeworI2lmZGVmIFJUTVBfTUFDX1BDSQorCQlpZiAoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpIHsKKwkJCXBGaXJtd2FyZUltYWdlID0gRmlybXdhcmVJbWFnZV8zMDkwOworCQkJRmlsZUxlbmd0aCA9IEZJUk1XQVJFSU1BR0VfTUFYX0xFTkdUSDsKKwkJfSBlbHNlIHsKKwkJCXBGaXJtd2FyZUltYWdlID0gRmlybXdhcmVJbWFnZV8yODYwOworCQkJRmlsZUxlbmd0aCA9IEZJUk1XQVJFSU1BR0VfTUFYX0xFTkdUSDsKKwkJfQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgorCQkvKiB0aGUgZmlybXdhcmUgaW1hZ2UgY29uc2lzdHMgb2YgdHdvIHBhcnRzICovCisJCWlmICgoVmVyc2lvbiAhPSAweDI4NjApICYmIChWZXJzaW9uICE9IDB4Mjg3MikgJiYgKFZlcnNpb24gIT0gMHgzMDcwKSkgewkvKiB1c2UgdGhlIHNlY29uZCBwYXJ0ICovCisJCQkvKnByaW50aygiS0g6VXNlIE5ldyBWZXJzaW9uLHBhcnQyXG4iKTsgKi8KKwkJCXBGaXJtd2FyZUltYWdlID0KKwkJCSAgICAodTggKikmCisJCQkgICAgRmlybXdhcmVJbWFnZV8zMDcwW0ZJUk1XQVJFSU1BR0VWMV9MRU5HVEhdOworCQkJRmlsZUxlbmd0aCA9IEZJUk1XQVJFSU1BR0VWMl9MRU5HVEg7CisJCX0gZWxzZSB7CisJCQkvKnByaW50aygiS0g6VXNlIE5ldyBWZXJzaW9uLHBhcnQxXG4iKTsgKi8KKwkJCWlmIChWZXJzaW9uID09IDB4MzA3MCkKKwkJCQlwRmlybXdhcmVJbWFnZSA9IEZpcm13YXJlSW1hZ2VfMzA3MDsKKwkJCWVsc2UKKwkJCQlwRmlybXdhcmVJbWFnZSA9IEZpcm13YXJlSW1hZ2VfMjg3MDsKKwkJCUZpbGVMZW5ndGggPSBGSVJNV0FSRUlNQUdFVjFfTEVOR1RIOworCQl9CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisJfQorCisJUlRNUF9XUklURV9GSVJNV0FSRShwQWQsIHBGaXJtd2FyZUltYWdlLCBGaWxlTGVuZ3RoKTsKKworCS8qIGNoZWNrIGlmIE1DVSBpcyByZWFkeSAqLworCUluZGV4ID0gMDsKKwlkbyB7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgUEJGX1NZU19DVFJMLCAmTWFjUmVnKTsKKworCQlpZiAoTWFjUmVnICYgMHg4MCkKKwkJCWJyZWFrOworCisJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJfSB3aGlsZSAoSW5kZXgrKyA8IDEwMDApOworCisJaWYgKEluZGV4ID4gMTAwMCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIk5JQ0xvYWRGaXJtd2FyZTogTUNVIGlzIG5vdCByZWFkeVxuIikpOworCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gJXMgKHN0YXR1cz0lZClcbiIsIF9fZnVuY19fLCBTdGF0dXMpKTsKKworCXJldHVybiBTdGF0dXM7Cit9CisKK2ludCBSdG1wQXNpY1NlbmRDb21tYW5kVG9NY3Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB1OCBDb21tYW5kLAorCQkJICAgICB1OCBUb2tlbiwgdTggQXJnMCwgdTggQXJnMSkKK3sKKwlIT1NUX0NNRF9DU1JfU1RSVUMgSDJNQ21kOworCUgyTV9NQUlMQk9YX1NUUlVDIEgyTU1haWxib3g7CisJdW5zaWduZWQgbG9uZyBpID0gMDsKKworI2lmZGVmIFBDSUVfUFNfU1VQUE9SVAorCS8qIDMwOTBGIHBvd2VyIHNvbHV0aW9uIDMgaGFzIGh3IGxpbWl0YXRpb24gdGhhdCBuZWVkcyB0byBiYW4gYWxsIG1jdSBjb21tYW5kICovCisJLyogd2hlbiBmaXJtd2FyZSBpcyBpbiByYWRpbyBzdGF0ZS4gIEZvciBvdGhlciBjaGlwIGRvZXNuJ3QgaGF2ZSB0aGlzIGxpbWl0YXRpb24uICovCisJaWYgKCgoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpCisJICAgICAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKSkgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkKKwkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPT0gMykKKwkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSkgeworCQlSVE1QX1NFTV9MT0NLKCZwQWQtPk1jdUNtZExvY2spOworCQlpZiAoKHBBZC0+YnJ0MzB4eEJhbk1jdUNtZCA9PSBUUlVFKQorCQkgICAgJiYgKENvbW1hbmQgIT0gV0FLRV9NQ1VfQ01EKSAmJiAoQ29tbWFuZCAhPSBSRk9GRl9NQ1VfQ01EKSkgeworCQkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1jdUNtZExvY2spOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiIEJhbiBNY3UgQ21kICV4IGluIHNsZWVwIG1vZGVcbiIsIENvbW1hbmQpKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfSBlbHNlIGlmICgoQ29tbWFuZCA9PSBTTEVFUF9NQ1VfQ01EKQorCQkJICAgfHwgKENvbW1hbmQgPT0gUkZPRkZfTUNVX0NNRCkpIHsKKwkJCXBBZC0+YnJ0MzB4eEJhbk1jdUNtZCA9IFRSVUU7CisJCX0gZWxzZSBpZiAoQ29tbWFuZCAhPSBXQUtFX01DVV9DTUQpIHsKKwkJCXBBZC0+YnJ0MzB4eEJhbk1jdUNtZCA9IEZBTFNFOworCQl9CisKKwkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1jdUNtZExvY2spOworCisJfQorCWlmICgoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKQorCSAgICAgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkpICYmIElTX1ZFUlNJT05fQUZURVJfRihwQWQpCisJICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID09IDMpCisJICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkKKwkgICAgJiYgKENvbW1hbmQgPT0gV0FLRV9NQ1VfQ01EKSkgeworCisJCWRvIHsKKwkJCVJUTVBfSU9fRk9SQ0VfUkVBRDMyKHBBZCwgSDJNX01BSUxCT1hfQ1NSLAorCQkJCQkgICAgICZIMk1NYWlsYm94LndvcmQpOworCQkJaWYgKEgyTU1haWxib3guZmllbGQuT3duZXIgPT0gMCkKKwkJCQlicmVhazsKKworCQkJUlRNUHVzZWNEZWxheSgyKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0lORk8sCisJCQkJICgiQXNpY1NlbmRDb21tYW5Ub01jdTo6TWFpbCBib3ggaXMgYnVzeVxuIikpOworCQl9IHdoaWxlIChpKysgPCAxMDApOworCisJCWlmIChpID49IDEwMCkgeworCQkJREJHUFJJTlRfRVJSKCgiSDJNX01BSUxCT1ggc3RpbGwgaG9sZCBieSBNQ1UuIGNvbW1hbmQgZmFpbFxuIikpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisKKwkJSDJNTWFpbGJveC5maWVsZC5Pd25lciA9IDE7CS8qIHBhc3Mgb3duZXJzaGlwIHRvIE1DVSAqLworCQlIMk1NYWlsYm94LmZpZWxkLkNtZFRva2VuID0gVG9rZW47CisJCUgyTU1haWxib3guZmllbGQuSGlnaEJ5dGUgPSBBcmcxOworCQlIMk1NYWlsYm94LmZpZWxkLkxvd0J5dGUgPSBBcmcwOworCQlSVE1QX0lPX0ZPUkNFX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsIEgyTU1haWxib3gud29yZCk7CisKKwkJSDJNQ21kLndvcmQgPSAwOworCQlIMk1DbWQuZmllbGQuSG9zdENvbW1hbmQgPSBDb21tYW5kOworCQlSVE1QX0lPX0ZPUkNFX1dSSVRFMzIocEFkLCBIT1NUX0NNRF9DU1IsIEgyTUNtZC53b3JkKTsKKworCX0gZWxzZQorI2VuZGlmIC8qIFBDSUVfUFNfU1VQUE9SVCAvLyAqLworCXsKKwkJZG8geworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsICZIMk1NYWlsYm94LndvcmQpOworCQkJaWYgKEgyTU1haWxib3guZmllbGQuT3duZXIgPT0gMCkKKwkJCQlicmVhazsKKworCQkJUlRNUHVzZWNEZWxheSgyKTsKKwkJfSB3aGlsZSAoaSsrIDwgMTAwKTsKKworCQlpZiAoaSA+IDEwMCkgeworI2lmZGVmIFJUTVBfTUFDX1BDSQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCQkJeworCQkJCURCR1BSSU5UX0VSUigoIkgyTV9NQUlMQk9YIHN0aWxsIGhvbGQgYnkgTUNVLiBjb21tYW5kIGZhaWxcbiIpKTsKKwkJCX0KKwkJCXJldHVybiBGQUxTRTsKKwkJfQorI2lmZGVmIFJUTVBfTUFDX1BDSQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCisJCUgyTU1haWxib3guZmllbGQuT3duZXIgPSAxOwkvKiBwYXNzIG93bmVyc2hpcCB0byBNQ1UgKi8KKwkJSDJNTWFpbGJveC5maWVsZC5DbWRUb2tlbiA9IFRva2VuOworCQlIMk1NYWlsYm94LmZpZWxkLkhpZ2hCeXRlID0gQXJnMTsKKwkJSDJNTWFpbGJveC5maWVsZC5Mb3dCeXRlID0gQXJnMDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfQ1NSLCBIMk1NYWlsYm94LndvcmQpOworCisJCUgyTUNtZC53b3JkID0gMDsKKwkJSDJNQ21kLmZpZWxkLkhvc3RDb21tYW5kID0gQ29tbWFuZDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgSE9TVF9DTURfQ1NSLCBIMk1DbWQud29yZCk7CisKKwkJaWYgKENvbW1hbmQgIT0gMHg4MCkgeworCQl9CisJfQorI2lmZGVmIFBDSUVfUFNfU1VQUE9SVAorCS8qIDMwOTAgTUNVIFdha2V1cCBjb21tYW5kIG5lZWRzIG1vcmUgdGltZSB0byBiZSBzdGFibGUuICovCisJLyogQmVmb3JlIHN0YWJsZSwgZG9uJ3QgaXNzdWUgb3RoZXIgTUNVIGNvbW1hbmQgdG8gcHJldmVudCBmcm9tIGZpcm13YXJlIGVycm9yLiAqLworCWlmICgoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKQorCSAgICAgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkpICYmIElTX1ZFUlNJT05fQUZURVJfRihwQWQpCisJICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID09IDMpCisJICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkKKwkgICAgJiYgKENvbW1hbmQgPT0gV0FLRV9NQ1VfQ01EKSkgeworCQlSVE1QdXNlY0RlbGF5KDIwMDApOworCQkvKlB1dCB0aGlzIGlzIGFmdGVyIFJGIHByb2dyYW1taW5nLiAqLworCQkvKk5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWN1Q21kTG9jayk7ICovCisJCS8qcEFkLT5icnQzMHh4QmFuTWN1Q21kID0gRkFMU0U7ICovCisJCS8qTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NY3VDbWRMb2NrKTsgKi8KKwl9CisjZW5kaWYgLyogUENJRV9QU19TVVBQT1JUIC8vICovCisKKwlyZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfdGltZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmU0N2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF90aW1lci5jCkBAIC0wLDAgKzEsMzAyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgIHJ0bXBfdGltZXIuYworCisgICAgQWJzdHJhY3Q6CisgICAgdGFzayBmb3IgdGltZXIgaGFuZGxpbmcKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIE5hbWUgICAgICAgICAgRGF0ZSAgICAgICAgICAgIE1vZGlmaWNhdGlvbiBsb2dzCisgICAgU2hpYW5nIFR1CTA4LTI4LTIwMDggICBpbml0IHZlcnNpb24KKworKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCitCVUlMRF9USU1FUl9GVU5DVElPTihNbG1lUGVyaW9kaWNFeGVjKTsKKy8qQlVJTERfVElNRVJfRlVOQ1RJT04oTWxtZVJzc2lSZXBvcnRFeGVjKTsgKi8KK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEFzaWNSeEFudEV2YWxUaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEFQU0RQZXJpb2RpY0V4ZWMpOworQlVJTERfVElNRVJfRlVOQ1RJT04oQXNpY1JmVHVuaW5nRXhlYyk7CisjaWZkZWYgUlRNUF9NQUNfVVNCCitCVUlMRF9USU1FUl9GVU5DVElPTihCZWFjb25VcGRhdGVFeGVjKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKworQlVJTERfVElNRVJfRlVOQ1RJT04oQmVhY29uVGltZW91dCk7CitCVUlMRF9USU1FUl9GVU5DVElPTihTY2FuVGltZW91dCk7CitCVUlMRF9USU1FUl9GVU5DVElPTihBdXRoVGltZW91dCk7CitCVUlMRF9USU1FUl9GVU5DVElPTihBc3NvY1RpbWVvdXQpOworQlVJTERfVElNRVJfRlVOQ1RJT04oUmVhc3NvY1RpbWVvdXQpOworQlVJTERfVElNRVJfRlVOQ1RJT04oRGlzYXNzb2NUaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKExpbmtEb3duRXhlYyk7CitCVUlMRF9USU1FUl9GVU5DVElPTihTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKTsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKFBzUG9sbFdha2VFeGVjKTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKFJhZGlvT25FeGVjKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKyNpZmRlZiBSVE1QX01BQ19VU0IKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKFJ0bXBVc2JTdGFBc2ljRm9yY2VXYWtldXBUaW1lb3V0KTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKworI2lmIGRlZmluZWQoQVBfTEVEKSB8fCBkZWZpbmVkKFNUQV9MRUQpCitleHRlcm4gdm9pZCBMZWRDdHJsTWFpbih2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCQl2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCQl2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMyk7CitCVUlMRF9USU1FUl9GVU5DVElPTihMZWRDdHJsTWFpbik7CisjZW5kaWYKKworI2lmZGVmIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUCitzdGF0aWMgdm9pZCBSdG1wVGltZXJRSGFuZGxlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKyNpZm5kZWYgS1RIUkVBRF9TVVBQT1JUCisJaW50IHN0YXR1czsKKyNlbmRpZgorCXN0cnVjdCBydF9yYWxpbmtfdGltZXIgKnBUaW1lcjsKKwlzdHJ1Y3QgcnRfcnRtcF90aW1lcl90YXNrX2VudHJ5ICpwRW50cnk7CisJdW5zaWduZWQgbG9uZyBpcnFGbGFnOworCXN0cnVjdCBydF9ydG1wX29zX3Rhc2sgKnBUYXNrOworCisJcFRhc2sgPSAmcEFkLT50aW1lclRhc2s7CisJd2hpbGUgKCFwVGFzay0+dGFza19raWxsZWQpIHsKKwkJcFRpbWVyID0gTlVMTDsKKworI2lmZGVmIEtUSFJFQURfU1VQUE9SVAorCQlSVE1QX1dBSVRfRVZFTlRfSU5URVJSVVBUSUJMRShwQWQsIHBUYXNrKTsKKyNlbHNlCisJCVJUTVBfU0VNX0VWRU5UX1dBSVQoJihwVGFzay0+dGFza1NlbWEpLCBzdGF0dXMpOworI2VuZGlmCisKKwkJaWYgKHBBZC0+VGltZXJRLnN0YXR1cyA9PSBSVE1QX1RBU0tfU1RBVF9TVE9QRUQpCisJCQlicmVhazsKKworCQkvKiBldmVudCBoYXBwZW5lZC4gKi8KKwkJd2hpbGUgKHBBZC0+VGltZXJRLnBRSGVhZCkgeworCQkJUlRNUF9JTlRfTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFnKTsKKwkJCXBFbnRyeSA9IHBBZC0+VGltZXJRLnBRSGVhZDsKKwkJCWlmIChwRW50cnkpIHsKKwkJCQlwVGltZXIgPSBwRW50cnktPnBSYVRpbWVyOworCisJCQkJLyogdXBkYXRlIHBRSGVhZCAqLworCQkJCXBBZC0+VGltZXJRLnBRSGVhZCA9IHBFbnRyeS0+cE5leHQ7CisJCQkJaWYgKHBFbnRyeSA9PSBwQWQtPlRpbWVyUS5wUVRhaWwpCisJCQkJCXBBZC0+VGltZXJRLnBRVGFpbCA9IE5VTEw7CisKKwkJCQkvKiByZXR1cm4gdGhpcyBxdWV1ZSBlbnRyeSB0byB0aW1lclFGcmVlTGlzdC4gKi8KKwkJCQlwRW50cnktPnBOZXh0ID0gcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3Q7CisJCQkJcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3QgPSBwRW50cnk7CisJCQl9CisJCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZyk7CisKKwkJCWlmIChwVGltZXIpIHsKKwkJCQlpZiAoKHBUaW1lci0+aGFuZGxlICE9IE5VTEwpCisJCQkJICAgICYmICghcEFkLT5QTV9GbGdTdXNwZW5kKSkKKwkJCQkJcFRpbWVyLT5oYW5kbGUoTlVMTCwKKwkJCQkJCSAgICAgICAodm9pZCAqKXBUaW1lci0+Y29va2llLAorCQkJCQkJICAgICAgIE5VTEwsIHBUaW1lcik7CisJCQkJaWYgKChwVGltZXItPlJlcGVhdCkKKwkJCQkgICAgJiYgKHBUaW1lci0+U3RhdGUgPT0gRkFMU0UpKQorCQkJCQlSVE1QX09TX0FkZF9UaW1lcigmcFRpbWVyLT5UaW1lck9iaiwKKwkJCQkJCQkgIHBUaW1lci0+VGltZXJWYWx1ZSk7CisJCQl9CisJCX0KKworI2lmbmRlZiBLVEhSRUFEX1NVUFBPUlQKKwkJaWYgKHN0YXR1cyAhPSAwKSB7CisJCQlwQWQtPlRpbWVyUS5zdGF0dXMgPSBSVE1QX1RBU0tfU1RBVF9TVE9QRUQ7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKwl9Cit9CisKK2ludCBSdG1wVGltZXJRVGhyZWFkKElOIHZvaWQgKkNvbnRleHQpCit7CisJc3RydWN0IHJ0X3J0bXBfb3NfdGFzayAqcFRhc2s7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCisJcFRhc2sgPSAoc3RydWN0IHJ0X3J0bXBfb3NfdGFzayAqKUNvbnRleHQ7CisJcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilwVGFzay0+cHJpdjsKKworCVJ0bXBPU1Rhc2tDdXN0b21pemUocFRhc2spOworCisJUnRtcFRpbWVyUUhhbmRsZShwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tLSVzXG4iLCBfX2Z1bmNfXykpOworI2lmbmRlZiBLVEhSRUFEX1NVUFBPUlQKKwlwVGFzay0+dGFza1BJRCA9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKyNlbmRpZgorCS8qIG5vdGlmeSB0aGUgZXhpdCByb3V0aW5lIHRoYXQgd2UncmUgYWN0dWFsbHkgZXhpdGluZyBub3cKKwkgKgorCSAqIGNvbXBsZXRlKCkvd2FpdF9mb3JfY29tcGxldGlvbigpIGlzIHNpbWlsYXIgdG8gdXAoKS9kb3duKCksCisJICogZXhjZXB0IHRoYXQgY29tcGxldGUoKSBpcyBzYWZlIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBzdHJ1Y3R1cmUKKwkgKiBpcyBnZXR0aW5nIGRlbGV0ZWQgaW4gYSBwYXJhbGxlbCBtb2RlIG9mIGV4ZWN1dGlvbiAoaS5lLiBqdXN0CisJICogYWZ0ZXIgdGhlIGRvd24oKSAtLSB0aGF0J3MgbmVjZXNzYXJ5IGZvciB0aGUgdGhyZWFkLXNodXRkb3duCisJICogY2FzZS4KKwkgKgorCSAqIGNvbXBsZXRlX2FuZF9leGl0KCkgZ29lcyBldmVuIGZ1cnRoZXIgdGhhbiB0aGlzIC0tIGl0IGlzIHNhZmUgaW4KKwkgKiB0aGUgY2FzZSB0aGF0IHRoZSB0aHJlYWQgb2YgdGhlIGNhbGxlciBpcyBnb2luZyBhd2F5IChub3QganVzdAorCSAqIHRoZSBzdHJ1Y3R1cmUpIC0tIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciB0aGUgbW9kdWxlLXJlbW92ZSBjYXNlLgorCSAqIFRoaXMgaXMgaW1wb3J0YW50IGluIHByZWVtcHRpb24ga2VybmVscywgd2hpY2ggdHJhbnNmZXIgdGhlIGZsb3cKKwkgKiBvZiBleGVjdXRpb24gaW1tZWRpYXRlbHkgdXBvbiBhIGNvbXBsZXRlKCkuCisJICovCisJUnRtcE9TVGFza05vdGlmeVRvRXhpdChwVGFzayk7CisKKwlyZXR1cm4gMDsKKworfQorCitzdHJ1Y3QgcnRfcnRtcF90aW1lcl90YXNrX2VudHJ5ICpSdG1wVGltZXJRSW5zZXJ0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJc3RydWN0IHJ0X3JhbGlua190aW1lciAqcFRpbWVyKQoreworCXN0cnVjdCBydF9ydG1wX3RpbWVyX3Rhc2tfZW50cnkgKnBRTm9kZSA9IE5VTEwsICpwUVRhaWw7CisJdW5zaWduZWQgbG9uZyBpcnFGbGFnczsKKwlzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpwVGFzayA9ICZwQWQtPnRpbWVyVGFzazsKKworCVJUTVBfSU5UX0xPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOworCWlmIChwQWQtPlRpbWVyUS5zdGF0dXMgJiBSVE1QX1RBU0tfQ0FOX0RPX0lOU0VSVCkgeworCQlpZiAocEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3QpIHsKKwkJCXBRTm9kZSA9IHBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0OworCQkJcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3QgPSBwUU5vZGUtPnBOZXh0OworCisJCQlwUU5vZGUtPnBSYVRpbWVyID0gcFRpbWVyOworCQkJcFFOb2RlLT5wTmV4dCA9IE5VTEw7CisKKwkJCXBRVGFpbCA9IHBBZC0+VGltZXJRLnBRVGFpbDsKKwkJCWlmIChwQWQtPlRpbWVyUS5wUVRhaWwgIT0gTlVMTCkKKwkJCQlwUVRhaWwtPnBOZXh0ID0gcFFOb2RlOworCQkJcEFkLT5UaW1lclEucFFUYWlsID0gcFFOb2RlOworCQkJaWYgKHBBZC0+VGltZXJRLnBRSGVhZCA9PSBOVUxMKQorCQkJCXBBZC0+VGltZXJRLnBRSGVhZCA9IHBRTm9kZTsKKwkJfQorCX0KKwlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOworCisJaWYgKHBRTm9kZSkgeworI2lmZGVmIEtUSFJFQURfU1VQUE9SVAorCQlXQUtFX1VQKHBUYXNrKTsKKyNlbHNlCisJCVJUTVBfU0VNX0VWRU5UX1VQKCZwVGFzay0+dGFza1NlbWEpOworI2VuZGlmCisJfQorCisJcmV0dXJuIHBRTm9kZTsKK30KKworQk9PTEVBTiBSdG1wVGltZXJRUmVtb3ZlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X3JhbGlua190aW1lciAqcFRpbWVyKQoreworCXN0cnVjdCBydF9ydG1wX3RpbWVyX3Rhc2tfZW50cnkgKnBOb2RlLCAqcFByZXYgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaXJxRmxhZ3M7CisKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKKwlpZiAocEFkLT5UaW1lclEuc3RhdHVzID49IFJUTVBfVEFTS19TVEFUX0lOSVRFRCkgeworCQlwTm9kZSA9IHBBZC0+VGltZXJRLnBRSGVhZDsKKwkJd2hpbGUgKHBOb2RlKSB7CisJCQlpZiAocE5vZGUtPnBSYVRpbWVyID09IHBUaW1lcikKKwkJCQlicmVhazsKKwkJCXBQcmV2ID0gcE5vZGU7CisJCQlwTm9kZSA9IHBOb2RlLT5wTmV4dDsKKwkJfQorCisJCS8qIE5vdyBtb3ZlIGl0IHRvIGZyZWVMaXN0IHF1ZXVlLiAqLworCQlpZiAocE5vZGUpIHsKKwkJCWlmIChwTm9kZSA9PSBwQWQtPlRpbWVyUS5wUUhlYWQpCisJCQkJcEFkLT5UaW1lclEucFFIZWFkID0gcE5vZGUtPnBOZXh0OworCQkJaWYgKHBOb2RlID09IHBBZC0+VGltZXJRLnBRVGFpbCkKKwkJCQlwQWQtPlRpbWVyUS5wUVRhaWwgPSBwUHJldjsKKwkJCWlmIChwUHJldiAhPSBOVUxMKQorCQkJCXBQcmV2LT5wTmV4dCA9IHBOb2RlLT5wTmV4dDsKKworCQkJLyogcmV0dXJuIHRoaXMgcXVldWUgZW50cnkgdG8gdGltZXJRRnJlZUxpc3QuICovCisJCQlwTm9kZS0+cE5leHQgPSBwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdDsKKwkJCXBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0ID0gcE5vZGU7CisJCX0KKwl9CisJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKKworCXJldHVybiBUUlVFOworfQorCit2b2lkIFJ0bXBUaW1lclFFeGl0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlzdHJ1Y3QgcnRfcnRtcF90aW1lcl90YXNrX2VudHJ5ICpwVGltZXJROworCXVuc2lnbmVkIGxvbmcgaXJxRmxhZ3M7CisKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKKwl3aGlsZSAocEFkLT5UaW1lclEucFFIZWFkKSB7CisJCXBUaW1lclEgPSBwQWQtPlRpbWVyUS5wUUhlYWQ7CisJCXBBZC0+VGltZXJRLnBRSGVhZCA9IHBUaW1lclEtPnBOZXh0OworCQkvKiByZW1vdmUgdGhlIHRpbWVRICovCisJfQorCXBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0ID0gTlVMTDsKKwlvc19mcmVlX21lbShwQWQsIHBBZC0+VGltZXJRLnBUaW1lclFQb2xsKTsKKwlwQWQtPlRpbWVyUS5wUVRhaWwgPSBOVUxMOworCXBBZC0+VGltZXJRLnBRSGVhZCA9IE5VTEw7CisjaWZuZGVmIEtUSFJFQURfU1VQUE9SVAorCXBBZC0+VGltZXJRLnN0YXR1cyA9IFJUTVBfVEFTS19TVEFUX1NUT1BFRDsKKyNlbmRpZgorCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7CisKK30KKwordm9pZCBSdG1wVGltZXJRSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJaW50IGk7CisJc3RydWN0IHJ0X3J0bXBfdGltZXJfdGFza19lbnRyeSAqcFFOb2RlLCAqcEVudHJ5OworCXVuc2lnbmVkIGxvbmcgaXJxRmxhZ3M7CisKKwlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5UaW1lclFMb2NrKTsKKworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlRpbWVyUSwgc2l6ZW9mKHBBZC0+VGltZXJRKSk7CisKKwlvc19hbGxvY19tZW0ocEFkLCAmcEFkLT5UaW1lclEucFRpbWVyUVBvbGwsCisJCSAgICAgc2l6ZW9mKHN0cnVjdCBydF9ydG1wX3RpbWVyX3Rhc2tfZW50cnkpICogVElNRVJfUVVFVUVfU0laRV9NQVgpOworCWlmIChwQWQtPlRpbWVyUS5wVGltZXJRUG9sbCkgeworCQlwRW50cnkgPSBOVUxMOworCQlwUU5vZGUgPSAoc3RydWN0IHJ0X3J0bXBfdGltZXJfdGFza19lbnRyeSAqKXBBZC0+VGltZXJRLnBUaW1lclFQb2xsOworCQlOZGlzWmVyb01lbW9yeShwQWQtPlRpbWVyUS5wVGltZXJRUG9sbCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X3J0bXBfdGltZXJfdGFza19lbnRyeSkgKgorCQkJICAgICAgIFRJTUVSX1FVRVVFX1NJWkVfTUFYKTsKKworCQlSVE1QX0lOVF9MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKKwkJZm9yIChpID0gMDsgaSA8IFRJTUVSX1FVRVVFX1NJWkVfTUFYOyBpKyspIHsKKwkJCXBRTm9kZS0+cE5leHQgPSBwRW50cnk7CisJCQlwRW50cnkgPSBwUU5vZGU7CisJCQlwUU5vZGUrKzsKKwkJfQorCQlwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdCA9IHBFbnRyeTsKKwkJcEFkLT5UaW1lclEucFFIZWFkID0gTlVMTDsKKwkJcEFkLT5UaW1lclEucFFUYWlsID0gTlVMTDsKKwkJcEFkLT5UaW1lclEuc3RhdHVzID0gUlRNUF9UQVNLX1NUQVRfSU5JVEVEOworCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOworCX0KK30KKyNlbmRpZiAvKiBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVCAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF90a2lwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX3RraXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE3ZmRhNi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX3RraXAuYworKysgL2Rldi9udWxsCkBAIC0xLDE1ODYgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQlydG1wX3RraXAuYwotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVBhdWwgV3UJCTAyLTI1LTAyCQlJbml0aWFsCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLS8vIFJvdGF0aW9uIGZ1bmN0aW9ucyBvbiAzMiBiaXQgdmFsdWVzCi0jZGVmaW5lIFJPTDMyKCBBLCBuICkgXAotCSggKChBKSA8PCAobikpIHwgKCAoKEEpPj4oMzItKG4pKSkgJiAoICgxVUwgPDwgKG4pKSAtIDEgKSApICkKLSNkZWZpbmUgUk9SMzIoIEEsIG4gKSBST0wzMiggKEEpLCAzMi0obikgKQotCi1VSU5UIFRraXBfU2JveF9Mb3dlclsyNTZdID0KLXsKLQkweEE1LDB4ODQsMHg5OSwweDhELDB4MEQsMHhCRCwweEIxLDB4NTQsCi0JMHg1MCwweDAzLDB4QTksMHg3RCwweDE5LDB4NjIsMHhFNiwweDlBLAotCTB4NDUsMHg5RCwweDQwLDB4ODcsMHgxNSwweEVCLDB4QzksMHgwQiwKLQkweEVDLDB4NjcsMHhGRCwweEVBLDB4QkYsMHhGNywweDk2LDB4NUIsCi0JMHhDMiwweDFDLDB4QUUsMHg2QSwweDVBLDB4NDEsMHgwMiwweDRGLAotCTB4NUMsMHhGNCwweDM0LDB4MDgsMHg5MywweDczLDB4NTMsMHgzRiwKLQkweDBDLDB4NTIsMHg2NSwweDVFLDB4MjgsMHhBMSwweDBGLDB4QjUsCi0JMHgwOSwweDM2LDB4OUIsMHgzRCwweDI2LDB4NjksMHhDRCwweDlGLAotCTB4MUIsMHg5RSwweDc0LDB4MkUsMHgyRCwweEIyLDB4RUUsMHhGQiwKLQkweEY2LDB4NEQsMHg2MSwweENFLDB4N0IsMHgzRSwweDcxLDB4OTcsCi0JMHhGNSwweDY4LDB4MDAsMHgyQywweDYwLDB4MUYsMHhDOCwweEVELAotCTB4QkUsMHg0NiwweEQ5LDB4NEIsMHhERSwweEQ0LDB4RTgsMHg0QSwKLQkweDZCLDB4MkEsMHhFNSwweDE2LDB4QzUsMHhENywweDU1LDB4OTQsCi0JMHhDRiwweDEwLDB4MDYsMHg4MSwweEYwLDB4NDQsMHhCQSwweEUzLAotCTB4RjMsMHhGRSwweEMwLDB4OEEsMHhBRCwweEJDLDB4NDgsMHgwNCwKLQkweERGLDB4QzEsMHg3NSwweDYzLDB4MzAsMHgxQSwweDBFLDB4NkQsCi0JMHg0QywweDE0LDB4MzUsMHgyRiwweEUxLDB4QTIsMHhDQywweDM5LAotCTB4NTcsMHhGMiwweDgyLDB4NDcsMHhBQywweEU3LDB4MkIsMHg5NSwKLQkweEEwLDB4OTgsMHhEMSwweDdGLDB4NjYsMHg3RSwweEFCLDB4ODMsCi0JMHhDQSwweDI5LDB4RDMsMHgzQywweDc5LDB4RTIsMHgxRCwweDc2LAotCTB4M0IsMHg1NiwweDRFLDB4MUUsMHhEQiwweDBBLDB4NkMsMHhFNCwKLQkweDVELDB4NkUsMHhFRiwweEE2LDB4QTgsMHhBNCwweDM3LDB4OEIsCi0JMHgzMiwweDQzLDB4NTksMHhCNywweDhDLDB4NjQsMHhEMiwweEUwLAotCTB4QjQsMHhGQSwweDA3LDB4MjUsMHhBRiwweDhFLDB4RTksMHgxOCwKLQkweEQ1LDB4ODgsMHg2RiwweDcyLDB4MjQsMHhGMSwweEM3LDB4NTEsCi0JMHgyMywweDdDLDB4OUMsMHgyMSwweERELDB4REMsMHg4NiwweDg1LAotCTB4OTAsMHg0MiwweEM0LDB4QUEsMHhEOCwweDA1LDB4MDEsMHgxMiwKLQkweEEzLDB4NUYsMHhGOSwweEQwLDB4OTEsMHg1OCwweDI3LDB4QjksCi0JMHgzOCwweDEzLDB4QjMsMHgzMywweEJCLDB4NzAsMHg4OSwweEE3LAotCTB4QjYsMHgyMiwweDkyLDB4MjAsMHg0OSwweEZGLDB4NzgsMHg3QSwKLQkweDhGLDB4RjgsMHg4MCwweDE3LDB4REEsMHgzMSwweEM2LDB4QjgsCi0JMHhDMywweEIwLDB4NzcsMHgxMSwweENCLDB4RkMsMHhENiwweDNBCi19OwotCi1VSU5UIFRraXBfU2JveF9VcHBlclsyNTZdID0KLXsKLQkweEM2LDB4RjgsMHhFRSwweEY2LDB4RkYsMHhENiwweERFLDB4OTEsCi0JMHg2MCwweDAyLDB4Q0UsMHg1NiwweEU3LDB4QjUsMHg0RCwweEVDLAotCTB4OEYsMHgxRiwweDg5LDB4RkEsMHhFRiwweEIyLDB4OEUsMHhGQiwKLQkweDQxLDB4QjMsMHg1RiwweDQ1LDB4MjMsMHg1MywweEU0LDB4OUIsCi0JMHg3NSwweEUxLDB4M0QsMHg0QywweDZDLDB4N0UsMHhGNSwweDgzLAotCTB4NjgsMHg1MSwweEQxLDB4RjksMHhFMiwweEFCLDB4NjIsMHgyQSwKLQkweDA4LDB4OTUsMHg0NiwweDlELDB4MzAsMHgzNywweDBBLDB4MkYsCi0JMHgwRSwweDI0LDB4MUIsMHhERiwweENELDB4NEUsMHg3RiwweEVBLAotCTB4MTIsMHgxRCwweDU4LDB4MzQsMHgzNiwweERDLDB4QjQsMHg1QiwKLQkweEE0LDB4NzYsMHhCNywweDdELDB4NTIsMHhERCwweDVFLDB4MTMsCi0JMHhBNiwweEI5LDB4MDAsMHhDMSwweDQwLDB4RTMsMHg3OSwweEI2LAotCTB4RDQsMHg4RCwweDY3LDB4NzIsMHg5NCwweDk4LDB4QjAsMHg4NSwKLQkweEJCLDB4QzUsMHg0RiwweEVELDB4ODYsMHg5QSwweDY2LDB4MTEsCi0JMHg4QSwweEU5LDB4MDQsMHhGRSwweEEwLDB4NzgsMHgyNSwweDRCLAotCTB4QTIsMHg1RCwweDgwLDB4MDUsMHgzRiwweDIxLDB4NzAsMHhGMSwKLQkweDYzLDB4NzcsMHhBRiwweDQyLDB4MjAsMHhFNSwweEZELDB4QkYsCi0JMHg4MSwweDE4LDB4MjYsMHhDMywweEJFLDB4MzUsMHg4OCwweDJFLAotCTB4OTMsMHg1NSwweEZDLDB4N0EsMHhDOCwweEJBLDB4MzIsMHhFNiwKLQkweEMwLDB4MTksMHg5RSwweEEzLDB4NDQsMHg1NCwweDNCLDB4MEIsCi0JMHg4QywweEM3LDB4NkIsMHgyOCwweEE3LDB4QkMsMHgxNiwweEFELAotCTB4REIsMHg2NCwweDc0LDB4MTQsMHg5MiwweDBDLDB4NDgsMHhCOCwKLQkweDlGLDB4QkQsMHg0MywweEM0LDB4MzksMHgzMSwweEQzLDB4RjIsCi0JMHhENSwweDhCLDB4NkUsMHhEQSwweDAxLDB4QjEsMHg5QywweDQ5LAotCTB4RDgsMHhBQywweEYzLDB4Q0YsMHhDQSwweEY0LDB4NDcsMHgxMCwKLQkweDZGLDB4RjAsMHg0QSwweDVDLDB4MzgsMHg1NywweDczLDB4OTcsCi0JMHhDQiwweEExLDB4RTgsMHgzRSwweDk2LDB4NjEsMHgwRCwweDBGLAotCTB4RTAsMHg3QywweDcxLDB4Q0MsMHg5MCwweDA2LDB4RjcsMHgxQywKLQkweEMyLDB4NkEsMHhBRSwweDY5LDB4MTcsMHg5OSwweDNBLDB4MjcsCi0JMHhEOSwweEVCLDB4MkIsMHgyMiwweEQyLDB4QTksMHgwNywweDMzLAotCTB4MkQsMHgzQywweDE1LDB4QzksMHg4NywweEFBLDB4NTAsMHhBNSwKLQkweDAzLDB4NTksMHgwOSwweDFBLDB4NjUsMHhENywweDg0LDB4RDAsCi0JMHg4MiwweDI5LDB4NUEsMHgxRSwweDdCLDB4QTgsMHg2RCwweDJDCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKiogU0JPWCBUYWJsZSAqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVVDSEFSIFNib3hUYWJsZVsyNTZdID0KLXsKLQkweDYzLCAweDdjLCAweDc3LCAweDdiLCAweGYyLCAweDZiLCAweDZmLCAweGM1LAotCTB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYsCi0JMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCwKLQkweGFkLCAweGQ0LCAweGEyLCAweGFmLCAweDljLCAweGE0LCAweDcyLCAweGMwLAotCTB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MsCi0JMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNSwKLQkweDA0LCAweGM3LCAweDIzLCAweGMzLCAweDE4LCAweDk2LCAweDA1LCAweDlhLAotCTB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcsIDB4YjIsIDB4NzUsCi0JMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMCwKLQkweDUyLCAweDNiLCAweGQ2LCAweGIzLCAweDI5LCAweGUzLCAweDJmLCAweDg0LAotCTB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIsCi0JMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZiwKLQkweGQwLCAweGVmLCAweGFhLCAweGZiLCAweDQzLCAweDRkLCAweDMzLCAweDg1LAotCTB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgsCi0JMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNSwKLQkweGJjLCAweGI2LCAweGRhLCAweDIxLCAweDEwLCAweGZmLCAweGYzLCAweGQyLAotCTB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsIDB4NWYsIDB4OTcsIDB4NDQsIDB4MTcsCi0JMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3MywKLQkweDYwLCAweDgxLCAweDRmLCAweGRjLCAweDIyLCAweDJhLCAweDkwLCAweDg4LAotCTB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIsCi0JMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1YywKLQkweGMyLCAweGQzLCAweGFjLCAweDYyLCAweDkxLCAweDk1LCAweGU0LCAweDc5LAotCTB4ZTcsIDB4YzgsIDB4MzcsIDB4NmQsIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTksCi0JMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOCwKLQkweGJhLCAweDc4LCAweDI1LCAweDJlLCAweDFjLCAweGE2LCAweGI0LCAweGM2LAotCTB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQsIDB4OGIsIDB4OGEsCi0JMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZSwKLQkweDYxLCAweDM1LCAweDU3LCAweGI5LCAweDg2LCAweGMxLCAweDFkLCAweDllLAotCTB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQsCi0JMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZiwKLQkweDhjLCAweGExLCAweDg5LCAweDBkLCAweGJmLCAweGU2LCAweDQyLCAweDY4LAotCTB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTYKLX07Ci0KLVZPSUQgeG9yXzMyKAotCUlOICBQVUNIQVIgICAgICAgICAgICAgIGEsCi0JSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYiwKLQlPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOwotCi1WT0lEIHhvcl8xMjgoCi0JSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYSwKLQlJTiAgUFVDSEFSICAgICAgICAgICAgICBiLAotCU9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7Ci0KLVZPSUQgbmV4dF9rZXkoCi0JSU4gIFBVQ0hBUiAgICAgICAgICAgICAga2V5LAotCUlOICBJTlQgICAgICAgICAgICAgICAgIHJvdW5kKTsKLQotVk9JRCBieXRlX3N1YigKLQlJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKLQlPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOwotCi1WT0lEIHNoaWZ0X3JvdygKLQlJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKLQlPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOwotCi1WT0lEIG1peF9jb2x1bW4oCi0JSU4gIFBVQ0hBUiAgICAgICAgICAgICAgaW4sCi0JT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKLQotVUNIQVIgUlRNUENraXBTYm94KAotCUlOICBVQ0hBUiAgICAgICAgICAgICAgIGEpOwotLy8KLS8vIEV4cGFuZGVkIElWIGZvciBUS0lQIGZ1bmN0aW9uLgotLy8KLXR5cGVkZWYJc3RydWN0CVBBQ0tFRCBfSVZfQ09OVFJPTF8KLXsKLQl1bmlvbiBQQUNLRUQKLQl7Ci0JCXN0cnVjdCBQQUNLRUQKLQkJewotCQkJVUNIQVIJCXJjMDsKLQkJCVVDSEFSCQlyYzE7Ci0JCQlVQ0hBUgkJcmMyOwotCi0JCQl1bmlvbiBQQUNLRUQKLQkJCXsKLQkJCQlzdHJ1Y3QgUEFDS0VECi0JCQkJewotCQkJCQlVQ0hBUglSc3ZkOjU7Ci0JCQkJCVVDSEFSCUV4dElWOjE7Ci0JCQkJCVVDSEFSCUtleUlEOjI7Ci0JCQkJfQlmaWVsZDsKLQkJCQlVQ0hBUgkJQnl0ZTsKLQkJCX0JQ09OVFJPTDsKLQkJfQlmaWVsZDsKLQotCQlVTE9ORwl3b3JkOwotCX0JSVYxNjsKLQotCVVMT05HCUlWMzI7Ci19CVRLSVBfSVYsICpQVEtJUF9JVjsKLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJQ29udmVydCBmcm9tIFVDSEFSW10gdG8gVUxPTkcgaW4gYSBwb3J0YWJsZSB3YXkKLQotCUFyZ3VtZW50czoKLSAgICAgIHBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVUxPTkcJUlRNUFRraXBHZXRVSW50MzIoCi0JSU4JUFVDSEFSCXBNSUNLZXkpCi17Ci0JVUxPTkcJcmVzID0gMDsKLQlJTlQJCWk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCXsKLQkJcmVzIHw9ICgqcE1JQ0tleSsrKSA8PCAoOCAqIGkpOwotCX0KLQotCXJldHVybiByZXM7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlDb252ZXJ0IGZyb20gVUxPTkcgdG8gVUNIQVJbXSBpbiBhIHBvcnRhYmxlIHdheQotCi0JQXJndW1lbnRzOgotICAgICAgcERzdAkJCXBvaW50ZXIgdG8gZGVzdGluYXRpb24gZm9yIGNvbnZlcnQgVUxPTkcgdG8gVUNIQVJbXQotICAgICAgdmFsCQkJdGhlIHZhbHVlIGZvciBjb252ZXJ0Ci0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUFRraXBQdXRVSW50MzIoCi0JSU4gT1VUCVBVQ0hBUgkJcERzdCwKLQlJTgkJVUxPTkcJCXZhbCkKLXsKLQlJTlQgaTsKLQotCWZvcihpID0gMDsgaSA8IDQ7IGkrKykKLQl7Ci0JCSpwRHN0KysgPSAoVUNIQVIpICh2YWwgJiAweGZmKTsKLQkJdmFsID4+PSA4OwotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCVNldCB0aGUgTUlDIEtleS4KLQotCUFyZ3VtZW50czoKLSAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotICAgICAgcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5Ci0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUFRraXBTZXRNSUNLZXkoCi0JSU4JUFRLSVBfS0VZX0lORk8JcFRraXAsCi0JSU4JUFVDSEFSCQkJcE1JQ0tleSkKLXsKLQkvLyBTZXQgdGhlIGtleQotCXBUa2lwLT5LMCA9IFJUTVBUa2lwR2V0VUludDMyKHBNSUNLZXkpOwotCXBUa2lwLT5LMSA9IFJUTVBUa2lwR2V0VUludDMyKHBNSUNLZXkgKyA0KTsKLQkvLyBhbmQgcmVzZXQgdGhlIG1lc3NhZ2UKLQlwVGtpcC0+TCA9IHBUa2lwLT5LMDsKLQlwVGtpcC0+UiA9IHBUa2lwLT5LMTsKLQlwVGtpcC0+bkJ5dGVzSW5NID0gMDsKLQlwVGtpcC0+TSA9IDA7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlDYWxjdWxhdGUgdGhlIE1JQyBWYWx1ZS4KLQotCUFyZ3VtZW50czoKLSAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotICAgICAgdUNoYXIJCQlBcHBlbmQgdGhpcyB1Q2hhcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBUa2lwQXBwZW5kQnl0ZSgKLQlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCwKLQlJTglVQ0hBUiAJCQl1Q2hhcikKLXsKLQkvLyBBcHBlbmQgdGhlIGJ5dGUgdG8gb3VyIHdvcmQtc2l6ZWQgYnVmZmVyCi0JcFRraXAtPk0gfD0gKHVDaGFyIDw8ICg4KiBwVGtpcC0+bkJ5dGVzSW5NKSk7Ci0JcFRraXAtPm5CeXRlc0luTSsrOwotCS8vIFByb2Nlc3MgdGhlIHdvcmQgaWYgaXQgaXMgZnVsbC4KLQlpZiggcFRraXAtPm5CeXRlc0luTSA+PSA0ICkKLQl7Ci0JCXBUa2lwLT5MIF49IHBUa2lwLT5NOwotCQlwVGtpcC0+UiBePSBST0wzMiggcFRraXAtPkwsIDE3ICk7Ci0JCXBUa2lwLT5MICs9IHBUa2lwLT5SOwotCQlwVGtpcC0+UiBePSAoKHBUa2lwLT5MICYgMHhmZjAwZmYwMCkgPj4gOCkgfCAoKHBUa2lwLT5MICYgMHgwMGZmMDBmZikgPDwgOCk7Ci0JCXBUa2lwLT5MICs9IHBUa2lwLT5SOwotCQlwVGtpcC0+UiBePSBST0wzMiggcFRraXAtPkwsIDMgKTsKLQkJcFRraXAtPkwgKz0gcFRraXAtPlI7Ci0JCXBUa2lwLT5SIF49IFJPUjMyKCBwVGtpcC0+TCwgMiApOwotCQlwVGtpcC0+TCArPSBwVGtpcC0+UjsKLQkJLy8gQ2xlYXIgdGhlIGJ1ZmZlcgotCQlwVGtpcC0+TSA9IDA7Ci0JCXBUa2lwLT5uQnl0ZXNJbk0gPSAwOwotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUNhbGN1bGF0ZSB0aGUgTUlDIFZhbHVlLgotCi0JQXJndW1lbnRzOgotICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0gICAgICBwU3JjCQkJUG9pbnRlciB0byBzb3VyY2UgZGF0YSBmb3IgQ2FsY3VsYXRlIE1JQyBWYWx1ZQotICAgICAgTGVuCQkJSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgc291cmNlIGRhdGEKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QVGtpcEFwcGVuZCgKLQlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCwKLQlJTglQVUNIQVIJCQlwU3JjLAotCUlOCVVJTlQJCQluQnl0ZXMpCi17Ci0JLy8gVGhpcyBpcyBzaW1wbGUKLQl3aGlsZShuQnl0ZXMgPiAwKQotCXsKLQkJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAqcFNyYysrKTsKLQkJbkJ5dGVzLS07Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJR2V0IHRoZSBNSUMgVmFsdWUuCi0KLQlBcmd1bWVudHM6Ci0gICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCQl0aGUgTUlDIFZhbHVlIGlzIHN0b3JlIGluIHBBZC0+UHJpdmF0ZUluZm8uTUlDCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QVGtpcEdldE1JQygKLQlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCkKLXsKLQkvLyBBcHBlbmQgdGhlIG1pbmltdW0gcGFkZGluZwotCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMHg1YSApOwotCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOwotCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOwotCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOwotCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOwotCS8vIGFuZCB0aGVuIHplcm9lcyB1bnRpbCB0aGUgbGVuZ3RoIGlzIGEgbXVsdGlwbGUgb2YgNAotCXdoaWxlKCBwVGtpcC0+bkJ5dGVzSW5NICE9IDAgKQotCXsKLQkJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAwICk7Ci0JfQotCS8vIFRoZSBhcHBlbmRCeXRlIGZ1bmN0aW9uIGhhcyBhbHJlYWR5IGNvbXB1dGVkIHRoZSByZXN1bHQuCi0JUlRNUFRraXBQdXRVSW50MzIocFRraXAtPk1JQywgcFRraXAtPkwpOwotCVJUTVBUa2lwUHV0VUludDMyKHBUa2lwLT5NSUMgKyA0LCBwVGtpcC0+Uik7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlJbml0IFRraXAgZnVuY3Rpb24uCi0KLQlBcmd1bWVudHM6Ci0gICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcFRLZXkgICAgICAgUG9pbnRlciB0byB0aGUgVGVtcG9yYWwgS2V5IChUSyksIFRLIHNoYWxsIGJlIDEyOGJpdHMuCi0JCUtleUlkCQlUSyBLZXkgSUQKLQkJcFRBCQkJUG9pbnRlciB0byB0cmFuc21pdHRlciBhZGRyZXNzCi0JCXBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBJbml0VGtpcEVuZ2luZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwS2V5LAotCUlOCVVDSEFSCQkJS2V5SWQsCi0JSU4JUFVDSEFSCQkJcFRBLAotCUlOCVBVQ0hBUgkJCXBNSUNLZXksCi0JSU4JUFVDSEFSCQkJcFRTQywKLQlPVVQJUFVMT05HCQkJcElWMTYsCi0JT1VUCVBVTE9ORwkJCXBJVjMyKQotewotCVRLSVBfSVYJdGtpcEl2OwotCi0JLy8gUHJlcGFyZSA4IGJ5dGVzIFRLSVAgZW5jYXBzdWxhdGlvbiBmb3IgTVBEVQotCU5kaXNaZXJvTWVtb3J5KCZ0a2lwSXYsIHNpemVvZihUS0lQX0lWKSk7Ci0JdGtpcEl2LklWMTYuZmllbGQucmMwID0gKihwVFNDICsgMSk7Ci0JdGtpcEl2LklWMTYuZmllbGQucmMxID0gKHRraXBJdi5JVjE2LmZpZWxkLnJjMCB8IDB4MjApICYgMHg3ZjsKLQl0a2lwSXYuSVYxNi5maWVsZC5yYzIgPSAqcFRTQzsKLQl0a2lwSXYuSVYxNi5maWVsZC5DT05UUk9MLmZpZWxkLkV4dElWID0gMTsgIC8vIDA6IG5vbi1leHRlbmRlZCBJViwgMTogYW4gZXh0ZW5kZWQgSVYKLQl0a2lwSXYuSVYxNi5maWVsZC5DT05UUk9MLmZpZWxkLktleUlEID0gS2V5SWQ7Ci0JTmRpc01vdmVNZW1vcnkoJnRraXBJdi5JVjMyLCAocFRTQyArIDIpLCA0KTsgICAvLyBDb3B5IElWCi0KLQkqcElWMTYgPSB0a2lwSXYuSVYxNi53b3JkOwotCSpwSVYzMiA9IHRraXBJdi5JVjMyOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJSW5pdCBNSUMgVmFsdWUgY2FsY3VsYXRpb24gZnVuY3Rpb24gd2hpY2ggaW5jbHVkZSBzZXQgTUlDIGtleSAmCi0JCWNhbGN1bGF0ZSBmaXJzdCAxNiBieXRlcyAoREEgKyBTQSArIHByaW9yaXR5ICsgIDApCi0KLQlBcmd1bWVudHM6Ci0gICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcFRLZXkgICAgICAgUG9pbnRlciB0byB0aGUgVGVtcG9yYWwgS2V5IChUSyksIFRLIHNoYWxsIGJlIDEyOGJpdHMuCi0JCXBEQQkJCVBvaW50ZXIgdG8gREEgYWRkcmVzcwotCQlwU0EJCQlQb2ludGVyIHRvIFNBIGFkZHJlc3MKLQkJcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5Ci0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBJbml0TUlDRW5naW5lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBLZXksCi0JSU4JUFVDSEFSCQkJcERBLAotCUlOCVBVQ0hBUgkJCXBTQSwKLQlJTiAgVUNIQVIgICAgICAgICAgIFVzZXJQcmlvcml0eSwKLQlJTglQVUNIQVIJCQlwTUlDS2V5KQotewotCVVMT05HIFByaW9yaXR5ID0gVXNlclByaW9yaXR5OwotCi0JLy8gSW5pdCBNSUMgdmFsdWUgY2FsY3VsYXRpb24KLQlSVE1QVGtpcFNldE1JQ0tleSgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcE1JQ0tleSk7Ci0JLy8gREEKLQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcERBLCBNQUNfQUREUl9MRU4pOwotCS8vIFNBCi0JUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBTQSwgTUFDX0FERFJfTEVOKTsKLQkvLyBQcmlvcml0eSArIDMgYnl0ZXMgb2YgMAotCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCAoUFVDSEFSKSZQcmlvcml0eSwgNCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlDb21wYXJlIE1JQyB2YWx1ZSBvZiByZWNlaXZlZCBNU0RVCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHJlY2VpdmVkIFBsYWluIHRleHQgZGF0YQotCQlwREEJCQlQb2ludGVyIHRvIERBIGFkZHJlc3MKLQkJcFNBCQkJUG9pbnRlciB0byBTQSBhZGRyZXNzCi0JCXBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQotCQlMZW4gICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSByZWNlaXZlZCBwbGFpbiB0ZXh0IGRhdGEgZXhjbHVkZSBNSUMgdmFsdWUKLQotCVJldHVybiBWYWx1ZToKLQkJVFJVRSAgICAgICAgTUlDIHZhbHVlIG1hdGNoZWQKLQkJRkFMU0UgICAgICAgTUlDIHZhbHVlIG1pc21hdGNoZWQKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4JUlRNUFRraXBDb21wYXJlTUlDVmFsdWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcFNyYywKLQlJTglQVUNIQVIJCQlwREEsCi0JSU4JUFVDSEFSCQkJcFNBLAotCUlOCVBVQ0hBUgkJCXBNSUNLZXksCi0JSU4JVUNIQVIJCQlVc2VyUHJpb3JpdHksCi0JSU4JVUlOVAkJCUxlbikKLXsKLQlVQ0hBUglPbGRNaWNbOF07Ci0JVUxPTkcJUHJpb3JpdHkgPSBVc2VyUHJpb3JpdHk7Ci0KLQkvLyBJbml0IE1JQyB2YWx1ZSBjYWxjdWxhdGlvbgotCVJUTVBUa2lwU2V0TUlDS2V5KCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwTUlDS2V5KTsKLQkvLyBEQQotCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwREEsIE1BQ19BRERSX0xFTik7Ci0JLy8gU0EKLQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcFNBLCBNQUNfQUREUl9MRU4pOwotCS8vIFByaW9yaXR5ICsgMyBieXRlcyBvZiAwCi0JUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIChQVUNIQVIpJlByaW9yaXR5LCA0KTsKLQotCS8vIENhbGN1bGF0ZSBNSUMgdmFsdWUgZnJvbSBwbGFpbiB0ZXh0IGRhdGEKLQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcFNyYywgTGVuKTsKLQotCS8vIEdldCBNSUMgdmFsdWRlIGZyb20gcmVjZWl2ZWQgZnJhbWUKLQlOZGlzTW92ZU1lbW9yeShPbGRNaWMsIHBTcmMgKyBMZW4sIDgpOwotCi0JLy8gR2V0IE1JQyB2YWx1ZSBmcm9tIGRlY3J5cHRlZCBwbGFpbiBkYXRhCi0JUlRNUFRraXBHZXRNSUMoJnBBZC0+UHJpdmF0ZUluZm8uUngpOwotCi0JLy8gTW92ZSBNSUMgdmFsdWUgZnJvbSBNU0RVLCB0aGlzIHN0ZXBzIHNob3VsZCBtb3ZlIHRvIGRhdGEgcGF0aC4KLQkvLyBTaW5jZSB0aGUgTUlDIHZhbHVlIG1pZ2h0IGNyb3NzIE1QRFVzLgotCWlmKCFOZGlzRXF1YWxNZW1vcnkocEFkLT5Qcml2YXRlSW5mby5SeC5NSUMsIE9sZE1pYywgOCkpCi0JewotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUlRNUFRraXBDb21wYXJlTUlDVmFsdWUoKTogVEtJUCBNSUMgRXJyb3IgIVxuIikpOyAgLy9NSUMgZXJyb3IuCi0KLQotCQlyZXR1cm4gKEZBTFNFKTsKLQl9Ci0JcmV0dXJuIChUUlVFKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUNvbXBhcmUgTUlDIHZhbHVlIG9mIHJlY2VpdmVkIE1TRFUKLQotCUFyZ3VtZW50czoKLQkJcEFkCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcExMQwkJTExDIGhlYWRlcgotCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSByZWNlaXZlZCBQbGFpbiB0ZXh0IGRhdGEKLQkJcERBCQkJUG9pbnRlciB0byBEQSBhZGRyZXNzCi0JCXBTQQkJCVBvaW50ZXIgdG8gU0EgYWRkcmVzcwotCQlwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKLQkJTGVuICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgcmVjZWl2ZWQgcGxhaW4gdGV4dCBkYXRhIGV4Y2x1ZGUgTUlDIHZhbHVlCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCVRSVUUgICAgICAgIE1JQyB2YWx1ZSBtYXRjaGVkCi0JCUZBTFNFICAgICAgIE1JQyB2YWx1ZSBtaXNtYXRjaGVkCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1CT09MRUFOCVJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlV2l0aExMQygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwTExDLAotCUlOCVBVQ0hBUgkJCXBTcmMsCi0JSU4JUFVDSEFSCQkJcERBLAotCUlOCVBVQ0hBUgkJCXBTQSwKLQlJTglQVUNIQVIJCQlwTUlDS2V5LAotCUlOCVVJTlQJCQlMZW4pCi17Ci0JVUNIQVIJT2xkTWljWzhdOwotCVVMT05HCVByaW9yaXR5ID0gMDsKLQotCS8vIEluaXQgTUlDIHZhbHVlIGNhbGN1bGF0aW9uCi0JUlRNUFRraXBTZXRNSUNLZXkoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBNSUNLZXkpOwotCS8vIERBCi0JUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBEQSwgTUFDX0FERFJfTEVOKTsKLQkvLyBTQQotCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwU0EsIE1BQ19BRERSX0xFTik7Ci0JLy8gUHJpb3JpdHkgKyAzIGJ5dGVzIG9mIDAKLQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgKFBVQ0hBUikmUHJpb3JpdHksIDQpOwotCi0JLy8gU3RhcnQgd2l0aCBMTEMgaGVhZGVyCi0JUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBMTEMsIDgpOwotCi0JLy8gQ2FsY3VsYXRlIE1JQyB2YWx1ZSBmcm9tIHBsYWluIHRleHQgZGF0YQotCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwU3JjLCBMZW4pOwotCi0JLy8gR2V0IE1JQyB2YWx1ZGUgZnJvbSByZWNlaXZlZCBmcmFtZQotCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcFNyYyArIExlbiwgOCk7Ci0KLQkvLyBHZXQgTUlDIHZhbHVlIGZyb20gZGVjcnlwdGVkIHBsYWluIGRhdGEKLQlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5SeCk7Ci0KLQkvLyBNb3ZlIE1JQyB2YWx1ZSBmcm9tIE1TRFUsIHRoaXMgc3RlcHMgc2hvdWxkIG1vdmUgdG8gZGF0YSBwYXRoLgotCS8vIFNpbmNlIHRoZSBNSUMgdmFsdWUgbWlnaHQgY3Jvc3MgTVBEVXMuCi0JaWYoIU5kaXNFcXVhbE1lbW9yeShwQWQtPlByaXZhdGVJbmZvLlJ4Lk1JQywgT2xkTWljLCA4KSkKLQl7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZVdpdGhMTEMoKTogVEtJUCBNSUMgRXJyb3IgIVxuIikpOyAgLy9NSUMgZXJyb3IuCi0KLQotCQlyZXR1cm4gKEZBTFNFKTsKLQl9Ci0JcmV0dXJuIChUUlVFKTsKLX0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlDb3B5IGZyYW1lIGZyb20gd2FpdGluZyBxdWV1ZSBpbnRvIHJlbGF0aXZlIHJpbmcgYnVmZmVyIGFuZCBzZXQKLQlhcHByb3ByaWF0ZSBBU0lDIHJlZ2lzdGVyIHRvIGtpY2sgaGFyZHdhcmUgdHJhbnNtaXQgZnVuY3Rpb24KLQotCUFyZ3VtZW50czoKLQkJcEFkCQlQb2ludGVyCXRvIG91ciBhZGFwdGVyCi0JCVBORElTX1BBQ0tFVAlQb2ludGVyIHRvIE5kaXMgUGFja2V0IGZvciBNSUMgY2FsY3VsYXRpb24KLQkJcEVuY2FwCQkJUG9pbnRlciB0byBMTEMgZW5jYXAgZGF0YQotCQlMZW5FbmNhcAkJVG90YWwgZW5jYXAgbGVuZ3RoLCBtaWdodCBiZSAwIHdoaWNoIGluZGljYXRlcyBubyBlbmNhcAotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBDYWxjdWxhdGVNSUNWYWx1ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKLQlJTglQVUNIQVIJCQlwRW5jYXAsCi0JSU4JUENJUEhFUl9LRVkJCXBLZXksCi0JSU4JVUNIQVIJCQlhcGlkeCkKLXsKLQlQQUNLRVRfSU5GTwkJUGFja2V0SW5mbzsKLQlQVUNIQVIJCQlwU3JjQnVmVkE7Ci0JVUlOVAkJCVNyY0J1ZkxlbjsKLQlQVUNIQVIJCQlwU3JjOwotICAgIFVDSEFSICAgICAgICAgICBVc2VyUHJpb3JpdHk7Ci0JVUNIQVIJCQl2bGFuX29mZnNldCA9IDA7Ci0KLQlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7Ci0KLQlVc2VyUHJpb3JpdHkgPSBSVE1QX0dFVF9QQUNLRVRfVVAocFBhY2tldCk7Ci0JcFNyYyA9IHBTcmNCdWZWQTsKLQotCS8vIGRldGVybWluZSBpZiB0aGlzIGlzIGEgdmxhbiBwYWNrZXQKLQlpZiAoKCgqKHBTcmMgKyAxMikgPDwgOCkgKyAqKHBTcmMgKyAxMykpID09IDB4ODEwMCkKLQkJdmxhbl9vZmZzZXQgPSA0OwotCi0JewotCQlSVE1QSW5pdE1JQ0VuZ2luZSgKLQkJCXBBZCwKLQkJCXBLZXktPktleSwKLQkJCXBTcmMsCi0JCQlwU3JjICsgNiwKLQkJCVVzZXJQcmlvcml0eSwKLQkJCXBLZXktPlR4TWljKTsKLQl9Ci0KLQotCWlmIChwRW5jYXAgIT0gTlVMTCkKLQl7Ci0JCS8vIExMQyBlbmNhcHN1bGF0aW9uCi0JCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwRW5jYXAsIDYpOwotCQkvLyBQcm90b2NvbCBUeXBlCi0JCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwU3JjICsgMTIgKyB2bGFuX29mZnNldCwgMik7Ci0JfQotCVNyY0J1ZkxlbiAtPSAoMTQgKyB2bGFuX29mZnNldCk7Ci0JcFNyYyArPSAoMTQgKyB2bGFuX29mZnNldCk7Ci0JZG8KLQl7Ci0JCWlmIChTcmNCdWZMZW4gPiAwKQotCQl7Ci0JCQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcFNyYywgU3JjQnVmTGVuKTsKLQkJfQotCi0JCWJyZWFrOwkvLyBObyBuZWVkIGhhbmRsZSBuZXh0IHBhY2tldAotCi0JfQl3aGlsZSAoVFJVRSk7CQkvLyBFbmQgb2YgY29weWluZyBwYXlsb2FkCi0KLQkvLyBDb21wdXRlIHRoZSBmaW5hbCBNSUMgVmFsdWUKLQlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5UeCk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIHRraXBfc2JveCgpCQkJCQkJCQkJCQkJCQkJCSovCi0vKiBSZXR1cm5zIGEgMTYgYml0IHZhbHVlIGZyb20gYSA2NEsgZW50cnkgdGFibGUuIFRoZSBUYWJsZSAqLwotLyogaXMgc3ludGhlc2l6ZWQgZnJvbSB0d28gMjU2IGVudHJ5IGJ5dGUgd2lkZSB0YWJsZXMuCQkqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotVUlOVCB0a2lwX3Nib3goVUlOVCBpbmRleCkKLXsKLQlVSU5UIGluZGV4X2xvdzsKLQlVSU5UIGluZGV4X2hpZ2g7Ci0JVUlOVCBsZWZ0LCByaWdodDsKLQotCWluZGV4X2xvdyA9IChpbmRleCAlIDI1Nik7Ci0JaW5kZXhfaGlnaCA9ICgoaW5kZXggPj4gOCkgJSAyNTYpOwotCi0JbGVmdCA9IFRraXBfU2JveF9Mb3dlcltpbmRleF9sb3ddICsgKFRraXBfU2JveF9VcHBlcltpbmRleF9sb3ddICogMjU2KTsKLQlyaWdodCA9IFRraXBfU2JveF9VcHBlcltpbmRleF9oaWdoXSArIChUa2lwX1Nib3hfTG93ZXJbaW5kZXhfaGlnaF0gKiAyNTYpOwotCi0JcmV0dXJuIChsZWZ0IF4gcmlnaHQpOwotfQotCi1VSU5UIHJvdHIxKFVJTlQgYSkKLXsKLQl1bnNpZ25lZCBpbnQgYjsKLQotCWlmICgoYSAmIDB4MDEpID09IDB4MDEpCi0JewotCQliID0gKGEgPj4gMSkgfCAweDgwMDA7Ci0JfQotCWVsc2UKLQl7Ci0JCWIgPSAoYSA+PiAxKSAmIDB4N2ZmZjsKLQl9Ci0JYiA9IGIgJSA2NTUzNjsKLQlyZXR1cm4gYjsKLX0KLQotVk9JRCBSVE1QVGtpcE1peEtleSgKLQlVQ0hBUiAqa2V5LAotCVVDSEFSICp0YSwKLQlVTE9ORyBwbmwsIC8qIExlYXN0IHNpZ25pZmljYW50IDE2IGJpdHMgb2YgUE4gKi8KLQlVTE9ORyBwbmgsIC8qIE1vc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyBvZiBQTiAqLwotCVVDSEFSICpyYzRrZXksCi0JVUlOVCAqcDFrKQotewotCi0JVUlOVCB0c2MwOwotCVVJTlQgdHNjMTsKLQlVSU5UIHRzYzI7Ci0KLQlVSU5UIHBwazA7Ci0JVUlOVCBwcGsxOwotCVVJTlQgcHBrMjsKLQlVSU5UIHBwazM7Ci0JVUlOVCBwcGs0OwotCVVJTlQgcHBrNTsKLQotCUlOVCBpOwotCUlOVCBqOwotCi0JdHNjMCA9ICh1bnNpZ25lZCBpbnQpKChwbmggPj4gMTYpICUgNjU1MzYpOyAvKiBtc2IgKi8KLQl0c2MxID0gKHVuc2lnbmVkIGludCkocG5oICUgNjU1MzYpOwotCXRzYzIgPSAodW5zaWduZWQgaW50KShwbmwgJSA2NTUzNik7IC8qIGxzYiAqLwotCi0JLyogUGhhc2UgMSwgc3RlcCAxICovCi0JcDFrWzBdID0gdHNjMTsKLQlwMWtbMV0gPSB0c2MwOwotCXAxa1syXSA9IChVSU5UKSh0YVswXSArICh0YVsxXSoyNTYpKTsKLQlwMWtbM10gPSAoVUlOVCkodGFbMl0gKyAodGFbM10qMjU2KSk7Ci0JcDFrWzRdID0gKFVJTlQpKHRhWzRdICsgKHRhWzVdKjI1NikpOwotCi0JLyogUGhhc2UgMSwgc3RlcCAyICovCi0JZm9yIChpPTA7IGk8ODsgaSsrKQotCXsKLQkJaiA9IDIqKGkgJiAxKTsKLQkJcDFrWzBdID0gKHAxa1swXSArIHRraXBfc2JveCggKHAxa1s0XSBeICgoMjU2KmtleVsxK2pdKSArIGtleVtqXSkpICUgNjU1MzYgKSkgJSA2NTUzNjsKLQkJcDFrWzFdID0gKHAxa1sxXSArIHRraXBfc2JveCggKHAxa1swXSBeICgoMjU2KmtleVs1K2pdKSArIGtleVs0K2pdKSkgJSA2NTUzNiApKSAlIDY1NTM2OwotCQlwMWtbMl0gPSAocDFrWzJdICsgdGtpcF9zYm94KCAocDFrWzFdIF4gKCgyNTYqa2V5Wzkral0pICsga2V5Wzgral0pKSAlIDY1NTM2ICkpICUgNjU1MzY7Ci0JCXAxa1szXSA9IChwMWtbM10gKyB0a2lwX3Nib3goIChwMWtbMl0gXiAoKDI1NiprZXlbMTMral0pICsga2V5WzEyK2pdKSkgJSA2NTUzNiApKSAlIDY1NTM2OwotCQlwMWtbNF0gPSAocDFrWzRdICsgdGtpcF9zYm94KCAocDFrWzNdIF4gKCgoMjU2KmtleVsxK2pdKSArIGtleVtqXSkpKSAlIDY1NTM2ICkpICUgNjU1MzY7Ci0JCXAxa1s0XSA9IChwMWtbNF0gKyBpKSAlIDY1NTM2OwotCX0KLQotCS8qIFBoYXNlIDIsIFN0ZXAgMSAqLwotCXBwazAgPSBwMWtbMF07Ci0JcHBrMSA9IHAxa1sxXTsKLQlwcGsyID0gcDFrWzJdOwotCXBwazMgPSBwMWtbM107Ci0JcHBrNCA9IHAxa1s0XTsKLQlwcGs1ID0gKHAxa1s0XSArIHRzYzIpICUgNjU1MzY7Ci0KLQkvKiBQaGFzZTIsIFN0ZXAgMiAqLwotCXBwazAgPSBwcGswICsgdGtpcF9zYm94KCAocHBrNSBeICgoMjU2KmtleVsxXSkgKyBrZXlbMF0pKSAlIDY1NTM2KTsKLQlwcGsxID0gcHBrMSArIHRraXBfc2JveCggKHBwazAgXiAoKDI1NiprZXlbM10pICsga2V5WzJdKSkgJSA2NTUzNik7Ci0JcHBrMiA9IHBwazIgKyB0a2lwX3Nib3goIChwcGsxIF4gKCgyNTYqa2V5WzVdKSArIGtleVs0XSkpICUgNjU1MzYpOwotCXBwazMgPSBwcGszICsgdGtpcF9zYm94KCAocHBrMiBeICgoMjU2KmtleVs3XSkgKyBrZXlbNl0pKSAlIDY1NTM2KTsKLQlwcGs0ID0gcHBrNCArIHRraXBfc2JveCggKHBwazMgXiAoKDI1NiprZXlbOV0pICsga2V5WzhdKSkgJSA2NTUzNik7Ci0JcHBrNSA9IHBwazUgKyB0a2lwX3Nib3goIChwcGs0IF4gKCgyNTYqa2V5WzExXSkgKyBrZXlbMTBdKSkgJSA2NTUzNik7Ci0KLQlwcGswID0gcHBrMCArIHJvdHIxKHBwazUgXiAoKDI1NiprZXlbMTNdKSArIGtleVsxMl0pKTsKLQlwcGsxID0gcHBrMSArIHJvdHIxKHBwazAgXiAoKDI1NiprZXlbMTVdKSArIGtleVsxNF0pKTsKLQlwcGsyID0gcHBrMiArIHJvdHIxKHBwazEpOwotCXBwazMgPSBwcGszICsgcm90cjEocHBrMik7Ci0JcHBrNCA9IHBwazQgKyByb3RyMShwcGszKTsKLQlwcGs1ID0gcHBrNSArIHJvdHIxKHBwazQpOwotCi0JLyogUGhhc2UgMiwgU3RlcCAzICovCi0gICAgLyogUGhhc2UgMiwgU3RlcCAzICovCi0KLQl0c2MwID0gKHVuc2lnbmVkIGludCkoKHBuaCA+PiAxNikgJSA2NTUzNik7IC8qIG1zYiAqLwotCXRzYzEgPSAodW5zaWduZWQgaW50KShwbmggJSA2NTUzNik7Ci0JdHNjMiA9ICh1bnNpZ25lZCBpbnQpKHBubCAlIDY1NTM2KTsgLyogbHNiICovCi0KLQlyYzRrZXlbMF0gPSAodHNjMiA+PiA4KSAlIDI1NjsKLQlyYzRrZXlbMV0gPSAoKCh0c2MyID4+IDgpICUgMjU2KSB8IDB4MjApICYgMHg3ZjsKLQlyYzRrZXlbMl0gPSB0c2MyICUgMjU2OwotCXJjNGtleVszXSA9ICgocHBrNSBeICgoMjU2KmtleVsxXSkgKyBrZXlbMF0pKSA+PiAxKSAlIDI1NjsKLQotCXJjNGtleVs0XSA9IHBwazAgJSAyNTY7Ci0JcmM0a2V5WzVdID0gKHBwazAgPj4gOCkgJSAyNTY7Ci0KLQlyYzRrZXlbNl0gPSBwcGsxICUgMjU2OwotCXJjNGtleVs3XSA9IChwcGsxID4+IDgpICUgMjU2OwotCi0JcmM0a2V5WzhdID0gcHBrMiAlIDI1NjsKLQlyYzRrZXlbOV0gPSAocHBrMiA+PiA4KSAlIDI1NjsKLQotCXJjNGtleVsxMF0gPSBwcGszICUgMjU2OwotCXJjNGtleVsxMV0gPSAocHBrMyA+PiA4KSAlIDI1NjsKLQotCXJjNGtleVsxMl0gPSBwcGs0ICUgMjU2OwotCXJjNGtleVsxM10gPSAocHBrNCA+PiA4KSAlIDI1NjsKLQotCXJjNGtleVsxNF0gPSBwcGs1ICUgMjU2OwotCXJjNGtleVsxNV0gPSAocHBrNSA+PiA4KSAlIDI1NjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogY29uc3RydWN0X21pY19oZWFkZXIxKCkgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEJ1aWxkcyB0aGUgZmlyc3QgTUlDIGhlYWRlciBibG9jayBmcm9tICAgICAgICovCi0vKiBoZWFkZXIgZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBjb25zdHJ1Y3RfbWljX2hlYWRlcjEoCi0JdW5zaWduZWQgY2hhciAqbWljX2hlYWRlcjEsCi0JaW50IGhlYWRlcl9sZW5ndGgsCi0JdW5zaWduZWQgY2hhciAqbXBkdSkKLXsKLQltaWNfaGVhZGVyMVswXSA9ICh1bnNpZ25lZCBjaGFyKSgoaGVhZGVyX2xlbmd0aCAtIDIpIC8gMjU2KTsKLQltaWNfaGVhZGVyMVsxXSA9ICh1bnNpZ25lZCBjaGFyKSgoaGVhZGVyX2xlbmd0aCAtIDIpICUgMjU2KTsKLQltaWNfaGVhZGVyMVsyXSA9IG1wZHVbMF0gJiAweGNmOyAgICAvKiBNdXRlIENGIHBvbGwgJiBDRiBhY2sgYml0cyAqLwotCW1pY19oZWFkZXIxWzNdID0gbXBkdVsxXSAmIDB4Yzc7ICAgIC8qIE11dGUgcmV0cnksIG1vcmUgZGF0YSBhbmQgcHdyIG1ndCBiaXRzICovCi0JbWljX2hlYWRlcjFbNF0gPSBtcGR1WzRdOyAgICAgICAvKiBBMSAqLwotCW1pY19oZWFkZXIxWzVdID0gbXBkdVs1XTsKLQltaWNfaGVhZGVyMVs2XSA9IG1wZHVbNl07Ci0JbWljX2hlYWRlcjFbN10gPSBtcGR1WzddOwotCW1pY19oZWFkZXIxWzhdID0gbXBkdVs4XTsKLQltaWNfaGVhZGVyMVs5XSA9IG1wZHVbOV07Ci0JbWljX2hlYWRlcjFbMTBdID0gbXBkdVsxMF07ICAgICAvKiBBMiAqLwotCW1pY19oZWFkZXIxWzExXSA9IG1wZHVbMTFdOwotCW1pY19oZWFkZXIxWzEyXSA9IG1wZHVbMTJdOwotCW1pY19oZWFkZXIxWzEzXSA9IG1wZHVbMTNdOwotCW1pY19oZWFkZXIxWzE0XSA9IG1wZHVbMTRdOwotCW1pY19oZWFkZXIxWzE1XSA9IG1wZHVbMTVdOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogY29uc3RydWN0X21pY19oZWFkZXIyKCkgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEJ1aWxkcyB0aGUgbGFzdCBNSUMgaGVhZGVyIGJsb2NrIGZyb20gICAgICAgICovCi0vKiBoZWFkZXIgZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBjb25zdHJ1Y3RfbWljX2hlYWRlcjIoCi0JdW5zaWduZWQgY2hhciAqbWljX2hlYWRlcjIsCi0JdW5zaWduZWQgY2hhciAqbXBkdSwKLQlpbnQgYTRfZXhpc3RzLAotCWludCBxY19leGlzdHMpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpPDE2OyBpKyspIG1pY19oZWFkZXIyW2ldPTB4MDA7Ci0KLQltaWNfaGVhZGVyMlswXSA9IG1wZHVbMTZdOyAgICAvKiBBMyAqLwotCW1pY19oZWFkZXIyWzFdID0gbXBkdVsxN107Ci0JbWljX2hlYWRlcjJbMl0gPSBtcGR1WzE4XTsKLQltaWNfaGVhZGVyMlszXSA9IG1wZHVbMTldOwotCW1pY19oZWFkZXIyWzRdID0gbXBkdVsyMF07Ci0JbWljX2hlYWRlcjJbNV0gPSBtcGR1WzIxXTsKLQotCS8vIEluIFNlcXVlbmNlIENvbnRyb2wgZmllbGQsIG11dGUgc2VxdWVuY2UgbnVtZXIgYml0cyAoMTItYml0KQotCW1pY19oZWFkZXIyWzZdID0gbXBkdVsyMl0gJiAweDBmOyAgIC8qIFNDICovCi0JbWljX2hlYWRlcjJbN10gPSAweDAwOyAvKiBtcGR1WzIzXTsgKi8KLQotCWlmICgoIXFjX2V4aXN0cykgJiBhNF9leGlzdHMpCi0JewotCQlmb3IgKGk9MDtpPDY7aSsrKSBtaWNfaGVhZGVyMls4K2ldID0gbXBkdVsyNCtpXTsgICAvKiBBNCAqLwotCi0JfQotCi0JaWYgKHFjX2V4aXN0cyAmJiAoIWE0X2V4aXN0cykpCi0JewotCQltaWNfaGVhZGVyMls4XSA9IG1wZHVbMjRdICYgMHgwZjsgLyogbXV0ZSBiaXRzIDE1IC0gNCAqLwotCQltaWNfaGVhZGVyMls5XSA9IG1wZHVbMjVdICYgMHgwMDsKLQl9Ci0KLQlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykKLQl7Ci0JCWZvciAoaT0wO2k8NjtpKyspIG1pY19oZWFkZXIyWzgraV0gPSBtcGR1WzI0K2ldOyAgIC8qIEE0ICovCi0KLQkJbWljX2hlYWRlcjJbMTRdID0gbXBkdVszMF0gJiAweDBmOwotCQltaWNfaGVhZGVyMlsxNV0gPSBtcGR1WzMxXSAmIDB4MDA7Ci0JfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBjb25zdHJ1Y3RfbWljX2l2KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQnVpbGRzIHRoZSBNSUMgSVYgZnJvbSBoZWFkZXIgZmllbGRzIGFuZCBQTiAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgY29uc3RydWN0X21pY19pdigKLQl1bnNpZ25lZCBjaGFyICptaWNfaXYsCi0JaW50IHFjX2V4aXN0cywKLQlpbnQgYTRfZXhpc3RzLAotCXVuc2lnbmVkIGNoYXIgKm1wZHUsCi0JdW5zaWduZWQgaW50IHBheWxvYWRfbGVuZ3RoLAotCXVuc2lnbmVkIGNoYXIgKnBuX3ZlY3RvcikKLXsKLQlpbnQgaTsKLQotCW1pY19pdlswXSA9IDB4NTk7Ci0JaWYgKHFjX2V4aXN0cyAmJiBhNF9leGlzdHMpCi0JCW1pY19pdlsxXSA9IG1wZHVbMzBdICYgMHgwZjsgICAgLyogUW9TX1RDICAgICAgICAgICAqLwotCWlmIChxY19leGlzdHMgJiYgIWE0X2V4aXN0cykKLQkJbWljX2l2WzFdID0gbXBkdVsyNF0gJiAweDBmOyAgIC8qIG11dGUgYml0cyA3LTQgICAgKi8KLQlpZiAoIXFjX2V4aXN0cykKLQkJbWljX2l2WzFdID0gMHgwMDsKLQlmb3IgKGkgPSAyOyBpIDwgODsgaSsrKQotCQltaWNfaXZbaV0gPSBtcGR1W2kgKyA4XTsgICAgICAgICAgICAgICAgICAgIC8qIG1pY19pdlsyOjddID0gQTJbMDo1XSA9IG1wZHVbMTA6MTVdICovCi0jaWZkZWYgQ09OU0lTVEVOVF9QTl9PUkRFUgotCQlmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKLQkJCW1pY19pdltpXSA9IHBuX3ZlY3RvcltpIC0gOF07ICAgICAgICAgICAvKiBtaWNfaXZbODoxM10gPSBQTlswOjVdICovCi0jZWxzZQotCQlmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKLQkJCW1pY19pdltpXSA9IHBuX3ZlY3RvclsxMyAtIGldOyAgICAgICAgICAvKiBtaWNfaXZbODoxM10gPSBQTls1OjBdICovCi0jZW5kaWYKLQlpID0gKHBheWxvYWRfbGVuZ3RoIC8gMjU2KTsKLQlpID0gKHBheWxvYWRfbGVuZ3RoICUgMjU2KTsKLQltaWNfaXZbMTRdID0gKHVuc2lnbmVkIGNoYXIpIChwYXlsb2FkX2xlbmd0aCAvIDI1Nik7Ci0JbWljX2l2WzE1XSA9ICh1bnNpZ25lZCBjaGFyKSAocGF5bG9hZF9sZW5ndGggJSAyNTYpOwotCi19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogYml0d2lzZV94b3IoKSAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEEgMTI4IGJpdCwgYml0d2lzZSBleGNsdXNpdmUgb3IgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGJpdHdpc2VfeG9yKHVuc2lnbmVkIGNoYXIgKmluYSwgdW5zaWduZWQgY2hhciAqaW5iLCB1bnNpZ25lZCBjaGFyICpvdXQpCi17Ci0JaW50IGk7Ci0JZm9yIChpPTA7IGk8MTY7IGkrKykKLQl7Ci0JCW91dFtpXSA9IGluYVtpXSBeIGluYltpXTsKLQl9Ci19Ci0KLQotdm9pZCBhZXMxMjhrMTI4ZCh1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGNoYXIgKmNpcGhlcnRleHQpCi17Ci0JaW50IHJvdW5kOwotCWludCBpOwotCXVuc2lnbmVkIGNoYXIgaW50ZXJtZWRpYXRlYVsxNl07Ci0JdW5zaWduZWQgY2hhciBpbnRlcm1lZGlhdGViWzE2XTsKLQl1bnNpZ25lZCBjaGFyIHJvdW5kX2tleVsxNl07Ci0KLQlmb3IoaT0wOyBpPDE2OyBpKyspIHJvdW5kX2tleVtpXSA9IGtleVtpXTsKLQotCWZvciAocm91bmQgPSAwOyByb3VuZCA8IDExOyByb3VuZCsrKQotCXsKLQkJaWYgKHJvdW5kID09IDApCi0JCXsKLQkJCXhvcl8xMjgocm91bmRfa2V5LCBkYXRhLCBjaXBoZXJ0ZXh0KTsKLQkJCW5leHRfa2V5KHJvdW5kX2tleSwgcm91bmQpOwotCQl9Ci0JCWVsc2UgaWYgKHJvdW5kID09IDEwKQotCQl7Ci0JCQlieXRlX3N1YihjaXBoZXJ0ZXh0LCBpbnRlcm1lZGlhdGVhKTsKLQkJCXNoaWZ0X3JvdyhpbnRlcm1lZGlhdGVhLCBpbnRlcm1lZGlhdGViKTsKLQkJCXhvcl8xMjgoaW50ZXJtZWRpYXRlYiwgcm91bmRfa2V5LCBjaXBoZXJ0ZXh0KTsKLQkJfQotCQllbHNlICAgIC8qIDEgLSA5ICovCi0JCXsKLQkJCWJ5dGVfc3ViKGNpcGhlcnRleHQsIGludGVybWVkaWF0ZWEpOwotCQkJc2hpZnRfcm93KGludGVybWVkaWF0ZWEsIGludGVybWVkaWF0ZWIpOwotCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYlswXSwgJmludGVybWVkaWF0ZWFbMF0pOwotCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYls0XSwgJmludGVybWVkaWF0ZWFbNF0pOwotCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYls4XSwgJmludGVybWVkaWF0ZWFbOF0pOwotCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYlsxMl0sICZpbnRlcm1lZGlhdGVhWzEyXSk7Ci0JCQl4b3JfMTI4KGludGVybWVkaWF0ZWEsIHJvdW5kX2tleSwgY2lwaGVydGV4dCk7Ci0JCQluZXh0X2tleShyb3VuZF9rZXksIHJvdW5kKTsKLQkJfQotCX0KLQotfQotCi12b2lkIGNvbnN0cnVjdF9jdHJfcHJlbG9hZCgKLQl1bnNpZ25lZCBjaGFyICpjdHJfcHJlbG9hZCwKLQlpbnQgYTRfZXhpc3RzLAotCWludCBxY19leGlzdHMsCi0JdW5zaWduZWQgY2hhciAqbXBkdSwKLQl1bnNpZ25lZCBjaGFyICpwbl92ZWN0b3IsCi0JaW50IGMpCi17Ci0KLQlpbnQgaSA9IDA7Ci0JZm9yIChpPTA7IGk8MTY7IGkrKykgY3RyX3ByZWxvYWRbaV0gPSAweDAwOwotCWkgPSAwOwotCi0JY3RyX3ByZWxvYWRbMF0gPSAweDAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFnICovCi0JaWYgKHFjX2V4aXN0cyAmJiBhNF9leGlzdHMpIGN0cl9wcmVsb2FkWzFdID0gbXBkdVszMF0gJiAweDBmOyAgIC8qIFFvQ19Db250cm9sICAqLwotCWlmIChxY19leGlzdHMgJiYgIWE0X2V4aXN0cykgY3RyX3ByZWxvYWRbMV0gPSBtcGR1WzI0XSAmIDB4MGY7Ci0KLQlmb3IgKGkgPSAyOyBpIDwgODsgaSsrKQotCQljdHJfcHJlbG9hZFtpXSA9IG1wZHVbaSArIDhdOyAgICAgICAgICAgICAgICAgICAgICAgLyogY3RyX3ByZWxvYWRbMjo3XSA9IEEyWzA6NV0gPSBtcGR1WzEwOjE1XSAqLwotI2lmZGVmIENPTlNJU1RFTlRfUE5fT1JERVIKLQkgIGZvciAoaSA9IDg7IGkgPCAxNDsgaSsrKQotCQkJY3RyX3ByZWxvYWRbaV0gPSAgICBwbl92ZWN0b3JbaSAtIDhdOyAgICAgICAgICAgLyogY3RyX3ByZWxvYWRbODoxM10gPSBQTlswOjVdICovCi0jZWxzZQotCSAgZm9yIChpID0gODsgaSA8IDE0OyBpKyspCi0JCQljdHJfcHJlbG9hZFtpXSA9ICAgIHBuX3ZlY3RvclsxMyAtIGldOyAgICAgICAgICAvKiBjdHJfcHJlbG9hZFs4OjEzXSA9IFBOWzU6MF0gKi8KLSNlbmRpZgotCWN0cl9wcmVsb2FkWzE0XSA9ICAodW5zaWduZWQgY2hhcikgKGMgLyAyNTYpOyAvLyBDdHIKLQljdHJfcHJlbG9hZFsxNV0gPSAgKHVuc2lnbmVkIGNoYXIpIChjICUgMjU2KTsKLQotfQotCi0KLS8vCi0vLyBUUlVFOiBTdWNjZXNzIQotLy8gRkFMU0U6IERlY3J5cHQgRXJyb3IhCi0vLwotQk9PTEVBTiBSVE1QU29mdERlY3J5cHRUS0lQKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUglwRGF0YSwKLQlJTiBVTE9ORwlEYXRhQnl0ZUNudCwKLQlJTiBVQ0hBUiAgICBVc2VyUHJpb3JpdHksCi0JSU4gUENJUEhFUl9LRVkJcFdwYUtleSkKLXsKLQlVQ0hBUgkJCUtleUlEOwotCVVJTlQJCQlIZWFkZXJMZW47Ci0gICAgVUNIQVIJCQlmYzA7Ci0JVUNIQVIJCQlmYzE7Ci0JVVNIT1JUCQkJZmM7Ci0JVUlOVAkJCWZyYW1lX3R5cGU7Ci0JVUlOVAkJCWZyYW1lX3N1YnR5cGU7Ci0gICAgVUlOVAkJCWZyb21fZHM7Ci0gICAgVUlOVAkJCXRvX2RzOwotCUlOVAkJCQlhNF9leGlzdHM7Ci0JSU5UCQkJCXFjX2V4aXN0czsKLQlVU0hPUlQJCQlkdXJhdGlvbjsKLQlVU0hPUlQJCQlzZXFfY29udHJvbDsKLQlVU0hPUlQJCQlxb3NfY29udHJvbDsKLQlVQ0hBUgkJCVRBW01BQ19BRERSX0xFTl07Ci0JVUNIQVIJCQlEQVtNQUNfQUREUl9MRU5dOwotCVVDSEFSCQkJU0FbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUgkJCVJDNEtleVsxNl07Ci0JVUlOVAkJCXAxa1s1XTsgLy9mb3IgbWl4X2tleTsKLQlVTE9ORwkJCXBubDsvKiBMZWFzdCBzaWduaWZpY2FudCAxNiBiaXRzIG9mIFBOICovCi0JVUxPTkcJCQlwbmg7LyogTW9zdCBzaWduaWZpY2FudCAzMiBiaXRzIG9mIFBOICovCi0JVUlOVAkJCW51bV9ibG9ja3M7Ci0JVUlOVAkJCXBheWxvYWRfcmVtYWluZGVyOwotCUFSQ0ZPVVJDT05URVhUIAlBcmNGb3VyQ29udGV4dDsKLQlVSU5UCQkJY3JjMzIgPSAwOwotCVVJTlQJCQl0cmFpbGZjcyA9IDA7Ci0JVUNIQVIJCQlNSUNbOF07Ci0JVUNIQVIJCQlUcmFpbE1JQ1s4XTsKLQotCWZjMCA9ICpwRGF0YTsKLQlmYzEgPSAqKHBEYXRhICsgMSk7Ci0KLQlmYyA9ICooKFBVU0hPUlQpcERhdGEpOwotCi0JZnJhbWVfdHlwZSA9ICgoZmMwID4+IDIpICYgMHgwMyk7Ci0JZnJhbWVfc3VidHlwZSA9ICgoZmMwID4+IDQpICYgMHgwZik7Ci0KLSAgICBmcm9tX2RzID0gKGZjMSAmIDB4MikgPj4gMTsKLSAgICB0b19kcyA9IChmYzEgJiAweDEpOwotCi0gICAgYTRfZXhpc3RzID0gKGZyb21fZHMgJiB0b19kcyk7Ci0gICAgcWNfZXhpc3RzID0gKChmcmFtZV9zdWJ0eXBlID09IDB4MDgpIHx8ICAgIC8qIEFzc3VtZWQgUW9TIHN1YnR5cGVzICovCi0gICAgICAgICAgICAgICAgICAoZnJhbWVfc3VidHlwZSA9PSAweDA5KSB8fCAgIC8qIExpa2VseSB0byBjaGFuZ2UuICAgICovCi0gICAgICAgICAgICAgICAgICAoZnJhbWVfc3VidHlwZSA9PSAweDBhKSB8fAotICAgICAgICAgICAgICAgICAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwYikKLSAgICAgICAgICAgICAgICAgKTsKLQotCUhlYWRlckxlbiA9IDI0OwotCWlmIChhNF9leGlzdHMpCi0JCUhlYWRlckxlbiArPSA2OwotCi0JS2V5SUQgPSAqKChQVUNIQVIpKHBEYXRhKyBIZWFkZXJMZW4gKyAzKSk7Ci0JS2V5SUQgPSBLZXlJRCA+PiA2OwotCi0JaWYgKHBXcGFLZXlbS2V5SURdLktleUxlbiA9PSAwKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNvZnREZWNyeXB0VEtJUCBmYWlsZWQhKEtleUlEWyVkXSBMZW5ndGggY2FuIG5vdCBiZSAwKVxuIiwgS2V5SUQpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCWR1cmF0aW9uID0gKigoUFVTSE9SVCkocERhdGErMikpOwotCi0Jc2VxX2NvbnRyb2wgPSAqKChQVVNIT1JUKShwRGF0YSsyMikpOwotCi0JaWYgKHFjX2V4aXN0cykKLQl7Ci0JCWlmIChhNF9leGlzdHMpCi0JCXsKLQkJCXFvc19jb250cm9sID0gKigoUFVTSE9SVCkocERhdGErMzApKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXFvc19jb250cm9sID0gKigoUFVTSE9SVCkocERhdGErMjQpKTsKLQkJfQotCX0KLQotCWlmICh0b19kcyA9PSAwICYmIGZyb21fZHMgPT0gMSkKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KERBLCBwRGF0YSs0LCBNQUNfQUREUl9MRU4pOwotCQlOZGlzTW92ZU1lbW9yeShTQSwgcERhdGErMTYsIE1BQ19BRERSX0xFTik7Ci0JCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsgIC8vQlNTSUQKLQl9Ci0JZWxzZSBpZiAodG9fZHMgPT0gMCAmJiBmcm9tX2RzID09IDAgKQotCXsKLQkJTmRpc01vdmVNZW1vcnkoVEEsIHBEYXRhKzEwLCBNQUNfQUREUl9MRU4pOwotCQlOZGlzTW92ZU1lbW9yeShEQSwgcERhdGErNCwgTUFDX0FERFJfTEVOKTsKLQkJTmRpc01vdmVNZW1vcnkoU0EsIHBEYXRhKzEwLCBNQUNfQUREUl9MRU4pOwotCX0KLQllbHNlIGlmICh0b19kcyA9PSAxICYmIGZyb21fZHMgPT0gMCkKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KFNBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKLQkJTmRpc01vdmVNZW1vcnkoVEEsIHBEYXRhKzEwLCBNQUNfQUREUl9MRU4pOwotCQlOZGlzTW92ZU1lbW9yeShEQSwgcERhdGErMTYsIE1BQ19BRERSX0xFTik7Ci0JfQotCWVsc2UgaWYgKHRvX2RzID09IDEgJiYgZnJvbV9kcyA9PSAxKQotCXsKLQkJTmRpc01vdmVNZW1vcnkoVEEsIHBEYXRhKzEwLCBNQUNfQUREUl9MRU4pOwotCQlOZGlzTW92ZU1lbW9yeShEQSwgcERhdGErMTYsIE1BQ19BRERSX0xFTik7Ci0JCU5kaXNNb3ZlTWVtb3J5KFNBLCBwRGF0YSsyMiwgTUFDX0FERFJfTEVOKTsKLQl9Ci0KLQludW1fYmxvY2tzID0gKERhdGFCeXRlQ250IC0gMTYpIC8gMTY7Ci0JcGF5bG9hZF9yZW1haW5kZXIgPSAoRGF0YUJ5dGVDbnQgLSAxNikgJSAxNjsKLQotCXBubCA9ICgqKHBEYXRhICsgSGVhZGVyTGVuKSkgKiAyNTYgKyAqKHBEYXRhICsgSGVhZGVyTGVuICsgMik7Ci0JcG5oID0gKigoUFVMT05HKShwRGF0YSArIEhlYWRlckxlbiArIDQpKTsKLQlwbmggPSBjcHUybGUzMihwbmgpOwotCVJUTVBUa2lwTWl4S2V5KHBXcGFLZXlbS2V5SURdLktleSwgVEEsIHBubCwgcG5oLCBSQzRLZXksIHAxayk7Ci0KLQlBUkNGT1VSX0lOSVQoJkFyY0ZvdXJDb250ZXh0LCBSQzRLZXksIDE2KTsKLQotCUFSQ0ZPVVJfREVDUllQVCgmQXJjRm91ckNvbnRleHQsIHBEYXRhICsgSGVhZGVyTGVuLCBwRGF0YSArIEhlYWRlckxlbiArIDgsIERhdGFCeXRlQ250IC0gSGVhZGVyTGVuIC0gOCk7Ci0JTmRpc01vdmVNZW1vcnkoJnRyYWlsZmNzLCBwRGF0YSArIERhdGFCeXRlQ250IC0gOCAtIDQsIDQpOwotCWNyYzMyID0gUlRNUF9DQUxDX0ZDUzMyKFBQUElOSVRGQ1MzMiwgcERhdGEgKyBIZWFkZXJMZW4sIERhdGFCeXRlQ250IC0gSGVhZGVyTGVuIC0gOCAtIDQpOyAgLy9Ta2lwIElWK0VJViA4IGJ5dGVzICYgU2tpcCBsYXN0IDQgYnl0ZXMoRkNTKS4KLQljcmMzMiBePSAweGZmZmZmZmZmOyAgICAgICAgICAgICAvKiBjb21wbGVtZW50ICovCi0KLSAgICBpZihjcmMzMiAhPSBjcHUybGUzMih0cmFpbGZjcykpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU29mdERlY3J5cHRUS0lQLCBXRVAgRGF0YSBJQ1YgRXJyb3IgIVxuIikpOwkgLy9JQ1YgZXJyb3IuCi0KLQkJcmV0dXJuIChGQUxTRSk7Ci0JfQotCi0JTmRpc01vdmVNZW1vcnkoVHJhaWxNSUMsIHBEYXRhICsgRGF0YUJ5dGVDbnQgLSA4IC0gOCAtIDQsIDgpOwotCVJUTVBJbml0TUlDRW5naW5lKHBBZCwgcFdwYUtleVtLZXlJRF0uS2V5LCBEQSwgU0EsIFVzZXJQcmlvcml0eSwgcFdwYUtleVtLZXlJRF0uUnhNaWMpOwotCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwRGF0YSArIEhlYWRlckxlbiwgRGF0YUJ5dGVDbnQgLSBIZWFkZXJMZW4gLSA4IC0gMTIpOwotCVJUTVBUa2lwR2V0TUlDKCZwQWQtPlByaXZhdGVJbmZvLlR4KTsKLQlOZGlzTW92ZU1lbW9yeShNSUMsIHBBZC0+UHJpdmF0ZUluZm8uVHguTUlDLCA4KTsKLQotCWlmICghTmRpc0VxdWFsTWVtb3J5KE1JQywgVHJhaWxNSUMsIDgpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRNUFNvZnREZWNyeXB0VEtJUCwgV0VQIERhdGEgTUlDIEVycm9yICFcbiIpKTsJIC8vTUlDIGVycm9yLgotCQlyZXR1cm4gKEZBTFNFKTsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0KLQotQk9PTEVBTiBSVE1QU29mdERlY3J5cHRBRVMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSCXBEYXRhLAotCUlOIFVMT05HCURhdGFCeXRlQ250LAotCUlOIFBDSVBIRVJfS0VZCXBXcGFLZXkpCi17Ci0JVUNIQVIJCQlLZXlJRDsKLQlVSU5UCQkJSGVhZGVyTGVuOwotCVVDSEFSCQkJUE5bNl07Ci0JVUlOVAkJCXBheWxvYWRfbGVuOwotCVVJTlQJCQludW1fYmxvY2tzOwotCVVJTlQJCQlwYXlsb2FkX3JlbWFpbmRlcjsKLQlVU0hPUlQJCQlmYzsKLQlVQ0hBUgkJCWZjMDsKLQlVQ0hBUgkJCWZjMTsKLQlVSU5UCQkJZnJhbWVfdHlwZTsKLQlVSU5UCQkJZnJhbWVfc3VidHlwZTsKLQlVSU5UCQkJZnJvbV9kczsKLQlVSU5UCQkJdG9fZHM7Ci0JSU5UCQkJCWE0X2V4aXN0czsKLQlJTlQJCQkJcWNfZXhpc3RzOwotCVVDSEFSCQkJYWVzX291dFsxNl07Ci0JaW50IAkJCXBheWxvYWRfaW5kZXg7Ci0JVUlOVCAJCQlpOwotCVVDSEFSIAkJCWN0cl9wcmVsb2FkWzE2XTsKLQlVQ0hBUiAJCQljaGFpbl9idWZmZXJbMTZdOwotCVVDSEFSIAkJCXBhZGRlZF9idWZmZXJbMTZdOwotCVVDSEFSIAkJCW1pY19pdlsxNl07Ci0JVUNIQVIgCQkJbWljX2hlYWRlcjFbMTZdOwotCVVDSEFSIAkJCW1pY19oZWFkZXIyWzE2XTsKLQlVQ0hBUgkJCU1JQ1s4XTsKLQlVQ0hBUgkJCVRyYWlsTUlDWzhdOwotCi0JZmMwID0gKnBEYXRhOwotCWZjMSA9ICoocERhdGEgKyAxKTsKLQotCWZjID0gKigoUFVTSE9SVClwRGF0YSk7Ci0KLQlmcmFtZV90eXBlID0gKChmYzAgPj4gMikgJiAweDAzKTsKLQlmcmFtZV9zdWJ0eXBlID0gKChmYzAgPj4gNCkgJiAweDBmKTsKLQotCWZyb21fZHMgPSAoZmMxICYgMHgyKSA+PiAxOwotCXRvX2RzID0gKGZjMSAmIDB4MSk7Ci0KLQlhNF9leGlzdHMgPSAoZnJvbV9kcyAmIHRvX2RzKTsKLQlxY19leGlzdHMgPSAoKGZyYW1lX3N1YnR5cGUgPT0gMHgwOCkgfHwgICAgLyogQXNzdW1lZCBRb1Mgc3VidHlwZXMgKi8KLQkJCQkgIChmcmFtZV9zdWJ0eXBlID09IDB4MDkpIHx8ICAgLyogTGlrZWx5IHRvIGNoYW5nZS4gICAgKi8KLQkJCQkgIChmcmFtZV9zdWJ0eXBlID09IDB4MGEpIHx8Ci0JCQkJICAoZnJhbWVfc3VidHlwZSA9PSAweDBiKQotCQkJCSApOwotCi0JSGVhZGVyTGVuID0gMjQ7Ci0JaWYgKGE0X2V4aXN0cykKLQkJSGVhZGVyTGVuICs9IDY7Ci0KLQlLZXlJRCA9ICooKFBVQ0hBUikocERhdGErIEhlYWRlckxlbiArIDMpKTsKLQlLZXlJRCA9IEtleUlEID4+IDY7Ci0KLQlpZiAocFdwYUtleVtLZXlJRF0uS2V5TGVuID09IDApCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU29mdERlY3J5cHRBRVMgZmFpbGVkIShLZXlJRFslZF0gTGVuZ3RoIGNhbiBub3QgYmUgMClcbiIsIEtleUlEKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlQTlswXSA9ICoocERhdGErIEhlYWRlckxlbik7Ci0JUE5bMV0gPSAqKHBEYXRhKyBIZWFkZXJMZW4gKyAxKTsKLQlQTlsyXSA9ICoocERhdGErIEhlYWRlckxlbiArIDQpOwotCVBOWzNdID0gKihwRGF0YSsgSGVhZGVyTGVuICsgNSk7Ci0JUE5bNF0gPSAqKHBEYXRhKyBIZWFkZXJMZW4gKyA2KTsKLQlQTls1XSA9ICoocERhdGErIEhlYWRlckxlbiArIDcpOwotCi0JcGF5bG9hZF9sZW4gPSBEYXRhQnl0ZUNudCAtIEhlYWRlckxlbiAtIDggLSA4OwkvLyA4IGJ5dGVzIGZvciBDQ01QIGhlYWRlciAsIDggYnl0ZXMgZm9yIE1JQwotCXBheWxvYWRfcmVtYWluZGVyID0gKHBheWxvYWRfbGVuKSAlIDE2OwotCW51bV9ibG9ja3MgPSAocGF5bG9hZF9sZW4pIC8gMTY7Ci0KLQotCi0JLy8gRmluZCBzdGFydCBvZiBwYXlsb2FkCi0JcGF5bG9hZF9pbmRleCA9IEhlYWRlckxlbiArIDg7IC8vSVYrRUlWCi0KLQlmb3IgKGk9MDsgaTwgbnVtX2Jsb2NrczsgaSsrKQotCXsKLQkJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLAotCQkJCQkJCQlhNF9leGlzdHMsCi0JCQkJCQkJCXFjX2V4aXN0cywKLQkJCQkJCQkJcERhdGEsCi0JCQkJCQkJCVBOLAotCQkJCQkJCQlpKzEgKTsKLQotCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKLQotCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwRGF0YSArIHBheWxvYWRfaW5kZXgsIGNoYWluX2J1ZmZlcik7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBEYXRhICsgcGF5bG9hZF9pbmRleCAtIDgsIGNoYWluX2J1ZmZlciwgMTYpOwotCQlwYXlsb2FkX2luZGV4ICs9IDE2OwotCX0KLQotCS8vCi0JLy8gSWYgdGhlcmUgaXMgYSBzaG9ydCBmaW5hbCBibG9jaywgdGhlbiBwYWQgaXQKLQkvLyBlbmNyeXB0IGl0IGFuZCBjb3B5IHRoZSB1bnBhZGRlZCBwYXJ0IGJhY2sKLQkvLwotCWlmIChwYXlsb2FkX3JlbWFpbmRlciA+IDApCi0JewotCQljb25zdHJ1Y3RfY3RyX3ByZWxvYWQoY3RyX3ByZWxvYWQsCi0JCQkJCQkJCWE0X2V4aXN0cywKLQkJCQkJCQkJcWNfZXhpc3RzLAotCQkJCQkJCQlwRGF0YSwKLQkJCQkJCQkJUE4sCi0JCQkJCQkJCW51bV9ibG9ja3MgKyAxKTsKLQotCQlOZGlzWmVyb01lbW9yeShwYWRkZWRfYnVmZmVyLCAxNik7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBhZGRlZF9idWZmZXIsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgcGF5bG9hZF9yZW1haW5kZXIpOwotCi0JCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOwotCi0JCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBEYXRhICsgcGF5bG9hZF9pbmRleCAtIDgsIGNoYWluX2J1ZmZlciwgcGF5bG9hZF9yZW1haW5kZXIpOwotCQlwYXlsb2FkX2luZGV4ICs9IHBheWxvYWRfcmVtYWluZGVyOwotCX0KLQotCS8vCi0JLy8gRGVzY3J5cHQgdGhlIE1JQwotCS8vCi0JY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLAotCQkJCQkJCWE0X2V4aXN0cywKLQkJCQkJCQlxY19leGlzdHMsCi0JCQkJCQkJcERhdGEsCi0JCQkJCQkJUE4sCi0JCQkJCQkJMCk7Ci0JTmRpc1plcm9NZW1vcnkocGFkZGVkX2J1ZmZlciwgMTYpOwotCU5kaXNNb3ZlTWVtb3J5KHBhZGRlZF9idWZmZXIsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgOCk7Ci0KLQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKLQotCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7Ci0KLQlOZGlzTW92ZU1lbW9yeShUcmFpbE1JQywgY2hhaW5fYnVmZmVyLCA4KTsKLQotCS8vCi0JLy8gQ2FsY3VsYXRlIE1JQwotCS8vCi0KLQkvL0ZvcmNlIHRoZSBwcm90ZWN0ZWQgZnJhbWUgYml0IG9uCi0JKihwRGF0YSArIDEpID0gKihwRGF0YSArIDEpIHwgMHg0MDsKLQotCS8vIEZpbmQgc3RhcnQgb2YgcGF5bG9hZAotCS8vIEJlY2F1c2UgdGhlIENDTVAgaGVhZGVyIGhhcyBiZWVuIHJlbW92ZWQKLQlwYXlsb2FkX2luZGV4ID0gSGVhZGVyTGVuOwotCi0JY29uc3RydWN0X21pY19pdigKLQkJCQkJbWljX2l2LAotCQkJCQlxY19leGlzdHMsCi0JCQkJCWE0X2V4aXN0cywKLQkJCQkJcERhdGEsCi0JCQkJCXBheWxvYWRfbGVuLAotCQkJCQlQTik7Ci0KLQljb25zdHJ1Y3RfbWljX2hlYWRlcjEoCi0JCQkJCQltaWNfaGVhZGVyMSwKLQkJCQkJCUhlYWRlckxlbiwKLQkJCQkJCXBEYXRhKTsKLQotCWNvbnN0cnVjdF9taWNfaGVhZGVyMigKLQkJCQkJCW1pY19oZWFkZXIyLAotCQkJCQkJcERhdGEsCi0JCQkJCQlhNF9leGlzdHMsCi0JCQkJCQlxY19leGlzdHMpOwotCi0JYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBtaWNfaXYsIGFlc19vdXQpOwotCWJpdHdpc2VfeG9yKGFlc19vdXQsIG1pY19oZWFkZXIxLCBjaGFpbl9idWZmZXIpOwotCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKLQliaXR3aXNlX3hvcihhZXNfb3V0LCBtaWNfaGVhZGVyMiwgY2hhaW5fYnVmZmVyKTsKLQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7Ci0KLQkvLyBpdGVyYXRlIHRocm91Z2ggZWFjaCAxNiBieXRlIHBheWxvYWQgYmxvY2sKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKQotCXsKLQkJYml0d2lzZV94b3IoYWVzX291dCwgcERhdGEgKyBwYXlsb2FkX2luZGV4LCBjaGFpbl9idWZmZXIpOwotCQlwYXlsb2FkX2luZGV4ICs9IDE2OwotCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7Ci0JfQotCi0JLy8gQWRkIG9uIHRoZSBmaW5hbCBwYXlsb2FkIGJsb2NrIGlmIGl0IG5lZWRzIHBhZGRpbmcKLQlpZiAocGF5bG9hZF9yZW1haW5kZXIgPiAwKQotCXsKLQkJTmRpc1plcm9NZW1vcnkocGFkZGVkX2J1ZmZlciwgMTYpOwotCQlOZGlzTW92ZU1lbW9yeShwYWRkZWRfYnVmZmVyLCBwRGF0YSArIHBheWxvYWRfaW5kZXgsIHBheWxvYWRfcmVtYWluZGVyKTsKLQotCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwYWRkZWRfYnVmZmVyLCBjaGFpbl9idWZmZXIpOwotCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7Ci0JfQotCS8vIGFlc19vdXQgY29udGFpbnMgcGFkZGVkIG1pYywgZGlzY2FyZCBtb3N0IHNpZ25pZmljYW50Ci0JLy8gOCBieXRlcyB0byBnZW5lcmF0ZSA2NCBiaXQgTUlDCi0JZm9yIChpID0gMCA7IGkgPCA4OyBpKyspIE1JQ1tpXSA9IGFlc19vdXRbaV07Ci0KLQlpZiAoIU5kaXNFcXVhbE1lbW9yeShNSUMsIFRyYWlsTUlDLCA4KSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTb2Z0RGVjcnlwdEFFUywgTUlDIEVycm9yICFcbiIpKTsJIC8vTUlDIGVycm9yLgotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogYWVzMTI4azEyOGQoKSAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQZXJmb3JtcyBhIDEyOCBiaXQgQUVTIGVuY3J5cHQgd2l0aCAgKi8KLS8qIDEyOCBiaXQgZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1WT0lEIHhvcl8xMjgoCi0JSU4gIFBVQ0hBUiAgYSwKLQlJTiAgUFVDSEFSICBiLAotCU9VVCBQVUNIQVIgIG91dCkKLXsKLQlJTlQgaTsKLQotCWZvciAoaT0wO2k8MTY7IGkrKykKLQl7Ci0JCW91dFtpXSA9IGFbaV0gXiBiW2ldOwotCX0KLX0KLQotVk9JRCBuZXh0X2tleSgKLQlJTiAgUFVDSEFSICBrZXksCi0JSU4gIElOVCAgICAgcm91bmQpCi17Ci0JVUNIQVIgICAgICAgcmNvbjsKLQlVQ0hBUiAgICAgICBzYm94X2tleVs0XTsKLQlVQ0hBUiAgICAgICByY29uX3RhYmxlWzEyXSA9Ci0JewotCQkweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLAotCQkweDFiLCAweDM2LCAweDM2LCAweDM2Ci0JfTsKLQotCXNib3hfa2V5WzBdID0gUlRNUENraXBTYm94KGtleVsxM10pOwotCXNib3hfa2V5WzFdID0gUlRNUENraXBTYm94KGtleVsxNF0pOwotCXNib3hfa2V5WzJdID0gUlRNUENraXBTYm94KGtleVsxNV0pOwotCXNib3hfa2V5WzNdID0gUlRNUENraXBTYm94KGtleVsxMl0pOwotCi0JcmNvbiA9IHJjb25fdGFibGVbcm91bmRdOwotCi0JeG9yXzMyKCZrZXlbMF0sIHNib3hfa2V5LCAma2V5WzBdKTsKLQlrZXlbMF0gPSBrZXlbMF0gXiByY29uOwotCi0JeG9yXzMyKCZrZXlbNF0sICZrZXlbMF0sICZrZXlbNF0pOwotCXhvcl8zMigma2V5WzhdLCAma2V5WzRdLCAma2V5WzhdKTsKLQl4b3JfMzIoJmtleVsxMl0sICZrZXlbOF0sICZrZXlbMTJdKTsKLX0KLQotVk9JRCB4b3JfMzIoCi0JSU4gIFBVQ0hBUiAgYSwKLQlJTiAgUFVDSEFSICBiLAotCU9VVCBQVUNIQVIgIG91dCkKLXsKLQlJTlQgaTsKLQotCWZvciAoaT0wO2k8NDsgaSsrKQotCXsKLQkJb3V0W2ldID0gYVtpXSBeIGJbaV07Ci0JfQotfQotCi1WT0lEIGJ5dGVfc3ViKAotCUlOICBQVUNIQVIgIGluLAotCU9VVCBQVUNIQVIgIG91dCkKLXsKLQlJTlQgaTsKLQotCWZvciAoaT0wOyBpPCAxNjsgaSsrKQotCXsKLQkJb3V0W2ldID0gUlRNUENraXBTYm94KGluW2ldKTsKLQl9Ci19Ci0KLVVDSEFSIFJUTVBDa2lwU2JveCgKLQlJTiAgVUNIQVIgICBhKQotewotCXJldHVybiBTYm94VGFibGVbKGludClhXTsKLX0KLQotVk9JRCBzaGlmdF9yb3coCi0JSU4gIFBVQ0hBUiAgaW4sCi0JT1VUIFBVQ0hBUiAgb3V0KQotewotCW91dFswXSA9ICBpblswXTsKLQlvdXRbMV0gPSAgaW5bNV07Ci0Jb3V0WzJdID0gIGluWzEwXTsKLQlvdXRbM10gPSAgaW5bMTVdOwotCW91dFs0XSA9ICBpbls0XTsKLQlvdXRbNV0gPSAgaW5bOV07Ci0Jb3V0WzZdID0gIGluWzE0XTsKLQlvdXRbN10gPSAgaW5bM107Ci0Jb3V0WzhdID0gIGluWzhdOwotCW91dFs5XSA9ICBpblsxM107Ci0Jb3V0WzEwXSA9IGluWzJdOwotCW91dFsxMV0gPSBpbls3XTsKLQlvdXRbMTJdID0gaW5bMTJdOwotCW91dFsxM10gPSBpblsxXTsKLQlvdXRbMTRdID0gaW5bNl07Ci0Jb3V0WzE1XSA9IGluWzExXTsKLX0KLQotVk9JRCBtaXhfY29sdW1uKAotCUlOICBQVUNIQVIgIGluLAotCU9VVCBQVUNIQVIgIG91dCkKLXsKLQlJTlQgICAgICAgICBpOwotCVVDSEFSICAgICAgIGFkZDFiWzRdOwotCVVDSEFSICAgICAgIGFkZDFiZjdbNF07Ci0JVUNIQVIgICAgICAgcm90bFs0XTsKLQlVQ0hBUiAgICAgICBzd2FwX2hhbGZzWzRdOwotCVVDSEFSICAgICAgIGFuZGY3WzRdOwotCVVDSEFSICAgICAgIHJvdHJbNF07Ci0JVUNIQVIgICAgICAgdGVtcFs0XTsKLQlVQ0hBUiAgICAgICB0ZW1wYls0XTsKLQotCWZvciAoaT0wIDsgaTw0OyBpKyspCi0JewotCQlpZiAoKGluW2ldICYgMHg4MCk9PSAweDgwKQotCQkJYWRkMWJbaV0gPSAweDFiOwotCQllbHNlCi0JCQlhZGQxYltpXSA9IDB4MDA7Ci0JfQotCi0Jc3dhcF9oYWxmc1swXSA9IGluWzJdOyAgICAvKiBTd2FwIGhhbGZzICovCi0Jc3dhcF9oYWxmc1sxXSA9IGluWzNdOwotCXN3YXBfaGFsZnNbMl0gPSBpblswXTsKLQlzd2FwX2hhbGZzWzNdID0gaW5bMV07Ci0KLQlyb3RsWzBdID0gaW5bM107ICAgICAgICAvKiBSb3RhdGUgbGVmdCA4IGJpdHMgKi8KLQlyb3RsWzFdID0gaW5bMF07Ci0Jcm90bFsyXSA9IGluWzFdOwotCXJvdGxbM10gPSBpblsyXTsKLQotCWFuZGY3WzBdID0gaW5bMF0gJiAweDdmOwotCWFuZGY3WzFdID0gaW5bMV0gJiAweDdmOwotCWFuZGY3WzJdID0gaW5bMl0gJiAweDdmOwotCWFuZGY3WzNdID0gaW5bM10gJiAweDdmOwotCi0JZm9yIChpID0gMzsgaT4wOyBpLS0pICAgIC8qIGxvZ2ljYWwgc2hpZnQgbGVmdCAxIGJpdCAqLwotCXsKLQkJYW5kZjdbaV0gPSBhbmRmN1tpXSA8PCAxOwotCQlpZiAoKGFuZGY3W2ktMV0gJiAweDgwKSA9PSAweDgwKQotCQl7Ci0JCQlhbmRmN1tpXSA9IChhbmRmN1tpXSB8IDB4MDEpOwotCQl9Ci0JfQotCWFuZGY3WzBdID0gYW5kZjdbMF0gPDwgMTsKLQlhbmRmN1swXSA9IGFuZGY3WzBdICYgMHhmZTsKLQotCXhvcl8zMihhZGQxYiwgYW5kZjcsIGFkZDFiZjcpOwotCi0JeG9yXzMyKGluLCBhZGQxYmY3LCByb3RyKTsKLQotCXRlbXBbMF0gPSByb3RyWzBdOyAgICAgICAgIC8qIFJvdGF0ZSByaWdodCA4IGJpdHMgKi8KLQlyb3RyWzBdID0gcm90clsxXTsKLQlyb3RyWzFdID0gcm90clsyXTsKLQlyb3RyWzJdID0gcm90clszXTsKLQlyb3RyWzNdID0gdGVtcFswXTsKLQotCXhvcl8zMihhZGQxYmY3LCByb3RyLCB0ZW1wKTsKLQl4b3JfMzIoc3dhcF9oYWxmcywgcm90bCx0ZW1wYik7Ci0JeG9yXzMyKHRlbXAsIHRlbXBiLCBvdXQpOwotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX3dlcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF93ZXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU4MzNlNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX3dlcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDk3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JcnRtcF93ZXAuYwotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVBhdWwgV3UJCTEwLTI4LTAyCQlJbml0aWFsCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLVVJTlQgRkNTVEFCXzMyWzI1Nl0gPQotewotCTB4MDAwMDAwMDAsIDB4NzcwNzMwOTYsIDB4ZWUwZTYxMmMsIDB4OTkwOTUxYmEsCi0JMHgwNzZkYzQxOSwgMHg3MDZhZjQ4ZiwgMHhlOTYzYTUzNSwgMHg5ZTY0OTVhMywKLQkweDBlZGI4ODMyLCAweDc5ZGNiOGE0LCAweGUwZDVlOTFlLCAweDk3ZDJkOTg4LAotCTB4MDliNjRjMmIsIDB4N2ViMTdjYmQsIDB4ZTdiODJkMDcsIDB4OTBiZjFkOTEsCi0JMHgxZGI3MTA2NCwgMHg2YWIwMjBmMiwgMHhmM2I5NzE0OCwgMHg4NGJlNDFkZSwKLQkweDFhZGFkNDdkLCAweDZkZGRlNGViLCAweGY0ZDRiNTUxLCAweDgzZDM4NWM3LAotCTB4MTM2Yzk4NTYsIDB4NjQ2YmE4YzAsIDB4ZmQ2MmY5N2EsIDB4OGE2NWM5ZWMsCi0JMHgxNDAxNWM0ZiwgMHg2MzA2NmNkOSwgMHhmYTBmM2Q2MywgMHg4ZDA4MGRmNSwKLQkweDNiNmUyMGM4LCAweDRjNjkxMDVlLCAweGQ1NjA0MWU0LCAweGEyNjc3MTcyLAotCTB4M2MwM2U0ZDEsIDB4NGIwNGQ0NDcsIDB4ZDIwZDg1ZmQsIDB4YTUwYWI1NmIsCi0JMHgzNWI1YThmYSwgMHg0MmIyOTg2YywgMHhkYmJiYzlkNiwgMHhhY2JjZjk0MCwKLQkweDMyZDg2Y2UzLCAweDQ1ZGY1Yzc1LCAweGRjZDYwZGNmLCAweGFiZDEzZDU5LAotCTB4MjZkOTMwYWMsIDB4NTFkZTAwM2EsIDB4YzhkNzUxODAsIDB4YmZkMDYxMTYsCi0JMHgyMWI0ZjRiNSwgMHg1NmIzYzQyMywgMHhjZmJhOTU5OSwgMHhiOGJkYTUwZiwKLQkweDI4MDJiODllLCAweDVmMDU4ODA4LCAweGM2MGNkOWIyLCAweGIxMGJlOTI0LAotCTB4MmY2ZjdjODcsIDB4NTg2ODRjMTEsIDB4YzE2MTFkYWIsIDB4YjY2NjJkM2QsCi0JMHg3NmRjNDE5MCwgMHgwMWRiNzEwNiwgMHg5OGQyMjBiYywgMHhlZmQ1MTAyYSwKLQkweDcxYjE4NTg5LCAweDA2YjZiNTFmLCAweDlmYmZlNGE1LCAweGU4YjhkNDMzLAotCTB4NzgwN2M5YTIsIDB4MGYwMGY5MzQsIDB4OTYwOWE4OGUsIDB4ZTEwZTk4MTgsCi0JMHg3ZjZhMGRiYiwgMHgwODZkM2QyZCwgMHg5MTY0NmM5NywgMHhlNjYzNWMwMSwKLQkweDZiNmI1MWY0LCAweDFjNmM2MTYyLCAweDg1NjUzMGQ4LCAweGYyNjIwMDRlLAotCTB4NmMwNjk1ZWQsIDB4MWIwMWE1N2IsIDB4ODIwOGY0YzEsIDB4ZjUwZmM0NTcsCi0JMHg2NWIwZDljNiwgMHgxMmI3ZTk1MCwgMHg4YmJlYjhlYSwgMHhmY2I5ODg3YywKLQkweDYyZGQxZGRmLCAweDE1ZGEyZDQ5LCAweDhjZDM3Y2YzLCAweGZiZDQ0YzY1LAotCTB4NGRiMjYxNTgsIDB4M2FiNTUxY2UsIDB4YTNiYzAwNzQsIDB4ZDRiYjMwZTIsCi0JMHg0YWRmYTU0MSwgMHgzZGQ4OTVkNywgMHhhNGQxYzQ2ZCwgMHhkM2Q2ZjRmYiwKLQkweDQzNjllOTZhLCAweDM0NmVkOWZjLCAweGFkNjc4ODQ2LCAweGRhNjBiOGQwLAotCTB4NDQwNDJkNzMsIDB4MzMwMzFkZTUsIDB4YWEwYTRjNWYsIDB4ZGQwZDdjYzksCi0JMHg1MDA1NzEzYywgMHgyNzAyNDFhYSwgMHhiZTBiMTAxMCwgMHhjOTBjMjA4NiwKLQkweDU3NjhiNTI1LCAweDIwNmY4NWIzLCAweGI5NjZkNDA5LCAweGNlNjFlNDlmLAotCTB4NWVkZWY5MGUsIDB4MjlkOWM5OTgsIDB4YjBkMDk4MjIsIDB4YzdkN2E4YjQsCi0JMHg1OWIzM2QxNywgMHgyZWI0MGQ4MSwgMHhiN2JkNWMzYiwgMHhjMGJhNmNhZCwKLQkweGVkYjg4MzIwLCAweDlhYmZiM2I2LCAweDAzYjZlMjBjLCAweDc0YjFkMjlhLAotCTB4ZWFkNTQ3MzksIDB4OWRkMjc3YWYsIDB4MDRkYjI2MTUsIDB4NzNkYzE2ODMsCi0JMHhlMzYzMGIxMiwgMHg5NDY0M2I4NCwgMHgwZDZkNmEzZSwgMHg3YTZhNWFhOCwKLQkweGU0MGVjZjBiLCAweDkzMDlmZjlkLCAweDBhMDBhZTI3LCAweDdkMDc5ZWIxLAotCTB4ZjAwZjkzNDQsIDB4ODcwOGEzZDIsIDB4MWUwMWYyNjgsIDB4NjkwNmMyZmUsCi0JMHhmNzYyNTc1ZCwgMHg4MDY1NjdjYiwgMHgxOTZjMzY3MSwgMHg2ZTZiMDZlNywKLQkweGZlZDQxYjc2LCAweDg5ZDMyYmUwLCAweDEwZGE3YTVhLCAweDY3ZGQ0YWNjLAotCTB4ZjliOWRmNmYsIDB4OGViZWVmZjksIDB4MTdiN2JlNDMsIDB4NjBiMDhlZDUsCi0JMHhkNmQ2YTNlOCwgMHhhMWQxOTM3ZSwgMHgzOGQ4YzJjNCwgMHg0ZmRmZjI1MiwKLQkweGQxYmI2N2YxLCAweGE2YmM1NzY3LCAweDNmYjUwNmRkLCAweDQ4YjIzNjRiLAotCTB4ZDgwZDJiZGEsIDB4YWYwYTFiNGMsIDB4MzYwMzRhZjYsIDB4NDEwNDdhNjAsCi0JMHhkZjYwZWZjMywgMHhhODY3ZGY1NSwgMHgzMTZlOGVlZiwgMHg0NjY5YmU3OSwKLQkweGNiNjFiMzhjLCAweGJjNjY4MzFhLCAweDI1NmZkMmEwLCAweDUyNjhlMjM2LAotCTB4Y2MwYzc3OTUsIDB4YmIwYjQ3MDMsIDB4MjIwMjE2YjksIDB4NTUwNTI2MmYsCi0JMHhjNWJhM2JiZSwgMHhiMmJkMGIyOCwgMHgyYmI0NWE5MiwgMHg1Y2IzNmEwNCwKLQkweGMyZDdmZmE3LCAweGI1ZDBjZjMxLCAweDJjZDk5ZThiLCAweDViZGVhZTFkLAotCTB4OWI2NGMyYjAsIDB4ZWM2M2YyMjYsIDB4NzU2YWEzOWMsIDB4MDI2ZDkzMGEsCi0JMHg5YzA5MDZhOSwgMHhlYjBlMzYzZiwgMHg3MjA3Njc4NSwgMHgwNTAwNTcxMywKLQkweDk1YmY0YTgyLCAweGUyYjg3YTE0LCAweDdiYjEyYmFlLCAweDBjYjYxYjM4LAotCTB4OTJkMjhlOWIsIDB4ZTVkNWJlMGQsIDB4N2NkY2VmYjcsIDB4MGJkYmRmMjEsCi0JMHg4NmQzZDJkNCwgMHhmMWQ0ZTI0MiwgMHg2OGRkYjNmOCwgMHgxZmRhODM2ZSwKLQkweDgxYmUxNmNkLCAweGY2YjkyNjViLCAweDZmYjA3N2UxLCAweDE4Yjc0Nzc3LAotCTB4ODgwODVhZTYsIDB4ZmYwZjZhNzAsIDB4NjYwNjNiY2EsIDB4MTEwMTBiNWMsCi0JMHg4ZjY1OWVmZiwgMHhmODYyYWU2OSwgMHg2MTZiZmZkMywgMHgxNjZjY2Y0NSwKLQkweGEwMGFlMjc4LCAweGQ3MGRkMmVlLCAweDRlMDQ4MzU0LCAweDM5MDNiM2MyLAotCTB4YTc2NzI2NjEsIDB4ZDA2MDE2ZjcsIDB4NDk2OTQ3NGQsIDB4M2U2ZTc3ZGIsCi0JMHhhZWQxNmE0YSwgMHhkOWQ2NWFkYywgMHg0MGRmMGI2NiwgMHgzN2Q4M2JmMCwKLQkweGE5YmNhZTUzLCAweGRlYmI5ZWM1LCAweDQ3YjJjZjdmLCAweDMwYjVmZmU5LAotCTB4YmRiZGYyMWMsIDB4Y2FiYWMyOGEsIDB4NTNiMzkzMzAsIDB4MjRiNGEzYTYsCi0JMHhiYWQwMzYwNSwgMHhjZGQ3MDY5MywgMHg1NGRlNTcyOSwgMHgyM2Q5NjdiZiwKLQkweGIzNjY3YTJlLCAweGM0NjE0YWI4LCAweDVkNjgxYjAyLCAweDJhNmYyYjk0LAotCTB4YjQwYmJlMzcsIDB4YzMwYzhlYTEsIDB4NWEwNWRmMWIsIDB4MmQwMmVmOGQKLX07Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlJbml0IFdFUCBmdW5jdGlvbi4KLQotCUFyZ3VtZW50czoKLSAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwS2V5ICAgICAgICBQb2ludGVyIHRvIHRoZSBXRVAgS0VZCi0JCUtleUlkCQkgICBXRVAgS2V5IElECi0JCUtleUxlbiAgICAgIHRoZSBsZW5ndGggb2YgV0VQIEtFWQotCQlwRGVzdCAgICAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB3aGljaCBFbmNyeXB0aW9uIGRhdGEgd2lsbCBzdG9yZSBpbi4KLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QSW5pdFdlcEVuZ2luZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwS2V5LAotCUlOCVVDSEFSCQkJS2V5SWQsCi0JSU4JVUNIQVIJCQlLZXlMZW4sCi0JSU4gT1VUCVBVQ0hBUgkJcERlc3QpCi17Ci0JVUlOVCBpOwotCVVDSEFSICAgV0VQS0VZW10gPSB7Ci0JCS8vSVYKLQkJMHgwMCwgMHgxMSwgMHgyMiwKLQkJLy9XRVAgS0VZCi0JCTB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0MKLQl9OwotCi0JcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFBQUElOSVRGQ1MzMjsgICAvL0luaXQgY3JjMzIuCi0KLSAgICBpZiAocEFkLT5TdGFDZmcuYkNraXBPbiAmJiAocEFkLT5TdGFDZmcuQ2tpcEZsYWcgJiAweDEwKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCi0gICAgewotICAgICAgICBBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcEtleSwgS2V5TGVuKTsgIC8vSU5JVCBTQk9YLCBLRVlMRU4rMyhJVikKLSAgICAgICAgTmRpc01vdmVNZW1vcnkocERlc3QsIHBLZXksIDMpOyAgLy9BcHBlbmQgSW5pdCBWZWN0b3IKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQkJTmRpc01vdmVNZW1vcnkoV0VQS0VZICsgMywgcEtleSwgS2V5TGVuKTsKLQotICAgICAgICBmb3IoaSA9IDA7IGkgPCAzOyBpKyspCi0JCQlXRVBLRVlbaV0gPSBSYW5kb21CeXRlKHBBZCk7ICAgLy9DYWxsIG1sbWUgUmFuZG9tQnl0ZSgpIGZ1bmN0aW9uLgotCQlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgV0VQS0VZLCBLZXlMZW4gKyAzKTsgIC8vSU5JVCBTQk9YLCBLRVlMRU4rMyhJVikKLQotCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgV0VQS0VZLCAzKTsgIC8vQXBwZW5kIEluaXQgVmVjdG9yCi0gICAgfQotCSoocERlc3QrMykgPSAoS2V5SWQgPDwgNik7ICAgICAgIC8vQXBwZW5kIEtFWUlECi0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUVuY3J5cHQgdHJhbnNpbWl0dGVkIGRhdGEKLQotCUFyZ3VtZW50czoKLSAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotICAgICAgcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgdHJhbnNpbWl0dGVkIHNvdXJjZSBkYXRhIHRoYXQgd2lsbCBiZSBlbmNyeXB0Ci0gICAgICBwRGVzdCAgICAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB3aGVyZSBlbnRyeXB0aW9uIGRhdGEgd2lsbCBiZSBzdG9yZSBpbi4KLSAgICAgIExlbgkJCUluZGljYXRlIHRoZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBkYXRhCi0KLQlSZXR1cm4gVmFsdWU6Ci0gICAgICBOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBFbmNyeXB0RGF0YSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwU3JjLAotCUlOCVBVQ0hBUgkJCXBEZXN0LAotCUlOCVVJTlQJCQlMZW4pCi17Ci0JcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCBwU3JjLCBMZW4pOwotCUFSQ0ZPVVJfRU5DUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBwRGVzdCwgcFNyYywgTGVuKTsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJRGVjcnlwdCByZWNlaXZlZCBXRVAgZGF0YQotCi0JQXJndW1lbnRzOgotCQlwQWRhcHRlcgkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSByZWNlaXZlZCBkYXRhCi0JCUxlbiAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHJlY2VpdmVkIGRhdGEKLQotCVJldHVybiBWYWx1ZToKLQkJVFJVRSAgICAgICAgRGVjcnlwdCBXRVAgZGF0YSBzdWNjZXNzCi0JCUZBTFNFICAgICAgIERlY3J5cHQgV0VQIGRhdGEgZmFpbGVkCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTglSVE1QU29mdERlY3J5cHRXRVAoCi0JSU4gUFJUTVBfQURBUFRFUiAJcEFkLAotCUlOIFBVQ0hBUgkJCXBEYXRhLAotCUlOIFVMT05HCQkJRGF0YUJ5dGVDbnQsCi0JSU4gUENJUEhFUl9LRVkJCXBHcm91cEtleSkKLXsKLQlVSU5UCXRyYWlsZmNzOwotCVVJTlQgICAgY3JjMzI7Ci0JVUNIQVIJS2V5SWR4OwotCVVDSEFSICAgV0VQS0VZW10gPSB7Ci0JCS8vSVYKLQkJMHgwMCwgMHgxMSwgMHgyMiwKLQkJLy9XRVAgS0VZCi0JCTB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0MKLQl9OwotCVVDSEFSIAkqcFBheWxvYWQgPSAoVUNIQVIgKilwRGF0YSArIExFTkdUSF84MDJfMTE7Ci0JVUxPTkcJcGF5bG9hZF9sZW4gPSBEYXRhQnl0ZUNudCAtIExFTkdUSF84MDJfMTE7Ci0KLQlOZGlzTW92ZU1lbW9yeShXRVBLRVksIHBQYXlsb2FkLCAzKTsgICAgLy9HZXQgV0VQIElWCi0KLQlLZXlJZHggPSAoKihwUGF5bG9hZCArIDMpICYgMHhjMCkgPj4gNjsKLQlpZiAocEdyb3VwS2V5W0tleUlkeF0uS2V5TGVuID09IDApCi0JCXJldHVybiAoRkFMU0UpOwotCi0JTmRpc01vdmVNZW1vcnkoV0VQS0VZICsgMywgcEdyb3VwS2V5W0tleUlkeF0uS2V5LCBwR3JvdXBLZXlbS2V5SWR4XS5LZXlMZW4pOwotCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBXRVBLRVksIHBHcm91cEtleVtLZXlJZHhdLktleUxlbiArIDMpOwotCUFSQ0ZPVVJfREVDUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBwUGF5bG9hZCwgcFBheWxvYWQgKyA0LCBwYXlsb2FkX2xlbiAtIDQpOwotCU5kaXNNb3ZlTWVtb3J5KCZ0cmFpbGZjcywgcFBheWxvYWQgKyBwYXlsb2FkX2xlbiAtIDgsIDQpOwotCWNyYzMyID0gUlRNUF9DQUxDX0ZDUzMyKFBQUElOSVRGQ1MzMiwgcFBheWxvYWQsIHBheWxvYWRfbGVuIC0gOCk7ICAvL1NraXAgbGFzdCA0IGJ5dGVzKEZDUykuCi0JY3JjMzIgXj0gMHhmZmZmZmZmZjsgICAgICAgICAgICAgLyogY29tcGxlbWVudCAqLwotCi0gICAgaWYoY3JjMzIgIT0gY3B1MmxlMzIodHJhaWxmY3MpKQotICAgIHsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISBXRVAgRGF0YSBDUkMgRXJyb3IgIVxuIikpOwkgLy9DUkMgZXJyb3IuCi0JCXJldHVybiAoRkFMU0UpOwotCX0KLQlyZXR1cm4gKFRSVUUpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJVGhlIFN0cmVhbSBDaXBoZXIgRW5jcnlwdGlvbiBBbGdvcml0aG0gIkFSQ0ZPVVIiIGluaXRpYWxpemUKLQotCUFyZ3VtZW50czoKLQkgICBDdHggICAgICAgICBQb2ludGVyIHRvIEFSQ0ZPVVIgQ09OVEVYVCAoU0JPWCkKLQkJcEtleSAgICAgICAgUG9pbnRlciB0byB0aGUgV0VQIEtFWQotCQlLZXlMZW4gICAgICBJbmRpY2F0ZSB0aGUgbGVuZ3RoIGZvIHRoZSBXRVAgS0VZCi0KLQlSZXR1cm4gVmFsdWU6Ci0JICAgTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlBUkNGT1VSX0lOSVQoCi0JSU4JUEFSQ0ZPVVJDT05URVhUCUN0eCwKLQlJTglQVUNIQVIJCQlwS2V5LAotCUlOCVVJTlQJCQlLZXlMZW4pCi17Ci0JVUNIQVIJdCwgdTsKLQlVSU5UCWtleWluZGV4OwotCVVJTlQJc3RhdGVpbmRleDsKLQlQVUNIQVIJc3RhdGU7Ci0JVUlOVAljb3VudGVyOwotCi0Jc3RhdGUgPSBDdHgtPlNUQVRFOwotCUN0eC0+WCA9IDA7Ci0JQ3R4LT5ZID0gMDsKLQlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgMjU2OyBjb3VudGVyKyspCi0JCXN0YXRlW2NvdW50ZXJdID0gKFVDSEFSKWNvdW50ZXI7Ci0Ja2V5aW5kZXggPSAwOwotCXN0YXRlaW5kZXggPSAwOwotCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCAyNTY7IGNvdW50ZXIrKykKLQl7Ci0JCXQgPSBzdGF0ZVtjb3VudGVyXTsKLQkJc3RhdGVpbmRleCA9IChzdGF0ZWluZGV4ICsgcEtleVtrZXlpbmRleF0gKyB0KSAmIDB4ZmY7Ci0JCXUgPSBzdGF0ZVtzdGF0ZWluZGV4XTsKLQkJc3RhdGVbc3RhdGVpbmRleF0gPSB0OwotCQlzdGF0ZVtjb3VudGVyXSA9IHU7Ci0JCWlmICgrK2tleWluZGV4ID49IEtleUxlbikKLQkJCWtleWluZGV4ID0gMDsKLQl9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlHZXQgYnl0ZXMgZnJvbSBBUkNGT1VSIENPTlRFWFQgKFMtQk9YKQotCi0JQXJndW1lbnRzOgotCSAgIEN0eCAgICAgICAgIFBvaW50ZXIgdG8gQVJDRk9VUiBDT05URVhUIChTQk9YKQotCi0JUmV0dXJuIFZhbHVlOgotCSAgIFVDSEFSICAtIHRoZSB2YWx1ZSBvZiB0aGUgQVJDRk9VUiBDT05URVhUIChTLUJPWCkKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VQ0hBUglBUkNGT1VSX0JZVEUoCi0JSU4JUEFSQ0ZPVVJDT05URVhUCQlDdHgpCi17Ci0gIFVJTlQgeDsKLSAgVUlOVCB5OwotICBVQ0hBUiBzeCwgc3k7Ci0gIFBVQ0hBUiBzdGF0ZTsKLQotICBzdGF0ZSA9IEN0eC0+U1RBVEU7Ci0gIHggPSAoQ3R4LT5YICsgMSkgJiAweGZmOwotICBzeCA9IHN0YXRlW3hdOwotICB5ID0gKHN4ICsgQ3R4LT5ZKSAmIDB4ZmY7Ci0gIHN5ID0gc3RhdGVbeV07Ci0gIEN0eC0+WCA9IHg7Ci0gIEN0eC0+WSA9IHk7Ci0gIHN0YXRlW3ldID0gc3g7Ci0gIHN0YXRlW3hdID0gc3k7Ci0KLSAgcmV0dXJuKHN0YXRlWyhzeCArIHN5KSAmIDB4ZmZdKTsKLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJVGhlIFN0cmVhbSBDaXBoZXIgRGVjcnlwdGlvbiBBbGdvcml0aG0KLQotCUFyZ3VtZW50czoKLQkJQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCi0JCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KLQkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgU291cmNlIGRhdGEKLQkJTGVuICAgICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgU291cmNlIGRhdGEKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJQVJDRk9VUl9ERUNSWVBUKAotCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCi0JSU4JUFVDSEFSCQkJcERlc3QsCi0JSU4JUFVDSEFSCQkJcFNyYywKLQlJTglVSU5UCQkJTGVuKQotewotCVVJTlQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBMZW47IGkrKykKLQkJcERlc3RbaV0gPSBwU3JjW2ldIF4gQVJDRk9VUl9CWVRFKEN0eCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlUaGUgU3RyZWFtIENpcGhlciBFbmNyeXB0aW9uIEFsZ29yaXRobQotCi0JQXJndW1lbnRzOgotCQlDdHggICAgICAgICBQb2ludGVyIHRvIEFSQ0ZPVVIgQ09OVEVYVCAoU0JPWCkKLQkJcERlc3QJCQlQb2ludGVyIHRvIHRoZSBEZXN0aW5hdGlvbgotCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSBTb3VyY2UgZGF0YQotCQlMZW4gICAgICAgICBJbmRpY2F0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBTb3VyY2UgZHRhCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJQVJDRk9VUl9FTkNSWVBUKAotCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCi0JSU4JUFVDSEFSCQkJcERlc3QsCi0JSU4JUFVDSEFSCQkJcFNyYywKLQlJTglVSU5UCQkJTGVuKQotewotCVVJTlQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBMZW47IGkrKykKLQkJcERlc3RbaV0gPSBwU3JjW2ldIF4gQVJDRk9VUl9CWVRFKEN0eCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlUaGUgU3RyZWFtIENpcGhlciBFbmNyeXB0aW9uIEFsZ29yaXRobSB3aGljaCBjb25mb3JtIHRvIHRoZSBzcGVjaWFsIHJlcXVpcmVtZW50IHRvIGVuY3J5cHQgIEdUSy4KLQotCUFyZ3VtZW50czoKLQkJQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCi0JCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KLQkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgU291cmNlIGRhdGEKLQkJTGVuICAgICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgU291cmNlIGR0YQotCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi0KLVZPSUQJV1BBQVJDRk9VUl9FTkNSWVBUKAotCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCi0JSU4JUFVDSEFSCQkJcERlc3QsCi0JSU4JUFVDSEFSCQkJcFNyYywKLQlJTglVSU5UCQkJTGVuKQotewotCVVJTlQgaTsKLSAgICAgICAgLy9kaXNjYXJkIGZpcnN0IDI1NiBieXRlcwotCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLSAgICAgICAgICAgIEFSQ0ZPVVJfQllURShDdHgpOwotCi0JZm9yIChpID0gMDsgaSA8IExlbjsgaSsrKQotCQlwRGVzdFtpXSA9IHBTcmNbaV0gXiBBUkNGT1VSX0JZVEUoQ3R4KTsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJQ2FsY3VsYXRlIGEgbmV3IEZDUyBnaXZlbiB0aGUgY3VycmVudCBGQ1MgYW5kIHRoZSBuZXcgZGF0YS4KLQotCUFyZ3VtZW50czoKLQkJRmNzCSAgICAgIHRoZSBvcmlnaW5hbCBGQ1MgdmFsdWUKLQkJQ3AgICAgICAgICAgcG9pbnRlciB0byB0aGUgZGF0YSB3aGljaCB3aWxsIGJlIGNhbGN1bGF0ZSB0aGUgRkNTCi0JCUxlbiAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEKLQotCVJldHVybiBWYWx1ZToKLQkJVUlOVCAtIEZDUyAzMiBiaXRzCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VSU5UCVJUTVBfQ0FMQ19GQ1MzMigKLQlJTglVSU5UCUZjcywKLQlJTglQVUNIQVIJQ3AsCi0JSU4JSU5UCQlMZW4pCi17Ci0Jd2hpbGUgKExlbi0tKQotCSAgIEZjcyA9ICgoKEZjcykgPj4gOCkgXiBGQ1NUQUJfMzJbKChGY3MpIF4gKCpDcCsrKSkgJiAweGZmXSk7Ci0KLQlyZXR1cm4gKEZjcyk7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUdldCBsYXN0IEZDUyBhbmQgZW5jcnlwdCBpdCB0byB0aGUgZGVzdGluYXRpb24KLQotCUFyZ3VtZW50czoKLQkJcERlc3QJCQlQb2ludGVyIHRvIHRoZSBEZXN0aW5hdGlvbgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QU2V0SUNWKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUglwRGVzdCkKLXsKLQlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyIF49IDB4ZmZmZmZmZmY7ICAgICAgICAgICAgIC8qIGNvbXBsZW1lbnQgKi8KLQlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyID0gY3B1MmxlMzIocEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMik7Ci0KLQlBUkNGT1VSX0VOQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcERlc3QsIChQVUNIQVIpICZwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCA0KTsKLX0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vc3BlY3RydW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3NwZWN0cnVtLmMKaW5kZXggYzY1OGJmMy4uNTFlMzhkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vc3BlY3RydW0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9zcGVjdHJ1bS5jCkBAIC0yNCw3ICsyNCw2IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAotCiAgICAgTW9kdWxlIE5hbWU6CiAJYWN0aW9uLmMKIApAQCAtNDAsMjQgKzM5LDM4MiBAQAogI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgogI2luY2x1ZGUgImFjdGlvbi5oIgogCi1WT0lEIE1lYXN1cmVSZXFUYWJJbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQorLyogVGhlIHJlZ3VsYXRvcnkgaW5mb3JtYXRpb24gaW4gdGhlIFVTQSAoVVMpICovCitzdHJ1Y3QgcnRfZG90MTFfcmVndWxhdG9yeV9pbmZvcm1hdGlvbiBVU0FSZWd1bGF0b3J5SW5mb1tdID0geworLyogICJyZWd1bGF0b3J5IGNsYXNzIiAgIm51bWJlciBvZiBjaGFubmVscyIgICJNYXggVHggUHdyIiAgImNoYW5uZWwgbGlzdCIgKi8KKwl7MCwgezAsIDAsIHswfQorCSAgICAgfQorCSB9CisJLAkJCS8qIEludmxpZCBlbnRyeSAqLworCXsxLCB7NCwgMTYsIHszNiwgNDAsIDQ0LCA0OH0KKwkgICAgIH0KKwkgfQorCSwKKwl7MiwgezQsIDIzLCB7NTIsIDU2LCA2MCwgNjR9CisJICAgICB9CisJIH0KKwksCisJezMsIHs0LCAyOSwgezE0OSwgMTUzLCAxNTcsIDE2MX0KKwkgICAgIH0KKwkgfQorCSwKKwl7NCwgezExLCAyMywgezEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwfQorCSAgICAgfQorCSB9CisJLAorCXs1LCB7NSwgMzAsIHsxNDksIDE1MywgMTU3LCAxNjEsIDE2NX0KKwkgICAgIH0KKwkgfQorCSwKKwl7NiwgezEwLCAxNCwgezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwfQorCSAgICAgfQorCSB9CisJLAorCXs3LCB7MTAsIDI3LCB7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTB9CisJICAgICB9CisJIH0KKwksCisJezgsIHs1LCAxNywgezExLCAxMywgMTUsIDE3LCAxOX0KKwkgICAgIH0KKwkgfQorCSwKKwl7OSwgezUsIDMwLCB7MTEsIDEzLCAxNSwgMTcsIDE5fQorCSAgICAgfQorCSB9CisJLAorCXsxMCwgezIsIDIwLCB7MjEsIDI1fQorCSAgICAgIH0KKwkgfQorCSwKKwl7MTEsIHsyLCAzMywgezIxLCAyNX0KKwkgICAgICB9CisJIH0KKwksCisJezEyLCB7MTEsIDMwLCB7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExfQorCSAgICAgIH0KKwkgfQorfTsKKworI2RlZmluZSBVU0FfUkVHVUxBVE9SWV9JTkZPX1NJWkUgKHNpemVvZihVU0FSZWd1bGF0b3J5SW5mbykgLyBzaXplb2Yoc3RydWN0IHJ0X2RvdDExX3JlZ3VsYXRvcnlfaW5mb3JtYXRpb24pKQorCisvKiBUaGUgcmVndWxhdG9yeSBpbmZvcm1hdGlvbiBpbiBFdXJvcGUgKi8KK3N0cnVjdCBydF9kb3QxMV9yZWd1bGF0b3J5X2luZm9ybWF0aW9uIEV1cm9wZVJlZ3VsYXRvcnlJbmZvW10gPSB7CisvKiAgInJlZ3VsYXRvcnkgY2xhc3MiICAibnVtYmVyIG9mIGNoYW5uZWxzIiAgIk1heCBUeCBQd3IiICAiY2hhbm5lbCBsaXN0IiAqLworCXswLCB7MCwgMCwgezB9CisJICAgICB9CisJIH0KKwksCQkJLyogSW52YWxpZCBlbnRyeSAqLworCXsxLCB7NCwgMjAsIHszNiwgNDAsIDQ0LCA0OH0KKwkgICAgIH0KKwkgfQorCSwKKwl7MiwgezQsIDIwLCB7NTIsIDU2LCA2MCwgNjR9CisJICAgICB9CisJIH0KKwksCisJezMsIHsxMSwgMzAsIHsxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH0KKwkgICAgIH0KKwkgfQorCSwKKwl7NCwgezEzLCAyMCwgezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzfQorCSAgICAgfQorCSB9Cit9OworCisjZGVmaW5lIEVVX1JFR1VMQVRPUllfSU5GT19TSVpFIChzaXplb2YoRXVyb3BlUmVndWxhdG9yeUluZm8pIC8gc2l6ZW9mKHN0cnVjdCBydF9kb3QxMV9yZWd1bGF0b3J5X2luZm9ybWF0aW9uKSkKKworLyogVGhlIHJlZ3VsYXRvcnkgaW5mb3JtYXRpb24gaW4gSmFwYW4gKi8KK3N0cnVjdCBydF9kb3QxMV9yZWd1bGF0b3J5X2luZm9ybWF0aW9uIEphcGFuUmVndWxhdG9yeUluZm9bXSA9IHsKKy8qICAicmVndWxhdG9yeSBjbGFzcyIgICJudW1iZXIgb2YgY2hhbm5lbHMiICAiTWF4IFR4IFB3ciIgICJjaGFubmVsIGxpc3QiICovCisJezAsIHswLCAwLCB7MH0KKwkgICAgIH0KKwkgfQorCSwJCQkvKiBJbnZhbGlkIGVudHJ5ICovCisJezEsIHs0LCAyMiwgezM0LCAzOCwgNDIsIDQ2fQorCSAgICAgfQorCSB9CisJLAorCXsyLCB7MywgMjQsIHs4LCAxMiwgMTZ9CisJICAgICB9CisJIH0KKwksCisJezMsIHszLCAyNCwgezgsIDEyLCAxNn0KKwkgICAgIH0KKwkgfQorCSwKKwl7NCwgezMsIDI0LCB7OCwgMTIsIDE2fQorCSAgICAgfQorCSB9CisJLAorCXs1LCB7MywgMjQsIHs4LCAxMiwgMTZ9CisJICAgICB9CisJIH0KKwksCisJezYsIHszLCAyMiwgezgsIDEyLCAxNn0KKwkgICAgIH0KKwkgfQorCSwKKwl7NywgezQsIDI0LCB7MTg0LCAxODgsIDE5MiwgMTk2fQorCSAgICAgfQorCSB9CisJLAorCXs4LCB7NCwgMjQsIHsxODQsIDE4OCwgMTkyLCAxOTZ9CisJICAgICB9CisJIH0KKwksCisJezksIHs0LCAyNCwgezE4NCwgMTg4LCAxOTIsIDE5Nn0KKwkgICAgIH0KKwkgfQorCSwKKwl7MTAsIHs0LCAyNCwgezE4NCwgMTg4LCAxOTIsIDE5Nn0KKwkgICAgICB9CisJIH0KKwksCisJezExLCB7NCwgMjIsIHsxODQsIDE4OCwgMTkyLCAxOTZ9CisJICAgICAgfQorCSB9CisJLAorCXsxMiwgezQsIDI0LCB7NywgOCwgOSwgMTF9CisJICAgICAgfQorCSB9CisJLAorCXsxMywgezQsIDI0LCB7NywgOCwgOSwgMTF9CisJICAgICAgfQorCSB9CisJLAorCXsxNCwgezQsIDI0LCB7NywgOCwgOSwgMTF9CisJICAgICAgfQorCSB9CisJLAorCXsxNSwgezQsIDI0LCB7NywgOCwgOSwgMTF9CisJICAgICAgfQorCSB9CisJLAorCXsxNiwgezYsIDI0LCB7MTgzLCAxODQsIDE4NSwgMTg3LCAxODgsIDE4OX0KKwkgICAgICB9CisJIH0KKwksCisJezE3LCB7NiwgMjQsIHsxODMsIDE4NCwgMTg1LCAxODcsIDE4OCwgMTg5fQorCSAgICAgIH0KKwkgfQorCSwKKwl7MTgsIHs2LCAyNCwgezE4MywgMTg0LCAxODUsIDE4NywgMTg4LCAxODl9CisJICAgICAgfQorCSB9CisJLAorCXsxOSwgezYsIDI0LCB7MTgzLCAxODQsIDE4NSwgMTg3LCAxODgsIDE4OX0KKwkgICAgICB9CisJIH0KKwksCisJezIwLCB7NiwgMTcsIHsxODMsIDE4NCwgMTg1LCAxODcsIDE4OCwgMTg5fQorCSAgICAgIH0KKwkgfQorCSwKKwl7MjEsIHs2LCAyNCwgezYsIDcsIDgsIDksIDEwLCAxMX0KKwkgICAgICB9CisJIH0KKwksCisJezIyLCB7NiwgMjQsIHs2LCA3LCA4LCA5LCAxMCwgMTF9CisJICAgICAgfQorCSB9CisJLAorCXsyMywgezYsIDI0LCB7NiwgNywgOCwgOSwgMTAsIDExfQorCSAgICAgIH0KKwkgfQorCSwKKwl7MjQsIHs2LCAyNCwgezYsIDcsIDgsIDksIDEwLCAxMX0KKwkgICAgICB9CisJIH0KKwksCisJezI1LCB7OCwgMjQsIHsxODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OX0KKwkgICAgICB9CisJIH0KKwksCisJezI2LCB7OCwgMjQsIHsxODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OX0KKwkgICAgICB9CisJIH0KKwksCisJezI3LCB7OCwgMjQsIHsxODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OX0KKwkgICAgICB9CisJIH0KKwksCisJezI4LCB7OCwgMjQsIHsxODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OX0KKwkgICAgICB9CisJIH0KKwksCisJezI5LCB7OCwgMTcsIHsxODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OX0KKwkgICAgICB9CisJIH0KKwksCisJezMwLCB7MTMsIDIzLCB7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTN9CisJICAgICAgfQorCSB9CisJLAorCXszMSwgezEsIDIzLCB7MTR9CisJICAgICAgfQorCSB9CisJLAorCXszMiwgezQsIDIyLCB7NTIsIDU2LCA2MCwgNjR9CisJICAgICAgfQorCSB9Cit9OworCisjZGVmaW5lIEpQX1JFR1VMQVRPUllfSU5GT19TSVpFIChzaXplb2YoSmFwYW5SZWd1bGF0b3J5SW5mbykgLyBzaXplb2Yoc3RydWN0IHJ0X2RvdDExX3JlZ3VsYXRvcnlfaW5mb3JtYXRpb24pKQorCitjaGFyIFJUTVBfR2V0VHhQd3Ioc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBIVFRSQU5TTUlUX1NFVFRJTkcgSFRUeE1vZGUpCit7CisJc3RydWN0IHR4X3B3cl9jZmcgeworCQl1OCBNb2RlOworCQl1OCBNQ1M7CisJCXUxNiByZXE7CisJCXU4IHNoaWZ0OworCQl1MzIgQml0TWFzazsKKwl9OworCisJdTMyIFZhbHVlOworCWludCBJZHg7CisJdTggUGh5TW9kZTsKKwljaGFyIEN1clR4UHdyOworCXU4IFR4UHdyUmVmID0gMDsKKwljaGFyIERhbHRhUHdyOworCXVuc2lnbmVkIGxvbmcgVHhQd3JbNV07CisKKwlzdHJ1Y3QgdHhfcHdyX2NmZyBUeFB3ckNmZ1tdID0geworCQl7TU9ERV9DQ0ssIDAsIDAsIDQsIDB4MDAwMDAwZjB9LAorCQl7TU9ERV9DQ0ssIDEsIDAsIDAsIDB4MDAwMDAwMGZ9LAorCQl7TU9ERV9DQ0ssIDIsIDAsIDEyLCAweDAwMDBmMDAwfSwKKwkJe01PREVfQ0NLLCAzLCAwLCA4LCAweDAwMDAwZjAwfSwKKworCQl7TU9ERV9PRkRNLCAwLCAwLCAyMCwgMHgwMGYwMDAwMH0sCisJCXtNT0RFX09GRE0sIDEsIDAsIDE2LCAweDAwMGYwMDAwfSwKKwkJe01PREVfT0ZETSwgMiwgMCwgMjgsIDB4ZjAwMDAwMDB9LAorCQl7TU9ERV9PRkRNLCAzLCAwLCAyNCwgMHgwZjAwMDAwMH0sCisJCXtNT0RFX09GRE0sIDQsIDEsIDQsIDB4MDAwMDAwZjB9LAorCQl7TU9ERV9PRkRNLCA1LCAxLCAwLCAweDAwMDAwMDBmfSwKKwkJe01PREVfT0ZETSwgNiwgMSwgMTIsIDB4MDAwMGYwMDB9LAorCQl7TU9ERV9PRkRNLCA3LCAxLCA4LCAweDAwMDAwZjAwfQorCQksIHtNT0RFX0hUTUlYLCAwLCAxLCAyMCwgMHgwMGYwMDAwMH0sCisJCXtNT0RFX0hUTUlYLCAxLCAxLCAxNiwgMHgwMDBmMDAwMH0sCisJCXtNT0RFX0hUTUlYLCAyLCAxLCAyOCwgMHhmMDAwMDAwMH0sCisJCXtNT0RFX0hUTUlYLCAzLCAxLCAyNCwgMHgwZjAwMDAwMH0sCisJCXtNT0RFX0hUTUlYLCA0LCAyLCA0LCAweDAwMDAwMGYwfSwKKwkJe01PREVfSFRNSVgsIDUsIDIsIDAsIDB4MDAwMDAwMGZ9LAorCQl7TU9ERV9IVE1JWCwgNiwgMiwgMTIsIDB4MDAwMGYwMDB9LAorCQl7TU9ERV9IVE1JWCwgNywgMiwgOCwgMHgwMDAwMGYwMH0sCisJCXtNT0RFX0hUTUlYLCA4LCAyLCAyMCwgMHgwMGYwMDAwMH0sCisJCXtNT0RFX0hUTUlYLCA5LCAyLCAxNiwgMHgwMDBmMDAwMH0sCisJCXtNT0RFX0hUTUlYLCAxMCwgMiwgMjgsIDB4ZjAwMDAwMDB9LAorCQl7TU9ERV9IVE1JWCwgMTEsIDIsIDI0LCAweDBmMDAwMDAwfSwKKwkJe01PREVfSFRNSVgsIDEyLCAzLCA0LCAweDAwMDAwMGYwfSwKKwkJe01PREVfSFRNSVgsIDEzLCAzLCAwLCAweDAwMDAwMDBmfSwKKwkJe01PREVfSFRNSVgsIDE0LCAzLCAxMiwgMHgwMDAwZjAwMH0sCisJCXtNT0RFX0hUTUlYLCAxNSwgMywgOCwgMHgwMDAwMGYwMH0KKwl9OworI2RlZmluZSBNQVhfVFhQV1JfVEFCX1NJWkUgKHNpemVvZihUeFB3ckNmZykgLyBzaXplb2Yoc3RydWN0IHR4X3B3cl9jZmcpKQorCisJQ3VyVHhQd3IgPSAxOTsKKworCS8qIGNoZWNrIFR4IFBvd2VyIHNldHRpbmcgZnJvbSBVSS4gKi8KKwlpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA5MCkgOworCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gNjApCS8qIHJlZHVjZSBQd3IgZm9yIDEgZEIuICovCisJCUN1clR4UHdyIC09IDE7CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiAzMCkJLyogcmVkdWNlIFB3ciBmb3IgMyBkQi4gKi8KKwkJQ3VyVHhQd3IgLT0gMzsKKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDE1KQkvKiByZWR1Y2UgUHdyIGZvciA2IGRCLiAqLworCQlDdXJUeFB3ciAtPSA2OworCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gOSkJLyogcmVkdWNlIFB3ciBmb3IgOSBkQi4gKi8KKwkJQ3VyVHhQd3IgLT0gOTsKKwllbHNlCQkJLyogcmVkdWNlIFB3ciBmb3IgMTIgZEIuICovCisJCUN1clR4UHdyIC09IDEyOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkgeworCQlpZiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPiAxNCkgeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFs0XTsKKwkJfSBlbHNlIHsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbNF07CisJCX0KKwl9IGVsc2UgeworCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KSB7CisJCQlUeFB3clswXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzRdOworCQl9IGVsc2UgeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFs0XTsKKwkJfQorCX0KKworCXN3aXRjaCAoSFRUeE1vZGUuZmllbGQuTU9ERSkgeworCWNhc2UgTU9ERV9DQ0s6CisJY2FzZSBNT0RFX09GRE06CisJCVZhbHVlID0gVHhQd3JbMV07CisJCVR4UHdyUmVmID0gKFZhbHVlICYgMHgwMDAwMGYwMCkgPj4gODsKKworCQlicmVhazsKKworCWNhc2UgTU9ERV9IVE1JWDoKKwljYXNlIE1PREVfSFRHUkVFTkZJRUxEOgorCQlpZiAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkgeworCQkJVmFsdWUgPSBUeFB3clsyXTsKKwkJCVR4UHdyUmVmID0gKFZhbHVlICYgMHgwMDAwMGYwMCkgPj4gODsKKwkJfSBlbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAyKSB7CisJCQlWYWx1ZSA9IFR4UHdyWzNdOworCQkJVHhQd3JSZWYgPSAoVmFsdWUgJiAweDAwMDAwZjAwKSA+PiA4OworCQl9CisJCWJyZWFrOworCX0KKworCVBoeU1vZGUgPSAoSFRUeE1vZGUuZmllbGQuTU9ERSA9PSBNT0RFX0hUR1JFRU5GSUVMRCkKKwkgICAgPyBNT0RFX0hUTUlYIDogSFRUeE1vZGUuZmllbGQuTU9ERTsKKworCWZvciAoSWR4ID0gMDsgSWR4IDwgTUFYX1RYUFdSX1RBQl9TSVpFOyBJZHgrKykgeworCQlpZiAoKFR4UHdyQ2ZnW0lkeF0uTW9kZSA9PSBQaHlNb2RlKQorCQkgICAgJiYgKFR4UHdyQ2ZnW0lkeF0uTUNTID09IEhUVHhNb2RlLmZpZWxkLk1DUykpIHsKKwkJCVZhbHVlID0gVHhQd3JbVHhQd3JDZmdbSWR4XS5yZXFdOworCQkJRGFsdGFQd3IgPQorCQkJICAgIFR4UHdyUmVmIC0gKGNoYXIpKChWYWx1ZSAmIFR4UHdyQ2ZnW0lkeF0uQml0TWFzaykKKwkJCQkJICAgICAgID4+IFR4UHdyQ2ZnW0lkeF0uc2hpZnQpOworCQkJQ3VyVHhQd3IgLT0gRGFsdGFQd3I7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBDdXJUeFB3cjsKK30KKwordm9pZCBNZWFzdXJlUmVxVGFiSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7CiAJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKIAotCXBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiID0ga21hbGxvYyhzaXplb2YoTUVBU1VSRV9SRVFfVEFCKSwgR0ZQX0FUT01JQyk7CisJcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIgPQorCSAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfdGFiKSwgR0ZQX0FUT01JQyk7CiAJaWYgKHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiKQotCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYiwgc2l6ZW9mKE1FQVNVUkVfUkVRX1RBQikpOworCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYiwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X21lYXN1cmVfcmVxX3RhYikpOwogCWVsc2UKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgRmFpbCB0byBhbGxvYyBtZW1vcnkgZm9yIHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiLlxuIiwgX19mdW5jX18pKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCIlcyBGYWlsIHRvIGFsbG9jIG1lbW9yeSBmb3IgcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIuXG4iLAorCQkJICBfX2Z1bmNfXykpOwogCiAJcmV0dXJuOwogfQogCi1WT0lEIE1lYXN1cmVSZXFUYWJFeGl0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQordm9pZCBNZWFzdXJlUmVxVGFiRXhpdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JTmRpc0ZyZWVTcGluTG9jayhwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7CisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOwogCiAJaWYgKHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiKQogCQlrZnJlZShwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYik7CkBAIC02NiwxOCArNDIzLDE2IEBACiAJcmV0dXJuOwogfQogCi1zdGF0aWMgUE1FQVNVUkVfUkVRX0VOVFJZIE1lYXN1cmVSZXFMb29rVXAoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUlOVDgJCQlEaWFsb2dUb2tlbikKK3N0cnVjdCBydF9tZWFzdXJlX3JlcV9lbnRyeSAqTWVhc3VyZVJlcUxvb2tVcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IERpYWxvZ1Rva2VuKQogewotCVVJTlQgSGFzaElkeDsKLQlQTUVBU1VSRV9SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYjsKLQlQTUVBU1VSRV9SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTDsKLQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisJdTMyIEhhc2hJZHg7CisJc3RydWN0IHJ0X21lYXN1cmVfcmVxX3RhYiAqcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiOworCXN0cnVjdCBydF9tZWFzdXJlX3JlcV9lbnRyeSAqcEVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfZW50cnkgKnBQcmV2RW50cnkgPSBOVUxMOwogCi0JaWYgKHBUYWIgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwTWVhc3VyZVJlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19mdW5jX18pKTsKKwlpZiAocFRhYiA9PSBOVUxMKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiJXM6IHBNZWFzdXJlUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTg2LDEyICs0NDEsMTAgQEAKIAlIYXNoSWR4ID0gTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChEaWFsb2dUb2tlbik7CiAJcEVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKIAotCXdoaWxlIChwRW50cnkpCi0JeworCXdoaWxlIChwRW50cnkpIHsKIAkJaWYgKHBFbnRyeS0+RGlhbG9nVG9rZW4gPT0gRGlhbG9nVG9rZW4pCiAJCQlicmVhazsKLQkJZWxzZQotCQl7CisJCWVsc2UgewogCQkJcFByZXZFbnRyeSA9IHBFbnRyeTsKIAkJCXBFbnRyeSA9IHBFbnRyeS0+cE5leHQ7CiAJCX0KQEAgLTEwMiw1MCArNDU1LDQ5IEBACiAJcmV0dXJuIHBFbnRyeTsKIH0KIAotc3RhdGljIFBNRUFTVVJFX1JFUV9FTlRSWSBNZWFzdXJlUmVxSW5zZXJ0KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCitzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfZW50cnkgKk1lYXN1cmVSZXFJbnNlcnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBEaWFsb2dUb2tlbikKIHsKLQlJTlQgaTsKLQlVTE9ORyBIYXNoSWR4OwotCVBNRUFTVVJFX1JFUV9UQUIgcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiOwotCVBNRUFTVVJFX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMLCBwQ3VyckVudHJ5OwotCVVMT05HIE5vdzsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIEhhc2hJZHg7CisJc3RydWN0IHJ0X21lYXN1cmVfcmVxX3RhYiAqcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiOworCXN0cnVjdCBydF9tZWFzdXJlX3JlcV9lbnRyeSAqcEVudHJ5ID0gTlVMTCwgKnBDdXJyRW50cnk7CisJdW5zaWduZWQgbG9uZyBOb3c7CiAKLQlpZihwVGFiID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcE1lYXN1cmVSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fZnVuY19fKSk7CisJaWYgKHBUYWIgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIiVzOiBwTWVhc3VyZVJlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19mdW5jX18pKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCiAJcEVudHJ5ID0gTWVhc3VyZVJlcUxvb2tVcChwQWQsIERpYWxvZ1Rva2VuKTsKLQlpZiAocEVudHJ5ID09IE5VTEwpCi0JeworCWlmIChwRW50cnkgPT0gTlVMTCkgewogCQlSVE1QX1NFTV9MT0NLKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7Ci0JCWZvciAoaSA9IDA7IGkgPCBNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkU7IGkrKykKLQkJeworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFOyBpKyspIHsKIAkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CiAJCQlwRW50cnkgPSAmcFRhYi0+Q29udGVudFtpXTsKIAogCQkJaWYgKChwRW50cnktPlZhbGlkID09IFRSVUUpCi0JCQkJJiYgUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdywgKHVuc2lnbmVkIGxvbmcpKHBFbnRyeS0+bGFzdFRpbWUgKyBNUV9SRVFfQUdFX09VVCkpKQorCQkJICAgICYmIFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3csCisJCQkJCSAgICAgICAodW5zaWduZWQgbG9uZykocEVudHJ5LT4KKwkJCQkJCQkgICAgICAgbGFzdFRpbWUgKworCQkJCQkJCSAgICAgICBNUV9SRVFfQUdFX09VVCkpKQogCQkJewotCQkJCVBNRUFTVVJFX1JFUV9FTlRSWSBwUHJldkVudHJ5ID0gTlVMTDsKLQkJCQlVTE9ORyBIYXNoSWR4ID0gTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChwRW50cnktPkRpYWxvZ1Rva2VuKTsKLQkJCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByb2JlRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCQkJCXN0cnVjdCBydF9tZWFzdXJlX3JlcV9lbnRyeSAqcFByZXZFbnRyeSA9IE5VTEw7CisJCQkJdW5zaWduZWQgbG9uZyBIYXNoSWR4ID0KKwkJCQkgICAgTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChwRW50cnktPgorCQkJCQkJCSAgICAgIERpYWxvZ1Rva2VuKTsKKwkJCQlzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfZW50cnkgKnBQcm9iZUVudHJ5ID0KKwkJCQkgICAgcFRhYi0+SGFzaFtIYXNoSWR4XTsKIAotCQkJCS8vIHVwZGF0ZSBIYXNoIGxpc3QKLQkJCQlkbwotCQkJCXsKLQkJCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKLQkJCQkJewotCQkJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkKLQkJCQkJCXsKLQkJCQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7CisJCQkJLyogdXBkYXRlIEhhc2ggbGlzdCAqLworCQkJCWRvIHsKKwkJCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkgeworCQkJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkgeworCQkJCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPQorCQkJCQkJCSAgICBwRW50cnktPnBOZXh0OworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9CisJCQkJCQkJICAgIHBFbnRyeS0+cE5leHQ7CiAJCQkJCQl9CiAJCQkJCQlicmVhazsKIAkJCQkJfQpAQCAtMTU0LDcgKzUwNiw4IEBACiAJCQkJCXBQcm9iZUVudHJ5ID0gcFByb2JlRW50cnktPnBOZXh0OwogCQkJCX0gd2hpbGUgKHBQcm9iZUVudHJ5KTsKIAotCQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKE1FQVNVUkVfUkVRX0VOVFJZKSk7CisJCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9tZWFzdXJlX3JlcV9lbnRyeSkpOwogCQkJCXBUYWItPlNpemUtLTsKIAogCQkJCWJyZWFrOwpAQCAtMTY0LDMwICs1MTcsMjQgQEAKIAkJCQlicmVhazsKIAkJfQogCi0JCWlmIChpIDwgTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFKQotCQl7CisJCWlmIChpIDwgTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFKSB7CiAJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwogCQkJcEVudHJ5LT5sYXN0VGltZSA9IE5vdzsKIAkJCXBFbnRyeS0+VmFsaWQgPSBUUlVFOwogCQkJcEVudHJ5LT5EaWFsb2dUb2tlbiA9IERpYWxvZ1Rva2VuOwogCQkJcFRhYi0+U2l6ZSsrOwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJcEVudHJ5ID0gTlVMTDsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwTWVhc3VyZVJlcVRhYiB0YWIgZnVsbC5cbiIsIF9fZnVuY19fKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCIlczogcE1lYXN1cmVSZXFUYWIgdGFiIGZ1bGwuXG4iLCBfX2Z1bmNfXykpOwogCQl9CiAKLQkJLy8gYWRkIHRoaXMgTmVpZ2hib3IgZW50cnkgaW50byBIQVNIIHRhYmxlCi0JCWlmIChwRW50cnkpCi0JCXsKKwkJLyogYWRkIHRoaXMgTmVpZ2hib3IgZW50cnkgaW50byBIQVNIIHRhYmxlICovCisJCWlmIChwRW50cnkpIHsKIAkJCUhhc2hJZHggPSBNUV9ESUFMT0dUT0tFTl9IQVNIX0lOREVYKERpYWxvZ1Rva2VuKTsKLQkJCWlmIChwVGFiLT5IYXNoW0hhc2hJZHhdID09IE5VTEwpCi0JCQl7CisJCQlpZiAocFRhYi0+SGFzaFtIYXNoSWR4XSA9PSBOVUxMKSB7CiAJCQkJcFRhYi0+SGFzaFtIYXNoSWR4XSA9IHBFbnRyeTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKKwkJCX0gZWxzZSB7CiAJCQkJcEN1cnJFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CiAJCQkJd2hpbGUgKHBDdXJyRW50cnktPnBOZXh0ICE9IE5VTEwpCiAJCQkJCXBDdXJyRW50cnkgPSBwQ3VyckVudHJ5LT5wTmV4dDsKQEAgLTIwMSw0NSArNTQ4LDM1IEBACiAJcmV0dXJuIHBFbnRyeTsKIH0KIAotc3RhdGljIFZPSUQgTWVhc3VyZVJlcURlbGV0ZSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQordm9pZCBNZWFzdXJlUmVxRGVsZXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggRGlhbG9nVG9rZW4pCiB7Ci0JUE1FQVNVUkVfUkVRX1RBQiBwVGFiID0gcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWI7Ci0JUE1FQVNVUkVfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisJc3RydWN0IHJ0X21lYXN1cmVfcmVxX3RhYiAqcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiOworCXN0cnVjdCBydF9tZWFzdXJlX3JlcV9lbnRyeSAqcEVudHJ5ID0gTlVMTDsKIAotCWlmKHBUYWIgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwTWVhc3VyZVJlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19mdW5jX18pKTsKKwlpZiAocFRhYiA9PSBOVUxMKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiJXM6IHBNZWFzdXJlUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm47CiAJfQotCi0JLy8gaWYgZW1wdHksIHJldHVybgotCWlmIChwVGFiLT5TaXplID09IDApCi0JeworCS8qIGlmIGVtcHR5LCByZXR1cm4gKi8KKwlpZiAocFRhYi0+U2l6ZSA9PSAwKSB7CiAJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInBNZWFzdXJlUmVxVGFiIGVtcHR5LlxuIikpOwogCQlyZXR1cm47CiAJfQogCiAJcEVudHJ5ID0gTWVhc3VyZVJlcUxvb2tVcChwQWQsIERpYWxvZ1Rva2VuKTsKLQlpZiAocEVudHJ5ICE9IE5VTEwpCi0JewotCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7Ci0JCVVMT05HIEhhc2hJZHggPSBNUV9ESUFMT0dUT0tFTl9IQVNIX0lOREVYKHBFbnRyeS0+RGlhbG9nVG9rZW4pOwotCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByb2JlRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCWlmIChwRW50cnkgIT0gTlVMTCkgeworCQlzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfZW50cnkgKnBQcmV2RW50cnkgPSBOVUxMOworCQl1bnNpZ25lZCBsb25nIEhhc2hJZHggPSBNUV9ESUFMT0dUT0tFTl9IQVNIX0lOREVYKHBFbnRyeS0+RGlhbG9nVG9rZW4pOworCQlzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfZW50cnkgKnBQcm9iZUVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKIAogCQlSVE1QX1NFTV9MT0NLKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7Ci0JCS8vIHVwZGF0ZSBIYXNoIGxpc3QKLQkJZG8KLQkJewotCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKLQkJCXsKLQkJCQlpZiAocFByZXZFbnRyeSA9PSBOVUxMKQotCQkJCXsKKwkJLyogdXBkYXRlIEhhc2ggbGlzdCAqLworCQlkbyB7CisJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KSB7CisJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkgewogCQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKKwkJCQl9IGVsc2UgewogCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtMjQ5LDcgKzU4Niw3IEBACiAJCQlwUHJvYmVFbnRyeSA9IHBQcm9iZUVudHJ5LT5wTmV4dDsKIAkJfSB3aGlsZSAocFByb2JlRW50cnkpOwogCi0JCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKE1FQVNVUkVfUkVRX0VOVFJZKSk7CisJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKHN0cnVjdCBydF9tZWFzdXJlX3JlcV9lbnRyeSkpOwogCQlwVGFiLT5TaXplLS07CiAKIAkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7CkBAIC0yNTgsMjQgKzU5NSwyNCBAQAogCXJldHVybjsKIH0KIAotVk9JRCBUcGNSZXFUYWJJbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQordm9pZCBUcGNSZXFUYWJJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKIAlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CiAKLQlwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiID0ga21hbGxvYyhzaXplb2YoVFBDX1JFUV9UQUIpLCBHRlBfQVRPTUlDKTsKKwlwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJ0X3RwY19yZXFfdGFiKSwgR0ZQX0FUT01JQyk7CiAJaWYgKHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIpCi0JCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIsIHNpemVvZihUUENfUkVRX1RBQikpOworCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiLCBzaXplb2Yoc3RydWN0IHJ0X3RwY19yZXFfdGFiKSk7CiAJZWxzZQotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyBGYWlsIHRvIGFsbG9jIG1lbW9yeSBmb3IgcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYi5cbiIsIF9fZnVuY19fKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiJXMgRmFpbCB0byBhbGxvYyBtZW1vcnkgZm9yIHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIuXG4iLAorCQkJICBfX2Z1bmNfXykpOwogCiAJcmV0dXJuOwogfQogCi1WT0lEIFRwY1JlcVRhYkV4aXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCit2b2lkIFRwY1JlcVRhYkV4aXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCU5kaXNGcmVlU3BpbkxvY2socEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CiAKIAlpZiAocEFkLT5Db21tb25DZmcucFRwY1JlcVRhYikKIAkJa2ZyZWUocEFkLT5Db21tb25DZmcucFRwY1JlcVRhYik7CkBAIC0yODQsMTggKzYyMSwxNiBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIFBUUENfUkVRX0VOVFJZIFRwY1JlcUxvb2tVcCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQorc3RhdGljIHN0cnVjdCBydF90cGNfcmVxX2VudHJ5ICpUcGNSZXFMb29rVXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBEaWFsb2dUb2tlbikKIHsKLQlVSU5UIEhhc2hJZHg7Ci0JUFRQQ19SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiOwotCVBUUENfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7Ci0JUFRQQ19SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisJdTMyIEhhc2hJZHg7CisJc3RydWN0IHJ0X3RwY19yZXFfdGFiICpwVGFiID0gcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYjsKKwlzdHJ1Y3QgcnRfdHBjX3JlcV9lbnRyeSAqcEVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgcnRfdHBjX3JlcV9lbnRyeSAqcFByZXZFbnRyeSA9IE5VTEw7CiAKLQlpZiAocFRhYiA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fZnVuY19fKSk7CisJaWYgKHBUYWIgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIiVzOiBwVHBjUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTMwNCwxMiArNjM5LDEwIEBACiAJSGFzaElkeCA9IFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKERpYWxvZ1Rva2VuKTsKIAlwRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOwogCi0Jd2hpbGUgKHBFbnRyeSkKLQl7CisJd2hpbGUgKHBFbnRyeSkgewogCQlpZiAocEVudHJ5LT5EaWFsb2dUb2tlbiA9PSBEaWFsb2dUb2tlbikKIAkJCWJyZWFrOwotCQllbHNlCi0JCXsKKwkJZWxzZSB7CiAJCQlwUHJldkVudHJ5ID0gcEVudHJ5OwogCQkJcEVudHJ5ID0gcEVudHJ5LT5wTmV4dDsKIAkJfQpAQCAtMzIwLDUxICs2NTMsNDkgQEAKIAlyZXR1cm4gcEVudHJ5OwogfQogCi0KLXN0YXRpYyBQVFBDX1JFUV9FTlRSWSBUcGNSZXFJbnNlcnQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUlOVDgJCQlEaWFsb2dUb2tlbikKK3N0YXRpYyBzdHJ1Y3QgcnRfdHBjX3JlcV9lbnRyeSAqVHBjUmVxSW5zZXJ0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggRGlhbG9nVG9rZW4pCiB7Ci0JSU5UIGk7Ci0JVUxPTkcgSGFzaElkeDsKLQlQVFBDX1JFUV9UQUIgcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWI7Ci0JUFRQQ19SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTCwgcEN1cnJFbnRyeTsKLQlVTE9ORyBOb3c7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBIYXNoSWR4OworCXN0cnVjdCBydF90cGNfcmVxX3RhYiAqcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWI7CisJc3RydWN0IHJ0X3RwY19yZXFfZW50cnkgKnBFbnRyeSA9IE5VTEwsICpwQ3VyckVudHJ5OworCXVuc2lnbmVkIGxvbmcgTm93OwogCi0JaWYocFRhYiA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fZnVuY19fKSk7CisJaWYgKHBUYWIgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIiVzOiBwVHBjUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKIAlwRW50cnkgPSBUcGNSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbik7Ci0JaWYgKHBFbnRyeSA9PSBOVUxMKQotCXsKKwlpZiAocEVudHJ5ID09IE5VTEwpIHsKIAkJUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7Ci0JCWZvciAoaSA9IDA7IGkgPCBNQVhfVFBDX1JFUV9UQUJfU0laRTsgaSsrKQotCQl7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfVFBDX1JFUV9UQUJfU0laRTsgaSsrKSB7CiAJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwogCQkJcEVudHJ5ID0gJnBUYWItPkNvbnRlbnRbaV07CiAKIAkJCWlmICgocEVudHJ5LT5WYWxpZCA9PSBUUlVFKQotCQkJCSYmIFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3csICh1bnNpZ25lZCBsb25nKShwRW50cnktPmxhc3RUaW1lICsgVFBDX1JFUV9BR0VfT1VUKSkpCisJCQkgICAgJiYgUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdywKKwkJCQkJICAgICAgICh1bnNpZ25lZCBsb25nKShwRW50cnktPgorCQkJCQkJCSAgICAgICBsYXN0VGltZSArCisJCQkJCQkJICAgICAgIFRQQ19SRVFfQUdFX09VVCkpKQogCQkJewotCQkJCVBUUENfUkVRX0VOVFJZIHBQcmV2RW50cnkgPSBOVUxMOwotCQkJCVVMT05HIEhhc2hJZHggPSBUUENfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChwRW50cnktPkRpYWxvZ1Rva2VuKTsKLQkJCQlQVFBDX1JFUV9FTlRSWSBwUHJvYmVFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CisJCQkJc3RydWN0IHJ0X3RwY19yZXFfZW50cnkgKnBQcmV2RW50cnkgPSBOVUxMOworCQkJCXVuc2lnbmVkIGxvbmcgSGFzaElkeCA9CisJCQkJICAgIFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKHBFbnRyeS0+CisJCQkJCQkJICAgICAgIERpYWxvZ1Rva2VuKTsKKwkJCQlzdHJ1Y3QgcnRfdHBjX3JlcV9lbnRyeSAqcFByb2JlRW50cnkgPQorCQkJCSAgICBwVGFiLT5IYXNoW0hhc2hJZHhdOwogCi0JCQkJLy8gdXBkYXRlIEhhc2ggbGlzdAotCQkJCWRvCi0JCQkJewotCQkJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KQotCQkJCQl7Ci0JCQkJCQlpZiAocFByZXZFbnRyeSA9PSBOVUxMKQotCQkJCQkJewotCQkJCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPSBwRW50cnktPnBOZXh0OwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCXBQcmV2RW50cnktPnBOZXh0ID0gcEVudHJ5LT5wTmV4dDsKKwkJCQkvKiB1cGRhdGUgSGFzaCBsaXN0ICovCisJCQkJZG8geworCQkJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KSB7CisJCQkJCQlpZiAocFByZXZFbnRyeSA9PSBOVUxMKSB7CisJCQkJCQkJcFRhYi0+SGFzaFtIYXNoSWR4XSA9CisJCQkJCQkJICAgIHBFbnRyeS0+cE5leHQ7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXBQcmV2RW50cnktPnBOZXh0ID0KKwkJCQkJCQkgICAgcEVudHJ5LT5wTmV4dDsKIAkJCQkJCX0KIAkJCQkJCWJyZWFrOwogCQkJCQl9CkBAIC0zNzMsNyArNzA0LDcgQEAKIAkJCQkJcFByb2JlRW50cnkgPSBwUHJvYmVFbnRyeS0+cE5leHQ7CiAJCQkJfSB3aGlsZSAocFByb2JlRW50cnkpOwogCi0JCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoVFBDX1JFUV9FTlRSWSkpOworCQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKHN0cnVjdCBydF90cGNfcmVxX2VudHJ5KSk7CiAJCQkJcFRhYi0+U2l6ZS0tOwogCiAJCQkJYnJlYWs7CkBAIC0zODMsMzAgKzcxNCwyNCBAQAogCQkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKGkgPCBNQVhfVFBDX1JFUV9UQUJfU0laRSkKLQkJeworCQlpZiAoaSA8IE1BWF9UUENfUkVRX1RBQl9TSVpFKSB7CiAJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwogCQkJcEVudHJ5LT5sYXN0VGltZSA9IE5vdzsKIAkJCXBFbnRyeS0+VmFsaWQgPSBUUlVFOwogCQkJcEVudHJ5LT5EaWFsb2dUb2tlbiA9IERpYWxvZ1Rva2VuOwogCQkJcFRhYi0+U2l6ZSsrOwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJcEVudHJ5ID0gTlVMTDsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwVHBjUmVxVGFiIHRhYiBmdWxsLlxuIiwgX19mdW5jX18pKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIiVzOiBwVHBjUmVxVGFiIHRhYiBmdWxsLlxuIiwgX19mdW5jX18pKTsKIAkJfQogCi0JCS8vIGFkZCB0aGlzIE5laWdoYm9yIGVudHJ5IGludG8gSEFTSCB0YWJsZQotCQlpZiAocEVudHJ5KQotCQl7CisJCS8qIGFkZCB0aGlzIE5laWdoYm9yIGVudHJ5IGludG8gSEFTSCB0YWJsZSAqLworCQlpZiAocEVudHJ5KSB7CiAJCQlIYXNoSWR4ID0gVFBDX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgoRGlhbG9nVG9rZW4pOwotCQkJaWYgKHBUYWItPkhhc2hbSGFzaElkeF0gPT0gTlVMTCkKLQkJCXsKKwkJCWlmIChwVGFiLT5IYXNoW0hhc2hJZHhdID09IE5VTEwpIHsKIAkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5OwotCQkJfQotCQkJZWxzZQotCQkJeworCQkJfSBlbHNlIHsKIAkJCQlwQ3VyckVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKIAkJCQl3aGlsZSAocEN1cnJFbnRyeS0+cE5leHQgIT0gTlVMTCkKIAkJCQkJcEN1cnJFbnRyeSA9IHBDdXJyRW50cnktPnBOZXh0OwpAQCAtNDIwLDQ1ICs3NDUsMzUgQEAKIAlyZXR1cm4gcEVudHJ5OwogfQogCi1zdGF0aWMgVk9JRCBUcGNSZXFEZWxldGUoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUlOVDgJCQlEaWFsb2dUb2tlbikKK3N0YXRpYyB2b2lkIFRwY1JlcURlbGV0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IERpYWxvZ1Rva2VuKQogewotCVBUUENfUkVRX1RBQiBwVGFiID0gcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYjsKLQlQVFBDX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMOworCXN0cnVjdCBydF90cGNfcmVxX3RhYiAqcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWI7CisJc3RydWN0IHJ0X3RwY19yZXFfZW50cnkgKnBFbnRyeSA9IE5VTEw7CiAKLQlpZihwVGFiID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcFRwY1JlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19mdW5jX18pKTsKKwlpZiAocFRhYiA9PSBOVUxMKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiJXM6IHBUcGNSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fZnVuY19fKSk7CiAJCXJldHVybjsKIAl9Ci0KLQkvLyBpZiBlbXB0eSwgcmV0dXJuCi0JaWYgKHBUYWItPlNpemUgPT0gMCkKLQl7CisJLyogaWYgZW1wdHksIHJldHVybiAqLworCWlmIChwVGFiLT5TaXplID09IDApIHsKIAkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgicFRwY1JlcVRhYiBlbXB0eS5cbiIpKTsKIAkJcmV0dXJuOwogCX0KIAogCXBFbnRyeSA9IFRwY1JlcUxvb2tVcChwQWQsIERpYWxvZ1Rva2VuKTsKLQlpZiAocEVudHJ5ICE9IE5VTEwpCi0JewotCQlQVFBDX1JFUV9FTlRSWSBwUHJldkVudHJ5ID0gTlVMTDsKLQkJVUxPTkcgSGFzaElkeCA9IFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKHBFbnRyeS0+RGlhbG9nVG9rZW4pOwotCQlQVFBDX1JFUV9FTlRSWSBwUHJvYmVFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CisJaWYgKHBFbnRyeSAhPSBOVUxMKSB7CisJCXN0cnVjdCBydF90cGNfcmVxX2VudHJ5ICpwUHJldkVudHJ5ID0gTlVMTDsKKwkJdW5zaWduZWQgbG9uZyBIYXNoSWR4ID0gVFBDX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgocEVudHJ5LT5EaWFsb2dUb2tlbik7CisJCXN0cnVjdCBydF90cGNfcmVxX2VudHJ5ICpwUHJvYmVFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CiAKIAkJUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7Ci0JCS8vIHVwZGF0ZSBIYXNoIGxpc3QKLQkJZG8KLQkJewotCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKLQkJCXsKLQkJCQlpZiAocFByZXZFbnRyeSA9PSBOVUxMKQotCQkJCXsKKwkJLyogdXBkYXRlIEhhc2ggbGlzdCAqLworCQlkbyB7CisJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KSB7CisJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkgewogCQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKKwkJCQl9IGVsc2UgewogCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtNDY4LDcgKzc4Myw3IEBACiAJCQlwUHJvYmVFbnRyeSA9IHBQcm9iZUVudHJ5LT5wTmV4dDsKIAkJfSB3aGlsZSAocFByb2JlRW50cnkpOwogCi0JCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKFRQQ19SRVFfRU5UUlkpKTsKKwkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2Yoc3RydWN0IHJ0X3RwY19yZXFfZW50cnkpKTsKIAkJcFRhYi0+U2l6ZS0tOwogCiAJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CkBAIC00ODcsMTAgKzgwMiw5IEBACiAJUmV0dXJuCTogQ3VycmVudCBUaW1lIFN0YW1wLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLXN0YXRpYyBVSU5UNjQgR2V0Q3VycmVudFRpbWVTdGFtcCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3N0YXRpYyB1NjQgR2V0Q3VycmVudFRpbWVTdGFtcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JLy8gZ2V0IGN1cnJlbnQgdGltZSBzdGFtcC4KKwkvKiBnZXQgY3VycmVudCB0aW1lIHN0YW1wLiAqLwogCXJldHVybiAwOwogfQogCkBAIC01MDQsMTEgKzgxOCw3MyBAQAogCVJldHVybgk6IEN1cnJlbnQgVGltZSBTdGFtcC4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1zdGF0aWMgVUlOVDggR2V0Q3VyVHhQd3IoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUlOVDggV2NpZCkKK3N0YXRpYyB1OCBHZXRDdXJUeFB3cihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IFdjaWQpCiB7Ci0JcmV0dXJuIDE2OyAvKiAxNiBkQm0gKi8KKwlyZXR1cm4gMTY7CQkvKiAxNiBkQm0gKi8KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlHZXQgQ3VycmVudCBUcmFuc21pdCBQb3dlci4KKworCVBhcmFtZXRyczoKKworCVJldHVybgk6IEN1cnJlbnQgVGltZSBTdGFtcC4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCit2b2lkIEluc2VydENoYW5uZWxSZXBJRShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQl1OCAqcEZyYW1lQnVmLAorCQkJdW5zaWduZWQgbG9uZyAqcEZyYW1lTGVuLAorCQkJY2hhciAqcENvdW50cnksIHU4IFJlZ3VsYXRvcnlDbGFzcykKK3sKKwl1bnNpZ25lZCBsb25nIFRlbXBMZW47CisJdTggTGVuOworCXU4IElFSWQgPSBJRV9BUF9DSEFOTkVMX1JFUE9SVDsKKwl1OCAqcENoTGlzdFB0ciA9IE5VTEw7CisKKwlMZW4gPSAxOworCWlmIChzdHJuY21wKHBDb3VudHJ5LCAiVVMiLCAyKSA9PSAwKSB7CisJCWlmIChSZWd1bGF0b3J5Q2xhc3MgPj0gVVNBX1JFR1VMQVRPUllfSU5GT19TSVpFKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCIlczogVVNBIFVua25vdyBSZXF1bGF0b3J5IGNsYXNzICglZClcbiIsCisJCQkJICBfX2Z1bmNfXywgUmVndWxhdG9yeUNsYXNzKSk7CisJCQlyZXR1cm47CisJCX0KKworCQlMZW4gKz0KKwkJICAgIFVTQVJlZ3VsYXRvcnlJbmZvW1JlZ3VsYXRvcnlDbGFzc10uQ2hhbm5lbFNldC4KKwkJICAgIE51bWJlck9mQ2hhbm5lbHM7CisJCXBDaExpc3RQdHIgPQorCQkgICAgVVNBUmVndWxhdG9yeUluZm9bUmVndWxhdG9yeUNsYXNzXS5DaGFubmVsU2V0LkNoYW5uZWxMaXN0OworCX0gZWxzZSBpZiAoc3RybmNtcChwQ291bnRyeSwgIkpQIiwgMikgPT0gMCkgeworCQlpZiAoUmVndWxhdG9yeUNsYXNzID49IEpQX1JFR1VMQVRPUllfSU5GT19TSVpFKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCIlczogSlAgVW5rbm93IFJlcXVsYXRvcnkgY2xhc3MgKCVkKVxuIiwKKwkJCQkgIF9fZnVuY19fLCBSZWd1bGF0b3J5Q2xhc3MpKTsKKwkJCXJldHVybjsKKwkJfQorCisJCUxlbiArPQorCQkgICAgSmFwYW5SZWd1bGF0b3J5SW5mb1tSZWd1bGF0b3J5Q2xhc3NdLkNoYW5uZWxTZXQuCisJCSAgICBOdW1iZXJPZkNoYW5uZWxzOworCQlwQ2hMaXN0UHRyID0KKwkJICAgIEphcGFuUmVndWxhdG9yeUluZm9bUmVndWxhdG9yeUNsYXNzXS5DaGFubmVsU2V0LkNoYW5uZWxMaXN0OworCX0gZWxzZSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBVbmtub3cgQ291bnRyeSAoJXMpXG4iLAorCQkJCQkgIF9fZnVuY19fLCBwQ291bnRyeSkpOworCQlyZXR1cm47CisJfQorCisJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLCAmVGVtcExlbiwKKwkJCSAgMSwgJklFSWQsCisJCQkgIDEsICZMZW4sCisJCQkgIDEsICZSZWd1bGF0b3J5Q2xhc3MsCisJCQkgIExlbiAtIDEsIHBDaExpc3RQdHIsIEVORF9PRl9BUkdTKTsKKworCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKworCXJldHVybjsKIH0KIAogLyoKQEAgLTUyNCwxNiArOTAwLDEyIEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1zdGF0aWMgVk9JRCBJbnNlcnREaWFsb2dUb2tlbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbiwKLQlJTiBVSU5UOCBEaWFsb2dUb2tlbikKK3ZvaWQgSW5zZXJ0RGlhbG9nVG9rZW4oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICAgdTggKnBGcmFtZUJ1ZiwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnBGcmFtZUxlbiwgdTggRGlhbG9nVG9rZW4pCiB7Ci0JVUxPTkcgVGVtcExlbjsKLQlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCSZUZW1wTGVuLAotCQkJCQkxLAkJCQkmRGlhbG9nVG9rZW4sCi0JCQkJCUVORF9PRl9BUkdTKTsKKwl1bnNpZ25lZCBsb25nIFRlbXBMZW47CisJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLCAmVGVtcExlbiwgMSwgJkRpYWxvZ1Rva2VuLCBFTkRfT0ZfQVJHUyk7CiAKIAkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CiAKQEAgLTU1MiwxOSArOTI0LDE1IEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi0gc3RhdGljIFZPSUQgSW5zZXJ0VHBjUmVxSUUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCi0JT1VUIFBVTE9ORyBwRnJhbWVMZW4pCitzdGF0aWMgdm9pZCBJbnNlcnRUcGNSZXFJRShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB1OCAqcEZyYW1lQnVmLCB1bnNpZ25lZCBsb25nICpwRnJhbWVMZW4pCiB7Ci0JVUxPTkcgVGVtcExlbjsKLQlVTE9ORyBMZW4gPSAwOwotCVVJTlQ4IEVsZW1lbnRJRCA9IElFX1RQQ19SRVFVRVNUOworCXVuc2lnbmVkIGxvbmcgVGVtcExlbjsKKwl1bnNpZ25lZCBsb25nIExlbiA9IDA7CisJdTggRWxlbWVudElEID0gSUVfVFBDX1JFUVVFU1Q7CiAKLQlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCQkJCQkmVGVtcExlbiwKLQkJCQkJCTEsCQkJCQkJCSZFbGVtZW50SUQsCi0JCQkJCQkxLAkJCQkJCQkmTGVuLAotCQkJCQkJRU5EX09GX0FSR1MpOworCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwgJlRlbXBMZW4sCisJCQkgIDEsICZFbGVtZW50SUQsIDEsICZMZW4sIEVORF9PRl9BUkdTKTsKIAogCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKIApAQCAtNTg1LDMwICs5NTMsMjUgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLSBzdGF0aWMgVk9JRCBJbnNlcnRUcGNSZXBvcnRJRSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbiwKLQlJTiBVSU5UOCBUeFB3ciwKLQlJTiBVSU5UOCBMaW5rTWFyZ2luKQordm9pZCBJbnNlcnRUcGNSZXBvcnRJRShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICB1OCAqcEZyYW1lQnVmLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyAqcEZyYW1lTGVuLAorCQkgICAgICAgdTggVHhQd3IsIHU4IExpbmtNYXJnaW4pCiB7Ci0JVUxPTkcgVGVtcExlbjsKLQlVTE9ORyBMZW4gPSBzaXplb2YoVFBDX1JFUE9SVF9JTkZPKTsKLQlVSU5UOCBFbGVtZW50SUQgPSBJRV9UUENfUkVQT1JUOwotCVRQQ19SRVBPUlRfSU5GTyBUcGNSZXBvcnRJRTsKKwl1bnNpZ25lZCBsb25nIFRlbXBMZW47CisJdW5zaWduZWQgbG9uZyBMZW4gPSBzaXplb2Yoc3RydWN0IHJ0X3RwY19yZXBvcnRfaW5mbyk7CisJdTggRWxlbWVudElEID0gSUVfVFBDX1JFUE9SVDsKKwlzdHJ1Y3QgcnRfdHBjX3JlcG9ydF9pbmZvIFRwY1JlcG9ydElFOwogCiAJVHBjUmVwb3J0SUUuVHhQd3IgPSBUeFB3cjsKIAlUcGNSZXBvcnRJRS5MaW5rTWFyZ2luID0gTGlua01hcmdpbjsKIAotCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJCQkJCSZUZW1wTGVuLAotCQkJCQkJMSwJCQkJCQkJJkVsZW1lbnRJRCwKLQkJCQkJCTEsCQkJCQkJCSZMZW4sCi0JCQkJCQlMZW4sCQkJCQkJJlRwY1JlcG9ydElFLAotCQkJCQkJRU5EX09GX0FSR1MpOworCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwgJlRlbXBMZW4sCisJCQkgIDEsICZFbGVtZW50SUQsCisJCQkgIDEsICZMZW4sIExlbiwgJlRwY1JlcG9ydElFLCBFTkRfT0ZfQVJHUyk7CiAKIAkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CiAKLQogCXJldHVybjsKIH0KIApAQCAtNjI3LDMyICs5OTAsMjYgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLXN0YXRpYyBWT0lEIEluc2VydENoU3dBbm5JRSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbiwKLQlJTiBVSU5UOCBDaFN3TW9kZSwKLQlJTiBVSU5UOCBOZXdDaGFubmVsLAotCUlOIFVJTlQ4IENoU3dDbnQpCitzdGF0aWMgdm9pZCBJbnNlcnRDaFN3QW5uSUUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHU4ICpwRnJhbWVCdWYsCisJCQkgICAgdW5zaWduZWQgbG9uZyAqcEZyYW1lTGVuLAorCQkJICAgIHU4IENoU3dNb2RlLAorCQkJICAgIHU4IE5ld0NoYW5uZWwsIHU4IENoU3dDbnQpCiB7Ci0JVUxPTkcgVGVtcExlbjsKLQlVTE9ORyBMZW4gPSBzaXplb2YoQ0hfU1dfQU5OX0lORk8pOwotCVVJTlQ4IEVsZW1lbnRJRCA9IElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVDsKLQlDSF9TV19BTk5fSU5GTyBDaFN3QW5uSUU7CisJdW5zaWduZWQgbG9uZyBUZW1wTGVuOworCXVuc2lnbmVkIGxvbmcgTGVuID0gc2l6ZW9mKHN0cnVjdCBydF9jaF9zd19hbm5faW5mbyk7CisJdTggRWxlbWVudElEID0gSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UOworCXN0cnVjdCBydF9jaF9zd19hbm5faW5mbyBDaFN3QW5uSUU7CiAKIAlDaFN3QW5uSUUuQ2hTd01vZGUgPSBDaFN3TW9kZTsKIAlDaFN3QW5uSUUuQ2hhbm5lbCA9IE5ld0NoYW5uZWw7CiAJQ2hTd0FubklFLkNoU3dDbnQgPSBDaFN3Q250OwogCi0JTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLAkJCQkmVGVtcExlbiwKLQkJCQkJCTEsCQkJCQkJJkVsZW1lbnRJRCwKLQkJCQkJCTEsCQkJCQkJJkxlbiwKLQkJCQkJCUxlbiwJCQkJCSZDaFN3QW5uSUUsCi0JCQkJCQlFTkRfT0ZfQVJHUyk7CisJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLCAmVGVtcExlbiwKKwkJCSAgMSwgJkVsZW1lbnRJRCwgMSwgJkxlbiwgTGVuLCAmQ2hTd0FubklFLCBFTkRfT0ZfQVJHUyk7CiAKIAkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CiAKLQogCXJldHVybjsKIH0KIApAQCAtNjcxLDI1ICsxMDI4LDIxIEBACiAJCTcuIE1lYXN1cmUgU3RhcnQgdGltZS4KIAkJOC4gTWVhc3VyZSBEdXJhdGlvbi4KIAotCiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1zdGF0aWMgVk9JRCBJbnNlcnRNZWFzdXJlUmVxSUUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCi0JT1VUIFBVTE9ORyBwRnJhbWVMZW4sCi0JSU4gUE1FQVNVUkVfUkVRX0lORk8gcE1lYXN1cmVSZXFJRSkKK3N0YXRpYyB2b2lkIEluc2VydE1lYXN1cmVSZXFJRShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgdTggKnBGcmFtZUJ1ZiwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nICpwRnJhbWVMZW4sCisJCQkgICAgICAgdTggTGVuLCBzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfaW5mbyAqIHBNZWFzdXJlUmVxSUUpCiB7Ci0JVUxPTkcgVGVtcExlbjsKLQlVSU5UOCBMZW4gPSBzaXplb2YoTUVBU1VSRV9SRVFfSU5GTyk7Ci0JVUlOVDggRWxlbWVudElEID0gSUVfTUVBU1VSRU1FTlRfUkVRVUVTVDsKKwl1bnNpZ25lZCBsb25nIFRlbXBMZW47CisJdTggRWxlbWVudElEID0gSUVfTUVBU1VSRU1FTlRfUkVRVUVTVDsKIAotCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJCQkJCSZUZW1wTGVuLAotCQkJCQkJMSwJCQkJCQkJJkVsZW1lbnRJRCwKLQkJCQkJCTEsCQkJCQkJCSZMZW4sCi0JCQkJCQlMZW4sCQkJCQkJcE1lYXN1cmVSZXFJRSwKLQkJCQkJCUVORF9PRl9BUkdTKTsKKwlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsICZUZW1wTGVuLAorCQkJICAxLCAmRWxlbWVudElELAorCQkJICAxLCAmTGVuLAorCQkJICBzaXplb2Yoc3RydWN0IHJ0X21lYXN1cmVfcmVxX2luZm8pLCBwTWVhc3VyZVJlcUlFLCBFTkRfT0ZfQVJHUyk7CiAKIAkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CiAKQEAgLTcxMywzMyArMTA2NiwyNyBAQAogCVJldHVybgk6IE5vbmUuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotc3RhdGljIFZPSUQgSW5zZXJ0TWVhc3VyZVJlcG9ydElFKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAotCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAotCUlOIFBNRUFTVVJFX1JFUE9SVF9JTkZPIHBNZWFzdXJlUmVwb3J0SUUsCi0JSU4gVUlOVDggUmVwb3J0TG5mb0xlbiwKLQlJTiBQVUlOVDggcFJlcG9ydEluZm8pCitzdGF0aWMgdm9pZCBJbnNlcnRNZWFzdXJlUmVwb3J0SUUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgdTggKnBGcmFtZUJ1ZiwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgKnBGcmFtZUxlbiwKKwkJCQkgIHN0cnVjdCBydF9tZWFzdXJlX3JlcG9ydF9pbmZvICogcE1lYXN1cmVSZXBvcnRJRSwKKwkJCQkgIHU4IFJlcG9ydExuZm9MZW4sIHU4ICpwUmVwb3J0SW5mbykKIHsKLQlVTE9ORyBUZW1wTGVuOwotCVVMT05HIExlbjsKLQlVSU5UOCBFbGVtZW50SUQgPSBJRV9NRUFTVVJFTUVOVF9SRVBPUlQ7CisJdW5zaWduZWQgbG9uZyBUZW1wTGVuOworCXVuc2lnbmVkIGxvbmcgTGVuOworCXU4IEVsZW1lbnRJRCA9IElFX01FQVNVUkVNRU5UX1JFUE9SVDsKIAotCUxlbiA9IHNpemVvZihNRUFTVVJFX1JFUE9SVF9JTkZPKSArIFJlcG9ydExuZm9MZW47CisJTGVuID0gc2l6ZW9mKHN0cnVjdCBydF9tZWFzdXJlX3JlcG9ydF9pbmZvKSArIFJlcG9ydExuZm9MZW47CiAKLQlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCQkJCQkmVGVtcExlbiwKLQkJCQkJCTEsCQkJCQkJCSZFbGVtZW50SUQsCi0JCQkJCQkxLAkJCQkJCQkmTGVuLAotCQkJCQkJTGVuLAkJCQkJCXBNZWFzdXJlUmVwb3J0SUUsCi0JCQkJCQlFTkRfT0ZfQVJHUyk7CisJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLCAmVGVtcExlbiwKKwkJCSAgMSwgJkVsZW1lbnRJRCwKKwkJCSAgMSwgJkxlbiwgTGVuLCBwTWVhc3VyZVJlcG9ydElFLCBFTkRfT0ZfQVJHUyk7CiAKIAkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CiAKLQlpZiAoKFJlcG9ydExuZm9MZW4gPiAwKSAmJiAocFJlcG9ydEluZm8gIT0gTlVMTCkpCi0JewotCQlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYgKyAqcEZyYW1lTGVuLAkJJlRlbXBMZW4sCi0JCQkJCQkJUmVwb3J0TG5mb0xlbiwJCQkJcFJlcG9ydEluZm8sCi0JCQkJCQkJRU5EX09GX0FSR1MpOworCWlmICgoUmVwb3J0TG5mb0xlbiA+IDApICYmIChwUmVwb3J0SW5mbyAhPSBOVUxMKSkgeworCQlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYgKyAqcEZyYW1lTGVuLCAmVGVtcExlbiwKKwkJCQkgIFJlcG9ydExuZm9MZW4sIHBSZXBvcnRJbmZvLCBFTkRfT0ZfQVJHUyk7CiAKIAkJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOwogCX0KQEAgLTc1OCw1MyArMTEwNSw0MCBAQAogCVJldHVybgk6IE5vbmUuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBFbnF1ZXVlTWVhc3VyZW1lbnRSZXEoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBVSU5UOCBNZWFzdXJlVG9rZW4sCi0JSU4gVUlOVDggTWVhc3VyZVJlcU1vZGUsCi0JSU4gVUlOVDggTWVhc3VyZVJlcVR5cGUsCi0JSU4gVUlOVDggTWVhc3VyZUNoLAotCUlOIFVJTlQxNiBNZWFzdXJlRHVyYXRpb24pCit2b2lkIE1ha2VNZWFzdXJlbWVudFJlcUZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgdTggKnBPdXRCdWZmZXIsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgKnBGcmFtZUxlbiwKKwkJCSAgICAgdTggVG90YWxMZW4sCisJCQkgICAgIHU4IENhdGVnb3J5LAorCQkJICAgICB1OCBBY3Rpb24sCisJCQkgICAgIHU4IE1lYXN1cmVUb2tlbiwKKwkJCSAgICAgdTggTWVhc3VyZVJlcU1vZGUsCisJCQkgICAgIHU4IE1lYXN1cmVSZXFUeXBlLCB1OCBOdW1PZlJlcGV0aXRpb25zKQogewotCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyBOU3RhdHVzOwotCVVMT05HIEZyYW1lTGVuOwotCUhFQURFUl84MDJfMTEgQWN0SGRyOwotCU1FQVNVUkVfUkVRX0lORk8gTWVhc3VyZVJlcUlFOwotCVVJTlQ4IFJtUmVxRGFpbG9nVG9rZW4gPSBSYW5kb21CeXRlKHBBZCk7Ci0JVUlOVDY0IE1lYXN1cmVTdGFydFRpbWUgPSBHZXRDdXJyZW50VGltZVN0YW1wKHBBZCk7CisJdW5zaWduZWQgbG9uZyBUZW1wTGVuOworCXN0cnVjdCBydF9tZWFzdXJlX3JlcV9pbmZvIE1lYXN1cmVSZXFJRTsKIAotCS8vIGJ1aWxkIGFjdGlvbiBmcmFtZSBoZWFkZXIuCi0JTWd0TWFjSGVhZGVySW5pdChwQWQsICZBY3RIZHIsIFNVQlRZUEVfQUNUSU9OLCAwLCBwREEsCi0JCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgKnBGcmFtZUxlbiksIHBGcmFtZUxlbiwgQ2F0ZWdvcnksCisJCSAgICAgICBBY3Rpb24pOwogCi0JTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19mdW5jX18pKTsKLQkJcmV0dXJuOworCS8qIGZpbGwgRGlhbG9nIFRva2VuICovCisJSW5zZXJ0RGlhbG9nVG9rZW4ocEFkLCAocE91dEJ1ZmZlciArICpwRnJhbWVMZW4pLCBwRnJhbWVMZW4sCisJCQkgIE1lYXN1cmVUb2tlbik7CisKKwkvKiBmaWxsIE51bWJlciBvZiByZXBldGl0aW9ucy4gKi8KKwlpZiAoQ2F0ZWdvcnkgPT0gQ0FURUdPUllfUk0pIHsKKwkJTWFrZU91dGdvaW5nRnJhbWUoKHBPdXRCdWZmZXIgKyAqcEZyYW1lTGVuKSwgJlRlbXBMZW4sCisJCQkJICAyLCAmTnVtT2ZSZXBldGl0aW9ucywgRU5EX09GX0FSR1MpOworCisJCSpwRnJhbWVMZW4gKz0gVGVtcExlbjsKIAl9Ci0JTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7Ci0JRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7Ci0KLQlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX01SUSk7Ci0KLQkvLyBmaWxsIERpYWxvZyBUb2tlbgotCUluc2VydERpYWxvZ1Rva2VuKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgTWVhc3VyZVRva2VuKTsKLQotCS8vIHByZXBhcmUgTWVhc3VyZW1lbnQgSUUuCi0JTmRpc1plcm9NZW1vcnkoJk1lYXN1cmVSZXFJRSwgc2l6ZW9mKE1FQVNVUkVfUkVRX0lORk8pKTsKLQlNZWFzdXJlUmVxSUUuVG9rZW4gPSBSbVJlcURhaWxvZ1Rva2VuOworCS8qIHByZXBhcmUgTWVhc3VyZW1lbnQgSUUuICovCisJTmRpc1plcm9NZW1vcnkoJk1lYXN1cmVSZXFJRSwgc2l6ZW9mKHN0cnVjdCBydF9tZWFzdXJlX3JlcV9pbmZvKSk7CisJTWVhc3VyZVJlcUlFLlRva2VuID0gTWVhc3VyZVRva2VuOwogCU1lYXN1cmVSZXFJRS5SZXFNb2RlLndvcmQgPSBNZWFzdXJlUmVxTW9kZTsKIAlNZWFzdXJlUmVxSUUuUmVxVHlwZSA9IE1lYXN1cmVSZXFUeXBlOwotCU1lYXN1cmVSZXFJRS5NZWFzdXJlUmVxLkNoTnVtID0gTWVhc3VyZUNoOwotCU1lYXN1cmVSZXFJRS5NZWFzdXJlUmVxLk1lYXN1cmVTdGFydFRpbWUgPSBjcHUybGU2NChNZWFzdXJlU3RhcnRUaW1lKTsKLQlNZWFzdXJlUmVxSUUuTWVhc3VyZVJlcS5NZWFzdXJlRHVyYXRpb24gPSBjcHUybGUxNihNZWFzdXJlRHVyYXRpb24pOwotCUluc2VydE1lYXN1cmVSZXFJRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sICZNZWFzdXJlUmVxSUUpOwotCi0JTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCUluc2VydE1lYXN1cmVSZXFJRShwQWQsIChwT3V0QnVmZmVyICsgKnBGcmFtZUxlbiksIHBGcmFtZUxlbiwKKwkJCSAgIFRvdGFsTGVuLCAmTWVhc3VyZVJlcUlFKTsKIAogCXJldHVybjsKIH0KQEAgLTgyMSw0NiArMTE1NSw0NiBAQAogCVJldHVybgk6IE5vbmUuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBFbnF1ZXVlTWVhc3VyZW1lbnRSZXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBVSU5UOCBEaWFsb2dUb2tlbiwKLQlJTiBVSU5UOCBNZWFzdXJlVG9rZW4sCi0JSU4gVUlOVDggTWVhc3VyZVJlcU1vZGUsCi0JSU4gVUlOVDggTWVhc3VyZVJlcVR5cGUsCi0JSU4gVUlOVDggUmVwb3J0SW5mb0xlbiwKLQlJTiBQVUlOVDggcFJlcG9ydEluZm8pCit2b2lkIEVucXVldWVNZWFzdXJlbWVudFJlcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB1OCAqcERBLAorCQkJICAgdTggRGlhbG9nVG9rZW4sCisJCQkgICB1OCBNZWFzdXJlVG9rZW4sCisJCQkgICB1OCBNZWFzdXJlUmVxTW9kZSwKKwkJCSAgIHU4IE1lYXN1cmVSZXFUeXBlLAorCQkJICAgdTggUmVwb3J0SW5mb0xlbiwgdTggKnBSZXBvcnRJbmZvKQogewotCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyBOU3RhdHVzOwotCVVMT05HIEZyYW1lTGVuOwotCUhFQURFUl84MDJfMTEgQWN0SGRyOwotCU1FQVNVUkVfUkVQT1JUX0lORk8gTWVhc3VyZVJlcElFOworCXU4ICpwT3V0QnVmZmVyID0gTlVMTDsKKwlpbnQgTlN0YXR1czsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIEFjdEhkcjsKKwlzdHJ1Y3QgcnRfbWVhc3VyZV9yZXBvcnRfaW5mbyBNZWFzdXJlUmVwSUU7CiAKLQkvLyBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLgorCS8qIGJ1aWxkIGFjdGlvbiBmcmFtZSBoZWFkZXIuICovCiAJTWd0TWFjSGVhZGVySW5pdChwQWQsICZBY3RIZHIsIFNVQlRZUEVfQUNUSU9OLCAwLCBwREEsCi0JCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwkJCSBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKIAotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fZnVuY19fKSk7CisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICh2b2lkICopJiBwT3V0QnVmZmVyKTsJLypHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeSAqLworCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm47CiAJfQotCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChQQ0hBUikmQWN0SGRyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCUZyYW1lTGVuID0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChjaGFyICopJiBBY3RIZHIsIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSkpOworCUZyYW1lTGVuID0gc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKTsKIAotCUluc2VydEFjdEZpZWxkKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ0FURUdPUllfU1BFQ1RSVU0sIFNQRUNfTVJQKTsKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sCisJCSAgICAgICBDQVRFR09SWV9TUEVDVFJVTSwgU1BFQ19NUlApOwogCi0JLy8gZmlsbCBEaWFsb2cgVG9rZW4KKwkvKiBmaWxsIERpYWxvZyBUb2tlbiAqLwogCUluc2VydERpYWxvZ1Rva2VuKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgRGlhbG9nVG9rZW4pOwogCi0JLy8gcHJlcGFyZSBNZWFzdXJlbWVudCBJRS4KLQlOZGlzWmVyb01lbW9yeSgmTWVhc3VyZVJlcElFLCBzaXplb2YoTUVBU1VSRV9SRVBPUlRfSU5GTykpOworCS8qIHByZXBhcmUgTWVhc3VyZW1lbnQgSUUuICovCisJTmRpc1plcm9NZW1vcnkoJk1lYXN1cmVSZXBJRSwgc2l6ZW9mKHN0cnVjdCBydF9tZWFzdXJlX3JlcG9ydF9pbmZvKSk7CiAJTWVhc3VyZVJlcElFLlRva2VuID0gTWVhc3VyZVRva2VuOwotCU1lYXN1cmVSZXBJRS5SZXBvcnRNb2RlLndvcmQgPSBNZWFzdXJlUmVxTW9kZTsKKwlNZWFzdXJlUmVwSUUuUmVwb3J0TW9kZSA9IE1lYXN1cmVSZXFNb2RlOwogCU1lYXN1cmVSZXBJRS5SZXBvcnRUeXBlID0gTWVhc3VyZVJlcVR5cGU7Ci0JSW5zZXJ0TWVhc3VyZVJlcG9ydElFKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgJk1lYXN1cmVSZXBJRSwgUmVwb3J0SW5mb0xlbiwgcFJlcG9ydEluZm8pOworCUluc2VydE1lYXN1cmVSZXBvcnRJRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sCisJCQkgICAgICAmTWVhc3VyZVJlcElFLCBSZXBvcnRJbmZvTGVuLCBwUmVwb3J0SW5mbyk7CiAKIAlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwogCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CkBAIC04ODAsMzYgKzEyMTQsMzQgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgRW5xdWV1ZVRQQ1JlcSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcERBLAotCUlOIFVDSEFSIERpYWxvZ1Rva2VuKQordm9pZCBFbnF1ZXVlVFBDUmVxKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggKnBEQSwgdTggRGlhbG9nVG9rZW4pCiB7Ci0JUFVDSEFSIHBPdXRCdWZmZXIgPSBOVUxMOwotCU5ESVNfU1RBVFVTIE5TdGF0dXM7Ci0JVUxPTkcgRnJhbWVMZW47CisJdTggKnBPdXRCdWZmZXIgPSBOVUxMOworCWludCBOU3RhdHVzOworCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW47CiAKLQlIRUFERVJfODAyXzExIEFjdEhkcjsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBBY3RIZHI7CiAKLQkvLyBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLgorCS8qIGJ1aWxkIGFjdGlvbiBmcmFtZSBoZWFkZXIuICovCiAJTWd0TWFjSGVhZGVySW5pdChwQWQsICZBY3RIZHIsIFNVQlRZUEVfQUNUSU9OLCAwLCBwREEsCi0JCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwkJCSBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKIAotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fZnVuY19fKSk7CisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICh2b2lkICopJiBwT3V0QnVmZmVyKTsJLypHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeSAqLworCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm47CiAJfQotCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChQQ0hBUikmQWN0SGRyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCUZyYW1lTGVuID0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChjaGFyICopJiBBY3RIZHIsIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSkpOworCUZyYW1lTGVuID0gc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKTsKIAotCUluc2VydEFjdEZpZWxkKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ0FURUdPUllfU1BFQ1RSVU0sIFNQRUNfVFBDUlEpOworCUluc2VydEFjdEZpZWxkKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwKKwkJICAgICAgIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX1RQQ1JRKTsKIAotCS8vIGZpbGwgRGlhbG9nIFRva2VuCisJLyogZmlsbCBEaWFsb2cgVG9rZW4gKi8KIAlJbnNlcnREaWFsb2dUb2tlbihwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIERpYWxvZ1Rva2VuKTsKIAotCS8vIEluc2VydCBUUEMgUmVxdWVzdCBJRS4KKwkvKiBJbnNlcnQgVFBDIFJlcXVlc3QgSUUuICovCiAJSW5zZXJ0VHBjUmVxSUUocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuKTsKIAogCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CkBAIC05MzAsMzkgKzEyNjIsMzggQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgRW5xdWV1ZVRQQ1JlcCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcERBLAotCUlOIFVJTlQ4IERpYWxvZ1Rva2VuLAotCUlOIFVJTlQ4IFR4UHdyLAotCUlOIFVJTlQ4IExpbmtNYXJnaW4pCit2b2lkIEVucXVldWVUUENSZXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICB1OCAqcERBLAorCQkgICB1OCBEaWFsb2dUb2tlbiwgdTggVHhQd3IsIHU4IExpbmtNYXJnaW4pCiB7Ci0JUFVDSEFSIHBPdXRCdWZmZXIgPSBOVUxMOwotCU5ESVNfU1RBVFVTIE5TdGF0dXM7Ci0JVUxPTkcgRnJhbWVMZW47CisJdTggKnBPdXRCdWZmZXIgPSBOVUxMOworCWludCBOU3RhdHVzOworCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW47CiAKLQlIRUFERVJfODAyXzExIEFjdEhkcjsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBBY3RIZHI7CiAKLQkvLyBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLgorCS8qIGJ1aWxkIGFjdGlvbiBmcmFtZSBoZWFkZXIuICovCiAJTWd0TWFjSGVhZGVySW5pdChwQWQsICZBY3RIZHIsIFNVQlRZUEVfQUNUSU9OLCAwLCBwREEsCi0JCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwkJCSBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKIAotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fZnVuY19fKSk7CisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICh2b2lkICopJiBwT3V0QnVmZmVyKTsJLypHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeSAqLworCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm47CiAJfQotCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChQQ0hBUikmQWN0SGRyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCUZyYW1lTGVuID0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChjaGFyICopJiBBY3RIZHIsIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSkpOworCUZyYW1lTGVuID0gc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKTsKIAotCUluc2VydEFjdEZpZWxkKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ0FURUdPUllfU1BFQ1RSVU0sIFNQRUNfVFBDUlApOworCUluc2VydEFjdEZpZWxkKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwKKwkJICAgICAgIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX1RQQ1JQKTsKIAotCS8vIGZpbGwgRGlhbG9nIFRva2VuCisJLyogZmlsbCBEaWFsb2cgVG9rZW4gKi8KIAlJbnNlcnREaWFsb2dUb2tlbihwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIERpYWxvZ1Rva2VuKTsKIAotCS8vIEluc2VydCBUUEMgUmVxdWVzdCBJRS4KLQlJbnNlcnRUcGNSZXBvcnRJRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIFR4UHdyLCBMaW5rTWFyZ2luKTsKKwkvKiBJbnNlcnQgVFBDIFJlcXVlc3QgSUUuICovCisJSW5zZXJ0VHBjUmVwb3J0SUUocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBUeFB3ciwKKwkJCSAgTGlua01hcmdpbik7CiAKIAlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwogCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CkBAIC05ODQsMzQgKzEzMTUsMzMgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgRW5xdWV1ZUNoU3dBbm4oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBVSU5UOCBDaFN3TW9kZSwKLQlJTiBVSU5UOCBOZXdDaCkKK3ZvaWQgRW5xdWV1ZUNoU3dBbm4oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgdTggKnBEQSwgdTggQ2hTd01vZGUsIHU4IE5ld0NoKQogewotCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyBOU3RhdHVzOwotCVVMT05HIEZyYW1lTGVuOworCXU4ICpwT3V0QnVmZmVyID0gTlVMTDsKKwlpbnQgTlN0YXR1czsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuOwogCi0JSEVBREVSXzgwMl8xMSBBY3RIZHI7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgQWN0SGRyOwogCi0JLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KKwkvKiBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLiAqLwogCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQWN0SGRyLCBTVUJUWVBFX0FDVElPTiwgMCwgcERBLAotCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJCQkgcEFkLT5DdXJyZW50QWRkcmVzcyk7CiAKLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX2Z1bmNfXykpOworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAodm9pZCAqKSYgcE91dEJ1ZmZlcik7CS8qR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkgKi8KKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19mdW5jX18pKTsKIAkJcmV0dXJuOwogCX0KLQlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoUENIQVIpJkFjdEhkciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLQlGcmFtZUxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKwlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoY2hhciAqKSYgQWN0SGRyLCBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpKTsKKwlGcmFtZUxlbiA9IHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSk7CiAKLQlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX0NIQU5ORUxfU1dJVENIKTsKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sCisJCSAgICAgICBDQVRFR09SWV9TUEVDVFJVTSwgU1BFQ19DSEFOTkVMX1NXSVRDSCk7CiAKLQlJbnNlcnRDaFN3QW5uSUUocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBDaFN3TW9kZSwgTmV3Q2gsIDApOworCUluc2VydENoU3dBbm5JRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENoU3dNb2RlLAorCQkJTmV3Q2gsIDApOwogCiAJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIAlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwpAQCAtMTAxOSw1NSArMTM0OSw0MyBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIEJPT0xFQU4gRGZzUmVxdWlyZW1lbnRDaGVjaygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVSU5UOCBDaGFubmVsKQorc3RhdGljIEJPT0xFQU4gRGZzUmVxdWlyZW1lbnRDaGVjayhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IENoYW5uZWwpCiB7CiAJQk9PTEVBTiBSZXN1bHQgPSBGQUxTRTsKLQlJTlQgaTsKKwlpbnQgaTsKIAotCWRvCi0JewotCQkvLyBjaGVjayBERlMgcHJvY2VkdXJlIGlzIHJ1bm5pbmcuCi0JCS8vIG1ha2Ugc3VyZSBERlMgcHJvY2VkdXJlIHdvbid0IHN0YXJ0IHR3aWNlLgotCQlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlICE9IFJEX05PUk1BTF9NT0RFKQotCQl7CisJZG8geworCQkvKiBjaGVjayBERlMgcHJvY2VkdXJlIGlzIHJ1bm5pbmcuICovCisJCS8qIG1ha2Ugc3VyZSBERlMgcHJvY2VkdXJlIHdvbid0IHN0YXJ0IHR3aWNlLiAqLworCQlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlICE9IFJEX05PUk1BTF9NT0RFKSB7CiAJCQlSZXN1bHQgPSBGQUxTRTsKIAkJCWJyZWFrOwogCQl9Ci0KLQkJLy8gY2hlY2sgdGhlIG5ldyBjaGFubmVsIGNhcnJpZWQgZnJvbSBDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1uZXQgaXMgdmFsaWQuCi0JCWZvciAoaT0wOyBpPHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykKLQkJeworCQkvKiBjaGVjayB0aGUgbmV3IGNoYW5uZWwgY2FycmllZCBmcm9tIENoYW5uZWwgU3dpdGNoIEFubm91bmNlbW5ldCBpcyB2YWxpZC4gKi8KKwkJZm9yIChpID0gMDsgaSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykgewogCQkJaWYgKChDaGFubmVsID09IHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCkKLQkJCQkmJihwQWQtPkNoYW5uZWxMaXN0W2ldLlJlbWFpbmluZ1RpbWVGb3JVc2UgPT0gMCkpCi0JCQl7Ci0JCQkJLy8gZm91bmQgcmFkYXIgc2lnbmFsIGluIHRoZSBjaGFubmVsLiB0aGUgY2hhbm5lbCBjYW4ndCB1c2UgYXQgbGVhc3QgZm9yIDMwIG1pbnV0ZXMuCi0JCQkJcEFkLT5DaGFubmVsTGlzdFtpXS5SZW1haW5pbmdUaW1lRm9yVXNlID0gMTgwMDsvLzMwIG1pbiA9IDE4MDAgc2VjCisJCQkgICAgJiYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSA9PSAwKSkgeworCQkJCS8qIGZvdW5kIHJhZGFyIHNpZ25hbCBpbiB0aGUgY2hhbm5lbC4gdGhlIGNoYW5uZWwgY2FuJ3QgdXNlIGF0IGxlYXN0IGZvciAzMCBtaW51dGVzLiAqLworCQkJCXBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSA9IDE4MDA7CS8qMzAgbWluID0gMTgwMCBzZWMgKi8KIAkJCQlSZXN1bHQgPSBUUlVFOwogCQkJCWJyZWFrOwogCQkJfQogCQl9Ci0JfSB3aGlsZShGQUxTRSk7CisJfSB3aGlsZSAoRkFMU0UpOwogCiAJcmV0dXJuIFJlc3VsdDsKIH0KIAotVk9JRCBOb3RpZnlDaFN3QW5uVG9QZWVyQVBzKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwUkEsCi0JSU4gUFVDSEFSIHBUQSwKLQlJTiBVSU5UOCBDaFN3TW9kZSwKLQlJTiBVSU5UOCBDaGFubmVsKQordm9pZCBOb3RpZnlDaFN3QW5uVG9QZWVyQVBzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICB1OCAqcFJBLAorCQkJICAgIHU4ICpwVEEsIHU4IENoU3dNb2RlLCB1OCBDaGFubmVsKQogewogfQogCi1zdGF0aWMgVk9JRCBTdGFydERGU1Byb2NlZHVyZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiBDaGFubmVsLAotCUlOIFVJTlQ4IENoU3dNb2RlKQorc3RhdGljIHZvaWQgU3RhcnRERlNQcm9jZWR1cmUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgdTggQ2hhbm5lbCwgdTggQ2hTd01vZGUpCiB7Ci0JLy8gc3RhcnQgREZTIHByb2NlZHVyZQorCS8qIHN0YXJ0IERGUyBwcm9jZWR1cmUgKi8KIAlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gQ2hhbm5lbDsKIAogCU5fQ2hhbm5lbENoZWNrKHBBZCk7CkBAIC0xMDg2LDcgKzE0MDQsNiBAQAogCQkyLiBtZXNzYWdlIGxlbmd0aC4KIAkJMy4gQ2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IGluZm9tYXRpb24gYnVmZmVyLgogCi0KIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KQEAgLTEwOTgsNDQgKzE0MTUsNDUgQEAKICAgKy0tLS0rLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKwogICAgIDEgICAgMSAgICAgICAgMSAgICAgICAgICAgMSAgICAgICAgICAgIDEKICovCi1zdGF0aWMgQk9PTEVBTiBQZWVyQ2hTd0FublNhbml0eSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBWT0lEICpwTXNnLAotCUlOIFVMT05HIE1zZ0xlbiwKLQlPVVQgUENIX1NXX0FOTl9JTkZPIHBDaFN3QW5uSW5mbykKK3N0YXRpYyBCT09MRUFOIFBlZXJDaFN3QW5uU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgdm9pZCAqIHBNc2csCisJCQkJIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkJCSBzdHJ1Y3QgcnRfY2hfc3dfYW5uX2luZm8gKiBwQ2hTd0FubkluZm8pCiB7Ci0JUEZSQU1FXzgwMl8xMSBGciA9IChQRlJBTUVfODAyXzExKXBNc2c7Ci0JUFVDSEFSIHBGcmFtZVB0ciA9IEZyLT5PY3RldDsKKwlzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICogRnIgPSAoc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqKSBwTXNnOworCXU4ICpwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CiAJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKLQlQRUlEX1NUUlVDVCBlaWRfcHRyOworCXN0cnVjdCBydF9laWQgKiBlaWRfcHRyOwogCi0JLy8gc2tpcCA4MDIuMTEgaGVhZGVyLgotCU1zZ0xlbiAtPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisJLyogc2tpcCA4MDIuMTEgaGVhZGVyLiAqLworCU1zZ0xlbiAtPSBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpOwogCi0JLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJLyogc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuICovCiAJcEZyYW1lUHRyICs9IDI7CiAJTXNnTGVuIC09IDI7CiAKIAlpZiAocENoU3dBbm5JbmZvID09IE5VTEwpCiAJCXJldHVybiByZXN1bHQ7CiAKLQllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKLQl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKLQl7Ci0JCXN3aXRjaChlaWRfcHRyLT5FaWQpCi0JCXsKLQkJCWNhc2UgSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UOgotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQ2hTd0FubkluZm8tPkNoU3dNb2RlLCBlaWRfcHRyLT5PY3RldCwgMSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBDaFN3QW5uSW5mby0+Q2hhbm5lbCwgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcENoU3dBbm5JbmZvLT5DaFN3Q250LCBlaWRfcHRyLT5PY3RldCArIDIsIDEpOworCWVpZF9wdHIgPSAoc3RydWN0IHJ0X2VpZCAqKSBwRnJhbWVQdHI7CisJd2hpbGUgKCgodTggKikgZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwKKwkgICAgICAgKCh1OCAqKXBGcmFtZVB0ciArIE1zZ0xlbikpIHsKKwkJc3dpdGNoIChlaWRfcHRyLT5FaWQpIHsKKwkJY2FzZSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQ6CisJCQlOZGlzTW92ZU1lbW9yeSgmcENoU3dBbm5JbmZvLT5DaFN3TW9kZSwgZWlkX3B0ci0+T2N0ZXQsCisJCQkJICAgICAgIDEpOworCQkJTmRpc01vdmVNZW1vcnkoJnBDaFN3QW5uSW5mby0+Q2hhbm5lbCwKKwkJCQkgICAgICAgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQ2hTd0FubkluZm8tPkNoU3dDbnQsCisJCQkJICAgICAgIGVpZF9wdHItPk9jdGV0ICsgMiwgMSk7CiAKLQkJCQlyZXN1bHQgPSBUUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOworCQkJcmVzdWx0ID0gVFJVRTsKKwkJCWJyZWFrOwogCi0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CiAJCX0KLQkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CisJCWVpZF9wdHIgPSAoc3RydWN0IHJ0X2VpZCAqKSAoKHU4ICopIGVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKIAl9CiAKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMTE1NCwyNSArMTQ3MiwyNSBAQAogCVJldHVybgk6IE5vbmUuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotc3RhdGljIEJPT0xFQU4gUGVlck1lYXN1cmVSZXFTYW5pdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVk9JRCAqcE1zZywKLQlJTiBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVSU5UOCBwRGlhbG9nVG9rZW4sCi0JT1VUIFBNRUFTVVJFX1JFUV9JTkZPIHBNZWFzdXJlUmVxSW5mbykKK3N0YXRpYyBCT09MRUFOIFBlZXJNZWFzdXJlUmVxU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgdm9pZCAqIHBNc2csCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkJCSAgICB1OCAqcERpYWxvZ1Rva2VuLAorCQkJCSAgICBzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfaW5mbyAqIHBNZWFzdXJlUmVxSW5mbywKKwkJCQkgICAgc3RydWN0IHJ0X21lYXN1cmVfcmVxICogcE1lYXN1cmVSZXEpCiB7Ci0JUEZSQU1FXzgwMl8xMSBGciA9IChQRlJBTUVfODAyXzExKXBNc2c7Ci0JUFVDSEFSIHBGcmFtZVB0ciA9IEZyLT5PY3RldDsKKwlzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICogRnIgPSAoc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqKSBwTXNnOworCXU4ICpwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CiAJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKLQlQRUlEX1NUUlVDVCBlaWRfcHRyOwotCVBVQ0hBUiBwdHI7Ci0JVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7Ci0JVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKKwlzdHJ1Y3QgcnRfZWlkICogZWlkX3B0cjsKKwl1OCAqcHRyOworCXU2NCBNZWFzdXJlU3RhcnRUaW1lOworCXUxNiBNZWFzdXJlRHVyYXRpb247CiAKLQkvLyBza2lwIDgwMi4xMSBoZWFkZXIuCi0JTXNnTGVuIC09IHNpemVvZihIRUFERVJfODAyXzExKTsKKwkvKiBza2lwIDgwMi4xMSBoZWFkZXIuICovCisJTXNnTGVuIC09IHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSk7CiAKLQkvLyBza2lwIGNhdGVnb3J5IGFuZCBhY3Rpb24gY29kZS4KKwkvKiBza2lwIGNhdGVnb3J5IGFuZCBhY3Rpb24gY29kZS4gKi8KIAlwRnJhbWVQdHIgKz0gMjsKIAlNc2dMZW4gLT0gMjsKIApAQCAtMTE4MywyOSArMTUwMSwzMiBAQAogCXBGcmFtZVB0ciArPSAxOwogCU1zZ0xlbiAtPSAxOwogCi0JZWlkX3B0ciA9IChQRUlEX1NUUlVDVClwRnJhbWVQdHI7Ci0Jd2hpbGUgKCgoVUNIQVIqKWVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8ICgoUFVDSEFSKXBGcmFtZVB0ciArIE1zZ0xlbikpCi0JewotCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQotCQl7Ci0JCQljYXNlIElFX01FQVNVUkVNRU5UX1JFUVVFU1Q6Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVxSW5mby0+VG9rZW4sIGVpZF9wdHItPk9jdGV0LCAxKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXFJbmZvLT5SZXFNb2RlLndvcmQsIGVpZF9wdHItPk9jdGV0ICsgMSwgMSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVxSW5mby0+UmVxVHlwZSwgZWlkX3B0ci0+T2N0ZXQgKyAyLCAxKTsKLQkJCQlwdHIgPSBlaWRfcHRyLT5PY3RldCArIDM7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVxSW5mby0+TWVhc3VyZVJlcS5DaE51bSwgcHRyLCAxKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmTWVhc3VyZVN0YXJ0VGltZSwgcHRyICsgMSwgOCk7Ci0JCQkJcE1lYXN1cmVSZXFJbmZvLT5NZWFzdXJlUmVxLk1lYXN1cmVTdGFydFRpbWUgPSBTV0FQNjQoTWVhc3VyZVN0YXJ0VGltZSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJk1lYXN1cmVEdXJhdGlvbiwgcHRyICsgOSwgMik7Ci0JCQkJcE1lYXN1cmVSZXFJbmZvLT5NZWFzdXJlUmVxLk1lYXN1cmVEdXJhdGlvbiA9IFNXQVAxNihNZWFzdXJlRHVyYXRpb24pOworCWVpZF9wdHIgPSAoc3RydWN0IHJ0X2VpZCAqKSBwRnJhbWVQdHI7CisJd2hpbGUgKCgodTggKikgZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwKKwkgICAgICAgKCh1OCAqKXBGcmFtZVB0ciArIE1zZ0xlbikpIHsKKwkJc3dpdGNoIChlaWRfcHRyLT5FaWQpIHsKKwkJY2FzZSBJRV9NRUFTVVJFTUVOVF9SRVFVRVNUOgorCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVxSW5mby0+VG9rZW4sIGVpZF9wdHItPk9jdGV0LAorCQkJCSAgICAgICAxKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcUluZm8tPlJlcU1vZGUud29yZCwKKwkJCQkgICAgICAgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcUluZm8tPlJlcVR5cGUsCisJCQkJICAgICAgIGVpZF9wdHItPk9jdGV0ICsgMiwgMSk7CisJCQlwdHIgPSAodTggKikoZWlkX3B0ci0+T2N0ZXQgKyAzKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcS0+Q2hOdW0sIHB0ciwgMSk7CisJCQlOZGlzTW92ZU1lbW9yeSgmTWVhc3VyZVN0YXJ0VGltZSwgcHRyICsgMSwgOCk7CisJCQlwTWVhc3VyZVJlcS0+TWVhc3VyZVN0YXJ0VGltZSA9CisJCQkgICAgU1dBUDY0KE1lYXN1cmVTdGFydFRpbWUpOworCQkJTmRpc01vdmVNZW1vcnkoJk1lYXN1cmVEdXJhdGlvbiwgcHRyICsgOSwgMik7CisJCQlwTWVhc3VyZVJlcS0+TWVhc3VyZUR1cmF0aW9uID0gU1dBUDE2KE1lYXN1cmVEdXJhdGlvbik7CiAKLQkJCQlyZXN1bHQgPSBUUlVFOwotCQkJCWJyZWFrOworCQkJcmVzdWx0ID0gVFJVRTsKKwkJCWJyZWFrOwogCi0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CiAJCX0KLQkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CisJCWVpZF9wdHIgPSAoc3RydWN0IHJ0X2VpZCAqKSAoKHU4ICopIGVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKIAl9CiAKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMTI0NSwyNCArMTU2NiwyNCBAQAogICArLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKwogICAgICAwICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAzICAgICAgICAgNCAgICAgICAgICA1LTcKICovCi1zdGF0aWMgQk9PTEVBTiBQZWVyTWVhc3VyZVJlcG9ydFNhbml0eSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBWT0lEICpwTXNnLAotCUlOIFVMT05HIE1zZ0xlbiwKLQlPVVQgUFVJTlQ4IHBEaWFsb2dUb2tlbiwKLQlPVVQgUE1FQVNVUkVfUkVQT1JUX0lORk8gcE1lYXN1cmVSZXBvcnRJbmZvLAotCU9VVCBQVUlOVDggcFJlcG9ydEJ1ZikKK3N0YXRpYyBCT09MRUFOIFBlZXJNZWFzdXJlUmVwb3J0U2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgICAgdm9pZCAqIHBNc2csCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkJCSAgICAgICB1OCAqcERpYWxvZ1Rva2VuLAorCQkJCSAgICAgICBzdHJ1Y3QgcnRfbWVhc3VyZV9yZXBvcnRfaW5mbyAqCisJCQkJICAgICAgIHBNZWFzdXJlUmVwb3J0SW5mbywKKwkJCQkgICAgICAgdTggKnBSZXBvcnRCdWYpCiB7Ci0JUEZSQU1FXzgwMl8xMSBGciA9IChQRlJBTUVfODAyXzExKXBNc2c7Ci0JUFVDSEFSIHBGcmFtZVB0ciA9IEZyLT5PY3RldDsKKwlzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICogRnIgPSAoc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqKSBwTXNnOworCXU4ICpwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CiAJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKLQlQRUlEX1NUUlVDVCBlaWRfcHRyOwotCVBVQ0hBUiBwdHI7CisJc3RydWN0IHJ0X2VpZCAqIGVpZF9wdHI7CisJdTggKnB0cjsKIAotCS8vIHNraXAgODAyLjExIGhlYWRlci4KLQlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCS8qIHNraXAgODAyLjExIGhlYWRlci4gKi8KKwlNc2dMZW4gLT0gc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKTsKIAotCS8vIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgorCS8qIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLiAqLwogCXBGcmFtZVB0ciArPSAyOwogCU1zZ0xlbiAtPSAyOwogCkBAIC0xMjczLDUxICsxNTk0LDYwIEBACiAJcEZyYW1lUHRyICs9IDE7CiAJTXNnTGVuIC09IDE7CiAKLQllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKLQl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKLQl7Ci0JCXN3aXRjaChlaWRfcHRyLT5FaWQpCi0JCXsKLQkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfUkVQT1JUOgotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcG9ydEluZm8tPlRva2VuLCBlaWRfcHRyLT5PY3RldCwgMSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVwb3J0SW5mby0+UmVwb3J0TW9kZSwgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlLCBlaWRfcHRyLT5PY3RldCArIDIsIDEpOwotCQkJCWlmIChwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydFR5cGUgPT0gUk1fQkFTSUMpCi0JCQkJewotCQkJCQlQTUVBU1VSRV9CQVNJQ19SRVBPUlQgcFJlcG9ydCA9IChQTUVBU1VSRV9CQVNJQ19SRVBPUlQpcFJlcG9ydEJ1ZjsKLQkJCQkJcHRyID0gZWlkX3B0ci0+T2N0ZXQgKyAzOwotCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+Q2hOdW0sIHB0ciwgMSk7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlU3RhcnRUaW1lLCBwdHIgKyAxLCA4KTsKLQkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPk1lYXN1cmVEdXJhdGlvbiwgcHRyICsgOSwgMik7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NYXAsIHB0ciArIDExLCAxKTsKKwllaWRfcHRyID0gKHN0cnVjdCBydF9laWQgKikgcEZyYW1lUHRyOworCXdoaWxlICgoKHU4ICopIGVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8CisJICAgICAgICgodTggKilwRnJhbWVQdHIgKyBNc2dMZW4pKSB7CisJCXN3aXRjaCAoZWlkX3B0ci0+RWlkKSB7CisJCWNhc2UgSUVfTUVBU1VSRU1FTlRfUkVQT1JUOgorCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVwb3J0SW5mby0+VG9rZW4sCisJCQkJICAgICAgIGVpZF9wdHItPk9jdGV0LCAxKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydE1vZGUsCisJCQkJICAgICAgIGVpZF9wdHItPk9jdGV0ICsgMSwgMSk7CisJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlLAorCQkJCSAgICAgICBlaWRfcHRyLT5PY3RldCArIDIsIDEpOworCQkJaWYgKHBNZWFzdXJlUmVwb3J0SW5mby0+UmVwb3J0VHlwZSA9PSBSTV9CQVNJQykgeworCQkJCXN0cnVjdCBydF9tZWFzdXJlX2Jhc2ljX3JlcG9ydCAqIHBSZXBvcnQgPQorCQkJCSAgICAoc3RydWN0IHJ0X21lYXN1cmVfYmFzaWNfcmVwb3J0ICopIHBSZXBvcnRCdWY7CisJCQkJcHRyID0gKHU4ICopKGVpZF9wdHItPk9jdGV0ICsgMyk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPkNoTnVtLCBwdHIsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlU3RhcnRUaW1lLAorCQkJCQkgICAgICAgcHRyICsgMSwgOCk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPk1lYXN1cmVEdXJhdGlvbiwKKwkJCQkJICAgICAgIHB0ciArIDksIDIpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NYXAsIHB0ciArIDExLCAxKTsKIAotCQkJCX0KLQkJCQllbHNlIGlmIChwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydFR5cGUgPT0gUk1fQ0NBKQotCQkJCXsKLQkJCQkJUE1FQVNVUkVfQ0NBX1JFUE9SVCBwUmVwb3J0ID0gKFBNRUFTVVJFX0NDQV9SRVBPUlQpcFJlcG9ydEJ1ZjsKLQkJCQkJcHRyID0gZWlkX3B0ci0+T2N0ZXQgKyAzOwotCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+Q2hOdW0sIHB0ciwgMSk7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlU3RhcnRUaW1lLCBwdHIgKyAxLCA4KTsKLQkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPk1lYXN1cmVEdXJhdGlvbiwgcHRyICsgOSwgMik7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5DQ0FfQnVzeV9GcmFjdGlvbiwgcHRyICsgMTEsIDEpOworCQkJfSBlbHNlIGlmIChwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydFR5cGUgPT0gUk1fQ0NBKSB7CisJCQkJc3RydWN0IHJ0X21lYXN1cmVfY2NhX3JlcG9ydCAqIHBSZXBvcnQgPQorCQkJCSAgICAoc3RydWN0IHJ0X21lYXN1cmVfY2NhX3JlcG9ydCAqKSBwUmVwb3J0QnVmOworCQkJCXB0ciA9ICh1OCAqKShlaWRfcHRyLT5PY3RldCArIDMpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5DaE51bSwgcHRyLCAxKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZVN0YXJ0VGltZSwKKwkJCQkJICAgICAgIHB0ciArIDEsIDgpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlRHVyYXRpb24sCisJCQkJCSAgICAgICBwdHIgKyA5LCAyKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+Q0NBX0J1c3lfRnJhY3Rpb24sCisJCQkJCSAgICAgICBwdHIgKyAxMSwgMSk7CiAKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlID09IFJNX1JQSV9ISVNUT0dSQU0pCi0JCQkJewotCQkJCQlQTUVBU1VSRV9SUElfUkVQT1JUIHBSZXBvcnQgPSAoUE1FQVNVUkVfUlBJX1JFUE9SVClwUmVwb3J0QnVmOwotCQkJCQlwdHIgPSBlaWRfcHRyLT5PY3RldCArIDM7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5DaE51bSwgcHRyLCAxKTsKLQkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPk1lYXN1cmVTdGFydFRpbWUsIHB0ciArIDEsIDgpOwotCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZUR1cmF0aW9uLCBwdHIgKyA5LCAyKTsKLQkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPlJQSV9EZW5zaXR5LCBwdHIgKyAxMSwgOCk7Ci0JCQkJfQotCQkJCXJlc3VsdCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJCQl9IGVsc2UgaWYgKHBNZWFzdXJlUmVwb3J0SW5mby0+UmVwb3J0VHlwZSA9PQorCQkJCSAgIFJNX1JQSV9ISVNUT0dSQU0pIHsKKwkJCQlzdHJ1Y3QgcnRfbWVhc3VyZV9ycGlfcmVwb3J0ICogcFJlcG9ydCA9CisJCQkJICAgIChzdHJ1Y3QgcnRfbWVhc3VyZV9ycGlfcmVwb3J0ICopIHBSZXBvcnRCdWY7CisJCQkJcHRyID0gKHU4ICopKGVpZF9wdHItPk9jdGV0ICsgMyk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPkNoTnVtLCBwdHIsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlU3RhcnRUaW1lLAorCQkJCQkgICAgICAgcHRyICsgMSwgOCk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPk1lYXN1cmVEdXJhdGlvbiwKKwkJCQkJICAgICAgIHB0ciArIDksIDIpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5SUElfRGVuc2l0eSwgcHRyICsgMTEsCisJCQkJCSAgICAgICA4KTsKKwkJCX0KKwkJCXJlc3VsdCA9IFRSVUU7CisJCQlicmVhazsKIAotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOwogCQl9Ci0JCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOworCQllaWRfcHRyID0gKHN0cnVjdCBydF9laWQgKikgKCh1OCAqKSBlaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CiAJfQogCiAJcmV0dXJuIHJlc3VsdDsKQEAgLTEzMzYsMjAgKzE2NjYsMTggQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLXN0YXRpYyBCT09MRUFOIFBlZXJUcGNSZXFTYW5pdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVk9JRCAqcE1zZywKLQlJTiBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVSU5UOCBwRGlhbG9nVG9rZW4pCitzdGF0aWMgQk9PTEVBTiBQZWVyVHBjUmVxU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQl2b2lkICogcE1zZywKKwkJCQl1bnNpZ25lZCBsb25nIE1zZ0xlbiwgdTggKnBEaWFsb2dUb2tlbikKIHsKLQlQRlJBTUVfODAyXzExIEZyID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKLQlQVUNIQVIgcEZyYW1lUHRyID0gRnItPk9jdGV0OworCXN0cnVjdCBydF9mcmFtZV84MDJfMTEgKiBGciA9IChzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICopIHBNc2c7CisJdTggKnBGcmFtZVB0ciA9IEZyLT5PY3RldDsKIAlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOwotCVBFSURfU1RSVUNUIGVpZF9wdHI7CisJc3RydWN0IHJ0X2VpZCAqIGVpZF9wdHI7CiAKLQlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCU1zZ0xlbiAtPSBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpOwogCi0JLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJLyogc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuICovCiAJcEZyYW1lUHRyICs9IDI7CiAJTXNnTGVuIC09IDI7CiAKQEAgLTEzNjAsMTkgKzE2ODgsMTggQEAKIAlwRnJhbWVQdHIgKz0gMTsKIAlNc2dMZW4gLT0gMTsKIAotCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpcEZyYW1lUHRyOwotCXdoaWxlICgoKFVDSEFSKillaWRfcHRyICsgZWlkX3B0ci0+TGVuICsgMSkgPCAoKFBVQ0hBUilwRnJhbWVQdHIgKyBNc2dMZW4pKQotCXsKLQkJc3dpdGNoKGVpZF9wdHItPkVpZCkKLQkJewotCQkJY2FzZSBJRV9UUENfUkVRVUVTVDoKLQkJCQlyZXN1bHQgPSBUUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOworCWVpZF9wdHIgPSAoc3RydWN0IHJ0X2VpZCAqKSBwRnJhbWVQdHI7CisJd2hpbGUgKCgodTggKikgZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwKKwkgICAgICAgKCh1OCAqKXBGcmFtZVB0ciArIE1zZ0xlbikpIHsKKwkJc3dpdGNoIChlaWRfcHRyLT5FaWQpIHsKKwkJY2FzZSBJRV9UUENfUkVRVUVTVDoKKwkJCXJlc3VsdCA9IFRSVUU7CisJCQlicmVhazsKIAotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOwogCQl9Ci0JCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOworCQllaWRfcHRyID0gKHN0cnVjdCBydF9laWQgKikgKCh1OCAqKSBlaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CiAJfQogCiAJcmV0dXJuIHJlc3VsdDsKQEAgLTEzOTIsMjEgKzE3MTksMjAgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLXN0YXRpYyBCT09MRUFOIFBlZXJUcGNSZXBTYW5pdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVk9JRCAqcE1zZywKLQlJTiBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVSU5UOCBwRGlhbG9nVG9rZW4sCi0JT1VUIFBUUENfUkVQT1JUX0lORk8gcFRwY1JlcEluZm8pCitzdGF0aWMgQk9PTEVBTiBQZWVyVHBjUmVwU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQl2b2lkICogcE1zZywKKwkJCQl1bnNpZ25lZCBsb25nIE1zZ0xlbiwKKwkJCQl1OCAqcERpYWxvZ1Rva2VuLAorCQkJCXN0cnVjdCBydF90cGNfcmVwb3J0X2luZm8gKiBwVHBjUmVwSW5mbykKIHsKLQlQRlJBTUVfODAyXzExIEZyID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKLQlQVUNIQVIgcEZyYW1lUHRyID0gRnItPk9jdGV0OworCXN0cnVjdCBydF9mcmFtZV84MDJfMTEgKiBGciA9IChzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICopIHBNc2c7CisJdTggKnBGcmFtZVB0ciA9IEZyLT5PY3RldDsKIAlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOwotCVBFSURfU1RSVUNUIGVpZF9wdHI7CisJc3RydWN0IHJ0X2VpZCAqIGVpZF9wdHI7CiAKLQlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCU1zZ0xlbiAtPSBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpOwogCi0JLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJLyogc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuICovCiAJcEZyYW1lUHRyICs9IDI7CiAJTXNnTGVuIC09IDI7CiAKQEAgLTE0MTcsMjEgKzE3NDMsMjEgQEAKIAlwRnJhbWVQdHIgKz0gMTsKIAlNc2dMZW4gLT0gMTsKIAotCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpcEZyYW1lUHRyOwotCXdoaWxlICgoKFVDSEFSKillaWRfcHRyICsgZWlkX3B0ci0+TGVuICsgMSkgPCAoKFBVQ0hBUilwRnJhbWVQdHIgKyBNc2dMZW4pKQotCXsKLQkJc3dpdGNoKGVpZF9wdHItPkVpZCkKLQkJewotCQkJY2FzZSBJRV9UUENfUkVQT1JUOgotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwVHBjUmVwSW5mby0+VHhQd3IsIGVpZF9wdHItPk9jdGV0LCAxKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcFRwY1JlcEluZm8tPkxpbmtNYXJnaW4sIGVpZF9wdHItPk9jdGV0ICsgMSwgMSk7Ci0JCQkJcmVzdWx0ID0gVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKKwllaWRfcHRyID0gKHN0cnVjdCBydF9laWQgKikgcEZyYW1lUHRyOworCXdoaWxlICgoKHU4ICopIGVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8CisJICAgICAgICgodTggKilwRnJhbWVQdHIgKyBNc2dMZW4pKSB7CisJCXN3aXRjaCAoZWlkX3B0ci0+RWlkKSB7CisJCWNhc2UgSUVfVFBDX1JFUE9SVDoKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwVHBjUmVwSW5mby0+VHhQd3IsIGVpZF9wdHItPk9jdGV0LCAxKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwVHBjUmVwSW5mby0+TGlua01hcmdpbiwKKwkJCQkgICAgICAgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKKwkJCXJlc3VsdCA9IFRSVUU7CisJCQlicmVhazsKIAotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOwogCQl9Ci0JCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOworCQllaWRfcHRyID0gKHN0cnVjdCBydF9laWQgKikgKCh1OCAqKSBlaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CiAJfQogCiAJcmV0dXJuIHJlc3VsdDsKQEAgLTE0NDgsNjQgKzE3NzQsNjkgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLXN0YXRpYyBWT0lEIFBlZXJDaFN3QW5uQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3N0YXRpYyB2b2lkIFBlZXJDaFN3QW5uQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlDSF9TV19BTk5fSU5GTyBDaFN3QW5uSW5mbzsKLQlQRlJBTUVfODAyXzExIHBGciA9IChQRlJBTUVfODAyXzExKUVsZW0tPk1zZzsKLQlVQ0hBUiBpbmRleCA9IDAsIENoYW5uZWwgPSAwLCBOZXdDaGFubmVsID0gMDsKLQlVTE9ORyBCc3NpZHggPSAwOworCXN0cnVjdCBydF9jaF9zd19hbm5faW5mbyBDaFN3QW5uSW5mbzsKKwlzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICogcEZyID0gKHN0cnVjdCBydF9mcmFtZV84MDJfMTEgKikgRWxlbS0+TXNnOworCXU4IGluZGV4ID0gMCwgQ2hhbm5lbCA9IDAsIE5ld0NoYW5uZWwgPSAwOworCXVuc2lnbmVkIGxvbmcgQnNzaWR4ID0gMDsKIAotCU5kaXNaZXJvTWVtb3J5KCZDaFN3QW5uSW5mbywgc2l6ZW9mKENIX1NXX0FOTl9JTkZPKSk7Ci0JaWYgKCEgUGVlckNoU3dBbm5TYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJkNoU3dBbm5JbmZvKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkludmFsaWQgQ2hhbm5lbCBTd2l0Y2ggQWN0aW9uIEZyYW1lLlxuIikpOworCU5kaXNaZXJvTWVtb3J5KCZDaFN3QW5uSW5mbywgc2l6ZW9mKHN0cnVjdCBydF9jaF9zd19hbm5faW5mbykpOworCWlmICghUGVlckNoU3dBbm5TYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJkNoU3dBbm5JbmZvKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkludmFsaWQgQ2hhbm5lbCBTd2l0Y2ggQWN0aW9uIEZyYW1lLlxuIikpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCi0JewotCQlCc3NpZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBwRnItPkhkci5BZGRyMywgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckNoU3dBbm5BY3Rpb24gLSBCc3NpZHggaXMgbm90IGZvdW5kXG4iKSk7CisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpIHsKKwkJQnNzaWR4ID0KKwkJICAgIEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIHBGci0+SGRyLkFkZHIzLAorCQkJCSAgIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQlpZiAoQnNzaWR4ID09IEJTU19OT1RfRk9VTkQpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlBlZXJDaFN3QW5uQWN0aW9uIC0gQnNzaWR4IGlzIG5vdCBmb3VuZFxuIikpOwogCQkJcmV0dXJuOwogCQl9CiAKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiXG4qKioqQnNzaWR4IGlzICVkLCBDaGFubmVsID0gJWRcbiIsIGluZGV4LCBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5DaGFubmVsKSk7Ci0JCWhleF9kdW1wKCJTU0lEIixwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5Cc3NpZCAsNik7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiXG4qKioqQnNzaWR4IGlzICVkLCBDaGFubmVsID0gJWRcbiIsIGluZGV4LAorCQkJICBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5DaGFubmVsKSk7CisJCWhleF9kdW1wKCJTU0lEIiwgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uQnNzaWQsIDYpOwogCiAJCUNoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwogCQlOZXdDaGFubmVsID0gQ2hTd0FubkluZm8uQ2hhbm5lbDsKIAotCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmIChOZXdDaGFubmVsICE9IDApICYmIChDaGFubmVsICE9IE5ld0NoYW5uZWwpKQotCQl7Ci0JCQkvLyBTd2l0Y2hpbmcgdG8gY2hhbm5lbCAxIGNhbiBwcmV2ZW50IGZyb20gcmVzY2FubmluZyB0aGUgY3VycmVudCBjaGFubmVsIGltbWVkaWF0ZWx5IChieSBhdXRvIHJlY29ubmVjdGlvbikuCi0JCQkvLyBJbiBhZGRpdGlvbiwgY2xlYXIgdGhlIE1MTUUgcXVldWUgYW5kIHRoZSBzY2FuIHRhYmxlIHRvIGRpc2NhcmQgdGhlIFJYIHBhY2tldHMgYW5kIHByZXZpb3VzIHNjYW5uaW5nIHJlc3VsdHMuCisJCWlmICgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYgKE5ld0NoYW5uZWwgIT0gMCkKKwkJICAgICYmIChDaGFubmVsICE9IE5ld0NoYW5uZWwpKSB7CisJCQkvKiBTd2l0Y2hpbmcgdG8gY2hhbm5lbCAxIGNhbiBwcmV2ZW50IGZyb20gcmVzY2FubmluZyB0aGUgY3VycmVudCBjaGFubmVsIGltbWVkaWF0ZWx5IChieSBhdXRvIHJlY29ubmVjdGlvbikuICovCisJCQkvKiBJbiBhZGRpdGlvbiwgY2xlYXIgdGhlIE1MTUUgcXVldWUgYW5kIHRoZSBzY2FuIHRhYmxlIHRvIGRpc2NhcmQgdGhlIFJYIHBhY2tldHMgYW5kIHByZXZpb3VzIHNjYW5uaW5nIHJlc3VsdHMuICovCiAJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIDEsIEZBTFNFKTsKIAkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIDEpOwotCQkgICAgTGlua0Rvd24ocEFkLCBGQUxTRSk7CisJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKIAkJCU1sbWVRdWV1ZUluaXQoJnBBZC0+TWxtZS5RdWV1ZSk7CiAJCQlCc3NUYWJsZUluaXQoJnBBZC0+U2NhblRhYik7Ci0JCSAgICBSVE1QdXNlY0RlbGF5KDEwMDAwMDApOwkJLy8gdXNlIGRlbGF5IHRvIHByZXZlbnQgU1RBIGRvIHJlYXNzb2MKKwkJCVJUTVB1c2VjRGVsYXkoMTAwMDAwMCk7CS8qIHVzZSBkZWxheSB0byBwcmV2ZW50IFNUQSBkbyByZWFzc29jICovCiAKLQkJCS8vIGNoYW5uZWwgc2FuaXR5IGNoZWNrCi0JCQlmb3IgKGluZGV4ID0gMCA7IGluZGV4IDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaW5kZXgrKykKLQkJCXsKLQkJCQlpZiAocEFkLT5DaGFubmVsTGlzdFtpbmRleF0uQ2hhbm5lbCA9PSBOZXdDaGFubmVsKQotCQkJCXsKLQkJCQkJcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uQ2hhbm5lbCA9IE5ld0NoYW5uZWw7CisJCQkvKiBjaGFubmVsIHNhbml0eSBjaGVjayAqLworCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaW5kZXgrKykgeworCQkJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2luZGV4XS5DaGFubmVsID09CisJCQkJICAgIE5ld0NoYW5uZWwpIHsKKwkJCQkJcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uQ2hhbm5lbCA9CisJCQkJCSAgICBOZXdDaGFubmVsOwogCQkJCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gTmV3Q2hhbm5lbDsKLQkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCImJiYmJiYmJiYmJiYmJiYmUGVlckNoU3dBbm5BY3Rpb24gLSBTVEEgcmVjZWl2ZSBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgSUUgKE5ldyBDaGFubmVsID0lZClcbiIsIE5ld0NoYW5uZWwpKTsKKwkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLAorCQkJCQkJCSAgcEFkLT5Db21tb25DZmcuCisJCQkJCQkJICBDaGFubmVsLCBGQUxTRSk7CisJCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsCisJCQkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICgiJiYmJiYmJiYmJiYmJiYmJlBlZXJDaFN3QW5uQWN0aW9uIC0gU1RBIHJlY2VpdmUgY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IElFIChOZXcgQ2hhbm5lbCA9JWQpXG4iLAorCQkJCQkJICBOZXdDaGFubmVsKSk7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KIAotCQkJaWYgKGluZGV4ID49IHBBZC0+Q2hhbm5lbExpc3ROdW0pCi0JCQl7CisJCQlpZiAoaW5kZXggPj0gcEFkLT5DaGFubmVsTGlzdE51bSkgewogCQkJCURCR1BSSU5UX0VSUigoIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmUGVlckNoU3dBbm5BY3Rpb24oY2FuIG5vdCBmaW5kIE5ldyBDaGFubmVsPSVkIGluIENoYW5uZWxMaXN0WyVkXVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5DaGFubmVsTGlzdE51bSkpOwogCQkJfQogCQl9CkBAIC0xNTE0LDcgKzE4NDUsNiBAQAogCXJldHVybjsKIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJRGVzY3JpcHRpb246CkBAIC0xNTI2LDIwICsxODU2LDIzIEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1zdGF0aWMgVk9JRCBQZWVyTWVhc3VyZVJlcUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCitzdGF0aWMgdm9pZCBQZWVyTWVhc3VyZVJlcUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JUEZSQU1FXzgwMl8xMSBwRnIgPSAoUEZSQU1FXzgwMl8xMSlFbGVtLT5Nc2c7Ci0JVUlOVDggRGlhbG9nVG9rZW47Ci0JTUVBU1VSRV9SRVFfSU5GTyBNZWFzdXJlUmVxSW5mbzsKKwlzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICogcEZyID0gKHN0cnVjdCBydF9mcmFtZV84MDJfMTEgKikgRWxlbS0+TXNnOworCXU4IERpYWxvZ1Rva2VuOworCXN0cnVjdCBydF9tZWFzdXJlX3JlcV9pbmZvIE1lYXN1cmVSZXFJbmZvOworCXN0cnVjdCBydF9tZWFzdXJlX3JlcSBNZWFzdXJlUmVxOwogCU1FQVNVUkVfUkVQT1JUX01PREUgUmVwb3J0TW9kZTsKIAotCWlmKFBlZXJNZWFzdXJlUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZEaWFsb2dUb2tlbiwgJk1lYXN1cmVSZXFJbmZvKSkKLQl7CisJaWYgKFBlZXJNZWFzdXJlUmVxU2FuaXR5CisJICAgIChwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmRGlhbG9nVG9rZW4sICZNZWFzdXJlUmVxSW5mbywKKwkgICAgICZNZWFzdXJlUmVxKSkgewogCQlSZXBvcnRNb2RlLndvcmQgPSAwOwogCQlSZXBvcnRNb2RlLmZpZWxkLkluY2FwYWJsZSA9IDE7Ci0JCUVucXVldWVNZWFzdXJlbWVudFJlcChwQWQsIHBGci0+SGRyLkFkZHIyLCBEaWFsb2dUb2tlbiwgTWVhc3VyZVJlcUluZm8uVG9rZW4sIFJlcG9ydE1vZGUud29yZCwgTWVhc3VyZVJlcUluZm8uUmVxVHlwZSwgMCwgTlVMTCk7CisJCUVucXVldWVNZWFzdXJlbWVudFJlcChwQWQsIHBGci0+SGRyLkFkZHIyLCBEaWFsb2dUb2tlbiwKKwkJCQkgICAgICBNZWFzdXJlUmVxSW5mby5Ub2tlbiwgUmVwb3J0TW9kZS53b3JkLAorCQkJCSAgICAgIE1lYXN1cmVSZXFJbmZvLlJlcVR5cGUsIDAsIE5VTEwpOwogCX0KIAogCXJldHVybjsKQEAgLTE1NTYsNTQgKzE4ODksNjUgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLXN0YXRpYyBWT0lEIFBlZXJNZWFzdXJlUmVwb3J0QWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3N0YXRpYyB2b2lkIFBlZXJNZWFzdXJlUmVwb3J0QWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlNRUFTVVJFX1JFUE9SVF9JTkZPIE1lYXN1cmVSZXBvcnRJbmZvOwotCVBGUkFNRV84MDJfMTEgcEZyID0gKFBGUkFNRV84MDJfMTEpRWxlbS0+TXNnOwotCVVJTlQ4IERpYWxvZ1Rva2VuOwotCVBVSU5UOCBwTWVhc3VyZVJlcG9ydEluZm87CisJc3RydWN0IHJ0X21lYXN1cmVfcmVwb3J0X2luZm8gTWVhc3VyZVJlcG9ydEluZm87CisJc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqIHBGciA9IChzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICopIEVsZW0tPk1zZzsKKwl1OCBEaWFsb2dUb2tlbjsKKwl1OCAqcE1lYXN1cmVSZXBvcnRJbmZvOwogCi0vLwlpZiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggIT0gVFJVRSkKLS8vCQlyZXR1cm47CisvKiAgICAgIGlmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCAhPSBUUlVFKSAqLworLyogICAgICAgICAgICAgIHJldHVybjsgKi8KIAotCWlmICgocE1lYXN1cmVSZXBvcnRJbmZvID0ga21hbGxvYyhzaXplb2YoTUVBU1VSRV9SUElfUkVQT1JUKSwgR0ZQX0FUT01JQykpID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyB1bmFibGUgdG8gYWxsb2MgbWVtb3J5IGZvciBtZWFzdXJlIHJlcG9ydCBidWZmZXIgKHNpemU9JXp1KS5cbiIsIF9fZnVuY19fLCBzaXplb2YoTUVBU1VSRV9SUElfUkVQT1JUKSkpOworCWlmICgocE1lYXN1cmVSZXBvcnRJbmZvID0KKwkgICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBydF9tZWFzdXJlX3JwaV9yZXBvcnQpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIiVzIHVuYWJsZSB0byBhbGxvYyBtZW1vcnkgZm9yIG1lYXN1cmUgcmVwb3J0IGJ1ZmZlciAoc2l6ZT0lenUpLlxuIiwKKwkJCSAgX19mdW5jX18sIHNpemVvZihzdHJ1Y3QgcnRfbWVhc3VyZV9ycGlfcmVwb3J0KSkpOwogCQlyZXR1cm47CiAJfQogCi0JTmRpc1plcm9NZW1vcnkoJk1lYXN1cmVSZXBvcnRJbmZvLCBzaXplb2YoTUVBU1VSRV9SRVBPUlRfSU5GTykpOwotCU5kaXNaZXJvTWVtb3J5KHBNZWFzdXJlUmVwb3J0SW5mbywgc2l6ZW9mKE1FQVNVUkVfUlBJX1JFUE9SVCkpOwotCWlmIChQZWVyTWVhc3VyZVJlcG9ydFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmRGlhbG9nVG9rZW4sICZNZWFzdXJlUmVwb3J0SW5mbywgcE1lYXN1cmVSZXBvcnRJbmZvKSkKLQl7CisJTmRpc1plcm9NZW1vcnkoJk1lYXN1cmVSZXBvcnRJbmZvLCBzaXplb2Yoc3RydWN0IHJ0X21lYXN1cmVfcmVwb3J0X2luZm8pKTsKKwlOZGlzWmVyb01lbW9yeShwTWVhc3VyZVJlcG9ydEluZm8sIHNpemVvZihzdHJ1Y3QgcnRfbWVhc3VyZV9ycGlfcmVwb3J0KSk7CisJaWYgKFBlZXJNZWFzdXJlUmVwb3J0U2FuaXR5CisJICAgIChwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmRGlhbG9nVG9rZW4sICZNZWFzdXJlUmVwb3J0SW5mbywKKwkgICAgIHBNZWFzdXJlUmVwb3J0SW5mbykpIHsKIAkJZG8gewotCQkJUE1FQVNVUkVfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisJCQlzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfZW50cnkgKnBFbnRyeSA9IE5VTEw7CiAKLQkJCS8vIE5vdCBhIGF1dG9ub21vdXMgbWVhc3VyZSByZXBvcnQuCi0JCQkvLyBjaGVjayB0aGUgZGlhbG9nIHRva2VuIGZpZWxkLiBkcm9wIGl0IGlmIHRoZSBkaWFsb2cgdG9rZW4gZG9lc24ndCBtYXRjaC4KKwkJCS8qIE5vdCBhIGF1dG9ub21vdXMgbWVhc3VyZSByZXBvcnQuICovCisJCQkvKiBjaGVjayB0aGUgZGlhbG9nIHRva2VuIGZpZWxkLiBkcm9wIGl0IGlmIHRoZSBkaWFsb2cgdG9rZW4gZG9lc24ndCBtYXRjaC4gKi8KIAkJCWlmICgoRGlhbG9nVG9rZW4gIT0gMCkKLQkJCQkmJiAoKHBFbnRyeSA9IE1lYXN1cmVSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbikpID09IE5VTEwpKQorCQkJICAgICYmICgocEVudHJ5ID0gTWVhc3VyZVJlcUxvb2tVcChwQWQsIERpYWxvZ1Rva2VuKSkgPT0KKwkJCQlOVUxMKSkKIAkJCQlicmVhazsKIAogCQkJaWYgKHBFbnRyeSAhPSBOVUxMKQogCQkJCU1lYXN1cmVSZXFEZWxldGUocEFkLCBwRW50cnktPkRpYWxvZ1Rva2VuKTsKIAotCQkJaWYgKE1lYXN1cmVSZXBvcnRJbmZvLlJlcG9ydFR5cGUgPT0gUk1fQkFTSUMpCi0JCQl7Ci0JCQkJUE1FQVNVUkVfQkFTSUNfUkVQT1JUIHBCYXNpY1JlcG9ydCA9IChQTUVBU1VSRV9CQVNJQ19SRVBPUlQpcE1lYXN1cmVSZXBvcnRJbmZvOworCQkJaWYgKE1lYXN1cmVSZXBvcnRJbmZvLlJlcG9ydFR5cGUgPT0gUk1fQkFTSUMpIHsKKwkJCQlzdHJ1Y3QgcnRfbWVhc3VyZV9iYXNpY19yZXBvcnQgKiBwQmFzaWNSZXBvcnQgPQorCQkJCSAgICAoc3RydWN0IHJ0X21lYXN1cmVfYmFzaWNfcmVwb3J0ICopIHBNZWFzdXJlUmVwb3J0SW5mbzsKIAkJCQlpZiAoKHBCYXNpY1JlcG9ydC0+TWFwLmZpZWxkLlJhZGFyKQotCQkJCQkmJiAoRGZzUmVxdWlyZW1lbnRDaGVjayhwQWQsIHBCYXNpY1JlcG9ydC0+Q2hOdW0pID09IFRSVUUpKQotCQkJCXsKLQkJCQkJTm90aWZ5Q2hTd0FublRvUGVlckFQcyhwQWQsIHBGci0+SGRyLkFkZHIxLCBwRnItPkhkci5BZGRyMiwgMSwgcEJhc2ljUmVwb3J0LT5DaE51bSk7Ci0JCQkJCVN0YXJ0REZTUHJvY2VkdXJlKHBBZCwgcEJhc2ljUmVwb3J0LT5DaE51bSwgMSk7CisJCQkJICAgICYmCisJCQkJICAgIChEZnNSZXF1aXJlbWVudENoZWNrCisJCQkJICAgICAocEFkLCBwQmFzaWNSZXBvcnQtPkNoTnVtKSA9PSBUUlVFKSkgeworCQkJCQlOb3RpZnlDaFN3QW5uVG9QZWVyQVBzKHBBZCwKKwkJCQkJCQkgICAgICAgcEZyLT5IZHIuQWRkcjEsCisJCQkJCQkJICAgICAgIHBGci0+SGRyLkFkZHIyLAorCQkJCQkJCSAgICAgICAxLAorCQkJCQkJCSAgICAgICBwQmFzaWNSZXBvcnQtPgorCQkJCQkJCSAgICAgICBDaE51bSk7CisJCQkJCVN0YXJ0REZTUHJvY2VkdXJlKHBBZCwKKwkJCQkJCQkgIHBCYXNpY1JlcG9ydC0+Q2hOdW0sCisJCQkJCQkJICAxKTsKIAkJCQl9CiAJCQl9CiAJCX0gd2hpbGUgKEZBTFNFKTsKLQl9Ci0JZWxzZQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJbnZhbGlkIE1lYXN1cmVtZW50IFJlcG9ydCBGcmFtZS5cbiIpKTsKKwl9IGVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJJbnZhbGlkIE1lYXN1cmVtZW50IFJlcG9ydCBGcmFtZS5cbiIpKTsKIAogCWtmcmVlKHBNZWFzdXJlUmVwb3J0SW5mbyk7CiAKQEAgLTE2MjEsMzQgKzE5NjUsMzMgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLXN0YXRpYyBWT0lEIFBlZXJUcGNSZXFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQorc3RhdGljIHZvaWQgUGVlclRwY1JlcUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JUEZSQU1FXzgwMl8xMSBwRnIgPSAoUEZSQU1FXzgwMl8xMSlFbGVtLT5Nc2c7Ci0JUFVDSEFSIHBGcmFtZVB0ciA9IHBGci0+T2N0ZXQ7Ci0JVUlOVDggRGlhbG9nVG9rZW47Ci0JVUlOVDggVHhQd3IgPSBHZXRDdXJUeFB3cihwQWQsIEVsZW0tPldjaWQpOwotCVVJTlQ4IExpbmtNYXJnaW4gPSAwOwotCUNIQVIgUmVhbFJzc2k7CisJc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqIHBGciA9IChzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICopIEVsZW0tPk1zZzsKKwl1OCAqcEZyYW1lUHRyID0gcEZyLT5PY3RldDsKKwl1OCBEaWFsb2dUb2tlbjsKKwl1OCBUeFB3ciA9IEdldEN1clR4UHdyKHBBZCwgRWxlbS0+V2NpZCk7CisJdTggTGlua01hcmdpbiA9IDA7CisJY2hhciBSZWFsUnNzaTsKIAotCS8vIGxpbmsgbWFyZ2luOiBSYXRpbyBvZiB0aGUgcmVjZWl2ZWQgc2lnbmFsIHBvd2VyIHRvIHRoZSBtaW5pbXVtIGRlc2lyZWQgYnkgdGhlIHN0YXRpb24gKFNUQSkuIFRoZQotCS8vCQkJCVNUQSBtYXkgaW5jb3Jwb3JhdGUgcmF0ZSBpbmZvcm1hdGlvbiBhbmQgY2hhbm5lbCBjb25kaXRpb25zLCBpbmNsdWRpbmcgaW50ZXJmZXJlbmNlLCBpbnRvIGl0cyBjb21wdXRhdGlvbgotCS8vCQkJCW9mIGxpbmsgbWFyZ2luLgorCS8qIGxpbmsgbWFyZ2luOiBSYXRpbyBvZiB0aGUgcmVjZWl2ZWQgc2lnbmFsIHBvd2VyIHRvIHRoZSBtaW5pbXVtIGRlc2lyZWQgYnkgdGhlIHN0YXRpb24gKFNUQSkuIFRoZSAqLworCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBIG1heSBpbmNvcnBvcmF0ZSByYXRlIGluZm9ybWF0aW9uIGFuZCBjaGFubmVsIGNvbmRpdGlvbnMsIGluY2x1ZGluZyBpbnRlcmZlcmVuY2UsIGludG8gaXRzIGNvbXB1dGF0aW9uICovCisJLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBsaW5rIG1hcmdpbi4gKi8KIAogCVJlYWxSc3NpID0gUlRNUE1heFJzc2kocEFkLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTAsIFJTU0lfMCksCi0JCQkJCQkJCUNvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMSwgUlNTSV8xKSwKLQkJCQkJCQkJQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kyLCBSU1NJXzIpKTsKKwkJCSAgICAgICBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTEsIFJTU0lfMSksCisJCQkgICAgICAgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kyLCBSU1NJXzIpKTsKIAotCS8vIHNraXAgQ2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgorCS8qIHNraXAgQ2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLiAqLwogCXBGcmFtZVB0ciArPSAyOwogCi0JLy8gRGlhbG9nIHRva2VuLgorCS8qIERpYWxvZyB0b2tlbi4gKi8KIAlOZGlzTW92ZU1lbW9yeSgmRGlhbG9nVG9rZW4sIHBGcmFtZVB0ciwgMSk7CiAKIAlMaW5rTWFyZ2luID0gKFJlYWxSc3NpIC8gTUlOX1JDVl9QV1IpOwogCWlmIChQZWVyVHBjUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZEaWFsb2dUb2tlbikpCi0JCUVucXVldWVUUENSZXAocEFkLCBwRnItPkhkci5BZGRyMiwgRGlhbG9nVG9rZW4sIFR4UHdyLCBMaW5rTWFyZ2luKTsKKwkJRW5xdWV1ZVRQQ1JlcChwQWQsIHBGci0+SGRyLkFkZHIyLCBEaWFsb2dUb2tlbiwgVHhQd3IsCisJCQkgICAgICBMaW5rTWFyZ2luKTsKIAogCXJldHVybjsKIH0KQEAgLTE2NjQsMjIgKzIwMDcsMjEgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLXN0YXRpYyBWT0lEIFBlZXJUcGNSZXBBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQorc3RhdGljIHZvaWQgUGVlclRwY1JlcEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVUlOVDggRGlhbG9nVG9rZW47Ci0JVFBDX1JFUE9SVF9JTkZPIFRwY1JlcEluZm87Ci0JUFRQQ19SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTDsKKwl1OCBEaWFsb2dUb2tlbjsKKwlzdHJ1Y3QgcnRfdHBjX3JlcG9ydF9pbmZvIFRwY1JlcEluZm87CisJc3RydWN0IHJ0X3RwY19yZXFfZW50cnkgKnBFbnRyeSA9IE5VTEw7CiAKLQlOZGlzWmVyb01lbW9yeSgmVHBjUmVwSW5mbywgc2l6ZW9mKFRQQ19SRVBPUlRfSU5GTykpOwotCWlmIChQZWVyVHBjUmVwU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZEaWFsb2dUb2tlbiwgJlRwY1JlcEluZm8pKQotCXsKLQkJaWYgKChwRW50cnkgPSBUcGNSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbikpICE9IE5VTEwpCi0JCXsKKwlOZGlzWmVyb01lbW9yeSgmVHBjUmVwSW5mbywgc2l6ZW9mKHN0cnVjdCBydF90cGNfcmVwb3J0X2luZm8pKTsKKwlpZiAoUGVlclRwY1JlcFNhbml0eQorCSAgICAocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJkRpYWxvZ1Rva2VuLCAmVHBjUmVwSW5mbykpIHsKKwkJaWYgKChwRW50cnkgPSBUcGNSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbikpICE9IE5VTEwpIHsKIAkJCVRwY1JlcURlbGV0ZShwQWQsIHBFbnRyeS0+RGlhbG9nVG9rZW4pOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6IERpYWxvZ1Rva2VuPSV4LCBUeFB3cj0lZCwgTGlua01hcmdpbj0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgRGlhbG9nVG9rZW4sIFRwY1JlcEluZm8uVHhQd3IsIFRwY1JlcEluZm8uTGlua01hcmdpbikpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiJXM6IERpYWxvZ1Rva2VuPSV4LCBUeFB3cj0lZCwgTGlua01hcmdpbj0lZFxuIiwKKwkJCQkgIF9fZnVuY19fLCBEaWFsb2dUb2tlbiwgVHBjUmVwSW5mby5UeFB3ciwKKwkJCQkgIFRwY1JlcEluZm8uTGlua01hcmdpbikpOwogCQl9CiAJfQogCkBAIC0xNjk4LDQxICsyMDQwLDM3IEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIFBlZXJTcGVjdHJ1bUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIFBlZXJTcGVjdHJ1bUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7CiAKLQlVQ0hBUglBY3Rpb24gPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsxXTsKKwl1OCBBY3Rpb24gPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIDFdOwogCiAJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIICE9IFRSVUUpCiAJCXJldHVybjsKIAotCXN3aXRjaChBY3Rpb24pCi0JewotCQljYXNlIFNQRUNfTVJROgotCQkJLy8gY3VycmVudCBydDI4NjAgdW5hYmxlIGRvIHN1Y2ggbWVhc3VyZSBzcGVjaWZpZWQgaW4gTWVhc3VyZW1lbnQgUmVxdWVzdC4KLQkJCS8vIHJlamVjdCBhbGwgbWVhc3VyZW1lbnQgcmVxdWVzdC4KLQkJCVBlZXJNZWFzdXJlUmVxQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKKwlzd2l0Y2ggKEFjdGlvbikgeworCWNhc2UgU1BFQ19NUlE6CisJCS8qIGN1cnJlbnQgcnQyODYwIHVuYWJsZSBkbyBzdWNoIG1lYXN1cmUgc3BlY2lmaWVkIGluIE1lYXN1cmVtZW50IFJlcXVlc3QuICovCisJCS8qIHJlamVjdCBhbGwgbWVhc3VyZW1lbnQgcmVxdWVzdC4gKi8KKwkJUGVlck1lYXN1cmVSZXFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJYnJlYWs7CiAKLQkJY2FzZSBTUEVDX01SUDoKLQkJCVBlZXJNZWFzdXJlUmVwb3J0QWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKKwljYXNlIFNQRUNfTVJQOgorCQlQZWVyTWVhc3VyZVJlcG9ydEFjdGlvbihwQWQsIEVsZW0pOworCQlicmVhazsKIAotCQljYXNlIFNQRUNfVFBDUlE6Ci0JCQlQZWVyVHBjUmVxQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKKwljYXNlIFNQRUNfVFBDUlE6CisJCVBlZXJUcGNSZXFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJYnJlYWs7CiAKLQkJY2FzZSBTUEVDX1RQQ1JQOgotCQkJUGVlclRwY1JlcEFjdGlvbihwQWQsIEVsZW0pOwotCQkJYnJlYWs7CisJY2FzZSBTUEVDX1RQQ1JQOgorCQlQZWVyVHBjUmVwQWN0aW9uKHBBZCwgRWxlbSk7CisJCWJyZWFrOwogCi0JCWNhc2UgU1BFQ19DSEFOTkVMX1NXSVRDSDoKLXsKLX0KLQkJCVBlZXJDaFN3QW5uQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKKwljYXNlIFNQRUNfQ0hBTk5FTF9TV0lUQ0g6CisKKwkJUGVlckNoU3dBbm5BY3Rpb24ocEFkLCBFbGVtKTsKKwkJYnJlYWs7CiAJfQogCiAJcmV0dXJuOwpAQCAtMTc0Nyw0OSArMjA4NSw2MyBAQAogCVJldHVybgk6IE5vbmUuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotSU5UIFNldF9NZWFzdXJlUmVxX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQoraW50IFNldF9NZWFzdXJlUmVxX1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBjaGFyICphcmcpCiB7Ci0JVUlOVCBBaWQgPSAxOwotCVVJTlQgQXJnSWR4OwotCVBVQ0hBUiB0aGlzQ2hhcjsKKwl1MzIgQWlkID0gMTsKKwl1MzIgQXJnSWR4OworCWNoYXIgKnRoaXNDaGFyOwogCiAJTUVBU1VSRV9SRVFfTU9ERSBNZWFzdXJlUmVxTW9kZTsKLQlVSU5UOCBNZWFzdXJlUmVxVG9rZW4gPSBSYW5kb21CeXRlKHBBZCk7Ci0JVUlOVDggTWVhc3VyZVJlcVR5cGUgPSBSTV9CQVNJQzsKLQlVSU5UOCBNZWFzdXJlQ2ggPSAxOworCXU4IE1lYXN1cmVSZXFUb2tlbiA9IFJhbmRvbUJ5dGUocEFkKTsKKwl1OCBNZWFzdXJlUmVxVHlwZSA9IFJNX0JBU0lDOworCXU4IE1lYXN1cmVDaCA9IDE7CisJdTY0IE1lYXN1cmVTdGFydFRpbWUgPSBHZXRDdXJyZW50VGltZVN0YW1wKHBBZCk7CisJc3RydWN0IHJ0X21lYXN1cmVfcmVxIE1lYXN1cmVSZXE7CisJdTggVG90YWxMZW47CisKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBBY3RIZHI7CisJdTggKnBPdXRCdWZmZXIgPSBOVUxMOworCWludCBOU3RhdHVzOworCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW47CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKHZvaWQgKikmIHBPdXRCdWZmZXIpOwkvKkdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5ICovCisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fZnVuY19fKSk7CisJCWdvdG8gRU5EX09GX01FQVNVUkVfUkVROworCX0KIAogCUFyZ0lkeCA9IDE7Ci0Jd2hpbGUgKCh0aGlzQ2hhciA9IHN0cnNlcCgoY2hhciAqKikmYXJnLCAiLSIpKSAhPSBOVUxMKQotCXsKLQkJc3dpdGNoKEFyZ0lkeCkKLQkJewotCQkJY2FzZSAxOgkvLyBBaWQuCi0JCQkJQWlkID0gc2ltcGxlX3N0cnRvbCh0aGlzQ2hhciwgMCwgMTYpOwotCQkJCWJyZWFrOworCXdoaWxlICgodGhpc0NoYXIgPSBzdHJzZXAoKGNoYXIgKiopJmFyZywgIi0iKSkgIT0gTlVMTCkgeworCQlzd2l0Y2ggKEFyZ0lkeCkgeworCQljYXNlIDE6CS8qIEFpZC4gKi8KKwkJCUFpZCA9ICh1OClzaW1wbGVfc3RydG9sKHRoaXNDaGFyLCAwLCAxNik7CisJCQlicmVhazsKIAotCQkJY2FzZSAyOiAvLyBNZWFzdXJlbWVudCBSZXF1ZXN0IFR5cGUuCi0JCQkJTWVhc3VyZVJlcVR5cGUgPSBzaW1wbGVfc3RydG9sKHRoaXNDaGFyLCAwLCAxNik7Ci0JCQkJaWYgKE1lYXN1cmVSZXFUeXBlID4gMykKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiB1bmtub3cgTWVhc3VyZVJlcVR5cGUoJWQpXG4iLCBfX2Z1bmNfXywgTWVhc3VyZVJlcVR5cGUpKTsKLQkJCQkJcmV0dXJuIFRSVUU7Ci0JCQkJfQotCQkJCWJyZWFrOworCQljYXNlIDI6CS8qIE1lYXN1cmVtZW50IFJlcXVlc3QgVHlwZS4gKi8KKwkJCU1lYXN1cmVSZXFUeXBlID0gc2ltcGxlX3N0cnRvbCh0aGlzQ2hhciwgMCwgMTYpOworCQkJaWYgKE1lYXN1cmVSZXFUeXBlID4gMykgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkgKCIlczogdW5rbm93IE1lYXN1cmVSZXFUeXBlKCVkKVxuIiwKKwkJCQkJICBfX2Z1bmNfXywgTWVhc3VyZVJlcVR5cGUpKTsKKwkJCQlnb3RvIEVORF9PRl9NRUFTVVJFX1JFUTsKKwkJCX0KKwkJCWJyZWFrOwogCi0JCQljYXNlIDM6IC8vIE1lYXN1cmVtZW50IGNoYW5uZWwuCi0JCQkJTWVhc3VyZUNoID0gc2ltcGxlX3N0cnRvbCh0aGlzQ2hhciwgMCwgMTYpOwotCQkJCWJyZWFrOworCQljYXNlIDM6CS8qIE1lYXN1cmVtZW50IGNoYW5uZWwuICovCisJCQlNZWFzdXJlQ2ggPSAodTgpc2ltcGxlX3N0cnRvbCh0aGlzQ2hhciwgMCwgMTYpOworCQkJYnJlYWs7CiAJCX0KIAkJQXJnSWR4Kys7CiAJfQogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OkFpZCA9ICVkLCBNZWFzdXJlUmVxVHlwZT0lZCBNZWFzdXJlQ2g9JWRcbiIsIF9fZnVuY19fLCBBaWQsIE1lYXN1cmVSZXFUeXBlLCBNZWFzdXJlQ2gpKTsKLQlpZiAoIVZBTElEX1dDSUQoQWlkKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiB1bmtub3cgc3RhIG9mIEFpZCglZClcbiIsIF9fZnVuY19fLCBBaWQpKTsKLQkJcmV0dXJuIFRSVUU7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIiVzOjpBaWQgPSAlZCwgTWVhc3VyZVJlcVR5cGU9JWQgTWVhc3VyZUNoPSVkXG4iLCBfX2Z1bmNfXywKKwkJICBBaWQsIE1lYXN1cmVSZXFUeXBlLCBNZWFzdXJlQ2gpKTsKKwlpZiAoIVZBTElEX1dDSUQoQWlkKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIiVzOiB1bmtub3cgc3RhIG9mIEFpZCglZClcbiIsIF9fZnVuY19fLCBBaWQpKTsKKwkJZ290byBFTkRfT0ZfTUVBU1VSRV9SRVE7CiAJfQogCiAJTWVhc3VyZVJlcU1vZGUud29yZCA9IDA7CkBAIC0xNzk3LDI2ICsyMTQ5LDUyIEBACiAKIAlNZWFzdXJlUmVxSW5zZXJ0KHBBZCwgTWVhc3VyZVJlcVRva2VuKTsKIAotCUVucXVldWVNZWFzdXJlbWVudFJlcShwQWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5BZGRyLAotCQlNZWFzdXJlUmVxVG9rZW4sIE1lYXN1cmVSZXFNb2RlLndvcmQsIE1lYXN1cmVSZXFUeXBlLCBNZWFzdXJlQ2gsIDIwMDApOworCS8qIGJ1aWxkIGFjdGlvbiBmcmFtZSBoZWFkZXIuICovCisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZBY3RIZHIsIFNVQlRZUEVfQUNUSU9OLCAwLAorCQkJIHBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5BZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKworCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChjaGFyICopJiBBY3RIZHIsIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSkpOworCUZyYW1lTGVuID0gc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKTsKKworCVRvdGFsTGVuID0gc2l6ZW9mKHN0cnVjdCBydF9tZWFzdXJlX3JlcV9pbmZvKSArIHNpemVvZihzdHJ1Y3QgcnRfbWVhc3VyZV9yZXEpOworCisJTWFrZU1lYXN1cmVtZW50UmVxRnJhbWUocEFkLCBwT3V0QnVmZmVyLCAmRnJhbWVMZW4sCisJCQkJc2l6ZW9mKHN0cnVjdCBydF9tZWFzdXJlX3JlcV9pbmZvKSwgQ0FURUdPUllfUk0sIFJNX0JBU0lDLAorCQkJCU1lYXN1cmVSZXFUb2tlbiwgTWVhc3VyZVJlcU1vZGUud29yZCwKKwkJCQlNZWFzdXJlUmVxVHlwZSwgMCk7CisKKwlNZWFzdXJlUmVxLkNoTnVtID0gTWVhc3VyZUNoOworCU1lYXN1cmVSZXEuTWVhc3VyZVN0YXJ0VGltZSA9IGNwdTJsZTY0KE1lYXN1cmVTdGFydFRpbWUpOworCU1lYXN1cmVSZXEuTWVhc3VyZUR1cmF0aW9uID0gY3B1MmxlMTYoMjAwMCk7CisKKwl7CisJCXVuc2lnbmVkIGxvbmcgVGVtcExlbjsKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmVGVtcExlbiwKKwkJCQkgIHNpemVvZihzdHJ1Y3QgcnRfbWVhc3VyZV9yZXEpLCAmTWVhc3VyZVJlcSwKKwkJCQkgIEVORF9PRl9BUkdTKTsKKwkJRnJhbWVMZW4gKz0gVGVtcExlbjsKKwl9CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgKHUzMilGcmFtZUxlbik7CisKK0VORF9PRl9NRUFTVVJFX1JFUToKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwogCiAJcmV0dXJuIFRSVUU7CiB9CiAKLUlOVCBTZXRfVHBjUmVxX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQoraW50IFNldF9UcGNSZXFfUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIGNoYXIgKmFyZykKIHsKLQlVSU5UIEFpZDsKKwl1MzIgQWlkOwogCi0JVUlOVDggVHBjUmVxVG9rZW4gPSBSYW5kb21CeXRlKHBBZCk7CisJdTggVHBjUmVxVG9rZW4gPSBSYW5kb21CeXRlKHBBZCk7CiAKLQlBaWQgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTYpOworCUFpZCA9ICh1MzIpc2ltcGxlX3N0cnRvbChhcmcsIDAsIDE2KTsKIAogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpBaWQgPSAlZFxuIiwgX19mdW5jX18sIEFpZCkpOwotCWlmICghVkFMSURfV0NJRChBaWQpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHVua25vdyBzdGEgb2YgQWlkKCVkKVxuIiwgX19mdW5jX18sIEFpZCkpOworCWlmICghVkFMSURfV0NJRChBaWQpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiJXM6IHVua25vdyBzdGEgb2YgQWlkKCVkKVxuIiwgX19mdW5jX18sIEFpZCkpOwogCQlyZXR1cm4gVFJVRTsKIAl9CiAKQEAgLTE4MjYsNCArMjIwNCwzIEBACiAKIAlyZXR1cm4gVFJVRTsKIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb25maWcubWsgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbmZpZy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjViZDU1YS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbmZpZy5taworKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0jIFN1cHBvcnQgQVRFIGZ1bmN0aW9uCi1IQVNfQVRFPW4KLQotIyBTdXBwb3J0IDI4eHggUUEgQVRFIGZ1bmN0aW9uCi1IQVNfMjh4eF9RQT1uCi0KLSMgU3VwcG9ydCBXcGFfU3VwcGxpY2FudAotSEFTX1dQQV9TVVBQTElDQU5UPW4KLQotIyBTdXBwb3J0IE5hdGl2ZSBXcGFTdXBwbGljYW50IGZvciBOZXR3b3JrIE1hZ2FuZ2VyCi1IQVNfTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQ9bgotCi0jU3VwcG9ydCBOZXQgaW50ZXJmYWNlIGJsb2NrIHdoaWxlIFR4LVN3IHF1ZXVlIGZ1bGwKLUhBU19CTE9DS19ORVRfSUY9bgotCi0jU3VwcG9ydCBERlMgZnVuY3Rpb24KLUhBU19ERlNfU1VQUE9SVD1uCi0KLSNTdXBwb3J0IENhcnJpZXItU2Vuc2UgZnVuY3Rpb24KLUhBU19DU19TVVBQT1JUPW4KLQotI2lmZGVmIE1VTFRJX0NBUkQKLSMgU3VwcG9ydCBmb3IgTXVsdGlwbGUgQ2FyZHMKLUhBU19NQ19TVVBQT1JUPW4KLSNlbmRpZiAvLyBNVUxUSV9DQVJEIC8vCi0KLSNTdXBwb3J0IGZvciBJRUVFODAyLjExZSBETFMKLUhBU19RT1NfRExTX1NVUFBPUlQ9bgotCi0jU3VwcG9ydCBmb3IgRVhUX0NIQU5ORUwKLUhBU19FWFRfQlVJTERfQ0hBTk5FTF9MSVNUPW4KLQotI1N1cHBvcnQgZm9yIE5ldC1TTk1QCi1IQVNfU05NUF9TVVBQT1JUPW4KLQotI1N1cHBvcnQgZmVhdHVyZXMgb2YgU2luZ2xlIFNLVS4KLUhBU19TSU5HTEVfU0tVX1NVUFBPUlQ9bgotCi0jU3VwcG9ydCBmZWF0dXJlcyBvZiA4MDIuMTFuCi1IQVNfRE9UMTFfTl9TVVBQT1JUPXkKLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUNDIDo9ICQoQ1JPU1NfQ09NUElMRSlnY2MKLUxEIDo9ICQoQ1JPU1NfQ09NUElMRSlsZAotCi1XRkxBR1MgOj0gLURBR0dSRUdBVElPTl9TVVBQT1JUIC1EUElHR1lCQUNLX1NVUFBPUlQgLURXTU1fU1VQUE9SVCAgLURMSU5VWCAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jIGNvbmZpZyBmb3IgU1RBIG1vZGUKLQotaWZlcSAoJChSVDI4eHhfTU9ERSksU1RBKQotV0ZMQUdTICs9IC1EQ09ORklHX1NUQV9TVVBQT1JUIC1EREJHCi0KLWlmZXEgKCQoSEFTX1dQQV9TVVBQTElDQU5UKSx5KQotV0ZMQUdTICs9IC1EV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotZW5kaWYKLQotaWZlcSAoJChIQVNfTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQpLHkpCi1XRkxBR1MgKz0gLUROQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotZW5kaWYKLQotaWZlcSAoJChIQVNfQVRFKSx5KQotV0ZMQUdTICs9IC1EUkFMSU5LX0FURQotaWZlcSAoJChIQVNfMjh4eF9RQSkseSkKLVdGTEFHUyArPSAtRFJBTElOS18yOHh4X1FBCi1lbmRpZgotZW5kaWYKLQotaWZlcSAoJChIQVNfU05NUF9TVVBQT1JUKSx5KQotV0ZMQUdTICs9IC1EU05NUF9TVVBQT1JUCi1lbmRpZgotCi1pZmVxICgkKEhBU19RT1NfRExTX1NVUFBPUlQpLHkpCi1XRkxBR1MgKz0gLURRT1NfRExTX1NVUFBPUlQKLWVuZGlmCi0KLWlmZXEgKCQoSEFTX0RPVDExX05fU1VQUE9SVCkseSkKLVdGTEFHUyArPSAtRERPVDExX05fU1VQUE9SVAotZW5kaWYKLQotaWZlcSAoJChIQVNfQ1NfU1VQUE9SVCkseSkKLVdGTEFHUyArPSAtRENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKLWVuZGlmCi0KLWlmZXEgKCQoSEFTX1NJTkdMRV9TS1VfU1VQUE9SVCkseSkKLVdGTEFHUyArPSAtRFNJTkdMRV9TS1UKLWVuZGlmCi0KLWVuZGlmCi0jIGVuZGlmIG9mIGlmZXEgKCQoUlQyOHh4X01PREUpLFNUQSkKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgQ29tbW9uIGNvbXBpbGVyIGZsYWcKLSMKLQotCi1pZmVxICgkKEhBU19FWFRfQlVJTERfQ0hBTk5FTF9MSVNUKSx5KQotV0ZMQUdTICs9IC1ERVhUX0JVSUxEX0NIQU5ORUxfTElTVAotZW5kaWYKLQotaWZlcSAoJChDSElQU0VUKSwyODcwKQotV0ZMQUdTICs9LURSVDI4NzAKLWVuZGlmCi0KLWlmZXEgKCQoUExBVEZPUk0pLDVWVCkKLSNXRkxBR1MgKz0gLURDT05GSUdfNVZUX0VOSEFOQ0UKLWVuZGlmCi0KLWlmZXEgKCQoSEFTX0JMT0NLX05FVF9JRikseSkKLVdGTEFHUyArPSAtREJMT0NLX05FVF9JRgotZW5kaWYKLQotaWZlcSAoJChIQVNfREZTX1NVUFBPUlQpLHkpCi1XRkxBR1MgKz0gLURERlNfU1VQUE9SVAotZW5kaWYKLQotI2lmZGVmIE1VTFRJX0NBUkQKLWlmZXEgKCQoSEFTX01DX1NVUFBPUlQpLHkpCi1XRkxBR1MgKz0gLURNVUxUSVBMRV9DQVJEX1NVUFBPUlQKLWVuZGlmCi0jZW5kaWYgLy8gTVVMVElfQ0FSRCAvLwotCi1pZmVxICgkKEhBU19MTFREKSx5KQotV0ZMQUdTICs9IC1ETExURF9TVVBQT1JUCi1lbmRpZgotCi1pZmVxICgkKFBMQVRGT1JNKSxJWFApCi1XRkxBR1MgKz0gLURSVF9CSUdfRU5ESUFOCi1lbmRpZgotCi1pZmVxICgkKFBMQVRGT1JNKSxJS0FOT1NfVjE2MCkKLVdGTEFHUyArPSAtRFJUX0JJR19FTkRJQU4gLURJS0FOT1NfVlhfMVgwCi1lbmRpZgotCi1pZmVxICgkKFBMQVRGT1JNKSxJS0FOT1NfVjE4MCkKLVdGTEFHUyArPSAtRFJUX0JJR19FTkRJQU4gLURJS0FOT1NfVlhfMVgwCi1lbmRpZgotCi1pZmVxICgkKFBMQVRGT1JNKSxJTkZfVFdJTlBBU1MpCi1XRkxBR1MgKz0gLURSVF9CSUdfRU5ESUFOIC1ESU5GX1RXSU5QQVNTCi1lbmRpZgotCi1pZmVxICgkKFBMQVRGT1JNKSxJTkZfREFOVUJFKQotV0ZMQUdTICs9IC1ESU5GX0RBTlVCRSAtRFJUX0JJR19FTkRJQU4KLWVuZGlmCi0KLWlmZXEgKCQoUExBVEZPUk0pLENBVk1fT0NURU9OKQotV0ZMQUdTICs9IC1EUlRfQklHX0VORElBTgotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksQlJDTV82MzU4KQotV0ZMQUdTICs9IC1EUlRfQklHX0VORElBTgotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksSU5GX0FNQVpPTl9TRSkKLSNXRkxBR1MgKz0gLURSVF9CSUdfRU5ESUFOIC1ESU5GX0FNQVpPTl9TRSAtREJHX0ZUX1NVUFBPUlQKLVdGTEFHUyArPSAtRFJUX0JJR19FTkRJQU4gLURJTkZfQU1BWk9OX1NFCi1lbmRpZgotCi0ja2VybmVsIGJ1aWxkIG9wdGlvbnMgZm9yIDIuNAotIyBtb3ZlIHRvIE1ha2VmaWxlIG91dHNpZGUgTElOVVhfU1JDIDo9IC9vcHQvc3Rhci9rZXJuZWwvbGludXgtMi40LjI3LXN0YXIKLQotaWZlcSAoJChQTEFURk9STSksU1RBUikKLUNGTEFHUyA6PSAtRF9fS0VSTkVMX18gLUkkKExJTlVYX1NSQykvaW5jbHVkZSAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzIC1PMiAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAtVWFybSAtZm5vLWNvbW1vbiAtcGlwZSAtbWFwY3MtMzIgLURfX0xJTlVYX0FSTV9BUkNIX189NCAtbWFyY2g9YXJtdjQgIC1tc2hvcnQtbG9hZC1ieXRlcyAtbXNvZnQtZmxvYXQgLVVhcm0gLURNT0RVTEUgLURNT0RWRVJTSU9OUyAtaW5jbHVkZSAkKExJTlVYX1NSQykvaW5jbHVkZS9saW51eC9tb2R2ZXJzaW9ucy5oICQoV0ZMQUdTKQotCi1leHBvcnQgQ0ZMQUdTCi1lbmRpZgotCi1pZmVxICgkKFBMQVRGT1JNKSxTSUdNQSkKLUNGTEFHUyA6PSAtRF9fS0VSTkVMX18gLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgLUkkKExJTlVYX1NSQykvaW5jbHVkZSAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS9nY2MgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXRhbmdvMiAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS1taXBzL21hY2gtdGFuZ28yIC1ERU04NlhYX0NISVA9RU04NlhYX0NISVBJRF9UQU5HTzIgLURFTTg2WFhfUkVWSVNJT049NiAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYyAtSSQoUlQyODYwX0RJUikvaW5jbHVkZSAtV2FsbCAtV3VuZGVmIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby10cmlncmFwaHMgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gLWZmcmVlc3RhbmRpbmcgLU8yICAgICAtZm9taXQtZnJhbWUtcG9pbnRlciAtRyAwIC1tbm8tYWJpY2FsbHMgLWZuby1waWMgLXBpcGUgIC1tYWJpPTMyIC1tYXJjaD1taXBzMzJyMiAtV2EsLTMyIC1XYSwtbWFyY2g9bWlwczMycjIgLVdhLC1taXBzMzJyMiAtV2EsLS10cmFwIC1ETU9EVUxFICQoV0ZMQUdTKQotCi1leHBvcnQgQ0ZMQUdTCi1lbmRpZgotCi1pZmVxICgkKFBMQVRGT1JNKSxTSUdNQV84NjIyKQotQ0ZMQUdTIDo9IC1EX19LRVJORUxfXyAtSSQoQ1JPU1NfQ09NUElMRV9JTkNMVURFKS9pbmNsdWRlIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUgLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXRyaWdyYXBocyAtTzIgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gLWZuby1jb21tb24gLXBpcGUgLWZuby1idWlsdGluIC1EX19saW51eF9fIC1ETk9fTU0gLW1hcGNzLTMyIC1tYXJjaD1hcm12NCAtbXR1bmU9YXJtN3RkbWkgLW1zb2Z0LWZsb2F0IC1ETU9EVUxFIC1tc2hvcnQtbG9hZC1ieXRlcyAtbm9zdGRpbmMgLWl3aXRocHJlZml4IC1ETU9EVUxFICQoV0ZMQUdTKQotZXhwb3J0IENGTEFHUwotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksNVZUKQotQ0ZMQUdTIDo9IC1EX19LRVJORUxfXyAtSSQoTElOVVhfU1JDKS9pbmNsdWRlIC1JJChSVDI4eHhfRElSKS9pbmNsdWRlIC1tbGl0dGxlLWVuZGlhbiAtV2FsbCAtV3VuZGVmIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby10cmlncmFwaHMgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gLU8zIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtbWFwY3MgLW1uby1zY2hlZC1wcm9sb2cgLW1hYmk9YXBjcy1nbnUgLW1uby10aHVtYi1pbnRlcndvcmsgLURfX0xJTlVYX0FSTV9BUkNIX189NSAtbWFyY2g9YXJtdjV0ZSAtbXR1bmU9YXJtOTI2ZWotcyAtLXBhcmFtIG1heC1pbmxpbmUtaW5zbnMtc2luZ2xlPTQwMDAwICAtVWFybSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAtV25vLXBvaW50ZXItc2lnbiAtRE1PRFVMRSAkKFdGTEFHUykKLQotZXhwb3J0IENGTEFHUwotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksSUtBTk9TX1YxNjApCi1DRkxBR1MgOj0gLURfX0tFUk5FTF9fIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20vZ2NjIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC10YW5nbzIgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXRhbmdvMiAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYyAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSAtV2FsbCAtV3VuZGVmIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby10cmlncmFwaHMgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gLWZmcmVlc3RhbmRpbmcgLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIC1HIDAgLW1uby1hYmljYWxscyAtZm5vLXBpYyAtcGlwZSAtbWFyY2g9bHg0MTg5IC1XYSwgLURNT0RVTEUgJChXRkxBR1MpCi1leHBvcnQgQ0ZMQUdTCi1lbmRpZgotCi1pZmVxICgkKFBMQVRGT1JNKSxJS0FOT1NfVjE4MCkKLUNGTEFHUyA6PSAtRF9fS0VSTkVMX18gLUkkKExJTlVYX1NSQykvaW5jbHVkZSAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS9nY2MgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXRhbmdvMiAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS1taXBzL21hY2gtdGFuZ28yIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1nZW5lcmljIC1JJChSVDI4eHhfRElSKS9pbmNsdWRlIC1XYWxsIC1XdW5kZWYgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXRyaWdyYXBocyAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAtZmZyZWVzdGFuZGluZyAtTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUcgMCAtbW5vLWFiaWNhbGxzIC1mbm8tcGljIC1waXBlIC1taXBzMzJyMiAtV2EsIC1ETU9EVUxFICQoV0ZMQUdTKQotZXhwb3J0IENGTEFHUwotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksSU5GX1RXSU5QQVNTKQotQ0ZMQUdTIDo9IC1EX19LRVJORUxfXyAtRE1PRFVMRSAtSSQoTElOVVhfU1JDKS9pbmNsdWRlIC1JJChSVDI4eHhfRElSKS9pbmNsdWRlIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby10cmlncmFwaHMgLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uIC1HIDAgLW1uby1hYmljYWxscyAtZm5vLXBpYyAtbWFyY2g9NGtjIC1taXBzMzIgLVdhLC0tdHJhcCAtcGlwZSAtbWxvbmctY2FsbHMgJChXRkxBR1MpCi1leHBvcnQgQ0ZMQUdTCi1lbmRpZgotCi1pZmVxICgkKFBMQVRGT1JNKSxJTkZfREFOVUJFKQotQ0ZMQUdTIDo9IC1JJChSVDI4eHhfRElSKS9pbmNsdWRlICQoV0ZMQUdTKSAtV3VuZGVmIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uIC1mZnJlZXN0YW5kaW5nIC1PcyAtZm9taXQtZnJhbWUtcG9pbnRlciAtRyAwIC1tbm8tYWJpY2FsbHMgLWZuby1waWMgLXBpcGUgLW1zb2Z0LWZsb2F0ICAtbWFiaT0zMiAtbWFyY2g9bWlwczMyIC1XYSwtMzIgLVdhLC1tYXJjaD1taXBzMzIgLVdhLC1taXBzMzIgLVdhLC0tdHJhcCAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYwotZXhwb3J0IENGTEFHUwotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksQlJDTV82MzU4KQotQ0ZMQUdTIDo9ICQoV0ZMQUdTKSAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSAtbm9zdGRpbmMgLWl3aXRocHJlZml4IGluY2x1ZGUgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby10cmlncmFwaHMgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gLUkgJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtL2djYyAtRyAwIC1tbm8tYWJpY2FsbHMgLWZuby1waWMgLXBpcGUgIC1maW5saW5lLWxpbWl0PTEwMDAwMCAtbWFiaT0zMiAtbWFyY2g9bWlwczMyIC1XYSwtMzIgLVdhLC1tYXJjaD1taXBzMzIgLVdhLC1taXBzMzIgLVdhLC0tdHJhcCAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS1taXBzL21hY2gtYmNtOTYzeHggLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWdlbmVyaWMgIC1PcyAtZm9taXQtZnJhbWUtcG9pbnRlciAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLURNT0RVTEUgLW1sb25nLWNhbGxzCi1leHBvcnQgQ0ZMQUdTCi1lbmRpZgotCi1pZmVxICgkKFBMQVRGT1JNKSxQQykKLSAgICBpZm5lcSAoLCQoZmluZHN0cmluZyAyLjQsJChMSU5VWF9TUkMpKSkKLQkjIExpbnV4IDIuNAotCUNGTEFHUyA6PSAtRF9fS0VSTkVMX18gLUkkKExJTlVYX1NSQykvaW5jbHVkZSAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSAtTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gLXBpcGUgLW1wcmVmZXJyZWQtc3RhY2stYm91bmRhcnk9MiAtbWFyY2g9aTY4NiAtRE1PRFVMRSAtRE1PRFZFUlNJT05TIC1pbmNsdWRlICQoTElOVVhfU1JDKS9pbmNsdWRlL2xpbnV4L21vZHZlcnNpb25zLmggJChXRkxBR1MpCi0JZXhwb3J0IENGTEFHUwotICAgIGVsc2UKLQkjIExpbnV4IDIuNgotCUVYVFJBX0NGTEFHUyA6PSAkKFdGTEFHUykgLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUKLSAgICBlbmRpZgotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksSVhQKQotICAgICAgICBFWFRSQV9DRkxBR1MgOj0gLXYgJChXRkxBR1MpIC1JJChSVDI4eHhfRElSKS9pbmNsdWRlIC1tYmlnLWVuZGlhbgotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksQ0FWTV9PQ1RFT04pCi0JRVhUUkFfQ0ZMQUdTIDo9ICQoV0ZMQUdTKSAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSBcCi0JCQkJICAgIC1tYWJpPTY0ICQoV0ZMQUdTKQotZXhwb3J0IENGTEFHUwotZW5kaWYKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jcnlwdF9obWFjLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NyeXB0X2htYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTU2NTE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jcnlwdF9obWFjLmgKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBNb2R1bGUgTmFtZToKKyAgICBITUFDCisKKyAgICBBYnN0cmFjdDoKKyAgICBGSVBTIDE5ODogVGhlIEtleWVkLUhhc2ggTWVzc2FnZSBBdXRoZW50aWNhdGlvbiBDb2RlIChITUFDKQorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFZGR5ICAgICAgICAyMDA4LzExLzI0ICAgICAgQ3JlYXRlIEhNQUMtU0hBMSwgSE1BQy1TSEEyNTYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX19DUllQVF9ITUFDX0hfXworI2RlZmluZSBfX0NSWVBUX0hNQUNfSF9fCisKKyNpZmRlZiBDUllQVF9URVNUUExBTgorI2luY2x1ZGUgImNyeXB0X3Rlc3RwbGFuLmgiCisjZWxzZQorI2luY2x1ZGUgInJ0X2NvbmZpZy5oIgorI2VuZGlmIC8qIENSWVBUX1RFU1RQTEFOICovCisKKyNpZmRlZiBTSEExX1NVUFBPUlQKKyNkZWZpbmUgSE1BQ19TSEExX1NVUFBPUlQKK3ZvaWQgSE1BQ19TSEExKElOIGNvbnN0IHU4IEtleVtdLAorCSAgICAgICB1MzIgS2V5TGVuLAorCSAgICAgICBJTiBjb25zdCB1OCBNZXNzYWdlW10sCisJICAgICAgIHUzMiBNZXNzYWdlTGVuLCB1OCBNQUNbXSwgdTMyIE1BQ0xlbik7CisjZW5kaWYgLyogU0hBMV9TVVBQT1JUICovCisKKyNpZmRlZiBNRDVfU1VQUE9SVAorI2RlZmluZSBITUFDX01ENV9TVVBQT1JUCit2b2lkIEhNQUNfTUQ1KElOIGNvbnN0IHU4IEtleVtdLAorCSAgICAgIHUzMiBLZXlMZW4sCisJICAgICAgSU4gY29uc3QgdTggTWVzc2FnZVtdLAorCSAgICAgIHUzMiBNZXNzYWdlTGVuLCB1OCBNQUNbXSwgdTMyIE1BQ0xlbik7CisjZW5kaWYgLyogTUQ1X1NVUFBPUlQgKi8KKworI2VuZGlmIC8qIF9fQ1JZUFRfSE1BQ19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY3J5cHRfbWQ1LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NyeXB0X21kNS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2Zjk3NDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NyeXB0X21kNS5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgTW9kdWxlIE5hbWU6CisgICAgTUQ1CisKKyAgICBBYnN0cmFjdDoKKyAgICBSRkMxMzIxOiBUaGUgTUQ1IE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobQorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFZGR5ICAgICAgICAyMDA4LzExLzI0ICAgICAgQ3JlYXRlIG1kNQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fQ1JZUFRfTUQ1X0hfXworI2RlZmluZSBfX0NSWVBUX01ENV9IX18KKworI2lmZGVmIENSWVBUX1RFU1RQTEFOCisjaW5jbHVkZSAiY3J5cHRfdGVzdHBsYW4uaCIKKyNlbHNlCisjaW5jbHVkZSAicnRfY29uZmlnLmgiCisjZW5kaWYgLyogQ1JZUFRfVEVTVFBMQU4gKi8KKworLyogQWxnb3JpdGhtIG9wdGlvbnMgKi8KKyNkZWZpbmUgTUQ1X1NVUFBPUlQKKworI2lmZGVmIE1ENV9TVVBQT1JUCisjZGVmaW5lIE1ENV9CTE9DS19TSVpFICAgIDY0CS8qIDUxMiBiaXRzID0gNjQgYnl0ZXMgKi8KKyNkZWZpbmUgTUQ1X0RJR0VTVF9TSVpFICAgMTYJLyogMTI4IGJpdHMgPSAxNiBieXRlcyAqLworCitzdHJ1Y3QgcnRfbWQ1X2N0eF9zdHJ1YyB7CisJdTMyIEhhc2hWYWx1ZVs0XTsKKwl1NjQgTWVzc2FnZUxlbjsKKwl1OCBCbG9ja1tNRDVfQkxPQ0tfU0laRV07CisJdTMyIEJsb2NrTGVuOworfTsKKwordm9pZCBNRDVfSW5pdChzdHJ1Y3QgcnRfbWQ1X2N0eF9zdHJ1YyAqcE1ENV9DVFgpOwordm9pZCBNRDVfSGFzaChzdHJ1Y3QgcnRfbWQ1X2N0eF9zdHJ1YyAqcE1ENV9DVFgpOwordm9pZCBNRDVfQXBwZW5kKHN0cnVjdCBydF9tZDVfY3R4X3N0cnVjICpwTUQ1X0NUWCwKKwkJSU4gY29uc3QgdTggTWVzc2FnZVtdLCB1MzIgTWVzc2FnZUxlbik7Cit2b2lkIE1ENV9FbmQoc3RydWN0IHJ0X21kNV9jdHhfc3RydWMgKnBNRDVfQ1RYLCB1OCBEaWdlc3RNZXNzYWdlW10pOwordm9pZCBSVF9NRDUoSU4gY29uc3QgdTggTWVzc2FnZVtdLAorCSAgICB1MzIgTWVzc2FnZUxlbiwgdTggRGlnZXN0TWVzc2FnZVtdKTsKKyNlbmRpZiAvKiBNRDVfU1VQUE9SVCAqLworCisjZW5kaWYgLyogX19DUllQVF9NRDVfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NyeXB0X3NoYTIuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY3J5cHRfc2hhMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZDExYWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NyeXB0X3NoYTIuaApAQCAtMCwwICsxLDczIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIE1vZHVsZSBOYW1lOgorICAgIFNIQTIKKworICAgIEFic3RyYWN0OgorICAgIEZJUFMgMTgwLTI6IFNlY3VyZSBIYXNoIFN0YW5kYXJkIChTSFMpCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEVkZHkgICAgICAgIDIwMDgvMTEvMjQgICAgICBDcmVhdGUgU0hBMQorICAgIEVkZHkgICAgICAgIDIwMDgvMDcvMjMgICAgICBDcmVhdGUgU0hBMjU2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19DUllQVF9TSEEyX0hfXworI2RlZmluZSBfX0NSWVBUX1NIQTJfSF9fCisKKyNpZmRlZiBDUllQVF9URVNUUExBTgorI2luY2x1ZGUgImNyeXB0X3Rlc3RwbGFuLmgiCisjZWxzZQorI2luY2x1ZGUgInJ0X2NvbmZpZy5oIgorI2VuZGlmIC8qIENSWVBUX1RFU1RQTEFOICovCisKKy8qIEFsZ29yaXRobSBvcHRpb25zICovCisjZGVmaW5lIFNIQTFfU1VQUE9SVAorCisjaWZkZWYgU0hBMV9TVVBQT1JUCisjZGVmaW5lIFNIQTFfQkxPQ0tfU0laRSAgICA2NAkvKiA1MTIgYml0cyA9IDY0IGJ5dGVzICovCisjZGVmaW5lIFNIQTFfRElHRVNUX1NJWkUgICAyMAkvKiAxNjAgYml0cyA9IDIwIGJ5dGVzICovCitzdHJ1Y3QgcnRfc2hhMV9jdHggeworCXUzMiBIYXNoVmFsdWVbNV07CS8qIDUgPSAoU0hBMV9ESUdFU1RfU0laRSAvIDMyKSAqLworCXU2NCBNZXNzYWdlTGVuOwkvKiB0b3RhbCBzaXplICovCisJdTggQmxvY2tbU0hBMV9CTE9DS19TSVpFXTsKKwl1MzIgQmxvY2tMZW47Cit9OworCit2b2lkIFJUX1NIQTFfSW5pdChzdHJ1Y3QgcnRfc2hhMV9jdHggKnBTSEFfQ1RYKTsKK3ZvaWQgU0hBMV9IYXNoKHN0cnVjdCBydF9zaGExX2N0eCAqcFNIQV9DVFgpOwordm9pZCBTSEExX0FwcGVuZChzdHJ1Y3QgcnRfc2hhMV9jdHggKnBTSEFfQ1RYLAorCQkgSU4gY29uc3QgdTggTWVzc2FnZVtdLCB1MzIgTWVzc2FnZUxlbik7Cit2b2lkIFNIQTFfRW5kKHN0cnVjdCBydF9zaGExX2N0eCAqcFNIQV9DVFgsIHU4IERpZ2VzdE1lc3NhZ2VbXSk7Cit2b2lkIFJUX1NIQTEoSU4gY29uc3QgdTggTWVzc2FnZVtdLAorCSAgICAgdTMyIE1lc3NhZ2VMZW4sIHU4IERpZ2VzdE1lc3NhZ2VbXSk7CisjZW5kaWYgLyogU0hBMV9TVVBQT1JUICovCisKKyNlbmRpZiAvKiBfX0NSWVBUX1NIQTJfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2Rmcy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9kZnMuaAppbmRleCBmMzRmNjE4Li41ZmJhYjI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2Rmcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvZGZzLmgKQEAgLTM2LDUzICszNiw0IEBACiAgICAgRm9uY2hpICAgIDAzLTEyLTIwMDcgICAgICBjcmVhdGVkCiAqLwogCi0jZGVmaW5lIFJBREFSX1BVTFNFIDEKLSNkZWZpbmUgUkFEQVJfV0lEVEggMgotCi0jZGVmaW5lIFdJRFRIX1JEX0lETEUgMAotI2RlZmluZSBXSURUSF9SRF9DSEVDSyAxCi0KLQotVk9JRCBCYnBSYWRhckRldGVjdGlvblN0YXJ0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBCYnBSYWRhckRldGVjdGlvblN0b3AoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIFJhZGFyRGV0ZWN0aW9uU3RhcnQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gQk9PTEVBTiBDVFNfUHJvdGVjdCwKLQlJTiBVSU5UOCBDVFNQZXJpb2QpOwotCi1WT0lEIFJhZGFyRGV0ZWN0aW9uU3RvcCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgUmFkYXJEZXRlY3RQZXJpb2RpYygKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLQotQk9PTEVBTiBSYWRhckNoYW5uZWxDaGVjaygKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVQ0hBUgkJCUNoKTsKLQotVUxPTkcgSmFwUmFkYXJUeXBlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVUxPTkcgUlRNUEJicFJlYWRSYWRhckR1cmF0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotVUxPTkcgUlRNUFJlYWRSYWRhckR1cmF0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotVk9JRCBSVE1QQ2xlYW5SYWRhckR1cmF0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotSU5UIFNldF9DaE1vdmluZ1RpbWVfUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgYXJnKTsKLQotSU5UIFNldF9Mb25nUHVsc2VSYWRhclRoX1Byb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIGFyZyk7Ci0KLQorQk9PTEVBTiBSYWRhckNoYW5uZWxDaGVjayhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IENoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvZWVwcm9tLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2VlcHJvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOTgwMWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2VlcHJvbS5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJZWVwcm9tLmgKKworCUFic3RyYWN0OgorCU1pbmlwb3J0IGhlYWRlciBmaWxlIGZvciBlZXByb20gcmVsYXRlZCBpbmZvcm1hdGlvbgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKwktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisjaWZuZGVmIF9fRUVQUk9NX0hfXworI2RlZmluZSBfX0VFUFJPTV9IX18KKworI2lmZGVmIFJUTVBfUENJX1NVUFBPUlQKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoJUHVibGljIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBmb3IgcHJvbS1iYXNlZCBjaGlwc2V0CisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBydG1wX2VlX3Byb21fcmVhZDE2KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCXUxNiBPZmZzZXQsIHUxNiAqIHBWYWx1ZSk7CisjZW5kaWYgLyogUlRNUF9QQ0lfU1VQUE9SVCAvLyAqLworI2lmZGVmIFJUTVBfVVNCX1NVUFBPUlQKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoJUHVibGljIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBmb3IgdXNiLWJhc2VkIHByb20gY2hpcHNldAorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUlRVU0JSZWFkRUVQUk9NMTYoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdTE2IG9mZnNldCwgdTE2ICpwRGF0YSk7CisjZW5kaWYgLyogUlRNUF9VU0JfU1VQUE9SVCAvLyAqLworCisjaWZkZWYgUlQzMHh4CisjaWZkZWYgUlRNUF9FRlVTRV9TVVBQT1JUCitpbnQgcnRtcF9lZV9lZnVzZV9yZWFkMTYoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHUxNiBPZmZzZXQsIHUxNiAqIHBWYWx1ZSk7CisjZW5kaWYgLyogUlRNUF9FRlVTRV9TVVBQT1JUIC8vICovCisjZW5kaWYgLyogUlQzMHh4IC8vICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoJUHVibGljIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBmb3IgcHJvbSBvcGVyYXRpb24gY2FsbGJhY2sgZnVuY3Rpb25zIHNldHRpbmcKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFJ0bXBDaGlwT3BzRWVwcm9tSG9vayhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIGludCBpbmZUeXBlKTsKKworI2VuZGlmIC8qIF9fRUVQUk9NX0hfXyAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9pZmFjZS9ydG1wX3BjaS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9pZmFjZS9ydG1wX3BjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NTlkNTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2lmYWNlL3J0bXBfcGNpLmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIF9fUlRNUF9QQ0lfSF9fCisjZGVmaW5lIF9fUlRNUF9QQ0lfSF9fCisKKyNkZWZpbmUgUlQyOFhYX0hBTkRMRV9ERVZfQVNTSUdOKGhhbmRsZSwgZGV2X3ApCQkJCVwKKwkoKHN0cnVjdCBvc19jb29raWUgKiloYW5kbGUpLT5wY2lfZGV2ID0gZGV2X3A7CisKKyNpZmRlZiBMSU5VWAorLy8gc2V0IGRyaXZlciBkYXRhCisjZGVmaW5lIFJUMjhYWF9EUlZEQVRBX1NFVChfYSkJCQlwY2lfc2V0X2RydmRhdGEoX2EsIG5ldF9kZXYpOworCisjZGVmaW5lIFJUMjhYWF9QVVRfREVWSUNFKGRldl9wKQorCisjZGVmaW5lIFNBX1NISVJRIElSUUZfU0hBUkVECisKKyNpZmRlZiBQQ0lfTVNJX1NVUFBPUlQKKyNkZWZpbmUgUlRNUF9NU0lfRU5BQkxFKF9wQWQpIFwKKwl7ICAgICBzdHJ1Y3Qgb3NfY29va2llICpfcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopKF9wQWQtPk9TX0Nvb2tpZSk7IFwKKwkJKF9wQWQpLT5IYXZlTXNpID0gcGNpX2VuYWJsZV9tc2koX3BPYmotPnBjaV9kZXYpID09IDAgPyBUUlVFIDogRkFMU0U7IFwKKwl9CisKKyNkZWZpbmUgUlRNUF9NU0lfRElTQUJMRShfcEFkKSBcCisJeyAgICAgc3RydWN0IG9zX2Nvb2tpZSAqX3BPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKShfcEFkLT5PU19Db29raWUpOyBcCisJCWlmIChfcEFkLT5IYXZlTXNpID09IFRSVUUpIFwKKwkJCXBjaV9kaXNhYmxlX21zaShfcE9iai0+cGNpX2Rldik7IFwKKwkJX3BBZC0+SGF2ZU1zaSA9IEZBTFNFOyAgXAorCX0KKyNlbHNlCisjZGVmaW5lIFJUTVBfTVNJX0VOQUJMRShfcEFkKQkJZG97fXdoaWxlKDApCisjZGVmaW5lIFJUTVBfTVNJX0RJU0FCTEUoX3BBZCkJCWRve313aGlsZSgwKQorI2VuZGlmIC8vIFBDSV9NU0lfU1VQUE9SVCAvLworCisjZGVmaW5lIFJUTVBfUENJX0RFVl9VTk1BUCgpCQkJCQkJCQkJCVwKK3sJaWYgKG5ldF9kZXYtPmJhc2VfYWRkcikJewkJCQkJCQkJXAorCQlpb3VubWFwKCh2b2lkICopKG5ldF9kZXYtPmJhc2VfYWRkcikpOwkJCQlcCisJCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2X3AsIDApLAlcCisJCQkJCQkJcGNpX3Jlc291cmNlX2xlbihkZXZfcCwgMCkpOyB9CVwKKwlpZiAobmV0X2Rldi0+aXJxKSBwY2lfcmVsZWFzZV9yZWdpb25zKGRldl9wKTsgfQorCisjZGVmaW5lIFBDSV9SRUdfUkVBRF9XT1JEKHBjaV9kZXYsIG9mZnNldCwgQ29uZmlndXJhdGlvbikgICBcCisgICAgaWYgKHBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaV9kZXYsIG9mZnNldCwgJnJlZzE2KSA9PSAwKSAgICAgXAorICAgICAgICBDb25maWd1cmF0aW9uID0gbGUyY3B1MTYocmVnMTYpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENvbmZpZ3VyYXRpb24gPSAwOworCisjZGVmaW5lIFBDSV9SRUdfV0lSVEVfV09SRChwY2lfZGV2LCBvZmZzZXQsIENvbmZpZ3VyYXRpb24pICBcCisgICAgcmVnMTYgPSBjcHUybGUxNihDb25maWd1cmF0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaV9kZXYsIG9mZnNldCwgcmVnMTYpOworCisjZW5kaWYgLy8gTElOVVggLy8KKworI2VuZGlmIC8vIF9fUlRNUF9QQ0lfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2lmYWNlL3J0bXBfdXNiLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2lmYWNlL3J0bXBfdXNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJiMzg0YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvaWZhY2UvcnRtcF91c2IuaApAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIF9fUlRNUF9VU0JfSF9fCisjZGVmaW5lIF9fUlRNUF9VU0JfSF9fCisKKyNpbmNsdWRlICIuLi9ydHVzYl9pby5oIgorCisjaWZkZWYgTElOVVgKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNlbmRpZiAvLyBMSU5VWCAvLworCitleHRlcm4gdTggRXBUb1F1ZXVlWzZdOworCisjZGVmaW5lIFJYQlVMS0FHR1JFX1pJU0UJCQkxMgorI2RlZmluZSBNQVhfVFhCVUxLX0xJTUlUCQkJKExPQ0FMX1RYQlVGX1NJWkUqKEJVTEtBR0dSRV9aSVNFLTEpKQorI2RlZmluZSBNQVhfVFhCVUxLX1NJWkUJCQkoTE9DQUxfVFhCVUZfU0laRSpCVUxLQUdHUkVfWklTRSkKKyNkZWZpbmUgTUFYX1JYQlVMS19TSVpFCQkJKExPQ0FMX1RYQlVGX1NJWkUqUlhCVUxLQUdHUkVfWklTRSkKKyNkZWZpbmUgTUFYX01MTUVfSEFORExFUl9NRU1PUlkgMjAKKworLy8gRmxhZ3MgZm9yIEJ1bGtmbGFncyBjb250cm9sIGZvciBidWxrIG91dCBkYXRhCisvLworI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9OVUxMCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX1JUUwkJCQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX01MTUUJCQkJCQkweDAwMDAwMDA0CisKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX1BTUE9MTAkJCQkJMHgwMDAwMDAxMAorI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHCQkJCTB4MDAwMDAwMjAKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBR18yCQkJCTB4MDAwMDAwNDAKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBR18zCQkJCTB4MDAwMDAwODAKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBR180CQkJCTB4MDAwMDAxMDAKKworI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwJCQkJMHgwMDAxMDAwMAorI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfMgkJCTB4MDAwMjAwMDAKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMXzMJCQkweDAwMDQwMDAwCisjZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTF80CQkJMHgwMDA4MDAwMAorCisvLyBUT0RPOm1vdmUgdG8gLi9hdGUvaW5jbHVkZS9pZmFjZS9hdGVfdXNiLmgKKworI2RlZmluZSBGUkVFX0hUVFhfUklORyhfcENvb2tpZSwgX3BpcGVJZCwgX3R4Q29udGV4dCkJCQlcCit7CQkJCQkJCQkJCVwKKwlpZiAoKF90eENvbnRleHQpLT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PSAoX3R4Q29udGV4dCktPkN1cldyaXRlUG9zaXRpb24pCVwKKwl7CQkJCQkJCQkJCQkJCQkJCQlcCisJCShfdHhDb250ZXh0KS0+YlJpbmdFbXB0eSA9IFRSVUU7CQkJXAorCX0JCQkJCQkJCQkJCQkJCQkJCVwKKwkvKk5kaXNJbnRlcmxvY2tlZERlY3JlbWVudCgmKF9wKS0+VHhDb3VudCk7ICovXAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlVU0IgQnVsayBvcGVyYXRpb24gcmVsYXRlZCBkZWZpbml0aW9ucworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBMSU5VWAorI2RlZmluZSBCVUxLQUdHUkVfWklTRSAgICAgICAgICAxMDAKKyNkZWZpbmUgUlQyOFhYX1BVVF9ERVZJQ0UJCQkJCQkJdXNiX3B1dF9kZXYKKyNkZWZpbmUgUlRVU0JfQUxMT0NfVVJCKGlzbykJCQkJCQkJdXNiX2FsbG9jX3VyYihpc28sIEdGUF9BVE9NSUMpCisjZGVmaW5lIFJUVVNCX1NVQk1JVF9VUkIocFVyYikJCQkJCQkJdXNiX3N1Ym1pdF91cmIocFVyYiwgR0ZQX0FUT01JQykKKyNkZWZpbmUgUlRVU0JfVVJCX0FMTE9DX0JVRkZFUihwVXNiX0RldiwgQnVmU2l6ZSwgcERtYV9hZGRyKQkJCXVzYl9idWZmZXJfYWxsb2MocFVzYl9EZXYsIEJ1ZlNpemUsIEdGUF9BVE9NSUMsIHBEbWFfYWRkcikKKyNkZWZpbmUgUlRVU0JfVVJCX0ZSRUVfQlVGRkVSKHBVc2JfRGV2LCBCdWZTaXplLCBwVHJhbnNmZXJCdWYsIERtYV9hZGRyKQl1c2JfYnVmZmVyX2ZyZWUocFVzYl9EZXYsIEJ1ZlNpemUsIHBUcmFuc2ZlckJ1ZiwgRG1hX2FkZHIpCisKKyNkZWZpbmUgUlRVU0JfRlJFRV9VUkIocFVyYikJdXNiX2ZyZWVfdXJiKHBVcmIpCisKKy8vIHVubGluayB1cmIKKyNkZWZpbmUgUlRVU0JfVU5MSU5LX1VSQihwVXJiKQkJdXNiX2tpbGxfdXJiKHBVcmIpCisKK2V4dGVybiB2b2lkIGR1bXBfdXJiKHN0cnVjdCB1cmIgKnB1cmIpOworCisjZGVmaW5lIEludGVybG9ja2VkSW5jcmVtZW50CQlhdG9taWNfaW5jCisjZGVmaW5lIE5kaXNJbnRlcmxvY2tlZEluY3JlbWVudAlhdG9taWNfaW5jCisjZGVmaW5lIEludGVybG9ja2VkRGVjcmVtZW50CQlhdG9taWNfZGVjCisjZGVmaW5lIE5kaXNJbnRlcmxvY2tlZERlY3JlbWVudAlhdG9taWNfZGVjCisjZGVmaW5lIEludGVybG9ja2VkRXhjaGFuZ2UJCWF0b21pY19zZXQKKworI2VuZGlmIC8vIExJTlVYIC8vCisKKyNkZWZpbmUgTlRfU1VDQ0VTUyhzdGF0dXMpCQkJKCgoc3RhdHVzKSA+PTApID8gKFRSVUUpOihGQUxTRSkpCisKKyNkZWZpbmUgVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VUCQkwCisjZGVmaW5lIFVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX0lOCQkwCisjZGVmaW5lIFVTQkRfU0hPUlRfVFJBTlNGRVJfT0sJCQkwCisjZGVmaW5lIFBVUkIJCQlzdHJ1Y3QgdXJiICoKKworI2RlZmluZSBQSVJQCQl2b2lkICoKKyNkZWZpbmUgTkRJU19PSUQJdTMyCisjaWZuZGVmIFVTQl9TVF9OT0VSUk9SCisjZGVmaW5lIFVTQl9TVF9OT0VSUk9SICAgICAwCisjZW5kaWYKKworLy8gdmVuZG9yLXNwZWNpZmljIGNvbnRyb2wgb3BlcmF0aW9ucworI2RlZmluZSBDT05UUk9MX1RJTUVPVVRfSklGRklFUyAoICgxMDAgKiBPU19IWikgLyAxMDAwKQorI2RlZmluZSBVTkxJTktfVElNRU9VVF9NUwkJMworCit2b2lkIFJUVVNCQnVsa091dERhdGFQYWNrZXRDb21wbGV0ZShzdHJ1Y3QgdXJiICpwdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncyk7Cit2b2lkIFJUVVNCQnVsa091dE1MTUVQYWNrZXRDb21wbGV0ZShzdHJ1Y3QgdXJiICpwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncyk7Cit2b2lkIFJUVVNCQnVsa091dE51bGxGcmFtZUNvbXBsZXRlKHN0cnVjdCB1cmIgKnBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKTsKK3ZvaWQgUlRVU0JCdWxrT3V0UlRTRnJhbWVDb21wbGV0ZShzdHJ1Y3QgdXJiICpwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncyk7Cit2b2lkIFJUVVNCQnVsa091dFBzUG9sbENvbXBsZXRlKHN0cnVjdCB1cmIgKnBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKTsKK3ZvaWQgUlRVU0JCdWxrUnhDb21wbGV0ZShzdHJ1Y3QgdXJiICpwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncyk7CisKKyNpZmRlZiBLVEhSRUFEX1NVUFBPUlQKKyNkZWZpbmUgUlRVU0JNbG1lVXAocEFkKSBcCisJZG97CQkJCQkJCQkgICAgXAorCQlzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpfcFRhc2sgPSAmKChwQWQpLT5tbG1lVGFzayk7XAorCQlpZiAoX3BUYXNrLT5rdGhyZWFkX3Rhc2spIFwKKyAgICAgICAgeyBcCisJCQlfcFRhc2stPmt0aHJlYWRfcnVubmluZyA9IFRSVUU7IFwKKwkgICAgICAgIHdha2VfdXAoJl9wVGFzay0+a3RocmVhZF9xKTsgXAorCQl9IFwKKwl9d2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIFJUVVNCTWxtZVVwKHBBZCkJICAgICAgICBcCisJZG97CQkJCQkJCQkgICAgXAorCQlzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpfcFRhc2sgPSAmKChwQWQpLT5tbG1lVGFzayk7XAorCQlDSEVDS19QSURfTEVHQUxJVFkoX3BUYXNrLT50YXNrUElEKQkJICAgIFwKKwkJeyBcCisJCQlSVE1QX1NFTV9FVkVOVF9VUCgmKF9wVGFzay0+dGFza1NlbWEpKTsgXAorCQl9XAorCX13aGlsZSgwKQorI2VuZGlmCisKKyNpZmRlZiBLVEhSRUFEX1NVUFBPUlQKKyNkZWZpbmUgUlRVU0JDTURVcChwQWQpIFwKKwlkb3sJXAorCQlzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpfcFRhc2sgPSAmKChwQWQpLT5jbWRRVGFzayk7CVwKKwkJeyBcCisJCQlfcFRhc2stPmt0aHJlYWRfcnVubmluZyA9IFRSVUU7IFwKKwkgICAgICAgIHdha2VfdXAoJl9wVGFzay0+a3RocmVhZF9xKTsgXAorCQl9IFwKKwl9d2hpbGUoMCkKKworI2Vsc2UKKyNkZWZpbmUgUlRVU0JDTURVcChwQWQpCSAgICAgICAgICAgICAgICBcCisJZG97CQkJCQkJCQkJICAgIFwKKwkJc3RydWN0IHJ0X3J0bXBfb3NfdGFzayAqX3BUYXNrID0gJigocEFkKS0+Y21kUVRhc2spOwlcCisJCUNIRUNLX1BJRF9MRUdBTElUWShfcFRhc2stPnRhc2tQSUQpCSAgICBcCisJCXtcCisJCQlSVE1QX1NFTV9FVkVOVF9VUCgmKF9wVGFzay0+dGFza1NlbWEpKTsgXAorCQl9XAorCX13aGlsZSgwKQorI2VuZGlmCisKKyNkZWZpbmUgREVWSUNFX1ZFTkRPUl9SRVFVRVNUX09VVCAgICAgICAweDQwCisjZGVmaW5lIERFVklDRV9WRU5ET1JfUkVRVUVTVF9JTiAgICAgICAgMHhjMAorLy8jZGVmaW5lIElOVEVSRkFDRV9WRU5ET1JfUkVRVUVTVF9PVVQgICAgMHg0MQorLy8jZGVmaW5lIElOVEVSRkFDRV9WRU5ET1JfUkVRVUVTVF9JTiAgICAgMHhjMQorCisjZGVmaW5lIEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHCQkweDgwCisKKyNkZWZpbmUgUlRVU0JfU0VUX0JVTEtfRkxBRyhfTSwgX0YpCSgoX00pLT5CdWxrRmxhZ3MgfD0gKF9GKSkKKyNkZWZpbmUgUlRVU0JfQ0xFQVJfQlVMS19GTEFHKF9NLCBfRikJKChfTSktPkJ1bGtGbGFncyAmPSB+KF9GKSkKKyNkZWZpbmUgUlRVU0JfVEVTVF9CVUxLX0ZMQUcoX00sIF9GKQkoKChfTSktPkJ1bGtGbGFncyAmIChfRikpICE9IDApCisKKyNkZWZpbmUgUlRNUF9JUlFfUkVRVUVTVChuZXRfZGV2KQkJZG97fXdoaWxlKDApCisjZGVmaW5lIFJUTVBfSVJRX1JFTEVBU0UobmV0X2RldikJCWRve313aGlsZSgwKQorCisjZW5kaWYgLy8gX19SVE1QX1VTQl9IX18gLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbWQ1LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21kNS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODVkYjEyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbWQ1LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQltZDUuaAotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCU5hbWUJCURhdGUJCQlNb2RpZmljYXRpb24gbG9ncwotCWphbgkJCTEwLTI4LTAzCQlJbml0aWFsCi0JUml0YSAgICAJMTEtMjMtMDQJCU1vZGlmeSBNRDUgYW5kIFNIQS0xCi0qLwotCi0jaWZuZGVmCXVpbnQ4Ci0jZGVmaW5lCXVpbnQ4ICB1bnNpZ25lZAljaGFyCi0jZW5kaWYKLQotI2lmbmRlZgl1aW50MzIKLSNkZWZpbmUJdWludDMyIHVuc2lnbmVkCWxvbmcgaW50Ci0jZW5kaWYKLQotCi0jaWZuZGVmCV9fTUQ1X0hfXwotI2RlZmluZQlfX01ENV9IX18KLQotI2RlZmluZSBNRDVfTUFDX0xFTiAxNgotCi10eXBlZGVmIHN0cnVjdCBfTUQ1X0NUWCB7Ci0gICAgVUlOVDMyICAgQnVmWzRdOyAgICAgICAgICAgICAvLyBidWZmZXJzIG9mIGZvdXIgc3RhdGVzCi0JVUNIQVIgICBJbnB1dFs2NF07ICAgICAgICAgIC8vIGlucHV0IG1lc3NhZ2UKLQlVSU5UMzIgICBMZW5JbkJpdENvdW50WzJdOyAgIC8vIGxlbmd0aCBjb3VudGVyIGZvciBpbnB1dCBtZXNzYWdlLCAwIHVwIHRvIDY0IGJpdHMKLX0gICBNRDVfQ1RYOwotCi1WT0lEIE1ENUluaXQoTUQ1X0NUWCAqcEN0eCk7Ci1WT0lEIE1ENVVwZGF0ZShNRDVfQ1RYICpwQ3R4LCBVQ0hBUiAqcERhdGEsIFVJTlQzMiBMZW5JbkJ5dGVzKTsKLVZPSUQgTUQ1RmluYWwoVUNIQVIgRGlnZXN0WzE2XSwgTUQ1X0NUWCAqcEN0eCk7Ci1WT0lEIE1ENVRyYW5zZm9ybShVSU5UMzIgQnVmWzRdLCBVSU5UMzIgTWVzWzE2XSk7Ci0KLXZvaWQgbWQ1X21hYyh1OCAqa2V5LCBzaXplX3Qga2V5X2xlbiwgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKm1hYyk7Ci12b2lkIGhtYWNfbWQ1KHU4ICprZXksIHNpemVfdCBrZXlfbGVuLCB1OCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuLCB1OCAqbWFjKTsKLQotLy8KLS8vIFNIQSBjb250ZXh0Ci0vLwotdHlwZWRlZglzdHJ1Y3QgX1NIQV9DVFgKLXsKLQlVSU5UMzIgICBCdWZbNV07ICAgICAgICAgICAgIC8vIGJ1ZmZlcnMgb2YgZml2ZSBzdGF0ZXMKLQlVQ0hBUiAgIElucHV0WzgwXTsgICAgICAgICAgLy8gaW5wdXQgbWVzc2FnZQotCVVJTlQzMiAgIExlbkluQml0Q291bnRbMl07ICAgLy8gbGVuZ3RoIGNvdW50ZXIgZm9yIGlucHV0IG1lc3NhZ2UsIDAgdXAgdG8gNjQgYml0cwotCi19CVNIQV9DVFg7Ci0KLVZPSUQgU0hBSW5pdChTSEFfQ1RYICpwQ3R4KTsKLVVDSEFSIFNIQVVwZGF0ZShTSEFfQ1RYICpwQ3R4LCBVQ0hBUiAqcERhdGEsIFVJTlQzMiBMZW5JbkJ5dGVzKTsKLVZPSUQgU0hBRmluYWwoU0hBX0NUWCAqcEN0eCwgVUNIQVIgRGlnZXN0WzIwXSk7Ci1WT0lEIFNIQVRyYW5zZm9ybShVSU5UMzIgQnVmWzVdLCBVSU5UMzIgTWVzWzIwXSk7Ci0KLSNkZWZpbmUgU0hBX0RJR0VTVF9MRU4gMjAKLSNlbmRpZiAvLyBfX01ENV9IX18KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYJX0FFU19ICi0jZGVmaW5lCV9BRVNfSAotCi10eXBlZGVmCXN0cnVjdAotewotCXVpbnQzMiBlcmtbNjRdOwkJLyogZW5jcnlwdGlvbiByb3VuZAlrZXlzICovCi0JdWludDMyIGRya1s2NF07CQkvKiBkZWNyeXB0aW9uIHJvdW5kCWtleXMgKi8KLQlpbnQJbnI7CQkJCS8qIG51bWJlciBvZiByb3VuZHMJKi8KLX0KLWFlc19jb250ZXh0OwotCi1pbnQJIHJ0bXBfYWVzX3NldF9rZXkoIGFlc19jb250ZXh0ICpjdHgsCXVpbnQ4ICprZXksCWludAluYml0cyApOwotdm9pZCBydG1wX2Flc19lbmNyeXB0KCBhZXNfY29udGV4dCAqY3R4LAl1aW50OCBpbnB1dFsxNl0sIHVpbnQ4IG91dHB1dFsxNl0gKTsKLXZvaWQgcnRtcF9hZXNfZGVjcnlwdCggYWVzX2NvbnRleHQgKmN0eCwJdWludDggaW5wdXRbMTZdLCB1aW50OCBvdXRwdXRbMTZdICk7Ci0KLXZvaWQgRihjaGFyICpwYXNzd29yZCwgdW5zaWduZWQgY2hhciAqc3NpZCwgaW50IHNzaWRsZW5ndGgsIGludCBpdGVyYXRpb25zLCBpbnQgY291bnQsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCk7Ci1pbnQgUGFzc3dvcmRIYXNoKGNoYXIgKnBhc3N3b3JkLCB1bnNpZ25lZCBjaGFyICpzc2lkLCBpbnQgc3NpZGxlbmd0aCwgdW5zaWduZWQgY2hhciAqb3V0cHV0KTsKLQotI2VuZGlmIC8qIGFlcy5oCSovCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbWxtZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9tbG1lLmgKaW5kZXggM2QxYTgyOC4uMTE0MzQxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9tbG1lLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9tbG1lLmgKQEAgLTM5LDE4ICszOSwyMCBAQAogI2lmbmRlZiBfX01MTUVfSF9fCiAjZGVmaW5lIF9fTUxNRV9IX18KIAotLy8gbWF4aW11bSBzdXBwb3J0ZWQgY2FwYWJpbGl0eSBpbmZvcm1hdGlvbiAtCi0vLyBFU1MsIElCU1MsIFByaXZhY3ksIFNob3J0IFByZWFtYmxlLCBTcGVjdHJ1bSBtZ210LCBTaG9ydCBTbG90CisjaW5jbHVkZSAicnRtcF9kb3QxMS5oIgorCisvKiBtYXhpbXVtIHN1cHBvcnRlZCBjYXBhYmlsaXR5IGluZm9ybWF0aW9uIC0gKi8KKy8qIEVTUywgSUJTUywgUHJpdmFjeSwgU2hvcnQgUHJlYW1ibGUsIFNwZWN0cnVtIG1nbXQsIFNob3J0IFNsb3QgKi8KICNkZWZpbmUgU1VQUE9SVEVEX0NBUEFCSUxJVFlfSU5GTyAgIDB4MDUzMwogCiAjZGVmaW5lIEVORF9PRl9BUkdTICAgICAgICAgICAgICAgICAtMQogI2RlZmluZSBMRlNSX01BU0sgICAgICAgICAgICAgICAgICAgMHg4MDAwMDA1NwotI2RlZmluZSBNTE1FX1RBU0tfRVhFQ19JTlRWICAgICAgICAgMTAwLyoyMDAqLyAgICAgICAvLworI2RlZmluZSBNTE1FX1RBU0tfRVhFQ19JTlRWICAgICAgICAgMTAwLyoyMDAqLwkvKiAqLwogI2RlZmluZSBMRUFEX1RJTUUgICAgICAgICAgICAgICAgICAgNQotI2RlZmluZSBNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSAgICAgICAxMCAgLyo1Ki8gICAgICAgLy8gTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgKiBNTE1FX1RBU0tfRVhFQ19JTlRWID0gMSBzZWMKLSNkZWZpbmUgUkVPUkRFUl9FWEVDX0lOVFYgICAgICAgICAJMTAwICAgICAgIC8vIDAuMSBzZWMKKyNkZWZpbmUgTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgICAgICAgMTAgIC8qNSovCS8qIE1MTUVfVEFTS19FWEVDX01VTFRJUExFICogTUxNRV9UQVNLX0VYRUNfSU5UViA9IDEgc2VjICovCisjZGVmaW5lIFJFT1JERVJfRVhFQ19JTlRWICAgICAgICAgCTEwMAkvKiAwLjEgc2VjICovCiAKLS8vIFRoZSBkZWZpbml0aW9uIG9mIFJhZGFyIGRldGVjdGlvbiBkdXJhdGlvbiByZWdpb24KKy8qIFRoZSBkZWZpbml0aW9uIG9mIFJhZGFyIGRldGVjdGlvbiBkdXJhdGlvbiByZWdpb24gKi8KICNkZWZpbmUgQ0UJCTAKICNkZWZpbmUgRkNDCQkxCiAjZGVmaW5lIEpBUAkJMgpAQCAtNTgsNjIgKzYwLDYxIEBACiAjZGVmaW5lIEpBUF9XNTYJNAogI2RlZmluZSBNQVhfUkRfUkVHSU9OIDUKIAotI2lmZGVmCU5ESVM1MV9NSU5JUE9SVAotI2RlZmluZSBCRUFDT05fTE9TVF9USU1FICAgICAgICAgICAgNDAwMCAgICAgICAvLyAyMDQ4IG1zZWMgPSAyIHNlYwotI2Vsc2UKLSNkZWZpbmUgQkVBQ09OX0xPU1RfVElNRSAgICAgICAgICAgIDQgKiBPU19IWiAgICAvLyAyMDQ4IG1zZWMgPSAyIHNlYwotI2VuZGlmCisjZGVmaW5lIEJFQUNPTl9MT1NUX1RJTUUgICAgICAgICAgICA0ICogT1NfSFoJLyogMjA0OCBtc2VjID0gMiBzZWMgKi8KIAotI2RlZmluZSBETFNfVElNRU9VVCAgICAgICAgICAgICAgICAgMTIwMCAgICAgIC8vIHVuaXQ6IG1zZWMKLSNkZWZpbmUgQVVUSF9USU1FT1VUICAgICAgICAgICAgICAgIDMwMCAgICAgICAvLyB1bml0OiBtc2VjCi0jZGVmaW5lIEFTU09DX1RJTUVPVVQgICAgICAgICAgICAgICAzMDAgICAgICAgLy8gdW5pdDogbXNlYwotI2RlZmluZSBKT0lOX1RJTUVPVVQgICAgICAgICAgICAgICAgMiAqIE9TX0haICAgICAgLy8gdW5pdDogbXNlYwotI2RlZmluZSBTSE9SVF9DSEFOTkVMX1RJTUUgICAgICAgICAgOTAgICAgICAgIC8vIHVuaXQ6IG1zZWMKLSNkZWZpbmUgTUlOX0NIQU5ORUxfVElNRSAgICAgICAgICAgIDExMCAgICAgICAgLy8gdW5pdDogbXNlYywgZm9yIGR1YWwgYmFuZCBzY2FuCi0jZGVmaW5lIE1BWF9DSEFOTkVMX1RJTUUgICAgICAgICAgICAxNDAgICAgICAgLy8gdW5pdDogbXNlYywgZm9yIHNpbmdsZSBiYW5kIHNjYW4KLSNkZWZpbmUJRkFTVF9BQ1RJVkVfU0NBTl9USU1FCSAgICAzMCAJCSAgLy8gQWN0aXZlIHNjYW4gd2FpdGluZyBmb3IgcHJvYmUgcmVzcG9uc2UgdGltZQotI2RlZmluZSBDV19NSU5fSU5fQklUUyAgICAgICAgICAgICAgNCAgICAgICAgIC8vIGFjdHVhbCBDd01pbiA9IDJeQ1dfTUlOX0lOX0JJVFMgLSAxCi0jZGVmaW5lIENXX01BWF9JTl9CSVRTICAgICAgICAgICAgICAxMCAgICAgICAgLy8gYWN0dWFsIEN3TWF4ID0gMl5DV19NQVhfSU5fQklUUyAtIDEKKyNkZWZpbmUgRExTX1RJTUVPVVQgICAgICAgICAgICAgICAgIDEyMDAJLyogdW5pdDogbXNlYyAqLworI2RlZmluZSBBVVRIX1RJTUVPVVQgICAgICAgICAgICAgICAgMzAwCS8qIHVuaXQ6IG1zZWMgKi8KKyNkZWZpbmUgQVNTT0NfVElNRU9VVCAgICAgICAgICAgICAgIDMwMAkvKiB1bml0OiBtc2VjICovCisjZGVmaW5lIEpPSU5fVElNRU9VVCAgICAgICAgICAgICAgICAyMDAwCS8qIHVuaXQ6IG1zZWMgKi8KKyNkZWZpbmUgU0hPUlRfQ0hBTk5FTF9USU1FICAgICAgICAgIDkwCS8qIHVuaXQ6IG1zZWMgKi8KKyNkZWZpbmUgTUlOX0NIQU5ORUxfVElNRSAgICAgICAgICAgIDExMAkvKiB1bml0OiBtc2VjLCBmb3IgZHVhbCBiYW5kIHNjYW4gKi8KKyNkZWZpbmUgTUFYX0NIQU5ORUxfVElNRSAgICAgICAgICAgIDE0MAkvKiB1bml0OiBtc2VjLCBmb3Igc2luZ2xlIGJhbmQgc2NhbiAqLworI2RlZmluZQlGQVNUX0FDVElWRV9TQ0FOX1RJTUUJICAgIDMwCS8qIEFjdGl2ZSBzY2FuIHdhaXRpbmcgZm9yIHByb2JlIHJlc3BvbnNlIHRpbWUgKi8KKyNkZWZpbmUgQ1dfTUlOX0lOX0JJVFMgICAgICAgICAgICAgIDQJLyogYWN0dWFsIEN3TWluID0gMl5DV19NSU5fSU5fQklUUyAtIDEgKi8KKyNkZWZpbmUgTElOS19ET1dOX1RJTUVPVVQgICAgICAgICAgIDIwMDAwCS8qIHVuaXQ6IG1zZWMgKi8KKyNkZWZpbmUgQVVUT19XQUtFVVBfVElNRU9VVAkJCTcwCS8qdW5pdDogbXNlYyAqLwogCi0vLyBOb3RlOiBSU1NJX1RPX0RCTV9PRkZTRVQgaGFzIGJlZW4gY2hhbmdlZCB0byB2YXJpYWJsZSBmb3IgbmV3IFJGICgyMDA0LTA3MjApLgotLy8gU0hvdWxkIG5vdCByZWZlciB0byB0aGlzIGNvbnN0YW50IGFueW1vcmUKLS8vI2RlZmluZSBSU1NJX1RPX0RCTV9PRkZTRVQgICAgICAgICAgMTIwIC8vIGZvciBSVDI1MzAgUlNTSS0xMTUgPSBkQm0KLSNkZWZpbmUgUlNTSV9GT1JfTUlEX1RYX1BPV0VSICAgICAgIC01NSAgLy8gLTU1IGRiIGlzIGNvbnNpZGVyZWQgbWlkLWRpc3RhbmNlCi0jZGVmaW5lIFJTU0lfRk9SX0xPV19UWF9QT1dFUiAgICAgICAtNDUgIC8vIC00NSBkYiBpcyBjb25zaWRlcmVkIHZlcnkgc2hvcnQgZGlzdGFuY2UgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxpZ2libGUgdG8gdXNlIGEgbG93ZXIgVFggcG93ZXIKKyNkZWZpbmUgQ1dfTUFYX0lOX0JJVFMgICAgICAgICAgICAgIDEwCS8qIGFjdHVhbCBDd01heCA9IDJeQ1dfTUFYX0lOX0JJVFMgLSAxICovCisKKy8qIE5vdGU6IFJTU0lfVE9fREJNX09GRlNFVCBoYXMgYmVlbiBjaGFuZ2VkIHRvIHZhcmlhYmxlIGZvciBuZXcgUkYgKDIwMDQtMDcyMCkuICovCisvKiBTSG91bGQgbm90IHJlZmVyIHRvIHRoaXMgY29uc3RhbnQgYW55bW9yZSAqLworLyojZGVmaW5lIFJTU0lfVE9fREJNX09GRlNFVCAgICAgICAgICAxMjAgLy8gZm9yIFJUMjUzMCBSU1NJLTExNSA9IGRCbSAqLworI2RlZmluZSBSU1NJX0ZPUl9NSURfVFhfUE9XRVIgICAgICAgLTU1CS8qIC01NSBkYiBpcyBjb25zaWRlcmVkIG1pZC1kaXN0YW5jZSAqLworI2RlZmluZSBSU1NJX0ZPUl9MT1dfVFhfUE9XRVIgICAgICAgLTQ1CS8qIC00NSBkYiBpcyBjb25zaWRlcmVkIHZlcnkgc2hvcnQgZGlzdGFuY2UgYW5kICovCisJCQkJCS8qIGVsaWdpYmxlIHRvIHVzZSBhIGxvd2VyIFRYIHBvd2VyICovCiAjZGVmaW5lIFJTU0lfRk9SX0xPV0VTVF9UWF9QT1dFUiAgICAtMzAKLS8vI2RlZmluZSBNSURfVFhfUE9XRVJfREVMVEEgICAgICAgICAgMCAgIC8vIDAgZGIgZnJvbSBmdWxsIFRYIHBvd2VyIHVwb24gbWlkLWRpc3RhbmNlIHRvIEFQCi0jZGVmaW5lIExPV19UWF9QT1dFUl9ERUxUQSAgICAgICAgICA2ICAgIC8vIC0zIGRiIGZyb20gZnVsbCBUWCBwb3dlciB1cG9uIHZlcnkgc2hvcnQgZGlzdGFuY2UuIDEgZ3JhZGUgaXMgMC41IGRiCi0jZGVmaW5lIExPV0VTVF9UWF9QT1dFUl9ERUxUQSAgICAgICAxNiAgIC8vIC04IGRiIGZyb20gZnVsbCBUWCBwb3dlciB1cG9uIHNob3J0ZXN0IGRpc3RhbmNlLiAxIGdyYWRlIGlzIDAuNSBkYgorLyojZGVmaW5lIE1JRF9UWF9QT1dFUl9ERUxUQSAgICAgICAgICAwICAgLy8gMCBkYiBmcm9tIGZ1bGwgVFggcG93ZXIgdXBvbiBtaWQtZGlzdGFuY2UgdG8gQVAgKi8KKyNkZWZpbmUgTE9XX1RYX1BPV0VSX0RFTFRBICAgICAgICAgIDYJLyogLTMgZGIgZnJvbSBmdWxsIFRYIHBvd2VyIHVwb24gdmVyeSBzaG9ydCBkaXN0YW5jZS4gMSBncmFkZSBpcyAwLjUgZGIgKi8KKyNkZWZpbmUgTE9XRVNUX1RYX1BPV0VSX0RFTFRBICAgICAgIDE2CS8qIC04IGRiIGZyb20gZnVsbCBUWCBwb3dlciB1cG9uIHNob3J0ZXN0IGRpc3RhbmNlLiAxIGdyYWRlIGlzIDAuNSBkYiAqLwogCiAjZGVmaW5lIFJTU0lfVFJJR0dFUkVEX1VQT05fQkVMT1dfVEhSRVNIT0xEICAgICAwCiAjZGVmaW5lIFJTU0lfVFJJR0dFUkVEX1VQT05fRVhDQ0VFRF9USFJFU0hPTEQgICAxCiAjZGVmaW5lIFJTU0lfVEhSRVNIT0xEX0ZPUl9ST0FNSU5HICAgICAgICAgICAgICAyNQogI2RlZmluZSBSU1NJX0RFTFRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQogCi0vLyBDaGFubmVsIFF1YWxpdHkgSW5kaWNhdGlvbgorLyogQ2hhbm5lbCBRdWFsaXR5IEluZGljYXRpb24gKi8KICNkZWZpbmUgQ1FJX0lTX0dPT0QoY3FpKSAgICAgICAgICAgICgoY3FpKSA+PSA1MCkKLS8vI2RlZmluZSBDUUlfSVNfRkFJUihjcWkpICAgICAgICAgICgoKGNxaSkgPj0gMjApICYmICgoY3FpKSA8IDUwKSkKLSNkZWZpbmUgQ1FJX0lTX1BPT1IoY3FpKSAgICAgICAgICAgIChjcWkgPCA1MCkgIC8vKCgoY3FpKSA+PSA1KSAmJiAoKGNxaSkgPCAyMCkpCisvKiNkZWZpbmUgQ1FJX0lTX0ZBSVIoY3FpKSAgICAgICAgICAoKChjcWkpID49IDIwKSAmJiAoKGNxaSkgPCA1MCkpICovCisjZGVmaW5lIENRSV9JU19QT09SKGNxaSkgICAgICAgICAgICAoY3FpIDwgNTApCS8qKCgoY3FpKSA+PSA1KSAmJiAoKGNxaSkgPCAyMCkpICovCiAjZGVmaW5lIENRSV9JU19CQUQoY3FpKSAgICAgICAgICAgICAoY3FpIDwgNSkKICNkZWZpbmUgQ1FJX0lTX0RFQUQoY3FpKSAgICAgICAgICAgIChjcWkgPT0gMCkKIAotLy8gd2VpZ2h0aW5nIGZhY3RvciB0byBjYWxjdWxhdGUgQ2hhbm5lbCBxdWFsaXR5LCB0b3RhbCBzaG91bGQgYmUgMTAwJQorLyogd2VpZ2h0aW5nIGZhY3RvciB0byBjYWxjdWxhdGUgQ2hhbm5lbCBxdWFsaXR5LCB0b3RhbCBzaG91bGQgYmUgMTAwJSAqLwogI2RlZmluZSBSU1NJX1dFSUdIVElORyAgICAgICAgICAgICAgICAgICA1MAogI2RlZmluZSBUWF9XRUlHSFRJTkcgICAgICAgICAgICAgICAgICAgICAzMAogI2RlZmluZSBSWF9XRUlHSFRJTkcgICAgICAgICAgICAgICAgICAgICAyMAogCiAjZGVmaW5lIEJTU19OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKIAotI2RlZmluZSBNQVhfTEVOX09GX01MTUVfUVVFVUUgICAgICAgICAgICA0MCAvLzEwCisjZGVmaW5lIE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSAgICAgICAgICAgIDQwCS8qMTAgKi8KIAotI2RlZmluZSBTQ0FOX1BBU1NJVkUgICAgICAgICAgICAgICAgICAgICAxOAkJLy8gc2NhbiB3aXRoIG5vIHByb2JlIHJlcXVlc3QsIG9ubHkgd2FpdCBiZWFjb24gYW5kIHByb2JlIHJlc3BvbnNlCi0jZGVmaW5lIFNDQU5fQUNUSVZFICAgICAgICAgICAgICAgICAgICAgIDE5CQkvLyBzY2FuIHdpdGggcHJvYmUgcmVxdWVzdCwgYW5kIHdhaXQgYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZQotI2RlZmluZQlTQ0FOX0NJU0NPX1BBU1NJVkUJCQkJIDIwCQkvLyBTaW5nbGUgY2hhbm5lbCBwYXNzaXZlIHNjYW4KLSNkZWZpbmUJU0NBTl9DSVNDT19BQ1RJVkUJCQkJIDIxCQkvLyBTaW5nbGUgY2hhbm5lbCBhY3RpdmUgc2NhbgotI2RlZmluZQlTQ0FOX0NJU0NPX05PSVNFCQkJCSAyMgkJLy8gU2luZ2xlIGNoYW5uZWwgcGFzc2l2ZSBzY2FuIGZvciBub2lzZSBoaXN0b2dyYW0gY29sbGVjdGlvbgotI2RlZmluZQlTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRAkJCSAyMwkJLy8gU2luZ2xlIGNoYW5uZWwgcGFzc2l2ZSBzY2FuIGZvciBjaGFubmVsIGxvYWQgY29sbGVjdGlvbgotI2RlZmluZSBGQVNUX1NDQU5fQUNUSVZFICAgICAgICAgICAgICAgICAyNAkJLy8gc2NhbiB3aXRoIHByb2JlIHJlcXVlc3QsIGFuZCB3YWl0IGJlYWNvbiBhbmQgcHJvYmUgcmVzcG9uc2UKKyNkZWZpbmUgU0NBTl9QQVNTSVZFICAgICAgICAgICAgICAgICAgICAgMTgJLyogc2NhbiB3aXRoIG5vIHByb2JlIHJlcXVlc3QsIG9ubHkgd2FpdCBiZWFjb24gYW5kIHByb2JlIHJlc3BvbnNlICovCisjZGVmaW5lIFNDQU5fQUNUSVZFICAgICAgICAgICAgICAgICAgICAgIDE5CS8qIHNjYW4gd2l0aCBwcm9iZSByZXF1ZXN0LCBhbmQgd2FpdCBiZWFjb24gYW5kIHByb2JlIHJlc3BvbnNlICovCisjZGVmaW5lCVNDQU5fQ0lTQ09fUEFTU0lWRQkJCQkgMjAJLyogU2luZ2xlIGNoYW5uZWwgcGFzc2l2ZSBzY2FuICovCisjZGVmaW5lCVNDQU5fQ0lTQ09fQUNUSVZFCQkJCSAyMQkvKiBTaW5nbGUgY2hhbm5lbCBhY3RpdmUgc2NhbiAqLworI2RlZmluZQlTQ0FOX0NJU0NPX05PSVNFCQkJCSAyMgkvKiBTaW5nbGUgY2hhbm5lbCBwYXNzaXZlIHNjYW4gZm9yIG5vaXNlIGhpc3RvZ3JhbSBjb2xsZWN0aW9uICovCisjZGVmaW5lCVNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FECQkJIDIzCS8qIFNpbmdsZSBjaGFubmVsIHBhc3NpdmUgc2NhbiBmb3IgY2hhbm5lbCBsb2FkIGNvbGxlY3Rpb24gKi8KKyNkZWZpbmUgRkFTVF9TQ0FOX0FDVElWRSAgICAgICAgICAgICAgICAgMjQJLyogc2NhbiB3aXRoIHByb2JlIHJlcXVlc3QsIGFuZCB3YWl0IGJlYWNvbiBhbmQgcHJvYmUgcmVzcG9uc2UgKi8KIAogI2RlZmluZSBNQUNfQUREUl9JU19HUk9VUChBZGRyKSAgICAgICAoKChBZGRyWzBdKSAmIDB4MDEpKQogI2RlZmluZSBNQUNfQUREUl9IQVNIKEFkZHIpICAgICAgICAgICAgKEFkZHJbMF0gXiBBZGRyWzFdIF4gQWRkclsyXSBeIEFkZHJbM10gXiBBZGRyWzRdIF4gQWRkcls1XSkKQEAgLTEyMSwxMyArMTIyLDEzIEBACiAjZGVmaW5lIFRJRF9NQUNfSEFTSChBZGRyLFRJRCkgICAgICAgICAgICAoVElEXkFkZHJbMF0gXiBBZGRyWzFdIF4gQWRkclsyXSBeIEFkZHJbM10gXiBBZGRyWzRdIF4gQWRkcls1XSkKICNkZWZpbmUgVElEX01BQ19IQVNIX0lOREVYKEFkZHIsVElEKSAgICAgIChUSURfTUFDX0hBU0goQWRkcixUSUQpICUgSEFTSF9UQUJMRV9TSVpFKQogCi0vLyBMRUQgQ29udHJvbAotLy8gYXNzb2lhdGlvbiBPTi4gb25lIExFRCBPTi4gYW5vdGhlciBibGlua2luZyB3aGVuIFRYLCBPRkYgd2hlbiBpZGxlCi0vLyBubyBhc3NvY2lhdGlvbiwgYm90aCBMRUQgb2ZmCisvKiBMRUQgQ29udHJvbCAqLworLyogYXNzb2lhdGlvbiBPTi4gb25lIExFRCBPTi4gYW5vdGhlciBibGlua2luZyB3aGVuIFRYLCBPRkYgd2hlbiBpZGxlICovCisvKiBubyBhc3NvY2lhdGlvbiwgYm90aCBMRUQgb2ZmICovCiAjZGVmaW5lIEFTSUNfTEVEX0FDVF9PTihwQWQpICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMTQsIDB4MDAwMzFlNDYpCiAjZGVmaW5lIEFTSUNfTEVEX0FDVF9PRkYocEFkKSAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMTQsIDB4MDAwMDFlNDYpCiAKLS8vIGJpdCBkZWZpbml0aW9uIG9mIHRoZSAyLWJ5dGUgcEJFQUNPTi0+Q2FwYWJpbGl0eSBmaWVsZAorLyogYml0IGRlZmluaXRpb24gb2YgdGhlIDItYnl0ZSBwQkVBQ09OLT5DYXBhYmlsaXR5IGZpZWxkICovCiAjZGVmaW5lIENBUF9JU19FU1NfT04oeCkgICAgICAgICAgICAgICAgICgoKHgpICYgMHgwMDAxKSAhPSAwKQogI2RlZmluZSBDQVBfSVNfSUJTU19PTih4KSAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MDAwMikgIT0gMCkKICNkZWZpbmUgQ0FQX0lTX0NGX1BPTExBQkxFX09OKHgpICAgICAgICAgKCgoeCkgJiAweDAwMDQpICE9IDApCkBAIC0xMzYsNDQgKzEzNyw0NCBAQAogI2RlZmluZSBDQVBfSVNfU0hPUlRfUFJFQU1CTEVfT04oeCkgICAgICAoKCh4KSAmIDB4MDAyMCkgIT0gMCkKICNkZWZpbmUgQ0FQX0lTX1BCQ0NfT04oeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAwNDApICE9IDApCiAjZGVmaW5lIENBUF9JU19BR0lMSVRZX09OKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwMDgwKSAhPSAwKQotI2RlZmluZSBDQVBfSVNfU1BFQ1RSVU1fTUdNVCh4KSAgICAgICAgICAoKCh4KSAmIDB4MDEwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKLSNkZWZpbmUgQ0FQX0lTX1FPUyh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAyMDApICE9IDApICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIENBUF9JU19TUEVDVFJVTV9NR01UKHgpICAgICAgICAgICgoKHgpICYgMHgwMTAwKSAhPSAwKQkvKiA4MDIuMTFlIGQ5ICovCisjZGVmaW5lIENBUF9JU19RT1MoeCkgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgwMjAwKSAhPSAwKQkvKiA4MDIuMTFlIGQ5ICovCiAjZGVmaW5lIENBUF9JU19TSE9SVF9TTE9UKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwNDAwKSAhPSAwKQotI2RlZmluZSBDQVBfSVNfQVBTRCh4KSAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MDgwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKLSNkZWZpbmUgQ0FQX0lTX0lNTUVEX0JBKHgpICAgICAgICAgICAgICAgKCgoeCkgJiAweDEwMDApICE9IDApICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIENBUF9JU19BUFNEKHgpICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgwODAwKSAhPSAwKQkvKiA4MDIuMTFlIGQ5ICovCisjZGVmaW5lIENBUF9JU19JTU1FRF9CQSh4KSAgICAgICAgICAgICAgICgoKHgpICYgMHgxMDAwKSAhPSAwKQkvKiA4MDIuMTFlIGQ5ICovCiAjZGVmaW5lIENBUF9JU19EU1NTX09GRE0oeCkgICAgICAgICAgICAgICgoKHgpICYgMHgyMDAwKSAhPSAwKQotI2RlZmluZSBDQVBfSVNfREVMQVlfQkEoeCkgICAgICAgICAgICAgICAoKCh4KSAmIDB4NDAwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgQ0FQX0lTX0RFTEFZX0JBKHgpICAgICAgICAgICAgICAgKCgoeCkgJiAweDQwMDApICE9IDApCS8qIDgwMi4xMWUgZDkgKi8KIAogI2RlZmluZSBDQVBfR0VORVJBVEUoZXNzLGlic3MscHJpdixzX3ByZSxzX3Nsb3Qsc3BlY3RydW0pICAoKChlc3MpID8gMHgwMDAxIDogMHgwMDAwKSB8ICgoaWJzcykgPyAweDAwMDIgOiAweDAwMDApIHwgKChwcml2KSA/IDB4MDAxMCA6IDB4MDAwMCkgfCAoKHNfcHJlKSA/IDB4MDAyMCA6IDB4MDAwMCkgfCAoKHNfc2xvdCkgPyAweDA0MDAgOiAweDAwMDApIHwgKChzcGVjdHJ1bSkgPyAweDAxMDAgOiAweDAwMDApKQogCi0jZGVmaW5lIEVSUF9JU19OT05fRVJQX1BSRVNFTlQoeCkgICAgICAgICgoKHgpICYgMHgwMSkgIT0gMCkgICAgLy8gODAyLjExZwotI2RlZmluZSBFUlBfSVNfVVNFX1BST1RFQ1RJT04oeCkgICAgICAgICAoKCh4KSAmIDB4MDIpICE9IDApICAgIC8vIDgwMi4xMWcKLSNkZWZpbmUgRVJQX0lTX1VTRV9CQVJLRVJfUFJFQU1CTEUoeCkgICAgKCgoeCkgJiAweDA0KSAhPSAwKSAgICAvLyA4MDIuMTFnCisjZGVmaW5lIEVSUF9JU19OT05fRVJQX1BSRVNFTlQoeCkgICAgICAgICgoKHgpICYgMHgwMSkgIT0gMCkJLyogODAyLjExZyAqLworI2RlZmluZSBFUlBfSVNfVVNFX1BST1RFQ1RJT04oeCkgICAgICAgICAoKCh4KSAmIDB4MDIpICE9IDApCS8qIDgwMi4xMWcgKi8KKyNkZWZpbmUgRVJQX0lTX1VTRV9CQVJLRVJfUFJFQU1CTEUoeCkgICAgKCgoeCkgJiAweDA0KSAhPSAwKQkvKiA4MDIuMTFnICovCiAKLSNkZWZpbmUgRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQgICAgICAgOC8vIDMgIC8vIGp1c3QgdGVzdCBieSBnYXJ5CisjZGVmaW5lIERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EICAgICAgIDgJLyogMyAgLy8ganVzdCB0ZXN0IGJ5IGdhcnkgKi8KICNkZWZpbmUgRFJTX1BFTkFMVFkgICAgICAgICAgICAgICAgICAgICAgOAogCiAjZGVmaW5lIEJBX05PVFVTRSAJMgotLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUKKy8qQkEgUG9saWN5IHN1YmZpbGVkIHZhbHVlIGluIEFEREJBIGZyYW1lICovCiAjZGVmaW5lIElNTUVEX0JBIAkxCiAjZGVmaW5lIERFTEFZX0JBCTAKIAotLy8gQkEgSW5pdGlhdG9yIHN1YmZpZWxkIGluIERFTEJBIGZyYW1lCisvKiBCQSBJbml0aWF0b3Igc3ViZmllbGQgaW4gREVMQkEgZnJhbWUgKi8KICNkZWZpbmUgT1JJR0lOQVRPUgkxCiAjZGVmaW5lIFJFQ0lQSUVOVAkwCiAKLS8vIEFEREJBIFN0YXR1cyBDb2RlCisvKiBBRERCQSBTdGF0dXMgQ29kZSAqLwogI2RlZmluZSBBRERCQV9SRVNVTFRDT0RFX1NVQ0NFU1MJCQkJCTAKICNkZWZpbmUgQUREQkFfUkVTVUxUQ09ERV9SRUZVU0VECQkJCQkzNwogI2RlZmluZSBBRERCQV9SRVNVTFRDT0RFX0lOVkFMSURfUEFSQU1FVEVSUwkJCTM4CiAKLS8vIERFTEJBIFJlYXNvbiBDb2RlCisvKiBERUxCQSBSZWFzb24gQ29kZSAqLwogI2RlZmluZSBERUxCQV9SRUFTT05DT0RFX1FTVEFfTEVBVklORwkJCQkzNgogI2RlZmluZSBERUxCQV9SRUFTT05DT0RFX0VORF9CQQkJCQkJCTM3CiAjZGVmaW5lIERFTEJBX1JFQVNPTkNPREVfVU5LTk9XTl9CQQkJCQkJMzgKICNkZWZpbmUgREVMQkFfUkVBU09OQ09ERV9USU1FT1VUCQkJCQkzOQogCi0vLyByZXNldCBhbGwgT25lU2VjVHggY291bnRlcnMKKy8qIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycyAqLwogI2RlZmluZSBSRVNFVF9PTkVfU0VDX1RYX0NOVChfX3BFbnRyeSkgXAogaWYgKCgoX19wRW50cnkpKSAhPSBOVUxMKSBcCiB7IFwKQEAgLTE4Miw5NTcgKzE4Myw4NjggQEAKIAkoX19wRW50cnkpLT5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ID0gMDsgXAogfQogCi0vLwotLy8gODAyLjExIGZyYW1lIGZvcm1hdHMKLS8vCi0vLyAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotCVVTSE9SVAlBZHZDb2Rpbmc6MTsKLQlVU0hPUlQJQ2hhbm5lbFdpZHRoOjE7Ci0JVVNIT1JUCU1pbW9QczoyOy8vbW9taSBwb3dlciBzYWZlCi0JVVNIT1JUCUdGOjE7CS8vZ3JlZW4gZmllbGQKLQlVU0hPUlQJU2hvcnRHSWZvcjIwOjE7Ci0JVVNIT1JUCVNob3J0R0lmb3I0MDoxOwkvL2ZvcjQwTUh6Ci0JVVNIT1JUCVR4U1RCQzoxOwotCVVTSE9SVAlSeFNUQkM6MjsKLQlVU0hPUlQJRGVsYXllZEJBOjE7CS8vcnQyODYwYyBub3Qgc3VwcG9ydAotCVVTSE9SVAlBTXNkdVNpemU6MTsJLy8gb25seSBzdXBwb3J0IGFzIHplcm8KLQlVU0hPUlQJQ0NLbW9kZWluNDA6MTsKLQlVU0hPUlQJUFNNUDoxOwotCVVTSE9SVAlGb3J0eV9NaHpfSW50b2xlcmFudDoxOwotCVVTSE9SVAlMU0lHVHhvcFByb1N1cDoxOwotfSBIVF9DQVBfSU5GTywgKlBIVF9DQVBfSU5GTzsKKy8qICovCisvKiA4MDIuMTEgZnJhbWUgZm9ybWF0cyAqLworLyogKi8KKy8qICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4gKi8KK3N0cnVjdCBQQUNLRUQgcnRfaHRfY2FwX2luZm8geworCXUxNiBBZHZDb2Rpbmc6MTsKKwl1MTYgQ2hhbm5lbFdpZHRoOjE7CisJdTE2IE1pbW9QczoyOwkvKm1vbWkgcG93ZXIgc2FmZSAqLworCXUxNiBHRjoxOwkJLypncmVlbiBmaWVsZCAqLworCXUxNiBTaG9ydEdJZm9yMjA6MTsKKwl1MTYgU2hvcnRHSWZvcjQwOjE7CS8qZm9yNDBNSHogKi8KKwl1MTYgVHhTVEJDOjE7CisJdTE2IFJ4U1RCQzoyOworCXUxNiBEZWxheWVkQkE6MTsJLypydDI4NjBjIG5vdCBzdXBwb3J0ICovCisJdTE2IEFNc2R1U2l6ZToxOwkvKiBvbmx5IHN1cHBvcnQgYXMgemVybyAqLworCXUxNiBDQ0ttb2RlaW40MDoxOworCXUxNiBQU01QOjE7CisJdTE2IEZvcnR5X01oel9JbnRvbGVyYW50OjE7CisJdTE2IExTSUdUeG9wUHJvU3VwOjE7Cit9OwogCi0vLyAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotCVVDSEFSCU1heFJBbXBkdUZhY3RvcjoyOwotCVVDSEFSCU1wZHVEZW5zaXR5OjM7Ci0JVUNIQVIJcnN2OjM7Ly9tb21pIHBvd2VyIHNhZmUKLX0gSFRfQ0FQX1BBUk0sICpQSFRfQ0FQX1BBUk07CisvKiAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2h0X2NhcF9wYXJtIHsKKwl1OCBNYXhSQW1wZHVGYWN0b3I6MjsKKwl1OCBNcGR1RGVuc2l0eTozOworCXU4IHJzdjozOwkJLyptb21pIHBvd2VyIHNhZmUgKi8KK307CiAKLS8vICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0JVUNIQVIJTUNTU2V0WzEwXTsKLQlVQ0hBUglTdXBSYXRlWzJdOyAgLy8gdW5pdCA6IDFNYnBzCi0JVUNIQVIJVHhNQ1NTZXREZWZpbmVkOjE7Ci0JVUNIQVIJVHhSeE5vdEVxdWFsOjE7Ci0JVUNIQVIJVHhTdHJlYW06MjsKLQlVQ0hBUglNcGR1RGVuc2l0eToxOwotCVVDSEFSCXJzdjozOwotCVVDSEFSCXJzdjNbM107Ci19IEhUX01DU19TRVQsICpQSFRfTUNTX1NFVDsKKy8qICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4gKi8KK3N0cnVjdCBQQUNLRUQgcnRfaHRfbWNzX3NldCB7CisJdTggTUNTU2V0WzEwXTsKKwl1OCBTdXBSYXRlWzJdOwkvKiB1bml0IDogMU1icHMgKi8KKwl1OCBUeE1DU1NldERlZmluZWQ6MTsKKwl1OCBUeFJ4Tm90RXF1YWw6MTsKKwl1OCBUeFN0cmVhbToyOworCXU4IE1wZHVEZW5zaXR5OjE7CisJdTggcnN2OjM7CisJdTggcnN2M1szXTsKK307CiAKLS8vICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0JVVNIT1JUCVBjbzoxOwotCVVTSE9SVAlUcmFuVGltZToyOwotCVVTSE9SVAlyc3Y6NTsvL21vbWkgcG93ZXIgc2FmZQotCVVTSE9SVAlNQ1NGZWVkYmFjazoyOwkvLzA6bm8gTUNTIGZlZWRiYWNrLCAyOnVuc29saWNpdGVkIE1DUyBmZWVkYmFjaywgMzpGdWxsIE1DUyBmZWVkYmFjaywgIDE6cnN2LgotCVVTSE9SVAlQbHVzSFRDOjE7CS8vK0hUQyBjb250cm9sIGZpZWxkIHN1cHBvcnQKLQlVU0hPUlQJUkRHU3VwcG9ydDoxOwkvL3JldmVyc2UgRGlyZWN0aW9uIEdyYW50ICBzdXBwb3J0Ci0JVVNIT1JUCXJzdjI6NDsKLX0gRVhUX0hUX0NBUF9JTkZPLCAqUEVYVF9IVF9DQVBfSU5GTzsKKy8qICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4gKi8KK3N0cnVjdCBQQUNLRUQgcnRfZXh0X2h0X2NhcF9pbmZvIHsKKwl1MTYgUGNvOjE7CisJdTE2IFRyYW5UaW1lOjI7CisJdTE2IHJzdjo1OwkJLyptb21pIHBvd2VyIHNhZmUgKi8KKwl1MTYgTUNTRmVlZGJhY2s6MjsJLyowOm5vIE1DUyBmZWVkYmFjaywgMjp1bnNvbGljaXRlZCBNQ1MgZmVlZGJhY2ssIDM6RnVsbCBNQ1MgZmVlZGJhY2ssICAxOnJzdi4gKi8KKwl1MTYgUGx1c0hUQzoxOwkvKitIVEMgY29udHJvbCBmaWVsZCBzdXBwb3J0ICovCisJdTE2IFJER1N1cHBvcnQ6MTsJLypyZXZlcnNlIERpcmVjdGlvbiBHcmFudCAgc3VwcG9ydCAqLworCXUxNiByc3YyOjQ7Cit9OwogCi0vLyAgSFQgQmVhbWZvcm1pbmcgZmllbGQgaW4gSFQgQ2FwIElFIC4KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfSFRfQkZfQ0FQewotCVVMT05HCVR4QkZSZWNDYXBhYmxlOjE7Ci0JVUxPTkcJUnhTb3VuZENhcGFibGU6MTsKLQlVTE9ORwlUeFNvdW5kQ2FwYWJsZToxOwotCVVMT05HCVJ4TkRQQ2FwYWJsZToxOwotCVVMT05HCVR4TkRQQ2FwYWJsZToxOwotCVVMT05HCUltcFR4QkZDYXBhYmxlOjE7Ci0JVUxPTkcJQ2FsaWJyYXRpb246MjsKLQlVTE9ORwlFeHBDU0lDYXBhYmxlOjE7Ci0JVUxPTkcJRXhwTm9Db21TdGVlckNhcGFibGU6MTsKLQlVTE9ORwlFeHBDb21TdGVlckNhcGFibGU6MTsKLQlVTE9ORwlFeHBDU0lGYms6MjsKLQlVTE9ORwlFeHBOb0NvbUJGOjI7Ci0JVUxPTkcJRXhwQ29tQkY6MjsKLQlVTE9ORwlNaW5Hcm91cGluZzoyOwotCVVMT05HCUNTSUJGQW50U3VwOjI7Ci0JVUxPTkcJTm9Db21TdGVlckJGQW50U3VwOjI7Ci0JVUxPTkcJQ29tU3RlZXJCRkFudFN1cDoyOwotCVVMT05HCUNTSVJvd0JGU3VwOjI7Ci0JVUxPTkcJQ2hhbkVzdGltYXRpb246MjsKLQlVTE9ORwlyc3Y6MzsKLX0gSFRfQkZfQ0FQLCAqUEhUX0JGX0NBUDsKKy8qICBIVCBCZWFtZm9ybWluZyBmaWVsZCBpbiBIVCBDYXAgSUUgLiAqLworc3RydWN0IFBBQ0tFRCBydF9odF9iZl9jYXAgeworCXVuc2lnbmVkIGxvbmcgVHhCRlJlY0NhcGFibGU6MTsKKwl1bnNpZ25lZCBsb25nIFJ4U291bmRDYXBhYmxlOjE7CisJdW5zaWduZWQgbG9uZyBUeFNvdW5kQ2FwYWJsZToxOworCXVuc2lnbmVkIGxvbmcgUnhORFBDYXBhYmxlOjE7CisJdW5zaWduZWQgbG9uZyBUeE5EUENhcGFibGU6MTsKKwl1bnNpZ25lZCBsb25nIEltcFR4QkZDYXBhYmxlOjE7CisJdW5zaWduZWQgbG9uZyBDYWxpYnJhdGlvbjoyOworCXVuc2lnbmVkIGxvbmcgRXhwQ1NJQ2FwYWJsZToxOworCXVuc2lnbmVkIGxvbmcgRXhwTm9Db21TdGVlckNhcGFibGU6MTsKKwl1bnNpZ25lZCBsb25nIEV4cENvbVN0ZWVyQ2FwYWJsZToxOworCXVuc2lnbmVkIGxvbmcgRXhwQ1NJRmJrOjI7CisJdW5zaWduZWQgbG9uZyBFeHBOb0NvbUJGOjI7CisJdW5zaWduZWQgbG9uZyBFeHBDb21CRjoyOworCXVuc2lnbmVkIGxvbmcgTWluR3JvdXBpbmc6MjsKKwl1bnNpZ25lZCBsb25nIENTSUJGQW50U3VwOjI7CisJdW5zaWduZWQgbG9uZyBOb0NvbVN0ZWVyQkZBbnRTdXA6MjsKKwl1bnNpZ25lZCBsb25nIENvbVN0ZWVyQkZBbnRTdXA6MjsKKwl1bnNpZ25lZCBsb25nIENTSVJvd0JGU3VwOjI7CisJdW5zaWduZWQgbG9uZyBDaGFuRXN0aW1hdGlvbjoyOworCXVuc2lnbmVkIGxvbmcgcnN2OjM7Cit9OwogCi0vLyAgSFQgYW50ZW5uYSBzZWxlY3Rpb24gZmllbGQgaW4gSFQgQ2FwIElFIC4KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfSFRfQVNfQ0FQewotCVVDSEFSCUFudFNlbGVjdDoxOwotCVVDSEFSCUV4cENTSUZia1R4QVNFTDoxOwotCVVDSEFSCUFudEluZEZia1R4QVNFTDoxOwotCVVDSEFSCUV4cENTSUZiazoxOwotCVVDSEFSCUFudEluZEZiazoxOwotCVVDSEFSCVJ4QVNlbDoxOwotCVVDSEFSCVR4U291bmRQUERVOjE7Ci0JVUNIQVIJcnN2OjE7Ci19IEhUX0FTX0NBUCwgKlBIVF9BU19DQVA7CisvKiAgSFQgYW50ZW5uYSBzZWxlY3Rpb24gZmllbGQgaW4gSFQgQ2FwIElFIC4gKi8KK3N0cnVjdCBQQUNLRUQgcnRfaHRfYXNfY2FwIHsKKwl1OCBBbnRTZWxlY3Q6MTsKKwl1OCBFeHBDU0lGYmtUeEFTRUw6MTsKKwl1OCBBbnRJbmRGYmtUeEFTRUw6MTsKKwl1OCBFeHBDU0lGYms6MTsKKwl1OCBBbnRJbmRGYms6MTsKKwl1OCBSeEFTZWw6MTsKKwl1OCBUeFNvdW5kUFBEVToxOworCXU4IHJzdjoxOworfTsKIAotLy8gRHJhZnQgMS4wIHNldCBJRSBsZW5ndGggMjYsIGJ1dCBpcyBleHRlbnNpYmxlLi4KKy8qIERyYWZ0IDEuMCBzZXQgSUUgbGVuZ3RoIDI2LCBidXQgaXMgZXh0ZW5zaWJsZS4uICovCiAjZGVmaW5lIFNJWkVfSFRfQ0FQX0lFCQkyNgotLy8gVGhlIHN0cnVjdHVyZSBmb3IgSFQgQ2FwYWJpbGl0eSBJRS4KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfSFRfQ0FQQUJJTElUWV9JRXsKLQlIVF9DQVBfSU5GTwkJSHRDYXBJbmZvOwotCUhUX0NBUF9QQVJNCQlIdENhcFBhcm07Ci0vLwlIVF9NQ1NfU0VUCQlIdE1DU1NldDsKLQlVQ0hBUgkJCU1DU1NldFsxNl07Ci0JRVhUX0hUX0NBUF9JTkZPCUV4dEh0Q2FwSW5mbzsKLQlIVF9CRl9DQVAJCVR4QkZDYXA7CS8vIGJlYW1mb3JtaW5nIGNhcC4gcnQyODYwYyBub3Qgc3VwcG9ydCBiZWFtZm9ybWluZy4KLQlIVF9BU19DQVAJCUFTQ2FwOwkvL2FudGVubmEgc2VsZWN0aW9uLgotfSBIVF9DQVBBQklMSVRZX0lFLCAqUEhUX0NBUEFCSUxJVFlfSUU7CisvKiBUaGUgc3RydWN0dXJlIGZvciBIVCBDYXBhYmlsaXR5IElFLiAqLworc3RydWN0IFBBQ0tFRCBydF9odF9jYXBhYmlsaXR5X2llIHsKKwlzdHJ1Y3QgcnRfaHRfY2FwX2luZm8gSHRDYXBJbmZvOworCXN0cnVjdCBydF9odF9jYXBfcGFybSBIdENhcFBhcm07CisvKiAgICAgIHN0cnVjdCBydF9odF9tY3Nfc2V0ICAgICAgICAgICAgICBIdE1DU1NldDsgKi8KKwl1OCBNQ1NTZXRbMTZdOworCXN0cnVjdCBydF9leHRfaHRfY2FwX2luZm8gRXh0SHRDYXBJbmZvOworCXN0cnVjdCBydF9odF9iZl9jYXAgVHhCRkNhcDsJLyogYmVhbWZvcm1pbmcgY2FwLiBydDI4NjBjIG5vdCBzdXBwb3J0IGJlYW1mb3JtaW5nLiAqLworCXN0cnVjdCBydF9odF9hc19jYXAgQVNDYXA7CS8qYW50ZW5uYSBzZWxlY3Rpb24uICovCit9OwogCisvKiA4MDIuMTFuIGRyYWZ0MyByZWxhdGVkIHN0cnVjdHVyZSBkZWZpbml0aW9ucy4gKi8KKy8qIDcuMy4yLjYwICovCisjZGVmaW5lIGRvdDExT0JTU1NjYW5QYXNzaXZlRHdlbGwJCQkJCQkJMjAJLyogaW4gVFUuIG1pbiBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBTVEEgY29udGlub3VzbHkgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhbiBhY3RpdmUgT0JTUyBzY2FuLiAqLworI2RlZmluZSBkb3QxMU9CU1NTY2FuQWN0aXZlRHdlbGwJCQkJCQkJMTAJLyogaW4gVFUubWluIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBjb250aW5vdXNseSBzY2FucyBlYWNoIGNoYW5uZWwgd2hlbiBwZXJmb3JtaW5nIGFuIHBhc3NpdmUgT0JTUyBzY2FuLiAqLworI2RlZmluZSBkb3QxMUJTU1dpZHRoVHJpZ2dlclNjYW5JbnRlcnZhbAkJCQkJMzAwCS8qIGluIHNlYy4gbWF4IGludGVydmFsIGJldHdlZW4gc2NhbiBvcGVyYXRpb25zIHRvIGJlIHBlcmZvcm1lZCB0byBkZXRlY3QgQlNTIGNoYW5uZWwgd2lkdGggdHJpZ2dlciBldmVudHMuICovCisjZGVmaW5lIGRvdDExT0JTU1NjYW5QYXNzaXZlVG90YWxQZXJDaGFubmVsCQkJCQkyMDAJLyogaW4gVFUuIG1pbiB0b3RhbCBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBTVEEgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhIHBhc3NpdmUgT0JTUyBzY2FuLiAqLworI2RlZmluZSBkb3QxMU9CU1NTY2FuQWN0aXZlVG90YWxQZXJDaGFubmVsCQkJCQkyMAkvKmluIFRVLiBtaW4gdG90YWwgYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYSBhY3RpdmUgT0JTUyBzY2FuICovCisjZGVmaW5lIGRvdDExQlNTV2lkdGhDaGFubmVsVHJhbnNhY3Rpb25EZWxheUZhY3RvcgkJCTUJLyogbWluIHJhdGlvIGJldHdlZW4gdGhlIGRlbGF5IHRpbWUgaW4gcGVyZm9ybWluZyBhIHN3aXRjaCBmcm9tIDIwTUh6IEJTUyB0byAyMC80MCBCU1Mgb3BlcmF0aW9uIGFuZCB0aGUgbWF4aW11bSAqLworCQkJCQkJCQkJCQkJCQkJCS8qICAgICAgaW50ZXJ2YWwgYmV0d2VlbiBvdmVybGFwcGluZyBCU1Mgc2NhbiBvcGVyYXRpb25zLiAqLworI2RlZmluZSBkb3QxMUJTU1NjYW5BY3Rpdml0eVRocmVzaG9sZAkJCQkJCTI1CS8qIGluICUlLCBtYXggdG90YWwgdGltZSB0aGF0IGEgU1RBIG1heSBiZSBhY3RpdmUgb24gdGhlIG1lZGl1bSBkdXJpbmcgYSBwZXJpb2Qgb2YgKi8KKwkJCQkJCQkJCQkJCQkJCQkvKiAgICAgIChkb3QxMUJTU1dpZHRoQ2hhbm5lbFRyYW5zYWN0aW9uRGVsYXlGYWN0b3IgKiBkb3QxMUJTU1dpZHRoVHJpZ2dlclNjYW5JbnRlcnZhbCkgc2Vjb25kcyB3aXRob3V0ICovCisJCQkJCQkJCQkJCQkJCQkJLyogICAgICBiZWluZyBvYmxpZ2F0ZWQgdG8gcGVyZm9ybSBPQlNTIFNjYW4gb3BlcmF0aW9ucy4gZGVmYXVsdCBpcyAyNSg9PSAwLjI1JSkgKi8KIAotLy8gODAyLjExbiBkcmFmdDMgcmVsYXRlZCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMuCi0vLyA3LjMuMi42MAotI2RlZmluZSBkb3QxMU9CU1NTY2FuUGFzc2l2ZUR3ZWxsCQkJCQkJCTIwCS8vIGluIFRVLiBtaW4gYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIGNvbnRpbm91c2x5IHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYW4gYWN0aXZlIE9CU1Mgc2Nhbi4KLSNkZWZpbmUgZG90MTFPQlNTU2NhbkFjdGl2ZUR3ZWxsCQkJCQkJCTEwCS8vIGluIFRVLm1pbiBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBTVEEgY29udGlub3VzbHkgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhbiBwYXNzaXZlIE9CU1Mgc2Nhbi4KLSNkZWZpbmUgZG90MTFCU1NXaWR0aFRyaWdnZXJTY2FuSW50ZXJ2YWwJCQkJCTMwMCAgLy8gaW4gc2VjLiBtYXggaW50ZXJ2YWwgYmV0d2VlbiBzY2FuIG9wZXJhdGlvbnMgdG8gYmUgcGVyZm9ybWVkIHRvIGRldGVjdCBCU1MgY2hhbm5lbCB3aWR0aCB0cmlnZ2VyIGV2ZW50cy4KLSNkZWZpbmUgZG90MTFPQlNTU2NhblBhc3NpdmVUb3RhbFBlckNoYW5uZWwJCQkJCTIwMAkvLyBpbiBUVS4gbWluIHRvdGFsIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBzY2FucyBlYWNoIGNoYW5uZWwgd2hlbiBwZXJmb3JtaW5nIGEgcGFzc2l2ZSBPQlNTIHNjYW4uCi0jZGVmaW5lIGRvdDExT0JTU1NjYW5BY3RpdmVUb3RhbFBlckNoYW5uZWwJCQkJCTIwCS8vaW4gVFUuIG1pbiB0b3RhbCBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBTVEEgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhIGFjdGl2ZSBPQlNTIHNjYW4KLSNkZWZpbmUgZG90MTFCU1NXaWR0aENoYW5uZWxUcmFuc2FjdGlvbkRlbGF5RmFjdG9yCQkJNQkvLyBtaW4gcmF0aW8gYmV0d2VlbiB0aGUgZGVsYXkgdGltZSBpbiBwZXJmb3JtaW5nIGEgc3dpdGNoIGZyb20gMjBNSHogQlNTIHRvIDIwLzQwIEJTUyBvcGVyYXRpb24gYW5kIHRoZSBtYXhpbWEKLQkJCQkJCQkJCQkJCQkJCQkvLwlpbnRlcnZhbCBiZXR3ZWVuIG92ZXJsYXBwaW5nIEJTUyBzY2FuIG9wZXJhdGlvbnMuCi0jZGVmaW5lIGRvdDExQlNTU2NhbkFjdGl2aXR5VGhyZXNob2xkCQkJCQkJMjUJLy8gaW4gJSUsIG1heCB0b3RhbCB0aW1lIHRoYXQgYSBTVEEgbWF5IGJlIGFjdGl2ZSBvbiB0aGUgbWVkaXVtIGR1cmluZyBhIHBlcmlvZCBvZgotCQkJCQkJCQkJCQkJCQkJCS8vCShkb3QxMUJTU1dpZHRoQ2hhbm5lbFRyYW5zYWN0aW9uRGVsYXlGYWN0b3IgKiBkb3QxMUJTU1dpZHRoVHJpZ2dlclNjYW5JbnRlcnZhbCkgc2Vjb25kcyB3aXRob3V0Ci0JCQkJCQkJCQkJCQkJCQkJLy8JYmVpbmcgb2JsaWdhdGVkIHRvIHBlcmZvcm0gT0JTUyBTY2FuIG9wZXJhdGlvbnMuIGRlZmF1bHQgaXMgMjUoPT0gMC4yNSUpCitzdHJ1Y3QgUEFDS0VEIHJ0X292ZXJsYXBfYnNzX3NjYW5faWUgeworCXUxNiBTY2FuUGFzc2l2ZUR3ZWxsOworCXUxNiBTY2FuQWN0aXZlRHdlbGw7CisJdTE2IFRyaWdnZXJTY2FuSW50OwkvKiBUcmlnZ2VyIHNjYW4gaW50ZXJ2YWwgKi8KKwl1MTYgUGFzc2l2ZVRhbFBlckNoYW5uZWw7CS8qIHBhc3NpdmUgdG90YWwgcGVyIGNoYW5uZWwgKi8KKwl1MTYgQWN0aXZlVGFsUGVyQ2hhbm5lbDsJLyogYWN0aXZlIHRvdGFsIHBlciBjaGFubmVsICovCisJdTE2IERlbGF5RmFjdG9yOwkvKiBCU1Mgd2lkdGggY2hhbm5lbCB0cmFuc2l0aW9uIGRlbGF5IGZhY3RvciAqLworCXUxNiBTY2FuQWN0VGhyZTsJLyogU2NhbiBBY3Rpdml0eSB0aHJlc2hvbGQgKi8KK307CiAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfT1ZFUkxBUF9CU1NfU0NBTl9JRXsKLQlVU0hPUlQJCVNjYW5QYXNzaXZlRHdlbGw7Ci0JVVNIT1JUCQlTY2FuQWN0aXZlRHdlbGw7Ci0JVVNIT1JUCQlUcmlnZ2VyU2NhbkludDsJCQkJLy8gVHJpZ2dlciBzY2FuIGludGVydmFsCi0JVVNIT1JUCQlQYXNzaXZlVGFsUGVyQ2hhbm5lbDsJCS8vIHBhc3NpdmUgdG90YWwgcGVyIGNoYW5uZWwKLQlVU0hPUlQJCUFjdGl2ZVRhbFBlckNoYW5uZWw7CQkvLyBhY3RpdmUgdG90YWwgcGVyIGNoYW5uZWwKLQlVU0hPUlQJCURlbGF5RmFjdG9yOwkJCQkvLyBCU1Mgd2lkdGggY2hhbm5lbCB0cmFuc2l0aW9uIGRlbGF5IGZhY3RvcgotCVVTSE9SVAkJU2NhbkFjdFRocmU7CQkJCS8vIFNjYW4gQWN0aXZpdHkgdGhyZXNob2xkCi19T1ZFUkxBUF9CU1NfU0NBTl9JRSwgKlBPVkVSTEFQX0JTU19TQ0FOX0lFOwotCi0KLS8vICA3LjMuMi41Ni4gMjAvNDAgQ29leGlzdGVuY2UgZWxlbWVudCB1c2VkIGluICBFbGVtZW50IElEID0gNzIgPSBJRV8yMDQwX0JTU19DT0VYSVNUCi10eXBlZGVmIHVuaW9uIFBBQ0tFRCBfQlNTXzIwNDBfQ09FWElTVF9JRXsKLSBzdHJ1Y3QgUEFDS0VEIHsKLQlVQ0hBUglJbmZvUmVxOjE7Ci0JVUNIQVIJSW50b2xlcmFudDQwOjE7CQkJLy8gSW50ZXItQlNTLiBzZXQgMSB3aGVuIHByb2hpYml0cyBhIHJlY2VpdmluZyBCU1MgZnJvbSBvcGVyYXRpbmcgYXMgYSAyMC80MCBNaHogQlNTLgotCVVDSEFSCUJTUzIwV2lkdGhSZXE6MTsJCS8vIEludHJhLUJTUyBzZXQgMSB3aGVuIHByb2hpYml0cyBhIHJlY2VpdmluZyBBUCBmcm9tIG9wZXJhdGluZyBpdHMgQlNTIGFzIGEgMjAvNDBNSHogQlNTLgotCVVDSEFSCXJzdjo1OwotICAgIH0gZmllbGQ7Ci0gVUNIQVIgICB3b3JkOworLyogIDcuMy4yLjU2LiAyMC80MCBDb2V4aXN0ZW5jZSBlbGVtZW50IHVzZWQgaW4gIEVsZW1lbnQgSUQgPSA3MiA9IElFXzIwNDBfQlNTX0NPRVhJU1QgKi8KK3R5cGVkZWYgdW5pb24gUEFDS0VEIF9CU1NfMjA0MF9DT0VYSVNUX0lFIHsKKwlzdHJ1Y3QgUEFDS0VEIHsKKwkJdTggSW5mb1JlcToxOworCQl1OCBJbnRvbGVyYW50NDA6MTsJLyogSW50ZXItQlNTLiBzZXQgMSB3aGVuIHByb2hpYml0cyBhIHJlY2VpdmluZyBCU1MgZnJvbSBvcGVyYXRpbmcgYXMgYSAyMC80MCBNaHogQlNTLiAqLworCQl1OCBCU1MyMFdpZHRoUmVxOjE7CS8qIEludHJhLUJTUyBzZXQgMSB3aGVuIHByb2hpYml0cyBhIHJlY2VpdmluZyBBUCBmcm9tIG9wZXJhdGluZyBpdHMgQlNTIGFzIGEgMjAvNDBNSHogQlNTLiAqLworCQl1OCByc3Y6NTsKKwl9IGZpZWxkOworCXU4IHdvcmQ7CiB9IEJTU18yMDQwX0NPRVhJU1RfSUUsICpQQlNTXzIwNDBfQ09FWElTVF9JRTsKIAorc3RydWN0IHJ0X3RyaWdnZXJfZXZlbnRhIHsKKwlCT09MRUFOIGJWYWxpZDsKKwl1OCBCU1NJRFs2XTsKKwl1OCBSZWdDbGFzczsJCS8qIFJlZ3VsYXRvcnkgQ2xhc3MgKi8KKwl1MTYgQ2hhbm5lbDsKKwl1bnNpZ25lZCBsb25nIENEQ291bnRlcjsJLyogTWFpbnRhaW4gYSBzZXBlcmF0ZSBjb3VudCBkb3duIGNvdW50ZXIgZm9yIGVhY2ggRXZlbnQgQS4gKi8KK307CiAKLXR5cGVkZWYgc3RydWN0ICBfVFJJR0dFUl9FVkVOVEF7Ci0JQk9PTEVBTgkJCWJWYWxpZDsKLQlVQ0hBUglCU1NJRFs2XTsKLQlVQ0hBUglSZWdDbGFzczsJLy8gUmVndWxhdG9yeSBDbGFzcwotCVVTSE9SVAlDaGFubmVsOwotCVVMT05HCUNEQ291bnRlcjsgICAvLyBNYWludGFpbiBhIHNlcGVyYXRlIGNvdW50IGRvd24gY291bnRlciBmb3IgZWFjaCBFdmVudCBBLgotfSBUUklHR0VSX0VWRU5UQSwgKlBUUklHR0VSX0VWRU5UQTsKLQotLy8gMjAvNDAgdHJpZ2dlciBldmVudCB0YWJsZQotLy8gSWYgb25lIEV2ZW50IEEgZGVsZXRlIG9yIGNyZWF0ZWQsIG9yIGlmIEV2ZW50IEIgaXMgZGV0ZWN0ZWQgb3Igbm90IGRldGVjdGVkLCBTVEEgc2hvdWxkIHNlbmQgMjA0MEJTU0NvZXhpc3RlbmNlIHRvIEFQLgorLyogMjAvNDAgdHJpZ2dlciBldmVudCB0YWJsZSAqLworLyogSWYgb25lIEV2ZW50IEEgZGVsZXRlIG9yIGNyZWF0ZWQsIG9yIGlmIEV2ZW50IEIgaXMgZGV0ZWN0ZWQgb3Igbm90IGRldGVjdGVkLCBTVEEgc2hvdWxkIHNlbmQgMjA0MEJTU0NvZXhpc3RlbmNlIHRvIEFQLiAqLwogI2RlZmluZSBNQVhfVFJJR0dFUl9FVkVOVAkJNjQKLXR5cGVkZWYgc3RydWN0ICBfVFJJR0dFUl9FVkVOVF9UQUJ7Ci0JVUNIQVIJRXZlbnRBTm87Ci0JVFJJR0dFUl9FVkVOVEEJRXZlbnRBW01BWF9UUklHR0VSX0VWRU5UXTsKLQlVTE9ORwkJCUV2ZW50QkNvdW50RG93bjsJLy8gQ291bnQgZG93biBjb3VudGVyIGZvciBFdmVudCBCLgotfSBUUklHR0VSX0VWRU5UX1RBQiwgKlBUUklHR0VSX0VWRU5UX1RBQjsKK3N0cnVjdCBydF90cmlnZ2VyX2V2ZW50X3RhYiB7CisJdTggRXZlbnRBTm87CisJc3RydWN0IHJ0X3RyaWdnZXJfZXZlbnRhIEV2ZW50QVtNQVhfVFJJR0dFUl9FVkVOVF07CisJdW5zaWduZWQgbG9uZyBFdmVudEJDb3VudERvd247CS8qIENvdW50IGRvd24gY291bnRlciBmb3IgRXZlbnQgQi4gKi8KK307CiAKLS8vIDcuMy4yNyAyMC80MCBCc3MgQ29leGlzdGVuY2UgTWdtdCBjYXBhYmlsaXR5IHVzZWQgaW4gZXh0ZW5kZWQgY2FwYWJpbGl0aWVzIGluZm9ybWF0aW9uIElFKCBJRCA9IDEyNyA9IElFX0VYVF9DQVBBQklMSVRZKS4KLS8vCVRoaXMgaXMgdGhlIGZpcnN0IG9jdGV0IGFuZCB3YXMgZGVmaW5lZCBpbiA4MDIuMTFuIEQzLjAzIGFuZCA4MDIuMTF5RDkuMAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9FWFRfQ0FQX0lORk9fRUxFTUVOVHsKLQlVQ0hBUglCc3NDb2V4aXN0TWdtdFN1cHBvcnQ6MTsKLQlVQ0hBUglyc3Y6MTsKLQlVQ0hBUglFeHRlbmRDaGFubmVsU3dpdGNoOjE7Ci0JVUNIQVIJcnN2Mjo1OwotfUVYVF9DQVBfSU5GT19FTEVNRU5ULCAqUEVYVF9DQVBfSU5GT19FTEVNRU5UOworLyogNy4zLjI3IDIwLzQwIEJzcyBDb2V4aXN0ZW5jZSBNZ210IGNhcGFiaWxpdHkgdXNlZCBpbiBleHRlbmRlZCBjYXBhYmlsaXRpZXMgaW5mb3JtYXRpb24gSUUoIElEID0gMTI3ID0gSUVfRVhUX0NBUEFCSUxJVFkpLiAqLworLyogICAgICBUaGlzIGlzIHRoZSBmaXJzdCBvY3RldCBhbmQgd2FzIGRlZmluZWQgaW4gODAyLjExbiBEMy4wMyBhbmQgODAyLjExeUQ5LjAgKi8KK3N0cnVjdCBQQUNLRUQgcnRfZXh0X2NhcF9pbmZvX2VsZW1lbnQgeworCXU4IEJzc0NvZXhpc3RNZ210U3VwcG9ydDoxOworCXU4IHJzdjoxOworCXU4IEV4dGVuZENoYW5uZWxTd2l0Y2g6MTsKKwl1OCByc3YyOjU7Cit9OwogCisvKiA4MDIuMTFuIDcuMy4yLjYxICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2Jzc18yMDQwX2NvZXhpc3RfZWxlbWVudCB7CisJdTggRWxlbWVudElEOwkvKiBJRCA9IElFXzIwNDBfQlNTX0NPRVhJU1QgPSA3MiAqLworCXU4IExlbjsKKwlCU1NfMjA0MF9DT0VYSVNUX0lFIEJzc0NvZXhpc3RJZTsKK307CiAKLS8vIDgwMi4xMW4gNy4zLjIuNjEKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UewotCVVDSEFSCQkJCQlFbGVtZW50SUQ7CQkvLyBJRCA9IElFXzIwNDBfQlNTX0NPRVhJU1QgPSA3MgotCVVDSEFSCQkJCQlMZW47Ci0JQlNTXzIwNDBfQ09FWElTVF9JRQkJQnNzQ29leGlzdEllOwotfUJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVCwgKlBCU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQ7CisvKjgwMi4xMW4gNy4zLjIuNTkgKi8KK3N0cnVjdCBQQUNLRUQgcnRfYnNzXzIwNDBfaW50b2xlcmFudF9jaF9yZXBvcnQgeworCXU4IEVsZW1lbnRJRDsJLyogSUQgPSBJRV8yMDQwX0JTU19JTlRPTEVSQU5UX1JFUE9SVCA9IDczICovCisJdTggTGVuOworCXU4IFJlZ3VsYXRvcnlDbGFzczsKKwl1OCBDaExpc3RbMF07Cit9OwogCisvKiBUaGUgc3RydWN0dXJlIGZvciBjaGFubmVsIHN3aXRjaCBhbm5vdWNlbWVudCBJRS4gVGhpcyBpcyBpbiA4MDIuMTFuIEQzLjAzICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2NoYV9zd2l0Y2hfYW5ub3VuY2VfaWUgeworCXU4IFN3aXRjaE1vZGU7CS8qY2hhbm5lbCBzd2l0Y2ggbW9kZSAqLworCXU4IE5ld0NoYW5uZWw7CS8qICovCisJdTggU3dpdGNoQ291bnQ7CS8qICovCit9OwogCi0vLzgwMi4xMW4gNy4zLjIuNTkKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlR7Ci0JVUNIQVIJCQkJRWxlbWVudElEOwkJLy8gSUQgPSBJRV8yMDQwX0JTU19JTlRPTEVSQU5UX1JFUE9SVCA9IDczCi0JVUNIQVIJCQkJTGVuOwotCVVDSEFSCQkJCVJlZ3VsYXRvcnlDbGFzczsKLQlVQ0hBUgkJCQlDaExpc3RbMF07Ci19QlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQsICpQQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQ7CisvKiBUaGUgc3RydWN0dXJlIGZvciBjaGFubmVsIHN3aXRjaCBhbm5vdWNlbWVudCBJRS4gVGhpcyBpcyBpbiA4MDIuMTFuIEQzLjAzICovCitzdHJ1Y3QgUEFDS0VEIHJ0X3NlY19jaGFfb2Zmc2V0X2llIHsKKwl1OCBTZWNvbmRhcnlDaGFubmVsT2Zmc2V0OwkvKiAxOiBTZWNvbmRhcnkgYWJvdmUsIDM6IFNlY29uZGFyeSBiZWxvdywgMDogbm8gU2Vjb25kYXJ5ICovCit9OwogCisvKiBUaGlzIHN0cnVjdHVyZSBpcyBleHRyYWN0ZWQgZnJvbSBzdHJ1Y3Qgc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHkgKi8KK3N0cnVjdCBydF9odF9waHlfaW5mbyB7CisJQk9PTEVBTiBiSHRFbmFibGU7CS8qIElmIHdlIHNob3VsZCB1c2UgaHQgcmF0ZS4gKi8KKwlCT09MRUFOIGJQcmVOSHQ7CS8qIElmIHdlIHNob3VsZCB1c2UgaHQgcmF0ZS4gKi8KKwkvKlN1YnN0cmFjdCBmcm9tIEhUIENhcGFiaWxpdHkgSUUgKi8KKwl1OCBNQ1NTZXRbMTZdOworfTsKIAotLy8gVGhlIHN0cnVjdHVyZSBmb3IgY2hhbm5lbCBzd2l0Y2ggYW5ub3VjZW1lbnQgSUUuIFRoaXMgaXMgaW4gODAyLjExbiBEMy4wMwotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9DSEFfU1dJVENIX0FOTk9VTkNFX0lFewotCVVDSEFSCQkJU3dpdGNoTW9kZTsJLy9jaGFubmVsIHN3aXRjaCBtb2RlCi0JVUNIQVIJCQlOZXdDaGFubmVsOwkvLwotCVVDSEFSCQkJU3dpdGNoQ291bnQ7CS8vCi19IENIQV9TV0lUQ0hfQU5OT1VOQ0VfSUUsICpQQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRTsKKy8qVGhpcyBzdHJ1Y3R1cmUgc3Vic3RyYWN0cyByYWxpbmsgc3VwcG9ydHMgZnJvbSBhbGwgODAyLjExbi1yZWxhdGVkIGZlYXR1cmVzLiAqLworLypGZWF0dXJlcyBub3QgbGlzdGVkIGhlcmUgYnV0IGNvbnRhaW5lZCBpbiA4MDIuMTFuIHNwZWMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gcnQyODYwLiAqLworc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHkgeworCXUxNiBDaGFubmVsV2lkdGg6MTsKKwl1MTYgTWltb1BzOjI7CS8qbWltbyBwb3dlciBzYWZlIE1NUFNfICovCisJdTE2IEdGOjE7CQkvKmdyZWVuIGZpZWxkICovCisJdTE2IFNob3J0R0lmb3IyMDoxOworCXUxNiBTaG9ydEdJZm9yNDA6MTsJLypmb3I0ME1IeiAqLworCXUxNiBUeFNUQkM6MTsKKwl1MTYgUnhTVEJDOjI7CS8qIDIgYml0cyAqLworCXUxNiBBbXNkdUVuYWJsZToxOwkvKiBFbmFibGUgdG8gdHJhbnNtaXQgQS1NU0RVLiBTdWdnZXN0IGRpc2FibGUuIFdlIHNob3VsZCB1c2UgQS1NUERVIHRvIGdhaW4gYmVzdCBiZW5pZml0IG9mIDgwMi4xMW4gKi8KKwl1MTYgQW1zZHVTaXplOjE7CS8qIE1heCByZWNlaXZpbmcgQS1NU0RVIHNpemUgKi8KKwl1MTYgcnN2OjU7CiAKKwkvKlN1YnN0cmFjdCBmcm9tIEFkZGlvbnQgSFQgSU5GTyBJRSAqLworCXU4IE1heFJBbXBkdUZhY3RvcjoyOworCXU4IE1wZHVEZW5zaXR5OjM7CisJdTggRXh0Q2hhbk9mZnNldDoyOwkvKiBQbGVhc2Ugbm90IHRoZSBkaWZmZXJlbmNlIHdpdGggZm9sbG93aW5nICAgICB1OCAgIE5ld0V4dENoYW5uZWxPZmZzZXQ7IGZyb20gODAyLjExbiAqLworCXU4IFJlY29tV2lkdGg6MTsKIAotLy8gVGhlIHN0cnVjdHVyZSBmb3IgY2hhbm5lbCBzd2l0Y2ggYW5ub3VjZW1lbnQgSUUuIFRoaXMgaXMgaW4gODAyLjExbiBEMy4wMwotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9TRUNfQ0hBX09GRlNFVF9JRXsKLQlVQ0hBUgkJCVNlY29uZGFyeUNoYW5uZWxPZmZzZXQ7CSAvLyAxOiBTZWNvbmRhcnkgYWJvdmUsIDM6IFNlY29uZGFyeSBiZWxvdywgMDogbm8gU2Vjb25kYXJ5Ci19IFNFQ19DSEFfT0ZGU0VUX0lFLCAqUFNFQ19DSEFfT0ZGU0VUX0lFOworCXUxNiBPcGVyYWlvbk1vZGU6MjsKKwl1MTYgTm9uR2ZQcmVzZW50OjE7CisJdTE2IHJzdjM6MTsKKwl1MTYgT0JTU19Ob25IVEV4aXN0OjE7CisJdTE2IHJzdjI6MTE7CiAKKwkvKiBOZXcgRXh0ZW5zaW9uIENoYW5uZWwgT2Zmc2V0IElFICovCisJdTggTmV3RXh0Q2hhbm5lbE9mZnNldDsKKwkvKiBFeHRlbnNpb24gQ2FwYWJpbGl0eSBJRSA9IDEyNyAqLworCXU4IEJTU0NvZXhpc3QyMDQwOworfTsKIAotLy8gVGhpcyBzdHJ1Y3R1cmUgaXMgZXh0cmFjdGVkIGZyb20gc3RydWN0IFJUX0hUX0NBUEFCSUxJVFkKLXR5cGVkZWYgc3RydWN0IHsKLQlCT09MRUFOCQkJYkh0RW5hYmxlOwkgLy8gSWYgd2Ugc2hvdWxkIHVzZSBodCByYXRlLgotCUJPT0xFQU4JCQliUHJlTkh0OwkgLy8gSWYgd2Ugc2hvdWxkIHVzZSBodCByYXRlLgotCS8vU3Vic3RyYWN0IGZyb20gSFQgQ2FwYWJpbGl0eSBJRQotCVVDSEFSCQkJTUNTU2V0WzE2XTsJLy9vbmx5IHN1cG9vcnQgTUNTPTAtMTUsMzIgLAotfSBSVF9IVF9QSFlfSU5GTywgKlBSVF9IVF9QSFlfSU5GTzsKKy8qICAgZmllbGQgaW4gQWRkdGlvbmFsIEhUIEluZm9ybWF0aW9uIElFIC4gKi8KK3N0cnVjdCBQQUNLRUQgcnRfYWRkX2h0aW5mbyB7CisJdTggRXh0Q2hhbk9mZnNldDoyOworCXU4IFJlY29tV2lkdGg6MTsKKwl1OCBSaWZzTW9kZToxOworCXU4IFNfUFNNUFN1cDoxOwkvKkluZGljYXRlIHN1cHBvcnQgZm9yIHNjaGVkdWxlZCBQU01QICovCisJdTggU2VySW50ZXJHcmFudTozOwkvKnNlcnZpY2UgaW50ZXJ2YWwgZ3JhbnVsYXJpdHkgKi8KK307CiAKLS8vVGhpcyBzdHJ1Y3R1cmUgc3Vic3RyYWN0cyByYWxpbmsgc3VwcG9ydHMgZnJvbSBhbGwgODAyLjExbi1yZWxhdGVkIGZlYXR1cmVzLgotLy9GZWF0dXJlcyBub3QgbGlzdGVkIGhlcmUgYnV0IGNvbnRhaW5lZCBpbiA4MDIuMTFuIHNwZWMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gcnQyODYwLgotdHlwZWRlZiBzdHJ1Y3QgewotCVVTSE9SVAlDaGFubmVsV2lkdGg6MTsKLQlVU0hPUlQJTWltb1BzOjI7Ly9taW1vIHBvd2VyIHNhZmUgTU1QU18KLQlVU0hPUlQJR0Y6MTsJLy9ncmVlbiBmaWVsZAotCVVTSE9SVAlTaG9ydEdJZm9yMjA6MTsKLQlVU0hPUlQJU2hvcnRHSWZvcjQwOjE7CS8vZm9yNDBNSHoKLQlVU0hPUlQJVHhTVEJDOjE7Ci0JVVNIT1JUCVJ4U1RCQzoyOwkvLyAyIGJpdHMKLQlVU0hPUlQJQW1zZHVFbmFibGU6MTsJLy8gRW5hYmxlIHRvIHRyYW5zbWl0IEEtTVNEVS4gU3VnZ2VzdCBkaXNhYmxlLiBXZSBzaG91bGQgdXNlIEEtTVBEVSB0byBnYWluIGJlc3QgYmVuaWZpdCBvZiA4MDIuMTFuCi0JVVNIT1JUCUFtc2R1U2l6ZToxOwkvLyBNYXggcmVjZWl2aW5nIEEtTVNEVSBzaXplCi0JVVNIT1JUCXJzdjo1Oworc3RydWN0IFBBQ0tFRCBydF9hZGRfaHRpbmZvMiB7CisJdTE2IE9wZXJhaW9uTW9kZToyOworCXUxNiBOb25HZlByZXNlbnQ6MTsKKwl1MTYgcnN2OjE7CisJdTE2IE9CU1NfTm9uSFRFeGlzdDoxOworCXUxNiByc3YyOjExOworfTsKIAotCS8vU3Vic3RyYWN0IGZyb20gQWRkaW9udCBIVCBJTkZPIElFCi0JVUNIQVIJTWF4UkFtcGR1RmFjdG9yOjI7Ci0JVUNIQVIJTXBkdURlbnNpdHk6MzsKLQlVQ0hBUglFeHRDaGFuT2Zmc2V0OjI7CS8vIFBsZWFzZSBub3QgdGhlIGRpZmZlcmVuY2Ugd2l0aCBmb2xsb3dpbmcgCVVDSEFSCU5ld0V4dENoYW5uZWxPZmZzZXQ7IGZyb20gODAyLjExbgotCVVDSEFSCVJlY29tV2lkdGg6MTsKLQotCVVTSE9SVAlPcGVyYWlvbk1vZGU6MjsKLQlVU0hPUlQJTm9uR2ZQcmVzZW50OjE7Ci0JVVNIT1JUCXJzdjM6MTsKLQlVU0hPUlQJT0JTU19Ob25IVEV4aXN0OjE7Ci0JVVNIT1JUCXJzdjI6MTE7Ci0KLQkvLyBOZXcgRXh0ZW5zaW9uIENoYW5uZWwgT2Zmc2V0IElFCi0JVUNIQVIJTmV3RXh0Q2hhbm5lbE9mZnNldDsKLQkvLyBFeHRlbnNpb24gQ2FwYWJpbGl0eSBJRSA9IDEyNwotCVVDSEFSCUJTU0NvZXhpc3QyMDQwOwotfSBSVF9IVF9DQVBBQklMSVRZLCAqUFJUX0hUX0NBUEFCSUxJVFk7Ci0KLS8vICAgZmllbGQgaW4gQWRkdGlvbmFsIEhUIEluZm9ybWF0aW9uIElFIC4KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0JVUNIQVIJRXh0Q2hhbk9mZnNldDoyOwotCVVDSEFSCVJlY29tV2lkdGg6MTsKLQlVQ0hBUglSaWZzTW9kZToxOwotCVVDSEFSCVNfUFNNUFN1cDoxOwkgLy9JbmRpY2F0ZSBzdXBwb3J0IGZvciBzY2hlZHVsZWQgUFNNUAotCVVDSEFSCVNlckludGVyR3JhbnU6MzsJIC8vc2VydmljZSBpbnRlcnZhbCBncmFudWxhcml0eQotfSBBRERfSFRJTkZPLCAqUEFERF9IVElORk87Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRHsKLQlVU0hPUlQJT3BlcmFpb25Nb2RlOjI7Ci0JVVNIT1JUCU5vbkdmUHJlc2VudDoxOwotCVVTSE9SVAlyc3Y6MTsKLQlVU0hPUlQJT0JTU19Ob25IVEV4aXN0OjE7Ci0JVVNIT1JUCXJzdjI6MTE7Ci19IEFERF9IVElORk8yLCAqUEFERF9IVElORk8yOwotCi0KLS8vIFRPRE86IE5lZWQgc3luYyB3aXRoIHNwZWMgYWJvdXQgdGhlIGRlZmluaXRpb24gb2YgU3RiY01jcy4gSW4gRHJhZnQgMy4wMywgaXQncyByZXNlcnZlZC4KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRHsKLQlVU0hPUlQJU3RiY01jczo2OwotCVVTSE9SVAlEdWFsQmVhY29uOjE7Ci0JVVNIT1JUCUR1YWxDVFNQcm90ZWN0OjE7Ci0JVVNIT1JUCVNUQkNCZWFjb246MTsKLQlVU0hPUlQJTHNpZ1R4b3BQcm90OjE7CS8vIEwtU0lHIFRYT1AgcHJvdGVjdGlvbiBmdWxsIHN1cHBvcnQKLQlVU0hPUlQJUGNvQWN0aXZlOjE7Ci0JVVNIT1JUCVBjb1BoYXNlOjE7Ci0JVVNIT1JUCXJzdjo0OwotfSBBRERfSFRJTkZPMywgKlBBRERfSFRJTkZPMzsKKy8qIFRPRE86IE5lZWQgc3luYyB3aXRoIHNwZWMgYWJvdXQgdGhlIGRlZmluaXRpb24gb2YgU3RiY01jcy4gSW4gRHJhZnQgMy4wMywgaXQncyByZXNlcnZlZC4gKi8KK3N0cnVjdCBQQUNLRUQgcnRfYWRkX2h0aW5mbzMgeworCXUxNiBTdGJjTWNzOjY7CisJdTE2IER1YWxCZWFjb246MTsKKwl1MTYgRHVhbENUU1Byb3RlY3Q6MTsKKwl1MTYgU1RCQ0JlYWNvbjoxOworCXUxNiBMc2lnVHhvcFByb3Q6MTsJLyogTC1TSUcgVFhPUCBwcm90ZWN0aW9uIGZ1bGwgc3VwcG9ydCAqLworCXUxNiBQY29BY3RpdmU6MTsKKwl1MTYgUGNvUGhhc2U6MTsKKwl1MTYgcnN2OjQ7Cit9OwogCiAjZGVmaW5lIFNJWkVfQUREX0hUX0lORk9fSUUJCTIyCi10eXBlZGVmIHN0cnVjdCAgUEFDS0VEewotCVVDSEFSCQkJCUNvbnRyb2xDaGFuOwotCUFERF9IVElORk8JCQlBZGRIdEluZm87Ci0JQUREX0hUSU5GTzIJCQlBZGRIdEluZm8yOwotCUFERF9IVElORk8zCQkJQWRkSHRJbmZvMzsKLQlVQ0hBUgkJCQlNQ1NTZXRbMTZdOwkJLy8gQmFzaWMgTUNTIHNldAotfSBBRERfSFRfSU5GT19JRSwgKlBBRERfSFRfSU5GT19JRTsKK3N0cnVjdCBQQUNLRUQgcnRfYWRkX2h0X2luZm9faWUgeworCXU4IENvbnRyb2xDaGFuOworCXN0cnVjdCBydF9hZGRfaHRpbmZvIEFkZEh0SW5mbzsKKwlzdHJ1Y3QgcnRfYWRkX2h0aW5mbzIgQWRkSHRJbmZvMjsKKwlzdHJ1Y3QgcnRfYWRkX2h0aW5mbzMgQWRkSHRJbmZvMzsKKwl1OCBNQ1NTZXRbMTZdOwkvKiBCYXNpYyBNQ1Mgc2V0ICovCit9OwogCi10eXBlZGVmIHN0cnVjdCAgUEFDS0VEewotCVVDSEFSCQkJCU5ld0V4dENoYW5PZmZzZXQ7Ci19IE5FV19FWFRfQ0hBTl9JRSwgKlBORVdfRVhUX0NIQU5fSUU7CitzdHJ1Y3QgUEFDS0VEIHJ0X25ld19leHRfY2hhbl9pZSB7CisJdTggTmV3RXh0Q2hhbk9mZnNldDsKK307CiAKK3N0cnVjdCBQQUNLRUQgcnRfZnJhbWVfODAyXzExIHsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBIZHI7CisJdTggT2N0ZXRbMV07Cit9OwogCi0vLyA0LWJ5dGUgSFRDIGZpZWxkLiAgbWF5YmUgaW5jbHVkZWQgaW4gYW55IGZyYW1lIGV4Y2VwdCBub24tUU9TIGRhdGEgZnJhbWUuICBUaGUgT3JkZXIgYml0IG11c3Qgc2V0IDEuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotICAgIFVJTlQzMgkJTUE6MTsJLy9tYW5hZ2VtZW50IGFjdGlvbiBwYXlsb2FkIGV4aXN0IGluIChRb1MgTnVsbCtIVEMpCi0gICAgVUlOVDMyCQlUUlE6MTsJLy9zb3VuZGluZyByZXF1ZXN0Ci0gICAgVUlOVDMyCQlNUlE6MTsJLy9NQ1MgZmVlZGJhY2suIFJlcXVlc3QgZm9yIGEgTUNTIGZlZWRiYWNrCi0gICAgVUlOVDMyCQlNUlNvckFTSTozOwkvLyBNUlEgU2VxdWVuY2UgaWRlbnRpZmllci4gdW5jaGFuZ2VkIGR1cmluZyBlbnRpcmUgcHJvY2VkdXJlLiAweDAwMC0weDExMC4KLSAgICBVSU5UMzIJCU1GUzozOwkvL1NFVCB0byB0aGUgcmVjZWl2ZWQgdmFsdWUgb2YgTVJTLiAweDExMSBmb3IgdW5zb2xpY2l0ZWQgTUZCLgotICAgIFVJTlQzMgkJTUZCb3JBU0M6NzsJLy9MaW5rIGFkYXB0YXRpb24gZmVlZGJhY2sgY29udGFpbmluZyByZWNvbW1lbmRlZCBNQ1MuIDB4N2YgZm9yIG5vIGZlZWRiYWNrIG9yIG5vdCBhdmFpbGFibGUKLSAgICBVSU5UMzIJCUNhbFBvczoyOwkvLyBjYWxpYnJhdGlvbiBwb3NpdGlvbgotICAgIFVJTlQzMgkJQ2FsU2VxOjI7ICAvL2NhbGlicmF0aW9uIHNlcXVlbmNlCi0gICAgVUlOVDMyCQlGQktSZXE6MjsJLy9mZWVkYmFjayByZXF1ZXN0Ci0gICAgVUlOVDMyCQlDU0lTVEVFUklORzoyOwkvL0NTSS8gU1RFRVJJTkcKLSAgICBVSU5UMzIJCVpMRkFubm91Y2U6MTsJLy8gWkxGIGFubm91bmNlbWVudAotICAgIFVJTlQzMgkJcnN2OjU7ICAvL2NhbGlicmF0aW9uIHNlcXVlbmNlCi0gICAgVUlOVDMyCQlBQ0NvbnN0cmFpbnQ6MTsJLy9mZWVkYmFjayByZXF1ZXN0Ci0gICAgVUlOVDMyCQlSREc6MTsJLy9SREcgLyBNb3JlIFBQRFUKLX0gSFRfQ09OVFJPTCwgKlBIVF9DT05UUk9MOworLyogUW9TTnVsbCBlbWJlZGRpbmcgb2YgbWFuYWdlbWVudCBhY3Rpb24uIFdoZW4gSFQgQ29udHJvbCBNQSBmaWVsZCBzZXQgdG8gMS4gKi8KK3N0cnVjdCBQQUNLRUQgcnRfbWFfYm9keSB7CisJdTggQ2F0ZWdvcnk7CisJdTggQWN0aW9uOworCXU4IE9jdGV0WzFdOworfTsKIAotLy8gMi1ieXRlIFFPUyBDT05UUk9MIGZpZWxkCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotICAgIFVTSE9SVCAgICAgIFRJRDo0OwotICAgIFVTSE9SVCAgICAgIEVPU1A6MTsKLSAgICBVU0hPUlQgICAgICBBY2tQb2xpY3k6MjsgIC8vMDogbm9ybWFsIEFDSyAxOk5vIEFDSyAyOnNjaGVkdWxlZCB1bmRlciBNVEJBL1BTTVAgIDM6IEJBCi0gICAgVVNIT1JUICAgICAgQU1zZHVQcmVzZW50OjE7Ci0gICAgVVNIT1JUICAgICAgVHhvcF9RdWV1ZVNpemU6ODsKLX0gUU9TX0NPTlRST0wsICpQUU9TX0NPTlRST0w7CitzdHJ1Y3QgUEFDS0VEIHJ0X2hlYWRlcl84MDJfMyB7CisJdTggREFBZGRyMVtNQUNfQUREUl9MRU5dOworCXU4IFNBQWRkcjJbTUFDX0FERFJfTEVOXTsKKwl1OCBPY3RldFsyXTsKK307CisvKi8vQmxvY2sgQUNLIHJlbGF0ZWQgZm9ybWF0ICovCisvKiAyLWJ5dGUgQkEgUGFyYW1ldGVyICBmaWVsZCAgaW4gICAgICAgREVMQkEgZnJhbWVzIHRvIHRlcm1pbmF0ZSBhbiBhbHJlYWR5IHNldCB1cCBiQSAqLworc3RydWN0IFBBQ0tFRCBydF9kZWxiYV9wYXJtIHsKKwl1MTYgUnN2OjExOwkJLyogYWx3YXlzIHNldCB0byAwICovCisJdTE2IEluaXRpYXRvcjoxOwkvKiAxOiBvcmlnaW5hdG9yICAgIDA6cmVjaXBpZW50ICovCisJdTE2IFRJRDo0OwkJLyogdmFsdWUgb2YgVEMgb3MgVFMgKi8KK307CiAKLS8vIDItYnl0ZSBGcmFtZSBjb250cm9sIGZpZWxkCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgewotCVVTSE9SVAkJVmVyOjI7CQkJCS8vIFByb3RvY29sIHZlcnNpb24KLQlVU0hPUlQJCVR5cGU6MjsJCQkJLy8gTVNEVSB0eXBlCi0JVVNIT1JUCQlTdWJUeXBlOjQ7CQkJLy8gTVNEVSBzdWJ0eXBlCi0JVVNIT1JUCQlUb0RzOjE7CQkJCS8vIFRvIERTIGluZGljYXRpb24KLQlVU0hPUlQJCUZyRHM6MTsJCQkJLy8gRnJvbSBEUyBpbmRpY2F0aW9uCi0JVVNIT1JUCQlNb3JlRnJhZzoxOwkJCS8vIE1vcmUgZnJhZ21lbnQgYml0Ci0JVVNIT1JUCQlSZXRyeToxOwkJCS8vIFJldHJ5IHN0YXR1cyBiaXQKLQlVU0hPUlQJCVB3ck1nbXQ6MTsJCQkvLyBQb3dlciBtYW5hZ2VtZW50IGJpdAotCVVTSE9SVAkJTW9yZURhdGE6MTsJCQkvLyBNb3JlIGRhdGEgYml0Ci0JVVNIT1JUCQlXZXA6MTsJCQkJLy8gV2VwIGRhdGEKLQlVU0hPUlQJCU9yZGVyOjE7CQkJLy8gU3RyaWN0IG9yZGVyIGV4cGVjdGVkCi19IEZSQU1FX0NPTlRST0wsICpQRlJBTUVfQ09OVFJPTDsKKy8qIDItYnl0ZSBCQSBQYXJhbWV0ZXIgU2V0IGZpZWxkICBpbiBBRERCQSBmcmFtZXMgdG8gc2lnbmFsIHBhcm0gZm9yIHNldHRpbmcgdXAgYSBCQSAqLworc3RydWN0IFBBQ0tFRCBydF9iYV9wYXJtIHsKKwl1MTYgQU1TRFVTdXBwb3J0ZWQ6MTsJLyogMDogbm90IHBlcm1pdHRlZCAgICAgICAgICAgICAxOiBwZXJtaXR0ZWQgKi8KKwl1MTYgQkFQb2xpY3k6MTsJLyogMTogaW1tZWRpYXRlbHkgQkEgICAgMDpkZWxheWVkIEJBICovCisJdTE2IFRJRDo0OwkJLyogdmFsdWUgb2YgVEMgb3MgVFMgKi8KKwl1MTYgQnVmU2l6ZToxMDsJLyogbnVtYmVyIG9mIGJ1ZmZlIG9mIHNpemUgMjMwNCBvY3RldHNyICovCit9OwogCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgX0hFQURFUl84MDJfMTEJewotICAgIEZSQU1FX0NPTlRST0wgICBGQzsKLSAgICBVU0hPUlQgICAgICAgICAgRHVyYXRpb247Ci0gICAgVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07Ci0gICAgVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07Ci0JVUNIQVIJCQlBZGRyM1tNQUNfQUREUl9MRU5dOwotCVVTSE9SVAkJCUZyYWc6NDsKLQlVU0hPUlQJCQlTZXF1ZW5jZToxMjsKLQlVQ0hBUgkJCU9jdGV0WzBdOwotfQlIRUFERVJfODAyXzExLCAqUEhFQURFUl84MDJfMTE7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfODAyXzExIHsKLSAgICBIRUFERVJfODAyXzExICAgSGRyOwotICAgIFVDSEFSICAgICAgICAgICAgT2N0ZXRbMV07Ci19ICAgRlJBTUVfODAyXzExLCAqUEZSQU1FXzgwMl8xMTsKLQotLy8gUW9TTnVsbCBlbWJlZGRpbmcgb2YgbWFuYWdlbWVudCBhY3Rpb24uIFdoZW4gSFQgQ29udHJvbCBNQSBmaWVsZCBzZXQgdG8gMS4KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUFfQk9EWSB7Ci0gICAgVUNIQVIgICAgICAgICAgICBDYXRlZ29yeTsKLSAgICBVQ0hBUiAgICAgICAgICAgIEFjdGlvbjsKLSAgICBVQ0hBUiAgICAgICAgICAgIE9jdGV0WzFdOwotfSAgIE1BX0JPRFksICpQTUFfQk9EWTsKLQotdHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9IRUFERVJfODAyXzMJewotICAgIFVDSEFSICAgICAgICAgICBEQUFkZHIxW01BQ19BRERSX0xFTl07Ci0gICAgVUNIQVIgICAgICAgICAgIFNBQWRkcjJbTUFDX0FERFJfTEVOXTsKLSAgICBVQ0hBUiAgICAgICAgICAgT2N0ZXRbMl07Ci19CUhFQURFUl84MDJfMywgKlBIRUFERVJfODAyXzM7Ci0vLy8vQmxvY2sgQUNLIHJlbGF0ZWQgZm9ybWF0Ci0vLyAyLWJ5dGUgQkEgUGFyYW1ldGVyICBmaWVsZCAgaW4gCURFTEJBIGZyYW1lcyB0byB0ZXJtaW5hdGUgYW4gYWxyZWFkeSBzZXQgdXAgYkEKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRHsKLSAgICBVU0hPUlQgICAgICBSc3Y6MTE7CS8vIGFsd2F5cyBzZXQgdG8gMAotICAgIFVTSE9SVCAgICAgIEluaXRpYXRvcjoxOwkvLyAxOiBvcmlnaW5hdG9yICAgIDA6cmVjaXBpZW50Ci0gICAgVVNIT1JUICAgICAgVElEOjQ7CS8vIHZhbHVlIG9mIFRDIG9zIFRTCi19IERFTEJBX1BBUk0sICpQREVMQkFfUEFSTTsKLQotLy8gMi1ieXRlIEJBIFBhcmFtZXRlciBTZXQgZmllbGQgIGluIEFEREJBIGZyYW1lcyB0byBzaWduYWwgcGFybSBmb3Igc2V0dGluZyB1cCBhIEJBCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotICAgIFVTSE9SVCAgICAgIEFNU0RVU3VwcG9ydGVkOjE7CS8vIDA6IG5vdCBwZXJtaXR0ZWQJCTE6IHBlcm1pdHRlZAotICAgIFVTSE9SVCAgICAgIEJBUG9saWN5OjE7CS8vIDE6IGltbWVkaWF0ZWx5IEJBICAgIDA6ZGVsYXllZCBCQQotICAgIFVTSE9SVCAgICAgIFRJRDo0OwkvLyB2YWx1ZSBvZiBUQyBvcyBUUwotICAgIFVTSE9SVCAgICAgIEJ1ZlNpemU6MTA7CS8vIG51bWJlciBvZiBidWZmZSBvZiBzaXplIDIzMDQgb2N0ZXRzcgotfSBCQV9QQVJNLCAqUEJBX1BBUk07Ci0KLS8vIDItYnl0ZSBCQSBTdGFydGluZyBTZXEgQ09OVFJPTCBmaWVsZAotdHlwZWRlZiB1bmlvbiBQQUNLRUQgewotICAgIHN0cnVjdCBQQUNLRUQgewotICAgIFVTSE9SVCAgICAgIEZyYWdOdW06NDsJLy8gYWx3YXlzIHNldCB0byAwCi0JVVNIT1JUICAgICAgU3RhcnRTZXE6MTI7ICAgLy8gc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSAxc3QgTVNEVSBmb3Igd2hpY2ggdGhpcyBCQVIgaXMgc2VudAotICAgIH0gICBmaWVsZDsKLSAgICBVU0hPUlQgICAgICAgICAgIHdvcmQ7CisvKiAyLWJ5dGUgQkEgU3RhcnRpbmcgU2VxIENPTlRST0wgZmllbGQgKi8KK3R5cGVkZWYgdW5pb24gUEFDS0VEIF9CQVNFUV9DT05UUk9MIHsKKwlzdHJ1Y3QgUEFDS0VEIHsKKwkJdTE2IEZyYWdOdW06NDsJLyogYWx3YXlzIHNldCB0byAwICovCisJCXUxNiBTdGFydFNlcToxMjsJLyogc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSAxc3QgTVNEVSBmb3Igd2hpY2ggdGhpcyBCQVIgaXMgc2VudCAqLworCX0gZmllbGQ7CisJdTE2IHdvcmQ7CiB9IEJBU0VRX0NPTlRST0wsICpQQkFTRVFfQ09OVFJPTDsKIAotLy9CQUNvbnRyb2wgYW5kIEJBUkNvbnRyb2wgYXJlIHRoZSBzYW1lCi0vLyAyLWJ5dGUgQkEgQ09OVFJPTCBmaWVsZCBpbiBCQSBmcmFtZQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKLSAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsgLy8gb25seSByZWxhdGVkIHRvIE4tRGVsYXllZCBCQS4gQnV0IG5vdCBzdXBwb3J0IGluIFJUMjg2MGIuIDA6Tm9ybWFsQUNLICAxOk5vIEFDSwotICAgIFVTSE9SVCAgICAgIE1USUQ6MTsJCS8vRVdDIFYxLjI0Ci0gICAgVVNIT1JUICAgICAgQ29tcHJlc3NlZDoxOwotICAgIFVTSE9SVCAgICAgIFJzdjo5OwotICAgIFVTSE9SVCAgICAgIFRJRDo0OwotfSBCQV9DT05UUk9MLCAqUEJBX0NPTlRST0w7CisvKkJBQ29udHJvbCBhbmQgQkFSQ29udHJvbCBhcmUgdGhlIHNhbWUgKi8KKy8qIDItYnl0ZSBCQSBDT05UUk9MIGZpZWxkIGluIEJBIGZyYW1lICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2JhX2NvbnRyb2wgeworCXUxNiBBQ0tQb2xpY3k6MTsJLyogb25seSByZWxhdGVkIHRvIE4tRGVsYXllZCBCQS4gQnV0IG5vdCBzdXBwb3J0IGluIFJUMjg2MGIuIDA6Tm9ybWFsQUNLICAxOk5vIEFDSyAqLworCXUxNiBNVElEOjE7CQkvKkVXQyBWMS4yNCAqLworCXUxNiBDb21wcmVzc2VkOjE7CisJdTE2IFJzdjo5OworCXUxNiBUSUQ6NDsKK307CiAKLS8vIDItYnl0ZSBCQVIgQ09OVFJPTCBmaWVsZCBpbiBCQVIgZnJhbWUKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0gICAgVVNIT1JUICAgICAgQUNLUG9saWN5OjE7IC8vIDA6bm9ybWFsIGFjaywgIDE6bm8gYWNrLgotICAgIFVTSE9SVCAgICAgIE1USUQ6MTsJCS8vaWYgdGhpcyBiaXQxLCB1c2UgIEZSQU1FX01UQkFfUkVRLCAgaWYgMCwgdXNlIEZSQU1FX0JBX1JFUQotICAgIFVTSE9SVCAgICAgIENvbXByZXNzZWQ6MTsKLSAgICBVU0hPUlQgICAgICBSc3YxOjk7Ci0gICAgVVNIT1JUICAgICAgVElEOjQ7Ci19IEJBUl9DT05UUk9MLCAqUEJBUl9DT05UUk9MOworLyogMi1ieXRlIEJBUiBDT05UUk9MIGZpZWxkIGluIEJBUiBmcmFtZSAqLworc3RydWN0IFBBQ0tFRCBydF9iYXJfY29udHJvbCB7CisJdTE2IEFDS1BvbGljeToxOwkvKiAwOm5vcm1hbCBhY2ssICAxOm5vIGFjay4gKi8KKwl1MTYgTVRJRDoxOwkJLyppZiB0aGlzIGJpdDEsIHVzZSAgc3RydWN0IHJ0X2ZyYW1lX210YmFfcmVxLCAgaWYgMCwgdXNlIHN0cnVjdCBydF9mcmFtZV9iYV9yZXEgKi8KKwl1MTYgQ29tcHJlc3NlZDoxOworCXUxNiBSc3YxOjk7CisJdTE2IFRJRDo0OworfTsKIAotLy8gQkFSQ29udHJvbCBpbiBNVEJBUiBmcmFtZQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKLSAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsKLSAgICBVU0hPUlQgICAgICBNVElEOjE7Ci0gICAgVVNIT1JUICAgICAgQ29tcHJlc3NlZDoxOwotICAgIFVTSE9SVCAgICAgIFJzdjE6OTsKLSAgICBVU0hPUlQgICAgICBOdW1USUQ6NDsKLX0gTVRCQVJfQ09OVFJPTCwgKlBNVEJBUl9DT05UUk9MOworLyogQkFSQ29udHJvbCBpbiBNVEJBUiBmcmFtZSAqLworc3RydWN0IFBBQ0tFRCBydF9tdGJhcl9jb250cm9sIHsKKwl1MTYgQUNLUG9saWN5OjE7CisJdTE2IE1USUQ6MTsKKwl1MTYgQ29tcHJlc3NlZDoxOworCXUxNiBSc3YxOjk7CisJdTE2IE51bVRJRDo0OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKLSAgICBVU0hPUlQgICAgICBSc3YxOjEyOwotICAgIFVTSE9SVCAgICAgIFRJRDo0OwotfSBQRVJfVElEX0lORk8sICpQUEVSX1RJRF9JTkZPOworc3RydWN0IFBBQ0tFRCBydF9wZXJfdGlkX2luZm8geworCXUxNiBSc3YxOjEyOworCXUxNiBUSUQ6NDsKK307CiAKLXR5cGVkZWYgc3RydWN0IHsKLQlQRVJfVElEX0lORk8gICAgICBQZXJUSUQ7Ci0JQkFTRVFfQ09OVFJPTCAJIEJBU3RhcnRpbmdTZXE7Ci19IEVBQ0hfVElELCAqUEVBQ0hfVElEOworc3RydWN0IHJ0X2VhY2hfdGlkIHsKKwlzdHJ1Y3QgcnRfcGVyX3RpZF9pbmZvIFBlclRJRDsKKwlCQVNFUV9DT05UUk9MIEJBU3RhcnRpbmdTZXE7Cit9OwogCisvKiBCQVJFUSBBTkQgTVRCQVJFUSBoYXZlIHRoZSBzYW1lIHN1YnR5cGUgQkFSLCA4MDIuMTFuIEJBUiB1c2UgY29tcHJlc3NlZCBiaXRtYXAuICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2ZyYW1lX2JhX3JlcSB7CisJc3RydWN0IHJ0X2ZyYW1lX2NvbnRyb2wgRkM7CisJdTE2IER1cmF0aW9uOworCXU4IEFkZHIxW01BQ19BRERSX0xFTl07CisJdTggQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlzdHJ1Y3QgcnRfYmFyX2NvbnRyb2wgQkFSQ29udHJvbDsKKwlCQVNFUV9DT05UUk9MIEJBU3RhcnRpbmdTZXE7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1BTUE9MTF9GUkFNRSB7Ci0gICAgRlJBTUVfQ09OVFJPTCAgIEZDOwotICAgIFVTSE9SVCAgICAgICAgICBBaWQ7Ci0gICAgVUNIQVIgICAgICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl07Ci0gICAgVUNIQVIgICAgICAgICAgIFRhW01BQ19BRERSX0xFTl07Ci19ICAgUFNQT0xMX0ZSQU1FLCAqUFBTUE9MTF9GUkFNRTsKK3N0cnVjdCBQQUNLRUQgcnRfZnJhbWVfbXRiYV9yZXEgeworCXN0cnVjdCBydF9mcmFtZV9jb250cm9sIEZDOworCXUxNiBEdXJhdGlvbjsKKwl1OCBBZGRyMVtNQUNfQUREUl9MRU5dOworCXU4IEFkZHIyW01BQ19BRERSX0xFTl07CisJc3RydWN0IHJ0X210YmFyX2NvbnRyb2wgTVRCQVJDb250cm9sOworCXN0cnVjdCBydF9wZXJfdGlkX2luZm8gUGVyVElESW5mbzsKKwlCQVNFUV9DT05UUk9MIEJBU3RhcnRpbmdTZXE7Cit9OwogCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1JUU19GUkFNRQl7Ci0gICAgRlJBTUVfQ09OVFJPTCAgIEZDOwotICAgIFVTSE9SVCAgICAgICAgICBEdXJhdGlvbjsKLSAgICBVQ0hBUiAgICAgICAgICAgQWRkcjFbTUFDX0FERFJfTEVOXTsKLSAgICBVQ0hBUiAgICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLX1SVFNfRlJBTUUsICpQUlRTX0ZSQU1FOworLyogQ29tcHJlc3NlZCBmb3JtYXQgaXMgbWFuZGFudG9yeSBpbiBIVCBTVEEgKi8KK3N0cnVjdCBQQUNLRUQgcnRfZnJhbWVfbXRiYSB7CisJc3RydWN0IHJ0X2ZyYW1lX2NvbnRyb2wgRkM7CisJdTE2IER1cmF0aW9uOworCXU4IEFkZHIxW01BQ19BRERSX0xFTl07CisJdTggQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlzdHJ1Y3QgcnRfYmFfY29udHJvbCBCQUNvbnRyb2w7CisJQkFTRVFfQ09OVFJPTCBCQVN0YXJ0aW5nU2VxOworCXU4IEJpdE1hcFs4XTsKK307CiAKLS8vIEJBUkVRIEFORCBNVEJBUkVRIGhhdmUgdGhlIHNhbWUgc3VidHlwZSBCQVIsIDgwMi4xMW4gQkFSIHVzZSBjb21wcmVzc2VkIGJpdG1hcC4KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfQkFfUkVRIHsKLQlGUkFNRV9DT05UUk9MICAgRkM7Ci0JVVNIT1JUICAgICAgICAgIER1cmF0aW9uOwotCVVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotCUJBUl9DT05UUk9MICBCQVJDb250cm9sOwotCUJBU0VRX0NPTlRST0wgCSBCQVN0YXJ0aW5nU2VxOwotfSAgIEZSQU1FX0JBX1JFUSwgKlBGUkFNRV9CQV9SRVE7CitzdHJ1Y3QgUEFDS0VEIHJ0X2ZyYW1lX3BzbXBfYWN0aW9uIHsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBIZHI7CisJdTggQ2F0ZWdvcnk7CisJdTggQWN0aW9uOworCXU4IFBzbXA7CQkvKiA3LjMuMS4yNSAqLworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9NVEJBX1JFUSB7Ci0JRlJBTUVfQ09OVFJPTCAgIEZDOwotCVVTSE9SVCAgICAgICAgICBEdXJhdGlvbjsKLQlVQ0hBUiAgICAgICAgICAgQWRkcjFbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlNVEJBUl9DT05UUk9MICBNVEJBUkNvbnRyb2w7Ci0JUEVSX1RJRF9JTkZPCVBlclRJREluZm87Ci0JQkFTRVFfQ09OVFJPTCAJIEJBU3RhcnRpbmdTZXE7Ci19ICAgRlJBTUVfTVRCQV9SRVEsICpQRlJBTUVfTVRCQV9SRVE7CitzdHJ1Y3QgUEFDS0VEIHJ0X2ZyYW1lX2FjdGlvbl9oZHIgeworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIEhkcjsKKwl1OCBDYXRlZ29yeTsKKwl1OCBBY3Rpb247Cit9OwogCi0vLyBDb21wcmVzc2VkIGZvcm1hdCBpcyBtYW5kYW50b3J5IGluIEhUIFNUQQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9NVEJBIHsKLQlGUkFNRV9DT05UUk9MICAgRkM7Ci0JVVNIT1JUICAgICAgICAgIER1cmF0aW9uOwotCVVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotCUJBX0NPTlRST0wgIEJBQ29udHJvbDsKLQlCQVNFUV9DT05UUk9MIAkgQkFTdGFydGluZ1NlcTsKLQlVQ0hBUgkJQml0TWFwWzhdOwotfSAgIEZSQU1FX01UQkEsICpQRlJBTUVfTVRCQTsKKy8qQWN0aW9uIEZyYW1lICovCisvKkFjdGlvbiBGcmFtZSAgQ2F0ZWdvcnk6U3BlY3RydW0sICBBY3Rpb246Q2hhbm5lbCBTd2l0Y2guIDcuMy4yLjIwICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2NoYW5fc3dpdGNoX2Fubm91bmNlIHsKKwl1OCBFbGVtZW50SUQ7CS8qIElEID0gSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UID0gMzcgKi8KKwl1OCBMZW47CisJc3RydWN0IHJ0X2NoYV9zd2l0Y2hfYW5ub3VuY2VfaWUgQ1NBbm5vdW5jZUllOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9QU01QX0FDVElPTiB7Ci0JSEVBREVSXzgwMl8xMSAgIEhkcjsKLQlVQ0hBUglDYXRlZ29yeTsKLQlVQ0hBUglBY3Rpb247Ci0JVUNIQVIJUHNtcDsJLy8gNy4zLjEuMjUKLX0gICBGUkFNRV9QU01QX0FDVElPTiwgKlBGUkFNRV9QU01QX0FDVElPTjsKKy8qODAyLjExbiA6IDcuMy4yLjIwYSAqLworc3RydWN0IFBBQ0tFRCBydF9zZWNvbmRfY2hhbl9vZmZzZXQgeworCXU4IEVsZW1lbnRJRDsJLyogSUQgPSBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VUID0gNjIgKi8KKwl1OCBMZW47CisJc3RydWN0IHJ0X3NlY19jaGFfb2Zmc2V0X2llIFNlY0NoT2Zmc2V0SWU7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0FDVElPTl9IRFIgewotCUhFQURFUl84MDJfMTEgICBIZHI7Ci0JVUNIQVIJQ2F0ZWdvcnk7Ci0JVUNIQVIJQWN0aW9uOwotfSAgIEZSQU1FX0FDVElPTl9IRFIsICpQRlJBTUVfQUNUSU9OX0hEUjsKK3N0cnVjdCBQQUNLRUQgcnRfZnJhbWVfc3BldHJ1bV9jcyB7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgSGRyOworCXU4IENhdGVnb3J5OworCXU4IEFjdGlvbjsKKwlzdHJ1Y3QgcnRfY2hhbl9zd2l0Y2hfYW5ub3VuY2UgQ1NBbm5vdW5jZTsKKwlzdHJ1Y3QgcnRfc2Vjb25kX2NoYW5fb2Zmc2V0IFNlY29uZENoYW5uZWw7Cit9OwogCi0vL0FjdGlvbiBGcmFtZQotLy9BY3Rpb24gRnJhbWUgIENhdGVnb3J5OlNwZWN0cnVtLCAgQWN0aW9uOkNoYW5uZWwgU3dpdGNoLiA3LjMuMi4yMAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9DSEFOX1NXSVRDSF9BTk5PVU5DRSB7Ci0JVUNIQVIJCQkJCUVsZW1lbnRJRDsJLy8gSUQgPSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQgPSAzNwotCVVDSEFSCQkJCQlMZW47Ci0JQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRQlDU0Fubm91bmNlSWU7Ci19ICAgQ0hBTl9TV0lUQ0hfQU5OT1VOQ0UsICpQQ0hBTl9TV0lUQ0hfQU5OT1VOQ0U7CitzdHJ1Y3QgUEFDS0VEIHJ0X2ZyYW1lX2FkZGJhX3JlcSB7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgSGRyOworCXU4IENhdGVnb3J5OworCXU4IEFjdGlvbjsKKwl1OCBUb2tlbjsJCS8qIDEgKi8KKwlzdHJ1Y3QgcnRfYmFfcGFybSBCYVBhcm07CQkvKiAgMiAtIDEwICovCisJdTE2IFRpbWVPdXRWYWx1ZTsJLyogMCAtIDAgKi8KKwlCQVNFUV9DT05UUk9MIEJhU3RhcnRTZXE7CS8qIDAtMCAqLworfTsKIAorc3RydWN0IFBBQ0tFRCBydF9mcmFtZV9hZGRiYV9yc3AgeworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIEhkcjsKKwl1OCBDYXRlZ29yeTsKKwl1OCBBY3Rpb247CisJdTggVG9rZW47CisJdTE2IFN0YXR1c0NvZGU7CisJc3RydWN0IHJ0X2JhX3Bhcm0gQmFQYXJtOwkJLyowIC0gMiAqLworCXUxNiBUaW1lT3V0VmFsdWU7Cit9OwogCi0vLzgwMi4xMW4gOiA3LjMuMi4yMGEKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfU0VDT05EX0NIQU5fT0ZGU0VUIHsKLQlVQ0hBUgkJCQlFbGVtZW50SUQ7CQkvLyBJRCA9IElFX1NFQ09OREFSWV9DSF9PRkZTRVQgPSA2MgotCVVDSEFSCQkJCUxlbjsKLQlTRUNfQ0hBX09GRlNFVF9JRQlTZWNDaE9mZnNldEllOwotfSAgIFNFQ09ORF9DSEFOX09GRlNFVCwgKlBTRUNPTkRfQ0hBTl9PRkZTRVQ7CitzdHJ1Y3QgUEFDS0VEIHJ0X2ZyYW1lX2RlbGJhX3JlcSB7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgSGRyOworCXU4IENhdGVnb3J5OworCXU4IEFjdGlvbjsKKwlzdHJ1Y3QgcnRfZGVsYmFfcGFybSBEZWxiYVBhcm07CisJdTE2IFJlYXNvbkNvZGU7Cit9OwogCisvKjcuMi4xLjcgKi8KK3N0cnVjdCBQQUNLRUQgcnRfZnJhbWVfYmFyIHsKKwlzdHJ1Y3QgcnRfZnJhbWVfY29udHJvbCBGQzsKKwl1MTYgRHVyYXRpb247CisJdTggQWRkcjFbTUFDX0FERFJfTEVOXTsKKwl1OCBBZGRyMltNQUNfQUREUl9MRU5dOworCXN0cnVjdCBydF9iYXJfY29udHJvbCBCYXJDb250cm9sOworCUJBU0VRX0NPTlRST0wgU3RhcnRpbmdTZXE7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX1NQRVRSVU1fQ1MgewotCUhFQURFUl84MDJfMTEgICBIZHI7Ci0JVUNIQVIJQ2F0ZWdvcnk7Ci0JVUNIQVIJQWN0aW9uOwotCUNIQU5fU1dJVENIX0FOTk9VTkNFCUNTQW5ub3VuY2U7Ci0JU0VDT05EX0NIQU5fT0ZGU0VUCQlTZWNvbmRDaGFubmVsOwotfSAgIEZSQU1FX1NQRVRSVU1fQ1MsICpQRlJBTUVfU1BFVFJVTV9DUzsKKy8qNy4yLjEuNyAqLworc3RydWN0IFBBQ0tFRCBydF9mcmFtZV9iYSB7CisJc3RydWN0IHJ0X2ZyYW1lX2NvbnRyb2wgRkM7CisJdTE2IER1cmF0aW9uOworCXU4IEFkZHIxW01BQ19BRERSX0xFTl07CisJdTggQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlzdHJ1Y3QgcnRfYmFyX2NvbnRyb2wgQmFyQ29udHJvbDsKKwlCQVNFUV9DT05UUk9MIFN0YXJ0aW5nU2VxOworCXU4IGJpdG1hc2tbOF07Cit9OwogCisvKiBSYWRpbyBNZWFzdWVtZW50IFJlcXVlc3QgRnJhbWUgRm9ybWF0ICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2ZyYW1lX3JtX3JlcV9hY3Rpb24geworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIEhkcjsKKwl1OCBDYXRlZ29yeTsKKwl1OCBBY3Rpb247CisJdTggVG9rZW47CisJdTE2IFJlcGV0aXRpb247CisJdTggZGF0YVswXTsKK307CiAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfQUREQkFfUkVRIHsKLQlIRUFERVJfODAyXzExICAgSGRyOwotCVVDSEFSCUNhdGVnb3J5OwotCVVDSEFSCUFjdGlvbjsKLQlVQ0hBUglUb2tlbjsJLy8gMQotCUJBX1BBUk0JCUJhUGFybTsJICAgICAgLy8gIDIgLSAxMAotCVVTSE9SVAkJVGltZU91dFZhbHVlOwkvLyAwIC0gMAotCUJBU0VRX0NPTlRST0wJQmFTdGFydFNlcTsgLy8gMC0wCi19ICAgRlJBTUVfQUREQkFfUkVRLCAqUEZSQU1FX0FEREJBX1JFUTsKK3N0cnVjdCBQQUNLRUQgcnRfaHRfZXh0X2NoYW5uZWxfc3dpdGNoX2Fubm91bmNlbWVudF9pZSB7CisJdTggSUQ7CisJdTggTGVuZ3RoOworCXU4IENoYW5uZWxTd2l0Y2hNb2RlOworCXU4IE5ld1JlZ0NsYXNzOworCXU4IE5ld0NoYW5uZWxOdW07CisJdTggQ2hhbm5lbFN3aXRjaENvdW50OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9BRERCQV9SU1AgewotCUhFQURFUl84MDJfMTEgICBIZHI7Ci0JVUNIQVIJQ2F0ZWdvcnk7Ci0JVUNIQVIJQWN0aW9uOwotCVVDSEFSCVRva2VuOwotCVVTSE9SVAlTdGF0dXNDb2RlOwotCUJBX1BBUk0JCUJhUGFybTsgLy8wIC0gMgotCVVTSE9SVAkJVGltZU91dFZhbHVlOwotfSAgIEZSQU1FX0FEREJBX1JTUCwgKlBGUkFNRV9BRERCQV9SU1A7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfREVMQkFfUkVRIHsKLQlIRUFERVJfODAyXzExICAgSGRyOwotCVVDSEFSCUNhdGVnb3J5OwotCVVDSEFSCUFjdGlvbjsKLQlERUxCQV9QQVJNCQlEZWxiYVBhcm07Ci0JVVNIT1JUCVJlYXNvbkNvZGU7Ci19ICAgRlJBTUVfREVMQkFfUkVRLCAqUEZSQU1FX0RFTEJBX1JFUTsKLQotCi0vLzcuMi4xLjcKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfQkFSIHsKLQlGUkFNRV9DT05UUk9MICAgRkM7Ci0JVVNIT1JUICAgICAgICAgIER1cmF0aW9uOwotCVVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotCUJBUl9DT05UUk9MCQlCYXJDb250cm9sOwotCUJBU0VRX0NPTlRST0wJU3RhcnRpbmdTZXE7Ci19ICAgRlJBTUVfQkFSLCAqUEZSQU1FX0JBUjsKLQotLy83LjIuMS43Ci10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0JBIHsKLQlGUkFNRV9DT05UUk9MICAgRkM7Ci0JVVNIT1JUICAgICAgICAgIER1cmF0aW9uOwotCVVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotCUJBUl9DT05UUk9MCQlCYXJDb250cm9sOwotCUJBU0VRX0NPTlRST0wJU3RhcnRpbmdTZXE7Ci0JVUNIQVIJCWJpdG1hc2tbOF07Ci19ICAgRlJBTUVfQkEsICpQRlJBTUVfQkE7Ci0KLQotLy8gUmFkaW8gTWVhc3VlbWVudCBSZXF1ZXN0IEZyYW1lIEZvcm1hdAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9STV9SRVFfQUNUSU9OIHsKLQlIRUFERVJfODAyXzExICAgSGRyOwotCVVDSEFSCUNhdGVnb3J5OwotCVVDSEFSCUFjdGlvbjsKLQlVQ0hBUglUb2tlbjsKLQlVU0hPUlQJUmVwZXRpdGlvbjsKLQlVQ0hBUiAgIGRhdGFbMF07Ci19ICAgRlJBTUVfUk1fUkVRX0FDVElPTiwgKlBGUkFNRV9STV9SRVFfQUNUSU9OOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotCVVDSEFSCQlJRDsKLQlVQ0hBUgkJTGVuZ3RoOwotCVVDSEFSCQlDaGFubmVsU3dpdGNoTW9kZTsKLQlVQ0hBUgkJTmV3UmVnQ2xhc3M7Ci0JVUNIQVIJCU5ld0NoYW5uZWxOdW07Ci0JVUNIQVIJCUNoYW5uZWxTd2l0Y2hDb3VudDsKLX0gSFRfRVhUX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVF9JRSwgKlBIVF9FWFRfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UX0lFOwotCi0KLS8vCi0vLyBfTGltaXQgbXVzdCBiZSB0aGUgMioqbiAtIDEKLS8vIF9TRVExICwgX1NFUTIgbXVzdCBiZSB3aXRoaW4gMCB+IF9MaW1pdAotLy8KKy8qICovCisvKiBfTGltaXQgbXVzdCBiZSB0aGUgMioqbiAtIDEgKi8KKy8qIF9TRVExICwgX1NFUTIgbXVzdCBiZSB3aXRoaW4gMCB+IF9MaW1pdCAqLworLyogKi8KICNkZWZpbmUgU0VRX1NURVBPTkUoX1NFUTEsIF9TRVEyLCBfTGltaXQpCSgoX1NFUTEgPT0gKChfU0VRMisxKSAmIF9MaW1pdCkpKQogI2RlZmluZSBTRVFfU01BTExFUihfU0VRMSwgX1NFUTIsIF9MaW1pdCkJKCgoX1NFUTEtX1NFUTIpICYgKChfTGltaXQrMSk+PjEpKSkKICNkZWZpbmUgU0VRX0xBUkdFUihfU0VRMSwgX1NFUTIsIF9MaW1pdCkJKChfU0VRMSAhPSBfU0VRMikgJiYgISgoKF9TRVExLV9TRVEyKSAmICgoX0xpbWl0KzEpPj4xKSkpKQogI2RlZmluZSBTRVFfV0lUSElOX1dJTihfU0VRMSwgX1NFUTIsIF9XSU4sIF9MaW1pdCkgKFNFUV9MQVJHRVIoX1NFUTEsIF9TRVEyLCBfTGltaXQpICYmICBcCiAJCQkJCQkJCQkJCQlTRVFfU01BTExFUihfU0VRMSwgKChfU0VRMitfV0lOKzEpJl9MaW1pdCksIF9MaW1pdCkpCiAKLS8vCi0vLyBDb250ZW50aW9uLWZyZWUgcGFyYW1ldGVyICh3aXRob3V0IElEIGFuZCBMZW5ndGgpCi0vLwotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKLSAgICBCT09MRUFOICAgICBiVmFsaWQ7ICAgICAgICAgLy8gMTogdmFyaWFibGUgY29udGFpbnMgdmFsaWQgdmFsdWUKLSAgICBVQ0hBUiAgICAgICBDZnBDb3VudDsKLSAgICBVQ0hBUiAgICAgICBDZnBQZXJpb2Q7Ci0gICAgVVNIT1JUICAgICAgQ2ZwTWF4RHVyYXRpb247Ci0gICAgVVNIT1JUICAgICAgQ2ZwRHVyUmVtYWluaW5nOwotfSBDRl9QQVJNLCAqUENGX1BBUk07CisvKiAqLworLyogQ29udGVudGlvbi1mcmVlIHBhcmFtZXRlciAod2l0aG91dCBJRCBhbmQgTGVuZ3RoKSAqLworLyogKi8KK3N0cnVjdCBQQUNLRUQgcnRfY2ZfcGFybSB7CisJQk9PTEVBTiBiVmFsaWQ7CQkvKiAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZSAqLworCXU4IENmcENvdW50OworCXU4IENmcFBlcmlvZDsKKwl1MTYgQ2ZwTWF4RHVyYXRpb247CisJdTE2IENmcER1clJlbWFpbmluZzsKK307CiAKLXR5cGVkZWYJc3RydWN0CV9DSVBIRVJfU1VJVEUJewotCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCVBhaXJDaXBoZXI7CQkvLyBVbmljYXN0IGNpcGhlciAxLCB0aGlzIG9uZSBoYXMgbW9yZSBzZWN1cmVkIGNpcGhlciBzdWl0ZQotCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCVBhaXJDaXBoZXJBdXg7CS8vIFVuaWNhc3QgY2lwaGVyIDIgaWYgQVAgYW5ub3VuY2UgdHdvIHVuaWNhc3QgY2lwaGVyIHN1aXRlCi0JTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJR3JvdXBDaXBoZXI7CS8vIEdyb3VwIGNpcGhlcgotCVVTSE9SVAkJCQkJCQlSc25DYXBhYmlsaXR5OwkvLyBSU04gY2FwYWJpbGl0eSBmcm9tIGJlYWNvbgotCUJPT0xFQU4JCQkJCQkJYk1peE1vZGU7CQkvLyBJbmRpY2F0ZSBQYWlyICYgR3JvdXAgY2lwaGVyIG1pZ2h0IGJlIGRpZmZlcmVudAotfQlDSVBIRVJfU1VJVEUsICpQQ0lQSEVSX1NVSVRFOworc3RydWN0IHJ0X2NpcGhlcl9zdWl0ZSB7CisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgUGFpckNpcGhlcjsJLyogVW5pY2FzdCBjaXBoZXIgMSwgdGhpcyBvbmUgaGFzIG1vcmUgc2VjdXJlZCBjaXBoZXIgc3VpdGUgKi8KKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUyBQYWlyQ2lwaGVyQXV4OwkvKiBVbmljYXN0IGNpcGhlciAyIGlmIEFQIGFubm91bmNlIHR3byB1bmljYXN0IGNpcGhlciBzdWl0ZSAqLworCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTIEdyb3VwQ2lwaGVyOwkvKiBHcm91cCBjaXBoZXIgKi8KKwl1MTYgUnNuQ2FwYWJpbGl0eTsJLyogUlNOIGNhcGFiaWxpdHkgZnJvbSBiZWFjb24gKi8KKwlCT09MRUFOIGJNaXhNb2RlOwkvKiBJbmRpY2F0ZSBQYWlyICYgR3JvdXAgY2lwaGVyIG1pZ2h0IGJlIGRpZmZlcmVudCAqLworfTsKIAotLy8gRURDQSBjb25maWd1cmF0aW9uIGZyb20gQVAncyBCRUFDT04vUHJvYmVSc3AKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBCT09MRUFOICAgICBiVmFsaWQ7ICAgICAgICAgLy8gMTogdmFyaWFibGUgY29udGFpbnMgdmFsaWQgdmFsdWUKLSAgICBCT09MRUFOICAgICBiQWRkOyAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCi0gICAgQk9PTEVBTiAgICAgYlFBY2s7Ci0gICAgQk9PTEVBTiAgICAgYlF1ZXVlUmVxdWVzdDsKLSAgICBCT09MRUFOICAgICBiVHhvcFJlcXVlc3Q7Ci0gICAgQk9PTEVBTiAgICAgYkFQU0RDYXBhYmxlOwotLy8gIEJPT0xFQU4gICAgIGJNb3JlRGF0YUFjazsKLSAgICBVQ0hBUiAgICAgICBFZGNhVXBkYXRlQ291bnQ7Ci0gICAgVUNIQVIgICAgICAgQWlmc25bNF07ICAgICAgIC8vIDA6QUNfQkssIDE6QUNfQkUsIDI6QUNfVkksIDM6QUNfVk8KLSAgICBVQ0hBUiAgICAgICBDd21pbls0XTsKLSAgICBVQ0hBUiAgICAgICBDd21heFs0XTsKLSAgICBVU0hPUlQgICAgICBUeG9wWzRdOyAgICAgIC8vIGluIHVuaXQgb2YgMzItdXMKLSAgICBCT09MRUFOICAgICBiQUNNWzRdOyAgICAgIC8vIDE6IEFkbWlzc2lvbiBDb250cm9sIG9mIEFDX0JLIGlzIG1hbmRhdHRvcnkKLX0gRURDQV9QQVJNLCAqUEVEQ0FfUEFSTTsKKy8qIEVEQ0EgY29uZmlndXJhdGlvbiBmcm9tIEFQJ3MgQkVBQ09OL1Byb2JlUnNwICovCitzdHJ1Y3QgcnRfZWRjYV9wYXJtIHsKKwlCT09MRUFOIGJWYWxpZDsJCS8qIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlICovCisJQk9PTEVBTiBiQWRkOwkJLyogMTogdmFyaWFibGUgY29udGFpbnMgdmFsaWQgdmFsdWUgKi8KKwlCT09MRUFOIGJRQWNrOworCUJPT0xFQU4gYlF1ZXVlUmVxdWVzdDsKKwlCT09MRUFOIGJUeG9wUmVxdWVzdDsKKwlCT09MRUFOIGJBUFNEQ2FwYWJsZTsKKy8qICBCT09MRUFOICAgICBiTW9yZURhdGFBY2s7ICovCisJdTggRWRjYVVwZGF0ZUNvdW50OworCXU4IEFpZnNuWzRdOwkJLyogMDpBQ19CSywgMTpBQ19CRSwgMjpBQ19WSSwgMzpBQ19WTyAqLworCXU4IEN3bWluWzRdOworCXU4IEN3bWF4WzRdOworCXUxNiBUeG9wWzRdOwkJLyogaW4gdW5pdCBvZiAzMi11cyAqLworCUJPT0xFQU4gYkFDTVs0XTsJLyogMTogQWRtaXNzaW9uIENvbnRyb2wgb2YgQUNfQksgaXMgbWFuZGF0dG9yeSAqLworfTsKIAotLy8gUUJTUyBMT0FEIGluZm9ybWF0aW9uIGZyb20gUUFQJ3MgQkVBQ09OL1Byb2JlUnNwCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgQk9PTEVBTiAgICAgYlZhbGlkOyAgICAgICAgICAgICAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCi0gICAgVVNIT1JUICAgICAgU3RhTnVtOwotICAgIFVDSEFSICAgICAgIENoYW5uZWxVdGlsaXphdGlvbjsKLSAgICBVU0hPUlQgICAgICBSZW1haW5pbmdBZG1pc3Npb25Db250cm9sOyAgLy8gaW4gdW5pdCBvZiAzMi11cwotfSBRQlNTX0xPQURfUEFSTSwgKlBRQlNTX0xPQURfUEFSTTsKKy8qIFFCU1MgTE9BRCBpbmZvcm1hdGlvbiBmcm9tIFFBUCdzIEJFQUNPTi9Qcm9iZVJzcCAqLworc3RydWN0IHJ0X3Fic3NfbG9hZF9wYXJtIHsKKwlCT09MRUFOIGJWYWxpZDsJCS8qIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlICovCisJdTE2IFN0YU51bTsKKwl1OCBDaGFubmVsVXRpbGl6YXRpb247CisJdTE2IFJlbWFpbmluZ0FkbWlzc2lvbkNvbnRyb2w7CS8qIGluIHVuaXQgb2YgMzItdXMgKi8KK307CiAKLS8vIFFCU1MgSW5mbyBmaWVsZCBpbiBRU1RBJ3MgYXNzb2MgcmVxCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotICAgIFVDSEFSCQlVQVBTRF9BQ19WTzoxOwotCVVDSEFSCQlVQVBTRF9BQ19WSToxOwotCVVDSEFSCQlVQVBTRF9BQ19CSzoxOwotCVVDSEFSCQlVQVBTRF9BQ19CRToxOwotCVVDSEFSCQlSc3YxOjE7Ci0JVUNIQVIJCU1heFNQTGVuZ3RoOjI7Ci0JVUNIQVIJCVJzdjI6MTsKLX0gUUJTU19TVEFfSU5GT19QQVJNLCAqUFFCU1NfU1RBX0lORk9fUEFSTTsKKy8qIFFCU1MgSW5mbyBmaWVsZCBpbiBRU1RBJ3MgYXNzb2MgcmVxICovCitzdHJ1Y3QgUEFDS0VEIHJ0X3Fic3Nfc3RhX2luZm9fcGFybSB7CisJdTggVUFQU0RfQUNfVk86MTsKKwl1OCBVQVBTRF9BQ19WSToxOworCXU4IFVBUFNEX0FDX0JLOjE7CisJdTggVUFQU0RfQUNfQkU6MTsKKwl1OCBSc3YxOjE7CisJdTggTWF4U1BMZW5ndGg6MjsKKwl1OCBSc3YyOjE7Cit9OwogCi0vLyBRQlNTIEluZm8gZmllbGQgaW4gUUFQJ3MgQmVhY29uL1Byb2JlUnNwCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotICAgIFVDSEFSCQlQYXJhbVNldENvdW50OjQ7Ci0JVUNIQVIJCVJzdjozOwotCVVDSEFSCQlVQVBTRDoxOwotfSBRQlNTX0FQX0lORk9fUEFSTSwgKlBRQlNTX0FQX0lORk9fUEFSTTsKKy8qIFFCU1MgSW5mbyBmaWVsZCBpbiBRQVAncyBCZWFjb24vUHJvYmVSc3AgKi8KK3N0cnVjdCBQQUNLRUQgcnRfcWJzc19hcF9pbmZvX3Bhcm0geworCXU4IFBhcmFtU2V0Q291bnQ6NDsKKwl1OCBSc3Y6MzsKKwl1OCBVQVBTRDoxOworfTsKIAotLy8gUU9TIENhcGFiaWxpdHkgcmVwb3J0ZWQgaW4gUUFQJ3MgQkVBQ09OL1Byb2JlUnNwCi0vLyBRT1MgQ2FwYWJpbGl0eSBzZW50IG91dCBpbiBRU1RBJ3MgQXNzb2NpYXRlUmVxL1JlQXNzb2NpYXRlUmVxCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgQk9PTEVBTiAgICAgYlZhbGlkOyAgICAgICAgICAgICAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCi0gICAgQk9PTEVBTiAgICAgYlFBY2s7Ci0gICAgQk9PTEVBTiAgICAgYlF1ZXVlUmVxdWVzdDsKLSAgICBCT09MRUFOICAgICBiVHhvcFJlcXVlc3Q7Ci0vLyAgQk9PTEVBTiAgICAgYk1vcmVEYXRhQWNrOwotICAgIFVDSEFSICAgICAgIEVkY2FVcGRhdGVDb3VudDsKLX0gUU9TX0NBUEFCSUxJVFlfUEFSTSwgKlBRT1NfQ0FQQUJJTElUWV9QQVJNOworLyogUU9TIENhcGFiaWxpdHkgcmVwb3J0ZWQgaW4gUUFQJ3MgQkVBQ09OL1Byb2JlUnNwICovCisvKiBRT1MgQ2FwYWJpbGl0eSBzZW50IG91dCBpbiBRU1RBJ3MgQXNzb2NpYXRlUmVxL1JlQXNzb2NpYXRlUmVxICovCitzdHJ1Y3QgcnRfcW9zX2NhcGFiaWxpdHlfcGFybSB7CisJQk9PTEVBTiBiVmFsaWQ7CQkvKiAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZSAqLworCUJPT0xFQU4gYlFBY2s7CisJQk9PTEVBTiBiUXVldWVSZXF1ZXN0OworCUJPT0xFQU4gYlR4b3BSZXF1ZXN0OworLyogIEJPT0xFQU4gICAgIGJNb3JlRGF0YUFjazsgKi8KKwl1OCBFZGNhVXBkYXRlQ291bnQ7Cit9OwogCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgVUNIQVIgICAgICAgSUVMZW47Ci0gICAgVUNIQVIgICAgICAgSUVbTUFYX0NVU1RPTV9MRU5dOwotfSBXUEFfSUVfOworc3RydWN0IHJ0X3dwYV9pZSB7CisJdTggSUVMZW47CisJdTggSUVbTUFYX0NVU1RPTV9MRU5dOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFVDSEFSICAgQnNzaWRbTUFDX0FERFJfTEVOXTsKLSAgICBVQ0hBUiAgIENoYW5uZWw7Ci0JVUNIQVIgICBDZW50cmFsQ2hhbm5lbDsJLy9TdG9yZSB0aGUgd2lkZS1iYW5kIGNlbnRyYWwgY2hhbm5lbCBmb3IgNDBNSHouICAudXNlZCBpbiA0ME1IeiBBUC4gT3IgdGhpcyBpcyB0aGUgc2FtZSBhcyBDaGFubmVsLgotICAgIFVDSEFSICAgQnNzVHlwZTsKLSAgICBVU0hPUlQgIEF0aW1XaW47Ci0gICAgVVNIT1JUICBCZWFjb25QZXJpb2Q7CitzdHJ1Y3QgcnRfYnNzX2VudHJ5IHsKKwl1OCBCc3NpZFtNQUNfQUREUl9MRU5dOworCXU4IENoYW5uZWw7CisJdTggQ2VudHJhbENoYW5uZWw7CS8qU3RvcmUgdGhlIHdpZGUtYmFuZCBjZW50cmFsIGNoYW5uZWwgZm9yIDQwTUh6LiAgLnVzZWQgaW4gNDBNSHogQVAuIE9yIHRoaXMgaXMgdGhlIHNhbWUgYXMgQ2hhbm5lbC4gKi8KKwl1OCBCc3NUeXBlOworCXUxNiBBdGltV2luOworCXUxNiBCZWFjb25QZXJpb2Q7CiAKLSAgICBVQ0hBUiAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwotICAgIFVDSEFSICAgU3VwUmF0ZUxlbjsKLSAgICBVQ0hBUiAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwotICAgIFVDSEFSICAgRXh0UmF0ZUxlbjsKLQlIVF9DQVBBQklMSVRZX0lFIEh0Q2FwYWJpbGl0eTsKLQlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbjsKLQlBRERfSFRfSU5GT19JRSBBZGRIdEluZm87CS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotCVVDSEFSCQkJQWRkSHRJbmZvTGVuOwotCVVDSEFSCQkJTmV3RXh0Q2hhbk9mZnNldDsKLQlDSEFSICAgIFJzc2k7Ci0gICAgVUNIQVIgICBQcml2YWN5OwkJCS8vIEluZGljYXRlIHNlY3VyaXR5IGZ1bmN0aW9uIE9OL09GRi4gRG9uJ3QgbWVzcyB1cCB3aXRoIGF1dGggbW9kZS4KLQlVQ0hBUglIaWRkZW47CisJdTggU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJdTggU3VwUmF0ZUxlbjsKKwl1OCBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwl1OCBFeHRSYXRlTGVuOworCXN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llIEh0Q2FwYWJpbGl0eTsKKwl1OCBIdENhcGFiaWxpdHlMZW47CisJc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llIEFkZEh0SW5mbzsJLyogQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFICovCisJdTggQWRkSHRJbmZvTGVuOworCXU4IE5ld0V4dENoYW5PZmZzZXQ7CisJY2hhciBSc3NpOworCXU4IFByaXZhY3k7CQkvKiBJbmRpY2F0ZSBzZWN1cml0eSBmdW5jdGlvbiBPTi9PRkYuIERvbid0IG1lc3MgdXAgd2l0aCBhdXRoIG1vZGUuICovCisJdTggSGlkZGVuOwogCi0gICAgVVNIT1JUICBEdGltUGVyaW9kOwotICAgIFVTSE9SVCAgQ2FwYWJpbGl0eUluZm87CisJdTE2IER0aW1QZXJpb2Q7CisJdTE2IENhcGFiaWxpdHlJbmZvOwogCi0gICAgVVNIT1JUICBDZnBDb3VudDsKLSAgICBVU0hPUlQgIENmcFBlcmlvZDsKLSAgICBVU0hPUlQgIENmcE1heER1cmF0aW9uOwotICAgIFVTSE9SVCAgQ2ZwRHVyUmVtYWluaW5nOwotICAgIFVDSEFSICAgU3NpZExlbjsKLSAgICBDSEFSICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKwl1MTYgQ2ZwQ291bnQ7CisJdTE2IENmcFBlcmlvZDsKKwl1MTYgQ2ZwTWF4RHVyYXRpb247CisJdTE2IENmcER1clJlbWFpbmluZzsKKwl1OCBTc2lkTGVuOworCWNoYXIgU3NpZFtNQVhfTEVOX09GX1NTSURdOwogCi0gICAgVUxPTkcgICBMYXN0QmVhY29uUnhUaW1lOyAvLyBPUydzIHRpbWVzdGFtcAorCXVuc2lnbmVkIGxvbmcgTGFzdEJlYWNvblJ4VGltZTsJLyogT1MncyB0aW1lc3RhbXAgKi8KIAotCUJPT0xFQU4JYlNFUzsKKwlCT09MRUFOIGJTRVM7CiAKLQkvLyBOZXcgZm9yIFdQQTIKLQlDSVBIRVJfU1VJVEUJCQkJCVdQQTsJCQkvLyBBUCBhbm5vdW5jZWQgV1BBIGNpcGhlciBzdWl0ZQotCUNJUEhFUl9TVUlURQkJCQkJV1BBMjsJCQkvLyBBUCBhbm5vdW5jZWQgV1BBMiBjaXBoZXIgc3VpdGUKKwkvKiBOZXcgZm9yIFdQQTIgKi8KKwlzdHJ1Y3QgcnRfY2lwaGVyX3N1aXRlIFdQQTsJLyogQVAgYW5ub3VuY2VkIFdQQSBjaXBoZXIgc3VpdGUgKi8KKwlzdHJ1Y3QgcnRfY2lwaGVyX3N1aXRlIFdQQTI7CS8qIEFQIGFubm91bmNlZCBXUEEyIGNpcGhlciBzdWl0ZSAqLwogCi0JLy8gTmV3IGZvciBtaWNyb3NvZnQgV1BBIHN1cHBvcnQKLQlORElTXzgwMl8xMV9GSVhFRF9JRXMJRml4SUVzOwotCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUJQXV0aE1vZGVBdXg7CS8vIEFkZGl0aW9uIG1vZGUgZm9yIFdQQTIgLyBXUEEgY2FwYWJsZSBBUAotCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUJQXV0aE1vZGU7Ci0JTkRJU184MDJfMTFfV0VQX1NUQVRVUwlXZXBTdGF0dXM7CQkJCS8vIFVuaWNhc3QgRW5jcnlwdGlvbiBBbGdvcml0aG0gZXh0cmFjdCBmcm9tIFZBUl9JRQotCVVTSE9SVAkJCQkJVmFySUVMZW47CQkJCS8vIExlbmd0aCBvZiBuZXh0IFZJRSBpbmNsdWRlIEVJRCAmIExlbmd0aAotCVVDSEFSCQkJCQlWYXJJRXNbTUFYX1ZJRV9MRU5dOworCS8qIE5ldyBmb3IgbWljcm9zb2Z0IFdQQSBzdXBwb3J0ICovCisJc3RydWN0IHJ0X25kaXNfODAyXzExX2ZpeGVkX2llcyBGaXhJRXM7CisJTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSBBdXRoTW9kZUF1eDsJLyogQWRkaXRpb24gbW9kZSBmb3IgV1BBMiAvIFdQQSBjYXBhYmxlIEFQICovCisJTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSBBdXRoTW9kZTsKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTIFdlcFN0YXR1czsJLyogVW5pY2FzdCBFbmNyeXB0aW9uIEFsZ29yaXRobSBleHRyYWN0IGZyb20gVkFSX0lFICovCisJdTE2IFZhcklFTGVuOwkvKiBMZW5ndGggb2YgbmV4dCBWSUUgaW5jbHVkZSBFSUQgJiBMZW5ndGggKi8KKwl1OCBWYXJJRXNbTUFYX1ZJRV9MRU5dOwogCi0JLy8gQ0NYIENraXAgaW5mb3JtYXRpb24KLSAgICBVQ0hBUiAgIENraXBGbGFnOworCS8qIENDWCBDa2lwIGluZm9ybWF0aW9uICovCisJdTggQ2tpcEZsYWc7CiAKLQkvLyBDQ1ggMiBUU0YKLQlVQ0hBUglQVFNGWzRdOwkJLy8gUGFyZW50IFRTRgotCVVDSEFSCVRUU0ZbOF07CQkvLyBUYXJnZXQgVFNGCisJLyogQ0NYIDIgVFNGICovCisJdTggUFRTRls0XTsJCS8qIFBhcmVudCBUU0YgKi8KKwl1OCBUVFNGWzhdOwkJLyogVGFyZ2V0IFRTRiAqLwogCi0gICAgLy8gODAyLjExZSBkOSwgYW5kIFdNTQotCUVEQ0FfUEFSTSAgICAgICAgICAgRWRjYVBhcm07Ci0JUU9TX0NBUEFCSUxJVFlfUEFSTSBRb3NDYXBhYmlsaXR5OwotCVFCU1NfTE9BRF9QQVJNICAgICAgUWJzc0xvYWQ7Ci0gICAgV1BBX0lFXyAgICAgV3BhSUU7Ci0gICAgV1BBX0lFXyAgICAgUnNuSUU7Ci19IEJTU19FTlRSWSwgKlBCU1NfRU5UUlk7CisJLyogODAyLjExZSBkOSwgYW5kIFdNTSAqLworCXN0cnVjdCBydF9lZGNhX3Bhcm0gRWRjYVBhcm07CisJc3RydWN0IHJ0X3Fvc19jYXBhYmlsaXR5X3Bhcm0gUW9zQ2FwYWJpbGl0eTsKKwlzdHJ1Y3QgcnRfcWJzc19sb2FkX3Bhcm0gUWJzc0xvYWQ7CisJc3RydWN0IHJ0X3dwYV9pZSBXcGFJRTsKKwlzdHJ1Y3QgcnRfd3BhX2llIFJzbklFOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFVDSEFSICAgICAgICAgICBCc3NOcjsKLSAgICBVQ0hBUiAgICAgICAgICAgQnNzT3ZlcmxhcE5yOwotICAgIEJTU19FTlRSWSAgICAgICBCc3NFbnRyeVtNQVhfTEVOX09GX0JTU19UQUJMRV07Ci19IEJTU19UQUJMRSwgKlBCU1NfVEFCTEU7CitzdHJ1Y3QgcnRfYnNzX3RhYmxlIHsKKwl1OCBCc3NOcjsKKwl1OCBCc3NPdmVybGFwTnI7CisJc3RydWN0IHJ0X2Jzc19lbnRyeSBCc3NFbnRyeVtNQVhfTEVOX09GX0JTU19UQUJMRV07Cit9OwogCitzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtIHsKKwl1bnNpZ25lZCBsb25nIE1hY2hpbmU7CisJdW5zaWduZWQgbG9uZyBNc2dUeXBlOworCXVuc2lnbmVkIGxvbmcgTXNnTGVuOworCXU4IE1zZ1tNR01UX0RNQV9CVUZGRVJfU0laRV07CisJTEFSR0VfSU5URUdFUiBUaW1lU3RhbXA7CisJdTggUnNzaTA7CisJdTggUnNzaTE7CisJdTggUnNzaTI7CisJdTggU2lnbmFsOworCXU4IENoYW5uZWw7CisJdTggV2NpZDsKKwlCT09MRUFOIE9jY3VwaWVkOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfUVVFVUVfRUxFTSB7Ci0gICAgVUxPTkcgICAgICAgICAgICAgTWFjaGluZTsKLSAgICBVTE9ORyAgICAgICAgICAgICBNc2dUeXBlOwotICAgIFVMT05HICAgICAgICAgICAgIE1zZ0xlbjsKLSAgICBVQ0hBUiAgICAgICAgICAgICBNc2dbTUdNVF9ETUFfQlVGRkVSX1NJWkVdOwotICAgIExBUkdFX0lOVEVHRVIgICAgIFRpbWVTdGFtcDsKLSAgICBVQ0hBUiAgICAgICAgICAgICBSc3NpMDsKLSAgICBVQ0hBUiAgICAgICAgICAgICBSc3NpMTsKLSAgICBVQ0hBUiAgICAgICAgICAgICBSc3NpMjsKLSAgICBVQ0hBUiAgICAgICAgICAgICBTaWduYWw7Ci0gICAgVUNIQVIgICAgICAgICAgICAgQ2hhbm5lbDsKLSAgICBVQ0hBUiAgICAgICAgICAgICBXY2lkOwotICAgIEJPT0xFQU4gICAgICAgICAgIE9jY3VwaWVkOwotfSBNTE1FX1FVRVVFX0VMRU0sICpQTUxNRV9RVUVVRV9FTEVNOworc3RydWN0IHJ0X21sbWVfcXVldWUgeworCXVuc2lnbmVkIGxvbmcgTnVtOworCXVuc2lnbmVkIGxvbmcgSGVhZDsKKwl1bnNpZ25lZCBsb25nIFRhaWw7CisJc3BpbmxvY2tfdCBMb2NrOworCXN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gRW50cnlbTUFYX0xFTl9PRl9NTE1FX1FVRVVFXTsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9NTE1FX1FVRVVFIHsKLSAgICBVTE9ORyAgICAgICAgICAgICBOdW07Ci0gICAgVUxPTkcgICAgICAgICAgICAgSGVhZDsKLSAgICBVTE9ORyAgICAgICAgICAgICBUYWlsOwotICAgIE5ESVNfU1BJTl9MT0NLICAgTG9jazsKLSAgICBNTE1FX1FVRVVFX0VMRU0gIEVudHJ5W01BWF9MRU5fT0ZfTUxNRV9RVUVVRV07Ci19IE1MTUVfUVVFVUUsICpQTUxNRV9RVUVVRTsKK3R5cGVkZWYgdm9pZCgqU1RBVEVfTUFDSElORV9GVU5DKSAodm9pZCAqIEFkYXB0b3IsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi10eXBlZGVmIFZPSUQgKCpTVEFURV9NQUNISU5FX0ZVTkMpKFZPSUQgKkFkYXB0b3IsIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CitzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSB7CisJdW5zaWduZWQgbG9uZyBCYXNlOworCXVuc2lnbmVkIGxvbmcgTnJTdGF0ZTsKKwl1bnNpZ25lZCBsb25nIE5yTXNnOworCXVuc2lnbmVkIGxvbmcgQ3VyclN0YXRlOworCVNUQVRFX01BQ0hJTkVfRlVOQyAqVHJhbnNGdW5jOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1NUQVRFX01BQ0hJTkUgewotICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZTsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yU3RhdGU7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBOck1zZzsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJTdGF0ZTsKLSAgICBTVEFURV9NQUNISU5FX0ZVTkMgICAgICAgICAgICAgKlRyYW5zRnVuYzsKLX0gU1RBVEVfTUFDSElORSwgKlBTVEFURV9NQUNISU5FOworLyogTUxNRSBBVVggZGF0YSBzdHJ1Y3R1cmUgdGhhdCBob2xkIHRlbXBvcmFybGl5IHNldHRpbmdzIGR1cmluZyBhIGNvbm5lY3Rpb24gYXR0ZW1wdC4gKi8KKy8qIE9uY2UgdGhpcyBhdHRlbXAgc3VjY2VlZHMsIGFsbCBzZXR0aW5ncyB3aWxsIGJlIGNvcHkgdG8gcEFkLT5TdGFBY3RpdmUuICovCisvKiBBIGNvbm5lY3Rpb24gYXR0ZW1wdCAodXNlciBzZXQgT0lELCByb2FtaW5nLCBDQ1ggZmFzdCByb2FtaW5nLC4uKSBjb25zaXN0cyBvZiAqLworLyogc2V2ZXJhbCBzdGVwcyAoSk9JTiwgQVVUSCwgQVNTT0Mgb3IgUkVBU1NPQykgYW5kIG1heSBmYWlsIGF0IGFueSBzdGVwLiBXZSBwdXJwb3NlbHkgKi8KKy8qIHNlcGFyYXRlIHRoaXMgdW5kZXItdHJpYWwgc2V0dGluZ3MgYXdheSBmcm9tIHBBZC0+U3RhQWN0aXZlIHNvIHRoYXQgb25jZSAqLworLyogdGhpcyBuZXcgYXR0ZW1wdCBmYWlsZWQsIGRyaXZlciBjYW4gYXV0by1yZWNvdmVyIGJhY2sgdG8gdGhlIGFjdGl2ZSBzZXR0aW5ncy4gKi8KK3N0cnVjdCBydF9tbG1lX2F1eCB7CisJdTggQnNzVHlwZTsKKwl1OCBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisJdTggU3NpZExlbjsKKwl1OCBCc3NpZFtNQUNfQUREUl9MRU5dOworCXU4IEF1dG9SZWNvbm5lY3RTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisJdTggQXV0b1JlY29ubmVjdFNzaWRMZW47CisJdTE2IEFsZzsKKwl1OCBTY2FuVHlwZTsKKwl1OCBDaGFubmVsOworCXU4IENlbnRyYWxDaGFubmVsOworCXUxNiBBaWQ7CisJdTE2IENhcGFiaWxpdHlJbmZvOworCXUxNiBCZWFjb25QZXJpb2Q7CisJdTE2IENmcE1heER1cmF0aW9uOworCXUxNiBDZnBQZXJpb2Q7CisJdTE2IEF0aW1XaW47CiAKKwkvKiBDb3B5IHN1cHBvcnRlZCByYXRlIGZyb20gZGVzaXJlZCBBUCdzIGJlYWNvbi4gV2UgYXJlIHRyeWluZyB0byBtYXRjaCAqLworCS8qIEFQJ3Mgc3VwcG9ydGVkIGFuZCBleHRlbmRlZCByYXRlIHNldHRpbmdzLiAqLworCXU4IFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCXU4IEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCXU4IFN1cFJhdGVMZW47CisJdTggRXh0UmF0ZUxlbjsKKwlzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSBIdENhcGFiaWxpdHk7CisJdTggSHRDYXBhYmlsaXR5TGVuOworCXN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSBBZGRIdEluZm87CS8qIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRSAqLworCXU4IE5ld0V4dENoYW5uZWxPZmZzZXQ7CisJLypzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eSAgICAgIFN1cHBvcnRlZEh0UGh5OyAqLwogCi0vLyBNTE1FIEFVWCBkYXRhIHN0cnVjdHVyZSB0aGF0IGhvbGQgdGVtcG9yYXJsaXkgc2V0dGluZ3MgZHVyaW5nIGEgY29ubmVjdGlvbiBhdHRlbXB0LgotLy8gT25jZSB0aGlzIGF0dGVtcCBzdWNjZWVkcywgYWxsIHNldHRpbmdzIHdpbGwgYmUgY29weSB0byBwQWQtPlN0YUFjdGl2ZS4KLS8vIEEgY29ubmVjdGlvbiBhdHRlbXB0ICh1c2VyIHNldCBPSUQsIHJvYW1pbmcsIENDWCBmYXN0IHJvYW1pbmcsLi4pIGNvbnNpc3RzIG9mCi0vLyBzZXZlcmFsIHN0ZXBzIChKT0lOLCBBVVRILCBBU1NPQyBvciBSRUFTU09DKSBhbmQgbWF5IGZhaWwgYXQgYW55IHN0ZXAuIFdlIHB1cnBvc2VseQotLy8gc2VwYXJhdGUgdGhpcyB1bmRlci10cmlhbCBzZXR0aW5ncyBhd2F5IGZyb20gcEFkLT5TdGFBY3RpdmUgc28gdGhhdCBvbmNlCi0vLyB0aGlzIG5ldyBhdHRlbXB0IGZhaWxlZCwgZHJpdmVyIGNhbiBhdXRvLXJlY292ZXIgYmFjayB0byB0aGUgYWN0aXZlIHNldHRpbmdzLgotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfQVVYIHsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIEJzc1R5cGU7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07Ci0gICAgVUNIQVIgICAgICAgICAgICAgICBTc2lkTGVuOwotICAgIFVDSEFSICAgICAgICAgICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUgkJCQlBdXRvUmVjb25uZWN0U3NpZFtNQVhfTEVOX09GX1NTSURdOwotCVVDSEFSCQkJCUF1dG9SZWNvbm5lY3RTc2lkTGVuOwotICAgIFVTSE9SVCAgICAgICAgICAgICAgQWxnOwotICAgIFVDSEFSICAgICAgICAgICAgICAgU2NhblR5cGU7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICBDaGFubmVsOwotCVVDSEFSICAgICAgICAgICAgICAgQ2VudHJhbENoYW5uZWw7Ci0gICAgVVNIT1JUICAgICAgICAgICAgICBBaWQ7Ci0gICAgVVNIT1JUICAgICAgICAgICAgICBDYXBhYmlsaXR5SW5mbzsKLSAgICBVU0hPUlQgICAgICAgICAgICAgIEJlYWNvblBlcmlvZDsKLSAgICBVU0hPUlQgICAgICAgICAgICAgIENmcE1heER1cmF0aW9uOwotICAgIFVTSE9SVCAgICAgICAgICAgICAgQ2ZwUGVyaW9kOwotICAgIFVTSE9SVCAgICAgICAgICAgICAgQXRpbVdpbjsKKwkvKiBuZXcgZm9yIFFPUyAqLworCXN0cnVjdCBydF9xb3NfY2FwYWJpbGl0eV9wYXJtIEFQUW9zQ2FwYWJpbGl0eTsJLyogUU9TIGNhcGFiaWxpdHkgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCAqLworCXN0cnVjdCBydF9lZGNhX3Bhcm0gQVBFZGNhUGFybTsJLyogRURDQSBwYXJhbWV0ZXJzIG9mIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAgKi8KKwlzdHJ1Y3QgcnRfcWJzc19sb2FkX3Bhcm0gQVBRYnNzTG9hZDsJLyogUUJTUyBsb2FkIG9mIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAgKi8KIAotCS8vIENvcHkgc3VwcG9ydGVkIHJhdGUgZnJvbSBkZXNpcmVkIEFQJ3MgYmVhY29uLiBXZSBhcmUgdHJ5aW5nIHRvIG1hdGNoCi0JLy8gQVAncyBzdXBwb3J0ZWQgYW5kIGV4dGVuZGVkIHJhdGUgc2V0dGluZ3MuCi0JVUNIQVIJCSAgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ci0JVUNIQVIJCSAgICAgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ci0JVUNIQVIJCSAgICAgICAgU3VwUmF0ZUxlbjsKLQlVQ0hBUgkJICAgICAgICBFeHRSYXRlTGVuOwotCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKLQlVQ0hBUgkJICAgICAgICAJSHRDYXBhYmlsaXR5TGVuOwotCUFERF9IVF9JTkZPX0lFCQlBZGRIdEluZm87CS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotCVVDSEFSCQkJTmV3RXh0Q2hhbm5lbE9mZnNldDsKLQkvL1JUX0hUX0NBUEFCSUxJVFkJU3VwcG9ydGVkSHRQaHk7CisJLyogbmV3IHRvIGtlZXAgUmFsaW5rIHNwZWNpZmljIGZlYXR1cmUgKi8KKwl1bnNpZ25lZCBsb25nIEFQUmFsaW5rSWU7CiAKLSAgICAvLyBuZXcgZm9yIFFPUwotICAgIFFPU19DQVBBQklMSVRZX1BBUk0gQVBRb3NDYXBhYmlsaXR5OyAgICAvLyBRT1MgY2FwYWJpbGl0eSBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCi0gICAgRURDQV9QQVJNICAgICAgICAgICBBUEVkY2FQYXJtOyAgICAgICAgIC8vIEVEQ0EgcGFyYW1ldGVycyBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCi0gICAgUUJTU19MT0FEX1BBUk0gICAgICBBUFFic3NMb2FkOyAgICAgICAgIC8vIFFCU1MgbG9hZCBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCisJc3RydWN0IHJ0X2Jzc190YWJsZSBTc2lkQnNzVGFiOwkvKiBBUCBsaXN0IGZvciB0aGUgc2FtZSBTU0lEICovCisJc3RydWN0IHJ0X2Jzc190YWJsZSBSb2FtVGFiOwkvKiBBUCBsaXN0IGVsaWdpYmxlIGZvciByb2FtaW5nICovCisJdW5zaWduZWQgbG9uZyBCc3NJZHg7CisJdW5zaWduZWQgbG9uZyBSb2FtSWR4OwogCi0gICAgLy8gbmV3IHRvIGtlZXAgUmFsaW5rIHNwZWNpZmljIGZlYXR1cmUKLSAgICBVTE9ORyAgICAgICAgICAgICAgIEFQUmFsaW5rSWU7CisJQk9PTEVBTiBDdXJyUmVxSXNGcm9tTmRpczsKIAotICAgIEJTU19UQUJMRSAgICAgICAgICAgU3NpZEJzc1RhYjsgICAgIC8vIEFQIGxpc3QgZm9yIHRoZSBzYW1lIFNTSUQKLSAgICBCU1NfVEFCTEUgICAgICAgICAgIFJvYW1UYWI7ICAgICAgICAvLyBBUCBsaXN0IGVsaWdpYmxlIGZvciByb2FtaW5nCi0gICAgVUxPTkcgICAgICAgICAgICAgICBCc3NJZHg7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICBSb2FtSWR4OworCXN0cnVjdCBydF9yYWxpbmtfdGltZXIgQmVhY29uVGltZXIsIFNjYW5UaW1lcjsKKwlzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyIEF1dGhUaW1lcjsKKwlzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyIEFzc29jVGltZXIsIFJlYXNzb2NUaW1lciwgRGlzYXNzb2NUaW1lcjsKK307CiAKLQlCT09MRUFOCQkJCUN1cnJSZXFJc0Zyb21OZGlzOworc3RydWN0IHJ0X21sbWVfYWRkYmFfcmVxIHsKKwl1OCBXY2lkOwkJLyogKi8KKwl1OCBwQWRkcltNQUNfQUREUl9MRU5dOworCXU4IEJhQnVmU2l6ZTsKKwl1MTYgVGltZU91dFZhbHVlOworCXU4IFRJRDsKKwl1OCBUb2tlbjsKKwl1MTYgQmFTdGFydFNlcTsKK307CiAKLSAgICBSQUxJTktfVElNRVJfU1RSVUNUIEJlYWNvblRpbWVyLCBTY2FuVGltZXI7Ci0gICAgUkFMSU5LX1RJTUVSX1NUUlVDVCBBdXRoVGltZXI7Ci0gICAgUkFMSU5LX1RJTUVSX1NUUlVDVCBBc3NvY1RpbWVyLCBSZWFzc29jVGltZXIsIERpc2Fzc29jVGltZXI7Ci19IE1MTUVfQVVYLCAqUE1MTUVfQVVYOworc3RydWN0IHJ0X21sbWVfZGVsYmFfcmVxIHsKKwl1OCBXY2lkOwkJLyogKi8KKwl1OCBBZGRyW01BQ19BRERSX0xFTl07CisJdTggVElEOworCXU4IEluaXRpYXRvcjsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9NTE1FX0FEREJBX1JFUV9TVFJVQ1R7Ci0JVUNIQVIgICBXY2lkOwkvLwotCVVDSEFSICAgcEFkZHJbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgIEJhQnVmU2l6ZTsKLQlVU0hPUlQJVGltZU91dFZhbHVlOwotCVVDSEFSICAgVElEOwotCVVDSEFSICAgVG9rZW47Ci0JVVNIT1JUCUJhU3RhcnRTZXE7Ci19IE1MTUVfQUREQkFfUkVRX1NUUlVDVCwgKlBNTE1FX0FEREJBX1JFUV9TVFJVQ1Q7CisvKiBhc3NvYyBzdHJ1Y3QgaXMgZXF1YWwgdG8gcmVhc3NvYyAqLworc3RydWN0IHJ0X21sbWVfYXNzb2NfcmVxIHsKKwl1OCBBZGRyW01BQ19BRERSX0xFTl07CisJdTE2IENhcGFiaWxpdHlJbmZvOworCXUxNiBMaXN0ZW5JbnR2OworCXVuc2lnbmVkIGxvbmcgVGltZW91dDsKK307CiAKK3N0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSB7CisJdTggQWRkcltNQUNfQUREUl9MRU5dOworCXUxNiBSZWFzb247Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfTUxNRV9ERUxCQV9SRVFfU1RSVUNUewotCVVDSEFSICAgV2NpZDsJLy8KLQlVQ0hBUiAgICAgQWRkcltNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgVElEOwotCVVDSEFSCUluaXRpYXRvcjsKLX0gTUxNRV9ERUxCQV9SRVFfU1RSVUNULCAqUE1MTUVfREVMQkFfUkVRX1NUUlVDVDsKK3N0cnVjdCBydF9tbG1lX2F1dGhfcmVxIHsKKwl1OCBBZGRyW01BQ19BRERSX0xFTl07CisJdTE2IEFsZzsKKwl1bnNpZ25lZCBsb25nIFRpbWVvdXQ7Cit9OwogCi0vLyBhc3NvYyBzdHJ1Y3QgaXMgZXF1YWwgdG8gcmVhc3NvYwotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfQVNTT0NfUkVRX1NUUlVDVHsKLSAgICBVQ0hBUiAgICAgQWRkcltNQUNfQUREUl9MRU5dOwotICAgIFVTSE9SVCAgICBDYXBhYmlsaXR5SW5mbzsKLSAgICBVU0hPUlQgICAgTGlzdGVuSW50djsKLSAgICBVTE9ORyAgICAgVGltZW91dDsKLX0gTUxNRV9BU1NPQ19SRVFfU1RSVUNULCAqUE1MTUVfQVNTT0NfUkVRX1NUUlVDVCwgTUxNRV9SRUFTU09DX1JFUV9TVFJVQ1QsICpQTUxNRV9SRUFTU09DX1JFUV9TVFJVQ1Q7CitzdHJ1Y3QgcnRfbWxtZV9kZWF1dGhfcmVxIHsKKwl1OCBBZGRyW01BQ19BRERSX0xFTl07CisJdTE2IFJlYXNvbjsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9NTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1R7Ci0gICAgVUNIQVIgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKLSAgICBVU0hPUlQgICAgUmVhc29uOwotfSBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QsICpQTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUOworc3RydWN0IHJ0X21sbWVfam9pbl9yZXEgeworCXVuc2lnbmVkIGxvbmcgQnNzSWR4OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfQVVUSF9SRVFfU1RSVUNUIHsKLSAgICBVQ0hBUiAgICAgICAgQWRkcltNQUNfQUREUl9MRU5dOwotICAgIFVTSE9SVCAgICAgICBBbGc7Ci0gICAgVUxPTkcgICAgICAgIFRpbWVvdXQ7Ci19IE1MTUVfQVVUSF9SRVFfU1RSVUNULCAqUE1MTUVfQVVUSF9SRVFfU1RSVUNUOworc3RydWN0IHJ0X21sbWVfc2Nhbl9yZXEgeworCXU4IEJzc2lkW01BQ19BRERSX0xFTl07CisJdTggQnNzVHlwZTsKKwl1OCBTY2FuVHlwZTsKKwl1OCBTc2lkTGVuOworCWNoYXIgU3NpZFtNQVhfTEVOX09GX1NTSURdOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfREVBVVRIX1JFUV9TVFJVQ1QgewotICAgIFVDSEFSICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07Ci0gICAgVVNIT1JUICAgICAgIFJlYXNvbjsKLX0gTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCwgKlBNTE1FX0RFQVVUSF9SRVFfU1RSVUNUOworc3RydWN0IHJ0X21sbWVfc3RhcnRfcmVxIHsKKwljaGFyIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKwl1OCBTc2lkTGVuOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFVMT05HICAgICAgQnNzSWR4OwotfSBNTE1FX0pPSU5fUkVRX1NUUlVDVDsKK3N0cnVjdCBQQUNLRUQgcnRfZWlkIHsKKwl1OCBFaWQ7CisJdTggTGVuOworCXU4IE9jdGV0WzFdOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfU0NBTl9SRVFfU1RSVUNUIHsKLSAgICBVQ0hBUiAgICAgIEJzc2lkW01BQ19BRERSX0xFTl07Ci0gICAgVUNIQVIgICAgICBCc3NUeXBlOwotICAgIFVDSEFSICAgICAgU2NhblR5cGU7Ci0gICAgVUNIQVIgICAgICBTc2lkTGVuOwotICAgIENIQVIgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOwotfSBNTE1FX1NDQU5fUkVRX1NUUlVDVCwgKlBNTE1FX1NDQU5fUkVRX1NUUlVDVDsKK3N0cnVjdCBQQUNLRUQgcnRfcnRtcF90eF9yYXRlX3N3aXRjaCB7CisJdTggSXRlbU5vOworCXU4IFNUQkM6MTsKKwl1OCBTaG9ydEdJOjE7CisJdTggQlc6MTsKKwl1OCBSc3YxOjE7CisJdTggTW9kZToyOworCXU4IFJzdjI6MjsKKwl1OCBDdXJyTUNTOworCXU4IFRyYWluVXA7CisJdTggVHJhaW5Eb3duOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfU1RBUlRfUkVRX1NUUlVDVCB7Ci0gICAgQ0hBUiAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOwotICAgIFVDSEFSICAgICAgIFNzaWRMZW47Ci19IE1MTUVfU1RBUlRfUkVRX1NUUlVDVCwgKlBNTE1FX1NUQVJUX1JFUV9TVFJVQ1Q7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0gICAgVUNIQVIgICBFaWQ7Ci0gICAgVUNIQVIgICBMZW47Ci0gICAgQ0hBUiAgIE9jdGV0WzFdOwotfSBFSURfU1RSVUNULCpQRUlEX1NUUlVDVCwgQkVBQ09OX0VJRF9TVFJVQ1QsICpQQkVBQ09OX0VJRF9TVFJVQ1Q7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlRNUF9UWF9SQVRFX1NXSVRDSAotewotCVVDSEFSICAgSXRlbU5vOwotCVVDSEFSCVNUQkM6MTsKLQlVQ0hBUglTaG9ydEdJOjE7Ci0JVUNIQVIJQlc6MTsKLQlVQ0hBUglSc3YxOjE7Ci0JVUNIQVIJTW9kZToyOwotCVVDSEFSCVJzdjI6MjsKLQlVQ0hBUiAgIEN1cnJNQ1M7Ci0JVUNIQVIgICBUcmFpblVwOwotCVVDSEFSICAgVHJhaW5Eb3duOwotfSBSUlRNUF9UWF9SQVRFX1NXSVRDSCwgKlBSVE1QX1RYX1JBVEVfU1dJVENIOwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBBUCBtbG1lLmggPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2RlZmluZSBUQlRUX1BSRUxPQURfVElNRSAgICAgICAzODQgICAgICAgIC8vIHVzZWMuIExvbWdQcmVhbWJsZSArIDI0LWJ5dGUgYXQgMU1icHMKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09IEFQIG1sbWUuaCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisjZGVmaW5lIFRCVFRfUFJFTE9BRF9USU1FICAgICAgIDM4NAkvKiB1c2VjLiBMb21nUHJlYW1ibGUgKyAyNC1ieXRlIGF0IDFNYnBzICovCiAjZGVmaW5lIERFRkFVTFRfRFRJTV9QRVJJT0QgICAgIDEKIAotI2RlZmluZSBNQUNfVEFCTEVfQUdFT1VUX1RJTUUJCQkzMDAJCQkvLyB1bml0OiBzZWMKLSNkZWZpbmUgTUFDX1RBQkxFX0FTU09DX1RJTUVPVVQJCQk1CQkJLy8gdW5pdDogc2VjCisjZGVmaW5lIE1BQ19UQUJMRV9BR0VPVVRfVElNRQkJCTMwMAkvKiB1bml0OiBzZWMgKi8KKyNkZWZpbmUgTUFDX1RBQkxFX0FTU09DX1RJTUVPVVQJCQk1CS8qIHVuaXQ6IHNlYyAqLwogI2RlZmluZSBNQUNfVEFCTEVfRlVMTChUYWIpCQkJCSgoVGFiKS5zaXplID09IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQogCi0vLyBBUCBzaGFsbCBkcm9wIHRoZSBzdGEgaWYgY29udGluZSBUeCBmYWlsIGNvdW50IHJlYWNoIGl0LgotI2RlZmluZSBNQUNfRU5UUllfTElGRV9DSEVDS19DTlQJCTIwCQkJLy8gcGFja2V0IGNudC4KKy8qIEFQIHNoYWxsIGRyb3AgdGhlIHN0YSBpZiBjb250aW5lIFR4IGZhaWwgY291bnQgcmVhY2ggaXQuICovCisjZGVmaW5lIE1BQ19FTlRSWV9MSUZFX0NIRUNLX0NOVAkJMjAJLyogcGFja2V0IGNudC4gKi8KIAotLy8gVmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+U3N0CisvKiBWYWx1ZSBkb21haW4gb2YgcE1hY0VudHJ5LT5Tc3QgKi8KIHR5cGVkZWYgZW51bSBfU3N0IHsKLSAgICBTU1RfTk9UX0FVVEgsICAgLy8gMDogZXF1aXZhbGVudCB0byBJRUVFIDgwMi4xMS8xOTk5IHN0YXRlIDEKLSAgICBTU1RfQVVUSCwgICAgICAgLy8gMTogZXF1aXZhbGVudCB0byBJRUVFIDgwMi4xMS8xOTk5IHN0YXRlIDIKLSAgICBTU1RfQVNTT0MgICAgICAgLy8gMjogZXF1aXZhbGVudCB0byBJRUVFIDgwMi4xMS8xOTk5IHN0YXRlIDMKKwlTU1RfTk9UX0FVVEgsCQkvKiAwOiBlcXVpdmFsZW50IHRvIElFRUUgODAyLjExLzE5OTkgc3RhdGUgMSAqLworCVNTVF9BVVRILAkJLyogMTogZXF1aXZhbGVudCB0byBJRUVFIDgwMi4xMS8xOTk5IHN0YXRlIDIgKi8KKwlTU1RfQVNTT0MJCS8qIDI6IGVxdWl2YWxlbnQgdG8gSUVFRSA4MDIuMTEvMTk5OSBzdGF0ZSAzICovCiB9IFNTVDsKIAotLy8gdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+QXV0aFN0YXRlCisvKiB2YWx1ZSBkb21haW4gb2YgcE1hY0VudHJ5LT5BdXRoU3RhdGUgKi8KIHR5cGVkZWYgZW51bSBfQXV0aFN0YXRlIHsKLSAgICBBU19OT1RfQVVUSCwKLSAgICBBU19BVVRIX09QRU4sICAgICAgIC8vIFNUQSBoYXMgYmVlbiBhdXRoZW50aWNhdGVkIHVzaW5nIE9QRU4gU1lTVEVNCi0gICAgQVNfQVVUSF9LRVksICAgICAgICAvLyBTVEEgaGFzIGJlZW4gYXV0aGVudGljYXRlZCB1c2luZyBTSEFSRUQgS0VZCi0gICAgQVNfQVVUSEVOVElDQVRJTkcgICAvLyBTVEEgaXMgd2FpdGluZyBmb3IgQVVUSCBzZXEjMyB1c2luZyBTSEFSRUQgS0VZCisJQVNfTk9UX0FVVEgsCisJQVNfQVVUSF9PUEVOLAkJLyogU1RBIGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQgdXNpbmcgT1BFTiBTWVNURU0gKi8KKwlBU19BVVRIX0tFWSwJCS8qIFNUQSBoYXMgYmVlbiBhdXRoZW50aWNhdGVkIHVzaW5nIFNIQVJFRCBLRVkgKi8KKwlBU19BVVRIRU5USUNBVElORwkvKiBTVEEgaXMgd2FpdGluZyBmb3IgQVVUSCBzZXEjMyB1c2luZyBTSEFSRUQgS0VZICovCiB9IEFVVEhfU1RBVEU7CiAKLS8vZm9yLXdwYSB2YWx1ZSBkb21haW4gb2YgcE1hY0VudHJ5LT5XcGFTdGF0ZSAgODAyLjFpIEQzICAgcC4xMTQKKy8qZm9yLXdwYSB2YWx1ZSBkb21haW4gb2YgcE1hY0VudHJ5LT5XcGFTdGF0ZSAgODAyLjFpIEQzICAgcC4xMTQgKi8KIHR5cGVkZWYgZW51bSBfQXBXcGFTdGF0ZSB7Ci0gICAgQVNfTk9UVVNFLCAgICAgICAgICAgICAgLy8gMAotICAgIEFTX0RJU0NPTk5FQ1QsICAgICAgICAgIC8vIDEKLSAgICBBU19ESVNDT05ORUNURUQsICAgICAgICAvLyAyCi0gICAgQVNfSU5JVElBTElaRSwgICAgICAgICAgLy8gMwotICAgIEFTX0FVVEhFTlRJQ0FUSU9OLCAgICAgIC8vIDQKLSAgICBBU19BVVRIRU5USUNBVElPTjIsICAgICAvLyA1Ci0gICAgQVNfSU5JVFBNSywgICAgICAgICAgICAgLy8gNgotICAgIEFTX0lOSVRQU0ssICAgICAgICAgICAgIC8vIDcKLSAgICBBU19QVEtTVEFSVCwgICAgICAgICAgICAvLyA4Ci0gICAgQVNfUFRLSU5JVF9ORUdPVElBVElORywgLy8gOQotICAgIEFTX1BUS0lOSVRET05FLCAgICAgICAgIC8vIDEwCi0gICAgQVNfVVBEQVRFS0VZUywgICAgICAgICAgLy8gMTEKLSAgICBBU19JTlRFR1JJVFlfRkFJTFVSRSwgICAvLyAxMgotICAgIEFTX0tFWVVQREFURSwgICAgICAgICAgIC8vIDEzCisJQVNfTk9UVVNFLAkJLyogMCAqLworCUFTX0RJU0NPTk5FQ1QsCQkvKiAxICovCisJQVNfRElTQ09OTkVDVEVELAkvKiAyICovCisJQVNfSU5JVElBTElaRSwJCS8qIDMgKi8KKwlBU19BVVRIRU5USUNBVElPTiwJLyogNCAqLworCUFTX0FVVEhFTlRJQ0FUSU9OMiwJLyogNSAqLworCUFTX0lOSVRQTUssCQkvKiA2ICovCisJQVNfSU5JVFBTSywJCS8qIDcgKi8KKwlBU19QVEtTVEFSVCwJCS8qIDggKi8KKwlBU19QVEtJTklUX05FR09USUFUSU5HLAkvKiA5ICovCisJQVNfUFRLSU5JVERPTkUsCQkvKiAxMCAqLworCUFTX1VQREFURUtFWVMsCQkvKiAxMSAqLworCUFTX0lOVEVHUklUWV9GQUlMVVJFLAkvKiAxMiAqLworCUFTX0tFWVVQREFURSwJCS8qIDEzICovCiB9IEFQX1dQQV9TVEFURTsKIAotLy8gZm9yLXdwYSB2YWx1ZSBkb21haW4gb2YgcE1hY0VudHJ5LT5XcGFTdGF0ZSAgODAyLjFpIEQzICAgcC4xMTQKKy8qIGZvci13cGEgdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+V3BhU3RhdGUgIDgwMi4xaSBEMyAgIHAuMTE0ICovCiB0eXBlZGVmIGVudW0gX0dUS1N0YXRlIHsKLSAgICBSRUtFWV9ORUdPVElBVElORywKLSAgICBSRUtFWV9FU1RBQkxJU0hFRCwKLSAgICBLRVlFUlJPUiwKKwlSRUtFWV9ORUdPVElBVElORywKKwlSRUtFWV9FU1RBQkxJU0hFRCwKKwlLRVlFUlJPUiwKIH0gR1RLX1NUQVRFOwogCi0vLyAgZm9yLXdwYSAgdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+V3BhU3RhdGUgIDgwMi4xaSBEMyAgIHAuMTE0CisvKiAgZm9yLXdwYSAgdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+V3BhU3RhdGUgIDgwMi4xaSBEMyAgIHAuMTE0ICovCiB0eXBlZGVmIGVudW0gX1dwYUdUS1N0YXRlIHsKLSAgICBTRVRLRVlTLAotICAgIFNFVEtFWVNfRE9ORSwKKwlTRVRLRVlTLAorCVNFVEtFWVNfRE9ORSwKIH0gV1BBX0dUS19TVEFURTsKLS8vID09PT09PT09PT09PT09PT09PT09PT0gZW5kIG9mIEFQIG1sbWUuaCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvKiA9PT09PT09PT09PT09PT09PT09PT09IGVuZCBvZiBBUCBtbG1lLmggPT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi0KLSNlbmRpZgkvLyBNTE1FX0hfXworI2VuZGlmIC8qIE1MTUVfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL29pZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9vaWQuaAppbmRleCAwMjI3YzRhLi5mZDFjMTQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL29pZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvb2lkLmgKQEAgLTM3LDMyICszNywzNyBAQAogI2lmbmRlZiBfT0lEX0hfCiAjZGVmaW5lIF9PSURfSF8KIAorLyojaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4gKi8KIAorI2lmbmRlZiBUUlVFCiAjZGVmaW5lIFRSVUUJCQkJMQorI2VuZGlmCisjaWZuZGVmIEZBTFNFCiAjZGVmaW5lIEZBTFNFCQkJCTAKLS8vCi0vLyBJRUVFIDgwMi4xMSBTdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucwotLy8KLSNkZWZpbmUgTUFYX1RYX1BPV0VSX0xFVkVMICAgICAgICAgICAgICAxMDAgICAvKiBtVyAqLwotI2RlZmluZSBNQVhfUlNTSV9UUklHR0VSICAgICAgICAgICAgICAgIC0xMCAgICAvKiBkQm0gKi8KLSNkZWZpbmUgTUlOX1JTU0lfVFJJR0dFUiAgICAgICAgICAgICAgICAtMjAwICAgLyogZEJtICovCi0jZGVmaW5lIE1BWF9GUkFHX1RIUkVTSE9MRCAgICAgICAgICAgICAgMjM0NiAgLyogYnl0ZSBjb3VudCAqLwotI2RlZmluZSBNSU5fRlJBR19USFJFU0hPTEQgICAgICAgICAgICAgIDI1NiAgIC8qIGJ5dGUgY291bnQgKi8KLSNkZWZpbmUgTUFYX1JUU19USFJFU0hPTEQgICAgICAgICAgICAgICAyMzQ3ICAvKiBieXRlIGNvdW50ICovCisjZW5kaWYKKy8qICovCisvKiBJRUVFIDgwMi4xMSBTdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucyAqLworLyogKi8KKyNkZWZpbmUgTUFYX1RYX1BPV0VSX0xFVkVMICAgICAgICAgICAgICAxMDAJLyogbVcgKi8KKyNkZWZpbmUgTUFYX1JTU0lfVFJJR0dFUiAgICAgICAgICAgICAgICAtMTAJLyogZEJtICovCisjZGVmaW5lIE1JTl9SU1NJX1RSSUdHRVIgICAgICAgICAgICAgICAgLTIwMAkvKiBkQm0gKi8KKyNkZWZpbmUgTUFYX0ZSQUdfVEhSRVNIT0xEICAgICAgICAgICAgICAyMzQ2CS8qIGJ5dGUgY291bnQgKi8KKyNkZWZpbmUgTUlOX0ZSQUdfVEhSRVNIT0xEICAgICAgICAgICAgICAyNTYJLyogYnl0ZSBjb3VudCAqLworI2RlZmluZSBNQVhfUlRTX1RIUkVTSE9MRCAgICAgICAgICAgICAgIDIzNDcJLyogYnl0ZSBjb3VudCAqLwogCi0vLyBuZXcgdHlwZXMgZm9yIE1lZGlhIFNwZWNpZmljIEluZGljYXRpb25zCi0vLyBFeHRlbnNpb24gY2hhbm5lbCBvZmZzZXQKKy8qIG5ldyB0eXBlcyBmb3IgTWVkaWEgU3BlY2lmaWMgSW5kaWNhdGlvbnMgKi8KKy8qIEV4dGVuc2lvbiBjaGFubmVsIG9mZnNldCAqLwogI2RlZmluZSBFWFRDSEFfTk9ORQkJCTAKICNkZWZpbmUgRVhUQ0hBX0FCT1ZFCQkweDEKICNkZWZpbmUgRVhUQ0hBX0JFTE9XCQkweDMKIAotLy8gQlcKKy8qIEJXICovCiAjZGVmaW5lIEJBTkRfV0lEVEhfMjAJCTAKICNkZWZpbmUgQkFORF9XSURUSF80MAkJMQogI2RlZmluZSBCQU5EX1dJRFRIX0JPVEgJCTIKLSNkZWZpbmUgQkFORF9XSURUSF8xMAkJMwkvLyA4MDIuMTFqIGhhcyAxME1Iei4gVGhpcyBkZWZpbml0aW9uIGlzIGZvciBpbnRlcm5hbCB1c2FnZS4gZG9lc24ndCBmaWxsIGluIHRoZSBJRSBvciBvdGhlciBmaWVsZC4KLS8vIFNIT1JUR0kKLSNkZWZpbmUgR0FQX0lOVEVSVkFMXzQwMAkxCS8vIG9ubHkgc3VwcG9ydCBpbiBIVCBtb2RlCisjZGVmaW5lIEJBTkRfV0lEVEhfMTAJCTMJLyogODAyLjExaiBoYXMgMTBNSHouIFRoaXMgZGVmaW5pdGlvbiBpcyBmb3IgaW50ZXJuYWwgdXNhZ2UuIGRvZXNuJ3QgZmlsbCBpbiB0aGUgSUUgb3Igb3RoZXIgZmllbGQuICovCisvKiBTSE9SVEdJICovCisjZGVmaW5lIEdBUF9JTlRFUlZBTF80MDAJMQkvKiBvbmx5IHN1cHBvcnQgaW4gSFQgbW9kZSAqLwogI2RlZmluZSBHQVBfSU5URVJWQUxfODAwCTAKICNkZWZpbmUgR0FQX0lOVEVSVkFMX0JPVEgJMgogCkBAIC03MywyNCArNzgsMjQgQEAKICNkZWZpbmUgTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTICAgICAgICA4CiAjZGVmaW5lIE5ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWCAgICAgMTYKICNkZWZpbmUgTUFDX0FERFJfTEVOR1RIICAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIE1BWF9OVU1fT0ZfQ0hTCQkJCQk0OSAvLyAxNCBjaGFubmVscyBAMi40RyArICAxMkBVTklJICsgNCBATU1BQyArIDExIEBIaXBlckxBTjIgKyA3IEBKYXBhbiArIDEgYXMgTlVMTCB0ZXJtaW5hdGlvbmMKLSNkZWZpbmUgTUFYX05VTUJFUl9PRl9FVkVOVAkJCQkxMCAgLy8gZW50cnkgIyBpbiBFVkVOVCB0YWJsZQotI2RlZmluZSBNQVhfTlVNQkVSX09GX01BQwkJCQkzMiAvLyBpZiBNQVhfTUJTU0lEX05VTSBpcyA4LCB0aGlzIHZhbHVlIGNhbid0IGJlIGxhcmdlciB0aGFuIDIxMQorLyojZGVmaW5lIE1BWF9OVU1fT0ZfQ0hTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ5IC8vIDE0IGNoYW5uZWxzIEAyLjRHICsgIDEyQFVOSUkgKyA0IEBNTUFDICsgMTEgQEhpcGVyTEFOMiArIDcgQEphcGFuICsgMSBhcyBOVUxMIHRlcm1pbmF0aW9uYyAqLworI2RlZmluZSBNQVhfTlVNX09GX0NIUwkJCQk1NAkvKiAxNCBjaGFubmVscyBAMi40RyArICAxMkBVTklJKGxvd2VyL21pZGRsZSkgKyAxNkBIaXBlckxBTjIgKyAxMUBVTklJKHVwcGVyKSArIDAgQEphcGFuICsgMSBhcyBOVUxMIHRlcm1pbmF0aW9uICovCisjZGVmaW5lIE1BWF9OVU1CRVJfT0ZfRVZFTlQJCQkJMTAJLyogZW50cnkgIyBpbiBFVkVOVCB0YWJsZSAqLworI2RlZmluZSBNQVhfTlVNQkVSX09GX01BQwkJCQkzMgkvKiBpZiBNQVhfTUJTU0lEX05VTSBpcyA4LCB0aGlzIHZhbHVlIGNhbid0IGJlIGxhcmdlciB0aGFuIDIxMSAqLwogI2RlZmluZSBNQVhfTlVNQkVSX09GX0FDTAkJCQk2NAotI2RlZmluZSBNQVhfTEVOR1RIX09GX1NVUFBPUlRfUkFURVMJCTEyICAgIC8vIDEsIDIsIDUuNSwgMTEsIDYsIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQKKyNkZWZpbmUgTUFYX0xFTkdUSF9PRl9TVVBQT1JUX1JBVEVTCQkxMgkvKiAxLCAyLCA1LjUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0ICovCiAjZGVmaW5lIE1BWF9OVU1CRVJfT0ZfRExTX0VOVFJZCQkJNAogCi0jZGVmaW5lIE9JRF9HRU5fTUFDSElORV9OQU1FICAgICAgICAgICAgICAgMHgwMDAxMDIxQQotCiAjZGVmaW5lIFJUX1FVRVJZX1NJR05BTF9DT05URVhUCQkJCTB4MDQwMgogI2RlZmluZSBSVF9TRVRfSUFQUF9QSUQgICAgICAgICAgICAgICAgIAkweDA0MDQKICNkZWZpbmUgUlRfU0VUX0FQRF9QSUQJCQkJCQkweDA0MDUKICNkZWZpbmUgUlRfU0VUX0RFTF9NQUNfRU5UUlkJCQkJMHgwNDA2Ci0KLS8vCi0vLyBJRUVFIDgwMi4xMSBPSURzCi0vLworI2RlZmluZSBSVF9RVUVSWV9FVkVOVF9UQUJMRQkJCTB4MDQwNworLyogKi8KKy8qIElFRUUgODAyLjExIE9JRHMgKi8KKy8qICovCiAjZGVmaW5lCU9JRF9HRVRfU0VUX1RPR0dMRQkJCTB4ODAwMAorI2RlZmluZQlPSURfR0VUX1NFVF9GUk9NX1VJCQkJMHg0MDAwCiAKICNkZWZpbmUgT0lEXzgwMl8xMV9BRERfV0VQCQkJMHgwMTEyCiAjZGVmaW5lIE9JRF84MDJfMTFfRElTQVNTT0NJQVRFCQkJMHgwMTE0CkBAIC0xMDEsMzggKzEwNiw0MiBAQAogCiAjZGVmaW5lCVJUX09JRF9ERVZJQ0VfTkFNRQkJCQkJCQkweDA2MDcKICNkZWZpbmUJUlRfT0lEX1ZFUlNJT05fSU5GTwkJCQkJCQkweDA2MDgKKyNkZWZpbmUJT0lEXzgwMl8xMV9CU1NJRF9MSVNUCQkJCQkJMHgwNjA5CisjZGVmaW5lCU9JRF84MDJfM19DVVJSRU5UX0FERFJFU1MJCQkJCTB4MDYwQQogI2RlZmluZQlPSURfR0VOX01FRElBX0NPTk5FQ1RfU1RBVFVTCQkJCTB4MDYwQgorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0xJTktfU1RBVFVTCQkJCTB4MDYwQworI2RlZmluZQlPSURfODAyXzExX1JTU0kJCQkJCQkJCTB4MDYwRAorI2RlZmluZQlPSURfODAyXzExX1NUQVRJU1RJQ1MJCQkJCQkweDA2MEUKICNkZWZpbmUJT0lEX0dFTl9SQ1ZfT0sJCQkJCQkJCTB4MDYwRgogI2RlZmluZQlPSURfR0VOX1JDVl9OT19CVUZGRVIJCQkJCQkweDA2MTAKLQorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0VFUFJPTV9WRVJTSU9OCQkJMHgwNjExCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfRklSTVdBUkVfVkVSU0lPTgkJMHgwNjEyCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9SWF9SQVRFCQkJMHgwNjEzCisjZGVmaW5lCVJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMQkJCQkweDA2MTQKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9QSURWSUQJCQkJCTB4MDYxNQorLypmb3IgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAqLwogI2RlZmluZSBPSURfU0VUX0NPVU5URVJNRUFTVVJFUyAgICAgICAgICAgICAgICAgICAgIDB4MDYxNgogI2RlZmluZSBSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAgICAgICAgICAgICAgIDB4MDYyMQogI2RlZmluZSBSVF9PSURfV0VfVkVSU0lPTl9DT01QSUxFRCAgICAgICAgICAgICAgICAgIDB4MDYyMgogI2RlZmluZSBSVF9PSURfTkVXX0RSSVZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyMwogCi0vL3J0Mjg2MCAsIGthdGh5CiAjZGVmaW5lIFJUX09JRF9EUklWRVJfREVWSUNFX05BTUUgICAgICAgICAgICAgICAgICAgMHgwNjQ1CiAjZGVmaW5lIFJUX09JRF9RVUVSWV9NVUxUSVBMRV9DQVJEX1NVUFBPUlQgICAgICAgICAgMHgwNjQ3CiAKLS8vIFJhbGluayBkZWZpbmVkIE9JRHMKLS8vIERlbm5pcyBMZWUgbW92ZSB0byBwbGF0Zm9ybSBzcGVjaWZpYwotCi10eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1NUQVRVU19UWVBFCi17Ci0gICAgTmRpczgwMl8xMVN0YXR1c1R5cGVfQXV0aGVudGljYXRpb24sCi0gICAgTmRpczgwMl8xMVN0YXR1c1R5cGVfTWVkaWFTdHJlYW1Nb2RlLAotICAgIE5kaXM4MDJfMTFTdGF0dXNUeXBlX1BNS0lEX0NhbmRpZGF0ZUxpc3QsCi0gICAgTmRpczgwMl8xMVN0YXR1c1R5cGVNYXggICAgLy8gbm90IGEgcmVhbCB0eXBlLCBkZWZpbmVkIGFzIGFuIHVwcGVyIGJvdW5kCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1NUQVRVU19UWVBFIHsKKwlOZGlzODAyXzExU3RhdHVzVHlwZV9BdXRoZW50aWNhdGlvbiwKKwlOZGlzODAyXzExU3RhdHVzVHlwZV9NZWRpYVN0cmVhbU1vZGUsCisJTmRpczgwMl8xMVN0YXR1c1R5cGVfUE1LSURfQ2FuZGlkYXRlTGlzdCwKKwlOZGlzODAyXzExU3RhdHVzVHlwZU1heAkvKiBub3QgYSByZWFsIHR5cGUsIGRlZmluZWQgYXMgYW4gdXBwZXIgYm91bmQgKi8KIH0gTkRJU184MDJfMTFfU1RBVFVTX1RZUEUsICpQTkRJU184MDJfMTFfU1RBVFVTX1RZUEU7CiAKLXR5cGVkZWYgVUNIQVIgICBORElTXzgwMl8xMV9NQUNfQUREUkVTU1s2XTsKK3R5cGVkZWYgdTggTkRJU184MDJfMTFfTUFDX0FERFJFU1NbNl07CiAKLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9TVEFUVVNfSU5ESUNBVElPTgotewotICAgIE5ESVNfODAyXzExX1NUQVRVU19UWVBFIFN0YXR1c1R5cGU7Ci19IE5ESVNfODAyXzExX1NUQVRVU19JTkRJQ0FUSU9OLCAqUE5ESVNfODAyXzExX1NUQVRVU19JTkRJQ0FUSU9OOworc3RydWN0IHJ0X25kaXNfODAyXzExX3N0YXR1c19pbmRpY2F0aW9uIHsKKwlORElTXzgwMl8xMV9TVEFUVVNfVFlQRSBTdGF0dXNUeXBlOworfTsKIAotLy8gbWFzayBmb3IgYXV0aGVudGljYXRpb24vaW50ZWdyaXR5IGZpZWxkcworLyogbWFzayBmb3IgYXV0aGVudGljYXRpb24vaW50ZWdyaXR5IGZpZWxkcyAqLwogI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfQVVUSF9GSUVMRFMgICAgICAgIDB4MGYKIAogI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfUkVBVVRIICAgICAgICAgICAgIDB4MDEKQEAgLTE0MCwzMDQgKzE0OSwyODMgQEAKICNkZWZpbmUgTkRJU184MDJfMTFfQVVUSF9SRVFVRVNUX1BBSVJXSVNFX0VSUk9SICAgICAweDA2CiAjZGVmaW5lIE5ESVNfODAyXzExX0FVVEhfUkVRVUVTVF9HUk9VUF9FUlJPUiAgICAgICAgMHgwRQogCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fUkVRVUVTVAotewotICAgIFVMT05HIExlbmd0aDsgICAgICAgICAgICAvLyBMZW5ndGggb2Ygc3RydWN0dXJlCi0gICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQnNzaWQ7Ci0gICAgVUxPTkcgRmxhZ3M7Ci19IE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1QsICpQTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fUkVRVUVTVDsKK3N0cnVjdCBydF9uZGlzXzgwMl8xMV9hdXRoZW50aWNhdGlvbl9yZXF1ZXN0IHsKKwl1bnNpZ25lZCBsb25nIExlbmd0aDsJCS8qIExlbmd0aCBvZiBzdHJ1Y3R1cmUgKi8KKwlORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCc3NpZDsKKwl1bnNpZ25lZCBsb25nIEZsYWdzOworfTsKIAotLy9BZGRlZCBuZXcgdHlwZXMgZm9yIFBNS0lEIENhbmRpZGF0ZSBsaXN0cy4KLXR5cGVkZWYgc3RydWN0IF9QTUtJRF9DQU5ESURBVEUgewotICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJTU0lEOwotICAgIFVMT05HIEZsYWdzOwotfSBQTUtJRF9DQU5ESURBVEUsICpQUE1LSURfQ0FORElEQVRFOworLypBZGRlZCBuZXcgdHlwZXMgZm9yIFBNS0lEIENhbmRpZGF0ZSBsaXN0cy4gKi8KK3N0cnVjdCBydF9wbWtpZF9jYW5kaWRhdGUgeworCU5ESVNfODAyXzExX01BQ19BRERSRVNTIEJTU0lEOworCXVuc2lnbmVkIGxvbmcgRmxhZ3M7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfUE1LSURfQ0FORElEQVRFX0xJU1QKLXsKLSAgICBVTE9ORyBWZXJzaW9uOyAgICAgICAvLyBWZXJzaW9uIG9mIHRoZSBzdHJ1Y3R1cmUKLSAgICBVTE9ORyBOdW1DYW5kaWRhdGVzOyAvLyBOby4gb2YgcG1raWQgY2FuZGlkYXRlcwotICAgIFBNS0lEX0NBTkRJREFURSBDYW5kaWRhdGVMaXN0WzFdOwotfSBORElTXzgwMl8xMV9QTUtJRF9DQU5ESURBVEVfTElTVCwgKlBORElTXzgwMl8xMV9QTUtJRF9DQU5ESURBVEVfTElTVDsKK3N0cnVjdCBydF9uZGlzXzgwMl8xMV9wbWtpZF9jYW5kaWRhdGVfbGlzdCB7CisJdW5zaWduZWQgbG9uZyBWZXJzaW9uOwkJLyogVmVyc2lvbiBvZiB0aGUgc3RydWN0dXJlICovCisJdW5zaWduZWQgbG9uZyBOdW1DYW5kaWRhdGVzOwkvKiBOby4gb2YgcG1raWQgY2FuZGlkYXRlcyAqLworCXN0cnVjdCBydF9wbWtpZF9jYW5kaWRhdGUgQ2FuZGlkYXRlTGlzdFsxXTsKK307CiAKLS8vRmxhZ3MgZm9yIFBNS0lEIENhbmRpZGF0ZSBsaXN0IHN0cnVjdHVyZQorLypGbGFncyBmb3IgUE1LSUQgQ2FuZGlkYXRlIGxpc3Qgc3RydWN0dXJlICovCiAjZGVmaW5lIE5ESVNfODAyXzExX1BNS0lEX0NBTkRJREFURV9QUkVBVVRIX0VOQUJMRUQJMHgwMQogCi0vLyBBZGRlZCBuZXcgdHlwZXMgZm9yIE9GRE0gNUcgYW5kIDIuNEcKLXR5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfTkVUV09SS19UWVBFCi17Ci0gICBOZGlzODAyXzExRkgsCi0gICBOZGlzODAyXzExRFMsCi0gICAgTmRpczgwMl8xMU9GRE01LAotICAgIE5kaXM4MDJfMTFPRkRNNV9OLAotICAgIE5kaXM4MDJfMTFPRkRNMjQsCi0gICAgTmRpczgwMl8xMU9GRE0yNF9OLAotICAgTmRpczgwMl8xMUF1dG9tb2RlLAotICAgIE5kaXM4MDJfMTFOZXR3b3JrVHlwZU1heCAgICAvLyBub3QgYSByZWFsIHR5cGUsIGRlZmluZWQgYXMgYW4gdXBwZXIgYm91bmQKKy8qIEFkZGVkIG5ldyB0eXBlcyBmb3IgT0ZETSA1RyBhbmQgMi40RyAqLwordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgeworCU5kaXM4MDJfMTFGSCwKKwlOZGlzODAyXzExRFMsCisJTmRpczgwMl8xMU9GRE01LAorCU5kaXM4MDJfMTFPRkRNMjQsCisJTmRpczgwMl8xMUF1dG9tb2RlLAorCU5kaXM4MDJfMTFPRkRNNV9OLAorCU5kaXM4MDJfMTFPRkRNMjRfTiwKKwlOZGlzODAyXzExTmV0d29ya1R5cGVNYXgJLyogbm90IGEgcmVhbCB0eXBlLCBkZWZpbmVkIGFzIGFuIHVwcGVyIGJvdW5kICovCiB9IE5ESVNfODAyXzExX05FVFdPUktfVFlQRSwgKlBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEU7CiAKLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9ORVRXT1JLX1RZUEVfTElTVAotewotICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgIE51bWJlck9mSXRlbXM7ICAvLyBpbiBsaXN0IGJlbG93LCBhdCBsZWFzdCAxCi0gICBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgICAgTmV0d29ya1R5cGUgWzFdOwotfSBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEVfTElTVCwgKlBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEVfTElTVDsKK3N0cnVjdCBydF9uZGlzXzgwMl8xMV9uZXR3b3JrX3R5cGVfbGlzdCB7CisJdTMyIE51bWJlck9mSXRlbXM7CS8qIGluIGxpc3QgYmVsb3csIGF0IGxlYXN0IDEgKi8KKwlORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgTmV0d29ya1R5cGVbMV07Cit9OwogCi10eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1BPV0VSX01PREUKLXsKLSAgICBOZGlzODAyXzExUG93ZXJNb2RlQ0FNLAotICAgIE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQLAotICAgIE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUCwKLSAgICBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUCwKLSAgICBOZGlzODAyXzExUG93ZXJNb2RlTWF4ICAgICAgLy8gbm90IGEgcmVhbCBtb2RlLCBkZWZpbmVkIGFzIGFuIHVwcGVyIGJvdW5kCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1BPV0VSX01PREUgeworCU5kaXM4MDJfMTFQb3dlck1vZGVDQU0sCisJTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1AsCisJTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQLAorCU5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQLAorCU5kaXM4MDJfMTFQb3dlck1vZGVNYXgJLyogbm90IGEgcmVhbCBtb2RlLCBkZWZpbmVkIGFzIGFuIHVwcGVyIGJvdW5kICovCiB9IE5ESVNfODAyXzExX1BPV0VSX01PREUsICpQTkRJU184MDJfMTFfUE9XRVJfTU9ERTsKIAotdHlwZWRlZiBVTE9ORyAgIE5ESVNfODAyXzExX1RYX1BPV0VSX0xFVkVMOyAvLyBpbiBtaWxsaXdhdHRzCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgTkRJU184MDJfMTFfVFhfUE9XRVJfTEVWRUw7CS8qIGluIG1pbGxpd2F0dHMgKi8KIAotLy8KLS8vIFJlY2VpdmVkIFNpZ25hbCBTdHJlbmd0aCBJbmRpY2F0aW9uCi0vLwotdHlwZWRlZiBMT05HICAgIE5ESVNfODAyXzExX1JTU0k7ICAgICAgICAgICAvLyBpbiBkQm0KKy8qICovCisvKiBSZWNlaXZlZCBTaWduYWwgU3RyZW5ndGggSW5kaWNhdGlvbiAqLworLyogKi8KK3R5cGVkZWYgbG9uZyBORElTXzgwMl8xMV9SU1NJOwkvKiBpbiBkQm0gKi8KIAotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0NPTkZJR1VSQVRJT05fRkgKLXsKLSAgIFVMT05HICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHN0cnVjdHVyZQotICAgVUxPTkcgICAgICAgICAgIEhvcFBhdHRlcm47ICAgICAgICAvLyBBcyBkZWZpbmVkIGJ5IDgwMi4xMSwgTVNCIHNldAotICAgVUxPTkcgICAgICAgICAgIEhvcFNldDsgICAgICAgICAgICAvLyB0byBvbmUgaWYgbm9uLTgwMi4xMQotICAgVUxPTkcgICAgICAgICAgIER3ZWxsVGltZTsgICAgICAgICAvLyB1bml0cyBhcmUgS3VzZWMKLX0gTkRJU184MDJfMTFfQ09ORklHVVJBVElPTl9GSCwgKlBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OX0ZIOworc3RydWN0IHJ0X25kaXNfODAyXzExX2NvbmZpZ3VyYXRpb25fZmggeworCXVuc2lnbmVkIGxvbmcgTGVuZ3RoOwkJLyogTGVuZ3RoIG9mIHN0cnVjdHVyZSAqLworCXVuc2lnbmVkIGxvbmcgSG9wUGF0dGVybjsJLyogQXMgZGVmaW5lZCBieSA4MDIuMTEsIE1TQiBzZXQgKi8KKwl1bnNpZ25lZCBsb25nIEhvcFNldDsJCS8qIHRvIG9uZSBpZiBub24tODAyLjExICovCisJdW5zaWduZWQgbG9uZyBEd2VsbFRpbWU7CS8qIHVuaXRzIGFyZSBLdXNlYyAqLworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0NPTkZJR1VSQVRJT04KLXsKLSAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgICAvLyBMZW5ndGggb2Ygc3RydWN0dXJlCi0gICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlYWNvblBlcmlvZDsgICAgICAgLy8gdW5pdHMgYXJlIEt1c2VjCi0gICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUSU1XaW5kb3c7ICAgICAgICAgLy8gdW5pdHMgYXJlIEt1c2VjCi0gICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIERTQ29uZmlnOyAgICAgICAgICAgLy8gRnJlcXVlbmN5LCB1bml0cyBhcmUga0h6Ci0gICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OX0ZIICAgIEZIQ29uZmlnOwotfSBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OLCAqUE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT047CitzdHJ1Y3QgcnRfbmRpc184MDJfMTFfY29uZmlndXJhdGlvbiB7CisJdW5zaWduZWQgbG9uZyBMZW5ndGg7CQkvKiBMZW5ndGggb2Ygc3RydWN0dXJlICovCisJdW5zaWduZWQgbG9uZyBCZWFjb25QZXJpb2Q7CS8qIHVuaXRzIGFyZSBLdXNlYyAqLworCXVuc2lnbmVkIGxvbmcgQVRJTVdpbmRvdzsJLyogdW5pdHMgYXJlIEt1c2VjICovCisJdW5zaWduZWQgbG9uZyBEU0NvbmZpZzsJCS8qIEZyZXF1ZW5jeSwgdW5pdHMgYXJlIGtIeiAqLworCXN0cnVjdCBydF9uZGlzXzgwMl8xMV9jb25maWd1cmF0aW9uX2ZoIEZIQ29uZmlnOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1NUQVRJU1RJQ1MKLXsKLSAgIFVMT05HICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiBzdHJ1Y3R1cmUKLSAgIExBUkdFX0lOVEVHRVIgICBUcmFuc21pdHRlZEZyYWdtZW50Q291bnQ7Ci0gICBMQVJHRV9JTlRFR0VSICAgTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIEZhaWxlZENvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIFJldHJ5Q291bnQ7Ci0gICBMQVJHRV9JTlRFR0VSICAgTXVsdGlwbGVSZXRyeUNvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIFJUU1N1Y2Nlc3NDb3VudDsKLSAgIExBUkdFX0lOVEVHRVIgICBSVFNGYWlsdXJlQ291bnQ7Ci0gICBMQVJHRV9JTlRFR0VSICAgQUNLRmFpbHVyZUNvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIEZyYW1lRHVwbGljYXRlQ291bnQ7Ci0gICBMQVJHRV9JTlRFR0VSICAgUmVjZWl2ZWRGcmFnbWVudENvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIE11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudDsKLSAgIExBUkdFX0lOVEVHRVIgICBGQ1NFcnJvckNvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIFRLSVBMb2NhbE1JQ0ZhaWx1cmVzOwotICAgTEFSR0VfSU5URUdFUiAgIFRLSVBSZW1vdGVNSUNFcnJvcnM7Ci0gICBMQVJHRV9JTlRFR0VSICAgVEtJUElDVkVycm9yczsKLSAgIExBUkdFX0lOVEVHRVIgICBUS0lQQ291bnRlck1lYXN1cmVzSW52b2tlZDsKLSAgIExBUkdFX0lOVEVHRVIgICBUS0lQUmVwbGF5czsKLSAgIExBUkdFX0lOVEVHRVIgICBDQ01QRm9ybWF0RXJyb3JzOwotICAgTEFSR0VfSU5URUdFUiAgIENDTVBSZXBsYXlzOwotICAgTEFSR0VfSU5URUdFUiAgIENDTVBEZWNyeXB0RXJyb3JzOwotICAgTEFSR0VfSU5URUdFUiAgIEZvdXJXYXlIYW5kc2hha2VGYWlsdXJlczsKLX0gTkRJU184MDJfMTFfU1RBVElTVElDUywgKlBORElTXzgwMl8xMV9TVEFUSVNUSUNTOworc3RydWN0IHJ0X25kaXNfODAyXzExX3N0YXRpc3RpY3MgeworCXVuc2lnbmVkIGxvbmcgTGVuZ3RoOwkJLyogTGVuZ3RoIG9mIHN0cnVjdHVyZSAqLworCUxBUkdFX0lOVEVHRVIgVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50OworCUxBUkdFX0lOVEVHRVIgTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50OworCUxBUkdFX0lOVEVHRVIgRmFpbGVkQ291bnQ7CisJTEFSR0VfSU5URUdFUiBSZXRyeUNvdW50OworCUxBUkdFX0lOVEVHRVIgTXVsdGlwbGVSZXRyeUNvdW50OworCUxBUkdFX0lOVEVHRVIgUlRTU3VjY2Vzc0NvdW50OworCUxBUkdFX0lOVEVHRVIgUlRTRmFpbHVyZUNvdW50OworCUxBUkdFX0lOVEVHRVIgQUNLRmFpbHVyZUNvdW50OworCUxBUkdFX0lOVEVHRVIgRnJhbWVEdXBsaWNhdGVDb3VudDsKKwlMQVJHRV9JTlRFR0VSIFJlY2VpdmVkRnJhZ21lbnRDb3VudDsKKwlMQVJHRV9JTlRFR0VSIE11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudDsKKwlMQVJHRV9JTlRFR0VSIEZDU0Vycm9yQ291bnQ7CisJTEFSR0VfSU5URUdFUiBUS0lQTG9jYWxNSUNGYWlsdXJlczsKKwlMQVJHRV9JTlRFR0VSIFRLSVBSZW1vdGVNSUNFcnJvcnM7CisJTEFSR0VfSU5URUdFUiBUS0lQSUNWRXJyb3JzOworCUxBUkdFX0lOVEVHRVIgVEtJUENvdW50ZXJNZWFzdXJlc0ludm9rZWQ7CisJTEFSR0VfSU5URUdFUiBUS0lQUmVwbGF5czsKKwlMQVJHRV9JTlRFR0VSIENDTVBGb3JtYXRFcnJvcnM7CisJTEFSR0VfSU5URUdFUiBDQ01QUmVwbGF5czsKKwlMQVJHRV9JTlRFR0VSIENDTVBEZWNyeXB0RXJyb3JzOworCUxBUkdFX0lOVEVHRVIgRm91cldheUhhbmRzaGFrZUZhaWx1cmVzOworfTsKIAotdHlwZWRlZiAgVUxPTkcgIE5ESVNfODAyXzExX0tFWV9JTkRFWDsKLXR5cGVkZWYgVUxPTkdMT05HICAgTkRJU184MDJfMTFfS0VZX1JTQzsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBORElTXzgwMl8xMV9LRVlfSU5ERVg7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBORElTXzgwMl8xMV9LRVlfUlNDOwogCi0jZGVmaW5lIE1BWF9SQURJVVNfU1JWX05VTQkJCTIJICAvLyA4MDIuMXggZmFpbG92ZXIgbnVtYmVyCisjZGVmaW5lIE1BWF9SQURJVVNfU1JWX05VTQkJCTIJLyogODAyLjF4IGZhaWxvdmVyIG51bWJlciAqLwogCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JBRElVU19TUlZfSU5GTyB7Ci0JVUlOVDMyCQkJcmFkaXVzX2lwOwotCVVJTlQzMgkJCXJhZGl1c19wb3J0OwotCVVDSEFSCQkJcmFkaXVzX2tleVs2NF07Ci0JVUNIQVIJCQlyYWRpdXNfa2V5X2xlbjsKLX0gUkFESVVTX1NSVl9JTkZPLCAqUFJBRElVU19TUlZfSU5GTzsKK3N0cnVjdCBQQUNLRUQgcnRfcmFkaXVzX3Nydl9pbmZvIHsKKwl1MzIgcmFkaXVzX2lwOworCXUzMiByYWRpdXNfcG9ydDsKKwl1OCByYWRpdXNfa2V5WzY0XTsKKwl1OCByYWRpdXNfa2V5X2xlbjsKK307CiAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUkFESVVTX0tFWV9JTkZPCi17Ci0JVUNIQVIJCQlyYWRpdXNfc3J2X251bTsKLQlSQURJVVNfU1JWX0lORk8JcmFkaXVzX3Nydl9pbmZvW01BWF9SQURJVVNfU1JWX05VTV07Ci0JVUNIQVIJCQlpZWVlODAyMXhXRVA7CQkgLy8gZHluYW1pYyBXRVAKLSAgICBVQ0hBUiAgICAgICAgICAga2V5X2luZGV4OwotICAgIFVDSEFSICAgICAgICAgICBrZXlfbGVuZ3RoOyAgICAgICAgICAvLyBsZW5ndGggb2Yga2V5IGluIGJ5dGVzCi0gICAgVUNIQVIgICAgICAgICAgIGtleV9tYXRlcmlhbFsxM107Ci19IFJBRElVU19LRVlfSU5GTywgKlBSQURJVVNfS0VZX0lORk87CitzdHJ1Y3QgUEFDS0VEIHJ0X3JhZGl1c19rZXlfaW5mbyB7CisJdTggcmFkaXVzX3Nydl9udW07CisJc3RydWN0IHJ0X3JhZGl1c19zcnZfaW5mbyByYWRpdXNfc3J2X2luZm9bTUFYX1JBRElVU19TUlZfTlVNXTsKKwl1OCBpZWVlODAyMXhXRVA7CS8qIGR5bmFtaWMgV0VQICovCisJdTgga2V5X2luZGV4OworCXU4IGtleV9sZW5ndGg7CS8qIGxlbmd0aCBvZiBrZXkgaW4gYnl0ZXMgKi8KKwl1OCBrZXlfbWF0ZXJpYWxbMTNdOworfTsKIAotLy8gSXQncyB1c2VkIGJ5IDgwMi4xeCBkYWVtb24gdG8gcmVxdWlyZSByZWxhdGl2ZSBjb25maWd1cmF0aW9uCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JBRElVU19DT05GCi17Ci0gICAgVUlOVDMyICAgICAgICAgIExlbmd0aDsgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlCi0gICAgVUNIQVIJCQltYnNzX251bTsJCQkvLyBpbmRpY2F0ZSBtdWx0aXBsZSBCU1MgbnVtYmVyCi0JVUlOVDMyCQkJb3duX2lwX2FkZHI7Ci0JVUlOVDMyCQkJcmV0cnlfaW50ZXJ2YWw7Ci0JVUlOVDMyCQkJc2Vzc2lvbl90aW1lb3V0X2ludGVydmFsOwotCVVDSEFSCQkJRUFQaWZuYW1lW0lGTkFNU0laXTsKLQlVQ0hBUgkJCUVBUGlmbmFtZV9sZW47Ci0JVUNIQVIgCQkJUHJlQXV0aGlmbmFtZVtJRk5BTVNJWl07Ci0JVUNIQVIJCQlQcmVBdXRoaWZuYW1lX2xlbjsKLQlSQURJVVNfS0VZX0lORk8JUmFkaXVzSW5mb1s4LypNQVhfTUJTU0lEX05VTSovXTsKLX0gUkFESVVTX0NPTkYsICpQUkFESVVTX0NPTkY7CisvKiBJdCdzIHVzZWQgYnkgODAyLjF4IGRhZW1vbiB0byByZXF1aXJlIHJlbGF0aXZlIGNvbmZpZ3VyYXRpb24gKi8KK3N0cnVjdCBQQUNLRUQgcnRfcmFkaXVzX2NvbmYgeworCXUzMiBMZW5ndGg7CQkvKiBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KKwl1OCBtYnNzX251bTsJCS8qIGluZGljYXRlIG11bHRpcGxlIEJTUyBudW1iZXIgKi8KKwl1MzIgb3duX2lwX2FkZHI7CisJdTMyIHJldHJ5X2ludGVydmFsOworCXUzMiBzZXNzaW9uX3RpbWVvdXRfaW50ZXJ2YWw7CisJdTggRUFQaWZuYW1lWzhdW0lGTkFNU0laXTsKKwl1OCBFQVBpZm5hbWVfbGVuWzhdOworCXU4IFByZUF1dGhpZm5hbWVbOF1bSUZOQU1TSVpdOworCXU4IFByZUF1dGhpZm5hbWVfbGVuWzhdOworCXN0cnVjdCBydF9yYWRpdXNfa2V5X2luZm8gUmFkaXVzSW5mb1s4XTsKK307CiAKLS8vIEtleSBtYXBwaW5nIGtleXMgcmVxdWlyZSBhIEJTU0lECi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfS0VZCi17Ci0gICAgVUlOVCAgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgICAvLyBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUKLSAgICBVSU5UICAgICAgICAgICBLZXlJbmRleDsKLSAgICBVSU5UICAgICAgICAgICBLZXlMZW5ndGg7ICAgICAgICAgIC8vIGxlbmd0aCBvZiBrZXkgaW4gYnl0ZXMKLSAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKLSAgICBORElTXzgwMl8xMV9LRVlfUlNDIEtleVJTQzsKLSAgICBVQ0hBUiAgICAgICAgICAgS2V5TWF0ZXJpYWxbMV07ICAgICAvLyB2YXJpYWJsZSBsZW5ndGggZGVwZW5kaW5nIG9uIGFib3ZlIGZpZWxkCi19IE5ESVNfODAyXzExX0tFWSwgKlBORElTXzgwMl8xMV9LRVk7CisvKiBLZXkgbWFwcGluZyBrZXlzIHJlcXVpcmUgYSBCU1NJRCAqLworc3RydWN0IHJ0X25kaXNfODAyXzExX2tleSB7CisJdTMyIExlbmd0aDsJCS8qIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZSAqLworCXUzMiBLZXlJbmRleDsKKwl1MzIgS2V5TGVuZ3RoOwkJLyogbGVuZ3RoIG9mIGtleSBpbiBieXRlcyAqLworCU5ESVNfODAyXzExX01BQ19BRERSRVNTIEJTU0lEOworCU5ESVNfODAyXzExX0tFWV9SU0MgS2V5UlNDOworCXU4IEtleU1hdGVyaWFsWzFdOwkvKiB2YXJpYWJsZSBsZW5ndGggZGVwZW5kaW5nIG9uIGFib3ZlIGZpZWxkICovCit9OwogCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfUkVNT1ZFX0tFWQotewotICAgIFVJTlQgICAgICAgICAgIExlbmd0aDsgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlCi0gICAgVUlOVCAgICAgICAgICAgS2V5SW5kZXg7Ci0gICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQlNTSUQ7Ci19IE5ESVNfODAyXzExX1JFTU9WRV9LRVksICpQTkRJU184MDJfMTFfUkVNT1ZFX0tFWTsKK3N0cnVjdCBydF9uZGlzXzgwMl8xMV9wYXNzcGhyYXNlIHsKKwl1MzIgS2V5TGVuZ3RoOwkJLyogbGVuZ3RoIG9mIGtleSBpbiBieXRlcyAqLworCU5ESVNfODAyXzExX01BQ19BRERSRVNTIEJTU0lEOworCXU4IEtleU1hdGVyaWFsWzFdOwkvKiB2YXJpYWJsZSBsZW5ndGggZGVwZW5kaW5nIG9uIGFib3ZlIGZpZWxkICovCit9OwogCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfV0VQCi17Ci0gICBVSU5UICAgICBMZW5ndGg7ICAgICAgICAvLyBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUKLSAgIFVJTlQgICAgIEtleUluZGV4OyAgICAgICAgICAgLy8gMCBpcyB0aGUgcGVyLWNsaWVudCBrZXksIDEtTiBhcmUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2xvYmFsIGtleXMKLSAgIFVJTlQgICAgIEtleUxlbmd0aDsgICAgIC8vIGxlbmd0aCBvZiBrZXkgaW4gYnl0ZXMKLSAgIFVDSEFSICAgICBLZXlNYXRlcmlhbFsxXTsvLyB2YXJpYWJsZSBsZW5ndGggZGVwZW5kaW5nIG9uIGFib3ZlIGZpZWxkCi19IE5ESVNfODAyXzExX1dFUCwgKlBORElTXzgwMl8xMV9XRVA7CitzdHJ1Y3QgcnRfbmRpc184MDJfMTFfcmVtb3ZlX2tleSB7CisJdTMyIExlbmd0aDsJCS8qIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZSAqLworCXUzMiBLZXlJbmRleDsKKwlORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKK307CiAKK3N0cnVjdCBydF9uZGlzXzgwMl8xMV93ZXAgeworCXUzMiBMZW5ndGg7CQkvKiBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KKwl1MzIgS2V5SW5kZXg7CQkvKiAwIGlzIHRoZSBwZXItY2xpZW50IGtleSwgMS1OIGFyZSB0aGUgKi8KKwkvKiBnbG9iYWwga2V5cyAqLworCXUzMiBLZXlMZW5ndGg7CQkvKiBsZW5ndGggb2Yga2V5IGluIGJ5dGVzICovCisJdTggS2V5TWF0ZXJpYWxbMV07CS8qIHZhcmlhYmxlIGxlbmd0aCBkZXBlbmRpbmcgb24gYWJvdmUgZmllbGQgKi8KK307CiAKLXR5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRQotewotICAgTmRpczgwMl8xMUlCU1MsCi0gICBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmUsCi0gICBOZGlzODAyXzExQXV0b1Vua25vd24sCi0gICBOZGlzODAyXzExTW9uaXRvciwKLSAgIE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZU1heCAgICAgLy8gTm90IGEgcmVhbCB2YWx1ZSwgZGVmaW5lZCBhcyB1cHBlciBib3VuZAordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFIHsKKwlOZGlzODAyXzExSUJTUywKKwlOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmUsCisJTmRpczgwMl8xMUF1dG9Vbmtub3duLAorCU5kaXM4MDJfMTFNb25pdG9yLAorCU5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZU1heAkvKiBOb3QgYSByZWFsIHZhbHVlLCBkZWZpbmVkIGFzIHVwcGVyIGJvdW5kICovCiB9IE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUsICpQTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRTsKIAotLy8gQWRkIG5ldyBhdXRoZW50aWNhdGlvbiBtb2RlcwotdHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFCi17Ci0gICBOZGlzODAyXzExQXV0aE1vZGVPcGVuLAotICAgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkLAotICAgTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCwKLSAgICBOZGlzODAyXzExQXV0aE1vZGVXUEEsCi0gICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLLAotICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUsCi0gICBOZGlzODAyXzExQXV0aE1vZGVXUEEyLAotICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSywKLSAgIAlOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMiwKKy8qIEFkZCBuZXcgYXV0aGVudGljYXRpb24gbW9kZXMgKi8KK3R5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSB7CisJTmRpczgwMl8xMUF1dGhNb2RlT3BlbiwKKwlOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQsCisJTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCwKKwlOZGlzODAyXzExQXV0aE1vZGVXUEEsCisJTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLLAorCU5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUsCisJTmRpczgwMl8xMUF1dGhNb2RlV1BBMiwKKwlOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLLAorCU5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyLAogCU5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLLAotICAgTmRpczgwMl8xMUF1dGhNb2RlTWF4ICAgICAgICAgICAvLyBOb3QgYSByZWFsIG1vZGUsIGRlZmluZWQgYXMgdXBwZXIgYm91bmQKKwlOZGlzODAyXzExQXV0aE1vZGVNYXgJLyogTm90IGEgcmVhbCBtb2RlLCBkZWZpbmVkIGFzIHVwcGVyIGJvdW5kICovCiB9IE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUsICpQTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERTsKIAotdHlwZWRlZiBVQ0hBUiAgIE5ESVNfODAyXzExX1JBVEVTW05ESVNfODAyXzExX0xFTkdUSF9SQVRFU107ICAgICAgICAvLyBTZXQgb2YgOCBkYXRhIHJhdGVzCi10eXBlZGVmIFVDSEFSICAgTkRJU184MDJfMTFfUkFURVNfRVhbTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYXTsgIC8vIFNldCBvZiAxNiBkYXRhIHJhdGVzCit0eXBlZGVmIHU4IE5ESVNfODAyXzExX1JBVEVTW05ESVNfODAyXzExX0xFTkdUSF9SQVRFU107CS8qIFNldCBvZiA4IGRhdGEgcmF0ZXMgKi8KK3R5cGVkZWYgdTggTkRJU184MDJfMTFfUkFURVNfRVhbTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYXTsJLyogU2V0IG9mIDE2IGRhdGEgcmF0ZXMgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTXzgwMl8xMV9TU0lECi17Ci0gICAgVUlOVCAgIFNzaWRMZW5ndGg7ICAgICAgICAgLy8gbGVuZ3RoIG9mIFNTSUQgZmllbGQgYmVsb3csIGluIGJ5dGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNhbiBiZSB6ZXJvLgotICAgIFVDSEFSICAgU3NpZFtORElTXzgwMl8xMV9MRU5HVEhfU1NJRF07ICAgICAgICAgICAvLyBTU0lEIGluZm9ybWF0aW9uIGZpZWxkCi19IE5ESVNfODAyXzExX1NTSUQsICpQTkRJU184MDJfMTFfU1NJRDsKK3N0cnVjdCBQQUNLRUQgcnRfbmRpc184MDJfMTFfc3NpZCB7CisJdTMyIFNzaWRMZW5ndGg7CS8qIGxlbmd0aCBvZiBTU0lEIGZpZWxkIGJlbG93LCBpbiBieXRlczsgKi8KKwkvKiB0aGlzIGNhbiBiZSB6ZXJvLiAqLworCXU4IFNzaWRbTkRJU184MDJfMTFfTEVOR1RIX1NTSURdOwkvKiBTU0lEIGluZm9ybWF0aW9uIGZpZWxkICovCit9OwogCitzdHJ1Y3QgUEFDS0VEIHJ0X25kaXNfd2xhbl9ic3NpZCB7CisJdW5zaWduZWQgbG9uZyBMZW5ndGg7CQkvKiBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KKwlORElTXzgwMl8xMV9NQUNfQUREUkVTUyBNYWNBZGRyZXNzOwkvKiBCU1NJRCAqLworCXU4IFJlc2VydmVkWzJdOworCXN0cnVjdCBydF9uZGlzXzgwMl8xMV9zc2lkIFNzaWQ7CS8qIFNTSUQgKi8KKwl1bnNpZ25lZCBsb25nIFByaXZhY3k7CQkvKiBXRVAgZW5jcnlwdGlvbiByZXF1aXJlbWVudCAqLworCU5ESVNfODAyXzExX1JTU0kgUnNzaTsJLyogcmVjZWl2ZSBzaWduYWwgc3RyZW5ndGggaW4gZEJtICovCisJTkRJU184MDJfMTFfTkVUV09SS19UWVBFIE5ldHdvcmtUeXBlSW5Vc2U7CisJc3RydWN0IHJ0X25kaXNfODAyXzExX2NvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbjsKKwlORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFIEluZnJhc3RydWN0dXJlTW9kZTsKKwlORElTXzgwMl8xMV9SQVRFUyBTdXBwb3J0ZWRSYXRlczsKK307CiAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTkRJU19XTEFOX0JTU0lECi17Ci0gICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGg7ICAgICAvLyBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUKLSAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTICAgICAgICAgICAgIE1hY0FkZHJlc3M7IC8vIEJTU0lECi0gICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZFsyXTsKLSAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQ7ICAgICAgIC8vIFNTSUQKLSAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaXZhY3k7ICAgIC8vIFdFUCBlbmNyeXB0aW9uIHJlcXVpcmVtZW50Ci0gICBORElTXzgwMl8xMV9SU1NJICAgICAgICAgICAgICAgICAgICBSc3NpOyAgICAgICAvLyByZWNlaXZlIHNpZ25hbCBzdHJlbmd0aCBpbiBkQm0KLSAgIE5ESVNfODAyXzExX05FVFdPUktfVFlQRSAgICAgICAgICAgIE5ldHdvcmtUeXBlSW5Vc2U7Ci0gICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICAgICAgICAgICBDb25maWd1cmF0aW9uOwotICAgTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSAgSW5mcmFzdHJ1Y3R1cmVNb2RlOwotICAgTkRJU184MDJfMTFfUkFURVMgICAgICAgICAgICAgICAgICAgU3VwcG9ydGVkUmF0ZXM7Ci19IE5ESVNfV0xBTl9CU1NJRCwgKlBORElTX1dMQU5fQlNTSUQ7CitzdHJ1Y3QgUEFDS0VEIHJ0X25kaXNfODAyXzExX2Jzc2lkX2xpc3QgeworCXUzMiBOdW1iZXJPZkl0ZW1zOwkvKiBpbiBsaXN0IGJlbG93LCBhdCBsZWFzdCAxICovCisJc3RydWN0IHJ0X25kaXNfd2xhbl9ic3NpZCBCc3NpZFsxXTsKK307CiAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTkRJU184MDJfMTFfQlNTSURfTElTVAotewotICAgVUlOVCAgICAgICAgICAgTnVtYmVyT2ZJdGVtczsgICAgICAvLyBpbiBsaXN0IGJlbG93LCBhdCBsZWFzdCAxCi0gICBORElTX1dMQU5fQlNTSUQgQnNzaWRbMV07Ci19IE5ESVNfODAyXzExX0JTU0lEX0xJU1QsICpQTkRJU184MDJfMTFfQlNTSURfTElTVDsKKy8qIEFkZGVkIENhcGFiaWxpdGllcywgSUVMZW5ndGggYW5kIElFcyBmb3IgZWFjaCBCU1NJRCAqLworc3RydWN0IFBBQ0tFRCBydF9uZGlzX3dsYW5fYnNzaWRfZXggeworCXVuc2lnbmVkIGxvbmcgTGVuZ3RoOwkJLyogTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlICovCisJTkRJU184MDJfMTFfTUFDX0FERFJFU1MgTWFjQWRkcmVzczsJLyogQlNTSUQgKi8KKwl1OCBSZXNlcnZlZFsyXTsKKwlzdHJ1Y3QgcnRfbmRpc184MDJfMTFfc3NpZCBTc2lkOwkvKiBTU0lEICovCisJdTMyIFByaXZhY3k7CQkvKiBXRVAgZW5jcnlwdGlvbiByZXF1aXJlbWVudCAqLworCU5ESVNfODAyXzExX1JTU0kgUnNzaTsJLyogcmVjZWl2ZSBzaWduYWwgKi8KKwkvKiBzdHJlbmd0aCBpbiBkQm0gKi8KKwlORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgTmV0d29ya1R5cGVJblVzZTsKKwlzdHJ1Y3QgcnRfbmRpc184MDJfMTFfY29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9uOworCU5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgSW5mcmFzdHJ1Y3R1cmVNb2RlOworCU5ESVNfODAyXzExX1JBVEVTX0VYIFN1cHBvcnRlZFJhdGVzOworCXVuc2lnbmVkIGxvbmcgSUVMZW5ndGg7CisJdTggSUVzWzFdOworfTsKIAotLy8gQWRkZWQgQ2FwYWJpbGl0aWVzLCBJRUxlbmd0aCBhbmQgSUVzIGZvciBlYWNoIEJTU0lECi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX05ESVNfV0xBTl9CU1NJRF9FWAotewotICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlbmd0aDsgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlCi0gICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgICAgICAgICAgICAgTWFjQWRkcmVzczsgICAgICAgICAvLyBCU1NJRAotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkWzJdOwotICAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQ7ICAgICAgICAgICAgICAgLy8gU1NJRAotICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaXZhY3k7ICAgICAgICAgICAgLy8gV0VQIGVuY3J5cHRpb24gcmVxdWlyZW1lbnQKLSAgICBORElTXzgwMl8xMV9SU1NJICAgICAgICAgICAgICAgICAgICBSc3NpOyAgICAgICAgICAgICAgIC8vIHJlY2VpdmUgc2lnbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJlbmd0aCBpbiBkQm0KLSAgICBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgICAgICAgICAgICBOZXR3b3JrVHlwZUluVXNlOwotICAgIE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04gICAgICAgICAgIENvbmZpZ3VyYXRpb247Ci0gICAgTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSAgSW5mcmFzdHJ1Y3R1cmVNb2RlOwotICAgIE5ESVNfODAyXzExX1JBVEVTX0VYICAgICAgICAgICAgICAgIFN1cHBvcnRlZFJhdGVzOwotICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFTGVuZ3RoOwotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFc1sxXTsKLX0gTkRJU19XTEFOX0JTU0lEX0VYLCAqUE5ESVNfV0xBTl9CU1NJRF9FWDsKK3N0cnVjdCBQQUNLRUQgcnRfbmRpc184MDJfMTFfYnNzaWRfbGlzdF9leCB7CisJdTMyIE51bWJlck9mSXRlbXM7CS8qIGluIGxpc3QgYmVsb3csIGF0IGxlYXN0IDEgKi8KKwlzdHJ1Y3QgcnRfbmRpc193bGFuX2Jzc2lkX2V4IEJzc2lkWzFdOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYCi17Ci0gICAgVUlOVCAgICAgICAgICAgICAgICAgICBOdW1iZXJPZkl0ZW1zOyAgICAgIC8vIGluIGxpc3QgYmVsb3csIGF0IGxlYXN0IDEKLSAgICBORElTX1dMQU5fQlNTSURfRVggICAgICBCc3NpZFsxXTsKLX0gTkRJU184MDJfMTFfQlNTSURfTElTVF9FWCwgKlBORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYOworc3RydWN0IFBBQ0tFRCBydF9uZGlzXzgwMl8xMV9maXhlZF9pZXMgeworCXU4IFRpbWVzdGFtcFs4XTsKKwl1MTYgQmVhY29uSW50ZXJ2YWw7CisJdTE2IENhcGFiaWxpdGllczsKK307CiAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTkRJU184MDJfMTFfRklYRURfSUVzCi17Ci0gICAgVUNIQVIgVGltZXN0YW1wWzhdOwotICAgIFVTSE9SVCBCZWFjb25JbnRlcnZhbDsKLSAgICBVU0hPUlQgQ2FwYWJpbGl0aWVzOwotfSBORElTXzgwMl8xMV9GSVhFRF9JRXMsICpQTkRJU184MDJfMTFfRklYRURfSUVzOworc3RydWN0IHJ0X25kaXNfODAyXzExX3ZhcmlhYmxlX2llcyB7CisJdTggRWxlbWVudElEOworCXU4IExlbmd0aDsJCS8qIE51bWJlciBvZiBieXRlcyBpbiBkYXRhIGZpZWxkICovCisJdTggZGF0YVsxXTsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMKLXsKLSAgICBVQ0hBUiBFbGVtZW50SUQ7Ci0gICAgVUNIQVIgTGVuZ3RoOyAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gZGF0YSBmaWVsZAotICAgIFVDSEFSIGRhdGFbMV07Ci19IE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcywgKlBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXM7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQ7CiAKLXR5cGVkZWYgIFVMT05HICAgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRDsKIAotdHlwZWRlZiAgVUxPTkcgICBORElTXzgwMl8xMV9SVFNfVEhSRVNIT0xEOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIE5ESVNfODAyXzExX0FOVEVOTkE7CiAKLXR5cGVkZWYgIFVMT05HICAgTkRJU184MDJfMTFfQU5URU5OQTsKLQotdHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUgotewotICAgTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGwsCi0gICBOZGlzODAyXzExUHJpdkZpbHRlcjgwMjF4V0VQCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSIHsKKwlOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbCwKKwlOZGlzODAyXzExUHJpdkZpbHRlcjgwMjF4V0VQCiB9IE5ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSLCAqUE5ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSOwogCi0vLyBBZGRlZCBuZXcgZW5jcnlwdGlvbiB0eXBlcwotLy8gQWxzbyBhbGlhc2VkIHR5cGVkZWYgdG8gbmV3IG5hbWUKLXR5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfV0VQX1NUQVRVUwotewotICAgTmRpczgwMl8xMVdFUEVuYWJsZWQsCi0gICAgTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCA9IE5kaXM4MDJfMTFXRVBFbmFibGVkLAotICAgTmRpczgwMl8xMVdFUERpc2FibGVkLAotICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQsCi0gICBOZGlzODAyXzExV0VQS2V5QWJzZW50LAotICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMUtleUFic2VudCA9IE5kaXM4MDJfMTFXRVBLZXlBYnNlbnQsCi0gICBOZGlzODAyXzExV0VQTm90U3VwcG9ydGVkLAotICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uTm90U3VwcG9ydGVkID0gTmRpczgwMl8xMVdFUE5vdFN1cHBvcnRlZCwKLSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkLAotICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMktleUFic2VudCwKLSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkLAotICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0tleUFic2VudCwKLSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkLAkvLyBUS0lQIG9yIEFFUyBtaXgKLSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjRLZXlBYnNlbnQsCi0gICAgTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkLAorLyogQWRkZWQgbmV3IGVuY3J5cHRpb24gdHlwZXMgKi8KKy8qIEFsc28gYWxpYXNlZCB0eXBlZGVmIHRvIG5ldyBuYW1lICovCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1dFUF9TVEFUVVMgeworCU5kaXM4MDJfMTFXRVBFbmFibGVkLAorCU5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQgPSBOZGlzODAyXzExV0VQRW5hYmxlZCwKKwlOZGlzODAyXzExV0VQRGlzYWJsZWQsCisJTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCwKKwlOZGlzODAyXzExV0VQS2V5QWJzZW50LAorCU5kaXM4MDJfMTFFbmNyeXB0aW9uMUtleUFic2VudCA9IE5kaXM4MDJfMTFXRVBLZXlBYnNlbnQsCisJTmRpczgwMl8xMVdFUE5vdFN1cHBvcnRlZCwKKwlOZGlzODAyXzExRW5jcnlwdGlvbk5vdFN1cHBvcnRlZCA9IE5kaXM4MDJfMTFXRVBOb3RTdXBwb3J0ZWQsCisJTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCwKKwlOZGlzODAyXzExRW5jcnlwdGlvbjJLZXlBYnNlbnQsCisJTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCwKKwlOZGlzODAyXzExRW5jcnlwdGlvbjNLZXlBYnNlbnQsCisJTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZCwJLyogVEtJUCBvciBBRVMgbWl4ICovCisJTmRpczgwMl8xMUVuY3J5cHRpb240S2V5QWJzZW50LAorCU5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCwKIAlOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkLAogfSBORElTXzgwMl8xMV9XRVBfU1RBVFVTLCAqUE5ESVNfODAyXzExX1dFUF9TVEFUVVMsCi0gIE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTLCAqUE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTOworICAgIE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTLCAqUE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTOwogCi10eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1JFTE9BRF9ERUZBVUxUUwotewotICAgTmRpczgwMl8xMVJlbG9hZFdFUEtleXMKK3R5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfUkVMT0FEX0RFRkFVTFRTIHsKKwlOZGlzODAyXzExUmVsb2FkV0VQS2V5cwogfSBORElTXzgwMl8xMV9SRUxPQURfREVGQVVMVFMsICpQTkRJU184MDJfMTFfUkVMT0FEX0RFRkFVTFRTOwogCiAjZGVmaW5lIE5ESVNfODAyXzExX0FJX1JFUUZJX0NBUEFCSUxJVElFUyAgICAgIDEKQEAgLTQ0OCwzNTEgKzQzNiwzNDMgQEAKICNkZWZpbmUgTkRJU184MDJfMTFfQUlfUkVTRklfU1RBVFVTQ09ERSAgICAgICAgMgogI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVNGSV9BU1NPQ0lBVElPTklEICAgICA0CiAKLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9BSV9SRVFGSQotewotICAgIFVTSE9SVCBDYXBhYmlsaXRpZXM7Ci0gICAgVVNIT1JUIExpc3RlbkludGVydmFsOwotICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTICBDdXJyZW50QVBBZGRyZXNzOwotfSBORElTXzgwMl8xMV9BSV9SRVFGSSwgKlBORElTXzgwMl8xMV9BSV9SRVFGSTsKK3N0cnVjdCBydF9uZGlzXzgwMl8xMV9haV9yZXFmaSB7CisJdTE2IENhcGFiaWxpdGllczsKKwl1MTYgTGlzdGVuSW50ZXJ2YWw7CisJTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQ3VycmVudEFQQWRkcmVzczsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9BSV9SRVNGSQotewotICAgIFVTSE9SVCBDYXBhYmlsaXRpZXM7Ci0gICAgVVNIT1JUIFN0YXR1c0NvZGU7Ci0gICAgVVNIT1JUIEFzc29jaWF0aW9uSWQ7Ci19IE5ESVNfODAyXzExX0FJX1JFU0ZJLCAqUE5ESVNfODAyXzExX0FJX1JFU0ZJOworc3RydWN0IHJ0X25kaXNfODAyXzExX2FpX3Jlc2ZpIHsKKwl1MTYgQ2FwYWJpbGl0aWVzOworCXUxNiBTdGF0dXNDb2RlOworCXUxNiBBc3NvY2lhdGlvbklkOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OCi17Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgTGVuZ3RoOwotICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgIEF2YWlsYWJsZVJlcXVlc3RGaXhlZElFczsKLSAgICBORElTXzgwMl8xMV9BSV9SRVFGSSAgICBSZXF1ZXN0Rml4ZWRJRXM7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgUmVxdWVzdElFTGVuZ3RoOwotICAgIFVMT05HICAgICAgICAgICAgICAgICAgIE9mZnNldFJlcXVlc3RJRXM7Ci0gICAgVVNIT1JUICAgICAgICAgICAgICAgICAgQXZhaWxhYmxlUmVzcG9uc2VGaXhlZElFczsKLSAgICBORElTXzgwMl8xMV9BSV9SRVNGSSAgICBSZXNwb25zZUZpeGVkSUVzOwotICAgIFVMT05HICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlSUVMZW5ndGg7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgT2Zmc2V0UmVzcG9uc2VJRXM7Ci19IE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OLCAqUE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OOworc3RydWN0IHJ0X25kaXNfODAyXzExX2Fzc29jaWF0aW9uX2luZm9ybWF0aW9uIHsKKwl1bnNpZ25lZCBsb25nIExlbmd0aDsKKwl1MTYgQXZhaWxhYmxlUmVxdWVzdEZpeGVkSUVzOworCXN0cnVjdCBydF9uZGlzXzgwMl8xMV9haV9yZXFmaSBSZXF1ZXN0Rml4ZWRJRXM7CisJdW5zaWduZWQgbG9uZyBSZXF1ZXN0SUVMZW5ndGg7CisJdW5zaWduZWQgbG9uZyBPZmZzZXRSZXF1ZXN0SUVzOworCXUxNiBBdmFpbGFibGVSZXNwb25zZUZpeGVkSUVzOworCXN0cnVjdCBydF9uZGlzXzgwMl8xMV9haV9yZXNmaSBSZXNwb25zZUZpeGVkSUVzOworCXVuc2lnbmVkIGxvbmcgUmVzcG9uc2VJRUxlbmd0aDsKKwl1bnNpZ25lZCBsb25nIE9mZnNldFJlc3BvbnNlSUVzOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VWRU5UCi17Ci0gICAgTkRJU184MDJfMTFfU1RBVFVTX0lORElDQVRJT04gICAgICAgU3RhdHVzOwotICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1QgIFJlcXVlc3RbMV07Ci19IE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VWRU5ULCAqUE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VWRU5UOworc3RydWN0IHJ0X25kaXNfODAyXzExX2F1dGhlbnRpY2F0aW9uX2V2ZW50IHsKKwlzdHJ1Y3QgcnRfbmRpc184MDJfMTFfc3RhdHVzX2luZGljYXRpb24gU3RhdHVzOworCXN0cnVjdCBydF9uZGlzXzgwMl8xMV9hdXRoZW50aWNhdGlvbl9yZXF1ZXN0IFJlcXVlc3RbMV07Cit9OwogCi0vLyA4MDIuMTEgTWVkaWEgc3RyZWFtIGNvbnN0cmFpbnRzLCBhc3NvY2lhdGVkIHdpdGggT0lEXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERQotdHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERQotewotICAgIE5kaXM4MDJfMTFNZWRpYVN0cmVhbU9mZiwKLSAgICBOZGlzODAyXzExTWVkaWFTdHJlYW1PbiwKKy8qIDgwMi4xMSBNZWRpYSBzdHJlYW0gY29uc3RyYWludHMsIGFzc29jaWF0ZWQgd2l0aCBPSURfODAyXzExX01FRElBX1NUUkVBTV9NT0RFICovCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX01FRElBX1NUUkVBTV9NT0RFIHsKKwlOZGlzODAyXzExTWVkaWFTdHJlYW1PZmYsCisJTmRpczgwMl8xMU1lZGlhU3RyZWFtT24sCiB9IE5ESVNfODAyXzExX01FRElBX1NUUkVBTV9NT0RFLCAqUE5ESVNfODAyXzExX01FRElBX1NUUkVBTV9NT0RFOwogCi0vLyBQTUtJRCBTdHJ1Y3R1cmVzCi10eXBlZGVmIFVDSEFSICAgTkRJU184MDJfMTFfUE1LSURfVkFMVUVbMTZdOworLyogUE1LSUQgU3RydWN0dXJlcyAqLwordHlwZWRlZiB1OCBORElTXzgwMl8xMV9QTUtJRF9WQUxVRVsxNl07CiAKLXR5cGVkZWYgc3RydWN0IF9CU1NJRF9JTkZPCi17Ci0gICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQlNTSUQ7Ci0gICAgTkRJU184MDJfMTFfUE1LSURfVkFMVUUgUE1LSUQ7Ci19IEJTU0lEX0lORk8sICpQQlNTSURfSU5GTzsKK3N0cnVjdCBydF9ic3NpZF9pbmZvIHsKKwlORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKKwlORElTXzgwMl8xMV9QTUtJRF9WQUxVRSBQTUtJRDsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9QTUtJRAotewotICAgIFVJTlQgICAgTGVuZ3RoOwotICAgIFVJTlQgICAgQlNTSURJbmZvQ291bnQ7Ci0gICAgQlNTSURfSU5GTyBCU1NJREluZm9bMV07Ci19IE5ESVNfODAyXzExX1BNS0lELCAqUE5ESVNfODAyXzExX1BNS0lEOworc3RydWN0IHJ0X25kaXNfODAyXzExX3Bta2lkIHsKKwl1MzIgTGVuZ3RoOworCXUzMiBCU1NJREluZm9Db3VudDsKKwlzdHJ1Y3QgcnRfYnNzaWRfaW5mbyBCU1NJREluZm9bMV07Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRU5DUllQVElPTgotewotICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgQXV0aE1vZGVTdXBwb3J0ZWQ7Ci0gICAgTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgRW5jcnlwdFN0YXR1c1N1cHBvcnRlZDsKLX0gTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRU5DUllQVElPTiwgKlBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FTkNSWVBUSU9OOworc3RydWN0IHJ0X25kaXNfODAyXzExX2F1dGhlbnRpY2F0aW9uX2VuY3J5cHRpb24geworCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgQXV0aE1vZGVTdXBwb3J0ZWQ7CisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgRW5jcnlwdFN0YXR1c1N1cHBvcnRlZDsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9DQVBBQklMSVRZCi17Ci0gICAgIFVMT05HIExlbmd0aDsKLSAgICAgVUxPTkcgVmVyc2lvbjsKLSAgICAgVUxPTkcgTm9PZlBNS0lEczsKLSAgICAgVUxPTkcgTm9PZkF1dGhFbmNyeXB0UGFpcnNTdXBwb3J0ZWQ7Ci0gICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VOQ1JZUFRJT04gQXV0aGVudGljYXRpb25FbmNyeXB0aW9uU3VwcG9ydGVkWzFdOwotfSBORElTXzgwMl8xMV9DQVBBQklMSVRZLCAqUE5ESVNfODAyXzExX0NBUEFCSUxJVFk7CitzdHJ1Y3QgcnRfbmRpc184MDJfMTFfY2FwYWJpbGl0eSB7CisJdW5zaWduZWQgbG9uZyBMZW5ndGg7CisJdW5zaWduZWQgbG9uZyBWZXJzaW9uOworCXVuc2lnbmVkIGxvbmcgTm9PZlBNS0lEczsKKwl1bnNpZ25lZCBsb25nIE5vT2ZBdXRoRW5jcnlwdFBhaXJzU3VwcG9ydGVkOworCXN0cnVjdCBydF9uZGlzXzgwMl8xMV9hdXRoZW50aWNhdGlvbl9lbmNyeXB0aW9uCisJICAgIEF1dGhlbnRpY2F0aW9uRW5jcnlwdGlvblN1cHBvcnRlZFsxXTsKK307CiAKLSNkZWZpbmUgUlRfUFJJVl9JT0NUTF9FWFQJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MDEpIC8vIFN5bmMuIHdpdGggQVAgZm9yIHdzYyB1cG5wIGRhZW1vbgorI2RlZmluZSBSVF9QUklWX0lPQ1RMCQkJCQkJCShTSU9DSVdGSVJTVFBSSVYgKyAweDAxKQkvKiBTeW5jLiB3aXRoIEFQIGZvciB3c2MgdXBucCBkYWVtb24gKi8KICNkZWZpbmUgUlRQUklWX0lPQ1RMX1NFVAkJCQkJCQkoU0lPQ0lXRklSU1RQUklWICsgMHgwMikKIAogI2RlZmluZSBSVFBSSVZfSU9DVExfU1RBVElTVElDUyAgICAgICAgICAgICAgICAgICAgIChTSU9DSVdGSVJTVFBSSVYgKyAweDA5KQogI2RlZmluZSBSVFBSSVZfSU9DVExfQUREX1BNS0lEX0NBQ0hFICAgICAgICAgICAgICAgIChTSU9DSVdGSVJTVFBSSVYgKyAweDBBKQogI2RlZmluZSBSVFBSSVZfSU9DVExfUkFESVVTX0RBVEEgICAgICAgICAgICAgICAgICAgIChTSU9DSVdGSVJTVFBSSVYgKyAweDBDKQogI2RlZmluZSBSVFBSSVZfSU9DVExfR1NJVEVTVVJWRVkJCQkJCShTSU9DSVdGSVJTVFBSSVYgKyAweDBEKQotI2RlZmluZSBSVF9QUklWX0lPQ1RMCQkJCQkJCQkoU0lPQ0lXRklSU1RQUklWICsgMHgwRSkgLy8gU3luYy4gd2l0aCBSVDYxIChmb3Igd3BhX3N1cHBsaWNhbnQpCisjZGVmaW5lIFJUX1BSSVZfSU9DVExfRVhUCQkJCQkJCShTSU9DSVdGSVJTVFBSSVYgKyAweDBFKQkvKiBTeW5jLiB3aXRoIFJUNjEgKGZvciB3cGFfc3VwcGxpY2FudCkgKi8KICNkZWZpbmUgUlRQUklWX0lPQ1RMX0dFVF9NQUNfVEFCTEUJCQkJCShTSU9DSVdGSVJTVFBSSVYgKyAweDBGKQogCiAjZGVmaW5lIFJUUFJJVl9JT0NUTF9TSE9XCQkJCQkJCShTSU9DSVdGSVJTVFBSSVYgKyAweDExKQogZW51bSB7Ci0gICAgU0hPV19DT05OX1NUQVRVUyA9IDQsCi0gICAgU0hPV19EUlZJRVJfVkVSSU9OID0gNSwKLSAgICBTSE9XX0JBX0lORk8gPSA2LAorCVNIT1dfQ09OTl9TVEFUVVMgPSA0LAorCVNIT1dfRFJWSUVSX1ZFUklPTiA9IDUsCisJU0hPV19CQV9JTkZPID0gNiwKIAlTSE9XX0RFU0NfSU5GTyA9IDcsCi0jaWZkZWYgUlQyODcwCisjaWZkZWYgUlRNUF9NQUNfVVNCCiAJU0hPV19SWEJVTEtfSU5GTyA9IDgsCiAJU0hPV19UWEJVTEtfSU5GTyA9IDksCi0jZW5kaWYgLy8gUlQyODcwIC8vCi0gICAgUkFJT19PRkYgPSAxMCwKLSAgICBSQUlPX09OID0gMTEsCisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisJUkFJT19PRkYgPSAxMCwKKwlSQUlPX09OID0gMTEsCiAJU0hPV19DRkdfVkFMVUUgPSAyMCwKLSNpZiAhZGVmaW5lZChSVDI4NjApCiAJU0hPV19BREhPQ19FTlRSWV9JTkZPID0gMjEsCi0jZW5kaWYKIH07CiAKLSNpZmRlZiBMTFREX1NVUFBPUlQKLS8vIGZvciBjb25zaXN0ZW5jeSB3aXRoIFJUNjEKLSNkZWZpbmUgUlRfT0lEX0dFVF9QSFlfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAweDc2MQotI2VuZGlmIC8vIExMVERfU1VQUE9SVCAvLworI2RlZmluZSBPSURfODAyXzExX0JVSUxEX0NIQU5ORUxfRVgJCQkJMHgwNzE0CisjZGVmaW5lIE9JRF84MDJfMTFfR0VUX0NIX0xJU1QJCQkJCTB4MDcxNQorI2RlZmluZSBPSURfODAyXzExX0dFVF9DT1VOVFJZX0NPREUJCQkJMHgwNzE2CisjZGVmaW5lIE9JRF84MDJfMTFfR0VUX0NIQU5ORUxfR0VPR1JBUEhZCQkweDA3MTcKIAotI2lmIGRlZmluZWQoUlQyODYwKSB8fCBkZWZpbmVkKFJUMzB4eCkKLS8vIE5ldyBmb3IgTWVldGluZ0hvdXNlIEFwaSBzdXBwb3J0CisjZGVmaW5lIFJUX09JRF9XU0NfU0VUX1BBU1NQSFJBU0UgICAgICAgICAgICAgICAgICAgMHgwNzQwCS8qIHBhc3NwaHJhc2UgZm9yIHdwYSgyKS1wc2sgKi8KKyNkZWZpbmUgUlRfT0lEX1dTQ19EUklWRVJfQVVUT19DT05ORUNUICAgICAgICAgICAgICAweDA3NDEKKyNkZWZpbmUgUlRfT0lEX1dTQ19RVUVSWV9ERUZBVUxUX1BST0ZJTEUgICAgICAgICAgICAweDA3NDIKKyNkZWZpbmUgUlRfT0lEX1dTQ19TRVRfQ09OTl9CWV9QUk9GSUxFX0lOREVYICAgICAgICAweDA3NDMKKyNkZWZpbmUgUlRfT0lEX1dTQ19TRVRfQUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAweDA3NDQKKyNkZWZpbmUgUlRfT0lEX1dTQ19TRVRfU1NJRCAgICAgICAgICAgICAgICAgICAgICAgICAweDA3NDUKKyNkZWZpbmUgUlRfT0lEX1dTQ19TRVRfUElOX0NPREUgICAgICAgICAgICAgICAgICAgICAweDA3NDYKKyNkZWZpbmUgUlRfT0lEX1dTQ19TRVRfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAweDA3NDcJLyogUElOIG9yIFBCQyAqLworI2RlZmluZSBSVF9PSURfV1NDX1NFVF9DT05GX01PREUgICAgICAgICAgICAgICAgICAgIDB4MDc0OAkvKiBFbnJvbGxlZSBvciBSZWdpc3RyYXIgKi8KKyNkZWZpbmUgUlRfT0lEX1dTQ19TRVRfUFJPRklMRSAgICAgICAgICAgICAgICAgICAgICAweDA3NDkKKyNkZWZpbmUJUlRfT0lEX1dTQ19DT05GSUdfU1RBVFVTCQkJCQkweDA3NEYKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9XU0NfUVVFUllfUFJPRklMRQkJCQkweDA3NTAKKy8qIGZvciBjb25zaXN0ZW5jeSB3aXRoIFJUNjEgKi8KKyNkZWZpbmUgUlRfT0lEX1dTQ19RVUVSWV9TVEFUVVMJCQkJCQkweDA3NTEKKyNkZWZpbmUgUlRfT0lEX1dTQ19QSU5fQ09ERQkJCQkJCQkweDA3NTIKKyNkZWZpbmUgUlRfT0lEX1dTQ19VVUlECQkJCQkJCQkweDA3NTMKKyNkZWZpbmUgUlRfT0lEX1dTQ19TRVRfU0VMRUNURURfUkVHSVNUUkFSCQkJMHgwNzU0CisjZGVmaW5lIFJUX09JRF9XU0NfRUFQTVNHCQkJCQkJCTB4MDc1NQorI2RlZmluZSBSVF9PSURfV1NDX01BTlVGQUNUVVJFUgkJCQkJCTB4MDc1NgorI2RlZmluZSBSVF9PSURfV1NDX01PREVMX05BTUUJCQkJCQkweDA3NTcKKyNkZWZpbmUgUlRfT0lEX1dTQ19NT0RFTF9OTwkJCQkJCQkweDA3NTgKKyNkZWZpbmUgUlRfT0lEX1dTQ19TRVJJQUxfTk8JCQkJCQkweDA3NTkKKyNkZWZpbmUgUlRfT0lEX1dTQ19NQUNfQUREUkVTUwkJCQkJCTB4MDc2MAorCisvKiBOZXcgZm9yIE1lZXRpbmdIb3VzZSBBcGkgc3VwcG9ydCAqLwogI2RlZmluZSBPSURfTUhfODAyXzFYX1NVUFBPUlRFRCAgICAgICAgICAgICAgIDB4RkZFREMxMDAKLSNlbmRpZgogCi0vLyBNSU1PIFR4IHBhcmFtZXRlciwgU2hvcnRHSSwgTUNTLCBTVEJDLCBldGMuICB0aGVzZSBhcmUgZmllbGRzIGluIFRYV0kuIERvbid0IGNoYW5nZSB0aGlzIGRlZmluaXRpb24hISEKLXR5cGVkZWYgdW5pb24gIF9IVFRSQU5TTUlUX1NFVFRJTkcgewotCXN0cnVjdAl7Ci0JVVNIT1JUICAgCU1DUzo3OyAgICAgICAgICAgICAgICAgLy8gTUNTCi0JVVNIT1JUCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegotCVVTSE9SVAkJU2hvcnRHSToxOwotCVVTSE9SVAkJU1RCQzoyOwkvL1NQQUNFCi0JVVNIT1JUCQlyc3Y6MjsKLQlVU0hPUlQJCVR4QkY6MTsKLQlVU0hPUlQJCU1PREU6MjsJLy8gVXNlIGRlZmluaXRpb24gTU9ERV94eHguCi0JfQlmaWVsZDsKLQlVU0hPUlQJCXdvcmQ7Ci0gfSBIVFRSQU5TTUlUX1NFVFRJTkcsICpQSFRUUkFOU01JVF9TRVRUSU5HOworLyogTUlNTyBUeCBwYXJhbWV0ZXIsIFNob3J0R0ksIE1DUywgU1RCQywgZXRjLiAgdGhlc2UgYXJlIGZpZWxkcyBpbiBUWFdJLiBEb24ndCBjaGFuZ2UgdGhpcyBkZWZpbml0aW9uISAqLwordHlwZWRlZiB1bmlvbiBfSFRUUkFOU01JVF9TRVRUSU5HIHsKKwlzdHJ1Y3QgeworCQl1MTYgTUNTOjc7CS8qIE1DUyAqLworCQl1MTYgQlc6MTsJLypjaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHogKi8KKwkJdTE2IFNob3J0R0k6MTsKKwkJdTE2IFNUQkM6MjsJLypTUEFDRSAqLworLyogICAgICB1MTYgICAgICAgICAgcnN2OjM7ICovCisJCXUxNiByc3Y6MjsKKwkJdTE2IFR4QkY6MTsKKwkJdTE2IE1PREU6MjsJLyogVXNlIGRlZmluaXRpb24gTU9ERV94eHguICovCisJfSBmaWVsZDsKKwl1MTYgd29yZDsKK30gSFRUUkFOU01JVF9TRVRUSU5HLCAqUEhUVFJBTlNNSVRfU0VUVElORzsKIAogdHlwZWRlZiBlbnVtIF9SVF84MDJfMTFfUFJFQU1CTEUgewotICAgIFJ0ODAyXzExUHJlYW1ibGVMb25nLAotICAgIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCwKLSAgICBSdDgwMl8xMVByZWFtYmxlQXV0bworCVJ0ODAyXzExUHJlYW1ibGVMb25nLAorCVJ0ODAyXzExUHJlYW1ibGVTaG9ydCwKKwlSdDgwMl8xMVByZWFtYmxlQXV0bwogfSBSVF84MDJfMTFfUFJFQU1CTEUsICpQUlRfODAyXzExX1BSRUFNQkxFOwogCi0vLyBPbmx5IGZvciBTVEEsIG5lZWQgdG8gc3luYyB3aXRoIEFQCiB0eXBlZGVmIGVudW0gX1JUXzgwMl8xMV9QSFlfTU9ERSB7CiAJUEhZXzExQkdfTUlYRUQgPSAwLAogCVBIWV8xMUIsCiAJUEhZXzExQSwKIAlQSFlfMTFBQkdfTUlYRUQsCiAJUEhZXzExRywKLQlQSFlfMTFBQkdOX01JWEVELAkvLyBib3RoIGJhbmQgICA1Ci0JUEhZXzExTl8yXzRHLAkJLy8gMTFuLW9ubHkgd2l0aCAyLjRHIGJhbmQgICAJNgotCVBIWV8xMUdOX01JWEVELAkvLyAyLjRHIGJhbmQgICAgICA3Ci0JUEhZXzExQU5fTUlYRUQsCS8vIDVHICBiYW5kICAgICAgIDgKLQlQSFlfMTFCR05fTUlYRUQsCS8vIGlmIGNoZWNrIDgwMi4xMWIuICAgICAgOQotCVBIWV8xMUFHTl9NSVhFRCwJLy8gaWYgY2hlY2sgODAyLjExYi4gICAgICAxMAotCVBIWV8xMU5fNUcsCQkJLy8gMTFuLW9ubHkgd2l0aCA1RyBiYW5kCQkxMQorCVBIWV8xMUFCR05fTUlYRUQsCS8qIGJvdGggYmFuZCAgIDUgKi8KKwlQSFlfMTFOXzJfNEcsCQkvKiAxMW4tb25seSB3aXRoIDIuNEcgYmFuZCAgICAgIDYgKi8KKwlQSFlfMTFHTl9NSVhFRCwJCS8qIDIuNEcgYmFuZCAgICAgIDcgKi8KKwlQSFlfMTFBTl9NSVhFRCwJCS8qIDVHICBiYW5kICAgICAgIDggKi8KKwlQSFlfMTFCR05fTUlYRUQsCS8qIGlmIGNoZWNrIDgwMi4xMWIuICAgICAgOSAqLworCVBIWV8xMUFHTl9NSVhFRCwJLyogaWYgY2hlY2sgODAyLjExYi4gICAgICAxMCAqLworCVBIWV8xMU5fNUcsCQkvKiAxMW4tb25seSB3aXRoIDVHIGJhbmQgICAgICAgICAgICAgICAgMTEgKi8KIH0gUlRfODAyXzExX1BIWV9NT0RFOwogCi0vLyBwdXQgYWxsIHByb3ByaWV0ZXJ5IGZvci1xdWVyeSBvYmplY3RzIGhlcmUgdG8gcmVkdWNlICMgb2YgUXVlcnlfT0lECi10eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0xJTktfU1RBVFVTIHsKLSAgICBVTE9ORyAgIEN1cnJUeFJhdGU7ICAgICAgICAgLy8gaW4gdW5pdHMgb2YgMC41TWJwcwotICAgIFVMT05HICAgQ2hhbm5lbFF1YWxpdHk7ICAgICAvLyAwLi4xMDAgJQotICAgIFVMT05HICAgVHhCeXRlQ291bnQ7ICAgICAgICAvLyBib3RoIG9rIGFuZCBmYWlsCi0gICAgVUxPTkcgICBSeEJ5dGVDb3VudDsgICAgICAgIC8vIGJvdGggb2sgYW5kIGZhaWwKLSAgICBVTE9ORwlDZW50cmFsQ2hhbm5lbDsJCS8vIDQwTUh6IGNlbnRyYWwgY2hhbm5lbCBudW1iZXIKLX0gUlRfODAyXzExX0xJTktfU1RBVFVTLCAqUFJUXzgwMl8xMV9MSU5LX1NUQVRVUzsKKy8qIHB1dCBhbGwgcHJvcHJpZXRlcnkgZm9yLXF1ZXJ5IG9iamVjdHMgaGVyZSB0byByZWR1Y2UgIyBvZiBRdWVyeV9PSUQgKi8KK3N0cnVjdCBydF84MDJfMTFfbGlua19zdGF0dXMgeworCXVuc2lnbmVkIGxvbmcgQ3VyclR4UmF0ZTsJLyogaW4gdW5pdHMgb2YgMC41TWJwcyAqLworCXVuc2lnbmVkIGxvbmcgQ2hhbm5lbFF1YWxpdHk7CS8qIDAuLjEwMCAlICovCisJdW5zaWduZWQgbG9uZyBUeEJ5dGVDb3VudDsJLyogYm90aCBvayBhbmQgZmFpbCAqLworCXVuc2lnbmVkIGxvbmcgUnhCeXRlQ291bnQ7CS8qIGJvdGggb2sgYW5kIGZhaWwgKi8KKwl1bnNpZ25lZCBsb25nIENlbnRyYWxDaGFubmVsOwkvKiA0ME1IeiBjZW50cmFsIGNoYW5uZWwgbnVtYmVyICovCit9OwogCi10eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0VWRU5UX0xPRyB7Ci0gICAgTEFSR0VfSU5URUdFUiAgIFN5c3RlbVRpbWU7ICAvLyB0aW1lc3RhbW1wIHZpYSBOZGlzR2V0Q3VycmVudFN5c3RlbVRpbWUoKQotICAgIFVDSEFSICAgICAgICAgICBBZGRyW01BQ19BRERSX0xFTkdUSF07Ci0gICAgVVNIT1JUICAgICAgICAgIEV2ZW50OyAgICAgICAvLyBFVkVOVF94eHgKLX0gUlRfODAyXzExX0VWRU5UX0xPRywgKlBSVF84MDJfMTFfRVZFTlRfTE9HOworc3RydWN0IHJ0XzgwMl8xMV9ldmVudF9sb2cgeworCUxBUkdFX0lOVEVHRVIgU3lzdGVtVGltZTsJLyogdGltZXN0YW1tcCB2aWEgTmRpc0dldEN1cnJlbnRTeXN0ZW1UaW1lKCkgKi8KKwl1OCBBZGRyW01BQ19BRERSX0xFTkdUSF07CisJdTE2IEV2ZW50OwkJLyogRVZFTlRfeHh4ICovCit9OwogCi10eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0VWRU5UX1RBQkxFIHsKLSAgICBVTE9ORyAgICAgICBOdW07Ci0gICAgVUxPTkcgICAgICAgUnN2OyAgICAgLy8gdG8gYWxpZ24gTG9nW10gYXQgTEFSR0VfSU5FR0VSIGJvdW5kYXJ5Ci0gICAgUlRfODAyXzExX0VWRU5UX0xPRyAgIExvZ1tNQVhfTlVNQkVSX09GX0VWRU5UXTsKLX0gUlRfODAyXzExX0VWRU5UX1RBQkxFLCBQUlRfODAyXzExX0VWRU5UX1RBQkxFOworc3RydWN0IHJ0XzgwMl8xMV9ldmVudF90YWJsZSB7CisJdW5zaWduZWQgbG9uZyBOdW07CisJdW5zaWduZWQgbG9uZyBSc3Y7CQkvKiB0byBhbGlnbiBMb2dbXSBhdCBMQVJHRV9JTkVHRVIgYm91bmRhcnkgKi8KKwlzdHJ1Y3QgcnRfODAyXzExX2V2ZW50X2xvZyBMb2dbTUFYX05VTUJFUl9PRl9FVkVOVF07Cit9OwogCi0vLyBNSU1PIFR4IHBhcmFtZXRlciwgU2hvcnRHSSwgTUNTLCBTVEJDLCBldGMuICB0aGVzZSBhcmUgZmllbGRzIGluIFRYV0kuIERvbid0IGNoYW5nZSB0aGlzIGRlZmluaXRpb24hISEKLXR5cGVkZWYgdW5pb24gIF9NQUNIVFRSQU5TTUlUX1NFVFRJTkcgewotCXN0cnVjdAl7Ci0JVVNIT1JUICAgCU1DUzo3OyAgICAgICAgICAgICAgICAgLy8gTUNTCi0JVVNIT1JUCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegotCVVTSE9SVAkJU2hvcnRHSToxOwotCVVTSE9SVAkJU1RCQzoyOwkvL1NQQUNFCi0JVVNIT1JUCQlyc3Y6MzsKLQlVU0hPUlQJCU1PREU6MjsJLy8gVXNlIGRlZmluaXRpb24gTU9ERV94eHguCi0JfQlmaWVsZDsKLQlVU0hPUlQJCXdvcmQ7Ci0gfSBNQUNIVFRSQU5TTUlUX1NFVFRJTkcsICpQTUFDSFRUUkFOU01JVF9TRVRUSU5HOworLyogTUlNTyBUeCBwYXJhbWV0ZXIsIFNob3J0R0ksIE1DUywgU1RCQywgZXRjLiAgdGhlc2UgYXJlIGZpZWxkcyBpbiBUWFdJLiBEb24ndCBjaGFuZ2UgdGhpcyBkZWZpbml0aW9uISAqLwordHlwZWRlZiB1bmlvbiBfTUFDSFRUUkFOU01JVF9TRVRUSU5HIHsKKwlzdHJ1Y3QgeworCQl1MTYgTUNTOjc7CS8qIE1DUyAqLworCQl1MTYgQlc6MTsJLypjaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHogKi8KKwkJdTE2IFNob3J0R0k6MTsKKwkJdTE2IFNUQkM6MjsJLypTUEFDRSAqLworCQl1MTYgcnN2OjM7CisJCXUxNiBNT0RFOjI7CS8qIFVzZSBkZWZpbml0aW9uIE1PREVfeHh4LiAqLworCX0gZmllbGQ7CisJdTE2IHdvcmQ7Cit9IE1BQ0hUVFJBTlNNSVRfU0VUVElORywgKlBNQUNIVFRSQU5TTUlUX1NFVFRJTkc7CiAKLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfTUFDX0VOVFJZIHsKLSAgICBVQ0hBUiAgICAgICBBZGRyW01BQ19BRERSX0xFTkdUSF07Ci0gICAgVUNIQVIgICAgICAgQWlkOwotICAgIFVDSEFSICAgICAgIFBzbTsgICAgIC8vIDA6UFdSX0FDVElWRSwgMTpQV1JfU0FWRQotICAgIFVDSEFSCQlNaW1vUHM7ICAvLyAwOk1NUFNfU1RBVElDLCAxOk1NUFNfRFlOQU1JQywgMzpNTVBTX0VuYWJsZWQKLSAgICBDSEFSCQlBdmdSc3NpMDsKLQlDSEFSCQlBdmdSc3NpMTsKLQlDSEFSCQlBdmdSc3NpMjsKLQlVSU5UMzIJCUNvbm5lY3RlZFRpbWU7Ci0gICAgTUFDSFRUUkFOU01JVF9TRVRUSU5HCVR4UmF0ZTsKLX0gUlRfODAyXzExX01BQ19FTlRSWSwgKlBSVF84MDJfMTFfTUFDX0VOVFJZOworc3RydWN0IHJ0XzgwMl8xMV9tYWNfZW50cnkgeworCXU4IEFkZHJbTUFDX0FERFJfTEVOR1RIXTsKKwl1OCBBaWQ7CisJdTggUHNtOwkJLyogMDpQV1JfQUNUSVZFLCAxOlBXUl9TQVZFICovCisJdTggTWltb1BzOwkJLyogMDpNTVBTX1NUQVRJQywgMTpNTVBTX0RZTkFNSUMsIDM6TU1QU19FbmFibGVkICovCisJY2hhciBBdmdSc3NpMDsKKwljaGFyIEF2Z1Jzc2kxOworCWNoYXIgQXZnUnNzaTI7CisJdTMyIENvbm5lY3RlZFRpbWU7CisJTUFDSFRUUkFOU01JVF9TRVRUSU5HIFR4UmF0ZTsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfTUFDX1RBQkxFIHsKLSAgICBVTE9ORyAgICAgICBOdW07Ci0gICAgUlRfODAyXzExX01BQ19FTlRSWSBFbnRyeVtNQVhfTlVNQkVSX09GX01BQ107Ci19IFJUXzgwMl8xMV9NQUNfVEFCTEUsICpQUlRfODAyXzExX01BQ19UQUJMRTsKK3N0cnVjdCBydF84MDJfMTFfbWFjX3RhYmxlIHsKKwl1bnNpZ25lZCBsb25nIE51bTsKKwlzdHJ1Y3QgcnRfODAyXzExX21hY19lbnRyeSBFbnRyeVtNQVhfTlVNQkVSX09GX01BQ107Cit9OwogCi0vLyBzdHJ1Y3R1cmUgZm9yIHF1ZXJ5L3NldCBoYXJkd2FyZSByZWdpc3RlciAtIE1BQywgQkJQLCBSRiByZWdpc3RlcgotdHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9IQVJEV0FSRV9SRUdJU1RFUiB7Ci0gICAgVUxPTkcgICBIYXJkd2FyZVR5cGU7ICAgICAgIC8vIDA6TUFDLCAxOkJCUCwgMjpSRiByZWdpc3RlciwgMzpFRVBST00KLSAgICBVTE9ORyAgIE9mZnNldDsgICAgICAgICAgICAgLy8gUS9TIHJlZ2lzdGVyIG9mZnNldCBhZGRyCi0gICAgVUxPTkcgICBEYXRhOyAgICAgICAgICAgICAgIC8vIFIvVyBkYXRhIGJ1ZmZlcgotfSBSVF84MDJfMTFfSEFSRFdBUkVfUkVHSVNURVIsICpQUlRfODAyXzExX0hBUkRXQVJFX1JFR0lTVEVSOworLyogc3RydWN0dXJlIGZvciBxdWVyeS9zZXQgaGFyZHdhcmUgcmVnaXN0ZXIgLSBNQUMsIEJCUCwgUkYgcmVnaXN0ZXIgKi8KK3N0cnVjdCBydF84MDJfMTFfaGFyZHdhcmVfcmVnaXN0ZXIgeworCXVuc2lnbmVkIGxvbmcgSGFyZHdhcmVUeXBlOwkvKiAwOk1BQywgMTpCQlAsIDI6UkYgcmVnaXN0ZXIsIDM6RUVQUk9NICovCisJdW5zaWduZWQgbG9uZyBPZmZzZXQ7CQkvKiBRL1MgcmVnaXN0ZXIgb2Zmc2V0IGFkZHIgKi8KKwl1bnNpZ25lZCBsb25nIERhdGE7CQkvKiBSL1cgZGF0YSBidWZmZXIgKi8KK307CiAKLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfQVBfQ09ORklHIHsKLSAgICBVTE9ORyAgIEVuYWJsZVR4QnVyc3Q7ICAgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZQotICAgIFVMT05HICAgRW5hYmxlVHVyYm9SYXRlOyAgICAvLyAwLWRpc2FibGUsIDEtZW5hYmxlIDcyLzEwMG1icHMgdHVyYm8gcmF0ZQotICAgIFVMT05HICAgSXNvbGF0ZUludGVyU3RhVHJhZmZpYzsgICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUgaXNvbGF0aW9uCi0gICAgVUxPTkcgICBIaWRlU3NpZDsgICAgICAgICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUgaGlkaW5nCi0gICAgVUxPTkcgICBVc2VCR1Byb3RlY3Rpb247ICAgIC8vIDAtQVVUTywgMS1hbHdheXMgT04sIDItYWx3YXlzIE9GRgotICAgIFVMT05HICAgVXNlU2hvcnRTbG90VGltZTsgICAvLyAwLW5vIHVzZSwgMS11c2UgOS11cyBzaG9ydCBzbG90IHRpbWUKLSAgICBVTE9ORyAgIFJzdjE7ICAgICAgICAgICAgICAgLy8gbXVzdCBiZSAwCi0gICAgVUxPTkcgICBTeXN0ZW1FcnJvckJpdG1hcDsgIC8vIGlnbm9yZSB1cG9uIFNFVCwgcmV0dXJuIHN5c3RlbSBlcnJvciB1cG9uIFFVRVJZCi19IFJUXzgwMl8xMV9BUF9DT05GSUcsICpQUlRfODAyXzExX0FQX0NPTkZJRzsKK3N0cnVjdCBydF84MDJfMTFfYXBfY29uZmlnIHsKKwl1bnNpZ25lZCBsb25nIEVuYWJsZVR4QnVyc3Q7CS8qIDAtZGlzYWJsZSwgMS1lbmFibGUgKi8KKwl1bnNpZ25lZCBsb25nIEVuYWJsZVR1cmJvUmF0ZTsJLyogMC1kaXNhYmxlLCAxLWVuYWJsZSA3Mi8xMDBtYnBzIHR1cmJvIHJhdGUgKi8KKwl1bnNpZ25lZCBsb25nIElzb2xhdGVJbnRlclN0YVRyYWZmaWM7CS8qIDAtZGlzYWJsZSwgMS1lbmFibGUgaXNvbGF0aW9uICovCisJdW5zaWduZWQgbG9uZyBIaWRlU3NpZDsJCS8qIDAtZGlzYWJsZSwgMS1lbmFibGUgaGlkaW5nICovCisJdW5zaWduZWQgbG9uZyBVc2VCR1Byb3RlY3Rpb247CS8qIDAtQVVUTywgMS1hbHdheXMgT04sIDItYWx3YXlzIE9GRiAqLworCXVuc2lnbmVkIGxvbmcgVXNlU2hvcnRTbG90VGltZTsJLyogMC1ubyB1c2UsIDEtdXNlIDktdXMgc2hvcnQgc2xvdCB0aW1lICovCisJdW5zaWduZWQgbG9uZyBSc3YxOwkJLyogbXVzdCBiZSAwICovCisJdW5zaWduZWQgbG9uZyBTeXN0ZW1FcnJvckJpdG1hcDsJLyogaWdub3JlIHVwb24gU0VULCByZXR1cm4gc3lzdGVtIGVycm9yIHVwb24gUVVFUlkgKi8KK307CiAKLS8vIHN0cnVjdHVyZSB0byBxdWVyeS9zZXQgU1RBX0NPTkZJRwotdHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9TVEFfQ09ORklHIHsKLSAgICBVTE9ORyAgIEVuYWJsZVR4QnVyc3Q7ICAgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZQotICAgIFVMT05HICAgRW5hYmxlVHVyYm9SYXRlOyAgICAvLyAwLWRpc2FibGUsIDEtZW5hYmxlIDcyLzEwMG1icHMgdHVyYm8gcmF0ZQotICAgIFVMT05HICAgVXNlQkdQcm90ZWN0aW9uOyAgICAvLyAwLUFVVE8sIDEtYWx3YXlzIE9OLCAyLWFsd2F5cyBPRkYKLSAgICBVTE9ORyAgIFVzZVNob3J0U2xvdFRpbWU7ICAgLy8gMC1ubyB1c2UsIDEtdXNlIDktdXMgc2hvcnQgc2xvdCB0aW1lIHdoZW4gYXBwbGljYWJsZQotICAgIFVMT05HICAgQWRob2NNb2RlOyAJCQkvLyAwLTExYiByYXRlcyBvbmx5IChXSUZJIHNwZWMpLCAxIC0gYi9nIG1peGVkLCAyIC0gZyBvbmx5Ci0gICAgVUxPTkcgICBId1JhZGlvU3RhdHVzOyAgICAgIC8vIDAtT0ZGLCAxLU9OLCBkZWZhdWx0IGlzIDEsIFJlYWQtT25seQotICAgIFVMT05HICAgUnN2MTsgICAgICAgICAgICAgICAvLyBtdXN0IGJlIDAKLSAgICBVTE9ORyAgIFN5c3RlbUVycm9yQml0bWFwOyAgLy8gaWdub3JlIHVwb24gU0VULCByZXR1cm4gc3lzdGVtIGVycm9yIHVwb24gUVVFUlkKLX0gUlRfODAyXzExX1NUQV9DT05GSUcsICpQUlRfODAyXzExX1NUQV9DT05GSUc7CisvKiBzdHJ1Y3R1cmUgdG8gcXVlcnkvc2V0IFNUQV9DT05GSUcgKi8KK3N0cnVjdCBydF84MDJfMTFfc3RhX2NvbmZpZyB7CisJdW5zaWduZWQgbG9uZyBFbmFibGVUeEJ1cnN0OwkvKiAwLWRpc2FibGUsIDEtZW5hYmxlICovCisJdW5zaWduZWQgbG9uZyBFbmFibGVUdXJib1JhdGU7CS8qIDAtZGlzYWJsZSwgMS1lbmFibGUgNzIvMTAwbWJwcyB0dXJibyByYXRlICovCisJdW5zaWduZWQgbG9uZyBVc2VCR1Byb3RlY3Rpb247CS8qIDAtQVVUTywgMS1hbHdheXMgT04sIDItYWx3YXlzIE9GRiAqLworCXVuc2lnbmVkIGxvbmcgVXNlU2hvcnRTbG90VGltZTsJLyogMC1ubyB1c2UsIDEtdXNlIDktdXMgc2hvcnQgc2xvdCB0aW1lIHdoZW4gYXBwbGljYWJsZSAqLworCXVuc2lnbmVkIGxvbmcgQWRob2NNb2RlOwkvKiAwLTExYiByYXRlcyBvbmx5IChXSUZJIHNwZWMpLCAxIC0gYi9nIG1peGVkLCAyIC0gZyBvbmx5ICovCisJdW5zaWduZWQgbG9uZyBId1JhZGlvU3RhdHVzOwkvKiAwLU9GRiwgMS1PTiwgZGVmYXVsdCBpcyAxLCBSZWFkLU9ubHkgKi8KKwl1bnNpZ25lZCBsb25nIFJzdjE7CQkvKiBtdXN0IGJlIDAgKi8KKwl1bnNpZ25lZCBsb25nIFN5c3RlbUVycm9yQml0bWFwOwkvKiBpZ25vcmUgdXBvbiBTRVQsIHJldHVybiBzeXN0ZW0gZXJyb3IgdXBvbiBRVUVSWSAqLworfTsKIAotLy8KLS8vICBGb3IgT0lEIFF1ZXJ5IG9yIFNldCBhYm91dCBCQSBzdHJ1Y3R1cmUKLS8vCi10eXBlZGVmCXN0cnVjdAlfT0lEX0JBQ0FQX1NUUlVDCXsKLQkJVUNIQVIJCVJ4QkFXaW5MaW1pdDsKLQkJVUNIQVIJCVR4QkFXaW5MaW1pdDsKLQkJVUNIQVIJCVBvbGljeTsJLy8gMDogREVMQVlfQkEgMTpJTU1FRF9CQSAgKC8vQkEgUG9saWN5IHN1YmZpbGVkIHZhbHVlIGluIEFEREJBIGZyYW1lKSAgIDI6QkEtbm90IHVzZS4gb3RoZXIgdmFsdWUgaW52YWxpZAotCQlVQ0hBUgkJTXBkdURlbnNpdHk7CS8vIDA6IERFTEFZX0JBIDE6SU1NRURfQkEgICgvL0JBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZSkgICAyOkJBLW5vdCB1c2UuIG90aGVyIHZhbHVlIGludmFsaWQKLQkJVUNIQVIgICAgICAgCUFtc2R1RW5hYmxlOwkvL0VuYWJsZSBBTVNEVSB0cmFuc21pc3N0aW9uCi0JCVVDSEFSICAgICAgIAlBbXNkdVNpemU7CS8vIDA6MzgzOSwgMTo3OTM1IGJ5dGVzLiBVSU5UICBNU0RVU2l6ZVRvQnl0ZXNbXQk9IHsgMzgzOSwgNzkzNX07Ci0JCVVDSEFSICAgICAgIAlNTVBTbW9kZTsJLy8gTUlNTyBwb3dlciBzYXZlIG1vcmUsIDA6c3RhdGljLCAxOmR5bmFtaWMsIDI6cnN2LCAzOm1pbW8gZW5hYmxlCi0JCUJPT0xFQU4JCUF1dG9CQTsJLy8gQXV0byBCQSB3aWxsIGF1dG9tYXRpY2FsbHkKLX0gT0lEX0JBQ0FQX1NUUlVDLCAqUE9JRF9CQUNBUF9TVFJVQzsKKy8qICovCisvKiAgRm9yIE9JRCBRdWVyeSBvciBTZXQgYWJvdXQgQkEgc3RydWN0dXJlICovCisvKiAqLworc3RydWN0IHJ0X29pZF9iYWNhcCB7CisJdTggUnhCQVdpbkxpbWl0OworCXU4IFR4QkFXaW5MaW1pdDsKKwl1OCBQb2xpY3k7CQkvKiAwOiBERUxBWV9CQSAxOklNTUVEX0JBICAoLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUpICAgMjpCQS1ub3QgdXNlLiBvdGhlciB2YWx1ZSBpbnZhbGlkICovCisJdTggTXBkdURlbnNpdHk7CS8qIDA6IERFTEFZX0JBIDE6SU1NRURfQkEgICgvL0JBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZSkgICAyOkJBLW5vdCB1c2UuIG90aGVyIHZhbHVlIGludmFsaWQgKi8KKwl1OCBBbXNkdUVuYWJsZTsJLypFbmFibGUgQU1TRFUgdHJhbnNtaXNzdGlvbiAqLworCXU4IEFtc2R1U2l6ZTsJLyogMDozODM5LCAxOjc5MzUgYnl0ZXMuIHUzMiAgTVNEVVNpemVUb0J5dGVzW10gICAgICAgID0geyAzODM5LCA3OTM1fTsgKi8KKwl1OCBNTVBTbW9kZTsJCS8qIE1JTU8gcG93ZXIgc2F2ZSBtb3JlLCAwOnN0YXRpYywgMTpkeW5hbWljLCAyOnJzdiwgMzptaW1vIGVuYWJsZSAqLworCUJPT0xFQU4gQXV0b0JBOwkJLyogQXV0byBCQSB3aWxsIGF1dG9tYXRpY2FsbHkgKi8KK307CiAKLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfQUNMX0VOVFJZIHsKLSAgICBVQ0hBUiAgIEFkZHJbTUFDX0FERFJfTEVOR1RIXTsKLSAgICBVU0hPUlQgIFJzdjsKLX0gUlRfODAyXzExX0FDTF9FTlRSWSwgKlBSVF84MDJfMTFfQUNMX0VOVFJZOworc3RydWN0IHJ0XzgwMl8xMV9hY2xfZW50cnkgeworCXU4IEFkZHJbTUFDX0FERFJfTEVOR1RIXTsKKwl1MTYgUnN2OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SVF84MDJfMTFfQUNMIHsKLSAgICBVTE9ORyAgIFBvbGljeTsgICAgICAgICAgICAgLy8gMC1kaXNhYmxlLCAxLXBvc2l0aXZlIGxpc3QsIDItbmVnYXRpdmUgbGlzdAotICAgIFVMT05HICAgTnVtOwotICAgIFJUXzgwMl8xMV9BQ0xfRU5UUlkgRW50cnlbTUFYX05VTUJFUl9PRl9BQ0xdOwotfSBSVF84MDJfMTFfQUNMLCAqUFJUXzgwMl8xMV9BQ0w7CitzdHJ1Y3QgUEFDS0VEIHJ0X3J0XzgwMl8xMV9hY2wgeworCXVuc2lnbmVkIGxvbmcgUG9saWN5OwkJLyogMC1kaXNhYmxlLCAxLXBvc2l0aXZlIGxpc3QsIDItbmVnYXRpdmUgbGlzdCAqLworCXVuc2lnbmVkIGxvbmcgTnVtOworCXN0cnVjdCBydF84MDJfMTFfYWNsX2VudHJ5IEVudHJ5W01BWF9OVU1CRVJfT0ZfQUNMXTsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfV0RTIHsKLSAgICBVTE9ORwkJCQkJCU51bTsKLSAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUwkJRW50cnlbMjQvKk1BWF9OVU1fT0ZfV0RTX0xJTksqL107Ci0JVUxPTkcJCQkJCQlLZXlMZW5ndGg7Ci0JVUNIQVIJCQkJCQlLZXlNYXRlcmlhbFszMl07Ci19IFJUXzgwMl8xMV9XRFMsICpQUlRfODAyXzExX1dEUzsKK3N0cnVjdCBydF84MDJfMTFfd2RzIHsKKwl1bnNpZ25lZCBsb25nIE51bTsKKwlORElTXzgwMl8xMV9NQUNfQUREUkVTUyBFbnRyeVsyNCAvKk1BWF9OVU1fT0ZfV0RTX0xJTksgKi8gXTsKKwl1bnNpZ25lZCBsb25nIEtleUxlbmd0aDsKKwl1OCBLZXlNYXRlcmlhbFszMl07Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX1RYX1JBVEVTXyB7Ci0gICAgVUNIQVIgICAgICAgU3VwUmF0ZUxlbjsKLSAgICBVQ0hBUiAgICAgICBTdXBSYXRlW01BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFU107Ci0gICAgVUNIQVIgICAgICAgRXh0UmF0ZUxlbjsKLSAgICBVQ0hBUiAgICAgICBFeHRSYXRlW01BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFU107Ci19IFJUXzgwMl8xMV9UWF9SQVRFUywgKlBSVF84MDJfMTFfVFhfUkFURVM7CitzdHJ1Y3QgcnRfODAyXzExX3R4X3JhdGVzIHsKKwl1OCBTdXBSYXRlTGVuOworCXU4IFN1cFJhdGVbTUFYX0xFTkdUSF9PRl9TVVBQT1JUX1JBVEVTXTsKKwl1OCBFeHRSYXRlTGVuOworCXU4IEV4dFJhdGVbTUFYX0xFTkdUSF9PRl9TVVBQT1JUX1JBVEVTXTsKK307CiAKLQotLy8gRGVmaW5pdGlvbiBvZiBleHRyYSBpbmZvcm1hdGlvbiBjb2RlCi0jZGVmaW5lCUdFTkVSQUxfTElOS19VUAkJCTB4MAkJCS8vIExpbmsgaXMgVXAKLSNkZWZpbmUJR0VORVJBTF9MSU5LX0RPV04JCTB4MQkJCS8vIExpbmsgaXMgRG93bgotI2RlZmluZQlIV19SQURJT19PRkYJCQkweDIJCQkvLyBIYXJkd2FyZSByYWRpbyBvZmYKLSNkZWZpbmUJU1dfUkFESU9fT0ZGCQkJMHgzCQkJLy8gU29mdHdhcmUgcmFkaW8gb2ZmCi0jZGVmaW5lCUFVVEhfRkFJTAkJCQkweDQJCQkvLyBPcGVuIGF1dGhlbnRpY2F0aW9uIGZhaWwKLSNkZWZpbmUJQVVUSF9GQUlMX0tFWVMJCQkweDUJCQkvLyBTaGFyZWQgYXV0aGVudGljYXRpb24gZmFpbAotI2RlZmluZQlBU1NPQ19GQUlMCQkJCTB4NgkJCS8vIEFzc29jaWF0aW9uIGZhaWxlZAotI2RlZmluZQlFQVBfTUlDX0ZBSUxVUkUJCQkweDcJCQkvLyBEZWF1dGhlbmNhdGlvbiBiZWNhdXNlIE1JQyBmYWlsdXJlCi0jZGVmaW5lCUVBUF80V0FZX1RJTUVPVVQJCTB4OAkJCS8vIERlYXV0aGVuY2F0aW9uIG9uIDQtd2F5IGhhbmRzaGFrZSB0aW1lb3V0Ci0jZGVmaW5lCUVBUF9HUk9VUF9LRVlfVElNRU9VVAkweDkJCQkvLyBEZWF1dGhlbmNhdGlvbiBvbiBncm91cCBrZXkgaGFuZHNoYWtlIHRpbWVvdXQKLSNkZWZpbmUJRUFQX1NVQ0NFU1MJCQkJMHhhCQkJLy8gRUFQIHN1Y2NlZWQKLSNkZWZpbmUJREVURUNUX1JBREFSX1NJR05BTAkJMHhiICAgICAgICAgLy8gUmFkYXIgc2lnbmFsIG9jY3VyIGluIGN1cnJlbnQgY2hhbm5lbAotI2RlZmluZSBFWFRSQV9JTkZPX01BWAkJCTB4YgkJCS8vIEluZGljYXRlIExhc3QgT0lECisvKiBEZWZpbml0aW9uIG9mIGV4dHJhIGluZm9ybWF0aW9uIGNvZGUgKi8KKyNkZWZpbmUJR0VORVJBTF9MSU5LX1VQCQkJMHgwCS8qIExpbmsgaXMgVXAgKi8KKyNkZWZpbmUJR0VORVJBTF9MSU5LX0RPV04JCTB4MQkvKiBMaW5rIGlzIERvd24gKi8KKyNkZWZpbmUJSFdfUkFESU9fT0ZGCQkJMHgyCS8qIEhhcmR3YXJlIHJhZGlvIG9mZiAqLworI2RlZmluZQlTV19SQURJT19PRkYJCQkweDMJLyogU29mdHdhcmUgcmFkaW8gb2ZmICovCisjZGVmaW5lCUFVVEhfRkFJTAkJCQkweDQJLyogT3BlbiBhdXRoZW50aWNhdGlvbiBmYWlsICovCisjZGVmaW5lCUFVVEhfRkFJTF9LRVlTCQkJMHg1CS8qIFNoYXJlZCBhdXRoZW50aWNhdGlvbiBmYWlsICovCisjZGVmaW5lCUFTU09DX0ZBSUwJCQkJMHg2CS8qIEFzc29jaWF0aW9uIGZhaWxlZCAqLworI2RlZmluZQlFQVBfTUlDX0ZBSUxVUkUJCQkweDcJLyogRGVhdXRoZW5jYXRpb24gYmVjYXVzZSBNSUMgZmFpbHVyZSAqLworI2RlZmluZQlFQVBfNFdBWV9USU1FT1VUCQkweDgJLyogRGVhdXRoZW5jYXRpb24gb24gNC13YXkgaGFuZHNoYWtlIHRpbWVvdXQgKi8KKyNkZWZpbmUJRUFQX0dST1VQX0tFWV9USU1FT1VUCTB4OQkvKiBEZWF1dGhlbmNhdGlvbiBvbiBncm91cCBrZXkgaGFuZHNoYWtlIHRpbWVvdXQgKi8KKyNkZWZpbmUJRUFQX1NVQ0NFU1MJCQkJMHhhCS8qIEVBUCBzdWNjZWVkICovCisjZGVmaW5lCURFVEVDVF9SQURBUl9TSUdOQUwJCTB4YgkvKiBSYWRhciBzaWduYWwgb2NjdXIgaW4gY3VycmVudCBjaGFubmVsICovCisjZGVmaW5lIEVYVFJBX0lORk9fTUFYCQkJMHhiCS8qIEluZGljYXRlIExhc3QgT0lEICovCiAKICNkZWZpbmUgRVhUUkFfSU5GT19DTEVBUgkJMHhmZmZmZmZmZgogCi0vLyBUaGlzIGlzIE9JRCBzZXR0aW5nIHN0cnVjdHVyZS4gU28gb25seSBHRiBvciBNTSBhcyBNb2RlLiBUaGlzIGlzIHZhbGlkIHdoZW4gb3VyIHdpcmVsc3MgbW9kZSBoYXMgODAyLjExbiBpbiB1c2UuCi10eXBlZGVmIHN0cnVjdCB7Ci0JUlRfODAyXzExX1BIWV9NT0RFCQlQaHlNb2RlOyAJLy8KLQlVQ0hBUgkJVHJhbnNtaXRObzsKLQlVQ0hBUgkJSHRNb2RlOyAJLy9IVE1PREVfR0Ygb3IgSFRNT0RFX01NCi0JVUNIQVIJCUV4dE9mZnNldDsJLy9leHRlbnNpb24gY2hhbm5lbCBhYm92ZSBvciBiZWxvdwotCVVDSEFSCQlNQ1M7Ci0JVUNIQVIgICAJQlc7Ci0JVUNIQVIJCVNUQkM7Ci0JVUNIQVIJCVNIT1JUR0k7Ci0JVUNIQVIJCXJzdjsKLX0gT0lEX1NFVF9IVF9QSFlNT0RFLCAqUE9JRF9TRVRfSFRfUEhZTU9ERTsKLQotI2lmZGVmIExMVERfU1VQUE9SVAotdHlwZWRlZiBzdHJ1Y3QgX1JUX0xMVERfQVNTT0lDQVRJT05fRU5UUlkgewotICAgIFVDSEFSICAgICAgICAgICBBZGRyW0VUSF9MRU5HVEhfT0ZfQUREUkVTU107Ci0gICAgdW5zaWduZWQgc2hvcnQgIE1PUjsgICAgICAgIC8vIG1heGltdW0gb3BlcmF0aW9uYWwgcmF0ZQotICAgIFVDSEFSICAgICAgICAgICBwaHlNb2RlOwotfSBSVF9MTFREX0FTU09JQ0FUSU9OX0VOVFJZLCAqUFJUX0xMVERfQVNTT0lDQVRJT05fRU5UUlk7Ci0KLXR5cGVkZWYgc3RydWN0IF9SVF9MTFREX0FTU09JQ0FUSU9OX1RBQkxFIHsKLSAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgTnVtOwotICAgIFJUX0xMVERfQVNTT0lDQVRJT05fRU5UUlkgICBFbnRyeVtNQVhfTlVNQkVSX09GX01BQ107Ci19IFJUX0xMVERfQVNTT0lDQVRJT05fVEFCTEUsICpQUlRfTExURF9BU1NPSUNBVElPTl9UQUJMRTsKLSNlbmRpZiAvLyBMTFREX1NVUFBPUlQgLy8KKy8qIFRoaXMgaXMgT0lEIHNldHRpbmcgc3RydWN0dXJlLiBTbyBvbmx5IEdGIG9yIE1NIGFzIE1vZGUuIFRoaXMgaXMgdmFsaWQgd2hlbiBvdXIgd2lyZWxzcyBtb2RlIGhhcyA4MDIuMTFuIGluIHVzZS4gKi8KK3N0cnVjdCBydF9vaWRfc2V0X2h0X3BoeW1vZGUgeworCVJUXzgwMl8xMV9QSFlfTU9ERSBQaHlNb2RlOwkvKiAqLworCXU4IFRyYW5zbWl0Tm87CisJdTggSHRNb2RlOwkJLypIVE1PREVfR0Ygb3IgSFRNT0RFX01NICovCisJdTggRXh0T2Zmc2V0OwkvKmV4dGVuc2lvbiBjaGFubmVsIGFib3ZlIG9yIGJlbG93ICovCisJdTggTUNTOworCXU4IEJXOworCXU4IFNUQkM7CisJdTggU0hPUlRHSTsKKwl1OCByc3Y7Cit9OwogCiAjZGVmaW5lIE1BWF9DVVNUT01fTEVOIDEyOAogCi10eXBlZGVmIGVudW0gX1JUXzgwMl8xMV9EX0NMSUVOVF9NT0RFCi17Ci0gICBSdDgwMl8xMV9EX05vbmUsCi0gICBSdDgwMl8xMV9EX0ZsZXhpYmxlLAotICAgUnQ4MDJfMTFfRF9TdHJpY3QsCit0eXBlZGVmIGVudW0gX1JUXzgwMl8xMV9EX0NMSUVOVF9NT0RFIHsKKwlSdDgwMl8xMV9EX05vbmUsCisJUnQ4MDJfMTFfRF9GbGV4aWJsZSwKKwlSdDgwMl8xMV9EX1N0cmljdCwKIH0gUlRfODAyXzExX0RfQ0xJRU5UX01PREUsICpQUlRfODAyXzExX0RfQ0xJRU5UX01PREU7CiAKLXR5cGVkZWYgc3RydWN0IF9SVF9DSEFOTkVMX0xJU1RfSU5GTwotewotCVVDSEFSIENoYW5uZWxMaXN0W01BWF9OVU1fT0ZfQ0hTXTsgICAvLyBsaXN0IGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMgZm9yIHNpdGUgc3VydmV5Ci0JVUNIQVIgQ2hhbm5lbExpc3ROdW07IC8vIG51bWJlciBvZiBjaGFubmVsIGluIENoYW5uZWxMaXN0W10KLX0gUlRfQ0hBTk5FTF9MSVNUX0lORk8sICpQUlRfQ0hBTk5FTF9MSVNUX0lORk87CitzdHJ1Y3QgcnRfY2hhbm5lbF9saXN0X2luZm8geworCXU4IENoYW5uZWxMaXN0W01BWF9OVU1fT0ZfQ0hTXTsJLyogbGlzdCBhbGwgc3VwcG9ydGVkIGNoYW5uZWxzIGZvciBzaXRlIHN1cnZleSAqLworCXU4IENoYW5uZWxMaXN0TnVtOwkvKiBudW1iZXIgb2YgY2hhbm5lbCBpbiBDaGFubmVsTGlzdFtdICovCit9OwogCi0jaWZkZWYgUlQyODcwCi0vLyBXU0MgY29uZmlndXJlZCBjcmVkZW50aWFsCi10eXBlZGVmCXN0cnVjdAlfV1NDX0NSRURFTlRJQUwKLXsKLQlORElTXzgwMl8xMV9TU0lECVNTSUQ7CQkJCS8vIG1hbmRhdG9yeQotCVVTSE9SVAkJCQlBdXRoVHlwZTsJCQkvLyBtYW5kYXRvcnksIDE6IG9wZW4sIDI6IHdwYS1wc2ssIDQ6IHNoYXJlZCwgODp3cGEsIDB4MTA6IHdwYTIsIDB4MjA6IHdwYTItcHNrCi0JVVNIT1JUCQkJCUVuY3JUeXBlOwkJCS8vIG1hbmRhdG9yeSwgMTogbm9uZSwgMjogd2VwLCA0OiB0a2lwLCA4OiBhZXMKLQlVQ0hBUgkJCQlLZXlbNjRdOwkJCS8vIG1hbmRhdG9yeSwgTWF4aW11bSA2NCBieXRlCi0JVVNIT1JUCQkJCUtleUxlbmd0aDsKLQlVQ0hBUgkJCQlNYWNBZGRyWzZdOwkJCS8vIG1hbmRhdG9yeSwgQVAgTUFDIGFkZHJlc3MKLQlVQ0hBUgkJCQlLZXlJbmRleDsJCQkvLyBvcHRpb25hbCwgZGVmYXVsdCBpcyAxCi0JVUNIQVIJCQkJUnN2ZFszXTsJCQkvLyBNYWtlIGFsaWdubWVudAotfQlXU0NfQ1JFREVOVElBTCwgKlBXU0NfQ1JFREVOVElBTDsKKy8qIFdTQyBjb25maWd1cmVkIGNyZWRlbnRpYWwgKi8KK3N0cnVjdCBydF93c2NfY3JlZGVudGlhbCB7CisJc3RydWN0IHJ0X25kaXNfODAyXzExX3NzaWQgU1NJRDsJLyogbWFuZGF0b3J5ICovCisJdTE2IEF1dGhUeXBlOwkvKiBtYW5kYXRvcnksIDE6IG9wZW4sIDI6IHdwYS1wc2ssIDQ6IHNoYXJlZCwgODp3cGEsIDB4MTA6IHdwYTIsIDB4MjA6IHdwYTItcHNrICovCisJdTE2IEVuY3JUeXBlOwkvKiBtYW5kYXRvcnksIDE6IG5vbmUsIDI6IHdlcCwgNDogdGtpcCwgODogYWVzICovCisJdTggS2V5WzY0XTsJCS8qIG1hbmRhdG9yeSwgTWF4aW11bSA2NCBieXRlICovCisJdTE2IEtleUxlbmd0aDsKKwl1OCBNYWNBZGRyWzZdOwkvKiBtYW5kYXRvcnksIEFQIE1BQyBhZGRyZXNzICovCisJdTggS2V5SW5kZXg7CQkvKiBvcHRpb25hbCwgZGVmYXVsdCBpcyAxICovCisJdTggUnN2ZFszXTsJCS8qIE1ha2UgYWxpZ25tZW50ICovCit9OwogCi0vLyBXU0MgY29uZmlndXJlZCBwcm9maWxlcwotdHlwZWRlZglzdHJ1Y3QJX1dTQ19QUk9GSUxFCi17Ci0JVUlOVAkJCVByb2ZpbGVDbnQ7Ci0JV1NDX0NSRURFTlRJQUwJUHJvZmlsZVs4XTsJCQkJLy8gU3VwcG9ydCB1cCB0byA4IHByb2ZpbGVzCi19CVdTQ19QUk9GSUxFLCAqUFdTQ19QUk9GSUxFOwotI2VuZGlmCisvKiBXU0MgY29uZmlndXJlZCBwcm9maWxlcyAqLworc3RydWN0IHJ0X3dzY19wcm9maWxlIHsKKwl1MzIgUHJvZmlsZUNudDsKKwl1MzIgQXBwbHlQcm9maWxlSWR4OwkvKiBhZGQgYnkgam9obmxpLCBmaXggV1BTIHRlc3QgcGxhbiA1LjEuMSAqLworCXN0cnVjdCBydF93c2NfY3JlZGVudGlhbCBQcm9maWxlWzhdOwkvKiBTdXBwb3J0IHVwIHRvIDggcHJvZmlsZXMgKi8KK307CiAKLSNlbmRpZiAvLyBfT0lEX0hfCi0KKyNlbmRpZiAvKiBfT0lEX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3BjaV9tYWluX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9wY2lfbWFpbl9kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWY0MzA0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9wY2lfbWFpbl9kZXYuYwpAQCAtMCwwICsxLDExOTAgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgcGNpX21haW5fZGV2LmMKKworICAgIEFic3RyYWN0OgorICAgIENyZWF0ZSBhbmQgcmVnaXN0ZXIgbmV0d29yayBpbnRlcmZhY2UgZm9yIFBDSSBiYXNlZCBjaGlwc2V0cyBpbiBMaW51eCBwbGF0Zm9ybS4KKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2luY2x1ZGUgInJ0X2NvbmZpZy5oIgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisvKiBGb2xsb3dpbmcgaW5mb3JtYXRpb24gd2lsbCBiZSBzaG93IHdoZW4geW91IHJ1biAnbW9kaW5mbycgKi8KKy8qICoqKiBJZiB5b3UgaGF2ZSBhIHNvbHV0aW9uIGZvciB0aGUgYnVnIGluIGN1cnJlbnQgdmVyc2lvbiBvZiBkcml2ZXIsIHBsZWFzZSBtYWlsIHRvIG1lLiAqLworLyogT3RoZXJ3aXNlIHBvc3QgdG8gZm9ydW0gaW4gcmFsaW5rdGVjaCdzIHdlYiBzaXRlKHd3dy5yYWxpbmt0ZWNoLmNvbSkgYW5kIGxldCBhbGwgdXNlcnMgaGVscCB5b3UuICoqKiAqLworTU9EVUxFX0FVVEhPUigiSmV0dCBDaGVuIDxqZXR0X2NoZW5AcmFsaW5rdGVjaC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJUMjg2MC9SVDMwOTAgV2lyZWxlc3MgTGFuIExpbnV4IERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJydDMwOTBzdGEiKTsKKworLyogKi8KKy8qIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAqLworLyogKi8KK2V4dGVybiBpbnQgcnQyOHh4X2Nsb3NlKElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKK2V4dGVybiBpbnQgcnQyOHh4X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcnQyODYwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpOworc3RhdGljIGludCBfX2RldmluaXQgcnQyODYwX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CitzdGF0aWMgdm9pZCBfX2V4aXQgcnQyODYwX2NsZWFudXBfbW9kdWxlKHZvaWQpOworc3RhdGljIGludCBfX2luaXQgcnQyODYwX2luaXRfbW9kdWxlKHZvaWQpOworCitzdGF0aWMgdm9pZCBSVE1QSW5pdFBDSWVEZXZpY2UoSU4gc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsCisJCQkgICAgICAgc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBydDI4NjBfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKK3N0YXRpYyBpbnQgcnQyODYwX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldik7CisjZW5kaWYgLyogQ09ORklHX1BNIC8vICovCisKKy8qICovCisvKiBSYWxpbmsgUENJIGRldmljZSB0YWJsZSwgaW5jbHVkZSBhbGwgc3VwcG9ydGVkIGNoaXBzZXRzICovCisvKiAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHJ0Mjg2MF9wY2lfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKyNpZmRlZiBSVDI4NjAKKwl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMjg2MF9QQ0lfREVWSUNFX0lEKX0sCS8qUlQyODYwMi40RyAqLworCXtQQ0lfREVWSUNFKE5JQ19QQ0lfVkVORE9SX0lELCBOSUMyODYwX1BDSWVfREVWSUNFX0lEKX0sCisJe1BDSV9ERVZJQ0UoTklDX1BDSV9WRU5ET1JfSUQsIE5JQzI3NjBfUENJX0RFVklDRV9JRCl9LAorCXtQQ0lfREVWSUNFKE5JQ19QQ0lfVkVORE9SX0lELCBOSUMyNzkwX1BDSWVfREVWSUNFX0lEKX0sCisJe1BDSV9ERVZJQ0UoVkVOX0FXVF9QQ0lfVkVORE9SX0lELCBWRU5fQVdUX1BDSWVfREVWSUNFX0lEKX0sCisJe1BDSV9ERVZJQ0UoRURJTUFYX1BDSV9WRU5ET1JfSUQsIDB4NzcwOCl9LAorCXtQQ0lfREVWSUNFKEVESU1BWF9QQ0lfVkVORE9SX0lELCAweDc3MjgpfSwKKwl7UENJX0RFVklDRShFRElNQVhfUENJX1ZFTkRPUl9JRCwgMHg3NzU4KX0sCisJe1BDSV9ERVZJQ0UoRURJTUFYX1BDSV9WRU5ET1JfSUQsIDB4NzcyNyl9LAorCXtQQ0lfREVWSUNFKEVESU1BWF9QQ0lfVkVORE9SX0lELCAweDc3MzgpfSwKKwl7UENJX0RFVklDRShFRElNQVhfUENJX1ZFTkRPUl9JRCwgMHg3NzQ4KX0sCisJe1BDSV9ERVZJQ0UoRURJTUFYX1BDSV9WRU5ET1JfSUQsIDB4Nzc2OCl9LAorI2VuZGlmCisjaWZkZWYgUlQzMDkwCisJe1BDSV9ERVZJQ0UoTklDX1BDSV9WRU5ET1JfSUQsIE5JQzMwOTBfUENJZV9ERVZJQ0VfSUQpfSwKKwl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMzA5MV9QQ0llX0RFVklDRV9JRCl9LAorCXtQQ0lfREVWSUNFKE5JQ19QQ0lfVkVORE9SX0lELCBOSUMzMDkyX1BDSWVfREVWSUNFX0lEKX0sCisjZW5kaWYgLyogUlQzMDkwIC8vICovCisjaWZkZWYgUlQzMzkwCisJe1BDSV9ERVZJQ0UoTklDX1BDSV9WRU5ET1JfSUQsIE5JQzMzOTBfUENJZV9ERVZJQ0VfSUQpfSwKKwl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMzM5MV9QQ0llX0RFVklDRV9JRCl9LAorCXtQQ0lfREVWSUNFKE5JQ19QQ0lfVkVORE9SX0lELCBOSUMzMzkyX1BDSWVfREVWSUNFX0lEKX0sCisjZW5kaWYgLyogUlQzMzkwIC8vICovCisJezAsfQkJCS8qIHRlcm1pbmF0ZSBsaXN0ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcnQyODYwX3BjaV90YmwpOworI2lmZGVmIE1PRFVMRV9WRVJTSU9OCitNT0RVTEVfVkVSU0lPTihTVEFfRFJJVkVSX1ZFUlNJT04pOworI2VuZGlmCisKKy8qICovCisvKiBPdXIgUENJIGRyaXZlciBzdHJ1Y3R1cmUgKi8KKy8qICovCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcnQyODYwX2RyaXZlciA9IHsKK25hbWU6CSJydDI4NjAiLAoraWRfdGFibGU6cnQyODYwX3BjaV90YmwsCitwcm9iZToJcnQyODYwX3Byb2JlLAorcmVtb3ZlOl9fZGV2ZXhpdF9wKHJ0Mjg2MF9yZW1vdmVfb25lKSwKKyNpZmRlZiBDT05GSUdfUE0KK3N1c3BlbmQ6cnQyODYwX3N1c3BlbmQsCityZXN1bWU6cnQyODYwX3Jlc3VtZSwKKyNlbmRpZgorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVBDSSBkZXZpY2UgaW5pdGlhbGl6YXRpb24gcmVsYXRlZCBwcm9jZWR1cmVzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQ09ORklHX1BNCisKK3ZvaWQgUlQyODYwUmVqZWN0UGVuZGluZ1BhY2tldHMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCS8qIGNsZWFyIFBTIHBhY2tldHMgKi8KKwkvKiBjbGVhciBUeFN3IHBhY2tldHMgKi8KK30KKworc3RhdGljIGludCBydDI4NjBfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopTlVMTDsKKwlpbnQgcmV0dmFsID0gMDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODYwX3N1c3BlbmQoKVxuIikpOworCisJaWYgKG5ldF9kZXYgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJuZXRfZGV2ID09IE5VTEwhXG4iKSk7CisJfSBlbHNlIHsKKwkJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkLCBuZXRfZGV2KTsKKworCQkvKiB3ZSBjYW4gbm90IHVzZSBJRkZfVVAgYmVjYXVzZSByYTAgZG93biBidXQgcmExIHVwICovCisJCS8qIGFuZCAxIHN1c3BlbmQvcmVzdW1lIGZ1bmN0aW9uIGZvciAxIG1vZHVsZSwgbm90IGZvciBlYWNoIGludGVyZmFjZSAqLworCQkvKiBzbyBMaW51eCB3aWxsIGNhbGwgc3VzcGVuZC9yZXN1bWUgZnVuY3Rpb24gb25jZSAqLworCQlpZiAoVklSVFVBTF9JRl9OVU0ocEFkKSA+IDApIHsKKwkJCS8qIGF2b2lkIHVzZXJzIGRvIHN1c3BlbmQgYWZ0ZXIgaW50ZXJmYWNlIGlzIGRvd24gKi8KKworCQkJLyogc3RvcCBpbnRlcmZhY2UgKi8KKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldF9kZXYpOworCQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRfZGV2KTsKKworCQkJLyogbWFyayBkZXZpY2UgYXMgcmVtb3ZlZCBmcm9tIHN5c3RlbSBhbmQgdGhlcmVmb3JlIG5vIGxvbmdlciBhdmFpbGFibGUgKi8KKwkJCW5ldGlmX2RldmljZV9kZXRhY2gobmV0X2Rldik7CisKKwkJCS8qIG1hcmsgaGFsdCBmbGFnICovCisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CisKKwkJCS8qIHRha2UgZG93biB0aGUgZGV2aWNlICovCisJCQlydDI4eHhfY2xvc2UoKHN0cnVjdCBuZXRfZGV2aWNlICopbmV0X2Rldik7CisKKwkJCVJUX01PRF9ERUNfVVNFX0NPVU5UKCk7CisJCX0KKwl9CisKKwkvKiByZWZlcmVuY2UgdG8gaHR0cDovL3Zvdm8yMDAwLmNvbS90eXBlLWxhYi9saW51eC9rZXJuZWwtYXBpL2xpbnV4LWtlcm5lbC1hcGkuaHRtbCAqLworCS8qIGVuYWJsZSBkZXZpY2UgdG8gZ2VuZXJhdGUgUE1FIyB3aGVuIHN1c3BlbmRlZCAqLworCS8qIHBjaV9jaG9vc2Vfc3RhdGUoKTogQ2hvb3NlIHRoZSBwb3dlciBzdGF0ZSBvZiBhIFBDSSBkZXZpY2UgdG8gYmUgc3VzcGVuZGVkICovCisJcmV0dmFsID0gcGNpX2VuYWJsZV93YWtlKHBjaV9kZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGNpX2Rldiwgc3RhdGUpLCAxKTsKKwkvKiBzYXZlIHRoZSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSBvZiBhIGRldmljZSBiZWZvcmUgc3VzcGVuZGluZyAqLworCXBjaV9zYXZlX3N0YXRlKHBjaV9kZXYpOworCS8qIGRpc2FibGUgUENJIGRldmljZSBhZnRlciB1c2UgKi8KKwlwY2lfZGlzYWJsZV9kZXZpY2UocGNpX2Rldik7CisKKwlyZXR2YWwgPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaV9kZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGNpX2Rldiwgc3RhdGUpKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODYwX3N1c3BlbmQoKVxuIikpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgcnQyODYwX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKU5VTEw7CisJaW50IHJldHZhbDsKKworCS8qIHNldCB0aGUgcG93ZXIgc3RhdGUgb2YgYSBQQ0kgZGV2aWNlICovCisJLyogUENJIGhhcyA0IHBvd2VyIHN0YXRlcywgRE8gKG5vcm1hbCkgfiBEMyhsZXNzIHBvd2VyKSAqLworCS8qIGluIGluY2x1ZGUvbGludXgvcGNpLmgsIHlvdSBjYW4gZmluZCB0aGF0ICovCisJLyogI2RlZmluZSBQQ0lfRDAgICAgICAgICAgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAwKSAqLworCS8qICNkZWZpbmUgUENJX0QxICAgICAgICAgICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgMSkgKi8KKwkvKiAjZGVmaW5lIFBDSV9EMiAgICAgICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDIpICovCisJLyogI2RlZmluZSBQQ0lfRDNob3QgICAgICAgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAzKSAqLworCS8qICNkZWZpbmUgUENJX0QzY29sZCAgICAgICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgNCkgKi8KKwkvKiAjZGVmaW5lIFBDSV9VTktOT1dOICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDUpICovCisJLyogI2RlZmluZSBQQ0lfUE9XRVJfRVJST1IgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAtMSkgKi8KKwlyZXR2YWwgPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaV9kZXYsIFBDSV9EMCk7CisKKwkvKiByZXN0b3JlIHRoZSBzYXZlZCBzdGF0ZSBvZiBhIFBDSSBkZXZpY2UgKi8KKwlwY2lfcmVzdG9yZV9zdGF0ZShwY2lfZGV2KTsKKworCS8qIGluaXRpYWxpemUgZGV2aWNlIGJlZm9yZSBpdCdzIHVzZWQgYnkgYSBkcml2ZXIgKi8KKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpX2RldikpIHsKKwkJcHJpbnRrKCJwY2kgZW5hYmxlIGZhaWwhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4NjBfcmVzdW1lKClcbiIpKTsKKworCWlmIChuZXRfZGV2ID09IE5VTEwpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgibmV0X2RldiA9PSBOVUxMIVxuIikpOworCX0gZWxzZQorCQlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWQsIG5ldF9kZXYpOworCisJaWYgKHBBZCAhPSBOVUxMKSB7CisJCS8qIHdlIGNhbiBub3QgdXNlIElGRl9VUCBiZWNhdXNlIHJhMCBkb3duIGJ1dCByYTEgdXAgKi8KKwkJLyogYW5kIDEgc3VzcGVuZC9yZXN1bWUgZnVuY3Rpb24gZm9yIDEgbW9kdWxlLCBub3QgZm9yIGVhY2ggaW50ZXJmYWNlICovCisJCS8qIHNvIExpbnV4IHdpbGwgY2FsbCBzdXNwZW5kL3Jlc3VtZSBmdW5jdGlvbiBvbmNlICovCisJCWlmIChWSVJUVUFMX0lGX05VTShwQWQpID4gMCkgeworCQkJLyogbWFyayBkZXZpY2UgYXMgYXR0YWNoZWQgZnJvbSBzeXN0ZW0gYW5kIHJlc3RhcnQgaWYgbmVlZGVkICovCisJCQluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldF9kZXYpOworCisJCQlpZiAocnQyOHh4X29wZW4oKHN0cnVjdCBuZXRfZGV2aWNlICopbmV0X2RldikgIT0gMCkgeworCQkJCS8qIG9wZW4gZmFpbCAqLworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCI8PT09IHJ0Mjg2MF9yZXN1bWUoKVxuIikpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJLyogaW5jcmVhc2UgTU9EVUxFIHVzZSBjb3VudCAqLworCQkJUlRfTU9EX0lOQ19VU0VfQ09VTlQoKTsKKworCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKKwkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKKworCQkJbmV0aWZfc3RhcnRfcXVldWUobmV0X2Rldik7CisJCQluZXRpZl9jYXJyaWVyX29uKG5ldF9kZXYpOworCQkJbmV0aWZfd2FrZV9xdWV1ZShuZXRfZGV2KTsKKwkJfQorCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODYwX3Jlc3VtZSgpXG4iKSk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNIC8vICovCisKK3N0YXRpYyBpbnQgX19pbml0IHJ0Mjg2MF9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZydDI4NjBfZHJpdmVyKTsKK30KKworLyogKi8KKy8qIERyaXZlciBtb2R1bGUgdW5sb2FkIGZ1bmN0aW9uICovCisvKiAqLworc3RhdGljIHZvaWQgX19leGl0IHJ0Mjg2MF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcnQyODYwX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHJ0Mjg2MF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChydDI4NjBfY2xlYW51cF9tb2R1bGUpOworCisvKiAqLworLyogUENJIGRldmljZSBwcm9iZSAmIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uICovCisvKiAqLworc3RhdGljIGludCBfX2RldmluaXQgcnQyODYwX3Byb2JlKElOIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LAorCQkJCSAgSU4gY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKU5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7CisJdm9pZCAqaGFuZGxlOworCWNoYXIgKnByaW50X25hbWU7CisJdW5zaWduZWQgbG9uZyBjc3JfYWRkcjsKKwlpbnQgcnYgPSAwOworCXN0cnVjdCBydF9ydG1wX29zX25ldGRldl9vcF9ob29rIG5ldERldkhvb2s7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IHJ0Mjg2MF9wcm9iZVxuIikpOworCisvKlBDSURldkluaXQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisJLyogd2FrZSB1cCBhbmQgZW5hYmxlIGRldmljZSAqLworCWlmICgocnYgPSBwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KSkgIT0gMCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIkVuYWJsZSBQQ0kgZGV2aWNlIGZhaWxlZCwgZXJybm89JWQhXG4iLCBydikpOworCQlyZXR1cm4gcnY7CisJfQorCisJcHJpbnRfbmFtZSA9IChjaGFyICopcGNpX25hbWUocGNpX2Rldik7CisKKwlpZiAoKHJ2ID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwY2lfZGV2LCBwcmludF9uYW1lKSkgIT0gMCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIlJlcXVlc3QgUENJIHJlc291cmNlIGZhaWxlZCwgZXJybm89JWQhXG4iLCBydikpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qIG1hcCBwaHlzaWNhbCBhZGRyZXNzIHRvIHZpcnR1YWwgYWRkcmVzcyBmb3IgYWNjZXNzaW5nIHJlZ2lzdGVyICovCisJY3NyX2FkZHIgPQorCSAgICAodW5zaWduZWQgbG9uZylpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCAwKSwKKwkJCQkgICBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDApKTsKKwlpZiAoIWNzcl9hZGRyKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiaW9yZW1hcCBmYWlsZWQgZm9yIGRldmljZSAlcywgcmVnaW9uIDB4JWxYIEAgMHglbFhcbiIsCisJCQkgIHByaW50X25hbWUsICh1bnNpZ25lZCBsb25nKXBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwgMCksCisJCQkgICh1bnNpZ25lZCBsb25nKXBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCAwKSkpOworCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisJfSBlbHNlIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCIlczogYXQgMHglbHgsIFZBIDB4JWx4LCBJUlEgJWQuIFxuIiwgcHJpbnRfbmFtZSwKKwkJCSAgKHVuc2lnbmVkIGxvbmcpcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApLAorCQkJICAodW5zaWduZWQgbG9uZyljc3JfYWRkciwgcGNpX2Rldi0+aXJxKSk7CisJfQorCisJLyogU2V0IERNQSBtYXN0ZXIgKi8KKwlwY2lfc2V0X21hc3RlcihwY2lfZGV2KTsKKworLypSdG1wRGV2SW5pdD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwkvKiBBbGxvY2F0ZSBzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyIGFkYXB0ZXIgc3RydWN0dXJlICovCisJaGFuZGxlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG9zX2Nvb2tpZSksIEdGUF9LRVJORUwpOworCWlmIChoYW5kbGUgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIiVzKCk6IEFsbG9jYXRlIG1lbW9yeSBmb3Igb3MgaGFuZGxlIGZhaWxlZCFcbiIsCisJCQkgIF9fZnVuY19fKSk7CisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKworCSgoc3RydWN0IG9zX2Nvb2tpZSAqKWhhbmRsZSktPnBjaV9kZXYgPSBwY2lfZGV2OworCisJcnYgPSBSVE1QQWxsb2NBZGFwdGVyQmxvY2soaGFuZGxlLCAmcEFkKTsJLypzaGlhbmc6IHdlIG1heSBuZWVkIHRoZSBwY2lfZGV2IGZvciBhbGxvY2F0ZSBzdHJ1Y3R1cmUgb2YgInN0cnVjdCBydF9ydG1wX2FkYXB0ZXIiICovCisJaWYgKHJ2ICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCS8qIEhlcmUgYXJlIHRoZSBzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyIHN0cnVjdHVyZSB3aXRoIHBjaS1idXMgc3BlY2lmaWMgcGFyYW1ldGVycy4gKi8KKwlwQWQtPkNTUkJhc2VBZGRyZXNzID0gKHU4ICopY3NyX2FkZHI7CisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCSAoInBBZC0+Q1NSQmFzZUFkZHJlc3MgPTB4JWx4LCBjc3JfYWRkcj0weCVseCFcbiIsCisJCSAgKHVuc2lnbmVkIGxvbmcpcEFkLT5DU1JCYXNlQWRkcmVzcywgY3NyX2FkZHIpKTsKKwlSdG1wUmFEZXZDdHJsSW5pdChwQWQsIFJUTVBfREVWX0lORl9QQ0kpOworCisvKk5ldERldkluaXQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisJbmV0X2RldiA9IFJ0bXBQaHlOZXREZXZJbml0KHBBZCwgJm5ldERldkhvb2spOworCWlmIChuZXRfZGV2ID09IE5VTEwpCisJCWdvdG8gZXJyX291dF9mcmVlX3JhZGV2OworCisJLyogSGVyZSBhcmUgdGhlIG5ldF9kZXZpY2Ugc3RydWN0dXJlIHdpdGggcGNpLWJ1cyBzcGVjaWZpYyBwYXJhbWV0ZXJzLiAqLworCW5ldF9kZXYtPmlycSA9IHBjaV9kZXYtPmlycTsJLyogSW50ZXJydXB0IElSUSBudW1iZXIgKi8KKwluZXRfZGV2LT5iYXNlX2FkZHIgPSBjc3JfYWRkcjsJLyogU2F2ZSBDU1IgdmlydHVhbCBhZGRyZXNzIGFuZCBpcnEgdG8gZGV2aWNlIHN0cnVjdHVyZSAqLworCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBuZXRfZGV2KTsJLyogU2V0IGRyaXZlciBkYXRhICovCisKKy8qIGZvciBzdXBwb3J0aW5nIE5ldHdvcmsgTWFuYWdlciAqLworCS8qIFNldCB0aGUgc3lzZnMgcGh5c2ljYWwgZGV2aWNlIHJlZmVyZW5jZSBmb3IgdGhlIG5ldHdvcmsgbG9naWNhbCBkZXZpY2UKKwkgKiBpZiBzZXQgcHJpb3IgdG8gcmVnaXN0cmF0aW9uIHdpbGwgY2F1c2UgYSBzeW1saW5rIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKwkgKi8KKwlTRVRfTkVUREVWX0RFVihuZXRfZGV2LCAmKHBjaV9kZXYtPmRldikpOworCisvKkFsbCBkb25lLCBpdCdzIHRpbWUgdG8gcmVnaXN0ZXIgdGhlIG5ldCBkZXZpY2UgdG8gbGludXgga2VybmVsLiAqLworCS8qIFJlZ2lzdGVyIHRoaXMgZGV2aWNlICovCisJcnYgPSBSdG1wT1NOZXREZXZBdHRhY2gobmV0X2RldiwgJm5ldERldkhvb2spOworCWlmIChydikKKwkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OworCisJcEFkLT5TdGFDZmcuT3JpRGV2VHlwZSA9IG5ldF9kZXYtPnR5cGU7CisJUlRNUEluaXRQQ0llRGV2aWNlKHBjaV9kZXYsIHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IHJ0Mjg2MF9wcm9iZVxuIikpOworCisJcmV0dXJuIDA7CQkvKiBwcm9iZSBvayAqLworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVSUk9SIEhBTkRMRSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2Vycl9vdXRfZnJlZV9uZXRkZXY6CisJUnRtcE9TTmV0RGV2RnJlZShuZXRfZGV2KTsKKworZXJyX291dF9mcmVlX3JhZGV2OgorCS8qIGZyZWUgc3RydWN0IHJ0X3J0bXBfYWRhcHRlciBzdHJjdXR1cmUgYW5kIG9zX2Nvb2tpZSAqLworCVJUTVBGcmVlQWRhcHRlcihwQWQpOworCitlcnJfb3V0X2lvdW5tYXA6CisJaW91bm1hcCgodm9pZCAqKShjc3JfYWRkcikpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCksCisJCQkgICBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDApKTsKKworZXJyX291dF9mcmVlX3JlczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBjaV9kZXYpOworCitlcnJfb3V0OgorCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2KTsKKworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkgKCI8PT09IHJ0Mjg2MF9wcm9iZSBmYWlsZWQgd2l0aCBydiA9ICVkIVxuIiwgcnYpKTsKKworCXJldHVybiAtRU5PREVWOwkJLyogcHJvYmUgZmFpbCAqLworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcnQyODYwX3JlbW92ZV9vbmUoSU4gc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGNzcl9hZGRyID0gbmV0X2Rldi0+YmFzZV9hZGRyOwkvKiBwQWQtPkNTUkJhc2VBZGRyZXNzOyAqLworCisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkLCBuZXRfZGV2KTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODYwX3JlbW92ZV9vbmVcbiIpKTsKKworCWlmIChwQWQgIT0gTlVMTCkgeworCQkvKiBVbnJlZ2lzdGVyL0ZyZWUgYWxsIGFsbG9jYXRlZCBuZXRfZGV2aWNlLiAqLworCQlSdG1wUGh5TmV0RGV2RXhpdChwQWQsIG5ldF9kZXYpOworCisJCS8qIFVubWFwIENTUiBiYXNlIGFkZHJlc3MgKi8KKwkJaW91bm1hcCgoY2hhciAqKShjc3JfYWRkcikpOworCisJCS8qIHJlbGVhc2UgbWVtb3J5IHJlZ2lvbiAqLworCQlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApLAorCQkJCSAgIHBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwgMCkpOworCisJCS8qIEZyZWUgc3RydWN0IHJ0X3J0bXBfYWRhcHRlciByZWxhdGVkIHN0cnVjdHVyZXMuICovCisJCVJ0bXBSYURldkN0cmxFeGl0KHBBZCk7CisKKwl9IGVsc2UgeworCQkvKiBVbnJlZ2lzdGVyIG5ldHdvcmsgZGV2aWNlICovCisJCVJ0bXBPU05ldERldkRldGFjaChuZXRfZGV2KTsKKworCQkvKiBVbm1hcCBDU1IgYmFzZSBhZGRyZXNzICovCisJCWlvdW5tYXAoKGNoYXIgKikobmV0X2Rldi0+YmFzZV9hZGRyKSk7CisKKwkJLyogcmVsZWFzZSBtZW1vcnkgcmVnaW9uICovCisJCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCksCisJCQkJICAgcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2LCAwKSk7CisJfQorCisJLyogRnJlZSB0aGUgcm9vdCBuZXRfZGV2aWNlICovCisJUnRtcE9TTmV0RGV2RnJlZShuZXRfZGV2KTsKKworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIENoZWNrIHRoZSBjaGlwc2V0IHZlbmRvci9wcm9kdWN0IElELgorCitBcmd1bWVudHM6CisgICAgX2Rldl9wCQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQorCitSZXR1cm4gVmFsdWU6CisgICAgVFJVRQkJCQlDaGVjayBvaworCUZBTFNFCQkJCUNoZWNrIGZhaWwKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUlQyOFhYQ2hpcHNldENoZWNrKElOIHZvaWQgKl9kZXZfcCkKK3sKKwkvKiBhbHdheXMgVFJVRSAqLworCXJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJUENJZSBkZXZpY2UgaW5pdGlhbGl6YXRpb24gcmVsYXRlZCBwcm9jZWR1cmVzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBSVE1QSW5pdFBDSWVEZXZpY2Uoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwl1MTYgZGV2aWNlX2lkOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChwY2lfZGV2LCBQQ0lfREVWSUNFX0lELCAmZGV2aWNlX2lkKTsKKwlkZXZpY2VfaWQgPSBsZTJjcHUxNihkZXZpY2VfaWQpOworCXBPYmotPkRldmljZUlEID0gZGV2aWNlX2lkOworCWlmICgKKyNpZmRlZiBSVDI4NjAKKwkJICAgKGRldmljZV9pZCA9PSBOSUMyODYwX1BDSWVfREVWSUNFX0lEKSB8fAorCQkgICAoZGV2aWNlX2lkID09IE5JQzI3OTBfUENJZV9ERVZJQ0VfSUQpIHx8CisJCSAgIChkZXZpY2VfaWQgPT0gVkVOX0FXVF9QQ0llX0RFVklDRV9JRCkgfHwKKyNlbmRpZgorI2lmZGVmIFJUMzA5MAorCQkgICAoZGV2aWNlX2lkID09IE5JQzMwOTBfUENJZV9ERVZJQ0VfSUQpIHx8CisJCSAgIChkZXZpY2VfaWQgPT0gTklDMzA5MV9QQ0llX0RFVklDRV9JRCkgfHwKKwkJICAgKGRldmljZV9pZCA9PSBOSUMzMDkyX1BDSWVfREVWSUNFX0lEKSB8fAorI2VuZGlmIC8qIFJUMzA5MCAvLyAqLworCQkgICAwKSB7CisJCXUzMiBNYWNDc3IwID0gMCwgSW5kZXggPSAwOworCQlkbyB7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19DU1IwLCAmTWFjQ3NyMCk7CisKKwkJCWlmICgoTWFjQ3NyMCAhPSAweDAwKSAmJiAoTWFjQ3NyMCAhPSAweEZGRkZGRkZGKSkKKwkJCQlicmVhazsKKworCQkJUlRNUHVzZWNEZWxheSgxMCk7CisJCX0gd2hpbGUgKEluZGV4KysgPCAxMDApOworCisJCS8qIFN1cHBvcnQgYWR2YW5jZWQgcG93ZXIgc2F2ZSBhZnRlciAyODkyLzI3OTAuICovCisJCS8qIE1BQyB2ZXJzaW9uIGF0IG9mZnNldCAweDEwMDAgaXMgMHgyODcyWFhYWC8weDI4NzBYWFhYKFBDSWUsIFVTQiwgU0RJTykuICovCisJCWlmICgoTWFjQ3NyMCAmIDB4ZmZmZjAwMDApICE9IDB4Mjg2MDAwMDApIHsKKwkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSk7CisJCX0KKwl9Cit9CisKK3ZvaWQgUlRNUEluaXRQQ0llTGlua0N0cmxWYWx1ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJaW50IHBvczsKKwl1MTYgcmVnMTYsIGRhdGEyLCBQQ0llUG93ZXJTYXZlTGV2ZWwsIENvbmZpZ3VyYXRpb247CisJdTMyIE1hY1ZhbHVlOworCUJPT0xFQU4gYkZpbmRJbnRlbCA9IEZBTFNFOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpCisJCXJldHVybjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzLj09PT5cbiIsIF9fZnVuY19fKSk7CisJLyogSW5pdCBFRVBST00sIGFuZCBzYXZlIHNldHRpbmdzICovCisJaWYgKCEoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpKSB7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgyMiwgUENJZVBvd2VyU2F2ZUxldmVsKTsKKwkJcEFkLT5QQ0llUG93ZXJTYXZlTGV2ZWwgPSBQQ0llUG93ZXJTYXZlTGV2ZWwgJiAweGZmOworCisJCXBBZC0+TG5rQ3RybEJpdE1hc2sgPSAwOworCQlpZiAoKFBDSWVQb3dlclNhdmVMZXZlbCAmIDB4ZmYpID09IDB4ZmYpIHsKKwkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIj09PT0+IFBDSWVQb3dlclNhdmVMZXZlbCA9IDB4JXguXG4iLAorCQkJCSAgUENJZVBvd2VyU2F2ZUxldmVsKSk7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQlQQ0llUG93ZXJTYXZlTGV2ZWwgJj0gMHgzOworCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDI0LCBkYXRhMik7CisKKwkJCWlmICghCisJCQkgICAgKCgoZGF0YTIgJiAweGZmMDApID09IDB4OTIwMCkKKwkJCSAgICAgJiYgKChkYXRhMiAmIDB4ODApICE9IDApKSkgeworCQkJCWlmIChQQ0llUG93ZXJTYXZlTGV2ZWwgPiAxKQorCQkJCQlQQ0llUG93ZXJTYXZlTGV2ZWwgPSAxOworCQkJfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCI9PT09PiBXcml0ZSAweDgzID0gMHgleC5cbiIsCisJCQkJICBQQ0llUG93ZXJTYXZlTGV2ZWwpKTsKKwkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg4MywgMHhmZiwKKwkJCQkJICAgICAodTgpUENJZVBvd2VyU2F2ZUxldmVsLCAweDAwKTsKKwkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgyMiwgUENJZVBvd2VyU2F2ZUxldmVsKTsKKwkJCVBDSWVQb3dlclNhdmVMZXZlbCAmPSAweGZmOworCQkJUENJZVBvd2VyU2F2ZUxldmVsID0gUENJZVBvd2VyU2F2ZUxldmVsID4+IDY7CisJCQlzd2l0Y2ggKFBDSWVQb3dlclNhdmVMZXZlbCkgeworCQkJY2FzZSAwOgkvKiBPbmx5IHN1cHBvcnQgTDAgKi8KKwkJCQlwQWQtPkxua0N0cmxCaXRNYXNrID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToJLyogT25seSBlbmFibGUgTDBzICovCisJCQkJcEFkLT5MbmtDdHJsQml0TWFzayA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CS8qIGVuYWJsZSBMMSwgTDBzICovCisJCQkJcEFkLT5MbmtDdHJsQml0TWFzayA9IDM7CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CS8qIHN5bmMgd2l0aCBob3N0IGNsayBhbmQgZW5hYmxlIEwxLCBMMHMgKi8KKwkJCQlwQWQtPkxua0N0cmxCaXRNYXNrID0gMHgxMDM7CisJCQkJYnJlYWs7CisJCQl9CisJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MjQsIGRhdGEyKTsKKwkJCWlmICgoUENJZVBvd2VyU2F2ZUxldmVsICYgMHhmZikgIT0gMHhmZikgeworCQkJCVBDSWVQb3dlclNhdmVMZXZlbCAmPSAweDM7CisKKwkJCQlpZiAoIQorCQkJCSAgICAoKChkYXRhMiAmIDB4ZmYwMCkgPT0gMHg5MjAwKQorCQkJCSAgICAgJiYgKChkYXRhMiAmIDB4ODApICE9IDApKSkgeworCQkJCQlpZiAoUENJZVBvd2VyU2F2ZUxldmVsID4gMSkKKwkJCQkJCVBDSWVQb3dlclNhdmVMZXZlbCA9IDE7CisJCQkJfQorCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIj09PT0+IHJ0Mjh4eCBXcml0ZSAweDgzIENvbW1hbmQgPSAweCV4LlxuIiwKKwkJCQkJICBQQ0llUG93ZXJTYXZlTGV2ZWwpKTsKKworCQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg4MywgMHhmZiwKKwkJCQkJCSAgICAgKHU4KVBDSWVQb3dlclNhdmVMZXZlbCwKKwkJCQkJCSAgICAgMHgwMCk7CisJCQl9CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCI9PT09PiBMbmtDdHJsQml0TWFzayA9IDB4JXguXG4iLAorCQkJCSAgcEFkLT5MbmtDdHJsQml0TWFzaykpOworCQl9CisJfSBlbHNlIGlmIChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkgeworCQl1OCBMaW5rQ3RybFNldHRpbmcgPSAwOworCisJCS8qIENoZWNrIDMwOTBFIHNwZWNpYWwgc2V0dGluZyBjaGlwLiAqLworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MjQsIGRhdGEyKTsKKwkJaWYgKChkYXRhMiA9PSAweDkyODApICYmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA9PSAweDAyMTEpKSB7CisJCQlwQWQtPmIzMDkwRVNwZWNpYWxDaGlwID0gVFJVRTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJTcGVjaWFsIDMwOTBFIGNoaXAgXG4iKSk7CisJCX0KKworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEFVWF9DVFJMLCAmTWFjVmFsdWUpOworCQkvKmVuYWJsZSBXQUtFX1BDSUUgZnVuY3Rpb24sIHdoaWNoIGZvcmNlcyB0byBlbmFibGUgUENJRSBjbG9jayB3aGVuIG1wdSBpbnRlcnJ1cHQgYXNzZXJ0aW5nLiAqLworCQkvKkZvcmNlIFBDSUUgMTI1TUh6IENMSyB0byB0b2dnbGUgKi8KKwkJTWFjVmFsdWUgfD0gMHg0MDI7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVWF9DVFJMLCBNYWNWYWx1ZSk7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwKKwkJCSAgICAgKCIgQVVYX0NUUkwgPSAweCUzMnhcbiIsIE1hY1ZhbHVlKSk7CisKKwkJLyogZm9yIFJUMzB4eCBGIGFuZCBhZnRlciwgUENJZSBpbmZ0ZXJmYWNlLCBhbmQgZm9yIHBvd2VyIHNvbHV0aW9uIDMgKi8KKwkJaWYgKChJU19WRVJTSU9OX0FGVEVSX0YocEFkKSkKKwkJICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID49IDIpCisJCSAgICAmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA8PSAzKSkgeworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBBVVhfQ1RSTCwgJk1hY1ZhbHVlKTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwKKwkJCQkgICAgICgiIFJlYWQgQVVYX0NUUkwgPSAweCV4XG4iLCBNYWNWYWx1ZSkpOworCQkJLyogdHVybiBvbiBiaXQgMTIuICovCisJCQkvKmVuYWJsZSAzMktIeiBjbG9jayBtb2RlIGZvciBwb3dlciBzYXZpbmcgKi8KKwkJCU1hY1ZhbHVlIHw9IDB4MTAwMDsKKwkJCWlmIChNYWNWYWx1ZSAhPSAweGZmZmZmZmZmKSB7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVYX0NUUkwsIE1hY1ZhbHVlKTsKKwkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsCisJCQkJCSAgICAgKCIgV3JpdGUgQVVYX0NUUkwgPSAweCV4XG4iLAorCQkJCQkgICAgICBNYWNWYWx1ZSkpOworCQkJCS8qIDEuIGlmIHVzZSBQQ0llUG93ZXJTZXR0aW5nIGlzIDIgb3IgMywgbmVlZCB0byBwcm9ncmFtIE9TQ19DVFJMIHRvIDB4M2ZmMTEuICovCisJCQkJTWFjVmFsdWUgPSAweDNmZjExOworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE9TQ19DVFJMLCBNYWNWYWx1ZSk7CisJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkgICAgICgiIE9TQ19DVFJMID0gMHgleFxuIiwgTWFjVmFsdWUpKTsKKwkJCQkvKiAyLiBXcml0ZSBQQ0kgcmVnaXN0ZXIgQ2xrIHJlZiBiaXQgKi8KKwkJCQlSVE1QcnQzeFNldFBDSWVQb3dlckxpbmtDdHJsKHBBZCk7CisJCQl9IGVsc2UgeworCQkJCS8qIEVycm9yIHJlYWQgQXV4X0N0cmwgdmFsdWUuICBGb3JjZSB0byB1c2Ugc29sdXRpb24gMSAqLworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkgKCIgRXJyb3IgVmFsdWUgaW4gQVVYX0NUUkwgPSAweCV4XG4iLAorCQkJCQkgIE1hY1ZhbHVlKSk7CisJCQkJcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9IDE7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJCSAoIiBGb3JjZSB0byB1c2UgcG93ZXIgc29sdXRpb24xIFxuIikpOworCQkJfQorCQl9CisJCS8qIDEuIHJlYWQgc2V0dGluZyBmcm9tIGluZiBmaWxlLiAqLworCisJCVBDSWVQb3dlclNhdmVMZXZlbCA9CisJCSAgICAodTE2KXBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGU7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiPT09PT4gcnQzMHh4IFJlYWQgUG93ZXJMZXZlbE1vZGUgPSAgMHgleC5cbiIsCisJCQkgIFBDSWVQb3dlclNhdmVMZXZlbCkpOworCQkvKiAyLiBDaGVjayBFbmFibGVOZXdQUy4gKi8KKwkJaWYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBGQUxTRSkKKwkJCVBDSWVQb3dlclNhdmVMZXZlbCA9IDE7CisKKwkJaWYgKElTX1ZFUlNJT05fQkVGT1JFX0YocEFkKQorCQkgICAgJiYgKHBBZC0+YjMwOTBFU3BlY2lhbENoaXAgPT0gRkFMU0UpKSB7CisJCQkvKiBDaGlwIFZlcnNpb24gRSBvbmx5IGFsbG93IDEsIFNvIGZvcmNlIHNldCAxLiAqLworCQkJUENJZVBvd2VyU2F2ZUxldmVsICY9IDB4MTsKKwkJCXBBZC0+UENJZVBvd2VyU2F2ZUxldmVsID0gKHUxNilQQ0llUG93ZXJTYXZlTGV2ZWw7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCI9PT09PiBydDMweHggRSBXcml0ZSAweDgzIENvbW1hbmQgPSAweCV4LlxuIiwKKwkJCQkgIFBDSWVQb3dlclNhdmVMZXZlbCkpOworCisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4ODMsIDB4ZmYsCisJCQkJCSAgICAgKHU4KVBDSWVQb3dlclNhdmVMZXZlbCwgMHgwMCk7CisJCX0gZWxzZSB7CisJCQkvKiBDaGlwIFZlcnNpb24gRiBhbmQgYWZ0ZXIgb25seSBhbGxvdyAxIG9yIDIgb3IgMy4gVGhpcyBtaWdodCBiZSBtb2RpZmllZCBhZnRlciBuZXcgY2hpcCB2ZXJzaW9uIGNvbWUgb3V0LiAqLworCQkJaWYgKCEKKwkJCSAgICAoKFBDSWVQb3dlclNhdmVMZXZlbCA9PSAxKQorCQkJICAgICB8fCAoUENJZVBvd2VyU2F2ZUxldmVsID09IDMpKSkKKwkJCQlQQ0llUG93ZXJTYXZlTGV2ZWwgPSAxOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiPT09PT4gcnQzMHh4IEYgV3JpdGUgMHg4MyBDb21tYW5kID0gMHgleC5cbiIsCisJCQkJICBQQ0llUG93ZXJTYXZlTGV2ZWwpKTsKKwkJCXBBZC0+UENJZVBvd2VyU2F2ZUxldmVsID0gKHUxNilQQ0llUG93ZXJTYXZlTGV2ZWw7CisJCQkvKiBmb3IgMzA5MEYgLCB3ZSBuZWVkIHRvIGFkZCBoaWdoLWJ5dGUgYXJnIGZvciAweDgzIGNvbW1hbmQgdG8gaW5kaWNhdGUgdGhlIGxpbmsgY29udHJvbCBzZXR0aW5nIGluICovCisJCQkvKiBQQ0kgQ29uZmlndXJhdGlvbiBTcGFjZS4gQmVjYXVzZSBmaXJtd2FyZSBjYW4ndCByZWFkIFBDSSBDb25maWd1cmF0aW9uIFNwYWNlICovCisJCQlpZiAoKHBBZC0+UnQzeHhSYWxpbmtMaW5rQ3RybCAmIDB4MikKKwkJCSAgICAmJiAocEFkLT5SdDN4eEhvc3RMaW5rQ3RybCAmIDB4MikpIHsKKwkJCQlMaW5rQ3RybFNldHRpbmcgPSAxOworCQkJfQorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiPT09PT4gcnQzMHh4RiBMaW5rQ3RybFNldHRpbmcgPSAweCV4LlxuIiwKKwkJCQkgIExpbmtDdHJsU2V0dGluZykpOworCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDgzLCAweGZmLAorCQkJCQkgICAgICh1OClQQ0llUG93ZXJTYXZlTGV2ZWwsCisJCQkJCSAgICAgTGlua0N0cmxTZXR0aW5nKTsKKwkJfQorCX0KKwkvKiBGaW5kIFJhbGluayBQQ0llIERldmljZSdzIEV4cHJlc3MgQ2FwYWJpbGl0eSBPZmZzZXQgKi8KKwlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBPYmotPnBjaV9kZXYsIFBDSV9DQVBfSURfRVhQKTsKKworCWlmIChwb3MgIT0gMCkgeworCQkvKiBSYWxpbmsgUENJZSBEZXZpY2UncyBMaW5rIENvbnRyb2wgUmVnaXN0ZXIgT2Zmc2V0ICovCisJCXBBZC0+Ukxua0N0cmxPZmZzZXQgPSBwb3MgKyBQQ0lfRVhQX0xOS0NUTDsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocE9iai0+cGNpX2RldiwgcEFkLT5STG5rQ3RybE9mZnNldCwKKwkJCQkgICAgICZyZWcxNik7CisJCUNvbmZpZ3VyYXRpb24gPSBsZTJjcHUxNihyZWcxNik7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiUmVhZCAoUmFsaW5rIFBDSWUgTGluayBDb250cm9sIFJlZ2lzdGVyKSBvZmZzZXQgMHgleCA9IDB4JXhcbiIsCisJCQkgIHBBZC0+Ukxua0N0cmxPZmZzZXQsIENvbmZpZ3VyYXRpb24pKTsKKwkJcEFkLT5STG5rQ3RybENvbmZpZ3VyYXRpb24gPSAoQ29uZmlndXJhdGlvbiAmIDB4MTAzKTsKKwkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7CisJCUNvbmZpZ3VyYXRpb24gfD0gKDB4MCk7CisjaWZkZWYgUlQyODYwCisJCWlmICgocE9iai0+RGV2aWNlSUQgPT0gTklDMjg2MF9QQ0llX0RFVklDRV9JRCkKKwkJICAgIHx8IChwT2JqLT5EZXZpY2VJRCA9PSBOSUMyNzkwX1BDSWVfREVWSUNFX0lEKSkgeworCQkJcmVnMTYgPSBjcHUybGUxNihDb25maWd1cmF0aW9uKTsKKwkJCXBjaV93cml0ZV9jb25maWdfd29yZChwT2JqLT5wY2lfZGV2LAorCQkJCQkgICAgICBwQWQtPlJMbmtDdHJsT2Zmc2V0LCByZWcxNik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJXcml0ZSAoUmFsaW5rIFBDSWUgTGluayBDb250cm9sIFJlZ2lzdGVyKSAgb2Zmc2V0IDB4JXggPSAweCV4XG4iLAorCQkJCSAgcG9zICsgUENJX0VYUF9MTktDVEwsIENvbmZpZ3VyYXRpb24pKTsKKwkJfQorI2VuZGlmIC8qIFJUMjg2MCAvLyAqLworCisJCVJUTVBGaW5kSG9zdFBDSURldihwQWQpOworCQlpZiAocE9iai0+cGFyZW50X3BjaV9kZXYpIHsKKwkJCXUxNiB2ZW5kb3JfaWQ7CisKKwkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBPYmotPnBhcmVudF9wY2lfZGV2LAorCQkJCQkgICAgIFBDSV9WRU5ET1JfSUQsICZ2ZW5kb3JfaWQpOworCQkJdmVuZG9yX2lkID0gbGUyY3B1MTYodmVuZG9yX2lkKTsKKwkJCWlmICh2ZW5kb3JfaWQgPT0gUENJQlVTX0lOVEVMX1ZFTkRPUikgeworCQkJCWJGaW5kSW50ZWwgPSBUUlVFOworCQkJCVJUTVBfU0VUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX1RPR0dMRV9MMSk7CisJCQl9CisJCQkvKiBGaW5kIFBDSS10by1QQ0kgQnJpZGdlIEV4cHJlc3MgQ2FwYWJpbGl0eSBPZmZzZXQgKi8KKwkJCXBvcyA9CisJCQkgICAgcGNpX2ZpbmRfY2FwYWJpbGl0eShwT2JqLT5wYXJlbnRfcGNpX2RldiwKKwkJCQkJCVBDSV9DQVBfSURfRVhQKTsKKworCQkJaWYgKHBvcyAhPSAwKSB7CisJCQkJQk9PTEVBTiBiQ2hhbmdlID0gRkFMU0U7CisJCQkJLyogUENJLXRvLVBDSSBCcmlkZ2UgTGluayBDb250cm9sIFJlZ2lzdGVyIE9mZnNldCAqLworCQkJCXBBZC0+SG9zdExua0N0cmxPZmZzZXQgPSBwb3MgKyBQQ0lfRVhQX0xOS0NUTDsKKwkJCQlwY2lfcmVhZF9jb25maWdfd29yZChwT2JqLT5wYXJlbnRfcGNpX2RldiwKKwkJCQkJCSAgICAgcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCwKKwkJCQkJCSAgICAgJnJlZzE2KTsKKwkJCQlDb25maWd1cmF0aW9uID0gbGUyY3B1MTYocmVnMTYpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJSZWFkIChIb3N0IFBDSS10by1QQ0kgQnJpZGdlIExpbmsgQ29udHJvbCBSZWdpc3Rlcikgb2Zmc2V0IDB4JXggPSAweCV4XG4iLAorCQkJCQkgIHBBZC0+SG9zdExua0N0cmxPZmZzZXQsCisJCQkJCSAgQ29uZmlndXJhdGlvbikpOworCQkJCXBBZC0+SG9zdExua0N0cmxDb25maWd1cmF0aW9uID0KKwkJCQkgICAgKENvbmZpZ3VyYXRpb24gJiAweDEwMyk7CisJCQkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7CisJCQkJQ29uZmlndXJhdGlvbiB8PSAoMHgwKTsKKworCQkJCXN3aXRjaCAocE9iai0+RGV2aWNlSUQpIHsKKyNpZmRlZiBSVDI4NjAKKwkJCQljYXNlIE5JQzI4NjBfUENJZV9ERVZJQ0VfSUQ6CisJCQkJY2FzZSBOSUMyNzkwX1BDSWVfREVWSUNFX0lEOgorCQkJCQliQ2hhbmdlID0gVFJVRTsKKwkJCQkJYnJlYWs7CisjZW5kaWYgLyogUlQyODYwIC8vICovCisjaWZkZWYgUlQzMDkwCisJCQkJY2FzZSBOSUMzMDkwX1BDSWVfREVWSUNFX0lEOgorCQkJCWNhc2UgTklDMzA5MV9QQ0llX0RFVklDRV9JRDoKKwkJCQljYXNlIE5JQzMwOTJfUENJZV9ERVZJQ0VfSUQ6CisJCQkJCWlmIChiRmluZEludGVsID09IEZBTFNFKQorCQkJCQkJYkNoYW5nZSA9IFRSVUU7CisJCQkJCWJyZWFrOworI2VuZGlmIC8qIFJUMzA5MCAvLyAqLworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlmIChiQ2hhbmdlKSB7CisJCQkJCXJlZzE2ID0gY3B1MmxlMTYoQ29uZmlndXJhdGlvbik7CisJCQkJCXBjaV93cml0ZV9jb25maWdfd29yZChwT2JqLT4KKwkJCQkJCQkgICAgICBwYXJlbnRfcGNpX2RldiwKKwkJCQkJCQkgICAgICBwQWQtPgorCQkJCQkJCSAgICAgIEhvc3RMbmtDdHJsT2Zmc2V0LAorCQkJCQkJCSAgICAgIHJlZzE2KTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgKCJXcml0ZSAoSG9zdCBQQ0ktdG8tUENJIEJyaWRnZSBMaW5rIENvbnRyb2wgUmVnaXN0ZXIpIG9mZnNldCAweCV4ID0gMHgleFxuIiwKKwkJCQkJCSAgcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCwKKwkJCQkJCSAgQ29uZmlndXJhdGlvbikpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCA9IDA7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJCSAoIiVzOiBjYW5ub3QgZmluZCBQQ0ktdG8tUENJIEJyaWRnZSBQQ0kgRXhwcmVzcyBDYXBhYmlsaXR5IVxuIiwKKwkJCQkJICBfX2Z1bmNfXykpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcEFkLT5STG5rQ3RybE9mZnNldCA9IDA7CisJCXBBZC0+SG9zdExua0N0cmxPZmZzZXQgPSAwOworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIiVzOiBjYW5ub3QgZmluZCBSYWxpbmsgUENJZSBEZXZpY2UncyBQQ0kgRXhwcmVzcyBDYXBhYmlsaXR5IVxuIiwKKwkJCSAgX19mdW5jX18pKTsKKwl9CisKKwlpZiAoYkZpbmRJbnRlbCA9PSBGQUxTRSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkRvZXNuJ3QgZmluZCBJbnRlbCBQQ0kgaG9zdCBjb250cm9sbGVyLiBcbiIpKTsKKwkJLyogRG9lc24ndCBzd2l0Y2ggTDAsIEwxLCBTbyBzZXQgUENJZVBvd2VyU2F2ZUxldmVsIHRvIDB4ZmYgKi8KKwkJcEFkLT5QQ0llUG93ZXJTYXZlTGV2ZWwgPSAweGZmOworCQlpZiAoKHBBZC0+Ukxua0N0cmxPZmZzZXQgIT0gMCkKKyNpZmRlZiBSVDMwOTAKKwkJICAgICYmICgocE9iai0+RGV2aWNlSUQgPT0gTklDMzA5MF9QQ0llX0RFVklDRV9JRCkKKwkJCXx8IChwT2JqLT5EZXZpY2VJRCA9PSBOSUMzMDkxX1BDSWVfREVWSUNFX0lEKQorCQkJfHwgKHBPYmotPkRldmljZUlEID09IE5JQzMwOTJfUENJZV9ERVZJQ0VfSUQpKQorI2VuZGlmIC8qIFJUMzA5MCAvLyAqLworCQkgICAgKSB7CisJCQlwY2lfcmVhZF9jb25maWdfd29yZChwT2JqLT5wY2lfZGV2LCBwQWQtPlJMbmtDdHJsT2Zmc2V0LAorCQkJCQkgICAgICZyZWcxNik7CisJCQlDb25maWd1cmF0aW9uID0gbGUyY3B1MTYocmVnMTYpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiUmVhZCAoUmFsaW5rIDMweHggUENJZSBMaW5rIENvbnRyb2wgUmVnaXN0ZXIpIG9mZnNldCAweCV4ID0gMHgleFxuIiwKKwkJCQkgIHBBZC0+Ukxua0N0cmxPZmZzZXQsIENvbmZpZ3VyYXRpb24pKTsKKwkJCXBBZC0+Ukxua0N0cmxDb25maWd1cmF0aW9uID0gKENvbmZpZ3VyYXRpb24gJiAweDEwMyk7CisJCQlDb25maWd1cmF0aW9uICY9IDB4ZmVmYzsKKwkJCUNvbmZpZ3VyYXRpb24gfD0gKDB4MCk7CisJCQlyZWcxNiA9IGNwdTJsZTE2KENvbmZpZ3VyYXRpb24pOworCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBPYmotPnBjaV9kZXYsCisJCQkJCSAgICAgIHBBZC0+Ukxua0N0cmxPZmZzZXQsIHJlZzE2KTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIldyaXRlIChSYWxpbmsgUENJZSBMaW5rIENvbnRyb2wgUmVnaXN0ZXIpICBvZmZzZXQgMHgleCA9IDB4JXhcbiIsCisJCQkJICBwb3MgKyBQQ0lfRVhQX0xOS0NUTCwgQ29uZmlndXJhdGlvbikpOworCQl9CisJfQorfQorCit2b2lkIFJUTVBGaW5kSG9zdFBDSURldihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJdTE2IHJlZzE2OworCXU4IHJlZzg7CisJdTMyIERldkZuOworCXN0cnVjdCBwY2lfZGV2ICpwUGNpX2RldjsKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqOworCisJcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisKKwlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKQorCQlyZXR1cm47CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcy49PT0+XG4iLCBfX2Z1bmNfXykpOworCisJcE9iai0+cGFyZW50X3BjaV9kZXYgPSBOVUxMOworCWlmIChwT2JqLT5wY2lfZGV2LT5idXMtPnBhcmVudCkgeworCQlmb3IgKERldkZuID0gMDsgRGV2Rm4gPCAyNTU7IERldkZuKyspIHsKKwkJCXBQY2lfZGV2ID0KKwkJCSAgICBwY2lfZ2V0X3Nsb3QocE9iai0+cGNpX2Rldi0+YnVzLT5wYXJlbnQsIERldkZuKTsKKwkJCWlmIChwUGNpX2RldikgeworCQkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBQY2lfZGV2LCBQQ0lfQ0xBU1NfREVWSUNFLAorCQkJCQkJICAgICAmcmVnMTYpOworCQkJCXJlZzE2ID0gbGUyY3B1MTYocmVnMTYpOworCQkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBQY2lfZGV2LCBQQ0lfQ0JfQ0FSRF9CVVMsCisJCQkJCQkgICAgICZyZWc4KTsKKwkJCQlpZiAoKHJlZzE2ID09IFBDSV9DTEFTU19CUklER0VfUENJKQorCQkJCSAgICAmJiAocmVnOCA9PSBwT2JqLT5wY2lfZGV2LT5idXMtPm51bWJlcikpIHsKKwkJCQkJcE9iai0+cGFyZW50X3BjaV9kZXYgPSBwUGNpX2RldjsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCQlMZXZlbCA9IFJFU1RPUkVfSEFMVCA6IFJlc3RvcmUgUENJIGhvc3QgYW5kIFJhbGluayBQQ0llIExpbmsgQ29udHJvbCBmaWVsZCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4KKwkJTGV2ZWwgPSBPdGhlciBWYWx1ZSA6IFJlc3RvcmUgZnJvbSBkb3QxMSBwb3dlciBzYXZlIG9yIHJhZGlvIG9mZiBzdGF0dXMuIEFuZCBmb3JjZSBQQ0kgaG9zdCBMaW5rIENvbnRyb2wgZmllbGRzIHRvIDB4MQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggTGV2ZWwpCit7CisJdTE2IFBDSWVQb3dlclNhdmVMZXZlbCwgcmVnMTY7CisJdTE2IENvbmZpZ3VyYXRpb247CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iajsKKworCXBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkKKwkJcmV0dXJuOworCisjaWZkZWYgUlQyODYwCisJaWYgKCEoKHBPYmotPkRldmljZUlEID09IE5JQzI4NjBfUENJZV9ERVZJQ0VfSUQpCisJICAgICAgfHwgKHBPYmotPkRldmljZUlEID09IE5JQzI3OTBfUENJZV9ERVZJQ0VfSUQpKSkKKwkJcmV0dXJuOworI2VuZGlmIC8qIFJUMjg2MCAvLyAqLworCS8qIENoZWNrIFBTQ29udHJvbCBDb25maWd1cmF0aW9uICovCisJaWYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBGQUxTRSkKKwkJcmV0dXJuOworCisJLyozMDkwIHdpbGwgbm90IGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBjb2Rlcy4gKi8KKwkvKiBDaGVjayBpbnRlcmZhY2UgOiBJZiBub3QgUENJZSBpbnRlcmZhY2UsIHJldHVybi4gKi8KKworI2lmZGVmIFJUMzA5MAorCWlmICgocE9iai0+RGV2aWNlSUQgPT0gTklDMzA5MF9QQ0llX0RFVklDRV9JRCkKKwkgICAgfHwgKHBPYmotPkRldmljZUlEID09IE5JQzMwOTFfUENJZV9ERVZJQ0VfSUQpCisJICAgIHx8IChwT2JqLT5EZXZpY2VJRCA9PSBOSUMzMDkyX1BDSWVfREVWSUNFX0lEKSkKKwkJcmV0dXJuOworI2VuZGlmIC8qIFJUMzA5MCAvLyAqLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMuPT09PlxuIiwgX19mdW5jX18pKTsKKwlQQ0llUG93ZXJTYXZlTGV2ZWwgPSBwQWQtPlBDSWVQb3dlclNhdmVMZXZlbDsKKwlpZiAoKFBDSWVQb3dlclNhdmVMZXZlbCAmIDB4ZmYpID09IDB4ZmYpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicmV0dXJuICBcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwT2JqLT5wYXJlbnRfcGNpX2RldiAmJiAocEFkLT5Ib3N0TG5rQ3RybE9mZnNldCAhPSAwKSkgeworCQlQQ0lfUkVHX1JFQURfV09SRChwT2JqLT5wYXJlbnRfcGNpX2RldiwgcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCwKKwkJCQkgIENvbmZpZ3VyYXRpb24pOworCQlpZiAoKENvbmZpZ3VyYXRpb24gIT0gMCkgJiYgKENvbmZpZ3VyYXRpb24gIT0gMHhGRkZGKSkgeworCQkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7CisJCQkvKiBJZiBjYWxsIGZyb20gaW50ZXJmYWNlIGRvd24sIHJlc3RvcmUgdG8gb3JnaW5pYWwgc2V0dGluZy4gKi8KKwkJCWlmIChMZXZlbCA9PSBSRVNUT1JFX0NMT1NFKSB7CisJCQkJQ29uZmlndXJhdGlvbiB8PSBwQWQtPkhvc3RMbmtDdHJsQ29uZmlndXJhdGlvbjsKKwkJCX0gZWxzZQorCQkJCUNvbmZpZ3VyYXRpb24gfD0gMHgwOworCQkJUENJX1JFR19XSVJURV9XT1JEKHBPYmotPnBhcmVudF9wY2lfZGV2LAorCQkJCQkgICBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LAorCQkJCQkgICBDb25maWd1cmF0aW9uKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlJlc3RvcmUgUENJIGhvc3QgOiBvZmZzZXQgMHgleCA9IDB4JXhcbiIsCisJCQkJICBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKSk7CisJCX0gZWxzZQorCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiUmVzdG9yZSBQQ0kgaG9zdCA6IFBDSV9SRUdfUkVBRF9XT1JEIGZhaWxlZCAoQ29uZmlndXJhdGlvbiA9IDB4JXgpXG4iLAorCQkJCSAgQ29uZmlndXJhdGlvbikpOworCX0KKworCWlmIChwT2JqLT5wY2lfZGV2ICYmIChwQWQtPlJMbmtDdHJsT2Zmc2V0ICE9IDApKSB7CisJCVBDSV9SRUdfUkVBRF9XT1JEKHBPYmotPnBjaV9kZXYsIHBBZC0+Ukxua0N0cmxPZmZzZXQsCisJCQkJICBDb25maWd1cmF0aW9uKTsKKwkJaWYgKChDb25maWd1cmF0aW9uICE9IDApICYmIChDb25maWd1cmF0aW9uICE9IDB4RkZGRikpIHsKKwkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOworCQkJLyogSWYgY2FsbCBmcm9tIGludGVyZmFjZSBkb3duLCByZXN0b3JlIHRvIG9yZ2luaWFsIHNldHRpbmcuICovCisJCQlpZiAoTGV2ZWwgPT0gUkVTVE9SRV9DTE9TRSkKKwkJCQlDb25maWd1cmF0aW9uIHw9IHBBZC0+Ukxua0N0cmxDb25maWd1cmF0aW9uOworCQkJZWxzZQorCQkJCUNvbmZpZ3VyYXRpb24gfD0gMHgwOworCQkJUENJX1JFR19XSVJURV9XT1JEKHBPYmotPnBjaV9kZXYsIHBBZC0+Ukxua0N0cmxPZmZzZXQsCisJCQkJCSAgIENvbmZpZ3VyYXRpb24pOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiUmVzdG9yZSBSYWxpbmsgOiBvZmZzZXQgMHgleCA9IDB4JXhcbiIsCisJCQkJICBwQWQtPlJMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKSk7CisJCX0gZWxzZQorCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiUmVzdG9yZSBSYWxpbmsgOiBQQ0lfUkVHX1JFQURfV09SRCBmYWlsZWQgKENvbmZpZ3VyYXRpb24gPSAweCV4KVxuIiwKKwkJCQkgIENvbmZpZ3VyYXRpb24pKTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA8PT09XG4iLCBfX2Z1bmNfXykpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKwkJTWF4IDogbGltaXQgSG9zdCBQQ0kgYW5kIFJhbGluayBQQ0llIGRldmljZSdzIExJTksgQ09OVFJPTCBmaWVsZCdzIHZhbHVlLgorCQlCZWNhdXNlIG5vdyBmcmVxdWVudGx5IHNldCBvdXIgZGV2aWNlIHRvIG1vZGUgMSBvciBtb2RlIDMgd2lsbCBjYXVzZSBwcm9ibGVtLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVE1QUENJZUxpbmtDdHJsU2V0dGluZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHUxNiBNYXgpCit7CisJdTE2IFBDSWVQb3dlclNhdmVMZXZlbCwgcmVnMTY7CisJdTE2IENvbmZpZ3VyYXRpb247CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iajsKKworCXBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkKKwkJcmV0dXJuOworCisjaWZkZWYgUlQyODYwCisJaWYgKCEoKHBPYmotPkRldmljZUlEID09IE5JQzI4NjBfUENJZV9ERVZJQ0VfSUQpCisJICAgICAgfHwgKHBPYmotPkRldmljZUlEID09IE5JQzI3OTBfUENJZV9ERVZJQ0VfSUQpKSkKKwkJcmV0dXJuOworI2VuZGlmIC8qIFJUMjg2MCAvLyAqLworCS8qIENoZWNrIFBTQ29udHJvbCBDb25maWd1cmF0aW9uICovCisJaWYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBGQUxTRSkKKwkJcmV0dXJuOworCisJLyogQ2hlY2sgaW50ZXJmYWNlIDogSWYgbm90IFBDSWUgaW50ZXJmYWNlLCByZXR1cm4uICovCisJLypCbG9jayAzMDkwIHRvIGVudGVyIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gKi8KKworI2lmZGVmIFJUMzA5MAorCWlmICgocE9iai0+RGV2aWNlSUQgPT0gTklDMzA5MF9QQ0llX0RFVklDRV9JRCkKKwkgICAgfHwgKHBPYmotPkRldmljZUlEID09IE5JQzMwOTFfUENJZV9ERVZJQ0VfSUQpCisJICAgIHx8IChwT2JqLT5EZXZpY2VJRCA9PSBOSUMzMDkyX1BDSWVfREVWSUNFX0lEKSkKKwkJcmV0dXJuOworI2VuZGlmIC8qIFJUMzA5MCAvLyAqLworCWlmICghUlRNUF9URVNUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfSU5GTywKKwkJCSAoIlJUTVBQQ0llUG93ZXJMaW5rQ3RybCByZXR1cm4gb24gZlJUTVBfUFNfQ0FOX0dPX1NMRUVQIGZsYWdcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzPT09PlxuIiwgX19mdW5jX18pKTsKKwlQQ0llUG93ZXJTYXZlTGV2ZWwgPSBwQWQtPlBDSWVQb3dlclNhdmVMZXZlbDsKKwlpZiAoKFBDSWVQb3dlclNhdmVMZXZlbCAmIDB4ZmYpID09IDB4ZmYpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicmV0dXJuICBcbiIpKTsKKwkJcmV0dXJuOworCX0KKwlQQ0llUG93ZXJTYXZlTGV2ZWwgPSBQQ0llUG93ZXJTYXZlTGV2ZWwgPj4gNjsKKworCS8qIFNraXAgbm9uLWV4aXN0IGRlaWNlIHJpZ2h0IGF3YXkgKi8KKwlpZiAocE9iai0+cGFyZW50X3BjaV9kZXYgJiYgKHBBZC0+SG9zdExua0N0cmxPZmZzZXQgIT0gMCkpIHsKKwkJUENJX1JFR19SRUFEX1dPUkQocE9iai0+cGFyZW50X3BjaV9kZXYsIHBBZC0+SG9zdExua0N0cmxPZmZzZXQsCisJCQkJICBDb25maWd1cmF0aW9uKTsKKwkJc3dpdGNoIChQQ0llUG93ZXJTYXZlTGV2ZWwpIHsKKwkJY2FzZSAwOgorCQkJLyogU2V0IGIwIGFuZCBiMSBvZiBMaW5rQ29udHJvbCAoYm90aCAyODkyIGFuZCBQQ0llIGJyaWRnZSkgdG8gMDAgKi8KKwkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCS8qIFNldCBiMCBhbmQgYjEgb2YgTGlua0NvbnRyb2wgKGJvdGggMjg5MiBhbmQgUENJZSBicmlkZ2UpIHRvIDAxICovCisJCQlDb25maWd1cmF0aW9uICY9IDB4ZmVmYzsKKwkJCUNvbmZpZ3VyYXRpb24gfD0gMHgxOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCS8qICBTZXQgYjAgYW5kIGIxIG9mIExpbmtDb250cm9sIChib3RoIDI4OTIgYW5kIFBDSWUgYnJpZGdlKSB0byAxMSAqLworCQkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7CisJCQlDb25maWd1cmF0aW9uIHw9IDB4MzsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQkvKiBTZXQgYjAgYW5kIGIxIG9mIExpbmtDb250cm9sIChib3RoIDI4OTIgYW5kIFBDSWUgYnJpZGdlKSB0byAxMSBhbmQgYml0IDggb2YgTGlua0NvbnRyb2wgb2YgMjg5MiB0byAxICovCisJCQlDb25maWd1cmF0aW9uICY9IDB4ZmVmYzsKKwkJCUNvbmZpZ3VyYXRpb24gfD0gMHgxMDM7CisJCQlicmVhazsKKwkJfQorCQlQQ0lfUkVHX1dJUlRFX1dPUkQocE9iai0+cGFyZW50X3BjaV9kZXYsIHBBZC0+SG9zdExua0N0cmxPZmZzZXQsCisJCQkJICAgQ29uZmlndXJhdGlvbik7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiV3JpdGUgUENJIGhvc3Qgb2Zmc2V0IDB4JXggPSAweCV4XG4iLAorCQkJICBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKSk7CisJfQorCisJaWYgKHBPYmotPnBjaV9kZXYgJiYgKHBBZC0+Ukxua0N0cmxPZmZzZXQgIT0gMCkpIHsKKwkJLyogZmlyc3QgMjg5MiBjaGlwIG5vdCBhbGxvdyB0byBmcmVxdWVudGx5IHNldCBtb2RlIDMuIHdpbGwgY2F1c2UgaGFuZyBwcm9ibGVtLiAqLworCQlpZiAoUENJZVBvd2VyU2F2ZUxldmVsID4gTWF4KQorCQkJUENJZVBvd2VyU2F2ZUxldmVsID0gTWF4OworCisJCVBDSV9SRUdfUkVBRF9XT1JEKHBPYmotPnBjaV9kZXYsIHBBZC0+Ukxua0N0cmxPZmZzZXQsCisJCQkJICBDb25maWd1cmF0aW9uKTsKKwkJc3dpdGNoIChQQ0llUG93ZXJTYXZlTGV2ZWwpIHsKKwkJY2FzZSAwOgorCQkJLyogTm8gUENJIHBvd2VyIHNhZmUgKi8KKwkJCS8qIFNldCBiMCBhbmQgYjEgb2YgTGlua0NvbnRyb2wgKGJvdGggMjg5MiBhbmQgUENJZSBicmlkZ2UpIHRvIDAwIC4gKi8KKwkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCS8qICBMMCAqLworCQkJLyogU2V0IGIwIGFuZCBiMSBvZiBMaW5rQ29udHJvbCAoYm90aCAyODkyIGFuZCBQQ0llIGJyaWRnZSkgdG8gMDEgLiAqLworCQkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7CisJCQlDb25maWd1cmF0aW9uIHw9IDB4MTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQkvKiBMMCBhbmQgTDEgKi8KKwkJCS8qICBTZXQgYjAgYW5kIGIxIG9mIExpbmtDb250cm9sIChib3RoIDI4OTIgYW5kIFBDSWUgYnJpZGdlKSB0byAxMSAqLworCQkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7CisJCQlDb25maWd1cmF0aW9uIHw9IDB4MzsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQkvKiBMMCAsIEwxIGFuZCBjbG9jayBtYW5hZ2VtZW50LiAqLworCQkJLyogU2V0IGIwIGFuZCBiMSBvZiBMaW5rQ29udHJvbCAoYm90aCAyODkyIGFuZCBQQ0llIGJyaWRnZSkgdG8gMTEgYW5kIGJpdCA4IG9mIExpbmtDb250cm9sIG9mIDI4OTIgdG8gMSAqLworCQkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7CisJCQlDb25maWd1cmF0aW9uIHw9IDB4MTAzOworCQkJcEFkLT5iUENJY2xrT2ZmID0gVFJVRTsKKwkJCWJyZWFrOworCQl9CisJCVBDSV9SRUdfV0lSVEVfV09SRChwT2JqLT5wY2lfZGV2LCBwQWQtPlJMbmtDdHJsT2Zmc2V0LAorCQkJCSAgIENvbmZpZ3VyYXRpb24pOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIldyaXRlIFJhbGluayBkZXZpY2UgOiBvZmZzZXQgMHgleCA9IDB4JXhcbiIsCisJCQkgIHBBZC0+Ukxua0N0cmxPZmZzZXQsIENvbmZpZ3VyYXRpb24pKTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QUENJZVBvd2VyTGlua0N0cmwgPD09PT09PT09PT09PT09XG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQkxLiBXcml0ZSBhIFBDSSByZWdpc3RlciBmb3IgcnQzMHh4IHBvd2VyIHNvbHV0aW9uIDMKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlRNUHJ0M3hTZXRQQ0llUG93ZXJMaW5rQ3RybChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisKKwl1bnNpZ25lZCBsb25nIEhvc3RDb25maWd1cmF0aW9uID0gMDsKKwl1bnNpZ25lZCBsb25nIENvbmZpZ3VyYXRpb247CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iajsKKwlpbnQgcG9zOworCXUxNiByZWcxNjsKKworCXBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJREJHUFJJTlQoUlRfREVCVUdfSU5GTywKKwkJICgiUlRNUHJ0M3hTZXRQQ0llUG93ZXJMaW5rQ3RybC49PT0+ICVseFxuIiwKKwkJICBwQWQtPlN0YUNmZy5QU0NvbnRyb2wud29yZCkpOworCisJLyogQ2hlY2sgUFNDb250cm9sIENvbmZpZ3VyYXRpb24gKi8KKwlpZiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IEZBTFNFKQorCQlyZXR1cm47CisJUlRNUEZpbmRIb3N0UENJRGV2KHBBZCk7CisJaWYgKHBPYmotPnBhcmVudF9wY2lfZGV2KSB7CisJCS8qIEZpbmQgUENJLXRvLVBDSSBCcmlkZ2UgRXhwcmVzcyBDYXBhYmlsaXR5IE9mZnNldCAqLworCQlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBPYmotPnBhcmVudF9wY2lfZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CisKKwkJaWYgKHBvcyAhPSAwKSB7CisJCQlwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0ID0gcG9zICsgUENJX0VYUF9MTktDVEw7CisJCX0KKwkJLyogSWYgY29uZmlndXJhcmVkIHRvIHR1cm4gb24gTDEuICovCisJCUhvc3RDb25maWd1cmF0aW9uID0gMDsKKwkJaWYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhGb3JjZUFTUE1UZXN0ID09IDEpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkVudGVyLFBTTSA6IEZvcmNlIEFTUE0gXG4iKSk7CisKKwkJCS8qIFNraXAgbm9uLWV4aXN0IGRlaWNlIHJpZ2h0IGF3YXkgKi8KKwkJCWlmICgocEFkLT5Ib3N0TG5rQ3RybE9mZnNldCAhPSAwKSkgeworCQkJCVBDSV9SRUdfUkVBRF9XT1JEKHBPYmotPnBhcmVudF9wY2lfZGV2LAorCQkJCQkJICBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LAorCQkJCQkJICBIb3N0Q29uZmlndXJhdGlvbik7CisJCQkJLyogUHJlcGFyZSBDb25maWd1cmF0aW9uIHRvIHdyaXRlIHRvIEhvc3QgKi8KKwkJCQlIb3N0Q29uZmlndXJhdGlvbiB8PSAweDM7CisJCQkJUENJX1JFR19XSVJURV9XT1JEKHBPYmotPnBhcmVudF9wY2lfZGV2LAorCQkJCQkJICAgcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCwKKwkJCQkJCSAgIEhvc3RDb25maWd1cmF0aW9uKTsKKwkJCQlwQWQtPlJ0M3h4SG9zdExpbmtDdHJsID0gSG9zdENvbmZpZ3VyYXRpb247CisJCQkJLyogQmVjYXVzZSBpbiBydDMweHhGb3JjZUFTUE1UZXN0IE1vZGUsIEZvcmNlIHR1cm4gb24gTDBzLCBMMS4gKi8KKwkJCQkvKiBGaXggSG9zdENvbmZpZ3VyYXRpb24gYml0MDoxID0gMHgzIGZvciBsYXRlciB1c2UuICovCisJCQkJSG9zdENvbmZpZ3VyYXRpb24gPSAweDM7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIlBTTSA6IEZvcmNlIEFTUE0gOiAiCisJCQkJCSAgIkhvc3QgZGV2aWNlIEwxL0wwcyBWYWx1ZSA9ICAweCVseFxuIiwKKwkJCQkJICBIb3N0Q29uZmlndXJhdGlvbikpOworCQkJfQorCQl9IGVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhGb2xsb3dIb3N0QVNQTSA9PQorCQkJICAgMSkgeworCisJCQkvKiBTa2lwIG5vbi1leGlzdCBkZWljZSByaWdodCBhd2F5ICovCisJCQlpZiAoKHBBZC0+SG9zdExua0N0cmxPZmZzZXQgIT0gMCkpIHsKKwkJCQlQQ0lfUkVHX1JFQURfV09SRChwT2JqLT5wYXJlbnRfcGNpX2RldiwKKwkJCQkJCSAgcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCwKKwkJCQkJCSAgSG9zdENvbmZpZ3VyYXRpb24pOworCQkJCXBBZC0+UnQzeHhIb3N0TGlua0N0cmwgPSBIb3N0Q29uZmlndXJhdGlvbjsKKwkJCQlIb3N0Q29uZmlndXJhdGlvbiAmPSAweDM7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIlBTTSA6IEZvbGxvdyBIb3N0IEFTUE0gOiAiCisJCQkJCSAgIkhvc3QgZGV2aWNlIEwxL0wwcyBWYWx1ZSA9ICAweCVseFxuIiwKKwkJCQkJICBIb3N0Q29uZmlndXJhdGlvbikpOworCQkJfQorCQl9CisJfQorCS8qIFByZXBhcmUgdG8gd3JpdGUgUmFsaW5rIHNldHRpbmcuICovCisJLyogRmluZCBSYWxpbmsgUENJZSBEZXZpY2UncyBFeHByZXNzIENhcGFiaWxpdHkgT2Zmc2V0ICovCisJcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwT2JqLT5wY2lfZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CisKKwlpZiAocG9zICE9IDApIHsKKwkJLyogUmFsaW5rIFBDSWUgRGV2aWNlJ3MgTGluayBDb250cm9sIFJlZ2lzdGVyIE9mZnNldCAqLworCQlwQWQtPlJMbmtDdHJsT2Zmc2V0ID0gcG9zICsgUENJX0VYUF9MTktDVEw7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBPYmotPnBjaV9kZXYsIHBBZC0+Ukxua0N0cmxPZmZzZXQsCisJCQkJICAgICAmcmVnMTYpOworCQlDb25maWd1cmF0aW9uID0gbGUyY3B1MTYocmVnMTYpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlJlYWQgKFJhbGluayBQQ0llIExpbmsgQ29udHJvbCBSZWdpc3RlcikgIgorCQkJICAib2Zmc2V0IDB4JXggPSAweCVseFxuIiwKKwkJCSAgcEFkLT5STG5rQ3RybE9mZnNldCwgQ29uZmlndXJhdGlvbikpOworCQlDb25maWd1cmF0aW9uIHw9IDB4MTAwOworCQlpZiAoKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhGb2xsb3dIb3N0QVNQTSA9PSAxKQorCQkgICAgfHwgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhGb3JjZUFTUE1UZXN0ID09IDEpKSB7CisJCQlzd2l0Y2ggKEhvc3RDb25maWd1cmF0aW9uKSB7CisJCQljYXNlIDA6CisJCQkJQ29uZmlndXJhdGlvbiAmPSAweGZmZmZmZmM7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJQ29uZmlndXJhdGlvbiAmPSAweGZmZmZmZmM7CisJCQkJQ29uZmlndXJhdGlvbiB8PSAweDE7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJQ29uZmlndXJhdGlvbiAmPSAweGZmZmZmZmM7CisJCQkJQ29uZmlndXJhdGlvbiB8PSAweDI7CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJQ29uZmlndXJhdGlvbiB8PSAweDM7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmVnMTYgPSBjcHUybGUxNihDb25maWd1cmF0aW9uKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBPYmotPnBjaV9kZXYsIHBBZC0+Ukxua0N0cmxPZmZzZXQsCisJCQkJICAgICAgcmVnMTYpOworCQlwQWQtPlJ0M3h4UmFsaW5rTGlua0N0cmwgPSBDb25maWd1cmF0aW9uOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlBTTSA6V3JpdGUgUmFsaW5rIGRldmljZSBMMS9MMHMgVmFsdWUgPSAgMHglbHhcbiIsCisJCQkgIENvbmZpZ3VyYXRpb24pKTsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfSU5GTywKKwkJICgiUFNNIDpSVE1QcnQzeFNldFBDSWVQb3dlckxpbmtDdHJsIDw9PT09PT09PT09PT09PVxuIikpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydDI4NjAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnQyODYwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMjhmZTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydDI4NjAuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9fUlQyODYwX0hfXwotI2RlZmluZSBfX1JUMjg2MF9IX18KLQotI2RlZmluZSBSVDI4eHhfQ0hJUF9OQU1FCSJSVDI4NjAiCi0KLSNkZWZpbmUgVFhJTkZPX1NJWkUgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFRYUEFERElOR19TSVpFICAgICAgCSAgMAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLSBFRVBST00gUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLwotI2RlZmluZSBSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIG9mZnNldCwgdmFyKQkJXAotCXZhciA9IFJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIG9mZnNldCkKLQotI2RlZmluZSBSVDI4eHhfRUVQUk9NX1dSSVRFMTYocEFkLCBvZmZzZXQsIHZhcikJCVwKLQlSVE1QX0VFUFJPTV9XUklURTE2KHBBZCwgb2Zmc2V0LCB2YXIpCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tIFRBU0svVEhSRUFEIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSNkZWZpbmUgUlQyOFhYX1RBU0tfVEhSRUFEX0lOSVQocEFkLCBTdGF0dXMpCQlcCi0JaW5pdF90aHJlYWRfdGFzayhwQWQpOyBOSUNJbml0VHhSeFJpbmdBbmRCYWNrbG9nUXVldWUocEFkKTsJXAotCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0KLS8qIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAqLwotI2RlZmluZSBJUlFfSEFORExFX1RZUEUgIGlycXJldHVybl90Ci0KLUlSUV9IQU5ETEVfVFlQRQotcnQyODYwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpOwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLSBGcmltd2FyZSBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCi0jZGVmaW5lIFJUMjhYWF9XUklURV9GSVJNV0FSRShfcEFkLCBfcEZ3SW1hZ2UsIF9Gd0xlbikJCQkJXAotCWRvewkJCQkJCQkJCQkJCQkJCQlcCi0JCVVMT05HCV9pLCBfZmlybTsJCQkJCQkJCQkJCVwKLQkJUlRNUF9JT19XUklURTMyKF9wQWQsIFBCRl9TWVNfQ1RSTCwgMHgxMDAwMCk7CQkJCVwKLQkJCQkJCQkJCQkJCQkJCQkJXAotCQlmb3IoX2k9MDsgX2k8X0Z3TGVuOyBfaSs9NCkJCQkJCQkJCQlcCi0JCXsJCQkJCQkJCQkJCQkJCQlcCi0JCQlfZmlybSA9IF9wRndJbWFnZVtfaV0gKwkJCQkJCQkJCVwKLQkJCSAgIChfcEZ3SW1hZ2VbX2krM10gPDwgMjQpICsJCQkJCQkJXAotCQkJICAgKF9wRndJbWFnZVtfaSsyXSA8PCAxNikgKwkJCQkJCQlcCi0JCQkgICAoX3BGd0ltYWdlW19pKzFdIDw8IDgpOwkJCQkJCQkJXAotCQkJUlRNUF9JT19XUklURTMyKF9wQWQsIEZJUk1XQVJFX0lNQUdFX0JBU0UgKyBfaSwgX2Zpcm0pOwlcCi0JCX0JCQkJCQkJCQkJCQkJCQlcCi0JCVJUTVBfSU9fV1JJVEUzMihfcEFkLCBQQkZfU1lTX0NUUkwsIDB4MDAwMDApOwkJCQlcCi0JCVJUTVBfSU9fV1JJVEUzMihfcEFkLCBQQkZfU1lTX0NUUkwsIDB4MDAwMDEpOwkJCQlcCi0JCQkJCQkJCQkJCQkJCQkJCVwKLQkJLyogaW5pdGlhbGl6ZSBCQlAgUi9XIGFjY2VzcyBhZ2VudCAqLwkJCQkJCVwKLQkJUlRNUF9JT19XUklURTMyKF9wQWQsIEgyTV9CQlBfQUdFTlQsIDApOwkJCQkJXAotCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgSDJNX01BSUxCT1hfQ1NSLCAwKTsJCQkJCVwKLQl9d2hpbGUoMCkKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0gVFggUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLwotI2RlZmluZSBSVDI4WFhfU1RBUlRfREVRVUVVRShwQWQsIFF1ZUlkeCwgaXJxRmxhZ3MpCQlkb3t9d2hpbGUoMCkKLSNkZWZpbmUgUlQyOFhYX1NUT1BfREVRVUVVRShwQWQsIFF1ZUlkeCwgaXJxRmxhZ3MpCQlkb3t9d2hpbGUoMCkKLQotCi0jZGVmaW5lIFJUMjhYWF9IQVNfRU5PVUdIX0ZSRUVfREVTQyhwQWQsIHBUeEJsaywgZnJlZU51bSwgcFBhY2tldCkgXAotCQkoKGZyZWVOdW0pID49IChVTE9ORykocFR4QmxrLT5Ub3RhbEZyYWdOdW0gKyBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpICsgMykpIC8qIHJvdWdoIGVzdGltYXRlIHdlIHdpbGwgdXNlIDMgbW9yZSBkZXNjcmlwdG9yLiAqLwotI2RlZmluZSBSVDI4WFhfUkVMRUFTRV9ERVNDX1JFU09VUkNFKHBBZCwgUXVlSWR4KQkJCQkJXAotCQlkb3t9d2hpbGUoMCkKLQotI2RlZmluZSBORUVEX1FVRVVFX0JBQ0tfRk9SX0FHRyhwQWQsIFF1ZUlkeCwgZnJlZU51bSwgX1R4RnJhbWVUeXBlKSBcCi0JCSgoKGZyZWVOdW0gIT0gKFRYX1JJTkdfU0laRS0xKSkgJiYgKHBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0uTnVtYmVyID09IDApKSB8fCAoZnJlZU51bTwzKSkKLQkJLy8oKChmcmVlTnVtKSAhPSAoVFhfUklOR19TSVpFLTEpKSAmJiAocEFkLT5UeFN3UXVldWVbUXVlSWR4XS5OdW1iZXIgPT0gMSAvKjAqLykpCi0KLQotI2RlZmluZSBIQUxfS2lja091dE1nbXRUeChfcEFkLCBfUXVlSWR4LCBfcFBhY2tldCwgX3BTcmNCdWZWQSwgX1NyY0J1ZkxlbikJXAotCQkJUnRtcFBDSU1nbXRLaWNrT3V0KF9wQWQsIF9RdWVJZHgsIF9wUGFja2V0LCBfcFNyY0J1ZlZBLCBfU3JjQnVmTGVuKQotCi0jZGVmaW5lIFJUTVBfUEtUX1RBSUxfUEFERElORyAwCi0KLSNkZWZpbmUgZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgJMAotCi0jZGVmaW5lIEhBTF9Xcml0ZVN1YlR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGJJc0xhc3QsIHBGcmVlTnVtYmVyKQlcCi0JCS8qIFJ0bXBQQ0lfV3JpdGVTdWJUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBiSXNMYXN0LCBwRnJlZU51bWJlcikqLwotCi0jZGVmaW5lIEhBTF9Xcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssYklzTGFzdCwgcEZyZWVOdW1iZXIpCVwKLQkJCVJ0bXBQQ0lfV3JpdGVTaW5nbGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBiSXNMYXN0LCBwRnJlZU51bWJlcikKLQotI2RlZmluZSBIQUxfV3JpdGVGcmFnVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhZ051bSwgcEZyZWVOdW1iZXIpIFwKLQkJCVJ0bXBQQ0lfV3JpdGVGcmFnVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhZ051bSwgcEZyZWVOdW1iZXIpCi0KLSNkZWZpbmUgSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLGZyYW1lTnVtLCBwRnJlZU51bWJlcikJXAotCQkJUnRtcFBDSV9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhbWVOdW0sIHBGcmVlTnVtYmVyKQotCi0jZGVmaW5lIEhBTF9GaW5hbFdyaXRlVHhSZXNvdXJjZShfcEFkLCBfcFR4QmxrLCBfVG90YWxNUERVU2l6ZSwgX0ZpcnN0VHhJZHgpCVwKLQkJCVJ0bXBQQ0lfRmluYWxXcml0ZVR4UmVzb3VyY2UoX3BBZCwgX3BUeEJsaywgX1RvdGFsTVBEVVNpemUsIF9GaXJzdFR4SWR4KQotCi0jZGVmaW5lIEhBTF9MYXN0VHhJZHgoX3BBZCwgX1F1ZUlkeCxfTGFzdFR4SWR4KSBcCi0JCQkvKlJ0bXBQQ0lEYXRhTGFzdFR4SWR4KF9wQWQsIF9RdWVJZHgsX0xhc3RUeElkeCkqLwotCi0jZGVmaW5lIEhBTF9LaWNrT3V0VHgoX3BBZCwgX3BUeEJsaywgX1F1ZUlkeCkJXAotCQkJUlRNUF9JT19XUklURTMyKChfcEFkKSwgVFhfQ1RYX0lEWDArKChfUXVlSWR4KSoweDEwKSwgKF9wQWQpLT5UeFJpbmdbKF9RdWVJZHgpXS5UeENwdUlkeCkKLS8qCQkJUnRtcFBDSURhdGFLaWNrT3V0KF9wQWQsIF9wVHhCbGssIF9RdWVJZHgpKi8KLQotI2RlZmluZSBIQUxfS2lja091dE51bGxGcmFtZVR4KF9wQWQsIF9RdWVJZHgsIF9wTnVsbEZyYW1lLCBfZnJhbWVMZW4pCVwKLQkJCU1pbmlwb3J0TU1SZXF1ZXN0KF9wQWQsIF9RdWVJZHgsIF9wTnVsbEZyYW1lLCBfZnJhbWVMZW4pCi0KLSNkZWZpbmUgR0VUX1RYUklOR19GUkVFTk8oX3BBZCwgX1F1ZUlkeCkgXAotCShfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhTd0ZyZWVJZHggPiBfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhDcHVJZHgpCT8gXAotCQkJKF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeFN3RnJlZUlkeCAtIF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeENwdUlkeCAtIDEpIFwKLQkJCSA6CVwKLQkJCShfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhTd0ZyZWVJZHggKyBUWF9SSU5HX1NJWkUgLSBfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhDcHVJZHggLSAxKTsKLQotCi0jZGVmaW5lIEdFVF9NR01UUklOR19GUkVFTk8oX3BBZCkgXAotCShfcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA+IF9wQWQtPk1nbXRSaW5nLlR4Q3B1SWR4KQk/IFwKLQkJCShfcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCAtIF9wQWQtPk1nbXRSaW5nLlR4Q3B1SWR4IC0gMSkgXAotCQkJIDoJXAotCQkJKF9wQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ICsgTUdNVF9SSU5HX1NJWkUgLSBfcEFkLT5NZ210UmluZy5UeENwdUlkeCAtIDEpOwotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tIFJYIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLy8gbm8gdXNlCi0jZGVmaW5lIFJUMjhYWF9SQ1ZfUEtUX0dFVF9JTklUKHBBZCkKLSNkZWZpbmUgUlQyOFhYX1JWX0FfQlVGX0VORAotLy8jZGVmaW5lIFJUMjhYWF9SVl9BTExfQlVGX0VORAotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tIEFTSUMgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLwotLy8gbm8gdXNlCi0jZGVmaW5lIFJUMjhYWF9ETUFfUE9TVF9XUklURShwQWQpCi0KLS8vIHJlc2V0IE1BQyBvZiBhIHN0YXRpb24gZW50cnkgdG8gMHgwMDAwMDAwMDAwMDAKLSNkZWZpbmUgUlQyOFhYX1NUQV9FTlRSWV9NQUNfUkVTRVQocEFkLCBXY2lkKQkJCQkJCVwKLQlBc2ljRGVsV2NpZFRhYihwQWQsIFdjaWQpOwotCi0vLyBhZGQgdGhpcyBlbnRyeSBpbnRvIEFTSUMgUlggV0NJRCBzZWFyY2ggdGFibGUKLSNkZWZpbmUgUlQyOFhYX1NUQV9FTlRSWV9BREQocEFkLCBwRW50cnkpCQkJCQkJCVwKLQlBc2ljVXBkYXRlUnhXQ0lEVGFibGUocEFkLCBwRW50cnktPkFpZCwgcEVudHJ5LT5BZGRyKTsKLQotLy8gcmVtb3ZlIFBhaXItd2lzZSBrZXkgbWF0ZXJpYWwgZnJvbSBBU0lDCi0jZGVmaW5lIFJUMjhYWF9TVEFfRU5UUllfS0VZX0RFTChwQWQsIEJzc0lkeCwgV2NpZCkJCQkJCVwKLQlBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShwQWQsIEJzc0lkeCwgKFVDSEFSKVdjaWQpOwotCi0vLyBhZGQgQ2xpZW50IHNlY3VyaXR5IGluZm9ybWF0aW9uIGludG8gQVNJQyBXQ0lEIHRhYmxlIGFuZCBJVkVJViB0YWJsZQotI2RlZmluZSBSVDI4WFhfU1RBX1NFQ1VSSVRZX0lORk9fQUREKHBBZCwgYXBpZHgsIEtleUlELCBwRW50cnkpCQlcCi0JUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIGFwaWR4LCBLZXlJRCwgCQkJCQlcCi0JCQkJCQkJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5DaXBoZXJBbGcsIHBFbnRyeSk7Ci0KLSNkZWZpbmUgUlQyOFhYX1NFQ1VSSVRZX0tFWV9BREQocEFkLCBhcGlkeCwgS2V5SUQsIHBFbnRyeSkJCQkJXAotCXsJLyogdXBkYXRlIHBhaXJ3aXNlIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUgKi8JXAotCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBhcGlkeCwgS2V5SUQsCQkJCQkJXAotCQkJCQkJICBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLkNpcGhlckFsZywJCVwKLQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5LZXksCQkJCVwKLQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5UeE1pYywJCQlcCi0JCQkJCQkgIHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJRF0uUnhNaWMpOwkJCVwKLQkJLyogdXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlICovCQkJXAotCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgYXBpZHgsIEtleUlELAkJCQkJXAotCQkJCQkJICBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLkNpcGhlckFsZywJCVwKLQkJCQkJCSAgcEVudHJ5KTsgfQotCi0KLS8vIEluc2VydCB0aGUgQkEgYml0bWFwIHRvIEFTSUMgZm9yIHRoZSBXY2lkIGVudHJ5Ci0jZGVmaW5lIFJUMjhYWF9BRERfQkFfU0VTU0lPTl9UT19BU0lDKF9wQWQsIF9BaWQsIF9USUQpCQkJCQlcCi0JCWRvewkJCQkJCQkJCQkJCQkJCQlcCi0JCQlVSU5UMzIJX1ZhbHVlID0gMCwgX09mZnNldDsJCQkJCQkJCQlcCi0JCQlfT2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIChfQWlkKSAqIEhXX1dDSURfRU5UUllfU0laRSArIDQ7CVwKLQkJCVJUTVBfSU9fUkVBRDMyKChfcEFkKSwgX09mZnNldCwgJl9WYWx1ZSk7CQkJCQlcCi0JCQlfVmFsdWUgfD0gKDB4MTAwMDA8PChfVElEKSk7CQkJCQkJCQlcCi0JCQlSVE1QX0lPX1dSSVRFMzIoKF9wQWQpLCBfT2Zmc2V0LCBfVmFsdWUpOwkJCQkJXAotCQl9d2hpbGUoMCkKLQotCi0vLyBSZW1vdmUgdGhlIEJBIGJpdG1hcCBmcm9tIEFTSUMgZm9yIHRoZSBXY2lkIGVudHJ5Ci0vLwkJYml0bWFwIGZpZWxkIHN0YXJ0cyBhdCAweDEwMDAwIGluIEFTSUMgV0NJRCB0YWJsZQotI2RlZmluZSBSVDI4WFhfREVMX0JBX1NFU1NJT05fRlJPTV9BU0lDKF9wQWQsIF9XY2lkLCBfVElEKQkJCQlcCi0JCWRvewkJCQkJCQkJCQkJCQkJCQlcCi0JCQlVSU5UMzIJX1ZhbHVlID0gMCwgX09mZnNldDsJCQkJCQkJCQlcCi0JCQlfT2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIChfV2NpZCkgKiBIV19XQ0lEX0VOVFJZX1NJWkUgKyA0OwlcCi0JCQlSVE1QX0lPX1JFQUQzMigoX3BBZCksIF9PZmZzZXQsICZfVmFsdWUpOwkJCQkJXAotCQkJX1ZhbHVlICY9ICh+KDB4MTAwMDAgPDwgKF9USUQpKSk7CQkJCQkJCVwKLQkJCVJUTVBfSU9fV1JJVEUzMigoX3BBZCksIF9PZmZzZXQsIF9WYWx1ZSk7CQkJXAotCQl9d2hpbGUoMCkKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLSBQQ0kvVVNCIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2RlZmluZSBSVDI4WFhfSEFORExFX0RFVl9BU1NJR04oaGFuZGxlLCBkZXZfcCkJCQkJXAotCSgoUE9TX0NPT0tJRSloYW5kbGUpLT5wY2lfZGV2ID0gZGV2X3A7Ci0KLS8vIHNldCBkcml2ZXIgZGF0YQotI2RlZmluZSBSVDI4WFhfRFJWREFUQV9TRVQoX2EpCQkJcGNpX3NldF9kcnZkYXRhKF9hLCBuZXRfZGV2KTsKLQotI2RlZmluZSBSVDI4WFhfVU5NQVAoKQkJCQkJCQkJCQlcCi17CWlmIChuZXRfZGV2LT5iYXNlX2FkZHIpCXsJCQkJCQkJCVwKLQkJaW91bm1hcCgodm9pZCAqKShuZXRfZGV2LT5iYXNlX2FkZHIpKTsJCQkJXAotCQlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KGRldl9wLCAwKSwJXAotCQkJCQkJCXBjaV9yZXNvdXJjZV9sZW4oZGV2X3AsIDApKTsgfQlcCi0JaWYgKG5ldF9kZXYtPmlycSkgcGNpX3JlbGVhc2VfcmVnaW9ucyhkZXZfcCk7IH0KLQotI2lmZGVmIFBDSV9NU0lfU1VQUE9SVAotI2RlZmluZSBSVE1QX01TSV9FTkFCTEUoX3BBZCkgXAoteyAJUE9TX0NPT0tJRSBfcE9iaiA9IChQT1NfQ09PS0lFKShfcEFkLT5PU19Db29raWUpOyBcCi0JKF9wQWQpLT5IYXZlTXNpID0JcGNpX2VuYWJsZV9tc2koX3BPYmotPnBjaV9kZXYpID09IDAgPyBUUlVFIDogRkFMU0U7IH0KLQotI2RlZmluZSBSVE1QX01TSV9ESVNBQkxFKF9wQWQpIFwKLXsgCVBPU19DT09LSUUgX3BPYmogPSAoUE9TX0NPT0tJRSkoX3BBZC0+T1NfQ29va2llKTsgXAotCWlmIChfcEFkLT5IYXZlTXNpID09IFRSVUUpIFwKLQkJcGNpX2Rpc2FibGVfbXNpKF9wT2JqLT5wY2lfZGV2KTsgXAotCV9wQWQtPkhhdmVNc2kgPSBGQUxTRTsJfQotI2Vsc2UKLSNkZWZpbmUgUlRNUF9NU0lfRU5BQkxFKF9wQWQpCi0jZGVmaW5lIFJUTVBfTVNJX0RJU0FCTEUoX3BBZCkKLSNlbmRpZiAvLyBQQ0lfTVNJX1NVUFBPUlQgLy8KLQotI2RlZmluZSBTQV9TSElSUSBJUlFGX1NIQVJFRAotCi0jZGVmaW5lIFJUMjhYWF9JUlFfUkVRVUVTVChuZXRfZGV2KQkJCQkJCQlcCi17CVBSVE1QX0FEQVBURVIgX3BBZCA9IChQUlRNUF9BREFQVEVSKSgobmV0X2RldiktPm1sX3ByaXYpOwlcCi0JUE9TX0NPT0tJRSBfcE9iaiA9IChQT1NfQ09PS0lFKShfcEFkLT5PU19Db29raWUpOwkJXAotCVJUTVBfTVNJX0VOQUJMRShfcEFkKTsJCQkJCQkJCQlcCi0JaWYgKChyZXR2YWwgPSByZXF1ZXN0X2lycShfcE9iai0+cGNpX2Rldi0+aXJxLCAJCVwKLQkJCQkJCQlydDI4NjBfaW50ZXJydXB0LCBTQV9TSElSUSwJCVwKLQkJCQkJCQkobmV0X2RldiktPm5hbWUsIChuZXRfZGV2KSkpKSB7CVwKLQkJcHJpbnRrKCJSVDI4NjA6IHJlcXVlc3RfaXJxICBFUlJPUiglZClcbiIsIHJldHZhbCk7CVwKLQlyZXR1cm4gcmV0dmFsOyB9IH0KLQotI2RlZmluZSBSVDI4WFhfSVJRX1JFTEVBU0UobmV0X2RldikJCQkJCQkJCVwKLXsJUFJUTVBfQURBUFRFUiBfcEFkID0gKFBSVE1QX0FEQVBURVIpKChuZXRfZGV2KS0+bWxfcHJpdik7CQlcCi0JUE9TX0NPT0tJRSBfcE9iaiA9IChQT1NfQ09PS0lFKShfcEFkLT5PU19Db29raWUpOwkJCVwKLQlzeW5jaHJvbml6ZV9pcnEoX3BPYmotPnBjaV9kZXYtPmlycSk7CQkJCQkJXAotCWZyZWVfaXJxKF9wT2JqLT5wY2lfZGV2LT5pcnEsIChuZXRfZGV2KSk7CQkJCQlcCi0JUlRNUF9NU0lfRElTQUJMRShfcEFkKTsgfQotCi0jZGVmaW5lIFJUMjhYWF9JUlFfSU5JVChwQWQpCQkJCQkJCQkJCVwKLQl7CXBBZC0+aW50X2VuYWJsZV9yZWcgPSAoKERFTEFZSU5UTUFTSykgfAkJCQkJCVwKLQkJCQkJCQkoUnhJTlR8VHhEYXRhSW50fFR4TWdtdEludCkpICYgfigweDAzKTsJXAotCQlwQWQtPmludF9kaXNhYmxlX21hc2sgPSAwOwkJCQkJCQkJCVwKLQkJcEFkLT5pbnRfcGVuZGluZyA9IDA7IH0KLQotI2RlZmluZSBSVDI4WFhfSVJRX0VOQUJMRShwQWQpCQkJCQkJCQkJXAotCXsJLyogY2xlYXIgZ2FyYmFnZSBpbnRzICovCQkJCQkJCQlcCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCAweGZmZmZmZmZmKTsJCVwKLQkJTklDRW5hYmxlSW50ZXJydXB0KHBBZCk7IH0KLQotI2RlZmluZSBSVDI4WFhfUFVUX0RFVklDRShkZXZfcCkKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLSBNTE1FIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSNkZWZpbmUgUlQyOFhYX01MTUVfSEFORExFUihwQWQpCQkJTWxtZUhhbmRsZXIocEFkKQotCi0jZGVmaW5lIFJUMjhYWF9NTE1FX1BSRV9TQU5JVFlfQ0hFQ0socEFkKQotCi0jZGVmaW5lIFJUMjhYWF9NTE1FX1NUQV9RVUlDS19SU1BfV0FLRV9VUChwQWQpCVwKLQlSVE1QU2V0VGltZXIoJnBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyLCAxMDApOwotCi0jZGVmaW5lIFJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkKQlcCi0JCU1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lKHBBZCkKLQotI2RlZmluZSBSVDI4WFhfSEFORExFX0NPVU5URVJfTUVBU1VSRShfcEFkLCBfcEVudHJ5KQkJXAotCQlIYW5kbGVDb3VudGVyTWVhc3VyZShfcEFkLCBfcEVudHJ5KQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLSBQb3dlciBTYXZlIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSNkZWZpbmUgUlQyOFhYX1BTX1BPTExfRU5RVUVVRShwQWQpCQkJCUVucXVldWVQc1BvbGwocEFkKQotCi0vLwotLy8gRGV2aWNlIElEICYgVmVuZG9yIElELCB0aGVzZSB2YWx1ZXMgc2hvdWxkIG1hdGNoIEVFUFJPTSB2YWx1ZQotLy8KLSNkZWZpbmUgTklDMjg2MF9QQ0lfREVWSUNFX0lEICAgMHgwNjAxCi0jZGVmaW5lIE5JQzI4NjBfUENJZV9ERVZJQ0VfSUQgIDB4MDY4MQotI2RlZmluZSBOSUMyNzYwX1BDSV9ERVZJQ0VfSUQgICAweDA3MDEJCS8vIDFULzJSIENhcmRidXMgPz8/Ci0jZGVmaW5lIE5JQzI3OTBfUENJZV9ERVZJQ0VfSUQgIDB4MDc4MQkgICAgLy8gMVQvMlIgbWluaUNhcmQKLQotI2RlZmluZSBOSUNfUENJX1ZFTkRPUl9JRCAgICAgICAweDE4MTQKLQotI2RlZmluZSBWRU5fQVdUX1BDSWVfREVWSUNFX0lECTB4MTA1OQotI2RlZmluZSBWRU5fQVdUX1BDSV9WRU5ET1JfSUQJMHgxQTNCCi0KLSNkZWZpbmUgRURJTUFYX1BDSV9WRU5ET1JfSUQJMHgxNDMyCi0KLS8vIEZvciBSVE1QUENJZVBvd2VyTGlua0N0cmxSZXN0b3JlICgpIGZ1bmN0aW9uCi0jZGVmaW5lIFJFU1RPUkVfSEFMVAkJICAgIDEKLSNkZWZpbmUgUkVTVE9SRV9XQUtFVVAJCSAgICAyCi0jZGVmaW5lIFJFU1RPUkVfQ0xPU0UgICAgICAgICAgIDMKLQotI2RlZmluZSBQb3dlclNhZmVDSUQJCTEKLSNkZWZpbmUgUG93ZXJSYWRpb09mZkNJRAkJMgotI2RlZmluZSBQb3dlcldha2VDSUQJCTMKLSNkZWZpbmUgQ0lEME1BU0sJCTB4MDAwMDAwZmYKLSNkZWZpbmUgQ0lEMU1BU0sJCTB4MDAwMGZmMDAKLSNkZWZpbmUgQ0lEMk1BU0sJCTB4MDBmZjAwMDAKLSNkZWZpbmUgQ0lEM01BU0sJCTB4ZmYwMDAwMDAKLQotI2RlZmluZSBQQ0lfUkVHX1JFQURfV09SRChwY2lfZGV2LCBvZmZzZXQsIENvbmZpZ3VyYXRpb24pICAgXAotICAgIGlmIChwY2lfcmVhZF9jb25maWdfd29yZChwY2lfZGV2LCBvZmZzZXQsICZyZWcxNikgPT0gMCkgICAgIFwKLSAgICAgICAgQ29uZmlndXJhdGlvbiA9IGxlMmNwdTE2KHJlZzE2KTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBDb25maWd1cmF0aW9uID0gMDsKLQotI2RlZmluZSBQQ0lfUkVHX1dJUlRFX1dPUkQocGNpX2Rldiwgb2Zmc2V0LCBDb25maWd1cmF0aW9uKSAgXAotICAgIHJlZzE2ID0gY3B1MmxlMTYoQ29uZmlndXJhdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHBjaV93cml0ZV9jb25maWdfd29yZChwY2lfZGV2LCBvZmZzZXQsIHJlZzE2KTsgICAgICAgICAgXAotCi0jZGVmaW5lIFJUMjhYWF9TVEFfRk9SQ0VfV0FLRVVQKHBBZCwgTGV2ZWwpIFwKLSAgICBSVDI4eHhQY2lTdGFBc2ljRm9yY2VXYWtldXAocEFkLCBMZXZlbCk7Ci0KLSNkZWZpbmUgUlQyOFhYX1NUQV9TTEVFUF9USEVOX0FVVE9fV0FLRVVQKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCkgXAotICAgIFJUMjh4eFBjaVN0YUFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCk7Ci0KLSNkZWZpbmUgUlQyOFhYX01MTUVfUkFESU9fT04ocEFkKSBcCi0gICAgUlQyOHh4UGNpTWxtZVJhZGlvT24ocEFkKTsKLQotI2RlZmluZSBSVDI4WFhfTUxNRV9SQURJT19PRkYocEFkKSBcCi0gICAgUlQyOHh4UGNpTWxtZVJhZGlvT0ZGKHBBZCk7Ci0KLSNlbmRpZiAvL19fUlQyODYwX0hfXwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0Mjh4eC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydDI4eHguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4NTI1MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0Mjh4eC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY4OCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXJ0Mjh4eC5oCi0KLQlBYnN0cmFjdDoKLQlSVDI4eHggQVNJQyByZWxhdGVkIGRlZmluaXRpb24gJiBzdHJ1Y3R1cmVzCi0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCSAgV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgSmFuIExlZSAgICAgICAgICAgSmFuLTMtMjAwNiAgICAgY3JlYXRlZCBmb3IgUlQyODYwYwotKi8KLQotI2lmbmRlZglfX1JUMjhYWF9IX18KLSNkZWZpbmUJX19SVDI4WFhfSF9fCi0KLQotLy8KLS8vIFBDSSByZWdpc3RlcnMgLSBiYXNlIGFkZHJlc3MgMHgwMDAwCi0vLwotI2RlZmluZSBQQ0lfQ0ZHCQkJMHgwMDAwCi0jZGVmaW5lIFBDSV9FRUNUUkwJCQkweDAwMDQKLSNkZWZpbmUgUENJX01DVUNUUkwJCQkweDAwMDgKLQotdHlwZWRlZiBpbnQgTlRTVEFUVVM7Ci0KLSNkZWZpbmUJT1BUXzE0CQkJMHgxMTQKLQotLy8KLS8vIFNDSC9ETUEgcmVnaXN0ZXJzIC0gYmFzZSBhZGRyZXNzIDB4MDIwMAotLy8KLS8vIElOVF9TT1VSQ0VfQ1NSOiBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyLiBXcml0ZSBvbmUgdG8gY2xlYXIgY29ycmVzcG9uZGluZyBiaXQKLS8vCi0jZGVmaW5lIERNQV9DU1IwICAgICAgMHgyMDAKLSNkZWZpbmUgSU5UX1NPVVJDRV9DU1IgICAgICAweDIwMAotdHlwZWRlZgl1bmlvbglfSU5UX1NPVVJDRV9DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJUnhEZWxheUlOVDoxOwotCQlVSU5UMzIJCVR4RGVsYXlJTlQ6MTsKLQkJVUlOVDMyCQlSeERvbmU6MTsKLQkJVUlOVDMyCQlBYzBEbWFEb25lOjE7Ly80Ci0JCVVJTlQzMiAgICAgICAJQWMxRG1hRG9uZToxOwotCQlVSU5UMzIgICAgICAgCUFjMkRtYURvbmU6MTsKLQkJVUlOVDMyICAgICAgIAlBYzNEbWFEb25lOjE7Ci0JCVVJTlQzMiAgICAgICAJSGNjYURtYURvbmU6MTsgLy8gYml0NwotCQlVSU5UMzIgICAgICAgCU1nbXREbWFEb25lOjE7Ci0JCVVJTlQzMiAgICAgICAJTUNVQ29tbWFuZElOVDoxOy8vYml0IDkKLQkJVUlOVDMyICAgICAgIAlSeFR4Q29oZXJlbnQ6MTsKLQkJVUlOVDMyICAgICAgIAlUQlRUSW50OjE7Ci0JCVVJTlQzMiAgICAgICAJUHJlVEJUVDoxOwotCQlVSU5UMzIgICAgICAgCVRYRmlmb1N0YXR1c0ludDoxOy8vRklGTyBTdGF0aXN0aWNzIGlzIGZ1bGwsIHN3IHNob3VsZCByZWFkIDB4MTcxYwotCQlVSU5UMzIgICAgICAgCUF1dG9XYWtldXA6MTsvL2JpdDE0Ci0JCVVJTlQzMiAgICAgICAJR1BUaW1lcjoxOwotCQlVSU5UMzIgICAgICAgCVJ4Q29oZXJlbnQ6MTsvL2JpdDE2Ci0JCVVJTlQzMiAgICAgICAJVHhDb2hlcmVudDoxOwotCQlVSU5UMzIgICAgICAgCToxNDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19IElOVF9TT1VSQ0VfQ1NSX1NUUlVDLCAqUElOVF9TT1VSQ0VfQ1NSX1NUUlVDOwotCi0vLwotLy8gSU5UX01BU0tfQ1NSOiAgIEludGVycnVwdCBNQVNLIHJlZ2lzdGVyLiAgIDE6IHRoZSBpbnRlcnJ1cHQgaXMgbWFzayBPRkYKLS8vCi0jZGVmaW5lIElOVF9NQVNLX0NTUiAgICAgICAgMHgyMDQKLXR5cGVkZWYJdW5pb24JX0lOVF9NQVNLX0NTUl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSWERlbGF5X0lOVF9NU0s6MTsKLQkJVUlOVDMyCQlUeERlbGF5OjE7Ci0JCVVJTlQzMgkJUnhEb25lOjE7Ci0JCVVJTlQzMgkJQWMwRG1hRG9uZToxOwotCQlVSU5UMzIgICAgICAgCUFjMURtYURvbmU6MTsKLQkJVUlOVDMyICAgICAgIAlBYzJEbWFEb25lOjE7Ci0JCVVJTlQzMiAgICAgICAJQWMzRG1hRG9uZToxOwotCQlVSU5UMzIgICAgICAgCUhjY2FEbWFEb25lOjE7Ci0JCVVJTlQzMiAgICAgICAJTWdtdERtYURvbmU6MTsKLQkJVUlOVDMyICAgICAgIAlNQ1VDb21tYW5kSU5UOjE7Ci0JCVVJTlQzMiAgICAgICAJOjIwOwotCQlVSU5UMzIgICAgICAgCVJ4Q29oZXJlbnQ6MTsKLQkJVUlOVDMyICAgICAgIAlUeENvaGVyZW50OjE7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfSBJTlRfTUFTS19DU1JfU1RSVUMsICpQSU5UX01BU0tfQ1NSX1NUUlVDOwotCi0jZGVmaW5lIFdQRE1BX0dMT19DRkcgCTB4MjA4Ci10eXBlZGVmCXVuaW9uCV9XUERNQV9HTE9fQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCUVuYWJsZVR4RE1BOjE7Ci0JCVVJTlQzMgkJVHhETUFCdXN5OjE7Ci0JCVVJTlQzMgkJRW5hYmxlUnhETUE6MTsKLQkJVUlOVDMyCQlSeERNQUJ1c3k6MTsKLQkJVUlOVDMyICAgICAgIAlXUERNQUJ1cnN0U0laRToyOwotCQlVSU5UMzIgICAgICAgCUVuVFhXcml0ZUJhY2tERE9ORToxOwotCQlVSU5UMzIgICAgICAgCUJpZ0VuZGlhbjoxOwotCQlVSU5UMzIgICAgICAgCVJYSGRyU2NhdGVyOjg7Ci0JCVVJTlQzMiAgICAgICAJSERSX1NFR19MRU46MTY7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfSBXUERNQV9HTE9fQ0ZHX1NUUlVDLCAqUFdQRE1BX0dMT19DRkdfU1RSVUM7Ci0KLSNkZWZpbmUgV1BETUFfUlNUX0lEWCAJMHgyMGMKLXR5cGVkZWYJdW5pb24JX1dQRE1BX1JTVF9JRFhfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJUlNUX0RUWF9JRFgwOjE7Ci0JCVVJTlQzMgkJUlNUX0RUWF9JRFgxOjE7Ci0JCVVJTlQzMgkJUlNUX0RUWF9JRFgyOjE7Ci0JCVVJTlQzMgkJUlNUX0RUWF9JRFgzOjE7Ci0JCVVJTlQzMiAgICAgICAJUlNUX0RUWF9JRFg0OjE7Ci0JCVVJTlQzMiAgICAgICAJUlNUX0RUWF9JRFg1OjE7Ci0JCVVJTlQzMiAgICAgICAJcnN2OjEwOwotCQlVSU5UMzIgICAgICAgCVJTVF9EUlhfSURYMDoxOwotCQlVSU5UMzIgICAgICAgCToxNTsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19IFdQRE1BX1JTVF9JRFhfU1RSVUMsICpQV1BETUFfUlNUX0lEWF9TVFJVQzsKLQotI2RlZmluZSBERUxBWV9JTlRfQ0ZHICAweDAyMTAKLXR5cGVkZWYJdW5pb24JX0RFTEFZX0lOVF9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJUlhNQVhfUFRJTUU6ODsKLQkJVUlOVDMyICAgICAgIAlSWE1BWF9QSU5UOjc7Ci0JCVVJTlQzMiAgICAgICAJUlhETFlfSU5UX0VOOjE7Ci0JCVVJTlQzMiAgICAgICAJVFhNQVhfUFRJTUU6ODsKLQkJVUlOVDMyICAgICAgIAlUWE1BWF9QSU5UOjc7Ci0JCVVJTlQzMiAgICAgICAJVFhETFlfSU5UX0VOOjE7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfSBERUxBWV9JTlRfQ0ZHX1NUUlVDLCAqUERFTEFZX0lOVF9DRkdfU1RSVUM7Ci0KLSNkZWZpbmUgV01NX0FJRlNOX0NGRyAgIDB4MDIxNAotdHlwZWRlZgl1bmlvbglfQUlGU05fQ1NSX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICBBaWZzbjA6NDsgICAgICAgLy8gZm9yIEFDX0JFCi0JICAgIFVJTlQzMiAgIEFpZnNuMTo0OyAgICAgICAvLyBmb3IgQUNfQksKLQkgICAgVUlOVDMyICAgQWlmc24yOjQ7ICAgICAgIC8vIGZvciBBQ19WSQotCSAgICBVSU5UMzIgICBBaWZzbjM6NDsgICAgICAgLy8gZm9yIEFDX1ZPCi0JICAgIFVJTlQzMiAgIFJzdjoxNjsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUFJRlNOX0NTUl9TVFJVQywgKlBBSUZTTl9DU1JfU1RSVUM7Ci0KLS8vCi0vLyBDV01JTl9DU1I6IENXbWluIGZvciBlYWNoIEVEQ0EgQUMKLS8vCi0jZGVmaW5lIFdNTV9DV01JTl9DRkcgICAweDAyMTgKLXR5cGVkZWYJdW5pb24JX0NXTUlOX0NTUl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICAgQ3dtaW4wOjQ7ICAgICAgIC8vIGZvciBBQ19CRQotCSAgICBVSU5UMzIgICBDd21pbjE6NDsgICAgICAgLy8gZm9yIEFDX0JLCi0JICAgIFVJTlQzMiAgIEN3bWluMjo0OyAgICAgICAvLyBmb3IgQUNfVkkKLQkgICAgVUlOVDMyICAgQ3dtaW4zOjQ7ICAgICAgIC8vIGZvciBBQ19WTwotCSAgICBVSU5UMzIgICBSc3Y6MTY7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlDV01JTl9DU1JfU1RSVUMsICpQQ1dNSU5fQ1NSX1NUUlVDOwotCi0vLwotLy8gQ1dNQVhfQ1NSOiBDV21pbiBmb3IgZWFjaCBFRENBIEFDCi0vLwotI2RlZmluZSBXTU1fQ1dNQVhfQ0ZHICAgMHgwMjFjCi10eXBlZGVmCXVuaW9uCV9DV01BWF9DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgIEN3bWF4MDo0OyAgICAgICAvLyBmb3IgQUNfQkUKLQkgICAgVUlOVDMyICAgQ3dtYXgxOjQ7ICAgICAgIC8vIGZvciBBQ19CSwotCSAgICBVSU5UMzIgICBDd21heDI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCi0JICAgIFVJTlQzMiAgIEN3bWF4Mzo0OyAgICAgICAvLyBmb3IgQUNfVk8KLQkgICAgVUlOVDMyICAgUnN2OjE2OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQ1dNQVhfQ1NSX1NUUlVDLCAqUENXTUFYX0NTUl9TVFJVQzsKLQotLy8KLS8vIEFDX1RYT1BfQ1NSMDogQUNfQksvQUNfQkUgVFhPUCByZWdpc3RlcgotLy8KLSNkZWZpbmUgV01NX1RYT1AwX0NGRyAgICAweDAyMjAKLXR5cGVkZWYJdW5pb24JX0FDX1RYT1BfQ1NSMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBBYzBUeG9wOyAgICAgICAgLy8gZm9yIEFDX0JLLCBpbiB1bml0IG9mIDMydXMKLQkgICAgVVNIT1JUICBBYzFUeG9wOyAgICAgICAgLy8gZm9yIEFDX0JFLCBpbiB1bml0IG9mIDMydXMKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUFDX1RYT1BfQ1NSMF9TVFJVQywgKlBBQ19UWE9QX0NTUjBfU1RSVUM7Ci0KLS8vCi0vLyBBQ19UWE9QX0NTUjE6IEFDX1ZPL0FDX1ZJIFRYT1AgcmVnaXN0ZXIKLS8vCi0jZGVmaW5lIFdNTV9UWE9QMV9DRkcgICAgMHgwMjI0Ci10eXBlZGVmCXVuaW9uCV9BQ19UWE9QX0NTUjFfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQWMyVHhvcDsgICAgICAgIC8vIGZvciBBQ19WSSwgaW4gdW5pdCBvZiAzMnVzCi0JICAgIFVTSE9SVCAgQWMzVHhvcDsgICAgICAgIC8vIGZvciBBQ19WTywgaW4gdW5pdCBvZiAzMnVzCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlBQ19UWE9QX0NTUjFfU1RSVUMsICpQQUNfVFhPUF9DU1IxX1NUUlVDOwotCi0jZGVmaW5lIFJJTkdSRUdfRElGRgkJCTB4MTAKLSNkZWZpbmUgR1BJT19DVFJMX0NGRyAgICAweDAyMjgJLy9NQUNfQ1NSMTMKLSNkZWZpbmUgTUNVX0NNRF9DRkcgICAgMHgwMjJjCi0jZGVmaW5lIFRYX0JBU0VfUFRSMCAgICAgMHgwMjMwCS8vQUNfQksgYmFzZSBhZGRyZXNzCi0jZGVmaW5lIFRYX01BWF9DTlQwICAgICAgMHgwMjM0Ci0jZGVmaW5lIFRYX0NUWF9JRFgwICAgICAgIDB4MDIzOAotI2RlZmluZSBUWF9EVFhfSURYMCAgICAgIDB4MDIzYwotI2RlZmluZSBUWF9CQVNFX1BUUjEgICAgIDB4MDI0MCAJLy9BQ19CRSBiYXNlIGFkZHJlc3MKLSNkZWZpbmUgVFhfTUFYX0NOVDEgICAgICAweDAyNDQKLSNkZWZpbmUgVFhfQ1RYX0lEWDEgICAgICAgMHgwMjQ4Ci0jZGVmaW5lIFRYX0RUWF9JRFgxICAgICAgMHgwMjRjCi0jZGVmaW5lIFRYX0JBU0VfUFRSMiAgICAgMHgwMjUwIAkvL0FDX1ZJIGJhc2UgYWRkcmVzcwotI2RlZmluZSBUWF9NQVhfQ05UMiAgICAgIDB4MDI1NAotI2RlZmluZSBUWF9DVFhfSURYMiAgICAgICAweDAyNTgKLSNkZWZpbmUgVFhfRFRYX0lEWDIgICAgICAweDAyNWMKLSNkZWZpbmUgVFhfQkFTRV9QVFIzICAgICAweDAyNjAgCS8vQUNfVk8gYmFzZSBhZGRyZXNzCi0jZGVmaW5lIFRYX01BWF9DTlQzICAgICAgMHgwMjY0Ci0jZGVmaW5lIFRYX0NUWF9JRFgzICAgICAgIDB4MDI2OAotI2RlZmluZSBUWF9EVFhfSURYMyAgICAgIDB4MDI2YwotI2RlZmluZSBUWF9CQVNFX1BUUjQgICAgIDB4MDI3MCAJLy9IQ0NBIGJhc2UgYWRkcmVzcwotI2RlZmluZSBUWF9NQVhfQ05UNCAgICAgIDB4MDI3NAotI2RlZmluZSBUWF9DVFhfSURYNCAgICAgICAweDAyNzgKLSNkZWZpbmUgVFhfRFRYX0lEWDQgICAgICAweDAyN2MKLSNkZWZpbmUgVFhfQkFTRV9QVFI1ICAgICAweDAyODAgCS8vTUdNVCBiYXNlIGFkZHJlc3MKLSNkZWZpbmUgIFRYX01BWF9DTlQ1ICAgICAweDAyODQKLSNkZWZpbmUgVFhfQ1RYX0lEWDUgICAgICAgMHgwMjg4Ci0jZGVmaW5lIFRYX0RUWF9JRFg1ICAgICAgMHgwMjhjCi0jZGVmaW5lIFRYX01HTVRNQVhfQ05UICAgICAgVFhfTUFYX0NOVDUKLSNkZWZpbmUgVFhfTUdNVENUWF9JRFggICAgICAgVFhfQ1RYX0lEWDUKLSNkZWZpbmUgVFhfTUdNVERUWF9JRFggICAgICBUWF9EVFhfSURYNQotI2RlZmluZSBSWF9CQVNFX1BUUiAgICAgMHgwMjkwIAkvL1JYIGJhc2UgYWRkcmVzcwotI2RlZmluZSBSWF9NQVhfQ05UICAgICAgMHgwMjk0Ci0jZGVmaW5lIFJYX0NSWF9JRFggICAgICAgMHgwMjk4Ci0jZGVmaW5lIFJYX0RSWF9JRFggICAgICAweDAyOWMKLSNkZWZpbmUgVVNCX0RNQV9DRkcgICAgICAweDAyYTAKLQotdHlwZWRlZgl1bmlvbglfVVNCX0RNQV9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgUnhCdWxrQWdnVE91dDo4OyAgICAgICAgLy9SeCBCdWxrIEFnZ3JlZ2F0aW9uIFRpbWVPdXQgIGluIHVuaXQgb2YgMzNucwotCSAgICBVSU5UMzIgIFJ4QnVsa0FnZ0xtdDo4OyAgICAgICAgLy9SeCBCdWxrIEFnZ3JlZ2F0aW9uIExpbWl0ICBpbiB1bml0IG9mIDI1NiBieXRlcwotCSAgICBVSU5UMzIgIHBoeWNsZWFyOjE7ICAgICAgICAJCS8vcGh5IHdhdGNoIGRvZyBlbmFibGUuIHdyaXRlIDEKLQkgICAgVUlOVDMyICByc3Y6MjsKLQkgICAgVUlOVDMyICBUeENsZWFyOjE7ICAgICAgICAvL0NsZWFyIFVTQiBETUEgVFggcGF0aAotCSAgICBVSU5UMzIgIFR4b3BIYWx0OjE7ICAgICAgICAvL0hhbHQgVFhPUCBjb3VudCBkb3duIHdoZW4gVFggYnVmZmVyIGlzIGZ1bGwuCi0JICAgIFVJTlQzMiAgUnhCdWxrQWdnRW46MTsgICAgICAgIC8vRW5hYmxlIFJ4IEJ1bGsgQWdncmVnYXRpb24KLQkgICAgVUlOVDMyICBSeEJ1bGtFbjoxOyAgICAgICAgLy9FbmFibGUgVVNCIERNQSBSeAotCSAgICBVSU5UMzIgIFR4QnVsa0VuOjE7ICAgICAgICAvL0VuYWJsZSBVU0IgRE1BIFR4Ci0JICAgIFVJTlQzMiAgRXBvdXRWYWxpZDo2OyAgICAgICAgLy9PVVQgZW5kcG9pbnQgZGF0YSB2YWxpZAotCSAgICBVSU5UMzIgIFJ4QnVzeToxOyAgICAgICAgLy9VU0IgRE1BIFJYIEZTTSBidXN5Ci0JICAgIFVJTlQzMiAgVHhCdXN5OjE7ICAgCS8vVVNCIERNQSBUWCBGU00gYnVzeQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVVNCX0RNQV9DRkdfU1RSVUMsICpQVVNCX0RNQV9DRkdfU1RSVUM7Ci0KLS8vCi0vLyAgMyAgUEJGICByZWdpc3RlcnMKLS8vCi0vLwotLy8gTW9zdCBhcmUgZm9yIGRlYnVnLiBEcml2ZXIgZG9lc24ndCB0b3VjaCBQQkYgcmVnaXN0ZXIuCi0jZGVmaW5lIAlQQkZfU1lTX0NUUkwgCSAweDA0MDAKLSNkZWZpbmUgICAgIFBCRl9DRkcgICAgICAgICAgICAgICAgIDB4MDQwOAotI2RlZmluZSAJUEJGX01BWF9QQ05UIAkgMHgwNDBDCi0jZGVmaW5lIAlQQkZfQ1RSTAkgCTB4MDQxMAotI2RlZmluZSAJUEJGX0lOVF9TVEEJIDB4MDQxNAotI2RlZmluZSAJUEJGX0lOVF9FTkEJIDB4MDQxOAotI2RlZmluZSAJVFhSWFFfUENOVCAgCSAweDA0MzgKLSNkZWZpbmUgCVBCRl9EQkcgCSAJIDB4MDQzYwotI2RlZmluZSAgICAgUEJGX0NBUF9DVFJMICAgICAweDA0NDAKLQotLy8gZUZ1c2UgcmVnaXN0ZXJzCi0jZGVmaW5lIEVGVVNFX0NUUkwgICAgICAgICAgICAgIDB4MDU4MAotI2RlZmluZSBFRlVTRV9EQVRBMCAgICAgICAgICAgICAweDA1OTAKLSNkZWZpbmUgRUZVU0VfREFUQTEgICAgICAgICAgICAgMHgwNTk0Ci0jZGVmaW5lIEVGVVNFX0RBVEEyICAgICAgICAgICAgIDB4MDU5OAotI2RlZmluZSBFRlVTRV9EQVRBMyAgICAgICAgICAgICAweDA1OWMKLSNkZWZpbmUgRUZVU0VfVVNBR0VfTUFQX1NUQVJUICAgMHgyZDAKLSNkZWZpbmUgRUZVU0VfVVNBR0VfTUFQX0VORCAgICAgMHgyZmMKLSNkZWZpbmUgRUZVU0VfVEFHICAgICAgICAgICAgICAgMHgyZmUKLSNkZWZpbmUgRUZVU0VfVVNBR0VfTUFQX1NJWkUgICAgNDUKLQotdHlwZWRlZgl1bmlvbglfRUZVU0VfQ1RSTF9TVFJVQyB7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyICAgICAgICAgICAgRUZTUk9NX0FPVVQ6NjsKLQkJVUlOVDMyICAgICAgICAgICAgRUZTUk9NX01PREU6MjsKLQkJVUlOVDMyICAgICAgICAgICAgRUZTUk9NX0xET19PRkZfVElNRTo2OwotCQlVSU5UMzIgICAgICAgICAgICBFRlNST01fTERPX09OX1RJTUU6MjsKLQkJVUlOVDMyICAgICAgICAgICAgRUZTUk9NX0FJTjoxMDsKLQkJVUlOVDMyICAgICAgICAgICAgUkVTRVJWRUQ6NDsKLQkJVUlOVDMyICAgICAgICAgICAgRUZTUk9NX0tJQ0s6MTsKLQkJVUlOVDMyICAgICAgICAgICAgU0VMX0VGVVNFOjE7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlFRlVTRV9DVFJMX1NUUlVDLCAqUEVGVVNFX0NUUkxfU1RSVUM7Ci0KLSNkZWZpbmUgTERPX0NGRzAgCQkJCTB4MDVkNAotI2RlZmluZSBHUElPX1NXSVRDSAkJCQkweDA1ZGMKLQotLy8KLS8vICA0ICBNQUMgIHJlZ2lzdGVycwotLy8KLS8vCi0vLyAgNC4xIE1BQyBTWVNURU0gIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChvZmZzZXQ6MHgxMDAwKQotLy8KLSNkZWZpbmUgTUFDX0NTUjAgICAgICAgICAgICAweDEwMDAKLXR5cGVkZWYJdW5pb24JX0FTSUNfVkVSX0lEX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFTSUNSZXY7ICAgICAgICAvLyByZXZlcnNpb24gIDogMAotCSAgICBVU0hPUlQgIEFTSUNWZXI7ICAgICAgICAvLyB2ZXJzaW9uIDogMjg2MAotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQVNJQ19WRVJfSURfU1RSVUMsICpQQVNJQ19WRVJfSURfU1RSVUM7Ci0KLSNkZWZpbmUgTUFDX1NZU19DVFJMICAgICAgICAgICAgMHgxMDA0CQkvL01BQ19DU1IxCi0jZGVmaW5lIE1BQ19BRERSX0RXMCAgICAgICAgICAgIAkJMHgxMDA4CQkvLyBNQUMgQUREUiBEVzAKLSNkZWZpbmUgTUFDX0FERFJfRFcxICAgICAgICAgICAJCSAweDEwMGMJCS8vIE1BQyBBRERSIERXMQotLy8KLS8vIE1BQ19DU1IyOiBTVEEgTUFDIHJlZ2lzdGVyIDAKLS8vCi10eXBlZGVmCXVuaW9uCV9NQUNfRFcwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVQ0hBUgkJQnl0ZTA7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDAKLQkJVUNIQVIJCUJ5dGUxOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAxCi0JCVVDSEFSCQlCeXRlMjsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMgotCQlVQ0hBUgkJQnl0ZTM7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDMKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CU1BQ19EVzBfU1RSVUMsICpQTUFDX0RXMF9TVFJVQzsKLQotLy8KLS8vIE1BQ19DU1IzOiBTVEEgTUFDIHJlZ2lzdGVyIDEKLS8vCi10eXBlZGVmCXVuaW9uCV9NQUNfRFcxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVQ0hBUgkJQnl0ZTQ7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDQKLQkJVUNIQVIJCUJ5dGU1OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA1Ci0JCVVDSEFSCQlVMk1lTWFzazsKLQkJVUNIQVIJCVJzdmQxOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JTUFDX0RXMV9TVFJVQywgKlBNQUNfRFcxX1NUUlVDOwotCi0jZGVmaW5lIE1BQ19CU1NJRF9EVzAgICAgICAgICAgICAJCTB4MTAxMAkJLy8gTUFDIEJTU0lEIERXMAotI2RlZmluZSBNQUNfQlNTSURfRFcxICAgICAgICAgICAgCQkweDEwMTQJCS8vIE1BQyBCU1NJRCBEVzEKLQotLy8KLS8vIE1BQ19DU1I1OiBCU1NJRCByZWdpc3RlciAxCi0vLwotdHlwZWRlZgl1bmlvbglfTUFDX0NTUjVfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVDSEFSCQlCeXRlNDsJCSAvLyBCU1NJRCBieXRlIDQKLQkJVUNIQVIJCUJ5dGU1OwkJIC8vIEJTU0lEIGJ5dGUgNQotCQlVU0hPUlQgICAgICAJQnNzSWRNYXNrOjI7IC8vIDA6IG9uZSBCU1NJRCwgMTA6IDQgQlNTSUQsICAwMTogMiBCU1NJRCAsIDExOiA4QlNTSUQKLQkJVVNIT1JUCQlNQnNzQmNuTnVtOjM7Ci0JCVVTSE9SVAkJUnN2ZDoxMTsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CU1BQ19DU1I1X1NUUlVDLCAqUE1BQ19DU1I1X1NUUlVDOwotCi0jZGVmaW5lIE1BWF9MRU5fQ0ZHICAgICAgICAgICAgICAweDEwMTgJCS8vIHJ0Mjg2MGIgbWF4IDE2ayBieXRlcy4gYml0MTI6MTMgTWF4aW11bSBQU0RVIGxlbmd0aCAocG93ZXIgZmFjdG9yKSAwOjJeMTMsIDE6Ml4xNCwgMjoyXjE1LCAzOjJeMTYKLSNkZWZpbmUgQkJQX0NTUl9DRkcgICAgICAgICAgICAJCTB4MTAxYwkJLy8KLS8vCi0vLyBCQlBfQ1NSX0NGRzogQkJQIHNlcmlhbCBjb250cm9sIHJlZ2lzdGVyCi0vLwotdHlwZWRlZgl1bmlvbglfQkJQX0NTUl9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJVmFsdWU6ODsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCi0JCVVJTlQzMgkJUmVnTnVtOjg7CQkJLy8gU2VsZWN0ZWQJQkJQCXJlZ2lzdGVyCi0JCVVJTlQzMgkJZlJlYWQ6MTsJCSAgICAvLyAwOiBXcml0ZQlCQlAsIDE6CVJlYWQgQkJQCi0JCVVJTlQzMgkJQnVzeToxOwkJCQkvLyAxOiBBU0lDIGlzIGJ1c3kgZXhlY3V0ZSBCQlAgcHJvZ3JhbW1pbmcuCi0JCVVJTlQzMgkJQkJQX1BBUl9EVVI6MTsJCSAgICAgLy8gMDogNCBNQUMgY2xvY2sgY3ljbGVzICAxOiA4IE1BQyBjbG9jayBjeWNsZXMKLQkJVUlOVDMyCQlCQlBfUldfTU9ERToxOwkJLy8gMDogdXNlIHNlcmlhbCBtb2RlICAxOnBhcmFsbGVsCi0JCVVJTlQzMgkJOjEyOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQkJQX0NTUl9DRkdfU1RSVUMsICpQQkJQX0NTUl9DRkdfU1RSVUM7Ci0KLSNkZWZpbmUgUkZfQ1NSX0NGRzAgICAgICAgICAgICAJCTB4MTAyMAotLy8KLS8vIFJGX0NTUl9DRkc6IFJGIGNvbnRyb2wgcmVnaXN0ZXIKLS8vCi10eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAotCQlVSU5UMzIJCWJpdHdpZHRoOjU7CQkJLy8gU2VsZWN0ZWQJQkJQCXJlZ2lzdGVyCi0JCVVJTlQzMgkJU3RhbmRieU1vZGU6MTsJCSAgICAvLyAwOiBoaWdoIHdoZW4gc3RhbmQgYnkgMToJbG93IHdoZW4gc3RhbmRieQotCQlVSU5UMzIJCVNlbDoxOwkJCQkvLyAwOlJGX0xFMCBhY3RpdmF0ZSAgMTpSRl9MRTEgYWN0aXZhdGUKLQkJVUlOVDMyCQlCdXN5OjE7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUkZfQ1NSX0NGRzBfU1RSVUMsICpQUkZfQ1NSX0NGRzBfU1RSVUM7Ci0KLSNkZWZpbmUgUkZfQ1NSX0NGRzEgICAgICAgICAgIAkJMHgxMDI0Ci10eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAotCQlVSU5UMzIJCVJGR2FwOjU7CQkJLy8gR2FwIGJldHdlZW4gQkJfQ09OVFJPTF9SRiBhbmQgUkZfTEUuIDA6IDMgc3lzdGVtIGNsb2NrIGN5Y2xlICgzNy41dXNlYykgMTogNSBzeXN0ZW0gY2xvY2sgY3ljbGUgKDYyLjV1c2VjKQotCQlVSU5UMzIJCXJzdjo3OwkJICAgIC8vIDA6IGlkbGUgMTogOGJ1c3kKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVJGX0NTUl9DRkcxX1NUUlVDLCAqUFJGX0NTUl9DRkcxX1NUUlVDOwotCi0jZGVmaW5lIFJGX0NTUl9DRkcyICAgICAgICAgICAJCTB4MTAyOAkJLy8KLXR5cGVkZWYJdW5pb24JX1JGX0NTUl9DRkcyX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCVJlZ0lkQW5kQ29udGVudDoyNDsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCi0JCVVJTlQzMgkJcnN2Ojg7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUkZfQ1NSX0NGRzJfU1RSVUMsICpQUkZfQ1NSX0NGRzJfU1RSVUM7Ci0KLSNkZWZpbmUgTEVEX0NGRyAgICAgICAgICAgCQkweDEwMmMJCS8vICBNQUNfQ1NSMTQKLXR5cGVkZWYJdW5pb24JX0xFRF9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJT25QZXJpb2Q6ODsJCQkvLyBibGlua2luZyBvbiBwZXJpb2QgdW5pdCAxbXMKLQkJVUlOVDMyCQlPZmZQZXJpb2Q6ODsJCQkvLyBibGlua2luZyBvZmYgcGVyaW9kIHVuaXQgMW1zCi0JCVVJTlQzMgkJU2xvd0JsaW5rUGVyaW9kOjY7CQkJLy8gc2xvdyBibGlua2luZyBwZXJpb2QuIHVuaXQ6MW1zCi0JCVVJTlQzMgkJcnN2OjI7Ci0JCVVJTlQzMgkJUkxlZE1vZGU6MjsJCQkvLyByZWQgTGVkIE1vZGUgICAgMDogb2ZmMTogYmxpbmtpbmcgdXBvbiBUWDI6IHBlcmlvZGljIHNsb3cgYmxpbmtpbmczOiBhbHdheXMgb24KLQkJVUlOVDMyCQlHTGVkTW9kZToyOwkJCS8vIGdyZWVuIExlZCBNb2RlCi0JCVVJTlQzMgkJWUxlZE1vZGU6MjsJCQkvLyB5ZWxsb3cgTGVkIE1vZGUKLQkJVUlOVDMyCQlMZWRQb2xhcjoxOwkJCS8vIExlZCBQb2xhcml0eS4gIDA6IGFjdGl2ZSBsb3cxOiBhY3RpdmUgaGlnaAotCQlVSU5UMzIJCToxOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JTEVEX0NGR19TVFJVQywgKlBMRURfQ0ZHX1NUUlVDOwotCi0vLwotLy8gIDQuMiBNQUMgVElNSU5HICBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTEwMCkKLS8vCi0jZGVmaW5lIFhJRlNfVElNRV9DRkcgICAgICAgICAgICAgMHgxMTAwCQkgLy8gTUFDX0NTUjggIE1BQ19DU1I5Ci10eXBlZGVmCXVuaW9uCV9JRlNfU0xPVF9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgQ2NrbVNpZnNUaW1lOjg7ICAgICAgICAvLyAgdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgQ0NLIFJYL1RYCi0JICAgIFVJTlQzMiAgT2ZkbVNpZnNUaW1lOjg7ICAgICAgICAvLyAgdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgT0ZETSBSWC9UWAotCSAgICBVSU5UMzIgIE9mZG1YaWZzVGltZTo0OyAgICAgICAgLy9PRkRNIFNJRlMuIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIE9GRE0gUlggd2hlbiBNQUMgZG9lc24ndCByZWZlcmVuY2UgQkJQIHNpZ25hbCBCQlJYRU5ECi0JICAgIFVJTlQzMiAgRUlGUzo5OyAgICAgICAgLy8gIHVuaXQgMXVzCi0JICAgIFVJTlQzMiAgQkJSeGVuZEVuYWJsZToxOyAgICAgICAgLy8gIHJlZmVyZW5jZSBSWEVORCBzaWduYWwgdG8gYmVnaW4gWElGUyBkZWZlcgotCSAgICBVSU5UMzIgIHJzdjoyOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JSUZTX1NMT1RfQ0ZHX1NUUlVDLCAqUElGU19TTE9UX0NGR19TVFJVQzsKLQotI2RlZmluZSBCS09GRl9TTE9UX0NGRyAgICAgICAgICAgICAweDExMDQJCSAvLyAgbWFjX2NzcjkgbGFzdCA4IGJpdHMKLSNkZWZpbmUgTkFWX1RJTUVfQ0ZHICAgICAgICAgICAgIDB4MTEwOAkJIC8vIE5BViAgKE1BQ19DU1IxNSkKLSNkZWZpbmUgQ0hfVElNRV9DRkcgICAgICAgICAgICAgMHgxMTBDCQkgCS8vIENvdW50IGFzIGNoYW5uZWwgYnVzeQotI2RlZmluZSBQQkZfTElGRV9USU1FUiAgICAgICAgICAgICAweDExMTAJCSAvL1RYL1JYIE1QRFUgdGltZXN0YW1wIHRpbWVyIChmcmVlIHJ1bilVbml0OiAxdXMKLSNkZWZpbmUgQkNOX1RJTUVfQ0ZHICAgICAgICAgICAgIDB4MTExNAkJIC8vIFRYUlhfQ1NSOQotCi0jZGVmaW5lIEJDTl9PRkZTRVQwCQkJCTB4MDQyQwotI2RlZmluZSBCQ05fT0ZGU0VUMQkJCQkweDA0MzAKLQotLy8KLS8vIEJDTl9USU1FX0NGRyA6IFN5bmNocm9uaXphdGlvbiBjb250cm9sIHJlZ2lzdGVyCi0vLwotdHlwZWRlZgl1bmlvbglfQkNOX1RJTUVfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIgICAgICAgQmVhY29uSW50ZXJ2YWw6MTY7ICAvLyBpbiB1bml0IG9mIDEvMTYgVFUKLQkJVUlOVDMyCQliVHNmVGlja2luZzoxOwkJLy8gRW5hYmxlIFRTRiBhdXRvIGNvdW50aW5nCi0JCVVJTlQzMgkJVHNmU3luY01vZGU6MjsJCS8vIEVuYWJsZSBUU0Ygc3luYywgMDA6IGRpc2FibGUsIDAxOiBpbmZyYSBtb2RlLCAxMDogYWQtaG9jIG1vZGUKLSAgICAgICAgVUlOVDMyICAgICAgIGJUQlRURW5hYmxlOjE7Ci0JCVVJTlQzMgkJYkJlYWNvbkdlbjoxOwkJLy8gRW5hYmxlIGJlYWNvbiBnZW5lcmF0b3IKLSAgICAgICAgVUlOVDMyICAgICAgIDozOwotCQlVSU5UMzIJCVR4VGltZXN0YW1wQ29tcGVuc2F0ZTo4OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQkNOX1RJTUVfQ0ZHX1NUUlVDLCAqUEJDTl9USU1FX0NGR19TVFJVQzsKLQotI2RlZmluZSBUQlRUX1NZTkNfQ0ZHICAgICAgICAgICAgMHgxMTE4ICAJCS8vIHR4cnhfY3NyMTAKLSNkZWZpbmUgVFNGX1RJTUVSX0RXMCAgICAgICAgICAgICAweDExMUMgIAkJLy8gTG9jYWwgVFNGIHRpbWVyIGxzYiAzMiBiaXRzLiBSZWFkLW9ubHkKLSNkZWZpbmUgVFNGX1RJTUVSX0RXMSAgICAgICAgICAgICAweDExMjAgIAkJLy8gbXNiIDMyIGJpdHMuIFJlYWQtb25seS4KLSNkZWZpbmUgVEJUVF9USU1FUiAgICAgICAgICAgICAJMHgxMTI0ICAJCS8vIFRJbWVyIHJlbWFpbnMgdGlsbCBuZXh0IFRCVFQuIFJlYWQtb25seS4gIFRYUlhfQ1NSMTQKLSNkZWZpbmUgSU5UX1RJTUVSX0NGRyAgICAgICAgICAgICAgCTB4MTEyOCAgCQkvLwotI2RlZmluZSBJTlRfVElNRVJfRU4gICAgICAgICAgICAgCTB4MTEyYyAgCQkvLyAgR1AtdGltZXIgYW5kIHByZS10YnR0IEludCBlbmFibGUKLSNkZWZpbmUgQ0hfSURMRV9TVEEgICAgICAgICAgICAgIAkweDExMzAgIAkJLy8gIGNoYW5uZWwgaWRsZSB0aW1lCi0jZGVmaW5lIENIX0JVU1lfU1RBICAgICAgICAgICAgICAJMHgxMTM0ICAJCS8vICBjaGFubmxlIGJ1c3kgdGltZQotLy8KLS8vICA0LjIgTUFDIFBPV0VSICBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTIwMCkKLS8vCi0jZGVmaW5lIE1BQ19TVEFUVVNfQ0ZHICAgICAgICAgICAgIDB4MTIwMAkJIC8vIG9sZCBNQUNfQ1NSMTIKLSNkZWZpbmUgUFdSX1BJTl9DRkcgICAgICAgICAgICAgMHgxMjA0CQkgLy8gb2xkIE1BQ19DU1IxMgotI2RlZmluZSBBVVRPX1dBS0VVUF9DRkcgICAgICAgICAgICAgMHgxMjA4CQkgLy8gb2xkIE1BQ19DU1IxMAotLy8KLS8vIEFVVE9fV0FLRVVQX0NGRzogTWFudWFsIHBvd2VyIGNvbnRyb2wgLyBzdGF0dXMgcmVnaXN0ZXIKLS8vCi10eXBlZGVmCXVuaW9uCV9BVVRPX1dBS0VVUF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyICAgICAgIEF1dG9MZWFkVGltZTo4OwotCQlVSU5UMzIgICAgICAgTnVtb2ZTbGVlcGluZ1RidHQ6NzsgICAgICAgICAgLy8gRm9yY2VXYWtlIGhhcyBoaWdoIHByaXZpbGVnZSB0aGFuIFB1dFRvU2xlZXAgd2hlbiBib3RoIHNldAotCQlVSU5UMzIJCUVuYWJsZUF1dG9XYWtldXA6MTsJLy8gMDpzbGVlcCwgMTphd2FrZQotCQlVSU5UMzIJCToxNjsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUFVVE9fV0FLRVVQX1NUUlVDLCAqUEFVVE9fV0FLRVVQX1NUUlVDOwotCi0vLwotLy8gIDQuMyBNQUMgVFggIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChvZmZzZXQ6MHgxMzAwKQotLy8KLQotI2RlZmluZSBFRENBX0FDMF9DRkcJMHgxMzAwCQkvL0FDX1RYT1BfQ1NSMCAweDM0NzQKLSNkZWZpbmUgRURDQV9BQzFfQ0ZHCTB4MTMwNAotI2RlZmluZSBFRENBX0FDMl9DRkcJMHgxMzA4Ci0jZGVmaW5lIEVEQ0FfQUMzX0NGRwkweDEzMGMKLXR5cGVkZWYJdW5pb24JX0VEQ0FfQUNfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgIEFjVHhvcDo4OyAgICAgICAgLy8gIGluIHVuaXQgb2YgMzJ1cwotCSAgICBVSU5UMzIgIEFpZnNuOjQ7ICAgICAgICAvLyAjIG9mIHNsb3QgdGltZQotCSAgICBVSU5UMzIgIEN3bWluOjQ7ICAgICAgICAvLwotCSAgICBVSU5UMzIgIEN3bWF4OjQ7ICAgICAgICAvL3VuaXQgcG93ZXIgb2YgMgotCSAgICBVSU5UMzIgIDoxMjsgICAgICAgLy8KLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUVEQ0FfQUNfQ0ZHX1NUUlVDLCAqUEVEQ0FfQUNfQ0ZHX1NUUlVDOwotCi0jZGVmaW5lIEVEQ0FfVElEX0FDX01BUAkweDEzMTAKLSNkZWZpbmUgVFhfUFdSX0NGR18wCTB4MTMxNAotI2RlZmluZSBUWF9QV1JfQ0ZHXzEJMHgxMzE4Ci0jZGVmaW5lIFRYX1BXUl9DRkdfMgkweDEzMUMKLSNkZWZpbmUgVFhfUFdSX0NGR18zCTB4MTMyMAotI2RlZmluZSBUWF9QV1JfQ0ZHXzQJMHgxMzI0Ci0jZGVmaW5lIFRYX1BJTl9DRkcJCTB4MTMyOAotI2RlZmluZSBUWF9CQU5EX0NGRwkweDEzMmMJCS8vIDB4MSB1c2UgdXBwZXIgMjBNSHouIDAganVzZSBsb3dlciAyME1IegotI2RlZmluZSBUWF9TV19DRkcwCQkweDEzMzAKLSNkZWZpbmUgVFhfU1dfQ0ZHMQkJMHgxMzM0Ci0jZGVmaW5lIFRYX1NXX0NGRzIJCTB4MTMzOAotI2RlZmluZSBUWE9QX1RIUkVTX0NGRwkJMHgxMzNjCi0jZGVmaW5lIFRYT1BfQ1RSTF9DRkcJCTB4MTM0MAotI2RlZmluZSBUWF9SVFNfQ0ZHCQkweDEzNDQKLQotdHlwZWRlZgl1bmlvbglfVFhfUlRTX0NGR19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICAgICAgIEF1dG9SdHNSZXRyeUxpbWl0Ojg7Ci0JICAgIFVJTlQzMiAgICAgICBSdHNUaHJlczoxNjsgICAgLy8gdW5pdDpieXRlCi0JICAgIFVJTlQzMiAgICAgICBSdHNGYmtFbjoxOyAgICAvLyBlbmFibGUgcnRzIHJhdGUgZmFsbGJhY2sKLQkgICAgVUlOVDMyICAgICAgIHJzdjo3OyAgICAgLy8gMTogSFQgbm9uLVNUQkMgY29udHJvbCBmcmFtZSBlbmFibGUKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX1JUU19DRkdfU1RSVUMsICpQVFhfUlRTX0NGR19TVFJVQzsKLQotI2RlZmluZSBUWF9USU1FT1VUX0NGRwkweDEzNDgKLXR5cGVkZWYJdW5pb24JX1RYX1RJTUVPVVRfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICAgICAgcnN2OjQ7Ci0JICAgIFVJTlQzMiAgICAgICBNcGR1TGlmZVRpbWU6NDsgICAgLy8gIGV4cGlyYXRpb24gdGltZSA9IDJeKDkrTVBEVSBMSUZFIFRJTUUpICB1cwotCSAgICBVSU5UMzIgICAgICAgUnhBY2tUaW1lb3V0Ojg7CS8vIHVuaXQ6c2xvdC4gVXNlZCBmb3IgVFggcHJlY2VkdXJlCi0JICAgIFVJTlQzMiAgICAgICBUeG9wVGltZW91dDo4OwkvL1RYT1AgdGltZW91dCB2YWx1ZSBmb3IgVFhPUCB0cnVuY2F0aW9uLiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCAoU0xPVF9USU1FKSA+IChUWF9PUF9USU1FT1VUKSA+IChSWF9BQ0tfVElNRU9VVCkKLQkgICAgVUlOVDMyICAgICAgIHJzdjI6ODsgICAgIC8vIDE6IEhUIG5vbi1TVEJDIGNvbnRyb2wgZnJhbWUgZW5hYmxlCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9USU1FT1VUX0NGR19TVFJVQywgKlBUWF9USU1FT1VUX0NGR19TVFJVQzsKLQotI2RlZmluZSBUWF9SVFlfQ0ZHCTB4MTM0YwotdHlwZWRlZgl1bmlvbiBQQUNLRUQgX1RYX1JUWV9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICBTaG9ydFJ0eUxpbWl0Ojg7CS8vICBzaG9ydCByZXRyeSBsaW1pdAotCSAgICBVSU5UMzIgICAgICAgTG9uZ1J0eUxpbWl0Ojg7CS8vbG9uZyByZXRyeSBsaW1pdAotCSAgICBVSU5UMzIgICAgICAgTG9uZ1J0eVRocmU6MTI7CS8vIExvbmcgcmV0cnkgdGhyZXNob29sZAotCSAgICBVSU5UMzIgICAgICAgTm9uQWdnUnR5TW9kZToxOwkvLyBOb24tQWdncmVnYXRlIE1QRFUgcmV0cnkgbW9kZS4gIDA6ZXhwaXJlZCBieSByZXRyeSBsaW1pdCwgMTogZXhwaXJlZCBieSBtcGR1IGxpZmUgdGltZXIKLQkgICAgVUlOVDMyICAgICAgIEFnZ1J0eU1vZGU6MTsJLy8gQWdncmVnYXRlIE1QRFUgcmV0cnkgbW9kZS4gIDA6ZXhwaXJlZCBieSByZXRyeSBsaW1pdCwgMTogZXhwaXJlZCBieSBtcGR1IGxpZmUgdGltZXIKLQkgICAgVUlOVDMyICAgICAgIFR4YXV0b0ZCRW5hYmxlOjE7ICAgIC8vIFR4IHJldHJ5IFBIWSByYXRlIGF1dG8gZmFsbGJhY2sgZW5hYmxlCi0JICAgIFVJTlQzMiAgICAgICByc3Y6MTsgICAgIC8vIDE6IEhUIG5vbi1TVEJDIGNvbnRyb2wgZnJhbWUgZW5hYmxlCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9SVFlfQ0ZHX1NUUlVDLCAqUFRYX1JUWV9DRkdfU1RSVUM7Ci0KLSNkZWZpbmUgVFhfTElOS19DRkcJMHgxMzUwCi10eXBlZGVmCXVuaW9uCVBBQ0tFRCBfVFhfTElOS19DRkdfU1RSVUMJewotCXN0cnVjdCBQQUNLRUQgewotCSAgICBVSU5UMzIgICAgICAgUmVtb3RlTUZCTGlmZVRpbWU6ODsJLy9yZW1vdGUgTUZCIGxpZmUgdGltZS4gdW5pdCA6IDMydXMKLQkgICAgVUlOVDMyICAgICAgIE1GQkVuYWJsZToxOwkvLyAgVFggYXBwbHkgcmVtb3RlIE1GQiAxOmVuYWJsZQotCSAgICBVSU5UMzIgICAgICAgUmVtb3RlVU1GU0VuYWJsZToxOwkvLyAgcmVtb3RlIHVuc29saWNpdCAgTUZCIGVuYWJsZS4gIDA6IG5vdCBhcHBseSByZW1vdGUgcmVtb3RlIHVuc29saWNpdCAoTUZTPTcpCi0JICAgIFVJTlQzMiAgICAgICBUeE1SUUVuOjE7CS8vICBNQ1MgcmVxdWVzdCBUWCBlbmFibGUKLQkgICAgVUlOVDMyICAgICAgIFR4UkRHRW46MTsJLy8gUkRHIFRYIGVuYWJsZQotCSAgICBVSU5UMzIgICAgICAgVHhDRkFja0VuOjE7CS8vICAgUGlnZ3liYWNrIENGLUFDSyBlbmFibGUKLQkgICAgVUlOVDMyICAgICAgIHJzdjozOwkvLwotCSAgICBVSU5UMzIgICAgICAgUmVtb3RNRkI6ODsgICAgLy8gIHJlbW90ZSBNQ1MgZmVlZGJhY2sKLQkgICAgVUlOVDMyICAgICAgIFJlbW90TUZTOjg7CS8vcmVtb3RlIE1DUyBmZWVkYmFjayBzZXF1ZW5jZSBudW1iZXIKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0xJTktfQ0ZHX1NUUlVDLCAqUFRYX0xJTktfQ0ZHX1NUUlVDOwotCi0jZGVmaW5lIEhUX0ZCS19DRkcwCTB4MTM1NAotdHlwZWRlZgl1bmlvbiBQQUNLRUQgX0hUX0ZCS19DRkcwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MwRkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzFGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMkZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MzRkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzRGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTNUZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1M2RkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzdGQks6NDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUhUX0ZCS19DRkcwX1NUUlVDLCAqUEhUX0ZCS19DRkcwX1NUUlVDOwotCi0jZGVmaW5lIEhUX0ZCS19DRkcxCTB4MTM1OAotdHlwZWRlZgl1bmlvbglfSFRfRkJLX0NGRzFfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzhGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTOUZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMEZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMUZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMkZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxM0ZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxNEZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxNUZCSzo0OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JSFRfRkJLX0NGRzFfU1RSVUMsICpQSFRfRkJLX0NGRzFfU1RSVUM7Ci0KLSNkZWZpbmUgTEdfRkJLX0NGRzAJMHgxMzVjCi10eXBlZGVmCXVuaW9uCV9MR19GQktfQ0ZHMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MwRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCi0JICAgIFVJTlQzMiAgICAgICBPRkRNTUNTMUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAotCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzJGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDEKLQkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MzRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAyCi0JICAgIFVJTlQzMiAgICAgICBPRkRNTUNTNEZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMwotCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzVGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDQKLQkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M2RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyA1Ci0JICAgIFVJTlQzMiAgICAgICBPRkRNTUNTN0ZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgNgotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JTEdfRkJLX0NGRzBfU1RSVUMsICpQTEdfRkJLX0NGRzBfU1RSVUM7Ci0KLSNkZWZpbmUgTEdfRkJLX0NGRzEJCTB4MTM2MAotdHlwZWRlZgl1bmlvbglfTEdfRkJLX0NGRzFfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MwRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCi0JICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MxRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCi0JICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MyRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAxCi0JICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MzRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAyCi0JICAgIFVJTlQzMiAgICAgICByc3Y6MTY7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlMR19GQktfQ0ZHMV9TVFJVQywgKlBMR19GQktfQ0ZHMV9TVFJVQzsKLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLz09PT09PT09PT09PT09PT0gUHJvdGVjdGlvbiBQYXJhbWF0ZXI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jZGVmaW5lIENDS19QUk9UX0NGRwkweDEzNjQJCS8vQ0NLIFByb3RlY3Rpb24KLSNkZWZpbmUgQVNJQ19TSE9SVE5BVgkJMQotI2RlZmluZSBBU0lDX0xPTkdOQVYJCTIKLSNkZWZpbmUgQVNJQ19SVFMJCTEKLSNkZWZpbmUgQVNJQ19DVFMJCTIKLXR5cGVkZWYJdW5pb24JX1BST1RfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICAgICAgUHJvdGVjdFJhdGU6MTY7CS8vUHJvdGVjdGlvbiBjb250cm9sIGZyYW1lIHJhdGUgZm9yIENDSyBUWChSVFMvQ1RTL0NGRW5kKS4KLQkgICAgVUlOVDMyICAgICAgIFByb3RlY3RDdHJsOjI7CS8vUHJvdGVjdGlvbiBjb250cm9sIGZyYW1lIHR5cGUgZm9yIENDSyBUWC4gMTpSVFMvQ1RTLCAyOkNUUy10by1zZWxmLCAwOk5vbmUsIDM6cnN2Ci0JICAgIFVJTlQzMiAgICAgICBQcm90ZWN0TmF2OjI7CS8vVFhPUCBwcm90ZWN0aW9uIHR5cGUgZm9yIENDSyBUWC4gMDpOb25lLCAxOlNob3J0TkFWcHJvdGVjdCwgIDI6TG9uZ05BVlByb3RlY3QsIDM6cnN2Ci0JICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dDY2s6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd09mZG06MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd01NMjA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuIDA6ZGlzYWxsb3cuCi0JICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dNTTQwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCi0JICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dHRjIwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCi0JICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dHRjQwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCi0JICAgIFVJTlQzMiAgICAgICBSVFNUaEVuOjE7CS8vUlRTIHRocmVzaG9sZCBlbmFibGUgb24gQ0NLIFRYCi0JICAgIFVJTlQzMiAgICAgICByc3Y6NTsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVBST1RfQ0ZHX1NUUlVDLCAqUFBST1RfQ0ZHX1NUUlVDOwotCi0jZGVmaW5lIE9GRE1fUFJPVF9DRkcJMHgxMzY4CQkvL09GRE0gUHJvdGVjdGlvbgotI2RlZmluZSBNTTIwX1BST1RfQ0ZHCTB4MTM2QwkJLy9NTTIwIFByb3RlY3Rpb24KLSNkZWZpbmUgTU00MF9QUk9UX0NGRwkweDEzNzAJCS8vTU00MCBQcm90ZWN0aW9uCi0jZGVmaW5lIEdGMjBfUFJPVF9DRkcJMHgxMzc0CQkvL0dGMjAgUHJvdGVjdGlvbgotI2RlZmluZSBHRjQwX1BST1RfQ0ZHCTB4MTM3OAkJLy9HUjQwIFByb3RlY3Rpb24KLSNkZWZpbmUgRVhQX0NUU19USU1FCTB4MTM3QwkJLy8KLSNkZWZpbmUgRVhQX0FDS19USU1FCTB4MTM4MAkJLy8KLQotLy8KLS8vICA0LjQgTUFDIFJYIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChvZmZzZXQ6MHgxNDAwKQotLy8KLSNkZWZpbmUgUlhfRklMVFJfQ0ZHCTB4MTQwMAkJCS8vVFhSWF9DU1IwCi0jZGVmaW5lIEFVVE9fUlNQX0NGRwkweDE0MDQJCQkvL1RYUlhfQ1NSNAotLy8KLS8vIFRYUlhfQ1NSNDogQXV0by1SZXNwb25kZXIvCi0vLwotdHlwZWRlZiB1bmlvbiBfQVVUT19SU1BfQ0ZHX1NUUlVDIHsKLSBzdHJ1Y3QgewotICAgICBVSU5UMzIgICAgICAgQXV0b1Jlc3BvbmRlckVuYWJsZToxOwotICAgICBVSU5UMzIgICAgICAgQkFDQWNrUG9saWN5RW5hYmxlOjE7ICAgIC8vIDA6bG9uZywgMTpzaG9ydCBwcmVhbWJsZQotICAgICBVSU5UMzIgICAgICAgQ1RTNDBNTW9kZToxOyAgLy8gUmVzcG9uc2UgQ1RTIDQwTUh6IGR1cGxpY2F0ZSBtb2RlCi0gICAgIFVJTlQzMiAgICAgICBDVFM0ME1SZWY6MTsgIC8vIFJlc3BvbnNlIENUUyA0ME1IeiBkdXBsaWNhdGUgbW9kZQotICAgICBVSU5UMzIgICAgICAgQXV0b1Jlc3BvbmRlclByZWFtYmxlOjE7ICAgIC8vIDA6bG9uZywgMTpzaG9ydCBwcmVhbWJsZQotICAgICBVSU5UMzIgICAgICAgcnN2OjE7ICAgLy8gUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lCi0gICAgIFVJTlQzMiAgICAgICBEdWFsQ1RTRW46MTsgICAvLyBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUKLSAgICAgVUlOVDMyICAgICAgIEFja0N0c1BzbUJpdDoxOyAgIC8vIFBvd2VyIGJpdCB2YWx1ZSBpbiBjb25ydHJvbCBmcmFtZQotICAgICBVSU5UMzIgICAgICAgIDoyNDsKLSB9IGZpZWxkOwotIFVJTlQzMiAgIHdvcmQ7Ci19IEFVVE9fUlNQX0NGR19TVFJVQywgKlBBVVRPX1JTUF9DRkdfU1RSVUM7Ci0KLSNkZWZpbmUgTEVHQUNZX0JBU0lDX1JBVEUJMHgxNDA4CS8vICBUWFJYX0NTUjUgICAgICAgICAgIDB4MzA1NAotI2RlZmluZSBIVF9CQVNJQ19SQVRFCQkweDE0MGMKLSNkZWZpbmUgSFRfQ1RSTF9DRkcJCTB4MTQxMAotI2RlZmluZSBTSUZTX0NPU1RfQ0ZHCQkweDE0MTQKLSNkZWZpbmUgUlhfUEFSU0VSX0NGRwkJMHgxNDE4CS8vU2V0IE5BViBmb3IgYWxsIHJlY2VpdmVkIGZyYW1lcwotCi0vLwotLy8gIDQuNSBNQUMgU2VjdXJpdHkgY29uZmlndXJhdGlvbiAob2Zmc2V0OjB4MTUwMCkKLS8vCi0jZGVmaW5lIFRYX1NFQ19DTlQwCQkweDE1MDAJCS8vCi0jZGVmaW5lIFJYX1NFQ19DTlQwCQkweDE1MDQJCS8vCi0jZGVmaW5lIENDTVBfRkNfTVVURQkJMHgxNTA4CQkvLwotLy8KLS8vICA0LjYgSENDQS9QU01QIChvZmZzZXQ6MHgxNjAwKQotLy8KLSNkZWZpbmUgVFhPUF9ITERSX0FERFIwCQkweDE2MDAKLSNkZWZpbmUgVFhPUF9ITERSX0FERFIxCQkweDE2MDQKLSNkZWZpbmUgVFhPUF9ITERSX0VUCQkweDE2MDgKLSNkZWZpbmUgUU9TX0NGUE9MTF9SQV9EVzAJCTB4MTYwYwotI2RlZmluZSBRT1NfQ0ZQT0xMX0ExX0RXMQkJMHgxNjEwCi0jZGVmaW5lIFFPU19DRlBPTExfUUMJCTB4MTYxNAotLy8KLS8vICA0LjcgTUFDIFN0YXRpc3RpcyByZWdpc3RlcnMgKG9mZnNldDoweDE3MDApCi0vLwotI2RlZmluZSBSWF9TVEFfQ05UMAkJMHgxNzAwCQkvLwotI2RlZmluZSBSWF9TVEFfQ05UMQkJMHgxNzA0CQkvLwotI2RlZmluZSBSWF9TVEFfQ05UMgkJMHgxNzA4CQkvLwotCi0vLwotLy8gUlhfU1RBX0NOVDBfU1RSVUM6IFJYIFBMQ1AgZXJyb3IgY291bnQgJiBSWCBDUkMgZXJyb3IgY291bnQKLS8vCi10eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBDcmNFcnI7Ci0JICAgIFVTSE9SVCAgUGh5RXJyOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUlhfU1RBX0NOVDBfU1RSVUMsICpQUlhfU1RBX0NOVDBfU1RSVUM7Ci0KLS8vCi0vLyBSWF9TVEFfQ05UMV9TVFJVQzogUlggRmFsc2UgQ0NBIGNvdW50ICYgUlggTE9ORyBmcmFtZSBjb3VudAotLy8KLXR5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEZhbHNlQ2NhOwotCSAgICBVU0hPUlQgIFBsY3BFcnI7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlSWF9TVEFfQ05UMV9TVFJVQywgKlBSWF9TVEFfQ05UMV9TVFJVQzsKLQotLy8KLS8vIFJYX1NUQV9DTlQyX1NUUlVDOgotLy8KLXR5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQyX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIFJ4RHVwbGlDb3VudDsKLQkgICAgVVNIT1JUICBSeEZpZm9PdmVyZmxvd0NvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUlhfU1RBX0NOVDJfU1RSVUMsICpQUlhfU1RBX0NOVDJfU1RSVUM7Ci0KLSNkZWZpbmUgVFhfU1RBX0NOVDAJCTB4MTcwQwkJLy8KLS8vCi0vLyBTVEFfQ1NSMzogVFggQmVhY29uIGNvdW50Ci0vLwotdHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDBfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgVHhGYWlsQ291bnQ7Ci0JICAgIFVTSE9SVCAgVHhCZWFjb25Db3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX1NUQV9DTlQwX1NUUlVDLCAqUFRYX1NUQV9DTlQwX1NUUlVDOwotCi0jZGVmaW5lIFRYX1NUQV9DTlQxCQkweDE3MTAJCS8vCi0vLwotLy8gVFhfU1RBX0NOVDE6IFRYIHR4IGNvdW50Ci0vLwotdHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDFfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgVHhTdWNjZXNzOwotCSAgICBVU0hPUlQgIFR4UmV0cmFuc21pdDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX1NUQV9DTlQxX1NUUlVDLCAqUFRYX1NUQV9DTlQxX1NUUlVDOwotCi0jZGVmaW5lIFRYX1NUQV9DTlQyCQkweDE3MTQJCS8vCi0vLwotLy8gVFhfU1RBX0NOVDI6IFRYIHR4IGNvdW50Ci0vLwotdHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDJfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgVHhaZXJvTGVuQ291bnQ7Ci0JICAgIFVTSE9SVCAgVHhVbmRlckZsb3dDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX1NUQV9DTlQyX1NUUlVDLCAqUFRYX1NUQV9DTlQyX1NUUlVDOwotCi0jZGVmaW5lIFRYX1NUQV9GSUZPCQkweDE3MTgJCS8vCi0vLwotLy8gVFhfU1RBX0ZJRk9fU1RSVUM6IFRYIFJlc3VsdCBmb3Igc3BlY2lmaWMgUElEIHN0YXR1cyBmaWZvIHJlZ2lzdGVyCi0vLwotdHlwZWRlZgl1bmlvbiBQQUNLRUQgX1RYX1NUQV9GSUZPX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIgICAgICAgCWJWYWxpZDoxOyAgIC8vIDE6VGhpcyByZWdpc3RlciBjb250YWlucyBhIHZhbGlkIFRYIHJlc3VsdAotCQlVSU5UMzIgICAgICAgCVBpZFR5cGU6NDsKLQkJVUlOVDMyICAgICAgIAlUeFN1Y2Nlc3M6MTsgICAvLyBUeCBObyByZXRyeSBzdWNjZXNzCi0JCVVJTlQzMiAgICAgICAJVHhBZ2dyZToxOyAgICAvLyBUeCBSZXRyeSBTdWNjZXNzCi0JCVVJTlQzMiAgICAgICAJVHhBY2tSZXF1aXJlZDoxOyAgICAvLyBUeCBmYWlsCi0JCVVJTlQzMgkJd2NpZDo4OwkJLy93aXJlbGVzcyBjbGllbnQgaW5kZXgKLS8vCQlVSU5UMzIJCVN1Y2Nlc3NSYXRlOjE2OwkvL2luY2x1ZGUgTUNTLCBtb2RlICxzaG9ydEdJLCBCVyBzZXR0aW5nU2FtZSBmb3JtYXQgYXMgVFhXSSBXb3JkIDAgQml0IDMxLTE2LgotCQlVSU5UMzIJCVN1Y2Nlc3NSYXRlOjEzOwkvL2luY2x1ZGUgTUNTLCBtb2RlICxzaG9ydEdJLCBCVyBzZXR0aW5nU2FtZSBmb3JtYXQgYXMgVFhXSSBXb3JkIDAgQml0IDMxLTE2LgotCQlVSU5UMzIJCVR4QkY6MTsKLQkJVUlOVDMyCQlSZXNlcnZlOjI7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9TVEFfRklGT19TVFJVQywgKlBUWF9TVEFfRklGT19TVFJVQzsKLQotLy8gRGVidWcgY291bnRlcgotI2RlZmluZSBUWF9BR0dfQ05UCTB4MTcxYwotdHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBOb25BZ2dUeENvdW50OwotCSAgICBVU0hPUlQgIEFnZ1R4Q291bnQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9BR0dfQ05UX1NUUlVDLCAqUFRYX0FHR19DTlRfU1RSVUM7Ci0KLS8vIERlYnVnIGNvdW50ZXIKLSNkZWZpbmUgVFhfQUdHX0NOVDAJMHgxNzIwCi10eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBBZ2dTaXplMUNvdW50OwotCSAgICBVU0hPUlQgIEFnZ1NpemUyQ291bnQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9BR0dfQ05UMF9TVFJVQywgKlBUWF9BR0dfQ05UMF9TVFJVQzsKLQotLy8gRGVidWcgY291bnRlcgotI2RlZmluZSBUWF9BR0dfQ05UMQkweDE3MjQKLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemUzQ291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTRDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQxX1NUUlVDLCAqUFRYX0FHR19DTlQxX1NUUlVDOwotCi0jZGVmaW5lIFRYX0FHR19DTlQyCTB4MTcyOAotdHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDJfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTVDb3VudDsKLQkgICAgVVNIT1JUICBBZ2dTaXplNkNvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfQUdHX0NOVDJfU1RSVUMsICpQVFhfQUdHX0NOVDJfU1RSVUM7Ci0KLS8vIERlYnVnIGNvdW50ZXIKLSNkZWZpbmUgVFhfQUdHX0NOVDMJMHgxNzJjCi10eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UM19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBBZ2dTaXplN0NvdW50OwotCSAgICBVU0hPUlQgIEFnZ1NpemU4Q291bnQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9BR0dfQ05UM19TVFJVQywgKlBUWF9BR0dfQ05UM19TVFJVQzsKLQotLy8gRGVidWcgY291bnRlcgotI2RlZmluZSBUWF9BR0dfQ05UNAkweDE3MzAKLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ0X1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemU5Q291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTEwQ291bnQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9BR0dfQ05UNF9TVFJVQywgKlBUWF9BR0dfQ05UNF9TVFJVQzsKLQotI2RlZmluZSBUWF9BR0dfQ05UNQkweDE3MzQKLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ1X1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemUxMUNvdW50OwotCSAgICBVU0hPUlQgIEFnZ1NpemUxMkNvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfQUdHX0NOVDVfU1RSVUMsICpQVFhfQUdHX0NOVDVfU1RSVUM7Ci0KLSNkZWZpbmUgVFhfQUdHX0NOVDYJCTB4MTczOAotdHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDZfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTEzQ291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTE0Q291bnQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9BR0dfQ05UNl9TVFJVQywgKlBUWF9BR0dfQ05UNl9TVFJVQzsKLQotI2RlZmluZSBUWF9BR0dfQ05UNwkJMHgxNzNjCi10eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UN19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBBZ2dTaXplMTVDb3VudDsKLQkgICAgVVNIT1JUICBBZ2dTaXplMTZDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQ3X1NUUlVDLCAqUFRYX0FHR19DTlQ3X1NUUlVDOwotCi0jZGVmaW5lIE1QRFVfREVOU0lUWV9DTlQJCTB4MTc0MAotdHlwZWRlZgl1bmlvbglfTVBEVV9ERU5fQ05UX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIFRYWmVyb0RlbENvdW50OwkvL1RYIHplcm8gbGVuZ3RoIGRlbGltaXRlciBjb3VudAotCSAgICBVU0hPUlQgIFJYWmVyb0RlbENvdW50OwkvL1JYIHplcm8gbGVuZ3RoIGRlbGltaXRlciBjb3VudAotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JTVBEVV9ERU5fQ05UX1NUUlVDLCAqUE1QRFVfREVOX0NOVF9TVFJVQzsKLQotLy8KLS8vIFRYUlggY29udHJvbCByZWdpc3RlcnMgLSBiYXNlIGFkZHJlc3MgMHgzMDAwCi0vLwotLy8gcnQyODYwYiAgVU5LTk9XTiByZWcgdXNlIFIvTyBSZWcgQWRkciAweDc3ZDAgZmlyc3QuLgotI2RlZmluZSBUWFJYX0NTUjEgICAgICAgICAgIDB4NzdkMAotCi0vLwotLy8gU2VjdXJpdHkga2V5IHRhYmxlIG1lbW9yeSwgYmFzZSBhZGRyZXNzID0gMHgxMDAwCi0vLwotI2RlZmluZSBNQUNfV0NJRF9CQVNFCQkweDE4MDAgLy84LWJ5dGVzKHVzZSBvbmx5IDYtYnl0ZXMpICogMjU2IGVudHJ5ID0KLSNkZWZpbmUgSFdfV0NJRF9FTlRSWV9TSVpFICAgOAotI2RlZmluZSBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRSAgICAgMHg0MDAwICAgICAgLy8gMzItYnl0ZSAqIDI1Ni1lbnRyeSA9ICAtYnl0ZQotI2RlZmluZSBIV19LRVlfRU5UUllfU0laRSAgICAgICAgICAgMHgyMAotI2RlZmluZSBQQUlSV0lTRV9JVkVJVl9UQUJMRV9CQVNFICAgICAweDYwMDAgICAgICAvLyA4LWJ5dGUgKiAyNTYtZW50cnkgPSAgLWJ5dGUKLSNkZWZpbmUgTUFDX0lWRUlWX1RBQkxFX0JBU0UgICAgIDB4NjAwMCAgICAgIC8vIDgtYnl0ZSAqIDI1Ni1lbnRyeSA9ICAtYnl0ZQotI2RlZmluZSBIV19JVkVJVl9FTlRSWV9TSVpFICAgOAotI2RlZmluZSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSAgICAgMHg2ODAwICAgICAgLy8gNC1ieXRlICogMjU2LWVudHJ5ID0gIC1ieXRlCi0jZGVmaW5lIEhXX1dDSURfQVRUUklfU0laRSAgIDQKLSNkZWZpbmUgV0NJRF9SRVNFUlZFRCAgICAgICAgICAJCTB4NmJmYwotI2RlZmluZSBTSEFSRURfS0VZX1RBQkxFX0JBU0UgICAgICAgMHg2YzAwICAgICAgLy8gMzItYnl0ZSAqIDE2LWVudHJ5ID0gNTEyLWJ5dGUKLSNkZWZpbmUgU0hBUkVEX0tFWV9NT0RFX0JBU0UgICAgICAgMHg3MDAwICAgICAgLy8gMzItYnl0ZSAqIDE2LWVudHJ5ID0gNTEyLWJ5dGUKLSNkZWZpbmUgSFdfU0hBUkVEX0tFWV9NT0RFX1NJWkUgICA0Ci0jZGVmaW5lIFNIQVJFREtFWVRBQkxFCQkJMAotI2RlZmluZSBQQUlSV0lTRUtFWVRBQkxFCQkJMQotCi10eXBlZGVmCXVuaW9uCV9TSEFSRURLRVlfTU9ERV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkwQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkxQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkyQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkzQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkwQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkxQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkyQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkzQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVNIQVJFREtFWV9NT0RFX1NUUlVDLCAqUFNIQVJFREtFWV9NT0RFX1NUUlVDOwotCi0vLyA2NC1lbnRyeSBmb3IgcGFpcndpc2Uga2V5IHRhYmxlCi10eXBlZGVmIHN0cnVjdCBfSFdfV0NJRF9FTlRSWSB7ICAvLyA4LWJ5dGUgcGVyIGVudHJ5Ci0gICAgVUNIQVIgICBBZGRyZXNzWzZdOwotICAgIFVDSEFSICAgUnN2WzJdOwotfSBIV19XQ0lEX0VOVFJZLCBQSFdfV0NJRF9FTlRSWTsKLQotCi0KLS8vCi0vLyBPdGhlciBvbi1jaGlwIHNoYXJlZCBtZW1vcnkgc3BhY2UsIGJhc2UgPSAweDIwMDAKLS8vCi0KLS8vIENJUyBzcGFjZSAtIGJhc2UgYWRkcmVzcyA9IDB4MjAwMAotI2RlZmluZSBIV19DSVNfQkFTRSAgICAgICAgICAgICAweDIwMDAKLQotLy8gQ2Fycmllci1zZW5zZSBDVFMgZnJhbWUgYmFzZSBhZGRyZXNzLiBJdCdzIHdoZXJlIG1hYyBzdG9yZXMgY2Fycmllci1zZW5zZSBmcmFtZSBmb3IgY2Fycmllci1zZW5zZSBmdW5jdGlvbi4KLSNkZWZpbmUgSFdfQ1NfQ1RTX0JBU0UJCQkweDc3MDAKLS8vIERGUyBDVFMgZnJhbWUgYmFzZSBhZGRyZXNzLiBJdCdzIHdoZXJlIG1hYyBzdG9yZXMgQ1RTIGZyYW1lIGZvciBERlMuCi0jZGVmaW5lIEhXX0RGU19DVFNfQkFTRQkJCTB4Nzc4MAotI2RlZmluZSBIV19DVFNfRlJBTUVfU0laRQkJMHg4MAotCi0vLyAyMDA0LTExLTA4IGpvaG4gLSBzaW5jZSBOVUxMIGZyYW1lIHdvbid0IGJlIHRoYXQgbG9uZyAoMjU2IGJ5dGUpLiBXZSBzdGVhbCAxNiB0YWlsIGJ5dGVzCi0vLyB0byBzYXZlIGRlYnVnZ2luZyBzZXR0aW5ncwotI2RlZmluZSBIV19ERUJVR19TRVRUSU5HX0JBU0UgICAweDc3ZjAgIC8vIDB4NzdmMH4weDc3ZmYgdG90YWwgMTYgYnl0ZXMKLSNkZWZpbmUgSFdfREVCVUdfU0VUVElOR19CQVNFMiAgIDB4Nzc3MCAgLy8gMHg3N2YwfjB4NzdmZiB0b3RhbCAxNiBieXRlcwotCi0vLyBJbiBvcmRlciB0byBzdXBwb3J0IG1heGltdW0gOCBNQlNTIGFuZCBpdHMgbWF4aW11bSBsZW5ndGggaXMgNTEyIGZvciBlYWNoIGJlYWNvbgotLy8gVGhyZWUgc2VjdGlvbiBkaXNjb250aW51ZSBtZW1vcnkgc2VnbWVudHMgd2lsbCBiZSB1c2VkLgotLy8gMS4gVGhlIG9yaWdpbmFsIHJlZ2lvbiBmb3IgQkNOIDB+MwotLy8gMi4gRXh0cmFjdCBtZW1vcnkgZnJvbSBGQ0UgdGFibGUgZm9yIEJDTiA0fjUKLS8vIDMuIEV4dHJhY3QgbWVtb3J5IGZyb20gUGFpci13aXNlIGtleSB0YWJsZSBmb3IgQkNOIDZ+NwotLy8JICBJdCBvY2N1cGllZCB0aG9zZSBtZW1vcnkgb2Ygd2NpZCAyMzh+MjUzIGZvciBCQ04gNgotLy8JCQkJCQkgICAgICBhbmQgd2NpZCAyMjJ+MjM3IGZvciBCQ04gNwotI2RlZmluZSBIV19CRUFDT05fTUFYX1NJWkUgICAgICAweDEwMDAgLyogdW5pdDogYnl0ZSAqLwotI2RlZmluZSBIV19CRUFDT05fQkFTRTAgICAgICAgICAweDc4MDAKLSNkZWZpbmUgSFdfQkVBQ09OX0JBU0UxICAgICAgICAgMHg3QTAwCi0jZGVmaW5lIEhXX0JFQUNPTl9CQVNFMiAgICAgICAgIDB4N0MwMAotI2RlZmluZSBIV19CRUFDT05fQkFTRTMgICAgICAgICAweDdFMDAKLSNkZWZpbmUgSFdfQkVBQ09OX0JBU0U0ICAgICAgICAgMHg3MjAwCi0jZGVmaW5lIEhXX0JFQUNPTl9CQVNFNSAgICAgICAgIDB4NzQwMAotI2RlZmluZSBIV19CRUFDT05fQkFTRTYgICAgICAgICAweDVEQzAKLSNkZWZpbmUgSFdfQkVBQ09OX0JBU0U3ICAgICAgICAgMHg1QkMwCi0KLSNkZWZpbmUgSFdfQkVBQ09OX01BWF9DT1VOVCAgICAgOAotI2RlZmluZSBIV19CRUFDT05fT0ZGU0VUCQkweDAyMDAKLSNkZWZpbmUgSFdfQkVBQ09OX0NPTlRFTlRfTEVOCShIV19CRUFDT05fT0ZGU0VUIC0gVFhXSV9TSVpFKQotCi0vLyBIT1NULU1DVSBzaGFyZWQgbWVtb3J5IC0gYmFzZSBhZGRyZXNzID0gMHgyMTAwCi0jZGVmaW5lIEhPU1RfQ01EX0NTUgkJMHg0MDQKLSNkZWZpbmUgSDJNX01BSUxCT1hfQ1NSICAgICAgICAgMHg3MDEwCi0jZGVmaW5lIEgyTV9NQUlMQk9YX0NJRCAgICAgICAgIDB4NzAxNAotI2RlZmluZSBIMk1fTUFJTEJPWF9TVEFUVVMgICAgICAweDcwMWMKLSNkZWZpbmUgSDJNX0lOVF9TUkMgICAgICAgICAgICAgMHg3MDI0Ci0jZGVmaW5lIEgyTV9CQlBfQUdFTlQgICAgICAgICAgIDB4NzAyOAotI2RlZmluZSBNMkhfQ01EX0RPTkVfQ1NSICAgICAgICAweDAwMGMKLSNkZWZpbmUgTUNVX1RYT1BfQVJSQVlfQkFTRSAgICAgMHgwMDBjICAgLy8gVE9ETzogdG8gYmUgcHJvdmlkZWQgYnkgQWxiZXJ0Ci0jZGVmaW5lIE1DVV9UWE9QX0VOVFJZX1NJWkUgICAgIDMyICAgICAgIC8vIFRPRE86IHRvIGJlIHByb3ZpZGVkIGJ5IEFsYmVydAotI2RlZmluZSBNQVhfTlVNX09GX1RYT1BfRU5UUlkgICAxNiAgICAgICAvLyBUT0RPOiBtdXN0IGJlIHNhbWUgd2l0aCA4MDUxIGZpcm13YXJlCi0jZGVmaW5lIE1DVV9NQk9YX1ZFUlNJT04gICAgICAgIDB4MDEgICAgIC8vIFRPRE86IHRvIGJlIGNvbmZpcm1lZCBieSBBbGJlcnQKLSNkZWZpbmUgTUNVX01CT1hfVkVSU0lPTl9PRkZTRVQgNSAgICAgICAgLy8gVE9ETzogdG8gYmUgcHJvdmlkZWQgYnkgQWxiZXJ0Ci0KLS8vCi0vLyBIb3N0IERNQSByZWdpc3RlcnMgLSBiYXNlIGFkZHJlc3MgMHgyMDAgLiAgVFgwLTM9RURDQVFpZDAtMywgVFg0PUhDQ0EsIFRYNT1NR01ULAotLy8KLS8vCi0vLyAgRE1BIFJJTkcgREVTQ1JJUFRPUgotLy8KLSNkZWZpbmUgRTJQUk9NX0NTUiAgICAgICAgICAweDAwMDQKLSNkZWZpbmUgSU9fQ05UTF9DU1IgICAgICAgICAweDc3ZDAKLQotI2lmZGVmIFJUMjg2MAotLy8gODA1MSBmaXJtd2FyZSBpbWFnZSBmb3IgUlQyODYwIC0gYmFzZSBhZGRyZXNzID0gMHg0MDAwCi0jZGVmaW5lIEZJUk1XQVJFX0lNQUdFX0JBU0UgICAgIDB4MjAwMAotI2RlZmluZSBNQVhfRklSTVdBUkVfSU1BR0VfU0laRSAweDIwMDAgICAgLy8gOGtieXRlCi0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLS8vIDgwNTEgZmlybXdhcmUgaW1hZ2UgZm9yIHVzYiAtIHVzZSBsYXN0LWhhbGYgYmFzZSBhZGRyZXNzID0gMHgzMDAwCi0jZGVmaW5lIEZJUk1XQVJFX0lNQUdFX0JBU0UgICAgIDB4MzAwMAotI2RlZmluZSBNQVhfRklSTVdBUkVfSU1BR0VfU0laRSAweDEwMDAgICAgLy8gNGtieXRlCi0jZW5kaWYgLy8gUlQyODcwIC8vCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFR4IC8JUnggLyBNZ210IHJpbmcgZGVzY3JpcHRvciBkZWZpbml0aW9uCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIHRoZSBmb2xsb3dpbmcgUElEIHZhbHVlcyBhcmUgdXNlZCB0byBtYXJrIG91dGdvaW5nIGZyYW1lIHR5cGUgaW4gVFhELT5QSUQgc28gdGhhdAotLy8gcHJvcGVyIFRYIHN0YXRpc3RpY3MgY2FuIGJlIGNvbGxlY3RlZCBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzCi0vLyBiMy0yIG9mIFBJRCBmaWVsZCAtCi0jZGVmaW5lIFBJRF9NR01UCQkJMHgwNQotI2RlZmluZSBQSURfQkVBQ09OCQkJMHgwYwotI2RlZmluZSBQSURfREFUQV9OT1JNQUxVQ0FTVAkgCTB4MDIKLSNkZWZpbmUgUElEX0RBVEFfQU1QRFUJIAkweDA0Ci0jZGVmaW5lIFBJRF9EQVRBX05PX0FDSyAgICAJMHgwOAotI2RlZmluZSBQSURfREFUQV9OT1RfTk9STV9BQ0sJIAkweDAzCi0vLyB2YWx1ZSBkb21haW4gb2YgcFR4RC0+SG9zdFFJZCAoNC1iaXQ6IDB+MTUpCi0jZGVmaW5lIFFJRF9BQ19CSyAgICAgICAgICAgICAgIDEgICAvLyBtZWV0IEFDSSBkZWZpbml0aW9uIGluIDgwMi4xMWUKLSNkZWZpbmUgUUlEX0FDX0JFICAgICAgICAgICAgICAgMCAgIC8vIG1lZXQgQUNJIGRlZmluaXRpb24gaW4gODAyLjExZQotI2RlZmluZSBRSURfQUNfVkkgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFFJRF9BQ19WTyAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgUUlEX0hDQ0EgICAgICAgICAgICAgICAgNAotI2RlZmluZSBOVU1fT0ZfVFhfUklORyAgICAgICAgICA1Ci0jZGVmaW5lIFFJRF9NR01UICAgICAgICAgICAgICAgIDEzCi0jZGVmaW5lIFFJRF9SWCAgICAgICAgICAgICAgICAgIDE0Ci0jZGVmaW5lIFFJRF9PVEhFUiAgICAgICAgICAgICAgIDE1Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBCQlAgJiBSRglkZWZpbml0aW9uCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNkZWZpbmUJQlVTWQkJICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUJSURMRQkJICAgICAgICAgICAgICAgIDAKLQotI2RlZmluZQlSRl9SMDAJCQkJCSAgICAwCi0jZGVmaW5lCVJGX1IwMQkJCQkJICAgIDEKLSNkZWZpbmUJUkZfUjAyCQkJCQkgICAgMgotI2RlZmluZQlSRl9SMDMJCQkJCSAgICAzCi0jZGVmaW5lCVJGX1IwNAkJCQkJICAgIDQKLSNkZWZpbmUJUkZfUjA1CQkJCQkgICAgNQotI2RlZmluZQlSRl9SMDYJCQkJCSAgICA2Ci0jZGVmaW5lCVJGX1IwNwkJCQkJICAgIDcKLSNkZWZpbmUJUkZfUjA4CQkJCQkgICAgOAotI2RlZmluZQlSRl9SMDkJCQkJCSAgICA5Ci0jZGVmaW5lCVJGX1IxMAkJCQkJICAgIDEwCi0jZGVmaW5lCVJGX1IxMQkJCQkJICAgIDExCi0jZGVmaW5lCVJGX1IxMgkJCQkJICAgIDEyCi0jZGVmaW5lCVJGX1IxMwkJCQkJICAgIDEzCi0jZGVmaW5lCVJGX1IxNAkJCQkJICAgIDE0Ci0jZGVmaW5lCVJGX1IxNQkJCQkJICAgIDE1Ci0jZGVmaW5lCVJGX1IxNgkJCQkJICAgIDE2Ci0jZGVmaW5lCVJGX1IxNwkJCQkJICAgIDE3Ci0jZGVmaW5lCVJGX1IxOAkJCQkJICAgIDE4Ci0jZGVmaW5lCVJGX1IxOQkJCQkJICAgIDE5Ci0jZGVmaW5lCVJGX1IyMAkJCQkJICAgIDIwCi0jZGVmaW5lCVJGX1IyMQkJCQkJICAgIDIxCi0jZGVmaW5lCVJGX1IyMgkJCQkJICAgIDIyCi0jZGVmaW5lCVJGX1IyMwkJCQkJICAgIDIzCi0jZGVmaW5lCVJGX1IyNAkJCQkJICAgIDI0Ci0jZGVmaW5lCVJGX1IyNQkJCQkJICAgIDI1Ci0jZGVmaW5lCVJGX1IyNgkJCQkJICAgIDI2Ci0jZGVmaW5lCVJGX1IyNwkJCQkJICAgIDI3Ci0jZGVmaW5lCVJGX1IyOAkJCQkJICAgIDI4Ci0jZGVmaW5lCVJGX1IyOQkJCQkJICAgIDI5Ci0jZGVmaW5lCVJGX1IzMAkJCQkJICAgIDMwCi0jZGVmaW5lCVJGX1IzMQkJCQkJICAgIDMxCi0KLSNkZWZpbmUJQkJQX1IwCQkJCQkgICAgMCAgLy8gdmVyc2lvbgotI2RlZmluZQlCQlBfUjEJCQkJICAgICAgICAxICAvLyBUU1NJCi0jZGVmaW5lCUJCUF9SMiAgICAgICAgICAJCQkyICAvLyBUWCBjb25maWd1cmUKLSNkZWZpbmUgQkJQX1IzICAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgQkJQX1I0ICAgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgQkJQX1I1ICAgICAgICAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgQkJQX1I2ICAgICAgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUJQkJQX1IxNAkJCSAgICAgICAgICAgIDE0IC8vIFJYIGNvbmZpZ3VyZQotI2RlZmluZSBCQlBfUjE2ICAgICAgICAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgQkJQX1IxNyAgICAgICAgICAgICAgICAgICAgIDE3IC8vIFJYIHNlbnNpYmlsaXR5Ci0jZGVmaW5lIEJCUF9SMTggICAgICAgICAgICAgICAgICAgICAxOAotI2RlZmluZSBCQlBfUjIxICAgICAgICAgICAgICAgICAgICAgMjEKLSNkZWZpbmUgQkJQX1IyMiAgICAgICAgICAgICAgICAgICAgIDIyCi0jZGVmaW5lIEJCUF9SMjQgICAgICAgICAgICAgICAgICAgICAyNAotI2RlZmluZSBCQlBfUjI1ICAgICAgICAgICAgICAgICAgICAgMjUKLSNkZWZpbmUgQkJQX1IzMSAgICAgICAgICAgICAgICAgICAgIDMxCi0jZGVmaW5lIEJCUF9SNDkgICAgICAgICAgICAgICAgICAgICA0OSAvL1RTU0kKLSNkZWZpbmUgQkJQX1I1MCAgICAgICAgICAgICAgICAgICAgIDUwCi0jZGVmaW5lIEJCUF9SNTEgICAgICAgICAgICAgICAgICAgICA1MQotI2RlZmluZSBCQlBfUjUyICAgICAgICAgICAgICAgICAgICAgNTIKLSNkZWZpbmUgQkJQX1I1NSAgICAgICAgICAgICAgICAgICAgIDU1Ci0jZGVmaW5lIEJCUF9SNjIgICAgICAgICAgICAgICAgICAgICA2MiAvLyBSeCBTUTAgVGhyZXNob2xkIEhJR0gKLSNkZWZpbmUgQkJQX1I2MyAgICAgICAgICAgICAgICAgICAgIDYzCi0jZGVmaW5lIEJCUF9SNjQgICAgICAgICAgICAgICAgICAgICA2NAotI2RlZmluZSBCQlBfUjY1ICAgICAgICAgICAgICAgICAgICAgNjUKLSNkZWZpbmUgQkJQX1I2NiAgICAgICAgICAgICAgICAgICAgIDY2Ci0jZGVmaW5lIEJCUF9SNjcgICAgICAgICAgICAgICAgICAgICA2NwotI2RlZmluZSBCQlBfUjY4ICAgICAgICAgICAgICAgICAgICAgNjgKLSNkZWZpbmUgQkJQX1I2OSAgICAgICAgICAgICAgICAgICAgIDY5Ci0jZGVmaW5lIEJCUF9SNzAgICAgICAgICAgICAgICAgICAgICA3MCAvLyBSeCBBR0MgU1EgQ0NLIFhjb3JyIHRocmVzaG9sZAotI2RlZmluZSBCQlBfUjczICAgICAgICAgICAgICAgICAgICAgNzMKLSNkZWZpbmUgQkJQX1I3NQkJCQkJCTc1Ci0jZGVmaW5lIEJCUF9SNzcgICAgICAgICAgICAgICAgICAgICA3NwotI2RlZmluZSBCQlBfUjc5ICAgICAgICAgICAgICAgICAgICAgNzkKLSNkZWZpbmUgQkJQX1I4MCAgICAgICAgICAgICAgICAgICAgIDgwCi0jZGVmaW5lIEJCUF9SODEgICAgICAgICAgICAgICAgICAgICA4MQotI2RlZmluZSBCQlBfUjgyICAgICAgICAgICAgICAgICAgICAgODIKLSNkZWZpbmUgQkJQX1I4MyAgICAgICAgICAgICAgICAgICAgIDgzCi0jZGVmaW5lIEJCUF9SODQgICAgICAgICAgICAgICAgICAgICA4NAotI2RlZmluZSBCQlBfUjg2CQkJCQkJODYKLSNkZWZpbmUgQkJQX1I5MQkJCQkJCTkxCi0jZGVmaW5lIEJCUF9SOTIJCQkJCQk5MgotI2RlZmluZSBCQlBfUjk0ICAgICAgICAgICAgICAgICAgICAgOTQgLy8gVHggR2FpbiBDb250cm9sCi0jZGVmaW5lIEJCUF9SMTAzICAgICAgICAgICAgICAgICAgICAxMDMKLSNkZWZpbmUgQkJQX1IxMDUgICAgICAgICAgICAgICAgICAgIDEwNQotI2RlZmluZSBCQlBfUjExMyAgICAgICAgICAgICAgICAgICAgMTEzCi0jZGVmaW5lIEJCUF9SMTE0ICAgICAgICAgICAgICAgICAgICAxMTQKLSNkZWZpbmUgQkJQX1IxMTUgICAgICAgICAgICAgICAgICAgIDExNQotI2RlZmluZSBCQlBfUjExNiAgICAgICAgICAgICAgICAgICAgMTE2Ci0jZGVmaW5lIEJCUF9SMTE3ICAgICAgICAgICAgICAgICAgICAxMTcKLSNkZWZpbmUgQkJQX1IxMTggICAgICAgICAgICAgICAgICAgIDExOAotI2RlZmluZSBCQlBfUjExOSAgICAgICAgICAgICAgICAgICAgMTE5Ci0jZGVmaW5lIEJCUF9SMTIwICAgICAgICAgICAgICAgICAgICAxMjAKLSNkZWZpbmUgQkJQX1IxMjEgICAgICAgICAgICAgICAgICAgIDEyMQotI2RlZmluZSBCQlBfUjEyMiAgICAgICAgICAgICAgICAgICAgMTIyCi0jZGVmaW5lIEJCUF9SMTIzICAgICAgICAgICAgICAgICAgICAxMjMKLSNkZWZpbmUgQkJQX1IxMzggICAgICAgICAgICAgICAgICAgIDEzOCAvLyBhZGQgYnkgam9obmxpLCBSRiBwb3dlciBzZXF1ZW5jZSBzZXR1cCwgQURDIGR5bmFtaWMgb24vb2ZmIGNvbnRyb2wKLQotCi0jZGVmaW5lIEJCUFI5NF9ERUZBVUxUICAgICAgICAgICAgICAweDA2IC8vIEFkZCAxIHZhbHVlIHdpbGwgZ2FpbiAxZGIKLQotI2RlZmluZSBSU1NJX0ZPUl9WRVJZX0xPV19TRU5TSUJJTElUWSAtMzUKLSNkZWZpbmUgUlNTSV9GT1JfTE9XX1NFTlNJQklMSVRZICAgICAgLTU4Ci0jZGVmaW5lIFJTU0lfRk9SX01JRF9MT1dfU0VOU0lCSUxJVFkgIC04MAotI2RlZmluZSBSU1NJX0ZPUl9NSURfU0VOU0lCSUxJVFkgICAgICAtOTAKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFRVBST00gZGVmaW5pdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jZGVmaW5lIEVFRE8gICAgICAgICAgICAgICAgICAgICAgICAweDA4Ci0jZGVmaW5lIEVFREkgICAgICAgICAgICAgICAgICAgICAgICAweDA0Ci0jZGVmaW5lIEVFQ1MgICAgICAgICAgICAgICAgICAgICAgICAweDAyCi0jZGVmaW5lIEVFU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAxCi0jZGVmaW5lIEVFUkwgICAgICAgICAgICAgICAgICAgICAgICAweDgwCi0KLSNkZWZpbmUgRUVQUk9NX1dSSVRFX09QQ09ERSAgICAgICAgIDB4MDUKLSNkZWZpbmUgRUVQUk9NX1JFQURfT1BDT0RFICAgICAgICAgIDB4MDYKLSNkZWZpbmUgRUVQUk9NX0VXRFNfT1BDT0RFICAgICAgICAgIDB4MTAKLSNkZWZpbmUgRUVQUk9NX0VXRU5fT1BDT0RFICAgICAgICAgIDB4MTMKLQotI2RlZmluZQlOVU1fRUVQUk9NX0JCUF9QQVJNUwkJMTkJCQkvLyBJbmNsdWRlIE5JQyBDb25maWcgMCwgMSwgQ1IsIFRYIEFMQyBzdGVwLCBCQlBzCi0jZGVmaW5lCU5VTV9FRVBST01fVFhfR19QQVJNUwkJNwotI2RlZmluZQlFRVBST01fTklDMV9PRkZTRVQgICAgICAgICAgMHgzNAkJLy8gVGhlIGFkZHJlc3MgaXMgZnJvbSBOSUMgY29uZmlnIDAsIG5vdCBCQlAgcmVnaXN0ZXIgSUQKLSNkZWZpbmUJRUVQUk9NX05JQzJfT0ZGU0VUICAgICAgICAgIDB4MzYJCS8vIFRoZSBhZGRyZXNzIGlzIGZyb20gTklDIGNvbmZpZyAwLCBub3QgQkJQIHJlZ2lzdGVyIElECi0jZGVmaW5lCUVFUFJPTV9CQlBfQkFTRV9PRkZTRVQJCTB4ZjAJCS8vIFRoZSBhZGRyZXNzIGlzIGZyb20gTklDIGNvbmZpZyAwLCBub3QgQkJQIHJlZ2lzdGVyIElECi0jZGVmaW5lCUVFUFJPTV9HX1RYX1BXUl9PRkZTRVQJCTB4NTIKLSNkZWZpbmUJRUVQUk9NX0dfVFgyX1BXUl9PRkZTRVQJCTB4NjAKLSNkZWZpbmUgRUVQUk9NX0xFRDFfT0ZGU0VUCQkJMHgzYwotI2RlZmluZSBFRVBST01fTEVEMl9PRkZTRVQJCQkweDNlCi0jZGVmaW5lIEVFUFJPTV9MRUQzX09GRlNFVAkJCTB4NDAKLSNkZWZpbmUgRUVQUk9NX0xOQV9PRkZTRVQJCQkweDQ0Ci0jZGVmaW5lIEVFUFJPTV9SU1NJX0JHX09GRlNFVAkJMHg0NgotI2RlZmluZSBFRVBST01fUlNTSV9BX09GRlNFVAkJMHg0YQotI2RlZmluZSBFRVBST01fREVGSU5FX01BWF9UWFBXUgkJMHg0ZQotI2RlZmluZSBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfMl80RwkweGRlCS8vIDIwTUhaIDIuNEcgdHggcG93ZXIuCi0jZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl8yXzRHCTB4ZWUJLy8gNDBNSFogMi40RyB0eCBwb3dlci4KLSNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzVHCQkweGZhCS8vIDIwTUhaIDVHIHR4IHBvd2VyLgotI2RlZmluZSBFRVBST01fVFhQT1dFUl9CWVJBVEVfNDBNSFpfNUcJCTB4MTBhCS8vIDQwTUhaIDVHIHR4IHBvd2VyLgotI2RlZmluZSBFRVBST01fQV9UWF9QV1JfT0ZGU0VUICAgICAgMHg3OAotI2RlZmluZSBFRVBST01fQV9UWDJfUFdSX09GRlNFVCAgICAgIDB4YTYKLSNkZWZpbmUgRUVQUk9NX1ZFUlNJT05fT0ZGU0VUICAgICAgIDB4MDIKLSNkZWZpbmUJRUVQUk9NX0ZSRVFfT0ZGU0VUCQkJMHgzYQotI2RlZmluZSBFRVBST01fVFhQT1dFUl9CWVJBVEUgCTB4ZGUJLy8gMjBNSFogcG93ZXIuCi0jZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0RFTFRBCQkweDUwCS8vIDIwTUhaIEFORCA0MCBNSFogdXNlIGRpZmZlcmVudCBwb3dlci4gVGhpcyBpcyBkZWx0YSBpbiA0ME1IWi4KLSNkZWZpbmUgVkFMSURfRUVQUk9NX1ZFUlNJT04gICAgICAgIDEKLQotLy8gUGFpcktleU1vZGUgZGVmaW5pdGlvbgotI2RlZmluZSBQS01PREVfTk9ORSAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBQS01PREVfV0VQNjQgICAgICAgICAgICAgICAgMQotI2RlZmluZSBQS01PREVfV0VQMTI4ICAgICAgICAgICAgICAgMgotI2RlZmluZSBQS01PREVfVEtJUCAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBQS01PREVfQUVTICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBQS01PREVfQ0tJUDY0ICAgICAgICAgICAgICAgNQotI2RlZmluZSBQS01PREVfQ0tJUDEyOCAgICAgICAgICAgICAgNgotI2RlZmluZSBQS01PREVfVEtJUF9OT19NSUMgICAgICAgICAgNyAgICAgICAvLyBNSUMgYXBwZW5kZWQgYnkgZHJpdmVyOiBub3QgYSB2YWxpZCB2YWx1ZSBpbiBoYXJkd2FyZSBrZXkgdGFibGUKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBXQ0lEICBmb3JtYXQKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy83LjEJV0NJRCAgRU5UUlkgIGZvcm1hdCAgOiA4Ynl0ZXMKLXR5cGVkZWYJc3RydWN0CV9XQ0lEX0VOVFJZX1NUUlVDIHsKLQlVQ0hBUgkJUlhCQUJpdG1hcDc7ICAgIC8vIGJpdDAgZm9yIFRJRDgsIGJpdDcgZm9yIFRJRCAxNQotCVVDSEFSCQlSWEJBQml0bWFwMDsgICAgLy8gYml0MCBmb3IgVElEMCwgYml0NyBmb3IgVElEIDcKLQlVQ0hBUgkJTUFDWzZdOwkvLyAwIGZvciBzaGFyZWQga2V5IHRhYmxlLiAgMSBmb3IgcGFpcndpc2Uga2V5IHRhYmxlCi19CVdDSURfRU5UUllfU1RSVUMsICpQV0NJRF9FTlRSWV9TVFJVQzsKLQotLy84LjEuMQlTRUNVUklUWSAgS0VZICBmb3JtYXQgIDogOERXCi0vLyAzMi1ieXRlIHBlciBlbnRyeSwgdG90YWwgMTYtZW50cnkgZm9yIHNoYXJlZCBrZXkgdGFibGUsIDY0LWVudHJ5IGZvciBwYWlyd2lzZSBrZXkgdGFibGUKLXR5cGVkZWYgc3RydWN0IF9IV19LRVlfRU5UUlkgeyAgICAgICAgICAvLyAzMi1ieXRlIHBlciBlbnRyeQotICAgIFVDSEFSICAgS2V5WzE2XTsKLSAgICBVQ0hBUiAgIFR4TWljWzhdOwotICAgIFVDSEFSICAgUnhNaWNbOF07Ci19IEhXX0tFWV9FTlRSWSwgKlBIV19LRVlfRU5UUlk7Ci0KLS8vOC4xLjIJSVYvRUlWICBmb3JtYXQgIDogMkRXCi0KLS8vOC4xLjMJUlggYXR0cmlidXRlIGVudHJ5IGZvcm1hdCAgOiAxRFcKLXR5cGVkZWYJc3RydWN0CV9NQUNfQVRUUklCVVRFX1NUUlVDIHsKLQlVSU5UMzIJCUtleVRhYjoxOwkvLyAwIGZvciBzaGFyZWQga2V5IHRhYmxlLiAgMSBmb3IgcGFpcndpc2Uga2V5IHRhYmxlCi0JVUlOVDMyCQlQYWlyS2V5TW9kZTozOwotCVVJTlQzMgkJQlNTSURJZHg6MzsgLy9tdWx0aXBsZUJTUyBpbmRleCBmb3IgdGhlIFdDSUQKLQlVSU5UMzIJCVJYV0lVREY6MzsKLQlVSU5UMzIJCXJzdjoyMjsKLX0JTUFDX0FUVFJJQlVURV9TVFJVQywgKlBNQUNfQVRUUklCVVRFX1NUUlVDOwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFRYIC8gUlggcmluZyBkZXNjcmlwdG9yIGZvcm1hdAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIHRoZSBmaXJzdCAyNC1ieXRlIGluIFRYRCBpcyBjYWxsZWQgVFhJTkZPIGFuZCB3aWxsIGJlIERNQWVkIHRvIE1BQyBibG9jayB0aHJvdWdoIFRYRklGTy4KLS8vIE1BQyBibG9jayB1c2UgdGhpcyBUWElORk8gdG8gY29udHJvbCB0aGUgdHJhbnNtaXNzaW9uIGJlaGF2aW9yIG9mIHRoaXMgZnJhbWUuCi0jZGVmaW5lIEZJRk9fTUdNVCAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBGSUZPX0hDQ0EgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgRklGT19FRENBICAgICAgICAgICAgICAgICAyCi0KLS8vCi0vLyBUWCBkZXNjcmlwdG9yIGZvcm1hdCwgVHgJcmluZywgTWdtdCBSaW5nCi0vLwotdHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9UWERfU1RSVUMgewotCS8vIFdvcmQJMAotCVVJTlQzMgkJU0RQdHIwOwotCS8vIFdvcmQJMQotCVVJTlQzMgkJU0RMZW4xOjE0OwotCVVJTlQzMgkJTGFzdFNlYzE6MTsKLQlVSU5UMzIJCUJ1cnN0OjE7Ci0JVUlOVDMyCQlTRExlbjA6MTQ7Ci0JVUlOVDMyCQlMYXN0U2VjMDoxOwotCVVJTlQzMgkJRE1BRE9ORToxOwotCS8vV29yZDIKLQlVSU5UMzIJCVNEUHRyMTsKLQkvL1dvcmQzCi0JVUlOVDMyCQlyc3YyOjI0OwotCVVJTlQzMgkJV0lWOjE7CS8vIFdpcmVsZXNzIEluZm8gVmFsaWQuIDEgaWYgRHJpdmVyIGFscmVhZHkgZmlsbCBXSSwgIG8gaWYgRE1BIG5lZWRzIHRvIGNvcHkgV0kgdG8gY29ycmVjdHBvc2l0aW9uCi0JVUlOVDMyCQlRU0VMOjI7CS8vIHNlbGVjdCBvbi1jaGlwIEZJRk8gSUQgZm9yIDJuZC1zdGFnZSBvdXRwdXQgc2NoZWR1bGVyLjA6TUdNVCwgMTpIQ0NBIDI6RURDQQotCVVJTlQzMgkJcnN2OjI7Ci0JVUlOVDMyCQlUQ086MTsJLy8KLQlVSU5UMzIJCVVDTzoxOwkvLwotCVVJTlQzMgkJSUNPOjE7CS8vCi19CVRYRF9TVFJVQywgKlBUWERfU1RSVUM7Ci0KLS8vCi0vLyBUWEQgV2lyZWxlc3MgSW5mb3JtYXRpb24gZm9ybWF0IGZvciBUeCByaW5nIGFuZCBNZ210IFJpbmcKLS8vCi0vL3R4b3AgOiBmb3IgdHhvcCBtb2RlCi0vLyAwOnR4b3AgZm9yIHRoZSBNUERVIGZyYW1lIHdpbGwgYmUgaGFuZGxlcyBieSBBU0lDIGJ5IHJlZ2lzdGVyCi0vLyAxLzIvMzp0aGUgTVBEVSBmcmFtZSBpcyBzZW5kIGFmdGVyIFBJRlMvYmFja29mZi9TSUZTCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1RYV0lfU1RSVUMgewotCS8vIFdvcmQJMAotCVVJTlQzMgkJRlJBRzoxOwkJLy8gMSB0byBpbmZvcm0gVEtJUCBlbmdpbmUgdGhpcyBpcyBhIGZyYWdtZW50LgotCVVJTlQzMgkJTUlNT3BzOjE7CS8vIHRoZSByZW1vdGUgcGVlciBpcyBpbiBkeW5hbWljIE1JTU8tUFMgbW9kZQotCVVJTlQzMgkJQ0ZBQ0s6MTsKLQlVSU5UMzIJCVRTOjE7Ci0KLQlVSU5UMzIJCUFNUERVOjE7Ci0JVUlOVDMyCQlNcGR1RGVuc2l0eTozOwotCVVJTlQzMgkJdHhvcDoyOwkvL0ZPUiAiVEhJUyIgZnJhbWUuIDA6SFQgVFhPUCBydWxlICwgMTpQSUZTIFRYICwyOkJhY2tvZmYsIDM6c2lmcyBvbmx5IHdoZW4gcHJldmlvdXMgZnJhbWUgZXhjaGFuZ2UgaXMgc3VjY2Vzc2Z1bC4KLQlVSU5UMzIJCXJzdjo2OwotCi0JVUlOVDMyCQlNQ1M6NzsKLQlVSU5UMzIJCUJXOjE7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6Ci0JVUlOVDMyCQlTaG9ydEdJOjE7Ci0JVUlOVDMyCQlTVEJDOjI7CS8vIDE6IFNUQkMgc3VwcG9ydCBNQ1MgPTAtNywgICAyLDMgOiBSRVNFUlZFCi0JVUlOVDMyCQlJZnM6MTsJLy8KLQlVSU5UMzIJCXJzdjI6MTsKLQlVSU5UMzIJCVR4QkY6MTsJLy8gMyozCi0JVUlOVDMyCQlQSFlNT0RFOjI7Ci0JLy8gV29yZAkxCi0JVUlOVDMyCQlBQ0s6MTsKLQlVSU5UMzIJCU5TRVE6MTsKLQlVSU5UMzIJCUJBV2luU2l6ZTo2OwotCVVJTlQzMgkJV2lyZWxlc3NDbGlJRDo4OwotCVVJTlQzMgkJTVBEVXRvdGFsQnl0ZUNvdW50OjEyOwotCVVJTlQzMgkJUGFja2V0SWQ6NDsKLQkvL1dvcmQyCi0JVUlOVDMyCQlJVjsKLQkvL1dvcmQzCi0JVUlOVDMyCQlFSVY7Ci19CVRYV0lfU1RSVUMsICpQVFhXSV9TVFJVQzsKLQotLy8KLS8vIFJ4IGRlc2NyaXB0b3IgZm9ybWF0LCBSeAlSaW5nCi0vLwotI2lmZGVmIFJUMjg2MAotdHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9SWERfU1RSVUMJewotCS8vIFdvcmQJMAotCVVJTlQzMgkJU0RQMDsKLQkvLyBXb3JkCTEKLQlVSU5UMzIJCVNETDE6MTQ7Ci0JVUlOVDMyCQlSc3Y6MjsKLQlVSU5UMzIJCVNETDA6MTQ7Ci0JVUlOVDMyCQlMUzA6MTsKLQlVSU5UMzIJCURET05FOjE7Ci0JLy8gV29yZAkyCi0JVUlOVDMyCQlTRFAxOwotCS8vIFdvcmQJMwotCVVJTlQzMgkJQkE6MTsKLQlVSU5UMzIJCURBVEE6MTsKLQlVSU5UMzIJCU5VTExEQVRBOjE7Ci0JVUlOVDMyCQlGUkFHOjE7Ci0JVUlOVDMyCQlVMk06MTsgICAgICAgICAgICAgIC8vIDE6IHRoaXMgUlggZnJhbWUgaXMgdW5pY2FzdCB0byBtZQotCVVJTlQzMgkJTWNhc3Q6MTsgICAgICAgICAgICAvLyAxOiB0aGlzIGlzIGEgbXVsdGljYXN0IGZyYW1lCi0JVUlOVDMyCQlCY2FzdDoxOyAgICAgICAgICAgIC8vIDE6IHRoaXMgaXMgYSBicm9hZGNhc3QgZnJhbWUKLQlVSU5UMzIJCU15QnNzOjE7ICAJLy8gMTogdGhpcyBmcmFtZSBiZWxvbmdzIHRvIHRoZSBzYW1lIEJTU0lECi0JVUlOVDMyCQlDcmM6MTsgICAgICAgICAgICAgIC8vIDE6IENSQyBlcnJvcgotCVVJTlQzMgkJQ2lwaGVyRXJyOjI7ICAgICAgICAvLyAwOiBkZWNyeXB0aW9uIG9rYXksIDE6SUNWIGVycm9yLCAyOk1JQyBlcnJvciwgMzpLRVkgbm90IHZhbGlkCi0JVUlOVDMyCQlBTVNEVToxOwkJLy8gcnggd2l0aCA4MDIuMyBoZWFkZXIsIG5vdCA4MDIuMTEgaGVhZGVyLgotCVVJTlQzMgkJSFRDOjE7Ci0JVUlOVDMyCQlSU1NJOjE7Ci0JVUlOVDMyCQlMMlBBRDoxOwotCVVJTlQzMgkJQU1QRFU6MTsKLQlVSU5UMzIJCURlY3J5cHRlZDoxOwkvLyB0aGlzIGZyYW1lIGlzIGJlaW5nIGRlY3J5cHRlZC4KLQlVSU5UMzIJCVBsY3BTaWduYWw6MTsJCS8vIFRvIGJlIG1vdmVkCi0JVUlOVDMyCQlQbGNwUnNzaWw6MTsvLyBUbyBiZSBtb3ZlZAotCVVJTlQzMgkJUnN2MToxMzsKLX0JUlhEX1NUUlVDLCAqUFJYRF9TVFJVQywgUlQyOFhYX1JYRF9TVFJVQywgKlBSVDI4WFhfUlhEX1NUUlVDOwotI2VuZGlmIC8qIFJUMjg2MCAqLwotCi0vLwotLy8gUlhXSSB3aXJlbGVzcyBpbmZvcm1hdGlvbiBmb3JtYXQsIGluIFBCRi4gaW52aXNpYmxlIGluIGRyaXZlci4KLS8vCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1JYV0lfU1RSVUMgewotCS8vIFdvcmQJMAotCVVJTlQzMgkJV2lyZWxlc3NDbGlJRDo4OwotCVVJTlQzMgkJS2V5SW5kZXg6MjsKLQlVSU5UMzIJCUJTU0lEOjM7Ci0JVUlOVDMyCQlVREY6MzsKLQlVSU5UMzIJCU1QRFV0b3RhbEJ5dGVDb3VudDoxMjsKLQlVSU5UMzIJCVRJRDo0OwotCS8vIFdvcmQJMQotCVVJTlQzMgkJRlJBRzo0OwotCVVJTlQzMgkJU0VRVUVOQ0U6MTI7Ci0JVUlOVDMyCQlNQ1M6NzsKLQlVSU5UMzIJCUJXOjE7Ci0JVUlOVDMyCQlTaG9ydEdJOjE7Ci0JVUlOVDMyCQlTVEJDOjI7Ci0JVUlOVDMyCQlyc3Y6MzsKLQlVSU5UMzIJCVBIWU1PREU6MjsgICAgICAgICAgICAgIC8vIDE6IHRoaXMgUlggZnJhbWUgaXMgdW5pY2FzdCB0byBtZQotCS8vV29yZDIKLQlVSU5UMzIJCVJTU0kwOjg7Ci0JVUlOVDMyCQlSU1NJMTo4OwotCVVJTlQzMgkJUlNTSTI6ODsKLQlVSU5UMzIJCXJzdjE6ODsKLQkvL1dvcmQzCi0JVUlOVDMyCQlTTlIwOjg7Ci0JVUlOVDMyCQlTTlIxOjg7Ci0JVUlOVDMyCQlyc3YyOjE2OwotfQlSWFdJX1NUUlVDLCAqUFJYV0lfU1RSVUM7Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gSE9TVC1NQ1UgY29tbXVuaWNhdGlvbiBkYXRhIHN0cnVjdHVyZQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vCi0vLyBIMk1fTUFJTEJPWF9DU1I6IEhvc3QtdG8tTUNVIE1haWxib3gKLS8vCi10eXBlZGVmIHVuaW9uICBfSDJNX01BSUxCT1hfU1RSVUMgewotICAgIHN0cnVjdCB7Ci0gICAgICAgIFVJTlQzMiAgICAgICBMb3dCeXRlOjg7Ci0gICAgICAgIFVJTlQzMiAgICAgICBIaWdoQnl0ZTo4OwotICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW46ODsKLSAgICAgICAgVUlOVDMyICAgICAgIE93bmVyOjg7Ci0gICAgfSAgIGZpZWxkOwotICAgIFVJTlQzMiAgICAgICAgICAgd29yZDsKLX0gSDJNX01BSUxCT1hfU1RSVUMsICpQSDJNX01BSUxCT1hfU1RSVUM7Ci0KLS8vCi0vLyBNMkhfQ01EX0RPTkVfQ1NSOiBNQ1UtdG8tSG9zdCBjb21tYW5kIGNvbXBsZXRlIGluZGljYXRpb24KLS8vCi10eXBlZGVmIHVuaW9uIF9NMkhfQ01EX0RPTkVfU1RSVUMgewotICAgIHN0cnVjdCAgewotICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW4wOwotICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW4xOwotICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW4yOwotICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW4zOwotICAgIH0gZmllbGQ7Ci0gICAgVUlOVDMyICAgICAgICAgICB3b3JkOwotfSBNMkhfQ01EX0RPTkVfU1RSVUMsICpQTTJIX0NNRF9ET05FX1NUUlVDOwotCi0vLwotLy8gTUNVX0xFRENTOiBNQ1UgTEVEIENvbnRyb2wgU2V0dGluZy4KLS8vCi10eXBlZGVmIHVuaW9uICBfTUNVX0xFRENTX1NUUlVDIHsKLQlzdHJ1Y3QJewotCQlVQ0hBUgkJTGVkTW9kZTo3OwotCQlVQ0hBUgkJUG9sYXJpdHk6MTsKLQl9IGZpZWxkOwotCVVDSEFSCQkJd29yZDsKLX0gTUNVX0xFRENTX1NUUlVDLCAqUE1DVV9MRURDU19TVFJVQzsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBSZWdpc3RlciBmb3JtYXQKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLQotLy9OQVZfVElNRV9DRkcgOk5BVgotdHlwZWRlZgl1bmlvbglfTkFWX1RJTUVfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVQ0hBUgkJU2lmczsgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIDEtdXMKLQkJVUNIQVIgICAgICAgU2xvdFRpbWU7ICAgIC8vIGluIHVuaXQgb2YgMS11cwotCQlVU0hPUlQJCUVpZnM6OTsgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIDEtdXMKLQkJVVNIT1JUCQlaZXJvU2lmczoxOyAgICAgICAgICAgICAgIC8vIEFwcGxpZWQgemVybyBTSUZTIHRpbWVyIGFmdGVyIE9GRE0gUlggMDogZGlzYWJsZQotCQlVU0hPUlQJCXJzdjo2OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JTkFWX1RJTUVfQ0ZHX1NUUlVDLCAqUE5BVl9USU1FX0NGR19TVFJVQzsKLQotLy8KLS8vIFJYX0ZJTFRSX0NGRzogIC9SWCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCi0vLwotdHlwZWRlZgl1bmlvbglfUlhfRklMVFJfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCURyb3BDUkNFcnI6MTsJCS8vIERyb3AgQ1JDIGVycm9yCi0JCVVJTlQzMgkJRHJvcFBoeUVycjoxOwkJLy8gRHJvcCBwaHlzaWNhbCBlcnJvcgotCQlVSU5UMzIJCURyb3BOb3RUb01lOjE7CQkvLyBEcm9wIG5vdCB0byBtZSB1bmljYXN0IGZyYW1lCi0JCVVJTlQzMgkJRHJvcE5vdE15QlNTSUQ6MTsJCQkvLyBEcm9wIGZyYW0gVG9EcyBiaXQgaXMgdHJ1ZQotCi0JCVVJTlQzMgkJRHJvcFZlckVycjoxOwkgICAgLy8gRHJvcCB2ZXJzaW9uIGVycm9yIGZyYW1lCi0JCVVJTlQzMgkJRHJvcE1jYXN0OjE7CQkvLyBEcm9wIG11bHRpY2FzdCBmcmFtZXMKLQkJVUlOVDMyCQlEcm9wQmNhc3Q6MTsJCS8vIERyb3AgYnJvYWRjYXN0IGZyYW1lcwotCQlVSU5UMzIJCURyb3BEdXBsaWNhdGU6MTsJCS8vIERyb3AgZHVwbGljYXRlIGZyYW1lCi0KLQkJVUlOVDMyCQlEcm9wQ0ZFbmRBY2s6MTsJCS8vIERyb3AgUHMtUG9sbAotCQlVSU5UMzIJCURyb3BDRkVuZDoxOwkJLy8gRHJvcCBQcy1Qb2xsCi0JCVVJTlQzMgkJRHJvcEFjazoxOwkJLy8gRHJvcCBQcy1Qb2xsCi0JCVVJTlQzMgkJRHJvcEN0czoxOwkJLy8gRHJvcCBQcy1Qb2xsCi0KLQkJVUlOVDMyCQlEcm9wUnRzOjE7CQkvLyBEcm9wIFBzLVBvbGwKLQkJVUlOVDMyCQlEcm9wUHNQb2xsOjE7CQkvLyBEcm9wIFBzLVBvbGwKLQkJVUlOVDMyCQlEcm9wQkE6MTsJCS8vCi0gICAgICAgIAlVSU5UMzIgICAgICAgCURyb3BCQVI6MTsgICAgICAgLy8KLQotCQlVSU5UMzIgICAgICAgCURyb3BSc3ZDbnRsVHlwZToxOwotCQlVSU5UMzIJCToxNTsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVJYX0ZJTFRSX0NGR19TVFJVQywgKlBSWF9GSUxUUl9DRkdfU1RSVUM7Ci0KLS8vCi0vLyBQSFlfQ1NSNDogUkYgc2VyaWFsIGNvbnRyb2wgcmVnaXN0ZXIKLS8vCi10eXBlZGVmCXVuaW9uCV9QSFlfQ1NSNF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSRlJlZ1ZhbHVlOjI0OwkJLy8gUmVnaXN0ZXIJdmFsdWUgKGluY2x1ZGUgcmVnaXN0ZXIJaWQpCXNlcmlhbCBvdXQgdG8gUkYvSUYJY2hpcC4KLQkJVUlOVDMyCQlOdW1iZXJPZkJpdHM6NTsJCS8vIE51bWJlciBvZiBiaXRzIHVzZWQgaW4gUkZSZWdWYWx1ZSAoSToyMCwJUkZNRDoyMikKLQkJVUlOVDMyCQlJRlNlbGVjdDoxOwkJCS8vIDE6IHNlbGVjdCBJRgl0byBwcm9ncmFtLAkwOiBzZWxlY3QgUkYgdG8JcHJvZ3JhbQotCQlVSU5UMzIJCVBMTF9MRDoxOwkJCS8vIFJGIFBMTF9MRCBzdGF0dXMKLQkJVUlOVDMyCQlCdXN5OjE7CQkJCS8vIDE6IEFTSUMgaXMgYnVzeSBleGVjdXRlIFJGIHByb2dyYW1taW5nLgotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUEhZX0NTUjRfU1RSVUMsICpQUEhZX0NTUjRfU1RSVUM7Ci0KLS8vCi0vLyBTRUNfQ1NSNTogc2hhcmVkIGtleSB0YWJsZSBzZWN1cml0eSBtb2RlIHJlZ2lzdGVyCi0vLwotdHlwZWRlZgl1bmlvbglfU0VDX0NTUjVfU1RSVUMJewotCXN0cnVjdAl7Ci0gICAgICAgIFVJTlQzMiAgICAgICBCc3MyS2V5MENpcGhlckFsZzozOwotICAgICAgICBVSU5UMzIgICAgICAgOjE7Ci0gICAgICAgIFVJTlQzMiAgICAgICBCc3MyS2V5MUNpcGhlckFsZzozOwotICAgICAgICBVSU5UMzIgICAgICAgOjE7Ci0gICAgICAgIFVJTlQzMiAgICAgICBCc3MyS2V5MkNpcGhlckFsZzozOwotICAgICAgICBVSU5UMzIgICAgICAgOjE7Ci0gICAgICAgIFVJTlQzMiAgICAgICBCc3MyS2V5M0NpcGhlckFsZzozOwotICAgICAgICBVSU5UMzIgICAgICAgOjE7Ci0gICAgICAgIFVJTlQzMiAgICAgICBCc3MzS2V5MENpcGhlckFsZzozOwotICAgICAgICBVSU5UMzIgICAgICAgOjE7Ci0gICAgICAgIFVJTlQzMiAgICAgICBCc3MzS2V5MUNpcGhlckFsZzozOwotICAgICAgICBVSU5UMzIgICAgICAgOjE7Ci0gICAgICAgIFVJTlQzMiAgICAgICBCc3MzS2V5MkNpcGhlckFsZzozOwotICAgICAgICBVSU5UMzIgICAgICAgOjE7Ci0gICAgICAgIFVJTlQzMiAgICAgICBCc3MzS2V5M0NpcGhlckFsZzozOwotICAgICAgICBVSU5UMzIgICAgICAgOjE7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlTRUNfQ1NSNV9TVFJVQywgKlBTRUNfQ1NSNV9TVFJVQzsKLQotLy8KLS8vIEhPU1RfQ01EX0NTUjogRm9yIEhPU1QgdG8gaW50ZXJydXB0IGVtYmVkZGVkIHByb2Nlc3NvcgotLy8KLXR5cGVkZWYJdW5pb24JX0hPU1RfQ01EX0NTUl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICAgSG9zdENvbW1hbmQ6ODsKLQkgICAgVUlOVDMyICAgUnN2OjI0OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JSE9TVF9DTURfQ1NSX1NUUlVDLCAqUEhPU1RfQ01EX0NTUl9TVFJVQzsKLQotLy8KLS8vIEFJRlNOX0NTUjogQUlGU04gZm9yIGVhY2ggRURDQSBBQwotLy8KLQotCi0KLS8vCi0vLyBFMlBST01fQ1NSOiBFRVBST00gY29udHJvbCByZWdpc3RlcgotLy8KLXR5cGVkZWYJdW5pb24JX0UyUFJPTV9DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJUmVsb2FkOjE7CQkvLyBSZWxvYWQgRUVQUk9NIGNvbnRlbnQsIHdyaXRlIG9uZSB0byByZWxvYWQsIHNlbGYtY2xlYXJlZC4KLQkJVUlOVDMyCQlFZXByb21TSzoxOwotCQlVSU5UMzIJCUVlcHJvbUNTOjE7Ci0JCVVJTlQzMgkJRWVwcm9tREk6MTsKLQkJVUlOVDMyCQlFZXByb21ETzoxOwotCQlVSU5UMzIJCVR5cGU6MTsJCQkvLyAxOiA5M0M0NiwgMDo5M0M2NgotCQlVSU5UMzIgICAgICAgTG9hZFN0YXR1czoxOyAgIC8vIDE6bG9hZGluZywgMDpkb25lCi0JCVVJTlQzMgkJUnN2ZDoyNTsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUUyUFJPTV9DU1JfU1RSVUMsICpQRTJQUk9NX0NTUl9TVFJVQzsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIEUyUFJPTSBkYXRhIGxheW91dAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLwotLy8gRUVQUk9NIGFudGVubmEgc2VsZWN0IGZvcm1hdAotLy8KLXR5cGVkZWYJdW5pb24JX0VFUFJPTV9BTlRFTk5BX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVU0hPUlQJCVJ4UGF0aDo0OwkvLyAxOiAxUiwgMjogMlIsIDM6IDNSCi0JCVVTSE9SVAkJVHhQYXRoOjQ7CS8vIDE6IDFULCAyOiAyVAotCQlVU0hPUlQgICAgICBSZkljVHlwZTo0OyAgICAgICAgICAgICAvLyBzZWUgRTJQUk9NIGRvY3VtZW50Ci0JCVVTSE9SVCAgICAgIFJzdjo0OwotCX0JZmllbGQ7Ci0JVVNIT1JUCQkJd29yZDsKLX0JRUVQUk9NX0FOVEVOTkFfU1RSVUMsICpQRUVQUk9NX0FOVEVOTkFfU1RSVUM7Ci0KLXR5cGVkZWYJdW5pb24gX0VFUFJPTV9OSUNfQ0lORklHMl9TVFJVQwl7Ci0Jc3RydWN0IHsKLQkJVVNIT1JUCQlIYXJkd2FyZVJhZGlvQ29udHJvbDoxOwkvLyAxOmVuYWJsZSwgMDpkaXNhYmxlCi0JCVVTSE9SVAkJRHluYW1pY1R4QWdjQ29udHJvbDoxOwkJCS8vCi0JCVVTSE9SVAkJRXh0ZXJuYWxMTkFGb3JHOjE7CQkJCS8vCi0JCVVTSE9SVAkJRXh0ZXJuYWxMTkFGb3JBOjE7CQkJLy8gZXh0ZXJuYWwgTE5BIGVuYWJsZSBmb3IgMi40RwotCQlVU0hPUlQJCUNhcmRidXNBY2NlbGVyYXRpb246MTsJLy8gISEhIE5PVEU6IDAgLSBlbmFibGUsIDEgLSBkaXNhYmxlCi0JCVVTSE9SVAkJQlc0ME1TaWRlYmFuZEZvckc6MTsKLQkJVVNIT1JUCQlCVzQwTVNpZGViYW5kRm9yQToxOwotCQlVU0hPUlQJCUVuYWJsZVdQU1BCQzoxOyAgICAgICAgICAgICAgICAgLy8gV1BTIFBCQyBDb250cm9sIGJpdAotCQlVU0hPUlQJCUJXNDBNQXZhaWxGb3JHOjE7CQkJLy8gMDplbmFibGUsIDE6ZGlzYWJsZQotCQlVU0hPUlQJCUJXNDBNQXZhaWxGb3JBOjE7CQkJLy8gMDplbmFibGUsIDE6ZGlzYWJsZQotCQlVU0hPUlQJCVJzdjE6MTsJCQkJCS8vIG11c3QgYmUgMAotCQlVU0hPUlQJCUFudERpdmVyc2l0eToxOwkJCS8vIEFudGVubmEgZGl2ZXJzaXR5Ci0JCVVTSE9SVAkJUnN2MjozOwkJCQkJLy8gbXVzdCBiZSAwCi0JCVVTSE9SVAkJREFDVGVzdEJpdDoxOwkJCS8vIGNvbnRyb2wgaWYgZHJpdmVyIHNob3VsZCBwYXRjaCB0aGUgREFDIGlzc3VlCi0JfQlmaWVsZDsKLQlVU0hPUlQJCQl3b3JkOwotfQlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMsICpQRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDOwotCi0vLwotLy8gVFhfUFdSIFZhbHVlIHZhbGlkIHJhbmdlIDB4RkEoLTYpIH4gMHgyNCgzNikKLS8vCi10eXBlZGVmCXVuaW9uCV9FRVBST01fVFhfUFdSX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlDSEFSCUJ5dGUwOwkJCQkvLyBMb3cgQnl0ZQotCQlDSEFSCUJ5dGUxOwkJCQkvLyBIaWdoIEJ5dGUKLQl9CWZpZWxkOwotCVVTSE9SVAl3b3JkOwotfQlFRVBST01fVFhfUFdSX1NUUlVDLCAqUEVFUFJPTV9UWF9QV1JfU1RSVUM7Ci0KLXR5cGVkZWYJdW5pb24JX0VFUFJPTV9WRVJTSU9OX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVQ0hBUglGYWVSZWxlYXNlTnVtYmVyOwkvLyBMb3cgQnl0ZQotCQlVQ0hBUglWZXJzaW9uOwkJCS8vIEhpZ2ggQnl0ZQotCX0JZmllbGQ7Ci0JVVNIT1JUCXdvcmQ7Ci19CUVFUFJPTV9WRVJTSU9OX1NUUlVDLCAqUEVFUFJPTV9WRVJTSU9OX1NUUlVDOwotCi10eXBlZGVmCXVuaW9uCV9FRVBST01fTEVEX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVU0hPUlQJUG9sYXJpdHlSRFlfRzoxOwkJLy8gUG9sYXJpdHkgUkRZX0cgc2V0dGluZy4KLQkJVVNIT1JUCVBvbGFyaXR5UkRZX0E6MTsJCS8vIFBvbGFyaXR5IFJEWV9BIHNldHRpbmcuCi0JCVVTSE9SVAlQb2xhcml0eUFDVDoxOwkJLy8gUG9sYXJpdHkgQUNUIHNldHRpbmcuCi0JCVVTSE9SVAlQb2xhcml0eUdQSU9fMDoxOwkvLyBQb2xhcml0eSBHUElPIzAgc2V0dGluZy4KLQkJVVNIT1JUCVBvbGFyaXR5R1BJT18xOjE7CS8vIFBvbGFyaXR5IEdQSU8jMSBzZXR0aW5nLgotCQlVU0hPUlQJUG9sYXJpdHlHUElPXzI6MTsJLy8gUG9sYXJpdHkgR1BJTyMyIHNldHRpbmcuCi0JCVVTSE9SVAlQb2xhcml0eUdQSU9fMzoxOwkvLyBQb2xhcml0eSBHUElPIzMgc2V0dGluZy4KLQkJVVNIT1JUCVBvbGFyaXR5R1BJT180OjE7CS8vIFBvbGFyaXR5IEdQSU8jNCBzZXR0aW5nLgotCQlVU0hPUlQJTGVkTW9kZTo1OwkJCS8vIExlZCBtb2RlLgotCQlVU0hPUlQJUnN2ZDozOwkJCQkvLyBSZXNlcnZlZAotCX0JZmllbGQ7Ci0JVVNIT1JUCXdvcmQ7Ci19CUVFUFJPTV9MRURfU1RSVUMsICpQRUVQUk9NX0xFRF9TVFJVQzsKLQotdHlwZWRlZgl1bmlvbglfRUVQUk9NX1RYUE9XRVJfREVMVEFfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVDSEFSCURlbHRhVmFsdWU6NjsJLy8gVHggUG93ZXIgZGFsdGEgdmFsdWUgKE1BWD00KQotCQlVQ0hBUglUeXBlOjE7CQkJLy8gMTogcGx1cyB0aGUgZGVsdGEgdmFsdWUsIDA6IG1pbnVzIHRoZSBkZWx0YSB2YWx1ZQotCQlVQ0hBUglUeFBvd2VyRW5hYmxlOjE7Ly8gRW5hYmxlCi0JfQlmaWVsZDsKLQlVQ0hBUgl2YWx1ZTsKLX0JRUVQUk9NX1RYUE9XRVJfREVMVEFfU1RSVUMsICpQRUVQUk9NX1RYUE9XRVJfREVMVEFfU1RSVUM7Ci0KLS8vCi0vLyBRT1NfQ1NSMDogVFhPUCBob2xkZXIgYWRkcmVzczAgcmVnaXN0ZXIKLS8vCi10eXBlZGVmCXVuaW9uCV9RT1NfQ1NSMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUNIQVIJCUJ5dGUwOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAwCi0JCVVDSEFSCQlCeXRlMTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMQotCQlVQ0hBUgkJQnl0ZTI7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDIKLQkJVUNIQVIJCUJ5dGUzOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAzCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlRT1NfQ1NSMF9TVFJVQywgKlBRT1NfQ1NSMF9TVFJVQzsKLQotLy8KLS8vIFFPU19DU1IxOiBUWE9QIGhvbGRlciBhZGRyZXNzMSByZWdpc3RlcgotLy8KLXR5cGVkZWYJdW5pb24JX1FPU19DU1IxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVQ0hBUgkJQnl0ZTQ7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDQKLQkJVUNIQVIJCUJ5dGU1OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA1Ci0JCVVDSEFSCQlSc3ZkMDsKLQkJVUNIQVIJCVJzdmQxOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUU9TX0NTUjFfU1RSVUMsICpQUU9TX0NTUjFfU1RSVUM7Ci0KLSNkZWZpbmUJUkZfQ1NSX0NGRwkweDUwMAotdHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGR19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVAlSRl9DU1JfREFUQTo4OwkJCS8vIERBVEEKLQkJVUlOVAlURVNUQ1NSX1JGQUNDX1JFR05VTTo1OwkvLyBSRiByZWdpc3RlciBJRAotCQlVSU5UCVJzdmQyOjM7CQkJCS8vIFJlc2VydmVkCi0JCVVJTlQJUkZfQ1NSX1dSOjE7CQkJLy8gMDogcmVhZCAgMTogd3JpdGUKLQkJVUlOVAlSRl9DU1JfS0lDSzoxOwkJCS8vIGtpY2sgUkYgcmVnaXN0ZXIgcmVhZC93cml0ZQotCQlVSU5UCVJzdmQxOjE0OwkJCQkvLyBSZXNlcnZlZAotCX0JZmllbGQ7Ci0JVUlOVAl3b3JkOwotfQlSRl9DU1JfQ0ZHX1NUUlVDLCAqUFJGX0NTUl9DRkdfU1RSVUM7Ci0KLSNlbmRpZgkvLyBfX1JUMjhYWF9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfY29uZmlnLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2NvbmZpZy5oCmluZGV4IDIwOTNhODAuLmQxYWRlZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfY29uZmlnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9jb25maWcuaApAQCAtNDEsMzIgKzQxLDMxIEBACiAjZGVmaW5lCV9fUlRfQ09ORklHX0hfXwogCiAjaW5jbHVkZSAgICAicnRtcF90eXBlLmgiCi0jaWZkZWYgTElOVVgKLSNpbmNsdWRlCSJydF9saW51eC5oIgotI2VuZGlmCi0jaW5jbHVkZSAgICAicnRtcF9kZWYuaCIKLSNpbmNsdWRlICAgICJydDI4eHguaCIKKyNpbmNsdWRlICJydG1wX29zLmgiCiAKLSNpZmRlZiBSVDI4NjAKLSNpbmNsdWRlCSJydDI4NjAuaCIKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotI2luY2x1ZGUJIi4uL3J0Mjg3MC9ydDI4NzAuaCIKLSNlbmRpZiAvLyBSVDI4NzAgLy8KKyNpbmNsdWRlICJydG1wX2RlZi5oIgorI2luY2x1ZGUgInJ0bXBfY2hpcC5oIgorI2luY2x1ZGUgInJ0bXBfdGltZXIuaCIKIAogI2luY2x1ZGUgICAgIm9pZC5oIgogI2luY2x1ZGUgICAgIm1sbWUuaCIKICNpbmNsdWRlICAgICJ3cGEuaCIKLSNpbmNsdWRlICAgICJtZDUuaCIKKyNpbmNsdWRlICJjcnlwdF9tZDUuaCIKKyNpbmNsdWRlICJjcnlwdF9zaGEyLmgiCisjaW5jbHVkZSAiY3J5cHRfaG1hYy5oIgogI2luY2x1ZGUgICAgInJ0bXAuaCIKICNpbmNsdWRlCSJhcC5oIgogI2luY2x1ZGUJImRmcy5oIgogI2luY2x1ZGUJImNobGlzdC5oIgogI2luY2x1ZGUJInNwZWN0cnVtLmgiCiAKKyNpbmNsdWRlICJlZXByb20uaCIKKyNpZiBkZWZpbmVkKFJUTVBfUENJX1NVUFBPUlQpIHx8IGRlZmluZWQoUlRNUF9VU0JfU1VQUE9SVCkKKyNpbmNsdWRlICJydG1wX21jdS5oIgorI2VuZGlmCisKICNpZmRlZiBJR01QX1NOT09QX1NVUFBPUlQKICNpbmNsdWRlICJpZ21wX3Nub29wLmgiCi0jZW5kaWYgLy8gSUdNUF9TTk9PUF9TVVBQT1JUIC8vCisjZW5kaWYgLyogSUdNUF9TTk9PUF9TVVBQT1JUIC8vICovCiAKLSNlbmRpZgkvLyBfX1JUX0NPTkZJR19IX18KLQorI2VuZGlmIC8qIF9fUlRfQ09ORklHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5jCmluZGV4IGVkMjdiODUuLjkzNTdmYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmMKQEAgLTI4LDE0OSArMjgsMTE0IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlICJydF9jb25maWcuaCIKIAotVUxPTkcJUlREZWJ1Z0xldmVsID0gUlRfREVCVUdfRVJST1I7Cit1bnNpZ25lZCBsb25nIFJURGVidWdMZXZlbCA9IFJUX0RFQlVHX0VSUk9SOwogCi1CVUlMRF9USU1FUl9GVU5DVElPTihNbG1lUGVyaW9kaWNFeGVjKTsKLUJVSUxEX1RJTUVSX0ZVTkNUSU9OKEFzaWNSeEFudEV2YWxUaW1lb3V0KTsKLUJVSUxEX1RJTUVSX0ZVTkNUSU9OKEFQU0RQZXJpb2RpY0V4ZWMpOwotQlVJTERfVElNRVJfRlVOQ1RJT04oQXNpY1JmVHVuaW5nRXhlYyk7Ci0jaWZkZWYgUlQyODcwCi1CVUlMRF9USU1FUl9GVU5DVElPTihCZWFjb25VcGRhdGVFeGVjKTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQotQlVJTERfVElNRVJfRlVOQ1RJT04oQmVhY29uVGltZW91dCk7Ci1CVUlMRF9USU1FUl9GVU5DVElPTihTY2FuVGltZW91dCk7Ci1CVUlMRF9USU1FUl9GVU5DVElPTihBdXRoVGltZW91dCk7Ci1CVUlMRF9USU1FUl9GVU5DVElPTihBc3NvY1RpbWVvdXQpOwotQlVJTERfVElNRVJfRlVOQ1RJT04oUmVhc3NvY1RpbWVvdXQpOwotQlVJTERfVElNRVJfRlVOQ1RJT04oRGlzYXNzb2NUaW1lb3V0KTsKLUJVSUxEX1RJTUVSX0ZVTkNUSU9OKExpbmtEb3duRXhlYyk7Ci1CVUlMRF9USU1FUl9GVU5DVElPTihTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKTsKLUJVSUxEX1RJTUVSX0ZVTkNUSU9OKFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKTsKLSNpZmRlZiBSVDI4NjAKLUJVSUxEX1RJTUVSX0ZVTkNUSU9OKFBzUG9sbFdha2VFeGVjKTsKLUJVSUxEX1RJTUVSX0ZVTkNUSU9OKFJhZGlvT25FeGVjKTsKLSNlbmRpZgotCi0vLyBmb3Igd2lyZWxlc3Mgc3lzdGVtIGV2ZW50IG1lc3NhZ2UKKy8qIGZvciB3aXJlbGVzcyBzeXN0ZW0gZXZlbnQgbWVzc2FnZSAqLwogY2hhciBjb25zdCAqcFdpcmVsZXNzU3lzRXZlbnRUZXh0W0lXX1NZU19FVkVOVF9UWVBFX05VTV0gPSB7Ci0JLy8gc3lzdGVtIHN0YXR1cyBldmVudAotICAgICJoYWQgYXNzb2NpYXRlZCBzdWNjZXNzZnVsbHkiLAkJCQkJCQkvKiBJV19BU1NPQ19FVkVOVF9GTEFHICovCi0gICAgImhhZCBkaXNhc3NvY2lhdGVkIiwJCQkJCQkJCQkvKiBJV19ESVNBU1NPQ19FVkVOVF9GTEFHICovCi0gICAgImhhZCBkZWF1dGhlbnRpY2F0ZWQiLAkJCQkJCQkJCS8qIElXX0RFQVVUSF9FVkVOVF9GTEFHICovCi0gICAgImhhZCBiZWVuIGFnZWQtb3V0IGFuZCBkaXNhc3NvY2lhdGVkIiwJCQkJCS8qIElXX0FHRU9VVF9FVkVOVF9GTEFHICovCi0gICAgIm9jY3VycmVkIENvdW50ZXJNZWFzdXJlcyBhdHRhY2siLAkJCQkJCS8qIElXX0NPVU5URVJfTUVBU1VSRVNfRVZFTlRfRkxBRyAqLwotICAgICJvY2N1cnJlZCByZXBsYXkgY291bnRlciBkaWZmZXJlbnQgaW4gS2V5IEhhbmRzaGFraW5nIiwJLyogSVdfUkVQTEFZX0NPVU5URVJfRElGRl9FVkVOVF9GTEFHICovCi0gICAgIm9jY3VycmVkIFJTTklFIGRpZmZlcmVudCBpbiBLZXkgSGFuZHNoYWtpbmciLAkJCS8qIElXX1JTTklFX0RJRkZfRVZFTlRfRkxBRyAqLwotICAgICJvY2N1cnJlZCBNSUMgZGlmZmVyZW50IGluIEtleSBIYW5kc2hha2luZyIsCQkJLyogSVdfTUlDX0RJRkZfRVZFTlRfRkxBRyAqLwotICAgICJvY2N1cnJlZCBJQ1YgZXJyb3IgaW4gUlgiLAkJCQkJCQkJLyogSVdfSUNWX0VSUk9SX0VWRU5UX0ZMQUcgKi8KLSAgICAib2NjdXJyZWQgTUlDIGVycm9yIGluIFJYIiwJCQkJCQkJCS8qIElXX01JQ19FUlJPUl9FVkVOVF9GTEFHICovCi0JIkdyb3VwIEtleSBIYW5kc2hha2luZyB0aW1lb3V0IiwJCQkJCQkvKiBJV19HUk9VUF9IU19USU1FT1VUX0VWRU5UX0ZMQUcgKi8KLQkiUGFpcndpc2UgS2V5IEhhbmRzaGFraW5nIHRpbWVvdXQiLAkJCQkJCS8qIElXX1BBSVJXSVNFX0hTX1RJTUVPVVRfRVZFTlRfRkxBRyAqLwotCSJSU04gSUUgc2FuaXR5IGNoZWNrIGZhaWx1cmUiLAkJCQkJCQkvKiBJV19SU05JRV9TQU5JVFlfRkFJTF9FVkVOVF9GTEFHICovCi0JInNldCBrZXkgZG9uZSBpbiBXUEEvV1BBUFNLIiwJCQkJCQkJLyogSVdfU0VUX0tFWV9ET05FX1dQQTFfRVZFTlRfRkxBRyAqLwotCSJzZXQga2V5IGRvbmUgaW4gV1BBMi9XUEEyUFNLIiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogSVdfU0VUX0tFWV9ET05FX1dQQTJfRVZFTlRfRkxBRyAqLwotCSJjb25uZWN0cyB3aXRoIG91ciB3aXJlbGVzcyBjbGllbnQiLCAgICAgICAgICAgICAgICAgICAgLyogSVdfU1RBX0xJTktVUF9FVkVOVF9GTEFHICovCi0JImRpc2Nvbm5lY3RzIHdpdGggb3VyIHdpcmVsZXNzIGNsaWVudCIsICAgICAgICAgICAgICAgICAvKiBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRyAqLwotCSJzY2FuIGNvbXBsZXRlZCIJCQkJCQkJCQkJLyogSVdfU0NBTl9DT01QTEVURURfRVZFTlRfRkxBRyAqLwotCSJzY2FuIHRlcm1pbmF0ZSEhIEJ1c3khISBFbnF1ZXVlIGZhaWwhISIJCQkJLyogSVdfU0NBTl9FTlFVRVVFX0ZBSUxfRVZFTlRfRkxBRyAqLwotCX07CisJLyogc3lzdGVtIHN0YXR1cyBldmVudCAqLworCSJoYWQgYXNzb2NpYXRlZCBzdWNjZXNzZnVsbHkiLAkvKiBJV19BU1NPQ19FVkVOVF9GTEFHICovCisJImhhZCBkaXNhc3NvY2lhdGVkIiwJLyogSVdfRElTQVNTT0NfRVZFTlRfRkxBRyAqLworCSJoYWQgZGVhdXRoZW50aWNhdGVkIiwJLyogSVdfREVBVVRIX0VWRU5UX0ZMQUcgKi8KKwkiaGFkIGJlZW4gYWdlZC1vdXQgYW5kIGRpc2Fzc29jaWF0ZWQiLAkvKiBJV19BR0VPVVRfRVZFTlRfRkxBRyAqLworCSJvY2N1cnJlZCBDb3VudGVyTWVhc3VyZXMgYXR0YWNrIiwJLyogSVdfQ09VTlRFUl9NRUFTVVJFU19FVkVOVF9GTEFHICovCisJIm9jY3VycmVkIHJlcGxheSBjb3VudGVyIGRpZmZlcmVudCBpbiBLZXkgSGFuZHNoYWtpbmciLAkvKiBJV19SRVBMQVlfQ09VTlRFUl9ESUZGX0VWRU5UX0ZMQUcgKi8KKwkib2NjdXJyZWQgUlNOSUUgZGlmZmVyZW50IGluIEtleSBIYW5kc2hha2luZyIsCS8qIElXX1JTTklFX0RJRkZfRVZFTlRfRkxBRyAqLworCSJvY2N1cnJlZCBNSUMgZGlmZmVyZW50IGluIEtleSBIYW5kc2hha2luZyIsCS8qIElXX01JQ19ESUZGX0VWRU5UX0ZMQUcgKi8KKwkib2NjdXJyZWQgSUNWIGVycm9yIGluIFJYIiwJLyogSVdfSUNWX0VSUk9SX0VWRU5UX0ZMQUcgKi8KKwkib2NjdXJyZWQgTUlDIGVycm9yIGluIFJYIiwJLyogSVdfTUlDX0VSUk9SX0VWRU5UX0ZMQUcgKi8KKwkiR3JvdXAgS2V5IEhhbmRzaGFraW5nIHRpbWVvdXQiLAkvKiBJV19HUk9VUF9IU19USU1FT1VUX0VWRU5UX0ZMQUcgKi8KKwkiUGFpcndpc2UgS2V5IEhhbmRzaGFraW5nIHRpbWVvdXQiLAkvKiBJV19QQUlSV0lTRV9IU19USU1FT1VUX0VWRU5UX0ZMQUcgKi8KKwkiUlNOIElFIHNhbml0eSBjaGVjayBmYWlsdXJlIiwJLyogSVdfUlNOSUVfU0FOSVRZX0ZBSUxfRVZFTlRfRkxBRyAqLworCSJzZXQga2V5IGRvbmUgaW4gV1BBL1dQQVBTSyIsCS8qIElXX1NFVF9LRVlfRE9ORV9XUEExX0VWRU5UX0ZMQUcgKi8KKwkic2V0IGtleSBkb25lIGluIFdQQTIvV1BBMlBTSyIsCS8qIElXX1NFVF9LRVlfRE9ORV9XUEEyX0VWRU5UX0ZMQUcgKi8KKwkiY29ubmVjdHMgd2l0aCBvdXIgd2lyZWxlc3MgY2xpZW50IiwJLyogSVdfU1RBX0xJTktVUF9FVkVOVF9GTEFHICovCisJImRpc2Nvbm5lY3RzIHdpdGggb3VyIHdpcmVsZXNzIGNsaWVudCIsCS8qIElXX1NUQV9MSU5LRE9XTl9FVkVOVF9GTEFHICovCisJInNjYW4gY29tcGxldGVkIgkvKiBJV19TQ0FOX0NPTVBMRVRFRF9FVkVOVF9GTEFHICovCisJICAgICJzY2FuIHRlcm1pbmF0ZSEgQnVzeSEgRW5xdWV1ZSBmYWlsISIJLyogSVdfU0NBTl9FTlFVRVVFX0ZBSUxfRVZFTlRfRkxBRyAqLworfTsKIAotLy8gZm9yIHdpcmVsZXNzIElEU19zcG9vZl9hdHRhY2sgZXZlbnQgbWVzc2FnZQorLyogZm9yIHdpcmVsZXNzIElEU19zcG9vZl9hdHRhY2sgZXZlbnQgbWVzc2FnZSAqLwogY2hhciBjb25zdCAqcFdpcmVsZXNzU3Bvb2ZFdmVudFRleHRbSVdfU1BPT0ZfRVZFTlRfVFlQRV9OVU1dID0gewotICAgICJkZXRlY3RlZCBjb25mbGljdCBTU0lEIiwJCQkJCQkJCS8qIElXX0NPTkZMSUNUX1NTSURfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCBzcG9vZmVkIGFzc29jaWF0aW9uIHJlc3BvbnNlIiwJCQkJLyogSVdfU1BPT0ZfQVNTT0NfUkVTUF9FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIHNwb29mZWQgcmVhc3NvY2lhdGlvbiByZXNwb25zZXMiLAkJCQkvKiBJV19TUE9PRl9SRUFTU09DX1JFU1BfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCBzcG9vZmVkIHByb2JlIHJlc3BvbnNlIiwJCQkJCQkvKiBJV19TUE9PRl9QUk9CRV9SRVNQX0VWRU5UX0ZMQUcgKi8KLSAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBiZWFjb24iLAkJCQkJCQkJLyogSVdfU1BPT0ZfQkVBQ09OX0VWRU5UX0ZMQUcgKi8KLSAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBkaXNhc3NvY2lhdGlvbiIsCQkJCQkJLyogSVdfU1BPT0ZfRElTQVNTT0NfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCBzcG9vZmVkIGF1dGhlbnRpY2F0aW9uIiwJCQkJCQkvKiBJV19TUE9PRl9BVVRIX0VWRU5UX0ZMQUcgKi8KLSAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBkZWF1dGhlbnRpY2F0aW9uIiwJCQkJCS8qIElXX1NQT09GX0RFQVVUSF9FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIHNwb29mZWQgdW5rbm93biBtYW5hZ2VtZW50IGZyYW1lIiwJCQkvKiBJV19TUE9PRl9VTktOT1dOX01HTVRfRVZFTlRfRkxBRyAqLwotCSJkZXRlY3RlZCByZXBsYXkgYXR0YWNrIgkJCQkJCQkJLyogSVdfUkVQTEFZX0FUVEFDS19FVkVOVF9GTEFHICovCi0JfTsKKwkiZGV0ZWN0ZWQgY29uZmxpY3QgU1NJRCIsCS8qIElXX0NPTkZMSUNUX1NTSURfRVZFTlRfRkxBRyAqLworCSJkZXRlY3RlZCBzcG9vZmVkIGFzc29jaWF0aW9uIHJlc3BvbnNlIiwJLyogSVdfU1BPT0ZfQVNTT0NfUkVTUF9FVkVOVF9GTEFHICovCisJImRldGVjdGVkIHNwb29mZWQgcmVhc3NvY2lhdGlvbiByZXNwb25zZXMiLAkvKiBJV19TUE9PRl9SRUFTU09DX1JFU1BfRVZFTlRfRkxBRyAqLworCSJkZXRlY3RlZCBzcG9vZmVkIHByb2JlIHJlc3BvbnNlIiwJLyogSVdfU1BPT0ZfUFJPQkVfUkVTUF9FVkVOVF9GTEFHICovCisJImRldGVjdGVkIHNwb29mZWQgYmVhY29uIiwJLyogSVdfU1BPT0ZfQkVBQ09OX0VWRU5UX0ZMQUcgKi8KKwkiZGV0ZWN0ZWQgc3Bvb2ZlZCBkaXNhc3NvY2lhdGlvbiIsCS8qIElXX1NQT09GX0RJU0FTU09DX0VWRU5UX0ZMQUcgKi8KKwkiZGV0ZWN0ZWQgc3Bvb2ZlZCBhdXRoZW50aWNhdGlvbiIsCS8qIElXX1NQT09GX0FVVEhfRVZFTlRfRkxBRyAqLworCSJkZXRlY3RlZCBzcG9vZmVkIGRlYXV0aGVudGljYXRpb24iLAkvKiBJV19TUE9PRl9ERUFVVEhfRVZFTlRfRkxBRyAqLworCSJkZXRlY3RlZCBzcG9vZmVkIHVua25vd24gbWFuYWdlbWVudCBmcmFtZSIsCS8qIElXX1NQT09GX1VOS05PV05fTUdNVF9FVkVOVF9GTEFHICovCisJImRldGVjdGVkIHJlcGxheSBhdHRhY2siCS8qIElXX1JFUExBWV9BVFRBQ0tfRVZFTlRfRkxBRyAqLworfTsKIAotLy8gZm9yIHdpcmVsZXNzIElEU19mbG9vZGluZ19hdHRhY2sgZXZlbnQgbWVzc2FnZQorLyogZm9yIHdpcmVsZXNzIElEU19mbG9vZGluZ19hdHRhY2sgZXZlbnQgbWVzc2FnZSAqLwogY2hhciBjb25zdCAqcFdpcmVsZXNzRmxvb2RFdmVudFRleHRbSVdfRkxPT0RfRVZFTlRfVFlQRV9OVU1dID0gewotCSJkZXRlY3RlZCBhdXRoZW50aWNhdGlvbiBmbG9vZGluZyIsCQkJCQkJLyogSVdfRkxPT0RfQVVUSF9FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIGFzc29jaWF0aW9uIHJlcXVlc3QgZmxvb2RpbmciLAkJCQkvKiBJV19GTE9PRF9BU1NPQ19SRVFfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCByZWFzc29jaWF0aW9uIHJlcXVlc3QgZmxvb2RpbmciLAkJCQkvKiBJV19GTE9PRF9SRUFTU09DX1JFUV9FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIHByb2JlIHJlcXVlc3QgZmxvb2RpbmciLAkJCQkJCS8qIElXX0ZMT09EX1BST0JFX1JFUV9FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIGRpc2Fzc29jaWF0aW9uIGZsb29kaW5nIiwJCQkJCQkvKiBJV19GTE9PRF9ESVNBU1NPQ19FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIGRlYXV0aGVudGljYXRpb24gZmxvb2RpbmciLAkJCQkJLyogSVdfRkxPT0RfREVBVVRIX0VWRU5UX0ZMQUcgKi8KLSAgICAiZGV0ZWN0ZWQgODAyLjF4IGVhcC1yZXF1ZXN0IGZsb29kaW5nIgkJCQkJLyogSVdfRkxPT0RfRUFQX1JFUV9FVkVOVF9GTEFHICovCi0JfTsKKwkiZGV0ZWN0ZWQgYXV0aGVudGljYXRpb24gZmxvb2RpbmciLAkvKiBJV19GTE9PRF9BVVRIX0VWRU5UX0ZMQUcgKi8KKwkiZGV0ZWN0ZWQgYXNzb2NpYXRpb24gcmVxdWVzdCBmbG9vZGluZyIsCS8qIElXX0ZMT09EX0FTU09DX1JFUV9FVkVOVF9GTEFHICovCisJImRldGVjdGVkIHJlYXNzb2NpYXRpb24gcmVxdWVzdCBmbG9vZGluZyIsCS8qIElXX0ZMT09EX1JFQVNTT0NfUkVRX0VWRU5UX0ZMQUcgKi8KKwkiZGV0ZWN0ZWQgcHJvYmUgcmVxdWVzdCBmbG9vZGluZyIsCS8qIElXX0ZMT09EX1BST0JFX1JFUV9FVkVOVF9GTEFHICovCisJImRldGVjdGVkIGRpc2Fzc29jaWF0aW9uIGZsb29kaW5nIiwJLyogSVdfRkxPT0RfRElTQVNTT0NfRVZFTlRfRkxBRyAqLworCSJkZXRlY3RlZCBkZWF1dGhlbnRpY2F0aW9uIGZsb29kaW5nIiwJLyogSVdfRkxPT0RfREVBVVRIX0VWRU5UX0ZMQUcgKi8KKwkiZGV0ZWN0ZWQgODAyLjF4IGVhcC1yZXF1ZXN0IGZsb29kaW5nIgkvKiBJV19GTE9PRF9FQVBfUkVRX0VWRU5UX0ZMQUcgKi8KK307CiAKIC8qIHRpbWVvdXQgLS0gbXMgKi8KLVZPSUQgUlRNUF9TZXRQZXJpb2RpY1RpbWVyKAotCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIgKnBUaW1lciwKLQlJTgl1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit2b2lkIFJUTVBfU2V0UGVyaW9kaWNUaW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqIHBUaW1lciwKKwkJCSAgIElOIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKIHsKLQl0aW1lb3V0ID0gKCh0aW1lb3V0KkhaKSAvIDEwMDApOworCXRpbWVvdXQgPSAoKHRpbWVvdXQgKiBPU19IWikgLyAxMDAwKTsKIAlwVGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgdGltZW91dDsKIAlhZGRfdGltZXIocFRpbWVyKTsKIH0KIAogLyogY29udmVydCBOZGlzTUluaXRpYWxpemVUaW1lciAtLT4gUlRNUF9PU19Jbml0X1RpbWVyICovCi1WT0lEIFJUTVBfT1NfSW5pdF9UaW1lcigKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglORElTX01JTklQT1JUX1RJTUVSICpwVGltZXIsCi0JSU4JVElNRVJfRlVOQ1RJT04gZnVuY3Rpb24sCi0JSU4JUFZPSUQgZGF0YSkKK3ZvaWQgUlRNUF9PU19Jbml0X1RpbWVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCXN0cnVjdCB0aW1lcl9saXN0ICogcFRpbWVyLAorCQkJSU4gVElNRVJfRlVOQ1RJT04gZnVuY3Rpb24sIHZvaWQgKmRhdGEpCiB7CiAJaW5pdF90aW1lcihwVGltZXIpOwotICAgIHBUaW1lci0+ZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRhdGE7Ci0gICAgcFRpbWVyLT5mdW5jdGlvbiA9IGZ1bmN0aW9uOworCXBUaW1lci0+ZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRhdGE7CisJcFRpbWVyLT5mdW5jdGlvbiA9IGZ1bmN0aW9uOwogfQogCi0KLVZPSUQgUlRNUF9PU19BZGRfVGltZXIoCi0JSU4JTkRJU19NSU5JUE9SVF9USU1FUgkJKnBUaW1lciwKLQlJTgl1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit2b2lkIFJUTVBfT1NfQWRkX1RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICogcFRpbWVyLAorCQkgICAgICAgSU4gdW5zaWduZWQgbG9uZyB0aW1lb3V0KQogewogCWlmICh0aW1lcl9wZW5kaW5nKHBUaW1lcikpCiAJCXJldHVybjsKIAotCXRpbWVvdXQgPSAoKHRpbWVvdXQqSFopIC8gMTAwMCk7CisJdGltZW91dCA9ICgodGltZW91dCAqIE9TX0haKSAvIDEwMDApOwogCXBUaW1lci0+ZXhwaXJlcyA9IGppZmZpZXMgKyB0aW1lb3V0OwogCWFkZF90aW1lcihwVGltZXIpOwogfQogCi1WT0lEIFJUTVBfT1NfTW9kX1RpbWVyKAotCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJCSpwVGltZXIsCi0JSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KQordm9pZCBSVE1QX09TX01vZF9UaW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqIHBUaW1lciwKKwkJICAgICAgIElOIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKIHsKLQl0aW1lb3V0ID0gKCh0aW1lb3V0KkhaKSAvIDEwMDApOworCXRpbWVvdXQgPSAoKHRpbWVvdXQgKiBPU19IWikgLyAxMDAwKTsKIAltb2RfdGltZXIocFRpbWVyLCBqaWZmaWVzICsgdGltZW91dCk7CiB9CiAKLVZPSUQgUlRNUF9PU19EZWxfVGltZXIoCi0JSU4JTkRJU19NSU5JUE9SVF9USU1FUgkJKnBUaW1lciwKLQlPVVQJQk9PTEVBTgkJCQkJKnBDYW5jZWxsZWQpCit2b2lkIFJUTVBfT1NfRGVsX1RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICogcFRpbWVyLAorCQkgICAgICAgT1VUIEJPT0xFQU4gKiBwQ2FuY2VsbGVkKQogewotCWlmICh0aW1lcl9wZW5kaW5nKHBUaW1lcikpCi0JeworCWlmICh0aW1lcl9wZW5kaW5nKHBUaW1lcikpIHsKIAkJKnBDYW5jZWxsZWQgPSBkZWxfdGltZXJfc3luYyhwVGltZXIpOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCSpwQ2FuY2VsbGVkID0gVFJVRTsKIAl9CiAKIH0KIAotVk9JRCBSVE1QX09TX1JlbGVhc2VfUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVBRVUVVRV9FTlRSWSAgcEVudHJ5KQordm9pZCBSVE1QX09TX1JlbGVhc2VfUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICpwRW50cnkpCiB7Ci0JLy9SVE1QRnJlZU5kaXNQYWNrZXQocEFkLCAoc3RydWN0IHNrX2J1ZmYgKilwRW50cnkpOworCS8qUlRNUEZyZWVOZGlzUGFja2V0KHBBZCwgKHN0cnVjdCBza19idWZmICopcEVudHJ5KTsgKi8KIH0KIAotLy8gVW5pZnkgYWxsIGRlbGF5IHJvdXRpbmUgYnkgdXNpbmcgdWRlbGF5Ci1WT0lEIFJUTVB1c2VjRGVsYXkoCi0JSU4JVUxPTkcJdXNlYykKKy8qIFVuaWZ5IGFsbCBkZWxheSByb3V0aW5lIGJ5IHVzaW5nIHVkZWxheSAqLwordm9pZCBSVE1QdXNlY0RlbGF5KHVuc2lnbmVkIGxvbmcgdXNlYykKIHsKLQlVTE9ORwlpOworCXVuc2lnbmVkIGxvbmcgaTsKIAogCWZvciAoaSA9IDA7IGkgPCAodXNlYyAvIDUwKTsgaSsrKQogCQl1ZGVsYXkoNTApOwpAQCAtMTc5LDI4ICsxNDQsMjMgQEAKIAkJdWRlbGF5KHVzZWMgJSA1MCk7CiB9CiAKLXZvaWQgUlRNUF9HZXRDdXJyZW50U3lzdGVtVGltZShMQVJHRV9JTlRFR0VSICp0aW1lKQordm9pZCBSVE1QX0dldEN1cnJlbnRTeXN0ZW1UaW1lKExBUkdFX0lOVEVHRVIgKiB0aW1lKQogewogCXRpbWUtPnUuTG93UGFydCA9IGppZmZpZXM7CiB9CiAKLS8vIHBBZCBNVVNUIGFsbG93IHRvIGJlIE5VTEwKLU5ESVNfU1RBVFVTIG9zX2FsbG9jX21lbSgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQJUFVDSEFSICptZW0sCi0JSU4JVUxPTkcgIHNpemUpCisvKiBwQWQgTVVTVCBhbGxvdyB0byBiZSBOVUxMICovCitpbnQgb3NfYWxsb2NfbWVtKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggKiogbWVtLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7Ci0JKm1lbSA9IChQVUNIQVIpIGttYWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7CisJKm1lbSA9ICh1OCAqKWttYWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7CiAJaWYgKCptZW0pCiAJCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7CiAJZWxzZQogCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogfQogCi0vLyBwQWQgTVVTVCBhbGxvdyB0byBiZSBOVUxMCi1ORElTX1NUQVRVUyBvc19mcmVlX21lbSgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglQVUNIQVIgbWVtKQorLyogcEFkIE1VU1QgYWxsb3cgdG8gYmUgTlVMTCAqLworaW50IG9zX2ZyZWVfbWVtKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdm9pZCAqbWVtKQogewogCiAJQVNTRVJUKG1lbSk7CkBAIC0yMDgsNjYgKzE2OCw2NCBAQAogCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7CiB9CiAKK3ZvaWQgKlJ0bXBPU05ldFBrdEFsbG9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgSU4gaW50IHNpemUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkvKiBBZGQgMiBtb3JlIGJ5dGVzIGZvciBpcCBoZWFkZXIgYWxpZ25tZW50ICovCisJc2tiID0gZGV2X2FsbG9jX3NrYihzaXplICsgMik7CiAKLVBORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlRnJhZ1BhY2tldEJ1ZmZlcigKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORwlMZW5ndGgpCisJcmV0dXJuICgodm9pZCAqKXNrYik7Cit9CisKK3ZvaWQgKlJUTVBfQWxsb2NhdGVGcmFnUGFja2V0QnVmZmVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJICAgdW5zaWduZWQgbG9uZyBMZW5ndGgpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnBrdDsKIAogCXBrdCA9IGRldl9hbGxvY19za2IoTGVuZ3RoKTsKIAotCWlmIChwa3QgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNhbid0IGFsbG9jYXRlIGZyYWcgcnggJWxkIHNpemUgcGFja2V0XG4iLExlbmd0aCkpOworCWlmIChwa3QgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoImNhbid0IGFsbG9jYXRlIGZyYWcgcnggJWxkIHNpemUgcGFja2V0XG4iLCBMZW5ndGgpKTsKIAl9CiAKLQlpZiAocGt0KQotCXsKKwlpZiAocGt0KSB7CiAJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocGt0KSwgUEtUU1JDX05ESVMpOwogCX0KIAotCXJldHVybiAoUE5ESVNfUEFDS0VUKSBwa3Q7CisJcmV0dXJuICh2b2lkICopcGt0OwogfQogCi0KLVBORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlVHhQYWNrZXRCdWZmZXIoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MpCit2b2lkICpSVE1QX0FsbG9jYXRlVHhQYWNrZXRCdWZmZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkgdW5zaWduZWQgbG9uZyBMZW5ndGgsCisJCQkJCSBJTiBCT09MRUFOIENhY2hlZCwKKwkJCQkJIHZvaWQgKiogVmlydHVhbEFkZHJlc3MpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnBrdDsKIAogCXBrdCA9IGRldl9hbGxvY19za2IoTGVuZ3RoKTsKIAotCWlmIChwa3QgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNhbid0IGFsbG9jYXRlIHR4ICVsZCBzaXplIHBhY2tldFxuIixMZW5ndGgpKTsKKwlpZiAocGt0ID09IE5VTEwpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJjYW4ndCBhbGxvY2F0ZSB0eCAlbGQgc2l6ZSBwYWNrZXRcbiIsIExlbmd0aCkpOwogCX0KIAotCWlmIChwa3QpCi0JeworCWlmIChwa3QpIHsKIAkJUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShPU1BLVF9UT19SVFBLVChwa3QpLCBQS1RTUkNfTkRJUyk7Ci0JCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRCkgcGt0LT5kYXRhOwotCX0KLQllbHNlCi0JewotCQkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpIE5VTEw7CisJCSpWaXJ0dWFsQWRkcmVzcyA9ICh2b2lkICopcGt0LT5kYXRhOworCX0gZWxzZSB7CisJCSpWaXJ0dWFsQWRkcmVzcyA9ICh2b2lkICopTlVMTDsKIAl9CiAKLQlyZXR1cm4gKFBORElTX1BBQ0tFVCkgcGt0OworCXJldHVybiAodm9pZCAqKXBrdDsKIH0KIAotCi1WT0lEIGJ1aWxkX3R4X3BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKLQlJTglQVUNIQVIJcEZyYW1lLAotCUlOCVVMT05HCUZyYW1lTGVuKQordm9pZCBidWlsZF90eF9wYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgIHZvaWQgKnBQYWNrZXQsCisJCSAgICAgdTggKnBGcmFtZSwgdW5zaWduZWQgbG9uZyBGcmFtZUxlbikKIHsKIAotCXN0cnVjdCBza19idWZmCSpwVHhQa3Q7CisJc3RydWN0IHNrX2J1ZmYgKnBUeFBrdDsKIAogCUFTU0VSVChwUGFja2V0KTsKIAlwVHhQa3QgPSBSVFBLVF9UT19PU1BLVChwUGFja2V0KTsKQEAgLTI3NSwzMiArMjMzLDM2IEBACiAJTmRpc01vdmVNZW1vcnkoc2tiX3B1dChwVHhQa3QsIEZyYW1lTGVuKSwgcEZyYW1lLCBGcmFtZUxlbik7CiB9CiAKLVZPSUQJUlRNUEZyZWVBZGFwdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQordm9pZCBSVE1QRnJlZUFkYXB0ZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotICAgIFBPU19DT09LSUUgb3NfY29va2llOworCXN0cnVjdCBvc19jb29raWUgKm9zX2Nvb2tpZTsKIAlpbnQgaW5kZXg7CiAKLQlvc19jb29raWU9KFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7CisJb3NfY29va2llID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKIAotCWtmcmVlKHBBZC0+QmVhY29uQnVmKTsKLQorCWlmIChwQWQtPkJlYWNvbkJ1ZikKKwkJa2ZyZWUocEFkLT5CZWFjb25CdWYpOwogCiAJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOwotI2lmZGVmIFJUMjg2MAorCisjaWZkZWYgUlRNUF9NQUNfUENJCiAJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5SeFJpbmdMb2NrKTsKLSNlbmRpZgotCWZvciAoaW5kZXggPTAgOyBpbmRleCA8IE5VTV9PRl9UWF9SSU5HOyBpbmRleCsrKQotCXsKLSAgICAJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5UeFN3UXVldWVMb2NrW2luZGV4XSk7CisjaWZkZWYgUlQzMDkwCisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5NY3VDbWRMb2NrKTsKKyNlbmRpZiAvKiBSVDMwOTAgLy8gKi8KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl9UWF9SSU5HOyBpbmRleCsrKSB7CisJCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+VHhTd1F1ZXVlTG9ja1tpbmRleF0pOwogCQlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPkRlUXVldWVMb2NrW2luZGV4XSk7CiAJCXBBZC0+RGVRdWV1ZVJ1bm5pbmdbaW5kZXhdID0gRkFMU0U7CiAJfQogCiAJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5pcnFfbG9jayk7CiAKLQl2ZnJlZShwQWQpOyAvLyBwY2lfZnJlZV9jb25zaXN0ZW50KG9zX2Nvb2tpZS0+cGNpX2RldixzaXplb2YoUlRNUF9BREFQVEVSKSxwQWQsb3NfY29va2llLT5wQWRfcGEpOwotCWtmcmVlKG9zX2Nvb2tpZSk7CisJdmZyZWUocEFkKTsJCS8qIHBjaV9mcmVlX2NvbnNpc3RlbnQob3NfY29va2llLT5wY2lfZGV2LHNpemVvZihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyKSxwQWQsb3NfY29va2llLT5wQWRfcGEpOyAqLworCWlmIChvc19jb29raWUpCisJCWtmcmVlKG9zX2Nvb2tpZSk7CiB9CiAKIEJPT0xFQU4gT1NfTmVlZF9DbG9uZV9QYWNrZXQodm9pZCkKQEAgLTMwOCw4ICsyNzAsNiBAQAogCXJldHVybiAoRkFMU0UpOwogfQogCi0KLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMzE3LDcgKzI3Nyw3IEBACiAJCWNsb25lIGFuIGlucHV0IE5ESVMgUEFDS0VUIHRvIGFub3RoZXIgb25lLiBUaGUgbmV3IGludGVybmFsbHkgY3JlYXRlZCBORElTIFBBQ0tFVAogCQltdXN0IGhhdmUgb25seSBvbmUgTkRJUyBCVUZGRVIKIAkJcmV0dXJuIC0gYnl0ZSBjb3BpZWQuIDAgbWVhbnMgY2FuJ3QgY3JlYXRlIE5ESVMgUEFDS0VUCi0JCU5PVEU6IGludGVybmFsbHkgY3JlYXRlZCBORElTX1BBQ0tFVCBzaG91bGQgYmUgZGVzdHJveWVkIGJ5IFJUTVBGcmVlTmRpc1BhY2tldAorCQlOT1RFOiBpbnRlcm5hbGx5IGNyZWF0ZWQgY2hhciBzaG91bGQgYmUgZGVzdHJveWVkIGJ5IFJUTVBGcmVlTmRpc1BhY2tldAogCiAJQXJndW1lbnRzOgogCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKQEAgLTMzMiwxMSArMjkyLDEwIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1ORElTX1NUQVRVUyBSVE1QQ2xvbmVOZGlzUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCUJPT0xFQU4JCQlwSW5zQU1TRFVIZHIsCi0JSU4JUE5ESVNfUEFDS0VUCXBJblBhY2tldCwKLQlPVVQgUE5ESVNfUEFDS0VUICAgKnBwT3V0UGFja2V0KQoraW50IFJUTVBDbG9uZU5kaXNQYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCUlOIEJPT0xFQU4gcEluc0FNU0RVSGRyLAorCQkJCXZvaWQgKnBJblBhY2tldCwKKwkJCQl2b2lkICoqIHBwT3V0UGFja2V0KQogewogCiAJc3RydWN0IHNrX2J1ZmYgKnBrdDsKQEAgLTM0NCwxOSArMzAzLDE4IEBACiAJQVNTRVJUKHBJblBhY2tldCk7CiAJQVNTRVJUKHBwT3V0UGFja2V0KTsKIAotCS8vIDEuIEFsbG9jYXRlIGEgcGFja2V0CisJLyogMS4gQWxsb2NhdGUgYSBwYWNrZXQgKi8KIAlwa3QgPSBkZXZfYWxsb2Nfc2tiKDIwNDgpOwogCi0JaWYgKHBrdCA9PSBOVUxMKQotCXsKKwlpZiAocGt0ID09IE5VTEwpIHsKIAkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CiAJfQogCi0gCXNrYl9wdXQocGt0LCBHRVRfT1NfUEtUX0xFTihwSW5QYWNrZXQpKTsKLQlOZGlzTW92ZU1lbW9yeShwa3QtPmRhdGEsIEdFVF9PU19QS1RfREFUQVBUUihwSW5QYWNrZXQpLCBHRVRfT1NfUEtUX0xFTihwSW5QYWNrZXQpKTsKKwlza2JfcHV0KHBrdCwgR0VUX09TX1BLVF9MRU4ocEluUGFja2V0KSk7CisJTmRpc01vdmVNZW1vcnkocGt0LT5kYXRhLCBHRVRfT1NfUEtUX0RBVEFQVFIocEluUGFja2V0KSwKKwkJICAgICAgIEdFVF9PU19QS1RfTEVOKHBJblBhY2tldCkpOwogCSpwcE91dFBhY2tldCA9IE9TUEtUX1RPX1JUUEtUKHBrdCk7CiAKLQogCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocGt0KSwgUEtUU1JDX05ESVMpOwogCiAJcHJpbnRrKCIjIyNDbG9uZSMjI1xuIik7CkBAIC0zNjQsNDIgKzMyMiw0MCBAQAogCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwogfQogCi0KLS8vIHRoZSBhbGxvY2F0ZWQgTkRJUyBQQUNLRVQgbXVzdCBiZSBmcmVlZCB2aWEgUlRNUEZyZWVOZGlzUGFja2V0KCkKLU5ESVNfU1RBVFVTIFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUIFBORElTX1BBQ0tFVCAgICpwcFBhY2tldCwKLQlJTglQVUNIQVIJCQlwSGVhZGVyLAotCUlOCVVJTlQJCQlIZWFkZXJMZW4sCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4JVUlOVAkJCURhdGFMZW4pCisvKiB0aGUgYWxsb2NhdGVkIE5ESVMgUEFDS0VUIG11c3QgYmUgZnJlZWQgdmlhIFJUTVBGcmVlTmRpc1BhY2tldCgpICovCitpbnQgUlRNUEFsbG9jYXRlTmRpc1BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgdm9pZCAqKiBwcFBhY2tldCwKKwkJCQkgICB1OCAqcEhlYWRlciwKKwkJCQkgICB1MzIgSGVhZGVyTGVuLAorCQkJCSAgIHU4ICpwRGF0YSwgdTMyIERhdGFMZW4pCiB7Ci0JUE5ESVNfUEFDS0VUCXBQYWNrZXQ7CisJdm9pZCAqcFBhY2tldDsKIAlBU1NFUlQocERhdGEpOwogCUFTU0VSVChEYXRhTGVuKTsKIAotCS8vIDEuIEFsbG9jYXRlIGEgcGFja2V0Ci0JcFBhY2tldCA9IChQTkRJU19QQUNLRVQgKikgZGV2X2FsbG9jX3NrYihIZWFkZXJMZW4gKyBEYXRhTGVuICsgVFhQQURESU5HX1NJWkUpOwotCWlmIChwUGFja2V0ID09IE5VTEwpCi0gCXsKKwkvKiAxLiBBbGxvY2F0ZSBhIHBhY2tldCAqLworCXBQYWNrZXQgPQorCSAgICAodm9pZCAqKikgZGV2X2FsbG9jX3NrYihIZWFkZXJMZW4gKyBEYXRhTGVuICsKKwkJCQkJICAgUlRNUF9QS1RfVEFJTF9QQURESU5HKTsKKwlpZiAocFBhY2tldCA9PSBOVUxMKSB7CiAJCSpwcFBhY2tldCA9IE5VTEw7CiAjaWZkZWYgREVCVUcKLQkJcHJpbnRrKCJSVE1QQWxsb2NhdGVOZGlzUGFja2V0IEZhaWxcblxuIik7CisJCXByaW50aygiUlRNUEFsbG9jYXRlTmRpc1BhY2tldCBGYWlsXG4iKTsKICNlbmRpZgogCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKIAl9Ci0KLQkvLyAyLiBjbG9uZSB0aGUgZnJhbWUgY29udGVudAorCS8qIDIuIGNsb25lIHRoZSBmcmFtZSBjb250ZW50ICovCiAJaWYgKEhlYWRlckxlbiA+IDApCiAJCU5kaXNNb3ZlTWVtb3J5KEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KSwgcEhlYWRlciwgSGVhZGVyTGVuKTsKIAlpZiAoRGF0YUxlbiA+IDApCi0JCU5kaXNNb3ZlTWVtb3J5KEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KSArIEhlYWRlckxlbiwgcERhdGEsIERhdGFMZW4pOworCQlOZGlzTW92ZU1lbW9yeShHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCkgKyBIZWFkZXJMZW4sIHBEYXRhLAorCQkJICAgICAgIERhdGFMZW4pOwogCi0JLy8gMy4gdXBkYXRlIGxlbmd0aCBvZiBwYWNrZXQKLSAJc2tiX3B1dChHRVRfT1NfUEtUX1RZUEUocFBhY2tldCksIEhlYWRlckxlbitEYXRhTGVuKTsKKwkvKiAzLiB1cGRhdGUgbGVuZ3RoIG9mIHBhY2tldCAqLworCXNrYl9wdXQoR0VUX09TX1BLVF9UWVBFKHBQYWNrZXQpLCBIZWFkZXJMZW4gKyBEYXRhTGVuKTsKIAogCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UocFBhY2tldCwgUEtUU1JDX05ESVMpOwotLy8JcHJpbnRrKCIlcyA6IHBQYWNrZXQgPSAlcCwgbGVuID0gJWRcbiIsIF9fZnVuY19fLCBwUGFja2V0LCBHRVRfT1NfUEtUX0xFTihwUGFja2V0KSk7CisvKiAgICAgIHByaW50aygiJXMgOiBwUGFja2V0ID0gJXAsIGxlbiA9ICVkXG4iLCBfX2Z1bmNfXywgcFBhY2tldCwgR0VUX09TX1BLVF9MRU4ocFBhY2tldCkpOyAqLwogCSpwcFBhY2tldCA9IHBQYWNrZXQ7CiAJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC00MDcsNDIgKzM2MywzNCBAQAogLyoKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIERlc2NyaXB0aW9uOgotCVRoaXMgcm91dGluZSBmcmVlcyBhIG1pbmlwb3J0IGludGVybmFsbHkgYWxsb2NhdGVkIE5ESVNfUEFDS0VUIGFuZCBpdHMKKwlUaGlzIHJvdXRpbmUgZnJlZXMgYSBtaW5pcG9ydCBpbnRlcm5hbGx5IGFsbG9jYXRlZCBjaGFyIGFuZCBpdHMKIAljb3JyZXNwb25kaW5nIE5ESVNfQlVGRkVSIGFuZCBhbGxvY2F0ZWQgbWVtb3J5LgogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIFJUTVBGcmVlTmRpc1BhY2tldCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQTkRJU19QQUNLRVQgIHBQYWNrZXQpCit2b2lkIFJUTVBGcmVlTmRpc1BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHZvaWQgKnBQYWNrZXQpCiB7CiAJZGV2X2tmcmVlX3NrYl9hbnkoUlRQS1RfVE9fT1NQS1QocFBhY2tldCkpOwogfQogCi0KLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotLy8gTk9URTogd2UgZG8gaGF2ZSBhbiBhc3N1bXB0aW9uIGhlcmUsIHRoYXQgQnl0ZTAgYW5kIEJ5dGUxIGFsd2F5cyByZWFzaWQgYXQgdGhlIHNhbWUKLS8vCQkJIHNjYXR0ZXIgZ2F0aGVyIGJ1ZmZlcgotTkRJU19TVEFUVVMgU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcigKLQlJTglQTkRJU19CVUZGRVIJcEZpcnN0QnVmZmVyLAotCUlOCVVDSEFSCQkJRGVzaXJlZE9mZnNldCwKLQlPVVQgUFVDSEFSCQkJcEJ5dGUwLAotCU9VVCBQVUNIQVIJCQlwQnl0ZTEpCisvKiBJUlFMID0gRElTUEFUQ0hfTEVWRUwgKi8KKy8qIE5PVEU6IHdlIGRvIGhhdmUgYW4gYXNzdW1wdGlvbiBoZXJlLCB0aGF0IEJ5dGUwIGFuZCBCeXRlMSBhbHdheXMgcmVhc2lkIGF0IHRoZSBzYW1lICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgc2NhdHRlciBnYXRoZXIgYnVmZmVyICovCitpbnQgU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcihjaGFyICpwRmlyc3RCdWZmZXIsCisJCQkJICAgICAgdTggRGVzaXJlZE9mZnNldCwKKwkJCQkgICAgICB1OCAqcEJ5dGUwLCB1OCAqcEJ5dGUxKQogewotICAgICpwQnl0ZTAgPSAqKFBVQ0hBUikocEZpcnN0QnVmZmVyICsgRGVzaXJlZE9mZnNldCk7Ci0gICAgKnBCeXRlMSA9ICooUFVDSEFSKShwRmlyc3RCdWZmZXIgKyBEZXNpcmVkT2Zmc2V0ICsgMSk7CisJKnBCeXRlMCA9ICoodTggKikocEZpcnN0QnVmZmVyICsgRGVzaXJlZE9mZnNldCk7CisJKnBCeXRlMSA9ICoodTggKikocEZpcnN0QnVmZmVyICsgRGVzaXJlZE9mZnNldCArIDEpOwogCiAJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLQotdm9pZCBSVE1QX1F1ZXJ5UGFja2V0SW5mbygKLQlJTiAgUE5ESVNfUEFDS0VUIHBQYWNrZXQsCi0JT1VUIFBBQ0tFVF9JTkZPICAqcFBhY2tldEluZm8sCi0JT1VUIFBVQ0hBUgkJICpwU3JjQnVmVkEsCi0JT1VUCVVJTlQJCSAqcFNyY0J1ZkxlbikKK3ZvaWQgUlRNUF9RdWVyeVBhY2tldEluZm8odm9pZCAqcFBhY2tldCwKKwkJCSAgc3RydWN0IHJ0X3BhY2tldF9pbmZvICpwUGFja2V0SW5mbywKKwkJCSAgdTggKiogcFNyY0J1ZlZBLCB1MzIgKiBwU3JjQnVmTGVuKQogewogCXBQYWNrZXRJbmZvLT5CdWZmZXJDb3VudCA9IDE7Ci0JcFBhY2tldEluZm8tPnBGaXJzdEJ1ZmZlciA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKwlwUGFja2V0SW5mby0+cEZpcnN0QnVmZmVyID0gKGNoYXIgKilHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CiAJcFBhY2tldEluZm8tPlBoeXNpY2FsQnVmZmVyQ291bnQgPSAxOwogCXBQYWNrZXRJbmZvLT5Ub3RhbFBhY2tldExlbmd0aCA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOwogCkBAIC00NTAsMzAgKzM5OCwyNiBAQAogCSpwU3JjQnVmTGVuID0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CiB9CiAKLXZvaWQgUlRNUF9RdWVyeU5leHRQYWNrZXRJbmZvKAotCUlOICBQTkRJU19QQUNLRVQgKnBwUGFja2V0LAotCU9VVCBQQUNLRVRfSU5GTyAgKnBQYWNrZXRJbmZvLAotCU9VVCBQVUNIQVIJCSAqcFNyY0J1ZlZBLAotCU9VVAlVSU5UCQkgKnBTcmNCdWZMZW4pCit2b2lkIFJUTVBfUXVlcnlOZXh0UGFja2V0SW5mbyh2b2lkICoqIHBwUGFja2V0LAorCQkJICAgICAgc3RydWN0IHJ0X3BhY2tldF9pbmZvICpwUGFja2V0SW5mbywKKwkJCSAgICAgIHU4ICoqIHBTcmNCdWZWQSwgdTMyICogcFNyY0J1ZkxlbikKIHsKLQlQTkRJU19QQUNLRVQgcFBhY2tldCA9IE5VTEw7CisJdm9pZCAqcFBhY2tldCA9IE5VTEw7CiAKIAlpZiAoKnBwUGFja2V0KQogCQlwUGFja2V0ID0gR0VUX09TX1BLVF9ORVhUKCpwcFBhY2tldCk7CiAKLQlpZiAocFBhY2tldCkKLQl7CisJaWYgKHBQYWNrZXQpIHsKIAkJcFBhY2tldEluZm8tPkJ1ZmZlckNvdW50ID0gMTsKLQkJcFBhY2tldEluZm8tPnBGaXJzdEJ1ZmZlciA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKwkJcFBhY2tldEluZm8tPnBGaXJzdEJ1ZmZlciA9CisJCSAgICAoY2hhciAqKUdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKIAkJcFBhY2tldEluZm8tPlBoeXNpY2FsQnVmZmVyQ291bnQgPSAxOwogCQlwUGFja2V0SW5mby0+VG90YWxQYWNrZXRMZW5ndGggPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKIAogCQkqcFNyY0J1ZlZBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOwogCQkqcFNyY0J1ZkxlbiA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOwogCQkqcHBQYWNrZXQgPSBHRVRfT1NfUEtUX05FWFQocFBhY2tldCk7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJcFBhY2tldEluZm8tPkJ1ZmZlckNvdW50ID0gMDsKIAkJcFBhY2tldEluZm8tPnBGaXJzdEJ1ZmZlciA9IE5VTEw7CiAJCXBQYWNrZXRJbmZvLT5QaHlzaWNhbEJ1ZmZlckNvdW50ID0gMDsKQEAgLTQ4NSwzNiArNDI5LDE5IEBACiAJfQogfQogCi0vLyBub3QgeWV0IHN1cHBvcnQgTUJTUwotUE5FVF9ERVYgZ2V0X25ldGRldl9mcm9tX2Jzc2lkKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit2b2lkICpEdXBsaWNhdGVQYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB2b2lkICpwUGFja2V0LCB1OCBGcm9tV2hpY2hCU1NJRCkKIHsKLSAgICBQTkVUX0RFViBkZXZfcCA9IE5VTEw7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl2b2lkICpwUmV0UGFja2V0ID0gTlVMTDsKKwl1MTYgRGF0YVNpemU7CisJdTggKnBEYXRhOwogCi0JZGV2X3AgPSBwQWQtPm5ldF9kZXY7Ci0KLQlBU1NFUlQoZGV2X3ApOwotCXJldHVybiBkZXZfcDsgLyogcmV0dXJuIG9uZSBvZiBNQlNTICovCi19Ci0KLVBORElTX1BBQ0tFVCBEdXBsaWNhdGVQYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOwotCVBORElTX1BBQ0tFVAlwUmV0UGFja2V0ID0gTlVMTDsKLQlVU0hPUlQJCQlEYXRhU2l6ZTsKLQlVQ0hBUgkJCSpwRGF0YTsKLQotCURhdGFTaXplID0gKFVTSE9SVCkgR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7Ci0JcERhdGEgPSAoUFVDSEFSKSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7Ci0KKwlEYXRhU2l6ZSA9ICh1MTYpR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisJcERhdGEgPSAodTggKilHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CiAKIAlza2IgPSBza2JfY2xvbmUoUlRQS1RfVE9fT1NQS1QocFBhY2tldCksIE1FTV9BTExPQ19GTEFHKTsKLQlpZiAoc2tiKQotCXsKKwlpZiAoc2tiKSB7CiAJCXNrYi0+ZGV2ID0gZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgRnJvbVdoaWNoQlNTSUQpOwogCQlwUmV0UGFja2V0ID0gT1NQS1RfVE9fUlRQS1Qoc2tiKTsKIAl9CkBAIC01MjMsMjQgKzQ1MCwyMSBAQAogCiB9CiAKLVBORElTX1BBQ0tFVCBkdXBsaWNhdGVfcGt0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKLSAgICBJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVTE9ORwkJCURhdGFTaXplLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit2b2lkICpkdXBsaWNhdGVfcGt0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHU4ICpwSGVhZGVyODAyXzMsCisJCQkgICB1MzIgSGRyTGVuLAorCQkJICAgdTggKnBEYXRhLAorCQkJICAgdW5zaWduZWQgbG9uZyBEYXRhU2l6ZSwgdTggRnJvbVdoaWNoQlNTSUQpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYJKnNrYjsKLQlQTkRJU19QQUNLRVQJcFBhY2tldCA9IE5VTEw7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl2b2lkICpwUGFja2V0ID0gTlVMTDsKIAotCi0JaWYgKChza2IgPSBfX2Rldl9hbGxvY19za2IoSGRyTGVuICsgRGF0YVNpemUgKyAyLCBNRU1fQUxMT0NfRkxBRykpICE9IE5VTEwpCi0JeworCWlmICgoc2tiID0KKwkgICAgIF9fZGV2X2FsbG9jX3NrYihIZHJMZW4gKyBEYXRhU2l6ZSArIDIsIE1FTV9BTExPQ19GTEFHKSkgIT0gTlVMTCkgewogCQlza2JfcmVzZXJ2ZShza2IsIDIpOwotCQlOZGlzTW92ZU1lbW9yeShza2JfdGFpbF9wb2ludGVyKHNrYiksIHBIZWFkZXI4MDJfMywgSGRyTGVuKTsKKwkJTmRpc01vdmVNZW1vcnkoc2tiLT50YWlsLCBwSGVhZGVyODAyXzMsIEhkckxlbik7CiAJCXNrYl9wdXQoc2tiLCBIZHJMZW4pOwotCQlOZGlzTW92ZU1lbW9yeShza2JfdGFpbF9wb2ludGVyKHNrYiksIHBEYXRhLCBEYXRhU2l6ZSk7CisJCU5kaXNNb3ZlTWVtb3J5KHNrYi0+dGFpbCwgcERhdGEsIERhdGFTaXplKTsKIAkJc2tiX3B1dChza2IsIERhdGFTaXplKTsKIAkJc2tiLT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBGcm9tV2hpY2hCU1NJRCk7CiAJCXBQYWNrZXQgPSBPU1BLVF9UT19SVFBLVChza2IpOwpAQCAtNTQ5LDI0ICs0NzMsMjIgQEAKIAlyZXR1cm4gcFBhY2tldDsKIH0KIAotCiAjZGVmaW5lIFRLSVBfVFhfTUlDX1NJWkUJCTgKLVBORElTX1BBQ0tFVCBkdXBsaWNhdGVfcGt0X3dpdGhfVEtJUF9NSUMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit2b2lkICpkdXBsaWNhdGVfcGt0X3dpdGhfVEtJUF9NSUMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkgdm9pZCAqcFBhY2tldCkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZgkqc2tiLCAqbmV3c2tiOwotCisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKm5ld3NrYjsKIAogCXNrYiA9IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpOwotCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IFRLSVBfVFhfTUlDX1NJWkUpCi0JewotCQkvLyBhbGxvYyBhIG5ldyBza2IgYW5kIGNvcHkgdGhlIHBhY2tldAotCQluZXdza2IgPSBza2JfY29weV9leHBhbmQoc2tiLCBza2JfaGVhZHJvb20oc2tiKSwgVEtJUF9UWF9NSUNfU0laRSwgR0ZQX0FUT01JQyk7CisJaWYgKHNrYl90YWlscm9vbShza2IpIDwgVEtJUF9UWF9NSUNfU0laRSkgeworCQkvKiBhbGxvYyBhIG5ldyBza2IgYW5kIGNvcHkgdGhlIHBhY2tldCAqLworCQluZXdza2IgPQorCQkgICAgc2tiX2NvcHlfZXhwYW5kKHNrYiwgc2tiX2hlYWRyb29tKHNrYiksIFRLSVBfVFhfTUlDX1NJWkUsCisJCQkJICAgIEdGUF9BVE9NSUMpOwogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQlpZiAobmV3c2tiID09IE5VTEwpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkV4dGVuZCBUeC5NSUMgZm9yIHBhY2tldCBmYWlsZWQhLCBkcm9wcGluZyBwYWNrZXQhXG4iKSk7CisJCWlmIChuZXdza2IgPT0gTlVMTCkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiRXh0ZW5kIFR4Lk1JQyBmb3IgcGFja2V0IGZhaWxlZCEsIGRyb3BwaW5nIHBhY2tldCFcbiIpKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCXNrYiA9IG5ld3NrYjsKQEAgLTU3NSw0NSArNDk3LDM3IEBACiAJcmV0dXJuIE9TUEtUX1RPX1JUUEtUKHNrYik7CiB9CiAKLQotCi0KLVBORElTX1BBQ0tFVCBDbG9uZVBhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVTE9ORwkJCURhdGFTaXplKQordm9pZCAqQ2xvbmVQYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHZvaWQgKnBQYWNrZXQsCisJCQkgdTggKnBEYXRhLCB1bnNpZ25lZCBsb25nIERhdGFTaXplKQogewotCXN0cnVjdCBza19idWZmCSpwUnhQa3Q7Ci0Jc3RydWN0IHNrX2J1ZmYJKnBDbG9uZWRQa3Q7CisJc3RydWN0IHNrX2J1ZmYgKnBSeFBrdDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcENsb25lZFBrdDsKIAogCUFTU0VSVChwUGFja2V0KTsKIAlwUnhQa3QgPSBSVFBLVF9UT19PU1BLVChwUGFja2V0KTsKIAotCS8vIGNsb25lIHRoZSBwYWNrZXQKKwkvKiBjbG9uZSB0aGUgcGFja2V0ICovCiAJcENsb25lZFBrdCA9IHNrYl9jbG9uZShwUnhQa3QsIE1FTV9BTExPQ19GTEFHKTsKIAotCWlmIChwQ2xvbmVkUGt0KQotCXsKLSAgICAJLy8gc2V0IHRoZSBjb3JyZWN0IGRhdGFwdHIgYW5kIGRhdGEgbGVuCi0gICAgCXBDbG9uZWRQa3QtPmRldiA9IHBSeFBrdC0+ZGV2OwotICAgIAlwQ2xvbmVkUGt0LT5kYXRhID0gcERhdGE7Ci0gICAgCXBDbG9uZWRQa3QtPmxlbiA9IERhdGFTaXplOwotICAgIAlwQ2xvbmVkUGt0LT50YWlsID0gcENsb25lZFBrdC0+ZGF0YSArIHBDbG9uZWRQa3QtPmxlbjsKKwlpZiAocENsb25lZFBrdCkgeworCQkvKiBzZXQgdGhlIGNvcnJlY3QgZGF0YXB0ciBhbmQgZGF0YSBsZW4gKi8KKwkJcENsb25lZFBrdC0+ZGV2ID0gcFJ4UGt0LT5kZXY7CisJCXBDbG9uZWRQa3QtPmRhdGEgPSBwRGF0YTsKKwkJcENsb25lZFBrdC0+bGVuID0gRGF0YVNpemU7CisJCXBDbG9uZWRQa3QtPnRhaWwgPSBwQ2xvbmVkUGt0LT5kYXRhICsgcENsb25lZFBrdC0+bGVuOwogCQlBU1NFUlQoRGF0YVNpemUgPCAxNTMwKTsKIAl9CiAJcmV0dXJuIHBDbG9uZWRQa3Q7CiB9CiAKLS8vCi0vLyBjaGFuZ2UgT1MgcGFja2V0IERhdGFQdHIgYW5kIERhdGFMZW4KLS8vCi12b2lkICB1cGRhdGVfb3NfcGFja2V0X2luZm8oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTiAgVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKKy8qICovCisvKiBjaGFuZ2UgT1MgcGFja2V0IERhdGFQdHIgYW5kIERhdGFMZW4gKi8KKy8qICovCit2b2lkIHVwZGF0ZV9vc19wYWNrZXRfaW5mbyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICBzdHJ1Y3QgcnRfcnhfYmxrICpwUnhCbGssIHU4IEZyb21XaGljaEJTU0lEKQogewotCXN0cnVjdCBza19idWZmCSpwT1NQa3Q7CisJc3RydWN0IHNrX2J1ZmYgKnBPU1BrdDsKIAogCUFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7CiAJcE9TUGt0ID0gUlRQS1RfVE9fT1NQS1QocFJ4QmxrLT5wUnhQYWNrZXQpOwpAQCAtNjI0LDE0ICs1MzgsMTIgQEAKIAlwT1NQa3QtPnRhaWwgPSBwT1NQa3QtPmRhdGEgKyBwT1NQa3QtPmxlbjsKIH0KIAotCi12b2lkIHdsYW5fODAyXzExX3RvXzgwMl8zX3BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKLQlJTiAgVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3ZvaWQgd2xhbl84MDJfMTFfdG9fODAyXzNfcGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrLAorCQkJCSB1OCAqcEhlYWRlcjgwMl8zLAorCQkJCSB1OCBGcm9tV2hpY2hCU1NJRCkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZgkqcE9TUGt0OworCXN0cnVjdCBza19idWZmICpwT1NQa3Q7CiAKIAlBU1NFUlQocFJ4QmxrLT5wUnhQYWNrZXQpOwogCUFTU0VSVChwSGVhZGVyODAyXzMpOwpAQCAtNjQzLDM3ICs1NTUsMzUgQEAKIAlwT1NQa3QtPmxlbiA9IHBSeEJsay0+RGF0YVNpemU7CiAJcE9TUGt0LT50YWlsID0gcE9TUGt0LT5kYXRhICsgcE9TUGt0LT5sZW47CiAKLQkvLwotCS8vIGNvcHkgODAyLjMgaGVhZGVyCi0JLy8KLQkvLworCS8qICovCisJLyogY29weSA4MDIuMyBoZWFkZXIgKi8KKwkvKiAqLworCS8qICovCiAKLQlOZGlzTW92ZU1lbW9yeShza2JfcHVzaChwT1NQa3QsIExFTkdUSF84MDJfMyksIHBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zKTsKKwlOZGlzTW92ZU1lbW9yeShza2JfcHVzaChwT1NQa3QsIExFTkdUSF84MDJfMyksIHBIZWFkZXI4MDJfMywKKwkJICAgICAgIExFTkdUSF84MDJfMyk7CiB9CiAKLXZvaWQgYW5ub3VuY2VfODAyXzNfcGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQordm9pZCBhbm5vdW5jZV84MDJfM19wYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB2b2lkICpwUGFja2V0KQogewogCi0Jc3RydWN0IHNrX2J1ZmYJKnBSeFBrdDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcFJ4UGt0OwogCiAJQVNTRVJUKHBQYWNrZXQpOwogCiAJcFJ4UGt0ID0gUlRQS1RfVE9fT1NQS1QocFBhY2tldCk7CiAKLSAgICAvKiBQdXNoIHVwIHRoZSBwcm90b2NvbCBzdGFjayAqLworCS8qIFB1c2ggdXAgdGhlIHByb3RvY29sIHN0YWNrICovCiAJcFJ4UGt0LT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHBSeFBrdCwgcFJ4UGt0LT5kZXYpOwogCiAJbmV0aWZfcngocFJ4UGt0KTsKIH0KIAotCi1QUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUCi1ydF9nZXRfc2dfbGlzdF9mcm9tX3BhY2tldChQTkRJU19QQUNLRVQgcFBhY2tldCwgUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUICpzZykKK3N0cnVjdCBydF9ydG1wX3NnX2xpc3QgKgorcnRfZ2V0X3NnX2xpc3RfZnJvbV9wYWNrZXQodm9pZCAqcFBhY2tldCwgc3RydWN0IHJ0X3J0bXBfc2dfbGlzdCAqc2cpCiB7CiAJc2ctPk51bWJlck9mRWxlbWVudHMgPSAxOwotCXNnLT5FbGVtZW50c1swXS5BZGRyZXNzID0gIEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKwlzZy0+RWxlbWVudHNbMF0uQWRkcmVzcyA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKIAlzZy0+RWxlbWVudHNbMF0uTGVuZ3RoID0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CiAJcmV0dXJuIChzZyk7CiB9CkBAIC02ODcsMTMgKzU5NywxMyBAQAogCQlyZXR1cm47CiAKIAlwdCA9IHBTcmNCdWZWQTsKLQlwcmludGsoIiVzOiAlcCwgbGVuID0gJWRcbiIsc3RyLCAgcFNyY0J1ZlZBLCBTcmNCdWZMZW4pOwotCWZvciAoeD0wOyB4PFNyY0J1ZkxlbjsgeCsrKQotCXsKKwlwcmludGsoIiVzOiAlcCwgbGVuID0gJWRcbiIsIHN0ciwgcFNyY0J1ZlZBLCBTcmNCdWZMZW4pOworCWZvciAoeCA9IDA7IHggPCBTcmNCdWZMZW47IHgrKykgewogCQlpZiAoeCAlIDE2ID09IDApCiAJCQlwcmludGsoIjB4JTA0eCA6ICIsIHgpOwogCQlwcmludGsoIiUwMnggIiwgKCh1bnNpZ25lZCBjaGFyKXB0W3hdKSk7Ci0JCWlmICh4JTE2ID09IDE1KSBwcmludGsoIlxuIik7CisJCWlmICh4ICUgMTYgPT0gMTUpCisJCQlwcmludGsoIlxuIik7CiAJfQogCXByaW50aygiXG4iKTsKIH0KQEAgLTcxOCwxODcgKzYyOCwxOTcgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgUlRNUFNlbmRXaXJlbGVzc0V2ZW50KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVAkJCUV2ZW50X2ZsYWcsCi0JSU4JUFVDSEFSIAkJCXBBZGRyLAotCUlOCVVDSEFSCQkJQnNzSWR4LAotCUlOCUNIQVIJCQlSc3NpKQordm9pZCBSVE1QU2VuZFdpcmVsZXNzRXZlbnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdTE2IEV2ZW50X2ZsYWcsCisJCQkgICB1OCAqcEFkZHIsIHU4IEJzc0lkeCwgY2hhciBSc3NpKQogewogCi0JdW5pb24gCWl3cmVxX2RhdGEgICAgICB3cnF1OwotCVBVQ0hBUiAJcEJ1ZiA9IE5VTEwsIHBCdWZQdHIgPSBOVUxMOwotCVVTSE9SVAlldmVudCwgdHlwZSwgQnVmTGVuOwotCVVDSEFSCWV2ZW50X3RhYmxlX2xlbiA9IDA7CisJLyp1bmlvbiAgICAgICAgIGl3cmVxX2RhdGEgICAgICB3cnF1OyAqLworCWNoYXIgKnBCdWYgPSBOVUxMLCAqcEJ1ZlB0ciA9IE5VTEw7CisJdTE2IGV2ZW50LCB0eXBlLCBCdWZMZW47CisJdTggZXZlbnRfdGFibGVfbGVuID0gMDsKIAogCXR5cGUgPSBFdmVudF9mbGFnICYgMHhGRjAwOwogCWV2ZW50ID0gRXZlbnRfZmxhZyAmIDB4MDBGRjsKIAotCXN3aXRjaCAodHlwZSkKLQl7Ci0JCWNhc2UgSVdfU1lTX0VWRU5UX0ZMQUdfU1RBUlQ6Ci0JCQlldmVudF90YWJsZV9sZW4gPSBJV19TWVNfRVZFTlRfVFlQRV9OVU07Ci0JCQlicmVhazsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElXX1NZU19FVkVOVF9GTEFHX1NUQVJUOgorCQlldmVudF90YWJsZV9sZW4gPSBJV19TWVNfRVZFTlRfVFlQRV9OVU07CisJCWJyZWFrOwogCi0JCWNhc2UgSVdfU1BPT0ZfRVZFTlRfRkxBR19TVEFSVDoKLQkJCWV2ZW50X3RhYmxlX2xlbiA9IElXX1NQT09GX0VWRU5UX1RZUEVfTlVNOwotCQkJYnJlYWs7CisJY2FzZSBJV19TUE9PRl9FVkVOVF9GTEFHX1NUQVJUOgorCQlldmVudF90YWJsZV9sZW4gPSBJV19TUE9PRl9FVkVOVF9UWVBFX05VTTsKKwkJYnJlYWs7CiAKLQkJY2FzZSBJV19GTE9PRF9FVkVOVF9GTEFHX1NUQVJUOgotCQkJZXZlbnRfdGFibGVfbGVuID0gSVdfRkxPT0RfRVZFTlRfVFlQRV9OVU07Ci0JCQlicmVhazsKKwljYXNlIElXX0ZMT09EX0VWRU5UX0ZMQUdfU1RBUlQ6CisJCWV2ZW50X3RhYmxlX2xlbiA9IElXX0ZMT09EX0VWRU5UX1RZUEVfTlVNOworCQlicmVhazsKIAl9CiAKLQlpZiAoZXZlbnRfdGFibGVfbGVuID09IDApCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFRoZSB0eXBlKCUweDAyeCkgaXMgbm90IHZhbGlkLlxuIiwgX19mdW5jX18sIHR5cGUpKTsKKwlpZiAoZXZlbnRfdGFibGVfbGVuID09IDApIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCIlcyA6IFRoZSB0eXBlKCUweDAyeCkgaXMgbm90IHZhbGlkLlxuIiwgX19mdW5jX18sCisJCQkgIHR5cGUpKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChldmVudCA+PSBldmVudF90YWJsZV9sZW4pCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFRoZSBldmVudCglMHgwMngpIGlzIG5vdCB2YWxpZC5cbiIsIF9fZnVuY19fLCBldmVudCkpOworCWlmIChldmVudCA+PSBldmVudF90YWJsZV9sZW4pIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCIlcyA6IFRoZSBldmVudCglMHgwMngpIGlzIG5vdCB2YWxpZC5cbiIsIF9fZnVuY19fLAorCQkJICBldmVudCkpOwogCQlyZXR1cm47CiAJfQotCi0JLy9BbGxvY2F0ZSBtZW1vcnkgYW5kIGNvcHkgdGhlIG1zZy4KLQlpZigocEJ1ZiA9IGttYWxsb2MoSVdfQ1VTVE9NX01BWF9MRU4sIEdGUF9BVE9NSUMpKSAhPSBOVUxMKQotCXsKLQkJLy9QcmVwYXJlIHRoZSBwYXlsb2FkCisJLypBbGxvY2F0ZSBtZW1vcnkgYW5kIGNvcHkgdGhlIG1zZy4gKi8KKwlpZiAoKHBCdWYgPSBrbWFsbG9jKElXX0NVU1RPTV9NQVhfTEVOLCBHRlBfQVRPTUlDKSkgIT0gTlVMTCkgeworCQkvKlByZXBhcmUgdGhlIHBheWxvYWQgKi8KIAkJbWVtc2V0KHBCdWYsIDAsIElXX0NVU1RPTV9NQVhfTEVOKTsKIAogCQlwQnVmUHRyID0gcEJ1ZjsKIAogCQlpZiAocEFkZHIpCi0JCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIihSVDI4NjApIFNUQSglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCkgIiwgUFJJTlRfTUFDKHBBZGRyKSk7CisJCQlwQnVmUHRyICs9CisJCQkgICAgc3ByaW50ZihwQnVmUHRyLAorCQkJCSAgICAiKFJUMjg2MCkgU1RBKCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4KSAiLAorCQkJCSAgICBQUklOVF9NQUMocEFkZHIpKTsKIAkJZWxzZSBpZiAoQnNzSWR4IDwgTUFYX01CU1NJRF9OVU0pCi0JCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIihSVDI4NjApIEJTUyh3bGFuJWQpICIsIEJzc0lkeCk7CisJCQlwQnVmUHRyICs9CisJCQkgICAgc3ByaW50ZihwQnVmUHRyLCAiKFJUMjg2MCkgQlNTKHdsYW4lZCkgIiwgQnNzSWR4KTsKIAkJZWxzZQogCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIoUlQyODYwKSAiKTsKIAogCQlpZiAodHlwZSA9PSBJV19TWVNfRVZFTlRfRkxBR19TVEFSVCkKLQkJCXBCdWZQdHIgKz0gc3ByaW50ZihwQnVmUHRyLCAiJXMiLCBwV2lyZWxlc3NTeXNFdmVudFRleHRbZXZlbnRdKTsKKwkJCXBCdWZQdHIgKz0KKwkJCSAgICBzcHJpbnRmKHBCdWZQdHIsICIlcyIsCisJCQkJICAgIHBXaXJlbGVzc1N5c0V2ZW50VGV4dFtldmVudF0pOwogCQllbHNlIGlmICh0eXBlID09IElXX1NQT09GX0VWRU5UX0ZMQUdfU1RBUlQpCi0JCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIiVzIChSU1NJPSVkKSIsIHBXaXJlbGVzc1Nwb29mRXZlbnRUZXh0W2V2ZW50XSwgUnNzaSk7CisJCQlwQnVmUHRyICs9CisJCQkgICAgc3ByaW50ZihwQnVmUHRyLCAiJXMgKFJTU0k9JWQpIiwKKwkJCQkgICAgcFdpcmVsZXNzU3Bvb2ZFdmVudFRleHRbZXZlbnRdLCBSc3NpKTsKIAkJZWxzZSBpZiAodHlwZSA9PSBJV19GTE9PRF9FVkVOVF9GTEFHX1NUQVJUKQotCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIlcyIsIHBXaXJlbGVzc0Zsb29kRXZlbnRUZXh0W2V2ZW50XSk7CisJCQlwQnVmUHRyICs9CisJCQkgICAgc3ByaW50ZihwQnVmUHRyLCAiJXMiLAorCQkJCSAgICBwV2lyZWxlc3NGbG9vZEV2ZW50VGV4dFtldmVudF0pOwogCQllbHNlCiAJCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIiVzIiwgInVua25vd24gZXZlbnQiKTsKIAogCQlwQnVmUHRyW3BCdWZQdHIgLSBwQnVmXSA9ICdcMCc7CiAJCUJ1ZkxlbiA9IHBCdWZQdHIgLSBwQnVmOwogCi0JCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKLQkgICAgd3JxdS5kYXRhLmZsYWdzID0gRXZlbnRfZmxhZzsKLQkJd3JxdS5kYXRhLmxlbmd0aCA9IEJ1ZkxlbjsKLQotCQkvL3NlbmQgd2lyZWxlc3MgZXZlbnQKLQkgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBwQnVmKTsKLQotCQkvL0RCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIDogJXNcbiIsIF9fZnVuY19fLCBwQnVmKSk7CisJCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgSVdFVkNVU1RPTSwgRXZlbnRfZmxhZywgTlVMTCwKKwkJCQkJKHU4ICopcEJ1ZiwgQnVmTGVuKTsKKwkJLypEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA6ICVzXG4iLCBfX2Z1bmNfXywgcEJ1ZikpOyAqLwogCiAJCWtmcmVlKHBCdWYpOwotCX0KLQllbHNlCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciB3aXJlbGVzcyBldmVudC5cbiIsIF9fZnVuY19fKSk7CisJfSBlbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiJXMgOiBDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHdpcmVsZXNzIGV2ZW50LlxuIiwKKwkJCSAgX19mdW5jX18pKTsKIH0KIAotdm9pZCBzZW5kX21vbml0b3JfcGFja2V0cygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrKQordm9pZCBzZW5kX21vbml0b3JfcGFja2V0cyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaykKIHsKLSAgICBzdHJ1Y3Qgc2tfYnVmZgkqcE9TUGt0OwotICAgIHdsYW5fbmdfcHJpc20yX2hlYWRlciAqcGg7Ci0gICAgaW50IHJhdGVfaW5kZXggPSAwOwotICAgIFVTSE9SVCBoZWFkZXJfbGVuID0gMDsKLSAgICBVQ0hBUiB0ZW1wX2hlYWRlcls0MF0gPSB7MH07CisJc3RydWN0IHNrX2J1ZmYgKnBPU1BrdDsKKwlzdHJ1Y3QgcnRfd2xhbl9uZ19wcmlzbTJfaGVhZGVyICpwaDsKKwlpbnQgcmF0ZV9pbmRleCA9IDA7CisJdTE2IGhlYWRlcl9sZW4gPSAwOworCXU4IHRlbXBfaGVhZGVyWzQwXSA9IHsgMCB9OwogCi0gICAgdV9pbnQzMl90IHJhbGlua3JhdGVbMjU2XSA9IHsyLDQsMTEsMjIsIDEyLDE4LDI0LDM2LDQ4LDcyLDk2LCAgMTA4LCAgIDEwOSwgMTEwLCAxMTEsIDExMiwgMTMsIDI2LCAzOSwgNTIsNzgsMTA0LCAxMTcsIDEzMCwgMjYsIDUyLCA3OCwxMDQsIDE1NiwgMjA4LCAyMzQsIDI2MCwgMjcsIDU0LDgxLDEwOCwxNjIsIDIxNiwgMjQzLCAyNzAsIC8vIExhc3QgMzgKLQk1NCwgMTA4LCAxNjIsIDIxNiwgMzI0LCA0MzIsIDQ4NiwgNTQwLCAgMTQsIDI5LCA0MywgNTcsIDg3LCAxMTUsIDEzMCwgMTQ0LCAyOSwgNTksODcsMTE1LCAxNzMsIDIzMCwyNjAsIDI4OCwgMzAsIDYwLDkwLDEyMCwxODAsMjQwLDI3MCwzMDAsNjAsMTIwLDE4MCwyNDAsMzYwLDQ4MCw1NDAsNjAwLCAwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLAotCTExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLDY0LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LDgwfTsKKwl1X2ludDMyX3QgcmFsaW5rcmF0ZVsyNTZdID0geyAyLCA0LCAxMSwgMjIsIDEyLCAxOCwgMjQsIDM2LCA0OCwgNzIsIDk2LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTMsIDI2LCAzOSwgNTIsIDc4LCAxMDQsIDExNywgMTMwLCAyNiwgNTIsIDc4LCAxMDQsIDE1NiwgMjA4LCAyMzQsIDI2MCwgMjcsIDU0LCA4MSwgMTA4LCAxNjIsIDIxNiwgMjQzLCAyNzAsCS8qIExhc3QgMzggKi8KKwkJNTQsIDEwOCwgMTYyLCAyMTYsIDMyNCwgNDMyLCA0ODYsIDU0MCwgMTQsIDI5LCA0MywgNTcsIDg3LCAxMTUsCisJCSAgICAxMzAsIDE0NCwgMjksIDU5LCA4NywgMTE1LCAxNzMsIDIzMCwgMjYwLCAyODgsIDMwLCA2MCwgOTAsCisJCSAgICAxMjAsIDE4MCwgMjQwLCAyNzAsIDMwMCwgNjAsIDEyMCwgMTgwLCAyNDAsIDM2MCwgNDgwLCA1NDAsCisJCSAgICA2MDAsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLAorCQkxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwKKwkJICAgIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsCisJCSAgICA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LAorCQkgICAgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0LCA2NSwgNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwKKwkJICAgIDcyLCA3MywgNzQsIDc1LCA3NiwgNzcsIDc4LCA3OSwgODAKKwl9OwogCi0KLSAgICBBU1NFUlQocFJ4QmxrLT5wUnhQYWNrZXQpOwotICAgIGlmIChwUnhCbGstPkRhdGFTaXplIDwgMTApCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFNpemUgaXMgdG9vIHNtYWxsISAoJWQpXG4iLCBfX2Z1bmNfXywgcFJ4QmxrLT5EYXRhU2l6ZSkpOworCUFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7CisJaWYgKHBSeEJsay0+RGF0YVNpemUgPCAxMCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIiVzIDogU2l6ZSBpcyB0b28gc21hbGwhICglZClcbiIsIF9fZnVuY19fLAorCQkJICBwUnhCbGstPkRhdGFTaXplKSk7CiAJCWdvdG8gZXJyX2ZyZWVfc2tfYnVmZjsKLSAgICB9CisJfQogCi0gICAgaWYgKHBSeEJsay0+RGF0YVNpemUgKyBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSA+IFJYX0JVRkZFUl9BR0dSRVNJWkUpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFNpemUgaXMgdG9vIGxhcmdlISAoJXp1KVxuIiwgX19mdW5jX18sIHBSeEJsay0+RGF0YVNpemUgKyBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSkpOworCWlmIChwUnhCbGstPkRhdGFTaXplICsgc2l6ZW9mKHN0cnVjdCBydF93bGFuX25nX3ByaXNtMl9oZWFkZXIpID4KKwkgICAgUlhfQlVGRkVSX0FHR1JFU0laRSkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIiVzIDogU2l6ZSBpcyB0b28gbGFyZ2UhICglenUpXG4iLCBfX2Z1bmNfXywKKwkJCSAgcFJ4QmxrLT5EYXRhU2l6ZSArIHNpemVvZihzdHJ1Y3QgcnRfd2xhbl9uZ19wcmlzbTJfaGVhZGVyKSkpOwogCQlnb3RvIGVycl9mcmVlX3NrX2J1ZmY7Ci0gICAgfQorCX0KIAotICAgIHBPU1BrdCA9IFJUUEtUX1RPX09TUEtUKHBSeEJsay0+cFJ4UGFja2V0KTsKKwlwT1NQa3QgPSBSVFBLVF9UT19PU1BLVChwUnhCbGstPnBSeFBhY2tldCk7CiAJcE9TUGt0LT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBCU1MwKTsKLSAgICBpZiAocFJ4QmxrLT5wSGVhZGVyLT5GQy5UeXBlID09IEJUWVBFX0RBVEEpCi0gICAgewotICAgICAgICBwUnhCbGstPkRhdGFTaXplIC09IExFTkdUSF84MDJfMTE7Ci0gICAgICAgIGlmICgocFJ4QmxrLT5wSGVhZGVyLT5GQy5Ub0RzID09IDEpICYmCi0gICAgICAgICAgICAocFJ4QmxrLT5wSGVhZGVyLT5GQy5GckRzID09IDEpKQotICAgICAgICAgICAgaGVhZGVyX2xlbiA9IExFTkdUSF84MDJfMTFfV0lUSF9BRERSNDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaGVhZGVyX2xlbiA9IExFTkdUSF84MDJfMTE7CisJaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuVHlwZSA9PSBCVFlQRV9EQVRBKSB7CisJCXBSeEJsay0+RGF0YVNpemUgLT0gTEVOR1RIXzgwMl8xMTsKKwkJaWYgKChwUnhCbGstPnBIZWFkZXItPkZDLlRvRHMgPT0gMSkgJiYKKwkJICAgIChwUnhCbGstPnBIZWFkZXItPkZDLkZyRHMgPT0gMSkpCisJCQloZWFkZXJfbGVuID0gTEVOR1RIXzgwMl8xMV9XSVRIX0FERFI0OworCQllbHNlCisJCQloZWFkZXJfbGVuID0gTEVOR1RIXzgwMl8xMTsKIAotICAgICAgICAvLyBRT1MKLSAgICAJaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDgpCi0gICAgCXsKLSAgICAJICAgIGhlYWRlcl9sZW4gKz0gMjsKLSAgICAJCS8vIERhdGEgc2tpcCBRT1MgY29udG9ybCBmaWVsZAotICAgIAkJcFJ4QmxrLT5EYXRhU2l6ZSAtPTI7Ci0gICAgCX0KLQotICAgIAkvLyBPcmRlciBiaXQ6IEEtUmFsaW5rIG9yIEhUQysKLSAgICAJaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuT3JkZXIpCi0gICAgCXsKLSAgICAJICAgIGhlYWRlcl9sZW4gKz0gNDsKLQkJCS8vIERhdGEgc2tpcCBIVEMgY29udG9ybCBmaWVsZAorCQkvKiBRT1MgKi8KKwkJaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDgpIHsKKwkJCWhlYWRlcl9sZW4gKz0gMjsKKwkJCS8qIERhdGEgc2tpcCBRT1MgY29udG9ybCBmaWVsZCAqLworCQkJcFJ4QmxrLT5EYXRhU2l6ZSAtPSAyOworCQl9CisJCS8qIE9yZGVyIGJpdDogQS1SYWxpbmsgb3IgSFRDKyAqLworCQlpZiAocFJ4QmxrLT5wSGVhZGVyLT5GQy5PcmRlcikgeworCQkJaGVhZGVyX2xlbiArPSA0OworCQkJLyogRGF0YSBza2lwIEhUQyBjb250b3JsIGZpZWxkICovCiAJCQlwUnhCbGstPkRhdGFTaXplIC09IDQ7Ci0gICAgCX0KKwkJfQorCQkvKiBDb3B5IEhlYWRlciAqLworCQlpZiAoaGVhZGVyX2xlbiA8PSA0MCkKKwkJCU5kaXNNb3ZlTWVtb3J5KHRlbXBfaGVhZGVyLCBwUnhCbGstPnBEYXRhLCBoZWFkZXJfbGVuKTsKIAotICAgICAgICAvLyBDb3B5IEhlYWRlcgotICAgICAgICBpZiAoaGVhZGVyX2xlbiA8PSA0MCkKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHRlbXBfaGVhZGVyLCBwUnhCbGstPnBEYXRhLCBoZWFkZXJfbGVuKTsKLQotICAgICAgICAvLyBza2lwIEhXIHBhZGRpbmcKLSAgICAJaWYgKHBSeEJsay0+UnhELkwyUEFEKQotICAgIAkgICAgcFJ4QmxrLT5wRGF0YSArPSAoaGVhZGVyX2xlbiArIDIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwUnhCbGstPnBEYXRhICs9IGhlYWRlcl9sZW47Ci0gICAgfSAvL2VuZCBpZgotCisJCS8qIHNraXAgSFcgcGFkZGluZyAqLworCQlpZiAocFJ4QmxrLT5SeEQuTDJQQUQpCisJCQlwUnhCbGstPnBEYXRhICs9IChoZWFkZXJfbGVuICsgMik7CisJCWVsc2UKKwkJCXBSeEJsay0+cERhdGEgKz0gaGVhZGVyX2xlbjsKKwl9CQkJLyplbmQgaWYgKi8KIAogCWlmIChwUnhCbGstPkRhdGFTaXplIDwgcE9TUGt0LT5sZW4pIHsKLSAgICAgICAgc2tiX3RyaW0ocE9TUGt0LHBSeEJsay0+RGF0YVNpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNrYl9wdXQocE9TUGt0LChwUnhCbGstPkRhdGFTaXplIC0gcE9TUGt0LT5sZW4pKTsKLSAgICB9IC8vZW5kIGlmCisJCXNrYl90cmltKHBPU1BrdCwgcFJ4QmxrLT5EYXRhU2l6ZSk7CisJfSBlbHNlIHsKKwkJc2tiX3B1dChwT1NQa3QsIChwUnhCbGstPkRhdGFTaXplIC0gcE9TUGt0LT5sZW4pKTsKKwl9CQkJLyplbmQgaWYgKi8KIAotICAgIGlmICgocFJ4QmxrLT5wRGF0YSAtIHBPU1BrdC0+ZGF0YSkgPiAwKSB7Ci0JICAgIHNrYl9wdXQocE9TUGt0LChwUnhCbGstPnBEYXRhIC0gcE9TUGt0LT5kYXRhKSk7Ci0JICAgIHNrYl9wdWxsKHBPU1BrdCwocFJ4QmxrLT5wRGF0YSAtIHBPU1BrdC0+ZGF0YSkpOwotICAgIH0gLy9lbmQgaWYKKwlpZiAoKHBSeEJsay0+cERhdGEgLSBwT1NQa3QtPmRhdGEpID4gMCkgeworCQlza2JfcHV0KHBPU1BrdCwgKHBSeEJsay0+cERhdGEgLSBwT1NQa3QtPmRhdGEpKTsKKwkJc2tiX3B1bGwocE9TUGt0LCAocFJ4QmxrLT5wRGF0YSAtIHBPU1BrdC0+ZGF0YSkpOworCX0JCQkvKmVuZCBpZiAqLwogCi0gICAgaWYgKHNrYl9oZWFkcm9vbShwT1NQa3QpIDwgKHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpKyBoZWFkZXJfbGVuKSkgewotICAgICAgICBpZiAocHNrYl9leHBhbmRfaGVhZChwT1NQa3QsIChzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSArIGhlYWRlcl9sZW4pLCAwLCBHRlBfQVRPTUlDKSkgewotCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBSZWFsbG9jYXRlIGhlYWRlciBzaXplIG9mIHNrX2J1ZmYgZmFpbCFcbiIsIF9fZnVuY19fKSk7CisJaWYgKHNrYl9oZWFkcm9vbShwT1NQa3QpIDwgKHNpemVvZihzdHJ1Y3QgcnRfd2xhbl9uZ19wcmlzbTJfaGVhZGVyKSArIGhlYWRlcl9sZW4pKSB7CisJCWlmIChwc2tiX2V4cGFuZF9oZWFkCisJCSAgICAocE9TUGt0LCAoc2l6ZW9mKHN0cnVjdCBydF93bGFuX25nX3ByaXNtMl9oZWFkZXIpICsgaGVhZGVyX2xlbiksIDAsCisJCSAgICAgR0ZQX0FUT01JQykpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIiVzIDogUmVhbGxvY2F0ZSBoZWFkZXIgc2l6ZSBvZiBza19idWZmIGZhaWwhXG4iLAorCQkJCSAgX19mdW5jX18pKTsKIAkJCWdvdG8gZXJyX2ZyZWVfc2tfYnVmZjsKLQkgICAgfSAvL2VuZCBpZgotICAgIH0gLy9lbmQgaWYKKwkJfQkJLyplbmQgaWYgKi8KKwl9CQkJLyplbmQgaWYgKi8KIAotICAgIGlmIChoZWFkZXJfbGVuID4gMCkKLSAgICAgICAgTmRpc01vdmVNZW1vcnkoc2tiX3B1c2gocE9TUGt0LCBoZWFkZXJfbGVuKSwgdGVtcF9oZWFkZXIsIGhlYWRlcl9sZW4pOworCWlmIChoZWFkZXJfbGVuID4gMCkKKwkJTmRpc01vdmVNZW1vcnkoc2tiX3B1c2gocE9TUGt0LCBoZWFkZXJfbGVuKSwgdGVtcF9oZWFkZXIsCisJCQkgICAgICAgaGVhZGVyX2xlbik7CiAKLSAgICBwaCA9ICh3bGFuX25nX3ByaXNtMl9oZWFkZXIgKikgc2tiX3B1c2gocE9TUGt0LCBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSk7Ci0JTmRpc1plcm9NZW1vcnkocGgsIHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpKTsKKwlwaCA9IChzdHJ1Y3QgcnRfd2xhbl9uZ19wcmlzbTJfaGVhZGVyICopc2tiX3B1c2gocE9TUGt0LAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBydF93bGFuX25nX3ByaXNtMl9oZWFkZXIpKTsKKwlOZGlzWmVyb01lbW9yeShwaCwgc2l6ZW9mKHN0cnVjdCBydF93bGFuX25nX3ByaXNtMl9oZWFkZXIpKTsKIAotICAgIHBoLT5tc2djb2RlCQkgICAgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtOwotCXBoLT5tc2dsZW4JCSAgICA9IHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpOwotCXN0cmNweShwaC0+ZGV2bmFtZSwgcEFkLT5uZXRfZGV2LT5uYW1lKTsKKwlwaC0+bXNnY29kZSA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm07CisJcGgtPm1zZ2xlbiA9IHNpemVvZihzdHJ1Y3QgcnRfd2xhbl9uZ19wcmlzbTJfaGVhZGVyKTsKKwlzdHJjcHkoKGNoYXIgKilwaC0+ZGV2bmFtZSwgKGNoYXIgKilwQWQtPm5ldF9kZXYtPm5hbWUpOwogCi0gICAgcGgtPmhvc3R0aW1lLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faG9zdHRpbWU7CisJcGgtPmhvc3R0aW1lLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faG9zdHRpbWU7CiAJcGgtPmhvc3R0aW1lLnN0YXR1cyA9IDA7CiAJcGgtPmhvc3R0aW1lLmxlbiA9IDQ7CiAJcGgtPmhvc3R0aW1lLmRhdGEgPSBqaWZmaWVzOwpAQCAtOTA4LDYzICs4MjgsNzEgQEAKIAlwaC0+bWFjdGltZS5sZW4gPSAwOwogCXBoLT5tYWN0aW1lLmRhdGEgPSAwOwogCi0gICAgcGgtPmlzdHguZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9pc3R4OworCXBoLT5pc3R4LmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faXN0eDsKIAlwaC0+aXN0eC5zdGF0dXMgPSAwOwogCXBoLT5pc3R4LmxlbiA9IDA7CiAJcGgtPmlzdHguZGF0YSA9IDA7CiAKLSAgICBwaC0+Y2hhbm5lbC5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2NoYW5uZWw7CisJcGgtPmNoYW5uZWwuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9jaGFubmVsOwogCXBoLT5jaGFubmVsLnN0YXR1cyA9IDA7CiAJcGgtPmNoYW5uZWwubGVuID0gNDsKIAotICAgIHBoLT5jaGFubmVsLmRhdGEgPSAodV9pbnQzMl90KXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJcGgtPmNoYW5uZWwuZGF0YSA9ICh1X2ludDMyX3QpIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CiAKLSAgICBwaC0+cnNzaS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3Jzc2k7CisJcGgtPnJzc2kuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yc3NpOwogCXBoLT5yc3NpLnN0YXR1cyA9IDA7CiAJcGgtPnJzc2kubGVuID0gNDsKLSAgICBwaC0+cnNzaS5kYXRhID0gKHVfaW50MzJfdClSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBwUnhCbGstPnBSeFdJLT5SU1NJMCwgUlNTSV8wKSwgQ29udmVydFRvUnNzaShwQWQsIHBSeEJsay0+cFJ4V0ktPlJTU0kxLCBSU1NJXzEpLCBDb252ZXJ0VG9Sc3NpKHBBZCwgcFJ4QmxrLT5wUnhXSS0+UlNTSTIsIFJTU0lfMikpOzsKKwlwaC0+cnNzaS5kYXRhID0KKwkgICAgKHVfaW50MzJfdCkgUlRNUE1heFJzc2kocEFkLAorCQkJCSAgICBDb252ZXJ0VG9Sc3NpKHBBZCwgcFJ4QmxrLT5wUnhXSS0+UlNTSTAsCisJCQkJCQkgIFJTU0lfMCksIENvbnZlcnRUb1Jzc2kocEFkLAorCQkJCQkJCQkJIHBSeEJsay0+CisJCQkJCQkJCQkgcFJ4V0ktPgorCQkJCQkJCQkJIFJTU0kxLAorCQkJCQkJCQkJIFJTU0lfMSksCisJCQkJICAgIENvbnZlcnRUb1Jzc2kocEFkLCBwUnhCbGstPnBSeFdJLT5SU1NJMiwKKwkJCQkJCSAgUlNTSV8yKSk7OwogCiAJcGgtPnNpZ25hbC5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3NpZ25hbDsKIAlwaC0+c2lnbmFsLnN0YXR1cyA9IDA7CiAJcGgtPnNpZ25hbC5sZW4gPSA0OwotCXBoLT5zaWduYWwuZGF0YSA9IDA7IC8vcnNzaSArIG5vaXNlOworCXBoLT5zaWduYWwuZGF0YSA9IDA7CS8qcnNzaSArIG5vaXNlOyAqLwogCiAJcGgtPm5vaXNlLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fbm9pc2U7CiAJcGgtPm5vaXNlLnN0YXR1cyA9IDA7CiAJcGgtPm5vaXNlLmxlbiA9IDQ7CiAJcGgtPm5vaXNlLmRhdGEgPSAwOwogCi0gICAgaWYgKHBSeEJsay0+cFJ4V0ktPlBIWU1PREUgPj0gTU9ERV9IVE1JWCkKLSAgICB7Ci0gICAgCXJhdGVfaW5kZXggPSAxNiArICgoVUNIQVIpcFJ4QmxrLT5wUnhXSS0+QlcgKjE2KSArICgoVUNIQVIpcFJ4QmxrLT5wUnhXSS0+U2hvcnRHSSAqMzIpICsgKChVQ0hBUilwUnhCbGstPnBSeFdJLT5NQ1MpOwotICAgIH0KLSAgICBlbHNlCi0JaWYgKHBSeEJsay0+cFJ4V0ktPlBIWU1PREUgPT0gTU9ERV9PRkRNKQotICAgIAlyYXRlX2luZGV4ID0gKFVDSEFSKShwUnhCbGstPnBSeFdJLT5NQ1MpICsgNDsKLSAgICBlbHNlCi0gICAgCXJhdGVfaW5kZXggPSAoVUNIQVIpKHBSeEJsay0+cFJ4V0ktPk1DUyk7Ci0gICAgaWYgKHJhdGVfaW5kZXggPCAwKQotICAgICAgICByYXRlX2luZGV4ID0gMDsKLSAgICBpZiAocmF0ZV9pbmRleCA+IDI1NSkKLSAgICAgICAgcmF0ZV9pbmRleCA9IDI1NTsKKwlpZiAocFJ4QmxrLT5wUnhXSS0+UEhZTU9ERSA+PSBNT0RFX0hUTUlYKSB7CisJCXJhdGVfaW5kZXggPQorCQkgICAgMTYgKyAoKHU4KXBSeEJsay0+cFJ4V0ktPkJXICogMTYpICsKKwkJICAgICgodTgpcFJ4QmxrLT5wUnhXSS0+U2hvcnRHSSAqIDMyKSArCisJCSAgICAoKHU4KXBSeEJsay0+cFJ4V0ktPk1DUyk7CisJfSBlbHNlIGlmIChwUnhCbGstPnBSeFdJLT5QSFlNT0RFID09IE1PREVfT0ZETSkKKwkJcmF0ZV9pbmRleCA9ICh1OCkocFJ4QmxrLT5wUnhXSS0+TUNTKSArIDQ7CisJZWxzZQorCQlyYXRlX2luZGV4ID0gKHU4KShwUnhCbGstPnBSeFdJLT5NQ1MpOworCWlmIChyYXRlX2luZGV4IDwgMCkKKwkJcmF0ZV9pbmRleCA9IDA7CisJaWYgKHJhdGVfaW5kZXggPiAyNTUpCisJCXJhdGVfaW5kZXggPSAyNTU7CiAKIAlwaC0+cmF0ZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3JhdGU7CiAJcGgtPnJhdGUuc3RhdHVzID0gMDsKIAlwaC0+cmF0ZS5sZW4gPSA0OwotICAgIHBoLT5yYXRlLmRhdGEgPSByYWxpbmtyYXRlW3JhdGVfaW5kZXhdOworCXBoLT5yYXRlLmRhdGEgPSByYWxpbmtyYXRlW3JhdGVfaW5kZXhdOwogCiAJcGgtPmZybWxlbi5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2ZybWxlbjsKLSAgICBwaC0+ZnJtbGVuLnN0YXR1cyA9IDA7CisJcGgtPmZybWxlbi5zdGF0dXMgPSAwOwogCXBoLT5mcm1sZW4ubGVuID0gNDsKLQlwaC0+ZnJtbGVuLmRhdGEJPSAodV9pbnQzMl90KXBSeEJsay0+RGF0YVNpemU7CisJcGgtPmZybWxlbi5kYXRhID0gKHVfaW50MzJfdCkgcFJ4QmxrLT5EYXRhU2l6ZTsKIAorCXBPU1BrdC0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOworCXBPU1BrdC0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhwT1NQa3QsIHBPU1BrdC0+ZGV2KTsKKwlwT1NQa3QtPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJbmV0aWZfcngocE9TUGt0KTsKIAotICAgIHBPU1BrdC0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOwotICAgIHBPU1BrdC0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhwT1NQa3QsIHBPU1BrdC0+ZGV2KTsKLSAgICBwT1NQa3QtPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7Ci0gICAgbmV0aWZfcngocE9TUGt0KTsKLQotICAgIHJldHVybjsKKwlyZXR1cm47CiAKIGVycl9mcmVlX3NrX2J1ZmY6CiAJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKQEAgLTk3MiwzMSArOTAwLDQ3MCBAQAogCiB9CiAKLXZvaWQgcnRtcF9vc190aHJlYWRfaW5pdChQVUNIQVIgcFRocmVhZE5hbWUsIFBWT0lEIHBOb3RpZnkpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJRGV2aWNlIElSUSByZWxhdGVkIGZ1bmN0aW9ucy4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUnRtcE9TSVJRUmVxdWVzdChzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldikKIHsKLQlkYWVtb25pemUocFRocmVhZE5hbWUgLyoiJXMiLHBBZC0+bmV0X2Rldi0+bmFtZSovKTsKKyNpZmRlZiBSVE1QX1BDSV9TVVBQT1JUCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBwTmV0RGV2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IE5VTEw7CisJaW50IHJldHZhbCA9IDA7CisKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWQsIHBOZXREZXYpOworCisJQVNTRVJUKHBBZCk7CisKKwlpZiAocEFkLT5pbmZUeXBlID09IFJUTVBfREVWX0lORl9QQ0kpIHsKKwkJc3RydWN0IG9zX2Nvb2tpZSAqX3BPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKShwQWQtPk9TX0Nvb2tpZSk7CisJCVJUTVBfTVNJX0VOQUJMRShwQWQpOworCQlyZXR2YWwgPQorCQkgICAgcmVxdWVzdF9pcnEoX3BPYmotPnBjaV9kZXYtPmlycSwgcnQyODYwX2ludGVycnVwdCwgU0FfU0hJUlEsCisJCQkJKG5ldF9kZXYpLT5uYW1lLCAobmV0X2RldikpOworCQlpZiAocmV0dmFsICE9IDApCisJCQlwcmludGsoIlJUMjg2MDogcmVxdWVzdF9pcnEgIEVSUk9SKCVkKVxuIiwgcmV0dmFsKTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCitpbnQgUnRtcE9TSVJRUmVsZWFzZShzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHBOZXREZXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gTlVMTDsKKworCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZCwgbmV0X2Rldik7CisKKwlBU1NFUlQocEFkKTsKKworI2lmZGVmIFJUTVBfUENJX1NVUFBPUlQKKwlpZiAocEFkLT5pbmZUeXBlID09IFJUTVBfREVWX0lORl9QQ0kpIHsKKwkJc3RydWN0IG9zX2Nvb2tpZSAqcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopKHBBZC0+T1NfQ29va2llKTsKKwkJc3luY2hyb25pemVfaXJxKHBPYmotPnBjaV9kZXYtPmlycSk7CisJCWZyZWVfaXJxKHBPYmotPnBjaV9kZXYtPmlycSwgKG5ldF9kZXYpKTsKKwkJUlRNUF9NU0lfRElTQUJMRShwQWQpOworCX0KKyNlbmRpZiAvKiBSVE1QX1BDSV9TVVBQT1JUIC8vICovCisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCUZpbGUgb3Blbi9jbG9zZSByZWxhdGVkIGZ1bmN0aW9ucy4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgZmlsZSAqUnRtcE9TRmlsZU9wZW4oY2hhciAqcFBhdGgsIGludCBmbGFnLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZVB0cjsKKworCWZpbGVQdHIgPSBmaWxwX29wZW4ocFBhdGgsIGZsYWcsIDApOworCWlmIChJU19FUlIoZmlsZVB0cikpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCIlcygpOiBFcnJvciAlbGQgb3BlbmluZyAlc1xuIiwgX19mdW5jX18sCisJCQkgIC1QVFJfRVJSKGZpbGVQdHIpLCBwUGF0aCkpOworCX0KKworCXJldHVybiAoc3RydWN0IGZpbGUgKilmaWxlUHRyOworfQorCitpbnQgUnRtcE9TRmlsZUNsb3NlKHN0cnVjdCBmaWxlICpvc2ZkKQoreworCWZpbHBfY2xvc2Uob3NmZCwgTlVMTCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgUnRtcE9TRmlsZVNlZWsoc3RydWN0IGZpbGUgKm9zZmQsIGludCBvZmZzZXQpCit7CisJb3NmZC0+Zl9wb3MgPSBvZmZzZXQ7Cit9CisKK2ludCBSdG1wT1NGaWxlUmVhZChzdHJ1Y3QgZmlsZSAqb3NmZCwgY2hhciAqcERhdGFQdHIsIGludCByZWFkTGVuKQoreworCS8qIFRoZSBvYmplY3QgbXVzdCBoYXZlIGEgcmVhZCBtZXRob2QgKi8KKwlpZiAob3NmZC0+Zl9vcCAmJiBvc2ZkLT5mX29wLT5yZWFkKSB7CisJCXJldHVybiBvc2ZkLT5mX29wLT5yZWFkKG9zZmQsIHBEYXRhUHRyLCByZWFkTGVuLCAmb3NmZC0+Zl9wb3MpOworCX0gZWxzZSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIm5vIGZpbGUgcmVhZCBtZXRob2RcbiIpKTsKKwkJcmV0dXJuIC0xOworCX0KK30KKworaW50IFJ0bXBPU0ZpbGVXcml0ZShzdHJ1Y3QgZmlsZSAqb3NmZCwgY2hhciAqcERhdGFQdHIsIGludCB3cml0ZUxlbikKK3sKKwlyZXR1cm4gb3NmZC0+Zl9vcC0+d3JpdGUob3NmZCwgcERhdGFQdHIsIChzaXplX3QpIHdyaXRlTGVuLAorCQkJCSAmb3NmZC0+Zl9wb3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJVGFzayBjcmVhdGUvbWFuYWdlbWVudC9raWxsIHJlbGF0ZWQgZnVuY3Rpb25zLgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBSdG1wT1NUYXNrS2lsbChzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpwVGFzaykKK3sKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQ7CisJaW50IHJldCA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisKKwlwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKXBUYXNrLT5wcml2OworCisjaWZkZWYgS1RIUkVBRF9TVVBQT1JUCisJaWYgKHBUYXNrLT5rdGhyZWFkX3Rhc2spIHsKKwkJa3RocmVhZF9zdG9wKHBUYXNrLT5rdGhyZWFkX3Rhc2spOworCQlyZXQgPSBORElTX1NUQVRVU19TVUNDRVNTOworCX0KKyNlbHNlCisJQ0hFQ0tfUElEX0xFR0FMSVRZKHBUYXNrLT50YXNrUElEKSB7CisJCXByaW50aygiVGVybWluYXRlIHRoZSB0YXNrKCVzKSB3aXRoIHBpZCglZCkhXG4iLAorCQkgICAgICAgcFRhc2stPnRhc2tOYW1lLCBHRVRfUElEX05VTUJFUihwVGFzay0+dGFza1BJRCkpOworCQltYigpOworCQlwVGFzay0+dGFza19raWxsZWQgPSAxOworCQltYigpOworCQlyZXQgPSBLSUxMX1RIUkVBRF9QSUQocFRhc2stPnRhc2tQSUQsIFNJR1RFUk0sIDEpOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgImtpbGwgdGFzayglcykgd2l0aCBwaWQoJWQpIGZhaWxlZChyZXRWYWw9JWQpIVxuIiwKKwkJCSAgICAgICBwVGFzay0+dGFza05hbWUsIEdFVF9QSURfTlVNQkVSKHBUYXNrLT50YXNrUElEKSwKKwkJCSAgICAgICByZXQpOworCQl9IGVsc2UgeworCQkJd2FpdF9mb3JfY29tcGxldGlvbigmcFRhc2stPnRhc2tDb21wbGV0ZSk7CisJCQlwVGFzay0+dGFza1BJRCA9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKwkJCXBUYXNrLT50YXNrX2tpbGxlZCA9IDA7CisJCQlyZXQgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQl9CisJfQorI2VuZGlmCisKKwlyZXR1cm4gcmV0OworCit9CisKK2ludCBSdG1wT1NUYXNrTm90aWZ5VG9FeGl0KHN0cnVjdCBydF9ydG1wX29zX3Rhc2sgKnBUYXNrKQoreworCisjaWZuZGVmIEtUSFJFQURfU1VQUE9SVAorCWNvbXBsZXRlX2FuZF9leGl0KCZwVGFzay0+dGFza0NvbXBsZXRlLCAwKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgUnRtcE9TVGFza0N1c3RvbWl6ZShzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpwVGFzaykKK3sKKworI2lmbmRlZiBLVEhSRUFEX1NVUFBPUlQKKworCWRhZW1vbml6ZSgoY2hhciAqKSYgcFRhc2stPnRhc2tOYW1lWzBdIC8qIiVzIixwQWQtPm5ldF9kZXYtPm5hbWUgKi8gKTsKIAogCWFsbG93X3NpZ25hbChTSUdURVJNKTsKIAlhbGxvd19zaWduYWwoU0lHS0lMTCk7CiAJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAKIAkvKiBzaWduYWwgdGhhdCB3ZSd2ZSBzdGFydGVkIHRoZSB0aHJlYWQgKi8KLQljb21wbGV0ZShwTm90aWZ5KTsKKwljb21wbGV0ZSgmcFRhc2stPnRhc2tDb21wbGV0ZSk7CisKKyNlbmRpZgogfQogCi12b2lkIFJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoraW50IFJ0bXBPU1Rhc2tBdHRhY2goc3RydWN0IHJ0X3J0bXBfb3NfdGFzayAqcFRhc2ssCisJCQkgICAgIElOIGludCAoKmZuKSAodm9pZCAqKSwgSU4gdm9pZCAqYXJnKQogewotCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQl7Ci0JCWlmIChwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9PSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZCkKLQkJewotCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU1RBX0xJTktVUF9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU1RBX0xJTktET1dOX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisKKyNpZmRlZiBLVEhSRUFEX1NVUFBPUlQKKwlwVGFzay0+dGFza19raWxsZWQgPSAwOworCXBUYXNrLT5rdGhyZWFkX3Rhc2sgPSBOVUxMOworCXBUYXNrLT5rdGhyZWFkX3Rhc2sgPSBrdGhyZWFkX3J1bihmbiwgYXJnLCBwVGFzay0+dGFza05hbWUpOworCWlmIChJU19FUlIocFRhc2stPmt0aHJlYWRfdGFzaykpCisJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisjZWxzZQorCXBpZF9udW1iZXIgPSBrZXJuZWxfdGhyZWFkKGZuLCBhcmcsIFJUTVBfT1NfTUdNVF9UQVNLX0ZMQUdTKTsKKwlpZiAocGlkX251bWJlciA8IDApIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJBdHRhY2ggdGFzayglcykgZmFpbGVkIVxuIiwgcFRhc2stPnRhc2tOYW1lKSk7CisJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfSBlbHNlIHsKKwkJcFRhc2stPnRhc2tQSUQgPSBHRVRfUElEKHBpZF9udW1iZXIpOworCisJCS8qIFdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gc3RhcnQgKi8KKwkJd2FpdF9mb3JfY29tcGxldGlvbigmcFRhc2stPnRhc2tDb21wbGV0ZSk7CisJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJfQorI2VuZGlmCisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IFJ0bXBPU1Rhc2tJbml0KHN0cnVjdCBydF9ydG1wX29zX3Rhc2sgKnBUYXNrLAorCQkJICAgY2hhciAqcFRhc2tOYW1lLCB2b2lkICogcFByaXYpCit7CisJaW50IGxlbjsKKworCUFTU0VSVChwVGFzayk7CisKKyNpZm5kZWYgS1RIUkVBRF9TVVBQT1JUCisJTmRpc1plcm9NZW1vcnkoKHU4ICopKHBUYXNrKSwgc2l6ZW9mKHN0cnVjdCBydF9ydG1wX29zX3Rhc2spKTsKKyNlbmRpZgorCisJbGVuID0gc3RybGVuKHBUYXNrTmFtZSk7CisJbGVuID0KKwkgICAgbGVuID4KKwkgICAgKFJUTVBfT1NfVEFTS19OQU1FX0xFTiAtIDEpID8gKFJUTVBfT1NfVEFTS19OQU1FX0xFTiAtIDEpIDogbGVuOworCU5kaXNNb3ZlTWVtb3J5KCZwVGFzay0+dGFza05hbWVbMF0sIHBUYXNrTmFtZSwgbGVuKTsKKwlwVGFzay0+cHJpdiA9IHBQcml2OworCisjaWZuZGVmIEtUSFJFQURfU1VQUE9SVAorCVJUTVBfU0VNX0VWRU5UX0lOSVRfTE9DS0VEKCYocFRhc2stPnRhc2tTZW1hKSk7CisJcFRhc2stPnRhc2tQSUQgPSBUSFJFQURfUElEX0lOSVRfVkFMVUU7CisKKwlpbml0X2NvbXBsZXRpb24oJnBUYXNrLT50YXNrQ29tcGxldGUpOworI2VuZGlmCisKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKwordm9pZCBSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KSB7CisJCWlmIChwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9PSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZCkgeworCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU1RBX0xJTktVUF9FVkVOVF9GTEFHLAorCQkJCQkgICAgICBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLgorCQkJCQkgICAgICBBZGRyLCBCU1MwLCAwKTsKKwkJfSBlbHNlIHsKKwkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NUQV9MSU5LRE9XTl9FVkVOVF9GTEFHLAorCQkJCQkgICAgICBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLgorCQkJCQkgICAgICBBZGRyLCBCU1MwLCAwKTsKIAkJfQogCX0KIH0KIAoraW50IFJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICB1MzIgZXZlbnRUeXBlLAorCQkJICAgIGludCBmbGFncywKKwkJCSAgICB1OCAqcFNyY01hYywKKwkJCSAgICB1OCAqcERhdGEsIHUzMiBkYXRhTGVuKQoreworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKworCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKworCWlmIChmbGFncyA+IC0xKQorCQl3cnF1LmRhdGEuZmxhZ3MgPSBmbGFnczsKKworCWlmIChwU3JjTWFjKQorCQltZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIHBTcmNNYWMsIE1BQ19BRERSX0xFTik7CisKKwlpZiAoKHBEYXRhICE9IE5VTEwpICYmIChkYXRhTGVuID4gMCkpCisJCXdycXUuZGF0YS5sZW5ndGggPSBkYXRhTGVuOworCisJd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIGV2ZW50VHlwZSwgJndycXUsIChjaGFyICopcERhdGEpOworCXJldHVybiAwOworfQorCitpbnQgUnRtcE9TTmV0RGV2QWRkclNldChzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldiwgdTggKnBNYWNBZGRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZDsKKworCW5ldF9kZXYgPSBwTmV0RGV2OworCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZCwgbmV0X2Rldik7CisKKwkvKiB3b3JrLWFyb3VuZCBmb3IgdGhlIFN1U0UgZHVlIHRvIGl0IGhhcyBpdCdzIG93biBpbnRlcmZhY2UgbmFtZSBtYW5hZ2VtZW50IHN5c3RlbS4gKi8KKwl7CisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLmRldl9uYW1lLCAxNik7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLmRldl9uYW1lLCBuZXRfZGV2LT5uYW1lLAorCQkJICAgICAgIHN0cmxlbihuZXRfZGV2LT5uYW1lKSk7CisJfQorCisJTmRpc01vdmVNZW1vcnkobmV0X2Rldi0+ZGV2X2FkZHIsIHBNYWNBZGRyLCA2KTsKKworCXJldHVybiAwOworfQorCisvKgorICAqCUFzc2lnbiB0aGUgbmV0d29yayBkZXYgbmFtZSBmb3IgY3JlYXRlZCBSYWxpbmsgV2lGaSBpbnRlcmZhY2UuCisgICovCitzdGF0aWMgaW50IFJ0bXBPU05ldERldlJlcXVlc3ROYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgIGNoYXIgKnBQcmVmaXhTdHIsIGludCBkZXZJZHgpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmV4aXN0TmV0RGV2OworCWNoYXIgc3VmZml4TmFtZVtJRk5BTVNJWl07CisJY2hhciBkZXNpcmVkTmFtZVtJRk5BTVNJWl07CisJaW50IGlmTmFtZUlkeCwgcHJlZml4TGVuLCBzbG90TmFtZUxlbjsKKwlpbnQgU3RhdHVzOworCisJcHJlZml4TGVuID0gc3RybGVuKHBQcmVmaXhTdHIpOworCUFTU0VSVCgocHJlZml4TGVuIDwgSUZOQU1TSVopKTsKKworCWZvciAoaWZOYW1lSWR4ID0gZGV2SWR4OyBpZk5hbWVJZHggPCAzMjsgaWZOYW1lSWR4KyspIHsKKwkJbWVtc2V0KHN1ZmZpeE5hbWUsIDAsIElGTkFNU0laKTsKKwkJbWVtc2V0KGRlc2lyZWROYW1lLCAwLCBJRk5BTVNJWik7CisJCXN0cm5jcHkoJmRlc2lyZWROYW1lWzBdLCBwUHJlZml4U3RyLCBwcmVmaXhMZW4pOworCisJCXNwcmludGYoc3VmZml4TmFtZSwgIiVkIiwgaWZOYW1lSWR4KTsKKworCQlzbG90TmFtZUxlbiA9IHN0cmxlbihzdWZmaXhOYW1lKTsKKwkJQVNTRVJUKCgoc2xvdE5hbWVMZW4gKyBwcmVmaXhMZW4pIDwgSUZOQU1TSVopKTsKKwkJc3RyY2F0KGRlc2lyZWROYW1lLCBzdWZmaXhOYW1lKTsKKworCQlleGlzdE5ldERldiA9IFJ0bXBPU05ldERldkdldEJ5TmFtZShkZXYsICZkZXNpcmVkTmFtZVswXSk7CisJCWlmIChleGlzdE5ldERldiA9PSBOVUxMKQorCQkJYnJlYWs7CisJCWVsc2UKKwkJCVJ0bXBPU05ldERldmljZVJlZlB1dChleGlzdE5ldERldik7CisJfQorCisJaWYgKGlmTmFtZUlkeCA8IDMyKSB7CisJCXN0cmNweSgmZGV2LT5uYW1lWzBdLCAmZGVzaXJlZE5hbWVbMF0pOworCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCX0gZWxzZSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiQ2Fubm90IHJlcXVlc3QgRGV2TmFtZSB3aXRoIHByZWlmeCglcykgYW5kIGluIHJhbmdlKDB+MzIpIGFzIHN1ZmZpeCBmcm9tIE9TIVxuIiwKKwkJCSAgcFByZWZpeFN0cikpOworCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworCXJldHVybiBTdGF0dXM7Cit9CisKK3ZvaWQgUnRtcE9TTmV0RGV2Q2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXYpCit7CisJZGV2X2Nsb3NlKHBOZXREZXYpOworfQorCit2b2lkIFJ0bXBPU05ldERldkZyZWUoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXYpCit7CisJQVNTRVJUKHBOZXREZXYpOworCisJZnJlZV9uZXRkZXYocE5ldERldik7Cit9CisKK2ludCBSdG1wT1NOZXREZXZBbGxvYyhzdHJ1Y3QgbmV0X2RldmljZSAqKiBuZXdfZGV2X3AsIHUzMiBwcml2RGF0YVNpemUpCit7CisJLyogYXNzaWduIGl0IGFzIG51bGwgZmlyc3QuICovCisJKm5ld19kZXZfcCA9IE5VTEw7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiQWxsb2NhdGUgYSBuZXQgZGV2aWNlIHdpdGggcHJpdmF0ZSBkYXRhIHNpemU9JWQhXG4iLAorCQkgIHByaXZEYXRhU2l6ZSkpOworCSpuZXdfZGV2X3AgPSBhbGxvY19ldGhlcmRldihwcml2RGF0YVNpemUpOworCWlmICgqbmV3X2Rldl9wKQorCQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwllbHNlCisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworfQorCitzdHJ1Y3QgbmV0X2RldmljZSAqUnRtcE9TTmV0RGV2R2V0QnlOYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2LCBjaGFyICpwRGV2TmFtZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqcFRhcmdldE5ldERldiA9IE5VTEw7CisKKwlwVGFyZ2V0TmV0RGV2ID0gZGV2X2dldF9ieV9uYW1lKGRldl9uZXQocE5ldERldiksIHBEZXZOYW1lKTsKKworCXJldHVybiBwVGFyZ2V0TmV0RGV2OworfQorCit2b2lkIFJ0bXBPU05ldERldmljZVJlZlB1dChzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldikKK3sKKwkvKgorCSAgIGV2ZXJ5IHRpbWUgZGV2X2dldF9ieV9uYW1lIGlzIGNhbGxlZCwgYW5kIGl0IGhhcyByZXR1cm5lZCBhIHZhbGlkIHN0cnVjdAorCSAgIG5ldF9kZXZpY2UqLCBkZXZfcHV0IHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXJ3YXJkcywgYmVjYXVzZSBvdGhlcndpc2UgdGhlCisJICAgbWFjaGluZSBoYW5ncyB3aGVuIHRoZSBkZXZpY2UgaXMgdW5yZWdpc3RlcmVkIChzaW5jZSBkZXYtPnJlZmNudCA+IDEpLgorCSAqLworCWlmIChwTmV0RGV2KQorCQlkZXZfcHV0KHBOZXREZXYpOworfQorCitpbnQgUnRtcE9TTmV0RGV2RGVzdG9yeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2KQoreworCisJLyogVE9ETzogTmVlZCB0byBmaXggdGhpcyAqLworCXByaW50aygiV0FSTklORzogVGhpcyBmdW5jdGlvbiglcykgbm90IGltcGxlbWVudCB5ZXQhXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgUnRtcE9TTmV0RGV2RGV0YWNoKHN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2KQoreworCXVucmVnaXN0ZXJfbmV0ZGV2KHBOZXREZXYpOworfQorCitpbnQgUnRtcE9TTmV0RGV2QXR0YWNoKHN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2LAorCQkgICAgICAgc3RydWN0IHJ0X3J0bXBfb3NfbmV0ZGV2X29wX2hvb2sgKnBEZXZPcEhvb2spCit7CisJaW50IHJldCwgcnRubF9sb2NrZWQgPSBGQUxTRTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJ0bXBPU05ldERldkF0dGFjaCgpLS0tPlxuIikpOworCS8qIElmIHdlIG5lZWQgaG9vayBzb21lIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHRoZSBuZXQgZGV2aWNlIHN0cnVjdHJ1ZSwgbm93IGRvIGl0LiAqLworCWlmIChwRGV2T3BIb29rKSB7CisJCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IE5VTEw7CisKKwkJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkLCBwTmV0RGV2KTsKKworCQlwTmV0RGV2LT5uZXRkZXZfb3BzID0gcERldk9wSG9vay0+bmV0ZGV2X29wczsKKworCQkvKiBPUyBzcGVjaWZpYyBmbGFncywgaGVyZSB3ZSB1c2VkIHRvIGluZGljYXRlIGlmIHdlIGFyZSB2aXJ0dWFsIGludGVyZmFjZSAqLworCQlwTmV0RGV2LT5wcml2X2ZsYWdzID0gcERldk9wSG9vay0+cHJpdl9mbGFnczsKKworCQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgeworCQkJcE5ldERldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAmcnQyOHh4X2l3X2hhbmRsZXJfZGVmOworCQl9CisKKwkJLyogY29weSB0aGUgbmV0IGRldmljZSBtYWMgYWRkcmVzcyB0byB0aGUgbmV0X2RldmljZSBzdHJ1Y3R1cmUuICovCisJCU5kaXNNb3ZlTWVtb3J5KHBOZXREZXYtPmRldl9hZGRyLCAmcERldk9wSG9vay0+ZGV2QWRkclswXSwKKwkJCSAgICAgICBNQUNfQUREUl9MRU4pOworCisJCXJ0bmxfbG9ja2VkID0gcERldk9wSG9vay0+bmVlZFByb3RjdGVkOworCX0KKworCWlmIChydG5sX2xvY2tlZCkKKwkJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2aWNlKHBOZXREZXYpOworCWVsc2UKKwkJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KHBOZXREZXYpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tLVJ0bXBPU05ldERldkF0dGFjaCgpLCByZXQ9JWRcbiIsIHJldCkpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJZWxzZQorCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKK30KKworc3RydWN0IG5ldF9kZXZpY2UgKlJ0bXBPU05ldERldkNyZWF0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgaW50IGRldlR5cGUsCisJCQkgICAgaW50IGRldk51bSwKKwkJCSAgICBpbnQgcHJpdk1lbVNpemUsIGNoYXIgKnBOYW1lUHJlZml4KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2ID0gTlVMTDsKKwlpbnQgc3RhdHVzOworCisJLyogYWxsb2NhdGUgYSBuZXcgbmV0d29yayBkZXZpY2UgKi8KKwlzdGF0dXMgPSBSdG1wT1NOZXREZXZBbGxvYygmcE5ldERldiwgMCAvKnByaXZNZW1TaXplICovICk7CisJaWYgKHN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCS8qIGFsbG9jYXRpb24gZmFpbCwgZXhpdCAqLworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIkFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlIGZhaWwgKCVzKS4uLlxuIiwKKwkJCSAgcE5hbWVQcmVmaXgpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogZmluZCBhIGF2YWlsYWJsZSBpbnRlcmZhY2UgbmFtZSwgbWF4IDMyIGludGVyZmFjZXMgKi8KKwlzdGF0dXMgPSBSdG1wT1NOZXREZXZSZXF1ZXN0TmFtZShwQWQsIHBOZXREZXYsIHBOYW1lUHJlZml4LCBkZXZOdW0pOworCWlmIChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQkvKiBlcnJvciEgbm8gYW55IGF2YWlsYWJsZSByYSBuYW1lIGNhbiBiZSB1c2VkISAqLworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIkFzc2lnbiBpbnRlcmZhY2UgbmFtZSAoJXMgd2l0aCBzdWZmaXggMH4zMikgZmFpbGVkLi4uXG4iLAorCQkJICBwTmFtZVByZWZpeCkpOworCQlSdG1wT1NOZXREZXZGcmVlKHBOZXREZXYpOworCisJCXJldHVybiBOVUxMOworCX0gZWxzZSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiVGhlIG5hbWUgb2YgdGhlIG5ldyAlcyBpbnRlcmZhY2UgaXMgJXMuLi5cbiIsCisJCQkgIHBOYW1lUHJlZml4LCBwTmV0RGV2LT5uYW1lKSk7CisJfQorCisJcmV0dXJuIHBOZXREZXY7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmgKaW5kZXggZThkNjRjMy4uZjg1NTA4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbGludXguaApAQCAtMjMsMjcgKzIzLDIyIEBACiAgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBQcm9ncmFtOiAgICBydF9saW51eC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBDcmVhdGVkOiAgICA0LzIxLzIwMDYgMToxNzozOCBQTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBBdXRob3I6ICAgICBXdSBYaS1LdW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBDb21tZW50czogICBgZGVzY3JpcHRpb25gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogSGlzdG9yeTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUmV2aXNpb24gMS4xIDQvMjEvMjAwNiAxOjE3OjM4IFBNICB4c2lrdW4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSW5pdGlhbCByZXZpc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIE1vZHVsZSBOYW1lOgorCXJ0X2xpbnV4LmgKIAotI2luY2x1ZGUgInJ0bXBfdHlwZS5oIgorICAgIEFic3RyYWN0OgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBfX1JUX0xJTlVYX0hfXworI2RlZmluZSBfX1JUX0xJTlVYX0hfXworCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KQEAgLTY1LDY0ICs2MCw1NyBAQAogCiAjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KIAotLy8gbG9hZCBmaXJtd2FyZQorLyogbG9hZCBmaXJtd2FyZSAqLwogI2RlZmluZSBfX0tFUk5FTF9TWVNDQUxMU19fCiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CS8qIGZvciBnZXRfdW5hbGlnbmVkKCkgKi8KIAorI2RlZmluZSBLVEhSRUFEX1NVUFBPUlQgMQorLyogUlQyODcwIDIuMS4wLjAgaGFzIGl0IGRpc2FibGVkICovCiAKLSNkZWZpbmUgTUVNX0FMTE9DX0ZMQUcgICAgICAoR0ZQX0FUT01JQykgLy8oR0ZQX0RNQSB8IEdGUF9BVE9NSUMpCisjaWZkZWYgS1RIUkVBRF9TVVBQT1JUCisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2VuZGlmIC8qIEtUSFJFQURfU1VQUE9SVCAvLyAqLwogCi0jaWZuZGVmIElGTkFNU0laCi0jZGVmaW5lIElGTkFNU0laIDE2Ci0jZW5kaWYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJUHJvZmlsZSByZWxhdGVkIHNlY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8vI2RlZmluZSBDT05GSUdfQ0tJUF9TVVBQT1JUCisjaWZkZWYgUlRNUF9NQUNfUENJCisjZGVmaW5lIFNUQV9EUklWRVJfVkVSU0lPTgkJCSIyLjEuMC4wIgorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgorI2RlZmluZSBTVEFfRFJJVkVSX1ZFUlNJT04JCQkiMi4xLjAuMCIKKy8qIFJUMzA3MCB2ZXJzaW9uOiAyLjEuMS4wICovCisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcnQyOHh4X2l3X2hhbmRsZXJfZGVmOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCUNvbXBpbGVyIHJlbGF0ZWQgZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICN1bmRlZiBfX2lubGluZQogI2RlZmluZSBfX2lubGluZQkgICBzdGF0aWMgaW5saW5lCisjZGVmaW5lIElOCisjZGVmaW5lIE9VVAorI2RlZmluZSBJTk9VVAogCi10eXBlZGVmIGludCAoKkhBUkRfU1RBUlRfWE1JVF9GVU5DKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU9TIFNwZWNpZmljIGRlZmluaXRpb25zIGFuZCBkYXRhIHN0cnVjdHVyZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgaW50ICgqSEFSRF9TVEFSVF9YTUlUX0ZVTkMpIChzdHJ1Y3Qgc2tfYnVmZiAqIHNrYiwKKwkJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICogbmV0X2Rldik7CiAKLS8vIGFkZCBieSBrYXRoeQotCi0vKiBvcmRlciBvZiAiaWYgZGVmaW5lZCgpIiBpcyBpbXBvcnRhbnQsIGJlY2F1c2UgZm9yIDMwNzAgZHJpdmVyCi0gICBib3RoIFJUMjg3MCBhbmQgUlQzMDcwIGFyZSBkZWZpbmVkICovCi0jaWYgZGVmaW5lZChSVDI4NjApCi0gI2RlZmluZSBTVEFfUFJPRklMRV9QQVRICQkJIi9ldGMvV2lyZWxlc3MvUlQyODYwU1RBL1JUMjg2MFNUQS5kYXQiCi0gI2RlZmluZSBTVEFfUlRNUF9GSVJNV0FSRV9GSUxFX05BTUUgIi9ldGMvV2lyZWxlc3MvUlQyODYwU1RBL1JUMjg2MFNUQS5iaW4iCi0gI2RlZmluZSBTVEFfTklDX0RFVklDRV9OQU1FCQkJIlJUMjg2MFNUQSIKLSAjZGVmaW5lIFNUQV9EUklWRVJfVkVSU0lPTgkJCSIxLjguMS4xIgotI2VsaWYgZGVmaW5lZChSVDMwNzApCi0gI2RlZmluZSBTVEFfUFJPRklMRV9QQVRICQkJIi9ldGMvV2lyZWxlc3MvUlQzMDcwU1RBL1JUMzA3MFNUQS5kYXQiCi0gI2RlZmluZSBTVEFfUlQyODcwX0lNQUdFX0ZJTEVfTkFNRSAgIi9ldGMvV2lyZWxlc3MvUlQzMDcwU1RBL3J0Mjg3MC5iaW4iCi0gI2RlZmluZSBTVEFfTklDX0RFVklDRV9OQU1FCQkJIlJUMzA3MFNUQSIKLSAjZGVmaW5lIFNUQV9EUklWRVJfVkVSU0lPTgkJCSIyLjAuMS4wIgotI2VsaWYgZGVmaW5lZChSVDI4NzApCi0gI2RlZmluZSBTVEFfUFJPRklMRV9QQVRICQkJIi9ldGMvV2lyZWxlc3MvUlQyODcwU1RBL1JUMjg3MFNUQS5kYXQiCi0gI2RlZmluZSBTVEFfUlQyODcwX0lNQUdFX0ZJTEVfTkFNRSAgIi9ldGMvV2lyZWxlc3MvUlQyODcwU1RBL3J0Mjg3MC5iaW4iCi0gI2RlZmluZSBTVEFfTklDX0RFVklDRV9OQU1FCQkJIlJUMjg3MFNUQSIKLSAjZGVmaW5lIFNUQV9EUklWRVJfVkVSU0lPTgkJCSIxLjQuMC4wIgotI2VuZGlmCi0KLSNpZmRlZiBSVDI4NjAKKyNpZmRlZiBSVE1QX01BQ19QQ0kKICNpZm5kZWYgUENJX0RFVklDRQogI2RlZmluZSBQQ0lfREVWSUNFKHZlbmQsZGV2KSBcCiAJLnZlbmRvciA9ICh2ZW5kKSwgLmRldmljZSA9IChkZXYpLCBcCiAJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsIC5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lECi0jZW5kaWYgLy8gUENJX0RFVklDRSAvLwotI2VuZGlmCi0KLSNkZWZpbmUgUlRNUF9USU1FX0FGVEVSKGEsYikJCVwKLQkodHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWEpICYmIFwKLQkgdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWIpICYmIFwKLQkgKChsb25nKShiKSAtIChsb25nKShhKSA8IDApKQotCi0jZGVmaW5lIFJUTVBfVElNRV9BRlRFUl9FUShhLGIpCVwKLQkodHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWEpICYmIFwKLQkgdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWIpICYmIFwKLQkgKChsb25nKShhKSAtIChsb25nKShiKSA+PSAwKSkKLSNkZWZpbmUgUlRNUF9USU1FX0JFRk9SRShhLGIpCVJUTVBfVElNRV9BRlRFUl9FUShiLGEpCisjZW5kaWYgLyogUENJX0RFVklDRSAvLyAqLworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCiAjZGVmaW5lIFJUX01PRF9JTkNfVVNFX0NPVU5UKCkgXAogCWlmICghdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpKSBcCkBAIC0xMzMsMjY4ICsxMjEsMTA1IEBACiAKICNkZWZpbmUgUlRfTU9EX0RFQ19VU0VfQ09VTlQoKSBtb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKIAotI2RlZmluZSBPU19IWgkJCUhaCisjZGVmaW5lIFJUTVBfSU5DX1JFRihfQSkJCTAKKyNkZWZpbmUgUlRNUF9ERUNfUkVGKF9BKQkJMAorI2RlZmluZSBSVE1QX0dFVF9SRUYoX0EpCQkwCisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiBxdWVyeSAvcHJvYyAqLworc3RydWN0IGl3X3N0YXRpc3RpY3MgKnJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU5ldHdvcmsgcmVsYXRlZCBjb25zdGFudCBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBJRk5BTVNJWgorI2RlZmluZSBJRk5BTVNJWiAxNgorI2VuZGlmCiAKICNkZWZpbmUgRVRIX0xFTkdUSF9PRl9BRERSRVNTCTYKIAotI2RlZmluZSBJTgotI2RlZmluZSBPVVQKLQotI2RlZmluZSBORElTX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UCiAjZGVmaW5lIE5ESVNfU1RBVFVTX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAweDAwCiAjZGVmaW5lIE5ESVNfU1RBVFVTX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAweDAxCiAjZGVmaW5lIE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQQkJCQkweDAyCiAjZGVmaW5lIE5ESVNfU1RBVFVTX1JFU09VUkNFUyAgICAgICAgICAgICAgICAgICAweDAzCiAKLSNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX0FJRAkJCTB4MDAJCS8vMHgwMH4weDNmCi0jZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9NQlNTSUQJCTB4MDAJCS8vMHgwMCwweDEwLDB4MjAsMHgzMAotI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTCQkJMHgxMAkJLy8weDQwLDB4NTAsMHg2MCwweDcwCisjZGVmaW5lIE5ESVNfU0VUX1BBQ0tFVF9TVEFUVVMoX3AsIF9zdGF0dXMpCQkJZG97fSB3aGlsZSgwKQorI2RlZmluZSBOZGlzV3JpdGVFcnJvckxvZ0VudHJ5KF9hLCBfYiwgX2MsIF9kKQkJZG97fSB3aGlsZSgwKQorCisvKiBzdGF0aXN0aWNzIGNvdW50ZXIgKi8KKyNkZWZpbmUgU1RBVFNfSU5DX1JYX1BBQ0tFVFMoX3BBZCwgX2RldikKKyNkZWZpbmUgU1RBVFNfSU5DX1RYX1BBQ0tFVFMoX3BBZCwgX2RldikKKworI2RlZmluZSBTVEFUU19JTkNfUlhfQllURVNTKF9wQWQsIF9kZXYsIGxlbikKKyNkZWZpbmUgU1RBVFNfSU5DX1RYX0JZVEVTUyhfcEFkLCBfZGV2LCBsZW4pCisKKyNkZWZpbmUgU1RBVFNfSU5DX1JYX0VSUk9SUyhfcEFkLCBfZGV2KQorI2RlZmluZSBTVEFUU19JTkNfVFhfRVJST1JTKF9wQWQsIF9kZXYpCisKKyNkZWZpbmUgU1RBVFNfSU5DX1JYX0RST1BQRUQoX3BBZCwgX2RldikKKyNkZWZpbmUgU1RBVFNfSU5DX1RYX0RST1BQRUQoX3BBZCwgX2RldikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglSYWxpbmsgU3BlY2lmaWMgbmV0d29yayByZWxhdGVkIGNvbnN0YW50IGRlZmluaXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9BSUQJCQkweDAwCS8qMHgwMH4weDNmICovCisjZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9NQlNTSUQJCTB4MDAJLyoweDAwLDB4MTAsMHgyMCwweDMwICovCisjZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9XRFMJCQkweDEwCS8qMHg0MCwweDUwLDB4NjAsMHg3MCAqLwogI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkJCTB4MjAKICNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX01FU0gJCQkweDMwCiAjZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9ETFMJCQkweDQwCisjZGVmaW5lIE5FVF9ERVZJQ0VfUkVBTF9JRFhfTUFTSwkJMHgwZgkvKiBmb3IgZWFjaCBvcGVyYXRpb24gbW9kZSwgd2UgbWF4aW11bSBzdXBwb3J0IDE1IGVudGl0aWVzLiAqLwogCiAjZGVmaW5lIE5ESVNfUEFDS0VUX1RZUEVfRElSRUNURUQJCTAKICNkZWZpbmUgTkRJU19QQUNLRVRfVFlQRV9NVUxUSUNBU1QJCTEKICNkZWZpbmUgTkRJU19QQUNLRVRfVFlQRV9CUk9BRENBU1QJCTIKICNkZWZpbmUgTkRJU19QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUCTMKKyNkZWZpbmUgTkRJU19QQUNLRVRfVFlQRV9QUk9NSVNDVU9VUwk0CiAKLXN0cnVjdCBvc19sb2NrICB7Ci0Jc3BpbmxvY2tfdAkJbG9jazsKLQl1bnNpZ25lZCBsb25nICAJZmxhZ3M7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU9TIHNpZ25hbGluZyByZWxhdGVkIGNvbnN0YW50IGRlZmluaXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJT1MgZmlsZSBvcGVyYXRpb24gcmVsYXRlZCBkYXRhIHN0cnVjdHVyZSBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IHJ0X3J0bXBfb3NfZnNfaW5mbyB7CisJaW50IGZzdWlkOworCWludCBmc2dpZDsKKwltbV9zZWdtZW50X3QgZnM7CiB9OwogCisjZGVmaW5lIElTX0ZJTEVfT1BFTl9FUlIoX2ZkKQlJU19FUlIoKF9mZCkpCiAKLXN0cnVjdCBvc19jb29raWUgewotI2lmZGVmIFJUMjg2MAotCXN0cnVjdCBwY2lfZGV2IAkJCSpwY2lfZGV2OwotCXN0cnVjdCBwY2lfZGV2IAkJCSpwYXJlbnRfcGNpX2RldjsKLQlkbWFfYWRkcl90CQkgIAkJcEFkX3BhOwotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0Jc3RydWN0IHVzYl9kZXZpY2UJCSpwVXNiX0RldjsKLQotCXN0cnVjdCBwaWQJKk1MTUVUaHJfcGlkOwotCXN0cnVjdCBwaWQJKlJUVVNCQ21kVGhyX3BpZDsKLQlzdHJ1Y3QgcGlkCSpUaW1lclFUaHJfcGlkOwotI2VuZGlmIC8vIFJUMjg3MCAvLwotCi0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IAlyeF9kb25lX3Rhc2s7Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IAltZ210X2RtYV9kb25lX3Rhc2s7Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IAlhYzBfZG1hX2RvbmVfdGFzazsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgCWFjMV9kbWFfZG9uZV90YXNrOwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJYWMyX2RtYV9kb25lX3Rhc2s7Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IAlhYzNfZG1hX2RvbmVfdGFzazsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgCWhjY2FfZG1hX2RvbmVfdGFzazsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJdGJ0dF90YXNrOwotI2lmZGVmIFJUMjg2MAotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlmaWZvX3N0YXRpc3RpY19mdWxsX3Rhc2s7Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJbnVsbF9mcmFtZV9jb21wbGV0ZV90YXNrOwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlydHNfZnJhbWVfY29tcGxldGVfdGFzazsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJcHNwb2xsX2ZyYW1lX2NvbXBsZXRlX3Rhc2s7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi0KLQl1bnNpZ25lZCBsb25nCQkJYXBkX3BpZDsgLy84MDIuMXggZGFlbW9uIHBpZAotCUlOVAkJCQkJCWlvY3RsX2lmX3R5cGU7Ci0JSU5UIAkJCQkJaW9jdGxfaWY7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU9TIHNlbWFwaG9yZSByZWxhdGVkIGRhdGEgc3RydWN0dXJlIGFuZCBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IG9zX2xvY2sgeworCXNwaW5sb2NrX3QgbG9jazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogfTsKIAotI3VuZGVmICBBU1NFUlQKLSNkZWZpbmUgQVNTRVJUKHgpCi0KLXR5cGVkZWYgc3RydWN0IG9zX2Nvb2tpZQkqIFBPU19DT09LSUU7Ci10eXBlZGVmIHN0cnVjdCBwY2lfZGV2IAkJKiBQUENJX0RFVjsKLXR5cGVkZWYgc3RydWN0IG5ldF9kZXZpY2UJKiBQTkVUX0RFVjsKLXR5cGVkZWYgdm9pZAkJCQkqIFBORElTX1BBQ0tFVDsKLXR5cGVkZWYgY2hhcgkJCQlORElTX1BBQ0tFVDsKLXR5cGVkZWYgUE5ESVNfUEFDS0VUCQkqIFBQTkRJU19QQUNLRVQ7Ci10eXBlZGVmCWRtYV9hZGRyX3QJCQlORElTX1BIWVNJQ0FMX0FERFJFU1M7Ci10eXBlZGVmCWRtYV9hZGRyX3QJCQkqIFBORElTX1BIWVNJQ0FMX0FERFJFU1M7Ci10eXBlZGVmIHNwaW5sb2NrX3QJCQlORElTX1NQSU5fTE9DSzsKLXR5cGVkZWYgc3RydWN0IHRpbWVyX2xpc3QJTkRJU19NSU5JUE9SVF9USU1FUjsKLXR5cGVkZWYgdm9pZAkJCQkqIE5ESVNfSEFORExFOwotdHlwZWRlZiBjaGFyIAkJCQkqIFBORElTX0JVRkZFUjsKLQotCi0KLXZvaWQgaGV4X2R1bXAoY2hhciAqc3RyLCB1bnNpZ25lZCBjaGFyICpwU3JjQnVmVkEsIHVuc2lnbmVkIGludCBTcmNCdWZMZW4pOwotCi1kbWFfYWRkcl90IGxpbnV4X3BjaV9tYXBfc2luZ2xlKHZvaWQgKmhhbmRsZSwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwgaW50IHNkX2lkeCwgaW50IGRpcmVjdGlvbik7Ci12b2lkIGxpbnV4X3BjaV91bm1hcF9zaW5nbGUodm9pZCAqaGFuZGxlLCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbik7Ci0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gTU9WRSBUTyBydG1wLmggPwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSNkZWZpbmUgUEtUU1JDX05ESVMgICAgICAgICAgICAgMHg3ZgotI2RlZmluZSBQS1RTUkNfRFJJVkVSICAgICAgICAgICAweDBmCi0jZGVmaW5lIFBSSU5UX01BQyhhZGRyKQlcCi0JYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XQotCi0KLSNkZWZpbmUgUlQyODYwX1BDSV9ERVZJQ0VfSUQJCTB4MDYwMQotCi0jaWZkZWYgUlQyODYwCi0jZGVmaW5lIFBDSV9NQVBfU0lOR0xFKF9oYW5kbGUsIF9wdHIsIF9zaXplLCBfc2RfaWR4LCBfZGlyKSBcCi0JbGludXhfcGNpX21hcF9zaW5nbGUoX2hhbmRsZSwgX3B0ciwgX3NpemUsIF9zZF9pZHgsIF9kaXIpCi0KLSNkZWZpbmUgUENJX1VOTUFQX1NJTkdMRShfaGFuZGxlLCBfcHRyLCBfc2l6ZSwgX2RpcikgXAotCWxpbnV4X3BjaV91bm1hcF9zaW5nbGUoX2hhbmRsZSwgX3B0ciwgX3NpemUsIF9kaXIpCi0KLSNkZWZpbmUgUENJX0FMTE9DX0NPTlNJU1RFTlQoX3BjaV9kZXYsIF9zaXplLCBfcHRyKSBcCi0JcGNpX2FsbG9jX2NvbnNpc3RlbnQoX3BjaV9kZXYsIF9zaXplLCBfcHRyKQotCi0jZGVmaW5lIFBDSV9GUkVFX0NPTlNJU1RFTlQoX3BjaV9kZXYsIF9zaXplLCBfdmlydHVhbF9hZGRyLCBfcGh5c2ljYWxfYWRkcikgXAotCXBjaV9mcmVlX2NvbnNpc3RlbnQoX3BjaV9kZXYsIF9zaXplLCBfdmlydHVhbF9hZGRyLCBfcGh5c2ljYWxfYWRkcikKLQotI2RlZmluZSBERVZfQUxMT0NfU0tCKF9sZW5ndGgpIFwKLQlkZXZfYWxsb2Nfc2tiKF9sZW5ndGgpCi0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLSNkZWZpbmUgUENJX01BUF9TSU5HTEUoX2hhbmRsZSwgX3B0ciwgX3NpemUsIF9kaXIpIChVTE9ORykwCi0KLSNkZWZpbmUgUENJX1VOTUFQX1NJTkdMRShfaGFuZGxlLCBfcHRyLCBfc2l6ZSwgX2RpcikKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQotCi0jZGVmaW5lIEJFQUNPTl9GUkFNRV9ETUFfQ0FDSEVfV0JBQ0soX3B0ciwgX3NpemUpCVwKLQlkbWFfY2FjaGVfd2JhY2soX3B0ciwgX3NpemUpCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQotI2RlZmluZSBOZGlzTUluZGljYXRlU3RhdHVzKF93LCBfeCwgX3ksIF96KQotCi10eXBlZGVmIHN0cnVjdCB0aW1lcl9saXN0CVJUTVBfT1NfVElNRVI7Ci0KLSNpZmRlZiBSVDI4NzAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tIFRpbWVyIFJlbGF0ZWQgTUFSQ08gLS0tLS0tLS0tLS0tLS0tKi8KLS8vIEluIFJUMjg3MCwgd2UgaGF2ZSBhIGxvdCBvZiB0aW1lciBmdW5jdGlvbnMgYW5kIHdpbGwgcmVhZC93cml0ZSByZWdpc3RlciwgaXQncwotLy8Jbm90IGFsbG93ZWQgaW4gTGludXggVVNCIHN1Yi1zeXN0ZW0gdG8gZG8gaXQgKCBiZWNhdXNlIG9mIHNsZWVwIGlzc3VlIHdoZW4gc3VibWl0Ci0vLyAgdG8gY3RybCBwaXBlKS4gU28gd2UgbmVlZCBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gdGFrZSBjYXJlIGl0LgotCi10eXBlZGVmIFZPSUQgKCpSVDI4NzBfVElNRVJfSEFORExFKSgKLQlJTiAgUFZPSUQgICBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gIFBWT0lEICAgRnVuY3Rpb25Db250ZXh0LAotCUlOICBQVk9JRCAgIFN5c3RlbVNwZWNpZmljMiwKLQlJTiAgUFZPSUQgICBTeXN0ZW1TcGVjaWZpYzMpOwotI2VuZGlmIC8vIFJUMjg3MCAvLwotCi0KLXR5cGVkZWYgc3RydWN0ICBfUkFMSU5LX1RJTUVSX1NUUlVDVCAgICB7Ci0gICAgUlRNUF9PU19USU1FUgkJVGltZXJPYmo7ICAgICAgIC8vIE5kaXMgVGltZXIgb2JqZWN0Ci0JQk9PTEVBTgkJCQlWYWxpZDsJCQkvLyBTZXQgdG8gVHJ1ZSB3aGVuIGNhbGwgUlRNUEluaXRUaW1lcgotICAgIEJPT0xFQU4gICAgICAgICAgICAgU3RhdGU7ICAgICAgICAgIC8vIFRydWUgaWYgdGltZXIgY2FuY2VsbGVkCi0gICAgQk9PTEVBTgkgICAgICAJCVBlcmlvZGljVHlwZTsJLy8gVHJ1ZSBpZiB0aW1lciBpcyBwZXJpb2RpYyB0aW1lcgotICAgIEJPT0xFQU4gICAgICAgICAgICAgUmVwZWF0OyAgICAgICAgIC8vIFRydWUgaWYgcGVyaW9kaWMgdGltZXIKLSAgICBVTE9ORyAgICAgICAgICAgICAgIFRpbWVyVmFsdWU7ICAgICAvLyBUaW1lciB2YWx1ZSBpbiBtaWxsaXNlY29uZHMKLQlVTE9ORwkJCQljb29raWU7CQkJLy8gb3Mgc3BlY2lmaWMgb2JqZWN0Ci0jaWZkZWYgUlQyODcwCi0JUlQyODcwX1RJTUVSX0hBTkRMRQloYW5kbGU7Ci0Jdm9pZAkJCQkqcEFkOwotI2VuZGlmIC8vIFJUMjg3MCAvLwotfSAgIFJBTElOS19USU1FUl9TVFJVQ1QsICpQUkFMSU5LX1RJTUVSX1NUUlVDVDsKLQotCi0jaWZkZWYgUlQyODcwCi0KLXR5cGVkZWYgZW51bSBfUlQyODcwX0tFUk5FTF9USFJFQURfU1RBVFVTXwotewotCVJUMjg3MF9USFJFQURfVU5LTk9XTiA9IDAsCi0JUlQyODcwX1RIUkVBRF9JTklURUQgPSAxLAotCVJUMjg3MF9USFJFQURfUlVOTklORyA9IDIsCi0JUlQyODcwX1RIUkVBRF9TVE9QRUQgPSA0LAotfVJUMjg3MF9LRVJORUxfVEhSRUFEX1NUQVRVUzsKLQotI2RlZmluZSBSVDI4NzBfVEhSRUFEX0NBTl9ET19JTlNFUlQJCShSVDI4NzBfVEhSRUFEX0lOSVRFRCB8UlQyODcwX1RIUkVBRF9SVU5OSU5HKQotCi10eXBlZGVmIHN0cnVjdCBfUlQyODcwX1RJTUVSX0VOVFJZXwotewotCVJBTElOS19USU1FUl9TVFJVQ1QgCQkJKnBSYVRpbWVyOwotCXN0cnVjdCBfUlQyODcwX1RJTUVSX0VOVFJZXyAJKnBOZXh0OwotfVJUMjg3MF9USU1FUl9FTlRSWTsKLQotCi0jZGVmaW5lIFRJTUVSX1FVRVVFX1NJWkVfTUFYCTEyOAotdHlwZWRlZiBzdHJ1Y3QgX1JUMjg3MF9USU1FUl9RVUVVRV8KLXsKLQl1bnNpZ25lZCBpbnQJCXN0YXR1czsKLQlVQ0hBUgkJCQkqcFRpbWVyUVBvbGw7Ci0JUlQyODcwX1RJTUVSX0VOVFJZCSpwUVBvbGxGcmVlTGlzdDsKLQlSVDI4NzBfVElNRVJfRU5UUlkgCSpwUUhlYWQ7Ci0JUlQyODcwX1RJTUVSX0VOVFJZIAkqcFFUYWlsOwotfVJUMjg3MF9USU1FUl9RVUVVRTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQotCi0vLyNkZWZpbmUgREJHCTEKLQotLy8KLS8vICBNQUNSTyBmb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uCi0vLwotCi0jaWZkZWYgREJHCi1leHRlcm4gVUxPTkcgICAgUlREZWJ1Z0xldmVsOwotCi0jZGVmaW5lIERCR1BSSU5UX1JBVyhMZXZlbCwgRm10KSAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKExldmVsIDw9IFJURGVidWdMZXZlbCkgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHByaW50ayBGbXQ7ICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIERCR1BSSU5UKExldmVsLCBGbXQpICAgIERCR1BSSU5UX1JBVyhMZXZlbCwgRm10KQotCi0KLSNkZWZpbmUgREJHUFJJTlRfRVJSKEZtdCkgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwcmludGsoIkVSUk9SISEhICIpOyAgICAgICAgICBcCi0gICAgcHJpbnRrIEZtdDsgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgREJHUFJJTlRfUyhTdGF0dXMsIEZtdCkJCVwKLXsJCQkJCQkJCQlcCi0JcHJpbnRrIEZtdDsJCQkJCVwKLX0KLQotCi0jZWxzZQotI2RlZmluZSBEQkdQUklOVChMZXZlbCwgRm10KQotI2RlZmluZSBEQkdQUklOVF9SQVcoTGV2ZWwsIEZtdCkKLSNkZWZpbmUgREJHUFJJTlRfUyhTdGF0dXMsIEZtdCkKLSNkZWZpbmUgREJHUFJJTlRfRVJSKEZtdCkKLSNlbmRpZgotCi0KLS8vCi0vLyAgc3Bpbl9sb2NrIGVuaGFuY2VkIGZvciBOZXN0ZWQgc3BpbiBsb2NrCi0vLworLyogKi8KKy8qICBzcGluX2xvY2sgZW5oYW5jZWQgZm9yIE5lc3RlZCBzcGluIGxvY2sgKi8KKy8qICovCiAjZGVmaW5lIE5kaXNBbGxvY2F0ZVNwaW5Mb2NrKF9fbG9jaykgICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIHNwaW5fbG9ja19pbml0KChzcGlubG9ja190ICopKF9fbG9jaykpOyAgICAgICAgICAgICAgIFwKIH0KIAogI2RlZmluZSBOZGlzRnJlZVNwaW5Mb2NrKGxvY2spICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KKwlkb3t9d2hpbGUoMCkKIAogI2RlZmluZSBSVE1QX1NFTV9MT0NLKF9fbG9jaykJCQkJCVwKIHsJCQkJCQkJCQkJCQlcCi0Jc3Bpbl9sb2NrX2JoKChzcGlubG9ja190ICopKF9fbG9jaykpOwkJCQlcCisJc3Bpbl9sb2NrX2JoKChzcGlubG9ja190ICopKF9fbG9jaykpOwkJXAogfQogCiAjZGVmaW5lIFJUTVBfU0VNX1VOTE9DSyhfX2xvY2spCQkJCQlcCiB7CQkJCQkJCQkJCQkJXAotCXNwaW5fdW5sb2NrX2JoKChzcGlubG9ja190ICopKF9fbG9jaykpOwkJCQlcCisJc3Bpbl91bmxvY2tfYmgoKHNwaW5sb2NrX3QgKikoX19sb2NrKSk7CQlcCiB9CiAKLS8vIHNhbXBsZSwgdXNlIHNlbWFwaG9yZSBsb2NrIHRvIHJlcGxhY2UgSVJRIGxvY2ssIDIwMDcvMTEvMTUKKy8qIHNhbXBsZSwgdXNlIHNlbWFwaG9yZSBsb2NrIHRvIHJlcGxhY2UgSVJRIGxvY2ssIDIwMDcvMTEvMTUgKi8KICNkZWZpbmUgUlRNUF9JUlFfTE9DSyhfX2xvY2ssIF9faXJxZmxhZ3MpCQkJXAogewkJCQkJCQkJCQkJCQlcCiAJX19pcnFmbGFncyA9IDA7CQkJCQkJCQkJXApAQCAtNDA0LDcgKzIyOSw3IEBACiAKICNkZWZpbmUgUlRNUF9JUlFfVU5MT0NLKF9fbG9jaywgX19pcnFmbGFnKQkJCVwKIHsJCQkJCQkJCQkJCQkJXAotCXBBZC0+aXJxX2Rpc2FibGVkICY9IDA7IFwKKwlwQWQtPmlycV9kaXNhYmxlZCAmPSAwOwkJCQkJCQlcCiAJc3Bpbl91bmxvY2tfYmgoKHNwaW5sb2NrX3QgKikoX19sb2NrKSk7CQkJXAogfQogCkBAIC00MTgsNzUgKzI0Myw4IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgoc3BpbmxvY2tfdCAqKShfX2xvY2spLCAoKHVuc2lnbmVkIGxvbmcpX19pcnFmbGFnKSk7CVwKIH0KIAotI2lmZGVmIFJUMjg2MAotLy9QYXRjaCBmb3IgQVNJQyB0dXJzdCByZWFkL3dyaXRlIGJ1ZywgbmVlZHMgdG8gcmVtb3ZlIGFmdGVyIG1ldGVsIGZpeAotI2RlZmluZSBSVE1QX0lPX1JFQUQzMihfQSwgX1IsIF9wVikJCQkJCQkJCVwKLXsJCQkJCQkJCQkJCQkJCQkJXAotICAgIGlmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJKCpfcFYgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSkpOwkJXAotCQkoKl9wViA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpKTsJCQlcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlbHNlCQkJCQkJCQkJCQkJCQkJXAotCQkqX3BWID0gMDsJCQkJCQkJCQkJCQkJXAotfQotI2RlZmluZSBSVE1QX0lPX0ZPUkNFX1JFQUQzMihfQSwgX1IsIF9wVikJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQkJXAotCSgqX3BWID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpKTsJCVwKLQkoKl9wViA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpKTsJCQlcCi19Ci0jZGVmaW5lIFJUTVBfSU9fUkVBRDgoX0EsIF9SLCBfcFYpCQkJCQkJCQlcCi17CQkJCQkJCQkJCQkJCQkJCVwKLQkoKl9wViA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKSk7CQkJXAotCSgqX3BWID0gcmVhZGIoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSkpOwkJCQlcCi19Ci0jZGVmaW5lIFJUTVBfSU9fV1JJVEUzMihfQSwgX1IsIF9WKQkJCQkJCQkJCQkJCVwKLXsJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLSAgICBpZiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JVUlOVAlWYWw7CQkJCQkJCQkJCQkJCQkJCVwKLQlWYWwgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSk7CQkJXAotCXdyaXRlbChfViwgKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSk7CQkJCQkJCQlcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLSNkZWZpbmUgUlRNUF9JT19XUklURTgoX0EsIF9SLCBfVikJCQkJCQkJCQkJCQlcCi17CQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JVUlOVAlWYWw7CQkJCQkJCQkJCQkJCQkJCVwKLQlWYWwgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSk7CQkJXAotCXdyaXRlYigoX1YpLCAoUFVDSEFSKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKTsJCVwKLX0KLSNkZWZpbmUgUlRNUF9JT19XUklURTE2KF9BLCBfUiwgX1YpCQkJCQkJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCVVJTlQJVmFsOwkJCQkJCQkJCQkJCQkJCQlcCi0JVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpOwkJCVwKLQl3cml0ZXcoKF9WKSwgKFBVU0hPUlQpKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpOwlcCi19Ci0jZW5kaWYgLyogUlQyODYwICovCi0jaWZkZWYgUlQyODcwCi0vL1BhdGNoIGZvciBBU0lDIHR1cnN0IHJlYWQvd3JpdGUgYnVnLCBuZWVkcyB0byByZW1vdmUgYWZ0ZXIgbWV0ZWwgZml4Ci0jZGVmaW5lIFJUTVBfSU9fUkVBRDMyKF9BLCBfUiwgX3BWKQkJCQkJCQkJXAotCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKF9BLCBfUiwgX3BWKQotCi0jZGVmaW5lIFJUTVBfSU9fUkVBRDgoX0EsIF9SLCBfcFYpCQkJCQkJCQlcCi17CQkJCQkJCQkJCQkJCQkJCVwKLX0KLQotI2RlZmluZSBSVE1QX0lPX1dSSVRFMzIoX0EsIF9SLCBfVikJCQkJCQkJCVwKLQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIoX0EsIF9SLCBfVikKLQotCi0jZGVmaW5lIFJUTVBfSU9fV1JJVEU4KF9BLCBfUiwgX1YpCQkJCQkJCQlcCi17CQkJCQkJCQkJCQkJCQkJCVwKLQlVU0hPUlQJX1ZhbCA9IF9WOwkJCQkJCQkJCQkJXAotCVJUVVNCU2luZ2xlV3JpdGUoX0EsIF9SLCBfVmFsKTsJCQkJCQkJCVwKLX0KLQotCi0jZGVmaW5lIFJUTVBfSU9fV1JJVEUxNihfQSwgX1IsIF9WKQkJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQlcCi0JUlRVU0JTaW5nbGVXcml0ZShfQSwgX1IsIF9WKTsJCQkJCQkJCVwKLX0KLSNlbmRpZiAvLyBSVDI4NzAgLy8KKyNkZWZpbmUgTmRpc0FjcXVpcmVTcGluTG9jawkJUlRNUF9TRU1fTE9DSworI2RlZmluZSBOZGlzUmVsZWFzZVNwaW5Mb2NrCQlSVE1QX1NFTV9VTkxPQ0sKIAogI2lmbmRlZiB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dAogI2RlZmluZSBfX3dhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHdxLCBjb25kaXRpb24sIHJldCkgXApAQCAtNTE5LDcgKzI3Nyw3MyBAQAogICAgICAgICBfX3JldDsgXAogfSkKICNlbmRpZgotI2RlZmluZSBPTkVfVElDSyAxCisKKyNkZWZpbmUgUlRNUF9TRU1fRVZFTlRfSU5JVF9MT0NLRUQoX3BTZW1hKQlzZW1hX2luaXQoKF9wU2VtYSksIDApCisjZGVmaW5lIFJUTVBfU0VNX0VWRU5UX0lOSVQoX3BTZW1hKQkJCXNlbWFfaW5pdCgoX3BTZW1hKSwgMSkKKyNkZWZpbmUgUlRNUF9TRU1fRVZFTlRfV0FJVChfcFNlbWEsIF9zdGF0dXMpCSgoX3N0YXR1cykgPSBkb3duX2ludGVycnVwdGlibGUoKF9wU2VtYSkpKQorI2RlZmluZSBSVE1QX1NFTV9FVkVOVF9VUChfcFNlbWEpCQkJdXAoX3BTZW1hKQorCisjaWZkZWYgS1RIUkVBRF9TVVBQT1JUCisjZGVmaW5lIFJUTVBfV0FJVF9FVkVOVF9JTlRFUlJVUFRJQkxFKF9wQWQsIF9wVGFzaykgXAoreyBcCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShfcFRhc2stPmt0aHJlYWRfcSwgXAorCQkJCQkJCQkgX3BUYXNrLT5rdGhyZWFkX3J1bm5pbmcgfHwga3RocmVhZF9zaG91bGRfc3RvcCgpKTsgXAorCQlfcFRhc2stPmt0aHJlYWRfcnVubmluZyA9IEZBTFNFOyBcCisJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIFwKKwkJeyBcCisJCQlSVE1QX1NFVF9GTEFHKF9wQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7IFwKKwkJCWJyZWFrOyBcCisJCX0gXAorfQorI2VuZGlmCisKKyNpZmRlZiBLVEhSRUFEX1NVUFBPUlQKKyNkZWZpbmUgV0FLRV9VUChfcFRhc2spIFwKKwlkb3sgXAorCQlpZiAoKF9wVGFzayktPmt0aHJlYWRfdGFzaykgXAorICAgICAgICB7IFwKKwkJCShfcFRhc2spLT5rdGhyZWFkX3J1bm5pbmcgPSBUUlVFOyBcCisJICAgICAgICB3YWtlX3VwKCYoX3BUYXNrKS0+a3RocmVhZF9xKTsgXAorCQl9IFwKKwl9d2hpbGUoMCkKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU9TIE1lbW9yeSBBY2Nlc3MgcmVsYXRlZCBkYXRhIHN0cnVjdHVyZSBhbmQgZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTUVNX0FMTE9DX0ZMQUcgICAgICAoR0ZQX0FUT01JQykJLyooR0ZQX0RNQSB8IEdGUF9BVE9NSUMpICovCisKKyNkZWZpbmUgTmRpc01vdmVNZW1vcnkoRGVzdGluYXRpb24sIFNvdXJjZSwgTGVuZ3RoKSBtZW1tb3ZlKERlc3RpbmF0aW9uLCBTb3VyY2UsIExlbmd0aCkKKyNkZWZpbmUgTmRpc0NvcHlNZW1vcnkoRGVzdGluYXRpb24sIFNvdXJjZSwgTGVuZ3RoKSBtZW1jcHkoRGVzdGluYXRpb24sIFNvdXJjZSwgTGVuZ3RoKQorI2RlZmluZSBOZGlzWmVyb01lbW9yeShEZXN0aW5hdGlvbiwgTGVuZ3RoKSAgICAgICAgIG1lbXNldChEZXN0aW5hdGlvbiwgMCwgTGVuZ3RoKQorI2RlZmluZSBOZGlzRmlsbE1lbW9yeShEZXN0aW5hdGlvbiwgTGVuZ3RoLCBGaWxsKSAgIG1lbXNldChEZXN0aW5hdGlvbiwgRmlsbCwgTGVuZ3RoKQorI2RlZmluZSBOZGlzQ21wTWVtb3J5KERlc3RpbmF0aW9uLCBTb3VyY2UsIExlbmd0aCkgIG1lbWNtcChEZXN0aW5hdGlvbiwgU291cmNlLCBMZW5ndGgpCisjZGVmaW5lIE5kaXNFcXVhbE1lbW9yeShTb3VyY2UxLCBTb3VyY2UyLCBMZW5ndGgpICAgKCFtZW1jbXAoU291cmNlMSwgU291cmNlMiwgTGVuZ3RoKSkKKyNkZWZpbmUgUlRNUEVxdWFsTWVtb3J5KFNvdXJjZTEsIFNvdXJjZTIsIExlbmd0aCkJKCFtZW1jbXAoU291cmNlMSwgU291cmNlMiwgTGVuZ3RoKSkKKworI2RlZmluZSBNbG1lQWxsb2NhdGVNZW1vcnkoX3BBZCwgX3BwVkEpCQlvc19hbGxvY19tZW0oX3BBZCwgX3BwVkEsIE1HTVRfRE1BX0JVRkZFUl9TSVpFKQorI2RlZmluZSBNbG1lRnJlZU1lbW9yeShfcEFkLCBfcFZBKQkJCW9zX2ZyZWVfbWVtKF9wQWQsIF9wVkEpCisKKyNkZWZpbmUgQ09QWV9NQUNfQUREUihBZGRyMSwgQWRkcjIpICAgICAgICAgICAgIG1lbWNweSgoQWRkcjEpLCAoQWRkcjIpLCBNQUNfQUREUl9MRU4pCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJT1MgdGFzayByZWxhdGVkIGRhdGEgc3RydWN0dXJlIGFuZCBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBSVE1QX09TX01HTVRfVEFTS19GTEFHUwlDTE9ORV9WTQorCisjZGVmaW5lCVRIUkVBRF9QSURfSU5JVF9WQUxVRQlOVUxMCisjZGVmaW5lCUdFVF9QSUQoX3YpCWZpbmRfZ2V0X3BpZCgoX3YpKQorI2RlZmluZQlHRVRfUElEX05VTUJFUihfdikJcGlkX25yKChfdikpCisjZGVmaW5lIENIRUNLX1BJRF9MRUdBTElUWShfcGlkKQlpZiAocGlkX25yKChfcGlkKSkgPiAwKQorI2RlZmluZSBLSUxMX1RIUkVBRF9QSUQoX0EsIF9CLCBfQykJa2lsbF9waWQoKF9BKSwgKF9CKSwgKF9DKSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaW1lciByZWxhdGVkIGRlZmluaXRpb25zIGFuZCBkYXRhIHN0cnVjdHVyZXMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgT1NfSFoJCQlIWgorCit0eXBlZGVmIHZvaWQgKCpUSU1FUl9GVU5DVElPTikgKHVuc2lnbmVkIGxvbmcpOworCiAjZGVmaW5lIE9TX1dBSVQoX3RpbWUpIFwKIHsJaW50IF9pOyBcCiAJbG9uZyBfbG9vcCA9ICgoX3RpbWUpLygxMDAwL09TX0haKSkgPiAwID8gKChfdGltZSkvKDEwMDAvT1NfSFopKSA6IDE7XApAQCAtNTI4LDcxICszNTIsMjkyIEBACiAJZm9yIChfaT0wOyBfaTwoX2xvb3ApOyBfaSsrKSBcCiAJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KF93YWl0LCAwLCBPTkVfVElDSyk7IH0KIAorI2RlZmluZSBSVE1QX1RJTUVfQUZURVIoYSxiKQkJXAorCSh0eXBlY2hlY2sodW5zaWduZWQgbG9uZywgKHVuc2lnbmVkIGxvbmcpYSkgJiYgXAorCSB0eXBlY2hlY2sodW5zaWduZWQgbG9uZywgKHVuc2lnbmVkIGxvbmcpYikgJiYgXAorCSAoKGxvbmcpKGIpIC0gKGxvbmcpKGEpIDwgMCkpCiAKLXR5cGVkZWYgdm9pZCAoKlRJTUVSX0ZVTkNUSU9OKSh1bnNpZ25lZCBsb25nKTsKKyNkZWZpbmUgUlRNUF9USU1FX0FGVEVSX0VRKGEsYikJXAorCSh0eXBlY2hlY2sodW5zaWduZWQgbG9uZywgKHVuc2lnbmVkIGxvbmcpYSkgJiYgXAorCSB0eXBlY2hlY2sodW5zaWduZWQgbG9uZywgKHVuc2lnbmVkIGxvbmcpYikgJiYgXAorCSAoKGxvbmcpKGEpIC0gKGxvbmcpKGIpID49IDApKQorI2RlZmluZSBSVE1QX1RJTUVfQkVGT1JFKGEsYikJUlRNUF9USU1FX0FGVEVSX0VRKGIsYSkKIAotI2RlZmluZSBDT1BZX01BQ19BRERSKEFkZHIxLCBBZGRyMikgICAgICAgICAgICAgbWVtY3B5KChBZGRyMSksIChBZGRyMiksIE1BQ19BRERSX0xFTikKKyNkZWZpbmUgT05FX1RJQ0sgMQogCi0jZGVmaW5lIE1sbWVBbGxvY2F0ZU1lbW9yeShfcEFkLCBfcHBWQSkgb3NfYWxsb2NfbWVtKF9wQWQsIF9wcFZBLCBNR01UX0RNQV9CVUZGRVJfU0laRSkKLSNkZWZpbmUgTWxtZUZyZWVNZW1vcnkoX3BBZCwgX3BWQSkgICAgIG9zX2ZyZWVfbWVtKF9wQWQsIF9wVkEpCi0KLSNpZmRlZiBSVDI4NjAKLSNkZWZpbmUgQlVJTERfVElNRVJfRlVOQ1RJT04oX2Z1bmMpCQkJCQkJCQkJCQkJXAotdm9pZCBsaW51eF8jI19mdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSkJCQkJCQkJCQkJCVwKLXsJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQlQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIgPSAoUFJBTElOS19USU1FUl9TVFJVQ1QpIGRhdGE7CQkJCVwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCV9mdW5jKE5VTEwsIChQVk9JRCkgcFRpbWVyLT5jb29raWUsIE5VTEwsIHBUaW1lcik7IAkJCQkJCQlcCi0JaWYgKHBUaW1lci0+UmVwZWF0KQkJCQkJCQkJCQkJCQkJCVwKLQkJUlRNUF9PU19BZGRfVGltZXIoJnBUaW1lci0+VGltZXJPYmosIHBUaW1lci0+VGltZXJWYWx1ZSk7CQkJCVwKK3N0YXRpYyBpbmxpbmUgdm9pZCBOZGlzR2V0U3lzdGVtVXBUaW1lKHVuc2lnbmVkIGxvbmcgKiB0aW1lKQoreworCSp0aW1lID0gamlmZmllczsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglPUyBzcGVjaWZpYyBjb29raWUgZGF0YSBzdHJ1Y3R1cmUgYmluZGluZyB0byBzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBvc19jb29raWUgeworI2lmZGVmIFJUTVBfTUFDX1BDSQorCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwYXJlbnRfcGNpX2RldjsKKwl1MTYgRGV2aWNlSUQ7CisJZG1hX2FkZHJfdCBwQWRfcGE7CisjZW5kaWYJCQkJLyogUlRNUF9NQUNfUENJIC8vICovCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJc3RydWN0IHVzYl9kZXZpY2UgKnBVc2JfRGV2OworI2VuZGlmCQkJCS8qIFJUTVBfTUFDX1VTQiAvLyAqLworCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHJ4X2RvbmVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgbWdtdF9kbWFfZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBhYzBfZG1hX2RvbmVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgYWMxX2RtYV9kb25lX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IGFjMl9kbWFfZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBhYzNfZG1hX2RvbmVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdGJ0dF90YXNrOworI2lmZGVmIFJUTVBfTUFDX1BDSQorCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBmaWZvX3N0YXRpc3RpY19mdWxsX3Rhc2s7CisjZW5kaWYJCQkJLyogUlRNUF9NQUNfUENJIC8vICovCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IG51bGxfZnJhbWVfY29tcGxldGVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgcnRzX2ZyYW1lX2NvbXBsZXRlX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHBzcG9sbF9mcmFtZV9jb21wbGV0ZV90YXNrOworI2VuZGlmCQkJCS8qIFJUTVBfTUFDX1VTQiAvLyAqLworCisJdW5zaWduZWQgbG9uZyBhcGRfcGlkOwkvKjgwMi4xeCBkYWVtb24gcGlkICovCisJaW50IGlvY3RsX2lmX3R5cGU7CisJaW50IGlvY3RsX2lmOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglPUyBkZWJ1Z2dpbmcgYW5kIHByaW50aW5nIHJlbGF0ZWQgZGVmaW5pdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFBSSU5UX01BQyhhZGRyKQlcCisJYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XQorCisjaWZkZWYgREJHCitleHRlcm4gdW5zaWduZWQgbG9uZyBSVERlYnVnTGV2ZWw7CisKKyNkZWZpbmUgREJHUFJJTlRfUkFXKExldmVsLCBGbXQpICAgIFwKK2RveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChMZXZlbCA8PSBSVERlYnVnTGV2ZWwpICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmludGsgRm10OyAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK313aGlsZSgwKQorCisjZGVmaW5lIERCR1BSSU5UKExldmVsLCBGbXQpICAgIERCR1BSSU5UX1JBVyhMZXZlbCwgRm10KQorCisjZGVmaW5lIERCR1BSSU5UX0VSUihGbXQpICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHJpbnRrKCJFUlJPUiEgIik7ICAgICAgICAgIFwKKyAgICBwcmludGsgRm10OyAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBEQkdQUklOVF9TKFN0YXR1cywgRm10KQkJXAorewkJCQkJCQkJCVwKKwlwcmludGsgRm10OwkJCQkJXAorfQorCisjZWxzZQorI2RlZmluZSBEQkdQUklOVChMZXZlbCwgRm10KQorI2RlZmluZSBEQkdQUklOVF9SQVcoTGV2ZWwsIEZtdCkKKyNkZWZpbmUgREJHUFJJTlRfUyhTdGF0dXMsIEZtdCkKKyNkZWZpbmUgREJHUFJJTlRfRVJSKEZtdCkKICNlbmRpZgotI2lmZGVmIFJUMjg3MAotI2RlZmluZSBCVUlMRF9USU1FUl9GVU5DVElPTihfZnVuYykJCQkJCQkJCQkJCQkJXAotdm9pZCBsaW51eF8jI19mdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSkJCQkJCQkJCQkJCQlcCi17CQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCVBSQUxJTktfVElNRVJfU1RSVUNUCV9wVGltZXIgPSAoUFJBTElOS19USU1FUl9TVFJVQ1QpZGF0YTsJCQkJCVwKLQlSVDI4NzBfVElNRVJfRU5UUlkJCSpfcFFOb2RlOwkJCQkJCQkJCQkJCVwKLQlSVE1QX0FEQVBURVIJCQkqX3BBZDsJCQkJCQkJCQkJCQkJXAotCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JX3BUaW1lci0+aGFuZGxlID0gX2Z1bmM7CQkJCQkJCQkJCQkJCQkJXAotCV9wQWQgPSAoUlRNUF9BREFQVEVSICopX3BUaW1lci0+cEFkOwkJCQkJCQkJCQkJCVwKLQlfcFFOb2RlID0gUlQyODcwX1RpbWVyUV9JbnNlcnQoX3BBZCwgX3BUaW1lcik7IAkJCQkJCQkJCVwKLQlpZiAoKF9wUU5vZGUgPT0gTlVMTCkgJiYgKF9wQWQtPlRpbWVyUS5zdGF0dXMgJiBSVDI4NzBfVEhSRUFEX0NBTl9ET19JTlNFUlQpKQlcCi0JCVJUTVBfT1NfQWRkX1RpbWVyKCZfcFRpbWVyLT5UaW1lck9iaiwgSFopOyAgICAgICAgICAgICAgIAkJCQkJXAorCisjZGVmaW5lIEFTU0VSVCh4KQorCit2b2lkIGhleF9kdW1wKGNoYXIgKnN0ciwgdW5zaWduZWQgY2hhciAqcFNyY0J1ZlZBLCB1bnNpZ25lZCBpbnQgU3JjQnVmTGVuKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCVRoZSBmb2xsb3dpbmcgY29kZSBhcmUgbm90IHJldmlzZWQsIHRlbXBvcmFyeSBwdXQgaXQgaGVyZS4KKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERldmljZSBETUEgQWNjZXNzIHJlbGF0ZWQgZGVmaW5pdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFJUTVBfTUFDX1BDSQorZG1hX2FkZHJfdCBsaW51eF9wY2lfbWFwX3NpbmdsZSh2b2lkICpoYW5kbGUsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsCisJCQkJaW50IHNkX2lkeCwgaW50IGRpcmVjdGlvbik7Cit2b2lkIGxpbnV4X3BjaV91bm1hcF9zaW5nbGUodm9pZCAqaGFuZGxlLCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwKKwkJCSAgICBpbnQgZGlyZWN0aW9uKTsKKworI2RlZmluZSBQQ0lfTUFQX1NJTkdMRShfaGFuZGxlLCBfcHRyLCBfc2l6ZSwgX3NkX2lkeCwgX2RpcikgXAorCWxpbnV4X3BjaV9tYXBfc2luZ2xlKF9oYW5kbGUsIF9wdHIsIF9zaXplLCBfc2RfaWR4LCBfZGlyKQorCisjZGVmaW5lIFBDSV9VTk1BUF9TSU5HTEUoX2hhbmRsZSwgX3B0ciwgX3NpemUsIF9kaXIpIFwKKwlsaW51eF9wY2lfdW5tYXBfc2luZ2xlKF9oYW5kbGUsIF9wdHIsIF9zaXplLCBfZGlyKQorCisjZGVmaW5lIFBDSV9BTExPQ19DT05TSVNURU5UKF9wY2lfZGV2LCBfc2l6ZSwgX3B0cikgXAorCXBjaV9hbGxvY19jb25zaXN0ZW50KF9wY2lfZGV2LCBfc2l6ZSwgX3B0cikKKworI2RlZmluZSBQQ0lfRlJFRV9DT05TSVNURU5UKF9wY2lfZGV2LCBfc2l6ZSwgX3ZpcnR1YWxfYWRkciwgX3BoeXNpY2FsX2FkZHIpIFwKKwlwY2lfZnJlZV9jb25zaXN0ZW50KF9wY2lfZGV2LCBfc2l6ZSwgX3ZpcnR1YWxfYWRkciwgX3BoeXNpY2FsX2FkZHIpCisKKyNkZWZpbmUgREVWX0FMTE9DX1NLQihfbGVuZ3RoKSBcCisJZGV2X2FsbG9jX3NrYihfbGVuZ3RoKQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgorI2RlZmluZSBQQ0lfTUFQX1NJTkdMRShfaGFuZGxlLCBfcHRyLCBfc2l6ZSwgX2RpcikgKHVuc2lnbmVkIGxvbmcpMAorCisjZGVmaW5lIFBDSV9VTk1BUF9TSU5HTEUoX2hhbmRsZSwgX3B0ciwgX3NpemUsIF9kaXIpCisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisKKy8qCisgKiB1bnNpZ25lZCBsb25nCisgKiBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdygKKyAqICAgZG1hX2FkZHJfdCAgUGh5c2ljYWxBZGRyZXNzKTsKKyAqLworI2RlZmluZSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhQaHlzaWNhbEFkZHJlc3MpCQkoUGh5c2ljYWxBZGRyZXNzKQorCisvKgorICogdW5zaWduZWQgbG9uZworICogUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKAorICogICBkbWFfYWRkcl90ICBQaHlzaWNhbEFkZHJlc3MpOworICovCisjZGVmaW5lIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChQaHlzaWNhbEFkZHJlc3MpCQkoMCkKKworLyoKKyAqIHZvaWQKKyAqIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93KAorICogICBkbWFfYWRkcl90ICBQaHlzaWNhbEFkZHJlc3MsCisgKiAgIHVuc2lnbmVkIGxvbmcgIFZhbHVlKTsKKyAqLworI2RlZmluZSBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyhQaHlzaWNhbEFkZHJlc3MsIFZhbHVlKQlcCisJCQlQaHlzaWNhbEFkZHJlc3MgPSBWYWx1ZTsKKworLyoKKyAqIHZvaWQKKyAqIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaCgKKyAqICAgZG1hX2FkZHJfdCAgUGh5c2ljYWxBZGRyZXNzLAorICogICB1bnNpZ25lZCBsb25nICBWYWx1ZSk7CisgKi8KKyNkZWZpbmUgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKFBoeXNpY2FsQWRkcmVzcywgVmFsdWUpCisKKyNkZWZpbmUgTmRpc01JbmRpY2F0ZVN0YXR1cyhfdywgX3gsIF95LCBfeikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEZXZpY2UgUmVnaXN0ZXIgSS9PIEFjY2VzcyByZWxhdGVkIGRlZmluaXRpb25zIGFuZCBkYXRhIHN0cnVjdHVyZXMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBSVE1QX01BQ19QQ0kKKy8qUGF0Y2ggZm9yIEFTSUMgdHVyc3QgcmVhZC93cml0ZSBidWcsIG5lZWRzIHRvIHJlbW92ZSBhZnRlciBtZXRlbCBmaXggKi8KKyNkZWZpbmUgUlRNUF9JT19SRUFEMzIoX0EsIF9SLCBfcFYpCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCVwKKyAgICBpZiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCSgqX3BWID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpKTsJCVwKKwkJKCpfcFYgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKSk7CQkJXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZQkJCQkJCQkJCQkJCQkJCVwKKwkJKl9wViA9IDA7CQkJCQkJCQkJCQkJCVwKIH0KLSNlbmRpZiAvLyBSVDI4NzAgLy8KIAorI2RlZmluZSBSVE1QX0lPX0ZPUkNFX1JFQUQzMihfQSwgX1IsIF9wVikJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJXAorCSgqX3BWID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpKTsJCVwKKwkoKl9wViA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpKTsJCQlcCit9CiAKLSNkZWZpbmUgREVDTEFSRV9USU1FUl9GVU5DVElPTihfZnVuYykJCQlcCi12b2lkIGxpbnV4XyMjX2Z1bmModW5zaWduZWQgbG9uZyBkYXRhKQorI2RlZmluZSBSVE1QX0lPX1JFQUQ4KF9BLCBfUiwgX3BWKQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQlcCisJKCpfcFYgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSkpOwkJCVwKKwkoKl9wViA9IHJlYWRiKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpKTsJCQkJXAorfQorI2RlZmluZSBSVE1QX0lPX1dSSVRFMzIoX0EsIF9SLCBfVikJCQkJCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisgICAgaWYgKChfQSktPmJQQ0ljbGtPZmYgPT0gRkFMU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXUzMiBWYWw7CQkJCQkJCQkJCQkJCQkJCVwKKwlWYWwgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSk7CQkJXAorCXdyaXRlbCgoX1YpLCAodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKTsJCQkJCQkJCVwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQogCi0jZGVmaW5lIEdFVF9USU1FUl9GVU5DVElPTihfZnVuYykJCQkJXAotCQlsaW51eF8jI19mdW5jCisjZGVmaW5lIFJUTVBfSU9fRk9SQ0VfV1JJVEUzMihfQSwgX1IsIF9WKQkJCQkJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwl1MzIgVmFsOwkJCQkJCQkJCQkJCQkJCQlcCisJVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpOwkJCVwKKwl3cml0ZWwoX1YsICh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpOwkJCQkJCQkJXAorfQogCi1ERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKE1sbWVQZXJpb2RpY0V4ZWMpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihNbG1lUnNzaVJlcG9ydEV4ZWMpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihBc2ljUnhBbnRFdmFsVGltZW91dCk7Ci1ERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEFQU0RQZXJpb2RpY0V4ZWMpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihBc2ljUmZUdW5pbmdFeGVjKTsKLSNpZmRlZiBSVDI4NzAKLURFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQmVhY29uVXBkYXRlRXhlYyk7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCisjaWYgZGVmaW5lZChSQUxJTktfMjg4MCkgfHwgZGVmaW5lZChSQUxJTktfMzA1MikKKyNkZWZpbmUgUlRNUF9JT19XUklURTgoX0EsIF9SLCBfVikgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICBcCisJdW5zaWduZWQgbG9uZyBWYWw7ICAgICAgICAgICAgICAgIFwKKwl1OCBfaTsgICAgICAgICAgICAgICAgXAorCV9pID0gKChfUikgJiAweDMpOyAgICAgICAgICAgICBcCisJVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoKF9SKSAtIF9pKSkpOyAgIFwKKwlWYWwgPSBWYWwgJiAofigweDAwMDAwMGZmIDw8ICgoX2kpKjgpKSk7ICAgICAgICAgXAorCVZhbCA9IFZhbCB8ICgodW5zaWduZWQgbG9uZykoX1YpIDw8ICgoX2kpKjgpKTsgICAgICAgICBcCisJd3JpdGVsKChWYWwpLCAodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArICgoX1IpIC0gX2kpKSk7ICAgIFwKK30KKyNlbHNlCisjZGVmaW5lIFJUTVBfSU9fV1JJVEU4KF9BLCBfUiwgX1YpCQkJCQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCXUzMiBWYWw7CQkJCQkJCQkJCQkJCQkJCVwKKwlWYWwgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSk7CQkJXAorCXdyaXRlYigoX1YpLCAodTggKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSk7CQlcCit9CisjZW5kaWYgLyogI2lmIGRlZmluZWQoQlJDTV82MzU4KSB8fCBkZWZpbmVkKFJBTElOS18yODgwKSAvLyAqLwogCi1ERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEJlYWNvblRpbWVvdXQpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihTY2FuVGltZW91dCk7Ci1ERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEF1dGhUaW1lb3V0KTsKLURFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQXNzb2NUaW1lb3V0KTsKLURFQ0xBUkVfVElNRVJfRlVOQ1RJT04oUmVhc3NvY1RpbWVvdXQpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihEaXNhc3NvY1RpbWVvdXQpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihMaW5rRG93bkV4ZWMpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKTsKLURFQ0xBUkVfVElNRVJfRlVOQ1RJT04oV3BhRGlzYXNzb2NBcEFuZEJsb2NrQXNzb2MpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihQc1BvbGxXYWtlRXhlYyk7Ci1ERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFJhZGlvT25FeGVjKTsKKyNkZWZpbmUgUlRNUF9JT19XUklURTE2KF9BLCBfUiwgX1YpCQkJCQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCXUzMiBWYWw7CQkJCQkJCQkJCQkJCQkJCVwKKwlWYWwgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSk7CQkJXAorCXdyaXRldygoX1YpLCAodTE2ICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpOwlcCit9CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisjaWZkZWYgUlRNUF9NQUNfVVNCCisvKlBhdGNoIGZvciBBU0lDIHR1cnN0IHJlYWQvd3JpdGUgYnVnLCBuZWVkcyB0byByZW1vdmUgYWZ0ZXIgbWV0ZWwgZml4ICovCisjZGVmaW5lIFJUTVBfSU9fUkVBRDMyKF9BLCBfUiwgX3BWKQkJCQkJCQkJXAorCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKChfQSksIChfUiksICh1MzIgKikoX3BWKSkKIAotdm9pZCBSVE1QX0dldEN1cnJlbnRTeXN0ZW1UaW1lKExBUkdFX0lOVEVHRVIgKnRpbWUpOworI2RlZmluZSBSVE1QX0lPX1JFQUQ4KF9BLCBfUiwgX3BWKQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQlcCit9CiAKKyNkZWZpbmUgUlRNUF9JT19XUklURTMyKF9BLCBfUiwgX1YpCQkJCQkJCQlcCisJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKChfQSksIChfUiksICh1MzIpKF9WKSkKKworI2RlZmluZSBSVE1QX0lPX1dSSVRFOChfQSwgX1IsIF9WKQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQlcCisJdTE2CV9WYWwgPSBfVjsJCQkJCQkJCQkJCVwKKwlSVFVTQlNpbmdsZVdyaXRlKChfQSksIChfUiksICh1MTYpKF9WYWwpKTsJCQkJCQkJCVwKK30KKworI2RlZmluZSBSVE1QX0lPX1dSSVRFMTYoX0EsIF9SLCBfVikJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJXAorCVJUVVNCU2luZ2xlV3JpdGUoKF9BKSwgKF9SKSwgKHUxNikoX1YpKTsJCQkJCQkJCVwKK30KKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOZXR3b3JrIFJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmUgYW5kIG1hcmNvIGRlZmluaXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFBLVFNSQ19ORElTICAgICAgICAgICAgIDB4N2YKKyNkZWZpbmUgUEtUU1JDX0RSSVZFUiAgICAgICAgICAgMHgwZgorCisjZGVmaW5lIFJUTVBfT1NfTkVUREVWX1NFVF9QUklWKF9wTmV0RGV2LCBfcFByaXYpCSgoX3BOZXREZXYpLT5tbF9wcml2ID0gKF9wUHJpdikpCisjZGVmaW5lIFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKF9wTmV0RGV2KQkJKChfcE5ldERldiktPm1sX3ByaXYpCisjZGVmaW5lIFJUTVBfT1NfTkVUREVWX0dFVF9ERVZOQU1FKF9wTmV0RGV2KQkoKF9wTmV0RGV2KS0+bmFtZSkKKyNkZWZpbmUgUlRNUF9PU19ORVRERVZfR0VUX1BIWUFERFIoX1BORVRERVYpCSgoX1BORVRERVYpLT5kZXZfYWRkcikKKworI2RlZmluZSBSVE1QX09TX05FVERFVl9TVEFSVF9RVUVVRShfcE5ldERldikJbmV0aWZfc3RhcnRfcXVldWUoKF9wTmV0RGV2KSkKKyNkZWZpbmUgUlRNUF9PU19ORVRERVZfU1RPUF9RVUVVRShfcE5ldERldikJbmV0aWZfc3RvcF9xdWV1ZSgoX3BOZXREZXYpKQorI2RlZmluZSBSVE1QX09TX05FVERFVl9XQUtFX1FVRVVFKF9wTmV0RGV2KQluZXRpZl93YWtlX3F1ZXVlKChfcE5ldERldikpCisjZGVmaW5lIFJUTVBfT1NfTkVUREVWX0NBUlJJRVJfT0ZGKF9wTmV0RGV2KQluZXRpZl9jYXJyaWVyX29mZigoX3BOZXREZXYpKQorCisjZGVmaW5lIFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwRW50cnkpIFwKKwkodm9pZCAqKShwRW50cnkpCisKKyNkZWZpbmUgUEFDS0VUX1RPX1FVRVVFX0VOVFJZKHBQYWNrZXQpIFwKKwkoc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICopKHBQYWNrZXQpCisKKyNkZWZpbmUgR0VUX1NHX0xJU1RfRlJPTV9QQUNLRVQoX3AsIF9zYykJXAorICAgIHJ0X2dldF9zZ19saXN0X2Zyb21fcGFja2V0KF9wLCBfc2MpCisKKyNkZWZpbmUgUkVMRUFTRV9ORElTX1BBQ0tFVChfcEFkLCBfcFBhY2tldCwgX1N0YXR1cykgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUlRNUEZyZWVOZGlzUGFja2V0KF9wQWQsIF9wUGFja2V0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KIAogLyoKICAqIHBhY2tldCBoZWxwZXIKQEAgLTYwMCwxNiArNjQ1LDIyIEBACiAgKiAgICAgICAgICAgICBvcyBwYWNrZXQgdG8gcnQgcGFja2V0CiAgKi8KICNkZWZpbmUgUlRQS1RfVE9fT1NQS1QoX3ApCQkoKHN0cnVjdCBza19idWZmICopKF9wKSkKLSNkZWZpbmUgT1NQS1RfVE9fUlRQS1QoX3ApCQkoKFBORElTX1BBQ0tFVCkoX3ApKQorI2RlZmluZSBPU1BLVF9UT19SVFBLVChfcCkJCSgodm9pZCAqKShfcCkpCiAKICNkZWZpbmUgR0VUX09TX1BLVF9EQVRBUFRSKF9wa3QpIFwKIAkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT5kYXRhKQorI2RlZmluZSBTRVRfT1NfUEtUX0RBVEFQVFIoX3BrdCwgX2RhdGFQdHIpCVwKKwkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT5kYXRhKSA9IChfZGF0YVB0cikKIAogI2RlZmluZSBHRVRfT1NfUEtUX0xFTihfcGt0KSBcCiAJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+bGVuKQorI2RlZmluZSBTRVRfT1NfUEtUX0xFTihfcGt0LCBfbGVuKQlcCisJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+bGVuKSA9IChfbGVuKQogCiAjZGVmaW5lIEdFVF9PU19QS1RfREFUQVRBSUwoX3BrdCkgXAogCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPnRhaWwpCisjZGVmaW5lIFNFVF9PU19QS1RfREFUQVRBSUwoX3BrdCwgX3N0YXJ0LCBfbGVuKQlcCisJCSgoUlRQS1RfVE9fT1NQS1QoX3BrdCkpLT50YWlsKSA9ICh1OCAqKSgoX3N0YXJ0KSArIChfbGVuKSkKIAogI2RlZmluZSBHRVRfT1NfUEtUX0hFQUQoX3BrdCkgXAogCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmhlYWQpCkBAIC02MTksNiArNjcwLDggQEAKIAogI2RlZmluZSBHRVRfT1NfUEtUX05FVERFVihfcGt0KSBcCiAJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+ZGV2KQorI2RlZmluZSBTRVRfT1NfUEtUX05FVERFVihfcGt0LCBfcE5ldERldikJXAorCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmRldikgPSAoX3BOZXREZXYpCiAKICNkZWZpbmUgR0VUX09TX1BLVF9UWVBFKF9wa3QpIFwKIAkJKFJUUEtUX1RPX09TUEtUKF9wa3QpKQpAQCAtNjI2LDYgKzY3OSw3IEBACiAjZGVmaW5lIEdFVF9PU19QS1RfTkVYVChfcGt0KSBcCiAJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+bmV4dCkKIAorI2RlZmluZSBPU19QS1RfQ0xPTkVEKF9wa3QpCQlza2JfY2xvbmVkKFJUUEtUX1RPX09TUEtUKF9wa3QpKQogCiAjZGVmaW5lIE9TX05UT0hTKF9WYWwpIFwKIAkJKG50b2hzKF9WYWwpKQpAQCAtNjM2LDU1ICs2OTAsMzYgQEAKICNkZWZpbmUgT1NfSFRPTkwoX1ZhbCkgXAogCQkoaHRvbmwoX1ZhbCkpCiAKLS8qIHN0YXRpc3RpY3MgY291bnRlciAqLwotI2RlZmluZSBTVEFUU19JTkNfUlhfUEFDS0VUUyhfcEFkLCBfZGV2KQotI2RlZmluZSBTVEFUU19JTkNfVFhfUEFDS0VUUyhfcEFkLCBfZGV2KQotCi0jZGVmaW5lIFNUQVRTX0lOQ19SWF9CWVRFU1MoX3BBZCwgX2RldiwgbGVuKQotI2RlZmluZSBTVEFUU19JTkNfVFhfQllURVNTKF9wQWQsIF9kZXYsIGxlbikKLQotI2RlZmluZSBTVEFUU19JTkNfUlhfRVJST1JTKF9wQWQsIF9kZXYpCi0jZGVmaW5lIFNUQVRTX0lOQ19UWF9FUlJPUlMoX3BBZCwgX2RldikKLQotI2RlZmluZSBTVEFUU19JTkNfUlhfRFJPUFBFRChfcEFkLCBfZGV2KQotI2RlZmluZSBTVEFUU19JTkNfVFhfRFJPUFBFRChfcEFkLCBfZGV2KQotCi0KICNkZWZpbmUgQ0JfT0ZGICAxMAogCi0KLS8vICAgY2hlY2sgRERLIE5ESVNfUEFDS0VUIGRhdGEgc3RydWN0dXJlIGFuZCBmaW5kIG91dCBvbmx5IE1pbmlwb3J0UmVzZXJ2ZWRFeFswLi43XSBjYW4gYmUgdXNlZCBieSBvdXIgZHJpdmVyIHdpdGhvdXQKLS8vICAgYW1iaWd1aXR5LiBGaWVsZHMgYWZ0ZXIgcFBhY2tldC0+TWluaXBvcnRSZXNlcnZlZEV4WzhdIG1heSBiZSB1c2VkIGJ5IG90aGVyIHdyYXBwZXIgbGF5ZXIgdGh1cyBjcmFzaGVzIHRoZSBkcml2ZXIKLS8vCi0KLS8vIFVzZXIgUHJpb3JpdHkKKy8qIFVzZXIgUHJpb3JpdHkgKi8KICNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1VQKF9wLCBfcHJpbykJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMF0gPSBfcHJpbykKICNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1VQKF9wKQkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzBdKQogCi0vLyBGcmFnbWVudCAjCisvKiBGcmFnbWVudCAjICovCiAjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9GUkFHTUVOVFMoX3AsIF9udW0pCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMV0gPSBfbnVtKQogI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKF9wKQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxXSkKIAotLy8gMHgwIH4weDdmOiBUWCB0byBBUCdzIG93biBCU1Mgd2hpY2ggaGFzIHRoZSBzcGVjaWZpZWQgQUlELiBpZiBBSUQ+MTI3LCBzZXQgYml0IDcgaW4gUlRNUF9TRVRfUEFDS0VUX0VNQUNUQUIgdG9vLgotLy8odGhpcyB2YWx1ZSBhbHNvIGFzIE1BQyhvbi1jaGlwIFdDSUQpIHRhYmxlIGluZGV4KQotLy8gMHg4MH4weGZmOiBUWCB0byBhIFdEUyBsaW5rLiBiMH42OiBXRFMgaW5kZXgKKy8qIDB4MCB+MHg3ZjogVFggdG8gQVAncyBvd24gQlNTIHdoaWNoIGhhcyB0aGUgc3BlY2lmaWVkIEFJRC4gaWYgQUlEPjEyNywgc2V0IGJpdCA3IGluIFJUTVBfU0VUX1BBQ0tFVF9FTUFDVEFCIHRvby4gKi8KKy8qKHRoaXMgdmFsdWUgYWxzbyBhcyBNQUMob24tY2hpcCBXQ0lEKSB0YWJsZSBpbmRleCkgKi8KKy8qIDB4ODB+MHhmZjogVFggdG8gYSBXRFMgbGluay4gYjB+NjogV0RTIGluZGV4ICovCiAjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9XQ0lEKF9wLCBfd2RzaWR4KQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzJdID0gX3dkc2lkeCkKLSNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1dDSUQoX3ApICAgICAgICAgIAkJKChVQ0hBUikoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMl0pKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfV0NJRChfcCkgICAgICAgICAgCQkoKHU4KShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisyXSkpCiAKLS8vIDB4ZmY6IFBLVFNSQ19ORElTLCBvdGhlcnM6IGxvY2FsIFRYIGJ1ZmZlciBpbmRleC4gVGhpcyB2YWx1ZSBhZmZlY3RzIGhvdyB0byBhIHBhY2tldAorLyogMHhmZjogUEtUU1JDX05ESVMsIG90aGVyczogbG9jYWwgVFggYnVmZmVyIGluZGV4LiBUaGlzIHZhbHVlIGFmZmVjdHMgaG93IHRvIGEgcGFja2V0ICovCiAjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoX3AsIF9wa3RzcmMpCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrM10gPSBfcGt0c3JjKQogI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfU09VUkNFKF9wKSAgICAgICAJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRiszXSkKIAotLy8gUlRTL0NUUy10by1zZWxmIHByb3RlY3Rpb24gbWV0aG9kCisvKiBSVFMvQ1RTLXRvLXNlbGYgcHJvdGVjdGlvbiBtZXRob2QgKi8KICNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1JUUyhfcCwgX251bSkgICAgICAJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis0XSA9IF9udW0pCiAjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9SVFMoX3ApICAgICAgICAgIAkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzRdKQotLy8gc2VlIFJUTVBfUyhHKUVUX1BBQ0tFVF9FTUFDVEFCCisvKiBzZWUgUlRNUF9TKEcpRVRfUEFDS0VUX0VNQUNUQUIgKi8KIAotLy8gVFggcmF0ZSBpbmRleAorLyogVFggcmF0ZSBpbmRleCAqLwogI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfVFhSQVRFKF9wLCBfcmF0ZSkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis1XSA9IF9yYXRlKQogI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfVFhSQVRFKF9wKQkJICAJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis1XSkKIAotLy8gRnJvbSB3aGljaCBJbnRlcmZhY2UKKy8qIEZyb20gd2hpY2ggSW50ZXJmYWNlICovCiAjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9JRihfcCwgX2lmZHgpCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNl0gPSBfaWZkeCkKICNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0lGKF9wKQkJICAJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis2XSkKICNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX05FVF9ERVZJQ0VfTUJTU0lEKF9wLCBfYnNzKQkJUlRNUF9TRVRfUEFDS0VUX0lGKChfcCksIChfYnNzKSkKQEAgLTY5NywxMCArNzMyLDkgQEAKICNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX01PUkVEQVRBKF9wLCBfbW9yZWJpdCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis3XSA9IF9tb3JlYml0KQogI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfTU9SRURBVEEoX3ApCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis3XSkKIAotCi0vLwotLy8JU2VwY2lmaWMgUGFrY2V0IFR5cGUgZGVmaW5pdGlvbgotLy8KKy8qICovCisvKiAgICAgIFNlcGNpZmljIFBha2NldCBUeXBlIGRlZmluaXRpb24gKi8KKy8qICovCiAjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX0NCX09GRlNFVAkxMQogCiAjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX0RIQ1AJCTB4MDEKQEAgLTcxMCwxMCArNzQ0LDEwIEBACiAjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX1ZMQU4JCTB4MTAKICNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfTExDU05BUAkweDIwCiAKLS8vU3BlY2lmaWMKKy8qU3BlY2lmaWMgKi8KICNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1NQRUNJRklDKF9wLCBfZmxnKQkgICAJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSA9IF9mbGcpCiAKLS8vREhDUAorLypESENQICovCiAjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9ESENQKF9wLCBfZmxnKSAgIAkJCQkJCQkJCQkJCQlcCiAJCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKIAkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKQEAgLTcyMyw3ICs3NTcsNyBAQAogCQkJfXdoaWxlKDApCiAjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9ESENQKF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSAmIFJUTVBfUEFDS0VUX1NQRUNJRklDX0RIQ1ApCiAKLS8vRUFQT0wKKy8qRUFQT0wgKi8KICNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0VBUE9MKF9wLCBfZmxnKSAgIAkJCQkJCQkJCQkJCQlcCiAJCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKIAkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKQEAgLTczMyw3ICs3NjcsNyBAQAogCQkJfXdoaWxlKDApCiAjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9FQVBPTChfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19FQVBPTCkKIAotLy9XQUkKKy8qV0FJICovCiAjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9XQUkoX3AsIF9mbGcpICAgCQkJCQkJCQkJCQkJCVwKIAkJCWRvewkJCQkJCQkJCQkJCQkJCQkJCQkJXAogCQkJCWlmIChfZmxnKQkJCQkJCQkJCQkJCQkJCQkJXApAQCAtNzQ1LDcgKzc3OSw3IEBACiAKICNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0xPV1JBVEUoX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgKFJUTVBfUEFDS0VUX1NQRUNJRklDX0VBUE9MIHwgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfREhDUCB8IFJUTVBfUEFDS0VUX1NQRUNJRklDX1dBSSkpCiAKLS8vVkxBTgorLypWTEFOICovCiAjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9WTEFOKF9wLCBfZmxnKSAgIAkJCQkJCQkJCQkJCQlcCiAJCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKIAkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKQEAgLTc1NSw3ICs3ODksNyBAQAogCQkJfXdoaWxlKDApCiAjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9WTEFOKF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSAmIFJUTVBfUEFDS0VUX1NQRUNJRklDX1ZMQU4pCiAKLS8vTExDL1NOQVAKKy8qTExDL1NOQVAgKi8KICNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0xMQ1NOQVAoX3AsIF9mbGcpICAgCQkJCQkJCQkJCQkJCVwKIAkJCWRvewkJCQkJCQkJCQkJCQkJCQkJCQkJXAogCQkJCWlmIChfZmxnKQkJCQkJCQkJCQkJCQkJCQkJXApAQCAtNzY2LDcgKzgwMCw3IEBACiAKICNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0xMQ1NOQVAoX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfTExDU05BUCkKIAotLy8gSVAKKy8qIElQICovCiAjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9JUFY0KF9wLCBfZmxnKQkJCQkJCQkJCQkJCQkJXAogCQkJZG97CQkJCQkJCQkJCQkJCQkJCQkJCQlcCiAJCQkJaWYgKF9mbGcpCQkJCQkJCQkJCQkJCQkJCQlcCkBAIC03NzcsMTQyICs4MTEsMzUgQEAKIAogI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfSVBWNChfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19JUFY0KQogCi0KLS8vIElmIHRoaXMgZmxhZyBpcyBzZXQsIGl0IGluZGljYXRlcyB0aGF0IHRoaXMgRUFQb0wgZnJhbWUgTVVTVCBiZSBjbGVhci4KKy8qIElmIHRoaXMgZmxhZyBpcyBzZXQsIGl0IGluZGljYXRlcyB0aGF0IHRoaXMgRUFQb0wgZnJhbWUgTVVTVCBiZSBjbGVhci4gKi8KICNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0NMRUFSX0VBUF9GUkFNRShfcCwgX2ZsZykgICAoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTJdID0gX2ZsZykKICNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0NMRUFSX0VBUF9GUkFNRShfcCkgICAgICAgICAoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTJdKQogCisvKiB1c2UgYml0MyBvZiBjYltDQl9PRkYrMTZdICovCisKICNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUXzVWVChfcCwgX2ZsZykgICAoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMjJdID0gX2ZsZykKICNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUXzVWVChfcCkgICAgICAgICAoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMjJdKQogCi0jaWZkZWYgQ09ORklHXzVWVF9FTkhBTkNFCi0jZGVmaW5lIEJSSURHRV9UQUcgMHgzNTU2NDI1MiAgICAvLyBkZXBlbmRzIG9uIDVWVCBkZWZpbmUgaW4gYnJfaW5wdXQuYwotI2VuZGlmCisvKiBNYXggc2tiLT5jYiA9IDQ4QiA9IFtDQl9PRkYrMzhdICovCiAKLQotI2RlZmluZSBORElTX1NFVF9QQUNLRVRfU1RBVFVTKF9wLCBfc3RhdHVzKQotCi0KLSNkZWZpbmUgR0VUX1NHX0xJU1RfRlJPTV9QQUNLRVQoX3AsIF9zYykJXAotICAgIHJ0X2dldF9zZ19saXN0X2Zyb21fcGFja2V0KF9wLCBfc2MpCi0KLSNkZWZpbmUgTmRpc01vdmVNZW1vcnkoRGVzdGluYXRpb24sIFNvdXJjZSwgTGVuZ3RoKSBtZW1tb3ZlKERlc3RpbmF0aW9uLCBTb3VyY2UsIExlbmd0aCkKLSNkZWZpbmUgTmRpc1plcm9NZW1vcnkoRGVzdGluYXRpb24sIExlbmd0aCkgICAgICAgICBtZW1zZXQoRGVzdGluYXRpb24sIDAsIExlbmd0aCkKLSNkZWZpbmUgTmRpc0ZpbGxNZW1vcnkoRGVzdGluYXRpb24sIExlbmd0aCwgRmlsbCkgICBtZW1zZXQoRGVzdGluYXRpb24sIEZpbGwsIExlbmd0aCkKLSNkZWZpbmUgTmRpc0VxdWFsTWVtb3J5KFNvdXJjZTEsIFNvdXJjZTIsIExlbmd0aCkgICAoIW1lbWNtcChTb3VyY2UxLCBTb3VyY2UyLCBMZW5ndGgpKQotI2RlZmluZSBSVE1QRXF1YWxNZW1vcnkoU291cmNlMSwgU291cmNlMiwgTGVuZ3RoKQkoIW1lbWNtcChTb3VyY2UxLCBTb3VyY2UyLCBMZW5ndGgpKQotCi0KLSNkZWZpbmUgUlRNUF9JTkNfUkVGKF9BKQkJMAotI2RlZmluZSBSVE1QX0RFQ19SRUYoX0EpCQkwCi0jZGVmaW5lIFJUTVBfR0VUX1JFRihfQSkJCTAKLQotCi0KLS8qCi0gKiBVTE9ORwotICogUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3coCi0gKiAgIElOIE5ESVNfUEhZU0lDQUxfQUREUkVTUyAgUGh5c2ljYWxBZGRyZXNzKTsKLSAqLwotI2RlZmluZSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhQaHlzaWNhbEFkZHJlc3MpCQkoUGh5c2ljYWxBZGRyZXNzKQotCi0vKgotICogVUxPTkcKLSAqIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaCgKLSAqICAgSU4gTkRJU19QSFlTSUNBTF9BRERSRVNTICBQaHlzaWNhbEFkZHJlc3MpOwotICovCi0jZGVmaW5lIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChQaHlzaWNhbEFkZHJlc3MpCQkoMCkKLQotLyoKLSAqIFZPSUQKLSAqIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93KAotICogICBJTiBORElTX1BIWVNJQ0FMX0FERFJFU1MgIFBoeXNpY2FsQWRkcmVzcywKLSAqICAgSU4gVUxPTkcgIFZhbHVlKTsKLSAqLwotI2RlZmluZSBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyhQaHlzaWNhbEFkZHJlc3MsIFZhbHVlKQlcCi0JCQlQaHlzaWNhbEFkZHJlc3MgPSBWYWx1ZTsKLQotLyoKLSAqIFZPSUQKLSAqIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaCgKLSAqICAgSU4gTkRJU19QSFlTSUNBTF9BRERSRVNTICBQaHlzaWNhbEFkZHJlc3MsCi0gKiAgIElOIFVMT05HICBWYWx1ZSk7Ci0gKi8KLSNkZWZpbmUgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKFBoeXNpY2FsQWRkcmVzcywgVmFsdWUpCi0KLQotLy9DT05UQUlOSU5HX1JFQ09SRChwRW50cnksIE5ESVNfUEFDS0VULCBNaW5pcG9ydFJlc2VydmVkRXgpOwotI2RlZmluZSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocEVudHJ5KSBcCi0JKFBORElTX1BBQ0tFVCkocEVudHJ5KQotCi0jZGVmaW5lIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSBcCi0JKFBRVUVVRV9FTlRSWSkocFBhY2tldCkKLQotCi0jaWZuZGVmIENPTlRBSU5JTkdfUkVDT1JECi0jZGVmaW5lIENPTlRBSU5JTkdfUkVDT1JEKGFkZHJlc3MsIHR5cGUsIGZpZWxkKQkJCVwKLSgodHlwZSAqKSgoUENIQVIpKGFkZHJlc3MpIC0gb2Zmc2V0b2YodHlwZSwgZmllbGQpKSkKLSNlbmRpZgotCi0KLSNkZWZpbmUgUkVMRUFTRV9ORElTX1BBQ0tFVChfcEFkLCBfcFBhY2tldCwgX1N0YXR1cykgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgUlRNUEZyZWVOZGlzUGFja2V0KF9wQWQsIF9wUGFja2V0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotCi0jZGVmaW5lIFNXSVRDSF9QaHlBQihfcEFBLCBfcEJCKSAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFVMT05HCUFBQmFzZVBhSGlnaDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVUxPTkcJQUFCYXNlUGFMb3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFVMT05HCUJCQmFzZVBhSGlnaDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVUxPTkcJQkJCYXNlUGFMb3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEJCQmFzZVBhSGlnaCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChfcEJCKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEJCQmFzZVBhTG93ID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3coX3BCQik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBBQUJhc2VQYUhpZ2ggPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2goX3BBQSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBBQUJhc2VQYUxvdyA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KF9wQUEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKF9wQUEsIEJCQmFzZVBhSGlnaCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyhfcEFBLCBCQkJhc2VQYUxvdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2goX3BCQiwgQUFCYXNlUGFIaWdoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93KF9wQkIsIEFBQmFzZVBhTG93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0KLSNkZWZpbmUgTmRpc1dyaXRlRXJyb3JMb2dFbnRyeShfYSwgX2IsIF9jLCBfZCkKLSNkZWZpbmUgTmRpc01BbGxvY2F0ZU1hcFJlZ2lzdGVycyhfYSwgX2IsIF9jLCBfZCwgX2UpCQlORElTX1NUQVRVU19TVUNDRVNTCi0KLQotI2RlZmluZSBOZGlzQWNxdWlyZVNwaW5Mb2NrCQlSVE1QX1NFTV9MT0NLCi0jZGVmaW5lIE5kaXNSZWxlYXNlU3BpbkxvY2sJCVJUTVBfU0VNX1VOTE9DSwotCi1zdGF0aWMgaW5saW5lIHZvaWQgTmRpc0dldFN5c3RlbVVwVGltZShVTE9ORyAqdGltZSkKLXsKLQkqdGltZSA9IGppZmZpZXM7Ci19Ci0KLS8vcFBhY2tldCA9IENPTlRBSU5JTkdfUkVDT1JEKHBFbnRyeSwgTkRJU19QQUNLRVQsIE1pbmlwb3J0UmVzZXJ2ZWRFeCk7Ci0jZGVmaW5lIFFVRVVFX0VOVFJZX1RPX1BLVChwRW50cnkpIFwKLQkJKChQTkRJU19QQUNLRVQpIChwRW50cnkpKQotCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU90aGVyIGZ1bmN0aW9uIHByb3RvdHlwZXMgZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUlRNUF9HZXRDdXJyZW50U3lzdGVtVGltZShMQVJHRV9JTlRFR0VSICogdGltZSk7CiBpbnQgcnQyOHh4X3BhY2tldF94bWl0KHN0cnVjdCBza19idWZmICpza2IpOwogCisjaWZkZWYgUlRNUF9NQUNfUENJCisvKiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KKyNkZWZpbmUgSVJRX0hBTkRMRV9UWVBFICBpcnFyZXR1cm5fdAogCitJUlFfSEFORExFX1RZUEUgcnQyODYwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCi12b2lkIHJ0bXBfb3NfdGhyZWFkX2luaXQoUFVDSEFSIHBUaHJlYWROYW1lLCBQVk9JRCBwTm90aWZ5KTsKK2ludCBydDI4eHhfc3RhX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCBJTiBPVVQgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CiAKLSNpZmRlZiBSVDI4NjAKLSNpZiAhZGVmaW5lZChQQ0lfQ0FQX0lEX0VYUCkKLSNkZWZpbmUgUENJX0NBUF9JRF9FWFAJCQkgICAgMHgxMAotI2VuZGlmCitleHRlcm4gaW50IHJhX210ZF93cml0ZShpbnQgbnVtLCBsb2ZmX3QgdG8sIHNpemVfdCBsZW4sIGNvbnN0IHVfY2hhciAqIGJ1Zik7CitleHRlcm4gaW50IHJhX210ZF9yZWFkKGludCBudW0sIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCB1X2NoYXIgKiBidWYpOwogCi0jaWYgIWRlZmluZWQoUENJX0VYUF9MTktDVEwpCi0jZGVmaW5lIFBDSV9FWFBfTE5LQ1RMCQkJICAgIDB4MTAKLSNlbmRpZgorI2RlZmluZSBHRVRfUEFEX0ZST01fTkVUX0RFVihfcEFkLCBfbmV0X2RldikJKF9wQWQpID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKikoX25ldF9kZXYpLT5tbF9wcml2OwogCi0jaWYgIWRlZmluZWQoUENJX0NMQVNTX0JSSURHRV9QQ0kpCi0jZGVmaW5lIFBDSV9DTEFTU19CUklER0VfUENJCQkweDA2MDQKLSNlbmRpZgotCi0jZGVmaW5lIFBDSUJVU19JTlRFTF9WRU5ET1IgICAgICAgICAweDgwODYKLSNlbmRpZgotCisjZW5kaWYgLyogX19SVF9MSU5VWF9IX18gLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbWFpbl9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbWFpbl9kZXYuYwppbmRleCAyMmYzN2NmLi5jM2Q5MjgwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9tYWluX2Rldi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbWFpbl9kZXYuYwpAQCAtMzMsNTMgKzMzLDMzIEBACiAgICAgUmV2aXNpb24gSGlzdG9yeToKICAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAogICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JU2FtcGxlCQlNYXIvMjEvMDcJCU1lcmdlIFJUMjg3MCBhbmQgUlQyODYwIGRyaXZlcnMuCiAqLwogCiAjaW5jbHVkZSAicnRfY29uZmlnLmgiCiAKLSNkZWZpbmUgRk9SVFlfTUhaX0lOVE9MRVJBTlRfSU5URVJWQUwJKDYwKjEwMDApIC8vIDEgbWluCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIFByaXZhdGUgVmFyaWFibGVzIFVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8vc3RhdGljIFJBTElOS19USU1FUl9TVFJVQ1QgICAgIFBlcmlvZGljVGltZXI7CiAKLWNoYXIgKm1hYyA9ICIiOwkJICAgLy8gZGVmYXVsdCAwMDowMDowMDowMDowMDowMAotY2hhciAqaG9zdG5hbWUgPSAiIjsJCSAgIC8vIGRlZmF1bHQgQ01QQwotbW9kdWxlX3BhcmFtIChtYWMsIGNoYXJwLCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MgKG1hYywgInJ0Mjh4eDogd2lyZWxlc3MgbWFjIGFkZHIiKTsKLQorY2hhciAqbWFjID0gIiI7CQkvKiBkZWZhdWx0IDAwOjAwOjAwOjAwOjAwOjAwICovCitjaGFyICpob3N0bmFtZSA9ICIiOwkJLyogZGVmYXVsdCBDTVBDICovCittb2R1bGVfcGFyYW0obWFjLCBjaGFycCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1hYywgInJ0Mjh4eDogd2lyZWxlc3MgbWFjIGFkZHIiKTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogUHJvdG90eXBlcyBvZiBGdW5jdGlvbnMgVXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotZXh0ZXJuIEJPT0xFQU4gYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9pbml0KFBSVE1QX0FEQVBURVIgcEFkLCBpbnQgbnVtKTsKLWV4dGVybiB2b2lkIGJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfcmVsZWFzZShQUlRNUF9BREFQVEVSIHBBZCk7Ci1leHRlcm4gTkRJU19TVEFUVVMgTklDTG9hZFJhdGVTd2l0Y2hpbmdQYXJhbXMoSU4gUFJUTVBfQURBUFRFUiBwQWQpOwogCi0jaWZkZWYgUlQyODYwCi1leHRlcm4gdm9pZCBpbml0X3RocmVhZF90YXNrKFBSVE1QX0FEQVBURVIgcEFkKTsKLSNlbmRpZgorLyogcHVibGljIGZ1bmN0aW9uIHByb3RvdHlwZSAqLworaW50IHJ0Mjh4eF9jbG9zZShJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CitpbnQgcnQyOHh4X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOwogCi0vLyBwdWJsaWMgZnVuY3Rpb24gcHJvdG90eXBlCi1JTlQgX19kZXZpbml0IHJ0Mjh4eF9wcm9iZShJTiB2b2lkICpfZGV2X3AsIElOIHZvaWQgKl9kZXZfaWRfcCwKLQkJCQkJCQlJTiBVSU5UIGFyZ2MsIE9VVCBQUlRNUF9BREFQVEVSICpwcEFkKTsKKy8qIHByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlICovCitzdGF0aWMgaW50IHJ0Mjh4eF9zZW5kX3BhY2tldHMoSU4gc3RydWN0IHNrX2J1ZmYgKnNrYl9wLAorCQkJICAgICAgIElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKIAotLy8gcHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGUKLXN0YXRpYyBpbnQgcnQyOHh4X2luaXQoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOwotSU5UIHJ0Mjh4eF9zZW5kX3BhY2tldHMoSU4gc3RydWN0IHNrX2J1ZmYgKnNrYl9wLCBJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7Ci0KLXN0YXRpYyB2b2lkIENmZ0luaXRIb29rKFBSVE1QX0FEQVBURVIgcEFkKTsKLQotZXh0ZXJuCWNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiBydDI4eHhfaXdfaGFuZGxlcl9kZWY7Ci0KLS8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiBxdWVyeSAvcHJvYwotc3RydWN0IGl3X3N0YXRpc3RpY3MgKnJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMoCi0gICAgSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOwotCi1zdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqUlQyOHh4X2dldF9ldGhlcl9zdGF0cygKLSAgICBJTiAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpSVDI4eHhfZ2V0X2V0aGVyX3N0YXRzKElOIHN0cnVjdCBuZXRfZGV2aWNlCisJCQkJCQkgICAgICAgKm5ldF9kZXYpOwogCiAvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xMDMsMjEgKzgzLDY2IEBACiAqLwogaW50IE1haW5WaXJ0dWFsSUZfY2xvc2UoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCiB7Ci0gICAgUlRNUF9BREFQVEVSICpwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IE5VTEw7CiAKLQkvLyBTYW5pdHkgY2hlY2sgZm9yIHBBZAorCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZCwgbmV0X2Rldik7CisKKwkvKiBTYW5pdHkgY2hlY2sgZm9yIHBBZCAqLwogCWlmIChwQWQgPT0gTlVMTCkKLQkJcmV0dXJuIDA7IC8vIGNsb3NlIG9rCisJCXJldHVybiAwOwkvKiBjbG9zZSBvayAqLwogCiAJbmV0aWZfY2Fycmllcl9vZmYocEFkLT5uZXRfZGV2KTsKIAluZXRpZl9zdG9wX3F1ZXVlKHBBZC0+bmV0X2Rldik7CiAKKwl7CisJCUJPT0xFQU4gQ2FuY2VsbGVkOworCisJCWlmIChJTkZSQV9PTihwQWQpICYmCisJCSAgICAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpIHsKKwkJCXN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSBEaXNSZXE7CisJCQlzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpNc2dFbGVtID0KKwkJCSAgICAoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0pLAorCQkJCQkJCU1FTV9BTExPQ19GTEFHKTsKKworCQkJaWYgKE1zZ0VsZW0pIHsKKwkJCQlDT1BZX01BQ19BRERSKERpc1JlcS5BZGRyLAorCQkJCQkgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQkJRGlzUmVxLlJlYXNvbiA9IFJFQVNPTl9ERUFVVEhfU1RBX0xFQVZJTkc7CisKKwkJCQlNc2dFbGVtLT5NYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKKwkJCQlNc2dFbGVtLT5Nc2dUeXBlID0gTVQyX01MTUVfRElTQVNTT0NfUkVROworCQkJCU1zZ0VsZW0tPk1zZ0xlbiA9CisJCQkJICAgIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9kaXNhc3NvY19yZXEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KE1zZ0VsZW0tPk1zZywgJkRpc1JlcSwKKwkJCQkJICAgICAgIHNpemVvZgorCQkJCQkgICAgICAgKHN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSkpOworCisJCQkJLyogUHJldmVudCB0byBjb25uZWN0IEFQIGFnYWluIGluIFNUQU1sbWVQZXJpb2RpY0V4ZWMgKi8KKwkJCQlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4gPSAzMjsKKwkJCQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsCisJCQkJCSAgICAgICBwQWQtPk1sbWVBdXguCisJCQkJCSAgICAgICBBdXRvUmVjb25uZWN0U3NpZExlbik7CisKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0KKwkJCQkgICAgQ05UTF9XQUlUX09JRF9ESVNBU1NPQzsKKwkJCQlNbG1lRGlzYXNzb2NSZXFBY3Rpb24ocEFkLCBNc2dFbGVtKTsKKwkJCQlrZnJlZShNc2dFbGVtKTsKKwkJCX0KKworCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwkJfQorCisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsCisJCQkJJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuV3BhRGlzYXNzb2NBbmRCbG9ja0Fzc29jVGltZXIsCisJCQkJJkNhbmNlbGxlZCk7CisJfQogCiAJVklSVFVBTF9JRl9ET1dOKHBBZCk7CiAKIAlSVF9NT0RfREVDX1VTRV9DT1VOVCgpOwogCi0JcmV0dXJuIDA7IC8vIGNsb3NlIG9rCisJcmV0dXJuIDA7CQkvKiBjbG9zZSBvayAqLwogfQogCiAvKgpAQCAtMTQyLDE2ICsxNjcsMTggQEAKICovCiBpbnQgTWFpblZpcnR1YWxJRl9vcGVuKElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQogewotICAgIFJUTVBfQURBUFRFUiAqcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSBOVUxMOwogCi0JLy8gU2FuaXR5IGNoZWNrIGZvciBwQWQKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWQsIG5ldF9kZXYpOworCisJLyogU2FuaXR5IGNoZWNrIGZvciBwQWQgKi8KIAlpZiAocEFkID09IE5VTEwpCi0JCXJldHVybiAwOyAvLyBjbG9zZSBvaworCQlyZXR1cm4gMDsJLyogY2xvc2Ugb2sgKi8KIAogCWlmIChWSVJUVUFMX0lGX1VQKHBBZCkgIT0gMCkKIAkJcmV0dXJuIC0xOwogCi0JLy8gaW5jcmVhc2UgTU9EVUxFIHVzZSBjb3VudAorCS8qIGluY3JlYXNlIE1PRFVMRSB1c2UgY291bnQgKi8KIAlSVF9NT0RfSU5DX1VTRV9DT1VOVCgpOwogCiAJbmV0aWZfc3RhcnRfcXVldWUobmV0X2Rldik7CkBAIC0xODEsNDA5ICsyMDgsMTYwIEBACiAJCSgzKSBCQSBSZW9yZGVyaW5nOiAJCQkJYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKCkKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLWludCBydDI4eHhfY2xvc2UoSU4gUE5FVF9ERVYgZGV2KQoraW50IHJ0Mjh4eF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBuZXRfZGV2aWNlICogbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldjsKLSAgICBSVE1QX0FEQVBURVIJKnBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7Ci0JQk9PTEVBTiAJCUNhbmNlbGxlZCA9IEZBTFNFOwotCVVJTlQzMgkJCWkgPSAwOwotI2lmZGVmIFJUMjg3MAotCURFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEX09OU1RBQ0sodW5saW5rX3dha2V1cCk7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gTlVMTDsKKwlCT09MRUFOIENhbmNlbGxlZDsKKwl1MzIgaSA9IDA7CisKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwlERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh1bmxpbmtfd2FrZXVwKTsKIAlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotCS8vUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVNT1ZFX0lOX1BST0dSRVNTKTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWQsIG5ldF9kZXYpOwogCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4eHhfY2xvc2VcbiIpKTsKIAotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyOHh4X2Nsb3NlXG4iKSk7Ci0KLQkvLyBTYW5pdHkgY2hlY2sgZm9yIHBBZAorCUNhbmNlbGxlZCA9IEZBTFNFOworCS8qIFNhbml0eSBjaGVjayBmb3IgcEFkICovCiAJaWYgKHBBZCA9PSBOVUxMKQotCQlyZXR1cm4gMDsgLy8gY2xvc2Ugb2sKKwkJcmV0dXJuIDA7CS8qIGNsb3NlIG9rICovCiAKIAl7Ci0JCS8vIElmIGRpcnZlciBkb2Vzbid0IHdha2UgdXAgZmlybXdhcmUgaGVyZSwKLQkJLy8gTklDTG9hZEZpcm13YXJlIHdpbGwgaGFuZyBmb3JldmVyIHdoZW4gaW50ZXJmYWNlIGlzIHVwIGFnYWluLgotI2lmZGVmIFJUMjg2MAotCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSB8fAotCQkJUlRNUF9TRVRfUFNGTEFHKHBBZCwgZlJUTVBfUFNfU0VUX1BDSV9DTEtfT0ZGX0NPTU1BTkQpIHx8Ci0JCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpKQotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQotI2VuZGlmCi0gICAgICAgIHsKLSNpZmRlZiBSVDI4NjAKLQkJICAgIEFzaWNGb3JjZVdha2V1cChwQWQsIFJUTVBfSEFMVCk7Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQkJICAgIEFzaWNGb3JjZVdha2V1cChwQWQsIFRSVUUpOwotI2VuZGlmCi0gICAgICAgIH0KKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkJUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsIFJFU1RPUkVfQ0xPU0UpOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCi0JCWlmIChJTkZSQV9PTihwQWQpICYmCi0JCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCi0JCXsKLQkJCU1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVAlEaXNSZXE7Ci0JCQlNTE1FX1FVRVVFX0VMRU0gKk1zZ0VsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKLQotCQkJQ09QWV9NQUNfQUREUihEaXNSZXEuQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQkJRGlzUmVxLlJlYXNvbiA9ICBSRUFTT05fREVBVVRIX1NUQV9MRUFWSU5HOwotCi0JCQlNc2dFbGVtLT5NYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKLQkJCU1zZ0VsZW0tPk1zZ1R5cGUgPSBNVDJfTUxNRV9ESVNBU1NPQ19SRVE7Ci0JCQlNc2dFbGVtLT5Nc2dMZW4gPSBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKTsKLQkJCU5kaXNNb3ZlTWVtb3J5KE1zZ0VsZW0tPk1zZywgJkRpc1JlcSwgc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCkpOwotCi0JCQkvLyBQcmV2ZW50IHRvIGNvbm5lY3QgQVAgYWdhaW4gaW4gU1RBTWxtZVBlcmlvZGljRXhlYwotCQkJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKLQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKLQotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfRElTQVNTT0M7Ci0JCQlNbG1lRGlzYXNzb2NSZXFBY3Rpb24ocEFkLCBNc2dFbGVtKTsKLQkJCWtmcmVlKE1zZ0VsZW0pOwotCi0JCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCQkvKiBJZiBkaXJ2ZXIgZG9lc24ndCB3YWtlIHVwIGZpcm13YXJlIGhlcmUsICovCisJCS8qIE5JQ0xvYWRGaXJtd2FyZSB3aWxsIGhhbmcgZm9yZXZlciB3aGVuIGludGVyZmFjZSBpcyB1cCBhZ2Fpbi4gKi8KKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpIHsKKwkJCUFzaWNGb3JjZVdha2V1cChwQWQsIFRSVUUpOwogCQl9Ci0KLSNpZmRlZiBSVDI4NzAKLQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MpOwotI2VuZGlmIC8vIFJUMjg3MCAvLwotCi0jaWZkZWYgQ0NYX1NVUFBPUlQKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5MZWFwQXV0aFRpbWVyLCAmQ2FuY2VsbGVkKTsKLSNlbmRpZgotCi0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsICZDYW5jZWxsZWQpOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLldwYURpc2Fzc29jQW5kQmxvY2tBc3NvY1RpbWVyLCAmQ2FuY2VsbGVkKTsKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVNT1ZFX0lOX1BST0dSRVNTKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAogCQlNbG1lUmFkaW9PZmYocEFkKTsKLSNpZmRlZiBSVDI4NjAKKyNpZmRlZiBSVE1QX01BQ19QQ0kKIAkJcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7Ci0jZW5kaWYKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAl9CiAKIAlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKIAotCWZvciAoaSA9IDAgOyBpIDwgTlVNX09GX1RYX1JJTkc7IGkrKykKLQl7Ci0JCXdoaWxlIChwQWQtPkRlUXVldWVSdW5uaW5nW2ldID09IFRSVUUpCi0JCXsKLQkJCXByaW50aygiV2FpdGluZyBmb3IgVHhRdWV1ZVslZF0gZG9uZS4uLi4uLi4uLi5cbiIsIGkpOworCWZvciAoaSA9IDA7IGkgPCBOVU1fT0ZfVFhfUklORzsgaSsrKSB7CisJCXdoaWxlIChwQWQtPkRlUXVldWVSdW5uaW5nW2ldID09IFRSVUUpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIldhaXRpbmcgZm9yIFR4UXVldWVbJWRdIGRvbmUuLi4uLi4uLi4uXG4iLAorCQkJCSAgaSkpOwogCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKIAkJfQogCX0KIAotI2lmZGVmIFJUMjg3MAotCS8vIGVuc3VyZSB0aGVyZSBhcmUgbm8gbW9yZSBhY3RpdmUgdXJicy4KLQlhZGRfd2FpdF9xdWV1ZSAoJnVubGlua193YWtldXAsICZ3YWl0KTsKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwkvKiBlbnN1cmUgdGhlcmUgYXJlIG5vIG1vcmUgYWN0aXZlIHVyYnMuICovCisJYWRkX3dhaXRfcXVldWUoJnVubGlua193YWtldXAsICZ3YWl0KTsKIAlwQWQtPndhaXQgPSAmdW5saW5rX3dha2V1cDsKIAotCS8vIG1heWJlIHdhaXQgZm9yIGRlbGV0aW9ucyB0byBmaW5pc2guCisJLyogbWF5YmUgd2FpdCBmb3IgZGVsZXRpb25zIHRvIGZpbmlzaC4gKi8KIAlpID0gMDsKLQkvL3doaWxlKChpIDwgMjUpICYmIGF0b21pY19yZWFkKCZwQWQtPlBlbmRpbmdSeCkgPiAwKQotCXdoaWxlKGkgPCAyNSkKLQl7CisJLyp3aGlsZSgoaSA8IDI1KSAmJiBhdG9taWNfcmVhZCgmcEFkLT5QZW5kaW5nUngpID4gMCkgKi8KKwl3aGlsZSAoaSA8IDI1KSB7CiAJCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CiAKIAkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7Ci0JCWlmIChwQWQtPlBlbmRpbmdSeCA9PSAwKQotCQl7CisJCWlmIChwQWQtPlBlbmRpbmdSeCA9PSAwKSB7CiAJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOwogCQkJYnJlYWs7CiAJCX0KIAkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKIAotCQltc2xlZXAoVU5MSU5LX1RJTUVPVVRfTVMpOwkvL1RpbWUgaW4gbWlsbGlzZWNvbmQKKwkJbXNsZWVwKFVOTElOS19USU1FT1VUX01TKTsJLypUaW1lIGluIG1pbGxpc2Vjb25kICovCiAJCWkrKzsKIAl9CiAJcEFkLT53YWl0ID0gTlVMTDsKLQlyZW1vdmVfd2FpdF9xdWV1ZSAoJnVubGlua193YWtldXAsICZ3YWl0KTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KKwlyZW1vdmVfd2FpdF9xdWV1ZSgmdW5saW5rX3dha2V1cCwgJndhaXQpOworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCi0jaWZkZWYgUlQyODcwCi0JLy8gV2UgbmVlZCBjbGVhciB0aW1lclEgcmVsYXRlZCBzdHJ1Y3R1cmUgYmVmb3JlIGV4aXRzIG9mIHRoZSB0aW1lciB0aHJlYWQuCi0JUlQyODcwX1RpbWVyUV9FeGl0KHBBZCk7Ci0JLy8gQ2xvc2Uga2VybmVsIHRocmVhZHMgb3IgdGFza2xldHMKLQlSVDI4eHhUaHJlYWRUZXJtaW5hdGUocEFkKTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQotCS8vIFN0b3AgTWxtZSBzdGF0ZSBtYWNoaW5lCisJLyogU3RvcCBNbG1lIHN0YXRlIG1hY2hpbmUgKi8KIAlNbG1lSGFsdChwQWQpOwogCi0JLy8gQ2xvc2Uga2VybmVsIHRocmVhZHMgb3IgdGFza2xldHMKLQlraWxsX3RocmVhZF90YXNrKHBBZCk7CisJLyogQ2xvc2UgbmV0IHRhc2tsZXRzICovCisJUnRtcE5ldFRhc2tFeGl0KHBBZCk7CiAKLQlNYWNUYWJsZVJlc2V0KHBBZCk7CisJeworCQlNYWNUYWJsZVJlc2V0KHBBZCk7CisJfQogCiAJTWVhc3VyZVJlcVRhYkV4aXQocEFkKTsKIAlUcGNSZXFUYWJFeGl0KHBBZCk7CiAKLSNpZmRlZiBSVDI4NjAKKwkvKiBDbG9zZSBrZXJuZWwgdGhyZWFkcyAqLworCVJ0bXBNZ210VGFza0V4aXQocEFkKTsKKworI2lmZGVmIFJUTVBfTUFDX1BDSQorCXsKKwkJQk9PTEVBTiBicmM7CisJCS8qICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgICBWYWx1ZTsgKi8KKworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpKSB7CisJCQlSVE1QX0FTSUNfSU5URVJSVVBUX0RJU0FCTEUocEFkKTsKKwkJfQorCQkvKiBSZWNlaXZlIHBhY2tldHMgdG8gY2xlYXIgRE1BIGluZGV4IGFmdGVyIGRpc2FibGUgaW50ZXJydXB0LiAqLworCQkvKlJUTVBIYW5kbGVSeERvbmVJbnRlcnJ1cHQocEFkKTsgKi8KKwkJLyogcHV0IHRvIHJhZGlvIG9mZiB0byBzYXZlIHBvd2VyIHdoZW4gZHJpdmVyIHVubG9hZC4gIEFmdGVyIHJhZGlvb2ZmLCBjYW4ndCB3cml0ZSAvcmVhZCByZWdpc3Rlci4gIFNvIG5lZWQgdG8gZmluaXNoIGFsbCAqLworCQkvKiByZWdpc3RlciBhY2Nlc3MgYmVmb3JlIFJhZGlvIG9mZi4gKi8KKworCQlicmMgPSBSVDI4eHhQY2lBc2ljUmFkaW9PZmYocEFkLCBSVE1QX0hBTFQsIDApOworCisvKkluICBzb2x1dGlvbiAzIG9mIDMwOTBGLCB0aGUgYlBDSWNsa09mZiB3aWxsIGJlIHNldCB0byBUUlVFIGFmdGVyIGNhbGxpbmcgUlQyOHh4UGNpQXNpY1JhZGlvT2ZmICovCisJCXBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOworCisJCWlmIChicmMgPT0gRkFMU0UpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIiVzIGNhbGwgUlQyOHh4UGNpQXNpY1JhZGlvT2ZmIGZhaWwhXG4iLAorCQkJCSAgX19mdW5jX18pKTsKKwkJfQorCX0KKworLyoKIAlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpKQogCXsKLQkJTklDRGlzYWJsZUludGVycnVwdChwQWQpOworCQlSVE1QX0FTSUNfSU5URVJSVVBUX0RJU0FCTEUocEFkKTsKIAl9CiAKIAkvLyBEaXNhYmxlIFJ4LCByZWdpc3RlciB2YWx1ZSBzdXBwb3NlZCB3aWxsIHJlbWFpbiBhZnRlciByZXNldAogCU5JQ0lzc3VlUmVzZXQocEFkKTsKKyovCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiAKLQkvLyBGcmVlIElSUQotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0JewotCQkvLyBEZXJlZ2lzdGVyIGludGVycnVwdCBmdW5jdGlvbgotCQlSVDI4WFhfSVJRX1JFTEVBU0UobmV0X2RldikKKwkvKiBGcmVlIElSUSAqLworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpIHsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkJLyogRGVyZWdpc3RlciBpbnRlcnJ1cHQgZnVuY3Rpb24gKi8KKwkJUnRtcE9TSVJRUmVsZWFzZShuZXRfZGV2KTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKTsKIAl9Ci0jZW5kaWYKLQotCS8vIEZyZWUgUmluZyBvciBVU0IgYnVmZmVycworCS8qIEZyZWUgUmluZyBvciBVU0IgYnVmZmVycyAqLwogCVJUTVBGcmVlVHhSeFJpbmdNZW1vcnkocEFkKTsKIAogCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CiAKLQkvLyBGcmVlIEJBIHJlb3JkZXIgcmVzb3VyY2UKKwkvKiBGcmVlIEJBIHJlb3JkZXIgcmVzb3VyY2UgKi8KIAliYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UocEFkKTsKIAogCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApOwogCi0JcmV0dXJuIDA7IC8vIGNsb3NlIG9rCi19IC8qIEVuZCBvZiBydDI4eHhfY2xvc2UgKi8KLQotc3RhdGljIGludCBydDI4eHhfaW5pdChJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKLXsKLSNpZmRlZiBSVDI4NjAKLQlQUlRNUF9BREFQVEVSIAkJCXBBZCA9IChQUlRNUF9BREFQVEVSKW5ldF9kZXYtPm1sX3ByaXY7Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQlQUlRNUF9BREFQVEVSIAkJCXBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7Ci0jZW5kaWYKLQlVSU5UCQkJCQlpbmRleDsKLQlVQ0hBUgkJCQkJVG1wUGh5OwotCU5ESVNfU1RBVFVTCQkJCVN0YXR1czsKLQlVSU5UMzIgCQlNYWNDc3IwID0gMDsKLQotCS8vIEFsbG9jYXRlIEJBIFJlb3JkZXJpbmcgbWVtb3J5Ci0JYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9pbml0KHBBZCwgTUFYX1JFT1JERVJJTkdfTVBEVV9OVU0pOwotCi0JLy8gTWFrZSBzdXJlIE1BQyBnZXRzIHJlYWR5LgotCWluZGV4ID0gMDsKLQlkbworLyorKytNb2RpZnkgYnkgd29vZHkgdG8gc29sdmUgdGhlIGJ1bGsgZmFpbCsrKyovCiAJewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19DU1IwLCAmTWFjQ3NyMCk7Ci0JCXBBZC0+TUFDVmVyc2lvbiA9IE1hY0NzcjA7Ci0KLQkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gIT0gMHgwMCkgJiYgKHBBZC0+TUFDVmVyc2lvbiAhPSAweEZGRkZGRkZGKSkKLQkJCWJyZWFrOwotCi0JCVJUTVB1c2VjRGVsYXkoMTApOwotCX0gd2hpbGUgKGluZGV4KysgPCAxMDApOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTUFDX0NTUjAgIFsgVmVyOlJldj0weCUwOHhdXG4iLCBwQWQtPk1BQ1ZlcnNpb24pKTsKLS8qSXZlcnNvbiBwYXRjaCBQQ0lFIEwxIGlzc3VlICovCi0KLQkvLyBEaXNhYmxlIERNQQotCVJUMjhYWERNQURpc2FibGUocEFkKTsKLQotCS8vIExvYWQgODA1MSBmaXJtd2FyZQotCVN0YXR1cyA9IE5JQ0xvYWRGaXJtd2FyZShwQWQpOwotCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UX0VSUigoIk5JQ0xvYWRGaXJtd2FyZSBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7Ci0JCWdvdG8gZXJyMTsKIAl9CiAKLQlOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtcyhwQWQpOwotCi0JLy8gRGlzYWJsZSBpbnRlcnJ1cHRzIGhlcmUgd2hpY2ggaXMgYXMgc29vbiBhcyBwb3NzaWJsZQotCS8vIFRoaXMgc3RhdGVtZW50IHNob3VsZCBuZXZlciBiZSB0cnVlLiBXZSBtaWdodCBjb25zaWRlciB0byByZW1vdmUgaXQgbGF0ZXIKLSNpZmRlZiBSVDI4NjAKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpKQotCXsKLQkJTklDRGlzYWJsZUludGVycnVwdChwQWQpOwotCX0KLSNlbmRpZgotCi0JU3RhdHVzID0gUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnkocEFkKTsKLQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVF9FUlIoKCJSVE1QQWxsb2NETUFNZW1vcnkgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cykpOwotCQlnb3RvIGVycjE7Ci0JfQotCi0JUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSk7Ci0KLQkvLyBpbml0aWFsaXplIE1MTUUKLQkvLwotCi0JU3RhdHVzID0gTWxtZUluaXQocEFkKTsKLQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVF9FUlIoKCJNbG1lSW5pdCBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7Ci0JCWdvdG8gZXJyMjsKLQl9Ci0KLQkvLyBJbml0aWFsaXplIHBBZC0+U3RhQ2ZnLCBwQWQtPkFwQ2ZnLCBwQWQtPkNvbW1vbkNmZyB0byBtYW51ZmFjdHVyZSBkZWZhdWx0Ci0JLy8KLQlVc2VyQ2ZnSW5pdChwQWQpOwotCi0jaWZkZWYgUlQyODcwCi0JLy8gV2UgbmVlZCBpbml0IHRpbWVyUSByZWxhdGVkIHN0cnVjdHVyZSBiZWZvcmUgY3JlYXRlIHRoZSB0aW1lciB0aHJlYWQuCi0JUlQyODcwX1RpbWVyUV9Jbml0KHBBZCk7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi0KLQlSVDI4WFhfVEFTS19USFJFQURfSU5JVChwQWQsIFN0YXR1cyk7Ci0JaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQlnb3RvIGVycjE7Ci0KLQlDZmdJbml0SG9vayhwQWQpOwotCi0JTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0KLQlNZWFzdXJlUmVxVGFiSW5pdChwQWQpOwotCVRwY1JlcVRhYkluaXQocEFkKTsKLQotCS8vCi0JLy8gSW5pdCB0aGUgaGFyZHdhcmUsIHdlIG5lZWQgdG8gaW5pdCBhc2ljIGJlZm9yZSByZWFkIHJlZ2lzdHJ5LCBvdGhlcndpc2UgbWFjIHJlZ2lzdGVyIHdpbGwgYmUgcmVzZXQKLQkvLwotCVN0YXR1cyA9IE5JQ0luaXRpYWxpemVBZGFwdGVyKHBBZCwgVFJVRSk7Ci0JaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiTklDSW5pdGlhbGl6ZUFkYXB0ZXIgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cykpOwotCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCWdvdG8gZXJyMzsKLQl9Ci0KLQkvLyBSZWFkIHBhcmFtZXRlcnMgZnJvbSBDb25maWcgRmlsZQotCVN0YXR1cyA9IFJUTVBSZWFkUGFyYW1ldGVyc0hvb2socEFkKTsKLQotCXByaW50aygiMS4gUGh5IE1vZGUgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSk7Ci0JaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiTklDUmVhZFJlZ1BhcmFtZXRlcnMgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsU3RhdHVzKSk7Ci0JCWdvdG8gZXJyNDsKLQl9Ci0KLSNpZmRlZiBSVDI4NzAKLQlwQWQtPkNvbW1vbkNmZy5iTXVsdGlwbGVJUlAgPSBGQUxTRTsKLQotCWlmIChwQWQtPkNvbW1vbkNmZy5iTXVsdGlwbGVJUlApCi0JCXBBZC0+Q29tbW9uQ2ZnLk51bU9mQnVsa0luSVJQID0gUlhfUklOR19TSVpFOwotCWVsc2UKLQkJcEFkLT5Db21tb25DZmcuTnVtT2ZCdWxrSW5JUlAgPSAxOwotI2VuZGlmIC8vIFJUMjg3MCAvLwotCi0KLSAgIAkvL0luaXQgQmEgQ2FwYWJpbGl0eSBwYXJhbWV0ZXJzLgotCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHk7Ci0JcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGU7Ci0JcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZSA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1U2l6ZTsKLQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGU7Ci0JLy8gVVBkYXRhIHRvIEhUIElFCi0JcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZTsKLQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1U2l6ZTsKLQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eTsKLQotCXByaW50aygiMi4gUGh5IE1vZGUgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSk7Ci0KLQkvLyBXZSBzaG91bGQgcmVhZCBFRVBST00gZm9yIGFsbCBjYXNlcy4gIHJ0Mjg2MGIKLQlOSUNSZWFkRUVQUk9NUGFyYW1ldGVycyhwQWQsIG1hYyk7Ci0KLQlwcmludGsoIjMuIFBoeSBNb2RlID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpOwotCi0JTklDSW5pdEFzaWNGcm9tRUVQUk9NKHBBZCk7IC8vcnQyODYwYgotCi0JLy8gU2V0IFBIWSB0byBhcHByb3ByaWF0ZSBtb2RlCi0JVG1wUGh5ID0gcEFkLT5Db21tb25DZmcuUGh5TW9kZTsKLQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gMHhmZjsKLQlSVE1QU2V0UGh5TW9kZShwQWQsIFRtcFBoeSk7Ci0JU2V0Q29tbW9uSFQocEFkKTsKLQotCS8vIE5vIHZhbGlkIGNoYW5uZWxzLgotCWlmIChwQWQtPkNoYW5uZWxMaXN0TnVtID09IDApCi0JewotCQlwcmludGsoIldyb25nIGNvbmZpZ3VyYXRpb24uIE5vIHZhbGlkIGNoYW5uZWwgZm91bmQuIENoZWNrIFwiQ29udHJ5Q29kZVwiIGFuZCBcIkNoYW5uZWxHZW9ncmFwaHlcIiBzZXR0aW5nLlxuIik7Ci0JCWdvdG8gZXJyNDsKLQl9Ci0KLQlwcmludGsoIk1DUyBTZXQgPSAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0sCi0gICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0sIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMl0sCi0gICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbM10sIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0pOwotCi0jaWZkZWYgUlQyODcwCi0gICAgLy9Jbml0IFJUMzB4eCBSRlJlZ2lzdGVycyBhZnRlciByZWFkIFJGSUMgdHlwZSBmcm9tIEVFUFJPTQotCU5JQ0luaXRSVDMweHhSRlJlZ2lzdGVycyhwQWQpOwotI2VuZGlmIC8vIFJUMjg3MCAvLwotCi0KLQkJLy8KLQkvLyBJbml0aWFsaXplIFJGIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKLQkvLwotCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwotCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCi0jaWZuZGVmIFJUMjg3MAotCS8vIDgwNTEgZmlybXdhcmUgcmVxdWlyZSB0aGUgc2lnbmFsIGR1cmluZyBib290aW5nIHRpbWUuCi0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDcyLCAweEZGLCAweDAwLCAweDAwKTsKLSNlbmRpZgotCi0JaWYgKHBBZCAmJiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpKQotCXsKLQkJLy8KLQkJLy8gVW5kbyBldmVyeXRoaW5nIGlmIGl0IGZhaWxlZAotCQkvLwotCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotCQl7Ci0JCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpOwotCQl9Ci0JfQotCWVsc2UgaWYgKHBBZCkKLQl7Ci0JCS8vIE1pY3Jvc29mdCBIQ1QgcmVxdWlyZSBkcml2ZXIgc2VuZCBhIGRpc2Nvbm5lY3QgZXZlbnQgYWZ0ZXIgZHJpdmVyIGluaXRpYWxpemF0aW9uLgotCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwotCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9NRURJQV9TVEFURV9DSEFOR0UpOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQiFcbiIpKTsKLQotCi0jaWZkZWYgUlQyODcwCi0JCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpOwotCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFTU9WRV9JTl9QUk9HUkVTUyk7Ci0KLQkJLy8KLQkJLy8gU3VwcG9ydCBtdWx0aXBsZSBCdWxrSW4gSVJQLAotCQkvLyB0aGUgdmFsdWUgb24gcEFkLT5Db21tb25DZmcuTnVtT2ZCdWxrSW5JUlAgbWF5IGJlIGxhcmdlIHRoYW4gMS4KLQkJLy8KLQkJZm9yKGluZGV4PTA7IGluZGV4PHBBZC0+Q29tbW9uQ2ZnLk51bU9mQnVsa0luSVJQOyBpbmRleCsrKQotCQl7Ci0JCQlSVFVTQkJ1bGtSZWNlaXZlKHBBZCk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVFVTQkJ1bGtSZWNlaXZlIVxuIiApKTsKLQkJfQotI2VuZGlmIC8vIFJUMjg3MCAvLwotCX0vLyBlbmQgb2YgZWxzZQotCi0KLQlEQkdQUklOVF9TKFN0YXR1cywgKCI8PT09PSBSVE1QSW5pdGlhbGl6ZSwgU3RhdHVzPSV4XG4iLCBTdGF0dXMpKTsKLQotCXJldHVybiBUUlVFOwotCi0KLWVycjQ6Ci1lcnIzOgotCU1sbWVIYWx0KHBBZCk7Ci1lcnIyOgotCVJUTVBGcmVlVHhSeFJpbmdNZW1vcnkocEFkKTsKLWVycjE6Ci0Jb3NfZnJlZV9tZW0ocEFkLCBwQWQtPm1wZHVfYmxrX3Bvb2wubWVtKTsgLy8gZnJlZSBCQSBwb29sCi0JUlQyOFhYX0lSUV9SRUxFQVNFKG5ldF9kZXYpOwotCi0JLy8gc2hhbGwgbm90IHNldCBtbF9wcml2IHRvIE5VTEwgaGVyZSBiZWNhdXNlIHRoZSBtbF9wcml2IGRpZG4ndCBiZWVuIGZyZWUgeWV0LgotCS8vbmV0X2Rldi0+bWxfcHJpdiA9IDA7Ci0KLQlwcmludGsoIiEhISAlcyBJbml0aWFsaXplZCBmYWlsICEhIVxuIiwgUlQyOHh4X0NISVBfTkFNRSk7Ci0JcmV0dXJuIEZBTFNFOwotfSAvKiBFbmQgb2YgcnQyOHh4X2luaXQgKi8KLQorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyOHh4X2Nsb3NlXG4iKSk7CisJcmV0dXJuIDA7CQkvKiBjbG9zZSBvayAqLworfQkJCQkvKiBFbmQgb2YgcnQyOHh4X2Nsb3NlICovCiAKIC8qCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTYwMCwyMzQgKzM3OCwxMTYgQEAKIE5vdGU6CiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1pbnQgcnQyOHh4X29wZW4oSU4gUE5FVF9ERVYgZGV2KQoraW50IHJ0Mjh4eF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKiBuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2OwotCVBSVE1QX0FEQVBURVIgcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSBOVUxMOwogCWludCByZXR2YWwgPSAwOwotIAlQT1NfQ09PS0lFIHBPYmo7CisJLypzdHJ1Y3Qgb3NfY29va2llICpwT2JqOyAqLwogCisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkLCBuZXRfZGV2KTsKIAotCS8vIFNhbml0eSBjaGVjayBmb3IgcEFkCi0JaWYgKHBBZCA9PSBOVUxMKQotCXsKKwkvKiBTYW5pdHkgY2hlY2sgZm9yIHBBZCAqLworCWlmIChwQWQgPT0gTlVMTCkgewogCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOwogCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KIAkJcmV0dXJuIC0xOwogCX0KIAotCS8vIEluaXQKLSAJcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCWlmIChuZXRfZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKSB7CisJCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCQkJbmV0X2Rldi0+d2lyZWxlc3NfaGFuZGxlcnMgPQorCQkJICAgIChzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgKikmcnQyOHh4X2l3X2hhbmRsZXJfZGVmOworCX0KKwkvKiBSZXF1ZXN0IGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIFBDSSBkZXZpY2UgKi8KKwkvKiByZWdpc3RlciB0aGUgaW50ZXJydXB0IHJvdXRpbmUgd2l0aCB0aGUgb3MgKi8KKwlSdG1wT1NJUlFSZXF1ZXN0KG5ldF9kZXYpOwogCi0JLy8gcmVzZXQgQWRhcHRlciBmbGFncwotCVJUTVBfQ0xFQVJfRkxBR1MocEFkKTsKKwkvKiBJbml0IElSUSBwYXJhbWV0ZXJzIHN0b3JlZCBpbiBwQWQgKi8KKwlSVE1QX0lSUV9JTklUKHBBZCk7CiAKLQkvLyBSZXF1ZXN0IGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIFBDSSBkZXZpY2UKLQkvLyByZWdpc3RlciB0aGUgaW50ZXJydXB0IHJvdXRpbmUgd2l0aCB0aGUgb3MKLQlSVDI4WFhfSVJRX1JFUVVFU1QobmV0X2Rldik7Ci0KLQotCS8vIEluaXQgQnNzVGFiICYgQ2hhbm5lbEluZm8gdGFiYmxlcyBmb3IgYXV0byBjaGFubmVsIHNlbGVjdC4KLQotCi0JLy8gQ2hpcCAmIG90aGVyIGluaXQKLQlpZiAocnQyOHh4X2luaXQobmV0X2RldikgPT0gRkFMU0UpCisJLyogQ2hpcCAmIG90aGVyIGluaXQgKi8KKwlpZiAocnQyOHh4X2luaXQocEFkLCBtYWMsIGhvc3RuYW1lKSA9PSBGQUxTRSkKIAkJZ290byBlcnI7CiAKLQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5kZXZfbmFtZSwgMTYpOwotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLmRldl9uYW1lLCBuZXRfZGV2LT5uYW1lLCBzdHJsZW4obmV0X2Rldi0+bmFtZSkpOworCS8qIEVuYWJsZSBJbnRlcnJ1cHQgKi8KKwlSVE1QX0lSUV9FTkFCTEUocEFkKTsKIAotCS8vIFNldCB1cCB0aGUgTWFjIGFkZHJlc3MKLQlOZGlzTW92ZU1lbW9yeShuZXRfZGV2LT5kZXZfYWRkciwgKHZvaWQgKikgcEFkLT5DdXJyZW50QWRkcmVzcywgNik7Ci0KLQkvLyBJbml0IElSUSBwYXJhbWV0ZXJzCi0JUlQyOFhYX0lSUV9JTklUKHBBZCk7Ci0KLQkvLyBWYXJpb3VzIEFQIGZ1bmN0aW9uIGluaXQKLQotCS8vIEVuYWJsZSBJbnRlcnJ1cHQKLQlSVDI4WFhfSVJRX0VOQUJMRShwQWQpOwotCi0JLy8gTm93IEVuYWJsZSBSeFR4CisJLyogTm93IEVuYWJsZSBSeFR4ICovCiAJUlRNUEVuYWJsZVJ4VHgocEFkKTsKIAlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCk7CiAKIAl7Ci0JVUlOVDMyIHJlZyA9IDA7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCAweDEzMDAsICZyZWcpOyAgLy8gY2xlYXIgZ2FyYmFnZSBpbnRlcnJ1cHRzCi0JcHJpbnRrKCIweDEzMDAgPSAlMDh4XG4iLCByZWcpOworCQl1MzIgcmVnID0gMDsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCAweDEzMDAsICZyZWcpOwkvKiBjbGVhciBnYXJiYWdlIGludGVycnVwdHMgKi8KKwkJcHJpbnRrKCIweDEzMDAgPSAlMDh4XG4iLCByZWcpOwogCX0KIAotI2lmZGVmIFJUMjg2MAotICAgICAgICBSVE1QSW5pdFBDSWVMaW5rQ3RybFZhbHVlKHBBZCk7Ci0jZW5kaWYKKwl7CisvKiAgICAgIHUzMiByZWc7ICovCisvKiAgICAgIHU4ICBieXRlOyAqLworLyogICAgICB1MTYgdG1wOyAqLworCisvKiAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgWElGU19USU1FX0NGRywgJnJlZyk7ICovCisKKy8qICAgICAgdG1wID0gMHgwODA1OyAqLworLyogICAgICByZWcgID0gKHJlZyAmIDB4ZmZmZjAwMDApIHwgdG1wOyAqLworLyogICAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBYSUZTX1RJTUVfQ0ZHLCByZWcpOyAqLworCisJfQorI2lmZGVmIFJUTVBfTUFDX1BDSQorCVJUTVBJbml0UENJZUxpbmtDdHJsVmFsdWUocEFkKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKwogCXJldHVybiAocmV0dmFsKTsKIAogZXJyOgorLyorKytBZGQgYnkgc2hpYW5nLCBtb3ZlIGZyb20gcnQyOHh4X2luaXQoKSB0byBoZXJlLiAqLworCVJ0bXBPU0lSUVJlbGVhc2UobmV0X2Rldik7CisvKi0tLUFkZCBieSBzaGlhbmcsIG1vdmUgZnJvbSBydDI4eHhfaW5pdCgpIHRvIGhlcmUuICovCiAJcmV0dXJuICgtMSk7Ci19IC8qIEVuZCBvZiBydDI4eHhfb3BlbiAqLworfQkJCQkvKiBFbmQgb2YgcnQyOHh4X29wZW4gKi8KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBydDI4NjBfbmV0ZGV2X29wcyA9IHsKLQkubmRvX29wZW4JCT0gTWFpblZpcnR1YWxJRl9vcGVuLAotCS5uZG9fc3RvcAkJPSBNYWluVmlydHVhbElGX2Nsb3NlLAotCS5uZG9fZG9faW9jdGwJCT0gcnQyOHh4X3N0YV9pb2N0bCwKLQkubmRvX2dldF9zdGF0cwkJPSBSVDI4eHhfZ2V0X2V0aGVyX3N0YXRzLAotCS5uZG9fdmFsaWRhdGVfYWRkcgk9IE5VTEwsCi0JLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBldGhfbWFjX2FkZHIsCi0JLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAotCS5uZG9fc3RhcnRfeG1pdAkJPSBydDI4eHhfc2VuZF9wYWNrZXRzLAorCS5uZG9fb3BlbiA9IE1haW5WaXJ0dWFsSUZfb3BlbiwKKwkubmRvX3N0b3AgPSBNYWluVmlydHVhbElGX2Nsb3NlLAorCS5uZG9fZG9faW9jdGwgPSBydDI4eHhfc3RhX2lvY3RsLAorCS5uZG9fZ2V0X3N0YXRzID0gUlQyOHh4X2dldF9ldGhlcl9zdGF0cywKKwkubmRvX3ZhbGlkYXRlX2FkZHIgPSBOVUxMLAorCS5uZG9fc2V0X21hY19hZGRyZXNzID0gZXRoX21hY19hZGRyLAorCS5uZG9fY2hhbmdlX210dSA9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fc3RhcnRfeG1pdCA9IHJ0Mjh4eF9zZW5kX3BhY2tldHMsCiB9OwogCi0vKiBNdXN0IG5vdCBiZSBjYWxsZWQgZm9yIG1kZXYgYW5kIGFwZGV2ICovCi1zdGF0aWMgTkRJU19TVEFUVVMgcnRfaWVlZTgwMjExX2lmX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIFBSVE1QX0FEQVBURVIgcEFkKQorc3RydWN0IG5ldF9kZXZpY2UgKlJ0bXBQaHlOZXREZXZJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHN0cnVjdCBydF9ydG1wX29zX25ldGRldl9vcF9ob29rICpwTmV0RGV2SG9vaykKIHsKLQlORElTX1NUQVRVUyBTdGF0dXM7Ci0JSU5UICAgICBpPTA7Ci0JQ0hBUiAgICBzbG90X25hbWVbSUZOQU1TSVpdOwotCXN0cnVjdCBuZXRfZGV2aWNlICAgKmRldmljZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IE5VTEw7CisvKiAgICAgIGludCAgICAgICAgICAgICBTdGF0dXM7ICovCiAKLQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLQl7Ci0JCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAmcnQyOHh4X2l3X2hhbmRsZXJfZGVmOworCW5ldF9kZXYgPQorCSAgICBSdG1wT1NOZXREZXZDcmVhdGUocEFkLCBJTlRfTUFJTiwgMCwgc2l6ZW9mKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKiksCisJCQkgICAgICAgSU5GX01BSU5fREVWX05BTUUpOworCWlmIChuZXRfZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrCisJCSAgICAoIlJ0bXBQaHlOZXREZXZJbml0KCk6IGNyZWF0aW9uIGZhaWxlZCBmb3IgbWFpbiBwaHlzaWNhbCBuZXQgZGV2aWNlIVxuIik7CisJCXJldHVybiBOVUxMOwogCX0KIAotCWRldi0+cHJpdl9mbGFncyA9IElOVF9NQUlOOwotCWRldi0+bmV0ZGV2X29wcyA9ICZydDI4NjBfbmV0ZGV2X29wczsKLQkvLyBmaW5kIGF2YWlsYWJsZSBkZXZpY2UgbmFtZQotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JewotCQlzcHJpbnRmKHNsb3RfbmFtZSwgIndsYW4lZCIsIGkpOworCU5kaXNaZXJvTWVtb3J5KCh1bnNpZ25lZCBjaGFyICopcE5ldERldkhvb2ssCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X3J0bXBfb3NfbmV0ZGV2X29wX2hvb2spKTsKKwlwTmV0RGV2SG9vay0+bmV0ZGV2X29wcyA9ICZydDI4NjBfbmV0ZGV2X29wczsKKwlwTmV0RGV2SG9vay0+cHJpdl9mbGFncyA9IElOVF9NQUlOOworCXBOZXREZXZIb29rLT5uZWVkUHJvdGN0ZWQgPSBGQUxTRTsKIAotCQlkZXZpY2UgPSBkZXZfZ2V0X2J5X25hbWUoZGV2X25ldChkZXYpLCBzbG90X25hbWUpOwotCQlpZiAoZGV2aWNlICE9IE5VTEwpCi0JCQlkZXZfcHV0KGRldmljZSk7Ci0KLQkJaWYgKGRldmljZSA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYoaSA9PSA4KQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTm8gYXZhaWxhYmxlIHNsb3QgbmFtZVxuIikpOwotCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQllbHNlCi0JewotCQlzcHJpbnRmKGRldi0+bmFtZSwgIndsYW4lZCIsIGkpOwotCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCX0KLQotCXJldHVybiBTdGF0dXM7Ci0KLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBQcm9iZSBSVDI4WFggY2hpcHNldC4KLQotQXJndW1lbnRzOgotICAgIF9kZXZfcAkJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UKLQlfZGV2X2lkX3AJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UgSUQKLQotUmV0dXJuIFZhbHVlOgotICAgIDAJCQkJCVByb2JlIE9LCi0JLUVOT0RFVgkJCQlQcm9iZSBGYWlsCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgX19kZXZpbml0ICAgcnQyOHh4X3Byb2JlKAotICAgIElOICB2b2lkICpfZGV2X3AsCi0gICAgSU4gIHZvaWQgKl9kZXZfaWRfcCwKLQlJTiAgVUlOVCBhcmdjLAotCU9VVCBQUlRNUF9BREFQVEVSICpwcEFkKQotewotICAgIHN0cnVjdCAgbmV0X2RldmljZQkqbmV0X2RldjsKLSAgICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCA9IChQUlRNUF9BREFQVEVSKSBOVUxMOwotICAgIElOVCAgICAgICAgICAgICAgICAgc3RhdHVzOwotCVBWT0lECQkJCWhhbmRsZTsKLSNpZmRlZiBSVDI4NjAKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2X3AgPSAoc3RydWN0IHBjaV9kZXYgKilfZGV2X3A7Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKV9kZXZfcDsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2X3AgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwotCi0JZGV2X3AgPSB1c2JfZ2V0X2RldihkZXZfcCk7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTVEEgRHJpdmVyIHZlcnNpb24tJXNcbiIsIFNUQV9EUklWRVJfVkVSU0lPTikpOwotCi0gICAgbmV0X2RldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihQUlRNUF9BREFQVEVSKSk7Ci0gICAgaWYgKG5ldF9kZXYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHByaW50aygiYWxsb2NfbmV0ZGV2IGZhaWxlZFxuIik7Ci0KLSAgICAgICAgZ290byBlcnJfb3V0OwotICAgIH0KKwluZXRfZGV2LT5tbF9wcml2ID0gKHZvaWQgKilwQWQ7CisJcEFkLT5uZXRfZGV2ID0gbmV0X2RldjsKIAogCW5ldGlmX3N0b3BfcXVldWUobmV0X2Rldik7CiAKLS8qIGZvciBzdXBwb3J0aW5nIE5ldHdvcmsgTWFuYWdlciAqLwotLyogU2V0IHRoZSBzeXNmcyBwaHlzaWNhbCBkZXZpY2UgcmVmZXJlbmNlIGZvciB0aGUgbmV0d29yayBsb2dpY2FsIGRldmljZQotICogaWYgc2V0IHByaW9yIHRvIHJlZ2lzdHJhdGlvbiB3aWxsIGNhdXNlIGEgc3ltbGluayBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCi0gKi8KLSAgICBTRVRfTkVUREVWX0RFVihuZXRfZGV2LCAmKGRldl9wLT5kZXYpKTsKKwlyZXR1cm4gbmV0X2RldjsKIAotCS8vIEFsbG9jYXRlIFJUTVBfQURBUFRFUiBtaW5pcG9ydCBhZGFwdGVyIHN0cnVjdHVyZQotCWhhbmRsZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBvc19jb29raWUpLCBHRlBfS0VSTkVMKTsKLQlpZiAoaGFuZGxlID09IE5VTEwpCi0JCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjs7Ci0JUlQyOFhYX0hBTkRMRV9ERVZfQVNTSUdOKGhhbmRsZSwgZGV2X3ApOwotCi0Jc3RhdHVzID0gUlRNUEFsbG9jQWRhcHRlckJsb2NrKGhhbmRsZSwgJnBBZCk7Ci0JaWYgKHN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQlnb3RvIGVycl9vdXRfZnJlZV9uZXRkZXY7Ci0KLQluZXRfZGV2LT5tbF9wcml2ID0gKFBWT0lEKXBBZDsKLSAgICBwQWQtPm5ldF9kZXYgPSBuZXRfZGV2OyAvLyBtdXN0IGJlIGJlZm9yZSBSVDI4WFhOZXREZXZJbml0KCkKLQotCVJUMjhYWE5ldERldkluaXQoX2Rldl9wLCBuZXRfZGV2LCBwQWQpOwotCi0gICAgcEFkLT5TdGFDZmcuT3JpRGV2VHlwZSA9IG5ldF9kZXYtPnR5cGU7Ci0KLQkvLyBQb3N0IGNvbmZpZwotCWlmIChSVDI4WFhQcm9iZVBvc3RDb25maWcoX2Rldl9wLCBwQWQsIDApID09IEZBTFNFKQotCQlnb3RvIGVycl9vdXRfdW5tYXA7Ci0KLQlwQWQtPk9wTW9kZSA9IE9QTU9ERV9TVEE7Ci0KLQkvLyBzYW1wbGUgbW92ZQotCWlmIChydF9pZWVlODAyMTFfaWZfc2V0dXAobmV0X2RldiwgcEFkKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQlnb3RvIGVycl9vdXRfdW5tYXA7Ci0KLSAgICAvLyBSZWdpc3RlciB0aGlzIGRldmljZQotICAgIHN0YXR1cyA9IHJlZ2lzdGVyX25ldGRldihuZXRfZGV2KTsKLSAgICBpZiAoc3RhdHVzKQotICAgICAgICBnb3RvIGVycl9vdXRfdW5tYXA7Ci0KLSAgICAvLyBTZXQgZHJpdmVyIGRhdGEKLQlSVDI4WFhfRFJWREFUQV9TRVQoX2Rldl9wKTsKLQotCSpwcEFkID0gcEFkOwotICAgIHJldHVybiAwOyAvLyBwcm9iZSBvawotCi0KLQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRVJST1IgSEFORExFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotZXJyX291dF91bm1hcDoKLQlSVE1QRnJlZUFkYXB0ZXIocEFkKTsKLQlSVDI4WFhfVU5NQVAoKTsKLQotZXJyX291dF9mcmVlX25ldGRldjoKLQlmcmVlX25ldGRldihuZXRfZGV2KTsKLQotZXJyX291dDoKLQlSVDI4WFhfUFVUX0RFVklDRShkZXZfcCk7Ci0KLQlyZXR1cm4gLUVOT0RFVjsgLyogcHJvYmUgZmFpbCAqLwotfSAvKiBFbmQgb2YgcnQyOHh4X3Byb2JlICovCi0KK30KIAogLyoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtODQ5LDM2ICs1MDksMzIgQEAKIGludCBydDI4eHhfcGFja2V0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHNrYi0+ZGV2OwotCVBSVE1QX0FEQVBURVIgcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSBOVUxMOwogCWludCBzdGF0dXMgPSBORVRERVZfVFhfT0s7Ci0JUE5ESVNfUEFDS0VUIHBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUKSBza2I7CisJdm9pZCAqcFBhY2tldCA9ICh2b2lkICopc2tiOworCisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkLCBuZXRfZGV2KTsKKworCS8qIFJUMjg3MFNUQSBkb2VzIHRoaXMgaW4gUlRNUFNlbmRQYWNrZXRzKCkgKi8KIAogCXsKLQkJLy8gRHJvcCBzZW5kIHJlcXVlc3Qgc2luY2Ugd2UgYXJlIGluIG1vbml0b3IgbW9kZQotCQlpZiAoTU9OSVRPUl9PTihwQWQpKQotCQl7CisJCS8qIERyb3Agc2VuZCByZXF1ZXN0IHNpbmNlIHdlIGFyZSBpbiBtb25pdG9yIG1vZGUgKi8KKwkJaWYgKE1PTklUT1JfT04ocEFkKSkgewogCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQkJZ290byBkb25lOwogCQl9CiAJfQogCi0gICAgICAgIC8vIEVhcG9sU3RhcnQgc2l6ZSBpcyAxOAotCWlmIChza2ItPmxlbiA8IDE0KQotCXsKLQkJLy9wcmludGsoImJhZCBwYWNrZXQgc2l6ZTogJWRcbiIsIHBrdC0+bGVuKTsKKwkvKiBFYXBvbFN0YXJ0IHNpemUgaXMgMTggKi8KKwlpZiAoc2tiLT5sZW4gPCAxNCkgeworCQkvKnByaW50aygiYmFkIHBhY2tldCBzaXplOiAlZFxuIiwgcGt0LT5sZW4pOyAqLwogCQloZXhfZHVtcCgiYmFkIHBhY2tldCIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwogCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCWdvdG8gZG9uZTsKIAl9CiAKIAlSVE1QX1NFVF9QQUNLRVRfNVZUKHBQYWNrZXQsIDApOwotI2lmZGVmIENPTkZJR181VlRfRU5IQU5DRQotICAgIGlmICgqKGludCopKHNrYi0+Y2IpID09IEJSSURHRV9UQUcpIHsKLQkJUlRNUF9TRVRfUEFDS0VUXzVWVChwUGFja2V0LCAxKTsKLSAgICB9Ci0jZW5kaWYKLQotCVNUQVNlbmRQYWNrZXRzKChORElTX0hBTkRMRSlwQWQsIChQUE5ESVNfUEFDS0VUKSAmcFBhY2tldCwgMSk7CisJU1RBU2VuZFBhY2tldHMoKHZvaWQgKilwQWQsICh2b2lkICoqKSYgcFBhY2tldCwgMSk7CiAKIAlzdGF0dXMgPSBORVRERVZfVFhfT0s7CiBkb25lOgpAQCAtODg2LDcgKzU0Miw2IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotCiAvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBSb3V0aW5lIERlc2NyaXB0aW9uOgpAQCAtOTAzLDcyICs1NTgsNjkgQEAKIE5vdGU6CiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1JTlQgcnQyOHh4X3NlbmRfcGFja2V0cygKLQlJTiBzdHJ1Y3Qgc2tfYnVmZiAJCSpza2JfcCwKLQlJTiBzdHJ1Y3QgbmV0X2RldmljZSAJKm5ldF9kZXYpCitzdGF0aWMgaW50IHJ0Mjh4eF9zZW5kX3BhY2tldHMoSU4gc3RydWN0IHNrX2J1ZmYgKnNrYl9wLAorCQkJICAgICAgIElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQogewotICAgIFJUTVBfQURBUFRFUiAqcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKLQlpZiAoIShuZXRfZGV2LT5mbGFncyAmIElGRl9VUCkpCi0JewotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgKFBORElTX1BBQ0tFVClza2JfcCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gTlVMTDsKKworCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZCwgbmV0X2Rldik7CisKKwlpZiAoIShuZXRfZGV2LT5mbGFncyAmIElGRl9VUCkpIHsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsICh2b2lkICopc2tiX3AsCisJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQlyZXR1cm4gTkVUREVWX1RYX09LOwogCX0KIAotCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpJnNrYl9wLT5jYltDQl9PRkZdLCAxNSk7CisJTmRpc1plcm9NZW1vcnkoKHU4ICopJiBza2JfcC0+Y2JbQ0JfT0ZGXSwgMTUpOwogCVJUTVBfU0VUX1BBQ0tFVF9ORVRfREVWSUNFX01CU1NJRChza2JfcCwgTUFJTl9NQlNTSUQpOwogCiAJcmV0dXJuIHJ0Mjh4eF9wYWNrZXRfeG1pdChza2JfcCk7Cit9CiAKLX0gLyogRW5kIG9mIE1CU1NfVmlydHVhbElGX1BhY2tldFNlbmQgKi8KLQotCi0KLQotdm9pZCBDZmdJbml0SG9vayhQUlRNUF9BREFQVEVSIHBBZCkKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiBxdWVyeSAvcHJvYyAqLworc3RydWN0IGl3X3N0YXRpc3RpY3MgKnJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCiB7Ci0JcEFkLT5iQnJvYWRDb21IVCA9IFRSVUU7Ci19IC8qIEVuZCBvZiBDZmdJbml0SG9vayAqLworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IE5VTEw7CiAKLQotLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIHF1ZXJ5IC9wcm9jCi1zdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cygKLSAgICBJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKLXsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7Ci0KKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWQsIG5ldF9kZXYpOwogCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnQyOHh4X2dldF93aXJlbGVzc19zdGF0cyAtLS0+XG4iKSk7CiAKLQlwQWQtPml3X3N0YXRzLnN0YXR1cyA9IDA7IC8vIFN0YXR1cyAtIGRldmljZSBkZXBlbmRlbnQgZm9yIG5vdworCXBBZC0+aXdfc3RhdHMuc3RhdHVzID0gMDsJLyogU3RhdHVzIC0gZGV2aWNlIGRlcGVuZGVudCBmb3Igbm93ICovCiAKLQkvLyBsaW5rIHF1YWxpdHkKLQlwQWQtPml3X3N0YXRzLnF1YWwucXVhbCA9ICgocEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ICogMTIpLzEwICsgMTApOwotCWlmKHBBZC0+aXdfc3RhdHMucXVhbC5xdWFsID4gMTAwKQorCS8qIGxpbmsgcXVhbGl0eSAqLworCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCQlwQWQtPml3X3N0YXRzLnF1YWwucXVhbCA9CisJCSAgICAoKHBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSAqIDEyKSAvIDEwICsgMTApOworCisJaWYgKHBBZC0+aXdfc3RhdHMucXVhbC5xdWFsID4gMTAwKQogCQlwQWQtPml3X3N0YXRzLnF1YWwucXVhbCA9IDEwMDsKIAotCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQotCQlwQWQtPml3X3N0YXRzLnF1YWwubGV2ZWwgPSBSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpOworCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSB7CisJCXBBZC0+aXdfc3RhdHMucXVhbC5sZXZlbCA9CisJCSAgICBSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLAorCQkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLAorCQkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKTsKKwl9CiAKLQlwQWQtPml3X3N0YXRzLnF1YWwubm9pc2UgPSBwQWQtPkJicFdyaXRlTGF0Y2hbNjZdOyAvLyBub2lzZSBsZXZlbCAoZEJtKQorCXBBZC0+aXdfc3RhdHMucXVhbC5ub2lzZSA9IHBBZC0+QmJwV3JpdGVMYXRjaFs2Nl07CS8qIG5vaXNlIGxldmVsIChkQm0pICovCiAKIAlwQWQtPml3X3N0YXRzLnF1YWwubm9pc2UgKz0gMjU2IC0gMTQzOwotCXBBZC0+aXdfc3RhdHMucXVhbC51cGRhdGVkID0gMTsgICAgIC8vIEZsYWdzIHRvIGtub3cgaWYgdXBkYXRlZAorCXBBZC0+aXdfc3RhdHMucXVhbC51cGRhdGVkID0gMTsJLyogRmxhZ3MgdG8ga25vdyBpZiB1cGRhdGVkICovCiAjaWZkZWYgSVdfUVVBTF9EQk0KLQlwQWQtPml3X3N0YXRzLnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX0RCTTsJLy8gTGV2ZWwgKyBOb2lzZSBhcmUgZEJtCi0jZW5kaWYgLy8gSVdfUVVBTF9EQk0gLy8KKwlwQWQtPml3X3N0YXRzLnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX0RCTTsJLyogTGV2ZWwgKyBOb2lzZSBhcmUgZEJtICovCisjZW5kaWYgLyogSVdfUVVBTF9EQk0gLy8gKi8KIAotCXBBZC0+aXdfc3RhdHMuZGlzY2FyZC5ud2lkID0gMDsgICAgIC8vIFJ4IDogV3JvbmcgbndpZC9lc3NpZAotCXBBZC0+aXdfc3RhdHMubWlzcy5iZWFjb24gPSAwOyAgICAgIC8vIE1pc3NlZCBiZWFjb25zL3N1cGVyZnJhbWUKKwlwQWQtPml3X3N0YXRzLmRpc2NhcmQubndpZCA9IDA7CS8qIFJ4IDogV3JvbmcgbndpZC9lc3NpZCAqLworCXBBZC0+aXdfc3RhdHMubWlzcy5iZWFjb24gPSAwOwkvKiBNaXNzZWQgYmVhY29ucy9zdXBlcmZyYW1lICovCiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0tIHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHNcbiIpKTsKIAlyZXR1cm4gJnBBZC0+aXdfc3RhdHM7Ci19IC8qIEVuZCBvZiBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzICovCi0KLQorfQogCiB2b2lkIHRidHRfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0jZGVmaW5lIE1BWF9UWF9JTl9UQlRUCQkoMTYpCisvKiNkZWZpbmUgTUFYX1RYX0lOX1RCVFQgICAgICAgICAgICAgICAgKDE2KSAqLwogCiB9CiAKQEAgLTk4OCwxOSArNjQwLDIwIEBACiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1zdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqUlQyOHh4X2dldF9ldGhlcl9zdGF0cygKLSAgICBJTiAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKlJUMjh4eF9nZXRfZXRoZXJfc3RhdHMoSU4gc3RydWN0IG5ldF9kZXZpY2UKKwkJCQkJCSAgICAgICAqbmV0X2RldikKIHsKLSAgICBSVE1QX0FEQVBURVIgKnBBZCA9IE5VTEw7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gTlVMTDsKIAogCWlmIChuZXRfZGV2KQotCQlwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCQlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWQsIG5ldF9kZXYpOwogCi0JaWYgKHBBZCkKLQl7CisJaWYgKHBBZCkgewogCi0JCXBBZC0+c3RhdHMucnhfcGFja2V0cyA9IHBBZC0+V2xhbkNvdW50ZXJzLlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydDsKLQkJcEFkLT5zdGF0cy50eF9wYWNrZXRzID0gcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OworCQlwQWQtPnN0YXRzLnJ4X3BhY2tldHMgPQorCQkgICAgcEFkLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OworCQlwQWQtPnN0YXRzLnR4X3BhY2tldHMgPQorCQkgICAgcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OwogCiAJCXBBZC0+c3RhdHMucnhfYnl0ZXMgPSBwQWQtPlJhbGlua0NvdW50ZXJzLlJlY2VpdmVkQnl0ZUNvdW50OwogCQlwQWQtPnN0YXRzLnR4X2J5dGVzID0gcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudDsKQEAgLTEwMTEsMzAgKzY2NCw3MyBAQAogCQlwQWQtPnN0YXRzLnJ4X2Ryb3BwZWQgPSAwOwogCQlwQWQtPnN0YXRzLnR4X2Ryb3BwZWQgPSAwOwogCi0JICAgIHBBZC0+c3RhdHMubXVsdGljYXN0ID0gcEFkLT5XbGFuQ291bnRlcnMuTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50LlF1YWRQYXJ0OyAgIC8vIG11bHRpY2FzdCBwYWNrZXRzIHJlY2VpdmVkCi0JICAgIHBBZC0+c3RhdHMuY29sbGlzaW9ucyA9IHBBZC0+Q291bnRlcnM4MDIzLk9uZUNvbGxpc2lvbiArIHBBZC0+Q291bnRlcnM4MDIzLk1vcmVDb2xsaXNpb25zOyAgLy8gQ29sbGlzaW9uIHBhY2tldHMKKwkJcEFkLT5zdGF0cy5tdWx0aWNhc3QgPSBwQWQtPldsYW5Db3VudGVycy5NdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQuUXVhZFBhcnQ7CS8qIG11bHRpY2FzdCBwYWNrZXRzIHJlY2VpdmVkICovCisJCXBBZC0+c3RhdHMuY29sbGlzaW9ucyA9IHBBZC0+Q291bnRlcnM4MDIzLk9uZUNvbGxpc2lvbiArIHBBZC0+Q291bnRlcnM4MDIzLk1vcmVDb2xsaXNpb25zOwkvKiBDb2xsaXNpb24gcGFja2V0cyAqLwogCi0JICAgIHBBZC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycyA9IDA7Ci0JICAgIHBBZC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMgPSBwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyOyAgICAgICAgICAgICAgICAgICAvLyByZWNlaXZlciByaW5nIGJ1ZmYgb3ZlcmZsb3cKLQkgICAgcEFkLT5zdGF0cy5yeF9jcmNfZXJyb3JzID0gMDsvL3BBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQ7ICAgICAvLyByZWN2ZWQgcGt0IHdpdGggY3JjIGVycm9yCi0JICAgIHBBZC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzID0gcEFkLT5Db3VudGVyczgwMjMuUmN2QWxpZ25tZW50RXJyb3JzOyAgICAgICAgICAvLyByZWN2J2QgZnJhbWUgYWxpZ25tZW50IGVycm9yCi0JICAgIHBBZC0+c3RhdHMucnhfZmlmb19lcnJvcnMgPSBwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyOyAgICAgICAgICAgICAgICAgICAvLyByZWN2J3IgZmlmbyBvdmVycnVuCi0JICAgIHBBZC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNlaXZlciBtaXNzZWQgcGFja2V0CisJCXBBZC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycyA9IDA7CisJCXBBZC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMgPSBwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyOwkvKiByZWNlaXZlciByaW5nIGJ1ZmYgb3ZlcmZsb3cgKi8KKwkJcEFkLT5zdGF0cy5yeF9jcmNfZXJyb3JzID0gMDsJLypwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50OyAgICAgLy8gcmVjdmVkIHBrdCB3aXRoIGNyYyBlcnJvciAqLworCQlwQWQtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyA9IHBBZC0+Q291bnRlcnM4MDIzLlJjdkFsaWdubWVudEVycm9yczsJLyogcmVjdidkIGZyYW1lIGFsaWdubWVudCBlcnJvciAqLworCQlwQWQtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzID0gcEFkLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlcjsJLyogcmVjdidyIGZpZm8gb3ZlcnJ1biAqLworCQlwQWQtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPSAwOwkvKiByZWNlaXZlciBtaXNzZWQgcGFja2V0ICovCiAKLQkgICAgLy8gZGV0YWlsZWQgdHhfZXJyb3JzCi0JICAgIHBBZC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMgPSAwOwotCSAgICBwQWQtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzID0gMDsKLQkgICAgcEFkLT5zdGF0cy50eF9maWZvX2Vycm9ycyA9IDA7Ci0JICAgIHBBZC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycyA9IDA7Ci0JICAgIHBBZC0+c3RhdHMudHhfd2luZG93X2Vycm9ycyA9IDA7CisJCS8qIGRldGFpbGVkIHR4X2Vycm9ycyAqLworCQlwQWQtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzID0gMDsKKwkJcEFkLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyA9IDA7CisJCXBBZC0+c3RhdHMudHhfZmlmb19lcnJvcnMgPSAwOworCQlwQWQtPnN0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMgPSAwOworCQlwQWQtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMgPSAwOwogCi0JICAgIC8vIGZvciBjc2xpcCBldGMKLQkgICAgcEFkLT5zdGF0cy5yeF9jb21wcmVzc2VkID0gMDsKLQkgICAgcEFkLT5zdGF0cy50eF9jb21wcmVzc2VkID0gMDsKKwkJLyogZm9yIGNzbGlwIGV0YyAqLworCQlwQWQtPnN0YXRzLnJ4X2NvbXByZXNzZWQgPSAwOworCQlwQWQtPnN0YXRzLnR4X2NvbXByZXNzZWQgPSAwOwogCiAJCXJldHVybiAmcEFkLT5zdGF0czsKLQl9Ci0JZWxzZQotICAgIAlyZXR1cm4gTlVMTDsKKwl9IGVsc2UKKwkJcmV0dXJuIE5VTEw7CiB9CiAKK0JPT0xFQU4gUnRtcFBoeU5ldERldkV4aXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKworCS8qIFVucmVnaXN0ZXIgbmV0d29yayBkZXZpY2UgKi8KKwlpZiAobmV0X2RldiAhPSBOVUxMKSB7CisJCXByaW50aworCQkgICAgKCJSdG1wT1NOZXREZXZEZXRhY2goKTogUnRtcE9TTmV0RGV2aWNlRGV0YWNoKCksIGRldi0+bmFtZT0lcyFcbiIsCisJCSAgICAgbmV0X2Rldi0+bmFtZSk7CisJCVJ0bXBPU05ldERldkRldGFjaChuZXRfZGV2KTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKKworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWRhcHRlciBjb250cm9sIGJsb2NrLgorCitBcmd1bWVudHM6CisgICAgcEFkCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKK1JldHVybiBWYWx1ZToKKwlORElTX1NUQVRVU19TVUNDRVNTCisJTkRJU19TVEFUVVNfRkFJTFVSRQorCU5ESVNfU1RBVFVTX1JFU09VUkNFUworCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IEFkYXB0ZXJCbG9ja0FsbG9jYXRlTWVtb3J5KHZvaWQgKmhhbmRsZSwgdm9pZCAqKiBwcEFkKQoreworCisJKnBwQWQgPSAodm9pZCAqKXZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIpKTsJLypwY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBzaXplb2Yoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciksIHBoeV9hZGRyKTsgKi8KKworCWlmICgqcHBBZCkgeworCQlOZGlzWmVyb01lbW9yeSgqcHBBZCwgc2l6ZW9mKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIpKTsKKwkJKChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopKiBwcEFkKS0+T1NfQ29va2llID0gaGFuZGxlOworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCX0gZWxzZSB7CisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9wY2lfcmJ1cy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9wY2lfcmJ1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYTBhZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X3BjaV9yYnVzLmMKQEAgLTAsMCArMSw4NDAgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgcnRfcGNpX3JidXMuYworCisgICAgQWJzdHJhY3Q6CisgICAgQ3JlYXRlIGFuZCByZWdpc3RlciBuZXR3b3JrIGludGVyZmFjZS4KKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2luY2x1ZGUgInJ0X2NvbmZpZy5oIgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCitJUlFfSEFORExFX1RZUEUgcnQyODYwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpOworCitzdGF0aWMgdm9pZCByeF9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIG1nbXRfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgYWMwX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGFjMV9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBhYzJfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgYWMzX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGZpZm9fc3RhdGlzdGljX2Z1bGxfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBTeW1ib2wgJiBNYWNybyBEZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFJUMjg2MF9JTlRfUlhfRExZCQkJCSgxPDwwKQkvKiBiaXQgMCAqLworI2RlZmluZSBSVDI4NjBfSU5UX1RYX0RMWQkJCQkoMTw8MSkJLyogYml0IDEgKi8KKyNkZWZpbmUgUlQyODYwX0lOVF9SWF9ET05FCQkJCSgxPDwyKQkvKiBiaXQgMiAqLworI2RlZmluZSBSVDI4NjBfSU5UX0FDMF9ETUFfRE9ORQkJCSgxPDwzKQkvKiBiaXQgMyAqLworI2RlZmluZSBSVDI4NjBfSU5UX0FDMV9ETUFfRE9ORQkJCSgxPDw0KQkvKiBiaXQgNCAqLworI2RlZmluZSBSVDI4NjBfSU5UX0FDMl9ETUFfRE9ORQkJCSgxPDw1KQkvKiBiaXQgNSAqLworI2RlZmluZSBSVDI4NjBfSU5UX0FDM19ETUFfRE9ORQkJCSgxPDw2KQkvKiBiaXQgNiAqLworI2RlZmluZSBSVDI4NjBfSU5UX0hDQ0FfRE1BX0RPTkUJCSgxPDw3KQkvKiBiaXQgNyAqLworI2RlZmluZSBSVDI4NjBfSU5UX01HTVRfRE9ORQkJCSgxPDw4KQkvKiBiaXQgOCAqLworCisjZGVmaW5lIElOVF9SWAkJCVJUMjg2MF9JTlRfUlhfRE9ORQorCisjZGVmaW5lIElOVF9BQzBfRExZCQkoUlQyODYwX0lOVF9BQzBfRE1BX0RPTkUpCS8qfCBSVDI4NjBfSU5UX1RYX0RMWSkgKi8KKyNkZWZpbmUgSU5UX0FDMV9ETFkJCShSVDI4NjBfSU5UX0FDMV9ETUFfRE9ORSkJLyp8IFJUMjg2MF9JTlRfVFhfRExZKSAqLworI2RlZmluZSBJTlRfQUMyX0RMWQkJKFJUMjg2MF9JTlRfQUMyX0RNQV9ET05FKQkvKnwgUlQyODYwX0lOVF9UWF9ETFkpICovCisjZGVmaW5lIElOVF9BQzNfRExZCQkoUlQyODYwX0lOVF9BQzNfRE1BX0RPTkUpCS8qfCBSVDI4NjBfSU5UX1RYX0RMWSkgKi8KKyNkZWZpbmUgSU5UX0hDQ0FfRExZCShSVDI4NjBfSU5UX0hDQ0FfRE1BX0RPTkUpCS8qfCBSVDI4NjBfSU5UX1RYX0RMWSkgKi8KKyNkZWZpbmUgSU5UX01HTVRfRExZCVJUMjg2MF9JTlRfTUdNVF9ET05FCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqCUludGVyZmFjZS1kZXBlbmRlZCBtZW1vcnkgYWxsb2NhdGlvbi9GcmVlIHJlbGF0ZWQgcHJvY2VkdXJlcy4KKyAgKgkJTWFpbmx5IGZvciBIYXJkd2FyZSBUeERlc2MvUnhEZXNjL01nbXREZXNjLCBETUEgTWVtb3J5IGZvciBUeERhdGEvUnhEYXRhLCBldGMuLAorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb24gZm9yIFR4RGVzYyBNZW1vcnkgYWxsb2NhdGlvbi4gKi8KK3ZvaWQgUlRNUF9BbGxvY2F0ZVR4RGVzY01lbW9yeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgdTMyIEluZGV4LAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgTGVuZ3RoLAorCQkJICAgICAgIElOIEJPT0xFQU4gQ2FjaGVkLAorCQkJICAgICAgIHZvaWQgKiogVmlydHVhbEFkZHJlc3MsCisJCQkgICAgICAgZG1hX2FkZHJfdCAqUGh5c2ljYWxBZGRyZXNzKQoreworCXN0cnVjdCBvc19jb29raWUgKnBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJKlZpcnR1YWxBZGRyZXNzID0KKwkgICAgKHZvaWQgKilwY2lfYWxsb2NfY29uc2lzdGVudChwT2JqLT5wY2lfZGV2LCBzaXplb2YoY2hhcikgKiBMZW5ndGgsCisJCQkJCSBQaHlzaWNhbEFkZHJlc3MpOworCit9CisKKy8qIEZ1bmN0aW9uIGZvciBNZ210RGVzYyBNZW1vcnkgYWxsb2NhdGlvbi4gKi8KK3ZvaWQgUlRNUF9BbGxvY2F0ZU1nbXREZXNjTWVtb3J5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgdW5zaWduZWQgbG9uZyBMZW5ndGgsCisJCQkJIElOIEJPT0xFQU4gQ2FjaGVkLAorCQkJCSB2b2lkICoqIFZpcnR1YWxBZGRyZXNzLAorCQkJCSBkbWFfYWRkcl90ICpQaHlzaWNhbEFkZHJlc3MpCit7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisKKwkqVmlydHVhbEFkZHJlc3MgPQorCSAgICAodm9pZCAqKXBjaV9hbGxvY19jb25zaXN0ZW50KHBPYmotPnBjaV9kZXYsIHNpemVvZihjaGFyKSAqIExlbmd0aCwKKwkJCQkJIFBoeXNpY2FsQWRkcmVzcyk7CisKK30KKworLyogRnVuY3Rpb24gZm9yIFJ4RGVzYyBNZW1vcnkgYWxsb2NhdGlvbi4gKi8KK3ZvaWQgUlRNUF9BbGxvY2F0ZVJ4RGVzY01lbW9yeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBMZW5ndGgsCisJCQkgICAgICAgSU4gQk9PTEVBTiBDYWNoZWQsCisJCQkgICAgICAgdm9pZCAqKiBWaXJ0dWFsQWRkcmVzcywKKwkJCSAgICAgICBkbWFfYWRkcl90ICpQaHlzaWNhbEFkZHJlc3MpCit7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisKKwkqVmlydHVhbEFkZHJlc3MgPQorCSAgICAodm9pZCAqKXBjaV9hbGxvY19jb25zaXN0ZW50KHBPYmotPnBjaV9kZXYsIHNpemVvZihjaGFyKSAqIExlbmd0aCwKKwkJCQkJIFBoeXNpY2FsQWRkcmVzcyk7CisKK30KKworLyogRnVuY3Rpb24gZm9yIGZyZWUgYWxsb2NhdGVkIERlc2MgTWVtb3J5LiAqLwordm9pZCBSVE1QX0ZyZWVEZXNjTWVtb3J5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSB1bnNpZ25lZCBsb25nIExlbmd0aCwKKwkJCSB2b2lkICpWaXJ0dWFsQWRkcmVzcywKKwkJCSBkbWFfYWRkcl90IFBoeXNpY2FsQWRkcmVzcykKK3sKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocE9iai0+cGNpX2RldiwgTGVuZ3RoLCBWaXJ0dWFsQWRkcmVzcywKKwkJCSAgICBQaHlzaWNhbEFkZHJlc3MpOworfQorCisvKiBGdW5jdGlvbiBmb3IgVHhEYXRhIERNQSBNZW1vcnkgYWxsb2NhdGlvbi4gKi8KK3ZvaWQgUlRNUF9BbGxvY2F0ZUZpcnN0VHhCdWZmZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCXUzMiBJbmRleCwKKwkJCQl1bnNpZ25lZCBsb25nIExlbmd0aCwKKwkJCQlJTiBCT09MRUFOIENhY2hlZCwKKwkJCQl2b2lkICoqIFZpcnR1YWxBZGRyZXNzLAorCQkJCWRtYV9hZGRyX3QgKlBoeXNpY2FsQWRkcmVzcykKK3sKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCSpWaXJ0dWFsQWRkcmVzcyA9CisJICAgICh2b2lkICopcGNpX2FsbG9jX2NvbnNpc3RlbnQocE9iai0+cGNpX2Rldiwgc2l6ZW9mKGNoYXIpICogTGVuZ3RoLAorCQkJCQkgUGh5c2ljYWxBZGRyZXNzKTsKK30KKwordm9pZCBSVE1QX0ZyZWVGaXJzdFR4QnVmZmVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIExlbmd0aCwKKwkJCSAgICBJTiBCT09MRUFOIENhY2hlZCwKKwkJCSAgICB2b2lkICpWaXJ0dWFsQWRkcmVzcywKKwkJCSAgICBkbWFfYWRkcl90IFBoeXNpY2FsQWRkcmVzcykKK3sKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocE9iai0+cGNpX2RldiwgTGVuZ3RoLCBWaXJ0dWFsQWRkcmVzcywKKwkJCSAgICBQaHlzaWNhbEFkZHJlc3MpOworfQorCisvKgorICogRlVOQ1RJT046IEFsbG9jYXRlIGEgY29tbW9uIGJ1ZmZlciBmb3IgRE1BCisgKiBBUkdVTUVOVFM6CisgKiAgICAgQWRhcHRlckhhbmRsZTogIEFkYXB0ZXJIYW5kbGUKKyAqICAgICBMZW5ndGg6ICBOdW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUKKyAqICAgICBDYWNoZWQ6ICBXaGV0aGVyIG9yIG5vdCB0aGUgbWVtb3J5IGNhbiBiZSBjYWNoZWQKKyAqICAgICBWaXJ0dWFsQWRkcmVzczogIFBvaW50ZXIgdG8gbWVtb3J5IGlzIHJldHVybmVkIGhlcmUKKyAqICAgICBQaHlzaWNhbEFkZHJlc3M6ICBQaHlzaWNhbCBhZGRyZXNzIGNvcnJlc3BvbmRpbmcgdG8gdmlydHVhbCBhZGRyZXNzCisgKi8KK3ZvaWQgUlRNUF9BbGxvY2F0ZVNoYXJlZE1lbW9yeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBMZW5ndGgsCisJCQkgICAgICAgSU4gQk9PTEVBTiBDYWNoZWQsCisJCQkgICAgICAgdm9pZCAqKiBWaXJ0dWFsQWRkcmVzcywKKwkJCSAgICAgICBkbWFfYWRkcl90ICpQaHlzaWNhbEFkZHJlc3MpCit7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisKKwkqVmlydHVhbEFkZHJlc3MgPQorCSAgICAodm9pZCAqKXBjaV9hbGxvY19jb25zaXN0ZW50KHBPYmotPnBjaV9kZXYsIHNpemVvZihjaGFyKSAqIExlbmd0aCwKKwkJCQkJIFBoeXNpY2FsQWRkcmVzcyk7Cit9CisKKy8qCisgKiBGVU5DVElPTjogQWxsb2NhdGUgYSBwYWNrZXQgYnVmZmVyIGZvciBETUEKKyAqIEFSR1VNRU5UUzoKKyAqICAgICBBZGFwdGVySGFuZGxlOiAgQWRhcHRlckhhbmRsZQorICogICAgIExlbmd0aDogIE51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZQorICogICAgIENhY2hlZDogIFdoZXRoZXIgb3Igbm90IHRoZSBtZW1vcnkgY2FuIGJlIGNhY2hlZAorICogICAgIFZpcnR1YWxBZGRyZXNzOiAgUG9pbnRlciB0byBtZW1vcnkgaXMgcmV0dXJuZWQgaGVyZQorICogICAgIFBoeXNpY2FsQWRkcmVzczogIFBoeXNpY2FsIGFkZHJlc3MgY29ycmVzcG9uZGluZyB0byB2aXJ0dWFsIGFkZHJlc3MKKyAqIE5vdGVzOgorICogICAgIENhY2hlZCBpcyBpZ25vcmVkOiBhbHdheXMgY2FjaGVkIG1lbW9yeQorICovCit2b2lkICpSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkgdW5zaWduZWQgbG9uZyBMZW5ndGgsCisJCQkJCSBJTiBCT09MRUFOIENhY2hlZCwKKwkJCQkJIHZvaWQgKiogVmlydHVhbEFkZHJlc3MsCisJCQkJCSBPVVQgZG1hX2FkZHJfdCAqCisJCQkJCSBQaHlzaWNhbEFkZHJlc3MpCit7CisJc3RydWN0IHNrX2J1ZmYgKnBrdDsKKworCXBrdCA9IGRldl9hbGxvY19za2IoTGVuZ3RoKTsKKworCWlmIChwa3QgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoImNhbid0IGFsbG9jYXRlIHJ4ICVsZCBzaXplIHBhY2tldFxuIiwgTGVuZ3RoKSk7CisJfQorCisJaWYgKHBrdCkgeworCQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKE9TUEtUX1RPX1JUUEtUKHBrdCksIFBLVFNSQ19ORElTKTsKKwkJKlZpcnR1YWxBZGRyZXNzID0gKHZvaWQgKilwa3QtPmRhdGE7CisJCSpQaHlzaWNhbEFkZHJlc3MgPQorCQkgICAgUENJX01BUF9TSU5HTEUocEFkLCAqVmlydHVhbEFkZHJlc3MsIExlbmd0aCwgLTEsCisJCQkJICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwl9IGVsc2UgeworCQkqVmlydHVhbEFkZHJlc3MgPSAodm9pZCAqKU5VTEw7CisJCSpQaHlzaWNhbEFkZHJlc3MgPSAoZG1hX2FkZHJfdClOVUxMOworCX0KKworCXJldHVybiAodm9pZCAqKXBrdDsKK30KKwordm9pZCBJbnZhbGlkX1JlbWFpbmluZ19QYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1bnNpZ25lZCBsb25nIFZpcnR1YWxBZGRyZXNzKQoreworCWRtYV9hZGRyX3QgUGh5c2ljYWxBZGRyZXNzOworCisJUGh5c2ljYWxBZGRyZXNzID0KKwkgICAgUENJX01BUF9TSU5HTEUocEFkLCAodm9pZCAqKShWaXJ0dWFsQWRkcmVzcyArIDE2MDApLAorCQkJICAgUlhfQlVGRkVSX05PUk1TSVpFIC0gMTYwMCwgLTEsIFBDSV9ETUFfRlJPTURFVklDRSk7Cit9CisKK2ludCBSdG1wTmV0VGFza0luaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCXRhc2tsZXRfaW5pdCgmcE9iai0+cnhfZG9uZV90YXNrLCByeF9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2ssIG1nbXRfZG1hX2RvbmVfdGFza2xldCwKKwkJICAgICAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMwX2RtYV9kb25lX3Rhc2ssIGFjMF9kbWFfZG9uZV90YXNrbGV0LAorCQkgICAgICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5hYzFfZG1hX2RvbmVfdGFzaywgYWMxX2RtYV9kb25lX3Rhc2tsZXQsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrLCBhYzJfZG1hX2RvbmVfdGFza2xldCwKKwkJICAgICAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2ssIGFjM19kbWFfZG9uZV90YXNrbGV0LAorCQkgICAgICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT50YnR0X3Rhc2ssIHRidHRfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmZpZm9fc3RhdGlzdGljX2Z1bGxfdGFzaywKKwkJICAgICBmaWZvX3N0YXRpc3RpY19mdWxsX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKwordm9pZCBSdG1wTmV0VGFza0V4aXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCXRhc2tsZXRfa2lsbCgmcE9iai0+cnhfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPm1nbXRfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5hYzFfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5hYzJfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5hYzNfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT50YnR0X3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+Zmlmb19zdGF0aXN0aWNfZnVsbF90YXNrKTsKK30KKworaW50IFJ0bXBNZ210VGFza0luaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgQ2xvc2Uga2VybmVsIHRocmVhZHMuCisKK0FyZ3VtZW50czoKKwkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIE5PTkUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUnRtcE1nbXRUYXNrRXhpdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydDI4NjBfaW50X2VuYWJsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHVuc2lnbmVkIGludCBtb2RlKQoreworCXUzMiByZWdWYWx1ZTsKKworCXBBZC0+aW50X2Rpc2FibGVfbWFzayAmPSB+KG1vZGUpOworCXJlZ1ZhbHVlID0gcEFkLT5pbnRfZW5hYmxlX3JlZyAmIH4ocEFkLT5pbnRfZGlzYWJsZV9tYXNrKTsKKwkvKmlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkgKi8KKwl7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9NQVNLX0NTUiwgcmVnVmFsdWUpOwkvKiAxOmVuYWJsZSAqLworCX0KKwkvKmVsc2UgKi8KKwkvKiAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImZPUF9TVEFUVVNfRE9aRSAhXG4iKSk7ICovCisKKwlpZiAocmVnVmFsdWUgIT0gMCkKKwkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydDI4NjBfaW50X2Rpc2FibGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwl1MzIgcmVnVmFsdWU7CisKKwlwQWQtPmludF9kaXNhYmxlX21hc2sgfD0gbW9kZTsKKwlyZWdWYWx1ZSA9IHBBZC0+aW50X2VuYWJsZV9yZWcgJiB+KHBBZC0+aW50X2Rpc2FibGVfbWFzayk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX01BU0tfQ1NSLCByZWdWYWx1ZSk7CS8qIDA6IGRpc2FibGUgKi8KKworCWlmIChyZWdWYWx1ZSA9PSAwKSB7CisJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKgl0YXNrbGV0IHJlbGF0ZWQgcHJvY2VkdXJlcy4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIG1nbXRfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKWRhdGE7CisJSU5UX1NPVVJDRV9DU1JfU1RSVUMgSW50U291cmNlOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisKKwkvKiBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4gKi8KKwkvKiBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQgKi8KKwlpZiAoUlRNUF9URVNUX0ZMQUcKKwkgICAgKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuOworCisJcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisKKy8qICAgICAgcHJpbnRrKCJtZ210X2RtYV9kb25lX3Byb2Nlc3NcbiIpOyAqLworCUludFNvdXJjZS53b3JkID0gMDsKKwlJbnRTb3VyY2UuZmllbGQuTWdtdERtYURvbmUgPSAxOworCXBBZC0+aW50X3BlbmRpbmcgJj0gfklOVF9NR01UX0RMWTsKKworCVJUTVBIYW5kbGVNZ210UmluZ0RtYURvbmVJbnRlcnJ1cHQocEFkKTsKKworCS8qIGlmIHlvdSB1c2UgUlRNUF9TRU1fTE9DSywgc29tZXRpbWVzIGtlcm5lbCB3aWxsIGhhbmcgdXAsIG5vIGFueSAqLworCS8qIGJ1ZyByZXBvcnQgb3V0cHV0ICovCisJUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCS8qCisJICogZG91YmxlIGNoZWNrIHRvIGF2b2lkIGxvc2Ugb2YgaW50ZXJydXB0cworCSAqLworCWlmIChwQWQtPmludF9wZW5kaW5nICYgSU5UX01HTVRfRExZKSB7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPm1nbXRfZG1hX2RvbmVfdGFzayk7CisJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogZW5hYmxlIFR4RGF0YUludCBhZ2FpbiAqLworCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgSU5UX01HTVRfRExZKTsKKwlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcnhfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopZGF0YTsKKwlCT09MRUFOIGJSZXNjaGVkdWxlID0gMDsKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqOworCisJLyogRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuICovCisJLyogVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0ICovCisJaWYgKFJUTVBfVEVTVF9GTEFHCisJICAgIChwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworCXBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJcEFkLT5pbnRfcGVuZGluZyAmPSB+KElOVF9SWCk7CisJYlJlc2NoZWR1bGUgPSBTVEFSeERvbmVJbnRlcnJ1cHRIYW5kbGUocEFkLCAwKTsKKworCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKwkvKgorCSAqIGRvdWJsZSBjaGVjayB0byBhdm9pZCByb3R0aW5nIHBhY2tldAorCSAqLworCWlmIChwQWQtPmludF9wZW5kaW5nICYgSU5UX1JYIHx8IGJSZXNjaGVkdWxlKSB7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPnJ4X2RvbmVfdGFzayk7CisJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogZW5hYmxlIFJ4aW50IGFnYWluICovCisJcnQyODYwX2ludF9lbmFibGUocEFkLCBJTlRfUlgpOworCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCit9CisKK3ZvaWQgZmlmb19zdGF0aXN0aWNfZnVsbF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopZGF0YTsKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqOworCisJLyogRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuICovCisJLyogVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0ICovCisJaWYgKFJUTVBfVEVTVF9GTEFHCisJICAgIChwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworCXBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJcEFkLT5pbnRfcGVuZGluZyAmPSB+KEZpZm9TdGFGdWxsSW50KTsKKwlOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMocEFkKTsKKworCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKwkvKgorCSAqIGRvdWJsZSBjaGVjayB0byBhdm9pZCByb3R0aW5nIHBhY2tldAorCSAqLworCWlmIChwQWQtPmludF9wZW5kaW5nICYgRmlmb1N0YUZ1bGxJbnQpIHsKKwkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+Zmlmb19zdGF0aXN0aWNfZnVsbF90YXNrKTsKKwkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBlbmFibGUgUnhpbnQgYWdhaW4gKi8KKworCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgRmlmb1N0YUZ1bGxJbnQpOworCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCit9CisKK3N0YXRpYyB2b2lkIGFjM19kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopZGF0YTsKKwlJTlRfU09VUkNFX0NTUl9TVFJVQyBJbnRTb3VyY2U7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iajsKKwlCT09MRUFOIGJSZXNjaGVkdWxlID0gMDsKKworCS8qIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLiAqLworCS8qIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdCAqLworCWlmIChSVE1QX1RFU1RfRkxBRworCSAgICAocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworLyogICAgICBwcmludGsoImFjMF9kbWFfZG9uZV9wcm9jZXNzXG4iKTsgKi8KKwlJbnRTb3VyY2Uud29yZCA9IDA7CisJSW50U291cmNlLmZpZWxkLkFjM0RtYURvbmUgPSAxOworCXBBZC0+aW50X3BlbmRpbmcgJj0gfklOVF9BQzNfRExZOworCisJYlJlc2NoZWR1bGUgPSBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7CisKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCisJICovCisJaWYgKChwQWQtPmludF9wZW5kaW5nICYgSU5UX0FDM19ETFkpIHx8IGJSZXNjaGVkdWxlKSB7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrKTsKKwkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBlbmFibGUgVHhEYXRhSW50IGFnYWluICovCisJcnQyODYwX2ludF9lbmFibGUocEFkLCBJTlRfQUMzX0RMWSk7CisJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFjMl9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopZGF0YTsKKwlJTlRfU09VUkNFX0NTUl9TVFJVQyBJbnRTb3VyY2U7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iajsKKwlCT09MRUFOIGJSZXNjaGVkdWxlID0gMDsKKworCS8qIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLiAqLworCS8qIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdCAqLworCWlmIChSVE1QX1RFU1RfRkxBRworCSAgICAocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCUludFNvdXJjZS53b3JkID0gMDsKKwlJbnRTb3VyY2UuZmllbGQuQWMyRG1hRG9uZSA9IDE7CisJcEFkLT5pbnRfcGVuZGluZyAmPSB+SU5UX0FDMl9ETFk7CisKKwliUmVzY2hlZHVsZSA9IFJUTVBIYW5kbGVUeFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCwgSW50U291cmNlKTsKKworCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogZG91YmxlIGNoZWNrIHRvIGF2b2lkIGxvc2Ugb2YgaW50ZXJydXB0cworCSAqLworCWlmICgocEFkLT5pbnRfcGVuZGluZyAmIElOVF9BQzJfRExZKSB8fCBiUmVzY2hlZHVsZSkgeworCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzJfZG1hX2RvbmVfdGFzayk7CisJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogZW5hYmxlIFR4RGF0YUludCBhZ2FpbiAqLworCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgSU5UX0FDMl9ETFkpOworCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhYzFfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKWRhdGE7CisJSU5UX1NPVVJDRV9DU1JfU1RSVUMgSW50U291cmNlOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisJQk9PTEVBTiBiUmVzY2hlZHVsZSA9IDA7CisKKwkvKiBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4gKi8KKwkvKiBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQgKi8KKwlpZiAoUlRNUF9URVNUX0ZMQUcKKwkgICAgKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuOworCisJcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisKKy8qICAgICAgcHJpbnRrKCJhYzBfZG1hX2RvbmVfcHJvY2Vzc1xuIik7ICovCisJSW50U291cmNlLndvcmQgPSAwOworCUludFNvdXJjZS5maWVsZC5BYzFEbWFEb25lID0gMTsKKwlwQWQtPmludF9wZW5kaW5nICY9IH5JTlRfQUMxX0RMWTsKKworCWJSZXNjaGVkdWxlID0gUlRNUEhhbmRsZVR4UmluZ0RtYURvbmVJbnRlcnJ1cHQocEFkLCBJbnRTb3VyY2UpOworCisJUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCS8qCisJICogZG91YmxlIGNoZWNrIHRvIGF2b2lkIGxvc2Ugb2YgaW50ZXJydXB0cworCSAqLworCWlmICgocEFkLT5pbnRfcGVuZGluZyAmIElOVF9BQzFfRExZKSB8fCBiUmVzY2hlZHVsZSkgeworCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzFfZG1hX2RvbmVfdGFzayk7CisJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogZW5hYmxlIFR4RGF0YUludCBhZ2FpbiAqLworCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgSU5UX0FDMV9ETFkpOworCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhYzBfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKWRhdGE7CisJSU5UX1NPVVJDRV9DU1JfU1RSVUMgSW50U291cmNlOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisJQk9PTEVBTiBiUmVzY2hlZHVsZSA9IDA7CisKKwkvKiBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4gKi8KKwkvKiBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQgKi8KKwlpZiAoUlRNUF9URVNUX0ZMQUcKKwkgICAgKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuOworCisJcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisKKy8qICAgICAgcHJpbnRrKCJhYzBfZG1hX2RvbmVfcHJvY2Vzc1xuIik7ICovCisJSW50U291cmNlLndvcmQgPSAwOworCUludFNvdXJjZS5maWVsZC5BYzBEbWFEb25lID0gMTsKKwlwQWQtPmludF9wZW5kaW5nICY9IH5JTlRfQUMwX0RMWTsKKworLyogICAgICBSVE1QSGFuZGxlTWdtdFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCk7ICovCisJYlJlc2NoZWR1bGUgPSBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7CisKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCisJICovCisJaWYgKChwQWQtPmludF9wZW5kaW5nICYgSU5UX0FDMF9ETFkpIHx8IGJSZXNjaGVkdWxlKSB7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrKTsKKwkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBlbmFibGUgVHhEYXRhSW50IGFnYWluICovCisJcnQyODYwX2ludF9lbmFibGUocEFkLCBJTlRfQUMwX0RMWSk7CisJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqCWludGVycnVwdCBoYW5kbGVyIHJlbGF0ZWQgcHJvY2VkdXJlcy4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBwcmludF9pbnRfY291bnQ7CisKK0lSUV9IQU5ETEVfVFlQRSBydDI4NjBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSBOVUxMOworCUlOVF9TT1VSQ0VfQ1NSX1NUUlVDIEludFNvdXJjZTsKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqOworCisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkLCBuZXRfZGV2KTsKKworCXBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJLyogTm90ZSAwMzMxMjAwODogd2UgY2FuIG5vdCByZXR1cm4gaGVyZSBiZWZvcmUKKwkgICBSVE1QX0lPX1JFQUQzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCAmSW50U291cmNlLndvcmQpOworCSAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCBJbnRTb3VyY2Uud29yZCk7CisJICAgT3Iga2VybmVsIHdpbGwgcGFuaWMgYWZ0ZXIgaWZjb25maWcgcmEwIGRvd24gc29tZXRpbWVzICovCisKKwkvKiAqLworCS8qIEluaXRhbCB0aGUgSW50ZXJydXB0IHNvdXJjZS4gKi8KKwkvKiAqLworCUludFNvdXJjZS53b3JkID0gMHgwMDAwMDAwMEw7CisvKiAgICAgIE1jdUludFNvdXJjZS53b3JkID0gMHgwMDAwMDAwMEw7ICovCisKKwkvKiAqLworCS8qIEdldCB0aGUgaW50ZXJydXB0IHNvdXJjZXMgJiBzYXZlZCB0byBsb2NhbCB2YXJpYWJsZSAqLworCS8qICovCisJLypSVE1QX0lPX1JFQUQzMihwQWQsIHdoZXJlLCAmTWN1SW50U291cmNlLndvcmQpOyAqLworCS8qUlRNUF9JT19XUklURTMyKHBBZCwgLCBNY3VJbnRTb3VyY2Uud29yZCk7ICovCisKKwkvKiAqLworCS8qIEZsYWcgZk9QX1NUQVRVU19ET1pFIE9uLCBtZWFucyBBU0lDIHB1dCB0byBzbGVlcCwgZWxhc2UgbWVhbnMgQVNJQ0sgV2FrZVVwICovCisJLyogQW5kIGF0IHRoZSBzYW1lIHRpbWUsIGNsb2NrIG1heWJlIHR1cm5lZCBvZmYgdGhhdCBzYXkgdGhlcmUgaXMgbm8gRE1BIHNlcnZpY2UuICovCisJLyogd2hlbiBBU0lDIGdldCB0byBzbGVlcC4gKi8KKwkvKiBUbyBwcmV2ZW50IHN5c3RlbSBoYW5nIG9uIHBvd2VyIHNhdmluZy4gKi8KKwkvKiBXZSBuZWVkIHRvIGNoZWNrIGl0IGJlZm9yZSBoYW5kbGUgdGhlIElOVF9TT1VSQ0VfQ1NSLCBBU0lDIG11c3QgYmUgd2FrZSB1cC4gKi8KKwkvKiAqLworCS8qIFJUMjY2MSA9PiB3aGVuIEFTSUMgaXMgc2xlZXBpbmcsIE1BQyByZWdpc3RlciBjYW5ub3QgYmUgcmVhZCBhbmQgd3JpdHRlbi4gKi8KKwkvKiBSVDI4NjAgPT4gd2hlbiBBU0lDIGlzIHNsZWVwaW5nLCBNQUMgcmVnaXN0ZXIgY2FuIGJlIHJlYWQgYW5kIHdyaXR0ZW4uICovCisvKiAgICAgIGlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkgKi8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgSU5UX1NPVVJDRV9DU1IsICZJbnRTb3VyY2Uud29yZCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCBJbnRTb3VyY2Uud29yZCk7CS8qIHdyaXRlIDEgdG8gY2xlYXIgKi8KKwl9CisvKiAgICAgIGVsc2UgKi8KKy8qICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI+Pj5mT1BfU1RBVFVTX0RPWkU8PDxcbiIpKTsgKi8KKworLyogICAgICBSVE1QX0lPX1JFQUQzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCAmSXNyQWZ0ZXJDbGVhcik7ICovCisvKiAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgTUNVX0lOVF9TT1VSQ0VfQ1NSLCAmTWN1SXNyQWZ0ZXJDbGVhcik7ICovCisvKiAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0lORk8sICgiPT09PT4gUlRNUEhhbmRsZUludGVycnVwdChJU1I9JTA4eCxNY3UgSVNSPSUwOHgsIEFmdGVyIGNsZWFyIElTUj0lMDh4LCBNQ1UgSVNSPSUwOHgpXG4iLCAqLworLyogICAgICAgICAgICAgICAgICAgICAgSW50U291cmNlLndvcmQsIE1jdUludFNvdXJjZS53b3JkLCBJc3JBZnRlckNsZWFyLCBNY3VJc3JBZnRlckNsZWFyKSk7ICovCisKKwkvKiBEbyBub3RoaW5nIGlmIFJlc2V0IGluIHByb2dyZXNzICovCisJaWYgKFJUTVBfVEVTVF9GTEFHCisJICAgIChwQWQsCisJICAgICAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJICAgICAgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkpIHsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwkvKiAqLworCS8qIEhhbmRsZSBpbnRlcnJ1cHQsIHdhbGsgdGhyb3VnaCBhbGwgYml0cyAqLworCS8qIFNob3VsZCBzdGFydCBmcm9tIGhpZ2hlc3QgcHJpb3JpdHkgaW50ZXJydXB0ICovCisJLyogVGhlIHByaW9yaXR5IGNhbiBiZSBhZGp1c3QgYnkgYWx0ZXJpbmcgcHJvY2Vzc2luZyBpZiBzdGF0ZW1lbnQgKi8KKwkvKiAqLworCisjaWZkZWYgREJHCisKKyNlbmRpZgorCisJcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7CisKKwkvKiBJZiByZXF1aXJlZCBzcGlubG9jaywgZWFjaCBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGhhcyB0byBhY3F1aXJlICovCisJLyogYW5kIHJlbGVhc2UgaXRzZWxmLiAqLworCS8qICovCisKKwkvKiBEbyBub3RoaW5nIGlmIE5JQyBkb2Vzbid0IGV4aXN0ICovCisJaWYgKEludFNvdXJjZS53b3JkID09IDB4ZmZmZmZmZmYpIHsKKwkJUlRNUF9TRVRfRkxBRyhwQWQsCisJCQkgICAgICAoZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwKKwkJCSAgICAgICBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWlmIChJbnRTb3VyY2Uud29yZCAmIFR4Q29oZXJlbnQpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPj4+VHhDb2hlcmVudDw8PFxuIikpOworCQlSVE1QSGFuZGxlUnhDb2hlcmVudEludGVycnVwdChwQWQpOworCX0KKworCWlmIChJbnRTb3VyY2Uud29yZCAmIFJ4Q29oZXJlbnQpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPj4+UnhDb2hlcmVudDw8PFxuIikpOworCQlSVE1QSGFuZGxlUnhDb2hlcmVudEludGVycnVwdChwQWQpOworCX0KKworCWlmIChJbnRTb3VyY2Uud29yZCAmIEZpZm9TdGFGdWxsSW50KSB7CisJCWlmICgocEFkLT5pbnRfZGlzYWJsZV9tYXNrICYgRmlmb1N0YUZ1bGxJbnQpID09IDApIHsKKwkJCS8qIG1hc2sgRmlmb1N0YUZ1bGxJbnQgKi8KKwkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIEZpZm9TdGFGdWxsSW50KTsKKwkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmZpZm9fc3RhdGlzdGljX2Z1bGxfdGFzayk7CisJCX0KKwkJcEFkLT5pbnRfcGVuZGluZyB8PSBGaWZvU3RhRnVsbEludDsKKwl9CisKKwlpZiAoSW50U291cmNlLndvcmQgJiBJTlRfTUdNVF9ETFkpIHsKKwkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfTUdNVF9ETFkpID09IDApIHsKKwkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9NR01UX0RMWSk7CisJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2spOworCQl9CisJCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX01HTVRfRExZOworCX0KKworCWlmIChJbnRTb3VyY2Uud29yZCAmIElOVF9SWCkgeworCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIElOVF9SWCkgPT0gMCkgeworCisJCQkvKiBtYXNrIFJ4aW50ICovCisJCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfUlgpOworCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+cnhfZG9uZV90YXNrKTsKKwkJfQorCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9SWDsKKwl9CisKKwlpZiAoSW50U291cmNlLndvcmQgJiBJTlRfQUMzX0RMWSkgeworCisJCWlmICgocEFkLT5pbnRfZGlzYWJsZV9tYXNrICYgSU5UX0FDM19ETFkpID09IDApIHsKKwkJCS8qIG1hc2sgVHhEYXRhSW50ICovCisJCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfQUMzX0RMWSk7CisJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzNfZG1hX2RvbmVfdGFzayk7CisJCX0KKwkJcEFkLT5pbnRfcGVuZGluZyB8PSBJTlRfQUMzX0RMWTsKKwl9CisKKwlpZiAoSW50U291cmNlLndvcmQgJiBJTlRfQUMyX0RMWSkgeworCisJCWlmICgocEFkLT5pbnRfZGlzYWJsZV9tYXNrICYgSU5UX0FDMl9ETFkpID09IDApIHsKKwkJCS8qIG1hc2sgVHhEYXRhSW50ICovCisJCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfQUMyX0RMWSk7CisJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzJfZG1hX2RvbmVfdGFzayk7CisJCX0KKwkJcEFkLT5pbnRfcGVuZGluZyB8PSBJTlRfQUMyX0RMWTsKKwl9CisKKwlpZiAoSW50U291cmNlLndvcmQgJiBJTlRfQUMxX0RMWSkgeworCisJCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX0FDMV9ETFk7CisKKwkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfQUMxX0RMWSkgPT0gMCkgeworCQkJLyogbWFzayBUeERhdGFJbnQgKi8KKwkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9BQzFfRExZKTsKKwkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrKTsKKwkJfQorCisJfQorCisJaWYgKEludFNvdXJjZS53b3JkICYgSU5UX0FDMF9ETFkpIHsKKworLyoKKwkJaWYgKEludFNvdXJjZS53b3JkICYgMHgyKSB7CisJCQl1MzIgcmVnOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBERUxBWV9JTlRfQ0ZHLCAmcmVnKTsKKwkJCXByaW50aygiSW50U291cmNlLndvcmQgPSAlMDh4LCBERUxBWV9SRUcgPSAlMDh4XG4iLCBJbnRTb3VyY2Uud29yZCwgcmVnKTsKKwkJfQorKi8KKwkJcEFkLT5pbnRfcGVuZGluZyB8PSBJTlRfQUMwX0RMWTsKKworCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIElOVF9BQzBfRExZKSA9PSAwKSB7CisJCQkvKiBtYXNrIFR4RGF0YUludCAqLworCQkJcnQyODYwX2ludF9kaXNhYmxlKHBBZCwgSU5UX0FDMF9ETFkpOworCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMwX2RtYV9kb25lX3Rhc2spOworCQl9CisKKwl9CisKKwlpZiAoSW50U291cmNlLndvcmQgJiBQcmVUQlRUSW50KSB7CisJCVJUTVBIYW5kbGVQcmVUQlRUSW50ZXJydXB0KHBBZCk7CisJfQorCisJaWYgKEludFNvdXJjZS53b3JkICYgVEJUVEludCkgeworCQlSVE1QSGFuZGxlVEJUVEludGVycnVwdChwQWQpOworCX0KKworCXsKKwkJaWYgKEludFNvdXJjZS53b3JkICYgQXV0b1dha2V1cEludCkKKwkJCVJUTVBIYW5kbGVUd2FrZXVwSW50ZXJydXB0KHBBZCk7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogaW52YWlsZCBvciB3cml0ZWJhY2sgY2FjaGUKKyAqIGFuZCBjb252ZXJ0IHZpcnR1YWwgYWRkcmVzcyB0byBwaHlzaWNhbCBhZGRyZXNzCisgKi8KK2RtYV9hZGRyX3QgbGludXhfcGNpX21hcF9zaW5nbGUodm9pZCAqaGFuZGxlLCB2b2lkICpwdHIsIHNpemVfdCBzaXplLAorCQkJCWludCBzZF9pZHgsIGludCBkaXJlY3Rpb24pCit7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisKKwkvKgorCSAgIC0tLS0tLSBQb3J0aW5nIEluZm9ybWF0aW9uIC0tLS0tLQorCSAgID4gRm9yIFR4IEFsbG9jOgorCSAgIG1nbXQgcGFja2V0cyA9PiBzZF9pZHggPSAwCisJICAgU3dJZHg6IHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgKKwkgICBwVHhEIDogcEFkLT5NZ210UmluZy5DZWxsW1N3SWR4XS5BbGxvY1ZhOworCisJICAgZGF0YSBwYWNrZXRzID0+IHNkX2lkeCA9IDEKKwkgICBUeElkeCA6IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5UeENwdUlkeAorCSAgIFF1ZUlkeDogcFR4QmxrLT5RdWVJZHgKKwkgICBwVHhEICA6IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5DZWxsW1R4SWR4XS5BbGxvY1ZhOworCisJICAgPiBGb3IgUnggQWxsb2M6CisJICAgc2RfaWR4ID0gLTEKKwkgKi8KKworCXBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopaGFuZGxlOworCXBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJaWYgKHNkX2lkeCA9PSAxKSB7CisJCXN0cnVjdCBydF90eF9ibGsgKnBUeEJsazsKKwkJcFR4QmxrID0gKHN0cnVjdCBydF90eF9ibGsgKilwdHI7CisJCXJldHVybiBwY2lfbWFwX3NpbmdsZShwT2JqLT5wY2lfZGV2LCBwVHhCbGstPnBTcmNCdWZEYXRhLAorCQkJCSAgICAgIHBUeEJsay0+U3JjQnVmTGVuLCBkaXJlY3Rpb24pOworCX0gZWxzZSB7CisJCXJldHVybiBwY2lfbWFwX3NpbmdsZShwT2JqLT5wY2lfZGV2LCBwdHIsIHNpemUsIGRpcmVjdGlvbik7CisJfQorCit9CisKK3ZvaWQgbGludXhfcGNpX3VubWFwX3NpbmdsZSh2b2lkICpoYW5kbGUsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplLAorCQkJICAgIGludCBkaXJlY3Rpb24pCit7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisKKwlwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKWhhbmRsZTsKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCXBjaV91bm1hcF9zaW5nbGUocE9iai0+cGNpX2RldiwgZG1hX2FkZHIsIHNpemUsIGRpcmVjdGlvbik7CisKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfcHJvZmlsZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9wcm9maWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYzQxZjgzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfcHJvZmlsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg2MiArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSAicnRfY29uZmlnLmgiCi0KLXN0YXRpYyB2b2lkIEhUUGFyYW1ldGVyc0hvb2soCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JQ0hBUgkJICAqcFZhbHVlU3RyLAotCUlOCUNIQVIJCSAgKnBJbnB1dCk7Ci0KLSNkZWZpbmUgRVRIX01BQ19BRERSX1NUUl9MRU4gMTcgIC8vIGluIGZvcm1hdCBvZiB4eDp4eDp4eDp4eDp4eDp4eAotCi0vLyBXZSBhc3N1bWUgdGhlIHMxIGlzIGEgc3RpbmcsIHMyIGlzIGEgbWVtb3J5IHNwYWNlIHdpdGggNiBieXRlcy4gYW5kIGNvbnRlbnQgb2YgczEgd2lsbCBiZSBjaGFuZ2VkLgotQk9PTEVBTiBydHN0cm1hY3RvaGV4KGNoYXIgKnMxLCBjaGFyICpzMikKLXsKLQlpbnQgaSA9IDA7Ci0JY2hhciAqcHRva1MgPSBzMSwgKnB0b2tFID0gczE7Ci0KLQlpZiAoc3RybGVuKHMxKSAhPSBFVEhfTUFDX0FERFJfU1RSX0xFTikKLQkJcmV0dXJuIEZBTFNFOwotCi0Jd2hpbGUoKCpwdG9rUykgIT0gJ1wwJykKLQl7Ci0JCWlmKChwdG9rRSA9IHN0cmNocihwdG9rUywgJzonKSkgIT0gTlVMTCkKLQkJCSpwdG9rRSsrID0gJ1wwJzsKLQkJaWYgKChzdHJsZW4ocHRva1MpICE9IDIpIHx8ICghaXN4ZGlnaXQoKnB0b2tTKSkgfHwgKCFpc3hkaWdpdCgqKHB0b2tTKzEpKSkpCi0JCQlicmVhazsgLy8gZmFpbAotCQlBdG9IKHB0b2tTLCAmczJbaSsrXSwgMSk7Ci0JCXB0b2tTID0gcHRva0U7Ci0JCWlmIChpID09IDYpCi0JCQlicmVhazsgLy8gcGFyc2luZyBmaW5pc2hlZAotCX0KLQotCXJldHVybiAoIGkgPT0gNiA/IFRSVUUgOiBGQUxTRSk7Ci0KLX0KLQotCi0vLyB3ZSBhc3N1bWUgdGhlIHMxIGFuZCBzMiBib3RoIGFyZSBzdHJpbmdzLgotQk9PTEVBTiBydHN0cmNhc2VjbXAoY2hhciAqczEsIGNoYXIgKnMyKQotewotCWNoYXIgKnAxID0gczEsICpwMiA9IHMyOwotCi0JaWYgKHN0cmxlbihzMSkgIT0gc3RybGVuKHMyKSkKLQkJcmV0dXJuIEZBTFNFOwotCi0Jd2hpbGUoKnAxICE9ICdcMCcpCi0JewotCQlpZigoKnAxICE9ICpwMikgJiYgKCgqcDEgXiAqcDIpICE9IDB4MjApKQotCQkJcmV0dXJuIEZBTFNFOwotCQlwMSsrOwotCQlwMisrOwotCX0KLQotCXJldHVybiBUUlVFOwotfQotCi0vLyB3ZSBhc3N1bWUgdGhlIHMxIChidWZmZXIpIGFuZCBzMiAoa2V5KSBib3RoIGFyZSBzdHJpbmdzLgotY2hhciAqIHJ0c3Ryc3RydW5jYXNlY21wKGNoYXIgKiBzMSwgY2hhciAqIHMyKQotewotCUlOVCBsMSwgbDIsIGk7Ci0JY2hhciB0ZW1wMSwgdGVtcDI7Ci0KLQlsMiA9IHN0cmxlbihzMik7Ci0JaWYgKCFsMikKLQkJcmV0dXJuIChjaGFyICopIHMxOwotCi0JbDEgPSBzdHJsZW4oczEpOwotCi0Jd2hpbGUgKGwxID49IGwyKQotCXsKLQkJbDEtLTsKLQotCQlmb3IoaT0wOyBpPGwyOyBpKyspCi0JCXsKLQkJCXRlbXAxID0gKihzMStpKTsKLQkJCXRlbXAyID0gKihzMitpKTsKLQotCQkJaWYgKCgnYScgPD0gdGVtcDEpICYmICh0ZW1wMSA8PSAneicpKQotCQkJCXRlbXAxID0gJ0EnKyh0ZW1wMS0nYScpOwotCQkJaWYgKCgnYScgPD0gdGVtcDIpICYmICh0ZW1wMiA8PSAneicpKQotCQkJCXRlbXAyID0gJ0EnKyh0ZW1wMi0nYScpOwotCi0JCQlpZiAodGVtcDEgIT0gdGVtcDIpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaSA9PSBsMikKLQkJCXJldHVybiAoY2hhciAqKSBzMTsKLQotCQlzMSsrOwotCX0KLQotCXJldHVybiBOVUxMOyAvLyBub3QgZm91bmQKLX0KLQotLy9hZGQgYnkga2F0aHkKLQotIC8qKgotICAqIHN0cnN0ciAtIEZpbmQgdGhlIGZpcnN0IHN1YnN0cmluZyBpbiBhICVOVUwgdGVybWluYXRlZCBzdHJpbmcKLSAgKiBAczE6IFRoZSBzdHJpbmcgdG8gYmUgc2VhcmNoZWQKLSAgKiBAczI6IFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvcgotICAqLwotY2hhciAqIHJ0c3Ryc3RyKGNvbnN0IGNoYXIgKiBzMSxjb25zdCBjaGFyICogczIpCi17Ci0JSU5UIGwxLCBsMjsKLQotCWwyID0gc3RybGVuKHMyKTsKLQlpZiAoIWwyKQotCQlyZXR1cm4gKGNoYXIgKikgczE7Ci0KLQlsMSA9IHN0cmxlbihzMSk7Ci0KLQl3aGlsZSAobDEgPj0gbDIpCi0JewotCQlsMS0tOwotCQlpZiAoIW1lbWNtcChzMSxzMixsMikpCi0JCQlyZXR1cm4gKGNoYXIgKikgczE7Ci0JCXMxKys7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKgotICogcnN0cnRvayAtIFNwbGl0IGEgc3RyaW5nIGludG8gdG9rZW5zCi0gKiBAczogVGhlIHN0cmluZyB0byBiZSBzZWFyY2hlZAotICogQGN0OiBUaGUgY2hhcmFjdGVycyB0byBzZWFyY2ggZm9yCi0gKiAqIFdBUk5JTkc6IHN0cnRvayBpcyBkZXByZWNhdGVkLCB1c2Ugc3Ryc2VwIGluc3RlYWQuIEhvd2V2ZXIgc3Ryc2VwIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggb2xkIGFyY2hpdGVjdHVyZS4KLSAqLwotY2hhciAqIF9fcnN0cnRvazsKLWNoYXIgKiByc3RydG9rKGNoYXIgKiBzLGNvbnN0IGNoYXIgKiBjdCkKLXsKLQljaGFyICpzYmVnaW4sICpzZW5kOwotCi0Jc2JlZ2luICA9IHMgPyBzIDogX19yc3RydG9rOwotCWlmICghc2JlZ2luKQotCXsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0Jc2JlZ2luICs9IHN0cnNwbihzYmVnaW4sY3QpOwotCWlmICgqc2JlZ2luID09ICdcMCcpCi0JewotCQlfX3JzdHJ0b2sgPSBOVUxMOwotCQlyZXR1cm4oIE5VTEwgKTsKLQl9Ci0KLQlzZW5kID0gc3RycGJyayggc2JlZ2luLCBjdCk7Ci0JaWYgKHNlbmQgJiYgKnNlbmQgIT0gJ1wwJykKLQkJKnNlbmQrKyA9ICdcMCc7Ci0KLQlfX3JzdHJ0b2sgPSBzZW5kOwotCi0JcmV0dXJuIChzYmVnaW4pOwotfQotCi0vKioKLSAqIGRlbGltaXRjbnQgLSByZXR1cm4gdGhlIGNvdW50IG9mIGEgZ2l2ZW4gZGVsaW1pdGVyIGluIGEgZ2l2ZW4gc3RyaW5nLgotICogQHM6IFRoZSBzdHJpbmcgdG8gYmUgc2VhcmNoZWQuCi0gKiBAY3Q6IFRoZSBkZWxpbWl0ZXIgdG8gc2VhcmNoIGZvci4KLSAqIE5vdGljZSA6IFdlIHN1cHBvc2UgdGhlIGRlbGltaXRlciBpcyBhIHNpbmdsZS1jaGFyIHN0cmluZyhmb3IgZXhhbXBsZSA6ICI7IikuCi0gKi8KLUlOVCBkZWxpbWl0Y250KGNoYXIgKiBzLGNvbnN0IGNoYXIgKiBjdCkKLXsKLQlJTlQgY291bnQgPSAwOwotCS8qIHBvaW50IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgKi8KLQljb25zdCBjaGFyICp0b2tlbiA9IHM7Ci0KLQlmb3IgKCA7OyApCi0JewotCQl0b2tlbiA9IHN0cnBicmsodG9rZW4sIGN0KTsgLyogc2VhcmNoIGZvciBkZWxpbWl0ZXJzICovCi0KLSAgICAgICAgaWYgKCB0b2tlbiA9PSBOVUxMICkKLQkJewotCQkJLyogYWR2YW5jZWQgdG8gdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyICovCi0JCQlicmVhazsKLQkJfQotCQkvKiBza2lwIHRoZSBkZWxpbWl0ZXIgKi8KLQkgICAgKyt0b2tlbjsKLQotCQkvKgotCQkgKiBQcmludCB0aGUgZm91bmQgdGV4dDogdXNlIGxlbiB3aXRoICUuKnMgdG8gc3BlY2lmeSBmaWVsZCB3aWR0aC4KLQkJICovCi0KLQkJLyogYWNjdW11bGF0ZSBkZWxpbWl0ZXIgY291bnQgKi8KLQkgICAgKytjb3VudDsKLQl9Ci0gICAgcmV0dXJuIGNvdW50OwotfQotCi0vKgotICAqIGNvbnZlcnRzIHRoZSBJbnRlcm5ldCBob3N0IGFkZHJlc3MgZnJvbSB0aGUgc3RhbmRhcmQgbnVtYmVycy1hbmQtZG90cyBub3RhdGlvbgotICAqIGludG8gYmluYXJ5IGRhdGEuCi0gICogcmV0dXJucyBub256ZXJvIGlmIHRoZSBhZGRyZXNzIGlzIHZhbGlkLCB6ZXJvIGlmIG5vdC4KLSAgKi8KLWludCBydGluZXRfYXRvbihjb25zdCBjaGFyICpjcCwgdW5zaWduZWQgaW50ICphZGRyKQotewotCXVuc2lnbmVkIGludCAJdmFsOwotCWludCAgICAgICAgIAliYXNlLCBuOwotCWNoYXIgICAgICAgIAljOwotCXVuc2lnbmVkIGludCAgICBwYXJ0c1s0XTsKLQl1bnNpZ25lZCBpbnQgICAgKnBwID0gcGFydHM7Ci0KLQlmb3IgKDs7KQotICAgIHsKLSAgICAgICAgIC8qCi0gICAgICAgICAgKiBDb2xsZWN0IG51bWJlciB1cCB0byBgYC4nJy4KLSAgICAgICAgICAqIFZhbHVlcyBhcmUgc3BlY2lmaWVkIGFzIGZvciBDOgotICAgICAgICAgICoJMHg9aGV4LCAwPW9jdGFsLCBvdGhlcj1kZWNpbWFsLgotICAgICAgICAgICovCi0gICAgICAgICB2YWwgPSAwOwotICAgICAgICAgYmFzZSA9IDEwOwotICAgICAgICAgaWYgKCpjcCA9PSAnMCcpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAgaWYgKCorK2NwID09ICd4JyB8fCAqY3AgPT0gJ1gnKQotICAgICAgICAgICAgICAgICBiYXNlID0gMTYsIGNwKys7Ci0gICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICBiYXNlID0gODsKLSAgICAgICAgIH0KLSAgICAgICAgIHdoaWxlICgoYyA9ICpjcCkgIT0gJ1wwJykKLSAgICAgICAgIHsKLSAgICAgICAgICAgICBpZiAoaXNkaWdpdCgodW5zaWduZWQgY2hhcikgYykpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICB2YWwgPSAodmFsICogYmFzZSkgKyAoYyAtICcwJyk7Ci0gICAgICAgICAgICAgICAgIGNwKys7Ci0gICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBpZiAoYmFzZSA9PSAxNiAmJiBpc3hkaWdpdCgodW5zaWduZWQgY2hhcikgYykpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICB2YWwgPSAodmFsIDw8IDQpICsKLSAgICAgICAgICAgICAgICAgICAgIChjICsgMTAgLSAoaXNsb3dlcigodW5zaWduZWQgY2hhcikgYykgPyAnYScgOiAnQScpKTsKLSAgICAgICAgICAgICAgICAgY3ArKzsKLSAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgaWYgKCpjcCA9PSAnLicpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgKiBJbnRlcm5ldCBmb3JtYXQ6IGEuYi5jLmQgYS5iLmMgICAod2l0aCBjIHRyZWF0ZWQgYXMgMTYtYml0cykKLSAgICAgICAgICAgICAgKiBhLmIgICAgICh3aXRoIGIgdHJlYXRlZCBhcyAyNCBiaXRzKQotICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgIGlmIChwcCA+PSBwYXJ0cyArIDMgfHwgdmFsID4gMHhmZikKLSAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgKnBwKysgPSB2YWwsIGNwKys7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgIH0KLQotICAgICAvKgotICAgICAgKiBDaGVjayBmb3IgdHJhaWxpbmcganVuay4KLSAgICAgICovCi0gICAgIHdoaWxlICgqY3ApCi0gICAgICAgICBpZiAoIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpICpjcCsrKSkKLSAgICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAvKgotICAgICAgKiBDb25jb2N0IHRoZSBhZGRyZXNzIGFjY29yZGluZyB0byB0aGUgbnVtYmVyIG9mIHBhcnRzIHNwZWNpZmllZC4KLSAgICAgICovCi0gICAgIG4gPSBwcCAtIHBhcnRzICsgMTsKLSAgICAgc3dpdGNoIChuKQotICAgICB7Ci0KLSAgICAgICAgIGNhc2UgMTogICAgICAgICAvKiBhIC0tIDMyIGJpdHMgKi8KLSAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgY2FzZSAyOiAgICAgICAgIC8qIGEuYiAtLSA4LjI0IGJpdHMgKi8KLSAgICAgICAgICAgICBpZiAodmFsID4gMHhmZmZmZmYpCi0gICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgIHZhbCB8PSBwYXJ0c1swXSA8PCAyNDsKLSAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgY2FzZSAzOiAgICAgICAgIC8qIGEuYi5jIC0tIDguOC4xNiBiaXRzICovCi0gICAgICAgICAgICAgaWYgKHZhbCA+IDB4ZmZmZikKLSAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgdmFsIHw9IChwYXJ0c1swXSA8PCAyNCkgfCAocGFydHNbMV0gPDwgMTYpOwotICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICBjYXNlIDQ6ICAgICAgICAgLyogYS5iLmMuZCAtLSA4LjguOC44IGJpdHMgKi8KLSAgICAgICAgICAgICBpZiAodmFsID4gMHhmZikKLSAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgdmFsIHw9IChwYXJ0c1swXSA8PCAyNCkgfCAocGFydHNbMV0gPDwgMTYpIHwgKHBhcnRzWzJdIDw8IDgpOwotICAgICAgICAgICAgIGJyZWFrOwotICAgICB9Ci0KLSAgICAgKmFkZHIgPSBodG9ubCh2YWwpOwotICAgICByZXR1cm4gMTsKLQotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICAgICAgRmluZCBrZXkgc2VjdGlvbiBmb3IgR2V0IGtleSBwYXJhbWV0ZXIuCi0KLSAgICBBcmd1bWVudHM6Ci0gICAgICAgIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gc3RhcnQgZmluZCB0aGUga2V5IHNlY3Rpb24KLSAgICAgICAgc2VjdGlvbiAgICAgICAgICAgICAgICAgICAgIHRoZSBrZXkgb2YgdGhlIHNlY2lvbiB0byBiZSBmaW5kCi0KLSAgICBSZXR1cm4gVmFsdWU6Ci0gICAgICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICBGYWlsCi0gICAgICAgIE90aGVycyAgICAgICAgICAgICAgICAgICAgICBTdWNjZXNzCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotUFVDSEFSICBSVE1QRmluZFNlY3Rpb24oCi0gICAgSU4gIFBDSEFSICAgYnVmZmVyKQotewotICAgIENIQVIgdGVtcF9idWZbMzJdOwotICAgIFBVQ0hBUiAgcHRyOwotCi0gICAgc3RyY3B5KHRlbXBfYnVmLCAiRGVmYXVsdCIpOwotCi0gICAgaWYoKHB0ciA9IHJ0c3Ryc3RyKGJ1ZmZlciwgdGVtcF9idWYpKSAhPSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIChwdHIrc3RybGVuKCJcbiIpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgotICAgICAgICBHZXQga2V5IHBhcmFtZXRlci4KLQotICAgIEFyZ3VtZW50czoKLSAgICAgICAga2V5ICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8ga2V5IHN0cmluZwotICAgICAgICBkZXN0ICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBkZXN0aW5hdGlvbgotICAgICAgICBkZXN0c2l6ZSAgICAgICAgICAgICAgICAgICAgVGhlIGRhdGFzaXplIG9mIHRoZSBkZXN0aW5hdGlvbgotICAgICAgICBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHN0YXJ0IGZpbmQgdGhlIGtleQotCi0gICAgUmV0dXJuIFZhbHVlOgotICAgICAgICBUUlVFICAgICAgICAgICAgICAgICAgICAgICAgU3VjY2VzcwotICAgICAgICBGQUxTRSAgICAgICAgICAgICAgICAgICAgICAgRmFpbAotCi0gICAgTm90ZToKLSAgICAgICAgVGhpcyByb3V0aW5lIGdldCB0aGUgdmFsdWUgd2l0aCB0aGUgbWF0Y2hlZCBrZXkgKGNhc2UgY2FzZS1zZW5zaXRpdmUpCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFJUTVBHZXRLZXlQYXJhbWV0ZXIoCi0gICAgSU4gIFBDSEFSICAga2V5LAotICAgIE9VVCBQQ0hBUiAgIGRlc3QsCi0gICAgSU4gIElOVCAgICAgZGVzdHNpemUsCi0gICAgSU4gIFBDSEFSICAgYnVmZmVyKQotewotICAgIFVDSEFSICp0ZW1wX2J1ZjEgPSBOVUxMOwotICAgIFVDSEFSICp0ZW1wX2J1ZjIgPSBOVUxMOwotICAgIENIQVIgKnN0YXJ0X3B0cjsKLSAgICBDSEFSICplbmRfcHRyOwotICAgIENIQVIgKnB0cjsKLSAgICBDSEFSICpvZmZzZXQgPSAwOwotICAgIElOVCAgbGVuOwotCi0JLy90ZW1wX2J1ZjEgPSBrbWFsbG9jKE1BWF9QQVJBTV9CVUZGRVJfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOwotCW9zX2FsbG9jX21lbShOVUxMLCAmdGVtcF9idWYxLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOwotCi0JaWYodGVtcF9idWYxID09IE5VTEwpCi0gICAgICAgIHJldHVybiAoRkFMU0UpOwotCi0JLy90ZW1wX2J1ZjIgPSBrbWFsbG9jKE1BWF9QQVJBTV9CVUZGRVJfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOwotCW9zX2FsbG9jX21lbShOVUxMLCAmdGVtcF9idWYyLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOwotCWlmKHRlbXBfYnVmMiA9PSBOVUxMKQotCXsKLQkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKLSAgICAgICAgcmV0dXJuIChGQUxTRSk7Ci0JfQotCi0gICAgLy9maW5kIHNlY3Rpb24KLSAgICBpZigob2Zmc2V0ID0gUlRNUEZpbmRTZWN0aW9uKGJ1ZmZlcikpID09IE5VTEwpCi0gICAgewotICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOwotICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOwotICAgICAgICByZXR1cm4gKEZBTFNFKTsKLSAgICB9Ci0KLSAgICBzdHJjcHkodGVtcF9idWYxLCAiXG4iKTsKLSAgICBzdHJjYXQodGVtcF9idWYxLCBrZXkpOwotICAgIHN0cmNhdCh0ZW1wX2J1ZjEsICI9Iik7Ci0KLSAgICAvL3NlYXJjaCBrZXkKLSAgICBpZigoc3RhcnRfcHRyPXJ0c3Ryc3RyKG9mZnNldCwgdGVtcF9idWYxKSk9PU5VTEwpCi0gICAgewotCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOwotICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOwotICAgICAgICByZXR1cm4gKEZBTFNFKTsKLSAgICB9Ci0KLSAgICBzdGFydF9wdHIrPXN0cmxlbigiXG4iKTsKLSAgICBpZigoZW5kX3B0cj1ydHN0cnN0cihzdGFydF9wdHIsICJcbiIpKT09TlVMTCkKLSAgICAgICBlbmRfcHRyPXN0YXJ0X3B0citzdHJsZW4oc3RhcnRfcHRyKTsKLQotICAgIGlmIChlbmRfcHRyPHN0YXJ0X3B0cikKLSAgICB7Ci0JCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7Ci0gICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7Ci0gICAgICAgIHJldHVybiAoRkFMU0UpOwotICAgIH0KLQotICAgIE5kaXNNb3ZlTWVtb3J5KHRlbXBfYnVmMiwgc3RhcnRfcHRyLCBlbmRfcHRyLXN0YXJ0X3B0cik7Ci0gICAgdGVtcF9idWYyW2VuZF9wdHItc3RhcnRfcHRyXT0nXDAnOwotICAgIGxlbiA9IHN0cmxlbih0ZW1wX2J1ZjIpOwotICAgIHN0cmNweSh0ZW1wX2J1ZjEsIHRlbXBfYnVmMik7Ci0gICAgaWYoKHN0YXJ0X3B0cj1ydHN0cnN0cih0ZW1wX2J1ZjEsICI9IikpID09IE5VTEwpCi0gICAgewotCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOwotICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOwotICAgICAgICByZXR1cm4gKEZBTFNFKTsKLSAgICB9Ci0KLSAgICBzdHJjcHkodGVtcF9idWYyLCBzdGFydF9wdHIrMSk7Ci0gICAgcHRyID0gdGVtcF9idWYyOwotICAgIC8vdHJpbSBzcGFjZSBvciB0YWIKLSAgICB3aGlsZSgqcHRyICE9IDB4MDApCi0gICAgewotICAgICAgICBpZiggKCpwdHIgPT0gJyAnKSB8fCAoKnB0ciA9PSAnXHQnKSApCi0gICAgICAgICAgICBwdHIrKzsKLSAgICAgICAgZWxzZQotICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBsZW4gPSBzdHJsZW4ocHRyKTsKLSAgICBtZW1zZXQoZGVzdCwgMHgwMCwgZGVzdHNpemUpOwotICAgIHN0cm5jcHkoZGVzdCwgcHRyLCBsZW4gPj0gZGVzdHNpemUgPyAgZGVzdHNpemU6IGxlbik7Ci0KLQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOwotICAgIG9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgotICAgICAgICBHZXQga2V5IHBhcmFtZXRlci4KLQotICAgIEFyZ3VtZW50czoKLSAgICAgICAga2V5ICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8ga2V5IHN0cmluZwotICAgICAgICBkZXN0ICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBkZXN0aW5hdGlvbgotICAgICAgICBkZXN0c2l6ZSAgICAgICAgICAgICAgICAgICAgVGhlIGRhdGFzaXplIG9mIHRoZSBkZXN0aW5hdGlvbgotICAgICAgICBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHN0YXJ0IGZpbmQgdGhlIGtleQotCi0gICAgUmV0dXJuIFZhbHVlOgotICAgICAgICBUUlVFICAgICAgICAgICAgICAgICAgICAgICAgU3VjY2VzcwotICAgICAgICBGQUxTRSAgICAgICAgICAgICAgICAgICAgICAgRmFpbAotCi0gICAgTm90ZToKLSAgICAgICAgVGhpcyByb3V0aW5lIGdldCB0aGUgdmFsdWUgd2l0aCB0aGUgbWF0Y2hlZCBrZXkgKGNhc2UgY2FzZS1zZW5zaXRpdmUpLgotICAgICAgICBJdCBpcyBjYWxsZWQgZm9yIHBhcnNpbmcgU1NJRCBhbmQgYW55IGtleSBzdHJpbmcuCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFJUTVBHZXRDcml0aWNhbFBhcmFtZXRlcigKLSAgICBJTiAgUENIQVIgICBrZXksCi0gICAgT1VUIFBDSEFSICAgZGVzdCwKLSAgICBJTiAgSU5UICAgICBkZXN0c2l6ZSwKLSAgICBJTiAgUENIQVIgICBidWZmZXIpCi17Ci0gICAgVUNIQVIgKnRlbXBfYnVmMSA9IE5VTEw7Ci0gICAgVUNIQVIgKnRlbXBfYnVmMiA9IE5VTEw7Ci0gICAgQ0hBUiAqc3RhcnRfcHRyOwotICAgIENIQVIgKmVuZF9wdHI7Ci0gICAgQ0hBUiAqcHRyOwotICAgIENIQVIgKm9mZnNldCA9IDA7Ci0gICAgSU5UICBsZW47Ci0KLQkvL3RlbXBfYnVmMSA9IGttYWxsb2MoTUFYX1BBUkFNX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7Ci0Jb3NfYWxsb2NfbWVtKE5VTEwsICZ0ZW1wX2J1ZjEsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7Ci0KLQlpZih0ZW1wX2J1ZjEgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIChGQUxTRSk7Ci0KLQkvL3RlbXBfYnVmMiA9IGttYWxsb2MoTUFYX1BBUkFNX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7Ci0Jb3NfYWxsb2NfbWVtKE5VTEwsICZ0ZW1wX2J1ZjIsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7Ci0JaWYodGVtcF9idWYyID09IE5VTEwpCi0JewotCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOwotICAgICAgICByZXR1cm4gKEZBTFNFKTsKLQl9Ci0KLSAgICAvL2ZpbmQgc2VjdGlvbgotICAgIGlmKChvZmZzZXQgPSBSVE1QRmluZFNlY3Rpb24oYnVmZmVyKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7Ci0gICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7Ci0gICAgICAgIHJldHVybiAoRkFMU0UpOwotICAgIH0KLQotICAgIHN0cmNweSh0ZW1wX2J1ZjEsICJcbiIpOwotICAgIHN0cmNhdCh0ZW1wX2J1ZjEsIGtleSk7Ci0gICAgc3RyY2F0KHRlbXBfYnVmMSwgIj0iKTsKLQotICAgIC8vc2VhcmNoIGtleQotICAgIGlmKChzdGFydF9wdHI9cnRzdHJzdHIob2Zmc2V0LCB0ZW1wX2J1ZjEpKT09TlVMTCkKLSAgICB7Ci0JCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7Ci0gICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7Ci0gICAgICAgIHJldHVybiAoRkFMU0UpOwotICAgIH0KLQotICAgIHN0YXJ0X3B0cis9c3RybGVuKCJcbiIpOwotICAgIGlmKChlbmRfcHRyPXJ0c3Ryc3RyKHN0YXJ0X3B0ciwgIlxuIikpPT1OVUxMKQotICAgICAgIGVuZF9wdHI9c3RhcnRfcHRyK3N0cmxlbihzdGFydF9wdHIpOwotCi0gICAgaWYgKGVuZF9wdHI8c3RhcnRfcHRyKQotICAgIHsKLQkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKLSAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKLSAgICAgICAgcmV0dXJuIChGQUxTRSk7Ci0gICAgfQotCi0gICAgTmRpc01vdmVNZW1vcnkodGVtcF9idWYyLCBzdGFydF9wdHIsIGVuZF9wdHItc3RhcnRfcHRyKTsKLSAgICB0ZW1wX2J1ZjJbZW5kX3B0ci1zdGFydF9wdHJdPSdcMCc7Ci0gICAgbGVuID0gc3RybGVuKHRlbXBfYnVmMik7Ci0gICAgc3RyY3B5KHRlbXBfYnVmMSwgdGVtcF9idWYyKTsKLSAgICBpZigoc3RhcnRfcHRyPXJ0c3Ryc3RyKHRlbXBfYnVmMSwgIj0iKSkgPT0gTlVMTCkKLSAgICB7Ci0JCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7Ci0gICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7Ci0gICAgICAgIHJldHVybiAoRkFMU0UpOwotICAgIH0KLQotICAgIHN0cmNweSh0ZW1wX2J1ZjIsIHN0YXJ0X3B0cisxKTsKLSAgICBwdHIgPSB0ZW1wX2J1ZjI7Ci0KLSAgICAvL3RyaW0gdGFiCi0gICAgLyogV2UgY2Fubm90IHRyaW0gc3BhY2UoJyAnKSBmb3IgU1NJRCBhbmQga2V5IHN0cmluZy4gKi8KLSAgICB3aGlsZSgqcHRyICE9IDB4MDApCi0gICAgewotICAgICAgICAvL2lmKCAoKnB0ciA9PSAnICcpIHx8ICgqcHRyID09ICdcdCcpICkKLSAgICAgICAgaWYoICgqcHRyID09ICdcdCcpICkKLSAgICAgICAgICAgIHB0cisrOwotICAgICAgICBlbHNlCi0gICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGxlbiA9IHN0cmxlbihwdHIpOwotICAgIG1lbXNldChkZXN0LCAweDAwLCBkZXN0c2l6ZSk7Ci0gICAgc3RybmNweShkZXN0LCBwdHIsIGxlbiA+PSBkZXN0c2l6ZSA/ICBkZXN0c2l6ZTogbGVuKTsKLQotCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7Ci0gICAgb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIFJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgICAgIEdldCBtdWx0aXBsZSBrZXkgcGFyYW1ldGVyLgotCi0gICAgQXJndW1lbnRzOgotICAgICAgICBrZXkgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBrZXkgc3RyaW5nCi0gICAgICAgIGRlc3QgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGRlc3RpbmF0aW9uCi0gICAgICAgIGRlc3RzaXplICAgICAgICAgICAgICAgICAgICBUaGUgZGF0YXNpemUgb2YgdGhlIGRlc3RpbmF0aW9uCi0gICAgICAgIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gc3RhcnQgZmluZCB0aGUga2V5Ci0KLSAgICBSZXR1cm4gVmFsdWU6Ci0gICAgICAgIFRSVUUgICAgICAgICAgICAgICAgICAgICAgICBTdWNjZXNzCi0gICAgICAgIEZBTFNFICAgICAgICAgICAgICAgICAgICAgICBGYWlsCi0KLSAgICBOb3RlOgotICAgICAgICBUaGlzIHJvdXRpbmUgZ2V0IHRoZSB2YWx1ZSB3aXRoIHRoZSBtYXRjaGVkIGtleSAoY2FzZSBjYXNlLXNlbnNpdGl2ZSkKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgUlRNUEdldEtleVBhcmFtZXRlcldpdGhPZmZzZXQoCi0gICAgSU4gIFBDSEFSICAga2V5LAotICAgIE9VVCBQQ0hBUiAgIGRlc3QsCi0gICAgT1VUCVVTSE9SVAkqZW5kX29mZnNldCwKLSAgICBJTiAgSU5UICAgICBkZXN0c2l6ZSwKLSAgICBJTiAgUENIQVIgICBidWZmZXIsCi0gICAgSU4JQk9PTEVBTgliVHJpbVNwYWNlKQotewotICAgIFVDSEFSICp0ZW1wX2J1ZjEgPSBOVUxMOwotICAgIFVDSEFSICp0ZW1wX2J1ZjIgPSBOVUxMOwotICAgIENIQVIgKnN0YXJ0X3B0cjsKLSAgICBDSEFSICplbmRfcHRyOwotICAgIENIQVIgKnB0cjsKLSAgICBDSEFSICpvZmZzZXQgPSAwOwotICAgIElOVCAgbGVuOwotCi0JaWYgKCplbmRfb2Zmc2V0ID49IE1BWF9JTklfQlVGRkVSX1NJWkUpCi0JCXJldHVybiAoRkFMU0UpOwotCi0Jb3NfYWxsb2NfbWVtKE5VTEwsICZ0ZW1wX2J1ZjEsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7Ci0KLQlpZih0ZW1wX2J1ZjEgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIChGQUxTRSk7Ci0KLQlvc19hbGxvY19tZW0oTlVMTCwgJnRlbXBfYnVmMiwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKLQlpZih0ZW1wX2J1ZjIgPT0gTlVMTCkKLQl7Ci0JCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7Ci0gICAgICAgIHJldHVybiAoRkFMU0UpOwotCX0KLQotICAgIC8vZmluZCBzZWN0aW9uCi0JaWYoKmVuZF9vZmZzZXQgPT0gMCkKLSAgICB7Ci0JCWlmICgob2Zmc2V0ID0gUlRNUEZpbmRTZWN0aW9uKGJ1ZmZlcikpID09IE5VTEwpCi0JCXsKLQkJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7Ci0JICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOwotICAgIAkgICAgcmV0dXJuIChGQUxTRSk7Ci0JCX0KLSAgICB9Ci0JZWxzZQotCQlvZmZzZXQgPSBidWZmZXIgKyAoKmVuZF9vZmZzZXQpOwotCi0gICAgc3RyY3B5KHRlbXBfYnVmMSwgIlxuIik7Ci0gICAgc3RyY2F0KHRlbXBfYnVmMSwga2V5KTsKLSAgICBzdHJjYXQodGVtcF9idWYxLCAiPSIpOwotCi0gICAgLy9zZWFyY2gga2V5Ci0gICAgaWYoKHN0YXJ0X3B0cj1ydHN0cnN0cihvZmZzZXQsIHRlbXBfYnVmMSkpPT1OVUxMKQotICAgIHsKLQkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKLSAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKLSAgICAgICAgcmV0dXJuIChGQUxTRSk7Ci0gICAgfQotCi0gICAgc3RhcnRfcHRyKz1zdHJsZW4oIlxuIik7Ci0gICAgaWYoKGVuZF9wdHI9cnRzdHJzdHIoc3RhcnRfcHRyLCAiXG4iKSk9PU5VTEwpCi0gICAgICAgZW5kX3B0cj1zdGFydF9wdHIrc3RybGVuKHN0YXJ0X3B0cik7Ci0KLSAgICBpZiAoZW5kX3B0cjxzdGFydF9wdHIpCi0gICAgewotCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOwotICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOwotICAgICAgICByZXR1cm4gKEZBTFNFKTsKLSAgICB9Ci0KLQkqZW5kX29mZnNldCA9IGVuZF9wdHIgLSBidWZmZXI7Ci0KLSAgICBOZGlzTW92ZU1lbW9yeSh0ZW1wX2J1ZjIsIHN0YXJ0X3B0ciwgZW5kX3B0ci1zdGFydF9wdHIpOwotICAgIHRlbXBfYnVmMltlbmRfcHRyLXN0YXJ0X3B0cl09J1wwJzsKLSAgICBsZW4gPSBzdHJsZW4odGVtcF9idWYyKTsKLSAgICBzdHJjcHkodGVtcF9idWYxLCB0ZW1wX2J1ZjIpOwotICAgIGlmKChzdGFydF9wdHI9cnRzdHJzdHIodGVtcF9idWYxLCAiPSIpKSA9PSBOVUxMKQotICAgIHsKLQkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKLSAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKLSAgICAgICAgcmV0dXJuIChGQUxTRSk7Ci0gICAgfQotCi0gICAgc3RyY3B5KHRlbXBfYnVmMiwgc3RhcnRfcHRyKzEpOwotICAgIHB0ciA9IHRlbXBfYnVmMjsKLSAgICAvL3RyaW0gc3BhY2Ugb3IgdGFiCi0gICAgd2hpbGUoKnB0ciAhPSAweDAwKQotICAgIHsKLSAgICAgICAgaWYoKGJUcmltU3BhY2UgJiYgKCpwdHIgPT0gJyAnKSkgfHwgKCpwdHIgPT0gJ1x0JykgKQotICAgICAgICAgICAgcHRyKys7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgbGVuID0gc3RybGVuKHB0cik7Ci0gICAgbWVtc2V0KGRlc3QsIDB4MDAsIGRlc3RzaXplKTsKLSAgICBzdHJuY3B5KGRlc3QsIHB0ciwgbGVuID49IGRlc3RzaXplID8gIGRlc3RzaXplOiBsZW4pOwotCi0Jb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKLSAgICBvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOwotICAgIHJldHVybiBUUlVFOwotfQotCi0KLXN0YXRpYyBpbnQgcnRtcF9wYXJzZV9rZXlfYnVmZmVyX2Zyb21fZmlsZShJTiAgUFJUTVBfQURBUFRFUiBwQWQsSU4gIGNoYXIgKmJ1ZmZlcixJTiAgVUxPTkcgS2V5VHlwZSxJTiAgSU5UIEJTU0lkeCxJTiAgSU5UIEtleUlkeCkKLXsKLQlQVUNIQVIJCWtleWJ1ZmY7Ci0JSU5UCQkJaSA9IEJTU0lkeCwgaWR4ID0gS2V5SWR4OwotCVVMT05HCQlLZXlMZW47Ci0JVUNIQVIJCUNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLQotCWtleWJ1ZmYgPSBidWZmZXI7Ci0JS2V5TGVuID0gc3RybGVuKGtleWJ1ZmYpOwotCi0JaWYgKEtleVR5cGUgPT0gMSkKLQl7Ly9Bc2NpaQotCQlpZiggKEtleUxlbiA9PSA1KSB8fCAoS2V5TGVuID09IDEzKSkKLQkJewotCQkJcEFkLT5TaGFyZWRLZXlbaV1baWR4XS5LZXlMZW4gPSBLZXlMZW47Ci0JCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtpXVtpZHhdLktleSwga2V5YnVmZiwgS2V5TGVuKTsKLQkJCWlmIChLZXlMZW4gPT0gNSkKLQkJCQlDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0JCQllbHNlCi0JCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLQkJCXBBZC0+U2hhcmVkS2V5W2ldW2lkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJL0Yod2xhbiVkKSBLZXklZFN0cj0lcyBhbmQgdHlwZT0lc1xuIiwgaSwgaWR4KzEsIGtleWJ1ZmYsIChLZXlUeXBlID09IDApID8gIkhleCI6IkFzY2lpIikpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJZWxzZQotCQl7Ly9JbnZhbGlkIGtleSBsZW5ndGgKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIktleSVkU3RyIGlzIEludmFsaWQga2V5IGxlbmd0aCEgS2V5TGVuID0gJWxkIVxuIiwgaWR4KzEsIEtleUxlbikpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JZWxzZQotCXsvL0hleCB0eXBlCi0JCWlmKCAoS2V5TGVuID09IDEwKSB8fCAoS2V5TGVuID09IDI2KSkKLQkJewotCQkJcEFkLT5TaGFyZWRLZXlbaV1baWR4XS5LZXlMZW4gPSBLZXlMZW4gLyAyOwotCQkJQXRvSChrZXlidWZmLCBwQWQtPlNoYXJlZEtleVtpXVtpZHhdLktleSwgS2V5TGVuIC8gMik7Ci0JCQlpZiAoS2V5TGVuID09IDEwKQotCQkJCUNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLQkJCWVsc2UKLQkJCQlDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotCQkJcEFkLT5TaGFyZWRLZXlbaV1baWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkkvRih3bGFuJWQpIEtleSVkU3RyPSVzIGFuZCB0eXBlPSVzXG4iLCBpLCBpZHgrMSwga2V5YnVmZiwgKEtleVR5cGUgPT0gMCkgPyAiSGV4IjoiQXNjaWkiKSk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQllbHNlCi0JCXsvL0ludmFsaWQga2V5IGxlbmd0aAotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiSS9GKHdsYW4lZCkgS2V5JWRTdHIgaXMgSW52YWxpZCBrZXkgbGVuZ3RoISBLZXlMZW4gPSAlbGQhXG4iLCBpLCBpZHgrMSwgS2V5TGVuKSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLX0KLXN0YXRpYyB2b2lkIHJ0bXBfcmVhZF9rZXlfcGFybXNfZnJvbV9maWxlKElOICBQUlRNUF9BREFQVEVSIHBBZCwgY2hhciAqdG1wYnVmLCBjaGFyICpidWZmZXIpCi17Ci0JY2hhcgkJdG9rX3N0clsxNl07Ci0JUFVDSEFSCQltYWNwdHI7Ci0JSU5UCQkJaSA9IDAsIGlkeDsKLQlVTE9ORwkJS2V5VHlwZVtNQVhfTUJTU0lEX05VTV07Ci0JVUxPTkcJCUtleUlkeDsKLQotCU5kaXNaZXJvTWVtb3J5KEtleVR5cGUsIE1BWF9NQlNTSURfTlVNKTsKLQotCS8vRGVmYXVsdEtleUlECi0JaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRGVmYXVsdEtleUlEIiwgdG1wYnVmLCAyNSwgYnVmZmVyKSkKLQl7Ci0JCXsKLQkJCUtleUlkeCA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0JCQlpZigoS2V5SWR4ID49IDEgKSAmJiAoS2V5SWR4IDw9IDQpKQotCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgKEtleUlkeCAtIDEpOwotCQkJZWxzZQotCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IDA7Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRlZmF1bHRLZXlJRCgwfjMpPSVkXG4iLCBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKLQkJfQotCX0KLQotCi0JZm9yIChpZHggPSAwOyBpZHggPCA0OyBpZHgrKykKLQl7Ci0JCXNwcmludGYodG9rX3N0ciwgIktleSVkVHlwZSIsIGlkeCArIDEpOwotCQkvL0tleTFUeXBlCi0JCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKHRva19zdHIsIHRtcGJ1ZiwgMTI4LCBidWZmZXIpKQotCQl7Ci0JCSAgICBmb3IgKGkgPSAwLCBtYWNwdHIgPSByc3RydG9rKHRtcGJ1ZiwiOyIpOyBtYWNwdHI7IG1hY3B0ciA9IHJzdHJ0b2soTlVMTCwiOyIpLCBpKyspCi0JCSAgICB7Ci0JCQkgICAgS2V5VHlwZVtpXSA9IHNpbXBsZV9zdHJ0b2wobWFjcHRyLCAwLCAxMCk7Ci0JCSAgICB9Ci0KLQkJCXsKLQkJCQlzcHJpbnRmKHRva19zdHIsICJLZXklZFN0ciIsIGlkeCArIDEpOwotCQkJCWlmIChSVE1QR2V0Q3JpdGljYWxQYXJhbWV0ZXIodG9rX3N0ciwgdG1wYnVmLCAxMjgsIGJ1ZmZlcikpCi0JCQkJewotCQkJCQlydG1wX3BhcnNlX2tleV9idWZmZXJfZnJvbV9maWxlKHBBZCwgdG1wYnVmLCBLZXlUeXBlW0JTUzBdLCBCU1MwLCBpZHgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgcnRtcF9yZWFkX3N0YV93bW1fcGFybXNfZnJvbV9maWxlKElOICBQUlRNUF9BREFQVEVSIHBBZCwgY2hhciAqdG1wYnVmLCBjaGFyICpidWZmZXIpCi17Ci0JUFVDSEFSCQkJCQltYWNwdHI7Ci0JSU5UCQkJCQkJaT0wOwotCUJPT0xFQU4JCQkJCWJXbW1FbmFibGUgPSBGQUxTRTsKLQotCS8vV21tQ2FwYWJsZQotCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIldtbUNhcGFibGUiLCB0bXBidWYsIDMyLCBidWZmZXIpKQotCXsKLQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKSAvL0VuYWJsZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9IFRSVUU7Ci0JCQliV21tRW5hYmxlID0gVFJVRTsKLQkJfQotCQllbHNlIC8vRGlzYWJsZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9IEZBTFNFOwotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV21tQ2FwYWJsZT0lZFxuIiwgcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpKTsKLQl9Ci0KLQkvL0Fja1BvbGljeSBmb3IgQUNfQkssIEFDX0JFLCBBQ19WSSwgQUNfVk8KLQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJBY2tQb2xpY3kiLCB0bXBidWYsIDMyLCBidWZmZXIpKQotCXsKLQkJZm9yIChpID0gMCwgbWFjcHRyID0gcnN0cnRvayh0bXBidWYsIjsiKTsgbWFjcHRyOyBtYWNwdHIgPSByc3RydG9rKE5VTEwsIjsiKSwgaSsrKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5BY2tQb2xpY3lbaV0gPSAoVUNIQVIpc2ltcGxlX3N0cnRvbChtYWNwdHIsIDAsIDEwKTsKLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWNrUG9saWN5WyVkXT0lZFxuIiwgaSwgcEFkLT5Db21tb25DZmcuQWNrUG9saWN5W2ldKSk7Ci0JCX0KLQl9Ci0KLQlpZiAoYldtbUVuYWJsZSkKLQl7Ci0JCS8vQVBTRENhcGFibGUKLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQVBTRENhcGFibGUiLCB0bXBidWYsIDEwLCBidWZmZXIpKQotCQl7Ci0JCQlpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApICAvL0VuYWJsZQotCQkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSA9IFRSVUU7Ci0JCQllbHNlCi0JCQkJcEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlID0gRkFMU0U7Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFQU0RDYXBhYmxlPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUpKTsKLQkJfQotCi0JCS8vQVBTREFDIGZvciBBQ19CRSwgQUNfQkssIEFDX1ZJLCBBQ19WTwotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJBUFNEQUMiLCB0bXBidWYsIDMyLCBidWZmZXIpKQotCQl7Ci0JCQlCT09MRUFOIGFwc2RfYWNbNF07Ci0KLQkJCWZvciAoaSA9IDAsIG1hY3B0ciA9IHJzdHJ0b2sodG1wYnVmLCI7Iik7IG1hY3B0cjsgbWFjcHRyID0gcnN0cnRvayhOVUxMLCI7IiksIGkrKykKLQkJCXsKLQkJCQlhcHNkX2FjW2ldID0gKEJPT0xFQU4pc2ltcGxlX3N0cnRvbChtYWNwdHIsIDAsIDEwKTsKLQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFQU0RBQyVkICAlZFxuIiwgaSwgIGFwc2RfYWNbaV0pKTsKLQkJCX0KLQotCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRSA9IGFwc2RfYWNbMF07Ci0JCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLID0gYXBzZF9hY1sxXTsKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgPSBhcHNkX2FjWzJdOwotCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTyA9IGFwc2RfYWNbM107Ci0JCX0KLQl9Ci0KLX0KLQotTkRJU19TVEFUVVMJUlRNUFJlYWRQYXJhbWV0ZXJzSG9vaygKLQlJTglQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlQVUNIQVIJCQkJCXNyYyA9IE5VTEw7Ci0Jc3RydWN0IGZpbGUJCQkJKnNyY2Y7Ci0JSU5UIAkJCQkJcmV0dmFsOwotICAgCW1tX3NlZ21lbnRfdAkJCW9yZ2ZzOwotCUNIQVIJCQkJCSpidWZmZXI7Ci0JQ0hBUgkJCQkJKnRtcGJ1ZjsKLQlVTE9ORwkJCQkJUnRzVGhyZXNoOwotCVVMT05HCQkJCQlGcmFnVGhyZXNoOwotCVVDSEFSCSAgICAgICAgICAgICAgICBrZXlNYXRlcmlhbFs0MF07Ci0KLQlQVUNIQVIJCQkJCW1hY3B0cjsKLQlJTlQJCQkJCQlpID0gMDsKLQotCWJ1ZmZlciA9IGttYWxsb2MoTUFYX0lOSV9CVUZGRVJfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOwotCWlmKGJ1ZmZlciA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQotCXRtcGJ1ZiA9IGttYWxsb2MoTUFYX1BBUkFNX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7Ci0JaWYodG1wYnVmID09IE5VTEwpCi0JewotCQlrZnJlZShidWZmZXIpOwotICAgICAgICByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQlzcmMgPSBTVEFfUFJPRklMRV9QQVRIOwotCi0gICAgb3JnZnMgPSBnZXRfZnMoKTsKLSAgICBzZXRfZnMoS0VSTkVMX0RTKTsKLQotCWlmIChzcmMgJiYgKnNyYykKLQl7Ci0JCXNyY2YgPSBmaWxwX29wZW4oc3JjLCBPX1JET05MWSwgMCk7Ci0JCWlmIChJU19FUlIoc3JjZikpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIi0tPiBFcnJvciAlbGQgb3BlbmluZyAlc1xuIiwgLVBUUl9FUlIoc3JjZiksc3JjKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyBUaGUgb2JqZWN0IG11c3QgaGF2ZSBhIHJlYWQgbWV0aG9kCi0JCQlpZiAoc3JjZi0+Zl9vcCAmJiBzcmNmLT5mX29wLT5yZWFkKQotCQkJewotCQkJCW1lbXNldChidWZmZXIsIDB4MDAsIE1BWF9JTklfQlVGRkVSX1NJWkUpOwotCQkJCXJldHZhbD1zcmNmLT5mX29wLT5yZWFkKHNyY2YsIGJ1ZmZlciwgTUFYX0lOSV9CVUZGRVJfU0laRSwgJnNyY2YtPmZfcG9zKTsKLQkJCQlpZiAocmV0dmFsIDwgMCkKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBSZWFkICVzIGVycm9yICVkXG4iLCBzcmMsIC1yZXR2YWwpKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJLy8gc2V0IGZpbGUgcGFyYW1ldGVyIHRvIHBvcnRjZmcKLQkJCQkJLy9Db3VudHJ5UmVnaW9uCi0JCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNvdW50cnlSZWdpb24iLCB0bXBidWYsIDI1LCBidWZmZXIpKQotCQkJCQl7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uID0gKFVDSEFSKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ291bnRyeVJlZ2lvbj0lZFxuIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbikpOwotCQkJCQl9Ci0JCQkJCS8vQ291bnRyeVJlZ2lvbkFCYW5kCi0JCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNvdW50cnlSZWdpb25BQmFuZCIsIHRtcGJ1ZiwgMjUsIGJ1ZmZlcikpCi0JCQkJCXsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZD0gKFVDSEFSKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ291bnRyeVJlZ2lvbkFCYW5kPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQpKTsKLQkJCQkJfQotCQkJCQkvL0NvdW50cnlDb2RlCi0JCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNvdW50cnlDb2RlIiwgdG1wYnVmLCAyNSwgYnVmZmVyKSkKLQkJCQkJewotCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUsIHRtcGJ1ZiAsIDIpOwotCi0JCQkJCQlpZiAoc3RybGVuKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlKSAhPSAwKQotCQkJCQkJewotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJDb3VudHJ5RmxhZyA9IFRSVUU7Ci0JCQkJCQl9Ci0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDb3VudHJ5Q29kZT0lc1xuIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpKTsKLQkJCQkJfQotCQkJCQkvL0NoYW5uZWxHZW9ncmFwaHkKLQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ2hhbm5lbEdlb2dyYXBoeSIsIHRtcGJ1ZiwgMjUsIGJ1ZmZlcikpCi0JCQkJCXsKLQkJCQkJCVVDSEFSIEdlb2dyYXBoeSA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQkJCQkJCWlmIChHZW9ncmFwaHkgPD0gQk9USCkKLQkJCQkJCXsKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBHZW9ncmFwaHk7Ci0JCQkJCQkJcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGVbMl0gPQotCQkJCQkJCQkocEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID09IEJPVEgpID8gJyAnIDogKChwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPT0gSURPUikgPyAnSScgOiAnTycpOwotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoYW5uZWxHZW9ncmFwaHk9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID0gQk9USDsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlWzJdID0gJyAnOwotCQkJCQl9Ci0KLQkJCQkJewotCQkJCQkJLy9TU0lECi0JCQkJCQlpZiAoUlRNUEdldENyaXRpY2FsUGFyYW1ldGVyKCJTU0lEIiwgdG1wYnVmLCAyNTYsIGJ1ZmZlcikpCi0JCQkJCQl7Ci0JCQkJCQkJaWYgKHN0cmxlbih0bXBidWYpIDw9IDMyKQotCQkJCQkJCXsKLQkJCSAJCQkJCXBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4gPSAoVUNIQVIpIHN0cmxlbih0bXBidWYpOwotCQkJCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5Tc2lkLCBORElTXzgwMl8xMV9MRU5HVEhfU1NJRCk7Ci0JCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHRtcGJ1ZiwgcEFkLT5Db21tb25DZmcuU3NpZExlbik7Ci0JCQkJCQkJCXBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiA9IHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW47Ci0JCQkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgTkRJU184MDJfMTFfTEVOR1RIX1NTSUQpOwotCQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHRtcGJ1ZiwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKLQkJCQkJCQkJcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuOwotCQkJCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgTkRJU184MDJfMTFfTEVOR1RIX1NTSUQpOwotCQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgdG1wYnVmLCBwQWQtPk1sbWVBdXguU3NpZExlbik7Ci0JCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooU1NJRD0lcylcbiIsIF9fZnVuY19fLCB0bXBidWYpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQl7Ci0JCQkJCQkvL05ldHdvcmtUeXBlCi0JCQkJCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiTmV0d29ya1R5cGUiLCB0bXBidWYsIDI1LCBidWZmZXIpKQotCQkJCQkJewotCQkJCQkJCXBBZC0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOwotCQkJCQkJCWlmIChzdHJjbXAodG1wYnVmLCAiQWRob2MiKSA9PSAwKQotCQkJCQkJCQlwQWQtPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0FESE9DOwotCQkJCQkJCWVsc2UgLy9EZWZhdWx0IEluZnJhc3RydWN0dXJlIG1vZGUKLQkJCQkJCQkJcEFkLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsKLQkJCQkJCQkvLyBSZXNldCBSYWxpbmsgc3VwcGxpY2FudCB0byBub3QgdXNlLCBpdCB3aWxsIGJlIHNldCB0byBzdGFydCB3aGVuIFVJIHNldCBQTUsga2V5Ci0JCQkJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7Ci0JCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihOZXR3b3JrVHlwZT0lZClcbiIsIF9fZnVuY19fLCBwQWQtPlN0YUNmZy5Cc3NUeXBlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvL0NoYW5uZWwKLQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ2hhbm5lbCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCi0JCQkJCXsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSAoVUNIQVIpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGFubmVsPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7Ci0JCQkJCX0KLQkJCQkJLy9XaXJlbGVzc01vZGUKLQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiV2lyZWxlc3NNb2RlIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKLQkJCQkJewotCQkJCQkJaW50IHZhbHVlICA9IDAsIG1heFBoeU1vZGUgPSBQSFlfMTFHOwotCi0JCQkJCQltYXhQaHlNb2RlID0gUEhZXzExTl81RzsKLQotCQkJCQkJdmFsdWUgPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCi0JCQkJCQlpZiAodmFsdWUgPD0gbWF4UGh5TW9kZSkKLQkJCQkJCXsKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gdmFsdWU7Ci0JCQkJCQl9Ci0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQaHlNb2RlPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKSk7Ci0JCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgLy9CYXNpY1JhdGUKLQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQmFzaWNSYXRlIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKLQkJCQkJewotCQkJCQkJcEFkLT5Db21tb25DZmcuQmFzaWNSYXRlQml0bWFwID0gKFVMT05HKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmFzaWNSYXRlPSVsZFxuIiwgcEFkLT5Db21tb25DZmcuQmFzaWNSYXRlQml0bWFwKSk7Ci0JCQkJCX0KLQkJCQkJLy9CZWFjb25QZXJpb2QKLQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQmVhY29uUGVyaW9kIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKLQkJCQkJewotCQkJCQkJcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kID0gKFVTSE9SVCkgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJlYWNvblBlcmlvZD0lZFxuIiwgcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kKSk7Ci0JCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgLy9UeFBvd2VyCi0JCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlR4UG93ZXIiLCB0bXBidWYsIDEwLCBidWZmZXIpKQotCQkJCQl7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IChVTE9ORykgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQotCQkJCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQgPSBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZTsKLQotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhQb3dlcj0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKSk7Ci0JCQkJCX0KLQkJCQkJLy9CR1Byb3RlY3Rpb24KLQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQkdQcm90ZWN0aW9uIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKLQkJCQkJewotCQkJCQkJc3dpdGNoIChzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApKQotCQkJCQkJewotCQkJCQkJCWNhc2UgMTogLy9BbHdheXMgT24KLQkJCQkJCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAyOiAvL0Fsd2F5cyBPRkYKLQkJCQkJCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMjsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAwOiAvL0FVVE8KLQkJCQkJCQlkZWZhdWx0OgotCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAwOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJHUHJvdGVjdGlvbj0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbikpOwotCQkJCQl9Ci0JCQkJCS8vT0xCQ0RldGVjdGlvbgotCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJEaXNhYmxlT0xCQyIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCi0JCQkJCXsKLQkJCQkJCXN3aXRjaCAoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSkKLQkJCQkJCXsKLQkJCQkJCQljYXNlIDE6IC8vZGlzYWJsZSBPTEJDIERldGVjdGlvbgotCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EaXNhYmxlT0xCQ0RldGVjdCA9IDE7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMDogLy9lbmFibGUgT0xCQyBEZXRlY3Rpb24KLQkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGlzYWJsZU9MQkNEZXRlY3QgPSAwOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQlkZWZhdWx0OgotCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EaXNhYmxlT0xCQ0RldGVjdD0gMDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJPTEJDRGV0ZWN0aW9uPSVsZFxuIiwgcEFkLT5Db21tb25DZmcuRGlzYWJsZU9MQkNEZXRlY3QpKTsKLQkJCQkJfQotCQkJCQkvL1R4UHJlYW1ibGUKLQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiVHhQcmVhbWJsZSIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCi0JCQkJCXsKLQkJCQkJCXN3aXRjaCAoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSkKLQkJCQkJCXsKLQkJCQkJCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVTaG9ydDoKLQkJCQkJCQkJcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFJ0ODAyXzExUHJlYW1ibGVTaG9ydDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlTG9uZzoKLQkJCQkJCQlkZWZhdWx0OgotCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUnQ4MDJfMTFQcmVhbWJsZUxvbmc7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhQcmVhbWJsZT0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpKTsKLQkJCQkJfQotCQkJCQkvL1JUU1RocmVzaG9sZAotCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJSVFNUaHJlc2hvbGQiLCB0bXBidWYsIDEwLCBidWZmZXIpKQotCQkJCQl7Ci0JCQkJCQlSdHNUaHJlc2ggPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCQkJCQkJaWYoIChSdHNUaHJlc2ggPj0gMSkgJiYgKFJ0c1RocmVzaCA8PSBNQVhfUlRTX1RIUkVTSE9MRCkgKQotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCAgPSAoVVNIT1JUKVJ0c1RocmVzaDsKLQkJCQkJCWVsc2UKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSBNQVhfUlRTX1RIUkVTSE9MRDsKLQotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRTVGhyZXNob2xkPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpKTsKLQkJCQkJfQotCQkJCQkvL0ZyYWdUaHJlc2hvbGQKLQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRnJhZ1RocmVzaG9sZCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCi0JCQkJCXsKLQkJCQkJCUZyYWdUaHJlc2ggPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCQkJCQkJcEFkLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IEZBTFNFOwotCi0JCQkJCQlpZiAoRnJhZ1RocmVzaCA+IE1BWF9GUkFHX1RIUkVTSE9MRCB8fCBGcmFnVGhyZXNoIDwgTUlOX0ZSQUdfVEhSRVNIT0xEKQotCQkJCQkJeyAvL2lsbGVnYWwgRnJhZ1RocmVzaCBzbyB3ZSBzZXQgaXQgdG8gZGVmYXVsdAotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gTUFYX0ZSQUdfVEhSRVNIT0xEOwotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBUUlVFOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoRnJhZ1RocmVzaCAlIDIgPT0gMSkKLQkJCQkJCXsKLQkJCQkJCQkvLyBUaGUgbGVuZ3RoIG9mIGVhY2ggZnJhZ21lbnQgc2hhbGwgYWx3YXlzIGJlIGFuIGV2ZW4gbnVtYmVyIG9mIG9jdGV0cywgZXhjZXB0IGZvciB0aGUgbGFzdCBmcmFnbWVudAotCQkJCQkJCS8vIG9mIGFuIE1TRFUgb3IgTU1QRFUsIHdoaWNoIG1heSBiZSBlaXRoZXIgYW4gZXZlbiBvciBhbiBvZGQgbnVtYmVyIG9mIG9jdGV0cy4KLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IChVU0hPUlQpKEZyYWdUaHJlc2ggLSAxKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IChVU0hPUlQpRnJhZ1RocmVzaDsKLQkJCQkJCX0KLQkJCQkJCS8vcEFkLT5Db21tb25DZmcuQWxsb3dGcmFnU2l6ZSA9IChwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkgLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIX0NSQzsKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZyYWdUaHJlc2hvbGQ9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSk7Ci0JCQkJCX0KLQkJCQkJLy9UeEJ1cnN0Ci0JCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlR4QnVyc3QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQotCQkJCQl7Ci0JCQkJCQlpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApICAvL0VuYWJsZQotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gVFJVRTsKLQkJCQkJCWVsc2UgLy9EaXNhYmxlCi0JCQkJCQkJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBGQUxTRTsKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4QnVyc3Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KSk7Ci0JCQkJCX0KLQotI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKLQkJCQkJLy9Qa3RBZ2dyZWdhdGUKLQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiUGt0QWdncmVnYXRlIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKLQkJCQkJewotCQkJCQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKSAgLy9FbmFibGUKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gVFJVRTsKLQkJCQkJCWVsc2UgLy9EaXNhYmxlCi0JCQkJCQkJcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9IEZBTFNFOwotI2lmZGVmIFBJR0dZQkFDS19TVVBQT1JUCi0JCQkJCQlwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSA9IHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGU7Ci0jZW5kaWYgLy8gUElHR1lCQUNLX1NVUFBPUlQgLy8KLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBrdEFnZ3JlZ2F0ZT0lZFxuIiwgcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkpOwotCQkJCQl9Ci0jZWxzZQotCQkJCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gRkFMU0U7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLmJQaWdneUJhY2tDYXBhYmxlID0gRkFMU0U7Ci0jZW5kaWYgLy8gQUdHUkVHQVRJT05fU1VQUE9SVCAvLwotCi0JCQkJCS8vIFdtbUNhcGFibGUKLQkJCQkJcnRtcF9yZWFkX3N0YV93bW1fcGFybXNfZnJvbV9maWxlKHBBZCwgdG1wYnVmLCBidWZmZXIpOwotCi0JCQkJCS8vU2hvcnRTbG90Ci0JCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlNob3J0U2xvdCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCi0JCQkJCXsKLQkJCQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCi0JCQkJCQkJcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSBUUlVFOwotCQkJCQkJZWxzZSAvL0Rpc2FibGUKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IEZBTFNFOwotCi0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTaG9ydFNsb3Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lKSk7Ci0JCQkJCX0KLQkJCQkJLy9JRUVFODAyMTFICi0JCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIklFRUU4MDIxMUgiLCB0bXBidWYsIDEwLCBidWZmZXIpKQotCQkJCQl7Ci0JCQkJCSAgICBmb3IgKGkgPSAwLCBtYWNwdHIgPSByc3RydG9rKHRtcGJ1ZiwiOyIpOyBtYWNwdHI7IG1hY3B0ciA9IHJzdHJ0b2soTlVMTCwiOyIpLCBpKyspCi0JCQkJCSAgICB7Ci0gICAgCQkJCQkJaWYoc2ltcGxlX3N0cnRvbChtYWNwdHIsIDAsIDEwKSAhPSAwKSAgLy9FbmFibGUKLSAgICAJCQkJCQkJcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPSBUUlVFOwotICAgIAkJCQkJCWVsc2UgLy9EaXNhYmxlCi0gICAgCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID0gRkFMU0U7Ci0KLSAgICAJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRUVFODAyMTFIPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCkpOwotCQkJCQkgICAgfQotCQkJCQl9Ci0JCQkJCS8vQ1NQZXJpb2QKLQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ1NQZXJpb2QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQotCQkJCQl7Ci0JCQkJCSAgICBpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApCi0JCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ1NQZXJpb2QgPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCQkJCQkJZWxzZQotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTUGVyaW9kID0gMDsKLQotICAgCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ1NQZXJpb2Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTUGVyaW9kKSk7Ci0JCQkJCX0KLQotCQkJCQkvL1JEUmVnaW9uCi0JCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlJEUmVnaW9uIiwgdG1wYnVmLCAxMjgsIGJ1ZmZlcikpCi0JCQkJCXsKLQkJCQkJCWlmICgoc3RybmNtcCh0bXBidWYsICJKQVBfVzUzIiwgNykgPT0gMCkgfHwgKHN0cm5jbXAodG1wYnVmLCAiamFwX3c1MyIsIDcpID09IDApKQotCQkJCQkJewotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gSkFQX1c1MzsKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDE1OwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoKHN0cm5jbXAodG1wYnVmLCAiSkFQX1c1NiIsIDcpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImphcF93NTYiLCA3KSA9PSAwKSkKLQkJCQkJCXsKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IEpBUF9XNTY7Ci0JCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKChzdHJuY21wKHRtcGJ1ZiwgIkpBUCIsIDMpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImphcCIsIDMpID09IDApKQotCQkJCQkJewotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gSkFQOwotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lID0gNTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgIGlmICgoc3RybmNtcCh0bXBidWYsICJGQ0MiLCAzKSA9PSAwKSB8fCAoc3RybmNtcCh0bXBidWYsICJmY2MiLCAzKSA9PSAwKSkKLQkJCQkJCXsKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IEZDQzsKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDU7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmICgoc3RybmNtcCh0bXBidWYsICJDRSIsIDIpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImNlIiwgMikgPT0gMCkpCi0JCQkJCQl7Ci0JCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gPSBDRTsKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDEzOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gQ0U7Ci0JCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKLQkJCQkJCX0KLQotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkRSZWdpb249JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IENFOwotCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKLQkJCQkJfQotCi0JCQkJCS8vV2lyZWxlc3NFdmVudAotCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXaXJlbGVzc0V2ZW50IiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKLQkJCQkJewotCQkJCQkgICAgaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKQotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50ID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCA9IDA7CS8vIGRpc2FibGUKLSAgIAkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldpcmVsZXNzRXZlbnQ9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KSk7Ci0JCQkJCX0KLQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiV2lGaVRlc3QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQotCQkJCQl7Ci0JCQkJCSAgICBpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApCi0JCQkJCQkJcEFkLT5Db21tb25DZmcuYldpRmlUZXN0PSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCQkJCQkJZWxzZQotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCA9IDA7CS8vIGRpc2FibGUKLQotICAgCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV2lGaVRlc3Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCkpOwotCQkJCQl9Ci0JCQkJCS8vQXV0aE1vZGUKLQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQXV0aE1vZGUiLCB0bXBidWYsIDEyOCwgYnVmZmVyKSkKLQkJCQkJewotCQkJCQkJewotCQkJCQkJCWlmICgoc3RyY21wKHRtcGJ1ZiwgIldFUEFVVE8iKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndlcGF1dG8iKSA9PSAwKSkKLQkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoOwotCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiU0hBUkVEIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJzaGFyZWQiKSA9PSAwKSkKLQkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7Ci0JCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJXUEFQU0siKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndwYXBzayIpID09IDApKQotCQkJCQkJCSAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKLQkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIldQQU5PTkUiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndwYW5vbmUiKSA9PSAwKSkKLQkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOwotCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiV1BBMlBTSyIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid3BhMnBzayIpID09IDApKQotCQkJCQkJCSAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7Ci0JCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJXUEEiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndwYSIpID09IDApKQotCQkJCQkJCSAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKLQkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIldQQTIiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndwYTIiKSA9PSAwKSkKLQkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOwotCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOwotCi0JCQkJICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7Ci0KLQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KEVuY3J5cFR5cGU9JWQpXG4iLCBfX2Z1bmNfXywgcEFkLT5TdGFDZmcuV2VwU3RhdHVzKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy9FbmNyeXBUeXBlCi0JCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkVuY3J5cFR5cGUiLCB0bXBidWYsIDEyOCwgYnVmZmVyKSkKLQkJCQkJewotCQkJCQkJewotCQkJCQkJCWlmICgoc3RyY21wKHRtcGJ1ZiwgIldFUCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid2VwIikgPT0gMCkpCi0JCQkJCQkJCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cwk9IE5kaXM4MDJfMTFXRVBFbmFibGVkOwotCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiVEtJUCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAidGtpcCIpID09IDApKQotCQkJCQkJCQlwQWQtPlN0YUNmZy5XZXBTdGF0dXMJPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOwotCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiQUVTIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJhZXMiKSA9PSAwKSkKLQkJCQkJCQkJcEFkLT5TdGFDZmcuV2VwU3RhdHVzCT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cwk9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQotCQkJCQkJCS8vIFVwZGF0ZSBhbGwgd2Vwc3RhdHVzIHJlbGF0ZWQKLQkJCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyCQk9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKLQkJCQkJCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciAJPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7Ci0JCQkJCQkJcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyAJPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7Ci0JCQkJCQkJcEFkLT5TdGFDZmcuYk1peENpcGhlciAJCT0gRkFMU0U7Ci0KLQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KEVuY3J5cFR5cGU9JWQpXG4iLCBfX2Z1bmNfXywgcEFkLT5TdGFDZmcuV2VwU3RhdHVzKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQl7Ci0JCQkJCQlpZihSVE1QR2V0Q3JpdGljYWxQYXJhbWV0ZXIoIldQQVBTSyIsIHRtcGJ1ZiwgNTEyLCBidWZmZXIpKQotCQkJCQkJewotCQkJCQkJCWludCAgICAgZXJyPTA7Ci0KLQkJCQkJCQl0bXBidWZbc3RybGVuKHRtcGJ1ZildID0gJ1wwJzsgLy8gbWFrZSBTVEEgY2FuIHByb2Nlc3MgLiReJiBmb3IgV1BBUFNLIGlucHV0Ci0KLQkJCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKLQkJCQkJCQkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCi0JCQkJCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotCQkJCQkJCQkpCi0JCQkJCQkJewotCQkJCQkJCQllcnIgPSAxOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmICgoc3RybGVuKHRtcGJ1ZikgPj0gOCkgJiYgKHN0cmxlbih0bXBidWYpIDwgNjQpKQotCQkJCQkJCXsKLQkJCQkJCQkJUGFzc3dvcmRIYXNoKChjaGFyICopdG1wYnVmLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCBrZXlNYXRlcmlhbCk7Ci0JCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywga2V5TWF0ZXJpYWwsIDMyKTsKLQotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmIChzdHJsZW4odG1wYnVmKSA9PSA2NCkKLQkJCQkJCQl7Ci0JCQkJCQkJCUF0b0godG1wYnVmLCBrZXlNYXRlcmlhbCwgMzIpOwotCQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QTUssIGtleU1hdGVyaWFsLCAzMik7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UKLQkJCQkJCQl7Ci0JCQkJCQkJCWVyciA9IDE7Ci0JCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOjooV1BBUFNLIGtleS1zdHJpbmcgcmVxdWlyZWQgOCB+IDY0IGNoYXJhY3RlcnMhKVxuIiwgX19mdW5jX18pKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlpZiAoZXJyID09IDApCi0JICAgICAgICAgICAgICAgICAgICAgICAgCQkJewotCSAgICAgICAgICAgICAgICAgICAgICAgIAkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKLQkJCQkJCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKLQkJCQkJCQkJewotCQkJCQkJCQkJLy8gU3RhcnQgU1RBIHN1cHBsaWNhbnQgc3RhdGUgbWFjaGluZQotCQkJCQkJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19TVEFSVDsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKLQkJCQkJCQkJfQotCi0JCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooV1BBUFNLPSVzKVxuIiwgX19mdW5jX18sIHRtcGJ1ZikpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vRGVmYXVsdEtleUlELCBLZXlUeXBlLCBLZXlTdHIKLQkJCQkJcnRtcF9yZWFkX2tleV9wYXJtc19mcm9tX2ZpbGUocEFkLCB0bXBidWYsIGJ1ZmZlcik7Ci0KLQkJCQkJSFRQYXJhbWV0ZXJzSG9vayhwQWQsIHRtcGJ1ZiwgYnVmZmVyKTsKLQotCQkJCQl7Ci0JCQkJCQkvL1BTTW9kZQotI2lmZGVmIFJUMjg2MAotCQkJCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlBTTW9kZSIsIHRtcGJ1ZiwgMzIsIGJ1ZmZlcikpCi0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQkJCQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJQU01vZGUiLCB0bXBidWYsIDEwLCBidWZmZXIpKQotI2VuZGlmCi0JCQkJCQl7Ci0JCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKQotCQkJCQkJCXsKLQkJCQkJCQkJaWYgKChzdHJjbXAodG1wYnVmLCAiTUFYX1BTUCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAibWF4X3BzcCIpID09IDApKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQkvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKLQkJCQkJCQkJCS8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgotCQkJCQkJCQkJLy8JICAgTWxtZVNldFBzbShwQWQsIFBXUl9TQVZFKTsKLQkJCQkJCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOwotCQkJCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCi0JCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOwotCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUDsKLQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDU7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJGYXN0X1BTUCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAiZmFzdF9wc3AiKSA9PSAwKQotCQkJCQkJCQkJfHwgKHN0cmNtcCh0bXBidWYsICJGQVNUX1BTUCIpID09IDApKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQkvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKLQkJCQkJCQkJCS8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgotCQkJCQkJCQkJLy8JICAgTWxtZVNldFBzbUJpdChwQWQsIFBXUl9TQVZFKTsKLQkJCQkJCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOwotCQkJCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCi0JCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUDsKLQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOwotCQkJCQkJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIkxlZ2FjeV9QU1AiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgImxlZ2FjeV9wc3AiKSA9PSAwKQotCQkJCQkJCQkJfHwgKHN0cmNtcCh0bXBidWYsICJMRUdBQ1lfUFNQIikgPT0gMCkpCi0JCQkJCQkJCXsKLQkJCQkJCQkJCS8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQotCQkJCQkJCQkJLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCi0JCQkJCQkJCQkvLwkgICBNbG1lU2V0UHNtQml0KHBBZCwgUFdSX1NBVkUpOwotCQkJCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7Ci0JCQkJCQkJCQlpZiAocEFkLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKLQkJCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1A7Ci0JCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQOwotCQkJCQkJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlCi0JCQkJCQkJCXsgLy9EZWZhdWx0IE5kaXM4MDJfMTFQb3dlck1vZGVDQU0KLQkJCQkJCQkJCS8vIGNsZWFyIFBTTSBiaXQgaW1tZWRpYXRlbHkKLQkJCQkJCQkJCU1sbWVTZXRQc21CaXQocEFkLCBQV1JfQUNUSVZFKTsKLQkJCQkJCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOwotCQkJCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCi0JCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07Ci0JCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07Ci0JCQkJCQkJCX0KLQkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUFNNb2RlPSVsZFxuIiwgcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCS8vIEZhc3RSb2FtaW5nCi0JCQkJCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiRmFzdFJvYW1pbmciLCB0bXBidWYsIDMyLCBidWZmZXIpKQotCQkJCQkJewotCQkJCQkJCWlmIChzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApID09IDApCi0JCQkJCQkJCXBBZC0+U3RhQ2ZnLmJGYXN0Um9hbWluZyA9IEZBTFNFOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJcEFkLT5TdGFDZmcuYkZhc3RSb2FtaW5nID0gVFJVRTsKLQotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZhc3RSb2FtaW5nPSVkXG4iLCBwQWQtPlN0YUNmZy5iRmFzdFJvYW1pbmcpKTsKLQkJCQkJCX0KLQkJCQkJCS8vIFJvYW1UaHJlc2hvbGQKLQkJCQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJSb2FtVGhyZXNob2xkIiwgdG1wYnVmLCAzMiwgYnVmZmVyKSkKLQkJCQkJCXsKLQkJCQkJCQlsb25nIGxJbmZvID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQotCQkJCQkJCWlmIChsSW5mbyA+IDkwIHx8IGxJbmZvIDwgNjApCi0JCQkJCQkJCXBBZC0+U3RhQ2ZnLmRCbVRvUm9hbSA9IC03MDsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCXBBZC0+U3RhQ2ZnLmRCbVRvUm9hbSA9IChDSEFSKSgtMSkqbEluZm87Ci0KLQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSb2FtVGhyZXNob2xkPSVkICBkQm1cbiIsIHBBZC0+U3RhQ2ZnLmRCbVRvUm9hbSkpOwotCQkJCQkJfQotCi0JCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJUR25XaWZpVGVzdCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCi0JCQkJCQl7Ci0JCQkJCQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSA9PSAwKQotCQkJCQkJCQlwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QgPSBGQUxTRTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCXBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCA9IFRSVUU7Ci0JCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRHbldpZmlUZXN0PSVkXG4iLCBwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gJXMgZG9lcyBub3QgaGF2ZSBhIHdyaXRlIG1ldGhvZFxuIiwgc3JjKSk7Ci0JCQl9Ci0KLQkJCXJldHZhbD1maWxwX2Nsb3NlKHNyY2YsTlVMTCk7Ci0KLQkJCWlmIChyZXR2YWwpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEVycm9yICVkIGNsb3NpbmcgJXNcbiIsIC1yZXR2YWwsIHNyYykpOwotCQkJfQotCQl9Ci0JfQotCi0Jc2V0X2ZzKG9yZ2ZzKTsKLQotCWtmcmVlKGJ1ZmZlcik7Ci0Ja2ZyZWUodG1wYnVmKTsKLQotCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci19Ci0KLXN0YXRpYyB2b2lkCUhUUGFyYW1ldGVyc0hvb2soCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JQ0hBUgkJICAqcFZhbHVlU3RyLAotCUlOCUNIQVIJCSAgKnBJbnB1dCkKLXsKLQotCUlOVCBWYWx1ZTsKLQotICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9QUk9URUNUIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKLSAgICB7Ci0gICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLSAgICAgICAgaWYgKFZhbHVlID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QgPSBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QgPSBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBQcm90ZWN0aW9uICA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKLSAgICB9Ci0KLSAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfTUlNT1BTRW5hYmxlIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKLSAgICB7Ci0gICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLSAgICAgICAgaWYgKFZhbHVlID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUgPSBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUgPSBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBNSU1PUFNFbmFibGUgID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOwotICAgIH0KLQotCi0gICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX01JTU9QU01vZGUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQotICAgIHsKLSAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotICAgICAgICBpZiAoVmFsdWUgPiBNTVBTX0VOQUJMRSkKLSAgICAgICAgewotCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gTU1QU19FTkFCTEU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvL1RPRE86IGFkZCBtaW1vIHBvd2VyIHNhdmluZyBtZWNoYW5pc20KLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IE1NUFNfRU5BQkxFOwotCQkJLy9wQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBWYWx1ZTsKLSAgICAgICAgfQotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTUlNT1BTIE1vZGUgID0gJWRcbiIsIFZhbHVlKSk7Ci0gICAgfQotCi0gICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0JBRGVjbGluZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCi0gICAgewotICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0gICAgICAgIGlmIChWYWx1ZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID0gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogQkEgRGVjbGluZSAgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7Ci0gICAgfQotCi0KLSAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfRGlzYWJsZVJlb3JkZXJpbmciLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQotICAgIHsKLSAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotICAgICAgICBpZiAoVmFsdWUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID0gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPSBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBEaXNhYmxlUmVvcmRlcmluZyAgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7Ci0gICAgfQotCi0gICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0F1dG9CQSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCi0gICAgewotICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0gICAgICAgIGlmIChWYWx1ZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gRkFMU0U7Ci0JICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBCQV9OT1RVU0U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gVFJVRTsKLQkgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9IElNTUVEX0JBOwotICAgICAgICB9Ci0gICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBOwotCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5OwotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogQXV0byBCQSAgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7Ci0gICAgfQotCi0JLy8gVHhfK0hUQyBmcmFtZQotICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9IVEMiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQotCXsKLQkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotCQlpZiAoVmFsdWUgPT0gMCkKLQkJewotCQkJcEFkLT5IVENFbmFibGUgPSBGQUxTRTsKLQkJfQotCQllbHNlCi0JCXsKLSAgICAgICAgICAgIAkJcEFkLT5IVENFbmFibGUgPSBUUlVFOwotCQl9Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBUeCArSFRDIGZyYW1lID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOwotCX0KLQotCS8vIEVuYWJsZSBIVCBMaW5rIEFkYXB0YXRpb24gQ29udHJvbAotCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9MaW5rQWRhcHQiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQotCXsKLQkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotCQlpZiAoVmFsdWUgPT0gMCkKLQkJewotCQkJcEFkLT5iTGlua0FkYXB0ID0gRkFMU0U7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7Ci0JCQlwQWQtPmJMaW5rQWRhcHQgPSBUUlVFOwotCQl9Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBMaW5rIEFkYXB0YXRpb24gQ29udHJvbCA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSgrSFRDKSIpKTsKLQl9Ci0KLQkvLyBSZXZlcnNlIERpcmVjdGlvbiBNZWNoYW5pc20KLSAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfUkRHIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQkJaWYgKFZhbHVlID09IDApCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJSZGcgPSBGQUxTRTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBBZC0+SFRDRW5hYmxlID0gVFJVRTsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJSZGcgPSBUUlVFOwotCQl9Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBSREcgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUoK0hUQykiKSk7Ci0JfQotCi0KLQotCi0JLy8gVHggQS1NU1VEID8KLSAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfQU1TRFUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQotCXsKLQkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotCQlpZiAoVmFsdWUgPT0gMCkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlID0gRkFMU0U7Ci0JCX0KLQkJZWxzZQotCQl7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUgPSBUUlVFOwotCQl9Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBUeCBBLU1TRFUgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7Ci0JfQotCi0JLy8gTVBEVSBEZW5zaXR5Ci0gICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX01wZHVEZW5zaXR5IiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQkJaWYgKFZhbHVlIDw9NyAmJiBWYWx1ZSA+PSAwKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSBWYWx1ZTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBNUERVIERlbnNpdHkgPSAlZFxuIiwgVmFsdWUpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IDQ7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTVBEVSBEZW5zaXR5ID0gJWQgKERlZmF1bHQpXG4iLCA0KSk7Ci0JCX0KLQl9Ci0KLQkvLyBNYXggUnggQkEgV2luZG93IFNpemUKLSAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfQkFXaW5TaXplIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQotCQlpZiAoVmFsdWUgPj0xICYmIFZhbHVlIDw9IDY0KQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gVmFsdWU7Ci0JCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gVmFsdWU7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogQkEgV2luZHcgU2l6ZSA9ICVkXG4iLCBWYWx1ZSkpOwotCQl9Ci0JCWVsc2UKLQkJewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDY0OwotCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDY0OwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEJBIFdpbmR3IFNpemUgPSA2NCAoRGVmdWFsdClcbiIpKTsKLQkJfQotCi0JfQotCi0JLy8gR3VhcmQgSW50ZXJ2YWwKLQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfR0kiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQotCXsKLQkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotCi0JCWlmIChWYWx1ZSA9PSBHSV80MDApCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJID0gR0lfNDAwOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7Ci0JCX0KLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogR3VhcmQgSW50ZXJ2YWwgPSAlc1xuIiwgKFZhbHVlPT1HSV80MDApID8gIjQwMCIgOiAiODAwIiApKTsKLQl9Ci0KLQkvLyBIVCBPcGVyYXRpb24gTW9kZSA6IE1peGVkIE1vZGUgLCBHcmVlbiBGaWVsZAotCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9PcE1vZGUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQotCXsKLQkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotCi0JCWlmIChWYWx1ZSA9PSBIVE1PREVfR0YpCi0JCXsKLQotCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSAgPSBIVE1PREVfR0Y7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFICA9IEhUTU9ERV9NTTsKLQkJfQotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBPcGVyYXRlIE1vZGUgPSAlc1xuIiwgKFZhbHVlPT1IVE1PREVfR0YpID8gIkdyZWVuIEZpZWxkIiA6ICJNaXhlZCBNb2RlIiApKTsKLQl9Ci0KLQkvLyBGaXhlZCBUeCBtb2RlIDogQ0NLLCBPRkRNCi0JaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkZpeGVkVHhNb2RlIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKLQl7Ci0JCVVDSEFSCWZpeF90eF9tb2RlOwotCi0JCXsKLQkJCWZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX0hUOwotCi0JCQlpZiAoc3RyY21wKHBWYWx1ZVN0ciwgIk9GRE0iKSA9PSAwIHx8IHN0cmNtcChwVmFsdWVTdHIsICJvZmRtIikgPT0gMCkKLQkJCXsKLQkJCQlmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9PRkRNOwotCQkJfQotCQkJZWxzZSBpZiAoc3RyY21wKHBWYWx1ZVN0ciwgIkNDSyIpID09IDAgfHwgc3RyY21wKHBWYWx1ZVN0ciwgImNjayIpID09IDApCi0JCQl7Ci0JCSAgICAgICAgZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfQ0NLOwotCQkJfQotCQkJZWxzZSBpZiAoc3RyY21wKHBWYWx1ZVN0ciwgIkhUIikgPT0gMCB8fCBzdHJjbXAocFZhbHVlU3RyLCAiaHQiKSA9PSAwKQotCQkJewotCQkgICAgICAgIGZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX0hUOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQkJCQkvLyAxIDogQ0NLCi0JCQkJLy8gMiA6IE9GRE0KLQkJCQkvLyBvdGhlcndpc2UgOiBIVAotCQkJCWlmIChWYWx1ZSA9PSBGSVhFRF9UWE1PREVfQ0NLIHx8IFZhbHVlID09IEZJWEVEX1RYTU9ERV9PRkRNKQotCQkJCQlmaXhfdHhfbW9kZSA9IFZhbHVlOwotCQkJCWVsc2UKLQkJCQkJZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfSFQ7Ci0JCX0KLQotCQkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSA9IGZpeF90eF9tb2RlOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRml4ZWQgVHggTW9kZSA9ICVkXG4iLCBmaXhfdHhfbW9kZSkpOwotCi0JCX0KLQl9Ci0KLQotCS8vIENoYW5uZWwgV2lkdGgKLQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfQlciLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQotCXsKLQkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotCi0JCWlmIChWYWx1ZSA9PSBCV180MCkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzQwOwotCQl9Ci0JCWVsc2UKLQkJewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOwotCQl9Ci0KLSNpZmRlZiBNQ0FTVF9SQVRFX1NQRUNJRklDCi0JCXBBZC0+Q29tbW9uQ2ZnLk1DYXN0UGh5TW9kZS5maWVsZC5CVyA9IHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVzsKLSNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCi0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IENoYW5uZWwgV2lkdGggPSAlc1xuIiwgKFZhbHVlPT1CV180MCkgPyAiNDAgTUh6IiA6ICIyMCBNSHoiICkpOwotCX0KLQotCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9FWFRDSEEiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQotCXsKLQkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotCi0JCWlmIChWYWx1ZSA9PSAwKQotCQl7Ci0KLQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgID0gRVhUQ0hBX0JFTE9XOwotCQl9Ci0JCWVsc2UKLQkJewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKLQkJfQotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBFeHQgQ2hhbm5lbCA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkJFTE9XIiA6ICJBQk9WRSIgKSk7Ci0JfQotCi0JLy8gTVNDCi0JaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX01DUyIsIHBWYWx1ZVN0ciwgNTAsIHBJbnB1dCkpCi0JewotCQl7Ci0JCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0KLQkJCWlmICgoVmFsdWUgPj0gMCAmJiBWYWx1ZSA8PSAyMykgfHwgKFZhbHVlID09IDMyKSkgLy8gMyozCi0JCXsKLQkJCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAgPSBWYWx1ZTsKLQkJCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBNQ1MgPSAlZFxuIiwgcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAgPSBNQ1NfQVVUTzsKLQkJCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1DUyA9IEFVVE9cbiIpKTsKLQkJfQotCX0KLQl9Ci0KLQkvLyBTVEJDCi0gICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX1NUQkMiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQotCXsKLQkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotCQlpZiAoVmFsdWUgPT0gU1RCQ19VU0UpCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDID0gU1RCQ19VU0U7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKLQkJfQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogU1RCQyA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQykpOwotCX0KLQotCS8vIDQwX01oel9JbnRvbGVyYW50Ci0JaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUXzQwTUhaX0lOVE9MRVJBTlQiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQotCXsKLQkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotCQlpZiAoVmFsdWUgPT0gMCkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuYkZvcnR5X01oel9JbnRvbGVyYW50ID0gRkFMU0U7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5iRm9ydHlfTWh6X0ludG9sZXJhbnQgPSBUUlVFOwotCQl9Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiA0ME1IWiBJTlRPTEVSQU5UID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJGb3J0eV9NaHpfSW50b2xlcmFudCkpOwotCX0KLQkvL0hUX1R4U3RyZWFtCi0JaWYoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfVHhTdHJlYW0iLCBwVmFsdWVTdHIsIDEwLCBwSW5wdXQpKQotCXsKLQkJc3dpdGNoIChzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApKQotCQl7Ci0JCQljYXNlIDE6Ci0JCQkJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSAxOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID0gMjsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzogLy8gMyozCi0JCQlkZWZhdWx0OgotCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID0gMzsKLQotCQkJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPCBSQUxJTktfMjg4M19WRVJTSU9OKQotCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IDI7IC8vIG9ubHkgMiB0eCBzdHJlYW1zIGZvciBSVDI4NjAgc2VyaWVzCi0JCQkJYnJlYWs7Ci0JCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IFR4IFN0cmVhbSA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSkpOwotCX0KLQkvL0hUX1J4U3RyZWFtCi0JaWYoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfUnhTdHJlYW0iLCBwVmFsdWVTdHIsIDEwLCBwSW5wdXQpKQotCXsKLQkJc3dpdGNoIChzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApKQotCQl7Ci0JCQljYXNlIDE6Ci0JCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAxOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID0gMjsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzoKLQkJCWRlZmF1bHQ6Ci0JCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAzOwotCi0JCQkJaWYgKHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18yODgzX1ZFUlNJT04pCi0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID0gMjsgLy8gb25seSAyIHJ4IHN0cmVhbXMgZm9yIFJUMjg2MCBzZXJpZXMKLQkJCQlicmVhazsKLQkJfQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogUnggU3RyZWFtID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X3VzYi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF91c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWE3ZWI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF91c2IuYwpAQCAtMCwwICsxLDc5OSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydHVzYl9idWxrLmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJTW9kaWZpY2F0aW9uIGxvZ3MKKworKi8KKworI2luY2x1ZGUgInJ0X2NvbmZpZy5oIgorCit2b2lkIGR1bXBfdXJiKHN0cnVjdCB1cmIgKnB1cmIpCit7CisJcHJpbnRrKCJ1cmIgICAgICAgICAgICAgICAgICA6MHglMDhseFxuIiwgKHVuc2lnbmVkIGxvbmcpcHVyYik7CisJcHJpbnRrKCJcdGRldiAgICAgICAgICAgICAgICAgICA6MHglMDhseFxuIiwgKHVuc2lnbmVkIGxvbmcpcHVyYi0+ZGV2KTsKKwlwcmludGsoIlx0XHRkZXYtPnN0YXRlICAgICAgICAgIDoweCVkXG4iLCBwdXJiLT5kZXYtPnN0YXRlKTsKKwlwcmludGsoIlx0cGlwZSAgICAgICAgICAgICAgICAgIDoweCUwOHhcbiIsIHB1cmItPnBpcGUpOworCXByaW50aygiXHRzdGF0dXMgICAgICAgICAgICAgICAgOiVkXG4iLCBwdXJiLT5zdGF0dXMpOworCXByaW50aygiXHR0cmFuc2Zlcl9mbGFncyAgICAgICAgOjB4JTA4eFxuIiwgcHVyYi0+dHJhbnNmZXJfZmxhZ3MpOworCXByaW50aygiXHR0cmFuc2Zlcl9idWZmZXIgICAgICAgOjB4JTA4bHhcbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXB1cmItPnRyYW5zZmVyX2J1ZmZlcik7CisJcHJpbnRrKCJcdHRyYW5zZmVyX2J1ZmZlcl9sZW5ndGg6JWRcbiIsIHB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOworCXByaW50aygiXHRhY3R1YWxfbGVuZ3RoICAgICAgICAgOiVkXG4iLCBwdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwlwcmludGsoIlx0c2V0dXBfcGFja2V0ICAgICAgICAgIDoweCUwOGx4XG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZylwdXJiLT5zZXR1cF9wYWNrZXQpOworCXByaW50aygiXHRzdGFydF9mcmFtZSAgICAgICAgICAgOiVkXG4iLCBwdXJiLT5zdGFydF9mcmFtZSk7CisJcHJpbnRrKCJcdG51bWJlcl9vZl9wYWNrZXRzICAgICA6JWRcbiIsIHB1cmItPm51bWJlcl9vZl9wYWNrZXRzKTsKKwlwcmludGsoIlx0aW50ZXJ2YWwgICAgICAgICAgICAgIDolZFxuIiwgcHVyYi0+aW50ZXJ2YWwpOworCXByaW50aygiXHRlcnJvcl9jb3VudCAgICAgICAgICAgOiVkXG4iLCBwdXJiLT5lcnJvcl9jb3VudCk7CisJcHJpbnRrKCJcdGNvbnRleHQgICAgICAgICAgICAgICA6MHglMDhseFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpcHVyYi0+Y29udGV4dCk7CisJcHJpbnRrKCJcdGNvbXBsZXRlICAgICAgICAgICAgICA6MHglMDhseFxuXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZylwdXJiLT5jb21wbGV0ZSk7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgQ3JlYXRlIGtlcm5lbCB0aHJlYWRzICYgdGFza2xldHMuCisKK0FyZ3VtZW50czoKKyAgICAqbmV0X2RldgkJCVBvaW50ZXIgdG8gd2lyZWxlc3MgbmV0IGRldmljZSBpbnRlcmZhY2UKKworUmV0dXJuIFZhbHVlOgorCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwlORElTX1NUQVRVU19GQUlMVVJFCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgUnRtcE1nbXRUYXNrSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJc3RydWN0IHJ0X3J0bXBfb3NfdGFzayAqcFRhc2s7CisJaW50IHN0YXR1czsKKworCS8qCisJICAgQ3JlYXQgVGltZXJRIFRocmVhZCwgV2UgbmVlZCBpbml0IHRpbWVyUSByZWxhdGVkIHN0cnVjdHVyZSBiZWZvcmUgY3JlYXRlIHRoZSB0aW1lciB0aHJlYWQuCisJICovCisJUnRtcFRpbWVyUUluaXQocEFkKTsKKworCXBUYXNrID0gJnBBZC0+dGltZXJUYXNrOworCVJ0bXBPU1Rhc2tJbml0KHBUYXNrLCAiUnRtcFRpbWVyVGFzayIsIHBBZCk7CisJc3RhdHVzID0gUnRtcE9TVGFza0F0dGFjaChwVGFzaywgUnRtcFRpbWVyUVRocmVhZCwgcFRhc2spOworCWlmIChzdGF0dXMgPT0gTkRJU19TVEFUVVNfRkFJTFVSRSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5hYmxlIHRvIHN0YXJ0IFJ0bXBUaW1lclFUaHJlYWRcbiIsCisJCSAgICAgICBSVE1QX09TX05FVERFVl9HRVRfREVWTkFNRShwQWQtPm5ldF9kZXYpKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJLyogQ3JlYXQgTUxNRSBUaHJlYWQgKi8KKwlwVGFzayA9ICZwQWQtPm1sbWVUYXNrOworCVJ0bXBPU1Rhc2tJbml0KHBUYXNrLCAiUnRtcE1sbWVUYXNrIiwgcEFkKTsKKwlzdGF0dXMgPSBSdG1wT1NUYXNrQXR0YWNoKHBUYXNrLCBNbG1lVGhyZWFkLCBwVGFzayk7CisJaWYgKHN0YXR1cyA9PSBORElTX1NUQVRVU19GQUlMVVJFKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gc3RhcnQgTWxtZVRocmVhZFxuIiwKKwkJICAgICAgIFJUTVBfT1NfTkVUREVWX0dFVF9ERVZOQU1FKHBBZC0+bmV0X2RldikpOworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwkvKiBDcmVhdCBDb21tYW5kIFRocmVhZCAqLworCXBUYXNrID0gJnBBZC0+Y21kUVRhc2s7CisJUnRtcE9TVGFza0luaXQocFRhc2ssICJSdG1wQ21kUVRhc2siLCBwQWQpOworCXN0YXR1cyA9IFJ0bXBPU1Rhc2tBdHRhY2gocFRhc2ssIFJUVVNCQ21kVGhyZWFkLCBwVGFzayk7CisJaWYgKHN0YXR1cyA9PSBORElTX1NUQVRVU19GQUlMVVJFKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gc3RhcnQgUlRVU0JDbWRUaHJlYWRcbiIsCisJCSAgICAgICBSVE1QX09TX05FVERFVl9HRVRfREVWTkFNRShwQWQtPm5ldF9kZXYpKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgQ2xvc2Uga2VybmVsIHRocmVhZHMuCisKK0FyZ3VtZW50czoKKwkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIE5PTkUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUnRtcE1nbXRUYXNrRXhpdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpwVGFzazsKKworCS8qIFNsZWVwIDUwIG1pbGxpc2Vjb25kcyBzbyBwZW5kaW5nIGlvIG1pZ2h0IGZpbmlzaCBub3JtYWxseSAqLworCVJUTVB1c2VjRGVsYXkoNTAwMDApOworCisJLyogV2Ugd2FudCB0byB3YWl0IHVudGlsIGFsbCBwZW5kaW5nIHJlY2VpdmVzIGFuZCBzZW5kcyB0byB0aGUgKi8KKwkvKiBkZXZpY2Ugb2JqZWN0LiBXZSBjYW5jZWwgYW55ICovCisJLyogaXJwcy4gV2FpdCB1bnRpbCBzZW5kcyBhbmQgcmVjZWl2ZXMgaGF2ZSBzdG9wcGVkLiAqLworCVJUVVNCQ2FuY2VsUGVuZGluZ0lSUHMocEFkKTsKKworCS8qIFdlIG5lZWQgY2xlYXIgdGltZXJRIHJlbGF0ZWQgc3RydWN0dXJlIGJlZm9yZSBleGl0cyBvZiB0aGUgdGltZXIgdGhyZWFkLiAqLworCVJ0bXBUaW1lclFFeGl0KHBBZCk7CisKKwkvKiBUZXJtaW5hdGUgTWxtZSBUaHJlYWQgKi8KKwlwVGFzayA9ICZwQWQtPm1sbWVUYXNrOworCXJldCA9IFJ0bXBPU1Rhc2tLaWxsKHBUYXNrKTsKKwlpZiAocmV0ID09IE5ESVNfU1RBVFVTX0ZBSUxVUkUpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IGtpbGwgdGFzayglcykgZmFpbGVkIVxuIiwKKwkJCQkJICBSVE1QX09TX05FVERFVl9HRVRfREVWTkFNRShwQWQtPgorCQkJCQkJCQkgICAgIG5ldF9kZXYpLAorCQkJCQkgIHBUYXNrLT50YXNrTmFtZSkpOworCX0KKworCS8qIFRlcm1pbmF0ZSBjbWRRIHRocmVhZCAqLworCXBUYXNrID0gJnBBZC0+Y21kUVRhc2s7CisjaWZkZWYgS1RIUkVBRF9TVVBQT1JUCisJaWYgKHBUYXNrLT5rdGhyZWFkX3Rhc2spCisjZWxzZQorCUNIRUNLX1BJRF9MRUdBTElUWShwVGFzay0+dGFza1BJRCkKKyNlbmRpZgorCXsKKwkJbWIoKTsKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7CisJCXBBZC0+Q21kUS5DbWRRU3RhdGUgPSBSVE1QX1RBU0tfU1RBVF9TVE9QRUQ7CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCQltYigpOworCQkvKlJUVVNCQ01EVXAocEFkKTsgKi8KKwkJcmV0ID0gUnRtcE9TVGFza0tpbGwocFRhc2spOworCQlpZiAocmV0ID09IE5ESVNfU1RBVFVTX0ZBSUxVUkUpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBraWxsIHRhc2soJXMpIGZhaWxlZCFcbiIsCisJCQkJCQkgIFJUTVBfT1NfTkVUREVWX0dFVF9ERVZOQU1FCisJCQkJCQkgIChwQWQtPm5ldF9kZXYpLAorCQkJCQkJICBwVGFzay0+dGFza05hbWUpKTsKKwkJfQorCQlwQWQtPkNtZFEuQ21kUVN0YXRlID0gUlRNUF9UQVNLX1NUQVRfVU5LTk9XTjsKKwl9CisKKwkvKiBUZXJtaW5hdGUgdGltZXIgdGhyZWFkICovCisJcFRhc2sgPSAmcEFkLT50aW1lclRhc2s7CisJcmV0ID0gUnRtcE9TVGFza0tpbGwocFRhc2spOworCWlmIChyZXQgPT0gTkRJU19TVEFUVVNfRkFJTFVSRSkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczoga2lsbCB0YXNrKCVzKSBmYWlsZWQhXG4iLAorCQkJCQkgIFJUTVBfT1NfTkVUREVWX0dFVF9ERVZOQU1FKHBBZC0+CisJCQkJCQkJCSAgICAgbmV0X2RldiksCisJCQkJCSAgcFRhc2stPnRhc2tOYW1lKSk7CisJfQorCit9CisKK3N0YXRpYyB2b2lkIHJ0dXNiX2RhdGFvdXRfY29tcGxldGUodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZDsKKwlzdHJ1Y3QgdXJiICpwVXJiOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dDsKKwl1OCBCdWxrT3V0UGlwZUlkOworCWludCBTdGF0dXM7CisJdW5zaWduZWQgbG9uZyBJcnFGbGFnczsKKworCXBVcmIgPSAoc3RydWN0IHVyYiAqKWRhdGE7CisJcEhUVFhDb250ZXh0ID0gKHN0cnVjdCBydF9odF90eF9jb250ZXh0ICopcFVyYi0+Y29udGV4dDsKKwlwQWQgPSBwSFRUWENvbnRleHQtPnBBZDsKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKwlTdGF0dXMgPSBwVXJiLT5zdGF0dXM7CisKKwkvKiBTdG9yZSBCdWxrT3V0IFBpcGVJZCAqLworCUJ1bGtPdXRQaXBlSWQgPSBwSFRUWENvbnRleHQtPkJ1bGtPdXRQaXBlSWQ7CisJcEFkLT5CdWxrT3V0RGF0YU9uZVNlY0NvdW50Kys7CisKKwkvKkRCR1BSSU5UKFJUX0RFQlVHX0xPVUQsICgiRG9uZS1CKCVkKTpJPTB4JWx4LCBDV1Bvcz0lbGQsIE5CUG9zPSVsZCwgRU5CUG9zPSVsZCwgYkNvcHk9JWQhXG4iLCBCdWxrT3V0UGlwZUlkLCBpbl9pbnRlcnJ1cHQoKSwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCAqLworCS8qICAgICAgICAgICAgICBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkKSk7ICovCisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJcEFkLT5CdWxrT3V0UGVuZGluZ1tCdWxrT3V0UGlwZUlkXSA9IEZBTFNFOworCXBIVFRYQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbQnVsa091dFBpcGVJZF0gPSAwOworCisJaWYgKFN0YXR1cyA9PSBVU0JfU1RfTk9FUlJPUikgeworCQlwQWQtPkJ1bGtPdXRDb21wbGV0ZSsrOworCisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisJCXBBZC0+Q291bnRlcnM4MDIzLkdvb2RUcmFuc21pdHMrKzsKKwkJLypSVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOyAqLworCQlGUkVFX0hUVFhfUklORyhwQWQsIEJ1bGtPdXRQaXBlSWQsIHBIVFRYQ29udGV4dCk7CisJCS8qUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOyAqLworCisJfSBlbHNlCQkJLyogU1RBVFVTX09USEVSICovCisJeworCQl1OCAqcEJ1ZjsKKworCQlwQWQtPkJ1bGtPdXRDb21wbGV0ZU90aGVyKys7CisKKwkJcEJ1ZiA9CisJCSAgICAmcEhUVFhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuCisJCSAgICBXaXJlbGVzc1BhY2tldFtwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb25dOworCisJCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJCQkJCSAgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJICBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QgfAorCQkJCQkgIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKSB7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKwkJCXBBZC0+YnVsa1Jlc2V0UGlwZWlkID0gQnVsa091dFBpcGVJZDsKKwkJCXBBZC0+YnVsa1Jlc2V0UmVxW0J1bGtPdXRQaXBlSWRdID0gcEFkLT5CdWxrT3V0UmVxOworCQl9CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwKKwkJCSAgICAgKCJCdWxrT3V0RGF0YVBhY2tldCBmYWlsZWQ6IFJlYXNvbkNvZGU9JWQhXG4iLAorCQkJICAgICAgU3RhdHVzKSk7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwKKwkJCSAgICAgKCJcdD4+QnVsa091dCBSZXE9MHglbHgsIENvbXBsZXRlPTB4JWx4LCBPdGhlcj0weCVseFxuIiwKKwkJCSAgICAgIHBBZC0+QnVsa091dFJlcSwgcEFkLT5CdWxrT3V0Q29tcGxldGUsCisJCQkgICAgICBwQWQtPkJ1bGtPdXRDb21wbGV0ZU90aGVyKSk7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwKKwkJCSAgICAgKCJcdD4+QnVsa091dCBIZWFkZXI6JXggJXggJXggJXggJXggJXggJXggJXhcbiIsCisJCQkgICAgICBwQnVmWzBdLCBwQnVmWzFdLCBwQnVmWzJdLCBwQnVmWzNdLCBwQnVmWzRdLAorCQkJICAgICAgcEJ1Zls1XSwgcEJ1Zls2XSwgcEJ1Zls3XSkpOworCQkvKkRCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCI+PkJ1bGtPdXRDb21wbGV0ZUNhbmNlbD0weCV4LCBCdWxrT3V0Q29tcGxldGVPdGhlcj0weCV4XG4iLCBwQWQtPkJ1bGtPdXRDb21wbGV0ZUNhbmNlbCwgcEFkLT5CdWxrT3V0Q29tcGxldGVPdGhlcikpOyAqLworCisJfQorCisJLyogKi8KKwkvKiBiSW5Vc2UgPSBUUlVFLCBtZWFucyBzb21lIHByb2Nlc3MgYXJlIGZpbGxpbmcgVFggZGF0YSwgYWZ0ZXIgdGhhdCBtdXN0IHR1cm4gb24gYldhaXRpbmdCdWxrT3V0ICovCisJLyogYldhaXRpbmdCdWxrT3V0ID0gVFJVRSwgbWVhbnMgdGhlIFRYIGRhdGEgYXJlIHdhaXRpbmcgZm9yIGJ1bGsgb3V0LiAqLworCS8qICovCisJLypSVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOyAqLworCWlmICgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiAhPQorCSAgICAgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKQorCSAgICAmJiAocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiAhPQorCQkocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgOCkpCisJICAgICYmICFSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsCisJCQkJICAgICAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBRyA8PAorCQkJCSAgICAgIEJ1bGtPdXRQaXBlSWQpKSkgeworCQkvKiBJbmRpY2F0ZSBUaGVyZSBpcyBkYXRhIGF2YWxpYWJsZSAqLworCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwKKwkJCQkgICAgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PAorCQkJCSAgICAgQnVsa091dFBpcGVJZCkpOworCX0KKwkvKlJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsgKi8KKworCS8qIEFsd2F5cyBjYWxsIEJ1bGsgcm91dGluZSwgZXZlbiByZXNldCBidWxrLiAqLworCS8qIFRoZSBwcm90ZWN0aW9uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lICovCisJUlRVU0JLaWNrQnVsa091dChwQWQpOworfQorCitzdGF0aWMgdm9pZCBydHVzYl9udWxsX2ZyYW1lX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCXN0cnVjdCBydF90eF9jb250ZXh0ICpwTnVsbENvbnRleHQ7CisJc3RydWN0IHVyYiAqcFVyYjsKKwlpbnQgU3RhdHVzOworCXVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKKworCXBVcmIgPSAoc3RydWN0IHVyYiAqKWRhdGE7CisJcE51bGxDb250ZXh0ID0gKHN0cnVjdCBydF90eF9jb250ZXh0ICopcFVyYi0+Y29udGV4dDsKKwlwQWQgPSBwTnVsbENvbnRleHQtPnBBZDsKKwlTdGF0dXMgPSBwVXJiLT5zdGF0dXM7CisKKwkvKiBSZXNldCBOdWxsIGZyYW1lIGNvbnRleHQgZmxhZ3MgKi8KKwlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKKwlwTnVsbENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwlwTnVsbENvbnRleHQtPkluVXNlID0gRkFMU0U7CisJcEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9IEZBTFNFOworCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbMF0gPSAwOworCisJaWYgKFN0YXR1cyA9PSBVU0JfU1RfTk9FUlJPUikgeworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIGlycUZsYWcpOworCisJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7CisJfSBlbHNlCQkJLyogU1RBVFVTX09USEVSICovCisJeworCQlpZiAoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKSAmJgorCQkgICAgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpICYmCisJCSAgICAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkgJiYKKwkJICAgICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKSkgeworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAgICAgKCJCdWxrIE91dCBOdWxsIEZyYW1lIEZhaWxlZCwgUmVhc29uQ29kZT0lZCFcbiIsCisJCQkJICAgICAgU3RhdHVzKSk7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKwkJCXBBZC0+YnVsa1Jlc2V0UGlwZWlkID0KKwkJCSAgICAoTUdNVFBJUEVJRFggfCBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRyk7CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIGlycUZsYWcpOworCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsCisJCQkJCQlOVUxMLCAwKTsKKwkJfSBlbHNlIHsKKwkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7CisJCX0KKwl9CisKKwkvKiBBbHdheXMgY2FsbCBCdWxrIHJvdXRpbmUsIGV2ZW4gcmVzZXQgYnVsay4gKi8KKwkvKiBUaGUgcHJvdGVjdGlvb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUgKi8KKwlSVFVTQktpY2tCdWxrT3V0KHBBZCk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0dXNiX3J0c19mcmFtZV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZDsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcFJUU0NvbnRleHQ7CisJc3RydWN0IHVyYiAqcFVyYjsKKwlpbnQgU3RhdHVzOworCXVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKKworCXBVcmIgPSAoc3RydWN0IHVyYiAqKWRhdGE7CisJcFJUU0NvbnRleHQgPSAoc3RydWN0IHJ0X3R4X2NvbnRleHQgKilwVXJiLT5jb250ZXh0OworCXBBZCA9IHBSVFNDb250ZXh0LT5wQWQ7CisJU3RhdHVzID0gcFVyYi0+c3RhdHVzOworCisJLyogUmVzZXQgUlRTIGZyYW1lIGNvbnRleHQgZmxhZ3MgKi8KKwlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKKwlwUlRTQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCXBSVFNDb250ZXh0LT5JblVzZSA9IEZBTFNFOworCisJaWYgKFN0YXR1cyA9PSBVU0JfU1RfTk9FUlJPUikgeworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIGlycUZsYWcpOworCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOworCX0gZWxzZQkJCS8qIFNUQVRVU19PVEhFUiAqLworCXsKKwkJaWYgKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkgJiYKKwkJICAgICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSAmJgorCQkgICAgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpICYmCisJCSAgICAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkpIHsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwKKwkJCQkgICAgICgiQnVsayBPdXQgUlRTIEZyYW1lIEZhaWxlZFxuIikpOworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7CisJCQlwQWQtPmJ1bGtSZXNldFBpcGVpZCA9CisJCQkgICAgKE1HTVRQSVBFSURYIHwgQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcpOworCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULAorCQkJCQkJTlVMTCwgMCk7CisJCX0gZWxzZSB7CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIGlycUZsYWcpOworCQl9CisJfQorCisJUlRNUF9TRU1fTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twUlRTQ29udGV4dC0+QnVsa091dFBpcGVJZF0pOworCXBBZC0+QnVsa091dFBlbmRpbmdbcFJUU0NvbnRleHQtPkJ1bGtPdXRQaXBlSWRdID0gRkFMU0U7CisJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BSVFNDb250ZXh0LT5CdWxrT3V0UGlwZUlkXSk7CisKKwkvKiBBbHdheXMgY2FsbCBCdWxrIHJvdXRpbmUsIGV2ZW4gcmVzZXQgYnVsay4gKi8KKwkvKiBUaGUgcHJvdGVjdGlvb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUgKi8KKwlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisKK30KKworc3RhdGljIHZvaWQgcnR1c2JfcHNwb2xsX2ZyYW1lX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCXN0cnVjdCBydF90eF9jb250ZXh0ICpwUHNQb2xsQ29udGV4dDsKKwlzdHJ1Y3QgdXJiICpwVXJiOworCWludCBTdGF0dXM7CisKKwlwVXJiID0gKHN0cnVjdCB1cmIgKilkYXRhOworCXBQc1BvbGxDb250ZXh0ID0gKHN0cnVjdCBydF90eF9jb250ZXh0ICopcFVyYi0+Y29udGV4dDsKKwlwQWQgPSBwUHNQb2xsQ29udGV4dC0+cEFkOworCVN0YXR1cyA9IHBVcmItPnN0YXR1czsKKworCS8qIFJlc2V0IFBzUG9sbCBjb250ZXh0IGZsYWdzICovCisJcFBzUG9sbENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwlwUHNQb2xsQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250WzBdID0gMDsKKworCWlmIChTdGF0dXMgPT0gVVNCX1NUX05PRVJST1IpIHsKKwkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKwl9IGVsc2UJCQkvKiBTVEFUVVNfT1RIRVIgKi8KKwl7CisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCSAgICAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJICAgICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkgICAgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKSB7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsCisJCQkJICAgICAoIkJ1bGsgT3V0IFBTUG9sbCBGYWlsZWRcbiIpKTsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCQkJcEFkLT5idWxrUmVzZXRQaXBlaWQgPQorCQkJICAgIChNR01UUElQRUlEWCB8IEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKTsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULAorCQkJCQkJTlVMTCwgMCk7CisJCX0KKwl9CisKKwlSVE1QX1NFTV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdKTsKKwlwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID0gRkFMU0U7CisJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdKTsKKworCS8qIEFsd2F5cyBjYWxsIEJ1bGsgcm91dGluZSwgZXZlbiByZXNldCBidWxrLiAqLworCS8qIFRoZSBwcm90ZWN0aW9vbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZSAqLworCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEhhbmRsZSByZWNlaXZlZCBwYWNrZXRzLgorCitBcmd1bWVudHM6CisJZGF0YQkJCQktIFVSQiBpbmZvcm1hdGlvbiBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKyAgICBOb25lCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgdm9pZCByeF9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCB1cmIgKnBVcmI7CisJc3RydWN0IHJ0X3J4X2NvbnRleHQgKnBSeENvbnRleHQ7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCWludCBTdGF0dXM7CisJdW5zaWduZWQgaW50IElycUZsYWdzOworCisJcFVyYiA9IChzdHJ1Y3QgdXJiICopZGF0YTsKKwlwUnhDb250ZXh0ID0gKHN0cnVjdCBydF9yeF9jb250ZXh0ICopcFVyYi0+Y29udGV4dDsKKwlwQWQgPSBwUnhDb250ZXh0LT5wQWQ7CisJU3RhdHVzID0gcFVyYi0+c3RhdHVzOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJcFJ4Q29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwlwUnhDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0ICs9IHBVcmItPmFjdHVhbF9sZW5ndGg7CisJLypOZGlzSW50ZXJsb2NrZWREZWNyZW1lbnQoJnBBZC0+UGVuZGluZ1J4KTsgKi8KKwlwQWQtPlBlbmRpbmdSeC0tOworCisJaWYgKFN0YXR1cyA9PSBVU0JfU1RfTk9FUlJPUikgeworCQlwQWQtPkJ1bGtJbkNvbXBsZXRlKys7CisJCXBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24gPSAwOworCQlpZiAocFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0KQkvKiBBcyBqYW4ncyBjb21tZW50LCBpdCBtYXkgYnVsay1pbiBzdWNjZXNzIGJ1dCBzaXplIGlzIHplcm8uICovCisJCXsKKwkJCXBSeENvbnRleHQtPlJlYWRhYmxlID0gVFJVRTsKKwkJCUlOQ19SSU5HX0lOREVYKHBBZC0+TmV4dFJ4QnVsa0luSW5kZXgsIFJYX1JJTkdfU0laRSk7CisJCX0KKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwl9IGVsc2UJCQkvKiBTVEFUVVNfT1RIRVIgKi8KKwl7CisJCXBBZC0+QnVsa0luQ29tcGxldGVGYWlsKys7CisJCS8qIFN0aWxsIHJlYWQgdGhpcyBwYWNrZXQgYWx0aG91Z2ggaXQgbWF5IGNvbXRhaW4gd3JvbmcgYnl0ZXMuICovCisJCXBSeENvbnRleHQtPlJlYWRhYmxlID0gRkFMU0U7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisKKwkJLyogUGFyc2luZyBhbGwgcGFja2V0cy4gYmVjYXVzZSBhZnRlciByZXNldCwgdGhlIGluZGV4IHdpbGwgcmVzZXQgdG8gYWxsIHplcm8uICovCisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCQkgICBmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVCB8CisJCQkJCSAgIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8CisJCQkJCSAgIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkgeworCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsCisJCQkJICAgICAoIkJ1bGsgSW4gRmFpbGVkLiBTdGF0dXM9JWQsIEJJSWR4PTB4JXgsIEJJUklkeD0weCV4LCBhY3R1YWxfbGVuZ3RoPSAweCV4XG4iLAorCQkJCSAgICAgIFN0YXR1cywgcEFkLT5OZXh0UnhCdWxrSW5JbmRleCwKKwkJCQkgICAgICBwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCwKKwkJCQkgICAgICBwUnhDb250ZXh0LT5wVXJiLT5hY3R1YWxfbGVuZ3RoKSk7CisKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVCk7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX0lOLAorCQkJCQkJTlVMTCwgMCk7CisJCX0KKwl9CisKKwlBU1NFUlQoKHBSeENvbnRleHQtPkluVXNlID09IHBSeENvbnRleHQtPklSUFBlbmRpbmcpKTsKKworCVJUVVNCQnVsa1JlY2VpdmUocEFkKTsKKworCXJldHVybjsKKworfQorCitzdGF0aWMgdm9pZCBydHVzYl9tZ210X2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZDsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcE1MTUVDb250ZXh0OworCWludCBpbmRleDsKKwl2b2lkICpwUGFja2V0OworCXN0cnVjdCB1cmIgKnBVcmI7CisJaW50IFN0YXR1czsKKwl1bnNpZ25lZCBsb25nIElycUZsYWdzOworCisJcFVyYiA9IChzdHJ1Y3QgdXJiICopZGF0YTsKKwlwTUxNRUNvbnRleHQgPSAoc3RydWN0IHJ0X3R4X2NvbnRleHQgKilwVXJiLT5jb250ZXh0OworCXBBZCA9IHBNTE1FQ29udGV4dC0+cEFkOworCVN0YXR1cyA9IHBVcmItPnN0YXR1czsKKwlpbmRleCA9IHBNTE1FQ29udGV4dC0+U2VsZklkeDsKKworCUFTU0VSVCgocEFkLT5NZ210UmluZy5UeERtYUlkeCA9PSBpbmRleCkpOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tNR01UUElQRUlEWF0sIElycUZsYWdzKTsKKworCWlmIChTdGF0dXMgIT0gVVNCX1NUX05PRVJST1IpIHsKKwkJLypCdWxrLU91dCBmYWlsIHN0YXR1cyBoYW5kbGUgKi8KKwkJaWYgKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkgJiYKKwkJICAgICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSAmJgorCQkgICAgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpICYmCisJCSAgICAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkpIHsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwKKwkJCQkgICAgICgiQnVsayBPdXQgTUxNRSBGYWlsZWQsIFN0YXR1cz0lZCFcbiIsCisJCQkJICAgICAgU3RhdHVzKSk7CisJCQkvKiBUT0RPOiBIb3cgdG8gaGFuZGxlIGFib3V0IHRoZSBNTE1FQnVsa091dCBmYWlsZWQgaXNzdWUuIE5lZWQgdG8gcmVzZW5kIHRoZSBtZ210IHBrdD8gKi8KKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCQkJcEFkLT5idWxrUmVzZXRQaXBlaWQgPQorCQkJICAgIChNR01UUElQRUlEWCB8IEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKTsKKwkJfQorCX0KKworCXBBZC0+QnVsa091dFBlbmRpbmdbTUdNVFBJUEVJRFhdID0gRkFMU0U7CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW01HTVRQSVBFSURYXSwgSXJxRmxhZ3MpOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5NTE1FQnVsa091dExvY2ssIElycUZsYWdzKTsKKwkvKiBSZXNldCBNTE1FIGNvbnRleHQgZmxhZ3MgKi8KKwlwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwlwTUxNRUNvbnRleHQtPkluVXNlID0gRkFMU0U7CisJcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPSBGQUxTRTsKKwlwTUxNRUNvbnRleHQtPkJ1bGtPdXRTaXplID0gMDsKKworCXBQYWNrZXQgPSBwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0OworCXBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQgPSBOVUxMOworCisJLyogSW5jcmVhc2UgTWdtdFJpbmcgSW5kZXggKi8KKwlJTkNfUklOR19JTkRFWChwQWQtPk1nbXRSaW5nLlR4RG1hSWR4LCBNR01UX1JJTkdfU0laRSk7CisJcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCsrOworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5NTE1FQnVsa091dExvY2ssIElycUZsYWdzKTsKKworCS8qIE5vLW1hdHRlciBzdWNjZXNzIG9yIGZhaWwsIHdlIGZyZWUgdGhlIG1nbXQgcGFja2V0LiAqLworCWlmIChwUGFja2V0KQorCQlSVE1QRnJlZU5kaXNQYWNrZXQocEFkLCBwUGFja2V0KTsKKworCWlmICgoUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJCQkJICBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCSAgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKSB7CisJCS8qIGRvIG5vdGhpbmcgYW5kIHJldHVybiBkaXJlY3RseS4gKi8KKwl9IGVsc2UgeworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpICYmICgocEFkLT5idWxrUmVzZXRQaXBlaWQgJiBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRykgPT0gQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcpKSB7CS8qIEZvciBNZ210IEJ1bGstT3V0IGZhaWxlZCwgaWdub3JlIGl0IG5vdy4gKi8KKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULAorCQkJCQkJTlVMTCwgMCk7CisJCX0gZWxzZSB7CisKKwkJCS8qIEFsd2F5cyBjYWxsIEJ1bGsgcm91dGluZSwgZXZlbiByZXNldCBidWxrLiAqLworCQkJLyogVGhlIHByb3RlY3Rpb29uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lICovCisJCQlpZiAocEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA8CisJCQkgICAgTUdNVF9SSU5HX1NJWkUKKwkJCSAgICAvKiBwTUxNRUNvbnRleHQtPmJXYWl0aW5nQnVsa091dCA9PSBUUlVFICovICkgeworCQkJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfTUxNRSk7CisJCQl9CisJCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisJCX0KKwl9CisKK30KKworc3RhdGljIHZvaWQgcnR1c2JfYWMzX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZDsKKwlzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCAqcEhUVFhDb250ZXh0OworCXU4IEJ1bGtPdXRQaXBlSWQgPSAzOworCXN0cnVjdCB1cmIgKnBVcmI7CisKKwlwVXJiID0gKHN0cnVjdCB1cmIgKilkYXRhOworCXBIVFRYQ29udGV4dCA9IChzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCAqKXBVcmItPmNvbnRleHQ7CisJcEFkID0gcEhUVFhDb250ZXh0LT5wQWQ7CisKKwlydHVzYl9kYXRhb3V0X2NvbXBsZXRlKCh1bnNpZ25lZCBsb25nKXBVcmIpOworCisJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCQkgIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8CisJCQkJICBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpIHsKKwkJLyogZG8gbm90aGluZyBhbmQgcmV0dXJuIGRpcmVjdGx5LiAqLworCX0gZWxzZSB7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpIHsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULAorCQkJCQkJTlVMTCwgMCk7CisJCX0gZWxzZSB7CisJCQlwSFRUWENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbQnVsa091dFBpcGVJZF07CisJCQlpZiAoKHBBZC0+VHhTd1F1ZXVlW0J1bGtPdXRQaXBlSWRdLk51bWJlciA+IDApICYmCisJCQkgICAgLyooKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA+IChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gKyAweDYwMDApKSB8fCAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uID4gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgMHg2MDAwKSkgJiYgKi8KKwkJCSAgICAocEFkLT5EZVF1ZXVlUnVubmluZ1tCdWxrT3V0UGlwZUlkXSA9PSBGQUxTRSkgJiYKKwkJCSAgICAocEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9PSBGQUxTRSkpIHsKKwkJCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBCdWxrT3V0UGlwZUlkLAorCQkJCQkJICBNQVhfVFhfUFJPQ0VTUyk7CisJCQl9CisKKwkJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLAorCQkJCQkgICAgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IDMpOworCQkJUlRVU0JLaWNrQnVsa091dChwQWQpOworCQl9CisJfQorCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBydHVzYl9hYzJfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCXN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQ7CisJdTggQnVsa091dFBpcGVJZCA9IDI7CisJc3RydWN0IHVyYiAqcFVyYjsKKworCXBVcmIgPSAoc3RydWN0IHVyYiAqKWRhdGE7CisJcEhUVFhDb250ZXh0ID0gKHN0cnVjdCBydF9odF90eF9jb250ZXh0ICopcFVyYi0+Y29udGV4dDsKKwlwQWQgPSBwSFRUWENvbnRleHQtPnBBZDsKKworCXJ0dXNiX2RhdGFvdXRfY29tcGxldGUoKHVuc2lnbmVkIGxvbmcpcFVyYik7CisKKwlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCSAgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkgIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkgeworCQkvKiBkbyBub3RoaW5nIGFuZCByZXR1cm4gZGlyZWN0bHkuICovCisJfSBlbHNlIHsKKwkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkgeworCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsCisJCQkJCQlOVUxMLCAwKTsKKwkJfSBlbHNlIHsKKwkJCXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtCdWxrT3V0UGlwZUlkXTsKKwkJCWlmICgocEFkLT5UeFN3UXVldWVbQnVsa091dFBpcGVJZF0uTnVtYmVyID4gMCkgJiYKKwkJCSAgICAvKigocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID4gKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiArIDB4NjAwMCkpIHx8IChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPiBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyAweDYwMDApKSAmJiAqLworCQkJICAgIChwQWQtPkRlUXVldWVSdW5uaW5nW0J1bGtPdXRQaXBlSWRdID09IEZBTFNFKSAmJgorCQkJICAgIChwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09IEZBTFNFKSkgeworCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIEJ1bGtPdXRQaXBlSWQsCisJCQkJCQkgIE1BWF9UWF9QUk9DRVNTKTsKKwkJCX0KKworCQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsCisJCQkJCSAgICBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwgPDwgMik7CisJCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisJCX0KKwl9CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHJ0dXNiX2FjMV9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQ7CisJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dDsKKwl1OCBCdWxrT3V0UGlwZUlkID0gMTsKKwlzdHJ1Y3QgdXJiICpwVXJiOworCisJcFVyYiA9IChzdHJ1Y3QgdXJiICopZGF0YTsKKwlwSFRUWENvbnRleHQgPSAoc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKilwVXJiLT5jb250ZXh0OworCXBBZCA9IHBIVFRYQ29udGV4dC0+cEFkOworCisJcnR1c2JfZGF0YW91dF9jb21wbGV0ZSgodW5zaWduZWQgbG9uZylwVXJiKTsKKworCWlmICgoUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJCQkJICBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCSAgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKSB7CisJCS8qIGRvIG5vdGhpbmcgYW5kIHJldHVybiBkaXJlY3RseS4gKi8KKwl9IGVsc2UgeworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKSB7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwKKwkJCQkJCU5VTEwsIDApOworCQl9IGVsc2UgeworCQkJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOworCQkJaWYgKChwQWQtPlR4U3dRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPiAwKSAmJgorCQkJICAgIC8qKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uICsgMHg2MDAwKSkgfHwgKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA+IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIDB4NjAwMCkpICYmICovCisJCQkgICAgKHBBZC0+RGVRdWV1ZVJ1bm5pbmdbQnVsa091dFBpcGVJZF0gPT0gRkFMU0UpICYmCisJCQkgICAgKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gRkFMU0UpKSB7CisJCQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgQnVsa091dFBpcGVJZCwKKwkJCQkJCSAgTUFYX1RYX1BST0NFU1MpOworCQkJfQorCisJCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwKKwkJCQkJICAgIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCAxKTsKKwkJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKwkJfQorCX0KKwlyZXR1cm47CisKK30KKworc3RhdGljIHZvaWQgcnR1c2JfYWMwX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZDsKKwlzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCAqcEhUVFhDb250ZXh0OworCXU4IEJ1bGtPdXRQaXBlSWQgPSAwOworCXN0cnVjdCB1cmIgKnBVcmI7CisKKwlwVXJiID0gKHN0cnVjdCB1cmIgKilkYXRhOworCXBIVFRYQ29udGV4dCA9IChzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCAqKXBVcmItPmNvbnRleHQ7CisJcEFkID0gcEhUVFhDb250ZXh0LT5wQWQ7CisKKwlydHVzYl9kYXRhb3V0X2NvbXBsZXRlKCh1bnNpZ25lZCBsb25nKXBVcmIpOworCisJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCQkgIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8CisJCQkJICBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpIHsKKwkJLyogZG8gbm90aGluZyBhbmQgcmV0dXJuIGRpcmVjdGx5LiAqLworCX0gZWxzZSB7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpIHsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULAorCQkJCQkJTlVMTCwgMCk7CisJCX0gZWxzZSB7CisJCQlwSFRUWENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbQnVsa091dFBpcGVJZF07CisJCQlpZiAoKHBBZC0+VHhTd1F1ZXVlW0J1bGtPdXRQaXBlSWRdLk51bWJlciA+IDApICYmCisJCQkgICAgLyogICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID4gKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiArIDB4NjAwMCkpIHx8IChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPiBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyAweDYwMDApKSAmJiAqLworCQkJICAgIChwQWQtPkRlUXVldWVSdW5uaW5nW0J1bGtPdXRQaXBlSWRdID09IEZBTFNFKSAmJgorCQkJICAgIChwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09IEZBTFNFKSkgeworCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIEJ1bGtPdXRQaXBlSWQsCisJCQkJCQkgIE1BWF9UWF9QUk9DRVNTKTsKKwkJCX0KKworCQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCk7CisJCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisJCX0KKwl9CisKKwlyZXR1cm47CisKK30KKworaW50IFJ0bXBOZXRUYXNrSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisKKwkvKiBDcmVhdGUgcmVjZWl2ZSB0YXNrbGV0ICovCisJdGFza2xldF9pbml0KCZwT2JqLT5yeF9kb25lX3Rhc2ssIHJ4X2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPm1nbXRfZG1hX2RvbmVfdGFzaywgcnR1c2JfbWdtdF9kbWFfZG9uZV90YXNrbGV0LAorCQkgICAgICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzaywgcnR1c2JfYWMwX2RtYV9kb25lX3Rhc2tsZXQsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrLCBydHVzYl9hYzFfZG1hX2RvbmVfdGFza2xldCwKKwkJICAgICAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2ssIHJ0dXNiX2FjMl9kbWFfZG9uZV90YXNrbGV0LAorCQkgICAgICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5hYzNfZG1hX2RvbmVfdGFzaywgcnR1c2JfYWMzX2RtYV9kb25lX3Rhc2tsZXQsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPnRidHRfdGFzaywgdGJ0dF90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+bnVsbF9mcmFtZV9jb21wbGV0ZV90YXNrLAorCQkgICAgIHJ0dXNiX251bGxfZnJhbWVfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+cnRzX2ZyYW1lX2NvbXBsZXRlX3Rhc2ssCisJCSAgICAgcnR1c2JfcnRzX2ZyYW1lX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPnBzcG9sbF9mcmFtZV9jb21wbGV0ZV90YXNrLAorCQkgICAgIHJ0dXNiX3BzcG9sbF9mcmFtZV9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKwordm9pZCBSdG1wTmV0VGFza0V4aXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCXRhc2tsZXRfa2lsbCgmcE9iai0+cnhfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPm1nbXRfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5hYzFfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5hYzJfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5hYzNfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT50YnR0X3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+bnVsbF9mcmFtZV9jb21wbGV0ZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPnJ0c19mcmFtZV9jb21wbGV0ZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPnBzcG9sbF9mcmFtZV9jb21wbGV0ZV90YXNrKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wLmgKaW5kZXggOTBmZDQwZi4uYzUwYWJmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wLmgKQEAgLTQxLDI3MCArNDEsMTM2IEBACiAjZGVmaW5lIF9fUlRNUF9IX18KIAogI2luY2x1ZGUgInNwZWN0cnVtX2RlZi5oIgorI2luY2x1ZGUgInJ0bXBfZG90MTEuaCIKKyNpbmNsdWRlICJydG1wX2NoaXAuaCIKIAotI2luY2x1ZGUgImFpcm9uZXQuaCIKK3N0cnVjdCBydF9ydG1wX2FkYXB0ZXI7CiAKLSNkZWZpbmUgVklSVFVBTF9JRl9JTkMoX19wQWQpICgoX19wQWQpLT5WaXJ0dWFsSWZDbnQrKykKLSNkZWZpbmUgVklSVFVBTF9JRl9ERUMoX19wQWQpICgoX19wQWQpLT5WaXJ0dWFsSWZDbnQtLSkKLSNkZWZpbmUgVklSVFVBTF9JRl9OVU0oX19wQWQpICgoX19wQWQpLT5WaXJ0dWFsSWZDbnQpCisvKiNkZWZpbmUgREJHICAgICAgICAgICAxICovCiAKLSNpZmRlZiBSVDI4NzAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFRoZSBUWF9CVUZGRVIgc3RydWN0dXJlIGZvcm1zIHRoZSB0cmFuc21pdHRlZCBVU0IgcGFja2V0IHRvIHRoZSBkZXZpY2UKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXR5cGVkZWYgc3RydWN0IF9fVFhfQlVGRkVSewotCXVuaW9uCXsKLQkJVUNIQVIJCQlXaXJlbGVzc1BhY2tldFtUWF9CVUZGRVJfTk9STVNJWkVdOwotCQlIRUFERVJfODAyXzExCU51bGxGcmFtZTsKLQkJUFNQT0xMX0ZSQU1FCVBzUG9sbFBhY2tldDsKLQkJUlRTX0ZSQU1FCQlSVFNGcmFtZTsKLQl9ZmllbGQ7Ci0JVUNIQVIJCQlBZ2dyZWdhdGlvbls0XTsgIC8vQnVmZmVyIGZvciBzYXZlIEFnZ3JlZ2F0aW9uIHNpemUuCi19IFRYX0JVRkZFUiwgKlBUWF9CVUZGRVI7CisvKiNkZWZpbmUgREJHX0RJQUdOT1NFICAgICAgICAgIDEgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgX19IVFRYX0JVRkZFUnsKLQl1bmlvbgl7Ci0JCVVDSEFSCQkJV2lyZWxlc3NQYWNrZXRbTUFYX1RYQlVMS19TSVpFXTsKLQkJSEVBREVSXzgwMl8xMQlOdWxsRnJhbWU7Ci0JCVBTUE9MTF9GUkFNRQlQc1BvbGxQYWNrZXQ7Ci0JCVJUU19GUkFNRQkJUlRTRnJhbWU7Ci0JfWZpZWxkOwotCVVDSEFSCQkJQWdncmVnYXRpb25bNF07ICAvL0J1ZmZlciBmb3Igc2F2ZSBBZ2dyZWdhdGlvbiBzaXplLgotfSBIVFRYX0JVRkZFUiwgKlBIVFRYX0JVRkZFUjsKLQotCi0vLyB1c2VkIHRvIHRyYWNrIGRyaXZlci1nZW5lcmF0ZWQgd3JpdGUgaXJwcwotdHlwZWRlZiBzdHJ1Y3QgX1RYX0NPTlRFWFQKLXsKLQlQVk9JRAkJCXBBZDsJCS8vSW5pdGlhbGl6ZWQgaW4gTWluaXBvcnRJbml0aWFsaXplCi0JUFVSQgkJCXBVcmI7CQkJLy9Jbml0aWFsaXplZCBpbiBNaW5pcG9ydEluaXRpYWxpemUKLQlQSVJQCQkJcElycDsJCQkvL3VzZWQgdG8gY2FuY2VsIHBlbmRpbmcgYnVsayBvdXQuCi0JCQkJCQkJCQkvL0luaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZQotCVBUWF9CVUZGRVIJCVRyYW5zZmVyQnVmZmVyOwkvL0luaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZQotCVVMT05HCQkJQnVsa091dFNpemU7Ci0JVUNIQVIJCQlCdWxrT3V0UGlwZUlkOwotCVVDSEFSCQkJU2VsZklkeDsKLQlCT09MRUFOCQkJSW5Vc2U7Ci0JQk9PTEVBTgkJCWJXYWl0aW5nQnVsa091dDsgLy8gYXQgbGVhc3Qgb25lIHBhY2tldCBpcyBpbiB0aGlzIFR4Q29udGV4dCwgcmVhZHkgZm9yIG1ha2luZyBJUlAgYW55dGltZS4KLQlCT09MRUFOCQkJYkZ1bGxGb3JCdWxrT3V0OyAvLyBhbGwgdHggYnVmZmVyIGFyZSBmdWxsICwgc28gd2FpdGluZyBmb3IgdHggYnVsa291dC4KLQlCT09MRUFOCQkJSVJQUGVuZGluZzsKLQlCT09MRUFOCQkJTGFzdE9uZTsKLQlCT09MRUFOCQkJYkFnZ3JlZ2F0aWJsZTsKLQlVQ0hBUgkJCUhlYWRlcl84MDJfM1tMRU5HVEhfODAyXzNdOwotCVVDSEFSCQkJUnN2WzJdOwotCVVMT05HCQkJRGF0YU9mZnNldDsKLQlVSU5UCQkJVHhSYXRlOwotCWRtYV9hZGRyX3QJCWRhdGFfZG1hOwkJLy8gdXJiIGRtYSBvbiBsaW51eAotCi19CVRYX0NPTlRFWFQsICpQVFhfQ09OVEVYVCwgKipQUFRYX0NPTlRFWFQ7Ci0KLQotLy8gdXNlZCB0byB0cmFjayBkcml2ZXItZ2VuZXJhdGVkIHdyaXRlIGlycHMKLXR5cGVkZWYgc3RydWN0IF9IVF9UWF9DT05URVhUCi17Ci0JUFZPSUQJCQlwQWQ7CQkvL0luaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZQotCVBVUkIJCQlwVXJiOwkJCS8vSW5pdGlhbGl6ZWQgaW4gTWluaXBvcnRJbml0aWFsaXplCi0JUElSUAkJCXBJcnA7CQkJLy91c2VkIHRvIGNhbmNlbCBwZW5kaW5nIGJ1bGsgb3V0LgotCQkJCQkJCQkJLy9Jbml0aWFsaXplZCBpbiBNaW5pcG9ydEluaXRpYWxpemUKLQlQSFRUWF9CVUZGRVIJVHJhbnNmZXJCdWZmZXI7CS8vSW5pdGlhbGl6ZWQgaW4gTWluaXBvcnRJbml0aWFsaXplCi0JVUxPTkcJCQlCdWxrT3V0U2l6ZTsJLy8gSW5kaWNhdGUgdGhlIHRvdGFsIGJ1bGstb3V0IHNpemUgaW4gYnl0ZXMgaW4gb25lIGJ1bGstdHJhbnNtaXNzaW9uCi0JVUNIQVIJCQlCdWxrT3V0UGlwZUlkOwotCUJPT0xFQU4JCQlJUlBQZW5kaW5nOwotCUJPT0xFQU4JCQlMYXN0T25lOwotCUJPT0xFQU4JCQliQ3VyV3JpdGluZzsKLQlCT09MRUFOCQkJYlJpbmdFbXB0eTsKLQlCT09MRUFOCQkJYkNvcHlTYXZlUGFkOwotCVVDSEFSCQkJU2F2ZWRQYWRbOF07Ci0JVUNIQVIJCQlIZWFkZXJfODAyXzNbTEVOR1RIXzgwMl8zXTsKLQlVTE9ORwkJCUN1cldyaXRlUG9zaXRpb247CQkvLyBJbmRpY2F0ZSB0aGUgYnVmZmVyIG9mZnNldCB3aGljaCBwYWNrZXQgd2lsbCBiZSBpbnNlcnRlZCBzdGFydCBmcm9tLgotCVVMT05HCQkJQ3VyV3JpdGVSZWFsUG9zOwkJLy8gSW5kaWNhdGUgdGhlIGJ1ZmZlciBvZmZzZXQgd2hpY2ggcGFja2V0IG5vdyBhcmUgd3JpdGluZyB0by4KLQlVTE9ORwkJCU5leHRCdWxrT3V0UG9zaXRpb247CS8vIEluZGljYXRlIHRoZSBidWZmZXIgc3RhcnQgb2Zmc2V0IG9mIGEgYnVsay10cmFuc21pc3Npb24KLQlVTE9ORwkJCUVOZXh0QnVsa091dFBvc2l0aW9uOwkvLyBJbmRpY2F0ZSB0aGUgYnVmZmVyIGVuZCBvZmZzZXQgb2YgYSBidWxrLXRyYW5zbWlzc2lvbgotCVVJTlQJCQlUeFJhdGU7Ci0JZG1hX2FkZHJfdAkJZGF0YV9kbWE7CQkvLyB1cmIgZG1hIG9uIGxpbnV4Ci19CUhUX1RYX0NPTlRFWFQsICpQSFRfVFhfQ09OVEVYVCwgKipQUEhUX1RYX0NPTlRFWFQ7Ci0KLQotLy8KLS8vIFN0cnVjdHVyZSB0byBrZWVwIHRyYWNrIG9mIHJlY2VpdmUgcGFja2V0cyBhbmQgYnVmZmVycyB0byBpbmRpY2F0ZQotLy8gcmVjZWl2ZSBkYXRhIHRvIHRoZSBwcm90b2NvbC4KLS8vCi10eXBlZGVmIHN0cnVjdCBfUlhfQ09OVEVYVAotewotCVBVQ0hBUgkJCQlUcmFuc2ZlckJ1ZmZlcjsKLQlQVk9JRAkJCQlwQWQ7Ci0JUElSUAkJCQlwSXJwOy8vdXNlZCB0byBjYW5jZWwgcGVuZGluZyBidWxrIGluLgotCVBVUkIJCQkJcFVyYjsKLQkvL1RoZXNlIDIgQm9vbGVhbiBzaG91bGRuJ3QgYm90aCBiZSAxIGF0IHRoZSBzYW1lIHRpbWUuCi0JVUxPTkcJCQkJQnVsa0luT2Zmc2V0OwkvLyBudW1iZXIgb2YgcGFja2V0cyB3YWl0aW5nIGZvciByZW9yZGVyaW5nIC4KLQlCT09MRUFOCQkJCWJSeEhhbmRsaW5nOwkvLyBOb3RpZnkgdGhpcyBwYWNrZXQgaXMgYmVpbmcgcHJvY2VzcyBub3cuCi0JQk9PTEVBTgkJCQlJblVzZTsJCQkvLyBVU0IgSGFyZHdhcmUgT2NjdXBpZWQuIFdhaXQgZm9yIFVTQiBIVyB0byBwdXQgcGFja2V0LgotCUJPT0xFQU4JCQkJUmVhZGFibGU7CQkvLyBSZWNlaXZlIENvbXBsZXRlIGJhY2suIE9LIGZvciBkcml2ZXIgdG8gaW5kaWNhdGUgcmVjZWl2aW5nIHBhY2tldC4KLQlCT09MRUFOCQkJCUlSUFBlbmRpbmc7CQkvLyBUT0RPOiBUbyBiZSByZW1vdmVkCi0JYXRvbWljX3QJCQlJcnBMb2NrOwotCU5ESVNfU1BJTl9MT0NLCQlSeENvbnRleHRMb2NrOwotCWRtYV9hZGRyX3QJCQlkYXRhX2RtYTsJCS8vIHVyYiBkbWEgb24gbGludXgKLX0JUlhfQ09OVEVYVCwgKlBSWF9DT05URVhUOwotI2VuZGlmIC8vIFJUMjg3MCAvLwotCi0KLS8vCi0vLyAgTkRJUyBWZXJzaW9uIGRlZmluaXRpb25zCi0vLwotI2lmZGVmICBORElTNTBfTUlOSVBPUlQKLSNkZWZpbmUgUlRNUF9ORElTX01BSk9SX1ZFUlNJT04gICAgIDUKLSNkZWZpbmUgUlRNUF9ORElTX01JTk9SX1ZFUlNJT04gICAgIDAKLSNlbmRpZgotCi0jaWZkZWYgIE5ESVM1MV9NSU5JUE9SVAotI2RlZmluZSBSVE1QX05ESVNfTUFKT1JfVkVSU0lPTiAgICAgNQotI2RlZmluZSBSVE1QX05ESVNfTUlOT1JfVkVSU0lPTiAgICAgMQotI2VuZGlmCi0KLWV4dGVybiAgY2hhciAgICBOSUNfVkVORE9SX0RFU0NbXTsKLWV4dGVybiAgaW50ICAgICBOSUNfVkVORE9SX0RFU0NfTEVOOwotCi1leHRlcm4gIHVuc2lnbmVkIGNoYXIgICBTTkFQX0FJUk9ORVRbXTsKLWV4dGVybiAgdW5zaWduZWQgY2hhciAgIENpcGhlclN1aXRlQ2lzY29DQ0tNW107Ci1leHRlcm4gIHVuc2lnbmVkIGNoYXIgICBDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbjsKLWV4dGVybgl1bnNpZ25lZCBjaGFyCUNpcGhlclN1aXRlQ2lzY29DQ0tNMjRbXTsKLWV4dGVybgl1bnNpZ25lZCBjaGFyCUNpcGhlclN1aXRlQ2lzY29DQ0tNMjRMZW47Ci1leHRlcm4gIHVuc2lnbmVkIGNoYXIgICBDaXBoZXJTdWl0ZUNDWFRraXBbXTsKLWV4dGVybiAgdW5zaWduZWQgY2hhciAgIENpcGhlclN1aXRlQ0NYVGtpcExlbjsKLWV4dGVybiAgdW5zaWduZWQgY2hhciAgIENJU0NPX09VSVtdOwotZXh0ZXJuICBVQ0hBUglCYVNpemVBcnJheVs0XTsKLQotZXh0ZXJuIFVDSEFSIEJST0FEQ0FTVF9BRERSW01BQ19BRERSX0xFTl07Ci1leHRlcm4gVUNIQVIgTVVMVElDQVNUX0FERFJbTUFDX0FERFJfTEVOXTsKLWV4dGVybiBVQ0hBUiBaRVJPX01BQ19BRERSW01BQ19BRERSX0xFTl07Ci1leHRlcm4gVUxPTkcgQklUMzJbMzJdOwotZXh0ZXJuIFVDSEFSIEJJVDhbOF07Ci1leHRlcm4gY2hhciogQ2lwaGVyTmFtZVtdOwotZXh0ZXJuIGNoYXIqIE1DU1RvTWJwc1tdOwotZXh0ZXJuIFVDSEFSCSBSeHdpTUNTVG9PZmRtUmF0ZVsxMl07Ci1leHRlcm4gVUNIQVIgU05BUF84MDJfMUhbNl07Ci1leHRlcm4gVUNIQVIgU05BUF9CUklER0VfVFVOTkVMWzZdOwotZXh0ZXJuIFVDSEFSIFNOQVBfQUlST05FVFs4XTsKLWV4dGVybiBVQ0hBUiBDS0lQX0xMQ19TTkFQWzhdOwotZXh0ZXJuIFVDSEFSIEVBUE9MX0xMQ19TTkFQWzhdOwotZXh0ZXJuIFVDSEFSIEVBUE9MWzJdOwotZXh0ZXJuIFVDSEFSIElQWFsyXTsKLWV4dGVybiBVQ0hBUiBBUFBMRV9UQUxLWzJdOwotZXh0ZXJuIFVDSEFSIFJhdGVJZFRvUGxjcFNpZ25hbFsxMl07IC8vIHNlZSBJRUVFODAyLjExYS0xOTk5IHAuMTQKLWV4dGVybiBVQ0hBUgkgT2ZkbVJhdGVUb1J4d2lNQ1NbXTsKLWV4dGVybiBVQ0hBUiBPZmRtU2lnbmFsVG9SYXRlSWRbMTZdIDsKLWV4dGVybiBVQ0hBUiBkZWZhdWx0X2N3bWluWzRdOwotZXh0ZXJuIFVDSEFSIGRlZmF1bHRfY3dtYXhbNF07Ci1leHRlcm4gVUNIQVIgZGVmYXVsdF9zdGFfYWlmc25bNF07Ci1leHRlcm4gVUNIQVIgTWFwVXNlclByaW9yaXR5VG9BY2Nlc3NDYXRlZ29yeVs4XTsKLQotZXh0ZXJuIFVTSE9SVCBSYXRlVXBQRVJbXTsKLWV4dGVybiBVU0hPUlQgUmF0ZURvd25QRVJbXTsKLWV4dGVybiBVQ0hBUiAgUGh5MTFCTmV4dFJhdGVEb3dud2FyZFtdOwotZXh0ZXJuIFVDSEFSICBQaHkxMUJOZXh0UmF0ZVVwd2FyZFtdOwotZXh0ZXJuIFVDSEFSICBQaHkxMUJHTmV4dFJhdGVEb3dud2FyZFtdOwotZXh0ZXJuIFVDSEFSICBQaHkxMUJHTmV4dFJhdGVVcHdhcmRbXTsKLWV4dGVybiBVQ0hBUiAgUGh5MTFBTmV4dFJhdGVEb3dud2FyZFtdOwotZXh0ZXJuIFVDSEFSICBQaHkxMUFOZXh0UmF0ZVVwd2FyZFtdOwotZXh0ZXJuIENIQVIgICBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW107Ci1leHRlcm4gVUNIQVIgIFJhdGVJZFRvTWJwc1tdOwotZXh0ZXJuIFVTSE9SVCBSYXRlSWRUbzUwMEticHNbXTsKLQotZXh0ZXJuIFVDSEFSICBDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwW107Ci1leHRlcm4gVUNIQVIgIENpcGhlclN1aXRlV3BhTm9uZVRraXBMZW47Ci0KLWV4dGVybiBVQ0hBUiAgQ2lwaGVyU3VpdGVXcGFOb25lQWVzW107Ci1leHRlcm4gVUNIQVIgIENpcGhlclN1aXRlV3BhTm9uZUFlc0xlbjsKLQotZXh0ZXJuIFVDSEFSICBTc2lkSWU7Ci1leHRlcm4gVUNIQVIgIFN1cFJhdGVJZTsKLWV4dGVybiBVQ0hBUiAgRXh0UmF0ZUllOwotCi1leHRlcm4gVUNIQVIgIEh0Q2FwSWU7Ci1leHRlcm4gVUNIQVIgIEFkZEh0SW5mb0llOwotZXh0ZXJuIFVDSEFSICBOZXdFeHRDaGFuSWU7Ci0KLWV4dGVybiBVQ0hBUiAgRXJwSWU7Ci1leHRlcm4gVUNIQVIgIERzSWU7Ci1leHRlcm4gVUNIQVIgIFRpbUllOwotZXh0ZXJuIFVDSEFSICBXcGFJZTsKLWV4dGVybiBVQ0hBUiAgV3BhMkllOwotZXh0ZXJuIFVDSEFSICBJYnNzSWU7Ci1leHRlcm4gVUNIQVIgIENjeDJJZTsKLQotZXh0ZXJuIFVDSEFSICBXUEFfT1VJW107Ci1leHRlcm4gVUNIQVIgIFJTTl9PVUlbXTsKLWV4dGVybiBVQ0hBUiAgV01FX0lORk9fRUxFTVtdOwotZXh0ZXJuIFVDSEFSICBXTUVfUEFSTV9FTEVNW107Ci1leHRlcm4gVUNIQVIgIENjeDJRb3NJbmZvW107Ci1leHRlcm4gVUNIQVIgIENjeDJJZUluZm9bXTsKLWV4dGVybiBVQ0hBUiAgUkFMSU5LX09VSVtdOwotZXh0ZXJuIFVDSEFSICBQb3dlckNvbnN0cmFpbnRJRVtdOwotCi0KLWV4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlW107Ci1leHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExQltdOwotZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUdbXTsKLWV4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFCR1tdOwotCi1leHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExQkdOMVNbXTsKLWV4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU1tdOwotZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmRbXTsKLWV4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFOMVNbXTsKLWV4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFOMlNbXTsKLWV4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFtdOwotCi1leHRlcm4gVUNIQVIgIFBSRV9OX0hUX09VSVtdOworLyorKytBZGQgYnkgc2hpYW5nIGZvciBtZXJnZSBNaW5pcG9ydE1NUmVxdWVzdCgpIGFuZCBNaW5pcG9ydERhdGFNTVJlcXVlc3QoKSBpbnRvIG9uZSBmdW5jdGlvbiAqLworI2RlZmluZSBNQVhfREFUQU1NX1JFVFJZCTMKKyNkZWZpbmUgTUdNVF9VU0VfUVVFVUVfRkxBRwkweDgwCisvKi0tLUFkZCBieSBzaGlhbmcgZm9yIG1lcmdlIE1pbmlwb3J0TU1SZXF1ZXN0KCkgYW5kIE1pbmlwb3J0RGF0YU1NUmVxdWVzdCgpIGludG8gb25lIGZ1bmN0aW9uICovCiAKICNkZWZpbmUJTUFYU0VRCQkoMHhGRkYpCiAKLXN0cnVjdCByZW9yZGVyaW5nX21wZHUKLXsKLQlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1CSpuZXh0OwotCVBORElTX1BBQ0tFVAkJCXBQYWNrZXQ7CQkvKiBjb3ZlcnRlZCB0byA4MDIuMyBmcmFtZSAqLwotCWludAkJCQkJCVNlcXVlbmNlOwkJLyogc2VxdWVuY2UgbnVtYmVyIG9mIE1QRFUgKi8KLQlCT09MRUFOCQkJCQliQU1TRFU7CitleHRlcm4gdW5zaWduZWQgY2hhciBTTkFQX0FJUk9ORVRbXTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIENJU0NPX09VSVtdOworZXh0ZXJuIHU4IEJhU2l6ZUFycmF5WzRdOworCitleHRlcm4gdTggQlJPQURDQVNUX0FERFJbTUFDX0FERFJfTEVOXTsKK2V4dGVybiB1OCBaRVJPX01BQ19BRERSW01BQ19BRERSX0xFTl07CitleHRlcm4gdW5zaWduZWQgbG9uZyBCSVQzMlszMl07CitleHRlcm4gdTggQklUOFs4XTsKK2V4dGVybiBjaGFyICpDaXBoZXJOYW1lW107CitleHRlcm4gY2hhciAqTUNTVG9NYnBzW107CitleHRlcm4gdTggUnh3aU1DU1RvT2ZkbVJhdGVbMTJdOworZXh0ZXJuIHU4IFNOQVBfODAyXzFIWzZdOworZXh0ZXJuIHU4IFNOQVBfQlJJREdFX1RVTk5FTFs2XTsKK2V4dGVybiB1OCBTTkFQX0FJUk9ORVRbOF07CitleHRlcm4gdTggQ0tJUF9MTENfU05BUFs4XTsKK2V4dGVybiB1OCBFQVBPTF9MTENfU05BUFs4XTsKK2V4dGVybiB1OCBFQVBPTFsyXTsKK2V4dGVybiB1OCBJUFhbMl07CitleHRlcm4gdTggQVBQTEVfVEFMS1syXTsKK2V4dGVybiB1OCBSYXRlSWRUb1BsY3BTaWduYWxbMTJdOwkvKiBzZWUgSUVFRTgwMi4xMWEtMTk5OSBwLjE0ICovCitleHRlcm4gdTggT2ZkbVJhdGVUb1J4d2lNQ1NbXTsKK2V4dGVybiB1OCBPZmRtU2lnbmFsVG9SYXRlSWRbMTZdOworZXh0ZXJuIHU4IGRlZmF1bHRfY3dtaW5bNF07CitleHRlcm4gdTggZGVmYXVsdF9jd21heFs0XTsKK2V4dGVybiB1OCBkZWZhdWx0X3N0YV9haWZzbls0XTsKK2V4dGVybiB1OCBNYXBVc2VyUHJpb3JpdHlUb0FjY2Vzc0NhdGVnb3J5WzhdOworCitleHRlcm4gdTE2IFJhdGVVcFBFUltdOworZXh0ZXJuIHUxNiBSYXRlRG93blBFUltdOworZXh0ZXJuIHU4IFBoeTExQk5leHRSYXRlRG93bndhcmRbXTsKK2V4dGVybiB1OCBQaHkxMUJOZXh0UmF0ZVVwd2FyZFtdOworZXh0ZXJuIHU4IFBoeTExQkdOZXh0UmF0ZURvd253YXJkW107CitleHRlcm4gdTggUGh5MTFCR05leHRSYXRlVXB3YXJkW107CitleHRlcm4gdTggUGh5MTFBTmV4dFJhdGVEb3dud2FyZFtdOworZXh0ZXJuIHU4IFBoeTExQU5leHRSYXRlVXB3YXJkW107CitleHRlcm4gY2hhciBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW107CitleHRlcm4gdTggUmF0ZUlkVG9NYnBzW107CitleHRlcm4gdTE2IFJhdGVJZFRvNTAwS2Jwc1tdOworCitleHRlcm4gdTggQ2lwaGVyU3VpdGVXcGFOb25lVGtpcFtdOworZXh0ZXJuIHU4IENpcGhlclN1aXRlV3BhTm9uZVRraXBMZW47CisKK2V4dGVybiB1OCBDaXBoZXJTdWl0ZVdwYU5vbmVBZXNbXTsKK2V4dGVybiB1OCBDaXBoZXJTdWl0ZVdwYU5vbmVBZXNMZW47CisKK2V4dGVybiB1OCBTc2lkSWU7CitleHRlcm4gdTggU3VwUmF0ZUllOworZXh0ZXJuIHU4IEV4dFJhdGVJZTsKKworZXh0ZXJuIHU4IEh0Q2FwSWU7CitleHRlcm4gdTggQWRkSHRJbmZvSWU7CitleHRlcm4gdTggTmV3RXh0Q2hhbkllOworCitleHRlcm4gdTggRXJwSWU7CitleHRlcm4gdTggRHNJZTsKK2V4dGVybiB1OCBUaW1JZTsKK2V4dGVybiB1OCBXcGFJZTsKK2V4dGVybiB1OCBXcGEySWU7CitleHRlcm4gdTggSWJzc0llOworZXh0ZXJuIHU4IENjeDJJZTsKK2V4dGVybiB1OCBXYXBpSWU7CisKK2V4dGVybiB1OCBXUEFfT1VJW107CitleHRlcm4gdTggUlNOX09VSVtdOworZXh0ZXJuIHU4IFdBUElfT1VJW107CitleHRlcm4gdTggV01FX0lORk9fRUxFTVtdOworZXh0ZXJuIHU4IFdNRV9QQVJNX0VMRU1bXTsKK2V4dGVybiB1OCBDY3gyUW9zSW5mb1tdOworZXh0ZXJuIHU4IENjeDJJZUluZm9bXTsKK2V4dGVybiB1OCBSQUxJTktfT1VJW107CitleHRlcm4gdTggUG93ZXJDb25zdHJhaW50SUVbXTsKKworZXh0ZXJuIHU4IFJhdGVTd2l0Y2hUYWJsZVtdOworZXh0ZXJuIHU4IFJhdGVTd2l0Y2hUYWJsZTExQltdOworZXh0ZXJuIHU4IFJhdGVTd2l0Y2hUYWJsZTExR1tdOworZXh0ZXJuIHU4IFJhdGVTd2l0Y2hUYWJsZTExQkdbXTsKKworZXh0ZXJuIHU4IFJhdGVTd2l0Y2hUYWJsZTExQkdOMVNbXTsKK2V4dGVybiB1OCBSYXRlU3dpdGNoVGFibGUxMUJHTjJTW107CitleHRlcm4gdTggUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kW107CitleHRlcm4gdTggUmF0ZVN3aXRjaFRhYmxlMTFOMVNbXTsKK2V4dGVybiB1OCBSYXRlU3dpdGNoVGFibGUxMU4yU1tdOworZXh0ZXJuIHU4IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbXTsKKworZXh0ZXJuIHU4IFBSRV9OX0hUX09VSVtdOworCitzdHJ1Y3QgcnRfcnNzaV9zYW1wbGUgeworCWNoYXIgTGFzdFJzc2kwOwkJLyogbGFzdCByZWNlaXZlZCBSU1NJICovCisJY2hhciBMYXN0UnNzaTE7CQkvKiBsYXN0IHJlY2VpdmVkIFJTU0kgKi8KKwljaGFyIExhc3RSc3NpMjsJCS8qIGxhc3QgcmVjZWl2ZWQgUlNTSSAqLworCWNoYXIgQXZnUnNzaTA7CisJY2hhciBBdmdSc3NpMTsKKwljaGFyIEF2Z1Jzc2kyOworCXNob3J0IEF2Z1Jzc2kwWDg7CisJc2hvcnQgQXZnUnNzaTFYODsKKwlzaG9ydCBBdmdSc3NpMlg4OwogfTsKIAotc3RydWN0IHJlb3JkZXJpbmdfbGlzdAotewotCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm5leHQ7Ci0JaW50IAlxbGVuOworLyogKi8KKy8qICBRdWV1ZSBzdHJ1Y3R1cmUgYW5kIG1hY3JvcyAqLworLyogKi8KK3N0cnVjdCBydF9xdWV1ZV9lbnRyeTsKKworc3RydWN0IHJ0X3F1ZXVlX2VudHJ5IHsKKwlzdHJ1Y3QgcnRfcXVldWVfZW50cnkgKk5leHQ7CiB9OwogCi1zdHJ1Y3QgcmVvcmRlcmluZ19tcGR1X3Bvb2wKLXsKLQlQVk9JRAkJCQkJbWVtOwotCU5ESVNfU1BJTl9MT0NLCQkJbG9jazsKLQlzdHJ1Y3QgcmVvcmRlcmluZ19saXN0IAlmcmVlbGlzdDsKKy8qIFF1ZXVlIHN0cnVjdHVyZSAqLworc3RydWN0IHJ0X3F1ZXVlX2hlYWRlciB7CisJc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICpIZWFkOworCXN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqVGFpbDsKKwl1bnNpZ25lZCBsb25nIE51bWJlcjsKIH07CiAKLXR5cGVkZWYgc3RydWN0IAlfUlNTSV9TQU1QTEUgewotCUNIQVIJCQlMYXN0UnNzaTA7ICAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgUlNTSQotCUNIQVIJCQlMYXN0UnNzaTE7ICAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgUlNTSQotCUNIQVIJCQlMYXN0UnNzaTI7ICAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgUlNTSQotCUNIQVIJCQlBdmdSc3NpMDsKLQlDSEFSCQkJQXZnUnNzaTE7Ci0JQ0hBUgkJCUF2Z1Jzc2kyOwotCVNIT1JUCQkJQXZnUnNzaTBYODsKLQlTSE9SVAkJCUF2Z1Jzc2kxWDg7Ci0JU0hPUlQJCQlBdmdSc3NpMlg4OwotfSBSU1NJX1NBTVBMRTsKLQotLy8KLS8vICBRdWV1ZSBzdHJ1Y3R1cmUgYW5kIG1hY3JvcwotLy8KLXR5cGVkZWYgc3RydWN0ICBfUVVFVUVfRU5UUlkgICAgewotCXN0cnVjdCBfUVVFVUVfRU5UUlkgICAgICpOZXh0OwotfSAgIFFVRVVFX0VOVFJZLCAqUFFVRVVFX0VOVFJZOwotCi0vLyBRdWV1ZSBzdHJ1Y3R1cmUKLXR5cGVkZWYgc3RydWN0ICBfUVVFVUVfSEVBREVSICAgewotCVBRVUVVRV9FTlRSWSAgICBIZWFkOwotCVBRVUVVRV9FTlRSWSAgICBUYWlsOwotCVVMT05HICAgICAgICAgICBOdW1iZXI7Ci19ICAgUVVFVUVfSEVBREVSLCAqUFFVRVVFX0hFQURFUjsKLQogI2RlZmluZSBJbml0aWFsaXplUXVldWVIZWFkZXIoUXVldWVIZWFkZXIpICAgICAgICAgICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkoUXVldWVIZWFkZXIpLT5IZWFkID0gKFF1ZXVlSGVhZGVyKS0+VGFpbCA9IE5VTEw7ICAgXApAQCAtMzE0LDEwICsxODAsMTEgQEAKICNkZWZpbmUgUmVtb3ZlSGVhZFF1ZXVlKFF1ZXVlSGVhZGVyKSAgICAgICAgICAgICAgICBcCiAoUXVldWVIZWFkZXIpLT5IZWFkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlQUVVFVUVfRU5UUlkgcE5leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICpwTmV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAlpZiAoKFF1ZXVlSGVhZGVyKS0+SGVhZCAhPSBOVUxMKQkJCQlcCiAJewkJCQkJCQkJCQkJCVwKIAkJcE5leHQgPSAoUXVldWVIZWFkZXIpLT5IZWFkLT5OZXh0OyAgICAgICAgICBcCisJCShRdWV1ZUhlYWRlciktPkhlYWQtPk5leHQgPSBOVUxMOwkJXAogCQkoUXVldWVIZWFkZXIpLT5IZWFkID0gcE5leHQ7ICAgICAgICAgICAgICAgIFwKIAkJaWYgKHBOZXh0ID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJCQkoUXVldWVIZWFkZXIpLT5UYWlsID0gTlVMTDsgICAgICAgICAgICAgXApAQCAtMzI3LDQxICsxOTQsNDkgQEAKIAogI2RlZmluZSBJbnNlcnRIZWFkUXVldWUoUXVldWVIZWFkZXIsIFF1ZXVlRW50cnkpICAgICAgICAgICAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkoKFBRVUVVRV9FTlRSWSlRdWV1ZUVudHJ5KS0+TmV4dCA9IChRdWV1ZUhlYWRlciktPkhlYWQ7IFwKLQkJKFF1ZXVlSGVhZGVyKS0+SGVhZCA9IChQUVVFVUVfRU5UUlkpKFF1ZXVlRW50cnkpOyAgICAgICBcCisJCSgoc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICopUXVldWVFbnRyeSktPk5leHQgPSAoUXVldWVIZWFkZXIpLT5IZWFkOyBcCisJCShRdWV1ZUhlYWRlciktPkhlYWQgPSAoc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICopKFF1ZXVlRW50cnkpOyAgICAgICBcCiAJCWlmICgoUXVldWVIZWFkZXIpLT5UYWlsID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJKFF1ZXVlSGVhZGVyKS0+VGFpbCA9IChQUVVFVUVfRU5UUlkpKFF1ZXVlRW50cnkpOyAgIFwKKwkJCShRdWV1ZUhlYWRlciktPlRhaWwgPSAoc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICopKFF1ZXVlRW50cnkpOyAgIFwKIAkJKFF1ZXVlSGVhZGVyKS0+TnVtYmVyKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9CiAKICNkZWZpbmUgSW5zZXJ0VGFpbFF1ZXVlKFF1ZXVlSGVhZGVyLCBRdWV1ZUVudHJ5KSAgICAgICAgICAgICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSgoUFFVRVVFX0VOVFJZKVF1ZXVlRW50cnkpLT5OZXh0ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgIFwKKwkoKHN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqKVF1ZXVlRW50cnkpLT5OZXh0ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgIFwKIAlpZiAoKFF1ZXVlSGVhZGVyKS0+VGFpbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCShRdWV1ZUhlYWRlciktPlRhaWwtPk5leHQgPSAoUFFVRVVFX0VOVFJZKShRdWV1ZUVudHJ5KTsgXAorCQkoUXVldWVIZWFkZXIpLT5UYWlsLT5OZXh0ID0gKHN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqKShRdWV1ZUVudHJ5KTsgXAogCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJKFF1ZXVlSGVhZGVyKS0+SGVhZCA9IChQUVVFVUVfRU5UUlkpKFF1ZXVlRW50cnkpOyAgICAgICBcCi0JKFF1ZXVlSGVhZGVyKS0+VGFpbCA9IChQUVVFVUVfRU5UUlkpKFF1ZXVlRW50cnkpOyAgICAgICAgICAgXAorCQkoUXVldWVIZWFkZXIpLT5IZWFkID0gKHN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqKShRdWV1ZUVudHJ5KTsgICAgICAgXAorCShRdWV1ZUhlYWRlciktPlRhaWwgPSAoc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICopKFF1ZXVlRW50cnkpOyAgICAgICAgICAgXAogCShRdWV1ZUhlYWRlciktPk51bWJlcisrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0KIAotLy8KLS8vICBNYWNyb3MgZm9yIGZsYWcgYW5kIHJlZiBjb3VudCBvcGVyYXRpb25zCi0vLworI2RlZmluZSBJbnNlcnRUYWlsUXVldWVBYyhwQWQsIHBFbnRyeSwgUXVldWVIZWFkZXIsIFF1ZXVlRW50cnkpCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJCVwKKwkoKHN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqKVF1ZXVlRW50cnkpLT5OZXh0ID0gTlVMTDsJCQkJCQkJXAorCWlmICgoUXVldWVIZWFkZXIpLT5UYWlsKQkJCQkJCQkJCQkJXAorCQkoUXVldWVIZWFkZXIpLT5UYWlsLT5OZXh0ID0gKHN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqKShRdWV1ZUVudHJ5KTsJCQlcCisJZWxzZQkJCQkJCQkJCQkJCQkJCQlcCisJCShRdWV1ZUhlYWRlciktPkhlYWQgPSAoc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICopKFF1ZXVlRW50cnkpOwkJCQlcCisJKFF1ZXVlSGVhZGVyKS0+VGFpbCA9IChzdHJ1Y3QgcnRfcXVldWVfZW50cnkgKikoUXVldWVFbnRyeSk7CQkJCQlcCisJKFF1ZXVlSGVhZGVyKS0+TnVtYmVyKys7CQkJCQkJCQkJCQlcCit9CisKKy8qICovCisvKiAgTWFjcm9zIGZvciBmbGFnIGFuZCByZWYgY291bnQgb3BlcmF0aW9ucyAqLworLyogKi8KICNkZWZpbmUgUlRNUF9TRVRfRkxBRyhfTSwgX0YpICAgICAgICgoX00pLT5GbGFncyB8PSAoX0YpKQogI2RlZmluZSBSVE1QX0NMRUFSX0ZMQUcoX00sIF9GKSAgICAgKChfTSktPkZsYWdzICY9IH4oX0YpKQogI2RlZmluZSBSVE1QX0NMRUFSX0ZMQUdTKF9NKSAgICAgICAgKChfTSktPkZsYWdzID0gMCkKICNkZWZpbmUgUlRNUF9URVNUX0ZMQUcoX00sIF9GKSAgICAgICgoKF9NKS0+RmxhZ3MgJiAoX0YpKSAhPSAwKQogI2RlZmluZSBSVE1QX1RFU1RfRkxBR1MoX00sIF9GKSAgICAgKCgoX00pLT5GbGFncyAmIChfRikpID09IChfRikpCi0KLSNpZmRlZiBSVDI4NjAKLS8vIE1hY3JvIGZvciBwb3dlciBzYXZlIGZsYWcuCisvKiBNYWNybyBmb3IgcG93ZXIgc2F2ZSBmbGFnLiAqLwogI2RlZmluZSBSVE1QX1NFVF9QU0ZMQUcoX00sIF9GKSAgICAgICAoKF9NKS0+UFNGbGFncyB8PSAoX0YpKQogI2RlZmluZSBSVE1QX0NMRUFSX1BTRkxBRyhfTSwgX0YpICAgICAoKF9NKS0+UFNGbGFncyAmPSB+KF9GKSkKICNkZWZpbmUgUlRNUF9DTEVBUl9QU0ZMQUdTKF9NKSAgICAgICAgKChfTSktPlBTRmxhZ3MgPSAwKQogI2RlZmluZSBSVE1QX1RFU1RfUFNGTEFHKF9NLCBfRikgICAgICAoKChfTSktPlBTRmxhZ3MgJiAoX0YpKSAhPSAwKQogI2RlZmluZSBSVE1QX1RFU1RfUFNGTEFHUyhfTSwgX0YpICAgICAoKChfTSktPlBTRmxhZ3MgJiAoX0YpKSA9PSAoX0YpKQotI2VuZGlmCiAKICNkZWZpbmUgT1BTVEFUVVNfU0VUX0ZMQUcoX3BBZCwgX0YpICAgICAoKF9wQWQpLT5Db21tb25DZmcuT3BTdGF0dXNGbGFncyB8PSAoX0YpKQogI2RlZmluZSBPUFNUQVRVU19DTEVBUl9GTEFHKF9wQWQsIF9GKSAgICgoX3BBZCktPkNvbW1vbkNmZy5PcFN0YXR1c0ZsYWdzICY9IH4oX0YpKQpAQCAtMzg1LDU5ICsyNjAsMTIgQEAKICNkZWZpbmUgQ0tJUF9LUF9PTihfcCkJCQkJKCgoKF9wKS0+U3RhQ2ZnLkNraXBGbGFnKSAmIDB4MTApICYmICgoX3ApLT5TdGFDZmcuYkNraXBDbWljT24gPT0gVFJVRSkpCiAjZGVmaW5lIENLSVBfQ01JQ19PTihfcCkJCQkoKCgoX3ApLT5TdGFDZmcuQ2tpcEZsYWcpICYgMHgwOCkgJiYgKChfcCktPlN0YUNmZy5iQ2tpcENtaWNPbiA9PSBUUlVFKSkKIAotCiAjZGVmaW5lIElOQ19SSU5HX0lOREVYKF9pZHgsIF9SaW5nU2l6ZSkgICAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAoX2lkeCkgPSAoX2lkeCsxKSAlIChfUmluZ1NpemUpOyAgICAgICBcCiB9CiAKLSNpZmRlZiBSVDI4NzAKLS8vIFdlIHdpbGwgaGF2ZSBhIGNvc3QgZG93biB2ZXJzaW9uIHdoaWNoIG1hYyB2ZXJzaW9uIGlzIDB4MzA5MHh4eHgKLSNkZWZpbmUgSVNfUlQzMDkwKF9wQWQpCQkJCSgoKChfcEFkKS0+TUFDVmVyc2lvbiAmIDB4ZmZmZjAwMDApID09IDB4MzA3MTAwMDApIHx8ICgoKF9wQWQpLT5NQUNWZXJzaW9uICYgMHhmZmZmMDAwMCkgPT0gMHgzMDkwMDAwMCkpCi0jZWxzZQotI2RlZmluZSBJU19SVDMwOTAoX3BBZCkJCQkJMAotI2VuZGlmCi0jZGVmaW5lIElTX1JUMzA3MChfcEFkKQkJCQkoKChfcEFkKS0+TUFDVmVyc2lvbiAmIDB4ZmZmZjAwMDApID09IDB4MzA3MDAwMDApCi0jaWZkZWYgUlQyODcwCi0jZGVmaW5lIElTX1JUMzA3MShfcEFkKQkJCQkoKChfcEFkKS0+TUFDVmVyc2lvbiAmIDB4ZmZmZjAwMDApID09IDB4MzA3MTAwMDApCi0jZGVmaW5lIElTX1JUMzB4eChfcEFkKQkJCQkoKChfcEFkKS0+TUFDVmVyc2lvbiAmIDB4ZmZmMDAwMDApID09IDB4MzA3MDAwMDApCi0jZW5kaWYKLQotI2RlZmluZSBSSU5HX1BBQ0tFVF9JTklUKF9UeFJpbmcsIF9pZHgpICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX1R4UmluZy0+Q2VsbFtfaWR4XS5wTmRpc1BhY2tldCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF9UeFJpbmctPkNlbGxbX2lkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgVFhEVF9JTklUKF9UeEQpICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JTmRpc1plcm9NZW1vcnkoX1R4RCwgVFhEX1NJWkUpOwlcCi0JX1R4RC0+RE1BRE9ORSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0vL1NldCBsYXN0IGRhdGEgc2VnbWVudAotI2RlZmluZSBSSU5HX1NFVF9MQVNURFMoX1R4RCwgX0lzU0QwKSAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChfSXNTRDApIHtfVHhELT5MYXN0U2VjMCA9IDE7fSAgICAgXAotICAgIGVsc2Uge19UeEQtPkxhc3RTZWMxID0gMTt9ICAgICBcCi19Ci0KLS8vIEluY3JlYXNlIFR4VHNjIHZhbHVlIGZvciBuZXh0IHRyYW5zbWlzc2lvbgotLy8gVE9ETzoKLS8vIFdoZW4gaT09NiwgbWVhbnMgVFNDIGhhcyBkb25lIG9uZSBmdWxsIGN5Y2xlLCBkbyByZS1rZXlpbmcgc3R1ZmYgZm9sbG93IHNwZWNzCi0vLyBTaG91bGQgc2VuZCBhIHNwZWNpYWwgZXZlbnQgbWljcm9zb2Z0IGRlZmluZWQgdG8gcmVxdWVzdCByZS1rZXkKLSNkZWZpbmUgSU5DX1RYX1RTQyhfdHNjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50IGk9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB3aGlsZSAoKytfdHNjW2ldID09IDB4MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGkrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKGkgPT0gNikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotLy8gU3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk1DU1NldCBpcyBjb3BpZWQgZnJvbSBBUCBiZWFjb24uICBEb24ndCBuZWVkIHRvIHVwZGF0ZSBoZXJlLgorLyogU3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk1DU1NldCBpcyBjb3BpZWQgZnJvbSBBUCBiZWFjb24uICBEb24ndCBuZWVkIHRvIHVwZGF0ZSBoZXJlLiAqLwogI2RlZmluZSBDT1BZX0hUU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKF9wQWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuQ2hhbm5lbFdpZHRoID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aDsgICAgICBcCkBAIC00NTEsMzQzICsyNzksNTIgQEAKIAlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuUmVjb21XaWR0aCA9IF9wQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoOyAgICAgIFwKIAlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuT3BlcmFpb25Nb2RlID0gX3BBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGU7ICAgICAgXAogCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5Ob25HZlByZXNlbnQgPSBfcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudDsgICAgICBcCi0JTmRpc01vdmVNZW1vcnkoKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVENhcGFiaWxpdHkuTUNTU2V0LCAoX3BBZCktPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldCwgc2l6ZW9mKFVDSEFSKSAqIDE2KTtcCisJTmRpc01vdmVNZW1vcnkoKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVENhcGFiaWxpdHkuTUNTU2V0LCAoX3BBZCktPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldCwgc2l6ZW9mKHU4KSogMTYpO1wKIH0KIAogI2RlZmluZSBDT1BZX0FQX0hUU0VUVElOR1NfRlJPTV9CRUFDT04oX3BBZCwgX3BIdENhcGFiaWxpdHkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlfcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BTXNkdVNpemUgPSAoVUNIQVIpKF9wSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQU1zZHVTaXplKTsJXAotCV9wQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1tcHNNb2RlPSAoVUNIQVIpKF9wSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uTWltb1BzKTsJXAotCV9wQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1heFJBbXBkdUZhY3RvciA9IChVQ0hBUikoX3BIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3IpOwlcCisJX3BBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplID0gKHU4KShfcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkFNc2R1U2l6ZSk7CVwKKwlfcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NbXBzTW9kZT0gKHU4KShfcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLk1pbW9Qcyk7CVwKKwlfcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NYXhSQW1wZHVGYWN0b3IgPSAodTgpKF9wSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yKTsJXAogfQogCi0vLwotLy8gTUFDUk8gZm9yIDMyLWJpdCBQQ0kgcmVnaXN0ZXIgcmVhZCAvIHdyaXRlCi0vLwotLy8gVXNhZ2UgOiBSVE1QX0lPX1JFQUQzMigKLS8vICAgICAgICAgICAgICBQUlRNUF9BREFQVEVSIHBBZCwKLS8vICAgICAgICAgICAgICBVTE9ORyBSZWdpc3Rlcl9PZmZzZXQsCi0vLyAgICAgICAgICAgICAgUFVMT05HICBwVmFsdWUpCi0vLwotLy8gICAgICAgICBSVE1QX0lPX1dSSVRFMzIoCi0vLyAgICAgICAgICAgICAgUFJUTVBfQURBUFRFUiBwQWQsCi0vLyAgICAgICAgICAgICAgVUxPTkcgUmVnaXN0ZXJfT2Zmc2V0LAotLy8gICAgICAgICAgICAgIFVMT05HIFZhbHVlKQotLy8KKy8qICovCisvKiBNQUNSTyBmb3IgMzItYml0IFBDSSByZWdpc3RlciByZWFkIC8gd3JpdGUgKi8KKy8qICovCisvKiBVc2FnZSA6IFJUTVBfSU9fUkVBRDMyKCAqLworLyogICAgICAgICAgICAgIHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgKi8KKy8qICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIFJlZ2lzdGVyX09mZnNldCwgKi8KKy8qICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICogcFZhbHVlKSAqLworLyogKi8KKy8qICAgICAgICAgUlRNUF9JT19XUklURTMyKCAqLworLyogICAgICAgICAgICAgIHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgKi8KKy8qICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIFJlZ2lzdGVyX09mZnNldCwgKi8KKy8qICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIFZhbHVlKSAqLworLyogKi8KIAotLy8KLS8vIEJCUCAmIFJGIGFyZSB1c2luZyBpbmRpcmVjdCBhY2Nlc3MuIEJlZm9yZSB3cml0ZSBhbnkgdmFsdWUgaW50byBpdC4KLS8vIFdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIG5vIG91dHN0YW5kaW5nIGNvbW1hbmQgcGVuZGluZyB2aWEgY2hlY2tpbmcgYnVzeSBiaXQuCi0vLwotI2RlZmluZSBNQVhfQlVTWV9DT1VOVCAgMTAwICAgICAgICAgLy8gTnVtYmVyIG9mIHJldHJ5IGJlZm9yZSBmYWlsaW5nIGFjY2VzcyBCQlAgJiBSRiBpbmRpcmVjdCByZWdpc3RlcgotLy8KLSNpZmRlZiBSVDI4NjAKLSNkZWZpbmUgUlRNUF9SRl9JT19XUklURTMyKF9BLCBfVikgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFBIWV9DU1I0X1NUUlVDICBWYWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBVTE9ORyAgICAgICAgICAgQnVzeUNudCA9IDA7ICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKChfQSktPmJQQ0ljbGtPZmYpIAkgICAgICAgICAgICAgICAgXAotICAgIHsJCQkJCQkJCQkJCQlcCi0gICAgICAgIHJldHVybjsJCQkJCQkJCQkJXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIFJUTVBfSU9fUkVBRDMyKF9BLCBSRl9DU1JfQ0ZHMCwgJlZhbHVlLndvcmQpOyAgXAotICAgICAgICBpZiAoVmFsdWUuZmllbGQuQnVzeSA9PSBJRExFKSAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJ1c3lDbnQrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICB3aGlsZSAoQnVzeUNudCA8IE1BWF9CVVNZX0NPVU5UKTsgICAgICAgICAgIFwKLSAgICBpZiAoQnVzeUNudCA8IE1BWF9CVVNZX0NPVU5UKSAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBSVE1QX0lPX1dSSVRFMzIoX0EsIFJGX0NTUl9DRkcwLCBfVik7ICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChfQSwgX0ksIF9wVikgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEJCUF9DU1JfQ0ZHX1NUUlVDICBCYnBDc3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50ICAgICAgICAgICAgIGksIGs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKGk9MDsgaTxNQVhfQlVTWV9DT1VOVDsgaSsrKSAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIFJUTVBfSU9fUkVBRDMyKF9BLCBCQlBfQ1NSX0NGRywgJkJicENzci53b3JkKTsgICAgIFwKLSAgICAgICAgaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpICAgICAgICAgICAgICAgICAgXAotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3Iud29yZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci5maWVsZC5mUmVhZCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLkJCUF9SV19NT0RFID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3IuZmllbGQuQnVzeSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci5maWVsZC5SZWdOdW0gPSBfSTsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgUlRNUF9JT19XUklURTMyKF9BLCBCQlBfQ1NSX0NGRywgQmJwQ3NyLndvcmQpOyAgICAgXAotICAgICAgICBmb3IgKGs9MDsgazxNQVhfQlVTWV9DT1VOVDsgaysrKSAgICAgICAgICAgICAgICBcCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIFJUTVBfSU9fUkVBRDMyKF9BLCBCQlBfQ1NSX0NGRywgJkJicENzci53b3JkKTsgXAotICAgICAgICAgICAgaWYgKEJicENzci5maWVsZC5CdXN5ID09IElETEUpICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoKEJicENzci5maWVsZC5CdXN5ID09IElETEUpICYmICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAoQmJwQ3NyLmZpZWxkLlJlZ051bSA9PSBfSSkpICAgICAgICAgICAgICAgIFwKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgKihfcFYpID0gKFVDSEFSKUJicENzci5maWVsZC5WYWx1ZTsgICAgICAgICBcCi0gICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBEQkdQUklOVF9FUlIoKCJERlMgQkJQIHJlYWQgUiVkIGZhaWxcbiIsIF9JKSk7ICAgICAgXAotICAgICAgICAqKF9wVikgPSAoX0EpLT5CYnBXcml0ZUxhdGNoW19JXTsgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotLy8jZGVmaW5lIFJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChfQSwgX0ksIF9wVikgICAge30KLS8vIFJlYWQgQkJQIHJlZ2lzdGVyIGJ5IHJlZ2lzdGVyJ3MgSUQuIEdlbmVyYXRlIFBFUiB0byB0ZXN0IEJBCi0jZGVmaW5lIFJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChfQSwgX0ksIF9wVikgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEJCUF9DU1JfQ0ZHX1NUUlVDICBCYnBDc3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50ICAgICAgICAgICAgIGksIGs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKGk9MDsgaTxNQVhfQlVTWV9DT1VOVDsgaSsrKSAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCVJUTVBfSU9fUkVBRDMyKF9BLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOwkJCQlcCi0gICAgICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLndvcmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3IuZmllbGQuZlJlYWQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3IuZmllbGQuUmVnTnVtID0gX0k7ICAgICAgICAgICAgICAgICAgICAgICBcCi0JCVJUTVBfSU9fV1JJVEUzMihfQSwgSDJNX0JCUF9BR0VOVCwgQmJwQ3NyLndvcmQpOwkJCQlcCi0JCUFzaWNTZW5kQ29tbWFuZFRvTWN1KF9BLCAweDgwLCAweGZmLCAweDAsIDB4MCk7CQkJCQlcCi0JCVJUTVB1c2VjRGVsYXkoMTAwMCk7CQkJCQkJCVwKLSAgICAgICAgZm9yIChrPTA7IGs8TUFYX0JVU1lfQ09VTlQ7IGsrKykgICAgICAgICAgICAgICAgXAotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlSVE1QX0lPX1JFQUQzMihfQSwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsJCQlcCi0gICAgICAgICAgICBpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gSURMRSkgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmICgoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gSURMRSkgJiYgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIChCYnBDc3IuZmllbGQuUmVnTnVtID09IF9JKSkgICAgICAgICAgICAgICAgXAotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAqKF9wVikgPSAoVUNIQVIpQmJwQ3NyLmZpZWxkLlZhbHVlOyAgICAgICAgIFwKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCURCR1BSSU5UX0VSUigoIkJCUCByZWFkIFIlZD0weCV4IGZhaWxcbiIsIF9JLCBCYnBDc3Iud29yZCkpOwlcCi0gICAgICAgICooX3BWKSA9IChfQSktPkJicFdyaXRlTGF0Y2hbX0ldOyAgICAgICAgICAgICAgIFwKLQkJUlRNUF9JT19SRUFEMzIoX0EsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CQkJCVwKLQkJQmJwQ3NyLmZpZWxkLkJ1c3kgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlSVE1QX0lPX1dSSVRFMzIoX0EsIEgyTV9CQlBfQUdFTlQsIEJicENzci53b3JkKTsJCQkJXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQoX0EsIF9JLCBfVikgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEJCUF9DU1JfQ0ZHX1NUUlVDICBCYnBDc3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50ICAgICAgICAgICAgIEJ1c3lDbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKEJ1c3lDbnQ9MDsgQnVzeUNudDxNQVhfQlVTWV9DT1VOVDsgQnVzeUNudCsrKSAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIFJUTVBfSU9fUkVBRDMyKF9BLCBCQlBfQ1NSX0NGRywgJkJicENzci53b3JkKTsgICAgIFwKLSAgICAgICAgaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci53b3JkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLmZSZWFkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3IuZmllbGQuQkJQX1JXX01PREUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci5maWVsZC5CdXN5ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLlZhbHVlID0gX1Y7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3IuZmllbGQuUmVnTnVtID0gX0k7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIFJUTVBfSU9fV1JJVEUzMihfQSwgQkJQX0NTUl9DRkcsIEJicENzci53b3JkKTsgICAgIFwKLSAgICAgICAgKF9BKS0+QmJwV3JpdGVMYXRjaFtfSV0gPSBfVjsgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoQnVzeUNudCA9PSBNQVhfQlVTWV9DT1VOVCkgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIERCR1BSSU5UX0VSUigoIkJCUCB3cml0ZSBSJWQgZmFpbFxuIiwgX0kpKTsgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0vLyBXcml0ZSBCQlAgcmVnaXN0ZXIgYnkgcmVnaXN0ZXIncyBJRCAmIHZhbHVlCi0jZGVmaW5lIFJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQoX0EsIF9JLCBfVikgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEJCUF9DU1JfQ0ZHX1NUUlVDICBCYnBDc3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50ICAgICAgICAgICAgIEJ1c3lDbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKEJ1c3lDbnQ9MDsgQnVzeUNudDxNQVhfQlVTWV9DT1VOVDsgQnVzeUNudCsrKSAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCVJUTVBfSU9fUkVBRDMyKF9BLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOwkJCQlcCi0gICAgICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3Iud29yZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci5maWVsZC5mUmVhZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLkJCUF9SV19NT0RFID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3IuZmllbGQuQnVzeSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci5maWVsZC5WYWx1ZSA9IF9WOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLlJlZ051bSA9IF9JOyAgICAgICAgICAgICAgICAgICAgICAgXAotCQlSVE1QX0lPX1dSSVRFMzIoX0EsIEgyTV9CQlBfQUdFTlQsIEJicENzci53b3JkKTsJCQkJXAotCQlBc2ljU2VuZENvbW1hbmRUb01jdShfQSwgMHg4MCwgMHhmZiwgMHgwLCAweDApOwkJCQkJXAotICAgICAgICAgICAgaWYgKF9BLT5PcE1vZGUgPT0gT1BNT0RFX0FQKSAgICAgICAgICAgICAgICAgICAgXAotCQlSVE1QdXNlY0RlbGF5KDEwMDApOwkJCQkJCQlcCi0gICAgICAgIChfQSktPkJicFdyaXRlTGF0Y2hbX0ldID0gX1Y7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKEJ1c3lDbnQgPT0gTUFYX0JVU1lfQ09VTlQpICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlEQkdQUklOVF9FUlIoKCJCQlAgd3JpdGUgUiVkPTB4JXggZmFpbFxuIiwgX0ksIEJicENzci53b3JkKSk7CVwKLQkJUlRNUF9JT19SRUFEMzIoX0EsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CQkJCVwKLQkJQmJwQ3NyLmZpZWxkLkJ1c3kgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlSVE1QX0lPX1dSSVRFMzIoX0EsIEgyTV9CQlBfQUdFTlQsIEJicENzci53b3JkKTsJCQkJXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLSNlbmRpZiAvKiBSVDI4NjAgKi8KLSNpZmRlZiBSVDI4NzAKLSNkZWZpbmUgUlRNUF9SRl9JT19XUklURTMyKF9BLCBfVikgICAgICAgICAgICAgICAgIFJUVVNCV3JpdGVSRlJlZ2lzdGVyKF9BLCBfVikKLSNkZWZpbmUgUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKF9BLCBfSSwgX3BWKSAgIFJUVVNCUmVhZEJCUFJlZ2lzdGVyKF9BLCBfSSwgX3BWKQotI2RlZmluZSBSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKF9BLCBfSSwgX1YpICAgUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKF9BLCBfSSwgX1YpCi0KLSNkZWZpbmUgQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQoX0EsIF9JLCBfVikJCQlSVFVTQldyaXRlQkJQUmVnaXN0ZXIoX0EsIF9JLCBfVikKLSNkZWZpbmUgQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChfQSwgX0ksIF9wVikgICAJCVJUVVNCUmVhZEJCUFJlZ2lzdGVyKF9BLCBfSSwgX3BWKQotI2VuZGlmIC8vIFJUMjg3MCAvLwotCi0jZGVmaW5lICAgICBNQVBfQ0hBTk5FTF9JRF9UT19LSFooY2gsIGtoeikgIHsgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgc3dpdGNoIChjaCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogICAgIGtoeiA9IDI0MTIwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogICAgIGtoeiA9IDI0MTcwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMzogICAgIGtoeiA9IDI0MjIwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogICAgIGtoeiA9IDI0MjcwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTogICAgIGtoeiA9IDI0MzIwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNjogICAgIGtoeiA9IDI0MzcwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNzogICAgIGtoeiA9IDI0NDIwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgODogICAgIGtoeiA9IDI0NDcwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgOTogICAgIGtoeiA9IDI0NTIwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6ICAgIGtoeiA9IDI0NTcwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6ICAgIGtoeiA9IDI0NjIwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6ICAgIGtoeiA9IDI0NjcwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6ICAgIGtoeiA9IDI0NzIwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6ICAgIGtoeiA9IDI0ODQwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMzY6ICAvKiBVTklJICovICBraHogPSA1MTgwMDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDQwOiAgLyogVU5JSSAqLyAga2h6ID0gNTIwMDAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA0NDogIC8qIFVOSUkgKi8gIGtoeiA9IDUyMjAwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNDg6ICAvKiBVTklJICovICBraHogPSA1MjQwMDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDUyOiAgLyogVU5JSSAqLyAga2h6ID0gNTI2MDAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1NjogIC8qIFVOSUkgKi8gIGtoeiA9IDUyODAwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNjA6ICAvKiBVTklJICovICBraHogPSA1MzAwMDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDY0OiAgLyogVU5JSSAqLyAga2h6ID0gNTMyMDAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDk6IC8qIFVOSUkgKi8gIGtoeiA9IDU3NDUwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTUzOiAvKiBVTklJICovICBraHogPSA1NzY1MDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDE1NzogLyogVU5JSSAqLyAga2h6ID0gNTc4NTAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjE6IC8qIFVOSUkgKi8gIGtoeiA9IDU4MDUwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTY1OiAvKiBVTklJICovICBraHogPSA1ODI1MDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDEwMDogLyogSGlwZXJMQU4yICovICBraHogPSA1NTAwMDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDEwNDogLyogSGlwZXJMQU4yICovICBraHogPSA1NTIwMDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDEwODogLyogSGlwZXJMQU4yICovICBraHogPSA1NTQwMDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDExMjogLyogSGlwZXJMQU4yICovICBraHogPSA1NTYwMDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDExNjogLyogSGlwZXJMQU4yICovICBraHogPSA1NTgwMDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDEyMDogLyogSGlwZXJMQU4yICovICBraHogPSA1NjAwMDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDEyNDogLyogSGlwZXJMQU4yICovICBraHogPSA1NjIwMDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDEyODogLyogSGlwZXJMQU4yICovICBraHogPSA1NjQwMDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDEzMjogLyogSGlwZXJMQU4yICovICBraHogPSA1NjYwMDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDEzNjogLyogSGlwZXJMQU4yICovICBraHogPSA1NjgwMDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDE0MDogLyogSGlwZXJMQU4yICovICBraHogPSA1NzAwMDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDM0OiAgLyogSmFwYW4gTU1BQyAqLyAgIGtoeiA9IDUxNzAwMDA7ICAgYnJlYWs7ICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDM4OiAgLyogSmFwYW4gTU1BQyAqLyAgIGtoeiA9IDUxOTAwMDA7ICAgYnJlYWs7ICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDQyOiAgLyogSmFwYW4gTU1BQyAqLyAgIGtoeiA9IDUyMTAwMDA7ICAgYnJlYWs7ICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDQ2OiAgLyogSmFwYW4gTU1BQyAqLyAgIGtoeiA9IDUyMzAwMDA7ICAgYnJlYWs7ICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDE4NDogLyogSmFwYW4gKi8gICBraHogPSA0OTIwMDAwOyAgIGJyZWFrOyAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxODg6IC8qIEphcGFuICovICAga2h6ID0gNDk0MDAwMDsgICBicmVhazsgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTkyOiAvKiBKYXBhbiAqLyAgIGtoeiA9IDQ5NjAwMDA7ICAgYnJlYWs7ICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDE5NjogLyogSmFwYW4gKi8gICBraHogPSA0OTgwMDAwOyAgIGJyZWFrOyAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDg6IC8qIEphcGFuLCBtZWFucyBKMDggKi8gICBraHogPSA1MDQwMDAwOyAgIGJyZWFrOyAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyMTI6IC8qIEphcGFuLCBtZWFucyBKMTIgKi8gICBraHogPSA1MDYwMDAwOyAgIGJyZWFrOyAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyMTY6IC8qIEphcGFuLCBtZWFucyBKMTYgKi8gICBraHogPSA1MDgwMDAwOyAgIGJyZWFrOyAgIFwKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogICAga2h6ID0gMjQxMjAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIH0KLQotI2RlZmluZSAgICAgTUFQX0tIWl9UT19DSEFOTkVMX0lEKGtoeiwgY2gpICB7ICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIHN3aXRjaCAoa2h6KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MTIwMDA6ICAgIGNoID0gMTsgICAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MTcwMDA6ICAgIGNoID0gMjsgICAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MjIwMDA6ICAgIGNoID0gMzsgICAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MjcwMDA6ICAgIGNoID0gNDsgICAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MzIwMDA6ICAgIGNoID0gNTsgICAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MzcwMDA6ICAgIGNoID0gNjsgICAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NDIwMDA6ICAgIGNoID0gNzsgICAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NDcwMDA6ICAgIGNoID0gODsgICAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NTIwMDA6ICAgIGNoID0gOTsgICAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NTcwMDA6ICAgIGNoID0gMTA7ICAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NjIwMDA6ICAgIGNoID0gMTE7ICAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NjcwMDA6ICAgIGNoID0gMTI7ICAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NzIwMDA6ICAgIGNoID0gMTM7ICAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDI0ODQwMDA6ICAgIGNoID0gMTQ7ICAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDUxODAwMDA6ICAgIGNoID0gMzY7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjAwMDAwOiAgICBjaCA9IDQwOyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTIyMDAwMDogICAgY2ggPSA0NDsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDUyNDAwMDA6ICAgIGNoID0gNDg7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjYwMDAwOiAgICBjaCA9IDUyOyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTI4MDAwMDogICAgY2ggPSA1NjsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDUzMDAwMDA6ICAgIGNoID0gNjA7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1MzIwMDAwOiAgICBjaCA9IDY0OyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTc0NTAwMDogICAgY2ggPSAxNDk7IC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDU3NjUwMDA6ICAgIGNoID0gMTUzOyAvKiBVTklJICovICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1Nzg1MDAwOiAgICBjaCA9IDE1NzsgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTgwNTAwMDogICAgY2ggPSAxNjE7IC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDU4MjUwMDA6ICAgIGNoID0gMTY1OyAvKiBVTklJICovICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1NTAwMDAwOiAgICBjaCA9IDEwMDsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1NTIwMDAwOiAgICBjaCA9IDEwNDsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1NTQwMDAwOiAgICBjaCA9IDEwODsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1NTYwMDAwOiAgICBjaCA9IDExMjsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1NTgwMDAwOiAgICBjaCA9IDExNjsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1NjAwMDAwOiAgICBjaCA9IDEyMDsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1NjIwMDAwOiAgICBjaCA9IDEyNDsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1NjQwMDAwOiAgICBjaCA9IDEyODsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1NjYwMDAwOiAgICBjaCA9IDEzMjsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1NjgwMDAwOiAgICBjaCA9IDEzNjsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1NzAwMDAwOiAgICBjaCA9IDE0MDsgLyogSGlwZXJMQU4yICovICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1MTcwMDAwOiAgICBjaCA9IDM0OyAgLyogSmFwYW4gTU1BQyAqLyAgIGJyZWFrOyAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1MTkwMDAwOiAgICBjaCA9IDM4OyAgLyogSmFwYW4gTU1BQyAqLyAgIGJyZWFrOyAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjEwMDAwOiAgICBjaCA9IDQyOyAgLyogSmFwYW4gTU1BQyAqLyAgIGJyZWFrOyAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjMwMDAwOiAgICBjaCA9IDQ2OyAgLyogSmFwYW4gTU1BQyAqLyAgIGJyZWFrOyAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA0OTIwMDAwOiAgICBjaCA9IDE4NDsgLyogSmFwYW4gKi8gIGJyZWFrOyAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA0OTQwMDAwOiAgICBjaCA9IDE4ODsgLyogSmFwYW4gKi8gIGJyZWFrOyAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA0OTYwMDAwOiAgICBjaCA9IDE5MjsgLyogSmFwYW4gKi8gIGJyZWFrOyAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA0OTgwMDAwOiAgICBjaCA9IDE5NjsgLyogSmFwYW4gKi8gIGJyZWFrOyAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDQwMDAwOiAgICBjaCA9IDIwODsgLyogSmFwYW4sIG1lYW5zIEowOCAqLyAgYnJlYWs7ICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDUwNjAwMDA6ICAgIGNoID0gMjEyOyAvKiBKYXBhbiwgbWVhbnMgSjEyICovICBicmVhazsgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTA4MDAwMDogICAgY2ggPSAyMTY7IC8qIEphcGFuLCBtZWFucyBKMTYgKi8gIGJyZWFrOyAgIFwKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICBjaCA9IDE7ICAgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIH0KLQotLy8KLS8vIENvbW1vbiBmcmFnbWVudCBsaXN0IHN0cnVjdHVyZSAtICBJZGVudGljYWwgdG8gdGhlIHNjYXR0ZXIgZ2F0aGVyIGZyYWcgbGlzdCBzdHJ1Y3R1cmUKLS8vCisvKiAqLworLyogQ29tbW9uIGZyYWdtZW50IGxpc3Qgc3RydWN0dXJlIC0gIElkZW50aWNhbCB0byB0aGUgc2NhdHRlciBnYXRoZXIgZnJhZyBsaXN0IHN0cnVjdHVyZSAqLworLyogKi8KKy8qI2RlZmluZSBzdHJ1Y3QgcnRfcnRtcF9zZ19lbGVtZW50ICAgICAgICAgU0NBVFRFUl9HQVRIRVJfRUxFTUVOVCAqLworLyojZGVmaW5lIHN0cnVjdCBydF9ydG1wX3NnX2VsZW1lbnQgKlBTQ0FUVEVSX0dBVEhFUl9FTEVNRU5UICovCiAjZGVmaW5lIE5JQ19NQVhfUEhZU19CVUZfQ09VTlQgICAgICAgICAgICAgIDgKIAotdHlwZWRlZiBzdHJ1Y3QgX1JUTVBfU0NBVFRFUl9HQVRIRVJfRUxFTUVOVCB7Ci0gICAgUFZPSUQJCUFkZHJlc3M7Ci0gICAgVUxPTkcJCUxlbmd0aDsKLSAgICBQVUxPTkcJCVJlc2VydmVkOwotfSBSVE1QX1NDQVRURVJfR0FUSEVSX0VMRU1FTlQsICpQUlRNUF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5UOworc3RydWN0IHJ0X3J0bXBfc2dfZWxlbWVudCB7CisJdm9pZCAqQWRkcmVzczsKKwl1bnNpZ25lZCBsb25nIExlbmd0aDsKKwl1bnNpZ25lZCBsb25nICpSZXNlcnZlZDsKK307CiAKK3N0cnVjdCBydF9ydG1wX3NnX2xpc3QgeworCXVuc2lnbmVkIGxvbmcgTnVtYmVyT2ZFbGVtZW50czsKKwl1bnNpZ25lZCBsb25nICpSZXNlcnZlZDsKKwlzdHJ1Y3QgcnRfcnRtcF9zZ19lbGVtZW50IEVsZW1lbnRzW05JQ19NQVhfUEhZU19CVUZfQ09VTlRdOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1JUTVBfU0NBVFRFUl9HQVRIRVJfTElTVCB7Ci0gICAgVUxPTkcgIE51bWJlck9mRWxlbWVudHM7Ci0gICAgUFVMT05HIFJlc2VydmVkOwotICAgIFJUTVBfU0NBVFRFUl9HQVRIRVJfRUxFTUVOVCBFbGVtZW50c1tOSUNfTUFYX1BIWVNfQlVGX0NPVU5UXTsKLX0gUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNULCAqUFJUTVBfU0NBVFRFUl9HQVRIRVJfTElTVDsKLQotLy8KLS8vICBTb21lIHV0aWxpdHkgbWFjcm9zCi0vLworLyogKi8KKy8qICBTb21lIHV0aWxpdHkgbWFjcm9zICovCisvKiAqLwogI2lmbmRlZiBtaW4KICNkZWZpbmUgbWluKF9hLCBfYikgICAgICgoKF9hKSA8IChfYikpID8gKF9hKSA6IChfYikpCiAjZW5kaWYKQEAgLTgwNSwxMSArMzQyLDExIEBACiAjZGVmaW5lIE1PTklUT1JfT04oX3ApICAgICAgICAgICAgICAoKChfcCktPlN0YUNmZy5Cc3NUeXBlKSA9PSBCU1NfTU9OSVRPUikKICNkZWZpbmUgSURMRV9PTihfcCkgICAgICAgICAgICAgICAgICghSU5GUkFfT04oX3ApICYmICFBREhPQ19PTihfcCkpCiAKLS8vIENoZWNrIExFQVAgJiBDQ0tNIGZsYWdzCisvKiBDaGVjayBMRUFQICYgQ0NLTSBmbGFncyAqLwogI2RlZmluZSBMRUFQX09OKF9wKSAgICAgICAgICAgICAgICAgKCgoX3ApLT5TdGFDZmcuTGVhcEF1dGhNb2RlKSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCiAjZGVmaW5lIExFQVBfQ0NLTV9PTihfcCkgICAgICAgICAgICAoKCgoX3ApLT5TdGFDZmcuTGVhcEF1dGhNb2RlKSA9PSBDSVNDT19BdXRoTW9kZUxFQVApICYmICgoX3ApLT5TdGFDZmcuTGVhcEF1dGhJbmZvLkNDS00gPT0gVFJVRSkpCiAKLS8vIGlmIG9yZ2luYWwgRXRoZXJuZXQgZnJhbWUgY29udGFpbnMgbm8gTExDL1NOQVAsIHRoZW4gYW4gZXh0cmEgTExDL1NOQVAgZW5jYXAgaXMgcmVxdWlyZWQKKy8qIGlmIG9yZ2luYWwgRXRoZXJuZXQgZnJhbWUgY29udGFpbnMgbm8gTExDL1NOQVAsIHRoZW4gYW4gZXh0cmEgTExDL1NOQVAgZW5jYXAgaXMgcmVxdWlyZWQgKi8KICNkZWZpbmUgRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9TVEFSVChfcEJ1ZlZBLCBfcEV4dHJhTGxjU25hcEVuY2FwKQkJXAogewkJCQkJCQkJCQkJCQkJCQlcCiAJaWYgKCgoKihfcEJ1ZlZBICsgMTIpIDw8IDgpICsgKihfcEJ1ZlZBICsgMTMpKSA+IDE1MDApCQlcCkBAIC04MjcsNyArMzY0LDcgQEAKIAl9CQkJCQkJCQkJCQkJCQkJXAogfQogCi0vLyBOZXcgRGVmaW5lIGZvciBuZXcgVHggUGF0aC4KKy8qIE5ldyBEZWZpbmUgZm9yIG5ldyBUeCBQYXRoLiAqLwogI2RlZmluZSBFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX09GRlNFVChfcEJ1ZlZBLCBfcEV4dHJhTGxjU25hcEVuY2FwKQlcCiB7CQkJCQkJCQkJCQkJCQkJCVwKIAlpZiAoKCgqKF9wQnVmVkEpIDw8IDgpICsgKihfcEJ1ZlZBICsgMSkpID4gMTUwMCkJCQlcCkBAIC04NDUsNyArMzgyLDYgQEAKIAl9CQkJCQkJCQkJCQkJCQkJXAogfQogCi0KICNkZWZpbmUgTUFLRV84MDJfM19IRUFERVIoX3AsIF9wTWFjMSwgX3BNYWMyLCBfcFR5cGUpICAgICAgICAgICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBOZGlzTW92ZU1lbW9yeShfcCwgX3BNYWMxLCBNQUNfQUREUl9MRU4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTg1MywxMyArMzg5LDEzIEBACiAgICAgTmRpc01vdmVNZW1vcnkoKF9wICsgTUFDX0FERFJfTEVOICogMiksIF9wVHlwZSwgTEVOR1RIXzgwMl8zX1RZUEUpOyBcCiB9CiAKLS8vIGlmIHBEYXRhIGhhcyBubyBMTEMvU05BUCAobmVpdGhlciBSRkMxMDQyIG5vciBCcmlkZ2UgdHVubmVsKSwga2VlcCBpdCB0aGF0IHdheS4KLS8vIGVsc2UgaWYgdGhlIHJlY2VpdmVkIGZyYW1lIGlzIExMQy9TTkFQLWVuY2FwZWQgSVBYIG9yIEFQUExFVEFMSywgcHJlc2VydmUgdGhlIExMQy9TTkFQIGZpZWxkCi0vLyBlbHNlIHJlbW92ZSB0aGUgTExDL1NOQVAgZmllbGQgZnJvbSB0aGUgcmVzdWx0IEV0aGVybmV0IGZyYW1lCi0vLyBQYXRjaCBmb3IgV0hRTCBvbmx5LCB3aGljaCBkaWQgbm90IHR1cm4gb24gTmV0YmlvcyBidXQgdXNlIElQWCB3aXRoaW4gaXRzIHBheWxvYWQKLS8vIE5vdGU6Ci0vLyAgICAgX3BEYXRhICYgX0RhdGFTaXplIG1heSBiZSBhbHRlcmVkIChyZW1vdmUgOC1ieXRlIExMQy9TTkFQKSBieSB0aGlzIE1BQ1JPCi0vLyAgICAgX3BSZW1vdmVkTExDU05BUDogcG9pbnRlciB0byByZW1vdmVkIExMQy9TTkFQOyBOVUxMIGlzIG5vdCByZW1vdmVkCisvKiBpZiBwRGF0YSBoYXMgbm8gTExDL1NOQVAgKG5laXRoZXIgUkZDMTA0MiBub3IgQnJpZGdlIHR1bm5lbCksIGtlZXAgaXQgdGhhdCB3YXkuICovCisvKiBlbHNlIGlmIHRoZSByZWNlaXZlZCBmcmFtZSBpcyBMTEMvU05BUC1lbmNhcGVkIElQWCBvciBBUFBMRVRBTEssIHByZXNlcnZlIHRoZSBMTEMvU05BUCBmaWVsZCAqLworLyogZWxzZSByZW1vdmUgdGhlIExMQy9TTkFQIGZpZWxkIGZyb20gdGhlIHJlc3VsdCBFdGhlcm5ldCBmcmFtZSAqLworLyogUGF0Y2ggZm9yIFdIUUwgb25seSwgd2hpY2ggZGlkIG5vdCB0dXJuIG9uIE5ldGJpb3MgYnV0IHVzZSBJUFggd2l0aGluIGl0cyBwYXlsb2FkICovCisvKiBOb3RlOiAqLworLyogICAgIF9wRGF0YSAmIF9EYXRhU2l6ZSBtYXkgYmUgYWx0ZXJlZCAocmVtb3ZlIDgtYnl0ZSBMTEMvU05BUCkgYnkgdGhpcyBNQUNSTyAqLworLyogICAgIF9wUmVtb3ZlZExMQ1NOQVA6IHBvaW50ZXIgdG8gcmVtb3ZlZCBMTEMvU05BUDsgTlVMTCBpcyBub3QgcmVtb3ZlZCAqLwogI2RlZmluZSBDT05WRVJUX1RPXzgwMl8zKF9wODAyM2hkciwgX3BEQSwgX3BTQSwgX3BEYXRhLCBfRGF0YVNpemUsIF9wUmVtb3ZlZExMQ1NOQVApICAgICAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGNoYXIgTExDX0xlblsyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtODY4LDEzICs0MDQsMTMgQEAKICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KFNOQVBfODAyXzFILCBfcERhdGEsIDYpICB8fCAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgTmRpc0VxdWFsTWVtb3J5KFNOQVBfQlJJREdFX1RVTk5FTCwgX3BEYXRhLCA2KSkgICAgICAgICAgICAgICAgIFwKICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgUFVDSEFSIHBQcm90byA9IF9wRGF0YSArIDY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdTggKnBQcm90byA9IF9wRGF0YSArIDY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgaWYgKChOZGlzRXF1YWxNZW1vcnkoSVBYLCBwUHJvdG8sIDIpIHx8IE5kaXNFcXVhbE1lbW9yeShBUFBMRV9UQUxLLCBwUHJvdG8sIDIpKSAmJiAgXAogICAgICAgICAgICAgTmRpc0VxdWFsTWVtb3J5KFNOQVBfODAyXzFILCBfcERhdGEsIDYpKSAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgTExDX0xlblswXSA9IChVQ0hBUikoX0RhdGFTaXplIC8gMjU2KTsgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgTExDX0xlblsxXSA9IChVQ0hBUikoX0RhdGFTaXplICUgMjU2KTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTExDX0xlblswXSA9ICh1OCkoX0RhdGFTaXplIC8gMjU2KTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTExDX0xlblsxXSA9ICh1OCkoX0RhdGFTaXplICUgMjU2KTsgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgTUFLRV84MDJfM19IRUFERVIoX3A4MDIzaGRyLCBfcERBLCBfcFNBLCBMTENfTGVuKTsgICAgICAgICAgXAogICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtODg3LDU1MSArNDIzLDQzNyBAQAogICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBMTENfTGVuWzBdID0gKFVDSEFSKShfRGF0YVNpemUgLyAyNTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBMTENfTGVuWzFdID0gKFVDSEFSKShfRGF0YVNpemUgJSAyNTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBMTENfTGVuWzBdID0gKHU4KShfRGF0YVNpemUgLyAyNTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBMTENfTGVuWzFdID0gKHU4KShfRGF0YVNpemUgJSAyNTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBNQUtFXzgwMl8zX0hFQURFUihfcDgwMjNoZHIsIF9wREEsIF9wU0EsIExMQ19MZW4pOyAgICAgICAgICAgICAgXAogICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfQogCi0jZGVmaW5lIFNXSVRDSF9BQiggX3BBQSwgX3BCQikgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBQVk9JRCBwQ0M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwQ0MgPSBfcEJCOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX3BCQiA9IF9wQUE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBfcEFBID0gcENDOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLS8vIEVucXVldWUgdGhpcyBmcmFtZSB0byBNTE1FIGVuZ2luZQotLy8gV2UgbmVlZCB0byBlbnF1ZXVlIHRoZSB3aG9sZSBmcmFtZSBiZWNhdXNlIE1MTUUgbmVlZCB0byBwYXNzIGRhdGEgdHlwZQotLy8gaW5mb3JtYXRpb24gZnJvbSA4MDIuMTEgaGVhZGVyCi0jaWZkZWYgUlQyODYwCisvKiBFbnF1ZXVlIHRoaXMgZnJhbWUgdG8gTUxNRSBlbmdpbmUgKi8KKy8qIFdlIG5lZWQgdG8gZW5xdWV1ZSB0aGUgd2hvbGUgZnJhbWUgYmVjYXVzZSBNTE1FIG5lZWQgdG8gcGFzcyBkYXRhIHR5cGUgKi8KKy8qIGluZm9ybWF0aW9uIGZyb20gODAyLjExIGhlYWRlciAqLworI2lmZGVmIFJUTVBfTUFDX1BDSQogI2RlZmluZSBSRVBPUlRfTUdNVF9GUkFNRV9UT19NTE1FKF9wQWQsIFdjaWQsIF9wRnJhbWUsIF9GcmFtZVNpemUsIF9Sc3NpMCwgX1Jzc2kxLCBfUnNzaTIsIF9QbGNwU2lnbmFsKSAgICAgICAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBVSU5UMzIgSGlnaDMyVFNGLCBMb3czMlRTRjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHUzMiBIaWdoMzJUU0YsIExvdzMyVFNGOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgUlRNUF9JT19SRUFEMzIoX3BBZCwgVFNGX1RJTUVSX0RXMSwgJkhpZ2gzMlRTRik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIFJUTVBfSU9fUkVBRDMyKF9wQWQsIFRTRl9USU1FUl9EVzAsICZMb3czMlRTRik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNbG1lRW5xdWV1ZUZvclJlY3YoX3BBZCwgV2NpZCwgSGlnaDMyVFNGLCBMb3czMlRTRiwgKFVDSEFSKV9Sc3NpMCwgKFVDSEFSKV9Sc3NpMSwoVUNIQVIpX1Jzc2kyLF9GcmFtZVNpemUsIF9wRnJhbWUsIChVQ0hBUilfUGxjcFNpZ25hbCk7ICAgXAorICAgIE1sbWVFbnF1ZXVlRm9yUmVjdihfcEFkLCBXY2lkLCBIaWdoMzJUU0YsIExvdzMyVFNGLCAodTgpX1Jzc2kwLCAodTgpX1Jzc2kxLCh1OClfUnNzaTIsX0ZyYW1lU2l6ZSwgX3BGcmFtZSwgKHU4KV9QbGNwU2lnbmFsKTsgICBcCiB9Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKyNpZmRlZiBSVE1QX01BQ19VU0IKICNkZWZpbmUgUkVQT1JUX01HTVRfRlJBTUVfVE9fTUxNRShfcEFkLCBXY2lkLCBfcEZyYW1lLCBfRnJhbWVTaXplLCBfUnNzaTAsIF9Sc3NpMSwgX1Jzc2kyLCBfUGxjcFNpZ25hbCkgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVUlOVDMyIEhpZ2gzMlRTRj0wLCBMb3czMlRTRj0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWxtZUVucXVldWVGb3JSZWN2KF9wQWQsIFdjaWQsIEhpZ2gzMlRTRiwgTG93MzJUU0YsIChVQ0hBUilfUnNzaTAsIChVQ0hBUilfUnNzaTEsKFVDSEFSKV9Sc3NpMixfRnJhbWVTaXplLCBfcEZyYW1lLCAoVUNIQVIpX1BsY3BTaWduYWwpOyAgIFwKKyAgICB1MzIgSGlnaDMyVFNGPTAsIExvdzMyVFNGPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNbG1lRW5xdWV1ZUZvclJlY3YoX3BBZCwgV2NpZCwgSGlnaDMyVFNGLCBMb3czMlRTRiwgKHU4KV9Sc3NpMCwgKHU4KV9Sc3NpMSwodTgpX1Jzc2kyLF9GcmFtZVNpemUsIF9wRnJhbWUsICh1OClfUGxjcFNpZ25hbCk7ICAgXAogfQotI2VuZGlmIC8vIFJUMjg3MCAvLworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCi0vL05lZWQgdG8gY29sbGVjdCBlYWNoIGFudCdzIHJzc2kgY29uY3VycmVudGx5Ci0vL3Jzc2kxIGlzIHJlcG9ydCB0byBwYWlyMiBBbnQgYW5kIHJzczIgaXMgcmVwcm90IHRvIHBhaXIxIEFudCB3aGVuIDQgQW50Ci0jZGVmaW5lIENPTExFQ1RfUlhfQU5URU5OQV9BVkVSQUdFX1JTU0koX3BBZCwgX3Jzc2kxLCBfcnNzaTIpCQkJCQlcCi17CQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JU0hPUlQJQXZnUnNzaTsJCQkJCQkJCQkJCQkJCQlcCi0JVUNIQVIJVXNlZEFudDsJCQkJCQkJCQkJCQkJCQlcCi0JaWYgKF9wQWQtPlJ4QW50LkV2YWx1YXRlUGVyaW9kID09IDApCQkJCQkJCQkJXAotCXsJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCVVzZWRBbnQgPSBfcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudDsJCQkJCQkJXAotCQlBdmdSc3NpID0gX3BBZC0+UnhBbnQuUGFpcjFBdmdSc3NpW1VzZWRBbnRdOwkJCQkJCVwKLQkJaWYgKEF2Z1Jzc2kgPCAwKQkJCQkJCQkJCQkJCQlcCi0JCQlBdmdSc3NpID0gQXZnUnNzaSAtIChBdmdSc3NpID4+IDMpICsgX3Jzc2kxOwkJCQkJXAotCQllbHNlCQkJCQkJCQkJCQkJCQkJCVwKLQkJCUF2Z1Jzc2kgPSBfcnNzaTEgPDwgMzsJCQkJCQkJCQkJCVwKLQkJX3BBZC0+UnhBbnQuUGFpcjFBdmdSc3NpW1VzZWRBbnRdID0gQXZnUnNzaTsJCQkJCQlcCi0JfQkJCQkJCQkJCQkJCQkJCQkJCVwKLQllbHNlCQkJCQkJCQkJCQkJCQkJCQlcCi0JewkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJVXNlZEFudCA9IF9wQWQtPlJ4QW50LlBhaXIxU2Vjb25kYXJ5UnhBbnQ7CQkJCQkJCVwKLQkJQXZnUnNzaSA9IF9wQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVtVc2VkQW50XTsJCQkJCQlcCi0JCWlmICgoQXZnUnNzaSA8IDApICYmIChfcEFkLT5SeEFudC5GaXJzdFBrdEFycml2ZWRXaGVuRXZhbHVhdGUpKQkJXAotCQkJQXZnUnNzaSA9IEF2Z1Jzc2kgLSAoQXZnUnNzaSA+PiAzKSArIF9yc3NpMTsJCQkJCVwKLQkJZWxzZQkJCQkJCQkJCQkJCQkJCQlcCi0JCXsJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCV9wQWQtPlJ4QW50LkZpcnN0UGt0QXJyaXZlZFdoZW5FdmFsdWF0ZSA9IFRSVUU7CQkJCQlcCi0JCQlBdmdSc3NpID0gX3Jzc2kxIDw8IDM7CQkJCQkJCQkJCQlcCi0JCX0JCQkJCQkJCQkJCQkJCQkJCVwKLQkJX3BBZC0+UnhBbnQuUGFpcjFBdmdSc3NpW1VzZWRBbnRdID0gQXZnUnNzaTsJCQkJCQlcCi0JCV9wQWQtPlJ4QW50LlJjdlBrdE51bVdoZW5FdmFsdWF0ZSsrOwkJCQkJCQkJXAotCX0JCQkJCQkJCQkJCQkJCQkJCQlcCi19Ci0KLSNkZWZpbmUgTkRJU19RVUVSWV9CVUZGRVIoX05kaXNCdWYsIF9wcFZBLCBfcEJ1ZkxlbikgICAgICAgICAgICAgICAgICAgIFwKLSAgICBOZGlzUXVlcnlCdWZmZXIoX05kaXNCdWYsIF9wcFZBLCBfcEJ1ZkxlbikKLQotI2RlZmluZSBNQUNfQUREUl9FUVVBTChwQWRkcjEscEFkZHIyKSAgICAgICAgICAgUlRNUEVxdWFsTWVtb3J5KChQVk9JRCkocEFkZHIxKSwgKFBWT0lEKShwQWRkcjIpLCBNQUNfQUREUl9MRU4pCisjZGVmaW5lIE1BQ19BRERSX0VRVUFMKHBBZGRyMSxwQWRkcjIpICAgICAgICAgICBSVE1QRXF1YWxNZW1vcnkoKHZvaWQgKikocEFkZHIxKSwgKHZvaWQgKikocEFkZHIyKSwgTUFDX0FERFJfTEVOKQogI2RlZmluZSBTU0lEX0VRVUFMKHNzaWQxLCBsZW4xLCBzc2lkMiwgbGVuMikgICAgKChsZW4xPT1sZW4yKSAmJiAoUlRNUEVxdWFsTWVtb3J5KHNzaWQxLCBzc2lkMiwgbGVuMSkpKQogCi0vLwotLy8gQ2hlY2sgaWYgaXQgaXMgSmFwYW4gVzUzKGNoNTIsNTYsNjAsNjQpIGNoYW5uZWwuCi0vLworLyogKi8KKy8qIENoZWNrIGlmIGl0IGlzIEphcGFuIFc1MyhjaDUyLDU2LDYwLDY0KSBjaGFubmVsLiAqLworLyogKi8KICNkZWZpbmUgSmFwYW5DaGFubmVsQ2hlY2soY2hhbm5lbCkgICgoY2hhbm5lbCA9PSA1MikgfHwgKGNoYW5uZWwgPT0gNTYpIHx8IChjaGFubmVsID09IDYwKSB8fCAoY2hhbm5lbCA9PSA2NCkpCiAKLSNpZmRlZiBSVDI4NjAKKyNkZWZpbmUgU1RBX0VYVFJBX1NFVFRJTkcoX3BBZCkKKwogI2RlZmluZSBTVEFfUE9SVF9TRUNVUkVEKF9wQWQpIFwKIHsgXAotCV9wQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOyBcCi0JUlRNUF9TRVRfUFNGTEFHKF9wQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7IFwKLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCYoX3BBZCktPk1hY1RhYkxvY2spOyBcCi0JX3BBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUG9ydFNlY3VyZWQgPSBfcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQ7IFwKKwlCT09MRUFOCUNhbmNlbGxlZDsgXAorCShfcEFkKS0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7IFwKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCYoKF9wQWQpLT5NYWNUYWJMb2NrKSk7IFwKKwkoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBvcnRTZWN1cmVkID0gKF9wQWQpLT5TdGFDZmcuUG9ydFNlY3VyZWQ7IFwKKwkoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbDtcCiAJTmRpc1JlbGVhc2VTcGluTG9jaygmKF9wQWQpLT5NYWNUYWJMb2NrKTsgXAorCVJUTVBDYW5jZWxUaW1lcigmKChfcEFkKS0+TWxtZS5MaW5rRG93blRpbWVyKSwgJkNhbmNlbGxlZCk7XAorCVNUQV9FWFRSQV9TRVRUSU5HKF9wQWQpOyBcCiB9Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLSNkZWZpbmUgU1RBX1BPUlRfU0VDVVJFRChfcEFkKSBcCi17IFwKLQlfcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsgXAotCU5kaXNBY3F1aXJlU3BpbkxvY2soJl9wQWQtPk1hY1RhYkxvY2spOyBcCi0JX3BBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUG9ydFNlY3VyZWQgPSBfcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQ7IFwKLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZfcEFkLT5NYWNUYWJMb2NrKTsgXAotfQotI2VuZGlmCiAKLS8vCi0vLyBSZWdpc3RlciBzZXQgcGFpciBmb3IgaW5pdGlhbHphdGlvbiByZWdpc3RlciBzZXQgZGVmaW5pdGlvbgotLy8KLXR5cGVkZWYgc3RydWN0ICBfUlRNUF9SRUdfUEFJUgotewotCVVMT05HICAgUmVnaXN0ZXI7Ci0JVUxPTkcgICBWYWx1ZTsKLX0gUlRNUF9SRUdfUEFJUiwgKlBSVE1QX1JFR19QQUlSOworLyogKi8KKy8qICBEYXRhIGJ1ZmZlciBmb3IgRE1BIG9wZXJhdGlvbiwgdGhlIGJ1ZmZlciBtdXN0IGJlIGNvbnRpZ3VvdXMgcGh5c2ljYWwgbWVtb3J5ICovCisvKiAgQm90aCBETUEgdG8gLyBmcm9tIENQVSB1c2UgdGhlIHNhbWUgc3RydWN0dXJlLiAqLworLyogKi8KK3N0cnVjdCBydF9ydG1wX2RtYWJ1ZiB7CisJdW5zaWduZWQgbG9uZyBBbGxvY1NpemU7CisJdm9pZCAqQWxsb2NWYTsJCS8qIFR4QnVmIHZpcnR1YWwgYWRkcmVzcyAqLworCWRtYV9hZGRyX3QgQWxsb2NQYTsJLyogVHhCdWYgcGh5c2ljYWwgYWRkcmVzcyAqLworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgIF9SRUdfUEFJUgotewotCVVDSEFSICAgUmVnaXN0ZXI7Ci0JVUNIQVIgICBWYWx1ZTsKLX0gUkVHX1BBSVIsICpQUkVHX1BBSVI7CisvKiAqLworLyogQ29udHJvbCBibG9jayAoRGVzY3JpcHRvcikgZm9yIGFsbCByaW5nIGRlc2NyaXB0b3IgRE1BIG9wZXJhdGlvbiwgYnVmZmVyIG11c3QgYmUgKi8KKy8qIGNvbnRpZ3VvdXMgcGh5c2ljYWwgbWVtb3J5LiBjaGFyIHN0b3JlZCB0aGUgYmluZGluZyBSeCBwYWNrZXQgZGVzY3JpcHRvciAqLworLyogd2hpY2ggd29uJ3QgYmUgcmVsZWFzZWQsIGRyaXZlciBoYXMgdG8gd2FpdCB1bnRpbCB1cHBlciBsYXllciByZXR1cm4gdGhlIHBhY2tldCAqLworLyogYmVmb3JlIGdpdmVpbmcgdXAgdGhpcyByeCByaW5nIGRlc2NyaXB0b3IgdG8gQVNJQy4gTkRJU19CVUZGRVIgaXMgYXNzb2NhaXRlZCBwYWlyICovCisvKiB0byBkZXNjcmliZSB0aGUgcGFja2V0IGJ1ZmZlci4gRm9yIFR4LCBjaGFyIHN0b3JlZCB0aGUgdHggcGFja2V0IGRlc2NyaXB0b3IgKi8KKy8qIHdoaWNoIGRyaXZlciBzaG91bGQgQUNLIHVwcGVyIGxheWVyIHdoZW4gdGhlIHR4IGlzIHBoeXNpY2FsbHkgZG9uZSBvciBmYWlsZWQuICovCisvKiAqLworc3RydWN0IHJ0X3J0bXBfZG1hY2IgeworCXVuc2lnbmVkIGxvbmcgQWxsb2NTaXplOwkvKiBDb250cm9sIGJsb2NrIHNpemUgKi8KKwl2b2lkICpBbGxvY1ZhOwkJLyogQ29udHJvbCBibG9jayB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlkbWFfYWRkcl90IEFsbG9jUGE7CS8qIENvbnRyb2wgYmxvY2sgcGh5c2ljYWwgYWRkcmVzcyAqLworCXZvaWQgKnBOZGlzUGFja2V0OworCXZvaWQgKnBOZXh0TmRpc1BhY2tldDsKIAotLy8KLS8vIFJlZ2lzdGVyIHNldCBwYWlyIGZvciBpbml0aWFsemF0aW9uIHJlZ2lzdGVyIHNldCBkZWZpbml0aW9uCi0vLwotdHlwZWRlZiBzdHJ1Y3QgIF9SVE1QX1JGX1JFR1MKLXsKLQlVQ0hBUiAgIENoYW5uZWw7Ci0JVUxPTkcgICBSMTsKLQlVTE9ORyAgIFIyOwotCVVMT05HICAgUjM7Ci0JVUxPTkcgICBSNDsKLX0gUlRNUF9SRl9SRUdTLCAqUFJUTVBfUkZfUkVHUzsKKwlzdHJ1Y3QgcnRfcnRtcF9kbWFidWYgRG1hQnVmOwkvKiBBc3NvY2lhdGVkIERNQSBidWZmZXIgc3RydWN0dXJlICovCit9OwogCi10eXBlZGVmIHN0cnVjdCBfRlJFUVVFTkNZX0lURU0gewotCVVDSEFSCUNoYW5uZWw7Ci0JVUNIQVIJTjsKLQlVQ0hBUglSOwotCVVDSEFSCUs7Ci19IEZSRVFVRU5DWV9JVEVNLCAqUEZSRVFVRU5DWV9JVEVNOworc3RydWN0IHJ0X3J0bXBfdHhfcmluZyB7CisJc3RydWN0IHJ0X3J0bXBfZG1hY2IgQ2VsbFtUWF9SSU5HX1NJWkVdOworCXUzMiBUeENwdUlkeDsKKwl1MzIgVHhEbWFJZHg7CisJdTMyIFR4U3dGcmVlSWR4OwkvKiBzb2Z0d2FyZSBuZXh0IGZyZWUgdHggaW5kZXggKi8KK307CiAKLS8vCi0vLyAgRGF0YSBidWZmZXIgZm9yIERNQSBvcGVyYXRpb24sIHRoZSBidWZmZXIgbXVzdCBiZSBjb250aWd1b3VzIHBoeXNpY2FsIG1lbW9yeQotLy8gIEJvdGggRE1BIHRvIC8gZnJvbSBDUFUgdXNlIHRoZSBzYW1lIHN0cnVjdHVyZS4KLS8vCi10eXBlZGVmIHN0cnVjdCAgX1JUTVBfRE1BQlVGCi17Ci0JVUxPTkcgICAgICAgICAgICAgICAgICAgQWxsb2NTaXplOwotCVBWT0lEICAgICAgICAgICAgICAgICAgIEFsbG9jVmE7ICAgICAgICAgICAgLy8gVHhCdWYgdmlydHVhbCBhZGRyZXNzCi0JTkRJU19QSFlTSUNBTF9BRERSRVNTICAgQWxsb2NQYTsgICAgICAgICAgICAvLyBUeEJ1ZiBwaHlzaWNhbCBhZGRyZXNzCi19IFJUTVBfRE1BQlVGLCAqUFJUTVBfRE1BQlVGOworc3RydWN0IHJ0X3J0bXBfcnhfcmluZyB7CisJc3RydWN0IHJ0X3J0bXBfZG1hY2IgQ2VsbFtSWF9SSU5HX1NJWkVdOworCXUzMiBSeENwdUlkeDsKKwl1MzIgUnhEbWFJZHg7CisJaW50IFJ4U3dSZWFkSWR4OwkvKiBzb2Z0d2FyZSBuZXh0IHJlYWQgaW5kZXggKi8KK307CiAKK3N0cnVjdCBydF9ydG1wX21nbXRfcmluZyB7CisJc3RydWN0IHJ0X3J0bXBfZG1hY2IgQ2VsbFtNR01UX1JJTkdfU0laRV07CisJdTMyIFR4Q3B1SWR4OworCXUzMiBUeERtYUlkeDsKKwl1MzIgVHhTd0ZyZWVJZHg7CS8qIHNvZnR3YXJlIG5leHQgZnJlZSB0eCBpbmRleCAqLworfTsKIAotdHlwZWRlZgl1bmlvbglfSEVBREVSXzgwMl8xMV9TRVF7Ci0gICAgc3RydWN0IHsKLQlVU0hPUlQJCQlGcmFnOjQ7Ci0JVVNIT1JUCQkJU2VxdWVuY2U6MTI7Ci0gICAgfSAgIGZpZWxkOwotICAgIFVTSE9SVCAgICAgICAgICAgdmFsdWU7Ci19CUhFQURFUl84MDJfMTFfU0VRLCAqUEhFQURFUl84MDJfMTFfU0VROworLyogKi8KKy8qICBTdGF0aXN0aWMgY291bnRlciBzdHJ1Y3R1cmUgKi8KKy8qICovCitzdHJ1Y3QgcnRfY291bnRlcl84MDJfMyB7CisJLyogR2VuZXJhbCBTdGF0cyAqLworCXVuc2lnbmVkIGxvbmcgR29vZFRyYW5zbWl0czsKKwl1bnNpZ25lZCBsb25nIEdvb2RSZWNlaXZlczsKKwl1bnNpZ25lZCBsb25nIFR4RXJyb3JzOworCXVuc2lnbmVkIGxvbmcgUnhFcnJvcnM7CisJdW5zaWduZWQgbG9uZyBSeE5vQnVmZmVyOwogCi0vLwotLy8gIERhdGEgYnVmZmVyIGZvciBETUEgb3BlcmF0aW9uLCB0aGUgYnVmZmVyIG11c3QgYmUgY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkKLS8vICBCb3RoIERNQSB0byAvIGZyb20gQ1BVIHVzZSB0aGUgc2FtZSBzdHJ1Y3R1cmUuCi0vLwotdHlwZWRlZiBzdHJ1Y3QgIF9SVE1QX1JFT1JERVJCVUYKLXsKLQlCT09MRUFOCQkJSXNGdWxsOwotCVBWT0lEICAgICAgICAgICAgICAgICAgIEFsbG9jVmE7ICAgICAgICAgICAgLy8gVHhCdWYgdmlydHVhbCBhZGRyZXNzCi0JVUNIQVIJCQlIZWFkZXI4MDJfM1sxNF07Ci0JSEVBREVSXzgwMl8xMV9TRVEJCQlTZXF1ZW5jZTsJLy9zdXBwb3J0IGNvbXByZXNzZWQgYml0bWFwIEJBLCBzbyBubyBjb25zaWRlciBmcmFnbWVudCBpbiBCQQotCVVDSEFSIAkJRGF0YU9mZnNldDsKLQlVU0hPUlQgCQlEYXRhc2l6ZTsKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBBbGxvY1NpemU7Ci0jaWZkZWYgUlQyODYwCi0JTkRJU19QSFlTSUNBTF9BRERSRVNTICAgQWxsb2NQYTsgICAgICAgICAgICAvLyBUeEJ1ZiBwaHlzaWNhbCBhZGRyZXNzCi0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQlQVUNIQVIJCQkJCUFsbG9jUGE7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi19ICAgUlRNUF9SRU9SREVSQlVGLCAqUFJUTVBfUkVPUkRFUkJVRjsKKwkvKiBFdGhlcm5ldCBTdGF0cyAqLworCXVuc2lnbmVkIGxvbmcgUmN2QWxpZ25tZW50RXJyb3JzOworCXVuc2lnbmVkIGxvbmcgT25lQ29sbGlzaW9uOworCXVuc2lnbmVkIGxvbmcgTW9yZUNvbGxpc2lvbnM7CiAKLS8vCi0vLyBDb250cm9sIGJsb2NrIChEZXNjcmlwdG9yKSBmb3IgYWxsIHJpbmcgZGVzY3JpcHRvciBETUEgb3BlcmF0aW9uLCBidWZmZXIgbXVzdCBiZQotLy8gY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkuIE5ESVNfUEFDS0VUIHN0b3JlZCB0aGUgYmluZGluZyBSeCBwYWNrZXQgZGVzY3JpcHRvcgotLy8gd2hpY2ggd29uJ3QgYmUgcmVsZWFzZWQsIGRyaXZlciBoYXMgdG8gd2FpdCB1bnRpbCB1cHBlciBsYXllciByZXR1cm4gdGhlIHBhY2tldAotLy8gYmVmb3JlIGdpdmVpbmcgdXAgdGhpcyByeCByaW5nIGRlc2NyaXB0b3IgdG8gQVNJQy4gTkRJU19CVUZGRVIgaXMgYXNzb2NhaXRlZCBwYWlyCi0vLyB0byBkZXNjcmliZSB0aGUgcGFja2V0IGJ1ZmZlci4gRm9yIFR4LCBORElTX1BBQ0tFVCBzdG9yZWQgdGhlIHR4IHBhY2tldCBkZXNjcmlwdG9yCi0vLyB3aGljaCBkcml2ZXIgc2hvdWxkIEFDSyB1cHBlciBsYXllciB3aGVuIHRoZSB0eCBpcyBwaHlzaWNhbGx5IGRvbmUgb3IgZmFpbGVkLgotLy8KLXR5cGVkZWYgc3RydWN0IF9SVE1QX0RNQUNCCi17Ci0JVUxPTkcgICAgICAgICAgICAgICAgICAgQWxsb2NTaXplOyAgICAgICAgICAvLyBDb250cm9sIGJsb2NrIHNpemUKLQlQVk9JRCAgICAgICAgICAgICAgICAgICBBbGxvY1ZhOyAgICAgICAgICAgIC8vIENvbnRyb2wgYmxvY2sgdmlydHVhbCBhZGRyZXNzCi0JTkRJU19QSFlTSUNBTF9BRERSRVNTICAgQWxsb2NQYTsgICAgICAgICAgICAvLyBDb250cm9sIGJsb2NrIHBoeXNpY2FsIGFkZHJlc3MKLQlQTkRJU19QQUNLRVQgcE5kaXNQYWNrZXQ7Ci0JUE5ESVNfUEFDS0VUIHBOZXh0TmRpc1BhY2tldDsKK307CiAKLQlSVE1QX0RNQUJVRiAgICAgICAgICAgICBEbWFCdWY7ICAgICAgICAgICAgIC8vIEFzc29jaWF0ZWQgRE1BIGJ1ZmZlciBzdHJ1Y3R1cmUKLX0gUlRNUF9ETUFDQiwgKlBSVE1QX0RNQUNCOworc3RydWN0IHJ0X2NvdW50ZXJfODAyXzExIHsKKwl1bnNpZ25lZCBsb25nIExlbmd0aDsKKwlMQVJHRV9JTlRFR0VSIExhc3RUcmFuc21pdHRlZEZyYWdtZW50Q291bnQ7CisJTEFSR0VfSU5URUdFUiBUcmFuc21pdHRlZEZyYWdtZW50Q291bnQ7CisJTEFSR0VfSU5URUdFUiBNdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQ7CisJTEFSR0VfSU5URUdFUiBGYWlsZWRDb3VudDsKKwlMQVJHRV9JTlRFR0VSIFJldHJ5Q291bnQ7CisJTEFSR0VfSU5URUdFUiBNdWx0aXBsZVJldHJ5Q291bnQ7CisJTEFSR0VfSU5URUdFUiBSVFNTdWNjZXNzQ291bnQ7CisJTEFSR0VfSU5URUdFUiBSVFNGYWlsdXJlQ291bnQ7CisJTEFSR0VfSU5URUdFUiBBQ0tGYWlsdXJlQ291bnQ7CisJTEFSR0VfSU5URUdFUiBGcmFtZUR1cGxpY2F0ZUNvdW50OworCUxBUkdFX0lOVEVHRVIgUmVjZWl2ZWRGcmFnbWVudENvdW50OworCUxBUkdFX0lOVEVHRVIgTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50OworCUxBUkdFX0lOVEVHRVIgRkNTRXJyb3JDb3VudDsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9SVE1QX1RYX0JVRgotewotCVBRVUVVRV9FTlRSWSAgICBOZXh0OwotCVVDSEFSICAgICAgICAgICBJbmRleDsKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBBbGxvY1NpemU7ICAgICAgICAgIC8vIENvbnRyb2wgYmxvY2sgc2l6ZQotCVBWT0lEICAgICAgICAgICAgICAgICAgIEFsbG9jVmE7ICAgICAgICAgICAgLy8gQ29udHJvbCBibG9jayB2aXJ0dWFsIGFkZHJlc3MKLQlORElTX1BIWVNJQ0FMX0FERFJFU1MgICBBbGxvY1BhOyAgICAgICAgICAgIC8vIENvbnRyb2wgYmxvY2sgcGh5c2ljYWwgYWRkcmVzcwotfSBSVE1QX1RYQlVGLCAqUFJUTVBfVFhCVUY7CitzdHJ1Y3QgcnRfY291bnRlcl9yYWxpbmsgeworCXVuc2lnbmVkIGxvbmcgVHJhbnNtaXR0ZWRCeXRlQ291bnQ7CS8qIGJvdGggc3VjY2Vzc2Z1bCBhbmQgZmFpbHVyZSwgdXNlZCB0byBjYWxjdWxhdGUgVFggdGhyb3VnaHB1dCAqLworCXVuc2lnbmVkIGxvbmcgUmVjZWl2ZWRCeXRlQ291bnQ7CS8qIGJvdGggQ1JDIG9rYXkgYW5kIENSQyBlcnJvciwgdXNlZCB0byBjYWxjdWxhdGUgUlggdGhyb3VnaHB1dCAqLworCXVuc2lnbmVkIGxvbmcgQmVlbkRpc2Fzc29jaWF0ZWRDb3VudDsKKwl1bnNpZ25lZCBsb25nIEJhZENRSUF1dG9SZWNvdmVyeUNvdW50OworCXVuc2lnbmVkIGxvbmcgUG9vckNRSVJvYW1pbmdDb3VudDsKKwl1bnNpZ25lZCBsb25nIE1nbXRSaW5nRnVsbENvdW50OworCXVuc2lnbmVkIGxvbmcgUnhDb3VudFNpbmNlTGFzdE5VTEw7CisJdW5zaWduZWQgbG9uZyBSeENvdW50OworCXVuc2lnbmVkIGxvbmcgUnhSaW5nRXJyQ291bnQ7CisJdW5zaWduZWQgbG9uZyBLaWNrVHhDb3VudDsKKwl1bnNpZ25lZCBsb25nIFR4UmluZ0VyckNvdW50OworCUxBUkdFX0lOVEVHRVIgUmVhbEZjc0VyckNvdW50OworCXVuc2lnbmVkIGxvbmcgUGVuZGluZ05kaXNQYWNrZXRDb3VudDsKIAotdHlwZWRlZiBzdHJ1Y3QgX1JUTVBfUlhfQlVGCi17Ci0JQk9PTEVBTiAgICAgICAgICAgSW5Vc2U7Ci0JVUxPTkcgICAgICAgICAgIAlCeUJhUmVjSW5kZXg7Ci0JUlRNUF9SRU9SREVSQlVGCU1BUF9SWEJ1ZltNQVhfUlhfUkVPUkRFUkJVRl07Ci19IFJUTVBfUlhCVUYsICpQUlRNUF9SWEJVRjsKLXR5cGVkZWYgc3RydWN0IF9SVE1QX1RYX1JJTkcKLXsKLQlSVE1QX0RNQUNCICBDZWxsW1RYX1JJTkdfU0laRV07Ci0JVUlOVDMyCQlUeENwdUlkeDsKLQlVSU5UMzIJCVR4RG1hSWR4OwotCVVJTlQzMgkJVHhTd0ZyZWVJZHg7IAkvLyBzb2Z0d2FyZSBuZXh0IGZyZWUgdHggaW5kZXgKLX0gUlRNUF9UWF9SSU5HLCAqUFJUTVBfVFhfUklORzsKKwl1bnNpZ25lZCBsb25nIE9uZVNlY09zVHhDb3VudFtOVU1fT0ZfVFhfUklOR107CisJdW5zaWduZWQgbG9uZyBPbmVTZWNEbWFEb25lQ291bnRbTlVNX09GX1RYX1JJTkddOworCXUzMiBPbmVTZWNUeERvbmVDb3VudDsKKwl1bnNpZ25lZCBsb25nIE9uZVNlY1J4Q291bnQ7CisJdTMyIE9uZVNlY1R4QWdncmVnYXRpb25Db3VudDsKKwl1MzIgT25lU2VjUnhBZ2dyZWdhdGlvbkNvdW50OworCXUzMiBPbmVTZWNSZWNlaXZlZEJ5dGVDb3VudDsKKwl1MzIgT25lU2VjRnJhbWVEdXBsaWNhdGVDb3VudDsKIAotdHlwZWRlZiBzdHJ1Y3QgX1JUTVBfUlhfUklORwotewotCVJUTVBfRE1BQ0IgIENlbGxbUlhfUklOR19TSVpFXTsKLQlVSU5UMzIJCVJ4Q3B1SWR4OwotCVVJTlQzMgkJUnhEbWFJZHg7Ci0JSU5UMzIJCVJ4U3dSZWFkSWR4OyAJLy8gc29mdHdhcmUgbmV4dCByZWFkIGluZGV4Ci19IFJUTVBfUlhfUklORywgKlBSVE1QX1JYX1JJTkc7CisJdTMyIE9uZVNlY1RyYW5zbWl0dGVkQnl0ZUNvdW50OwkvKiBib3RoIHN1Y2Nlc3NmdWwgYW5kIGZhaWx1cmUsIHVzZWQgdG8gY2FsY3VsYXRlIFRYIHRocm91Z2hwdXQgKi8KKwl1MzIgT25lU2VjVHhOb1JldHJ5T2tDb3VudDsKKwl1MzIgT25lU2VjVHhSZXRyeU9rQ291bnQ7CisJdTMyIE9uZVNlY1R4RmFpbENvdW50OworCXUzMiBPbmVTZWNGYWxzZUNDQUNudDsJLyogQ0NBIGVycm9yIGNvdW50LCBmb3IgZGVidWcgcHVycG9zZSwgbWlnaHQgbW92ZSB0byBnbG9iYWwgY291bnRlciAqLworCXUzMiBPbmVTZWNSeE9rQ250OwkvKiBSWCB3aXRob3V0IGVycm9yICovCisJdTMyIE9uZVNlY1J4T2tEYXRhQ250OwkvKiB1bmljYXN0LXRvLW1lIERBVEEgZnJhbWUgY291bnQgKi8KKwl1MzIgT25lU2VjUnhGY3NFcnJDbnQ7CS8qIENSQyBlcnJvciAqLworCXUzMiBPbmVTZWNCZWFjb25TZW50Q250OworCXUzMiBMYXN0T25lU2VjVG90YWxUeENvdW50OwkvKiBPbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsgT25lU2VjVHhSZXRyeU9rQ291bnQgKyBPbmVTZWNUeEZhaWxDb3VudCAqLworCXUzMiBMYXN0T25lU2VjUnhPa0RhdGFDbnQ7CS8qIE9uZVNlY1J4T2tEYXRhQ250ICovCisJdW5zaWduZWQgbG9uZyBEdXBsaWNhdGVSY3Y7CisJdW5zaWduZWQgbG9uZyBUeEFnZ0NvdW50OworCXVuc2lnbmVkIGxvbmcgVHhOb25BZ2dDb3VudDsKKwl1bnNpZ25lZCBsb25nIFR4QWdnMU1QRFVDb3VudDsKKwl1bnNpZ25lZCBsb25nIFR4QWdnMk1QRFVDb3VudDsKKwl1bnNpZ25lZCBsb25nIFR4QWdnM01QRFVDb3VudDsKKwl1bnNpZ25lZCBsb25nIFR4QWdnNE1QRFVDb3VudDsKKwl1bnNpZ25lZCBsb25nIFR4QWdnNU1QRFVDb3VudDsKKwl1bnNpZ25lZCBsb25nIFR4QWdnNk1QRFVDb3VudDsKKwl1bnNpZ25lZCBsb25nIFR4QWdnN01QRFVDb3VudDsKKwl1bnNpZ25lZCBsb25nIFR4QWdnOE1QRFVDb3VudDsKKwl1bnNpZ25lZCBsb25nIFR4QWdnOU1QRFVDb3VudDsKKwl1bnNpZ25lZCBsb25nIFR4QWdnMTBNUERVQ291bnQ7CisJdW5zaWduZWQgbG9uZyBUeEFnZzExTVBEVUNvdW50OworCXVuc2lnbmVkIGxvbmcgVHhBZ2cxMk1QRFVDb3VudDsKKwl1bnNpZ25lZCBsb25nIFR4QWdnMTNNUERVQ291bnQ7CisJdW5zaWduZWQgbG9uZyBUeEFnZzE0TVBEVUNvdW50OworCXVuc2lnbmVkIGxvbmcgVHhBZ2cxNU1QRFVDb3VudDsKKwl1bnNpZ25lZCBsb25nIFR4QWdnMTZNUERVQ291bnQ7CiAKLXR5cGVkZWYgc3RydWN0IF9SVE1QX01HTVRfUklORwotewotCVJUTVBfRE1BQ0IgIENlbGxbTUdNVF9SSU5HX1NJWkVdOwotCVVJTlQzMgkJVHhDcHVJZHg7Ci0JVUlOVDMyCQlUeERtYUlkeDsKLQlVSU5UMzIJCVR4U3dGcmVlSWR4OyAvLyBzb2Z0d2FyZSBuZXh0IGZyZWUgdHggaW5kZXgKLX0gUlRNUF9NR01UX1JJTkcsICpQUlRNUF9NR01UX1JJTkc7CisJTEFSR0VfSU5URUdFUiBUcmFuc21pdHRlZE9jdGV0c0luQU1TRFU7CisJTEFSR0VfSU5URUdFUiBUcmFuc21pdHRlZEFNU0RVQ291bnQ7CisJTEFSR0VfSU5URUdFUiBSZWNlaXZlZE9jdGVzSW5BTVNEVUNvdW50OworCUxBUkdFX0lOVEVHRVIgUmVjZWl2ZWRBTVNEVUNvdW50OworCUxBUkdFX0lOVEVHRVIgVHJhbnNtaXR0ZWRBTVBEVUNvdW50OworCUxBUkdFX0lOVEVHRVIgVHJhbnNtaXR0ZWRNUERVc0luQU1QRFVDb3VudDsKKwlMQVJHRV9JTlRFR0VSIFRyYW5zbWl0dGVkT2N0ZXRzSW5BTVBEVUNvdW50OworCUxBUkdFX0lOVEVHRVIgTVBEVUluUmVjZWl2ZWRBTVBEVUNvdW50OworfTsKIAotLy8KLS8vICBTdGF0aXN0aWMgY291bnRlciBzdHJ1Y3R1cmUKLS8vCi10eXBlZGVmIHN0cnVjdCBfQ09VTlRFUl84MDJfMwotewotCS8vIEdlbmVyYWwgU3RhdHMKLQlVTE9ORyAgICAgICBHb29kVHJhbnNtaXRzOwotCVVMT05HICAgICAgIEdvb2RSZWNlaXZlczsKLQlVTE9ORyAgICAgICBUeEVycm9yczsKLQlVTE9ORyAgICAgICBSeEVycm9yczsKLQlVTE9ORyAgICAgICBSeE5vQnVmZmVyOworc3RydWN0IHJ0X2NvdW50ZXJfZHJzIHsKKwkvKiB0byByZWNvcmQgdGhlIGVhY2ggVFggcmF0ZSdzIHF1YWxpdHkuIDAgaXMgYmVzdCwgdGhlIGJpZ2dlciB0aGUgd29yc2UuICovCisJdTE2IFR4UXVhbGl0eVtNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSF07CisJdTggUEVSW01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKKwl1OCBUeFJhdGVVcFBlbmFsdHk7CS8qIGV4dHJhICMgb2Ygc2Vjb25kIHBlbmFsdHkgZHVlIHRvIGxhc3QgdW5zdGFibGUgY29uZGl0aW9uICovCisJdW5zaWduZWQgbG9uZyBDdXJyVHhSYXRlU3RhYmxlVGltZTsJLyogIyBvZiBzZWNvbmQgaW4gY3VycmVudCBUWCByYXRlICovCisJQk9PTEVBTiBmTm9pc3lFbnZpcm9ubWVudDsKKwlCT09MRUFOIGZMYXN0U2VjQWNjb3JkaW5nUlNTSTsKKwl1OCBMYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOwkvKiAwOiBubyBjaGFuZ2UsIDE6cmF0ZSBVUCwgMjpyYXRlIGRvd24gKi8KKwl1OCBMYXN0VGltZVR4UmF0ZUNoYW5nZUFjdGlvbjsJLypLZWVwIGxhc3QgdGltZSB2YWx1ZSBvZiBMYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uICovCisJdW5zaWduZWQgbG9uZyBMYXN0VHhPa0NvdW50OworfTsKIAotCS8vIEV0aGVybmV0IFN0YXRzCi0JVUxPTkcgICAgICAgUmN2QWxpZ25tZW50RXJyb3JzOwotCVVMT05HICAgICAgIE9uZUNvbGxpc2lvbjsKLQlVTE9ORyAgICAgICBNb3JlQ29sbGlzaW9uczsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKglzZWN1cml0eSBrZXkgcmVsYXRlZCBkYXRhIHN0cnVjdHVyZQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBydF9jaXBoZXJfa2V5IHsKKwl1OCBLZXlbMTZdOwkJLyogcmlnaHQgbm93IHdlIGltcGxlbWVudCA0IGtleXMsIDEyOCBiaXRzIG1heCAqLworCXU4IFJ4TWljWzhdOwkJLyogbWFrZSBhbGlnbm1lbnQgKi8KKwl1OCBUeE1pY1s4XTsKKwl1OCBUeFRzY1s2XTsJCS8qIDQ4Yml0IFRTQyB2YWx1ZSAqLworCXU4IFJ4VHNjWzZdOwkJLyogNDhiaXQgVFNDIHZhbHVlICovCisJdTggQ2lwaGVyQWxnOwkvKiAwLW5vbmUsIDE6V0VQNjQsIDI6V0VQMTI4LCAzOlRLSVAsIDQ6QUVTLCA1OkNLSVA2NCwgNjpDS0lQMTI4ICovCisJdTggS2V5TGVuOworCXU4IEJzc0lkWzZdOworCS8qIEtleSBsZW5ndGggZm9yIGVhY2gga2V5LCAwOiBlbnRyeSBpcyBpbnZhbGlkICovCisJdTggVHlwZTsJCS8qIEluZGljYXRlIFBhaXJ3aXNlL0dyb3VwIHdoZW4gcmVwb3J0aW5nIE1JQyBlcnJvciAqLworfTsKIAotfSBDT1VOVEVSXzgwMl8zLCAqUENPVU5URVJfODAyXzM7CisvKiBzdHJ1Y3R1cmUgdG8gZGVmaW5lIFdQQSBHcm91cCBLZXkgUmVrZXkgSW50ZXJ2YWwgKi8KK3N0cnVjdCBQQUNLRUQgcnRfODAyXzExX3dwYV9yZWtleSB7CisJdW5zaWduZWQgbG9uZyBSZUtleU1ldGhvZDsJLyogbWVjaGFuaXNtIGZvciByZWtleWluZzogMDpkaXNhYmxlLCAxOiB0aW1lLWJhc2VkLCAyOiBwYWNrZXQtYmFzZWQgKi8KKwl1bnNpZ25lZCBsb25nIFJlS2V5SW50ZXJ2YWw7CS8qIHRpbWUtYmFzZWQ6IHNlY29uZHMsIHBhY2tldC1iYXNlZDoga2lsby1wYWNrZXRzICovCit9OwogCi10eXBlZGVmIHN0cnVjdCBfQ09VTlRFUl84MDJfMTEgewotCVVMT05HICAgICAgICAgICBMZW5ndGg7Ci0JTEFSR0VfSU5URUdFUiAgIExhc3RUcmFuc21pdHRlZEZyYWdtZW50Q291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgIFRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50OwotCUxBUkdFX0lOVEVHRVIgICBGYWlsZWRDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgUmV0cnlDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgTXVsdGlwbGVSZXRyeUNvdW50OwotCUxBUkdFX0lOVEVHRVIgICBSVFNTdWNjZXNzQ291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgIFJUU0ZhaWx1cmVDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgQUNLRmFpbHVyZUNvdW50OwotCUxBUkdFX0lOVEVHRVIgICBGcmFtZUR1cGxpY2F0ZUNvdW50OwotCUxBUkdFX0lOVEVHRVIgICBSZWNlaXZlZEZyYWdtZW50Q291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgIE11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgRkNTRXJyb3JDb3VudDsKLX0gQ09VTlRFUl84MDJfMTEsICpQQ09VTlRFUl84MDJfMTE7CisjaWZkZWYgUlRNUF9NQUNfVVNCCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoJUlRVU0IgSS9PIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmUKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgcnRfc2V0X2FzaWNfd2NpZCB7CisJdW5zaWduZWQgbG9uZyBXQ0lEOwkJLyogbWVjaGFuaXNtIGZvciByZWtleWluZzogMDpkaXNhYmxlLCAxOiB0aW1lLWJhc2VkLCAyOiBwYWNrZXQtYmFzZWQgKi8KKwl1bnNpZ25lZCBsb25nIFNldFRpZDsJCS8qIHRpbWUtYmFzZWQ6IHNlY29uZHMsIHBhY2tldC1iYXNlZDoga2lsby1wYWNrZXRzICovCisJdW5zaWduZWQgbG9uZyBEZWxldGVUaWQ7CS8qIHRpbWUtYmFzZWQ6IHNlY29uZHMsIHBhY2tldC1iYXNlZDoga2lsby1wYWNrZXRzICovCisJdTggQWRkcltNQUNfQUREUl9MRU5dOwkvKiBhdm9pZCBpbiBpbnRlcnJ1cHQgd2hlbiB3cml0ZSBrZXkgKi8KK307CiAKLXR5cGVkZWYgc3RydWN0IF9DT1VOVEVSX1JBTElOSyB7Ci0JVUxPTkcgICAgICAgICAgIFRyYW5zbWl0dGVkQnl0ZUNvdW50OyAgIC8vIGJvdGggc3VjY2Vzc2Z1bCBhbmQgZmFpbHVyZSwgdXNlZCB0byBjYWxjdWxhdGUgVFggdGhyb3VnaHB1dAotI2lmZGVmIFJUMjg2MAotCVVMT05HICAgICAgICAgICBMYXN0UmVjZWl2ZWRCeXRlQ291bnQ7Ci0jZW5kaWYKLQlVTE9ORyAgICAgICAgICAgUmVjZWl2ZWRCeXRlQ291bnQ7ICAgICAgLy8gYm90aCBDUkMgb2theSBhbmQgQ1JDIGVycm9yLCB1c2VkIHRvIGNhbGN1bGF0ZSBSWCB0aHJvdWdocHV0Ci0JVUxPTkcgICAgICAgICAgIEJlZW5EaXNhc3NvY2lhdGVkQ291bnQ7Ci0JVUxPTkcgICAgICAgICAgIEJhZENRSUF1dG9SZWNvdmVyeUNvdW50OwotCVVMT05HICAgICAgICAgICBQb29yQ1FJUm9hbWluZ0NvdW50OwotCVVMT05HICAgICAgICAgICBNZ210UmluZ0Z1bGxDb3VudDsKLQlVTE9ORyAgICAgICAgICAgUnhDb3VudFNpbmNlTGFzdE5VTEw7Ci0JVUxPTkcgICAgICAgICAgIFJ4Q291bnQ7Ci0JVUxPTkcgICAgICAgICAgIFJ4UmluZ0VyckNvdW50OwotCVVMT05HICAgICAgICAgICBLaWNrVHhDb3VudDsKLQlVTE9ORyAgICAgICAgICAgVHhSaW5nRXJyQ291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgIFJlYWxGY3NFcnJDb3VudDsKLQlVTE9ORyAgICAgICAgICAgUGVuZGluZ05kaXNQYWNrZXRDb3VudDsKK3N0cnVjdCBydF9zZXRfYXNpY193Y2lkX2F0dHJpIHsKKwl1bnNpZ25lZCBsb25nIFdDSUQ7CQkvKiBtZWNoYW5pc20gZm9yIHJla2V5aW5nOiAwOmRpc2FibGUsIDE6IHRpbWUtYmFzZWQsIDI6IHBhY2tldC1iYXNlZCAqLworCXVuc2lnbmVkIGxvbmcgQ2lwaGVyOwkJLyogQVNJQyBDaXBoZXIgZGVmaW5pdGlvbiAqLworCXU4IEFkZHJbRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKK307CiAKLQlVTE9ORyAgICAgICAgICAgT25lU2VjT3NUeENvdW50W05VTV9PRl9UWF9SSU5HXTsKLQlVTE9ORyAgICAgICAgICAgT25lU2VjRG1hRG9uZUNvdW50W05VTV9PRl9UWF9SSU5HXTsKLQlVSU5UMzIgICAgICAgICAgT25lU2VjVHhEb25lQ291bnQ7Ci0JVUxPTkcgICAgICAgICAgIE9uZVNlY1J4Q291bnQ7Ci0JVUlOVDMyICAgICAgICAgIE9uZVNlY1R4QWdncmVnYXRpb25Db3VudDsKLQlVSU5UMzIgICAgICAgICAgT25lU2VjUnhBZ2dyZWdhdGlvbkNvdW50OworLyogZm9yIFVTQiBpbnRlcmZhY2UsIGF2b2lkIGluIGludGVycnVwdCB3aGVuIHdyaXRlIGtleSAqLworc3RydWN0IHJ0X2FkZF9wYWlyd2lzZV9rZXlfZW50cnkgeworCXU4IE1hY0FkZHJbNl07CisJdTE2IE1hY1RhYk1hdGNoV0NJRDsJLyogQVNJQyAqLworCXN0cnVjdCBydF9jaXBoZXJfa2V5IENpcGhlcktleTsKK307CiAKLQlVSU5UMzIgICAJCU9uZVNlY0ZyYW1lRHVwbGljYXRlQ291bnQ7CisvKiBDaXBoZXIgc3VpdGUgdHlwZSBmb3IgbWl4ZWQgbW9kZSBncm91cCBjaXBoZXIsIFA4MDIuMTFpLTIwMDQgKi8KK3R5cGVkZWYgZW51bSBfUlRfODAyXzExX0NJUEhFUl9TVUlURV9UWVBFIHsKKwlDaXBoZXJfVHlwZV9OT05FLAorCUNpcGhlcl9UeXBlX1dFUDQwLAorCUNpcGhlcl9UeXBlX1RLSVAsCisJQ2lwaGVyX1R5cGVfUlNWRCwKKwlDaXBoZXJfVHlwZV9DQ01QLAorCUNpcGhlcl9UeXBlX1dFUDEwNAorfSBSVF84MDJfMTFfQ0lQSEVSX1NVSVRFX1RZUEUsICpQUlRfODAyXzExX0NJUEhFUl9TVUlURV9UWVBFOworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCi0jaWZkZWYgUlQyODcwCi0JVUxPTkcgICAgICAgICAgIE9uZVNlY1RyYW5zbWl0dGVkQnl0ZUNvdW50OyAgIC8vIGJvdGggc3VjY2Vzc2Z1bCBhbmQgZmFpbHVyZSwgdXNlZCB0byBjYWxjdWxhdGUgVFggdGhyb3VnaHB1dAotI2VuZGlmIC8vIFJUMjg3MCAvLworc3RydWN0IHJ0X3JvZ3VlYXBfZW50cnkgeworCXU4IEFkZHJbTUFDX0FERFJfTEVOXTsKKwl1OCBFcnJvckNvZGVbMl07CS8qMDAgMDEtSW52YWxpZCBhdXRoZW50aWNhdGlvbiB0eXBlICovCisJLyowMCAwMi1BdXRoZW50aWNhdGlvbiB0aW1lb3V0ICovCisJLyowMCAwMy1DaGFsbGVuZ2UgZnJvbSBBUCBmYWlsZWQgKi8KKwkvKjAwIDA0LUNoYWxsZW5nZSB0byBBUCBmYWlsZWQgKi8KKwlCT09MRUFOIFJlcG9ydGVkOworfTsKIAotCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeE5vUmV0cnlPa0NvdW50OwotCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeFJldHJ5T2tDb3VudDsKLQlVSU5UMzIgICAgICAgICAgT25lU2VjVHhGYWlsQ291bnQ7Ci0JVUlOVDMyICAgICAgICAgIE9uZVNlY0ZhbHNlQ0NBQ250OyAgICAgIC8vIENDQSBlcnJvciBjb3VudCwgZm9yIGRlYnVnIHB1cnBvc2UsIG1pZ2h0IG1vdmUgdG8gZ2xvYmFsIGNvdW50ZXIKLQlVSU5UMzIgICAgICAgICAgT25lU2VjUnhPa0NudDsgICAgICAgICAgLy8gUlggd2l0aG91dCBlcnJvcgotCVVJTlQzMiAgICAgICAgICBPbmVTZWNSeE9rRGF0YUNudDsgICAgICAvLyB1bmljYXN0LXRvLW1lIERBVEEgZnJhbWUgY291bnQKLQlVSU5UMzIgICAgICAgICAgT25lU2VjUnhGY3NFcnJDbnQ7ICAgICAgLy8gQ1JDIGVycm9yCi0JVUlOVDMyICAgICAgICAgIE9uZVNlY0JlYWNvblNlbnRDbnQ7Ci0JVUlOVDMyICAgICAgICAgIExhc3RPbmVTZWNUb3RhbFR4Q291bnQ7IC8vIE9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKyBPbmVTZWNUeFJldHJ5T2tDb3VudCArIE9uZVNlY1R4RmFpbENvdW50Ci0JVUlOVDMyICAgICAgICAgIExhc3RPbmVTZWNSeE9rRGF0YUNudDsgIC8vIE9uZVNlY1J4T2tEYXRhQ250Ci0JVUxPTkcJCUR1cGxpY2F0ZVJjdjsKLQlVTE9ORwkJVHhBZ2dDb3VudDsKLQlVTE9ORwkJVHhOb25BZ2dDb3VudDsKLQlVTE9ORwkJVHhBZ2cxTVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzJNUERVQ291bnQ7Ci0JVUxPTkcJCVR4QWdnM01QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2c0TVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzVNUERVQ291bnQ7Ci0JVUxPTkcJCVR4QWdnNk1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2c3TVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzhNUERVQ291bnQ7Ci0JVUxPTkcJCVR4QWdnOU1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2cxME1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2cxMU1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2cxMk1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2cxM01QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2cxNE1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2cxNU1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2cxNk1QRFVDb3VudDsKK3N0cnVjdCBydF9yb2d1ZWFwX3RhYmxlIHsKKwl1OCBSb2d1ZUFwTnI7CisJc3RydWN0IHJ0X3JvZ3VlYXBfZW50cnkgUm9ndWVBcEVudHJ5W01BWF9MRU5fT0ZfQlNTX1RBQkxFXTsKK307CiAKLQlMQVJHRV9JTlRFR0VSICAgICAgIFRyYW5zbWl0dGVkT2N0ZXRzSW5BTVNEVTsKLQlMQVJHRV9JTlRFR0VSICAgICAgIFRyYW5zbWl0dGVkQU1TRFVDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgICAgIFJlY2VpdmVkT2N0ZXNJbkFNU0RVQ291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgICAgICBSZWNlaXZlZEFNU0RVQ291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgICAgICBUcmFuc21pdHRlZEFNUERVQ291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgICAgICBUcmFuc21pdHRlZE1QRFVzSW5BTVBEVUNvdW50OwotCUxBUkdFX0lOVEVHRVIgICAgICAgVHJhbnNtaXR0ZWRPY3RldHNJbkFNUERVQ291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgICAgICBNUERVSW5SZWNlaXZlZEFNUERVQ291bnQ7Ci19IENPVU5URVJfUkFMSU5LLCAqUENPVU5URVJfUkFMSU5LOworLyogKi8KKy8qIENpc2NvIElBUFAgZm9ybWF0ICovCisvKiAqLworc3RydWN0IHJ0X2Npc2NvX2lhcHBfY29udGVudCB7CisJdTE2IExlbmd0aDsJCS8qSUFQUCBMZW5ndGggKi8KKwl1OCBNZXNzYWdlVHlwZTsJLypJQVBQIHR5cGUgKi8KKwl1OCBGdW5jdGlvbkNvZGU7CS8qSUFQUCBmdW5jdGlvbiB0eXBlICovCisJdTggRGVzdGluYWlvbk1BQ1tNQUNfQUREUl9MRU5dOworCXU4IFNvdXJjZU1BQ1tNQUNfQUREUl9MRU5dOworCXUxNiBUYWc7CQkvKlRhZyhlbGVtZW50IElFKSAtIEFkamFjZW50IEFQIHJlcG9ydCAqLworCXUxNiBUYWdMZW5ndGg7CS8qTGVuZ3RoIG9mIGVsZW1lbnQgbm90IGluY2x1ZGluZyA0IGJ5dGUgaGVhZGVyICovCisJdTggT1VJWzRdOwkJLyoweDAwLCAweDQwLCAweDk2LCAweDAwICovCisJdTggUHJldmlvdXNBUFtNQUNfQUREUl9MRU5dOwkvKk1BQyBBZGRyZXNzIG9mIGFjY2VzcyBwb2ludCAqLworCXUxNiBDaGFubmVsOworCXUxNiBTc2lkTGVuOworCXU4IFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKwl1MTYgU2Vjb25kczsJCS8qU2Vjb25kcyB0aGF0IHRoZSBjbGllbnQgaGFzIGJlZW4gZGlzYXNzb2NpYXRlZC4gKi8KK307CiAKLXR5cGVkZWYgc3RydWN0IF9QSURfQ09VTlRFUiB7Ci0JVUxPTkcgICAgICAgICAgIFR4QWNrUmVxdWlyZWRDb3VudDsgICAgICAvLyBDUkMgZXJyb3IKLQlVTE9ORyAgICAgICAgICAgVHhBZ2dyZUNvdW50OwotCVVMT05HICAgICAgICAgICBUeFN1Y2Nlc3NDb3VudDsgLy8gT25lU2VjVHhOb1JldHJ5T2tDb3VudCArIE9uZVNlY1R4UmV0cnlPa0NvdW50ICsgT25lU2VjVHhGYWlsQ291bnQKLQlVTE9ORwkJTGFzdFN1Y2Nlc3NSYXRlOwotfSBQSURfQ09VTlRFUiwgKlBQSURfQ09VTlRFUjsKKy8qCisgICoJRnJhZ21lbnQgRnJhbWUgc3RydWN0dXJlCisgICovCitzdHJ1Y3QgcnRfZnJhZ21lbnRfZnJhbWUgeworCXZvaWQgKnBGcmFnUGFja2V0OworCXVuc2lnbmVkIGxvbmcgUnhTaXplOworCXUxNiBTZXF1ZW5jZTsKKwl1MTYgTGFzdEZyYWc7CisJdW5zaWduZWQgbG9uZyBGbGFnczsJCS8qIFNvbWUgZXh0cmEgZnJhbWUgaW5mb3JtYXRpb24uIGJpdCAwOiBMTEMgcHJlc2VudGVkICovCit9OwogCi10eXBlZGVmIHN0cnVjdCBfQ09VTlRFUl9EUlMgewotCS8vIHRvIHJlY29yZCB0aGUgZWFjaCBUWCByYXRlJ3MgcXVhbGl0eS4gMCBpcyBiZXN0LCB0aGUgYmlnZ2VyIHRoZSB3b3JzZS4KLQlVU0hPUlQgICAgICAgICAgVHhRdWFsaXR5W01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKLQlVQ0hBUiAgICAgICAgICAgUEVSW01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKLQlVQ0hBUiAgICAgICAgICAgVHhSYXRlVXBQZW5hbHR5OyAgICAgIC8vIGV4dHJhICMgb2Ygc2Vjb25kIHBlbmFsdHkgZHVlIHRvIGxhc3QgdW5zdGFibGUgY29uZGl0aW9uCi0JVUxPTkcgICAgICAgICAgIEN1cnJUeFJhdGVTdGFibGVUaW1lOyAvLyAjIG9mIHNlY29uZCBpbiBjdXJyZW50IFRYIHJhdGUKLQlCT09MRUFOICAgICAgICAgZk5vaXN5RW52aXJvbm1lbnQ7Ci0JQk9PTEVBTiAgICAgICAgIGZMYXN0U2VjQWNjb3JkaW5nUlNTSTsKLQlVQ0hBUiAgICAgICAgICAgTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbjsgLy8gMDogbm8gY2hhbmdlLCAxOnJhdGUgVVAsIDI6cmF0ZSBkb3duCi0JVUNIQVIJCQlMYXN0VGltZVR4UmF0ZUNoYW5nZUFjdGlvbjsgLy9LZWVwIGxhc3QgdGltZSB2YWx1ZSBvZiBMYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uCi0JVUxPTkcJCQlMYXN0VHhPa0NvdW50OwotfSBDT1VOVEVSX0RSUywgKlBDT1VOVEVSX0RSUzsKKy8qICovCisvKiBQYWNrZXQgaW5mb3JtYXRpb24gZm9yIE5kaXNRdWVyeVBhY2tldCAqLworLyogKi8KK3N0cnVjdCBydF9wYWNrZXRfaW5mbyB7CisJdTMyIFBoeXNpY2FsQnVmZmVyQ291bnQ7CS8qIFBoeXNpY2FsIGJyZWFrcyBvZiBidWZmZXIgZGVzY3JpcG9yIGNoYWluZWQgKi8KKwl1MzIgQnVmZmVyQ291bnQ7CS8qIE51bWJlciBvZiBCdWZmZXIgZGVzY3JpcHRvciBjaGFpbmVkICovCisJdTMyIFRvdGFsUGFja2V0TGVuZ3RoOwkvKiBTZWxmIGV4cGxhaW5lZCAqLworCWNoYXIgKnBGaXJzdEJ1ZmZlcjsJLyogUG9pbnRlciB0byBmaXJzdCBidWZmZXIgZGVzY3JpcHRvciAqLworfTsKIAotLy8KLS8vICBBcmNmb3VyIFN0cnVjdHVyZSBBZGRlZCBieSBQYXVsV3UKLS8vCi10eXBlZGVmIHN0cnVjdCAgX0FSQ0ZPVVIKLXsKLQlVSU5UICAgICAgICAgICAgWDsKLQlVSU5UICAgICAgICAgICAgWTsKLQlVQ0hBUiAgICAgICAgICAgU1RBVEVbMjU2XTsKLX0gQVJDRk9VUkNPTlRFWFQsICpQQVJDRk9VUkNPTlRFWFQ7CisvKiAqLworLyogIEFyY2ZvdXIgU3RydWN0dXJlIEFkZGVkIGJ5IFBhdWxXdSAqLworLyogKi8KK3N0cnVjdCBydF9hcmNmb3VyY29udGV4dCB7CisJdTMyIFg7CisJdTMyIFk7CisJdTggU1RBVEVbMjU2XTsKK307CiAKLS8vIE1JTU8gVHggcGFyYW1ldGVyLCBTaG9ydEdJLCBNQ1MsIFNUQkMsIGV0Yy4gIHRoZXNlIGFyZSBmaWVsZHMgaW4gVFhXSSB0b28uIGp1c3QgY29weSB0byBUWFdJLgotdHlwZWRlZiBzdHJ1Y3QgIF9SRUNFSVZFX1NFVFRJTkcgewotCVVTSE9SVCAgIAlOdW1PZlJYOjI7ICAgICAgICAgICAgICAgICAvLyBNSU1PLiBXRSBIQVZFIDNSCi0JVVNIT1JUCQlNb2RlOjI7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6Ci0JVVNIT1JUCQlTaG9ydEdJOjE7Ci0JVVNIT1JUCQlTVEJDOjI7CS8vU1BBQ0UKLQlVU0hPUlQJCXJzdjozOwotCVVTSE9SVAkJT0ZETToxOwotCVVTSE9SVAkJTUlNTzoxOwotIH0gUkVDRUlWRV9TRVRUSU5HLCAqUFJFQ0VJVkVfU0VUVElORzsKKy8qICovCisvKiBUa2lwIEtleSBzdHJ1Y3R1cmUgd2hpY2ggUkM0IGtleSAmIE1JQyBjYWxjdWxhdGlvbiAqLworLyogKi8KK3N0cnVjdCBydF90a2lwX2tleV9pbmZvIHsKKwl1MzIgbkJ5dGVzSW5NOwkJLyogIyBieXRlcyBpbiBNIGZvciBNSUNLRVkgKi8KKwl1bnNpZ25lZCBsb25nIElWMTY7CisJdW5zaWduZWQgbG9uZyBJVjMyOworCXVuc2lnbmVkIGxvbmcgSzA7CQkvKiBmb3IgTUlDS0VZIExvdyAqLworCXVuc2lnbmVkIGxvbmcgSzE7CQkvKiBmb3IgTUlDS0VZIEhpZyAqLworCXVuc2lnbmVkIGxvbmcgTDsJCS8qIEN1cnJlbnQgc3RhdGUgZm9yIE1JQ0tFWSAqLworCXVuc2lnbmVkIGxvbmcgUjsJCS8qIEN1cnJlbnQgc3RhdGUgZm9yIE1JQ0tFWSAqLworCXVuc2lnbmVkIGxvbmcgTTsJCS8qIE1lc3NhZ2UgYWNjdW11bGF0b3IgZm9yIE1JQ0tFWSAqLworCXU4IFJDNEtFWVsxNl07CisJdTggTUlDWzhdOworfTsKIAotLy8gU2hhcmVkIGtleSBkYXRhIHN0cnVjdHVyZQotdHlwZWRlZiBzdHJ1Y3QgIF9XRVBfS0VZIHsKLQlVQ0hBUiAgIEtleUxlbjsgICAgICAgICAgICAgICAgICAgICAvLyBLZXkgbGVuZ3RoIGZvciBlYWNoIGtleSwgMDogZW50cnkgaXMgaW52YWxpZAotCVVDSEFSICAgS2V5W01BWF9MRU5fT0ZfS0VZXTsgICAgICAgIC8vIHJpZ2h0IG5vdyB3ZSBpbXBsZW1lbnQgNCBrZXlzLCAxMjggYml0cyBtYXgKLX0gV0VQX0tFWSwgKlBXRVBfS0VZOworLyogKi8KKy8qIFByaXZhdGUgLyBNaXNjIGRhdGEsIGNvdW50ZXJzIGZvciBkcml2ZXIgaW50ZXJuYWwgdXNlICovCisvKiAqLworc3RydWN0IHJ0X3ByaXZhdGUgeworCXUzMiBTeXN0ZW1SZXNldENudDsJLyogU3lzdGVtIHJlc2V0IGNvdW50ZXIgKi8KKwl1MzIgVHhSaW5nRnVsbENudDsJLyogVHggcmluZyBmdWxsIG9jY3VycmFuY2UgbnVtYmVyICovCisJdTMyIFBoeVJ4RXJyQ250OwkvKiBQSFkgUnggZXJyb3IgY291bnQsIGZvciBkZWJ1ZyBwdXJwb3NlLCBtaWdodCBtb3ZlIHRvIGdsb2JhbCBjb3VudGVyICovCisJLyogVmFyaWFibGVzIGZvciBXRVAgZW5jcnlwdGlvbiAvIGRlY3J5cHRpb24gaW4gcnRtcF93ZXAuYyAqLworCXUzMiBGQ1NDUkMzMjsKKwlzdHJ1Y3QgcnRfYXJjZm91cmNvbnRleHQgV0VQQ09OVEVYVDsKKwkvKiBUa2lwIHN0dWZmICovCisJc3RydWN0IHJ0X3RraXBfa2V5X2luZm8gVHg7CisJc3RydWN0IHJ0X3RraXBfa2V5X2luZm8gUng7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfQ0lQSEVSX0tFWSB7Ci0JVUNIQVIgICBLZXlbMTZdOyAgICAgICAgICAgIC8vIHJpZ2h0IG5vdyB3ZSBpbXBsZW1lbnQgNCBrZXlzLCAxMjggYml0cyBtYXgKLQlVQ0hBUiAgIFJ4TWljWzhdOwkJCS8vIG1ha2UgYWxpZ25tZW50Ci0JVUNIQVIgICBUeE1pY1s4XTsKLQlVQ0hBUiAgIFR4VHNjWzZdOyAgICAgICAgICAgLy8gNDhiaXQgVFNDIHZhbHVlCi0JVUNIQVIgICBSeFRzY1s2XTsgICAgICAgICAgIC8vIDQ4Yml0IFRTQyB2YWx1ZQotCVVDSEFSICAgQ2lwaGVyQWxnOyAgICAgICAgICAvLyAwLW5vbmUsIDE6V0VQNjQsIDI6V0VQMTI4LCAzOlRLSVAsIDQ6QUVTLCA1OkNLSVA2NCwgNjpDS0lQMTI4Ci0JVUNIQVIgICBLZXlMZW47Ci0JVUNIQVIgICBCc3NJZFs2XTsKLSAgICAgICAgICAgIC8vIEtleSBsZW5ndGggZm9yIGVhY2gga2V5LCAwOiBlbnRyeSBpcyBpbnZhbGlkCi0JVUNIQVIgICBUeXBlOyAgICAgICAgICAgICAgIC8vIEluZGljYXRlIFBhaXJ3aXNlL0dyb3VwIHdoZW4gcmVwb3J0aW5nIE1JQyBlcnJvcgotfSBDSVBIRVJfS0VZLCAqUENJUEhFUl9LRVk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoJQ2hhbm5lbCBhbmQgQkJQIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmVzCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogc3RydWN0dXJlIHRvIHR1bmUgQkJQIFI2NiAoQkJQIFRVTklORykgKi8KK3N0cnVjdCBydF9iYnBfcjY2X3R1bmluZyB7CisJQk9PTEVBTiBiRW5hYmxlOworCXUxNiBGYWxzZUNjYUxvd2VyVGhyZXNob2xkOwkvKiBkZWZhdWx0IDEwMCAqLworCXUxNiBGYWxzZUNjYVVwcGVyVGhyZXNob2xkOwkvKiBkZWZhdWx0IDUxMiAqLworCXU4IFI2NkRlbHRhOworCXU4IFI2NkN1cnJlbnRWYWx1ZTsKKwlCT09MRUFOIFI2Nkxvd2VyVXBwZXJTZWxlY3Q7CS8qQmVmb3JlIExpbmtVcCwgVXNlZCBMb3dlckJvdW5kIG9yIFVwcGVyQm91bmQgYXMgUjY2IHZhbHVlLiAqLworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX0JCUF9UVU5JTkdfU1RSVUNUIHsKLQlCT09MRUFOICAgICBFbmFibGU7Ci0JVUNIQVIgICAgICAgRmFsc2VDY2FDb3VudFVwcGVyQm91bmQ7ICAvLyAxMDAgcGVyIHNlYwotCVVDSEFSICAgICAgIEZhbHNlQ2NhQ291bnRMb3dlckJvdW5kOyAgLy8gMTAgcGVyIHNlYwotCVVDSEFSICAgICAgIFIxN0xvd2VyQm91bmQ7ICAgICAgICAgICAgLy8gc3BlY2lmaWVkIGluIEUyUFJPTQotCVVDSEFSICAgICAgIFIxN1VwcGVyQm91bmQ7ICAgICAgICAgICAgLy8gMHg2OCBhY2NvcmRpbmcgdG8gRGF2aWQgVHVuZwotCVVDSEFSICAgICAgIEN1cnJlbnRSMTdWYWx1ZTsKLX0gQkJQX1RVTklORywgKlBCQlBfVFVOSU5HOworLyogc3RydWN0dXJlIHRvIHN0b3JlIGNoYW5uZWwgVFggcG93ZXIgKi8KK3N0cnVjdCBydF9jaGFubmVsX3R4X3Bvd2VyIHsKKwl1MTYgUmVtYWluaW5nVGltZUZvclVzZTsJLyp1bml0OiBzZWMgKi8KKwl1OCBDaGFubmVsOworCWNoYXIgUG93ZXI7CisJY2hhciBQb3dlcjI7CisJdTggTWF4VHhQd3I7CisJdTggRGZzUmVxOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1NPRlRfUlhfQU5UX0RJVkVSU0lUWV9TVFJVQ1QgewotCVVDSEFSICAgICBFdmFsdWF0ZVBlcmlvZDsJCSAvLyAwOm5vdCBldmFsdXRlIHN0YXR1cywgMTogZXZhbHVhdGUgc3RhdHVzLCAyOiBzd2l0Y2hpbmcgc3RhdHVzCi0jaWZkZWYgUlQyODcwCi0JVUNIQVIgICAgIEV2YWx1YXRlU3RhYmxlQ250OwotI2VuZGlmCi0JVUNIQVIgICAgIFBhaXIxUHJpbWFyeVJ4QW50OyAgICAgLy8gMDpBbnQtRTEsIDE6QW50LUUyCi0JVUNIQVIgICAgIFBhaXIxU2Vjb25kYXJ5UnhBbnQ7ICAgLy8gMDpBbnQtRTEsIDE6QW50LUUyCi0JVUNIQVIgICAgIFBhaXIyUHJpbWFyeVJ4QW50OyAgICAgLy8gMDpBbnQtRTMsIDE6QW50LUU0Ci0JVUNIQVIgICAgIFBhaXIyU2Vjb25kYXJ5UnhBbnQ7ICAgLy8gMDpBbnQtRTMsIDE6QW50LUU0Ci0JU0hPUlQgICAgIFBhaXIxQXZnUnNzaVsyXTsgICAgICAgLy8gQXZnUnNzaVswXTpFMSwgQXZnUnNzaVsxXTpFMgotCVNIT1JUICAgICBQYWlyMkF2Z1Jzc2lbMl07ICAgICAgIC8vIEF2Z1Jzc2lbMF06RTMsIEF2Z1Jzc2lbMV06RTQKLQlTSE9SVCAgICAgUGFpcjFMYXN0QXZnUnNzaTsgICAgICAvLwotCVNIT1JUICAgICBQYWlyMkxhc3RBdmdSc3NpOyAgICAgIC8vCi0JVUxPTkcgICAgIFJjdlBrdE51bVdoZW5FdmFsdWF0ZTsKLQlCT09MRUFOICAgRmlyc3RQa3RBcnJpdmVkV2hlbkV2YWx1YXRlOwotCVJBTElOS19USU1FUl9TVFJVQ1QgICAgUnhBbnREaXZlcnNpdHlUaW1lcjsKLX0gU09GVF9SWF9BTlRfRElWRVJTSVRZLCAqUFNPRlRfUlhfQU5UX0RJVkVSU0lUWTsKKy8qIHN0cnVjdHVyZSB0byBzdG9yZSA4MDIuMTFqIGNoYW5uZWwgVFggcG93ZXIgKi8KK3N0cnVjdCBydF9jaGFubmVsXzExal90eF9wb3dlciB7CisJdTggQ2hhbm5lbDsKKwl1OCBCVzsJCS8qIEJXXzEwIG9yIEJXXzIwICovCisJY2hhciBQb3dlcjsKKwljaGFyIFBvd2VyMjsKKwl1MTYgUmVtYWluaW5nVGltZUZvclVzZTsJLyp1bml0OiBzZWMgKi8KK307CiAKLXR5cGVkZWYgc3RydWN0IF9MRUFQX0FVVEhfSU5GTyB7Ci0JQk9PTEVBTiAgICAgICAgIEVuYWJsZWQ7ICAgICAgICAvL1R1cmU6IEVuYWJsZSBMRUFQIEF1dGhlbnRpY2F0aW9uCi0JQk9PTEVBTiAgICAgICAgIENDS007ICAgICAgICAgICAvL1R1cmU6IFVzZSBGYXN0IFJlYXV0aGVudGljYXRpb24gd2l0aCBDQ0tNCi0JVUNIQVIgICAgICAgICAgIFJlc2VydmVbMl07Ci0JVUNIQVIgICAgICAgICAgIFVzZXJOYW1lWzI1Nl07ICAvL0xFQVAsIFVzZXIgbmFtZQotCVVMT05HICAgICAgICAgICBVc2VyTmFtZUxlbjsKLQlVQ0hBUiAgICAgICAgICAgUGFzc3dvcmRbMjU2XTsgIC8vTEVBUCwgVXNlciBQYXNzd29yZAotCVVMT05HICAgICAgICAgICBQYXNzd29yZExlbjsKLX0gTEVBUF9BVVRIX0lORk8sICpQTEVBUF9BVVRIX0lORk87CitzdHJ1Y3QgcnRfc29mdF9yeF9hbnRfZGl2ZXJzaXR5IHsKKwl1OCBFdmFsdWF0ZVBlcmlvZDsJLyogMDpub3QgZXZhbHV0ZSBzdGF0dXMsIDE6IGV2YWx1YXRlIHN0YXR1cywgMjogc3dpdGNoaW5nIHN0YXR1cyAqLworCXU4IEV2YWx1YXRlU3RhYmxlQ250OworCXU4IFBhaXIxUHJpbWFyeVJ4QW50OwkvKiAwOkFudC1FMSwgMTpBbnQtRTIgKi8KKwl1OCBQYWlyMVNlY29uZGFyeVJ4QW50OwkvKiAwOkFudC1FMSwgMTpBbnQtRTIgKi8KKwl1OCBQYWlyMlByaW1hcnlSeEFudDsJLyogMDpBbnQtRTMsIDE6QW50LUU0ICovCisJdTggUGFpcjJTZWNvbmRhcnlSeEFudDsJLyogMDpBbnQtRTMsIDE6QW50LUU0ICovCisJc2hvcnQgUGFpcjFBdmdSc3NpWzJdOwkvKiBBdmdSc3NpWzBdOkUxLCBBdmdSc3NpWzFdOkUyICovCisJc2hvcnQgUGFpcjJBdmdSc3NpWzJdOwkvKiBBdmdSc3NpWzBdOkUzLCBBdmdSc3NpWzFdOkU0ICovCisJc2hvcnQgUGFpcjFMYXN0QXZnUnNzaTsJLyogKi8KKwlzaG9ydCBQYWlyMkxhc3RBdmdSc3NpOwkvKiAqLworCXVuc2lnbmVkIGxvbmcgUmN2UGt0TnVtV2hlbkV2YWx1YXRlOworCUJPT0xFQU4gRmlyc3RQa3RBcnJpdmVkV2hlbkV2YWx1YXRlOworCXN0cnVjdCBydF9yYWxpbmtfdGltZXIgUnhBbnREaXZlcnNpdHlUaW1lcjsKK307CiAKLXR5cGVkZWYgc3RydWN0IHsKLQlVQ0hBUiAgICAgICAgQWRkcltNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgICAgICBFcnJvckNvZGVbMl07ICAvLzAwIDAxLUludmFsaWQgYXV0aGVudGljYXRpb24gdHlwZQotCQkJCQkJCQkvLzAwIDAyLUF1dGhlbnRpY2F0aW9uIHRpbWVvdXQKLQkJCQkJCQkJLy8wMCAwMy1DaGFsbGVuZ2UgZnJvbSBBUCBmYWlsZWQKLQkJCQkJCQkJLy8wMCAwNC1DaGFsbGVuZ2UgdG8gQVAgZmFpbGVkCi0JQk9PTEVBTiAgICAgIFJlcG9ydGVkOwotfSBST0dVRUFQX0VOVFJZLCAqUFJPR1VFQVBfRU5UUlk7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlVQ0hBUiAgICAgICAgICAgICAgIFJvZ3VlQXBOcjsKLQlST0dVRUFQX0VOVFJZICAgICAgIFJvZ3VlQXBFbnRyeVtNQVhfTEVOX09GX0JTU19UQUJMRV07Ci19IFJPR1VFQVBfVEFCTEUsICpQUk9HVUVBUF9UQUJMRTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCUJPT0xFQU4gICAgIEVuYWJsZTsKLQlVQ0hBUiAgICAgICBEZWx0YTsKLQlCT09MRUFOICAgICBQbHVzU2lnbjsKLX0gQ0NLX1RYX1BPV0VSX0NBTElCUkFURSwgKlBDQ0tfVFhfUE9XRVJfQ0FMSUJSQVRFOwotCi0vLwotLy8gUmVjZWl2ZSBUdXBsZSBDYWNoZSBGb3JtYXQKLS8vCi10eXBlZGVmIHN0cnVjdCAgX1RVUExFX0NBQ0hFICAgIHsKLQlCT09MRUFOICAgICAgICAgVmFsaWQ7Ci0JVUNIQVIgICAgICAgICAgIE1hY0FkZHJlc3NbTUFDX0FERFJfTEVOXTsKLQlVU0hPUlQgICAgICAgICAgU2VxdWVuY2U7Ci0JVVNIT1JUICAgICAgICAgIEZyYWc7Ci19IFRVUExFX0NBQ0hFLCAqUFRVUExFX0NBQ0hFOwotCi0vLwotLy8gRnJhZ21lbnQgRnJhbWUgc3RydWN0dXJlCi0vLwotdHlwZWRlZiBzdHJ1Y3QgIF9GUkFHTUVOVF9GUkFNRSB7Ci0JUE5ESVNfUEFDS0VUICAgIHBGcmFnUGFja2V0OwotCVVMT05HICAgICAgIFJ4U2l6ZTsKLQlVU0hPUlQgICAgICBTZXF1ZW5jZTsKLQlVU0hPUlQgICAgICBMYXN0RnJhZzsKLQlVTE9ORyAgICAgICBGbGFnczsgICAgICAgICAgLy8gU29tZSBleHRyYSBmcmFtZSBpbmZvcm1hdGlvbi4gYml0IDA6IExMQyBwcmVzZW50ZWQKLX0gRlJBR01FTlRfRlJBTUUsICpQRlJBR01FTlRfRlJBTUU7Ci0KLQotLy8KLS8vIFBhY2tldCBpbmZvcm1hdGlvbiBmb3IgTmRpc1F1ZXJ5UGFja2V0Ci0vLwotdHlwZWRlZiBzdHJ1Y3QgIF9QQUNLRVRfSU5GTyAgICB7Ci0JVUlOVCAgICAgICAgICAgIFBoeXNpY2FsQnVmZmVyQ291bnQ7ICAgIC8vIFBoeXNpY2FsIGJyZWFrcyBvZiBidWZmZXIgZGVzY3JpcG9yIGNoYWluZWQKLQlVSU5UICAgICAgICAgICAgQnVmZmVyQ291bnQgOyAgICAgICAgICAgLy8gTnVtYmVyIG9mIEJ1ZmZlciBkZXNjcmlwdG9yIGNoYWluZWQKLQlVSU5UICAgICAgICAgICAgVG90YWxQYWNrZXRMZW5ndGggOyAgICAgLy8gU2VsZiBleHBsYWluZWQKLQlQTkRJU19CVUZGRVIgICAgcEZpcnN0QnVmZmVyOyAgICAgICAgICAgLy8gUG9pbnRlciB0byBmaXJzdCBidWZmZXIgZGVzY3JpcHRvcgotfSBQQUNLRVRfSU5GTywgKlBQQUNLRVRfSU5GTzsKLQotLy8KLS8vIFRraXAgS2V5IHN0cnVjdHVyZSB3aGljaCBSQzQga2V5ICYgTUlDIGNhbGN1bGF0aW9uCi0vLwotdHlwZWRlZiBzdHJ1Y3QgIF9US0lQX0tFWV9JTkZPICB7Ci0JVUlOVCAgICAgICAgbkJ5dGVzSW5NOyAgLy8gIyBieXRlcyBpbiBNIGZvciBNSUNLRVkKLQlVTE9ORyAgICAgICBJVjE2OwotCVVMT05HICAgICAgIElWMzI7Ci0JVUxPTkcgICAgICAgSzA7ICAgICAgICAgLy8gZm9yIE1JQ0tFWSBMb3cKLQlVTE9ORyAgICAgICBLMTsgICAgICAgICAvLyBmb3IgTUlDS0VZIEhpZwotCVVMT05HICAgICAgIEw7ICAgICAgICAgIC8vIEN1cnJlbnQgc3RhdGUgZm9yIE1JQ0tFWQotCVVMT05HICAgICAgIFI7ICAgICAgICAgIC8vIEN1cnJlbnQgc3RhdGUgZm9yIE1JQ0tFWQotCVVMT05HICAgICAgIE07ICAgICAgICAgIC8vIE1lc3NhZ2UgYWNjdW11bGF0b3IgZm9yIE1JQ0tFWQotCVVDSEFSICAgICAgIFJDNEtFWVsxNl07Ci0JVUNIQVIgICAgICAgTUlDWzhdOwotfSBUS0lQX0tFWV9JTkZPLCAqUFRLSVBfS0VZX0lORk87Ci0KLS8vCi0vLyBQcml2YXRlIC8gTWlzYyBkYXRhLCBjb3VudGVycyBmb3IgZHJpdmVyIGludGVybmFsIHVzZQotLy8KLXR5cGVkZWYgc3RydWN0ICBfX1BSSVZBVEVfU1RSVUMgewotCVVJTlQgICAgICAgU3lzdGVtUmVzZXRDbnQ7ICAgICAgICAgLy8gU3lzdGVtIHJlc2V0IGNvdW50ZXIKLQlVSU5UICAgICAgIFR4UmluZ0Z1bGxDbnQ7ICAgICAgICAgIC8vIFR4IHJpbmcgZnVsbCBvY2N1cnJhbmNlIG51bWJlcgotCVVJTlQgICAgICAgUGh5UnhFcnJDbnQ7ICAgICAgICAgICAgLy8gUEhZIFJ4IGVycm9yIGNvdW50LCBmb3IgZGVidWcgcHVycG9zZSwgbWlnaHQgbW92ZSB0byBnbG9iYWwgY291bnRlcgotCS8vIFZhcmlhYmxlcyBmb3IgV0VQIGVuY3J5cHRpb24gLyBkZWNyeXB0aW9uIGluIHJ0bXBfd2VwLmMKLQlVSU5UICAgICAgIEZDU0NSQzMyOwotCUFSQ0ZPVVJDT05URVhUICBXRVBDT05URVhUOwotCS8vIFRraXAgc3R1ZmYKLQlUS0lQX0tFWV9JTkZPICAgVHg7Ci0JVEtJUF9LRVlfSU5GTyAgIFJ4OwotfSBQUklWQVRFX1NUUlVDLCAqUFBSSVZBVEVfU1RSVUM7Ci0KLS8vIHN0cnVjdHVyZSB0byB0dW5lIEJCUCBSNjYgKEJCUCBUVU5JTkcpCi10eXBlZGVmIHN0cnVjdCBfQkJQX1I2Nl9UVU5JTkcgewotCUJPT0xFQU4gICAgIGJFbmFibGU7Ci0JVVNIT1JUICAgICAgRmFsc2VDY2FMb3dlclRocmVzaG9sZDsgIC8vIGRlZmF1bHQgMTAwCi0JVVNIT1JUICAgICAgRmFsc2VDY2FVcHBlclRocmVzaG9sZDsgIC8vIGRlZmF1bHQgNTEyCi0JVUNIQVIgICAgICAgUjY2RGVsdGE7Ci0JVUNIQVIgICAgICAgUjY2Q3VycmVudFZhbHVlOwotCUJPT0xFQU4JCVI2Nkxvd2VyVXBwZXJTZWxlY3Q7IC8vQmVmb3JlIExpbmtVcCwgVXNlZCBMb3dlckJvdW5kIG9yIFVwcGVyQm91bmQgYXMgUjY2IHZhbHVlLgotfSBCQlBfUjY2X1RVTklORywgKlBCQlBfUjY2X1RVTklORzsKLQotLy8gc3RydWN0dXJlIHRvIHN0b3JlIGNoYW5uZWwgVFggcG93ZXIKLXR5cGVkZWYgc3RydWN0IF9DSEFOTkVMX1RYX1BPV0VSIHsKLQlVU0hPUlQgICAgIFJlbWFpbmluZ1RpbWVGb3JVc2U7CQkvL3VuaXQ6IHNlYwotCVVDSEFSICAgICAgQ2hhbm5lbDsKLQlDSEFSICAgICAgIFBvd2VyOwotCUNIQVIgICAgICAgUG93ZXIyOwotCVVDSEFSICAgICAgTWF4VHhQd3I7Ci0JVUNIQVIgICAgICBEZnNSZXE7Ci19IENIQU5ORUxfVFhfUE9XRVIsICpQQ0hBTk5FTF9UWF9QT1dFUjsKLQotLy8gc3RydWN0dXJlIHRvIHN0b3JlIDgwMi4xMWogY2hhbm5lbCBUWCBwb3dlcgotdHlwZWRlZiBzdHJ1Y3QgX0NIQU5ORUxfMTFKX1RYX1BPV0VSIHsKLQlVQ0hBUiAgICAgIENoYW5uZWw7Ci0JVUNIQVIgICAgICBCVzsJLy8gQldfMTAgb3IgQldfMjAKLQlDSEFSICAgICAgIFBvd2VyOwotCUNIQVIgICAgICAgUG93ZXIyOwotCVVTSE9SVCAgICAgUmVtYWluaW5nVGltZUZvclVzZTsJCS8vdW5pdDogc2VjCi19IENIQU5ORUxfMTFKX1RYX1BPV0VSLCAqUENIQU5ORUxfMTFKX1RYX1BPV0VSOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCXN0cnVjdHVyZSBmb3IgcmFkYXIgZGV0ZWN0aW9uIGFuZCBjaGFubmVsIHN3aXRjaAorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBydF9yYWRhcl9kZXRlY3QgeworCS8qQk9PTEVBTiAgICAgICAgICAgSUVFRTgwMjExSDsgICAgICAgICAgICAgICAgICAgICAvLyAwOiBkaXNhYmxlLCAxOiBlbmFibGUgSUVFRTgwMi4xMWggKi8KKwl1OCBDU0NvdW50OwkJLypDaGFubmVsIHN3aXRjaCBjb3VudGVyICovCisJdTggQ1NQZXJpb2Q7CQkvKkNoYW5uZWwgc3dpdGNoIHBlcmlvZCAoYmVhY29uIGNvdW50KSAqLworCXU4IFJEQ291bnQ7CQkvKlJhZGFyIGRldGVjdGlvbiBjb3VudGVyICovCisJdTggUkRNb2RlOwkJLypSYWRhciBEZXRlY3Rpb24gbW9kZSAqLworCXU4IFJERHVyUmVnaW9uOwkvKlJhZGFyIGRldGVjdGlvbiBkdXJhdGlvbiByZWdpb24gKi8KKwl1OCBCQlBSMTY7CisJdTggQkJQUjE3OworCXU4IEJCUFIxODsKKwl1OCBCQlBSMjE7CisJdTggQkJQUjIyOworCXU4IEJCUFI2NDsKKwl1bnNpZ25lZCBsb25nIEluU2VydmljZU1vbml0b3JDb3VudDsJLyogdW5pdDogc2VjICovCisJdTggRGZzU2Vzc2lvblRpbWU7CisJQk9PTEVBTiBiRmFzdERmczsKKwl1OCBDaE1vdmluZ1RpbWU7CisJdTggTG9uZ1B1bHNlUmFkYXJUaDsKK307CiAKIHR5cGVkZWYgZW51bSBfQUJHQkFORF9TVEFURV8gewogCVVOS05PV05fQkFORCwKQEAgLTE0MzksMjM0ICs4NjEsMjkxIEBACiAJQV9CQU5ELAogfSBBQkdCQU5EX1NUQVRFOwogCi10eXBlZGVmIHN0cnVjdCBfTUxNRV9TVFJVQ1QgewotCS8vIFNUQSBzdGF0ZSBtYWNoaW5lcwotCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIENudGxNYWNoaW5lOwotCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIEFzc29jTWFjaGluZTsKLQlTVEFURV9NQUNISU5FICAgICAgICAgICBBdXRoTWFjaGluZTsKLQlTVEFURV9NQUNISU5FICAgICAgICAgICBBdXRoUnNwTWFjaGluZTsKLQlTVEFURV9NQUNISU5FICAgICAgICAgICBTeW5jTWFjaGluZTsKLQlTVEFURV9NQUNISU5FICAgICAgICAgICBXcGFQc2tNYWNoaW5lOwotCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIExlYXBNYWNoaW5lOwotCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIEFpcm9uZXRNYWNoaW5lOwotCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIEFzc29jRnVuY1tBU1NPQ19GVU5DX1NJWkVdOwotCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIEF1dGhGdW5jW0FVVEhfRlVOQ19TSVpFXTsKLQlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBBdXRoUnNwRnVuY1tBVVRIX1JTUF9GVU5DX1NJWkVdOwotCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIFN5bmNGdW5jW1NZTkNfRlVOQ19TSVpFXTsKLQlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBXcGFQc2tGdW5jW1dQQV9QU0tfRlVOQ19TSVpFXTsKLQlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBBaXJvbmV0RnVuY1tBSVJPTkVUX0ZVTkNfU0laRV07Ci0JU1RBVEVfTUFDSElORV9GVU5DICAgICAgQWN0RnVuY1tBQ1RfRlVOQ19TSVpFXTsKLQkvLyBBY3Rpb24KLQlTVEFURV9NQUNISU5FICAgICAgICAgICBBY3RNYWNoaW5lOworI2lmZGVmIFJUTVBfTUFDX1BDSQorLyogUG93ZXIgc2F2ZSBtZXRob2QgY29udHJvbCAqLwordHlwZWRlZiB1bmlvbiBfUFNfQ09OVFJPTCB7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgbG9uZyBFbmFibGVQU2luSWRsZToxOwkvKiBFbmFibGUgcmFkaW8gb2ZmIHdoZW4gbm90IGNvbm5lY3QgdG8gQVAuIHJhZGlvIG9uIG9ubHkgd2hlbiBzaXRlc3VydmV5LCAqLworCQl1bnNpZ25lZCBsb25nIEVuYWJsZU5ld1BTOjE7CS8qIEVuYWJsZSBuZXcgIENoaXAgcG93ZXIgc2F2ZSBmdWNudGlvbiAuIE5ldyBtZXRob2QgY2FuIG9ubHkgYmUgYXBwbGllZCBpbiBjaGlwIHZlcnNpb24gYWZ0ZXIgMjg3Mi4gYW5kIFBDSWUuICovCisJCXVuc2lnbmVkIGxvbmcgcnQzMHh4UG93ZXJNb2RlOjI7CS8qIFBvd2VyIExldmVsIE1vZGUgZm9yIHJ0MzB4eCBjaGlwICovCisJCXVuc2lnbmVkIGxvbmcgcnQzMHh4Rm9sbG93SG9zdEFTUE06MTsJLyogQ2FyZCBGb2xsb3dzIEhvc3QncyBzZXR0aW5nIGZvciBydDMweHggY2hpcC4gKi8KKwkJdW5zaWduZWQgbG9uZyBydDMweHhGb3JjZUFTUE1UZXN0OjE7CS8qIEZvcmNlIGVuYWJsZSBMMSBmb3IgcnQzMHh4IGNoaXAuIFRoaXMgaGFzIGhpZ2hlciBwcmlvcml0eSB0aGFuIHJ0MzB4eEZvbGxvd0hvc3RBU1BNIE1vZGUuICovCisJCXVuc2lnbmVkIGxvbmcgcnN2OjI2OwkvKiBSYWRpbyBNZWFzdXJlbWVudCBFbmFibGUgKi8KKwl9IGZpZWxkOworCXVuc2lnbmVkIGxvbmcgd29yZDsKK30gUFNfQ09OVFJPTCwgKlBQU19DT05UUk9MOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCi0JVUxPTkcgICAgICAgICAgICAgICAgICAgQ2hhbm5lbFF1YWxpdHk7ICAvLyAwLi4xMDAsIENoYW5uZWwgUXVhbGl0eSBJbmRpY2F0aW9uIGZvciBSb2FtaW5nCi0JVUxPTkcgICAgICAgICAgICAgICAgICAgTm93MzI7ICAgICAgICAgICAvLyBsYXRjaCB0aGUgdmFsdWUgb2YgTmRpc0dldFN5c3RlbVVwVGltZSgpCi0JVUxPTkcgICAgICAgICAgICAgICAgICAgTGFzdFNlbmROVUxMcHNtVGltZTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKglzdHJ1Y3R1cmUgZm9yIE1MTUUgc3RhdGUgbWFjaGluZQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBydF9tbG1lIHsKKwkvKiBTVEEgc3RhdGUgbWFjaGluZXMgKi8KKwlzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSBDbnRsTWFjaGluZTsKKwlzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSBBc3NvY01hY2hpbmU7CisJc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgQXV0aE1hY2hpbmU7CisJc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgQXV0aFJzcE1hY2hpbmU7CisJc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgU3luY01hY2hpbmU7CisJc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgV3BhUHNrTWFjaGluZTsKKwlzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSBMZWFwTWFjaGluZTsKKwlTVEFURV9NQUNISU5FX0ZVTkMgQXNzb2NGdW5jW0FTU09DX0ZVTkNfU0laRV07CisJU1RBVEVfTUFDSElORV9GVU5DIEF1dGhGdW5jW0FVVEhfRlVOQ19TSVpFXTsKKwlTVEFURV9NQUNISU5FX0ZVTkMgQXV0aFJzcEZ1bmNbQVVUSF9SU1BfRlVOQ19TSVpFXTsKKwlTVEFURV9NQUNISU5FX0ZVTkMgU3luY0Z1bmNbU1lOQ19GVU5DX1NJWkVdOworCVNUQVRFX01BQ0hJTkVfRlVOQyBBY3RGdW5jW0FDVF9GVU5DX1NJWkVdOworCS8qIEFjdGlvbiAqLworCXN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lIEFjdE1hY2hpbmU7CiAKLQlCT09MRUFOICAgICAgICAgICAgICAgICBiUnVubmluZzsKLQlORElTX1NQSU5fTE9DSyAgICAgICAgICBUYXNrTG9jazsKLQlNTE1FX1FVRVVFICAgICAgICAgICAgICBRdWV1ZTsKKwkvKiBjb21tb24gV1BBIHN0YXRlIG1hY2hpbmUgKi8KKwlzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSBXcGFNYWNoaW5lOworCVNUQVRFX01BQ0hJTkVfRlVOQyBXcGFGdW5jW1dQQV9GVU5DX1NJWkVdOwogCi0JVUlOVCAgICAgICAgICAgICAgICAgICAgU2hpZnRSZWc7CisJdW5zaWduZWQgbG9uZyBDaGFubmVsUXVhbGl0eTsJLyogMC4uMTAwLCBDaGFubmVsIFF1YWxpdHkgSW5kaWNhdGlvbiBmb3IgUm9hbWluZyAqLworCXVuc2lnbmVkIGxvbmcgTm93MzI7CQkvKiBsYXRjaCB0aGUgdmFsdWUgb2YgTmRpc0dldFN5c3RlbVVwVGltZSgpICovCisJdW5zaWduZWQgbG9uZyBMYXN0U2VuZE5VTExwc21UaW1lOwogCi0JUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgUGVyaW9kaWNUaW1lcjsKLQlSQUxJTktfVElNRVJfU1RSVUNUICAgICBBUFNEUGVyaW9kaWNUaW1lcjsKLQlSQUxJTktfVElNRVJfU1RSVUNUICAgICBMaW5rRG93blRpbWVyOwotCVJBTElOS19USU1FUl9TVFJVQ1QgICAgIExpbmtVcFRpbWVyOwotI2lmZGVmIFJUMjg2MAotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgIGJQc1BvbGxUaW1lclJ1bm5pbmc7Ci0gICAgUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgUHNQb2xsVGltZXI7Ci0JUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgUmFkaW9Pbk9mZlRpbWVyOwotI2VuZGlmCi0JVUxPTkcgICAgICAgICAgICAgICAgICAgUGVyaW9kaWNSb3VuZDsKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBPbmVTZWNQZXJpb2RpY1JvdW5kOworCUJPT0xFQU4gYlJ1bm5pbmc7CisJc3BpbmxvY2tfdCBUYXNrTG9jazsKKwlzdHJ1Y3QgcnRfbWxtZV9xdWV1ZSBRdWV1ZTsKIAotCVVDSEFSCQkJCQlSZWFsUnhQYXRoOwotCUJPT0xFQU4JCQkJCWJMb3dUaHJvdWdocHV0OwotCUJPT0xFQU4JCQkJCWJFbmFibGVBdXRvQW50ZW5uYUNoZWNrOwotCVJBTElOS19USU1FUl9TVFJVQ1QJCVJ4QW50RXZhbFRpbWVyOworCXUzMiBTaGlmdFJlZzsKIAotI2lmZGVmIFJUMjg3MAotCVVDSEFSIENhbGlCVzQwUmZSMjQ7Ci0JVUNIQVIgQ2FsaUJXMjBSZlIyNDsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLX0gTUxNRV9TVFJVQ1QsICpQTUxNRV9TVFJVQ1Q7CisJc3RydWN0IHJ0X3JhbGlua190aW1lciBQZXJpb2RpY1RpbWVyOworCXN0cnVjdCBydF9yYWxpbmtfdGltZXIgQVBTRFBlcmlvZGljVGltZXI7CisJc3RydWN0IHJ0X3JhbGlua190aW1lciBMaW5rRG93blRpbWVyOworCXN0cnVjdCBydF9yYWxpbmtfdGltZXIgTGlua1VwVGltZXI7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJdTggYlBzUG9sbFRpbWVyUnVubmluZzsKKwlzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyIFBzUG9sbFRpbWVyOworCXN0cnVjdCBydF9yYWxpbmtfdGltZXIgUmFkaW9Pbk9mZlRpbWVyOworI2VuZGlmCQkJCS8qIFJUTVBfTUFDX1BDSSAvLyAqLworCXVuc2lnbmVkIGxvbmcgUGVyaW9kaWNSb3VuZDsKKwl1bnNpZ25lZCBsb25nIE9uZVNlY1BlcmlvZGljUm91bmQ7CiAKLS8vIHN0cnVjdHVyZSBmb3IgcmFkYXIgZGV0ZWN0aW9uIGFuZCBjaGFubmVsIHN3aXRjaAotdHlwZWRlZiBzdHJ1Y3QgX1JBREFSX0RFVEVDVF9TVFJVQ1QgewotCVVDSEFSCQlDU0NvdW50OwkJCS8vQ2hhbm5lbCBzd2l0Y2ggY291bnRlcgotCVVDSEFSCQlDU1BlcmlvZDsJCQkvL0NoYW5uZWwgc3dpdGNoIHBlcmlvZCAoYmVhY29uIGNvdW50KQotCVVDSEFSCQlSRENvdW50OwkJCS8vUmFkYXIgZGV0ZWN0aW9uIGNvdW50ZXIKLQlVQ0hBUgkJUkRNb2RlOwkJCQkvL1JhZGFyIERldGVjdGlvbiBtb2RlCi0JVUNIQVIJCVJERHVyUmVnaW9uOwkJLy9SYWRhciBkZXRlY3Rpb24gZHVyYXRpb24gcmVnaW9uCi0JVUNIQVIJCUJCUFIxNjsKLQlVQ0hBUgkJQkJQUjE3OwotCVVDSEFSCQlCQlBSMTg7Ci0JVUNIQVIJCUJCUFIyMTsKLQlVQ0hBUgkJQkJQUjIyOwotCVVDSEFSCQlCQlBSNjQ7Ci0JVUxPTkcJCUluU2VydmljZU1vbml0b3JDb3VudDsgLy8gdW5pdDogc2VjCi0JVUlOVDgJCURmc1Nlc3Npb25UaW1lOwotCUJPT0xFQU4JCWJGYXN0RGZzOwotCVVJTlQ4CQlDaE1vdmluZ1RpbWU7Ci0JVUlOVDgJCUxvbmdQdWxzZVJhZGFyVGg7Ci19IFJBREFSX0RFVEVDVF9TVFJVQ1QsICpQUkFEQVJfREVURUNUX1NUUlVDVDsKKwl1OCBSZWFsUnhQYXRoOworCUJPT0xFQU4gYkxvd1Rocm91Z2hwdXQ7CisJQk9PTEVBTiBiRW5hYmxlQXV0b0FudGVubmFDaGVjazsKKwlzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyIFJ4QW50RXZhbFRpbWVyOwogCi10eXBlZGVmIGVudW0gX1JFQ19CTE9DS0FDS19TVEFUVVMKLXsKLSAgICBSZWNpcGllbnRfTk9ORT0wLAorI2lmZGVmIFJUMzB4eAorCXU4IENhbGlCVzQwUmZSMjQ7CisJdTggQ2FsaUJXMjBSZlIyNDsKKyNlbmRpZgkJCQkvKiBSVDMweHggLy8gKi8KKworI2lmZGVmIFJUTVBfTUFDX1VTQgorCXN0cnVjdCBydF9yYWxpbmtfdGltZXIgQXV0b1dha2V1cFRpbWVyOworCUJPT0xFQU4gQXV0b1dha2V1cFRpbWVyUnVubmluZzsKKyNlbmRpZgkJCQkvKiBSVE1QX01BQ19VU0IgLy8gKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgk4MDIuMTEgTiByZWxhdGVkIGRhdGEgc3RydWN0dXJlcworICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCByZW9yZGVyaW5nX21wZHUgeworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm5leHQ7CisJdm9pZCAqcFBhY2tldDsJLyogY292ZXJ0ZWQgdG8gODAyLjMgZnJhbWUgKi8KKwlpbnQgU2VxdWVuY2U7CQkvKiBzZXF1ZW5jZSBudW1iZXIgb2YgTVBEVSAqLworCUJPT0xFQU4gYkFNU0RVOworfTsKKworc3RydWN0IHJlb3JkZXJpbmdfbGlzdCB7CisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbmV4dDsKKwlpbnQgcWxlbjsKK307CisKK3N0cnVjdCByZW9yZGVyaW5nX21wZHVfcG9vbCB7CisJdm9pZCAqbWVtOworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgcmVvcmRlcmluZ19saXN0IGZyZWVsaXN0OworfTsKKwordHlwZWRlZiBlbnVtIF9SRUNfQkxPQ0tBQ0tfU1RBVFVTIHsKKwlSZWNpcGllbnRfTk9ORSA9IDAsCiAJUmVjaXBpZW50X1VTRUQsCiAJUmVjaXBpZW50X0hhbmRsZVJlcywKLSAgICBSZWNpcGllbnRfQWNjZXB0CisJUmVjaXBpZW50X0FjY2VwdAogfSBSRUNfQkxPQ0tBQ0tfU1RBVFVTLCAqUFJFQ19CTE9DS0FDS19TVEFUVVM7CiAKLXR5cGVkZWYgZW51bSBfT1JJX0JMT0NLQUNLX1NUQVRVUwotewotICAgIE9yaWdpbmF0b3JfTk9ORT0wLAordHlwZWRlZiBlbnVtIF9PUklfQkxPQ0tBQ0tfU1RBVFVTIHsKKwlPcmlnaW5hdG9yX05PTkUgPSAwLAogCU9yaWdpbmF0b3JfVVNFRCwKLSAgICBPcmlnaW5hdG9yX1dhaXRSZXMsCi0gICAgT3JpZ2luYXRvcl9Eb25lCisJT3JpZ2luYXRvcl9XYWl0UmVzLAorCU9yaWdpbmF0b3JfRG9uZQogfSBPUklfQkxPQ0tBQ0tfU1RBVFVTLCAqUE9SSV9CTE9DS0FDS19TVEFUVVM7CiAKLXR5cGVkZWYgc3RydWN0IF9CQV9PUklfRU5UUll7Ci0JVUNIQVIgICBXY2lkOwotCVVDSEFSICAgVElEOwotCVVDSEFSICAgQkFXaW5TaXplOwotCVVDSEFSICAgVG9rZW47Ci0vLyBTZXF1ZW5jZSBpcyB0byBmaWxsIGV2ZXJ5IG91dGdvaW5nIFFvUyBEQVRBIGZyYW1lJ3Mgc2VxdWVuY2UgZmllbGQgaW4gODAyLjExIGhlYWRlci4KLQlVU0hPUlQJU2VxdWVuY2U7Ci0JVVNIT1JUCVRpbWVPdXRWYWx1ZTsKLQlPUklfQkxPQ0tBQ0tfU1RBVFVTICBPUklfQkFfU3RhdHVzOwotCVJBTElOS19USU1FUl9TVFJVQ1QgT1JJQkFUaW1lcjsKLQlQVk9JRAlwQWRhcHRlcjsKLX0gQkFfT1JJX0VOVFJZLCAqUEJBX09SSV9FTlRSWTsKK3N0cnVjdCBydF9iYV9vcmlfZW50cnkgeworCXU4IFdjaWQ7CisJdTggVElEOworCXU4IEJBV2luU2l6ZTsKKwl1OCBUb2tlbjsKKy8qIFNlcXVlbmNlIGlzIHRvIGZpbGwgZXZlcnkgb3V0Z29pbmcgUW9TIERBVEEgZnJhbWUncyBzZXF1ZW5jZSBmaWVsZCBpbiA4MDIuMTEgaGVhZGVyLiAqLworCXUxNiBTZXF1ZW5jZTsKKwl1MTYgVGltZU91dFZhbHVlOworCU9SSV9CTE9DS0FDS19TVEFUVVMgT1JJX0JBX1N0YXR1czsKKwlzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyIE9SSUJBVGltZXI7CisJdm9pZCAqcEFkYXB0ZXI7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfQkFfUkVDX0VOVFJZIHsKLQlVQ0hBUiAgIFdjaWQ7Ci0JVUNIQVIgICBUSUQ7Ci0JVUNIQVIgICBCQVdpblNpemU7CS8vIDcuMy4xLjE0LiBlYWNoIGJ1ZmZlciBpcyBjYXBhYmxlIG9mIGhvbGRpbmcgYSBtYXggQU1TRFUgb3IgTVNEVS4KLQlVU0hPUlQJCUxhc3RJbmRTZXE7Ci0JVVNIT1JUCQlUaW1lT3V0VmFsdWU7Ci0JUkFMSU5LX1RJTUVSX1NUUlVDVCBSRUNCQVRpbWVyOwotCVVMT05HCQlMYXN0SW5kU2VxQXRUaW1lcjsKLQlVTE9ORwkJbkRyb3BQYWNrZXQ7Ci0JVUxPTkcJCXJjdlNlcTsKLQlSRUNfQkxPQ0tBQ0tfU1RBVFVTICBSRUNfQkFfU3RhdHVzOwotCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIFJ4UmVSaW5nTG9jazsgICAgICAgICAgICAgICAgIC8vIFJ4IFJpbmcgc3BpbmxvY2sKLQlQVk9JRAlwQWRhcHRlcjsKLQlzdHJ1Y3QgcmVvcmRlcmluZ19saXN0CWxpc3Q7Ci19IEJBX1JFQ19FTlRSWSwgKlBCQV9SRUNfRU5UUlk7CitzdHJ1Y3QgcnRfYmFfcmVjX2VudHJ5IHsKKwl1OCBXY2lkOworCXU4IFRJRDsKKwl1OCBCQVdpblNpemU7CS8qIDcuMy4xLjE0LiBlYWNoIGJ1ZmZlciBpcyBjYXBhYmxlIG9mIGhvbGRpbmcgYSBtYXggQU1TRFUgb3IgTVNEVS4gKi8KKwkvKnU4IE51bU9mUnhQa3Q7ICovCisJLyp1OCAgICBDdXJpbmRpZHg7IC8vIHRoZSBoZWFkIGluIHRoZSBSWCByZW9yZGVyaW5nIGJ1ZmZlciAqLworCXUxNiBMYXN0SW5kU2VxOworLyogICAgICB1MTYgICAgICAgICAgTGFzdEluZFNlcUF0VGltZXI7ICovCisJdTE2IFRpbWVPdXRWYWx1ZTsKKwlzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyIFJFQ0JBVGltZXI7CisJdW5zaWduZWQgbG9uZyBMYXN0SW5kU2VxQXRUaW1lcjsKKwl1bnNpZ25lZCBsb25nIG5Ecm9wUGFja2V0OworCXVuc2lnbmVkIGxvbmcgcmN2U2VxOworCVJFQ19CTE9DS0FDS19TVEFUVVMgUkVDX0JBX1N0YXR1czsKKy8qICAgICAgdTggICBSeEJ1ZklkeFVzZWQ7ICovCisJLyogY29ycmVzcG9uZGluZyB2aXJ0dWFsIGFkZHJlc3MgZm9yIFJYIHJlb3JkZXJpbmcgcGFja2V0IHN0b3JhZ2UuICovCisJLypSVE1QX1JFT1JERVJETUFCVUYgTUFQX1JYQnVmW01BWF9SWF9SRU9SREVSQlVGXTsgKi8KKwlzcGlubG9ja190IFJ4UmVSaW5nTG9jazsJLyogUnggUmluZyBzcGlubG9jayAqLworLyogICAgICBzdHJ1Y3QgX0JBX1JFQ19FTlRSWSAqcE5leHQ7ICovCisJdm9pZCAqcEFkYXB0ZXI7CisJc3RydWN0IHJlb3JkZXJpbmdfbGlzdCBsaXN0OworfTsKIAorc3RydWN0IHJ0X2JhX3RhYmxlIHsKKwl1bnNpZ25lZCBsb25nIG51bUFzUmVjaXBpZW50OwkvKiBJIGFtIHJlY2lwaWVudCBvZiBudW1Bc1JlY2lwaWVudCBjbGllbnRzLiBUaGVzZSBjbGllbnQgYXJlIGluIHRoZSBCQVJlY0VudHJ5W10gKi8KKwl1bnNpZ25lZCBsb25nIG51bUFzT3JpZ2luYXRvcjsJLyogSSBhbSBvcmlnaW5hdG9yIG9mICAgbnVtQXNPcmlnaW5hdG9yIGNsaWVudHMuIFRoZXNlIGNsaWVudHMgYXJlIGluIHRoZSBCQU9yaUVudHJ5W10gKi8KKwl1bnNpZ25lZCBsb25nIG51bURvbmVPcmlnaW5hdG9yOwkvKiBjb3VudCBEb25lIE9yaWdpbmF0b3Igc2Vzc2lvbnMgKi8KKwlzdHJ1Y3QgcnRfYmFfb3JpX2VudHJ5IEJBT3JpRW50cnlbTUFYX0xFTl9PRl9CQV9PUklfVEFCTEVdOworCXN0cnVjdCBydF9iYV9yZWNfZW50cnkgQkFSZWNFbnRyeVtNQVhfTEVOX09GX0JBX1JFQ19UQUJMRV07Cit9OwogCi10eXBlZGVmIHN0cnVjdCB7Ci0JVUxPTkcJCW51bUFzUmVjaXBpZW50OwkJLy8gSSBhbSByZWNpcGllbnQgb2YgbnVtQXNSZWNpcGllbnQgY2xpZW50cy4gVGhlc2UgY2xpZW50IGFyZSBpbiB0aGUgQkFSZWNFbnRyeVtdCi0JVUxPTkcJCW51bUFzT3JpZ2luYXRvcjsJLy8gSSBhbSBvcmlnaW5hdG9yIG9mIAludW1Bc09yaWdpbmF0b3IgY2xpZW50cy4gVGhlc2UgY2xpZW50cyBhcmUgaW4gdGhlIEJBT3JpRW50cnlbXQotCUJBX09SSV9FTlRSWSAgICAgICBCQU9yaUVudHJ5W01BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFXTsKLQlCQV9SRUNfRU5UUlkgICAgICAgQkFSZWNFbnRyeVtNQVhfTEVOX09GX0JBX1JFQ19UQUJMRV07Ci19IEJBX1RBQkxFLCAqUEJBX1RBQkxFOworLypGb3IgUXVyZXlCQVRhYmxlT0lEIHVzZTsgKi8KK3N0cnVjdCBQQUNLRUQgcnRfb2lkX2JhX3JlY19lbnRyeSB7CisJdTggTUFDQWRkcltNQUNfQUREUl9MRU5dOworCXU4IEJhQml0bWFwOwkJLyogaWYgKEJhQml0bWFwJigxPDxUSUQpKSwgdGhpcyBzZXNzaW9uIHdpdGh7TUFDQWRkciwgVElEfWV4aXN0cywgc28gcmVhZCBCdWZTaXplW1RJRF0gZm9yIEJ1ZmZlclNpemUgKi8KKwl1OCByc3Y7CisJdTggQnVmU2l6ZVs4XTsKKwlSRUNfQkxPQ0tBQ0tfU1RBVFVTIFJFQ19CQV9TdGF0dXNbOF07Cit9OwogCi0vL0ZvciBRdXJleUJBVGFibGVPSUQgdXNlOwotdHlwZWRlZiBzdHJ1Y3QgIFBBQ0tFRCBfT0lEX0JBX1JFQ19FTlRSWXsKLQlVQ0hBUiAgIE1BQ0FkZHJbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgIEJhQml0bWFwOyAgIC8vIGlmIChCYUJpdG1hcCYoMTw8VElEKSksIHRoaXMgc2Vzc2lvbiB3aXRoe01BQ0FkZHIsIFRJRH1leGlzdHMsIHNvIHJlYWQgQnVmU2l6ZVtUSURdIGZvciBCdWZmZXJTaXplCi0JVUNIQVIgICByc3Y7Ci0JVUNIQVIgICBCdWZTaXplWzhdOwotCVJFQ19CTE9DS0FDS19TVEFUVVMJUkVDX0JBX1N0YXR1c1s4XTsKLX0gT0lEX0JBX1JFQ19FTlRSWSwgKlBPSURfQkFfUkVDX0VOVFJZOworLypGb3IgUXVyZXlCQVRhYmxlT0lEIHVzZTsgKi8KK3N0cnVjdCBQQUNLRUQgcnRfb2lkX2JhX29yaV9lbnRyeSB7CisJdTggTUFDQWRkcltNQUNfQUREUl9MRU5dOworCXU4IEJhQml0bWFwOwkJLyogaWYgKEJhQml0bWFwJigxPDxUSUQpKSwgdGhpcyBzZXNzaW9uIHdpdGh7TUFDQWRkciwgVElEfWV4aXN0cywgc28gcmVhZCBCdWZTaXplW1RJRF0gZm9yIEJ1ZmZlclNpemUsIHJlYWQgT1JJX0JBX1N0YXR1c1tUSURdIGZvciBzdGF0dXMgKi8KKwl1OCByc3Y7CisJdTggQnVmU2l6ZVs4XTsKKwlPUklfQkxPQ0tBQ0tfU1RBVFVTIE9SSV9CQV9TdGF0dXNbOF07Cit9OwogCi0vL0ZvciBRdXJleUJBVGFibGVPSUQgdXNlOwotdHlwZWRlZiBzdHJ1Y3QgIFBBQ0tFRCBfT0lEX0JBX09SSV9FTlRSWXsKLQlVQ0hBUiAgIE1BQ0FkZHJbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgIEJhQml0bWFwOyAgLy8gaWYgKEJhQml0bWFwJigxPDxUSUQpKSwgdGhpcyBzZXNzaW9uIHdpdGh7TUFDQWRkciwgVElEfWV4aXN0cywgc28gcmVhZCBCdWZTaXplW1RJRF0gZm9yIEJ1ZmZlclNpemUsIHJlYWQgT1JJX0JBX1N0YXR1c1tUSURdIGZvciBzdGF0dXMKLQlVQ0hBUiAgIHJzdjsKLQlVQ0hBUiAgIEJ1ZlNpemVbOF07Ci0JT1JJX0JMT0NLQUNLX1NUQVRVUyAgT1JJX0JBX1N0YXR1c1s4XTsKLX0gT0lEX0JBX09SSV9FTlRSWSwgKlBPSURfQkFfT1JJX0VOVFJZOworc3RydWN0IHJ0X3F1ZXJ5YmFfdGFibGUgeworCXN0cnVjdCBydF9vaWRfYmFfb3JpX2VudHJ5IEJBT3JpRW50cnlbMzJdOworCXN0cnVjdCBydF9vaWRfYmFfcmVjX2VudHJ5IEJBUmVjRW50cnlbMzJdOworCXU4IE9yaU51bTsJCS8qIE51bWJlciBvZiBiZWxvdyBCQU9yaUVudHJ5ICovCisJdTggUmVjTnVtOwkJLyogTnVtYmVyIG9mIGJlbG93IEJBUmVjRW50cnkgKi8KK307CiAKLXR5cGVkZWYgc3RydWN0IF9RVUVSWUJBX1RBQkxFewotCU9JRF9CQV9PUklfRU5UUlkgICAgICAgQkFPcmlFbnRyeVszMl07Ci0JT0lEX0JBX1JFQ19FTlRSWSAgICAgICBCQVJlY0VudHJ5WzMyXTsKLQlVQ0hBUiAgIE9yaU51bTsvLyBOdW1iZXIgb2YgYmVsb3cgQkFPcmlFbnRyeQotCVVDSEFSICAgUmVjTnVtOy8vIE51bWJlciBvZiBiZWxvdyBCQVJlY0VudHJ5Ci19IFFVRVJZQkFfVEFCTEUsICpQUVVFUllCQV9UQUJMRTsKLQotdHlwZWRlZgl1bmlvbglfQkFDQVBfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJUnhCQVdpbkxpbWl0Ojg7Ci0JCVVJTlQzMgkJVHhCQVdpbkxpbWl0Ojg7Ci0JCVVJTlQzMgkJQXV0b0JBOjE7CS8vIGF1dG9tYXRpY2FsbHkgQkEKLQkJVUlOVDMyCQlQb2xpY3k6MjsJLy8gMDogREVMQVlfQkEgMTpJTU1FRF9CQSAgKC8vQkEgUG9saWN5IHN1YmZpbGVkIHZhbHVlIGluIEFEREJBIGZyYW1lKSAgIDI6QkEtbm90IHVzZQotCQlVSU5UMzIJCU1wZHVEZW5zaXR5OjM7Ci0JCVVJTlQzMiAgICAgICAJQW1zZHVFbmFibGU6MTsJLy9FbmFibGUgQU1TRFUgdHJhbnNtaXNzdGlvbgotCQlVSU5UMzIgICAgICAgCUFtc2R1U2l6ZToxOwkvLyAwOjM4MzksIDE6NzkzNSBieXRlcy4gVUlOVCAgTVNEVVNpemVUb0J5dGVzW10JPSB7IDM4MzksIDc5MzV9OwotCQlVSU5UMzIgICAgICAgCU1NUFNtb2RlOjI7CS8vIE1JTU8gcG93ZXIgc2F2ZSBtb3JlLCAwOnN0YXRpYywgMTpkeW5hbWljLCAyOnJzdiwgMzptaW1vIGVuYWJsZQotCQlVSU5UMzIgICAgICAgCWJIdEFkaG9jOjE7CQkJLy8gYWRob2MgY2FuIHVzZSBodCByYXRlLgotCQlVSU5UMzIgICAgICAgCWIyMDQwQ29leGlzdFNjYW5TdXA6MTsJCS8vQXMgU3RhLCBzdXBwb3J0IGRvIDIwNDAgY29leGlzdGVuY2Ugc2NhbiBmb3IgQVAuIEFzIEFwLCBzdXBwb3J0IG1vbml0b3IgdHJpZ2dlciBldmVudCB0byBjaGVjayBpZiBjYW4gdXNlIEJXIDQwTUh6LgotCQlVSU5UMzIgICAgICAgCTo0OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKK3R5cGVkZWYgdW5pb24gX0JBQ0FQX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgUnhCQVdpbkxpbWl0Ojg7CisJCXUzMiBUeEJBV2luTGltaXQ6ODsKKwkJdTMyIEF1dG9CQToxOwkvKiBhdXRvbWF0aWNhbGx5IEJBICovCisJCXUzMiBQb2xpY3k6MjsJLyogMDogREVMQVlfQkEgMTpJTU1FRF9CQSAgKC8vQkEgUG9saWN5IHN1YmZpbGVkIHZhbHVlIGluIEFEREJBIGZyYW1lKSAgIDI6QkEtbm90IHVzZSAqLworCQl1MzIgTXBkdURlbnNpdHk6MzsKKwkJdTMyIEFtc2R1RW5hYmxlOjE7CS8qRW5hYmxlIEFNU0RVIHRyYW5zbWlzc3Rpb24gKi8KKwkJdTMyIEFtc2R1U2l6ZToxOwkvKiAwOjM4MzksIDE6NzkzNSBieXRlcy4gdTMyICBNU0RVU2l6ZVRvQnl0ZXNbXSAgICAgICAgPSB7IDM4MzksIDc5MzV9OyAqLworCQl1MzIgTU1QU21vZGU6MjsJLyogTUlNTyBwb3dlciBzYXZlIG1vcmUsIDA6c3RhdGljLCAxOmR5bmFtaWMsIDI6cnN2LCAzOm1pbW8gZW5hYmxlICovCisJCXUzMiBiSHRBZGhvYzoxOwkvKiBhZGhvYyBjYW4gdXNlIGh0IHJhdGUuICovCisJCXUzMiBiMjA0MENvZXhpc3RTY2FuU3VwOjE7CS8qQXMgU3RhLCBzdXBwb3J0IGRvIDIwNDAgY29leGlzdGVuY2Ugc2NhbiBmb3IgQVAuIEFzIEFwLCBzdXBwb3J0IG1vbml0b3IgdHJpZ2dlciBldmVudCB0byBjaGVjayBpZiBjYW4gdXNlIEJXIDQwTUh6LiAqLworCQl1MzIgOiA0OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7CiB9IEJBQ0FQX1NUUlVDLCAqUEJBQ0FQX1NUUlVDOwogCi0vL1RoaXMgc3RydWN0dXJlIGlzIGZvciBhbGwgODAyLjExbiBjYXJkIEludGVyT3B0aWJpbGl0eVRlc3QgYWN0aW9uLiBSZXNldCBhbGwgTnVtIGV2ZXJ5IG4gc2Vjb25kLiAgKERldGFpbHMgc2VlIE1MTUVQZXJpb2RpYykKLXR5cGVkZWYJc3RydWN0CV9JT1RfU1RSVUMJewotCVVDSEFSCQkJVGhyZXNob2xkWzJdOwotCVVDSEFSCQkJUmVvcmRlclRpbWVPdXROdW1bTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEVdOwkvLyBjb21wYXJlIHdpdGggdGhyZXNob2xkWzBdCi0JVUNIQVIJCQlSZWZyZXNoTnVtW01BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFXTsJLy8gY29tcGFyZSB3aXRoIHRocmVzaG9sZFsxXQotCVVMT05HCQkJT25lU2VjSW5XaW5kb3dDb3VudDsKLQlVTE9ORwkJCU9uZVNlY0ZyYW1lRHVwbGljYXRlQ291bnQ7Ci0JVUxPTkcJCQlPbmVTZWNPdXRXaW5kb3dDb3VudDsKLQlVQ0hBUgkJCURlbE9yaUFjdDsKLQlVQ0hBUgkJCURlbFJlY0FjdDsKLQlVQ0hBUgkJCVJUU1Nob3J0UHJvdDsKLQlVQ0hBUgkJCVJUU0xvbmdQcm90OwotCUJPT0xFQU4JCQliUlRTTG9uZ1Byb3RPbjsKLQlCT09MRUFOCQkJYkxhc3RBdGhlcm9zOwotICAgIEJPT0xFQU4JCQliQ3VycmVudEF0aGVyb3M7Ci0gICAgQk9PTEVBTiAgICAgICAgIGJOb3dBdGhlcm9zQnVyc3RPbjsKLQlCT09MRUFOCQkJYk5leHREaXNhYmxlUnhCQTsKLSAgICBCT09MRUFOCQkJYlRvZ2dsZTsKLX0gSU9UX1NUUlVDLCAqUElPVF9TVFJVQzsKK3N0cnVjdCBydF9vaWRfYWRkX2JhX2VudHJ5IHsKKwlCT09MRUFOIElzUmVjaXBpZW50OworCXU4IE1BQ0FkZHJbTUFDX0FERFJfTEVOXTsKKwl1OCBUSUQ7CisJdTggbk1TRFU7CisJdTE2IFRpbWVPdXQ7CisJQk9PTEVBTiBiQWxsVGlkOwkvKiBJZiBUcnVlLCBkZWxldGUgYWxsIFRJRCBmb3IgQkEgc2Vzc2lvbnMgd2l0aCB0aGlzIE1BQ2FkZHIuICovCit9OwogCi0vLyBUaGlzIGlzIHRoZSByZWdpc3RyeSBzZXR0aW5nIGZvciA4MDIuMTFuIHRyYW5zbWl0IHNldHRpbmcuICBVc2VkIGluIGFkdmFuY2VkIHBhZ2UuCisjZGVmaW5lIElTX0hUX1NUQShfcE1hY0VudHJ5KQlcCisJKF9wTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCisKKyNkZWZpbmUgSVNfSFRfUkFURShfcE1hY0VudHJ5KQlcCisJKF9wTWFjRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCisKKyNkZWZpbmUgUEVFUl9JU19IVF9SQVRFKF9wTWFjRW50cnkpCVwKKwkoX3BNYWNFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKKworLypUaGlzIHN0cnVjdHVyZSBpcyBmb3IgYWxsIDgwMi4xMW4gY2FyZCBJbnRlck9wdGliaWxpdHlUZXN0IGFjdGlvbi4gUmVzZXQgYWxsIE51bSBldmVyeSBuIHNlY29uZC4gIChEZXRhaWxzIHNlZSBNTE1FUGVyaW9kaWMpICovCitzdHJ1Y3QgcnRfaW90IHsKKwl1OCBUaHJlc2hvbGRbMl07CisJdTggUmVvcmRlclRpbWVPdXROdW1bTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEVdOwkvKiBjb21wYXJlIHdpdGggdGhyZXNob2xkWzBdICovCisJdTggUmVmcmVzaE51bVtNQVhfTEVOX09GX0JBX1JFQ19UQUJMRV07CS8qIGNvbXBhcmUgd2l0aCB0aHJlc2hvbGRbMV0gKi8KKwl1bnNpZ25lZCBsb25nIE9uZVNlY0luV2luZG93Q291bnQ7CisJdW5zaWduZWQgbG9uZyBPbmVTZWNGcmFtZUR1cGxpY2F0ZUNvdW50OworCXVuc2lnbmVkIGxvbmcgT25lU2VjT3V0V2luZG93Q291bnQ7CisJdTggRGVsT3JpQWN0OworCXU4IERlbFJlY0FjdDsKKwl1OCBSVFNTaG9ydFByb3Q7CisJdTggUlRTTG9uZ1Byb3Q7CisJQk9PTEVBTiBiUlRTTG9uZ1Byb3RPbjsKKwlCT09MRUFOIGJMYXN0QXRoZXJvczsKKwlCT09MRUFOIGJDdXJyZW50QXRoZXJvczsKKwlCT09MRUFOIGJOb3dBdGhlcm9zQnVyc3RPbjsKKwlCT09MRUFOIGJOZXh0RGlzYWJsZVJ4QkE7CisJQk9PTEVBTiBiVG9nZ2xlOworfTsKKworLyogVGhpcyBpcyB0aGUgcmVnaXN0cnkgc2V0dGluZyBmb3IgODAyLjExbiB0cmFuc21pdCBzZXR0aW5nLiAgVXNlZCBpbiBhZHZhbmNlZCBwYWdlLiAqLwogdHlwZWRlZiB1bmlvbiBfUkVHX1RSQU5TTUlUX1NFVFRJTkcgewotIHN0cnVjdCB7Ci0JCSBVSU5UMzIgIHJzdjA6MTA7Ci0JCSBVSU5UMzIgIFR4QkY6MTsKLSAgICAgICAgIFVJTlQzMiAgQlc6MTsgLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKLSAgICAgICAgIFVJTlQzMiAgU2hvcnRHSToxOwotICAgICAgICAgVUlOVDMyICBTVEJDOjE7IC8vU1BBQ0UKLSAgICAgICAgIFVJTlQzMiAgVFJBTlNOTzoyOwotICAgICAgICAgVUlOVDMyICBIVE1PREU6MTsKLSAgICAgICAgIFVJTlQzMiAgRVhUQ0hBOjI7Ci0gICAgICAgICBVSU5UMzIgIHJzdjoxMzsKLSAgICB9IGZpZWxkOwotIFVJTlQzMiAgIHdvcmQ7CisJc3RydWN0IHsKKwkJLyp1MzIgIFBoeU1vZGU6NDsgKi8KKwkJLyp1MzIgIE1DUzo3OyAgICAgICAgICAgICAgICAgLy8gTUNTICovCisJCXUzMiByc3YwOjEwOworCQl1MzIgVHhCRjoxOworCQl1MzIgQlc6MTsJLypjaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHogKi8KKwkJdTMyIFNob3J0R0k6MTsKKwkJdTMyIFNUQkM6MTsJLypTUEFDRSAqLworCQl1MzIgVFJBTlNOTzoyOworCQl1MzIgSFRNT0RFOjE7CisJCXUzMiBFWFRDSEE6MjsKKwkJdTMyIHJzdjoxMzsKKwl9IGZpZWxkOworCXUzMiB3b3JkOwogfSBSRUdfVFJBTlNNSVRfU0VUVElORywgKlBSRUdfVFJBTlNNSVRfU0VUVElORzsKIAotdHlwZWRlZiB1bmlvbiAgX0RFU0lSRURfVFJBTlNNSVRfU0VUVElORyB7Ci0Jc3RydWN0CXsKLQkJCVVTSE9SVCAgIAlNQ1M6NzsgICAgICAgICAgICAgICAgIAkvLyBNQ1MKLQkJCVVTSE9SVAkJUGh5TW9kZTo0OwotCQkJVVNIT1JUCSAJRml4ZWRUeE1vZGU6MjsJCQkvLyBJZiBNQ1MgaXNuJ3QgQVVUTywgZml4IHJhdGUgaW4gQ0NLLCBPRkRNIG9yIEhUIG1vZGUuCi0JCQlVU0hPUlQJCXJzdjozOwotCX0JZmllbGQ7Ci0JVVNIT1JUCQl3b3JkOwotIH0gREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HLCAqUERFU0lSRURfVFJBTlNNSVRfU0VUVElORzsKK3R5cGVkZWYgdW5pb24gX0RFU0lSRURfVFJBTlNNSVRfU0VUVElORyB7CisJc3RydWN0IHsKKwkJdTE2IE1DUzo3OwkvKiBNQ1MgKi8KKwkJdTE2IFBoeU1vZGU6NDsKKwkJdTE2IEZpeGVkVHhNb2RlOjI7CS8qIElmIE1DUyBpc24ndCBBVVRPLCBmaXggcmF0ZSBpbiBDQ0ssIE9GRE0gb3IgSFQgbW9kZS4gKi8KKwkJdTE2IHJzdjozOworCX0gZmllbGQ7CisJdTE2IHdvcmQ7Cit9IERFU0lSRURfVFJBTlNNSVRfU0VUVElORywgKlBERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkc7CiAKLXR5cGVkZWYgc3RydWN0IHsKLQlCT09MRUFOCQlJc1JlY2lwaWVudDsKLQlVQ0hBUiAgIE1BQ0FkZHJbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgIFRJRDsKLQlVQ0hBUiAgIG5NU0RVOwotCVVTSE9SVCAgIFRpbWVPdXQ7Ci0JQk9PTEVBTiBiQWxsVGlkOyAgLy8gSWYgVHJ1ZSwgZGVsZXRlIGFsbCBUSUQgZm9yIEJBIHNlc3Npb25zIHdpdGggdGhpcyBNQUNhZGRyLgotfSBPSURfQUREX0JBX0VOVFJZLCAqUE9JRF9BRERfQkFfRU5UUlk7CisjaWZkZWYgUlRNUF9NQUNfVVNCCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoJVVNCLWJhc2VkIGNoaXAgQmVhY29uIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmVzCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBCRUFDT05fQklUTUFQX01BU0sJCTB4ZmYKK3N0cnVjdCBydF9iZWFjb25fc3luYyB7CisJdTggQmVhY29uQnVmW0hXX0JFQUNPTl9NQVhfQ09VTlRdW0hXX0JFQUNPTl9PRkZTRVRdOworCXU4IEJlYWNvblR4V0lbSFdfQkVBQ09OX01BWF9DT1VOVF1bVFhXSV9TSVpFXTsKKwl1bnNpZ25lZCBsb25nIFRpbUlFTG9jYXRpb25JbkJlYWNvbltIV19CRUFDT05fTUFYX0NPVU5UXTsKKwl1bnNpZ25lZCBsb25nIENhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvbltIV19CRUFDT05fTUFYX0NPVU5UXTsKKwlCT09MRUFOIEVuYWJsZUJlYWNvbjsJLyogdHJpZ2dlciB0byBlbmFibGUgYmVhY29uIHRyYW5zbWlzc2lvbi4gKi8KKwl1OCBCZWFjb25CaXRNYXA7CS8qIE5PVEU6IElmIHRoZSBNQVhfTUJTU0lEX05VTSBpcyBsYXJnZXIgdGhhbiA4LCB0aGlzIHBhcmFtZXRlciBuZWVkIHRvIGNoYW5nZS4gKi8KKwl1OCBEdGltQml0T247CS8qIE5PVEU6IElmIHRoZSBNQVhfTUJTU0lEX05VTSBpcyBsYXJnZXIgdGhhbiA4LCB0aGlzIHBhcmFtZXRlciBuZWVkIHRvIGNoYW5nZS4gKi8KK307CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAKLS8vCi0vLyBNdWx0aXBsZSBTU0lEIHN0cnVjdHVyZQotLy8KLSNkZWZpbmUgV0xBTl9NQVhfTlVNX09GX1RJTQkJCSgoTUFYX0xFTl9PRl9NQUNfVEFCTEUgPj4gMykgKyAxKSAvKiAvOCArIDEgKi8KLSNkZWZpbmUgV0xBTl9DVF9USU1fQkNNQ19PRkZTRVQJCTAgLyogdW5pdDogMzJCICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoJTXVsdGlwbGUgU1NJRCByZWxhdGVkIGRhdGEgc3RydWN0dXJlcworICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgV0xBTl9NQVhfTlVNX09GX1RJTQkJCSgoTUFYX0xFTl9PRl9NQUNfVEFCTEUgPj4gMykgKyAxKQkvKiAvOCArIDEgKi8KKyNkZWZpbmUgV0xBTl9DVF9USU1fQkNNQ19PRkZTRVQJCTAJLyogdW5pdDogMzJCICovCiAKIC8qIGNsZWFyIGJjbWMgVElNIGJpdCAqLwogI2RlZmluZSBXTEFOX01SX1RJTV9CQ01DX0NMRUFSKGFwaWR4KSBcCkBAIC0xNjc4LDEzMjIgKzExNTcsMTAzMCBAQAogCiAvKiBjbGVhciBhIHN0YXRpb24gUFMgVElNIGJpdCAqLwogI2RlZmluZSBXTEFOX01SX1RJTV9CSVRfQ0xFQVIoYWRfcCwgYXBpZHgsIHdjaWQpIFwKLQl7CVVDSEFSIHRpbV9vZmZzZXQgPSB3Y2lkID4+IDM7IFwKLQkJVUNIQVIgYml0X29mZnNldCA9IHdjaWQgJiAweDc7IFwKKwl7CXU4IHRpbV9vZmZzZXQgPSB3Y2lkID4+IDM7IFwKKwkJdTggYml0X29mZnNldCA9IHdjaWQgJiAweDc7IFwKIAkJYWRfcC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5UaW1CaXRtYXBzW3RpbV9vZmZzZXRdICY9ICh+QklUOFtiaXRfb2Zmc2V0XSk7IH0KIAogLyogc2V0IGEgc3RhdGlvbiBQUyBUSU0gYml0ICovCiAjZGVmaW5lIFdMQU5fTVJfVElNX0JJVF9TRVQoYWRfcCwgYXBpZHgsIHdjaWQpIFwKLQl7CVVDSEFSIHRpbV9vZmZzZXQgPSB3Y2lkID4+IDM7IFwKLQkJVUNIQVIgYml0X29mZnNldCA9IHdjaWQgJiAweDc7IFwKKwl7CXU4IHRpbV9vZmZzZXQgPSB3Y2lkID4+IDM7IFwKKwkJdTggYml0X29mZnNldCA9IHdjaWQgJiAweDc7IFwKIAkJYWRfcC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5UaW1CaXRtYXBzW3RpbV9vZmZzZXRdIHw9IEJJVDhbYml0X29mZnNldF07IH0KIAotI2lmZGVmIFJUMjg3MAotI2RlZmluZSBCRUFDT05fQklUTUFQX01BU0sJCTB4ZmYKLXR5cGVkZWYgc3RydWN0IF9CRUFDT05fU1lOQ19TVFJVQ1RfCi17Ci0JVUNIQVIgICAgICAgIAkJCUJlYWNvbkJ1ZltIV19CRUFDT05fTUFYX0NPVU5UXVtIV19CRUFDT05fT0ZGU0VUXTsKLQlVQ0hBUgkJCQkJQmVhY29uVHhXSVtIV19CRUFDT05fTUFYX0NPVU5UXVtUWFdJX1NJWkVdOwotCVVMT05HIAkJCQkJVGltSUVMb2NhdGlvbkluQmVhY29uW0hXX0JFQUNPTl9NQVhfQ09VTlRdOwotCVVMT05HCQkJCQlDYXBhYmlsaXR5SW5mb0xvY2F0aW9uSW5CZWFjb25bSFdfQkVBQ09OX01BWF9DT1VOVF07Ci0JQk9PTEVBTgkJCQkJRW5hYmxlQmVhY29uOwkJLy8gdHJpZ2dlciB0byBlbmFibGUgYmVhY29uIHRyYW5zbWlzc2lvbi4KLQlVQ0hBUgkJCQkJQmVhY29uQml0TWFwOwkJLy8gTk9URTogSWYgdGhlIE1BWF9NQlNTSURfTlVNIGlzIGxhcmdlciB0aGFuIDgsIHRoaXMgcGFyYW1ldGVyIG5lZWQgdG8gY2hhbmdlLgotCVVDSEFSCQkJCQlEdGltQml0T247CQkJLy8gTk9URTogSWYgdGhlIE1BWF9NQlNTSURfTlVNIGlzIGxhcmdlciB0aGFuIDgsIHRoaXMgcGFyYW1ldGVyIG5lZWQgdG8gY2hhbmdlLgotfUJFQUNPTl9TWU5DX1NUUlVDVDsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KKy8qIGNvbmZpZ3VyYXRpb24gY29tbW9uIHRvIE9QTU9ERV9BUCBhcyB3ZWxsIGFzIE9QTU9ERV9TVEEgKi8KK3N0cnVjdCBydF9jb21tb25fY29uZmlnIHsKIAotdHlwZWRlZiBzdHJ1Y3QgX01VTFRJU1NJRF9TVFJVQ1QgewotCVVDSEFSCQkJCQkJCQlCc3NpZFtNQUNfQUREUl9MRU5dOwotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNzaWRMZW47Ci0gICAgQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOwotICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcGFiaWxpdHlJbmZvOworCUJPT0xFQU4gYkNvdW50cnlGbGFnOworCXU4IENvdW50cnlDb2RlWzNdOworCXU4IEdlb2dyYXBoeTsKKwl1OCBDb3VudHJ5UmVnaW9uOwkvKiBFbnVtIG9mIGNvdW50cnkgcmVnaW9uLCAwOkZDQywgMTpJQywgMjpFVFNJLCAzOlNQQUlOLCA0OkZyYW5jZSwgNTpNS0ssIDY6TUtLMSwgNzpJc3JhZWwgKi8KKwl1OCBDb3VudHJ5UmVnaW9uRm9yQUJhbmQ7CS8qIEVudW0gb2YgY291bnRyeSByZWdpb24gZm9yIEEgYmFuZCAqLworCXU4IFBoeU1vZGU7CQkvKiBQSFlfMTFBLCBQSFlfMTFCLCBQSFlfMTFCR19NSVhFRCwgUEhZX0FCR19NSVhFRCAqLworCXUxNiBEc2lmczsJCS8qIGluIHVuaXRzIG9mIHVzZWMgKi8KKwl1bnNpZ25lZCBsb25nIFBhY2tldEZpbHRlcjsJLyogUGFja2V0IGZpbHRlciBmb3IgcmVjZWl2aW5nICovCisJdTggUmVndWxhdG9yeUNsYXNzOwogCi0gICAgUE5FVF9ERVYgICAgICAgICAgICAgICAgICAgCQkJTVNTSUREZXY7CisJY2hhciBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CS8qIE5PVCBOVUxMLXRlcm1pbmF0ZWQgKi8KKwl1OCBTc2lkTGVuOwkJLyogdGhlIGFjdHVhbCBzc2lkIGxlbmd0aCBpbiB1c2VkICovCisJdTggTGFzdFNzaWRMZW47CS8qIHRoZSBhY3R1YWwgc3NpZCBsZW5ndGggaW4gdXNlZCAqLworCWNoYXIgTGFzdFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsJLyogTk9UIE5VTEwtdGVybWluYXRlZCAqLworCXU4IExhc3RCc3NpZFtNQUNfQUREUl9MRU5dOwogCi0JTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGU7Ci0JTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOwotCU5ESVNfODAyXzExX1dFUF9TVEFUVVMJCQkJR3JvdXBLZXlXZXBTdGF0dXM7Ci0JV1BBX01JWF9QQUlSX0NJUEhFUgkJCQkJV3BhTWl4UGFpckNpcGhlcjsKKwl1OCBCc3NpZFtNQUNfQUREUl9MRU5dOworCXUxNiBCZWFjb25QZXJpb2Q7CisJdTggQ2hhbm5lbDsKKwl1OCBDZW50cmFsQ2hhbm5lbDsJLyogQ2VudHJhbCBDaGFubmVsIHdoZW4gdXNpbmcgNDBNSHogaXMgaW5kaWNhdGluZy4gbm90IHJlYWwgY2hhbm5lbC4gKi8KIAotCVVMT05HCQkJCQkJCQlUeENvdW50OwotCVVMT05HCQkJCQkJCQlSeENvdW50OwotCVVMT05HCQkJCQkJCQlSZWNlaXZlZEJ5dGVDb3VudDsKLQlVTE9ORwkJCQkJCQkJVHJhbnNtaXR0ZWRCeXRlQ291bnQ7Ci0JVUxPTkcJCQkJCQkJCVJ4RXJyb3JDb3VudDsKLQlVTE9ORwkJCQkJCQkJUnhEcm9wQ291bnQ7CisJdTggU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJdTggU3VwUmF0ZUxlbjsKKwl1OCBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwl1OCBFeHRSYXRlTGVuOworCXU4IERlc2lyZVJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwkvKiBPSURfODAyXzExX0RFU0lSRURfUkFURVMgKi8KKwl1OCBNYXhEZXNpcmVkUmF0ZTsKKwl1OCBFeHBlY3RlZEFDS1JhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwogCi0JSFRUUkFOU01JVF9TRVRUSU5HCQkJCQlIVFBoeU1vZGUsIE1heEhUUGh5TW9kZSwgTWluSFRQaHlNb2RlOy8vIEZvciB0cmFuc21pdCBwaHkgc2V0dGluZyBpbiBUWFdJLgotCVJUX0hUX1BIWV9JTkZPCQkJCQkJRGVzaXJlZEh0UGh5SW5mbzsKLQlERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcgICAgICAgIAlEZXNpcmVkVHJhbnNtaXRTZXR0aW5nOyAvLyBEZXNpcmVkIHRyYW5zbWl0IHNldHRpbmcuIHRoaXMgaXMgZm9yIHJlYWRpbmcgcmVnaXN0cnkgc2V0dGluZyBvbmx5LiBub3QgdXNlZnVsLgotCUJPT0xFQU4JCQkJCQkJCWJBdXRvVHhSYXRlU3dpdGNoOworCXVuc2lnbmVkIGxvbmcgQmFzaWNSYXRlQml0bWFwOwkvKiBiYWNrdXAgYmFzaWMgcmF0ZWJpdG1hcCAqLwogCi0JVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdEtleUlkOworCUJPT0xFQU4gYkFQU0RDYXBhYmxlOworCUJPT0xFQU4gYkluU2VydmljZVBlcmlvZDsKKwlCT09MRUFOIGJBUFNEQUNfQkU7CisJQk9PTEVBTiBiQVBTREFDX0JLOworCUJPT0xFQU4gYkFQU0RBQ19WSTsKKwlCT09MRUFOIGJBUFNEQUNfVk87CiAKLQlVQ0hBUgkJCQkJCQkJVHhSYXRlOyAgICAgICAvLyBSQVRFXzEsIFJBVEVfMiwgUkFURV81XzUsIFJBVEVfMTEsIC4uLgotCVVDSEFSICAgICAJCQkJCQkJRGVzaXJlZFJhdGVzW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsvLyBPSURfODAyXzExX0RFU0lSRURfUkFURVMKLQlVQ0hBUgkJCQkJCQkJRGVzaXJlZFJhdGVzSW5kZXg7Ci0JVUNIQVIgICAgIAkJCQkJCQlNYXhUeFJhdGU7ICAgICAgICAgICAgLy8gUkFURV8xLCBSQVRFXzIsIFJBVEVfNV81LCBSQVRFXzExCisJLyogYmVjYXVzZSBUU1BFQyBjYW4gbW9kaWZ5IHRoZSBBUFNEIGZsYWcsIHdlIG5lZWQgdG8ga2VlcCB0aGUgQVBTRCBmbGFnCisJICAgcmVxdWVzdGVkIGluIGFzc29jaWF0aW9uIHN0YWdlIGZyb20gdGhlIHN0YXRpb247CisJICAgd2UgbmVlZCB0byByZWNvdmVyIHRoZSBBUFNEIGZsYWcgYWZ0ZXIgdGhlIFRTUEVDIGlzIGRlbGV0ZWQuICovCisJQk9PTEVBTiBiQUNNQVBTREJhY2t1cFs0XTsJLyogZm9yIGRlbGl2ZXJ5LWVuYWJsZWQgJiB0cmlnZ2VyLWVuYWJsZWQgYm90aCAqLworCUJPT0xFQU4gYkFDTUFQU0RUcls0XTsJLyogbm8gdXNlICovCiAKLQlVQ0hBUgkJCQkJCQkJVGltQml0bWFwc1tXTEFOX01BWF9OVU1fT0ZfVElNXTsKKwlCT09MRUFOIGJOZWVkU2VuZFRyaWdnZXJGcmFtZTsKKwlCT09MRUFOIGJBUFNERm9yY2VQb3dlclNhdmU7CS8qIEZvcmNlIHBvd2VyIHNhdmUgbW9kZSwgc2hvdWxkIG9ubHkgdXNlIGluIEFQU0QtU1RBVVQgKi8KKwl1bnNpZ25lZCBsb25nIFRyaWdnZXJUaW1lckNvdW50OworCXU4IE1heFNQTGVuZ3RoOworCXU4IEJCUEN1cnJlbnRCVzsJLyogQldfMTAsICAgICAgIEJXXzIwLCBCV180MCAqLworCS8qIG1vdmUgdG8gTVVMVElTU0lEX1NUUlVDVCBmb3IgTUJTUyAqLworCS8qSFRUUkFOU01JVF9TRVRUSU5HICAgIEhUUGh5TW9kZSwgTWF4SFRQaHlNb2RlLCBNaW5IVFBoeU1vZGU7Ly8gRm9yIHRyYW5zbWl0IHBoeSBzZXR0aW5nIGluIFRYV0kuICovCisJUkVHX1RSQU5TTUlUX1NFVFRJTkcgUmVnVHJhbnNtaXRTZXR0aW5nOwkvKnJlZ2lzdHJ5IHRyYW5zbWl0IHNldHRpbmcuIHRoaXMgaXMgZm9yIHJlYWRpbmcgcmVnaXN0cnkgc2V0dGluZyBvbmx5LiBub3QgdXNlZnVsLiAqLworCS8qdTggICAgICAgRml4ZWRUeE1vZGU7ICAgICAgICAgICAgICAvLyBGaXhlZCBUeCBNb2RlIChDQ0ssIE9GRE0pLCBmb3IgSFQgZml4ZWQgdHggbW9kZSAoR0YsIE1JWCkgLCByZWZlciB0byBSZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNb2RlICovCisJdTggVHhSYXRlOwkJLyogU2FtZSB2YWx1ZSB0byBmaWxsIGluIFRYRC4gVHhSYXRlIGlzIDYtYml0ICovCisJdTggTWF4VHhSYXRlOwkvKiBSQVRFXzEsIFJBVEVfMiwgUkFURV81XzUsIFJBVEVfMTEgKi8KKwl1OCBUeFJhdGVJbmRleDsJLyogVHggcmF0ZSBpbmRleCBpbiBSYXRlU3dpdGNoVGFibGUgKi8KKwl1OCBUeFJhdGVUYWJsZVNpemU7CS8qIFZhbGlkIFR4IHJhdGUgdGFibGUgc2l6ZSBpbiBSYXRlU3dpdGNoVGFibGUgKi8KKwkvKkJPT0xFQU4gICAgICAgICAgICAgICBiQXV0b1R4UmF0ZVN3aXRjaDsgKi8KKwl1OCBNaW5UeFJhdGU7CS8qIFJBVEVfMSwgUkFURV8yLCBSQVRFXzVfNSwgUkFURV8xMSAqLworCXU4IFJ0c1JhdGU7CQkvKiBSQVRFX3h4eCAqLworCUhUVFJBTlNNSVRfU0VUVElORyBNbG1lVHJhbnNtaXQ7CS8qIE1HTVQgZnJhbWUgUEhZIHJhdGUgc2V0dGluZyB3aGVuIG9wZXJhdGluIGF0IEh0IHJhdGUuICovCisJdTggTWxtZVJhdGU7CQkvKiBSQVRFX3h4eCwgdXNlZCB0byBzZW5kIE1MTUUgZnJhbWVzICovCisJdTggQmFzaWNNbG1lUmF0ZTsJLyogRGVmYXVsdCBSYXRlIGZvciBzZW5kaW5nIE1MTUUgZnJhbWVzICovCiAKLSAgICAvLyBXUEEKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTUtbMzJdOwotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNS1szMl07Ci0JVUNIQVIJCQkJCQkJCUdUS1szMl07Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjFYOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZUF1dGg7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR05vbmNlWzMyXTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0U2VjdXJlZDsKLSAgICBORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUiAgICAgICAgICBQcml2YWN5RmlsdGVyOwotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBTkNsYXNzM0RhdGE7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNvbGF0ZUludGVyU3RhVHJhZmZpYzsKKwl1MTYgUnRzVGhyZXNob2xkOwkvKiBpbiB1bml0IG9mIEJZVEUgKi8KKwl1MTYgRnJhZ21lbnRUaHJlc2hvbGQ7CS8qIGluIHVuaXQgb2YgQllURSAqLwogCi0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNOSUVfTGVuWzJdOwotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTTl9JRVsyXVtNQVhfTEVOX09GX1JTTklFXTsKKwl1OCBUeFBvd2VyOwkJLyogaW4gdW5pdCBvZiBtVyAqLworCXVuc2lnbmVkIGxvbmcgVHhQb3dlclBlcmNlbnRhZ2U7CS8qIDB+MTAwICUgKi8KKwl1bnNpZ25lZCBsb25nIFR4UG93ZXJEZWZhdWx0OwkvKiBrZWVwIGZvciBUeFBvd2VyUGVyY2VudGFnZSAqLworCXU4IFB3ckNvbnN0cmFpbnQ7CiAKKwlCQUNBUF9TVFJVQyBCQUNhcGFiaWxpdHk7CS8qICAgTk8gVVNFID0gMFhGRiAgOyAgSU1NRURfQkEgPTEgIDsgIERFTEFZX0JBPTAgKi8KKwlCQUNBUF9TVFJVQyBSRUdCQUNhcGFiaWxpdHk7CS8qICAgTk8gVVNFID0gMFhGRiAgOyAgSU1NRURfQkEgPTEgIDsgIERFTEFZX0JBPTAgKi8KIAotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgIAkJCVRpbUlFTG9jYXRpb25JbkJlYWNvbjsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAJCQlDYXBhYmlsaXR5SW5mb0xvY2F0aW9uSW5CZWFjb247Ci0gICAgLy8gb3V0Z29pbmcgQkVBQ09OIGZyYW1lIGJ1ZmZlciBhbmQgY29ycmVzcG9uZGluZyBUWFdJCi0JLy8gUFRYV0lfU1RSVUMgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWFjb25UeFdJOyAvLwotICAgIENIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlYWNvbkJ1ZltNQVhfQkVBQ09OX1NJWkVdOyAvLyBOT1RFOiBCZWFjb25CdWYgc2hvdWxkIGJlIDQtYnl0ZSBhbGlnbmVkCisJc3RydWN0IHJ0X2lvdCBJT1Rlc3RQYXJtOwkvKiA4MDIuMTFuIEludGVyT3BiaWxpdHkgVGVzdCBQYXJhbWV0ZXI7ICovCisJdW5zaWduZWQgbG9uZyBUeFByZWFtYmxlOwkvKiBSdDgwMl8xMVByZWFtYmxlTG9uZywgUnQ4MDJfMTFQcmVhbWJsZVNob3J0LCBSdDgwMl8xMVByZWFtYmxlQXV0byAqLworCUJPT0xFQU4gYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudDsJLyogTWljcm9zb2Z0IHVzZSAwIGFzIGRpc2FibGUgKi8KKwl1bnNpZ25lZCBsb25nIFVzZUJHUHJvdGVjdGlvbjsJLyogMDogYXV0bywgMTogYWx3YXlzIHVzZSwgMjogYWx3YXlzIG5vdCB1c2UgKi8KKwlCT09MRUFOIGJVc2VTaG9ydFNsb3RUaW1lOwkvKiAwOiBkaXNhYmxlLCAxIC0gdXNlIHNob3J0IHNsb3QgKDl1cykgKi8KKwlCT09MRUFOIGJFbmFibGVUeEJ1cnN0OwkvKiAxOiBlbmJsZSBUWCBQQUNLRVQgQlVSU1QgKHdoZW4gQkEgaXMgZXN0YWJsaXNoZWQgb3IgQVAgaXMgbm90IGEgbGVnYWN5IFdNTSBBUCksIDA6IGRpc2FibGUgVFggUEFDS0VUIEJVUlNUICovCisJQk9PTEVBTiBiQWdncmVnYXRpb25DYXBhYmxlOwkvKiAxOiBlbmFibGUgVFggYWdncmVnYXRpb24gd2hlbiB0aGUgcGVlciBzdXBwb3J0cyBpdCAqLworCUJPT0xFQU4gYlBpZ2d5QmFja0NhcGFibGU7CS8qIDE6IGVuYWJsZSBUWCBwaWdneS1iYWNrIGFjY29yZGluZyBNQUMncyB2ZXJzaW9uICovCisJQk9PTEVBTiBiSUVFRTgwMjExSDsJLyogMTogZW5hYmxlIElFRUU4MDIuMTFoIHNwZWMuICovCisJdW5zaWduZWQgbG9uZyBEaXNhYmxlT0xCQ0RldGVjdDsJLyogMDogZW5hYmxlIE9MQkMgZGV0ZWN0OyAxIGRpc2FibGUgT0xCQyBkZXRlY3QgKi8KIAotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJIaWRlU3NpZDsKLQlVSU5UMTYJCQkJCQkJCVN0YXRpb25LZWVwQWxpdmVUaW1lOyAvLyB1bml0OiBzZWNvbmQKKwlCT09MRUFOIGJSZGc7CiAKLSAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWTEFOX1ZJRDsKLSAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWTEFOX1ByaW9yaXR5OworCUJPT0xFQU4gYldtbUNhcGFibGU7CS8qIDA6ZGlzYWJsZSBXTU0sIDE6ZW5hYmxlIFdNTSAqLworCXN0cnVjdCBydF9xb3NfY2FwYWJpbGl0eV9wYXJtIEFQUW9zQ2FwYWJpbGl0eTsJLyogUU9TIGNhcGFiaWxpdHkgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCAqLworCXN0cnVjdCBydF9lZGNhX3Bhcm0gQVBFZGNhUGFybTsJLyogRURDQSBwYXJhbWV0ZXJzIG9mIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAgKi8KKwlzdHJ1Y3QgcnRfcWJzc19sb2FkX3Bhcm0gQVBRYnNzTG9hZDsJLyogUUJTUyBsb2FkIG9mIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAgKi8KKwl1OCBBY2tQb2xpY3lbNF07CS8qIEFDSyBwb2xpY3kgb2YgdGhlIHNwZWNpZmllZCBBQy4gc2VlIEFDS194eHggKi8KKwlCT09MRUFOIGJETFNDYXBhYmxlOwkvKiAwOmRpc2FibGUgRExTLCAxOmVuYWJsZSBETFMgKi8KKwkvKiBhIGJpdG1hcCBvZiBCT09MRUFOIGZsYWdzLiBlYWNoIGJpdCByZXByZXNlbnQgYW4gb3BlcmF0aW9uIHN0YXR1cyBvZiBhIHBhcnRpY3VsYXIgKi8KKwkvKiBCT09MRUFOIGNvbnRyb2wsIGVpdGhlciBPTiBvciBPRkYuIFRoZXNlIGZsYWdzIHNob3VsZCBhbHdheXMgYmUgYWNjZXNzZWQgdmlhICovCisJLyogT1BTVEFUVVNfVEVTVF9GTEFHKCksIE9QU1RBVFVTX1NFVF9GTEFHKCksIE9QX1NUQVRVU19DTEVBUl9GTEFHKCkgbWFjcm9zLiAqLworCS8qIHNlZSBmT1BfU1RBVFVTX3h4eCBpbiBSVE1QX0RFRi5DIGZvciBkZXRhaWwgYml0IGRlZmluaXRpb24gKi8KKwl1bnNpZ25lZCBsb25nIE9wU3RhdHVzRmxhZ3M7CiAKLSAgICBSVF84MDJfMTFfQUNMCQkJCQkJQWNjZXNzQ29udHJvbExpc3Q7CisJQk9PTEVBTiBOZGlzUmFkaW9TdGF0ZU9mZjsJLypGb3IgSENUIDEyLjAsIHNldCB0aGlzIGZsYWcgdG8gVFJVRSBpbnN0ZWFkIG9mIGNhbGxlZCBNbG1lUmFkaW9PZmYuICovCisJQUJHQkFORF9TVEFURSBCYW5kU3RhdGU7CS8qIEZvciBzZXR0aW5nIEJCUCB1c2VkIG9uIEIvRyBvciBBIG1vZGUuICovCiAKLQkvLyBFRENBIFFvcwotICAgIEJPT0xFQU4JCQkJCQkJCWJXbW1DYXBhYmxlOwkvLyAwOmRpc2FibGUgV01NLCAxOmVuYWJsZSBXTU0KLSAgICBCT09MRUFOCQkJCQkJCQliRExTQ2FwYWJsZTsJLy8gMDpkaXNhYmxlIERMUywgMTplbmFibGUgRExTCisJLyogSUVFRTgwMi4xMUgtLURGUy4gKi8KKwlzdHJ1Y3QgcnRfcmFkYXJfZGV0ZWN0IFJhZGFyRGV0ZWN0OwogCi0JVUNIQVIgICAgICAgICAgIAkJCQkJRGxzUFRLWzY0XTsJCS8vIER1ZSB0byB3aW5kb3dzIGRpcnZlciBjb3VudCBvbiBtZWV0aW5naG91c2UgdG8gaGFuZGxlIDQtd2F5IHNoYWtlCisJLyogSFQgKi8KKwl1OCBCQVNpemU7CQkvKiBVU2VyIGRlc2lyZWQgQkFXaW5kb3dTaXplLiBTaG91bGQgbm90IGV4Y2VlZCBvdXIgbWF4IGNhcGFiaWxpdHkgKi8KKwkvKnN0cnVjdCBydF9odF9jYXBhYmlsaXR5ICAgICAgU3VwcG9ydGVkSHRQaHk7ICovCisJc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHkgRGVzaXJlZEh0UGh5OworCXN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llIEh0Q2FwYWJpbGl0eTsKKwlzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUgQWRkSFRJbmZvOwkvKiBVc2VmdWwgYXMgQVAuICovCisJLypUaGlzIElFIGlzIHVzZWQgd2l0aCBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgZWxlbWVudCB3aGVuIGNoYW5naW5nIHRvIGEgbmV3IDQwTUh6LiAqLworCS8qVGhpcyBJRSBpcyBpbmNsdWRlZCBpbiBjaGFubmVsIHN3aXRjaCBhbW1vdW5jZW1lbnQgZnJhbWVzIDcuNC4xLjUsIGJlYWNvbnMsIHByb2JlIFJzcC4gKi8KKwlzdHJ1Y3QgcnRfbmV3X2V4dF9jaGFuX2llIE5ld0V4dENoYW5PZmZzZXQ7CS8qNy4zLjIuMjBBLCAxIGlmIGV4dGVuc2lvbiBjaGFubmVsIGlzIGFib3ZlIHRoZSBjb250cm9sIGNoYW5uZWwsIDMgaWYgYmVsb3csIDAgaWYgbm90IHByZXNlbnQgKi8KIAotCS8vIEZvciA4MDIuMXggZGFlbW9uIHNldHRpbmcgcGVyIEJTUwotCVVDSEFSCQkJCQkJCQlyYWRpdXNfc3J2X251bTsKLQlSQURJVVNfU1JWX0lORk8JCQkJCQlyYWRpdXNfc3J2X2luZm9bTUFYX1JBRElVU19TUlZfTlVNXTsKKwlCT09MRUFOIGJIVFByb3RlY3Q7CisJQk9PTEVBTiBiTUlNT1BTRW5hYmxlOworCUJPT0xFQU4gYkJBRGVjbGluZTsKKy8qMjAwOC8xMS8wNTogS0ggYWRkIHRvIHN1cHBvcnQgQW50ZW5uYSBwb3dlci1zYXZpbmcgb2YgQVA8LS0gKi8KKwlCT09MRUFOIGJHcmVlbkFQRW5hYmxlOworLyoyMDA4LzExLzA1OiBLSCBhZGQgdG8gc3VwcG9ydCBBbnRlbm5hIHBvd2VyLXNhdmluZyBvZiBBUC0tPiAqLworCUJPT0xFQU4gYkRpc2FibGVSZW9yZGVyaW5nOworCUJPT0xFQU4gYkZvcnR5X01oel9JbnRvbGVyYW50OworCUJPT0xFQU4gYkV4dENoYW5uZWxTd2l0Y2hBbm5vdW5jZW1lbnQ7CisJQk9PTEVBTiBiUmN2QlNTV2lkdGhUcmlnZ2VyRXZlbnRzOworCXVuc2lnbmVkIGxvbmcgTGFzdFJjdkJTU1dpZHRoVHJpZ2dlckV2ZW50c1RpbWU7CiAKLSNpZmRlZiBSVEw4NjVYX1NPQwotCXVuc2lnbmVkIGludAkJCQkJCW15bGlua2lkOworCXU4IFR4QkFTaXplOworCisJLyogRW5hYmxlIHdpcmVsZXNzIGV2ZW50ICovCisJQk9PTEVBTiBiV2lyZWxlc3NFdmVudDsKKwlCT09MRUFOIGJXaUZpVGVzdDsJLyogRW5hYmxlIHRoaXMgcGFyYW1ldGVyIGZvciBXaUZpIHRlc3QgKi8KKworCS8qIFR4ICYgUnggU3RyZWFtIG51bWJlciBzZWxlY3Rpb24gKi8KKwl1OCBUeFN0cmVhbTsKKwl1OCBSeFN0cmVhbTsKKworCUJPT0xFQU4gYkhhcmR3YXJlUmFkaW87CS8qIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gZW5hYmxlZCAqLworCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJQk9PTEVBTiBiTXVsdGlwbGVJUlA7CS8qIE11bHRpcGxlIEJ1bGsgSU4gZmxhZyAqLworCXU4IE51bU9mQnVsa0luSVJQOwkvKiBpZiBiTXVsdGlwbGVJUlAgPT0gVFJVRSwgTnVtT2ZCdWxrSW5JUlAgd2lsbCBiZSA0IG90aGVyd2lzZSBiZSAxICovCisJc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHkgU3VwcG9ydGVkSHRQaHk7CisJdW5zaWduZWQgbG9uZyBNYXhQa3RPbmVUeEJ1bGs7CisJdTggVHhCdWxrRmFjdG9yOworCXU4IFJ4QnVsa0ZhY3RvcjsKKworCUJPT0xFQU4gSXNVcGRhdGVCZWFjb247CisJc3RydWN0IHJ0X2JlYWNvbl9zeW5jICpwQmVhY29uU3luYzsKKwlzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyIEJlYWNvblVwZGF0ZVRpbWVyOworCXUzMiBCZWFjb25BZGp1c3Q7CisJdTMyIEJlYWNvbkZhY3RvcjsKKwl1MzIgQmVhY29uUmVtYWluOworI2VuZGlmCQkJCS8qIFJUTVBfTUFDX1VTQiAvLyAqLworCisJc3BpbmxvY2tfdCBNZWFzdXJlUmVxVGFiTG9jazsKKwlzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfdGFiICpwTWVhc3VyZVJlcVRhYjsKKworCXNwaW5sb2NrX3QgVHBjUmVxVGFiTG9jazsKKwlzdHJ1Y3QgcnRfdHBjX3JlcV90YWIgKnBUcGNSZXFUYWI7CisKKwlCT09MRUFOIFBTUFhsaW5rOwkvKiAwOiBEaXNhYmxlLiAxOiBFbmFibGUgKi8KKworI2lmIGRlZmluZWQoUlQzMDV4KXx8ZGVmaW5lZChSVDMweHgpCisJLyogcmVxdWVzdCBieSBHYXJ5LCBmb3IgSGlnaCBQb3dlciBpc3N1ZSAqLworCXU4IEhpZ2hQb3dlclBhdGNoRGlzYWJsZWQ7CiAjZW5kaWYKIAotCi0JVUlOVDMyCQkJCQlSY3ZkQ29uZmxpY3RTc2lkQ291bnQ7Ci0JVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZEFzc29jUmVzcENvdW50OwotCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWRSZWFzc29jUmVzcENvdW50OwotCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWRQcm9iZVJlc3BDb3VudDsKLQlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkQmVhY29uQ291bnQ7Ci0JVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZERpc2Fzc29jQ291bnQ7Ci0JVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZEF1dGhDb3VudDsKLQlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkRGVhdXRoQ291bnQ7Ci0JVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZFVua25vd25NZ210Q291bnQ7Ci0JVUlOVDMyCQkJCQlSY3ZkUmVwbGF5QXR0YWNrQ291bnQ7Ci0KLQlDSEFSCQkJCQlSc3NpT2ZSY3ZkQ29uZmxpY3RTc2lkOwotCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkQXNzb2NSZXNwOwotCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkUmVhc3NvY1Jlc3A7Ci0JQ0hBUgkJCQkJUnNzaU9mUmN2ZFNwb29mZWRQcm9iZVJlc3A7Ci0JQ0hBUgkJCQkJUnNzaU9mUmN2ZFNwb29mZWRCZWFjb247Ci0JQ0hBUgkJCQkJUnNzaU9mUmN2ZFNwb29mZWREaXNhc3NvYzsKLQlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZEF1dGg7Ci0JQ0hBUgkJCQkJUnNzaU9mUmN2ZFNwb29mZWREZWF1dGg7Ci0JQ0hBUgkJCQkJUnNzaU9mUmN2ZFNwb29mZWRVbmtub3duTWdtdDsKLQlDSEFSCQkJCQlSc3NpT2ZSY3ZkUmVwbGF5QXR0YWNrOwotCi0JQk9PTEVBTgkJCQkJYkJjblNudFJlcTsKLQlVQ0hBUgkJCQkJQmNuQnVmSWR4OwotfSBNVUxUSVNTSURfU1RSVUNULCAqUE1VTFRJU1NJRF9TVFJVQ1Q7Ci0KLS8vIGNvbmZpZ3VyYXRpb24gY29tbW9uIHRvIE9QTU9ERV9BUCBhcyB3ZWxsIGFzIE9QTU9ERV9TVEEKLXR5cGVkZWYgc3RydWN0IF9DT01NT05fQ09ORklHIHsKLQotCUJPT0xFQU4JCWJDb3VudHJ5RmxhZzsKLQlVQ0hBUgkJQ291bnRyeUNvZGVbM107Ci0JVUNIQVIJCUdlb2dyYXBoeTsKLQlVQ0hBUiAgICAgICBDb3VudHJ5UmVnaW9uOyAgICAgIC8vIEVudW0gb2YgY291bnRyeSByZWdpb24sIDA6RkNDLCAxOklDLCAyOkVUU0ksIDM6U1BBSU4sIDQ6RnJhbmNlLCA1Ok1LSywgNjpNS0sxLCA3OklzcmFlbAotCVVDSEFSICAgICAgIENvdW50cnlSZWdpb25Gb3JBQmFuZDsJLy8gRW51bSBvZiBjb3VudHJ5IHJlZ2lvbiBmb3IgQSBiYW5kCi0JVUNIQVIgICAgICAgUGh5TW9kZTsgICAgICAgICAgICAvLyBQSFlfMTFBLCBQSFlfMTFCLCBQSFlfMTFCR19NSVhFRCwgUEhZX0FCR19NSVhFRAotCVVTSE9SVCAgICAgIERzaWZzOyAgICAgICAgICAgICAgLy8gaW4gdW5pdHMgb2YgdXNlYwotCVVMT05HICAgICAgIFBhY2tldEZpbHRlcjsgICAgICAgLy8gUGFja2V0IGZpbHRlciBmb3IgcmVjZWl2aW5nCi0KLQlDSEFSICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07IC8vIE5PVCBOVUxMLXRlcm1pbmF0ZWQKLQlVQ0hBUiAgICAgICBTc2lkTGVuOyAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgc3NpZCBsZW5ndGggaW4gdXNlZAotCVVDSEFSICAgICAgIExhc3RTc2lkTGVuOyAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgc3NpZCBsZW5ndGggaW4gdXNlZAotCUNIQVIgICAgICAgIExhc3RTc2lkW01BWF9MRU5fT0ZfU1NJRF07IC8vIE5PVCBOVUxMLXRlcm1pbmF0ZWQKLQlVQ0hBUgkJTGFzdEJzc2lkW01BQ19BRERSX0xFTl07Ci0KLQlVQ0hBUiAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dOwotCVVTSE9SVCAgICAgIEJlYWNvblBlcmlvZDsKLQlVQ0hBUiAgICAgICBDaGFubmVsOwotCVVDSEFSICAgICAgIENlbnRyYWxDaGFubmVsOyAgICAJLy8gQ2VudHJhbCBDaGFubmVsIHdoZW4gdXNpbmcgNDBNSHogaXMgaW5kaWNhdGluZy4gbm90IHJlYWwgY2hhbm5lbC4KLQotCVVDSEFSICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwotCVVDSEFSICAgICAgIFN1cFJhdGVMZW47Ci0JVUNIQVIgICAgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ci0JVUNIQVIgICAgICAgRXh0UmF0ZUxlbjsKLQlVQ0hBUiAgICAgICBEZXNpcmVSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsgICAgICAvLyBPSURfODAyXzExX0RFU0lSRURfUkFURVMKLQlVQ0hBUiAgICAgICBNYXhEZXNpcmVkUmF0ZTsKLQlVQ0hBUiAgICAgICBFeHBlY3RlZEFDS1JhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwotCi0JVUxPTkcgICAgICAgQmFzaWNSYXRlQml0bWFwOyAgICAgICAgLy8gYmFja3VwIGJhc2ljIHJhdGViaXRtYXAKLQotCUJPT0xFQU4JCWJBUFNEQ2FwYWJsZTsKLQlCT09MRUFOCQliSW5TZXJ2aWNlUGVyaW9kOwotCUJPT0xFQU4JCWJBUFNEQUNfQkU7Ci0JQk9PTEVBTgkJYkFQU0RBQ19CSzsKLQlCT09MRUFOCQliQVBTREFDX1ZJOwotCUJPT0xFQU4JCWJBUFNEQUNfVk87Ci0JQk9PTEVBTgkJYk5lZWRTZW5kVHJpZ2dlckZyYW1lOwotCUJPT0xFQU4JCWJBUFNERm9yY2VQb3dlclNhdmU7CS8vIEZvcmNlIHBvd2VyIHNhdmUgbW9kZSwgc2hvdWxkIG9ubHkgdXNlIGluIEFQU0QtU1RBVVQKLQlVTE9ORwkJVHJpZ2dlclRpbWVyQ291bnQ7Ci0JVUNIQVIJCU1heFNQTGVuZ3RoOwotCVVDSEFSCQlCQlBDdXJyZW50Qlc7CS8vIEJXXzEwLCAJQldfMjAsIEJXXzQwCi0JUkVHX1RSQU5TTUlUX1NFVFRJTkcgICAgICAgIFJlZ1RyYW5zbWl0U2V0dGluZzsgLy9yZWdpc3RyeSB0cmFuc21pdCBzZXR0aW5nLiB0aGlzIGlzIGZvciByZWFkaW5nIHJlZ2lzdHJ5IHNldHRpbmcgb25seS4gbm90IHVzZWZ1bC4KLQlVQ0hBUiAgICAgICBUeFJhdGU7ICAgICAgICAgICAgICAgICAvLyBTYW1lIHZhbHVlIHRvIGZpbGwgaW4gVFhELiBUeFJhdGUgaXMgNi1iaXQKLQlVQ0hBUiAgICAgICBNYXhUeFJhdGU7ICAgICAgICAgICAgICAvLyBSQVRFXzEsIFJBVEVfMiwgUkFURV81XzUsIFJBVEVfMTEKLQlVQ0hBUiAgICAgICBUeFJhdGVJbmRleDsgICAgICAgICAgICAvLyBUeCByYXRlIGluZGV4IGluIFJhdGVTd2l0Y2hUYWJsZQotCVVDSEFSICAgICAgIFR4UmF0ZVRhYmxlU2l6ZTsgICAgICAgIC8vIFZhbGlkIFR4IHJhdGUgdGFibGUgc2l6ZSBpbiBSYXRlU3dpdGNoVGFibGUKLQlVQ0hBUiAgICAgICBNaW5UeFJhdGU7ICAgICAgICAgICAgICAvLyBSQVRFXzEsIFJBVEVfMiwgUkFURV81XzUsIFJBVEVfMTEKLQlVQ0hBUiAgICAgICBSdHNSYXRlOyAgICAgICAgICAgICAgICAvLyBSQVRFX3h4eAotCUhUVFJBTlNNSVRfU0VUVElORwlNbG1lVHJhbnNtaXQ7ICAgLy8gTUdNVCBmcmFtZSBQSFkgcmF0ZSBzZXR0aW5nIHdoZW4gb3BlcmF0aW4gYXQgSHQgcmF0ZS4KLQlVQ0hBUiAgICAgICBNbG1lUmF0ZTsgICAgICAgICAgICAgICAvLyBSQVRFX3h4eCwgdXNlZCB0byBzZW5kIE1MTUUgZnJhbWVzCi0JVUNIQVIgICAgICAgQmFzaWNNbG1lUmF0ZTsgICAgICAgICAgLy8gRGVmYXVsdCBSYXRlIGZvciBzZW5kaW5nIE1MTUUgZnJhbWVzCi0KLQlVU0hPUlQgICAgICBSdHNUaHJlc2hvbGQ7ICAgICAgICAgICAvLyBpbiB1bml0IG9mIEJZVEUKLQlVU0hPUlQgICAgICBGcmFnbWVudFRocmVzaG9sZDsgICAgICAvLyBpbiB1bml0IG9mIEJZVEUKLQotCVVDSEFSICAgICAgIFR4UG93ZXI7ICAgICAgICAgICAgICAgIC8vIGluIHVuaXQgb2YgbVcKLQlVTE9ORyAgICAgICBUeFBvd2VyUGVyY2VudGFnZTsgICAgICAvLyAwfjEwMCAlCi0JVUxPTkcgICAgICAgVHhQb3dlckRlZmF1bHQ7ICAgICAgICAgLy8ga2VlcCBmb3IgVHhQb3dlclBlcmNlbnRhZ2UKLQotCUJBQ0FQX1NUUlVDICAgICAgICBCQUNhcGFiaWxpdHk7IC8vICAgTk8gVVNFID0gMFhGRiAgOyAgSU1NRURfQkEgPTEgIDsgIERFTEFZX0JBPTAKLQlCQUNBUF9TVFJVQyAgICAgICAgUkVHQkFDYXBhYmlsaXR5OyAvLyAgIE5PIFVTRSA9IDBYRkYgIDsgIElNTUVEX0JBID0xICA7ICBERUxBWV9CQT0wCi0KLQlJT1RfU1RSVUMJCUlPVGVzdFBhcm07CS8vIDgwMi4xMW4gSW50ZXJPcGJpbGl0eSBUZXN0IFBhcmFtZXRlcjsKLQlVTE9ORyAgICAgICBUeFByZWFtYmxlOyAgICAgICAgICAgICAvLyBSdDgwMl8xMVByZWFtYmxlTG9uZywgUnQ4MDJfMTFQcmVhbWJsZVNob3J0LCBSdDgwMl8xMVByZWFtYmxlQXV0bwotCUJPT0xFQU4gICAgIGJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQ7ICAgICAvLyBNaWNyb3NvZnQgdXNlIDAgYXMgZGlzYWJsZQotCVVMT05HICAgICAgIFVzZUJHUHJvdGVjdGlvbjsgICAgICAgIC8vIDA6IGF1dG8sIDE6IGFsd2F5cyB1c2UsIDI6IGFsd2F5cyBub3QgdXNlCi0JQk9PTEVBTiAgICAgYlVzZVNob3J0U2xvdFRpbWU7ICAgICAgLy8gMDogZGlzYWJsZSwgMSAtIHVzZSBzaG9ydCBzbG90ICg5dXMpCi0JQk9PTEVBTiAgICAgYkVuYWJsZVR4QnVyc3Q7ICAgICAgICAgLy8gMTogZW5ibGUgVFggUEFDS0VUIEJVUlNULCAwOiBkaXNhYmxlIFRYIFBBQ0tFVCBCVVJTVAotCUJPT0xFQU4gICAgIGJBZ2dyZWdhdGlvbkNhcGFibGU7ICAgICAgLy8gMTogZW5hYmxlIFRYIGFnZ3JlZ2F0aW9uIHdoZW4gdGhlIHBlZXIgc3VwcG9ydHMgaXQKLQlCT09MRUFOICAgICBiUGlnZ3lCYWNrQ2FwYWJsZTsJCS8vIDE6IGVuYWJsZSBUWCBwaWdneS1iYWNrIGFjY29yZGluZyBNQUMncyB2ZXJzaW9uCi0JQk9PTEVBTiAgICAgYklFRUU4MDIxMUg7CQkJLy8gMTogZW5hYmxlIElFRUU4MDIuMTFoIHNwZWMuCi0JVUxPTkcJCURpc2FibGVPTEJDRGV0ZWN0OwkJLy8gMDogZW5hYmxlIE9MQkMgZGV0ZWN0OyAxIGRpc2FibGUgT0xCQyBkZXRlY3QKLQotCUJPT0xFQU4JCQkJYlJkZzsKLQotCUJPT0xFQU4gICAgICAgICAgICAgYldtbUNhcGFibGU7ICAgICAgICAvLyAwOmRpc2FibGUgV01NLCAxOmVuYWJsZSBXTU0KLQlRT1NfQ0FQQUJJTElUWV9QQVJNIEFQUW9zQ2FwYWJpbGl0eTsgICAgLy8gUU9TIGNhcGFiaWxpdHkgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAotCUVEQ0FfUEFSTSAgICAgICAgICAgQVBFZGNhUGFybTsgICAgICAgICAvLyBFRENBIHBhcmFtZXRlcnMgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAotCVFCU1NfTE9BRF9QQVJNICAgICAgQVBRYnNzTG9hZDsgICAgICAgICAvLyBRQlNTIGxvYWQgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAotCVVDSEFSICAgICAgICAgICAgICAgQWNrUG9saWN5WzRdOyAgICAgICAvLyBBQ0sgcG9saWN5IG9mIHRoZSBzcGVjaWZpZWQgQUMuIHNlZSBBQ0tfeHh4Ci0JQk9PTEVBTgkJCQliRExTQ2FwYWJsZTsJCS8vIDA6ZGlzYWJsZSBETFMsIDE6ZW5hYmxlIERMUwotCS8vIGEgYml0bWFwIG9mIEJPT0xFQU4gZmxhZ3MuIGVhY2ggYml0IHJlcHJlc2VudCBhbiBvcGVyYXRpb24gc3RhdHVzIG9mIGEgcGFydGljdWxhcgotCS8vIEJPT0xFQU4gY29udHJvbCwgZWl0aGVyIE9OIG9yIE9GRi4gVGhlc2UgZmxhZ3Mgc2hvdWxkIGFsd2F5cyBiZSBhY2Nlc3NlZCB2aWEKLQkvLyBPUFNUQVRVU19URVNUX0ZMQUcoKSwgT1BTVEFUVVNfU0VUX0ZMQUcoKSwgT1BfU1RBVFVTX0NMRUFSX0ZMQUcoKSBtYWNyb3MuCi0JLy8gc2VlIGZPUF9TVEFUVVNfeHh4IGluIFJUTVBfREVGLkMgZm9yIGRldGFpbCBiaXQgZGVmaW5pdGlvbgotCVVMT05HICAgICAgICAgICAgICAgT3BTdGF0dXNGbGFnczsKLQotCUJPT0xFQU4JCQkJTmRpc1JhZGlvU3RhdGVPZmY7IC8vRm9yIEhDVCAxMi4wLCBzZXQgdGhpcyBmbGFnIHRvIFRSVUUgaW5zdGVhZCBvZiBjYWxsZWQgTWxtZVJhZGlvT2ZmLgotCUFCR0JBTkRfU1RBVEUJCUJhbmRTdGF0ZTsJCS8vIEZvciBzZXR0aW5nIEJCUCB1c2VkIG9uIEIvRyBvciBBIG1vZGUuCi0KLQkvLyBJRUVFODAyLjExSC0tREZTLgotCVJBREFSX0RFVEVDVF9TVFJVQ1QJUmFkYXJEZXRlY3Q7Ci0KLQkvLyBIVAotCVVDSEFSCQkJQkFTaXplOwkJLy8gVVNlciBkZXNpcmVkIEJBV2luZG93U2l6ZS4gU2hvdWxkIG5vdCBleGNlZWQgb3VyIG1heCBjYXBhYmlsaXR5Ci0JLy9SVF9IVF9DQVBBQklMSVRZCVN1cHBvcnRlZEh0UGh5OwotCVJUX0hUX0NBUEFCSUxJVFkJRGVzaXJlZEh0UGh5OwotCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKLQlBRERfSFRfSU5GT19JRQkJQWRkSFRJbmZvOwkvLyBVc2VmdWwgYXMgQVAuCi0JLy9UaGlzIElFIGlzIHVzZWQgd2l0aCBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgZWxlbWVudCB3aGVuIGNoYW5naW5nIHRvIGEgbmV3IDQwTUh6LgotCS8vVGhpcyBJRSBpcyBpbmNsdWRlZCBpbiBjaGFubmVsIHN3aXRjaCBhbW1vdW5jZW1lbnQgZnJhbWVzIDcuNC4xLjUsIGJlYWNvbnMsIHByb2JlIFJzcC4KLQlORVdfRVhUX0NIQU5fSUUJTmV3RXh0Q2hhbk9mZnNldDsJLy83LjMuMi4yMEEsIDEgaWYgZXh0ZW5zaW9uIGNoYW5uZWwgaXMgYWJvdmUgdGhlIGNvbnRyb2wgY2hhbm5lbCwgMyBpZiBiZWxvdywgMCBpZiBub3QgcHJlc2VudAotCi0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgYkhUUHJvdGVjdDsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICBiTUlNT1BTRW5hYmxlOwotICAgIEJPT0xFQU4JCQkJCWJCQURlY2xpbmU7Ci0JQk9PTEVBTgkJCQkJYkRpc2FibGVSZW9yZGVyaW5nOwotCUJPT0xFQU4JCQkJCWJGb3J0eV9NaHpfSW50b2xlcmFudDsKLQlCT09MRUFOCQkJCQliRXh0Q2hhbm5lbFN3aXRjaEFubm91bmNlbWVudDsKLQlCT09MRUFOCQkJCQliUmN2QlNTV2lkdGhUcmlnZ2VyRXZlbnRzOwotCVVMT05HCQkJCQlMYXN0UmN2QlNTV2lkdGhUcmlnZ2VyRXZlbnRzVGltZTsKLQotCVVDSEFSCQkJCQlUeEJBU2l6ZTsKLQotCS8vIEVuYWJsZSB3aXJlbGVzcyBldmVudAotCUJPT0xFQU4JCQkJYldpcmVsZXNzRXZlbnQ7Ci0JQk9PTEVBTgkJCQliV2lGaVRlc3Q7CQkJCS8vIEVuYWJsZSB0aGlzIHBhcmFtZXRlciBmb3IgV2lGaSB0ZXN0Ci0KLQkvLyBUeCAmIFJ4IFN0cmVhbSBudW1iZXIgc2VsZWN0aW9uCi0JVUNIQVIJCQkJVHhTdHJlYW07Ci0JVUNIQVIJCQkJUnhTdHJlYW07Ci0KLQkvLyB0cmFuc21pdCBwaHkgbW9kZSwgdHJhc21pdCByYXRlIGZvciBNdWx0aWNhc3QuCi0jaWZkZWYgTUNBU1RfUkFURV9TUEVDSUZJQwotCVVDSEFSCQkJCU1jYXN0VHJhbnNtaXRNY3M7Ci0JVUNIQVIJCQkJTWNhc3RUcmFuc21pdFBoeU1vZGU7Ci0jZW5kaWYgLy8gTUNBU1RfUkFURV9TUEVDSUZJQyAvLwotCi0JQk9PTEVBTiAgICAgCQliSGFyZHdhcmVSYWRpbzsgICAgIC8vIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gZW5hYmxlZAotCi0jaWZkZWYgUlQyODcwCi0JQk9PTEVBTiAgICAgCQliTXVsdGlwbGVJUlA7ICAgICAgIC8vIE11bHRpcGxlIEJ1bGsgSU4gZmxhZwotCVVDSEFSICAgICAgIAkJTnVtT2ZCdWxrSW5JUlA7ICAgICAvLyBpZiBiTXVsdGlwbGVJUlAgPT0gVFJVRSwgTnVtT2ZCdWxrSW5JUlAgd2lsbCBiZSA0IG90aGVyd2lzZSBiZSAxCi0gCVJUX0hUX0NBUEFCSUxJVFkJU3VwcG9ydGVkSHRQaHk7Ci0JVUxPTkcJCQkJTWF4UGt0T25lVHhCdWxrOwotCVVDSEFSCQkJCVR4QnVsa0ZhY3RvcjsKLQlVQ0hBUgkJCQlSeEJ1bGtGYWN0b3I7Ci0KLQlCRUFDT05fU1lOQ19TVFJVQ1QJKnBCZWFjb25TeW5jOwotCVJBTElOS19USU1FUl9TVFJVQ1QJQmVhY29uVXBkYXRlVGltZXI7Ci0JVUlOVDMyCQkJCUJlYWNvbkFkanVzdDsKLQlVSU5UMzIJCQkJQmVhY29uRmFjdG9yOwotCVVJTlQzMgkJCQlCZWFjb25SZW1haW47Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi0KLQotIAlORElTX1NQSU5fTE9DSwkJCU1lYXN1cmVSZXFUYWJMb2NrOwotCVBNRUFTVVJFX1JFUV9UQUIJCXBNZWFzdXJlUmVxVGFiOwotCi0JTkRJU19TUElOX0xPQ0sJCQlUcGNSZXFUYWJMb2NrOwotCVBUUENfUkVRX1RBQgkJCXBUcGNSZXFUYWI7Ci0KLQkvLyB0cmFuc21pdCBwaHkgbW9kZSwgdHJhc21pdCByYXRlIGZvciBNdWx0aWNhc3QuCi0jaWZkZWYgTUNBU1RfUkFURV9TUEVDSUZJQwotCUhUVFJBTlNNSVRfU0VUVElORwkJTUNhc3RQaHlNb2RlOwotI2VuZGlmIC8vIE1DQVNUX1JBVEVfU1BFQ0lGSUMgLy8KLX0gQ09NTU9OX0NPTkZJRywgKlBDT01NT05fQ09ORklHOworCUJPT0xFQU4gSFRfRGlzYWxsb3dUS0lQOwkvKiBSZXN0cmljdCB0aGUgZW5jcnlwdGlvbiB0eXBlIGluIDExbiBIVCBtb2RlICovCit9OwogCiAvKiBNb2RpZmllZCBieSBXdSBYaS1LdW4gNC8yMS8yMDA2ICovCi0vLyBTVEEgY29uZmlndXJhdGlvbiBhbmQgc3RhdHVzCi10eXBlZGVmIHN0cnVjdCBfU1RBX0FETUlOX0NPTkZJRyB7Ci0JLy8gR1JPVVAgMSAtCi0JLy8gICBVc2VyIGNvbmZpZ3VyYXRpb24gbG9hZGVkIGZyb20gUmVnaXN0cnksIEUyUFJPTSBvciBPSURfeHh4LiBUaGVzZSBzZXR0aW5ncyBkZXNjcmliZQotCS8vICAgdGhlIHVzZXIgaW50ZW5kZWQgY29uZmlndXJhdGlvbiwgYnV0IG5vdCBuZWNlc3NhcnkgZnVsbHkgZXF1YWwgdG8gdGhlIGZpbmFsCi0JLy8gICBzZXR0aW5ncyBpbiBBQ1RJVkUgQlNTIGFmdGVyIG5lZ290aWF0aW9uL2NvbXByb21pemUgd2l0aCB0aGUgQlNTIGhvbGRlciAoZWl0aGVyCi0JLy8gICBBUCBvciBJQlNTIGhvbGRlcikuCi0JLy8gICBPbmNlIGluaXRpYWxpemVkLCB1c2VyIGNvbmZpZ3VyYXRpb24gY2FuIG9ubHkgYmUgY2hhbmdlZCB2aWEgT0lEX3h4eAotCVVDSEFSICAgICAgIEJzc1R5cGU7ICAgICAgICAgICAgICAvLyBCU1NfSU5GUkEgb3IgQlNTX0FESE9DCi0JVVNIT1JUICAgICAgQXRpbVdpbjsgICAgICAgICAgLy8gdXNlZCB3aGVuIHN0YXJ0aW5nIGEgbmV3IElCU1MKKy8qIFNUQSBjb25maWd1cmF0aW9uIGFuZCBzdGF0dXMgKi8KK3N0cnVjdCBydF9zdGFfYWRtaW5fY29uZmlnIHsKKwkvKiBHUk9VUCAxIC0gKi8KKwkvKiAgIFVzZXIgY29uZmlndXJhdGlvbiBsb2FkZWQgZnJvbSBSZWdpc3RyeSwgRTJQUk9NIG9yIE9JRF94eHguIFRoZXNlIHNldHRpbmdzIGRlc2NyaWJlICovCisJLyogICB0aGUgdXNlciBpbnRlbmRlZCBjb25maWd1cmF0aW9uLCBidXQgbm90IG5lY2Vzc2FyeSBmdWxseSBlcXVhbCB0byB0aGUgZmluYWwgKi8KKwkvKiAgIHNldHRpbmdzIGluIEFDVElWRSBCU1MgYWZ0ZXIgbmVnb3RpYXRpb24vY29tcHJvbWl6ZSB3aXRoIHRoZSBCU1MgaG9sZGVyIChlaXRoZXIgKi8KKwkvKiAgIEFQIG9yIElCU1MgaG9sZGVyKS4gKi8KKwkvKiAgIE9uY2UgaW5pdGlhbGl6ZWQsIHVzZXIgY29uZmlndXJhdGlvbiBjYW4gb25seSBiZSBjaGFuZ2VkIHZpYSBPSURfeHh4ICovCisJdTggQnNzVHlwZTsJCS8qIEJTU19JTkZSQSBvciBCU1NfQURIT0MgKi8KKwl1MTYgQXRpbVdpbjsJCS8qIHVzZWQgd2hlbiBzdGFydGluZyBhIG5ldyBJQlNTICovCiAKLQkvLyBHUk9VUCAyIC0KLQkvLyAgIFVzZXIgY29uZmlndXJhdGlvbiBsb2FkZWQgZnJvbSBSZWdpc3RyeSwgRTJQUk9NIG9yIE9JRF94eHguIFRoZXNlIHNldHRpbmdzIGRlc2NyaWJlCi0JLy8gICB0aGUgdXNlciBpbnRlbmRlZCBjb25maWd1cmF0aW9uLCBhbmQgc2hvdWxkIGJlIGFsd2F5cyBhcHBsaWVkIHRvIHRoZSBmaW5hbAotCS8vICAgc2V0dGluZ3MgaW4gQUNUSVZFIEJTUyB3aXRob3V0IGNvbXByb21pc2luZyB3aXRoIHRoZSBCU1MgaG9sZGVyLgotCS8vICAgT25jZSBpbml0aWFsaXplZCwgdXNlciBjb25maWd1cmF0aW9uIGNhbiBvbmx5IGJlIGNoYW5nZWQgdmlhIE9JRF94eHgKLQlVQ0hBUiAgICAgICBSc3NpVHJpZ2dlcjsKLQlVQ0hBUiAgICAgICBSc3NpVHJpZ2dlck1vZGU7ICAgICAgLy8gUlNTSV9UUklHR0VSRURfVVBPTl9CRUxPV19USFJFU0hPTEQgb3IgUlNTSV9UUklHR0VSRURfVVBPTl9FWENDRUVEX1RIUkVTSE9MRAotCVVTSE9SVCAgICAgIERlZmF1bHRMaXN0ZW5Db3VudDsgICAvLyBkZWZhdWx0IGxpc3RlbiBjb3VudDsKLQlVTE9ORyAgICAgICBXaW5kb3dzUG93ZXJNb2RlOyAgICAgICAgICAgLy8gUG93ZXIgbW9kZSBmb3IgQUMgcG93ZXIKLQlVTE9ORyAgICAgICBXaW5kb3dzQmF0dGVyeVBvd2VyTW9kZTsgICAgLy8gUG93ZXIgbW9kZSBmb3IgYmF0dGVyeSBpZiBleGlzdHMKLQlCT09MRUFOICAgICBiV2luZG93c0FDQ0FNRW5hYmxlOyAgICAgICAgLy8gRW5hYmxlIENBTSBwb3dlciBtb2RlIHdoZW4gQUMgb24KLQlCT09MRUFOICAgICBiQXV0b1JlY29ubmVjdDsgICAgICAgICAvLyBTZXQgdG8gVFJVRSB3aGVuIHNldHRpbmcgT0lEXzgwMl8xMV9TU0lEIHdpdGggbm8gbWF0Y2hpbmcgQlNTSUQKLQlVTE9ORyAgICAgICBXaW5kb3dzUG93ZXJQcm9maWxlOyAgICAvLyBXaW5kb3dzIHBvd2VyIHByb2ZpbGUsIGZvciBORElTNS4xIFBuUAorCS8qIEdST1VQIDIgLSAqLworCS8qICAgVXNlciBjb25maWd1cmF0aW9uIGxvYWRlZCBmcm9tIFJlZ2lzdHJ5LCBFMlBST00gb3IgT0lEX3h4eC4gVGhlc2Ugc2V0dGluZ3MgZGVzY3JpYmUgKi8KKwkvKiAgIHRoZSB1c2VyIGludGVuZGVkIGNvbmZpZ3VyYXRpb24sIGFuZCBzaG91bGQgYmUgYWx3YXlzIGFwcGxpZWQgdG8gdGhlIGZpbmFsICovCisJLyogICBzZXR0aW5ncyBpbiBBQ1RJVkUgQlNTIHdpdGhvdXQgY29tcHJvbWlzaW5nIHdpdGggdGhlIEJTUyBob2xkZXIuICovCisJLyogICBPbmNlIGluaXRpYWxpemVkLCB1c2VyIGNvbmZpZ3VyYXRpb24gY2FuIG9ubHkgYmUgY2hhbmdlZCB2aWEgT0lEX3h4eCAqLworCXU4IFJzc2lUcmlnZ2VyOworCXU4IFJzc2lUcmlnZ2VyTW9kZTsJLyogUlNTSV9UUklHR0VSRURfVVBPTl9CRUxPV19USFJFU0hPTEQgb3IgUlNTSV9UUklHR0VSRURfVVBPTl9FWENDRUVEX1RIUkVTSE9MRCAqLworCXUxNiBEZWZhdWx0TGlzdGVuQ291bnQ7CS8qIGRlZmF1bHQgbGlzdGVuIGNvdW50OyAqLworCXVuc2lnbmVkIGxvbmcgV2luZG93c1Bvd2VyTW9kZTsJLyogUG93ZXIgbW9kZSBmb3IgQUMgcG93ZXIgKi8KKwl1bnNpZ25lZCBsb25nIFdpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlOwkvKiBQb3dlciBtb2RlIGZvciBiYXR0ZXJ5IGlmIGV4aXN0cyAqLworCUJPT0xFQU4gYldpbmRvd3NBQ0NBTUVuYWJsZTsJLyogRW5hYmxlIENBTSBwb3dlciBtb2RlIHdoZW4gQUMgb24gKi8KKwlCT09MRUFOIGJBdXRvUmVjb25uZWN0OwkvKiBTZXQgdG8gVFJVRSB3aGVuIHNldHRpbmcgT0lEXzgwMl8xMV9TU0lEIHdpdGggbm8gbWF0Y2hpbmcgQlNTSUQgKi8KKwl1bnNpZ25lZCBsb25nIFdpbmRvd3NQb3dlclByb2ZpbGU7CS8qIFdpbmRvd3MgcG93ZXIgcHJvZmlsZSwgZm9yIE5ESVM1LjEgUG5QICovCiAKLQkvLyBNSUI6aWVlZTgwMmRvdDExLmRvdDExc210KDEpLmRvdDExU3RhdGlvbkNvbmZpZ1RhYmxlKDEpCi0JVVNIT1JUICAgICAgUHNtOyAgICAgICAgICAgICAgICAgIC8vIHBvd2VyIG1hbmFnZW1lbnQgbW9kZSAgIChQV1JfQUNUSVZFfFBXUl9TQVZFKQotCVVTSE9SVCAgICAgIERpc2Fzc29jUmVhc29uOwotCVVDSEFSICAgICAgIERpc2Fzc29jU3RhW01BQ19BRERSX0xFTl07Ci0JVVNIT1JUICAgICAgRGVhdXRoUmVhc29uOwotCVVDSEFSICAgICAgIERlYXV0aFN0YVtNQUNfQUREUl9MRU5dOwotCVVTSE9SVCAgICAgIEF1dGhGYWlsUmVhc29uOwotCVVDSEFSICAgICAgIEF1dGhGYWlsU3RhW01BQ19BRERSX0xFTl07CisJLyogTUlCOmllZWU4MDJkb3QxMS5kb3QxMXNtdCgxKS5kb3QxMVN0YXRpb25Db25maWdUYWJsZSgxKSAqLworCXUxNiBQc207CQkvKiBwb3dlciBtYW5hZ2VtZW50IG1vZGUgICAoUFdSX0FDVElWRXxQV1JfU0FWRSkgKi8KKwl1MTYgRGlzYXNzb2NSZWFzb247CisJdTggRGlzYXNzb2NTdGFbTUFDX0FERFJfTEVOXTsKKwl1MTYgRGVhdXRoUmVhc29uOworCXU4IERlYXV0aFN0YVtNQUNfQUREUl9MRU5dOworCXUxNiBBdXRoRmFpbFJlYXNvbjsKKwl1OCBBdXRoRmFpbFN0YVtNQUNfQUREUl9MRU5dOwogCi0JTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVIgICAgICAgICAgUHJpdmFjeUZpbHRlcjsgIC8vIFByaXZhY3lGaWx0ZXIgZW51bSBmb3IgODAyLjFYCi0JTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGU7ICAgICAgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHRvIHdoYXRldmVyIG1pY3Jvc29mdCBkZWZpbmVkCi0JTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOwotCU5ESVNfODAyXzExX1dFUF9TVEFUVVMJCQkJT3JpZ1dlcFN0YXR1czsJLy8gT3JpZ2luYWwgd2VwIHN0YXR1cyBzZXQgZnJvbSBPSUQKKwlORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUiBQcml2YWN5RmlsdGVyOwkvKiBQcml2YWN5RmlsdGVyIGVudW0gZm9yIDgwMi4xWCAqLworCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgQXV0aE1vZGU7CS8qIFRoaXMgc2hvdWxkIG1hdGNoIHRvIHdoYXRldmVyIG1pY3Jvc29mdCBkZWZpbmVkICovCisJTkRJU184MDJfMTFfV0VQX1NUQVRVUyBXZXBTdGF0dXM7CisJTkRJU184MDJfMTFfV0VQX1NUQVRVUyBPcmlnV2VwU3RhdHVzOwkvKiBPcmlnaW5hbCB3ZXAgc3RhdHVzIHNldCBmcm9tIE9JRCAqLwogCi0JLy8gQWRkIHRvIHN1cHBvcnQgZGlmZmVyZW50IGNpcGhlciBzdWl0ZSBmb3IgV1BBMi9XUEEgbW9kZQotCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCQlHcm91cENpcGhlcjsJCS8vIE11bHRpY2FzdCBjaXBoZXIgc3VpdGUKLQlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwkJUGFpckNpcGhlcjsJCQkvLyBVbmljYXN0IGNpcGhlciBzdWl0ZQotCUJPT0xFQU4JCQkJCQkJCWJNaXhDaXBoZXI7CQkJLy8gSW5kaWNhdGUgY3VycmVudCBQYWlyICYgR3JvdXAgdXNlIGRpZmZlcmVudCBjaXBoZXIgc3VpdGVzCi0JVVNIT1JUCQkJCQkJCQlSc25DYXBhYmlsaXR5OworCS8qIEFkZCB0byBzdXBwb3J0IGRpZmZlcmVudCBjaXBoZXIgc3VpdGUgZm9yIFdQQTIvV1BBIG1vZGUgKi8KKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUyBHcm91cENpcGhlcjsJLyogTXVsdGljYXN0IGNpcGhlciBzdWl0ZSAqLworCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTIFBhaXJDaXBoZXI7CS8qIFVuaWNhc3QgY2lwaGVyIHN1aXRlICovCisJQk9PTEVBTiBiTWl4Q2lwaGVyOwkvKiBJbmRpY2F0ZSBjdXJyZW50IFBhaXIgJiBHcm91cCB1c2UgZGlmZmVyZW50IGNpcGhlciBzdWl0ZXMgKi8KKwl1MTYgUnNuQ2FwYWJpbGl0eTsKIAotCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIEdyb3VwS2V5V2VwU3RhdHVzOworCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgR3JvdXBLZXlXZXBTdGF0dXM7CiAKLQlVQ0hBUgkJUE1LWzMyXTsgICAgICAgICAgICAgICAgLy8gV1BBIFBTSyBtb2RlIFBNSwotCVVDSEFSICAgICAgIFBUS1s2NF07ICAgICAgICAgICAgICAgIC8vIFdQQSBQU0sgbW9kZSBQVEsKLQlVQ0hBUgkJR1RLWzMyXTsJCQkJLy8gR1RLIGZyb20gYXV0aGVudGljYXRvcgotCUJTU0lEX0lORk8JU2F2ZWRQTUtbUE1LSURfTk9dOwotCVVJTlQJCVNhdmVkUE1LTnVtOwkJCS8vIFNhdmVkIFBNS0lEIG51bWJlcgorCXU4IFdwYVBhc3NQaHJhc2VbNjRdOwkvKiBXUEEgUFNLIHBhc3MgcGhyYXNlICovCisJdTMyIFdwYVBhc3NQaHJhc2VMZW47CS8qIHRoZSBsZW5ndGggb2YgV1BBIFBTSyBwYXNzIHBocmFzZSAqLworCXU4IFBNS1szMl07CQkvKiBXUEEgUFNLIG1vZGUgUE1LICovCisJdTggUFRLWzY0XTsJCS8qIFdQQSBQU0sgbW9kZSBQVEsgKi8KKwl1OCBHVEtbMzJdOwkJLyogR1RLIGZyb20gYXV0aGVudGljYXRvciAqLworCXN0cnVjdCBydF9ic3NpZF9pbmZvIFNhdmVkUE1LW1BNS0lEX05PXTsKKwl1MzIgU2F2ZWRQTUtOdW07CS8qIFNhdmVkIFBNS0lEIG51bWJlciAqLwogCi0JVUNIQVIJCURlZmF1bHRLZXlJZDsKKwl1OCBEZWZhdWx0S2V5SWQ7CiAKKwkvKiBXUEEgODAyLjF4IHBvcnQgY29udHJvbCwgV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQsIFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCAqLworCXU4IFBvcnRTZWN1cmVkOwogCi0JLy8gV1BBIDgwMi4xeCBwb3J0IGNvbnRyb2wsIFdQQV84MDJfMVhfUE9SVF9TRUNVUkVELCBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQKLQlVQ0hBUiAgICAgICBQb3J0U2VjdXJlZDsKKwkvKiBGb3IgV1BBIGNvdW50ZXJtZWFzdXJlcyAqLworCXVuc2lnbmVkIGxvbmcgTGFzdE1pY0Vycm9yVGltZTsJLyogcmVjb3JkIGxhc3QgTUlDIGVycm9yIHRpbWUgKi8KKwl1bnNpZ25lZCBsb25nIE1pY0VyckNudDsJLyogU2hvdWxkIGJlIDAsIDEsIDIsIHRoZW4gcmVzZXQgdG8gemVybyAoYWZ0ZXIgZGlzYXNzb2ljaWF0aW9uKS4gKi8KKwlCT09MRUFOIGJCbG9ja0Fzc29jOwkvKiBCbG9jayBhc3NvY2lhdGUgYXR0ZW1wdCBmb3IgNjAgc2Vjb25kcyBhZnRlciBjb3VudGVyIG1lYXN1cmUgb2NjdXJyZWQuICovCisJLyogRm9yIFdQQS1QU0sgc3VwcGxpY2FudCBzdGF0ZSAqLworCVdQQV9TVEFURSBXcGFTdGF0ZTsJLyogRGVmYXVsdCBpcyBTU19OT1RVU0UgYW5kIGhhbmRsZWQgYnkgbWljcm9zb2Z0IDgwMi4xeCAqLworCXU4IFJlcGxheUNvdW50ZXJbOF07CisJdTggQU5vbmNlWzMyXTsJLyogQU5vbmNlIGZvciBXUEEtUFNLIGZyb20gYXVyaGVudGljYXRvciAqLworCXU4IFNOb25jZVszMl07CS8qIFNOb25jZSBmb3IgV1BBLVBTSyAqLwogCi0JLy8gRm9yIFdQQSBjb3VudGVybWVhc3VyZXMKLQlVTE9ORyAgICAgICBMYXN0TWljRXJyb3JUaW1lOyAgIC8vIHJlY29yZCBsYXN0IE1JQyBlcnJvciB0aW1lCi0JVUxPTkcgICAgICAgTWljRXJyQ250OyAgICAgICAgICAvLyBTaG91bGQgYmUgMCwgMSwgMiwgdGhlbiByZXNldCB0byB6ZXJvIChhZnRlciBkaXNhc3NvaWNpYXRpb24pLgotCUJPT0xFQU4gICAgIGJCbG9ja0Fzc29jOyAgICAgICAgLy8gQmxvY2sgYXNzb2NpYXRlIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMgYWZ0ZXIgY291bnRlciBtZWFzdXJlIG9jY3VycmVkLgotCS8vIEZvciBXUEEtUFNLIHN1cHBsaWNhbnQgc3RhdGUKLQlXUEFfU1RBVEUgICBXcGFTdGF0ZTsgICAgICAgICAgIC8vIERlZmF1bHQgaXMgU1NfTk9UVVNFIGFuZCBoYW5kbGVkIGJ5IG1pY3Jvc29mdCA4MDIuMXgKLQlVQ0hBUiAgICAgICBSZXBsYXlDb3VudGVyWzhdOwotCVVDSEFSICAgICAgIEFOb25jZVszMl07ICAgICAgICAgLy8gQU5vbmNlIGZvciBXUEEtUFNLIGZyb20gYXVyaGVudGljYXRvcgotCVVDSEFSICAgICAgIFNOb25jZVszMl07ICAgICAgICAgLy8gU05vbmNlIGZvciBXUEEtUFNLCisJdTggTGFzdFNOUjA7CQkvKiBsYXN0IHJlY2VpdmVkIEJFQUNPTidzIFNOUiAqLworCXU4IExhc3RTTlIxOwkJLyogbGFzdCByZWNlaXZlZCBCRUFDT04ncyBTTlIgZm9yIDJuZCAgYW50ZW5uYSAqLworCXN0cnVjdCBydF9yc3NpX3NhbXBsZSBSc3NpU2FtcGxlOworCXVuc2lnbmVkIGxvbmcgTnVtT2ZBdmdSc3NpU2FtcGxlOwogCi0JVUNIQVIgICAgICAgTGFzdFNOUjA7ICAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgQkVBQ09OJ3MgU05SCi0JVUNIQVIgICAgICAgTGFzdFNOUjE7ICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBCRUFDT04ncyBTTlIgZm9yIDJuZCAgYW50ZW5uYQotCVJTU0lfU0FNUExFIFJzc2lTYW1wbGU7Ci0JVUxPTkcgICAgICAgTnVtT2ZBdmdSc3NpU2FtcGxlOworCXVuc2lnbmVkIGxvbmcgTGFzdEJlYWNvblJ4VGltZTsJLyogT1MncyB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgQkVBQ09OIFJYIHRpbWUgKi8KKwl1bnNpZ25lZCBsb25nIExhc3QxMWJCZWFjb25SeFRpbWU7CS8qIE9TJ3MgdGltZXN0YW1wIG9mIHRoZSBsYXN0IDExQiBCRUFDT04gUlggdGltZSAqLworCXVuc2lnbmVkIGxvbmcgTGFzdDExZ0JlYWNvblJ4VGltZTsJLyogT1MncyB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgMTFHIEJFQUNPTiBSWCB0aW1lICovCisJdW5zaWduZWQgbG9uZyBMYXN0MjBOQmVhY29uUnhUaW1lOwkvKiBPUydzIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCAyME1IeiBOIEJFQUNPTiBSWCB0aW1lICovCiAKLQlVTE9ORyAgICAgICBMYXN0QmVhY29uUnhUaW1lOyAgICAgLy8gT1MncyB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgQkVBQ09OIFJYIHRpbWUKLQlVTE9ORyAgICAgICBMYXN0MTFiQmVhY29uUnhUaW1lOyAgLy8gT1MncyB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgMTFCIEJFQUNPTiBSWCB0aW1lCi0JVUxPTkcJCUxhc3QxMWdCZWFjb25SeFRpbWU7CS8vIE9TJ3MgdGltZXN0YW1wIG9mIHRoZSBsYXN0IDExRyBCRUFDT04gUlggdGltZQotCVVMT05HCQlMYXN0MjBOQmVhY29uUnhUaW1lOwkvLyBPUydzIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCAyME1IeiBOIEJFQUNPTiBSWCB0aW1lCisJdW5zaWduZWQgbG9uZyBMYXN0U2NhblRpbWU7CS8qIFJlY29yZCBsYXN0IHNjYW4gdGltZSBmb3IgaXNzdWUgQlNTSURfU0NBTl9MSVNUICovCisJdW5zaWduZWQgbG9uZyBTY2FuQ250OwkJLyogU2NhbiBjb3VudHMgc2luY2UgbW9zdCByZWNlbnQgU1NJRCwgQlNTSUQsIFNDQU4gT0lEIHJlcXVlc3QgKi8KKwlCT09MRUFOIGJTd1JhZGlvOwkvKiBTb2Z0d2FyZSBjb250cm9sbGVkIFJhZGlvIE9uL09mZiwgVFJVRTogT24gKi8KKwlCT09MRUFOIGJId1JhZGlvOwkvKiBIYXJkd2FyZSBjb250cm9sbGVkIFJhZGlvIE9uL09mZiwgVFJVRTogT24gKi8KKwlCT09MRUFOIGJSYWRpbzsJCS8qIFJhZGlvIHN0YXRlLCBBbmQgb2YgU3cgJiBIdyByYWRpbyBzdGF0ZSAqLworCUJPT0xFQU4gYkhhcmR3YXJlUmFkaW87CS8qIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gZW5hYmxlZCAqLworCUJPT0xFQU4gYlNob3dIaWRkZW5TU0lEOwkvKiBTaG93IGFsbCBrbm93biBTU0lEIGluIFNTSUQgbGlzdCBnZXQgb3BlcmF0aW9uICovCiAKLQlVTE9ORyAgICAgICBMYXN0U2NhblRpbWU7ICAgICAgIC8vIFJlY29yZCBsYXN0IHNjYW4gdGltZSBmb3IgaXNzdWUgQlNTSURfU0NBTl9MSVNUCi0JVUxPTkcgICAgICAgU2NhbkNudDsgICAgICAgICAgICAvLyBTY2FuIGNvdW50cyBzaW5jZSBtb3N0IHJlY2VudCBTU0lELCBCU1NJRCwgU0NBTiBPSUQgcmVxdWVzdAotCUJPT0xFQU4gICAgIGJTd1JhZGlvOyAgICAgICAgICAgLy8gU29mdHdhcmUgY29udHJvbGxlZCBSYWRpbyBPbi9PZmYsIFRSVUU6IE9uCi0JQk9PTEVBTiAgICAgYkh3UmFkaW87ICAgICAgICAgICAvLyBIYXJkd2FyZSBjb250cm9sbGVkIFJhZGlvIE9uL09mZiwgVFJVRTogT24KLQlCT09MRUFOICAgICBiUmFkaW87ICAgICAgICAgICAgIC8vIFJhZGlvIHN0YXRlLCBBbmQgb2YgU3cgJiBIdyByYWRpbyBzdGF0ZQotCUJPT0xFQU4gICAgIGJIYXJkd2FyZVJhZGlvOyAgICAgLy8gSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBlbmFibGVkCi0JQk9PTEVBTiAgICAgYlNob3dIaWRkZW5TU0lEOyAgICAvLyBTaG93IGFsbCBrbm93biBTU0lEIGluIFNTSUQgbGlzdCBnZXQgb3BlcmF0aW9uCi0jaWZkZWYgUlQyODYwCi0gICAgQk9PTEVBTgkJQWRob2NCT25seUpvaW5lZDsJLy8gSW5kaWNhdGUgQWRob2MgQiBKb2luLgotICAgIEJPT0xFQU4JCUFkaG9jQkdKb2luZWQ7CQkvLyBJbmRpY2F0ZSBBZGhvYyBCL0cgSm9pbi4KLSAgICBCT09MRUFOCQlBZGhvYzIwTkpvaW5lZDsJCS8vIEluZGljYXRlIEFkaG9jIDIwTUh6IE4gSm9pbi4KLSNlbmRpZgotCS8vIE5ldyBmb3IgV1BBLCB3aW5kb3dzIHdhbnQgdXMgdG8ga2VlcCBhc3NvY2lhdGlvbiBpbmZvcm1hdGlvbiBhbmQKLQkvLyBGaXhlZCBJRXMgZnJvbSBsYXN0IGFzc29jaWF0aW9uIHJlc3BvbnNlCi0JTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04gICAgIEFzc29jSW5mbzsKLQlVU0hPUlQgICAgICAgUmVxVmFySUVMZW47ICAgICAgICAgICAgICAgIC8vIExlbmd0aCBvZiBuZXh0IFZJRSBpbmNsdWRlIEVJRCAmIExlbmd0aAotCVVDSEFSICAgICAgIFJlcVZhcklFc1tNQVhfVklFX0xFTl07CQkvLyBUaGUgY29udGVudCBzYXZlZCBoZXJlIHNob3VsZCBiZSBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KLQlVU0hPUlQgICAgICAgUmVzVmFySUVMZW47ICAgICAgICAgICAgICAgIC8vIExlbmd0aCBvZiBuZXh0IFZJRSBpbmNsdWRlIEVJRCAmIExlbmd0aAotCVVDSEFSICAgICAgIFJlc1ZhcklFc1tNQVhfVklFX0xFTl07CisJLyogTmV3IGZvciBXUEEsIHdpbmRvd3Mgd2FudCB1cyB0byBrZWVwIGFzc29jaWF0aW9uIGluZm9ybWF0aW9uIGFuZCAqLworCS8qIEZpeGVkIElFcyBmcm9tIGxhc3QgYXNzb2NpYXRpb24gcmVzcG9uc2UgKi8KKwlzdHJ1Y3QgcnRfbmRpc184MDJfMTFfYXNzb2NpYXRpb25faW5mb3JtYXRpb24gQXNzb2NJbmZvOworCXUxNiBSZXFWYXJJRUxlbjsJLyogTGVuZ3RoIG9mIG5leHQgVklFIGluY2x1ZGUgRUlEICYgTGVuZ3RoICovCisJdTggUmVxVmFySUVzW01BWF9WSUVfTEVOXTsJLyogVGhlIGNvbnRlbnQgc2F2ZWQgaGVyZSBzaG91bGQgYmUgbGl0dGxlLWVuZGlhbiBmb3JtYXQuICovCisJdTE2IFJlc1ZhcklFTGVuOwkvKiBMZW5ndGggb2YgbmV4dCBWSUUgaW5jbHVkZSBFSUQgJiBMZW5ndGggKi8KKwl1OCBSZXNWYXJJRXNbTUFYX1ZJRV9MRU5dOwogCi0JVUNIQVIgICAgICAgUlNOSUVfTGVuOwotCVVDSEFSICAgICAgIFJTTl9JRVtNQVhfTEVOX09GX1JTTklFXTsJLy8gVGhlIGNvbnRlbnQgc2F2ZWQgaGVyZSBzaG91bGQgYmUgbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisJdTggUlNOSUVfTGVuOworCXU4IFJTTl9JRVtNQVhfTEVOX09GX1JTTklFXTsJLyogVGhlIGNvbnRlbnQgc2F2ZWQgaGVyZSBzaG91bGQgYmUgbGl0dGxlLWVuZGlhbiBmb3JtYXQuICovCiAKLQkvLyBOZXcgdmFyaWFibGVzIHVzZWQgZm9yIENDWCAxLjAKLQlCT09MRUFOICAgICAgICAgICAgIGJDa2lwT247Ci0JQk9PTEVBTiAgICAgICAgICAgICBiQ2tpcENtaWNPbjsKLQlVQ0hBUiAgICAgICAgICAgICAgIENraXBGbGFnOwotCVVDSEFSICAgICAgICAgICAgICAgR0lWWzNdOyAgLy9mb3IgQ0NYIGl2Ci0JVUNIQVIgICAgICAgICAgICAgICBSeFNFUVs0XTsKLQlVQ0hBUiAgICAgICAgICAgICAgIFR4U0VRWzRdOwotCVVDSEFSICAgICAgICAgICAgICAgQ0tJUE1JQ1s0XTsKLQlVQ0hBUiAgICAgICAgICAgICAgIExlYXBBdXRoTW9kZTsKLQlMRUFQX0FVVEhfSU5GTyAgICAgIExlYXBBdXRoSW5mbzsKLQlVQ0hBUiAgICAgICAgICAgICAgIEhhc2hQd2RbMTZdOwotCVVDSEFSICAgICAgICAgICAgICAgTmV0d29ya0NoYWxsZW5nZVs4XTsKLQlVQ0hBUiAgICAgICAgICAgICAgIE5ldHdvcmtDaGFsbGVuZ2VSZXNwb25zZVsyNF07Ci0JVUNIQVIgICAgICAgICAgICAgICBQZWVyQ2hhbGxlbmdlWzhdOworCXVuc2lnbmVkIGxvbmcgQ0xCdXN5Qnl0ZXM7CS8qIFNhdmUgdGhlIHRvdGFsIGJ5dGVzIHJlY2VpdmVkIGR1cm5pbmcgY2hhbm5lbCBsb2FkIHNjYW4gdGltZSAqLworCXUxNiBSUElEZW5zaXR5WzhdOwkvKiBBcnJheSBmb3IgUlBJIGRlbnNpdHkgY29sbGVjdGlvbiAqLwogCi0JVUNIQVIgICAgICAgICAgICAgICBQZWVyQ2hhbGxlbmdlUmVzcG9uc2VbMjRdOwotCVVDSEFSICAgICAgICAgICAgICAgU2Vzc2lvbktleVsxNl07IC8vTmV0d29yayBzZXNzaW9uIGtleXMgKE5TSykKLQlSQUxJTktfVElNRVJfU1RSVUNUIExlYXBBdXRoVGltZXI7Ci0JUk9HVUVBUF9UQUJMRSAgICAgICBSb2d1ZUFwVGFiOyAgIC8vQ2lzY28gQ0NYMSBSb2d1ZSBBUCBEZXRlY3Rpb24KKwl1OCBSTVJlcUNudDsJCS8qIE51bWJlciBvZiBtZWFzdXJlbWVudCByZXF1ZXN0IHNhdmVkLiAqLworCXU4IEN1cnJlbnRSTVJlcUlkeDsJLyogTnVtYmVyIG9mIG1lYXN1cmVtZW50IHJlcXVlc3Qgc2F2ZWQuICovCisJQk9PTEVBTiBQYXJhbGxlbFJlcTsJLyogUGFyYWxsZWwgbWVhc3VyZW1lbnQsIG9ubHkgb25lIHJlcXVlc3QgcGVyZm9ybWVkLCAqLworCS8qIEl0IG11c3QgYmUgdGhlIHNhbWUgY2hhbm5lbCB3aXRoIG1heGltdW0gZHVyYXRpb24gKi8KKwl1MTYgUGFyYWxsZWxEdXJhdGlvbjsJLyogTWF4aW11bSBkdXJhdGlvbiBmb3IgcGFyYWxsZWwgbWVhc3VyZW1lbnQgKi8KKwl1OCBQYXJhbGxlbENoYW5uZWw7CS8qIE9ubHkgb25lIGNoYW5uZWwgd2l0aCBwYXJhbGxlbCBtZWFzdXJlbWVudCAqLworCXUxNiBJQVBQVG9rZW47CS8qIElBUFAgZGlhbG9nIHRva2VuICovCisJLyogSGFjayBmb3IgY2hhbm5lbCBsb2FkIGFuZCBub2lzZSBoaXN0b2dyYW0gcGFyYW1ldGVycyAqLworCXU4IE5IRmFjdG9yOwkJLyogUGFyYW1ldGVyIGZvciBOb2lzZSBoaXN0b2dyYW0gKi8KKwl1OCBDTEZhY3RvcjsJCS8qIFBhcmFtZXRlciBmb3IgY2hhbm5lbCBsb2FkICovCiAKLQkvLyBOZXcgY29udHJvbCBmbGFncyBmb3IgQ0NYCi0JQ0NYX0NPTlRST0wgICAgICAgICBDQ1hDb250cm9sOyAgICAgICAgICAgICAgICAgLy8gTWFzdGVyIGFkbWluaXN0cmF0aW9uIHN0YXRlCi0JQk9PTEVBTiAgICAgICAgICAgICBDQ1hFbmFibGU7ICAgICAgICAgICAgICAgICAgLy8gQWN0dWFsIENDWCBzdGF0ZQotCVVDSEFSICAgICAgICAgICAgICAgQ0NYU2NhbkNoYW5uZWw7ICAgICAgICAgICAgIC8vIFNlbGVjdGVkIGNoYW5uZWwgZm9yIENDWCBiZWFjb24gcmVxdWVzdAotCVVTSE9SVCAgICAgICAgICAgICAgQ0NYU2NhblRpbWU7ICAgICAgICAgICAgICAgIC8vIFRpbWUgb3V0IHRvIHdhaXQgZm9yIGJlYWNvbiBhbmQgcHJvYmUgcmVzcG9uc2UKLQlVQ0hBUiAgICAgICAgICAgICAgIENDWFJlcVR5cGU7ICAgICAgICAgICAgICAgICAvLyBDdXJyZW50IHByb2Nlc3NpbmcgQ0NYIHJlcXVlc3QgdHlwZQotCUJTU19UQUJMRSAgICAgICAgICAgQ0NYQnNzVGFiOyAgICAgICAgICAgICAgICAgIC8vIEJTUyBUYWJsZQotCVVDSEFSICAgICAgICAgICAgICAgRnJhbWVSZXBvcnRCdWZbMjA0OF07ICAgICAgIC8vIEJ1ZmZlciBmb3IgY3JlYXRpbmcgZnJhbWUgcmVwb3J0Ci0JVVNIT1JUICAgICAgICAgICAgICBGcmFtZVJlcG9ydExlbjsgICAgICAgICAgICAgLy8gQ3VycmVudCBGcmFtZSByZXBvcnQgbGVuZ3RoCi0JVUxPTkcgICAgICAgICAgICAgICBDTEJ1c3lCeXRlczsgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgdG90YWwgYnl0ZXMgcmVjZWl2ZWQgZHVybmluZyBjaGFubmVsIGxvYWQgc2NhbiB0aW1lCi0JVVNIT1JUICAgICAgICAgICAgICBSUElEZW5zaXR5WzhdOyAgICAgICAgICAgICAgLy8gQXJyYXkgZm9yIFJQSSBkZW5zaXR5IGNvbGxlY3Rpb24KLQkvLyBTdGFydCBhZGRyZXNzIG9mIGVhY2ggQlNTIHRhYmxlIHdpdGhpbiBGcmFtZVJlcG9ydEJ1ZgotCS8vIEl0J3MgaW1wb3J0YW50IHRvIHVwZGF0ZSB0aGUgUnhQb3dlciBvZiB0aGUgY29ycmVzcG9uZGluZyBCc3MKLQlVU0hPUlQgICAgICAgICAgICAgIEJzc1JlcG9ydE9mZnNldFtNQVhfTEVOX09GX0JTU19UQUJMRV07Ci0JVVNIT1JUICAgICAgICAgICAgICBCZWFjb25Ub2tlbjsgICAgICAgICAgICAgICAgLy8gVG9rZW4gZm9yIGJlYWNvbiByZXBvcnQKLQlVTE9ORyAgICAgICAgICAgICAgIExhc3RCc3NJbmRleDsgICAgICAgICAgICAgICAvLyBNb3N0IGN1cnJlbnQgcmVwb3J0ZWQgQnNzIGluZGV4Ci0JUk1fUkVRVUVTVF9BQ1RJT04gICBNZWFzdXJlbWVudFJlcXVlc3RbMTZdOyAgICAgLy8gU2F2ZWQgbWVhc3VyZW1lbnQgcmVxdWVzdAotCVVDSEFSICAgICAgICAgICAgICAgUk1SZXFDbnQ7ICAgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBtZWFzdXJlbWVudCByZXF1ZXN0IHNhdmVkLgotCVVDSEFSICAgICAgICAgICAgICAgQ3VycmVudFJNUmVxSWR4OyAgICAgICAgICAgIC8vIE51bWJlciBvZiBtZWFzdXJlbWVudCByZXF1ZXN0IHNhdmVkLgotCUJPT0xFQU4gICAgICAgICAgICAgUGFyYWxsZWxSZXE7ICAgICAgICAgICAgICAgIC8vIFBhcmFsbGVsIG1lYXN1cmVtZW50LCBvbmx5IG9uZSByZXF1ZXN0IHBlcmZvcm1lZCwKLQkJCQkJCQkJCQkJCQkvLyBJdCBtdXN0IGJlIHRoZSBzYW1lIGNoYW5uZWwgd2l0aCBtYXhpbXVtIGR1cmF0aW9uCi0JVVNIT1JUICAgICAgICAgICAgICBQYXJhbGxlbER1cmF0aW9uOyAgICAgICAgICAgLy8gTWF4aW11bSBkdXJhdGlvbiBmb3IgcGFyYWxsZWwgbWVhc3VyZW1lbnQKLQlVQ0hBUiAgICAgICAgICAgICAgIFBhcmFsbGVsQ2hhbm5lbDsgICAgICAgICAgICAvLyBPbmx5IG9uZSBjaGFubmVsIHdpdGggcGFyYWxsZWwgbWVhc3VyZW1lbnQKLQlVU0hPUlQgICAgICAgICAgICAgIElBUFBUb2tlbjsgICAgICAgICAgICAgICAgICAvLyBJQVBQIGRpYWxvZyB0b2tlbgotCVVDSEFSICAgICAgICAgICAgICAgQ0NYUW9zRUNXTWluOyAgICAgICAgICAgICAgIC8vIENpc2NvIFFPUyBFQ1dNaW4gZm9yIEFDIDAKLQlVQ0hBUiAgICAgICAgICAgICAgIENDWFFvc0VDV01heDsgICAgICAgICAgICAgICAvLyBDaXNjbyBRT1MgRUNXTWF4IGZvciBBQyAwCi0JLy8gSGFjayBmb3IgY2hhbm5lbCBsb2FkIGFuZCBub2lzZSBoaXN0b2dyYW0gcGFyYW1ldGVycwotCVVDSEFSICAgICAgICAgICAgICAgTkhGYWN0b3I7ICAgICAgICAgICAgICAgICAgIC8vIFBhcmFtZXRlciBmb3IgTm9pc2UgaGlzdG9ncmFtCi0JVUNIQVIgICAgICAgICAgICAgICBDTEZhY3RvcjsgICAgICAgICAgICAgICAgICAgLy8gUGFyYW1ldGVyIGZvciBjaGFubmVsIGxvYWQKKwlzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyIFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyOworCUJPT0xFQU4gU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nOwogCi0JVUNIQVIgICAgICAgICAgICAgICBLUktbMTZdOyAgICAgICAgLy9LZXkgUmVmcmVzaCBLZXkuCi0JVUNIQVIgICAgICAgICAgICAgICBCVEtbMzJdOyAgICAgICAgLy9CYXNlIFRyYW5zaWVudCBLZXkKLQlCT09MRUFOICAgICAgICAgICAgIENDS01MaW5rVXBGbGFnOwotCVVMT05HICAgICAgICAgICAgICAgQ0NLTVJOOyAgICAvLyhSZSlBc3NvY2lhdGlvbiByZXF1ZXN0IG51bWJlci4KLQlMQVJHRV9JTlRFR0VSICAgICAgIENDS01CZWFjb25BdEpvaW5UaW1lU3RhbXA7ICAvL1RTRiB0aW1lciBmb3IgUmUtYXNzb2NhaXRlIHRvIHRoZSBuZXcgQVAKLQlVQ0hBUiAgICAgICAgICAgICAgIEFpcm9uZXRDZWxsUG93ZXJMaW1pdDsgICAgICAvL2luIGRCbQotCVVDSEFSICAgICAgICAgICAgICAgQWlyb25ldElQQWRkcmVzc1s0XTsgICAgICAgIC8vZWcuIDE5Mi4xNjguMS4xCi0JQk9PTEVBTiAgICAgICAgICAgICBDQ1hBZGphY2VudEFQUmVwb3J0RmxhZzsgICAgLy9mbGFnIGZvciBkZXRlcm1pbmluZyByZXBvcnQgQXNzb2MgTG9zdCB0aW1lCi0JQ0hBUiAgICAgICAgICAgICAgICBDQ1hBZGphY2VudEFQU3NpZFtNQVhfTEVOX09GX1NTSURdOyAvL0FkamFjZW50IEFQJ3MgU1NJRCByZXBvcnQKLQlVQ0hBUiAgICAgICAgICAgICAgIENDWEFkamFjZW50QVBTc2lkTGVuOyAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgc3NpZCBsZW5ndGggaW4gdXNlZAotCVVDSEFSICAgICAgICAgICAgICAgQ0NYQWRqYWNlbnRBUEJzc2lkW01BQ19BRERSX0xFTl07ICAgICAgICAgLy9BZGphY2VudCBBUCdzIEJTU0lEIHJlcG9ydAotCVVTSE9SVCAgICAgICAgICAgICAgQ0NYQWRqYWNlbnRBUENoYW5uZWw7Ci0JVUxPTkcgICAgICAgICAgICAgICBDQ1hBZGphY2VudEFQTGlua0Rvd25UaW1lOyAgLy9mb3IgU3BlYyBTMzIuCisJdTggRHRpbUNvdW50OwkvKiAwLi4gRHRpbVBlcmlvZC0xICovCisJdTggRHRpbVBlcmlvZDsJLyogZGVmYXVsdCA9IDMgKi8KIAotCVJBTElOS19USU1FUl9TVFJVQ1QJU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXI7Ci0JQk9PTEVBTgkJCQlTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmc7CisJLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworCS8qIFRoaXMgaXMgb25seSBmb3IgV0hRTCB0ZXN0LiAqLworCUJPT0xFQU4gV2hxbFRlc3Q7CisJLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLwogCi0JVUNIQVIgICAgICAgICAgIAlEdGltQ291bnQ7ICAgICAgLy8gMC4uIER0aW1QZXJpb2QtMQotCVVDSEFSICAgICAgICAgICAJRHRpbVBlcmlvZDsgICAgIC8vIGRlZmF1bHQgPSAzCisJc3RydWN0IHJ0X3JhbGlua190aW1lciBXcGFEaXNhc3NvY0FuZEJsb2NrQXNzb2NUaW1lcjsKKwkvKiBGYXN0IFJvYW1pbmcgKi8KKwlCT09MRUFOIGJBdXRvUm9hbWluZzsJLyogMDpkaXNhYmxlIGF1dG8gcm9hbWluZyBieSBSU1NJLCAxOmVuYWJsZSBhdXRvIHJvYW1pbmcgYnkgUlNTSSAqLworCWNoYXIgZEJtVG9Sb2FtOwkJLyogdGhlIGNvbmRpdGlvbiB0byByb2FtIHdoZW4gcmVjZWl2aW5nIFJzc2kgbGVzcyB0aGFuIHRoaXMgdmFsdWUuIEl0J3MgbmVnYXRpdmUgdmFsdWUuICovCiAKLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy8gVGhpcyBpcyBvbmx5IGZvciBXSFFMIHRlc3QuCi0JQk9PTEVBTgkJCQlXaHFsVGVzdDsKLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJQk9PTEVBTiBJRUVFODAyMVg7CisJQk9PTEVBTiBJRUVFODAyMXhfcmVxdWlyZWRfa2V5czsKKwlzdHJ1Y3QgcnRfY2lwaGVyX2tleSBEZXNpcmVTaGFyZWRLZXlbNF07CS8qIFJlY29yZCB1c2VyIGRlc2lyZWQgV0VQIGtleXMgKi8KKwl1OCBEZXNpcmVTaGFyZWRLZXlJZDsKIAotICAgIFJBTElOS19USU1FUl9TVFJVQ1QgV3BhRGlzYXNzb2NBbmRCbG9ja0Fzc29jVGltZXI7Ci0gICAgLy8gRmFzdCBSb2FtaW5nCi0JQk9PTEVBTgkJICAgICAgICBiRmFzdFJvYW1pbmc7ICAgICAgIC8vIDA6ZGlzYWJsZSBmYXN0IHJvYW1pbmcsIDE6ZW5hYmxlIGZhc3Qgcm9hbWluZwotCUNIQVIJCSAgICAgICAgZEJtVG9Sb2FtOyAgICAgICAgICAvLyB0aGUgY29uZGl0aW9uIHRvIHJvYW0gd2hlbiByZWNlaXZpbmcgUnNzaSBsZXNzIHRoYW4gdGhpcyB2YWx1ZS4gSXQncyBuZWdhdGl2ZSB2YWx1ZS4KKwkvKiAwOiBkcml2ZXIgaWdub3JlcyB3cGFfc3VwcGxpY2FudCAqLworCS8qIDE6IHdwYV9zdXBwbGljYW50IGluaXRpYXRlcyBzY2FubmluZyBhbmQgQVAgc2VsZWN0aW9uICovCisJLyogMjogZHJpdmVyIHRha2VzIGNhcmUgb2Ygc2Nhbm5pbmcsIEFQIHNlbGVjdGlvbiwgYW5kIElFRUUgODAyLjExIGFzc29jaWF0aW9uIHBhcmFtZXRlcnMgKi8KKwl1OCBXcGFTdXBwbGljYW50VVA7CisJdTggV3BhU3VwcGxpY2FudFNjYW5Db3VudDsKKwlCT09MRUFOIGJSU05fSUVfRnJvbVdwYVN1cHBsaWNhbnQ7CiAKLSAgICBCT09MRUFOICAgICAgICAgICAgIElFRUU4MDIxWDsKLSAgICBCT09MRUFOICAgICAgICAgICAgIElFRUU4MDIxeF9yZXF1aXJlZF9rZXlzOwotICAgIENJUEhFUl9LRVkJICAgICAgICBEZXNpcmVTaGFyZWRLZXlbNF07CS8vIFJlY29yZCB1c2VyIGRlc2lyZWQgV0VQIGtleXMKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIERlc2lyZVNoYXJlZEtleUlkOworCWNoYXIgZGV2X25hbWVbMTZdOworCXUxNiBPcmlEZXZUeXBlOwogCi0gICAgLy8gMDogZHJpdmVyIGlnbm9yZXMgd3BhX3N1cHBsaWNhbnQKLSAgICAvLyAxOiB3cGFfc3VwcGxpY2FudCBpbml0aWF0ZXMgc2Nhbm5pbmcgYW5kIEFQIHNlbGVjdGlvbgotICAgIC8vIDI6IGRyaXZlciB0YWtlcyBjYXJlIG9mIHNjYW5uaW5nLCBBUCBzZWxlY3Rpb24sIGFuZCBJRUVFIDgwMi4xMSBhc3NvY2lhdGlvbiBwYXJhbWV0ZXJzCi0gICAgVUNIQVIgICAgICAgICAgICAgICBXcGFTdXBwbGljYW50VVA7Ci0JVUNIQVIJCQkJV3BhU3VwcGxpY2FudFNjYW5Db3VudDsKKwlCT09MRUFOIGJUR25XaWZpVGVzdDsKKwlCT09MRUFOIGJTY2FuUmVxSXNGcm9tV2ViVUk7CiAKLSAgICBDSEFSICAgICAgICAgICAgICAgIGRldl9uYW1lWzE2XTsKLSAgICBVU0hPUlQgICAgICAgICAgICAgIE9yaURldlR5cGU7CisJSFRUUkFOU01JVF9TRVRUSU5HIEhUUGh5TW9kZSwgTWF4SFRQaHlNb2RlLCBNaW5IVFBoeU1vZGU7CS8qIEZvciB0cmFuc21pdCBwaHkgc2V0dGluZyBpbiBUWFdJLiAqLworCURFU0lSRURfVFJBTlNNSVRfU0VUVElORyBEZXNpcmVkVHJhbnNtaXRTZXR0aW5nOworCXN0cnVjdCBydF9odF9waHlfaW5mbyBEZXNpcmVkSHRQaHlJbmZvOworCUJPT0xFQU4gYkF1dG9UeFJhdGVTd2l0Y2g7CiAKLSAgICBCT09MRUFOICAgICAgICAgICAgIGJUR25XaWZpVGVzdDsKLQlCT09MRUFOCQkJICAgIGJTY2FuUmVxSXNGcm9tV2ViVUk7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJdTggQkJQUjM7CisJLyogUFMgQ29udHJvbCBoYXMgMiBtZWFuaW5ncyBmb3IgYWR2YW5jZWQgcG93ZXIgc2F2ZSBmdW5jdGlvbi4gKi8KKwkvKiAxLiBFbmFibGVQU2luSWRsZSA6IFdoZW4gbm8gY29ubmVjdGlvbiwgYWx3YXlzIHJhZGlvIG9mZiBleGNlcHQgbmVlZCB0byBkbyBzaXRlIHN1cnZleS4gKi8KKwkvKiAyLiBFbmFibGVOZXdQUyAgOiB3aWxsIHNhdmUgbW9yZSBjdXJyZW50IGluIHNsZWVwIG9yIHJhZGlvIG9mZiBtb2RlLiAqLworCVBTX0NPTlRST0wgUFNDb250cm9sOworI2VuZGlmCQkJCS8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCi0JSFRUUkFOU01JVF9TRVRUSU5HCQkJCUhUUGh5TW9kZSwgTWF4SFRQaHlNb2RlLCBNaW5IVFBoeU1vZGU7Ly8gRm9yIHRyYW5zbWl0IHBoeSBzZXR0aW5nIGluIFRYV0kuCi0JREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HICAgICAgIAlEZXNpcmVkVHJhbnNtaXRTZXR0aW5nOwotCVJUX0hUX1BIWV9JTkZPCQkJCQlEZXNpcmVkSHRQaHlJbmZvOwotCUJPT0xFQU4JCQkJCQkJYkF1dG9UeFJhdGVTd2l0Y2g7CisJQk9PTEVBTiBiQXV0b0Nvbm5lY3RCeUJzc2lkOworCXVuc2lnbmVkIGxvbmcgQmVhY29uTG9zdFRpbWU7CS8qIHNlY29uZHMgKi8KKwlCT09MRUFOIGJGb3JjZVR4QnVyc3Q7CS8qIDE6IGZvcmNlIGVuYmxlIFRYIFBBQ0tFVCBCVVJTVCwgMDogZGlzYWJsZSAqLworfTsKIAotI2lmZGVmIFJUMjg2MAotICAgIFVDSEFSICAgICAgIEJCUFIzOwotI2VuZGlmCi19IFNUQV9BRE1JTl9DT05GSUcsICpQU1RBX0FETUlOX0NPTkZJRzsKKy8qIFRoaXMgZGF0YSBzdHJ1Y3R1cmUga2VlcCB0aGUgY3VycmVudCBhY3RpdmUgQlNTL0lCU1MncyBjb25maWd1cmF0aW9uIHRoYXQgdGhpcyBTVEEgKi8KKy8qIGhhZCBhZ3JlZWQgdXBvbiBqb2luaW5nIHRoZSBuZXR3b3JrLiBXaGljaCBtZWFucyB0aGVzZSBwYXJhbWV0ZXJzIGFyZSB1c3VhbGx5IGRlY2lkZWQgKi8KKy8qIGJ5IHRoZSBCU1MvSUJTUyBjcmVhdG9yIGluc3RlYWQgb2YgdXNlciBjb25maWd1cmF0aW9uLiBEYXRhIGluIHRoaXMgZGF0YSBzdHJ1Y3R1cnJlICovCisvKiBpcyB2YWxpZCBvbmx5IHdoZW4gZWl0aGVyIEFESE9DX09OKHBBZCkgb3IgSU5GUkFfT04ocEFkKSBpcyBUUlVFLiAqLworLyogTm9ybWFsbHksIGFmdGVyIFNDQU4gb3IgZmFpbGVkIHJvYW1pbmcgYXR0ZW1wdHMsIHdlIG5lZWQgdG8gcmVjb3ZlciBiYWNrIHRvICovCisvKiB0aGUgY3VycmVudCBhY3RpdmUgc2V0dGluZ3MuICovCitzdHJ1Y3QgcnRfc3RhX2FjdGl2ZV9jb25maWcgeworCXUxNiBBaWQ7CisJdTE2IEF0aW1XaW47CQkvKiBpbiBrdXNlYzsgSUJTUyBwYXJhbWV0ZXIgc2V0IGVsZW1lbnQgKi8KKwl1MTYgQ2FwYWJpbGl0eUluZm87CisJdTE2IENmcE1heER1cmF0aW9uOworCXUxNiBDZnBQZXJpb2Q7CiAKLS8vIFRoaXMgZGF0YSBzdHJ1Y3R1cmUga2VlcCB0aGUgY3VycmVudCBhY3RpdmUgQlNTL0lCU1MncyBjb25maWd1cmF0aW9uIHRoYXQgdGhpcyBTVEEKLS8vIGhhZCBhZ3JlZWQgdXBvbiBqb2luaW5nIHRoZSBuZXR3b3JrLiBXaGljaCBtZWFucyB0aGVzZSBwYXJhbWV0ZXJzIGFyZSB1c3VhbGx5IGRlY2lkZWQKLS8vIGJ5IHRoZSBCU1MvSUJTUyBjcmVhdG9yIGluc3RlYWQgb2YgdXNlciBjb25maWd1cmF0aW9uLiBEYXRhIGluIHRoaXMgZGF0YSBzdHJ1Y3R1cnJlCi0vLyBpcyB2YWxpZCBvbmx5IHdoZW4gZWl0aGVyIEFESE9DX09OKHBBZCkgb3IgSU5GUkFfT04ocEFkKSBpcyBUUlVFLgotLy8gTm9ybWFsbHksIGFmdGVyIFNDQU4gb3IgZmFpbGVkIHJvYW1pbmcgYXR0ZW1wdHMsIHdlIG5lZWQgdG8gcmVjb3ZlciBiYWNrIHRvCi0vLyB0aGUgY3VycmVudCBhY3RpdmUgc2V0dGluZ3MuCi10eXBlZGVmIHN0cnVjdCBfU1RBX0FDVElWRV9DT05GSUcgewotCVVTSE9SVCAgICAgIEFpZDsKLQlVU0hPUlQgICAgICBBdGltV2luOyAgICAgICAgICAgICAgICAvLyBpbiBrdXNlYzsgSUJTUyBwYXJhbWV0ZXIgc2V0IGVsZW1lbnQKLQlVU0hPUlQgICAgICBDYXBhYmlsaXR5SW5mbzsKLQlVU0hPUlQgICAgICBDZnBNYXhEdXJhdGlvbjsKLQlVU0hPUlQgICAgICBDZnBQZXJpb2Q7CisJLyogQ29weSBzdXBwb3J0ZWQgcmF0ZSBmcm9tIGRlc2lyZWQgQVAncyBiZWFjb24uIFdlIGFyZSB0cnlpbmcgdG8gbWF0Y2ggKi8KKwkvKiBBUCdzIHN1cHBvcnRlZCBhbmQgZXh0ZW5kZWQgcmF0ZSBzZXR0aW5ncy4gKi8KKwl1OCBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwl1OCBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwl1OCBTdXBSYXRlTGVuOworCXU4IEV4dFJhdGVMZW47CisJLyogQ29weSBzdXBwb3J0ZWQgaHQgZnJvbSBkZXNpcmVkIEFQJ3MgYmVhY29uLiBXZSBhcmUgdHJ5aW5nIHRvIG1hdGNoICovCisJc3RydWN0IHJ0X2h0X3BoeV9pbmZvIFN1cHBvcnRlZFBoeUluZm87CisJc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHkgU3VwcG9ydGVkSHRQaHk7Cit9OwogCi0JLy8gQ29weSBzdXBwb3J0ZWQgcmF0ZSBmcm9tIGRlc2lyZWQgQVAncyBiZWFjb24uIFdlIGFyZSB0cnlpbmcgdG8gbWF0Y2gKLQkvLyBBUCdzIHN1cHBvcnRlZCBhbmQgZXh0ZW5kZWQgcmF0ZSBzZXR0aW5ncy4KLQlVQ0hBUiAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUiAgICAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUiAgICAgICBTdXBSYXRlTGVuOwotCVVDSEFSICAgICAgIEV4dFJhdGVMZW47Ci0JLy8gQ29weSBzdXBwb3J0ZWQgaHQgZnJvbSBkZXNpcmVkIEFQJ3MgYmVhY29uLiBXZSBhcmUgdHJ5aW5nIHRvIG1hdGNoCi0JUlRfSFRfUEhZX0lORk8JCVN1cHBvcnRlZFBoeUluZm87Ci0JUlRfSFRfQ0FQQUJJTElUWQlTdXBwb3J0ZWRIdFBoeTsKLX0gU1RBX0FDVElWRV9DT05GSUcsICpQU1RBX0FDVElWRV9DT05GSUc7CitzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5OwogCi0jaWZkZWYgUlQyODcwCi0vLyBmb3IgVVNCIGludGVyZmFjZSwgYXZvaWQgaW4gaW50ZXJydXB0IHdoZW4gd3JpdGUga2V5Ci10eXBlZGVmIHN0cnVjdCAgIFJUX0FERF9QQUlSV0lTRV9LRVlfRU5UUlkgewotICAgICAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyAgICAgICAgIE1hY0FkZHI7Ci0gICAgICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjVGFiTWF0Y2hXQ0lEOyAgICAgICAgLy8gQVNJQwotICAgICAgICBDSVBIRVJfS0VZICAgICAgICAgICAgICAgICAgICAgIENpcGhlcktleTsKLX0gUlRfQUREX1BBSVJXSVNFX0tFWV9FTlRSWSwqUFJUX0FERF9QQUlSV0lTRV9LRVlfRU5UUlk7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCitzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5IHsKKwkvKkNob29zZSAxIGZyb20gVmFsaWRBc1dEUyBhbmQgVmFsaWRBc0NMSSAgdG8gdmFsaWRpemUuICovCisJQk9PTEVBTiBWYWxpZEFzQ0xJOwkvKiBTdGEgbW9kZSwgc2V0IHRoaXMgVFJVRSBhZnRlciBMaW5rdXAsdG9vLiAqLworCUJPT0xFQU4gVmFsaWRBc1dEUzsJLyogVGhpcyBpcyBXRFMgRW50cnkuIG9ubHkgZm9yIEFQIG1vZGUuICovCisJQk9PTEVBTiBWYWxpZEFzQXBDbGk7CS8qVGhpcyBpcyBhIEFQLUNsaWVudCBlbnRyeSwgb25seSBmb3IgQVAgbW9kZSB3aGljaCBlbmFibGUgQVAtQ2xpZW50IGZ1bmN0aW9ucy4gKi8KKwlCT09MRUFOIFZhbGlkQXNNZXNoOworCUJPT0xFQU4gVmFsaWRBc0RsczsJLyogVGhpcyBpcyBETFMgRW50cnkuIG9ubHkgZm9yIFNUQSBtb2RlLiAqLworCUJPT0xFQU4gaXNDYWNoZWQ7CisJQk9PTEVBTiBiSUFtQmFkQXRoZXJvczsJLyogRmxhZyBpZiB0aGlzIGlzIEF0aGVyb3MgY2hpcCB0aGF0IGhhcyBJT1QgcHJvYmxlbS4gIFdlIG5lZWQgdG8gdHVybiBvbiBSVFMvQ1RTIHByb3RlY3Rpb24uICovCiAKLS8vIC0tLS0tLS0tLS0tIHN0YXJ0IG9mIEFQIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBBVVRILVJTUCBTdGF0ZSBNYWNoaW5lIEF1eCBkYXRhIHN0cnVjdHVyZQotdHlwZWRlZiBzdHJ1Y3QgX0FQX01MTUVfQVVYIHsKLQlVQ0hBUiAgICAgICAgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKLQlVU0hPUlQgICAgICAgICAgICAgIEFsZzsKLQlDSEFSICAgICAgICAgICAgICAgIENoYWxsZW5nZVtDSVBIRVJfVEVYVF9MRU5dOwotfSBBUF9NTE1FX0FVWCwgKlBBUF9NTE1FX0FVWDsKLQotLy8gc3RydWN0dXJlIHRvIGRlZmluZSBXUEEgR3JvdXAgS2V5IFJla2V5IEludGVydmFsCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JUXzgwMl8xMV9XUEFfUkVLRVkgewotCVVMT05HIFJlS2V5TWV0aG9kOyAgICAgICAgICAvLyBtZWNoYW5pc20gZm9yIHJla2V5aW5nOiAwOmRpc2FibGUsIDE6IHRpbWUtYmFzZWQsIDI6IHBhY2tldC1iYXNlZAotCVVMT05HIFJlS2V5SW50ZXJ2YWw7ICAgICAgICAvLyB0aW1lLWJhc2VkOiBzZWNvbmRzLCBwYWNrZXQtYmFzZWQ6IGtpbG8tcGFja2V0cwotfSBSVF9XUEFfUkVLRVksKlBSVF9XUEFfUkVLRVksIFJUXzgwMl8xMV9XUEFfUkVLRVksICpQUlRfODAyXzExX1dQQV9SRUtFWTsKLQotdHlwZWRlZiBzdHJ1Y3QgX01BQ19UQUJMRV9FTlRSWSB7Ci0JLy9DaG9vc2UgMSBmcm9tIFZhbGlkQXNXRFMgYW5kIFZhbGlkQXNDTEkgIHRvIHZhbGlkaXplLgotCUJPT0xFQU4JCVZhbGlkQXNDTEk7CQkvLyBTdGEgbW9kZSwgc2V0IHRoaXMgVFJVRSBhZnRlciBMaW5rdXAsdG9vLgotCUJPT0xFQU4JCVZhbGlkQXNXRFM7CS8vIFRoaXMgaXMgV0RTIEVudHJ5LiBvbmx5IGZvciBBUCBtb2RlLgotCUJPT0xFQU4JCVZhbGlkQXNBcENsaTsgICAvL1RoaXMgaXMgYSBBUC1DbGllbnQgZW50cnksIG9ubHkgZm9yIEFQIG1vZGUgd2hpY2ggZW5hYmxlIEFQLUNsaWVudCBmdW5jdGlvbnMuCi0JQk9PTEVBTgkJVmFsaWRBc01lc2g7Ci0JQk9PTEVBTgkJVmFsaWRBc0RsczsJLy8gVGhpcyBpcyBETFMgRW50cnkuIG9ubHkgZm9yIFNUQSBtb2RlLgotCUJPT0xFQU4JCWlzQ2FjaGVkOwotCUJPT0xFQU4JCWJJQW1CYWRBdGhlcm9zOwkvLyBGbGFnIGlmIHRoaXMgaXMgQXRoZXJvcyBjaGlwIHRoYXQgaGFzIElPVCBwcm9ibGVtLiAgV2UgbmVlZCB0byB0dXJuIG9uIFJUUy9DVFMgcHJvdGVjdGlvbi4KLQotCVVDSEFSICAgICAgICAgCUVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nOyAgLy8gRW5xdWV1ZSBFQVBvTC1TdGFydCBmb3IgdHJpZ2dlcmluZyBFQVAgU00KLQkvL2phbiBmb3Igd3BhCi0JLy8gcmVjb3JkIHdoaWNoIGVudHJ5IHJldm9rZSBNSUMgRmFpbHVyZSAsIGlmIGl0IGxlYXZlcyB0aGUgQlNTIGl0c2VsZiwgQVAgd29uJ3QgdXBkYXRlIGFNSUNGYWlsVGltZSBNSUIKLQlVQ0hBUiAgICAgICAgICAgQ01UaW1lclJ1bm5pbmc7Ci0JVUNIQVIgICAgICAgICAgIGFwaWR4OwkJCS8vIE1CU1MgbnVtYmVyCi0JVUNIQVIgICAgICAgICAgIFJTTklFX0xlbjsKLQlVQ0hBUiAgICAgICAgICAgUlNOX0lFW01BWF9MRU5fT0ZfUlNOSUVdOwotCVVDSEFSICAgICAgICAgICBBTm9uY2VbTEVOX0tFWV9ERVNDX05PTkNFXTsKLQlVQ0hBUiAgICAgICAgICAgUl9Db3VudGVyW0xFTl9LRVlfREVTQ19SRVBMQVldOwotCVVDSEFSICAgICAgICAgICBQVEtbNjRdOwotCVVDSEFSICAgICAgICAgICBSZVRyeUNvdW50ZXI7Ci0JUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgICAgICAgICAgICAgUmV0cnlUaW1lcjsKLQlSQUxJTktfVElNRVJfU1RSVUNUCQkJCQlFbnF1ZXVlU3RhcnRGb3JQU0tUaW1lcjsJLy8gQSB0aW1lciB3aGljaCBlbnF1ZXVlIEVBUG9MLVN0YXJ0IGZvciB0cmlnZ2VyaW5nIFBTSyBTTQotCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlOyAgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHRvIHdoYXRldmVyIG1pY3Jvc29mdCBkZWZpbmVkCi0JTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOwotCUFQX1dQQV9TVEFURSAgICBXcGFTdGF0ZTsKLQlHVEtfU1RBVEUgICAgICAgR1RLU3RhdGU7Ci0JVVNIT1JUICAgICAgICAgIFBvcnRTZWN1cmVkOwotCU5ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSICBQcml2YWN5RmlsdGVyOyAgICAgIC8vIFByaXZhY3lGaWx0ZXIgZW51bSBmb3IgODAyLjFYCi0JQ0lQSEVSX0tFWSAgICAgIFBhaXJ3aXNlS2V5OwotCVBWT0lEICAgICAgICAgICBwQWQ7Ci0gICAgSU5UCQkJCVBNS0lEX0NhY2hlSWR4OwotICAgIFVDSEFSCQkJUE1LSURbTEVOX1BNS0lEXTsKLQotCi0JVUNIQVIgICAgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgICAgICAgICAgUHNNb2RlOwotCVNTVCAgICAgICAgICAgICBTc3Q7Ci0JQVVUSF9TVEFURSAgICAgIEF1dGhTdGF0ZTsgLy8gZm9yIFNIQVJFRCBLRVkgYXV0aGVudGljYXRpb24gc3RhdGUgbWFjaGluZSB1c2VkIG9ubHkKLQlCT09MRUFOCQkJSXNSZWFzc29jU3RhOwkvLyBJbmRpY2F0ZSB3aGV0aGVyIHRoaXMgaXMgYSByZWFzc29jaWF0aW9uIHByb2NlZHVyZQotCVVTSE9SVCAgICAgICAgICBBaWQ7Ci0JVVNIT1JUICAgICAgICAgIENhcGFiaWxpdHlJbmZvOwotCVVDSEFSICAgICAgICAgICBMYXN0UnNzaTsKLQlVTE9ORyAgICAgICAgICAgTm9EYXRhSWRsZUNvdW50OwotCVVJTlQxNgkJCVN0YXRpb25LZWVwQWxpdmVDb3VudDsgLy8gdW5pdDogc2Vjb25kCi0JVUxPTkcgICAgICAgICAgIFBzUUlkbGVDb3VudDsKLQlRVUVVRV9IRUFERVIgICAgUHNRdWV1ZTsKLQotCVVJTlQzMgkJCVN0YUNvbm5lY3RUaW1lOwkJLy8gdGhlIGxpdmUgdGltZSBvZiB0aGlzIHN0YXRpb24gc2luY2UgYXNzb2NpYXRlZCB3aXRoIEFQCi0KLQlCT09MRUFOCQkJYlNlbmRCQVI7Ci0JVVNIT1JUCQkJTm9CQURhdGFDb3VudERvd247Ci0KLQlVSU5UMzIgICAJCUNhY2hlZEJ1ZlsxNl07CQkvLyBVSU5UICg0IGJ5dGVzKSBmb3IgYWxpZ25tZW50Ci0JVUlOVAkJCVR4QkZDb3VudDsgLy8gMyozCi0JVUlOVAkJCUZJRk9Db3VudDsKLQlVSU5UCQkJRGVidWdGSUZPQ291bnQ7Ci0JVUlOVAkJCURlYnVnVHhDb3VudDsKLSAgICBCT09MRUFOCQkJYkRsc0luaXQ7Ci0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vL1dEUyBlbnRyeSBuZWVkcyB0aGVzZQotLy8gcnQyODYwIGFkZCB0aGlzLiBpZiBWYWxpZEFzV0RTPT1UUlVFLCBNYXRjaFdEU1RhYklkeCBpcyB0aGUgaW5kZXggaW4gV2RzVGFiLk1hY1RhYgotCVVJTlQJCQlNYXRjaFdEU1RhYklkeDsKLQlVQ0hBUiAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZTsKLQlVQ0hBUiAgICAgICAgICAgQ3VyclR4UmF0ZTsKLQlVQ0hBUiAgICAgICAgICAgQ3VyclR4UmF0ZUluZGV4OwotCS8vIHRvIHJlY29yZCB0aGUgZWFjaCBUWCByYXRlJ3MgcXVhbGl0eS4gMCBpcyBiZXN0LCB0aGUgYmlnZ2VyIHRoZSB3b3JzZS4KLQlVU0hPUlQgICAgICAgICAgVHhRdWFsaXR5W01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKLQlVSU5UMzIJCQlPbmVTZWNUeE5vUmV0cnlPa0NvdW50OwotCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeFJldHJ5T2tDb3VudDsKLQlVSU5UMzIgICAgICAgICAgT25lU2VjVHhGYWlsQ291bnQ7Ci0JVUlOVDMyCQkJQ29udGludWVUeEZhaWxDbnQ7Ci0JVUlOVDMyICAgICAgICAgIEN1cnJUeFJhdGVTdGFibGVUaW1lOyAvLyAjIG9mIHNlY29uZCBpbiBjdXJyZW50IFRYIHJhdGUKLQlVQ0hBUiAgICAgICAgICAgVHhSYXRlVXBQZW5hbHR5OyAgICAgIC8vIGV4dHJhICMgb2Ygc2Vjb25kIHBlbmFsdHkgZHVlIHRvIGxhc3QgdW5zdGFibGUgY29uZGl0aW9uCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCUJPT0xFQU4gICAgICAgICBmTm9pc3lFbnZpcm9ubWVudDsKLQlCT09MRUFOCQkJZkxhc3RTZWNBY2NvcmRpbmdSU1NJOwotCVVDSEFSICAgICAgICAgICBMYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOyAvLyAwOiBubyBjaGFuZ2UsIDE6cmF0ZSBVUCwgMjpyYXRlIGRvd24KLQlDSEFSCQkJTGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb247IC8vS2VlcCBsYXN0IHRpbWUgdmFsdWUgb2YgTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbgotCVVMT05HCQkJTGFzdFR4T2tDb3VudDsKLQlVQ0hBUiAgICAgICAgICAgUEVSW01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKLQotCS8vIGEgYml0bWFwIG9mIEJPT0xFQU4gZmxhZ3MuIGVhY2ggYml0IHJlcHJlc2VudCBhbiBvcGVyYXRpb24gc3RhdHVzIG9mIGEgcGFydGljdWxhcgotCS8vIEJPT0xFQU4gY29udHJvbCwgZWl0aGVyIE9OIG9yIE9GRi4gVGhlc2UgZmxhZ3Mgc2hvdWxkIGFsd2F5cyBiZSBhY2Nlc3NlZCB2aWEKLQkvLyBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRygpLCBDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCksIENMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRygpIG1hY3Jvcy4KLQkvLyBzZWUgZk9QX1NUQVRVU194eHggaW4gUlRNUF9ERUYuQyBmb3IgZGV0YWlsIGJpdCBkZWZpbml0aW9uLiBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQKLQlVTE9ORyAgICAgICAgICAgQ2xpZW50U3RhdHVzRmxhZ3M7Ci0KLQlIVFRSQU5TTUlUX1NFVFRJTkcJSFRQaHlNb2RlLCBNYXhIVFBoeU1vZGUsIE1pbkhUUGh5TW9kZTsvLyBGb3IgdHJhbnNtaXQgcGh5IHNldHRpbmcgaW4gVFhXSS4KLQotCS8vIEhUIEVXQyBNSU1PLU4gdXNlZCBwYXJhbWV0ZXJzCi0JVVNIT1JUCQlSWEJBYml0bWFwOwkvLyBmaWxsIHRvIG9uLWNoaXAgIFJYV0lfQkFfQklUTUFTSyBpbiA4LjEuM1JYIGF0dHJpYnV0ZSBlbnRyeSBmb3JtYXQKLQlVU0hPUlQJCVRYQkFiaXRtYXA7CS8vIFRoaXMgYml0bWFwIGFzIG9yaWdpbmF0b3IsIG9ubHkga2VlcCBpbiBzb2Z0d2FyZSB1c2VkIHRvIG1hcmsgQU1QRFUgYml0IGluIFRYV0kKLQlVU0hPUlQJCVRYQXV0b0JBYml0bWFwOwotCVVTSE9SVAkJQkFEZWNsaW5lQml0bWFwOwotCVVTSE9SVAkJQkFSZWNXY2lkQXJyYXlbTlVNX09GX1RJRF07CS8vIFRoZSBtYXBwaW5nIHdjaWQgb2YgcmVjaXBpZW50IHNlc3Npb24uIGlmIFJYQkFiaXRtYXAgYml0IGlzIG1hc2tlZAotCVVTSE9SVAkJQkFPcmlXY2lkQXJyYXlbTlVNX09GX1RJRF07IC8vIFRoZSBtYXBwaW5nIHdjaWQgb2Ygb3JpZ2luYXRvciBzZXNzaW9uLiBpZiBUWEJBYml0bWFwIGJpdCBpcyBtYXNrZWQKLQlVU0hPUlQJCUJBT3JpU2VxdWVuY2VbTlVNX09GX1RJRF07IC8vIFRoZSBtYXBwaW5nIHdjaWQgb2Ygb3JpZ2luYXRvciBzZXNzaW9uLiBpZiBUWEJBYml0bWFwIGJpdCBpcyBtYXNrZWQKLQotCS8vIDgwMi4xMW4gZmVhdHVyZXMuCi0JVUNIQVIJCU1wZHVEZW5zaXR5OwotCVVDSEFSCQlNYXhSQW1wZHVGYWN0b3I7Ci0JVUNIQVIJCUFNc2R1U2l6ZTsKLQlVQ0hBUgkJTW1wc01vZGU7CS8vIE1JTU8gcG93ZXIgc2F2ZSBtb3JlLgotCi0JSFRfQ0FQQUJJTElUWV9JRQkJSFRDYXBhYmlsaXR5OwotCi0JQk9PTEVBTgkJYkF1dG9UeFJhdGVTd2l0Y2g7Ci0KLQlVQ0hBUiAgICAgICBSYXRlTGVuOwotCXN0cnVjdCBfTUFDX1RBQkxFX0VOVFJZICpwTmV4dDsKLSAgICBVU0hPUlQgICAgICBUeFNlcVtOVU1fT0ZfVElEXTsKLQlVU0hPUlQJCU5vblFvc0RhdGFTZXE7Ci0KLQlSU1NJX1NBTVBMRQlSc3NpU2FtcGxlOwotCi0JVUlOVDMyCQkJVFhNQ1NFeHBlY3RlZFsxNl07Ci0JVUlOVDMyCQkJVFhNQ1NTdWNjZXNzZnVsWzE2XTsKLQlVSU5UMzIJCQlUWE1DU0ZhaWxlZFsxNl07Ci0JVUlOVDMyCQkJVFhNQ1NBdXRvRmFsbEJhY2tbMTZdWzE2XTsKLSNpZmRlZiBSVDI4NzAKLQlVTE9ORyAgIAkJTGFzdEJlYWNvblJ4VGltZTsKLSNlbmRpZgotfSBNQUNfVEFCTEVfRU5UUlksICpQTUFDX1RBQkxFX0VOVFJZOwotCi10eXBlZGVmIHN0cnVjdCBfTUFDX1RBQkxFIHsKLQlVU0hPUlQJCQlTaXplOwotCU1BQ19UQUJMRV9FTlRSWSAqSGFzaFtIQVNIX1RBQkxFX1NJWkVdOwotCU1BQ19UQUJMRV9FTlRSWSBDb250ZW50W01BWF9MRU5fT0ZfTUFDX1RBQkxFXTsKLQlRVUVVRV9IRUFERVIgICAgTWNhc3RQc1F1ZXVlOwotCVVMT05HICAgICAgICAgICBQc1FJZGxlQ291bnQ7Ci0JQk9PTEVBTiAgICAgICAgIGZBbnlTdGF0aW9uSW5Qc207Ci0JQk9PTEVBTiAgICAgICAgIGZBbnlTdGF0aW9uQmFkQXRoZXJvczsJLy8gQ2hlY2sgaWYgYW55IFN0YXRpb24gaXMgYXRoZXJvcyA4MDIuMTFuIENoaXAuICBXZSBuZWVkIHRvIHVzZSBSVFMvQ1RTIHdpdGggQXRoZXJvcyA4MDIsLjExbiBjaGlwLgotCUJPT0xFQU4JCQlmQW55VHhPUEZvcmNlRGlzYWJsZTsJLy8gQ2hlY2sgaWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGRpc2FibGUgQkUgVHhPUAotI2lmZGVmIFJUMjg3MAotCUJPT0xFQU4JCQlmQWxsU3RhdGlvbkFzUmFsaW5rOyAJLy8gQ2hlY2sgaWYgYWxsIHN0YXRpb25zIGFyZSByYWxpbmstY2hpcHNldAotI2VuZGlmCi0JQk9PTEVBTiAgICAgICAgIGZBbnlTdGF0aW9uSXNMZWdhY3k7CS8vIENoZWNrIGlmIEkgdXNlIGxlZ2FjeSByYXRlIHRvIHRyYW5zbWl0IHRvIG15IEJTUyBTdGF0aW9uLwotCUJPT0xFQU4gICAgICAgICBmQW55U3RhdGlvbk5vbkdGOwkJLy8gQ2hlY2sgaWYgYW55IFN0YXRpb24gY2FuJ3Qgc3VwcG9ydCBHRi4KLQlCT09MRUFOICAgICAgICAgZkFueVN0YXRpb24yME9ubHk7CQkvLyBDaGVjayBpZiBhbnkgU3RhdGlvbiBjYW4ndCBzdXBwb3J0IEdGLgotCUJPT0xFQU4JCQlmQW55U3RhdGlvbk1JTU9QU0R5bmFtaWM7IC8vIENoZWNrIGlmIGFueSBTdGF0aW9uIGlzIE1JTU8gRHluYW1pYwotCUJPT0xFQU4gICAgICAgICBmQW55QkFTZXNzaW9uOyAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIEJBIHNlc3Npb24uICBGb3JjZSB0dXJuIG9uIFJUUy9DVFMKLX0gTUFDX1RBQkxFLCAqUE1BQ19UQUJMRTsKLQotI2RlZmluZSBJU19IVF9TVEEoX3BNYWNFbnRyeSkJXAotCShfcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQotCi0jZGVmaW5lIElTX0hUX1JBVEUoX3BNYWNFbnRyeSkJXAotCShfcE1hY0VudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQotCi0jZGVmaW5lIFBFRVJfSVNfSFRfUkFURShfcE1hY0VudHJ5KQlcCi0JKF9wTWFjRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCi0KLXR5cGVkZWYgc3RydWN0IF9XRFNfRU5UUlkgewotCUJPT0xFQU4gICAgICAgICBWYWxpZDsKLQlVQ0hBUiAgICAgICAgICAgQWRkcltNQUNfQUREUl9MRU5dOwotCVVMT05HICAgICAgICAgICBOb0RhdGFJZGxlQ291bnQ7Ci0Jc3RydWN0IF9XRFNfRU5UUlkgKnBOZXh0OwotfSBXRFNfRU5UUlksICpQV0RTX0VOVFJZOworCXU4IEVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nOwkvKiBFbnF1ZXVlIEVBUG9MLVN0YXJ0IGZvciB0cmlnZ2VyaW5nIEVBUCBTTSAqLworCS8qamFuIGZvciB3cGEgKi8KKwkvKiByZWNvcmQgd2hpY2ggZW50cnkgcmV2b2tlIE1JQyBGYWlsdXJlICwgaWYgaXQgbGVhdmVzIHRoZSBCU1MgaXRzZWxmLCBBUCB3b24ndCB1cGRhdGUgYU1JQ0ZhaWxUaW1lIE1JQiAqLworCXU4IENNVGltZXJSdW5uaW5nOworCXU4IGFwaWR4OwkJLyogTUJTUyBudW1iZXIgKi8KKwl1OCBSU05JRV9MZW47CisJdTggUlNOX0lFW01BWF9MRU5fT0ZfUlNOSUVdOworCXU4IEFOb25jZVtMRU5fS0VZX0RFU0NfTk9OQ0VdOworCXU4IFNOb25jZVtMRU5fS0VZX0RFU0NfTk9OQ0VdOworCXU4IFJfQ291bnRlcltMRU5fS0VZX0RFU0NfUkVQTEFZXTsKKwl1OCBQVEtbNjRdOworCXU4IFJlVHJ5Q291bnRlcjsKKwlzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyIFJldHJ5VGltZXI7CisJc3RydWN0IHJ0X3JhbGlua190aW1lciBFbnF1ZXVlU3RhcnRGb3JQU0tUaW1lcjsJLyogQSB0aW1lciB3aGljaCBlbnF1ZXVlIEVBUG9MLVN0YXJ0IGZvciB0cmlnZ2VyaW5nIFBTSyBTTSAqLworCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgQXV0aE1vZGU7CS8qIFRoaXMgc2hvdWxkIG1hdGNoIHRvIHdoYXRldmVyIG1pY3Jvc29mdCBkZWZpbmVkICovCisJTkRJU184MDJfMTFfV0VQX1NUQVRVUyBXZXBTdGF0dXM7CisJTkRJU184MDJfMTFfV0VQX1NUQVRVUyBHcm91cEtleVdlcFN0YXR1czsKKwlBUF9XUEFfU1RBVEUgV3BhU3RhdGU7CisJR1RLX1NUQVRFIEdUS1N0YXRlOworCXUxNiBQb3J0U2VjdXJlZDsKKwlORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUiBQcml2YWN5RmlsdGVyOwkvKiBQcml2YWN5RmlsdGVyIGVudW0gZm9yIDgwMi4xWCAqLworCXN0cnVjdCBydF9jaXBoZXJfa2V5IFBhaXJ3aXNlS2V5OworCXZvaWQgKnBBZDsKKwlpbnQgUE1LSURfQ2FjaGVJZHg7CisJdTggUE1LSURbTEVOX1BNS0lEXTsKIAotdHlwZWRlZiBzdHJ1Y3QgIF9XRFNfVEFCTEVfRU5UUlkgewotCVVTSE9SVAkJCVNpemU7Ci0JVUNIQVIgICAgICAgICAgIFdkc0FkZHJbTUFDX0FERFJfTEVOXTsKLQlXRFNfRU5UUlkgICAgICAgKkhhc2hbSEFTSF9UQUJMRV9TSVpFXTsKLQlXRFNfRU5UUlkgICAgICAgQ29udGVudFtNQVhfTEVOX09GX01BQ19UQUJMRV07Ci0JVUNIQVIgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGU7Ci0JVUNIQVIgICAgICAgICAgIEN1cnJUeFJhdGU7Ci0JVVNIT1JUICAgICAgICAgIFR4UXVhbGl0eVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ci0JVVNIT1JUICAgICAgICAgIE9uZVNlY1R4T2tDb3VudDsKLQlVU0hPUlQgICAgICAgICAgT25lU2VjVHhSZXRyeU9rQ291bnQ7Ci0JVVNIT1JUICAgICAgICAgIE9uZVNlY1R4RmFpbENvdW50OwotCVVMT05HICAgICAgICAgICBDdXJyVHhSYXRlU3RhYmxlVGltZTsgLy8gIyBvZiBzZWNvbmQgaW4gY3VycmVudCBUWCByYXRlCi0JVUNIQVIgICAgICAgICAgIFR4UmF0ZVVwUGVuYWx0eTsgICAgICAvLyBleHRyYSAjIG9mIHNlY29uZCBwZW5hbHR5IGR1ZSB0byBsYXN0IHVuc3RhYmxlIGNvbmRpdGlvbgotfSBXRFNfVEFCTEVfRU5UUlksICpQV0RTX1RBQkxFX0VOVFJZOworCXU4IEFkZHJbTUFDX0FERFJfTEVOXTsKKwl1OCBQc01vZGU7CisJU1NUIFNzdDsKKwlBVVRIX1NUQVRFIEF1dGhTdGF0ZTsJLyogZm9yIFNIQVJFRCBLRVkgYXV0aGVudGljYXRpb24gc3RhdGUgbWFjaGluZSB1c2VkIG9ubHkgKi8KKwlCT09MRUFOIElzUmVhc3NvY1N0YTsJLyogSW5kaWNhdGUgd2hldGhlciB0aGlzIGlzIGEgcmVhc3NvY2lhdGlvbiBwcm9jZWR1cmUgKi8KKwl1MTYgQWlkOworCXUxNiBDYXBhYmlsaXR5SW5mbzsKKwl1OCBMYXN0UnNzaTsKKwl1bnNpZ25lZCBsb25nIE5vRGF0YUlkbGVDb3VudDsKKwl1MTYgU3RhdGlvbktlZXBBbGl2ZUNvdW50OwkvKiB1bml0OiBzZWNvbmQgKi8KKwl1bnNpZ25lZCBsb25nIFBzUUlkbGVDb3VudDsKKwlzdHJ1Y3QgcnRfcXVldWVfaGVhZGVyIFBzUXVldWU7CiAKLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfV0RTX0VOVFJZIHsKLQlQTkVUX0RFVgkJCWRldjsKLQlVQ0hBUgkJCQlWYWxpZDsKLQlVQ0hBUgkJCQlQaHlNb2RlOwotCVVDSEFSCQkJCVBlZXJXZHNBZGRyW01BQ19BRERSX0xFTl07Ci0JVUNIQVIJCQkJTWFjVGFiTWF0Y2hXQ0lEOwkvLyBBU0lDCi0JTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgV2VwU3RhdHVzOwotCVVDSEFSCQkJCQlLZXlJZHg7Ci0JQ0lQSEVSX0tFWSAgICAgICAgICAJV2RzS2V5OwotCUhUVFJBTlNNSVRfU0VUVElORwkJCQlIVFBoeU1vZGUsIE1heEhUUGh5TW9kZSwgTWluSFRQaHlNb2RlOwotCVJUX0hUX1BIWV9JTkZPCQkJCQlEZXNpcmVkSHRQaHlJbmZvOwotCUJPT0xFQU4JCQkJCQkJYkF1dG9UeFJhdGVTd2l0Y2g7Ci0JREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HICAgICAgIAlEZXNpcmVkVHJhbnNtaXRTZXR0aW5nOyAvLyBEZXNpcmVkIHRyYW5zbWl0IHNldHRpbmcuCi19IFJUXzgwMl8xMV9XRFNfRU5UUlksICpQUlRfODAyXzExX1dEU19FTlRSWTsKKwl1MzIgU3RhQ29ubmVjdFRpbWU7CS8qIHRoZSBsaXZlIHRpbWUgb2YgdGhpcyBzdGF0aW9uIHNpbmNlIGFzc29jaWF0ZWQgd2l0aCBBUCAqLwogCi10eXBlZGVmIHN0cnVjdCBfV0RTX1RBQkxFIHsKLQlVQ0hBUiAgICAgICAgICAgICAgIE1vZGU7Ci0JVUxPTkcgICAgICAgICAgICAgICBTaXplOwotCVJUXzgwMl8xMV9XRFNfRU5UUlkJV2RzRW50cnlbTUFYX1dEU19FTlRSWV07Ci19IFdEU19UQUJMRSwgKlBXRFNfVEFCTEU7CisJQk9PTEVBTiBiU2VuZEJBUjsKKwl1MTYgTm9CQURhdGFDb3VudERvd247CiAKLXR5cGVkZWYgc3RydWN0IF9BUENMSV9TVFJVQ1QgewotCVBORVRfREVWCQkJCWRldjsKLSNpZmRlZiBSVEw4NjVYX1NPQwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIG15bGlua2lkOwotI2VuZGlmCi0JQk9PTEVBTiAgICAgICAgICAgICAgICAgRW5hYmxlOwkvLyBTZXQgaXQgYXMgMSBpZiB0aGUgYXBjbGkgaW50ZXJmYWNlIHdhcyBjb25maWd1cmVkIHRvICIxIiAgb3IgYnkgaXdwcml2IGNtZCAiQXBDbGlFbmFibGUiCi0JQk9PTEVBTiAgICAgICAgICAgICAgICAgVmFsaWQ7CS8vIFNldCBpdCBhcyAxIGlmIHRoZSBhcGNsaSBpbnRlcmZhY2UgYXNzb2NpYXRlZCBzdWNjZXNzIHRvIHJlbW90ZSBBUC4KLQlVQ0hBUgkJCQkJTWFjVGFiV0NJRDsJLy9XQ0lEIHZhbHVlLCB3aGljaCBwb2ludCB0byB0aGUgZW50cnkgb2YgQVNJQyBNYWMgdGFibGUuCi0JVUNIQVIgICAgICAgICAgICAgICAgICAgU3NpZExlbjsKLQlDSEFSICAgICAgICAgICAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisJdTMyIENhY2hlZEJ1ZlsxNl07CS8qIHUzMiAoNCBieXRlcykgZm9yIGFsaWdubWVudCAqLworCXUzMiBUeEJGQ291bnQ7CQkvKiAzKjMgKi8KKwl1MzIgRklGT0NvdW50OworCXUzMiBEZWJ1Z0ZJRk9Db3VudDsKKwl1MzIgRGVidWdUeENvdW50OworCUJPT0xFQU4gYkRsc0luaXQ7CiAKLQlVQ0hBUiAgICAgICAgICAgICAgICAgICBDZmdTc2lkTGVuOwotCUNIQVIgICAgICAgICAgICAgICAgICAgIENmZ1NzaWRbTUFYX0xFTl9PRl9TU0lEXTsKLQlVQ0hBUiAgICAgICAgICAgICAgICAgICBDZmdBcENsaUJzc2lkW0VUSF9MRU5HVEhfT0ZfQUREUkVTU107Ci0JVUNIQVIgICAgICAgICAgICAgICAgICAgQ3VycmVudEFkZHJlc3NbRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLypXRFMgZW50cnkgbmVlZHMgdGhlc2UgKi8KKy8qIGlmIFZhbGlkQXNXRFM9PVRSVUUsIE1hdGNoV0RTVGFiSWR4IGlzIHRoZSBpbmRleCBpbiBXZHNUYWIuTWFjVGFiICovCisJdTMyIE1hdGNoV0RTVGFiSWR4OworCXU4IE1heFN1cHBvcnRlZFJhdGU7CisJdTggQ3VyclR4UmF0ZTsKKwl1OCBDdXJyVHhSYXRlSW5kZXg7CisJLyogdG8gcmVjb3JkIHRoZSBlYWNoIFRYIHJhdGUncyBxdWFsaXR5LiAwIGlzIGJlc3QsIHRoZSBiaWdnZXIgdGhlIHdvcnNlLiAqLworCXUxNiBUeFF1YWxpdHlbTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0hdOworLyogICAgICB1MTYgICAgICAgICAgT25lU2VjVHhPa0NvdW50OyAqLworCXUzMiBPbmVTZWNUeE5vUmV0cnlPa0NvdW50OworCXUzMiBPbmVTZWNUeFJldHJ5T2tDb3VudDsKKwl1MzIgT25lU2VjVHhGYWlsQ291bnQ7CisJdTMyIENvbnRpbnVlVHhGYWlsQ250OworCXUzMiBDdXJyVHhSYXRlU3RhYmxlVGltZTsJLyogIyBvZiBzZWNvbmQgaW4gY3VycmVudCBUWCByYXRlICovCisJdTggVHhSYXRlVXBQZW5hbHR5OwkvKiBleHRyYSAjIG9mIHNlY29uZCBwZW5hbHR5IGR1ZSB0byBsYXN0IHVuc3RhYmxlIGNvbmRpdGlvbiAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBBcENsaVJjdkJlYWNvblRpbWU7CisJQk9PTEVBTiBmTm9pc3lFbnZpcm9ubWVudDsKKwlCT09MRUFOIGZMYXN0U2VjQWNjb3JkaW5nUlNTSTsKKwl1OCBMYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOwkvKiAwOiBubyBjaGFuZ2UsIDE6cmF0ZSBVUCwgMjpyYXRlIGRvd24gKi8KKwljaGFyIExhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uOwkvKktlZXAgbGFzdCB0aW1lIHZhbHVlIG9mIExhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gKi8KKwl1bnNpZ25lZCBsb25nIExhc3RUeE9rQ291bnQ7CisJdTggUEVSW01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKIAotCVVMT05HICAgICAgICAgICAgICAgICAgIEN0cmxDdXJyU3RhdGU7Ci0JVUxPTkcgICAgICAgICAgICAgICAgICAgU3luY0N1cnJTdGF0ZTsKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBBdXRoQ3VyclN0YXRlOwotCVVMT05HICAgICAgICAgICAgICAgICAgIEFzc29jQ3VyclN0YXRlOwotCVVMT05HCQkJCQlXcGFQc2tDdXJyU3RhdGU7CisJLyogYSBiaXRtYXAgb2YgQk9PTEVBTiBmbGFncy4gZWFjaCBiaXQgcmVwcmVzZW50IGFuIG9wZXJhdGlvbiBzdGF0dXMgb2YgYSBwYXJ0aWN1bGFyICovCisJLyogQk9PTEVBTiBjb250cm9sLCBlaXRoZXIgT04gb3IgT0ZGLiBUaGVzZSBmbGFncyBzaG91bGQgYWx3YXlzIGJlIGFjY2Vzc2VkIHZpYSAqLworCS8qIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKCksIENMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoKSwgQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKCkgbWFjcm9zLiAqLworCS8qIHNlZSBmT1BfU1RBVFVTX3h4eCBpbiBSVE1QX0RFRi5DIGZvciBkZXRhaWwgYml0IGRlZmluaXRpb24uIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRCAqLworCXVuc2lnbmVkIGxvbmcgQ2xpZW50U3RhdHVzRmxhZ3M7CiAKLQlVU0hPUlQgICAgICAgICAgICAgICAgICBBdXRoUmVxQ250OwotCVVTSE9SVCAgICAgICAgICAgICAgICAgIEFzc29jUmVxQ250OworCUhUVFJBTlNNSVRfU0VUVElORyBIVFBoeU1vZGUsIE1heEhUUGh5TW9kZSwgTWluSFRQaHlNb2RlOwkvKiBGb3IgdHJhbnNtaXQgcGh5IHNldHRpbmcgaW4gVFhXSS4gKi8KIAotCVVMT05HICAgICAgICAgICAgICAgICAgIENsaWVudFN0YXR1c0ZsYWdzOwotCVVDSEFSICAgICAgICAgICAgICAgICAgIE1wZHVEZW5zaXR5OworCS8qIEhUIEVXQyBNSU1PLU4gdXNlZCBwYXJhbWV0ZXJzICovCisJdTE2IFJYQkFiaXRtYXA7CS8qIGZpbGwgdG8gb24tY2hpcCAgUlhXSV9CQV9CSVRNQVNLIGluIDguMS4zUlggYXR0cmlidXRlIGVudHJ5IGZvcm1hdCAqLworCXUxNiBUWEJBYml0bWFwOwkvKiBUaGlzIGJpdG1hcCBhcyBvcmlnaW5hdG9yLCBvbmx5IGtlZXAgaW4gc29mdHdhcmUgdXNlZCB0byBtYXJrIEFNUERVIGJpdCBpbiBUWFdJICovCisJdTE2IFRYQXV0b0JBYml0bWFwOworCXUxNiBCQURlY2xpbmVCaXRtYXA7CisJdTE2IEJBUmVjV2NpZEFycmF5W05VTV9PRl9USURdOwkvKiBUaGUgbWFwcGluZyB3Y2lkIG9mIHJlY2lwaWVudCBzZXNzaW9uLiBpZiBSWEJBYml0bWFwIGJpdCBpcyBtYXNrZWQgKi8KKwl1MTYgQkFPcmlXY2lkQXJyYXlbTlVNX09GX1RJRF07CS8qIFRoZSBtYXBwaW5nIHdjaWQgb2Ygb3JpZ2luYXRvciBzZXNzaW9uLiBpZiBUWEJBYml0bWFwIGJpdCBpcyBtYXNrZWQgKi8KKwl1MTYgQkFPcmlTZXF1ZW5jZVtOVU1fT0ZfVElEXTsJLyogVGhlIG1hcHBpbmcgd2NpZCBvZiBvcmlnaW5hdG9yIHNlc3Npb24uIGlmIFRYQkFiaXRtYXAgYml0IGlzIG1hc2tlZCAqLwogCi0JTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGU7ICAgLy8gVGhpcyBzaG91bGQgbWF0Y2ggdG8gd2hhdGV2ZXIgbWljcm9zb2Z0IGRlZmluZWQKLQlORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7CisJLyogODAyLjExbiBmZWF0dXJlcy4gKi8KKwl1OCBNcGR1RGVuc2l0eTsKKwl1OCBNYXhSQW1wZHVGYWN0b3I7CisJdTggQU1zZHVTaXplOworCXU4IE1tcHNNb2RlOwkJLyogTUlNTyBwb3dlciBzYXZlIG1vcmUuICovCiAKLQkvLyBBZGQgdG8gc3VwcG9ydCBkaWZmZXJlbnQgY2lwaGVyIHN1aXRlIGZvciBXUEEyL1dQQSBtb2RlCi0JTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJCUdyb3VwQ2lwaGVyOwkJLy8gTXVsdGljYXN0IGNpcGhlciBzdWl0ZQotCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCQlQYWlyQ2lwaGVyOwkJCS8vIFVuaWNhc3QgY2lwaGVyIHN1aXRlCi0JQk9PTEVBTgkJCQkJCQkJYk1peENpcGhlcjsJCQkvLyBJbmRpY2F0ZSBjdXJyZW50IFBhaXIgJiBHcm91cCB1c2UgZGlmZmVyZW50IGNpcGhlciBzdWl0ZXMKLQlVU0hPUlQJCQkJCQkJCVJzbkNhcGFiaWxpdHk7CisJc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHlfaWUgSFRDYXBhYmlsaXR5OwogCi0JVUNIQVIJCVBTS1sxMDBdOwkJCQkvLyByZXNlcnZlIFBTSyBrZXkgbWF0ZXJpYWwKLQlVQ0hBUiAgICAgICBQU0tMZW47Ci0JVUNIQVIgICAgICAgUE1LWzMyXTsgICAgICAgICAgICAgICAgLy8gV1BBIFBTSyBtb2RlIFBNSwotCVVDSEFSCQlHVEtbMzJdOwkJCQkvLyBHVEsgZnJvbSBhdXRoZW50aWNhdG9yCisJQk9PTEVBTiBiQXV0b1R4UmF0ZVN3aXRjaDsKIAotCUNJUEhFUl9LRVkgICAgICBTaGFyZWRLZXlbU0hBUkVfS0VZX05VTV07Ci0JVUNIQVIgICAgICAgICAgIERlZmF1bHRLZXlJZDsKKwl1OCBSYXRlTGVuOworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBOZXh0OworCXUxNiBUeFNlcVtOVU1fT0ZfVElEXTsKKwl1MTYgTm9uUW9zRGF0YVNlcTsKIAotCS8vIHN0b3JlIFJTTl9JRSBidWlsdCBieSBkcml2ZXIKLQlVQ0hBUgkJUlNOX0lFW01BWF9MRU5fT0ZfUlNOSUVdOyAgLy8gVGhlIGNvbnRlbnQgc2F2ZWQgaGVyZSBzaG91bGQgYmUgY29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KLQlVQ0hBUgkJUlNOSUVfTGVuOworCXN0cnVjdCBydF9yc3NpX3NhbXBsZSBSc3NpU2FtcGxlOwogCi0JLy8gRm9yIFdQQSBjb3VudGVybWVhc3VyZXMKLQlVTE9ORyAgICAgICBMYXN0TWljRXJyb3JUaW1lOyAgIC8vIHJlY29yZCBsYXN0IE1JQyBlcnJvciB0aW1lCi0JQk9PTEVBTiAgICAgICAgICAgICAgICAgYkJsb2NrQXNzb2M7IC8vIEJsb2NrIGFzc29jaWF0ZSBhdHRlbXB0IGZvciA2MCBzZWNvbmRzIGFmdGVyIGNvdW50ZXIgbWVhc3VyZSBvY2N1cnJlZC4KKwl1MzIgVFhNQ1NFeHBlY3RlZFsxNl07CisJdTMyIFRYTUNTU3VjY2Vzc2Z1bFsxNl07CisJdTMyIFRYTUNTRmFpbGVkWzE2XTsKKwl1MzIgVFhNQ1NBdXRvRmFsbEJhY2tbMTZdWzE2XTsKIAotCS8vIEZvciBXUEEtUFNLIHN1cHBsaWNhbnQgc3RhdGUKLQlVQ0hBUiAgICAgICAJU05vbmNlWzMyXTsgICAgICAgICAvLyBTTm9uY2UgZm9yIFdQQS1QU0sKLQlVQ0hBUgkJCUdOb25jZVszMl07CQkJLy8gR05vbmNlIGZvciBXUEEtUFNLIGZyb20gYXV0aGVudGljYXRvcgorCXVuc2lnbmVkIGxvbmcgTGFzdEJlYWNvblJ4VGltZTsKIAotCUhUVFJBTlNNSVRfU0VUVElORwkJCQlIVFBoeU1vZGUsIE1heEhUUGh5TW9kZSwgTWluSFRQaHlNb2RlOwotCVJUX0hUX1BIWV9JTkZPCQkJCQlEZXNpcmVkSHRQaHlJbmZvOwotCUJPT0xFQU4JCQkJCQkJYkF1dG9UeFJhdGVTd2l0Y2g7Ci0JREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HICAgICAgIAlEZXNpcmVkVHJhbnNtaXRTZXR0aW5nOyAvLyBEZXNpcmVkIHRyYW5zbWl0IHNldHRpbmcuCi19IEFQQ0xJX1NUUlVDVCwgKlBBUENMSV9TVFJVQ1Q7CisJdW5zaWduZWQgbG9uZyBBc3NvY0RlYWRMaW5lOworfTsKIAotLy8gLS0tLS0tLS0tLS0gZW5kIG9mIEFQIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0cnVjdCBydF9tYWNfdGFibGUgeworCXUxNiBTaXplOworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKkhhc2hbSEFTSF9UQUJMRV9TSVpFXTsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5IENvbnRlbnRbTUFYX0xFTl9PRl9NQUNfVEFCTEVdOworCXN0cnVjdCBydF9xdWV1ZV9oZWFkZXIgTWNhc3RQc1F1ZXVlOworCXVuc2lnbmVkIGxvbmcgUHNRSWRsZUNvdW50OworCUJPT0xFQU4gZkFueVN0YXRpb25JblBzbTsKKwlCT09MRUFOIGZBbnlTdGF0aW9uQmFkQXRoZXJvczsJLyogQ2hlY2sgaWYgYW55IFN0YXRpb24gaXMgYXRoZXJvcyA4MDIuMTFuIENoaXAuICBXZSBuZWVkIHRvIHVzZSBSVFMvQ1RTIHdpdGggQXRoZXJvcyA4MDIsLjExbiBjaGlwLiAqLworCUJPT0xFQU4gZkFueVR4T1BGb3JjZURpc2FibGU7CS8qIENoZWNrIGlmIGl0IGlzIG5lY2Vzc2FyeSB0byBkaXNhYmxlIEJFIFR4T1AgKi8KKwlCT09MRUFOIGZBbGxTdGF0aW9uQXNSYWxpbms7CS8qIENoZWNrIGlmIGFsbCBzdGF0aW9ucyBhcmUgcmFsaW5rLWNoaXBzZXQgKi8KKwlCT09MRUFOIGZBbnlTdGF0aW9uSXNMZWdhY3k7CS8qIENoZWNrIGlmIEkgdXNlIGxlZ2FjeSByYXRlIHRvIHRyYW5zbWl0IHRvIG15IEJTUyBTdGF0aW9uLyAqLworCUJPT0xFQU4gZkFueVN0YXRpb25Ob25HRjsJLyogQ2hlY2sgaWYgYW55IFN0YXRpb24gY2FuJ3Qgc3VwcG9ydCBHRi4gKi8KKwlCT09MRUFOIGZBbnlTdGF0aW9uMjBPbmx5OwkvKiBDaGVjayBpZiBhbnkgU3RhdGlvbiBjYW4ndCBzdXBwb3J0IEdGLiAqLworCUJPT0xFQU4gZkFueVN0YXRpb25NSU1PUFNEeW5hbWljOwkvKiBDaGVjayBpZiBhbnkgU3RhdGlvbiBpcyBNSU1PIER5bmFtaWMgKi8KKwlCT09MRUFOIGZBbnlCQVNlc3Npb247CS8qIENoZWNrIGlmIHRoZXJlIGlzIEJBIHNlc3Npb24uICBGb3JjZSB0dXJuIG9uIFJUUy9DVFMgKi8KKy8qMjAwOC8xMC8yODogS0ggYWRkIHRvIHN1cHBvcnQgQW50ZW5uYSBwb3dlci1zYXZpbmcgb2YgQVA8LS0gKi8KKy8qMjAwOC8xMC8yODogS0ggYWRkIHRvIHN1cHBvcnQgQW50ZW5uYSBwb3dlci1zYXZpbmcgb2YgQVAtLT4gKi8KK307CiAKLXN0cnVjdCB3aWZpY29uZgotewotCUJPT0xFQU4JYlNob3J0R0k7CitzdHJ1Y3Qgd2lmaWNvbmYgeworCUJPT0xFQU4gYlNob3J0R0k7CiAJQk9PTEVBTiBiR3JlZW5GaWVsZDsKIH07CiAKK3N0cnVjdCBydF9ydG1wX2Rldl9pbmZvIHsKKwl1OCBjaGlwTmFtZVsxNl07CisJUlRNUF9JTkZfVFlQRSBpbmZUeXBlOworfTsKIAorc3RydWN0IHJ0X3J0bXBfY2hpcF9vcCB7CisJLyogIENhbGlicmF0aW9uIGFjY2VzcyByZWxhdGVkIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLworCWludCAoKmVlaW5pdCkgKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CS8qIGludCAoKmVlaW5pdCkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsgKi8KKwlpbnQgKCplZXJlYWQpIChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHUxNiBvZmZzZXQsIHUxNiAqcFZhbHVlKTsJLyogaW50ICgqZWVyZWFkKShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIGludCBvZmZzZXQsIHUxNiAqcFZhbHVlKTsgKi8KIAorCS8qIE1DVSByZWxhdGVkIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLworCWludCAoKmxvYWRGaXJtd2FyZSkgKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CS8qIGludCAoKmxvYWRGaXJtd2FyZSkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsgKi8KKwlpbnQgKCplcmFzZUZpcm13YXJlKSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsJLyogaW50ICgqZXJhc2VGaXJtd2FyZSkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsgKi8KKwlpbnQgKCpzZW5kQ29tbWFuZFRvTWN1KSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBjbWQsIHU4IHRva2VuLCB1OCBhcmcwLCB1OCBhcmcxKTs7CS8qIGludCAoKnNlbmRDb21tYW5kVG9NY3UpKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggY21kLCB1OCB0b2tlbiwgdTggYXJnMCwgdTggYXJnMSk7ICovCiAKLXR5cGVkZWYgc3RydWN0IF9JTkZfUENJX0NPTkZJRwotewotCVBVQ0hBUiAgICAgICAgICAgICAgICAgIENTUkJhc2VBZGRyZXNzOyAgICAgLy8gUENJIE1NSU8gQmFzZSBBZGRyZXNzLCBhbGwgYWNjZXNzIHdpbGwgdXNlCi19SU5GX1BDSV9DT05GSUc7CisJLyogUkYgYWNjZXNzIHJlbGF0ZWQgY2FsbGJhY2sgZnVuY3Rpb25zICovCisJc3RydWN0IHJ0X3JlZ19wYWlyICpwUkZSZWdUYWJsZTsKKwl2b2lkICgqQXNpY1JmSW5pdCkgKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CisJdm9pZCAoKkFzaWNSZlR1cm5PbikgKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CisJdm9pZCAoKkFzaWNSZlR1cm5PZmYpIChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOworCXZvaWQgKCpBc2ljUmV2ZXJzZVJmRnJvbVNsZWVwTW9kZSkgKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CisJdm9pZCAoKkFzaWNIYWx0QWN0aW9uKSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9JTkZfVVNCX0NPTkZJRwotewotCVVJTlQgICAgICAgICAgICAgICAgQnVsa0luRXBBZGRyOwkJLy8gYnVsay1pbiBlbmRwb2ludCBhZGRyZXNzCi0JVUlOVCAgICAgICAgICAgICAgICBCdWxrT3V0RXBBZGRyWzZdOwkvLyBidWxrLW91dCBlbmRwb2ludCBhZGRyZXNzCisvKiAqLworLyogIFRoZSBtaW5pcG9ydCBhZGFwdGVyIHN0cnVjdHVyZSAqLworLyogKi8KK3N0cnVjdCBydF9ydG1wX2FkYXB0ZXIgeworCXZvaWQgKk9TX0Nvb2tpZTsJLyogc2F2ZSBzcGVjaWZpYyBzdHJ1Y3R1cmUgcmVsYXRpdmUgdG8gT1MgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldjsKKwl1bnNpZ25lZCBsb25nIFZpcnR1YWxJZkNudDsKIAotfUlORl9VU0JfQ09ORklHOworCXN0cnVjdCBydF9ydG1wX2NoaXBfb3AgY2hpcE9wczsKKwl1MTYgVGhpc1RidHROdW1Ub05leHRXYWtlVXA7CiAKLQotCi0vLwotLy8gIFRoZSBtaW5pcG9ydCBhZGFwdGVyIHN0cnVjdHVyZQotLy8KLXR5cGVkZWYgc3RydWN0IF9SVE1QX0FEQVBURVIKLXsKLQlQVk9JRAkJCQkJT1NfQ29va2llOwkvLyBzYXZlIHNwZWNpZmljIHN0cnVjdHVyZSByZWxhdGl2ZSB0byBPUwotCVBORVRfREVWCQkJCW5ldF9kZXY7Ci0JVUxPTkcJCQkJCVZpcnR1YWxJZkNudDsKLQotI2lmZGVmIFJUMjg2MAotICAgIFVTSE9SVAkJICAgICAgICAgICAgTG5rQ3RybEJpdE1hc2s7Ci0gICAgVVNIT1JUCQkgICAgICAgICAgICBSTG5rQ3RybENvbmZpZ3VyYXRpb247Ci0gICAgVVNIT1JUICAgICAgICAgICAgICAgICAgUkxua0N0cmxPZmZzZXQ7Ci0gICAgVVNIT1JUCQkgICAgICAgICAgICBIb3N0TG5rQ3RybENvbmZpZ3VyYXRpb247Ci0gICAgVVNIT1JUICAgICAgICAgICAgICAgICAgSG9zdExua0N0cmxPZmZzZXQ7Ci0JVVNIT1JUCQkgICAgICAgICAgICBQQ0llUG93ZXJTYXZlTGV2ZWw7Ci0gICAJQk9PTEVBTgkJCQkJYlBDSWNsa09mZjsJCQkJCQkvLyBmbGFnIHRoYXQgaW5kaWNhdGUgaWYgdGhlIFBJQ0UgcG93ZXIgc3RhdHVzIGluIENvbmZpZ3VyYXRpb24gU1BhY2UuLgotICAgCVVMT05HCQkJCQlDaGVja0RtYUJ1c3lDb3VudDsgIC8vIENoZWNrIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgQ291bnQuCi0gICAJVVNIT1JUCQkJCQlUaGlzVGJ0dE51bVRvTmV4dFdha2VVcDsKLQlVTE9ORwkJCQkJU2FtZVJ4Qnl0ZUNvdW50OwotCi0KKyNpZmRlZiBSVE1QX01BQ19QQ0kKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgUENJIHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUENJIHJlbGF0ZWQgcGFyYW1ldGVycwkJCQkJCQkJCQkJCQkJCQkgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JUFVDSEFSICAgICAgICAgICAgICAgICAgQ1NSQmFzZUFkZHJlc3M7ICAgICAvLyBQQ0kgTU1JTyBCYXNlIEFkZHJlc3MsIGFsbCBhY2Nlc3Mgd2lsbCB1c2UKKwl1OCAqQ1NSQmFzZUFkZHJlc3M7CS8qIFBDSSBNTUlPIEJhc2UgQWRkcmVzcywgYWxsIGFjY2VzcyB3aWxsIHVzZSAqLworCXVuc2lnbmVkIGludCBpcnFfbnVtOwogCi0JVUlOVAkJCQkJaW50X2VuYWJsZV9yZWc7Ci0JVUlOVAkJCQkJaW50X2Rpc2FibGVfbWFzazsKLQlVSU5UCQkJCQlpbnRfcGVuZGluZzsKKwl1MTYgTG5rQ3RybEJpdE1hc2s7CisJdTE2IFJMbmtDdHJsQ29uZmlndXJhdGlvbjsKKwl1MTYgUkxua0N0cmxPZmZzZXQ7CisJdTE2IEhvc3RMbmtDdHJsQ29uZmlndXJhdGlvbjsKKwl1MTYgSG9zdExua0N0cmxPZmZzZXQ7CisJdTE2IFBDSWVQb3dlclNhdmVMZXZlbDsKKwl1bnNpZ25lZCBsb25nIFJ0M3h4SG9zdExpbmtDdHJsOwkvKiBVU2VkIGZvciAzMDkwRiBjaGlwICovCisJdW5zaWduZWQgbG9uZyBSdDN4eFJhbGlua0xpbmtDdHJsOwkvKiBVU2VkIGZvciAzMDkwRiBjaGlwICovCisJdTE2IERldmljZUlEOwkvKiBSZWFkIGZyb20gUENJIGNvbmZpZyAqLworCXVuc2lnbmVkIGxvbmcgQWNjZXNzQkJQRmFpbENvdW50OworCUJPT0xFQU4gYlBDSWNsa09mZjsJLyogZmxhZyB0aGF0IGluZGljYXRlIGlmIHRoZSBQSUNFIHBvd2VyIHN0YXR1cyBpbiBDb25maWd1cmF0aW9uIFNQYWNlLi4gKi8KKwlCT09MRUFOIGJQQ0ljbGtPZmZEaXNhYmxlVHg7CS8qICovCiAKKwlCT09MRUFOIGJydDMweHhCYW5NY3VDbWQ7CS8qd2hlbiA9IDB4ZmYgbWVhbnMgYWxsIGNvbW1hbmRzIGFyZSBvayB0byBzZXQgLiAqLworCUJPT0xFQU4gYjMwOTBFU3BlY2lhbENoaXA7CS8qMzA5MEUgc3BlY2lhbCBjaGlwIHRoYXQgd3JpdGUgRUVQUk9NIDB4MjQ9MHg5MjgwLiAqLworCXVuc2lnbmVkIGxvbmcgQ2hlY2tEbWFCdXN5Q291bnQ7CS8qIENoZWNrIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgQ291bnQuICovCiAKLQlSVE1QX0RNQUJVRiAgICAgICAgICAgICBUeEJ1ZlNwYWNlW05VTV9PRl9UWF9SSU5HXTsgLy8gU2hhcmVkIG1lbW9yeSBvZiBhbGwgMXN0IHByZS1hbGxvY2F0ZWQgVHhCdWYgYXNzb2NpYXRlZCB3aXRoIGVhY2ggVFhECi0JUlRNUF9ETUFCVUYgICAgICAgICAgICAgUnhEZXNjUmluZzsgICAgICAgICAgICAgICAgIC8vIFNoYXJlZCBtZW1vcnkgZm9yIFJYIGRlc2NyaXB0b3JzCi0JUlRNUF9ETUFCVUYgICAgICAgICAgICAgVHhEZXNjUmluZ1tOVU1fT0ZfVFhfUklOR107IAkvLyBTaGFyZWQgbWVtb3J5IGZvciBUeCBkZXNjcmlwdG9ycwotCVJUTVBfVFhfUklORyAgICAgICAgICAgIFR4UmluZ1tOVU1fT0ZfVFhfUklOR107ICAgICAJLy8gQUMwfjQgKyBIQ0NBCi0jZW5kaWYKKwl1MzIgaW50X2VuYWJsZV9yZWc7CisJdTMyIGludF9kaXNhYmxlX21hc2s7CisJdTMyIGludF9wZW5kaW5nOwogCi0JTkRJU19TUElOX0xPQ0sgICAgICAgICAgaXJxX2xvY2s7Ci0JVUNIQVIgICAgICAgICAgICAgICAgICAgaXJxX2Rpc2FibGVkOworCXN0cnVjdCBydF9ydG1wX2RtYWJ1ZiBUeEJ1ZlNwYWNlW05VTV9PRl9UWF9SSU5HXTsJLyogU2hhcmVkIG1lbW9yeSBvZiBhbGwgMXN0IHByZS1hbGxvY2F0ZWQgVHhCdWYgYXNzb2NpYXRlZCB3aXRoIGVhY2ggVFhEICovCisJc3RydWN0IHJ0X3J0bXBfZG1hYnVmIFJ4RGVzY1Jpbmc7CS8qIFNoYXJlZCBtZW1vcnkgZm9yIFJYIGRlc2NyaXB0b3JzICovCisJc3RydWN0IHJ0X3J0bXBfZG1hYnVmIFR4RGVzY1JpbmdbTlVNX09GX1RYX1JJTkddOwkvKiBTaGFyZWQgbWVtb3J5IGZvciBUeCBkZXNjcmlwdG9ycyAqLworCXN0cnVjdCBydF9ydG1wX3R4X3JpbmcgVHhSaW5nW05VTV9PRl9UWF9SSU5HXTsJLyogQUMwfjQgKyBIQ0NBICovCisjZW5kaWYJCQkJLyogUlRNUF9NQUNfUENJIC8vICovCiAKLSNpZmRlZiBSVDI4NzAKKwlzcGlubG9ja190IGlycV9sb2NrOworCXU4IGlycV9kaXNhYmxlZDsKKworI2lmZGVmIFJUTVBfTUFDX1VTQgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICBVU0IgcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCXN0cnVjdCB1c2JfY29uZmlnX2Rlc2NyaXB0b3IJCSpjb25maWc7Ci0JVUlOVAkJCQkJCQkJQnVsa0luRXBBZGRyOwkJLy8gYnVsay1pbiBlbmRwb2ludCBhZGRyZXNzCi0JVUlOVAkJCQkJCQkJQnVsa091dEVwQWRkcls2XTsJLy8gYnVsay1vdXQgZW5kcG9pbnQgYWRkcmVzcworCXN0cnVjdCB1c2JfY29uZmlnX2Rlc2NyaXB0b3IgKmNvbmZpZzsKKwl1MzIgQnVsa0luRXBBZGRyOwkvKiBidWxrLWluIGVuZHBvaW50IGFkZHJlc3MgKi8KKwl1MzIgQnVsa091dEVwQWRkcls2XTsJLyogYnVsay1vdXQgZW5kcG9pbnQgYWRkcmVzcyAqLwogCi0JVUlOVAkJCQkJCQkJTnVtYmVyT2ZQaXBlczsKLQlVU0hPUlQJCQkJCQkJCUJ1bGtPdXRNYXhQYWNrZXRTaXplOwotCVVTSE9SVAkJCQkJCQkJQnVsa0luTWF4UGFja2V0U2l6ZTsKKwl1MzIgTnVtYmVyT2ZQaXBlczsKKwl1MTYgQnVsa091dE1heFBhY2tldFNpemU7CisJdTE2IEJ1bGtJbk1heFBhY2tldFNpemU7CiAKLQkvLz09PT09PUNvbnRyb2wgRmxhZ3MKLQlMT05HICAgICAgICAgICAgICAgICAgICAJUGVuZGluZ0lvQ291bnQ7Ci0JVUxPTkcJCQkJCQlCdWxrRmxhZ3M7Ci0JQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgIGJVc2JUeEJ1bGtBZ2dyZTsJLy8gRmxhZ3MgZm9yIGJ1bGsgb3V0IGRhdGEgcHJpb3JpdHkKKwkvKj09PT09PUNvbnRyb2wgRmxhZ3MgKi8KKwlsb25nIFBlbmRpbmdJb0NvdW50OworCXVuc2lnbmVkIGxvbmcgQnVsa0ZsYWdzOworCUJPT0xFQU4gYlVzYlR4QnVsa0FnZ3JlOwkvKiBGbGFncyBmb3IgYnVsayBvdXQgZGF0YSBwcmlvcml0eSAqLwogCisJLyo9PT09PT1DbWQgVGhyZWFkICovCisJc3RydWN0IHJ0X2NtZHEgQ21kUTsKKwlzcGlubG9ja190IENtZFFMb2NrOwkvKiBDbWRRTG9jayBzcGlubG9jayAqLworCXN0cnVjdCBydF9ydG1wX29zX3Rhc2sgY21kUVRhc2s7CiAKLQkvLz09PT09PVRpbWVyIFRocmVhZAotCVJUMjg3MF9USU1FUl9RVUVVRQkJVGltZXJROwotCU5ESVNfU1BJTl9MT0NLCQkJVGltZXJRTG9jazsKLQotCi0JLy89PT09PT1DbWQgVGhyZWFkCi0JQ21kUQkJCQkJQ21kUTsKLQlORElTX1NQSU5fTE9DSwkJCUNtZFFMb2NrOwkJCQkvLyBDbWRRTG9jayBzcGlubG9jawotCi0JQk9PTEVBTgkJCQkJVGltZXJGdW5jX2tpbGw7Ci0JQk9PTEVBTgkJCQkJbWxtZV9raWxsOwotCi0KLQkvLz09PT09PVNlbWFwaG9yZXMgKGV2ZW50KQotCXN0cnVjdCBzZW1hcGhvcmUJCQltbG1lX3NlbWFwaG9yZTsJCQkvKiB0byBzbGVlcCB0aHJlYWQgb24JKi8KLQlzdHJ1Y3Qgc2VtYXBob3JlCQkJUlRVU0JDbWRfc2VtYXBob3JlOwkJLyogdG8gc2xlZXAgdGhyZWFkIG9uCSovCi0Jc3RydWN0IHNlbWFwaG9yZQkJCVJUVVNCVGltZXJfc2VtYXBob3JlOwotCXN0cnVjdCBjb21wbGV0aW9uCQkJVGltZXJRQ29tcGxldGU7Ci0Jc3RydWN0IGNvbXBsZXRpb24JCQltbG1lQ29tcGxldGU7Ci0Jc3RydWN0IGNvbXBsZXRpb24JCQlDbWRRQ29tcGxldGU7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QJCQkqd2FpdDsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQorCS8qPT09PT09U2VtYXBob3JlcyAoZXZlbnQpICovCisJc3RydWN0IHNlbWFwaG9yZSBVc2JWZW5kb3JSZXFfc2VtYXBob3JlOworCXZvaWQgKlVzYlZlbmRvclJlcUJ1ZjsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAqd2FpdDsKKyNlbmRpZgkJCQkvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCS8qICAgICAgQm90aCBQQ0kvVVNCIHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUkJVUyByZWxhdGVkIHBhcmFtZXRlcnMJCQkJCQkJCQkJCQkJCQkJICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgIEJvdGggUENJL1VTQiByZWxhdGVkIHBhcmFtZXRlcnMJCQkJCQkJCQkJCQkJCSAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvKnN0cnVjdCBydF9ydG1wX2Rldl9pbmZvICAgICAgICAgICAgICAgICBjaGlwSW5mbzsgKi8KKwlSVE1QX0lORl9UWVBFIGluZlR5cGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgRHJpdmVyIE1nbXQgcmVsYXRlZCBwYXJhbWV0ZXJzCQkJCQkJCQkJCQkJCQkgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJc3RydWN0IHJ0X3J0bXBfb3NfdGFzayBtbG1lVGFzazsKKyNpZmRlZiBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVAorCS8qIElmIHlvdSB3YW50IHVzZSB0aW1lciB0YXNrIHRvIGhhbmRsZSB0aGUgdGltZXIgcmVsYXRlZCBqb2JzLCBlbmFibGUgdGhpcy4gKi8KKwlzdHJ1Y3QgcnRfcnRtcF90aW1lcl90YXNrX3F1ZXVlIFRpbWVyUTsKKwlzcGlubG9ja190IFRpbWVyUUxvY2s7CisJc3RydWN0IHJ0X3J0bXBfb3NfdGFzayB0aW1lclRhc2s7CisjZW5kaWYJCQkJLyogUlRNUF9USU1FUl9UQVNLX1NVUFBPUlQgLy8gKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICBUeCByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JQk9PTEVBTiAgICAgICAgICAgICAgICAgRGVRdWV1ZVJ1bm5pbmdbTlVNX09GX1RYX1JJTkddOyAgLy8gZm9yIGVuc3VyaW5nIFJUVVNCRGVRdWV1ZVBhY2tldCBnZXQgY2FsbCBvbmNlCi0JTkRJU19TUElOX0xPQ0sgICAgICAgICAgRGVRdWV1ZUxvY2tbTlVNX09GX1RYX1JJTkddOworCUJPT0xFQU4gRGVRdWV1ZVJ1bm5pbmdbTlVNX09GX1RYX1JJTkddOwkvKiBmb3IgZW5zdXJpbmcgUlRVU0JEZVF1ZXVlUGFja2V0IGdldCBjYWxsIG9uY2UgKi8KKwlzcGlubG9ja190IERlUXVldWVMb2NrW05VTV9PRl9UWF9SSU5HXTsKIAotI2lmZGVmIFJUMjg3MAotCS8vIERhdGEgcmVsYXRlZCBjb250ZXh0IGFuZCBBQyBzcGVjaWZpZWQsIDQgQUMgc3VwcG9ydGVkCi0JTkRJU19TUElOX0xPQ0sJCQlCdWxrT3V0TG9ja1s2XTsJCQkvLyBCdWxrT3V0IHNwaW5sb2NrIGZvciA0IEFDcwotCU5ESVNfU1BJTl9MT0NLCQkJTUxNRUJ1bGtPdXRMb2NrOwkvLyBNTE1FIEJ1bGtPdXQgbG9jaworI2lmZGVmIFJUTVBfTUFDX1VTQgorCS8qIERhdGEgcmVsYXRlZCBjb250ZXh0IGFuZCBBQyBzcGVjaWZpZWQsIDQgQUMgc3VwcG9ydGVkICovCisJc3BpbmxvY2tfdCBCdWxrT3V0TG9ja1s2XTsJLyogQnVsa091dCBzcGlubG9jayBmb3IgNCBBQ3MgKi8KKwlzcGlubG9ja190IE1MTUVCdWxrT3V0TG9jazsJLyogTUxNRSBCdWxrT3V0IGxvY2sgKi8KIAotCUhUX1RYX0NPTlRFWFQJCQlUeENvbnRleHRbTlVNX09GX1RYX1JJTkddOwotCU5ESVNfU1BJTl9MT0NLCQkJVHhDb250ZXh0UXVldWVMb2NrW05VTV9PRl9UWF9SSU5HXTsJCS8vIFR4Q29udGV4dFF1ZXVlIHNwaW5sb2NrCisJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgVHhDb250ZXh0W05VTV9PRl9UWF9SSU5HXTsKKwlzcGlubG9ja190IFR4Q29udGV4dFF1ZXVlTG9ja1tOVU1fT0ZfVFhfUklOR107CS8qIFR4Q29udGV4dFF1ZXVlIHNwaW5sb2NrICovCiAKLQkvLyA0IHNldHMgb2YgQnVsayBPdXQgaW5kZXggYW5kIHBlbmRpbmcgZmxhZwotCVVDSEFSCQkJCQlOZXh0QnVsa091dEluZGV4WzRdOwkvLyBvbmx5IHVzZWQgZm9yIDQgRURDQSBidWxrb3V0IHBpcGUKKwkvKiA0IHNldHMgb2YgQnVsayBPdXQgaW5kZXggYW5kIHBlbmRpbmcgZmxhZyAqLworCXU4IE5leHRCdWxrT3V0SW5kZXhbNF07CS8qIG9ubHkgdXNlZCBmb3IgNCBFRENBIGJ1bGtvdXQgcGlwZSAqLwogCi0JQk9PTEVBTgkJCQkJQnVsa091dFBlbmRpbmdbNl07CS8vIHVzZWQgZm9yIHRvdGFsIDYgYnVsa291dCBwaXBlCi0JVUNIQVIJCQkJCWJ1bGtSZXNldFBpcGVpZDsKLQlCT09MRUFOCQkJCQlNZ210QnVsa1BlbmRpbmc7Ci0JVUxPTkcJCQkJCWJ1bGtSZXNldFJlcVs2XTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KKwlCT09MRUFOIEJ1bGtPdXRQZW5kaW5nWzZdOwkvKiB1c2VkIGZvciB0b3RhbCA2IGJ1bGtvdXQgcGlwZSAqLworCXU4IGJ1bGtSZXNldFBpcGVpZDsKKwlCT09MRUFOIE1nbXRCdWxrUGVuZGluZzsKKwl1bnNpZ25lZCBsb25nIGJ1bGtSZXNldFJlcVs2XTsKKyNlbmRpZgkJCQkvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotCS8vIHJlc291cmNlIGZvciBzb2Z0d2FyZSBiYWNrbG9nIHF1ZXVlcwotCVFVRVVFX0hFQURFUiAgICAgICAgICAgIFR4U3dRdWV1ZVtOVU1fT0ZfVFhfUklOR107ICAvLyA0IEFDICsgMSBIQ0NBCi0JTkRJU19TUElOX0xPQ0sgICAgICAgICAgVHhTd1F1ZXVlTG9ja1tOVU1fT0ZfVFhfUklOR107CS8vIFR4U3dRdWV1ZSBzcGlubG9jaworCS8qIHJlc291cmNlIGZvciBzb2Z0d2FyZSBiYWNrbG9nIHF1ZXVlcyAqLworCXN0cnVjdCBydF9xdWV1ZV9oZWFkZXIgVHhTd1F1ZXVlW05VTV9PRl9UWF9SSU5HXTsJLyogNCBBQyArIDEgSENDQSAqLworCXNwaW5sb2NrX3QgVHhTd1F1ZXVlTG9ja1tOVU1fT0ZfVFhfUklOR107CS8qIFR4U3dRdWV1ZSBzcGlubG9jayAqLwogCi0JUlRNUF9ETUFCVUYgICAgICAgICAgICAgTWdtdERlc2NSaW5nOyAgICAgICAgICAgICAgIAkvLyBTaGFyZWQgbWVtb3J5IGZvciBNR01UIGRlc2NyaXB0b3JzCi0JUlRNUF9NR01UX1JJTkcgICAgICAgICAgTWdtdFJpbmc7Ci0JTkRJU19TUElOX0xPQ0sgICAgICAgICAgTWdtdFJpbmdMb2NrOyAgICAgICAgICAgICAgIAkvLyBQcmlvIFJpbmcgc3BpbmxvY2sKLQorCXN0cnVjdCBydF9ydG1wX2RtYWJ1ZiBNZ210RGVzY1Jpbmc7CS8qIFNoYXJlZCBtZW1vcnkgZm9yIE1HTVQgZGVzY3JpcHRvcnMgKi8KKwlzdHJ1Y3QgcnRfcnRtcF9tZ210X3JpbmcgTWdtdFJpbmc7CisJc3BpbmxvY2tfdCBNZ210UmluZ0xvY2s7CS8qIFByaW8gUmluZyBzcGlubG9jayAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgIFJ4IHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBSVDI4NjAKLQlSVE1QX1JYX1JJTkcgICAgICAgICAgICBSeFJpbmc7Ci0JTkRJU19TUElOX0xPQ0sgICAgICAgICAgUnhSaW5nTG9jazsgICAgICAgICAgICAgICAgIC8vIFJ4IFJpbmcgc3BpbmxvY2sKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCVJYX0NPTlRFWFQJCQkJUnhDb250ZXh0W1JYX1JJTkdfU0laRV07ICAvLyAxIGZvciByZWR1bmRhbnQgbXVsdGlwbGUgSVJQIGJ1bGsgaW4uCi0JTkRJU19TUElOX0xPQ0sJCQlCdWxrSW5Mb2NrOwkJCQkvLyBCdWxrSW4gc3BpbmxvY2sgZm9yIDQgQUNzCi0JVUNIQVIJCQkJCVBlbmRpbmdSeDsJCQkJLy8gVGhlIE1heGltYSBwZW5kaW5nIFJ4IHZhbHVlIHNob3VsZCBiZSAJUlhfUklOR19TSVpFLgotCVVDSEFSCQkJCQlOZXh0UnhCdWxrSW5JbmRleDsJCS8vIEluZGljYXRlIHRoZSBjdXJyZW50IFJ4Q29udGV4dCBJbmRleCB3aGljaCBob2xkIGJ5IEhvc3QgY29udHJvbGxlci4KLQlVQ0hBUgkJCQkJTmV4dFJ4QnVsa0luUmVhZEluZGV4OwkvLyBJbmRpY2F0ZSB0aGUgY3VycmVudCBSeENvbnRleHQgSW5kZXggd2hpY2ggZHJpdmVyIGNhbiByZWFkICYgcHJvY2VzcyBpdC4KLQlVTE9ORwkJCQkJTmV4dFJ4QnVsa0luUG9zaXRpb247ICAgLy8gV2FudCB0byBjb250YXRlbmF0ZSAyIFVSQiBidWZmZXIgd2hpbGUgMXN0IGlzIGJ1bGtpbiBmYWlsZWQgVVJCLiBUaGlzIFBvc2l0aW9uIGlzIDFzdCBVUkIgVHJhbnNmZXJMZW5ndGguCi0JVUxPTkcJCQkJCVRyYW5zZmVyQnVmZmVyTGVuZ3RoOwkvLyBjdXJyZW50IGxlbmd0aCBvZiB0aGUgcGFja2V0IGJ1ZmZlcgotCVVMT05HCQkJCQlSZWFkUG9zaXRpb247CQkJLy8gY3VycmVudCByZWFkIHBvc2l0aW9uIGluIGEgcGFja2V0IGJ1ZmZlcgotI2VuZGlmIC8vIFJUMjg3MCAvLwogCisjaWZkZWYgUlRNUF9NQUNfUENJCisJc3RydWN0IHJ0X3J0bXBfcnhfcmluZyBSeFJpbmc7CisJc3BpbmxvY2tfdCBSeFJpbmdMb2NrOwkvKiBSeCBSaW5nIHNwaW5sb2NrICovCisjaWZkZWYgUlQzMDkwCisJc3BpbmxvY2tfdCBNY3VDbWRMb2NrOwkvKk1DVSBDb21tYW5kIFF1ZXVlIHNwaW5sb2NrICovCisjZW5kaWYJCQkJLyogUlQzMDkwIC8vICovCisjZW5kaWYJCQkJLyogUlRNUF9NQUNfUENJIC8vICovCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJc3RydWN0IHJ0X3J4X2NvbnRleHQgUnhDb250ZXh0W1JYX1JJTkdfU0laRV07CS8qIDEgZm9yIHJlZHVuZGFudCBtdWx0aXBsZSBJUlAgYnVsayBpbi4gKi8KKwlzcGlubG9ja190IEJ1bGtJbkxvY2s7CS8qIEJ1bGtJbiBzcGlubG9jayBmb3IgNCBBQ3MgKi8KKwl1OCBQZW5kaW5nUng7CS8qIFRoZSBNYXhpbXVtIHBlbmRpbmcgUnggdmFsdWUgc2hvdWxkIGJlICAgICAgIFJYX1JJTkdfU0laRS4gKi8KKwl1OCBOZXh0UnhCdWxrSW5JbmRleDsJLyogSW5kaWNhdGUgdGhlIGN1cnJlbnQgUnhDb250ZXh0IEluZGV4IHdoaWNoIGhvbGQgYnkgSG9zdCBjb250cm9sbGVyLiAqLworCXU4IE5leHRSeEJ1bGtJblJlYWRJbmRleDsJLyogSW5kaWNhdGUgdGhlIGN1cnJlbnQgUnhDb250ZXh0IEluZGV4IHdoaWNoIGRyaXZlciBjYW4gcmVhZCAmIHByb2Nlc3MgaXQuICovCisJdW5zaWduZWQgbG9uZyBOZXh0UnhCdWxrSW5Qb3NpdGlvbjsJLyogV2FudCB0byBjb250YXRlbmF0ZSAyIFVSQiBidWZmZXIgd2hpbGUgMXN0IGlzIGJ1bGtpbiBmYWlsZWQgVVJCLiBUaGlzIFBvc2l0aW9uIGlzIDFzdCBVUkIgVHJhbnNmZXJMZW5ndGguICovCisJdW5zaWduZWQgbG9uZyBUcmFuc2ZlckJ1ZmZlckxlbmd0aDsJLyogY3VycmVudCBsZW5ndGggb2YgdGhlIHBhY2tldCBidWZmZXIgKi8KKwl1bnNpZ25lZCBsb25nIFJlYWRQb3NpdGlvbjsJLyogY3VycmVudCByZWFkIHBvc2l0aW9uIGluIGEgcGFja2V0IGJ1ZmZlciAqLworI2VuZGlmCQkJCS8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgIEFTSUMgcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JVUlOVDMyICAgICAgICAgICAgICAgCU1BQ1ZlcnNpb247ICAgICAgCS8vIE1BQyB2ZXJzaW9uLiBSZWNvcmQgcnQyODYwQygweDI4NjAwMTAwKSBvciBydDI4NjBEICgweDI4NjAwMTAxKS4uCisJdTMyIE1BQ1ZlcnNpb247CS8qIE1BQyB2ZXJzaW9uLiBSZWNvcmQgcnQyODYwQygweDI4NjAwMTAwKSBvciBydDI4NjBEICgweDI4NjAwMTAxKS4uICovCiAKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBFMlBST00KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlVTE9ORyAgICAgICAgICAgICAgICAgICBFZXByb21WZXJzaW9uOyAgICAgICAgICAvLyBieXRlIDA6IHZlcnNpb24sIGJ5dGUgMTogcmV2aXNpb24sIGJ5dGUgMn4zOiB1bnVzZWQKLQlVQ0hBUiAgICAgICAgICAgICAgICAgICBFRVBST01BZGRyZXNzTnVtOyAgICAgICAvLyA5M2M0Nj02ICA5M2M2Nj04Ci0JVVNIT1JUICAgICAgICAgICAgICAgICAgRUVQUk9NRGVmYXVsdFZhbHVlW05VTV9FRVBST01fQkJQX1BBUk1TXTsKLSNpZmRlZiBSVDI4NzAKLQlCT09MRUFOICAgICAgICAgICAgICAgICBFZXByb21BY2Nlc3M7Ci0jZW5kaWYKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBGaXJtd2FyZVZlcnNpb247ICAgICAgICAvLyBieXRlIDA6IE1pbm9yIHZlcnNpb24sIGJ5dGUgMTogTWFqb3IgdmVyc2lvbiwgb3RoZXJ3aXNlIHVudXNlZC4KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBFMlBST00gKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwl1bnNpZ25lZCBsb25nIEVlcHJvbVZlcnNpb247CS8qIGJ5dGUgMDogdmVyc2lvbiwgYnl0ZSAxOiByZXZpc2lvbiwgYnl0ZSAyfjM6IHVudXNlZCAqLworCXVuc2lnbmVkIGxvbmcgRmlybXdhcmVWZXJzaW9uOwkvKiBieXRlIDA6IE1pbm9yIHZlcnNpb24sIGJ5dGUgMTogTWFqb3IgdmVyc2lvbiwgb3RoZXJ3aXNlIHVudXNlZC4gKi8KKwl1MTYgRUVQUk9NRGVmYXVsdFZhbHVlW05VTV9FRVBST01fQkJQX1BBUk1TXTsKKwl1OCBFRVBST01BZGRyZXNzTnVtOwkvKiA5M2M0Nj02ICA5M2M2Nj04ICovCisJQk9PTEVBTiBFZXByb21BY2Nlc3M7CisJdTggRUZ1c2VUYWc7CiAKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBCQlAgQ29udHJvbAotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVVDSEFSICAgICAgICAgICAgICAgICAgIEJicFdyaXRlTGF0Y2hbMTQwXTsgICAgIC8vIHJlY29yZCBsYXN0IEJCUCByZWdpc3RlciB2YWx1ZSB3cml0dGVuIHZpYSBCQlBfSU9fV1JJVEUvQkJQX0lPX1dSSVRFX1ZZX1JFR19JRAotCVVDSEFSICAgICAgICAgICAgICAgICAgIEJicFJzc2lUb0RibURlbHRhOwotCUJCUF9SNjZfVFVOSU5HICAgICAgICAgIEJicFR1bmluZzsKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBCQlAgQ29udHJvbCAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCXU4IEJicFdyaXRlTGF0Y2hbMTQwXTsJLyogcmVjb3JkIGxhc3QgQkJQIHJlZ2lzdGVyIHZhbHVlIHdyaXR0ZW4gdmlhIEJCUF9JT19XUklURS9CQlBfSU9fV1JJVEVfVllfUkVHX0lEICovCisJY2hhciBCYnBSc3NpVG9EYm1EZWx0YTsJLyogY2hhbmdlIGZyb20gdTggdG8gY2hhciBmb3IgaGlnaCBwb3dlciAqLworCXN0cnVjdCBydF9iYnBfcjY2X3R1bmluZyBCYnBUdW5pbmc7CiAKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gUkZJQyBjb250cm9sCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVVDSEFSICAgICAgICAgICAgICAgICAgIFJmSWNUeXBlOyAgICAgICAvLyBSRklDX3h4eAotCVVMT05HICAgICAgICAgICAgICAgICAgIFJmRnJlcU9mZnNldDsgICAvLyBGcmVxdWVuY3kgb2Zmc2V0IGZvciBjaGFubmVsIHN3aXRjaGluZwotCVJUTVBfUkZfUkVHUyAgICAgICAgICAgIExhdGNoUmZSZWdzOyAgICAvLyBsYXRjaCB0aCBsYXRlc3QgUkYgcHJvZ3JhbW1pbmcgdmFsdWUgc2luY2UgUkYgSUMgZG9lc24ndCBzdXBwb3J0IFJFQUQKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogUkZJQyBjb250cm9sICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCXU4IFJmSWNUeXBlOwkJLyogUkZJQ194eHggKi8KKwl1bnNpZ25lZCBsb25nIFJmRnJlcU9mZnNldDsJLyogRnJlcXVlbmN5IG9mZnNldCBmb3IgY2hhbm5lbCBzd2l0Y2hpbmcgKi8KKwlzdHJ1Y3QgcnRfcnRtcF9yZl9yZWdzIExhdGNoUmZSZWdzOwkvKiBsYXRjaCB0aCBsYXRlc3QgUkYgcHJvZ3JhbW1pbmcgdmFsdWUgc2luY2UgUkYgSUMgZG9lc24ndCBzdXBwb3J0IFJFQUQgKi8KIAotCUVFUFJPTV9BTlRFTk5BX1NUUlVDICAgIEFudGVubmE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIEFOdGVubmEgZGVmaW5pdGlvbiBpcyBkaWZmZXJlbnQgZm9yIGEgJiBnLiBXZSBuZWVkIHRvIHNhdmUgaXQgZm9yIGZ1dHVyZSByZWZlcmVuY2UuCi0JRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDICAgIE5pY0NvbmZpZzI7CisJRUVQUk9NX0FOVEVOTkFfU1RSVUMgQW50ZW5uYTsJLyogU2luY2UgQU50ZW5uYSBkZWZpbml0aW9uIGlzIGRpZmZlcmVudCBmb3IgYSAmIGcuIFdlIG5lZWQgdG8gc2F2ZSBpdCBmb3IgZnV0dXJlIHJlZmVyZW5jZS4gKi8KKwlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMgTmljQ29uZmlnMjsKIAotCS8vIFRoaXMgc29mdCBSeCBBbnRlbm5hIERpdmVyc2l0eSBtZWNoYW5pc20gaXMgdXNlZCBvbmx5IHdoZW4gdXNlciBzZXQKLQkvLyBSWCBBbnRlbm5hID0gRElWRVJTSVRZIE9OCi0JU09GVF9SWF9BTlRfRElWRVJTSVRZICAgUnhBbnQ7CisJLyogVGhpcyBzb2Z0IFJ4IEFudGVubmEgRGl2ZXJzaXR5IG1lY2hhbmlzbSBpcyB1c2VkIG9ubHkgd2hlbiB1c2VyIHNldCAqLworCS8qIFJYIEFudGVubmEgPSBESVZFUlNJVFkgT04gKi8KKwlzdHJ1Y3QgcnRfc29mdF9yeF9hbnRfZGl2ZXJzaXR5IFJ4QW50OwogCi0JVUNIQVIgICAgICAgICAgICAgICAgICAgUkZQcm9nU2VxOwotCUNIQU5ORUxfVFhfUE9XRVIgICAgICAgIFR4UG93ZXJbTUFYX05VTV9PRl9DSEFOTkVMU107ICAgICAgIC8vIFN0b3JlIFR4IHBvd2VyIHZhbHVlIGZvciBhbGwgY2hhbm5lbHMuCi0JQ0hBTk5FTF9UWF9QT1dFUiAgICAgICAgQ2hhbm5lbExpc3RbTUFYX05VTV9PRl9DSEFOTkVMU107ICAgLy8gbGlzdCBhbGwgc3VwcG9ydGVkIGNoYW5uZWxzIGZvciBzaXRlIHN1cnZleQotCUNIQU5ORUxfMTFKX1RYX1BPV0VSICAgIFR4UG93ZXIxMUpbTUFYX05VTV9PRl8xMUpDSEFOTkVMU107ICAgICAgIC8vIDgwMi4xMWogY2hhbm5lbCBhbmQgYncKLQlDSEFOTkVMXzExSl9UWF9QT1dFUiAgICBDaGFubmVsTGlzdDExSltNQVhfTlVNX09GXzExSkNIQU5ORUxTXTsgICAvLyBsaXN0IGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMgZm9yIHNpdGUgc3VydmV5CisJdTggUkZQcm9nU2VxOworCXN0cnVjdCBydF9jaGFubmVsX3R4X3Bvd2VyIFR4UG93ZXJbTUFYX05VTV9PRl9DSEFOTkVMU107CS8qIFN0b3JlIFR4IHBvd2VyIHZhbHVlIGZvciBhbGwgY2hhbm5lbHMuICovCisJc3RydWN0IHJ0X2NoYW5uZWxfdHhfcG93ZXIgQ2hhbm5lbExpc3RbTUFYX05VTV9PRl9DSEFOTkVMU107CS8qIGxpc3QgYWxsIHN1cHBvcnRlZCBjaGFubmVscyBmb3Igc2l0ZSBzdXJ2ZXkgKi8KKwlzdHJ1Y3QgcnRfY2hhbm5lbF8xMWpfdHhfcG93ZXIgVHhQb3dlcjExSltNQVhfTlVNX09GXzExSkNIQU5ORUxTXTsJLyogODAyLjExaiBjaGFubmVsIGFuZCBidyAqLworCXN0cnVjdCBydF9jaGFubmVsXzExal90eF9wb3dlciBDaGFubmVsTGlzdDExSltNQVhfTlVNX09GXzExSkNIQU5ORUxTXTsJLyogbGlzdCBhbGwgc3VwcG9ydGVkIGNoYW5uZWxzIGZvciBzaXRlIHN1cnZleSAqLwogCi0JVUNIQVIgICAgICAgICAgICAgICAgICAgQ2hhbm5lbExpc3ROdW07ICAgICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGNoYW5uZWwgaW4gQ2hhbm5lbExpc3RbXQotCVVDSEFSCQkJCQlCYnA5NDsKLQlCT09MRUFOCQkJCQlCYnBGb3JDQ0s7Ci0JVUxPTkcJCVR4MjBNUHdyQ2ZnQUJhbmRbNV07Ci0JVUxPTkcJCVR4MjBNUHdyQ2ZnR0JhbmRbNV07Ci0JVUxPTkcJCVR4NDBNUHdyQ2ZnQUJhbmRbNV07Ci0JVUxPTkcJCVR4NDBNUHdyQ2ZnR0JhbmRbNV07CisJdTggQ2hhbm5lbExpc3ROdW07CS8qIG51bWJlciBvZiBjaGFubmVsIGluIENoYW5uZWxMaXN0W10gKi8KKwl1OCBCYnA5NDsKKwlCT09MRUFOIEJicEZvckNDSzsKKwl1bnNpZ25lZCBsb25nIFR4MjBNUHdyQ2ZnQUJhbmRbNV07CisJdW5zaWduZWQgbG9uZyBUeDIwTVB3ckNmZ0dCYW5kWzVdOworCXVuc2lnbmVkIGxvbmcgVHg0ME1Qd3JDZmdBQmFuZFs1XTsKKwl1bnNpZ25lZCBsb25nIFR4NDBNUHdyQ2ZnR0JhbmRbNV07CiAKLQlCT09MRUFOICAgICBiQXV0b1R4QWdjQTsgICAgICAgICAgICAgICAgLy8gRW5hYmxlIGRyaXZlciBhdXRvIFR4IEFnYyBjb250cm9sCi0JVUNIQVIJICAgIFRzc2lSZWZBOwkJCQkJLy8gU3RvcmUgVHNzaSByZWZlcmVuY2UgdmFsdWUgYXMgMjUgdGVtcGVyYXR1cmUuCi0JVUNIQVIJICAgIFRzc2lQbHVzQm91bmRhcnlBWzVdOwkJLy8gVHNzaSBib3VuZGFyeSBmb3IgaW5jcmVhc2UgVHggcG93ZXIgdG8gY29tcGVuc2F0ZS4KLQlVQ0hBUgkgICAgVHNzaU1pbnVzQm91bmRhcnlBWzVdOwkJLy8gVHNzaSBib3VuZGFyeSBmb3IgZGVjcmVhc2UgVHggcG93ZXIgdG8gY29tcGVuc2F0ZS4KLQlVQ0hBUgkgICAgVHhBZ2NTdGVwQTsJCQkJCS8vIFN0b3JlIFR4IFRTU0kgZGVsdGEgaW5jcmVtZW50IC8gZGVjcmVtZW50IHZhbHVlCi0JQ0hBUgkJVHhBZ2NDb21wZW5zYXRlQTsJCQkvLyBTdG9yZSB0aGUgY29tcGVuc2F0aW9uIChUeEFnY1N0ZXAgKiAoaWR4LTEpKQorCUJPT0xFQU4gYkF1dG9UeEFnY0E7CS8qIEVuYWJsZSBkcml2ZXIgYXV0byBUeCBBZ2MgY29udHJvbCAqLworCXU4IFRzc2lSZWZBOwkJLyogU3RvcmUgVHNzaSByZWZlcmVuY2UgdmFsdWUgYXMgMjUgdGVtcGVyYXR1cmUuICovCisJdTggVHNzaVBsdXNCb3VuZGFyeUFbNV07CS8qIFRzc2kgYm91bmRhcnkgZm9yIGluY3JlYXNlIFR4IHBvd2VyIHRvIGNvbXBlbnNhdGUuICovCisJdTggVHNzaU1pbnVzQm91bmRhcnlBWzVdOwkvKiBUc3NpIGJvdW5kYXJ5IGZvciBkZWNyZWFzZSBUeCBwb3dlciB0byBjb21wZW5zYXRlLiAqLworCXU4IFR4QWdjU3RlcEE7CS8qIFN0b3JlIFR4IFRTU0kgZGVsdGEgaW5jcmVtZW50IC8gZGVjcmVtZW50IHZhbHVlICovCisJY2hhciBUeEFnY0NvbXBlbnNhdGVBOwkvKiBTdG9yZSB0aGUgY29tcGVuc2F0aW9uIChUeEFnY1N0ZXAgKiAoaWR4LTEpKSAqLwogCi0JQk9PTEVBTiAgICAgYkF1dG9UeEFnY0c7ICAgICAgICAgICAgICAgIC8vIEVuYWJsZSBkcml2ZXIgYXV0byBUeCBBZ2MgY29udHJvbAotCVVDSEFSCSAgICBUc3NpUmVmRzsJCQkJCS8vIFN0b3JlIFRzc2kgcmVmZXJlbmNlIHZhbHVlIGFzIDI1IHRlbXBlcmF0dXJlLgotCVVDSEFSCSAgICBUc3NpUGx1c0JvdW5kYXJ5R1s1XTsJCS8vIFRzc2kgYm91bmRhcnkgZm9yIGluY3JlYXNlIFR4IHBvd2VyIHRvIGNvbXBlbnNhdGUuCi0JVUNIQVIJICAgIFRzc2lNaW51c0JvdW5kYXJ5R1s1XTsJCS8vIFRzc2kgYm91bmRhcnkgZm9yIGRlY3JlYXNlIFR4IHBvd2VyIHRvIGNvbXBlbnNhdGUuCi0JVUNIQVIJICAgIFR4QWdjU3RlcEc7CQkJCQkvLyBTdG9yZSBUeCBUU1NJIGRlbHRhIGluY3JlbWVudCAvIGRlY3JlbWVudCB2YWx1ZQotCUNIQVIJCVR4QWdjQ29tcGVuc2F0ZUc7CQkJLy8gU3RvcmUgdGhlIGNvbXBlbnNhdGlvbiAoVHhBZ2NTdGVwICogKGlkeC0xKSkKKwlCT09MRUFOIGJBdXRvVHhBZ2NHOwkvKiBFbmFibGUgZHJpdmVyIGF1dG8gVHggQWdjIGNvbnRyb2wgKi8KKwl1OCBUc3NpUmVmRzsJCS8qIFN0b3JlIFRzc2kgcmVmZXJlbmNlIHZhbHVlIGFzIDI1IHRlbXBlcmF0dXJlLiAqLworCXU4IFRzc2lQbHVzQm91bmRhcnlHWzVdOwkvKiBUc3NpIGJvdW5kYXJ5IGZvciBpbmNyZWFzZSBUeCBwb3dlciB0byBjb21wZW5zYXRlLiAqLworCXU4IFRzc2lNaW51c0JvdW5kYXJ5R1s1XTsJLyogVHNzaSBib3VuZGFyeSBmb3IgZGVjcmVhc2UgVHggcG93ZXIgdG8gY29tcGVuc2F0ZS4gKi8KKwl1OCBUeEFnY1N0ZXBHOwkvKiBTdG9yZSBUeCBUU1NJIGRlbHRhIGluY3JlbWVudCAvIGRlY3JlbWVudCB2YWx1ZSAqLworCWNoYXIgVHhBZ2NDb21wZW5zYXRlRzsJLyogU3RvcmUgdGhlIGNvbXBlbnNhdGlvbiAoVHhBZ2NTdGVwICogKGlkeC0xKSkgKi8KIAotCS8vKysrRm9yIFJUMjg3MCwgdGhlIHBhcmFtZXRlcmVzIGlzIHN0YXJ0IGZyb20gQkdSc3NpT2Zmc2V0MSB+IEJHUnNzaU9mZnNldDMKLQlDSEFSCQlCR1Jzc2lPZmZzZXQwOwkJCQkvLyBTdG9yZSBCL0cgUlNTSSMwIE9mZnNldCB2YWx1ZSBvbiBFRVBST00gMHg0NmgKLQlDSEFSCQlCR1Jzc2lPZmZzZXQxOwkJCQkvLyBTdG9yZSBCL0cgUlNTSSMxIE9mZnNldCB2YWx1ZQotCUNIQVIJCUJHUnNzaU9mZnNldDI7CQkJCS8vIFN0b3JlIEIvRyBSU1NJIzIgT2Zmc2V0IHZhbHVlCi0JLy8tLS0KKwljaGFyIEJHUnNzaU9mZnNldDA7CS8qIFN0b3JlIEIvRyBSU1NJIzAgT2Zmc2V0IHZhbHVlIG9uIEVFUFJPTSAweDQ2aCAqLworCWNoYXIgQkdSc3NpT2Zmc2V0MTsJLyogU3RvcmUgQi9HIFJTU0kjMSBPZmZzZXQgdmFsdWUgKi8KKwljaGFyIEJHUnNzaU9mZnNldDI7CS8qIFN0b3JlIEIvRyBSU1NJIzIgT2Zmc2V0IHZhbHVlICovCiAKLQkvLysrK0ZvciBSVDI4NzAsIHRoZSBwYXJhbWV0ZXJlcyBpcyBzdGFydCBmcm9tIEFSc3NpT2Zmc2V0MSB+IEFSc3NpT2Zmc2V0MwotCUNIQVIJCUFSc3NpT2Zmc2V0MDsJCQkJLy8gU3RvcmUgQSBSU1NJIzAgT2Zmc2V0IHZhbHVlIG9uIEVFUFJPTSAweDRBaAotCUNIQVIJCUFSc3NpT2Zmc2V0MTsJCQkJLy8gU3RvcmUgQSBSU1NJIzEgT2Zmc2V0IHZhbHVlCi0JQ0hBUgkJQVJzc2lPZmZzZXQyOwkJCQkvLyBTdG9yZSBBIFJTU0kjMiBPZmZzZXQgdmFsdWUKLQkvLy0tLQorCWNoYXIgQVJzc2lPZmZzZXQwOwkvKiBTdG9yZSBBIFJTU0kjMCBPZmZzZXQgdmFsdWUgb24gRUVQUk9NIDB4NEFoICovCisJY2hhciBBUnNzaU9mZnNldDE7CS8qIFN0b3JlIEEgUlNTSSMxIE9mZnNldCB2YWx1ZSAqLworCWNoYXIgQVJzc2lPZmZzZXQyOwkvKiBTdG9yZSBBIFJTU0kjMiBPZmZzZXQgdmFsdWUgKi8KIAotCUNIQVIJCUJMTkFHYWluOwkJCQkJLy8gU3RvcmUgQi9HIGV4dGVybmFsIExOQSMwIHZhbHVlIG9uIEVFUFJPTSAweDQ0aAotCUNIQVIJCUFMTkFHYWluMDsJCQkJCS8vIFN0b3JlIEEgZXh0ZXJuYWwgTE5BIzAgdmFsdWUgZm9yIGNoMzZ+NjQKLQlDSEFSCQlBTE5BR2FpbjE7CQkJCQkvLyBTdG9yZSBBIGV4dGVybmFsIExOQSMxIHZhbHVlIGZvciBjaDEwMH4xMjgKLQlDSEFSCQlBTE5BR2FpbjI7CQkJCQkvLyBTdG9yZSBBIGV4dGVybmFsIExOQSMyIHZhbHVlIGZvciBjaDEzMn4xNjUKKwljaGFyIEJMTkFHYWluOwkJLyogU3RvcmUgQi9HIGV4dGVybmFsIExOQSMwIHZhbHVlIG9uIEVFUFJPTSAweDQ0aCAqLworCWNoYXIgQUxOQUdhaW4wOwkJLyogU3RvcmUgQSBleHRlcm5hbCBMTkEjMCB2YWx1ZSBmb3IgY2gzNn42NCAqLworCWNoYXIgQUxOQUdhaW4xOwkJLyogU3RvcmUgQSBleHRlcm5hbCBMTkEjMSB2YWx1ZSBmb3IgY2gxMDB+MTI4ICovCisJY2hhciBBTE5BR2FpbjI7CQkvKiBTdG9yZSBBIGV4dGVybmFsIExOQSMyIHZhbHVlIGZvciBjaDEzMn4xNjUgKi8KKyNpZmRlZiBSVDMweHgKKwkvKiBmb3IgMzU3MiAqLworCXU4IEJicDI1OworCXU4IEJicDI2OwogCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIExFRCBjb250cm9sCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCU1DVV9MRURDU19TVFJVQwkJTGVkQ250bDsKLQlVU0hPUlQJCQkJTGVkMTsJLy8gcmVhZCBmcm9tIEVFUFJPTSAweDNjCi0JVVNIT1JUCQkJCUxlZDI7CS8vIEVFUFJPTSAweDNlCi0JVVNIT1JUCQkJCUxlZDM7CS8vIEVFUFJPTSAweDQwCi0JVUNIQVIJCQkJTGVkSW5kaWNhdG9yU3RyZWd0aDsKLQlVQ0hBUgkJCQlSc3NpU2luZ2Fsc3RyZW5ndGhPZmZldDsKLSAgICBCT09MRUFOCQkJCWJMZWRPblNjYW5uaW5nOwotCVVDSEFSCQkJCUxlZFN0YXR1czsKKwl1OCBUeE1peGVyR2FpbjI0RzsJLyogVHggbWl4ZXIgZ2FpbiB2YWx1ZSBmcm9tIEVFUFJPTSB0byBpbXByb3ZlIFR4IEVWTSAvIFR4IERBQywgMi40RyAqLworCXU4IFR4TWl4ZXJHYWluNUc7CisjZW5kaWYJCQkJLyogUlQzMHh4IC8vICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIExFRCBjb250cm9sICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCU1DVV9MRURDU19TVFJVQyBMZWRDbnRsOworCXUxNiBMZWQxOwkJLyogcmVhZCBmcm9tIEVFUFJPTSAweDNjICovCisJdTE2IExlZDI7CQkvKiBFRVBST00gMHgzZSAqLworCXUxNiBMZWQzOwkJLyogRUVQUk9NIDB4NDAgKi8KKwl1OCBMZWRJbmRpY2F0b3JTdHJlbmd0aDsKKwl1OCBSc3NpU2luZ2Fsc3RyZW5ndGhPZmZldDsKKwlCT09MRUFOIGJMZWRPblNjYW5uaW5nOworCXU4IExlZFN0YXR1czsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICA4MDIuMTEgcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCS8vIG91dGdvaW5nIEJFQUNPTiBmcmFtZSBidWZmZXIgYW5kIGNvcnJlc3BvbmRpbmcgVFhECi0JVFhXSV9TVFJVQyAgICAgICAgICAgICAgCUJlYWNvblR4V0k7Ci0JUFVDSEFSCQkJCQkJQmVhY29uQnVmOwotCVVTSE9SVAkJCQkJCUJlYWNvbk9mZnNldFtIV19CRUFDT05fTUFYX0NPVU5UXTsKKwkvKiBvdXRnb2luZyBCRUFDT04gZnJhbWUgYnVmZmVyIGFuZCBjb3JyZXNwb25kaW5nIFRYRCAqLworCXN0cnVjdCBydF90eHdpIEJlYWNvblR4V0k7CisJdTggKkJlYWNvbkJ1ZjsKKwl1MTYgQmVhY29uT2Zmc2V0W0hXX0JFQUNPTl9NQVhfQ09VTlRdOwogCi0JLy8gcHJlLWJ1aWxkIFBTLVBPTEwgYW5kIE5VTEwgZnJhbWUgdXBvbiBsaW5rIHVwLiBmb3IgZWZmaWNpZW5jeSBwdXJwb3NlLgotCVBTUE9MTF9GUkFNRSAgICAgICAgICAgIAlQc1BvbGxGcmFtZTsKLQlIRUFERVJfODAyXzExICAgICAgICAgICAJTnVsbEZyYW1lOworCS8qIHByZS1idWlsZCBQUy1QT0xMIGFuZCBOVUxMIGZyYW1lIHVwb24gbGluayB1cC4gZm9yIGVmZmljaWVuY3kgcHVycG9zZS4gKi8KKwlzdHJ1Y3QgcnRfcHNwb2xsX2ZyYW1lIFBzUG9sbEZyYW1lOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIE51bGxGcmFtZTsKIAotI2lmZGVmIFJUMjg3MAotCVRYX0NPTlRFWFQJCQkJQmVhY29uQ29udGV4dFtCRUFDT05fUklOR19TSVpFXTsKLQlUWF9DT05URVhUCQkJCU51bGxDb250ZXh0OwotCVRYX0NPTlRFWFQJCQkJUHNQb2xsQ29udGV4dDsKLQlUWF9DT05URVhUCQkJCVJUU0NvbnRleHQ7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJc3RydWN0IHJ0X3R4X2NvbnRleHQgQmVhY29uQ29udGV4dFtCRUFDT05fUklOR19TSVpFXTsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCBOdWxsQ29udGV4dDsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCBQc1BvbGxDb250ZXh0OworCXN0cnVjdCBydF90eF9jb250ZXh0IFJUU0NvbnRleHQ7CisjZW5kaWYJCQkJLyogUlRNUF9NQUNfVVNCIC8vICovCiAKKy8qPT09PT09PT09QVA9PT09PT09PT09PSAqLwogCisvKj09PT09PT1TVEE9PT09PT09PT09PSAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogU1RBIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gJiBvcGVyYXRpb24gc3RhdHVzICovCisJLyogdXNlZCBvbmx5IHdoZW4gcEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJc3RydWN0IHJ0X3N0YV9hZG1pbl9jb25maWcgU3RhQ2ZnOwkvKiB1c2VyIGRlc2lyZWQgc2V0dGluZ3MgKi8KKwlzdHJ1Y3QgcnRfc3RhX2FjdGl2ZV9jb25maWcgU3RhQWN0aXZlOwkvKiB2YWxpZCBvbmx5IHdoZW4gQURIT0NfT04ocEFkKSB8fCBJTkZSQV9PTihwQWQpICovCisJY2hhciBuaWNrbmFtZVtJV19FU1NJRF9NQVhfU0laRSArIDFdOwkvKiBuaWNrbmFtZSwgb25seSB1c2VkIGluIHRoZSBpd2NvbmZpZyBpL2YgKi8KKwlpbnQgUHJlTWVkaWFTdGF0ZTsKIAotLy89PT09PT09PT1BUD09PT09PT09PT09CisvKj09PT09PT1Db21tb249PT09PT09PT09PSAqLworCS8qIE9QIG1vZGU6IGVpdGhlciBBUCBvciBTVEEgKi8KKwl1OCBPcE1vZGU7CQkvKiBPUE1PREVfU1RBLCBPUE1PREVfQVAgKi8KIAorCWludCBJbmRpY2F0ZU1lZGlhU3RhdGU7CS8qIEJhc2Ugb24gSW5kaWNhdGlvbiBzdGF0ZSwgZGVmYXVsdCBpcyBOZGlzTWVkaWFTdGF0ZURpc0Nvbm5lY3RlZCAqLwogCi0vLz09PT09PT1TVEE9PT09PT09PT09PQotLyogTW9kaWZpZWQgYnkgV3UgWGktS3VuIDQvMjEvMjAwNiAqLwotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gU1RBIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gJiBvcGVyYXRpb24gc3RhdHVzCi0JLy8gdXNlZCBvbmx5IHdoZW4gcEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JU1RBX0FETUlOX0NPTkZJRyAgICAgICAgU3RhQ2ZnOyAgICAgICAgICAgLy8gdXNlciBkZXNpcmVkIHNldHRpbmdzCi0JU1RBX0FDVElWRV9DT05GSUcgICAgICAgU3RhQWN0aXZlOyAgICAgICAgIC8vIHZhbGlkIG9ubHkgd2hlbiBBREhPQ19PTihwQWQpIHx8IElORlJBX09OKHBBZCkKLQlDSEFSICAgICAgICAgICAgICAgICAgICBuaWNrbmFtZVtJV19FU1NJRF9NQVhfU0laRSsxXTsgLy8gbmlja25hbWUsIG9ubHkgdXNlZCBpbiB0aGUgaXdjb25maWcgaS9mCi0JTkRJU19NRURJQV9TVEFURSAgICAgICAgUHJlTWVkaWFTdGF0ZTsKKwkvKiBNQVQgcmVsYXRlZCBwYXJhbWV0ZXJzICovCiAKLS8vPT09PT09PUNvbW1vbj09PT09PT09PT09Ci0JLy8gT1AgbW9kZTogZWl0aGVyIEFQIG9yIFNUQQotCVVDSEFSICAgICAgICAgICAgICAgICAgIE9wTW9kZTsgICAgICAgICAgICAgICAgICAgICAvLyBPUE1PREVfU1RBLCBPUE1PREVfQVAKKwkvKiBjb25maWd1cmF0aW9uOiByZWFkIGZyb20gUmVnaXN0cnkgJiBFMlBST00gKi8KKwlCT09MRUFOIGJMb2NhbEFkbWluTUFDOwkvKiBVc2UgdXNlciBjaGFuZ2VkIE1BQyAqLworCXU4IFBlcm1hbmVudEFkZHJlc3NbTUFDX0FERFJfTEVOXTsJLyogRmFjdG9yeSBkZWZhdWx0IE1BQyBhZGRyZXNzICovCisJdTggQ3VycmVudEFkZHJlc3NbTUFDX0FERFJfTEVOXTsJLyogVXNlciBjaGFuZ2VkIE1BQyBhZGRyZXNzICovCiAKLQlORElTX01FRElBX1NUQVRFICAgICAgICBJbmRpY2F0ZU1lZGlhU3RhdGU7CQkJLy8gQmFzZSBvbiBJbmRpY2F0aW9uIHN0YXRlLCBkZWZhdWx0IGlzIE5kaXNNZWRpYVN0YXRlRGlzQ29ubmVjdGVkCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogY29tbW9uIGNvbmZpZ3VyYXRpb24gdG8gYm90aCBPUE1PREVfU1RBIGFuZCBPUE1PREVfQVAgKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwlzdHJ1Y3QgcnRfY29tbW9uX2NvbmZpZyBDb21tb25DZmc7CisJc3RydWN0IHJ0X21sbWUgTWxtZTsKIAorCS8qIEFQIG5lZWRzIHRob3NlIHZhaWFibGVzIGZvciBzaXRlIHN1cnZleSBmZWF0dXJlLiAqLworCXN0cnVjdCBydF9tbG1lX2F1eCBNbG1lQXV4OwkvKiB0ZW1wb3Jhcnkgc2V0dGluZ3MgdXNlZCBkdXJpbmcgTUxNRSBzdGF0ZSBtYWNoaW5lICovCisJc3RydWN0IHJ0X2Jzc190YWJsZSBTY2FuVGFiOwkvKiBzdG9yZSB0aGUgbGF0ZXN0IFNDQU4gcmVzdWx0ICovCiAKLQkvLyBjb25maWd1cmF0aW9uOiByZWFkIGZyb20gUmVnaXN0cnkgJiBFMlBST00KLQlCT09MRUFOICAgICAgICAgICAgICAgICBiTG9jYWxBZG1pbk1BQzsgICAgICAgICAgICAgLy8gVXNlIHVzZXIgY2hhbmdlZCBNQUMKLQlVQ0hBUiAgICAgICAgICAgICAgICAgICBQZXJtYW5lbnRBZGRyZXNzW01BQ19BRERSX0xFTl07ICAgIC8vIEZhY3RvcnkgZGVmYXVsdCBNQUMgYWRkcmVzcwotCVVDSEFSICAgICAgICAgICAgICAgICAgIEN1cnJlbnRBZGRyZXNzW01BQ19BRERSX0xFTl07ICAgICAgLy8gVXNlciBjaGFuZ2VkIE1BQyBhZGRyZXNzCisJLypBYm91dCBNYWNUYWIsIHRoZSBzdGEgZHJpdmVyIHdpbGwgdXNlICMwIGFuZCAjMSBmb3IgbXVsdGljYXN0IGFuZCBBUC4gKi8KKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlIE1hY1RhYjsJLyogQVNJQyBvbi1jaGlwIFdDSUQgZW50cnkgdGFibGUuICBBdCBUWCwgQVNJQyBhbHdheXMgdXNlIGtleSBhY2NvcmRpbmcgdG8gdGhpcyBvbi1jaGlwIHRhYmxlLiAqLworCXNwaW5sb2NrX3QgTWFjVGFiTG9jazsKIAotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIGNvbW1vbiBjb25maWd1cmF0aW9uIHRvIGJvdGggT1BNT0RFX1NUQSBhbmQgT1BNT0RFX0FQCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JQ09NTU9OX0NPTkZJRyAgICAgICAgICAgQ29tbW9uQ2ZnOwotCU1MTUVfU1RSVUNUICAgICAgICAgICAgIE1sbWU7CisJc3RydWN0IHJ0X2JhX3RhYmxlIEJBVGFibGU7CiAKLQkvLyBBUCBuZWVkcyB0aG9zZSB2YWlhYmxlcyBmb3Igc2l0ZSBzdXJ2ZXkgZmVhdHVyZS4KLQlNTE1FX0FVWCAgICAgICAgICAgICAgICBNbG1lQXV4OyAgICAgICAgICAgLy8gdGVtcG9yYXJ5IHNldHRpbmdzIHVzZWQgZHVyaW5nIE1MTUUgc3RhdGUgbWFjaGluZQotCUJTU19UQUJMRSAgICAgICAgICAgICAgIFNjYW5UYWI7ICAgICAgICAgICAvLyBzdG9yZSB0aGUgbGF0ZXN0IFNDQU4gcmVzdWx0CisJc3BpbmxvY2tfdCBCQVRhYkxvY2s7CisJc3RydWN0IHJ0X3JhbGlua190aW1lciBSRUNCQVRpbWVyOwogCi0JLy9BYm91dCBNYWNUYWIsIHRoZSBzdGEgZHJpdmVyIHdpbGwgdXNlICMwIGFuZCAjMSBmb3IgbXVsdGljYXN0IGFuZCBBUC4KLQlNQUNfVEFCTEUgICAgICAgICAgICAgICAgIE1hY1RhYjsgICAgIC8vIEFTSUMgb24tY2hpcCBXQ0lEIGVudHJ5IHRhYmxlLiAgQXQgVFgsIEFTSUMgYWx3YXlzIHVzZSBrZXkgYWNjb3JkaW5nIHRvIHRoaXMgb24tY2hpcCB0YWJsZS4KLQlORElTX1NQSU5fTE9DSyAgICAgICAgICBNYWNUYWJMb2NrOworCS8qIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBLRVkgdGFibGVzICovCisJc3RydWN0IHJ0X2NpcGhlcl9rZXkgU2hhcmVkS2V5W01BWF9NQlNTSURfTlVNXVs0XTsJLyogU1RBIGFsd2F5cyB1c2UgU2hhcmVkS2V5W0JTUzBdWzAuLjNdICovCiAKLQlCQV9UQUJMRQkJCUJBVGFibGU7CisJLyogUlggcmUtYXNzZW1ibHkgYnVmZmVyIGZvciBmcmFnbWVudGF0aW9uICovCisJc3RydWN0IHJ0X2ZyYWdtZW50X2ZyYW1lIEZyYWdGcmFtZTsJLyogRnJhbWUgc3RvcmFnZSBmb3IgZnJhZ21lbnQgZnJhbWUgKi8KIAotCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIEJBVGFiTG9jazsKLQlSQUxJTktfVElNRVJfU1RSVUNUIFJFQ0JBVGltZXI7CisJLyogdmFyaW91cyBDb3VudGVycyAqLworCXN0cnVjdCBydF9jb3VudGVyXzgwMl8zIENvdW50ZXJzODAyMzsJLyogODAyLjMgY291bnRlcnMgKi8KKwlzdHJ1Y3QgcnRfY291bnRlcl84MDJfMTEgV2xhbkNvdW50ZXJzOwkvKiA4MDIuMTEgTUlCIGNvdW50ZXJzICovCisJc3RydWN0IHJ0X2NvdW50ZXJfcmFsaW5rIFJhbGlua0NvdW50ZXJzOwkvKiBSYWxpbmsgcHJvcHJpZXR5IGNvdW50ZXJzICovCisJc3RydWN0IHJ0X2NvdW50ZXJfZHJzIERyc0NvdW50ZXJzOwkvKiBjb3VudGVycyBmb3IgRHluYW1pYyBUWCBSYXRlIFN3aXRjaGluZyAqLworCXN0cnVjdCBydF9wcml2YXRlIFByaXZhdGVJbmZvOwkvKiBQcml2YXRlIGluZm9ybWF0aW9uICYgY291bnRlcnMgKi8KIAotCS8vIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBLRVkgdGFibGVzCi0JQ0lQSEVSX0tFWSAgICAgICAgICAgICAgU2hhcmVkS2V5W01BWF9NQlNTSURfTlVNXVs0XTsgLy8gU1RBIGFsd2F5cyB1c2UgU2hhcmVkS2V5W0JTUzBdWzAuLjNdCisJLyogZmxhZ3MsIHNlZSBmUlRNUF9BREFQVEVSX3h4eCBmbGFncyAqLworCXVuc2lnbmVkIGxvbmcgRmxhZ3M7CQkvKiBSZXByZXNlbnQgY3VycmVudCBkZXZpY2Ugc3RhdHVzICovCisJdW5zaWduZWQgbG9uZyBQU0ZsYWdzOwkJLyogUG93ZXIgU2F2ZSBvcGVyYXRpb24gZmxhZy4gKi8KIAotCQkvLyBSWCByZS1hc3NlbWJseSBidWZmZXIgZm9yIGZyYWdtZW50YXRpb24KLQlGUkFHTUVOVF9GUkFNRSAgICAgICAgICBGcmFnRnJhbWU7ICAgICAgICAgICAgICAgICAgLy8gRnJhbWUgc3RvcmFnZSBmb3IgZnJhZ21lbnQgZnJhbWUKKwkvKiBjdXJyZW50IFRYIHNlcXVlbmNlICMgKi8KKwl1MTYgU2VxdWVuY2U7CiAKLQkvLyB2YXJpb3VzIENvdW50ZXJzCi0JQ09VTlRFUl84MDJfMyAgICAgICAgICAgQ291bnRlcnM4MDIzOyAgICAgICAgICAgICAgIC8vIDgwMi4zIGNvdW50ZXJzCi0JQ09VTlRFUl84MDJfMTEgICAgICAgICAgV2xhbkNvdW50ZXJzOyAgICAgICAgICAgICAgIC8vIDgwMi4xMSBNSUIgY291bnRlcnMKLQlDT1VOVEVSX1JBTElOSyAgICAgICAgICBSYWxpbmtDb3VudGVyczsgICAgICAgICAgICAgLy8gUmFsaW5rIHByb3ByaWV0eSBjb3VudGVycwotCUNPVU5URVJfRFJTICAgICAgICAgICAgIERyc0NvdW50ZXJzOyAgICAgICAgICAgICAgICAvLyBjb3VudGVycyBmb3IgRHluYW1pYyBUWCBSYXRlIFN3aXRjaGluZwotCVBSSVZBVEVfU1RSVUMgICAgICAgICAgIFByaXZhdGVJbmZvOyAgICAgICAgICAgICAgICAvLyBQcml2YXRlIGluZm9ybWF0aW9uICYgY291bnRlcnMKKwkvKiBDb250cm9sIGRpc2Nvbm5lY3QgLyBjb25uZWN0IGV2ZW50IGdlbmVyYXRpb24gKi8KKwkvKisrK0RpZG4ndCB1c2VkIGFueW1vcmUgKi8KKwl1bnNpZ25lZCBsb25nIExpbmtEb3duVGltZTsKKwkvKi0tLSAqLworCXVuc2lnbmVkIGxvbmcgTGFzdFJ4UmF0ZTsKKwl1bnNpZ25lZCBsb25nIExhc3RUeFJhdGU7CisJLyorKytVc2VkIG9ubHkgZm9yIFN0YXRpb24gKi8KKwlCT09MRUFOIGJDb25maWdDaGFuZ2VkOwkvKiBDb25maWcgQ2hhbmdlIGZsYWcgZm9yIHRoZSBzYW1lIFNTSUQgc2V0dGluZyAqLworCS8qLS0tICovCiAKLQkvLyBmbGFncywgc2VlIGZSVE1QX0FEQVBURVJfeHh4IGZsYWdzCi0JVUxPTkcgICAgICAgICAgICAgICAgICAgRmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcHJlc2VudCBjdXJyZW50IGRldmljZSBzdGF0dXMKLSNpZmRlZiBSVDI4NjAKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBQU0ZsYWdzOyAgICAgICAgICAgICAgICAgICAgLy8gUG93ZXIgU2F2ZSBvcGVyYXRpb24gZmxhZy4KLSNlbmRpZgorCXVuc2lnbmVkIGxvbmcgRXh0cmFJbmZvOwkvKiBFeHRyYSBpbmZvcm1hdGlvbiBmb3IgZGlzcGxheWluZyBzdGF0dXMgKi8KKwl1bnNpZ25lZCBsb25nIFN5c3RlbUVycm9yQml0bWFwOwkvKiBiMDogRTJQUk9NIHZlcnNpb24gZXJyb3IgKi8KIAotCS8vIGN1cnJlbnQgVFggc2VxdWVuY2UgIwotCVVTSE9SVCAgICAgICAgICAgICAgICAgIFNlcXVlbmNlOworCS8qKysrRGlkbid0IHVzZWQgYW55bW9yZSAqLworCXVuc2lnbmVkIGxvbmcgTWFjSWNWZXJzaW9uOwkvKiBNQUMvQkJQIHNlcmlhbCBpbnRlcmZhY2UgaXNzdWUgc29sdmVkIGFmdGVyIHZlci5EICovCisJLyotLS0gKi8KIAotCS8vIENvbnRyb2wgZGlzY29ubmVjdCAvIGNvbm5lY3QgZXZlbnQgZ2VuZXJhdGlvbgotCS8vKysrRGlkbid0IHVzZWQgYW55bW9yZQotCVVMT05HICAgICAgICAgICAgICAgICAgIExpbmtEb3duVGltZTsKLQkvLy0tLQotCVVMT05HICAgICAgICAgICAgICAgICAgIExhc3RSeFJhdGU7Ci0JVUxPTkcgICAgICAgICAgICAgICAgICAgTGFzdFR4UmF0ZTsKLQkvLysrK1VzZWQgb25seSBmb3IgU3RhdGlvbgotCUJPT0xFQU4gICAgICAgICAgICAgICAgIGJDb25maWdDaGFuZ2VkOyAgICAgICAgIC8vIENvbmZpZyBDaGFuZ2UgZmxhZyBmb3IgdGhlIHNhbWUgU1NJRCBzZXR0aW5nCi0JLy8tLS0KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBTeXN0ZW0gZXZlbnQgbG9nICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJc3RydWN0IHJ0XzgwMl8xMV9ldmVudF90YWJsZSBFdmVudFRhYjsKIAotCVVMT05HICAgICAgICAgICAgICAgICAgIEV4dHJhSW5mbzsgICAgICAgICAgICAgIC8vIEV4dHJhIGluZm9ybWF0aW9uIGZvciBkaXNwbGF5aW5nIHN0YXR1cwotCVVMT05HICAgICAgICAgICAgICAgICAgIFN5c3RlbUVycm9yQml0bWFwOyAgICAgIC8vIGIwOiBFMlBST00gdmVyc2lvbiBlcnJvcgotCi0JLy8rKytEaWRuJ3QgdXNlZCBhbnltb3JlCi0JVUxPTkcgICAgICAgICAgICAgICAgICAgTWFjSWNWZXJzaW9uOyAgICAgICAgICAgLy8gTUFDL0JCUCBzZXJpYWwgaW50ZXJmYWNlIGlzc3VlIHNvbHZlZCBhZnRlciB2ZXIuRAotCS8vLS0tCi0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBTeXN0ZW0gZXZlbnQgbG9nCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JUlRfODAyXzExX0VWRU5UX1RBQkxFICAgRXZlbnRUYWI7Ci0KLQotCUJPT0xFQU4JCUhUQ0VuYWJsZTsKKwlCT09MRUFOIEhUQ0VuYWJsZTsKIAogCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAkvKiAgICAgIFN0YXRpc3RpYyByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIFJUMjg3MAotCVVMT05HCQkJCQkJQnVsa091dERhdGFPbmVTZWNDb3VudDsKLQlVTE9ORwkJCQkJCUJ1bGtJbkRhdGFPbmVTZWNDb3VudDsKLQlVTE9ORwkJCQkJCUJ1bGtMYXN0T25lU2VjQ291bnQ7IC8vIEJ1bGtPdXREYXRhT25lU2VjQ291bnQgKyBCdWxrSW5EYXRhT25lU2VjQ291bnQKLQlVTE9ORwkJCQkJCXdhdGNoRG9nUnhDbnQ7Ci0JVUxPTkcJCQkJCQl3YXRjaERvZ1J4T3ZlckZsb3dDbnQ7Ci0JVUxPTkcJCQkJCQl3YXRjaERvZ1R4UGVuZGluZ0NudFtOVU1fT0ZfVFhfUklOR107Ci0jZW5kaWYgLy8gUlQyODcwIC8vCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJdW5zaWduZWQgbG9uZyBCdWxrT3V0RGF0YU9uZVNlY0NvdW50OworCXVuc2lnbmVkIGxvbmcgQnVsa0luRGF0YU9uZVNlY0NvdW50OworCXVuc2lnbmVkIGxvbmcgQnVsa0xhc3RPbmVTZWNDb3VudDsJLyogQnVsa091dERhdGFPbmVTZWNDb3VudCArIEJ1bGtJbkRhdGFPbmVTZWNDb3VudCAqLworCXVuc2lnbmVkIGxvbmcgd2F0Y2hEb2dSeENudDsKKwl1bnNpZ25lZCBsb25nIHdhdGNoRG9nUnhPdmVyRmxvd0NudDsKKwl1bnNpZ25lZCBsb25nIHdhdGNoRG9nVHhQZW5kaW5nQ250W05VTV9PRl9UWF9SSU5HXTsKKwlpbnQgVHJhbnNmZXJlZExlbmd0aFtOVU1fT0ZfVFhfUklOR107CisjZW5kaWYJCQkJLyogUlRNUF9NQUNfVVNCIC8vICovCiAKLQlCT09MRUFOCQkJCQkJYlVwZGF0ZUJjbkNudERvbmU7Ci0JVUxPTkcJCQkJCQl3YXRjaERvZ01hY0RlYWRsb2NrOwkvLyBwcmV2ZW50IE1BQy9CQlAgaW50byBkZWFkbG9jayBjb25kaXRpb24KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gREVCVUcgcGFyYW1lcnRzCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUJPT0xFQU4JCWJCYW5BbGxCYVNldHVwOwotCUJPT0xFQU4JCWJQcm9taXNjdW91czsKKwlCT09MRUFOIGJVcGRhdGVCY25DbnREb25lOworCXVuc2lnbmVkIGxvbmcgd2F0Y2hEb2dNYWNEZWFkbG9jazsJLyogcHJldmVudCBNQUMvQkJQIGludG8gZGVhZGxvY2sgY29uZGl0aW9uICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIERFQlVHIHBhcmFtZXJ0cyAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKnVuc2lnbmVkIGxvbmcgICAgICAgICBEZWJ1Z1NldHRpbmdbNF07ICovCisJQk9PTEVBTiBiQmFuQWxsQmFTZXR1cDsKKwlCT09MRUFOIGJQcm9taXNjdW91czsKIAotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBydDI4NjBjIGVtdWxhdGlvbi11c2UgUGFyYW1ldGVycwotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlVTE9ORwkJcnRzYWNjdVszMF07Ci0JVUxPTkcJCWN0c2FjY3VbMzBdOwotCVVMT05HCQljZmVuZGFjY3VbMzBdOwotCVVMT05HCQliYWNvbnRlbnRbMTZdOwotCVVMT05HCQlyeGludFtSWF9SSU5HX1NJWkUrMV07Ci0JVUNIQVIJCXJjdmJhWzYwXTsKLQlCT09MRUFOCQliTGlua0FkYXB0OwotCUJPT0xFQU4JCWJGb3JjZVByaW50VFg7Ci0JQk9PTEVBTgkJYkZvcmNlUHJpbnRSWDsKLQlCT09MRUFOCQliRGlzYWJsZXNjYW5uaW5nOwkJLy9kZWZpbmVkIGluIFJUMjg3MCBVU0IKLQlCT09MRUFOCQliU3RhRmlmb1Rlc3Q7Ci0JQk9PTEVBTgkJYlByb3RlY3Rpb25UZXN0OwotCUJPT0xFQU4JCWJIQ0NBVGVzdDsKLQlCT09MRUFOCQliR2VuT25lSENDQTsKLQlCT09MRUFOCQliQnJvYWRDb21IVDsKLQkvLysrK0ZvbGxvd2luZyBhZGQgZnJvbSBSVDI4NzAgVVNCLgotCVVMT05HCQlCdWxrT3V0UmVxOwotCVVMT05HCQlCdWxrT3V0Q29tcGxldGU7Ci0JVUxPTkcJCUJ1bGtPdXRDb21wbGV0ZU90aGVyOwotCVVMT05HCQlCdWxrT3V0Q29tcGxldGVDYW5jZWw7CS8vIHNlZW1zIG5vdCB1c2Ugbm93PwotCVVMT05HCQlCdWxrSW5SZXE7Ci0JVUxPTkcJCUJ1bGtJbkNvbXBsZXRlOwotCVVMT05HCQlCdWxrSW5Db21wbGV0ZUZhaWw7Ci0JLy8tLS0KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogcnQyODYwYyBlbXVsYXRpb24tdXNlIFBhcmFtZXRlcnMgKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyp1bnNpZ25lZCBsb25nICAgICAgICAgcnRzYWNjdVszMF07ICovCisJLyp1bnNpZ25lZCBsb25nICAgICAgICAgY3RzYWNjdVszMF07ICovCisJLyp1bnNpZ25lZCBsb25nICAgICAgICAgY2ZlbmRhY2N1WzMwXTsgKi8KKwkvKnVuc2lnbmVkIGxvbmcgICAgICAgICBiYWNvbnRlbnRbMTZdOyAqLworCS8qdW5zaWduZWQgbG9uZyAgICAgICAgIHJ4aW50W1JYX1JJTkdfU0laRSsxXTsgKi8KKwkvKnU4ICAgICAgICAgcmN2YmFbNjBdOyAqLworCUJPT0xFQU4gYkxpbmtBZGFwdDsKKwlCT09MRUFOIGJGb3JjZVByaW50VFg7CisJQk9PTEVBTiBiRm9yY2VQcmludFJYOworCS8qQk9PTEVBTiAgICAgICAgICAgICAgIGJEaXNhYmxlc2Nhbm5pbmc7ICAgICAgICAgICAgICAgLy9kZWZpbmVkIGluIFJUMjg3MCBVU0IgKi8KKwlCT09MRUFOIGJTdGFGaWZvVGVzdDsKKwlCT09MRUFOIGJQcm90ZWN0aW9uVGVzdDsKKwlCT09MRUFOIGJCcm9hZENvbUhUOworCS8qKysrRm9sbG93aW5nIGFkZCBmcm9tIFJUMjg3MCBVU0IuICovCisJdW5zaWduZWQgbG9uZyBCdWxrT3V0UmVxOworCXVuc2lnbmVkIGxvbmcgQnVsa091dENvbXBsZXRlOworCXVuc2lnbmVkIGxvbmcgQnVsa091dENvbXBsZXRlT3RoZXI7CisJdW5zaWduZWQgbG9uZyBCdWxrT3V0Q29tcGxldGVDYW5jZWw7CS8qIHNlZW1zIG5vdCB1c2Ugbm93PyAqLworCXVuc2lnbmVkIGxvbmcgQnVsa0luUmVxOworCXVuc2lnbmVkIGxvbmcgQnVsa0luQ29tcGxldGU7CisJdW5zaWduZWQgbG9uZyBCdWxrSW5Db21wbGV0ZUZhaWw7CisJLyotLS0gKi8KIAotICAgIHN0cnVjdCB3aWZpY29uZgkJCVdJRkl0ZXN0YmVkOworCXN0cnVjdCB3aWZpY29uZiBXSUZJdGVzdGJlZDsKIAogCXN0cnVjdCByZW9yZGVyaW5nX21wZHVfcG9vbCBtcGR1X2Jsa19wb29sOwogCi0JVUxPTkcJCQkJCU9uZVNlY29uZG5vbkJFcGFja2V0czsJCS8vIHJlY29yZCBub24gQkUgcGFja2V0cyBwZXIgc2Vjb25kCisJdW5zaWduZWQgbG9uZyBPbmVTZWNvbmRub25CRXBhY2tldHM7CS8qIHJlY29yZCBub24gQkUgcGFja2V0cyBwZXIgc2Vjb25kICovCiAKLSAgICBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAgICBpd19zdGF0czsKKyNpZmRlZiBMSU5VWAorCXN0cnVjdCBpd19zdGF0aXN0aWNzIGl3X3N0YXRzOwogCi0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHM7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisjZW5kaWYJCQkJLyogTElOVVggLy8gKi8KIAotCVVMT05HCQkJCQlUYnR0VGlja0NvdW50OworCXVuc2lnbmVkIGxvbmcgVGJ0dFRpY2tDb3VudDsKICNpZmRlZiBQQ0lfTVNJX1NVUFBPUlQKLQlCT09MRUFOCQkJCQlIYXZlTXNpOwotI2VuZGlmIC8vIFBDSV9NU0lfU1VQUE9SVCAvLworCUJPT0xFQU4gSGF2ZU1zaTsKKyNlbmRpZgkJCQkvKiBQQ0lfTVNJX1NVUFBPUlQgLy8gKi8KIAotCi0JVUNIQVIJCQkJCWlzX29uOworCXU4IGlzX29uOwogCiAjZGVmaW5lIFRJTUVfQkFTRQkJCSgxMDAwMDAwL09TX0haKQogI2RlZmluZSBUSU1FX09ORV9TRUNPTkQJCSgxMDAwMDAwL1RJTUVfQkFTRSkKLQlVQ0hBUgkJCQkJZmxnX2JlX2FkanVzdDsKLQlVTE9ORwkJCQkJYmVfYWRqdXN0X2xhc3RfdGltZTsKKwl1OCBmbGdfYmVfYWRqdXN0OworCXVuc2lnbmVkIGxvbmcgYmVfYWRqdXN0X2xhc3RfdGltZTsKIAorCXU4IEZsZ0N0c0VuYWJsZWQ7CisJdTggUE1fRmxnU3VzcGVuZDsKIAotCi0JVUlOVDgJCQkJCVBNX0ZsZ1N1c3BlbmQ7Ci0KLSNpZmRlZiBSVDI4NzAKLQlCT09MRUFOCQliVXNlRWZ1c2U7Ci0jZW5kaWYKLX0gUlRNUF9BREFQVEVSLCAqUFJUTVBfQURBUFRFUjsKLQotLy8KLS8vIENpc2NvIElBUFAgZm9ybWF0Ci0vLwotdHlwZWRlZiBzdHJ1Y3QgIF9DSVNDT19JQVBQX0NPTlRFTlRfCi17Ci0JVVNIT1JUICAgICBMZW5ndGg7ICAgICAgICAvL0lBUFAgTGVuZ3RoCi0JVUNIQVIgICAgICBNZXNzYWdlVHlwZTsgICAgICAvL0lBUFAgdHlwZQotCVVDSEFSICAgICAgRnVuY3Rpb25Db2RlOyAgICAgLy9JQVBQIGZ1bmN0aW9uIHR5cGUKLQlVQ0hBUiAgICAgIERlc3RpbmFpb25NQUNbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgICAgIFNvdXJjZU1BQ1tNQUNfQUREUl9MRU5dOwotCVVTSE9SVCAgICAgVGFnOyAgICAgICAgICAgLy9UYWcoZWxlbWVudCBJRSkgLSBBZGphY2VudCBBUCByZXBvcnQKLQlVU0hPUlQgICAgIFRhZ0xlbmd0aDsgICAgIC8vTGVuZ3RoIG9mIGVsZW1lbnQgbm90IGluY2x1ZGluZyA0IGJ5dGUgaGVhZGVyCi0JVUNIQVIgICAgICBPVUlbNF07ICAgICAgICAgICAvLzB4MDAsIDB4NDAsIDB4OTYsIDB4MDAKLQlVQ0hBUiAgICAgIFByZXZpb3VzQVBbTUFDX0FERFJfTEVOXTsgICAgICAgLy9NQUMgQWRkcmVzcyBvZiBhY2Nlc3MgcG9pbnQKLQlVU0hPUlQgICAgIENoYW5uZWw7Ci0JVVNIT1JUICAgICBTc2lkTGVuOwotCVVDSEFSICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOwotCVVTSE9SVCAgICAgU2Vjb25kczsgICAgICAgICAgLy9TZWNvbmRzIHRoYXQgdGhlIGNsaWVudCBoYXMgYmVlbiBkaXNhc3NvY2lhdGVkLgotfSBDSVNDT19JQVBQX0NPTlRFTlQsICpQQ0lTQ09fSUFQUF9DT05URU5UOworI2lmZGVmIFJUMzB4eAorI2lmZGVmIFJUTVBfRUZVU0VfU1VQUE9SVAorCUJPT0xFQU4gYlVzZUVmdXNlOworCXU4IEVFUFJPTUltYWdlWzEwMjRdOworI2VuZGlmCQkJCS8qIFJUTVBfRUZVU0VfU1VQUE9SVCAvLyAqLworI2VuZGlmCQkJCS8qIFJUMzB4eCAvLyAqLworfTsKIAogI2RlZmluZSBERUxBWUlOVE1BU0sJCTB4MDAwM2ZmZmIKICNkZWZpbmUgSU5UTUFTSwkJCQkweDAwMDNmZmZiCiAjZGVmaW5lIEluZE1hc2sJCQkJMHgwMDAzZmZmYwotI2RlZmluZSBSeElOVAkJCQkweDAwMDAwMDA1CS8vIERlbGF5ZWQgUnggb3IgaW5kaXZpIHJ4Ci0jZGVmaW5lIFR4RGF0YUludAkJCTB4MDAwMDAwZmEJLy8gRGVsYXllZCBUeCBvciBpbmRpdmkgdHgKLSNkZWZpbmUgVHhNZ210SW50CQkJMHgwMDAwMDEwMgkvLyBEZWxheWVkIFR4IG9yIGluZGl2aSB0eAotI2RlZmluZSBUeENvaGVyZW50CQkJMHgwMDAyMDAwMAkvLyB0eCBjb2hlcmVudAotI2RlZmluZSBSeENvaGVyZW50CQkJMHgwMDAxMDAwMAkvLyByeCBjb2hlcmVudAotI2RlZmluZSBNY3VDb21tYW5kCQkJMHgwMDAwMDIwMAkvLyBtY3UKLSNkZWZpbmUgUHJlVEJUVEludAkJCTB4MDAwMDEwMDAJLy8gUHJlLVRCVFQgaW50ZXJydXB0Ci0jZGVmaW5lIFRCVFRJbnQJCQkJMHgwMDAwMDgwMAkJLy8gVEJUVCBpbnRlcnJ1cHQKLSNkZWZpbmUgR1BUaW1lT3V0SW50CQkJMHgwMDAwODAwMAkJLy8gR1B0aW1lb3V0IGludGVycnVwdAotI2RlZmluZSBBdXRvV2FrZXVwSW50CQkweDAwMDA0MDAwCQkvLyBBdXRvV2FrZXVwSW50IGludGVycnVwdAotI2RlZmluZSBGaWZvU3RhRnVsbEludAkJCTB4MDAwMDIwMDAJLy8gIGZpZm8gc3RhdGlzdGljcyBmdWxsIGludGVycnVwdAorI2RlZmluZSBSeElOVAkJCQkweDAwMDAwMDA1CS8qIERlbGF5ZWQgUnggb3IgaW5kaXZpIHJ4ICovCisjZGVmaW5lIFR4RGF0YUludAkJCTB4MDAwMDAwZmEJLyogRGVsYXllZCBUeCBvciBpbmRpdmkgdHggKi8KKyNkZWZpbmUgVHhNZ210SW50CQkJMHgwMDAwMDEwMgkvKiBEZWxheWVkIFR4IG9yIGluZGl2aSB0eCAqLworI2RlZmluZSBUeENvaGVyZW50CQkJMHgwMDAyMDAwMAkvKiB0eCBjb2hlcmVudCAqLworI2RlZmluZSBSeENvaGVyZW50CQkJMHgwMDAxMDAwMAkvKiByeCBjb2hlcmVudCAqLworI2RlZmluZSBNY3VDb21tYW5kCQkJMHgwMDAwMDIwMAkvKiBtY3UgKi8KKyNkZWZpbmUgUHJlVEJUVEludAkJCTB4MDAwMDEwMDAJLyogUHJlLVRCVFQgaW50ZXJydXB0ICovCisjZGVmaW5lIFRCVFRJbnQJCQkJMHgwMDAwMDgwMAkvKiBUQlRUIGludGVycnVwdCAqLworI2RlZmluZSBHUFRpbWVPdXRJbnQJCQkweDAwMDA4MDAwCS8qIEdQdGltZW91dCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgQXV0b1dha2V1cEludAkJMHgwMDAwNDAwMAkvKiBBdXRvV2FrZXVwSW50IGludGVycnVwdCAqLworI2RlZmluZSBGaWZvU3RhRnVsbEludAkJCTB4MDAwMDIwMDAJLyogIGZpZm8gc3RhdGlzdGljcyBmdWxsIGludGVycnVwdCAqLwogCi0KLXR5cGVkZWYgc3RydWN0IF9SWF9CTEtfCi17Ci0JUlQyOFhYX1JYRF9TVFJVQwlSeEQ7Ci0JUFJYV0lfU1RSVUMJCQlwUnhXSTsKLQlQSEVBREVSXzgwMl8xMQkJcEhlYWRlcjsKLQlQTkRJU19QQUNLRVQJCXBSeFBhY2tldDsKLQlVQ0hBUgkJCQkqcERhdGE7Ci0JVVNIT1JUCQkJCURhdGFTaXplOwotCVVTSE9SVAkJCQlGbGFnczsKLQlVQ0hBUgkJCQlVc2VyUHJpb3JpdHk7CS8vIGZvciBjYWxjdWxhdGUgVEtJUCBNSUMgdXNpbmcKLX0gUlhfQkxLOwotCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoJUnggUGF0aCBzb2Z0d2FyZSBjb250cm9sIGJsb2NrIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmVzCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IHJ0X3J4X2JsayB7CisJUlQyOFhYX1JYRF9TVFJVQyBSeEQ7CisJc3RydWN0IHJ0X3J4d2kgKiBwUnhXSTsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBIZWFkZXI7CisJdm9pZCAqcFJ4UGFja2V0OworCXU4ICpwRGF0YTsKKwl1MTYgRGF0YVNpemU7CisJdTE2IEZsYWdzOworCXU4IFVzZXJQcmlvcml0eTsJLyogZm9yIGNhbGN1bGF0ZSBUS0lQIE1JQyB1c2luZyAqLworfTsKIAogI2RlZmluZSBSWF9CTEtfU0VUX0ZMQUcoX3BSeEJsaywgX2ZsYWcpCQkoX3BSeEJsay0+RmxhZ3MgfD0gX2ZsYWcpCiAjZGVmaW5lIFJYX0JMS19URVNUX0ZMQUcoX3BSeEJsaywgX2ZsYWcpCShfcFJ4QmxrLT5GbGFncyAmIF9mbGFnKQogI2RlZmluZSBSWF9CTEtfQ0xFQVJfRkxBRyhfcFJ4QmxrLCBfZmxhZykJKF9wUnhCbGstPkZsYWdzICY9IH4oX2ZsYWcpKQogCi0KICNkZWZpbmUgZlJYX1dEUwkJCTB4MDAwMQogI2RlZmluZSBmUlhfQU1TRFUgICAgICAgMHgwMDAyCiAjZGVmaW5lIGZSWF9BUkFMSU5LICAgICAweDAwMDQKQEAgLTMwMTIsNiArMjE5OSw5IEBACiAjZGVmaW5lIExFTkdUSF9BUkFMSU5LX1NVQkZSQU1FSEVBRAkxNAogI2RlZmluZSBMRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQJIDIKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCVR4IFBhdGggc29mdHdhcmUgY29udHJvbCBibG9jayByZWxhdGVkIGRhdGEgc3RydWN0dXJlcworICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgVFhfVU5LT1dOX0ZSQU1FCQkJMHgwMAogI2RlZmluZSBUWF9NQ0FTVF9GUkFNRQkJCTB4MDEKICNkZWZpbmUgVFhfTEVHQUNZX0ZSQU1FCQkJMHgwMgpAQCAtMzAyMCwxMTQgKzIyMTAsNjUgQEAKICNkZWZpbmUgVFhfUkFMSU5LX0ZSQU1FCQkJMHgxMAogI2RlZmluZSBUWF9GUkFHX0ZSQU1FCQkJMHgyMAogCisvKiAgICAgIEN1cnJlbnRseSB0aGUgc2l6ZW9mKHN0cnVjdCBydF90eF9ibGspIGlzIDE0OCBieXRlcy4gKi8KK3N0cnVjdCBydF90eF9ibGsgeworCXU4IFF1ZUlkeDsKKwl1OCBUeEZyYW1lVHlwZTsJLyogSW5kaWNhdGUgdGhlIFRyYW5zbWlzc2lvbiB0eXBlIG9mIHRoZSBhbGwgZnJhbWVzIGluIG9uZSBiYXRjaCAqLworCXU4IFRvdGFsRnJhbWVOdW07CS8qIFRvdGFsIGZyYW1lIG51bWJlciB3YW50IHRvIHNlbmQtb3V0IGluIG9uZSBiYXRjaCAqLworCXUxNiBUb3RhbEZyYWdOdW07CS8qIFRvdGFsIGZyYW1lIGZyYWdtZW50cyByZXF1aXJlZCBpbiBvbmUgYmF0Y2ggKi8KKwl1MTYgVG90YWxGcmFtZUxlbjsJLyogVG90YWwgbGVuZ3RoIG9mIGFsbCBmcmFtZXMgd2FudCB0byBzZW5kLW91dCBpbiBvbmUgYmF0Y2ggKi8KIAotLy8JQ3VycmVudGx5IHRoZSBzaXplb2YoVFhfQkxLKSBpcyAxNDggYnl0ZXMuCi10eXBlZGVmIHN0cnVjdCBfVFhfQkxLXwotewotCVVDSEFSCQkJCVF1ZUlkeDsKLQlVQ0hBUgkJCQlUeEZyYW1lVHlwZTsJCQkJLy8gSW5kaWNhdGUgdGhlIFRyYW5zbWlzc2lvbiB0eXBlIG9mIHRoZSBhbGwgZnJhbWVzIGluIG9uZSBiYXRjaAotCVVDSEFSCQkJCVRvdGFsRnJhbWVOdW07CQkJCS8vIFRvdGFsIGZyYW1lIG51bWJlciB3YW50IHRvIHNlbmQtb3V0IGluIG9uZSBiYXRjaAotCVVTSE9SVAkJCQlUb3RhbEZyYWdOdW07CQkJCS8vIFRvdGFsIGZyYW1lIGZyYWdtZW50cyByZXF1aXJlZCBpbiBvbmUgYmF0Y2gKLQlVU0hPUlQJCQkJVG90YWxGcmFtZUxlbjsJCQkJLy8gVG90YWwgbGVuZ3RoIG9mIGFsbCBmcmFtZXMgd2FudCB0byBzZW5kLW91dCBpbiBvbmUgYmF0Y2gKKwlzdHJ1Y3QgcnRfcXVldWVfaGVhZGVyIFR4UGFja2V0TGlzdDsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwTWFjRW50cnk7CS8qIE5VTEw6IHBhY2tldCB3aXRoIDgwMi4xMSBSQSBmaWVsZCBpcyBtdWx0aWNhc3QvYnJvYWRjYXN0IGFkZHJlc3MgKi8KKwlIVFRSQU5TTUlUX1NFVFRJTkcgKnBUcmFuc21pdDsKIAotCVFVRVVFX0hFQURFUgkJVHhQYWNrZXRMaXN0OwotCU1BQ19UQUJMRV9FTlRSWQkJKnBNYWNFbnRyeTsJCQkJCS8vIE5VTEw6IHBhY2tldCB3aXRoIDgwMi4xMSBSQSBmaWVsZCBpcyBtdWx0aWNhc3QvYnJvYWRjYXN0IGFkZHJlc3MKLQlIVFRSQU5TTUlUX1NFVFRJTkcJKnBUcmFuc21pdDsKKwkvKiBGb2xsb3dpbmcgc3RydWN0dXJlIHVzZWQgZm9yIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBzcGVjaWZpYyBwYWNrZXQuICovCisJdm9pZCAqcFBhY2tldDsKKwl1OCAqcFNyY0J1ZkhlYWRlcjsJLyogUmVmZXJlbmNlIHRvIHRoZSBoZWFkIG9mIHNrX2J1ZmYtPmRhdGEgKi8KKwl1OCAqcFNyY0J1ZkRhdGE7CS8qIFJlZmVyZW5jZSB0byB0aGUgc2tfYnVmZi0+ZGF0YSwgd2lsbCBjaGFuZ2VkIGRlcGVuZHMgb24gaGFubGRpbmcgcHJvZ3Jlc3NzICovCisJdTMyIFNyY0J1ZkxlbjsJCS8qIExlbmd0aCBvZiBwYWNrZXQgcGF5bG9hZCB3aGljaCBub3QgaW5jbHVkaW5nIExheWVyIDIgaGVhZGVyICovCisJdTggKnBFeHRyYUxsY1NuYXBFbmNhcDsJLyogTlVMTCBtZWFucyBubyBleHRyYSBMTEMvU05BUCBpcyByZXF1aXJlZCAqLworCXU4IEhlYWRlckJ1ZlsxMjhdOwkvKiBUZW1wQnVmZmVyIGZvciBUWF9JTkZPICsgVFhfV0kgKyA4MDIuMTEgSGVhZGVyICsgcGFkZGluZyArIEFNU0RVIFN1YkhlYWRlciArIExMQy9TTkFQICovCisJLypSVDI4NzAgMi4xLjAuMCB1c2VzIG9ubHkgODAgYnl0ZXMgKi8KKwkvKlJUMzA3MCAyLjEuMS4wIHVzZXMgb25seSA5NiBieXRlcyAqLworCS8qUlQzMDkwIDIuMS4wLjAgdXNlcyBvbmx5IDk2IGJ5dGVzICovCisJdTggTXBkdUhlYWRlckxlbjsJLyogODAyLjExIGhlYWRlciBsZW5ndGggTk9UIGluY2x1ZGluZyB0aGUgcGFkZGluZyAqLworCXU4IEhkclBhZExlbjsJLyogcmVjb3JkaW5nIEhlYWRlciBQYWRkaW5nIExlbmd0aDsgKi8KKwl1OCBhcGlkeDsJCS8qIFRoZSBpbnRlcmZhY2UgYXNzb2NpYXRlZCB0byB0aGlzIHBhY2tldCAqLworCXU4IFdjaWQ7CQkvKiBUaGUgTUFDIGVudHJ5IGFzc29jaWF0ZWQgdG8gdGhpcyBwYWNrZXQgKi8KKwl1OCBVc2VyUHJpb3JpdHk7CS8qIHByaW9yaXR5IGNsYXNzIG9mIHBhY2tldCAqLworCXU4IEZyYW1lR2FwOwkJLyogd2hhdCBraW5kIG9mIElGUyB0aGlzIHBhY2tldCB1c2UgKi8KKwl1OCBNcGR1UmVxTnVtOwkvKiBudW1iZXIgb2YgZnJhZ21lbnRzIG9mIHRoaXMgZnJhbWUgKi8KKwl1OCBUeFJhdGU7CQkvKiBUT0RPOiBPYnNvbGV0ZWQ/IFNob3VsZCBjaGFuZ2UgdG8gTUNTPyAqLworCXU4IENpcGhlckFsZzsJLyogY2lwaGVyIGFsb2dyaXRobSAqLworCXN0cnVjdCBydF9jaXBoZXJfa2V5ICpwS2V5OwogCi0JLy8gRm9sbG93aW5nIHN0cnVjdHVyZSB1c2VkIGZvciB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIGEgc3BlY2lmaWMgcGFja2V0LgotCVBORElTX1BBQ0tFVAkJcFBhY2tldDsKLQlQVUNIQVIJCQkJcFNyY0J1ZkhlYWRlcjsJCQkJLy8gUmVmZXJlbmNlIHRvIHRoZSBoZWFkIG9mIHNrX2J1ZmYtPmRhdGEKLQlQVUNIQVIJCQkJcFNyY0J1ZkRhdGE7CQkJCS8vIFJlZmVyZW5jZSB0byB0aGUgc2tfYnVmZi0+ZGF0YSwgd2lsbCBjaGFuZ2VkIGRlcGVuZHMgb24gaGFubGRpbmcgcHJvZ3Jlc3NzCi0JVUlOVAkJCQlTcmNCdWZMZW47CQkJCQkvLyBMZW5ndGggb2YgcGFja2V0IHBheWxvYWQgd2hpY2ggbm90IGluY2x1ZGluZyBMYXllciAyIGhlYWRlcgotCVBVQ0hBUgkJCQlwRXh0cmFMbGNTbmFwRW5jYXA7CQkJLy8gTlVMTCBtZWFucyBubyBleHRyYSBMTEMvU05BUCBpcyByZXF1aXJlZAotCVVDSEFSCQkJCUhlYWRlckJ1Zls4MF07CQkJCS8vIFRlbXBCdWZmZXIgZm9yIFRYX0lORk8gKyBUWF9XSSArIDgwMi4xMSBIZWFkZXIgKyBwYWRkaW5nICsgQU1TRFUgU3ViSGVhZGVyICsgTExDL1NOQVAKLQlVQ0hBUgkJCQlNcGR1SGVhZGVyTGVuOwkJCQkvLyA4MDIuMTEgaGVhZGVyIGxlbmd0aCBOT1QgaW5jbHVkaW5nIHRoZSBwYWRkaW5nCi0JVUNIQVIJCQkJSGRyUGFkTGVuOwkJCQkJLy8gcmVjb3JkaW5nIEhlYWRlciBQYWRkaW5nIExlbmd0aDsKLQlVQ0hBUgkJCQlhcGlkeDsJCQkJCQkvLyBUaGUgaW50ZXJmYWNlIGFzc29jaWF0ZWQgdG8gdGhpcyBwYWNrZXQKLQlVQ0hBUgkJCQlXY2lkOwkJCQkJCS8vIFRoZSBNQUMgZW50cnkgYXNzb2NpYXRlZCB0byB0aGlzIHBhY2tldAotCVVDSEFSCQkJCVVzZXJQcmlvcml0eTsJCQkJLy8gcHJpb3JpdHkgY2xhc3Mgb2YgcGFja2V0Ci0JVUNIQVIJCQkJRnJhbWVHYXA7CQkJCQkvLyB3aGF0IGtpbmQgb2YgSUZTIHRoaXMgcGFja2V0IHVzZQotCVVDSEFSCQkJCU1wZHVSZXFOdW07CQkJCQkvLyBudW1iZXIgb2YgZnJhZ21lbnRzIG9mIHRoaXMgZnJhbWUKLQlVQ0hBUgkJCQlUeFJhdGU7CQkJCQkJLy8gVE9ETzogT2Jzb2xldGVkPyBTaG91bGQgY2hhbmdlIHRvIE1DUz8KLQlVQ0hBUgkJCQlDaXBoZXJBbGc7CQkJCQkvLyBjaXBoZXIgYWxvZ3JpdGhtCi0JUENJUEhFUl9LRVkJCQlwS2V5OworCXUxNiBGbGFnczsJCS8qU2VlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBmb3IgZGV0YWlsLiAqLwogCisJLypZT1UgU0hPVUxEIE5PVCBUT1VDSCBJVCEgRm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIHVzZWQgZm9yIGhhcmR3YXJlLWRlcGVuZGVkIGxheWVyLiAqLworCXVuc2lnbmVkIGxvbmcgUHJpdjsJCS8qIEhhcmR3YXJlIHNwZWNpZmljIHZhbHVlIHNhdmVkIGluIGhlcmUuICovCit9OwogCi0KLQlVU0hPUlQJCQkJRmxhZ3M7CQkJCQkJLy9TZWUgZm9sbG93aW5nIGRlZmluaXRpb25zIGZvciBkZXRhaWwuCi0KLQkvL1lPVSBTSE9VTEQgTk9UIFRPVUNIIElUISBGb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgdXNlZCBmb3IgaGFyZHdhcmUtZGVwZW5kZWQgbGF5ZXIuCi0JVUxPTkcJCQkJUHJpdjsJCQkJCQkvLyBIYXJkd2FyZSBzcGVjaWZpYyB2YWx1ZSBzYXZlZCBpbiBoZXJlLgotfSBUWF9CTEssICpQVFhfQkxLOwotCi0KLSNkZWZpbmUgZlRYX2JSdHNSZXF1aXJlZAkJMHgwMDAxCS8vIEluZGljYXRlIGlmIG5lZWQgc2VuZCBSVFMgZnJhbWUgZm9yIHByb3RlY3Rpb24uIE5vdCB1c2VkIGluIFJUMjg2MC9SVDI4NzAuCi0jZGVmaW5lIGZUWF9iQWNrUmVxdWlyZWQgICAgICAgCTB4MDAwMgkvLyB0aGUgcGFja2V0IG5lZWQgYWNrIHJlc3BvbnNlCi0jZGVmaW5lIGZUWF9iUGlnZ3lCYWNrICAgICAJCTB4MDAwNAkvLyBMZWdhY3kgZGV2aWNlIHVzZSBQaWdnYmFjayBvciBub3QKLSNkZWZpbmUgZlRYX2JIVFJhdGUgICAgICAgICAJMHgwMDA4CS8vIGFsbG93IHRvIHVzZSBIVCByYXRlCi0jZGVmaW5lIGZUWF9iRm9yY2VOb25Rb1MgICAgICAgCTB4MDAxMAkvLyBmb3JjZSB0byB0cmFuc21pdCBmcmFtZSB3aXRob3V0IFdNTS1Rb1MgaW4gSFQgbW9kZQotI2RlZmluZSBmVFhfYkFsbG93RnJhZyAgICAgICAJMHgwMDIwCS8vIGFsbG93IHRvIGZyYWdtZW50IHRoZSBwYWNrZXQsIEEtTVBEVSwgQS1NU0RVLCBBLVJhbGluayBpcyBub3QgYWxsb3dlZCB0byBmcmFnbWVudAotI2RlZmluZSBmVFhfYk1vcmVEYXRhCQkJMHgwMDQwCS8vIHRoZXJlIGFyZSBtb3JlIGRhdGEgcGFja2V0cyBpbiBQb3dlclNhdmUgUXVldWUKLSNkZWZpbmUgZlRYX2JXTU0JCQkJMHgwMDgwCS8vIFFPUyBEYXRhCi0KKyNkZWZpbmUgZlRYX2JSdHNSZXF1aXJlZAkJMHgwMDAxCS8qIEluZGljYXRlIGlmIG5lZWQgc2VuZCBSVFMgZnJhbWUgZm9yIHByb3RlY3Rpb24uIE5vdCB1c2VkIGluIFJUMjg2MC9SVDI4NzAuICovCisjZGVmaW5lIGZUWF9iQWNrUmVxdWlyZWQgICAgICAgCTB4MDAwMgkvKiB0aGUgcGFja2V0IG5lZWQgYWNrIHJlc3BvbnNlICovCisjZGVmaW5lIGZUWF9iUGlnZ3lCYWNrICAgICAJCTB4MDAwNAkvKiBMZWdhY3kgZGV2aWNlIHVzZSBQaWdnYmFjayBvciBub3QgKi8KKyNkZWZpbmUgZlRYX2JIVFJhdGUgICAgICAgICAJMHgwMDA4CS8qIGFsbG93IHRvIHVzZSBIVCByYXRlICovCisjZGVmaW5lIGZUWF9iRm9yY2VOb25Rb1MgICAgICAgCTB4MDAxMAkvKiBmb3JjZSB0byB0cmFuc21pdCBmcmFtZSB3aXRob3V0IFdNTS1Rb1MgaW4gSFQgbW9kZSAqLworI2RlZmluZSBmVFhfYkFsbG93RnJhZyAgICAgICAJMHgwMDIwCS8qIGFsbG93IHRvIGZyYWdtZW50IHRoZSBwYWNrZXQsIEEtTVBEVSwgQS1NU0RVLCBBLVJhbGluayBpcyBub3QgYWxsb3dlZCB0byBmcmFnbWVudCAqLworI2RlZmluZSBmVFhfYk1vcmVEYXRhCQkJMHgwMDQwCS8qIHRoZXJlIGFyZSBtb3JlIGRhdGEgcGFja2V0cyBpbiBQb3dlclNhdmUgUXVldWUgKi8KKyNkZWZpbmUgZlRYX2JXTU0JCQkJMHgwMDgwCS8qIFFPUyBEYXRhICovCiAjZGVmaW5lIGZUWF9iQ2xlYXJFQVBGcmFtZQkJMHgwMTAwCiAKLSNkZWZpbmUgVFhfQkxLX0FTU0lHTl9GTEFHKF9wVHhCbGssIF9mbGFnLCB2YWx1ZSkJXAotCQlkbyB7CQkJCQkJCQkJCVwKLQkJCWlmICh2YWx1ZSkgCQkJCQkJCQlcCi0JCQkJKF9wVHhCbGstPkZsYWdzIHw9IF9mbGFnKSAJCQlcCi0JCQllbHNlIAkJCQkJCQkJCVwKLQkJCQkoX3BUeEJsay0+RmxhZ3MgJj0gfihfZmxhZykpCQlcCi0JCX13aGlsZSgwKQotCiAjZGVmaW5lIFRYX0JMS19TRVRfRkxBRyhfcFR4QmxrLCBfZmxhZykJCShfcFR4QmxrLT5GbGFncyB8PSBfZmxhZykKICNkZWZpbmUgVFhfQkxLX1RFU1RfRkxBRyhfcFR4QmxrLCBfZmxhZykJKCgoX3BUeEJsay0+RmxhZ3MgJiBfZmxhZykgPT0gX2ZsYWcpID8gMSA6IDApCiAjZGVmaW5lIFRYX0JMS19DTEVBUl9GTEFHKF9wVHhCbGssIF9mbGFnKQkoX3BUeEJsay0+RmxhZ3MgJj0gfihfZmxhZykpCiAKLQotCi0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmZGVmIFJUMjg2MAotLy8KLS8vIEVuYWJsZSAmIERpc2FibGUgTklDIGludGVycnVwdCB2aWEgd3JpdGluZyBpbnRlcnJ1cHQgbWFzayByZWdpc3RlcgotLy8gU2luY2UgaXQgdXNlIEFEQVBURVIgc3RydWN0dXJlLCBpdCBoYXZlIHRvIGJlIHB1dCBhZnRlciBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KLS8vCi1fX2lubGluZSAgICBWT0lEICAgIE5JQ0Rpc2FibGVJbnRlcnJ1cHQoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCi17Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX01BU0tfQ1NSLCAweDApOyAgICAgLy8gMDogZGlzYWJsZQotCS8vUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX0lOVF9FTkEsIDB4MCk7CSAJLy8gMHg0MTggaXMgZm9yIGZpcm13YXJlIC4gU1cgZG9lc24ndCBoYW5kbGUgaGVyZS4KLQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpOwotfQotCi1fX2lubGluZSAgICBWT0lEICAgIE5JQ0VuYWJsZUludGVycnVwdCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCkKLXsKLQkvLwotCS8vIEZsYWcgImZPUF9TVEFUVVNfRE9aRSIgT24sIG1lYW5zIEFTSUMgcHV0IHRvIHNsZWVwLCBlbHNlIG1lYW5zIEFTSUMgV2FrZVVwCi0JLy8gVG8gcHJldmVudCBTeXN0ZW0gaGFuZywgd2Ugc2hvdWxkIGVuYWxiZSB0aGUgaW50ZXJydXB0IHdoZW4KLQkvLyBBU0lDIGlzIGFscmVhZHkgV2FrZSBVcC4KLQkvLwotICAgIC8vIFJUMjY2MSA9PiB3aGVuIEFTSUMgaXMgc2xlZXBpbmcsIE1BQyByZWdpc3RlciBjYW5ub3QgYmUgcmVhZCBhbmQgd3JpdHRlbi4KLQkvLyBSVDI4NjAgPT4gd2hlbiBBU0lDIGlzIHNsZWVwaW5nLCBNQUMgcmVnaXN0ZXIgY2FuIGJlIHJlYWQgYW5kIHdyaXR0ZW4uCi0JLy9pZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0JewotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfTUFTS19DU1IsIHBBZC0+aW50X2VuYWJsZV9yZWcgLypERUxBWUlOVE1BU0sqLyk7ICAgICAvLyAxOmVuYWJsZQotCX0KLQkvL2Vsc2UKLQkvLwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJmT1BfU1RBVFVTX0RPWkUgIVxuIikpOwotCi0JLy9SVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfSU5UX0VOQSwgMHgwMDAwMDAzMCk7IC8vIDEgOiBlbmFibGUKLQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfQUNUSVZFKTsKLX0KLQotc3RhdGljIGlubGluZSBWT0lEIENvbnZlcnRNdWx0aWNhc3RJUDJNQUMoCi0JSU4gUFVDSEFSIHBJcEFkZHIsCi0JSU4gUFVDSEFSICpwcE1hY0FkZHIsCi0JSU4gVUlOVDE2IFByb3RvVHlwZSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKglPdGhlciBzdGF0aWMgaW5saW5lIGZ1bmN0aW9uIGRlZmluaXRpb25zCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB2b2lkIENvbnZlcnRNdWx0aWNhc3RJUDJNQUModTggKnBJcEFkZHIsCisJCQkJCSAgdTggKiogcHBNYWNBZGRyLAorCQkJCQkgIHUxNiBQcm90b1R5cGUpCiB7CiAJaWYgKHBJcEFkZHIgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtMzEzNSwyNDE0ICsyMjc2LDE0NTAgQEAKIAlpZiAocHBNYWNBZGRyID09IE5VTEwgfHwgKnBwTWFjQWRkciA9PSBOVUxMKQogCQlyZXR1cm47CiAKLQlzd2l0Y2ggKFByb3RvVHlwZSkKLQl7Ci0JCWNhc2UgRVRIX1BfSVBWNjoKLS8vCQkJbWVtc2V0KCpwcE1hY0FkZHIsIDAsIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyk7Ci0JCQkqKCpwcE1hY0FkZHIpID0gMHgzMzsKLQkJCSooKnBwTWFjQWRkciArIDEpID0gMHgzMzsKLQkJCSooKnBwTWFjQWRkciArIDIpID0gcElwQWRkclsxMl07Ci0JCQkqKCpwcE1hY0FkZHIgKyAzKSA9IHBJcEFkZHJbMTNdOwotCQkJKigqcHBNYWNBZGRyICsgNCkgPSBwSXBBZGRyWzE0XTsKLQkJCSooKnBwTWFjQWRkciArIDUpID0gcElwQWRkclsxNV07Ci0JCQlicmVhazsKKwlzd2l0Y2ggKFByb3RvVHlwZSkgeworCWNhc2UgRVRIX1BfSVBWNjoKKy8qICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgqcHBNYWNBZGRyLCAwLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOyAqLworCQkqKCpwcE1hY0FkZHIpID0gMHgzMzsKKwkJKigqcHBNYWNBZGRyICsgMSkgPSAweDMzOworCQkqKCpwcE1hY0FkZHIgKyAyKSA9IHBJcEFkZHJbMTJdOworCQkqKCpwcE1hY0FkZHIgKyAzKSA9IHBJcEFkZHJbMTNdOworCQkqKCpwcE1hY0FkZHIgKyA0KSA9IHBJcEFkZHJbMTRdOworCQkqKCpwcE1hY0FkZHIgKyA1KSA9IHBJcEFkZHJbMTVdOworCQlicmVhazsKIAotCQljYXNlIEVUSF9QX0lQOgotCQlkZWZhdWx0OgotLy8JCQltZW1zZXQoKnBwTWFjQWRkciwgMCwgRVRIX0xFTkdUSF9PRl9BRERSRVNTKTsKLQkJCSooKnBwTWFjQWRkcikgPSAweDAxOwotCQkJKigqcHBNYWNBZGRyICsgMSkgPSAweDAwOwotCQkJKigqcHBNYWNBZGRyICsgMikgPSAweDVlOwotCQkJKigqcHBNYWNBZGRyICsgMykgPSBwSXBBZGRyWzFdICYgMHg3ZjsKLQkJCSooKnBwTWFjQWRkciArIDQpID0gcElwQWRkclsyXTsKLQkJCSooKnBwTWFjQWRkciArIDUpID0gcElwQWRkclszXTsKLQkJCWJyZWFrOworCWNhc2UgRVRIX1BfSVA6CisJZGVmYXVsdDoKKy8qICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgqcHBNYWNBZGRyLCAwLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOyAqLworCQkqKCpwcE1hY0FkZHIpID0gMHgwMTsKKwkJKigqcHBNYWNBZGRyICsgMSkgPSAweDAwOworCQkqKCpwcE1hY0FkZHIgKyAyKSA9IDB4NWU7CisJCSooKnBwTWFjQWRkciArIDMpID0gcElwQWRkclsxXSAmIDB4N2Y7CisJCSooKnBwTWFjQWRkciArIDQpID0gcElwQWRkclsyXTsKKwkJKigqcHBNYWNBZGRyICsgNSkgPSBwSXBBZGRyWzNdOworCQlicmVhazsKIAl9CiAKIAlyZXR1cm47CiB9Ci0jZW5kaWYgLyogUlQyODYwICovCiAKLS8vCi0vLyAgUHJpdmF0ZSByb3V0aW5lcyBpbiBydG1wX2luaXQuYwotLy8KLU5ESVNfU1RBVFVTIFJUTVBBbGxvY0FkYXB0ZXJCbG9jaygKLQlJTiBQVk9JRAkJCWhhbmRsZSwKLQlPVVQgUFJUTVBfQURBUFRFUiAgICpwcEFkYXB0ZXIKLQkpOworY2hhciAqR2V0UGh5TW9kZShpbnQgTW9kZSk7CitjaGFyICpHZXRCVyhpbnQgQlcpOwogCi1ORElTX1NUQVRVUyBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZAotCSk7CisvKiAqLworLyogIFByaXZhdGUgcm91dGluZXMgaW4gcnRtcF9pbml0LmMgKi8KKy8qICovCitpbnQgUlRNUEFsbG9jQWRhcHRlckJsb2NrKHZvaWQgKmhhbmRsZSwKKwkJCQkgIHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKiAqIHBwQWRhcHRlcik7CiAKLU5ESVNfU1RBVFVTCVJUTVBSZWFkUGFyYW1ldGVyc0hvb2soCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQKLQkpOworaW50IFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgUlRNUEZyZWVBZGFwdGVyKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkCi0JKTsKK3ZvaWQgUlRNUEZyZWVBZGFwdGVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLU5ESVNfU1RBVFVTIE5JQ1JlYWRSZWdQYXJhbWV0ZXJzKAotCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKLQlJTiAgTkRJU19IQU5ETEUgICAgICAgICBXcmFwcGVyQ29uZmlndXJhdGlvbkNvbnRleHQKLQkpOworaW50IE5JQ1JlYWRSZWdQYXJhbWV0ZXJzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgdm9pZCAqV3JhcHBlckNvbmZpZ3VyYXRpb25Db250ZXh0KTsKIAotI2lmZGVmIFJUMjg3MAotVk9JRCBOSUNJbml0UlQzMHh4UkZSZWdpc3RlcnMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotI2VuZGlmIC8vIFJUMjg3MCAvLworI2lmZGVmIFJUTVBfUkZfUldfU1VQUE9SVAordm9pZCBOSUNJbml0UkZSZWdpc3RlcnMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBOSUNSZWFkRUVQUk9NUGFyYW1ldGVycygKLQlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCi0JSU4JUFVDSEFSCQkJCW1hY19hZGRyKTsKK3ZvaWQgUnRtcENoaXBPcHNSRkhvb2soc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBOSUNJbml0QXNpY0Zyb21FRVBST00oCi0JSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkKTsKK2ludCBSVDMweHhXcml0ZVJGUmVnaXN0ZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgdTggcmVnSUQsIHU4IHZhbHVlKTsKIAotVk9JRCBOSUNJbml0VHhSeFJpbmdBbmRCYWNrbG9nUXVldWUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworaW50IFJUMzB4eFJlYWRSRlJlZ2lzdGVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgdTggcmVnSUQsIHU4ICpwVmFsdWUpOworI2VuZGlmIC8qIFJUTVBfUkZfUldfU1VQUE9SVCAvLyAqLwogCi1ORElTX1NUQVRVUyBOSUNJbml0aWFsaXplQWRhcHRlcigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgIEJPT0xFQU4gICAgYkhhcmRSZXNldCk7Cit2b2lkIE5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggKm1hY19hZGRyKTsKIAotTkRJU19TVEFUVVMgTklDSW5pdGlhbGl6ZUFzaWMoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIEJPT0xFQU4JCWJIYXJkUmVzZXQpOwotI2lmZGVmIFJUMjg2MAotVk9JRCBOSUNSZXN0b3JlQkJQVmFsdWUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotI2VuZGlmCi1WT0lEIE5JQ0lzc3VlUmVzZXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwordm9pZCBOSUNJbml0QXNpY0Zyb21FRVBST00oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBSVE1QUmluZ0NsZWFuVXAoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSICAgICAgICAgICBSaW5nVHlwZSk7CitpbnQgTklDSW5pdGlhbGl6ZUFkYXB0ZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBCT09MRUFOIGJIYXJkUmVzZXQpOwogCi1WT0lEIFVzZXJDZmdJbml0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK2ludCBOSUNJbml0aWFsaXplQXNpYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIEJPT0xFQU4gYkhhcmRSZXNldCk7CiAKLVZPSUQgTklDUmVzZXRGcm9tRXJyb3IoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwordm9pZCBOSUNJc3N1ZVJlc2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgTklDRXJhc2VGaXJtd2FyZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Cit2b2lkIFJUTVBSaW5nQ2xlYW5VcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IFJpbmdUeXBlKTsKIAotTkRJU19TVEFUVVMgTklDTG9hZEZpcm13YXJlKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK3ZvaWQgVXNlckNmZ0luaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotTkRJU19TVEFUVVMgTklDTG9hZFJhdGVTd2l0Y2hpbmdQYXJhbXMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwordm9pZCBOSUNSZXNldEZyb21FcnJvcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1CT09MRUFOIE5JQ0NoZWNrRm9ySGFuZygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CitpbnQgTklDTG9hZEZpcm13YXJlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK3ZvaWQgTklDRXJhc2VGaXJtd2FyZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK2ludCBOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtcyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1VTE9ORwlSVE1QTm90QWxsWmVybygKLQlJTglQVk9JRAlwU3JjMSwKLQlJTglVTE9ORwlMZW5ndGgpOworQk9PTEVBTiBOSUNDaGVja0Zvckhhbmcoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBSVE1QWmVyb01lbW9yeSgKLQlJTiAgUFZPSUQgICBwU3JjLAotCUlOICBVTE9ORyAgIExlbmd0aCk7Cit2b2lkIE5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1VTE9ORyBSVE1QQ29tcGFyZU1lbW9yeSgKLQlJTiAgUFZPSUQgICBwU3JjMSwKLQlJTiAgUFZPSUQgICBwU3JjMiwKLQlJTiAgVUxPTkcgICBMZW5ndGgpOwordm9pZCBOSUNVcGRhdGVSYXdDb3VudGVycyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIFJUTVBNb3ZlTWVtb3J5KAotCU9VVCBQVk9JRCAgIHBEZXN0LAotCUlOICBQVk9JRCAgIHBTcmMsCi0JSU4gIFVMT05HICAgTGVuZ3RoKTsKK3ZvaWQgUlRNUFplcm9NZW1vcnkodm9pZCAqcFNyYywgdW5zaWduZWQgbG9uZyBMZW5ndGgpOwogCi1WT0lEIEF0b0goCi0JY2hhcgkqc3JjLAotCVVDSEFSCSpkZXN0LAotCWludAkJZGVzdGxlbik7Cit1bnNpZ25lZCBsb25nIFJUTVBDb21wYXJlTWVtb3J5KHZvaWQgKnBTcmMxLCB2b2lkICpwU3JjMiwgdW5zaWduZWQgbG9uZyBMZW5ndGgpOwogCi1VQ0hBUiBCdG9IKAotCWNoYXIgY2gpOwordm9pZCBSVE1QTW92ZU1lbW9yeSh2b2lkICpwRGVzdCwgdm9pZCAqcFNyYywgdW5zaWduZWQgbG9uZyBMZW5ndGgpOwogCi1WT0lEIFJUTVBQYXRjaE1hY0JicEJ1ZygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Cit2b2lkIEF0b0goY2hhciAqc3JjLCB1OCAqZGVzdCwgaW50IGRlc3RsZW4pOwogCi1WT0lEIFJUTVBJbml0VGltZXIoCi0JSU4gIFBSVE1QX0FEQVBURVIgICAgICAgICAgIHBBZCwKLQlJTiAgUFJBTElOS19USU1FUl9TVFJVQ1QgICAgcFRpbWVyLAotCUlOICBQVk9JRCAgICAgICAgICAgICAgICAgICBwVGltZXJGdW5jLAotCUlOCVBWT0lECQkJCQlwRGF0YSwKLQlJTiAgQk9PTEVBTiAgICAgICAgICAgICAgICAgUmVwZWF0KTsKK3U4IEJ0b0goY2hhciBjaCk7CiAKLVZPSUQgUlRNUFNldFRpbWVyKAotCUlOICBQUkFMSU5LX1RJTUVSX1NUUlVDVCAgICBwVGltZXIsCi0JSU4gIFVMT05HICAgICAgICAgICAgICAgICAgIFZhbHVlKTsKK3ZvaWQgUlRNUFBhdGNoTWFjQmJwQnVnKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKK3ZvaWQgUlRNUEluaXRUaW1lcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgIHN0cnVjdCBydF9yYWxpbmtfdGltZXIgKnBUaW1lciwKKwkJICAgdm9pZCAqcFRpbWVyRnVuYywgdm9pZCAqcERhdGEsIElOIEJPT0xFQU4gUmVwZWF0KTsKIAotVk9JRCBSVE1QTW9kVGltZXIoCi0JSU4JUFJBTElOS19USU1FUl9TVFJVQ1QJcFRpbWVyLAotCUlOCVVMT05HCQkJCQlWYWx1ZSk7Cit2b2lkIFJUTVBTZXRUaW1lcihzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyICpwVGltZXIsIHVuc2lnbmVkIGxvbmcgVmFsdWUpOwogCi1WT0lEIFJUTVBDYW5jZWxUaW1lcigKLQlJTiAgUFJBTElOS19USU1FUl9TVFJVQ1QgICAgcFRpbWVyLAotCU9VVCBCT09MRUFOICAgICAgICAgICAgICAgICAqcENhbmNlbGxlZCk7Cit2b2lkIFJUTVBNb2RUaW1lcihzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyICpwVGltZXIsIHVuc2lnbmVkIGxvbmcgVmFsdWUpOwogCi1WT0lEIFJUTVBTZXRMRUQoCi0JSU4gUFJUTVBfQURBUFRFUiAJcEFkLAotCUlOIFVDSEFSCQkJU3RhdHVzKTsKK3ZvaWQgUlRNUENhbmNlbFRpbWVyKHN0cnVjdCBydF9yYWxpbmtfdGltZXIgKnBUaW1lciwgT1VUIEJPT0xFQU4gKiBwQ2FuY2VsbGVkKTsKIAotVk9JRCBSVE1QU2V0U2lnbmFsTEVEKAotCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKLQlJTiBORElTXzgwMl8xMV9SU1NJIERibSk7Cit2b2lkIFJUTVBTZXRMRUQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBTdGF0dXMpOwogCi1WT0lEIFJUTVBFbmFibGVSeFR4KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKK3ZvaWQgUlRNUFNldFNpZ25hbExFRChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIE5ESVNfODAyXzExX1JTU0kgRGJtKTsKIAotLy8KLS8vIHByb3RvdHlwZSBpbiBhY3Rpb24uYwotLy8KLVZPSUQgQWN0aW9uU3RhdGVNYWNoaW5lSW5pdCgKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKLSAgICBJTiAgU1RBVEVfTUFDSElORSAqUywKLSAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOwordm9pZCBSVE1QRW5hYmxlUnhUeChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIE1sbWVBRERCQUFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworLyogKi8KKy8qIHByb3RvdHlwZSBpbiBhY3Rpb24uYyAqLworLyogKi8KK3ZvaWQgQWN0aW9uU3RhdGVNYWNoaW5lSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgKlMsCisJCQkgICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKIAotVk9JRCBNbG1lREVMQkFBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgTWxtZUFEREJBQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgTWxtZURMU0FjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBNbG1lREVMQkFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBNbG1lSW52YWxpZEFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBNbG1lRExTQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgTWxtZVFPU0FjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBNbG1lSW52YWxpZEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIFBlZXJBZGRCQVJlcUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBNbG1lUU9TQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgUGVlckFkZEJBUnNwQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIFBlZXJBZGRCQVJlcUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIFBlZXJEZWxCQUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBQZWVyQWRkQkFSc3BBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBQZWVyQkFBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgUGVlckRlbEJBQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgU2VuZFBTTVBBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUNIQVIJCQlXY2lkLAotCUlOIFVDSEFSCQkJUHNtcCk7Cit2b2lkIFBlZXJCQUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIFBlZXJSTUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBTZW5kUFNNUEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IFdjaWQsIHU4IFBzbXApOwogCi1WT0lEIFBlZXJQdWJsaWNBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgUGVlclJNQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgUGVlckhUQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIFBlZXJQdWJsaWNBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBQZWVyUU9TQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIFBlZXJIVEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIFJFQ0JBVGltZXJUaW1lb3V0KAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLSAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Cit2b2lkIFBlZXJRT1NBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBPUklCQVRpbWVyVGltZW91dCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Cit2b2lkIFJFQ0JBVGltZXJUaW1lb3V0KHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJICAgICAgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJICAgICAgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKTsKIAotVk9JRCBTZW5kUmVmcmVzaEJBUigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSk7Cit2b2lkIE9SSUJBVGltZXJUaW1lb3V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgQWN0SGVhZGVySW5pdCgKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKLSAgICBJTiBPVVQgUEhFQURFUl84MDJfMTEgcEhkcjgwMjExLAotICAgIElOIFBVQ0hBUiBBZGRyMSwKLSAgICBJTiBQVUNIQVIgQWRkcjIsCi0gICAgSU4gUFVDSEFSIEFkZHIzKTsKK3ZvaWQgU2VuZFJlZnJlc2hCQVIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkpOwogCi1WT0lEIEJhckhlYWRlckluaXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gT1VUIFBGUkFNRV9CQVIgcENudGxCYXIsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBQVUNIQVIgcFNBKTsKK3ZvaWQgQWN0SGVhZGVySW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgIHN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhkcjgwMjExLAorCQkgICB1OCAqQWRkcjEsIHU4ICpBZGRyMiwgdTggKkFkZHIzKTsKIAotVk9JRCBJbnNlcnRBY3RGaWVsZCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbiwKLQlJTiBVSU5UOCBDYXRlZ29yeSwKLQlJTiBVSU5UOCBBY3RDb2RlKTsKK3ZvaWQgQmFySGVhZGVySW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgIHN0cnVjdCBydF9mcmFtZV9iYXIgKiBwQ250bEJhciwgdTggKnBEQSwgdTggKnBTQSk7CiAKLUJPT0xFQU4gQ250bEVucXVldWVGb3JSZWN2KAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVMT05HIFdjaWQsCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotCUlOIFBGUkFNRV9CQV9SRVEgcE1zZyk7Cit2b2lkIEluc2VydEFjdEZpZWxkKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgIHU4ICpwRnJhbWVCdWYsCisJCSAgICB1bnNpZ25lZCBsb25nICpwRnJhbWVMZW4sIHU4IENhdGVnb3J5LCB1OCBBY3RDb2RlKTsKIAotLy8KLS8vIFByaXZhdGUgcm91dGluZXMgaW4gcnRtcF9kYXRhLmMKLS8vCi1CT09MRUFOIFJUTVBIYW5kbGVSeERvbmVJbnRlcnJ1cHQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworQk9PTEVBTiBDbnRsRW5xdWV1ZUZvclJlY3Yoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdW5zaWduZWQgbG9uZyBXY2lkLAorCQkJICAgdW5zaWduZWQgbG9uZyBNc2dMZW4sIHN0cnVjdCBydF9mcmFtZV9iYV9yZXEgKiBwTXNnKTsKIAotQk9PTEVBTiBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgSU5UX1NPVVJDRV9DU1JfU1RSVUMgVHhSaW5nQml0bWFwKTsKKy8qICovCisvKiBQcml2YXRlIHJvdXRpbmVzIGluIHJ0bXBfZGF0YS5jICovCisvKiAqLworQk9PTEVBTiBSVE1QSGFuZGxlUnhEb25lSW50ZXJydXB0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgUlRNUEhhbmRsZU1nbXRSaW5nRG1hRG9uZUludGVycnVwdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CitCT09MRUFOIFJUTVBIYW5kbGVUeFJpbmdEbWFEb25lSW50ZXJydXB0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJIElOVF9TT1VSQ0VfQ1NSX1NUUlVDIFR4UmluZ0JpdG1hcCk7CiAKLVZPSUQgUlRNUEhhbmRsZVRCVFRJbnRlcnJ1cHQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwordm9pZCBSVE1QSGFuZGxlTWdtdFJpbmdEbWFEb25lSW50ZXJydXB0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwordm9pZCBSVE1QSGFuZGxlVEJUVEludGVycnVwdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi12b2lkIFJUTVBIYW5kbGVUd2FrZXVwSW50ZXJydXB0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK3ZvaWQgUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRAlSVE1QSGFuZGxlUnhDb2hlcmVudEludGVycnVwdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Cit2b2lkIFJUTVBIYW5kbGVUd2FrZXVwSW50ZXJydXB0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLUJPT0xFQU4gVHhGcmFtZUlzQWdncmVnYXRpYmxlKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcFByZXZBZGRyMSwKLQlJTiAgUFVDSEFSICAgICAgICAgIHA4MDIzaGRyKTsKK3ZvaWQgUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotQk9PTEVBTiBQZWVySXNBZ2dyZU9uKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBVTE9ORyAgICAgICAgICBUeFJhdGUsCi0gICAgSU4gIFBNQUNfVEFCTEVfRU5UUlkgcE1hY0VudHJ5KTsKK0JPT0xFQU4gVHhGcmFtZUlzQWdncmVnYXRpYmxlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgIHU4ICpwUHJldkFkZHIxLCB1OCAqcDgwMjNoZHIpOwogCi1ORElTX1NUQVRVUyBTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKAotCUlOICBQTkRJU19CVUZGRVIgICAgcEZpcnN0QnVmZmVyLAotCUlOICBVQ0hBUiAgICAgICAgICAgRGVzaXJlZE9mZnNldCwKLQlPVVQgUFVDSEFSICAgICAgICAgIHBCeXRlMCwKLQlPVVQgUFVDSEFSICAgICAgICAgIHBCeXRlMSk7CitCT09MRUFOIFBlZXJJc0FnZ3JlT24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICB1bnNpZ25lZCBsb25nIFR4UmF0ZSwgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcE1hY0VudHJ5KTsKIAotTkRJU19TVEFUVVMgU1RBU2VuZFBhY2tldCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOworaW50IFNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIoY2hhciAqcEZpcnN0QnVmZmVyLAorCQkJCSAgICAgIHU4IERlc2lyZWRPZmZzZXQsCisJCQkJICAgICAgdTggKnBCeXRlMCwgdTggKnBCeXRlMSk7CiAKLVZPSUQgU1RBU2VuZFBhY2tldHMoCi0JSU4gIE5ESVNfSEFORExFICAgICBNaW5pcG9ydEFkYXB0ZXJDb250ZXh0LAotCUlOICBQUE5ESVNfUEFDS0VUICAgcHBQYWNrZXRBcnJheSwKLQlJTiAgVUlOVCAgICAgICAgICAgIE51bWJlck9mUGFja2V0cyk7CitpbnQgU1RBU2VuZFBhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHZvaWQgKnBQYWNrZXQpOwogCi1WT0lEIFJUTVBEZVF1ZXVlUGFja2V0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgCUlOCUJPT0xFQU4JCQliSW50Q29udGV4dCwKLQlJTiAgVUNIQVIJCQlRdWVJZHgsCi0JSU4JVUNIQVIJCQlNYXhfVHhfUGFja2V0cyk7Cit2b2lkIFNUQVNlbmRQYWNrZXRzKHZvaWQgKk1pbmlwb3J0QWRhcHRlckNvbnRleHQsCisJCSAgICB2b2lkICoqcHBQYWNrZXRBcnJheSwgdTMyIE51bWJlck9mUGFja2V0cyk7CiAKLU5ESVNfU1RBVFVTCVJUTVBIYXJkVHJhbnNtaXQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gUE5ESVNfUEFDS0VUCQlwUGFja2V0LAotCUlOICBVQ0hBUgkJCVF1ZUlkeCwKLQlPVVQJUFVMT05HCQkJcEZyZWVUWERMZWZ0KTsKK3ZvaWQgUlRNUERlUXVldWVQYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICAgSU4gQk9PTEVBTiBiSW50Q29udGV4dCwKKwkJICAgICAgIHU4IFF1ZUlkeCwgdTggTWF4X1R4X1BhY2tldHMpOwogCi1ORElTX1NUQVRVUwlTVEFIYXJkVHJhbnNtaXQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVFhfQkxLCQkJKnBUeEJsaywKLQlJTiAgVUNIQVIJCQlRdWVJZHgpOworaW50IFJUTVBIYXJkVHJhbnNtaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB2b2lkICpwUGFja2V0LAorCQkJICAgICB1OCBRdWVJZHgsIHVuc2lnbmVkIGxvbmcgKnBGcmVlVFhETGVmdCk7CiAKLVZPSUQgU1RBUnhFQVBPTEZyYW1lSW5kaWNhdGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKK2ludCBTVEFIYXJkVHJhbnNtaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaywgdTggUXVlSWR4KTsKIAotTkRJU19TVEFUVVMgUlRNUEZyZWVUWERSZXF1ZXN0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUiAgICAgICAgICAgUmluZ1R5cGUsCi0JSU4gIFVDSEFSICAgICAgICAgICBOdW1iZXJSZXF1aXJlZCwKLQlJTiAJUFVDSEFSICAgICAgICAgIEZyZWVOdW1iZXJJcyk7Cit2b2lkIFNUQVJ4RUFQT0xGcmFtZUluZGljYXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LAorCQkJICAgICBzdHJ1Y3QgcnRfcnhfYmxrICpwUnhCbGssIHU4IEZyb21XaGljaEJTU0lEKTsKIAotTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUNIQVIJUXVlSWR4LAotCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7CitpbnQgUlRNUEZyZWVUWERSZXF1ZXN0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgICB1OCBSaW5nVHlwZSwKKwkJCSAgICAgICB1OCBOdW1iZXJSZXF1aXJlZCwgdTggKkZyZWVOdW1iZXJJcyk7CiAKLU5ESVNfU1RBVFVTIE1sbWVIYXJkVHJhbnNtaXRNZ210UmluZygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUNIQVIJUXVlSWR4LAotCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7CitpbnQgTWxtZUhhcmRUcmFuc21pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHU4IFF1ZUlkeCwgdm9pZCAqcFBhY2tldCk7CiAKLU5ESVNfU1RBVFVTIE1sbWVIYXJkVHJhbnNtaXRUeFJpbmcoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSCVF1ZUlkeCwKLQlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOworaW50IE1sbWVIYXJkVHJhbnNtaXRNZ210UmluZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgICB1OCBRdWVJZHgsIHZvaWQgKnBQYWNrZXQpOwogCi1VU0hPUlQgIFJUTVBDYWxjRHVyYXRpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSICAgICAgICAgICBSYXRlLAotCUlOICBVTE9ORyAgICAgICAgICAgU2l6ZSk7CisjaWZkZWYgUlRNUF9NQUNfUENJCitpbnQgTWxtZUhhcmRUcmFuc21pdFR4UmluZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgdTggUXVlSWR4LCB2b2lkICpwUGFja2V0KTsKIAotVk9JRCBSVE1QV3JpdGVUeFdJKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBUWFdJX1NUUlVDCQlwVHhXSSwKLQlJTiAgQk9PTEVBTiAgICAJCUZSQUcsCi0JSU4gIEJPT0xFQU4gICAgCQlDRkFDSywKLQlJTiAgQk9PTEVBTiAgICAJCUluc1RpbWVzdGFtcCwKLQlJTglCT09MRUFOCQkJQU1QRFUsCi0JSU4JQk9PTEVBTgkJCUFjaywKLQlJTglCT09MRUFOCQkJTlNlcSwJCS8vIEhXIG5ldyBhIHNlcXVlbmNlLgotCUlOCVVDSEFSCQkJQkFTaXplLAotCUlOCVVDSEFSCQkJV0NJRCwKLQlJTglVTE9ORwkJCUxlbmd0aCwKLQlJTiAgVUNIQVIgICAgICAJCVBJRCwKLQlJTglVQ0hBUgkJCVRJRCwKLQlJTglVQ0hBUgkJCVR4UmF0ZSwKLQlJTglVQ0hBUgkJCVR4b3Btb2RlLAotCUlOCUJPT0xFQU4JCQlDZkFjaywKLQlJTglIVFRSQU5TTUlUX1NFVFRJTkcJKnBUcmFuc21pdCk7CitpbnQgTWxtZURhdGFIYXJkVHJhbnNtaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSB1OCBRdWVJZHgsIHZvaWQgKnBQYWNrZXQpOwogCit2b2lkIFJUTVBXcml0ZVR4RGVzY3JpcHRvcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICBzdHJ1Y3QgcnRfdHhkICogcFR4RCwgSU4gQk9PTEVBTiBiV0lWLCB1OCBRU0VMKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAotVk9JRCBSVE1QV3JpdGVUeFdJX0RhdGEoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCU9VVCBQVFhXSV9TVFJVQwkJcFR4V0ksCi0JSU4JVFhfQkxLCQkJCSpwVHhCbGspOwordTE2IFJUTVBDYWxjRHVyYXRpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBSYXRlLCB1bnNpZ25lZCBsb25nIFNpemUpOwogCit2b2lkIFJUTVBXcml0ZVR4V0koc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfdHh3aSAqIHBUeFdJLCBJTiBCT09MRUFOIEZSQUcsIElOIEJPT0xFQU4gQ0ZBQ0ssIElOIEJPT0xFQU4gSW5zVGltZXN0YW1wLCBJTiBCT09MRUFOIEFNUERVLCBJTiBCT09MRUFOIEFjaywgSU4gQk9PTEVBTiBOU2VxLAkvKiBIVyBuZXcgYSBzZXF1ZW5jZS4gKi8KKwkJICAgdTggQkFTaXplLAorCQkgICB1OCBXQ0lELAorCQkgICB1bnNpZ25lZCBsb25nIExlbmd0aCwKKwkJICAgdTggUElELAorCQkgICB1OCBUSUQsCisJCSAgIHU4IFR4UmF0ZSwKKwkJICAgdTggVHhvcG1vZGUsCisJCSAgIElOIEJPT0xFQU4gQ2ZBY2ssIElOIEhUVFJBTlNNSVRfU0VUVElORyAqIHBUcmFuc21pdCk7CiAKLVZPSUQgUlRNUFdyaXRlVHhXSV9DYWNoZSgKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JT1VUIFBUWFdJX1NUUlVDCQlwVHhXSSwKLQlJTglUWF9CTEsJCQkJKnBUeEJsayk7Cit2b2lkIFJUTVBXcml0ZVR4V0lfRGF0YShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQlzdHJ1Y3QgcnRfdHh3aSAqIHBUeFdJLCBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGspOwogCi1WT0lEIFJUTVBXcml0ZVR4RGVzY3JpcHRvcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVFhEX1NUUlVDCQlwVHhELAotCUlOCUJPT0xFQU4JCQliV0lWLAotCUlOCVVDSEFSCQkJUVNFTCk7Cit2b2lkIFJUTVBXcml0ZVR4V0lfQ2FjaGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHN0cnVjdCBydF90eHdpICogcFR4V0ksIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsayk7CiAKLVZPSUQgUlRNUFN1c3BlbmRNc2R1VHJhbnNtaXNzaW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK3ZvaWQgUlRNUFN1c3BlbmRNc2R1VHJhbnNtaXNzaW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgUlRNUFJlc3VtZU1zZHVUcmFuc21pc3Npb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwordm9pZCBSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1ORElTX1NUQVRVUyBNaW5pcG9ydE1NUmVxdWVzdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTglVQ0hBUgkJCVF1ZUlkeCwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTiAgVUlOVCAgICAgICAgICAgIExlbmd0aCk7CitpbnQgTWluaXBvcnRNTVJlcXVlc3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgdTggUXVlSWR4LCB1OCAqcERhdGEsIHUzMiBMZW5ndGgpOwogCi1WT0lEIFJUTVBTZW5kTnVsbEZyYW1lKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUiAgICAgICAgICAgVHhSYXRlLAotCUlOCUJPT0xFQU4JCQliUW9zTnVsbCk7CisvKisrK21hcmsgYnkgc2hpYW5nLCBub3cgdGhpcyBmdW5jdGlvbiBtZXJnZSB0byBNaW5pcG9ydE1NUmVxdWVzdCgpICovCisvKi0tLW1hcmsgYnkgc2hpYW5nLCBub3cgdGhpcyBmdW5jdGlvbiBtZXJnZSB0byBNaW5pcG9ydE1NUmVxdWVzdCgpICovCiAKLVZPSUQgUlRNUFNlbmREaXNhc3NvY2lhdGlvbkZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKK3ZvaWQgUlRNUFNlbmROdWxsRnJhbWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICAgdTggVHhSYXRlLCBJTiBCT09MRUFOIGJRb3NOdWxsKTsKIAotVk9JRCBSVE1QU2VuZFJUU0ZyYW1lKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcERBLAotCUlOCXVuc2lnbmVkIGludAlOZXh0TXBkdVNpemUsCi0JSU4gIFVDSEFSICAgICAgICAgICBUeFJhdGUsCi0JSU4gIFVDSEFSICAgICAgICAgICBSVFNSYXRlLAotCUlOICBVU0hPUlQgICAgICAgICAgQWNrRHVyYXRpb24sCi0JSU4gIFVDSEFSICAgICAgICAgICBRdWVJZHgsCi0JSU4gIFVDSEFSCQkJRnJhbWVHYXApOwordm9pZCBSVE1QU2VuZERpc2Fzc29jaWF0aW9uRnJhbWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotUFFVRVVFX0hFQURFUiAgIFJUTVBDaGVja1R4U3dRdWV1ZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlPVVQgVUNIQVIgICAgICAgICAgICpRdWVJZHgpOwordm9pZCBSVE1QU2VuZFJUU0ZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgdTggKnBEQSwKKwkJICAgICAgSU4gdW5zaWduZWQgaW50IE5leHRNcGR1U2l6ZSwKKwkJICAgICAgdTggVHhSYXRlLAorCQkgICAgICB1OCBSVFNSYXRlLAorCQkgICAgICB1MTYgQWNrRHVyYXRpb24sCisJCSAgICAgIHU4IFF1ZUlkeCwgdTggRnJhbWVHYXApOwogCi1WT0lEIFJUTVBSZXBvcnRNaWNFcnJvcigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUENJUEhFUl9LRVkgICAgIHBXcGFLZXkpOworc3RydWN0IHJ0X3F1ZXVlX2hlYWRlciAqUlRNUENoZWNrVHhTd1F1ZXVlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggKiBRdWVJZHgpOwogCi1WT0lECVdwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIFJUTVBSZXBvcnRNaWNFcnJvcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9jaXBoZXJfa2V5ICpwV3BhS2V5KTsKIAotVk9JRCAgICBXcGFEaXNhc3NvY0FwQW5kQmxvY2tBc3NvYygKLSAgICBJTiAgUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotICAgIElOICBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0gICAgSU4gIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLSAgICBJTiAgUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKK3ZvaWQgV3BhTWljRmFpbHVyZVJlcG9ydEZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLU5ESVNfU1RBVFVTIFJUTVBDbG9uZU5kaXNQYWNrZXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4JQk9PTEVBTiAgICBwSW5zQU1TRFVIZHIsCi0JSU4gIFBORElTX1BBQ0tFVCAgICBwSW5QYWNrZXQsCi0JT1VUIFBORElTX1BBQ0tFVCAgICpwcE91dFBhY2tldCk7Cit2b2lkIFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJCQl2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCQkJdm9pZCAqU3lzdGVtU3BlY2lmaWMyLAorCQkJCXZvaWQgKlN5c3RlbVNwZWNpZmljMyk7CiAKLU5ESVNfU1RBVFVTIFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBORElTX1BBQ0tFVCAgICAqcFBhY2tldCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBIZWFkZXIsCi0JSU4gIFVJTlQgICAgICAgICAgICBIZWFkZXJMZW4sCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKLQlJTiAgVUlOVCAgICAgICAgICAgIERhdGFMZW4pOwordm9pZCBXcGFTdGFQYWlyd2lzZUtleVNldHRpbmcoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBSVE1QRnJlZU5kaXNQYWNrZXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKK3ZvaWQgV3BhU3RhR3JvdXBLZXlTZXR0aW5nKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLUJPT0xFQU4gUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKAotCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCUlOIFVDSEFSICAgICAgICAgICAgUXVlSWR4KTsKK2ludCBSVE1QQ2xvbmVOZGlzUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQlJTiBCT09MRUFOIHBJbnNBTVNEVUhkciwKKwkJCQl2b2lkICpwSW5QYWNrZXQsCisJCQkJdm9pZCAqKiBwcE91dFBhY2tldCk7CiAKLUJPT0xFQU4gUlRNUENoZWNrREhDUEZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KTsKK2ludCBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICB2b2lkICoqIHBQYWNrZXQsCisJCQkJICAgdTggKnBIZWFkZXIsCisJCQkJICAgdTMyIEhlYWRlckxlbiwKKwkJCQkgICB1OCAqcERhdGEsIHUzMiBEYXRhTGVuKTsKIAordm9pZCBSVE1QRnJlZU5kaXNQYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB2b2lkICpwUGFja2V0KTsKIAotQk9PTEVBTiBSVE1QQ2hlY2tFdGhlclR5cGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpOworQk9PTEVBTiBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBRdWVJZHgpOwogCitCT09MRUFOIFJUTVBDaGVja0RIQ1BGcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHZvaWQgKnBQYWNrZXQpOwogCi0vLwotLy8gUHJpdmF0ZSByb3V0aW5lcyBpbiBydG1wX3dlcC5jCi0vLwotVk9JRCBSVE1QSW5pdFdlcEVuZ2luZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBLZXksCi0JSU4gIFVDSEFSICAgICAgICAgICBLZXlJZCwKLQlJTiAgVUNIQVIgICAgICAgICAgIEtleUxlbiwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEZXN0KTsKK0JPT0xFQU4gUlRNUENoZWNrRXRoZXJUeXBlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdm9pZCAqcFBhY2tldCk7CiAKLVZPSUQgUlRNUEVuY3J5cHREYXRhKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEZXN0LAotCUlOICBVSU5UICAgICAgICAgICAgTGVuKTsKKy8qICovCisvKiBQcml2YXRlIHJvdXRpbmVzIGluIHJ0bXBfd2VwLmMgKi8KKy8qICovCit2b2lkIFJUTVBJbml0V2VwRW5naW5lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIHU4ICpwS2V5LAorCQkgICAgICAgdTggS2V5SWQsIHU4IEtleUxlbiwgdTggKnBEZXN0KTsKIAotQk9PTEVBTglSVE1QU29mdERlY3J5cHRXRVAoCi0JSU4gUFJUTVBfQURBUFRFUiAJcEFkLAotCUlOIFBVQ0hBUgkJCXBEYXRhLAotCUlOIFVMT05HCQkJRGF0YUJ5dGVDbnQsCi0JSU4gUENJUEhFUl9LRVkJCXBHcm91cEtleSk7Cit2b2lkIFJUTVBFbmNyeXB0RGF0YShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgdTggKnBTcmMsIHU4ICpwRGVzdCwgdTMyIExlbik7CiAKLVZPSUQgUlRNUFNldElDVigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEZXN0KTsKK0JPT0xFQU4gUlRNUFNvZnREZWNyeXB0V0VQKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHU4ICpwRGF0YSwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgRGF0YUJ5dGVDbnQsIHN0cnVjdCBydF9jaXBoZXJfa2V5ICpwR3JvdXBLZXkpOwogCi1WT0lEIEFSQ0ZPVVJfSU5JVCgKLQlJTiAgUEFSQ0ZPVVJDT05URVhUIEN0eCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBLZXksCi0JSU4gIFVJTlQgICAgICAgICAgICBLZXlMZW4pOwordm9pZCBSVE1QU2V0SUNWKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggKnBEZXN0KTsKIAotVUNIQVIgICBBUkNGT1VSX0JZVEUoCi0JSU4gIFBBUkNGT1VSQ09OVEVYVCAgICAgQ3R4KTsKK3ZvaWQgQVJDRk9VUl9JTklUKHN0cnVjdCBydF9hcmNmb3VyY29udGV4dCAqQ3R4LCB1OCAqcEtleSwgdTMyIEtleUxlbik7CiAKLVZPSUQgQVJDRk9VUl9ERUNSWVBUKAotCUlOICBQQVJDRk9VUkNPTlRFWFQgQ3R4LAotCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAotCUlOICBVSU5UICAgICAgICAgICAgTGVuKTsKK3U4IEFSQ0ZPVVJfQllURShzdHJ1Y3QgcnRfYXJjZm91cmNvbnRleHQgKkN0eCk7CiAKLVZPSUQgQVJDRk9VUl9FTkNSWVBUKAotCUlOICBQQVJDRk9VUkNPTlRFWFQgQ3R4LAotCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAotCUlOICBVSU5UICAgICAgICAgICAgTGVuKTsKK3ZvaWQgQVJDRk9VUl9ERUNSWVBUKHN0cnVjdCBydF9hcmNmb3VyY29udGV4dCAqQ3R4LAorCQkgICAgIHU4ICpwRGVzdCwgdTggKnBTcmMsIHUzMiBMZW4pOwogCi1WT0lEIFdQQUFSQ0ZPVVJfRU5DUllQVCgKLQlJTiAgUEFSQ0ZPVVJDT05URVhUIEN0eCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEZXN0LAotCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKLQlJTiAgVUlOVCAgICAgICAgICAgIExlbik7Cit2b2lkIEFSQ0ZPVVJfRU5DUllQVChzdHJ1Y3QgcnRfYXJjZm91cmNvbnRleHQgKkN0eCwKKwkJICAgICB1OCAqcERlc3QsIHU4ICpwU3JjLCB1MzIgTGVuKTsKIAotVUlOVCBSVE1QX0NBTENfRkNTMzIoCi0JSU4gIFVJTlQgICBGY3MsCi0JSU4gIFBVQ0hBUiAgQ3AsCi0JSU4gIElOVCAgICAgTGVuKTsKK3ZvaWQgV1BBQVJDRk9VUl9FTkNSWVBUKHN0cnVjdCBydF9hcmNmb3VyY29udGV4dCAqQ3R4LAorCQkJdTggKnBEZXN0LCB1OCAqcFNyYywgdTMyIExlbik7CiAKLS8vCi0vLyBNTE1FIHJvdXRpbmVzCi0vLwordTMyIFJUTVBfQ0FMQ19GQ1MzMih1MzIgRmNzLCB1OCAqQ3AsIGludCBMZW4pOwogCi0vLyBBc2ljL1JGL0JCUCByZWxhdGVkIGZ1bmN0aW9ucworLyogKi8KKy8qIE1MTUUgcm91dGluZXMgKi8KKy8qICovCiAKLVZPSUQgQXNpY0FkanVzdFR4UG93ZXIoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOworLyogQXNpYy9SRi9CQlAgcmVsYXRlZCBmdW5jdGlvbnMgKi8KIAotVk9JRCAJQXNpY1VwZGF0ZVByb3RlY3QoCi0JSU4JCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOIAkJVVNIT1JUCQkJT3BlcmFpb25Nb2RlLAotCUlOIAkJVUNIQVIJCQlTZXRNYXNrLAotCUlOCQlCT09MRUFOCQkJYkRpc2FibGVCR1Byb3RlY3QsCi0JSU4JCUJPT0xFQU4JCQliTm9uR0ZFeGlzdCk7Cit2b2lkIEFzaWNBZGp1c3RUeFBvd2VyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgQXNpY1N3aXRjaENoYW5uZWwoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4JVUNIQVIJCQlDaGFubmVsLAotCUlOCUJPT0xFQU4JCQliU2Nhbik7Cit2b2lkIEFzaWNVcGRhdGVQcm90ZWN0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIHUxNiBPcGVyYWlvbk1vZGUsCisJCSAgICAgICB1OCBTZXRNYXNrLAorCQkgICAgICAgSU4gQk9PTEVBTiBiRGlzYWJsZUJHUHJvdGVjdCwgSU4gQk9PTEVBTiBiTm9uR0ZFeGlzdCk7CiAKLVZPSUQgQXNpY0xvY2tDaGFubmVsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSIENoYW5uZWwpIDsKK3ZvaWQgQXNpY1N3aXRjaENoYW5uZWwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICAgdTggQ2hhbm5lbCwgSU4gQk9PTEVBTiBiU2Nhbik7CiAKLVZPSUQgQXNpY1JmVHVuaW5nRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwordm9pZCBBc2ljTG9ja0NoYW5uZWwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBDaGFubmVsKTsKIAotVk9JRCBBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVVNIT1JUIFRidHROdW1Ub05leHRXYWtlVXApOwordm9pZCBBc2ljUmZUdW5pbmdFeGVjKHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJICAgICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkgICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMyk7CiAKLVZPSUQgQXNpY0ZvcmNlU2xlZXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwordm9pZCBBc2ljUmVzZXRCQlBBZ2VudChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIEFzaWNGb3JjZVdha2V1cCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSNpZmRlZiBSVDI4NjAKLQlJTiBVQ0hBUiAgICAJIExldmVsKTsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCUlOIEJPT0xFQU4gICAgYkZyb21UeCk7Ci0jZW5kaWYKK3ZvaWQgQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB1MTYgVGJ0dE51bVRvTmV4dFdha2VVcCk7CiAKLVZPSUQgQXNpY1NldEJzc2lkKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgcEJzc2lkKTsKK3ZvaWQgQXNpY0ZvcmNlU2xlZXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBBc2ljU2V0TWNhc3RXQygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Cit2b2lkIEFzaWNGb3JjZVdha2V1cChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIEJPT0xFQU4gYkZyb21UeCk7CiAKLVZPSUQgQXNpY0RlbFdjaWRUYWIoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIJV2NpZCk7Cit2b2lkIEFzaWNTZXRCc3NpZChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4ICpwQnNzaWQpOwogCi1WT0lEIEFzaWNFbmFibGVSREcoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwordm9pZCBBc2ljU2V0TWNhc3RXQyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIEFzaWNEaXNhYmxlUkRHKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK3ZvaWQgQXNpY0RlbFdjaWRUYWIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBXY2lkKTsKIAotVk9JRCBBc2ljRGlzYWJsZVN5bmMoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwordm9pZCBBc2ljRW5hYmxlUkRHKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgQXNpY0VuYWJsZUJzc1N5bmMoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwordm9pZCBBc2ljRGlzYWJsZVJERyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIEFzaWNFbmFibGVJYnNzU3luYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Cit2b2lkIEFzaWNEaXNhYmxlU3luYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIEFzaWNTZXRFZGNhUGFybSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQRURDQV9QQVJNICAgIHBFZGNhUGFybSk7Cit2b2lkIEFzaWNFbmFibGVCc3NTeW5jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgQXNpY1NldFNsb3RUaW1lKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIEJPT0xFQU4gYlVzZVNob3J0U2xvdFRpbWUpOwordm9pZCBBc2ljRW5hYmxlSWJzc1N5bmMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBBc2ljQWRkU2hhcmVkS2V5RW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgICAgICAgICBCc3NJbmRleCwKLQlJTiBVQ0hBUiAgICAgICAgIEtleUlkeCwKLQlJTiBVQ0hBUiAgICAgICAgIENpcGhlckFsZywKLQlJTiBQVUNIQVIgICAgICAgIHBLZXksCi0JSU4gUFVDSEFSICAgICAgICBwVHhNaWMsCi0JSU4gUFVDSEFSICAgICAgICBwUnhNaWMpOwordm9pZCBBc2ljU2V0RWRjYVBhcm0oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfZWRjYV9wYXJtICpwRWRjYVBhcm0pOwogCi1WT0lEIEFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiAgICAgICAgIEJzc0luZGV4LAotCUlOIFVDSEFSICAgICAgICAgS2V5SWR4KTsKK3ZvaWQgQXNpY1NldFNsb3RUaW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgSU4gQk9PTEVBTiBiVXNlU2hvcnRTbG90VGltZSk7CiAKLVZPSUQgQXNpY1VwZGF0ZVdDSURBdHRyaWJ1dGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUCQlXQ0lELAotCUlOIFVDSEFSCQlCc3NJbmRleCwKLQlJTiBVQ0hBUiAgICAgICAgQ2lwaGVyQWxnLAotCUlOIEJPT0xFQU4JCWJVc2VQYWlyZXdpc2VLZXlUYWJsZSk7Cit2b2lkIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB1OCBCc3NJbmRleCwKKwkJCSAgIHU4IEtleUlkeCwKKwkJCSAgIHU4IENpcGhlckFsZywKKwkJCSAgIHU4ICpwS2V5LCB1OCAqcFR4TWljLCB1OCAqcFJ4TWljKTsKIAotVk9JRCBBc2ljVXBkYXRlV0NJRElWRUlWKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVAkJV0NJRCwKLQlJTiBVTE9ORyAgICAgICAgdUlWLAotCUlOIFVMT05HICAgICAgICB1RUlWKTsKK3ZvaWQgQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgIHU4IEJzc0luZGV4LCB1OCBLZXlJZHgpOwogCi1WT0lEIEFzaWNVcGRhdGVSeFdDSURUYWJsZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQJCVdDSUQsCi0JSU4gUFVDSEFSICAgICAgICBwQWRkcik7Cit2b2lkIEFzaWNVcGRhdGVXQ0lEQXR0cmlidXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgdTE2IFdDSUQsCisJCQkgICAgIHU4IEJzc0luZGV4LAorCQkJICAgICB1OCBDaXBoZXJBbGcsCisJCQkgICAgIElOIEJPT0xFQU4gYlVzZVBhaXJld2lzZUtleVRhYmxlKTsKIAotVk9JRCBBc2ljQWRkS2V5RW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUCQlXQ0lELAotCUlOIFVDSEFSCQlCc3NJbmRleCwKLQlJTiBVQ0hBUgkJS2V5SWR4LAotCUlOIFBDSVBIRVJfS0VZCXBDaXBoZXJLZXksCi0JSU4gQk9PTEVBTgkJYlVzZVBhaXJld2lzZUtleVRhYmxlLAotCUlOIEJPT0xFQU4JCWJUeEtleSk7Cit2b2lkIEFzaWNVcGRhdGVXQ0lESVZFSVYoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHUxNiBXQ0lELCB1bnNpZ25lZCBsb25nIHVJViwgdW5zaWduZWQgbG9uZyB1RUlWKTsKIAotVk9JRCBBc2ljQWRkUGFpcndpc2VLZXlFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgICAgICAgIHBBZGRyLAotCUlOIFVDSEFSCQlXQ0lELAotCUlOIENJUEhFUl9LRVkJCSAqcENpcGhlcktleSk7Cit2b2lkIEFzaWNVcGRhdGVSeFdDSURUYWJsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB1MTYgV0NJRCwgdTggKnBBZGRyKTsKIAotVk9JRCBBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSICBwQWQsCi0JSU4gVUNIQVIJCSBCc3NJZHgsCi0JSU4gVUNIQVIJCSBXY2lkKTsKK3ZvaWQgQXNpY0FkZEtleUVudHJ5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICB1MTYgV0NJRCwKKwkJICAgICB1OCBCc3NJbmRleCwKKwkJICAgICB1OCBLZXlJZHgsCisJCSAgICAgc3RydWN0IHJ0X2NpcGhlcl9rZXkgKnBDaXBoZXJLZXksCisJCSAgICAgSU4gQk9PTEVBTiBiVXNlUGFpcmV3aXNlS2V5VGFibGUsIElOIEJPT0xFQU4gYlR4S2V5KTsKIAotQk9PTEVBTiBBc2ljU2VuZENvbW1hbmRUb01jdSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiAgICAgICAgIENvbW1hbmQsCi0JSU4gVUNIQVIgICAgICAgICBUb2tlbiwKLQlJTiBVQ0hBUiAgICAgICAgIEFyZzAsCi0JSU4gVUNIQVIgICAgICAgICBBcmcxKTsKLSNpZmRlZiBSVDI4NjAKLUJPT0xFQU4gQXNpY0NoZWNrQ29tbWFuT2soCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIJCSBDb21tYW5kKTsKLSNlbmRpZgotVk9JRCBNYWNBZGRyUmFuZG9tQnNzaWQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JT1VUIFBVQ0hBUiBwQWRkcik7Cit2b2lkIEFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgdTggKnBBZGRyLAorCQkJICAgICB1OCBXQ0lELCBzdHJ1Y3QgcnRfY2lwaGVyX2tleSAqcENpcGhlcktleSk7CiAKLVZPSUQgTWd0TWFjSGVhZGVySW5pdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgICAgcEFkLAotCUlOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCi0JSU4gVUNIQVIgU3ViVHlwZSwKLQlJTiBVQ0hBUiBUb0RzLAotCUlOIFBVQ0hBUiBwREEsCi0JSU4gUFVDSEFSIHBCc3NpZCk7Cit2b2lkIEFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQl1OCBCc3NJZHgsIHU4IFdjaWQpOwogCi1WT0lEIE1sbWVSYWRpb09mZigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CitCT09MRUFOIEFzaWNTZW5kQ29tbWFuZFRvTWN1KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgdTggQ29tbWFuZCwKKwkJCSAgICAgdTggVG9rZW4sIHU4IEFyZzAsIHU4IEFyZzEpOwogCi1WT0lEIE1sbWVSYWRpb09uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKK0JPT0xFQU4gQXNpY0NoZWNrQ29tbWFuT2soc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBDb21tYW5kKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAordm9pZCBNYWNBZGRyUmFuZG9tQnNzaWQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCAqcEFkZHIpOwogCi1WT0lEIEJzc1RhYmxlSW5pdCgKLQlJTiBCU1NfVEFCTEUgKlRhYik7Cit2b2lkIE1ndE1hY0hlYWRlckluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICBzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBIZHI4MDIxMSwKKwkJICAgICAgdTggU3ViVHlwZSwKKwkJICAgICAgdTggVG9EcywgdTggKnBEQSwgdTggKnBCc3NpZCk7CiAKLVZPSUQgQkFUYWJsZUluaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gQkFfVEFCTEUgKlRhYik7Cit2b2lkIE1sbWVSYWRpb09mZihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1VTE9ORyBCc3NUYWJsZVNlYXJjaCgKLQlJTiBCU1NfVEFCTEUgKlRhYiwKLQlJTiBQVUNIQVIgcEJzc2lkLAotCUlOIFVDSEFSIENoYW5uZWwpOwordm9pZCBNbG1lUmFkaW9PbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1VTE9ORyBCc3NTc2lkVGFibGVTZWFyY2goCi0JSU4gQlNTX1RBQkxFICpUYWIsCi0JSU4gUFVDSEFSICAgIHBCc3NpZCwKLQlJTiBQVUNIQVIgICAgcFNzaWQsCi0JSU4gVUNIQVIgICAgIFNzaWRMZW4sCi0JSU4gVUNIQVIgICAgIENoYW5uZWwpOwordm9pZCBCc3NUYWJsZUluaXQoc3RydWN0IHJ0X2Jzc190YWJsZSAqVGFiKTsKIAotVUxPTkcgQnNzVGFibGVTZWFyY2hXaXRoU1NJRCgKLQlJTiBCU1NfVEFCTEUgKlRhYiwKLQlJTiBQVUNIQVIgICAgQnNzaWQsCi0JSU4gUFVDSEFSICAgIHBTc2lkLAotCUlOIFVDSEFSICAgICBTc2lkTGVuLAotCUlOIFVDSEFSICAgICBDaGFubmVsKTsKK3ZvaWQgQkFUYWJsZUluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfYmFfdGFibGUgKlRhYik7CiAKLVZPSUQgQnNzVGFibGVEZWxldGVFbnRyeSgKLQlJTiBPVVQgIFBCU1NfVEFCTEUgcFRhYiwKLQlJTiAgICAgIFBVQ0hBUiBwQnNzaWQsCi0JSU4gICAgICBVQ0hBUiBDaGFubmVsKTsKK3Vuc2lnbmVkIGxvbmcgQnNzVGFibGVTZWFyY2goc3RydWN0IHJ0X2Jzc190YWJsZSAqVGFiLCB1OCAqcEJzc2lkLCB1OCBDaGFubmVsKTsKIAotVk9JRCBCQVRhYmxlRGVsZXRlT1JJRW50cnkoCi0JSU4gT1VUCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCQlCQV9PUklfRU5UUlkJKnBCQU9SSUVudHJ5KTsKK3Vuc2lnbmVkIGxvbmcgQnNzU3NpZFRhYmxlU2VhcmNoKHN0cnVjdCBydF9ic3NfdGFibGUgKlRhYiwKKwkJCSB1OCAqcEJzc2lkLAorCQkJIHU4ICpwU3NpZCwgdTggU3NpZExlbiwgdTggQ2hhbm5lbCk7CiAKLVZPSUQgIEJzc0VudHJ5U2V0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCU9VVCBQQlNTX0VOVFJZIHBCc3MsCi0JSU4gUFVDSEFSIHBCc3NpZCwKLQlJTiBDSEFSIFNzaWRbXSwKLQlJTiBVQ0hBUiBTc2lkTGVuLAotCUlOIFVDSEFSIEJzc1R5cGUsCi0JSU4gVVNIT1JUIEJlYWNvblBlcmlvZCwKLQlJTiBQQ0ZfUEFSTSBDZlBhcm0sCi0JSU4gVVNIT1JUIEF0aW1XaW4sCi0JSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAotCUlOIFVDSEFSIFN1cFJhdGVbXSwKLQlJTiBVQ0hBUiBTdXBSYXRlTGVuLAotCUlOIFVDSEFSIEV4dFJhdGVbXSwKLQlJTiBVQ0hBUiBFeHRSYXRlTGVuLAotCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCi0JSU4gQUREX0hUX0lORk9fSUUgKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotCUlOIFVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLAotCUlOIFVDSEFSCQkJQWRkSHRJbmZvTGVuLAotCUlOIFVDSEFSCQkJTmV3RXh0Q2hhbk9mZnNldCwKLQlJTiBVQ0hBUiBDaGFubmVsLAotCUlOIENIQVIgUnNzaSwKLQlJTiBMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcCwKLQlJTiBVQ0hBUiBDa2lwRmxhZywKLQlJTiBQRURDQV9QQVJNIHBFZGNhUGFybSwKLQlJTiBQUU9TX0NBUEFCSUxJVFlfUEFSTSBwUW9zQ2FwYWJpbGl0eSwKLQlJTiBQUUJTU19MT0FEX1BBUk0gcFFic3NMb2FkLAotCUlOIFVTSE9SVCBMZW5ndGhWSUUsCi0JSU4gUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKTsKK3Vuc2lnbmVkIGxvbmcgQnNzVGFibGVTZWFyY2hXaXRoU1NJRChzdHJ1Y3QgcnRfYnNzX3RhYmxlICpUYWIsCisJCQkgICAgIHU4ICpCc3NpZCwKKwkJCSAgICAgdTggKnBTc2lkLAorCQkJICAgICB1OCBTc2lkTGVuLCB1OCBDaGFubmVsKTsKIAotVUxPTkcgIEJzc1RhYmxlU2V0RW50cnkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JT1VUIFBCU1NfVEFCTEUgcFRhYiwKLQlJTiBQVUNIQVIgcEJzc2lkLAotCUlOIENIQVIgU3NpZFtdLAotCUlOIFVDSEFSIFNzaWRMZW4sCi0JSU4gVUNIQVIgQnNzVHlwZSwKLQlJTiBVU0hPUlQgQmVhY29uUGVyaW9kLAotCUlOIENGX1BBUk0gKkNmUGFybSwKLQlJTiBVU0hPUlQgQXRpbVdpbiwKLQlJTiBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCi0JSU4gVUNIQVIgU3VwUmF0ZVtdLAotCUlOIFVDSEFSIFN1cFJhdGVMZW4sCi0JSU4gVUNIQVIgRXh0UmF0ZVtdLAotCUlOIFVDSEFSIEV4dFJhdGVMZW4sCi0JSU4gSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKLQlJTiBBRERfSFRfSU5GT19JRSAqcEFkZEh0SW5mbywJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCi0JSU4gVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sCi0JSU4gVUNIQVIJCQlBZGRIdEluZm9MZW4sCi0JSU4gVUNIQVIJCQlOZXdFeHRDaGFuT2Zmc2V0LAotCUlOIFVDSEFSIENoYW5uZWwsCi0JSU4gQ0hBUiBSc3NpLAotCUlOIExBUkdFX0lOVEVHRVIgVGltZVN0YW1wLAotCUlOIFVDSEFSIENraXBGbGFnLAotCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAotCUlOIFBRT1NfQ0FQQUJJTElUWV9QQVJNIHBRb3NDYXBhYmlsaXR5LAotCUlOIFBRQlNTX0xPQURfUEFSTSBwUWJzc0xvYWQsCi0JSU4gVVNIT1JUIExlbmd0aFZJRSwKLQlJTiBQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzIHBWSUUpOwordW5zaWduZWQgbG9uZyBCc3NTc2lkVGFibGVTZWFyY2hCeVNTSUQoc3RydWN0IHJ0X2Jzc190YWJsZSAqVGFiLAorCQkJICAgICAgIHU4ICpwU3NpZCwgdTggU3NpZExlbik7CiAKLVZPSUQgQkFUYWJsZUluc2VydEVudHJ5KAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVTSE9SVCBBaWQsCi0gICAgSU4gVVNIT1JUCQlUaW1lT3V0VmFsdWUsCi0JSU4gVVNIT1JUCQlTdGFydGluZ1NlcSwKLSAgICBJTiBVQ0hBUiBUSUQsCi0JSU4gVUNIQVIgQkFXaW5TaXplLAotCUlOIFVDSEFSIE9yaWdpbmF0b3JTdGF0dXMsCi0gICAgSU4gQk9PTEVBTiBJc1JlY2lwaWVudCk7Cit2b2lkIEJzc1RhYmxlRGVsZXRlRW50cnkoc3RydWN0IHJ0X2Jzc190YWJsZSAqcFRhYiwKKwkJCSB1OCAqcEJzc2lkLCB1OCBDaGFubmVsKTsKIAotVk9JRCBCc3NUYWJsZVNzaWRTb3J0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCU9VVCBCU1NfVEFCTEUgKk91dFRhYiwKLQlJTiAgQ0hBUiBTc2lkW10sCi0JSU4gIFVDSEFSIFNzaWRMZW4pOwordm9pZCBCQVRhYmxlRGVsZXRlT1JJRW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgc3RydWN0IHJ0X2JhX29yaV9lbnRyeSAqcEJBT1JJRW50cnkpOwogCi1WT0lEICBCc3NUYWJsZVNvcnRCeVJzc2koCi0JSU4gT1VUIEJTU19UQUJMRSAqT3V0VGFiKTsKK3ZvaWQgQnNzRW50cnlTZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfYnNzX2VudHJ5ICpwQnNzLCB1OCAqcEJzc2lkLCBjaGFyIFNzaWRbXSwgdTggU3NpZExlbiwgdTggQnNzVHlwZSwgdTE2IEJlYWNvblBlcmlvZCwgc3RydWN0IHJ0X2NmX3Bhcm0gKiBDZlBhcm0sIHUxNiBBdGltV2luLCB1MTYgQ2FwYWJpbGl0eUluZm8sIHU4IFN1cFJhdGVbXSwgdTggU3VwUmF0ZUxlbiwgdTggRXh0UmF0ZVtdLCB1OCBFeHRSYXRlTGVuLCBzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSAqIHBIdENhcGFiaWxpdHksIHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSAqIHBBZGRIdEluZm8sCS8qIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRSAqLworCQkgdTggSHRDYXBhYmlsaXR5TGVuLAorCQkgdTggQWRkSHRJbmZvTGVuLAorCQkgdTggTmV3RXh0Q2hhbk9mZnNldCwKKwkJIHU4IENoYW5uZWwsCisJCSBjaGFyIFJzc2ksCisJCSBJTiBMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcCwKKwkJIHU4IENraXBGbGFnLAorCQkgc3RydWN0IHJ0X2VkY2FfcGFybSAqcEVkY2FQYXJtLAorCQkgc3RydWN0IHJ0X3Fvc19jYXBhYmlsaXR5X3Bhcm0gKnBRb3NDYXBhYmlsaXR5LAorCQkgc3RydWN0IHJ0X3Fic3NfbG9hZF9wYXJtICpwUWJzc0xvYWQsCisJCSB1MTYgTGVuZ3RoVklFLCBzdHJ1Y3QgcnRfbmRpc184MDJfMTFfdmFyaWFibGVfaWVzICpwVklFKTsKIAotVk9JRCBCc3NDaXBoZXJQYXJzZSgKLQlJTiBPVVQgIFBCU1NfRU5UUlkgIHBCc3MpOwordW5zaWduZWQgbG9uZyBCc3NUYWJsZVNldEVudHJ5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X2Jzc190YWJsZSAqcFRhYiwgdTggKnBCc3NpZCwgY2hhciBTc2lkW10sIHU4IFNzaWRMZW4sIHU4IEJzc1R5cGUsIHUxNiBCZWFjb25QZXJpb2QsIHN0cnVjdCBydF9jZl9wYXJtICogQ2ZQYXJtLCB1MTYgQXRpbVdpbiwgdTE2IENhcGFiaWxpdHlJbmZvLCB1OCBTdXBSYXRlW10sIHU4IFN1cFJhdGVMZW4sIHU4IEV4dFJhdGVbXSwgdTggRXh0UmF0ZUxlbiwgc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHlfaWUgKiBwSHRDYXBhYmlsaXR5LCBzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUgKiBwQWRkSHRJbmZvLAkvKiBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUgKi8KKwkJICAgICAgIHU4IEh0Q2FwYWJpbGl0eUxlbiwKKwkJICAgICAgIHU4IEFkZEh0SW5mb0xlbiwKKwkJICAgICAgIHU4IE5ld0V4dENoYW5PZmZzZXQsCisJCSAgICAgICB1OCBDaGFubmVsLAorCQkgICAgICAgY2hhciBSc3NpLAorCQkgICAgICAgSU4gTEFSR0VfSU5URUdFUiBUaW1lU3RhbXAsCisJCSAgICAgICB1OCBDa2lwRmxhZywKKwkJICAgICAgIHN0cnVjdCBydF9lZGNhX3Bhcm0gKnBFZGNhUGFybSwKKwkJICAgICAgIHN0cnVjdCBydF9xb3NfY2FwYWJpbGl0eV9wYXJtICpwUW9zQ2FwYWJpbGl0eSwKKwkJICAgICAgIHN0cnVjdCBydF9xYnNzX2xvYWRfcGFybSAqcFFic3NMb2FkLAorCQkgICAgICAgdTE2IExlbmd0aFZJRSwgc3RydWN0IHJ0X25kaXNfODAyXzExX3ZhcmlhYmxlX2llcyAqcFZJRSk7CiAKLU5ESVNfU1RBVFVTICBNbG1lUXVldWVJbml0KAotCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKTsKK3ZvaWQgQkFUYWJsZUluc2VydEVudHJ5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCXUxNiBBaWQsCisJCQl1MTYgVGltZU91dFZhbHVlLAorCQkJdTE2IFN0YXJ0aW5nU2VxLAorCQkJdTggVElELAorCQkJdTggQkFXaW5TaXplLAorCQkJdTggT3JpZ2luYXRvclN0YXR1cywgSU4gQk9PTEVBTiBJc1JlY2lwaWVudCk7CiAKLVZPSUQgIE1sbWVRdWV1ZURlc3Ryb3koCi0JSU4gTUxNRV9RVUVVRSAqUXVldWUpOwordm9pZCBCc3NUYWJsZVNzaWRTb3J0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgc3RydWN0IHJ0X2Jzc190YWJsZSAqT3V0VGFiLCBjaGFyIFNzaWRbXSwgdTggU3NpZExlbik7CiAKLUJPT0xFQU4gTWxtZUVucXVldWUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUxPTkcgTWFjaGluZSwKLQlJTiBVTE9ORyBNc2dUeXBlLAotCUlOIFVMT05HIE1zZ0xlbiwKLQlJTiBWT0lEICpNc2cpOwordm9pZCBCc3NUYWJsZVNvcnRCeVJzc2koc3RydWN0IHJ0X2Jzc190YWJsZSAqT3V0VGFiKTsKIAotQk9PTEVBTiBNbG1lRW5xdWV1ZUZvclJlY3YoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gVUxPTkcgV2NpZCwKLQlJTiBVTE9ORyBUaW1lU3RhbXBIaWdoLAotCUlOIFVMT05HIFRpbWVTdGFtcExvdywKLQlJTiBVQ0hBUiBSc3NpMCwKLQlJTiBVQ0hBUiBSc3NpMSwKLQlJTiBVQ0hBUiBSc3NpMiwKLQlJTiBVTE9ORyBNc2dMZW4sCi0JSU4gUFZPSUQgTXNnLAotCUlOIFVDSEFSIFNpZ25hbCk7Cit2b2lkIEJzc0NpcGhlclBhcnNlKHN0cnVjdCBydF9ic3NfZW50cnkgKnBCc3MpOwogCitpbnQgTWxtZVF1ZXVlSW5pdChzdHJ1Y3QgcnRfbWxtZV9xdWV1ZSAqUXVldWUpOwogCi1CT09MRUFOIE1sbWVEZXF1ZXVlKAotCUlOIE1MTUVfUVVFVUUgKlF1ZXVlLAotCU9VVCBNTE1FX1FVRVVFX0VMRU0gKipFbGVtKTsKK3ZvaWQgTWxtZVF1ZXVlRGVzdHJveShzdHJ1Y3QgcnRfbWxtZV9xdWV1ZSAqUXVldWUpOwogCi1WT0lEICAgIE1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK0JPT0xFQU4gTWxtZUVucXVldWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgdW5zaWduZWQgbG9uZyBNYWNoaW5lLAorCQkgICAgdW5zaWduZWQgbG9uZyBNc2dUeXBlLCB1bnNpZ25lZCBsb25nIE1zZ0xlbiwgdm9pZCAqIE1zZyk7CiAKLUJPT0xFQU4gIE1sbWVRdWV1ZUVtcHR5KAotCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKTsKK0JPT0xFQU4gTWxtZUVucXVldWVGb3JSZWN2KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgV2NpZCwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgVGltZVN0YW1wSGlnaCwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgVGltZVN0YW1wTG93LAorCQkJICAgdTggUnNzaTAsCisJCQkgICB1OCBSc3NpMSwKKwkJCSAgIHU4IFJzc2kyLAorCQkJICAgdW5zaWduZWQgbG9uZyBNc2dMZW4sIHZvaWQgKk1zZywgdTggU2lnbmFsKTsKIAotQk9PTEVBTiAgTWxtZVF1ZXVlRnVsbCgKLQlJTiBNTE1FX1FVRVVFICpRdWV1ZSk7CitCT09MRUFOIE1sbWVEZXF1ZXVlKHN0cnVjdCBydF9tbG1lX3F1ZXVlICpRdWV1ZSwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqKiBFbGVtKTsKIAotQk9PTEVBTiAgTXNnVHlwZVN1YnN0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBGUkFNRV84MDJfMTEgcEZyYW1lLAotCU9VVCBJTlQgKk1hY2hpbmUsCi0JT1VUIElOVCAqTXNnVHlwZSk7Cit2b2lkIE1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgU3RhdGVNYWNoaW5lSW5pdCgKLQlJTiBTVEFURV9NQUNISU5FICpTbSwKLQlJTiBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSwKLQlJTiBVTE9ORyBTdE5yLAotCUlOIFVMT05HIE1zZ05yLAotCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBEZWZGdW5jLAotCUlOIFVMT05HIEluaXRTdGF0ZSwKLQlJTiBVTE9ORyBCYXNlKTsKK0JPT0xFQU4gTWxtZVF1ZXVlRW1wdHkoc3RydWN0IHJ0X21sbWVfcXVldWUgKlF1ZXVlKTsKIAotVk9JRCBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oCi0JSU4gU1RBVEVfTUFDSElORSAqUywKLQlJTiBVTE9ORyBTdCwKLQlVTE9ORyBNc2csCi0JSU4gU1RBVEVfTUFDSElORV9GVU5DIEYpOworQk9PTEVBTiBNbG1lUXVldWVGdWxsKHN0cnVjdCBydF9tbG1lX3F1ZXVlICpRdWV1ZSk7CiAKLVZPSUQgU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiBTVEFURV9NQUNISU5FICpTLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CitCT09MRUFOIE1zZ1R5cGVTdWJzdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqIHBGcmFtZSwKKwkJICAgICBpbnQgKiBNYWNoaW5lLCBpbnQgKiBNc2dUeXBlKTsKIAotVk9JRCBEcm9wKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIFN0YXRlTWFjaGluZUluaXQoc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgKlNtLAorCQkgICAgICBJTiBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBTdE5yLAorCQkgICAgICB1bnNpZ25lZCBsb25nIE1zZ05yLAorCQkgICAgICBJTiBTVEFURV9NQUNISU5FX0ZVTkMgRGVmRnVuYywKKwkJICAgICAgdW5zaWduZWQgbG9uZyBJbml0U3RhdGUsIHVuc2lnbmVkIGxvbmcgQmFzZSk7CiAKLVZPSUQgQXNzb2NTdGF0ZU1hY2hpbmVJbml0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBTVEFURV9NQUNISU5FICpTbSwKLQlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOwordm9pZCBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgKlMsCisJCQkgICB1bnNpZ25lZCBsb25nIFN0LCB1bnNpZ25lZCBsb25nIE1zZywgSU4gU1RBVEVfTUFDSElORV9GVU5DIEYpOwogCi1WT0lEIFJlYXNzb2NUaW1lb3V0KAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Cit2b2lkIFN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgIHN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lICpTLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBBc3NvY1RpbWVvdXQoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKK3ZvaWQgRHJvcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIERpc2Fzc29jVGltZW91dCgKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwordm9pZCBBc3NvY1N0YXRlTWFjaGluZUluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgKlNtLAorCQkJICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKIAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1WT0lEIE1sbWVBc3NvY1JlcUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgUmVhc3NvY1RpbWVvdXQodm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkgICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkgICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpOwogCi1WT0lEIE1sbWVSZWFzc29jUmVxQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBBc3NvY1RpbWVvdXQodm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMyk7CiAKLVZPSUQgTWxtZURpc2Fzc29jUmVxQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBEaXNhc3NvY1RpbWVvdXQodm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkgICAgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMyk7CiAKLVZPSUQgUGVlckFzc29jUnNwQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit2b2lkIE1sbWVBc3NvY1JlcUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIFBlZXJSZWFzc29jUnNwQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBNbG1lUmVhc3NvY1JlcUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIFBlZXJEaXNhc3NvY0FjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgTWxtZURpc2Fzc29jUmVxQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgRGlzYXNzb2NUaW1lb3V0QWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBQZWVyQXNzb2NSc3BBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBBc3NvY1RpbWVvdXRBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIFBlZXJSZWFzc29jUnNwQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgIFJlYXNzb2NUaW1lb3V0QWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBQZWVyRGlzYXNzb2NBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCAgQ2xzM2VyckFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSIHBBZGRyKTsKK3ZvaWQgRGlzYXNzb2NUaW1lb3V0QWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgU3dpdGNoQmV0d2VlbldlcEFuZENraXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwordm9pZCBBc3NvY1RpbWVvdXRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCAgSW52YWxpZFN0YXRlV2hlbkFzc29jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBSZWFzc29jVGltZW91dEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEICBJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgQ2xzM2VyckFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4ICpwQWRkcik7CiAKLVZPSUQgSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSgKLQlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIEludmFsaWRTdGF0ZVdoZW5Bc3NvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi0jaWZkZWYgUlQyODcwCi1WT0lEIE1sbWVDbnRsQ29uZmlybSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVTE9ORyBNc2dUeXBlLAotCUlOIFVTSE9SVCBNc2cpOwotI2VuZGlmIC8vIFJUMjg3MCAvLwordm9pZCBJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEICBDb21wb3NlUHNQb2xsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK3ZvaWQgSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCAgQ29tcG9zZU51bGxGcmFtZSgKLQlJTiAgUFJUTVBfQURBUFRFUiBwQWQpOworI2lmZGVmIFJUTVBfTUFDX1VTQgordm9pZCBNbG1lQ250bENvbmZpcm0oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1bnNpZ25lZCBsb25nIE1zZ1R5cGUsIHUxNiBNc2cpOworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCi1WT0lEICBBc3NvY1Bvc3RQcm9jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgcEFkZHIyLAotCUlOICBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCi0JSU4gIFVTSE9SVCBBaWQsCi0JSU4gIFVDSEFSIFN1cFJhdGVbXSwKLQlJTiAgVUNIQVIgU3VwUmF0ZUxlbiwKLQlJTiAgVUNIQVIgRXh0UmF0ZVtdLAotCUlOICBVQ0hBUiBFeHRSYXRlTGVuLAotCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAotCUlOIEhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAotCUlOICBVQ0hBUiBIdENhcGFiaWxpdHlMZW4sCi0JSU4gQUREX0hUX0lORk9fSUUJCSpwQWRkSHRJbmZvKTsKK3ZvaWQgQ29tcG9zZVBzUG9sbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIEF1dGhTdGF0ZU1hY2hpbmVJbml0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOIFBTVEFURV9NQUNISU5FIHNtLAotCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7Cit2b2lkIENvbXBvc2VOdWxsRnJhbWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBBdXRoVGltZW91dCgKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwordm9pZCBBc3NvY1Bvc3RQcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgdTggKnBBZGRyMiwKKwkJICAgdTE2IENhcGFiaWxpdHlJbmZvLAorCQkgICB1MTYgQWlkLAorCQkgICB1OCBTdXBSYXRlW10sCisJCSAgIHU4IFN1cFJhdGVMZW4sCisJCSAgIHU4IEV4dFJhdGVbXSwKKwkJICAgdTggRXh0UmF0ZUxlbiwKKwkJICAgc3RydWN0IHJ0X2VkY2FfcGFybSAqcEVkY2FQYXJtLAorCQkgICBzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSAqIHBIdENhcGFiaWxpdHksCisJCSAgIHU4IEh0Q2FwYWJpbGl0eUxlbiwgc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llICogcEFkZEh0SW5mbyk7CisKK3ZvaWQgQXV0aFN0YXRlTWFjaGluZUluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICBzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSAqc20sIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK3ZvaWQgQXV0aFRpbWVvdXQodm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpOwogCi1WT0lEIE1sbWVBdXRoUmVxQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBNbG1lQXV0aFJlcUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIFBlZXJBdXRoUnNwQXRTZXEyQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBQZWVyQXV0aFJzcEF0U2VxMkFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIFBlZXJBdXRoUnNwQXRTZXE0QWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBQZWVyQXV0aFJzcEF0U2VxNEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIEF1dGhUaW1lb3V0QWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBBdXRoVGltZW91dEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIENsczJlcnJBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiBwQWRkcik7Cit2b2lkIENsczJlcnJBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCAqcEFkZHIpOwogCi1WT0lEIE1sbWVEZWF1dGhSZXFBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIE1sbWVEZWF1dGhSZXFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBJbnZhbGlkU3RhdGVXaGVuQXV0aCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgSW52YWxpZFN0YXRlV2hlbkF1dGgoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKLVZPSUQgQXV0aFJzcFN0YXRlTWFjaGluZUluaXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBTVEFURV9NQUNISU5FIFNtLAotCUlOICBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7Cit2b2lkIEF1dGhSc3BTdGF0ZU1hY2hpbmVJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgKlNtLAorCQkJICAgICBJTiBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CiAKLVZPSUQgUGVlckRlYXV0aEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBQZWVyRGVhdXRoQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgUGVlckF1dGhTaW1wbGVSc3BHZW5BbmRTZW5kKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQSEVBREVSXzgwMl8xMSAgcEhkcjgwMjExLAotCUlOICBVU0hPUlQgQWxnLAotCUlOICBVU0hPUlQgU2VxLAotCUlOICBVU0hPUlQgUmVhc29uLAotCUlOICBVU0hPUlQgU3RhdHVzKTsKK3ZvaWQgUGVlckF1dGhTaW1wbGVSc3BHZW5BbmRTZW5kKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGRyODAyMTEsCisJCQkJIHUxNiBBbGcsCisJCQkJIHUxNiBTZXEsCisJCQkJIHUxNiBSZWFzb24sIHUxNiBTdGF0dXMpOwogCi0vLwotLy8gUHJpdmF0ZSByb3V0aW5lcyBpbiBkbHMuYwotLy8KKy8qICovCisvKiBQcml2YXRlIHJvdXRpbmVzIGluIGRscy5jICovCisvKiAqLwogCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi1WT0lEIFN5bmNTdGF0ZU1hY2hpbmVJbml0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBTVEFURV9NQUNISU5FICpTbSwKLQlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOwordm9pZCBTeW5jU3RhdGVNYWNoaW5lSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgIHN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lICpTbSwKKwkJCSAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKIAotVk9JRCBCZWFjb25UaW1lb3V0KAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Cit2b2lkIEJlYWNvblRpbWVvdXQodm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkgICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSAgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKTsKIAotVk9JRCBTY2FuVGltZW91dCgKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwordm9pZCBTY2FuVGltZW91dCh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCSB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMyk7CiAKLVZPSUQgSW52YWxpZFN0YXRlV2hlblNjYW4oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIEludmFsaWRTdGF0ZVdoZW5TY2FuKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgSW52YWxpZFN0YXRlV2hlbkpvaW4oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIEludmFsaWRTdGF0ZVdoZW5Kb2luKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgSW52YWxpZFN0YXRlV2hlblN0YXJ0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBJbnZhbGlkU3RhdGVXaGVuU3RhcnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBFbnF1ZXVlUHJvYmVSZXF1ZXN0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK3ZvaWQgRW5xdWV1ZVByb2JlUmVxdWVzdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1CT09MRUFOIFNjYW5SdW5uaW5nKAotCQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitCT09MRUFOIFNjYW5SdW5uaW5nKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKLVZPSUQgTWxtZUNudGxJbml0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBTVEFURV9NQUNISU5FICpTLAotCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7Cit2b2lkIE1sbWVDbnRsSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgKlMsIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CiAKLVZPSUQgTWxtZUNudGxNYWNoaW5lUGVyZm9ybUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgU1RBVEVfTUFDSElORSAqUywKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgTWxtZUNudGxNYWNoaW5lUGVyZm9ybUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICBzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSAqUywKKwkJCQkgIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIENudGxJZGxlUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgQ250bElkbGVQcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgQ250bE9pZFNjYW5Qcm9jKAotCUlOICBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgQ250bE9pZFNjYW5Qcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgQ250bE9pZFNzaWRQcm9jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKiBFbGVtKTsKK3ZvaWQgQ250bE9pZFNzaWRQcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgQ250bE9pZFJUQnNzaWRQcm9jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKiBFbGVtKTsKK3ZvaWQgQ250bE9pZFJUQnNzaWRQcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgQ250bE1sbWVSb2FtaW5nUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICogRWxlbSk7Cit2b2lkIENudGxNbG1lUm9hbWluZ1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBDbnRsV2FpdERpc2Fzc29jUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgQ250bFdhaXREaXNhc3NvY1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBDbnRsV2FpdEpvaW5Qcm9jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBDbnRsV2FpdEpvaW5Qcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgQ250bFdhaXRSZWFzc29jUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgQ250bFdhaXRSZWFzc29jUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIENudGxXYWl0U3RhcnRQcm9jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBDbnRsV2FpdFN0YXJ0UHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIENudGxXYWl0QXV0aFByb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIENudGxXYWl0QXV0aFByb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBDbnRsV2FpdEF1dGhQcm9jMigKLQlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIENudGxXYWl0QXV0aFByb2MyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgQ250bFdhaXRBc3NvY1Byb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIENudGxXYWl0QXNzb2NQcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgTGlua1VwKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUiBCc3NUeXBlKTsKK3ZvaWQgTGlua1VwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggQnNzVHlwZSk7CiAKLVZPSUQgTGlua0Rvd24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIEJPT0xFQU4gICAgICAgICBJc1JlcUZyb21BUCk7Cit2b2lkIExpbmtEb3duKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgSU4gQk9PTEVBTiBJc1JlcUZyb21BUCk7CiAKLVZPSUQgSXRlcmF0ZU9uQnNzVGFiKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK3ZvaWQgSXRlcmF0ZU9uQnNzVGFiKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgSXRlcmF0ZU9uQnNzVGFiMigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Owordm9pZCBJdGVyYXRlT25Cc3NUYWIyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7OwogCi1WT0lEIEpvaW5QYXJtRmlsbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgT1VUIE1MTUVfSk9JTl9SRVFfU1RSVUNUICpKb2luUmVxLAotCUlOICBVTE9ORyBCc3NJZHgpOwordm9pZCBKb2luUGFybUZpbGwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgIHN0cnVjdCBydF9tbG1lX2pvaW5fcmVxICpKb2luUmVxLCB1bnNpZ25lZCBsb25nIEJzc0lkeCk7CiAKLVZPSUQgQXNzb2NQYXJtRmlsbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiBPVVQgTUxNRV9BU1NPQ19SRVFfU1RSVUNUICpBc3NvY1JlcSwKLQlJTiAgUFVDSEFSIHBBZGRyLAotCUlOICBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCi0JSU4gIFVMT05HIFRpbWVvdXQsCi0JSU4gIFVTSE9SVCBMaXN0ZW5JbnR2KTsKK3ZvaWQgQXNzb2NQYXJtRmlsbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgIHN0cnVjdCBydF9tbG1lX2Fzc29jX3JlcSAqQXNzb2NSZXEsCisJCSAgIHU4ICpwQWRkciwKKwkJICAgdTE2IENhcGFiaWxpdHlJbmZvLAorCQkgICB1bnNpZ25lZCBsb25nIFRpbWVvdXQsIHUxNiBMaXN0ZW5JbnR2KTsKIAotVk9JRCBTY2FuUGFybUZpbGwoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE9VVCBNTE1FX1NDQU5fUkVRX1NUUlVDVCAqU2NhblJlcSwKLQlJTiAgQ0hBUiBTc2lkW10sCi0JSU4gIFVDSEFSIFNzaWRMZW4sCi0JSU4gIFVDSEFSIEJzc1R5cGUsCi0JSU4gIFVDSEFSIFNjYW5UeXBlKTsKK3ZvaWQgU2NhblBhcm1GaWxsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICBzdHJ1Y3QgcnRfbWxtZV9zY2FuX3JlcSAqU2NhblJlcSwKKwkJICBjaGFyIFNzaWRbXSwKKwkJICB1OCBTc2lkTGVuLCB1OCBCc3NUeXBlLCB1OCBTY2FuVHlwZSk7CiAKLVZPSUQgRGlzYXNzb2NQYXJtRmlsbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgT1VUIE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCAqRGlzYXNzb2NSZXEsCi0JSU4gIFBVQ0hBUiBwQWRkciwKLQlJTiAgVVNIT1JUIFJlYXNvbik7Cit2b2lkIERpc2Fzc29jUGFybUZpbGwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICBzdHJ1Y3QgcnRfbWxtZV9kaXNhc3NvY19yZXEgKkRpc2Fzc29jUmVxLAorCQkgICAgICB1OCAqcEFkZHIsIHUxNiBSZWFzb24pOwogCi1WT0lEIFN0YXJ0UGFybUZpbGwoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE9VVCBNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgKlN0YXJ0UmVxLAotCUlOICBDSEFSIFNzaWRbXSwKLQlJTiAgVUNIQVIgU3NpZExlbik7Cit2b2lkIFN0YXJ0UGFybUZpbGwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICBzdHJ1Y3QgcnRfbWxtZV9zdGFydF9yZXEgKlN0YXJ0UmVxLAorCQkgICBjaGFyIFNzaWRbXSwgdTggU3NpZExlbik7CiAKLVZPSUQgQXV0aFBhcm1GaWxsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBPVVQgTUxNRV9BVVRIX1JFUV9TVFJVQ1QgKkF1dGhSZXEsCi0JSU4gIFBVQ0hBUiBwQWRkciwKLQlJTiAgVVNIT1JUIEFsZyk7Cit2b2lkIEF1dGhQYXJtRmlsbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgc3RydWN0IHJ0X21sbWVfYXV0aF9yZXEgKkF1dGhSZXEsCisJCSAgdTggKnBBZGRyLCB1MTYgQWxnKTsKIAotVk9JRCBFbnF1ZXVlUHNQb2xsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK3ZvaWQgRW5xdWV1ZVBzUG9sbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIEVucXVldWVCZWFjb25GcmFtZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Cit2b2lkIEVucXVldWVCZWFjb25GcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIE1sbWVKb2luUmVxQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBNbG1lSm9pblJlcUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIE1sbWVTY2FuUmVxQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBNbG1lU2NhblJlcUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIE1sbWVTdGFydFJlcUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgTWxtZVN0YXJ0UmVxQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgU2NhblRpbWVvdXRBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIFNjYW5UaW1lb3V0QWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgQmVhY29uVGltZW91dEF0Sm9pbkFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgQmVhY29uVGltZW91dEF0Sm9pbkFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIFBlZXJCZWFjb25BdFNjYW5BY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIFBlZXJCZWFjb25BdFNjYW5BY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBQZWVyQmVhY29uQXRKb2luQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBQZWVyQmVhY29uQXRKb2luQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgUGVlckJlYWNvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgUGVlckJlYWNvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIFBlZXJQcm9iZVJlcUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIFBlZXJQcm9iZVJlcUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIFNjYW5OZXh0Q2hhbm5lbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Cit2b2lkIFNjYW5OZXh0Q2hhbm5lbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1VTE9ORyBNYWtlSWJzc0JlYWNvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Cit1bnNpZ25lZCBsb25nIE1ha2VJYnNzQmVhY29uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgQ0NYQWRqYWNlbnRBUFJlcG9ydCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CitCT09MRUFOIE1sbWVTY2FuUmVxU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgdm9pZCAqIE1zZywKKwkJCSAgdW5zaWduZWQgbG9uZyBNc2dMZW4sCisJCQkgIHU4ICogQnNzVHlwZSwKKwkJCSAgY2hhciBzc2lkW10sCisJCQkgIHU4ICogU3NpZExlbiwgdTggKiBTY2FuVHlwZSk7CiAKLUJPT0xFQU4gTWxtZVNjYW5SZXFTYW5pdHkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFZPSUQgKk1zZywKLQlJTiAgVUxPTkcgTXNnTGVuLAotCU9VVCBVQ0hBUiAqQnNzVHlwZSwKLQlPVVQgQ0hBUiBzc2lkW10sCi0JT1VUIFVDSEFSICpTc2lkTGVuLAotCU9VVCBVQ0hBUiAqU2NhblR5cGUpOworQk9PTEVBTiBQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgICB2b2lkICogTXNnLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIE1zZ0xlbiwKKwkJCQkgICAgdTggTXNnQ2hhbm5lbCwKKwkJCQkgICAgdTggKnBBZGRyMiwKKwkJCQkgICAgdTggKnBCc3NpZCwKKwkJCQkgICAgY2hhciBTc2lkW10sCisJCQkJICAgIHU4ICogcFNzaWRMZW4sCisJCQkJICAgIHU4ICogcEJzc1R5cGUsCisJCQkJICAgIHUxNiAqIHBCZWFjb25QZXJpb2QsCisJCQkJICAgIHU4ICogcENoYW5uZWwsCisJCQkJICAgIHU4ICogcE5ld0NoYW5uZWwsCisJCQkJICAgIE9VVCBMQVJHRV9JTlRFR0VSICogcFRpbWVzdGFtcCwKKwkJCQkgICAgc3RydWN0IHJ0X2NmX3Bhcm0gKiBwQ2ZQYXJtLAorCQkJCSAgICB1MTYgKiBwQXRpbVdpbiwKKwkJCQkgICAgdTE2ICogcENhcGFiaWxpdHlJbmZvLAorCQkJCSAgICB1OCAqIHBFcnAsCisJCQkJICAgIHU4ICogcER0aW1Db3VudCwKKwkJCQkgICAgdTggKiBwRHRpbVBlcmlvZCwKKwkJCQkgICAgdTggKiBwQmNhc3RGbGFnLAorCQkJCSAgICB1OCAqIHBNZXNzYWdlVG9NZSwKKwkJCQkgICAgdTggU3VwUmF0ZVtdLAorCQkJCSAgICB1OCAqIHBTdXBSYXRlTGVuLAorCQkJCSAgICB1OCBFeHRSYXRlW10sCisJCQkJICAgIHU4ICogcEV4dFJhdGVMZW4sCisJCQkJICAgIHU4ICogcENraXBGbGFnLAorCQkJCSAgICB1OCAqIHBBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCisJCQkJICAgIHN0cnVjdCBydF9lZGNhX3Bhcm0gKnBFZGNhUGFybSwKKwkJCQkgICAgc3RydWN0IHJ0X3Fic3NfbG9hZF9wYXJtICpwUWJzc0xvYWQsCisJCQkJICAgIHN0cnVjdCBydF9xb3NfY2FwYWJpbGl0eV9wYXJtICpwUW9zQ2FwYWJpbGl0eSwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyAqIHBSYWxpbmtJZSwKKwkJCQkgICAgdTggKiBwSHRDYXBhYmlsaXR5TGVuLAorCQkJCSAgICB1OCAqIHBQcmVOSHRDYXBhYmlsaXR5TGVuLAorCQkJCSAgICBzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSAqIHBIdENhcGFiaWxpdHksCisJCQkJICAgIHU4ICogQWRkSHRJbmZvTGVuLAorCQkJCSAgICBzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUgKiBBZGRIdEluZm8sCisJCQkJICAgIHU4ICogTmV3RXh0Q2hhbm5lbCwKKwkJCQkgICAgdTE2ICogTGVuZ3RoVklFLAorCQkJCSAgICBzdHJ1Y3QgcnRfbmRpc184MDJfMTFfdmFyaWFibGVfaWVzICpwVklFKTsKIAotQk9PTEVBTiBQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFZPSUQgKk1zZywKLQlJTiAgVUxPTkcgTXNnTGVuLAotCUlOICBVQ0hBUiBNc2dDaGFubmVsLAotCU9VVCBQVUNIQVIgcEFkZHIyLAotCU9VVCBQVUNIQVIgcEJzc2lkLAotCU9VVCBDSEFSIFNzaWRbXSwKLQlPVVQgVUNIQVIgKnBTc2lkTGVuLAotCU9VVCBVQ0hBUiAqcEJzc1R5cGUsCi0JT1VUIFVTSE9SVCAqcEJlYWNvblBlcmlvZCwKLQlPVVQgVUNIQVIgKnBDaGFubmVsLAotCU9VVCBVQ0hBUiAqcE5ld0NoYW5uZWwsCi0JT1VUIExBUkdFX0lOVEVHRVIgKnBUaW1lc3RhbXAsCi0JT1VUIENGX1BBUk0gKnBDZlBhcm0sCi0JT1VUIFVTSE9SVCAqcEF0aW1XaW4sCi0JT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAotCU9VVCBVQ0hBUiAqcEVycCwKLQlPVVQgVUNIQVIgKnBEdGltQ291bnQsCi0JT1VUIFVDSEFSICpwRHRpbVBlcmlvZCwKLQlPVVQgVUNIQVIgKnBCY2FzdEZsYWcsCi0JT1VUIFVDSEFSICpwTWVzc2FnZVRvTWUsCi0JT1VUIFVDSEFSIFN1cFJhdGVbXSwKLQlPVVQgVUNIQVIgKnBTdXBSYXRlTGVuLAotCU9VVCBVQ0hBUiBFeHRSYXRlW10sCi0JT1VUIFVDSEFSICpwRXh0UmF0ZUxlbiwKLQlPVVQJVUNIQVIgKnBDa2lwRmxhZywKLQlPVVQJVUNIQVIgKnBBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCi0JT1VUIFBFRENBX1BBUk0gICAgICAgcEVkY2FQYXJtLAotCU9VVCBQUUJTU19MT0FEX1BBUk0gIHBRYnNzTG9hZCwKLQlPVVQgUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCi0JT1VUIFVMT05HICpwUmFsaW5rSWUsCi0JT1VUIFVDSEFSCQkgKnBIdENhcGFiaWxpdHlMZW4sCi0JT1VUIFVDSEFSCQkgKnBQcmVOSHRDYXBhYmlsaXR5TGVuLAotCU9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAotCU9VVCBVQ0hBUgkJICpBZGRIdEluZm9MZW4sCi0JT1VUIEFERF9IVF9JTkZPX0lFICpBZGRIdEluZm8sCi0JT1VUIFVDSEFSICpOZXdFeHRDaGFubmVsLAotCU9VVCBVU0hPUlQgKkxlbmd0aFZJRSwKLQlPVVQgUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKTsKK0JPT0xFQU4gUGVlckFkZEJBUmVxQWN0aW9uU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgdm9pZCAqIHBNc2csCisJCQkJIHVuc2lnbmVkIGxvbmcgTXNnTGVuLCB1OCAqcEFkZHIyKTsKIAotQk9PTEVBTiBQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqcE1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVQ0hBUiBwQWRkcjIpOworQk9PTEVBTiBQZWVyQWRkQkFSc3BBY3Rpb25TYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSB2b2lkICogcE1zZywgdW5zaWduZWQgbG9uZyBNc2dMZW4pOwogCi1CT09MRUFOIFBlZXJBZGRCQVJzcEFjdGlvblNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpwTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbik7CitCT09MRUFOIFBlZXJEZWxCQUFjdGlvblNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICB1OCBXY2lkLCB2b2lkICogcE1zZywgdW5zaWduZWQgbG9uZyBNc2dMZW4pOwogCi1CT09MRUFOIFBlZXJEZWxCQUFjdGlvblNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBVQ0hBUiBXY2lkLAotICAgIElOIFZPSUQgKnBNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuKTsKK0JPT0xFQU4gTWxtZUFzc29jUmVxU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHZvaWQgKiBNc2csCisJCQkgICB1bnNpZ25lZCBsb25nIE1zZ0xlbiwKKwkJCSAgIHU4ICpwQXBBZGRyLAorCQkJICAgdTE2ICogQ2FwYWJpbGl0eUluZm8sCisJCQkgICB1bnNpZ25lZCBsb25nICogVGltZW91dCwgdTE2ICogTGlzdGVuSW50dik7CiAKLUJPT0xFQU4gTWxtZUFzc29jUmVxU2FuaXR5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBWT0lEICpNc2csCi0JSU4gIFVMT05HIE1zZ0xlbiwKLQlPVVQgUFVDSEFSIHBBcEFkZHIsCi0JT1VUIFVTSE9SVCAqQ2FwYWJpbGl0eUluZm8sCi0JT1VUIFVMT05HICpUaW1lb3V0LAotCU9VVCBVU0hPUlQgKkxpc3RlbkludHYpOworQk9PTEVBTiBNbG1lQXV0aFJlcVNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgIHZvaWQgKiBNc2csCisJCQkgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkJICB1OCAqcEFkZHIsCisJCQkgIHVuc2lnbmVkIGxvbmcgKiBUaW1lb3V0LCB1MTYgKiBBbGcpOwogCi1CT09MRUFOIE1sbWVBdXRoUmVxU2FuaXR5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBWT0lEICpNc2csCi0JSU4gIFVMT05HIE1zZ0xlbiwKLQlPVVQgUFVDSEFSIHBBZGRyLAotCU9VVCBVTE9ORyAqVGltZW91dCwKLQlPVVQgVVNIT1JUICpBbGcpOworQk9PTEVBTiBNbG1lU3RhcnRSZXFTYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdm9pZCAqIE1zZywKKwkJCSAgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkJICAgY2hhciBTc2lkW10sIHU4ICogU3NpZGxlbik7CiAKLUJPT0xFQU4gTWxtZVN0YXJ0UmVxU2FuaXR5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBWT0lEICpNc2csCi0JSU4gIFVMT05HIE1zZ0xlbiwKLQlPVVQgQ0hBUiBTc2lkW10sCi0JT1VUIFVDSEFSICpTc2lkbGVuKTsKK0JPT0xFQU4gUGVlckF1dGhTYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICAgdm9pZCAqIE1zZywKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkgICAgICAgdTggKnBBZGRyLAorCQkgICAgICAgdTE2ICogQWxnLAorCQkgICAgICAgdTE2ICogU2VxLAorCQkgICAgICAgdTE2ICogU3RhdHVzLCBjaGFyIENobGdUZXh0W10pOwogCi1CT09MRUFOIFBlZXJBdXRoU2FuaXR5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBWT0lEICpNc2csCi0JSU4gIFVMT05HIE1zZ0xlbiwKLQlPVVQgUFVDSEFSIHBBZGRyLAotCU9VVCBVU0hPUlQgKkFsZywKLQlPVVQgVVNIT1JUICpTZXEsCi0JT1VUIFVTSE9SVCAqU3RhdHVzLAotCU9VVCBDSEFSIENobGdUZXh0W10pOworQk9PTEVBTiBQZWVyQXNzb2NSc3BTYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB2b2lkICogcE1zZywgdW5zaWduZWQgbG9uZyBNc2dMZW4sIHU4ICpwQWRkcjIsIHUxNiAqIHBDYXBhYmlsaXR5SW5mbywgdTE2ICogcFN0YXR1cywgdTE2ICogcEFpZCwgdTggU3VwUmF0ZVtdLCB1OCAqIHBTdXBSYXRlTGVuLCB1OCBFeHRSYXRlW10sIHU4ICogcEV4dFJhdGVMZW4sIHN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llICogcEh0Q2FwYWJpbGl0eSwgc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llICogcEFkZEh0SW5mbywJLyogQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFICovCisJCQkgICB1OCAqIHBIdENhcGFiaWxpdHlMZW4sCisJCQkgICB1OCAqIHBBZGRIdEluZm9MZW4sCisJCQkgICB1OCAqIHBOZXdFeHRDaGFubmVsT2Zmc2V0LAorCQkJICAgc3RydWN0IHJ0X2VkY2FfcGFybSAqcEVkY2FQYXJtLCB1OCAqIHBDa2lwRmxhZyk7CiAKLUJPT0xFQU4gUGVlckFzc29jUnNwU2FuaXR5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOIFZPSUQgKnBNc2csCi0JSU4gIFVMT05HIE1zZ0xlbiwKLQlPVVQgUFVDSEFSIHBBZGRyMiwKLQlPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCi0JT1VUIFVTSE9SVCAqcFN0YXR1cywKLQlPVVQgVVNIT1JUICpwQWlkLAotCU9VVCBVQ0hBUiBTdXBSYXRlW10sCi0JT1VUIFVDSEFSICpwU3VwUmF0ZUxlbiwKLQlPVVQgVUNIQVIgRXh0UmF0ZVtdLAotCU9VVCBVQ0hBUiAqcEV4dFJhdGVMZW4sCi0gICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAotICAgIE9VVCBBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotICAgIE9VVCBVQ0hBUgkJCSpwSHRDYXBhYmlsaXR5TGVuLAotICAgIE9VVCBVQ0hBUgkJCSpwQWRkSHRJbmZvTGVuLAotICAgIE9VVCBVQ0hBUgkJCSpwTmV3RXh0Q2hhbm5lbE9mZnNldCwKLQlPVVQgUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCi0JT1VUIFVDSEFSICpwQ2tpcEZsYWcpOworQk9PTEVBTiBQZWVyRGlzYXNzb2NTYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdm9pZCAqIE1zZywKKwkJCSAgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkJICAgdTggKnBBZGRyMiwgdTE2ICogUmVhc29uKTsKIAotQk9PTEVBTiBQZWVyRGlzYXNzb2NTYW5pdHkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFZPSUQgKk1zZywKLQlJTiAgVUxPTkcgTXNnTGVuLAotCU9VVCBQVUNIQVIgcEFkZHIyLAotCU9VVCBVU0hPUlQgKlJlYXNvbik7CitCT09MRUFOIFBlZXJXcGFNZXNzYWdlU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgc3RydWN0IHJ0X2VhcG9sX3BhY2tldCAqIHBNc2csCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkJICAgICB1OCBNc2dUeXBlLCBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkpOwogCi1CT09MRUFOIFBlZXJEZWF1dGhTYW5pdHkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFZPSUQgKk1zZywKLQlJTiAgVUxPTkcgTXNnTGVuLAotCU9VVCBQVUNIQVIgcEFkZHIyLAotCU9VVCBVU0hPUlQgKlJlYXNvbik7CitCT09MRUFOIFBlZXJEZWF1dGhTYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHZvaWQgKiBNc2csCisJCQkgdW5zaWduZWQgbG9uZyBNc2dMZW4sCisJCQkgdTggKnBBZGRyMiwgdTE2ICogUmVhc29uKTsKIAotQk9PTEVBTiBQZWVyUHJvYmVSZXFTYW5pdHkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFZPSUQgKk1zZywKLQlJTiAgVUxPTkcgTXNnTGVuLAotCU9VVCBQVUNIQVIgcEFkZHIyLAotCU9VVCBDSEFSIFNzaWRbXSwKLQlPVVQgVUNIQVIgKnBTc2lkTGVuKTsKK0JPT0xFQU4gUGVlclByb2JlUmVxU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHZvaWQgKiBNc2csCisJCQkgICB1bnNpZ25lZCBsb25nIE1zZ0xlbiwKKwkJCSAgIHU4ICpwQWRkcjIsCisJCQkgICBjaGFyIFNzaWRbXSwgdTggKiBwU3NpZExlbik7CiAKLUJPT0xFQU4gR2V0VGltQml0KAotCUlOICBDSEFSICpQdHIsCi0JSU4gIFVTSE9SVCBBaWQsCi0JT1VUIFVDSEFSICpUaW1MZW4sCi0JT1VUIFVDSEFSICpCY2FzdEZsYWcsCi0JT1VUIFVDSEFSICpEdGltQ291bnQsCi0JT1VUIFVDSEFSICpEdGltUGVyaW9kLAotCU9VVCBVQ0hBUiAqTWVzc2FnZVRvTWUpOworQk9PTEVBTiBHZXRUaW1CaXQoY2hhciAqIFB0ciwKKwkJICB1MTYgQWlkLAorCQkgIHU4ICogVGltTGVuLAorCQkgIHU4ICogQmNhc3RGbGFnLAorCQkgIHU4ICogRHRpbUNvdW50LAorCQkgIHU4ICogRHRpbVBlcmlvZCwgdTggKiBNZXNzYWdlVG9NZSk7CiAKLVVDSEFSIENoYW5uZWxTYW5pdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgY2hhbm5lbCk7Cit1OCBDaGFubmVsU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggY2hhbm5lbCk7CiAKLU5ESVNfODAyXzExX05FVFdPUktfVFlQRSBOZXR3b3JrVHlwZUluVXNlU2FuaXR5KAotCUlOIFBCU1NfRU5UUlkgcEJzcyk7CitORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgTmV0d29ya1R5cGVJblVzZVNhbml0eShzdHJ1Y3QgcnRfYnNzX2VudHJ5ICpwQnNzKTsKIAotQk9PTEVBTiBNbG1lRGVsQkFSZXFTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbik7CitCT09MRUFOIE1sbWVEZWxCQVJlcVNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB2b2lkICogTXNnLCB1bnNpZ25lZCBsb25nIE1zZ0xlbik7CiAKLUJPT0xFQU4gTWxtZUFkZEJBUmVxU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0gICAgT1VUIFBVQ0hBUiBwQWRkcjIpOworQk9PTEVBTiBNbG1lQWRkQkFSZXFTYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdm9pZCAqIE1zZywgdW5zaWduZWQgbG9uZyBNc2dMZW4sIHU4ICpwQWRkcjIpOwogCi1VTE9ORyBNYWtlT3V0Z29pbmdGcmFtZSgKLQlPVVQgQ0hBUiAqQnVmZmVyLAotCU9VVCBVTE9ORyAqTGVuZ3RoLCAuLi4pOwordW5zaWduZWQgbG9uZyBNYWtlT3V0Z29pbmdGcmFtZSh1OCAqIEJ1ZmZlciwgdW5zaWduZWQgbG9uZyAqIExlbmd0aCwgLi4uKTsKIAotVk9JRCAgTGZzckluaXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVMT05HIFNlZWQpOwordm9pZCBMZnNySW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHVuc2lnbmVkIGxvbmcgU2VlZCk7CiAKLVVDSEFSIFJhbmRvbUJ5dGUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwordTggUmFuZG9tQnl0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIEFzaWNVcGRhdGVBdXRvRmFsbEJhY2tUYWJsZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwVHhSYXRlKTsKK3ZvaWQgQXNpY1VwZGF0ZUF1dG9GYWxsQmFja1RhYmxlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggKnBUeFJhdGUpOwogCi1WT0lEICBNbG1lUGVyaW9kaWNFeGVjKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Cit2b2lkIE1sbWVQZXJpb2RpY0V4ZWModm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkgICAgICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSAgICAgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKTsKIAotVk9JRCBMaW5rRG93bkV4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKK3ZvaWQgTGlua0Rvd25FeGVjKHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpOwogCi1WT0lEIFNUQU1sbWVQZXJpb2RpY0V4ZWMoCi0JUFJUTVBfQURBUFRFUiBwQWQpOwordm9pZCBTVEFNbG1lUGVyaW9kaWNFeGVjKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgTWxtZUF1dG9TY2FuKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK3ZvaWQgTWxtZUF1dG9TY2FuKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Cit2b2lkIE1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotQk9PTEVBTiBNbG1lVmFsaWRhdGVTU0lEKAotCUlOIFBVQ0hBUiBwU3NpZCwKLQlJTiBVQ0hBUiAgU3NpZExlbik7CitCT09MRUFOIE1sbWVWYWxpZGF0ZVNTSUQodTggKnBTc2lkLCB1OCBTc2lkTGVuKTsKIAotVk9JRCBNbG1lQ2hlY2tGb3JSb2FtaW5nKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVMT05HICAgIE5vdzMyKTsKK3ZvaWQgTWxtZUNoZWNrRm9yUm9hbWluZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHVuc2lnbmVkIGxvbmcgTm93MzIpOwogCi1WT0lEIE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVTE9ORyAgICAgICAgICAgTm93KTsKK0JPT0xFQU4gTWxtZUNoZWNrRm9yRmFzdFJvYW1pbmcoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Cit2b2lkIE1sbWVEeW5hbWljVHhSYXRlU3dpdGNoaW5nKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgTWxtZVNldFR4UmF0ZSgKLQlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gUE1BQ19UQUJMRV9FTlRSWQkJcEVudHJ5LAotCUlOIFBSVE1QX1RYX1JBVEVfU1dJVENICXBUeFJhdGUpOwordm9pZCBNbG1lU2V0VHhSYXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LCBzdHJ1Y3QgcnRfcnRtcF90eF9yYXRlX3N3aXRjaCAqIHBUeFJhdGUpOwogCi1WT0lEIE1sbWVTZWxlY3RUeFJhdGVUYWJsZSgKLQlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gUE1BQ19UQUJMRV9FTlRSWQkJcEVudHJ5LAotCUlOIFBVQ0hBUgkJCQkqcHBUYWJsZSwKLQlJTiBQVUNIQVIJCQkJcFRhYmxlU2l6ZSwKLQlJTiBQVUNIQVIJCQkJcEluaXRUeFJhdGVJZHgpOwordm9pZCBNbG1lU2VsZWN0VHhSYXRlVGFibGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LAorCQkJICAgdTggKiogcHBUYWJsZSwKKwkJCSAgIHU4ICpwVGFibGVTaXplLCB1OCAqcEluaXRUeFJhdGVJZHgpOwogCi1WT0lEIE1sbWVDYWxjdWxhdGVDaGFubmVsUXVhbGl0eSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVTE9ORyBOb3cpOwordm9pZCBNbG1lQ2FsY3VsYXRlQ2hhbm5lbFF1YWxpdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwTWFjRW50cnksIHVuc2lnbmVkIGxvbmcgTm93KTsKIAotVk9JRCBNbG1lQ2hlY2tQc21DaGFuZ2UoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUxPTkcgICAgTm93MzIpOwordm9pZCBNbG1lQ2hlY2tQc21DaGFuZ2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1bnNpZ25lZCBsb25nIE5vdzMyKTsKIAotVk9JRCBNbG1lU2V0UHNtQml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVCBwc20pOwordm9pZCBNbG1lU2V0UHNtQml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTE2IHBzbSk7CiAKLVZPSUQgTWxtZVNldFR4UHJlYW1ibGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIFR4UHJlYW1ibGUpOwordm9pZCBNbG1lU2V0VHhQcmVhbWJsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHUxNiBUeFByZWFtYmxlKTsKIAotVk9JRCBVcGRhdGVCYXNpY1JhdGVCaXRtYXAoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOwordm9pZCBVcGRhdGVCYXNpY1JhdGVCaXRtYXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBNbG1lVXBkYXRlVHhSYXRlcygKLQlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCi0JSU4gCUJPT0xFQU4JCSAJYkxpbmtVcCwKLQlJTglVQ0hBUgkJCWFwaWR4KTsKK3ZvaWQgTWxtZVVwZGF0ZVR4UmF0ZXMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICAgSU4gQk9PTEVBTiBiTGlua1VwLCB1OCBhcGlkeCk7CiAKLVZPSUQgTWxtZVVwZGF0ZUh0VHhSYXRlcygKLQlJTiBQUlRNUF9BREFQVEVSIAkJcEFkLAotCUlOCVVDSEFSCQkJCWFwaWR4KTsKK3ZvaWQgTWxtZVVwZGF0ZUh0VHhSYXRlcyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IGFwaWR4KTsKIAotVk9JRCAgICBSVE1QQ2hlY2tSYXRlcygKLQlJTiAgICAgIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gT1VUICBVQ0hBUiAgICAgICAgICAgU3VwUmF0ZVtdLAotCUlOIE9VVCAgVUNIQVIgICAgICAgICAgICpTdXBSYXRlTGVuKTsKK3ZvaWQgUlRNUENoZWNrUmF0ZXMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgSU4gdTggU3VwUmF0ZVtdLCBJTiB1OCAqIFN1cFJhdGVMZW4pOwogCi1CT09MRUFOIFJUTVBDaGVja0NoYW5uZWwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIJCUNlbnRyYWxDaGFubmVsLAotCUlOIFVDSEFSCQlDaGFubmVsKTsKK0JPT0xFQU4gUlRNUENoZWNrQ2hhbm5lbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgdTggQ2VudHJhbENoYW5uZWwsIHU4IENoYW5uZWwpOwogCi1CT09MRUFOIAlSVE1QQ2hlY2tIdCgKLQlJTgkJUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JCVVDSEFSCVdjaWQsCi0JSU4gT1VUCUhUX0NBUEFCSUxJVFlfSUUJCQkqcEh0Q2FwYWJpbGl0eSwKLQlJTiBPVVQJQUREX0hUX0lORk9fSUUJCQkqcEFkZEh0SW5mbyk7CitCT09MRUFOIFJUTVBDaGVja0h0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgIHU4IFdjaWQsCisJCSAgICBzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSAqIHBIdENhcGFiaWxpdHksCisJCSAgICBzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUgKiBwQWRkSHRJbmZvKTsKIAotVk9JRCBTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Cit2b2lkIFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWModm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkJCSAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkJCSAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLAorCQkJCSAgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKTsKIAotVk9JRCBSVE1QVXBkYXRlTWxtZVJhdGUoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwordm9pZCBSVE1QVXBkYXRlTWxtZVJhdGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotQ0hBUiBSVE1QTWF4UnNzaSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBDSEFSCQkJCVJzc2kwLAotCUlOIENIQVIJCQkJUnNzaTEsCi0JSU4gQ0hBUgkJCQlSc3NpMik7CitjaGFyIFJUTVBNYXhSc3NpKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJIGNoYXIgUnNzaTAsIGNoYXIgUnNzaTEsIGNoYXIgUnNzaTIpOwogCi1WT0lEIEFzaWNTZXRSeEFudCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVQ0hBUgkJCUFudCk7CisjaWZkZWYgUlQzMHh4Cit2b2lkIEFzaWNTZXRSeEFudChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IEFudCk7CiAKLVZPSUQgQXNpY0V2YWx1YXRlUnhBbnQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwordm9pZCBSVE1QRmlsdGVyQ2FsaWJyYXRpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBBc2ljUnhBbnRFdmFsVGltZW91dCgKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworI2lmZGVmIFJUTVBfRUZVU0VfU1VQUE9SVAorLyoyMDA4LzA5LzExOktIIGFkZCB0byBzdXBwb3J0IGVmdXNlPC0tICovCitpbnQgc2V0X2VGdXNlR2V0RnJlZUJsb2NrQ291bnRfUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIGNoYXIgKmFyZyk7CiAKLVZPSUQgQVBTRFBlcmlvZGljRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworaW50IHNldF9lRnVzZWR1bXBfUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIGNoYXIgKmFyZyk7CiAKLUJPT0xFQU4gUlRNUENoZWNrRW50cnlFbmFibGVBdXRvUmF0ZVN3aXRjaCgKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQlJTiBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSk7Cit2b2lkIGVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQl1MTYgT2Zmc2V0LAorCQkJCXUxNiBMZW5ndGgsIHUxNiAqIHBEYXRhKTsKIAotVUNIQVIgUlRNUFN0YUZpeGVkVHhNb2RlKAotCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCUlOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KTsKK2ludCBSdG1wRWZ1c2VTdXBwb3J0Q2hlY2soc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKAotCQlVQ0hBUgkJCQlmaXhlZF90eF9tb2RlLAotCQlQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSk7Cit2b2lkIGVGdXNlR2V0RnJlZUJsb2NrQ291bnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1MzIgKkVmdXNlRnJlZUJsb2NrKTsKIAotQk9PTEVBTiBSVE1QQXV0b1JhdGVTd2l0Y2hDaGVjaygKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCk7CitpbnQgZUZ1c2VfaW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOworLyoyMDA4LzA5LzExOktIIGFkZCB0byBzdXBwb3J0IGVmdXNlLS0+ICovCisjZW5kaWYgLyogUlRNUF9FRlVTRV9TVVBQT1JUIC8vICovCiAKLU5ESVNfU1RBVFVTIE1sbWVJbml0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKy8qIGFkZCBieSBqb2hubGksIFJGIHBvd2VyIHNlcXVlbmNlIHNldHVwICovCit2b2lkIFJUMzB4eExvYWRSRk5vcm1hbE1vZGVTZXR1cChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIE1sbWVIYW5kbGVyKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK3ZvaWQgUlQzMHh4TG9hZFJGU2xlZXBNb2RlU2V0dXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBNbG1lSGFsdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Cit2b2lkIFJUMzB4eFJldmVyc2VSRlNsZWVwTW9kZVNldHVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CisvKiBlbmQgam9obmxpICovCiAKLVZPSUQgTWxtZVJlc2V0UmFsaW5rQ291bnRlcnMoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworI2lmZGVmIFJUMzA3MAordm9pZCBOSUNJbml0UlQzMDcwUkZSZWdpc3RlcnMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKKyNlbmRpZiAvKiBSVDMwNzAgLy8gKi8KKyNpZmRlZiBSVDMwOTAKK3ZvaWQgTklDSW5pdFJUMzA5MFJGUmVnaXN0ZXJzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CisjZW5kaWYgLyogUlQzMDkwIC8vICovCiAKLVZPSUQgQnVpbGRDaGFubmVsTGlzdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Cit2b2lkIFJUMzB4eEhhbHRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVUNIQVIgRmlyc3RDaGFubmVsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK3ZvaWQgUlQzMHh4U2V0UnhBbnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBBbnQpOworI2VuZGlmIC8qIFJUMzB4eCAvLyAqLwogCi1VQ0hBUiBOZXh0Q2hhbm5lbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUNIQVIgY2hhbm5lbCk7Cit2b2lkIEFzaWNFdmFsdWF0ZVJ4QW50KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgQ2hhbmdlVG9DZWxsUG93ZXJMaW1pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiAgICAgICAgIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCk7Cit2b2lkIEFzaWNSeEFudEV2YWxUaW1lb3V0KHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJCSAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkJICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMyk7CiAKLVVTSE9SVCBSVE1QX0VFUFJPTV9SRUFEMTYoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVTSE9SVCBPZmZzZXQpOwordm9pZCBBUFNEUGVyaW9kaWNFeGVjKHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJICAgICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkgICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMyk7CiAKLVZPSUQgUlRNUF9FRVBST01fV1JJVEUxNigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVVNIT1JUIE9mZnNldCwKLQlJTiAgVVNIT1JUIERhdGEpOworQk9PTEVBTiBSVE1QQ2hlY2tFbnRyeUVuYWJsZUF1dG9SYXRlU3dpdGNoKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJICAgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5KTsKIAotLy8KLS8vIFByb3RvdHlwZXMgb2YgZnVuY3Rpb24gZGVmaW5pdGlvbiBpbiBydG1wX3RraXAuYwotLy8KLVZPSUQgICAgUlRNUEluaXRUa2lwRW5naW5lKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcFRLZXksCi0JSU4gIFVDSEFSICAgICAgICAgICBLZXlJZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBUQSwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBNSUNLZXksCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwVFNDLAotCU9VVCBQVUxPTkcgICAgICAgICAgcElWMTYsCi0JT1VUIFBVTE9ORyAgICAgICAgICBwSVYzMik7Cit1OCBSVE1QU3RhRml4ZWRUeE1vZGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkpOwogCi1WT0lEICAgIFJUTVBJbml0TUlDRW5naW5lKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcEtleSwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEQSwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBTQSwKLQlJTiAgVUNIQVIgICAgICAgICAgIFVzZXJQcmlvcml0eSwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBNSUNLZXkpOwordm9pZCBSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKHU4IGZpeGVkX3R4X21vZGUsIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSk7CiAKLUJPT0xFQU4gUlRNUFRraXBDb21wYXJlTUlDVmFsdWUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAotCUlOICBQVUNIQVIgICAgICAgICAgcERBLAotCUlOICBQVUNIQVIgICAgICAgICAgcFNBLAotCUlOICBQVUNIQVIgICAgICAgICAgcE1JQ0tleSwKLQlJTglVQ0hBUgkJCVVzZXJQcmlvcml0eSwKLQlJTiAgVUlOVCAgICAgICAgICAgIExlbik7CitCT09MRUFOIFJUTVBBdXRvUmF0ZVN3aXRjaENoZWNrKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgICAgUlRNUENhbGN1bGF0ZU1JQ1ZhbHVlKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBFbmNhcCwKLQlJTiAgUENJUEhFUl9LRVkgICAgIHBLZXksCi0JSU4JVUNIQVIJCQlhcGlkeCk7CitpbnQgTWxtZUluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotQk9PTEVBTiBSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZVdpdGhMTEMoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwTExDLAotCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEQSwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBTQSwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBNSUNLZXksCi0JSU4gIFVJTlQgICAgICAgICAgICBMZW4pOwordm9pZCBNbG1lSGFuZGxlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEICAgIFJUTVBUa2lwQXBwZW5kQnl0ZSgKLQlJTiAgUFRLSVBfS0VZX0lORk8gIHBUa2lwLAotCUlOICBVQ0hBUiAgICAgICAgICAgdUNoYXIpOwordm9pZCBNbG1lSGFsdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEICAgIFJUTVBUa2lwQXBwZW5kKAotCUlOICBQVEtJUF9LRVlfSU5GTyAgcFRraXAsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAotCUlOICBVSU5UICAgICAgICAgICAgbkJ5dGVzKTsKK3ZvaWQgTWxtZVJlc2V0UmFsaW5rQ291bnRlcnMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCAgICBSVE1QVGtpcEdldE1JQygKLQlJTiAgUFRLSVBfS0VZX0lORk8gIHBUa2lwKTsKK3ZvaWQgQnVpbGRDaGFubmVsTGlzdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1CT09MRUFOIFJUTVBTb2Z0RGVjcnlwdFRLSVAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSCXBEYXRhLAotCUlOIFVMT05HCURhdGFCeXRlQ250LAotCUlOIFVDSEFSICAgIFVzZXJQcmlvcml0eSwKLQlJTiBQQ0lQSEVSX0tFWQlwV3BhS2V5KTsKK3U4IEZpcnN0Q2hhbm5lbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1CT09MRUFOIFJUTVBTb2Z0RGVjcnlwdEFFUygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIJcERhdGEsCi0JSU4gVUxPTkcJRGF0YUJ5dGVDbnQsCi0JSU4gUENJUEhFUl9LRVkJcFdwYUtleSk7Cit1OCBOZXh0Q2hhbm5lbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IGNoYW5uZWwpOwogCi0vLwotLy8gUHJvdG90eXBlcyBvZiBmdW5jdGlvbiBkZWZpbml0aW9uIGluIGNtbV9pbmZvLmMKLS8vCi1ORElTX1NUQVRVUyBSVE1QV1BBUmVtb3ZlS2V5UHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFZPSUQgICAgICAgICAgIHBCdWYpOwordm9pZCBDaGFuZ2VUb0NlbGxQb3dlckxpbWl0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICB1OCBBaXJvbmV0Q2VsbFBvd2VyTGltaXQpOwogCi1WT0lEICAgIFJUTVBXUEFSZW1vdmVBbGxLZXlzKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKy8qICovCisvKiBQcm90b3R5cGVzIG9mIGZ1bmN0aW9uIGRlZmluaXRpb24gaW4gcnRtcF90a2lwLmMgKi8KKy8qICovCit2b2lkIFJUTVBJbml0VGtpcEVuZ2luZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQl1OCAqcFRLZXksCisJCQl1OCBLZXlJZCwKKwkJCXU4ICpwVEEsCisJCQl1OCAqcE1JQ0tleSwKKwkJCXU4ICpwVFNDLCB1bnNpZ25lZCBsb25nICpwSVYxNiwgdW5zaWduZWQgbG9uZyAqcElWMzIpOwogCi1CT09MRUFOIFJUTVBDaGVja1N0clByaW50QWJsZSgKLSAgICBJTiAgQ0hBUiAqcEluUHV0U3RyLAotICAgIElOICBVQ0hBUiBzdHJMZW4pOwordm9pZCBSVE1QSW5pdE1JQ0VuZ2luZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICB1OCAqcEtleSwKKwkJICAgICAgIHU4ICpwREEsCisJCSAgICAgICB1OCAqcFNBLCB1OCBVc2VyUHJpb3JpdHksIHU4ICpwTUlDS2V5KTsKIAotVk9JRCAgICBSVE1QU2V0UGh5TW9kZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUxPTkcgcGh5bW9kZSk7CitCT09MRUFOIFJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQl1OCAqcFNyYywKKwkJCQl1OCAqcERBLAorCQkJCXU4ICpwU0EsCisJCQkJdTggKnBNSUNLZXksCisJCQkJdTggVXNlclByaW9yaXR5LCB1MzIgTGVuKTsKIAotVk9JRAlSVE1QVXBkYXRlSFRJRSgKLQlJTglSVF9IVF9DQVBBQklMSVRZCSpwUnRIdCwKLQlJTgkJVUNIQVIJCQkJKnBNY3NTZXQsCi0JT1VUCQlIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAotCU9VVAkJQUREX0hUX0lORk9fSUUJCSpwQWRkSHRJbmZvKTsKK3ZvaWQgUlRNUENhbGN1bGF0ZU1JQ1ZhbHVlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHZvaWQgKnBQYWNrZXQsCisJCQkgICB1OCAqcEVuY2FwLAorCQkJICAgc3RydWN0IHJ0X2NpcGhlcl9rZXkgKnBLZXksIHU4IGFwaWR4KTsKIAotVk9JRAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJQnNzSWR4LAotCUlOIAlVQ0hBUgkJIAlLZXlJZHgsCi0JSU4gCVVDSEFSCQkgCUNpcGhlckFsZywKLQlJTiAJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkpOwordm9pZCBSVE1QVGtpcEFwcGVuZEJ5dGUoc3RydWN0IHJ0X3RraXBfa2V5X2luZm8gKnBUa2lwLCB1OCB1Q2hhcik7CiAKLUNIQVIgKkdldEVuY3J5cHRUeXBlKAotCUNIQVIgZW5jKTsKK3ZvaWQgUlRNUFRraXBBcHBlbmQoc3RydWN0IHJ0X3RraXBfa2V5X2luZm8gKnBUa2lwLCB1OCAqcFNyYywgdTMyIG5CeXRlcyk7CiAKLUNIQVIgKkdldEF1dGhNb2RlKAotCUNIQVIgYXV0aCk7Cit2b2lkIFJUTVBUa2lwR2V0TUlDKHN0cnVjdCBydF90a2lwX2tleV9pbmZvICpwVGtpcCk7CiAKLVZPSUQgUlRNUElvY3RsR2V0U2l0ZVN1cnZleSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxKTsKK0JPT0xFQU4gUlRNUFNvZnREZWNyeXB0VEtJUChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgdTggKnBEYXRhLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgRGF0YUJ5dGVDbnQsCisJCQkgICAgdTggVXNlclByaW9yaXR5LCBzdHJ1Y3QgcnRfY2lwaGVyX2tleSAqcFdwYUtleSk7CiAKLVZPSUQgUlRNUElvY3RsR2V0TWFjVGFibGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gc3RydWN0IGl3cmVxICp3cnEpOworQk9PTEVBTiBSVE1QU29mdERlY3J5cHRBRVMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdTggKnBEYXRhLAorCQkJICAgdW5zaWduZWQgbG9uZyBEYXRhQnl0ZUNudCwgc3RydWN0IHJ0X2NpcGhlcl9rZXkgKnBXcGFLZXkpOwogCi1WT0lEICAgIFJUTVBBZGRCU1NJRENpcGhlcigKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTglVQ0hBUglBaWQsCi0gICAgSU4gIFBORElTXzgwMl8xMV9LRVkgICAgcEtleSwKLSAgICBJTiAgVUNIQVIgICBDaXBoZXJBbGcpOworLyogKi8KKy8qIFByb3RvdHlwZXMgb2YgZnVuY3Rpb24gZGVmaW5pdGlvbiBpbiBjbW1faW5mby5jICovCisvKiAqLworaW50IFJUX0NmZ1NldENvdW50cnlSZWdpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBjaGFyICphcmcsIGludCBiYW5kKTsKIAotVk9JRAlSVE1QU2V0SFQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JT0lEX1NFVF9IVF9QSFlNT0RFICpwSFRQaHlNb2RlKTsKK2ludCBSVF9DZmdTZXRXaXJlbGVzc01vZGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBjaGFyICphcmcpOwogCi1WT0lECVJUTVBTZXRJbmRpdmlkdWFsSFQoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCVVDSEFSCQkJCWFwaWR4KTsKK2ludCBSVF9DZmdTZXRTaG9ydFNsb3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBjaGFyICphcmcpOwogCi1WT0lEIFJUTVBTZW5kV2lyZWxlc3NFdmVudCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQJCQlFdmVudF9mbGFnLAotCUlOCVBVQ0hBUiAJCQlwQWRkciwKLQlJTiAgVUNIQVIJCQlCc3NJZHgsCi0JSU4JQ0hBUgkJCVJzc2kpOworaW50IFJUX0NmZ1NldFdlcEtleShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICBjaGFyICprZXlTdHJpbmcsCisJCSAgICBzdHJ1Y3QgcnRfY2lwaGVyX2tleSAqcFNoYXJlZEtleSwgaW50IGtleUlkeCk7CiAKLS8vCi0vLyBwcm90b3R5cGUgaW4gd3BhLmMKLS8vCi1CT09MRUFOIFdwYU1zZ1R5cGVTdWJzdCgKLQlJTiAgVUNIQVIgICBFQVBUeXBlLAotCU9VVCBJTlQJCSpNc2dUeXBlKTsKK2ludCBSVF9DZmdTZXRXUEFQU0tLZXkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICAgY2hhciAqa2V5U3RyaW5nLAorCQkgICAgICAgdTggKiBwSGFzaFN0ciwKKwkJICAgICAgIGludCBoYXNoU3RyTGVuLCB1OCAqcFBNS0J1Zik7CiAKLVZPSUQgV3BhUHNrU3RhdGVNYWNoaW5lSW5pdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCi0JSU4gIFNUQVRFX01BQ0hJTkUgICAgICAgKlMsCi0JT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKy8qICovCisvKiBQcm90b3R5cGVzIG9mIGZ1bmN0aW9uIGRlZmluaXRpb24gaW4gY21tX2luZm8uYyAqLworLyogKi8KK3ZvaWQgUlRNUFdQQVJlbW92ZUFsbEtleXMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBXcGFFQVBPTEtleUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgUlRNUFNldFBoeU1vZGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1bnNpZ25lZCBsb25nIHBoeW1vZGUpOwogCi1WT0lEICAgIFdwYVBhaXJNc2cxQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBSVE1QVXBkYXRlSFRJRShzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eSAqcFJ0SHQsCisJCSAgICB1OCAqIHBNY3NTZXQsCisJCSAgICBzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSAqIHBIdENhcGFiaWxpdHksCisJCSAgICBzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUgKiBwQWRkSHRJbmZvKTsKIAotVk9JRCAgICBXcGFQYWlyTXNnM0FjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgdTggQnNzSWR4LAorCQkJICAgICAgIHU4IEtleUlkeCwKKwkJCSAgICAgICB1OCBDaXBoZXJBbGcsIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSk7CiAKLVZPSUQgICAgV3BhR3JvdXBNc2cxQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworY2hhciAqR2V0RW5jcnlwdFR5cGUoY2hhciBlbmMpOwogCi1WT0lEICAgIFdwYU1hY0hlYWRlckluaXQoCi0JSU4gICAgICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOIE9VVCAgUEhFQURFUl84MDJfMTEgIHBIZHI4MDIxMSwKLQlJTiAgICAgIFVDSEFSICAgICAgICAgICB3ZXAsCi0JSU4gICAgICBQVUNIQVIgICAgICAgICAgcEFkZHIxKTsKK2NoYXIgKkdldEF1dGhNb2RlKGNoYXIgYXV0aCk7CiAKLVZPSUQgICAgV3BhMlBhaXJNc2cxQWN0aW9uKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBSVE1QU2V0SFQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfb2lkX3NldF9odF9waHltb2RlICpwSFRQaHlNb2RlKTsKIAotVk9JRCAgICBXcGEyUGFpck1zZzNBY3Rpb24oCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIFJUTVBTZXRJbmRpdmlkdWFsSFQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBhcGlkeCk7CiAKLUJPT0xFQU4gUGFyc2VLZXlEYXRhKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQVUNIQVIgICAgICAgICAgcEtleURhdGEsCi0gICAgSU4gIFVDSEFSICAgICAgICAgICBLZXlEYXRhTGVuLAotCUlOCVVDSEFSCQkJYlBhaXJld2lzZSk7Cit2b2lkIFJUTVBTZW5kV2lyZWxlc3NFdmVudChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB1MTYgRXZlbnRfZmxhZywKKwkJCSAgIHU4ICpwQWRkciwgdTggQnNzSWR4LCBjaGFyIFJzc2kpOwogCi1WT0lEICAgIFJUTVBUb1dpcmVsZXNzU3RhKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcEhlYWRlcjgwMl8zLAotICAgIElOICBVSU5UICAgICAgICAgICAgSGRyTGVuLAotCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCi0gICAgSU4gIFVJTlQgICAgICAgICAgICBEYXRhTGVuLAotICAgIElOCUJPT0xFQU4JCQlpczR3YXlGcmFtZSk7CitjaGFyIENvbnZlcnRUb1Jzc2koc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBjaGFyIFJzc2ksIHU4IFJzc2lOdW1iZXIpOwogCi1WT0lEICAgIEhNQUNfU0hBMSgKLQlJTiAgVUNIQVIgICAqdGV4dCwKLQlJTiAgVUlOVCAgICB0ZXh0X2xlbiwKLQlJTiAgVUNIQVIgICAqa2V5LAotCUlOICBVSU5UICAgIGtleV9sZW4sCi0JSU4gIFVDSEFSICAgKmRpZ2VzdCk7CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRnVuY3Rpb24gcHJvdG90eXBlIGluIGNtbV93cGEuYworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwordm9pZCBSVE1QVG9XaXJlbGVzc1N0YShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksCisJCSAgICAgICB1OCAqcEhlYWRlcjgwMl8zLAorCQkgICAgICAgdTMyIEhkckxlbiwKKwkJICAgICAgIHU4ICpwRGF0YSwKKwkJICAgICAgIHUzMiBEYXRhTGVuLCBJTiBCT09MRUFOIGJDbGVhckZyYW1lKTsKIAotVk9JRCAgICBQUkYoCi0JSU4gIFVDSEFSICAgKmtleSwKLQlJTiAgSU5UICAgICBrZXlfbGVuLAotCUlOICBVQ0hBUiAgICpwcmVmaXgsCi0JSU4gIElOVCAgICAgcHJlZml4X2xlbiwKLQlJTiAgVUNIQVIgICAqZGF0YSwKLQlJTiAgSU5UICAgICBkYXRhX2xlbiwKLQlPVVQgVUNIQVIgICAqb3V0cHV0LAotCUlOICBJTlQgICAgIGxlbik7Cit2b2lkIFdwYURlcml2ZVBUSyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgdTggKiBQTUssCisJCSAgdTggKiBBTm9uY2UsCisJCSAgdTggKiBBQSwKKwkJICB1OCAqIFNOb25jZSwKKwkJICB1OCAqIFNBLCB1OCAqIG91dHB1dCwgdTMyIGxlbik7CiAKLVZPSUQgICAgQ0NLTVBSRigKLQlJTiAgVUNIQVIgICAqa2V5LAotCUlOICBJTlQgICAgIGtleV9sZW4sCi0JSU4gIFVDSEFSICAgKmRhdGEsCi0JSU4gIElOVCAgICAgZGF0YV9sZW4sCi0JT1VUIFVDSEFSICAgKm91dHB1dCwKLQlJTiAgSU5UICAgICBsZW4pOwordm9pZCBHZW5SYW5kb20oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCAqIG1hY0FkZHIsIHU4ICogcmFuZG9tKTsKIAotVk9JRCBXcGFDb3VudFBUSygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUNIQVIgICAqUE1LLAotCUlOICBVQ0hBUiAgICpBTm9uY2UsCi0JSU4gIFVDSEFSICAgKkFBLAotCUlOICBVQ0hBUiAgICpTTm9uY2UsCi0JSU4gIFVDSEFSICAgKlNBLAotCU9VVCBVQ0hBUiAgICpvdXRwdXQsCi0JSU4gIFVJTlQgICAgbGVuKTsKK0JPT0xFQU4gUlRNUENoZWNrV1BBZnJhbWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksCisJCQkgIHU4ICpwRGF0YSwKKwkJCSAgdW5zaWduZWQgbG9uZyBEYXRhQnl0ZUNvdW50LCB1OCBGcm9tV2hpY2hCU1NJRCk7CiAKLVZPSUQgICAgR2VuUmFuZG9tKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCVVDSEFSCQkJKm1hY0FkZHIsCi0JT1VUCVVDSEFSCQkJKnJhbmRvbSk7Cit2b2lkIEFFU19HVEtfS0VZX1VOV1JBUCh1OCAqIGtleSwKKwkJCXU4ICogcGxhaW50ZXh0LAorCQkJdTMyIGNfbGVuLCB1OCAqIGNpcGhlcnRleHQpOwogCi0vLwotLy8gcHJvdG90eXBlIGluIGFpcm9uZXQuYwotLy8KLVZPSUQgICAgQWlyb25ldFN0YXRlTWFjaGluZUluaXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkLAotCUlOICBTVEFURV9NQUNISU5FICAgICAgICpTLAotCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgIFRyYW5zW10pOworQk9PTEVBTiBSVE1QUGFyc2VFYXBvbEtleURhdGEoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgdTggKnBLZXlEYXRhLAorCQkJICAgICAgdTggS2V5RGF0YUxlbiwKKwkJCSAgICAgIHU4IEdyb3VwS2V5SW5kZXgsCisJCQkgICAgICB1OCBNc2dUeXBlLAorCQkJICAgICAgSU4gQk9PTEVBTiBiV1BBMiwgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5KTsKIAotVk9JRCAgICBBaXJvbmV0TXNnQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBDb25zdHJ1Y3RFYXBvbE1zZyhzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksCisJCSAgICAgICB1OCBHcm91cEtleVdlcFN0YXR1cywKKwkJICAgICAgIHU4IE1zZ1R5cGUsCisJCSAgICAgICB1OCBEZWZhdWx0S2V5SWR4LAorCQkgICAgICAgdTggKiBLZXlOb25jZSwKKwkJICAgICAgIHU4ICogVHhSU0MsCisJCSAgICAgICB1OCAqIEdUSywKKwkJICAgICAgIHU4ICogUlNOSUUsCisJCSAgICAgICB1OCBSU05JRV9MZW4sIHN0cnVjdCBydF9lYXBvbF9wYWNrZXQgKiBwTXNnKTsKIAotVk9JRCAgICBBaXJvbmV0UmVxdWVzdEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK2ludCBSVE1QU29mdERlY3J5cHRCcm9hZENhc3REYXRhKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaywKKwkJCQkJIElOIE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCisJCQkJCSBHcm91cENpcGhlciwKKwkJCQkJIHN0cnVjdCBydF9jaXBoZXJfa2V5ICpwU2hhcmRfa2V5KTsKIAotVk9JRCAgICBDaGFubmVsTG9hZFJlcXVlc3RBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSICAgICAgICAgICBJbmRleCk7Cit2b2lkIFJUTVBNYWtlUlNOSUUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICB1MzIgQXV0aE1vZGUsIHUzMiBXZXBTdGF0dXMsIHU4IGFwaWR4KTsKIAotVk9JRCAgICBOb2lzZUhpc3RSZXF1ZXN0QWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUiAgICAgICAgICAgSW5kZXgpOworLyogKi8KKy8qIGZ1bmN0aW9uIHByb3RvdHlwZSBpbiBhcF93cGEuYyAqLworLyogKi8KK3ZvaWQgUlRNUEdldFR4VHNjRnJvbUFzaWMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICB1OCBhcGlkeCwgdTggKnBUeFRzYyk7CiAKLVZPSUQgICAgQmVhY29uUmVxdWVzdEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUNIQVIgICAgICAgICAgIEluZGV4KTsKK3ZvaWQgQVBJbnN0YWxsUGFpcndpc2VLZXkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkpOwogCi1WT0lEICAgIEFpcm9uZXRSZXBvcnRBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit1MzIgQVBWYWxpZGF0ZVJTTklFKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksCisJCSAgICAgdTggKnBSc25JZSwgdTggcnNuaWVfbGVuKTsKIAotVk9JRCAgICBDaGFubmVsTG9hZFJlcG9ydEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUNIQVIgICAgICAgICAgIEluZGV4KTsKK3ZvaWQgSGFuZGxlQ291bnRlck1lYXN1cmUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkpOwogCi1WT0lEICAgIE5vaXNlSGlzdFJlcG9ydEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUNIQVIgICAgICAgICAgIEluZGV4KTsKK3ZvaWQgV1BBU3RhcnQ0V2F5SFMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LCB1bnNpZ25lZCBsb25nIFRpbWVJbnRlcnZhbCk7CiAKLVZPSUQgICAgQWlyb25ldEZpbmFsUmVwb3J0QWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK3ZvaWQgV1BBU3RhcnQyV2F5R3JvdXBIUyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSk7CiAKLVZPSUQgICAgQmVhY29uUmVwb3J0QWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUiAgICAgICAgICAgSW5kZXgpOwordm9pZCBQZWVyUGFpck1zZzFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCAgICBBaXJvbmV0QWRkQmVhY29uUmVwb3J0KAotCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKLQlJTiAgVUxPTkcgICAgICAgICAgICAgICBJbmRleCwKLQlJTiAgUE1MTUVfUVVFVUVfRUxFTSAgICBwRWxlbSk7Cit2b2lkIFBlZXJQYWlyTXNnMkFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEICAgIEFpcm9uZXRDcmVhdGVCZWFjb25SZXBvcnRGcm9tQnNzVGFibGUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkKTsKK3ZvaWQgUGVlclBhaXJNc2czQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLUNIQVIgICAgQ29udmVydFRvUnNzaSgKLQlJTiBQUlRNUF9BREFQVEVSICBwQWQsCi0JSU4gQ0hBUgkJCQlSc3NpLAotCUlOIFVDSEFSICAgIFJzc2lOdW1iZXIpOwordm9pZCBQZWVyUGFpck1zZzRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotLy8KLS8vIGZ1bmN0aW9uIHByb3RvdHlwZSBpbiBjbW1fd3BhLmMKLS8vCi1CT09MRUFOIFJUTVBDaGVja1dQQWZyYW1lKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5LAotCUlOIFBVQ0hBUiAJCQlwRGF0YSwKLQlJTiBVTE9ORyAJCQlEYXRhQnl0ZUNvdW50LAotCUlOIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwordm9pZCBQZWVyR3JvdXBNc2cxQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIEFFU19HVEtfS0VZX1VOV1JBUCgKLQlJTiAgVUNIQVIgICAqa2V5LAotCU9VVCBVQ0hBUiAgICpwbGFpbnRleHQsCi0JSU4JVUNIQVIJY19sZW4sCi0JSU4gIFVDSEFSICAgKmNpcGhlcnRleHQpOwordm9pZCBQZWVyR3JvdXBNc2cyQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksCisJCQkgdm9pZCAqIE1zZywgdTMyIE1zZ0xlbik7CiAKLVZPSUQgUlRNUE1ha2VSU05JRSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUlOVCAgICAgICAgICAgIEF1dGhNb2RlLAotCUlOICBVSU5UICAgICAgICAgICAgV2VwU3RhdHVzLAotCUlOCVVDSEFSCQkJYXBpZHgpOwordm9pZCBXcGFEZXJpdmVHVEsodTggKiBQTUssCisJCSAgdTggKiBHTm9uY2UsCisJCSAgdTggKiBBQSwgdTggKiBvdXRwdXQsIHUzMiBsZW4pOwogCi0vLwotLy8gZnVuY3Rpb24gcHJvdG90eXBlIGluIGFwX3dwYS5jCi0vLwordm9pZCBBRVNfR1RLX0tFWV9XUkFQKHU4ICoga2V5LAorCQkgICAgICB1OCAqIHBsYWludGV4dCwKKwkJICAgICAgdTMyIHBfbGVuLCB1OCAqIGNpcGhlcnRleHQpOwogCi1WT0lEIEhhbmRsZUNvdW50ZXJNZWFzdXJlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSk7CisvKnR5cGVkZWYgdm9pZCAoKlRJTUVSX0ZVTkNUSU9OKSh1bnNpZ25lZCBsb25nKTsgKi8KIAogLyogdGltZW91dCAtLSBtcyAqLwotVk9JRCBSVE1QX1NldFBlcmlvZGljVGltZXIoCi0JSU4JTkRJU19NSU5JUE9SVF9USU1FUiAqcFRpbWVyLAotCUlOCXVuc2lnbmVkIGxvbmcgdGltZW91dCk7Cit2b2lkIFJUTVBfU2V0UGVyaW9kaWNUaW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqIHBUaW1lciwKKwkJCSAgIElOIHVuc2lnbmVkIGxvbmcgdGltZW91dCk7CiAKLVZPSUQgUlRNUF9PU19Jbml0X1RpbWVyKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIgKnBUaW1lciwKLQlJTglUSU1FUl9GVU5DVElPTiBmdW5jdGlvbiwKLQlJTglQVk9JRCBkYXRhKTsKK3ZvaWQgUlRNUF9PU19Jbml0X1RpbWVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCXN0cnVjdCB0aW1lcl9saXN0ICogcFRpbWVyLAorCQkJSU4gVElNRVJfRlVOQ1RJT04gZnVuY3Rpb24sIHZvaWQgKmRhdGEpOwogCi1WT0lEIFJUTVBfT1NfQWRkX1RpbWVyKAotCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJKnBUaW1lciwKLQlJTgl1bnNpZ25lZCBsb25nIHRpbWVvdXQpOwordm9pZCBSVE1QX09TX0FkZF9UaW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqIHBUaW1lciwKKwkJICAgICAgIElOIHVuc2lnbmVkIGxvbmcgdGltZW91dCk7CiAKLVZPSUQgUlRNUF9PU19Nb2RfVGltZXIoCi0JSU4JTkRJU19NSU5JUE9SVF9USU1FUgkqcFRpbWVyLAotCUlOCXVuc2lnbmVkIGxvbmcgdGltZW91dCk7Cit2b2lkIFJUTVBfT1NfTW9kX1RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICogcFRpbWVyLAorCQkgICAgICAgSU4gdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKIAordm9pZCBSVE1QX09TX0RlbF9UaW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqIHBUaW1lciwKKwkJICAgICAgIE9VVCBCT09MRUFOICogcENhbmNlbGxlZCk7CiAKLVZPSUQgUlRNUF9PU19EZWxfVGltZXIoCi0JSU4JTkRJU19NSU5JUE9SVF9USU1FUgkqcFRpbWVyLAotCU9VVAlCT09MRUFOCQkJCSAqcENhbmNlbGxlZCk7Cit2b2lkIFJUTVBfT1NfUmVsZWFzZV9QYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfcXVldWVfZW50cnkgKnBFbnRyeSk7CiAKK3ZvaWQgUlRNUHVzZWNEZWxheSh1bnNpZ25lZCBsb25nIHVzZWMpOwogCi1WT0lEIFJUTVBfT1NfUmVsZWFzZV9QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JUFFVRVVFX0VOVFJZICBwRW50cnkpOworaW50IG9zX2FsbG9jX21lbShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgdTggKiogbWVtLCB1bnNpZ25lZCBsb25nIHNpemUpOwogCi1WT0lEIFJUTVB1c2VjRGVsYXkoCi0JSU4JVUxPTkcJdXNlYyk7CitpbnQgb3NfZnJlZV9tZW0oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB2b2lkICptZW0pOwogCi1ORElTX1NUQVRVUyBvc19hbGxvY19tZW0oCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JT1VUCVBVQ0hBUiAqbWVtLAotCUlOCVVMT05HICBzaXplKTsKK3ZvaWQgUlRNUF9BbGxvY2F0ZVNoYXJlZE1lbW9yeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBMZW5ndGgsCisJCQkgICAgICAgSU4gQk9PTEVBTiBDYWNoZWQsCisJCQkgICAgICAgdm9pZCAqKiBWaXJ0dWFsQWRkcmVzcywKKwkJCSAgICAgICBkbWFfYWRkcl90ICpQaHlzaWNhbEFkZHJlc3MpOwogCi1ORElTX1NUQVRVUyBvc19mcmVlX21lbSgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglQVUNIQVIgbWVtKTsKK3ZvaWQgUlRNUEZyZWVUeFJ4UmluZ01lbW9yeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCitpbnQgQWRhcHRlckJsb2NrQWxsb2NhdGVNZW1vcnkodm9pZCAqaGFuZGxlLCB2b2lkICoqIHBwQWQpOwogCi12b2lkIFJUTVBfQWxsb2NhdGVTaGFyZWRNZW1vcnkoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCi0JT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKK3ZvaWQgUlRNUF9BbGxvY2F0ZVR4RGVzY01lbW9yeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgdTMyIEluZGV4LAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgTGVuZ3RoLAorCQkJICAgICAgIElOIEJPT0xFQU4gQ2FjaGVkLAorCQkJICAgICAgIHZvaWQgKiogVmlydHVhbEFkZHJlc3MsCisJCQkgICAgICAgZG1hX2FkZHJfdCAqUGh5c2ljYWxBZGRyZXNzKTsKIAotVk9JRCBSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK3ZvaWQgUlRNUF9BbGxvY2F0ZUZpcnN0VHhCdWZmZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCXUzMiBJbmRleCwKKwkJCQl1bnNpZ25lZCBsb25nIExlbmd0aCwKKwkJCQlJTiBCT09MRUFOIENhY2hlZCwKKwkJCQl2b2lkICoqIFZpcnR1YWxBZGRyZXNzLAorCQkJCWRtYV9hZGRyX3QgKlBoeXNpY2FsQWRkcmVzcyk7CiAKLU5ESVNfU1RBVFVTIEFkYXB0ZXJCbG9ja0FsbG9jYXRlTWVtb3J5KAotCUlOIFBWT0lECWhhbmRsZSwKLQlPVVQJUFZPSUQJKnBwQWQpOwordm9pZCBSVE1QX0ZyZWVGaXJzdFR4QnVmZmVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIExlbmd0aCwKKwkJCSAgICBJTiBCT09MRUFOIENhY2hlZCwKKwkJCSAgICB2b2lkICpWaXJ0dWFsQWRkcmVzcywKKwkJCSAgICBkbWFfYWRkcl90IFBoeXNpY2FsQWRkcmVzcyk7CiAKLXZvaWQgUlRNUF9BbGxvY2F0ZVR4RGVzY01lbW9yeSgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVSU5UCUluZGV4LAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAotCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7Cit2b2lkIFJUTVBfQWxsb2NhdGVNZ210RGVzY01lbW9yeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIHVuc2lnbmVkIGxvbmcgTGVuZ3RoLAorCQkJCSBJTiBCT09MRUFOIENhY2hlZCwKKwkJCQkgdm9pZCAqKiBWaXJ0dWFsQWRkcmVzcywKKwkJCQkgZG1hX2FkZHJfdCAqUGh5c2ljYWxBZGRyZXNzKTsKIAotdm9pZCBSVE1QX0FsbG9jYXRlRmlyc3RUeEJ1ZmZlcigKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVSU5UCUluZGV4LAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAotCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7Cit2b2lkIFJUTVBfQWxsb2NhdGVSeERlc2NNZW1vcnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgTGVuZ3RoLAorCQkJICAgICAgIElOIEJPT0xFQU4gQ2FjaGVkLAorCQkJICAgICAgIHZvaWQgKiogVmlydHVhbEFkZHJlc3MsCisJCQkgICAgICAgZG1hX2FkZHJfdCAqUGh5c2ljYWxBZGRyZXNzKTsKIAotdm9pZCBSVE1QX0FsbG9jYXRlTWdtdERlc2NNZW1vcnkoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCi0JT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKK3ZvaWQgUlRNUF9GcmVlRGVzY01lbW9yeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgdW5zaWduZWQgbG9uZyBMZW5ndGgsCisJCQkgdm9pZCAqVmlydHVhbEFkZHJlc3MsCisJCQkgZG1hX2FkZHJfdCBQaHlzaWNhbEFkZHJlc3MpOwogCi12b2lkIFJUTVBfQWxsb2NhdGVSeERlc2NNZW1vcnkoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCi0JT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKK3ZvaWQgKlJ0bXBPU05ldFBrdEFsbG9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgSU4gaW50IHNpemUpOwogCi1QTkRJU19QQUNLRVQgUlRNUF9BbGxvY2F0ZVJ4UGFja2V0QnVmZmVyKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAotCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7Cit2b2lkICpSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkgdW5zaWduZWQgbG9uZyBMZW5ndGgsCisJCQkJCSBJTiBCT09MRUFOIENhY2hlZCwKKwkJCQkJIHZvaWQgKiogVmlydHVhbEFkZHJlc3MsCisJCQkJCSBPVVQgZG1hX2FkZHJfdCAqCisJCQkJCSBQaHlzaWNhbEFkZHJlc3MpOwogCi1QTkRJU19QQUNLRVQgUlRNUF9BbGxvY2F0ZVR4UGFja2V0QnVmZmVyKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzKTsKK3ZvaWQgKlJUTVBfQWxsb2NhdGVUeFBhY2tldEJ1ZmZlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCSB1bnNpZ25lZCBsb25nIExlbmd0aCwKKwkJCQkJIElOIEJPT0xFQU4gQ2FjaGVkLAorCQkJCQkgdm9pZCAqKiBWaXJ0dWFsQWRkcmVzcyk7CiAKLVBORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlRnJhZ1BhY2tldEJ1ZmZlcigKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORwlMZW5ndGgpOwordm9pZCAqUlRNUF9BbGxvY2F0ZUZyYWdQYWNrZXRCdWZmZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkgICB1bnNpZ25lZCBsb25nIExlbmd0aCk7CiAKLXZvaWQgUlRNUF9RdWVyeVBhY2tldEluZm8oCi0JSU4gIFBORElTX1BBQ0tFVCBwUGFja2V0LAotCU9VVCBQQUNLRVRfSU5GTyAgKnBQYWNrZXRJbmZvLAotCU9VVCBQVUNIQVIJCSAqcFNyY0J1ZlZBLAotCU9VVAlVSU5UCQkgKnBTcmNCdWZMZW4pOwordm9pZCBSVE1QX1F1ZXJ5UGFja2V0SW5mbyh2b2lkICpwUGFja2V0LAorCQkJICBzdHJ1Y3QgcnRfcGFja2V0X2luZm8gKnBQYWNrZXRJbmZvLAorCQkJICB1OCAqKiBwU3JjQnVmVkEsIHUzMiAqIHBTcmNCdWZMZW4pOwogCi12b2lkIFJUTVBfUXVlcnlOZXh0UGFja2V0SW5mbygKLQlJTiAgUE5ESVNfUEFDS0VUICpwcFBhY2tldCwKLQlPVVQgUEFDS0VUX0lORk8gICpwUGFja2V0SW5mbywKLQlPVVQgUFVDSEFSCQkgKnBTcmNCdWZWQSwKLQlPVVQJVUlOVAkJICpwU3JjQnVmTGVuKTsKK3ZvaWQgUlRNUF9RdWVyeU5leHRQYWNrZXRJbmZvKHZvaWQgKiogcHBQYWNrZXQsCisJCQkgICAgICBzdHJ1Y3QgcnRfcGFja2V0X2luZm8gKnBQYWNrZXRJbmZvLAorCQkJICAgICAgdTggKiogcFNyY0J1ZlZBLCB1MzIgKiBwU3JjQnVmTGVuKTsKIAorQk9PTEVBTiBSVE1QX0ZpbGxUeEJsa0luZm8oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGspOwogCi1CT09MRUFOIFJUTVBfRmlsbFR4QmxrSW5mbygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBUWF9CTEsgKnBUeEJsayk7CitzdHJ1Y3QgcnRfcnRtcF9zZ19saXN0ICoKK3J0X2dldF9zZ19saXN0X2Zyb21fcGFja2V0KHZvaWQgKnBQYWNrZXQsIHN0cnVjdCBydF9ydG1wX3NnX2xpc3QgKnNnKTsKIAordm9pZCBhbm5vdW5jZV84MDJfM19wYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB2b2lkICpwUGFja2V0KTsKIAotUFJUTVBfU0NBVFRFUl9HQVRIRVJfTElTVAotcnRfZ2V0X3NnX2xpc3RfZnJvbV9wYWNrZXQoUE5ESVNfUEFDS0VUIHBQYWNrZXQsIFJUTVBfU0NBVFRFUl9HQVRIRVJfTElTVCAqc2cpOwordTMyIEJBX1Jlb3JkZXJfQU1TRFVfQW5ubm91bmNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdm9pZCAqcFBhY2tldCk7CiAKK3N0cnVjdCBuZXRfZGV2aWNlICpnZXRfbmV0ZGV2X2Zyb21fYnNzaWQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBGcm9tV2hpY2hCU1NJRCk7CiAKLSB2b2lkIGFubm91bmNlXzgwMl8zX3BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCk7Cit2b2lkICpkdXBsaWNhdGVfcGt0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHU4ICpwSGVhZGVyODAyXzMsCisJCQkgICB1MzIgSGRyTGVuLAorCQkJICAgdTggKnBEYXRhLAorCQkJICAgdW5zaWduZWQgbG9uZyBEYXRhU2l6ZSwgdTggRnJvbVdoaWNoQlNTSUQpOwogCit2b2lkICpkdXBsaWNhdGVfcGt0X3dpdGhfVEtJUF9NSUMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkgdm9pZCAqcE9sZFBrdCk7CiAKLVVJTlQgQkFfUmVvcmRlcl9BTVNEVV9Bbm5ub3VuY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpOwordm9pZCBiYV9mbHVzaF9yZW9yZGVyaW5nX3RpbWVvdXRfbXBkdXMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgICAgICBzdHJ1Y3QgcnRfYmFfcmVjX2VudHJ5ICpwQkFFbnRyeSwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBOb3czMik7CiAKLVBORVRfREVWIGdldF9uZXRkZXZfZnJvbV9ic3NpZCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKK3ZvaWQgQkFPcmlTZXNzaW9uU2V0VXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICAgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LAorCQkgICAgICAgdTggVElELAorCQkgICAgICAgdTE2IFRpbWVPdXQsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIERlbGF5VGltZSwgSU4gQk9PTEVBTiBpc0ZvcmNlZCk7CiAKLQotUE5ESVNfUEFDS0VUIGR1cGxpY2F0ZV9wa3QoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAotICAgIElOICBVSU5UICAgICAgICAgICAgSGRyTGVuLAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVMT05HCQkJRGF0YVNpemUsCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLQotUE5ESVNfUEFDS0VUIGR1cGxpY2F0ZV9wa3Rfd2l0aF9US0lQX01JQygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcE9sZFBrdCk7Ci0KLXZvaWQgYmFfZmx1c2hfcmVvcmRlcmluZ190aW1lb3V0X21wZHVzKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFBCQV9SRUNfRU5UUlkJcEJBRW50cnksCi0JSU4gVUxPTkcJCQlOb3czMik7Ci0KLQotVk9JRCBCQU9yaVNlc3Npb25TZXRVcCgKLQkJCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCQkJSU4gTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCi0JCQlJTiBVQ0hBUgkJCVRJRCwKLQkJCUlOIFVTSE9SVAkJCVRpbWVPdXQsCi0JCQlJTiBVTE9ORwkJCURlbGF5VGltZSwKLQkJCUlOIEJPT0xFQU4JCWlzRm9yY2VkKTsKLQotVk9JRCBCQVNlc3Npb25UZWFyRG93bkFMTCgKLQlJTiBPVVQJUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JCVVDSEFSIFdjaWQpOwordm9pZCBCQVNlc3Npb25UZWFyRG93bkFMTChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IFdjaWQpOwogCiBCT09MRUFOIE9TX05lZWRfQ2xvbmVfUGFja2V0KHZvaWQpOwogCit2b2lkIGJ1aWxkX3R4X3BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgdm9pZCAqcFBhY2tldCwKKwkJICAgICB1OCAqcEZyYW1lLCB1bnNpZ25lZCBsb25nIEZyYW1lTGVuKTsKIAotVk9JRCBidWlsZF90eF9wYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCi0JSU4JUFVDSEFSCXBGcmFtZSwKLQlJTglVTE9ORwlGcmFtZUxlbik7Cit2b2lkIEJBT3JpU2Vzc2lvblRlYXJEb3duKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgdTggV2NpZCwKKwkJCSAgdTggVElELAorCQkJICBJTiBCT09MRUFOIGJQYXNzaXZlLCBJTiBCT09MRUFOIGJGb3JjZVNlbmQpOwogCit2b2lkIEJBUmVjU2Vzc2lvblRlYXJEb3duKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgdTggV2NpZCwgdTggVElELCBJTiBCT09MRUFOIGJQYXNzaXZlKTsKIAotVk9JRCBCQU9yaVNlc3Npb25UZWFyRG93bigKLQlJTiBPVVQJUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JCVVDSEFSCQkJV2NpZCwKLQlJTgkJVUNIQVIJCQlUSUQsCi0JSU4JCUJPT0xFQU4JCQliUGFzc2l2ZSwKLQlJTgkJQk9PTEVBTgkJCWJGb3JjZVNlbmQpOworQk9PTEVBTiBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX2luaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBpbnQgbnVtKTsKK3ZvaWQgYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgQkFSZWNTZXNzaW9uVGVhckRvd24oCi0JSU4gT1VUCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCQlVQ0hBUgkJCVdjaWQsCi0JSU4JCVVDSEFSCQkJVElELAotCUlOCQlCT09MRUFOCQkJYlBhc3NpdmUpOworY2hhciAqcnN0cnRvayhjaGFyICpzLCBJTiBjb25zdCBjaGFyICpjdCk7CiAKLUJPT0xFQU4gYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9pbml0KFBSVE1QX0FEQVBURVIgcEFkLCBpbnQgbnVtKTsKLXZvaWQgYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKFBSVE1QX0FEQVBURVIgcEFkKTsKKy8qLy8vLy8vLy8gY29tbW9uIGlvY3RsIGZ1bmN0aW9ucyAvLy8vLy8vLy8vICovCitpbnQgU2V0Q29tbW9uSFQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotQk9PTEVBTiBydHN0cm1hY3RvaGV4KAotCUlOIGNoYXIgKnMxLAotCUlOIGNoYXIgKnMyKTsKK2ludCBXcGFDaGVja0VhcENvZGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgdTggKnBGcmFtZSwgdTE2IEZyYW1lTGVuLCB1MTYgT2ZmU2V0KTsKIAotQk9PTEVBTiBydHN0cmNhc2VjbXAoCi0JSU4gY2hhciAqczEsCi0JSU4gY2hhciAqczIpOwordm9pZCBXcGFTZW5kTWljRmFpbHVyZVRvV3BhU3VwcGxpY2FudChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgICAgSU4gQk9PTEVBTiBiVW5pY2FzdCk7CiAKLWNoYXIgKnJ0c3Ryc3RydW5jYXNlY21wKAotCUlOIGNoYXIgKnMxLAotCUlOIGNoYXIgKnMyKTsKK2ludCB3ZXh0X25vdGlmeV9ldmVudF9hc3NvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1jaGFyICAgICpydHN0cnN0cigKLQlJTgljb25zdCBjaGFyICogczEsCi0JSU4JY29uc3QgY2hhciAqIHMyKTsKK0JPT0xFQU4gU1RBUnhEb25lSW50ZXJydXB0SGFuZGxlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgSU4gQk9PTEVBTiBhcmdjKTsKIAotY2hhciAqcnN0cnRvaygKLQlJTiBjaGFyICogcywKLQlJTiBjb25zdCBjaGFyICogY3QpOworLyogQU1QRFUgcGFja2V0IGluZGljYXRpb24gKi8KK3ZvaWQgSW5kaWNhdGVfQU1QRFVfUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaywgdTggRnJvbVdoaWNoQlNTSUQpOwogCi1pbnQgcnRpbmV0X2F0b24oCi0JY29uc3QgY2hhciAqY3AsCi0JdW5zaWduZWQgaW50ICphZGRyKTsKKy8qIEFNU0RVIHBhY2tldCBpbmRpY2F0aW9uICovCit2b2lkIEluZGljYXRlX0FNU0RVX1BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICBzdHJ1Y3QgcnRfcnhfYmxrICpwUnhCbGssIHU4IEZyb21XaGljaEJTU0lEKTsKIAotLy8vLy8vLy8vLyBjb21tb24gaW9jdGwgZnVuY3Rpb25zIC8vLy8vLy8vLy8KLUlOVCBTZXRfRHJpdmVyVmVyc2lvbl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7CisvKiBOb3JtYWwgbGVnYWN5IFJ4IHBhY2tldCBpbmRpY2F0aW9uICovCit2b2lkIEluZGljYXRlX0xlZ2FjeV9QYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaywgdTggRnJvbVdoaWNoQlNTSUQpOwogCi1JTlQgU2V0X0NvdW50cnlSZWdpb25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwordm9pZCBJbmRpY2F0ZV9FQVBPTF9QYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrLCB1OCBGcm9tV2hpY2hCU1NJRCk7CiAKLUlOVCBTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKK3ZvaWQgdXBkYXRlX29zX3BhY2tldF9pbmZvKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaywgdTggRnJvbVdoaWNoQlNTSUQpOwogCi1JTlQgU2V0X1dpcmVsZXNzTW9kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Cit2b2lkIHdsYW5fODAyXzExX3RvXzgwMl8zX3BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaywKKwkJCQkgdTggKnBIZWFkZXI4MDJfMywKKwkJCQkgdTggRnJvbVdoaWNoQlNTSUQpOwogCi1JTlQgU2V0X0NoYW5uZWxfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1JTlQJU2V0X1Nob3J0U2xvdF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVAlTZXRfVHhQb3dlcl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVCBTZXRfQkdQcm90ZWN0aW9uX1Byb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiAgUFVDSEFSCQkJYXJnKTsKLQotSU5UIFNldF9UeFByZWFtYmxlX1Byb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiAgUFVDSEFSCQkJYXJnKTsKLQotSU5UIFNldF9SVFNUaHJlc2hvbGRfUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOICBQVUNIQVIJCQlhcmcpOwotCi1JTlQgU2V0X0ZyYWdUaHJlc2hvbGRfUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOICBQVUNIQVIJCQlhcmcpOwotCi1JTlQgU2V0X1R4QnVyc3RfUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOICBQVUNIQVIJCQlhcmcpOwotCi0jaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAotSU5UCVNldF9Qa3RBZ2dyZWdhdGVfUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOICBQVUNIQVIJCQlhcmcpOwotI2VuZGlmCi0KLUlOVAlTZXRfSUVFRTgwMjExSF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLSNpZmRlZiBEQkcKLUlOVAlTZXRfRGVidWdfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotI2VuZGlmCi0KLUlOVAlTaG93X0Rlc2NJbmZvX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UCVNldF9SZXNldFN0YXRDb3VudGVyX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UCVNldF9CQVNldHVwX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UCVNldF9CQURlY2xpbmVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1JTlQJU2V0X0JBT3JpVGVhckRvd25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1JTlQJU2V0X0JBUmVjVGVhckRvd25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1JTlQJU2V0X0h0QndfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1JTlQJU2V0X0h0TWNzX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UCVNldF9IdEdpX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UCVNldF9IdE9wTW9kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRTdGJjX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UCVNldF9IdEh0Y19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRFeHRjaGFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1JTlQJU2V0X0h0TXBkdURlbnNpdHlfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1JTlQJU2V0X0h0QmFXaW5TaXplX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UCVNldF9IdFJkZ19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRMaW5rQWRhcHRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1JTlQJU2V0X0h0QW1zZHVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1JTlQJU2V0X0h0QXV0b0JhX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UCVNldF9IdFByb3RlY3RfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1JTlQJU2V0X0h0TWltb1BzX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotCi1JTlQJU2V0X0ZvcmNlU2hvcnRHSV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVAlTZXRfRm9yY2VHRl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVAlTZXRDb21tb25IVCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLUlOVAlTZXRfU2VuZFBTTVBBY3Rpb25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1JTlQJU2V0X0h0TUlNT1BTbW9kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLQotSU5UCVNldF9IdFR4QkFTaXplX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UCSAgICBXcGFDaGVja0VhcENvZGUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICAJcEFkLAotCUlOICBQVUNIQVIJCQkJcEZyYW1lLAotCUlOICBVU0hPUlQJCQkJRnJhbWVMZW4sCi0JSU4gIFVTSE9SVAkJCQlPZmZTZXQpOwotCi1WT0lEICAgIFdwYVNlbmRNaWNGYWlsdXJlVG9XcGFTdXBwbGljYW50KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKLSAgICBJTiAgQk9PTEVBTiAgICAgICAgICAgICBiVW5pY2FzdCk7Ci0KLWludCB3ZXh0X25vdGlmeV9ldmVudF9hc3NvYygKLQlJTiAgUlRNUF9BREFQVEVSICpwQWQpOwotCi1CT09MRUFOIFNUQVJ4RG9uZUludGVycnVwdEhhbmRsZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglCT09MRUFOCQkJYXJnYyk7Ci0KLS8vIEFNUERVIHBhY2tldCBpbmRpY2F0aW9uCi1WT0lEIEluZGljYXRlX0FNUERVX1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotCi0vLyBBTVNEVSBwYWNrZXQgaW5kaWNhdGlvbgotVk9JRCBJbmRpY2F0ZV9BTVNEVV9QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKLQotLy8gTm9ybWFsIGxlZ2FjeSBSeCBwYWNrZXQgaW5kaWNhdGlvbgotVk9JRCBJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLVZPSUQgSW5kaWNhdGVfRUFQT0xfUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLXZvaWQgIHVwZGF0ZV9vc19wYWNrZXRfaW5mbygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotCi12b2lkIHdsYW5fODAyXzExX3RvXzgwMl8zX3BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKLQlJTiAgVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLVVJTlQgZGVhZ2dyZWdhdGVfQU1TRFVfYW5ub3VuY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JUE5ESVNfUEFDS0VUCQlwUGFja2V0LAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVMT05HCQkJRGF0YVNpemUpOwotCi0vLyByZW1vdmUgTExDIGFuZCBnZXQgODAyXzMgSGVhZGVyCisvKiByZW1vdmUgTExDIGFuZCBnZXQgODAyXzMgSGVhZGVyICovCiAjZGVmaW5lICBSVE1QXzgwMl8xMV9SRU1PVkVfTExDX0FORF9DT05WRVJUX1RPXzgwMl8zKF9wUnhCbGssIF9wSGVhZGVyODAyXzMpCVwKIHsJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQlQVUNIQVIgX3BSZW1vdmVkTExDU05BUCA9IE5VTEwsIF9wREEsIF9wU0E7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXU4ICpfcFJlbW92ZWRMTENTTkFQID0gTlVMTCwgKl9wREEsICpfcFNBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJCQkJCQkJCQkJCQkJCQkJCQkJXAogCWlmIChSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIGZSWF9NRVNIKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJX3BEQSA9IF9wUnhCbGstPnBIZWFkZXItPkFkZHIzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlfcFNBID0gKFBVQ0hBUilfcFJ4QmxrLT5wSGVhZGVyICsgc2l6ZW9mKEhFQURFUl84MDJfMTEpOyAgICAgICAgICAgICAgICBcCisJCV9wU0EgPSAodTggKilfcFJ4QmxrLT5wSGVhZGVyICsgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKTsgICAgICAgICAgICAgICAgXAogCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNTU2NSwxMzMgKzM3NDIsMTIyIEBACiAJCV9wUnhCbGstPkRhdGFTaXplLCBfcFJlbW92ZWRMTENTTkFQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0KIAotVk9JRCBTdGFfQW5ub3VuY2Vfb3JfRm9yd2FyZF84MDJfM19QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Cit2b2lkIFN0YV9Bbm5vdW5jZV9vcl9Gb3J3YXJkXzgwMl8zX1BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCSAgdm9pZCAqcFBhY2tldCwKKwkJCQkJICB1OCBGcm9tV2hpY2hCU1NJRCk7CiAKICNkZWZpbmUgQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQoX3BBZCwgX3BQYWNrZXQsIF9Gcm9tV2hpY2hCU1MpXAogCQkJU3RhX0Fubm91bmNlX29yX0ZvcndhcmRfODAyXzNfUGFja2V0KF9wQWQsIF9wUGFja2V0LCBfRnJvbVdoaWNoQlNTKTsKLQkJCS8vYW5ub3VuY2VfODAyXzNfcGFja2V0KF9wQWQsIF9wUGFja2V0KTsKKwkJCS8qYW5ub3VuY2VfODAyXzNfcGFja2V0KF9wQWQsIF9wUGFja2V0KTsgKi8KIAotUE5ESVNfUEFDS0VUIER1cGxpY2F0ZVBhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKK3ZvaWQgKkR1cGxpY2F0ZVBhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHZvaWQgKnBQYWNrZXQsIHU4IEZyb21XaGljaEJTU0lEKTsKIAordm9pZCAqQ2xvbmVQYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHZvaWQgKnBQYWNrZXQsCisJCQkgdTggKnBEYXRhLCB1bnNpZ25lZCBsb25nIERhdGFTaXplKTsKIAotUE5ESVNfUEFDS0VUIENsb25lUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVMT05HCQkJRGF0YVNpemUpOworLyogTm9ybWFsLCBBTVBEVSBvciBBTVNEVSAqLwordm9pZCBDbW1SeG5vblJhbGlua0ZyYW1lSW5kaWNhdGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSBzdHJ1Y3QgcnRfcnhfYmxrICpwUnhCbGssIHU4IEZyb21XaGljaEJTU0lEKTsKIAordm9pZCBDbW1SeFJhbGlua0ZyYW1lSW5kaWNhdGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LAorCQkJICAgICAgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrLCB1OCBGcm9tV2hpY2hCU1NJRCk7CiAKLS8vIE5vcm1hbCwgQU1QRFUgb3IgQU1TRFUKLVZPSUQgQ21tUnhub25SYWxpbmtGcmFtZUluZGljYXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Cit2b2lkIFVwZGF0ZV9Sc3NpX1NhbXBsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQlzdHJ1Y3QgcnRfcnNzaV9zYW1wbGUgKnBSc3NpLCBzdHJ1Y3QgcnRfcnh3aSAqIHBSeFdJKTsKIAotVk9JRCBDbW1SeFJhbGlua0ZyYW1lSW5kaWNhdGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKK3ZvaWQgKkdldFBhY2tldEZyb21SeFJpbmcoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSBPVVQgUFJUMjhYWF9SWERfU1RSVUMgcFNhdmVSeEQsCisJCQkJIE9VVCBCT09MRUFOICogcGJSZXNjaGVkdWxlLAorCQkJCSBJTiB1MzIgKiBwUnhQZW5kaW5nKTsKIAotVk9JRCBVcGRhdGVfUnNzaV9TYW1wbGUoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gUlNTSV9TQU1QTEUJCSpwUnNzaSwKLQlJTiBQUlhXSV9TVFJVQwkJcFJ4V0kpOwordm9pZCAqUlRNUERlRnJhZ21lbnREYXRhRnJhbWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfcnhfYmxrICpwUnhCbGspOwogCi1QTkRJU19QQUNLRVQgUlRNUERlRnJhZ21lbnREYXRhRnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsayk7Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIGVudW0gewotCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm0JCT0gMHgwMDAwMDA0NCwKLQlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2hvc3R0aW1lCT0gMHgwMDAxMDA0NCwKLQlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX21hY3RpbWUJPSAweDAwMDIwMDQ0LAotCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fY2hhbm5lbAk9IDB4MDAwMzAwNDQsCi0JRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yc3NpCQk9IDB4MDAwNDAwNDQsCi0JRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zcQkJPSAweDAwMDUwMDQ0LAotCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fc2lnbmFsCT0gMHgwMDA2MDA0NCwKLQlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX25vaXNlCQk9IDB4MDAwNzAwNDQsCi0JRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yYXRlCQk9IDB4MDAwODAwNDQsCi0JRElEbXNnX2xueGluZF93bGFuc25pZmZybV9pc3R4CQk9IDB4MDAwOTAwNDQsCi0JRElEbXNnX2xueGluZF93bGFuc25pZmZybV9mcm1sZW4JPSAweDAwMEEwMDQ0CisJRElEbXNnX2xueGluZF93bGFuc25pZmZybSA9IDB4MDAwMDAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9ob3N0dGltZSA9IDB4MDAwMTAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9tYWN0aW1lID0gMHgwMDAyMDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2NoYW5uZWwgPSAweDAwMDMwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fcnNzaSA9IDB4MDAwNDAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zcSA9IDB4MDAwNTAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zaWduYWwgPSAweDAwMDYwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fbm9pc2UgPSAweDAwMDcwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fcmF0ZSA9IDB4MDAwODAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9pc3R4ID0gMHgwMDA5MDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2ZybWxlbiA9IDB4MDAwQTAwNDQKIH07CiBlbnVtIHsKLQlQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX25vX3ZhbHVlCT0gMHgwMAorCVA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfbm9fdmFsdWUgPSAweDAwCiB9OwogZW51bSB7Ci0JUDgwMjExRU5VTV90cnV0aF9mYWxzZQkJCT0gMHgwMCwKLQlQODAyMTFFTlVNX3RydXRoX3RydWUJCQk9IDB4MDEKKwlQODAyMTFFTlVNX3RydXRoX2ZhbHNlID0gMHgwMCwKKwlQODAyMTFFTlVNX3RydXRoX3RydWUgPSAweDAxCiB9OwogCiAvKiBEZWZpbml0aW9uIGZyb20gbWFkd2lmaSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgICAgICBVSU5UMzIgZGlkOwotICAgICAgICBVSU5UMTYgc3RhdHVzOwotICAgICAgICBVSU5UMTYgbGVuOwotICAgICAgICBVSU5UMzIgZGF0YTsKLX0gcDgwMjExaXRlbV91aW50MzJfdDsKK3N0cnVjdCBydF9wODAyMTFpdGVtX3VpbnQzMiB7CisJdTMyIGRpZDsKKwl1MTYgc3RhdHVzOworCXUxNiBsZW47CisJdTMyIGRhdGE7Cit9OwogCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgICAgIFVJTlQzMiBtc2djb2RlOwotICAgICAgICBVSU5UMzIgbXNnbGVuOworc3RydWN0IHJ0X3dsYW5fbmdfcHJpc20yX2hlYWRlciB7CisJdTMyIG1zZ2NvZGU7CisJdTMyIG1zZ2xlbjsKICNkZWZpbmUgV0xBTl9ERVZOQU1FTEVOX01BWCAxNgotICAgICAgICBVSU5UOCBkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOwotICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IGhvc3R0aW1lOwotICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IG1hY3RpbWU7Ci0gICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgY2hhbm5lbDsKLSAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCByc3NpOwotICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IHNxOwotICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IHNpZ25hbDsKLSAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBub2lzZTsKLSAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCByYXRlOwotICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IGlzdHg7Ci0gICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgZnJtbGVuOwotfSB3bGFuX25nX3ByaXNtMl9oZWFkZXI7CisJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKKwlzdHJ1Y3QgcnRfcDgwMjExaXRlbV91aW50MzIgaG9zdHRpbWU7CisJc3RydWN0IHJ0X3A4MDIxMWl0ZW1fdWludDMyIG1hY3RpbWU7CisJc3RydWN0IHJ0X3A4MDIxMWl0ZW1fdWludDMyIGNoYW5uZWw7CisJc3RydWN0IHJ0X3A4MDIxMWl0ZW1fdWludDMyIHJzc2k7CisJc3RydWN0IHJ0X3A4MDIxMWl0ZW1fdWludDMyIHNxOworCXN0cnVjdCBydF9wODAyMTFpdGVtX3VpbnQzMiBzaWduYWw7CisJc3RydWN0IHJ0X3A4MDIxMWl0ZW1fdWludDMyIG5vaXNlOworCXN0cnVjdCBydF9wODAyMTFpdGVtX3VpbnQzMiByYXRlOworCXN0cnVjdCBydF9wODAyMTFpdGVtX3VpbnQzMiBpc3R4OworCXN0cnVjdCBydF9wODAyMTFpdGVtX3VpbnQzMiBmcm1sZW47Cit9OwogCiAvKiBUaGUgcmFkaW8gY2FwdHVyZSBoZWFkZXIgcHJlY2VkZXMgdGhlIDgwMi4xMSBoZWFkZXIuICovCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX2llZWU4MDIxMV9yYWRpb3RhcF9oZWFkZXIgewotICAgIFVJTlQ4CWl0X3ZlcnNpb247CS8qIFZlcnNpb24gMC4gT25seSBpbmNyZWFzZXMKK3N0cnVjdCBQQUNLRUQgcnRfaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciB7CisJdTggaXRfdmVyc2lvbjsJLyogVmVyc2lvbiAwLiBPbmx5IGluY3JlYXNlcwogCQkJCSAqIGZvciBkcmFzdGljIGNoYW5nZXMsCiAJCQkJICogaW50cm9kdWN0aW9uIG9mIGNvbXBhdGlibGUKIAkJCQkgKiBuZXcgZmllbGRzIGRvZXMgbm90IGNvdW50LgogCQkJCSAqLwotICAgIFVJTlQ4CWl0X3BhZDsKLSAgICBVSU5UMTYgICAgIGl0X2xlbjsgICAgICAgICAvKiBsZW5ndGggb2YgdGhlIHdob2xlCisJdTggaXRfcGFkOworCXUxNiBpdF9sZW47CQkvKiBsZW5ndGggb2YgdGhlIHdob2xlCiAJCQkJICogaGVhZGVyIGluIGJ5dGVzLCBpbmNsdWRpbmcKIAkJCQkgKiBpdF92ZXJzaW9uLCBpdF9wYWQsCiAJCQkJICogaXRfbGVuLCBhbmQgZGF0YSBmaWVsZHMuCiAJCQkJICovCi0gICAgVUlOVDMyICAgaXRfcHJlc2VudDsJLyogQSBiaXRtYXAgdGVsbGluZyB3aGljaAotCQkJCQkgKiBmaWVsZHMgYXJlIHByZXNlbnQuIFNldCBiaXQgMzEKLQkJCQkJICogKDB4ODAwMDAwMDApIHRvIGV4dGVuZCB0aGUKLQkJCQkJICogYml0bWFwIGJ5IGFub3RoZXIgMzIgYml0cy4KLQkJCQkJICogQWRkaXRpb25hbCBleHRlbnNpb25zIGFyZSBtYWRlCi0JCQkJCSAqIGJ5IHNldHRpbmcgYml0IDMxLgotCQkJCQkgKi8KLX1pZWVlODAyMTFfcmFkaW90YXBfaGVhZGVyIDsKKwl1MzIgaXRfcHJlc2VudDsJLyogQSBiaXRtYXAgdGVsbGluZyB3aGljaAorCQkJCSAqIGZpZWxkcyBhcmUgcHJlc2VudC4gU2V0IGJpdCAzMQorCQkJCSAqICgweDgwMDAwMDAwKSB0byBleHRlbmQgdGhlCisJCQkJICogYml0bWFwIGJ5IGFub3RoZXIgMzIgYml0cy4KKwkJCQkgKiBBZGRpdGlvbmFsIGV4dGVuc2lvbnMgYXJlIG1hZGUKKwkJCQkgKiBieSBzZXR0aW5nIGJpdCAzMS4KKwkJCQkgKi8KK307CiAKIGVudW0gaWVlZTgwMjExX3JhZGlvdGFwX3R5cGUgewotICAgIElFRUU4MDIxMV9SQURJT1RBUF9UU0ZUID0gMCwKLSAgICBJRUVFODAyMTFfUkFESU9UQVBfRkxBR1MgPSAxLAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9SQVRFID0gMiwKLSAgICBJRUVFODAyMTFfUkFESU9UQVBfQ0hBTk5FTCA9IDMsCi0gICAgSUVFRTgwMjExX1JBRElPVEFQX0ZIU1MgPSA0LAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQk1fQU5UU0lHTkFMID0gNSwKLSAgICBJRUVFODAyMTFfUkFESU9UQVBfREJNX0FOVE5PSVNFID0gNiwKLSAgICBJRUVFODAyMTFfUkFESU9UQVBfTE9DS19RVUFMSVRZID0gNywKLSAgICBJRUVFODAyMTFfUkFESU9UQVBfVFhfQVRURU5VQVRJT04gPSA4LAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQl9UWF9BVFRFTlVBVElPTiA9IDksCi0gICAgSUVFRTgwMjExX1JBRElPVEFQX0RCTV9UWF9QT1dFUiA9IDEwLAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9BTlRFTk5BID0gMTEsCi0gICAgSUVFRTgwMjExX1JBRElPVEFQX0RCX0FOVFNJR05BTCA9IDEyLAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQl9BTlROT0lTRSA9IDEzCisJSUVFRTgwMjExX1JBRElPVEFQX1RTRlQgPSAwLAorCUlFRUU4MDIxMV9SQURJT1RBUF9GTEFHUyA9IDEsCisJSUVFRTgwMjExX1JBRElPVEFQX1JBVEUgPSAyLAorCUlFRUU4MDIxMV9SQURJT1RBUF9DSEFOTkVMID0gMywKKwlJRUVFODAyMTFfUkFESU9UQVBfRkhTUyA9IDQsCisJSUVFRTgwMjExX1JBRElPVEFQX0RCTV9BTlRTSUdOQUwgPSA1LAorCUlFRUU4MDIxMV9SQURJT1RBUF9EQk1fQU5UTk9JU0UgPSA2LAorCUlFRUU4MDIxMV9SQURJT1RBUF9MT0NLX1FVQUxJVFkgPSA3LAorCUlFRUU4MDIxMV9SQURJT1RBUF9UWF9BVFRFTlVBVElPTiA9IDgsCisJSUVFRTgwMjExX1JBRElPVEFQX0RCX1RYX0FUVEVOVUFUSU9OID0gOSwKKwlJRUVFODAyMTFfUkFESU9UQVBfREJNX1RYX1BPV0VSID0gMTAsCisJSUVFRTgwMjExX1JBRElPVEFQX0FOVEVOTkEgPSAxMSwKKwlJRUVFODAyMTFfUkFESU9UQVBfREJfQU5UU0lHTkFMID0gMTIsCisJSUVFRTgwMjExX1JBRElPVEFQX0RCX0FOVE5PSVNFID0gMTMKIH07CiAKICNkZWZpbmUgV0xBTl9SQURJT1RBUF9QUkVTRU5UICgJCQlcCkBAIC01NzAwLDczNyArMzg2Niw0OTEgQEAKIAkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfUkFURSkgIHwgCVwKIAkgMCkKIAotdHlwZWRlZiBzdHJ1Y3QgX3dsYW5fcmFkaW90YXBfaGVhZGVyIHsKLQlpZWVlODAyMTFfcmFkaW90YXBfaGVhZGVyIHd0X2loZHI7Ci0JSU5UNjQgd3RfdHNmdDsKLQlVSU5UOCB3dF9mbGFnczsKLQlVSU5UOCB3dF9yYXRlOwotfSB3bGFuX3JhZGlvdGFwX2hlYWRlcjsKK3N0cnVjdCBydF93bGFuX3JhZGlvdGFwX2hlYWRlciB7CisJc3RydWN0IHJ0X2llZWU4MDIxMV9yYWRpb3RhcF9oZWFkZXIgd3RfaWhkcjsKKwlsb25nIGxvbmcgd3RfdHNmdDsKKwl1OCB3dF9mbGFnczsKKwl1OCB3dF9yYXRlOworfTsKIC8qIERlZmluaXRpb24gZnJvbSBtYWR3aWZpICovCiAKLXZvaWQgc2VuZF9tb25pdG9yX3BhY2tldHMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsayk7Cit2b2lkIHNlbmRfbW9uaXRvcl9wYWNrZXRzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrKTsKIAotLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIHF1ZXJ5IC9wcm9jCi1zdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cygKLSAgICBJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7Cit2b2lkIFJUTVBTZXREZXNpcmVkUmF0ZXMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIsIGxvbmcgUmF0ZXMpOwogCi1WT0lEICAgIFJUTVBTZXREZXNpcmVkUmF0ZXMoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgTE9ORyAgICAgICAgICAgIFJhdGVzKTsKK2ludCBTZXRfRml4ZWRUeE1vZGVfUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIGNoYXIgKmFyZyk7CiAKLUlOVAlTZXRfRml4ZWRUeE1vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOworQk9PTEVBTiBSVDI4WFhDaGlwc2V0Q2hlY2soSU4gdm9pZCAqX2Rldl9wKTsKIAotc3RhdGljIGlubGluZSBjaGFyKiBHZXRQaHlNb2RlKAotCWludCBNb2RlKQotewotCXN3aXRjaChNb2RlKQotCXsKLQkJY2FzZSBNT0RFX0NDSzoKLQkJCXJldHVybiAiQ0NLIjsKK3ZvaWQgUlQyOFhYRE1BRGlzYWJsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi0JCWNhc2UgTU9ERV9PRkRNOgotCQkJcmV0dXJuICJPRkRNIjsKLQkJY2FzZSBNT0RFX0hUTUlYOgotCQkJcmV0dXJuICJIVE1JWCI7Cit2b2lkIFJUMjhYWERNQUVuYWJsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi0JCWNhc2UgTU9ERV9IVEdSRUVORklFTEQ6Ci0JCQlyZXR1cm4gIkdSRUVOIjsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAiTi9BIjsKLQl9Ci19Cit2b2lkIFJUMjh4eF9VcGRhdGVCZWFjb25Ub0FzaWMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgIGludCBhcGlkeCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIEJlYWNvbkxlbiwgdW5zaWduZWQgbG9uZyBVcGRhdGVQb3MpOwogCitpbnQgcnQyOHh4X2luaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQljaGFyICpwRGVmYXVsdE1hYywgY2hhciAqcEhvc3ROYW1lKTsKIAotc3RhdGljIGlubGluZSBjaGFyKiBHZXRCVygKLQlpbnQgQlcpCi17Ci0Jc3dpdGNoKEJXKQotCXsKLQkJY2FzZSBCV18xMDoKLQkJCXJldHVybiAiMTBNIjsKK2ludCBSdG1wTmV0VGFza0luaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotCQljYXNlIEJXXzIwOgotCQkJcmV0dXJuICIyME0iOwotCQljYXNlIEJXXzQwOgotCQkJcmV0dXJuICI0ME0iOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuICJOL0EiOwotCX0KLX0KK3ZvaWQgUnRtcE5ldFRhc2tFeGl0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKK2ludCBSdG1wTWdtdFRhc2tJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgUlQyOHh4VGhyZWFkVGVybWluYXRlKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKLQotQk9PTEVBTiBSVDI4WFhDaGlwc2V0Q2hlY2soCi0JSU4gdm9pZCAqX2Rldl9wKTsKLQotQk9PTEVBTiBSVDI4WFhOZXREZXZJbml0KAotCUlOIHZvaWQgCQkJCSpfZGV2X3AsCi0JSU4gc3RydWN0ICBuZXRfZGV2aWNlCSpuZXRfZGV2LAotCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQpOwotCi1CT09MRUFOIFJUMjhYWFByb2JlUG9zdENvbmZpZygKLQlJTiB2b2lkIAkJCQkqX2Rldl9wLAotCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQsCi0JSU4gSU5UMzIJCQkJYXJnYyk7Ci0KLVZPSUQgUlQyOFhYRE1BRGlzYWJsZSgKLQlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKTsKLQotVk9JRCBSVDI4WFhETUFFbmFibGUoCi0JSU4gUlRNUF9BREFQVEVSIAkJKnBBZCk7Ci0KLVZPSUQgUlQyOHh4X1VwZGF0ZUJlYWNvblRvQXNpYygKLQlJTiBSVE1QX0FEQVBURVIgKiBwQWQsCi0JSU4gSU5UIGFwaWR4LAotCUlOIFVMT05HIEJlYWNvbkxlbiwKLQlJTiBVTE9ORyBVcGRhdGVQb3MpOwotCi1JTlQgcnQyOHh4X3N0YV9pb2N0bCgKLQlJTglzdHJ1Y3QgbmV0X2RldmljZQkqbmV0X2RldiwKLQlJTglPVVQJc3RydWN0IGlmcmVxCSpycSwKLQlJTglJTlQJCQljbWQpOwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1QTkRJU19QQUNLRVQgR2V0UGFja2V0RnJvbVJ4UmluZygKLQlJTgkJUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCQlQUlQyOFhYX1JYRF9TVFJVQwlwU2F2ZVJ4RCwKLQlPVVQJCUJPT0xFQU4JCQkqcGJSZXNjaGVkdWxlLAotCUlOIE9VVAlVSU5UMzIJCQkqcFJ4UGVuZGluZyk7Ci0KLQotdm9pZCBraWxsX3RocmVhZF90YXNrKFBSVE1QX0FEQVBURVIgcEFkKTsKK3ZvaWQgUnRtcE1nbXRUYXNrRXhpdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCiB2b2lkIHRidHRfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwogCi0jaWZkZWYgUlQyODYwCi0vLwotLy8gRnVuY3Rpb24gUHJvdG90eXBlIGluIGNtbV9kYXRhXzI4NjAuYwotLy8KLVVTSE9SVCBSdG1wUENJX1dyaXRlVHhSZXNvdXJjZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCUJPT0xFQU4JCQliSXNMYXN0LAotCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcik7CitzdHJ1Y3QgbmV0X2RldmljZSAqUnRtcFBoeU5ldERldkluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgc3RydWN0IHJ0X3J0bXBfb3NfbmV0ZGV2X29wX2hvb2sgKnBOZXRIb29rKTsKIAotVVNIT1JUIFJ0bXBQQ0lfV3JpdGVTaW5nbGVUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JQk9PTEVBTgkJCWJJc0xhc3QsCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKK0JPT0xFQU4gUnRtcFBoeU5ldERldkV4aXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CiAKLVVTSE9SVCBSdG1wUENJX1dyaXRlTXVsdGlUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JVUNIQVIJCQlmcmFtZU51bSwKLQlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpOworaW50IFJ0bXBSYURldkN0cmxJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgSU4gUlRNUF9JTkZfVFlQRSBpbmZUeXBlKTsKIAotVVNIT1JUCVJ0bXBQQ0lfV3JpdGVGcmFnVHhSZXNvdXJjZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCVVDSEFSCQkJZnJhZ051bSwKLQlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpOworQk9PTEVBTiBSdG1wUmFEZXZDdHJsRXhpdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1VU0hPUlQgUnRtcFBDSV9Xcml0ZVN1YlR4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglCT09MRUFOCQkJYklzTGFzdCwKLQlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpOworI2lmZGVmIFJUTVBfTUFDX1BDSQorLyogKi8KKy8qIEZ1bmN0aW9uIFByb3RvdHlwZSBpbiBjbW1fZGF0YV9wY2kuYyAqLworLyogKi8KK3UxNiBSdG1wUENJX1dyaXRlVHhSZXNvdXJjZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrLAorCQkJICAgICAgIElOIEJPT0xFQU4gYklzTGFzdCwgdTE2ICogRnJlZU51bWJlcik7CiAKLVZPSUQgUnRtcFBDSV9GaW5hbFdyaXRlVHhSZXNvdXJjZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCVVTSE9SVAkJCXRvdGFsTVBEVVNpemUsCi0JSU4JVVNIT1JUCQkJRmlyc3RUeElkeCk7Cit1MTYgUnRtcFBDSV9Xcml0ZVNpbmdsZVR4UmVzb3VyY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgICAgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrLAorCQkJCSAgICAgSU4gQk9PTEVBTiBiSXNMYXN0LAorCQkJCSAgICAgdTE2ICogRnJlZU51bWJlcik7CiAKLVZPSUQgUnRtcFBDSURhdGFMYXN0VHhJZHgoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlRdWVJZHgsCi0JSU4JVVNIT1JUCQkJTGFzdFR4SWR4KTsKK3UxNiBSdG1wUENJX1dyaXRlTXVsdGlUeFJlc291cmNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrLAorCQkJCSAgICB1OCBmcmFtZU51bSwgdTE2ICogRnJlZU51bWJlcik7CiAKLVZPSUQgUnRtcFBDSURhdGFLaWNrT3V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JVUNIQVIJCQlRdWVJZHgpOwordTE2IFJ0bXBQQ0lfV3JpdGVGcmFnVHhSZXNvdXJjZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrLAorCQkJCSAgIHU4IGZyYWdOdW0sIHUxNiAqIEZyZWVOdW1iZXIpOwogCit1MTYgUnRtcFBDSV9Xcml0ZVN1YlR4UmVzb3VyY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrLAorCQkJCSAgSU4gQk9PTEVBTiBiSXNMYXN0LCB1MTYgKiBGcmVlTnVtYmVyKTsKIAotaW50IFJ0bXBQQ0lNZ210S2lja091dCgKLQlJTiBSVE1QX0FEQVBURVIgCSpwQWQsCi0JSU4gVUNIQVIgCQkJUXVlSWR4LAotCUlOIFBORElTX1BBQ0tFVAkJcFBhY2tldCwKLQlJTiBQVUNIQVIJCQlwU3JjQnVmVkEsCi0JSU4gVUlOVCAJCQlTcmNCdWZMZW4pOwordm9pZCBSdG1wUENJX0ZpbmFsV3JpdGVUeFJlc291cmNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaywKKwkJCQkgIHUxNiB0b3RhbE1QRFVTaXplLAorCQkJCSAgdTE2IEZpcnN0VHhJZHgpOwogCit2b2lkIFJ0bXBQQ0lEYXRhTGFzdFR4SWR4KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgdTggUXVlSWR4LCB1MTYgTGFzdFR4SWR4KTsKIAotTkRJU19TVEFUVVMgUlRNUENoZWNrUnhFcnJvcigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUEhFQURFUl84MDJfMTEgIHBIZWFkZXIsCi0JSU4JUFJYV0lfU1RSVUMJcFJ4V0ksCi0JSU4gIFBSVDI4WFhfUlhEX1NUUlVDICAgICAgcFJ4RCk7Cit2b2lkIFJ0bXBQQ0lEYXRhS2lja091dChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQlzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssIHU4IFF1ZUlkeCk7CiAKLVZPSUQgUlRNUEluaXRQQ0llTGlua0N0cmxWYWx1ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7CitpbnQgUnRtcFBDSU1nbXRLaWNrT3V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIHU4IFF1ZUlkeCwKKwkJICAgICAgIHZvaWQgKnBQYWNrZXQsCisJCSAgICAgICB1OCAqcFNyY0J1ZlZBLCB1MzIgU3JjQnVmTGVuKTsKIAotVk9JRCBSVE1QRmluZEhvc3RQQ0lEZXYoCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQpOworaW50IFJUTVBDaGVja1J4RXJyb3Ioc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICBzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBIZWFkZXIsCisJCQkgICAgIHN0cnVjdCBydF9yeHdpICogcFJ4V0ksIElOIFBSVDI4WFhfUlhEX1NUUlVDIHBSeEQpOwogCi1WT0lEIFJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gICBVQ0hBUgkJTGV2ZWwpOworQk9PTEVBTiBSVDI4eHhQY2lBc2ljUmFkaW9PZmYoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgdTggTGV2ZWwsIHUxNiBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKIAotVk9JRCBSVE1QUENJZUxpbmtDdHJsU2V0dGluZygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiAJVVNIT1JUCQlNYXgpOworQk9PTEVBTiBSVDI4eHhQY2lBc2ljUmFkaW9PbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IExldmVsKTsKIAotVk9JRCBSVDI4eHhQY2lBc2ljUmFkaW9PZmYoCi0JSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JSU4gVUNIQVIgICAgICAgICAgICBMZXZlbCwKLQlJTiBVU0hPUlQgICAgICAgICAgIFRidHROdW1Ub05leHRXYWtlVXApOwordm9pZCBSVE1QSW5pdFBDSWVMaW5rQ3RybFZhbHVlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLUJPT0xFQU4gUlQyOHh4UGNpQXNpY1JhZGlvT24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgICAgIExldmVsKTsKK3ZvaWQgUlRNUEZpbmRIb3N0UENJRGV2KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgUlQyOHh4UGNpU3RhQXNpY0ZvcmNlV2FrZXVwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSICAgIAkgTGV2ZWwpOwordm9pZCBSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggTGV2ZWwpOwogCi1WT0lEIFJUMjh4eFBjaVN0YUFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKK3ZvaWQgUlRNUFBDSWVMaW5rQ3RybFNldHRpbmcoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1MTYgTWF4KTsKIAotVk9JRCBQc1BvbGxXYWtlRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwordm9pZCBSVE1QcnQzeFNldFBDSWVQb3dlckxpbmtDdHJsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgIFJhZGlvT25FeGVjKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Cit2b2lkIFBzUG9sbFdha2VFeGVjKHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJICAgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJICAgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKTsKIAotVk9JRCBSVDI4eHhQY2lNbG1lUmFkaW9PbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Cit2b2lkIFJhZGlvT25FeGVjKHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKTsKIAotVk9JRCBSVDI4eHhQY2lNbG1lUmFkaW9PRkYoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotI2VuZGlmIC8qIFJUMjg2MCAqLwordm9pZCBSVDI4eHhQY2lTdGFBc2ljRm9yY2VXYWtldXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBCT09MRUFOIGJGcm9tVHgpOwogCi1WT0lEIEFzaWNUdXJuT2ZmUkZDbGsoCi0JSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JSU4JVUNIQVIgICAgICAgICAgIENoYW5uZWwpOwordm9pZCBSVDI4eHhQY2lTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCSB1MTYgVGJ0dE51bVRvTmV4dFdha2VVcCk7CiAKLVZPSUQgQXNpY1R1cm5PblJGQ2xrKAotCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKLQlJTglVQ0hBUgkJCUNoYW5uZWwpOwordm9pZCBSVDI4eHhQY2lNbG1lUmFkaW9PbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1OVFNUQVRVUyBSVDMweHhXcml0ZVJGUmVnaXN0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlSZWdJRCwKLQlJTglVQ0hBUgkJCVZhbHVlKTsKK3ZvaWQgUlQyOHh4UGNpTWxtZVJhZGlvT0ZGKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiAKLU5UU1RBVFVTIFJUMzB4eFJlYWRSRlJlZ2lzdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJUmVnSUQsCi0JSU4JUFVDSEFSCQkJcFZhbHVlKTsKKyNpZmRlZiBSVE1QX01BQ19VU0IKKy8qICovCisvKiBGdW5jdGlvbiBQcm90b3R5cGUgaW4gcnR1c2JfYnVsay5jICovCisvKiAqLwordm9pZCBSVFVTQkluaXRUeERlc2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgIHN0cnVjdCBydF90eF9jb250ZXh0ICpwVHhDb250ZXh0LAorCQkgICAgIHU4IEJ1bGtPdXRQaXBlSWQsIElOIHVzYl9jb21wbGV0ZV90IEZ1bmMpOwogCi1VQ0hBUiBlRnVzZVJlYWRSZWdpc3RlcnMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUIE9mZnNldCwKLQlJTglVU0hPUlQgTGVuZ3RoLAotCU9VVAlVU0hPUlQqIHBEYXRhKTsKK3ZvaWQgUlRVU0JJbml0SFRUeERlc2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICAgc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBUeENvbnRleHQsCisJCSAgICAgICB1OCBCdWxrT3V0UGlwZUlkLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBCdWxrT3V0U2l6ZSwgSU4gdXNiX2NvbXBsZXRlX3QgRnVuYyk7CiAKLVZPSUQgZUZ1c2VSZWFkUGh5c2ljYWwoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0gIAlJTglQVVNIT1JUIGxwSW5CdWZmZXIsCi0gIAlJTglVTE9ORyBuSW5CdWZmZXJTaXplLAotICAJT1VUCVBVU0hPUlQgbHBPdXRCdWZmZXIsCi0gIAlJTglVTE9ORyBuT3V0QnVmZmVyU2l6ZQotKTsKK3ZvaWQgUlRVU0JJbml0UnhEZXNjKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X3J4X2NvbnRleHQgKnBSeENvbnRleHQpOwogCi1OVFNUQVRVUyBlRnVzZVJlYWQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCU9VVAlQVUNIQVIJCQlwRGF0YSwKLQlJTglVU0hPUlQJCQlMZW5ndGgpOwordm9pZCBSVFVTQkNsZWFuVXBEYXRhQnVsa091dFF1ZXVlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgZUZ1c2VQaHlzaWNhbFdyaXRlUmVnaXN0ZXJzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVCBPZmZzZXQsCi0JSU4JVVNIT1JUIExlbmd0aCwKLQlPVVQJVVNIT1JUKiBwRGF0YSk7Cit2b2lkIFJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotTlRTVEFUVVMgZUZ1c2VXcml0ZVJlZ2lzdGVycygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQgT2Zmc2V0LAotCUlOCVVTSE9SVCBMZW5ndGgsCi0JSU4JVVNIT1JUKiBwRGF0YSk7Cit2b2lkIFJUVVNCQnVsa091dERhdGFQYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHU4IEJ1bGtPdXRQaXBlSWQsIHU4IEluZGV4KTsKIAotVk9JRCBlRnVzZVdyaXRlUGh5c2ljYWwoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0gIAlQVVNIT1JUIGxwSW5CdWZmZXIsCi0JVUxPTkcgbkluQnVmZmVyU2l6ZSwKLSAgCVBVQ0hBUiBscE91dEJ1ZmZlciwKLSAgCVVMT05HIG5PdXRCdWZmZXJTaXplCi0pOwordm9pZCBSVFVTQkJ1bGtPdXROdWxsRnJhbWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotTlRTVEFUVVMgZUZ1c2VXcml0ZSgKLSAgIAlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQJCQlPZmZzZXQsCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4JVVNIT1JUCQkJbGVuZ3RoKTsKK3ZvaWQgUlRVU0JCdWxrT3V0UlRTRnJhbWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotSU5UIHNldF9lRnVzZUdldEZyZWVCbG9ja0NvdW50X1Byb2MoCi0gICAJSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKK3ZvaWQgUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLUlOVCBzZXRfZUZ1c2VkdW1wX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKK3ZvaWQgUlRVU0JDYW5jZWxQZW5kaW5nSVJQcyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1JTlQgc2V0X2VGdXNlTG9hZEZyb21CaW5fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwordm9pZCBSVFVTQkJ1bGtPdXRNTE1FUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggSW5kZXgpOwogCi1OVFNUQVRVUyBlRnVzZVdyaXRlUmVnaXN0ZXJzRnJvbUJpbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQgT2Zmc2V0LAotCUlOCVVTSE9SVCBMZW5ndGgsCi0JSU4JVVNIT1JUKiBwRGF0YSk7Cit2b2lkIFJUVVNCQnVsa091dFBzUG9sbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIGVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVCBPZmZzZXQsCi0JSU4JVVNIT1JUIExlbmd0aCwKLQlPVVQJVVNIT1JUKiBwRGF0YSk7Cit2b2lkIFJUVVNCQ2xlYW5VcE1MTUVCdWxrT3V0UXVldWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBSVDMweHhMb2FkUkZOb3JtYWxNb2RlU2V0dXAoCi0JSU4gUFJUTVBfQURBUFRFUiAJcEFkKTsKK3ZvaWQgUlRVU0JLaWNrQnVsa091dChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIFJUMzB4eExvYWRSRlNsZWVwTW9kZVNldHVwKAotCUlOIFBSVE1QX0FEQVBURVIgCXBBZCk7Cit2b2lkIFJUVVNCQnVsa1JlY2VpdmUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBSVDMweHhSZXZlcnNlUkZTbGVlcE1vZGVTZXR1cCgKLQlJTiBQUlRNUF9BREFQVEVSIAlwQWQpOwordm9pZCBEb0J1bGtJbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi0jaWZkZWYgUlQyODcwCi0vLwotLy8gRnVuY3Rpb24gUHJvdG90eXBlIGluIHJ0dXNiX2J1bGsuYwotLy8KLVZPSUQJUlRVU0JJbml0VHhEZXNjKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBUWF9DT05URVhUCQlwVHhDb250ZXh0LAotCUlOCVVDSEFSCQkJQnVsa091dFBpcGVJZCwKLQlJTgl1c2JfY29tcGxldGVfdAlGdW5jKTsKK3ZvaWQgUlRVU0JJbml0UnhEZXNjKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X3J4X2NvbnRleHQgKnBSeENvbnRleHQpOwogCi1WT0lECVJUVVNCSW5pdEhUVHhEZXNjKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBIVF9UWF9DT05URVhUCXBUeENvbnRleHQsCi0JSU4JVUNIQVIJCQlCdWxrT3V0UGlwZUlkLAotCUlOCVVMT05HCQkJQnVsa091dFNpemUsCi0JSU4JdXNiX2NvbXBsZXRlX3QJRnVuYyk7Cit2b2lkIFJUVVNCQnVsa1J4SGFuZGxlKElOIHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKLVZPSUQgUlRVU0JDbGVhblVwRGF0YUJ1bGtPdXRRdWV1ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisvKiAqLworLyogRnVuY3Rpb24gUHJvdG90eXBlIGluIHJ0dXNiX2lvLmMgKi8KKy8qICovCitpbnQgUlRVU0JNdWx0aVJlYWQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJdTE2IE9mZnNldCwgdTggKnBEYXRhLCB1MTYgbGVuZ3RoKTsKIAotVk9JRCBSVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKK2ludCBSVFVTQk11bHRpV3JpdGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHUxNiBPZmZzZXQsIHU4ICpwRGF0YSwgdTE2IGxlbmd0aCk7CiAKLVZPSUQgUlRVU0JCdWxrT3V0RGF0YVBhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCUJ1bGtPdXRQaXBlSWQsCi0JSU4JVUNIQVIJCQlJbmRleCk7CitpbnQgUlRVU0JNdWx0aVdyaXRlX09uZUJ5dGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSB1MTYgT2Zmc2V0LCB1OCAqcERhdGEpOwogCi1WT0lEIFJUVVNCQnVsa091dE51bGxGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7CitpbnQgUlRVU0JSZWFkQkJQUmVnaXN0ZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgdTggSWQsIHU4ICpwVmFsdWUpOwogCi1WT0lEIFJUVVNCQnVsa091dFJUU0ZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKK2ludCBSVFVTQldyaXRlQkJQUmVnaXN0ZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgIHU4IElkLCB1OCBWYWx1ZSk7CiAKLVZPSUQgUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKK2ludCBSVFVTQldyaXRlUkZSZWdpc3RlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHUzMiBWYWx1ZSk7CiAKLVZPSUQgUlRVU0JDYW5jZWxQZW5kaW5nSVJQcygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7CitpbnQgUlRVU0JfVmVuZG9yUmVxdWVzdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHUzMiBUcmFuc2ZlckZsYWdzLAorCQkJICAgICB1OCBSZXNlcnZlZEJpdHMsCisJCQkgICAgIHU4IFJlcXVlc3QsCisJCQkgICAgIHUxNiBWYWx1ZSwKKwkJCSAgICAgdTE2IEluZGV4LAorCQkJICAgICB2b2lkICpUcmFuc2ZlckJ1ZmZlciwKKwkJCSAgICAgdTMyIFRyYW5zZmVyQnVmZmVyTGVuZ3RoKTsKIAotVk9JRCBSVFVTQkJ1bGtPdXRNTE1FUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJSW5kZXgpOworaW50IFJUVVNCUmVhZEVFUFJPTShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgdTE2IE9mZnNldCwgdTggKnBEYXRhLCB1MTYgbGVuZ3RoKTsKIAotVk9JRCBSVFVTQkJ1bGtPdXRQc1BvbGwoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOworaW50IFJUVVNCV3JpdGVFRVBST00oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICB1MTYgT2Zmc2V0LCB1OCAqcERhdGEsIHUxNiBsZW5ndGgpOwogCi1WT0lEIFJUVVNCQ2xlYW5VcE1MTUVCdWxrT3V0UXVldWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOwordm9pZCBSVFVTQlB1dFRvU2xlZXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBSVFVTQktpY2tCdWxrT3V0KAotCUlOCVBSVE1QX0FEQVBURVIgcEFkKTsKK2ludCBSVFVTQldha2VVcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lECVJUVVNCQnVsa1JlY2VpdmUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOwordm9pZCBSVFVTQkluaXRpYWxpemVDbWRRKHN0cnVjdCBydF9jbWRxICpjbWRxKTsKIAotVk9JRCBEb0J1bGtJbigKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCk7CitpbnQgUlRVU0JFbnF1ZXVlQ21kRnJvbU5kaXMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgICBJTiBORElTX09JRCBPaWQsCisJCQkJICAgIElOIEJPT0xFQU4gU2V0SW5mb3JtYXRpb24sCisJCQkJICAgIHZvaWQgKnBJbmZvcm1hdGlvbkJ1ZmZlciwKKwkJCQkgICAgdTMyIEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoKTsKIAotVk9JRCBSVFVTQkluaXRSeERlc2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gIFBSWF9DT05URVhUCQlwUnhDb250ZXh0KTsKK2ludCBSVFVTQkVucXVldWVJbnRlcm5hbENtZChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgIElOIE5ESVNfT0lEIE9pZCwKKwkJCQkgICAgdm9pZCAqcEluZm9ybWF0aW9uQnVmZmVyLAorCQkJCSAgICB1MzIgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpOwogCi0vLwotLy8gRnVuY3Rpb24gUHJvdG90eXBlIGluIHJ0dXNiX2lvLmMKLS8vCi1OVFNUQVRVUyBSVFVTQk11bHRpUmVhZCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQJCQlPZmZzZXQsCi0JT1VUCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVTSE9SVAkJCWxlbmd0aCk7Cit2b2lkIFJUVVNCRGVxdWV1ZUNtZChzdHJ1Y3QgcnRfY21kcSAqY21kcSwgc3RydWN0IHJ0X2NtZHFlbG10ICogKiBwY21kcWVsbXQpOwogCi1OVFNUQVRVUyBSVFVTQk11bHRpV3JpdGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVTSE9SVAkJCWxlbmd0aCk7CitpbnQgUlRVU0JDbWRUaHJlYWQoSU4gdm9pZCAqQ29udGV4dCk7CiAKLU5UU1RBVFVTIFJUVVNCTXVsdGlXcml0ZV9PbmVCeXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVAkJCU9mZnNldCwKLQlJTglQVUNIQVIJCQlwRGF0YSk7Cit2b2lkIFJUVVNCQnNzQmVhY29uRXhpdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1OVFNUQVRVUyBSVFVTQlJlYWRCQlBSZWdpc3RlcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCUlkLAotCUlOCVBVQ0hBUgkJCXBWYWx1ZSk7Cit2b2lkIFJUVVNCQnNzQmVhY29uU3RvcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1OVFNUQVRVUyBSVFVTQldyaXRlQkJQUmVnaXN0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlJZCwKLQlJTglVQ0hBUgkJCVZhbHVlKTsKLQotTlRTVEFUVVMgUlRVU0JXcml0ZVJGUmVnaXN0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUlOVDMyCQkJVmFsdWUpOwotCi1OVFNUQVRVUyBSVFVTQl9WZW5kb3JSZXF1ZXN0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVJTlQzMgkJCVRyYW5zZmVyRmxhZ3MsCi0JSU4JVUNIQVIJCQlSZXNlcnZlZEJpdHMsCi0JSU4JVUNIQVIJCQlSZXF1ZXN0LAotCUlOCVVTSE9SVAkJCVZhbHVlLAotCUlOCVVTSE9SVAkJCUluZGV4LAotCUlOCVBWT0lECQkJVHJhbnNmZXJCdWZmZXIsCi0JSU4JVUlOVDMyCQkJVHJhbnNmZXJCdWZmZXJMZW5ndGgpOwotCi1OVFNUQVRVUyBSVFVTQlJlYWRFRVBST00oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCU9VVAlQVUNIQVIJCQlwRGF0YSwKLQlJTglVU0hPUlQJCQlsZW5ndGgpOwotCi1OVFNUQVRVUyBSVFVTQldyaXRlRUVQUk9NKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVAkJCU9mZnNldCwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVU0hPUlQJCQlsZW5ndGgpOwotCi1WT0lEIFJUVVNCUHV0VG9TbGVlcCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLU5UU1RBVFVTIFJUVVNCV2FrZVVwKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKLQotVk9JRCBSVFVTQkluaXRpYWxpemVDbWRRKAotCUlOCVBDbWRRCWNtZHEpOwotCi1ORElTX1NUQVRVUwlSVFVTQkVucXVldWVDbWRGcm9tTmRpcygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglORElTX09JRAkJT2lkLAotCUlOCUJPT0xFQU4JCQlTZXRJbmZvcm1hdGlvbiwKLQlJTglQVk9JRAkJCXBJbmZvcm1hdGlvbkJ1ZmZlciwKLQlJTglVSU5UMzIJCQlJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCk7Ci0KLU5ESVNfU1RBVFVTIFJUVVNCRW5xdWV1ZUludGVybmFsQ21kKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOIE5ESVNfT0lECQkJT2lkLAotCUlOIFBWT0lECQkJcEluZm9ybWF0aW9uQnVmZmVyLAotCUlOIFVJTlQzMgkJCUluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoKTsKLQotVk9JRCBSVFVTQkRlcXVldWVDbWQoCi0JSU4JUENtZFEJCWNtZHEsCi0JT1VUCVBDbWRRRWxtdAkqcGNtZHFlbG10KTsKLQotSU5UIFJUVVNCQ21kVGhyZWFkKAotCUlOIE9VVCBQVk9JRCBDb250ZXh0KTsKLQotSU5UIFRpbWVyUVRocmVhZCgKLQlJTiBPVVQgUFZPSUQgQ29udGV4dCk7Ci0KLVJUMjg3MF9USU1FUl9FTlRSWSAqUlQyODcwX1RpbWVyUV9JbnNlcnQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gUkFMSU5LX1RJTUVSX1NUUlVDVCAqcFRpbWVyKTsKLQotQk9PTEVBTiBSVDI4NzBfVGltZXJRX1JlbW92ZSgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBSQUxJTktfVElNRVJfU1RSVUNUICpwVGltZXIpOwotCi12b2lkIFJUMjg3MF9UaW1lclFfRXhpdCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCk7Ci0KLXZvaWQgUlQyODcwX1RpbWVyUV9Jbml0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKLQotVk9JRCBSVDI4NzBfQnNzQmVhY29uRXhpdCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCk7Cit2b2lkIFJUVVNCQnNzQmVhY29uU3RhcnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBSVDI4NzBfQnNzQmVhY29uU3RvcCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCk7Cit2b2lkIFJUVVNCQnNzQmVhY29uSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIFJUMjg3MF9Cc3NCZWFjb25TdGFydCgKLQlJTiBSVE1QX0FEQVBURVIgKiBwQWQpOwordm9pZCBSVFVTQldhdGNoRG9nKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgUlQyODcwX0Jzc0JlYWNvbkluaXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpOworaW50IFJUVVNCV3JpdGVNQUNSZWdpc3RlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgdTE2IE9mZnNldCwgdTMyIFZhbHVlKTsKIAotVk9JRCBSVDI4NzBfV2F0Y2hEb2coCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpOworaW50IFJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgIHUxNiBPZmZzZXQsIHUzMiAqcFZhbHVlKTsKIAotTlRTVEFUVVMgUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVAkJCU9mZnNldCwKLQlJTglVSU5UMzIJCQlWYWx1ZSk7CitpbnQgUlRVU0JTaW5nbGVXcml0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgIHUxNiBPZmZzZXQsIHUxNiBWYWx1ZSk7CiAKLU5UU1RBVFVTIFJUVVNCUmVhZE1BQ1JlZ2lzdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVAkJCU9mZnNldCwKLQlPVVQJUFVJTlQzMgkJCXBWYWx1ZSk7CitpbnQgUlRVU0JGaXJtd2FyZVdyaXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICB1OCAqcEZ3SW1hZ2UsIHVuc2lnbmVkIGxvbmcgRndMZW4pOwogCi1OVFNUQVRVUyBSVFVTQlNpbmdsZVdyaXRlKAotCUlOIAlSVE1QX0FEQVBURVIgCSpwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCUlOCVVTSE9SVAkJCVZhbHVlKTsKK2ludCBSVFVTQlZlbmRlclJlc2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLU5UU1RBVFVTIFJUVVNCRmlybXdhcmVSdW4oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOworaW50IFJUVVNCU2V0SGFyZFdhcmVSZWdpc3RlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciwgdm9pZCAqcEJ1Zik7CiAKLU5UU1RBVFVTIFJUVVNCRmlybXdhcmVXcml0ZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIJCXBGd0ltYWdlLAotCUlOIFVMT05HCQlGd0xlbik7CitpbnQgUlRVU0JRdWVyeUhhcmRXYXJlUmVnaXN0ZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIsCisJCQkJICAgICAgIHZvaWQgKnBCdWYpOwogCi1OVFNUQVRVUwlSVFVTQkZpcm13YXJlT3Btb2RlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUlOVDMyCQkJcFZhbHVlKTsKK3ZvaWQgQ01ESGFuZGxlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1OVFNUQVRVUwlSVFVTQlZlbmRlclJlc2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKK2ludCBSVFVTQldyaXRlSFdNQUNBZGRyZXNzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyKTsKIAotVk9JRCBDTURIYW5kbGVyKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkKTsKK3ZvaWQgTWFjVGFibGVJbml0aWFsaXplKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKK3ZvaWQgTWxtZVNldFBzbShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHUxNiBwc20pOwogCi1ORElTX1NUQVRVUwkgQ3JlYXRlVGhyZWFkcygKLQlJTglzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiApOworaW50IFJUTVBXUEFBZGRLZXlQcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdm9pZCAqcEJ1Zik7CiAKK3ZvaWQgQXNpY1J4QW50RXZhbEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIE1hY1RhYmxlSW5pdGlhbGl6ZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Cit2b2lkIGFwcGVuZF9wa3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQl1OCAqcEhlYWRlcjgwMl8zLAorCQl1MzIgSGRyTGVuLAorCQl1OCAqcERhdGEsCisJCXVuc2lnbmVkIGxvbmcgRGF0YVNpemUsIHZvaWQgKiogcHBQYWNrZXQpOwogCi1WT0lEIE1sbWVTZXRQc20oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIHBzbSk7Cit1MzIgZGVhZ2dyZWdhdGVfQU1TRFVfYW5ub3VuY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCXZvaWQgKnBQYWNrZXQsCisJCQkJdTggKnBEYXRhLCB1bnNpZ25lZCBsb25nIERhdGFTaXplKTsKIAotTkRJU19TVEFUVVMgUlRNUFdQQUFkZEtleVByb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBWT0lEICAgICAgICAgICBwQnVmKTsKK2ludCBSVE1QQ2hlY2tSeEVycm9yKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGVhZGVyLAorCQkJICAgICBzdHJ1Y3QgcnRfcnh3aSAqIHBSeFdJLAorCQkJICAgICBJTiBQUlQyOFhYX1JYRF9TVFJVQyBwUnhJTkZPKTsKIAotVk9JRCBBc2ljUnhBbnRFdmFsQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK3ZvaWQgUlRVU0JNbG1lSGFyZFRyYW5zbWl0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21nbXQgKnBNZ210KTsKIAotTkRJU19TVEFUVVMJUlRNUENoZWNrUnhFcnJvcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQSEVBREVSXzgwMl8xMQlwSGVhZGVyLAotCUlOCVBSWFdJX1NUUlVDCXBSeFdJLAotCUlOCVBSVDI4WFhfUlhEX1NUUlVDCXBSeElORk8pOworaW50IE1sbWVUaHJlYWQodm9pZCAqQ29udGV4dCk7CiAKLUlOVCBNbG1lVGhyZWFkKAotCUlOIFBWT0lEIENvbnRleHQpOworLyogKi8KKy8qIEZ1bmN0aW9uIFByb3RvdHlwZSBpbiBydHVzYl9kYXRhLmMgKi8KKy8qICovCitpbnQgUlRVU0JGcmVlRGVzY3JpcHRvclJlcXVlc3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgICAgICB1OCBCdWxrT3V0UGlwZUlkLAorCQkJCSAgICAgICB1MzIgTnVtYmVyUmVxdWlyZWQpOwogCi0vLwotLy8gRnVuY3Rpb24gUHJvdG90eXBlIGluIHJ0dXNiX2RhdGEuYwotLy8KLU5ESVNfU1RBVFVTCVJUVVNCRnJlZURlc2NyaXB0b3JSZXF1ZXN0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJQnVsa091dFBpcGVJZCwKLQlJTglVSU5UMzIJCQlOdW1iZXJSZXF1aXJlZCk7CitCT09MRUFOIFJUVVNCTmVlZFF1ZXVlQmFja0ZvckFnZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IEJ1bGtPdXRQaXBlSWQpOwogCit2b2lkIFJUTVBXcml0ZVR4SW5mbyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgc3RydWN0IHJ0X3R4aW5mbyAqcFR4SW5mbywKKwkJICAgICB1MTYgVVNCRE1BcGt0TGVuLAorCQkgICAgIElOIEJPT0xFQU4gYldpdiwKKwkJICAgICB1OCBRdWV1ZVNlbCwgdTggTmV4dFZhbGlkLCB1OCBUeEJ1cnN0KTsKIAotQk9PTEVBTglSVFVTQk5lZWRRdWV1ZUJhY2tGb3JBZ2coCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gVUNIQVIJCUJ1bGtPdXRQaXBlSWQpOworLyogKi8KKy8qIEZ1bmN0aW9uIFByb3RvdHlwZSBpbiBjbW1fZGF0YV91c2IuYyAqLworLyogKi8KK3UxNiBSdG1wVVNCX1dyaXRlU3ViVHhSZXNvdXJjZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssCisJCQkJICBJTiBCT09MRUFOIGJJc0xhc3QsIHUxNiAqIEZyZWVOdW1iZXIpOwogCit1MTYgUnRtcFVTQl9Xcml0ZVNpbmdsZVR4UmVzb3VyY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgICAgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrLAorCQkJCSAgICAgSU4gQk9PTEVBTiBiSXNMYXN0LAorCQkJCSAgICAgdTE2ICogRnJlZU51bWJlcik7CiAKLVZPSUQgUlRNUFdyaXRlVHhJbmZvKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBUWElORk9fU1RSVUMgCXBUeEluZm8sCi0JSU4JICBVU0hPUlQJCVVTQkRNQXBrdExlbiwKLQlJTgkgIEJPT0xFQU4JCWJXaXYsCi0JSU4JICBVQ0hBUgkJCVF1ZXVlU2VsLAotCUlOCSAgVUNIQVIJCQlOZXh0VmFsaWQsCi0JSU4JICBVQ0hBUgkJCVR4QnVyc3QpOwordTE2IFJ0bXBVU0JfV3JpdGVGcmFnVHhSZXNvdXJjZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrLAorCQkJCSAgIHU4IGZyYWdOdW0sIHUxNiAqIEZyZWVOdW1iZXIpOwogCi0vLwotLy8gRnVuY3Rpb24gUHJvdG90eXBlIGluIGNtbV9kYXRhXzI4NzAuYwotLy8KLVVTSE9SVCBSdG1wVVNCX1dyaXRlU3ViVHhSZXNvdXJjZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCUJPT0xFQU4JCQliSXNMYXN0LAotCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcik7Cit1MTYgUnRtcFVTQl9Xcml0ZU11bHRpVHhSZXNvdXJjZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaywKKwkJCQkgICAgdTggZnJhbWVOdW0sIHUxNiAqIEZyZWVOdW1iZXIpOwogCi1VU0hPUlQgUnRtcFVTQl9Xcml0ZVNpbmdsZVR4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglCT09MRUFOCQkJYklzTGFzdCwKLQlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpOwordm9pZCBSdG1wVVNCX0ZpbmFsV3JpdGVUeFJlc291cmNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaywKKwkJCQkgIHUxNiB0b3RhbE1QRFVTaXplLCB1MTYgVHhJZHgpOwogCi1VU0hPUlQJUnRtcFVTQl9Xcml0ZUZyYWdUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JVUNIQVIJCQlmcmFnTnVtLAotCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcik7Cit2b2lkIFJ0bXBVU0JEYXRhTGFzdFR4SWR4KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgdTggUXVlSWR4LCB1MTYgVHhJZHgpOwogCi1VU0hPUlQgUnRtcFVTQl9Xcml0ZU11bHRpVHhSZXNvdXJjZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCVVDSEFSCQkJZnJhbWVOdW0sCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKK3ZvaWQgUnRtcFVTQkRhdGFLaWNrT3V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCXN0cnVjdCBydF90eF9ibGsgKnBUeEJsaywgdTggUXVlSWR4KTsKIAotVk9JRCBSdG1wVVNCX0ZpbmFsV3JpdGVUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JVVNIT1JUCQkJdG90YWxNUERVU2l6ZSwKLSNpZmRlZiBSVDI4NjAKLQlJTglVU0hPUlQJCQlGaXJzdFR4SWR4KTsKLSNlbmRpZgotCUlOCVVTSE9SVAkJCVR4SWR4KTsKK2ludCBSdG1wVVNCTWdtdEtpY2tPdXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICAgdTggUXVlSWR4LAorCQkgICAgICAgdm9pZCAqcFBhY2tldCwKKwkJICAgICAgIHU4ICpwU3JjQnVmVkEsIHUzMiBTcmNCdWZMZW4pOwogCi1WT0lEIFJ0bXBVU0JEYXRhTGFzdFR4SWR4KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJUXVlSWR4LAotCUlOCVVTSE9SVAkJCVR4SWR4KTsKK3ZvaWQgUnRtcFVTQk51bGxGcmFtZUtpY2tPdXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB1OCBRdWVJZHgsCisJCQkgICAgIHU4ICogcE51bGxGcmFtZSwgdTMyIGZyYW1lTGVuKTsKIAotVk9JRCBSdG1wVVNCRGF0YUtpY2tPdXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVQ0hBUgkJCVF1ZUlkeCk7Cit2b2lkIFJ0bXBVc2JTdGFBc2ljRm9yY2VXYWtldXBUaW1lb3V0KHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJCQkgICAgICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCQkJICAgICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLAorCQkJCSAgICAgIHZvaWQgKlN5c3RlbVNwZWNpZmljMyk7CiAKK3ZvaWQgUlQyOHh4VXNiU3RhQXNpY0ZvcmNlV2FrZXVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgSU4gQk9PTEVBTiBiRnJvbVR4KTsKIAotaW50IFJ0bXBVU0JNZ210S2lja091dCgKLQlJTiBSVE1QX0FEQVBURVIgCSpwQWQsCi0JSU4gVUNIQVIgCQkJUXVlSWR4LAotCUlOIFBORElTX1BBQ0tFVAkJcFBhY2tldCwKLQlJTiBQVUNIQVIJCQlwU3JjQnVmVkEsCi0JSU4gVUlOVCAJCQlTcmNCdWZMZW4pOwordm9pZCBSVDI4eHhVc2JTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCSB1MTYgVGJ0dE51bVRvTmV4dFdha2VVcCk7CiAKLVZPSUQgUnRtcFVTQk51bGxGcmFtZUtpY2tPdXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gVUNIQVIJCVF1ZUlkeCwKLQlJTiBVQ0hBUgkJKnBOdWxsRnJhbWUsCi0JSU4gVUlOVDMyCQlmcmFtZUxlbik7Cit2b2lkIFJUMjh4eFVzYk1sbWVSYWRpb09uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgUlQyOHh4VXNiU3RhQXNpY0ZvcmNlV2FrZXVwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIEJPT0xFQU4gICAgICAgYkZyb21UeCk7Cit2b2lkIFJUMjh4eFVzYk1sbWVSYWRpb09GRihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCi1WT0lEIFJUMjh4eFVzYlN0YUFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKK3ZvaWQgQXNpY1R1cm5PZmZSRkNsayhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IENoYW5uZWwpOwogCi1WT0lEIFJUMjh4eFVzYk1sbWVSYWRpb09uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK3ZvaWQgQXNpY1R1cm5PblJGQ2xrKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggQ2hhbm5lbCk7CiAKLVZPSUQgUlQyOHh4VXNiTWxtZVJhZGlvT0ZGKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KKyNpZmRlZiBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVAoraW50IFJ0bXBUaW1lclFUaHJlYWQoSU4gdm9pZCAqQ29udGV4dCk7CiAKLUlOVCBSVE1QU2hvd0NmZ1ZhbHVlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBOYW1lLAotCUlOCVBVQ0hBUgkJCXBCdWYpOworc3RydWN0IHJ0X3J0bXBfdGltZXJfdGFza19lbnRyeSAqUnRtcFRpbWVyUUluc2VydChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCXN0cnVjdCBydF9yYWxpbmtfdGltZXIgKnBUaW1lcik7CiAKLVBDSEFSICAgUlRNUEdldFJhbGlua0F1dGhNb2RlU3RyKAotICAgIElOICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFIGF1dGhNb2RlKTsKK0JPT0xFQU4gUnRtcFRpbWVyUVJlbW92ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgc3RydWN0IHJ0X3JhbGlua190aW1lciAqcFRpbWVyKTsKIAotUENIQVIgICBSVE1QR2V0UmFsaW5rRW5jcnlNb2RlU3RyKAotICAgIElOICBVU0hPUlQgZW5jcnlNb2RlKTsKK3ZvaWQgUnRtcFRpbWVyUUV4aXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBBc2ljU3RhQmJwVHVuaW5nKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK3ZvaWQgUnRtcFRpbWVyUUluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKKyNlbmRpZiAvKiBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVCAvLyAqLwogCi0jaWZkZWYgUlQyODYwCi1WT0lEIEFzaWNSZXNldEZyb21ETUFCdXN5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK3ZvaWQgQXNpY1N0YUJicFR1bmluZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIEFzaWNSZXNldEJCUCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CitCT09MRUFOIFN0YUFkZE1hY1RhYmxlRW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwKKwkJCSAgICB1OCBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzLAorCQkJICAgIHN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llICogcEh0Q2FwYWJpbGl0eSwKKwkJCSAgICB1OCBIdENhcGFiaWxpdHlMZW4sCisJCQkgICAgc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llICogcEFkZEh0SW5mbywKKwkJCSAgICB1OCBBZGRIdEluZm9MZW4sIHUxNiBDYXBhYmlsaXR5SW5mbyk7CiAKLVZPSUQgQXNpY1Jlc2V0TUFDKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK0JPT0xFQU4gQVVUSF9SZXFTZW5kKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpwRWxlbSwKKwkJICAgICBzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyICpwQXV0aFRpbWVyLAorCQkgICAgIGNoYXIgKnBTTU5hbWUsCisJCSAgICAgdTE2IFNlcU5vLAorCQkgICAgIHU4ICpwTmV3RWxlbWVudCwgdW5zaWduZWQgbG9uZyBFbGVtZW50TGVuKTsKIAotVk9JRCBBc2ljUmVzZXRQQkYoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi1CT09MRUFOIFN0YUFkZE1hY1RhYmxlRW50cnkoCi0JSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiAgUE1BQ19UQUJMRV9FTlRSWQlwRW50cnksCi0JSU4gIFVDSEFSCQkJCU1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMsCi0JSU4gIEhUX0NBUEFCSUxJVFlfSUUJKnBIdENhcGFiaWxpdHksCi0JSU4gIFVDSEFSCQkJCUh0Q2FwYWJpbGl0eUxlbiwKLQlJTiAgVVNIT1JUICAgICAgICAJCUNhcGFiaWxpdHlJbmZvKTsKLSNlbmRpZgordm9pZCBSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi12b2lkIFJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKK3ZvaWQgUmVTeW5jQmVhY29uVGltZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIFJlU3luY0JlYWNvblRpbWUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwordm9pZCBSVE1QU2V0QUdDSW5pdFZhbHVlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggQmFuZFdpZHRoKTsKIAotVk9JRCBSVE1QU2V0QUdDSW5pdFZhbHVlKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVDSEFSCQkJQmFuZFdpZHRoKTsKK2ludCBydDI4eHhfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgcnQyOHh4X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKLWludCBydDI4eHhfY2xvc2UoSU4gUE5FVF9ERVYgZGV2KTsKLWludCBydDI4eHhfb3BlbihJTiBQTkVUX0RFViBkZXYpOworI2RlZmluZSBWSVJUVUFMX0lGX0lOQyhfX3BBZCkgKChfX3BBZCktPlZpcnR1YWxJZkNudCsrKQorI2RlZmluZSBWSVJUVUFMX0lGX0RFQyhfX3BBZCkgKChfX3BBZCktPlZpcnR1YWxJZkNudC0tKQorI2RlZmluZSBWSVJUVUFMX0lGX05VTShfX3BBZCkgKChfX3BBZCktPlZpcnR1YWxJZkNudCkKIAotX19pbmxpbmUgSU5UIFZJUlRVQUxfSUZfVVAoUFJUTVBfQURBUFRFUiBwQWQpCisjaWZkZWYgTElOVVgKK19faW5saW5lIGludCBWSVJUVUFMX0lGX1VQKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlpZiAoVklSVFVBTF9JRl9OVU0ocEFkKSA9PSAwKQotCXsKLQkJaWYgKHJ0Mjh4eF9vcGVuKHBBZC0+bmV0X2RldikgIT0gMCkKKwlpZiAoVklSVFVBTF9JRl9OVU0ocEFkKSA9PSAwKSB7CisJCWlmIChydDI4eHhfb3BlbihwQWQtPm5ldF9kZXYpICE9IDApIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoInJ0Mjh4eF9vcGVuIHJldHVybiBmYWlsIVxuIikpOwogCQkJcmV0dXJuIC0xOwotCX0KLQllbHNlCi0JeworCQl9CisJfSBlbHNlIHsKIAl9CiAJVklSVFVBTF9JRl9JTkMocEFkKTsKIAlyZXR1cm4gMDsKIH0KIAotX19pbmxpbmUgVk9JRCBWSVJUVUFMX0lGX0RPV04oUFJUTVBfQURBUFRFUiBwQWQpCitfX2lubGluZSB2b2lkIFZJUlRVQUxfSUZfRE9XTihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7CiAJVklSVFVBTF9JRl9ERUMocEFkKTsKIAlpZiAoVklSVFVBTF9JRl9OVU0ocEFkKSA9PSAwKQogCQlydDI4eHhfY2xvc2UocEFkLT5uZXRfZGV2KTsKIAlyZXR1cm47CiB9CisjZW5kaWYgLyogTElOVVggLy8gKi8KIAorLyoKKwlPUyBSZWxhdGVkIGZ1bmNpdG9uIHByb3RvdHlwZSBkZWZpbml0aW9ucy4KKwlUT0RPOiBNYXliZSB3ZSBuZWVkIHRvIG1vdmUgdGhlc2UgZnVuY3Rpb24gcHJvdG90eXBlcyB0byBvdGhlciBwcm9wZXIgcGxhY2UuCisqLworaW50IFJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICB1MzIgZXZlbnRUeXBlLAorCQkJICAgIGludCBmbGFncywKKwkJCSAgICB1OCAqcFNyY01hYywKKwkJCSAgICB1OCAqcERhdGEsIHUzMiBkYXRhTGVuKTsKIAotI2VuZGlmICAvLyBfX1JUTVBfSF9fCitpbnQgUnRtcE9TTmV0RGV2QWRkclNldChzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldiwgdTggKnBNYWNBZGRyKTsKIAoraW50IFJ0bXBPU05ldERldkF0dGFjaChzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldiwKKwkJICAgICAgIHN0cnVjdCBydF9ydG1wX29zX25ldGRldl9vcF9ob29rICpwRGV2T3BIb29rKTsKKwordm9pZCBSdG1wT1NOZXREZXZDbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldik7CisKK3ZvaWQgUnRtcE9TTmV0RGV2RGV0YWNoKHN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2KTsKKworaW50IFJ0bXBPU05ldERldkFsbG9jKHN0cnVjdCBuZXRfZGV2aWNlICoqIHBOZXdOZXREZXYsIHUzMiBwcml2RGF0YVNpemUpOworCit2b2lkIFJ0bXBPU05ldERldkZyZWUoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXYpOworCitzdHJ1Y3QgbmV0X2RldmljZSAqUnRtcE9TTmV0RGV2R2V0QnlOYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2LCBjaGFyICpwRGV2TmFtZSk7CisKK3ZvaWQgUnRtcE9TTmV0RGV2aWNlUmVmUHV0KHN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2KTsKKworc3RydWN0IG5ldF9kZXZpY2UgKlJ0bXBPU05ldERldkNyZWF0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgaW50IGRldlR5cGUsCisJCQkgICAgaW50IGRldk51bSwKKwkJCSAgICBpbnQgcHJpdk1lbVNpemUsIGNoYXIgKnBOYW1lUHJlZml4KTsKKworLyoKKwlUYXNrIG9wZXJhdGlvbiByZWxhdGVkIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyovCit2b2lkIFJ0bXBPU1Rhc2tDdXN0b21pemUoc3RydWN0IHJ0X3J0bXBfb3NfdGFzayAqcFRhc2spOworCitpbnQgUnRtcE9TVGFza05vdGlmeVRvRXhpdChzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpwVGFzayk7CisKK2ludCBSdG1wT1NUYXNrS2lsbChzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpwVGFzayk7CisKK2ludCBSdG1wT1NUYXNrSW5pdChzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpwVGFzaywKKwkJCSAgIGNoYXIgKnBUYXNrTmFtZSwgdm9pZCAqIHBQcml2KTsKKworaW50IFJ0bXBPU1Rhc2tBdHRhY2goc3RydWN0IHJ0X3J0bXBfb3NfdGFzayAqcFRhc2ssCisJCQkgICAgIElOIGludCAoKmZuKSAodm9pZCAqKSwgSU4gdm9pZCAqYXJnKTsKKworLyoKKwlGaWxlIG9wZXJhdGlvbiByZWxhdGVkIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyovCitzdHJ1Y3QgZmlsZSAqUnRtcE9TRmlsZU9wZW4oSU4gY2hhciAqcFBhdGgsIElOIGludCBmbGFnLCBJTiBpbnQgbW9kZSk7CisKK2ludCBSdG1wT1NGaWxlQ2xvc2Uoc3RydWN0IGZpbGUgKm9zZmQpOworCit2b2lkIFJ0bXBPU0ZpbGVTZWVrKHN0cnVjdCBmaWxlICpvc2ZkLCBJTiBpbnQgb2Zmc2V0KTsKKworaW50IFJ0bXBPU0ZpbGVSZWFkKHN0cnVjdCBmaWxlICpvc2ZkLCBJTiBjaGFyICpwRGF0YVB0ciwgSU4gaW50IHJlYWRMZW4pOworCitpbnQgUnRtcE9TRmlsZVdyaXRlKHN0cnVjdCBmaWxlICpvc2ZkLCBJTiBjaGFyICpwRGF0YVB0ciwgSU4gaW50IHdyaXRlTGVuKTsKKworI2VuZGlmIC8qIF9fUlRNUF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9jaGlwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfY2hpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZGYyY2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfY2hpcC5oCkBAIC0wLDAgKzEsMjU4IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXJ0bXBfY2hpcC5oCisKKwlBYnN0cmFjdDoKKwlSYWxpbmsgV2lyZWxlc3MgQ2hpcCByZWxhdGVkIGRlZmluaXRpb24gJiBzdHJ1Y3R1cmVzCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCSAgV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmCV9fUlRNUF9DSElQX0hfXworI2RlZmluZQlfX1JUTVBfQ0hJUF9IX18KKworI2luY2x1ZGUgInJ0bXBfdHlwZS5oIgorCisjaWZkZWYgUlQyODYwCisjaW5jbHVkZSAiY2hpcC9ydDI4NjAuaCIKKyNlbmRpZiAvKiBSVDI4NjAgLy8gKi8KKyNpZmRlZiBSVDI4NzAKKyNpbmNsdWRlICJjaGlwL3J0Mjg3MC5oIgorI2VuZGlmIC8qIFJUMjg3MCAvLyAqLworI2lmZGVmIFJUMzA3MAorI2luY2x1ZGUgImNoaXAvcnQzMDcwLmgiCisjZW5kaWYgLyogUlQzMDcwIC8vICovCisjaWZkZWYgUlQzMDkwCisjaW5jbHVkZSAiY2hpcC9ydDMwOTAuaCIKKyNlbmRpZiAvKiBSVDMwOTAgLy8gKi8KKworLyogV2Ugd2lsbCBoYXZlIGEgY29zdCBkb3duIHZlcnNpb24gd2hpY2ggbWFjIHZlcnNpb24gaXMgMHgzMDkweHh4eCAqLworLyogKi8KKy8qIFJUMzA5MEEgZmFjdHMgKi8KKy8qICovCisvKiBhKSAyLjQgR0h6ICovCisvKiBiKSBSZXBsYWNlbWVudCBmb3IgUlQzMDkwICovCisvKiBjKSBJbnRlcm5hbCBMTkEgKi8KKy8qIGQpIEludGVyZmVyZW5jZSBvdmVyIGNoYW5uZWwgIzE0ICovCisvKiBlKSBOZXcgQkJQIGZlYXR1cmVzIChlLmcuLCBTSUcgcmUtbW9kdWxhdGlvbikgKi8KKy8qICovCisjZGVmaW5lIElTX1JUMzA5MEEoX3BBZCkJCQkJKCgoKF9wQWQpLT5NQUNWZXJzaW9uICYgMHhmZmZmMDAwMCkgPT0gMHgzMDkwMDAwMCkpCisKKy8qIFdlIHdpbGwgaGF2ZSBhIGNvc3QgZG93biB2ZXJzaW9uIHdoaWNoIG1hYyB2ZXJzaW9uIGlzIDB4MzA5MHh4eHggKi8KKyNkZWZpbmUgSVNfUlQzMDkwKF9wQWQpCQkJCSgoKChfcEFkKS0+TUFDVmVyc2lvbiAmIDB4ZmZmZjAwMDApID09IDB4MzA3MTAwMDApIHx8IChJU19SVDMwOTBBKF9wQWQpKSkKKworI2RlZmluZSBJU19SVDMwNzAoX3BBZCkJCSgoKF9wQWQpLT5NQUNWZXJzaW9uICYgMHhmZmZmMDAwMCkgPT0gMHgzMDcwMDAwMCkKKyNkZWZpbmUgSVNfUlQzMDcxKF9wQWQpCQkoKChfcEFkKS0+TUFDVmVyc2lvbiAmIDB4ZmZmZjAwMDApID09IDB4MzA3MTAwMDApCisjZGVmaW5lIElTX1JUMjA3MChfcEFkKQkJKCgoX3BBZCktPlJmSWNUeXBlID09IFJGSUNfMjAyMCkgfHwgKChfcEFkKS0+RUZ1c2VUYWcgPT0gMHgyNykpCisKKyNkZWZpbmUgSVNfUlQzMHh4KF9wQWQpCQkoKChfcEFkKS0+TUFDVmVyc2lvbiAmIDB4ZmZmMDAwMDApID09IDB4MzA3MDAwMDB8fElTX1JUMzA5MEEoX3BBZCkpCisvKiNkZWZpbmUgSVNfUlQzMDVYKF9wQWQpICAgICAgICAgICAgICAgKChfcEFkKS0+TUFDVmVyc2lvbiA9PSAweDI4NzIwMjAwKSAqLworCisvKiBSVDM1NzIsIDM1OTIsIDM1NjIsIDMwNjIgc2hhcmUgdGhlIHNhbWUgTUFDIHZlcnNpb24gKi8KKyNkZWZpbmUgSVNfUlQzNTcyKF9wQWQpCQkoKChfcEFkKS0+TUFDVmVyc2lvbiAmIDB4ZmZmZjAwMDApID09IDB4MzU3MjAwMDApCisjZGVmaW5lIElTX1ZFUlNJT05fQkVGT1JFX0YoX3BBZCkJCQkoKChfcEFkKS0+TUFDVmVyc2lvbiYweGZmZmYpIDw9IDB4MDIxMSkKKy8qIEYgdmVyc2lvbiBpcyAweDAyMTIsIEUgdmVyc2lvbiBpcyAweDAyMTEuIDMwOXggY2FuIHNhdmUgbW9yZSBwb3dlciBhZnRlciBGIHZlcnNpb24uICovCisjZGVmaW5lIElTX1ZFUlNJT05fQUZURVJfRihfcEFkKQkJCSgoKChfcEFkKS0+TUFDVmVyc2lvbiYweGZmZmYpID49IDB4MDIxMikgfHwgKCgoX3BBZCktPmIzMDkwRVNwZWNpYWxDaGlwID09IFRSVUUpKSkKKy8qICovCisvKiBSVDMzOTAgZmFjdHMgKi8KKy8qICovCisvKiBhKSBCYXNlIG9uIFJUMzA5MCAoUkYgSUM6IFJUMzAyMCkgKi8KKy8qIGIpIDIuNCBHSHogKi8KKy8qIGMpIDF4MSAqLworLyogZCkgU2luZ2xlIGNoaXAgKi8KKy8qIGUpIEludGVybmFsIGNvbXBvbmVudHM6IFBBIGFuZCBMTkEgKi8KKy8qICovCisvKlJUMzM5MCxSVDMzNzAgKi8KKyNkZWZpbmUgSVNfUlQzMzkwKF9wQWQpCQkJCSgoKF9wQWQpLT5NQUNWZXJzaW9uICYgMHhGRkZGMDAwMCkgPT0gMHgzMzkwMDAwMCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBQQ0kgcmVnaXN0ZXJzIC0gYmFzZSBhZGRyZXNzIDB4MDAwMCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIENISVBfUENJX0NGRwkJMHgwMDAwCisjZGVmaW5lIENISVBfUENJX0VFQ1RSTAkJMHgwMDA0CisjZGVmaW5lIENISVBfUENJX01DVUNUUkwJMHgwMDA4CisKKyNkZWZpbmUgT1BUXzE0CQkJMHgxMTQKKworI2RlZmluZSBSRVRSWV9MSU1JVAkJMTAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBCQlAgJiBSRiAgICAgZGVmaW5pdGlvbiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lCUJVU1kJCSAgICAgICAgICAgICAgICAxCisjZGVmaW5lCUlETEUJCSAgICAgICAgICAgICAgICAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogRUVQUk9NIGRlZmluaXRpb24gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBFRURPICAgICAgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBFRURJICAgICAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBFRUNTICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBFRVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBFRVJMICAgICAgICAgICAgICAgICAgICAgICAgMHg4MAorCisjZGVmaW5lIEVFUFJPTV9XUklURV9PUENPREUgICAgICAgICAweDA1CisjZGVmaW5lIEVFUFJPTV9SRUFEX09QQ09ERSAgICAgICAgICAweDA2CisjZGVmaW5lIEVFUFJPTV9FV0RTX09QQ09ERSAgICAgICAgICAweDEwCisjZGVmaW5lIEVFUFJPTV9FV0VOX09QQ09ERSAgICAgICAgICAweDEzCisKKyNkZWZpbmUgTlVNX0VFUFJPTV9CQlBfUEFSTVMJCTE5CS8qIEluY2x1ZGUgTklDIENvbmZpZyAwLCAxLCBDUiwgVFggQUxDIHN0ZXAsIEJCUHMgKi8KKyNkZWZpbmUgTlVNX0VFUFJPTV9UWF9HX1BBUk1TCQk3CisjZGVmaW5lIEVFUFJPTV9OSUMxX09GRlNFVCAgICAgICAgICAweDM0CS8qIFRoZSBhZGRyZXNzIGlzIGZyb20gTklDIGNvbmZpZyAwLCBub3QgQkJQIHJlZ2lzdGVyIElEICovCisjZGVmaW5lIEVFUFJPTV9OSUMyX09GRlNFVCAgICAgICAgICAweDM2CS8qIFRoZSBhZGRyZXNzIGlzIGZyb20gTklDIGNvbmZpZyAwLCBub3QgQkJQIHJlZ2lzdGVyIElEICovCisjZGVmaW5lIEVFUFJPTV9CQlBfQkFTRV9PRkZTRVQJCTB4ZjAJLyogVGhlIGFkZHJlc3MgaXMgZnJvbSBOSUMgY29uZmlnIDAsIG5vdCBCQlAgcmVnaXN0ZXIgSUQgKi8KKyNkZWZpbmUgRUVQUk9NX0dfVFhfUFdSX09GRlNFVAkJMHg1MgorI2RlZmluZSBFRVBST01fR19UWDJfUFdSX09GRlNFVAkJMHg2MAorI2RlZmluZSBFRVBST01fTEVEMV9PRkZTRVQJCQkweDNjCisjZGVmaW5lIEVFUFJPTV9MRUQyX09GRlNFVAkJCTB4M2UKKyNkZWZpbmUgRUVQUk9NX0xFRDNfT0ZGU0VUCQkJMHg0MAorI2RlZmluZSBFRVBST01fTE5BX09GRlNFVAkJCTB4NDQKKyNkZWZpbmUgRUVQUk9NX1JTU0lfQkdfT0ZGU0VUCQkweDQ2CisjZGVmaW5lIEVFUFJPTV9UWE1JWEVSX0dBSU5fMl80RwkweDQ4CisjZGVmaW5lIEVFUFJPTV9SU1NJX0FfT0ZGU0VUCQkweDRhCisjZGVmaW5lIEVFUFJPTV9UWE1JWEVSX0dBSU5fNUcJCTB4NGMKKyNkZWZpbmUgRUVQUk9NX0RFRklORV9NQVhfVFhQV1IJCTB4NGUKKyNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzJfNEcJMHhkZQkvKiAyME1IWiAyLjRHIHR4IHBvd2VyLiAqLworI2RlZmluZSBFRVBST01fVFhQT1dFUl9CWVJBVEVfNDBNSFpfMl80RwkweGVlCS8qIDQwTUhaIDIuNEcgdHggcG93ZXIuICovCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURV8yME1IWl81RwkJMHhmYQkvKiAyME1IWiA1RyB0eCBwb3dlci4gKi8KKyNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzVHCQkweDEwYQkvKiA0ME1IWiA1RyB0eCBwb3dlci4gKi8KKyNkZWZpbmUgRUVQUk9NX0FfVFhfUFdSX09GRlNFVCAgICAgIDB4NzgKKyNkZWZpbmUgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgICAgICAweGE2CisvKiNkZWZpbmUgRUVQUk9NX0phcGFuX1RYX1BXUl9PRkZTRVQgICAgICAweDkwIC8vIDgwMi4xMWogKi8KKy8qI2RlZmluZSBFRVBST01fSmFwYW5fVFgyX1BXUl9PRkZTRVQgICAgICAweGJlICovCisvKiNkZWZpbmUgRUVQUk9NX1RTU0lfUkVGX09GRlNFVCAgICAgICAgMHg1NCAqLworLyojZGVmaW5lIEVFUFJPTV9UU1NJX0RFTFRBX09GRlNFVCAgICAgIDB4MjQgKi8KKy8qI2RlZmluZSBFRVBST01fQ0NLX1RYX1BXUl9PRkZTRVQgIDB4NjIgKi8KKy8qI2RlZmluZSBFRVBST01fQ0FMSUJSQVRFX09GRlNFVCAgICAgICAweDdjICovCisjZGVmaW5lIEVFUFJPTV9WRVJTSU9OX09GRlNFVCAgICAgICAweDAyCisjZGVmaW5lIEVFUFJPTV9GUkVRX09GRlNFVAkJCTB4M2EKKyNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFCTB4ZGUJLyogMjBNSFogcG93ZXIuICovCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0RFTFRBCQkweDUwCS8qIDIwTUhaIEFORCA0MCBNSFogdXNlIGRpZmZlcmVudCBwb3dlci4gVGhpcyBpcyBkZWx0YSBpbiA0ME1IWi4gKi8KKyNkZWZpbmUgVkFMSURfRUVQUk9NX1ZFUlNJT04gICAgICAgIDEKKworLyoKKyAgKiAgIEVFUFJPTSBvcGVyYXRpb24gcmVsYXRlZCBtYXJjb3MKKyAgKi8KKyNkZWZpbmUgUlQyOHh4X0VFUFJPTV9SRUFEMTYoX3BBZCwgX29mZnNldCwgX3ZhbHVlKQkJCVwKKwkoX3BBZCktPmNoaXBPcHMuZWVyZWFkKChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopKF9wQWQpLCAodTE2KShfb2Zmc2V0KSwgKHUxNiAqKSYoX3ZhbHVlKSkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogIEUyUFJPTSBkYXRhIGxheW91dCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAqLworLyogTUNVX0xFRENTOiBNQ1UgTEVEIENvbnRyb2wgU2V0dGluZy4gKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIF9NQ1VfTEVEQ1NfU1RSVUMgeworCXN0cnVjdCB7CisJCXU4IExlZE1vZGU6NzsKKwkJdTggUG9sYXJpdHk6MTsKKwl9IGZpZWxkOworCXU4IHdvcmQ7Cit9IE1DVV9MRURDU19TVFJVQywgKlBNQ1VfTEVEQ1NfU1RSVUM7CisKKy8qICovCisvKiBFRVBST00gYW50ZW5uYSBzZWxlY3QgZm9ybWF0ICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfRUVQUk9NX0FOVEVOTkFfU1RSVUMgeworCXN0cnVjdCB7CisJCXUxNiBSeFBhdGg6NDsJLyogMTogMVIsIDI6IDJSLCAzOiAzUiAqLworCQl1MTYgVHhQYXRoOjQ7CS8qIDE6IDFULCAyOiAyVCAqLworCQl1MTYgUmZJY1R5cGU6NDsJLyogc2VlIEUyUFJPTSBkb2N1bWVudCAqLworCQl1MTYgUnN2OjQ7CisJfSBmaWVsZDsKKwl1MTYgd29yZDsKK30gRUVQUk9NX0FOVEVOTkFfU1RSVUMsICpQRUVQUk9NX0FOVEVOTkFfU1RSVUM7CisKK3R5cGVkZWYgdW5pb24gX0VFUFJPTV9OSUNfQ0lORklHMl9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTE2IEhhcmR3YXJlUmFkaW9Db250cm9sOjE7CS8qIDE6ZW5hYmxlLCAwOmRpc2FibGUgKi8KKwkJdTE2IER5bmFtaWNUeEFnY0NvbnRyb2w6MTsJLyogKi8KKwkJdTE2IEV4dGVybmFsTE5BRm9yRzoxOwkvKiAqLworCQl1MTYgRXh0ZXJuYWxMTkFGb3JBOjE7CS8qIGV4dGVybmFsIExOQSBlbmFibGUgZm9yIDIuNEcgKi8KKwkJdTE2IENhcmRidXNBY2NlbGVyYXRpb246MTsJLyogISBOT1RFOiAwIC0gZW5hYmxlLCAxIC0gZGlzYWJsZSAqLworCQl1MTYgQlc0ME1TaWRlYmFuZEZvckc6MTsKKwkJdTE2IEJXNDBNU2lkZWJhbmRGb3JBOjE7CisJCXUxNiBFbmFibGVXUFNQQkM6MTsJLyogV1BTIFBCQyBDb250cm9sIGJpdCAqLworCQl1MTYgQlc0ME1BdmFpbEZvckc6MTsJLyogMDplbmFibGUsIDE6ZGlzYWJsZSAqLworCQl1MTYgQlc0ME1BdmFpbEZvckE6MTsJLyogMDplbmFibGUsIDE6ZGlzYWJsZSAqLworCQl1MTYgUnN2MToxOwkvKiBtdXN0IGJlIDAgKi8KKwkJdTE2IEFudERpdmVyc2l0eToxOwkvKiBBbnRlbm5hIGRpdmVyc2l0eSAqLworCQl1MTYgUnN2MjozOwkvKiBtdXN0IGJlIDAgKi8KKwkJdTE2IERBQ1Rlc3RCaXQ6MTsJLyogY29udHJvbCBpZiBkcml2ZXIgc2hvdWxkIHBhdGNoIHRoZSBEQUMgaXNzdWUgKi8KKwl9IGZpZWxkOworCXUxNiB3b3JkOworfSBFRVBST01fTklDX0NPTkZJRzJfU1RSVUMsICpQRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDOworCisvKiAqLworLyogVFhfUFdSIFZhbHVlIHZhbGlkIHJhbmdlIDB4RkEoLTYpIH4gMHgyNCgzNikgKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIF9FRVBST01fVFhfUFdSX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQljaGFyIEJ5dGUwOwkvKiBMb3cgQnl0ZSAqLworCQljaGFyIEJ5dGUxOwkvKiBIaWdoIEJ5dGUgKi8KKwl9IGZpZWxkOworCXUxNiB3b3JkOworfSBFRVBST01fVFhfUFdSX1NUUlVDLCAqUEVFUFJPTV9UWF9QV1JfU1RSVUM7CisKK3R5cGVkZWYgdW5pb24gX0VFUFJPTV9WRVJTSU9OX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1OCBGYWVSZWxlYXNlTnVtYmVyOwkvKiBMb3cgQnl0ZSAqLworCQl1OCBWZXJzaW9uOwkvKiBIaWdoIEJ5dGUgKi8KKwl9IGZpZWxkOworCXUxNiB3b3JkOworfSBFRVBST01fVkVSU0lPTl9TVFJVQywgKlBFRVBST01fVkVSU0lPTl9TVFJVQzsKKwordHlwZWRlZiB1bmlvbiBfRUVQUk9NX0xFRF9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTE2IFBvbGFyaXR5UkRZX0c6MTsJLyogUG9sYXJpdHkgUkRZX0cgc2V0dGluZy4gKi8KKwkJdTE2IFBvbGFyaXR5UkRZX0E6MTsJLyogUG9sYXJpdHkgUkRZX0Egc2V0dGluZy4gKi8KKwkJdTE2IFBvbGFyaXR5QUNUOjE7CS8qIFBvbGFyaXR5IEFDVCBzZXR0aW5nLiAqLworCQl1MTYgUG9sYXJpdHlHUElPXzA6MTsJLyogUG9sYXJpdHkgR1BJTyMwIHNldHRpbmcuICovCisJCXUxNiBQb2xhcml0eUdQSU9fMToxOwkvKiBQb2xhcml0eSBHUElPIzEgc2V0dGluZy4gKi8KKwkJdTE2IFBvbGFyaXR5R1BJT18yOjE7CS8qIFBvbGFyaXR5IEdQSU8jMiBzZXR0aW5nLiAqLworCQl1MTYgUG9sYXJpdHlHUElPXzM6MTsJLyogUG9sYXJpdHkgR1BJTyMzIHNldHRpbmcuICovCisJCXUxNiBQb2xhcml0eUdQSU9fNDoxOwkvKiBQb2xhcml0eSBHUElPIzQgc2V0dGluZy4gKi8KKwkJdTE2IExlZE1vZGU6NTsJLyogTGVkIG1vZGUuICovCisJCXUxNiBSc3ZkOjM7CS8qIFJlc2VydmVkICovCisJfSBmaWVsZDsKKwl1MTYgd29yZDsKK30gRUVQUk9NX0xFRF9TVFJVQywgKlBFRVBST01fTEVEX1NUUlVDOworCit0eXBlZGVmIHVuaW9uIF9FRVBST01fVFhQT1dFUl9ERUxUQV9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTggRGVsdGFWYWx1ZTo2OwkvKiBUeCBQb3dlciBkYWx0YSB2YWx1ZSAoTUFYPTQpICovCisJCXU4IFR5cGU6MTsJLyogMTogcGx1cyB0aGUgZGVsdGEgdmFsdWUsIDA6IG1pbnVzIHRoZSBkZWx0YSB2YWx1ZSAqLworCQl1OCBUeFBvd2VyRW5hYmxlOjE7CS8qIEVuYWJsZSAqLworCX0gZmllbGQ7CisJdTggdmFsdWU7Cit9IEVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDLCAqUEVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDOworCisjZW5kaWYgLyogX19SVE1QX0NISVBfSF9fIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfY2tpcG1pYy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2NraXBtaWMuaAppbmRleCAzOTk1NWI5Li42ZmY5MzVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfY2tpcG1pYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9ja2lwbWljLmgKQEAgLTM3LDQyICszNywyNyBAQAogI2lmbmRlZglfX1JUTVBfQ0tJUE1JQ19IX18KICNkZWZpbmUJX19SVE1QX0NLSVBNSUNfSF9fCiAKLXR5cGVkZWYJc3RydWN0CV9NSUNfQ09OVEVYVAl7CitzdHJ1Y3QgcnRfbWljX2NvbnRleHQgewogCS8qIC0tLSBNTUggY29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCVVDSEFSCQlDS1sxNl07CQkJCS8qIHRoZSBrZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCVVDSEFSCQljb2VmZmljaWVudFsxNl07CS8qIGN1cnJlbnQgYWVzIGNvdW50ZXIgbW9kZSBjb2VmZmljaWVudHMgICAgICAqLwotCVVMT05HTE9ORwlhY2N1bTsJCQkJLyogYWNjdW11bGF0ZWQgbWljLCByZWR1Y2VkIHRvIHUzMiBpbiBmaW5hbCgpICovCi0JVUlOVAkJcG9zaXRpb247CQkJLyogY3VycmVudCBwb3NpdGlvbiAoYnl0ZSBvZmZzZXQpIGluIG1lc3NhZ2UgICovCi0JVUNIQVIJCXBhcnRbNF07CQkJLyogZm9yIGNvbnZlcnNpb24gb2YgbWVzc2FnZSB0byB1MzIgZm9yIG1taCAgICovCi19CU1JQ19DT05URVhULCAqUE1JQ19DT05URVhUOworCXU4IENLWzE2XTsJCS8qIHRoZSBrZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXU4IGNvZWZmaWNpZW50WzE2XTsJLyogY3VycmVudCBhZXMgY291bnRlciBtb2RlIGNvZWZmaWNpZW50cyAgICAgICovCisJdW5zaWduZWQgbG9uZyBsb25nIGFjY3VtOwkvKiBhY2N1bXVsYXRlZCBtaWMsIHJlZHVjZWQgdG8gdTMyIGluIGZpbmFsKCkgKi8KKwl1MzIgcG9zaXRpb247CQkvKiBjdXJyZW50IHBvc2l0aW9uIChieXRlIG9mZnNldCkgaW4gbWVzc2FnZSAgKi8KKwl1OCBwYXJ0WzRdOwkJLyogZm9yIGNvbnZlcnNpb24gb2YgbWVzc2FnZSB0byB1MzIgZm9yIG1taCAgICovCit9OwogCi1WT0lEIHhvcl8xMjgoCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYSwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBiLAotICAgIE9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7Cit2b2lkIHhvcl8xMjgodTggKmEsIHU4ICpiLCB1OCAqb3V0KTsKIAotVUNIQVIgUlRNUENraXBTYm94KAotICAgIElOICBVQ0hBUiAgICAgICAgICAgICAgIGEpOwordTggUlRNUENraXBTYm94KHU4IGEpOwogCi1WT0lEIHhvcl8zMigKLSAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBhLAotICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGIsCi0gICAgT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKK3ZvaWQgeG9yXzMyKHU4ICphLCB1OCAqYiwgdTggKm91dCk7CiAKLVZPSUQgbmV4dF9rZXkoCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAga2V5LAotICAgIElOICBJTlQgICAgICAgICAgICAgICAgIHJvdW5kKTsKK3ZvaWQgbmV4dF9rZXkodTggKmtleSwgaW50IHJvdW5kKTsKIAotVk9JRCBieXRlX3N1YigKLSAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKLSAgICBPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOwordm9pZCBieXRlX3N1Yih1OCAqaW4sIHU4ICpvdXQpOwogCi1WT0lEIHNoaWZ0X3JvdygKLSAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKLSAgICBPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOwordm9pZCBzaGlmdF9yb3codTggKmluLCB1OCAqb3V0KTsKIAotVk9JRCBtaXhfY29sdW1uKAotICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGluLAotICAgIE9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7Cit2b2lkIG1peF9jb2x1bW4odTggKmluLCB1OCAqb3V0KTsKIAotI2VuZGlmIC8vX19SVE1QX0NLSVBNSUNfSF9fCisjZW5kaWYgLypfX1JUTVBfQ0tJUE1JQ19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9kZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9kZWYuaAppbmRleCBmNWZlZTU3Li45YzU0YmFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfZGVmLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2RlZi5oCkBAIC00MSw5ICs0MSw5IEBACiAKICNpbmNsdWRlICJvaWQuaCIKIAotLy8KLS8vICBEZWJ1ZyBpbmZvcm1hdGlvbiB2ZXJib3NpdHk6IGxvd2VyIHZhbHVlcyBpbmRpY2F0ZSBoaWdoZXIgdXJnZW5jeQotLy8KKy8qICovCisvKiAgRGVidWcgaW5mb3JtYXRpb24gdmVyYm9zaXR5OiBsb3dlciB2YWx1ZXMgaW5kaWNhdGUgaGlnaGVyIHVyZ2VuY3kgKi8KKy8qICovCiAjZGVmaW5lIFJUX0RFQlVHX09GRiAgICAgICAgMAogI2RlZmluZSBSVF9ERUJVR19FUlJPUiAgICAgIDEKICNkZWZpbmUgUlRfREVCVUdfV0FSTiAgICAgICAyCkBAIC01MSwxMTEgKzUxLDEwMSBAQAogI2RlZmluZSBSVF9ERUJVR19JTkZPICAgICAgIDQKICNkZWZpbmUgUlRfREVCVUdfTE9VRCAgICAgICA1CiAKLSNkZWZpbmUgTklDX1RBRyAgICAgICAgICAgICAoKFVMT05HKScwNjgyJykKLSNkZWZpbmUgTklDX0RCR19TVFJJTkcgICAgICAoIioqUlQyOHh4KioiKQorI2RlZmluZSBOSUNfVEFHICAgICAgICAgICAgICgodW5zaWduZWQgbG9uZyknMDY4MicpCisjZGVmaW5lIE5JQ19EQkdfY2hhciAgICAgICgiKipSVDI4eHgqKiIpCiAKLSNkZWZpbmUgUkFMSU5LXzI4ODNfVkVSU0lPTgkJKChVSU5UMzIpMHgyODgzMDMwMCkKLSNkZWZpbmUgUkFMSU5LXzI4ODBFX1ZFUlNJT04JKChVSU5UMzIpMHgyODcyMDIwMCkKLSNkZWZpbmUgUkFMSU5LXzMwNzBfVkVSU0lPTgkJKChVSU5UMzIpMHgzMDcwMDIwMCkKLQotLy8KLS8vIE5ESVMgdmVyc2lvbiBpbiB1c2UgYnkgdGhlIE5JQyBkcml2ZXIuCi0vLyBUaGUgaGlnaCBieXRlIGlzIHRoZSBtYWpvciB2ZXJzaW9uLiBUaGUgbG93IGJ5dGUgaXMgdGhlIG1pbm9yIHZlcnNpb24uCi0vLwotI2lmZGVmICBORElTNTFfTUlOSVBPUlQKLSNkZWZpbmUgTklDX0RSSVZFUl9WRVJTSU9OICAgICAgMHgwNTAxCi0jZWxzZQotI2RlZmluZSBOSUNfRFJJVkVSX1ZFUlNJT04gICAgICAweDA1MDAKLSNlbmRpZgotCi0vLwotLy8gTkRJUyBtZWRpYSB0eXBlLCBjdXJyZW50IGlzIGV0aGVybmV0LCBjaGFuZ2UgaWYgbmF0aXZlIHdpcmVsZXNzIHN1cHBvcnRlZAotLy8KLSNkZWZpbmUgTklDX01FRElBX1RZUEUgICAgICAgICAgTmRpc01lZGl1bTgwMl8zCi0jZGVmaW5lIE5JQ19QQ0lfSERSX0xFTkdUSCAgICAgIDB4ZTIKLSNkZWZpbmUgTklDX01BWF9QQUNLRVRfU0laRSAgICAgMjMwNAotI2RlZmluZSBOSUNfSEVBREVSX1NJWkUgICAgICAgICAxNAotI2RlZmluZSBNQVhfTUFQX1JFR0lTVEVSU19ORUVERUQgMzIKLSNkZWZpbmUgTUlOX01BUF9SRUdJU1RFUlNfTkVFREVEIDIgICAvL1RvZG86IHNob3VsZCBjb25zaWRlciBmcmFnbWVudCBpc3N1ZS4KLQotLy8KLS8vIGludGVyZmFjZSB0eXBlLCB3ZSB1c2UgUENJCi0vLwotI2RlZmluZSBOSUNfSU5URVJGQUNFX1RZUEUgICAgICBOZGlzSW50ZXJmYWNlUGNpCi0jZGVmaW5lIE5JQ19JTlRFUlJVUFRfTU9ERSAgICAgIE5kaXNJbnRlcnJ1cHRMZXZlbFNlbnNpdGl2ZQotCi0vLwotLy8gYnVmZmVyIHNpemUgcGFzc2VkIGluIE5kaXNNUXVlcnlBZGFwdGVyUmVzb3VyY2VzCi0vLyBXZSBzaG91bGQgb25seSBuZWVkIHRocmVlIGFkYXB0ZXIgcmVzb3VyY2VzIChJTywgaW50ZXJydXB0IGFuZCBtZW1vcnkpLAotLy8gU29tZSBkZXZpY2VzIGdldCBleHRyYSByZXNvdXJjZXMsIHNvIGhhdmUgcm9vbSBmb3IgMTAgcmVzb3VyY2VzCi0vLyAgICAgICAgICAgICAgICAgICAgVUZfU0laRSAgIChzaXplb2YoTkRJU19SRVNPVVJDRV9MSVNUKSArICgxMCpzaXplb2YoQ01fUEFSVElBTF9SRVNPVVJDRV9ERVNDUklQVE9SKSkpCi0KLQotI2RlZmluZSBOSUNfUkVTT1VSQ0VfQi8vCi0vLyBJTyBzcGFjZSBsZW5ndGgKLS8vCi0jZGVmaW5lIE5JQ19NQVBfSU9TUEFDRV9MRU5HVEggIHNpemVvZihDU1JfU1RSVUMpCi0KLSNkZWZpbmUgTUFYX1JYX1BLVF9MRU4JMTUyMAotCi0vLwotLy8gRW50cnkgbnVtYmVyIGZvciBlYWNoIERNQSBkZXNjcmlwdG9yIHJpbmcKLS8vCi0KLSNpZmRlZiBSVDI4NjAKLSNkZWZpbmUgVFhfUklOR19TSVpFICAgICAgICAgICAgNjQgLy82NAotI2RlZmluZSBNR01UX1JJTkdfU0laRSAgICAgICAgICAxMjgKLSNkZWZpbmUgUlhfUklOR19TSVpFICAgICAgICAgICAgMTI4IC8vNjQKLSNkZWZpbmUgTUFYX1RYX1BST0NFU1MgICAgICAgICAgVFhfUklOR19TSVpFIC8vOAotI2RlZmluZSBNQVhfRE1BX0RPTkVfUFJPQ0VTUyAgICBUWF9SSU5HX1NJWkUKLSNkZWZpbmUgTUFYX1RYX0RPTkVfUFJPQ0VTUyAgICAgVFhfUklOR19TSVpFIC8vOAotI2RlZmluZSBMT0NBTF9UWEJVRl9TSVpFICAgICAgICAyCi0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLSNkZWZpbmUgVFhfUklOR19TSVpFICAgICAgICAgICAgOCAvLyAxCisjaWZkZWYgUlRNUF9NQUNfVVNCCisjZGVmaW5lIFRYX1JJTkdfU0laRSAgICAgICAgICAgIDgJLyogMSAqLwogI2RlZmluZSBQUklPX1JJTkdfU0laRSAgICAgICAgICA4Ci0jZGVmaW5lIE1HTVRfUklOR19TSVpFICAgICAgIDMyIC8vIFBSSU9fUklOR19TSVpFCisjZGVmaW5lIE1HTVRfUklOR19TSVpFCQkzMgkvKiBQUklPX1JJTkdfU0laRSAqLwogI2RlZmluZSBSWF9SSU5HX1NJWkUgICAgICAgICAgICA4CiAjZGVmaW5lIE1BWF9UWF9QUk9DRVNTICAgICAgICAgIDQKICNkZWZpbmUgTE9DQUxfVFhCVUZfU0laRSAgICAgICAgMjA0OAotI2VuZGlmIC8vIFJUMjg3MCAvLworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCi0jZGVmaW5lIE1BWF9SWF9QUk9DRVNTICAgICAgICAgIDEyOCAvLzY0IC8vMzIKKy8qI2RlZmluZSBQQUNLRUQgKi8KKworI2RlZmluZSBSQUxJTktfMjg4M19WRVJTSU9OCQkoKHUzMikweDI4ODMwMzAwKQorI2RlZmluZSBSQUxJTktfMjg4MEVfVkVSU0lPTgkoKHUzMikweDI4NzIwMjAwKQorI2RlZmluZSBSQUxJTktfMzA3MF9WRVJTSU9OCQkoKHUzMikweDMwNzAwMjAwKQorCisjZGVmaW5lIE1BWF9SWF9QS1RfTEVOCTE1MjAKKworLyogKi8KKy8qIEVudHJ5IG51bWJlciBmb3IgZWFjaCBETUEgZGVzY3JpcHRvciByaW5nICovCisvKiAqLworCisjaWZkZWYgUlRNUF9NQUNfUENJCisjZGVmaW5lIFRYX1JJTkdfU0laRSAgICAgICAgICAgIDY0CS8qNjQgKi8KKyNkZWZpbmUgTUdNVF9SSU5HX1NJWkUgICAgICAgICAgMTI4CisjZGVmaW5lIFJYX1JJTkdfU0laRSAgICAgICAgICAgIDEyOAkvKjY0ICovCisjZGVmaW5lIE1BWF9UWF9QUk9DRVNTICAgICAgICAgIFRYX1JJTkdfU0laRQkvKjggKi8KKyNkZWZpbmUgTUFYX0RNQV9ET05FX1BST0NFU1MgICAgVFhfUklOR19TSVpFCisjZGVmaW5lIE1BWF9UWF9ET05FX1BST0NFU1MgICAgIFRYX1JJTkdfU0laRQkvKjggKi8KKyNkZWZpbmUgTE9DQUxfVFhCVUZfU0laRSAgICAgICAgMgorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCisjZGVmaW5lIE1BWF9SWF9QUk9DRVNTICAgICAgICAgIDEyOAkvKjY0IC8vMzIgKi8KICNkZWZpbmUgTlVNX09GX0xPQ0FMX1RYQlVGICAgICAgMgogI2RlZmluZSBUWERfU0laRSAgICAgICAgICAgICAgICAxNgogI2RlZmluZSBUWFdJX1NJWkUgICAgICAgICAgICAgICAxNgogI2RlZmluZSBSWERfU0laRSAgICAgICAgICAgICAgIAkxNgogI2RlZmluZSBSWFdJX1NJWkUgICAgICAgICAgICAgCTE2Ci0vLyBUWElORk9fU0laRSArIFRYV0lfU0laRSArIDgwMi4xMSBIZWFkZXIgU2l6ZSArIEFNU0RVIHN1YiBmcmFtZSBoZWFkZXIKLSNkZWZpbmUgVFhfRE1BXzFTVF9CVUZGRVJfU0laRSAgOTYgICAgLy8gb25seSB0aGUgMXN0IHBoeXNpY2FsIGJ1ZmZlciBpcyBwcmUtYWxsb2NhdGVkCi0jZGVmaW5lIE1HTVRfRE1BX0JVRkZFUl9TSVpFICAgIDE1MzYgLy8yMDQ4Ci0jZGVmaW5lIFJYX0JVRkZFUl9BR0dSRVNJWkUgICAgIDM4NDAgLy8zOTA0IC8vMzk2OCAvLzQwOTYgLy8yMDQ4IC8vNDA5NgotI2RlZmluZSBSWF9CVUZGRVJfTk9STVNJWkUgICAgICAzODQwIC8vMzkwNCAvLzM5NjggLy80MDk2IC8vMjA0OCAvLzQwOTYKKy8qIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgODAyLjExIEhlYWRlciBTaXplICsgQU1TRFUgc3ViIGZyYW1lIGhlYWRlciAqLworI2RlZmluZSBUWF9ETUFfMVNUX0JVRkZFUl9TSVpFICA5NgkvKiBvbmx5IHRoZSAxc3QgcGh5c2ljYWwgYnVmZmVyIGlzIHByZS1hbGxvY2F0ZWQgKi8KKyNkZWZpbmUgTUdNVF9ETUFfQlVGRkVSX1NJWkUgICAgMTUzNgkvKjIwNDggKi8KKyNkZWZpbmUgUlhfQlVGRkVSX0FHR1JFU0laRSAgICAgMzg0MAkvKjM5MDQgLy8zOTY4IC8vNDA5NiAvLzIwNDggLy80MDk2ICovCisjZGVmaW5lIFJYX0JVRkZFUl9OT1JNU0laRSAgICAgIDM4NDAJLyozOTA0IC8vMzk2OCAvLzQwOTYgLy8yMDQ4IC8vNDA5NiAqLwogI2RlZmluZSBUWF9CVUZGRVJfTk9STVNJWkUJCVJYX0JVRkZFUl9OT1JNU0laRQotI2RlZmluZSBNQVhfRlJBTUVfU0laRSAgICAgICAgICAyMzQ2ICAgICAgICAgICAgICAgICAgICAvLyBNYXhpbXVtIDgwMi4xMSBmcmFtZSBzaXplCi0jZGVmaW5lIE1BWF9BR0dSRUdBVElPTl9TSVpFICAgIDM4NDAgLy8zOTA0IC8vMzk2OCAvLzQwOTYKKyNkZWZpbmUgTUFYX0ZSQU1FX1NJWkUgICAgICAgICAgMjM0NgkvKiBNYXhpbXVtIDgwMi4xMSBmcmFtZSBzaXplICovCisjZGVmaW5lIE1BWF9BR0dSRUdBVElPTl9TSVpFICAgIDM4NDAJLyozOTA0IC8vMzk2OCAvLzQwOTYgKi8KICNkZWZpbmUgTUFYX05VTV9PRl9UVVBMRV9DQUNIRSAgMgogI2RlZmluZSBNQVhfTUNBU1RfTElTVF9TSVpFICAgICAzMgogI2RlZmluZSBNQVhfTEVOX09GX1ZFTkRPUl9ERVNDICA2NAotLy8jZGVmaW5lIE1BWF9TSVpFX09GX01DQVNUX1BTUSAgIChOVU1fT0ZfTE9DQUxfVFhCVUYgPj4gMikgLy8gQVAgd29uJ3Qgc3BlbmQgbW9yZSB0aGFuIDEvNCBvZiB0b3RhbCBidWZmZXJzIG9uIE0vQkNBU1QgUFNRCisvKiNkZWZpbmUgTUFYX1NJWkVfT0ZfTUNBU1RfUFNRICAgKE5VTV9PRl9MT0NBTF9UWEJVRiA+PiAyKSAvLyBBUCB3b24ndCBzcGVuZCBtb3JlIHRoYW4gMS80IG9mIHRvdGFsIGJ1ZmZlcnMgb24gTS9CQ0FTVCBQU1EgKi8KICNkZWZpbmUgTUFYX1NJWkVfT0ZfTUNBU1RfUFNRICAgICAgICAgICAgICAgMzIKIAogI2RlZmluZSBNQVhfUlhfUFJPQ0VTU19DTlQJKFJYX1JJTkdfU0laRSkKIAorLyoKKwlXTU0gTm90ZTogSWYgbWVtb3J5IG9mIHlvdXIgc3lzdGVtIGlzIG5vdCBtdWNoLCBwbGVhc2UgcmVkdWNlIHRoZSBkZWZpbml0aW9uOworCW9yIHdoZW4geW91IGRvIFdNTSB0ZXN0LCB0aGUgcXVldWUgZm9yIGxvdyBwcmlvcml0eSBBQyB3aWxsIGJlIGZ1bGwsIGkuZS4KKwlUWF9SSU5HX1NJWkUgKyBNQVhfUEFDS0VUU19JTl9RVUVVRSBwYWNrZXRzIGZvciB0aGUgQUMgd2lsbCBiZSBidWZmZXJlZCBpbgorCVdMQU4sIG1heWJlIG5vIGFueSBwYWNrZXQgYnVmZmVyIGNhbiBiZSBnb3QgaW4gRXRoZXJuZXQgZHJpdmVyLgogCi0jZGVmaW5lIE1BWF9QQUNLRVRTX0lOX1FVRVVFCQkJCSg1MTIpIC8vKDUxMikgICAgLy8gdG8gcGFzcyBXTU0gQTUtV1BBUFNLCisJU29tZXRpbWVzIG5vIHBhY2tldCBidWZmZXIgY2FuIGJlIGdvdCBpbiBFdGhlcm5ldCBkcml2ZXIsIHRoZSBzeXN0ZW0gd2lsbAorCXNlbmQgZmxvdyBjb250cm9sIHBhY2tldCB0byB0aGUgc2VuZGVyIHRvIHNsb3cgZG93biBpdHMgc2VuZGluZyByYXRlLgorCVNvIG5vIFdNTSBjYW4gYmUgc2F3IGluIHRoZSBhaXIuCisqLworCisvKgorCU5lZWQgdG8gdXNlIDY0IGluIHZ4d29ya3MgZm9yIHRlc3QgY2FzZSBXTU0gQTUtVDA3CisJVHdvIGRubGluayAoMTBNYnBzKSBmcm9tIGEgV01NIHN0YXRpb24gdG8gYSBub24tV01NIHN0YXRpb24uCisJSWYgdXNlIDI1NiwgcXVldWUgaXMgbm90IGVub3VnaC4KKwlBbmQgaW4gcnRfbWFpbl9lbmQuYywgY2xDb25maWcuY2xOdW0gPSBSWF9SSU5HX1NJWkUgKiAzOyBpcyBjaGFuZ2VkIHRvCisJY2xDb25maWcuY2xOdW0gPSBSWF9SSU5HX1NJWkUgKiA0OworKi8KKy8qIFRPRE86IEZvciBWeFdvcmtzIHRoZSBzaXplIGlzIDI1Ni4gU2hhbGwgd2UgY2FobmdlIHRoZSB2YWx1ZSBhcyAyNTYgZm9yIGFsbCBPUz8/Pz8/ICovCisjZGVmaW5lIE1BWF9QQUNLRVRTX0lOX1FVRVVFCQkJCSg1MTIpCS8qKDUxMikgICAgLy8gdG8gcGFzcyBXTU0gQTUtV1BBUFNLICovCisKICNkZWZpbmUgTUFYX1BBQ0tFVFNfSU5fTUNBU1RfUFNfUVVFVUUJCTMyCi0jZGVmaW5lIE1BWF9QQUNLRVRTX0lOX1BTX1FVRVVFCQkJCTEyOAkvLzMyCi0jZGVmaW5lIFdNTV9OVU1fT0ZfQUMgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEFDMCwgQUMxLCBBQzIsIGFuZCBBQzMgKi8KKyNkZWZpbmUgTUFYX1BBQ0tFVFNfSU5fUFNfUVVFVUUJCQkJMTI4CS8qMzIgKi8KKyNkZWZpbmUgV01NX05VTV9PRl9BQyAgICAgICAgICAgICAgICAgICAgICAgNAkvKiBBQzAsIEFDMSwgQUMyLCBhbmQgQUMzICovCiAKKyNpZmRlZiBSVE1QX0VGVVNFX1NVUFBPUlQKKy8qMjAwOC8wOS8xMTpLSCBhZGQgdG8gc3VwcG9ydCBlZnVzZTwtLSAqLwogI2RlZmluZSBNQVhfRUVQUk9NX0JJTl9GSUxFX1NJWkUJCQkJCTEwMjQKKyNkZWZpbmUgRUZVU0VfQlVGRkVSX1BBVEgJCQkJCQkiL3RtcC9SVDMweHhFRVBST00uYmluIgorLyoyMDA4LzA5LzExOktIIGFkZCB0byBzdXBwb3J0IGVmdXNlLS0+ICovCisjZW5kaWYgLyogUlRNUF9FRlVTRV9TVVBQT1JUIC8vICovCiAKLS8vIFJ4RmlsdGVyCisvKiBSeEZpbHRlciAqLwogI2RlZmluZSBTVEFOT1JNQUwJIDB4MTdmOTcKICNkZWZpbmUgQVBOT1JNQUwJIDB4MTVmOTcKLS8vCi0vLyAgUlRNUF9BREFQVEVSIGZsYWdzCi0vLworI2RlZmluZSBQU1BYTElOSwkgMHgxN2Y5MworLyogKi8KKy8qICBzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyIGZsYWdzICovCisvKiAqLwogI2RlZmluZSBmUlRNUF9BREFQVEVSX01BUF9SRUdJU1RFUiAgICAgICAgICAweDAwMDAwMDAxCiAjZGVmaW5lIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSAgICAgIDB4MDAwMDAwMDIKICNkZWZpbmUgZlJUTVBfQURBUFRFUl9IQVJEV0FSRV9FUlJPUiAgICAgICAgMHgwMDAwMDAwNApAQCAtMTgxLDEzICsxNzEsMTMgQEAKICNkZWZpbmUgZlJUTVBfQURBUFRFUl9TQ0FOXzIwNDAgCQkJMHgwNDAwMDAwMAogI2RlZmluZQlmUlRNUF9BREFQVEVSX1JBRElPX01FQVNVUkVNRU5UCQkweDA4MDAwMDAwCiAKLSNkZWZpbmUgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCAgICAgICAgIAkJMHgxMDAwMDAwMAkvL0Rldml2ZSBhbHJlYWR5IGluaXRpYWxpemVkIGFuZCBlbmFibGVkIFR4L1J4LgorI2RlZmluZSBmUlRNUF9BREFQVEVSX1NUQVJUX1VQICAgICAgICAgCQkweDEwMDAwMDAwCS8qRGV2aXZlIGFscmVhZHkgaW5pdGlhbGl6ZWQgYW5kIGVuYWJsZWQgVHgvUnguICovCiAjZGVmaW5lIGZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfQ0hBTkdFICAgIDB4MjAwMDAwMDAKICNkZWZpbmUgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRiAgICAgICAgMHg0MDAwMDAwMAogCi0vLwotLy8gIFNUQSBvcGVyYXRpb24gc3RhdHVzIGZsYWdzCi0vLworLyogKi8KKy8qICBTVEEgb3BlcmF0aW9uIHN0YXR1cyBmbGFncyAqLworLyogKi8KICNkZWZpbmUgZk9QX1NUQVRVU19JTkZSQV9PTiAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQogI2RlZmluZSBmT1BfU1RBVFVTX0FESE9DX09OICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCiAjZGVmaW5lIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQgICAgIDB4MDAwMDAwMDQKQEAgLTE5NywyOCArMTg3LDM0IEBACiAjZGVmaW5lIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEICAgIDB4MDAwMDAwODAKICNkZWZpbmUgZk9QX1NUQVRVU19XTU1fSU5VU0VEICAgICAgICAgICAgICAgMHgwMDAwMDEwMAogI2RlZmluZSBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCAgICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIGZPUF9TVEFUVVNfRE9aRSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAgIC8vIGRlYnVnIHB1cnBvc2UKLSNkZWZpbmUgZk9QX1NUQVRVU19QSUdHWUJBQ0tfSU5VU0VEICAgICAgICAgMHgwMDAwMDgwMCAgLy8gcGlnZ3ktYmFjaywgYW5kIGFnZ3JlZ2F0aW9uCisjZGVmaW5lIGZPUF9TVEFUVVNfRE9aRSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAJLyogZGVidWcgcHVycG9zZSAqLworI2RlZmluZSBmT1BfU1RBVFVTX1BJR0dZQkFDS19JTlVTRUQgICAgICAgICAweDAwMDAwODAwCS8qIHBpZ2d5LWJhY2ssIGFuZCBhZ2dyZWdhdGlvbiAqLwogI2RlZmluZSBmT1BfU1RBVFVTX0FQU0RfSU5VU0VECQkJCTB4MDAwMDEwMDAKICNkZWZpbmUgZk9QX1NUQVRVU19UWF9BTVNEVV9JTlVTRUQJCQkweDAwMDAyMDAwCiAjZGVmaW5lIGZPUF9TVEFUVVNfTUFYX1JFVFJZX0VOQUJMRUQJCTB4MDAwMDQwMDAKICNkZWZpbmUgZk9QX1NUQVRVU19XQUtFVVBfTk9XICAgICAgICAgICAgICAgMHgwMDAwODAwMAotI2RlZmluZSBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSBmT1BfU1RBVFVTX1BDSUVfREVWSUNFCiAKLSNpZmRlZiBSVDI4NjAKLS8vCi0vLyAgUlRNUF9BREFQVEVSIFBTRmxhZ3MgOiByZWxhdGVkIHRvIGFkdmFuY2VkIHBvd2VyIHNhdmUuCi0vLwotLy8gSW5kaWNhdGUgd2hldGhlciBkcml2ZXIgY2FuIGdvIHRvIHNsZWVwIG1vZGUgZnJvbSBub3cuIFRoaXMgZmxhZyBpcyB1c2VmdWwgQUZURVIgbGluayB1cAorLyogKi8KKy8qICBzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyIFBTRmxhZ3MgOiByZWxhdGVkIHRvIGFkdmFuY2VkIHBvd2VyIHNhdmUuICovCisvKiAqLworLyogSW5kaWNhdGUgd2hldGhlciBkcml2ZXIgY2FuIGdvIHRvIHNsZWVwIG1vZGUgZnJvbSBub3cuIFRoaXMgZmxhZyBpcyB1c2VmdWwgQUZURVIgbGluayB1cCAqLwogI2RlZmluZSBmUlRNUF9QU19DQU5fR09fU0xFRVAgICAgICAgICAgMHgwMDAwMDAwMQotLy8gSW5kaWNhdGUgd2hldGhlciBkcml2ZXIgaGFzIGlzc3VlIGEgTGlua0NvbnRyb2wgY29tbWFuZCB0byBQQ0llIEwxCisvKiBJbmRpY2F0ZSB3aGV0aGVyIGRyaXZlciBoYXMgaXNzdWUgYSBMaW5rQ29udHJvbCBjb21tYW5kIHRvIFBDSWUgTDEgKi8KICNkZWZpbmUgZlJUTVBfUFNfU0VUX1BDSV9DTEtfT0ZGX0NPTU1BTkQgICAgICAgICAgMHgwMDAwMDAwMgotLy8gSW5kaWNhdGUgZHJpdmVyIHNob3VsZCBkaXNhYmxlIGtpY2sgb2ZmIGhhcmR3YXJlIHRvIHNlbmQgcGFja2V0cyBmcm9tIG5vdy4KKy8qIEluZGljYXRlIGRyaXZlciBzaG91bGQgZGlzYWJsZSBraWNrIG9mZiBoYXJkd2FyZSB0byBzZW5kIHBhY2tldHMgZnJvbSBub3cuICovCiAjZGVmaW5lIGZSVE1QX1BTX0RJU0FCTEVfVFggICAgICAgICAweDAwMDAwMDA0Ci0vLyBJbmRpY2F0ZSBkcml2ZXIgc2hvdWxkIElNTUVESUFURUxZIGZvIHRvIHNsZWVwIGFmdGVyIHJlY2VpdmluZyBBUCdzIGJlYWNvbiBpbiB3aGljaCAgZG9lc24ndCBpbmRpY2F0ZSB1bmljYXRlIG5vciBtdWx0aWNhc3QgcGFja2V0cyBmb3IgbWUKLS8vLiBUaGlzIGZsYWcgaXMgdXNlZCBPTkxZIGluIFJUTVBIYW5kbGVSeERvbmVJbnRlcnJ1cHQgcm91dGluZS4KKy8qIEluZGljYXRlIGRyaXZlciBzaG91bGQgSU1NRURJQVRFTFkgZm8gdG8gc2xlZXAgYWZ0ZXIgcmVjZWl2aW5nIEFQJ3MgYmVhY29uIGluIHdoaWNoICBkb2Vzbid0IGluZGljYXRlIHVuaWNhdGUgbm9yIG11bHRpY2FzdCBwYWNrZXRzIGZvciBtZSAqLworLyouIFRoaXMgZmxhZyBpcyB1c2VkIE9OTFkgaW4gUlRNUEhhbmRsZVJ4RG9uZUludGVycnVwdCByb3V0aW5lLiAqLwogI2RlZmluZSBmUlRNUF9QU19HT19UT19TTEVFUF9OT1cgICAgICAgICAweDAwMDAwMDA4Ci0jZW5kaWYKKyNkZWZpbmUgZlJUTVBfUFNfVE9HR0xFX0wxCQkweDAwMDAwMDEwCS8qIFVzZSBUb2dnbGUgTDEgbWVjaGFuaXNtIGZvciBydDI4eHggUENJZSAqLworCisjaWZkZWYgUlQzMDkwCisjZGVmaW5lIFdBS0VfTUNVX0NNRAkJCQkweDMxCisjZGVmaW5lIFNMRUVQX01DVV9DTUQJCQkJCTB4MzAKKyNkZWZpbmUgUkZPRkZfTUNVX0NNRAkJCQkweDM1CisjZW5kaWYgLyogUlQzMDkwIC8vICovCiAKICNkZWZpbmUgQ0NLU0VUUFJPVEVDVAkJMHgxCiAjZGVmaW5lIE9GRE1TRVRQUk9URUNUCQkweDIKQEAgLTIyOCwxMiArMjI0LDEyIEBACiAjZGVmaW5lIEdSNDBTRVRQUk9URUNUCQkweDIwCiAjZGVmaW5lIEFMTE5fU0VUUFJPVEVDVAkJKEdSNDBTRVRQUk9URUNUIHwgR0YyMFNFVFBST1RFQ1QgfCBNTTQwU0VUUFJPVEVDVCB8IE1NMjBTRVRQUk9URUNUKQogCi0vLwotLy8gIEFQJ3MgY2xpZW50IHRhYmxlIG9wZXJhdGlvbiBzdGF0dXMgZmxhZ3MKLS8vCi0jZGVmaW5lIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFICAgICAgICAgIDB4MDAwMDAwMDEgIC8vIENMSUVOVCBjYW4gcGFyc2UgUU9TIERBVEEgZnJhbWUKLSNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSAgMHgwMDAwMDAwMiAgLy8gQ0xJRU5UIGNhbiByZWNlaXZlIFJhbGluaydzIHByb3ByaWV0YXJ5IFRYIGFnZ3JlZ2F0aW9uIGZyYW1lCi0jZGVmaW5lIGZDTElFTlRfU1RBVFVTX1BJR0dZQkFDS19DQVBBQkxFICAgIDB4MDAwMDAwMDQgIC8vIENMSUVOVCBzdXBwb3J0IHBpZ2d5LWJhY2sKKy8qICovCisvKiAgQVAncyBjbGllbnQgdGFibGUgb3BlcmF0aW9uIHN0YXR1cyBmbGFncyAqLworLyogKi8KKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUgICAgICAgICAgMHgwMDAwMDAwMQkvKiBDTElFTlQgY2FuIHBhcnNlIFFPUyBEQVRBIGZyYW1lICovCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX0FHR1JFR0FUSU9OX0NBUEFCTEUgIDB4MDAwMDAwMDIJLyogQ0xJRU5UIGNhbiByZWNlaXZlIFJhbGluaydzIHByb3ByaWV0YXJ5IFRYIGFnZ3JlZ2F0aW9uIGZyYW1lICovCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1BJR0dZQkFDS19DQVBBQkxFICAgIDB4MDAwMDAwMDQJLyogQ0xJRU5UIHN1cHBvcnQgcGlnZ3ktYmFjayAqLwogI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQJCQkweDAwMDAwMDA4CiAjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUJCTB4MDAwMDAwMTAKICNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRQkJMHgwMDAwMDAyMApAQCAtMjQyLDQ3ICsyMzgsNDggQEAKICNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfSFRDX0NBUEFCTEUJCQkweDAwMDAwMTAwCiAjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFCQkJMHgwMDAwMDIwMAogI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19NQ1NGRUVEQkFDS19DQVBBQkxFICAweDAwMDAwNDAwCi0jZGVmaW5lIGZDTElFTlRfU1RBVFVTX0FQU0RfQ0FQQUJMRSAgICAgICAgIDB4MDAwMDA4MDAgIC8qIFVBUFNEIFNUQVRJT04gKi8KKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfQVBTRF9DQVBBQkxFICAgICAgICAgMHgwMDAwMDgwMAkvKiBVQVBTRCBTVEFUSU9OICovCiAKICNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQJCTB4MDAxMDAwMDAKLS8vCi0vLyAgU1RBIGNvbmZpZ3VyYXRpb24gZmxhZ3MKLS8vCisvKiAqLworLyogIFNUQSBjb25maWd1cmF0aW9uIGZsYWdzICovCisvKiAqLwogCi0vLyA4MDIuMTFuIE9wZXJhdGluZyBNb2RlIERlZmluaXRpb24uIDAtMyBhbHNvIHVzZWQgaW4gQVNJQ1VQZGF0ZVByb3RlY3Qgc3dpdGNoIGNhc2UKKy8qIDgwMi4xMW4gT3BlcmF0aW5nIE1vZGUgRGVmaW5pdGlvbi4gMC0zIGFsc28gdXNlZCBpbiBBU0lDVVBkYXRlUHJvdGVjdCBzd2l0Y2ggY2FzZSAqLwogI2RlZmluZSBIVF9OT19QUk9URUNUCTAKICNkZWZpbmUgSFRfTEVHQUNZX1BST1RFQ1QJMQogI2RlZmluZSBIVF80MF9QUk9URUNUCTIKICNkZWZpbmUgSFRfMjA0MF9QUk9URUNUCTMKICNkZWZpbmUgSFRfUlRTQ1RTXzZNCTcKLS8vZm9sbG93aW5nIGlzIG91ciBvd24gZGVmaW5pdGlvbiBpbiBvcmRlciB0byB0dXJuIG9uIG91ciBBU0lDIHByb3RlY3Rpb24gcmVnaXN0ZXIgaW4gSU5GUkFTVFJVQ1RVUkUuCi0jZGVmaW5lIEhUX0FUSEVST1MJOAkvLyBydDI4NjBjIGhhcyBwcm9ibGVtIHdpdGggYXRoZXJvcyBjaGlwLiB3ZSBuZWVkIHRvIHR1cm4gb24gUlRTL0NUUyAuCi0jZGVmaW5lIEhUX0ZPUkNFUlRTQ1RTCTkJLy8gRm9yY2UgdHVybiBvbiBSVFMvQ1RTIGZpcnN0LiB0aGVuIGdvIHRvIGV2YWx1YXRlIGlmIHRoaXMgZm9yY2UgUlRTIGlzIG5lY2Vzc2FyeS4KKy8qZm9sbG93aW5nIGlzIG91ciBvd24gZGVmaW5pdGlvbiBpbiBvcmRlciB0byB0dXJuIG9uIG91ciBBU0lDIHByb3RlY3Rpb24gcmVnaXN0ZXIgaW4gSU5GUkFTVFJVQ1RVUkUuICovCisjZGVmaW5lIEhUX0FUSEVST1MJOAkvKiBydDI4NjBjIGhhcyBwcm9ibGVtIHdpdGggYXRoZXJvcyBjaGlwLiB3ZSBuZWVkIHRvIHR1cm4gb24gUlRTL0NUUyAuICovCisjZGVmaW5lIEhUX0ZPUkNFUlRTQ1RTCTkJLyogRm9yY2UgdHVybiBvbiBSVFMvQ1RTIGZpcnN0LiB0aGVuIGdvIHRvIGV2YWx1YXRlIGlmIHRoaXMgZm9yY2UgUlRTIGlzIG5lY2Vzc2FyeS4gKi8KIAotLy8KLS8vIFJYIFBhY2tldCBGaWx0ZXIgY29udHJvbCBmbGFncy4gQXBwbHkgb24gcEFkLT5QYWNrZXRGaWx0ZXIKLS8vCisvKiAqLworLyogUlggUGFja2V0IEZpbHRlciBjb250cm9sIGZsYWdzLiBBcHBseSBvbiBwQWQtPlBhY2tldEZpbHRlciAqLworLyogKi8KICNkZWZpbmUgZlJYX0ZJTFRFUl9BQ0NFUFRfRElSRUNUICAgICAgICAgICAgTkRJU19QQUNLRVRfVFlQRV9ESVJFQ1RFRAogI2RlZmluZSBmUlhfRklMVEVSX0FDQ0VQVF9NVUxUSUNBU1QgICAgICAgICBORElTX1BBQ0tFVF9UWVBFX01VTFRJQ0FTVAogI2RlZmluZSBmUlhfRklMVEVSX0FDQ0VQVF9CUk9BRENBU1QgICAgICAgICBORElTX1BBQ0tFVF9UWVBFX0JST0FEQ0FTVAogI2RlZmluZSBmUlhfRklMVEVSX0FDQ0VQVF9BTExfTVVMVElDQVNUICAgICBORElTX1BBQ0tFVF9UWVBFX0FMTF9NVUxUSUNBU1QKKyNkZWZpbmUgZlJYX0ZJTFRFUl9BQ0NFUFRfUFJPTUlTQ1VPVVMgICAgICAgTkRJU19QQUNLRVRfVFlQRV9QUk9NSVNDVU9VUwogCi0vLwotLy8gRXJyb3IgY29kZSBzZWN0aW9uCi0vLwotLy8gTkRJU19FUlJPUl9DT0RFX0FEQVBURVJfTk9UX0ZPVU5ECisvKiAqLworLyogRXJyb3IgY29kZSBzZWN0aW9uICovCisvKiAqLworLyogTkRJU19FUlJPUl9DT0RFX0FEQVBURVJfTk9UX0ZPVU5EICovCiAjZGVmaW5lIEVSUkxPR19SRUFEX1BDSV9TTE9UX0ZBSUxFRCAgICAgMHgwMDAwMDEwMUwKICNkZWZpbmUgRVJSTE9HX1dSSVRFX1BDSV9TTE9UX0ZBSUxFRCAgICAweDAwMDAwMTAyTAogI2RlZmluZSBFUlJMT0dfVkVORE9SX0RFVklDRV9OT01BVENIICAgIDB4MDAwMDAxMDNMCiAKLS8vIE5ESVNfRVJST1JfQ09ERV9BREFQVEVSX0RJU0FCTEVECisvKiBORElTX0VSUk9SX0NPREVfQURBUFRFUl9ESVNBQkxFRCAqLwogI2RlZmluZSBFUlJMT0dfQlVTX01BU1RFUl9ESVNBQkxFRCAgICAgIDB4MDAwMDAyMDFMCiAKLS8vIE5ESVNfRVJST1JfQ09ERV9VTlNVUFBPUlRFRF9DT05GSUdVUkFUSU9OCisvKiBORElTX0VSUk9SX0NPREVfVU5TVVBQT1JURURfQ09ORklHVVJBVElPTiAqLwogI2RlZmluZSBFUlJMT0dfSU5WQUxJRF9TUEVFRF9EVVBMRVggICAgIDB4MDAwMDAzMDFMCiAjZGVmaW5lIEVSUkxPR19TRVRfU0VDT05EQVJZX0ZBSUxFRCAgICAgMHgwMDAwMDMwMkwKIAotLy8gTkRJU19FUlJPUl9DT0RFX09VVF9PRl9SRVNPVVJDRVMKKy8qIE5ESVNfRVJST1JfQ09ERV9PVVRfT0ZfUkVTT1VSQ0VTICovCiAjZGVmaW5lIEVSUkxPR19PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgMHgwMDAwMDQwMUwKICNkZWZpbmUgRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZICAgICAweDAwMDAwNDAyTAogI2RlZmluZSBFUlJMT0dfT1VUX09GX01BUF9SRUdJU1RFUlMgICAgIDB4MDAwMDA0MDNMCkBAIC0yOTIsMjIgKzI4OSwyMSBAQAogI2RlZmluZSBFUlJMT0dfT1VUX09GX05ESVNfUEFDS0VUICAgICAgIDB4MDAwMDA0MDdMCiAjZGVmaW5lIEVSUkxPR19PVVRfT0ZfTE9PS0FTSURFX01FTU9SWSAgMHgwMDAwMDQwOEwKIAotLy8gTkRJU19FUlJPUl9DT0RFX0hBUkRXQVJFX0ZBSUxVUkUKKy8qIE5ESVNfRVJST1JfQ09ERV9IQVJEV0FSRV9GQUlMVVJFICovCiAjZGVmaW5lIEVSUkxPR19TRUxGVEVTVF9GQUlMRUQgICAgICAgICAgMHgwMDAwMDUwMUwKICNkZWZpbmUgRVJSTE9HX0lOSVRJQUxJWkVfQURBUFRFUiAgICAgICAweDAwMDAwNTAyTAogI2RlZmluZSBFUlJMT0dfUkVNT1ZFX01JTklQT1JUICAgICAgICAgIDB4MDAwMDA1MDNMCiAKLS8vIE5ESVNfRVJST1JfQ09ERV9SRVNPVVJDRV9DT05GTElDVAorLyogTkRJU19FUlJPUl9DT0RFX1JFU09VUkNFX0NPTkZMSUNUICovCiAjZGVmaW5lIEVSUkxPR19NQVBfSU9fU1BBQ0UgICAgICAgICAgICAgMHgwMDAwMDYwMUwKICNkZWZpbmUgRVJSTE9HX1FVRVJZX0FEQVBURVJfUkVTT1VSQ0VTICAweDAwMDAwNjAyTAogI2RlZmluZSBFUlJMT0dfTk9fSU9fUkVTT1VSQ0UgICAgICAgICAgIDB4MDAwMDA2MDNMCiAjZGVmaW5lIEVSUkxPR19OT19JTlRFUlJVUFRfUkVTT1VSQ0UgICAgMHgwMDAwMDYwNEwKICNkZWZpbmUgRVJSTE9HX05PX01FTU9SWV9SRVNPVVJDRSAgICAgICAweDAwMDAwNjA1TAogCi0KLS8vIFdEUyBkZWZpbml0aW9uCisvKiBXRFMgZGVmaW5pdGlvbiAqLwogI2RlZmluZQlNQVhfV0RTX0VOVFJZICAgICAgICAgICAgICAgNAotI2RlZmluZSBXRFNfUEFJUldJU0VfS0VZX09GRlNFVCAgICAgNjAgICAgLy8gV0RTIGxpbmtzIHVzZXMgcGFpcndpc2Uga2V5IzYwIH4gNjMgaW4gQVNJQyBwYWlyd2lzZSBrZXkgdGFibGUKKyNkZWZpbmUgV0RTX1BBSVJXSVNFX0tFWV9PRkZTRVQgICAgIDYwCS8qIFdEUyBsaW5rcyB1c2VzIHBhaXJ3aXNlIGtleSM2MCB+IDYzIGluIEFTSUMgcGFpcndpc2Uga2V5IHRhYmxlICovCiAKICNkZWZpbmUJV0RTX0RJU0FCTEVfTU9ERSAgICAgICAgICAgIDAKICNkZWZpbmUJV0RTX1JFU1RSSUNUX01PREUgICAgICAgICAgIDEKQEAgLTMxNSwyMyArMzExLDIwIEBACiAjZGVmaW5lCVdEU19SRVBFQVRFUl9NT0RFICAgICAgICAgICAzCiAjZGVmaW5lCVdEU19MQVpZX01PREUgICAgICAgICAgICAgICA0CiAKLQogI2RlZmluZSBNQVhfTUVTSF9OVU0JCQkJMAogCiAjZGVmaW5lIE1BWF9BUENMSV9OVU0JCQkJMAogCiAjZGVmaW5lIE1BWF9NQlNTSURfTlVNCQkJCTEKLSNpZiBkZWZpbmVkKFJUMjg2MCkgfHwgZGVmaW5lZChSVDMweHgpCiAjaWZkZWYgTUJTU19TVVBQT1JUCiAjdW5kZWYJTUFYX01CU1NJRF9OVU0KICNkZWZpbmUgTUFYX01CU1NJRF9OVU0JCQkJKDggLSBNQVhfTUVTSF9OVU0gLSBNQVhfQVBDTElfTlVNKQotI2VuZGlmIC8vIE1CU1NfU1VQUE9SVCAvLwotI2VuZGlmCisjZW5kaWYgLyogTUJTU19TVVBQT1JUIC8vICovCiAKIC8qIHNhbml0eSBjaGVjayBmb3IgYXBpZHggKi8KICNkZWZpbmUgTUJTU19NUl9BUElEWF9TQU5JVFlfQ0hFQ0soYXBpZHgpIFwKICAgICB7IGlmIChhcGlkeCA+IE1BWF9NQlNTSURfTlVNKSB7IFwKLSAgICAgICAgICBwcmludGsoIiVzPiBFcnJvciEgYXBpZHggPSAlZCA+IE1BWF9NQlNTSURfTlVNIVxuIiwgX19mdW5jX18sIGFwaWR4KTsgXAorICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzPiBFcnJvciEgYXBpZHggPSAlZCA+IE1BWF9NQlNTSURfTlVNIVxuIiwgX19mdW5jX18sIGFwaWR4KSk7IFwKIAkgIGFwaWR4ID0gTUFJTl9NQlNTSUQ7IH0gfQogCiAjZGVmaW5lIFZBTElEX1dDSUQoX3djaWQpCSgoX3djaWQpID4gMCAmJiAoX3djaWQpIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUgKQpAQCAtMzM5LDEyICszMzIsMTEgQEAKICNkZWZpbmUgTUFJTl9NQlNTSUQgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgRklSU1RfTUJTU0lEICAgICAgICAgICAgICAgIDEKIAotCiAjZGVmaW5lIE1BWF9CRUFDT05fU0laRQkJCQk1MTIKLS8vIElmIHRoZSBNQVhfTUJTU0lEX05VTSBpcyBsYXJnZXIgdGhhbiA2LAotLy8gaXQgc2hhbGwgcmVzZXJ2ZSBzb21lIFdDSUQgc3BhY2Uod2NpZCAyMjJ+MjUzKSBmb3IgYmVhY29uIGZyYW1lcy4KLS8vIC0JdGhlc2Ugd2NpZCAyMzh+MjUzIGFyZSByZXNlcnZlZCBmb3IgYmVhY29uIzYocmE2KS4KLS8vIC0JdGhlc2Ugd2NpZCAyMjJ+MjM3IGFyZSByZXNlcnZlZCBmb3IgYmVhY29uIzcocmE3KS4KKy8qIElmIHRoZSBNQVhfTUJTU0lEX05VTSBpcyBsYXJnZXIgdGhhbiA2LCAqLworLyogaXQgc2hhbGwgcmVzZXJ2ZSBzb21lIFdDSUQgc3BhY2Uod2NpZCAyMjJ+MjUzKSBmb3IgYmVhY29uIGZyYW1lcy4gKi8KKy8qIC0gICAgdGhlc2Ugd2NpZCAyMzh+MjUzIGFyZSByZXNlcnZlZCBmb3IgYmVhY29uIzYocmE2KS4gKi8KKy8qIC0gICAgdGhlc2Ugd2NpZCAyMjJ+MjM3IGFyZSByZXNlcnZlZCBmb3IgYmVhY29uIzcocmE3KS4gKi8KICNpZiBkZWZpbmVkKE1BWF9NQlNTSURfTlVNKSAmJiAoTUFYX01CU1NJRF9OVU0gPT0gOCkKICNkZWZpbmUgSFdfUkVTRVJWRURfV0NJRAkyMjIKICNlbGlmIGRlZmluZWQoTUFYX01CU1NJRF9OVU0pICYmIChNQVhfTUJTU0lEX05VTSA9PSA3KQpAQCAtMzUzLDE3ICszNDUsMTcgQEAKICNkZWZpbmUgSFdfUkVTRVJWRURfV0NJRAkyNTUKICNlbmRpZgogCi0vLyBUaGVuIGRlZGljYXRlIHdjaWQgb2YgREZTIGFuZCBDYXJyaWVyLVNlbnNlLgorLyogVGhlbiBkZWRpY2F0ZSB3Y2lkIG9mIERGUyBhbmQgQ2Fycmllci1TZW5zZS4gKi8KICNkZWZpbmUgREZTX0NUU19XQ0lEIAkJKEhXX1JFU0VSVkVEX1dDSUQgLSAxKQogI2RlZmluZSBDU19DVFNfV0NJRCAJCShIV19SRVNFUlZFRF9XQ0lEIC0gMikKICNkZWZpbmUgTEFTVF9TUEVDSUZJQ19XQ0lECShIV19SRVNFUlZFRF9XQ0lEIC0gMikKIAotLy8gSWYgTUFYX01CU1NJRF9OVU0gaXMgOCwgdGhlIG1heGltdW0gYXZhaWxhYmxlIHdjaWQgZm9yIHRoZSBhc3NvY2lhdGVkIFNUQSBpcyAyMTEuCi0vLyBJZiBNQVhfTUJTU0lEX05VTSBpcyA3LCB0aGUgbWF4aW11bSBhdmFpbGFibGUgd2NpZCBmb3IgdGhlIGFzc29jaWF0ZWQgU1RBIGlzIDIyOC4KKy8qIElmIE1BWF9NQlNTSURfTlVNIGlzIDgsIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSB3Y2lkIGZvciB0aGUgYXNzb2NpYXRlZCBTVEEgaXMgMjExLiAqLworLyogSWYgTUFYX01CU1NJRF9OVU0gaXMgNywgdGhlIG1heGltdW0gYXZhaWxhYmxlIHdjaWQgZm9yIHRoZSBhc3NvY2lhdGVkIFNUQSBpcyAyMjguICovCiAjZGVmaW5lIE1BWF9BVkFJTEFCTEVfQ0xJRU5UX1dDSUQJKExBU1RfU1BFQ0lGSUNfV0NJRCAtIE1BWF9NQlNTSURfTlVNIC0gMSkKIAotLy8gVFggbmVlZCBXQ0lEIHRvIGZpbmQgQ2lwaGVyIEtleQotLy8gdGhlc2Ugd2NpZCAyMTIgfiAyMTkgYXJlIHJlc2VydmVkIGZvciBiYy9tYyBwYWNrZXRzIGlmIE1BWF9NQlNTSURfTlVNIGlzIDguCisvKiBUWCBuZWVkIFdDSUQgdG8gZmluZCBDaXBoZXIgS2V5ICovCisvKiB0aGVzZSB3Y2lkIDIxMiB+IDIxOSBhcmUgcmVzZXJ2ZWQgZm9yIGJjL21jIHBhY2tldHMgaWYgTUFYX01CU1NJRF9OVU0gaXMgOC4gKi8KICNkZWZpbmUgR0VUX0dyb3VwS2V5X1dDSUQoX193Y2lkLCBfX2Jzc2lkeCkgXAogCXsJCQkJCQkJCQkJXAogCQlfX3djaWQgPSBMQVNUX1NQRUNJRklDX1dDSUQgLSAoTUFYX01CU1NJRF9OVU0pICsgX19ic3NpZHg7CVwKQEAgLTM3MSw4ICszNjMsNyBAQAogCiAjZGVmaW5lIElzR3JvdXBLZXlXQ0lEKF9fd2NpZCkgKCgoX193Y2lkKSA8IExBU1RfU1BFQ0lGSUNfV0NJRCkgJiYgKChfX3djaWQpID49IChMQVNUX1NQRUNJRklDX1dDSUQgLSAoTUFYX01CU1NJRF9OVU0pKSkpCiAKLQotLy8gZGVmaW5pdGlvbiB0byBzdXBwb3J0IG11bHRpcGxlIEJTU0lECisvKiBkZWZpbml0aW9uIHRvIHN1cHBvcnQgbXVsdGlwbGUgQlNTSUQgKi8KICNkZWZpbmUgQlNTMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIEJTUzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQogI2RlZmluZSBCU1MyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKQEAgLTM4MiwyNiArMzczLDI2IEBACiAjZGVmaW5lIEJTUzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgNgogI2RlZmluZSBCU1M3ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKIAotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gTGVuZ3RoIGRlZmluaXRpb25zCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogTGVuZ3RoIGRlZmluaXRpb25zICovCiAjZGVmaW5lIFBFRVJfS0VZX05PICAgICAgICAgICAgICAgICAgICAgMgogI2RlZmluZSBNQUNfQUREUl9MRU4gICAgICAgICAgICAgICAgICAgIDYKICNkZWZpbmUgVElNRVNUQU1QX0xFTiAgICAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTICAgICAgTUFYX0xFTkdUSF9PRl9TVVBQT1JUX1JBVEVTIC8vIDEsIDIsIDUuNSwgMTEsIDYsIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQKLSNkZWZpbmUgTUFYX0xFTl9PRl9LRVkgICAgICAgICAgICAgICAgICAzMiAgICAgIC8vIDMyIG9jdGV0cyA9PSAyNTYgYml0cywgUmVkZWZpbmUgZm9yIFdQQQotI2RlZmluZSBNQVhfTlVNX09GX0NIQU5ORUxTICAgICAgICAgICAgIE1BWF9OVU1fT0ZfQ0hTICAgICAgLy8gMTQgY2hhbm5lbHMgQDIuNEcgKyAgMTJAVU5JSSArIDQgQE1NQUMgKyAxMSBASGlwZXJMQU4yICsgNyBASmFwYW4gKyAxIGFzIE5VTEwgdGVybWluYXRpb24KLSNkZWZpbmUgTUFYX05VTV9PRl8xMUpDSEFOTkVMUyAgICAgICAgICAgICAyMCAgICAgIC8vIDE0IGNoYW5uZWxzIEAyLjRHICsgIDEyQFVOSUkgKyA0IEBNTUFDICsgMTEgQEhpcGVyTEFOMiArIDcgQEphcGFuICsgMSBhcyBOVUxMIHRlcm1pbmF0aW9uCisjZGVmaW5lIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTICAgICAgTUFYX0xFTkdUSF9PRl9TVVBQT1JUX1JBVEVTCS8qIDEsIDIsIDUuNSwgMTEsIDYsIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQgKi8KKyNkZWZpbmUgTUFYX0xFTl9PRl9LRVkgICAgICAgICAgICAgICAgICAzMgkvKiAzMiBvY3RldHMgPT0gMjU2IGJpdHMsIFJlZGVmaW5lIGZvciBXUEEgKi8KKyNkZWZpbmUgTUFYX05VTV9PRl9DSEFOTkVMUyAgICAgICAgICAgICBNQVhfTlVNX09GX0NIUwkvKiAxNCBjaGFubmVscyBAMi40RyArICAxMkBVTklJICsgNCBATU1BQyArIDExIEBIaXBlckxBTjIgKyA3IEBKYXBhbiArIDEgYXMgTlVMTCB0ZXJtaW5hdGlvbiAqLworI2RlZmluZSBNQVhfTlVNX09GXzExSkNIQU5ORUxTICAgICAgICAgICAgIDIwCS8qIDE0IGNoYW5uZWxzIEAyLjRHICsgIDEyQFVOSUkgKyA0IEBNTUFDICsgMTEgQEhpcGVyTEFOMiArIDcgQEphcGFuICsgMSBhcyBOVUxMIHRlcm1pbmF0aW9uICovCiAjZGVmaW5lIE1BWF9MRU5fT0ZfU1NJRCAgICAgICAgICAgICAgICAgMzIKICNkZWZpbmUgQ0lQSEVSX1RFWFRfTEVOICAgICAgICAgICAgICAgICAxMjgKICNkZWZpbmUgSEFTSF9UQUJMRV9TSVpFICAgICAgICAgICAgICAgICAyNTYKLSNkZWZpbmUgTUFYX1ZJRV9MRU4gICAgICAgICAgICAgICAgICAgICAxMDI0ICAgLy8gTmV3IGZvciBXUEEgY2lwaGVyIHN1aXRlIHZhcmlhYmxlIElFIHNpemVzLgorI2RlZmluZSBNQVhfVklFX0xFTiAgICAgICAgICAgICAgICAgICAgIDEwMjQJLyogTmV3IGZvciBXUEEgY2lwaGVyIHN1aXRlIHZhcmlhYmxlIElFIHNpemVzLiAqLwogI2RlZmluZSBNQVhfU1VQUE9SVF9NQ1MgICAgICAgICAgICAgMzIKKyNkZWZpbmUgTUFYX05VTV9PRl9CQlBfTEFUQ0ggICAgICAgICAgICAgMTQwCiAKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBBU0lDIFdDSUQgVGFibGUgZGVmaW5pdGlvbi4KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jZGVmaW5lIEJTU0lEX1dDSUQJCTEJLy8gaW4gaW5mcmEgbW9kZSwgYWx3YXlzIHB1dCBic3NpZCB3aXRoIHRoaXMgV0NJRAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIEFTSUMgV0NJRCBUYWJsZSBkZWZpbml0aW9uLiAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNkZWZpbmUgQlNTSURfV0NJRAkJMQkvKiBpbiBpbmZyYSBtb2RlLCBhbHdheXMgcHV0IGJzc2lkIHdpdGggdGhpcyBXQ0lEICovCiAjZGVmaW5lIE1DQVNUX1dDSUQJMHgwCiAjZGVmaW5lIEJTUzBNY2FzdF9XQ0lECTB4MAogI2RlZmluZSBCU1MxTWNhc3RfV0NJRAkweGY4CkBAIC00MTUsMTAgKzQwNiwxMCBAQAogCiAjZGVmaW5lIE1BWF9OVU1fT0ZfQUNMX0xJU1QJCQkJTUFYX05VTUJFUl9PRl9BQ0wKIAotI2RlZmluZSBNQVhfTEVOX09GX01BQ19UQUJMRSAgICAgICAgICAgIE1BWF9OVU1CRVJfT0ZfTUFDIC8vIGlmIE1BWF9NQlNTSURfTlVNIGlzIDgsIHRoaXMgdmFsdWUgY2FuJ3QgYmUgbGFyZ2VyIHRoYW4gMjExCisjZGVmaW5lIE1BWF9MRU5fT0ZfTUFDX1RBQkxFICAgICAgICAgICAgTUFYX05VTUJFUl9PRl9NQUMJLyogaWYgTUFYX01CU1NJRF9OVU0gaXMgOCwgdGhpcyB2YWx1ZSBjYW4ndCBiZSBsYXJnZXIgdGhhbiAyMTEgKi8KIAogI2lmIE1BWF9MRU5fT0ZfTUFDX1RBQkxFPk1BWF9BVkFJTEFCTEVfQ0xJRU5UX1dDSUQKLSNlcnJvciBNQVhfTEVOX09GX01BQ19UQUJMRSBjYW4gbm90IGJlIGxhcmdlciB0aGFuIE1BWF9BVkFJTEFCTEVfQ0xJRU5UX1dDSUQhISEhCisjZXJyb3IgTUFYX0xFTl9PRl9NQUNfVEFCTEUgY2FuIG5vdCBiZSBsYXJnZXIgdGhhbiBNQVhfQVZBSUxBQkxFX0NMSUVOVF9XQ0lEIQogI2VuZGlmCiAKICNkZWZpbmUgTUFYX05VTV9PRl9XRFNfTElOS19QRVJCU1NJRAkgICAgICAgICAgICAzCkBAIC00MjgsNDIgKzQxOSw0MSBAQAogCiAjZGVmaW5lIE5VTV9PRl9USUQJCQk4CiAjZGVmaW5lIE1BWF9BSURfQkEgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEUgICAgICAgICAgKChOVU1fT0ZfVElEICogTUFYX0xFTl9PRl9NQUNfVEFCTEUpLzIpLy8gICAoTlVNX09GX1RJRCpNQVhfQUlEX0JBICsgMzIpCSAvL0Jsb2NrIEFDSyByZWNpcGllbnQKLSNkZWZpbmUgTUFYX0xFTl9PRl9CQV9PUklfVEFCTEUgICAgICAgICAgKChOVU1fT0ZfVElEICogTUFYX0xFTl9PRl9NQUNfVEFCTEUpLzIpLy8gICAoTlVNX09GX1RJRCpNQVhfQUlEX0JBICsgMzIpICAgLy8gQmxvY2sgQUNLIG9yaWdpbmF0b3IKKyNkZWZpbmUgTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEUgICAgICAgICAgKChOVU1fT0ZfVElEICogTUFYX0xFTl9PRl9NQUNfVEFCTEUpLzIpCS8qICAgKE5VTV9PRl9USUQqTUFYX0FJRF9CQSArIDMyKSAgICAgICAgLy9CbG9jayBBQ0sgcmVjaXBpZW50ICovCisjZGVmaW5lIE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFICAgICAgICAgICgoTlVNX09GX1RJRCAqIE1BWF9MRU5fT0ZfTUFDX1RBQkxFKS8yKQkvKiAgIChOVU1fT0ZfVElEKk1BWF9BSURfQkEgKyAzMikgICAvLyBCbG9jayBBQ0sgb3JpZ2luYXRvciAqLwogI2RlZmluZSBNQVhfTEVOX09GX0JTU19UQUJMRSAgICAgICAgICAgICA2NAogI2RlZmluZSBNQVhfUkVPUkRFUklOR19NUERVX05VTQkJCSA1MTIKIAotLy8ga2V5IHJlbGF0ZWQgZGVmaW5pdGlvbnMKKy8qIGtleSByZWxhdGVkIGRlZmluaXRpb25zICovCiAjZGVmaW5lIFNIQVJFX0tFWV9OVU0gICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBNQVhfTEVOX09GX1NIQVJFX0tFWSAgICAgICAgICAgIDE2ICAgIC8vIGJ5dGUgY291bnQKLSNkZWZpbmUgTUFYX0xFTl9PRl9QRUVSX0tFWSAgICAgICAgICAgICAxNiAgICAvLyBieXRlIGNvdW50Ci0jZGVmaW5lIFBBSVJXSVNFX0tFWV9OVU0gICAgICAgICAgICAgICAgNjQgICAgLy8gaW4gTUFDIEFTSUMgcGFpcndpc2Uga2V5IHRhYmxlCisjZGVmaW5lIE1BWF9MRU5fT0ZfU0hBUkVfS0VZICAgICAgICAgICAgMTYJLyogYnl0ZSBjb3VudCAqLworI2RlZmluZSBNQVhfTEVOX09GX1BFRVJfS0VZICAgICAgICAgICAgIDE2CS8qIGJ5dGUgY291bnQgKi8KKyNkZWZpbmUgUEFJUldJU0VfS0VZX05VTSAgICAgICAgICAgICAgICA2NAkvKiBpbiBNQUMgQVNJQyBwYWlyd2lzZSBrZXkgdGFibGUgKi8KICNkZWZpbmUgR1JPVVBfS0VZX05VTSAgICAgICAgICAgICAgICAgICA0CiAjZGVmaW5lIFBNS19MRU4gICAgICAgICAgICAgICAgICAgICAgICAgMzIKLSNkZWZpbmUgV0RTX1BBSVJXSVNFX0tFWV9PRkZTRVQgICAgICAgICA2MCAgICAvLyBXRFMgbGlua3MgdXNlcyBwYWlyd2lzZSBrZXkjNjAgfiA2MyBpbiBBU0lDIHBhaXJ3aXNlIGtleSB0YWJsZQotI2RlZmluZQlQTUtJRF9OTyAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgIC8vIE51bWJlciBvZiBQTUtJRCBzYXZlZCBzdXBwb3J0ZWQKKyNkZWZpbmUgV0RTX1BBSVJXSVNFX0tFWV9PRkZTRVQgICAgICAgICA2MAkvKiBXRFMgbGlua3MgdXNlcyBwYWlyd2lzZSBrZXkjNjAgfiA2MyBpbiBBU0lDIHBhaXJ3aXNlIGtleSB0YWJsZSAqLworI2RlZmluZQlQTUtJRF9OTyAgICAgICAgICAgICAgICAgICAgICAgIDQJLyogTnVtYmVyIG9mIFBNS0lEIHNhdmVkIHN1cHBvcnRlZCAqLwogI2RlZmluZSBNQVhfTEVOX09GX01MTUVfQlVGRkVSICAgICAgICAgIDIwNDgKIAotLy8gcG93ZXIgc3RhdHVzIHJlbGF0ZWQgZGVmaW5pdGlvbnMKKy8qIHBvd2VyIHN0YXR1cyByZWxhdGVkIGRlZmluaXRpb25zICovCiAjZGVmaW5lIFBXUl9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBQV1JfU0FWRSAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgUFdSX01NUFMgICAgICAgICAgICAgICAgICAgICAgICAyCQkJLy9NSU1PIHBvd2VyIHNhdmUKKyNkZWZpbmUgUFdSX01NUFMgICAgICAgICAgICAgICAgICAgICAgICAyCS8qTUlNTyBwb3dlciBzYXZlICovCiAKLS8vIEF1dGggYW5kIEFzc29jIG1vZGUgcmVsYXRlZCBkZWZpbml0aW9ucworLyogQXV0aCBhbmQgQXNzb2MgbW9kZSByZWxhdGVkIGRlZmluaXRpb25zICovCiAjZGVmaW5lIEFVVEhfTU9ERV9PUEVOICAgICAgICAgICAgICAgICAgMHgwMAogI2RlZmluZSBBVVRIX01PREVfS0VZICAgICAgICAgICAgICAgICAgIDB4MDEKIAotLy8gQlNTIFR5cGUgZGVmaW5pdGlvbnMKLSNkZWZpbmUgQlNTX0FESE9DICAgICAgICAgICAgICAgICAgICAgICAwICAvLyA9IE5kaXM4MDJfMTFJQlNTCi0jZGVmaW5lIEJTU19JTkZSQSAgICAgICAgICAgICAgICAgICAgICAgMSAgLy8gPSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmUKLSNkZWZpbmUgQlNTX0FOWSAgICAgICAgICAgICAgICAgICAgICAgICAyICAvLyA9IE5kaXM4MDJfMTFBdXRvVW5rbm93bgotI2RlZmluZSBCU1NfTU9OSVRPUgkJCSAgICAgICAgICAgIDMgIC8vID0gTmRpczgwMl8xMU1vbml0b3IKKy8qIEJTUyBUeXBlIGRlZmluaXRpb25zICovCisjZGVmaW5lIEJTU19BREhPQyAgICAgICAgICAgICAgICAgICAgICAgMAkvKiA9IE5kaXM4MDJfMTFJQlNTICovCisjZGVmaW5lIEJTU19JTkZSQSAgICAgICAgICAgICAgICAgICAgICAgMQkvKiA9IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZSAqLworI2RlZmluZSBCU1NfQU5ZICAgICAgICAgICAgICAgICAgICAgICAgIDIJLyogPSBOZGlzODAyXzExQXV0b1Vua25vd24gKi8KKyNkZWZpbmUgQlNTX01PTklUT1IJCQkgICAgICAgICAgICAzCS8qID0gTmRpczgwMl8xMU1vbml0b3IgKi8KIAotCi0vLyBSZWFzb24gY29kZSBkZWZpbml0aW9ucworLyogUmVhc29uIGNvZGUgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgUkVBU09OX1JFU0VSVkVEICAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIFJFQVNPTl9VTlNQRUNJRlkgICAgICAgICAgICAgICAgMQotI2RlZmluZSBSRUFTT05fTk9fTE9OR0VSX1ZBTElEICAgICAgICAgIDIKKyNkZWZpbmUgUkVBU09OX05PX2xvbmdFUl9WQUxJRCAgICAgICAgICAyCiAjZGVmaW5lIFJFQVNPTl9ERUFVVEhfU1RBX0xFQVZJTkcgICAgICAgMwogI2RlZmluZSBSRUFTT05fRElTQVNTT0NfSU5BQ1RJVkUgICAgICAgIDQKICNkZWZpbmUgUkVBU09OX0RJU0FTU1BDX0FQX1VOQUJMRSAgICAgICA1CkBAIC00OTUsNyArNDg1LDcgQEAKICNkZWZpbmUgUkVBU09OX1FPU19SRVFVRVNUX1RJTUVPVVQgICAgICAgIDM5CiAjZGVmaW5lIFJFQVNPTl9RT1NfQ0lQSEVSX05PVF9TVVBQT1JUICAgICA0NQogCi0vLyBTdGF0dXMgY29kZSBkZWZpbml0aW9ucworLyogU3RhdHVzIGNvZGUgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgTUxNRV9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIE1MTUVfVU5TUEVDSUZZX0ZBSUwgICAgICAgICAgICAgMQogI2RlZmluZSBNTE1FX0NBTk5PVF9TVVBQT1JUX0NBUCAgICAgICAgIDEwCkBAIC01MTUsNiArNTA1LDkgQEAKICNkZWZpbmUgTUxNRV9RT1NfVU5TUEVDSUZZICAgICAgICAgICAgICAgIDMyCiAjZGVmaW5lIE1MTUVfUkVRVUVTVF9ERUNMSU5FRCAgICAgICAgICAgICAzNwogI2RlZmluZSBNTE1FX1JFUVVFU1RfV0lUSF9JTlZBTElEX1BBUkFNICAgMzgKKyNkZWZpbmUgTUxNRV9JTlZBTElEX0dST1VQX0NJUEhFUgkgIDQxCisjZGVmaW5lIE1MTUVfSU5WQUxJRF9QQUlSV0lTRV9DSVBIRVIJICA0MgorI2RlZmluZSBNTE1FX0lOVkFMSURfQUtNUAkJCSAgNDMKICNkZWZpbmUgTUxNRV9ETFNfTk9UX0FMTE9XX0lOX1FCU1MgICAgICAgIDQ4CiAjZGVmaW5lIE1MTUVfREVTVF9TVEFfTk9UX0lOX1FCU1MgICAgICAgICA0OQogI2RlZmluZSBNTE1FX0RFU1RfU1RBX0lTX05PVF9BX1FTVEEgICAgICAgNTAKQEAgLTUyNCw3ICs1MTcsNyBAQAogI2RlZmluZSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUICAgICAgIDB4NTMKICNkZWZpbmUgTUxNRV9NQUNfVEFCTEVfRkFJTCAgICAgICAgICAgICAweDU0CiAKLS8vIElFIGNvZGUKKy8qIElFIGNvZGUgKi8KICNkZWZpbmUgSUVfU1NJRCAgICAgICAgICAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIElFX1NVUFBfUkFURVMgICAgICAgICAgICAgICAgICAgMQogI2RlZmluZSBJRV9GSF9QQVJNICAgICAgICAgICAgICAgICAgICAgIDIKQEAgLTUzMiw5NCArNTI1LDk1IEBACiAjZGVmaW5lIElFX0NGX1BBUk0gICAgICAgICAgICAgICAgICAgICAgNAogI2RlZmluZSBJRV9USU0gICAgICAgICAgICAgICAgICAgICAgICAgIDUKICNkZWZpbmUgSUVfSUJTU19QQVJNICAgICAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIElFX0NPVU5UUlkgICAgICAgICAgICAgICAgICAgICAgNyAgICAgLy8gODAyLjExZAotI2RlZmluZSBJRV84MDJfMTFEX1JFUVVFU1QgICAgICAgICAgICAgIDEwICAgIC8vIDgwMi4xMWQKLSNkZWZpbmUgSUVfUUJTU19MT0FEICAgICAgICAgICAgICAgICAgICAxMSAgICAvLyA4MDIuMTFlIGQ5Ci0jZGVmaW5lIElFX0VEQ0FfUEFSQU1FVEVSICAgICAgICAgICAgICAgMTIgICAgLy8gODAyLjExZSBkOQotI2RlZmluZSBJRV9UU1BFQyAgICAgICAgICAgICAgICAgICAgICAgIDEzICAgIC8vIDgwMi4xMWUgZDkKLSNkZWZpbmUgSUVfVENMQVMgICAgICAgICAgICAgICAgICAgICAgICAxNCAgICAvLyA4MDIuMTFlIGQ5Ci0jZGVmaW5lIElFX1NDSEVEVUxFICAgICAgICAgICAgICAgICAgICAgMTUgICAgLy8gODAyLjExZSBkOQorI2RlZmluZSBJRV9DT1VOVFJZICAgICAgICAgICAgICAgICAgICAgIDcJLyogODAyLjExZCAqLworI2RlZmluZSBJRV84MDJfMTFEX1JFUVVFU1QgICAgICAgICAgICAgIDEwCS8qIDgwMi4xMWQgKi8KKyNkZWZpbmUgSUVfUUJTU19MT0FEICAgICAgICAgICAgICAgICAgICAxMQkvKiA4MDIuMTFlIGQ5ICovCisjZGVmaW5lIElFX0VEQ0FfUEFSQU1FVEVSICAgICAgICAgICAgICAgMTIJLyogODAyLjExZSBkOSAqLworI2RlZmluZSBJRV9UU1BFQyAgICAgICAgICAgICAgICAgICAgICAgIDEzCS8qIDgwMi4xMWUgZDkgKi8KKyNkZWZpbmUgSUVfVENMQVMgICAgICAgICAgICAgICAgICAgICAgICAxNAkvKiA4MDIuMTFlIGQ5ICovCisjZGVmaW5lIElFX1NDSEVEVUxFICAgICAgICAgICAgICAgICAgICAgMTUJLyogODAyLjExZSBkOSAqLwogI2RlZmluZSBJRV9DSEFMTEVOR0VfVEVYVCAgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIElFX1BPV0VSX0NPTlNUUkFJTlQgICAgICAgICAgICAgMzIgICAgLy8gODAyLjExaCBkMy4zCi0jZGVmaW5lIElFX1BPV0VSX0NBUEFCSUxJVFkgICAgICAgICAgICAgMzMgICAgLy8gODAyLjExaCBkMy4zCi0jZGVmaW5lIElFX1RQQ19SRVFVRVNUICAgICAgICAgICAgICAgICAgMzQgICAgLy8gODAyLjExaCBkMy4zCi0jZGVmaW5lIElFX1RQQ19SRVBPUlQgICAgICAgICAgICAgICAgICAgMzUgICAgLy8gODAyLjExaCBkMy4zCi0jZGVmaW5lIElFX1NVUFBfQ0hBTk5FTFMgICAgICAgICAgICAgICAgMzYgICAgLy8gODAyLjExaCBkMy4zCi0jZGVmaW5lIElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVCAgMzcgICAgLy8gODAyLjExaCBkMy4zCi0jZGVmaW5lIElFX01FQVNVUkVNRU5UX1JFUVVFU1QgICAgICAgICAgMzggICAgLy8gODAyLjExaCBkMy4zCi0jZGVmaW5lIElFX01FQVNVUkVNRU5UX1JFUE9SVCAgICAgICAgICAgMzkgICAgLy8gODAyLjExaCBkMy4zCi0jZGVmaW5lIElFX1FVSUVUICAgICAgICAgICAgICAgICAgICAgICAgNDAgICAgLy8gODAyLjExaCBkMy4zCi0jZGVmaW5lIElFX0lCU1NfREZTICAgICAgICAgICAgICAgICAgICAgNDEgICAgLy8gODAyLjExaCBkMy4zCi0jZGVmaW5lIElFX0VSUCAgICAgICAgICAgICAgICAgICAgICAgICAgNDIgICAgLy8gODAyLjExZwotI2RlZmluZSBJRV9UU19ERUxBWSAgICAgICAgICAgICAgICAgICAgIDQzICAgIC8vIDgwMi4xMWUgZDkKLSNkZWZpbmUgSUVfVENMQVNfUFJPQ0VTU0lORyAgICAgICAgICAgICA0NCAgICAvLyA4MDIuMTFlIGQ5Ci0jZGVmaW5lIElFX1FPU19DQVBBQklMSVRZICAgICAgICAgICAgICAgNDYgICAgLy8gODAyLjExZSBkNgotI2RlZmluZSBJRV9IVF9DQVAgICAgICAgICAgICAgICAgICAgICAgIDQ1ICAgIC8vIDgwMi4xMW4gZDEuIEhUIENBUEFCSUxJVFkuIEVMRU1FTlQgSUQgVEJECi0jZGVmaW5lIElFX0FQX0NIQU5ORUxfUkVQT1JUCQkJNTEgICAgLy8gODAyLjExayBkNgotI2RlZmluZSBJRV9IVF9DQVAyICAgICAgICAgICAgICAgICAgICAgICAgIDUyICAgIC8vIDgwMi4xMW4gZDEuIEhUIENBUEFCSUxJVFkuIEVMRU1FTlQgSUQgVEJECi0jZGVmaW5lIElFX1JTTiAgICAgICAgICAgICAgICAgICAgICAgICAgNDggICAgLy8gODAyLjExaSBkMy4wCi0jZGVmaW5lIElFX1dQQTIgICAgICAgICAgICAgICAgICAgICAgICAgNDggICAgLy8gV1BBMgotI2RlZmluZSBJRV9FWFRfU1VQUF9SQVRFUyAgICAgICAgICAgICAgIDUwICAgIC8vIDgwMi4xMWcKLSNkZWZpbmUgSUVfU1VQUF9SRUdfQ0xBU1MgICAgICAgICAgICAgICA1OSAgICAvLyA4MDIuMTF5LiBTdXBwb3J0ZWQgcmVndWxhdG9yeSBjbGFzc2VzLgotI2RlZmluZSBJRV9FWFRfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UCTYwCS8vIDgwMi4xMW4KLSNkZWZpbmUgSUVfQUREX0hUICAgICAgICAgICAgICAgICAgICAgICAgIDYxICAgIC8vIDgwMi4xMW4gZDEuIEFERElUSU9OQUwgSFQgQ0FQQUJJTElUWS4gRUxFTUVOVCBJRCBUQkQKLSNkZWZpbmUgSUVfQUREX0hUMiAgICAgICAgICAgICAgICAgICAgICAgIDUzICAgIC8vIDgwMi4xMW4gZDEuIEFERElUSU9OQUwgSFQgQ0FQQUJJTElUWS4gRUxFTUVOVCBJRCBUQkQKKyNkZWZpbmUgSUVfUE9XRVJfQ09OU1RSQWludCAgICAgICAgICAgICAzMgkvKiA4MDIuMTFoIGQzLjMgKi8KKyNkZWZpbmUgSUVfUE9XRVJfQ0FQQUJJTElUWSAgICAgICAgICAgICAzMwkvKiA4MDIuMTFoIGQzLjMgKi8KKyNkZWZpbmUgSUVfVFBDX1JFUVVFU1QgICAgICAgICAgICAgICAgICAzNAkvKiA4MDIuMTFoIGQzLjMgKi8KKyNkZWZpbmUgSUVfVFBDX1JFUE9SVCAgICAgICAgICAgICAgICAgICAzNQkvKiA4MDIuMTFoIGQzLjMgKi8KKyNkZWZpbmUgSUVfU1VQUF9DSEFOTkVMUyAgICAgICAgICAgICAgICAzNgkvKiA4MDIuMTFoIGQzLjMgKi8KKyNkZWZpbmUgSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UICAzNwkvKiA4MDIuMTFoIGQzLjMgKi8KKyNkZWZpbmUgSUVfTUVBU1VSRU1FTlRfUkVRVUVTVCAgICAgICAgICAzOAkvKiA4MDIuMTFoIGQzLjMgKi8KKyNkZWZpbmUgSUVfTUVBU1VSRU1FTlRfUkVQT1JUICAgICAgICAgICAzOQkvKiA4MDIuMTFoIGQzLjMgKi8KKyNkZWZpbmUgSUVfUVVJRVQgICAgICAgICAgICAgICAgICAgICAgICA0MAkvKiA4MDIuMTFoIGQzLjMgKi8KKyNkZWZpbmUgSUVfSUJTU19ERlMgICAgICAgICAgICAgICAgICAgICA0MQkvKiA4MDIuMTFoIGQzLjMgKi8KKyNkZWZpbmUgSUVfRVJQICAgICAgICAgICAgICAgICAgICAgICAgICA0MgkvKiA4MDIuMTFnICovCisjZGVmaW5lIElFX1RTX0RFTEFZICAgICAgICAgICAgICAgICAgICAgNDMJLyogODAyLjExZSBkOSAqLworI2RlZmluZSBJRV9UQ0xBU19QUk9DRVNTSU5HICAgICAgICAgICAgIDQ0CS8qIDgwMi4xMWUgZDkgKi8KKyNkZWZpbmUgSUVfUU9TX0NBUEFCSUxJVFkgICAgICAgICAgICAgICA0NgkvKiA4MDIuMTFlIGQ2ICovCisjZGVmaW5lIElFX0hUX0NBUCAgICAgICAgICAgICAgICAgICAgICAgNDUJLyogODAyLjExbiBkMS4gSFQgQ0FQQUJJTElUWS4gRUxFTUVOVCBJRCBUQkQgKi8KKyNkZWZpbmUgSUVfQVBfQ0hBTk5FTF9SRVBPUlQJCQk1MQkvKiA4MDIuMTFrIGQ2ICovCisjZGVmaW5lIElFX0hUX0NBUDIgICAgICAgICAgICAgICAgICAgICAgICAgNTIJLyogODAyLjExbiBkMS4gSFQgQ0FQQUJJTElUWS4gRUxFTUVOVCBJRCBUQkQgKi8KKyNkZWZpbmUgSUVfUlNOICAgICAgICAgICAgICAgICAgICAgICAgICA0OAkvKiA4MDIuMTFpIGQzLjAgKi8KKyNkZWZpbmUgSUVfV1BBMiAgICAgICAgICAgICAgICAgICAgICAgICA0OAkvKiBXUEEyICovCisjZGVmaW5lIElFX0VYVF9TVVBQX1JBVEVTICAgICAgICAgICAgICAgNTAJLyogODAyLjExZyAqLworI2RlZmluZSBJRV9TVVBQX1JFR19DTEFTUyAgICAgICAgICAgICAgIDU5CS8qIDgwMi4xMXkuIFN1cHBvcnRlZCByZWd1bGF0b3J5IGNsYXNzZXMuICovCisjZGVmaW5lIElFX0VYVF9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQJNjAJLyogODAyLjExbiAqLworI2RlZmluZSBJRV9BRERfSFQgICAgICAgICAgICAgICAgICAgICAgICAgNjEJLyogODAyLjExbiBkMS4gQURESVRJT05BTCBIVCBDQVBBQklMSVRZLiBFTEVNRU5UIElEIFRCRCAqLworI2RlZmluZSBJRV9BRERfSFQyICAgICAgICAgICAgICAgICAgICAgICAgNTMJLyogODAyLjExbiBkMS4gQURESVRJT05BTCBIVCBDQVBBQklMSVRZLiBFTEVNRU5UIElEIFRCRCAqLwogCisvKiBGb3IgODAyLjExbiBEMy4wMyAqLworLyojZGVmaW5lIElFX05FV19FWFRfQ0hBX09GRlNFVCAgICAgICAgICAgICA2MiAgICAvLyA4MDIuMTFuIGQxLiBOZXcgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0IGVsZW1ldCAqLworI2RlZmluZSBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VUCQk2MgkvKiA4MDIuMTFuIEQzLjAzICAgICAgICBTZWNvbmRhcnkgQ2hhbm5lbCBPZmZzZXQgZWxlbWVudCAqLworI2RlZmluZSBJRV9XQVBJCQkJCQkJCTY4CS8qIFdBUEkgaW5mb3JtYXRpb24gZWxlbWVudCAqLworI2RlZmluZSBJRV8yMDQwX0JTU19DT0VYSVNUICAgICAgICAgICAgICAgNzIJLyogODAyLjExbiBEMy4wLjMgKi8KKyNkZWZpbmUgSUVfMjA0MF9CU1NfSU5UT0xFUkFOVF9SRVBPUlQgICAgIDczCS8qIDgwMi4xMW4gRDMuMDMgKi8KKyNkZWZpbmUgSUVfT1ZFUkxBUEJTU19TQ0FOX1BBUk0gICAgICAgICAgIDc0CS8qIDgwMi4xMW4gRDMuMDMgKi8KKyNkZWZpbmUgSUVfRVhUX0NBUEFCSUxJVFkgICAgICAgICAgICAgICAgMTI3CS8qIDgwMi4xMW4gRDMuMDMgKi8KIAotLy8gRm9yIDgwMi4xMW4gRDMuMDMKLS8vI2RlZmluZSBJRV9ORVdfRVhUX0NIQV9PRkZTRVQgICAgICAgICAgICAgNjIgICAgLy8gODAyLjExbiBkMS4gTmV3IGV4dGVuc2lvbiBjaGFubmVsIG9mZnNldCBlbGVtZXQKLSNkZWZpbmUgSUVfU0VDT05EQVJZX0NIX09GRlNFVAkJNjIJLy8gODAyLjExbiBEMy4wMwlTZWNvbmRhcnkgQ2hhbm5lbCBPZmZzZXQgZWxlbWVudAotI2RlZmluZSBJRV8yMDQwX0JTU19DT0VYSVNUICAgICAgICAgICAgICAgNzIgICAgLy8gODAyLjExbiBEMy4wLjMKLSNkZWZpbmUgSUVfMjA0MF9CU1NfSU5UT0xFUkFOVF9SRVBPUlQgICAgIDczICAgIC8vIDgwMi4xMW4gRDMuMDMKLSNkZWZpbmUgSUVfT1ZFUkxBUEJTU19TQ0FOX1BBUk0gICAgICAgICAgIDc0ICAgIC8vIDgwMi4xMW4gRDMuMDMKLSNkZWZpbmUgSUVfRVhUX0NBUEFCSUxJVFkgICAgICAgICAgICAgICAgMTI3ICAgLy8gODAyLjExbiBEMy4wMworI2RlZmluZSBJRV9XUEEgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMQkvKiBXUEEgKi8KKyNkZWZpbmUgSUVfVkVORE9SX1NQRUNJRklDICAgICAgICAgICAgICAyMjEJLyogV2lmaSBXTU0gKFdNRSkgKi8KIAorI2RlZmluZSBPVUlfQlJPQURDT01fSFQgICAgICAgICAgICAgIDUxCS8qICovCisjZGVmaW5lIE9VSV9CUk9BRENPTV9IVEFERCAgICAgICAgICAgICAgNTIJLyogKi8KKyNkZWZpbmUgT1VJX1BSRU5fSFRfQ0FQICAgICAgICAgICAgICA1MQkvKiAqLworI2RlZmluZSBPVUlfUFJFTl9BRERfSFQgICAgICAgICAgICAgIDUyCS8qICovCiAKLSNkZWZpbmUgSUVfV1BBICAgICAgICAgICAgICAgICAgICAgICAgICAyMjEgICAvLyBXUEEKLSNkZWZpbmUgSUVfVkVORE9SX1NQRUNJRklDICAgICAgICAgICAgICAyMjEgICAvLyBXaWZpIFdNTSAoV01FKQotCi0jZGVmaW5lIE9VSV9CUk9BRENPTV9IVCAgICAgICAgICAgICAgNTEgICAvLwotI2RlZmluZSBPVUlfQlJPQURDT01fSFRBREQgICAgICAgICAgICAgIDUyICAgLy8KLSNkZWZpbmUgT1VJX1BSRU5fSFRfQ0FQICAgICAgICAgICAgICA1MSAgIC8vCi0jZGVmaW5lIE9VSV9QUkVOX0FERF9IVCAgICAgICAgICAgICAgNTIgICAvLwotCi0vLyBDQ1ggaW5mb3JtYXRpb24KLSNkZWZpbmUgSUVfQUlST05FVF9DS0lQICAgICAgICAgICAgICAgICAxMzMgICAvLyBDQ1gxLjAgSUQgODVIIGZvciBDS0lQCi0jZGVmaW5lIElFX0FQX1RYX1BPV0VSICAgICAgICAgICAgICAgICAgMTUwICAgLy8gQ0NYIDIuMCBmb3IgQVAgdHJhbnNtaXQgcG93ZXIKLSNkZWZpbmUgSUVfTUVBU1VSRU1FTlRfQ0FQQUJJTElUWSAgICAgICAyMjEgICAvLyBDQ1ggMi4wCisvKiBDQ1ggaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgSUVfQUlST05FVF9DS0lQICAgICAgICAgICAgICAgICAxMzMJLyogQ0NYMS4wIElEIDg1SCBmb3IgQ0tJUCAqLworI2RlZmluZSBJRV9BUF9UWF9QT1dFUiAgICAgICAgICAgICAgICAgIDE1MAkvKiBDQ1ggMi4wIGZvciBBUCB0cmFuc21pdCBwb3dlciAqLworI2RlZmluZSBJRV9NRUFTVVJFTUVOVF9DQVBBQklMSVRZICAgICAgIDIyMQkvKiBDQ1ggMi4wICovCiAjZGVmaW5lIElFX0NDWF9WMiAgICAgICAgICAgICAgICAgICAgICAgMjIxCi0jZGVmaW5lIElFX0FJUk9ORVRfSVBBRERSRVNTICAgICAgICAgICAgMTQ5ICAgLy8gQ0NYIElEIDk1SCBmb3IgSVAgQWRkcmVzcwotI2RlZmluZSBJRV9BSVJPTkVUX0NDS01SRUFTU09DICAgICAgICAgIDE1NiAgIC8vIENDWCBJRCA5Q0ggZm9yIENDS00gUmVhc3NvY2lhdGlvbiBSZXF1ZXN0IGVsZW1lbnQKKyNkZWZpbmUgSUVfQUlST05FVF9JUEFERFJFU1MgICAgICAgICAgICAxNDkJLyogQ0NYIElEIDk1SCBmb3IgSVAgQWRkcmVzcyAqLworI2RlZmluZSBJRV9BSVJPTkVUX0NDS01SRUFTU09DICAgICAgICAgIDE1NgkvKiBDQ1ggSUQgOUNIIGZvciBDQ0tNIFJlYXNzb2NpYXRpb24gUmVxdWVzdCBlbGVtZW50ICovCiAjZGVmaW5lIENLSVBfTkVHT1RJQVRJT05fTEVOR1RIICAgICAgICAgMzAKICNkZWZpbmUgQUlST05FVF9JUEFERFJFU1NfTEVOR1RIICAgICAgICAxMAogI2RlZmluZSBBSVJPTkVUX0NDS01SRUFTU09DX0xFTkdUSCAgICAgIDI0CiAKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBNTE1FIHN0YXRlIG1hY2hpbmUgZGVmaW5pdGlvbgotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiBNTE1FIHN0YXRlIG1hY2hpbmUgZGVmaW5pdGlvbiAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotLy8gU1RBIE1MTUUgc3RhdGUgbWFoY2luZXMKKy8qIFNUQSBNTE1FIHN0YXRlIG1haGNpbmVzICovCiAjZGVmaW5lIEFTU09DX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAgMQogI2RlZmluZSBBVVRIX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAgIDIKICNkZWZpbmUgQVVUSF9SU1BfU1RBVEVfTUFDSElORSAgICAgICAgICAzCiAjZGVmaW5lIFNZTkNfU1RBVEVfTUFDSElORSAgICAgICAgICAgICAgNAogI2RlZmluZSBNTE1FX0NOVExfU1RBVEVfTUFDSElORSAgICAgICAgIDUKICNkZWZpbmUgV1BBX1BTS19TVEFURV9NQUNISU5FICAgICAgICAgICA2Ci0jZGVmaW5lIExFQVBfU1RBVEVfTUFDSElORSAgICAgICAgICAgICAgNworLyojZGVmaW5lIExFQVBfU1RBVEVfTUFDSElORSAgICAgICAgICAgICAgNyAqLwogI2RlZmluZSBBSVJPTkVUX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDgKICNkZWZpbmUgQUNUSU9OX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDkKIAotLy8gQVAgTUxNRSBzdGF0ZSBtYWNoaW5lcworLyogQVAgTUxNRSBzdGF0ZSBtYWNoaW5lcyAqLwogI2RlZmluZSBBUF9BU1NPQ19TVEFURV9NQUNISU5FICAgICAgICAgIDExCiAjZGVmaW5lIEFQX0FVVEhfU1RBVEVfTUFDSElORSAgICAgICAgICAgMTIKLSNkZWZpbmUgQVBfQVVUSF9SU1BfU1RBVEVfTUFDSElORSAgICAgICAxMwogI2RlZmluZSBBUF9TWU5DX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDE0CiAjZGVmaW5lIEFQX0NOVExfU1RBVEVfTUFDSElORSAgICAgICAgICAgMTUKLSNkZWZpbmUgQVBfV1BBX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAxNgorI2RlZmluZSBXU0NfU1RBVEVfTUFDSElORSAgICAgICAgICAgIDE3CisjZGVmaW5lIFdTQ19VUE5QX1NUQVRFX01BQ0hJTkUJCSAgICAxOAogCi0vLwotLy8gU1RBJ3MgQ09OVFJPTC9DT05ORUNUIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCi0vLworI2RlZmluZSBXUEFfU1RBVEVfTUFDSElORQkJCTIzCisKKy8qICovCisvKiBTVEEncyBDT05UUk9ML0NPTk5FQ1Qgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMgKi8KKy8qICovCiAjZGVmaW5lIENOVExfSURMRSAgICAgICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBDTlRMX1dBSVRfRElTQVNTT0MgICAgICAgICAgICAgIDEKICNkZWZpbmUgQ05UTF9XQUlUX0pPSU4gICAgICAgICAgICAgICAgICAyCkBAIC02MzAsOSArNjI0LDkgQEAKICNkZWZpbmUgQ05UTF9XQUlUX0FVVEgyICAgICAgICAgICAgICAgICA3CiAjZGVmaW5lIENOVExfV0FJVF9PSURfTElTVF9TQ0FOICAgICAgICAgOAogI2RlZmluZSBDTlRMX1dBSVRfT0lEX0RJU0FTU09DICAgICAgICAgIDkKLSNpZmRlZiBSVDI4NzAKKyNpZmRlZiBSVE1QX01BQ19VU0IKICNkZWZpbmUgQ05UTF9XQUlUX1NDQU5fRk9SX0NPTk5FQ1QgICAgICAxMAotI2VuZGlmIC8vIFJUMjg3MCAvLworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCiAjZGVmaW5lIE1UMl9BU1NPQ19DT05GICAgICAgICAgICAgICAgICAgMzQKICNkZWZpbmUgTVQyX0FVVEhfQ09ORiAgICAgICAgICAgICAgICAgICAzNQpAQCAtNjQ2LDEzICs2NDAsMTQgQEAKICNkZWZpbmUgTVQyX0dFVF9DT05GICAgICAgICAgICAgICAgICAgICA0MwogI2RlZmluZSBNVDJfU0VUX0NPTkYgICAgICAgICAgICAgICAgICAgIDQ0CiAjZGVmaW5lIE1UMl9SRVNFVF9DT05GICAgICAgICAgICAgICAgICAgNDUKKyNkZWZpbmUgTVQyX0ZUX09URF9DT05GCQkJCQk0NgogI2RlZmluZSBNVDJfTUxNRV9ST0FNSU5HX1JFUSAgICAgICAgICAgIDUyCiAKICNkZWZpbmUgQ05UTF9GVU5DX1NJWkUgICAgICAgICAgICAgICAgICAxCiAKLS8vCi0vLyBTVEEncyBBU1NPQyBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIwotLy8KKy8qICovCisvKiBTVEEncyBBU1NPQyBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIyAqLworLyogKi8KICNkZWZpbmUgQVNTT0NfSURMRSAgICAgICAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIEFTU09DX1dBSVRfUlNQICAgICAgICAgICAgICAgICAgMQogI2RlZmluZSBSRUFTU09DX1dBSVRfUlNQICAgICAgICAgICAgICAgIDIKQEAgLTY3NSwyNCArNjcwLDI2IEBACiAKICNkZWZpbmUgQVNTT0NfRlVOQ19TSVpFICAgICAgICAgICAgICAgICAoTUFYX0FTU09DX1NUQVRFICogTUFYX0FTU09DX01TRykKIAotLy8KLS8vIEFDVCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIwotLy8KKy8qICovCisvKiBBQ1Qgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMgKi8KKy8qICovCiAjZGVmaW5lIEFDVF9JRExFICAgICAgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgTUFYX0FDVF9TVEFURSAgICAgICAgICAgICAgICAgMQogCiAjZGVmaW5lIEFDVF9NQUNISU5FX0JBU0UgICAgICAgICAgICAgIDAKIAotLy9UaG9zZSBQRUVSX3h4X0NBVEUgbnVtYmVyIGlzIGJhc2VkIG9uIHJlYWwgQ2F0ZWdhcnkgdmFsdWUgaW4gSUVFRSBzcGVjLiBQbGVhc2UgZG9uJ2VzIG1vZGlmeSBpdCBieSB5b3VyIHNlbGYuCi0vL0NhdGVnb3J5CisvKlRob3NlIFBFRVJfeHhfQ0FURSBudW1iZXIgaXMgYmFzZWQgb24gcmVhbCBDYXRlZ2FyeSB2YWx1ZSBpbiBJRUVFIHNwZWMuIFBsZWFzZSBkb24nZXMgbW9kaWZ5IGl0IGJ5IHlvdXIgc2VsZi4gKi8KKy8qQ2F0ZWdvcnkgKi8KICNkZWZpbmUgTVQyX1BFRVJfU1BFQ1RSVU1fQ0FURSAgICAgICAgICAgICAgMAogI2RlZmluZSBNVDJfUEVFUl9RT1NfQ0FURSAgICAgICAgICAgICAgMQogI2RlZmluZSBNVDJfUEVFUl9ETFNfQ0FURSAgICAgICAgICAgICAyCiAjZGVmaW5lIE1UMl9QRUVSX0JBX0NBVEUgICAgICAgICAgICAgMwogI2RlZmluZSBNVDJfUEVFUl9QVUJMSUNfQ0FURSAgICAgICAgICAgICA0CiAjZGVmaW5lIE1UMl9QRUVSX1JNX0NBVEUgICAgICAgICAgICAgNQotI2RlZmluZSBNVDJfUEVFUl9IVF9DQVRFICAgICAgICAgICAgIDcJLy8JNy40LjcKKy8qICJGVF9DQVRFR09SWV9CU1NfVFJBTlNJVElPTiBlcXVhbCB0byA2IiBpcyBkZWZpbmVkIGZpbGUgb2YgImRvdDExcl9mdC5oIiAqLworI2RlZmluZSBNVDJfUEVFUl9IVF9DQVRFICAgICAgICAgICAgIDcJLyogICAgICA3LjQuNyAqLwogI2RlZmluZSBNQVhfUEVFUl9DQVRFX01TRyAgICAgICAgICAgICAgICAgICA3CisKICNkZWZpbmUgTVQyX01MTUVfQUREX0JBX0NBVEUgICAgICAgICAgICAgOAogI2RlZmluZSBNVDJfTUxNRV9PUklfREVMQkFfQ0FURSAgICAgICAgICAgICA5CiAjZGVmaW5lIE1UMl9NTE1FX1JFQ19ERUxCQV9DQVRFICAgICAgICAgICAgIDEwCkBAIC03MDEsNyArNjk4LDcgQEAKICNkZWZpbmUgTVQyX0FDVF9JTlZBTElEICAgICAgICAgICAgIDEzCiAjZGVmaW5lIE1BWF9BQ1RfTVNHICAgICAgICAgICAgICAgICAgIDE0CiAKLS8vQ2F0ZWdvcnkgZmllbGQKKy8qQ2F0ZWdvcnkgZmllbGQgKi8KICNkZWZpbmUgQ0FURUdPUllfU1BFQ1RSVU0JCTAKICNkZWZpbmUgQ0FURUdPUllfUU9TCQkJMQogI2RlZmluZSBDQVRFR09SWV9ETFMJCQkyCkBAIC03MTAsMzggKzcwNywzNSBAQAogI2RlZmluZSBDQVRFR09SWV9STQkJCTUKICNkZWZpbmUgQ0FURUdPUllfSFQJCQk3CiAKLQotLy8gRExTIEFjdGlvbiBmcmFtZSBkZWZpbml0aW9uCisvKiBETFMgQWN0aW9uIGZyYW1lIGRlZmluaXRpb24gKi8KICNkZWZpbmUgQUNUSU9OX0RMU19SRVFVRVNUCQkJMAogI2RlZmluZSBBQ1RJT05fRExTX1JFU1BPTlNFCQkJMQogI2RlZmluZSBBQ1RJT05fRExTX1RFQVJET1dOCQkJMgogCi0vL1NwZWN0cnVtICBBY3Rpb24gZmllbGQgdmFsdWUgODAyLjExaCA3LjQuMQotI2RlZmluZSBTUEVDX01SUQkwCS8vIFJlcXVlc3QKLSNkZWZpbmUgU1BFQ19NUlAJMQkvL1JlcG9ydAorLypTcGVjdHJ1bSAgQWN0aW9uIGZpZWxkIHZhbHVlIDgwMi4xMWggNy40LjEgKi8KKyNkZWZpbmUgU1BFQ19NUlEJMAkvKiBSZXF1ZXN0ICovCisjZGVmaW5lIFNQRUNfTVJQCTEJLypSZXBvcnQgKi8KICNkZWZpbmUgU1BFQ19UUENSUQkyCiAjZGVmaW5lIFNQRUNfVFBDUlAJMwogI2RlZmluZSBTUEVDX0NIQU5ORUxfU1dJVENICTQKIAotCi0vL0JBICBBY3Rpb24gZmllbGQgdmFsdWUKKy8qQkEgIEFjdGlvbiBmaWVsZCB2YWx1ZSAqLwogI2RlZmluZSBBRERCQV9SRVEJMAogI2RlZmluZSBBRERCQV9SRVNQCTEKICNkZWZpbmUgREVMQkEgICAyCiAKLS8vUHVibGljJ3MgIEFjdGlvbiBmaWVsZCB2YWx1ZSBpbiBQdWJsaWMgQ2F0ZWdvcnkuICBTb21lIGluIDgwMi4xMXkgYW5kIHNvbWUgaW4gMTFuCi0jZGVmaW5lIEFDVElPTl9CU1NfMjA0MF9DT0VYSVNUCQkJCTAJLy8gMTFuCi0jZGVmaW5lIEFDVElPTl9EU0VfRU5BQkxFTUVOVAkJCQkJMQkvLyAxMXkgRDkuMAotI2RlZmluZSBBQ1RJT05fRFNFX0RFRU5BQkxFTUVOVAkJCQkyCS8vIDExeSBEOS4wCi0jZGVmaW5lIEFDVElPTl9EU0VfUkVHX0xPQ0FUSU9OX0FOTk9VTkNFCTMJLy8gMTF5IEQ5LjAKLSNkZWZpbmUgQUNUSU9OX0VYVF9DSF9TV0lUQ0hfQU5OT1VOQ0UJCTQJLy8gMTF5IEQ5LjAKLSNkZWZpbmUgQUNUSU9OX0RTRV9NRUFTVVJFTUVOVF9SRVEJCQk1CS8vIDExeSBEOS4wCi0jZGVmaW5lIEFDVElPTl9EU0VfTUVBU1VSRU1FTlRfUkVQT1JUCQk2CS8vIDExeSBEOS4wCi0jZGVmaW5lIEFDVElPTl9NRUFTVVJFTUVOVF9QSUxPVF9BQ1RJT04JCTcgIAkvLyAxMXkgRDkuMAotI2RlZmluZSBBQ1RJT05fRFNFX1BPV0VSX0NPTlNUUkFJTlQJCQk4CS8vIDExeSBEOS4wCisvKlB1YmxpYydzICBBY3Rpb24gZmllbGQgdmFsdWUgaW4gUHVibGljIENhdGVnb3J5LiAgU29tZSBpbiA4MDIuMTF5IGFuZCBzb21lIGluIDExbiAqLworI2RlZmluZSBBQ1RJT05fQlNTXzIwNDBfQ09FWElTVAkJCQkwCS8qIDExbiAqLworI2RlZmluZSBBQ1RJT05fRFNFX0VOQUJMRU1FTlQJCQkJCTEJLyogMTF5IEQ5LjAgKi8KKyNkZWZpbmUgQUNUSU9OX0RTRV9ERUVOQUJMRU1FTlQJCQkJMgkvKiAxMXkgRDkuMCAqLworI2RlZmluZSBBQ1RJT05fRFNFX1JFR19MT0NBVElPTl9BTk5PVU5DRQkzCS8qIDExeSBEOS4wICovCisjZGVmaW5lIEFDVElPTl9FWFRfQ0hfU1dJVENIX0FOTk9VTkNFCQk0CS8qIDExeSBEOS4wICovCisjZGVmaW5lIEFDVElPTl9EU0VfTUVBU1VSRU1FTlRfUkVRCQkJNQkvKiAxMXkgRDkuMCAqLworI2RlZmluZSBBQ1RJT05fRFNFX01FQVNVUkVNRU5UX1JFUE9SVAkJNgkvKiAxMXkgRDkuMCAqLworI2RlZmluZSBBQ1RJT05fTUVBU1VSRU1FTlRfUElMT1RfQUNUSU9OCQk3CS8qIDExeSBEOS4wICovCisjZGVmaW5lIEFDVElPTl9EU0VfUE9XRVJfQ09OU1RSQUlOVAkJCTgJLyogMTF5IEQ5LjAgKi8KIAotCi0vL0hUICBBY3Rpb24gZmllbGQgdmFsdWUKKy8qSFQgIEFjdGlvbiBmaWVsZCB2YWx1ZSAqLwogI2RlZmluZSBOT1RJRllfQldfQUNUSU9OCQkJCTAKICNkZWZpbmUgU01QU19BQ1RJT04JCQkJCQkxCiAjZGVmaW5lIFBTTVBfQUNUSU9OICAgCQkJCQkyCkBAIC03NTMsOSArNzQ3LDkgQEAKICNkZWZpbmUgSFRfSU5GT19FWENIQU5HRQkJCQk4CiAKICNkZWZpbmUgQUNUX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAgKE1BWF9BQ1RfU1RBVEUgKiBNQVhfQUNUX01TRykKLS8vCi0vLyBTVEEncyBBVVRIRU5USUNBVElPTiBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2dmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCisvKiAqLworLyogU1RBJ3MgQVVUSEVOVElDQVRJT04gc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldnZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjICovCisvKiAqLwogI2RlZmluZSBBVVRIX1JFUV9JRExFICAgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgQVVUSF9XQUlUX1NFUTIgICAgICAgICAgICAgICAgICAxCiAjZGVmaW5lIEFVVEhfV0FJVF9TRVE0ICAgICAgICAgICAgICAgICAgMgpAQCAtNzY5LDkgKzc2Myw5IEBACiAKICNkZWZpbmUgQVVUSF9GVU5DX1NJWkUgICAgICAgICAgICAgICAgICAoTUFYX0FVVEhfU1RBVEUgKiBNQVhfQVVUSF9NU0cpCiAKLS8vCi0vLyBTVEEncyBBVVRIX1JTUCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIwotLy8KKy8qICovCisvKiBTVEEncyBBVVRIX1JTUCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIyAqLworLyogKi8KICNkZWZpbmUgQVVUSF9SU1BfSURMRSAgICAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIEFVVEhfUlNQX1dBSVRfQ0hBTCAgICAgICAgICAgICAgMQogI2RlZmluZSBNQVhfQVVUSF9SU1BfU1RBVEUgICAgICAgICAgICAgIDIKQEAgLTc4NCwxMCArNzc4LDEwIEBACiAKICNkZWZpbmUgQVVUSF9SU1BfRlVOQ19TSVpFICAgICAgICAgICAgICAoTUFYX0FVVEhfUlNQX1NUQVRFICogTUFYX0FVVEhfUlNQX01TRykKIAotLy8KLS8vIFNUQSdzIFNZTkMgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCi0jZGVmaW5lIFNZTkNfSURMRSAgICAgICAgICAgICAgICAgICAgICAgMCAgLy8gbWVyZ2UgTk9fQlNTLElCU1NfSURMRSxJQlNTX0FDVElWRSBhbmQgQlNTIGluIHRvIDEgc3RhdGUKKy8qICovCisvKiBTVEEncyBTWU5DIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjICovCisvKiAqLworI2RlZmluZSBTWU5DX0lETEUgICAgICAgICAgICAgICAgICAgICAgIDAJLyogbWVyZ2UgTk9fQlNTLElCU1NfSURMRSxJQlNTX0FDVElWRSBhbmQgQlNTIGluIHRvIDEgc3RhdGUgKi8KICNkZWZpbmUgSk9JTl9XQUlUX0JFQUNPTiAgICAgICAgICAgICAgICAxCiAjZGVmaW5lIFNDQU5fTElTVEVOICAgICAgICAgICAgICAgICAgICAgMgogI2RlZmluZSBNQVhfU1lOQ19TVEFURSAgICAgICAgICAgICAgICAgIDMKQEAgLTgwNyw3ICs4MDEsNyBAQAogCiAjZGVmaW5lIFNZTkNfRlVOQ19TSVpFICAgICAgICAgICAgICAgICAgKE1BWF9TWU5DX1NUQVRFICogTUFYX1NZTkNfTVNHKQogCi0vL01lc3NhZ2VzIGZvciB0aGUgRExTIHN0YXRlIG1hY2hpbmUKKy8qTWVzc2FnZXMgZm9yIHRoZSBETFMgc3RhdGUgbWFjaGluZSAqLwogI2RlZmluZSBETFNfSURMRQkJCQkJCTAKICNkZWZpbmUgTUFYX0RMU19TVEFURQkJCQkJMQogCkBAIC04MjEsNDUgKzgxNSwxOCBAQAogCiAjZGVmaW5lIERMU19GVU5DX1NJWkUJCQkJCShNQVhfRExTX1NUQVRFICogTUFYX0RMU19NU0cpCiAKLS8vCi0vLyBTVEEncyBXUEEtUFNLIFN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCi0vLwotI2RlZmluZSBXUEFfUFNLX0lETEUJCQkJCTAKLSNkZWZpbmUgTUFYX1dQQV9QU0tfU1RBVEUJCQkJMQorLyogKi8KKy8qIFdTQyBTdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIyAqLworLyogKi8KIAotI2RlZmluZSBXUEFfTUFDSElORV9CQVNFICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTVQyX0VBUFBhY2tldCAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIE1UMl9FQVBPTFN0YXJ0ICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBNVDJfRUFQT0xMb2dvZmYgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTVQyX0VBUE9MS2V5ICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIE1UMl9FQVBPTEFTRkFsZXJ0ICAgICAgICAgICAgICAgNAotI2RlZmluZSBNQVhfV1BBX1BTS19NU0cgICAgICAgICAgICAgICAgIDUKLQotI2RlZmluZQlXUEFfUFNLX0ZVTkNfU0laRQkJCQkoTUFYX1dQQV9QU0tfU1RBVEUgKiBNQVhfV1BBX1BTS19NU0cpCi0KLS8vCi0vLyBTVEEncyBDSVNDTy1BSVJPTkVUIFN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCi0vLwotI2RlZmluZSBBSVJPTkVUX0lETEUJCQkJCTAKLSNkZWZpbmUJQUlST05FVF9TQ0FOTklORwkJCQkxCi0jZGVmaW5lIE1BWF9BSVJPTkVUX1NUQVRFCQkJCTIKLQotI2RlZmluZSBBSVJPTkVUX01BQ0hJTkVfQkFTRQkJICAgIDAKLSNkZWZpbmUgTVQyX0FJUk9ORVRfTVNHCQkJCSAgICAwCi0jZGVmaW5lIE1UMl9BSVJPTkVUX1NDQU5fUkVRCQkgICAgMQotI2RlZmluZSBNVDJfQUlST05FVF9TQ0FOX0RPTkUJCSAgICAyCi0jZGVmaW5lIE1BWF9BSVJPTkVUX01TRwkJCQkgICAgMwotCi0jZGVmaW5lCUFJUk9ORVRfRlVOQ19TSVpFCQkJCShNQVhfQUlST05FVF9TVEFURSAqIE1BWF9BSVJPTkVUX01TRykKLQotLy8KLS8vIEFQJ3MgQ09OVFJPTC9DT05ORUNUIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCi0vLworLyogKi8KKy8qIEFQJ3MgQ09OVFJPTC9DT05ORUNUIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjICovCisvKiAqLwogI2RlZmluZSBBUF9DTlRMX0ZVTkNfU0laRSAgICAgICAgICAgICAgIDEKIAotLy8KLS8vIEFQJ3MgQVNTT0Mgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCisvKiAqLworLyogQVAncyBBU1NPQyBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIyAqLworLyogKi8KICNkZWZpbmUgQVBfQVNTT0NfSURMRSAgICAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIEFQX01BWF9BU1NPQ19TVEFURSAgICAgICAgICAgICAgMQogCkBAIC04NzMsMzYgKzg0MCwyNSBAQAogCiAjZGVmaW5lIEFQX0FTU09DX0ZVTkNfU0laRSAgICAgICAgICAgICAgKEFQX01BWF9BU1NPQ19TVEFURSAqIEFQX01BWF9BU1NPQ19NU0cpCiAKLS8vCi0vLyBBUCdzIEFVVEhFTlRJQ0FUSU9OIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCi0vLworLyogKi8KKy8qIEFQJ3MgQVVUSEVOVElDQVRJT04gc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMgKi8KKy8qICovCiAjZGVmaW5lIEFQX0FVVEhfUkVRX0lETEUgICAgICAgICAgICAgICAgMAogI2RlZmluZSBBUF9NQVhfQVVUSF9TVEFURSAgICAgICAgICAgICAgIDEKIAogI2RlZmluZSBBUF9BVVRIX01BQ0hJTkVfQkFTRSAgICAgICAgICAgIDAKICNkZWZpbmUgQVBNVDJfTUxNRV9ERUFVVEhfUkVRICAgICAgICAgICAwCiAjZGVmaW5lIEFQTVQyX0NMUzJFUlIgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBBUF9NQVhfQVVUSF9NU0cgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVBNVDJfUEVFUl9ERUFVVEggICAgICAgICAgICAgICAyCisjZGVmaW5lIEFQTVQyX1BFRVJfQVVUSF9SRVEJCQkJMworI2RlZmluZSBBUE1UMl9QRUVSX0FVVEhfQ09ORklSTQkJCTQKKyNkZWZpbmUgQVBfTUFYX0FVVEhfTVNHICAgICAgICAgICAgICAgICA1CiAKICNkZWZpbmUgQVBfQVVUSF9GVU5DX1NJWkUgICAgICAgICAgICAgICAoQVBfTUFYX0FVVEhfU1RBVEUgKiBBUF9NQVhfQVVUSF9NU0cpCiAKLS8vCi0vLyBBUCdzIEFVVEgtUlNQIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCi0vLwotI2RlZmluZSBBUF9BVVRIX1JTUF9JRExFICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQVBfTUFYX0FVVEhfUlNQX1NUQVRFICAgICAgICAgICAxCi0KLSNkZWZpbmUgQVBfQVVUSF9SU1BfTUFDSElORV9CQVNFICAgICAgICAwCi0jZGVmaW5lIEFQTVQyX0FVVEhfQ0hBTExFTkdFX1RJTUVPVVQgICAgMAotI2RlZmluZSBBUE1UMl9QRUVSX0FVVEhfT0REICAgICAgICAgICAgIDEKLSNkZWZpbmUgQVBNVDJfUEVFUl9ERUFVVEggICAgICAgICAgICAgICAyCi0jZGVmaW5lIEFQX01BWF9BVVRIX1JTUF9NU0cgICAgICAgICAgICAgMwotCi0jZGVmaW5lIEFQX0FVVEhfUlNQX0ZVTkNfU0laRSAgICAgICAgICAgKEFQX01BWF9BVVRIX1JTUF9TVEFURSAqIEFQX01BWF9BVVRIX1JTUF9NU0cpCi0KLS8vCi0vLyBBUCdzIFNZTkMgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCisvKiAqLworLyogQVAncyBTWU5DIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjICovCisvKiAqLwogI2RlZmluZSBBUF9TWU5DX0lETEUgICAgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgQVBfU0NBTl9MSVNURU4JCQkJCTEKICNkZWZpbmUgQVBfTUFYX1NZTkNfU1RBVEUgICAgICAgICAgICAgICAyCkBAIC05MTgsMzAgKzg3NCwzMCBAQAogCiAjZGVmaW5lIEFQX1NZTkNfRlVOQ19TSVpFICAgICAgICAgICAgICAgKEFQX01BWF9TWU5DX1NUQVRFICogQVBfTUFYX1NZTkNfTVNHKQogCi0vLwotLy8gQVAncyBXUEEgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCi0jZGVmaW5lIEFQX1dQQV9QVEsgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBBUF9NQVhfV1BBX1BUS19TVEFURSAgICAgICAgICAgIDEKKy8qICovCisvKiBDb21tb24gV1BBIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjICovCisvKiAqLworI2RlZmluZSBXUEFfUFRLICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTUFYX1dQQV9QVEtfU1RBVEUgICAgICAgICAgICAxCiAKLSNkZWZpbmUgQVBfV1BBX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAwCi0jZGVmaW5lIEFQTVQyX0VBUFBhY2tldCAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBBUE1UMl9FQVBPTFN0YXJ0ICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgQVBNVDJfRUFQT0xMb2dvZmYgICAgICAgICAgICAgICAyCi0jZGVmaW5lIEFQTVQyX0VBUE9MS2V5ICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBBUE1UMl9FQVBPTEFTRkFsZXJ0ICAgICAgICAgICAgIDQKLSNkZWZpbmUgQVBfTUFYX1dQQV9NU0cgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFdQQV9NQUNISU5FX0JBU0UgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfRUFQUGFja2V0ICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX0VBUE9MU3RhcnQgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1UMl9FQVBPTExvZ29mZiAgICAgICAgICAgICAgMgorI2RlZmluZSBNVDJfRUFQT0xLZXkgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTVQyX0VBUE9MQVNGQWxlcnQgICAgICAgICAgICA0CisjZGVmaW5lIE1BWF9XUEFfTVNHICAgICAgICAgICAgICAgICAgNQogCi0jZGVmaW5lIEFQX1dQQV9GVU5DX1NJWkUgICAgICAgICAgICAgICAgKEFQX01BWF9XUEFfUFRLX1NUQVRFICogQVBfTUFYX1dQQV9NU0cpCisjZGVmaW5lIFdQQV9GVU5DX1NJWkUgICAgICAgICAgICAgICAgKE1BWF9XUEFfUFRLX1NUQVRFICogTUFYX1dQQV9NU0cpCiAKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi0vLyB2YWx1ZSBkb21haW4gb2YgODAyLjExIGhlYWRlciBGQy5UeXRlLCB3aGljaCBpcyBiMy4uYjIgb2YgdGhlIDFzdC1ieXRlIG9mIE1BQyBoZWFkZXIKKy8qIHZhbHVlIGRvbWFpbiBvZiA4MDIuMTEgaGVhZGVyIEZDLlR5dGUsIHdoaWNoIGlzIGIzLi5iMiBvZiB0aGUgMXN0LWJ5dGUgb2YgTUFDIGhlYWRlciAqLwogI2RlZmluZSBCVFlQRV9NR01UICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBCVFlQRV9DTlRMICAgICAgICAgICAgICAgICAgMQogI2RlZmluZSBCVFlQRV9EQVRBICAgICAgICAgICAgICAgICAgMgogCi0vLyB2YWx1ZSBkb21haW4gb2YgODAyLjExIE1HTVQgZnJhbWUncyBGQy5zdWJ0eXBlLCB3aGljaCBpcyBiNy4uNCBvZiB0aGUgMXN0LWJ5dGUgb2YgTUFDIGhlYWRlcgorLyogdmFsdWUgZG9tYWluIG9mIDgwMi4xMSBNR01UIGZyYW1lJ3MgRkMuc3VidHlwZSwgd2hpY2ggaXMgYjcuLjQgb2YgdGhlIDFzdC1ieXRlIG9mIE1BQyBoZWFkZXIgKi8KICNkZWZpbmUgU1VCVFlQRV9BU1NPQ19SRVEgICAgICAgICAgIDAKICNkZWZpbmUgU1VCVFlQRV9BU1NPQ19SU1AgICAgICAgICAgIDEKICNkZWZpbmUgU1VCVFlQRV9SRUFTU09DX1JFUSAgICAgICAgIDIKQEAgLTk1Niw3ICs5MTIsNyBAQAogI2RlZmluZSBTVUJUWVBFX0FDVElPTiAgICAgICAgICAgICAgMTMKICNkZWZpbmUgU1VCVFlQRV9BQ1RJT05fTk9fQUNLICAgICAgICAgICAgICAxNAogCi0vLyB2YWx1ZSBkb21haW4gb2YgODAyLjExIENOVEwgZnJhbWUncyBGQy5zdWJ0eXBlLCB3aGljaCBpcyBiNy4uNCBvZiB0aGUgMXN0LWJ5dGUgb2YgTUFDIGhlYWRlcgorLyogdmFsdWUgZG9tYWluIG9mIDgwMi4xMSBDTlRMIGZyYW1lJ3MgRkMuc3VidHlwZSwgd2hpY2ggaXMgYjcuLjQgb2YgdGhlIDFzdC1ieXRlIG9mIE1BQyBoZWFkZXIgKi8KICNkZWZpbmUgU1VCVFlQRV9XUkFQUEVSICAgICAgIAk3CiAjZGVmaW5lIFNVQlRZUEVfQkxPQ0tfQUNLX1JFUSAgICAgICA4CiAjZGVmaW5lIFNVQlRZUEVfQkxPQ0tfQUNLICAgICAgICAgICA5CkBAIC05NjcsNyArOTIzLDcgQEAKICNkZWZpbmUgU1VCVFlQRV9DRkVORCAgICAgICAgICAgICAgIDE0CiAjZGVmaW5lIFNVQlRZUEVfQ0ZFTkRfQ0ZBQ0sgICAgICAgICAxNQogCi0vLyB2YWx1ZSBkb21haW4gb2YgODAyLjExIERBVEEgZnJhbWUncyBGQy5zdWJ0eXBlLCB3aGljaCBpcyBiNy4uNCBvZiB0aGUgMXN0LWJ5dGUgb2YgTUFDIGhlYWRlcgorLyogdmFsdWUgZG9tYWluIG9mIDgwMi4xMSBEQVRBIGZyYW1lJ3MgRkMuc3VidHlwZSwgd2hpY2ggaXMgYjcuLjQgb2YgdGhlIDFzdC1ieXRlIG9mIE1BQyBoZWFkZXIgKi8KICNkZWZpbmUgU1VCVFlQRV9EQVRBICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgU1VCVFlQRV9EQVRBX0NGQUNLICAgICAgICAgIDEKICNkZWZpbmUgU1VCVFlQRV9EQVRBX0NGUE9MTCAgICAgICAgIDIKQEAgLTk4NSwxNSArOTQxLDE1IEBACiAjZGVmaW5lIFNVQlRZUEVfUU9TX0NGUE9MTCAgICAgICAgICAxNAogI2RlZmluZSBTVUJUWVBFX1FPU19DRkFDS19DRlBPTEwgICAgMTUKIAotLy8gQUNLIHBvbGljeSBvZiBRT1MgQ29udHJvbCBmaWVsZCBiaXQgNjo1Ci0jZGVmaW5lIE5PUk1BTF9BQ0sgICAgICAgICAgICAgICAgICAweDAwICAvLyBiNjo1ID0gMDAKLSNkZWZpbmUgTk9fQUNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAgIC8vIGI2OjUgPSAwMQotI2RlZmluZSBOT19FWFBMSUNJVF9BQ0sgICAgICAgICAgICAgMHg0MCAgLy8gYjY6NSA9IDEwCi0jZGVmaW5lIEJMT0NLX0FDSyAgICAgICAgICAgICAgICAgICAweDYwICAvLyBiNjo1ID0gMTEKKy8qIEFDSyBwb2xpY3kgb2YgUU9TIENvbnRyb2wgZmllbGQgYml0IDY6NSAqLworI2RlZmluZSBOT1JNQUxfQUNLICAgICAgICAgICAgICAgICAgMHgwMAkvKiBiNjo1ID0gMDAgKi8KKyNkZWZpbmUgTk9fQUNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAJLyogYjY6NSA9IDAxICovCisjZGVmaW5lIE5PX0VYUExJQ0lUX0FDSyAgICAgICAgICAgICAweDQwCS8qIGI2OjUgPSAxMCAqLworI2RlZmluZSBCTE9DS19BQ0sgICAgICAgICAgICAgICAgICAgMHg2MAkvKiBiNjo1ID0gMTEgKi8KIAotLy8KLS8vIHJ0bXBfZGF0YS5jIHVzZSB0aGVzZSBkZWZpbml0aW9uCi0vLworLyogKi8KKy8qIHJ0bXBfZGF0YS5jIHVzZSB0aGVzZSBkZWZpbml0aW9uICovCisvKiAqLwogI2RlZmluZSBMRU5HVEhfODAyXzExICAgICAgICAgICAgICAgMjQKICNkZWZpbmUgTEVOR1RIXzgwMl8xMV9BTkRfSCAgICAgICAgIDMwCiAjZGVmaW5lIExFTkdUSF84MDJfMTFfQ1JDX0ggICAgICAgICAzNApAQCAtMTAwNyw0MiArOTYzLDQyIEBACiAjZGVmaW5lIExFTkdUSF9DUkMgICAgICAgICAgICAgICAgICA0CiAjZGVmaW5lIE1BWF9TRVFfTlVNQkVSICAgICAgICAgICAgICAweDBmZmYKICNkZWZpbmUgTEVOR1RIXzgwMl8zX05PX1RZUEUJCTEyCi0jZGVmaW5lIExFTkdUSF84MDJfMVEJCQkJNCAvKiBWTEFOIHJlbGF0ZWQgKi8KKyNkZWZpbmUgTEVOR1RIXzgwMl8xUQkJCQk0CS8qIFZMQU4gcmVsYXRlZCAqLwogCi0vLyBTVEFfQ1NSNC5maWVsZC5UeFJlc3VsdAorLyogU1RBX0NTUjQuZmllbGQuVHhSZXN1bHQgKi8KICNkZWZpbmUgVFhfUkVTVUxUX1NVQ0NFU1MgICAgICAgICAgIDAKICNkZWZpbmUgVFhfUkVTVUxUX1pFUk9fTEVOR1RIICAgICAgIDEKICNkZWZpbmUgVFhfUkVTVUxUX1VOREVSX1JVTiAgICAgICAgIDIKICNkZWZpbmUgVFhfUkVTVUxUX09IWV9FUlJPUiAgICAgICAgIDQKICNkZWZpbmUgVFhfUkVTVUxUX1JFVFJZX0ZBSUwgICAgICAgIDYKIAotLy8gQWxsIFBIWSByYXRlIHN1bW1hcnkgaW4gVFhECi0vLyBQcmVhbWJsZSBNT0RFIGluIFR4RAorLyogQWxsIFBIWSByYXRlIHN1bW1hcnkgaW4gVFhEICovCisvKiBQcmVhbWJsZSBNT0RFIGluIFR4RCAqLwogI2RlZmluZSBNT0RFX0NDSwkwCiAjZGVmaW5lIE1PREVfT0ZETSAgIDEKICNkZWZpbmUgTU9ERV9IVE1JWAkyCiAjZGVmaW5lIE1PREVfSFRHUkVFTkZJRUxECTMKIAotLy8gTUNTIGZvciBDQ0suICBCVy5TR0kuU1RCQyBhcmUgcmVzZXJ2ZWQKLSNkZWZpbmUgTUNTX0xPTkdQX1JBVEVfMSAgICAgICAgICAgICAgICAgICAgICAwCSAvLyBsb25nIHByZWFtYmxlIENDSyAxTWJwcwotI2RlZmluZSBNQ1NfTE9OR1BfUkFURV8yICAgICAgICAgICAgICAgICAgICAgIDEJLy8gbG9uZyBwcmVhbWJsZSBDQ0sgMU1icHMKLSNkZWZpbmUgTUNTX0xPTkdQX1JBVEVfNV81ICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIE1DU19MT05HUF9SQVRFXzExICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBNQ1NfU0hPUlRQX1JBVEVfMSAgICAgICAgICAgICAgICAgICAgICA0CSAvLyBsb25nIHByZWFtYmxlIENDSyAxTWJwcy4gc2hvcnQgaXMgZm9yYmlkZGVuIGluIDFNYnBzCi0jZGVmaW5lIE1DU19TSE9SVFBfUkFURV8yICAgICAgICAgICAgICAgICAgICAgIDUJLy8gc2hvcnQgcHJlYW1ibGUgQ0NLIDJNYnBzCisvKiBNQ1MgZm9yIENDSy4gIEJXLlNHSS5TVEJDIGFyZSByZXNlcnZlZCAqLworI2RlZmluZSBNQ1NfbG9uZ1BfUkFURV8xICAgICAgICAgICAgICAgICAgICAgIDAJLyogbG9uZyBwcmVhbWJsZSBDQ0sgMU1icHMgKi8KKyNkZWZpbmUgTUNTX2xvbmdQX1JBVEVfMiAgICAgICAgICAgICAgICAgICAgICAxCS8qIGxvbmcgcHJlYW1ibGUgQ0NLIDFNYnBzICovCisjZGVmaW5lIE1DU19sb25nUF9SQVRFXzVfNSAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNQ1NfbG9uZ1BfUkFURV8xMSAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTUNTX1NIT1JUUF9SQVRFXzEgICAgICAgICAgICAgICAgICAgICAgNAkvKiBsb25nIHByZWFtYmxlIENDSyAxTWJwcy4gc2hvcnQgaXMgZm9yYmlkZGVuIGluIDFNYnBzICovCisjZGVmaW5lIE1DU19TSE9SVFBfUkFURV8yICAgICAgICAgICAgICAgICAgICAgIDUJLyogc2hvcnQgcHJlYW1ibGUgQ0NLIDJNYnBzICovCiAjZGVmaW5lIE1DU19TSE9SVFBfUkFURV81XzUgICAgICAgICAgICAgICAgICAgIDYKICNkZWZpbmUgTUNTX1NIT1JUUF9SQVRFXzExICAgICAgICAgICAgICAgICAgICAgNwotLy8gVG8gc2VuZCBkdXBsaWNhdGUgbGVnYWN5IE9GRE0uIHNldCBCVz1CV180MC4gIFNHSS5TVEJDIGFyZSByZXNlcnZlZAotI2RlZmluZSBNQ1NfUkFURV82ICAgICAgICAgICAgICAgICAgICAgIDAgICAvLyBsZWdhY3kgT0ZETQotI2RlZmluZSBNQ1NfUkFURV85ICAgICAgICAgICAgICAgICAgICAgIDEgICAvLyBPRkRNCi0jZGVmaW5lIE1DU19SQVRFXzEyICAgICAgICAgICAgICAgICAgICAgMiAgIC8vIE9GRE0KLSNkZWZpbmUgTUNTX1JBVEVfMTggICAgICAgICAgICAgICAgICAgICAzICAgLy8gT0ZETQotI2RlZmluZSBNQ1NfUkFURV8yNCAgICAgICAgICAgICAgICAgICAgIDQgIC8vIE9GRE0KLSNkZWZpbmUgTUNTX1JBVEVfMzYgICAgICAgICAgICAgICAgICAgICA1ICAgLy8gT0ZETQotI2RlZmluZSBNQ1NfUkFURV80OCAgICAgICAgICAgICAgICAgICAgIDYgIC8vIE9GRE0KLSNkZWZpbmUgTUNTX1JBVEVfNTQgICAgICAgICAgICAgICAgICAgICA3IC8vIE9GRE0KLS8vIEhUCi0jZGVmaW5lIE1DU18wCQkwCS8vIDFTCisvKiBUbyBzZW5kIGR1cGxpY2F0ZSBsZWdhY3kgT0ZETS4gc2V0IEJXPUJXXzQwLiAgU0dJLlNUQkMgYXJlIHJlc2VydmVkICovCisjZGVmaW5lIE1DU19SQVRFXzYgICAgICAgICAgICAgICAgICAgICAgMAkvKiBsZWdhY3kgT0ZETSAqLworI2RlZmluZSBNQ1NfUkFURV85ICAgICAgICAgICAgICAgICAgICAgIDEJLyogT0ZETSAqLworI2RlZmluZSBNQ1NfUkFURV8xMiAgICAgICAgICAgICAgICAgICAgIDIJLyogT0ZETSAqLworI2RlZmluZSBNQ1NfUkFURV8xOCAgICAgICAgICAgICAgICAgICAgIDMJLyogT0ZETSAqLworI2RlZmluZSBNQ1NfUkFURV8yNCAgICAgICAgICAgICAgICAgICAgIDQJLyogT0ZETSAqLworI2RlZmluZSBNQ1NfUkFURV8zNiAgICAgICAgICAgICAgICAgICAgIDUJLyogT0ZETSAqLworI2RlZmluZSBNQ1NfUkFURV80OCAgICAgICAgICAgICAgICAgICAgIDYJLyogT0ZETSAqLworI2RlZmluZSBNQ1NfUkFURV81NCAgICAgICAgICAgICAgICAgICAgIDcJLyogT0ZETSAqLworLyogSFQgKi8KKyNkZWZpbmUgTUNTXzAJCTAJLyogMVMgKi8KICNkZWZpbmUgTUNTXzEJCTEKICNkZWZpbmUgTUNTXzIJCTIKICNkZWZpbmUgTUNTXzMJCTMKQEAgLTEwNTAsNyArMTAwNiw3IEBACiAjZGVmaW5lIE1DU181CQk1CiAjZGVmaW5lIE1DU182CQk2CiAjZGVmaW5lIE1DU183CQk3Ci0jZGVmaW5lIE1DU184CQk4CS8vIDJTCisjZGVmaW5lIE1DU184CQk4CS8qIDJTICovCiAjZGVmaW5lIE1DU185CQk5CiAjZGVmaW5lIE1DU18xMAkJMTAKICNkZWZpbmUgTUNTXzExCQkxMQpAQCAtMTA1OCw3ICsxMDE0LDcgQEAKICNkZWZpbmUgTUNTXzEzCQkxMwogI2RlZmluZSBNQ1NfMTQJCTE0CiAjZGVmaW5lIE1DU18xNQkJMTUKLSNkZWZpbmUgTUNTXzE2CQkxNgkvLyAzKjMKKyNkZWZpbmUgTUNTXzE2CQkxNgkvKiAzKjMgKi8KICNkZWZpbmUgTUNTXzE3CQkxNwogI2RlZmluZSBNQ1NfMTgJCTE4CiAjZGVmaW5lIE1DU18xOQkJMTkKQEAgLTEwNjksNDkgKzEwMjUsNDggQEAKICNkZWZpbmUgTUNTXzMyCQkzMgogI2RlZmluZSBNQ1NfQVVUTwkJMzMKIAotLy8gT0lEX0hUUEhZTU9ERQotLy8gTU9ERQorLyogT0lEX0hUUEhZTU9ERSAqLworLyogTU9ERSAqLwogI2RlZmluZSBIVE1PREVfTU0JMAogI2RlZmluZSBIVE1PREVfR0YJMQogCi0vLyBGaXhlZCBUeCBNT0RFIC0gSFQsIENDSyBvciBPRkRNCisvKiBGaXhlZCBUeCBNT0RFIC0gSFQsIENDSyBvciBPRkRNICovCiAjZGVmaW5lIEZJWEVEX1RYTU9ERV9IVAkJMAogI2RlZmluZSBGSVhFRF9UWE1PREVfQ0NLCTEKICNkZWZpbmUgRklYRURfVFhNT0RFX09GRE0gCTIKLS8vIEJXCisvKiBCVyAqLwogI2RlZmluZSBCV18yMAkJQkFORF9XSURUSF8yMAogI2RlZmluZSBCV180MAkJQkFORF9XSURUSF80MAogI2RlZmluZSBCV19CT1RICQlCQU5EX1dJRFRIX0JPVEgKLSNkZWZpbmUgQldfMTAJCUJBTkRfV0lEVEhfMTAJLy8gODAyLjExaiBoYXMgMTBNSHouIFRoaXMgZGVmaW5pdGlvbiBpcyBmb3IgaW50ZXJuYWwgdXNhZ2UuIGRvZXNuJ3QgZmlsbCBpbiB0aGUgSUUgb3Igb3RoZXIgZmllbGQuCisjZGVmaW5lIEJXXzEwCQlCQU5EX1dJRFRIXzEwCS8qIDgwMi4xMWogaGFzIDEwTUh6LiBUaGlzIGRlZmluaXRpb24gaXMgZm9yIGludGVybmFsIHVzYWdlLiBkb2Vzbid0IGZpbGwgaW4gdGhlIElFIG9yIG90aGVyIGZpZWxkLiAqLwogCi0vLyBTSE9SVEdJCi0jZGVmaW5lIEdJXzQwMAkJR0FQX0lOVEVSVkFMXzQwMAkvLyBvbmx5IHN1cHBvcnQgaW4gSFQgbW9kZQorLyogU0hPUlRHSSAqLworI2RlZmluZSBHSV80MDAJCUdBUF9JTlRFUlZBTF80MDAJLyogb25seSBzdXBwb3J0IGluIEhUIG1vZGUgKi8KICNkZWZpbmUgR0lfQk9USAkJR0FQX0lOVEVSVkFMX0JPVEgKICNkZWZpbmUgR0lfODAwCQlHQVBfSU5URVJWQUxfODAwCi0vLyBTVEJDCisvKiBTVEJDICovCiAjZGVmaW5lIFNUQkNfTk9ORQkwCi0jZGVmaW5lIFNUQkNfVVNFCTEJLy8gbGltaXRlZCB1c2UgaW4gcnQyODYwYiBwaHkKLSNkZWZpbmUgUlhTVEJDX09ORQkxCS8vIHJ4IHN1cHBvcnQgb2Ygb25lIHNwYXRpYWwgc3RyZWFtCi0jZGVmaW5lIFJYU1RCQ19UV08JMgkvLyByeCBzdXBwb3J0IG9mIDEgYW5kIDIgc3BhdGlhbCBzdHJlYW0KLSNkZWZpbmUgUlhTVEJDX1RIUgkzCS8vIHJ4IHN1cHBvcnQgb2YgMX4zIHNwYXRpYWwgc3RyZWFtCi0vLyBNQ1MgRkVFREJBQ0sKLSNkZWZpbmUgTUNTRkJLX05PTkUJMCAgLy8gbm90IHN1cHBvcnQgbWNzIGZlZWRiYWNrIC8KLSNkZWZpbmUgTUNTRkJLX1JTVgkxCS8vIHJlc2VydmVkCi0jZGVmaW5lIE1DU0ZCS19VTlNPTElDSVQJMgkvLyBvbmx5IHN1cHBvcnQgdW5zb2xpY3QgbWNzIGZlZWRiYWNrCi0jZGVmaW5lIE1DU0ZCS19NUlEJMwkvLyByZXNwb25zZSB0byBib3RoIE1SUSBhbmQgdW5zb2xpY3QgbWNzIGZlZWRiYWNrCisjZGVmaW5lIFNUQkNfVVNFCTEJLyogbGltaXRlZCB1c2UgaW4gcnQyODYwYiBwaHkgKi8KKyNkZWZpbmUgUlhTVEJDX09ORQkxCS8qIHJ4IHN1cHBvcnQgb2Ygb25lIHNwYXRpYWwgc3RyZWFtICovCisjZGVmaW5lIFJYU1RCQ19UV08JMgkvKiByeCBzdXBwb3J0IG9mIDEgYW5kIDIgc3BhdGlhbCBzdHJlYW0gKi8KKyNkZWZpbmUgUlhTVEJDX1RIUgkzCS8qIHJ4IHN1cHBvcnQgb2YgMX4zIHNwYXRpYWwgc3RyZWFtICovCisvKiBNQ1MgRkVFREJBQ0sgKi8KKyNkZWZpbmUgTUNTRkJLX05PTkUJMAkvKiBub3Qgc3VwcG9ydCBtY3MgZmVlZGJhY2sgLyAqLworI2RlZmluZSBNQ1NGQktfUlNWCTEJLyogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTUNTRkJLX1VOU09MSUNJVAkyCS8qIG9ubHkgc3VwcG9ydCB1bnNvbGljdCBtY3MgZmVlZGJhY2sgKi8KKyNkZWZpbmUgTUNTRkJLX01SUQkzCS8qIHJlc3BvbnNlIHRvIGJvdGggTVJRIGFuZCB1bnNvbGljdCBtY3MgZmVlZGJhY2sgKi8KIAotLy8gTUlNTyBwb3dlciBzYWZlCisvKiBNSU1PIHBvd2VyIHNhZmUgKi8KICNkZWZpbmUJTU1QU19TVEFUSUMJMAogI2RlZmluZQlNTVBTX0RZTkFNSUMJCTEKICNkZWZpbmUgICBNTVBTX1JTVgkJMgogI2RlZmluZSBNTVBTX0VOQUJMRQkJMwogCi0KLS8vIEEtTVNEVSBzaXplCisvKiBBLU1TRFUgc2l6ZSAqLwogI2RlZmluZQlBTVNEVV8wCTAKICNkZWZpbmUJQU1TRFVfMQkJMQogCi0vLyBNQ1MgdXNlIDcgYml0cworLyogTUNTIHVzZSA3IGJpdHMgKi8KICNkZWZpbmUgVFhSQVRFTUlNTwkJMHg4MAogI2RlZmluZSBUWFJBVEVNQ1MJCTB4N0YKICNkZWZpbmUgVFhSQVRFT0ZETQkJMHg3RgpAQCAtMTExOSw3MyArMTA3NCw3NyBAQAogI2RlZmluZSBSQVRFXzIgICAgICAgICAgICAgICAgICAgICAgMQogI2RlZmluZSBSQVRFXzVfNSAgICAgICAgICAgICAgICAgICAgMgogI2RlZmluZSBSQVRFXzExICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBSQVRFXzYgICAgICAgICAgICAgICAgICAgICAgNCAgIC8vIE9GRE0KLSNkZWZpbmUgUkFURV85ICAgICAgICAgICAgICAgICAgICAgIDUgICAvLyBPRkRNCi0jZGVmaW5lIFJBVEVfMTIgICAgICAgICAgICAgICAgICAgICA2ICAgLy8gT0ZETQotI2RlZmluZSBSQVRFXzE4ICAgICAgICAgICAgICAgICAgICAgNyAgIC8vIE9GRE0KLSNkZWZpbmUgUkFURV8yNCAgICAgICAgICAgICAgICAgICAgIDggICAvLyBPRkRNCi0jZGVmaW5lIFJBVEVfMzYgICAgICAgICAgICAgICAgICAgICA5ICAgLy8gT0ZETQotI2RlZmluZSBSQVRFXzQ4ICAgICAgICAgICAgICAgICAgICAgMTAgIC8vIE9GRE0KLSNkZWZpbmUgUkFURV81NCAgICAgICAgICAgICAgICAgICAgIDExICAvLyBPRkRNCisjZGVmaW5lIFJBVEVfNiAgICAgICAgICAgICAgICAgICAgICA0CS8qIE9GRE0gKi8KKyNkZWZpbmUgUkFURV85ICAgICAgICAgICAgICAgICAgICAgIDUJLyogT0ZETSAqLworI2RlZmluZSBSQVRFXzEyICAgICAgICAgICAgICAgICAgICAgNgkvKiBPRkRNICovCisjZGVmaW5lIFJBVEVfMTggICAgICAgICAgICAgICAgICAgICA3CS8qIE9GRE0gKi8KKyNkZWZpbmUgUkFURV8yNCAgICAgICAgICAgICAgICAgICAgIDgJLyogT0ZETSAqLworI2RlZmluZSBSQVRFXzM2ICAgICAgICAgICAgICAgICAgICAgOQkvKiBPRkRNICovCisjZGVmaW5lIFJBVEVfNDggICAgICAgICAgICAgICAgICAgICAxMAkvKiBPRkRNICovCisjZGVmaW5lIFJBVEVfNTQgICAgICAgICAgICAgICAgICAgICAxMQkvKiBPRkRNICovCiAjZGVmaW5lIFJBVEVfRklSU1RfT0ZETV9SQVRFICAgICAgICBSQVRFXzYKICNkZWZpbmUgUkFURV9MQVNUX09GRE1fUkFURSAgICAgICAgCVJBVEVfNTQKLSNkZWZpbmUgUkFURV82XzUgICAgICAgICAgICAgICAgICAgIDEyICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV8xMyAgICAgICAgICAgICAgICAgICAgIDEzICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV8xOV81ICAgICAgICAgICAgICAgICAgIDE0ICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV8yNiAgICAgICAgICAgICAgICAgICAgIDE1ICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV8zOSAgICAgICAgICAgICAgICAgICAgIDE2ICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV81MiAgICAgICAgICAgICAgICAgICAgIDE3ICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV81OF81ICAgICAgICAgICAgICAgICAgIDE4ICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV82NSAgICAgICAgICAgICAgICAgICAgIDE5ICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV83OCAgICAgICAgICAgICAgICAgICAgIDIwICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV8xMDQgICAgICAgICAgICAgICAgICAgIDIxICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV8xMTcgICAgICAgICAgICAgICAgICAgIDIyICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV8xMzAgICAgICAgICAgICAgICAgICAgIDIzICAvLyBIVCBtaXgKLS8vI2RlZmluZSBSQVRFX0FVVE9fU1dJVENIICAgICAgICAgICAgMjU1IC8vIGZvciBTdGFDZmcuRml4ZWRUeFJhdGUgb25seQorI2RlZmluZSBSQVRFXzZfNSAgICAgICAgICAgICAgICAgICAgMTIJLyogSFQgbWl4ICovCisjZGVmaW5lIFJBVEVfMTMgICAgICAgICAgICAgICAgICAgICAxMwkvKiBIVCBtaXggKi8KKyNkZWZpbmUgUkFURV8xOV81ICAgICAgICAgICAgICAgICAgIDE0CS8qIEhUIG1peCAqLworI2RlZmluZSBSQVRFXzI2ICAgICAgICAgICAgICAgICAgICAgMTUJLyogSFQgbWl4ICovCisjZGVmaW5lIFJBVEVfMzkgICAgICAgICAgICAgICAgICAgICAxNgkvKiBIVCBtaXggKi8KKyNkZWZpbmUgUkFURV81MiAgICAgICAgICAgICAgICAgICAgIDE3CS8qIEhUIG1peCAqLworI2RlZmluZSBSQVRFXzU4XzUgICAgICAgICAgICAgICAgICAgMTgJLyogSFQgbWl4ICovCisjZGVmaW5lIFJBVEVfNjUgICAgICAgICAgICAgICAgICAgICAxOQkvKiBIVCBtaXggKi8KKyNkZWZpbmUgUkFURV83OCAgICAgICAgICAgICAgICAgICAgIDIwCS8qIEhUIG1peCAqLworI2RlZmluZSBSQVRFXzEwNCAgICAgICAgICAgICAgICAgICAgMjEJLyogSFQgbWl4ICovCisjZGVmaW5lIFJBVEVfMTE3ICAgICAgICAgICAgICAgICAgICAyMgkvKiBIVCBtaXggKi8KKyNkZWZpbmUgUkFURV8xMzAgICAgICAgICAgICAgICAgICAgIDIzCS8qIEhUIG1peCAqLworLyojZGVmaW5lIFJBVEVfQVVUT19TV0lUQ0ggICAgICAgICAgICAyNTUgLy8gZm9yIFN0YUNmZy5GaXhlZFR4UmF0ZSBvbmx5ICovCiAjZGVmaW5lIEhUUkFURV8wICAgICAgICAgICAgICAgICAgICAgIDEyCiAjZGVmaW5lIFJBVEVfRklSU1RfTU1fUkFURSAgICAgICAgSFRSQVRFXzAKICNkZWZpbmUgUkFURV9GSVJTVF9IVF9SQVRFICAgICAgICBIVFJBVEVfMAogI2RlZmluZSBSQVRFX0xBU1RfSFRfUkFURSAgICAgICAgSFRSQVRFXzAKIAotLy8gcFR4V0ktPnR4b3AKLSNkZWZpbmUgSUZTX0hUVFhPUCAgICAgICAgICAgICAgICAgMAkvLyBUaGUgdHhvcCB3aWxsIGJlIGhhbmRsZXMgYnkgQVNJQy4KKy8qIHBUeFdJLT50eG9wICovCisjZGVmaW5lIElGU19IVFRYT1AgICAgICAgICAgICAgICAgIDAJLyogVGhlIHR4b3Agd2lsbCBiZSBoYW5kbGVzIGJ5IEFTSUMuICovCiAjZGVmaW5lIElGU19QSUZTICAgICAgICAgICAgICAgICAgICAxCiAjZGVmaW5lIElGU19TSUZTICAgICAgICAgICAgICAgICAgICAyCiAjZGVmaW5lIElGU19CQUNLT0ZGICAgICAgICAgICAgICAgICAzCiAKLS8vIHBUeEQtPlJldHJ5TW9kZQotI2RlZmluZSBMT05HX1JFVFJZICAgICAgICAgICAgICAgICAgMQorLyogcFR4RC0+UmV0cnlNb2RlICovCisjZGVmaW5lIGxvbmdfUkVUUlkgICAgICAgICAgICAgICAgICAxCiAjZGVmaW5lIFNIT1JUX1JFVFJZICAgICAgICAgICAgICAgICAwCiAKLS8vIENvdW50cnkgUmVnaW9uIGRlZmluaXRpb24KKy8qIENvdW50cnkgUmVnaW9uIGRlZmluaXRpb24gKi8KICNkZWZpbmUgUkVHSU9OX01JTklNVU1fQkdfQkFORCAgICAgICAgICAgIDAKLSNkZWZpbmUgUkVHSU9OXzBfQkdfQkFORCAgICAgICAgICAgICAgICAgIDAgICAgICAgLy8gMS0xMQotI2RlZmluZSBSRUdJT05fMV9CR19CQU5EICAgICAgICAgICAgICAgICAgMSAgICAgICAvLyAxLTEzCi0jZGVmaW5lIFJFR0lPTl8yX0JHX0JBTkQgICAgICAgICAgICAgICAgICAyICAgICAgIC8vIDEwLTExCi0jZGVmaW5lIFJFR0lPTl8zX0JHX0JBTkQgICAgICAgICAgICAgICAgICAzICAgICAgIC8vIDEwLTEzCi0jZGVmaW5lIFJFR0lPTl80X0JHX0JBTkQgICAgICAgICAgICAgICAgICA0ICAgICAgIC8vIDE0Ci0jZGVmaW5lIFJFR0lPTl81X0JHX0JBTkQgICAgICAgICAgICAgICAgICA1ICAgICAgIC8vIDEtMTQKLSNkZWZpbmUgUkVHSU9OXzZfQkdfQkFORCAgICAgICAgICAgICAgICAgIDYgICAgICAgLy8gMy05Ci0jZGVmaW5lIFJFR0lPTl83X0JHX0JBTkQgICAgICAgICAgICAgICAgICA3ICAgICAgIC8vIDUtMTMKLSNkZWZpbmUgUkVHSU9OXzMxX0JHX0JBTkQgICAgICAgICAgICAgICAgIDMxICAgICAgIC8vIDUtMTMKKyNkZWZpbmUgUkVHSU9OXzBfQkdfQkFORCAgICAgICAgICAgICAgICAgIDAJLyogMS0xMSAqLworI2RlZmluZSBSRUdJT05fMV9CR19CQU5EICAgICAgICAgICAgICAgICAgMQkvKiAxLTEzICovCisjZGVmaW5lIFJFR0lPTl8yX0JHX0JBTkQgICAgICAgICAgICAgICAgICAyCS8qIDEwLTExICovCisjZGVmaW5lIFJFR0lPTl8zX0JHX0JBTkQgICAgICAgICAgICAgICAgICAzCS8qIDEwLTEzICovCisjZGVmaW5lIFJFR0lPTl80X0JHX0JBTkQgICAgICAgICAgICAgICAgICA0CS8qIDE0ICovCisjZGVmaW5lIFJFR0lPTl81X0JHX0JBTkQgICAgICAgICAgICAgICAgICA1CS8qIDEtMTQgKi8KKyNkZWZpbmUgUkVHSU9OXzZfQkdfQkFORCAgICAgICAgICAgICAgICAgIDYJLyogMy05ICovCisjZGVmaW5lIFJFR0lPTl83X0JHX0JBTkQgICAgICAgICAgICAgICAgICA3CS8qIDUtMTMgKi8KKyNkZWZpbmUgUkVHSU9OXzMxX0JHX0JBTkQgICAgICAgICAgICAgICAgIDMxCS8qIDUtMTMgKi8KICNkZWZpbmUgUkVHSU9OX01BWElNVU1fQkdfQkFORCAgICAgICAgICAgIDcKIAogI2RlZmluZSBSRUdJT05fTUlOSU1VTV9BX0JBTkQgICAgICAgICAgICAgMAotI2RlZmluZSBSRUdJT05fMF9BX0JBTkQgICAgICAgICAgICAgICAgICAgMCAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1Ci0jZGVmaW5lIFJFR0lPTl8xX0FfQkFORCAgICAgICAgICAgICAgICAgICAxICAgICAgIC8vIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAKLSNkZWZpbmUgUkVHSU9OXzJfQV9CQU5EICAgICAgICAgICAgICAgICAgIDIgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0Ci0jZGVmaW5lIFJFR0lPTl8zX0FfQkFORCAgICAgICAgICAgICAgICAgICAzICAgICAgIC8vIDUyLCA1NiwgNjAsIDY0LCAxNDksIDE1MywgMTU3LCAxNjEKLSNkZWZpbmUgUkVHSU9OXzRfQV9CQU5EICAgICAgICAgICAgICAgICAgIDQgICAgICAgLy8gMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUKLSNkZWZpbmUgUkVHSU9OXzVfQV9CQU5EICAgICAgICAgICAgICAgICAgIDUgICAgICAgLy8gMTQ5LCAxNTMsIDE1NywgMTYxCi0jZGVmaW5lIFJFR0lPTl82X0FfQkFORCAgICAgICAgICAgICAgICAgICA2ICAgICAgIC8vIDM2LCA0MCwgNDQsIDQ4Ci0jZGVmaW5lIFJFR0lPTl83X0FfQkFORCAgICAgICAgICAgICAgICAgICA3ICAgICAgIC8vIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1Ci0jZGVmaW5lIFJFR0lPTl84X0FfQkFORCAgICAgICAgICAgICAgICAgICA4ICAgICAgIC8vIDUyLCA1NiwgNjAsIDY0Ci0jZGVmaW5lIFJFR0lPTl85X0FfQkFORCAgICAgICAgICAgICAgICAgICA5ICAgICAgIC8vIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEzMiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1Ci0jZGVmaW5lIFJFR0lPTl8xMF9BX0JBTkQgICAgICAgICAgICAgICAgICAxMAkgIC8vIDM2LCA0MCwgNDQsIDQ4LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQotI2RlZmluZSBSRUdJT05fMTFfQV9CQU5EICAgICAgICAgICAgICAgICAgMTEJICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDE0OSwgMTUzLCAxNTcsIDE2MQotI2RlZmluZSBSRUdJT05fTUFYSU1VTV9BX0JBTkQgICAgICAgICAgICAgMTEKKyNkZWZpbmUgUkVHSU9OXzBfQV9CQU5EICAgICAgICAgICAgICAgICAgIDAJLyogMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NSAqLworI2RlZmluZSBSRUdJT05fMV9BX0JBTkQgICAgICAgICAgICAgICAgICAgMQkvKiAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwICovCisjZGVmaW5lIFJFR0lPTl8yX0FfQkFORCAgICAgICAgICAgICAgICAgICAyCS8qIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCAqLworI2RlZmluZSBSRUdJT05fM19BX0JBTkQgICAgICAgICAgICAgICAgICAgMwkvKiA1MiwgNTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxICovCisjZGVmaW5lIFJFR0lPTl80X0FfQkFORCAgICAgICAgICAgICAgICAgICA0CS8qIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1ICovCisjZGVmaW5lIFJFR0lPTl81X0FfQkFORCAgICAgICAgICAgICAgICAgICA1CS8qIDE0OSwgMTUzLCAxNTcsIDE2MSAqLworI2RlZmluZSBSRUdJT05fNl9BX0JBTkQgICAgICAgICAgICAgICAgICAgNgkvKiAzNiwgNDAsIDQ0LCA0OCAqLworI2RlZmluZSBSRUdJT05fN19BX0JBTkQgICAgICAgICAgICAgICAgICAgNwkvKiAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NSwgMTY5LCAxNzMgKi8KKyNkZWZpbmUgUkVHSU9OXzhfQV9CQU5EICAgICAgICAgICAgICAgICAgIDgJLyogNTIsIDU2LCA2MCwgNjQgKi8KKyNkZWZpbmUgUkVHSU9OXzlfQV9CQU5EICAgICAgICAgICAgICAgICAgIDkJLyogMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTMyLCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUgKi8KKyNkZWZpbmUgUkVHSU9OXzEwX0FfQkFORCAgICAgICAgICAgICAgICAgIDEwCS8qIDM2LCA0MCwgNDQsIDQ4LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NSAqLworI2RlZmluZSBSRUdJT05fMTFfQV9CQU5EICAgICAgICAgICAgICAgICAgMTEJLyogMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxNDksIDE1MywgMTU3LCAxNjEgKi8KKyNkZWZpbmUgUkVHSU9OXzEyX0FfQkFORCAgICAgICAgICAgICAgICAgIDEyCS8qIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAgKi8KKyNkZWZpbmUgUkVHSU9OXzEzX0FfQkFORCAgICAgICAgICAgICAgICAgIDEzCS8qIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxICovCisjZGVmaW5lIFJFR0lPTl8xNF9BX0JBTkQgICAgICAgICAgICAgICAgICAxNAkvKiAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUgKi8KKyNkZWZpbmUgUkVHSU9OXzE1X0FfQkFORCAgICAgICAgICAgICAgICAgIDE1CS8qIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1LCAxNjksIDE3MyAqLworI2RlZmluZSBSRUdJT05fTUFYSU1VTV9BX0JBTkQgICAgICAgICAgICAgMTUKIAotLy8gcFR4RC0+Q2lwaGVyQWxnCisvKiBwVHhELT5DaXBoZXJBbGcgKi8KICNkZWZpbmUgQ0lQSEVSX05PTkUgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgQ0lQSEVSX1dFUDY0ICAgICAgICAgICAgICAgIDEKICNkZWZpbmUgQ0lQSEVSX1dFUDEyOCAgICAgICAgICAgICAgIDIKQEAgLTExOTMsMjAgKzExNTIsMTAgQEAKICNkZWZpbmUgQ0lQSEVSX0FFUyAgICAgICAgICAgICAgICAgIDQKICNkZWZpbmUgQ0lQSEVSX0NLSVA2NCAgICAgICAgICAgICAgIDUKICNkZWZpbmUgQ0lQSEVSX0NLSVAxMjggICAgICAgICAgICAgIDYKLSNkZWZpbmUgQ0lQSEVSX1RLSVBfTk9fTUlDICAgICAgICAgIDcgICAgICAgLy8gTUlDIGFwcGVuZGVkIGJ5IGRyaXZlcjogbm90IGEgdmFsaWQgdmFsdWUgaW4gaGFyZHdhcmUga2V5IHRhYmxlCisjZGVmaW5lIENJUEhFUl9US0lQX05PX01JQyAgICAgICAgICA3CS8qIE1JQyBhcHBlbmRlZCBieSBkcml2ZXI6IG5vdCBhIHZhbGlkIHZhbHVlIGluIGhhcmR3YXJlIGtleSB0YWJsZSAqLwogI2RlZmluZSBDSVBIRVJfU01TNAkJCQkJOAogCi0vLyB2YWx1ZSBkb21haW4gb2YgcEFkLT5SZkljVHlwZQotI2RlZmluZSBSRklDXzI4MjAgICAgICAgICAgICAgICAgICAgMSAgICAgICAvLyAyLjRHIDJUM1IKLSNkZWZpbmUgUkZJQ18yODUwICAgICAgICAgICAgICAgICAgIDIgICAgICAgLy8gMi40Ry81RyAyVDNSCi0jZGVmaW5lIFJGSUNfMjcyMCAgICAgICAgICAgICAgICAgICAzICAgICAgIC8vIDIuNEcgMVQyUgotI2RlZmluZSBSRklDXzI3NTAgICAgICAgICAgICAgICAgICAgNCAgICAgICAvLyAyLjRHLzVHIDFUMlIKLSNkZWZpbmUgUkZJQ18zMDIwICAgICAgICAgICAgICAgICAgIDUgICAgICAgLy8gMi40RyAxVDFSCi0jZGVmaW5lIFJGSUNfMjAyMCAgICAgICAgICAgICAgICAgICA2ICAgICAgIC8vIDIuNEcgQi9HCi0jZGVmaW5lIFJGSUNfMzAyMSAgICAgICAgICAgICAgICAgICA3ICAgICAgIC8vIDIuNEcgMVQyUgotI2RlZmluZSBSRklDXzMwMjIgICAgICAgICAgICAgICAgICAgOCAgICAgICAvLyAyLjRHIDJUMlIKLQotLy8gTEVEIFN0YXR1cy4KKy8qIExFRCBTdGF0dXMuICovCiAjZGVmaW5lIExFRF9MSU5LX0RPV04gICAgICAgICAgICAgICAwCiAjZGVmaW5lIExFRF9MSU5LX1VQICAgICAgICAgICAgICAgICAxCiAjZGVmaW5lIExFRF9SQURJT19PRkYgICAgICAgICAgICAgICAyCkBAIC0xMjE2LDM1ICsxMTY1LDM1IEBACiAjZGVmaW5lIExFRF9PTl9TSVRFX1NVUlZFWSAgICAgICAgICA2CiAjZGVmaW5lIExFRF9QT1dFUl9VUCAgICAgICAgICAgICAgICA3CiAKLS8vIHZhbHVlIGRvbWFpbiBvZiBwQWQtPkxlZENudGwuTGVkTW9kZSBhbmQgRTJQUk9NCisvKiB2YWx1ZSBkb21haW4gb2YgcEFkLT5MZWRDbnRsLkxlZE1vZGUgYW5kIEUyUFJPTSAqLwogI2RlZmluZSBMRURfTU9ERV9ERUZBVUxUICAgICAgICAgICAgMAogI2RlZmluZSBMRURfTU9ERV9UV09fTEVECQkJMQotI2RlZmluZSBMRURfTU9ERV9TSUdOQUxfU1RSRUdUSAkJOCAgLy8gRUVQUk9NIGRlZmluZSA9OAorLyojZGVmaW5lIExFRF9NT0RFX1NJR05BTF9TVFJFR1RIICAgICAgICAgICAgICAgOCAgLy8gRUVQUk9NIGRlZmluZSA9OCAqLworI2RlZmluZSBMRURfTU9ERV9TSUdOQUxfU1RSRUdUSAkJMHg0MAkvKiBFRVBST00gZGVmaW5lID0gNjQgKi8KIAotLy8gUkM0IGluaXQgdmFsdWUsIHVzZWQgZnJvIFdFUCAmIFRLSVAKLSNkZWZpbmUgUFBQSU5JVEZDUzMyICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYgICAvKiBJbml0aWFsIEZDUyB2YWx1ZSAqLworLyogUkM0IGluaXQgdmFsdWUsIHVzZWQgZnJvIFdFUCAmIFRLSVAgKi8KKyNkZWZpbmUgUFBQSU5JVEZDUzMyICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYJLyogSW5pdGlhbCBGQ1MgdmFsdWUgKi8KIAotLy8gdmFsdWUgZG9tYWluIG9mIHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkLiA4MDIuMVggY29udHJvbGxlZCBwb3J0IGRlZmluaXRpb24KKy8qIHZhbHVlIGRvbWFpbiBvZiBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZC4gODAyLjFYIGNvbnRyb2xsZWQgcG9ydCBkZWZpbml0aW9uICovCiAjZGVmaW5lIFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEICAgICAxCiAjZGVmaW5lIFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCAyCiAKICNkZWZpbmUgUEFJUldJU0VfS0VZICAgICAgICAgICAgICAgIDEKICNkZWZpbmUgR1JPVVBfS0VZICAgICAgICAgICAgICAgICAgIDIKIAotLy9kZWZpbml0aW9uIG9mIERSUworLypkZWZpbml0aW9uIG9mIERSUyAqLwogI2RlZmluZSBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSAkzMgogCi0KLS8vIHByZS1hbGxvY2F0ZWQgZnJlZSBORElTIFBBQ0tFVC9CVUZGRVIgcG9sbCBmb3IgaW50ZXJuYWwgdXNhZ2UKKy8qIHByZS1hbGxvY2F0ZWQgZnJlZSBORElTIFBBQ0tFVC9CVUZGRVIgcG9sbCBmb3IgaW50ZXJuYWwgdXNhZ2UgKi8KICNkZWZpbmUgTUFYX05VTV9PRl9GUkVFX05ESVNfUEFDS0VUIDEyOAogCi0vL0Jsb2NrIEFDSworLypCbG9jayBBQ0sgKi8KICNkZWZpbmUgTUFYX1RYX1JFT1JERVJCVUYgICA2NAogI2RlZmluZSBNQVhfUlhfUkVPUkRFUkJVRiAgIDY0CiAjZGVmaW5lIERFRkFVTFRfVFhfVElNRU9VVCAgIDMwCiAjZGVmaW5lIERFRkFVTFRfUlhfVElNRU9VVCAgIDMwCiAKLS8vIGRlZmluaXRpb24gb2YgUmVjaXBpZW50IG9yIE9yaWdpbmF0b3IKKy8qIGRlZmluaXRpb24gb2YgUmVjaXBpZW50IG9yIE9yaWdpbmF0b3IgKi8KICNkZWZpbmUgSV9SRUNJUElFTlQgICAgICAgICAgICAgICAgICBUUlVFCiAjZGVmaW5lIElfT1JJR0lOQVRPUiAgICAgICAgICAgICAgICAgICBGQUxTRQogCkBAIC0xMjUyLDQ2ICsxMjAxLDQ1IEBACiAjZGVmaW5lIERFRkFVTFRfUkZfVFhfUE9XRVIgICAgICAgICA1CiAKICNkZWZpbmUgTUFYX0lOSV9CVUZGRVJfU0laRQkJCTQwOTYKLSNkZWZpbmUgTUFYX1BBUkFNX0JVRkZFUl9TSVpFCQkoMjA0OCkgLy8gZW5vdWdoIGZvciBBQ0wgKDE4KjY0KQotCQkJCQkJCQkJCQkvLzE4IDogdGhlIGxlbmd0aCBvZiBNYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAiMDE6MDI6MDM6MDQ6MDU6MDY7IikKLQkJCQkJCQkJCQkJLy82NCA6IE1BWF9OVU1fT0ZfQUNMX0xJU1QKLS8vIGRlZmluaXRpb24gb2YgcEFkLT5PcE1vZGUKKyNkZWZpbmUgTUFYX1BBUkFNX0JVRkZFUl9TSVpFCQkoMjA0OCkJLyogZW5vdWdoIGZvciBBQ0wgKDE4KjY0KSAqLworCQkJCQkJCQkJCQkvKjE4IDogdGhlIGxlbmd0aCBvZiBNYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAiMDE6MDI6MDM6MDQ6MDU6MDY7IikgKi8KKwkJCQkJCQkJCQkJLyo2NCA6IE1BWF9OVU1fT0ZfQUNMX0xJU1QgKi8KKy8qIGRlZmluaXRpb24gb2YgcEFkLT5PcE1vZGUgKi8KICNkZWZpbmUgT1BNT0RFX1NUQSAgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgT1BNT0RFX0FQICAgICAgICAgICAgICAgICAgIDEKLS8vI2RlZmluZSBPUE1PREVfTDNfQlJHICAgICAgICAgICAgICAgMiAgICAgICAvLyBhcyBBUCBhbmQgU1RBIGF0IHRoZSBzYW1lIHRpbWUKKy8qI2RlZmluZSBPUE1PREVfTDNfQlJHICAgICAgICAgICAgICAgMiAgICAgICAvLyBhcyBBUCBhbmQgU1RBIGF0IHRoZSBzYW1lIHRpbWUgKi8KIAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBBUCBydG1wX2RlZi5oID09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gdmFsdWUgZG9tYWluIGZvciBwQWQtPkV2ZW50VGFiLkxvZ1tdLkV2ZW50Ci0jZGVmaW5lIEVWRU5UX1JFU0VUX0FDQ0VTU19QT0lOVCAgICAwIC8vIExvZyA9ICJoaDptbTpzcyAgIFJlc3RhcnQgQWNjZXNzIFBvaW50IgotI2RlZmluZSBFVkVOVF9BU1NPQ0lBVEVEICAgICAgICAgICAgMSAvLyBMb2cgPSAiaGg6bW06c3MgICBTVEEgMDA6MDE6MDI6MDM6MDQ6MDUgYXNzb2NpYXRlZCIKLSNkZWZpbmUgRVZFTlRfRElTQVNTT0NJQVRFRCAgICAgICAgIDIgLy8gTG9nID0gImhoOm1tOnNzICAgU1RBIDAwOjAxOjAyOjAzOjA0OjA1IGxlZnQgdGhpcyBCU1MiCi0jZGVmaW5lIEVWRU5UX0FHRURfT1VUICAgICAgICAgICAgICAzIC8vIExvZyA9ICJoaDptbTpzcyAgIFNUQSAwMDowMTowMjowMzowNDowNSB3YXMgYWdlZC1vdXQgYW5kIHJlbW92ZWQgZnJvbSB0aGlzIEJTUyIKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT0gQVAgcnRtcF9kZWYuaCA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIHZhbHVlIGRvbWFpbiBmb3IgcEFkLT5FdmVudFRhYi5Mb2dbXS5FdmVudCAqLworI2RlZmluZSBFVkVOVF9SRVNFVF9BQ0NFU1NfUE9pbnQgICAgMAkvKiBMb2cgPSAiaGg6bW06c3MgICBSZXN0YXJ0IEFjY2VzcyBQb2ludCIgKi8KKyNkZWZpbmUgRVZFTlRfQVNTT0NJQVRFRCAgICAgICAgICAgIDEJLyogTG9nID0gImhoOm1tOnNzICAgU1RBIDAwOjAxOjAyOjAzOjA0OjA1IGFzc29jaWF0ZWQiICovCisjZGVmaW5lIEVWRU5UX0RJU0FTU09DSUFURUQgICAgICAgICAyCS8qIExvZyA9ICJoaDptbTpzcyAgIFNUQSAwMDowMTowMjowMzowNDowNSBsZWZ0IHRoaXMgQlNTIiAqLworI2RlZmluZSBFVkVOVF9BR0VEX09VVCAgICAgICAgICAgICAgMwkvKiBMb2cgPSAiaGg6bW06c3MgICBTVEEgMDA6MDE6MDI6MDM6MDQ6MDUgd2FzIGFnZWQtb3V0IGFuZCByZW1vdmVkIGZyb20gdGhpcyBCU1MiICovCiAjZGVmaW5lIEVWRU5UX0NPVU5URVJfTSAgICAgICAgICAgICA0CiAjZGVmaW5lIEVWRU5UX0lOVkFMSURfUFNLICAgICAgICAgICA1CiAjZGVmaW5lIEVWRU5UX01BWF9FVkVOVF9UWVBFICAgICAgICA2Ci0vLyA9PT09IGVuZCBvZiBBUCBydG1wX2RlZi5oID09PT09PT09PT09PQorLyogPT09PSBlbmQgb2YgQVAgcnRtcF9kZWYuaCA9PT09PT09PT09PT0gKi8KIAotLy8gZGVmaW5pdGlvbiBSU1NJIE51bWJlcgorLyogZGVmaW5pdGlvbiBSU1NJIE51bWJlciAqLwogI2RlZmluZSBSU1NJXzAJCQkJCTAKICNkZWZpbmUgUlNTSV8xCQkJCQkxCiAjZGVmaW5lIFJTU0lfMgkJCQkJMgogCi0vLyBkZWZpbml0aW9uIG9mIHJhZGFyIGRldGVjdGlvbgotI2RlZmluZSBSRF9OT1JNQUxfTU9ERQkJCQkwCS8vIE5vdCBmb3VuZCByYWRhciBzaWduYWwKLSNkZWZpbmUgUkRfU1dJVENISU5HX01PREUJCQkxCS8vIEZvdW5kIHJhZGFyIHNpZ25hbCwgYW5kIGRvaW5nIGNoYW5uZWwgc3dpdGNoCi0jZGVmaW5lIFJEX1NJTEVOQ0VfTU9ERQkJCQkyCS8vIEFmdGVyIGNoYW5uZWwgc3dpdGNoLCBuZWVkIHRvIGJlIHNpbGVuY2UgYSB3aGlsZSB0byBlbnN1cmUgcmFkYXIgbm90IGZvdW5kCisvKiBkZWZpbml0aW9uIG9mIHJhZGFyIGRldGVjdGlvbiAqLworI2RlZmluZSBSRF9OT1JNQUxfTU9ERQkJCQkwCS8qIE5vdCBmb3VuZCByYWRhciBzaWduYWwgKi8KKyNkZWZpbmUgUkRfU1dJVENISU5HX01PREUJCQkxCS8qIEZvdW5kIHJhZGFyIHNpZ25hbCwgYW5kIGRvaW5nIGNoYW5uZWwgc3dpdGNoICovCisjZGVmaW5lIFJEX1NJTEVOQ0VfTU9ERQkJCQkyCS8qIEFmdGVyIGNoYW5uZWwgc3dpdGNoLCBuZWVkIHRvIGJlIHNpbGVuY2UgYSB3aGlsZSB0byBlbnN1cmUgcmFkYXIgbm90IGZvdW5kICovCiAKLS8vRHJpdmVyIGRlZmluZWQgY2lkIGZvciBtYXBwaW5nIHN0YXR1cyBhbmQgY29tbWFuZC4KKy8qRHJpdmVyIGRlZmluZWQgY2lkIGZvciBtYXBwaW5nIHN0YXR1cyBhbmQgY29tbWFuZC4gKi8KICNkZWZpbmUgIFNMRUVQQ0lECTB4MTEKICNkZWZpbmUgIFdBS0VDSUQJMHgyMgogI2RlZmluZSAgUVVFUllQT1dFUkNJRAkweDMzCiAjZGVmaW5lICBPV05FUk1DVQkweDEKICNkZWZpbmUgIE9XTkVSQ1BVCTB4MAogCi0vLyBNQlNTSUQgZGVmaW5pdGlvbgorLyogTUJTU0lEIGRlZmluaXRpb24gKi8KICNkZWZpbmUgRU5UUllfTk9UX0ZPVU5EICAgICAgICAgICAgIDB4RkYKIAotCiAvKiBBZnRlciBMaW51eCAyLjYuOSwKICAqIFZMQU4gbW9kdWxlIHVzZSBQcml2YXRlIChmcm9tIHVzZXIpIGludGVyZmFjZSBmbGFncyAobmV0ZGV2aWNlLT5wcml2X2ZsYWdzKS4KICAqICNkZWZpbmUgSUZGXzgwMl8xUV9WTEFOIDB4MSAgICAgICAgIC0tICAgIDgwMi4xUSBWTEFOIGRldmljZS4gIGluIGlmLmgKQEAgLTEzMDUsMTkgKzEyNTMsMjEgQEAKICNkZWZpbmUgSU5UX0FQQ0xJICAgICAgICAgICAgICAgICAgIDB4MDQwMAogI2RlZmluZSBJTlRfTUVTSCAgICAgICAgICAgICAgICAgICAJMHgwNTAwCiAKLS8vIFVzZSBiaXRtYXAgdG8gYWxsb3cgY29leGlzdCBvZiBBVEVfVFhGUkFNRSBhbmQgQVRFX1JYRlJBTUUoaS5lLix0byBzdXBwb3J0IExvb3BCYWNrIG1vZGUpCisjZGVmaW5lIElORl9NQUlOX0RFVl9OQU1FCQkid2xhbiIKKyNkZWZpbmUgSU5GX01CU1NJRF9ERVZfTkFNRQkJInJhIgorI2RlZmluZSBJTkZfV0RTX0RFVl9OQU1FCQkid2RzIgorI2RlZmluZSBJTkZfQVBDTElfREVWX05BTUUJCSJhcGNsaSIKKyNkZWZpbmUgSU5GX01FU0hfREVWX05BTUUJCSJtZXNoIgogCi0vLyBXRVAgS2V5IFRZUEUKKy8qIFdFUCBLZXkgVFlQRSAqLwogI2RlZmluZSBXRVBfSEVYQURFQ0lNQUxfVFlQRSAgICAwCiAjZGVmaW5lIFdFUF9BU0NJSV9UWVBFICAgICAgICAgIDEKIAotCi0KLS8vIFdJUkVMRVNTIEVWRU5UUyBkZWZpbml0aW9uCisvKiBXSVJFTEVTUyBFVkVOVFMgZGVmaW5pdGlvbiAqLwogLyogTWF4IG51bWJlciBvZiBjaGFyIGluIGN1c3RvbSBldmVudCwgcmVmZXIgdG8gd2lyZWxlc3NfdG9vbHMuMjgvd2lyZWxlc3MuMjAuaCAqLwogI2RlZmluZSBJV19DVVNUT01fTUFYX0xFTgkJCQkgIAkJCTI1NQkvKiBJbiBieXRlcyAqLwogCi0vLyBGb3Igc3lzdGVtIGV2ZW50IC0gc3RhcnQKKy8qIEZvciBzeXN0ZW0gZXZlbnQgLSBzdGFydCAqLwogI2RlZmluZQlJV19TWVNfRVZFTlRfRkxBR19TVEFSVCAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAogI2RlZmluZQlJV19BU1NPQ19FVkVOVF9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAogI2RlZmluZQlJV19ESVNBU1NPQ19FVkVOVF9GTEFHICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMQpAQCAtMTMzOCwxMiArMTI4OCwxMiBAQAogI2RlZmluZSBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRwkJCQkJMHgwMjEwCiAjZGVmaW5lIElXX1NDQU5fQ09NUExFVEVEX0VWRU5UX0ZMQUcJCQkJMHgwMjExCiAjZGVmaW5lIElXX1NDQU5fRU5RVUVVRV9GQUlMX0VWRU5UX0ZMQUcJCQkJMHgwMjEyCi0vLyBpZiBhZGQgbmV3IHN5c3RlbSBldmVudCBmbGFnLCBwbGVhc2UgdXBhZHRlIHRoZSBJV19TWVNfRVZFTlRfRkxBR19FTkQKKy8qIGlmIGFkZCBuZXcgc3lzdGVtIGV2ZW50IGZsYWcsIHBsZWFzZSB1cGFkdGUgdGhlIElXX1NZU19FVkVOVF9GTEFHX0VORCAqLwogI2RlZmluZQlJV19TWVNfRVZFTlRfRkxBR19FTkQgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxMgogI2RlZmluZQlJV19TWVNfRVZFTlRfVFlQRV9OVU0JCQkJCQkoSVdfU1lTX0VWRU5UX0ZMQUdfRU5EIC0gSVdfU1lTX0VWRU5UX0ZMQUdfU1RBUlQgKyAxKQotLy8gRm9yIHN5c3RlbSBldmVudCAtIGVuZAorLyogRm9yIHN5c3RlbSBldmVudCAtIGVuZCAqLwogCi0vLyBGb3Igc3Bvb2YgYXR0YWNrIGV2ZW50IC0gc3RhcnQKKy8qIEZvciBzcG9vZiBhdHRhY2sgZXZlbnQgLSBzdGFydCAqLwogI2RlZmluZQlJV19TUE9PRl9FVkVOVF9GTEFHX1NUQVJUICAgICAgICAgICAgICAgICAgIDB4MDMwMAogI2RlZmluZSBJV19DT05GTElDVF9TU0lEX0VWRU5UX0ZMQUcJCQkJCTB4MDMwMAogI2RlZmluZSBJV19TUE9PRl9BU1NPQ19SRVNQX0VWRU5UX0ZMQUcJCQkJMHgwMzAxCkBAIC0xMzU1LDEyICsxMzA1LDEyIEBACiAjZGVmaW5lIElXX1NQT09GX0RFQVVUSF9FVkVOVF9GTEFHCQkJCQkweDAzMDcKICNkZWZpbmUgSVdfU1BPT0ZfVU5LTk9XTl9NR01UX0VWRU5UX0ZMQUcJCQkweDAzMDgKICNkZWZpbmUgSVdfUkVQTEFZX0FUVEFDS19FVkVOVF9GTEFHCQkJCQkweDAzMDkKLS8vIGlmIGFkZCBuZXcgc3Bvb2YgYXR0YWNrIGV2ZW50IGZsYWcsIHBsZWFzZSB1cGFkdGUgdGhlIElXX1NQT09GX0VWRU5UX0ZMQUdfRU5ECisvKiBpZiBhZGQgbmV3IHNwb29mIGF0dGFjayBldmVudCBmbGFnLCBwbGVhc2UgdXBhZHRlIHRoZSBJV19TUE9PRl9FVkVOVF9GTEFHX0VORCAqLwogI2RlZmluZQlJV19TUE9PRl9FVkVOVF9GTEFHX0VORCAgICAgICAgICAgICAgICAgICAgIDB4MDMwOQogI2RlZmluZQlJV19TUE9PRl9FVkVOVF9UWVBFX05VTQkJCQkJCShJV19TUE9PRl9FVkVOVF9GTEFHX0VORCAtIElXX1NQT09GX0VWRU5UX0ZMQUdfU1RBUlQgKyAxKQotLy8gRm9yIHNwb29mIGF0dGFjayBldmVudCAtIGVuZAorLyogRm9yIHNwb29mIGF0dGFjayBldmVudCAtIGVuZCAqLwogCi0vLyBGb3IgZmxvb2RpbmcgYXR0YWNrIGV2ZW50IC0gc3RhcnQKKy8qIEZvciBmbG9vZGluZyBhdHRhY2sgZXZlbnQgLSBzdGFydCAqLwogI2RlZmluZQlJV19GTE9PRF9FVkVOVF9GTEFHX1NUQVJUICAgICAgICAgICAgICAgICAgIDB4MDQwMAogI2RlZmluZSBJV19GTE9PRF9BVVRIX0VWRU5UX0ZMQUcJCQkJCTB4MDQwMAogI2RlZmluZSBJV19GTE9PRF9BU1NPQ19SRVFfRVZFTlRfRkxBRwkJCQkweDA0MDEKQEAgLTEzNjksMTggKzEzMTksMTggQEAKICNkZWZpbmUgSVdfRkxPT0RfRElTQVNTT0NfRVZFTlRfRkxBRwkJCQkweDA0MDQKICNkZWZpbmUgSVdfRkxPT0RfREVBVVRIX0VWRU5UX0ZMQUcJCQkJCTB4MDQwNQogI2RlZmluZSBJV19GTE9PRF9FQVBfUkVRX0VWRU5UX0ZMQUcJCQkJCTB4MDQwNgotLy8gaWYgYWRkIG5ldyBmbG9vZGluZyBhdHRhY2sgZXZlbnQgZmxhZywgcGxlYXNlIHVwYWR0ZSB0aGUgSVdfRkxPT0RfRVZFTlRfRkxBR19FTkQKKy8qIGlmIGFkZCBuZXcgZmxvb2RpbmcgYXR0YWNrIGV2ZW50IGZsYWcsIHBsZWFzZSB1cGFkdGUgdGhlIElXX0ZMT09EX0VWRU5UX0ZMQUdfRU5EICovCiAjZGVmaW5lCUlXX0ZMT09EX0VWRU5UX0ZMQUdfRU5EICAgICAgICAgICAgICAgICAgIAkweDA0MDYKICNkZWZpbmUJSVdfRkxPT0RfRVZFTlRfVFlQRV9OVU0JCQkJCQkoSVdfRkxPT0RfRVZFTlRfRkxBR19FTkQgLSBJV19GTE9PRF9FVkVOVF9GTEFHX1NUQVJUICsgMSkKLS8vIEZvciBmbG9vZGluZyBhdHRhY2sgLSBlbmQKKy8qIEZvciBmbG9vZGluZyBhdHRhY2sgLSBlbmQgKi8KIAotLy8gRW5kIC0gV0lSRUxFU1MgRVZFTlRTIGRlZmluaXRpb24KKy8qIEVuZCAtIFdJUkVMRVNTIEVWRU5UUyBkZWZpbml0aW9uICovCiAKLS8vIGRlZmluaXRpb24gZm9yIERMUywga2F0aHkKKy8qIGRlZmluaXRpb24gZm9yIERMUywga2F0aHkgKi8KICNkZWZpbmUJTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWSAgIDEKICNkZWZpbmUJTUFYX05VTV9PRl9ETFNfRU5UUlkgICAgICAgIE1BWF9OVU1CRVJfT0ZfRExTX0VOVFJZCiAKLS8vQmxvY2sgQUNLICwgcnQyODYwLCBrYXRoeQorLypCbG9jayBBQ0ssIGthdGh5ICovCiAjZGVmaW5lIE1BWF9UWF9SRU9SREVSQlVGCQk2NAogI2RlZmluZSBNQVhfUlhfUkVPUkRFUkJVRgkJNjQKICNkZWZpbmUgREVGQVVMVF9UWF9USU1FT1VUCQkzMApAQCAtMTM5Miw2NSArMTM0Miw0OCBAQAogI2RlZmluZSBJV19FU1NJRF9NQVhfU0laRSAgIAkJMzIKICNlbmRpZgogCi0jaWZkZWYgTUNBU1RfUkFURV9TUEVDSUZJQwotI2RlZmluZSBNQ0FTVF9ESVNBQkxFCTAKLSNkZWZpbmUgTUNBU1RfQ0NLCQkxCi0jZGVmaW5lIE1DQVNUX09GRE0JCTIKLSNkZWZpbmUgTUNBU1RfSFRNSVgJCTMKLSNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCi0KLSNpZmRlZiBSVDI4NjAKLS8vIEZvciBBc2ljUmFkaW9PZmYvQXNpY1JhZGlvT24vQXNpY0ZvcmNlV2FrZXVwIGZ1bmN0aW9uCi0vLyBUaGlzIGlzIHRvIGluZGljYXRlIGZyb20gd2hlcmUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLgotI2RlZmluZSBET1QxMVBPV0VSU0FWRQkJMAkvLyBUTyBkbyAuMTEgcG93ZXIgc2F2ZSBzbGVlcAotI2RlZmluZSBHVUlSQURJT19PRkYJCTEJLy8gVG8gcGVyZm9ybSBSYWRpbyBPRmYgY29tbWFuZCBmcm9tIEdVSQotI2RlZmluZSBSVE1QX0hBTFQJCQkyCS8vIENhbGxlZCBmcm9tIEhhbHQgaGFuZGxlci4KLSNkZWZpbmUgR1VJX0lETEVfUE9XRVJfU0FWRQkzCS8vIENhbGwgdG8gc2xlZXAgYmVmb3JlIGxpbmsgdXAgd2l0aCBBUAotI2RlZmluZSBGUk9NX1RYCQkJCTQJLy8gRm9yY2Ugd2FrZSB1cCBmcm9tIFR4IHBhY2tldC4KLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotLy8gRm9yIEFzaWNSYWRpb09mZi9Bc2ljUmFkaW9PbiBmdW5jdGlvbgorLyogRm9yIEFzaWNSYWRpb09mZi9Bc2ljUmFkaW9PbiBmdW5jdGlvbiAqLwogI2RlZmluZSBET1QxMVBPV0VSU0FWRQkJMAogI2RlZmluZSBHVUlSQURJT19PRkYJCTEKICNkZWZpbmUgUlRNUF9IQUxUCQkgICAgMgogI2RlZmluZSBHVUlfSURMRV9QT1dFUl9TQVZFCQkzCi0jZW5kaWYKKy8qIC0tICovCiAKLS8vIGRlZmluaXRpb24gZm9yIFdwYVN1cHBvcnQgZmxhZworLyogZGVmaW5pdGlvbiBmb3IgV3BhU3VwcG9ydCBmbGFnICovCiAjZGVmaW5lIFdQQV9TVVBQTElDQU5UX0RJU0FCTEUJCQkJMAogI2RlZmluZSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUJCQkJMQogI2RlZmluZQlXUEFfU1VQUExJQ0FOVF9FTkFCTEVfV0lUSF9XRUJfVUkJMgogCi0vLyBFbmRpYW4gYnl0ZSBzd2FwcGluZyBjb2RlcworLyogRW5kaWFuIGJ5dGUgc3dhcHBpbmcgY29kZXMgKi8KICNkZWZpbmUgU1dBUDE2KHgpIFwKLSAgICAoKFVJTlQxNikoIFwKLSAgICAoKChVSU5UMTYpKHgpICYgKFVJTlQxNikgMHgwMGZmVSkgPDwgOCkgfCBcCi0gICAgKCgoVUlOVDE2KSh4KSAmIChVSU5UMTYpIDB4ZmYwMFUpID4+IDgpICkpCisgICAgKCh1MTYpKCBcCisgICAgKCgodTE2KSh4KSAmICh1MTYpMHgwMGZmVSkgPDwgOCkgfCBcCisgICAgKCgodTE2KSh4KSAmICh1MTYpMHhmZjAwVSkgPj4gOCkgKSkKIAogI2RlZmluZSBTV0FQMzIoeCkgXAotICAgICgoVUlOVDMyKSggXAotICAgICgoKFVJTlQzMikoeCkgJiAoVUlOVDMyKSAweDAwMDAwMGZmVUwpIDw8IDI0KSB8IFwKLSAgICAoKChVSU5UMzIpKHgpICYgKFVJTlQzMikgMHgwMDAwZmYwMFVMKSA8PCAgOCkgfCBcCi0gICAgKCgoVUlOVDMyKSh4KSAmIChVSU5UMzIpIDB4MDBmZjAwMDBVTCkgPj4gIDgpIHwgXAotICAgICgoKFVJTlQzMikoeCkgJiAoVUlOVDMyKSAweGZmMDAwMDAwVUwpID4+IDI0KSApKQorICAgICgodTMyKSggXAorICAgICgoKHUzMikoeCkgJiAodTMyKTB4MDAwMDAwZmZVTCkgPDwgMjQpIHwgXAorICAgICgoKHUzMikoeCkgJiAodTMyKTB4MDAwMGZmMDBVTCkgPDwgIDgpIHwgXAorICAgICgoKHUzMikoeCkgJiAodTMyKTB4MDBmZjAwMDBVTCkgPj4gIDgpIHwgXAorICAgICgoKHUzMikoeCkgJiAodTMyKTB4ZmYwMDAwMDBVTCkgPj4gMjQpICkpCiAKICNkZWZpbmUgU1dBUDY0KHgpIFwKLSAgICAoKFVJTlQ2NCkoIFwKLSAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwMDAwMDAwZmZVTEwpIDw8IDU2KSB8IFwKLSAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwMDAwMGZmMDBVTEwpIDw8IDQwKSB8IFwKLSAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwMDBmZjAwMDBVTEwpIDw8IDI0KSB8IFwKLSAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwZmYwMDAwMDBVTEwpIDw8ICA4KSB8IFwKLSAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMGZmMDAwMDAwMDBVTEwpID4+ICA4KSB8IFwKLSAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDBmZjAwMDAwMDAwMDBVTEwpID4+IDI0KSB8IFwKLSAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwZmYwMDAwMDAwMDAwMDBVTEwpID4+IDQwKSB8IFwKLSAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweGZmMDAwMDAwMDAwMDAwMDBVTEwpID4+IDU2KSApKQorICAgICgodTY0KSggXAorICAgICh1NjQpKCgodTY0KSh4KSAmICh1NjQpMHgwMDAwMDAwMDAwMDAwMGZmVUxMKSA8PCA1NikgfCBcCisgICAgKHU2NCkoKCh1NjQpKHgpICYgKHU2NCkweDAwMDAwMDAwMDAwMGZmMDBVTEwpIDw8IDQwKSB8IFwKKyAgICAodTY0KSgoKHU2NCkoeCkgJiAodTY0KTB4MDAwMDAwMDAwMGZmMDAwMFVMTCkgPDwgMjQpIHwgXAorICAgICh1NjQpKCgodTY0KSh4KSAmICh1NjQpMHgwMDAwMDAwMGZmMDAwMDAwVUxMKSA8PCAgOCkgfCBcCisgICAgKHU2NCkoKCh1NjQpKHgpICYgKHU2NCkweDAwMDAwMGZmMDAwMDAwMDBVTEwpID4+ICA4KSB8IFwKKyAgICAodTY0KSgoKHU2NCkoeCkgJiAodTY0KTB4MDAwMGZmMDAwMDAwMDAwMFVMTCkgPj4gMjQpIHwgXAorICAgICh1NjQpKCgodTY0KSh4KSAmICh1NjQpMHgwMGZmMDAwMDAwMDAwMDAwVUxMKSA+PiA0MCkgfCBcCisgICAgKHU2NCkoKCh1NjQpKHgpICYgKHU2NCkweGZmMDAwMDAwMDAwMDAwMDBVTEwpID4+IDU2KSApKQogCi0jZGVmaW5lIGNwdTJsZTY0KHgpICgoVUlOVDY0KSh4KSkKLSNkZWZpbmUgbGUyY3B1NjQoeCkgKChVSU5UNjQpKHgpKQotI2RlZmluZSBjcHUybGUzMih4KSAoKFVJTlQzMikoeCkpCi0jZGVmaW5lIGxlMmNwdTMyKHgpICgoVUlOVDMyKSh4KSkKLSNkZWZpbmUgY3B1MmxlMTYoeCkgKChVSU5UMTYpKHgpKQotI2RlZmluZSBsZTJjcHUxNih4KSAoKFVJTlQxNikoeCkpCisjZGVmaW5lIGNwdTJsZTY0KHgpICgodTY0KSh4KSkKKyNkZWZpbmUgbGUyY3B1NjQoeCkgKCh1NjQpKHgpKQorI2RlZmluZSBjcHUybGUzMih4KSAoKHUzMikoeCkpCisjZGVmaW5lIGxlMmNwdTMyKHgpICgodTMyKSh4KSkKKyNkZWZpbmUgY3B1MmxlMTYoeCkgKCh1MTYpKHgpKQorI2RlZmluZSBsZTJjcHUxNih4KSAoKHUxNikoeCkpCiAjZGVmaW5lIGNwdTJiZTY0KHgpIFNXQVA2NCgoeCkpCiAjZGVmaW5lIGJlMmNwdTY0KHgpIFNXQVA2NCgoeCkpCiAjZGVmaW5lIGNwdTJiZTMyKHgpIFNXQVAzMigoeCkpCkBAIC0xNDU4LDYgKzEzOTEsMzYgQEAKICNkZWZpbmUgY3B1MmJlMTYoeCkgU1dBUDE2KCh4KSkKICNkZWZpbmUgYmUyY3B1MTYoeCkgU1dBUDE2KCh4KSkKIAotI2VuZGlmICAvLyBfX1JUTVBfREVGX0hfXworI2RlZmluZSBBQlMoX3gsIF95KSAoKF94KSA+IChfeSkpID8gKChfeCkgLShfeSkpIDogKChfeSkgLShfeCkpCiAKKyNkZWZpbmUgQTJEZWMoX1gsIF9wKQkJCQlcCit7CQkJCQkJCQkJXAorCXU4ICpwOwkJCQkJCVwKKwlfWCA9IDA7CQkJCQkJCVwKKwlwID0gX3A7CQkJCQkJCVwKKwl3aGlsZSAoKCgqcCA+PSAnMCcpICYmICgqcCA8PSAnOScpKSkJCVwKKwl7CQkJCQkJCQkJCQkJXAorCQlpZiAoKCpwID49ICcwJykgJiYgKCpwIDw9ICc5JykpCQlcCisJCQlfWCA9IF9YICogMTAgKyAqcCAtIDQ4OwkJCQkJXAorCQlwKys7CQkJCQkJCQkJCVwKKwl9CQkJCQkJCQkJCQkJXAorfQogCisjZGVmaW5lIEEySGV4KF9YLCBfcCkJCQkJXAorZG97CQkJCQkJCQkJXAorCWNoYXIgKl9fcDsJCQkJCQlcCisJKF9YKSA9IDA7CQkJCQkJCVwKKwlfX3AgPSAoY2hhciAqKShfcCk7CQkJCQkJCVwKKwl3aGlsZSAoKCgqX19wID49ICdhJykgJiYgKCpfX3AgPD0gJ2YnKSkgfHwgKCgqX19wID49ICdBJykgJiYgKCpfX3AgPD0gJ0YnKSkgfHwgKCgqX19wID49ICcwJykgJiYgKCpfX3AgPD0gJzknKSkpCQlcCisJewkJCQkJCQkJCQkJCVwKKwkJaWYgKCgqX19wID49ICdhJykgJiYgKCpfX3AgPD0gJ2YnKSkJCQkJXAorCQkJKF9YKSA9IChfWCkgKiAxNiArICpfX3AgLSA4NzsJCQkJCVwKKwkJZWxzZSBpZiAoKCpfX3AgPj0gJ0EnKSAmJiAoKl9fcCA8PSAnRicpKQkJXAorCQkJKF9YKSA9IChfWCkgKiAxNiArICpfX3AgLSA1NTsJCQkJCVwKKwkJZWxzZSBpZiAoKCpfX3AgPj0gJzAnKSAmJiAoKl9fcCA8PSAnOScpKQkJXAorCQkJKF9YKSA9IChfWCkgKiAxNiArICpfX3AgLSA0ODsJCQkJCVwKKwkJX19wKys7CQkJCQkJCQkJCVwKKwl9CQkJCQkJCQkJCQkJXAorfXdoaWxlKDApCisKKyNlbmRpZiAvKiBfX1JUTVBfREVGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2RvdDExLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfZG90MTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjhhYmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2RvdDExLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2lmbmRlZiBfX0RPVDExX0JBU0VfSF9fCisjZGVmaW5lIF9fRE9UMTFfQkFTRV9IX18KKworI2luY2x1ZGUgInJ0bXBfdHlwZS5oIgorCisvKiA0LWJ5dGUgSFRDIGZpZWxkLiAgbWF5YmUgaW5jbHVkZWQgaW4gYW55IGZyYW1lIGV4Y2VwdCBub24tUU9TIGRhdGEgZnJhbWUuICBUaGUgT3JkZXIgYml0IG11c3Qgc2V0IDEuICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2h0X2NvbnRyb2wgeworCXUzMiBNQToxOwkJLyptYW5hZ2VtZW50IGFjdGlvbiBwYXlsb2FkIGV4aXN0IGluIChRb1MgTnVsbCtIVEMpICovCisJdTMyIFRSUToxOwkJLypzb3VuZGluZyByZXF1ZXN0ICovCisJdTMyIE1SUToxOwkJLypNQ1MgZmVlZGJhY2suIFJlcXVlc3QgZm9yIGEgTUNTIGZlZWRiYWNrICovCisJdTMyIE1SU29yQVNJOjM7CS8qIE1SUSBTZXF1ZW5jZSBpZGVudGlmaWVyLiB1bmNoYW5nZWQgZHVyaW5nIGVudGlyZSBwcm9jZWR1cmUuIDB4MDAwLTB4MTEwLiAqLworCXUzMiBNRlM6MzsJCS8qU0VUIHRvIHRoZSByZWNlaXZlZCB2YWx1ZSBvZiBNUlMuIDB4MTExIGZvciB1bnNvbGljaXRlZCBNRkIuICovCisJdTMyIE1GQm9yQVNDOjc7CS8qTGluayBhZGFwdGF0aW9uIGZlZWRiYWNrIGNvbnRhaW5pbmcgcmVjb21tZW5kZWQgTUNTLiAweDdmIGZvciBubyBmZWVkYmFjayBvciBub3QgYXZhaWxhYmxlICovCisJdTMyIENhbFBvczoyOwkvKiBjYWxpYnJhdGlvbiBwb3NpdGlvbiAqLworCXUzMiBDYWxTZXE6MjsJLypjYWxpYnJhdGlvbiBzZXF1ZW5jZSAqLworCXUzMiBGQktSZXE6MjsJLypmZWVkYmFjayByZXF1ZXN0ICovCisJdTMyIENTSVNURUVSSU5HOjI7CS8qQ1NJLyBTVEVFUklORyAqLworCXUzMiBaTEZBbm5vdWNlOjE7CS8qIFpMRiBhbm5vdW5jZW1lbnQgKi8KKwl1MzIgcnN2OjU7CQkvKmNhbGlicmF0aW9uIHNlcXVlbmNlICovCisJdTMyIEFDQ29uc3RyYWludDoxOwkvKmZlZWRiYWNrIHJlcXVlc3QgKi8KKwl1MzIgUkRHOjE7CQkvKlJERyAvIE1vcmUgUFBEVSAqLworfTsKKworLyogMi1ieXRlIFFPUyBDT05UUk9MIGZpZWxkICovCitzdHJ1Y3QgUEFDS0VEIHJ0X3Fvc19jb250cm9sIHsKKwl1MTYgVElEOjQ7CisJdTE2IEVPU1A6MTsKKwl1MTYgQWNrUG9saWN5OjI7CS8qMDogbm9ybWFsIEFDSyAxOk5vIEFDSyAyOnNjaGVkdWxlZCB1bmRlciBNVEJBL1BTTVAgIDM6IEJBICovCisJdTE2IEFNc2R1UHJlc2VudDoxOworCXUxNiBUeG9wX1F1ZXVlU2l6ZTo4OworfTsKKworLyogMi1ieXRlIEZyYW1lIGNvbnRyb2wgZmllbGQgKi8KK3N0cnVjdCBQQUNLRUQgcnRfZnJhbWVfY29udHJvbCB7CisJdTE2IFZlcjoyOwkJLyogUHJvdG9jb2wgdmVyc2lvbiAqLworCXUxNiBUeXBlOjI7CQkvKiBNU0RVIHR5cGUgKi8KKwl1MTYgU3ViVHlwZTo0OwkvKiBNU0RVIHN1YnR5cGUgKi8KKwl1MTYgVG9EczoxOwkJLyogVG8gRFMgaW5kaWNhdGlvbiAqLworCXUxNiBGckRzOjE7CQkvKiBGcm9tIERTIGluZGljYXRpb24gKi8KKwl1MTYgTW9yZUZyYWc6MTsJLyogTW9yZSBmcmFnbWVudCBiaXQgKi8KKwl1MTYgUmV0cnk6MTsJCS8qIFJldHJ5IHN0YXR1cyBiaXQgKi8KKwl1MTYgUHdyTWdtdDoxOwkvKiBQb3dlciBtYW5hZ2VtZW50IGJpdCAqLworCXUxNiBNb3JlRGF0YToxOwkvKiBNb3JlIGRhdGEgYml0ICovCisJdTE2IFdlcDoxOwkJLyogV2VwIGRhdGEgKi8KKwl1MTYgT3JkZXI6MTsJCS8qIFN0cmljdCBvcmRlciBleHBlY3RlZCAqLworfTsKKworc3RydWN0IFBBQ0tFRCBydF9oZWFkZXJfODAyXzExIHsKKwlzdHJ1Y3QgcnRfZnJhbWVfY29udHJvbCBGQzsKKwl1MTYgRHVyYXRpb247CisJdTggQWRkcjFbTUFDX0FERFJfTEVOXTsKKwl1OCBBZGRyMltNQUNfQUREUl9MRU5dOworCXU4IEFkZHIzW01BQ19BRERSX0xFTl07CisJdTE2IEZyYWc6NDsKKwl1MTYgU2VxdWVuY2U6MTI7CisJdTggT2N0ZXRbMF07Cit9OworCitzdHJ1Y3QgUEFDS0VEIHJ0X3BzcG9sbF9mcmFtZSB7CisJc3RydWN0IHJ0X2ZyYW1lX2NvbnRyb2wgRkM7CisJdTE2IEFpZDsKKwl1OCBCc3NpZFtNQUNfQUREUl9MRU5dOworCXU4IFRhW01BQ19BRERSX0xFTl07Cit9OworCitzdHJ1Y3QgUEFDS0VEIHJ0X3J0c19mcmFtZSB7CisJc3RydWN0IHJ0X2ZyYW1lX2NvbnRyb2wgRkM7CisJdTE2IER1cmF0aW9uOworCXU4IEFkZHIxW01BQ19BRERSX0xFTl07CisJdTggQWRkcjJbTUFDX0FERFJfTEVOXTsKK307CisKKyNlbmRpZiAvKiBfX0RPVDExX0JBU0VfSF9fIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfaWZhY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9pZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwOGMwNTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfaWZhY2UuaApAQCAtMCwwICsxLDc1IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorCXJ0X2lmYWNlLmgKKworICAgIEFic3RyYWN0OgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpZm5kZWYgX19SVE1QX0lGQUNFX0hfXworI2RlZmluZSBfX1JUTVBfSUZBQ0VfSF9fCisKKyNpZmRlZiBSVE1QX1BDSV9TVVBQT1JUCisjaW5jbHVkZSAiaWZhY2UvcnRtcF9wY2kuaCIKKyNlbmRpZiAvKiBSVE1QX1BDSV9TVVBQT1JUIC8vICovCisjaWZkZWYgUlRNUF9VU0JfU1VQUE9SVAorI2luY2x1ZGUgImlmYWNlL3J0bXBfdXNiLmgiCisjZW5kaWYgLyogUlRNUF9VU0JfU1VQUE9SVCAvLyAqLworCitzdHJ1Y3QgcnRfaW5mX3BjaV9jb25maWcgeworCXVuc2lnbmVkIGxvbmcgQ1NSQmFzZUFkZHJlc3M7CS8qIFBDSSBNTUlPIEJhc2UgQWRkcmVzcywgYWxsIGFjY2VzcyB3aWxsIHVzZSAqLworCXVuc2lnbmVkIGludCBpcnFfbnVtOworfTsKKworc3RydWN0IHJ0X2luZl91c2JfY29uZmlnIHsKKwl1OCBCdWxrSW5FcEFkZHI7CS8qIGJ1bGstaW4gZW5kcG9pbnQgYWRkcmVzcyAqLworCXU4IEJ1bGtPdXRFcEFkZHJbNl07CS8qIGJ1bGstb3V0IGVuZHBvaW50IGFkZHJlc3MgKi8KK307CisKK3N0cnVjdCBydF9pbmZfcmJ1c19jb25maWcgeworCXVuc2lnbmVkIGxvbmcgY3NyX2FkZHI7CisJdW5zaWduZWQgaW50IGlycTsKK307CisKK3R5cGVkZWYgZW51bSBfUlRNUF9JTkZfVFlQRV8geworCVJUTVBfREVWX0lORl9VTktOT1dOID0gMCwKKwlSVE1QX0RFVl9JTkZfUENJID0gMSwKKwlSVE1QX0RFVl9JTkZfVVNCID0gMiwKKwlSVE1QX0RFVl9JTkZfUkJVUyA9IDQsCit9IFJUTVBfSU5GX1RZUEU7CisKK3R5cGVkZWYgdW5pb24gX1JUTVBfSU5GX0NPTkZJR18geworCXN0cnVjdCBydF9pbmZfcGNpX2NvbmZpZyBwY2lDb25maWc7CisJc3RydWN0IHJ0X2luZl91c2JfY29uZmlnIHVzYkNvbmZpZzsKKwlzdHJ1Y3QgcnRfaW5mX3JidXNfY29uZmlnIHJidXNDb25maWc7Cit9IFJUTVBfSU5GX0NPTkZJRzsKKworI2VuZGlmIC8qIF9fUlRNUF9JRkFDRV9IX18gLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9tY3UuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9tY3UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDk4N2U1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX21jdS5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnRtcF9tY3UuaAorCisJQWJzdHJhY3Q6CisJTWluaXBvcnQgaGVhZGVyIGZpbGUgZm9yIG1jdSByZWxhdGVkIGluZm9ybWF0aW9uCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmbmRlZiBfX1JUTVBfTUNVX0hfXworI2RlZmluZSBfX1JUTVBfTUNVX0hfXworCitpbnQgUnRtcEFzaWNFcmFzZUZpcm13YXJlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CisKK2ludCBSdG1wQXNpY0xvYWRGaXJtd2FyZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOworCitpbnQgUnRtcEFzaWNTZW5kQ29tbWFuZFRvTWN1KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgdTggQ29tbWFuZCwKKwkJCSAgICAgdTggVG9rZW4sIHU4IEFyZzAsIHU4IEFyZzEpOworCisjZW5kaWYgLyogX19SVE1QX01DVV9IX18gLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9vcy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX29zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRjMzBjOGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfb3MuaApAQCAtMCwwICsxLDkwIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorCXJ0bXBfb3MuaAorCisgICAgQWJzdHJhY3Q6CisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmbmRlZiBfX1JUTVBfT1NfSF9fCisjZGVmaW5lIF9fUlRNUF9PU19IX18KKworI2lmZGVmIExJTlVYCisjaW5jbHVkZSAicnRfbGludXguaCIKKyNlbmRpZiAvKiBMSU5VWCAvLyAqLworCisvKgorCVRoaXMgZGF0YSBzdHJ1Y3R1cmUgbWFpbmx5IHN0cmlwIHNvbWUgY2FsbGJhY2sgZnVuY3Rpb24gZGVmaW5lZCBpbgorCSJzdHJ1Y3QgbmV0X2RldmljZSIgaW4ga2VybmVsIHNvdXJjZSAiaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaCIuCisKKwlUaGUgZGVmaW5pdGlvbiBvZiB0aGlzIGRhdGEgc3RydWN0dXJlIG1heSB2YXJpb3VzIGRlcGVuZHMgb24gZGlmZmVyZW50CisJT1MuIFVzZSBpdCBjYXJlZnVsbHkuCisqLworc3RydWN0IHJ0X3J0bXBfb3NfbmV0ZGV2X29wX2hvb2sgeworCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqbmV0ZGV2X29wczsKKwl2b2lkICpwcml2OworCWludCBwcml2X2ZsYWdzOworCXVuc2lnbmVkIGNoYXIgZGV2QWRkcls2XTsKKwl1bnNpZ25lZCBjaGFyIGRldk5hbWVbMTZdOworCXVuc2lnbmVkIGNoYXIgbmVlZFByb3RjdGVkOworfTsKKwordHlwZWRlZiBlbnVtIF9SVE1QX1RBU0tfU1RBVFVTXyB7CisJUlRNUF9UQVNLX1NUQVRfVU5LTk9XTiA9IDAsCisJUlRNUF9UQVNLX1NUQVRfSU5JVEVEID0gMSwKKwlSVE1QX1RBU0tfU1RBVF9SVU5OSU5HID0gMiwKKwlSVE1QX1RBU0tfU1RBVF9TVE9QRUQgPSA0LAorfSBSVE1QX1RBU0tfU1RBVFVTOworI2RlZmluZSBSVE1QX1RBU0tfQ0FOX0RPX0lOU0VSVAkJKFJUTVBfVEFTS19TVEFUX0lOSVRFRCB8UlRNUF9UQVNLX1NUQVRfUlVOTklORykKKworI2RlZmluZSBSVE1QX09TX1RBU0tfTkFNRV9MRU4JMTYKK3N0cnVjdCBydF9ydG1wX29zX3Rhc2sgeworCWNoYXIgdGFza05hbWVbUlRNUF9PU19UQVNLX05BTUVfTEVOXTsKKwl2b2lkICpwcml2OworCS8qdW5zaWduZWQgbG9uZyAgICAgICAgIHRhc2tGbGFnczsgKi8KKwlSVE1QX1RBU0tfU1RBVFVTIHRhc2tTdGF0dXM7CisjaWZuZGVmIEtUSFJFQURfU1VQUE9SVAorCXN0cnVjdCBzZW1hcGhvcmUgdGFza1NlbWE7CisJc3RydWN0IHBpZCAqdGFza1BJRDsKKwlzdHJ1Y3QgY29tcGxldGlvbiB0YXNrQ29tcGxldGU7CisjZW5kaWYKKwl1bnNpZ25lZCBjaGFyIHRhc2tfa2lsbGVkOworI2lmZGVmIEtUSFJFQURfU1VQUE9SVAorCXN0cnVjdCB0YXNrX3N0cnVjdCAqa3RocmVhZF90YXNrOworCXdhaXRfcXVldWVfaGVhZF90IGt0aHJlYWRfcTsKKwlCT09MRUFOIGt0aHJlYWRfcnVubmluZzsKKyNlbmRpZgorfTsKKworaW50IFJ0bXBPU0lSUVJlcXVlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXYpOworaW50IFJ0bXBPU0lSUVJlbGVhc2Uoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXYpOworCisjZW5kaWYgLyogX19STVRQX09TX0hfXyAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX3RpbWVyLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGI4YWM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX3RpbWVyLmgKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisJcnRtcF90aW1lci5oCisKKyAgICBBYnN0cmFjdDoKKwlSYWxpbmsgV2lyZWxlc3MgRHJpdmVyIHRpbWVyIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBkZWxjYXJhdGlvbnMKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisJV2hvICAgICAgICAgICBXaGVuICAgICAgICAgICAgICAgIFdoYXQKKwktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU5hbWUgICAgICAgICAgRGF0ZSAgICAgICAgICAgICAgICAgTW9kaWZpY2F0aW9uIGxvZ3MKKwlTaGlhbmcgVHUgICAgQXVnLTI4LTIwMDgJaW5pdCB2ZXJzaW9uCisKKyovCisKKyNpZm5kZWYgX19SVE1QX1RJTUVSX0hfXworI2RlZmluZSAgX19SVE1QX1RJTUVSX0hfXworCisjaW5jbHVkZSAicnRtcF9vcy5oIgorCisjZGVmaW5lIERFQ0xBUkVfVElNRVJfRlVOQ1RJT04oX2Z1bmMpCQkJXAorCXZvaWQgcnRtcF90aW1lcl8jI19mdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSkKKworI2RlZmluZSBHRVRfVElNRVJfRlVOQ1RJT04oX2Z1bmMpCQkJCVwKKwlydG1wX3RpbWVyXyMjX2Z1bmMKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gVGltZXIgUmVsYXRlZCBNQVJDTyAtLS0tLS0tLS0tLS0tLS0qLworLyogSW4gc29tZSBvcyBvciBjaGlwc2V0LCB3ZSBoYXZlIGEgbG90IG9mIHRpbWVyIGZ1bmN0aW9ucyBhbmQgd2lsbCByZWFkL3dyaXRlIHJlZ2lzdGVyLCAqLworLyogICBpdCdzIG5vdCBhbGxvd2VkIGluIExpbnV4IFVTQiBzdWItc3lzdGVtIHRvIGRvIGl0ICggYmVjYXVzZSBvZiBzbGVlcCBpc3N1ZSB3aGVuICovCisvKiAgc3VibWl0IHRvIGN0cmwgcGlwZSkuIFNvIHdlIG5lZWQgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIHRha2UgY2FyZSBpdC4gKi8KKworI2lmZGVmIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUCit0eXBlZGVmIHZvaWQoKlJUTVBfVElNRVJfVEFTS19IQU5ETEUpICh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCQkJICAgICAgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJCQkgICAgICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLAorCQkJCSAgICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpOworI2VuZGlmIC8qIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUIC8vICovCisKK3N0cnVjdCBydF9yYWxpbmtfdGltZXIgeworCXN0cnVjdCB0aW1lcl9saXN0IFRpbWVyT2JqOwkvKiBOZGlzIFRpbWVyIG9iamVjdCAqLworCUJPT0xFQU4gVmFsaWQ7CQkvKiBTZXQgdG8gVHJ1ZSB3aGVuIGNhbGwgUlRNUEluaXRUaW1lciAqLworCUJPT0xFQU4gU3RhdGU7CQkvKiBUcnVlIGlmIHRpbWVyIGNhbmNlbGxlZCAqLworCUJPT0xFQU4gUGVyaW9kaWNUeXBlOwkvKiBUcnVlIGlmIHRpbWVyIGlzIHBlcmlvZGljIHRpbWVyICovCisJQk9PTEVBTiBSZXBlYXQ7CQkvKiBUcnVlIGlmIHBlcmlvZGljIHRpbWVyICovCisJdW5zaWduZWQgbG9uZyBUaW1lclZhbHVlOwkvKiBUaW1lciB2YWx1ZSBpbiBtaWxsaXNlY29uZHMgKi8KKwl1bnNpZ25lZCBsb25nIGNvb2tpZTsJCS8qIG9zIHNwZWNpZmljIG9iamVjdCAqLworI2lmZGVmIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUCisJUlRNUF9USU1FUl9UQVNLX0hBTkRMRSBoYW5kbGU7CisJdm9pZCAqcEFkOworI2VuZGlmCQkJCS8qIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUIC8vICovCit9OworCisjaWZkZWYgUlRNUF9USU1FUl9UQVNLX1NVUFBPUlQKK3N0cnVjdCBydF9ydG1wX3RpbWVyX3Rhc2tfZW50cnkgeworCXN0cnVjdCBydF9yYWxpbmtfdGltZXIgKnBSYVRpbWVyOworCXN0cnVjdCBydF9ydG1wX3RpbWVyX3Rhc2tfZW50cnkgKnBOZXh0OworfTsKKworI2RlZmluZSBUSU1FUl9RVUVVRV9TSVpFX01BWAkxMjgKK3N0cnVjdCBydF9ydG1wX3RpbWVyX3Rhc2tfcXVldWUgeworCXVuc2lnbmVkIGludCBzdGF0dXM7CisJdW5zaWduZWQgY2hhciAqcFRpbWVyUVBvbGw7CisJc3RydWN0IHJ0X3J0bXBfdGltZXJfdGFza19lbnRyeSAqcFFQb2xsRnJlZUxpc3Q7CisJc3RydWN0IHJ0X3J0bXBfdGltZXJfdGFza19lbnRyeSAqcFFIZWFkOworCXN0cnVjdCBydF9ydG1wX3RpbWVyX3Rhc2tfZW50cnkgKnBRVGFpbDsKK307CisKKyNkZWZpbmUgQlVJTERfVElNRVJfRlVOQ1RJT04oX2Z1bmMpCQkJCQkJCQkJCVwKK3ZvaWQgcnRtcF90aW1lcl8jI19mdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSkJCQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJCQlcCisJc3RydWN0IHJ0X3JhbGlua190aW1lciAqX3BUaW1lciA9IChzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyICopZGF0YTsJCQkJXAorCXN0cnVjdCBydF9ydG1wX3RpbWVyX3Rhc2tfZW50cnkgKl9wUU5vZGU7CQkJCQkJCQkJCVwKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpfcEFkOwkJCQkJCQkJCQkJXAorCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwlfcFRpbWVyLT5oYW5kbGUgPSBfZnVuYzsJCQkJCQkJCQkJCQkJXAorCV9wQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKV9wVGltZXItPnBBZDsJCQkJCQkJCQkJXAorCV9wUU5vZGUgPSBSdG1wVGltZXJRSW5zZXJ0KF9wQWQsIF9wVGltZXIpOwkJCQkJCQkJXAorCWlmICgoX3BRTm9kZSA9PSBOVUxMKSAmJiAoX3BBZC0+VGltZXJRLnN0YXR1cyAmIFJUTVBfVEFTS19DQU5fRE9fSU5TRVJUKSkJXAorCQlSVE1QX09TX0FkZF9UaW1lcigmX3BUaW1lci0+VGltZXJPYmosIE9TX0haKTsJCQkJCQkJXAorfQorI2Vsc2UKKyNkZWZpbmUgQlVJTERfVElNRVJfRlVOQ1RJT04oX2Z1bmMpCQkJCQkJCQkJCVwKK3ZvaWQgcnRtcF90aW1lcl8jI19mdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSkJCQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJCQlcCisJc3RydWN0IHJ0X3JhbGlua190aW1lciAqcFRpbWVyID0gKHN0cnVjdCBydF9yYWxpbmtfdGltZXIgKilkYXRhOwkJCQlcCisJCQkJCQkJCQkJCQkJCQkJCQkJXAorCV9mdW5jKE5VTEwsICh2b2lkICopcFRpbWVyLT5jb29raWUsIE5VTEwsIHBUaW1lcik7CQkJCQkJCVwKKwlpZiAocFRpbWVyLT5SZXBlYXQpCQkJCQkJCQkJCQkJCQlcCisJCVJUTVBfT1NfQWRkX1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBwVGltZXItPlRpbWVyVmFsdWUpOwkJCVwKK30KKyNlbmRpZiAvKiBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVCAvLyAqLworCitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKE1sbWVQZXJpb2RpY0V4ZWMpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihNbG1lUnNzaVJlcG9ydEV4ZWMpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihBc2ljUnhBbnRFdmFsVGltZW91dCk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEFQU0RQZXJpb2RpY0V4ZWMpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihBc2ljUmZUdW5pbmdFeGVjKTsKKyNpZmRlZiBSVE1QX01BQ19VU0IKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQmVhY29uVXBkYXRlRXhlYyk7CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQmVhY29uVGltZW91dCk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFNjYW5UaW1lb3V0KTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQXV0aFRpbWVvdXQpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihBc3NvY1RpbWVvdXQpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihSZWFzc29jVGltZW91dCk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKERpc2Fzc29jVGltZW91dCk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKExpbmtEb3duRXhlYyk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihXcGFEaXNhc3NvY0FwQW5kQmxvY2tBc3NvYyk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFBzUG9sbFdha2VFeGVjKTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oUmFkaW9PbkV4ZWMpOworCisjaWZkZWYgUlRNUF9NQUNfVVNCCitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFJ0bXBVc2JTdGFBc2ljRm9yY2VXYWtldXBUaW1lb3V0KTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKworI2lmIGRlZmluZWQoQVBfTEVEKSB8fCBkZWZpbmVkKFNUQV9MRUQpCitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKExlZEN0cmxNYWluKTsKKyNlbmRpZgorCisjZW5kaWYgLyogX19SVE1QX1RJTUVSX0hfXyAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX3R5cGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF90eXBlLmgKaW5kZXggMWZkN2RmMS4uZDliYjJkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX3R5cGUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfdHlwZS5oCkBAIC0zOCw1NyArMzgsNTIgQEAKICNpZm5kZWYgX19SVE1QX1RZUEVfSF9fCiAjZGVmaW5lIF9fUlRNUF9UWVBFX0hfXwogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwogI2RlZmluZSBQQUNLRUQgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQogCi0vLyBQdXQgcGxhdGZvcm0gZGVwZW5kZW50IGRlY2xhcmF0aW9uIGhlcmUKLS8vIEZvciBleGFtcGxlLCBsaW51eCB0eXBlIGRlZmluaXRpb24KLXR5cGVkZWYgdW5zaWduZWQgY2hhcgkJVUlOVDg7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0CQlVSU5UMTY7Ci10eXBlZGVmIHVuc2lnbmVkIGludAkJVUlOVDMyOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcJVUlOVDY0OwotdHlwZWRlZiBpbnQJCQkJCUlOVDMyOwotdHlwZWRlZiBsb25nIGxvbmcgCQkJSU5UNjQ7Ci0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAqCQkJUFVJTlQ4OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAqCQlQVUlOVDE2OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgKgkJCVBVSU5UMzI7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyAqCVBVSU5UNjQ7Ci10eXBlZGVmIGludAkqCQkJCQlQSU5UMzI7Ci10eXBlZGVmIGxvbmcgbG9uZyAqIAkJCVBJTlQ2NDsKLQotdHlwZWRlZiBzaWduZWQgY2hhcgkJCUNIQVI7Ci10eXBlZGVmIHNpZ25lZCBzaG9ydAkJU0hPUlQ7Ci10eXBlZGVmIHNpZ25lZCBpbnQJCQlJTlQ7Ci10eXBlZGVmIHNpZ25lZCBsb25nCQkJTE9ORzsKLXR5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZwlMT05HTE9ORzsKLQotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIJCVVDSEFSOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJVVNIT1JUOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQJCVVJTlQ7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcJCVVMT05HOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcJVUxPTkdMT05HOwotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIJCUJPT0xFQU47Ci10eXBlZGVmIHZvaWQJCQkJVk9JRDsKLQotdHlwZWRlZiBWT0lEICoJCQkJUFZPSUQ7Ci10eXBlZGVmIENIQVIgKgkJCQlQQ0hBUjsKLXR5cGVkZWYgVUNIQVIgKiAJCQlQVUNIQVI7Ci10eXBlZGVmIFVTSE9SVCAqCQkJUFVTSE9SVDsKLXR5cGVkZWYgTE9ORyAqCQkJCVBMT05HOwotdHlwZWRlZiBVTE9ORyAqCQkJCVBVTE9ORzsKLXR5cGVkZWYgVUlOVCAqCQkJCVBVSU5UOwotCi10eXBlZGVmIHVuc2lnbmVkIGludAlORElTX01FRElBX1NUQVRFOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIEJPT0xFQU47CiAKIHR5cGVkZWYgdW5pb24gX0xBUkdFX0lOVEVHRVIgewotICAgIHN0cnVjdCB7Ci0gICAgICAgIFVJTlQgTG93UGFydDsKLSAgICAgICAgSU5UMzIgSGlnaFBhcnQ7Ci0gICAgfSB1OwotICAgIElOVDY0IFF1YWRQYXJ0OworCXN0cnVjdCB7CisJCXUzMiBMb3dQYXJ0OworCQlpbnQgSGlnaFBhcnQ7CisJfSB1OworCWxvbmcgbG9uZyBRdWFkUGFydDsKIH0gTEFSR0VfSU5URUdFUjsKIAotI2VuZGlmICAvLyBfX1JUTVBfVFlQRV9IX18KKy8qICovCisvKiBSZWdpc3RlciBzZXQgcGFpciBmb3IgaW5pdGlhbHphdGlvbiByZWdpc3RlciBzZXQgZGVmaW5pdGlvbiAqLworLyogKi8KK3N0cnVjdCBydF9ydG1wX3JlZ19wYWlyIHsKKwl1bnNpZ25lZCBsb25nIFJlZ2lzdGVyOworCXVuc2lnbmVkIGxvbmcgVmFsdWU7Cit9OwogCitzdHJ1Y3QgcnRfcmVnX3BhaXIgeworCXU4IFJlZ2lzdGVyOworCXU4IFZhbHVlOworfTsKKworLyogKi8KKy8qIFJlZ2lzdGVyIHNldCBwYWlyIGZvciBpbml0aWFsemF0aW9uIHJlZ2lzdGVyIHNldCBkZWZpbml0aW9uICovCisvKiAqLworc3RydWN0IHJ0X3J0bXBfcmZfcmVncyB7CisJdTggQ2hhbm5lbDsKKwl1bnNpZ25lZCBsb25nIFIxOworCXVuc2lnbmVkIGxvbmcgUjI7CisJdW5zaWduZWQgbG9uZyBSMzsKKwl1bnNpZ25lZCBsb25nIFI0OworfTsKKworc3RydWN0IHJ0X2ZyZXF1ZW5jeV9pdGVtIHsKKwl1OCBDaGFubmVsOworCXU4IE47CisJdTggUjsKKwl1OCBLOworfTsKKworI2RlZmluZSBTVEFUVVNfU1VDQ0VTUwkJCQkweDAwCisjZGVmaW5lIFNUQVRVU19VTlNVQ0NFU1NGVUwJCTB4MDEKKworI2VuZGlmIC8qIF9fUlRNUF9UWVBFX0hfXyAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydHVzYl9pby5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydHVzYl9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YTJmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0dXNiX2lvLmgKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2lmbmRlZiBfX1JUVVNCX0lPX0hfXworI2RlZmluZSBfX1JUVVNCX0lPX0hfXworCisjaW5jbHVkZSAicnRtcF90eXBlLmgiCisKKy8qIE5ldyBmb3IgTWVldGluZ0hvdXNlIEFwaSBzdXBwb3J0ICovCisjZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDEwMQkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9VTlBMVUcgICAgICAgICAgICAgICAgICAgICAweDBENzMwMTAyCS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfVkVORE9SX1NXSVRDSF9GVU5DVElPTiAgICAgICAgICAgIDB4MEQ3MzAxMDMJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9NVUxUSV9XUklURV9NQUMgICAgICAgICAgICAgICAgICAgMHgwRDczMDEwNwkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX01VTFRJX1JFQURfTUFDICAgICAgICAgICAgICAgICAgICAweDBENzMwMTA4CS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfVkVORE9SX0VFUFJPTV9XUklURSAgICAgICAgICAgICAgIDB4MEQ3MzAxMEEJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfRUVQUk9NX1JFQUQgICAgICAgICAgICAgICAgMHgwRDczMDEwQgkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9FTlRFUl9URVNUTU9ERSAgICAgICAgICAgICAweDBENzMwMTBDCS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfVkVORE9SX0VYSVRfVEVTVE1PREUgICAgICAgICAgICAgIDB4MEQ3MzAxMEQJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfV1JJVEVfQkJQICAgICAgICAgICAgICAgICAgMHgwRDczMDExOQkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9SRUFEX0JCUCAgICAgICAgICAgICAgICAgICAweDBENzMwMTE4CS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfVkVORE9SX1dSSVRFX1JGICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAxMUEJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfRkxJUF9JUSAgICAgICAgICAgICAgICAgICAgMHgwRDczMDExRAkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VUICAgICAgICAgICAgICAgICAgICAweDBENzMwMjEwCS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfUkVTRVRfQlVMS19JTiAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMTEJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9TRVRfUFNNX0JJVAkJCQkweDBENzMwMjEyCS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfU0VUX1JBRElPICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMTQJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9VUERBVEVfVFhfUkFURSAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIxNgkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEXzgwMl8xMV9BRERfS0VZX1dFUCAgICAgICAgICAgICAgICAweDBENzMwMjE4CS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfUkVTRVRfRlJPTV9FUlJPUiAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMUEJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9MSU5LX0RPV04gICAgICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIxQgkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX1JFU0VUX0ZST01fTkRJUyAgICAgICAgICAgICAgICAgICAweDBENzMwMjFDCS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfQ0hFQ0tfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMTUJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9GT1JDRV9XQUtFX1VQICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIyMgkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX1NFVF9CVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBENzMwMjI1CS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfU0VUX0FTSUNfV0NJRCAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMjYJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lEX0NJUEhFUiAgICAgICAgICAgICAgMHgwRDczMDIyNwkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX1FLRVJJT0RJQ19FWEVDVVQgICAgICAgICAgICAgICAgICAweDBENzMwMjNECS8qIGNtZCAqLworI2RlZmluZSBSVF9DTURfU0VUX0tFWV9UQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMjgJLyogY21kICovCisjZGVmaW5lIFJUX0NNRF9TRVRfUlhfV0NJRF9UQUJMRSAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIyOQkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX1NFVF9DTElFTlRfTUFDX0VOVFJZICAgICAgICAgICAgICAweDBENzMwMjNFCS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfU0VUX0dST1VQX0tFWQkJCQkJCTB4MEQ3MzAyM0YJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9TRVRfUEFJUldJU0VfS0VZCQkJCQkweDBENzMwMjQwCS8qIGNtZCAqLworCisjZGVmaW5lIENNRFRIUkVBRF84MDJfMTFfUVVFUllfSEFSRFdBUkVfUkVHSVNURVIgICAgMHgwRDcxMDEwNQkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEXzgwMl8xMV9TRVRfUEhZX01PREUgICAgICAgICAgICAgICAweDBENzkwMTBDCS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfODAyXzExX1NFVF9TVEFfQ09ORklHICAgICAgICAgICAgIDB4MEQ3OTAxMTEJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF84MDJfMTFfU0VUX1BSRUFNQkxFICAgICAgICAgICAgICAgMHgwRDc5MDEwMQkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEXzgwMl8xMV9DT1VOVEVSX01FQVNVUkUJCQkweDBENzkwMTAyCS8qIGNtZCAqLworLyogYWRkIGJ5IGpvaG5saSwgZml4ICJpbl9pbnRlcnJ1cHQiIGVycm9yIHdoZW4gY2FsbCAiTWFjVGFibGVEZWxldGVFbnRyeSIgaW4gUnggdGFza2xldCAqLworI2RlZmluZSBDTURUSFJFQURfVVBEQVRFX1BST1RFQ1QJCQkJCTB4MEQ3OTAxMDMJLyogY21kICovCisvKiBlbmQgam9obmxpICovCisKKy8qQ01EVEhSRUFEX01VTFRJX1JFQURfTUFDICovCisvKkNNRFRIUkVBRF9NVUxUSV9XUklURV9NQUMgKi8KKy8qQ01EVEhSRUFEX1ZFTkRPUl9FRVBST01fUkVBRCAqLworLypDTURUSFJFQURfVkVORE9SX0VFUFJPTV9XUklURSAqLworc3RydWN0IHJ0X2NtZGhhbmRsZXJfdGx2IHsKKwl1MTYgT2Zmc2V0OworCXUxNiBMZW5ndGg7CisJdTggRGF0YUZpcnN0OworfTsKKworc3RydWN0IHJ0X2NtZHFlbG10OworCitzdHJ1Y3QgcnRfY21kcWVsbXQgeworCXUzMiBjb21tYW5kOworCXZvaWQgKmJ1ZmZlcjsKKwl1bnNpZ25lZCBsb25nIGJ1ZmZlcmxlbmd0aDsKKwlCT09MRUFOIENtZEZyb21OZGlzOworCUJPT0xFQU4gU2V0T3BlcmF0aW9uOworCXN0cnVjdCBydF9jbWRxZWxtdCAqbmV4dDsKK307CisKK3N0cnVjdCBydF9jbWRxIHsKKwl1MzIgc2l6ZTsKKwlzdHJ1Y3QgcnRfY21kcWVsbXQgKmhlYWQ7CisJc3RydWN0IHJ0X2NtZHFlbG10ICp0YWlsOworCXUzMiBDbWRRU3RhdGU7Cit9OworCisjZGVmaW5lIEVucXVldWVDbWQoY21kcSwgY21kcWVsbXQpCQlcCit7CQkJCQkJCQkJCVwKKwlpZiAoY21kcS0+c2l6ZSA9PSAwKQkJCQlcCisJCWNtZHEtPmhlYWQgPSBjbWRxZWxtdDsJCQlcCisJZWxzZQkJCQkJCQkJXAorCQljbWRxLT50YWlsLT5uZXh0ID0gY21kcWVsbXQ7CVwKKwljbWRxLT50YWlsID0gY21kcWVsbXQ7CQkJCVwKKwljbWRxZWxtdC0+bmV4dCA9IE5VTEw7CQkJCVwKKwljbWRxLT5zaXplKys7CQkJCQkJXAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlVU0IgQ21kIHRvIEFTSUMgUmVsYXRlZCBNQUNSTworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiByZXNldCBNQUMgb2YgYSBzdGF0aW9uIGVudHJ5IHRvIDB4RkZGRkZGRkZGRkZGICovCisjZGVmaW5lIFJUTVBfU1RBX0VOVFJZX01BQ19SRVNFVChwQWQsIFdjaWQpCQkJCQlcCisJewlzdHJ1Y3QgcnRfc2V0X2FzaWNfd2NpZAlTZXRBc2ljV2NpZDsJCQkJCQlcCisJCVNldEFzaWNXY2lkLldDSUQgPSBXY2lkOwkJCQkJCQkJXAorCQlTZXRBc2ljV2NpZC5TZXRUaWQgPSAweGZmZmZmZmZmOwkJCQkJCVwKKwkJU2V0QXNpY1djaWQuRGVsZXRlVGlkID0gMHhmZmZmZmZmZjsJCQkJCQlcCisJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1NFVF9BU0lDX1dDSUQsCVwKKwkJCQkmU2V0QXNpY1djaWQsIHNpemVvZihzdHJ1Y3QgcnRfc2V0X2FzaWNfd2NpZCkpOwl9CisKKy8qIGFkZCB0aGlzIGVudHJ5IGludG8gQVNJQyBSWCBXQ0lEIHNlYXJjaCB0YWJsZSAqLworI2RlZmluZSBSVE1QX1NUQV9FTlRSWV9BREQocEFkLCBwRW50cnkpCQkJCQkJCVwKKwlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9TRVRfQ0xJRU5UX01BQ19FTlRSWSwJXAorCQkJCQkJCXBFbnRyeSwgc2l6ZW9mKHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkpKTsKKworLyogYWRkIGJ5IGpvaG5saSwgZml4ICJpbl9pbnRlcnJ1cHQiIGVycm9yIHdoZW4gY2FsbCAiTWFjVGFibGVEZWxldGVFbnRyeSIgaW4gUnggdGFza2xldCAqLworLyogU2V0IE1BQyByZWdpc3RlciB2YWx1ZSBhY2NvcmRpbmcgb3BlcmF0aW9uIG1vZGUgKi8KKyNkZWZpbmUgUlRNUF9VUERBVEVfUFJPVEVDVChwQWQpCVwKKwlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9VUERBVEVfUFJPVEVDVCwgTlVMTCwgMCk7CisvKiBlbmQgam9obmxpICovCisKKy8qIHJlbW92ZSBQYWlyLXdpc2Uga2V5IG1hdGVyaWFsIGZyb20gQVNJQyAqLworLyogeWV0IGltcGxlbWVudCAqLworI2RlZmluZSBSVE1QX1NUQV9FTlRSWV9LRVlfREVMKHBBZCwgQnNzSWR4LCBXY2lkKQorCisvKiBhZGQgQ2xpZW50IHNlY3VyaXR5IGluZm9ybWF0aW9uIGludG8gQVNJQyBXQ0lEIHRhYmxlIGFuZCBJVkVJViB0YWJsZSAqLworI2RlZmluZSBSVE1QX1NUQV9TRUNVUklUWV9JTkZPX0FERChwQWQsIGFwaWR4LCBLZXlJRCwgcEVudHJ5KQkJCQkJCVwKKwl7CVJUTVBfU1RBX0VOVFJZX01BQ19SRVNFVChwQWQsIHBFbnRyeS0+QWlkKTsJCQkJCQkJCVwKKwkJaWYgKHBFbnRyeS0+QWlkID49IDEpIHsJCQkJCQkJCQkJCQkJCVwKKwkJCXN0cnVjdCBydF9zZXRfYXNpY193Y2lkX2F0dHJpCVNldEFzaWNXY2lkQXR0cmk7CQkJCQkJCQlcCisJCQlTZXRBc2ljV2NpZEF0dHJpLldDSUQgPSBwRW50cnktPkFpZDsJCQkJCQkJCQlcCisJCQlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPD0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkgJiYJCQkJXAorCQkJCShwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSkJCQkJXAorCQkJewkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlTZXRBc2ljV2NpZEF0dHJpLkNpcGhlciA9IHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJRF0uQ2lwaGVyQWxnOwlcCisJCQl9CQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJZWxzZSBpZiAocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQkJCQkJXAorCQkJewkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlTZXRBc2ljV2NpZEF0dHJpLkNpcGhlciA9IHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJRF0uQ2lwaGVyQWxnOwlcCisJCQl9CQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJZWxzZSBTZXRBc2ljV2NpZEF0dHJpLkNpcGhlciA9IDA7CQkJCQkJCQkJCVwKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImFpZCBjaXBoZXIgPSAlbGRcbiIsU2V0QXNpY1djaWRBdHRyaS5DaXBoZXIpKTsgICAgICAgXAorCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfU0VUX0FTSUNfV0NJRF9DSVBIRVIsCQkJXAorCQkJCQkJCSZTZXRBc2ljV2NpZEF0dHJpLCBzaXplb2Yoc3RydWN0IHJ0X3NldF9hc2ljX3djaWRfYXR0cmkpKTsgfSB9CisKKy8qIEluc2VydCB0aGUgQkEgYml0bWFwIHRvIEFTSUMgZm9yIHRoZSBXY2lkIGVudHJ5ICovCisjZGVmaW5lIFJUTVBfQUREX0JBX1NFU1NJT05fVE9fQVNJQyhfcEFkLCBfQWlkLCBfVElEKQkJCQkJXAorCQlkb3sJCQkJCQkJCQkJCQkJCQkJXAorCQkJc3RydWN0IHJ0X3NldF9hc2ljX3djaWQJU2V0QXNpY1djaWQ7CQkJCQkJCVwKKwkJCVNldEFzaWNXY2lkLldDSUQgPSAoX0FpZCk7CQkJCQkJCQkJXAorCQkJU2V0QXNpY1djaWQuU2V0VGlkID0gKDB4MTAwMDA8PChfVElEKSk7CQkJCQkJXAorCQkJU2V0QXNpY1djaWQuRGVsZXRlVGlkID0gMHhmZmZmZmZmZjsJCQkJCQkJXAorCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQoKF9wQWQpLCBDTURUSFJFQURfU0VUX0FTSUNfV0NJRCwgJlNldEFzaWNXY2lkLCBzaXplb2Yoc3RydWN0IHJ0X3NldF9hc2ljX3djaWQpKTsJXAorCQl9d2hpbGUoMCkKKworLyogUmVtb3ZlIHRoZSBCQSBiaXRtYXAgZnJvbSBBU0lDIGZvciB0aGUgV2NpZCBlbnRyeSAqLworI2RlZmluZSBSVE1QX0RFTF9CQV9TRVNTSU9OX0ZST01fQVNJQyhfcEFkLCBfV2NpZCwgX1RJRCkJCQkJXAorCQlkb3sJCQkJCQkJCQkJCQkJCQkJXAorCQkJc3RydWN0IHJ0X3NldF9hc2ljX3djaWQJU2V0QXNpY1djaWQ7CQkJCQkJCVwKKwkJCVNldEFzaWNXY2lkLldDSUQgPSAoX1djaWQpOwkJCQkJCQkJCVwKKwkJCVNldEFzaWNXY2lkLlNldFRpZCA9ICgweGZmZmZmZmZmKTsJCQkJCQkJXAorCQkJU2V0QXNpY1djaWQuRGVsZXRlVGlkID0gKDB4MTAwMDA8PChfVElEKSApOwkJCQkJXAorCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQoKF9wQWQpLCBDTURUSFJFQURfU0VUX0FTSUNfV0NJRCwgJlNldEFzaWNXY2lkLCBzaXplb2Yoc3RydWN0IHJ0X3NldF9hc2ljX3djaWQpKTsJXAorCQl9d2hpbGUoMCkKKworI2VuZGlmIC8qIF9fUlRVU0JfSU9fSF9fIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3NwZWN0cnVtLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3NwZWN0cnVtLmgKaW5kZXggMGE4NzhiYS4uNjQ4ZmQ2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zcGVjdHJ1bS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3BlY3RydW0uaApAQCAtMjMsNyArMjMsNyBAQAogICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KKyAqLwogCiAjaWZuZGVmIF9fU1BFQ1RSVU1fSF9fCiAjZGVmaW5lIF9fU1BFQ1RSVU1fSF9fCkBAIC0zMSwxMTIgKzMxLDcgQEAKICNpbmNsdWRlICJydG1wX3R5cGUuaCIKICNpbmNsdWRlICJzcGVjdHJ1bV9kZWYuaCIKIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9UUENfUkVQT1JUX0lORk8KLXsKLQlVSU5UOCBUeFB3cjsKLQlVSU5UOCBMaW5rTWFyZ2luOwotfSBUUENfUkVQT1JUX0lORk8sICpQVFBDX1JFUE9SVF9JTkZPOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0NIX1NXX0FOTl9JTkZPCi17Ci0JVUlOVDggQ2hTd01vZGU7Ci0JVUlOVDggQ2hhbm5lbDsKLQlVSU5UOCBDaFN3Q250OwotfSBDSF9TV19BTk5fSU5GTywgKlBDSF9TV19BTk5fSU5GTzsKLQotdHlwZWRlZiB1bmlvbiBQQUNLRUQgX01FQVNVUkVfUkVRX01PREUKLXsKLQlzdHJ1Y3QgUEFDS0VECi0JewotCQlVSU5UOCBSZXYwOjE7Ci0JCVVJTlQ4IEVuYWJsZToxOwotCQlVSU5UOCBSZXF1ZXN0OjE7Ci0JCVVJTlQ4IFJlcG9ydDoxOwotCQlVSU5UOCBSZXYxOjQ7Ci0JfSBmaWVsZDsKLQlVSU5UOCB3b3JkOwotfSBNRUFTVVJFX1JFUV9NT0RFLCAqUE1FQVNVUkVfUkVRX01PREU7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9SRVEKLXsKLQlVSU5UOCBDaE51bTsKLQlVSU5UNjQgTWVhc3VyZVN0YXJ0VGltZTsKLQlVSU5UMTYgTWVhc3VyZUR1cmF0aW9uOwotfSBNRUFTVVJFX1JFUSwgKlBNRUFTVVJFX1JFUTsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9NRUFTVVJFX1JFUV9JTkZPCi17Ci0JVUlOVDggVG9rZW47Ci0JTUVBU1VSRV9SRVFfTU9ERSBSZXFNb2RlOwotCVVJTlQ4IFJlcVR5cGU7Ci0JTUVBU1VSRV9SRVEgTWVhc3VyZVJlcTsKLX0gTUVBU1VSRV9SRVFfSU5GTywgKlBNRUFTVVJFX1JFUV9JTkZPOwotCi10eXBlZGVmIHVuaW9uIFBBQ0tFRCBfTUVBU1VSRV9CQVNJQ19SRVBPUlRfTUFQCi17Ci0Jc3RydWN0IFBBQ0tFRAotCXsKLQkJVUlOVDggQlNTOjE7Ci0JCVVJTlQ4IE9mZG1QcmVhbWJsZToxOwotCQlVSU5UOCBVbmlkZW50aWZpZWRTaWduYWw6MTsKLQkJVUlOVDggUmFkYXI6MTsKLQkJVUlOVDggVW5tZWFzdXJlOjE7Ci0JCVVJTlQ4IFJldjozOwotCX0gZmllbGQ7Ci0JVUlOVDggd29yZDsKLX0gTUVBU1VSRV9CQVNJQ19SRVBPUlRfTUFQLCAqUE1FQVNVUkVfQkFTSUNfUkVQT1JUX01BUDsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9NRUFTVVJFX0JBU0lDX1JFUE9SVAotewotCVVJTlQ4IENoTnVtOwotCVVJTlQ2NCBNZWFzdXJlU3RhcnRUaW1lOwotCVVJTlQxNiBNZWFzdXJlRHVyYXRpb247Ci0JTUVBU1VSRV9CQVNJQ19SRVBPUlRfTUFQIE1hcDsKLX0gTUVBU1VSRV9CQVNJQ19SRVBPUlQsICpQTUVBU1VSRV9CQVNJQ19SRVBPUlQ7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9DQ0FfUkVQT1JUCi17Ci0JVUlOVDggQ2hOdW07Ci0JVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7Ci0JVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKLQlVSU5UOCBDQ0FfQnVzeV9GcmFjdGlvbjsKLX0gTUVBU1VSRV9DQ0FfUkVQT1JULCAqUE1FQVNVUkVfQ0NBX1JFUE9SVDsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9NRUFTVVJFX1JQSV9SRVBPUlQKLXsKLQlVSU5UOCBDaE51bTsKLQlVSU5UNjQgTWVhc3VyZVN0YXJ0VGltZTsKLQlVSU5UMTYgTWVhc3VyZUR1cmF0aW9uOwotCVVJTlQ4IFJQSV9EZW5zaXR5WzhdOwotfSBNRUFTVVJFX1JQSV9SRVBPUlQsICpQTUVBU1VSRV9SUElfUkVQT1JUOwotCi10eXBlZGVmIHVuaW9uIFBBQ0tFRCBfTUVBU1VSRV9SRVBPUlRfTU9ERQotewotCXN0cnVjdCBQQUNLRUQKLQl7Ci0JCVVJTlQ4IExhdGU6MTsKLQkJVUlOVDggSW5jYXBhYmxlOjE7Ci0JCVVJTlQ4IFJlZnVzZWQ6MTsKLQkJVUlOVDggUmV2OjU7Ci0JfSBmaWVsZDsKLQlVSU5UOCB3b3JkOwotfSBNRUFTVVJFX1JFUE9SVF9NT0RFLCAqUE1FQVNVUkVfUkVQT1JUX01PREU7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9SRVBPUlRfSU5GTwotewotCVVJTlQ4IFRva2VuOwotCU1FQVNVUkVfUkVQT1JUX01PREUgUmVwb3J0TW9kZTsKLQlVSU5UOCBSZXBvcnRUeXBlOwotCVVJTlQ4IE9jdGVjdFswXTsKLX0gTUVBU1VSRV9SRVBPUlRfSU5GTywgKlBNRUFTVVJFX1JFUE9SVF9JTkZPOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1FVSUVUX0lORk8KLXsKLQlVSU5UOCBRdWlldENudDsKLQlVSU5UOCBRdWlldFBlcmlvZDsKLQlVSU5UOCBRdWlldER1cmF0aW9uOwotCVVJTlQ4IFF1aWV0T2Zmc2V0OwotfSBRVUlFVF9JTkZPLCAqUFFVSUVUX0lORk87CitjaGFyIFJUTVBfR2V0VHhQd3Ioc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBIVFRSQU5TTUlUX1NFVFRJTkcgSFRUeE1vZGUpOwogCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xNTAsMTQgKzQ1LDE2IEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEVucXVldWVNZWFzdXJlbWVudFJlcSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcERBLAotCUlOIFVJTlQ4IE1lYXN1cmVUb2tlbiwKLQlJTiBVSU5UOCBNZWFzdXJlUmVxTW9kZSwKLQlJTiBVSU5UOCBNZWFzdXJlUmVxVHlwZSwKLQlJTiBVSU5UOCBNZWFzdXJlQ2gsCi0JSU4gVUlOVDE2IE1lYXN1cmVEdXJhdGlvbik7Cit2b2lkIE1ha2VNZWFzdXJlbWVudFJlcUZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgdTggKnBPdXRCdWZmZXIsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgKnBGcmFtZUxlbiwKKwkJCSAgICAgdTggVG90YWxMZW4sCisJCQkgICAgIHU4IENhdGVnb3J5LAorCQkJICAgICB1OCBBY3Rpb24sCisJCQkgICAgIHU4IE1lYXN1cmVUb2tlbiwKKwkJCSAgICAgdTggTWVhc3VyZVJlcU1vZGUsCisJCQkgICAgIHU4IE1lYXN1cmVSZXFUeXBlLAorCQkJICAgICB1OCBOdW1PZlJlcGV0aXRpb25zKTsKIAogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTcxLDE1ICs2OCwxMyBAQAogCVJldHVybgk6IE5vbmUuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBFbnF1ZXVlTWVhc3VyZW1lbnRSZXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBVSU5UOCBEaWFsb2dUb2tlbiwKLQlJTiBVSU5UOCBNZWFzdXJlVG9rZW4sCi0JSU4gVUlOVDggTWVhc3VyZVJlcU1vZGUsCi0JSU4gVUlOVDggTWVhc3VyZVJlcVR5cGUsCi0JSU4gVUlOVDggUmVwb3J0SW5mb0xlbiwKLQlJTiBQVUlOVDggcFJlcG9ydEluZm8pOwordm9pZCBFbnF1ZXVlTWVhc3VyZW1lbnRSZXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdTggKnBEQSwKKwkJCSAgIHU4IERpYWxvZ1Rva2VuLAorCQkJICAgdTggTWVhc3VyZVRva2VuLAorCQkJICAgdTggTWVhc3VyZVJlcU1vZGUsCisJCQkgICB1OCBNZWFzdXJlUmVxVHlwZSwKKwkJCSAgIHU4IFJlcG9ydEluZm9MZW4sIHU4ICpwUmVwb3J0SW5mbyk7CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTE5MywxMCArODgsNyBAQAogCVJldHVybgk6IE5vbmUuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBFbnF1ZXVlVFBDUmVxKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwREEsCi0JSU4gVUNIQVIgRGlhbG9nVG9rZW4pOwordm9pZCBFbnF1ZXVlVFBDUmVxKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggKnBEQSwgdTggRGlhbG9nVG9rZW4pOwogCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0yMTAsMTIgKzEwMiw5IEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEVucXVldWVUUENSZXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBVSU5UOCBEaWFsb2dUb2tlbiwKLQlJTiBVSU5UOCBUeFB3ciwKLQlJTiBVSU5UOCBMaW5rTWFyZ2luKTsKK3ZvaWQgRW5xdWV1ZVRQQ1JlcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgIHU4ICpwREEsCisJCSAgIHU4IERpYWxvZ1Rva2VuLCB1OCBUeFB3ciwgdTggTGlua01hcmdpbik7CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTIzMSwxMSArMTIwLDggQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgRW5xdWV1ZUNoU3dBbm4oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBVSU5UOCBDaFN3TW9kZSwKLQlJTiBVSU5UOCBOZXdDaCk7Cit2b2lkIEVucXVldWVDaFN3QW5uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgIHU4ICpwREEsIHU4IENoU3dNb2RlLCB1OCBOZXdDaCk7CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTI0OSw5ICsxMzUsNyBAQAogCVJldHVybgk6IE5vbmUuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBQZWVyU3BlY3RydW1BY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgUGVlclNwZWN0cnVtQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTI2MiwzMSArMTQ2LDQ0IEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1JTlQgU2V0X01lYXN1cmVSZXFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOworaW50IFNldF9NZWFzdXJlUmVxX1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBjaGFyICphcmcpOwogCi1JTlQgU2V0X1RwY1JlcV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7CitpbnQgU2V0X1RwY1JlcV9Qcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgY2hhciAqYXJnKTsKIAotVk9JRCBNZWFzdXJlUmVxVGFiSW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CitpbnQgU2V0X1B3ckNvbnN0cmFpbnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBjaGFyICphcmcpOwogCi1WT0lEIE1lYXN1cmVSZXFUYWJFeGl0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK3ZvaWQgTWVhc3VyZVJlcVRhYkluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBUcGNSZXFUYWJJbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK3ZvaWQgTWVhc3VyZVJlcVRhYkV4aXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBUcGNSZXFUYWJFeGl0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK3N0cnVjdCBydF9tZWFzdXJlX3JlcV9lbnRyeSAqTWVhc3VyZVJlcUxvb2tVcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IERpYWxvZ1Rva2VuKTsKIAotVk9JRCBOb3RpZnlDaFN3QW5uVG9QZWVyQVBzKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwUkEsCi0JSU4gUFVDSEFSIHBUQSwKLQlJTiBVSU5UOCBDaFN3TW9kZSwKLQlJTiBVSU5UOCBDaGFubmVsKTsKLSNlbmRpZiAvLyBfX1NQRUNUUlVNX0hfXyAvLworc3RydWN0IHJ0X21lYXN1cmVfcmVxX2VudHJ5ICpNZWFzdXJlUmVxSW5zZXJ0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggRGlhbG9nVG9rZW4pOwogCit2b2lkIE1lYXN1cmVSZXFEZWxldGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBEaWFsb2dUb2tlbik7CisKK3ZvaWQgSW5zZXJ0Q2hhbm5lbFJlcElFKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCXU4ICpwRnJhbWVCdWYsCisJCQl1bnNpZ25lZCBsb25nICpwRnJhbWVMZW4sCisJCQljaGFyICpwQ291bnRyeSwgdTggUmVndWxhdG9yeUNsYXNzKTsKKwordm9pZCBJbnNlcnRUcGNSZXBvcnRJRShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICB1OCAqcEZyYW1lQnVmLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyAqcEZyYW1lTGVuLAorCQkgICAgICAgdTggVHhQd3IsIHU4IExpbmtNYXJnaW4pOworCit2b2lkIEluc2VydERpYWxvZ1Rva2VuKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIHU4ICpwRnJhbWVCdWYsCisJCSAgICAgICB1bnNpZ25lZCBsb25nICpwRnJhbWVMZW4sIHU4IERpYWxvZ1Rva2VuKTsKKwordm9pZCBUcGNSZXFUYWJJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CisKK3ZvaWQgVHBjUmVxVGFiRXhpdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOworCit2b2lkIE5vdGlmeUNoU3dBbm5Ub1BlZXJBUHMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHU4ICpwUkEsCisJCQkgICAgdTggKnBUQSwgdTggQ2hTd01vZGUsIHU4IENoYW5uZWwpOworCit2b2lkIFJndUNsYXNzX0J1aWxkQmNuQ2hMaXN0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgdTggKnBCdWYsIHVuc2lnbmVkIGxvbmcgKnBCdWZMZW4pOworI2VuZGlmIC8qIF9fU1BFQ1RSVU1fSF9fIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3NwZWN0cnVtX2RlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zcGVjdHJ1bV9kZWYuaAppbmRleCA0Y2E0ODE3Li44ZmZjZmIwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zcGVjdHJ1bV9kZWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3NwZWN0cnVtX2RlZi5oCkBAIC0zOSwxMyArMzksNjIgQEAKICNpZm5kZWYgX19TUEVDVFJVTV9ERUZfSF9fCiAjZGVmaW5lIF9fU1BFQ1RSVU1fREVGX0hfXwogCi0jZGVmaW5lIE1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRQkJMworI2RlZmluZSBNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkUJCTMyCiAjZGVmaW5lIE1BWF9IQVNIX01FQVNVUkVfUkVRX1RBQl9TSVpFCU1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRQogCi0jZGVmaW5lIE1BWF9UUENfUkVRX1RBQl9TSVpFCQkJMworI2RlZmluZSBNQVhfVFBDX1JFUV9UQUJfU0laRQkJCTMyCiAjZGVmaW5lIE1BWF9IQVNIX1RQQ19SRVFfVEFCX1NJWkUJCU1BWF9UUENfUkVRX1RBQl9TSVpFCiAKLSNkZWZpbmUgTUlOX1JDVl9QV1IJCQkJMTAwCQkvKiBOZWdhdGl2ZSB2YWx1ZSAoKGRCbSkgKi8KKyNkZWZpbmUgTUlOX1JDVl9QV1IJCQkJMTAwCS8qIE5lZ2F0aXZlIHZhbHVlICgoZEJtKSAqLworCisjZGVmaW5lIFRQQ19SRVFfQUdFX09VVAkJCTUwMAkvKiBtcyAqLworI2RlZmluZSBNUV9SRVFfQUdFX09VVAkJCTUwMAkvKiBtcyAqLworCisjZGVmaW5lIFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKF9EaWFsb2dUb2tlbikJKChfRGlhbG9nVG9rZW4pICUgTUFYX0hBU0hfVFBDX1JFUV9UQUJfU0laRSkKKyNkZWZpbmUgTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChfRGlhbG9nVG9rZW4pCQkoKF9EaWFsb2dUb2tlbikgJSBNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkUpCisKK3N0cnVjdCBydF9tZWFzdXJlX3JlcV9lbnRyeTsKKworc3RydWN0IHJ0X21lYXN1cmVfcmVxX2VudHJ5IHsKKwlzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfZW50cnkgKnBOZXh0OworCXVuc2lnbmVkIGxvbmcgbGFzdFRpbWU7CisJQk9PTEVBTiBWYWxpZDsKKwl1OCBEaWFsb2dUb2tlbjsKKwl1OCBNZWFzdXJlRGlhbG9nVG9rZW5bM107CS8qIDA6YmFzaWMgbWVhc3VyZSwgMTogQ0NBIG1lYXN1cmUsIDI6IFJQSV9IaXN0b2dyYW0gbWVhc3VyZS4gKi8KK307CisKK3N0cnVjdCBydF9tZWFzdXJlX3JlcV90YWIgeworCXU4IFNpemU7CisJc3RydWN0IHJ0X21lYXN1cmVfcmVxX2VudHJ5ICpIYXNoW01BWF9IQVNIX01FQVNVUkVfUkVRX1RBQl9TSVpFXTsKKwlzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfZW50cnkgQ29udGVudFtNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkVdOworfTsKKworc3RydWN0IHJ0X3RwY19yZXFfZW50cnk7CisKK3N0cnVjdCBydF90cGNfcmVxX2VudHJ5IHsKKwlzdHJ1Y3QgcnRfdHBjX3JlcV9lbnRyeSAqcE5leHQ7CisJdW5zaWduZWQgbG9uZyBsYXN0VGltZTsKKwlCT09MRUFOIFZhbGlkOworCXU4IERpYWxvZ1Rva2VuOworfTsKKworc3RydWN0IHJ0X3RwY19yZXFfdGFiIHsKKwl1OCBTaXplOworCXN0cnVjdCBydF90cGNfcmVxX2VudHJ5ICpIYXNoW01BWF9IQVNIX1RQQ19SRVFfVEFCX1NJWkVdOworCXN0cnVjdCBydF90cGNfcmVxX2VudHJ5IENvbnRlbnRbTUFYX1RQQ19SRVFfVEFCX1NJWkVdOworfTsKKworLyogVGhlIHJlZ3VsYXRvcnkgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCBydF9kb3QxMV9jaGFubmVsX3NldCB7CisJdTggTnVtYmVyT2ZDaGFubmVsczsKKwl1OCBNYXhUeFB3cjsKKwl1OCBDaGFubmVsTGlzdFsxNl07Cit9OworCitzdHJ1Y3QgcnRfZG90MTFfcmVndWxhdG9yeV9pbmZvcm1hdGlvbiB7CisJdTggUmVndWxhdG9yeUNsYXNzOworCXN0cnVjdCBydF9kb3QxMV9jaGFubmVsX3NldCBDaGFubmVsU2V0OworfTsKIAogI2RlZmluZSBSTV9UUENfUkVRCQkJCTAKICNkZWZpbmUgUk1fTUVBU1VSRV9SRVEJCQkxCkBAIC01Myw0MyArMTAyLDEwMSBAQAogI2RlZmluZSBSTV9CQVNJQwkJCQkwCiAjZGVmaW5lIFJNX0NDQQkJCQkJMQogI2RlZmluZSBSTV9SUElfSElTVE9HUkFNCQkyCisjZGVmaW5lIFJNX0NIX0xPQUQJCQkJMworI2RlZmluZSBSTV9OT0lTRV9ISVNUT0dSQU0JCTQKIAotI2RlZmluZSBUUENfUkVRX0FHRV9PVVQJCQk1MDAJCS8qIG1zICovCi0jZGVmaW5lIE1RX1JFUV9BR0VfT1VUCQkJNTAwCQkvKiBtcyAqLworc3RydWN0IFBBQ0tFRCBydF90cGNfcmVwb3J0X2luZm8geworCXU4IFR4UHdyOworCXU4IExpbmtNYXJnaW47Cit9OwogCi0jZGVmaW5lIFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKF9EaWFsb2dUb2tlbikJKChfRGlhbG9nVG9rZW4pICUgTUFYX0hBU0hfVFBDX1JFUV9UQUJfU0laRSkKLSNkZWZpbmUgTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChfRGlhbG9nVG9rZW4pCQkoKF9EaWFsb2dUb2tlbikgJSBNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkUpCitzdHJ1Y3QgUEFDS0VEIHJ0X2NoX3N3X2Fubl9pbmZvIHsKKwl1OCBDaFN3TW9kZTsKKwl1OCBDaGFubmVsOworCXU4IENoU3dDbnQ7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfTUVBU1VSRV9SRVFfRU5UUlkKLXsKLQlzdHJ1Y3QgX01FQVNVUkVfUkVRX0VOVFJZICpwTmV4dDsKLQlVTE9ORyBsYXN0VGltZTsKLQlCT09MRUFOCVZhbGlkOwotCVVJTlQ4IERpYWxvZ1Rva2VuOwotCVVJTlQ4IE1lYXN1cmVEaWFsb2dUb2tlblszXTsJLy8gMDpiYXNpYyBtZWFzdXJlLCAxOiBDQ0EgbWVhc3VyZSwgMjogUlBJX0hpc3RvZ3JhbSBtZWFzdXJlLgotfSBNRUFTVVJFX1JFUV9FTlRSWSwgKlBNRUFTVVJFX1JFUV9FTlRSWTsKK3R5cGVkZWYgdW5pb24gUEFDS0VEIF9NRUFTVVJFX1JFUV9NT0RFIHsKKwlzdHJ1Y3QgUEFDS0VEIHsKKwkJdTggUGFyYWxsZWw6MTsKKwkJdTggRW5hYmxlOjE7CisJCXU4IFJlcXVlc3Q6MTsKKwkJdTggUmVwb3J0OjE7CisJCXU4IER1cmF0aW9uTWFuZGF0b3J5OjE7CisJCSB1ODozOworCX0gZmllbGQ7CisJdTggd29yZDsKK30gTUVBU1VSRV9SRVFfTU9ERSwgKlBNRUFTVVJFX1JFUV9NT0RFOwogCi10eXBlZGVmIHN0cnVjdCBfTUVBU1VSRV9SRVFfVEFCCi17Ci0JVUNIQVIgU2l6ZTsKLQlQTUVBU1VSRV9SRVFfRU5UUlkgSGFzaFtNQVhfSEFTSF9NRUFTVVJFX1JFUV9UQUJfU0laRV07Ci0JTUVBU1VSRV9SRVFfRU5UUlkgQ29udGVudFtNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkVdOwotfSBNRUFTVVJFX1JFUV9UQUIsICpQTUVBU1VSRV9SRVFfVEFCOworc3RydWN0IFBBQ0tFRCBydF9tZWFzdXJlX3JlcSB7CisJdTggQ2hOdW07CisJdTY0IE1lYXN1cmVTdGFydFRpbWU7CisJdTE2IE1lYXN1cmVEdXJhdGlvbjsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9UUENfUkVRX0VOVFJZCi17Ci0Jc3RydWN0IF9UUENfUkVRX0VOVFJZICpwTmV4dDsKLQlVTE9ORyBsYXN0VGltZTsKLQlCT09MRUFOIFZhbGlkOwotCVVJTlQ4IERpYWxvZ1Rva2VuOwotfSBUUENfUkVRX0VOVFJZLCAqUFRQQ19SRVFfRU5UUlk7CitzdHJ1Y3QgUEFDS0VEIHJ0X21lYXN1cmVfcmVxX2luZm8geworCXU4IFRva2VuOworCU1FQVNVUkVfUkVRX01PREUgUmVxTW9kZTsKKwl1OCBSZXFUeXBlOworCXU4IE9jdFswXTsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9UUENfUkVRX1RBQgotewotCVVDSEFSIFNpemU7Ci0JUFRQQ19SRVFfRU5UUlkgSGFzaFtNQVhfSEFTSF9UUENfUkVRX1RBQl9TSVpFXTsKLQlUUENfUkVRX0VOVFJZIENvbnRlbnRbTUFYX1RQQ19SRVFfVEFCX1NJWkVdOwotfSBUUENfUkVRX1RBQiwgKlBUUENfUkVRX1RBQjsKK3R5cGVkZWYgdW5pb24gUEFDS0VEIF9NRUFTVVJFX0JBU0lDX1JFUE9SVF9NQVAgeworCXN0cnVjdCBQQUNLRUQgeworCQl1OCBCU1M6MTsKIAotI2VuZGlmIC8vIF9fU1BFQ1RSVU1fREVGX0hfXyAvLworCQl1OCBPZmRtUHJlYW1ibGU6MTsKKwkJdTggVW5pZGVudGlmaWVkU2lnbmFsOjE7CisJCXU4IFJhZGFyOjE7CisJCXU4IFVubWVhc3VyZToxOworCQl1OCBSZXY6MzsKKwl9IGZpZWxkOworCXU4IHdvcmQ7Cit9IE1FQVNVUkVfQkFTSUNfUkVQT1JUX01BUCwgKlBNRUFTVVJFX0JBU0lDX1JFUE9SVF9NQVA7CiAKK3N0cnVjdCBQQUNLRUQgcnRfbWVhc3VyZV9iYXNpY19yZXBvcnQgeworCXU4IENoTnVtOworCXU2NCBNZWFzdXJlU3RhcnRUaW1lOworCXUxNiBNZWFzdXJlRHVyYXRpb247CisJTUVBU1VSRV9CQVNJQ19SRVBPUlRfTUFQIE1hcDsKK307CisKK3N0cnVjdCBQQUNLRUQgcnRfbWVhc3VyZV9jY2FfcmVwb3J0IHsKKwl1OCBDaE51bTsKKwl1NjQgTWVhc3VyZVN0YXJ0VGltZTsKKwl1MTYgTWVhc3VyZUR1cmF0aW9uOworCXU4IENDQV9CdXN5X0ZyYWN0aW9uOworfTsKKworc3RydWN0IFBBQ0tFRCBydF9tZWFzdXJlX3JwaV9yZXBvcnQgeworCXU4IENoTnVtOworCXU2NCBNZWFzdXJlU3RhcnRUaW1lOworCXUxNiBNZWFzdXJlRHVyYXRpb247CisJdTggUlBJX0RlbnNpdHlbOF07Cit9OworCit0eXBlZGVmIHVuaW9uIFBBQ0tFRCBfTUVBU1VSRV9SRVBPUlRfTU9ERSB7CisJc3RydWN0IFBBQ0tFRCB7CisJCXU4IExhdGU6MTsKKwkJdTggSW5jYXBhYmxlOjE7CisJCXU4IFJlZnVzZWQ6MTsKKwkJdTggUmV2OjU7CisJfSBmaWVsZDsKKwl1OCB3b3JkOworfSBNRUFTVVJFX1JFUE9SVF9NT0RFLCAqUE1FQVNVUkVfUkVQT1JUX01PREU7CisKK3N0cnVjdCBQQUNLRUQgcnRfbWVhc3VyZV9yZXBvcnRfaW5mbyB7CisJdTggVG9rZW47CisJdTggUmVwb3J0TW9kZTsKKwl1OCBSZXBvcnRUeXBlOworCXU4IE9jdGVjdFswXTsKK307CisKK3N0cnVjdCBQQUNLRUQgcnRfcXVpZXRfaW5mbyB7CisJdTggUXVpZXRDbnQ7CisJdTggUXVpZXRQZXJpb2Q7CisJdTE2IFF1aWV0RHVyYXRpb247CisJdTE2IFF1aWV0T2Zmc2V0OworfTsKKworI2VuZGlmIC8qIF9fU1BFQ1RSVU1fREVGX0hfXyAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYWlyb25ldC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYWlyb25ldC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWY0YTE5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Fpcm9uZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMTIgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQlhaXJvbmV0LmMKLQotCUFic3RyYWN0OgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCQlXaGVuCQkJV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlQYXVsIExpbgkwNC0wNi0xNQkJSW5pdGlhbAotKi8KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlhc3NvY2lhdGlvbglzdGF0ZSBtYWNoaW5lIGluaXQsCWluY2x1ZGluZyBzdGF0ZQl0cmFuc2l0aW9uIGFuZCB0aW1lciBpbml0Ci0JUGFyYW1ldGVyczoKLQkJUyAtCXBvaW50ZXIJdG8gdGhlIGFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lECUFpcm9uZXRTdGF0ZU1hY2hpbmVJbml0KAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglTVEFURV9NQUNISU5FCQkqUywKLQlPVVQJU1RBVEVfTUFDSElORV9GVU5DCVRyYW5zW10pCi17Ci0JU3RhdGVNYWNoaW5lSW5pdChTLAlUcmFucywgTUFYX0FJUk9ORVRfU1RBVEUsIE1BWF9BSVJPTkVUX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylEcm9wLCBBSVJPTkVUX0lETEUsIEFJUk9ORVRfTUFDSElORV9CQVNFKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUlST05FVF9JRExFLCBNVDJfQUlST05FVF9NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpQWlyb25ldE1zZ0FjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFJUk9ORVRfSURMRSwgTVQyX0FJUk9ORVRfU0NBTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpQWlyb25ldFJlcXVlc3RBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBSVJPTkVUX1NDQU5OSU5HLCBNVDJfQUlST05FVF9TQ0FOX0RPTkUsIChTVEFURV9NQUNISU5FX0ZVTkMpQWlyb25ldFJlcG9ydEFjdGlvbik7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyBpcwlzdGF0ZSBtYWNoaW5lIGZ1bmN0aW9uLgotCQlXaGVuIHJlY2VpdmluZyBFQVBPTCBwYWNrZXRzIHdoaWNoIGlzICBmb3IgODAyLjF4IGtleSBtYW5hZ2VtZW50LgotCQlVc2UJYm90aCBpbglXUEEsIGFuZCBXUEFQU0sJY2FzZS4KLQkJSW4gdGhpcwlmdW5jdGlvbiwgZnVydGhlciBkaXNwYXRjaCB0byBkaWZmZXJlbnQJZnVuY3Rpb25zIGFjY29yZGluZwl0byB0aGUgcmVjZWl2ZWQJcGFja2V0LgkgMyBjYXRlZ29yaWVzIGFyZSA6Ci0JCSAgMS4gIG5vcm1hbCA0LXdheSBwYWlyd2lzZWtleSBhbmQgMi13YXkgZ3JvdXBrZXkgaGFuZHNoYWtlCi0JCSAgMi4gIE1JQyBlcnJvcgkoQ291bnRlcm1lYXN1cmVzIGF0dGFjaykgIHJlcG9ydCBwYWNrZXQJZnJvbSBTVEEuCi0JCSAgMy4gIFJlcXVlc3QgZm9yIHBhaXJ3aXNlL2dyb3VwIGtleSB1cGRhdGUJZnJvbSBTVEEKLQlSZXR1cm46Ci0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECUFpcm9uZXRNc2dBY3Rpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JTUxNRV9RVUVVRV9FTEVNCSpFbGVtKQotewotCVVTSE9SVAkJCQkJCQlMZW5ndGg7Ci0JVUNIQVIJCQkJCQkJSW5kZXgsIGk7Ci0JUFVDSEFSCQkJCQkJCXBEYXRhOwotCVBBSVJPTkVUX1JNX1JFUVVFU1RfRlJBTUUJCXBSTVJlcTsKLQlQUk1fUkVRVUVTVF9BQ1RJT04JCQkJcFJlcUVsZW07Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0tLT4gQWlyb25ldE1zZ0FjdGlvblxuIikpOwotCi0JLy8gMC4gR2V0IEFpcm9uZXQgSUFQUCBoZWFkZXIgZmlyc3QKLQlwUk1SZXEgPSAoUEFJUk9ORVRfUk1fUkVRVUVTVF9GUkFNRSkgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExXTsKLQlwRGF0YSAgPSAoUFVDSEFSKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTFdOwotCi0JLy8gMS4gQ2hhbmdlIGVuZGlhbiBmb3JtYXQgZm9ybSBuZXR3b3JrIHRvIGxpdHRsZSBlbmRpYW4KLQlMZW5ndGggPSBiZTJjcHUxNihwUk1SZXEtPklBUFAuTGVuZ3RoKTsKLQotCS8vIDIuMCBTYW5pdHkgY2hlY2ssIHRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIHdoZW4gQ0NYIDIuMCBzdXBwb3J0IGlzIGVuYWJsZWQKLQlpZiAocEFkLT5TdGFDZmcuQ0NYRW5hYmxlICE9IFRSVUUpCi0JCXJldHVybjsKLQotCS8vIDIuMSBSYWRpbyBtZWFzdXJlbWVudCBtdXN0IGJlIG9uCi0JaWYgKHBBZC0+U3RhQ2ZnLkNDWENvbnRyb2wuZmllbGQuUk1FbmFibGUgIT0gMSkKLQkJcmV0dXJuOwotCi0JLy8gMi4yLiBEZWJ1ZyBwcmludCBhbGwgYml0IGluZm9ybWF0aW9uCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUFQUCBJRCAmIExlbmd0aCAlZFxuIiwgTGVuZ3RoKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUFQUCBUeXBlICV4XG4iLCBwUk1SZXEtPklBUFAuVHlwZSkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklBUFAgU3ViVHlwZSAleFxuIiwgcFJNUmVxLT5JQVBQLlN1YlR5cGUpKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIERpYWxvZyBUb2tlbiAleFxuIiwgcFJNUmVxLT5JQVBQLlRva2VuKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUFQUCBBY3RpdmF0aW9uIERlbGF5ICV4XG4iLCBwUk1SZXEtPkRlbGF5KSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUFQUCBNZWFzdXJlbWVudCBPZmZzZXQgJXhcbiIsIHBSTVJlcS0+T2Zmc2V0KSk7Ci0KLQkvLyAzLiBDaGVjayBJQVBQIGZyYW1lIHR5cGUsIGl0IG11c3QgYmUgMHgzMiBmb3IgQ2lzY28gQWlyb25ldCBleHRlbnNpb24KLQlpZiAocFJNUmVxLT5JQVBQLlR5cGUgIT0gQUlST05FVF9JQVBQX1RZUEUpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJXcm9uZyBJQVBQIHR5cGUgZm9yIENpc2NvIEFpcm9uZXQgZXh0ZW5zaW9uXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyA0LiBDaGVjayBJQVBQIGZyYW1lIHN1YnR5cGUsIGl0IG11c3QgYmUgMHgwMSBmb3IgQ2lzY28gQWlyb25ldCBleHRlbnNpb24gcmVxdWVzdC4KLQkvLyAgICBTaW5jZSB3ZSBhcmUgYWN0aW5nIGFzIGNsaWVudCBvbmx5LCB3ZSB3aWxsIGRpc3JlZ2FyZHMgcmVwbHkgc3VidHlwZS4KLQlpZiAocFJNUmVxLT5JQVBQLlN1YlR5cGUgIT0gQUlST05FVF9JQVBQX1NVQlRZUEVfUkVRVUVTVCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIldyb25nIElBUFAgc3VidHlwZSBmb3IgQ2lzY28gQWlyb25ldCBleHRlbnNpb25cbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCS8vIDUuIFZlcmlmeSBEZXN0aW5hdGlvbiBNQUMgYW5kIFNvdXJjZSBNQUMsIGJvdGggc2hvdWxkIGJlIGFsbCB6ZXJvcy4KLQlpZiAoISBNQUNfQUREUl9FUVVBTChwUk1SZXEtPklBUFAuREEsIFpFUk9fTUFDX0FERFIpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiV3JvbmcgSUFQUCBEQSBmb3IgQ2lzY28gQWlyb25ldCBleHRlbnNpb24sIGl0J3Mgbm90IFplcm9cbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghIE1BQ19BRERSX0VRVUFMKHBSTVJlcS0+SUFQUC5TQSwgWkVST19NQUNfQUREUikpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJXcm9uZyBJQVBQIFNBIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvbiwgaXQncyBub3QgWmVyb1xuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gNi4gUmVpbml0IGFsbCByZXBvcnQgcmVsYXRlZCBmaWVsZHMKLQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydEJ1ZiwgMjA0OCk7Ci0JTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuQnNzUmVwb3J0T2Zmc2V0LCBzaXplb2YoVVNIT1JUKSAqIE1BWF9MRU5fT0ZfQlNTX1RBQkxFKTsKLQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3QsIHNpemVvZihSTV9SRVFVRVNUX0FDVElPTikgKiA0KTsKLQotCS8vIDcuIFBvaW50IHRvIHRoZSBzdGFydCBvZiBmaXJzdCBlbGVtZW50IHJlcG9ydCBlbGVtZW50Ci0JcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4gICA9IExFTkdUSF84MDJfMTEgKyBzaXplb2YoQUlST05FVF9JQVBQX0hFQURFUik7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRlIgbGVuID0gJWRcbiIsIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuKSk7Ci0JcEFkLT5TdGFDZmcuTGFzdEJzc0luZGV4ICAgICA9IDB4ZmY7Ci0JcEFkLT5TdGFDZmcuUk1SZXFDbnQgICAgICAgICA9IDA7Ci0JcEFkLT5TdGFDZmcuUGFyYWxsZWxSZXEgICAgICA9IEZBTFNFOwotCXBBZC0+U3RhQ2ZnLlBhcmFsbGVsRHVyYXRpb24gPSAwOwotCXBBZC0+U3RhQ2ZnLlBhcmFsbGVsQ2hhbm5lbCAgPSAwOwotCXBBZC0+U3RhQ2ZnLklBUFBUb2tlbiAgICAgICAgPSBwUk1SZXEtPklBUFAuVG9rZW47Ci0JcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4ICA9IDA7Ci0JcEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgICAgICA9IDA7Ci0JLy8gUmVzZXQgdGhlIHN0YXRpc3RpY3MKLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5W2ldID0gMDsKLQotCUluZGV4ID0gMDsKLQotCS8vIDguIFNhdmUgZGlhbG9nIHRva2VuIGZvciByZXBvcnQKLQlwQWQtPlN0YUNmZy5JQVBQVG9rZW4gPSBwUk1SZXEtPklBUFAuVG9rZW47Ci0KLQkvLyBTYXZlIEFjdGl2YXRpb24gZGVsYXkgJiBtZWFzdXJlbWVudCBvZmZzZXQsIE5vdCByZWFsbHkgbmVlZGVkCi0KLQkvLyA5LiBQb2ludCB0byB0aGUgZmlyc3QgcmVxdWVzdCBlbGVtZW50Ci0JcERhdGEgKz0gc2l6ZW9mKEFJUk9ORVRfUk1fUkVRVUVTVF9GUkFNRSk7Ci0JLy8gICAgTGVuZ3RoIHNob3VsZCBleGNsdWRlIHRoZSBDSVNDTyBBaXJvbmV0IFNOQVAgaGVhZGVyCi0JTGVuZ3RoIC09IChzaXplb2YoQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FKSAtIExFTkdUSF84MDJfMV9IKTsKLQotCS8vIDEwLiBTdGFydCBQYXJzaW5nIHRoZSBNZWFzdXJlbWVudCBlbGVtZW50cy4KLQkvLyAgICBCZSBjYXJlZnVsIGFib3V0IG11bHRpcGxlIE1SIGVsZW1lbnRzIHdpdGhpbiBvbmUgZnJhbWVzLgotCXdoaWxlIChMZW5ndGggPiAwKQotCXsKLQkJcFJlcUVsZW0gPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSBwRGF0YTsKLQkJc3dpdGNoIChwUmVxRWxlbS0+UmVxRWxlbS5FaWQpCi0JCXsKLQkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfUkVRVUVTVDoKLQkJCQkvLyBGcm9tIHRoZSBleGFtcGxlLCBpdCBzZWVtcyB3ZSBvbmx5IG5lZWQgdG8gc3VwcG9ydCBvbmUgcmVxdWVzdCBpbiBvbmUgZnJhbWUKLQkJCQkvLyBUaGVyZSBpcyBubyBtdWx0aXBsZSByZXF1ZXN0IGluIG9uZSBmcmFtZS4KLQkJCQkvLyBCZXNpZGVzLCBsb29rcyBsaWtlIHdlIG5lZWQgdG8gdGFrZSBjYXJlIHRoZSBtZWFzdXJlbWVudCByZXF1ZXN0IG9ubHkuCi0JCQkJLy8gVGhlIG1lYXN1cmVtZW50IHJlcXVlc3QgaXMgYWx3YXlzIDQgYnl0ZXMuCi0KLQkJCQkvLyBTdGFydCBwYXJzaW5nIHRoaXMgdHlwZSBvZiByZXF1ZXN0LgotCQkJCS8vIDAuIEVpZCBpcyBJRV9NRUFTVVJFTUVOVF9SRVFVRVNUCi0JCQkJLy8gMS4gTGVuZ3RoIGRpZG4ndCBpbmNsdWRlIEVpZCBhbmQgTGVuZ3RoIGZpZWxkLCBpdCBhbHdheXMgYmUgOC4KLQkJCQkvLyAyLiBNZWFzdXJlbWVudCBUb2tlbiwgd2Ugbm5lZCB0byBzYXZlIGl0IGZvciB0aGUgY29ycmVzcG9uZGluZyByZXBvcnQuCi0JCQkJLy8gMy4gTWVhc3VyZW1lbnQgTW9kZSwgQWx0aG91Z2ggdGhlcmUgYXJlIGRlZmluaXRpb25zLCBidXQgd2UgZGluJ3Qgc2VlIHZhbHVlIG90aGVyIHRoYW4KLQkJCQkvLyAgICAwIGZyb20gdGVzdCBzcGVjcyBleGFtcGxlcy4KLQkJCQkvLyA0LiBNZWFzdXJlbWVudCBUeXBlLCB0aGlzIGlzIHdoYXQgd2UgbmVlZCB0byBkby4KLQkJCQlzd2l0Y2ggKHBSZXFFbGVtLT5SZXFFbGVtLlR5cGUpCi0JCQkJewotCQkJCQljYXNlIE1TUk5fVFlQRV9DSEFOTkVMX0xPQURfUkVROgotCQkJCQljYXNlIE1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUToKLQkJCQkJY2FzZSBNU1JOX1RZUEVfQkVBQ09OX1JFUToKLQkJCQkJCS8vIENoZWNrIHRoZSBFbmFibGUgbm9uLXNlcnZpbmcgY2hhbm5lbCBtZWFzdXJlbWVudCBjb250cm9sCi0JCQkJCQlpZiAocEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5EQ1JNRW5hYmxlID09IDApCi0JCQkJCQl7Ci0JCQkJCQkJLy8gQ2hlY2sgY2hhbm5lbCBiZWZvcmUgZW5xdWV1ZSB0aGUgYWN0aW9uCi0JCQkJCQkJaWYgKHBSZXFFbGVtLT5NZWFzdXJlbWVudC5DaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCS8vIElmIG9mZiBjaGFubmVsIG1lYXN1cmVtZW50LCBjaGVjayB0aGUgVFUgZHVyYXRpb24gbGltaXQKLQkJCQkJCQlpZiAocFJlcUVsZW0tPk1lYXN1cmVtZW50LkNoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQkJCQkJCQkJaWYgKHBSZXFFbGVtLT5NZWFzdXJlbWVudC5EdXJhdGlvbiA+IHBBZC0+U3RhQ2ZnLkNDWENvbnRyb2wuZmllbGQuVHVMaW1pdCkKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCi0JCQkJCQkvLyBTYXZlIHJlcXVlc3RzIGFuZCBleGVjdXRlIGFjdGlvbnMgbGF0ZXIKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLCBwUmVxRWxlbSwgc2l6ZW9mKFJNX1JFUVVFU1RfQUNUSU9OKSk7Ci0JCQkJCQlJbmRleCArPSAxOwotCQkJCQkJYnJlYWs7Ci0KLQkJCQkJY2FzZSBNU1JOX1RZUEVfRlJBTUVfUkVROgotCQkJCQkJLy8gU2luY2UgaXQncyBvcHRpb24sIHdlIHdpbGwgc3VwcG9ydCBsYXRlcgotCQkJCQkJLy8gRnJhbWVSZXF1ZXN0QWN0aW9uKHBBZCwgcERhdGEpOwotCQkJCQkJYnJlYWs7Ci0KLQkJCQkJZGVmYXVsdDoKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCS8vIFBvaW50IHRvIG5leHQgTWVhc3VyZW1lbnQgcmVxdWVzdAotCQkJCXBEYXRhICArPSBzaXplb2YoUk1fUkVRVUVTVF9BQ1RJT04pOwotCQkJCUxlbmd0aCAtPSBzaXplb2YoUk1fUkVRVUVTVF9BQ1RJT04pOwotCQkJCWJyZWFrOwotCi0JCQkvLyBXZSBhY2NlcHQgcmVxdWVzdCBvbmx5LCBhbGwgb3RoZXJzIGFyZSBkcm9wcGVkCi0JCQljYXNlIElFX01FQVNVUkVNRU5UX1JFUE9SVDoKLQkJCWNhc2UgSUVfQVBfVFhfUE9XRVI6Ci0JCQljYXNlIElFX01FQVNVUkVNRU5UX0NBUEFCSUxJVFk6Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8vIDExLiBVcGRhdGUgc29tZSBmbGFncyBhbmQgaW5kZXgKLQlwQWQtPlN0YUNmZy5STVJlcUNudCA9IEluZGV4OwotCi0JaWYgKEluZGV4KQotCXsKLQkJTWxtZUVucXVldWUocEFkLCBBSVJPTkVUX1NUQVRFX01BQ0hJTkUsIE1UMl9BSVJPTkVUX1NDQU5fUkVRLCAwLCBOVUxMKTsKLQkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS0tLSBBaXJvbmV0TXNnQWN0aW9uXG4iKSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlBaXJvbmV0UmVxdWVzdEFjdGlvbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglNTE1FX1FVRVVFX0VMRU0JKkVsZW0pCi17Ci0JUFJNX1JFUVVFU1RfQUNUSU9OCXBSZXE7Ci0KLQkvLyAxLiBQb2ludCB0byBuZXh0IHJlcXVlc3QgZWxlbWVudAotCXBSZXEgPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSAmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W3BBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeF07Ci0KLQkvLyAyLiBQYXJzZSBtZWFzdXJlbWVudCB0eXBlIGFuZCBjYWxsIGFwcHJvcHJpYXRlIGZ1bmN0aW9ucwotCWlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVEpCi0JCS8vIENoYW5uZWwgTG9hZCBtZWFzdXJlbWVudCByZXF1ZXN0Ci0JCUNoYW5uZWxMb2FkUmVxdWVzdEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7Ci0JZWxzZSBpZiAocFJlcS0+UmVxRWxlbS5UeXBlID09IE1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUSkKLQkJLy8gTm9pc2UgSGlzdG9ncmFtIG1lYXN1cmVtZW50IHJlcXVlc3QKLQkJTm9pc2VIaXN0UmVxdWVzdEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7Ci0JZWxzZSBpZiAocFJlcS0+UmVxRWxlbS5UeXBlID09IE1TUk5fVFlQRV9CRUFDT05fUkVRKQotCQkvLyBCZWFjb24gbWVhc3VyZW1lbnQgcmVxdWVzdAotCQlCZWFjb25SZXF1ZXN0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKLQllbHNlCi0JCS8vIFVua25vd24uIERvIG5vdGhpbmcgYW5kIHJldHVybiwgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuCi0JCXJldHVybjsKLQotCS8vIDMuIFBlZWsgaW50byB0aGUgbmV4dCByZXF1ZXN0LCBpZiBpdCdzIHBhcmFsbGVsLCB3ZSB3aWxsIHVwZGF0ZSB0aGUgc2NhbiB0aW1lIHRvIHRoZSBsYXJnZXN0IG9uZQotCWlmICgocEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4ICsgMSkgPCBwQWQtPlN0YUNmZy5STVJlcUNudCkKLQl7Ci0JCXBSZXEgPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSAmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W3BBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCArIDFdOwotCQkvLyBDaGVjayBmb3IgcGFyYWxsZWwgYml0Ci0JCWlmICgocFJlcS0+UmVxRWxlbS5Nb2RlICYgMHgwMSkgJiYgKHBSZXEtPk1lYXN1cmVtZW50LkNoYW5uZWwgPT0gcEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwpKQotCQl7Ci0JCQkvLyBVcGRhdGUgcGFyYWxsZWwgbW9kZSByZXF1ZXN0IGluZm9ybWF0aW9uCi0JCQlwQWQtPlN0YUNmZy5QYXJhbGxlbFJlcSA9IFRSVUU7Ci0JCQlwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSA9ICgocFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb24gPiBwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSkgPwotCQkJKHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uKSA6IChwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSkpOwotCQl9Ci0JfQotCi0JLy8gNC4gQ2FsbCBSVDI4WFhfTUxNRV9IQU5ETEVSIHRvIGV4ZWN1dGUgdGhlIHJlcXVlc3QgbWxtZSBjb21tYW5kcywgU2NhbiByZXF1ZXN0IGlzIHRoZSBvbmx5IG9uZSB1c2VkCi0JUlQyOFhYX01MTUVfSEFORExFUihwQWQpOwotCi19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVByZXBhcmUgY2hhbm5lbCBsb2FkIHJlcG9ydCBhY3Rpb24sIHNwZWNpYWwgc2NhbiBvcGVyYXRpb24gYWRkZWQKLQkJdG8gc3VwcG9ydAotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgotCQlwRGF0YQkJU3RhcnQgZnJvbSBlbGVtZW50IElECi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECUNoYW5uZWxMb2FkUmVxdWVzdEFjdGlvbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCUluZGV4KQotewotCVBSTV9SRVFVRVNUX0FDVElPTgkJCQlwUmVxOwotCU1MTUVfU0NBTl9SRVFfU1RSVUNUCQkJU2NhblJlcTsKLQlVQ0hBUgkJCQkJCQlaZXJvU3NpZFszMl07Ci0JTkRJU19TVEFUVVMJCQkJCQlOU3RhdHVzOwotCVBVQ0hBUgkJCQkJCQlwT3V0QnVmZmVyID0gTlVMTDsKLQlQSEVBREVSXzgwMl8xMQkJCQkJcE51bGxGcmFtZTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoYW5uZWxMb2FkUmVxdWVzdEFjdGlvbiAtLS0tLT5cbiIpKTsKLQotCXBSZXEgPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSAmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XTsKLQlOZGlzWmVyb01lbW9yeShaZXJvU3NpZCwgMzIpOwotCi0JLy8gUHJlcGFyZSBmb3Igc3BlY2lhbCBzY2FuIHJlcXVlc3QKLQkvLyBUaGUgc2NhbiBkZWZpbml0aW9uIGlzIGRpZmZlcmVudCB3aXRoIG91ciBBY3RpdmUsIFBhc3NpdmUgc2NhbiBkZWZpbml0aW9uLgotCS8vIEZvciBDQ1gyLCBBY3RpdmUgbWVhbnMgc2VuZCBvdXQgcHJvYmUgcmVxdWVzdCB3aXRoIGJyb2FkY2FzdCBCU1NJRC4KLQkvLyBQYXNzaXZlIG1lYW5zIG5vIHByb2JlIHJlcXVlc3Qgc2VudCwgb25seSBsaXN0ZW4gdG8gdGhlIGJlYWNvbnMuCi0JLy8gVGhlIGNoYW5uZWwgc2Nhbm5lZCBpcyBmaXhlZCBhcyBzcGVjaWZpZWQsIG5vIG5lZWQgdG8gc2NhbiBhbGwgY2hhbm5lbHMuCi0JLy8gVGhlIHNjYW4gd2FpdCB0aW1lIGlzIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCB0b28uCi0JLy8gUGFzc2l2ZSBzY2FuIE1vZGUKLQotCS8vIENvbnRyb2wgc3RhdGUgbWFjaGluZSBpcyBub3QgaWRsZSwgcmVqZWN0IHRoZSByZXF1ZXN0Ci0JaWYgKChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkgJiYgKEluZGV4ID09IDApKQotCQlyZXR1cm47Ci0KLQkvLyBGaWxsIG91dCBzdHVmZiBmb3Igc2NhbiByZXF1ZXN0Ci0JU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIFplcm9Tc2lkLCAwLCBCU1NfQU5ZLCBTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRCk7Ci0JTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLCBzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7Ci0JcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOwotCi0JLy8gUmVzZXQgc29tZSBpbnRlcm5hbCBjb250cm9sIGZsYWdzIHRvIG1ha2Ugc3VyZSB0aGlzIHNjYW4gd29ya3MuCi0JQnNzVGFibGVJbml0KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIpOwotCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgICAgICAgID0gMDsKLQlwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCA9IHBSZXEtPk1lYXN1cmVtZW50LkNoYW5uZWw7Ci0JcEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUgICAgPSBwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbjsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkR1cmF0aW9uICVkLCBDaGFubmVsICVkIVxuIiwgcFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb24sIHBSZXEtPk1lYXN1cmVtZW50LkNoYW5uZWwpKTsKLQotCS8vIElmIGl0J3Mgbm9uIHNlcnZpbmcgY2hhbm5lbCBzY2FuLCBzZW5kIG91dCBhIG51bGwgZnJhbWUgd2l0aCBQU00gYml0IG9uLgotCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQotCXsKLQkJLy8gVXNlIE1MTUUgZW5xdWV1ZSBtZXRob2QKLQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JCWlmIChOU3RhdHVzCSE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCQlyZXR1cm47Ci0KLQkJcE51bGxGcmFtZSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjs7Ci0JCS8vIE1ha2UgdGhlIHBvd2VyIHNhdmUgTnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24KLQkJTWd0TWFjSGVhZGVySW5pdChwQWQsIHBOdWxsRnJhbWUsIFNVQlRZUEVfTlVMTF9GVU5DLCAxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQlwTnVsbEZyYW1lLT5EdXJhdGlvbiAJPSAwOwotCQlwTnVsbEZyYW1lLT5GQy5UeXBlIAk9IEJUWVBFX0RBVEE7Ci0JCXBOdWxsRnJhbWUtPkZDLlB3ck1nbXQJPSBQV1JfU0FWRTsKLQotCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCi0JCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKLQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKLQl9Ci0KLQlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICAgICA9IE1TUk5fVFlQRV9DSEFOTkVMX0xPQURfUkVROwotCXBBZC0+U3RhQ2ZnLkNMQnVzeUJ5dGVzICAgID0gMDsKLQkvLyBFbmFibGUgUnggd2l0aCBwcm9taXNjdW91cyByZWNlcHRpb24KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9GSUxUUl9DRkcsIDB4MTAxMCk7Ci0KLQkvLyBTZXQgY2hhbm5lbCBsb2FkIG1lYXN1cmVtZW50IGZsYWcKLQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19NRUFTVVJFTUVOVCk7Ci0KLQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9TQ0FOTklORzsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoYW5uZWxMb2FkUmVxdWVzdEFjdGlvbiA8LS0tLS1cbiIpKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVByZXBhcmUgbm9pc2UgaGlzdG9ncmFtIHJlcG9ydCBhY3Rpb24sIHNwZWNpYWwgc2NhbiBvcGVyYXRpb24gYWRkZWQKLQkJdG8gc3VwcG9ydAotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgotCQlwRGF0YQkJU3RhcnQgZnJvbSBlbGVtZW50IElECi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECU5vaXNlSGlzdFJlcXVlc3RBY3Rpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlJbmRleCkKLXsKLQlQUk1fUkVRVUVTVF9BQ1RJT04JCQkJcFJlcTsKLQlNTE1FX1NDQU5fUkVRX1NUUlVDVAkJCVNjYW5SZXE7Ci0JVUNIQVIJCQkJCQkJWmVyb1NzaWRbMzJdLCBpOwotCU5ESVNfU1RBVFVTCQkJCQkJTlN0YXR1czsKLQlQVUNIQVIJCQkJCQkJcE91dEJ1ZmZlciA9IE5VTEw7Ci0JUEhFQURFUl84MDJfMTEJCQkJCXBOdWxsRnJhbWU7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOb2lzZUhpc3RSZXF1ZXN0QWN0aW9uIC0tLS0tPlxuIikpOwotCi0JcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdOwotCU5kaXNaZXJvTWVtb3J5KFplcm9Tc2lkLCAzMik7Ci0KLQkvLyBQcmVwYXJlIGZvciBzcGVjaWFsIHNjYW4gcmVxdWVzdAotCS8vIFRoZSBzY2FuIGRlZmluaXRpb24gaXMgZGlmZmVyZW50IHdpdGggb3VyIEFjdGl2ZSwgUGFzc2l2ZSBzY2FuIGRlZmluaXRpb24uCi0JLy8gRm9yIENDWDIsIEFjdGl2ZSBtZWFucyBzZW5kIG91dCBwcm9iZSByZXF1ZXN0IHdpdGggYnJvYWRjYXN0IEJTU0lELgotCS8vIFBhc3NpdmUgbWVhbnMgbm8gcHJvYmUgcmVxdWVzdCBzZW50LCBvbmx5IGxpc3RlbiB0byB0aGUgYmVhY29ucy4KLQkvLyBUaGUgY2hhbm5lbCBzY2FubmVkIGlzIGZpeGVkIGFzIHNwZWNpZmllZCwgbm8gbmVlZCB0byBzY2FuIGFsbCBjaGFubmVscy4KLQkvLyBUaGUgc2NhbiB3YWl0IHRpbWUgaXMgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHRvby4KLQkvLyBQYXNzaXZlIHNjYW4gTW9kZQotCi0JLy8gQ29udHJvbCBzdGF0ZSBtYWNoaW5lIGlzIG5vdCBpZGxlLCByZWplY3QgdGhlIHJlcXVlc3QKLQlpZiAoKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKSAmJiAoSW5kZXggPT0gMCkpCi0JCXJldHVybjsKLQotCS8vIEZpbGwgb3V0IHN0dWZmIGZvciBzY2FuIHJlcXVlc3QKLQlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgWmVyb1NzaWQsIDAsIEJTU19BTlksIFNDQU5fQ0lTQ09fTk9JU0UpOwotCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwgc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOwotCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjsKLQotCS8vIFJlc2V0IHNvbWUgaW50ZXJuYWwgY29udHJvbCBmbGFncyB0byBtYWtlIHN1cmUgdGhpcyBzY2FuIHdvcmtzLgotCUJzc1RhYmxlSW5pdCgmcEFkLT5TdGFDZmcuQ0NYQnNzVGFiKTsKLQlwQWQtPlN0YUNmZy5TY2FuQ250ICAgICAgICA9IDA7Ci0JcEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgPSBwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsOwotCXBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lICAgID0gcFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb247Ci0JcEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSAgICAgPSBNU1JOX1RZUEVfTk9JU0VfSElTVF9SRVE7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEdXJhdGlvbiAlZCwgQ2hhbm5lbCAlZCFcbiIsIHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uLCBwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsKSk7Ci0KLQkvLyBJZiBpdCdzIG5vbiBzZXJ2aW5nIGNoYW5uZWwgc2Nhbiwgc2VuZCBvdXQgYSBudWxsIGZyYW1lIHdpdGggUFNNIGJpdCBvbi4KLQlpZiAocEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQl7Ci0JCS8vIFVzZSBNTE1FIGVucXVldWUgbWV0aG9kCi0JCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCQlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQkJcmV0dXJuOwotCi0JCXBOdWxsRnJhbWUgPSAoUEhFQURFUl84MDJfMTEpIHBPdXRCdWZmZXI7Ci0JCS8vIE1ha2UgdGhlIHBvd2VyIHNhdmUgTnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24KLQkJTWd0TWFjSGVhZGVySW5pdChwQWQsIHBOdWxsRnJhbWUsIFNVQlRZUEVfTlVMTF9GVU5DLCAxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQlwTnVsbEZyYW1lLT5EdXJhdGlvbiAJPSAwOwotCQlwTnVsbEZyYW1lLT5GQy5UeXBlICAJPSBCVFlQRV9EQVRBOwotCQlwTnVsbEZyYW1lLT5GQy5Qd3JNZ210CT0gUFdSX1NBVkU7Ci0KLQkJLy8gU2VuZCB1c2luZyBwcmlvcml0eSBxdWV1ZQotCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIHNpemVvZihIRUFERVJfODAyXzExKSk7Ci0JCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlbmQgUFNNIERhdGEgZnJhbWUgZm9yIG9mZiBjaGFubmVsIFJNXG4iKSk7Ci0JCVJUTVB1c2VjRGVsYXkoNTAwMCk7Ci0JfQotCi0JLy8gUmVzZXQgdGhlIHN0YXRpc3RpY3MKLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5W2ldID0gMDsKLQotCS8vIEVuYWJsZSBSeCB3aXRoIHByb21pc2N1b3VzIHJlY2VwdGlvbgotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgMHgxMDEwKTsKLQotCS8vIFNldCBjaGFubmVsIGxvYWQgbWVhc3VyZW1lbnQgZmxhZwotCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX01FQVNVUkVNRU5UKTsKLQotCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX1NDQU5OSU5HOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm9pc2VIaXN0UmVxdWVzdEFjdGlvbiA8LS0tLS1cbiIpKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVByZXBhcmUgQmVhY29uIHJlcG9ydCBhY3Rpb24sIHNwZWNpYWwgc2NhbiBvcGVyYXRpb24gYWRkZWQKLQkJdG8gc3VwcG9ydAotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgotCQlwRGF0YQkJU3RhcnQgZnJvbSBlbGVtZW50IElECi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECUJlYWNvblJlcXVlc3RBY3Rpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlJbmRleCkKLXsKLQlQUk1fUkVRVUVTVF9BQ1RJT04JCQkJcFJlcTsKLQlORElTX1NUQVRVUwkJCQkJCU5TdGF0dXM7Ci0JUFVDSEFSCQkJCQkJCXBPdXRCdWZmZXIgPSBOVUxMOwotCVBIRUFERVJfODAyXzExCQkJCQlwTnVsbEZyYW1lOwotCU1MTUVfU0NBTl9SRVFfU1RSVUNUCQkJU2NhblJlcTsKLQlVQ0hBUgkJCQkJCQlaZXJvU3NpZFszMl07Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCZWFjb25SZXF1ZXN0QWN0aW9uIC0tLS0tPlxuIikpOwotCi0JcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdOwotCU5kaXNaZXJvTWVtb3J5KFplcm9Tc2lkLCAzMik7Ci0KLQkvLyBQcmVwYXJlIGZvciBzcGVjaWFsIHNjYW4gcmVxdWVzdAotCS8vIFRoZSBzY2FuIGRlZmluaXRpb24gaXMgZGlmZmVyZW50IHdpdGggb3VyIEFjdGl2ZSwgUGFzc2l2ZSBzY2FuIGRlZmluaXRpb24uCi0JLy8gRm9yIENDWDIsIEFjdGl2ZSBtZWFucyBzZW5kIG91dCBwcm9iZSByZXF1ZXN0IHdpdGggYnJvYWRjYXN0IEJTU0lELgotCS8vIFBhc3NpdmUgbWVhbnMgbm8gcHJvYmUgcmVxdWVzdCBzZW50LCBvbmx5IGxpc3RlbiB0byB0aGUgYmVhY29ucy4KLQkvLyBUaGUgY2hhbm5lbCBzY2FubmVkIGlzIGZpeGVkIGFzIHNwZWNpZmllZCwgbm8gbmVlZCB0byBzY2FuIGFsbCBjaGFubmVscy4KLQkvLyBUaGUgc2NhbiB3YWl0IHRpbWUgaXMgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHRvby4KLQlpZiAocFJlcS0+TWVhc3VyZW1lbnQuU2Nhbk1vZGUgPT0gTVNSTl9TQ0FOX01PREVfUEFTU0lWRSkKLQl7Ci0JCS8vIFBhc3NpdmUgc2NhbiBNb2RlCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBhc3NpdmUgU2NhbiBNb2RlIVxuIikpOwotCi0JCS8vIENvbnRyb2wgc3RhdGUgbWFjaGluZSBpcyBub3QgaWRsZSwgcmVqZWN0IHRoZSByZXF1ZXN0Ci0JCWlmICgocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpICYmIChJbmRleCA9PSAwKSkKLQkJCXJldHVybjsKLQotCQkvLyBGaWxsIG91dCBzdHVmZiBmb3Igc2NhbiByZXF1ZXN0Ci0JCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBaZXJvU3NpZCwgMCwgQlNTX0FOWSwgU0NBTl9DSVNDT19QQVNTSVZFKTsKLQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLCBzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7Ci0JCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjsKLQotCQkvLyBSZXNldCBzb21lIGludGVybmFsIGNvbnRyb2wgZmxhZ3MgdG8gbWFrZSBzdXJlIHRoaXMgc2NhbiB3b3Jrcy4KLQkJQnNzVGFibGVJbml0KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIpOwotCQlwQWQtPlN0YUNmZy5TY2FuQ250ICAgICAgICA9IDA7Ci0JCXBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsID0gcFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbDsKLQkJcEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUgICAgPSBwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbjsKLQkJcEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSAgICAgPSBNU1JOX1RZUEVfQkVBQ09OX1JFUTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRHVyYXRpb24gJWQhXG4iLCBwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbikpOwotCi0JCS8vIElmIGl0J3Mgbm9uIHNlcnZpbmcgY2hhbm5lbCBzY2FuLCBzZW5kIG91dCBhIG51bGwgZnJhbWUgd2l0aCBQU00gYml0IG9uLgotCQlpZiAocEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQkJewotCQkJLy8gVXNlIE1MTUUgZW5xdWV1ZSBtZXRob2QKLQkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCQkJaWYgKE5TdGF0dXMJIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCQlyZXR1cm47Ci0KLQkJCXBOdWxsRnJhbWUgPSAoUEhFQURFUl84MDJfMTEpIHBPdXRCdWZmZXI7Ci0JCQkvLyBNYWtlIHRoZSBwb3dlciBzYXZlIE51bGwgZnJhbWUgd2l0aCBQU00gYml0IG9uCi0JCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcE51bGxGcmFtZSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQlwTnVsbEZyYW1lLT5EdXJhdGlvbiAJPSAwOwotCQkJcE51bGxGcmFtZS0+RkMuVHlwZSAgICAgPSBCVFlQRV9EQVRBOwotCQkJcE51bGxGcmFtZS0+RkMuUHdyTWdtdCAgPSBQV1JfU0FWRTsKLQotCQkJLy8gU2VuZCB1c2luZyBwcmlvcml0eSBxdWV1ZQotCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlbmQgUFNNIERhdGEgZnJhbWUgZm9yIG9mZiBjaGFubmVsIFJNXG4iKSk7Ci0JCQlSVE1QdXNlY0RlbGF5KDUwMDApOwotCQl9Ci0KLQkJcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfU0NBTk5JTkc7Ci0JfQotCWVsc2UgaWYgKHBSZXEtPk1lYXN1cmVtZW50LlNjYW5Nb2RlID09IE1TUk5fU0NBTl9NT0RFX0FDVElWRSkKLQl7Ci0JCS8vIEFjdGl2ZSBzY2FuIE1vZGUKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWN0aXZlIFNjYW4gTW9kZSFcbiIpKTsKLQotCQkvLyBDb250cm9sIHN0YXRlIG1hY2hpbmUgaXMgbm90IGlkbGUsIHJlamVjdCB0aGUgcmVxdWVzdAotCQlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCi0JCQlyZXR1cm47Ci0KLQkJLy8gRmlsbCBvdXQgc3R1ZmYgZm9yIHNjYW4gcmVxdWVzdAotCQlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgWmVyb1NzaWQsIDAsIEJTU19BTlksIFNDQU5fQ0lTQ09fQUNUSVZFKTsKLQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLCBzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7Ci0JCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjsKLQotCQkvLyBSZXNldCBzb21lIGludGVybmFsIGNvbnRyb2wgZmxhZ3MgdG8gbWFrZSBzdXJlIHRoaXMgc2NhbiB3b3Jrcy4KLQkJQnNzVGFibGVJbml0KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIpOwotCQlwQWQtPlN0YUNmZy5TY2FuQ250ICAgICAgICA9IDA7Ci0JCXBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsID0gcFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbDsKLQkJcEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUgICAgPSBwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbjsKLQkJcEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSAgICAgPSBNU1JOX1RZUEVfQkVBQ09OX1JFUTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRHVyYXRpb24gJWQhXG4iLCBwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbikpOwotCi0JCS8vIElmIGl0J3Mgbm9uIHNlcnZpbmcgY2hhbm5lbCBzY2FuLCBzZW5kIG91dCBhIG51bGwgZnJhbWUgd2l0aCBQU00gYml0IG9uLgotCQlpZiAocEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQkJewotCQkJLy8gVXNlIE1MTUUgZW5xdWV1ZSBtZXRob2QKLQkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCQkJaWYgKE5TdGF0dXMJIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCQlyZXR1cm47Ci0KLQkJCXBOdWxsRnJhbWUgPSAoUEhFQURFUl84MDJfMTEpIHBPdXRCdWZmZXI7Ci0JCQkvLyBNYWtlIHRoZSBwb3dlciBzYXZlIE51bGwgZnJhbWUgd2l0aCBQU00gYml0IG9uCi0JCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcE51bGxGcmFtZSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQlwTnVsbEZyYW1lLT5EdXJhdGlvbiAJPSAwOwotCQkJcE51bGxGcmFtZS0+RkMuVHlwZSAgICAgPSBCVFlQRV9EQVRBOwotCQkJcE51bGxGcmFtZS0+RkMuUHdyTWdtdCAgPSBQV1JfU0FWRTsKLQotCQkJLy8gU2VuZCB1c2luZyBwcmlvcml0eSBxdWV1ZQotCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlbmQgUFNNIERhdGEgZnJhbWUgZm9yIG9mZiBjaGFubmVsIFJNXG4iKSk7Ci0JCQlSVE1QdXNlY0RlbGF5KDUwMDApOwotCQl9Ci0KLQkJcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfU0NBTk5JTkc7Ci0JfQotCWVsc2UgaWYgKHBSZXEtPk1lYXN1cmVtZW50LlNjYW5Nb2RlID09IE1TUk5fU0NBTl9NT0RFX0JFQUNPTl9UQUJMRSkKLQl7Ci0JCS8vIEJlYWNvbiByZXBvcnQgTW9kZSwgcmVwb3J0IGFsbCB0aGUgQVBTIGluIGN1cnJlbnQgYnNzIHRhYmxlCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJlYWNvbiBSZXBvcnQgTW9kZSFcbiIpKTsKLQotCQkvLyBDb3B5IGN1cnJlbnQgQlNTIHRhYmxlIHRvIENDWCB0YWJsZSwgd2UgY2FuIG9taXQgdGhpcyBzdGVwIGxhdGVyIG9uLgotCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuQ0NYQnNzVGFiLCAmcEFkLT5TY2FuVGFiLCBzaXplb2YoQlNTX1RBQkxFKSk7Ci0KLQkJLy8gQ3JlYXRlIGJlYWNvbiByZXBvcnQgZnJvbSBCc3MgdGFibGUKLQkJQWlyb25ldENyZWF0ZUJlYWNvblJlcG9ydEZyb21Cc3NUYWJsZShwQWQpOwotCi0JCS8vIFNldCBzdGF0ZSB0byBzY2FubmluZwotCQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9TQ0FOTklORzsKLQotCQkvLyBFbnF1ZXVlIHJlcG9ydCByZXF1ZXN0Ci0JCS8vIENpc2NvIHNjYW4gcmVxdWVzdCBpcyBmaW5pc2hlZCwgcHJlcGFyZSBiZWFjb24gcmVwb3J0Ci0JCU1sbWVFbnF1ZXVlKHBBZCwgQUlST05FVF9TVEFURV9NQUNISU5FLCBNVDJfQUlST05FVF9TQ0FOX0RPTkUsIDAsIE5VTEwpOwotCX0KLQllbHNlCi0JewotCQkvLyBXcm9uZyBzY2FuIE1vZGUKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3JvbmcgU2NhbiBNb2RlIVxuIikpOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJlYWNvblJlcXVlc3RBY3Rpb24gPC0tLS0tXG4iKSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlBaXJvbmV0UmVwb3J0QWN0aW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU1MTUVfUVVFVUVfRUxFTQkqRWxlbSkKLXsKLQlQUk1fUkVRVUVTVF9BQ1RJT04JcFJlcTsKLQlVTE9ORwkJCQlOb3czMjsKLQotICAgIE5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdzMyKTsKLQlwQWQtPlN0YUNmZy5MYXN0QmVhY29uUnhUaW1lID0gTm93MzI7Ci0KLQlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHhdOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWlyb25ldFJlcG9ydEFjdGlvbiAtLS0tLT5cbiIpKTsKLQotCS8vIDEuIFBhcnNlIG1lYXN1cmVtZW50IHR5cGUgYW5kIGNhbGwgYXBwcm9wcmlhdGUgZnVuY3Rpb25zCi0JaWYgKHBSZXEtPlJlcUVsZW0uVHlwZSA9PSBNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUSkKLQkJLy8gQ2hhbm5lbCBMb2FkIG1lYXN1cmVtZW50IHJlcXVlc3QKLQkJQ2hhbm5lbExvYWRSZXBvcnRBY3Rpb24ocEFkLCBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgpOwotCWVsc2UgaWYgKHBSZXEtPlJlcUVsZW0uVHlwZSA9PSBNU1JOX1RZUEVfTk9JU0VfSElTVF9SRVEpCi0JCS8vIE5vaXNlIEhpc3RvZ3JhbSBtZWFzdXJlbWVudCByZXF1ZXN0Ci0JCU5vaXNlSGlzdFJlcG9ydEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7Ci0JZWxzZSBpZiAocFJlcS0+UmVxRWxlbS5UeXBlID09IE1TUk5fVFlQRV9CRUFDT05fUkVRKQotCQkvLyBCZWFjb24gbWVhc3VyZW1lbnQgcmVxdWVzdAotCQlCZWFjb25SZXBvcnRBY3Rpb24ocEFkLCBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgpOwotCWVsc2UKLQkJLy8gVW5rbm93bi4gRG8gbm90aGluZyBhbmQgcmV0dXJuCi0JCTsKLQotCS8vIDIuIFBvaW50IHRvIHRoZSBjb3JyZWN0IGluZGV4IG9mIGFjdGlvbiBlbGVtZW50LCBzdGFydCBmcm9tIDAKLQlwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgrKzsKLQotCS8vIDMuIENoZWNrIGZvciBwYXJhbGxlbCBhY3Rpb25zCi0JaWYgKHBBZC0+U3RhQ2ZnLlBhcmFsbGVsUmVxID09IFRSVUUpCi0JewotCQlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHhdOwotCi0JCS8vIFByb2Nlc3MgbmV4dCBhY3Rpb24gcmlnaHQgYXdheQotCQlpZiAocFJlcS0+UmVxRWxlbS5UeXBlID09IE1TUk5fVFlQRV9DSEFOTkVMX0xPQURfUkVRKQotCQkJLy8gQ2hhbm5lbCBMb2FkIG1lYXN1cmVtZW50IHJlcXVlc3QKLQkJCUNoYW5uZWxMb2FkUmVwb3J0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKLQkJZWxzZSBpZiAocFJlcS0+UmVxRWxlbS5UeXBlID09IE1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUSkKLQkJCS8vIE5vaXNlIEhpc3RvZ3JhbSBtZWFzdXJlbWVudCByZXF1ZXN0Ci0JCQlOb2lzZUhpc3RSZXBvcnRBY3Rpb24ocEFkLCBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgpOwotCi0JCXBBZC0+U3RhQ2ZnLlBhcmFsbGVsUmVxID0gRkFMU0U7Ci0JCXBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCsrOwotCX0KLQotCWlmIChwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHggPj0gcEFkLT5TdGFDZmcuUk1SZXFDbnQpCi0JewotCQkvLyA0LiBUaGVyZSBpcyBubyBtb3JlIHVucHJvY2Vzc2VkIG1lYXN1cmVtZW50IHJlcXVlc3QsIGdvIGZvciB0cmFuc21pdCB0aGlzIHJlcG9ydAotCQlBaXJvbmV0RmluYWxSZXBvcnRBY3Rpb24ocEFkKTsKLQkJcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfSURMRTsKLQl9Ci0JZWxzZQotCXsKLQkJcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4XTsKLQotCQlpZiAocFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQotCQl7Ci0JCQlSVE1QdXNlY0RlbGF5KDEwMDAwMCk7Ci0JCX0KLQotCQkvLyA1LiBUaGVyZSBhcmUgbW9yZSByZXF1ZXN0cyB0byBiZSBtZWFzdXJlCi0JCU1sbWVFbnF1ZXVlKHBBZCwgQUlST05FVF9TVEFURV9NQUNISU5FLCBNVDJfQUlST05FVF9TQ0FOX1JFUSwgMCwgTlVMTCk7Ci0JCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBaXJvbmV0UmVwb3J0QWN0aW9uIDwtLS0tLVxuIikpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJQWlyb25ldEZpbmFsUmVwb3J0QWN0aW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCVBVQ0hBUgkJCQkJcERlc3Q7Ci0JUEFJUk9ORVRfSUFQUF9IRUFERVIJcElBUFA7Ci0JUEhFQURFUl84MDJfMTEJCQlwSGVhZGVyOwotCVVDSEFSCQkJCQlBY2tSYXRlID0gUkFURV8yOwotCVVTSE9SVAkJCQkJQWNrRHVyYXRpb24gPSAwOwotCU5ESVNfU1RBVFVTCQkJCU5TdGF0dXM7Ci0JUFVDSEFSCQkJCQlwT3V0QnVmZmVyID0gTlVMTDsKLQlVTE9ORwkJCQkJRnJhbWVMZW4gPSAwOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWlyb25ldEZpbmFsUmVwb3J0QWN0aW9uIC0tLS0tPlxuIikpOwotCi0JLy8gMC4gU2V0IHVwIHRoZSBmcmFtZSBwb2ludGVyLCBGcmFtZSB3YXMgaW5pdGVkIGF0IHRoZSBlbmQgb2YgbWVzc2FnZSBhY3Rpb24KLQlwRGVzdCA9ICZwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydEJ1ZltMRU5HVEhfODAyXzExXTsKLQotCS8vIDEuIFVwZGF0ZSByZXBvcnQgSUFQUCBmaWVsZHMKLQlwSUFQUCA9IChQQUlST05FVF9JQVBQX0hFQURFUikgcERlc3Q7Ci0KLQkvLyAyLiBDb3B5IENpc2NvIFNOQVAgaGVhZGVyCi0JTmRpc01vdmVNZW1vcnkocElBUFAtPkNpc2NvU25hcEhlYWRlciwgU05BUF9BSVJPTkVULCBMRU5HVEhfODAyXzFfSCk7Ci0KLQkvLyAzLiBuZXR3b3JrIG9yZGVyIGZvciB0aGlzIDE2Yml0IGxlbmd0aAotCXBJQVBQLT5MZW5ndGggID0gY3B1MmJlMTYocEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4gLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIXzgwMl8xX0gpOwotCi0JLy8gMy4xIHNhbml0eSBjaGVjayB0aGUgcmVwb3J0IGxlbmd0aCwgaWdub3JlIGl0IGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmVwb3J0Ci0JaWYgKGJlMmNwdTE2KHBJQVBQLT5MZW5ndGgpIDw9IDE4KQotCQlyZXR1cm47Ci0KLQkvLyA0LiBUeXBlIG11c3QgYmUgMHgzMgotCXBJQVBQLT5UeXBlICAgID0gQUlST05FVF9JQVBQX1RZUEU7Ci0KLQkvLyA1LiBTdWJUeXBlIGZvciByZXBvcnQgbXVzdCBiZSAweDgxCi0JcElBUFAtPlN1YlR5cGUgPSBBSVJPTkVUX0lBUFBfU1VCVFlQRV9SRVBPUlQ7Ci0KLQkvLyA2LiBEQSBpcyBub3QgdXNlZCBhbmQgbXVzdCBiZSB6ZXJvLCBhbHRob3VnaCB0aGUgd2hvbGUgZnJhbWUgd2FzIGNsZWFyZWQgYXQgdGhlIHN0YXJ0IG9mIGZ1bmN0aW9uCi0JLy8gICAgV2Ugd2lsbCBkbyBpdCBhZ2FpbiBoZXJlLiBXZSBjYW4gdXNlIEJTU0lEIGluc3RlYWQKLQlDT1BZX01BQ19BRERSKHBJQVBQLT5EQSwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCi0JLy8gNy4gU0EgaXMgdGhlIGNsaWVudCByZXBvcnRpbmcgd2hpY2ggbXVzdCBiZSBvdXIgTUFDCi0JQ09QWV9NQUNfQUREUihwSUFQUC0+U0EsIHBBZC0+Q3VycmVudEFkZHJlc3MpOwotCi0JLy8gOC4gQ29weSB0aGUgc2F2ZWQgZGlhbG9nIHRva2VuCi0JcElBUFAtPlRva2VuID0gcEFkLT5TdGFDZmcuSUFQUFRva2VuOwotCi0JLy8gOS4gTWFrZSB0aGUgUmVwb3J0IGZyYW1lIDgwMi4xMSBoZWFkZXIKLQkvLyAgICBSZXVzZSBmdW5jdGlvbiBpbiB3cGEuYwotCXBIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmOwotCXBBZC0+U2VxdWVuY2UgKys7Ci0JV3BhTWFjSGVhZGVySW5pdChwQWQsIHBIZWFkZXIsIDAsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQotCS8vIEFDSyBzaXplCWlzIDE0IGluY2x1ZGUgQ1JDLCBhbmQgaXRzIHJhdGUJaXMgYmFzZWQgb24gcmVhbCB0aW1lIGluZm9ybWF0aW9uCi0JQWNrUmF0ZSAgICAgPSBwQWQtPkNvbW1vbkNmZy5FeHBlY3RlZEFDS1JhdGVbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOwotCUFja0R1cmF0aW9uID0gUlRNUENhbGNEdXJhdGlvbihwQWQsIEFja1JhdGUsIDE0KTsKLQlwSGVhZGVyLT5EdXJhdGlvbiA9IHBBZC0+Q29tbW9uQ2ZnLkRzaWZzICsgQWNrRHVyYXRpb247Ci0KLQkvLyBVc2UgTUxNRSBlbnF1ZXVlIG1ldGhvZAotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JaWYgKE5TdGF0dXMJIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJcmV0dXJuOwotCi0JLy8gMTAuIFByZXBhcmUgcmVwb3J0IGZyYW1lIHdpdGggZHluYW1pYyBvdXRidWZmZXIuIEp1c3Qgc2ltcGx5IGNvcHkgZXZlcnl0aGluZy4KLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotCSAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuLCBwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydEJ1ZiwKLQkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7Ci0KLQkvLyAxMS4gU2VuZCB1c2luZyBwcmlvcml0eSBxdWV1ZQotCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0KLQlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlID0gTVNSTl9UWVBFX1VOVVNFRDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFpcm9uZXRGaW5hbFJlcG9ydEFjdGlvbiA8LS0tLS1cbiIpKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0KLQlBcmd1bWVudHM6Ci0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECUNoYW5uZWxMb2FkUmVwb3J0QWN0aW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJSW5kZXgpCi17Ci0JUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UCXBSZXBvcnQ7Ci0JUENIQU5ORUxfTE9BRF9SRVBPUlQJCXBMb2FkOwotCVBVQ0hBUgkJCQkJCXBEZXN0OwotCVVDSEFSCQkJCQkJQ0NBQnVzeUZyYWN0aW9uOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbExvYWRSZXBvcnRBY3Rpb24gLS0tLS0+XG4iKSk7Ci0KLQkvLyBEaXNhYmxlIFJ4IHdpdGggcHJvbWlzY3VvdXMgcmVjZXB0aW9uLCBtYWtlIGl0IGJhY2sgdG8gbm9ybWFsCi0JUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCBTVEFOT1JNQUwpOyAvLyBTdGFpb24gbm90IGRyb3AgY29udHJvbCBmcmFtZSB3aWxsIGZhaWwgV2lGaSBDZXJ0aWZpY2F0aW9uLgotCi0JLy8gMC4gU2V0dXAgcG9pbnRlciBmb3IgcHJvY2Vzc2luZyBiZWFjb24gJiBwcm9iZSByZXNwb25zZQotCXBEZXN0ID0gKFBVQ0hBUikgJnBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmW3BBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuXTsKLQlwUmVwb3J0ID0gKFBNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCkgcERlc3Q7Ci0KLQkvLyAxLiBGaWxsIE1lYXN1cmVtZW50IHJlcG9ydCBlbGVtZW50IGZpZWxkLgotCXBSZXBvcnQtPkVpZCAgICA9IElFX01FQVNVUkVNRU5UX1JFUE9SVDsKLQkvLyBGaXhlZCBMZW5ndGggYXQgOSwgbm90IGluY2x1ZGUgRWlkIGFuZCBsZW5ndGggZmllbGRzCi0JcFJlcG9ydC0+TGVuZ3RoID0gOTsKLQlwUmVwb3J0LT5Ub2tlbiAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLlJlcUVsZW0uVG9rZW47Ci0JcFJlcG9ydC0+TW9kZSAgID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XS5SZXFFbGVtLk1vZGU7Ci0JcFJlcG9ydC0+VHlwZSAgID0gTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVE7Ci0KLQkvLyAyLiBGaWxsIGNoYW5uZWwgcmVwb3J0IG1lYXN1cmVtZW50IGRhdGEKLQlwRGVzdCArPSBzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpOwotCXBMb2FkICA9IChQQ0hBTk5FTF9MT0FEX1JFUE9SVCkgcERlc3Q7Ci0JcExvYWQtPkNoYW5uZWwgID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XS5NZWFzdXJlbWVudC5DaGFubmVsOwotCXBMb2FkLT5TcGFyZSAgICA9IDA7Ci0JcExvYWQtPkR1cmF0aW9uID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XS5NZWFzdXJlbWVudC5EdXJhdGlvbjsKLQotCS8vIDMuIENhbGN1bGF0ZSB0aGUgQ0NBIEJ1c3kgRnJhY3Rpb24KLQkvLyAgICAoQnl0ZXMgKyBBQ0sgc2l6ZSkgKiA4IC8gVHggc3BlZWQgKiAyNTUgLyAxMDAwIC8gbWVhc3VyZW1lbnQgZHVyYXRpb24sIHVzZSAyNCB1cyBUeCBzcGVlZAotCS8vICAgICA9ICAoQnl0ZXMgKyBBQ0spIC8gMTIgLyBkdXJhdGlvbgotCS8vICAgICA5IGlzIHRoZSBnb29kIHZhbHVlIGZvciBwQWQtPlN0YUNmZy5DTEZhY3RvcgotCS8vIENDQUJ1c3lGcmFjdGlvbiA9IChVQ0hBUikgKHBBZC0+U3RhQ2ZnLkNMQnVzeUJ5dGVzIC8gOSAvIHBMb2FkLT5EdXJhdGlvbik7Ci0JQ0NBQnVzeUZyYWN0aW9uID0gKFVDSEFSKSAocEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgLyBwQWQtPlN0YUNmZy5DTEZhY3RvciAvIHBMb2FkLT5EdXJhdGlvbik7Ci0JaWYgKENDQUJ1c3lGcmFjdGlvbiA8IDEwKQotCQkJQ0NBQnVzeUZyYWN0aW9uID0gKFVDSEFSKSAocEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgLyAzIC8gcExvYWQtPkR1cmF0aW9uKSArIDE7Ci0KLQlwTG9hZC0+Q0NBQnVzeSA9IENDQUJ1c3lGcmFjdGlvbjsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTEJ1c3lCeXRlICVsZCwgRHVyYXRpb24gJWQsIFJlc3VsdCwgJWRcbiIsIHBBZC0+U3RhQ2ZnLkNMQnVzeUJ5dGVzLCBwTG9hZC0+RHVyYXRpb24sIENDQUJ1c3lGcmFjdGlvbikpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRnJhbWVSZXBvcnRMZW4gJWRcbiIsIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuKSk7Ci0JcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4gKz0gKHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCkgKyBzaXplb2YoQ0hBTk5FTF9MT0FEX1JFUE9SVCkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZyYW1lUmVwb3J0TGVuICVkXG4iLCBwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbikpOwotCi0JLy8gNC4gQ2xlYXIgY2hhbm5lbCBsb2FkIG1lYXN1cmVtZW50IGZsYWcKLQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX01FQVNVUkVNRU5UKTsKLQotCS8vIDUuIHJlc2V0IHRvIGlkbGUgc3RhdGUKLQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9JRExFOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbExvYWRSZXBvcnRBY3Rpb24gPC0tLS0tXG4iKSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlOb2lzZUhpc3RSZXBvcnRBY3Rpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlJbmRleCkKLXsKLQlQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQJcFJlcG9ydDsKLQlQTk9JU0VfSElTVF9SRVBPUlQJCQlwTm9pc2U7Ci0JUFVDSEFSCQkJCQkJcERlc3Q7Ci0JVUNIQVIJCQkJCQlpLE5vaXNlQ250OwotCVVTSE9SVAkJCQkJCVRvdGFsUlBJQ250LCBUb3RhbFJQSVN1bTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vaXNlSGlzdFJlcG9ydEFjdGlvbiAtLS0tLT5cbiIpKTsKLQotCS8vIDAuIERpc2FibGUgUnggd2l0aCBwcm9taXNjdW91cyByZWNlcHRpb24sIG1ha2UgaXQgYmFjayB0byBub3JtYWwKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7IC8vIFN0YWlvbiBub3QgZHJvcCBjb250cm9sIGZyYW1lIHdpbGwgZmFpbCBXaUZpIENlcnRpZmljYXRpb24uCi0JLy8gMS4gU2V0dXAgcG9pbnRlciBmb3IgcHJvY2Vzc2luZyBiZWFjb24gJiBwcm9iZSByZXNwb25zZQotCXBEZXN0ID0gKFBVQ0hBUikgJnBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmW3BBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuXTsKLQlwUmVwb3J0ID0gKFBNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCkgcERlc3Q7Ci0KLQkvLyAyLiBGaWxsIE1lYXN1cmVtZW50IHJlcG9ydCBlbGVtZW50IGZpZWxkLgotCXBSZXBvcnQtPkVpZCAgICA9IElFX01FQVNVUkVNRU5UX1JFUE9SVDsKLQkvLyBGaXhlZCBMZW5ndGggYXQgMTYsIG5vdCBpbmNsdWRlIEVpZCBhbmQgbGVuZ3RoIGZpZWxkcwotCXBSZXBvcnQtPkxlbmd0aCA9IDE2OwotCXBSZXBvcnQtPlRva2VuICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uUmVxRWxlbS5Ub2tlbjsKLQlwUmVwb3J0LT5Nb2RlICAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLlJlcUVsZW0uTW9kZTsKLQlwUmVwb3J0LT5UeXBlICAgPSBNU1JOX1RZUEVfTk9JU0VfSElTVF9SRVE7Ci0KLQkvLyAzLiBGaWxsIG5vaXNlIGhpc3RvZ3JhbSByZXBvcnQgbWVhc3VyZW1lbnQgZGF0YQotCXBEZXN0ICs9IHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCk7Ci0JcE5vaXNlICA9IChQTk9JU0VfSElTVF9SRVBPUlQpIHBEZXN0OwotCXBOb2lzZS0+Q2hhbm5lbCAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLk1lYXN1cmVtZW50LkNoYW5uZWw7Ci0JcE5vaXNlLT5TcGFyZSAgICA9IDA7Ci0JcE5vaXNlLT5EdXJhdGlvbiA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uTWVhc3VyZW1lbnQuRHVyYXRpb247Ci0JLy8gNC4gRmlsbCBOb2lzZSBoaXN0b2dyYW0sIHRoZSB0b3RhbCBSUEkgY291bnRzIHNob3VsZCBiZSAwLjQgKiBUVQotCS8vICAgIFdlIGVzdGltYXRlIDQwMDAgbm9ybWFsIHBhY2tldHMgcmVjZWl2ZWQgZHVybmluZyAxMCBzZWNvbmRzIHRlc3QuCi0JLy8gICAgQWRqdXN0IGl0IGlmIHJlcXVpcmVkLgotCS8vIDMgaXMgYSBnb29kIHZhbHVlIGZvciBwQWQtPlN0YUNmZy5OSEZhY3RvcgotCS8vIFRvdGFsUlBJQ250ID0gcE5vaXNlLT5EdXJhdGlvbiAqIDMgLyAxMDsKLQlUb3RhbFJQSUNudCA9IHBOb2lzZS0+RHVyYXRpb24gKiBwQWQtPlN0YUNmZy5OSEZhY3RvciAvIDEwOwotCVRvdGFsUlBJU3VtID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JewotCQlUb3RhbFJQSVN1bSArPSBwQWQtPlN0YUNmZy5SUElEZW5zaXR5W2ldOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSUEkgJWQgQ29udXRzICVkXG4iLCBpLCBwQWQtPlN0YUNmZy5SUElEZW5zaXR5W2ldKSk7Ci0JfQotCi0JLy8gRG91YmxlIGNoZWNrIGlmIHRoZSBjb3VudGVyIGlzIGxhcmdlciB0aGFuIG91ciBleHBlY3RhdGlvbi4KLQkvLyBXZSB3aWxsIHJlcGxhY2UgaXQgd2l0aCB0aGUgdG90YWwgbnVtYmVyIHBsdXMgYSBmcmFjdGlvbi4KLQlpZiAoVG90YWxSUElTdW0gPiBUb3RhbFJQSUNudCkKLQkJVG90YWxSUElDbnQgPSBUb3RhbFJQSVN1bSArIHBOb2lzZS0+RHVyYXRpb24gLyAyMDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRvdGFsIFJQSSBDb251dHMgJWRcbiIsIFRvdGFsUlBJQ250KSk7Ci0KLQkvLyA1LiBJbml0aWFsaXplIG5vaXNlIGNvdW50IGZvciB0aGUgdG90YWwgc3VtbWF0aW9uIG9mIDB4ZmYKLQlOb2lzZUNudCA9IDA7Ci0JZm9yIChpID0gMTsgaSA8IDg7IGkrKykKLQl7Ci0JCXBOb2lzZS0+RGVuc2l0eVtpXSA9IChVQ0hBUikgKHBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0gKiAyNTUgLyBUb3RhbFJQSUNudCk7Ci0JCWlmICgocE5vaXNlLT5EZW5zaXR5W2ldID09IDApICYmIChwQWQtPlN0YUNmZy5SUElEZW5zaXR5W2ldICE9IDApKQotCQkJcE5vaXNlLT5EZW5zaXR5W2ldKys7Ci0JCU5vaXNlQ250ICs9IHBOb2lzZS0+RGVuc2l0eVtpXTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVwb3J0ZWQgUlBJWyVkXSAgPSAweCUwMnhcbiIsIGksIHBOb2lzZS0+RGVuc2l0eVtpXSkpOwotCX0KLQotCS8vIDYuIFJQSVswXSByZXByZXNlbnRzIHRoZSByZXN0IG9mIGNvdW50cwotCXBOb2lzZS0+RGVuc2l0eVswXSA9IDB4ZmYgLSBOb2lzZUNudDsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZXBvcnRlZCBSUElbMF0gID0gMHglMDJ4XG4iLCBwTm9pc2UtPkRlbnNpdHlbMF0pKTsKLQotCXBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuICs9IChzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpICsgc2l6ZW9mKE5PSVNFX0hJU1RfUkVQT1JUKSk7Ci0KLQkvLyA3LiBDbGVhciBjaGFubmVsIGxvYWQgbWVhc3VyZW1lbnQgZmxhZwotCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQpOwotCi0JLy8gOC4gcmVzZXQgdG8gaWRsZSBzdGF0ZQotCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX0lETEU7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOb2lzZUhpc3RSZXBvcnRBY3Rpb24gPC0tLS0tXG4iKSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlQcmVwYXJlIEJlYWNvbiByZXBvcnQgYWN0aW9uLAotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlCZWFjb25SZXBvcnRBY3Rpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlJbmRleCkKLXsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCZWFjb25SZXBvcnRBY3Rpb24gLS0tLS0+XG4iKSk7Ci0KLQkvLyBMb29rcyBsaWtlIHdlIGRvbid0IGhhdmUgYW55dGhpbmcgdGhpbmcgbmVlZCB0byBkbyBoZXJlLgotCS8vIEFsbCBtZWFzdXJlbWVudCByZXBvcnQgYWxyZWFkeSBmaW5pc2hlZCBpbiBBZGRCZWFjb25SZXBvcnQKLQkvLyBUaGUgbGVuZ3RoIGlzIGluIHRoZSBGcmFtZVJlcG9ydExlbgotCi0JLy8gcmVzZXQgQmVhY29uIGluZGV4IGZvciBuZXh0IGJlYWNvbiByZXF1ZXN0Ci0JcEFkLT5TdGFDZmcuTGFzdEJzc0luZGV4ID0gMHhmZjsKLQotCS8vIHJlc2V0IHRvIGlkbGUgc3RhdGUKLQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9JRExFOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmVhY29uUmVwb3J0QWN0aW9uIDwtLS0tLVxuIikpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQotCUFyZ3VtZW50czoKLQkJSW5kZXgJCUN1cnJlbnQgQlNTSUQgaW4gQ0NYQnNzdGFiIGVudHJ5IGluZGV4Ci0KLQlSZXR1cm4gVmFsdWU6Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlBaXJvbmV0QWRkQmVhY29uUmVwb3J0KAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglVTE9ORwkJCQlJbmRleCwKLQlJTglQTUxNRV9RVUVVRV9FTEVNCXBFbGVtKQotewotCVBWT0lECQkJCQkJcE1zZzsKLQlQVUNIQVIJCQkJCQlwU3JjLCBwRGVzdDsKLQlVQ0hBUgkJCQkJCVJlcUlkeDsKLQlVTE9ORwkJCQkJCU1zZ0xlbjsKLQlVU0hPUlQJCQkJCQlMZW5ndGg7Ci0JUEZSQU1FXzgwMl8xMQkJCQlwRnJhbWU7Ci0JUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UCXBSZXBvcnQ7Ci0JUEVJRF9TVFJVQ1QJCQkgICAgICAgIHBFaWQ7Ci0JUEJFQUNPTl9SRVBPUlQJCQkJcEJlYWNvblJlcG9ydDsKLQlQQlNTX0VOVFJZCQkJCQlwQnNzOwotCi0JLy8gMC4gU2V0dXAgcG9pbnRlciBmb3IgcHJvY2Vzc2luZyBiZWFjb24gJiBwcm9iZSByZXNwb25zZQotCXBNc2cgICA9IHBFbGVtLT5Nc2c7Ci0JTXNnTGVuID0gcEVsZW0tPk1zZ0xlbjsKLQlwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSkgcE1zZzsKLQlwU3JjICAgPSBwRnJhbWUtPk9jdGV0OwkJCQkvLyBTdGFydCBmcm9tIEFQIFRTRgotCXBCc3MgICA9IChQQlNTX0VOVFJZKSAmcEFkLT5TdGFDZmcuQ0NYQnNzVGFiLkJzc0VudHJ5W0luZGV4XTsKLQlSZXFJZHggPSBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHg7Ci0KLQkvLyAxIENoZWNrIHRoZSBJbmRleCwgaWYgd2UgYWxyZWFkeSBjcmVhdGUgdGhpcyBlbnRyeSwgb25seSB1cGRhdGUgdGhlIGF2ZXJhZ2UgUlNTSQotCWlmICgoSW5kZXggPD0gcEFkLT5TdGFDZmcuTGFzdEJzc0luZGV4KSAmJiAocEFkLT5TdGFDZmcuTGFzdEJzc0luZGV4ICE9IDB4ZmYpKQotCXsKLQkJcERlc3QgID0gKFBVQ0hBUikgJnBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmW3BBZC0+U3RhQ2ZnLkJzc1JlcG9ydE9mZnNldFtJbmRleF1dOwotCQkvLyBQb2ludCB0byBic3MgcmVwb3J0IGluZm9ybWF0aW9uCi0JCXBEZXN0ICs9IHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCk7Ci0JCXBCZWFjb25SZXBvcnQgPSAoUEJFQUNPTl9SRVBPUlQpIHBEZXN0OwotCi0JCS8vIFVwZGF0ZSBSeCBwb3dlciwgaW4gZEJtCi0JCS8vIEdldCB0aGUgb3JpZ2luYWwgUlNTSSByZWFkYmFjayBmcm9tIEJCUAotCQlwQmVhY29uUmVwb3J0LT5SeFBvd2VyICs9IHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7Ci0JCS8vIEF2ZXJhZ2UgdGhlIFJzc2kgcmVhZGluZwotCQlwQmVhY29uUmVwb3J0LT5SeFBvd2VyICA9IChwQmVhY29uUmVwb3J0LT5SeFBvd2VyICsgcEJzcy0+UnNzaSkgLyAyOwotCQkvLyBHZXQgdG8gZEJtIGZvcm1hdAotCQlwQmVhY29uUmVwb3J0LT5SeFBvd2VyIC09IHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQnNzaWQgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggIiwKLQkJCXBCc3MtPkJzc2lkWzBdLCBwQnNzLT5Cc3NpZFsxXSwgcEJzcy0+QnNzaWRbMl0sCi0JCQlwQnNzLT5Cc3NpZFszXSwgcEJzcy0+QnNzaWRbNF0sIHBCc3MtPkJzc2lkWzVdKSk7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJ4UG93ZXJbJWxkXSBSc3NpICVkLCBBdmcgUnNzaSAlZFxuIiwgSW5kZXgsIChwQnNzLT5Sc3NpIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSksIHBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgLSAyNTYpKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRnJhbWVSZXBvcnRMZW4gPSAlZFxuIiwgcEFkLT5TdGFDZmcuQnNzUmVwb3J0T2Zmc2V0W0luZGV4XSkpOwotCi0JCS8vIFVwZGF0ZSBvdGhlciBpbmZvcm1hdGlvbiBoZXJlCi0KLQkJLy8gRG9uZQotCQlyZXR1cm47Ci0JfQotCi0JLy8gMi4gVXBkYXRlIHJlcG9ydGVkIEluZGV4Ci0JcEFkLT5TdGFDZmcuTGFzdEJzc0luZGV4ID0gSW5kZXg7Ci0KLQkvLyAzLiBTZXR1cCB0aGUgYnVmZmVyIGFkZHJlc3MgZm9yIGNvcHlpbmcgdGhpcyBCU1NJRCBpbnRvIHJlcG9ydGluZyBmcmFtZQotCS8vICAgIFRoZSBvZmZzZXQgc2hvdWxkIHN0YXJ0IGFmdGVyIDgwMi4xMSBoZWFkZXIgYW5kIHJlcG9ydCBmcmFtZSBoZWFkZXIuCi0JcERlc3QgPSAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWZbcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW5dOwotCi0JLy8gNC4gU2F2ZSB0aGUgc3RhcnQgb2Zmc2V0IG9mIGVhY2ggQnNzIGluIHJlcG9ydCBmcmFtZQotCXBBZC0+U3RhQ2ZnLkJzc1JlcG9ydE9mZnNldFtJbmRleF0gPSBwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbjsKLQotCS8vIDUuIEZpbGwgTWVhc3VyZW1lbnQgcmVwb3J0IGZpZWxkcwotCXBSZXBvcnQgPSAoUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSBwRGVzdDsKLQlwUmVwb3J0LT5FaWQgPSBJRV9NRUFTVVJFTUVOVF9SRVBPUlQ7Ci0JcFJlcG9ydC0+TGVuZ3RoID0gMDsKLQlwUmVwb3J0LT5Ub2tlbiAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbUmVxSWR4XS5SZXFFbGVtLlRva2VuOwotCXBSZXBvcnQtPk1vZGUgICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtSZXFJZHhdLlJlcUVsZW0uTW9kZTsKLQlwUmVwb3J0LT5UeXBlICAgPSBNU1JOX1RZUEVfQkVBQ09OX1JFUTsKLQlMZW5ndGggICAgICAgICAgPSBzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpOwotCXBEZXN0ICAgICAgICAgICs9IHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCk7Ci0KLQkvLyA2LiBTdGFydCB0aGViZWFjb24gcmVwb3J0IGZvcm1hdAotCXBCZWFjb25SZXBvcnQgPSAoUEJFQUNPTl9SRVBPUlQpIHBEZXN0OwotCXBEZXN0ICAgICAgICArPSBzaXplb2YoQkVBQ09OX1JFUE9SVCk7Ci0JTGVuZ3RoICAgICAgICs9IHNpemVvZihCRUFDT05fUkVQT1JUKTsKLQotCS8vIDcuIENvcHkgQ2hhbm5lbCBudW1iZXIKLQlwQmVhY29uUmVwb3J0LT5DaGFubmVsICAgICAgICA9IHBCc3MtPkNoYW5uZWw7Ci0JcEJlYWNvblJlcG9ydC0+U3BhcmUgICAgICAgICAgPSAwOwotCXBCZWFjb25SZXBvcnQtPkR1cmF0aW9uICAgICAgID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W1JlcUlkeF0uTWVhc3VyZW1lbnQuRHVyYXRpb247Ci0JcEJlYWNvblJlcG9ydC0+UGh5VHlwZSAgICAgICAgPSAoKHBCc3MtPlN1cFJhdGVMZW4rcEJzcy0+RXh0UmF0ZUxlbiA+IDQpID8gUEhZX0VSUCA6IFBIWV9EU1MpOwotCS8vIDguIFJ4IHBvd2VyLCBpbiBkQm0KLQlwQmVhY29uUmVwb3J0LT5SeFBvd2VyICAgICAgICA9IHBCc3MtPlJzc2kgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQnNzaWQgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggIiwKLQkJcEJzcy0+QnNzaWRbMF0sIHBCc3MtPkJzc2lkWzFdLCBwQnNzLT5Cc3NpZFsyXSwKLQkJcEJzcy0+QnNzaWRbM10sIHBCc3MtPkJzc2lkWzRdLCBwQnNzLT5Cc3NpZFs1XSkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJ4UG93ZXJbJWxkXSwgUnNzaSAlZFxuIiwgSW5kZXgsIHBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgLSAyNTYpKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGcmFtZVJlcG9ydExlbiA9ICVkXG4iLCBwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbikpOwotCi0JcEJlYWNvblJlcG9ydC0+QmVhY29uSW50ZXJ2YWwgPSBwQnNzLT5CZWFjb25QZXJpb2Q7Ci0JQ09QWV9NQUNfQUREUihwQmVhY29uUmVwb3J0LT5CU1NJRCwgcEZyYW1lLT5IZHIuQWRkcjMpOwotCU5kaXNNb3ZlTWVtb3J5KHBCZWFjb25SZXBvcnQtPlBhcmVudFRTRiwgcFNyYywgNCk7Ci0JTmRpc01vdmVNZW1vcnkocEJlYWNvblJlcG9ydC0+VGFyZ2V0VFNGLCAmcEVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOwotCU5kaXNNb3ZlTWVtb3J5KCZwQmVhY29uUmVwb3J0LT5UYXJnZXRUU0ZbNF0sICZwRWxlbS0+VGltZVN0YW1wLnUuSGlnaFBhcnQsIDQpOwotCi0JLy8gOS4gU2tpcCB0aGUgYmVhY29uIGZyYW1lIGFuZCBvZmZzZXQgdG8gc3RhcnQgb2YgY2FwYWJpbGl0eWluZm8gc2luY2Ugd2UgYWxyZWFkeSBwcm9jZXNzZWQgY2FwYWJpbGl0eWluZm8KLQlwU3JjICs9IChUSU1FU1RBTVBfTEVOICsgMik7Ci0JcEJlYWNvblJlcG9ydC0+Q2FwYWJpbGl0eUluZm8gPSAqKFVTSE9SVCAqKXBTcmM7Ci0KLQkvLyAxMC4gUG9pbnQgdG8gc3RhcnQgb2YgZWxlbWVudCBJRAotCXBTcmMgKz0gMjsKLQlwRWlkID0gKFBFSURfU1RSVUNUKSBwU3JjOwotCi0JLy8gMTEuIFN0YXJ0IHByb2Nlc3MgYWxsIHZhcmlhYmxlIEVpZCBvYXlsb2FkIGFuZCBhZGQgdGhlIGFwcHJvcHJpYXRlIHRvIHRoZSBmcmFtZSByZXBvcnQKLQl3aGlsZSAoKChQVUNIQVIpIHBFaWQgKyBwRWlkLT5MZW4gKyAxKSA8ICgoUFVDSEFSKSBwRnJhbWUgKyBNc2dMZW4pKQotCXsKLQkJLy8gT25seSBsaW1pdGVkIEVJRCBhcmUgcmVxdWlyZWQgdG8gcmVwb3J0IGZvciBDQ1ggMi4gSXQgaW5jbHVkZXMgU1NJRCwgU3VwcG9ydGVkIHJhdGUsCi0JCS8vIEZIIHBhcmFtZW50ZXIgc2V0LCBEUyBwYXJhbWV0ZXIgc2V0LCBDRiBwYXJhbWV0ZXIgc2V0LCBJQlNTIHBhcmFtZXRlciBzZXQsCi0JCS8vIFRJTSAocmVwb3J0IGZpcnN0IDQgYnl0ZXMgb25seSwgcmFkaW8gbWVhc3VyZW1lbnQgY2FwYWJpbGl0eQotCQlzd2l0Y2ggKHBFaWQtPkVpZCkKLQkJewotCQkJY2FzZSBJRV9TU0lEOgotCQkJY2FzZSBJRV9TVVBQX1JBVEVTOgotCQkJY2FzZSBJRV9GSF9QQVJNOgotCQkJY2FzZSBJRV9EU19QQVJNOgotCQkJY2FzZSBJRV9DRl9QQVJNOgotCQkJY2FzZSBJRV9JQlNTX1BBUk06Ci0JCQkJTmRpc01vdmVNZW1vcnkocERlc3QsIHBFaWQsIHBFaWQtPkxlbiArIDIpOwotCQkJCXBEZXN0ICArPSAocEVpZC0+TGVuICsgMik7Ci0JCQkJTGVuZ3RoICs9IChwRWlkLT5MZW4gKyAyKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBJRV9NRUFTVVJFTUVOVF9DQVBBQklMSVRZOgotCQkJCS8vIFNpbmNlIHRoaXMgSUUgaXMgZHVwbGljYXRlZCB3aXRoIFdQQSBzZWN1cml0eSBJRSwgd2UgaGFzIHRvIGRvIHNhbml0eSBjaGVjayBiZWZvcmUKLQkJCQkvLyByZWNvZ25pemUgaXQuCi0JCQkJLy8gMS4gSXQgYWxzbyBoYXMgZml4ZWQgNiBieXRlcyBJRSBsZW5ndGguCi0JCQkJaWYgKHBFaWQtPkxlbiAhPSA2KQotCQkJCQlicmVhazsKLQkJCQkvLyAyLiBDaGVjayB0aGUgQ2lzY28gQWlyb25ldCBPVUkKLQkJCQlpZiAoTmRpc0VxdWFsTWVtb3J5KENJU0NPX09VSSwgKHBTcmMgKyAyKSwgMykpCi0JCQkJewotCQkJCQkvLyBNYXRjaGVkLCB0aGlzIGlzIHdoYXQgd2Ugd2FudAotCQkJCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgcEVpZCwgcEVpZC0+TGVuICsgMik7Ci0JCQkJCXBEZXN0ICArPSAocEVpZC0+TGVuICsgMik7Ci0JCQkJCUxlbmd0aCArPSAocEVpZC0+TGVuICsgMik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQljYXNlIElFX1RJTToKLQkJCQlpZiAocEVpZC0+TGVuID4gNCkKLQkJCQl7Ci0JCQkJCS8vIE1heSB0cnVuY2F0ZSBhbmQgcmVwb3J0IHRoZSBmaXJzdCA0IGJ5dGVzIG9ubHksIHdpdGggdGhlIGVpZCAmIGxlbiwgdG90YWwgc2hvdWxkIGJlIDYKLQkJCQkJTmRpc01vdmVNZW1vcnkocERlc3QsIHBFaWQsIDYpOwotCQkJCQlwRGVzdCAgKz0gNjsKLQkJCQkJTGVuZ3RoICs9IDY7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwRWlkLCBwRWlkLT5MZW4gKyAyKTsKLQkJCQkJcERlc3QgICs9IChwRWlkLT5MZW4gKyAyKTsKLQkJCQkJTGVuZ3RoICs9IChwRWlkLT5MZW4gKyAyKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJLy8gMTIuIE1vdmUgdG8gbmV4dCBlbGVtZW50IElECi0JCXBTcmMgKz0gKDIgKyBwRWlkLT5MZW4pOwotCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwU3JjOwotCX0KLQotCS8vIDEzLiBVcGRhdGUgdGhlIGxlbmd0aCBpbiB0aGUgaGVhZGVyLCBub3QgaW5jbHVkZSBFSUQgYW5kIGxlbmd0aAotCXBSZXBvcnQtPkxlbmd0aCA9IExlbmd0aCAtIDQ7Ci0KLQkvLyAxNC4gVXBkYXRlIHRoZSBmcmFtZSByZXBvcnQgYnVmZmVyIGRhdGEgbGVuZ3RoCi0JcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4gKz0gTGVuZ3RoOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZSIGxlbiA9ICVkXG4iLCBwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbikpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQotCUFyZ3VtZW50czoKLQkJSW5kZXgJCUN1cnJlbnQgQlNTSUQgaW4gQ0NYQnNzdGFiIGVudHJ5IGluZGV4Ci0KLQlSZXR1cm4gVmFsdWU6Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlBaXJvbmV0Q3JlYXRlQmVhY29uUmVwb3J0RnJvbUJzc1RhYmxlKAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCkKLXsKLQlQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQJcFJlcG9ydDsKLQlQQkVBQ09OX1JFUE9SVAkJCQlwQmVhY29uUmVwb3J0OwotCVVDSEFSCQkJCQkJSW5kZXgsIFJlcUlkeDsKLQlVU0hPUlQJCQkJCQlMZW5ndGg7Ci0JUFVDSEFSCQkJCQkJcERlc3Q7Ci0JUEJTU19FTlRSWQkJCQkJcEJzczsKLQotCS8vIDAuIHNldHVwIGJhc2UgcG9pbnRlcgotCVJlcUlkeCA9IHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeDsKLQotCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IHBBZC0+U3RhQ2ZnLkNDWEJzc1RhYi5Cc3NOcjsgSW5kZXgrKykKLQl7Ci0JCS8vIDEuIFNldHVwIHRoZSBidWZmZXIgYWRkcmVzcyBmb3IgY29weWluZyB0aGlzIEJTU0lEIGludG8gcmVwb3J0aW5nIGZyYW1lCi0JCS8vICAgIFRoZSBvZmZzZXQgc2hvdWxkIHN0YXJ0IGFmdGVyIDgwMi4xMSBoZWFkZXIgYW5kIHJlcG9ydCBmcmFtZSBoZWFkZXIuCi0JCXBEZXN0ICA9IChQVUNIQVIpICZwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydEJ1ZltwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbl07Ci0JCXBCc3MgICA9IChQQlNTX0VOVFJZKSAmcEFkLT5TdGFDZmcuQ0NYQnNzVGFiLkJzc0VudHJ5W0luZGV4XTsKLQkJTGVuZ3RoID0gMDsKLQotCQkvLyAyLiBGaWxsIE1lYXN1cmVtZW50IHJlcG9ydCBmaWVsZHMKLQkJcFJlcG9ydCAgICAgICAgID0gKFBNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCkgcERlc3Q7Ci0JCXBSZXBvcnQtPkVpZCAgICA9IElFX01FQVNVUkVNRU5UX1JFUE9SVDsKLQkJcFJlcG9ydC0+TGVuZ3RoID0gMDsKLQkJcFJlcG9ydC0+VG9rZW4gID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W1JlcUlkeF0uUmVxRWxlbS5Ub2tlbjsKLQkJcFJlcG9ydC0+TW9kZSAgID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W1JlcUlkeF0uUmVxRWxlbS5Nb2RlOwotCQlwUmVwb3J0LT5UeXBlICAgPSBNU1JOX1RZUEVfQkVBQ09OX1JFUTsKLQkJTGVuZ3RoICAgICAgICAgID0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKLQkJcERlc3QgICAgICAgICAgKz0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKLQotCQkvLyAzLiBTdGFydCB0aGUgYmVhY29uIHJlcG9ydCBmb3JtYXQKLQkJcEJlYWNvblJlcG9ydCA9IChQQkVBQ09OX1JFUE9SVCkgcERlc3Q7Ci0JCXBEZXN0ICAgICAgICArPSBzaXplb2YoQkVBQ09OX1JFUE9SVCk7Ci0JCUxlbmd0aCAgICAgICArPSBzaXplb2YoQkVBQ09OX1JFUE9SVCk7Ci0KLQkJLy8gNC4gQ29weSBDaGFubmVsIG51bWJlcgotCQlwQmVhY29uUmVwb3J0LT5DaGFubmVsICAgICAgICA9IHBCc3MtPkNoYW5uZWw7Ci0JCXBCZWFjb25SZXBvcnQtPlNwYXJlICAgICAgICAgID0gMDsKLQkJcEJlYWNvblJlcG9ydC0+RHVyYXRpb24gICAgICAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbUmVxSWR4XS5NZWFzdXJlbWVudC5EdXJhdGlvbjsKLQkJcEJlYWNvblJlcG9ydC0+UGh5VHlwZSAgICAgICAgPSAoKHBCc3MtPlN1cFJhdGVMZW4rcEJzcy0+RXh0UmF0ZUxlbiA+IDQpID8gUEhZX0VSUCA6IFBIWV9EU1MpOwotCQlwQmVhY29uUmVwb3J0LT5SeFBvd2VyICAgICAgICA9IHBCc3MtPlJzc2kgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhOwotCQlwQmVhY29uUmVwb3J0LT5CZWFjb25JbnRlcnZhbCA9IHBCc3MtPkJlYWNvblBlcmlvZDsKLQkJcEJlYWNvblJlcG9ydC0+Q2FwYWJpbGl0eUluZm8gPSBwQnNzLT5DYXBhYmlsaXR5SW5mbzsKLQkJQ09QWV9NQUNfQUREUihwQmVhY29uUmVwb3J0LT5CU1NJRCwgcEJzcy0+QnNzaWQpOwotCQlOZGlzTW92ZU1lbW9yeShwQmVhY29uUmVwb3J0LT5QYXJlbnRUU0YsIHBCc3MtPlBUU0YsIDQpOwotCQlOZGlzTW92ZU1lbW9yeShwQmVhY29uUmVwb3J0LT5UYXJnZXRUU0YsIHBCc3MtPlRUU0YsIDgpOwotCi0JCS8vIDUuIENyZWF0ZSBTU0lECi0JCSpwRGVzdCsrID0gMHgwMDsKLQkJKnBEZXN0KysgPSBwQnNzLT5Tc2lkTGVuOwotCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgcEJzcy0+U3NpZCwgcEJzcy0+U3NpZExlbik7Ci0JCXBEZXN0ICArPSBwQnNzLT5Tc2lkTGVuOwotCQlMZW5ndGggKz0gKDIgKyBwQnNzLT5Tc2lkTGVuKTsKLQotCQkvLyA2LiBDcmVhdGUgU3VwcG9ydFJhdGVzCi0JCSpwRGVzdCsrID0gMHgwMTsKLQkJKnBEZXN0KysgPSBwQnNzLT5TdXBSYXRlTGVuOwotCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgcEJzcy0+U3VwUmF0ZSwgcEJzcy0+U3VwUmF0ZUxlbik7Ci0JCXBEZXN0ICArPSBwQnNzLT5TdXBSYXRlTGVuOwotCQlMZW5ndGggKz0gKDIgKyBwQnNzLT5TdXBSYXRlTGVuKTsKLQotCQkvLyA3LiBEUyBQYXJhbWV0ZXIKLQkJKnBEZXN0KysgPSAweDAzOwotCQkqcERlc3QrKyA9IDE7Ci0JCSpwRGVzdCsrID0gcEJzcy0+Q2hhbm5lbDsKLQkJTGVuZ3RoICArPSAzOwotCi0JCS8vIDguIElCU1MgcGFyYW1ldGVyIGlmIHByZXNlbnRzCi0JCWlmIChwQnNzLT5Cc3NUeXBlID09IEJTU19BREhPQykKLQkJewotCQkJKnBEZXN0KysgPSAweDA2OwotCQkJKnBEZXN0KysgPSAyOwotCQkJKihQVVNIT1JUKSBwRGVzdCA9IHBCc3MtPkF0aW1XaW47Ci0JCQlwRGVzdCAgICs9IDI7Ci0JCQlMZW5ndGggICs9IDQ7Ci0JCX0KLQotCQkvLyA5LiBVcGRhdGUgbGVuZ3RoIGZpZWxkLCBub3QgaW5jbHVkZSBFSUQgYW5kIGxlbmd0aAotCQlwUmVwb3J0LT5MZW5ndGggPSBMZW5ndGggLSA0OwotCi0JCS8vIDEwLiBVcGRhdGUgdG90YWwgZnJhbWUgc2l6ZQotCQlwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiArPSBMZW5ndGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXNzb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Fzc29jLmMKaW5kZXggMWE1ODcxNS4uNzA1NWYyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXNzb2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hc3NvYy5jCkBAIC0zNiwzMSArMzYsMzEgQEAKICovCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCiAKLVVDSEFSCUNpcGhlcldwYVRlbXBsYXRlW10gPSB7Ci0JCTB4ZGQsIAkJCQkJLy8gV1BBIElFCi0JCTB4MTYsCQkJCQkvLyBMZW5ndGgKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCi0JCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gTXVsdGljYXN0Ci0JCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0Ci0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIHVuaWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAotCQkweDAwLCAweDUwLCAweGYyLCAweDAxCS8vIGF1dGhlbnRpY2F0aW9uCi0JCX07Cit1OCBDaXBoZXJXcGFUZW1wbGF0ZVtdID0geworCTB4ZGQsCQkJLyogV1BBIElFICovCisJMHgxNiwJCQkvKiBMZW5ndGggKi8KKwkweDAwLCAweDUwLCAweGYyLCAweDAxLAkvKiBvdWkgKi8KKwkweDAxLCAweDAwLAkJLyogVmVyc2lvbiAqLworCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8qIE11bHRpY2FzdCAqLworCTB4MDEsIDB4MDAsCQkvKiBOdW1iZXIgb2YgdW5pY2FzdCAqLworCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8qIHVuaWNhc3QgKi8KKwkweDAxLCAweDAwLAkJLyogbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCAqLworCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEJLyogYXV0aGVudGljYXRpb24gKi8KK307CiAKLVVDSEFSCUNpcGhlcldwYTJUZW1wbGF0ZVtdID0gewotCQkweDMwLAkJCQkJLy8gUlNOIElFCi0JCTB4MTQsCQkJCQkvLyBMZW5ndGgKLQkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgotCQkweDAwLCAweDBmLCAweGFjLCAweDAyLAkvLyBncm91cCBjaXBoZXIsIFRLSVAKLQkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIHBhaXJ3aXNlCi0JCTB4MDAsIDB4MGYsIDB4YWMsIDB4MDIsCS8vIHVuaWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAotCQkweDAwLCAweDBmLCAweGFjLCAweDAyLAkvLyBhdXRoZW50aWNhdGlvbgotCQkweDAwLCAweDAwLAkJCQkvLyBSU04gY2FwYWJpbGl0eQotCQl9OwordTggQ2lwaGVyV3BhMlRlbXBsYXRlW10gPSB7CisJMHgzMCwJCQkvKiBSU04gSUUgKi8KKwkweDE0LAkJCS8qIExlbmd0aCAqLworCTB4MDEsIDB4MDAsCQkvKiBWZXJzaW9uICovCisJMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwJLyogZ3JvdXAgY2lwaGVyLCBUS0lQICovCisJMHgwMSwgMHgwMCwJCS8qIG51bWJlciBvZiBwYWlyd2lzZSAqLworCTB4MDAsIDB4MGYsIDB4YWMsIDB4MDIsCS8qIHVuaWNhc3QgKi8KKwkweDAxLCAweDAwLAkJLyogbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCAqLworCTB4MDAsIDB4MGYsIDB4YWMsIDB4MDIsCS8qIGF1dGhlbnRpY2F0aW9uICovCisJMHgwMCwgMHgwMCwJCS8qIFJTTiBjYXBhYmlsaXR5ICovCit9OwogCi1VQ0hBUglDY3gySWVJbmZvW10gPSB7IDB4MDAsIDB4NDAsIDB4OTYsIDB4MDMsIDB4MDJ9OwordTggQ2N4MkllSW5mb1tdID0geyAweDAwLCAweDQwLCAweDk2LCAweDAzLCAweDAyIH07CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTczLDU1ICs3Myw4NCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBBc3NvY1N0YXRlTWFjaGluZUluaXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gIFNUQVRFX01BQ0hJTkUgKlMsCi0JT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQordm9pZCBBc3NvY1N0YXRlTWFjaGluZUluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgKlMsIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKIHsKLQlTdGF0ZU1hY2hpbmVJbml0KFMsIFRyYW5zLCBNQVhfQVNTT0NfU1RBVEUsIE1BWF9BU1NPQ19NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgQVNTT0NfSURMRSwgQVNTT0NfTUFDSElORV9CQVNFKTsKKwlTdGF0ZU1hY2hpbmVJbml0KFMsIFRyYW5zLCBNQVhfQVNTT0NfU1RBVEUsIE1BWF9BU1NPQ19NU0csCisJCQkgKFNUQVRFX01BQ0hJTkVfRlVOQykgRHJvcCwgQVNTT0NfSURMRSwKKwkJCSBBU1NPQ19NQUNISU5FX0JBU0UpOwogCi0JLy8gZmlyc3QgY29sdW1uCi0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX0lETEUsIE1UMl9NTE1FX0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lQXNzb2NSZXFBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19JRExFLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lUmVhc3NvY1JlcUFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX0lETEUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lRGlzYXNzb2NSZXFBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19JRExFLCBNVDJfUEVFUl9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRpc2Fzc29jQWN0aW9uKTsKKwkvKiBmaXJzdCBjb2x1bW4gKi8KKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX01MTUVfQVNTT0NfUkVRLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgTWxtZUFzc29jUmVxQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX01MTUVfUkVBU1NPQ19SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBNbG1lUmVhc3NvY1JlcUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX0lETEUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIE1sbWVEaXNhc3NvY1JlcUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX0lETEUsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJEaXNhc3NvY0FjdGlvbik7CiAKLQkvLyBzZWNvbmQgY29sdW1uCi0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9BU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkFzc29jKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5SZWFzc29jKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGlzYXNzb2NBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfQVNTT0NfUlNQLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJBc3NvY1JzcEFjdGlvbik7Ci0JLy8KLQkvLyBQYXRjaCAzQ29tIEFQIE1PZGU6M0NSV0U0NTRHNzIKLQkvLyBXZSBzZW5kIEFzc29jIHJlcXVlc3QgZnJhbWUgdG8gdGhpcyBBUCwgaXQgYWx3YXlzIHNlbmQgUmVhc3NvYyBSc3Agbm90IEFzc29jaWF0ZSBSc3AuCi0JLy8KLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX1JFQVNTT0NfUlNQLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJBc3NvY1JzcEFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfQVNTT0NfVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylBc3NvY1RpbWVvdXRBY3Rpb24pOworCS8qIHNlY29uZCBjb2x1bW4gKi8KKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0FTU09DX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIEludmFsaWRTdGF0ZVdoZW5Bc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIEludmFsaWRTdGF0ZVdoZW5SZWFzc29jKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpCisJCQkgICAgICBJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJEaXNhc3NvY0FjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9BU1NPQ19SU1AsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBQZWVyQXNzb2NSc3BBY3Rpb24pOworCS8qICovCisJLyogUGF0Y2ggM0NvbSBBUCBNT2RlOjNDUldFNDU0RzcyICovCisJLyogV2Ugc2VuZCBBc3NvYyByZXF1ZXN0IGZyYW1lIHRvIHRoaXMgQVAsIGl0IGFsd2F5cyBzZW5kIFJlYXNzb2MgUnNwIG5vdCBBc3NvY2lhdGUgUnNwLiAqLworCS8qICovCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9SRUFTU09DX1JTUCwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJBc3NvY1JzcEFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfQVNTT0NfVElNRU9VVCwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIEFzc29jVGltZW91dEFjdGlvbik7CiAKLQkvLyB0aGlyZCBjb2x1bW4KLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5Bc3NvYyk7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5SZWFzc29jKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5EaXNhc3NvY2lhdGUpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRpc2Fzc29jQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfUkVBU1NPQ19SU1AsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclJlYXNzb2NSc3BBY3Rpb24pOwotCS8vCi0JLy8gUGF0Y2gsIEFQIGRvZXNuJ3Qgc2VuZCBSZWFzc29jaWF0ZSBSc3AgZnJhbWUgdG8gU3RhdGlvbi4KLQkvLwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9BU1NPQ19SU1AsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclJlYXNzb2NSc3BBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfUkVBU1NPQ19USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKVJlYXNzb2NUaW1lb3V0QWN0aW9uKTsKKwkvKiB0aGlyZCBjb2x1bW4gKi8KKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfQVNTT0NfUkVRLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgSW52YWxpZFN0YXRlV2hlbkFzc29jKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfUkVBU1NPQ19SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpCisJCQkgICAgICBJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfRElTQVNTT0NfUkVRLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgUGVlckRpc2Fzc29jQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfUkVBU1NPQ19SU1AsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBQZWVyUmVhc3NvY1JzcEFjdGlvbik7CisJLyogKi8KKwkvKiBQYXRjaCwgQVAgZG9lc24ndCBzZW5kIFJlYXNzb2NpYXRlIFJzcCBmcmFtZSB0byBTdGF0aW9uLiAqLworCS8qICovCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0FTU09DX1JTUCwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJSZWFzc29jUnNwQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX1JFQVNTT0NfVElNRU9VVCwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFJlYXNzb2NUaW1lb3V0QWN0aW9uKTsKIAotCS8vIGZvdXJ0aCBjb2x1bW4KLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuQXNzb2MpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBESVNBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfUkVBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlblJlYXNzb2MpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBESVNBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5EaXNhc3NvY2lhdGUpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBESVNBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEaXNhc3NvY0FjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfRElTQVNTT0NfVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylEaXNhc3NvY1RpbWVvdXRBY3Rpb24pOworCS8qIGZvdXJ0aCBjb2x1bW4gKi8KKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0FTU09DX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIEludmFsaWRTdGF0ZVdoZW5Bc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIEludmFsaWRTdGF0ZVdoZW5SZWFzc29jKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpCisJCQkgICAgICBJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJEaXNhc3NvY0FjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfRElTQVNTT0NfVElNRU9VVCwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIERpc2Fzc29jVGltZW91dEFjdGlvbik7CiAKLQkvLyBpbml0aWFsaXplIHRoZSB0aW1lcgotCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihBc3NvY1RpbWVvdXQpLCBwQWQsIEZBTFNFKTsKLQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihSZWFzc29jVGltZW91dCksIHBBZCwgRkFMU0UpOwotCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihEaXNhc3NvY1RpbWVvdXQpLCBwQWQsIEZBTFNFKTsKKwkvKiBpbml0aWFsaXplIHRoZSB0aW1lciAqLworCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsCisJCSAgICAgIEdFVF9USU1FUl9GVU5DVElPTihBc3NvY1RpbWVvdXQpLCBwQWQsIEZBTFNFKTsKKwlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsCisJCSAgICAgIEdFVF9USU1FUl9GVU5DVElPTihSZWFzc29jVGltZW91dCksIHBBZCwgRkFMU0UpOworCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsCisJCSAgICAgIEdFVF9USU1FUl9GVU5DVElPTihEaXNhc3NvY1RpbWVvdXQpLCBwQWQsIEZBTFNFKTsKIH0KIAogLyoKQEAgLTEzNiwyMCArMTY1LDIwIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEFzc29jVGltZW91dChJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JCQkJIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQkJCQkgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCQkJCSBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit2b2lkIEFzc29jVGltZW91dCh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCSAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKQogewotCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKUZ1bmN0aW9uQ29udGV4dDsKIAotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJLyogRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuICovCisJLyogVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0ICovCisJaWYgKFJUTVBfVEVTVF9GTEFHCisJICAgIChwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCiAJCXJldHVybjsKIAogCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX1RJTUVPVVQsIDAsIE5VTEwpOwotCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwlSVE1QX01MTUVfSEFORExFUihwQWQpOwogfQogCiAvKgpAQCAtMTY0LDIwICsxOTMsMjAgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgUmVhc3NvY1RpbWVvdXQoSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCQkJCQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JCQkJCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQkJCQkJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQordm9pZCBSZWFzc29jVGltZW91dCh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCSAgICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMykKIHsKLQlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilGdW5jdGlvbkNvbnRleHQ7CiAKLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCS8qIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLiAqLworCS8qIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdCAqLworCWlmIChSVE1QX1RFU1RfRkxBRworCSAgICAocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQogCQlyZXR1cm47CiAKIAlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX1RJTUVPVVQsIDAsIE5VTEwpOwotCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwlSVE1QX01MTUVfSEFORExFUihwQWQpOwogfQogCiAvKgpAQCAtMTkyLDIwICsyMjEsMjAgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgRGlzYXNzb2NUaW1lb3V0KElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQkJCQkJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCQkJCQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JCQkJCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3ZvaWQgRGlzYXNzb2NUaW1lb3V0KHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJICAgICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSAgICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpCiB7Ci0JUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopRnVuY3Rpb25Db250ZXh0OwogCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkvKiBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4gKi8KKwkvKiBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQgKi8KKwlpZiAoUlRNUF9URVNUX0ZMQUcKKwkgICAgKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKIAkJcmV0dXJuOwogCiAJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfRElTQVNTT0NfVElNRU9VVCwgMCwgTlVMTCk7Ci0JUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7CiB9CiAKIC8qCkBAIC0yMzAsMzQ5ICsyNTksMzE1IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIE1sbWVBc3NvY1JlcUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIE1sbWVBc3NvY1JlcUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVUNIQVIJCQlBcEFkZHJbNl07Ci0JSEVBREVSXzgwMl8xMQlBc3NvY0hkcjsKLQlVQ0hBUgkJCUNjeDJMZW4gPSA1OwotCVVDSEFSCQkJV21lSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCAweDA3LCAweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAwLCAweDAxLCAweDAwfTsKLQlVU0hPUlQJCQlMaXN0ZW5JbnR2OwotCVVMT05HCQkJVGltZW91dDsKLQlVU0hPUlQJCQlDYXBhYmlsaXR5SW5mbzsKLQlCT09MRUFOCQkJVGltZXJDYW5jZWxsZWQ7Ci0JUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7Ci0JTkRJU19TVEFUVVMJCU5TdGF0dXM7Ci0JVUxPTkcJCQlGcmFtZUxlbiA9IDA7Ci0JVUxPTkcJCQl0bXA7Ci0JVVNIT1JUCQkJVmFySWVzT2Zmc2V0OwotCVVDSEFSCQkJQ2tpcEZsYWc7Ci0JVUNIQVIJCQlDa2lwTmVnb3RpYXRpb25CdWZmZXJbQ0tJUF9ORUdPVElBVElPTl9MRU5HVEhdOwotCVVDSEFSCQkJQWlyb25ldENraXBJZSA9IElFX0FJUk9ORVRfQ0tJUDsKLQlVQ0hBUgkJCUFpcm9uZXRDa2lwTGVuID0gQ0tJUF9ORUdPVElBVElPTl9MRU5HVEg7Ci0JVUNIQVIJCQlBaXJvbmV0SVBBZGRyZXNzSUUgPSBJRV9BSVJPTkVUX0lQQUREUkVTUzsKLQlVQ0hBUgkJCUFpcm9uZXRJUEFkZHJlc3NMZW4gPSBBSVJPTkVUX0lQQUREUkVTU19MRU5HVEg7Ci0JVUNIQVIJCQlBaXJvbmV0SVBBZGRyZXNzQnVmZmVyW0FJUk9ORVRfSVBBRERSRVNTX0xFTkdUSF0gPSB7MHgwMCwgMHg0MCwgMHg5NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMH07Ci0JVVNIT1JUCQkJU3RhdHVzOworCXU4IEFwQWRkcls2XTsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBBc3NvY0hkcjsKKwl1OCBXbWVJZVs5XSA9CisJICAgIHsgSUVfVkVORE9SX1NQRUNJRklDLCAweDA3LCAweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAwLCAweDAxLAorICAgICAgIDB4MDAgfTsKKwl1MTYgTGlzdGVuSW50djsKKwl1bnNpZ25lZCBsb25nIFRpbWVvdXQ7CisJdTE2IENhcGFiaWxpdHlJbmZvOworCUJPT0xFQU4gVGltZXJDYW5jZWxsZWQ7CisJdTggKnBPdXRCdWZmZXIgPSBOVUxMOworCWludCBOU3RhdHVzOworCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW4gPSAwOworCXVuc2lnbmVkIGxvbmcgdG1wOworCXUxNiBWYXJJZXNPZmZzZXQ7CisJdTE2IFN0YXR1czsKIAotCS8vIEJsb2NrIGFsbCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZAotCWlmIChwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9PSBUUlVFKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBCbG9jayBBc3NvYyByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIpKTsKKwkvKiBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QgKi8KKwlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkFTU09DIC0gQmxvY2sgQXNzb2MgcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QhXG4iKSk7CiAJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKIAkJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKLQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfQ09ORiwgMiwKKwkJCSAgICAmU3RhdHVzKTsKIAl9Ci0JLy8gY2hlY2sgc2FuaXR5IGZpcnN0Ci0JZWxzZSBpZiAoTWxtZUFzc29jUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFwQWRkciwgJkNhcGFiaWxpdHlJbmZvLCAmVGltZW91dCwgJkxpc3RlbkludHYpKQotCXsKKwkvKiBjaGVjayBzYW5pdHkgZmlyc3QgKi8KKwllbHNlIGlmIChNbG1lQXNzb2NSZXFTYW5pdHkKKwkJIChwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBcEFkZHIsICZDYXBhYmlsaXR5SW5mbywKKwkJICAmVGltZW91dCwgJkxpc3RlbkludHYpKSB7CiAJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CiAJCUNPUFlfTUFDX0FERFIocEFkLT5NbG1lQXV4LkJzc2lkLCBBcEFkZHIpOwogCi0JCS8vIEdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCS8qIEdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5ICovCiAJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7Ci0JCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVNTT0MgLSBNbG1lQXNzb2NSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJBU1NPQyAtIE1sbWVBc3NvY1JlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CiAJCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CiAJCQlTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCSAgICBNVDJfQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CiAJCQlyZXR1cm47CiAJCX0KLQotCQkvLyBBZGQgYnkgSmFtZXMgMDMvMDYvMjcKLQkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLkxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTik7Ci0JCS8vIEFzc29jaWF0aW9uIGRvbid0IG5lZWQgdG8gcmVwb3J0IE1BQyBhZGRyZXNzCisJCS8qIEFkZCBieSBKYW1lcyAwMy8wNi8yNyAqLworCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uTGVuZ3RoID0KKwkJICAgIHNpemVvZihzdHJ1Y3QgcnRfbmRpc184MDJfMTFfYXNzb2NpYXRpb25faW5mb3JtYXRpb24pOworCQkvKiBBc3NvY2lhdGlvbiBkb24ndCBuZWVkIHRvIHJlcG9ydCBNQUMgYWRkcmVzcyAqLwogCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uQXZhaWxhYmxlUmVxdWVzdEZpeGVkSUVzID0KLQkJCU5ESVNfODAyXzExX0FJX1JFUUZJX0NBUEFCSUxJVElFUyB8IE5ESVNfODAyXzExX0FJX1JFUUZJX0xJU1RFTklOVEVSVkFMOwotCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uUmVxdWVzdEZpeGVkSUVzLkNhcGFiaWxpdGllcyA9IENhcGFiaWxpdHlJbmZvOwotCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uUmVxdWVzdEZpeGVkSUVzLkxpc3RlbkludGVydmFsID0gTGlzdGVuSW50djsKLQkJLy8gT25seSByZWFzc29jaWF0ZSBuZWVkIHRoaXMKLQkJLy9DT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkFzc29jSW5mby5SZXF1ZXN0Rml4ZWRJRXMuQ3VycmVudEFQQWRkcmVzcywgQXBBZGRyKTsKLQkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLk9mZnNldFJlcXVlc3RJRXMgPSBzaXplb2YoTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04pOworCQkgICAgTkRJU184MDJfMTFfQUlfUkVRRklfQ0FQQUJJTElUSUVTIHwKKwkJICAgIE5ESVNfODAyXzExX0FJX1JFUUZJX0xJU1RFTklOVEVSVkFMOworCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uUmVxdWVzdEZpeGVkSUVzLkNhcGFiaWxpdGllcyA9CisJCSAgICBDYXBhYmlsaXR5SW5mbzsKKwkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLlJlcXVlc3RGaXhlZElFcy5MaXN0ZW5JbnRlcnZhbCA9CisJCSAgICBMaXN0ZW5JbnR2OworCQkvKiBPbmx5IHJlYXNzb2NpYXRlIG5lZWQgdGhpcyAqLworCQkvKkNPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuQXNzb2NJbmZvLlJlcXVlc3RGaXhlZElFcy5DdXJyZW50QVBBZGRyZXNzLCBBcEFkZHIpOyAqLworCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uT2Zmc2V0UmVxdWVzdElFcyA9CisJCSAgICBzaXplb2Yoc3RydWN0IHJ0X25kaXNfODAyXzExX2Fzc29jaWF0aW9uX2luZm9ybWF0aW9uKTsKIAotICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMsIE1BWF9WSUVfTEVOKTsKLQkJLy8gRmlyc3QgYWRkIFNTSUQKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzLCBNQVhfVklFX0xFTik7CisJCS8qIEZpcnN0IGFkZCBTU0lEICovCiAJCVZhckllc09mZnNldCA9IDA7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJlNzaWRJZSwgMSk7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJlNzaWRJZSwKKwkJCSAgICAgICAxKTsKIAkJVmFySWVzT2Zmc2V0ICs9IDE7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJnBBZC0+TWxtZUF1eC5Tc2lkTGVuLCAxKTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LAorCQkJICAgICAgICZwQWQtPk1sbWVBdXguU3NpZExlbiwgMSk7CiAJCVZhckllc09mZnNldCArPSAxOwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwKKwkJCSAgICAgICBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOwogCQlWYXJJZXNPZmZzZXQgKz0gcEFkLT5NbG1lQXV4LlNzaWRMZW47CiAKLQkJLy8gU2Vjb25kIGFkZCBTdXBwb3J0ZWQgcmF0ZXMKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmU3VwUmF0ZUllLCAxKTsKKwkJLyogU2Vjb25kIGFkZCBTdXBwb3J0ZWQgcmF0ZXMgKi8KKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmU3VwUmF0ZUllLAorCQkJICAgICAgIDEpOwogCQlWYXJJZXNPZmZzZXQgKz0gMTsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sIDEpOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsCisJCQkgICAgICAgJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCAxKTsKIAkJVmFySWVzT2Zmc2V0ICs9IDE7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgcEFkLT5NbG1lQXV4LlN1cFJhdGUsIHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuKTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LAorCQkJICAgICAgIHBBZC0+TWxtZUF1eC5TdXBSYXRlLCBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbik7CiAJCVZhckllc09mZnNldCArPSBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbjsKLQkJLy8gRW5kIEFkZCBieSBKYW1lcworCQkvKiBFbmQgQWRkIGJ5IEphbWVzICovCiAKLSAgICAgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpICYmCi0gICAgICAgICAgICAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gVFJVRSkpCi0gICAgICAgICAgICBDYXBhYmlsaXR5SW5mbyB8PSAweDAxMDA7CisJCWlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KSAmJgorCQkgICAgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IFRSVUUpKQorCQkJQ2FwYWJpbGl0eUluZm8gfD0gMHgwMTAwOwogCiAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gU2VuZCBBU1NPQyByZXF1ZXN0Li4uXG4iKSk7Ci0JCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQXNzb2NIZHIsIFNVQlRZUEVfQVNTT0NfUkVRLCAwLCBBcEFkZHIsIEFwQWRkcik7CisJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQXNzb2NIZHIsIFNVQlRZUEVfQVNTT0NfUkVRLCAwLCBBcEFkZHIsCisJCQkJIEFwQWRkcik7CiAKLQkJLy8gQnVpbGQgYmFzaWMgZnJhbWUgZmlyc3QKLQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAotCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksCSZBc3NvY0hkciwKLQkJCQkJCSAgMiwJCQkJCQkmQ2FwYWJpbGl0eUluZm8sCi0JCQkJCQkgIDIsCQkJCQkJJkxpc3RlbkludHYsCi0JCQkJCQkgIDEsCQkJCQkJJlNzaWRJZSwKLQkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LlNzaWRMZW4sCi0JCQkJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCAJcEFkLT5NbG1lQXV4LlNzaWQsCi0JCQkJCQkgIDEsCQkJCQkJJlN1cFJhdGVJZSwKLQkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCi0JCQkJCQkgIHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCAgcEFkLT5NbG1lQXV4LlN1cFJhdGUsCi0JCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJLyogQnVpbGQgYmFzaWMgZnJhbWUgZmlyc3QgKi8KKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgJkZyYW1lTGVuLAorCQkJCSAgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSwgJkFzc29jSGRyLAorCQkJCSAgMiwgJkNhcGFiaWxpdHlJbmZvLAorCQkJCSAgMiwgJkxpc3RlbkludHYsCisJCQkJICAxLCAmU3NpZEllLAorCQkJCSAgMSwgJnBBZC0+TWxtZUF1eC5Tc2lkTGVuLAorCQkJCSAgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIHBBZC0+TWxtZUF1eC5Tc2lkLAorCQkJCSAgMSwgJlN1cFJhdGVJZSwKKwkJCQkgIDEsICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwKKwkJCQkgIHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCBwQWQtPk1sbWVBdXguU3VwUmF0ZSwKKwkJCQkgIEVORF9PRl9BUkdTKTsKIAotCQlpZiAocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gIT0gMCkKLQkJewotCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAmdG1wLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCi0JCQkJCQkJICBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwgIHBBZC0+TWxtZUF1eC5FeHRSYXRlLAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQlpZiAocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gIT0gMCkgeworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmdG1wLAorCQkJCQkgIDEsICZFeHRSYXRlSWUsCisJCQkJCSAgMSwgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAorCQkJCQkgIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAorCQkJCQkgIHBBZC0+TWxtZUF1eC5FeHRSYXRlLCBFTkRfT0ZfQVJHUyk7CiAJCQlGcmFtZUxlbiArPSB0bXA7CiAJCX0KLQotCQkvLyBIVAotCQlpZiAoKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPiAwKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKLQkJewotCQkJVUxPTkcgVG1wTGVuOwotCQkJVUNIQVIgSHRMZW47Ci0JCQlVQ0hBUiBCUk9BRENPTVs0XSA9IHsweDAsIDB4OTAsIDB4NGMsIDB4MzN9OwotCQkJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYlByZU5IdCA9PSBUUlVFKQotCQkJeworCQkvKiBIVCAqLworCQlpZiAoKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPiAwKQorCQkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpIHsKKwkJCXVuc2lnbmVkIGxvbmcgVG1wTGVuOworCQkJdTggSHRMZW47CisJCQl1OCBCUk9BRENPTVs0XSA9IHsgMHgwLCAweDkwLCAweDRjLCAweDMzIH07CisJCQlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iUHJlTkh0ID09IFRSVUUpIHsKIAkJCQlIdExlbiA9IFNJWkVfSFRfQ0FQX0lFICsgNDsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAotCQkJCQkJCSAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKLQkJCQkJCQkgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCi0JCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXBMZW4sCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sCi0JCQkJCQkJIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwKKwkJCQkJCSAgJlRtcExlbiwgMSwgJldwYUllLCAxLCAmSHRMZW4sCisJCQkJCQkgIDQsICZCUk9BRENPTVswXSwKKwkJCQkJCSAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCSAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCX0gZWxzZSB7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAorCQkJCQkJICAmVG1wTGVuLCAxLCAmSHRDYXBJZSwgMSwKKwkJCQkJCSAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sCisJCQkJCQkgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CiAJCQl9CiAJCQlGcmFtZUxlbiArPSBUbXBMZW47CiAJCX0KLQotCQkvLyBhZGQgUmFsaW5rIHByb3ByaWV0YXJ5IElFIHRvIGluZm9ybSBBUCB0aGlzIFNUQSBpcyBnb2luZyB0byB1c2UgQUdHUkVHQVRJT04gb3IgUElHR1ktQkFDSytBR0dSRUdBVElPTgotCQkvLyBDYXNlIEk6IChBZ2dyZWdhdGlvbiArIFBpZ2d5LUJhY2spCi0JCS8vIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQKLQkJLy8gMi4gTWFjIHN1cHBvcnQgcGlnZ3ktYmFjawotCQkvLyAzLiBBUCBhbm5vdWNlcyBpdCdzIFBJR0dZLUJBQ0srQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KLQkJLy8gQ2FzZSBJSTogKEFnZ3JlZ2F0aW9uKQotCQkvLyAxLiB1c2VyIGVuYWJsZSBhZ2dyZWdhdGlvbiwgQU5ECi0JCS8vIDIuIEFQIGFubm91Y2VzIGl0J3MgQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpCi0JCXsKLQkJCWlmICgocEFkLT5Db21tb25DZmcuYlBpZ2d5QmFja0NhcGFibGUpICYmICgocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAzKSA9PSAzKSkKLQkJCXsKLQkJCQlVTE9ORyBUbXBMZW47Ci0JCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCi0JCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkvKiBhZGQgUmFsaW5rIHByb3ByaWV0YXJ5IElFIHRvIGluZm9ybSBBUCB0aGlzIFNUQSBpcyBnb2luZyB0byB1c2UgQUdHUkVHQVRJT04gb3IgUElHR1ktQkFDSytBR0dSRUdBVElPTiAqLworCQkvKiBDYXNlIEk6IChBZ2dyZWdhdGlvbiArIFBpZ2d5LUJhY2spICovCisJCS8qIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQgKi8KKwkJLyogMi4gTWFjIHN1cHBvcnQgcGlnZ3ktYmFjayAqLworCQkvKiAzLiBBUCBhbm5vdWNlcyBpdCdzIFBJR0dZLUJBQ0srQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04gKi8KKwkJLyogQ2FzZSBJSTogKEFnZ3JlZ2F0aW9uKSAqLworCQkvKiAxLiB1c2VyIGVuYWJsZSBhZ2dyZWdhdGlvbiwgQU5EICovCisJCS8qIDIuIEFQIGFubm91Y2VzIGl0J3MgQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04gKi8KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpIHsKKwkJCWlmICgocEFkLT5Db21tb25DZmcuYlBpZ2d5QmFja0NhcGFibGUpCisJCQkgICAgJiYgKChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDMpID09IDMpKSB7CisJCQkJdW5zaWduZWQgbG9uZyBUbXBMZW47CisJCQkJdTggUmFsaW5rSWVbOV0gPQorCQkJCSAgICB7IElFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywKKwkJCSAgICAweDAzLCAweDAwLCAweDAwLCAweDAwIH07CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAorCQkJCQkJICAmVG1wTGVuLCA5LCBSYWxpbmtJZSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJCX0gZWxzZSBpZiAocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAxKSB7CisJCQkJdW5zaWduZWQgbG9uZyBUbXBMZW47CisJCQkJdTggUmFsaW5rSWVbOV0gPQorCQkJCSAgICB7IElFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywKKwkJCSAgICAweDAxLCAweDAwLCAweDAwLCAweDAwIH07CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAorCQkJCQkJICAmVG1wTGVuLCA5LCBSYWxpbmtJZSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOwogCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKIAkJCX0KLQkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMSkKLQkJCXsKLQkJCQlVTE9ORyBUbXBMZW47Ci0JCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAxLCAweDAwLCAweDAwLCAweDAwfTsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCi0JCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCVVMT05HIFRtcExlbjsKLQkJCVVDSEFSIFJhbGlua0llWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMH07Ci0JCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLAkJICZUbXBMZW4sCi0JCQkJCQkJICA5LAkJCQkJCSBSYWxpbmtJZSwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJfSBlbHNlIHsKKwkJCXVuc2lnbmVkIGxvbmcgVG1wTGVuOworCQkJdTggUmFsaW5rSWVbOV0gPQorCQkJICAgIHsgSUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDA2LAorCQkgICAgMHgwMCwgMHgwMCwgMHgwMCB9OworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmVG1wTGVuLCA5LAorCQkJCQkgIFJhbGlua0llLCBFTkRfT0ZfQVJHUyk7CiAJCQlGcmFtZUxlbiArPSBUbXBMZW47CiAJCX0KIAotCQlpZiAocEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0uYlZhbGlkKQotCQl7Ci0JCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkKLQkJCXsKLQkJCQlRQlNTX1NUQV9JTkZPX1BBUk0gUW9zSW5mbzsKKwkJaWYgKHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLmJWYWxpZCkgeworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZQorCQkJICAgICYmIHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkgeworCQkJCXN0cnVjdCBydF9xYnNzX3N0YV9pbmZvX3Bhcm0gUW9zSW5mbzsKIAotCQkJCU5kaXNaZXJvTWVtb3J5KCZRb3NJbmZvLCBzaXplb2YoUUJTU19TVEFfSU5GT19QQVJNKSk7CisJCQkJTmRpc1plcm9NZW1vcnkoJlFvc0luZm8sCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X3Fic3Nfc3RhX2luZm9fcGFybSkpOwogCQkJCVFvc0luZm8uVUFQU0RfQUNfQkUgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFOwogCQkJCVFvc0luZm8uVUFQU0RfQUNfQksgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLOwogCQkJCVFvc0luZm8uVUFQU0RfQUNfVkkgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZJOwogCQkJCVFvc0luZm8uVUFQU0RfQUNfVk8gPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPOwotCQkJCVFvc0luZm8uTWF4U1BMZW5ndGggPSBwQWQtPkNvbW1vbkNmZy5NYXhTUExlbmd0aDsKLQkJCQlXbWVJZVs4XSB8PSAqKFBVQ0hBUikmUW9zSW5mbzsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLSAgICAgICAgICAgICAgICAvLyBUaGUgUGFyYW1ldGVyIFNldCBDb3VudCBpcyBzZXQgdG8goacwoaggaW4gdGhlIGFzc29jaWF0aW9uIHJlcXVlc3QgZnJhbWVzCi0gICAgICAgICAgICAgICAgLy8gV21lSWVbOF0gfD0gKHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCAmIDB4MGYpOworCQkJCVFvc0luZm8uTWF4U1BMZW5ndGggPQorCQkJCSAgICBwQWQtPkNvbW1vbkNmZy5NYXhTUExlbmd0aDsKKwkJCQlXbWVJZVs4XSB8PSAqKHU4ICopJiBRb3NJbmZvOworCQkJfSBlbHNlIHsKKwkJCQkvKiBUaGUgUGFyYW1ldGVyIFNldCBDb3VudCBpcyBzZXQgdG8goacwoaggaW4gdGhlIGFzc29jaWF0aW9uIHJlcXVlc3QgZnJhbWVzICovCisJCQkJLyogV21lSWVbOF0gfD0gKHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCAmIDB4MGYpOyAqLwogCQkJfQogCi0JCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICZ0bXAsCi0JCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICZXbWVJZVswXSwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJICA5LCAmV21lSWVbMF0sIEVORF9PRl9BUkdTKTsKIAkJCUZyYW1lTGVuICs9IHRtcDsKIAkJfQotCi0JCS8vCi0JCS8vIExldCBXUEEoIzIyMSkgRWxlbWVudCBJRCBvbiB0aGUgZW5kIG9mIHRoaXMgYXNzb2NpYXRpb24gZnJhbWUuCi0JCS8vIE90aGVyd2lzZSBzb21lIEFQIHdpbGwgZmFpbCBvbiBwYXJzaW5nIEVsZW1lbnQgSUQgYW5kIHNldCBzdGF0dXMgZmFpbCBvbiBBc3NvYyBSc3AuCi0JCS8vIEZvciBleGFtcGxlOiBQdXQgVmVuZG9yIFNwZWNpZmljIElFIG9uIHRoZSBmcm9udCBvZiBXUEEgSUUuCi0JCS8vIFRoaXMgaGFwcGVucyBvbiBBUCAoTW9kZWwgTm86TGlua3N5cyBXUks1NEcpCi0JCS8vCisJCS8qICovCisJCS8qIExldCBXUEEoIzIyMSkgRWxlbWVudCBJRCBvbiB0aGUgZW5kIG9mIHRoaXMgYXNzb2NpYXRpb24gZnJhbWUuICovCisJCS8qIE90aGVyd2lzZSBzb21lIEFQIHdpbGwgZmFpbCBvbiBwYXJzaW5nIEVsZW1lbnQgSUQgYW5kIHNldCBzdGF0dXMgZmFpbCBvbiBBc3NvYyBSc3AuICovCisJCS8qIEZvciBleGFtcGxlOiBQdXQgVmVuZG9yIFNwZWNpZmljIElFIG9uIHRoZSBmcm9udCBvZiBXUEEgSUUuICovCisJCS8qIFRoaXMgaGFwcGVucyBvbiBBUCAoTW9kZWwgTm86TGlua3N5cyBXUks1NEcpICovCisJCS8qICovCiAJCWlmICgoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKLSAgICAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB8fAotICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKLSAgICAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQotCQkJKQotICAgICAgICAgICAgKQotCQl7Ci0JCQlVQ0hBUiBSU05JZSA9IElFX1dQQTsKKwkJICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgfHwKKwkJICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorCQkgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorCQkgICAgKQorCQkgICAgKSB7CisJCQl1OCBSU05JZSA9IElFX1dQQTsKIAotCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB8fAotICAgICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSkKLQkJCXsKKwkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKKwkJCSAgICB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0KKwkJCQlOZGlzODAyXzExQXV0aE1vZGVXUEEyKSkgewogCQkJCVJTTkllID0gSUVfV1BBMjsKIAkJCX0KIAotCQkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSAxKQotICAgICAgICAgICAgUlRNUE1ha2VSU05JRShwQWQsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIEJTUzApOworCQkJaWYgKChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0KKwkJCSAgICAgV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQorCQkJICAgICYmIChwQWQtPlN0YUNmZy5iUlNOX0lFX0Zyb21XcGFTdXBwbGljYW50ID09IEZBTFNFKSkKKwkJCQlSVE1QTWFrZVJTTklFKHBBZCwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsCisJCQkJCSAgICAgIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywgQlNTMCk7CiAKLSAgICAgICAgICAgIC8vIENoZWNrIGZvciBXUEEgUE1LIGNhY2hlIGxpc3QKLQkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQotCQkJewotCQkJICAgIElOVCAgICAgaWR4OwotICAgICAgICAgICAgICAgIEJPT0xFQU4gRm91bmRQTUsgPSBGQUxTRTsKLQkJCQkvLyBTZWFyY2ggY2hjaGVkIFBNS0lELCBhcHBlbmQgaXQgaWYgZXhpc3RlZAotCQkJCWZvciAoaWR4ID0gMDsgaWR4IDwgUE1LSURfTk87IGlkeCsrKQotCQkJCXsKLQkJCQkJaWYgKE5kaXNFcXVhbE1lbW9yeShBcEFkZHIsICZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHhdLkJTU0lELCA2KSkKLQkJCQkJeworCQkJLyogQ2hlY2sgZm9yIFdQQSBQTUsgY2FjaGUgbGlzdCAqLworCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHsKKwkJCQlpbnQgaWR4OworCQkJCUJPT0xFQU4gRm91bmRQTUsgPSBGQUxTRTsKKwkJCQkvKiBTZWFyY2ggY2hjaGVkIFBNS0lELCBhcHBlbmQgaXQgaWYgZXhpc3RlZCAqLworCQkJCWZvciAoaWR4ID0gMDsgaWR4IDwgUE1LSURfTk87IGlkeCsrKSB7CisJCQkJCWlmIChOZGlzRXF1YWxNZW1vcnkKKwkJCQkJICAgIChBcEFkZHIsCisJCQkJCSAgICAgJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeF0uQlNTSUQsCisJCQkJCSAgICAgNikpIHsKIAkJCQkJCUZvdW5kUE1LID0gVFJVRTsKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJfQotCi0JCQkJaWYgKEZvdW5kUE1LKQotCQkJCXsKLQkJCQkJLy8gU2V0IFBNSyBudW1iZXIKLQkJCQkJKihQVVNIT1JUKSAmcEFkLT5TdGFDZmcuUlNOX0lFW3BBZC0+U3RhQ2ZnLlJTTklFX0xlbl0gPSAxOwotCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuUlNOX0lFW3BBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDJdLCAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4XS5QTUtJRCwgMTYpOwotICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5SU05JRV9MZW4gKz0gMTg7CisJCQkJaWYgKEZvdW5kUE1LKSB7CisJCQkJCS8qIFNldCBQTUsgbnVtYmVyICovCisJCQkJCSoodTE2ICopJiBwQWQtPlN0YUNmZy5SU05fSUVbcEFkLT4KKwkJCQkJCQkJCVN0YUNmZy4KKwkJCQkJCQkJCVJTTklFX0xlbl0KKwkJCQkJICAgID0gMTsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLgorCQkJCQkJICAgICAgIFJTTl9JRVtwQWQtPlN0YUNmZy4KKwkJCQkJCQkgICAgICBSU05JRV9MZW4gKyAyXSwKKwkJCQkJCSAgICAgICAmcEFkLT5TdGFDZmcuCisJCQkJCQkgICAgICAgU2F2ZWRQTUtbaWR4XS5QTUtJRCwgMTYpOworCQkJCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4gKz0gMTg7CiAJCQkJfQogCQkJfQogCi0JCQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IDEpCi0JCQl7Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAJCSZ0bXAsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgIAlwQWQtPlN0YUNmZy5SU05JRV9MZW4sCQkJcEFkLT5TdGFDZmcuUlNOX0lFLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAJRU5EX09GX0FSR1MpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgCQkmdG1wLAotCQkJCSAgICAgICAgICAgICAgCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZSU05JZSwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwJCQlwQWQtPlN0YUNmZy5SU05fSUUsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgIAlFTkRfT0ZfQVJHUyk7CisJCQlpZiAoKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PQorCQkJICAgICBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCisJCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLmJSU05fSUVfRnJvbVdwYVN1cHBsaWNhbnQgPT0KKwkJCQlUUlVFKSkgeworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJCSAgcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAorCQkJCQkJICBwQWQtPlN0YUNmZy5SU05fSUUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCX0gZWxzZSB7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmdG1wLAorCQkJCQkJICAxLCAmUlNOSWUsCisJCQkJCQkgIDEsICZwQWQtPlN0YUNmZy5SU05JRV9MZW4sCisJCQkJCQkgIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwKKwkJCQkJCSAgcEFkLT5TdGFDZmcuUlNOX0lFLAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CiAJCQl9CiAKIAkJCUZyYW1lTGVuICs9IHRtcDsKIAotCQkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSAxKQotCQkJewotCSAgICAgICAgICAgIC8vIEFwcGVuZCBWYXJpYWJsZSBJRQotCSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJlJTTkllLCAxKTsKLQkgICAgICAgICAgICBWYXJJZXNPZmZzZXQgKz0gMTsKLQkgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsICZwQWQtPlN0YUNmZy5SU05JRV9MZW4sIDEpOwotCSAgICAgICAgICAgIFZhckllc09mZnNldCArPSAxOworCQkJaWYgKChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0KKwkJCSAgICAgV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQorCQkJICAgIHx8IChwQWQtPlN0YUNmZy5iUlNOX0lFX0Zyb21XcGFTdXBwbGljYW50ID09CisJCQkJRkFMU0UpKSB7CisJCQkJLyogQXBwZW5kIFZhcmlhYmxlIElFICovCisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsKKwkJCQkJICAgICAgIFZhckllc09mZnNldCwgJlJTTkllLCAxKTsKKwkJCQlWYXJJZXNPZmZzZXQgKz0gMTsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKworCQkJCQkgICAgICAgVmFySWVzT2Zmc2V0LAorCQkJCQkgICAgICAgJnBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwgMSk7CisJCQkJVmFySWVzT2Zmc2V0ICs9IDE7CiAJCQl9Ci0JCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsIHBBZC0+U3RhQ2ZnLlJTTl9JRSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwKKwkJCQkgICAgICAgcEFkLT5TdGFDZmcuUlNOX0lFLAorCQkJCSAgICAgICBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOwogCQkJVmFySWVzT2Zmc2V0ICs9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKIAotCQkJLy8gU2V0IFZhcmlhYmxlIElFcyBMZW5ndGgKKwkJCS8qIFNldCBWYXJpYWJsZSBJRXMgTGVuZ3RoICovCiAJCQlwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiA9IFZhckllc09mZnNldDsKIAkJfQogCi0JCS8vIFdlIGhhdmUgdXBkYXRlIHRoYXQgYXQgUGVlckJlYWNvbkF0Sm9pblJlcXVlc3QoKQotCQlDa2lwRmxhZyA9IHBBZC0+U3RhQ2ZnLkNraXBGbGFnOwotCQlpZiAoQ2tpcEZsYWcgIT0gMCkKLQkJewotCQkJTmRpc1plcm9NZW1vcnkoQ2tpcE5lZ290aWF0aW9uQnVmZmVyLCBDS0lQX05FR09USUFUSU9OX0xFTkdUSCk7Ci0JCQlDa2lwTmVnb3RpYXRpb25CdWZmZXJbMl0gPSAweDY2OwotCQkJLy8gTWFrZSBpdCB0cnkgS1AgJiBNSUMsIHNpbmNlIHdlIGhhdmUgdG8gZm9sbG93IHRoZSByZXN1bHQgZnJvbSBBc3NvY1JzcAotCQkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyWzhdID0gMHgxODsKLQkJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlcltDS0lQX05FR09USUFUSU9OX0xFTkdUSCAtIDFdID0gMHgyMjsKLQkJCUNraXBGbGFnID0gMHgxODsKLQotCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAJJnRtcCwKLQkJCQkJCTEsCQkJCQkJICAJCSZBaXJvbmV0Q2tpcEllLAotCQkJCQkJMSwJCQkJCQkgIAkJJkFpcm9uZXRDa2lwTGVuLAotCQkJCQkJQWlyb25ldENraXBMZW4sIAkJICAJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlciwKLQkJCQkJCUVORF9PRl9BUkdTKTsKLQkJCUZyYW1lTGVuICs9IHRtcDsKLQkJfQotCi0JCS8vIEFkZCBDQ1ggdjIgcmVxdWVzdCBpZiBDQ1gyIGFkbWluIHN0YXRlIGlzIG9uCi0JCWlmIChwQWQtPlN0YUNmZy5DQ1hDb250cm9sLmZpZWxkLkVuYWJsZSA9PSAxKQotCQl7Ci0KLQkJCS8vCi0JCQkvLyBBZGQgQWlyb25ldElQQWRkcmVzc0lFIGZvciBDaXNjbyBDQ1ggMi5YCi0JCQkvLyBBZGQgQ0NYIFZlcnNpb24KLQkJCS8vCi0JCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICZ0bXAsCi0JCQkJCQkxLAkJCQkJCQkmQWlyb25ldElQQWRkcmVzc0lFLAotCQkJCQkJMSwJCQkJCQkJJkFpcm9uZXRJUEFkZHJlc3NMZW4sCi0JCQkJCQlBaXJvbmV0SVBBZGRyZXNzTGVuLAkJQWlyb25ldElQQWRkcmVzc0J1ZmZlciwKLQkJCQkJCTEsCQkJCQkJCSZDY3gySWUsCi0JCQkJCQkxLAkJCQkJCQkmQ2N4MkxlbiwKLQkJCQkJCUNjeDJMZW4sCQkJCSAgICBDY3gySWVJbmZvLAotCQkJCQkJRU5EX09GX0FSR1MpOwotCQkJRnJhbWVMZW4gKz0gdG1wOwotCi0JCQkvLyBBZGQgYnkgSmFtZXMgMDMvMDYvMjcKLQkJCS8vIFNldCBWYXJpYWJsZSBJRXMgTGVuZ3RoCi0JCQlwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiA9IFZhckllc09mZnNldDsKLQkJCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5SZXF1ZXN0SUVMZW5ndGggPSBWYXJJZXNPZmZzZXQ7Ci0KLQkJCS8vIE9mZnNldFJlc3BvbnNlSUVzIGZvbGxvdyBSZXFWYXJJRQotCQkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLk9mZnNldFJlc3BvbnNlSUVzID0gc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKSArIHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuOwotCQkJLy8gRW5kIEFkZCBieSBKYW1lcwotCQl9Ci0KLQogCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIAkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKIAogCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLCBUaW1lb3V0KTsKIAkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19XQUlUX1JTUDsKLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBU1NPQyAtIE1sbWVBc3NvY1JlcUFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsZWQuIEJVRyEhISEhISBcbiIpKTsKKwl9IGVsc2UgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkFTU09DIC0gTWxtZUFzc29jUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxlZC4gQlVHIVxuIikpOwogCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CiAJCVN0YXR1cyA9IE1MTUVfSU5WQUxJRF9GT1JNQVQ7Ci0JCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsCisJCQkgICAgJlN0YXR1cyk7CiAJfQogCiB9CkBAIC01OTQsMTg3ICs1ODksMTY4IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIE1sbWVSZWFzc29jUmVxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgTWxtZVJlYXNzb2NSZXFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVDSEFSCQkJQXBBZGRyWzZdOwotCUhFQURFUl84MDJfMTEJUmVhc3NvY0hkcjsKLQlVQ0hBUgkJCUNjeDJMZW4gPSA1OwotCVVDSEFSCQkJV21lSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCAweDA3LCAweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAwLCAweDAxLCAweDAwfTsKLQlVU0hPUlQJCQlDYXBhYmlsaXR5SW5mbywgTGlzdGVuSW50djsKLQlVTE9ORwkJCVRpbWVvdXQ7Ci0JVUxPTkcJCQlGcmFtZUxlbiA9IDA7Ci0JQk9PTEVBTgkJCVRpbWVyQ2FuY2VsbGVkOwotCU5ESVNfU1RBVFVTCQlOU3RhdHVzOwotCVVMT05HCQkJdG1wOwotCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOwotCVVTSE9SVAkJCVN0YXR1czsKKwl1OCBBcEFkZHJbNl07CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgUmVhc3NvY0hkcjsKKwl1OCBXbWVJZVs5XSA9CisJICAgIHsgSUVfVkVORE9SX1NQRUNJRklDLCAweDA3LCAweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAwLCAweDAxLAorICAgICAgIDB4MDAgfTsKKwl1MTYgQ2FwYWJpbGl0eUluZm8sIExpc3RlbkludHY7CisJdW5zaWduZWQgbG9uZyBUaW1lb3V0OworCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW4gPSAwOworCUJPT0xFQU4gVGltZXJDYW5jZWxsZWQ7CisJaW50IE5TdGF0dXM7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJdTggKnBPdXRCdWZmZXIgPSBOVUxMOworCXUxNiBTdGF0dXM7CiAKLQkvLyBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QKLQlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gQmxvY2sgUmVBc3NvYyByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIpKTsKKwkvKiBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QgKi8KKwlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkFTU09DIC0gQmxvY2sgUmVBc3NvYyByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIpKTsKIAkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwogCQlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOwotCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwKKwkJCSAgICAmU3RhdHVzKTsKIAl9Ci0JLy8gdGhlIHBhcmFtZXRlcnMgYXJlIHRoZSBzYW1lIGFzIHRoZSBhc3NvY2lhdGlvbgotCWVsc2UgaWYoTWxtZUFzc29jUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFwQWRkciwgJkNhcGFiaWxpdHlJbmZvLCAmVGltZW91dCwgJkxpc3RlbkludHYpKQotCXsKKwkvKiB0aGUgcGFyYW1ldGVycyBhcmUgdGhlIHNhbWUgYXMgdGhlIGFzc29jaWF0aW9uICovCisJZWxzZSBpZiAoTWxtZUFzc29jUmVxU2FuaXR5CisJCSAocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQXBBZGRyLCAmQ2FwYWJpbGl0eUluZm8sCisJCSAgJlRpbWVvdXQsICZMaXN0ZW5JbnR2KSkgewogCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CiAKLQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQkJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFTU09DIC0gTWxtZVJlYXNzb2NSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwkvKkdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5ICovCisJCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkFTU09DIC0gTWxtZVJlYXNzb2NSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOwogCQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwogCQkJU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOwotCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCSAgICBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKIAkJCXJldHVybjsKIAkJfQogCiAJCUNPUFlfTUFDX0FERFIocEFkLT5NbG1lQXV4LkJzc2lkLCBBcEFkZHIpOwogCi0JCS8vIG1ha2UgZnJhbWUsIHVzZSBic3NpZCBhcyB0aGUgQVAgYWRkcmVzcz8/Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gU2VuZCBSRS1BU1NPQyByZXF1ZXN0Li4uXG4iKSk7Ci0JCU1ndE1hY0hlYWRlckluaXQocEFkLCAmUmVhc3NvY0hkciwgU1VCVFlQRV9SRUFTU09DX1JFUSwgMCwgQXBBZGRyLCBBcEFkZHIpOwotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAmUmVhc3NvY0hkciwKLQkJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAmQ2FwYWJpbGl0eUluZm8sCi0JCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgJkxpc3RlbkludHYsCi0JCQkJCQkgIE1BQ19BRERSX0xFTiwgICAgICAgICAgICAgQXBBZGRyLAotCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkSWUsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+TWxtZUF1eC5Tc2lkTGVuLAotCQkJCQkJICBwQWQtPk1sbWVBdXguU3NpZExlbiwgICAgIHBBZC0+TWxtZUF1eC5Tc2lkLAotCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCi0JCQkJCQkgIDEsCQkJCQkJJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLAotCQkJCQkJICBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgIHBBZC0+TWxtZUF1eC5TdXBSYXRlLAotCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCS8qIG1ha2UgZnJhbWUsIHVzZSBic3NpZCBhcyB0aGUgQVAgYWRkcmVzcz8/ICovCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQVNTT0MgLSBTZW5kIFJFLUFTU09DIHJlcXVlc3QuLi5cbiIpKTsKKwkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZSZWFzc29jSGRyLCBTVUJUWVBFX1JFQVNTT0NfUkVRLCAwLAorCQkJCSBBcEFkZHIsIEFwQWRkcik7CisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICZGcmFtZUxlbiwgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSwKKwkJCQkgICZSZWFzc29jSGRyLCAyLCAmQ2FwYWJpbGl0eUluZm8sIDIsCisJCQkJICAmTGlzdGVuSW50diwgTUFDX0FERFJfTEVOLCBBcEFkZHIsIDEsICZTc2lkSWUsCisJCQkJICAxLCAmcEFkLT5NbG1lQXV4LlNzaWRMZW4sCisJCQkJICBwQWQtPk1sbWVBdXguU3NpZExlbiwgcEFkLT5NbG1lQXV4LlNzaWQsIDEsCisJCQkJICAmU3VwUmF0ZUllLCAxLCAmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCisJCQkJICBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgcEFkLT5NbG1lQXV4LlN1cFJhdGUsCisJCQkJICBFTkRfT0ZfQVJHUyk7CiAKLQkJaWYgKHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuICE9IDApCi0JCXsKLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICZ0bXAsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAotCQkJCQkJCSAgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCSAgICBwQWQtPk1sbWVBdXguRXh0UmF0ZSwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJaWYgKHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuICE9IDApIHsKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJICAxLCAmRXh0UmF0ZUllLAorCQkJCQkgIDEsICZwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwKKwkJCQkJICBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwKKwkJCQkJICBwQWQtPk1sbWVBdXguRXh0UmF0ZSwgRU5EX09GX0FSR1MpOwogCQkJRnJhbWVMZW4gKz0gdG1wOwogCQl9CiAKLQkJaWYgKHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLmJWYWxpZCkKLQkJewotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5iQVBTRENhcGFibGUpCi0JCQl7Ci0JCQkJUUJTU19TVEFfSU5GT19QQVJNIFFvc0luZm87CisJCWlmIChwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5iVmFsaWQpIHsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUKKwkJCSAgICAmJiBwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5iQVBTRENhcGFibGUpIHsKKwkJCQlzdHJ1Y3QgcnRfcWJzc19zdGFfaW5mb19wYXJtIFFvc0luZm87CiAKLQkJCQlOZGlzWmVyb01lbW9yeSgmUW9zSW5mbywgc2l6ZW9mKFFCU1NfU1RBX0lORk9fUEFSTSkpOworCQkJCU5kaXNaZXJvTWVtb3J5KCZRb3NJbmZvLAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9xYnNzX3N0YV9pbmZvX3Bhcm0pKTsKIAkJCQlRb3NJbmZvLlVBUFNEX0FDX0JFID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRTsKIAkJCQlRb3NJbmZvLlVBUFNEX0FDX0JLID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CSzsKIAkJCQlRb3NJbmZvLlVBUFNEX0FDX1ZJID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSTsKIAkJCQlRb3NJbmZvLlVBUFNEX0FDX1ZPID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTzsKLQkJCQlRb3NJbmZvLk1heFNQTGVuZ3RoID0gcEFkLT5Db21tb25DZmcuTWF4U1BMZW5ndGg7Ci0JCQkJV21lSWVbOF0gfD0gKihQVUNIQVIpJlFvc0luZm87CisJCQkJUW9zSW5mby5NYXhTUExlbmd0aCA9CisJCQkJICAgIHBBZC0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoOworCQkJCVdtZUllWzhdIHw9ICoodTggKikmIFFvc0luZm87CiAJCQl9CiAKLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgJnRtcCwKLQkJCQkJCQkgIDksICAgICAgICAgICAgICAgICAgICAgICAgJldtZUllWzBdLAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJRnJhbWVMZW4gKz0gdG1wOwotCQl9Ci0KLQkJLy8gSFQKLQkJaWYgKChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID4gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCi0JCXsKLQkJCVVMT05HIFRtcExlbjsKLQkJCVVDSEFSIEh0TGVuOwotCQkJVUNIQVIgQlJPQURDT01bNF0gPSB7MHgwLCAweDkwLCAweDRjLCAweDMzfTsKLQkJCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJQcmVOSHQgPT0gVFJVRSkKLQkJCXsKLQkJCQlIdExlbiA9IFNJWkVfSFRfQ0FQX0lFICsgNDsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAotCQkJCQkJCSAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKLQkJCQkJCQkgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCi0JCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXBMZW4sCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sCi0JCQkJCQkJIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJfQotCQkJRnJhbWVMZW4gKz0gVG1wTGVuOwotCQl9Ci0KLQkJLy8gYWRkIFJhbGluayBwcm9wcmlldGFyeSBJRSB0byBpbmZvcm0gQVAgdGhpcyBTVEEgaXMgZ29pbmcgdG8gdXNlIEFHR1JFR0FUSU9OIG9yIFBJR0dZLUJBQ0srQUdHUkVHQVRJT04KLQkJLy8gQ2FzZSBJOiAoQWdncmVnYXRpb24gKyBQaWdneS1CYWNrKQotCQkvLyAxLiB1c2VyIGVuYWJsZSBhZ2dyZWdhdGlvbiwgQU5ECi0JCS8vIDIuIE1hYyBzdXBwb3J0IHBpZ2d5LWJhY2sKLQkJLy8gMy4gQVAgYW5ub3VjZXMgaXQncyBQSUdHWS1CQUNLK0FHR1JFR0FUSU9OLWNhcGFibGUgaW4gQkVBQ09OCi0JCS8vIENhc2UgSUk6IChBZ2dyZWdhdGlvbikKLQkJLy8gMS4gdXNlciBlbmFibGUgYWdncmVnYXRpb24sIEFORAotCQkvLyAyLiBBUCBhbm5vdWNlcyBpdCdzIEFHR1JFR0FUSU9OLWNhcGFibGUgaW4gQkVBQ09OCi0JCWlmIChwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKQotCQl7Ci0JCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJQaWdneUJhY2tDYXBhYmxlKSAmJiAoKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMykgPT0gMykpCi0JCQl7Ci0JCQkJVUxPTkcgVG1wTGVuOwotCQkJCVVDSEFSIFJhbGlua0llWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywgMHgwMywgMHgwMCwgMHgwMCwgMHgwMH07Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlcitGcmFtZUxlbiwgICAgICAgICAgICZUbXBMZW4sCi0JCQkJCQkJCSAgOSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbGlua0llLAotCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJCQlGcmFtZUxlbiArPSBUbXBMZW47Ci0JCQl9Ci0JCQllbHNlIGlmIChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDEpCi0JCQl7Ci0JCQkJVUxPTkcgVG1wTGVuOwotCQkJCVVDSEFSIFJhbGlua0llWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMH07Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlcitGcmFtZUxlbiwgICAgICAgICAgICZUbXBMZW4sCi0JCQkJCQkJCSAgOSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbGlua0llLAotCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJCQlGcmFtZUxlbiArPSBUbXBMZW47Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlVTE9ORyBUbXBMZW47Ci0JCQlVQ0hBUiBSYWxpbmtJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDB9OwotCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlcitGcmFtZUxlbiwJCSAmVG1wTGVuLAotCQkJCQkJCSAgOSwJCQkJCQkgUmFsaW5rSWUsCi0JCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQlGcmFtZUxlbiArPSBUbXBMZW47Ci0JCX0KLQotCQkvLyBBZGQgQ0NYIHYyIHJlcXVlc3QgaWYgQ0NYMiBhZG1pbiBzdGF0ZSBpcyBvbgotCQlpZiAocEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5FbmFibGUgPT0gMSkKLQkJewotCQkJLy8KLQkJCS8vIEFkZCBDQ1ggVmVyc2lvbgotCQkJLy8KIAkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKLQkJCQkJCTEsCQkJCQkJCSZDY3gySWUsCi0JCQkJCQkxLAkJCQkJCQkmQ2N4MkxlbiwKLQkJCQkJCUNjeDJMZW4sCQkJCSAgICBDY3gySWVJbmZvLAotCQkJCQkJRU5EX09GX0FSR1MpOworCQkJCQkgIDksICZXbWVJZVswXSwgRU5EX09GX0FSR1MpOwogCQkJRnJhbWVMZW4gKz0gdG1wOwogCQl9CisJCS8qIEhUICovCisJCWlmICgocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA+IDApCisJCSAgICAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkgeworCQkJdW5zaWduZWQgbG9uZyBUbXBMZW47CisJCQl1OCBIdExlbjsKKwkJCXU4IEJST0FEQ09NWzRdID0geyAweDAsIDB4OTAsIDB4NGMsIDB4MzMgfTsKKwkJCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJQcmVOSHQgPT0gVFJVRSkgeworCQkJCUh0TGVuID0gU0laRV9IVF9DQVBfSUUgKyA0OworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwKKwkJCQkJCSAgJlRtcExlbiwgMSwgJldwYUllLCAxLCAmSHRMZW4sCisJCQkJCQkgIDQsICZCUk9BRENPTVswXSwKKwkJCQkJCSAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCSAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCX0gZWxzZSB7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAorCQkJCQkJICAmVG1wTGVuLCAxLCAmSHRDYXBJZSwgMSwKKwkJCQkJCSAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sCisJCQkJCQkgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQl9CisJCQlGcmFtZUxlbiArPSBUbXBMZW47CisJCX0KKwkJLyogYWRkIFJhbGluayBwcm9wcmlldGFyeSBJRSB0byBpbmZvcm0gQVAgdGhpcyBTVEEgaXMgZ29pbmcgdG8gdXNlIEFHR1JFR0FUSU9OIG9yIFBJR0dZLUJBQ0srQUdHUkVHQVRJT04gKi8KKwkJLyogQ2FzZSBJOiAoQWdncmVnYXRpb24gKyBQaWdneS1CYWNrKSAqLworCQkvKiAxLiB1c2VyIGVuYWJsZSBhZ2dyZWdhdGlvbiwgQU5EICovCisJCS8qIDIuIE1hYyBzdXBwb3J0IHBpZ2d5LWJhY2sgKi8KKwkJLyogMy4gQVAgYW5ub3VjZXMgaXQncyBQSUdHWS1CQUNLK0FHR1JFR0FUSU9OLWNhcGFibGUgaW4gQkVBQ09OICovCisJCS8qIENhc2UgSUk6IChBZ2dyZWdhdGlvbikgKi8KKwkJLyogMS4gdXNlciBlbmFibGUgYWdncmVnYXRpb24sIEFORCAqLworCQkvKiAyLiBBUCBhbm5vdWNlcyBpdCdzIEFHR1JFR0FUSU9OLWNhcGFibGUgaW4gQkVBQ09OICovCisJCWlmIChwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKSB7CisJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJQaWdneUJhY2tDYXBhYmxlKQorCQkJICAgICYmICgocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAzKSA9PSAzKSkgeworCQkJCXVuc2lnbmVkIGxvbmcgVG1wTGVuOworCQkJCXU4IFJhbGlua0llWzldID0KKwkJCQkgICAgeyBJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsCisJCQkgICAgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCB9OworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwKKwkJCQkJCSAgJlRtcExlbiwgOSwgUmFsaW5rSWUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCQlGcmFtZUxlbiArPSBUbXBMZW47CisJCQl9IGVsc2UgaWYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMSkgeworCQkJCXVuc2lnbmVkIGxvbmcgVG1wTGVuOworCQkJCXU4IFJhbGlua0llWzldID0KKwkJCQkgICAgeyBJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsCisJCQkgICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCB9OworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwKKwkJCQkJCSAgJlRtcExlbiwgOSwgUmFsaW5rSWUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCQlGcmFtZUxlbiArPSBUbXBMZW47CisJCQl9CisJCX0gZWxzZSB7CisJCQl1bnNpZ25lZCBsb25nIFRtcExlbjsKKwkJCXU4IFJhbGlua0llWzldID0KKwkJCSAgICB7IElFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywgMHgwNCwKKwkJICAgIDB4MDAsIDB4MDAsIDB4MDAgfTsKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJlRtcExlbiwgOSwKKwkJCQkJICBSYWxpbmtJZSwgRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gVG1wTGVuOworCQl9CiAKIAkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CiAJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CiAKLQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCBUaW1lb3V0KTsgLyogaW4gbVNlYyAqLworCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsIFRpbWVvdXQpOwkvKiBpbiBtU2VjICovCiAJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gUkVBU1NPQ19XQUlUX1JTUDsKLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBU1NPQyAtIE1sbWVSZWFzc29jUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxlZC4gQlVHISEhISBcbiIpKTsKKwl9IGVsc2UgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkFTU09DIC0gTWxtZVJlYXNzb2NSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbGVkLiBCVUchXG4iKSk7CiAJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKIAkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKLQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsCisJCQkgICAgJlN0YXR1cyk7CiAJfQogfQogCkBAIC03ODksNTEgKzc2NSw1MCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgcERpc2Fzc29jUmVxOwotCUhFQURFUl84MDJfMTEgICAgICAgICBEaXNhc3NvY0hkcjsKLQlQSEVBREVSXzgwMl8xMSAgICAgICAgcERpc2Fzc29jSGRyOwotCVBVQ0hBUiAgICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlVTE9ORyAgICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOwotCU5ESVNfU1RBVFVTICAgICAgICAgICBOU3RhdHVzOwotCUJPT0xFQU4gICAgICAgICAgICAgICBUaW1lckNhbmNlbGxlZDsKLQlVTE9ORyAgICAgICAgICAgICAgICAgVGltZW91dCA9IDA7Ci0JVVNIT1JUICAgICAgICAgICAgICAgIFN0YXR1czsKKwlzdHJ1Y3QgcnRfbWxtZV9kaXNhc3NvY19yZXEgKnBEaXNhc3NvY1JlcTsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBEaXNhc3NvY0hkcjsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBEaXNhc3NvY0hkcjsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBGcmFtZUxlbiA9IDA7CisJaW50IE5TdGF0dXM7CisJQk9PTEVBTiBUaW1lckNhbmNlbGxlZDsKKwl1bnNpZ25lZCBsb25nIFRpbWVvdXQgPSA1MDA7CisJdTE2IFN0YXR1czsKIAotCS8vIHNraXAgc2FuaXR5IGNoZWNrCi0JcERpc2Fzc29jUmVxID0gKFBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpKEVsZW0tPk1zZyk7CisJLyogc2tpcCBzYW5pdHkgY2hlY2sgKi8KKwlwRGlzYXNzb2NSZXEgPSAoc3RydWN0IHJ0X21sbWVfZGlzYXNzb2NfcmVxICopKEVsZW0tPk1zZyk7CiAKLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIE1sbWVEaXNhc3NvY1JlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWRcbiIpKTsKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwkvKkdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5ICovCisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkFTU09DIC0gTWxtZURpc2Fzc29jUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZFxuIikpOwogCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CiAJCVN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKLQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RJU0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfRElTQVNTT0NfQ09ORiwgMiwKKwkJCSAgICAmU3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIAotCi0KIAlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBTZW5kIERJU0FTU09DIHJlcXVlc3RbQlNTSUQ6OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IChSZWFzb249JWQpXG4iLAotCQkJCXBEaXNhc3NvY1JlcS0+QWRkclswXSwgcERpc2Fzc29jUmVxLT5BZGRyWzFdLCBwRGlzYXNzb2NSZXEtPkFkZHJbMl0sCi0JCQkJcERpc2Fzc29jUmVxLT5BZGRyWzNdLCBwRGlzYXNzb2NSZXEtPkFkZHJbNF0sIHBEaXNhc3NvY1JlcS0+QWRkcls1XSwgcERpc2Fzc29jUmVxLT5SZWFzb24pKTsKLQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkRpc2Fzc29jSGRyLCBTVUJUWVBFX0RJU0FTU09DLCAwLCBwRGlzYXNzb2NSZXEtPkFkZHIsIHBEaXNhc3NvY1JlcS0+QWRkcik7CS8vIHBhdGNoIHBlYXAgdHRscyBzd2l0Y2hpbmcgaXNzdWUKLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAotCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwmRGlzYXNzb2NIZHIsCi0JCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICZwRGlzYXNzb2NSZXEtPlJlYXNvbiwKLQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkFTU09DIC0gU2VuZCBESVNBU1NPQyByZXF1ZXN0W0JTU0lEOjolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAoUmVhc29uPSVkKVxuIiwKKwkJICBwRGlzYXNzb2NSZXEtPkFkZHJbMF0sIHBEaXNhc3NvY1JlcS0+QWRkclsxXSwKKwkJICBwRGlzYXNzb2NSZXEtPkFkZHJbMl0sIHBEaXNhc3NvY1JlcS0+QWRkclszXSwKKwkJICBwRGlzYXNzb2NSZXEtPkFkZHJbNF0sIHBEaXNhc3NvY1JlcS0+QWRkcls1XSwKKwkJICBwRGlzYXNzb2NSZXEtPlJlYXNvbikpOworCU1ndE1hY0hlYWRlckluaXQocEFkLCAmRGlzYXNzb2NIZHIsIFNVQlRZUEVfRElTQVNTT0MsIDAsIHBEaXNhc3NvY1JlcS0+QWRkciwgcERpc2Fzc29jUmVxLT5BZGRyKTsJLyogcGF0Y2ggcGVhcCB0dGxzIHN3aXRjaGluZyBpc3N1ZSAqLworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICZGcmFtZUxlbiwKKwkJCSAgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSwgJkRpc2Fzc29jSGRyLAorCQkJICAyLCAmcERpc2Fzc29jUmVxLT5SZWFzb24sIEVORF9PRl9BUkdTKTsKIAlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIAotCS8vIFRvIHBhdGNoIEluc3RhbmNlIGFuZCBCdWZmYWxvKE4pIEFQCi0JLy8gRHJpdmVyIGhhcyB0byBzZW5kIGRlYXV0aCB0byBJbnN0YW5jZSBBUCwgYnV0IEJ1ZmZhbG8oTikgbmVlZHMgdG8gc2VuZCBkaXNhc3NvYyB0byByZXNldCBBdXRoZW50aWNhdG9yJ3Mgc3RhdGUgbWFjaGluZQotCS8vIFRoZXJlZm9yZSwgd2Ugc2VuZCBib3RoIG9mIHRoZW0uCi0JcERpc2Fzc29jSGRyID0gKFBIRUFERVJfODAyXzExKXBPdXRCdWZmZXI7CisJLyogVG8gcGF0Y2ggSW5zdGFuY2UgYW5kIEJ1ZmZhbG8oTikgQVAgKi8KKwkvKiBEcml2ZXIgaGFzIHRvIHNlbmQgZGVhdXRoIHRvIEluc3RhbmNlIEFQLCBidXQgQnVmZmFsbyhOKSBuZWVkcyB0byBzZW5kIGRpc2Fzc29jIHRvIHJlc2V0IEF1dGhlbnRpY2F0b3IncyBzdGF0ZSBtYWNoaW5lICovCisJLyogVGhlcmVmb3JlLCB3ZSBzZW5kIGJvdGggb2YgdGhlbS4gKi8KKwlwRGlzYXNzb2NIZHIgPSAoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKikgcE91dEJ1ZmZlcjsKIAlwRGlzYXNzb2NIZHItPkZDLlN1YlR5cGUgPSBTVUJUWVBFX0RFQVVUSDsKIAlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIApAQCAtODQyLDE0ICs4MTcsMTEgQEAKIAlwQWQtPlN0YUNmZy5EaXNhc3NvY1JlYXNvbiA9IFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORzsKIAlDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkRpc2Fzc29jU3RhLCBwRGlzYXNzb2NSZXEtPkFkZHIpOwogCi0JUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgVGltZW91dCk7IC8qIGluIG1TZWMgKi8KKwlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCBUaW1lb3V0KTsJLyogaW4gbVNlYyAqLwogCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gRElTQVNTT0NfV0FJVF9SU1A7CiAKLSAgICB7Ci0gICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKLSAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOwotICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7Ci0gICAgfQorCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgU0lPQ0dJV0FQLCAtMSwgTlVMTCwgTlVMTCwgMCk7CisKIH0KIAogLyoKQEAgLTg2Myw5NCArODM1LDgxIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIFBlZXJBc3NvY1JzcEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIFBlZXJBc3NvY1JzcEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVVNIT1JUICAgICAgICBDYXBhYmlsaXR5SW5mbywgU3RhdHVzLCBBaWQ7Ci0JVUNIQVIgICAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgU3VwUmF0ZUxlbjsKLQlVQ0hBUiAgICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlTGVuOwotCVVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOwotCVVDSEFSICAgICAgICAgQ2tpcEZsYWc7Ci0JRURDQV9QQVJNICAgICBFZGNhUGFybTsKLQlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7Ci0JQUREX0hUX0lORk9fSUUJCUFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCi0JVUNIQVIJCQlIdENhcGFiaWxpdHlMZW47Ci0JVUNIQVIJCQlBZGRIdEluZm9MZW47Ci0JVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKKwl1MTYgQ2FwYWJpbGl0eUluZm8sIFN0YXR1cywgQWlkOworCXU4IFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBTdXBSYXRlTGVuOworCXU4IEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlTGVuOworCXU4IEFkZHIyW01BQ19BRERSX0xFTl07CisJQk9PTEVBTiBUaW1lckNhbmNlbGxlZDsKKwl1OCBDa2lwRmxhZzsKKwlzdHJ1Y3QgcnRfZWRjYV9wYXJtIEVkY2FQYXJtOworCXN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llIEh0Q2FwYWJpbGl0eTsKKwlzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUgQWRkSHRJbmZvOwkvKiBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUgKi8KKwl1OCBIdENhcGFiaWxpdHlMZW4gPSAwOworCXU4IEFkZEh0SW5mb0xlbjsKKwl1OCBOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKIAotCWlmIChQZWVyQXNzb2NSc3BTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZDYXBhYmlsaXR5SW5mbywgJlN0YXR1cywgJkFpZCwgU3VwUmF0ZSwgJlN1cFJhdGVMZW4sIEV4dFJhdGUsICZFeHRSYXRlTGVuLAotCQkmSHRDYXBhYmlsaXR5LCZBZGRIdEluZm8sICZIdENhcGFiaWxpdHlMZW4sJkFkZEh0SW5mb0xlbiwmTmV3RXh0Q2hhbm5lbE9mZnNldCwgJkVkY2FQYXJtLCAmQ2tpcEZsYWcpKQotCXsKLQkJLy8gVGhlIGZyYW1lIGlzIGZvciBtZSA/Ci0JCWlmKE1BQ19BRERSX0VRVUFMKEFkZHIyLCBwQWQtPk1sbWVBdXguQnNzaWQpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQXNzb2NSc3BBY3Rpb24oKTpBU1NPQyAtIHJlY2VpdmUgQVNTT0NfUlNQIHRvIG1lIChzdGF0dXM9JWQpXG4iLCBTdGF0dXMpKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBc3NvY1JzcEFjdGlvbigpOk1hY1RhYmxlIFslZF0uQU1zZHVTaXplID0gJWQuIENsaWVudFN0YXR1c0ZsYWdzID0gMHglbHggXG4iLEVsZW0tPldjaWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkNsaWVudFN0YXR1c0ZsYWdzKSk7Ci0JCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwotCQkJaWYoU3RhdHVzID09IE1MTUVfU1VDQ0VTUykKLQkJCXsKLSNpZmRlZiBSVDI4NjAKLQkJCQkvLyBnbyB0byBwcm9jZWR1cmUgbGlzdGVkIG9uIHBhZ2UgMzc2Ci0JCQkJQXNzb2NQb3N0UHJvYyhwQWQsIEFkZHIyLCBDYXBhYmlsaXR5SW5mbywgQWlkLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLAotCQkJCQkmRWRjYVBhcm0sICZIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbiwgJkFkZEh0SW5mbyk7CisJaWYgKFBlZXJBc3NvY1JzcFNhbml0eQorCSAgICAocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZDYXBhYmlsaXR5SW5mbywgJlN0YXR1cywKKwkgICAgICZBaWQsIFN1cFJhdGUsICZTdXBSYXRlTGVuLCBFeHRSYXRlLCAmRXh0UmF0ZUxlbiwgJkh0Q2FwYWJpbGl0eSwKKwkgICAgICZBZGRIdEluZm8sICZIdENhcGFiaWxpdHlMZW4sICZBZGRIdEluZm9MZW4sICZOZXdFeHRDaGFubmVsT2Zmc2V0LAorCSAgICAgJkVkY2FQYXJtLCAmQ2tpcEZsYWcpKSB7CisJCS8qIFRoZSBmcmFtZSBpcyBmb3IgbWUgPyAqLworCQlpZiAoTUFDX0FERFJfRVFVQUwoQWRkcjIsIHBBZC0+TWxtZUF1eC5Cc3NpZCkpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlBlZXJBc3NvY1JzcEFjdGlvbigpOkFTU09DIC0gcmVjZWl2ZSBBU1NPQ19SU1AgdG8gbWUgKHN0YXR1cz0lZClcbiIsCisJCQkJICBTdGF0dXMpKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlBlZXJBc3NvY1JzcEFjdGlvbigpOk1hY1RhYmxlIFslZF0uQU1zZHVTaXplID0gJWQuIENsaWVudFN0YXR1c0ZsYWdzID0gMHglbHggXG4iLAorCQkJCSAgRWxlbS0+V2NpZCwKKwkJCQkgIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplLAorCQkJCSAgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS4KKwkJCQkgIENsaWVudFN0YXR1c0ZsYWdzKSk7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLAorCQkJCQkmVGltZXJDYW5jZWxsZWQpOwogCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7Ci0gICAgICAgICAgICAgICAgICAgIHdleHRfbm90aWZ5X2V2ZW50X2Fzc29jKHBBZCk7CisJCQlpZiAoU3RhdHVzID09IE1MTUVfU1VDQ0VTUykgeworCQkJCXU4IE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSAwOworCQkJCXU4IGlkeDsKIAotICAgICAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBNQUNfQUREUl9MRU4pOwotICAgICAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7Ci0KLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQkJCQlVQ0hBUgkJCU1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSAwOwotCQkJCVVDSEFSCQkJaWR4OwotCi0JCQkJLy8gc3VwcG9ydGVkIHJhdGVzIGFycmF5IG1heSBub3QgYmUgc29ydGVkLiBzb3J0IGl0IGFuZCBmaW5kIHRoZSBtYXhpbXVtIHJhdGUKLQkJCSAgICBmb3IgKGlkeD0wOyBpZHg8U3VwUmF0ZUxlbjsgaWR4KyspCi0gICAgICAgICAgICAgICAgewotCQkJICAgICAgICBpZiAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA8IChTdXBSYXRlW2lkeF0gJiAweDdmKSkKLQkJCSAgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSBTdXBSYXRlW2lkeF0gJiAweDdmOwotCQkJICAgIH0KLQotCQkJCWZvciAoaWR4PTA7IGlkeDxFeHRSYXRlTGVuOyBpZHgrKykKLQkJCSAgICB7Ci0JCQkgICAgICAgIGlmIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzIDwgKEV4dFJhdGVbaWR4XSAmIDB4N2YpKQotCQkJICAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IEV4dFJhdGVbaWR4XSAmIDB4N2Y7Ci0gICAgICAgICAgICAgICAgfQotCQkJCS8vIGdvIHRvIHByb2NlZHVyZSBsaXN0ZWQgb24gcGFnZSAzNzYKLQkJCQlBc3NvY1Bvc3RQcm9jKHBBZCwgQWRkcjIsIENhcGFiaWxpdHlJbmZvLCBBaWQsIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sCi0JCQkJCSZFZGNhUGFybSwgJkh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuLCAmQWRkSHRJbmZvKTsKLQotCQkJCVN0YUFkZE1hY1RhYmxlRW50cnkocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSwgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcywgJkh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuLCBDYXBhYmlsaXR5SW5mbyk7Ci0jZW5kaWYKLQkJCQlwQWQtPlN0YUNmZy5Da2lwRmxhZyA9IENraXBGbGFnOwotCQkJCWlmIChDa2lwRmxhZyAmIDB4MTgpCi0JCQkJewotCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5UeFNFUSwgNCk7Ci0JCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJ4U0VRLCA0KTsKLQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuQ0tJUE1JQywgNCk7Ci0JCQkJCXBBZC0+U3RhQ2ZnLkdJVlswXSA9IFJhbmRvbUJ5dGUocEFkKTsKLQkJCQkJcEFkLT5TdGFDZmcuR0lWWzFdID0gUmFuZG9tQnl0ZShwQWQpOwotCQkJCQlwQWQtPlN0YUNmZy5HSVZbMl0gPSBSYW5kb21CeXRlKHBBZCk7Ci0JCQkJCXBBZC0+U3RhQ2ZnLmJDa2lwT24gPSBUUlVFOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8Q0NYPiBwQWQtPlN0YUNmZy5Da2lwRmxhZyA9IDB4JTAyeFxuIiwgcEFkLT5TdGFDZmcuQ2tpcEZsYWcpKTsKKwkJCQkvKiBzdXBwb3J0ZWQgcmF0ZXMgYXJyYXkgbWF5IG5vdCBiZSBzb3J0ZWQuIHNvcnQgaXQgYW5kIGZpbmQgdGhlIG1heGltdW0gcmF0ZSAqLworCQkJCWZvciAoaWR4ID0gMDsgaWR4IDwgU3VwUmF0ZUxlbjsgaWR4KyspIHsKKwkJCQkJaWYgKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPAorCQkJCQkgICAgKFN1cFJhdGVbaWR4XSAmIDB4N2YpKQorCQkJCQkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9CisJCQkJCQkgICAgU3VwUmF0ZVtpZHhdICYgMHg3ZjsKIAkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7CisKKwkJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IEV4dFJhdGVMZW47IGlkeCsrKSB7CisJCQkJCWlmIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzIDwKKwkJCQkJICAgIChFeHRSYXRlW2lkeF0gJiAweDdmKSkKKwkJCQkJCU1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPQorCQkJCQkJICAgIEV4dFJhdGVbaWR4XSAmIDB4N2Y7CisJCQkJfQorCQkJCS8qIGdvIHRvIHByb2NlZHVyZSBsaXN0ZWQgb24gcGFnZSAzNzYgKi8KKwkJCQlBc3NvY1Bvc3RQcm9jKHBBZCwgQWRkcjIsIENhcGFiaWxpdHlJbmZvLCBBaWQsCisJCQkJCSAgICAgIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsCisJCQkJCSAgICAgIEV4dFJhdGVMZW4sICZFZGNhUGFybSwKKwkJCQkJICAgICAgJkh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkgICAgICAmQWRkSHRJbmZvKTsKKworCQkJCVN0YUFkZE1hY1RhYmxlRW50cnkocEFkLAorCQkJCQkJICAgICZwQWQtPk1hY1RhYi4KKwkJCQkJCSAgICBDb250ZW50W0JTU0lEX1dDSURdLAorCQkJCQkJICAgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMsCisJCQkJCQkgICAgJkh0Q2FwYWJpbGl0eSwKKwkJCQkJCSAgICBIdENhcGFiaWxpdHlMZW4sICZBZGRIdEluZm8sCisJCQkJCQkgICAgQWRkSHRJbmZvTGVuLAorCQkJCQkJICAgIENhcGFiaWxpdHlJbmZvKTsKIAkJCX0KIAkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJICAgIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKIAkJfQotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFBlZXJBc3NvY1JzcEFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CisJfSBlbHNlIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJBU1NPQyAtIFBlZXJBc3NvY1JzcEFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CiAJfQogfQogCkBAIC05NjUsNjEgKzkyNCw2MiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBQZWVyUmVhc3NvY1JzcEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIFBlZXJSZWFzc29jUnNwQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVU0hPUlQgICAgICBDYXBhYmlsaXR5SW5mbzsKLQlVU0hPUlQgICAgICBTdGF0dXM7Ci0JVVNIT1JUICAgICAgQWlkOwotCVVDSEFSICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBTdXBSYXRlTGVuOwotCVVDSEFSICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlTGVuOwotCVVDSEFSICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07Ci0JVUNIQVIgICAgICAgQ2tpcEZsYWc7Ci0JQk9PTEVBTiAgICAgVGltZXJDYW5jZWxsZWQ7Ci0JRURDQV9QQVJNICAgRWRjYVBhcm07Ci0JSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OwotCUFERF9IVF9JTkZPX0lFCQlBZGRIdEluZm87CS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotCVVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuOwotCVVDSEFSCQkJQWRkSHRJbmZvTGVuOwotCVVDSEFSCQkJTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CisJdTE2IENhcGFiaWxpdHlJbmZvOworCXUxNiBTdGF0dXM7CisJdTE2IEFpZDsKKwl1OCBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgU3VwUmF0ZUxlbjsKKwl1OCBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgRXh0UmF0ZUxlbjsKKwl1OCBBZGRyMltNQUNfQUREUl9MRU5dOworCXU4IENraXBGbGFnOworCUJPT0xFQU4gVGltZXJDYW5jZWxsZWQ7CisJc3RydWN0IHJ0X2VkY2FfcGFybSBFZGNhUGFybTsKKwlzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSBIdENhcGFiaWxpdHk7CisJc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llIEFkZEh0SW5mbzsJLyogQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFICovCisJdTggSHRDYXBhYmlsaXR5TGVuOworCXU4IEFkZEh0SW5mb0xlbjsKKwl1OCBOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKIAotCWlmKFBlZXJBc3NvY1JzcFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJkNhcGFiaWxpdHlJbmZvLCAmU3RhdHVzLCAmQWlkLCBTdXBSYXRlLCAmU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgJkV4dFJhdGVMZW4sCi0JCQkJCQkJCSZIdENhcGFiaWxpdHksCSZBZGRIdEluZm8sICZIdENhcGFiaWxpdHlMZW4sICZBZGRIdEluZm9MZW4sJk5ld0V4dENoYW5uZWxPZmZzZXQsICZFZGNhUGFybSwgJkNraXBGbGFnKSkKLQl7Ci0JCWlmKE1BQ19BRERSX0VRVUFMKEFkZHIyLCBwQWQtPk1sbWVBdXguQnNzaWQpKSAvLyBUaGUgZnJhbWUgaXMgZm9yIG1lID8KKwlpZiAoUGVlckFzc29jUnNwU2FuaXR5CisJICAgIChwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJkNhcGFiaWxpdHlJbmZvLCAmU3RhdHVzLAorCSAgICAgJkFpZCwgU3VwUmF0ZSwgJlN1cFJhdGVMZW4sIEV4dFJhdGUsICZFeHRSYXRlTGVuLCAmSHRDYXBhYmlsaXR5LAorCSAgICAgJkFkZEh0SW5mbywgJkh0Q2FwYWJpbGl0eUxlbiwgJkFkZEh0SW5mb0xlbiwgJk5ld0V4dENoYW5uZWxPZmZzZXQsCisJICAgICAmRWRjYVBhcm0sICZDa2lwRmxhZykpIHsKKwkJaWYgKE1BQ19BRERSX0VRVUFMKEFkZHIyLCBwQWQtPk1sbWVBdXguQnNzaWQpKQkvKiBUaGUgZnJhbWUgaXMgZm9yIG1lID8gKi8KIAkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSByZWNlaXZlIFJFQVNTT0NfUlNQIHRvIG1lIChzdGF0dXM9JWQpXG4iLCBTdGF0dXMpKTsKLQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkFTU09DIC0gcmVjZWl2ZSBSRUFTU09DX1JTUCB0byBtZSAoc3RhdHVzPSVkKVxuIiwKKwkJCQkgIFN0YXR1cykpOworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLAorCQkJCQkmVGltZXJDYW5jZWxsZWQpOwogCi0JCQlpZihTdGF0dXMgPT0gTUxNRV9TVUNDRVNTKQotCQkJewotCQkJCS8vIGdvIHRvIHByb2NlZHVyZSBsaXN0ZWQgb24gcGFnZSAzNzYKLQkJCQlBc3NvY1Bvc3RQcm9jKHBBZCwgQWRkcjIsIENhcGFiaWxpdHlJbmZvLCBBaWQsIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sCi0JCQkJCSAmRWRjYVBhcm0sICZIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbiwgJkFkZEh0SW5mbyk7CisJCQlpZiAoU3RhdHVzID09IE1MTUVfU1VDQ0VTUykgeworCQkJCS8qIGdvIHRvIHByb2NlZHVyZSBsaXN0ZWQgb24gcGFnZSAzNzYgKi8KKwkJCQlBc3NvY1Bvc3RQcm9jKHBBZCwgQWRkcjIsIENhcGFiaWxpdHlJbmZvLCBBaWQsCisJCQkJCSAgICAgIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsCisJCQkJCSAgICAgIEV4dFJhdGVMZW4sICZFZGNhUGFybSwKKwkJCQkJICAgICAgJkh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkgICAgICAmQWRkSHRJbmZvKTsKIAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OwotICAgICAgICAgICAgICAgICAgICB3ZXh0X25vdGlmeV9ldmVudF9hc3NvYyhwQWQpOwotCi0gICAgICAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7Ci0gICAgICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKLQotICAgICAgICAgICAgICAgIH0KKwkJCQl7CisJCQkJCXdleHRfbm90aWZ5X2V2ZW50X2Fzc29jKHBBZCk7CisJCQkJCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgU0lPQ0dJV0FQLAorCQkJCQkJCQktMSwKKwkJCQkJCQkJJnBBZC0+TWxtZUF1eC4KKwkJCQkJCQkJQnNzaWRbMF0sIE5VTEwsCisJCQkJCQkJCTApOworCQkJCX0KIAogCQkJfQotCi0JCQl7Ci0JCQkJLy8gQ2tpcEZsYWcgaXMgbm8gdXNlIGZvciByZWFzc29jaWF0ZQotCQkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKLQkJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKLQkJCX0KKwkJCS8qIENraXBGbGFnIGlzIG5vIHVzZSBmb3IgcmVhc3NvY2lhdGUgKi8KKwkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJICAgIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOwogCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gUGVlclJlYXNzb2NSc3BBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworCX0gZWxzZSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQVNTT0MgLSBQZWVyUmVhc3NvY1JzcEFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CiAJfQogCiB9CkBAIC0xMDM0LDMwICs5OTQsMTggQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgQXNzb2NQb3N0UHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcEFkZHIyLAotCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKLQlJTiBVU0hPUlQgQWlkLAotCUlOIFVDSEFSIFN1cFJhdGVbXSwKLQlJTiBVQ0hBUiBTdXBSYXRlTGVuLAotCUlOIFVDSEFSIEV4dFJhdGVbXSwKLQlJTiBVQ0hBUiBFeHRSYXRlTGVuLAotCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAotCUlOIEhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAotCUlOIFVDSEFSIEh0Q2FwYWJpbGl0eUxlbiwKLQlJTiBBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8pCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQordm9pZCBBc3NvY1Bvc3RQcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggKnBBZGRyMiwgdTE2IENhcGFiaWxpdHlJbmZvLCB1MTYgQWlkLCB1OCBTdXBSYXRlW10sIHU4IFN1cFJhdGVMZW4sIHU4IEV4dFJhdGVbXSwgdTggRXh0UmF0ZUxlbiwgc3RydWN0IHJ0X2VkY2FfcGFybSAqcEVkY2FQYXJtLCBzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSAqIHBIdENhcGFiaWxpdHksIHU4IEh0Q2FwYWJpbGl0eUxlbiwgc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llICogcEFkZEh0SW5mbykJLyogQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFICovCiB7Ci0JVUxPTkcgSWR4OworCXVuc2lnbmVkIGxvbmcgSWR4OwogCiAJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBCU1NfSU5GUkE7CiAJQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIHBBZGRyMik7CiAJcEFkLT5NbG1lQXV4LkFpZCA9IEFpZDsKLQlwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8gPSBDYXBhYmlsaXR5SW5mbyAmIFNVUFBPUlRFRF9DQVBBQklMSVRZX0lORk87CisJcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvID0KKwkgICAgQ2FwYWJpbGl0eUluZm8gJiBTVVBQT1JURURfQ0FQQUJJTElUWV9JTkZPOwogCi0JLy8gU29tZSBIVCBBUCBtaWdodCBsb3N0IFdNTSBJRS4gV2UgYWRkIFdNTSBvdXJzZWx2ZXMuIGJlYWN1YXNlIEhUIHJlcXVpcmVzIFFvUyBvbi4KLQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiA+IDApICYmIChwRWRjYVBhcm0tPmJWYWxpZCA9PSBGQUxTRSkpCi0JeworCS8qIFNvbWUgSFQgQVAgbWlnaHQgbG9zdCBXTU0gSUUuIFdlIGFkZCBXTU0gb3Vyc2VsdmVzLiBiZWFjdWFzZSBIVCByZXF1aXJlcyBRb1Mgb24uICovCisJaWYgKChIdENhcGFiaWxpdHlMZW4gPiAwKSAmJiAocEVkY2FQYXJtLT5iVmFsaWQgPT0gRkFMU0UpKSB7CiAJCXBFZGNhUGFybS0+YlZhbGlkID0gVFJVRTsKIAkJcEVkY2FQYXJtLT5BaWZzblswXSA9IDM7CiAJCXBFZGNhUGFybS0+QWlmc25bMV0gPSA3OwpAQCAtMTA3NCw4OCArMTAyMiwxMTMgQEAKIAkJcEVkY2FQYXJtLT5Dd21heFsyXSA9IDQ7CiAJCXBFZGNhUGFybS0+Q3dtYXhbM10gPSAzOwogCi0JCXBFZGNhUGFybS0+VHhvcFswXSAgPSAwOwotCQlwRWRjYVBhcm0tPlR4b3BbMV0gID0gMDsKLQkJcEVkY2FQYXJtLT5UeG9wWzJdICA9IDk2OwotCQlwRWRjYVBhcm0tPlR4b3BbM10gID0gNDg7CisJCXBFZGNhUGFybS0+VHhvcFswXSA9IDA7CisJCXBFZGNhUGFybS0+VHhvcFsxXSA9IDA7CisJCXBFZGNhUGFybS0+VHhvcFsyXSA9IDk2OworCQlwRWRjYVBhcm0tPlR4b3BbM10gPSA0ODsKIAogCX0KIAotCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBFZGNhUGFybSwgcEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7CisJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLCBwRWRjYVBhcm0sIHNpemVvZihzdHJ1Y3QgcnRfZWRjYV9wYXJtKSk7CiAKLQkvLyBmaWx0ZXIgb3V0IHVuLXN1cHBvcnRlZCByYXRlcworCS8qIGZpbHRlciBvdXQgdW4tc3VwcG9ydGVkIHJhdGVzICovCiAJcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4gPSBTdXBSYXRlTGVuOwogCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5TdXBSYXRlLCBTdXBSYXRlLCBTdXBSYXRlTGVuKTsKIAlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5TdXBSYXRlLCAmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4pOwogCi0JLy8gZmlsdGVyIG91dCB1bi1zdXBwb3J0ZWQgcmF0ZXMKKwkvKiBmaWx0ZXIgb3V0IHVuLXN1cHBvcnRlZCByYXRlcyAqLwogCXBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuID0gRXh0UmF0ZUxlbjsKIAlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguRXh0UmF0ZSwgRXh0UmF0ZSwgRXh0UmF0ZUxlbik7CiAJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguRXh0UmF0ZSwgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKTsKIAotCWlmIChIdENhcGFiaWxpdHlMZW4gPiAwKQotCXsKKwlpZiAoSHRDYXBhYmlsaXR5TGVuID4gMCkgewogCQlSVE1QQ2hlY2tIdChwQWQsIEJTU0lEX1dDSUQsIHBIdENhcGFiaWxpdHksIHBBZGRIdEluZm8pOwogCX0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc3NvY1Bvc3RQcm9jPT09PiAgQVAuQU1zZHVTaXplID0gJWQuIENsaWVudFN0YXR1c0ZsYWdzID0gMHglbHggXG4iLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFNc2R1U2l6ZSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5DbGllbnRTdGF0dXNGbGFncykpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJBc3NvY1Bvc3RQcm9jPT09PiAgQVAuQU1zZHVTaXplID0gJWQuIENsaWVudFN0YXR1c0ZsYWdzID0gMHglbHggXG4iLAorCQkgIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplLAorCQkgIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQ2xpZW50U3RhdHVzRmxhZ3MpKTsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+ICAgIChNbXBzPSVkLCBBbXNkdVNpemU9JWQsIClcbiIsCi0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTW1wc01vZGUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkFzc29jUG9zdFByb2M9PT0+ICAgIChNbXBzPSVkLCBBbXNkdVNpemU9JWQsIClcbiIsCisJCSAgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NbXBzTW9kZSwKKwkJICBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFNc2R1U2l6ZSkpOwogCi0JLy8gU2V0IE5ldyBXUEEgaW5mb3JtYXRpb24KKwkvKiBTZXQgTmV3IFdQQSBpbmZvcm1hdGlvbiAqLwogCUlkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIHBBZGRyMiwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOwotCWlmIChJZHggPT0gQlNTX05PVF9GT1VORCkKLQl7CisJaWYgKElkeCA9PSBCU1NfTk9UX0ZPVU5EKSB7CiAJCURCR1BSSU5UX0VSUigoIkFTU09DIC0gQ2FuJ3QgZmluZCBCU1MgYWZ0ZXIgcmVjZWl2aW5nIEFzc29jIHJlc3BvbnNlXG4iKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIEluaXQgdmFyaWFibGUKKwl9IGVsc2UgeworCQkvKiBJbml0IHZhcmlhYmxlICovCiAJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuID0gMDsKLQkJTmRpc1plcm9NZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIE1BWF9MRU5fT0ZfUlNOSUUpOworCQlOZGlzWmVyb01lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwKKwkJCSAgICAgICBNQVhfTEVOX09GX1JTTklFKTsKIAotCQkvLyBTdG9yZSBhcHByb3ByaWF0ZSBSU05fSUUgZm9yIFdQQSBTTSBuZWdvdGlhdGlvbiBsYXRlcgotCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgJiYgKHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlZhcklFTGVuICE9IDApKQotCQl7Ci0JCQlQVUNIQVIgICAgICAgICAgICAgIHBWSUU7Ci0JCQlVU0hPUlQgICAgICAgICAgICAgIGxlbjsKLQkJCVBFSURfU1RSVUNUICAgICAgICAgcEVpZDsKKwkJLyogU3RvcmUgYXBwcm9wcmlhdGUgUlNOX0lFIGZvciBXUEEgU00gbmVnb3RpYXRpb24gbGF0ZXIgKi8KKwkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCSAgICAmJiAocEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVmFySUVMZW4gIT0gMCkpIHsKKwkJCXU4ICpwVklFOworCQkJdTE2IGxlbjsKKwkJCXN0cnVjdCBydF9laWQgKiBwRWlkOwogCiAJCQlwVklFID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVmFySUVzOwotCQkJbGVuCSA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlZhcklFTGVuOworCQkJbGVuID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVmFySUVMZW47CisJCQkvKktIIG5lZWQgdG8gY2hlY2sgYWdhaW4gKi8KKwkJCS8qIERvbid0IGFsbG93IHRvIGdvIHRvIHNsZWVwIG1vZGUgaWYgYXV0aG1vZGUgaXMgV1BBLXJlbGF0ZWQuICovCisJCQkvKlRoaXMgY2FuIG1ha2UgQXV0aGVudGljYXRpb24gcHJvY2VzcyBtb3JlIHNtb290aGx5LiAqLworCQkJUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19DQU5fR09fU0xFRVApOwogCi0JCQl3aGlsZSAobGVuID4gMCkKLQkJCXsKLQkJCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwVklFOwotCQkJCS8vIEZvciBXUEEvV1BBUFNLCi0JCQkJaWYgKChwRWlkLT5FaWQgPT0gSUVfV1BBKSAmJiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXUEFfT1VJLCA0KSkKLQkJCQkJJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSB8fCBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQotCQkJCXsKLQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBWSUUsIChwRWlkLT5MZW4gKyAyKSk7Ci0JCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuID0gKHBFaWQtPkxlbiArIDIpOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc3NvY1Bvc3RQcm9jPT09PiBTdG9yZSBSU05fSUUgZm9yIFdQQSBTTSBuZWdvdGlhdGlvbiBcbiIpKTsKKwkJCXdoaWxlIChsZW4gPiAwKSB7CisJCQkJcEVpZCA9IChzdHJ1Y3QgcnRfZWlkICopIHBWSUU7CisJCQkJLyogRm9yIFdQQS9XUEFQU0sgKi8KKwkJCQlpZiAoKHBFaWQtPkVpZCA9PSBJRV9XUEEpCisJCQkJICAgICYmCisJCQkJICAgIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpKQorCQkJCSAgICAmJiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0KKwkJCQkJTmRpczgwMl8xMUF1dGhNb2RlV1BBCisJCQkJCXx8IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09CisJCQkJCU5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpIHsKKwkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NYWNUYWIuCisJCQkJCQkgICAgICAgQ29udGVudFtCU1NJRF9XQ0lEXS4KKwkJCQkJCSAgICAgICBSU05fSUUsIHBWSUUsCisJCQkJCQkgICAgICAgKHBFaWQtPkxlbiArIDIpKTsKKwkJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS4KKwkJCQkJICAgIFJTTklFX0xlbiA9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgKCJBc3NvY1Bvc3RQcm9jPT09PiBTdG9yZSBSU05fSUUgZm9yIFdQQSBTTSBuZWdvdGlhdGlvbiBcbiIpKTsKIAkJCQl9Ci0JCQkJLy8gRm9yIFdQQTIvV1BBMlBTSwotCQkJCWVsc2UgaWYgKChwRWlkLT5FaWQgPT0gSUVfUlNOKSAmJiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0ICsgMiwgUlNOX09VSSwgMykpCi0JCQkJCSYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyIHx8IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQotCQkJCXsKLQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBWSUUsIChwRWlkLT5MZW4gKyAyKSk7Ci0JCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuID0gKHBFaWQtPkxlbiArIDIpOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc3NvY1Bvc3RQcm9jPT09PiBTdG9yZSBSU05fSUUgZm9yIFdQQTIgU00gbmVnb3RpYXRpb24gXG4iKSk7CisJCQkJLyogRm9yIFdQQTIvV1BBMlBTSyAqLworCQkJCWVsc2UgaWYgKChwRWlkLT5FaWQgPT0gSUVfUlNOKQorCQkJCQkgJiYKKwkJCQkJIChOZGlzRXF1YWxNZW1vcnkKKwkJCQkJICAocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkKKwkJCQkJICYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkJCQkgICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIKKwkJCQkJICAgICB8fCBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkJCQkgICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKSB7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWFjVGFiLgorCQkJCQkJICAgICAgIENvbnRlbnRbQlNTSURfV0NJRF0uCisJCQkJCQkgICAgICAgUlNOX0lFLCBwVklFLAorCQkJCQkJICAgICAgIChwRWlkLT5MZW4gKyAyKSk7CisJCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uCisJCQkJCSAgICBSU05JRV9MZW4gPSAocEVpZC0+TGVuICsgMik7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICgiQXNzb2NQb3N0UHJvYz09PT4gU3RvcmUgUlNOX0lFIGZvciBXUEEyIFNNIG5lZ290aWF0aW9uIFxuIikpOwogCQkJCX0KIAogCQkJCXBWSUUgKz0gKHBFaWQtPkxlbiArIDIpOwotCQkJCWxlbiAgLT0gKHBFaWQtPkxlbiArIDIpOworCQkJCWxlbiAtPSAocEVpZC0+TGVuICsgMik7CiAJCQl9CisKIAkJfQogCi0JCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbiA9PSAwKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc3NvY1Bvc3RQcm9jPT09PiBubyBSU05fSUUgXG4iKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQloZXhfZHVtcCgiUlNOX0lFIiwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuKTsKKwkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuID09IDApIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkFzc29jUG9zdFByb2M9PT0+IG5vIFJTTl9JRSBcbiIpKTsKKwkJfSBlbHNlIHsKKwkJCWhleF9kdW1wKCJSU05fSUUiLAorCQkJCSBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwKKwkJCQkgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4pOwogCQl9CiAJfQogfQpAQCAtMTE3MSw0MyArMTE0NCwzNiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBQZWVyRGlzYXNzb2NBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBQZWVyRGlzYXNzb2NBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlVU0hPUlQgICAgICAgIFJlYXNvbjsKKwl1OCBBZGRyMltNQUNfQUREUl9MRU5dOworCXUxNiBSZWFzb247CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFBlZXJEaXNhc3NvY0FjdGlvbigpXG4iKSk7Ci0JaWYoUGVlckRpc2Fzc29jU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCAmUmVhc29uKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gUGVlckRpc2Fzc29jQWN0aW9uKCkgUmVhc29uID0gJWRcbiIsIFJlYXNvbikpOwotCQlpZiAoSU5GUkFfT04ocEFkKSAmJiBNQUNfQUREUl9FUVVBTChwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgQWRkcjIpKQotCQl7CisJaWYgKFBlZXJEaXNhc3NvY1Nhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJlJlYXNvbikpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJBU1NPQyAtIFBlZXJEaXNhc3NvY0FjdGlvbigpIFJlYXNvbiA9ICVkXG4iLAorCQkJICBSZWFzb24pKTsKKwkJaWYgKElORlJBX09OKHBBZCkKKwkJICAgICYmIE1BQ19BRERSX0VRVUFMKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBBZGRyMikpIHsKIAotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQotCQkJewotCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RJU0FTU09DX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpIHsKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLAorCQkJCQkJICAgICAgSVdfRElTQVNTT0NfRVZFTlRfRkxBRywKKwkJCQkJCSAgICAgIHBBZC0+TWFjVGFiLgorCQkJCQkJICAgICAgQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLAorCQkJCQkJICAgICAgQlNTMCwgMCk7CiAJCQl9CiAKLQkJCS8vCi0JCQkvLyBHZXQgQ3VycmVudCBTeXN0ZW0gdGltZSBhbmQgVHVybiBvbiBBZGphY2VudEFQUmVwb3J0Ci0JCQkvLwotCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUExpbmtEb3duVGltZSk7Ci0JCQlwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQUmVwb3J0RmxhZyA9IFRSVUU7CiAJCQlMaW5rRG93bihwQWQsIFRSVUUpOwogCQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwogCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OwotICAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKLSAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7Ci0gICAgICAgICAgICB9CisJCQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIFNJT0NHSVdBUCwgLTEsIE5VTEwsIE5VTEwsCisJCQkJCQkwKTsKIAkJfQotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFBlZXJEaXNhc3NvY0FjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CisJfSBlbHNlIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJBU1NPQyAtIFBlZXJEaXNhc3NvY0FjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CiAJfQogCiB9CkBAIC0xMjIzLDExICsxMTg5LDkgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgQXNzb2NUaW1lb3V0QWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgQXNzb2NUaW1lb3V0QWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVU0hPUlQgIFN0YXR1czsKKwl1MTYgU3RhdHVzOwogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gQXNzb2NUaW1lb3V0QWN0aW9uXG4iKSk7CiAJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwogCVN0YXR1cyA9IE1MTUVfUkVKX1RJTUVPVVQ7CkBAIC0xMjQzLDExICsxMjA3LDkgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgUmVhc3NvY1RpbWVvdXRBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBSZWFzc29jVGltZW91dEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVVNIT1JUICBTdGF0dXM7CisJdTE2IFN0YXR1czsKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFJlYXNzb2NUaW1lb3V0QWN0aW9uXG4iKSk7CiAJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwogCVN0YXR1cyA9IE1MTUVfUkVKX1RJTUVPVVQ7CkBAIC0xMjYzLDUxICsxMjI1LDQ5IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIERpc2Fzc29jVGltZW91dEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIERpc2Fzc29jVGltZW91dEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVVNIT1JUICBTdGF0dXM7CisJdTE2IFN0YXR1czsKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIERpc2Fzc29jVGltZW91dEFjdGlvblxuIikpOwogCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKIAlTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7Ci0JTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RJU0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ESVNBU1NPQ19DT05GLCAyLAorCQkgICAgJlN0YXR1cyk7CiB9CiAKLVZPSUQgSW52YWxpZFN0YXRlV2hlbkFzc29jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgSW52YWxpZFN0YXRlV2hlbkFzc29jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVU0hPUlQgIFN0YXR1czsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIEludmFsaWRTdGF0ZVdoZW5Bc3NvYyhzdGF0ZT0lbGQpLCByZXNldCBBU1NPQyBzdGF0ZSBtYWNoaW5lXG4iLAotCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSkpOworCXUxNiBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkFTU09DIC0gSW52YWxpZFN0YXRlV2hlbkFzc29jKHN0YXRlPSVsZCksIHJlc2V0IEFTU09DIHN0YXRlIG1hY2hpbmVcbiIsCisJCSAgcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUpKTsKIAlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CiAJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKIAlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CiB9CiAKLVZPSUQgSW52YWxpZFN0YXRlV2hlblJlYXNzb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVVNIT1JUIFN0YXR1czsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIEludmFsaWRTdGF0ZVdoZW5SZWFzc29jKHN0YXRlPSVsZCksIHJlc2V0IEFTU09DIHN0YXRlIG1hY2hpbmVcbiIsCi0JCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlKSk7CisJdTE2IFN0YXR1czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiQVNTT0MgLSBJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyhzdGF0ZT0lbGQpLCByZXNldCBBU1NPQyBzdGF0ZSBtYWNoaW5lXG4iLAorCQkgIHBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlKSk7CiAJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwogCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CiAJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CiB9CiAKLVZPSUQgSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIEludmFsaWRTdGF0ZVdoZW5EaXNhc3NvY2lhdGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVU0hPUlQgU3RhdHVzOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jKHN0YXRlPSVsZCksIHJlc2V0IEFTU09DIHN0YXRlIG1hY2hpbmVcbiIsCi0JCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlKSk7CisJdTE2IFN0YXR1czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiQVNTT0MgLSBJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2Moc3RhdGU9JWxkKSwgcmVzZXQgQVNTT0Mgc3RhdGUgbWFjaGluZVxuIiwKKwkJICBwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSkpOwogCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKIAlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOwotCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ESVNBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfRElTQVNTT0NfQ09ORiwgMiwKKwkJICAgICZTdGF0dXMpOwogfQogCiAvKgpAQCAtMTMyMywzMyArMTI4MywzMSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBDbHMzZXJyQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIpCit2b2lkIENsczNlcnJBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCAqcEFkZHIpCiB7Ci0JSEVBREVSXzgwMl8xMSAgICAgICAgIERpc2Fzc29jSGRyOwotCVBIRUFERVJfODAyXzExICAgICAgICBwRGlzYXNzb2NIZHI7Ci0JUFVDSEFSICAgICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCVVMT05HICAgICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0JTkRJU19TVEFUVVMgICAgICAgICAgIE5TdGF0dXM7Ci0JVVNIT1JUICAgICAgICAgICAgICAgIFJlYXNvbiA9IFJFQVNPTl9DTFMzRVJSOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIERpc2Fzc29jSGRyOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcERpc2Fzc29jSGRyOworCXU4ICpwT3V0QnVmZmVyID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuID0gMDsKKwlpbnQgTlN0YXR1czsKKwl1MTYgUmVhc29uID0gUkVBU09OX0NMUzNFUlI7CiAKLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CS8qR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkgKi8KIAlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQogCQlyZXR1cm47CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIENsYXNzIDMgRXJyb3IsIFNlbmQgRElTQVNTT0MgZnJhbWVcbiIpKTsKLQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkRpc2Fzc29jSGRyLCBTVUJUWVBFX0RJU0FTU09DLCAwLCBwQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwkvLyBwYXRjaCBwZWFwIHR0bHMgc3dpdGNoaW5nIGlzc3VlCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKLQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksJkRpc2Fzc29jSGRyLAotCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAmUmVhc29uLAotCQkJCQkgIEVORF9PRl9BUkdTKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiQVNTT0MgLSBDbGFzcyAzIEVycm9yLCBTZW5kIERJU0FTU09DIGZyYW1lXG4iKSk7CisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZEaXNhc3NvY0hkciwgU1VCVFlQRV9ESVNBU1NPQywgMCwgcEFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsJLyogcGF0Y2ggcGVhcCB0dGxzIHN3aXRjaGluZyBpc3N1ZSAqLworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICZGcmFtZUxlbiwKKwkJCSAgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSwgJkRpc2Fzc29jSGRyLAorCQkJICAyLCAmUmVhc29uLCBFTkRfT0ZfQVJHUyk7CiAJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CiAKLQkvLyBUbyBwYXRjaCBJbnN0YW5jZSBhbmQgQnVmZmFsbyhOKSBBUAotCS8vIERyaXZlciBoYXMgdG8gc2VuZCBkZWF1dGggdG8gSW5zdGFuY2UgQVAsIGJ1dCBCdWZmYWxvKE4pIG5lZWRzIHRvIHNlbmQgZGlzYXNzb2MgdG8gcmVzZXQgQXV0aGVudGljYXRvcidzIHN0YXRlIG1hY2hpbmUKLQkvLyBUaGVyZWZvcmUsIHdlIHNlbmQgYm90aCBvZiB0aGVtLgotCXBEaXNhc3NvY0hkciA9IChQSEVBREVSXzgwMl8xMSlwT3V0QnVmZmVyOworCS8qIFRvIHBhdGNoIEluc3RhbmNlIGFuZCBCdWZmYWxvKE4pIEFQICovCisJLyogRHJpdmVyIGhhcyB0byBzZW5kIGRlYXV0aCB0byBJbnN0YW5jZSBBUCwgYnV0IEJ1ZmZhbG8oTikgbmVlZHMgdG8gc2VuZCBkaXNhc3NvYyB0byByZXNldCBBdXRoZW50aWNhdG9yJ3Mgc3RhdGUgbWFjaGluZSAqLworCS8qIFRoZXJlZm9yZSwgd2Ugc2VuZCBib3RoIG9mIHRoZW0uICovCisJcERpc2Fzc29jSGRyID0gKHN0cnVjdCBydF9oZWFkZXJfODAyXzExICopIHBPdXRCdWZmZXI7CiAJcERpc2Fzc29jSGRyLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9ERUFVVEg7CiAJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CiAKQEAgLTEzNTksMzUyICsxMzE3LDI3MSBAQAogCUNPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuRGlzYXNzb2NTdGEsIHBBZGRyKTsKIH0KIAotIC8qCi0JID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JIERlc2NyaXB0aW9uOgotCQkgU3dpdGNoIGJldHdlZW4gV0VQIGFuZCBDS0lQIHVwb24gbmV3IGFzc29jaWF0aW9uIHVwLgotCSBQYXJhbWV0ZXJzOgotCi0JIElSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICovCi1WT0lEIFN3aXRjaEJldHdlZW5XZXBBbmRDa2lwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoraW50IHdleHRfbm90aWZ5X2V2ZW50X2Fzc29jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlpbnQgICAgICAgICAgICBpOwotCVNIQVJFREtFWV9NT0RFX1NUUlVDICBjc3IxOworCWNoYXIgY3VzdG9tW0lXX0NVU1RPTV9NQVhdID0geyAwIH07CiAKLQkvLyBpZiBLUCBpcyByZXF1aXJlZC4gY2hhbmdlIHRoZSBDaXBoZXJBbGcgaW4gaGFyZHdhcmUgc2hhcmQga2V5IHRhYmxlIGZyb20gV0VQCi0JLy8gdG8gQ0tJUC4gZWxzZSByZW1haW4gYXMgV0VQCi0JaWYgKHBBZC0+U3RhQ2ZnLmJDa2lwT24gJiYgKHBBZC0+U3RhQ2ZnLkNraXBGbGFnICYgMHgxMCkpCi0JewotCQkvLyBtb2RpZnkgaGFyZHdhcmUga2V5IHRhYmxlIHNvIHRoYXQgTUFDIHVzZSBjb3JyZWN0IGFsZ29yaXRobSB0byBkZWNyeXB0IFJYCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UsICZjc3IxLndvcmQpOwotCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9PSBDSVBIRVJfV0VQNjQpCi0JCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVA2NDsKLQkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9PSBDSVBIRVJfV0VQMTI4KQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENJUEhFUl9DS0lQMTI4OwotCi0JCWlmIChjc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkKLQkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDY0OwotCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID09IENJUEhFUl9XRVAxMjgpCi0JCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVAxMjg7Ci0KLQkJaWYgKGNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDY0KQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IENJUEhFUl9DS0lQNjQ7Ci0JCWVsc2UgaWYgKGNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDEyOCkKLQkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDEyODsKLQotCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9PSBDSVBIRVJfV0VQNjQpCi0JCQljc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVA2NDsKLQkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9PSBDSVBIRVJfV0VQMTI4KQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IENJUEhFUl9DS0lQMTI4OwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSwgY3NyMS53b3JkKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3dpdGNoQmV0d2VlbldlcEFuZENraXA6IG1vZGlmeSBCU1MwIGNpcGhlciB0byAlc1xuIiwgQ2lwaGVyTmFtZVtjc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnXSkpOwotCi0JCS8vIG1vZGlmeSBzb2Z0d2FyZSBrZXkgdGFibGUgc28gdGhhdCBkcml2ZXIgY2FuIHNwZWNpZnkgY29ycmVjdCBhbGdvcml0aG0gaW4gVFhEIHVwb24gVFgKLQkJZm9yIChpPTA7IGk8U0hBUkVfS0VZX05VTTsgaSsrKQotCQl7Ci0JCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkKLQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDY0OwotCQkJZWxzZSBpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID09IENJUEhFUl9XRVAxMjgpCi0JCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVAxMjg7Ci0JCX0KLQl9Ci0KLQkvLyBlbHNlIGlmIEtQIE5PVCBpbnVzZWQuIGNoYW5nZSB0aGUgQ2lwaGVyQWxnIGluIGhhcmR3YXJlIHNoYXJkIGtleSB0YWJsZSBmcm9tIENLSVAKLQkvLyB0byBXRVAuCi0JZWxzZQotCXsKLQkJLy8gbW9kaWZ5IGhhcmR3YXJlIGtleSB0YWJsZSBzbyB0aGF0IE1BQyB1c2UgY29ycmVjdCBhbGdvcml0aG0gdG8gZGVjcnlwdCBSWAotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFLCAmY3NyMS53b3JkKTsKLQkJaWYgKGNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVA2NCkKLQkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0JCWVsc2UgaWYgKGNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVAxMjgpCi0JCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLQotCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDY0KQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLQkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDEyOCkKLQkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotCi0JCWlmIChjc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQNjQpCi0JCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQMTI4KQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0KLQkJaWYgKGNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVA2NCkKLQkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0JCWVsc2UgaWYgKGNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVAxMjgpCi0JCQljc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLQotCQkvLyBtb2RpZnkgc29mdHdhcmUga2V5IHRhYmxlIHNvIHRoYXQgZHJpdmVyIGNhbiBzcGVjaWZ5IGNvcnJlY3QgYWxnb3JpdGhtIGluIFRYRCB1cG9uIFRYCi0JCWZvciAoaT0wOyBpPFNIQVJFX0tFWV9OVU07IGkrKykKLQkJewotCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDY0KQotCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLQkJCWVsc2UgaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDEyOCkKLQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotCQl9Ci0KLQkJLy8KLQkJLy8gT24gV1BBLU5PTkUsIG11c3QgdXBkYXRlIENpcGhlckFsZy4KLQkJLy8gQmVjYXVzZSB0aGUgT0lEXzgwMl8xMV9XRVBfU1RBVFVTIHdhcyBiZWVuIHNldCBhZnRlciBPSURfODAyXzExX0FERF9LRVkKLQkJLy8gYW5kIENpcGhlckFsZyB3aWxsIGJlIENJUEhFUl9OT05FIGJ5IFdpbmRvd3MgWmVyb0NvbmZpZy4KLQkJLy8gU28gd2UgbmVlZCB0byB1cGRhdGUgQ2lwaGVyQWxnIGFmdGVyIGNvbm5lY3QuCi0JCS8vCi0JCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotCQl7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgU0hBUkVfS0VZX05VTTsgaSsrKQotCQkJewotCQkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5LZXlMZW4gIT0gMCkKLQkJCQl7Ci0JCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLQkJCQkJewotCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JCQkJCXsKLQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0JCQkJfQotCQkJfQotCi0JCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnOwotCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzFdLkNpcGhlckFsZzsKLQkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVsyXS5DaXBoZXJBbGc7Ci0JCQljc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bM10uQ2lwaGVyQWxnOwotCQl9Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFLCBjc3IxLndvcmQpOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTd2l0Y2hCZXR3ZWVuV2VwQW5kQ2tpcDogbW9kaWZ5IEJTUzAgY2lwaGVyIHRvICVzXG4iLCBDaXBoZXJOYW1lW2NzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGddKSk7Ci0JfQotfQotCi1pbnQgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MoCi0JSU4gIFJUTVBfQURBUFRFUiAqcEFkKQotewotICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKLSAgICBjaGFyIGN1c3RvbVtJV19DVVNUT01fTUFYXSA9IHswfTsKLQotICAgIGlmIChwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiA8PSBJV19DVVNUT01fTUFYKQotICAgIHsKLSAgICAgICAgd3JxdS5kYXRhLmxlbmd0aCA9IHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuOwotICAgICAgICBtZW1jcHkoY3VzdG9tLCBwQWQtPlN0YUNmZy5SZXFWYXJJRXMsIHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuKTsKLSAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZBU1NPQ1JFUUlFLCAmd3JxdSwgY3VzdG9tKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiA+IE1BWF9DVVNUT01fTEVOXG4iKSk7CisJaWYgKHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuIDw9IElXX0NVU1RPTV9NQVgpIHsKKwkJTmRpc01vdmVNZW1vcnkoY3VzdG9tLCBwQWQtPlN0YUNmZy5SZXFWYXJJRXMsCisJCQkgICAgICAgcEFkLT5TdGFDZmcuUmVxVmFySUVMZW4pOworCQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIElXRVZBU1NPQ1JFUUlFLCAtMSwgTlVMTCwgY3VzdG9tLAorCQkJCQlwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbik7CisJfSBlbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgicEFkLT5TdGFDZmcuUmVxVmFySUVMZW4gPiBNQVhfQ1VTVE9NX0xFTlxuIikpOwogCiAJcmV0dXJuIDA7CiAKIH0KIAotI2lmZGVmIFJUMjg3MAotQk9PTEVBTiBTdGFBZGRNYWNUYWJsZUVudHJ5KAotCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5LAotCUlOICBVQ0hBUgkJCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzLAotCUlOICBIVF9DQVBBQklMSVRZX0lFCSpwSHRDYXBhYmlsaXR5LAotCUlOICBVQ0hBUgkJCQlIdENhcGFiaWxpdHlMZW4sCi0JSU4gIFVTSE9SVCAgICAgICAgCQlDYXBhYmlsaXR5SW5mbykKK0JPT0xFQU4gU3RhQWRkTWFjVGFibGVFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LAorCQkJICAgIHU4IE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMsCisJCQkgICAgc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHlfaWUgKiBwSHRDYXBhYmlsaXR5LAorCQkJICAgIHU4IEh0Q2FwYWJpbGl0eUxlbiwKKwkJCSAgICBzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUgKiBwQWRkSHRJbmZvLAorCQkJICAgIHU4IEFkZEh0SW5mb0xlbiwgdTE2IENhcGFiaWxpdHlJbmZvKQogewotCVVDSEFSICAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7CisJdTggTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7CiAKIAlpZiAoQURIT0NfT04ocEFkKSkKIAkJQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpOwogCi0Jc3dpdGNoIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzKQotICAgIHsKLSAgICAgICAgY2FzZSAxMDg6IE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzU0OyAgIGJyZWFrOwotICAgICAgICBjYXNlIDk2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNDg7ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNzI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8zNjsgICBicmVhazsKLSAgICAgICAgY2FzZSA0ODogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI0OyAgIGJyZWFrOwotICAgICAgICBjYXNlIDM2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTg7ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMjsgICBicmVhazsKLSAgICAgICAgY2FzZSAxODogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzk7ICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNjsgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKLSAgICAgICAgY2FzZSAxMTogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzVfNTsgIGJyZWFrOwotICAgICAgICBjYXNlIDQ6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjsgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xOyAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOyAgIGJyZWFrOwotICAgIH0KKwlzd2l0Y2ggKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMpIHsKKwljYXNlIDEwODoKKwkJTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNTQ7CisJCWJyZWFrOworCWNhc2UgOTY6CisJCU1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzQ4OworCQlicmVhazsKKwljYXNlIDcyOgorCQlNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8zNjsKKwkJYnJlYWs7CisJY2FzZSA0ODoKKwkJTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjQ7CisJCWJyZWFrOworCWNhc2UgMzY6CisJCU1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE4OworCQlicmVhazsKKwljYXNlIDI0OgorCQlNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMjsKKwkJYnJlYWs7CisJY2FzZSAxODoKKwkJTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfOTsKKwkJYnJlYWs7CisJY2FzZSAxMjoKKwkJTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNjsKKwkJYnJlYWs7CisJY2FzZSAyMjoKKwkJTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7CisJCWJyZWFrOworCWNhc2UgMTE6CisJCU1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzVfNTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yOworCQlicmVhazsKKwljYXNlIDI6CisJCU1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCU1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOworCQlicmVhazsKKwl9CiAKLSAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykgJiYgKE1heFN1cHBvcnRlZFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykKKwkgICAgJiYgKE1heFN1cHBvcnRlZFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkpCisJCXJldHVybiBGQUxTRTsKIAotCS8vIDExbiBvbmx5Ci0JaWYgKCgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzJfNEcpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKSYmIChIdENhcGFiaWxpdHlMZW4gPT0gMCkpCisJLyogMTFuIG9ubHkgKi8KKwlpZiAoKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fMl80RykKKwkgICAgIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKQorCSAgICAmJiAoSHRDYXBhYmlsaXR5TGVuID09IDApKQogCQlyZXR1cm4gRkFMU0U7CiAKIAlpZiAoIXBFbnRyeSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gRkFMU0U7CiAKIAlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotCWlmIChwRW50cnkpCi0JeworCWlmIChwRW50cnkpIHsKIAkJcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOwogCQlpZiAoKE1heFN1cHBvcnRlZFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkgfHwKLQkJCShwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpKQotCQl7CisJCSAgICAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKSkgewogCQkJcEVudHJ5LT5SYXRlTGVuID0gNDsKIAkJCWlmIChNYXhTdXBwb3J0ZWRSYXRlID49IFJBVEVfRklSU1RfT0ZETV9SQVRFKQogCQkJCU1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOwotCQl9Ci0JCWVsc2UKKwkJfSBlbHNlCiAJCQlwRW50cnktPlJhdGVMZW4gPSAxMjsKIAogCQlwRW50cnktPk1heEhUUGh5TW9kZS53b3JkID0gMDsKIAkJcEVudHJ5LT5NaW5IVFBoeU1vZGUud29yZCA9IDA7CiAJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSAwOwogCQlwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPSBNYXhTdXBwb3J0ZWRSYXRlOwotCQlpZiAocEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpCi0JCXsKKwkJaWYgKHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA8IFJBVEVfRklSU1RfT0ZETV9SQVRFKSB7CiAJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPQorCQkJICAgIHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKIAkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKLQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9CisJCQkgICAgcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOwogCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOwogCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPQorCQkJICAgIE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CiAJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9CisJCQkgICAgT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKIAkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0KKwkJCSAgICBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOwogCQl9CiAJCXBFbnRyeS0+Q2FwYWJpbGl0eUluZm8gPSBDYXBhYmlsaXR5SW5mbzsKLQkJQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSk7Ci0JCUNMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1BJR0dZQkFDS19DQVBBQkxFKTsKKwkJQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKHBFbnRyeSwKKwkJCQkJIGZDTElFTlRfU1RBVFVTX0FHR1JFR0FUSU9OX0NBUEFCTEUpOworCQlDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcocEVudHJ5LAorCQkJCQkgZkNMSUVOVF9TVEFUVVNfUElHR1lCQUNLX0NBUEFCTEUpOwogCX0KIAotCS8vIElmIHRoaXMgRW50cnkgc3VwcG9ydHMgODAyLjExbiwgdXBncmFkZSB0byBIVCByYXRlLgotCWlmICgoSHRDYXBhYmlsaXR5TGVuICE9IDApICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQotCXsKLQkJVUNIQVIJaiwgYml0bWFzazsgLy9rLGJpdG1hc2s7Ci0JCUNIQVIgICAgaTsKKwlOZGlzWmVyb01lbW9yeSgmcEVudHJ5LT5IVENhcGFiaWxpdHksIHNpemVvZihwRW50cnktPkhUQ2FwYWJpbGl0eSkpOworCS8qIElmIHRoaXMgRW50cnkgc3VwcG9ydHMgODAyLjExbiwgdXBncmFkZSB0byBIVCByYXRlLiAqLworCWlmICgoSHRDYXBhYmlsaXR5TGVuICE9IDApCisJICAgICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKSB7CisJCXU4IGosIGJpdG1hc2s7CS8qayxiaXRtYXNrOyAqLworCQljaGFyIGk7CiAKIAkJaWYgKEFESE9DX09OKHBBZCkpCi0JCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpOwotCQlpZiAoKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5HRikgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRikpCi0JCXsKKwkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LAorCQkJCQkgICAgICAgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpOworCQlpZiAoKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5HRikKKwkJICAgICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YpKSB7CiAJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7Ci0JCX0KLQkJZWxzZQotCQl7CisJCX0gZWxzZSB7CiAJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKIAkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTm9uR0YgPSBUUlVFOwogCQkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID0gMTsKIAkJfQogCi0JCWlmICgocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkNoYW5uZWxXaWR0aCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgpKQotCQl7Ci0JCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVz0gQldfNDA7Ci0JCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwKSYocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3I0MCkpOwotCQl9Ci0JCWVsc2UKLQkJeworCQlpZiAoKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5DaGFubmVsV2lkdGgpICYmCisJCSAgICAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCkgJiYKKwkJICAgICgocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisJCSAgICAgfHwgKChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKwkJCSAmJiAocEFkZEh0SW5mby0+QWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0KKwkJCSAgICAgcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby4KKwkJCSAgICAgRXh0Q2hhbk9mZnNldCkpKSkgeworCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV180MDsKKwkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPQorCQkJICAgICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LgorCQkJICAgICAgU2hvcnRHSWZvcjQwKSAmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uCisJCQkJCSAgICAgICBTaG9ydEdJZm9yNDApKTsKKwkJfSBlbHNlIHsKIAkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7Ci0JCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwKSYocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3IyMCkpOworCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9CisJCQkgICAgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuCisJCQkgICAgICBTaG9ydEdJZm9yMjApICYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby4KKwkJCQkJICAgICAgIFNob3J0R0lmb3IyMCkpOwogCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb24yME9ubHkgPSBUUlVFOwogCQl9CiAKLQkJLy8gMyozCi0JCWlmIChwQWQtPk1BQ1ZlcnNpb24gPj0gUkFMSU5LXzI4ODNfVkVSU0lPTiAmJiBwQWQtPk1BQ1ZlcnNpb24gPCBSQUxJTktfMzA3MF9WRVJTSU9OKQotCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuVHhCRiA9IHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5UeEJGOworCQkvKiAzKjMgKi8KKwkJaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMjg4M19WRVJTSU9OCisJCSAgICAmJiBwQWQtPk1BQ1ZlcnNpb24gPCBSQUxJTktfMzA3MF9WRVJTSU9OKQorCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuVHhCRiA9CisJCQkgICAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlR4QkY7CiAKLQkJLy8gZmluZCBtYXggZml4ZWQgcmF0ZQotCQlmb3IgKGk9MjM7IGk+PTA7IGktLSkgLy8gMyozCisJCS8qIGZpbmQgbWF4IGZpeGVkIHJhdGUgKi8KKwkJZm9yIChpID0gMjM7IGkgPj0gMDsgaS0tKQkvKiAzKjMgKi8KIAkJewotCQkJaiA9IGkvODsKLQkJCWJpdG1hc2sgPSAoMTw8KGktKGoqOCkpKTsKLQkJCWlmICgocEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mby5NQ1NTZXRbal0gJiBiaXRtYXNrKSAmJiAocEh0Q2FwYWJpbGl0eS0+TUNTU2V0W2pdICYgYml0bWFzaykpCi0JCQl7CisJCQlqID0gaSAvIDg7CisJCQliaXRtYXNrID0gKDEgPDwgKGkgLSAoaiAqIDgpKSk7CisJCQlpZiAoKHBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm8uTUNTU2V0W2pdICYgYml0bWFzaykKKwkJCSAgICAmJiAocEh0Q2FwYWJpbGl0eS0+TUNTU2V0W2pdICYgYml0bWFzaykpIHsKIAkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBpOwogCQkJCWJyZWFrOwogCQkJfQotCQkJaWYgKGk9PTApCisJCQlpZiAoaSA9PSAwKQogCQkJCWJyZWFrOwogCQl9CiAKLQotCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgIT0gTUNTX0FVVE8pCi0JCXsKLQkJCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9PSAzMikKLQkJCXsKLQkJCQkvLyBGaXggTUNTIGFzIEhUIER1cGxpY2F0ZWQgTW9kZQorCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgIT0gTUNTX0FVVE8pIHsKKwkJCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9PSAzMikgeworCQkJCS8qIEZpeCBNQ1MgYXMgSFQgRHVwbGljYXRlZCBNb2RlICovCiAJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSAxOwogCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOwogCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAwOwogCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAwOwogCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IDMyOwotCQkJfQotCQkJZWxzZSBpZiAocEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID4gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUykKLQkJCXsKLQkJCQkvLyBTVEEgc3VwcG9ydHMgZml4ZWQgTUNTCi0JCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCX0gZWxzZSBpZiAocEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID4KKwkJCQkgICBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTKSB7CisJCQkJLyogU1RBIHN1cHBvcnRzIGZpeGVkIE1DUyAqLworCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9CisJCQkJICAgIHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CiAJCQl9CiAJCX0KIAotCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TVEJDID0gKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5SeFNUQkMgJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQykpOworCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TVEJDID0KKwkJICAgIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uCisJCSAgICAgUnhTVEJDICYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpKTsKIAkJcEVudHJ5LT5NcGR1RGVuc2l0eSA9IHBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKLQkJcEVudHJ5LT5NYXhSQW1wZHVGYWN0b3IgPSBwSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yOwotCQlwRW50cnktPk1tcHNNb2RlID0gKFVDSEFSKXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5NaW1vUHM7Ci0JCXBFbnRyeS0+QU1zZHVTaXplID0gKFVDSEFSKXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5BTXNkdVNpemU7CisJCXBFbnRyeS0+TWF4UkFtcGR1RmFjdG9yID0KKwkJICAgIHBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3I7CisJCXBFbnRyeS0+TW1wc01vZGUgPSAodTgpcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLk1pbW9QczsKKwkJcEVudHJ5LT5BTXNkdVNpemUgPSAodTgpcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkFNc2R1U2l6ZTsKIAkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7CiAKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSAmJiAocEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9PSBGQUxTRSkpCi0JCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VEKTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZQorCQkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPT0gRkFMU0UpKQorCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksCisJCQkJCSAgICAgICBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQpOwogCQlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3IyMCkKLQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFKTsKKwkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LAorCQkJCQkgICAgICAgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRSk7CiAJCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjQwKQotCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUpOworCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksCisJCQkJCSAgICAgICBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKTsKIAkJaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5UeFNUQkMpCi0JCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUpOworCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksCisJCQkJCSAgICAgICBmQ0xJRU5UX1NUQVRVU19UeFNUQkNfQ0FQQUJMRSk7CiAJCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uUnhTVEJDKQotCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1J4U1RCQ19DQVBBQkxFKTsKKwkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LAorCQkJCQkgICAgICAgZkNMSUVOVF9TVEFUVVNfUnhTVEJDX0NBUEFCTEUpOwogCQlpZiAocEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlBsdXNIVEMpCi0JCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfSFRDX0NBUEFCTEUpOwotCQlpZiAocEFkLT5Db21tb25DZmcuYlJkZyAmJiBwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCkKLQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7CisJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwKKwkJCQkJICAgICAgIGZDTElFTlRfU1RBVFVTX0hUQ19DQVBBQkxFKTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcKKwkJICAgICYmIHBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0KQorCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksCisJCQkJCSAgICAgICBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7CiAJCWlmIChwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uTUNTRmVlZGJhY2sgPT0gMHgwMykKLQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19NQ1NGRUVEQkFDS19DQVBBQkxFKTsKLQl9Ci0JZWxzZQotCXsKKwkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LAorCQkJCQkgICAgICAgZkNMSUVOVF9TVEFUVVNfTUNTRkVFREJBQ0tfQ0FQQUJMRSk7CisJCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPkhUQ2FwYWJpbGl0eSwgcEh0Q2FwYWJpbGl0eSwKKwkJCSAgICAgICBIdENhcGFiaWxpdHlMZW4pOworCX0gZWxzZSB7CiAJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uSXNMZWdhY3kgPSBUUlVFOwogCX0KIAotCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPkhUQ2FwYWJpbGl0eSwgcEh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKLQogCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkOwogCXBFbnRyeS0+Q3VyclR4UmF0ZSA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKIAotCS8vIFNldCBhc2ljIGF1dG8gZmFsbCBiYWNrCi0JaWYgKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IFRSVUUpCi0JewotCQlQVUNIQVIJCQkJCXBUYWJsZTsKLQkJVUNIQVIJCQkJCVRhYmxlU2l6ZSA9IDA7CisJLyogU2V0IGFzaWMgYXV0byBmYWxsIGJhY2sgKi8KKwlpZiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gVFJVRSkgeworCQl1OCAqcFRhYmxlOworCQl1OCBUYWJsZVNpemUgPSAwOwogCi0JCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsIHBFbnRyeSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJnBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KTsKKwkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLAorCQkJCSAgICAgICZwRW50cnktPkN1cnJUeFJhdGVJbmRleCk7CiAJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOwotCX0KLQllbHNlCi0JewotCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREU7Ci0JCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUwk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJfSBlbHNlIHsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFOworCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOwogCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7CiAKLQkJLy8gSWYgdGhlIGxlZ2FjeSBtb2RlIGlzIHNldCwgb3ZlcndyaXRlIHRoZSB0cmFuc21pdCBzZXR0aW5nIG9mIHRoaXMgZW50cnkuCi0JCVJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoKFVDSEFSKXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUsIHBFbnRyeSk7CisJCS8qIElmIHRoZSBsZWdhY3kgbW9kZSBpcyBzZXQsIG92ZXJ3cml0ZSB0aGUgdHJhbnNtaXQgc2V0dGluZyBvZiB0aGlzIGVudHJ5LiAqLworCQlSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKCh1OClwQWQtPlN0YUNmZy4KKwkJCQkJICBEZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLgorCQkJCQkgIEZpeGVkVHhNb2RlLCBwRW50cnkpOwogCX0KIAogCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKQEAgLTE3MTUsMTUgKzE1OTIsMTQgQEAKIAogCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CiAKLSAgICB7Ci0gICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKLSAgICAgICAgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MocEFkKTsKKwl7CisJCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwkJd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MocEFkKTsKIAotICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7Ci0gICAgICAgIG1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBNQUNfQUREUl9MRU4pOwotICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisJCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKwkJbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7CisJCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKIAotICAgIH0KKwl9CiAJcmV0dXJuIFRSVUU7CiB9Ci0jZW5kaWYgLyogUlQyODcwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hdXRoLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hdXRoLmMKaW5kZXggZDg0MTRlYS4uNDA0YmQyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXV0aC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2F1dGguYwpAQCAtNTUsMjcgKzU1LDM1IEBACiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwogCi12b2lkIEF1dGhTdGF0ZU1hY2hpbmVJbml0KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFNUQVRFX01BQ0hJTkUgKlNtLAotICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKK3ZvaWQgQXV0aFN0YXRlTWFjaGluZUluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICBzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSAqU20sIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKIHsKLSAgICBTdGF0ZU1hY2hpbmVJbml0KFNtLCBUcmFucywgTUFYX0FVVEhfU1RBVEUsIE1BWF9BVVRIX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylEcm9wLCBBVVRIX1JFUV9JRExFLCBBVVRIX01BQ0hJTkVfQkFTRSk7CisJU3RhdGVNYWNoaW5lSW5pdChTbSwgVHJhbnMsIE1BWF9BVVRIX1NUQVRFLCBNQVhfQVVUSF9NU0csCisJCQkgKFNUQVRFX01BQ0hJTkVfRlVOQykgRHJvcCwgQVVUSF9SRVFfSURMRSwKKwkJCSBBVVRIX01BQ0hJTkVfQkFTRSk7CiAKLSAgICAvLyB0aGUgZmlyc3QgY29sdW1uCi0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1JFUV9JRExFLCBNVDJfTUxNRV9BVVRIX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lQXV0aFJlcUFjdGlvbik7CisJLyogdGhlIGZpcnN0IGNvbHVtbiAqLworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9SRVFfSURMRSwgTVQyX01MTUVfQVVUSF9SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBNbG1lQXV0aFJlcUFjdGlvbik7CiAKLSAgICAvLyB0aGUgc2Vjb25kIGNvbHVtbgotICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTIsIE1UMl9NTE1FX0FVVEhfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5BdXRoKTsKLSAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVEyLCBNVDJfUEVFUl9BVVRIX0VWRU4sIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckF1dGhSc3BBdFNlcTJBY3Rpb24pOwotICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTIsIE1UMl9BVVRIX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpQXV0aFRpbWVvdXRBY3Rpb24pOworCS8qIHRoZSBzZWNvbmQgY29sdW1uICovCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRMiwgTVQyX01MTUVfQVVUSF9SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBJbnZhbGlkU3RhdGVXaGVuQXV0aCk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRMiwgTVQyX1BFRVJfQVVUSF9FVkVOLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgUGVlckF1dGhSc3BBdFNlcTJBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTIsIE1UMl9BVVRIX1RJTUVPVVQsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBBdXRoVGltZW91dEFjdGlvbik7CiAKLSAgICAvLyB0aGUgdGhpcmQgY29sdW1uCi0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRNCwgTVQyX01MTUVfQVVUSF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkF1dGgpOwotICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTQsIE1UMl9QRUVSX0FVVEhfRVZFTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQXV0aFJzcEF0U2VxNEFjdGlvbik7Ci0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRNCwgTVQyX0FVVEhfVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylBdXRoVGltZW91dEFjdGlvbik7CisJLyogdGhlIHRoaXJkIGNvbHVtbiAqLworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTQsIE1UMl9NTE1FX0FVVEhfUkVRLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgSW52YWxpZFN0YXRlV2hlbkF1dGgpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTQsIE1UMl9QRUVSX0FVVEhfRVZFTiwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJBdXRoUnNwQXRTZXE0QWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVE0LCBNVDJfQVVUSF9USU1FT1VULAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgQXV0aFRpbWVvdXRBY3Rpb24pOwogCi0JUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oQXV0aFRpbWVvdXQpLCBwQWQsIEZBTFNFKTsKKwlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsCisJCSAgICAgIEdFVF9USU1FUl9GVU5DVElPTihBdXRoVGltZW91dCksIHBBZCwgRkFMU0UpOwogfQogCiAvKgpAQCAtODcsMzEgKzk1LDI4IEBACiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEF1dGhUaW1lb3V0KAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLSAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3ZvaWQgQXV0aFRpbWVvdXQodm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpCiB7Ci0gICAgUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopRnVuY3Rpb25Db250ZXh0OwogCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBVVRIIC0gQXV0aFRpbWVvdXRcbiIpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gQXV0aFRpbWVvdXRcbiIpKTsKIAotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJLyogRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuICovCisJLyogVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0ICovCisJaWYgKFJUTVBfVEVTVF9GTEFHCisJICAgIChwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCiAJCXJldHVybjsKIAotCS8vIHNlbmQgYSBkZS1hdXRoIHRvIHJlc2V0IEFQJ3Mgc3RhdGUgbWFjaGluZSAoUGF0Y2ggQVAtRGlyNjM1KQorCS8qIHNlbmQgYSBkZS1hdXRoIHRvIHJlc2V0IEFQJ3Mgc3RhdGUgbWFjaGluZSAoUGF0Y2ggQVAtRGlyNjM1KSAqLwogCWlmIChwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID09IEFVVEhfV0FJVF9TRVEyKQogCQlDbHMyZXJyQWN0aW9uKHBBZCwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKIAotCi0gICAgTWxtZUVucXVldWUocEFkLCBBVVRIX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX1RJTUVPVVQsIDAsIE5VTEwpOwotICAgIFJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwlNbG1lRW5xdWV1ZShwQWQsIEFVVEhfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfVElNRU9VVCwgMCwgTlVMTCk7CisJUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKIH0KIAotCiAvKgogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgRGVzY3JpcHRpb246CkBAIC0xMjAsNjcgKzEyNSwxOSBAQAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBNbG1lQXV0aFJlcUFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIE1sbWVBdXRoUmVxQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgQWRkcls2XTsKLSAgICBVU0hPUlQgICAgICAgICAgICAgQWxnLCBTZXEsIFN0YXR1czsKLSAgICBVTE9ORyAgICAgICAgICAgICAgVGltZW91dDsKLSAgICBIRUFERVJfODAyXzExICAgICAgQXV0aEhkcjsKLSAgICBCT09MRUFOICAgICAgICAgICAgVGltZXJDYW5jZWxsZWQ7Ci0gICAgTkRJU19TVEFUVVMgICAgICAgIE5TdGF0dXM7Ci0gICAgUFVDSEFSICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotICAgIFVMT05HICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisJaWYgKEFVVEhfUmVxU2VuZAorCSAgICAocEFkLCBFbGVtLCAmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgIkFVVEgiLCAxLCBOVUxMLCAwKSkKKwkJcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfV0FJVF9TRVEyOworCWVsc2UgeworCQl1MTYgU3RhdHVzOwogCi0JLy8gQmxvY2sgYWxsIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kCi0JaWYgKHBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID09IFRSVUUpCi0JewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gQmxvY2sgQXV0aCByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIpKTsKLSAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgICAgIFN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7Ci0gICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOworCQlwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwKKwkJCSAgICAmU3RhdHVzKTsKIAl9Ci0gICAgZWxzZSBpZihNbG1lQXV0aFJlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyLCAmVGltZW91dCwgJkFsZykpCi0gICAgewotICAgICAgICAvLyByZXNldCB0aW1lcgotICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsICZUaW1lckNhbmNlbGxlZCk7Ci0gICAgICAgIENPUFlfTUFDX0FERFIocEFkLT5NbG1lQXV4LkJzc2lkLCBBZGRyKTsKLSAgICAgICAgcEFkLT5NbG1lQXV4LkFsZyAgPSBBbGc7Ci0gICAgICAgIFNlcSA9IDE7Ci0gICAgICAgIFN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKLQotICAgICAgICBOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotICAgICAgICBpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBNbG1lQXV0aFJlcUFjdGlvbihBbGc6JWQpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWRcbiIsIEFsZykpOwotICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgICAgICAgICBTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7Ci0gICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBTZW5kIEFVVEggcmVxdWVzdCBzZXEjMSAoQWxnPSVkKS4uLlxuIiwgQWxnKSk7Ci0gICAgICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmQXV0aEhkciwgU1VCVFlQRV9BVVRILCAwLCBBZGRyLCBwQWQtPk1sbWVBdXguQnNzaWQpOwotICAgICAgICBNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEVBREVSXzgwMl8xMSksJkF1dGhIZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAmQWxnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgJlNlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICZTdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKLSAgICAgICAgTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0gICAgCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0KLSAgICAgICAgUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCBUaW1lb3V0KTsKLSAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfV0FJVF9TRVEyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBEQkdQUklOVF9FUlIoKCJBVVRIIC0gTWxtZUF1dGhSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbGVkXG4iKSk7Ci0gICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOwotICAgICAgICBTdGF0dXMgPSBNTE1FX0lOVkFMSURfRk9STUFUOwotICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKLSAgICB9CiB9CiAKIC8qCkBAIC0xOTEsMTAyICsxNDgsMTMwIEBACiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIFBlZXJBdXRoUnNwQXRTZXEyQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgUGVlckF1dGhSc3BBdFNlcTJBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotICAgIFVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLSAgICBVU0hPUlQgICAgICAgIFNlcSwgU3RhdHVzLCBSZW1vdGVTdGF0dXMsIEFsZzsKLSAgICBVQ0hBUiAgICAgICAgIENobGdUZXh0W0NJUEhFUl9URVhUX0xFTl07Ci0gICAgVUNIQVIgICAgICAgICBDeXBlckNobGdUZXh0W0NJUEhFUl9URVhUX0xFTiArIDggKyA4XTsKLSAgICBVQ0hBUiAgICAgICAgIEVsZW1lbnRbMl07Ci0gICAgSEVBREVSXzgwMl8xMSBBdXRoSGRyOwotICAgIEJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7Ci0gICAgUFVDSEFSICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLSAgICBORElTX1NUQVRVUyAgIE5TdGF0dXM7Ci0gICAgVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0gICAgVVNIT1JUICAgICAgICBTdGF0dXMyOworCXU4IEFkZHIyW01BQ19BRERSX0xFTl07CisJdTE2IFNlcSwgU3RhdHVzLCBSZW1vdGVTdGF0dXMsIEFsZzsKKwl1OCBDaGxnVGV4dFtDSVBIRVJfVEVYVF9MRU5dOworCXU4IEN5cGVyQ2hsZ1RleHRbQ0lQSEVSX1RFWFRfTEVOICsgOCArIDhdOworCXU4IEVsZW1lbnRbMl07CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgQXV0aEhkcjsKKwlCT09MRUFOIFRpbWVyQ2FuY2VsbGVkOworCXU4ICpwT3V0QnVmZmVyID0gTlVMTDsKKwlpbnQgTlN0YXR1czsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuID0gMDsKKwl1MTYgU3RhdHVzMjsKIAotICAgIGlmIChQZWVyQXV0aFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJkFsZywgJlNlcSwgJlN0YXR1cywgQ2hsZ1RleHQpKQotICAgIHsKLSAgICAgICAgaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQWRkcjIpICYmIFNlcSA9PSAyKQotICAgICAgICB7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gUmVjZWl2ZSBBVVRIX1JTUCBzZXEjMiB0byBtZSAoQWxnPSVkLCBTdGF0dXM9JWQpXG4iLCBBbGcsIFN0YXR1cykpOwotICAgICAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCWlmIChQZWVyQXV0aFNhbml0eQorCSAgICAocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZBbGcsICZTZXEsICZTdGF0dXMsCisJICAgICAoY2hhciAqKUNobGdUZXh0KSkgeworCQlpZiAoTUFDX0FERFJfRVFVQUwocEFkLT5NbG1lQXV4LkJzc2lkLCBBZGRyMikgJiYgU2VxID09IDIpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkFVVEggLSBSZWNlaXZlIEFVVEhfUlNQIHNlcSMyIHRvIG1lIChBbGc9JWQsIFN0YXR1cz0lZClcbiIsCisJCQkJICBBbGcsIFN0YXR1cykpOworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLAorCQkJCQkmVGltZXJDYW5jZWxsZWQpOwogCi0gICAgICAgICAgICBpZiAoU3RhdHVzID09IE1MTUVfU1VDQ0VTUykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBBdXRoZW50aWNhdGlvbiBNb2RlICJMRUFQIiBoYXMgYWxsb3cgZm9yIENDWCAxLlgKLSAgICAgICAgICAgICAgICBpZiAoKHBBZC0+TWxtZUF1eC5BbGcgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKLQkJCQkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKLSAgICAgICAgICAgICAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIDIuIHNoYXJlZCBrZXksIG5lZWQgdG8gYmUgY2hhbGxlbmdlZAotICAgICAgICAgICAgICAgICAgICBTZXErKzsKLSAgICAgICAgICAgICAgICAgICAgUmVtb3RlU3RhdHVzID0gTUxNRV9TVUNDRVNTOworCQkJaWYgKFN0YXR1cyA9PSBNTE1FX1NVQ0NFU1MpIHsKKwkJCQkvKiBBdXRoZW50aWNhdGlvbiBNb2RlICJMRUFQIiBoYXMgYWxsb3cgZm9yIENDWCAxLlggKi8KKwkJCQlpZiAocEFkLT5NbG1lQXV4LkFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKSB7CisJCQkJCXBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPQorCQkJCQkgICAgQVVUSF9SRVFfSURMRTsKKwkJCQkJTWxtZUVucXVldWUocEFkLAorCQkJCQkJICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCQkJICAgIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIDIuIHNoYXJlZCBrZXksIG5lZWQgdG8gYmUgY2hhbGxlbmdlZCAqLworCQkJCQlTZXErKzsKKwkJCQkJUmVtb3RlU3RhdHVzID0gTUxNRV9TVUNDRVNTOwogCi0JCQkJCS8vIEdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0gICAgICAgICAgICAgICAgICAgIE5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFBlZXJBdXRoUnNwQXRTZXEyQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxcbiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzMiA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQorCQkJCQkvKiBHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeSAqLworCQkJCQlOU3RhdHVzID0KKwkJCQkJICAgIE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsCisJCQkJCQkJICAgICAgICZwT3V0QnVmZmVyKTsKKwkJCQkJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkJICgiQVVUSCAtIFBlZXJBdXRoUnNwQXRTZXEyQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxcbiIpKTsKKwkJCQkJCXBBZC0+TWxtZS5BdXRoTWFjaGluZS4KKwkJCQkJCSAgICBDdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworCQkJCQkJU3RhdHVzMiA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKKwkJCQkJCU1sbWVFbnF1ZXVlKHBBZCwKKwkJCQkJCQkgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJCQkJICAgIE1UMl9BVVRIX0NPTkYsIDIsCisJCQkJCQkJICAgICZTdGF0dXMyKTsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQogCi0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBTZW5kIEFVVEggcmVxdWVzdCBzZXEjMy4uLlxuIikpOwotICAgICAgICAgICAgICAgICAgICBNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkF1dGhIZHIsIFNVQlRZUEVfQVVUSCwgMCwgQWRkcjIsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7Ci0gICAgICAgICAgICAgICAgICAgIEF1dGhIZHIuRkMuV2VwID0gMTsKLSAgICAgICAgICAgICAgICAgICAgLy8gRW5jcnlwdCBjaGFsbGVuZ2UgdGV4dCAmIGF1dGggaW5mb3JtYXRpb24KLSAgICAgICAgICAgICAgICAgICAgUlRNUEluaXRXZXBFbmdpbmUoCi0gICAgICAgICAgICAgICAgICAgIAlwQWQsCi0gICAgICAgICAgICAgICAgICAgIAlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwKLSAgICAgICAgICAgICAgICAgICAgCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKLSAgICAgICAgICAgICAgICAgICAgCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuLAotICAgICAgICAgICAgICAgICAgICAJQ3lwZXJDaGxnVGV4dCk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICgiQVVUSCAtIFNlbmQgQVVUSCByZXF1ZXN0IHNlcSMzLi4uXG4iKSk7CisJCQkJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQXV0aEhkciwKKwkJCQkJCQkgU1VCVFlQRV9BVVRILCAwLCBBZGRyMiwKKwkJCQkJCQkgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKwkJCQkJQXV0aEhkci5GQy5XZXAgPSAxOworCQkJCQkvKiBFbmNyeXB0IGNoYWxsZW5nZSB0ZXh0ICYgYXV0aCBpbmZvcm1hdGlvbiAqLworCQkJCQlSVE1QSW5pdFdlcEVuZ2luZShwQWQsCisJCQkJCQkJICBwQWQtPgorCQkJCQkJCSAgU2hhcmVkS2V5W0JTUzBdW3BBZC0+CisJCQkJCQkJCQkgIFN0YUNmZy4KKwkJCQkJCQkJCSAgRGVmYXVsdEtleUlkXS4KKwkJCQkJCQkgIEtleSwKKwkJCQkJCQkgIHBBZC0+U3RhQ2ZnLgorCQkJCQkJCSAgRGVmYXVsdEtleUlkLAorCQkJCQkJCSAgcEFkLT4KKwkJCQkJCQkgIFNoYXJlZEtleVtCU1MwXVtwQWQtPgorCQkJCQkJCQkJICBTdGFDZmcuCisJCQkJCQkJCQkgIERlZmF1bHRLZXlJZF0uCisJCQkJCQkJICBLZXlMZW4sCisJCQkJCQkJICBDeXBlckNobGdUZXh0KTsKIAotCQkJCQlBbGcgPSBjcHUybGUxNigqKFVTSE9SVCAqKSZBbGcpOwotCQkJCQlTZXEgPSBjcHUybGUxNigqKFVTSE9SVCAqKSZTZXEpOwotCQkJCQlSZW1vdGVTdGF0dXM9IGNwdTJsZTE2KCooVVNIT1JUICopJlJlbW90ZVN0YXR1cyk7CisJCQkJCUFsZyA9IGNwdTJsZTE2KCoodTE2ICopICYgQWxnKTsKKwkJCQkJU2VxID0gY3B1MmxlMTYoKih1MTYgKikgJiBTZXEpOworCQkJCQlSZW1vdGVTdGF0dXMgPQorCQkJCQkgICAgY3B1MmxlMTYoKih1MTYgKikgJgorCQkJCQkJICAgICBSZW1vdGVTdGF0dXMpOwogCi0JCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsIChQVUNIQVIpICZBbGcsIEN5cGVyQ2hsZ1RleHQgKyA0LCAyKTsKLQkJCQkJUlRNUEVuY3J5cHREYXRhKHBBZCwgKFBVQ0hBUikgJlNlcSwgQ3lwZXJDaGxnVGV4dCArIDYsIDIpOwotCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCAoUFVDSEFSKSAmUmVtb3RlU3RhdHVzLCBDeXBlckNobGdUZXh0ICsgOCwgMik7CisJCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsICh1OCAqKSYgQWxnLAorCQkJCQkJCUN5cGVyQ2hsZ1RleHQgKyA0LCAyKTsKKwkJCQkJUlRNUEVuY3J5cHREYXRhKHBBZCwgKHU4ICopJiBTZXEsCisJCQkJCQkJQ3lwZXJDaGxnVGV4dCArIDYsIDIpOworCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLAorCQkJCQkJCSh1OCAqKSYgUmVtb3RlU3RhdHVzLAorCQkJCQkJCUN5cGVyQ2hsZ1RleHQgKyA4LCAyKTsKIAkJCQkJRWxlbWVudFswXSA9IDE2OwogCQkJCQlFbGVtZW50WzFdID0gMTI4OwotCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCBFbGVtZW50LCBDeXBlckNobGdUZXh0ICsgMTAsIDIpOwotCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCBDaGxnVGV4dCwgQ3lwZXJDaGxnVGV4dCArIDEyLCAxMjgpOworCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCBFbGVtZW50LAorCQkJCQkJCUN5cGVyQ2hsZ1RleHQgKyAxMCwgMik7CisJCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsIENobGdUZXh0LAorCQkJCQkJCUN5cGVyQ2hsZ1RleHQgKyAxMiwKKwkJCQkJCQkxMjgpOwogCQkJCQlSVE1QU2V0SUNWKHBBZCwgQ3lwZXJDaGxnVGV4dCArIDE0MCk7Ci0gICAgICAgICAgICAgICAgICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICZBdXRoSGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSVBIRVJfVEVYVF9MRU4gKyAxNiwgICAgIEN5cGVyQ2hsZ1RleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKLSAgICAgICAgICAgICAgICAgICAgTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0gICAgICAgICAgICAgICAgCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICZGcmFtZUxlbiwKKwkJCQkJCQkgIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSksCisJCQkJCQkJICAmQXV0aEhkciwKKwkJCQkJCQkgIENJUEhFUl9URVhUX0xFTiArIDE2LAorCQkJCQkJCSAgQ3lwZXJDaGxnVGV4dCwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLAorCQkJCQkJCSAgRnJhbWVMZW4pOworCQkJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwogCi0gICAgICAgICAgICAgICAgICAgIFJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgQVVUSF9USU1FT1VUKTsKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfV0FJVF9TRVE0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoRmFpbFJlYXNvbiA9IFN0YXR1czsKLSAgICAgICAgICAgICAgICBDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkF1dGhGYWlsU3RhLCBBZGRyMik7Ci0gICAgICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgICAgICAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFBlZXJBdXRoU2FuaXR5KCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKLSAgICB9CisJCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwKKwkJCQkJCSAgICAgQVVUSF9USU1FT1VUKTsKKwkJCQkJcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9CisJCQkJCSAgICBBVVRIX1dBSVRfU0VRNDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXBBZC0+U3RhQ2ZnLkF1dGhGYWlsUmVhc29uID0gU3RhdHVzOworCQkJCUNPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuQXV0aEZhaWxTdGEsIEFkZHIyKTsKKwkJCQlwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCQkgICAgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkFVVEggLSBQZWVyQXV0aFNhbml0eSgpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CisJfQogfQogCiAvKgpAQCAtMjk3LDM2ICsyODIsMzUgQEAKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgUGVlckF1dGhSc3BBdFNlcTRBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBQZWVyQXV0aFJzcEF0U2VxNEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0gICAgVUNIQVIgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotICAgIFVTSE9SVCAgICAgICAgQWxnLCBTZXEsIFN0YXR1czsKLSAgICBDSEFSICAgICAgICAgIENobGdUZXh0W0NJUEhFUl9URVhUX0xFTl07Ci0gICAgQk9PTEVBTiAgICAgICBUaW1lckNhbmNlbGxlZDsKKwl1OCBBZGRyMltNQUNfQUREUl9MRU5dOworCXUxNiBBbGcsIFNlcSwgU3RhdHVzOworCWNoYXIgQ2hsZ1RleHRbQ0lQSEVSX1RFWFRfTEVOXTsKKwlCT09MRUFOIFRpbWVyQ2FuY2VsbGVkOwogCi0gICAgaWYoUGVlckF1dGhTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZBbGcsICZTZXEsICZTdGF0dXMsIENobGdUZXh0KSkKLSAgICB7Ci0gICAgICAgIGlmKE1BQ19BRERSX0VRVUFMKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQWRkcjIpICYmIFNlcSA9PSA0KQotICAgICAgICB7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gUmVjZWl2ZSBBVVRIX1JTUCBzZXEjNCB0byBtZVxuIikpOwotICAgICAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCWlmIChQZWVyQXV0aFNhbml0eQorCSAgICAocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZBbGcsICZTZXEsICZTdGF0dXMsCisJICAgICBDaGxnVGV4dCkpIHsKKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQWRkcjIpICYmIFNlcSA9PSA0KSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJBVVRIIC0gUmVjZWl2ZSBBVVRIX1JTUCBzZXEjNCB0byBtZVxuIikpOworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLAorCQkJCQkmVGltZXJDYW5jZWxsZWQpOwogCi0gICAgICAgICAgICBpZiAoU3RhdHVzICE9IE1MTUVfU1VDQ0VTUykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoRmFpbFJlYXNvbiA9IFN0YXR1czsKLSAgICAgICAgICAgICAgICBDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkF1dGhGYWlsU3RhLCBBZGRyMik7Ci0gICAgICAgICAgICB9CisJCQlpZiAoU3RhdHVzICE9IE1MTUVfU1VDQ0VTUykgeworCQkJCXBBZC0+U3RhQ2ZnLkF1dGhGYWlsUmVhc29uID0gU3RhdHVzOworCQkJCUNPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuQXV0aEZhaWxTdGEsIEFkZHIyKTsKKwkJCX0KIAotICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gUGVlckF1dGhSc3BBdFNlcTRBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOwotICAgIH0KKwkJCXBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwKKwkJCQkgICAgMiwgJlN0YXR1cyk7CisJCX0KKwl9IGVsc2UgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkFVVEggLSBQZWVyQXV0aFJzcEF0U2VxNEFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CisJfQogfQogCiAvKgpAQCAtMzM3LDQ3ICszMjEsNDkgQEAKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgTWxtZURlYXV0aFJlcUFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIE1sbWVEZWF1dGhSZXFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotICAgIE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgKnBJbmZvOwotICAgIEhFQURFUl84MDJfMTEgRGVhdXRoSGRyOwotICAgIFBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0gICAgTkRJU19TVEFUVVMgICBOU3RhdHVzOwotICAgIFVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOwotICAgIFVTSE9SVCAgICAgICAgU3RhdHVzOworCXN0cnVjdCBydF9tbG1lX2RlYXV0aF9yZXEgKnBJbmZvOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIERlYXV0aEhkcjsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJaW50IE5TdGF0dXM7CisJdW5zaWduZWQgbG9uZyBGcmFtZUxlbiA9IDA7CisJdTE2IFN0YXR1czsKIAotICAgIHBJbmZvID0gKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgKilFbGVtLT5Nc2c7CisJcEluZm8gPSAoc3RydWN0IHJ0X21sbWVfZGVhdXRoX3JlcSAqKUVsZW0tPk1zZzsKIAotICAgIE5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0gICAgaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBNbG1lRGVhdXRoUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxcbiIpKTsKLSAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgICAgIFN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKLSAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RFQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwkvKkdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5ICovCisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkFVVEggLSBNbG1lRGVhdXRoUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxcbiIpKTsKKwkJcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisJCVN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RFQVVUSF9DT05GLCAyLAorCQkJICAgICZTdGF0dXMpOworCQlyZXR1cm47CisJfQogCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFNlbmQgREUtQVVUSCByZXF1ZXN0IChSZWFzb249JWQpLi4uXG4iLCBwSW5mby0+UmVhc29uKSk7Ci0gICAgTWd0TWFjSGVhZGVySW5pdChwQWQsICZEZWF1dGhIZHIsIFNVQlRZUEVfREVBVVRILCAwLCBwSW5mby0+QWRkciwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKLSAgICBNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAotICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIRUFERVJfODAyXzExKSwmRGVhdXRoSGRyLAotICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAmcEluZm8tPlJlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7Ci0gICAgTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkFVVEggLSBTZW5kIERFLUFVVEggcmVxdWVzdCAoUmVhc29uPSVkKS4uLlxuIiwKKwkJICBwSW5mby0+UmVhc29uKSk7CisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZEZWF1dGhIZHIsIFNVQlRZUEVfREVBVVRILCAwLCBwSW5mby0+QWRkciwKKwkJCSBwQWQtPk1sbWVBdXguQnNzaWQpOworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICZGcmFtZUxlbiwgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSwKKwkJCSAgJkRlYXV0aEhkciwgMiwgJnBJbmZvLT5SZWFzb24sIEVORF9PRl9BUkdTKTsKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIAlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwogCi0gICAgcEFkLT5TdGFDZmcuRGVhdXRoUmVhc29uID0gcEluZm8tPlJlYXNvbjsKLSAgICBDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkRlYXV0aFN0YSwgcEluZm8tPkFkZHIpOwotICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOwotICAgIFN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKLSAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfREVBVVRIX0NPTkYsIDIsICZTdGF0dXMpOworCXBBZC0+U3RhQ2ZnLkRlYXV0aFJlYXNvbiA9IHBJbmZvLT5SZWFzb247CisJQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5EZWF1dGhTdGEsIHBJbmZvLT5BZGRyKTsKKwlwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKwlTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RFQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKIAotCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3IgZGVhdXRoZW50aWNhdGlvbgorCS8qIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3IgZGVhdXRoZW50aWNhdGlvbiAqLwogCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfREVBVVRIX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RFQVVUSF9FVkVOVF9GTEFHLAorCQkJCSAgICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwKKwkJCQkgICAgICBCU1MwLCAwKTsKIH0KIAogLyoKQEAgLTM4OCwxNSArMzc0LDEzIEBACiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEF1dGhUaW1lb3V0QWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgQXV0aFRpbWVvdXRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotICAgIFVTSE9SVCBTdGF0dXM7Ci0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIEF1dGhUaW1lb3V0QWN0aW9uXG4iKSk7Ci0gICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgU3RhdHVzID0gTUxNRV9SRUpfVElNRU9VVDsKLSAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKKwl1MTYgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBBdXRoVGltZW91dEFjdGlvblxuIikpOworCXBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworCVN0YXR1cyA9IE1MTUVfUkVKX1RJTUVPVVQ7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CiB9CiAKIC8qCkBAIC00MDcsMTUgKzM5MSwxNSBAQAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBJbnZhbGlkU3RhdGVXaGVuQXV0aCgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIEludmFsaWRTdGF0ZVdoZW5BdXRoKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLSAgICBVU0hPUlQgU3RhdHVzOwotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBJbnZhbGlkU3RhdGVXaGVuQXV0aCAoc3RhdGU9JWxkKSwgcmVzZXQgQVVUSCBzdGF0ZSBtYWNoaW5lXG4iLCBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlKSk7Ci0gICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKLSAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKKwl1MTYgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJBVVRIIC0gSW52YWxpZFN0YXRlV2hlbkF1dGggKHN0YXRlPSVsZCksIHJlc2V0IEFVVEggc3RhdGUgbWFjaGluZVxuIiwKKwkJICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlKSk7CisJcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKIH0KIAogLyoKQEAgLTQzMCwzMSArNDE0LDEwNCBAQAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBDbHMyZXJyQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFBVQ0hBUiBwQWRkcikKK3ZvaWQgQ2xzMmVyckFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4ICpwQWRkcikKIHsKLSAgICBIRUFERVJfODAyXzExIERlYXV0aEhkcjsKLSAgICBQVUNIQVIgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotICAgIE5ESVNfU1RBVFVTICAgTlN0YXR1czsKLSAgICBVTE9ORyAgICAgICAgIEZyYW1lTGVuID0gMDsKLSAgICBVU0hPUlQgICAgICAgIFJlYXNvbiA9IFJFQVNPTl9DTFMyRVJSOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIERlYXV0aEhkcjsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJaW50IE5TdGF0dXM7CisJdW5zaWduZWQgbG9uZyBGcmFtZUxlbiA9IDA7CisJdTE2IFJlYXNvbiA9IFJFQVNPTl9DTFMyRVJSOwogCi0gICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLSAgICBpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotICAgICAgICByZXR1cm47CisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJLypHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeSAqLworCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXJldHVybjsKIAotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBDbGFzcyAyIGVycm9yLCBTZW5kIERFQVVUSCBmcmFtZS4uLlxuIikpOwotICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmRGVhdXRoSGRyLCBTVUJUWVBFX0RFQVVUSCwgMCwgcEFkZHIsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7Ci0gICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKLSAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEVBREVSXzgwMl8xMSksJkRlYXV0aEhkciwKLSAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgJlJlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7Ci0gICAgTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkFVVEggLSBDbGFzcyAyIGVycm9yLCBTZW5kIERFQVVUSCBmcmFtZS4uLlxuIikpOworCU1ndE1hY0hlYWRlckluaXQocEFkLCAmRGVhdXRoSGRyLCBTVUJUWVBFX0RFQVVUSCwgMCwgcEFkZHIsCisJCQkgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAmRnJhbWVMZW4sIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSksCisJCQkgICZEZWF1dGhIZHIsIDIsICZSZWFzb24sIEVORF9PRl9BUkdTKTsKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIAlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwogCi0gICAgcEFkLT5TdGFDZmcuRGVhdXRoUmVhc29uID0gUmVhc29uOwotICAgIENPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuRGVhdXRoU3RhLCBwQWRkcik7CisJcEFkLT5TdGFDZmcuRGVhdXRoUmVhc29uID0gUmVhc29uOworCUNPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuRGVhdXRoU3RhLCBwQWRkcik7CiB9CiAKK0JPT0xFQU4gQVVUSF9SZXFTZW5kKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpwRWxlbSwKKwkJICAgICBzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyICpwQXV0aFRpbWVyLAorCQkgICAgIGNoYXIgKnBTTU5hbWUsCisJCSAgICAgdTE2IFNlcU5vLAorCQkgICAgIHU4ICpwTmV3RWxlbWVudCwgdW5zaWduZWQgbG9uZyBFbGVtZW50TGVuKQoreworCXUxNiBBbGcsIFNlcSwgU3RhdHVzOworCXU4IEFkZHJbNl07CisJdW5zaWduZWQgbG9uZyBUaW1lb3V0OworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIEF1dGhIZHI7CisJQk9PTEVBTiBUaW1lckNhbmNlbGxlZDsKKwlpbnQgTlN0YXR1czsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBGcmFtZUxlbiA9IDAsIHRtcCA9IDA7CiAKKwkvKiBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QgKi8KKwlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIiVzIC0gQmxvY2sgQXV0aCByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIsCisJCQkgIHBTTU5hbWUpKTsKKwkJcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisJCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsCisJCQkgICAgJlN0YXR1cyk7CisJfSBlbHNlCisJICAgIGlmIChNbG1lQXV0aFJlcVNhbml0eQorCQkocEFkLCBwRWxlbS0+TXNnLCBwRWxlbS0+TXNnTGVuLCBBZGRyLCAmVGltZW91dCwgJkFsZykpIHsKKwkJLyogcmVzZXQgdGltZXIgKi8KKwkJUlRNUENhbmNlbFRpbWVyKHBBdXRoVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwkJQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIEFkZHIpOworCQlwQWQtPk1sbWVBdXguQWxnID0gQWxnOworCQlTZXEgPSBTZXFObzsKKwkJU3RhdHVzID0gTUxNRV9TVUNDRVNTOworCisJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CS8qR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkgKi8KKwkJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiJXMgLSBNbG1lQXV0aFJlcUFjdGlvbihBbGc6JWQpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWRcbiIsCisJCQkJICBwU01OYW1lLCBBbGcpKTsKKwkJCXBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworCQkJU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOworCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwKKwkJCQkgICAgMiwgJlN0YXR1cyk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIiVzIC0gU2VuZCBBVVRIIHJlcXVlc3Qgc2VxIzEgKEFsZz0lZCkuLi5cbiIsIHBTTU5hbWUsCisJCQkgIEFsZykpOworCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkF1dGhIZHIsIFNVQlRZUEVfQVVUSCwgMCwgQWRkciwKKwkJCQkgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgJkZyYW1lTGVuLCBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpLAorCQkJCSAgJkF1dGhIZHIsIDIsICZBbGcsIDIsICZTZXEsIDIsICZTdGF0dXMsCisJCQkJICBFTkRfT0ZfQVJHUyk7CisKKwkJaWYgKHBOZXdFbGVtZW50ICYmIEVsZW1lbnRMZW4pIHsKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJICBFbGVtZW50TGVuLCBwTmV3RWxlbWVudCwgRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCQl9CisKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwkJUlRNUFNldFRpbWVyKHBBdXRoVGltZXIsIFRpbWVvdXQpOworCQlyZXR1cm4gVFJVRTsKKwl9IGVsc2UgeworCQlEQkdQUklOVF9FUlIoKCIlcyAtIE1sbWVBdXRoUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxlZFxuIiwKKwkJCSAgICAgIHBTTU5hbWUpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXV0aF9yc3AuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2F1dGhfcnNwLmMKaW5kZXggY2M2MzliMS4uNWIwMThiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXV0aF9yc3AuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hdXRoX3JzcC5jCkBAIC00NywxOCArNDcsMjEgQEAKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgQXV0aFJzcFN0YXRlTWFjaGluZUluaXQoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gUFNUQVRFX01BQ0hJTkUgU20sCi0gICAgSU4gU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit2b2lkIEF1dGhSc3BTdGF0ZU1hY2hpbmVJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgKlNtLAorCQkJICAgICBJTiBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKIHsKLSAgICBTdGF0ZU1hY2hpbmVJbml0KFNtLCBUcmFucywgTUFYX0FVVEhfUlNQX1NUQVRFLCBNQVhfQVVUSF9SU1BfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIEFVVEhfUlNQX0lETEUsIEFVVEhfUlNQX01BQ0hJTkVfQkFTRSk7CisJU3RhdGVNYWNoaW5lSW5pdChTbSwgVHJhbnMsIE1BWF9BVVRIX1JTUF9TVEFURSwgTUFYX0FVVEhfUlNQX01TRywKKwkJCSAoU1RBVEVfTUFDSElORV9GVU5DKSBEcm9wLCBBVVRIX1JTUF9JRExFLAorCQkJIEFVVEhfUlNQX01BQ0hJTkVfQkFTRSk7CiAKLSAgICAvLyBjb2x1bW4gMQotICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9SU1BfSURMRSwgTVQyX1BFRVJfREVBVVRILCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEZWF1dGhBY3Rpb24pOworCS8qIGNvbHVtbiAxICovCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1JTUF9JRExFLCBNVDJfUEVFUl9ERUFVVEgsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBQZWVyRGVhdXRoQWN0aW9uKTsKIAotICAgIC8vIGNvbHVtbiAyCi0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1JTUF9XQUlUX0NIQUwsIE1UMl9QRUVSX0RFQVVUSCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGVhdXRoQWN0aW9uKTsKKwkvKiBjb2x1bW4gMiAqLworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9SU1BfV0FJVF9DSEFMLCBNVDJfUEVFUl9ERUFVVEgsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBQZWVyRGVhdXRoQWN0aW9uKTsKIAogfQogCkBAIC03MCwzOSArNzMsMzIgQEAKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBQZWVyQXV0aFNpbXBsZVJzcEdlbkFuZFNlbmQoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gUEhFQURFUl84MDJfMTEgcEhkcjgwMjExLAotICAgIElOIFVTSE9SVCBBbGcsCi0gICAgSU4gVVNIT1JUIFNlcSwKLSAgICBJTiBVU0hPUlQgUmVhc29uLAotICAgIElOIFVTSE9SVCBTdGF0dXMpCit2b2lkIFBlZXJBdXRoU2ltcGxlUnNwR2VuQW5kU2VuZChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIHN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhkcjgwMjExLAorCQkJCSB1MTYgQWxnLAorCQkJCSB1MTYgU2VxLAorCQkJCSB1MTYgUmVhc29uLCB1MTYgU3RhdHVzKQogewotICAgIEhFQURFUl84MDJfMTEgICAgIEF1dGhIZHI7Ci0gICAgVUxPTkcgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOwotICAgIFBVQ0hBUiAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotICAgIE5ESVNfU1RBVFVTICAgICAgIE5TdGF0dXM7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgQXV0aEhkcjsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuID0gMDsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJaW50IE5TdGF0dXM7CiAKLSAgICBpZiAoUmVhc29uICE9IE1MTUVfU1VDQ0VTUykKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXIgQVVUSCBmYWlsLi4uXG4iKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CisJaWYgKFJlYXNvbiAhPSBNTE1FX1NVQ0NFU1MpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlciBBVVRIIGZhaWwuLi5cbiIpKTsKKwkJcmV0dXJuOworCX0KKwkvKkdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5ICovCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlyZXR1cm47CiAKLQkvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0gICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKLSAgICBpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotICAgICAgICByZXR1cm47Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIEFVVEggcmVzcG9uc2UgKHNlcSMyKS4uLlxuIikpOwotICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmQXV0aEhkciwgU1VCVFlQRV9BVVRILCAwLCBwSGRyODAyMTEtPkFkZHIyLCBwQWQtPk1sbWVBdXguQnNzaWQpOwotICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgJkF1dGhIZHIsCi0gICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAmQWxnLAotICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgJlNlcSwKLSAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICZSZWFzb24sCi0gICAgICAgICAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOwotICAgIE1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlbmQgQVVUSCByZXNwb25zZSAoc2VxIzIpLi4uXG4iKSk7CisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZBdXRoSGRyLCBTVUJUWVBFX0FVVEgsIDAsIHBIZHI4MDIxMS0+QWRkcjIsCisJCQkgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAmRnJhbWVMZW4sIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSksCisJCQkgICZBdXRoSGRyLCAyLCAmQWxnLCAyLCAmU2VxLCAyLCAmUmVhc29uLCBFTkRfT0ZfQVJHUyk7CisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CiAJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKIH0KIApAQCAtMTE0LDM1ICsxMTAsMzMgQEAKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBQZWVyRGVhdXRoQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFBNTE1FX1FVRVVFX0VMRU0gRWxlbSkKK3ZvaWQgUGVlckRlYXV0aEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0gICAgVUNIQVIgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLSAgICBVU0hPUlQgICAgICBSZWFzb247CisJdTggQWRkcjJbTUFDX0FERFJfTEVOXTsKKwl1MTYgUmVhc29uOwogCi0gICAgaWYgKFBlZXJEZWF1dGhTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZSZWFzb24pKQotICAgIHsKLSAgICAgICAgaWYgKElORlJBX09OKHBBZCkgJiYgTUFDX0FERFJfRVFVQUwoQWRkcjIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKSkKLSAgICAgICAgewotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBVVRIX1JTUCAtIHJlY2VpdmUgREUtQVVUSCBmcm9tIG91ciBBUCAoUmVhc29uPSVkKVxuIiwgUmVhc29uKSk7CisJaWYgKFBlZXJEZWF1dGhTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZSZWFzb24pKSB7CisJCWlmIChJTkZSQV9PTihwQWQpCisJCSAgICAmJiBNQUNfQUREUl9FUVVBTChBZGRyMiwgcEFkLT5Db21tb25DZmcuQnNzaWQpCisJCSAgICApIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkFVVEhfUlNQIC0gcmVjZWl2ZSBERS1BVVRIIGZyb20gb3VyIEFQIChSZWFzb249JWQpXG4iLAorCQkJCSAgUmVhc29uKSk7CiAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOwotICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKLSAgICAgICAgICAgIH0KKwkJCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgU0lPQ0dJV0FQLCAtMSwgTlVMTCwgTlVMTCwKKwkJCQkJCTApOwogCi0JCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIGRlYXV0aGVudGljYXRpb24KKwkJCS8qIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3IgZGVhdXRoZW50aWNhdGlvbiAqLwogCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQotCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RFQVVUSF9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RFQVVUSF9FVkVOVF9GTEFHLAorCQkJCQkJICAgICAgcEFkLT5NYWNUYWIuCisJCQkJCQkgICAgICBDb250ZW50W0JTU0lEX1dDSURdLkFkZHIsCisJCQkJCQkgICAgICBCU1MwLCAwKTsKIAotICAgICAgICAgICAgTGlua0Rvd24ocEFkLCBUUlVFKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFVVEhfUlNQIC0gUGVlckRlYXV0aEFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7Ci0gICAgfQorCQkJTGlua0Rvd24ocEFkLCBUUlVFKTsKKwkJfQorCX0gZWxzZSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQVVUSF9SU1AgLSBQZWVyRGVhdXRoQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKwl9CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Nvbm5lY3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Nvbm5lY3QuYwppbmRleCA3YmM3NWFiLi4xN2U1OWJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9jb25uZWN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvY29ubmVjdC5jCkBAIC0zNiwzNCArMzYsMzkgQEAKICovCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCiAKLVVDSEFSCUNpcGhlclN1aXRlV3BhTm9uZVRraXBbXSA9IHsKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCi0JCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gTXVsdGljYXN0Ci0JCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0Ci0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIHVuaWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAotCQkweDAwLCAweDUwLCAweGYyLCAweDAwCS8vIGF1dGhlbnRpY2F0aW9uCi0JCX07Ci1VQ0hBUglDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwTGVuID0gKHNpemVvZihDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwKSAvIHNpemVvZihVQ0hBUikpOwordTggQ2lwaGVyU3VpdGVXcGFOb25lVGtpcFtdID0geworCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8qIG91aSAqLworCTB4MDEsIDB4MDAsCQkvKiBWZXJzaW9uICovCisJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLyogTXVsdGljYXN0ICovCisJMHgwMSwgMHgwMCwJCS8qIE51bWJlciBvZiB1bmljYXN0ICovCisJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLyogdW5pY2FzdCAqLworCTB4MDEsIDB4MDAsCQkvKiBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kICovCisJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMAkvKiBhdXRoZW50aWNhdGlvbiAqLworfTsKIAotVUNIQVIJQ2lwaGVyU3VpdGVXcGFOb25lQWVzW10gPSB7Ci0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8vIG91aQotCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCi0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDQsCS8vIE11bHRpY2FzdAotCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdW5pY2FzdAotCQkweDAwLCAweDUwLCAweGYyLCAweDA0LAkvLyB1bmljYXN0Ci0JCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMAkvLyBhdXRoZW50aWNhdGlvbgotCQl9OwotVUNIQVIJQ2lwaGVyU3VpdGVXcGFOb25lQWVzTGVuID0gKHNpemVvZihDaXBoZXJTdWl0ZVdwYU5vbmVBZXMpIC8gc2l6ZW9mKFVDSEFSKSk7Cit1OCBDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwTGVuID0KKyAgICAoc2l6ZW9mKENpcGhlclN1aXRlV3BhTm9uZVRraXApIC8gc2l6ZW9mKHU4KSk7CiAKLS8vIFRoZSBmb2xsb3dpbmcgTUFDUk8gaXMgY2FsbGVkIGFmdGVyIDEuIHN0YXJ0aW5nIGFuIG5ldyBJQlNTLCAyLiBzdWNjZXNmdWxseSBKT0lOIGFuIElCU1MsCi0vLyBvciAzLiBzdWNjZXNmdWxseSBBU1NPQ0lBVEUgdG8gYSBCU1MsIDQuIHN1Y2Nlc3NmdWxseSBSRV9BU1NPQ0lBVEUgdG8gYSBCU1MKLS8vIEFsbCBzZXR0aW5ncyBzdWNjZXNzZnVseSBuZWdvdGlhdGVkIGZ1cmluZyBNTE1FIHN0YXRlIG1hY2hpbmVzIGJlY29tZSBmaW5hbCBzZXR0aW5ncwotLy8gYW5kIGFyZSBjb3BpZWQgdG8gcEFkLT5TdGFBY3RpdmUKK3U4IENpcGhlclN1aXRlV3BhTm9uZUFlc1tdID0geworCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8qIG91aSAqLworCTB4MDEsIDB4MDAsCQkvKiBWZXJzaW9uICovCisJMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCwJLyogTXVsdGljYXN0ICovCisJMHgwMSwgMHgwMCwJCS8qIE51bWJlciBvZiB1bmljYXN0ICovCisJMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCwJLyogdW5pY2FzdCAqLworCTB4MDEsIDB4MDAsCQkvKiBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kICovCisJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMAkvKiBhdXRoZW50aWNhdGlvbiAqLworfTsKKwordTggQ2lwaGVyU3VpdGVXcGFOb25lQWVzTGVuID0KKyAgICAoc2l6ZW9mKENpcGhlclN1aXRlV3BhTm9uZUFlcykgLyBzaXplb2YodTgpKTsKKworLyogVGhlIGZvbGxvd2luZyBNQUNSTyBpcyBjYWxsZWQgYWZ0ZXIgMS4gc3RhcnRpbmcgYW4gbmV3IElCU1MsIDIuIHN1Y2Nlc2Z1bGx5IEpPSU4gYW4gSUJTUywgKi8KKy8qIG9yIDMuIHN1Y2Nlc2Z1bGx5IEFTU09DSUFURSB0byBhIEJTUywgNC4gc3VjY2Vzc2Z1bGx5IFJFX0FTU09DSUFURSB0byBhIEJTUyAqLworLyogQWxsIHNldHRpbmdzIHN1Y2Nlc3NmdWx5IG5lZ290aWF0ZWQgZnVyaW5nIE1MTUUgc3RhdGUgbWFjaGluZXMgYmVjb21lIGZpbmFsIHNldHRpbmdzICovCisvKiBhbmQgYXJlIGNvcGllZCB0byBwQWQtPlN0YUFjdGl2ZSAqLwogI2RlZmluZSBDT1BZX1NFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRyhfcEFkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJTmRpc1plcm9NZW1vcnkoKF9wQWQpLT5Db21tb25DZmcuU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsJCQkJCQkJXAogCShfcEFkKS0+Q29tbW9uQ2ZnLlNzaWRMZW4gPSAoX3BBZCktPk1sbWVBdXguU3NpZExlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAlOZGlzTW92ZU1lbW9yeSgoX3BBZCktPkNvbW1vbkNmZy5Tc2lkLCAoX3BBZCktPk1sbWVBdXguU3NpZCwgKF9wQWQpLT5NbG1lQXV4LlNzaWRMZW4pOyBcCiAJQ09QWV9NQUNfQUREUigoX3BBZCktPkNvbW1vbkNmZy5Cc3NpZCwgKF9wQWQpLT5NbG1lQXV4LkJzc2lkKTsgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNzksOSArODQsOSBAQAogCU5kaXNNb3ZlTWVtb3J5KChfcEFkKS0+U3RhQWN0aXZlLlN1cFJhdGUsIChfcEFkKS0+TWxtZUF1eC5TdXBSYXRlLCAoX3BBZCktPk1sbWVBdXguU3VwUmF0ZUxlbik7XAogCShfcEFkKS0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPSAoX3BBZCktPk1sbWVBdXguRXh0UmF0ZUxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAlOZGlzTW92ZU1lbW9yeSgoX3BBZCktPlN0YUFjdGl2ZS5FeHRSYXRlLCAoX3BBZCktPk1sbWVBdXguRXh0UmF0ZSwgKF9wQWQpLT5NbG1lQXV4LkV4dFJhdGVMZW4pO1wKLQlOZGlzTW92ZU1lbW9yeSgmKF9wQWQpLT5Db21tb25DZmcuQVBFZGNhUGFybSwgJihfcEFkKS0+TWxtZUF1eC5BUEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7XAotCU5kaXNNb3ZlTWVtb3J5KCYoX3BBZCktPkNvbW1vbkNmZy5BUFFvc0NhcGFiaWxpdHksICYoX3BBZCktPk1sbWVBdXguQVBRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpO1wKLQlOZGlzTW92ZU1lbW9yeSgmKF9wQWQpLT5Db21tb25DZmcuQVBRYnNzTG9hZCwgJihfcEFkKS0+TWxtZUF1eC5BUFFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTtcCisJTmRpc01vdmVNZW1vcnkoJihfcEFkKS0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0sICYoX3BBZCktPk1sbWVBdXguQVBFZGNhUGFybSwgc2l6ZW9mKHN0cnVjdCBydF9lZGNhX3Bhcm0pKTtcCisJTmRpc01vdmVNZW1vcnkoJihfcEFkKS0+Q29tbW9uQ2ZnLkFQUW9zQ2FwYWJpbGl0eSwgJihfcEFkKS0+TWxtZUF1eC5BUFFvc0NhcGFiaWxpdHksIHNpemVvZihzdHJ1Y3QgcnRfcW9zX2NhcGFiaWxpdHlfcGFybSkpO1wKKwlOZGlzTW92ZU1lbW9yeSgmKF9wQWQpLT5Db21tb25DZmcuQVBRYnNzTG9hZCwgJihfcEFkKS0+TWxtZUF1eC5BUFFic3NMb2FkLCBzaXplb2Yoc3RydWN0IHJ0X3Fic3NfbG9hZF9wYXJtKSk7XAogCUNPUFlfTUFDX0FERFIoKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCAoX3BBZCktPk1sbWVBdXguQnNzaWQpOyAgICAgIFwKIAkoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFpZCA9IChfcEFkKS0+TWxtZUF1eC5BaWQ7ICAgICAgICAgICAgICAgICAgICAgICBcCiAJKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSAoX3BBZCktPlN0YUNmZy5QYWlyQ2lwaGVyO1wKQEAgLTk3LDEzICsxMDIsMTEgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBNbG1lQ250bEluaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gU1RBVEVfTUFDSElORSAqUywKLQlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit2b2lkIE1sbWVDbnRsSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgKlMsIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKIHsKLQkvLyBDb250cm9sIHN0YXRlIG1hY2hpbmUgZGlmZmVycyBmcm9tIG90aGVyIHN0YXRlIG1hY2hpbmVzLCB0aGUgaW50ZXJmYWNlCi0JLy8gZm9sbG93cyB0aGUgc3RhbmRhcmQgaW50ZXJmYWNlCisJLyogQ29udHJvbCBzdGF0ZSBtYWNoaW5lIGRpZmZlcnMgZnJvbSBvdGhlciBzdGF0ZSBtYWNoaW5lcywgdGhlIGludGVyZmFjZSAqLworCS8qIGZvbGxvd3MgdGhlIHN0YW5kYXJkIGludGVyZmFjZSAqLwogCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CiB9CiAKQEAgLTExNSwxMTggKzExOCwxMDggQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBNbG1lQ250bE1hY2hpbmVQZXJmb3JtQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFNUQVRFX01BQ0hJTkUgKlMsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBNbG1lQ250bE1hY2hpbmVQZXJmb3JtQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgIHN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lICpTLAorCQkJCSAgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlzd2l0Y2gocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSkKLQl7Ci0JCWNhc2UgQ05UTF9JRExFOgotCQkJewotCQkJCUNudGxJZGxlUHJvYyhwQWQsIEVsZW0pOworCXN3aXRjaCAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSkgeworCWNhc2UgQ05UTF9JRExFOgorCQlDbnRsSWRsZVByb2MocEFkLCBFbGVtKTsKKwkJYnJlYWs7CisJY2FzZSBDTlRMX1dBSVRfRElTQVNTT0M6CisJCUNudGxXYWl0RGlzYXNzb2NQcm9jKHBBZCwgRWxlbSk7CisJCWJyZWFrOworCWNhc2UgQ05UTF9XQUlUX0pPSU46CisJCUNudGxXYWl0Sm9pblByb2MocEFkLCBFbGVtKTsKKwkJYnJlYWs7CisKKwkJLyogQ05UTF9XQUlUX1JFQVNTT0MgaXMgdGhlIG9ubHkgc3RhdGUgaW4gQ05UTCBtYWNoaW5lIHRoYXQgZG9lcyAqLworCQkvKiBub3QgdHJpZ2dlcmVkIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgYnkgIlJUTVBTZXRJbmZvcm1hdGlvbihPSURfeHh4KSIuICovCisJCS8qIFRoZXJlZm9yZSBub3QgcHJvdGVjdGVkIGJ5IE5ESVMncyAib25seSBvbmUgb3V0c3RhbmRpbmcgT0lEIHJlcXVlc3QiICovCisJCS8qIHJ1bGUuIFdoaWNoIG1lYW5zIE5ESVMgbWF5IFNFVCBPSUQgaW4gdGhlIG1pZGRsZSBvZiBST0FNaW5nIGF0dGVtcHRzLiAqLworCQkvKiBDdXJyZW50IGFwcHJvYWNoIGlzIHRvIGJsb2NrIG5ldyBTRVQgcmVxdWVzdCBhdCBSVE1QU2V0SW5mb3JtYXRpb24oKSAqLworCQkvKiB3aGVuIENudGxNYWNoaW5lLkN1cnJTdGF0ZSBpcyBub3QgQ05UTF9JRExFICovCisJY2FzZSBDTlRMX1dBSVRfUkVBU1NPQzoKKwkJQ250bFdhaXRSZWFzc29jUHJvYyhwQWQsIEVsZW0pOworCQlicmVhazsKKworCWNhc2UgQ05UTF9XQUlUX1NUQVJUOgorCQlDbnRsV2FpdFN0YXJ0UHJvYyhwQWQsIEVsZW0pOworCQlicmVhazsKKwljYXNlIENOVExfV0FJVF9BVVRIOgorCQlDbnRsV2FpdEF1dGhQcm9jKHBBZCwgRWxlbSk7CisJCWJyZWFrOworCWNhc2UgQ05UTF9XQUlUX0FVVEgyOgorCQlDbnRsV2FpdEF1dGhQcm9jMihwQWQsIEVsZW0pOworCQlicmVhazsKKwljYXNlIENOVExfV0FJVF9BU1NPQzoKKwkJQ250bFdhaXRBc3NvY1Byb2MocEFkLCBFbGVtKTsKKwkJYnJlYWs7CisKKwljYXNlIENOVExfV0FJVF9PSURfTElTVF9TQ0FOOgorCQlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfU0NBTl9DT05GKSB7CisJCQkvKiBSZXN1bWUgVHhSaW5nIGFmdGVyIFNDQU5JTkcgY29tcGxldGUuIFdlIGhvcGUgdGhlIG91dC1vZi1zZXJ2aWNlIHRpbWUgKi8KKwkJCS8qIHdvbid0IGJlIHRvbyBsb25nIHRvIGxldCB1cHBlciBsYXllciB0aW1lLW91dCB0aGUgd2FpdGluZyBmcmFtZXMgKi8KKwkJCVJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKHBBZCk7CisKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisKKwkJCS8qICovCisJCQkvKiBTZXQgTEVEIHN0YXR1cyB0byBwcmV2aW91cyBzdGF0dXMuICovCisJCQkvKiAqLworCQkJaWYgKHBBZC0+YkxlZE9uU2Nhbm5pbmcpIHsKKwkJCQlwQWQtPmJMZWRPblNjYW5uaW5nID0gRkFMU0U7CisJCQkJUlRNUFNldExFRChwQWQsIHBBZC0+TGVkU3RhdHVzKTsKIAkJCX0KLQkJCWJyZWFrOwotCQljYXNlIENOVExfV0FJVF9ESVNBU1NPQzoKLQkJCUNudGxXYWl0RGlzYXNzb2NQcm9jKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKLQkJY2FzZSBDTlRMX1dBSVRfSk9JTjoKLQkJCUNudGxXYWl0Sm9pblByb2MocEFkLCBFbGVtKTsKLQkJCWJyZWFrOworCQl9CisJCWJyZWFrOwogCi0JCS8vIENOVExfV0FJVF9SRUFTU09DIGlzIHRoZSBvbmx5IHN0YXRlIGluIENOVEwgbWFjaGluZSB0aGF0IGRvZXMKLQkJLy8gbm90IHRyaWdnZXJlZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGJ5ICJSVE1QU2V0SW5mb3JtYXRpb24oT0lEX3h4eCkiLgotCQkvLyBUaGVyZWZvcmUgbm90IHByb3RlY3RlZCBieSBORElTJ3MgIm9ubHkgb25lIG91dHN0YW5kaW5nIE9JRCByZXF1ZXN0IgotCQkvLyBydWxlLiBXaGljaCBtZWFucyBORElTIG1heSBTRVQgT0lEIGluIHRoZSBtaWRkbGUgb2YgUk9BTWluZyBhdHRlbXB0cy4KLQkJLy8gQ3VycmVudCBhcHByb2FjaCBpcyB0byBibG9jayBuZXcgU0VUIHJlcXVlc3QgYXQgUlRNUFNldEluZm9ybWF0aW9uKCkKLQkJLy8gd2hlbiBDbnRsTWFjaGluZS5DdXJyU3RhdGUgaXMgbm90IENOVExfSURMRQotCQljYXNlIENOVExfV0FJVF9SRUFTU09DOgotCQkJQ250bFdhaXRSZWFzc29jUHJvYyhwQWQsIEVsZW0pOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTlRMX1dBSVRfU1RBUlQ6Ci0JCQlDbnRsV2FpdFN0YXJ0UHJvYyhwQWQsIEVsZW0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ05UTF9XQUlUX0FVVEg6Ci0JCQlDbnRsV2FpdEF1dGhQcm9jKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKLQkJY2FzZSBDTlRMX1dBSVRfQVVUSDI6Ci0JCQlDbnRsV2FpdEF1dGhQcm9jMihwQWQsIEVsZW0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ05UTF9XQUlUX0FTU09DOgotCQkJQ250bFdhaXRBc3NvY1Byb2MocEFkLCBFbGVtKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ05UTF9XQUlUX09JRF9MSVNUX1NDQU46Ci0JCQlpZihFbGVtLT5Nc2dUeXBlID09IE1UMl9TQ0FOX0NPTkYpCi0JCQl7Ci0JCQkJLy8gUmVzdW1lIFR4UmluZyBhZnRlciBTQ0FOSU5HIGNvbXBsZXRlLiBXZSBob3BlIHRoZSBvdXQtb2Ytc2VydmljZSB0aW1lCi0JCQkJLy8gd29uJ3QgYmUgdG9vIGxvbmcgdG8gbGV0IHVwcGVyIGxheWVyIHRpbWUtb3V0IHRoZSB3YWl0aW5nIGZyYW1lcwotCQkJCVJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKHBBZCk7Ci0JCQkJaWYgKHBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgIT0gTVNSTl9UWVBFX1VOVVNFRCkKLQkJCQl7Ci0JCQkJCS8vIENpc2NvIHNjYW4gcmVxdWVzdCBpcyBmaW5pc2hlZCwgcHJlcGFyZSBiZWFjb24gcmVwb3J0Ci0JCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQUlST05FVF9TVEFURV9NQUNISU5FLCBNVDJfQUlST05FVF9TQ0FOX0RPTkUsIDAsIE5VTEwpOwotCQkJCX0KLQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotCi0gICAgICAgICAgICAgICAgLy8KLQkJCQkvLyBTZXQgTEVEIHN0YXR1cyB0byBwcmV2aW91cyBzdGF0dXMuCi0JCQkJLy8KLQkJCQlpZiAocEFkLT5iTGVkT25TY2FubmluZykKLQkJCQl7Ci0JCQkJCXBBZC0+YkxlZE9uU2Nhbm5pbmcgPSBGQUxTRTsKLQkJCQkJUlRNUFNldExFRChwQWQsIHBBZC0+TGVkU3RhdHVzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIENOVExfV0FJVF9PSURfRElTQVNTT0M6Ci0JCQlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfRElTQVNTT0NfQ09ORikKLQkJCXsKLQkJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKLQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotCQkJfQotCQkJYnJlYWs7Ci0jaWZkZWYgUlQyODcwCi0JCS8vCi0JCS8vIFRoaXMgc3RhdGUgaXMgZm9yIHRoYXQgd2Ugd2FudCB0byBjb25uZWN0IHRvIGFuIEFQIGJ1dAotCQkvLyBpdCBkaWRuJ3QgZmluZCBvbiBCU1MgTGlzdCB0YWJsZS4gU28gd2UgbmVlZCB0byBzY2FuIHRoZSBhaXIgZmlyc3QsCi0JCS8vIGFmdGVyIHRoYXQgd2UgY2FuIHRyeSB0byBjb25uZWN0IHRvIHRoZSBkZXNpcmVkIEFQIGlmIGF2YWlsYWJsZS4KLQkJLy8KLQkJY2FzZSBDTlRMX1dBSVRfU0NBTl9GT1JfQ09OTkVDVDoKLQkJCWlmKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX1NDQU5fQ09ORikKLQkJCXsKLQkJCQkvLyBSZXN1bWUgVHhSaW5nIGFmdGVyIFNDQU5JTkcgY29tcGxldGUuIFdlIGhvcGUgdGhlIG91dC1vZi1zZXJ2aWNlIHRpbWUKLQkJCQkvLyB3b24ndCBiZSB0b28gbG9uZyB0byBsZXQgdXBwZXIgbGF5ZXIgdGltZS1vdXQgdGhlIHdhaXRpbmcgZnJhbWVzCi0JCQkJUlRNUFJlc3VtZU1zZHVUcmFuc21pc3Npb24ocEFkKTsKKwljYXNlIENOVExfV0FJVF9PSURfRElTQVNTT0M6CisJCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9ESVNBU1NPQ19DT05GKSB7CisJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCX0KKwkJYnJlYWs7CisjaWZkZWYgUlRNUF9NQUNfVVNCCisJCS8qICovCisJCS8qIFRoaXMgc3RhdGUgaXMgZm9yIHRoYXQgd2Ugd2FudCB0byBjb25uZWN0IHRvIGFuIEFQIGJ1dCAqLworCQkvKiBpdCBkaWRuJ3QgZmluZCBvbiBCU1MgTGlzdCB0YWJsZS4gU28gd2UgbmVlZCB0byBzY2FuIHRoZSBhaXIgZmlyc3QsICovCisJCS8qIGFmdGVyIHRoYXQgd2UgY2FuIHRyeSB0byBjb25uZWN0IHRvIHRoZSBkZXNpcmVkIEFQIGlmIGF2YWlsYWJsZS4gKi8KKwkJLyogKi8KKwljYXNlIENOVExfV0FJVF9TQ0FOX0ZPUl9DT05ORUNUOgorCQlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfU0NBTl9DT05GKSB7CisJCQkvKiBSZXN1bWUgVHhSaW5nIGFmdGVyIFNDQU5JTkcgY29tcGxldGUuIFdlIGhvcGUgdGhlIG91dC1vZi1zZXJ2aWNlIHRpbWUgKi8KKwkJCS8qIHdvbid0IGJlIHRvbyBsb25nIHRvIGxldCB1cHBlciBsYXllciB0aW1lLW91dCB0aGUgd2FpdGluZyBmcmFtZXMgKi8KKwkJCVJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKHBBZCk7CiAjaWZkZWYgQ0NYX1NVUFBPUlQKLQkJCQlpZiAocEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSAhPSBNU1JOX1RZUEVfVU5VU0VEKQotCQkJCXsKLQkJCQkJLy8gQ2lzY28gc2NhbiByZXF1ZXN0IGlzIGZpbmlzaGVkLCBwcmVwYXJlIGJlYWNvbiByZXBvcnQKLQkJCQkJTWxtZUVucXVldWUocEFkLCBBSVJPTkVUX1NUQVRFX01BQ0hJTkUsIE1UMl9BSVJPTkVUX1NDQU5fRE9ORSwgMCwgTlVMTCk7Ci0JCQkJfQotI2VuZGlmIC8vIENDWF9TVVBQT1JUIC8vCi0JCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKLQotCQkJCS8vCi0JCQkJLy8gQ2hlY2sgaWYgd2UgY2FuIGNvbm5lY3QgdG8uCi0JCQkJLy8KLQkJCQlCc3NUYWJsZVNzaWRTb3J0KHBBZCwgJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7Ci0JCQkJaWYgKHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yID4gMCkKLQkJCQl7Ci0JCQkJCU1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQocEFkKTsKLQkJCQl9CisJCQlpZiAocEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSAhPSBNU1JOX1RZUEVfVU5VU0VEKSB7CisJCQkJLyogQ2lzY28gc2NhbiByZXF1ZXN0IGlzIGZpbmlzaGVkLCBwcmVwYXJlIGJlYWNvbiByZXBvcnQgKi8KKwkJCQlNbG1lRW5xdWV1ZShwQWQsIEFJUk9ORVRfU1RBVEVfTUFDSElORSwKKwkJCQkJICAgIE1UMl9BSVJPTkVUX1NDQU5fRE9ORSwgMCwgTlVMTCk7CiAJCQl9Ci0JCQlicmVhazsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQkJZGVmYXVsdDoKLQkJCURCR1BSSU5UX0VSUigoIiFFUlJPUiEgQ05UTCAtIElsbGVnYWwgbWVzc2FnZSB0eXBlKD0lbGQpIiwgRWxlbS0+TXNnVHlwZSkpOwotCQkJYnJlYWs7CisjZW5kaWYgLyogQ0NYX1NVUFBPUlQgLy8gKi8KKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisKKwkJCS8qICovCisJCQkvKiBDaGVjayBpZiB3ZSBjYW4gY29ubmVjdCB0by4gKi8KKwkJCS8qICovCisJCQlCc3NUYWJsZVNzaWRTb3J0KHBBZCwgJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLAorCQkJCQkgKGNoYXIgKikgcEFkLT5NbG1lQXV4LgorCQkJCQkgQXV0b1JlY29ubmVjdFNzaWQsCisJCQkJCSBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOworCQkJaWYgKHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yID4gMCkgeworCQkJCU1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQocEFkKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKwlkZWZhdWx0OgorCQlEQkdQUklOVF9FUlIoKCJFUlJPUiEgQ05UTCAtIElsbGVnYWwgbWVzc2FnZSB0eXBlKD0lbGQpIiwKKwkJCSAgICAgIEVsZW0tPk1zZ1R5cGUpKTsKKwkJYnJlYWs7CiAJfQogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAlEZXNjcmlwdGlvbjoKQEAgLTIzNSw5MiArMjI4LDk1IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgQ250bElkbGVQcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgQ250bElkbGVQcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgICBEaXNhc3NvY1JlcTsKKwlzdHJ1Y3QgcnRfbWxtZV9kaXNhc3NvY19yZXEgRGlzYXNzb2NSZXE7CiAKIAlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCiAJCXJldHVybjsKIAotCXN3aXRjaChFbGVtLT5Nc2dUeXBlKQotCXsKLQkJY2FzZSBPSURfODAyXzExX1NTSUQ6Ci0JCQlDbnRsT2lkU3NpZFByb2MocEFkLCBFbGVtKTsKLQkJCWJyZWFrOworCXN3aXRjaCAoRWxlbS0+TXNnVHlwZSkgeworCWNhc2UgT0lEXzgwMl8xMV9TU0lEOgorCQlDbnRsT2lkU3NpZFByb2MocEFkLCBFbGVtKTsKKwkJYnJlYWs7CiAKLQkJY2FzZSBPSURfODAyXzExX0JTU0lEOgotCQkJQ250bE9pZFJUQnNzaWRQcm9jKHBBZCxFbGVtKTsKLQkJCWJyZWFrOworCWNhc2UgT0lEXzgwMl8xMV9CU1NJRDoKKwkJQ250bE9pZFJUQnNzaWRQcm9jKHBBZCwgRWxlbSk7CisJCWJyZWFrOwogCi0JCWNhc2UgT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU46Ci0JCQlDbnRsT2lkU2NhblByb2MocEFkLEVsZW0pOwotCQkJYnJlYWs7CisJY2FzZSBPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTjoKKwkJQ250bE9pZFNjYW5Qcm9jKHBBZCwgRWxlbSk7CisJCWJyZWFrOwogCi0JCWNhc2UgT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEU6Ci0JCQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HKTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLCBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKLQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0RJU0FTU09DOworCWNhc2UgT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEU6CisJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQkJCSBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOworCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKKwkJCSAgICBzaXplb2Yoc3RydWN0IHJ0X21sbWVfZGlzYXNzb2NfcmVxKSwgJkRpc2Fzc29jUmVxKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfRElTQVNTT0M7CiAKLSAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFX1dJVEhfV0VCX1VJKQotICAgICAgICAgICAgewotICAgIAkJCS8vIFNldCB0aGUgQXV0b1JlY29ubmVjdFNzaWQgdG8gcHJldmVudCBpdCByZWNvbm5lY3QgdG8gb2xkIFNTSUQKLSAgICAJCQkvLyBTaW5jZSBjYWxsaW5nIHRoaXMgaW5kaWNhdGUgdXNlciBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuCi0gICAgCQkJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKLSAgICAJCQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7Ci0gICAgICAgICAgICB9Ci0JCQlicmVhazsKKwkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPQorCQkgICAgV1BBX1NVUFBMSUNBTlRfRU5BQkxFX1dJVEhfV0VCX1VJKSB7CisJCQkvKiBTZXQgdGhlIEF1dG9SZWNvbm5lY3RTc2lkIHRvIHByZXZlbnQgaXQgcmVjb25uZWN0IHRvIG9sZCBTU0lEICovCisJCQkvKiBTaW5jZSBjYWxsaW5nIHRoaXMgaW5kaWNhdGUgdXNlciBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuICovCisJCQlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4gPSAzMjsKKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwKKwkJCQkgICAgICAgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKKwkJfQorCQlicmVhazsKIAotCQljYXNlIE1UMl9NTE1FX1JPQU1JTkdfUkVROgotCQkJQ250bE1sbWVSb2FtaW5nUHJvYyhwQWQsIEVsZW0pOwotCQkJYnJlYWs7CisJY2FzZSBNVDJfTUxNRV9ST0FNSU5HX1JFUToKKwkJQ250bE1sbWVSb2FtaW5nUHJvYyhwQWQsIEVsZW0pOworCQlicmVhazsKIAotICAgICAgICBjYXNlIE9JRF84MDJfMTFfTUlDX0ZBSUxVUkVfUkVQT1JUX0ZSQU1FOgotICAgICAgICAgICAgV3BhTWljRmFpbHVyZVJlcG9ydEZyYW1lKHBBZCwgRWxlbSk7Ci0gICAgICAgICAgICBicmVhazsKKwljYXNlIE9JRF84MDJfMTFfTUlDX0ZBSUxVUkVfUkVQT1JUX0ZSQU1FOgorCQlXcGFNaWNGYWlsdXJlUmVwb3J0RnJhbWUocEFkLCBFbGVtKTsKKwkJYnJlYWs7CiAKLQkJZGVmYXVsdDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBJbGxlZ2FsIG1lc3NhZ2UgaW4gQ250bElkbGVQcm9jKE1zZ1R5cGU9JWxkKVxuIixFbGVtLT5Nc2dUeXBlKSk7Ci0JCQlicmVhazsKKwlkZWZhdWx0OgorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkNOVEwgLSBJbGxlZ2FsIG1lc3NhZ2UgaW4gQ250bElkbGVQcm9jKE1zZ1R5cGU9JWxkKVxuIiwKKwkJCSAgRWxlbS0+TXNnVHlwZSkpOworCQlicmVhazsKIAl9CiB9CiAKLVZPSUQgQ250bE9pZFNjYW5Qcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgQ250bE9pZFNjYW5Qcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlNTE1FX1NDQU5fUkVRX1NUUlVDVCAgICAgICBTY2FuUmVxOwotCVVMT05HICAgICAgICAgICAgICAgICAgICAgIEJzc0lkeCA9IEJTU19OT1RfRk9VTkQ7Ci0JQlNTX0VOVFJZICAgICAgICAgICAgICAgICAgQ3VyckJzczsKKwlzdHJ1Y3QgcnRfbWxtZV9zY2FuX3JlcSBTY2FuUmVxOworCXVuc2lnbmVkIGxvbmcgQnNzSWR4ID0gQlNTX05PVF9GT1VORDsKKwlzdHJ1Y3QgcnRfYnNzX2VudHJ5IEN1cnJCc3M7CiAKLQkvLyByZWNvcmQgY3VycmVudCBCU1MgaWYgbmV0d29yayBpcyBjb25uZWN0ZWQuCi0JLy8gMjAwMy0yLTEzIGRvIG5vdCBpbmNsdWRlIGN1cnJlbnQgSUJTUyBpZiB0aGlzIGlzIHRoZSBvbmx5IFNUQSBpbiB0aGlzIElCU1MuCi0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQl7Ci0JCUJzc0lkeCA9IEJzc1NzaWRUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JCWlmIChCc3NJZHggIT0gQlNTX05PVF9GT1VORCkKLQkJewotCQkJTmRpc01vdmVNZW1vcnkoJkN1cnJCc3MsICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XSwgc2l6ZW9mKEJTU19FTlRSWSkpOworCS8qIHJlY29yZCBjdXJyZW50IEJTUyBpZiBuZXR3b3JrIGlzIGNvbm5lY3RlZC4gKi8KKwkvKiAyMDAzLTItMTMgZG8gbm90IGluY2x1ZGUgY3VycmVudCBJQlNTIGlmIHRoaXMgaXMgdGhlIG9ubHkgU1RBIGluIHRoaXMgSUJTUy4gKi8KKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKSB7CisJCUJzc0lkeCA9CisJCSAgICBCc3NTc2lkVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgcEFkLT5Db21tb25DZmcuQnNzaWQsCisJCQkJICAgICAgICh1OCAqKXBBZC0+Q29tbW9uQ2ZnLlNzaWQsCisJCQkJICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sCisJCQkJICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQlpZiAoQnNzSWR4ICE9IEJTU19OT1RfRk9VTkQpIHsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZDdXJyQnNzLCAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0sCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfYnNzX2VudHJ5KSk7CiAJCX0KIAl9Ci0KLQkvLyBjbGVhbiB1cCBwcmV2aW91cyBTQ0FOIHJlc3VsdCwgYWRkIGN1cnJlbnQgQlNTIGJhY2sgdG8gdGFibGUgaWYgYW55CisJLyogY2xlYW4gdXAgcHJldmlvdXMgU0NBTiByZXN1bHQsIGFkZCBjdXJyZW50IEJTUyBiYWNrIHRvIHRhYmxlIGlmIGFueSAqLwogCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKLQlpZiAoQnNzSWR4ICE9IEJTU19OT1RfRk9VTkQpCi0JewotCQkvLyBEREsgTm90ZTogSWYgdGhlIE5JQyBpcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIEJTU0lEIGFuZCBTU0lECi0JCS8vICAgIHRoYXQgYXJlIG5vdCBjb250YWluZWQgaW4gdGhlIGxpc3Qgb2YgQlNTSURzIGdlbmVyYXRlZCBieSB0aGlzIHNjYW4sIHRoZQotCQkvLyAgICBCU1NJRCBkZXNjcmlwdGlvbiBvZiB0aGUgY3VycmVudGx5IGFzc29jaWF0ZWQgQlNTSUQgYW5kIFNTSUQgc2hvdWxkIGJlCi0JCS8vICAgIGFwcGVuZGVkIHRvIHRoZSBsaXN0IG9mIEJTU0lEcyBpbiB0aGUgTklDJ3MgZGF0YWJhc2UuCi0JCS8vIFRvIGVuc3VyZSB0aGlzLCB3ZSBhcHBlbmQgdGhpcyBCU1MgYXMgdGhlIGZpcnN0IGVudHJ5IGluIFNDQU4gcmVzdWx0Ci0JCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbMF0sICZDdXJyQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJaWYgKEJzc0lkeCAhPSBCU1NfTk9UX0ZPVU5EKSB7CisJCS8qIERESyBOb3RlOiBJZiB0aGUgTklDIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgQlNTSUQgYW5kIFNTSUQgKi8KKwkJLyogICAgdGhhdCBhcmUgbm90IGNvbnRhaW5lZCBpbiB0aGUgbGlzdCBvZiBCU1NJRHMgZ2VuZXJhdGVkIGJ5IHRoaXMgc2NhbiwgdGhlICovCisJCS8qICAgIEJTU0lEIGRlc2NyaXB0aW9uIG9mIHRoZSBjdXJyZW50bHkgYXNzb2NpYXRlZCBCU1NJRCBhbmQgU1NJRCBzaG91bGQgYmUgKi8KKwkJLyogICAgYXBwZW5kZWQgdG8gdGhlIGxpc3Qgb2YgQlNTSURzIGluIHRoZSBOSUMncyBkYXRhYmFzZS4gKi8KKwkJLyogVG8gZW5zdXJlIHRoaXMsIHdlIGFwcGVuZCB0aGlzIEJTUyBhcyB0aGUgZmlyc3QgZW50cnkgaW4gU0NBTiByZXN1bHQgKi8KKwkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVswXSwgJkN1cnJCc3MsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9ic3NfZW50cnkpKTsKIAkJcEFkLT5TY2FuVGFiLkJzc05yID0gMTsKIAl9CiAKLQlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgIiIsIDAsIEJTU19BTlksIFNDQU5fQUNUSVZFKTsKKwlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgKGNoYXIgKilFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQlNTX0FOWSwKKwkJICAgICBTQ0FOX0FDVElWRSk7CiAJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLAotCQlzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7CisJCSAgICBzaXplb2Yoc3RydWN0IHJ0X21sbWVfc2Nhbl9yZXEpLCAmU2NhblJlcSk7CiAJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOwogfQogCkBAIC0zMzMsMTcxICszMjksMTc0IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgQ250bE9pZFNzaWRQcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pCit2b2lkIENudGxPaWRTc2lkUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JUE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgcE9pZFNzaWQgPSAoTkRJU184MDJfMTFfU1NJRCAqKUVsZW0tPk1zZzsKLQlNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgICBEaXNhc3NvY1JlcTsKLQlVTE9ORwkJCQkJICAgTm93OworCXN0cnVjdCBydF9uZGlzXzgwMl8xMV9zc2lkICogcE9pZFNzaWQgPSAoc3RydWN0IHJ0X25kaXNfODAyXzExX3NzaWQgKikgRWxlbS0+TXNnOworCXN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSBEaXNhc3NvY1JlcTsKKwl1bnNpZ25lZCBsb25nIE5vdzsKIAotI2lmZGVmIFJUMjg2MAotCS8vIEJCUCBhbmQgUkYgYXJlIG5vdCBhY2Nlc3NpYmxlIGluIFBTIG1vZGUsIHdlIGhhcyB0byB3YWtlIHRoZW0gdXAgZmlyc3QKLQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgUlRNUF9IQUxUKTsKLSNlbmRpZgotCi0JLy8gU3RlcCAxLiByZWNvcmQgdGhlIGRlc2lyZWQgdXNlciBzZXR0aW5ncyB0byBNbG1lQXV4CisJLyogU3RlcCAxLiByZWNvcmQgdGhlIGRlc2lyZWQgdXNlciBzZXR0aW5ncyB0byBNbG1lQXV4ICovCiAJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CiAJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIHBPaWRTc2lkLT5Tc2lkLCBwT2lkU3NpZC0+U3NpZExlbmd0aCk7Ci0JcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSAoVUNIQVIpcE9pZFNzaWQtPlNzaWRMZW5ndGg7CisJcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSAodTgpcE9pZFNzaWQtPlNzaWRMZW5ndGg7CiAJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkJzc2lkLCBNQUNfQUREUl9MRU4pOwogCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gcEFkLT5TdGFDZmcuQnNzVHlwZTsKIAorCXBBZC0+U3RhQ2ZnLmJBdXRvQ29ubmVjdEJ5QnNzaWQgPSBGQUxTRTsKIAotCS8vCi0JLy8gVXBkYXRlIFJlY29ubmVjdCBTc2lkLCB0aGF0IHVzZXIgZGVzaXJlZCB0byBjb25uZWN0LgotCS8vCisJLyogKi8KKwkvKiBVcGRhdGUgUmVjb25uZWN0IFNzaWQsIHRoYXQgdXNlciBkZXNpcmVkIHRvIGNvbm5lY3QuICovCisJLyogKi8KIAlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7Ci0JTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LlNzaWQsCisJCSAgICAgICBwQWQtPk1sbWVBdXguU3NpZExlbik7CiAJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuID0gcEFkLT5NbG1lQXV4LlNzaWRMZW47CiAKLQkvLyBzdGVwIDIuIGZpbmQgYWxsIG1hdGNoaW5nIEJTUyBpbiB0aGUgbGFzdGVzdCBTQ0FOIHJlc3VsdCAoaW5Cc3NUYWIpCi0JLy8gICAgJiBsb2cgdGhlbSBpbnRvIE1sbWVBdXguU3NpZEJzc1RhYiBmb3IgbGF0ZXItb24gaXRlcmF0aW9uLiBTb3J0IGJ5IFJTU0kgb3JkZXIKLQlCc3NUYWJsZVNzaWRTb3J0KHBBZCwgJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCS8qIHN0ZXAgMi4gZmluZCBhbGwgbWF0Y2hpbmcgQlNTIGluIHRoZSBsYXN0ZXN0IFNDQU4gcmVzdWx0IChpbkJzc1RhYikgKi8KKwkvKiAgICAmIGxvZyB0aGVtIGludG8gTWxtZUF1eC5Tc2lkQnNzVGFiIGZvciBsYXRlci1vbiBpdGVyYXRpb24uIFNvcnQgYnkgUlNTSSBvcmRlciAqLworCUJzc1RhYmxlU3NpZFNvcnQocEFkLCAmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIsCisJCQkgKGNoYXIgKilwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtICVkIEJTUyBvZiAlZCBCU1MgbWF0Y2ggdGhlIGRlc2lyZSAoJWQpU1NJRCAtICVzXG4iLAotCQkJcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIsIHBBZC0+U2NhblRhYi5Cc3NOciwgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIHBBZC0+TWxtZUF1eC5Tc2lkKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSAlZCBCU1Mgb2YgJWQgQlNTIG1hdGNoIHRoZSBkZXNpcmUgKCVkKVNTSUQgLSAlc1xuIiwKKwkJICBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOciwgcEFkLT5TY2FuVGFiLkJzc05yLAorCQkgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCBwQWQtPk1sbWVBdXguU3NpZCkpOwogCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CiAKIAlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpICYmCi0JCShwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuID09IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5WzBdLlNzaWRMZW4pICYmCi0JCU5kaXNFcXVhbE1lbW9yeShwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVswXS5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKSAmJgotCQlNQUNfQUREUl9FUVVBTChwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbMF0uQnNzaWQpKQotCXsKLQkJLy8gQ2FzZSAxLiBhbHJlYWR5IGNvbm5lY3RlZCB3aXRoIGFuIEFQIHdobyBoYXMgdGhlIGRlc2lyZWQgU1NJRAotCQkvLyAgICAgICAgIHdpdGggaGlnaGVzdCBSU1NJCisJICAgIChwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuID09CisJICAgICBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVswXS5Tc2lkTGVuKQorCSAgICAmJiBOZGlzRXF1YWxNZW1vcnkocEFkLT5Db21tb25DZmcuU3NpZCwKKwkJCSAgICAgICBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVswXS5Tc2lkLAorCQkJICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pCisJICAgICYmIE1BQ19BRERSX0VRVUFMKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQkJICAgICAgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbMF0uQnNzaWQpKSB7CisJCS8qIENhc2UgMS4gYWxyZWFkeSBjb25uZWN0ZWQgd2l0aCBhbiBBUCB3aG8gaGFzIHRoZSBkZXNpcmVkIFNTSUQgKi8KKwkJLyogICAgICAgICB3aXRoIGhpZ2hlc3QgUlNTSSAqLwogCi0JCS8vIEFkZCBjaGVja2luZyBNb2RlICJMRUFQIiBmb3IgQ0NYIDEuMAorCQkvKiBBZGQgY2hlY2tpbmcgTW9kZSAiTEVBUCIgZm9yIENDWCAxLjAgKi8KIAkJaWYgKCgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAotCQkJIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8Ci0JCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8Ci0JCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCi0JCQkgKSAmJgotCQkJKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCi0JCXsKLQkJCS8vIGNhc2UgMS4xIEZvciBXUEEsIFdQQS1QU0ssIGlmIHRoZSAxeCBwb3J0IGlzIG5vdCBzZWN1cmVkLCB3ZSBoYXZlIHRvIHJlZG8KLQkJCS8vICAgICAgICAgIGNvbm5lY3Rpb24gcHJvY2VzcwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAuLi5cbiIpKTsKLQkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOwotCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsCi0JCQkJCQlzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKKwkJICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorCQkgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAorCQkgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorCQkgICAgKSAmJgorCQkgICAgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpIHsKKwkJCS8qIGNhc2UgMS4xIEZvciBXUEEsIFdQQS1QU0ssIGlmIHRoZSAxeCBwb3J0IGlzIG5vdCBzZWN1cmVkLCB3ZSBoYXZlIHRvIHJlZG8gKi8KKwkJCS8qICAgICAgICAgIGNvbm5lY3Rpb24gcHJvY2VzcyAqLworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAuLi5cbiIpKTsKKwkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsCisJCQkJCSBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwKKwkJCQkJIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsCisJCQkJICAgIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSksCisJCQkJICAgICZEaXNhc3NvY1JlcSk7CiAJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0RJU0FTU09DOwotCQl9Ci0JCWVsc2UgaWYgKHBBZC0+YkNvbmZpZ0NoYW5nZWQgPT0gVFJVRSkKLQkJewotCQkJLy8gY2FzZSAxLjIgSW1wb3J0YW50IENvbmZpZyBoYXMgY2hhbmdlZCwgd2UgaGF2ZSB0byByZWNvbm5lY3QgdG8gdGhlIHNhbWUgQVAKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQIEJlY2F1c2UgY29uZmlnIGNoYW5nZWQuLi5cbiIpKTsKLQkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOwotCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsCi0JCQkJCQlzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKKwkJfSBlbHNlIGlmIChwQWQtPmJDb25maWdDaGFuZ2VkID09IFRSVUUpIHsKKwkJCS8qIGNhc2UgMS4yIEltcG9ydGFudCBDb25maWcgaGFzIGNoYW5nZWQsIHdlIGhhdmUgdG8gcmVjb25uZWN0IHRvIHRoZSBzYW1lIEFQICovCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUCBCZWNhdXNlIGNvbmZpZyBjaGFuZ2VkLi4uXG4iKSk7CisJCQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLAorCQkJCQkgcEFkLT5Db21tb25DZmcuQnNzaWQsCisJCQkJCSBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOworCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLAorCQkJCSAgICBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9kaXNhc3NvY19yZXEpLAorCQkJCSAgICAmRGlzYXNzb2NSZXEpOwogCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIGNhc2UgMS4zLiBhbHJlYWR5IGNvbm5lY3RlZCB0byB0aGUgU1NJRCB3aXRoIGhpZ2hlc3QgUlNTSS4KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBhbHJlYWR5IHdpdGggdGhpcyBCU1NJRC4gaWdub3JlIHRoaXMgU0VUX1NTSUQgcmVxdWVzdFxuIikpOwotCQkJLy8KLQkJCS8vIChIQ1QgMTIuMSkgMWNfd2xhbl9tZWRpYWV2ZW50cyByZXF1aXJlZAotCQkJLy8gbWVkaWEgY29ubmVjdCBldmVudHMgYXJlIGluZGljYXRlZCB3aGVuIGFzc29jaWF0aW5nIHdpdGggdGhlIHNhbWUgQVAKLQkJCS8vCi0JCQlpZiAoSU5GUkFfT04ocEFkKSkKLQkJCXsKLQkJCQkvLwotCQkJCS8vIFNpbmNlIE1lZGlhU3RhdGUgYWxyZWFkeSBpcyBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZAotCQkJCS8vIFdlIGp1c3QgaW5kaWNhdGUgdGhlIGNvbm5lY3QgZXZlbnQgYWdhaW4gdG8gbWVldCB0aGUgV0hRTCByZXF1aXJlZC4KLQkJCQkvLwotCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisJCX0gZWxzZSB7CisJCQkvKiBjYXNlIDEuMy4gYWxyZWFkeSBjb25uZWN0ZWQgdG8gdGhlIFNTSUQgd2l0aCBoaWdoZXN0IFJTU0kuICovCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gYWxyZWFkeSB3aXRoIHRoaXMgQlNTSUQuIGlnbm9yZSB0aGlzIFNFVF9TU0lEIHJlcXVlc3RcbiIpKTsKKwkJCS8qICovCisJCQkvKiAoSENUIDEyLjEpIDFjX3dsYW5fbWVkaWFldmVudHMgcmVxdWlyZWQgKi8KKwkJCS8qIG1lZGlhIGNvbm5lY3QgZXZlbnRzIGFyZSBpbmRpY2F0ZWQgd2hlbiBhc3NvY2lhdGluZyB3aXRoIHRoZSBzYW1lIEFQICovCisJCQkvKiAqLworCQkJaWYgKElORlJBX09OKHBBZCkpIHsKKwkJCQkvKiAqLworCQkJCS8qIFNpbmNlIE1lZGlhU3RhdGUgYWxyZWFkeSBpcyBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZCAqLworCQkJCS8qIFdlIGp1c3QgaW5kaWNhdGUgdGhlIGNvbm5lY3QgZXZlbnQgYWdhaW4gdG8gbWVldCB0aGUgV0hRTCByZXF1aXJlZC4gKi8KKwkJCQkvKiAqLworCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0KKwkJCQkgICAgTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CiAJCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKLSAgICAgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gdG8gbGluayBpcyB1cAorCQkJCXBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOwkvKiBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gdG8gbGluayBpcyB1cCAqLwogCQkJfQogCiAJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OwotCi0gICAgICAgICAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOwotICAgICAgICAgICAgICAgIG1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBNQUNfQUREUl9MRU4pOwotICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKLQotICAgICAgICAgICAgfQorCQkJUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQocEFkLCBTSU9DR0lXQVAsIC0xLAorCQkJCQkJJnBBZC0+TWxtZUF1eC5Cc3NpZFswXSwgTlVMTCwKKwkJCQkJCTApOwogCQl9Ci0JfQotCWVsc2UgaWYgKElORlJBX09OKHBBZCkpCi0JewotCQkvLwotCQkvLyBGb3IgUlQ2MQotCQkvLyBbODg4ODhdIE9JRF84MDJfMTFfU1NJRCBzaG91bGQgaGF2ZSByZXR1cm5lZCBORFRFU1RfV0VQX0FQMihSZXR1cm5lZDogKQotCQkvLyBSVDYxIG1heSBsb3N0IFNTSUQsIGFuZCBub3QgY29ubmVjdCB0byBORFRFU1RfV0VQX0FQMiBhbmQgd2lsbCBjb25uZWN0IHRvIE5EVEVTVF9XRVBfQVAyIGJ5IEF1dG9yZWNvbm5lY3QKLQkJLy8gQnV0IG1lZGlhIHN0YXR1cyBpcyBjb25uZWN0ZWQsIHNvIHRoZSBTU0lEIG5vdCByZXBvcnQgY29ycmVjdGx5LgotCQkvLwotCQlpZiAoIVNTSURfRVFVQUwocEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbiwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKSkKLQkJewotCQkJLy8KLQkJCS8vIERpZmZlcmVudCBTU0lEIG1lYW5zIG5vdCBSb2FtaW5nIGNhc2UsIHNvIHdlIGxldCBMaW5rRG93bigpIHRvIEluZGljYXRlIGEgZGlzY29ubmVjdCBldmVudC4KLQkJCS8vCisJfSBlbHNlIGlmIChJTkZSQV9PTihwQWQpKSB7CisJCS8qICovCisJCS8qIEZvciBSVDYxICovCisJCS8qIFs4ODg4OF0gT0lEXzgwMl8xMV9TU0lEIHNob3VsZCBoYXZlIHJldHVybmVkIE5EVEVTVF9XRVBfQVAyKFJldHVybmVkOiApICovCisJCS8qIFJUNjEgbWF5IGxvc3QgU1NJRCwgYW5kIG5vdCBjb25uZWN0IHRvIE5EVEVTVF9XRVBfQVAyIGFuZCB3aWxsIGNvbm5lY3QgdG8gTkRURVNUX1dFUF9BUDIgYnkgQXV0b3JlY29ubmVjdCAqLworCQkvKiBCdXQgbWVkaWEgc3RhdHVzIGlzIGNvbm5lY3RlZCwgc28gdGhlIFNTSUQgbm90IHJlcG9ydCBjb3JyZWN0bHkuICovCisJCS8qICovCisJCWlmICghU1NJRF9FUVVBTAorCQkgICAgKHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sCisJCSAgICAgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKSkgeworCQkJLyogKi8KKwkJCS8qIERpZmZlcmVudCBTU0lEIG1lYW5zIG5vdCBSb2FtaW5nIGNhc2UsIHNvIHdlIGxldCBMaW5rRG93bigpIHRvIEluZGljYXRlIGEgZGlzY29ubmVjdCBldmVudC4gKi8KKwkJCS8qICovCiAJCQlwQWQtPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBUUlVFOwogCQl9Ci0JCS8vIGNhc2UgMi4gYWN0aXZlIElORlJBIGFzc29jaWF0aW9uIGV4aXN0ZW50Ci0JCS8vICAgIHJvYW1pbmcgaXMgZG9uZSB3aXRoaW4gbWluaXBvcnQgZHJpdmVyLCBub3RoaW5nIHRvIGRvIHdpdGggY29uZmlndXJhdGlvbgotCQkvLyAgICB1dGlsaXR5LiBzbyB1cG9uIGEgbmV3IFNFVChPSURfODAyXzExX1NTSUQpIGlzIHJlY2VpdmVkLCB3ZSBqdXN0Ci0JCS8vICAgIGRpc2Fzc29jaWF0ZSB3aXRoIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAsCi0JCS8vICAgIHRoZW4gcGVyZm9ybSBhIG5ldyBhc3NvY2lhdGlvbiB3aXRoIHRoaXMgbmV3IFNTSUQsIG5vIG1hdHRlciB0aGUKLQkJLy8gICAgbmV3L29sZCBTU0lEIGFyZSB0aGUgc2FtZSBvciBub3QuCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQLi4uXG4iKSk7Ci0JCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOworCQkvKiBjYXNlIDIuIGFjdGl2ZSBJTkZSQSBhc3NvY2lhdGlvbiBleGlzdGVudCAqLworCQkvKiAgICByb2FtaW5nIGlzIGRvbmUgd2l0aGluIG1pbmlwb3J0IGRyaXZlciwgbm90aGluZyB0byBkbyB3aXRoIGNvbmZpZ3VyYXRpb24gKi8KKwkJLyogICAgdXRpbGl0eS4gc28gdXBvbiBhIG5ldyBTRVQoT0lEXzgwMl8xMV9TU0lEKSBpcyByZWNlaXZlZCwgd2UganVzdCAqLworCQkvKiAgICBkaXNhc3NvY2lhdGUgd2l0aCB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQLCAqLworCQkvKiAgICB0aGVuIHBlcmZvcm0gYSBuZXcgYXNzb2NpYXRpb24gd2l0aCB0aGlzIG5ldyBTU0lELCBubyBtYXR0ZXIgdGhlICovCisJCS8qICAgIG5ldy9vbGQgU1NJRCBhcmUgdGhlIHNhbWUgb3Igbm90LiAqLworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQLi4uXG4iKSk7CisJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQkJCSBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOwogCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKLQkJCQkJc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCksICZEaXNhc3NvY1JlcSk7CisJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSksICZEaXNhc3NvY1JlcSk7CiAJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfRElTQVNTT0M7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChBREhPQ19PTihwQWQpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gZHJvcCBjdXJyZW50IEFESE9DXG4iKSk7CisJfSBlbHNlIHsKKwkJaWYgKEFESE9DX09OKHBBZCkpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBkcm9wIGN1cnJlbnQgQURIT0NcbiIpKTsKIAkJCUxpbmtEb3duKHBBZCwgRkFMU0UpOwotCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKwkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLAorCQkJCQkgICAgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwogCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKIAkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7Ci0gICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6TkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBDIVxuIikpOworCQkJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkNudGxPaWRTc2lkUHJvYygpOk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQyFcbiIpKTsKIAkJfQogCiAJCWlmICgocEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIgPT0gMCkgJiYKLQkJCShwQWQtPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9PSBUUlVFKSAmJgotCQkJKHBBZC0+TWxtZUF1eC5Cc3NUeXBlID09IEJTU19JTkZSQSkgJiYKLQkJCShNbG1lVmFsaWRhdGVTU0lEKHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbikgPT0gVFJVRSkKLQkJCSkKLQkJewotCQkJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgICAgICAgU2NhblJlcTsKKwkJICAgIChwQWQtPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9PSBUUlVFKSAmJgorCQkgICAgKHBBZC0+TWxtZUF1eC5Cc3NUeXBlID09IEJTU19JTkZSQSkgJiYKKwkJICAgIChNbG1lVmFsaWRhdGVTU0lEKHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbikKKwkJICAgICA9PSBUUlVFKQorCQkgICAgKSB7CisJCQlzdHJ1Y3QgcnRfbWxtZV9zY2FuX3JlcSBTY2FuUmVxOwogCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gTm8gbWF0Y2hpbmcgQlNTLCBzdGFydCBhIG5ldyBzY2FuXG4iKSk7Ci0JCQlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCBCU1NfQU5ZLCBTQ0FOX0FDVElWRSk7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKLQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjsKLQkJCS8vIFJlc2V0IE1pc3NlZCBzY2FuIG51bWJlcgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIE5vIG1hdGNoaW5nIEJTUywgc3RhcnQgYSBuZXcgc2NhblxuIikpOworCQkJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIChjaGFyICopcEFkLT5NbG1lQXV4LlNzaWQsCisJCQkJICAgICBwQWQtPk1sbWVBdXguU3NpZExlbiwgQlNTX0FOWSwKKwkJCQkgICAgIFNDQU5fQUNUSVZFKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX3NjYW5fcmVxKSwgJlNjYW5SZXEpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9CisJCQkgICAgQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CisJCQkvKiBSZXNldCBNaXNzZWQgc2NhbiBudW1iZXIgKi8KIAkJCXBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKLQkJfQotCQllbHNlCi0JCXsKKwkJfSBlbHNlIHsKIAkJCXBBZC0+TWxtZUF1eC5Cc3NJZHggPSAwOwogCQkJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7CiAJCX0KIAl9CiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCURlc2NyaXB0aW9uOgpAQCAtNTA2LDE2NSArNTA1LDE5NiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIENudGxPaWRSVEJzc2lkUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKiBFbGVtKQordm9pZCBDbnRsT2lkUlRCc3NpZFByb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVMT05HICAgICAgIEJzc0lkeDsKLQlQVUNIQVIgICAgICBwT2lkQnNzaWQgPSAoUFVDSEFSKUVsZW0tPk1zZzsKLQlNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgICAgRGlzYXNzb2NSZXE7Ci0JTUxNRV9KT0lOX1JFUV9TVFJVQ1QgICAgICAgIEpvaW5SZXE7CisJdW5zaWduZWQgbG9uZyBCc3NJZHg7CisJdTggKnBPaWRCc3NpZCA9ICh1OCAqKUVsZW0tPk1zZzsKKwlzdHJ1Y3QgcnRfbWxtZV9kaXNhc3NvY19yZXEgRGlzYXNzb2NSZXE7CisJc3RydWN0IHJ0X21sbWVfam9pbl9yZXEgSm9pblJlcTsKIAotCS8vIHJlY29yZCB1c2VyIGRlc2lyZWQgc2V0dGluZ3MKKwkvKiByZWNvcmQgdXNlciBkZXNpcmVkIHNldHRpbmdzICovCiAJQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIHBPaWRCc3NpZCk7CiAJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBwQWQtPlN0YUNmZy5Cc3NUeXBlOwogCi0JLy8KLQkvLyBVcGRhdGUgUmVjb25uZWN0IFNzaWQsIHRoYXQgdXNlciBkZXNpcmVkIHRvIGNvbm5lY3QuCi0JLy8KLQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7Ci0JcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuID0gcEFkLT5NbG1lQXV4LlNzaWRMZW47Ci0JTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOwotCi0JLy8gZmluZCB0aGUgZGVzaXJlZCBCU1MgaW4gdGhlIGxhdGVzdCBTQ0FOIHJlc3VsdCB0YWJsZQorCS8qIGZpbmQgdGhlIGRlc2lyZWQgQlNTIGluIHRoZSBsYXRlc3QgU0NBTiByZXN1bHQgdGFibGUgKi8KIAlCc3NJZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBwT2lkQnNzaWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKTsKLQlpZiAoQnNzSWR4ID09IEJTU19OT1RfRk9VTkQpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQlNTSUQgbm90IGZvdW5kLiByZXBseSBORElTX1NUQVRVU19OT1RfQUNDRVBURURcbiIpKTsKLQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwlpZiAoQnNzSWR4ID09IEJTU19OT1RfRk9VTkQpIHsKKwkJc3RydWN0IHJ0X21sbWVfc2Nhbl9yZXEgU2NhblJlcTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkNOVEwgLSBCU1NJRCBub3QgZm91bmQuIHJlcGx5IE5ESVNfU1RBVFVTX05PVF9BQ0NFUFRFRFxuIikpOworCQkvKnBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7ICovCisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJDTlRMIC0gQlNTSUQgbm90IGZvdW5kLiBzdGFydCBhIG5ldyBzY2FuXG4iKSk7CisJCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCAoY2hhciAqKXBBZC0+TWxtZUF1eC5Tc2lkLAorCQkJICAgICBwQWQtPk1sbWVBdXguU3NpZExlbiwgQlNTX0FOWSwgU0NBTl9BQ1RJVkUpOworCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX3NjYW5fcmVxKSwgJlNjYW5SZXEpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CisJCS8qIFJlc2V0IE1pc3NlZCBzY2FuIG51bWJlciAqLworCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUpOwogCQlyZXR1cm47CiAJfQorCS8qICovCisJLyogVXBkYXRlIFJlY29ubmVjdCBTc2lkLCB0aGF0IHVzZXIgZGVzaXJlZCB0byBjb25uZWN0LiAqLworCS8qICovCisJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBNQVhfTEVOX09GX1NTSUQpOworCXBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiA9CisJICAgIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLlNzaWRMZW47CisJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLAorCQkgICAgICAgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uU3NpZCwKKwkJICAgICAgIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLlNzaWRMZW4pOwogCi0JLy8gY29weSB0aGUgbWF0Y2hlZCBCU1MgZW50cnkgZnJvbSBTY2FuVGFiIHRvIE1sbWVBdXguU3NpZEJzc1RhYi4gV2h5PwotCS8vIEJlY2F1c2Ugd2UgbmVlZCB0aGlzIGVudHJ5IHRvIGJlY29tZSB0aGUgSk9JTiB0YXJnZXQgaW4gbGF0ZXIgb24gU1lOQyBzdGF0ZSBtYWNoaW5lCisJLyogY29weSB0aGUgbWF0Y2hlZCBCU1MgZW50cnkgZnJvbSBTY2FuVGFiIHRvIE1sbWVBdXguU3NpZEJzc1RhYi4gV2h5PyAqLworCS8qIEJlY2F1c2Ugd2UgbmVlZCB0aGlzIGVudHJ5IHRvIGJlY29tZSB0aGUgSk9JTiB0YXJnZXQgaW4gbGF0ZXIgb24gU1lOQyBzdGF0ZSBtYWNoaW5lICovCiAJcEFkLT5NbG1lQXV4LkJzc0lkeCA9IDA7CiAJcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIgPSAxOwotCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVswXSwgJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5WzBdLAorCQkgICAgICAgJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLCBzaXplb2Yoc3RydWN0IHJ0X2Jzc19lbnRyeSkpOwogCi0JLy8gMjAwMi0xMS0yNiBza2lwIHRoZSBmb2xsb3dpbmcgY2hlY2tpbmcuIGkuZS4gaWYgdXNlciB3YW50cyB0byByZS1jb25uZWN0IHRvIHNhbWUgQVAKLQkvLyAgIHdlIGp1c3QgZm9sbG93IG5vcm1hbCBwcm9jZWR1cmUuIFRoZSByZWFzb24gb2YgdXNlciBkb2luZyB0aGlzIG1heSBiZWNhdXNlIGhlL3NoZSBjaGFuZ2VkCi0JLy8gICBBUCB0byBhbm90aGVyIGNoYW5uZWwsIGJ1dCB3ZSBzdGlsbCByZWNlaXZlZCBCRUFDT04gZnJvbSBpdCB0aHVzIGRvbid0IGNsYWltIExpbmsgRG93bi4KLQkvLyAgIFNpbmNlIHVzZXIga25vd3MgaGUncyBjaGFuZ2VkIEFQIGNoYW5uZWwsIGhlJ2xsIHJlLWNvbm5lY3QgYWdhaW4uIEJ5IHNraXBwaW5nIHRoZSBmb2xsb3dpbmcKLQkvLyAgIGNoZWNraW5nLCB3ZSdsbCBkaXNhc3NvY2lhdGUgdGhlbiByZS1kbyBub3JtYWwgYXNzb2NpYXRpb24gd2l0aCB0aGlzIEFQIGF0IHRoZSBuZXcgY2hhbm5lbC4KLQkvLyAyMDAzLTEtNiBSZS1lbmFibGUgdGhpcyBmZWF0dXJlIGJhc2VkIG9uIG1pY3Jvc29mdCByZXF1aXJlbWVudCB3aGljaCBwcmVmZXIgbm90IHRvIHJlLWRvCi0JLy8gICBjb25uZWN0aW9uIHdoZW4gc2V0dGluZyB0aGUgc2FtZSBCU1NJRC4KLQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpICYmCi0JCU1BQ19BRERSX0VRVUFMKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwT2lkQnNzaWQpKQorCS8qIEFkZCBTU0lEIGludG8gTWxtZUF1eCBmb3Igc2l0ZSBzdXJleSBqb2luaW5nIGhpZGRlbiBTU0lEICovCisJcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5Tc2lkTGVuOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5Tc2lkLAorCQkgICAgICAgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCiAJewotCQkvLyBhbHJlYWR5IGNvbm5lY3RlZCB0byB0aGUgc2FtZSBCU1NJRCwgZ28gYmFjayB0byBpZGxlIHN0YXRlIGRpcmVjdGx5Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBhbHJlYWR5IGluIHRoaXMgQlNTSUQuIGlnbm9yZSB0aGlzIFNFVF9CU1NJRCByZXF1ZXN0XG4iKSk7Ci0JCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7Ci0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7Ci0KLSAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7Ci0gICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOwotCi0gICAgICAgICAgICB9Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChJTkZSQV9PTihwQWQpKQotCQl7Ci0JCQkvLyBkaXNhc3NvYyBmcm9tIGN1cnJlbnQgQVAgZmlyc3QKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQIC4uLlxuIikpOwotCQkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKLQkJCQkJCXNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOworCQlpZiAoSU5GUkFfT04ocEFkKSkgeworCQkJLyogZGlzYXNzb2MgZnJvbSBjdXJyZW50IEFQIGZpcnN0ICovCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJDTlRMIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUCAuLi5cbiIpKTsKKwkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsCisJCQkJCSBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwKKwkJCQkJIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsCisJCQkJICAgIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSksCisJCQkJICAgICZEaXNhc3NvY1JlcSk7CiAKIAkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfRElTQVNTT0M7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAoQURIT0NfT04ocEFkKSkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gZHJvcCBjdXJyZW50IEFESE9DXG4iKSk7CisJCX0gZWxzZSB7CisJCQlpZiAoQURIT0NfT04ocEFkKSkgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJDTlRMIC0gZHJvcCBjdXJyZW50IEFESE9DXG4iKSk7CiAJCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7Ci0JCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKLQkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCQkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLAorCQkJCQkJICAgIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKwkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9CisJCQkJICAgIE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOwogCQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7Ci0gICAgICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEMhXG4iKSk7CisJCQkJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBDIVxuIikpOwogCQkJfQotCi0JCQkvLyBDaGFuZ2UgdGhlIHdlcHN0YXR1cyB0byBvcmlnaW5hbCB3ZXBzdGF0dXMKLQkJCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKLQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKKwkJCS8qIENoYW5nZSB0aGUgd2Vwc3RhdHVzIHRvIG9yaWdpbmFsIHdlcHN0YXR1cyAqLworCQkJcEFkLT5TdGFDZmcuV2VwU3RhdHVzID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKKwkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOwogCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOwogCi0JCQkvLyBDaGVjayBjaXBoZXIgc3VpdGUsIEFQIG11c3QgaGF2ZSBtb3JlIHNlY3VyZWQgY2lwaGVyIHRoYW4gc3RhdGlvbiBzZXR0aW5nCi0JCQkvLyBTZXQgdGhlIFBhaXJ3aXNlIGFuZCBHcm91cCBjaXBoZXIgdG8gbWF0Y2ggdGhlIGludGVuZGVkIEFQIHNldHRpbmcKLQkJCS8vIFdlIGNhbiBvbmx5IGNvbm5lY3QgdG8gQVAgd2l0aCBsZXNzIHNlY3VyZWQgY2lwaGVyIHNldHRpbmcKLQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKLQkJCXsKLQkJCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5Hcm91cENpcGhlcjsKKwkJCS8qIENoZWNrIGNpcGhlciBzdWl0ZSwgQVAgbXVzdCBoYXZlIG1vcmUgc2VjdXJlZCBjaXBoZXIgdGhhbiBzdGF0aW9uIHNldHRpbmcgKi8KKwkJCS8qIFNldCB0aGUgUGFpcndpc2UgYW5kIEdyb3VwIGNpcGhlciB0byBtYXRjaCB0aGUgaW50ZW5kZWQgQVAgc2V0dGluZyAqLworCQkJLyogV2UgY2FuIG9ubHkgY29ubmVjdCB0byBBUCB3aXRoIGxlc3Mgc2VjdXJlZCBjaXBoZXIgc2V0dGluZyAqLworCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCQkgICAgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09CisJCQkJTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkgeworCQkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0KKwkJCQkgICAgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLgorCQkJCSAgICBHcm91cENpcGhlcjsKIAotCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXIpCi0JCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlcjsKLQkJCQllbHNlIGlmIChwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlckF1eCAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0JCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlckF1eDsKLQkJCQllbHNlCS8vIFRoZXJlIGlzIG5vIFBhaXJDaXBoZXIgQXV4LCBkb3duZ3JhZGUgb3VyIGNhcGFiaWxpdHkgdG8gVEtJUAotCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09CisJCQkJICAgIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS4KKwkJCQkgICAgUGFpckNpcGhlcikKKwkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9CisJCQkJCSAgICBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuCisJCQkJCSAgICBQYWlyQ2lwaGVyOworCQkJCWVsc2UgaWYgKHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS4KKwkJCQkJIFBhaXJDaXBoZXJBdXggIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0KKwkJCQkJICAgIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS4KKwkJCQkJICAgIFBhaXJDaXBoZXJBdXg7CisJCQkJZWxzZQkvKiBUaGVyZSBpcyBubyBQYWlyQ2lwaGVyIEF1eCwgZG93bmdyYWRlIG91ciBjYXBhYmlsaXR5IHRvIFRLSVAgKi8KKwkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9CisJCQkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQkJfSBlbHNlCisJCQkgICAgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorCQkJCXx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkJCSAgICBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkgeworCQkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0KKwkJCQkgICAgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi4KKwkJCQkgICAgR3JvdXBDaXBoZXI7CisKKwkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09CisJCQkJICAgIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuCisJCQkJICAgIFBhaXJDaXBoZXIpCisJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPQorCQkJCQkgICAgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi4KKwkJCQkJICAgIFBhaXJDaXBoZXI7CisJCQkJZWxzZSBpZiAocEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi4KKwkJCQkJIFBhaXJDaXBoZXJBdXggIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0KKwkJCQkJICAgIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuCisJCQkJCSAgICBQYWlyQ2lwaGVyQXV4OworCQkJCWVsc2UJLyogVGhlcmUgaXMgbm8gUGFpckNpcGhlciBBdXgsIGRvd25ncmFkZSBvdXIgY2FwYWJpbGl0eSB0byBUS0lQICovCisJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPQorCQkJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKworCQkJCS8qIFJTTiBjYXBhYmlsaXR5ICovCisJCQkJcEFkLT5TdGFDZmcuUnNuQ2FwYWJpbGl0eSA9CisJCQkJICAgIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuCisJCQkJICAgIFJzbkNhcGFiaWxpdHk7CiAJCQl9Ci0JCQllbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQotCQkJewotCQkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5Hcm91cENpcGhlcjsKLQotCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyKQotCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyOwotCQkJCWVsc2UgaWYgKHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlckF1eCAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0JCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXJBdXg7Ci0JCQkJZWxzZQkvLyBUaGVyZSBpcyBubyBQYWlyQ2lwaGVyIEF1eCwgZG93bmdyYWRlIG91ciBjYXBhYmlsaXR5IHRvIFRLSVAKLQkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0KLQkJCQkvLyBSU04gY2FwYWJpbGl0eQotCQkJCXBBZC0+U3RhQ2ZnLlJzbkNhcGFiaWxpdHkgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlJzbkNhcGFiaWxpdHk7Ci0JCQl9Ci0KLQkJCS8vIFNldCBNaXggY2lwaGVyIGZsYWcKLQkJCXBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgPSAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcikgPyBGQUxTRSA6IFRSVUU7Ci0JCQlpZiAocEFkLT5TdGFDZmcuYk1peENpcGhlciA9PSBUUlVFKQotCQkJewotCQkJCS8vIElmIG1peCBjaXBoZXIsIHJlLWJ1aWxkIFJTTklFCi0JCQkJUlRNUE1ha2VSU05JRShwQWQsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIDApOwotCQkJfQotCQkJLy8gTm8gYWN0aXZlIGFzc29jaWF0aW9uLCBqb2luIHRoZSBCU1MgaW1tZWRpYXRlbHkKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBqb2luaW5nICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IC4uLlxuIiwKLQkJCQlwT2lkQnNzaWRbMF0scE9pZEJzc2lkWzFdLHBPaWRCc3NpZFsyXSxwT2lkQnNzaWRbM10scE9pZEJzc2lkWzRdLHBPaWRCc3NpZFs1XSkpOworCQkJLyogU2V0IE1peCBjaXBoZXIgZmxhZyAqLworCQkJcEFkLT5TdGFDZmcuYk1peENpcGhlciA9CisJCQkgICAgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0KKwkJCSAgICAgcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIpID8gRkFMU0UgOiBUUlVFOworCQkJLyppZiAocEFkLT5TdGFDZmcuYk1peENpcGhlciA9PSBUUlVFKQorCQkJICAgeworCQkJICAgLy8gSWYgbWl4IGNpcGhlciwgcmUtYnVpbGQgUlNOSUUKKwkJCSAgIFJUTVBNYWtlUlNOSUUocEFkLCBwQWQtPlN0YUNmZy5BdXRoTW9kZSwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCAwKTsKKwkJCSAgIH0gKi8KKwkJCS8qIE5vIGFjdGl2ZSBhc3NvY2lhdGlvbiwgam9pbiB0aGUgQlNTIGltbWVkaWF0ZWx5ICovCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJDTlRMIC0gam9pbmluZyAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAuLi5cbiIsCisJCQkJICBwT2lkQnNzaWRbMF0sIHBPaWRCc3NpZFsxXSwgcE9pZEJzc2lkWzJdLAorCQkJCSAgcE9pZEJzc2lkWzNdLCBwT2lkQnNzaWRbNF0sIHBPaWRCc3NpZFs1XSkpOwogCiAJCQlKb2luUGFybUZpbGwocEFkLCAmSm9pblJlcSwgcEFkLT5NbG1lQXV4LkJzc0lkeCk7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfSk9JTl9SRVEsIHNpemVvZihNTE1FX0pPSU5fUkVRX1NUUlVDVCksICZKb2luUmVxKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9KT0lOX1JFUSwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2pvaW5fcmVxKSwgJkpvaW5SZXEpOwogCiAJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0pPSU47CiAJCX0KIAl9CiB9CiAKLS8vIFJvYW1pbmcgaXMgdGhlIG9ubHkgZXh0ZXJuYWwgcmVxdWVzdCB0cmlnZ2VyaW5nIENOVEwgc3RhdGUgbWFjaGluZQotLy8gZGVzcGl0ZSBvZiBvdGhlciAiU0VUIE9JRCIgb3BlcmF0aW9uLiBBbGwgIlNFVCBPSUQiIHJlbGF0ZWQgb2VyYXRpb25zCi0vLyBoYXBwZW4gaW4gc2VxdWVuY2UsIGJlY2F1c2Ugbm8gb3RoZXIgU0VUIE9JRCB3aWxsIGJlIHNlbnQgdG8gdGhpcyBkZXZpY2UKLS8vIHVudGlsIHRoZSB0aGUgcHJldmlvdXMgU0VUIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSAoc3VjY2Vzc2Z1bCBvIGZhaWxlZCkuCi0vLyBTbywgaG93IGRvIHdlIHF1YXJhbnRlZSB0aGlzIFJPQU1JTkcgcmVxdWVzdCB3b24ndCBjb3JydXB0IG90aGVyICJTRVQgT0lEIj8KLS8vIG9yIGJlZW4gY29ycnVwdGVkIGJ5IG90aGVyICJTRVQgT0lEIj8KLS8vCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVZPSUQgQ250bE1sbWVSb2FtaW5nUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCisvKiBSb2FtaW5nIGlzIHRoZSBvbmx5IGV4dGVybmFsIHJlcXVlc3QgdHJpZ2dlcmluZyBDTlRMIHN0YXRlIG1hY2hpbmUgKi8KKy8qIGRlc3BpdGUgb2Ygb3RoZXIgIlNFVCBPSUQiIG9wZXJhdGlvbi4gQWxsICJTRVQgT0lEIiByZWxhdGVkIG9lcmF0aW9ucyAqLworLyogaGFwcGVuIGluIHNlcXVlbmNlLCBiZWNhdXNlIG5vIG90aGVyIFNFVCBPSUQgd2lsbCBiZSBzZW50IHRvIHRoaXMgZGV2aWNlICovCisvKiB1bnRpbCB0aGUgdGhlIHByZXZpb3VzIFNFVCBvcGVyYXRpb24gaXMgY29tcGxldGUgKHN1Y2Nlc3NmdWwgbyBmYWlsZWQpLiAqLworLyogU28sIGhvdyBkbyB3ZSBxdWFyYW50ZWUgdGhpcyBST0FNSU5HIHJlcXVlc3Qgd29uJ3QgY29ycnVwdCBvdGhlciAiU0VUIE9JRCI/ICovCisvKiBvciBiZWVuIGNvcnJ1cHRlZCBieSBvdGhlciAiU0VUIE9JRCI/ICovCisvKiAqLworLyogSVJRTCA9IERJU1BBVENIX0xFVkVMICovCit2b2lkIENudGxNbG1lUm9hbWluZ1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCS8vIFRPRE86Ci0JLy8gQVAgaW4gZGlmZmVyZW50IGNoYW5uZWwgbWF5IHNob3cgbG93ZXIgUlNTSSB0aGFuIGFjdHVhbCB2YWx1ZT8/Ci0JLy8gc2hvdWxkIHdlIGFkZCBhIHdlaWdodGluZyBmYWN0b3IgdG8gY29tcGVuc2F0ZSBpdD8KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBSb2FtaW5nIGluIE1sbWVBdXguUm9hbVRhYi4uLlxuIikpOworCXU4IEJCUFZhbHVlID0gMDsKIAotCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYiwgJnBBZC0+TWxtZUF1eC5Sb2FtVGFiLCBzaXplb2YocEFkLT5NbG1lQXV4LlJvYW1UYWIpKTsKLQlwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOciA9IHBBZC0+TWxtZUF1eC5Sb2FtVGFiLkJzc05yOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBSb2FtaW5nIGluIE1sbWVBdXguUm9hbVRhYi4uLlxuIikpOwogCi0JQnNzVGFibGVTb3J0QnlSc3NpKCZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYik7Ci0JcEFkLT5NbG1lQXV4LkJzc0lkeCA9IDA7Ci0JSXRlcmF0ZU9uQnNzVGFiKHBBZCk7CisJeworCQkvKkxldCBCQlAgcmVnaXN0ZXIgYXQgMjBNSHogdG8gZG8gKGZhc3QpIHJvYW1pbmcuICovCisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJQkJQVmFsdWUgJj0gKH4weDE4KTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCisJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYiwgJnBBZC0+TWxtZUF1eC5Sb2FtVGFiLAorCQkJICAgICAgIHNpemVvZihwQWQtPk1sbWVBdXguUm9hbVRhYikpOworCQlwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOciA9IHBBZC0+TWxtZUF1eC5Sb2FtVGFiLkJzc05yOworCisJCUJzc1RhYmxlU29ydEJ5UnNzaSgmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIpOworCQlwQWQtPk1sbWVBdXguQnNzSWR4ID0gMDsKKwkJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7CisJfQogfQogCiAvKgpAQCAtNjc1LDM0ICs3MDUsMzUgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBDbnRsV2FpdERpc2Fzc29jUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIENudGxXYWl0RGlzYXNzb2NQcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgICAgIFN0YXJ0UmVxOworCXN0cnVjdCBydF9tbG1lX3N0YXJ0X3JlcSBTdGFydFJlcTsKIAotCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9ESVNBU1NPQ19DT05GKQotCXsKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfRElTQVNTT0NfQ09ORikgewogCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gRGlzLWFzc29jaWF0ZSBzdWNjZXNzZnVsXG4iKSk7CiAKLQkgICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQotCQl7Ci0JCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19ESVNBU1NPQ19FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpIHsKKwkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RJU0FTU09DX0VWRU5UX0ZMQUcsCisJCQkJCSAgICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uCisJCQkJCSAgICAgIEFkZHIsIEJTUzAsIDApOwogCQl9CiAKIAkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CiAKLQkJLy8gY2FzZSAxLiBubyBtYXRjaGluZyBCU1MsIGFuZCB1c2VyIHdhbnRzIEFESE9DLCBzbyB3ZSBqdXN0IHN0YXJ0IGEgbmV3IG9uZQotCQlpZiAoKHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yPT0wKSAmJiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gTm8gbWF0Y2hpbmcgQlNTLCBzdGFydCBhIG5ldyBBREhPQyAoU3NpZD0lcykuLi5cbiIscEFkLT5NbG1lQXV4LlNzaWQpKTsKLQkJCVN0YXJ0UGFybUZpbGwocEFkLCAmU3RhcnRSZXEsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU1RBUlRfUkVRLCBzaXplb2YoTUxNRV9TVEFSVF9SRVFfU1RSVUNUKSwgJlN0YXJ0UmVxKTsKKwkJLyogY2FzZSAxLiBubyBtYXRjaGluZyBCU1MsIGFuZCB1c2VyIHdhbnRzIEFESE9DLCBzbyB3ZSBqdXN0IHN0YXJ0IGEgbmV3IG9uZSAqLworCQlpZiAoKHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yID09IDApCisJCSAgICAmJiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJDTlRMIC0gTm8gbWF0Y2hpbmcgQlNTLCBzdGFydCBhIG5ldyBBREhPQyAoU3NpZD0lcykuLi5cbiIsCisJCQkJICBwQWQtPk1sbWVBdXguU3NpZCkpOworCQkJU3RhcnRQYXJtRmlsbChwQWQsICZTdGFydFJlcSwgKGNoYXIgKilwQWQtPk1sbWVBdXguU3NpZCwKKwkJCQkgICAgICBwQWQtPk1sbWVBdXguU3NpZExlbik7CisJCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU1RBUlRfUkVRLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHJ0X21sbWVfc3RhcnRfcmVxKSwgJlN0YXJ0UmVxKTsKIAkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfU1RBUlQ7CiAJCX0KLQkJLy8gY2FzZSAyLiB0cnkgZWFjaCBtYXRjaGVkIEJTUwotCQllbHNlCi0JCXsKKwkJLyogY2FzZSAyLiB0cnkgZWFjaCBtYXRjaGVkIEJTUyAqLworCQllbHNlIHsKIAkJCXBBZC0+TWxtZUF1eC5Cc3NJZHggPSAwOwogCiAJCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKQEAgLTcxOCw3NCArNzQ5LDgxIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgQ250bFdhaXRKb2luUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIENudGxXYWl0Sm9pblByb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVTSE9SVCAgICAgICAgICAgICAgICAgICAgICBSZWFzb247Ci0JTUxNRV9BVVRIX1JFUV9TVFJVQ1QgICAgICAgIEF1dGhSZXE7CisJdTE2IFJlYXNvbjsKKwlzdHJ1Y3QgcnRfbWxtZV9hdXRoX3JlcSBBdXRoUmVxOwogCi0JaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0pPSU5fQ09ORikKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOwotCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykKLQkJewotCQkJLy8gMS4gam9pbmVkIGFuIElCU1MsIHdlIGFyZSBwcmV0dHkgbXVjaCBkb25lIGhlcmUKLQkJCWlmIChwQWQtPk1sbWVBdXguQnNzVHlwZSA9PSBCU1NfQURIT0MpCi0JCQl7Ci0JCQkgICAgLy8KLQkJCQkvLyA1RyBiYW5kcyBydWxlcyBvZiBKYXBhbjoKLQkJCQkvLyBBZCBob2MgbXVzdCBiZSBkaXNhYmxlZCBpbiBXNTMoY2g1Miw1Niw2MCw2NCkgY2hhbm5lbHMuCi0JCQkJLy8KLQkJCQlpZiAoIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJgotICAgICAgICAgICAgICAgICAgICAgIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQkJCQkgICApCi0JCQkJewotCQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQ2hhbm5lbD0lZCwgSm9pbiBhZGhvYyBvbiBXNTMoNTIsNTYsNjAsNjQpIENoYW5uZWxzIGFyZSBub3QgYWNjZXB0ZWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfSk9JTl9DT05GKSB7CisJCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKHUxNikpOworCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykgeworCQkJLyogMS4gam9pbmVkIGFuIElCU1MsIHdlIGFyZSBwcmV0dHkgbXVjaCBkb25lIGhlcmUgKi8KKwkJCWlmIChwQWQtPk1sbWVBdXguQnNzVHlwZSA9PSBCU1NfQURIT0MpIHsKKwkJCQkvKiAqLworCQkJCS8qIDVHIGJhbmRzIHJ1bGVzIG9mIEphcGFuOiAqLworCQkJCS8qIEFkIGhvYyBtdXN0IGJlIGRpc2FibGVkIGluIFc1MyhjaDUyLDU2LDYwLDY0KSBjaGFubmVscy4gKi8KKwkJCQkvKiAqLworCQkJCWlmICgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYKKwkJCQkgICAgUmFkYXJDaGFubmVsQ2hlY2socEFkLAorCQkJCQkJICAgICAgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJCQkgICAgKSB7CisJCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPQorCQkJCQkgICAgQ05UTF9JRExFOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAoIkNOVEwgLSBDaGFubmVsPSVkLCBKb2luIGFkaG9jIG9uIFc1Myg1Miw1Niw2MCw2NCkgQ2hhbm5lbHMgYXJlIG5vdCBhY2NlcHRlZFxuIiwKKwkJCQkJCSAgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOwogCQkJCQlyZXR1cm47CiAJCQkJfQogCiAJCQkJTGlua1VwKHBBZCwgQlNTX0FESE9DKTsKIAkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBqb2luIHRoZSBJQlNTID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggLi4uXG4iLAotCQkJCXBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzBdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzFdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzJdLAotCQkJCXBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzNdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzRdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzVdKSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIkNOVEwgLSBqb2luIHRoZSBJQlNTID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggLi4uXG4iLAorCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzBdLAorCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzFdLAorCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzJdLAorCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzNdLAorCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzRdLAorCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzVdKSk7CiAKLSAgICAgICAgICAgICAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwotICAgICAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOworCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0KKwkJCQkgICAgTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisJCQkJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7CiAJCQl9Ci0JCQkvLyAyLiBqb2luZWQgYSBuZXcgSU5GUkEgbmV0d29yaywgc3RhcnQgZnJvbSBhdXRoZW50aWNhdGlvbgotCQkJZWxzZQotCQkJeworCQkJLyogMi4gam9pbmVkIGEgbmV3IElORlJBIG5ldHdvcmssIHN0YXJ0IGZyb20gYXV0aGVudGljYXRpb24gKi8KKwkJCWVsc2UgewogCQkJCXsKLQkJCQkJLy8gZWl0aGVyIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCBvciBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoLCB0cnkgc2hhcmVkIGtleSBmaXJzdAotCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkgfHwKLQkJCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKSkKLQkJCQkJewotCQkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKTsKKwkJCQkJLyogZWl0aGVyIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCBvciBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoLCB0cnkgc2hhcmVkIGtleSBmaXJzdCAqLworCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09CisJCQkJCSAgICAgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQorCQkJCQkgICAgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09CisJCQkJCQlOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKSkgeworCQkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsCisJCQkJCQkJICAgICBwQWQtPk1sbWVBdXguQnNzaWQsCisJCQkJCQkJICAgICBBVVRIX01PREVfS0VZKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLAorCQkJCQkJCSAgICAgcEFkLT5NbG1lQXV4LkJzc2lkLAorCQkJCQkJCSAgICAgQVVUSF9NT0RFX09QRU4pOwogCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTmRpczgwMl8xMUF1dGhNb2RlT3Blbik7Ci0JCQkJCX0KKwkJCQkJTWxtZUVucXVldWUocEFkLCBBVVRIX1NUQVRFX01BQ0hJTkUsCisJCQkJCQkgICAgTVQyX01MTUVfQVVUSF9SRVEsCisJCQkJCQkgICAgc2l6ZW9mCisJCQkJCQkgICAgKHN0cnVjdCBydF9tbG1lX2F1dGhfcmVxKSwKKwkJCQkJCSAgICAmQXV0aFJlcSk7CiAJCQkJfQotCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVVUSF9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BVVRIX1JFUSwKLQkJCQkJCQlzaXplb2YoTUxNRV9BVVRIX1JFUV9TVFJVQ1QpLCAmQXV0aFJlcSk7CiAKLQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0FVVEg7CisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9CisJCQkJICAgIENOVExfV0FJVF9BVVRIOwogCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gMy4gZmFpbGVkLCB0cnkgbmV4dCBCU1MKKwkJfSBlbHNlIHsKKwkJCS8qIDMuIGZhaWxlZCwgdHJ5IG5leHQgQlNTICovCiAJCQlwQWQtPk1sbWVBdXguQnNzSWR4Kys7CiAJCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKIAkJfQogCX0KIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJRGVzY3JpcHRpb246CkBAIC03OTQsNzQgKzgzMiw4NiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIENudGxXYWl0U3RhcnRQcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgQ250bFdhaXRTdGFydFByb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVTSE9SVCAgICAgIFJlc3VsdDsKKwl1MTYgUmVzdWx0OwogCi0JaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX1NUQVJUX0NPTkYpCi0JewotCQlOZGlzTW92ZU1lbW9yeSgmUmVzdWx0LCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKLQkJaWYgKFJlc3VsdCA9PSBNTE1FX1NVQ0NFU1MpCi0JCXsKLQkJICAgIC8vCi0JCQkvLyA1RyBiYW5kcyBydWxlcyBvZiBKYXBhbjoKLQkJCS8vIEFkIGhvYyBtdXN0IGJlIGRpc2FibGVkIGluIFc1MyhjaDUyLDU2LDYwLDY0KSBjaGFubmVscy4KLQkJCS8vCi0JCQlpZiAoIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJgotICAgICAgICAgICAgICAgICAgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQotCQkJICAgKQotCQkJeworCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9TVEFSVF9DT05GKSB7CisJCU5kaXNNb3ZlTWVtb3J5KCZSZXN1bHQsIEVsZW0tPk1zZywgc2l6ZW9mKHUxNikpOworCQlpZiAoUmVzdWx0ID09IE1MTUVfU1VDQ0VTUykgeworCQkJLyogKi8KKwkJCS8qIDVHIGJhbmRzIHJ1bGVzIG9mIEphcGFuOiAqLworCQkJLyogQWQgaG9jIG11c3QgYmUgZGlzYWJsZWQgaW4gVzUzKGNoNTIsNTYsNjAsNjQpIGNoYW5uZWxzLiAqLworCQkJLyogKi8KKwkJCWlmICgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYKKwkJCSAgICBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCQkgICAgKSB7CiAJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQ2hhbm5lbD0lZCwgU3RhcnQgYWRob2Mgb24gVzUzKDUyLDU2LDYwLDY0KSBDaGFubmVscyBhcmUgbm90IGFjY2VwdGVkXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIkNOVEwgLSBDaGFubmVsPSVkLCBTdGFydCBhZGhvYyBvbiBXNTMoNTIsNTYsNjAsNjQpIENoYW5uZWxzIGFyZSBub3QgYWNjZXB0ZWRcbiIsCisJCQkJCSAgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOwogCQkJCXJldHVybjsKIAkJCX0KLQotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKLQkJCXsKKwkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLgorCQkJCSAgICAgICBNQ1NTZXRbMF0sIDE2KTsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpIHsKIAkJCQlOX0NoYW5uZWxDaGVjayhwQWQpOwogCQkJCVNldENvbW1vbkhUKHBBZCk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sICZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOwotCQkJCVJUTVBDaGVja0h0KHBBZCwgQlNTSURfV0NJRCwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbyk7Ci0JCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBUUlVFOwotCQkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSwgMTYpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0sIDE2KTsKLQkJCQlDT1BZX0hUU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKHBBZCk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sCisJCQkJCSAgICAgICAmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSkpOworCQkJCVJUTVBDaGVja0h0KHBBZCwgQlNTSURfV0NJRCwKKwkJCQkJICAgICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCisJCQkJCSAgICAmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvKTsKKwkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9CisJCQkJICAgIFRSVUU7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uCisJCQkJCSAgICAgICBNQ1NTZXRbMF0sCisJCQkJCSAgICAgICAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LgorCQkJCQkgICAgICAgTUNTU2V0WzBdLCAxNik7CisJCQkJQ09QWV9IVFNFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRworCQkJCSAgICAocEFkKTsKIAotCQkJCWlmICgocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggID09IEJXXzQwKSAmJgotCQkJCQkocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9BQk9WRSkpCi0JCQkJewotCQkJCQlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsICsgMjsKKwkJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uCisJCQkJICAgICBDaGFubmVsV2lkdGggPT0gQldfNDApCisJCQkJICAgICYmIChwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLgorCQkJCQlFeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9BQk9WRSkpIHsKKwkJCQkJcEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsID0KKwkJCQkJICAgIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgKyAyOworCQkJCX0gZWxzZQorCQkJCSAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uCisJCQkJCSBDaGFubmVsV2lkdGggPT0gQldfNDApCisJCQkJCSYmIChwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLgorCQkJCQkgICAgRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQkVMT1cpKSB7CisJCQkJCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCA9CisJCQkJCSAgICBwQWQtPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKIAkJCQl9Ci0JCQkJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoICA9PSBCV180MCkgJiYKLQkJCQkJCSAocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9CRUxPVykpCi0JCQkJewotCQkJCQlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKKwkJCX0gZWxzZSB7CisJCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPQorCQkJCSAgICBGQUxTRTsKIAkJCX0KIAkJCUxpbmtVcChwQWQsIEJTU19BREhPQyk7CiAJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotCQkJLy8gQmVmb3JlIHNlbmQgYmVhY29uLCBkcml2ZXIgbmVlZCBkbyByYWRhciBkZXRlY3Rpb24KLQkJCWlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0ICkKLQkJCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKLQkJCQkmJiBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKQotCQkJewotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9IFJEX1NJTEVOQ0VfTU9ERTsKKwkJCS8qIEJlZm9yZSBzZW5kIGJlYWNvbiwgZHJpdmVyIG5lZWQgZG8gcmFkYXIgZGV0ZWN0aW9uICovCisJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwkJCSAgICAmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKKwkJCSAgICAmJiBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKSB7CisJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0KKwkJCQkgICAgUkRfU0lMRU5DRV9NT0RFOwogCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJEQ291bnQgPSAwOwogCQkJfQogCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gc3RhcnQgYSBuZXcgSUJTUyA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IC4uLlxuIiwKLQkJCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZFswXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFsxXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFsyXSwKLQkJCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZFszXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFs0XSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFs1XSkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIFN0YXJ0IElCU1MgZmFpbC4gQlVHISEhISFcbiIpKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkNOVEwgLSBzdGFydCBhIG5ldyBJQlNTID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggLi4uXG4iLAorCQkJCSAgcEFkLT5Db21tb25DZmcuQnNzaWRbMF0sCisJCQkJICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFsxXSwKKwkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzJdLAorCQkJCSAgcEFkLT5Db21tb25DZmcuQnNzaWRbM10sCisJCQkJICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFs0XSwKKwkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzVdKSk7CisJCX0gZWxzZSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJDTlRMIC0gU3RhcnQgSUJTUyBmYWlsLiBCVUchXG4iKSk7CiAJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwogCQl9CiAJfQpAQCAtODc1LDUyICs5MjUsNTcgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBDbnRsV2FpdEF1dGhQcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgQ250bFdhaXRBdXRoUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICBSZWFzb247Ci0JTUxNRV9BU1NPQ19SRVFfU1RSVUNUICAgICAgICBBc3NvY1JlcTsKLQlNTE1FX0FVVEhfUkVRX1NUUlVDVCAgICAgICAgIEF1dGhSZXE7CisJdTE2IFJlYXNvbjsKKwlzdHJ1Y3QgcnRfbWxtZV9hc3NvY19yZXEgQXNzb2NSZXE7CisJc3RydWN0IHJ0X21sbWVfYXV0aF9yZXEgQXV0aFJlcTsKIAotCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9BVVRIX0NPTkYpCi0JewotCQlOZGlzTW92ZU1lbW9yeSgmUmVhc29uLCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKLQkJaWYgKFJlYXNvbiA9PSBNTE1FX1NVQ0NFU1MpCi0JCXsKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfQVVUSF9DT05GKSB7CisJCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKHUxNikpOworCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykgewogCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggT0tcbiIpKTsKLQkJCUFzc29jUGFybUZpbGwocEFkLCAmQXNzb2NSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvLAotCQkJCQkJICBBU1NPQ19USU1FT1VULCBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQpOworCQkJQXNzb2NQYXJtRmlsbChwQWQsICZBc3NvY1JlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLAorCQkJCSAgICAgIHBBZC0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbywKKwkJCQkgICAgICBBU1NPQ19USU1FT1VULAorCQkJCSAgICAgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCk7CiAKIAkJCXsKLQkJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FTU09DX1JFUSwKLQkJCQkJCQlzaXplb2YoTUxNRV9BU1NPQ19SRVFfU1RSVUNUKSwgJkFzc29jUmVxKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsCisJCQkJCSAgICBNVDJfTUxNRV9BU1NPQ19SRVEsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IHJ0X21sbWVfYXNzb2NfcmVxKSwKKwkJCQkJICAgICZBc3NvY1JlcSk7CiAKLQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0FTU09DOworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPQorCQkJCSAgICBDTlRMX1dBSVRfQVNTT0M7CiAJCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyBUaGlzIGZhaWwgbWF5IGJlY2F1c2Ugb2YgdGhlIEFQIGFscmVhZHkga2VlcCB1cyBpbiBpdHMgTUFDIHRhYmxlIHdpdGhvdXQKLQkJCS8vIGFnZWluZy1vdXQuIFRoZSBwcmV2aW91cyBhdXRoZW50aWNhdGlvbiBhdHRlbXB0IG11c3QgaGF2ZSBsZXQgaXQgcmVtb3ZlIHVzLgotCQkJLy8gc28gdHJ5IEF1dGhlbnRpY2F0aW9uIGFnYWluIG1heSBoZWxwLiBGb3IgRC1MaW5rIERXTC05MDBBUCsgY29tcGF0aWJpbGl0eS4KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBVVRIIEZBSUwsIHRyeSBhZ2Fpbi4uLlxuIikpOworCQl9IGVsc2UgeworCQkJLyogVGhpcyBmYWlsIG1heSBiZWNhdXNlIG9mIHRoZSBBUCBhbHJlYWR5IGtlZXAgdXMgaW4gaXRzIE1BQyB0YWJsZSB3aXRob3V0ICovCisJCQkvKiBhZ2Vpbmctb3V0LiBUaGUgcHJldmlvdXMgYXV0aGVudGljYXRpb24gYXR0ZW1wdCBtdXN0IGhhdmUgbGV0IGl0IHJlbW92ZSB1cy4gKi8KKwkJCS8qIHNvIHRyeSBBdXRoZW50aWNhdGlvbiBhZ2FpbiBtYXkgaGVscC4gRm9yIEQtTGluayBEV0wtOTAwQVArIGNvbXBhdGliaWxpdHkuICovCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJDTlRMIC0gQVVUSCBGQUlMLCB0cnkgYWdhaW4uLi5cbiIpKTsKIAogCQkJewotCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKSB8fAotCQkJCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkpCi0JCQkJewotCQkJCQkvLyBlaXRoZXIgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkIG9yIE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gsIHRyeSBzaGFyZWQga2V5IGZpcnN0Ci0JCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCk7CisJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkJCSAgICAgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQorCQkJCSAgICB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0KKwkJCQkJTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkpIHsKKwkJCQkJLyogZWl0aGVyIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCBvciBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoLCB0cnkgc2hhcmVkIGtleSBmaXJzdCAqLworCQkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwKKwkJCQkJCSAgICAgcEFkLT5NbG1lQXV4LkJzc2lkLAorCQkJCQkJICAgICBBVVRIX01PREVfS0VZKTsKKwkJCQl9IGVsc2UgeworCQkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwKKwkJCQkJCSAgICAgcEFkLT5NbG1lQXV4LkJzc2lkLAorCQkJCQkJICAgICBBVVRIX01PREVfT1BFTik7CiAJCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pOwotCQkJCX0KLQkJCX0KLQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVVUSF9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BVVRIX1JFUSwKLQkJCQkJCXNpemVvZihNTE1FX0FVVEhfUkVRX1NUUlVDVCksICZBdXRoUmVxKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIEFVVEhfU1RBVEVfTUFDSElORSwKKwkJCQkJICAgIE1UMl9NTE1FX0FVVEhfUkVRLAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2F1dGhfcmVxKSwKKwkJCQkJICAgICZBdXRoUmVxKTsKIAorCQkJfQogCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9BVVRIMjsKIAkJfQogCX0KQEAgLTkzNCw0NCArOTg5LDQ5IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgQ250bFdhaXRBdXRoUHJvYzIoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBDbnRsV2FpdEF1dGhQcm9jMihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICBSZWFzb247Ci0JTUxNRV9BU1NPQ19SRVFfU1RSVUNUICAgICAgICBBc3NvY1JlcTsKLQlNTE1FX0FVVEhfUkVRX1NUUlVDVCAgICAgICAgIEF1dGhSZXE7CisJdTE2IFJlYXNvbjsKKwlzdHJ1Y3QgcnRfbWxtZV9hc3NvY19yZXEgQXNzb2NSZXE7CisJc3RydWN0IHJ0X21sbWVfYXV0aF9yZXEgQXV0aFJlcTsKIAotCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9BVVRIX0NPTkYpCi0JewotCQlOZGlzTW92ZU1lbW9yeSgmUmVhc29uLCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKLQkJaWYgKFJlYXNvbiA9PSBNTE1FX1NVQ0NFU1MpCi0JCXsKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfQVVUSF9DT05GKSB7CisJCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKHUxNikpOworCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykgewogCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggT0tcbiIpKTsKLQkJCUFzc29jUGFybUZpbGwocEFkLCAmQXNzb2NSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvLAotCQkJCQkJICBBU1NPQ19USU1FT1VULCBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQpOwotCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BU1NPQ19SRVEsCi0JCQkJCQlzaXplb2YoTUxNRV9BU1NPQ19SRVFfU1RSVUNUKSwgJkFzc29jUmVxKTsKLQotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9BU1NPQzsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkgJiYKLQkJCQkgKHBBZC0+TWxtZUF1eC5BbGcgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKSkKKwkJCUFzc29jUGFybUZpbGwocEFkLCAmQXNzb2NSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwKKwkJCQkgICAgICBwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8sCisJCQkJICAgICAgQVNTT0NfVElNRU9VVCwKKwkJCQkgICAgICBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQpOwogCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBVVRIIEZBSUwsIHRyeSBPUEVOIHN5c3RlbS4uLlxuIikpOwotCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pOwotCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVVUSF9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BVVRIX1JFUSwKLQkJCQkJCQlzaXplb2YoTUxNRV9BVVRIX1JFUV9TVFJVQ1QpLCAmQXV0aFJlcSk7CisJCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLAorCQkJCQkgICAgTVQyX01MTUVfQVNTT0NfUkVRLAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2Fzc29jX3JlcSksCisJCQkJCSAgICAmQXNzb2NSZXEpOwogCi0JCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9BVVRIMjsKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0KKwkJCQkgICAgQ05UTF9XQUlUX0FTU09DOwogCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vIG5vdCBzdWNjZXNzLCB0cnkgbmV4dCBCU1MKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQVVUSCBGQUlMLCBnaXZlIHVwOyB0cnkgbmV4dCBCU1NcbiIpKTsKLQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOyAvLz8/Pz8/Pz8KKwkJfSBlbHNlIHsKKwkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0KKwkJCSAgICAgTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkKKwkJCSAgICAmJiAocEFkLT5NbG1lQXV4LkFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpKSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIkNOVEwgLSBBVVRIIEZBSUwsIHRyeSBPUEVOIHN5c3RlbS4uLlxuIikpOworCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsCisJCQkJCSAgICAgTmRpczgwMl8xMUF1dGhNb2RlT3Blbik7CisJCQkJTWxtZUVucXVldWUocEFkLCBBVVRIX1NUQVRFX01BQ0hJTkUsCisJCQkJCSAgICBNVDJfTUxNRV9BVVRIX1JFUSwKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9hdXRoX3JlcSksCisJCQkJCSAgICAmQXV0aFJlcSk7CisKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0KKwkJCQkgICAgQ05UTF9XQUlUX0FVVEgyOworCQkJfSBlbHNlIHsKKwkJCQkvKiBub3Qgc3VjY2VzcywgdHJ5IG5leHQgQlNTICovCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIkNOVEwgLSBBVVRIIEZBSUwsIGdpdmUgdXA7IHRyeSBuZXh0IEJTU1xuIikpOworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CS8qPz8/Pz8/PyAqLwogCQkJCXBBZC0+TWxtZUF1eC5Cc3NJZHgrKzsKIAkJCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKIAkJCX0KQEAgLTk4NywzMCArMTA0NywzMCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIENudGxXYWl0QXNzb2NQcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgQ250bFdhaXRBc3NvY1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVTSE9SVCAgICAgIFJlYXNvbjsKKwl1MTYgUmVhc29uOwogCi0JaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0FTU09DX0NPTkYpCi0JewotCQlOZGlzTW92ZU1lbW9yeSgmUmVhc29uLCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKLQkJaWYgKFJlYXNvbiA9PSBNTE1FX1NVQ0NFU1MpCi0JCXsKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfQVNTT0NfQ09ORikgeworCQlOZGlzTW92ZU1lbW9yeSgmUmVhc29uLCBFbGVtLT5Nc2csIHNpemVvZih1MTYpKTsKKwkJaWYgKFJlYXNvbiA9PSBNTE1FX1NVQ0NFU1MpIHsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkgeworCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0FTU09DX0VWRU5UX0ZMQUcsCisJCQkJCQkgICAgICBwQWQtPk1hY1RhYi4KKwkJCQkJCSAgICAgIENvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwKKwkJCQkJCSAgICAgIEJTUzAsIDApOworCQkJfQorCiAJCQlMaW5rVXAocEFkLCBCU1NfSU5GUkEpOwogCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBc3NvY2lhdGlvbiBzdWNjZXNzZnVsIG9uIEJTUyAjJWxkXG4iLHBBZC0+TWxtZUF1eC5Cc3NJZHgpKTsKLQotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQotCQkJewotCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0FTU09DX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyBub3Qgc3VjY2VzcywgdHJ5IG5leHQgQlNTCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQXNzb2NpYXRpb24gZmFpbHMgb24gQlNTICMlbGRcbiIscEFkLT5NbG1lQXV4LkJzc0lkeCkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQ05UTCAtIEFzc29jaWF0aW9uIHN1Y2Nlc3NmdWwgb24gQlNTICMlbGRcbiIsCisJCQkJICBwQWQtPk1sbWVBdXguQnNzSWR4KSk7CisJCX0gZWxzZSB7CisJCQkvKiBub3Qgc3VjY2VzcywgdHJ5IG5leHQgQlNTICovCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJDTlRMIC0gQXNzb2NpYXRpb24gZmFpbHMgb24gQlNTICMlbGRcbiIsCisJCQkJICBwQWQtPk1sbWVBdXguQnNzSWR4KSk7CiAJCQlwQWQtPk1sbWVBdXguQnNzSWR4Kys7CiAJCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKIAkJfQpAQCAtMTAyNSw1MiArMTA4NSw1MSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIENudGxXYWl0UmVhc3NvY1Byb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBDbnRsV2FpdFJlYXNzb2NQcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVU0hPUlQgICAgICBSZXN1bHQ7CisJdTE2IFJlc3VsdDsKIAotCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9SRUFTU09DX0NPTkYpCi0JewotCQlOZGlzTW92ZU1lbW9yeSgmUmVzdWx0LCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKLQkJaWYgKFJlc3VsdCA9PSBNTE1FX1NVQ0NFU1MpCi0JCXsKLQkJCS8vCi0JCQkvLyBORElTIHJlcXVpcmVzIGEgbmV3IExpbmsgVVAgaW5kaWNhdGlvbiBidXQgbm8gTGluayBEb3duIGZvciBSRS1BU1NPQwotCQkJLy8KKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfUkVBU1NPQ19DT05GKSB7CisJCU5kaXNNb3ZlTWVtb3J5KCZSZXN1bHQsIEVsZW0tPk1zZywgc2l6ZW9mKHUxNikpOworCQlpZiAoUmVzdWx0ID09IE1MTUVfU1VDQ0VTUykgeworCQkJLyogc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBhc3NvY2lhdGlvbiAqLworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0FTU09DX0VWRU5UX0ZMQUcsCisJCQkJCQkgICAgICBwQWQtPk1hY1RhYi4KKwkJCQkJCSAgICAgIENvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwKKwkJCQkJCSAgICAgIEJTUzAsIDApOworCisJCQkvKiAqLworCQkJLyogTkRJUyByZXF1aXJlcyBhIG5ldyBMaW5rIFVQIGluZGljYXRpb24gYnV0IG5vIExpbmsgRG93biBmb3IgUkUtQVNTT0MgKi8KKwkJCS8qICovCiAJCQlMaW5rVXAocEFkLCBCU1NfSU5GUkEpOwogCi0JCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIGFzc29jaWF0aW9uCi0JCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfQVNTT0NfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLQogCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBSZS1hc3NvY2l0aW9uIHN1Y2Nlc3NmdWwgb24gQlNTICMlbGRcbiIsIHBBZC0+TWxtZUF1eC5Sb2FtSWR4KSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyByZWFzc29jIGZhaWxlZCwgdHJ5IHRvIHBpY2sgbmV4dCBCU1MgaW4gdGhlIEJTUyBUYWJsZQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIFJlLWFzc29jaXRpb24gZmFpbHMgb24gQlNTICMlbGRcbiIsIHBBZC0+TWxtZUF1eC5Sb2FtSWR4KSk7Ci0JCQlwQWQtPk1sbWVBdXguUm9hbUlkeCsrOwotCQkJSXRlcmF0ZU9uQnNzVGFiMihwQWQpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQ05UTCAtIFJlLWFzc29jaXRpb24gc3VjY2Vzc2Z1bCBvbiBCU1MgIyVsZFxuIiwKKwkJCQkgIHBBZC0+TWxtZUF1eC5Sb2FtSWR4KSk7CisJCX0gZWxzZSB7CisJCQkvKiByZWFzc29jIGZhaWxlZCwgdHJ5IHRvIHBpY2sgbmV4dCBCU1MgaW4gdGhlIEJTUyBUYWJsZSAqLworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQ05UTCAtIFJlLWFzc29jaXRpb24gZmFpbHMgb24gQlNTICMlbGRcbiIsCisJCQkJICBwQWQtPk1sbWVBdXguUm9hbUlkeCkpOworCQkJeworCQkJCXBBZC0+TWxtZUF1eC5Sb2FtSWR4Kys7CisJCQkJSXRlcmF0ZU9uQnNzVGFiMihwQWQpOworCQkJfQogCQl9CiAJfQogfQogCi0KLSNpZmRlZiBSVDI4NzAKLVZPSUQJQWRob2NUdXJuT25Rb3MoCi0JSU4gIFBSVE1QX0FEQVBURVIgcEFkKQordm9pZCBBZGhvY1R1cm5PblFvcyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7CiAjZGVmaW5lIEFDMF9ERUZfVFhPUAkJMAogI2RlZmluZSBBQzFfREVGX1RYT1AJCTAKICNkZWZpbmUgQUMyX0RFRl9UWE9QCQk5NAogI2RlZmluZSBBQzNfREVGX1RYT1AJCTQ3CiAKLQkvLyBUdXJuIG9uIFFPcyBpZiB1c2UgSFQgcmF0ZS4KLQlpZiAocEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iVmFsaWQgPT0gRkFMU0UpCi0JeworCS8qIFR1cm4gb24gUU9zIGlmIHVzZSBIVCByYXRlLiAqLworCWlmIChwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJWYWxpZCA9PSBGQUxTRSkgewogCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJWYWxpZCA9IFRSVUU7CiAJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMF0gPSAzOwogCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzFdID0gNzsKQEAgLTEwODcsMTQgKzExNDYsMTMgQEAKIAkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFsyXSA9IDQ7CiAJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbM10gPSAzOwogCi0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFswXSAgPSAwOwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMV0gID0gMDsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzJdICA9IEFDMl9ERUZfVFhPUDsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzNdICA9IEFDM19ERUZfVFhPUDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzBdID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzFdID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzJdID0gQUMyX0RFRl9UWE9QOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbM10gPSBBQzNfREVGX1RYT1A7CiAJfQogCUFzaWNTZXRFZGNhUGFybShwQWQsICZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtKTsKIH0KLSNlbmRpZiAvKiBSVDI4NzAgKi8KIAogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTEwNCwxMTAgKzExNjIsODEgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBMaW5rVXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgQnNzVHlwZSkKK3ZvaWQgTGlua1VwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggQnNzVHlwZSkKIHsKLQlVTE9ORwlOb3c7Ci0JVUlOVDMyCURhdGE7Ci0JQk9PTEVBTglDYW5jZWxsZWQ7Ci0JVUNIQVIJVmFsdWUgPSAwLCBpZHg7Ci0JTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMLCAqcEN1cnJFbnRyeTsKKwl1bnNpZ25lZCBsb25nIE5vdzsKKwl1MzIgRGF0YTsKKwlCT09MRUFOIENhbmNlbGxlZDsKKwl1OCBWYWx1ZSA9IDAsIGlkeCA9IDAsIEhhc2hJZHggPSAwOworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSA9IE5VTEwsICpwQ3VyckVudHJ5ID0gTlVMTDsKIAotI2lmZGVmIFJUMjg2MAotCWlmIChSVE1QX1RFU1RfUFNGTEFHKHBBZCwgZlJUTVBfUFNfU0VUX1BDSV9DTEtfT0ZGX0NPTU1BTkQpKQotCXsKLQkJUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsIFJFU1RPUkVfSEFMVCk7Ci0JCVJUTVB1c2VjRGVsYXkoNjAwMCk7Ci0JCXBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOworCS8qIEluaXQgQ2hhbm5lbFF1YWxpdHkgdG8gcHJldmVudCBERUFEX0NRSSBhdCBpbml0aWFsIExpbmtVcCAqLworCXBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSA9IDUwOworCisJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJaWYgKHBFbnRyeSkgeworCQlNYWNUYWJsZURlbGV0ZUVudHJ5KHBBZCwgcEVudHJ5LT5BaWQsIHBFbnRyeS0+QWRkcik7CisJCXBFbnRyeSA9IE5VTEw7CiAJfQotI2VuZGlmCiAKIAlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKIAotCS8vCi0JLy8gQVNTT0MgLSBEaXNhc3NvY1RpbWVvdXRBY3Rpb24KLQkvLyBDTlRMIC0gRGlzLWFzc29jaWF0ZSBzdWNjZXNzZnVsCi0JLy8gISEhIExJTksgRE9XTiAhISEKLQkvLyBbODg4ODhdIE9JRF84MDJfMTFfU1NJRCBzaG91bGQgaGF2ZSByZXR1cm5lZCBORFRFU1RfV0VQX0FQMihSZXR1cm5lZDogKQotCS8vCi0JLy8gVG8gcHJldmVudCBEaXNhc3NvY1RpbWVvdXRBY3Rpb24gdG8gY2FsbCBMaW5rIGRvd24gYWZ0ZXIgd2UgbGluayB1cCwKLQkvLyBjYW5jZWwgdGhlIERpc2Fzc29jVGltZXIgbm8gbWF0dGVyIHdoYXQgaXQgc3RhcnQgb3Igbm90LgotCS8vCi0JUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgICZDYW5jZWxsZWQpOworCS8qICovCisJLyogQVNTT0MgLSBEaXNhc3NvY1RpbWVvdXRBY3Rpb24gKi8KKwkvKiBDTlRMIC0gRGlzLWFzc29jaWF0ZSBzdWNjZXNzZnVsICovCisJLyogISBMSU5LIERPV04gISAqLworCS8qIFs4ODg4OF0gT0lEXzgwMl8xMV9TU0lEIHNob3VsZCBoYXZlIHJldHVybmVkIE5EVEVTVF9XRVBfQVAyKFJldHVybmVkOiApICovCisJLyogKi8KKwkvKiBUbyBwcmV2ZW50IERpc2Fzc29jVGltZW91dEFjdGlvbiB0byBjYWxsIExpbmsgZG93biBhZnRlciB3ZSBsaW5rIHVwLCAqLworCS8qIGNhbmNlbCB0aGUgRGlzYXNzb2NUaW1lciBubyBtYXR0ZXIgd2hhdCBpdCBzdGFydCBvciBub3QuICovCisJLyogKi8KKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAmQ2FuY2VsbGVkKTsKIAogCUNPUFlfU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKHBBZCk7CiAKIAlDT1BZX0hUU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKHBBZCk7CiAKLQkvLyBJdCdzIHF1aXRlIGRpZmZpY3VsdCB0byB0ZWxsIGlmIGEgbmV3bHkgYWRkZWQgS0VZIGlzIFdFUCBvciBDS0lQIHVudGlsIGEgbmV3IEJTUwotCS8vIGlzIGZvcm1lZCAoZWl0aGVyIEFTU09DL1JFLUFTU09DIGRvbmUgb3IgSUJTUyBzdGFydGVkLiBMaW5rVVAgc2hvdWxkIGJlIGEgc2FmZSBwbGFjZQotCS8vIHRvIGV4YW1pbmUgaWYgY2lwaGVyIGFsZ29yaXRobSBzd2l0Y2hpbmcgaXMgcmVxdWlyZWQuCi0JLy9ydDI4NjBiLiBEb24ndCBrbm93IHdoeSBuZWVkIHRoaXMKLQlTd2l0Y2hCZXR3ZWVuV2VwQW5kQ2tpcChwQWQpOwotCi0jaWZkZWYgUlQyODYwCi0JLy8gQmVmb3JlIHBvd2VyIHNhdmUgYmVmb3JlIGxpbmsgdXAgZnVuY3Rpb24sIFdlIHdpbGwgZm9yY2UgdXNlIDFSLgotCS8vIFNvIGFmdGVyIGxpbmsgdXAsIGNoZWNrIFJ4IGFudGVubmEgIyBhZ2Fpbi4KKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkvKiBCZWZvcmUgcG93ZXIgc2F2ZSBiZWZvcmUgbGluayB1cCBmdW5jdGlvbiwgV2Ugd2lsbCBmb3JjZSB1c2UgMVIuICovCisJLyogU28gYWZ0ZXIgbGluayB1cCwgY2hlY2sgUnggYW50ZW5uYSAjIGFnYWluLiAqLwogCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJlZhbHVlKTsKLQlpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpCi0JeworCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpIHsKIAkJVmFsdWUgfD0gKDB4MTApOwotCX0KLQllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKLQl7CisJfSBlbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpIHsKIAkJVmFsdWUgfD0gKDB4OCk7Ci0JfQotCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQotCXsKKwl9IGVsc2UgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkgewogCQlWYWx1ZSB8PSAoMHgwKTsKIAl9CiAJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgVmFsdWUpOwogCXBBZC0+U3RhQ2ZnLkJCUFIzID0gVmFsdWU7Ci0jZW5kaWYgLyogUlQyODYwICovCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiAKLQlpZiAoQnNzVHlwZSA9PSBCU1NfQURIT0MpCi0JeworCWlmIChCc3NUeXBlID09IEJTU19BREhPQykgewogCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURIT0NfT04pOwogCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19JTkZSQV9PTik7CiAKLQkJaWYgKChwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCAgPT0gQldfNDApICYmCi0JCQkocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9BQk9WRSkpCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCArIDI7Ci0JCX0KLQkJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAyKSAmJgotCQkJCSAocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggID09IEJXXzQwKSAmJgotCQkJCSAocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9CRUxPVykpCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCAtIDI7Ci0JCX0KLSNpZmRlZiBSVDI4NzAKIAkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKIAkJCUFkaG9jVHVybk9uUW9zKHBBZCk7Ci0jZW5kaWYKIAotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFBZGhvYyBMSU5LIFVQICEhISBcbiIgKSk7Ci0JfQotCWVsc2UKLQl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFkaG9jIExJTksgVVAhXG4iKSk7CisJfSBlbHNlIHsKIAkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0lORlJBX09OKTsKIAkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURIT0NfT04pOwogCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIUluZnJhIExJTksgVVAgISEhIFxuIiApKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW5mcmEgTElOSyBVUCFcbiIpKTsKIAl9CiAKLQkvLyAzKjMKLQkvLyByZXNldCBUeCBiZWFtZm9ybWluZyBiaXQKKwkvKiAzKjMgKi8KKwkvKiByZXNldCBUeCBiZWFtZm9ybWluZyBiaXQgKi8KIAlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZWYWx1ZSk7CiAJVmFsdWUgJj0gKH4weDAxKTsKIAlWYWx1ZSB8PSBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuVHhCRjsKIAlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBWYWx1ZSk7CiAKLQkvLyBDaGFuZ2UgdG8gQVAgY2hhbm5lbAotICAgIGlmICgocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPiBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSAmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKLQl7Ci0JCS8vIE11c3QgdXNpbmcgNDBNSHouCisJLyogQ2hhbmdlIHRvIEFQIGNoYW5uZWwgKi8KKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID4gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkgICAgJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpIHsKKwkJLyogTXVzdCB1c2luZyA0ME1Iei4gKi8KIAkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CiAJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKIAkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwpAQCAtMTIxNywzNCArMTI0NiwzNSBAQAogCQlWYWx1ZSB8PSAweDEwOwogCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBWYWx1ZSk7CiAKLQkJLy8gIFJYIDogY29udHJvbCBjaGFubmVsIGF0IGxvd2VyCisJCS8qICBSWCA6IGNvbnRyb2wgY2hhbm5lbCBhdCBsb3dlciAqLwogCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZWYWx1ZSk7CiAJCVZhbHVlICY9ICh+MHgyMCk7CiAJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIFZhbHVlKTsKLSNpZmRlZiBSVDI4NjAKLSAgICAgICAgcEFkLT5TdGFDZmcuQkJQUjMgPSBWYWx1ZTsKLSNlbmRpZgorI2lmZGVmIFJUTVBfTUFDX1BDSQorCQlwQWQtPlN0YUNmZy5CQlBSMyA9IFZhbHVlOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCiAJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZEYXRhKTsKIAkJRGF0YSAmPSAweGZmZmZmZmZlOwogCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgRGF0YSk7CiAKLQkJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQotCQl7CisJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkgewogCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIDB4MUEpOwogCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIDB4MEEpOwogCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIDB4MTYpOwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcnQyODYwQyAhISEgXG4iICkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnQyODYwQyAhXG4iKSk7CiAJCX0KIAotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISE0ME1IeiBMb3dlciBMSU5LIFVQICEhISBDb250cm9sIENoYW5uZWwgYXQgQmVsb3cuIENlbnRyYWwgPSAlZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICkpOwotCX0KLQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSAmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKLSAgICB7Ci0JICAgIC8vIE11c3QgdXNpbmcgNDBNSHouCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiNDBNSHogTG93ZXIgTElOSyBVUCEgQ29udHJvbCBDaGFubmVsIGF0IEJlbG93LiBDZW50cmFsID0gJWQgXG4iLAorCQkJICBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOworCX0gZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsIDwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJICAgJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PQorCQkgICAgICAgQldfNDApKSB7CisJCS8qIE11c3QgdXNpbmcgNDBNSHouICovCiAJCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOwogCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0JICAgIEFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwogCiAJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJlZhbHVlKTsKIAkJVmFsdWUgJj0gKH4weDE4KTsKQEAgLTEyNTYsMjUgKzEyODYsMjQgQEAKIAkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIERhdGEpOwogCiAJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJlZhbHVlKTsKLQkgICAgVmFsdWUgfD0gKDB4MjApOworCQlWYWx1ZSB8PSAoMHgyMCk7CiAJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIFZhbHVlKTsKLSNpZmRlZiBSVDI4NjAKLSAgICAgICAgcEFkLT5TdGFDZmcuQkJQUjMgPSBWYWx1ZTsKLSNlbmRpZgorI2lmZGVmIFJUTVBfTUFDX1BDSQorCQlwQWQtPlN0YUNmZy5CQlBSMyA9IFZhbHVlOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCi0JCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKLQkJeworCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApIHsKIAkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCAweDFBKTsKIAkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAweDBBKTsKIAkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDE2KTsKLQkJCSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFydDI4NjBDICEhISBcbiIgKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydDI4NjBDICFcbiIpKTsKIAkJfQogCi0JICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISA0ME1IeiBVcHBlciBMSU5LIFVQICEhISBDb250cm9sIENoYW5uZWwgYXQgVXBwZXJDZW50cmFsID0gJWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCApKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQkgICAgcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiNDBNSHogVXBwZXIgTElOSyBVUCEgQ29udHJvbCBDaGFubmVsIGF0IFVwcGVyQ2VudHJhbCA9ICVkIFxuIiwKKwkJCSAgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKKwl9IGVsc2UgeworCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKIAkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwogCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKIAkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CkBAIC0xMjkwLDUxMSArMTMxOSw1MzMgQEAKIAkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmVmFsdWUpOwogCQlWYWx1ZSAmPSAofjB4MjApOwogCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBWYWx1ZSk7Ci0jaWZkZWYgUlQyODYwCi0gICAgICAgIHBBZC0+U3RhQ2ZnLkJCUFIzID0gVmFsdWU7Ci0jZW5kaWYKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkJcEFkLT5TdGFDZmcuQkJQUjMgPSBWYWx1ZTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAotCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCi0JCXsKKwkJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKSB7CiAJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxNik7CiAJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgMHgwOCk7CiAJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgMHgxMSk7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFydDI4NjBDICEhISBcbiIgKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydDI4NjBDICFcbiIpKTsKIAkJfQogCi0JICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISAyME1IeiBMSU5LIFVQICEhISBcbiIgKSk7Ci0gICAgfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIyME1IeiBMSU5LIFVQIVxuIikpOworCX0KIAogCVJUTVBTZXRBR0NJbml0VmFsdWUocEFkLCBwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcpOwotCS8vCi0JLy8gU2F2ZSBCQlBfUjY2IHZhbHVlLCBpdCB3aWxsIGJlIHVzZWQgaW4gUlRVU0JSZXN1bWVNc2R1VHJhbnNtaXNzaW9uCi0JLy8KLQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAmcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlKTsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIFVQICEhISAoQnNzVHlwZT0lZCwgQUlEPSVkLCBzc2lkPSVzLCBDaGFubmVsPSVkLCBDZW50cmFsQ2hhbm5lbCA9ICVkKVxuIiwKLQkJQnNzVHlwZSwgcEFkLT5TdGFBY3RpdmUuQWlkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOworCS8qICovCisJLyogU2F2ZSBCQlBfUjY2IHZhbHVlLCBpdCB3aWxsIGJlIHVzZWQgaW4gUlRVU0JSZXN1bWVNc2R1VHJhbnNtaXNzaW9uICovCisJLyogKi8KKwlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LAorCQkJCSAgICAmcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlKTsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIFVQICEhISAoRGVuc2l0eSA9JWQsIClcbiIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTXBkdURlbnNpdHkpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiTElOSyBVUCEgKEJzc1R5cGU9JWQsIEFJRD0lZCwgc3NpZD0lcywgQ2hhbm5lbD0lZCwgQ2VudHJhbENoYW5uZWwgPSAlZClcbiIsCisJCSAgQnNzVHlwZSwgcEFkLT5TdGFBY3RpdmUuQWlkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLAorCQkgIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKSk7CiAKLQkJQXNpY1NldEJzc2lkKHBBZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJMSU5LIFVQISAoRGVuc2l0eSA9JWQsIClcbiIsCisJCSAgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NcGR1RGVuc2l0eSkpOworCisJQXNpY1NldEJzc2lkKHBBZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwogCiAJQXNpY1NldFNsb3RUaW1lKHBBZCwgVFJVRSk7CiAJQXNpY1NldEVkY2FQYXJtKHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0pOwogCi0JLy8gQ2FsbCB0aGlzIGZvciBSVFMgcHJvdGVjdGlvbmZvciBsZWdhY3kgcmF0ZSwgd2Ugd2lsbCBhbHdheXMgZW5hYmxlIFJUUyB0aHJlc2hvbGQsIGJ1dCBub3JtYWxseSBpdCB3aWxsIG5vdCBoaXQKLQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIDAsIChPRkRNU0VUUFJPVEVDVCB8IENDS1NFVFBST1RFQ1QpLCBUUlVFLCBGQUxTRSk7CisJLyogQ2FsbCB0aGlzIGZvciBSVFMgcHJvdGVjdGlvbmZvciBsZWdhY3kgcmF0ZSwgd2Ugd2lsbCBhbHdheXMgZW5hYmxlIFJUUyB0aHJlc2hvbGQsIGJ1dCBub3JtYWxseSBpdCB3aWxsIG5vdCBoaXQgKi8KKwlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIDAsIChPRkRNU0VUUFJPVEVDVCB8IENDS1NFVFBST1RFQ1QpLCBUUlVFLAorCQkJICBGQUxTRSk7CiAKLQlpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IFRSVUUpKQotCXsKLQkJLy8gVXBkYXRlIEhUIHByb3RlY3Rpb25mb3IgYmFzZWQgb24gQVAncyBvcGVyYXRpbmcgbW9kZS4KLSAgICAJaWYgKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPT0gMSkKLSAgICAJewotICAgIAkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCAgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgVFJVRSk7Ci0gICAgCX0KLSAgICAJZWxzZQotICAgCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCAgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgRkFMU0UpOworCWlmICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gVFJVRSkpIHsKKwkJLyogVXBkYXRlIEhUIHByb3RlY3Rpb25mb3IgYmFzZWQgb24gQVAncyBvcGVyYXRpbmcgbW9kZS4gKi8KKwkJaWYgKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPT0gMSkgeworCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLAorCQkJCQkgIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi4KKwkJCQkJICBPcGVyYWlvbk1vZGUsIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsCisJCQkJCSAgVFJVRSk7CisJCX0gZWxzZQorCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLAorCQkJCQkgIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi4KKwkJCQkJICBPcGVyYWlvbk1vZGUsIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsCisJCQkJCSAgRkFMU0UpOwogCX0KIAotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkRyc0NvdW50ZXJzLCBzaXplb2YoQ09VTlRFUl9EUlMpKTsKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5EcnNDb3VudGVycywgc2l6ZW9mKHN0cnVjdCBydF9jb3VudGVyX2RycykpOwogCiAJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKLQlwQWQtPlN0YUNmZy5MYXN0QmVhY29uUnhUaW1lID0gTm93OyAgIC8vIGxhc3QgUlggdGltZXN0YW1wCisJcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSA9IE5vdzsJLyogbGFzdCBSWCB0aW1lc3RhbXAgKi8KIAogCWlmICgocEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSAhPSBSdDgwMl8xMVByZWFtYmxlTG9uZykgJiYKLQkJQ0FQX0lTX1NIT1JUX1BSRUFNQkxFX09OKHBBZC0+U3RhQWN0aXZlLkNhcGFiaWxpdHlJbmZvKSkKLQl7CisJICAgIENBUF9JU19TSE9SVF9QUkVBTUJMRV9PTihwQWQtPlN0YUFjdGl2ZS5DYXBhYmlsaXR5SW5mbykpIHsKIAkJTWxtZVNldFR4UHJlYW1ibGUocEFkLCBSdDgwMl8xMVByZWFtYmxlU2hvcnQpOwogCX0KIAogCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCk7CiAKLQlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID09IFJEX1NJTEVOQ0VfTU9ERSkKLQl7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9PSBSRF9TSUxFTkNFX01PREUpIHsKIAl9CiAJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0gUkRfTk9STUFMX01PREU7CiAKLQlpZiAoQnNzVHlwZSA9PSBCU1NfQURIT0MpCi0JeworCWlmIChCc3NUeXBlID09IEJTU19BREhPQykgewogCQlNYWtlSWJzc0JlYWNvbihwQWQpOwogCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKLQkJCSYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQotCQkJJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSkKLQkJewotCQkJOyAvL0RvIG5vdGhpbmcKLQkJfQotCQllbHNlCi0JCXsKKwkJICAgICYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQorCQkgICAgJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSkgeworCQkJOwkvKkRvIG5vdGhpbmcgKi8KKwkJfSBlbHNlIHsKIAkJCUFzaWNFbmFibGVJYnNzU3luYyhwQWQpOwogCQl9CiAKLQkJLy8gSW4gYWQgaG9jIG1vZGUsIHVzZSBNQUMgdGFibGUgZnJvbSBpbmRleCAxLgotCQkvLyBwLnMgQVNJQyB1c2UgYWxsIDB4ZmYgYXMgdGVybWluYXRpb24gb2YgV0NJRCB0YWJsZSBzZWFyY2guVG8gcHJldmVudCBpdCdzIDB4ZmYtZmYtZmYtZmYtZmYtZmYsIFdyaXRlIDAgaGVyZS4KKwkJLyogSW4gYWQgaG9jIG1vZGUsIHVzZSBNQUMgdGFibGUgZnJvbSBpbmRleCAxLiAqLworCQkvKiBwLnMgQVNJQyB1c2UgYWxsIDB4ZmYgYXMgdGVybWluYXRpb24gb2YgV0NJRCB0YWJsZSBzZWFyY2guVG8gcHJldmVudCBpdCdzIDB4ZmYtZmYtZmYtZmYtZmYtZmYsIFdyaXRlIDAgaGVyZS4gKi8KIAkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1dDSURfQkFTRSwgMHgwMCk7CiAJCVJUTVBfSU9fV1JJVEUzMihwQWQsIDB4MTgwOCwgMHgwMCk7CiAKLQkJLy8gSWYgV0VQIGlzIGVuYWJsZWQsIGFkZCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyBpbnRvIEFzaWMKLQkJLy8gRmlsbCBpbiBTaGFyZWQgS2V5IFRhYmxlKG9mZnNldDogMHg2YzAwKSBhbmQgU2hhcmVkIEtleSBNb2RlKG9mZnNldDogMHg3MDAwKQorCQkvKiBJZiBXRVAgaXMgZW5hYmxlZCwgYWRkIGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIGludG8gQXNpYyAqLworCQkvKiBGaWxsIGluIFNoYXJlZCBLZXkgVGFibGUob2Zmc2V0OiAweDZjMDApIGFuZCBTaGFyZWQgS2V5IE1vZGUob2Zmc2V0OiAweDcwMDApICovCiAKLQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkKLQkJewotCQkJUFVDSEFSCUtleTsKLQkJCVVDSEFSIAlDaXBoZXJBbGc7CisJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpIHsKKwkJCXU4ICpLZXk7CisJCQl1OCBDaXBoZXJBbGc7CiAKLQkJCWZvciAoaWR4PTA7IGlkeCA8IFNIQVJFX0tFWV9OVU07IGlkeCsrKQotICAgICAgICAJeworCQkJZm9yIChpZHggPSAwOyBpZHggPCBTSEFSRV9LRVlfTlVNOyBpZHgrKykgewogCQkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uQ2lwaGVyQWxnOwotICAgIAkJCUtleSA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5OworCQkJCUtleSA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5OwogCi0JCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuID4gMCkKLQkJCQl7Ci0JCQkJCS8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCi0gICAgCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCQkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA+IDApIHsKKwkJCQkJLyogU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMgKi8KKwkJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgaWR4LAorCQkJCQkJCSAgICAgIENpcGhlckFsZywgS2V5LAorCQkJCQkJCSAgICAgIE5VTEwsIE5VTEwpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChpZHggPT0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKQotCQkJCQl7Ci0JCQkJCQkvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGdyb3VwIGtleSB0YWJsZQotCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBOVUxMKTsKKwkJCQkJaWYgKGlkeCA9PSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQpIHsKKwkJCQkJCS8qIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZ3JvdXAga2V5IHRhYmxlICovCisJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCQkJCSAgQlNTMCwKKwkJCQkJCQkJCSAgaWR4LAorCQkJCQkJCQkJICBDaXBoZXJBbGcsCisJCQkJCQkJCQkgIE5VTEwpOwogCQkJCQl9CiAJCQkJfQogCi0KIAkJCX0KIAkJfQotCQkvLyBJZiBXUEFOb25lIGlzIGVuYWJsZWQsIGFkZCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyBpbnRvIEFzaWMKLQkJLy8gRmlsbCBpbiBTaGFyZWQgS2V5IFRhYmxlKG9mZnNldDogMHg2YzAwKSBhbmQgU2hhcmVkIEtleSBNb2RlKG9mZnNldDogMHg3MDAwKQotCQllbHNlIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotCQl7Ci0JCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAwOwkvLyBhbHdheXMgYmUgemVybworCQkvKiBJZiBXUEFOb25lIGlzIGVuYWJsZWQsIGFkZCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyBpbnRvIEFzaWMgKi8KKwkJLyogRmlsbCBpbiBTaGFyZWQgS2V5IFRhYmxlKG9mZnNldDogMHg2YzAwKSBhbmQgU2hhcmVkIEtleSBNb2RlKG9mZnNldDogMHg3MDAwKSAqLworCQllbHNlIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKSB7CisJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAwOwkvKiBhbHdheXMgYmUgemVybyAqLwogCi0gICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0sIHNpemVvZihDSVBIRVJfS0VZKSk7Ci0JCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7Ci0JCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIHBBZC0+U3RhQ2ZnLlBNSywgTEVOX1RLSVBfRUspOworCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2NpcGhlcl9rZXkpKTsKKwkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IExFTl9US0lQX0VLOworCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAorCQkJCSAgICAgICBwQWQtPlN0YUNmZy5QTUssIExFTl9US0lQX0VLKTsKIAotICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLSAgICAgICAgICAgIHsKLSAgICAJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBNS1sxNl0sIExFTl9US0lQX1JYTUlDSyk7Ci0gICAgCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsICZwQWQtPlN0YUNmZy5QTUtbMTZdLCBMRU5fVEtJUF9UWE1JQ0spOwotICAgICAgICAgICAgfQotCi0JCQkvLyBEZWNpZGUgaXRzIENoaXBlckFsZwotCQkJaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09CisJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLAorCQkJCQkgICAgICAgJnBBZC0+U3RhQ2ZnLlBNS1sxNl0sCisJCQkJCSAgICAgICBMRU5fVEtJUF9SWE1JQ0spOworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLAorCQkJCQkgICAgICAgJnBBZC0+U3RhQ2ZnLlBNS1sxNl0sCisJCQkJCSAgICAgICBMRU5fVEtJUF9UWE1JQ0spOworCQkJfQorCQkJLyogRGVjaWRlIGl0cyBDaGlwZXJBbGcgKi8KKwkJCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09CisJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKIAkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKLQkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0KKwkJCQkgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKIAkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOwotCQkJZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlVua25vdyBDaXBoZXIgKD0lZCksIHNldCBDaXBoZXIgdG8gQUVTXG4iLCBwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyKSk7CisJCQllbHNlIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiVW5rbm93IENpcGhlciAoPSVkKSwgc2V0IENpcGhlciB0byBBRVNcbiIsCisJCQkJCSAgcEFkLT5TdGFDZmcuUGFpckNpcGhlcikpOwogCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7Ci0gICAgICAgICAgICB9CisJCQl9CiAKLQkJCS8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCisJCQkvKiBTZXQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgdG8gQXNpYyAqLwogCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKLQkJCQkJCQkJICBCU1MwLAotCQkJCQkJCQkgIDAsCi0JCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAotCQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKLQkJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKLQkJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYyk7CisJCQkJCSAgICAgIEJTUzAsCisJCQkJCSAgICAgIDAsCisJCQkJCSAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKwkJCQkJICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAorCQkJCQkgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKKwkJCQkJICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMpOwogCi0gICAgICAgICAgICAvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGdyb3VwIGtleSB0YWJsZQotCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIDAsIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywgTlVMTCk7CisJCQkvKiBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGdyb3VwIGtleSB0YWJsZSAqLworCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIDAsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLgorCQkJCQkJICBDaXBoZXJBbGcsIE5VTEwpOwogCiAJCX0KIAotCX0KLQllbHNlIC8vIEJTU19JTkZSQQorCX0gZWxzZQkJCS8qIEJTU19JTkZSQSAqLwogCXsKLQkJLy8gQ2hlY2sgdGhlIG5ldyBTU0lEIHdpdGggbGFzdCBTU0lECi0JCXdoaWxlIChDYW5jZWxsZWQgPT0gVFJVRSkKLQkJewotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkTGVuID09IHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pCi0JCQl7Ci0JCQkJaWYgKFJUTVBDb21wYXJlTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZExlbikgPT0gMCkKLQkJCQl7Ci0JCQkJCS8vIExpbmsgdG8gdGhlIG9sZCBvbmUgbm8gbGlua2Rvd24gaXMgcmVxdWlyZWQuCisJCS8qIENoZWNrIHRoZSBuZXcgU1NJRCB3aXRoIGxhc3QgU1NJRCAqLworCQl3aGlsZSAoQ2FuY2VsbGVkID09IFRSVUUpIHsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZExlbiA9PQorCQkJICAgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pIHsKKwkJCQlpZiAoUlRNUENvbXBhcmVNZW1vcnkKKwkJCQkgICAgKHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkLAorCQkJCSAgICAgcEFkLT5Db21tb25DZmcuU3NpZCwKKwkJCQkgICAgIHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkTGVuKSA9PSAwKSB7CisJCQkJCS8qIExpbmsgdG8gdGhlIG9sZCBvbmUgbm8gbGlua2Rvd24gaXMgcmVxdWlyZWQuICovCiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KLQkJCS8vIFNlbmQgbGluayBkb3duIGV2ZW50IGJlZm9yZSBzZXQgdG8gbGluayB1cAorCQkJLyogU2VuZCBsaW5rIGRvd24gZXZlbnQgYmVmb3JlIHNldCB0byBsaW5rIHVwICovCiAJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOwogCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKLSAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEFBIVxuIikpOworCQkJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQUEhXG4iKSk7CiAJCQlicmVhazsKIAkJfQogCi0JCS8vCi0JCS8vIE9uIFdQQSBtb2RlLCBSZW1vdmUgQWxsIEtleXMgaWYgbm90IGNvbm5lY3QgdG8gdGhlIGxhc3QgQlNTSUQKLQkJLy8gS2V5IHdpbGwgYmUgc2V0IGFmdGVyIDQtd2F5IGhhbmRzaGFrZS4KLQkJLy8KLQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpKQotCQl7Ci0JCQlVTE9ORyAJCUlWOworCQkvKiAqLworCQkvKiBPbiBXUEEgbW9kZSwgUmVtb3ZlIEFsbCBLZXlzIGlmIG5vdCBjb25uZWN0IHRvIHRoZSBsYXN0IEJTU0lEICovCisJCS8qIEtleSB3aWxsIGJlIHNldCBhZnRlciA0LXdheSBoYW5kc2hha2UuICovCisJCS8qICovCisJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHsKKwkJCXVuc2lnbmVkIGxvbmcgSVY7CiAKLQkJCS8vIFJlbW92ZSBhbGwgV1BBIGtleXMKKwkJCS8qIFJlbW92ZSBhbGwgV1BBIGtleXMgKi8KKwkJCVJUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsKIAkJCVJUTVBXUEFSZW1vdmVBbGxLZXlzKHBBZCk7CiAJCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKLQkJCXBBZC0+U3RhQ2ZnLlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlcjgwMjF4V0VQOworCQkJcEFkLT5TdGFDZmcuUHJpdmFjeUZpbHRlciA9CisJCQkgICAgTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUDsKIAotCQkJLy8gRml4ZWQgY29ubmVjdGlvbiBmYWlsZWQgd2l0aCBSYW5nZSBNYXhpbWl6ZXIgLSA1MTUgQVAgKE1hcnZlbGwgQ2hpcCkgd2hlbiBzZWN1cml0eSBpcyBXUEFQU0svVEtJUAotCQkJLy8gSWYgSVYgcmVsYXRlZCB2YWx1ZXMgYXJlIHRvbyBsYXJnZSBpbiBHcm91cE1zZzIsIEFQIHdvdWxkIGlnbm9yZSB0aGlzIG1lc3NhZ2UuCi0JCQlJViA9IDA7CisJCQkvKiBGaXhlZCBjb25uZWN0aW9uIGZhaWxlZCB3aXRoIFJhbmdlIE1heGltaXplciAtIDUxNSBBUCAoTWFydmVsbCBDaGlwKSB3aGVuIHNlY3VyaXR5IGlzIFdQQVBTSy9US0lQICovCisJCQkvKiBJZiBJViByZWxhdGVkIHZhbHVlcyBhcmUgdG9vIGxhcmdlIGluIEdyb3VwTXNnMiwgQVAgd291bGQgaWdub3JlIHRoaXMgbWVzc2FnZS4gKi8KKwkJCUlWID0gMTsKIAkJCUlWIHw9IChwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPDwgMzApOwogCQkJQXNpY1VwZGF0ZVdDSURJVkVJVihwQWQsIEJTU0lEX1dDSUQsIElWLCAwKTsKLQotI2lmZGVmIFJUMjg2MAotCQkJUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19DQU5fR09fU0xFRVApOwotI2VuZGlmCiAJCX0KLQkJLy8gTk9URToKLQkJLy8gdGhlIGRlY2lzaW9uIG9mIHVzaW5nICJzaG9ydCBzbG90IHRpbWUiIG9yIG5vdCBtYXkgY2hhbmdlIGR5bmFtaWNhbGx5IGR1ZSB0bwotCQkvLyBuZXcgU1RBIGFzc29jaWF0aW9uIHRvIHRoZSBBUC4gc28gd2UgaGF2ZSB0byBkZWNpZGUgdGhhdCB1cG9uIHBhcnNpbmcgQkVBQ09OLCBub3QgaGVyZQorCQkvKiBOT1RFOiAqLworCQkvKiB0aGUgZGVjaXNpb24gb2YgdXNpbmcgInNob3J0IHNsb3QgdGltZSIgb3Igbm90IG1heSBjaGFuZ2UgZHluYW1pY2FsbHkgZHVlIHRvICovCisJCS8qIG5ldyBTVEEgYXNzb2NpYXRpb24gdG8gdGhlIEFQLiBzbyB3ZSBoYXZlIHRvIGRlY2lkZSB0aGF0IHVwb24gcGFyc2luZyBCRUFDT04sIG5vdCBoZXJlICovCiAKLQkJLy8gTk9URToKLQkJLy8gdGhlIGRlY2lzaW9uIHRvIHVzZSAiUlRDL0NUUyIgb3IgIkNUUy10by1zZWxmIiBwcm90ZWN0aW9uIG9yIG5vdCBtYXkgY2hhbmdlIGR5bmFtaWNhbGx5Ci0JCS8vIGR1ZSB0byBuZXcgU1RBIGFzc29jaWF0aW9uIHRvIHRoZSBBUC4gc28gd2UgaGF2ZSB0byBkZWNpZGUgdGhhdCB1cG9uIHBhcnNpbmcgQkVBQ09OLCBub3QgaGVyZQorCQkvKiBOT1RFOiAqLworCQkvKiB0aGUgZGVjaXNpb24gdG8gdXNlICJSVEMvQ1RTIiBvciAiQ1RTLXRvLXNlbGYiIHByb3RlY3Rpb24gb3Igbm90IG1heSBjaGFuZ2UgZHluYW1pY2FsbHkgKi8KKwkJLyogZHVlIHRvIG5ldyBTVEEgYXNzb2NpYXRpb24gdG8gdGhlIEFQLiBzbyB3ZSBoYXZlIHRvIGRlY2lkZSB0aGF0IHVwb24gcGFyc2luZyBCRUFDT04sIG5vdCBoZXJlICovCiAKIAkJQ29tcG9zZVBzUG9sbChwQWQpOwogCQlDb21wb3NlTnVsbEZyYW1lKHBBZCk7CiAKLQkJCUFzaWNFbmFibGVCc3NTeW5jKHBBZCk7CisJCUFzaWNFbmFibGVCc3NTeW5jKHBBZCk7CiAKLQkJLy8gQWRkIEJTU0lEIHRvIFdDSUQgc2VhcmNoIHRhYmxlCisJCS8qIEFkZCBCU1NJRCB0byBXQ0lEIHNlYXJjaCB0YWJsZSAqLwogCQlBc2ljVXBkYXRlUnhXQ0lEVGFibGUocEFkLCBCU1NJRF9XQ0lELCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CiAKLQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKLQkJLy8gYWRkIHRoaXMgQlNTSUQgZW50cnkgaW50byBIQVNIIHRhYmxlCi0JCXsKLQkJCVVDSEFSIEhhc2hJZHg7CisJCS8qIElmIFdFUCBpcyBlbmFibGVkLCBhZGQgcGFpZXdpc2UgYW5kIHNoYXJlZCBrZXkgKi8KKwkJaWYgKCgocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSAmJgorCQkgICAgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpICYmCisJCSAgICAgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSkgfHwKKwkJICAgICgocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpICYmCisJCSAgICAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkpKSB7CisJCQl1OCAqS2V5OworCQkJdTggQ2lwaGVyQWxnOwogCi0JCQkvL3BFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOwotCQkJSGFzaElkeCA9IE1BQ19BRERSX0hBU0hfSU5ERVgocEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQkJaWYgKHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPT0gTlVMTCkKLQkJCXsKLQkJCQlwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdID0gcEVudHJ5OwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXBDdXJyRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOwotCQkJCXdoaWxlIChwQ3VyckVudHJ5LT5wTmV4dCAhPSBOVUxMKQotCQkJCQlwQ3VyckVudHJ5ID0gcEN1cnJFbnRyeS0+cE5leHQ7Ci0JCQkJcEN1cnJFbnRyeS0+cE5leHQgPSBwRW50cnk7Ci0JCQl9Ci0JCX0KLQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKLQotCi0JCS8vIElmIFdFUCBpcyBlbmFibGVkLCBhZGQgcGFpZXdpc2UgYW5kIHNoYXJlZCBrZXkKLSAgICAgICAgaWYgKCgocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSYmCi0gICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkmJgotICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkpIHx8Ci0gICAgICAgICAgICAoKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKSYmCi0gICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpKSkKLQkJewotCQkJUFVDSEFSCUtleTsKLQkJCVVDSEFSIAlDaXBoZXJBbGc7Ci0KLQkJCWZvciAoaWR4PTA7IGlkeCA8IFNIQVJFX0tFWV9OVU07IGlkeCsrKQotICAgICAgICAJeworCQkJZm9yIChpZHggPSAwOyBpZHggPCBTSEFSRV9LRVlfTlVNOyBpZHgrKykgewogCQkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uQ2lwaGVyQWxnOwotICAgIAkJCUtleSA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5OworCQkJCUtleSA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5OwogCi0JCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuID4gMCkKLQkJCQl7Ci0JCQkJCS8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCi0gICAgCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCQkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA+IDApIHsKKwkJCQkJLyogU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMgKi8KKwkJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgaWR4LAorCQkJCQkJCSAgICAgIENpcGhlckFsZywgS2V5LAorCQkJCQkJCSAgICAgIE5VTEwsIE5VTEwpOwogCi0JCQkJCWlmIChpZHggPT0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKQotCQkJCQl7Ci0JCQkJCQkvLyBBc3NpZ24gZ3JvdXAga2V5IGluZm8KLQkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgTlVMTCk7CisJCQkJCWlmIChpZHggPT0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKSB7CisJCQkJCQkvKiBBc3NpZ24gZ3JvdXAga2V5IGluZm8gKi8KKwkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJCQkJICBCU1MwLAorCQkJCQkJCQkJICBpZHgsCisJCQkJCQkJCQkgIENpcGhlckFsZywKKwkJCQkJCQkJCSAgTlVMTCk7CiAKLQkJCQkJCS8vIEFzc2lnbiBwYWlyd2lzZSBrZXkgaW5mbwotCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBwRW50cnkpOworCQkJCQkJcEVudHJ5LT5BaWQgPSBCU1NJRF9XQ0lEOworCQkJCQkJLyogQXNzaWduIHBhaXJ3aXNlIGtleSBpbmZvICovCisJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCQkJCSAgQlNTMCwKKwkJCQkJCQkJCSAgaWR4LAorCQkJCQkJCQkJICBDaXBoZXJBbGcsCisJCQkJCQkJCQkgIHBFbnRyeSk7CiAJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCX0KLQotCQkvLyBvbmx5IElORlJBU1RSVUNUVVJFIG1vZGUgbmVlZCB0byBpbmRpY2F0ZSBjb25uZWN0aXZpdHkgaW1tZWRpYXRlbHk7IEFESE9DIG1vZGUKLQkJLy8gc2hvdWxkIHdhaXQgdW50aWwgYXQgbGVhc3QgMiBhY3RpdmUgbm9kZXMgaW4gdGhpcyBCU1NJRC4KKwkJLyogb25seSBJTkZSQVNUUlVDVFVSRSBtb2RlIG5lZWQgdG8gaW5kaWNhdGUgY29ubmVjdGl2aXR5IGltbWVkaWF0ZWx5OyBBREhPQyBtb2RlICovCisJCS8qIHNob3VsZCB3YWl0IHVudGlsIGF0IGxlYXN0IDIgYWN0aXZlIG5vZGVzIGluIHRoaXMgQlNTSUQuICovCiAJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwogCi0gICAgICAgIC8vIEZvciBHVUkgKysKLQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotCQl7CisJCS8qIEZvciBHVUkgKysgKi8KKwkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB7CiAJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwogCQkJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7Ci0jaWZkZWYgUlQyODcwCiAJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOwotI2VuZGlmCisJCX0gZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkJCSAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PQorCQkJICAgIFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCisJCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuTGlua0Rvd25UaW1lciwKKwkJCQkJICAgICBMSU5LX0RPV05fVElNRU9VVCk7CiAJCX0KLSAgICAgICAgLy8gLS0KLSNpZmRlZiBSVDI4NjAKLQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKLSNlbmRpZgorCQkvKiAtLSAqLwogCi0JCS8vIEFkZCBCU1NJRCBpbiBteSBNQUMgVGFibGUuCi0gICAgICAgIE5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0JCVJUTVBNb3ZlTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIE1BQ19BRERSX0xFTik7Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWlkID0gQlNTSURfV0NJRDsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5wQWQgPSBwQWQ7Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uVmFsaWRBc0NMSSA9IFRSVUU7CS8vQWx0aG91Z2ggdGhpcyBpcyBic3NpZC4uc3RpbGwgc2V0IFZhbGlkQXNDbAotCQlwQWQtPk1hY1RhYi5TaXplID0gMTsJLy8gaW5mcmEgbW9kZSBhbHdheXMgc2V0IE1BQ3RhYiBzaXplID0xLgotCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlNzdCA9IFNTVF9BU1NPQzsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BdXRoU3RhdGUgPSBTU1RfQVNTT0M7Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQXV0aE1vZGUgPSBwQWQtPlN0YUNmZy5BdXRoTW9kZTsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5XZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7Ci0gICAgICAgIE5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisJCS8qIEFkZCBCU1NJRCBpbiBteSBNQUMgVGFibGUuICovCisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisJCS8qIGFkZCB0aGlzIE1BQyBlbnRyeSBpbnRvIEhBU0ggdGFibGUgKi8KKwkJaWYgKHBFbnRyeSkgeworCQkJSGFzaElkeCA9IE1BQ19BRERSX0hBU0hfSU5ERVgocEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJaWYgKHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPT0gTlVMTCkgeworCQkJCXBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPSBwRW50cnk7CisJCQl9IGVsc2UgeworCQkJCXBDdXJyRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOworCQkJCXdoaWxlIChwQ3VyckVudHJ5LT5wTmV4dCAhPSBOVUxMKSB7CisJCQkJCXBDdXJyRW50cnkgPSBwQ3VyckVudHJ5LT5wTmV4dDsKKwkJCQl9CisJCQkJcEN1cnJFbnRyeS0+cE5leHQgPSBwRW50cnk7CisJCQl9CisJCX0KKwkJUlRNUE1vdmVNZW1vcnkocEVudHJ5LT5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwKKwkJCSAgICAgICBNQUNfQUREUl9MRU4pOworCQlwRW50cnktPkFpZCA9IEJTU0lEX1dDSUQ7CisJCXBFbnRyeS0+cEFkID0gcEFkOworCQlwRW50cnktPlZhbGlkQXNDTEkgPSBUUlVFOwkvKkFsdGhvdWdoIHRoaXMgaXMgYnNzaWQuLnN0aWxsIHNldCBWYWxpZEFzQ2wgKi8KKwkJcEFkLT5NYWNUYWIuU2l6ZSA9IDE7CS8qIGluZnJhIG1vZGUgYWx3YXlzIHNldCBNQUN0YWIgc2l6ZSA9MS4gKi8KKwkJcEVudHJ5LT5Tc3QgPSBTU1RfQVNTT0M7CisJCXBFbnRyeS0+QXV0aFN0YXRlID0gU1NUX0FTU09DOworCQlwRW50cnktPkF1dGhNb2RlID0gcEFkLT5TdGFDZmcuQXV0aE1vZGU7CisJCXBFbnRyeS0+V2VwU3RhdHVzID0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOworCQlpZiAocEVudHJ5LT5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgeworCQkJcEVudHJ5LT5XcGFTdGF0ZSA9IEFTX05PVFVTRTsKKwkJCXBFbnRyeS0+UHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyQWNjZXB0QWxsOworCQl9IGVsc2UgeworCQkJcEVudHJ5LT5XcGFTdGF0ZSA9IEFTX1BUS1NUQVJUOworCQkJcEVudHJ5LT5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUDsKKwkJfQorCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwogCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIFVQICEhISAgQ2xpZW50U3RhdHVzRmxhZ3M9JWx4KVxuIiwKLQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQ2xpZW50U3RhdHVzRmxhZ3MpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJMSU5LIFVQISAgQ2xpZW50U3RhdHVzRmxhZ3M9JWx4KVxuIiwKKwkJCSAgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5DbGllbnRTdGF0dXNGbGFncykpOwogCiAJCU1sbWVVcGRhdGVUeFJhdGVzKHBBZCwgVFJVRSwgQlNTMCk7CiAJCU1sbWVVcGRhdGVIdFR4UmF0ZXMocEFkLCBCU1MwKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgVVAgISEgKFN0YUFjdGl2ZS5iSHRFbmFibGUgPSVkLCApXG4iLCBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSkpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkxJTksgVVAhIChTdGFBY3RpdmUuYkh0RW5hYmxlID0lZCwgKVxuIiwKKwkJCSAgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUpKTsKIAotCQlpZiAocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkKLQkJewotCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSkgJiYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMykgPT0gMykKLQkJCXsKLQotCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QSUdHWUJBQ0tfSU5VU0VEKTsKLQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsKLSAgICAgICAgICAgICAgICBSVE1QU2V0UGlnZ3lCYWNrKHBBZCwgVFJVRSk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHVybiBvbiBQaWdneS1CYWNrXG4iKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDEpCi0JCQl7Ci0JCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCk7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKSB7CisJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJQaWdneUJhY2tDYXBhYmxlKQorCQkJICAgICYmIChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDMpID09IDMpIHsKKwkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsCisJCQkJCQkgIGZPUF9TVEFUVVNfUElHR1lCQUNLX0lOVVNFRCk7CisJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLAorCQkJCQkJICBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCk7CisJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksCisJCQkJCQkgICAgICAgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSk7CisJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksCisJCQkJCQkgICAgICAgZkNMSUVOVF9TVEFUVVNfUElHR1lCQUNLX0NBUEFCTEUpOworCQkJCVJUTVBTZXRQaWdneUJhY2socEFkLCBUUlVFKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiVHVybiBvbiBQaWdneS1CYWNrXG4iKSk7CisJCQl9IGVsc2UgaWYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMSkgeworCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwKKwkJCQkJCSAgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpOworCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LAorCQkJCQkJICAgICAgIGZDTElFTlRfU1RBVFVTX0FHR1JFR0FUSU9OX0NBUEFCTEUpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJSYWxpbmsgQWdncmVnYXRpb25cbiIpKTsKIAkJCX0KIAkJfQogCi0JCWlmIChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAhPSAweDApCi0JCXsKLQkJCWlmIChDTElFTlRfU1RBVFVTX1RFU1RfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSwgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpKQotCQkJeworCQlpZiAocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgIT0gMHgwKSB7CisJCQlpZiAoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcKKwkJCSAgICAocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSkpIHsKIAkJCQlBc2ljRW5hYmxlUkRHKHBBZCk7CiAJCQl9Ci0KIAkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQpOwotCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSwgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQpOwotCQl9Ci0JCWVsc2UKLQkJeworCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksCisJCQkJCSAgICAgICBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCk7CisJCX0gZWxzZSB7CiAJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQpOwotCQkJQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCk7CisJCQlDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcocEVudHJ5LAorCQkJCQkJIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKTsKIAkJfQogCX0KIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0NPTk5FQ1QgRXZlbnQgQiEuQkFDYXBhYmlsaXR5ID0gJXguIENsaWVudFN0YXR1c0ZsYWdzID0gJWx4XG4iLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkud29yZCwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5DbGllbnRTdGF0dXNGbGFncykpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJORElTX1NUQVRVU19NRURJQV9DT05ORUNUIEV2ZW50IEIhLkJBQ2FwYWJpbGl0eSA9ICV4LiBDbGllbnRTdGF0dXNGbGFncyA9ICVseFxuIiwKKwkJICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkud29yZCwKKwkJICBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkNsaWVudFN0YXR1c0ZsYWdzKSk7CiAKLQkvLyBTZXQgTEVECisJLyogU2V0IExFRCAqLwogCVJUTVBTZXRMRUQocEFkLCBMRURfTElOS19VUCk7CiAKIAlwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCA9IDA7CiAJcEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgPSAwOwotCXBBZC0+YkNvbmZpZ0NoYW5nZWQgPSBGQUxTRTsgICAgICAgIC8vIFJlc2V0IGNvbmZpZyBmbGFnCi0JcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7ICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uIHRvIGxpbmsgaXMgdXAKKwlwQWQtPmJDb25maWdDaGFuZ2VkID0gRkFMU0U7CS8qIFJlc2V0IGNvbmZpZyBmbGFnICovCisJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7CS8qIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbiB0byBsaW5rIGlzIHVwICovCiAKLQkvLyBTZXQgYXNpYyBhdXRvIGZhbGwgYmFjaworCS8qIFNldCBhc2ljIGF1dG8gZmFsbCBiYWNrICovCiAJewotCQlQVUNIQVIJCQkJCXBUYWJsZTsKLQkJVUNIQVIJCQkJCVRhYmxlU2l6ZSA9IDA7CisJCXU4ICpwVGFibGU7CisJCXU4IFRhYmxlU2l6ZSA9IDA7CiAKLQkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sICZwVGFibGUsICZUYWJsZVNpemUsICZwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCk7CisJCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLAorCQkJCSAgICAgICZwVGFibGUsICZUYWJsZVNpemUsCisJCQkJICAgICAgJnBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4KTsKIAkJQXNpY1VwZGF0ZUF1dG9GYWxsQmFja1RhYmxlKHBBZCwgcFRhYmxlKTsKIAl9CiAKIAlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotICAgIHBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUud29yZDsKLSAgICBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLndvcmQ7Ci0JaWYgKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IEZBTFNFKQotCXsKKwlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLndvcmQ7CisJcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZCA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS53b3JkOworCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBGQUxTRSkgewogCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7CiAKIAkJaWYgKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAzMikKIAkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CiAKLQkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPiBNQ1NfNykgfHwgKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAzMikpCisJCWlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID4gTUNTXzcpCisJCSAgICB8fCAocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID09IDMyKSkKIAkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7CiAKLQkJLy8gSWYgdGhlIGxlZ2FjeSBtb2RlIGlzIHNldCwgb3ZlcndyaXRlIHRoZSB0cmFuc21pdCBzZXR0aW5nIG9mIHRoaXMgZW50cnkuCisJCS8qIElmIHRoZSBsZWdhY3kgbW9kZSBpcyBzZXQsIG92ZXJ3cml0ZSB0aGUgdHJhbnNtaXQgc2V0dGluZyBvZiB0aGlzIGVudHJ5LiAqLwogCQlpZiAocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pCi0JCQlSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKChVQ0hBUilwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlLCBwRW50cnkpOwotCX0KLQllbHNlCisJCQlSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKCh1OClwQWQtPlN0YUNmZy4KKwkJCQkJCSAgRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC4KKwkJCQkJCSAgRml4ZWRUeE1vZGUsIHBFbnRyeSk7CisJfSBlbHNlCiAJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOwogCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CiAKLQkvLyAgTGV0IExpbmsgU3RhdHVzIFBhZ2UgZGlzcGxheSBmaXJzdCBpbml0aWFsIHJhdGUuCi0JcEFkLT5MYXN0VHhSYXRlID0gKFVTSE9SVCkocEVudHJ5LT5IVFBoeU1vZGUud29yZCk7Ci0JLy8gU2VsZWN0IERBQyBhY2NvcmRpbmcgdG8gSFQgb3IgTGVnYWN5Ci0JaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdICE9IDB4MDApCi0JeworCS8qICBMZXQgTGluayBTdGF0dXMgUGFnZSBkaXNwbGF5IGZpcnN0IGluaXRpYWwgcmF0ZS4gKi8KKwlwQWQtPkxhc3RUeFJhdGUgPSAodTE2KShwRW50cnktPkhUUGh5TW9kZS53b3JkKTsKKwkvKiBTZWxlY3QgREFDIGFjY29yZGluZyB0byBIVCBvciBMZWdhY3kgKi8KKwlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gIT0gMHgwMCkgewogCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZWYWx1ZSk7CiAJCVZhbHVlICY9ICh+MHgxOCk7Ci0JCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpCi0JCXsKLQkJICAgIFZhbHVlIHw9IDB4MTA7CisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpIHsKKwkJCVZhbHVlIHw9IDB4MTA7CiAJCX0KIAkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgVmFsdWUpOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJlZhbHVlKTsKIAkJVmFsdWUgJj0gKH4weDE4KTsKIAkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgVmFsdWUpOwogCX0KIAotCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBGQUxTRSkKLQl7Ci0JfQotCWVsc2UgaWYgKHBFbnRyeS0+TWF4UkFtcGR1RmFjdG9yID09IDApCi0JewotCSAgICAvLyBJZiBIVCBBUCBkb2Vzbid0IHN1cHBvcnQgTWF4UkFtcGR1RmFjdG9yID0gMSwgd2UgbmVlZCB0byBzZXQgbWF4IFBTRFUgdG8gMC4KLQkgICAgLy8gQmVjYXVzZSBvdXIgSW5pdCB2YWx1ZSBpcyAxIGF0IE1BQ1JlZ1RhYmxlLgorCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBGQUxTRSkgeworCX0gZWxzZSBpZiAocEVudHJ5LT5NYXhSQW1wZHVGYWN0b3IgPT0gMCkgeworCQkvKiBJZiBIVCBBUCBkb2Vzbid0IHN1cHBvcnQgTWF4UkFtcGR1RmFjdG9yID0gMSwgd2UgbmVlZCB0byBzZXQgbWF4IFBTRFUgdG8gMC4gKi8KKwkJLyogQmVjYXVzZSBvdXIgSW5pdCB2YWx1ZSBpcyAxIGF0IE1BQ1JlZ1RhYmxlLiAqLwogCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQVhfTEVOX0NGRywgMHgwZmZmKTsKIAl9Ci0KLQkvLyBQYXRjaCBmb3IgTWFydmVsIEFQIHRvIGdhaW4gaGlnaCB0aHJvdWdocHV0Ci0JLy8gTmVlZCB0byBzZXQgYXMgZm9sbG93aW5nLAotCS8vIDEuIFNldCB0eG9wIGluIHJlZ2lzdGVyLUVEQ0FfQUMwX0NGRyBhcyAweDYwCi0JLy8gMi4gU2V0IEVuVFhXcml0ZUJhY2tERE9ORSBpbiByZWdpc3Rlci1XUERNQV9HTE9fQ0ZHIGFzIHplcm8KLQkvLyAzLiBQQkZfTUFYX1BDTlQgYXMgMHgxRjNGQkY5RgotCS8vIDQuIGtpY2sgcGVyIHR3byBwYWNrZXRzIHdoZW4gZGVxdWV1ZQotCS8vCi0JLy8gVHhvcCBjYW4gb25seSBiZSBtb2RpZmllZCB3aGVuIFJERyBpcyBvZmYsIFdNTSBpcyBkaXNhYmxlIGFuZCBUeEJ1cnN0IGlzIGVuYWJsZQotCS8vCi0JLy8gaWYgMS4gTGVnYWN5IEFQIFdNTSBvbiwgIG9yIDIuIDExbiBBUCwgQU1QRFUgZGlzYWJsZS4gIEZvcmNlIHR1cm4gb2ZmIGJ1cnN0IG5vIG1hdHRlciB3aGF0IGJFbmFibGVUeEJ1cnN0IGlzLgotCWlmICgKLQkJIShwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9PSAxICYmIHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpICYmCi0JCSgoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpKQotCQl8fCAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IFRSVUUpICYmIChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID09IEJBX05PVFVTRSkpKSkKLQl7CisJLyogUGF0Y2ggZm9yIE1hcnZlbCBBUCB0byBnYWluIGhpZ2ggdGhyb3VnaHB1dCAqLworCS8qIE5lZWQgdG8gc2V0IGFzIGZvbGxvd2luZywgKi8KKwkvKiAxLiBTZXQgdHhvcCBpbiByZWdpc3Rlci1FRENBX0FDMF9DRkcgYXMgMHg2MCAqLworCS8qIDIuIFNldCBFblRYV3JpdGVCYWNrRERPTkUgaW4gcmVnaXN0ZXItV1BETUFfR0xPX0NGRyBhcyB6ZXJvICovCisJLyogMy4gUEJGX01BWF9QQ05UIGFzIDB4MUYzRkJGOUYgKi8KKwkvKiA0LiBraWNrIHBlciB0d28gcGFja2V0cyB3aGVuIGRlcXVldWUgKi8KKwkvKiAqLworCS8qIFR4b3AgY2FuIG9ubHkgYmUgbW9kaWZpZWQgd2hlbiBSREcgaXMgb2ZmLCBXTU0gaXMgZGlzYWJsZSBhbmQgVHhCdXJzdCBpcyBlbmFibGUgKi8KKwkvKiAqLworCS8qIGlmIDEuIExlZ2FjeSBBUCBXTU0gb24sICBvciAyLiAxMW4gQVAsIEFNUERVIGRpc2FibGUuICBGb3JjZSB0dXJuIG9mZiBidXJzdCBubyBtYXR0ZXIgd2hhdCBiRW5hYmxlVHhCdXJzdCBpcy4gKi8KKwlpZiAoISgocEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPT0gMSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpKQorCSAgICAmJiAocEFkLT5TdGFDZmcuYkZvcmNlVHhCdXJzdCA9PSBGQUxTRSkKKwkgICAgJiYKKwkgICAgKCgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpCisJICAgICAgJiYgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSkKKwkgICAgIHx8ICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gVFJVRSkKKwkJICYmIChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID09IEJBX05PVFVTRSkpKSkgewogCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOwotCQlEYXRhICAmPSAweEZGRkZGRjAwOworCQlEYXRhICY9IDB4RkZGRkZGMDA7CiAJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7CiAKIAkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX01BWF9QQ05ULCAweDFGM0Y3RjlGKTsKIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhidXJzdCAxXG4iKSk7Ci0JfQotCWVsc2UKLQlpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpCi0JeworCX0gZWxzZSBpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpIHsKIAkJUlRNUF9JT19SRUFEMzIocEFkLCBFRENBX0FDMF9DRkcsICZEYXRhKTsKLQkJRGF0YSAgJj0gMHhGRkZGRkYwMDsKLQkJRGF0YSAgfD0gMHg2MDsKKwkJRGF0YSAmPSAweEZGRkZGRjAwOworCQlEYXRhIHw9IDB4NjA7CiAJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7CiAJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5vd0F0aGVyb3NCdXJzdE9uID0gVFJVRTsKIAogCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfTUFYX1BDTlQsIDB4MUYzRkJGOUYpOwogCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeGJ1cnN0IDJcbiIpKTsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOwotCQlEYXRhICAmPSAweEZGRkZGRjAwOworCQlEYXRhICY9IDB4RkZGRkZGMDA7CiAJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7CiAKIAkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX01BWF9QQ05ULCAweDFGM0Y3RjlGKTsKIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhidXJzdCAzXG4iKSk7CiAJfQogCi0JLy8gUmUtY2hlY2sgdG8gdHVybiBvbiBUWCBidXJzdCBvciBub3QuCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJMYXN0QXRoZXJvcyA9PSBUUlVFKSAmJiAoKFNUQV9XRVBfT04ocEFkKSl8fChTVEFfVEtJUF9PTihwQWQpKSkpCi0JeworCS8qIFJlLWNoZWNrIHRvIHR1cm4gb24gVFggYnVyc3Qgb3Igbm90LiAqLworCWlmICgocEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTGFzdEF0aGVyb3MgPT0gVFJVRSkKKwkgICAgJiYgKChTVEFfV0VQX09OKHBBZCkpIHx8IChTVEFfVEtJUF9PTihwQWQpKSkpIHsKIAkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTmV4dERpc2FibGVSeEJBID0gVFJVRTsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KQotCQl7Ci0JCSAgICBVSU5UMzIgTUFDVmFsdWUgPSAwOwotCQkJLy8gRm9yY2UgZGlzYWJsZSAgVFhPUCB2YWx1ZSBpbiB0aGlzIGNhc2UuIFRoZSBzYW1lIGFjdGlvbiBpbiBNTE1FVXBkYXRlUHJvdGVjdCB0b28uCi0JCQkvLyBJIGRpZG4ndCBjaGFuZ2UgUEJGX01BWF9QQ05UIHNldHRpbmcuCisJCWlmIChwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkgeworCQkJdTMyIE1BQ1ZhbHVlID0gMDsKKwkJCS8qIEZvcmNlIGRpc2FibGUgIFRYT1AgdmFsdWUgaW4gdGhpcyBjYXNlLiBUaGUgc2FtZSBhY3Rpb24gaW4gTUxNRVVwZGF0ZVByb3RlY3QgdG9vLiAqLworCQkJLyogSSBkaWRuJ3QgY2hhbmdlIFBCRl9NQVhfUENOVCBzZXR0aW5nLiAqLwogCQkJUlRNUF9JT19SRUFEMzIocEFkLCBFRENBX0FDMF9DRkcsICZNQUNWYWx1ZSk7Ci0JCQlNQUNWYWx1ZSAgJj0gMHhGRkZGRkYwMDsKKwkJCU1BQ1ZhbHVlICY9IDB4RkZGRkZGMDA7CiAJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIE1BQ1ZhbHVlKTsKIAkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5vd0F0aGVyb3NCdXJzdE9uID0gRkFMU0U7CiAJCX0KLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOZXh0RGlzYWJsZVJ4QkEgPSBGQUxTRTsKIAl9CiAKIAlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJMYXN0QXRoZXJvcyA9IEZBTFNFOwogCUNPUFlfTUFDX0FERFIocEFkLT5Db21tb25DZmcuTGFzdEJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcEFkLT5iTmV4dERpc2FibGVSeEJBPSAlZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5leHREaXNhYmxlUnhCQSkpOwotCS8vIEJTU0lEIGFkZCBpbiBvbmUgTUFDIGVudHJ5IHRvby4gIEJlY2F1c2UgaW4gVHgsIEFTSUMgbmVlZCB0byBjaGVjayBDaXBoZXIgYW5kIElWL0VJViwgQkFiaXRtYXAKLQkvLyBQdGhlciBpbmZvcm1hdGlvbiBpbiBNQUNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSBpcyBub3QgbmVjZXNzYXJ5IGZvciBkcml2ZXIuCi0JLy8gTm90ZTogQXMgU1RBLCBUaGUgTUFDVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uIFBhaXJ3aXNlS2V5IGFuZCBTaGFyZWQgS2V5IGZvciBCU1MwIGFyZSB0aGUgc2FtZS4KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgicEFkLT5iTmV4dERpc2FibGVSeEJBPSAlZCBcbiIsCisJCSAgcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTmV4dERpc2FibGVSeEJBKSk7CisJLyogQlNTSUQgYWRkIGluIG9uZSBNQUMgZW50cnkgdG9vLiAgQmVjYXVzZSBpbiBUeCwgQVNJQyBuZWVkIHRvIGNoZWNrIENpcGhlciBhbmQgSVYvRUlWLCBCQWJpdG1hcCAqLworCS8qIFB0aGVyIGluZm9ybWF0aW9uIGluIE1BQ1RhYi5Db250ZW50W0JTU0lEX1dDSURdIGlzIG5vdCBuZWNlc3NhcnkgZm9yIGRyaXZlci4gKi8KKwkvKiBOb3RlOiBBcyBTVEEsIFRoZSBNQUNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS4gUGFpcndpc2VLZXkgYW5kIFNoYXJlZCBLZXkgZm9yIEJTUzAgYXJlIHRoZSBzYW1lLiAqLwogCi0gICAgaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA8PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0gICAgewotICAgICAgICBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOwotCQlwQWQtPlN0YUNmZy5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGw7CisJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA8PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpIHsKKwkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAmJgorCQkgICAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkgJiYKKwkJICAgIChwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gVFJVRSkpIDsKKwkJZWxzZSB7CisJCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQkJcEFkLT5TdGFDZmcuUHJpdmFjeUZpbHRlciA9CisJCQkgICAgTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGw7CisJCX0KIAl9CiAKIAlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwogCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZDsKIAlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwogCi0gICAgLy8KLQkvLyBQYXRjaCBBdGhlcm9zIEFQIFRYIHdpbGwgYnJlYWtkb3duIGlzc3VlLgotCS8vIEFQIE1vZGVsOiBETGluayBEV0wtODIwMEFQCi0JLy8KLQlpZiAoSU5GUkFfT04ocEFkKSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpICYmIFNUQV9US0lQX09OKHBBZCkpCi0JeworCS8qICovCisJLyogUGF0Y2ggQXRoZXJvcyBBUCBUWCB3aWxsIGJyZWFrZG93biBpc3N1ZS4gKi8KKwkvKiBBUCBNb2RlbDogRExpbmsgRFdMLTgyMDBBUCAqLworCS8qICovCisJaWYgKElORlJBX09OKHBBZCkgJiYgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKQorCSAgICAmJiBTVEFfVEtJUF9PTihwQWQpKSB7CiAJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX1BBUlNFUl9DRkcsIDB4MDEpOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX1BBUlNFUl9DRkcsIDB4MDApOwogCX0KIAogCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOwotI2lmZGVmIFJUMjg2MAorCiAJUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19HT19UT19TTEVFUF9OT1cpOwotI2VuZGlmCiB9CiAKIC8qCkBAIC0xODIyLDIyMCArMTg3MywxOTAgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBMaW5rRG93bigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiAgQk9PTEVBTiAgICAgIElzUmVxRnJvbUFQKQordm9pZCBMaW5rRG93bihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIEJPT0xFQU4gSXNSZXFGcm9tQVApCiB7Ci0JVUNIQVIJCQkgICAgaSwgQnl0ZVZhbHVlID0gMDsKLSNpZmRlZiBSVDI4NjAKLQlCT09MRUFOCQlDYW5jZWxsZWQ7Ci0jZW5kaWYKKwl1OCBpLCBCeXRlVmFsdWUgPSAwOwogCi0JLy8gRG8gbm90aGluZyBpZiBtb25pdG9yIG1vZGUgaXMgb24KKwkvKiBEbyBub3RoaW5nIGlmIG1vbml0b3IgbW9kZSBpcyBvbiAqLwogCWlmIChNT05JVE9SX09OKHBBZCkpCiAJCXJldHVybjsKIAotI2lmZGVmIFJUMjg2MAogCVJUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfR09fVE9fU0xFRVBfTk9XKTsKLQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwJCSZDYW5jZWxsZWQpOwotCi0JLy8gTm90IGFsbG93IGdvIHRvIHNsZWVwIHdpdGhpbiBsaW5rZG93biBmdW5jdGlvbi4KKwkvKkNvbW1lbnQgdGhlIGNvZGVzLCBiZWFzdWUgdGhlIGxpbmUgMjI5MSBjYWxsIHRoZSBzYW1lIGZ1bmN0aW9uLiAqLworCS8qUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsICAgICAgICAgICAgICAgJkNhbmNlbGxlZCk7ICovCisJLyogTm90IGFsbG93IGdvIHRvIHNsZWVwIHdpdGhpbiBsaW5rZG93biBmdW5jdGlvbi4gKi8KIAlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7Ci0jZW5kaWYKIAotICAgIGlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQl7Ci0JCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NUQV9MSU5LRE9XTl9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkgeworCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRywKKwkJCQkgICAgICBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsCisJCQkJICAgICAgQlNTMCwgMCk7CiAJfQogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgRE9XTiAhISFcbiIpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJMSU5LIERPV04hXG4iKSk7CiAJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsKIAotI2lmZGVmIFJUMjg2MAotICAgIGlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpCi0gICAgewotCSAgICBCT09MRUFOIENhbmNlbGxlZDsKLSAgICAgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKLSAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCSZDYW5jZWxsZWQpOwotICAgIH0KKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpIHsKKwkJQk9PTEVBTiBDYW5jZWxsZWQ7CisJCXBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLCAmQ2FuY2VsbGVkKTsKKwl9CiAKLSAgICBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSB8fAotCQlSVE1QX1RFU1RfUFNGTEFHKHBBZCwgZlJUTVBfUFNfU0VUX1BDSV9DTEtfT0ZGX0NPTU1BTkQpIHx8Ci0JCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRikpCi0gICAgewotCQlBc2ljRm9yY2VXYWtldXAocEFkLCBSVE1QX0hBTFQpOwotICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKLSAgICB9CisJcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiAKLSAgICBwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKLSNlbmRpZgotCWlmIChBREhPQ19PTihwQWQpKQkJLy8gQWRob2MgbW9kZSBsaW5rIGRvd24KKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKQorCSAgICB8fCBSVE1QX1RFU1RfUFNGTEFHKHBBZCwgZlJUTVBfUFNfU0VUX1BDSV9DTEtfT0ZGX0NPTU1BTkQpCisJICAgIHx8IFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRikpIHsKKwkJQVVUT19XQUtFVVBfU1RSVUMgQXV0b1dha2V1cENmZzsKKwkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7CisJCUF1dG9XYWtldXBDZmcud29yZCA9IDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7CisJfQorI2lmZGVmIFJUTVBfTUFDX1BDSQorCXBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCisJaWYgKEFESE9DX09OKHBBZCkpCS8qIEFkaG9jIG1vZGUgbGluayBkb3duICovCiAJewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBET1dOIDEhISFcbiIpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTElOSyBET1dOIDEhXG4iKSk7CiAKIAkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURIT0NfT04pOwogCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwogCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOwogCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOwotICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOwotCQlCc3NUYWJsZURlbGV0ZUVudHJ5KCZwQWQtPlNjYW5UYWIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1hY1RhYi5TaXplPSVkICEhIVxuIiwgcEFkLT5NYWNUYWIuU2l6ZSkpOwotCX0KLQllbHNlCQkJCQkvLyBJbmZyYSBzdHJ1Y3R1cmUgbW9kZQorCQlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOworCQlCc3NUYWJsZURlbGV0ZUVudHJ5KCZwQWQtPlNjYW5UYWIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQkJCSAgICBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCIgTWFjVGFiLlNpemU9JWQgIVxuIiwgcEFkLT5NYWNUYWIuU2l6ZSkpOworCX0gZWxzZQkJCS8qIEluZnJhIHN0cnVjdHVyZSBtb2RlICovCiAJewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBET1dOIDIhISFcbiIpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTElOSyBET1dOIDIhXG4iKSk7CiAKIAkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfSU5GUkFfT04pOwogCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwogCi0JCS8vIFNhdmVkIGxhc3QgU1NJRCBmb3IgbGlua3VwIGNvbXBhcmlzb24KKwkJLyogU2F2ZWQgbGFzdCBTU0lEIGZvciBsaW5rdXAgY29tcGFyaXNvbiAqLwogCQlwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZExlbiA9IHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW47Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZExlbik7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLAorCQkJICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkTGVuKTsKIAkJQ09QWV9NQUNfQUREUihwQWQtPkNvbW1vbkNmZy5MYXN0QnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJaWYgKHBBZC0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9PSBUUlVFKQotCQl7CisJCWlmIChwQWQtPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPT0gVFJVRSkgewogCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKIAkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7Ci0gICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBBIVxuIikpOworCQkJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQSFcbiIpKTsKIAkJCXBBZC0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOwotCQl9Ci0JCWVsc2UKLQkJewotICAgICAgICAgICAgLy8KLQkJCS8vIElmIGRpc2Fzc29jaWF0aW9uIHJlcXVlc3QgaXMgZnJvbSBORElTLCB0aGVuIHdlIGRvbid0IG5lZWQgdG8gZGVsZXRlIEJTU0lEIGZyb20gZW50cnkuCi0JCQkvLyBPdGhlcndpc2UgbG9zdCBiZWFjb24gb3IgcmVjZWl2ZSBEZS1BdXRoZW50aWNhdGlvbiBmcm9tIEFQLAotCQkJLy8gdGhlbiB3ZSBzaG91bGQgZGVsZXRlIEJTU0lEIGZyb20gQnNzVGFibGUuCi0JCQkvLyBJZiB3ZSBkb24ndCBkZWxldGUgZnJvbSBlbnRyeSwgcm9hbWluZyB3aWxsIGZhaWwuCi0JCQkvLwotCQkJQnNzVGFibGVEZWxldGVFbnRyeSgmcEFkLT5TY2FuVGFiLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCX0gZWxzZSB7CisJCQkvKiAqLworCQkJLyogSWYgZGlzYXNzb2NpYXRpb24gcmVxdWVzdCBpcyBmcm9tIE5ESVMsIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBkZWxldGUgQlNTSUQgZnJvbSBlbnRyeS4gKi8KKwkJCS8qIE90aGVyd2lzZSBsb3N0IGJlYWNvbiBvciByZWNlaXZlIERlLUF1dGhlbnRpY2F0aW9uIGZyb20gQVAsICovCisJCQkvKiB0aGVuIHdlIHNob3VsZCBkZWxldGUgQlNTSUQgZnJvbSBCc3NUYWJsZS4gKi8KKwkJCS8qIElmIHdlIGRvbid0IGRlbGV0ZSBmcm9tIGVudHJ5LCByb2FtaW5nIHdpbGwgZmFpbC4gKi8KKwkJCS8qICovCisJCQlCc3NUYWJsZURlbGV0ZUVudHJ5KCZwQWQtPlNjYW5UYWIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQkJCQkgICAgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CiAJCX0KIAotCQkvLyByZXN0b3JlIGJhY2sgdG8gLQotCQkvLyAgICAgIDEuIGxvbmcgc2xvdCAoMjAgdXMpIG9yIHNob3J0IHNsb3QgKDkgdXMpIHRpbWUKLQkJLy8gICAgICAyLiB0dXJuIG9uL29mZiBSVFMvQ1RTIGFuZC9vciBDVFMtdG8tc2VsZiBwcm90ZWN0aW9uCi0JCS8vICAgICAgMy4gc2hvcnQgcHJlYW1ibGUKKwkJLyogcmVzdG9yZSBiYWNrIHRvIC0gKi8KKwkJLyogICAgICAxLiBsb25nIHNsb3QgKDIwIHVzKSBvciBzaG9ydCBzbG90ICg5IHVzKSB0aW1lICovCisJCS8qICAgICAgMi4gdHVybiBvbi9vZmYgUlRTL0NUUyBhbmQvb3IgQ1RTLXRvLXNlbGYgcHJvdGVjdGlvbiAqLworCQkvKiAgICAgIDMuIHNob3J0IHByZWFtYmxlICovCiAJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKTsKIAotCQlpZiAocEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUFJlcG9ydEZsYWcgPT0gVFJVRSkKLQkJewotCQkJLy8KLQkJCS8vIFJlY29yZCBjdXJyZW50IEFQJ3MgaW5mb3JtYXRpb24uCi0JCQkvLyBmb3IgbGF0ZXIgdXNlZCByZXBvcnRpbmcgQWRqYWNlbnQgQVAgcmVwb3J0LgotCQkJLy8KLQkJCXBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKLQkJCXBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBTc2lkTGVuID0gcEFkLT5Db21tb25DZmcuU3NpZExlbjsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBTc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQU3NpZExlbik7Ci0JCQlDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBCc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQl9CiAJfQogCi0JZm9yIChpPTE7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKLQl7CisJZm9yIChpID0gMTsgaSA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspIHsKIAkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSA9PSBUUlVFKQotCQkJTWFjVGFibGVEZWxldGVFbnRyeShwQWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uQWlkLCBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFkZHIpOworCQkJTWFjVGFibGVEZWxldGVFbnRyeShwQWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uQWlkLAorCQkJCQkgICAgcEFkLT5NYWNUYWIuQ29udGVudFtpXS5BZGRyKTsKIAl9CiAKLQlwQWQtPlN0YUNmZy5DQ1hRb3NFQ1dNaW4JPSA0OwotCXBBZC0+U3RhQ2ZnLkNDWFFvc0VDV01heAk9IDEwOwotCi0JQXNpY1NldFNsb3RUaW1lKHBBZCwgVFJVRSk7IC8vRkFMU0UpOworCUFzaWNTZXRTbG90VGltZShwQWQsIFRSVUUpOwkvKkZBTFNFKTsgKi8KIAlBc2ljU2V0RWRjYVBhcm0ocEFkLCBOVUxMKTsKIAotCS8vIFNldCBMRUQKKwkvKiBTZXQgTEVEICovCiAJUlRNUFNldExFRChwQWQsIExFRF9MSU5LX0RPV04pOwotICAgIHBBZC0+TGVkSW5kaWNhdG9yU3RyZWd0aCA9IDB4RjA7Ci0gICAgUlRNUFNldFNpZ25hbExFRChwQWQsIC0xMDApOwkvLyBGb3JjZSBzaWduYWwgc3RyZW5ndGggTGVkIHRvIGJlIHR1cm5lZCBvZmYsIGZpcm13YXJlIGlzIG5vdCBkb25lIGl0LgorCXBBZC0+TGVkSW5kaWNhdG9yU3RyZW5ndGggPSAweEYwOworCVJUTVBTZXRTaWduYWxMRUQocEFkLCAtMTAwKTsJLyogRm9yY2Ugc2lnbmFsIHN0cmVuZ3RoIExlZCB0byBiZSB0dXJuZWQgb2ZmLCBmaXJtd2FyZSBpcyBub3QgZG9uZSBpdC4gKi8KIAotCQlBc2ljRGlzYWJsZVN5bmMocEFkKTsKKwlBc2ljRGlzYWJsZVN5bmMocEFkKTsKIAogCXBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kID0gMDsKIAlwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCA9IDA7CiAKLQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCi0JewotCQkvLyBSZW1vdmUgU3RhQ2ZnIEluZm9ybWF0aW9uIGFmdGVyIGxpbmsgZG93bgorCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkgeworCQkvKiBSZW1vdmUgU3RhQ2ZnIEluZm9ybWF0aW9uIGFmdGVyIGxpbmsgZG93biAqLwogCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKIAkJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKIAkJcEFkLT5Db21tb25DZmcuU3NpZExlbiA9IDA7CiAJfQogCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7Ci0JTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCBzaXplb2Yoc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHlfaWUpKTsKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywgc2l6ZW9mKHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSkpOwogCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSAwOwogCXBBZC0+TWxtZUF1eC5OZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKIAotCS8vIFJlc2V0IFdQQS1QU0sgc3RhdGUuIE9ubHkgcmVzZXQgd2hlbiBzdXBwbGljYW50IGVuYWJsZWQKLQlpZiAocEFkLT5TdGFDZmcuV3BhU3RhdGUgIT0gU1NfTk9UVVNFKQotCXsKKwkvKiBSZXNldCBXUEEtUFNLIHN0YXRlLiBPbmx5IHJlc2V0IHdoZW4gc3VwcGxpY2FudCBlbmFibGVkICovCisJaWYgKHBBZC0+U3RhQ2ZnLldwYVN0YXRlICE9IFNTX05PVFVTRSkgewogCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1NUQVJUOwotCQkvLyBDbGVhciBSZXBsYXkgY291bnRlcgorCQkvKiBDbGVhciBSZXBsYXkgY291bnRlciAqLwogCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCA4KTsKKwogCX0KLQotCi0JLy8KLQkvLyBpZiBsaW5rIGRvd24gY29tZSBmcm9tIEFQLCB3ZSBuZWVkIHRvIHJlbW92ZSBhbGwgV1BBIGtleXMgb24gV1BBIG1vZGUuCi0JLy8gb3RoZXJ3aXNlIHdpbGwgY2F1c2UgNC13YXkgaGFuZHNoYWtpbmcgZmFpbGVkLCBzaW5jZSB0aGUgV1BBIGtleSBub3QgZW1wdHkuCi0JLy8KLQlpZiAoKElzUmVxRnJvbUFQKSAmJiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSkKLQl7Ci0JCS8vIFJlbW92ZSBhbGwgV1BBIGtleXMKKwkvKiAqLworCS8qIGlmIGxpbmsgZG93biBjb21lIGZyb20gQVAsIHdlIG5lZWQgdG8gcmVtb3ZlIGFsbCBXUEEga2V5cyBvbiBXUEEgbW9kZS4gKi8KKwkvKiBvdGhlcndpc2Ugd2lsbCBjYXVzZSA0LXdheSBoYW5kc2hha2luZyBmYWlsZWQsIHNpbmNlIHRoZSBXUEEga2V5IG5vdCBlbXB0eS4gKi8KKwkvKiAqLworCWlmICgoSXNSZXFGcm9tQVApICYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpKSB7CisJCS8qIFJlbW92ZSBhbGwgV1BBIGtleXMgKi8KIAkJUlRNUFdQQVJlbW92ZUFsbEtleXMocEFkKTsKIAl9CisJLyogODAyLjF4IHBvcnQgY29udHJvbCAqLwogCi0JLy8gODAyLjF4IHBvcnQgY29udHJvbAotCi0JLy8gUHJldmVudCBjbGVhciBQb3J0U2VjdXJlZCBoZXJlIHdpdGggc3RhdGljIFdFUAotCS8vIE5ldHdvcmtNYW5nZXIgc2V0IHNlY3VyaXR5IHBvbGljeSBmaXJzdCB0aGVuIHNldCBTU0lEIHRvIGNvbm5lY3QgQVAuCisJLyogUHJldmVudCBjbGVhciBQb3J0U2VjdXJlZCBoZXJlIHdpdGggc3RhdGljIFdFUCAqLworCS8qIE5ldHdvcmtNYW5nZXIgc2V0IHNlY3VyaXR5IHBvbGljeSBmaXJzdCB0aGVuIHNldCBTU0lEIHRvIGNvbm5lY3QgQVAuICovCiAJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAmJgotCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKSAmJgotCQkocEFkLT5TdGFDZmcuSUVFRTgwMjFYID09IEZBTFNFKSkKLQl7CisJICAgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpICYmCisJICAgIChwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gRkFMU0UpKSB7CiAJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CiAJCXBBZC0+U3RhQ2ZnLlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlcjgwMjF4V0VQOwogCX0KIAogCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWFjVGFiLCBzaXplb2Yoc3RydWN0IHJ0X21hY190YWJsZSkpOwogCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUG9ydFNlY3VyZWQgPSBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZDsKIAlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwogCiAJcEFkLT5TdGFDZmcuTWljRXJyQ250ID0gMDsKIAotCS8vIFR1cm4gb2ZmIENraXAgY29udHJvbCBmbGFnCi0JcEFkLT5TdGFDZmcuYkNraXBPbiA9IEZBTFNFOwotCXBBZC0+U3RhQ2ZnLkNDWEVuYWJsZSA9IEZBTFNFOwotCi0gICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKLQkvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gdG8gbGluayBpcyB1cAorCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisJLyogVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uIHRvIGxpbmsgaXMgdXAgKi8KIAlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOwogCi0jaWZkZWYgUlQyODYwCi0gICAgcEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCA9IEZBTFNFOwotCXBBZC0+U3RhQ2ZnLkFkaG9jQkdKb2luZWQgPSBGQUxTRTsKLQlwQWQtPlN0YUNmZy5BZGhvYzIwTkpvaW5lZCA9IEZBTFNFOwotI2VuZGlmCi0gICAgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKKwlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IEZBTFNFOwogCi0JLy8gUmVzZXQgdGhlIEN1cnJlbnQgQVAncyBJUCBhZGRyZXNzCi0JTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuQWlyb25ldElQQWRkcmVzcywgNCk7Ci0jaWZkZWYgUlQyODcwCisjaWZkZWYgUlRNUF9NQUNfVVNCCiAJcEFkLT5iVXNiVHhCdWxrQWdncmUgPSBGQUxTRTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotCS8vIENsZWFuIGFzc29jaWF0aW9uIGluZm9ybWF0aW9uCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQ2ZnLkFzc29jSW5mbywgc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKSk7Ci0JcEFkLT5TdGFDZmcuQXNzb2NJbmZvLkxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTik7CisJLyogQ2xlYW4gYXNzb2NpYXRpb24gaW5mb3JtYXRpb24gKi8KKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5TdGFDZmcuQXNzb2NJbmZvLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9uZGlzXzgwMl8xMV9hc3NvY2lhdGlvbl9pbmZvcm1hdGlvbikpOworCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5MZW5ndGggPQorCSAgICBzaXplb2Yoc3RydWN0IHJ0X25kaXNfODAyXzExX2Fzc29jaWF0aW9uX2luZm9ybWF0aW9uKTsKIAlwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiA9IDA7CiAJcEFkLT5TdGFDZmcuUmVzVmFySUVMZW4gPSAwOwogCi0JLy8KLQkvLyBSZXNldCBSU1NJIHZhbHVlIGFmdGVyIGxpbmsgZG93bgotCS8vCisJLyogKi8KKwkvKiBSZXNldCBSU1NJIHZhbHVlIGFmdGVyIGxpbmsgZG93biAqLworCS8qICovCiAJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCA9IDA7CiAJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMFg4ID0gMDsKIAlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxID0gMDsKQEAgLTIwNDMsMzcgKzIwNjQsMzYgQEAKIAlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyID0gMDsKIAlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyWDggPSAwOwogCi0JLy8gUmVzdG9yZSBNbG1lUmF0ZQorCS8qIFJlc3RvcmUgTWxtZVJhdGUgKi8KIAlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJhc2ljTWxtZVJhdGU7CiAJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJhc2ljTWxtZVJhdGU7CiAKLQkvLwotCS8vIEFmdGVyIExpbmsgZG93biwgcmVzZXQgcGlnZ3ktYmFjayBzZXR0aW5nIGluIEFTSUMuIERpc2FibGUgUkRHLgotCS8vCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkKLQl7CisJLyogKi8KKwkvKiBBZnRlciBMaW5rIGRvd24sIHJlc2V0IHBpZ2d5LWJhY2sgc2V0dGluZyBpbiBBU0lDLiBEaXNhYmxlIFJERy4gKi8KKwkvKiAqLworCWlmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApIHsKIAkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7CiAJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJ5dGVWYWx1ZSk7CiAJCUJ5dGVWYWx1ZSAmPSAofjB4MTgpOwogCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCeXRlVmFsdWUpOwogCX0KLQotCS8vIFJlc2V0IERBQworCS8qIFJlc2V0IERBQyAqLwogCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJ5dGVWYWx1ZSk7CiAJQnl0ZVZhbHVlICY9ICh+MHgxOCk7Ci0JaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikKLQl7CisJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikgewogCQlCeXRlVmFsdWUgfD0gMHgxMDsKIAl9CiAJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgQnl0ZVZhbHVlKTsKIAotCVJUTVBTZXRQaWdneUJhY2socEFkLEZBTFNFKTsKKwlSVE1QU2V0UGlnZ3lCYWNrKHBBZCwgRkFMU0UpOwogCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BJR0dZQkFDS19JTlVTRUQpOwogCiAJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQgPSBwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkud29yZDsKIAotCS8vIFJlc3RvcmUgYWxsIHNldHRpbmdzIGluIHRoZSBmb2xsb3dpbmcuCi0JQXNpY1VwZGF0ZVByb3RlY3QocEFkLCAwLCAoQUxMTl9TRVRQUk9URUNUfENDS1NFVFBST1RFQ1R8T0ZETVNFVFBST1RFQ1QpLCBUUlVFLCBGQUxTRSk7CisJLyogUmVzdG9yZSBhbGwgc2V0dGluZ3MgaW4gdGhlIGZvbGxvd2luZy4gKi8KKwlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIDAsCisJCQkgIChBTExOX1NFVFBST1RFQ1QgfCBDQ0tTRVRQUk9URUNUIHwgT0ZETVNFVFBST1RFQ1QpLAorCQkJICBUUlVFLCBGQUxTRSk7CiAJQXNpY0Rpc2FibGVSREcocEFkKTsKIAlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJDdXJyZW50QXRoZXJvcyA9IEZBTFNFOwogCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5vd0F0aGVyb3NCdXJzdE9uID0gRkFMU0U7CkBAIC0yMDgxLDMwICsyMTAxLDE3IEBACiAJUlRNUF9JT19XUklURTMyKHBBZCwgTUFYX0xFTl9DRkcsIDB4MWZmZik7CiAJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7CiAKLSNpZmRlZiBSVDI4NjAKLQkvLyBBbGxvdyBnbyB0byBzbGVlcCBhZnRlciBsaW5rZG93biBzdGVwcy4KKy8qIEFsbG93IGdvIHRvIHNsZWVwIGFmdGVyIGxpbmtkb3duIHN0ZXBzLiAqLwogCVJUTVBfU0VUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7Ci0jZW5kaWYKIAotCXsKLQkJdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OwotCQltZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7Ci0JCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKwlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIFNJT0NHSVdBUCwgLTEsIE5VTEwsIE5VTEwsIDApOworCisjaWZkZWYgUlQzMHh4CisJaWYgKChJU19SVDMweHgocEFkKSB8fCBJU19SVDMwOTAocEFkKSB8fCBJU19SVDMzOTAocEFkKSkKKwkgICAgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPiAxIHx8IHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPiAxKSkgeworCQlSVE1QX0FTSUNfTU1QU19ESVNBQkxFKHBBZCk7CiAJfQotCi0JaWYgKElTX1JUMzA5MChwQWQpKQotCXsKLQkJVUlOVDMyCQkJCW1hY2RhdGE7Ci0JCS8vIGRpc2FibGUgTU1QUyBCQlAgY29udHJvbCByZWdpc3RlcgotCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCeXRlVmFsdWUpOwotCQlCeXRlVmFsdWUgJj0gfigweDA0KTsJLy9iaXQgMgotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCeXRlVmFsdWUpOwotCi0JCS8vIGRpc2FibGUgTU1QUyBNQUMgY29udHJvbCByZWdpc3RlcgotCQlSVE1QX0lPX1JFQUQzMihwQWQsIDB4MTIxMCwgJm1hY2RhdGEpOwotCQltYWNkYXRhICY9IH4oMHgwOSk7CS8vYml0IDAsIDMKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgMHgxMjEwLCBtYWNkYXRhKTsKLQl9CisjZW5kaWYgLyogUlQzMHh4IC8vICovCiB9CiAKIC8qCkBAIC0yMTE1LDExMiArMjEyMiwxNDggQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBJdGVyYXRlT25Cc3NUYWIoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCit2b2lkIEl0ZXJhdGVPbkJzc1RhYihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JTUxNRV9TVEFSVF9SRVFfU1RSVUNUICAgU3RhcnRSZXE7Ci0JTUxNRV9KT0lOX1JFUV9TVFJVQ1QgICAgSm9pblJlcTsKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBCc3NJZHg7CisJc3RydWN0IHJ0X21sbWVfc3RhcnRfcmVxIFN0YXJ0UmVxOworCXN0cnVjdCBydF9tbG1lX2pvaW5fcmVxIEpvaW5SZXE7CisJdW5zaWduZWQgbG9uZyBCc3NJZHg7CiAKLQkvLyBDaGFuZ2UgdGhlIHdlcHN0YXR1cyB0byBvcmlnaW5hbCB3ZXBzdGF0dXMKLQlwQWQtPlN0YUNmZy5XZXBTdGF0dXMgICA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7Ci0JcEFkLT5TdGFDZmcuUGFpckNpcGhlciAgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOworCS8qIENoYW5nZSB0aGUgd2Vwc3RhdHVzIHRvIG9yaWdpbmFsIHdlcHN0YXR1cyAqLworCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7CisJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7CiAJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOwogCiAJQnNzSWR4ID0gcEFkLT5NbG1lQXV4LkJzc0lkeDsKLQlpZiAoQnNzSWR4IDwgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIpCi0JewotCQkvLyBDaGVjayBjaXBoZXIgc3VpdGUsIEFQIG11c3QgaGF2ZSBtb3JlIHNlY3VyZWQgY2lwaGVyIHRoYW4gc3RhdGlvbiBzZXR0aW5nCi0JCS8vIFNldCB0aGUgUGFpcndpc2UgYW5kIEdyb3VwIGNpcGhlciB0byBtYXRjaCB0aGUgaW50ZW5kZWQgQVAgc2V0dGluZwotCQkvLyBXZSBjYW4gb25seSBjb25uZWN0IHRvIEFQIHdpdGggbGVzcyBzZWN1cmVkIGNpcGhlciBzZXR0aW5nCi0JCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKLQkJewotCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5Hcm91cENpcGhlcjsKKwlpZiAoQnNzSWR4IDwgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIpIHsKKwkJLyogQ2hlY2sgY2lwaGVyIHN1aXRlLCBBUCBtdXN0IGhhdmUgbW9yZSBzZWN1cmVkIGNpcGhlciB0aGFuIHN0YXRpb24gc2V0dGluZyAqLworCQkvKiBTZXQgdGhlIFBhaXJ3aXNlIGFuZCBHcm91cCBjaXBoZXIgdG8gbWF0Y2ggdGhlIGludGVuZGVkIEFQIHNldHRpbmcgKi8KKwkJLyogV2UgY2FuIG9ubHkgY29ubmVjdCB0byBBUCB3aXRoIGxlc3Mgc2VjdXJlZCBjaXBoZXIgc2V0dGluZyAqLworCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJICAgIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKSB7CisJCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9CisJCQkgICAgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuCisJCQkgICAgR3JvdXBDaXBoZXI7CiAKLQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlcikKLQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlcjsKLQkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXJBdXggIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQotCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyQXV4OwotCQkJZWxzZQkvLyBUaGVyZSBpcyBubyBQYWlyQ2lwaGVyIEF1eCwgZG93bmdyYWRlIG91ciBjYXBhYmlsaXR5IHRvIFRLSVAKLQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0KKwkJCSAgICBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS4KKwkJCSAgICBQYWlyQ2lwaGVyKQorCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPQorCQkJCSAgICBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLgorCQkJCSAgICBXUEEuUGFpckNpcGhlcjsKKwkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLgorCQkJCSBQYWlyQ2lwaGVyQXV4ICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0KKwkJCQkgICAgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS4KKwkJCQkgICAgV1BBLlBhaXJDaXBoZXJBdXg7CisJCQllbHNlCS8qIFRoZXJlIGlzIG5vIFBhaXJDaXBoZXIgQXV4LCBkb3duZ3JhZGUgb3VyIGNhcGFiaWxpdHkgdG8gVEtJUCAqLworCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPQorCQkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQl9IGVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorCQkJICAgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09CisJCQkgICAgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpIHsKKwkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0KKwkJCSAgICBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuCisJCQkgICAgR3JvdXBDaXBoZXI7CisKKwkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0KKwkJCSAgICBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuCisJCQkgICAgUGFpckNpcGhlcikKKwkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0KKwkJCQkgICAgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS4KKwkJCQkgICAgV1BBMi5QYWlyQ2lwaGVyOworCQkJZWxzZSBpZiAocEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLgorCQkJCSBQYWlyQ2lwaGVyQXV4ICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0KKwkJCQkgICAgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS4KKwkJCQkgICAgV1BBMi5QYWlyQ2lwaGVyQXV4OworCQkJZWxzZQkvKiBUaGVyZSBpcyBubyBQYWlyQ2lwaGVyIEF1eCwgZG93bmdyYWRlIG91ciBjYXBhYmlsaXR5IHRvIFRLSVAgKi8KKwkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0KKwkJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKworCQkJLyogUlNOIGNhcGFiaWxpdHkgKi8KKwkJCXBBZC0+U3RhQ2ZnLlJzbkNhcGFiaWxpdHkgPQorCQkJICAgIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi4KKwkJCSAgICBSc25DYXBhYmlsaXR5OwogCQl9Ci0JCWVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCi0JCXsKLQkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLkdyb3VwQ2lwaGVyOworCQkvKiBTZXQgTWl4IGNpcGhlciBmbGFnICovCisJCXBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgPQorCQkgICAgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0KKwkJICAgICBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcikgPyBGQUxTRSA6IFRSVUU7CisJCS8qaWYgKHBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgPT0gVFJVRSkKKwkJICAgeworCQkgICAvLyBJZiBtaXggY2lwaGVyLCByZS1idWlsZCBSU05JRQorCQkgICBSVE1QTWFrZVJTTklFKHBBZCwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywgMCk7CisJCSAgIH0gKi8KIAotCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlcikKLQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXI7Ci0JCQllbHNlIGlmIChwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlckF1eCAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0JCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyQXV4OwotCQkJZWxzZQkvLyBUaGVyZSBpcyBubyBQYWlyQ2lwaGVyIEF1eCwgZG93bmdyYWRlIG91ciBjYXBhYmlsaXR5IHRvIFRLSVAKLQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLQotCQkJLy8gUlNOIGNhcGFiaWxpdHkKLQkJCXBBZC0+U3RhQ2ZnLlJzbkNhcGFiaWxpdHkgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUnNuQ2FwYWJpbGl0eTsKLQkJfQotCi0JCS8vIFNldCBNaXggY2lwaGVyIGZsYWcKLQkJcEFkLT5TdGFDZmcuYk1peENpcGhlciA9IChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyKSA/IEZBTFNFIDogVFJVRTsKLQkJaWYgKHBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgPT0gVFJVRSkKLQkJewotCQkJLy8gSWYgbWl4IGNpcGhlciwgcmUtYnVpbGQgUlNOSUUKLQkJCVJUTVBNYWtlUlNOSUUocEFkLCBwQWQtPlN0YUNmZy5BdXRoTW9kZSwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCAwKTsKLQkJfQotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBpdGVyYXRlIEJTUyAlbGQgb2YgJWRcbiIsIEJzc0lkeCwgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJDTlRMIC0gaXRlcmF0ZSBCU1MgJWxkIG9mICVkXG4iLCBCc3NJZHgsCisJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yKSk7CiAJCUpvaW5QYXJtRmlsbChwQWQsICZKb2luUmVxLCBCc3NJZHgpOwotCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfSk9JTl9SRVEsIHNpemVvZihNTE1FX0pPSU5fUkVRX1NUUlVDVCksCi0JCQkJCSZKb2luUmVxKTsKKwkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0pPSU5fUkVRLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9qb2luX3JlcSksICZKb2luUmVxKTsKIAkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9KT0lOOwotCX0KLQllbHNlIGlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBbGwgQlNTIGZhaWw7IHN0YXJ0IGEgbmV3IEFESE9DIChTc2lkPSVzKS4uLlxuIixwQWQtPk1sbWVBdXguU3NpZCkpOwotCQlTdGFydFBhcm1GaWxsKHBBZCwgJlN0YXJ0UmVxLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOwotCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU1RBUlRfUkVRLCBzaXplb2YoTUxNRV9TVEFSVF9SRVFfU1RSVUNUKSwgJlN0YXJ0UmVxKTsKKwl9IGVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQ05UTCAtIEFsbCBCU1MgZmFpbDsgc3RhcnQgYSBuZXcgQURIT0MgKFNzaWQ9JXMpLi4uXG4iLAorCQkJICBwQWQtPk1sbWVBdXguU3NpZCkpOworCQlTdGFydFBhcm1GaWxsKHBBZCwgJlN0YXJ0UmVxLCAoY2hhciAqKXBBZC0+TWxtZUF1eC5Tc2lkLAorCQkJICAgICAgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU1RBUlRfUkVRLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9zdGFydF9yZXEpLCAmU3RhcnRSZXEpOwogCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX1NUQVJUOwotCX0KLQllbHNlIC8vIG5vIG1vcmUgQlNTCisJfSBlbHNlCQkJLyogbm8gbW9yZSBCU1MgKi8KIAl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBbGwgcm9hbWluZyBmYWlsZWQsIHN0YXkgQCBjaCAjJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKLQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCisJCXsKKwkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJDTlRMIC0gQWxsIHJvYW1pbmcgZmFpbGVkLCByZXN0b3JlIHRvIGNoYW5uZWwgJWQsIFRvdGFsIEJTU1slMDJkXVxuIiwKKwkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+U2NhblRhYi5Cc3NOcikpOworCQl9CisKIAkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKIAl9CiB9CiAKLS8vIGZvciByZS1hc3NvY2lhdGlvbiBvbmx5Ci0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVZPSUQgSXRlcmF0ZU9uQnNzVGFiMigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKKy8qIGZvciByZS1hc3NvY2lhdGlvbiBvbmx5ICovCisvKiBJUlFMID0gRElTUEFUQ0hfTEVWRUwgKi8KK3ZvaWQgSXRlcmF0ZU9uQnNzVGFiMihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JTUxNRV9SRUFTU09DX1JFUV9TVFJVQ1QgUmVhc3NvY1JlcTsKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBCc3NJZHg7Ci0JQlNTX0VOVFJZICAgICAgICAgICAgICAgKnBCc3M7CisJc3RydWN0IHJ0X21sbWVfYXNzb2NfcmVxIFJlYXNzb2NSZXE7CisJdW5zaWduZWQgbG9uZyBCc3NJZHg7CisJc3RydWN0IHJ0X2Jzc19lbnRyeSAqcEJzczsKIAogCUJzc0lkeCA9IHBBZC0+TWxtZUF1eC5Sb2FtSWR4OwogCXBCc3MgPSAmcEFkLT5NbG1lQXV4LlJvYW1UYWIuQnNzRW50cnlbQnNzSWR4XTsKIAotCWlmIChCc3NJZHggPCBwQWQtPk1sbWVBdXguUm9hbVRhYi5Cc3NOcikKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBpdGVyYXRlIEJTUyAlbGQgb2YgJWRcbiIsIEJzc0lkeCwgcEFkLT5NbG1lQXV4LlJvYW1UYWIuQnNzTnIpKTsKKwlpZiAoQnNzSWR4IDwgcEFkLT5NbG1lQXV4LlJvYW1UYWIuQnNzTnIpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJDTlRMIC0gaXRlcmF0ZSBCU1MgJWxkIG9mICVkXG4iLCBCc3NJZHgsCisJCQkgIHBBZC0+TWxtZUF1eC5Sb2FtVGFiLkJzc05yKSk7CiAKIAkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQnNzLT5DaGFubmVsLCBGQUxTRSk7CiAJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBCc3MtPkNoYW5uZWwpOwogCi0JCS8vIHJlYXNzb2NpYXRlIG1lc3NhZ2UgaGFzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBhc3NvY2lhdGUgbWVzc2FnZQotCQlBc3NvY1Bhcm1GaWxsKHBBZCwgJlJlYXNzb2NSZXEsIHBCc3MtPkJzc2lkLCBwQnNzLT5DYXBhYmlsaXR5SW5mbywKLQkJCQkJICBBU1NPQ19USU1FT1VULCBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQpOworCQkvKiByZWFzc29jaWF0ZSBtZXNzYWdlIGhhcyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgYXNzb2NpYXRlIG1lc3NhZ2UgKi8KKwkJQXNzb2NQYXJtRmlsbChwQWQsICZSZWFzc29jUmVxLCBwQnNzLT5Cc3NpZCwKKwkJCSAgICAgIHBCc3MtPkNhcGFiaWxpdHlJbmZvLCBBU1NPQ19USU1FT1VULAorCQkJICAgICAgcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50KTsKIAkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwKLQkJCQkJc2l6ZW9mKE1MTUVfUkVBU1NPQ19SRVFfU1RSVUNUKSwgJlJlYXNzb2NSZXEpOworCQkJICAgIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9hc3NvY19yZXEpLCAmUmVhc3NvY1JlcSk7CiAKIAkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9SRUFTU09DOwotCX0KLQllbHNlIC8vIG5vIG1vcmUgQlNTCisJfSBlbHNlCQkJLyogbm8gbW9yZSBCU1MgKi8KIAl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBbGwgZmFzdCByb2FtaW5nIGZhaWxlZCwgYmFjayB0byBjaCAjJWRcbiIscEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOwotCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKLQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisKKwkJeworCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkNOVEwgLSBBbGwgcm9hbWluZyBmYWlsZWQsIHJlc3RvcmUgdG8gY2hhbm5lbCAlZCwgVG90YWwgQlNTWyUwMmRdXG4iLAorCQkJCSAgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5TY2FuVGFiLkJzc05yKSk7CisJCX0KKwogCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwogCX0KIH0KQEAgLTIyMzMsMTAgKzIyNzYsOCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIEpvaW5QYXJtRmlsbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBPVVQgTUxNRV9KT0lOX1JFUV9TVFJVQ1QgKkpvaW5SZXEsCi0JSU4gVUxPTkcgQnNzSWR4KQordm9pZCBKb2luUGFybUZpbGwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgIHN0cnVjdCBydF9tbG1lX2pvaW5fcmVxICpKb2luUmVxLCB1bnNpZ25lZCBsb25nIEJzc0lkeCkKIHsKIAlKb2luUmVxLT5Cc3NJZHggPSBCc3NJZHg7CiB9CkBAIC0yMjQ5LDE1ICsyMjkwLDEyIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgU2NhblBhcm1GaWxsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE9VVCBNTE1FX1NDQU5fUkVRX1NUUlVDVCAqU2NhblJlcSwKLQlJTiBDSEFSIFNzaWRbXSwKLQlJTiBVQ0hBUiBTc2lkTGVuLAotCUlOIFVDSEFSIEJzc1R5cGUsCi0JSU4gVUNIQVIgU2NhblR5cGUpCit2b2lkIFNjYW5QYXJtRmlsbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgc3RydWN0IHJ0X21sbWVfc2Nhbl9yZXEgKlNjYW5SZXEsCisJCSAgY2hhciBTc2lkW10sCisJCSAgdTggU3NpZExlbiwgdTggQnNzVHlwZSwgdTggU2NhblR5cGUpCiB7Ci0gICAgTmRpc1plcm9NZW1vcnkoU2NhblJlcS0+U3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKwlOZGlzWmVyb01lbW9yeShTY2FuUmVxLT5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOwogCVNjYW5SZXEtPlNzaWRMZW4gPSBTc2lkTGVuOwogCU5kaXNNb3ZlTWVtb3J5KFNjYW5SZXEtPlNzaWQsIFNzaWQsIFNzaWRMZW4pOwogCVNjYW5SZXEtPkJzc1R5cGUgPSBCc3NUeXBlOwpAQCAtMjI3MiwxMSArMjMxMCw5IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgU3RhcnRQYXJtRmlsbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBPVVQgTUxNRV9TVEFSVF9SRVFfU1RSVUNUICpTdGFydFJlcSwKLQlJTiBDSEFSIFNzaWRbXSwKLQlJTiBVQ0hBUiBTc2lkTGVuKQordm9pZCBTdGFydFBhcm1GaWxsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgc3RydWN0IHJ0X21sbWVfc3RhcnRfcmVxICpTdGFydFJlcSwKKwkJICAgY2hhciBTc2lkW10sIHU4IFNzaWRMZW4pCiB7CiAJQVNTRVJUKFNzaWRMZW4gPD0gTUFYX0xFTl9PRl9TU0lEKTsKIAlOZGlzTW92ZU1lbW9yeShTdGFydFJlcS0+U3NpZCwgU3NpZCwgU3NpZExlbik7CkBAIC0yMjkxLDExICsyMzI3LDkgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBBdXRoUGFybUZpbGwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gT1VUIE1MTUVfQVVUSF9SRVFfU1RSVUNUICpBdXRoUmVxLAotCUlOIFBVQ0hBUiBwQWRkciwKLQlJTiBVU0hPUlQgQWxnKQordm9pZCBBdXRoUGFybUZpbGwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgIHN0cnVjdCBydF9tbG1lX2F1dGhfcmVxICpBdXRoUmVxLAorCQkgIHU4ICpwQWRkciwgdTE2IEFsZykKIHsKIAlDT1BZX01BQ19BRERSKEF1dGhSZXEtPkFkZHIsIHBBZGRyKTsKIAlBdXRoUmVxLT5BbGcgPSBBbGc7CkBAIC0yMzEwLDgyICsyMzQ0LDEwOSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotCi0KLSNpZmRlZiBSVDI4NzAKLQotVk9JRCBNbG1lQ250bENvbmZpcm0oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUxPTkcgTXNnVHlwZSwKLQlJTiBVU0hPUlQgTXNnKQorI2lmZGVmIFJUTVBfTUFDX1BDSQordm9pZCBDb21wb3NlUHNQb2xsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNc2dUeXBlLCBzaXplb2YoVVNIT1JUKSwgJk1zZyk7Ci19Ci0jZW5kaWYKLQotVk9JRCBDb21wb3NlUHNQb2xsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotI2lmZGVmIFJUMjg3MAotCVBUWElORk9fU1RSVUMJCXBUeEluZm87Ci0JUFRYV0lfU1RSVUMJCXBUeFdJOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ29tcG9zZVBzUG9sbFxuIikpOwotI2VuZGlmCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+UHNQb2xsRnJhbWUsIHNpemVvZihQU1BPTExfRlJBTUUpKTsKLQotI2lmZGVmIFJUMjg3MAotCXBBZC0+UHNQb2xsRnJhbWUuRkMuUHdyTWdtdCA9IDA7Ci0jZW5kaWYKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5Qc1BvbGxGcmFtZSwgc2l6ZW9mKHN0cnVjdCBydF9wc3BvbGxfZnJhbWUpKTsKIAlwQWQtPlBzUG9sbEZyYW1lLkZDLlR5cGUgPSBCVFlQRV9DTlRMOwogCXBBZC0+UHNQb2xsRnJhbWUuRkMuU3ViVHlwZSA9IFNVQlRZUEVfUFNfUE9MTDsKIAlwQWQtPlBzUG9sbEZyYW1lLkFpZCA9IHBBZC0+U3RhQWN0aXZlLkFpZCB8IDB4QzAwMDsKIAlDT1BZX01BQ19BRERSKHBBZC0+UHNQb2xsRnJhbWUuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKIAlDT1BZX01BQ19BRERSKHBBZC0+UHNQb2xsRnJhbWUuVGEsIHBBZC0+Q3VycmVudEFkZHJlc3MpOwotCi0jaWZkZWYgUlQyODcwCi0JUlRNUFplcm9NZW1vcnkoJnBBZC0+UHNQb2xsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbMF0sIDEwMCk7Ci0JcFR4SW5mbyA9IChQVFhJTkZPX1NUUlVDKSZwQWQtPlBzUG9sbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0WzBdOwotCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sIChVU0hPUlQpKHNpemVvZihQU1BPTExfRlJBTUUpK1RYV0lfU0laRSksIFRSVUUsIEVwVG9RdWV1ZVtNR01UUElQRUlEWF0sIEZBTFNFLCAgRkFMU0UpOwotCXBUeFdJID0gKFBUWFdJX1NUUlVDKSZwQWQtPlBzUG9sbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W1RYSU5GT19TSVpFXTsKLQlSVE1QV3JpdGVUeFdJKHBBZCwgcFR4V0ksIEZBTFNFLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBUUlVFLCBGQUxTRSwgMCwgQlNTSURfV0NJRCwgKHNpemVvZihQU1BPTExfRlJBTUUpKSwKLQkJMCwgIDAsIChVQ0hBUilwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTLCBJRlNfQkFDS09GRiwgRkFMU0UsICZwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQpOwotCVJUTVBNb3ZlTWVtb3J5KCZwQWQtPlBzUG9sbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W1RYV0lfU0laRStUWElORk9fU0laRV0sICZwQWQtPlBzUG9sbEZyYW1lLCBzaXplb2YoUFNQT0xMX0ZSQU1FKSk7Ci0JLy8gQXBwZW5kIDQgZXh0cmEgemVybyBieXRlcy4KLQlwQWQtPlBzUG9sbENvbnRleHQuQnVsa091dFNpemUgPSAgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBzaXplb2YoUFNQT0xMX0ZSQU1FKSArIDQ7Ci0jZW5kaWYKIH0KIAotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIENvbXBvc2VOdWxsRnJhbWUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCisvKiBJUlFMID0gRElTUEFUQ0hfTEVWRUwgKi8KK3ZvaWQgQ29tcG9zZU51bGxGcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0jaWZkZWYgUlQyODcwCi0JUFRYSU5GT19TVFJVQwkJcFR4SW5mbzsKLQlQVFhXSV9TVFJVQwkJcFR4V0k7Ci0jZW5kaWYKLQotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk51bGxGcmFtZSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5OdWxsRnJhbWUsIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSkpOwogCXBBZC0+TnVsbEZyYW1lLkZDLlR5cGUgPSBCVFlQRV9EQVRBOwogCXBBZC0+TnVsbEZyYW1lLkZDLlN1YlR5cGUgPSBTVUJUWVBFX05VTExfRlVOQzsKIAlwQWQtPk51bGxGcmFtZS5GQy5Ub0RzID0gMTsKIAlDT1BZX01BQ19BRERSKHBBZC0+TnVsbEZyYW1lLkFkZHIxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CiAJQ09QWV9NQUNfQUREUihwQWQtPk51bGxGcmFtZS5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CiAJQ09QWV9NQUNfQUREUihwQWQtPk51bGxGcmFtZS5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotI2lmZGVmIFJUMjg3MAotCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk51bGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFswXSwgMTAwKTsKLQlwVHhJbmZvID0gKFBUWElORk9fU1RSVUMpJnBBZC0+TnVsbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0WzBdOwotCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sIChVU0hPUlQpKHNpemVvZihIRUFERVJfODAyXzExKStUWFdJX1NJWkUpLCBUUlVFLCBFcFRvUXVldWVbTUdNVFBJUEVJRFhdLCBGQUxTRSwgIEZBTFNFKTsKLQlwVHhXSSA9IChQVFhXSV9TVFJVQykmcEFkLT5OdWxsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbVFhJTkZPX1NJWkVdOwotCVJUTVBXcml0ZVR4V0kocEFkLCBwVHhXSSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIFRSVUUsIEZBTFNFLCAwLCBCU1NJRF9XQ0lELCAoc2l6ZW9mKEhFQURFUl84MDJfMTEpKSwKLQkJMCwgMCwgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MsIElGU19CQUNLT0ZGLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7Ci0JUlRNUE1vdmVNZW1vcnkoJnBBZC0+TnVsbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W1RYV0lfU0laRStUWElORk9fU0laRV0sICZwQWQtPk51bGxGcmFtZSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLQlwQWQtPk51bGxDb250ZXh0LkJ1bGtPdXRTaXplID0gIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgc2l6ZW9mKHBBZC0+TnVsbEZyYW1lKSArIDQ7Ci0jZW5kaWYKK30KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKyNpZmRlZiBSVE1QX01BQ19VU0IKK3ZvaWQgTWxtZUNudGxDb25maXJtKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdW5zaWduZWQgbG9uZyBNc2dUeXBlLCB1MTYgTXNnKQoreworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1zZ1R5cGUsIHNpemVvZih1MTYpLAorCQkgICAgJk1zZyk7CiB9CiAKK3ZvaWQgQ29tcG9zZVBzUG9sbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJc3RydWN0IHJ0X3R4aW5mbyAqcFR4SW5mbzsKKwlzdHJ1Y3QgcnRfdHh3aSAqIHBUeFdJOwogCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ29tcG9zZVBzUG9sbFxuIikpOworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlBzUG9sbEZyYW1lLCBzaXplb2Yoc3RydWN0IHJ0X3BzcG9sbF9mcmFtZSkpOwogCisJcEFkLT5Qc1BvbGxGcmFtZS5GQy5Qd3JNZ210ID0gMDsKKwlwQWQtPlBzUG9sbEZyYW1lLkZDLlR5cGUgPSBCVFlQRV9DTlRMOworCXBBZC0+UHNQb2xsRnJhbWUuRkMuU3ViVHlwZSA9IFNVQlRZUEVfUFNfUE9MTDsKKwlwQWQtPlBzUG9sbEZyYW1lLkFpZCA9IHBBZC0+U3RhQWN0aXZlLkFpZCB8IDB4QzAwMDsKKwlDT1BZX01BQ19BRERSKHBBZC0+UHNQb2xsRnJhbWUuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwlDT1BZX01BQ19BRERSKHBBZC0+UHNQb2xsRnJhbWUuVGEsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworCisJUlRNUFplcm9NZW1vcnkoJnBBZC0+UHNQb2xsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuCisJCSAgICAgICBXaXJlbGVzc1BhY2tldFswXSwgMTAwKTsKKwlwVHhJbmZvID0KKwkgICAgKHN0cnVjdCBydF90eGluZm8gKikmIHBBZC0+UHNQb2xsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuCisJICAgIFdpcmVsZXNzUGFja2V0WzBdOworCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sCisJCQkodTE2KShzaXplb2Yoc3RydWN0IHJ0X3BzcG9sbF9mcmFtZSkgKyBUWFdJX1NJWkUpLCBUUlVFLAorCQkJRXBUb1F1ZXVlW01HTVRQSVBFSURYXSwgRkFMU0UsIEZBTFNFKTsKKwlwVHhXSSA9CisJICAgIChzdHJ1Y3QgcnRfdHh3aSAqKSAmIHBBZC0+UHNQb2xsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuCisJICAgIFdpcmVsZXNzUGFja2V0W1RYSU5GT19TSVpFXTsKKwlSVE1QV3JpdGVUeFdJKHBBZCwgcFR4V0ksIEZBTFNFLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBUUlVFLCBGQUxTRSwgMCwKKwkJICAgICAgQlNTSURfV0NJRCwgKHNpemVvZihzdHJ1Y3QgcnRfcHNwb2xsX2ZyYW1lKSksIDAsIDAsCisJCSAgICAgICh1OClwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTLAorCQkgICAgICBJRlNfQkFDS09GRiwgRkFMU0UsICZwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQpOworCVJUTVBNb3ZlTWVtb3J5KCZwQWQtPlBzUG9sbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLgorCQkgICAgICAgV2lyZWxlc3NQYWNrZXRbVFhXSV9TSVpFICsgVFhJTkZPX1NJWkVdLAorCQkgICAgICAgJnBBZC0+UHNQb2xsRnJhbWUsIHNpemVvZihzdHJ1Y3QgcnRfcHNwb2xsX2ZyYW1lKSk7CisJLyogQXBwZW5kIDQgZXh0cmEgemVybyBieXRlcy4gKi8KKwlwQWQtPlBzUG9sbENvbnRleHQuQnVsa091dFNpemUgPQorCSAgICBUWElORk9fU0laRSArIFRYV0lfU0laRSArIHNpemVvZihzdHJ1Y3QgcnRfcHNwb2xsX2ZyYW1lKSArIDQ7Cit9CisKKy8qIElSUUwgPSBESVNQQVRDSF9MRVZFTCAqLwordm9pZCBDb21wb3NlTnVsbEZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlzdHJ1Y3QgcnRfdHhpbmZvICpwVHhJbmZvOworCXN0cnVjdCBydF90eHdpICogcFR4V0k7CisKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5OdWxsRnJhbWUsIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSkpOworCXBBZC0+TnVsbEZyYW1lLkZDLlR5cGUgPSBCVFlQRV9EQVRBOworCXBBZC0+TnVsbEZyYW1lLkZDLlN1YlR5cGUgPSBTVUJUWVBFX05VTExfRlVOQzsKKwlwQWQtPk51bGxGcmFtZS5GQy5Ub0RzID0gMTsKKwlDT1BZX01BQ19BRERSKHBBZC0+TnVsbEZyYW1lLkFkZHIxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJQ09QWV9NQUNfQUREUihwQWQtPk51bGxGcmFtZS5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJQ09QWV9NQUNfQUREUihwQWQtPk51bGxGcmFtZS5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk51bGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC4KKwkJICAgICAgIFdpcmVsZXNzUGFja2V0WzBdLCAxMDApOworCXBUeEluZm8gPQorCSAgICAoc3RydWN0IHJ0X3R4aW5mbyAqKSYgcEFkLT5OdWxsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuCisJICAgIFdpcmVsZXNzUGFja2V0WzBdOworCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sCisJCQkodTE2KShzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpICsgVFhXSV9TSVpFKSwgVFJVRSwKKwkJCUVwVG9RdWV1ZVtNR01UUElQRUlEWF0sIEZBTFNFLCBGQUxTRSk7CisJcFR4V0kgPQorCSAgICAoc3RydWN0IHJ0X3R4d2kgKikgJiBwQWQtPk51bGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC4KKwkgICAgV2lyZWxlc3NQYWNrZXRbVFhJTkZPX1NJWkVdOworCVJUTVBXcml0ZVR4V0kocEFkLCBwVHhXSSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIFRSVUUsIEZBTFNFLCAwLAorCQkgICAgICBCU1NJRF9XQ0lELCAoc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSksIDAsIDAsCisJCSAgICAgICh1OClwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTLAorCQkgICAgICBJRlNfQkFDS09GRiwgRkFMU0UsICZwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQpOworCVJUTVBNb3ZlTWVtb3J5KCZwQWQtPk51bGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC4KKwkJICAgICAgIFdpcmVsZXNzUGFja2V0W1RYV0lfU0laRSArIFRYSU5GT19TSVpFXSwgJnBBZC0+TnVsbEZyYW1lLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSk7CisJcEFkLT5OdWxsQ29udGV4dC5CdWxrT3V0U2l6ZSA9CisJICAgIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgc2l6ZW9mKHBBZC0+TnVsbEZyYW1lKSArIDQ7Cit9CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTIzOTcsNzMgKzI0NTgsNzEgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVUxPTkcgTWFrZUlic3NCZWFjb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCit1bnNpZ25lZCBsb25nIE1ha2VJYnNzQmVhY29uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlVQ0hBUiAgICAgICAgIERzTGVuID0gMSwgSWJzc0xlbiA9IDI7Ci0JVUNIQVIgICAgICAgICBMb2NhbEVycEllWzNdID0ge0lFX0VSUCwgMSwgMHgwNH07Ci0JSEVBREVSXzgwMl8xMSBCY25IZHI7Ci0JVVNIT1JUICAgICAgICBDYXBhYmlsaXR5SW5mbzsKKwl1OCBEc0xlbiA9IDEsIElic3NMZW4gPSAyOworCXU4IExvY2FsRXJwSWVbM10gPSB7IElFX0VSUCwgMSwgMHgwNCB9OworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIEJjbkhkcjsKKwl1MTYgQ2FwYWJpbGl0eUluZm87CiAJTEFSR0VfSU5URUdFUiBGYWtlVGltZXN0YW1wOwotCVVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOwotCVBUWFdJX1NUUlVDCSAgcFR4V0kgPSAmcEFkLT5CZWFjb25UeFdJOwotCUNIQVIgICAgICAgICAqcEJlYWNvbkZyYW1lID0gcEFkLT5CZWFjb25CdWY7Ci0JQk9PTEVBTiAgICAgICBQcml2YWN5OwotCVVDSEFSICAgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ci0JVUNIQVIgICAgICAgICBTdXBSYXRlTGVuID0gMDsKLQlVQ0hBUiAgICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwotCVVDSEFSICAgICAgICAgRXh0UmF0ZUxlbiA9IDA7Ci0JVUNIQVIgICAgICAgICBSU05JZSA9IElFX1dQQTsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuID0gMDsKKwlzdHJ1Y3QgcnRfdHh3aSAqIHBUeFdJID0gJnBBZC0+QmVhY29uVHhXSTsKKwl1OCAqcEJlYWNvbkZyYW1lID0gcEFkLT5CZWFjb25CdWY7CisJQk9PTEVBTiBQcml2YWN5OworCXU4IFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCXU4IFN1cFJhdGVMZW4gPSAwOworCXU4IEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCXU4IEV4dFJhdGVMZW4gPSAwOworCXU4IFJTTkllID0gSUVfV1BBOwogCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpICYmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KSkKLQl7Ci0JCVN1cFJhdGVbMF0gPSAweDgyOyAvLyAxIG1icHMKLQkJU3VwUmF0ZVsxXSA9IDB4ODQ7IC8vIDIgbWJwcwotCQlTdXBSYXRlWzJdID0gMHg4YjsgLy8gNS41IG1icHMKLQkJU3VwUmF0ZVszXSA9IDB4OTY7IC8vIDExIG1icHMKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKKwkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpKSB7CisJCVN1cFJhdGVbMF0gPSAweDgyOwkvKiAxIG1icHMgKi8KKwkJU3VwUmF0ZVsxXSA9IDB4ODQ7CS8qIDIgbWJwcyAqLworCQlTdXBSYXRlWzJdID0gMHg4YjsJLyogNS41IG1icHMgKi8KKwkJU3VwUmF0ZVszXSA9IDB4OTY7CS8qIDExIG1icHMgKi8KIAkJU3VwUmF0ZUxlbiA9IDQ7CiAJCUV4dFJhdGVMZW4gPSAwOwotCX0KLQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCi0JewotCQlTdXBSYXRlWzBdICA9IDB4OEM7ICAgIC8vIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJU3VwUmF0ZVsxXSAgPSAweDEyOyAgICAvLyA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCVN1cFJhdGVbMl0gID0gMHg5ODsgICAgLy8gMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJU3VwUmF0ZVszXSAgPSAweDI0OyAgICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQlTdXBSYXRlWzRdICA9IDB4YjA7ICAgIC8vIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCVN1cFJhdGVbNV0gID0gMHg0ODsgICAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJU3VwUmF0ZVs2XSAgPSAweDYwOyAgICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQlTdXBSYXRlWzddICA9IDB4NmM7ICAgIC8vIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCVN1cFJhdGVMZW4gID0gODsKLQkJRXh0UmF0ZUxlbiAgPSAwOworCX0gZWxzZSBpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KSB7CisJCVN1cFJhdGVbMF0gPSAweDhDOwkvKiA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlICovCisJCVN1cFJhdGVbMV0gPSAweDEyOwkvKiA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCVN1cFJhdGVbMl0gPSAweDk4OwkvKiAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZSAqLworCQlTdXBSYXRlWzNdID0gMHgyNDsJLyogMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJU3VwUmF0ZVs0XSA9IDB4YjA7CS8qIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlICovCisJCVN1cFJhdGVbNV0gPSAweDQ4OwkvKiAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlTdXBSYXRlWzZdID0gMHg2MDsJLyogNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJU3VwUmF0ZVs3XSA9IDB4NmM7CS8qIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCVN1cFJhdGVMZW4gPSA4OworCQlFeHRSYXRlTGVuID0gMDsKIAotCQkvLwotCQkvLyBBbHNvIFVwZGF0ZSBNbG1lUmF0ZSAmIFJ0c1JhdGUgZm9yIEcgb25seSAmIEEgb25seQotCQkvLworCQkvKiAqLworCQkvKiBBbHNvIFVwZGF0ZSBNbG1lUmF0ZSAmIFJ0c1JhdGUgZm9yIEcgb25seSAmIEEgb25seSAqLworCQkvKiAqLwogCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfNjsKIAkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfNjsKIAkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTUzBNY2FzdF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOwotCX0KLQllbHNlCi0JewotCQlTdXBSYXRlWzBdID0gMHg4MjsgLy8gMSBtYnBzCi0JCVN1cFJhdGVbMV0gPSAweDg0OyAvLyAyIG1icHMKLQkJU3VwUmF0ZVsyXSA9IDB4OGI7IC8vIDUuNSBtYnBzCi0JCVN1cFJhdGVbM10gPSAweDk2OyAvLyAxMSBtYnBzCisJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPQorCQkgICAgT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTUzBNY2FzdF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA9CisJCSAgICBNT0RFX09GRE07CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPQorCQkgICAgT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOworCX0gZWxzZSB7CisJCVN1cFJhdGVbMF0gPSAweDgyOwkvKiAxIG1icHMgKi8KKwkJU3VwUmF0ZVsxXSA9IDB4ODQ7CS8qIDIgbWJwcyAqLworCQlTdXBSYXRlWzJdID0gMHg4YjsJLyogNS41IG1icHMgKi8KKwkJU3VwUmF0ZVszXSA9IDB4OTY7CS8qIDExIG1icHMgKi8KIAkJU3VwUmF0ZUxlbiA9IDQ7CiAKLQkJRXh0UmF0ZVswXSAgPSAweDBDOyAgICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLAotCQlFeHRSYXRlWzFdICA9IDB4MTI7ICAgIC8vIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJRXh0UmF0ZVsyXSAgPSAweDE4OyAgICAvLyAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywKLQkJRXh0UmF0ZVszXSAgPSAweDI0OyAgICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQlFeHRSYXRlWzRdICA9IDB4MzA7ICAgIC8vIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLAotCQlFeHRSYXRlWzVdICA9IDB4NDg7ICAgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCUV4dFJhdGVbNl0gID0gMHg2MDsgICAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJRXh0UmF0ZVs3XSAgPSAweDZjOyAgICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQlFeHRSYXRlTGVuICA9IDg7CisJCUV4dFJhdGVbMF0gPSAweDBDOwkvKiA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCAqLworCQlFeHRSYXRlWzFdID0gMHgxMjsJLyogOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlFeHRSYXRlWzJdID0gMHgxODsJLyogMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsICovCisJCUV4dFJhdGVbM10gPSAweDI0OwkvKiAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlFeHRSYXRlWzRdID0gMHgzMDsJLyogMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsICovCisJCUV4dFJhdGVbNV0gPSAweDQ4OwkvKiAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlFeHRSYXRlWzZdID0gMHg2MDsJLyogNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJRXh0UmF0ZVs3XSA9IDB4NmM7CS8qIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCUV4dFJhdGVMZW4gPSA4OwogCX0KIAogCXBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gPSBTdXBSYXRlTGVuOwpAQCAtMjQ3MSw5OSArMjUzMCw5NiBAQAogCXBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPSBFeHRSYXRlTGVuOwogCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLkV4dFJhdGUsIEV4dFJhdGUsIEV4dFJhdGVMZW4pOwogCi0JLy8gY29tcG9zZSBJQlNTIGJlYWNvbiBmcmFtZQotCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQmNuSGRyLCBTVUJUWVBFX0JFQUNPTiwgMCwgQlJPQURDQVNUX0FERFIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQlQcml2YWN5ID0gKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSB8fAotCQkJICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHx8Ci0JCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCk7Ci0JQ2FwYWJpbGl0eUluZm8gPSBDQVBfR0VORVJBVEUoMCwgMSwgUHJpdmFjeSwgKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZVNob3J0KSwgMCwgMCk7CisJLyogY29tcG9zZSBJQlNTIGJlYWNvbiBmcmFtZSAqLworCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQmNuSGRyLCBTVUJUWVBFX0JFQUNPTiwgMCwgQlJPQURDQVNUX0FERFIsCisJCQkgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCVByaXZhY3kgPSAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpCisJICAgIHx8IChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkgICAgfHwgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKTsKKwlDYXBhYmlsaXR5SW5mbyA9CisJICAgIENBUF9HRU5FUkFURSgwLCAxLCBQcml2YWN5LAorCQkJIChwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVTaG9ydCksCisJCQkgMCwgMCk7CiAKLQlNYWtlT3V0Z29pbmdGcmFtZShwQmVhY29uRnJhbWUsICAgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICAgICAgICAmQmNuSGRyLAotCQkJCQkgIFRJTUVTVEFNUF9MRU4sICAgICAgICAgICAgICAgICAgICZGYWtlVGltZXN0YW1wLAotCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QsCi0JCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNhcGFiaWxpdHlJbmZvLAotCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkSWUsCi0JCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sCi0JCQkJCSAgcEFkLT5Db21tb25DZmcuU3NpZExlbiwgICAgICAgICAgcEFkLT5Db21tb25DZmcuU3NpZCwKLQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAotCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlTGVuLAotCQkJCQkgIFN1cFJhdGVMZW4sICAgICAgICAgICAgICAgICAgICAgIFN1cFJhdGUsCi0JCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRzSWUsCi0JCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRzTGVuLAotCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5DaGFubmVsLAotCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJYnNzSWUsCi0JCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklic3NMZW4sCi0JCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQWN0aXZlLkF0aW1XaW4sCi0JCQkJCSAgRU5EX09GX0FSR1MpOworCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZSwgJkZyYW1lTGVuLAorCQkJICBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpLCAmQmNuSGRyLAorCQkJICBUSU1FU1RBTVBfTEVOLCAmRmFrZVRpbWVzdGFtcCwKKwkJCSAgMiwgJnBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCwKKwkJCSAgMiwgJkNhcGFiaWxpdHlJbmZvLAorCQkJICAxLCAmU3NpZEllLAorCQkJICAxLCAmcEFkLT5Db21tb25DZmcuU3NpZExlbiwKKwkJCSAgcEFkLT5Db21tb25DZmcuU3NpZExlbiwgcEFkLT5Db21tb25DZmcuU3NpZCwKKwkJCSAgMSwgJlN1cFJhdGVJZSwKKwkJCSAgMSwgJlN1cFJhdGVMZW4sCisJCQkgIFN1cFJhdGVMZW4sIFN1cFJhdGUsCisJCQkgIDEsICZEc0llLAorCQkJICAxLCAmRHNMZW4sCisJCQkgIDEsICZwQWQtPkNvbW1vbkNmZy5DaGFubmVsLAorCQkJICAxLCAmSWJzc0llLAorCQkJICAxLCAmSWJzc0xlbiwgMiwgJnBBZC0+U3RhQWN0aXZlLkF0aW1XaW4sIEVORF9PRl9BUkdTKTsKIAotCS8vIGFkZCBFUlBfSUUgYW5kIEVYVF9SQUUgSUUgb2YgaW4gODAyLjExZwotCWlmIChFeHRSYXRlTGVuKQotCXsKLQkJVUxPTkcJdG1wOworCS8qIGFkZCBFUlBfSUUgYW5kIEVYVF9SQUUgSUUgb2YgaW4gODAyLjExZyAqLworCWlmIChFeHRSYXRlTGVuKSB7CisJCXVuc2lnbmVkIGxvbmcgdG1wOwogCi0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZSArIEZyYW1lTGVuLCAgICAgICAgICZ0bXAsCi0JCQkJCQkgIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsRXJwSWUsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlTGVuLAotCQkJCQkJICBFeHRSYXRlTGVuLCAgICAgICAgICAgICAgICAgICAgICBFeHRSYXRlLAotCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZSArIEZyYW1lTGVuLCAmdG1wLAorCQkJCSAgMywgTG9jYWxFcnBJZSwKKwkJCQkgIDEsICZFeHRSYXRlSWUsCisJCQkJICAxLCAmRXh0UmF0ZUxlbiwKKwkJCQkgIEV4dFJhdGVMZW4sIEV4dFJhdGUsIEVORF9PRl9BUkdTKTsKKwkJRnJhbWVMZW4gKz0gdG1wOworCX0KKwkvKiBJZiBhZGhvYyBzZWNydWl0eSBpcyBzZXQgZm9yIFdQQS1Ob25lLCBhcHBlbmQgdGhlIGNpcGhlciBzdWl0ZSBJRSAqLworCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKSB7CisJCXVuc2lnbmVkIGxvbmcgdG1wOworCQlSVE1QTWFrZVJTTklFKHBBZCwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywKKwkJCSAgICAgIEJTUzApOworCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZSArIEZyYW1lTGVuLCAmdG1wLAorCQkJCSAgMSwgJlJTTkllLAorCQkJCSAgMSwgJnBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwKKwkJCQkgIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwgcEFkLT5TdGFDZmcuUlNOX0lFLAorCQkJCSAgRU5EX09GX0FSR1MpOwogCQlGcmFtZUxlbiArPSB0bXA7CiAJfQogCi0JLy8gSWYgYWRob2Mgc2VjcnVpdHkgaXMgc2V0IGZvciBXUEEtTm9uZSwgYXBwZW5kIHRoZSBjaXBoZXIgc3VpdGUgSUUKLQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKLQl7Ci0JCVVMT05HIHRtcDsKLSAgICAgICAgUlRNUE1ha2VSU05JRShwQWQsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIEJTUzApOworCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkgeworCQl1bnNpZ25lZCBsb25nIFRtcExlbjsKKwkJdTggSHRMZW4sIEh0TGVuMTsKIAotCQlNYWtlT3V0Z29pbmdGcmFtZShwQmVhY29uRnJhbWUgKyBGcmFtZUxlbiwgICAgICAgIAkmdG1wLAotCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkmUlNOSWUsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkmcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAotCQkJCQkJICBwQWQtPlN0YUNmZy5SU05JRV9MZW4sICAgICAgCQlwQWQtPlN0YUNmZy5SU05fSUUsCi0JCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJRnJhbWVMZW4gKz0gdG1wOwotCX0KLQotCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKLQl7Ci0JCVVMT05HIFRtcExlbjsKLQkJVUNIQVIgSHRMZW4sIEh0TGVuMTsKLQotCQkvLyBhZGQgSFQgQ2FwYWJpbGl0eSBJRQorCQkvKiBhZGQgSFQgQ2FwYWJpbGl0eSBJRSAqLwogCQlIdExlbiA9IHNpemVvZihwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkpOwogCQlIdExlbjEgPSBzaXplb2YocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvKTsKIAotCQlNYWtlT3V0Z29pbmdGcmFtZShwQmVhY29uRnJhbWUrRnJhbWVMZW4sCSZUbXBMZW4sCi0JCQkJCQkgIDEsCQkJCQkJJkh0Q2FwSWUsCi0JCQkJCQkgIDEsCQkJCQkJJkh0TGVuLAotCQkJCQkJICBIdExlbiwJCQkJCSZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCi0JCQkJCQkgIDEsCQkJCQkJJkFkZEh0SW5mb0llLAotCQkJCQkJICAxLAkJCQkJCSZIdExlbjEsCi0JCQkJCQkgIEh0TGVuMSwJCQkJCSZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sCi0JCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJTWFrZU91dGdvaW5nRnJhbWUocEJlYWNvbkZyYW1lICsgRnJhbWVMZW4sICZUbXBMZW4sCisJCQkJICAxLCAmSHRDYXBJZSwKKwkJCQkgIDEsICZIdExlbiwKKwkJCQkgIEh0TGVuLCAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LAorCQkJCSAgMSwgJkFkZEh0SW5mb0llLAorCQkJCSAgMSwgJkh0TGVuMSwKKwkJCQkgIEh0TGVuMSwgJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywKKwkJCQkgIEVORF9PRl9BUkdTKTsKIAogCQlGcmFtZUxlbiArPSBUbXBMZW47CiAJfQotCi0JLy9iZWFjb24gdXNlIHJlc2VydmVkIFdDSUQgMHhmZgotICAgIGlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCi0gICAgewotCVJUTVBXcml0ZVR4V0kocEFkLCBwVHhXSSwgRkFMU0UsIEZBTFNFLCAgVFJVRSwgRkFMU0UsIEZBTFNFLCBUUlVFLCAwLCAweGZmLCBGcmFtZUxlbiwKLQkJUElEX01HTVQsIFBJRF9CRUFDT04sIFJBVEVfMSwgSUZTX0hUVFhPUCwgRkFMU0UsICZwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvLyBTZXQgdG8gdXNlIDFNYnBzIGZvciBBZGhvYyBiZWFjb24uCisJLypiZWFjb24gdXNlIHJlc2VydmVkIFdDSUQgMHhmZiAqLworCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpIHsKKwkJUlRNUFdyaXRlVHhXSShwQWQsIHBUeFdJLCBGQUxTRSwgRkFMU0UsIFRSVUUsIEZBTFNFLCBGQUxTRSwKKwkJCSAgICAgIFRSVUUsIDAsIDB4ZmYsIEZyYW1lTGVuLCBQSURfTUdNVCwgUElEX0JFQUNPTiwKKwkJCSAgICAgIFJBVEVfMSwgSUZTX0hUVFhPUCwgRkFMU0UsCisJCQkgICAgICAmcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0KTsKKwl9IGVsc2UgeworCQkvKiBTZXQgdG8gdXNlIDFNYnBzIGZvciBBZGhvYyBiZWFjb24uICovCiAJCUhUVFJBTlNNSVRfU0VUVElORyBUcmFuc21pdDsKLSAgICAgICAgVHJhbnNtaXQud29yZCA9IDA7Ci0gICAgICAgIFJUTVBXcml0ZVR4V0kocEFkLCBwVHhXSSwgRkFMU0UsIEZBTFNFLCAgVFJVRSwgRkFMU0UsIEZBTFNFLCBUUlVFLCAwLCAweGZmLCBGcmFtZUxlbiwKLSAgICAJCVBJRF9NR01ULCBQSURfQkVBQ09OLCBSQVRFXzEsIElGU19IVFRYT1AsIEZBTFNFLCAmVHJhbnNtaXQpOwotICAgIH0KKwkJVHJhbnNtaXQud29yZCA9IDA7CisJCVJUTVBXcml0ZVR4V0kocEFkLCBwVHhXSSwgRkFMU0UsIEZBTFNFLCBUUlVFLCBGQUxTRSwgRkFMU0UsCisJCQkgICAgICBUUlVFLCAwLCAweGZmLCBGcmFtZUxlbiwgUElEX01HTVQsIFBJRF9CRUFDT04sCisJCQkgICAgICBSQVRFXzEsIElGU19IVFRYT1AsIEZBTFNFLCAmVHJhbnNtaXQpOworCX0KIAotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1ha2VJYnNzQmVhY29uIChsZW49JWxkKSwgU3VwUmF0ZUxlbj0lZCwgRXh0UmF0ZUxlbj0lZCwgQ2hhbm5lbD0lZCwgUGh5TW9kZT0lZFxuIiwKLQkJCQkJRnJhbWVMZW4sIFN1cFJhdGVMZW4sIEV4dFJhdGVMZW4sIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiTWFrZUlic3NCZWFjb24gKGxlbj0lbGQpLCBTdXBSYXRlTGVuPSVkLCBFeHRSYXRlTGVuPSVkLCBDaGFubmVsPSVkLCBQaHlNb2RlPSVkXG4iLAorCQkgIEZyYW1lTGVuLCBTdXBSYXRlTGVuLCBFeHRSYXRlTGVuLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLAorCQkgIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpKTsKIAlyZXR1cm4gRnJhbWVMZW47CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvcnRtcF9kYXRhLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9ydG1wX2RhdGEuYwppbmRleCBmNzUxYWI2Li41ZDM0OGU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9ydG1wX2RhdGEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9ydG1wX2RhdGEuYwpAQCAtMzMsMTExICszMywxNjcgQEAKIAlSZXZpc2lvbiBIaXN0b3J5OgogCVdobyAJCVdoZW4JCQlXaGF0CiAJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUpvaG4JCSAgICAgIEF1Zy8xNy8wNAkJbWFqb3IgbW9kaWZpY2F0aW9uIGZvciBSVDI1NjEvMjY2MQotCUphbiBMZWUJICAgICAgTWFyLzE3LzA2CQltYWpvciBtb2RpZmljYXRpb24gZm9yIFJUMjg2MCBOZXcgUmluZyBEZXNpZ24KICovCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCiAKLQotCi1WT0lEIFNUQVJ4RUFQT0xGcmFtZUluZGljYXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3ZvaWQgU1RBUnhFQVBPTEZyYW1lSW5kaWNhdGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksCisJCQkgICAgIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaywgdTggRnJvbVdoaWNoQlNTSUQpCiB7Ci0JUFJUMjhYWF9SWERfU1RSVUMJcFJ4RCA9ICYocFJ4QmxrLT5SeEQpOwotCVBSWFdJX1NUUlVDCQlwUnhXSSA9IHBSeEJsay0+cFJ4V0k7Ci0JVUNIQVIJCQkqcFRtcEJ1ZjsKKwlQUlQyOFhYX1JYRF9TVFJVQyBwUnhEID0gJihwUnhCbGstPlJ4RCk7CisJc3RydWN0IHJ0X3J4d2kgKiBwUnhXSSA9IHBSeEJsay0+cFJ4V0k7CisJdTggKnBUbXBCdWY7CiAKLQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKQotCXsKLQkJLy8gQWxsIEVBUG9MIGZyYW1lcyBoYXZlIHRvIHBhc3MgdG8gdXBwZXIgbGF5ZXIgKGV4LiBXUEFfU1VQUExJQ0FOVCBkYWVtb24pCi0JCS8vIFRCRCA6IHByb2Nlc3MgZnJhZ21lbnRlZCBFQVBvbCBmcmFtZXMKKwlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSB7CisJCS8qIEFsbCBFQVBvTCBmcmFtZXMgaGF2ZSB0byBwYXNzIHRvIHVwcGVyIGxheWVyIChleC4gV1BBX1NVUFBMSUNBTlQgZGFlbW9uKSAqLworCQkvKiBUQkQgOiBwcm9jZXNzIGZyYWdtZW50ZWQgRUFQb2wgZnJhbWVzICovCiAJCXsKLQkJCS8vIEluIDgwMi4xeCBtb2RlLCBpZiB0aGUgcmVjZWl2ZWQgZnJhbWUgaXMgRUFQLVNVQ0NFU1MgcGFja2V0LCB0dXJuIG9uIHRoZSBQb3J0U2VjdXJlZCB2YXJpYWJsZQotCQkJaWYgKCBwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gVFJVRSAmJgotCQkJCSAoRUFQX0NPREVfU1VDQ0VTUyA9PSBXcGFDaGVja0VhcENvZGUocEFkLCBwUnhCbGstPnBEYXRhLCBwUnhCbGstPkRhdGFTaXplLCBMRU5HVEhfODAyXzFfSCkpKQotCQkJewotCQkJCVBVQ0hBUglLZXk7Ci0JCQkJVUNIQVIgCUNpcGhlckFsZzsKLQkJCQlpbnQgICAgIGlkeCA9IDA7CisJCQkvKiBJbiA4MDIuMXggbW9kZSwgaWYgdGhlIHJlY2VpdmVkIGZyYW1lIGlzIEVBUC1TVUNDRVNTIHBhY2tldCwgdHVybiBvbiB0aGUgUG9ydFNlY3VyZWQgdmFyaWFibGUgKi8KKwkJCWlmIChwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gVFJVRSAmJgorCQkJICAgIChFQVBfQ09ERV9TVUNDRVNTID09CisJCQkgICAgIFdwYUNoZWNrRWFwQ29kZShwQWQsIHBSeEJsay0+cERhdGEsCisJCQkJCSAgICAgcFJ4QmxrLT5EYXRhU2l6ZSwKKwkJCQkJICAgICBMRU5HVEhfODAyXzFfSCkpKSB7CisJCQkJdTggKktleTsKKwkJCQl1OCBDaXBoZXJBbGc7CisJCQkJaW50IGlkeCA9IDA7CiAKLQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVAtU1VDQ0VTUyBQYWNrZXRcbiIpKTsKKwkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAgICAgKCJSZWNlaXZlIEVBUC1TVUNDRVNTIFBhY2tldFxuIikpOworCQkJCS8qcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsgKi8KIAkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CiAKLSAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPT0gRkFMU0UpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZHggPSBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlJZDsKLSAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnID0gcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uQ2lwaGVyQWxnOwotCQkJCQlLZXkgPSBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXk7CisJCQkJaWYgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxeF9yZXF1aXJlZF9rZXlzID09CisJCQkJICAgIEZBTFNFKSB7CisJCQkJCWlkeCA9IHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleUlkOworCQkJCQlDaXBoZXJBbGcgPQorCQkJCQkgICAgcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uCisJCQkJCSAgICBDaXBoZXJBbGc7CisJCQkJCUtleSA9CisJCQkJCSAgICBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS4KKwkJCQkJICAgIEtleTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5TGVuID4gMCkKLSAgICAJCQkJewotI2lmZGVmIFJUMjg2MAotCQkJCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLgorCQkJCQkgICAgS2V5TGVuID4gMCkgeworI2lmZGVmIFJUTVBfTUFDX1BDSQorCQkJCQkJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5ID0KKwkJCQkJCSAgICAmcEFkLT5NYWNUYWIuCisJCQkJCQkgICAgQ29udGVudFtCU1NJRF9XQ0lEXTsKIAotCQkJCQkJLy8gU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMKLQkJCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCQkJCQkJLyogU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMgKi8KKwkJCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsCisJCQkJCQkJCSAgICAgIGlkeCwKKwkJCQkJCQkJICAgICAgQ2lwaGVyQWxnLAorCQkJCQkJCQkgICAgICBLZXksIE5VTEwsCisJCQkJCQkJCSAgICAgIE5VTEwpOwogCi0JCQkJCQkvLyBBc3NpZ24gZ3JvdXAga2V5IGluZm8KLQkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgTlVMTCk7CisJCQkJCQkvKiBBc3NpZ24gZ3JvdXAga2V5IGluZm8gKi8KKwkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJCQkJICBCU1MwLAorCQkJCQkJCQkJICBpZHgsCisJCQkJCQkJCQkgIENpcGhlckFsZywKKwkJCQkJCQkJCSAgTlVMTCk7CiAKLQkJCQkJCS8vIEFzc2lnbiBwYWlyd2lzZSBrZXkgaW5mbwotCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBwRW50cnkpOworCQkJCQkJLyogQXNzaWduIHBhaXJ3aXNlIGtleSBpbmZvICovCisJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCQkJCSAgQlNTMCwKKwkJCQkJCQkJCSAgaWR4LAorCQkJCQkJCQkJICBDaXBoZXJBbGcsCisJCQkJCQkJCQkgIHBFbnRyeSk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQkJCQkJdW5pb24KLQkJCQkJCXsKLQkJCQkJCQljaGFyIGJ1ZltzaXplb2YoTkRJU184MDJfMTFfV0VQKStNQVhfTEVOX09GX0tFWS0gMV07Ci0JCQkJCQkJTkRJU184MDJfMTFfV0VQIGtleWluZm87Ci0JCQkJCQl9ICBXZXBLZXk7CisJCQkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9CisJCQkJCQkgICAgTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisJCQkJCQlwQWQtPkV4dHJhSW5mbyA9CisJCQkJCQkgICAgR0VORVJBTF9MSU5LX1VQOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgorCQkJCQkJdW5pb24geworCQkJCQkJCWNoYXIgYnVmW3NpemVvZgorCQkJCQkJCQkgKHN0cnVjdCBydF9uZGlzXzgwMl8xMV93ZXApCisJCQkJCQkJCSArCisJCQkJCQkJCSBNQVhfTEVOX09GX0tFWQorCQkJCQkJCQkgLSAxXTsKKwkJCQkJCQlzdHJ1Y3QgcnRfbmRpc184MDJfMTFfd2VwIGtleWluZm87CisJCQkJCQl9CisJCQkJCQlXZXBLZXk7CiAJCQkJCQlpbnQgbGVuOwogCisJCQkJCQlOZGlzWmVyb01lbW9yeSgmV2VwS2V5LAorCQkJCQkJCSAgICAgICBzaXplb2YoV2VwS2V5KSk7CisJCQkJCQlsZW4gPQorCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLgorCQkJCQkJICAgIERlc2lyZVNoYXJlZEtleVtpZHhdLktleUxlbjsKIAotCQkJCQkJTmRpc1plcm9NZW1vcnkoJldlcEtleSwgc2l6ZW9mKFdlcEtleSkpOwotCQkJCQkJbGVuID1wQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXlMZW47CisJCQkJCQlOZGlzTW92ZU1lbW9yeShXZXBLZXkua2V5aW5mby4KKwkJCQkJCQkgICAgICAgS2V5TWF0ZXJpYWwsCisJCQkJCQkJICAgICAgIHBBZC0+U3RhQ2ZnLgorCQkJCQkJCSAgICAgICBEZXNpcmVTaGFyZWRLZXkKKwkJCQkJCQkgICAgICAgW2lkeF0uS2V5LAorCQkJCQkJCSAgICAgICBwQWQtPlN0YUNmZy4KKwkJCQkJCQkgICAgICAgRGVzaXJlU2hhcmVkS2V5CisJCQkJCQkJICAgICAgIFtpZHhdLktleUxlbik7CiAKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KFdlcEtleS5rZXlpbmZvLktleU1hdGVyaWFsLAotCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleSwKLQkJCQkJCQlwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXlMZW4pOwotCi0JCQkJCQlXZXBLZXkua2V5aW5mby5LZXlJbmRleCA9IDB4ODAwMDAwMDAgKyBpZHg7CisJCQkJCQlXZXBLZXkua2V5aW5mby5LZXlJbmRleCA9CisJCQkJCQkgICAgMHg4MDAwMDAwMCArIGlkeDsKIAkJCQkJCVdlcEtleS5rZXlpbmZvLktleUxlbmd0aCA9IGxlbjsKLQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuID0oVUNIQVIpIChsZW4gPD0gNSA/IDUgOiAxMyk7CisJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLgorCQkJCQkJICAgIEtleUxlbiA9CisJCQkJCQkgICAgKHU4KShsZW4gPD0gNSA/IDUgOiAxMyk7CiAKLQkJCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0JCQkJCQlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsKLQkJCQkJCS8vIG5lZWQgdG8gZW5xdWV1ZSBjbWQgdG8gdGhyZWFkCi0JCQkJCQlSVFVTQkVucXVldWVDbWRGcm9tTmRpcyhwQWQsIE9JRF84MDJfMTFfQUREX1dFUCwgVFJVRSwgJldlcEtleSwgc2l6ZW9mKFdlcEtleS5rZXlpbmZvKSArIGxlbiAtIDEpOwotI2VuZGlmIC8vIFJUMjg3MCAvLwotCQkJCQkJLy8gRm9yIFByZXZlbnRpbmcgU2hhcmRLZXkgVGFibGUgaXMgY2xlYXJlZCBieSByZW1vdmUga2V5IHByb2NlZHVyZS4KLSAgICAJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW4gPSBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXlMZW47Ci0JCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleSwKLQkJCQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleSwKLQkJCQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleUxlbik7Ci0gICAgCQkJCX0KKwkJCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0KKwkJCQkJCSAgICBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJCQkJCXBBZC0+RXh0cmFJbmZvID0KKwkJCQkJCSAgICBHRU5FUkFMX0xJTktfVVA7CisJCQkJCQkvKiBuZWVkIHRvIGVucXVldWUgY21kIHRvIHRocmVhZCAqLworCQkJCQkJUlRVU0JFbnF1ZXVlQ21kRnJvbU5kaXMocEFkLAorCQkJCQkJCQkJT0lEXzgwMl8xMV9BRERfV0VQLAorCQkJCQkJCQkJVFJVRSwKKwkJCQkJCQkJCSZXZXBLZXksCisJCQkJCQkJCQlzaXplb2YKKwkJCQkJCQkJCShXZXBLZXkuCisJCQkJCQkJCQkga2V5aW5mbykKKwkJCQkJCQkJCSsgbGVuIC0KKwkJCQkJCQkJCTEpOworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCQkJCQkJLyogRm9yIFByZXZlbnRpbmcgU2hhcmRLZXkgVGFibGUgaXMgY2xlYXJlZCBieSByZW1vdmUga2V5IHByb2NlZHVyZS4gKi8KKwkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uCisJCQkJCQkgICAgQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS4KKwkJCQkJCSAgICBLZXlMZW4gPQorCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLgorCQkJCQkJICAgIERlc2lyZVNoYXJlZEtleVtpZHhdLktleUxlbjsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+CisJCQkJCQkJICAgICAgIFNoYXJlZEtleVtCU1MwXQorCQkJCQkJCSAgICAgICBbaWR4XS5LZXksCisJCQkJCQkJICAgICAgIHBBZC0+U3RhQ2ZnLgorCQkJCQkJCSAgICAgICBEZXNpcmVTaGFyZWRLZXkKKwkJCQkJCQkgICAgICAgW2lkeF0uS2V5LAorCQkJCQkJCSAgICAgICBwQWQtPlN0YUNmZy4KKwkJCQkJCQkgICAgICAgRGVzaXJlU2hhcmVkS2V5CisJCQkJCQkJICAgICAgIFtpZHhdLktleUxlbik7CisJCQkJCX0KIAkJCQl9CiAJCQl9CiAKIAkJCUluZGljYXRlX0xlZ2FjeV9QYWNrZXQocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKIAkJCXJldHVybjsKIAkJfQotCX0KLQllbHNlCi0JewotCQkvLyBTcGVjaWFsIERBVEEgZnJhbWUgdGhhdCBoYXMgdG8gcGFzcyB0byBNTE1FCi0JCS8vCSAxLiBDaXNjbyBBaXJvbmV0IGZyYW1lcyBmb3IgQ0NYMi4gV2UgbmVlZCBwYXNzIGl0IHRvIE1MTUUgZm9yIHNwZWNpYWwgcHJvY2VzcwotCQkvLwkgMi4gRUFQT0wgaGFuZHNoYWtpbmcgZnJhbWVzIHdoZW4gZHJpdmVyIHN1cHBsaWNhbnQgZW5hYmxlZCwgcGFzcyB0byBNTE1FIGZvciBzcGVjaWFsIHByb2Nlc3MKKwl9IGVsc2UgeworCQkvKiBTcGVjaWFsIERBVEEgZnJhbWUgdGhhdCBoYXMgdG8gcGFzcyB0byBNTE1FICovCisJCS8qICAgICAgIDEuIENpc2NvIEFpcm9uZXQgZnJhbWVzIGZvciBDQ1gyLiBXZSBuZWVkIHBhc3MgaXQgdG8gTUxNRSBmb3Igc3BlY2lhbCBwcm9jZXNzICovCisJCS8qICAgICAgIDIuIEVBUE9MIGhhbmRzaGFraW5nIGZyYW1lcyB3aGVuIGRyaXZlciBzdXBwbGljYW50IGVuYWJsZWQsIHBhc3MgdG8gTUxNRSBmb3Igc3BlY2lhbCBwcm9jZXNzICovCiAJCXsKIAkJCXBUbXBCdWYgPSBwUnhCbGstPnBEYXRhIC0gTEVOR1RIXzgwMl8xMTsKIAkJCU5kaXNNb3ZlTWVtb3J5KHBUbXBCdWYsIHBSeEJsay0+cEhlYWRlciwgTEVOR1RIXzgwMl8xMSk7Ci0JCQlSRVBPUlRfTUdNVF9GUkFNRV9UT19NTE1FKHBBZCwgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsIHBUbXBCdWYsIHBSeEJsay0+RGF0YVNpemUgKyBMRU5HVEhfODAyXzExLCBwUnhXSS0+UlNTSTAsIHBSeFdJLT5SU1NJMSwgcFJ4V0ktPlJTU0kyLCBwUnhELT5QbGNwU2lnbmFsKTsKLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIhISEgcmVwb3J0IEVBUE9ML0FJUk9ORVQgREFUQSB0byBNTE1FIChsZW49JWQpICEhIVxuIiwgcFJ4QmxrLT5EYXRhU2l6ZSkpOworCQkJUkVQT1JUX01HTVRfRlJBTUVfVE9fTUxNRShwQWQsIHBSeFdJLT5XaXJlbGVzc0NsaUlELAorCQkJCQkJICBwVG1wQnVmLAorCQkJCQkJICBwUnhCbGstPkRhdGFTaXplICsKKwkJCQkJCSAgTEVOR1RIXzgwMl8xMSwgcFJ4V0ktPlJTU0kwLAorCQkJCQkJICBwUnhXSS0+UlNTSTEsIHBSeFdJLT5SU1NJMiwKKwkJCQkJCSAgcFJ4RC0+UGxjcFNpZ25hbCk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkJICAgICAoInJlcG9ydCBFQVBPTC9BSVJPTkVUIERBVEEgdG8gTUxNRSAobGVuPSVkKSAhXG4iLAorCQkJCSAgICAgIHBSeEJsay0+RGF0YVNpemUpKTsKIAkJfQogCX0KIApAQCAtMTQ2LDQ5NSArMjAyLDQ4MyBAQAogCiB9CiAKLVZPSUQgU1RBUnhEYXRhRnJhbWVBbm5vdW5jZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit2b2lkIFNUQVJ4RGF0YUZyYW1lQW5ub3VuY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwKKwkJCSAgICBzdHJ1Y3QgcnRfcnhfYmxrICpwUnhCbGssIHU4IEZyb21XaGljaEJTU0lEKQogewogCi0JLy8gbm9uLUVBUCBmcmFtZQotCWlmICghUlRNUENoZWNrV1BBZnJhbWUocEFkLCBwRW50cnksIHBSeEJsay0+cERhdGEsIHBSeEJsay0+RGF0YVNpemUsIEZyb21XaGljaEJTU0lEKSkKLQl7CisJLyogbm9uLUVBUCBmcmFtZSAqLworCWlmICghUlRNUENoZWNrV1BBZnJhbWUKKwkgICAgKHBBZCwgcEVudHJ5LCBwUnhCbGstPnBEYXRhLCBwUnhCbGstPkRhdGFTaXplLCBGcm9tV2hpY2hCU1NJRCkpIHsKKwogCQl7Ci0JCQkvLyBkcm9wIGFsbCBub24tRUFQIERBVEEgZnJhbWUgYmVmb3JlCi0JCQkvLyB0aGlzIGNsaWVudCdzIFBvcnQtQWNjZXNzLUNvbnRyb2wgaXMgc2VjdXJlZAotCQkJaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuV2VwKQotCQkJewotCQkJCS8vIHVuc3VwcG9ydGVkIGNpcGhlciBzdWl0ZQotCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkKLQkJCQl7Ci0JCQkJCS8vIHJlbGVhc2UgcGFja2V0Ci0JCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkvKiBkcm9wIGFsbCBub24tRUFQIERBVEEgZnJhbWUgYmVmb3JlICovCisJCQkvKiB0aGlzIGNsaWVudCdzIFBvcnQtQWNjZXNzLUNvbnRyb2wgaXMgc2VjdXJlZCAqLworCQkJaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuV2VwKSB7CisJCQkJLyogdW5zdXBwb3J0ZWQgY2lwaGVyIHN1aXRlICovCisJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PQorCQkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkKSB7CisJCQkJCS8qIHJlbGVhc2UgcGFja2V0ICovCisJCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLAorCQkJCQkJCSAgICBwUnhCbGstPnBSeFBhY2tldCwKKwkJCQkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCQkJCXJldHVybjsKIAkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gZW5jcnlwdGlvbiBpbi11c2UgYnV0IHJlY2VpdmUgYSBub24tRUFQT0wgY2xlYXIgdGV4dCBmcmFtZSwgZHJvcCBpdAotCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpICYmCi0JCQkJCShwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQotCQkJCXsKLQkJCQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogZW5jcnlwdGlvbiBpbi11c2UgYnV0IHJlY2VpdmUgYSBub24tRUFQT0wgY2xlYXIgdGV4dCBmcmFtZSwgZHJvcCBpdCAqLworCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9CisJCQkJICAgICBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkKQorCQkJCSAgICAmJiAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0KKwkJCQkJV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkgeworCQkJCQkvKiByZWxlYXNlIHBhY2tldCAqLworCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwKKwkJCQkJCQkgICAgcFJ4QmxrLT5wUnhQYWNrZXQsCisJCQkJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQkJCQlyZXR1cm47CiAJCQkJfQogCQkJfQogCQl9CiAJCVJYX0JMS19DTEVBUl9GTEFHKHBSeEJsaywgZlJYX0VBUCk7Ci0JCWlmICghUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BUkFMSU5LKSkKLQkJewotCQkJLy8gTm9ybWFsIGxlZ2FjeSwgQU1QRFUgb3IgQU1TRFUKLQkJCUNtbVJ4bm9uUmFsaW5rRnJhbWVJbmRpY2F0ZShwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQlpZiAoIVJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQVJBTElOSykpIHsKKwkJCS8qIE5vcm1hbCBsZWdhY3ksIEFNUERVIG9yIEFNU0RVICovCisJCQlDbW1SeG5vblJhbGlua0ZyYW1lSW5kaWNhdGUocEFkLCBwUnhCbGssCisJCQkJCQkgICAgRnJvbVdoaWNoQlNTSUQpOwogCisJCX0gZWxzZSB7CisJCQkvKiBBUkFMSU5LICovCisJCQlDbW1SeFJhbGlua0ZyYW1lSW5kaWNhdGUocEFkLCBwRW50cnksIHBSeEJsaywKKwkJCQkJCSBGcm9tV2hpY2hCU1NJRCk7CiAJCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyBBUkFMSU5LCi0JCQlDbW1SeFJhbGlua0ZyYW1lSW5kaWNhdGUocEFkLCBwRW50cnksIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwotCQl9Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0VBUCk7CiAKLQkJaWYgKFJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQU1QRFUpICYmIChwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPT0gMCkpCi0JCXsKKwkJaWYgKFJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQU1QRFUpCisJCSAgICAmJiAocEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID09IDApKSB7CiAJCQlJbmRpY2F0ZV9BTVBEVV9QYWNrZXQocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIERldGVybWluIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgRUFQIGZyYW1lCi0JCQkvLyAgdG8gV1BBIHN0YXRlIG1hY2hpbmUgb3IgdXBwZXIgbGF5ZXIKLQkJCVNUQVJ4RUFQT0xGcmFtZUluZGljYXRlKHBBZCwgcEVudHJ5LCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJfSBlbHNlIHsKKwkJCS8qIERldGVybWluIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgRUFQIGZyYW1lICovCisJCQkvKiAgdG8gV1BBIHN0YXRlIG1hY2hpbmUgb3IgdXBwZXIgbGF5ZXIgKi8KKwkJCVNUQVJ4RUFQT0xGcmFtZUluZGljYXRlKHBBZCwgcEVudHJ5LCBwUnhCbGssCisJCQkJCQlGcm9tV2hpY2hCU1NJRCk7CiAJCX0KIAl9CiB9CiAKLQotLy8gRm9yIFRLSVAgZnJhbWUsIGNhbGN1bGF0ZSB0aGUgTUlDIHZhbHVlCi1CT09MRUFOIFNUQUNoZWNrVGtpcE1JQ1ZhbHVlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAotCUlOCVJYX0JMSwkJCSpwUnhCbGspCisvKiBGb3IgVEtJUCBmcmFtZSwgY2FsY3VsYXRlIHRoZSBNSUMgdmFsdWUgKi8KK0JPT0xFQU4gU1RBQ2hlY2tUa2lwTUlDVmFsdWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaykKIHsKLQlQSEVBREVSXzgwMl8xMQlwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOwotCVVDSEFSCQkJKnBEYXRhID0gcFJ4QmxrLT5wRGF0YTsKLQlVU0hPUlQJCQlEYXRhU2l6ZSA9IHBSeEJsay0+RGF0YVNpemU7Ci0JVUNIQVIJCQlVc2VyUHJpb3JpdHkgPSBwUnhCbGstPlVzZXJQcmlvcml0eTsKLQlQQ0lQSEVSX0tFWQkJcFdwYUtleTsKLQlVQ0hBUgkJCSpwREEsICpwU0E7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOworCXU4ICpwRGF0YSA9IHBSeEJsay0+cERhdGE7CisJdTE2IERhdGFTaXplID0gcFJ4QmxrLT5EYXRhU2l6ZTsKKwl1OCBVc2VyUHJpb3JpdHkgPSBwUnhCbGstPlVzZXJQcmlvcml0eTsKKwlzdHJ1Y3QgcnRfY2lwaGVyX2tleSAqcFdwYUtleTsKKwl1OCAqcERBLCAqcFNBOwogCiAJcFdwYUtleSA9ICZwQWQtPlNoYXJlZEtleVtCU1MwXVtwUnhCbGstPnBSeFdJLT5LZXlJbmRleF07CiAKIAlwREEgPSBwSGVhZGVyLT5BZGRyMTsKLQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9JTkZSQSkpCi0JeworCWlmIChSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0lORlJBKSkgewogCQlwU0EgPSBwSGVhZGVyLT5BZGRyMzsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlwU0EgPSBwSGVhZGVyLT5BZGRyMjsKIAl9CiAKIAlpZiAoUlRNUFRraXBDb21wYXJlTUlDVmFsdWUocEFkLAotCQkJCQkJCQlwRGF0YSwKLQkJCQkJCQkJcERBLAotCQkJCQkJCQlwU0EsCi0JCQkJCQkJCXBXcGFLZXktPlJ4TWljLAotCQkJCQkJCQlVc2VyUHJpb3JpdHksCi0JCQkJCQkJCURhdGFTaXplKSA9PSBGQUxTRSkKLQl7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIlJ4IE1JQyBWYWx1ZSBlcnJvciAyXG4iKSk7CisJCQkJICAgIHBEYXRhLAorCQkJCSAgICBwREEsCisJCQkJICAgIHBTQSwKKwkJCQkgICAgcFdwYUtleS0+UnhNaWMsCisJCQkJICAgIFVzZXJQcmlvcml0eSwgRGF0YVNpemUpID09IEZBTFNFKSB7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSeCBNSUMgVmFsdWUgZXJyb3IgMlxuIikpOwogCi0JCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApCi0JCXsKLQkJCVdwYVNlbmRNaWNGYWlsdXJlVG9XcGFTdXBwbGljYW50KHBBZCwgKHBXcGFLZXktPlR5cGUgPT0gUEFJUldJU0VLRVkpID8gVFJVRSA6IEZBTFNFKTsKLQkJfQotCQllbHNlCi0JCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkgeworCQkJV3BhU2VuZE1pY0ZhaWx1cmVUb1dwYVN1cHBsaWNhbnQocEFkLAorCQkJCQkJCSAocFdwYUtleS0+VHlwZSA9PQorCQkJCQkJCSAgUEFJUldJU0VLRVkpID8gVFJVRSA6CisJCQkJCQkJIEZBTFNFKTsKKwkJfSBlbHNlIHsKIAkJCVJUTVBSZXBvcnRNaWNFcnJvcihwQWQsIHBXcGFLZXkpOwogCQl9CiAKLQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJLyogcmVsZWFzZSBwYWNrZXQgKi8KKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LAorCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIAogCXJldHVybiBUUlVFOwogfQogCi0KLS8vCi0vLyBBbGwgUnggcm91dGluZXMgdXNlIFJYX0JMSyBzdHJ1Y3R1cmUgdG8gaGFuZGUgcnggZXZlbnRzCi0vLyBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0byBidWlsZCBwUnhCbGsgYXR0cmlidXRlcwotLy8gIDEuIHBIZWFkZXIgcG9pbnRlciB0byA4MDIuMTEgSGVhZGVyCi0vLyAgMi4gcERhdGEgcG9pbnRlciB0byBwYXlsb2FkIGluY2x1ZGluZyBMTEMgKGp1c3Qgc2tpcCBIZWFkZXIpCi0vLyAgMy4gc2V0IHBheWxvYWQgc2l6ZSBpbmNsdWRpbmcgTExDIHRvIERhdGFTaXplCi0vLyAgNC4gc2V0IHNvbWUgZmxhZ3Mgd2l0aCBSWF9CTEtfU0VUX0ZMQUcoKQotLy8KLVZPSUQgU1RBSGFuZGxlUnhEYXRhRnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaykKKy8qICovCisvKiBBbGwgUnggcm91dGluZXMgdXNlIHN0cnVjdCBydF9yeF9ibGsgc3RydWN0dXJlIHRvIGhhbmRlIHJ4IGV2ZW50cyAqLworLyogSXQgaXMgdmVyeSBpbXBvcnRhbnQgdG8gYnVpbGQgcFJ4QmxrIGF0dHJpYnV0ZXMgKi8KKy8qICAxLiBwSGVhZGVyIHBvaW50ZXIgdG8gODAyLjExIEhlYWRlciAqLworLyogIDIuIHBEYXRhIHBvaW50ZXIgdG8gcGF5bG9hZCBpbmNsdWRpbmcgTExDIChqdXN0IHNraXAgSGVhZGVyKSAqLworLyogIDMuIHNldCBwYXlsb2FkIHNpemUgaW5jbHVkaW5nIExMQyB0byBEYXRhU2l6ZSAqLworLyogIDQuIHNldCBzb21lIGZsYWdzIHdpdGggUlhfQkxLX1NFVF9GTEFHKCkgKi8KKy8qICovCit2b2lkIFNUQUhhbmRsZVJ4RGF0YUZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrKQogewotCVBSVDI4WFhfUlhEX1NUUlVDCQkJCXBSeEQgPSAmKHBSeEJsay0+UnhEKTsKLQlQUlhXSV9TVFJVQwkJCQkJCXBSeFdJID0gcFJ4QmxrLT5wUnhXSTsKLQlQSEVBREVSXzgwMl8xMQkJCQkJcEhlYWRlciA9IHBSeEJsay0+cEhlYWRlcjsKLQlQTkRJU19QQUNLRVQJCQkJCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OwotCUJPT0xFQU4gCQkJCQkJYkZyYWdtZW50ID0gRkFMU0U7Ci0JTUFDX1RBQkxFX0VOVFJZCSAgICAJCQkqcEVudHJ5ID0gTlVMTDsKLQlVQ0hBUgkJCQkJCQlGcm9tV2hpY2hCU1NJRCA9IEJTUzA7Ci0JVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyUHJpb3JpdHkgPSAwOworCVBSVDI4WFhfUlhEX1NUUlVDIHBSeEQgPSAmKHBSeEJsay0+UnhEKTsKKwlzdHJ1Y3QgcnRfcnh3aSAqIHBSeFdJID0gcFJ4QmxrLT5wUnhXSTsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBIZWFkZXIgPSBwUnhCbGstPnBIZWFkZXI7CisJdm9pZCAqcFJ4UGFja2V0ID0gcFJ4QmxrLT5wUnhQYWNrZXQ7CisJQk9PTEVBTiBiRnJhZ21lbnQgPSBGQUxTRTsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkgPSBOVUxMOworCXU4IEZyb21XaGljaEJTU0lEID0gQlNTMDsKKwl1OCBVc2VyUHJpb3JpdHkgPSAwOwogCiAJewotCQkvLyBiZWZvcmUgTElOSyBVUCwgYWxsIERBVEEgZnJhbWVzIGFyZSByZWplY3RlZAotCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJewotCQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkvKiBiZWZvcmUgTElOSyBVUCwgYWxsIERBVEEgZnJhbWVzIGFyZSByZWplY3RlZCAqLworCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkgeworCQkJLyogcmVsZWFzZSBwYWNrZXQgKi8KKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsCisJCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKIAkJCXJldHVybjsKIAkJfQotCi0JCS8vIERyb3Agbm90IG15IEJTUyBmcmFtZXMKLQkJaWYgKHBSeEQtPk15QnNzID09IDApCi0JCXsKKwkJLyogRHJvcCBub3QgbXkgQlNTIGZyYW1lcyAqLworCQlpZiAocFJ4RC0+TXlCc3MgPT0gMCkgewogCQkJewotCQkJCS8vIHJlbGVhc2UgcGFja2V0Ci0JCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJLyogcmVsZWFzZSBwYWNrZXQgKi8KKwkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LAorCQkJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQkJCXJldHVybjsKIAkJCX0KIAkJfQogCiAJCXBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudFNpbmNlTGFzdE5VTEwrKzsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSAmJiAocEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDgpKQotCQl7Ci0JCQlVQ0hBUiAqcERhdGE7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoImJBUFNEQ2FwYWJsZVxuIikpOworCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlCisJCSAgICAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZQorCQkgICAgJiYgKHBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA4KSkgeworCQkJdTggKnBEYXRhOworCQkJREJHUFJJTlQoUlRfREVCVUdfSU5GTywgKCJiQVBTRENhcGFibGVcbiIpKTsKIAotCQkJLy8gUW9zIGJpdCA0Ci0JCQlwRGF0YSA9IChQVUNIQVIpcEhlYWRlciArIExFTkdUSF84MDJfMTE7Ci0JCQlpZiAoKCpwRGF0YSA+PiA0KSAmIDB4MDEpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSeERvbmUtIFJjdiBFT1NQIGZyYW1lLCBkcml2ZXIgbWF5IGZhbGwgaW50byBzbGVlcFxuIikpOworCQkJLyogUW9zIGJpdCA0ICovCisJCQlwRGF0YSA9ICh1OCAqKXBIZWFkZXIgKyBMRU5HVEhfODAyXzExOworCQkJaWYgKCgqcERhdGEgPj4gNCkgJiAweDAxKSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfSU5GTywKKwkJCQkJICgiUnhEb25lLSBSY3YgRU9TUCBmcmFtZSwgZHJpdmVyIG1heSBmYWxsIGludG8gc2xlZXBcbiIpKTsKIAkJCQlwQWQtPkNvbW1vbkNmZy5iSW5TZXJ2aWNlUGVyaW9kID0gRkFMU0U7CiAKLQkJCQkvLyBGb3JjZSBkcml2ZXIgdG8gZmFsbCBpbnRvIHNsZWVwIG1vZGUgd2hlbiByY3YgRU9TUCBmcmFtZQotCQkJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLQkJCQl7Ci0JCQkJCVVTSE9SVCAgVGJ0dE51bVRvTmV4dFdha2VVcDsKLQkJCQkJVVNIT1JUICBOZXh0RHRpbSA9IHBBZC0+U3RhQ2ZnLkR0aW1QZXJpb2Q7Ci0JCQkJCVVMT05HICAgTm93OworCQkJCS8qIEZvcmNlIGRyaXZlciB0byBmYWxsIGludG8gc2xlZXAgbW9kZSB3aGVuIHJjdiBFT1NQIGZyYW1lICovCisJCQkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKSB7CisJCQkJCXUxNiBUYnR0TnVtVG9OZXh0V2FrZVVwOworCQkJCQl1MTYgTmV4dER0aW0gPQorCQkJCQkgICAgcEFkLT5TdGFDZmcuRHRpbVBlcmlvZDsKKwkJCQkJdW5zaWduZWQgbG9uZyBOb3c7CiAKIAkJCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKLQkJCQkJTmV4dER0aW0gLT0gKFVTSE9SVCkoTm93IC0gcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSkvcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kOworCQkJCQlOZXh0RHRpbSAtPQorCQkJCQkgICAgKHUxNikoTm93IC0KKwkJCQkJCSAgICAgIHBBZC0+U3RhQ2ZnLgorCQkJCQkJICAgICAgTGFzdEJlYWNvblJ4VGltZSkgLworCQkJCQkgICAgcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kOwogCi0JCQkJCVRidHROdW1Ub05leHRXYWtlVXAgPSBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQ7Ci0JCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSkgJiYgKFRidHROdW1Ub05leHRXYWtlVXAgPiBOZXh0RHRpbSkpCisJCQkJCVRidHROdW1Ub05leHRXYWtlVXAgPQorCQkJCQkgICAgcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50OworCQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHCisJCQkJCSAgICAocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSkKKwkJCQkJICAgICYmIChUYnR0TnVtVG9OZXh0V2FrZVVwID4gTmV4dER0aW0pKQogCQkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IE5leHREdGltOwogCi0JCQkJCU1sbWVTZXRQc21CaXQocEFkLCBQV1JfU0FWRSk7Ci0JCQkJCS8vIGlmIFdNTS1BUFNEIGlzIGZhaWxlZCwgdHJ5IHRvIGRpc2FibGUgZm9sbG93aW5nIGxpbmUKLQkJCQkJQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAocEFkLCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKKwkJCQkJUlRNUF9TRVRfUFNNX0JJVChwQWQsIFBXUl9TQVZFKTsKKwkJCQkJLyogaWYgV01NLUFQU0QgaXMgZmFpbGVkLCB0cnkgdG8gZGlzYWJsZSBmb2xsb3dpbmcgbGluZSAqLworCQkJCQlBc2ljU2xlZXBUaGVuQXV0b1dha2V1cChwQWQsCisJCQkJCQkJCVRidHROdW1Ub05leHRXYWtlVXApOwogCQkJCX0KIAkJCX0KIAotCQkJaWYgKChwSGVhZGVyLT5GQy5Nb3JlRGF0YSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJblNlcnZpY2VQZXJpb2QpKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2VuZGluZyBhbm90aGVyIHRyaWdnZXIgZnJhbWUgd2hlbiBNb3JlIERhdGEgYml0IGlzIHNldCB0byAxXG4iKSk7CisJCQlpZiAoKHBIZWFkZXItPkZDLk1vcmVEYXRhKQorCQkJICAgICYmIChwQWQtPkNvbW1vbkNmZy5iSW5TZXJ2aWNlUGVyaW9kKSkgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJTZW5kaW5nIGFub3RoZXIgdHJpZ2dlciBmcmFtZSB3aGVuIE1vcmUgRGF0YSBiaXQgaXMgc2V0IHRvIDFcbiIpKTsKIAkJCX0KIAkJfQotCi0JCS8vIERyb3AgTlVMTCwgQ0YtQUNLKG5vIGRhdGEpLCBDRi1QT0xMKG5vIGRhdGEpLCBhbmQgQ0YtQUNLK0NGLVBPTEwobm8gZGF0YSkgZGF0YSBmcmFtZQotCQlpZiAoKHBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA0KSkgLy8gYml0IDIgOiBubyBEQVRBCisJCS8qIERyb3AgTlVMTCwgQ0YtQUNLKG5vIGRhdGEpLCBDRi1QT0xMKG5vIGRhdGEpLCBhbmQgQ0YtQUNLK0NGLVBPTEwobm8gZGF0YSkgZGF0YSBmcmFtZSAqLworCQlpZiAoKHBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA0KSkJLyogYml0IDIgOiBubyBEQVRBICovCiAJCXsKLQkJCS8vIHJlbGVhc2UgcGFja2V0Ci0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCS8qIHJlbGVhc2UgcGFja2V0ICovCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LAorCQkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCQlyZXR1cm47CiAJCX0KKwkJLyogRHJvcCBub3QgbXkgQlNTIGZyYW1lICh3ZSBjYW4gbm90IG9ubHkgY2hlY2sgdGhlIE15QnNzIGJpdCBpbiBSeEQpICovCiAKLQkgICAgLy8gRHJvcCBub3QgbXkgQlNTIGZyYW1lICh3ZSBjYW4gbm90IG9ubHkgY2hlY2sgdGhlIE15QnNzIGJpdCBpbiBSeEQpCi0KLQkJaWYgKElORlJBX09OKHBBZCkpCi0JCXsKLQkJCS8vIEluZnJhc3RydWN0dXJlIG1vZGUsIGNoZWNrIGFkZHJlc3MgMiBmb3IgQlNTSUQKLQkJCWlmICghUlRNUEVxdWFsTWVtb3J5KCZwSGVhZGVyLT5BZGRyMiwgJnBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCA2KSkKLQkJCXsKLQkJCQkvLyBSZWNlaXZlIGZyYW1lIG5vdCBteSBCU1NJRAotCSAgICAgICAgICAgIC8vIHJlbGVhc2UgcGFja2V0Ci0JICAgICAgICAgICAgUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCWlmIChJTkZSQV9PTihwQWQpKSB7CisJCQkvKiBJbmZyYXN0cnVjdHVyZSBtb2RlLCBjaGVjayBhZGRyZXNzIDIgZm9yIEJTU0lEICovCisJCQlpZiAoIVJUTVBFcXVhbE1lbW9yeQorCQkJICAgICgmcEhlYWRlci0+QWRkcjIsICZwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgNikpIHsKKwkJCQkvKiBSZWNlaXZlIGZyYW1lIG5vdCBteSBCU1NJRCAqLworCQkJCS8qIHJlbGVhc2UgcGFja2V0ICovCisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwKKwkJCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKIAkJCQlyZXR1cm47CiAJCQl9Ci0JCX0KLQkJZWxzZQkvLyBBZC1Ib2MgbW9kZSBvciBOb3QgYXNzb2NpYXRlZAorCQl9IGVsc2UJCS8qIEFkLUhvYyBtb2RlIG9yIE5vdCBhc3NvY2lhdGVkICovCiAJCXsKLQkJCS8vIEFkLUhvYyBtb2RlLCBjaGVjayBhZGRyZXNzIDMgZm9yIEJTU0lECi0JCQlpZiAoIVJUTVBFcXVhbE1lbW9yeSgmcEhlYWRlci0+QWRkcjMsICZwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgNikpCi0JCQl7Ci0JCQkJLy8gUmVjZWl2ZSBmcmFtZSBub3QgbXkgQlNTSUQKLQkgICAgICAgICAgICAvLyByZWxlYXNlIHBhY2tldAotCSAgICAgICAgICAgIFJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJLyogQWQtSG9jIG1vZGUsIGNoZWNrIGFkZHJlc3MgMyBmb3IgQlNTSUQgKi8KKwkJCWlmICghUlRNUEVxdWFsTWVtb3J5CisJCQkgICAgKCZwSGVhZGVyLT5BZGRyMywgJnBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCA2KSkgeworCQkJCS8qIFJlY2VpdmUgZnJhbWUgbm90IG15IEJTU0lEICovCisJCQkJLyogcmVsZWFzZSBwYWNrZXQgKi8KKwkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LAorCQkJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQkJCXJldHVybjsKIAkJCX0KIAkJfQogCi0JCS8vCi0JCS8vIGZpbmQgcEVudHJ5Ci0JCS8vCi0JCWlmIChwUnhXSS0+V2lyZWxlc3NDbGlJRCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQotCQl7CisJCS8qICovCisJCS8qIGZpbmQgcEVudHJ5ICovCisJCS8qICovCisJCWlmIChwUnhXSS0+V2lyZWxlc3NDbGlJRCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKSB7CiAJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwUnhXSS0+V2lyZWxlc3NDbGlJRF07Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyAxLiByZWxlYXNlIHBhY2tldCBpZiBpbmZyYSBtb2RlCi0JCQkvLyAyLiBuZXcgYSBwRW50cnkgaWYgYWQtaG9jIG1vZGUKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQl9IGVsc2UgeworCQkJLyogMS4gcmVsZWFzZSBwYWNrZXQgaWYgaW5mcmEgbW9kZSAqLworCQkJLyogMi4gbmV3IGEgcEVudHJ5IGlmIGFkLWhvYyBtb2RlICovCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LAorCQkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCQlyZXR1cm47CiAJCX0KIAotCQkvLyBpbmZyYSBvciBhZC1ob2MKLQkJaWYgKElORlJBX09OKHBBZCkpCi0JCXsKKwkJLyogaW5mcmEgb3IgYWQtaG9jICovCisJCWlmIChJTkZSQV9PTihwQWQpKSB7CiAJCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfSU5GUkEpOwogCQkJQVNTRVJUKHBSeFdJLT5XaXJlbGVzc0NsaUlEID09IEJTU0lEX1dDSUQpOwogCQl9Ci0KLQkJLy8gY2hlY2sgQXRoZXJvcyBDbGllbnQKLQkJaWYgKChwRW50cnktPmJJQW1CYWRBdGhlcm9zID09IEZBTFNFKSAmJiAgKHBSeEQtPkFNUERVID09IDEpICYmIChwSGVhZGVyLT5GQy5SZXRyeSApKQotCQl7CisJCS8qIGNoZWNrIEF0aGVyb3MgQ2xpZW50ICovCisJCWlmICgocEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9PSBGQUxTRSkgJiYgKHBSeEQtPkFNUERVID09IDEpCisJCSAgICAmJiAocEhlYWRlci0+RkMuUmV0cnkpKSB7CiAJCQlwRW50cnktPmJJQW1CYWRBdGhlcm9zID0gVFJVRTsKIAkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYkN1cnJlbnRBdGhlcm9zID0gVFJVRTsKIAkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYkxhc3RBdGhlcm9zID0gVFJVRTsKLQkJCWlmICghU1RBX0FFU19PTihwQWQpKQotCQkJewotCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgOCwgQUxMTl9TRVRQUk9URUNULCBUUlVFLCBGQUxTRSk7CisJCQlpZiAoIVNUQV9BRVNfT04ocEFkKSkgeworCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgOCwgQUxMTl9TRVRQUk9URUNULCBUUlVFLAorCQkJCQkJICBGQUxTRSk7CiAJCQl9CiAJCX0KIAl9CiAKLQlwUnhCbGstPnBEYXRhID0gKFVDSEFSICopcEhlYWRlcjsKKwlwUnhCbGstPnBEYXRhID0gKHU4ICopIHBIZWFkZXI7CiAKLQkvLwotCS8vIHVwZGF0ZSBSeEJsay0+cERhdGEsIERhdGFTaXplCi0JLy8gODAyLjExIEhlYWRlciwgUU9TLCBIVEMsIEh3IFBhZGRpbmcKLQkvLworCS8qICovCisJLyogdXBkYXRlIFJ4QmxrLT5wRGF0YSwgRGF0YVNpemUgKi8KKwkvKiA4MDIuMTEgSGVhZGVyLCBRT1MsIEhUQywgSHcgUGFkZGluZyAqLworCS8qICovCiAKLQkvLyAxLiBza2lwIDgwMi4xMSBIRUFERVIKKwkvKiAxLiBza2lwIDgwMi4xMSBIRUFERVIgKi8KIAl7CiAJCXBSeEJsay0+cERhdGEgKz0gTEVOR1RIXzgwMl8xMTsKIAkJcFJ4QmxrLT5EYXRhU2l6ZSAtPSBMRU5HVEhfODAyXzExOwogCX0KIAotCS8vIDIuIFFPUwotCWlmIChwSGVhZGVyLT5GQy5TdWJUeXBlICYgMHgwOCkKLQl7CisJLyogMi4gUU9TICovCisJaWYgKHBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA4KSB7CiAJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9RT1MpOwogCQlVc2VyUHJpb3JpdHkgPSAqKHBSeEJsay0+cERhdGEpICYgMHgwZjsKLQkJLy8gYml0IDcgaW4gUW9TIENvbnRyb2wgZmllbGQgc2lnbmFscyB0aGUgSFQgQS1NU0RVIGZvcm1hdAotCQlpZiAoKCpwUnhCbGstPnBEYXRhKSAmIDB4ODApCi0JCXsKKwkJLyogYml0IDcgaW4gUW9TIENvbnRyb2wgZmllbGQgc2lnbmFscyB0aGUgSFQgQS1NU0RVIGZvcm1hdCAqLworCQlpZiAoKCpwUnhCbGstPnBEYXRhKSAmIDB4ODApIHsKIAkJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSk7CiAJCX0KLQotCQkvLyBza2lwIFFPUyBjb250b3JsIGZpZWxkCisJCS8qIHNraXAgUU9TIGNvbnRvcmwgZmllbGQgKi8KIAkJcFJ4QmxrLT5wRGF0YSArPSAyOwotCQlwUnhCbGstPkRhdGFTaXplIC09MjsKKwkJcFJ4QmxrLT5EYXRhU2l6ZSAtPSAyOwogCX0KIAlwUnhCbGstPlVzZXJQcmlvcml0eSA9IFVzZXJQcmlvcml0eTsKIAotCS8vIDMuIE9yZGVyIGJpdDogQS1SYWxpbmsgb3IgSFRDKwotCWlmIChwSGVhZGVyLT5GQy5PcmRlcikKLQl7CisJLyogY2hlY2sgaWYgbmVlZCB0byByZXNlbmQgUFMgUG9sbCB3aGVuIHJlY2VpdmVkIHBhY2tldCB3aXRoIE1vcmVEYXRhID0gMSAqLworCWlmICgocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSAmJiAocEhlYWRlci0+RkMuTW9yZURhdGEgPT0gMSkpIHsKKwkJaWYgKCgoKFVzZXJQcmlvcml0eSA9PSAwKSB8fCAoVXNlclByaW9yaXR5ID09IDMpKSAmJgorCQkgICAgIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUgPT0gMCkgfHwKKwkJICAgICgoKFVzZXJQcmlvcml0eSA9PSAxKSB8fCAoVXNlclByaW9yaXR5ID09IDIpKSAmJgorCQkgICAgIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgPT0gMCkgfHwKKwkJICAgICgoKFVzZXJQcmlvcml0eSA9PSA0KSB8fCAoVXNlclByaW9yaXR5ID09IDUpKSAmJgorCQkgICAgIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgPT0gMCkgfHwKKwkJICAgICgoKFVzZXJQcmlvcml0eSA9PSA2KSB8fCAoVXNlclByaW9yaXR5ID09IDcpKSAmJgorCQkgICAgIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8gPT0gMCkpIHsKKwkJCS8qIG5vbi1VQVBTRCBkZWxpdmVyeS1lbmFibGVkIEFDICovCisJCQlSVE1QX1BTX1BPTExfRU5RVUVVRShwQWQpOworCQl9CisJfQorCS8qIDMuIE9yZGVyIGJpdDogQS1SYWxpbmsgb3IgSFRDKyAqLworCWlmIChwSGVhZGVyLT5GQy5PcmRlcikgewogI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKLQkJaWYgKChwUnhXSS0+UEhZTU9ERSA8PSBNT0RFX09GRE0pICYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCkpKQorCQlpZiAoKHBSeFdJLT5QSFlNT0RFIDw9IE1PREVfT0ZETSkKKwkJICAgICYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCkpKQogCQl7CiAJCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfQVJBTElOSyk7Ci0JCX0KLQkJZWxzZQotI2VuZGlmCisJCX0gZWxzZQorI2VuZGlmIC8qIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8gKi8KIAkJewogCQkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0hUQyk7Ci0JCQkvLyBza2lwIEhUQyBjb250b3JsIGZpZWxkCisJCQkvKiBza2lwIEhUQyBjb250b3JsIGZpZWxkICovCiAJCQlwUnhCbGstPnBEYXRhICs9IDQ7CiAJCQlwUnhCbGstPkRhdGFTaXplIC09IDQ7CiAJCX0KIAl9Ci0KLQkvLyA0LiBza2lwIEhXIHBhZGRpbmcKLQlpZiAocFJ4RC0+TDJQQUQpCi0JewotCQkvLyBqdXN0IG1vdmUgcERhdGEgcG9pbnRlcgotCQkvLyBiZWNhdXNlIERhdGFTaXplIGV4Y2x1ZGluZyBIVyBwYWRkaW5nCisJLyogNC4gc2tpcCBIVyBwYWRkaW5nICovCisJaWYgKHBSeEQtPkwyUEFEKSB7CisJCS8qIGp1c3QgbW92ZSBwRGF0YSBwb2ludGVyICovCisJCS8qIGJlY2F1c2UgRGF0YVNpemUgZXhjbHVkaW5nIEhXIHBhZGRpbmcgKi8KIAkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX1BBRCk7CiAJCXBSeEJsay0+cERhdGEgKz0gMjsKIAl9CiAKLQlpZiAocFJ4RC0+QkEpCi0JeworCWlmIChwUnhELT5CQSkgewogCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfQU1QRFUpOwogCX0KLQotCS8vCi0JLy8gQ2FzZSBJICBQcm9jZXNzIEJyb2FkY2FzdCAmIE11bHRpY2FzdCBkYXRhIGZyYW1lCi0JLy8KLQlpZiAocFJ4RC0+QmNhc3QgfHwgcFJ4RC0+TWNhc3QpCi0JeworCS8qICovCisJLyogQ2FzZSBJICBQcm9jZXNzIEJyb2FkY2FzdCAmIE11bHRpY2FzdCBkYXRhIGZyYW1lICovCisJLyogKi8KKwlpZiAocFJ4RC0+QmNhc3QgfHwgcFJ4RC0+TWNhc3QpIHsKIAkJSU5DX0NPVU5URVI2NChwQWQtPldsYW5Db3VudGVycy5NdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQpOwogCi0JCS8vIERyb3AgTWNhc3QvQmNhc3QgZnJhbWUgd2l0aCBmcmFnbWVudCBiaXQgb24KLQkJaWYgKHBIZWFkZXItPkZDLk1vcmVGcmFnKQotCQl7Ci0JCQkvLyByZWxlYXNlIHBhY2tldAotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCS8qIERyb3AgTWNhc3QvQmNhc3QgZnJhbWUgd2l0aCBmcmFnbWVudCBiaXQgb24gKi8KKwkJaWYgKHBIZWFkZXItPkZDLk1vcmVGcmFnKSB7CisJCQkvKiByZWxlYXNlIHBhY2tldCAqLworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwKKwkJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQkJcmV0dXJuOwogCQl9Ci0KLQkJLy8gRmlsdGVyIG91dCBCY2FzdCBmcmFtZSB3aGljaCBBUCByZWxheWVkIGZvciB1cwotCQlpZiAocEhlYWRlci0+RkMuRnJEcyAmJiBNQUNfQUREUl9FUVVBTChwSGVhZGVyLT5BZGRyMywgcEFkLT5DdXJyZW50QWRkcmVzcykpCi0JCXsKLQkJCS8vIHJlbGVhc2UgcGFja2V0Ci0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJLyogRmlsdGVyIG91dCBCY2FzdCBmcmFtZSB3aGljaCBBUCByZWxheWVkIGZvciB1cyAqLworCQlpZiAocEhlYWRlci0+RkMuRnJEcworCQkgICAgJiYgTUFDX0FERFJfRVFVQUwocEhlYWRlci0+QWRkcjMsIHBBZC0+Q3VycmVudEFkZHJlc3MpKSB7CisJCQkvKiByZWxlYXNlIHBhY2tldCAqLworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwKKwkJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQkJcmV0dXJuOwogCQl9CiAKIAkJSW5kaWNhdGVfTGVnYWN5X1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwogCQlyZXR1cm47Ci0JfQotCWVsc2UgaWYgKHBSeEQtPlUyTSkKLQl7Ci0JCXBBZC0+TGFzdFJ4UmF0ZSA9IChVU0hPUlQpKChwUnhXSS0+TUNTKSArIChwUnhXSS0+QlcgPDw3KSArIChwUnhXSS0+U2hvcnRHSSA8PDgpKyAocFJ4V0ktPlBIWU1PREUgPDwxNCkpIDsKKwl9IGVsc2UgaWYgKHBSeEQtPlUyTSkgeworCQlwQWQtPkxhc3RSeFJhdGUgPQorCQkgICAgKHUxNikoKHBSeFdJLT5NQ1MpICsgKHBSeFdJLT5CVyA8PCA3KSArCisJCQkgICAgICAocFJ4V0ktPlNob3J0R0kgPDwgOCkgKyAocFJ4V0ktPlBIWU1PREUgPDwgMTQpKTsKIAotCQlpZiAoQURIT0NfT04ocEFkKSkKLQkJeworCQlpZiAoQURIT0NfT04ocEFkKSkgewogCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwSGVhZGVyLT5BZGRyMik7CiAJCQlpZiAocEVudHJ5KQotCQkJCVVwZGF0ZV9Sc3NpX1NhbXBsZShwQWQsICZwRW50cnktPlJzc2lTYW1wbGUsIHBSeFdJKTsKKwkJCQlVcGRhdGVfUnNzaV9TYW1wbGUocEFkLCAmcEVudHJ5LT5Sc3NpU2FtcGxlLAorCQkJCQkJICAgcFJ4V0kpOwogCQl9CiAKLQogCQlVcGRhdGVfUnNzaV9TYW1wbGUocEFkLCAmcEFkLT5TdGFDZmcuUnNzaVNhbXBsZSwgcFJ4V0kpOwogCi0JCXBBZC0+U3RhQ2ZnLkxhc3RTTlIwID0gKFVDSEFSKShwUnhXSS0+U05SMCk7Ci0JCXBBZC0+U3RhQ2ZnLkxhc3RTTlIxID0gKFVDSEFSKShwUnhXSS0+U05SMSk7CisJCXBBZC0+U3RhQ2ZnLkxhc3RTTlIwID0gKHU4KShwUnhXSS0+U05SMCk7CisJCXBBZC0+U3RhQ2ZnLkxhc3RTTlIxID0gKHU4KShwUnhXSS0+U05SMSk7CiAKIAkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rRGF0YUNudCsrOwogCisJCWlmICghKChwSGVhZGVyLT5GcmFnID09IDApICYmIChwSGVhZGVyLT5GQy5Nb3JlRnJhZyA9PSAwKSkpIHsKKwkJCS8qIHJlLWFzc2VtYmxlIHRoZSBmcmFnbWVudGVkIHBhY2tldHMgKi8KKwkJCS8qIHJldHVybiBjb21wbGV0ZSBmcmFtZSAocFJ4UGFja2V0KSBvciBOVUxMICovCisJCQliRnJhZ21lbnQgPSBUUlVFOworCQkJcFJ4UGFja2V0ID0gUlRNUERlRnJhZ21lbnREYXRhRnJhbWUocEFkLCBwUnhCbGspOworCQl9CiAKLSAgICAJaWYgKCEoKHBIZWFkZXItPkZyYWcgPT0gMCkgJiYgKHBIZWFkZXItPkZDLk1vcmVGcmFnID09IDApKSkKLSAgICAJewotICAgIAkJLy8gcmUtYXNzZW1ibGUgdGhlIGZyYWdtZW50ZWQgcGFja2V0cwotICAgIAkJLy8gcmV0dXJuIGNvbXBsZXRlIGZyYW1lIChwUnhQYWNrZXQpIG9yIE5VTEwKLSAgICAJCWJGcmFnbWVudCA9IFRSVUU7Ci0gICAgCQlwUnhQYWNrZXQgPSBSVE1QRGVGcmFnbWVudERhdGFGcmFtZShwQWQsIHBSeEJsayk7Ci0gICAgCX0KLQotICAgIAlpZiAocFJ4UGFja2V0KQotICAgIAl7CisJCWlmIChwUnhQYWNrZXQpIHsKIAkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BSeFdJLT5XaXJlbGVzc0NsaUlEXTsKIAotICAgIAkJLy8gcHJvY2VzcyBjb21wbGV0ZSBmcmFtZQotICAgIAkJaWYgKGJGcmFnbWVudCAmJiAocFJ4RC0+RGVjcnlwdGVkKSAmJiAocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkpCi0gICAgCQl7Ci0JCQkJLy8gTWludXMgTUlDIGxlbmd0aAorCQkJLyogcHJvY2VzcyBjb21wbGV0ZSBmcmFtZSAqLworCQkJaWYgKGJGcmFnbWVudCAmJiAocFJ4RC0+RGVjcnlwdGVkKQorCQkJICAgICYmIChwRW50cnktPldlcFN0YXR1cyA9PQorCQkJCU5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpKSB7CisJCQkJLyogTWludXMgTUlDIGxlbmd0aCAqLwogCQkJCXBSeEJsay0+RGF0YVNpemUgLT0gODsKIAotICAgIAkJCS8vIEZvciBUS0lQIGZyYW1lLCBjYWxjdWxhdGUgdGhlIE1JQyB2YWx1ZQotICAgIAkJCWlmIChTVEFDaGVja1RraXBNSUNWYWx1ZShwQWQsIHBFbnRyeSwgcFJ4QmxrKSA9PSBGQUxTRSkKLSAgICAJCQl7Ci0gICAgCQkJCXJldHVybjsKLSAgICAJCQl9Ci0gICAgCQl9CisJCQkJLyogRm9yIFRLSVAgZnJhbWUsIGNhbGN1bGF0ZSB0aGUgTUlDIHZhbHVlICovCisJCQkJaWYgKFNUQUNoZWNrVGtpcE1JQ1ZhbHVlKHBBZCwgcEVudHJ5LCBwUnhCbGspID09CisJCQkJICAgIEZBTFNFKSB7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CiAKLSAgICAJCVNUQVJ4RGF0YUZyYW1lQW5ub3VuY2UocEFkLCBwRW50cnksIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQkJU1RBUnhEYXRhRnJhbWVBbm5vdW5jZShwQWQsIHBFbnRyeSwgcFJ4QmxrLAorCQkJCQkgICAgICAgRnJvbVdoaWNoQlNTSUQpOwogCQkJcmV0dXJuOwotICAgIAl9Ci0gICAgCWVsc2UKLSAgICAJewotICAgIAkJLy8ganVzdCByZXR1cm4KLSAgICAJCS8vIGJlY2F1c2UgUlRNUERlRnJhZ21lbnREYXRhRnJhbWUoKSB3aWxsIHJlbGVhc2UgcnggcGFja2V0LAotICAgIAkJLy8gaWYgcGFja2V0IGlzIGZyYWdtZW50ZWQKLSAgICAJCXJldHVybjsKLSAgICAJfQorCQl9IGVsc2UgeworCQkJLyoganVzdCByZXR1cm4gKi8KKwkJCS8qIGJlY2F1c2UgUlRNUERlRnJhZ21lbnREYXRhRnJhbWUoKSB3aWxsIHJlbGVhc2UgcnggcGFja2V0LCAqLworCQkJLyogaWYgcGFja2V0IGlzIGZyYWdtZW50ZWQgKi8KKwkJCXJldHVybjsKKwkJfQogCX0KIAogCUFTU0VSVCgwKTsKLQkvLyByZWxlYXNlIHBhY2tldAorCS8qIHJlbGVhc2UgcGFja2V0ICovCiAJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiB9CiAKLVZPSUQgU1RBSGFuZGxlUnhNZ210RnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaykKK3ZvaWQgU1RBSGFuZGxlUnhNZ210RnJhbWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfcnhfYmxrICpwUnhCbGspCiB7Ci0JUFJUMjhYWF9SWERfU1RSVUMJcFJ4RCA9ICYocFJ4QmxrLT5SeEQpOwotCVBSWFdJX1NUUlVDCQlwUnhXSSA9IHBSeEJsay0+cFJ4V0k7Ci0JUEhFQURFUl84MDJfMTEJcEhlYWRlciA9IHBSeEJsay0+cEhlYWRlcjsKLQlQTkRJU19QQUNLRVQJcFJ4UGFja2V0ID0gcFJ4QmxrLT5wUnhQYWNrZXQ7CisJUFJUMjhYWF9SWERfU1RSVUMgcFJ4RCA9ICYocFJ4QmxrLT5SeEQpOworCXN0cnVjdCBydF9yeHdpICogcFJ4V0kgPSBwUnhCbGstPnBSeFdJOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhlYWRlciA9IHBSeEJsay0+cEhlYWRlcjsKKwl2b2lkICpwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKIAotCWRvCi0JeworCWRvIHsKIAotCQkvLyBXZSBzaG91bGQgY29sbGVjdCBSU1NJIG5vdCBvbmx5IFUyTSBkYXRhIGJ1dCBhbHNvIG15IGJlYWNvbgotCQlpZiAocEFkLT5SeEFudC5FdmFsdWF0ZVBlcmlvZCA9PSAwICYmCi0JCSAgICBwSGVhZGVyLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfQkVBQ09OICYmCi0JCSAgICBNQUNfQUREUl9FUVVBTCgmcEFkLT5Db21tb25DZmcuQnNzaWQsICZwSGVhZGVyLT5BZGRyMikpIHsKLQkJCVVwZGF0ZV9Sc3NpX1NhbXBsZShwQWQsICZwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLCBwUnhXSSk7Ci0KLQkJCXBBZC0+U3RhQ2ZnLkxhc3RTTlIwID0gKFVDSEFSKShwUnhXSS0+U05SMCk7Ci0JCQlwQWQtPlN0YUNmZy5MYXN0U05SMSA9IChVQ0hBUikocFJ4V0ktPlNOUjEpOwotCQl9Ci0KLSNpZmRlZiBSVDI4NzAKLQkJLy8gY29sbGVjdCByc3NpIGluZm9ybWF0aW9uIGZvciBhbnRlbm5hIGRpdmVyc2l0eQotCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkFudERpdmVyc2l0eSkKLQkJewotCQkJaWYgKChwUnhELT5VMk0pIHx8ICgocEhlYWRlci0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX0JFQUNPTikgJiYgKE1BQ19BRERSX0VRVUFMKCZwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgJnBIZWFkZXItPkFkZHIyKSkpKQotCQkJewotCQkJCQlDT0xMRUNUX1JYX0FOVEVOTkFfQVZFUkFHRV9SU1NJKHBBZCwgQ29udmVydFRvUnNzaShwQWQsIChVQ0hBUilwUnhXSS0+UlNTSTAsIFJTU0lfMCksIDApOyAvL05vdGU6IFJTU0kyIG5vdCB1c2VkIG9uIFJUNzMKLQkJCQkJcEFkLT5TdGFDZmcuTnVtT2ZBdmdSc3NpU2FtcGxlICsrOworCQkvKiBjaGVjayBpZiBuZWVkIHRvIHJlc2VuZCBQUyBQb2xsIHdoZW4gcmVjZWl2ZWQgcGFja2V0IHdpdGggTW9yZURhdGEgPSAxICovCisJCWlmICgocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKQorCQkgICAgJiYgKHBIZWFkZXItPkZDLk1vcmVEYXRhID09IDEpKSB7CisJCQkvKiBmb3IgVUFQU0QsIGFsbCBtYW5hZ2VtZW50IGZyYW1lcyB3aWxsIGJlIFZPIHByaW9yaXR5ICovCisJCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTyA9PSAwKSB7CisJCQkJLyogbm9uLVVBUFNEIGRlbGl2ZXJ5LWVuYWJsZWQgQUMgKi8KKwkJCQlSVE1QX1BTX1BPTExfRU5RVUVVRShwQWQpOwogCQkJfQogCQl9Ci0jZW5kaWYKIAotCQkvLyBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUKLQkJaWYgKHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPiBNR01UX0RNQV9CVUZGRVJfU0laRSkKLQkJeworCQkvKiBUT0RPOiBpZiBNb3JlRGF0YSA9PSAwLCBzdGF0aW9uIGNhbiBnbyB0byBzbGVlcCAqLworCisJCS8qIFdlIHNob3VsZCBjb2xsZWN0IFJTU0kgbm90IG9ubHkgVTJNIGRhdGEgYnV0IGFsc28gbXkgYmVhY29uICovCisJCWlmICgocEhlYWRlci0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX0JFQUNPTikKKwkJICAgICYmIChNQUNfQUREUl9FUVVBTCgmcEFkLT5Db21tb25DZmcuQnNzaWQsICZwSGVhZGVyLT5BZGRyMikpCisJCSAgICAmJiAocEFkLT5SeEFudC5FdmFsdWF0ZVBlcmlvZCA9PSAwKSkgeworCQkJVXBkYXRlX1Jzc2lfU2FtcGxlKHBBZCwgJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUsIHBSeFdJKTsKKworCQkJcEFkLT5TdGFDZmcuTGFzdFNOUjAgPSAodTgpKHBSeFdJLT5TTlIwKTsKKwkJCXBBZC0+U3RhQ2ZnLkxhc3RTTlIxID0gKHU4KShwUnhXSS0+U05SMSk7CisJCX0KKworCQkvKiBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUgKi8KKwkJaWYgKHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPiBNR01UX0RNQV9CVUZGRVJfU0laRSkgewogCQkJREJHUFJJTlRfRVJSKCgiU1RBSGFuZGxlUnhNZ210RnJhbWU6IGZyYW1lIHRvbyBsYXJnZSwgc2l6ZSA9ICVkIFxuIiwgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCkpOwogCQkJYnJlYWs7CiAJCX0KIAotCQlSRVBPUlRfTUdNVF9GUkFNRV9UT19NTE1FKHBBZCwgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsIHBIZWFkZXIsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsCi0JCQkJCQkJCQlwUnhXSS0+UlNTSTAsIHBSeFdJLT5SU1NJMSwgcFJ4V0ktPlJTU0kyLCBwUnhELT5QbGNwU2lnbmFsKTsKKwkJUkVQT1JUX01HTVRfRlJBTUVfVE9fTUxNRShwQWQsIHBSeFdJLT5XaXJlbGVzc0NsaUlELCBwSGVhZGVyLAorCQkJCQkgIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsCisJCQkJCSAgcFJ4V0ktPlJTU0kwLCBwUnhXSS0+UlNTSTEsCisJCQkJCSAgcFJ4V0ktPlJTU0kyLCBwUnhELT5QbGNwU2lnbmFsKTsKIAl9IHdoaWxlIChGQUxTRSk7CiAKIAlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKIH0KIAotVk9JRCBTVEFIYW5kbGVSeENvbnRyb2xGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrKQordm9pZCBTVEFIYW5kbGVSeENvbnRyb2xGcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaykKIHsKLQlQUlhXSV9TVFJVQwkJcFJ4V0kgPSBwUnhCbGstPnBSeFdJOwotCVBIRUFERVJfODAyXzExCXBIZWFkZXIgPSBwUnhCbGstPnBIZWFkZXI7Ci0JUE5ESVNfUEFDS0VUCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OworCXN0cnVjdCBydF9yeHdpICogcFJ4V0kgPSBwUnhCbGstPnBSeFdJOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhlYWRlciA9IHBSeEJsay0+cEhlYWRlcjsKKwl2b2lkICpwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKIAotCXN3aXRjaCAocEhlYWRlci0+RkMuU3ViVHlwZSkKLQl7Ci0JCWNhc2UgU1VCVFlQRV9CTE9DS19BQ0tfUkVROgotCQkJewotCQkJCUNudGxFbnF1ZXVlRm9yUmVjdihwQWQsIHBSeFdJLT5XaXJlbGVzc0NsaUlELCAocFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCksIChQRlJBTUVfQkFfUkVRKXBIZWFkZXIpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgU1VCVFlQRV9CTE9DS19BQ0s6Ci0JCWNhc2UgU1VCVFlQRV9BQ0s6Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKKwlzd2l0Y2ggKHBIZWFkZXItPkZDLlN1YlR5cGUpIHsKKwljYXNlIFNVQlRZUEVfQkxPQ0tfQUNLX1JFUToKKwkJeworCQkJQ250bEVucXVldWVGb3JSZWN2KHBBZCwgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsCisJCQkJCSAgIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50KSwKKwkJCQkJICAgKHN0cnVjdCBydF9mcmFtZV9iYV9yZXEgKikgcEhlYWRlcik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTVUJUWVBFX0JMT0NLX0FDSzoKKwljYXNlIFNVQlRZUEVfQUNLOgorCWRlZmF1bHQ6CisJCWJyZWFrOwogCX0KIAogCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTY1NCwxNDEgKzY5OCwxMjcgQEAKIAkJTmVlZCB0byBjb25zaWRlciBRT1MgREFUQSBmb3JtYXQgd2hlbiBjb252ZXJ0aW5nIHRvIDgwMi4zCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotQk9PTEVBTiBTVEFSeERvbmVJbnRlcnJ1cHRIYW5kbGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JQk9PTEVBTgkJCWFyZ2MpCitCT09MRUFOIFNUQVJ4RG9uZUludGVycnVwdEhhbmRsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIEJPT0xFQU4gYXJnYykKIHsKLQlORElTX1NUQVRVUwkJCVN0YXR1czsKLQlVSU5UMzIJCQlSeFByb2Nlc3NlZCwgUnhQZW5kaW5nOwotCUJPT0xFQU4JCQliUmVzY2hlZHVsZSA9IEZBTFNFOwotCVJUMjhYWF9SWERfU1RSVUMJKnBSeEQ7Ci0JVUNIQVIJCQkqcERhdGE7Ci0JUFJYV0lfU1RSVUMJCXBSeFdJOwotCVBORElTX1BBQ0tFVAlwUnhQYWNrZXQ7Ci0JUEhFQURFUl84MDJfMTEJcEhlYWRlcjsKLQlSWF9CTEsJCQlSeENlbGw7CisJaW50IFN0YXR1czsKKwl1MzIgUnhQcm9jZXNzZWQsIFJ4UGVuZGluZzsKKwlCT09MRUFOIGJSZXNjaGVkdWxlID0gRkFMU0U7CisJUFJUMjhYWF9SWERfU1RSVUMgcFJ4RDsKKwl1OCAqcERhdGE7CisJc3RydWN0IHJ0X3J4d2kgKiBwUnhXSTsKKwl2b2lkICpwUnhQYWNrZXQ7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGVhZGVyOworCXN0cnVjdCBydF9yeF9ibGsgUnhDZWxsOwogCiAJUnhQcm9jZXNzZWQgPSBSeFBlbmRpbmcgPSAwOwogCi0JLy8gcHJvY2VzcyB3aG9sZSByeCByaW5nCi0Jd2hpbGUgKDEpCi0JeworCS8qIHByb2Nlc3Mgd2hvbGUgcnggcmluZyAqLworCXdoaWxlICgxKSB7CiAKIAkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKLQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKLQkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSB8fAotCQkJIVJUTVBfVEVTVF9GTEFHKHBBZCxmUlRNUF9BREFQVEVSX1NUQVJUX1VQKSkKLQkJeworCQkJCSAgIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCSAgIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8CisJCQkJICAgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSB8fAorCQkgICAgIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpIHsKIAkJCWJyZWFrOwogCQl9Ci0KLSNpZmRlZiBSVDI4NjAKLQkJaWYgKFJ4UHJvY2Vzc2VkKysgPiBNQVhfUlhfUFJPQ0VTU19DTlQpCi0JCXsKLQkJCS8vIG5lZWQgdG8gcmVzY2hlZHVsZSByeCBoYW5kbGUKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkJaWYgKFJ4UHJvY2Vzc2VkKysgPiBNQVhfUlhfUFJPQ0VTU19DTlQpIHsKKwkJCS8qIG5lZWQgdG8gcmVzY2hlZHVsZSByeCBoYW5kbGUgKi8KIAkJCWJSZXNjaGVkdWxlID0gVFJVRTsKIAkJCWJyZWFrOwogCQl9Ci0jZW5kaWYKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAotCQlSeFByb2Nlc3NlZCArKzsgLy8gdGVzdAorCQlSeFByb2Nlc3NlZCsrOwkvKiB0ZXN0ICovCiAKLQkJLy8gMS4gYWxsb2NhdGUgYSBuZXcgZGF0YSBwYWNrZXQgaW50byByeCByaW5nIHRvIHJlcGxhY2UgcmVjZWl2ZWQgcGFja2V0Ci0JCS8vICAgIHRoZW4gcHJvY2Vzc2luZyB0aGUgcmVjZWl2ZWQgcGFja2V0Ci0JCS8vIDIuIHRoZSBjYWxsZWUgbXVzdCB0YWtlIGNoYXJnZSBvZiByZWxlYXNlIG9mIHBhY2tldAotCQkvLyAzLiBBcyBmYXIgYXMgZHJpdmVyIGlzIGNvbmNlcm5lZCAsCi0JCS8vICAgIHRoZSByeCBwYWNrZXQgbXVzdAotCQkvLyAgICAgIGEuIGJlIGluZGljYXRlZCB0byB1cHBlciBsYXllciBvcgotCQkvLyAgICAgIGIuIGJlIHJlbGVhc2VkIGlmIGl0IGlzIGRpc2NhcmRlZAotCQlwUnhQYWNrZXQgPSBHZXRQYWNrZXRGcm9tUnhSaW5nKHBBZCwgJihSeENlbGwuUnhEKSwgJmJSZXNjaGVkdWxlLCAmUnhQZW5kaW5nKTsKLQkJaWYgKHBSeFBhY2tldCA9PSBOVUxMKQotCQl7Ci0JCQkvLyBubyBtb3JlIHBhY2tldCB0byBwcm9jZXNzCisJCS8qIDEuIGFsbG9jYXRlIGEgbmV3IGRhdGEgcGFja2V0IGludG8gcnggcmluZyB0byByZXBsYWNlIHJlY2VpdmVkIHBhY2tldCAqLworCQkvKiAgICB0aGVuIHByb2Nlc3NpbmcgdGhlIHJlY2VpdmVkIHBhY2tldCAqLworCQkvKiAyLiB0aGUgY2FsbGVlIG11c3QgdGFrZSBjaGFyZ2Ugb2YgcmVsZWFzZSBvZiBwYWNrZXQgKi8KKwkJLyogMy4gQXMgZmFyIGFzIGRyaXZlciBpcyBjb25jZXJuZWQgLCAqLworCQkvKiAgICB0aGUgcnggcGFja2V0IG11c3QgKi8KKwkJLyogICAgICBhLiBiZSBpbmRpY2F0ZWQgdG8gdXBwZXIgbGF5ZXIgb3IgKi8KKwkJLyogICAgICBiLiBiZSByZWxlYXNlZCBpZiBpdCBpcyBkaXNjYXJkZWQgKi8KKwkJcFJ4UGFja2V0ID0KKwkJICAgIEdldFBhY2tldEZyb21SeFJpbmcocEFkLCAmKFJ4Q2VsbC5SeEQpLCAmYlJlc2NoZWR1bGUsCisJCQkJCSZSeFBlbmRpbmcpOworCQlpZiAocFJ4UGFja2V0ID09IE5VTEwpIHsKKwkJCS8qIG5vIG1vcmUgcGFja2V0IHRvIHByb2Nlc3MgKi8KIAkJCWJyZWFrOwogCQl9Ci0KLQkJLy8gZ2V0IHJ4IHJpbmcgZGVzY3JpcHRvcgorCQkvKiBnZXQgcnggcmluZyBkZXNjcmlwdG9yICovCiAJCXBSeEQgPSAmKFJ4Q2VsbC5SeEQpOwotCQkvLyBnZXQgcnggZGF0YSBidWZmZXIKLQkJcERhdGEJPSBHRVRfT1NfUEtUX0RBVEFQVFIocFJ4UGFja2V0KTsKLQkJcFJ4V0kJPSAoUFJYV0lfU1RSVUMpIHBEYXRhOwotCQlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSAocERhdGErUlhXSV9TSVpFKSA7CisJCS8qIGdldCByeCBkYXRhIGJ1ZmZlciAqLworCQlwRGF0YSA9IEdFVF9PU19QS1RfREFUQVBUUihwUnhQYWNrZXQpOworCQlwUnhXSSA9IChzdHJ1Y3QgcnRfcnh3aSAqKSBwRGF0YTsKKwkJcEhlYWRlciA9IChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqKSAocERhdGEgKyBSWFdJX1NJWkUpOwogCi0JCS8vIGJ1aWxkIFJ4Q2VsbAorCQkvKiBidWlsZCBSeENlbGwgKi8KIAkJUnhDZWxsLnBSeFdJID0gcFJ4V0k7CiAJCVJ4Q2VsbC5wSGVhZGVyID0gcEhlYWRlcjsKIAkJUnhDZWxsLnBSeFBhY2tldCA9IHBSeFBhY2tldDsKLQkJUnhDZWxsLnBEYXRhID0gKFVDSEFSICopIHBIZWFkZXI7CisJCVJ4Q2VsbC5wRGF0YSA9ICh1OCAqKSBwSGVhZGVyOwogCQlSeENlbGwuRGF0YVNpemUgPSBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50OwogCQlSeENlbGwuRmxhZ3MgPSAwOwogCi0JCS8vIEluY3JlYXNlIFRvdGFsIHJlY2VpdmUgYnl0ZSBjb3VudGVyIGFmdGVyIHJlYWwgZGF0YSByZWNlaXZlZCBubyBtYXRlciBhbnkgZXJyb3Igb3Igbm90Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuUmVjZWl2ZWRCeXRlQ291bnQgKz0gIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQ7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudCArKzsKKwkJLyogSW5jcmVhc2UgVG90YWwgcmVjZWl2ZSBieXRlIGNvdW50ZXIgYWZ0ZXIgcmVhbCBkYXRhIHJlY2VpdmVkIG5vIG1hdGVyIGFueSBlcnJvciBvciBub3QgKi8KKwkJcEFkLT5SYWxpbmtDb3VudGVycy5SZWNlaXZlZEJ5dGVDb3VudCArPQorCQkgICAgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSZWNlaXZlZEJ5dGVDb3VudCArPQorCQkgICAgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50Kys7CiAKIAkJSU5DX0NPVU5URVI2NChwQWQtPldsYW5Db3VudGVycy5SZWNlaXZlZEZyYWdtZW50Q291bnQpOwogCiAJCWlmIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50IDwgMTQpCiAJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwogCi0gICAgICAgIGlmIChNT05JVE9SX09OKHBBZCkpCi0JCXsKLSAgICAgICAgICAgIHNlbmRfbW9uaXRvcl9wYWNrZXRzKHBBZCwgJlJ4Q2VsbCk7CisJCWlmIChNT05JVE9SX09OKHBBZCkpIHsKKwkJCXNlbmRfbW9uaXRvcl9wYWNrZXRzKHBBZCwgJlJ4Q2VsbCk7CiAJCQlicmVhazsKIAkJfQotCQkvKiBSVDI4NzAgaW52b2tlcyBTVEFSeERvbmVJbnRlcnJ1cHRIYW5kbGUoKSBpbiBydHVzYl9idWxrLmMgKi8KIAotCQkvLyBDaGVjayBmb3IgYWxsIFJ4RCBlcnJvcnMKKwkJLyogU1RBUnhEb25lSW50ZXJydXB0SGFuZGxlKCkgaXMgY2FsbGVkIGluIHJ0dXNiX2J1bGsuYyAqLworCisJCS8qIENoZWNrIGZvciBhbGwgUnhEIGVycm9ycyAqLwogCQlTdGF0dXMgPSBSVE1QQ2hlY2tSeEVycm9yKHBBZCwgcEhlYWRlciwgcFJ4V0ksIHBSeEQpOwogCi0JCS8vIEhhbmRsZSB0aGUgcmVjZWl2ZWQgZnJhbWUKLQkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQotCQl7Ci0JCQlzd2l0Y2ggKHBIZWFkZXItPkZDLlR5cGUpCi0JCQl7Ci0JCQkJLy8gQ0FTRSBJLCByZWNlaXZlIGEgREFUQSBmcmFtZQotCQkJCWNhc2UgQlRZUEVfREFUQToKKwkJLyogSGFuZGxlIHRoZSByZWNlaXZlZCBmcmFtZSAqLworCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXN3aXRjaCAocEhlYWRlci0+RkMuVHlwZSkgeworCQkJCS8qIENBU0UgSSwgcmVjZWl2ZSBhIERBVEEgZnJhbWUgKi8KKwkJCWNhc2UgQlRZUEVfREFUQToKIAkJCQl7Ci0JCQkJCS8vIHByb2Nlc3MgREFUQSBmcmFtZQorCQkJCQkvKiBwcm9jZXNzIERBVEEgZnJhbWUgKi8KIAkJCQkJU1RBSGFuZGxlUnhEYXRhRnJhbWUocEFkLCAmUnhDZWxsKTsKIAkJCQl9CiAJCQkJYnJlYWs7Ci0JCQkJLy8gQ0FTRSBJSSwgcmVjZWl2ZSBhIE1HTVQgZnJhbWUKLQkJCQljYXNlIEJUWVBFX01HTVQ6CisJCQkJLyogQ0FTRSBJSSwgcmVjZWl2ZSBhIE1HTVQgZnJhbWUgKi8KKwkJCWNhc2UgQlRZUEVfTUdNVDoKIAkJCQl7CiAJCQkJCVNUQUhhbmRsZVJ4TWdtdEZyYW1lKHBBZCwgJlJ4Q2VsbCk7CiAJCQkJfQogCQkJCWJyZWFrOwotCQkJCS8vIENBU0UgSUlJLiByZWNlaXZlIGEgQ05UTCBmcmFtZQotCQkJCWNhc2UgQlRZUEVfQ05UTDoKKwkJCQkvKiBDQVNFIElJSS4gcmVjZWl2ZSBhIENOVEwgZnJhbWUgKi8KKwkJCWNhc2UgQlRZUEVfQ05UTDoKIAkJCQl7CiAJCQkJCVNUQUhhbmRsZVJ4Q29udHJvbEZyYW1lKHBBZCwgJlJ4Q2VsbCk7CiAJCQkJfQogCQkJCWJyZWFrOwotCQkJCS8vIGRpc2NhcmQgb3RoZXIgdHlwZQotCQkJCWRlZmF1bHQ6Ci0JCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJCQlicmVhazsKKwkJCQkvKiBkaXNjYXJkIG90aGVyIHR5cGUgKi8KKwkJCWRlZmF1bHQ6CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwKKwkJCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQlicmVhazsKIAkJCX0KLQkJfQotCQllbHNlCi0JCXsKKwkJfSBlbHNlIHsKIAkJCXBBZC0+Q291bnRlcnM4MDIzLlJ4RXJyb3JzKys7Ci0JCQkvLyBkaXNjYXJkIHRoaXMgZnJhbWUKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJLyogZGlzY2FyZCB0aGlzIGZyYW1lICovCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LAorCQkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCX0KIAl9CiAKLSNpZmRlZiBSVDI4NjAKLQkvLyBmUlRNUF9QU19HT19UT19TTEVFUF9OT1cgaXMgc2V0IGlmIHJlY2VpdmluZyBiZWFjb24uCi0JaWYgKFJUTVBfVEVTVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19HT19UT19TTEVFUF9OT1cpICYmIChJTkZSQV9PTihwQWQpKSkKLQl7Ci0JCVJUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfR09fVE9fU0xFRVBfTk9XKTsKLQkJQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAocEFkLCBwQWQtPlRoaXNUYnR0TnVtVG9OZXh0V2FrZVVwKTsKLQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKLQl9Ci0jZW5kaWYKIAlyZXR1cm4gYlJlc2NoZWR1bGU7CiB9CiAKQEAgLTgwMywxNSArODMzLDkgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJUlRNUEhhbmRsZVR3YWtldXBJbnRlcnJ1cHQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCit2b2lkIFJUTVBIYW5kbGVUd2FrZXVwSW50ZXJydXB0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLSNpZmRlZiBSVDI4NjAKLQlBc2ljRm9yY2VXYWtldXAocEFkLCBET1QxMVBPV0VSU0FWRSk7Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKIAlBc2ljRm9yY2VXYWtldXAocEFkLCBGQUxTRSk7Ci0jZW5kaWYKIH0KIAogLyoKQEAgLTgyMCw5ICs4NDQsOSBAQAogICAgIEVhcmx5IGNoZWNraW5nIGFuZCBPUy1kZXBlbmVkIHBhcnNpbmcgZm9yIFR4IHBhY2tldCBzZW5kIHRvIG91ciBTVEEgZHJpdmVyLgogCiBBcmd1bWVudHM6Ci0gICAgTkRJU19IQU5ETEUgCU1pbmlwb3J0QWRhcHRlckNvbnRleHQJUG9pbnRlciByZWZlciB0byB0aGUgZGV2aWNlIGhhbmRsZSwgaS5lLiwgdGhlIHBBZC4KLQlQUE5ESVNfUEFDS0VUCXBwUGFja2V0QXJyYXkJCQlUaGUgcGFja2V0IGFycmF5IG5lZWQgdG8gZG8gdHJhbnNtaXNzaW9uLgotCVVJTlQJCQlOdW1iZXJPZlBhY2tldHMJCQlOdW1iZXIgb2YgcGFja2V0IGluIHBhY2tldCBhcnJheS4KKyAgICB2b2lkICoJTWluaXBvcnRBZGFwdGVyQ29udGV4dAlQb2ludGVyIHJlZmVyIHRvIHRoZSBkZXZpY2UgaGFuZGxlLCBpLmUuLCB0aGUgcEFkLgorCXZvaWQgKioJcHBQYWNrZXRBcnJheQkJCVRoZSBwYWNrZXQgYXJyYXkgbmVlZCB0byBkbyB0cmFuc21pc3Npb24uCisJdTMyCQkJTnVtYmVyT2ZQYWNrZXRzCQkJTnVtYmVyIG9mIHBhY2tldCBpbiBwYWNrZXQgYXJyYXkuCiAKIFJldHVybiBWYWx1ZToKIAlOT05FCkBAIC04MzIsNDcgKzg1NiwzOSBAQAogCVlvdSBvbmx5IGNhbiBwdXQgT1MtZGVwZW5lZCAmIFNUQSByZWxhdGVkIGNvZGUgaW4gaGVyZS4KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgU1RBU2VuZFBhY2tldHMoCi0JSU4JTkRJU19IQU5ETEUJCU1pbmlwb3J0QWRhcHRlckNvbnRleHQsCi0JSU4JUFBORElTX1BBQ0tFVAlwcFBhY2tldEFycmF5LAotCUlOCVVJTlQJCQlOdW1iZXJPZlBhY2tldHMpCit2b2lkIFNUQVNlbmRQYWNrZXRzKHZvaWQgKk1pbmlwb3J0QWRhcHRlckNvbnRleHQsCisJCSAgICB2b2lkICoqcHBQYWNrZXRBcnJheSwgdTMyIE51bWJlck9mUGFja2V0cykKIHsKLQlVSU5UCQkJSW5kZXg7Ci0JUFJUTVBfQURBUFRFUglwQWQgPSAoUFJUTVBfQURBUFRFUikgTWluaXBvcnRBZGFwdGVyQ29udGV4dDsKLQlQTkRJU19QQUNLRVQJcFBhY2tldDsKLQlCT09MRUFOCQkJYWxsb3dUb1NlbmQgPSBGQUxTRTsKKwl1MzIgSW5kZXg7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilNaW5pcG9ydEFkYXB0ZXJDb250ZXh0OworCXZvaWQgKnBQYWNrZXQ7CisJQk9PTEVBTiBhbGxvd1RvU2VuZCA9IEZBTFNFOwogCi0KLQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOdW1iZXJPZlBhY2tldHM7IEluZGV4KyspCi0JeworCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE51bWJlck9mUGFja2V0czsgSW5kZXgrKykgewogCQlwUGFja2V0ID0gcHBQYWNrZXRBcnJheVtJbmRleF07CiAKLQkJZG8KLQkJewotCQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykgfHwKLQkJCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykgfHwKLQkJCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKLQkJCXsKLQkJCQkvLyBEcm9wIHNlbmQgcmVxdWVzdCBzaW5jZSBoYXJkd2FyZSBpcyBpbiByZXNldCBzdGF0ZQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYgKCFJTkZSQV9PTihwQWQpICYmICFBREhPQ19PTihwQWQpKQotCQkJewotCQkJCS8vIERyb3Agc2VuZCByZXF1ZXN0IHNpbmNlIHRoZXJlIGFyZSBubyBwaHlzaWNhbCBjb25uZWN0aW9uIHlldAotCQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyBSZWNvcmQgdGhhdCBvcmlnbmFsIHBhY2tldCBzb3VyY2UgaXMgZnJvbSBORElTIGxheWVyLHNvIHRoYXQKLQkJCQkvLyBsYXRlciBvbiBkcml2ZXIga25vd3MgaG93IHRvIHJlbGVhc2UgdGhpcyBORElTIFBBQ0tFVAotCQkJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQsIDApOyAvLyB0aGlzIGZpZWxkIGlzIHVzZWxlc3Mgd2hlbiBpbiBTVEEgbW9kZQorCQlkbyB7CisJCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKQorCQkJICAgIHx8IFJUTVBfVEVTVF9GTEFHKHBBZCwKKwkJCQkJICAgICAgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKQorCQkJICAgIHx8IFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKSB7CisJCQkJLyogRHJvcCBzZW5kIHJlcXVlc3Qgc2luY2UgaGFyZHdhcmUgaXMgaW4gcmVzZXQgc3RhdGUgKi8KKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoIUlORlJBX09OKHBBZCkgJiYgIUFESE9DX09OKHBBZCkpIHsKKwkJCQkvKiBEcm9wIHNlbmQgcmVxdWVzdCBzaW5jZSB0aGVyZSBhcmUgbm8gcGh5c2ljYWwgY29ubmVjdGlvbiB5ZXQgKi8KKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJLyogUmVjb3JkIHRoYXQgb3JpZ25hbCBwYWNrZXQgc291cmNlIGlzIGZyb20gTkRJUyBsYXllcixzbyB0aGF0ICovCisJCQkJLyogbGF0ZXIgb24gZHJpdmVyIGtub3dzIGhvdyB0byByZWxlYXNlIHRoaXMgTkRJUyBQQUNLRVQgKi8KKwkJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCAwKTsJLyogdGhpcyBmaWVsZCBpcyB1c2VsZXNzIHdoZW4gaW4gU1RBIG1vZGUgKi8KIAkJCQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKHBQYWNrZXQsIFBLVFNSQ19ORElTKTsKLQkJCQlORElTX1NFVF9QQUNLRVRfU1RBVFVTKHBQYWNrZXQsIE5ESVNfU1RBVFVTX1BFTkRJTkcpOworCQkJCU5ESVNfU0VUX1BBQ0tFVF9TVEFUVVMocFBhY2tldCwKKwkJCQkJCSAgICAgICBORElTX1NUQVRVU19QRU5ESU5HKTsKIAkJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlBlbmRpbmdOZGlzUGFja2V0Q291bnQrKzsKIAogCQkJCWFsbG93VG9TZW5kID0gVFJVRTsKIAkJCX0KLQkJfSB3aGlsZShGQUxTRSk7CisJCX0gd2hpbGUgKEZBTFNFKTsKIAogCQlpZiAoYWxsb3dUb1NlbmQgPT0gVFJVRSkKIAkJCVNUQVNlbmRQYWNrZXQocEFkLCBwUGFja2V0KTsKQEAgLTg4MCwxMiArODk2LDExIEBACiAJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJfQogCi0JLy8gRGVxdWV1ZSBvdXRnb2luZyBmcmFtZXMgZnJvbSBUeFN3UXVldWVbXSBhbmQgcHJvY2VzcyBpdAorCS8qIERlcXVldWUgb3V0Z29pbmcgZnJhbWVzIGZyb20gVHhTd1F1ZXVlW10gYW5kIHByb2Nlc3MgaXQgKi8KIAlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOwogCiB9CiAKLQogLyoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogUm91dGluZSBEZXNjcmlwdGlvbjoKQEAgLTg5OCwyMDEgKzkxMywxOTkgQEAKIAlwUGFja2V0IAlQb2ludGVyIHRvIHNlbmQgcGFja2V0CiAKIFJldHVybiBWYWx1ZToKLQlORElTX1NUQVRVU19TVUNDRVNTCQkJSWYgc3VjY2VzIHRvIHF1ZXVlIHRoZSBwYWNrZXQgaW50byBUeFN3UXVldWUuCisJTkRJU19TVEFUVVNfU1VDQ0VTUwkJCUlmIHN1Y2Nlc3MgdG8gcXVldWUgdGhlIHBhY2tldCBpbnRvIFR4U3dRdWV1ZS4KIAlORElTX1NUQVRVU19GQUlMVVJFCQkJSWYgZmFpbGVkIHRvIGRvIGVuLXF1ZXVlLgogCiBOb3RlOgogCVlvdSBvbmx5IGNhbiBwdXQgT1MtaW5kZXBlbmVkICYgU1RBIHJlbGF0ZWQgY29kZSBpbiBoZXJlLgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotTkRJU19TVEFUVVMgU1RBU2VuZFBhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKK2ludCBTVEFTZW5kUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdm9pZCAqcFBhY2tldCkKIHsKLQlQQUNLRVRfSU5GTyAJUGFja2V0SW5mbzsKLQlQVUNIQVIJCQlwU3JjQnVmVkE7Ci0JVUlOVAkJCVNyY0J1ZkxlbjsKLQlVSU5UCQkJQWxsb3dGcmFnU2l6ZTsKLQlVQ0hBUgkJCU51bWJlck9mRnJhZzsKLQlVQ0hBUgkJCVF1ZUlkeCwgVXNlclByaW9yaXR5OwotCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTDsKLQl1bnNpZ25lZCBpbnQgCUlycUZsYWdzOwotCVVDSEFSCQkJRmxnSXNJUCA9IDA7Ci0JVUNIQVIJCQlSYXRlOworCXN0cnVjdCBydF9wYWNrZXRfaW5mbyBQYWNrZXRJbmZvOworCXU4ICpwU3JjQnVmVkE7CisJdTMyIFNyY0J1ZkxlbjsKKwl1MzIgQWxsb3dGcmFnU2l6ZTsKKwl1OCBOdW1iZXJPZkZyYWc7CisJdTggUlRTUmVxdWlyZWQ7CisJdTggUXVlSWR4LCBVc2VyUHJpb3JpdHk7CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5ID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgSXJxRmxhZ3M7CisJdTggRmxnSXNJUCA9IDA7CisJdTggUmF0ZTsKIAotCS8vIFByZXBhcmUgcGFja2V0IGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgYnVmZmVyIGRlc2NyaXB0b3IKLQkvLyBjaGFpbmVkIHdpdGhpbiBhIHNpbmdsZSBORElTIHBhY2tldC4KKwkvKiBQcmVwYXJlIHBhY2tldCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIGJ1ZmZlciBkZXNjcmlwdG9yICovCisJLyogY2hhaW5lZCB3aXRoaW4gYSBzaW5nbGUgTkRJUyBwYWNrZXQuICovCiAJUlRNUF9RdWVyeVBhY2tldEluZm8ocFBhY2tldCwgJlBhY2tldEluZm8sICZwU3JjQnVmVkEsICZTcmNCdWZMZW4pOwogCi0JaWYgKHBTcmNCdWZWQSA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJTVEFTZW5kUGFja2V0IC0tPiBwU3JjQnVmVkEgPT0gTlVMTCAhISFTcmNCdWZMZW49JXhcbiIsU3JjQnVmTGVuKSk7Ci0JCS8vIFJlc291cmVjZSBpcyBsb3csIHN5c3RlbSBkaWQgbm90IGFsbG9jYXRlIHZpcnR1YWwgYWRkcmVzcwotCQkvLyByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRSBkaXJlY3RseSB0byB1cHBlciBsYXllcgorCWlmIChwU3JjQnVmVkEgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIlNUQVNlbmRQYWNrZXQgLS0+IHBTcmNCdWZWQSA9PSBOVUxMICFTcmNCdWZMZW49JXhcbiIsCisJCQkgIFNyY0J1ZkxlbikpOworCQkvKiBSZXNvdXJlY2UgaXMgbG93LCBzeXN0ZW0gZGlkIG5vdCBhbGxvY2F0ZSB2aXJ0dWFsIGFkZHJlc3MgKi8KKwkJLyogcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkUgZGlyZWN0bHkgdG8gdXBwZXIgbGF5ZXIgKi8KIAkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKIAl9CiAKLQotCWlmIChTcmNCdWZMZW4gPCAxNCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiU1RBU2VuZFBhY2tldCAtLT4gTmRpcyBQYWNrZXQgYnVmZmVyIGVycm9yICEhIVxuIikpOworCWlmIChTcmNCdWZMZW4gPCAxNCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIlNUQVNlbmRQYWNrZXQgLS0+IE5kaXMgUGFja2V0IGJ1ZmZlciBlcnJvciFcbiIpKTsKIAkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCX0KLQotCS8vIEluIEhUIHJhdGUgYWRob2MgbW9kZSwgQS1NUERVIGlzIG9mdGVuIHVzZWQuIFNvIG5lZWQgdG8gbG9va3VwIEJBIFRhYmxlIGFuZCBNQUMgRW50cnkuCi0JLy8gTm90ZSBtdWx0aWNhc3QgcGFja2V0cyBpbiBhZGhvYyBhbHNvIHVzZSBCU1NJRF9XQ0lEIGluZGV4LgorCS8qIEluIEhUIHJhdGUgYWRob2MgbW9kZSwgQS1NUERVIGlzIG9mdGVuIHVzZWQuIFNvIG5lZWQgdG8gbG9va3VwIEJBIFRhYmxlIGFuZCBNQUMgRW50cnkuICovCisJLyogTm90ZSBtdWx0aWNhc3QgcGFja2V0cyBpbiBhZGhvYyBhbHNvIHVzZSBCU1NJRF9XQ0lEIGluZGV4LiAqLwogCXsKLQkJaWYoSU5GUkFfT04ocEFkKSkKLQkJeworCQlpZiAoSU5GUkFfT04ocEFkKSkgewogCQkJewotCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07Ci0JCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCBCU1NJRF9XQ0lEKTsKLQkJCVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5UeFJhdGU7Ci0JCX0KLQkJfQotCQllbHNlIGlmIChBREhPQ19PTihwQWQpKQotCQl7Ci0JCQlpZiAoKnBTcmNCdWZWQSAmIDB4MDEpCi0JCQl7CisJCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisJCQkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocFBhY2tldCwgQlNTSURfV0NJRCk7CisJCQkJUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZTsKKwkJCX0KKwkJfSBlbHNlIGlmIChBREhPQ19PTihwQWQpKSB7CisJCQlpZiAoKnBTcmNCdWZWQSAmIDB4MDEpIHsKIAkJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCBNQ0FTVF9XQ0lEKTsKIAkJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKKwkJCX0gZWxzZSB7CiAJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwU3JjQnVmVkEpOwogCQkJfQogCQkJUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZTsKIAkJfQogCX0KIAotCWlmICghcEVudHJ5KQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJTVEFTZW5kUGFja2V0LT5DYW5ub3QgZmluZCBwRW50cnkoJTJ4OiUyeDolMng6JTJ4OiUyeDolMngpIGluIE1hY1RhYiFcbiIsIFBSSU5UX01BQyhwU3JjQnVmVkEpKSk7Ci0JCS8vIFJlc291cmVjZSBpcyBsb3csIHN5c3RlbSBkaWQgbm90IGFsbG9jYXRlIHZpcnR1YWwgYWRkcmVzcwotCQkvLyByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRSBkaXJlY3RseSB0byB1cHBlciBsYXllcgorCWlmICghcEVudHJ5KSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiU1RBU2VuZFBhY2tldC0+Q2Fubm90IGZpbmQgcEVudHJ5KCUyeDolMng6JTJ4OiUyeDolMng6JTJ4KSBpbiBNYWNUYWIhXG4iLAorCQkJICBQUklOVF9NQUMocFNyY0J1ZlZBKSkpOworCQkvKiBSZXNvdXJlY2UgaXMgbG93LCBzeXN0ZW0gZGlkIG5vdCBhbGxvY2F0ZSB2aXJ0dWFsIGFkZHJlc3MgKi8KKwkJLyogcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkUgZGlyZWN0bHkgdG8gdXBwZXIgbGF5ZXIgKi8KIAkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKIAl9CiAKIAlpZiAoQURIT0NfT04ocEFkKQotCQkpCi0JewotCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCAoVUNIQVIpcEVudHJ5LT5BaWQpOworCSAgICApIHsKKwkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocFBhY2tldCwgKHU4KXBFbnRyeS0+QWlkKTsKIAl9Ci0KLQkvLwotCS8vIENoZWNrIHRoZSBFdGhlcm5ldCBGcmFtZSB0eXBlIG9mIHRoaXMgcGFja2V0LCBhbmQgc2V0IHRoZSBSVE1QX1NFVF9QQUNLRVRfU1BFQ0lGSUMgZmxhZ3MuCi0JLy8JCUhlcmUgd2Ugc2V0IHRoZSBQQUNLRVRfU1BFQ0lGSUMgZmxhZ3MoTExDLCBWTEFOLCBESENQL0FSUCwgRUFQT0wpLgorCS8qICovCisJLyogQ2hlY2sgdGhlIEV0aGVybmV0IEZyYW1lIHR5cGUgb2YgdGhpcyBwYWNrZXQsIGFuZCBzZXQgdGhlIFJUTVBfU0VUX1BBQ0tFVF9TUEVDSUZJQyBmbGFncy4gKi8KKwkvKiAgICAgICAgICAgICAgSGVyZSB3ZSBzZXQgdGhlIFBBQ0tFVF9TUEVDSUZJQyBmbGFncyhMTEMsIFZMQU4sIERIQ1AvQVJQLCBFQVBPTCkuICovCiAJUlRNUENoZWNrRXRoZXJUeXBlKHBBZCwgcFBhY2tldCk7CiAKLQotCi0JLy8KLQkvLyBXUEEgODAyLjF4IHNlY3VyZWQgcG9ydCBjb250cm9sIC0gZHJvcCBhbGwgbm9uLTgwMi4xeCBmcmFtZSBiZWZvcmUgcG9ydCBzZWN1cmVkCi0JLy8KKwkvKiAqLworCS8qIFdQQSA4MDIuMXggc2VjdXJlZCBwb3J0IGNvbnRyb2wgLSBkcm9wIGFsbCBub24tODAyLjF4IGZyYW1lIGJlZm9yZSBwb3J0IHNlY3VyZWQgKi8KKwkvKiAqLwogCWlmICgoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKLQkJIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8Ci0JCSAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKLQkJIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQotCQkgIHx8IChwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gVFJVRSkKLQkJICApCi0JCSAgJiYgKChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpIHx8IChwQWQtPlN0YUNmZy5NaWNFcnJDbnQgPj0gMikpCi0JCSAgJiYgKFJUTVBfR0VUX1BBQ0tFVF9FQVBPTChwUGFja2V0KT09IEZBTFNFKQotCQkgICkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBU2VuZFBhY2tldCAtLT4gRHJvcCBwYWNrZXQgYmVmb3JlIHBvcnQgc2VjdXJlZCAhISFcbiIpKTsKKwkgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisJICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKKwkgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorCSAgICAgfHwgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBUUlVFKQorCSAgICApCisJICAgICYmICgocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKQorCQl8fCAocEFkLT5TdGFDZmcuTWljRXJyQ250ID49IDIpKQorCSAgICAmJiAoUlRNUF9HRVRfUEFDS0VUX0VBUE9MKHBQYWNrZXQpID09IEZBTFNFKQorCSAgICApIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJTVEFTZW5kUGFja2V0IC0tPiBEcm9wIHBhY2tldCBiZWZvcmUgcG9ydCBzZWN1cmVkIVxuIikpOwogCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAKIAkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKIAl9CiAKKwkvKiBTVEVQIDEuIERlY2lkZSBudW1iZXIgb2YgZnJhZ21lbnRzIHJlcXVpcmVkIHRvIGRlbGl2ZXIgdGhpcyBNU0RVLiAqLworCS8qICAgICAgICAgVGhlIGVzdGltYXRpb24gaGVyZSBpcyBub3QgdmVyeSBhY2N1cmF0ZSBiZWNhdXNlIGRpZmZpY3VsdCB0byAqLworCS8qICAgICAgICAgdGFrZSBlbmNyeXB0aW9uIG92ZXJoZWFkIGludG8gY29uc2lkZXJhdGlvbiBoZXJlLiBUaGUgcmVzdWx0ICovCisJLyogICAgICAgICAiTnVtYmVyT2ZGcmFnIiBpcyB0aGVuIGp1c3QgdXNlZCB0byBwcmUtY2hlY2sgaWYgZW5vdWdoIGZyZWUgKi8KKwkvKiAgICAgICAgIFRYRCBhcmUgYXZhaWxhYmxlIHRvIGhvbGQgdGhpcyBNU0RVLiAqLwogCi0JLy8gU1RFUCAxLiBEZWNpZGUgbnVtYmVyIG9mIGZyYWdtZW50cyByZXF1aXJlZCB0byBkZWxpdmVyIHRoaXMgTVNEVS4KLQkvLwkgICBUaGUgZXN0aW1hdGlvbiBoZXJlIGlzIG5vdCB2ZXJ5IGFjY3VyYXRlIGJlY2F1c2UgZGlmZmljdWx0IHRvCi0JLy8JICAgdGFrZSBlbmNyeXB0aW9uIG92ZXJoZWFkIGludG8gY29uc2lkZXJhdGlvbiBoZXJlLiBUaGUgcmVzdWx0Ci0JLy8JICAgIk51bWJlck9mRnJhZyIgaXMgdGhlbiBqdXN0IHVzZWQgdG8gcHJlLWNoZWNrIGlmIGVub3VnaCBmcmVlCi0JLy8JICAgVFhEIGFyZSBhdmFpbGFibGUgdG8gaG9sZCB0aGlzIE1TRFUuCi0KLQotCWlmICgqcFNyY0J1ZlZBICYgMHgwMSkJLy8gZnJhZ21lbnRhdGlvbiBub3QgYWxsb3dlZCBvbiBtdWx0aWNhc3QgJiBicm9hZGNhc3QKKwlpZiAoKnBTcmNCdWZWQSAmIDB4MDEpCS8qIGZyYWdtZW50YXRpb24gbm90IGFsbG93ZWQgb24gbXVsdGljYXN0ICYgYnJvYWRjYXN0ICovCiAJCU51bWJlck9mRnJhZyA9IDE7CiAJZWxzZSBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpKQotCQlOdW1iZXJPZkZyYWcgPSAxOwkvLyBBZ2dyZWdhdGlvbiBvdmVyd2hlbG1zIGZyYWdtZW50YXRpb24KKwkJTnVtYmVyT2ZGcmFnID0gMTsJLyogQWdncmVnYXRpb24gb3ZlcndoZWxtcyBmcmFnbWVudGF0aW9uICovCiAJZWxzZSBpZiAoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQpKQotCQlOdW1iZXJPZkZyYWcgPSAxOwkvLyBBZ2dyZWdhdGlvbiBvdmVyd2hlbG1zIGZyYWdtZW50YXRpb24KLQllbHNlIGlmICgocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREUgPT0gTU9ERV9IVE1JWCkgfHwgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID09IE1PREVfSFRHUkVFTkZJRUxEKSkKLQkJTnVtYmVyT2ZGcmFnID0gMTsJLy8gTUlNTyBSQVRFIG92ZXJ3aGVsbXMgZnJhZ21lbnRhdGlvbgotCWVsc2UKLQl7Ci0JCS8vIFRoZSBjYWxjdWxhdGVkICJOdW1iZXJPZkZyYWciIGlzIGEgcm91Z2ggZXN0aW1hdGlvbiBiZWNhdXNlIG9mIHZhcmlvdXMKLQkJLy8gZW5jcnlwdGlvbi9lbmNhcHN1bGF0aW9uIG92ZXJoZWFkIG5vdCB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uIFRoaXMgbnVtYmVyIGlzIGp1c3QKLQkJLy8gdXNlZCB0byBtYWtlIHN1cmUgZW5vdWdoIGZyZWUgVFhEIGFyZSBhdmFpbGFibGUgYmVmb3JlIGZyYWdtZW50YXRpb24gdGFrZXMgcGxhY2UuCi0JCS8vIEluIGNhc2UgdGhlIGFjdHVhbCByZXF1aXJlZCBudW1iZXIgb2YgZnJhZ21lbnRzIG9mIGFuIE5ESVMgcGFja2V0Ci0JCS8vIGV4Y2NlZWRzICJOdW1iZXJPZkZyYWciY2FjdWxhdGVkIGhlcmUgYW5kIG5vdCBlbm91Z2ggZnJlZSBUWEQgYXZhaWxhYmxlLCB0aGUKLQkJLy8gbGFzdCBmcmFnbWVudCAoaS5lLiBsYXN0IE1QRFUpIHdpbGwgYmUgZHJvcHBlZCBpbiBSVE1QSGFyZFRyYW5zbWl0KCkgZHVlIHRvIG91dCBvZgotCQkvLyByZXNvdXJjZSwgYW5kIHRoZSBORElTIHBhY2tldCB3aWxsIGJlIGluZGljYXRlZCBORElTX1NUQVRVU19GQUlMVVJFLiBUaGlzIHNob3VsZAotCQkvLyByYXJlbHkgaGFwcGVuIGFuZCB0aGUgcGVuYWx0eSBpcyBqdXN0IGxpa2UgYSBUWCBSRVRSWSBmYWlsLiBBZmZvcmRhYmxlLgorCQlOdW1iZXJPZkZyYWcgPSAxOwkvKiBBZ2dyZWdhdGlvbiBvdmVyd2hlbG1zIGZyYWdtZW50YXRpb24gKi8KKwllbHNlIGlmICgocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREUgPT0gTU9ERV9IVE1JWCkKKwkJIHx8IChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9PSBNT0RFX0hUR1JFRU5GSUVMRCkpCisJCU51bWJlck9mRnJhZyA9IDE7CS8qIE1JTU8gUkFURSBvdmVyd2hlbG1zIGZyYWdtZW50YXRpb24gKi8KKwllbHNlIHsKKwkJLyogVGhlIGNhbGN1bGF0ZWQgIk51bWJlck9mRnJhZyIgaXMgYSByb3VnaCBlc3RpbWF0aW9uIGJlY2F1c2Ugb2YgdmFyaW91cyAqLworCQkvKiBlbmNyeXB0aW9uL2VuY2Fwc3VsYXRpb24gb3ZlcmhlYWQgbm90IHRha2VuIGludG8gY29uc2lkZXJhdGlvbi4gVGhpcyBudW1iZXIgaXMganVzdCAqLworCQkvKiB1c2VkIHRvIG1ha2Ugc3VyZSBlbm91Z2ggZnJlZSBUWEQgYXJlIGF2YWlsYWJsZSBiZWZvcmUgZnJhZ21lbnRhdGlvbiB0YWtlcyBwbGFjZS4gKi8KKwkJLyogSW4gY2FzZSB0aGUgYWN0dWFsIHJlcXVpcmVkIG51bWJlciBvZiBmcmFnbWVudHMgb2YgYW4gTkRJUyBwYWNrZXQgKi8KKwkJLyogZXhjY2VlZHMgIk51bWJlck9mRnJhZyJjYWN1bGF0ZWQgaGVyZSBhbmQgbm90IGVub3VnaCBmcmVlIFRYRCBhdmFpbGFibGUsIHRoZSAqLworCQkvKiBsYXN0IGZyYWdtZW50IChpLmUuIGxhc3QgTVBEVSkgd2lsbCBiZSBkcm9wcGVkIGluIFJUTVBIYXJkVHJhbnNtaXQoKSBkdWUgdG8gb3V0IG9mICovCisJCS8qIHJlc291cmNlLCBhbmQgdGhlIE5ESVMgcGFja2V0IHdpbGwgYmUgaW5kaWNhdGVkIE5ESVNfU1RBVFVTX0ZBSUxVUkUuIFRoaXMgc2hvdWxkICovCisJCS8qIHJhcmVseSBoYXBwZW4gYW5kIHRoZSBwZW5hbHR5IGlzIGp1c3QgbGlrZSBhIFRYIFJFVFJZIGZhaWwuIEFmZm9yZGFibGUuICovCiAKLQkJQWxsb3dGcmFnU2l6ZSA9IChwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkgLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIX0NSQzsKLQkJTnVtYmVyT2ZGcmFnID0gKChQYWNrZXRJbmZvLlRvdGFsUGFja2V0TGVuZ3RoIC0gTEVOR1RIXzgwMl8zICsgTEVOR1RIXzgwMl8xX0gpIC8gQWxsb3dGcmFnU2l6ZSkgKyAxOwotCQkvLyBUbyBnZXQgYWNjdXJhdGUgbnVtYmVyIG9mIGZyYWdtZW50YXRpb24sIE1pbnVzIDEgaWYgdGhlIHNpemUganVzdCBtYXRjaCB0byBhbGxvd2FibGUgZnJhZ21lbnQgc2l6ZQotCQlpZiAoKChQYWNrZXRJbmZvLlRvdGFsUGFja2V0TGVuZ3RoIC0gTEVOR1RIXzgwMl8zICsgTEVOR1RIXzgwMl8xX0gpICUgQWxsb3dGcmFnU2l6ZSkgPT0gMCkKLQkJeworCQlBbGxvd0ZyYWdTaXplID0KKwkJICAgIChwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkgLSBMRU5HVEhfODAyXzExIC0KKwkJICAgIExFTkdUSF9DUkM7CisJCU51bWJlck9mRnJhZyA9CisJCSAgICAoKFBhY2tldEluZm8uVG90YWxQYWNrZXRMZW5ndGggLSBMRU5HVEhfODAyXzMgKworCQkgICAgICBMRU5HVEhfODAyXzFfSCkgLyBBbGxvd0ZyYWdTaXplKSArIDE7CisJCS8qIFRvIGdldCBhY2N1cmF0ZSBudW1iZXIgb2YgZnJhZ21lbnRhdGlvbiwgTWludXMgMSBpZiB0aGUgc2l6ZSBqdXN0IG1hdGNoIHRvIGFsbG93YWJsZSBmcmFnbWVudCBzaXplICovCisJCWlmICgoKFBhY2tldEluZm8uVG90YWxQYWNrZXRMZW5ndGggLSBMRU5HVEhfODAyXzMgKworCQkgICAgICBMRU5HVEhfODAyXzFfSCkgJSBBbGxvd0ZyYWdTaXplKSA9PSAwKSB7CiAJCQlOdW1iZXJPZkZyYWctLTsKIAkJfQogCX0KIAotCS8vIFNhdmUgZnJhZ21lbnQgbnVtYmVyIHRvIE5kaXMgcGFja2V0IHJlc2VydmVkIGZpZWxkCisJLyogU2F2ZSBmcmFnbWVudCBudW1iZXIgdG8gTmRpcyBwYWNrZXQgcmVzZXJ2ZWQgZmllbGQgKi8KIAlSVE1QX1NFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQsIE51bWJlck9mRnJhZyk7CiAKKwkvKiBTVEVQIDIuIENoZWNrIHRoZSByZXF1aXJlbWVudCBvZiBSVFM6ICovCisJLyogICAgICAgICBJZiBtdWx0aXBsZSBmcmFnbWVudCByZXF1aXJlZCwgUlRTIGlzIHJlcXVpcmVkIG9ubHkgZm9yIHRoZSBmaXJzdCBmcmFnbWVudCAqLworCS8qICAgICAgICAgaWYgdGhlIGZyYWdtZW50IHNpemUgbGFyZ2UgdGhhbiBSVFMgdGhyZXNob2xkICovCisJLyogICAgIEZvciBSVDI4eHgsIExldCBBU0lDIHNlbmQgUlRTL0NUUyAqLworLyogICAgICBSVE1QX1NFVF9QQUNLRVRfUlRTKHBQYWNrZXQsIDApOyAqLworCWlmIChOdW1iZXJPZkZyYWcgPiAxKQorCQlSVFNSZXF1aXJlZCA9CisJCSAgICAocEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPgorCQkgICAgIHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCkgPyAxIDogMDsKKwllbHNlCisJCVJUU1JlcXVpcmVkID0KKwkJICAgIChQYWNrZXRJbmZvLlRvdGFsUGFja2V0TGVuZ3RoID4KKwkJICAgICBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpID8gMSA6IDA7CiAKLQkvLyBTVEVQIDIuIENoZWNrIHRoZSByZXF1aXJlbWVudCBvZiBSVFM6Ci0JLy8JICAgSWYgbXVsdGlwbGUgZnJhZ21lbnQgcmVxdWlyZWQsIFJUUyBpcyByZXF1aXJlZCBvbmx5IGZvciB0aGUgZmlyc3QgZnJhZ21lbnQKLQkvLwkgICBpZiB0aGUgZnJhZ21lbnQgc2l6ZSBsYXJnZSB0aGFuIFJUUyB0aHJlc2hvbGQKLQkvLyAgICAgRm9yIFJUMjh4eCwgTGV0IEFTSUMgc2VuZCBSVFMvQ1RTCi0JUlRNUF9TRVRfUEFDS0VUX1JUUyhwUGFja2V0LCAwKTsKKwkvKiBTYXZlIFJUUyByZXF1aXJlbWVudCB0byBOZGlzIHBhY2tldCByZXNlcnZlZCBmaWVsZCAqLworCVJUTVBfU0VUX1BBQ0tFVF9SVFMocFBhY2tldCwgUlRTUmVxdWlyZWQpOwogCVJUTVBfU0VUX1BBQ0tFVF9UWFJBVEUocFBhY2tldCwgcEFkLT5Db21tb25DZmcuVHhSYXRlKTsKIAotCS8vCi0JLy8gU1RFUCAzLiBUcmFmZmljIGNsYXNzaWZpY2F0aW9uLiBvdXRjb21lID0gPFVzZXJQcmlvcml0eSwgUXVlSWR4PgotCS8vCisJLyogKi8KKwkvKiBTVEVQIDMuIFRyYWZmaWMgY2xhc3NpZmljYXRpb24uIG91dGNvbWUgPSA8VXNlclByaW9yaXR5LCBRdWVJZHg+ICovCisJLyogKi8KIAlVc2VyUHJpb3JpdHkgPSAwOwotCVF1ZUlkeAkJID0gUUlEX0FDX0JFOwotI2lmZGVmIFJUMjg2MAotCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpKQotI2VuZGlmCi0jaWZkZWYgUlQyODcwCisJUXVlSWR4ID0gUUlEX0FDX0JFOwogCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpICYmCi0JCUNMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpKQotI2VuZGlmCi0JewotCQlVU0hPUlQgUHJvdG9jb2w7Ci0JCVVDSEFSICBMbGNTbmFwTGVuID0gMCwgQnl0ZTAsIEJ5dGUxOwotCQlkbwotCQl7Ci0JCQkvLyBnZXQgRXRoZXJuZXQgcHJvdG9jb2wgZmllbGQKLQkJCVByb3RvY29sID0gKFVTSE9SVCkoKHBTcmNCdWZWQVsxMl0gPDwgOCkgKyBwU3JjQnVmVkFbMTNdKTsKLQkJCWlmIChQcm90b2NvbCA8PSAxNTAwKQotCQkJewotCQkJCS8vIGdldCBFdGhlcm5ldCBwcm90b2NvbCBmaWVsZCBmcm9tIExMQy9TTkFQCi0JCQkJaWYgKFNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIoUGFja2V0SW5mby5wRmlyc3RCdWZmZXIsIExFTkdUSF84MDJfMyArIDYsICZCeXRlMCwgJkJ5dGUxKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCSAgICBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSkgeworCQl1MTYgUHJvdG9jb2w7CisJCXU4IExsY1NuYXBMZW4gPSAwLCBCeXRlMCwgQnl0ZTE7CisJCWRvIHsKKwkJCS8qIGdldCBFdGhlcm5ldCBwcm90b2NvbCBmaWVsZCAqLworCQkJUHJvdG9jb2wgPQorCQkJICAgICh1MTYpKChwU3JjQnVmVkFbMTJdIDw8IDgpICsgcFNyY0J1ZlZBWzEzXSk7CisJCQlpZiAoUHJvdG9jb2wgPD0gMTUwMCkgeworCQkJCS8qIGdldCBFdGhlcm5ldCBwcm90b2NvbCBmaWVsZCBmcm9tIExMQy9TTkFQICovCisJCQkJaWYgKFNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIKKwkJCQkgICAgKFBhY2tldEluZm8ucEZpcnN0QnVmZmVyLCBMRU5HVEhfODAyXzMgKyA2LAorCQkJCSAgICAgJkJ5dGUwLCAmQnl0ZTEpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCiAJCQkJCWJyZWFrOwogCi0JCQkJUHJvdG9jb2wgPSAoVVNIT1JUKSgoQnl0ZTAgPDwgOCkgKyBCeXRlMSk7CisJCQkJUHJvdG9jb2wgPSAodTE2KSgoQnl0ZTAgPDwgOCkgKyBCeXRlMSk7CiAJCQkJTGxjU25hcExlbiA9IDg7CiAJCQl9Ci0KLQkJCS8vIGFsd2F5cyBBQ19CRSBmb3Igbm9uLUlQIHBhY2tldAorCQkJLyogYWx3YXlzIEFDX0JFIGZvciBub24tSVAgcGFja2V0ICovCiAJCQlpZiAoUHJvdG9jb2wgIT0gMHgwODAwKQogCQkJCWJyZWFrOwogCi0JCQkvLyBnZXQgSVAgaGVhZGVyCi0JCQlpZiAoU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcihQYWNrZXRJbmZvLnBGaXJzdEJ1ZmZlciwgTEVOR1RIXzgwMl8zICsgTGxjU25hcExlbiwgJkJ5dGUwLCAmQnl0ZTEpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkvKiBnZXQgSVAgaGVhZGVyICovCisJCQlpZiAoU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcgorCQkJICAgIChQYWNrZXRJbmZvLnBGaXJzdEJ1ZmZlciwgTEVOR1RIXzgwMl8zICsgTGxjU25hcExlbiwKKwkJCSAgICAgJkJ5dGUwLCAmQnl0ZTEpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCiAJCQkJYnJlYWs7CiAKLQkJCS8vIHJldHVybiBBQ19CRSBpZiBwYWNrZXQgaXMgbm90IElQdjQKKwkJCS8qIHJldHVybiBBQ19CRSBpZiBwYWNrZXQgaXMgbm90IElQdjQgKi8KIAkJCWlmICgoQnl0ZTAgJiAweGYwKSAhPSAweDQwKQogCQkJCWJyZWFrOwogCkBAIC0xMTAwLDYzICsxMTEzLDU5IEBACiAJCQlVc2VyUHJpb3JpdHkgPSAoQnl0ZTEgJiAweGUwKSA+PiA1OwogCQkJUXVlSWR4ID0gTWFwVXNlclByaW9yaXR5VG9BY2Nlc3NDYXRlZ29yeVtVc2VyUHJpb3JpdHldOwogCi0JCQkvLyBUT0RPOiBoYXZlIHRvIGNoZWNrIEFDTSBiaXQuIGFwcGx5IFRTUEVDIGlmIEFDTSBpcyBPTgotCQkJLy8gVE9ETzogZG93bmdyYWRlIFVQICYgUXVlSWR4IGJlZm9yZSBwYXNzaW5nIEFDTQotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFDTVtRdWVJZHhdKQotCQkJeworCQkJLyogVE9ETzogaGF2ZSB0byBjaGVjayBBQ00gYml0LiBhcHBseSBUU1BFQyBpZiBBQ00gaXMgT04gKi8KKwkJCS8qIFRPRE86IGRvd25ncmFkZSBVUCAmIFF1ZUlkeCBiZWZvcmUgcGFzc2luZyBBQ00gKi8KKwkJCS8qCisJCQkgICBVbmRlciBXTU0gQUNNIGNvbnRyb2wsIHdlIGRvbnQgbmVlZCB0byBjaGVjayB0aGUgYml0OworCQkJICAgT3Igd2hlbiBhIFRTUEVDIGlzIGJ1aWx0IGZvciBWTyBidXQgd2Ugd2lsbCBjaGFuZ2UgdG8gaXNzdWUKKwkJCSAgIEJBIHNlc3Npb24gZm9yIEJFIGhlcmUsIHNvIHdlIHdpbGwgbm90IHVzZSBCQSB0byBzZW5kIFZPIHBhY2tldHMuCisJCQkgKi8KKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBQ01bUXVlSWR4XSkgewogCQkJCVVzZXJQcmlvcml0eSA9IDA7Ci0JCQkJUXVlSWR4CQkgPSBRSURfQUNfQkU7CisJCQkJUXVlSWR4ID0gUUlEX0FDX0JFOwogCQkJfQogCQl9IHdoaWxlIChGQUxTRSk7CiAJfQogCiAJUlRNUF9TRVRfUEFDS0VUX1VQKHBQYWNrZXQsIFVzZXJQcmlvcml0eSk7CiAKLQotCi0JLy8gTWFrZSBzdXJlIFNlbmRUeFdhaXQgcXVldWUgcmVzb3VyY2Ugd29uJ3QgYmUgdXNlZCBieSBvdGhlciB0aHJlYWRzCisJLyogTWFrZSBzdXJlIFNlbmRUeFdhaXQgcXVldWUgcmVzb3VyY2Ugd29uJ3QgYmUgdXNlZCBieSBvdGhlciB0aHJlYWRzICovCiAJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwotCWlmIChwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdLk51bWJlciA+PSBNQVhfUEFDS0VUU19JTl9RVUVVRSkKLQl7CisJaWYgKHBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0uTnVtYmVyID49IE1BWF9QQUNLRVRTX0lOX1FVRVVFKSB7CiAJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwogCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAKIAkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCWVsc2UKLQl7Ci0JCUluc2VydFRhaWxRdWV1ZSgmcEFkLT5UeFN3UXVldWVbUXVlSWR4XSwgUEFDS0VUX1RPX1FVRVVFX0VOVFJZKHBQYWNrZXQpKTsKKwl9IGVsc2UgeworCQlJbnNlcnRUYWlsUXVldWVBYyhwQWQsIHBFbnRyeSwgJnBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0sCisJCQkJICBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkpOwogCX0KIAlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKIAotICAgIGlmICgocEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9PSBUUlVFKSYmCi0jaWZkZWYgUlQyODYwCi0gICAgICAgIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBUUlVFKSkKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotICAgICAgICBJU19IVF9TVEEocEVudHJ5KSkKLSNlbmRpZgotCXsKLQkJaWYgKCgocEVudHJ5LT5UWEJBYml0bWFwICYgKDE8PFVzZXJQcmlvcml0eSkpID09IDApICYmCi0gICAgICAgICAgICAoKHBFbnRyeS0+QkFEZWNsaW5lQml0bWFwICYgKDE8PFVzZXJQcmlvcml0eSkpID09IDApICYmCi0gICAgICAgICAgICAocEVudHJ5LT5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkKLQkJCSAvLyBGb3IgSU9UIGNvbXBhdGliaWxpdHksIGlmCi0JCQkgLy8gMS4gSXQgaXMgUmFsaW5rIGNoaXAgb3IKLQkJCSAvLyAyLiBJdCBpcyBPUEVOIG9yIEFFUyBtb2RlLAotCQkJIC8vIHRoZW4gQkEgc2Vzc2lvbiBjYW4gYmUgYnVsaXQuCi0JCQkgJiYgKChwRW50cnktPlZhbGlkQXNDTEkgJiYgcEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgIT0gMHgwKSB8fAotCQkJIAkgKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCB8fCBwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkKLQkJCSkKLQkJewotCQkJQkFPcmlTZXNzaW9uU2V0VXAocEFkLCBwRW50cnksIDAsIDAsIDEwLCBGQUxTRSk7CisJaWYgKChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID09IFRSVUUpICYmCisJICAgIElTX0hUX1NUQShwRW50cnkpKSB7CisJCS8qc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcE1hY0VudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07ICovCisJCWlmICgoKHBFbnRyeS0+VFhCQWJpdG1hcCAmICgxIDw8IFVzZXJQcmlvcml0eSkpID09IDApICYmCisJCSAgICAoKHBFbnRyeS0+QkFEZWNsaW5lQml0bWFwICYgKDEgPDwgVXNlclByaW9yaXR5KSkgPT0gMCkgJiYKKwkJICAgIChwRW50cnktPlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKQorCQkgICAgLyogRm9yIElPVCBjb21wYXRpYmlsaXR5LCBpZiAqLworCQkgICAgLyogMS4gSXQgaXMgUmFsaW5rIGNoaXAgb3IgKi8KKwkJICAgIC8qIDIuIEl0IGlzIE9QRU4gb3IgQUVTIG1vZGUsICovCisJCSAgICAvKiB0aGVuIEJBIHNlc3Npb24gY2FuIGJlIGJ1bGl0LiAqLworCQkgICAgJiYgKChwRW50cnktPlZhbGlkQXNDTEkgJiYgcEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgIT0gMHgwKQorCQkJfHwgKHBFbnRyeS0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFXRVBFbmFibGVkCisJCQkgICAgJiYgcEVudHJ5LT5XZXBTdGF0dXMgIT0KKwkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSkKKwkJICAgICkgeworCQkJQkFPcmlTZXNzaW9uU2V0VXAocEFkLCBwRW50cnksIFVzZXJQcmlvcml0eSwgMCwgMTAsCisJCQkJCSAgRkFMU0UpOwogCQl9CiAJfQogCi0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUXVlSWR4XSsrOyAvLyBUT0RPOiBmb3IgZGVidWcgb25seS4gdG8gYmUgcmVtb3ZlZAorCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjT3NUeENvdW50W1F1ZUlkeF0rKzsJLyogVE9ETzogZm9yIGRlYnVnIG9ubHkuIHRvIGJlIHJlbW92ZWQgKi8KIAlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0xMTc5LDEyMyArMTE4OCwxMzIgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KKyNpZmRlZiBSVE1QX01BQ19QQ0kKK2ludCBSVE1QRnJlZVRYRFJlcXVlc3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgIHU4IFF1ZUlkeCwKKwkJCSAgICAgICB1OCBOdW1iZXJSZXF1aXJlZCwgdTggKkZyZWVOdW1iZXJJcykKK3sKKwl1bnNpZ25lZCBsb25nIEZyZWVOdW1iZXIgPSAwOworCWludCBTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwogCi0jaWZkZWYgUlQyODcwCisJc3dpdGNoIChRdWVJZHgpIHsKKwljYXNlIFFJRF9BQ19CSzoKKwljYXNlIFFJRF9BQ19CRToKKwljYXNlIFFJRF9BQ19WSToKKwljYXNlIFFJRF9BQ19WTzoKKwkJaWYgKHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhTd0ZyZWVJZHggPgorCQkgICAgcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCkKKwkJCUZyZWVOdW1iZXIgPQorCQkJICAgIHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhTd0ZyZWVJZHggLQorCQkJICAgIHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHggLSAxOworCQllbHNlCisJCQlGcmVlTnVtYmVyID0KKwkJCSAgICBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4U3dGcmVlSWR4ICsgVFhfUklOR19TSVpFIC0KKwkJCSAgICBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4IC0gMTsKKworCQlpZiAoRnJlZU51bWJlciA+PSBOdW1iZXJSZXF1aXJlZCkKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCWJyZWFrOworCisJY2FzZSBRSURfTUdNVDoKKwkJaWYgKHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPiBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4KQorCQkJRnJlZU51bWJlciA9CisJCQkgICAgcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCAtIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHggLQorCQkJICAgIDE7CisJCWVsc2UKKwkJCUZyZWVOdW1iZXIgPQorCQkJICAgIHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggKyBNR01UX1JJTkdfU0laRSAtCisJCQkgICAgcEFkLT5NZ210UmluZy5UeENwdUlkeCAtIDE7CisKKwkJaWYgKEZyZWVOdW1iZXIgPj0gTnVtYmVyUmVxdWlyZWQpCisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiUlRNUEZyZWVUWERSZXF1ZXN0OjpJbnZhbGlkIFF1ZUlkeCg9JWQpXG4iLCBRdWVJZHgpKTsKKwkJYnJlYWs7CisJfQorCSpGcmVlTnVtYmVySXMgPSAodTgpRnJlZU51bWJlcjsKKworCXJldHVybiAoU3RhdHVzKTsKK30KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKyNpZmRlZiBSVE1QX01BQ19VU0IKIC8qCiAJQWN0dWFsbHksIHRoaXMgZnVuY3Rpb24gdXNlZCB0byBjaGVjayBpZiB0aGUgVHhIYXJkd2FyZSBRdWV1ZSBzdGlsbCBoYXMgZnJhbWUgbmVlZCB0byBzZW5kLgogCUlmIG5vIGZyYW1lIG5lZWQgdG8gc2VuZCwgZ28gdG8gc2xlZXAsIGVsc2UsIHN0aWxsIHdha2UgdXAuCiAqLwotI2VuZGlmCi1ORElTX1NUQVRVUyBSVE1QRnJlZVRYRFJlcXVlc3QoCi0JSU4JCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCQlVQ0hBUgkJCVF1ZUlkeCwKLQlJTgkJVUNIQVIJCQlOdW1iZXJSZXF1aXJlZCwKLQlJTgkJUFVDSEFSCQkJRnJlZU51bWJlcklzKQoraW50IFJUTVBGcmVlVFhEUmVxdWVzdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgdTggUXVlSWR4LAorCQkJICAgICAgIHU4IE51bWJlclJlcXVpcmVkLCB1OCAqRnJlZU51bWJlcklzKQogewotI2lmZGVmIFJUMjg2MAotCVVMT05HCQlGcmVlTnVtYmVyID0gMDsKLSNlbmRpZgotCU5ESVNfU1RBVFVTIAlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwotI2lmZGVmIFJUMjg3MAotCXVuc2lnbmVkIGxvbmcgICBJcnFGbGFnczsKLQlIVF9UWF9DT05URVhUCSpwSFRUWENvbnRleHQ7Ci0jZW5kaWYKKwkvKnVuc2lnbmVkIGxvbmcgICAgICAgICBGcmVlTnVtYmVyID0gMDsgKi8KKwlpbnQgU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl1bnNpZ25lZCBsb25nIElycUZsYWdzOworCXN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQ7CiAKLQlzd2l0Y2ggKFF1ZUlkeCkKLQl7Ci0JCWNhc2UgUUlEX0FDX0JLOgotCQljYXNlIFFJRF9BQ19CRToKLQkJY2FzZSBRSURfQUNfVkk6Ci0JCWNhc2UgUUlEX0FDX1ZPOgotCQljYXNlIFFJRF9IQ0NBOgotI2lmZGVmIFJUMjg2MAotCQkJaWYgKHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhTd0ZyZWVJZHggPiBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4KQotCQkJCUZyZWVOdW1iZXIgPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4U3dGcmVlSWR4IC0gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCAtIDE7Ci0JCQllbHNlCi0JCQkJRnJlZU51bWJlciA9IHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhTd0ZyZWVJZHggKyBUWF9SSU5HX1NJWkUgLSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4IC0gMTsKLQotCQkJaWYgKEZyZWVOdW1iZXIgPj0gTnVtYmVyUmVxdWlyZWQpCi0JCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQkJewotCQkJCXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOwotCQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKLQkJCQlpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiAhPSBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uKSB8fAotCQkJCQkocEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpKQotCQkJCXsKLQkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQkJCQl9Ci0JCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7Ci0JCQl9Ci0jZW5kaWYKLQkJCWJyZWFrOwotCi0JCWNhc2UgUUlEX01HTVQ6Ci0jaWZkZWYgUlQyODYwCi0JCQlpZiAocEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA+IHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgpCi0JCQkJRnJlZU51bWJlciA9IHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggLSBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4IC0gMTsKLQkJCWVsc2UKLQkJCQlGcmVlTnVtYmVyID0gcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCArIE1HTVRfUklOR19TSVpFIC0gcEFkLT5NZ210UmluZy5UeENwdUlkeCAtIDE7Ci0KLQkJCWlmIChGcmVlTnVtYmVyID49IE51bWJlclJlcXVpcmVkKQotCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQkJCWlmIChwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ICE9IE1HTVRfUklOR19TSVpFKQorCXN3aXRjaCAoUXVlSWR4KSB7CisJY2FzZSBRSURfQUNfQks6CisJY2FzZSBRSURfQUNfQkU6CisJY2FzZSBRSURfQUNfVkk6CisJY2FzZSBRSURfQUNfVk86CisJCXsKKwkJCXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOworCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwKKwkJCQkgICAgICBJcnFGbGFncyk7CisJCQlpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiAhPQorCQkJICAgICBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uKQorCQkJICAgIHx8IChwSFRUWENvbnRleHQtPklSUFBlbmRpbmcgPT0gVFJVRSkpIHsKIAkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwotCQkJZWxzZQorCQkJfSBlbHNlIHsKIAkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotI2VuZGlmCi0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJSVE1QRnJlZVRYRFJlcXVlc3Q6OkludmFsaWQgUXVlSWR4KD0lZClcbiIsIFF1ZUlkeCkpOwotCQkJYnJlYWs7CisJCQl9CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sCisJCQkJCUlycUZsYWdzKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFFJRF9NR01UOgorCQlpZiAocEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCAhPSBNR01UX1JJTkdfU0laRSkKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCWVsc2UKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiUlRNUEZyZWVUWERSZXF1ZXN0OjpJbnZhbGlkIFF1ZUlkeCg9JWQpXG4iLCBRdWVJZHgpKTsKKwkJYnJlYWs7CiAJfQotI2lmZGVmIFJUMjg2MAotCSpGcmVlTnVtYmVySXMgPSAoVUNIQVIpRnJlZU51bWJlcjsKLSNlbmRpZgogCiAJcmV0dXJuIChTdGF0dXMpOwogfQorI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCi0KLQotVk9JRCBSVE1QU2VuZERpc2Fzc29jaWF0aW9uRnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCit2b2lkIFJUTVBTZW5kRGlzYXNzb2NpYXRpb25GcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7CiB9CiAKLVZPSUQJUlRNUFNlbmROdWxsRnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlUeFJhdGUsCi0JSU4JQk9PTEVBTiAJCWJRb3NOdWxsKQordm9pZCBSVE1QU2VuZE51bGxGcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICB1OCBUeFJhdGUsIElOIEJPT0xFQU4gYlFvc051bGwpCiB7Ci0JVUNIQVIJTnVsbEZyYW1lWzQ4XTsKLQlVTE9ORwlMZW5ndGg7Ci0JUEhFQURFUl84MDJfMTEJcEhlYWRlcl84MDJfMTE7CisJdTggTnVsbEZyYW1lWzQ4XTsKKwl1bnNpZ25lZCBsb25nIExlbmd0aDsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBIZWFkZXJfODAyXzExOwogCi0gICAgLy8gV1BBIDgwMi4xeCBzZWN1cmVkIHBvcnQgY29udHJvbAotICAgIGlmICgoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKLSAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8Ci0gICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKLSAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQotCQkJICB8fCAocEFkLT5TdGFDZmcuSUVFRTgwMjFYID09IFRSVUUpCi0gICAgICAgICkgJiYKLSAgICAgICAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKLQl7CisJLyogV1BBIDgwMi4xeCBzZWN1cmVkIHBvcnQgY29udHJvbCAqLworCWlmICgoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKKwkgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisJICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKKwkgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorCSAgICAgfHwgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBUUlVFKQorCSAgICApICYmIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKSB7CiAJCXJldHVybjsKIAl9CiAKIAlOZGlzWmVyb01lbW9yeShOdWxsRnJhbWUsIDQ4KTsKLQlMZW5ndGggPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisJTGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKTsKIAotCXBIZWFkZXJfODAyXzExID0gKFBIRUFERVJfODAyXzExKSBOdWxsRnJhbWU7CisJcEhlYWRlcl84MDJfMTEgPSAoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKikgTnVsbEZyYW1lOwogCiAJcEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPSBCVFlQRV9EQVRBOwogCXBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9OVUxMX0ZVTkM7CkBAIC0xMzA0LDk3ICsxMzIyLDg0IEBACiAJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOwogCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CiAKLQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkKLQl7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpIHsKIAkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKKwl9IGVsc2UgeworCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9CisJCSAgICAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSA/IDEgOiAwOwogCX0KLQllbHNlCi0JewotCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpID8gMTogMDsKLQl9Ci0JcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gcEFkLT5Db21tb25DZmcuRHNpZnMgKyBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgVHhSYXRlLCAxNCk7CisJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0KKwkgICAgcEFkLT5Db21tb25DZmcuRHNpZnMgKyBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgVHhSYXRlLCAxNCk7CiAKIAlwQWQtPlNlcXVlbmNlKys7CiAJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcEFkLT5TZXF1ZW5jZTsKIAotCS8vIFByZXBhcmUgUW9zTnVsbCBmdW5jdGlvbiBmcmFtZQotCWlmIChiUW9zTnVsbCkKLQl7CisJLyogUHJlcGFyZSBRb3NOdWxsIGZ1bmN0aW9uIGZyYW1lICovCisJaWYgKGJRb3NOdWxsKSB7CiAJCXBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9RT1NfTlVMTDsKIAotCQkvLyBjb3B5IFFPUyBjb250cm9sIGJ5dGVzCi0JCU51bGxGcmFtZVtMZW5ndGhdCT0gIDA7Ci0JCU51bGxGcmFtZVtMZW5ndGgrMV0gPSAgMDsKLQkJTGVuZ3RoICs9IDI7Ly8gaWYgcGFkIHdpdGggMiBieXRlcyBmb3IgYWxpZ25tZW50LCBBUFNEIHdpbGwgZmFpbAorCQkvKiBjb3B5IFFPUyBjb250cm9sIGJ5dGVzICovCisJCU51bGxGcmFtZVtMZW5ndGhdID0gMDsKKwkJTnVsbEZyYW1lW0xlbmd0aCArIDFdID0gMDsKKwkJTGVuZ3RoICs9IDI7CS8qIGlmIHBhZCB3aXRoIDIgYnl0ZXMgZm9yIGFsaWdubWVudCwgQVBTRCB3aWxsIGZhaWwgKi8KIAl9CiAKIAlIQUxfS2lja091dE51bGxGcmFtZVR4KHBBZCwgMCwgTnVsbEZyYW1lLCBMZW5ndGgpOwogCiB9CiAKLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRAlSVE1QU2VuZFJUU0ZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBEQSwKLQlJTgl1bnNpZ25lZCBpbnQJTmV4dE1wZHVTaXplLAotCUlOCVVDSEFSCQkJVHhSYXRlLAotCUlOCVVDSEFSCQkJUlRTUmF0ZSwKLQlJTglVU0hPUlQJCQlBY2tEdXJhdGlvbiwKLQlJTglVQ0hBUgkJCVF1ZUlkeCwKLQlJTglVQ0hBUgkJCUZyYW1lR2FwKQorLyogSVJRTCA9IERJU1BBVENIX0xFVkVMICovCit2b2lkIFJUTVBTZW5kUlRTRnJhbWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICB1OCAqcERBLAorCQkgICAgICBJTiB1bnNpZ25lZCBpbnQgTmV4dE1wZHVTaXplLAorCQkgICAgICB1OCBUeFJhdGUsCisJCSAgICAgIHU4IFJUU1JhdGUsCisJCSAgICAgIHUxNiBBY2tEdXJhdGlvbiwgdTggUXVlSWR4LCB1OCBGcmFtZUdhcCkKIHsKIH0KIAotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgRklORCBFTkNSWVBUIEtFWSBBTkQgREVDSURFIENJUEhFUiBBTEdPUklUSE0KLS8vCQlGaW5kIHRoZSBXUEEga2V5LCBlaXRoZXIgR3JvdXAgb3IgUGFpcndpc2UgS2V5Ci0vLwkJTEVBUCArIFRLSVAgYWxzbyB1c2UgV1BBIGtleS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBEZWNpZGUgV0VQIGJpdCBhbmQgY2lwaGVyIHN1aXRlIHRvIGJlIHVzZWQuIFNhbWUgY2lwaGVyIHN1aXRlIHNob3VsZCBiZSB1c2VkIGZvciB3aG9sZSBmcmFnbWVudCBidXJzdAotLy8gSW4gQ2lzY28gQ0NYIDIuMCBMZWFwIEF1dGhlbnRpY2F0aW9uCi0vLwkJICAgV2VwU3RhdHVzIGlzIE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQgYnV0IHRoZSBrZXkgd2lsbCB1c2UgUGFpcndpc2VLZXkKLS8vCQkgICBJbnN0ZWFkIG9mIHRoZSBTaGFyZWRLZXksIFNoYXJlZEtleSBMZW5ndGggbWF5IGJlIFplcm8uCi1WT0lEIFNUQUZpbmRDaXBoZXJBbGdvcml0aG0oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaykKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgRklORCBFTkNSWVBUIEtFWSBBTkQgREVDSURFIENJUEhFUiBBTEdPUklUSE0gKi8KKy8qICAgICAgICAgICAgICBGaW5kIHRoZSBXUEEga2V5LCBlaXRoZXIgR3JvdXAgb3IgUGFpcndpc2UgS2V5ICovCisvKiAgICAgICAgICAgICAgTEVBUCArIFRLSVAgYWxzbyB1c2UgV1BBIGtleS4gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBEZWNpZGUgV0VQIGJpdCBhbmQgY2lwaGVyIHN1aXRlIHRvIGJlIHVzZWQuIFNhbWUgY2lwaGVyIHN1aXRlIHNob3VsZCBiZSB1c2VkIGZvciB3aG9sZSBmcmFnbWVudCBidXJzdCAqLworLyogSW4gQ2lzY28gQ0NYIDIuMCBMZWFwIEF1dGhlbnRpY2F0aW9uICovCisvKiAgICAgICAgICAgICAgICAgV2VwU3RhdHVzIGlzIE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQgYnV0IHRoZSBrZXkgd2lsbCB1c2UgUGFpcndpc2VLZXkgKi8KKy8qICAgICAgICAgICAgICAgICBJbnN0ZWFkIG9mIHRoZSBTaGFyZWRLZXksIFNoYXJlZEtleSBMZW5ndGggbWF5IGJlIFplcm8uICovCit2b2lkIFNUQUZpbmRDaXBoZXJBbGdvcml0aG0oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGspCiB7Ci0JTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJQ2lwaGVyOwkJCQkvLyBUbyBpbmRpY2F0ZSBjaXBoZXIgdXNlZCBmb3IgdGhpcyBwYWNrZXQKLQlVQ0hBUgkJCQkJCQlDaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsJCS8vIGNpcGhlciBhbG9ncml0aG0KLQlVQ0hBUgkJCQkJCQlLZXlJZHggPSAweGZmOwotCVBVQ0hBUgkJCQkJCQlwU3JjQnVmVkE7Ci0JUENJUEhFUl9LRVkJCQkJCQlwS2V5ID0gTlVMTDsKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUyBDaXBoZXI7CS8qIFRvIGluZGljYXRlIGNpcGhlciB1c2VkIGZvciB0aGlzIHBhY2tldCAqLworCXU4IENpcGhlckFsZyA9IENJUEhFUl9OT05FOwkvKiBjaXBoZXIgYWxvZ3JpdGhtICovCisJdTggS2V5SWR4ID0gMHhmZjsKKwl1OCAqcFNyY0J1ZlZBOworCXN0cnVjdCBydF9jaXBoZXJfa2V5ICpwS2V5ID0gTlVMTDsKIAogCXBTcmNCdWZWQSA9IEdFVF9PU19QS1RfREFUQVBUUihwVHhCbGstPnBQYWNrZXQpOwogCiAJewotCSAgICAvLyBTZWxlY3QgQ2lwaGVyCi0JICAgIGlmICgoKnBTcmNCdWZWQSAmIDB4MDEpICYmIChBREhPQ19PTihwQWQpKSkKLQkgICAgICAgIENpcGhlciA9IHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyOyAvLyBDaXBoZXIgZm9yIE11bHRpY2FzdCBvciBCcm9hZGNhc3QKLQkgICAgZWxzZQotCSAgICAgICAgQ2lwaGVyID0gcEFkLT5TdGFDZmcuUGFpckNpcGhlcjsgLy8gQ2lwaGVyIGZvciBVbmljYXN0CisJCS8qIFNlbGVjdCBDaXBoZXIgKi8KKwkJaWYgKCgqcFNyY0J1ZlZBICYgMHgwMSkgJiYgKEFESE9DX09OKHBBZCkpKQorCQkJQ2lwaGVyID0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXI7CS8qIENpcGhlciBmb3IgTXVsdGljYXN0IG9yIEJyb2FkY2FzdCAqLworCQllbHNlCisJCQlDaXBoZXIgPSBwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyOwkvKiBDaXBoZXIgZm9yIFVuaWNhc3QgKi8KIAotCQlpZiAoUlRNUF9HRVRfUEFDS0VUX0VBUE9MKHBUeEJsay0+cFBhY2tldCkpCi0JCXsKLQkJCUFTU0VSVChwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPD0gQ0lQSEVSX0NLSVAxMjgpOworCQlpZiAoUlRNUF9HRVRfUEFDS0VUX0VBUE9MKHBUeEJsay0+cFBhY2tldCkpIHsKKwkJCUFTU0VSVChwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPD0KKwkJCSAgICAgICBDSVBIRVJfQ0tJUDEyOCk7CiAKLQkJCS8vIDQtd2F5IGhhbmRzaGFraW5nIGZyYW1lIG11c3QgYmUgY2xlYXIKLQkJCWlmICghKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkNsZWFyRUFQRnJhbWUpKSAmJiAocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnKSAmJgotCQkJCShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4pKQotCQkJeworCQkJLyogNC13YXkgaGFuZHNoYWtpbmcgZnJhbWUgbXVzdCBiZSBjbGVhciAqLworCQkJaWYgKCEoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iQ2xlYXJFQVBGcmFtZSkpCisJCQkgICAgJiYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZykKKwkJCSAgICAmJiAocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuKSkgewogCQkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZzsKIAkJCQlLZXlJZHggPSAwOwogCQkJfQotCQl9Ci0JCWVsc2UgaWYgKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKQotCQl7Ci0JCQkJS2V5SWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOwotCQl9Ci0JCWVsc2UgaWYgKChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKLQkJCQkgKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkKLQkJewotCQkJaWYgKCgqcFNyY0J1ZlZBICYgMHgwMSkgJiYgKEFESE9DX09OKHBBZCkpKSAvLyBtdWx0aWNhc3QKKwkJfSBlbHNlIGlmIChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkgeworCQkJS2V5SWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOworCQl9IGVsc2UgaWYgKChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKKwkJCSAgIChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpIHsKKwkJCWlmICgoKnBTcmNCdWZWQSAmIDB4MDEpICYmIChBREhPQ19PTihwQWQpKSkJLyogbXVsdGljYXN0ICovCiAJCQkJS2V5SWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOwogCQkJZWxzZSBpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuKQogCQkJCUtleUlkeCA9IDA7CkBAIC0xNDA0LDE2ICsxNDA5LDE3IEBACiAKIAkJaWYgKEtleUlkeCA9PSAweGZmKQogCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0JCWVsc2UgaWYgKChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkgfHwgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID09IDApKQorCQllbHNlIGlmICgoQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpCisJCQkgfHwgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID09IDApKQogCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0JICAgIGVsc2UgaWYgKCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgJiYKLQkgICAgICAgICAgICAgKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSAmJgotCSAgICAgICAgICAgICAocEFkLT5TdGFDZmcuSUVFRTgwMjFYID09IFRSVUUpICYmCi0JICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQotCSAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0JCWVsc2UKLQkJewotCQkJLy9IZWFkZXJfODAyXzExLkZDLldlcCA9IDE7CisJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAmJgorCQkJIChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkgJiYKKwkJCSAocEFkLT5TdGFDZmcuSUVFRTgwMjFYID09IFRSVUUpICYmCisJCQkgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09CisJCQkgIFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCisJCQlDaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJZWxzZSB7CisJCQkvKkhlYWRlcl84MDJfMTEuRkMuV2VwID0gMTsgKi8KIAkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnOwogCQkJcEtleSA9ICZwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdOwogCQl9CkBAIC0xNDIzLDQ3ICsxNDI5LDQ3IEBACiAJcFR4QmxrLT5wS2V5ID0gcEtleTsKIH0KIAotCi1WT0lEIFNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBUWF9CTEsgICAgICAgICAgKnBUeEJsaykKK3ZvaWQgU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGspCiB7Ci0JSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKnBIZWFkZXJfODAyXzExOwogCi0JLy8KLQkvLyBNQUtFIEEgQ09NTU9OIDgwMi4xMSBIRUFERVIKLQkvLworCS8qICovCisJLyogTUFLRSBBIENPTU1PTiA4MDIuMTEgSEVBREVSICovCisJLyogKi8KIAotCS8vIG5vcm1hbCB3bGFuIGhlYWRlciBzaXplIDogMjQgb2N0ZXRzCi0JcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCS8qIG5vcm1hbCB3bGFuIGhlYWRlciBzaXplIDogMjQgb2N0ZXRzICovCisJcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKTsKIAotCXBIZWFkZXJfODAyXzExID0gKEhFQURFUl84MDJfMTEgKikgJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKKwlwSGVhZGVyXzgwMl8xMSA9CisJICAgIChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqKSAmIHBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKIAotCU5kaXNaZXJvTWVtb3J5KHBIZWFkZXJfODAyXzExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCU5kaXNaZXJvTWVtb3J5KHBIZWFkZXJfODAyXzExLCBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpKTsKIAogCXBIZWFkZXJfODAyXzExLT5GQy5GckRzID0gMDsKIAlwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9IEJUWVBFX0RBVEE7Ci0JcEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPSAoKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpID8gU1VCVFlQRV9RREFUQSA6IFNVQlRZUEVfREFUQSk7CisJcEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPQorCSAgICAoKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpID8gU1VCVFlQRV9RREFUQSA6CisJICAgICBTVUJUWVBFX0RBVEEpOwogCi0gICAgaWYgKHBUeEJsay0+cE1hY0VudHJ5KQotCXsKLQkJaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkZvcmNlTm9uUW9TKSkKLQkJewotCQkJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcFR4QmxrLT5wTWFjRW50cnktPk5vblFvc0RhdGFTZXE7Ci0JCQlwVHhCbGstPnBNYWNFbnRyeS0+Tm9uUW9zRGF0YVNlcSA9IChwVHhCbGstPnBNYWNFbnRyeS0+Tm9uUW9zRGF0YVNlcSsxKSAmIE1BWFNFUTsKLQkJfQotCQllbHNlCi0JCXsKKwlpZiAocFR4QmxrLT5wTWFjRW50cnkpIHsKKwkJaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkZvcmNlTm9uUW9TKSkgeworCQkJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0KKwkJCSAgICBwVHhCbGstPnBNYWNFbnRyeS0+Tm9uUW9zRGF0YVNlcTsKKwkJCXBUeEJsay0+cE1hY0VudHJ5LT5Ob25Rb3NEYXRhU2VxID0KKwkJCSAgICAocFR4QmxrLT5wTWFjRW50cnktPk5vblFvc0RhdGFTZXEgKyAxKSAmIE1BWFNFUTsKKwkJfSBlbHNlIHsKIAkJCXsKLSAgICAJICAgIHBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBUeEJsay0+cE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV07Ci0gICAgCSAgICBwVHhCbGstPnBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldID0gKHBUeEJsay0+cE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV0rMSkgJiBNQVhTRVE7Ci0gICAgCX0KLQl9Ci0JfQotCWVsc2UKLQl7CisJCQkJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0KKwkJCQkgICAgcFR4QmxrLT5wTWFjRW50cnktPlR4U2VxW3BUeEJsay0+CisJCQkJCQkJICAgICBVc2VyUHJpb3JpdHldOworCQkJCXBUeEJsay0+cE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV0gPQorCQkJCSAgICAocFR4QmxrLT5wTWFjRW50cnktPgorCQkJCSAgICAgVHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldICsgMSkgJiBNQVhTRVE7CisJCQl9CisJCX0KKwl9IGVsc2UgewogCQlwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwQWQtPlNlcXVlbmNlOwotCQlwQWQtPlNlcXVlbmNlID0gKHBBZC0+U2VxdWVuY2UrMSkgJiBNQVhTRVE7IC8vIG5leHQgc2VxdWVuY2UKKwkJcEFkLT5TZXF1ZW5jZSA9IChwQWQtPlNlcXVlbmNlICsgMSkgJiBNQVhTRVE7CS8qIG5leHQgc2VxdWVuY2UgKi8KIAl9CiAKIAlwSGVhZGVyXzgwMl8xMS0+RnJhZyA9IDA7CkBAIC0xNDcxLDIwICsxNDc3LDIzIEBACiAJcEhlYWRlcl84MDJfMTEtPkZDLk1vcmVEYXRhID0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iTW9yZURhdGEpOwogCiAJewotCQlpZiAoSU5GUkFfT04ocEFkKSkKLQkJeworCQlpZiAoSU5GUkFfT04ocEFkKSkgewogCQkJewotCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKLQkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIzLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIpOwotCQkJcEhlYWRlcl84MDJfMTEtPkZDLlRvRHMgPSAxOwotCQl9Ci0JCX0KLQkJZWxzZSBpZiAoQURIT0NfT04ocEFkKSkKLQkJewotCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjEsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7Ci0JCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci0JCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIxLAorCQkJCQkgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjIsCisJCQkJCSAgICAgIHBBZC0+Q3VycmVudEFkZHJlc3MpOworCQkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIzLAorCQkJCQkgICAgICBwVHhCbGstPnBTcmNCdWZIZWFkZXIpOworCQkJCXBIZWFkZXJfODAyXzExLT5GQy5Ub0RzID0gMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChBREhPQ19PTihwQWQpKSB7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMSwKKwkJCQkgICAgICBwVHhCbGstPnBTcmNCdWZIZWFkZXIpOworCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjIsCisJCQkJICAgICAgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMywKKwkJCQkgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CiAJCQlwSGVhZGVyXzgwMl8xMS0+RkMuVG9EcyA9IDA7CiAJCX0KIAl9CkBAIC0xNDkyLDEwNyArMTUwMSwxMDcgQEAKIAlpZiAocFR4QmxrLT5DaXBoZXJBbGcgIT0gQ0lQSEVSX05PTkUpCiAJCXBIZWFkZXJfODAyXzExLT5GQy5XZXAgPSAxOwogCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBTVEVQIDIuIE1BS0UgQSBDT01NT04gODAyLjExIEhFQURFUiBTSEFSRUQgQlkgRU5USVJFIEZSQUdNRU5UIEJVUlNULiBGaWxsIHNlcXVlbmNlIGxhdGVyLgotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBTVEVQIDIuIE1BS0UgQSBDT01NT04gODAyLjExIEhFQURFUiBTSEFSRUQgQlkgRU5USVJFIEZSQUdNRU5UIEJVUlNULiBGaWxsIHNlcXVlbmNlIGxhdGVyLiAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpCi0gICAgCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CisJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CiAJZWxzZQotICAgIAlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOworCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOwogfQogCi1WT0lEIFNUQUJ1aWxkQ2FjaGU4MDJfMTFIZWFkZXIoCi0JSU4gUlRNUF9BREFQVEVSCQkqcEFkLAotCUlOIFRYX0JMSwkJCSpwVHhCbGssCi0JSU4gVUNIQVIJCQkqcEhlYWRlcikKK3ZvaWQgU1RBQnVpbGRDYWNoZTgwMl8xMUhlYWRlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrLCB1OCAqIHBIZWFkZXIpCiB7Ci0JTUFDX1RBQkxFX0VOVFJZCSpwTWFjRW50cnk7Ci0JUEhFQURFUl84MDJfMTEJcEhlYWRlcjgwMjExOworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBNYWNFbnRyeTsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBIZWFkZXI4MDIxMTsKIAotCXBIZWFkZXI4MDIxMSA9IChQSEVBREVSXzgwMl8xMSlwSGVhZGVyOworCXBIZWFkZXI4MDIxMSA9IChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqKSBwSGVhZGVyOwogCXBNYWNFbnRyeSA9IHBUeEJsay0+cE1hY0VudHJ5OwogCi0JLy8KLQkvLyBVcGRhdGUgdGhlIGNhY2hlZCA4MDIuMTEgSEVBREVSCi0JLy8KKwkvKiAqLworCS8qIFVwZGF0ZSB0aGUgY2FjaGVkIDgwMi4xMSBIRUFERVIgKi8KKwkvKiAqLwogCi0JLy8gbm9ybWFsIHdsYW4gaGVhZGVyIHNpemUgOiAyNCBvY3RldHMKLQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisJLyogbm9ybWFsIHdsYW4gaGVhZGVyIHNpemUgOiAyNCBvY3RldHMgKi8KKwlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpOwogCi0JLy8gTW9yZSBCaXQKKwkvKiBNb3JlIEJpdCAqLwogCXBIZWFkZXI4MDIxMS0+RkMuTW9yZURhdGEgPSBUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JNb3JlRGF0YSk7CiAKLQkvLyBTZXF1ZW5jZQorCS8qIFNlcXVlbmNlICovCiAJcEhlYWRlcjgwMjExLT5TZXF1ZW5jZSA9IHBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldOwotICAgIHBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldID0gKHBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldKzEpICYgTUFYU0VROworCXBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldID0KKwkgICAgKHBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldICsgMSkgJiBNQVhTRVE7CiAKIAl7Ci0JCS8vIFRoZSBhZGRyMyBvZiBub3JtYWwgcGFja2V0IHNlbmQgZnJvbSBEUyBpcyBEZXN0IE1hYyBhZGRyZXNzLgorCQkvKiBDaGVjayBpZiB0aGUgZnJhbWUgY2FuIGJlIHNlbnQgdGhyb3VnaCBETFMgZGlyZWN0IGxpbmsgaW50ZXJmYWNlICovCisJCS8qIElmIHBhY2tldCBjYW4gYmUgc2VudCB0aHJvdWdoIERMUywgdGhlbiBmb3JjZSBhZ2dyZWdhdGlvbiBkaXNhYmxlLiAoSGFyZCB0byBkZXRlcm1pbmUgcGVlciBTVEEncyBjYXBhYmlsaXR5KSAqLworCisJCS8qIFRoZSBhZGRyMyBvZiBub3JtYWwgcGFja2V0IHNlbmQgZnJvbSBEUyBpcyBEZXN0IE1hYyBhZGRyZXNzLiAqLwogCQlpZiAoQURIT0NfT04ocEFkKSkKLQkJCUNPUFlfTUFDX0FERFIocEhlYWRlcjgwMjExLT5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyODAyMTEtPkFkZHIzLAorCQkJCSAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKIAkJZWxzZQotCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyODAyMTEtPkFkZHIzLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIpOworCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyODAyMTEtPkFkZHIzLAorCQkJCSAgICAgIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7CiAJfQogCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBTVEVQIDIuIE1BS0UgQSBDT01NT04gODAyLjExIEhFQURFUiBTSEFSRUQgQlkgRU5USVJFIEZSQUdNRU5UIEJVUlNULiBGaWxsIHNlcXVlbmNlIGxhdGVyLgotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBTVEVQIDIuIE1BS0UgQSBDT01NT04gODAyLjExIEhFQURFUiBTSEFSRUQgQlkgRU5USVJFIEZSQUdNRU5UIEJVUlNULiBGaWxsIHNlcXVlbmNlIGxhdGVyLiAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpCi0gICAgCXBIZWFkZXI4MDIxMS0+RkMuUHdyTWdtdCA9IFBXUl9TQVZFOworCQlwSGVhZGVyODAyMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKIAllbHNlCi0gICAgCXBIZWFkZXI4MDIxMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOworCQlwSGVhZGVyODAyMTEtPkZDLlB3ck1nbXQgPSAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKTsKIH0KIAotc3RhdGljIGlubGluZSBQVUNIQVIgU1RBX0J1aWxkX0FSYWxpbmtfRnJhbWVfSGVhZGVyKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFRYX0JMSwkJKnBUeEJsaykKK3N0YXRpYyBpbmxpbmUgdTggKlNUQV9CdWlsZF9BUmFsaW5rX0ZyYW1lX0hlYWRlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCQkgICAgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrKQogewotCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7Ci0JSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7Ci0JUE5ESVNfUEFDS0VUCXBOZXh0UGFja2V0OwotCVVJTlQzMgkJCW5leHRCdWZMZW47Ci0JUFFVRVVFX0VOVFJZCXBRRW50cnk7CisJdTggKnBIZWFkZXJCdWZQdHI7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKnBIZWFkZXJfODAyXzExOworCXZvaWQgKnBOZXh0UGFja2V0OworCXUzMiBuZXh0QnVmTGVuOworCXN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqcFFFbnRyeTsKIAogCVNUQUZpbmRDaXBoZXJBbGdvcml0aG0ocEFkLCBwVHhCbGspOwogCVNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrKTsKIAotCiAJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07Ci0JcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKSBwSGVhZGVyQnVmUHRyOworCXBIZWFkZXJfODAyXzExID0gKHN0cnVjdCBydF9oZWFkZXJfODAyXzExICopIHBIZWFkZXJCdWZQdHI7CiAKLQkvLyBzdGVhbCAib3JkZXIiIGJpdCB0byBtYXJrICJhZ2dyZWdhdGlvbiIKKwkvKiBzdGVhbCAib3JkZXIiIGJpdCB0byBtYXJrICJhZ2dyZWdhdGlvbiIgKi8KIAlwSGVhZGVyXzgwMl8xMS0+RkMuT3JkZXIgPSAxOwogCi0JLy8gc2tpcCBjb21tb24gaGVhZGVyCisJLyogc2tpcCBjb21tb24gaGVhZGVyICovCiAJcEhlYWRlckJ1ZlB0ciArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CiAKLQlpZiAoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iV01NKSkKLQl7Ci0JCS8vCi0JCS8vIGJ1aWxkIFFPUyBDb250cm9sIGJ5dGVzCi0JCS8vCisJaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpIHsKKwkJLyogKi8KKwkJLyogYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMgKi8KKwkJLyogKi8KIAkJKnBIZWFkZXJCdWZQdHIgPSAocFR4QmxrLT5Vc2VyUHJpb3JpdHkgJiAweDBGKTsKIAotCQkqKHBIZWFkZXJCdWZQdHIrMSkgPSAwOwotCQlwSGVhZGVyQnVmUHRyICs9MjsKKwkJKihwSGVhZGVyQnVmUHRyICsgMSkgPSAwOworCQlwSGVhZGVyQnVmUHRyICs9IDI7CiAJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSAyOwogCX0KKwkvKiBwYWRkaW5nIGF0IGZyb250IG9mIExMQyBoZWFkZXIuIExMQyBoZWFkZXIgc2hvdWxkIGF0IDQtYnl0ZXMgYWxpZ21lbnQuICovCisJcFR4QmxrLT5IZHJQYWRMZW4gPSAodW5zaWduZWQgbG9uZylwSGVhZGVyQnVmUHRyOworCXBIZWFkZXJCdWZQdHIgPSAodTggKilST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKKwlwVHhCbGstPkhkclBhZExlbiA9ICh1bnNpZ25lZCBsb25nKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOwogCi0JLy8gcGFkZGluZyBhdCBmcm9udCBvZiBMTEMgaGVhZGVyLiBMTEMgaGVhZGVyIHNob3VsZCBhdCA0LWJ5dGVzIGFsaWdtZW50LgotCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKXBIZWFkZXJCdWZQdHI7Ci0JcEhlYWRlckJ1ZlB0ciA9IChQQ0hBUilST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKLQlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORykocEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGRyUGFkTGVuKTsKLQotCS8vIEZvciBSQSBBZ2dyZWdhdGlvbiwKLQkvLyBwdXQgdGhlIDJuZCBNU0RVIGxlbmd0aChleHRyYSAyLWJ5dGUgZmllbGQpIGFmdGVyIFFPU19DT05UUk9MIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0CisJLyogRm9yIFJBIEFnZ3JlZ2F0aW9uLCAqLworCS8qIHB1dCB0aGUgMm5kIE1TRFUgbGVuZ3RoKGV4dHJhIDItYnl0ZSBmaWVsZCkgYWZ0ZXIgc3RydWN0IHJ0X3Fvc19jb250cm9sIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0ICovCiAJcFFFbnRyeSA9IHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQ7Ci0JcE5leHRQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QS1QocFFFbnRyeSk7CisJcE5leHRQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocFFFbnRyeSk7CiAJbmV4dEJ1ZkxlbiA9IEdFVF9PU19QS1RfTEVOKHBOZXh0UGFja2V0KTsKIAlpZiAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocE5leHRQYWNrZXQpKQogCQluZXh0QnVmTGVuIC09IExFTkdUSF84MDJfMVE7CiAKLQkqcEhlYWRlckJ1ZlB0ciA9IChVQ0hBUiluZXh0QnVmTGVuICYgMHhmZjsKLQkqKHBIZWFkZXJCdWZQdHIrMSkgPSAoVUNIQVIpKG5leHRCdWZMZW4gPj4gOCk7CisJKnBIZWFkZXJCdWZQdHIgPSAodTgpbmV4dEJ1ZkxlbiAmIDB4ZmY7CisJKihwSGVhZGVyQnVmUHRyICsgMSkgPSAodTgpKG5leHRCdWZMZW4gPj4gOCk7CiAKIAlwSGVhZGVyQnVmUHRyICs9IDI7CiAJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7CkBAIC0xNjAxLDE5OCArMTYxMCwyMDcgQEAKIAogfQogCi1zdGF0aWMgaW5saW5lIFBVQ0hBUiBTVEFfQnVpbGRfQU1TRFVfRnJhbWVfSGVhZGVyKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFRYX0JMSwkJKnBUeEJsaykKK3N0YXRpYyBpbmxpbmUgdTggKlNUQV9CdWlsZF9BTVNEVV9GcmFtZV9IZWFkZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkJICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGspCiB7Ci0JUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsvLywgcFNhdmVCdWZQdHI7Ci0JSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7Ci0KKwl1OCAqcEhlYWRlckJ1ZlB0cjsJLyosIHBTYXZlQnVmUHRyOyAqLworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICpwSGVhZGVyXzgwMl8xMTsKIAogCVNUQUZpbmRDaXBoZXJBbGdvcml0aG0ocEFkLCBwVHhCbGspOwogCVNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrKTsKIAogCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOwotCXBIZWFkZXJfODAyXzExID0gKEhFQURFUl84MDJfMTEgKikgcEhlYWRlckJ1ZlB0cjsKKwlwSGVhZGVyXzgwMl8xMSA9IChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqKSBwSGVhZGVyQnVmUHRyOwogCi0JLy8gc2tpcCBjb21tb24gaGVhZGVyCisJLyogc2tpcCBjb21tb24gaGVhZGVyICovCiAJcEhlYWRlckJ1ZlB0ciArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CiAKLQkvLwotCS8vIGJ1aWxkIFFPUyBDb250cm9sIGJ5dGVzCi0JLy8KKwkvKiAqLworCS8qIGJ1aWxkIFFPUyBDb250cm9sIGJ5dGVzICovCisJLyogKi8KIAkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOwogCi0JLy8KLQkvLyBBLU1TRFUgcGFja2V0Ci0JLy8KKwkvKiAqLworCS8qIEEtTVNEVSBwYWNrZXQgKi8KKwkvKiAqLwogCSpwSGVhZGVyQnVmUHRyIHw9IDB4ODA7CiAKLQkqKHBIZWFkZXJCdWZQdHIrMSkgPSAwOwotCXBIZWFkZXJCdWZQdHIgKz0yOworCSoocEhlYWRlckJ1ZlB0ciArIDEpID0gMDsKKwlwSGVhZGVyQnVmUHRyICs9IDI7CiAJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7CiAKLQkvL3BTYXZlQnVmUHRyID0gcEhlYWRlckJ1ZlB0cjsKKwkvKnBTYXZlQnVmUHRyID0gcEhlYWRlckJ1ZlB0cjsgKi8KIAotCS8vCi0JLy8gcGFkZGluZyBhdCBmcm9udCBvZiBMTEMgaGVhZGVyCi0JLy8gTExDIGhlYWRlciBzaG91bGQgbG9jYXRlIGF0IDQtb2N0ZXRzIGFsaWdtZW50Ci0JLy8KLQkvLyBAQEAgTXBkdUhlYWRlckxlbiBleGNsdWRpbmcgcGFkZGluZyBAQEAKLQkvLwotCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKXBIZWFkZXJCdWZQdHI7Ci0JcEhlYWRlckJ1ZlB0ciA9IChQQ0hBUikgUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7Ci0JcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7CisJLyogKi8KKwkvKiBwYWRkaW5nIGF0IGZyb250IG9mIExMQyBoZWFkZXIgKi8KKwkvKiBMTEMgaGVhZGVyIHNob3VsZCBsb2NhdGUgYXQgNC1vY3RldHMgYWxpZ21lbnQgKi8KKwkvKiAqLworCS8qIEBAQCBNcGR1SGVhZGVyTGVuIGV4Y2x1ZGluZyBwYWRkaW5nIEBAQCAqLworCS8qICovCisJcFR4QmxrLT5IZHJQYWRMZW4gPSAodW5zaWduZWQgbG9uZylwSGVhZGVyQnVmUHRyOworCXBIZWFkZXJCdWZQdHIgPSAodTggKilST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKKwlwVHhCbGstPkhkclBhZExlbiA9ICh1bnNpZ25lZCBsb25nKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOwogCiAJcmV0dXJuIHBIZWFkZXJCdWZQdHI7CiAKIH0KIAotCi1WT0lEIFNUQV9BTVBEVV9GcmFtZV9UeCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrKQordm9pZCBTVEFfQU1QRFVfRnJhbWVfVHgoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGspCiB7Ci0JSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7Ci0JUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKLQlVU0hPUlQJCQlGcmVlTnVtYmVyOwotCU1BQ19UQUJMRV9FTlRSWQkqcE1hY0VudHJ5OwotCUJPT0xFQU4JCQliVkxBTlBrdDsKLQlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqcEhlYWRlcl84MDJfMTE7CisJdTggKnBIZWFkZXJCdWZQdHI7CisJdTE2IEZyZWVOdW1iZXI7CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcE1hY0VudHJ5OworCUJPT0xFQU4gYlZMQU5Qa3Q7CisJc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICpwUUVudHJ5OwogCiAJQVNTRVJUKHBUeEJsayk7CiAKLQl3aGlsZShwVHhCbGstPlR4UGFja2V0TGlzdC5IZWFkKQotCXsKKwl3aGlsZSAocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCkgewogCQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CiAJCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKLQkJaWYgKCBSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCi0JCXsKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKSB7CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LAorCQkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCWJWTEFOUGt0ID0gKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBUeEJsay0+cFBhY2tldCkgPyBUUlVFIDogRkFMU0UpOworCQliVkxBTlBrdCA9CisJCSAgICAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocFR4QmxrLT5wUGFja2V0KSA/IFRSVUUgOiBGQUxTRSk7CiAKIAkJcE1hY0VudHJ5ID0gcFR4QmxrLT5wTWFjRW50cnk7Ci0JCWlmIChwTWFjRW50cnktPmlzQ2FjaGVkKQotCQl7Ci0JCQkvLyBOT1RFOiBQbGVhc2UgbWFrZSBzdXJlIHRoZSBzaXplIG9mIHBNYWNFbnRyeS0+Q2FjaGVkQnVmW10gaXMgc21hbGxlciB0aGFuIHBUeEJsay0+SGVhZGVyQnVmW10hISEhCi0JCQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0sIChQVUNIQVIpJnBNYWNFbnRyeS0+Q2FjaGVkQnVmWzBdLCBUWFdJX1NJWkUgKyBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCQkJcEhlYWRlckJ1ZlB0ciA9IChQVUNIQVIpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV0pOworCQlpZiAocE1hY0VudHJ5LT5pc0NhY2hlZCkgeworCQkJLyogTk9URTogUGxlYXNlIG1ha2Ugc3VyZSB0aGUgc2l6ZSBvZiBwTWFjRW50cnktPkNhY2hlZEJ1ZltdIGlzIHNtYWxsZXIgdGhhbiBwVHhCbGstPkhlYWRlckJ1ZltdISAqLworCQkJTmRpc01vdmVNZW1vcnkoKHU4ICopJiBwVHhCbGstPgorCQkJCSAgICAgICBIZWFkZXJCdWZbVFhJTkZPX1NJWkVdLAorCQkJCSAgICAgICAodTggKikmIHBNYWNFbnRyeS0+Q2FjaGVkQnVmWzBdLAorCQkJCSAgICAgICBUWFdJX1NJWkUgKyBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpKTsKKwkJCXBIZWFkZXJCdWZQdHIgPQorCQkJICAgICh1OCAqKSgmcFR4QmxrLT4KKwkJCQkgICAgICBIZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdKTsKIAkJCVNUQUJ1aWxkQ2FjaGU4MDJfMTFIZWFkZXIocEFkLCBwVHhCbGssIHBIZWFkZXJCdWZQdHIpOwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJU1RBRmluZENpcGhlckFsZ29yaXRobShwQWQsIHBUeEJsayk7CiAJCQlTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcihwQWQsIHBUeEJsayk7CiAKLQkJCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOworCQkJcEhlYWRlckJ1ZlB0ciA9CisJCQkgICAgJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKIAkJfQogCisJCXBIZWFkZXJfODAyXzExID0gKHN0cnVjdCBydF9oZWFkZXJfODAyXzExICopIHBIZWFkZXJCdWZQdHI7CiAKLQkJcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKSBwSGVhZGVyQnVmUHRyOwotCi0JCS8vIHNraXAgY29tbW9uIGhlYWRlcgorCQkvKiBza2lwIGNvbW1vbiBoZWFkZXIgKi8KIAkJcEhlYWRlckJ1ZlB0ciArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CiAKLQkJLy8KLQkJLy8gYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMKLQkJLy8KKwkJLyogKi8KKwkJLyogYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMgKi8KKwkJLyogKi8KIAkJKnBIZWFkZXJCdWZQdHIgPSAocFR4QmxrLT5Vc2VyUHJpb3JpdHkgJiAweDBGKTsKLQkJKihwSGVhZGVyQnVmUHRyKzEpID0gMDsKLQkJcEhlYWRlckJ1ZlB0ciArPTI7CisJCSoocEhlYWRlckJ1ZlB0ciArIDEpID0gMDsKKwkJcEhlYWRlckJ1ZlB0ciArPSAyOwogCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKIAotCQkvLwotCQkvLyBidWlsZCBIVEMrCi0JCS8vIEhUQyBjb250cm9sIGZpbGVkIGZvbGxvd2luZyBRb1MgZmllbGQKLQkJLy8KLQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iUmRnID09IFRSVUUpICYmIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBUeEJsay0+cE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSkpCi0JCXsKLQkJCWlmIChwTWFjRW50cnktPmlzQ2FjaGVkID09IEZBTFNFKQotCQkJewotCQkJCS8vIG1hcmsgSFRDIGJpdAorCQkvKiAqLworCQkvKiBidWlsZCBIVEMrICovCisJCS8qIEhUQyBjb250cm9sIGZpbGVkIGZvbGxvd2luZyBRb1MgZmllbGQgKi8KKwkJLyogKi8KKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5iUmRnID09IFRSVUUpCisJCSAgICAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwVHhCbGstPnBNYWNFbnRyeSwKKwkJCQkJICAgICAgIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKSkgeworCQkJaWYgKHBNYWNFbnRyeS0+aXNDYWNoZWQgPT0gRkFMU0UpIHsKKwkJCQkvKiBtYXJrIEhUQyBiaXQgKi8KIAkJCQlwSGVhZGVyXzgwMl8xMS0+RkMuT3JkZXIgPSAxOwogCiAJCQkJTmRpc1plcm9NZW1vcnkocEhlYWRlckJ1ZlB0ciwgNCk7Ci0JCQkJKihwSGVhZGVyQnVmUHRyKzMpIHw9IDB4ODA7CisJCQkJKihwSGVhZGVyQnVmUHRyICsgMykgfD0gMHg4MDsKIAkJCX0KIAkJCXBIZWFkZXJCdWZQdHIgKz0gNDsKIAkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSA0OwogCQl9Ci0KLQkJLy9wVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZWFkZXJCdWYgLSBUWFdJX1NJWkUgLSBUWElORk9fU0laRTsKKwkJLypwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZWFkZXJCdWYgLSBUWFdJX1NJWkUgLSBUWElORk9fU0laRTsgKi8KIAkJQVNTRVJUKHBUeEJsay0+TXBkdUhlYWRlckxlbiA+PSAyNCk7CiAKLQkJLy8gc2tpcCA4MDIuMyBoZWFkZXIKKwkJLyogc2tpcCA4MDIuMyBoZWFkZXIgKi8KIAkJcFR4QmxrLT5wU3JjQnVmRGF0YSA9IHBUeEJsay0+cFNyY0J1ZkhlYWRlciArIExFTkdUSF84MDJfMzsKLQkJcFR4QmxrLT5TcmNCdWZMZW4gIC09IExFTkdUSF84MDJfMzsKKwkJcFR4QmxrLT5TcmNCdWZMZW4gLT0gTEVOR1RIXzgwMl8zOwogCi0JCS8vIHNraXAgdmxhbiB0YWcKLQkJaWYgKGJWTEFOUGt0KQotCQl7Ci0JCQlwVHhCbGstPnBTcmNCdWZEYXRhCSs9IExFTkdUSF84MDJfMVE7Ci0JCQlwVHhCbGstPlNyY0J1ZkxlbgktPSBMRU5HVEhfODAyXzFROworCQkvKiBza2lwIHZsYW4gdGFnICovCisJCWlmIChiVkxBTlBrdCkgeworCQkJcFR4QmxrLT5wU3JjQnVmRGF0YSArPSBMRU5HVEhfODAyXzFROworCQkJcFR4QmxrLT5TcmNCdWZMZW4gLT0gTEVOR1RIXzgwMl8xUTsKIAkJfQotCi0JCS8vCi0JCS8vIHBhZGRpbmcgYXQgZnJvbnQgb2YgTExDIGhlYWRlcgotCQkvLyBMTEMgaGVhZGVyIHNob3VsZCBsb2NhdGUgYXQgNC1vY3RldHMgYWxpZ21lbnQKLQkJLy8KLQkJLy8gQEBAIE1wZHVIZWFkZXJMZW4gZXhjbHVkaW5nIHBhZGRpbmcgQEBACi0JCS8vCi0JCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKXBIZWFkZXJCdWZQdHI7Ci0JCXBIZWFkZXJCdWZQdHIgPSAoUENIQVIpIFJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOwotCQlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORykocEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGRyUGFkTGVuKTsKKwkJLyogKi8KKwkJLyogcGFkZGluZyBhdCBmcm9udCBvZiBMTEMgaGVhZGVyICovCisJCS8qIExMQyBoZWFkZXIgc2hvdWxkIGxvY2F0ZSBhdCA0LW9jdGV0cyBhbGlnbWVudCAqLworCQkvKiAqLworCQkvKiBAQEAgTXBkdUhlYWRlckxlbiBleGNsdWRpbmcgcGFkZGluZyBAQEAgKi8KKwkJLyogKi8KKwkJcFR4QmxrLT5IZHJQYWRMZW4gPSAodW5zaWduZWQgbG9uZylwSGVhZGVyQnVmUHRyOworCQlwSGVhZGVyQnVmUHRyID0gKHU4ICopUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7CisJCXBUeEJsay0+SGRyUGFkTGVuID0gKHVuc2lnbmVkIGxvbmcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7CiAKIAkJewogCi0JCQkvLwotCQkJLy8gSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cwotCQkJLy8KLQkJCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfT0ZGU0VUKHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOwotCQkJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQotCQkJewotCQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKKwkJCS8qICovCisJCQkvKiBJbnNlcnQgTExDLVNOQVAgZW5jYXBzdWxhdGlvbiAtIDggb2N0ZXRzICovCisJCQkvKiAqLworCQkJRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9PRkZTRVQocFR4QmxrLT4KKwkJCQkJCQkgICAgcFNyY0J1ZkRhdGEgLSAyLAorCQkJCQkJCSAgICBwVHhCbGstPgorCQkJCQkJCSAgICBwRXh0cmFMbGNTbmFwRW5jYXApOworCQkJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKSB7CisJCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwKKwkJCQkJICAgICAgIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKIAkJCQlwSGVhZGVyQnVmUHRyICs9IDY7Ci0JCQkJLy8gZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pCi0JCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmRGF0YS0yLCAyKTsKKwkJCQkvKiBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikgKi8KKwkJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLAorCQkJCQkgICAgICAgcFR4QmxrLT5wU3JjQnVmRGF0YSAtIDIsIDIpOwogCQkJCXBIZWFkZXJCdWZQdHIgKz0gMjsKIAkJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gTEVOR1RIXzgwMl8xX0g7CiAJCQl9CiAKIAkJfQogCi0JCWlmIChwTWFjRW50cnktPmlzQ2FjaGVkKQotCQl7Ci0gICAgICAgICAgICBSVE1QV3JpdGVUeFdJX0NhY2hlKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVJUTVBXcml0ZVR4V0lfRGF0YShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7CisJCWlmIChwTWFjRW50cnktPmlzQ2FjaGVkKSB7CisJCQlSVE1QV3JpdGVUeFdJX0NhY2hlKHBBZCwKKwkJCQkJICAgIChzdHJ1Y3QgcnRfdHh3aSAqKSAoJnBUeEJsay0+CisJCQkJCQkJICAgSGVhZGVyQnVmCisJCQkJCQkJICAgW1RYSU5GT19TSVpFXSksCisJCQkJCSAgICBwVHhCbGspOworCQl9IGVsc2UgeworCQkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwKKwkJCQkJICAgKHN0cnVjdCBydF90eHdpICopICgmcFR4QmxrLT4KKwkJCQkJCQkgIEhlYWRlckJ1ZgorCQkJCQkJCSAgW1RYSU5GT19TSVpFXSksCisJCQkJCSAgIHBUeEJsayk7CiAKLQkJCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpKCZwTWFjRW50cnktPkNhY2hlZEJ1ZlswXSksIHNpemVvZihwTWFjRW50cnktPkNhY2hlZEJ1ZikpOwotCQkJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikoJnBNYWNFbnRyeS0+Q2FjaGVkQnVmWzBdKSwgKFBVQ0hBUikoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIChwSGVhZGVyQnVmUHRyIC0gKFBVQ0hBUikoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSkpKTsKKwkJCU5kaXNaZXJvTWVtb3J5KCh1OCAqKSgmcE1hY0VudHJ5LT5DYWNoZWRCdWZbMF0pLAorCQkJCSAgICAgICBzaXplb2YocE1hY0VudHJ5LT5DYWNoZWRCdWYpKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCh1OCAqKSgmcE1hY0VudHJ5LT5DYWNoZWRCdWZbMF0pLAorCQkJCSAgICAgICAodTggKikoJnBUeEJsay0+CisJCQkJCQkgSGVhZGVyQnVmW1RYSU5GT19TSVpFXSksCisJCQkJICAgICAgIChwSGVhZGVyQnVmUHRyIC0KKwkJCQkJKHU4ICopKCZwVHhCbGstPgorCQkJCQkJICBIZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSkpOwogCQkJcE1hY0VudHJ5LT5pc0NhY2hlZCA9IFRSVUU7CiAJCX0KIAotCQkvLyBjYWxjdWxhdGUgVHJhbnNtaXR0ZWQgQU1QRFUgY291bnQgYW5kIEJ5dGVDb3VudAorCQkvKiBjYWxjdWxhdGUgVHJhbnNtaXR0ZWQgQU1QRFUgY291bnQgYW5kIEJ5dGVDb3VudCAqLwogCQl7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkTVBEVXNJbkFNUERVQ291bnQudS5Mb3dQYXJ0ICsrOwotCQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZE9jdGV0c0luQU1QRFVDb3VudC5RdWFkUGFydCArPSBwVHhCbGstPlNyY0J1ZkxlbjsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRNUERVc0luQU1QRFVDb3VudC51LgorCQkJICAgIExvd1BhcnQrKzsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRPY3RldHNJbkFNUERVQ291bnQuCisJCQkgICAgUXVhZFBhcnQgKz0gcFR4QmxrLT5TcmNCdWZMZW47CiAJCX0KIAotCQkvL0ZyZWVOdW1iZXIgPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7CisJCS8qRnJlZU51bWJlciA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsgKi8KIAogCQlIQUxfV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBUUlVFLCAmRnJlZU51bWJlcik7CiAKLQkJLy8KLQkJLy8gS2ljayBvdXQgVHgKLQkJLy8KLSNpZmRlZiBSVDI4NjAKKwkJLyogKi8KKwkJLyogS2ljayBvdXQgVHggKi8KKwkJLyogKi8KIAkJaWYgKCFSVE1QX1RFU1RfUFNGTEFHKHBBZCwgZlJUTVBfUFNfRElTQUJMRV9UWCkpCi0jZW5kaWYKIAkJCUhBTF9LaWNrT3V0VHgocEFkLCBwVHhCbGssIHBUeEJsay0+UXVlSWR4KTsKIAogCQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CkBAIC0xODAxLDExOCArMTgxOSwxMjQgQEAKIAogfQogCi0KLVZPSUQgU1RBX0FNU0RVX0ZyYW1lX1R4KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGspCit2b2lkIFNUQV9BTVNEVV9GcmFtZV9UeChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaykKIHsKLQlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOwotCVVTSE9SVAkJCUZyZWVOdW1iZXI7Ci0JVVNIT1JUCQkJc3ViRnJhbWVQYXlsb2FkTGVuID0gMDsJLy8gQU1TRFUgU3ViZnJhbWUgbGVuZ3RoIHdpdGhvdXQgQU1TRFUtSGVhZGVyIC8gUGFkZGluZy4KLQlVU0hPUlQJCQl0b3RhbE1QRFVTaXplPTA7Ci0JVUNIQVIJCQkqc3ViRnJhbWVIZWFkZXI7Ci0JVUNIQVIJCQlwYWRkaW5nID0gMDsKLQlVU0hPUlQJCQlGaXJzdFR4ID0gMCwgTGFzdFR4SWR4ID0gMDsKLQlCT09MRUFOCQkJYlZMQU5Qa3Q7Ci0JaW50IAkJCWZyYW1lTnVtID0gMDsKLQlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKLQorCXU4ICpwSGVhZGVyQnVmUHRyOworCXUxNiBGcmVlTnVtYmVyOworCXUxNiBzdWJGcmFtZVBheWxvYWRMZW4gPSAwOwkvKiBBTVNEVSBTdWJmcmFtZSBsZW5ndGggd2l0aG91dCBBTVNEVS1IZWFkZXIgLyBQYWRkaW5nLiAqLworCXUxNiB0b3RhbE1QRFVTaXplID0gMDsKKwl1OCAqc3ViRnJhbWVIZWFkZXI7CisJdTggcGFkZGluZyA9IDA7CisJdTE2IEZpcnN0VHggPSAwLCBMYXN0VHhJZHggPSAwOworCUJPT0xFQU4gYlZMQU5Qa3Q7CisJaW50IGZyYW1lTnVtID0gMDsKKwlzdHJ1Y3QgcnRfcXVldWVfZW50cnkgKnBRRW50cnk7CiAKIAlBU1NFUlQocFR4QmxrKTsKIAogCUFTU0VSVCgocFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyID4gMSkpOwogCi0Jd2hpbGUocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCkKLQl7CisJd2hpbGUgKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpIHsKIAkJcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QpOwogCQlwVHhCbGstPnBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocFFFbnRyeSk7Ci0JCWlmIChSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCi0JCXsKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKSB7CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LAorCQkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCWJWTEFOUGt0ID0gKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBUeEJsay0+cFBhY2tldCkgPyBUUlVFIDogRkFMU0UpOworCQliVkxBTlBrdCA9CisJCSAgICAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocFR4QmxrLT5wUGFja2V0KSA/IFRSVUUgOiBGQUxTRSk7CiAKLQkJLy8gc2tpcCA4MDIuMyBoZWFkZXIKKwkJLyogc2tpcCA4MDIuMyBoZWFkZXIgKi8KIAkJcFR4QmxrLT5wU3JjQnVmRGF0YSA9IHBUeEJsay0+cFNyY0J1ZkhlYWRlciArIExFTkdUSF84MDJfMzsKLQkJcFR4QmxrLT5TcmNCdWZMZW4gIC09IExFTkdUSF84MDJfMzsKKwkJcFR4QmxrLT5TcmNCdWZMZW4gLT0gTEVOR1RIXzgwMl8zOwogCi0JCS8vIHNraXAgdmxhbiB0YWcKLQkJaWYgKGJWTEFOUGt0KQotCQl7Ci0JCQlwVHhCbGstPnBTcmNCdWZEYXRhCSs9IExFTkdUSF84MDJfMVE7Ci0JCQlwVHhCbGstPlNyY0J1ZkxlbgktPSBMRU5HVEhfODAyXzFROworCQkvKiBza2lwIHZsYW4gdGFnICovCisJCWlmIChiVkxBTlBrdCkgeworCQkJcFR4QmxrLT5wU3JjQnVmRGF0YSArPSBMRU5HVEhfODAyXzFROworCQkJcFR4QmxrLT5TcmNCdWZMZW4gLT0gTEVOR1RIXzgwMl8xUTsKIAkJfQogCi0JCWlmIChmcmFtZU51bSA9PSAwKQotCQl7Ci0JCQlwSGVhZGVyQnVmUHRyID0gU1RBX0J1aWxkX0FNU0RVX0ZyYW1lX0hlYWRlcihwQWQsIHBUeEJsayk7CisJCWlmIChmcmFtZU51bSA9PSAwKSB7CisJCQlwSGVhZGVyQnVmUHRyID0KKwkJCSAgICBTVEFfQnVpbGRfQU1TRFVfRnJhbWVfSGVhZGVyKHBBZCwgcFR4QmxrKTsKIAotCQkJLy8gTk9URTogVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50IHdpbGwgYmUgdXBkYXRlZCBhZnRlciBmaW5hbCBmcmFtZSB3YXMgaGFuZGxlZC4KLQkJCVJUTVBXcml0ZVR4V0lfRGF0YShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7Ci0JCX0KLQkJZWxzZQotCQl7CisJCQkvKiBOT1RFOiBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGZpbmFsIGZyYW1lIHdhcyBoYW5kbGVkLiAqLworCQkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwKKwkJCQkJICAgKHN0cnVjdCBydF90eHdpICopICgmcFR4QmxrLT4KKwkJCQkJCQkgIEhlYWRlckJ1ZgorCQkJCQkJCSAgW1RYSU5GT19TSVpFXSksCisJCQkJCSAgIHBUeEJsayk7CisJCX0gZWxzZSB7CiAJCQlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmWzBdOwotCQkJcGFkZGluZyA9IFJPVU5EX1VQKExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQgKyBzdWJGcmFtZVBheWxvYWRMZW4sIDQpIC0gKExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQgKyBzdWJGcmFtZVBheWxvYWRMZW4pOwotCQkJTmRpc1plcm9NZW1vcnkocEhlYWRlckJ1ZlB0ciwgcGFkZGluZyArIExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQpOworCQkJcGFkZGluZyA9CisJCQkgICAgUk9VTkRfVVAoTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArCisJCQkJICAgICBzdWJGcmFtZVBheWxvYWRMZW4sCisJCQkJICAgICA0KSAtIChMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEICsKKwkJCQkJICAgc3ViRnJhbWVQYXlsb2FkTGVuKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBIZWFkZXJCdWZQdHIsCisJCQkJICAgICAgIHBhZGRpbmcgKyBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEKTsKIAkJCXBIZWFkZXJCdWZQdHIgKz0gcGFkZGluZzsKIAkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiA9IHBhZGRpbmc7CiAJCX0KIAotCQkvLwotCQkvLyBBLU1TRFUgc3ViZnJhbWUKLQkJLy8gICBEQSg2KStTQSg2KStMZW5ndGgoMikgKyBMTEMvU05BUCBFbmNhcAotCQkvLworCQkvKiAqLworCQkvKiBBLU1TRFUgc3ViZnJhbWUgKi8KKwkJLyogICBEQSg2KStTQSg2KStMZW5ndGgoMikgKyBMTEMvU05BUCBFbmNhcCAqLworCQkvKiAqLwogCQlzdWJGcmFtZUhlYWRlciA9IHBIZWFkZXJCdWZQdHI7CiAJCXN1YkZyYW1lUGF5bG9hZExlbiA9IHBUeEJsay0+U3JjQnVmTGVuOwogCiAJCU5kaXNNb3ZlTWVtb3J5KHN1YkZyYW1lSGVhZGVyLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIsIDEyKTsKIAotCiAJCXBIZWFkZXJCdWZQdHIgKz0gTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKIAkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7CiAKLQotCQkvLwotCQkvLyBJbnNlcnQgTExDLVNOQVAgZW5jYXBzdWxhdGlvbiAtIDggb2N0ZXRzCi0JCS8vCi0JCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfT0ZGU0VUKHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOworCQkvKiAqLworCQkvKiBJbnNlcnQgTExDLVNOQVAgZW5jYXBzdWxhdGlvbiAtIDggb2N0ZXRzICovCisJCS8qICovCisJCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfT0ZGU0VUKHBUeEJsay0+cFNyY0J1ZkRhdGEgLSAyLAorCQkJCQkJICAgIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKIAogCQlzdWJGcmFtZVBheWxvYWRMZW4gPSBwVHhCbGstPlNyY0J1ZkxlbjsKIAotCQlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCi0JCXsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKKwkJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKSB7CisJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLAorCQkJCSAgICAgICBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCwgNik7CiAJCQlwSGVhZGVyQnVmUHRyICs9IDY7Ci0JCQkvLyBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikKLQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgMik7CisJCQkvKiBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikgKi8KKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkRhdGEgLSAyLAorCQkJCSAgICAgICAyKTsKIAkJCXBIZWFkZXJCdWZQdHIgKz0gMjsKIAkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfODAyXzFfSDsKIAkJCXN1YkZyYW1lUGF5bG9hZExlbiArPSBMRU5HVEhfODAyXzFfSDsKIAkJfQotCi0JCS8vIHVwZGF0ZSBzdWJGcmFtZSBMZW5ndGggZmllbGQKKwkJLyogdXBkYXRlIHN1YkZyYW1lIExlbmd0aCBmaWVsZCAqLwogCQlzdWJGcmFtZUhlYWRlclsxMl0gPSAoc3ViRnJhbWVQYXlsb2FkTGVuICYgMHhGRjAwKSA+PiA4OwogCQlzdWJGcmFtZUhlYWRlclsxM10gPSBzdWJGcmFtZVBheWxvYWRMZW4gJiAweEZGOwogCiAJCXRvdGFsTVBEVVNpemUgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5TcmNCdWZMZW47CiAKLQkJaWYgKGZyYW1lTnVtID09MCkKLQkJCUZpcnN0VHggPSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYW1lTnVtLCAmRnJlZU51bWJlcik7CisJCWlmIChmcmFtZU51bSA9PSAwKQorCQkJRmlyc3RUeCA9CisJCQkgICAgSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFtZU51bSwKKwkJCQkJCSAgICAgJkZyZWVOdW1iZXIpOwogCQllbHNlCi0JCQlMYXN0VHhJZHggPSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYW1lTnVtLCAmRnJlZU51bWJlcik7CisJCQlMYXN0VHhJZHggPQorCQkJICAgIEhBTF9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhbWVOdW0sCisJCQkJCQkgICAgICZGcmVlTnVtYmVyKTsKIAogCQlmcmFtZU51bSsrOwogCiAJCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKIAkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOwogCi0JCS8vIGNhbGN1bGF0ZSBUcmFuc21pdHRlZCBBTVNEVSBDb3VudCBhbmQgQnl0ZUNvdW50CisJCS8qIGNhbGN1bGF0ZSBUcmFuc21pdHRlZCBBTVNEVSBDb3VudCBhbmQgQnl0ZUNvdW50ICovCiAJCXsKLQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVNEVUNvdW50LnUuTG93UGFydCArKzsKLQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRPY3RldHNJbkFNU0RVLlF1YWRQYXJ0ICs9IHRvdGFsTVBEVVNpemU7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1TRFVDb3VudC51Lkxvd1BhcnQrKzsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRPY3RldHNJbkFNU0RVLlF1YWRQYXJ0ICs9CisJCQkgICAgdG90YWxNUERVU2l6ZTsKIAkJfQogCiAJfQpAQCAtMTkyMCwzOCArMTk0NCwzMSBAQAogCUhBTF9GaW5hbFdyaXRlVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgdG90YWxNUERVU2l6ZSwgRmlyc3RUeCk7CiAJSEFMX0xhc3RUeElkeChwQWQsIHBUeEJsay0+UXVlSWR4LCBMYXN0VHhJZHgpOwogCi0JLy8KLQkvLyBLaWNrIG91dCBUeAotCS8vCi0jaWZkZWYgUlQyODYwCisJLyogKi8KKwkvKiBLaWNrIG91dCBUeCAqLworCS8qICovCiAJaWYgKCFSVE1QX1RFU1RfUFNGTEFHKHBBZCwgZlJUTVBfUFNfRElTQUJMRV9UWCkpCi0jZW5kaWYKIAkJSEFMX0tpY2tPdXRUeChwQWQsIHBUeEJsaywgcFR4QmxrLT5RdWVJZHgpOwogfQogCi1WT0lEIFNUQV9MZWdhY3lfRnJhbWVfVHgoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaykKK3ZvaWQgU1RBX0xlZ2FjeV9GcmFtZV9UeChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaykKIHsKLQlIRUFERVJfODAyXzExCSpwSGVhZGVyXzgwMl8xMTsKLQlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOwotCVVTSE9SVAkJCUZyZWVOdW1iZXI7Ci0JQk9PTEVBTgkJCWJWTEFOUGt0OwotCVBRVUVVRV9FTlRSWQlwUUVudHJ5OworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICpwSGVhZGVyXzgwMl8xMTsKKwl1OCAqcEhlYWRlckJ1ZlB0cjsKKwl1MTYgRnJlZU51bWJlcjsKKwlCT09MRUFOIGJWTEFOUGt0OworCXN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqcFFFbnRyeTsKIAogCUFTU0VSVChwVHhCbGspOwogCi0KIAlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CiAJcFR4QmxrLT5wUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOwotCWlmIChSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCi0JeworCWlmIChSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpIHsKIAkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9NQ0FTVF9GUkFNRSkKLQl7CisJaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfTUNBU1RfRlJBTUUpIHsKIAkJSU5DX0NPVU5URVI2NChwQWQtPldsYW5Db3VudGVycy5NdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQpOwogCX0KIApAQCAtMTk2OCwxODEgKzE5ODUsMTg3IEBACiAJU1RBRmluZENpcGhlckFsZ29yaXRobShwQWQsIHBUeEJsayk7CiAJU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIocEFkLCBwVHhCbGspOwogCi0KLQkvLyBza2lwIDgwMi4zIGhlYWRlcgorCS8qIHNraXAgODAyLjMgaGVhZGVyICovCiAJcFR4QmxrLT5wU3JjQnVmRGF0YSA9IHBUeEJsay0+cFNyY0J1ZkhlYWRlciArIExFTkdUSF84MDJfMzsKLQlwVHhCbGstPlNyY0J1ZkxlbiAgLT0gTEVOR1RIXzgwMl8zOworCXBUeEJsay0+U3JjQnVmTGVuIC09IExFTkdUSF84MDJfMzsKIAotCS8vIHNraXAgdmxhbiB0YWcKLQlpZiAoYlZMQU5Qa3QpCi0JewotCQlwVHhCbGstPnBTcmNCdWZEYXRhCSs9IExFTkdUSF84MDJfMVE7Ci0JCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7CisJLyogc2tpcCB2bGFuIHRhZyAqLworCWlmIChiVkxBTlBrdCkgeworCQlwVHhCbGstPnBTcmNCdWZEYXRhICs9IExFTkdUSF84MDJfMVE7CisJCXBUeEJsay0+U3JjQnVmTGVuIC09IExFTkdUSF84MDJfMVE7CiAJfQogCiAJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07Ci0JcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKSBwSGVhZGVyQnVmUHRyOworCXBIZWFkZXJfODAyXzExID0gKHN0cnVjdCBydF9oZWFkZXJfODAyXzExICopIHBIZWFkZXJCdWZQdHI7CiAKLQkvLyBza2lwIGNvbW1vbiBoZWFkZXIKKwkvKiBza2lwIGNvbW1vbiBoZWFkZXIgKi8KIAlwSGVhZGVyQnVmUHRyICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKIAotCWlmIChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JXTU0pKQotCXsKLQkJLy8KLQkJLy8gYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMKLQkJLy8KLQkJKnBIZWFkZXJCdWZQdHIgPSAocFR4QmxrLT5Vc2VyUHJpb3JpdHkgJiAweDBGKTsKLQkJKihwSGVhZGVyQnVmUHRyKzEpID0gMDsKLQkJcEhlYWRlckJ1ZlB0ciArPTI7CisJaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpIHsKKwkJLyogKi8KKwkJLyogYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMgKi8KKwkJLyogKi8KKwkJKihwSGVhZGVyQnVmUHRyKSA9CisJCSAgICAoKHBUeEJsay0+VXNlclByaW9yaXR5ICYgMHgwRikgfCAocEFkLT5Db21tb25DZmcuCisJCQkJCQkgICAgICBBY2tQb2xpY3lbcFR4QmxrLT4KKwkJCQkJCQkJUXVlSWR4XSA8PCA1KSk7CisJCSoocEhlYWRlckJ1ZlB0ciArIDEpID0gMDsKKwkJcEhlYWRlckJ1ZlB0ciArPSAyOwogCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKIAl9Ci0KLQkvLyBUaGUgcmVtYWluaW5nIGNvbnRlbnQgb2YgTVBEVSBoZWFkZXIgc2hvdWxkIGxvY2F0ZSBhdCA0LW9jdGV0cyBhbGlnbWVudAotCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKXBIZWFkZXJCdWZQdHI7Ci0JcEhlYWRlckJ1ZlB0ciA9IChQQ0hBUikgUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7Ci0JcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7CisJLyogVGhlIHJlbWFpbmluZyBjb250ZW50IG9mIE1QRFUgaGVhZGVyIHNob3VsZCBsb2NhdGUgYXQgNC1vY3RldHMgYWxpZ21lbnQgKi8KKwlwVHhCbGstPkhkclBhZExlbiA9ICh1bnNpZ25lZCBsb25nKXBIZWFkZXJCdWZQdHI7CisJcEhlYWRlckJ1ZlB0ciA9ICh1OCAqKVJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOworCXBUeEJsay0+SGRyUGFkTGVuID0gKHVuc2lnbmVkIGxvbmcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7CiAKIAl7CiAKLQkJLy8KLQkJLy8gSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cwotCQkvLwotCQkvLwotICAgCQkvLyBpZiBvcmlnaW5hbCBFdGhlcm5ldCBmcmFtZSBjb250YWlucyBubyBMTEMvU05BUCwKLQkJLy8gdGhlbiBhbiBleHRyYSBMTEMvU05BUCBlbmNhcCBpcyByZXF1aXJlZAotCQkvLwotCQlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX1NUQVJUKHBUeEJsay0+cFNyY0J1ZkhlYWRlciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOwotCQlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCi0JCXsKLQkJCVVDSEFSIHZsYW5fc2l6ZTsKKwkJLyogKi8KKwkJLyogSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cyAqLworCQkvKiAqLworCQkvKiAqLworCQkvKiBpZiBvcmlnaW5hbCBFdGhlcm5ldCBmcmFtZSBjb250YWlucyBubyBMTEMvU05BUCwgKi8KKwkJLyogdGhlbiBhbiBleHRyYSBMTEMvU05BUCBlbmNhcCBpcyByZXF1aXJlZCAqLworCQkvKiAqLworCQlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX1NUQVJUKHBUeEJsay0+cFNyY0J1ZkhlYWRlciwKKwkJCQkJCSAgIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKKwkJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKSB7CisJCQl1OCB2bGFuX3NpemU7CiAKLQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsCisJCQkJICAgICAgIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKIAkJCXBIZWFkZXJCdWZQdHIgKz0gNjsKLQkJCS8vIHNraXAgdmxhbiB0YWcKLQkJCXZsYW5fc2l6ZSA9ICAoYlZMQU5Qa3QpID8gTEVOR1RIXzgwMl8xUSA6IDA7Ci0JCQkvLyBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikKLQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcisxMit2bGFuX3NpemUsIDIpOworCQkJLyogc2tpcCB2bGFuIHRhZyAqLworCQkJdmxhbl9zaXplID0gKGJWTEFOUGt0KSA/IExFTkdUSF84MDJfMVEgOiAwOworCQkJLyogZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pICovCisJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLAorCQkJCSAgICAgICBwVHhCbGstPnBTcmNCdWZIZWFkZXIgKyAxMiArIHZsYW5fc2l6ZSwKKwkJCQkgICAgICAgMik7CiAJCQlwSGVhZGVyQnVmUHRyICs9IDI7CiAJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gTEVOR1RIXzgwMl8xX0g7CiAJCX0KIAogCX0KIAotCS8vCi0JLy8gcHJlcGFyZSBmb3IgVFhXSQotCS8vIHVzZSBXY2lkIGFzIEtleSBJbmRleAotCS8vCisJLyogKi8KKwkvKiBwcmVwYXJlIGZvciBUWFdJICovCisJLyogdXNlIFdjaWQgYXMgS2V5IEluZGV4ICovCisJLyogKi8KIAotCVJUTVBXcml0ZVR4V0lfRGF0YShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7CisJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKHN0cnVjdCBydF90eHdpICopICgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwKKwkJCSAgIHBUeEJsayk7CiAKLQkvL0ZyZWVOdW1iZXIgPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7CisJLypGcmVlTnVtYmVyID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOyAqLwogCiAJSEFMX1dyaXRlVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgVFJVRSwgJkZyZWVOdW1iZXIpOwogCiAJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOwogCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKIAotCS8vCi0JLy8gS2ljayBvdXQgVHgKLQkvLwotI2lmZGVmIFJUMjg2MAorCS8qICovCisJLyogS2ljayBvdXQgVHggKi8KKwkvKiAqLwogCWlmICghUlRNUF9URVNUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0RJU0FCTEVfVFgpKQotI2VuZGlmCiAJCUhBTF9LaWNrT3V0VHgocEFkLCBwVHhCbGssIHBUeEJsay0+UXVlSWR4KTsKIH0KIAotCi1WT0lEIFNUQV9BUmFsaW5rX0ZyYW1lX1R4KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGspCit2b2lkIFNUQV9BUmFsaW5rX0ZyYW1lX1R4KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrKQogewotCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7Ci0JVVNIT1JUCQkJRnJlZU51bWJlcjsKLQlVU0hPUlQJCQl0b3RhbE1QRFVTaXplPTA7Ci0JVVNIT1JUCQkJRmlyc3RUeCwgTGFzdFR4SWR4OwotCWludCAJCQlmcmFtZU51bSA9IDA7Ci0JQk9PTEVBTgkJCWJWTEFOUGt0OwotCVBRVUVVRV9FTlRSWQlwUUVudHJ5OwotCisJdTggKnBIZWFkZXJCdWZQdHI7CisJdTE2IEZyZWVOdW1iZXI7CisJdTE2IHRvdGFsTVBEVVNpemUgPSAwOworCXUxNiBGaXJzdFR4LCBMYXN0VHhJZHg7CisJaW50IGZyYW1lTnVtID0gMDsKKwlCT09MRUFOIGJWTEFOUGt0OworCXN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqcFFFbnRyeTsKIAogCUFTU0VSVChwVHhCbGspOwogCi0JQVNTRVJUKChwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXI9PSAyKSk7CisJQVNTRVJUKChwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIgPT0gMikpOwogCi0KLQlGaXJzdFR4ID0gTGFzdFR4SWR4ID0gMDsgIC8vIElzIGl0IG9rIGluaXQgdGhleSBhcyAwPwotCXdoaWxlKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpCi0JeworCUZpcnN0VHggPSBMYXN0VHhJZHggPSAwOwkvKiBJcyBpdCBvayBpbml0IHRoZXkgYXMgMD8gKi8KKwl3aGlsZSAocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCkgewogCQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CiAJCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKIAotCQlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKQotCQl7Ci0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJaWYgKFJUTVBfRmlsbFR4QmxrSW5mbyhwQWQsIHBUeEJsaykgIT0gVFJVRSkgeworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwKKwkJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQkJY29udGludWU7CiAJCX0KIAotCQliVkxBTlBrdCA9IChSVE1QX0dFVF9QQUNLRVRfVkxBTihwVHhCbGstPnBQYWNrZXQpID8gVFJVRSA6IEZBTFNFKTsKKwkJYlZMQU5Qa3QgPQorCQkgICAgKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBUeEJsay0+cFBhY2tldCkgPyBUUlVFIDogRkFMU0UpOwogCi0JCS8vIHNraXAgODAyLjMgaGVhZGVyCisJCS8qIHNraXAgODAyLjMgaGVhZGVyICovCiAJCXBUeEJsay0+cFNyY0J1ZkRhdGEgPSBwVHhCbGstPnBTcmNCdWZIZWFkZXIgKyBMRU5HVEhfODAyXzM7Ci0JCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7CisJCXBUeEJsay0+U3JjQnVmTGVuIC09IExFTkdUSF84MDJfMzsKIAotCQkvLyBza2lwIHZsYW4gdGFnCi0JCWlmIChiVkxBTlBrdCkKLQkJewotCQkJcFR4QmxrLT5wU3JjQnVmRGF0YQkrPSBMRU5HVEhfODAyXzFROwotCQkJcFR4QmxrLT5TcmNCdWZMZW4JLT0gTEVOR1RIXzgwMl8xUTsKKwkJLyogc2tpcCB2bGFuIHRhZyAqLworCQlpZiAoYlZMQU5Qa3QpIHsKKwkJCXBUeEJsay0+cFNyY0J1ZkRhdGEgKz0gTEVOR1RIXzgwMl8xUTsKKwkJCXBUeEJsay0+U3JjQnVmTGVuIC09IExFTkdUSF84MDJfMVE7CiAJCX0KIAotCQlpZiAoZnJhbWVOdW0gPT0gMCkKLQkJewkvLyBGb3IgZmlyc3QgZnJhbWUsIHdlIG5lZWQgdG8gY3JlYXRlIHRoZSA4MDIuMTEgaGVhZGVyICsgcGFkZGluZyhvcHRpb25hbCkgKyBSQS1BR0ctTEVOICsgU05BUCBIZWFkZXIKKwkJaWYgKGZyYW1lTnVtID09IDApIHsJLyogRm9yIGZpcnN0IGZyYW1lLCB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgODAyLjExIGhlYWRlciArIHBhZGRpbmcob3B0aW9uYWwpICsgUkEtQUdHLUxFTiArIFNOQVAgSGVhZGVyICovCiAKLQkJCXBIZWFkZXJCdWZQdHIgPSBTVEFfQnVpbGRfQVJhbGlua19GcmFtZV9IZWFkZXIocEFkLCBwVHhCbGspOworCQkJcEhlYWRlckJ1ZlB0ciA9CisJCQkgICAgU1RBX0J1aWxkX0FSYWxpbmtfRnJhbWVfSGVhZGVyKHBBZCwgcFR4QmxrKTsKIAotCQkJLy8gSXQncyBvayB3cml0ZSB0aGUgVHhXSSBoZXJlLCBiZWNhdXNlIHRoZSBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQKLQkJCS8vCXdpbGwgYmUgdXBkYXRlZCBhZnRlciBmaW5hbCBmcmFtZSB3YXMgaGFuZGxlZC4KLQkJCVJUTVBXcml0ZVR4V0lfRGF0YShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7CisJCQkvKiBJdCdzIG9rIHdyaXRlIHRoZSBUeFdJIGhlcmUsIGJlY2F1c2UgdGhlIFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCAqLworCQkJLyogICAgICB3aWxsIGJlIHVwZGF0ZWQgYWZ0ZXIgZmluYWwgZnJhbWUgd2FzIGhhbmRsZWQuICovCisJCQlSVE1QV3JpdGVUeFdJX0RhdGEocEFkLAorCQkJCQkgICAoc3RydWN0IHJ0X3R4d2kgKikgKCZwVHhCbGstPgorCQkJCQkJCSAgSGVhZGVyQnVmCisJCQkJCQkJICBbVFhJTkZPX1NJWkVdKSwKKwkJCQkJICAgcFR4QmxrKTsKIAorCQkJLyogKi8KKwkJCS8qIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMgKi8KKwkJCS8qICovCisJCQlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX09GRlNFVChwVHhCbGstPgorCQkJCQkJCSAgICBwU3JjQnVmRGF0YSAtIDIsCisJCQkJCQkJICAgIHBUeEJsay0+CisJCQkJCQkJICAgIHBFeHRyYUxsY1NuYXBFbmNhcCk7CiAKLQkJCS8vCi0JCQkvLyBJbnNlcnQgTExDLVNOQVAgZW5jYXBzdWxhdGlvbiAtIDggb2N0ZXRzCi0JCQkvLwotCQkJRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9PRkZTRVQocFR4QmxrLT5wU3JjQnVmRGF0YS0yLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCk7Ci0KLQkJCWlmIChwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCkKLQkJCXsKLQkJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCwgNik7CisJCQlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApIHsKKwkJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLAorCQkJCQkgICAgICAgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIDYpOwogCQkJCXBIZWFkZXJCdWZQdHIgKz0gNjsKLQkJCQkvLyBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikKLQkJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZEYXRhLTIsIDIpOworCQkJCS8qIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKSAqLworCQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsCisJCQkJCSAgICAgICBwVHhCbGstPnBTcmNCdWZEYXRhIC0gMiwgMik7CiAJCQkJcEhlYWRlckJ1ZlB0ciArPSAyOwogCQkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfODAyXzFfSDsKIAkJCX0KLQkJfQotCQllbHNlCi0JCXsJLy8gRm9yIHNlY29uZCBhZ2dyZWdhdGVkIGZyYW1lLCB3ZSBuZWVkIGNyZWF0ZSB0aGUgODAyLjMgaGVhZGVyIHRvIGhlYWRlckJ1ZiwgYmVjYXVzZSBQQ0kgd2lsbCBjb3B5IGl0IHRvIFNEUHRyMC4KKwkJfSBlbHNlIHsJLyogRm9yIHNlY29uZCBhZ2dyZWdhdGVkIGZyYW1lLCB3ZSBuZWVkIGNyZWF0ZSB0aGUgODAyLjMgaGVhZGVyIHRvIGhlYWRlckJ1ZiwgYmVjYXVzZSBQQ0kgd2lsbCBjb3B5IGl0IHRvIFNEUHRyMC4gKi8KIAogCQkJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZlswXTsKIAkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiA9IDA7CiAKLQkJCS8vIEEtUmFsaW5rIHN1Yi1zZXF1ZW50IGZyYW1lIGhlYWRlciBpcyB0aGUgc2FtZSBhcyA4MDIuMyBoZWFkZXIuCi0JCQkvLyAgIERBKDYpK1NBKDYpK0ZyYW1lVHlwZSgyKQotCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyLCAxMik7CisJCQkvKiBBLVJhbGluayBzdWItc2VxdWVudCBmcmFtZSBoZWFkZXIgaXMgdGhlIHNhbWUgYXMgODAyLjMgaGVhZGVyLiAqLworCQkJLyogICBEQSg2KStTQSg2KStGcmFtZVR5cGUoMikgKi8KKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkhlYWRlciwKKwkJCQkgICAgICAgMTIpOwogCQkJcEhlYWRlckJ1ZlB0ciArPSAxMjsKLQkJCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQotCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmRGF0YS0yLCAyKTsKKwkJCS8qIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKSAqLworCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmRGF0YSAtIDIsCisJCQkJICAgICAgIDIpOwogCQkJcEhlYWRlckJ1ZlB0ciArPSAyOwogCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gTEVOR1RIX0FSQUxJTktfU1VCRlJBTUVIRUFEOwogCQl9CiAKIAkJdG90YWxNUERVU2l6ZSArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPlNyY0J1ZkxlbjsKIAotCQkvL0ZyZWVOdW1iZXIgPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7Ci0JCWlmIChmcmFtZU51bSA9PTApCi0JCQlGaXJzdFR4ID0gSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFtZU51bSwgJkZyZWVOdW1iZXIpOworCQkvKkZyZWVOdW1iZXIgPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7ICovCisJCWlmIChmcmFtZU51bSA9PSAwKQorCQkJRmlyc3RUeCA9CisJCQkgICAgSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFtZU51bSwKKwkJCQkJCSAgICAgJkZyZWVOdW1iZXIpOwogCQllbHNlCi0JCQlMYXN0VHhJZHggPSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYW1lTnVtLCAmRnJlZU51bWJlcik7CisJCQlMYXN0VHhJZHggPQorCQkJICAgIEhBTF9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhbWVOdW0sCisJCQkJCQkgICAgICZGcmVlTnVtYmVyKTsKIAogCQlmcmFtZU51bSsrOwogCkBAIC0yMTU1LDQwICsyMTc4LDM0IEBACiAJSEFMX0ZpbmFsV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCB0b3RhbE1QRFVTaXplLCBGaXJzdFR4KTsKIAlIQUxfTGFzdFR4SWR4KHBBZCwgcFR4QmxrLT5RdWVJZHgsIExhc3RUeElkeCk7CiAKLQkvLwotCS8vIEtpY2sgb3V0IFR4Ci0JLy8KLSNpZmRlZiBSVDI4NjAKKwkvKiAqLworCS8qIEtpY2sgb3V0IFR4ICovCisJLyogKi8KIAlpZiAoIVJUTVBfVEVTVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19ESVNBQkxFX1RYKSkKLSNlbmRpZgogCQlIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBwVHhCbGstPlF1ZUlkeCk7CiAKIH0KIAotCi1WT0lEIFNUQV9GcmFnbWVudF9GcmFtZV9UeCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBUWF9CTEsJCSpwVHhCbGspCit2b2lkIFNUQV9GcmFnbWVudF9GcmFtZV9UeChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaykKIHsKLQlIRUFERVJfODAyXzExCSpwSGVhZGVyXzgwMl8xMTsKLQlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOwotCVVTSE9SVAkJCUZyZWVOdW1iZXI7Ci0JVUNIQVIgCQkJZnJhZ051bSA9IDA7Ci0JUEFDS0VUX0lORk8JCVBhY2tldEluZm87Ci0JVVNIT1JUCQkJRW5jcnlwdGlvbk92ZXJoZWFkID0gMDsKLQlVSU5UMzIJCQlGcmVlTXBkdVNpemUsIFNyY1JlbWFpbmluZ0J5dGVzOwotCVVTSE9SVAkJCUFja0R1cmF0aW9uOwotCVVJTlQgCQkJTmV4dE1wZHVTaXplOwotCUJPT0xFQU4JCQliVkxBTlBrdDsKLQlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKLQorCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICpwSGVhZGVyXzgwMl8xMTsKKwl1OCAqcEhlYWRlckJ1ZlB0cjsKKwl1MTYgRnJlZU51bWJlcjsKKwl1OCBmcmFnTnVtID0gMDsKKwlzdHJ1Y3QgcnRfcGFja2V0X2luZm8gUGFja2V0SW5mbzsKKwl1MTYgRW5jcnlwdGlvbk92ZXJoZWFkID0gMDsKKwl1MzIgRnJlZU1wZHVTaXplLCBTcmNSZW1haW5pbmdCeXRlczsKKwl1MTYgQWNrRHVyYXRpb247CisJdTMyIE5leHRNcGR1U2l6ZTsKKwlCT09MRUFOIGJWTEFOUGt0OworCXN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqcFFFbnRyeTsKKwlIVFRSQU5TTUlUX1NFVFRJTkcgKnBUcmFuc21pdDsKIAogCUFTU0VSVChwVHhCbGspOwogCiAJcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QpOwogCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKLQlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKQotCXsKKwlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKSB7CiAJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQlyZXR1cm47CiAJfQpAQCAtMjE5OSwxMTIgKzIyMTYsMTI1IEBACiAJU1RBRmluZENpcGhlckFsZ29yaXRobShwQWQsIHBUeEJsayk7CiAJU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIocEFkLCBwVHhCbGspOwogCi0JaWYgKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9US0lQKQotCXsKLQkJcFR4QmxrLT5wUGFja2V0ID0gZHVwbGljYXRlX3BrdF93aXRoX1RLSVBfTUlDKHBBZCwgcFR4QmxrLT5wUGFja2V0KTsKKwlpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApIHsKKwkJcFR4QmxrLT5wUGFja2V0ID0KKwkJICAgIGR1cGxpY2F0ZV9wa3Rfd2l0aF9US0lQX01JQyhwQWQsIHBUeEJsay0+cFBhY2tldCk7CiAJCWlmIChwVHhCbGstPnBQYWNrZXQgPT0gTlVMTCkKIAkJCXJldHVybjsKLQkJUlRNUF9RdWVyeVBhY2tldEluZm8ocFR4QmxrLT5wUGFja2V0LCAmUGFja2V0SW5mbywgJnBUeEJsay0+cFNyY0J1ZkhlYWRlciwgJnBUeEJsay0+U3JjQnVmTGVuKTsKKwkJUlRNUF9RdWVyeVBhY2tldEluZm8ocFR4QmxrLT5wUGFja2V0LCAmUGFja2V0SW5mbywKKwkJCQkgICAgICZwVHhCbGstPnBTcmNCdWZIZWFkZXIsCisJCQkJICAgICAmcFR4QmxrLT5TcmNCdWZMZW4pOwogCX0KLQotCS8vIHNraXAgODAyLjMgaGVhZGVyCisJLyogc2tpcCA4MDIuMyBoZWFkZXIgKi8KIAlwVHhCbGstPnBTcmNCdWZEYXRhID0gcFR4QmxrLT5wU3JjQnVmSGVhZGVyICsgTEVOR1RIXzgwMl8zOwotCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7CisJcFR4QmxrLT5TcmNCdWZMZW4gLT0gTEVOR1RIXzgwMl8zOwogCi0KLQkvLyBza2lwIHZsYW4gdGFnCi0JaWYgKGJWTEFOUGt0KQotCXsKLQkJcFR4QmxrLT5wU3JjQnVmRGF0YQkrPSBMRU5HVEhfODAyXzFROwotCQlwVHhCbGstPlNyY0J1ZkxlbgktPSBMRU5HVEhfODAyXzFROworCS8qIHNraXAgdmxhbiB0YWcgKi8KKwlpZiAoYlZMQU5Qa3QpIHsKKwkJcFR4QmxrLT5wU3JjQnVmRGF0YSArPSBMRU5HVEhfODAyXzFROworCQlwVHhCbGstPlNyY0J1ZkxlbiAtPSBMRU5HVEhfODAyXzFROwogCX0KIAogCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOwotCXBIZWFkZXJfODAyXzExID0gKEhFQURFUl84MDJfMTEgKilwSGVhZGVyQnVmUHRyOworCXBIZWFkZXJfODAyXzExID0gKHN0cnVjdCBydF9oZWFkZXJfODAyXzExICopIHBIZWFkZXJCdWZQdHI7CiAKLQotCS8vIHNraXAgY29tbW9uIGhlYWRlcgorCS8qIHNraXAgY29tbW9uIGhlYWRlciAqLwogCXBIZWFkZXJCdWZQdHIgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOwogCi0JaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpCi0JewotCQkvLwotCQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcwotCQkvLworCWlmIChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JXTU0pKSB7CisJCS8qICovCisJCS8qIGJ1aWxkIFFPUyBDb250cm9sIGJ5dGVzICovCisJCS8qICovCiAJCSpwSGVhZGVyQnVmUHRyID0gKHBUeEJsay0+VXNlclByaW9yaXR5ICYgMHgwRik7CiAKLQkJKihwSGVhZGVyQnVmUHRyKzEpID0gMDsKLQkJcEhlYWRlckJ1ZlB0ciArPTI7CisJCSoocEhlYWRlckJ1ZlB0ciArIDEpID0gMDsKKwkJcEhlYWRlckJ1ZlB0ciArPSAyOwogCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKIAl9CisJLyogKi8KKwkvKiBwYWRkaW5nIGF0IGZyb250IG9mIExMQyBoZWFkZXIgKi8KKwkvKiBMTEMgaGVhZGVyIHNob3VsZCBsb2NhdGUgYXQgNC1vY3RldHMgYWxpZ21lbnQgKi8KKwkvKiAqLworCXBUeEJsay0+SGRyUGFkTGVuID0gKHVuc2lnbmVkIGxvbmcpcEhlYWRlckJ1ZlB0cjsKKwlwSGVhZGVyQnVmUHRyID0gKHU4ICopUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7CisJcFR4QmxrLT5IZHJQYWRMZW4gPSAodW5zaWduZWQgbG9uZykocEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGRyUGFkTGVuKTsKIAotCS8vCi0JLy8gcGFkZGluZyBhdCBmcm9udCBvZiBMTEMgaGVhZGVyCi0JLy8gTExDIGhlYWRlciBzaG91bGQgbG9jYXRlIGF0IDQtb2N0ZXRzIGFsaWdtZW50Ci0JLy8KLQlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORylwSGVhZGVyQnVmUHRyOwotCXBIZWFkZXJCdWZQdHIgPSAoUENIQVIpIFJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOwotCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOwotCi0KLQotCS8vCi0JLy8gSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cwotCS8vCi0JLy8KLSAgIAkvLyBpZiBvcmlnaW5hbCBFdGhlcm5ldCBmcmFtZSBjb250YWlucyBubyBMTEMvU05BUCwKLQkvLyB0aGVuIGFuIGV4dHJhIExMQy9TTkFQIGVuY2FwIGlzIHJlcXVpcmVkCi0JLy8KLQlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX1NUQVJUKHBUeEJsay0+cFNyY0J1ZkhlYWRlciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOwotCWlmIChwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCkKLQl7Ci0JCVVDSEFSIHZsYW5fc2l6ZTsKKwkvKiAqLworCS8qIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMgKi8KKwkvKiAqLworCS8qICovCisJLyogaWYgb3JpZ2luYWwgRXRoZXJuZXQgZnJhbWUgY29udGFpbnMgbm8gTExDL1NOQVAsICovCisJLyogdGhlbiBhbiBleHRyYSBMTEMvU05BUCBlbmNhcCBpcyByZXF1aXJlZCAqLworCS8qICovCisJRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9TVEFSVChwVHhCbGstPnBTcmNCdWZIZWFkZXIsCisJCQkJCSAgIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKKwlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApIHsKKwkJdTggdmxhbl9zaXplOwogCiAJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKIAkJcEhlYWRlckJ1ZlB0ciArPSA2OwotCQkvLyBza2lwIHZsYW4gdGFnCi0JCXZsYW5fc2l6ZSA9ICAoYlZMQU5Qa3QpID8gTEVOR1RIXzgwMl8xUSA6IDA7Ci0JCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQotCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIrMTIrdmxhbl9zaXplLCAyKTsKKwkJLyogc2tpcCB2bGFuIHRhZyAqLworCQl2bGFuX3NpemUgPSAoYlZMQU5Qa3QpID8gTEVOR1RIXzgwMl8xUSA6IDA7CisJCS8qIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKSAqLworCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLAorCQkJICAgICAgIHBUeEJsay0+cFNyY0J1ZkhlYWRlciArIDEyICsgdmxhbl9zaXplLCAyKTsKIAkJcEhlYWRlckJ1ZlB0ciArPSAyOwogCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gTEVOR1RIXzgwMl8xX0g7CiAJfQogCisJLyogSWYgVEtJUCBpcyB1c2VkIGFuZCBmcmFnbWVudGF0aW9uIGlzIHJlcXVpcmVkLiBEcml2ZXIgaGFzIHRvICovCisJLyogICAgICBhcHBlbmQgVEtJUCBNSUMgYXQgdGFpbCBvZiB0aGUgc2NhdHRlciBidWZmZXIgKi8KKwkvKiAgICAgIE1BQyBBU0lDIHdpbGwgb25seSBwZXJmb3JtIElWL0VJVi9JQ1YgaW5zZXJ0aW9uIGJ1dCBubyBUS0lQIE1JQyAqLworCWlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkgeworCQlSVE1QQ2FsY3VsYXRlTUlDVmFsdWUocEFkLCBwVHhCbGstPnBQYWNrZXQsCisJCQkJICAgICAgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIHBUeEJsay0+cEtleSwKKwkJCQkgICAgICAwKTsKIAotCS8vIElmIFRLSVAgaXMgdXNlZCBhbmQgZnJhZ21lbnRhdGlvbiBpcyByZXF1aXJlZC4gRHJpdmVyIGhhcyB0bwotCS8vCWFwcGVuZCBUS0lQIE1JQyBhdCB0YWlsIG9mIHRoZSBzY2F0dGVyIGJ1ZmZlcgotCS8vCU1BQyBBU0lDIHdpbGwgb25seSBwZXJmb3JtIElWL0VJVi9JQ1YgaW5zZXJ0aW9uIGJ1dCBubyBUS0lQIE1JQwotCWlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkKLQl7Ci0KLQkJLy8gTk9URTogRE9OJ1QgcmVmZXIgdGhlIHNrYi0+bGVuIGRpcmVjdGx5IGFmdGVyIGZvbGxvd2luZyBjb3B5LiBCZWNhc3VlIHRoZSBsZW5ndGggaXMgbm90IGFkanVzdAotCQkvLwkJCXRvIGNvcnJlY3QgbGVuZ2h0LCByZWZlciB0byBwVHhCbGstPlNyY0J1ZkxlbiBmb3IgdGhlIHBhY2tldCBsZW5ndGggaW4gZm9sbG93aW5nIHByb2dyZXNzLgotCQlOZGlzTW92ZU1lbW9yeShwVHhCbGstPnBTcmNCdWZEYXRhICsgcFR4QmxrLT5TcmNCdWZMZW4sICZwQWQtPlByaXZhdGVJbmZvLlR4Lk1JQ1swXSwgOCk7Ci0JCS8vc2tiX3B1dCgoUlRQS1RfVE9fT1NQS1QocFR4QmxrLT5wUGFja2V0KSktPnRhaWwsIDgpOworCQkvKiBOT1RFOiBET04nVCByZWZlciB0aGUgc2tiLT5sZW4gZGlyZWN0bHkgYWZ0ZXIgZm9sbG93aW5nIGNvcHkuIEJlY2FzdWUgdGhlIGxlbmd0aCBpcyBub3QgYWRqdXN0ICovCisJCS8qICAgICAgICAgICAgICAgICAgICAgIHRvIGNvcnJlY3QgbGVuZ2h0LCByZWZlciB0byBwVHhCbGstPlNyY0J1ZkxlbiBmb3IgdGhlIHBhY2tldCBsZW5ndGggaW4gZm9sbG93aW5nIHByb2dyZXNzLiAqLworCQlOZGlzTW92ZU1lbW9yeShwVHhCbGstPnBTcmNCdWZEYXRhICsgcFR4QmxrLT5TcmNCdWZMZW4sCisJCQkgICAgICAgJnBBZC0+UHJpdmF0ZUluZm8uVHguTUlDWzBdLCA4KTsKKwkJLypza2JfcHV0KChSVFBLVF9UT19PU1BLVChwVHhCbGstPnBQYWNrZXQpKS0+dGFpbCwgOCk7ICovCiAJCXBUeEJsay0+U3JjQnVmTGVuICs9IDg7CiAJCXBUeEJsay0+VG90YWxGcmFtZUxlbiArPSA4OwogCQlwVHhCbGstPkNpcGhlckFsZyA9IENJUEhFUl9US0lQX05PX01JQzsKIAl9Ci0KLQkvLwotCS8vIGNhbGN1YXRlIHRoZSBvdmVyaGVhZCBieXRlcyB0aGF0IGVuY3J5cHRpb24gYWxnb3JpdGhtIG1heSBhZGQuIFRoaXMKLQkvLyBhZmZlY3RzIHRoZSBjYWxjdWxhdGUgb2YgImR1cmF0aW9uIiBmaWVsZAotCS8vCi0JaWYgKChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfV0VQNjQpIHx8IChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfV0VQMTI4KSkKLQkJRW5jcnlwdGlvbk92ZXJoZWFkID0gODsgLy9XRVA6IElWWzRdICsgSUNWWzRdOworCS8qICovCisJLyogY2FsY3VhdGUgdGhlIG92ZXJoZWFkIGJ5dGVzIHRoYXQgZW5jcnlwdGlvbiBhbGdvcml0aG0gbWF5IGFkZC4gVGhpcyAqLworCS8qIGFmZmVjdHMgdGhlIGNhbGN1bGF0ZSBvZiAiZHVyYXRpb24iIGZpZWxkICovCisJLyogKi8KKwlpZiAoKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkKKwkgICAgfHwgKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9XRVAxMjgpKQorCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSA4OwkvKldFUDogSVZbNF0gKyBJQ1ZbNF07ICovCiAJZWxzZSBpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVBfTk9fTUlDKQotCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAxMjsvL1RLSVA6IElWWzRdICsgRUlWWzRdICsgSUNWWzRdLCBNSUMgd2lsbCBiZSBhZGRlZCB0byBUb3RhbFBhY2tldExlbmd0aAorCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAxMjsJLypUS0lQOiBJVls0XSArIEVJVls0XSArIElDVls0XSwgTUlDIHdpbGwgYmUgYWRkZWQgdG8gVG90YWxQYWNrZXRMZW5ndGggKi8KIAllbHNlIGlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkKLQkJRW5jcnlwdGlvbk92ZXJoZWFkID0gMjA7Ly9US0lQOiBJVls0XSArIEVJVls0XSArIElDVls0XSArIE1JQ1s4XQorCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAyMDsJLypUS0lQOiBJVls0XSArIEVJVls0XSArIElDVls0XSArIE1JQ1s4XSAqLwogCWVsc2UgaWYgKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9BRVMpCi0JCUVuY3J5cHRpb25PdmVyaGVhZCA9IDE2OwkvLyBBRVM6IElWWzRdICsgRUlWWzRdICsgTUlDWzhdCisJCUVuY3J5cHRpb25PdmVyaGVhZCA9IDE2OwkvKiBBRVM6IElWWzRdICsgRUlWWzRdICsgTUlDWzhdICovCiAJZWxzZQogCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAwOwogCi0JLy8gZGVjaWRlIGhvdyBtdWNoIHRpbWUgYW4gQUNLL0NUUyBmcmFtZSB3aWxsIGNvbnN1bWUgaW4gdGhlIGFpcgotCUFja0R1cmF0aW9uID0gUlRNUENhbGNEdXJhdGlvbihwQWQsIHBBZC0+Q29tbW9uQ2ZnLkV4cGVjdGVkQUNLUmF0ZVtwVHhCbGstPlR4UmF0ZV0sIDE0KTsKKwlwVHJhbnNtaXQgPSBwVHhCbGstPnBUcmFuc21pdDsKKwkvKiBEZWNpZGUgdGhlIFRYIHJhdGUgKi8KKwlpZiAocFRyYW5zbWl0LT5maWVsZC5NT0RFID09IE1PREVfQ0NLKQorCQlwVHhCbGstPlR4UmF0ZSA9IHBUcmFuc21pdC0+ZmllbGQuTUNTOworCWVsc2UgaWYgKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA9PSBNT0RFX09GRE0pCisJCXBUeEJsay0+VHhSYXRlID0gcFRyYW5zbWl0LT5maWVsZC5NQ1MgKyBSQVRFX0ZJUlNUX09GRE1fUkFURTsKKwllbHNlCisJCXBUeEJsay0+VHhSYXRlID0gUkFURV82XzU7CiAKLQkvLyBJbml0IHRoZSB0b3RhbCBwYXlsb2FkIGxlbmd0aCBvZiB0aGlzIGZyYW1lLgorCS8qIGRlY2lkZSBob3cgbXVjaCB0aW1lIGFuIEFDSy9DVFMgZnJhbWUgd2lsbCBjb25zdW1lIGluIHRoZSBhaXIgKi8KKwlpZiAocFR4QmxrLT5UeFJhdGUgPD0gUkFURV9MQVNUX09GRE1fUkFURSkKKwkJQWNrRHVyYXRpb24gPQorCQkgICAgUlRNUENhbGNEdXJhdGlvbihwQWQsCisJCQkJICAgICBwQWQtPkNvbW1vbkNmZy5FeHBlY3RlZEFDS1JhdGVbcFR4QmxrLT4KKwkJCQkJCQkJICAgIFR4UmF0ZV0sCisJCQkJICAgICAxNCk7CisJZWxzZQorCQlBY2tEdXJhdGlvbiA9IFJUTVBDYWxjRHVyYXRpb24ocEFkLCBSQVRFXzZfNSwgMTQpOworCisJLyogSW5pdCB0aGUgdG90YWwgcGF5bG9hZCBsZW5ndGggb2YgdGhpcyBmcmFtZS4gKi8KIAlTcmNSZW1haW5pbmdCeXRlcyA9IHBUeEJsay0+U3JjQnVmTGVuOwogCiAJcFR4QmxrLT5Ub3RhbEZyYWdOdW0gPSAweGZmOwpAQCAtMjMxNSwyNSArMjM0NSwyOCBAQAogCiAJCUZyZWVNcGR1U2l6ZSAtPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CiAKLQkJaWYgKFNyY1JlbWFpbmluZ0J5dGVzIDw9IEZyZWVNcGR1U2l6ZSkKLQkJewkvLyB0aGlzIGlzIHRoZSBsYXN0IG9yIG9ubHkgZnJhZ21lbnQKKwkJaWYgKFNyY1JlbWFpbmluZ0J5dGVzIDw9IEZyZWVNcGR1U2l6ZSkgewkvKiB0aGlzIGlzIHRoZSBsYXN0IG9yIG9ubHkgZnJhZ21lbnQgKi8KIAogCQkJcFR4QmxrLT5TcmNCdWZMZW4gPSBTcmNSZW1haW5pbmdCeXRlczsKIAogCQkJcEhlYWRlcl84MDJfMTEtPkZDLk1vcmVGcmFnID0gMDsKLQkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IHBBZC0+Q29tbW9uQ2ZnLkRzaWZzICsgQWNrRHVyYXRpb247CisJCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPQorCQkJICAgIHBBZC0+Q29tbW9uQ2ZnLkRzaWZzICsgQWNrRHVyYXRpb247CiAKLQkJCS8vIEluZGljYXRlIHRoZSBsb3dlciBsYXllciB0aGF0IHRoaXMncyB0aGUgbGFzdCBmcmFnbWVudC4KKwkJCS8qIEluZGljYXRlIHRoZSBsb3dlciBsYXllciB0aGF0IHRoaXMncyB0aGUgbGFzdCBmcmFnbWVudC4gKi8KIAkJCXBUeEJsay0+VG90YWxGcmFnTnVtID0gZnJhZ051bTsKLQkJfQotCQllbHNlCi0JCXsJLy8gbW9yZSBmcmFnbWVudCBpcyByZXF1aXJlZAorCQl9IGVsc2UgewkvKiBtb3JlIGZyYWdtZW50IGlzIHJlcXVpcmVkICovCiAKIAkJCXBUeEJsay0+U3JjQnVmTGVuID0gRnJlZU1wZHVTaXplOwogCi0JCQlOZXh0TXBkdVNpemUgPSBtaW4oKChVSU5UKVNyY1JlbWFpbmluZ0J5dGVzIC0gcFR4QmxrLT5TcmNCdWZMZW4pLCAoKFVJTlQpcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQpKTsKKwkJCU5leHRNcGR1U2l6ZSA9CisJCQkgICAgbWluKCgodTMyKVNyY1JlbWFpbmluZ0J5dGVzIC0gcFR4QmxrLT5TcmNCdWZMZW4pLAorCQkJCSgodTMyKXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSk7CiAJCQlwSGVhZGVyXzgwMl8xMS0+RkMuTW9yZUZyYWcgPSAxOwotCQkJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gKDMgKiBwQWQtPkNvbW1vbkNmZy5Ec2lmcykgKyAoMiAqIEFja0R1cmF0aW9uKSArIFJUTVBDYWxjRHVyYXRpb24ocEFkLCBwVHhCbGstPlR4UmF0ZSwgTmV4dE1wZHVTaXplICsgRW5jcnlwdGlvbk92ZXJoZWFkKTsKKwkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9CisJCQkgICAgKDMgKiBwQWQtPkNvbW1vbkNmZy5Ec2lmcykgKyAoMiAqIEFja0R1cmF0aW9uKSArCisJCQkgICAgUlRNUENhbGNEdXJhdGlvbihwQWQsIHBUeEJsay0+VHhSYXRlLAorCQkJCQkgICAgIE5leHRNcGR1U2l6ZSArIEVuY3J5cHRpb25PdmVyaGVhZCk7CiAJCX0KIAogCQlpZiAoZnJhZ051bSA9PSAwKQpAQCAtMjM0MSwxNiArMjM3NCwxOSBAQAogCQllbHNlCiAJCQlwVHhCbGstPkZyYW1lR2FwID0gSUZTX1NJRlM7CiAKLQkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKKwkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwKKwkJCQkgICAoc3RydWN0IHJ0X3R4d2kgKikgKCZwVHhCbGstPgorCQkJCQkJICBIZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwKKwkJCQkgICBwVHhCbGspOwogCiAJCUhBTF9Xcml0ZUZyYWdUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFnTnVtLCAmRnJlZU51bWJlcik7CiAKIAkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOwogCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7CiAKLQkJLy8gVXBkYXRlIHRoZSBmcmFtZSBudW1iZXIsIHJlbWFpbmluZyBzaXplIG9mIHRoZSBORElTIHBhY2tldCBwYXlsb2FkLgorCQkvKiBVcGRhdGUgdGhlIGZyYW1lIG51bWJlciwgcmVtYWluaW5nIHNpemUgb2YgdGhlIE5ESVMgcGFja2V0IHBheWxvYWQuICovCiAKLQkJLy8gc3BhY2UgZm9yIDgwMi4xMSBoZWFkZXIuCisJCS8qIHNwYWNlIGZvciA4MDIuMTEgaGVhZGVyLiAqLwogCQlpZiAoZnJhZ051bSA9PSAwICYmIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQogCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuIC09IExFTkdUSF84MDJfMV9IOwogCkBAIC0yMzU4LDE3ICsyMzk0LDE3IEBACiAJCVNyY1JlbWFpbmluZ0J5dGVzIC09IHBUeEJsay0+U3JjQnVmTGVuOwogCQlwVHhCbGstPnBTcmNCdWZEYXRhICs9IHBUeEJsay0+U3JjQnVmTGVuOwogCi0JCXBIZWFkZXJfODAyXzExLT5GcmFnKys7CSAvLyBpbmNyZWFzZSBGcmFnICMKKwkJcEhlYWRlcl84MDJfMTEtPkZyYWcrKzsJLyogaW5jcmVhc2UgRnJhZyAjICovCiAKLQl9d2hpbGUoU3JjUmVtYWluaW5nQnl0ZXMgPiAwKTsKKwl9IHdoaWxlIChTcmNSZW1haW5pbmdCeXRlcyA+IDApOwogCi0JLy8KLQkvLyBLaWNrIG91dCBUeAotCS8vCi0JSEFMX0tpY2tPdXRUeChwQWQsIHBUeEJsaywgcFR4QmxrLT5RdWVJZHgpOworCS8qICovCisJLyogS2ljayBvdXQgVHggKi8KKwkvKiAqLworCWlmICghUlRNUF9URVNUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0RJU0FCTEVfVFgpKQorCQlIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBwVHhCbGstPlF1ZUlkeCk7CiB9CiAKLQogI2RlZmluZSBSRUxFQVNFX0ZSQU1FU19PRl9UWEJMSyhfcEFkLCBfcFR4QmxrLCBfcFFFbnRyeSwgX1N0YXR1cykgCQkJCQkJCQkJCVwKIAkJd2hpbGUoX3BUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpCQkJCQkJCQkJCQkJCQlcCiAJCXsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXApAQCAtMjM3Niw3ICsyNDEyLDYgQEAKIAkJCVJFTEVBU0VfTkRJU19QQUNLRVQoX3BBZCwgUVVFVUVfRU5UUllfVE9fUEFDS0VUKF9wUUVudHJ5KSwgX1N0YXR1cyk7CVwKIAkJfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTIzODcsNyArMjQyMiw3IEBACiAKIAlBcmd1bWVudHM6CiAJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlQTkRJU19QQUNLRVQJUG9pbnRlciB0byBvdXRnb2luZyBOZGlzIGZyYW1lCisJCXZvaWQgKglQb2ludGVyIHRvIG91dGdvaW5nIE5kaXMgZnJhbWUKIAkJTnVtYmVyT2ZGcmFnCU51bWJlciBvZiBmcmFnbWVudCByZXF1aXJlZAogCiAJUmV0dXJuIFZhbHVlOgpAQCAtMjM5OSwxMjIgKzI0MzQsMTE3IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1ORElTX1NUQVRVUyBTVEFIYXJkVHJhbnNtaXQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVFhfQkxLIAkJCSpwVHhCbGssCi0JSU4JVUNIQVIJCQlRdWVJZHgpCitpbnQgU1RBSGFyZFRyYW5zbWl0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssIHU4IFF1ZUlkeCkKIHsKLQlORElTX1BBQ0tFVAkJKnBQYWNrZXQ7Ci0JUFFVRVVFX0VOVFJZCXBRRW50cnk7CisJY2hhciAqcFBhY2tldDsKKwlzdHJ1Y3QgcnRfcXVldWVfZW50cnkgKnBRRW50cnk7CiAKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBTVEVQIDAuIERPIFNBTklUWSBDSEVDSyBBTkQgU09NRSBFQVJMWSBQUkVQQVJBVElPTi4KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIFNURVAgMC4gRE8gU0FOSVRZIENIRUNLIEFORCBTT01FIEVBUkxZIFBSRVBBUkFUSU9OLiAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qICovCiAJQVNTRVJUKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcik7Ci0JaWYgKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInBUeEJsay0+VG90YWxGcmFtZU51bSA9PSAlbGQhXG4iLCBwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIpKTsKKwlpZiAocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCA9PSBOVUxMKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgicFR4QmxrLT5Ub3RhbEZyYW1lTnVtID09ICVsZCFcbiIsCisJCQkgIHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcikpOwogCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKIAl9CiAKIAlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpOwogCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gU1RFUCAxLiBXQUtFIFVQIFBIWQotCS8vCQlvdXRnb2luZyBmcmFtZSBhbHdheXMgd2FrZXVwIFBIWSB0byBwcmV2ZW50IGZyYW1lIGxvc3QgYW5kCi0JLy8JCXR1cm4gb2ZmIFBTTSBiaXQgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIG5vdCB0byBjaGFuZ2UgUFNNIGJpdCwganVzdCBzZW5kIHRoaXMgZnJhbWUgb3V0PwotCWlmICgocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQotCXsKLQkgICAgREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNGb3JjZVdha2V1cCBBdCBIYXJkVHhcbiIpKTsKLSNpZmRlZiBSVDI4NjAKLQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgRlJPTV9UWCk7Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBTVEVQIDEuIFdBS0UgVVAgUEhZICovCisJLyogICAgICAgICAgICAgIG91dGdvaW5nIGZyYW1lIGFsd2F5cyB3YWtldXAgUEhZIHRvIHByZXZlbnQgZnJhbWUgbG9zdCBhbmQgKi8KKwkvKiAgICAgICAgICAgICAgdHVybiBvZmYgUFNNIGJpdCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogbm90IHRvIGNoYW5nZSBQU00gYml0LCBqdXN0IHNlbmQgdGhpcyBmcmFtZSBvdXQ/ICovCisJaWYgKChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpCisJICAgICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpIHsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0lORk8sICgiQXNpY0ZvcmNlV2FrZXVwIEF0IEhhcmRUeFxuIikpOworI2lmZGVmIFJUTVBfTUFDX1BDSQogCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKLSNlbmRpZgorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgorCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9GT1JDRV9XQUtFX1VQLCBOVUxMLCAwKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAl9Ci0KLQkvLyBJdCBzaG91bGQgbm90IGNoYW5nZSBQU00gYml0LCB3aGVuIEFQU0QgdHVybiBvbi4KLQlpZiAoKCEocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKSAmJiAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSA9PSBGQUxTRSkpCi0JCXx8IChSVE1QX0dFVF9QQUNLRVRfRUFQT0wocFR4QmxrLT5wUGFja2V0KSkKLQkJfHwgKFJUTVBfR0VUX1BBQ0tFVF9XQUkocFR4QmxrLT5wUGFja2V0KSkpCi0JeworCS8qIEl0IHNob3VsZCBub3QgY2hhbmdlIFBTTSBiaXQsIHdoZW4gQVBTRCB0dXJuIG9uLiAqLworCWlmICgoIQorCSAgICAgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZQorCSAgICAgICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKQorCSAgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUgPT0gRkFMU0UpKQorCSAgICB8fCAoUlRNUF9HRVRfUEFDS0VUX0VBUE9MKHBUeEJsay0+cFBhY2tldCkpCisJICAgIHx8IChSVE1QX0dFVF9QQUNLRVRfV0FJKHBUeEJsay0+cFBhY2tldCkpKSB7CiAJCWlmICgocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSAmJgotICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQKSkKLQkJCU1sbWVTZXRQc21CaXQocEFkLCBQV1JfQUNUSVZFKTsKKwkJICAgIChwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID09CisJCSAgICAgTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQKSkKKwkJCVJUTVBfU0VUX1BTTV9CSVQocEFkLCBQV1JfQUNUSVZFKTsKIAl9CiAKLQlzd2l0Y2ggKHBUeEJsay0+VHhGcmFtZVR5cGUpCi0JewotCQljYXNlIFRYX0FNUERVX0ZSQU1FOgotCQkJCVNUQV9BTVBEVV9GcmFtZV9UeChwQWQsIHBUeEJsayk7Ci0JCQlicmVhazsKLQkJY2FzZSBUWF9BTVNEVV9GUkFNRToKLQkJCQlTVEFfQU1TRFVfRnJhbWVfVHgocEFkLCBwVHhCbGspOwotCQkJYnJlYWs7Ci0JCWNhc2UgVFhfTEVHQUNZX0ZSQU1FOgotCQkJCVNUQV9MZWdhY3lfRnJhbWVfVHgocEFkLCBwVHhCbGspOwotCQkJYnJlYWs7Ci0JCWNhc2UgVFhfTUNBU1RfRlJBTUU6Ci0JCQkJU1RBX0xlZ2FjeV9GcmFtZV9UeChwQWQsIHBUeEJsayk7Ci0JCQlicmVhazsKLQkJY2FzZSBUWF9SQUxJTktfRlJBTUU6Ci0JCQkJU1RBX0FSYWxpbmtfRnJhbWVfVHgocEFkLCBwVHhCbGspOwotCQkJYnJlYWs7Ci0JCWNhc2UgVFhfRlJBR19GUkFNRToKLQkJCQlTVEFfRnJhZ21lbnRfRnJhbWVfVHgocEFkLCBwVHhCbGspOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQl7Ci0JCQkJLy8gSXQgc2hvdWxkIG5vdCBoYXBwZW5lZCEKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZW5kIGEgcGFjZWt0IHdhcyBub3QgY2xhc3NpZmllZCEhIEl0IHNob3VsZCBub3QgaGFwcGVuIVxuIikpOwotCQkJCXdoaWxlKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcikKLQkJCQl7Ci0JCQkJCXBRRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0KTsKLQkJCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKLQkJCQkJaWYgKHBQYWNrZXQpCi0JCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQkJfQorCXN3aXRjaCAocFR4QmxrLT5UeEZyYW1lVHlwZSkgeworCWNhc2UgVFhfQU1QRFVfRlJBTUU6CisJCVNUQV9BTVBEVV9GcmFtZV9UeChwQWQsIHBUeEJsayk7CisJCWJyZWFrOworCWNhc2UgVFhfQU1TRFVfRlJBTUU6CisJCVNUQV9BTVNEVV9GcmFtZV9UeChwQWQsIHBUeEJsayk7CisJCWJyZWFrOworCWNhc2UgVFhfTEVHQUNZX0ZSQU1FOgorCQlTVEFfTGVnYWN5X0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJYnJlYWs7CisJY2FzZSBUWF9NQ0FTVF9GUkFNRToKKwkJU1RBX0xlZ2FjeV9GcmFtZV9UeChwQWQsIHBUeEJsayk7CisJCWJyZWFrOworCWNhc2UgVFhfUkFMSU5LX0ZSQU1FOgorCQlTVEFfQVJhbGlua19GcmFtZV9UeChwQWQsIHBUeEJsayk7CisJCWJyZWFrOworCWNhc2UgVFhfRlJBR19GUkFNRToKKwkJU1RBX0ZyYWdtZW50X0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJeworCQkJLyogSXQgc2hvdWxkIG5vdCBoYXBwZW5lZCEgKi8KKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIlNlbmQgYSBwYWNrZXQgd2FzIG5vdCBjbGFzc2lmaWVkISBJdCBzaG91bGQgbm90IGhhcHBlbiFcbiIpKTsKKwkJCXdoaWxlIChwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIpIHsKKwkJCQlwUUVudHJ5ID0KKwkJCQkgICAgUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CisJCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKKwkJCQlpZiAocFBhY2tldCkKKwkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsCisJCQkJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQkJfQotCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKIAogfQogCi1VTE9ORyAgSGFzaEJ5dGVzUG9seW5vbWlhbChVQ0hBUiAqdmFsdWUsIHVuc2lnbmVkIGludCBsZW4pCit1bnNpZ25lZCBsb25nIEhhc2hCeXRlc1BvbHlub21pYWwodTggKiB2YWx1ZSwgdW5zaWduZWQgaW50IGxlbikKIHsKLSAgIHVuc2lnbmVkIGNoYXIgKndvcmQgPSB2YWx1ZTsKLSAgIHVuc2lnbmVkIGludCByZXQgPSAwOwotICAgdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgY2hhciAqd29yZCA9IHZhbHVlOworCXVuc2lnbmVkIGludCByZXQgPSAwOworCXVuc2lnbmVkIGludCBpOwogCi0gICBmb3IoaT0wOyBpIDwgbGVuOyBpKyspCi0gICB7Ci0JICBpbnQgbW9kID0gaSAlIDMyOwotCSAgcmV0IF49KHVuc2lnbmVkIGludCkgKHdvcmRbaV0pIDw8IG1vZDsKLQkgIHJldCBePSh1bnNpZ25lZCBpbnQpICh3b3JkW2ldKSA+PiAoMzIgLSBtb2QpOwotICAgfQotICAgcmV0dXJuIHJldDsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaW50IG1vZCA9IGkgJSAzMjsKKwkJcmV0IF49ICh1bnNpZ25lZCBpbnQpKHdvcmRbaV0pIDw8IG1vZDsKKwkJcmV0IF49ICh1bnNpZ25lZCBpbnQpKHdvcmRbaV0pID4+ICgzMiAtIG1vZCk7CisJfQorCXJldHVybiByZXQ7CiB9CiAKLVZPSUQgU3RhX0Fubm91bmNlX29yX0ZvcndhcmRfODAyXzNfUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit2b2lkIFN0YV9Bbm5vdW5jZV9vcl9Gb3J3YXJkXzgwMl8zX1BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCSAgdm9pZCAqcFBhY2tldCwKKwkJCQkJICB1OCBGcm9tV2hpY2hCU1NJRCkKIHsKLQlpZiAoVFJVRQotCQkpCi0JeworCWlmIChUUlVFKSB7CiAJCWFubm91bmNlXzgwMl8zX3BhY2tldChwQWQsIHBQYWNrZXQpOwotCX0KLQllbHNlCi0JewotCQkvLyByZWxlYXNlIHBhY2tldAorCX0gZWxzZSB7CisJCS8qIHJlbGVhc2UgcGFja2V0ICovCiAJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKIAl9CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3Nhbml0eS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc2FuaXR5LmMKaW5kZXggN2Q1MzBmNi4uOGY5ZmQxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc2FuaXR5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc2FuaXR5LmMKQEAgLTM2LDE1ICszNiwxNSBAQAogKi8KICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKIAotZXh0ZXJuIFVDSEFSCUNJU0NPX09VSVtdOworZXh0ZXJuIHU4IENJU0NPX09VSVtdOwogCi1leHRlcm4gVUNIQVIJV1BBX09VSVtdOwotZXh0ZXJuIFVDSEFSCVJTTl9PVUlbXTsKLWV4dGVybiBVQ0hBUglXTUVfSU5GT19FTEVNW107Ci1leHRlcm4gVUNIQVIJV01FX1BBUk1fRUxFTVtdOwotZXh0ZXJuIFVDSEFSCUNjeDJRb3NJbmZvW107Ci1leHRlcm4gVUNIQVIJUkFMSU5LX09VSVtdOwotZXh0ZXJuIFVDSEFSCUJST0FEQ09NX09VSVtdOworZXh0ZXJuIHU4IFdQQV9PVUlbXTsKK2V4dGVybiB1OCBSU05fT1VJW107CitleHRlcm4gdTggV01FX0lORk9fRUxFTVtdOworZXh0ZXJuIHU4IFdNRV9QQVJNX0VMRU1bXTsKK2V4dGVybiB1OCBDY3gyUW9zSW5mb1tdOworZXh0ZXJuIHU4IFJBTElOS19PVUlbXTsKK2V4dGVybiB1OCBCUk9BRENPTV9PVUlbXTsKIAogLyoKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNTQsMjcgKzU0LDI1IEBACiAgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1CT09MRUFOIE1sbWVTdGFydFJlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBDSEFSIFNzaWRbXSwKLSAgICBPVVQgVUNIQVIgKnBTc2lkTGVuKQorQk9PTEVBTiBNbG1lU3RhcnRSZXFTYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdm9pZCAqIE1zZywKKwkJCSAgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkJICAgY2hhciBTc2lkW10sIHU4ICogcFNzaWRMZW4pCiB7Ci0gICAgTUxNRV9TVEFSVF9SRVFfU1RSVUNUICpJbmZvOworCXN0cnVjdCBydF9tbG1lX3N0YXJ0X3JlcSAqSW5mbzsKIAotICAgIEluZm8gPSAoTUxNRV9TVEFSVF9SRVFfU1RSVUNUICopKE1zZyk7CisJSW5mbyA9IChzdHJ1Y3QgcnRfbWxtZV9zdGFydF9yZXEgKikoTXNnKTsKIAotICAgIGlmIChJbmZvLT5Tc2lkTGVuID4gTUFYX0xFTl9PRl9TU0lEKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVN0YXJ0UmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBTU0lEIGxlbmd0aFxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQorCWlmIChJbmZvLT5Tc2lkTGVuID4gTUFYX0xFTl9PRl9TU0lEKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiTWxtZVN0YXJ0UmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBTU0lEIGxlbmd0aFxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQogCi0gICAgKnBTc2lkTGVuID0gSW5mby0+U3NpZExlbjsKLSAgICBOZGlzTW92ZU1lbW9yeShTc2lkLCBJbmZvLT5Tc2lkLCAqcFNzaWRMZW4pOworCSpwU3NpZExlbiA9IEluZm8tPlNzaWRMZW47CisJTmRpc01vdmVNZW1vcnkoU3NpZCwgSW5mby0+U3NpZCwgKnBTc2lkTGVuKTsKIAotICAgIHJldHVybiBUUlVFOworCXJldHVybiBUUlVFOwogfQogCiAvKgpAQCAtODgsMjExICs4NiwxNjEgQEAKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLUJPT0xFQU4gUGVlckFzc29jUnNwU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKnBNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIyLAotICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKLSAgICBPVVQgVVNIT1JUICpwU3RhdHVzLAotICAgIE9VVCBVU0hPUlQgKnBBaWQsCi0gICAgT1VUIFVDSEFSIFN1cFJhdGVbXSwKLSAgICBPVVQgVUNIQVIgKnBTdXBSYXRlTGVuLAotICAgIE9VVCBVQ0hBUiBFeHRSYXRlW10sCi0gICAgT1VUIFVDSEFSICpwRXh0UmF0ZUxlbiwKLSAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRQkJKnBIdENhcGFiaWxpdHksCi0gICAgT1VUIEFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbywJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCi0gICAgT1VUIFVDSEFSCQkJKnBIdENhcGFiaWxpdHlMZW4sCi0gICAgT1VUIFVDSEFSCQkJKnBBZGRIdEluZm9MZW4sCi0gICAgT1VUIFVDSEFSCQkJKnBOZXdFeHRDaGFubmVsT2Zmc2V0LAotICAgIE9VVCBQRURDQV9QQVJNIHBFZGNhUGFybSwKLSAgICBPVVQgVUNIQVIgKnBDa2lwRmxhZykKK0JPT0xFQU4gUGVlckFzc29jUnNwU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdm9pZCAqIHBNc2csIHVuc2lnbmVkIGxvbmcgTXNnTGVuLCB1OCAqcEFkZHIyLCB1MTYgKiBwQ2FwYWJpbGl0eUluZm8sIHUxNiAqIHBTdGF0dXMsIHUxNiAqIHBBaWQsIHU4IFN1cFJhdGVbXSwgdTggKiBwU3VwUmF0ZUxlbiwgdTggRXh0UmF0ZVtdLCB1OCAqIHBFeHRSYXRlTGVuLCBzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSAqIHBIdENhcGFiaWxpdHksIHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSAqIHBBZGRIdEluZm8sCS8qIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRSAqLworCQkJICAgdTggKiBwSHRDYXBhYmlsaXR5TGVuLAorCQkJICAgdTggKiBwQWRkSHRJbmZvTGVuLAorCQkJICAgdTggKiBwTmV3RXh0Q2hhbm5lbE9mZnNldCwKKwkJCSAgIHN0cnVjdCBydF9lZGNhX3Bhcm0gKnBFZGNhUGFybSwgdTggKiBwQ2tpcEZsYWcpCiB7Ci0gICAgQ0hBUiAgICAgICAgICBJZVR5cGUsICpQdHI7Ci0gICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOwotICAgIFBFSURfU1RSVUNUICAgcEVpZDsKLSAgICBVTE9ORyAgICAgICAgIExlbmd0aCA9IDA7CisJY2hhciBJZVR5cGUsICpQdHI7CisJc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqIHBGcmFtZSA9IChzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICopIHBNc2c7CisJc3RydWN0IHJ0X2VpZCAqIHBFaWQ7CisJdW5zaWduZWQgbG9uZyBMZW5ndGggPSAwOwogCiAJKnBOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKIAkqcEh0Q2FwYWJpbGl0eUxlbiA9IDA7CiAJKnBBZGRIdEluZm9MZW4gPSAwOwotICAgIENPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7Ci0gICAgUHRyID0gcEZyYW1lLT5PY3RldDsKLSAgICBMZW5ndGggKz0gTEVOR1RIXzgwMl8xMTsKKwlDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOworCVB0ciA9IChjaGFyICopcEZyYW1lLT5PY3RldDsKKwlMZW5ndGggKz0gTEVOR1RIXzgwMl8xMTsKIAotICAgIE5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgJnBGcmFtZS0+T2N0ZXRbMF0sIDIpOwotICAgIExlbmd0aCArPSAyOwotICAgIE5kaXNNb3ZlTWVtb3J5KHBTdGF0dXMsICAgICAgICAgJnBGcmFtZS0+T2N0ZXRbMl0sIDIpOwotICAgIExlbmd0aCArPSAyOwotICAgICpwQ2tpcEZsYWcgPSAwOwotICAgICpwRXh0UmF0ZUxlbiA9IDA7Ci0gICAgcEVkY2FQYXJtLT5iVmFsaWQgPSBGQUxTRTsKKwlOZGlzTW92ZU1lbW9yeShwQ2FwYWJpbGl0eUluZm8sICZwRnJhbWUtPk9jdGV0WzBdLCAyKTsKKwlMZW5ndGggKz0gMjsKKwlOZGlzTW92ZU1lbW9yeShwU3RhdHVzLCAmcEZyYW1lLT5PY3RldFsyXSwgMik7CisJTGVuZ3RoICs9IDI7CisJKnBDa2lwRmxhZyA9IDA7CisJKnBFeHRSYXRlTGVuID0gMDsKKwlwRWRjYVBhcm0tPmJWYWxpZCA9IEZBTFNFOwogCi0gICAgaWYgKCpwU3RhdHVzICE9IE1MTUVfU1VDQ0VTUykKLSAgICAgICAgcmV0dXJuIFRSVUU7CisJaWYgKCpwU3RhdHVzICE9IE1MTUVfU1VDQ0VTUykKKwkJcmV0dXJuIFRSVUU7CiAKLSAgICBOZGlzTW92ZU1lbW9yeShwQWlkLCAmcEZyYW1lLT5PY3RldFs0XSwgMik7Ci0gICAgTGVuZ3RoICs9IDI7CisJTmRpc01vdmVNZW1vcnkocEFpZCwgJnBGcmFtZS0+T2N0ZXRbNF0sIDIpOworCUxlbmd0aCArPSAyOwogCi0gICAgLy8gQWlkIGFscmVhZHkgc3dhcGVkIGJ5dGUgb3JkZXIgaW4gUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKCkgZm9yIGJpZyBlbmRpYW4gcGxhdGZvcm0KLSAgICAqcEFpZCA9ICgqcEFpZCkgJiAweDNmZmY7IC8vIEFJRCBpcyBsb3cgMTQtYml0CisJLyogQWlkIGFscmVhZHkgc3dhcGVkIGJ5dGUgb3JkZXIgaW4gUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKCkgZm9yIGJpZyBlbmRpYW4gcGxhdGZvcm0gKi8KKwkqcEFpZCA9ICgqcEFpZCkgJiAweDNmZmY7CS8qIEFJRCBpcyBsb3cgMTQtYml0ICovCiAKLSAgICAvLyAtLSBnZXQgc3VwcG9ydGVkIHJhdGVzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIEllVHlwZSA9IHBGcmFtZS0+T2N0ZXRbNl07Ci0gICAgKnBTdXBSYXRlTGVuID0gcEZyYW1lLT5PY3RldFs3XTsKLSAgICBpZiAoKEllVHlwZSAhPSBJRV9TVVBQX1JBVEVTKSB8fCAoKnBTdXBSYXRlTGVuID4gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckFzc29jUnNwU2FuaXR5IGZhaWwgLSB3cm9uZyBTdXBwb3J0ZWRSYXRlcyBJRVxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgTmRpc01vdmVNZW1vcnkoU3VwUmF0ZSwgJnBGcmFtZS0+T2N0ZXRbOF0sICpwU3VwUmF0ZUxlbik7CisJLyogLS0gZ2V0IHN1cHBvcnRlZCByYXRlcyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIgKi8KKwlJZVR5cGUgPSBwRnJhbWUtPk9jdGV0WzZdOworCSpwU3VwUmF0ZUxlbiA9IHBGcmFtZS0+T2N0ZXRbN107CisJaWYgKChJZVR5cGUgIT0gSUVfU1VQUF9SQVRFUykKKwkgICAgfHwgKCpwU3VwUmF0ZUxlbiA+IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlBlZXJBc3NvY1JzcFNhbml0eSBmYWlsIC0gd3JvbmcgU3VwcG9ydGVkUmF0ZXMgSUVcbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0gZWxzZQorCQlOZGlzTW92ZU1lbW9yeShTdXBSYXRlLCAmcEZyYW1lLT5PY3RldFs4XSwgKnBTdXBSYXRlTGVuKTsKIAotICAgIExlbmd0aCA9IExlbmd0aCArIDIgKyAqcFN1cFJhdGVMZW47CisJTGVuZ3RoID0gTGVuZ3RoICsgMiArICpwU3VwUmF0ZUxlbjsKIAotICAgIC8vIG1hbnkgQVAgaW1wbGVtZW50IHByb3ByaWV0YXJ5IElFcyBpbiBub24tc3RhbmRhcmQgb3JkZXIsIHdlJ2QgYmV0dGVyCi0gICAgLy8gdG9sZXJhdGUgbWlzLW9yZGVyZWQgSUVzIHRvIGdldCBiZXN0IGNvbXBhdGliaWxpdHkKLSAgICBwRWlkID0gKFBFSURfU1RSVUNUKSAmcEZyYW1lLT5PY3RldFs4ICsgKCpwU3VwUmF0ZUxlbildOworCS8qIG1hbnkgQVAgaW1wbGVtZW50IHByb3ByaWV0YXJ5IElFcyBpbiBub24tc3RhbmRhcmQgb3JkZXIsIHdlJ2QgYmV0dGVyICovCisJLyogdG9sZXJhdGUgbWlzLW9yZGVyZWQgSUVzIHRvIGdldCBiZXN0IGNvbXBhdGliaWxpdHkgKi8KKwlwRWlkID0gKHN0cnVjdCBydF9laWQgKikgJiBwRnJhbWUtPk9jdGV0WzggKyAoKnBTdXBSYXRlTGVuKV07CiAKLSAgICAvLyBnZXQgdmFyaWFibGUgZmllbGRzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIHdoaWxlICgoTGVuZ3RoICsgMiArIHBFaWQtPkxlbikgPD0gTXNnTGVuKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChwRWlkLT5FaWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgSUVfRVhUX1NVUFBfUkFURVM6Ci0gICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KEV4dFJhdGUsIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOwotICAgICAgICAgICAgICAgICAgICAqcEV4dFJhdGVMZW4gPSBwRWlkLT5MZW47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOworCS8qIGdldCB2YXJpYWJsZSBmaWVsZHMgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyICovCisJd2hpbGUgKChMZW5ndGggKyAyICsgcEVpZC0+TGVuKSA8PSBNc2dMZW4pIHsKKwkJc3dpdGNoIChwRWlkLT5FaWQpIHsKKwkJY2FzZSBJRV9FWFRfU1VQUF9SQVRFUzoKKwkJCWlmIChwRWlkLT5MZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpIHsKKwkJCQlOZGlzTW92ZU1lbW9yeShFeHRSYXRlLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKKwkJCQkqcEV4dFJhdGVMZW4gPSBwRWlkLT5MZW47CisJCQl9CisJCQlicmVhazsKIAotICAgICAgICAgICAgIGNhc2UgSUVfSFRfQ0FQOgotICAgICAgICAgICAgY2FzZSBJRV9IVF9DQVAyOgotCQkJaWYgKHBFaWQtPkxlbiA+PSBTSVpFX0hUX0NBUF9JRSkgIC8vTm90ZTogYWxsb3cgZXh0ZW5zaW9uLiEhCisJCWNhc2UgSUVfSFRfQ0FQOgorCQljYXNlIElFX0hUX0NBUDI6CisJCQlpZiAocEVpZC0+TGVuID49IFNJWkVfSFRfQ0FQX0lFKQkvKk5vdGU6IGFsbG93IGV4dGVuc2lvbiEgKi8KIAkJCXsKLQkJCQlOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LCBwRWlkLT5PY3RldCwgU0laRV9IVF9DQVBfSUUpOworCQkJCU5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksIHBFaWQtPk9jdGV0LAorCQkJCQkgICAgICAgU0laRV9IVF9DQVBfSUUpOwogCi0JCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSk7Ci0JCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSk7CisJCQkJKih1MTYgKikgKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pID0KKwkJCQkgICAgY3B1MmxlMTYoKih1MTYgKikKKwkJCQkJICAgICAoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykpOworCQkJCSoodTE2ICopICgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSA9CisJCQkJICAgIGNwdTJsZTE2KCoodTE2ICopCisJCQkJCSAgICAgKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pKTsKIAogCQkJCSpwSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQXNzb2NSc3BTYW5pdHkgLSB3cm9uZyBJRV9IVF9DQVAuIFxuIikpOworCQkJfSBlbHNlIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLAorCQkJCQkgKCJQZWVyQXNzb2NSc3BTYW5pdHkgLSB3cm9uZyBJRV9IVF9DQVAuIFxuIikpOwogCQkJfQogCi0JCWJyZWFrOwotICAgICAgICAgICAgY2FzZSBJRV9BRERfSFQ6Ci0gICAgICAgICAgICBjYXNlIElFX0FERF9IVDI6Ci0JCQlpZiAocEVpZC0+TGVuID49IHNpemVvZihBRERfSFRfSU5GT19JRSkpCi0JCQl7Ci0JCQkJLy8gVGhpcyBJRSBhbGxvd3MgZXh0ZW5zaW9uLCBidXQgd2UgY2FuIGlnbm9yZSBleHRyYSBieXRlcyBiZXlvbmQgb3VyIGtub3dsZWRnZSAsIHNvIG9ubHkKLQkJCQkvLyBjb3B5IGZpcnN0IHNpemVvZihBRERfSFRfSU5GT19JRSkKLQkJCQlOZGlzTW92ZU1lbW9yeShwQWRkSHRJbmZvLCBwRWlkLT5PY3RldCwgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisJCQlicmVhazsKKwkJY2FzZSBJRV9BRERfSFQ6CisJCWNhc2UgSUVfQUREX0hUMjoKKwkJCWlmIChwRWlkLT5MZW4gPj0gc2l6ZW9mKHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSkpIHsKKwkJCQkvKiBUaGlzIElFIGFsbG93cyBleHRlbnNpb24sIGJ1dCB3ZSBjYW4gaWdub3JlIGV4dHJhIGJ5dGVzIGJleW9uZCBvdXIga25vd2xlZGdlICwgc28gb25seSAqLworCQkJCS8qIGNvcHkgZmlyc3Qgc2l6ZW9mKHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSkgKi8KKwkJCQlOZGlzTW92ZU1lbW9yeShwQWRkSHRJbmZvLCBwRWlkLT5PY3RldCwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUpKTsKIAotCQkJCSooVVNIT1JUICopKCZwQWRkSHRJbmZvLT5BZGRIdEluZm8yKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwQWRkSHRJbmZvLT5BZGRIdEluZm8yKSk7Ci0JCQkJKihVU0hPUlQgKikoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzMpID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzMpKTsKKwkJCQkqKHUxNiAqKSAoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzIpID0KKwkJCQkgICAgY3B1MmxlMTYoKih1MTYgKikKKwkJCQkJICAgICAoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzIpKTsKKwkJCQkqKHUxNiAqKSAoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzMpID0KKwkJCQkgICAgY3B1MmxlMTYoKih1MTYgKikKKwkJCQkJICAgICAoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzMpKTsKIAogCQkJCSpwQWRkSHRJbmZvTGVuID0gU0laRV9BRERfSFRfSU5GT19JRTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJBc3NvY1JzcFNhbml0eSAtIHdyb25nIElFX0FERF9IVC4gXG4iKSk7CisJCQl9IGVsc2UgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sCisJCQkJCSAoIlBlZXJBc3NvY1JzcFNhbml0eSAtIHdyb25nIElFX0FERF9IVC4gXG4iKSk7CiAJCQl9CiAKLQkJYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElFX1NFQ09OREFSWV9DSF9PRkZTRVQ6Ci0JCQlpZiAocEVpZC0+TGVuID09IDEpCi0JCQl7CisJCQlicmVhazsKKwkJY2FzZSBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VUOgorCQkJaWYgKHBFaWQtPkxlbiA9PSAxKSB7CiAJCQkJKnBOZXdFeHRDaGFubmVsT2Zmc2V0ID0gcEVpZC0+T2N0ZXRbMF07CisJCQl9IGVsc2UgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sCisJCQkJCSAoIlBlZXJBc3NvY1JzcFNhbml0eSAtIHdyb25nIElFX1NFQ09OREFSWV9DSF9PRkZTRVQuIFxuIikpOwogCQkJfQotCQkJZWxzZQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckFzc29jUnNwU2FuaXR5IC0gd3JvbmcgSUVfU0VDT05EQVJZX0NIX09GRlNFVC4gXG4iKSk7CisJCQlicmVhazsKKworCQljYXNlIElFX1ZFTkRPUl9TUEVDSUZJQzoKKwkJCS8qIGhhbmRsZSBXTUUgUEFSQU1URVIgRUxFTUVOVCAqLworCQkJaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV01FX1BBUk1fRUxFTSwgNikKKwkJCSAgICAmJiAocEVpZC0+TGVuID09IDI0KSkgeworCQkJCXU4ICpwdHI7CisJCQkJaW50IGk7CisKKwkJCQkvKiBwYXJzaW5nIEVEQ0EgcGFyYW1ldGVycyAqLworCQkJCXBFZGNhUGFybS0+YlZhbGlkID0gVFJVRTsKKwkJCQlwRWRjYVBhcm0tPmJRQWNrID0gRkFMU0U7CS8qIHBFaWQtPk9jdGV0WzBdICYgMHgxMDsgKi8KKwkJCQlwRWRjYVBhcm0tPmJRdWV1ZVJlcXVlc3QgPSBGQUxTRTsJLyogcEVpZC0+T2N0ZXRbMF0gJiAweDIwOyAqLworCQkJCXBFZGNhUGFybS0+YlR4b3BSZXF1ZXN0ID0gRkFMU0U7CS8qIHBFaWQtPk9jdGV0WzBdICYgMHg0MDsgKi8KKwkJCQkvKnBFZGNhUGFybS0+Yk1vcmVEYXRhQWNrICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHg4MDsgKi8KKwkJCQlwRWRjYVBhcm0tPkVkY2FVcGRhdGVDb3VudCA9CisJCQkJICAgIHBFaWQtPk9jdGV0WzZdICYgMHgwZjsKKwkJCQlwRWRjYVBhcm0tPmJBUFNEQ2FwYWJsZSA9CisJCQkJICAgIChwRWlkLT5PY3RldFs2XSAmIDB4ODApID8gMSA6IDA7CisJCQkJcHRyID0gKHU4ICopJiBwRWlkLT5PY3RldFs4XTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQkJCXU4IGFjaSA9ICgqcHRyICYgMHg2MCkgPj4gNTsJLyogYjV+NiBpcyBBQyBJTkRFWCAqLworCQkJCQlwRWRjYVBhcm0tPmJBQ01bYWNpXSA9ICgoKCpwdHIpICYgMHgxMCkgPT0gMHgxMCk7CS8qIGI1IGlzIEFDTSAqLworCQkJCQlwRWRjYVBhcm0tPkFpZnNuW2FjaV0gPSAoKnB0cikgJiAweDBmOwkvKiBiMH4zIGlzIEFJRlNOICovCisJCQkJCXBFZGNhUGFybS0+Q3dtaW5bYWNpXSA9ICoocHRyICsgMSkgJiAweDBmOwkvKiBiMH40IGlzIEN3bWluICovCisJCQkJCXBFZGNhUGFybS0+Q3dtYXhbYWNpXSA9ICoocHRyICsgMSkgPj4gNDsJLyogYjV+OCBpcyBDd21heCAqLworCQkJCQlwRWRjYVBhcm0tPlR4b3BbYWNpXSA9ICoocHRyICsgMikgKyAyNTYgKiAoKihwdHIgKyAzKSk7CS8qIGluIHVuaXQgb2YgMzItdXMgKi8KKwkJCQkJcHRyICs9IDQ7CS8qIHBvaW50IHRvIG5leHQgQUMgKi8KKwkJCQl9CiAJCQl9Ci0JCWJyZWFrOwotICAgICAgICAgICAgY2FzZSBJRV9BSVJPTkVUX0NLSVA6Ci0gICAgICAgICAgICAgICAgLy8gMC4gQ2hlY2sgQWlyb25ldCBJRSBsZW5ndGgsIGl0IG11c3QgYmUgbGFyZ2VyIG9yIGVxdWFsIHRvIDI4Ci0gICAgICAgICAgICAgICAgLy8gICAgQ2lzY28ncyBBUCBWeFdvcmsgdmVyc2lvbih3aWxsIG5vdCBiZSBzdXBwb3J0ZWQpIHVzZWQgdGhpcyBJRSBsZW5ndGggYXMgMjgKLSAgICAgICAgICAgICAgICAvLyAgICBDaXNjbydzIEFQIElPUyB2ZXJzaW9uIHVzZWQgdGhpcyBJRSBsZW5ndGggYXMgMzAKLSAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuIDwgKENLSVBfTkVHT1RJQVRJT05fTEVOR1RIIC0gMikpCi0gICAgICAgICAgICAgICAgYnJlYWs7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlBlZXJBc3NvY1JzcFNhbml0eSAtIGlnbm9yZSB1bnJlY29nbml6ZWQgRUlEID0gJWRcbiIsCisJCQkJICBwRWlkLT5FaWQpKTsKKwkJCWJyZWFrOworCQl9CiAKLSAgICAgICAgICAgICAgICAvLyAxLiBDb3B5IENLSVAgZmxhZyBieXRlIHRvIGJ1ZmZlciBmb3IgcHJvY2VzcwotICAgICAgICAgICAgICAgICpwQ2tpcEZsYWcgPSAqKHBFaWQtPk9jdGV0ICsgOCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJCUxlbmd0aCA9IExlbmd0aCArIDIgKyBwRWlkLT5MZW47CisJCXBFaWQgPSAoc3RydWN0IHJ0X2VpZCAqKSAoKHU4ICopIHBFaWQgKyAyICsgcEVpZC0+TGVuKTsKKwl9CiAKLSAgICAgICAgICAgIGNhc2UgSUVfQUlST05FVF9JUEFERFJFU1M6Ci0gICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiAhPSAweDBBKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgLy8gR2V0IENpc2NvIEFpcm9uZXQgSVAgaW5mb3JtYXRpb24KLSAgICAgICAgICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBDSVNDT19PVUksIDMpID09IDEpCi0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkFpcm9uZXRJUEFkZHJlc3MsIHBFaWQtPk9jdGV0ICsgNCwgNCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8vIENDWDIsIFdNTSB1c2UgdGhlIHNhbWUgSUUgdmFsdWUKLSAgICAgICAgICAgIC8vIGNhc2UgSUVfQ0NYX1YyOgotICAgICAgICAgICAgY2FzZSBJRV9WRU5ET1JfU1BFQ0lGSUM6Ci0gICAgICAgICAgICAgICAgLy8gaGFuZGxlIFdNRSBQQVJBTVRFUiBFTEVNRU5UCi0gICAgICAgICAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV01FX1BBUk1fRUxFTSwgNikgJiYgKHBFaWQtPkxlbiA9PSAyNCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBQVUNIQVIgcHRyOwotICAgICAgICAgICAgICAgICAgICBpbnQgaTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBwYXJzaW5nIEVEQ0EgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJWYWxpZCAgICAgICAgICA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlFBY2sgICAgICAgICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHgxMDsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUXVldWVSZXF1ZXN0ICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDIwOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJUeG9wUmVxdWVzdCAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4NDA7Ci0gICAgICAgICAgICAgICAgICAgIC8vcEVkY2FQYXJtLT5iTW9yZURhdGFBY2sgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDgwOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkVkY2FVcGRhdGVDb3VudCA9IHBFaWQtPk9jdGV0WzZdICYgMHgwZjsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQVBTRENhcGFibGUgICAgPSAocEVpZC0+T2N0ZXRbNl0gJiAweDgwKSA/IDEgOiAwOwotICAgICAgICAgICAgICAgICAgICBwdHIgPSAmcEVpZC0+T2N0ZXRbOF07Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgYWNpID0gKCpwdHIgJiAweDYwKSA+PiA1OyAvLyBiNX42IGlzIEFDIElOREVYCi0gICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBQ01bYWNpXSAgPSAoKCgqcHRyKSAmIDB4MTApID09IDB4MTApOyAgIC8vIGI1IGlzIEFDTQotICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzblthY2ldID0gKCpwdHIpICYgMHgwZjsgICAgICAgICAgICAgICAvLyBiMH4zIGlzIEFJRlNOCi0gICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWluW2FjaV0gPSAqKHB0cisxKSAmIDB4MGY7ICAgICAgICAgICAgIC8vIGIwfjQgaXMgQ3dtaW4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtYXhbYWNpXSA9ICoocHRyKzEpID4+IDQ7ICAgICAgICAgICAgICAgLy8gYjV+OCBpcyBDd21heAotICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW2FjaV0gID0gKihwdHIrMikgKyAyNTYgKiAoKihwdHIrMykpOyAvLyBpbiB1bml0IG9mIDMyLXVzCi0gICAgICAgICAgICAgICAgICAgICAgICBwdHIgKz0gNDsgLy8gcG9pbnQgdG8gbmV4dCBBQwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gaGFuZGxlIENDWCBJRQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIDAuIENoZWNrIHRoZSBzaXplIGFuZCBDQ1ggYWRtaW4gY29udHJvbAotICAgICAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5FbmFibGUgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuICE9IDUpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAvLyBUdXJuIENDWDIgaWYgbWF0Y2hlZAotICAgICAgICAgICAgICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBDY3gySWVJbmZvLCA1KSA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuQ0NYRW5hYmxlID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBc3NvY1JzcFNhbml0eSAtIGlnbm9yZSB1bnJlY29nbml6ZWQgRUlEID0gJWRcbiIsIHBFaWQtPkVpZCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgTGVuZ3RoID0gTGVuZ3RoICsgMiArIHBFaWQtPkxlbjsKLSAgICAgICAgcEVpZCA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKilwRWlkICsgMiArIHBFaWQtPkxlbik7Ci0gICAgfQotCi0gICAgLy8gRm9yY2UgQ0NYMiBlbmFibGUgdG8gVFJVRSBmb3IgdGhvc2UgQVAgZGlkbid0IHJlcGxheSBDQ1ggdjIgSUUsIHdlIHN0aWxsIGZvcmNlIGl0IHRvIGJlIG9uCi0gICAgaWYgKHBBZC0+U3RhQ2ZnLkNDWENvbnRyb2wuZmllbGQuRW5hYmxlID09IDEpCi0gICAgICAgIHBBZC0+U3RhQ2ZnLkNDWEVuYWJsZSA9IFRSVUU7Ci0KLSAgICByZXR1cm4gVFJVRTsKKwlyZXR1cm4gVFJVRTsKIH0KIAogLyoKQEAgLTMwNiw0NyArMjU0LDQ2IEBACiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1CT09MRUFOIFBlZXJQcm9iZVJlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIyLAotICAgIE9VVCBDSEFSIFNzaWRbXSwKLSAgICBPVVQgVUNIQVIgKnBTc2lkTGVuKQorQk9PTEVBTiBQZWVyUHJvYmVSZXFTYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdm9pZCAqIE1zZywKKwkJCSAgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkJICAgdTggKnBBZGRyMiwKKwkJCSAgIGNoYXIgU3NpZFtdLCB1OCAqIHBTc2lkTGVuKQogewotICAgIFVDSEFSICAgICAgICAgSWR4OwotICAgIFVDSEFSCSAgICAgIFJhdGVMZW47Ci0gICAgQ0hBUiAgICAgICAgICBJZVR5cGU7Ci0gICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisJdTggSWR4OworCXU4IFJhdGVMZW47CisJY2hhciBJZVR5cGU7CisJc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqIHBGcmFtZSA9IChzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICopIE1zZzsKIAotICAgIENPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisJQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKIAotICAgIGlmICgocEZyYW1lLT5PY3RldFswXSAhPSBJRV9TU0lEKSB8fCAocEZyYW1lLT5PY3RldFsxXSA+IE1BWF9MRU5fT0ZfU1NJRCkpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyUHJvYmVSZXFTYW5pdHkgZmFpbCAtIHdyb25nIFNTSUQgSUUoVHlwZT0lZCxMZW49JWQpXG4iLHBGcmFtZS0+T2N0ZXRbMF0scEZyYW1lLT5PY3RldFsxXSkpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQorCWlmICgocEZyYW1lLT5PY3RldFswXSAhPSBJRV9TU0lEKQorCSAgICB8fCAocEZyYW1lLT5PY3RldFsxXSA+IE1BWF9MRU5fT0ZfU1NJRCkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJQZWVyUHJvYmVSZXFTYW5pdHkgZmFpbCAtIHdyb25nIFNTSUQgSUUoVHlwZT0lZCxMZW49JWQpXG4iLAorCQkJICBwRnJhbWUtPk9jdGV0WzBdLCBwRnJhbWUtPk9jdGV0WzFdKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CiAKLSAgICAqcFNzaWRMZW4gPSBwRnJhbWUtPk9jdGV0WzFdOwotICAgIE5kaXNNb3ZlTWVtb3J5KFNzaWQsICZwRnJhbWUtPk9jdGV0WzJdLCAqcFNzaWRMZW4pOworCSpwU3NpZExlbiA9IHBGcmFtZS0+T2N0ZXRbMV07CisJTmRpc01vdmVNZW1vcnkoU3NpZCwgJnBGcmFtZS0+T2N0ZXRbMl0sICpwU3NpZExlbik7CiAKLSAgICBJZHggPSAqcFNzaWRMZW4gKyAyOworCUlkeCA9ICpwU3NpZExlbiArIDI7CiAKLSAgICAvLyAtLSBnZXQgc3VwcG9ydGVkIHJhdGVzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIEllVHlwZSA9IHBGcmFtZS0+T2N0ZXRbSWR4XTsKLSAgICBSYXRlTGVuID0gcEZyYW1lLT5PY3RldFtJZHggKyAxXTsKLSAgICBpZiAoSWVUeXBlICE9IElFX1NVUFBfUkFURVMpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyUHJvYmVSZXFTYW5pdHkgZmFpbCAtIHdyb25nIFN1cHBvcnRSYXRlcyBJRShUeXBlPSVkLExlbj0lZClcbiIscEZyYW1lLT5PY3RldFtJZHhdLHBGcmFtZS0+T2N0ZXRbSWR4KzFdKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUcpICYmIChSYXRlTGVuIDwgOCkpCi0gICAgICAgICAgICByZXR1cm4gKEZBTFNFKTsKLSAgICB9CisJLyogLS0gZ2V0IHN1cHBvcnRlZCByYXRlcyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIgKi8KKwlJZVR5cGUgPSBwRnJhbWUtPk9jdGV0W0lkeF07CisJUmF0ZUxlbiA9IHBGcmFtZS0+T2N0ZXRbSWR4ICsgMV07CisJaWYgKEllVHlwZSAhPSBJRV9TVVBQX1JBVEVTKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiUGVlclByb2JlUmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBTdXBwb3J0UmF0ZXMgSUUoVHlwZT0lZCxMZW49JWQpXG4iLAorCQkJICBwRnJhbWUtPk9jdGV0W0lkeF0sIHBGcmFtZS0+T2N0ZXRbSWR4ICsgMV0pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0gZWxzZSB7CisJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFHKSAmJiAoUmF0ZUxlbiA8IDgpKQorCQkJcmV0dXJuIChGQUxTRSk7CisJfQogCi0gICAgcmV0dXJuIFRSVUU7CisJcmV0dXJuIFRSVUU7CiB9CiAKIC8qCkBAIC0zNTcsNjIgKzMwNCw1OCBAQAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotQk9PTEVBTiBHZXRUaW1CaXQoCi0gICAgSU4gQ0hBUiAqUHRyLAotICAgIElOIFVTSE9SVCBBaWQsCi0gICAgT1VUIFVDSEFSICpUaW1MZW4sCi0gICAgT1VUIFVDSEFSICpCY2FzdEZsYWcsCi0gICAgT1VUIFVDSEFSICpEdGltQ291bnQsCi0gICAgT1VUIFVDSEFSICpEdGltUGVyaW9kLAotICAgIE9VVCBVQ0hBUiAqTWVzc2FnZVRvTWUpCitCT09MRUFOIEdldFRpbUJpdChjaGFyICogUHRyLAorCQkgIHUxNiBBaWQsCisJCSAgdTggKiBUaW1MZW4sCisJCSAgdTggKiBCY2FzdEZsYWcsCisJCSAgdTggKiBEdGltQ291bnQsCisJCSAgdTggKiBEdGltUGVyaW9kLCB1OCAqIE1lc3NhZ2VUb01lKQogewotICAgIFVDSEFSICAgICAgICAgIEJpdENudGwsIE4xLCBOMiwgTXlCeXRlLCBNeUJpdDsKLSAgICBDSEFSICAgICAgICAgICpJZHhQdHI7CisJdTggQml0Q250bCwgTjEsIE4yLCBNeUJ5dGUsIE15Qml0OworCWNoYXIgKklkeFB0cjsKIAotICAgIElkeFB0ciA9IFB0cjsKKwlJZHhQdHIgPSBQdHI7CiAKLSAgICBJZHhQdHIgKys7Ci0gICAgKlRpbUxlbiA9ICpJZHhQdHI7CisJSWR4UHRyKys7CisJKlRpbUxlbiA9ICpJZHhQdHI7CiAKLSAgICAvLyBnZXQgRFRJTSBDb3VudCBmcm9tIFRJTSBlbGVtZW50Ci0gICAgSWR4UHRyICsrOwotICAgICpEdGltQ291bnQgPSAqSWR4UHRyOworCS8qIGdldCBEVElNIENvdW50IGZyb20gVElNIGVsZW1lbnQgKi8KKwlJZHhQdHIrKzsKKwkqRHRpbUNvdW50ID0gKklkeFB0cjsKIAotICAgIC8vIGdldCBEVElNIFBlcmlvZCBmcm9tIFRJTSBlbGVtZW50Ci0gICAgSWR4UHRyKys7Ci0gICAgKkR0aW1QZXJpb2QgPSAqSWR4UHRyOworCS8qIGdldCBEVElNIFBlcmlvZCBmcm9tIFRJTSBlbGVtZW50ICovCisJSWR4UHRyKys7CisJKkR0aW1QZXJpb2QgPSAqSWR4UHRyOwogCi0gICAgLy8gZ2V0IEJpdG1hcCBDb250cm9sIGZyb20gVElNIGVsZW1lbnQKLSAgICBJZHhQdHIrKzsKLSAgICBCaXRDbnRsID0gKklkeFB0cjsKKwkvKiBnZXQgQml0bWFwIENvbnRyb2wgZnJvbSBUSU0gZWxlbWVudCAqLworCUlkeFB0cisrOworCUJpdENudGwgPSAqSWR4UHRyOwogCi0gICAgaWYgKCgqRHRpbUNvdW50ID09IDApICYmIChCaXRDbnRsICYgMHgwMSkpCi0gICAgICAgICpCY2FzdEZsYWcgPSBUUlVFOwotICAgIGVsc2UKLSAgICAgICAgKkJjYXN0RmxhZyA9IEZBTFNFOworCWlmICgoKkR0aW1Db3VudCA9PSAwKSAmJiAoQml0Q250bCAmIDB4MDEpKQorCQkqQmNhc3RGbGFnID0gVFJVRTsKKwllbHNlCisJCSpCY2FzdEZsYWcgPSBGQUxTRTsKIAotICAgIC8vIFBhcnNlIFBhcnRpYWwgVmlydHVhbCBCaXRtYXAgZnJvbSBUSU0gZWxlbWVudAotICAgIE4xID0gQml0Q250bCAmIDB4ZmU7ICAgIC8vIE4xIGlzIHRoZSBmaXJzdCBiaXRtYXAgYnl0ZSMKLSAgICBOMiA9ICpUaW1MZW4gLSA0ICsgTjE7ICAvLyBOMiBpcyB0aGUgbGFzdCBiaXRtYXAgYnl0ZSMKKwkvKiBQYXJzZSBQYXJ0aWFsIFZpcnR1YWwgQml0bWFwIGZyb20gVElNIGVsZW1lbnQgKi8KKwlOMSA9IEJpdENudGwgJiAweGZlOwkvKiBOMSBpcyB0aGUgZmlyc3QgYml0bWFwIGJ5dGUjICovCisJTjIgPSAqVGltTGVuIC0gNCArIE4xOwkvKiBOMiBpcyB0aGUgbGFzdCBiaXRtYXAgYnl0ZSMgKi8KIAotICAgIGlmICgoQWlkIDwgKE4xIDw8IDMpKSB8fCAoQWlkID49ICgoTjIgKyAxKSA8PCAzKSkpCi0gICAgICAgICpNZXNzYWdlVG9NZSA9IEZBTFNFOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE15Qnl0ZSA9IChBaWQgPj4gMykgLSBOMTsgICAgICAgICAgICAgICAgICAgICAgIC8vIG15IGJ5dGUgcG9zaXRpb24gaW4gdGhlIGJpdG1hcCBieXRlLXN0cmVhbQotICAgICAgICBNeUJpdCA9IEFpZCAlIDE2IC0gKChNeUJ5dGUgJiAweDAxKT8gODowKTsKKwlpZiAoKEFpZCA8IChOMSA8PCAzKSkgfHwgKEFpZCA+PSAoKE4yICsgMSkgPDwgMykpKQorCQkqTWVzc2FnZVRvTWUgPSBGQUxTRTsKKwllbHNlIHsKKwkJTXlCeXRlID0gKEFpZCA+PiAzKSAtIE4xOwkvKiBteSBieXRlIHBvc2l0aW9uIGluIHRoZSBiaXRtYXAgYnl0ZS1zdHJlYW0gKi8KKwkJTXlCaXQgPSBBaWQgJSAxNiAtICgoTXlCeXRlICYgMHgwMSkgPyA4IDogMCk7CiAKLSAgICAgICAgSWR4UHRyICs9IChNeUJ5dGUgKyAxKTsKKwkJSWR4UHRyICs9IChNeUJ5dGUgKyAxKTsKIAotICAgICAgICAvL2lmICgqSWR4UHRyKQotICAgICAgICAvLyAgICBEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlRJTSBiaXRtYXAgPSAweCUwMnhcbiIsICpJZHhQdHIpKTsKKwkJLyppZiAoKklkeFB0cikgKi8KKwkJLyogICAgREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJUSU0gYml0bWFwID0gMHglMDJ4XG4iLCAqSWR4UHRyKSk7ICovCiAKLSAgICAgICAgaWYgKCpJZHhQdHIgJiAoMHgwMSA8PCBNeUJpdCkpCi0gICAgICAgICAgICAqTWVzc2FnZVRvTWUgPSBUUlVFOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAqTWVzc2FnZVRvTWUgPSBGQUxTRTsKLSAgICB9CisJCWlmICgqSWR4UHRyICYgKDB4MDEgPDwgTXlCaXQpKQorCQkJKk1lc3NhZ2VUb01lID0gVFJVRTsKKwkJZWxzZQorCQkJKk1lc3NhZ2VUb01lID0gRkFMU0U7CisJfQogCi0gICAgcmV0dXJuIFRSVUU7CisJcmV0dXJuIFRSVUU7CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3N5bmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3N5bmMuYwppbmRleCBhNmU0MzYyLi5jYmU5MGE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9zeW5jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc3luYy5jCkBAIC0zNyw0NSArMzcsNyBAQAogKi8KICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKIAotI2lmZGVmIFJUMjg2MAotI2RlZmluZSBBQzBfREVGX1RYT1AJCTAKLSNkZWZpbmUgQUMxX0RFRl9UWE9QCQkwCi0jZGVmaW5lIEFDMl9ERUZfVFhPUAkJOTQKLSNkZWZpbmUgQUMzX0RFRl9UWE9QCQk0NwotCi1WT0lECUFkaG9jVHVybk9uUW9zKAotCUlOICBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQkvLyBUdXJuIG9uIFFPcyBpZiB1c2UgSFQgcmF0ZS4KLQlpZiAocEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iVmFsaWQgPT0gRkFMU0UpCi0JewotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJWYWxpZCA9IFRSVUU7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMF0gPSAzOwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzFdID0gNzsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblsyXSA9IDE7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bM10gPSAxOwotCi0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bMF0gPSA0OwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzFdID0gNDsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblsyXSA9IDM7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bM10gPSAyOwotCi0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbMF0gPSAxMDsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFsxXSA9IDY7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbMl0gPSA0OwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWF4WzNdID0gMzsKLQotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMF0gID0gMDsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzFdICA9IDA7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFsyXSAgPSBBQzJfREVGX1RYT1A7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFszXSAgPSBBQzNfREVGX1RYT1A7Ci0JfQotCUFzaWNTZXRFZGNhUGFybShwQWQsICZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtKTsKLX0KLSNlbmRpZiAvKiBSVDI4NjAgKi8KLSNpZmRlZiBSVDI4NzAKLSNkZWZpbmUgQURIT0NfRU5UUllfQkVBQ09OX0xPU1RfVElNRQkoMipPU19IWikJLy8gMiBzZWMKLSNlbmRpZgorI2RlZmluZSBBREhPQ19FTlRSWV9CRUFDT05fTE9TVF9USU1FCSgyKk9TX0haKQkvKiAyIHNlYyAqLwogCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC04OCwzOCArNTAsNTYgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgU3luY1N0YXRlTWFjaGluZUluaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gU1RBVEVfTUFDSElORSAqU20sCi0JT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQordm9pZCBTeW5jU3RhdGVNYWNoaW5lSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgIHN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lICpTbSwgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQogewotCVN0YXRlTWFjaGluZUluaXQoU20sIFRyYW5zLCBNQVhfU1lOQ19TVEFURSwgTUFYX1NZTkNfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIFNZTkNfSURMRSwgU1lOQ19NQUNISU5FX0JBU0UpOworCVN0YXRlTWFjaGluZUluaXQoU20sIFRyYW5zLCBNQVhfU1lOQ19TVEFURSwgTUFYX1NZTkNfTVNHLAorCQkJIChTVEFURV9NQUNISU5FX0ZVTkMpIERyb3AsIFNZTkNfSURMRSwKKwkJCSBTWU5DX01BQ0hJTkVfQkFTRSk7CiAKLQkvLyBjb2x1bW4gMQotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfTUxNRV9TQ0FOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lU2NhblJlcUFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTWU5DX0lETEUsIE1UMl9NTE1FX0pPSU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVKb2luUmVxQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX01MTUVfU1RBUlRfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVTdGFydFJlcUFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTWU5DX0lETEUsIE1UMl9QRUVSX0JFQUNPTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQmVhY29uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX1BFRVJfUFJPQkVfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJQcm9iZVJlcUFjdGlvbik7CisJLyogY29sdW1uIDEgKi8KKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX01MTUVfU0NBTl9SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBNbG1lU2NhblJlcUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTWU5DX0lETEUsIE1UMl9NTE1FX0pPSU5fUkVRLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgTWxtZUpvaW5SZXFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfTUxNRV9TVEFSVF9SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBNbG1lU3RhcnRSZXFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfUEVFUl9CRUFDT04sCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBQZWVyQmVhY29uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX1BFRVJfUFJPQkVfUkVRLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgUGVlclByb2JlUmVxQWN0aW9uKTsKIAotCS8vY29sdW1uIDIKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9NTE1FX1NDQU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5TY2FuKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9NTE1FX0pPSU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5Kb2luKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9NTE1FX1NUQVJUX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuU3RhcnQpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX1BFRVJfQkVBQ09OLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJCZWFjb25BdEpvaW5BY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX0JFQUNPTl9USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKUJlYWNvblRpbWVvdXRBdEpvaW5BY3Rpb24pOworCS8qY29sdW1uIDIgKi8KKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9NTE1FX1NDQU5fUkVRLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgSW52YWxpZFN0YXRlV2hlblNjYW4pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX01MTUVfSk9JTl9SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBJbnZhbGlkU3RhdGVXaGVuSm9pbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBKT0lOX1dBSVRfQkVBQ09OLCBNVDJfTUxNRV9TVEFSVF9SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBJbnZhbGlkU3RhdGVXaGVuU3RhcnQpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX1BFRVJfQkVBQ09OLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgUGVlckJlYWNvbkF0Sm9pbkFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBKT0lOX1dBSVRfQkVBQ09OLCBNVDJfQkVBQ09OX1RJTUVPVVQsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBCZWFjb25UaW1lb3V0QXRKb2luQWN0aW9uKTsKIAotCS8vIGNvbHVtbiAzCi0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX01MTUVfU0NBTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlblNjYW4pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9NTE1FX0pPSU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5Kb2luKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfTUxNRV9TVEFSVF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlblN0YXJ0KTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfUEVFUl9CRUFDT04sIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckJlYWNvbkF0U2NhbkFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX1BFRVJfUFJPQkVfUlNQLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJCZWFjb25BdFNjYW5BY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9TQ0FOX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpU2NhblRpbWVvdXRBY3Rpb24pOworCS8qIGNvbHVtbiAzICovCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX01MTUVfU0NBTl9SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBJbnZhbGlkU3RhdGVXaGVuU2Nhbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX01MTUVfSk9JTl9SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBJbnZhbGlkU3RhdGVXaGVuSm9pbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX01MTUVfU1RBUlRfUkVRLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgSW52YWxpZFN0YXRlV2hlblN0YXJ0KTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfUEVFUl9CRUFDT04sCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBQZWVyQmVhY29uQXRTY2FuQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfUEVFUl9QUk9CRV9SU1AsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBQZWVyQmVhY29uQXRTY2FuQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfU0NBTl9USU1FT1VULAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgU2NhblRpbWVvdXRBY3Rpb24pOwogCi0JLy8gdGltZXIgaW5pdAotCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oQmVhY29uVGltZW91dCksIHBBZCwgRkFMU0UpOwotCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFNjYW5UaW1lb3V0KSwgcEFkLCBGQUxTRSk7CisJLyogdGltZXIgaW5pdCAqLworCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLAorCQkgICAgICBHRVRfVElNRVJfRlVOQ1RJT04oQmVhY29uVGltZW91dCksIHBBZCwgRkFMU0UpOworCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwKKwkJICAgICAgR0VUX1RJTUVSX0ZVTkNUSU9OKFNjYW5UaW1lb3V0KSwgcEFkLCBGQUxTRSk7CiB9CiAKIC8qCkBAIC0xMzEsMzYgKzExMSwzNSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBCZWFjb25UaW1lb3V0KAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3ZvaWQgQmVhY29uVGltZW91dCh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCSAgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpCiB7Ci0JUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopRnVuY3Rpb25Db250ZXh0OwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTWU5DIC0gQmVhY29uVGltZW91dFxuIikpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBCZWFjb25UaW1lb3V0XG4iKSk7CiAKLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwkvKiBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4gKi8KKwkvKiBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQgKi8KIAlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKQogCQlyZXR1cm47CiAKIAlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkKLQkJKQotCXsKLQkJVUNIQVIgICAgICAgIEJCUFZhbHVlID0gMDsKKwkgICAgKSB7CisJCXU4IEJCUFZhbHVlID0gMDsKIAkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOwogCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CiAJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKIAkJQkJQVmFsdWUgJj0gKH4weDE4KTsKIAkJQkJQVmFsdWUgfD0gMHgxMDsKIAkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gRW5kIG9mIFNDQU4sIHJlc3RvcmUgdG8gNDBNSHogY2hhbm5lbCAlZCwgVG90YWwgQlNTWyUwMmRdXG4iLHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBwQWQtPlNjYW5UYWIuQnNzTnIpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJTWU5DIC0gRW5kIG9mIFNDQU4sIHJlc3RvcmUgdG8gNDBNSHogY2hhbm5lbCAlZCwgVG90YWwgQlNTWyUwMmRdXG4iLAorCQkJICBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgcEFkLT5TY2FuVGFiLkJzc05yKSk7CiAJfQogCiAJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9CRUFDT05fVElNRU9VVCwgMCwgTlVMTCk7Ci0JUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7CiB9CiAKIC8qCkBAIC0xNzIsMzIgKzE1MSwyOCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBTY2FuVGltZW91dCgKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit2b2lkIFNjYW5UaW1lb3V0KHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKQogewotCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKUZ1bmN0aW9uQ29udGV4dDsKIAotCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJLyogRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuICovCisJLyogVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0ICovCiAJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkKIAkJcmV0dXJuOwogCi0JaWYgKE1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfU0NBTl9USU1FT1VULCAwLCBOVUxMKSkKLQl7Ci0JCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gVG8gcHJldmVudCBTeW5jTWFjaGluZS5DdXJyU3RhdGUgaXMgU0NBTl9MSVNURU4gZm9yZXZlci4KKwlpZiAoTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9TQ0FOX1RJTUVPVVQsIDAsIE5VTEwpKSB7CisJCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7CisJfSBlbHNlIHsKKwkJLyogVG8gcHJldmVudCBTeW5jTWFjaGluZS5DdXJyU3RhdGUgaXMgU0NBTl9MSVNURU4gZm9yZXZlci4gKi8KIAkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSAwOwogCQlTY2FuTmV4dENoYW5uZWwocEFkKTsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQotCQl7Ci0JCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TQ0FOX0VOUVVFVUVfRkFJTF9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpIHsKKwkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsCisJCQkJCSAgICAgIElXX1NDQU5fRU5RVUVVRV9GQUlMX0VWRU5UX0ZMQUcsCisJCQkJCSAgICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uCisJCQkJCSAgICAgIEFkZHIsIEJTUzAsIDApOwogCQl9CiAJfQogfQpAQCAtMjA4LDgxICsxODMsNzggQEAKIAkJTUxNRSBTQ0FOIHJlcSBzdGF0ZSBtYWNoaW5lIHByb2NlZHVyZQogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgTWxtZVNjYW5SZXFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBNbG1lU2NhblJlcUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVUNIQVIgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdLCBTc2lkTGVuLCBTY2FuVHlwZSwgQnNzVHlwZSwgQkJQVmFsdWUgPSAwOwotCUJPT0xFQU4gICAgICAgIFRpbWVyQ2FuY2VsbGVkOwotCVVMT05HCQkgICBOb3c7Ci0JVVNIT1JUICAgICAgICAgU3RhdHVzOwotCVBIRUFERVJfODAyXzExIHBIZHI4MDIxMTsKLQlQVUNIQVIgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyAgICBOU3RhdHVzOworCXU4IFNzaWRbTUFYX0xFTl9PRl9TU0lEXSwgU3NpZExlbiwgU2NhblR5cGUsIEJzc1R5cGUsIEJCUFZhbHVlID0gMDsKKwlCT09MRUFOIFRpbWVyQ2FuY2VsbGVkOworCXVuc2lnbmVkIGxvbmcgTm93OworCXUxNiBTdGF0dXM7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGRyODAyMTE7CisJdTggKnBPdXRCdWZmZXIgPSBOVUxMOworCWludCBOU3RhdHVzOwogCi0JLy8gQ2hlY2sgdGhlIHRvdGFsIHNjYW4gdHJpZXMgZm9yIG9uZSBzaW5nbGUgT0lEIGNvbW1hbmQKLQkvLyBJZiB0aGlzIGlzIHRoZSBDQ1ggMi4wIENhc2UsIHNraXAgdGhhdCEKLQlpZiAoICFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIE1sbWVTY2FuUmVxQWN0aW9uIGJlZm9yZSBTdGFydHVwXG4iKSk7CisJLyogQ2hlY2sgdGhlIHRvdGFsIHNjYW4gdHJpZXMgZm9yIG9uZSBzaW5nbGUgT0lEIGNvbW1hbmQgKi8KKwkvKiBJZiB0aGlzIGlzIHRoZSBDQ1ggMi4wIENhc2UsIHNraXAgdGhhdCEgKi8KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJTWU5DIC0gTWxtZVNjYW5SZXFBY3Rpb24gYmVmb3JlIFN0YXJ0dXBcbiIpKTsKIAkJcmV0dXJuOwogCX0KLQotCS8vIEluY3JlYXNlIHRoZSBzY2FuIHJldHJ5IGNvdW50ZXJzLgorCS8qIEluY3JlYXNlIHRoZSBzY2FuIHJldHJ5IGNvdW50ZXJzLiAqLwogCXBBZC0+U3RhQ2ZnLlNjYW5DbnQrKzsKIAotI2lmZGVmIFJUMjg2MAotICAgIGlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKSAmJgotICAgICAgICAoSURMRV9PTihwQWQpKSAmJgotCQkocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpICYmCi0JCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpKSkKLQl7Ci0JCVJUMjh4eFBjaUFzaWNSYWRpb09uKHBBZCwgR1VJX0lETEVfUE9XRVJfU0FWRSk7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkgJiYKKwkgICAgKElETEVfT04ocEFkKSkgJiYKKwkgICAgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKSAmJgorCSAgICAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKSkpIHsKKwkJaWYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBGQUxTRSkgeworCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMxLCBQb3dlcldha2VDSUQsIDB4MDAsCisJCQkJCSAgICAgMHgwMik7CisJCQlBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyV2FrZUNJRCk7CisJCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlBTTSAtIElzc3VlIFdha2UgdXAgY29tbWFuZCBcbiIpKTsKKwkJfSBlbHNlIHsKKwkJCVJUMjh4eFBjaUFzaWNSYWRpb09uKHBBZCwgR1VJX0lETEVfUE9XRVJfU0FWRSk7CisJCX0KIAl9Ci0jZW5kaWYKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAotCS8vIGZpcnN0IGNoZWNrIHRoZSBwYXJhbWV0ZXIgc2FuaXR5CisJLyogZmlyc3QgY2hlY2sgdGhlIHBhcmFtZXRlciBzYW5pdHkgKi8KIAlpZiAoTWxtZVNjYW5SZXFTYW5pdHkocEFkLAotCQkJCQkJICBFbGVtLT5Nc2csCi0JCQkJCQkgIEVsZW0tPk1zZ0xlbiwKLQkJCQkJCSAgJkJzc1R5cGUsCi0JCQkJCQkgIFNzaWQsCi0JCQkJCQkgICZTc2lkTGVuLAotCQkJCQkJICAmU2NhblR5cGUpKQotCXsKKwkJCSAgICAgIEVsZW0tPk1zZywKKwkJCSAgICAgIEVsZW0tPk1zZ0xlbiwKKwkJCSAgICAgICZCc3NUeXBlLCAoY2hhciAqKVNzaWQsICZTc2lkTGVuLCAmU2NhblR5cGUpKSB7CiAKLQkJLy8gQ2hlY2sgZm9yIGNoYW5uZWwgbG9hZCBhbmQgbm9pc2UgaGlzdCByZXF1ZXN0Ci0JCS8vIFN1c3BlbmQgTVNEVSBvbmx5IGF0IHNjYW4gcmVxdWVzdCwgbm90IHRoZSBsYXN0IHR3byBtZW50aW9uZWQKLQkJaWYgKChTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX05PSVNFKSB8fCAoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19DSEFOTkVMX0xPQUQpKQotCQl7Ci0JCQlpZiAocEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQkJCQlSVE1QU3VzcGVuZE1zZHVUcmFuc21pc3Npb24ocEFkKTsJCQkvLyBTdXNwZW5kIE1TRFUgdHJhbnNtaXNzaW9uIGhlcmUKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIFN1c3BlbmQgTVNEVSB0cmFuc21pc3Npb24gaGVyZQotCQkJUlRNUFN1c3BlbmRNc2R1VHJhbnNtaXNzaW9uKHBBZCk7Ci0JCX0KKwkJLyogQ2hlY2sgZm9yIGNoYW5uZWwgbG9hZCBhbmQgbm9pc2UgaGlzdCByZXF1ZXN0ICovCisJCS8qIFN1c3BlbmQgTVNEVSBvbmx5IGF0IHNjYW4gcmVxdWVzdCwgbm90IHRoZSBsYXN0IHR3byBtZW50aW9uZWQgKi8KKwkJLyogU3VzcGVuZCBNU0RVIHRyYW5zbWlzc2lvbiBoZXJlICovCisJCVJUTVBTdXNwZW5kTXNkdVRyYW5zbWlzc2lvbihwQWQpOwogCi0JCS8vCi0JCS8vIFRvIHByZXZlbnQgZGF0YSBsb3N0LgotCQkvLyBTZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9uIHRvIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCBiZWZvcmUgU0NBTiBwcm9ncmVzcy4KLQkJLy8gQW5kIHNob3VsZCBzZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9mZiB0byBBUCwgd2hlbiBzY2FuIHByb2dyZXNzIGRvbmUKLQkJLy8KLQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSAmJiAoSU5GUkFfT04ocEFkKSkpCi0JCXsKLQkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOwotCQkJaWYgKE5TdGF0dXMJPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCXsKLQkJCQlwSGRyODAyMTEgPSAoUEhFQURFUl84MDJfMTEpIHBPdXRCdWZmZXI7Ci0JCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsIHBIZHI4MDIxMSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCS8qICovCisJCS8qIFRvIHByZXZlbnQgZGF0YSBsb3N0LiAqLworCQkvKiBTZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9uIHRvIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCBiZWZvcmUgU0NBTiBwcm9ncmVzcy4gKi8KKwkJLyogQW5kIHNob3VsZCBzZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9mZiB0byBBUCwgd2hlbiBzY2FuIHByb2dyZXNzIGRvbmUgKi8KKwkJLyogKi8KKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKQorCQkgICAgJiYgKElORlJBX09OKHBBZCkpKSB7CisJCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKHZvaWQgKikmIHBPdXRCdWZmZXIpOworCQkJaWYgKE5TdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQkJCXBIZHI4MDIxMSA9IChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqKSBwT3V0QnVmZmVyOworCQkJCU1ndE1hY0hlYWRlckluaXQocEFkLCBwSGRyODAyMTEsCisJCQkJCQkgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsCisJCQkJCQkgcEFkLT5Db21tb25DZmcuQnNzaWQsCisJCQkJCQkgcEFkLT5Db21tb25DZmcuQnNzaWQpOwogCQkJCXBIZHI4MDIxMS0+RHVyYXRpb24gPSAwOwogCQkJCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX0RBVEE7CiAJCQkJcEhkcjgwMjExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CiAKLQkJCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCi0JCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTY2FuUmVxQWN0aW9uIC0tIFNlbmQgUFNNIERhdGEgZnJhbWUgZm9yIG9mZiBjaGFubmVsIFJNXG4iKSk7CisJCQkJLyogU2VuZCB1c2luZyBwcmlvcml0eSBxdWV1ZSAqLworCQkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwKKwkJCQkJCSAgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIk1sbWVTY2FuUmVxQWN0aW9uIC0tIFNlbmQgUFNNIERhdGEgZnJhbWUgZm9yIG9mZiBjaGFubmVsIFJNXG4iKSk7CiAJCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKIAkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOwogCQkJfQpAQCAtMjkwLDM4ICsyNjIsMzIgQEAKIAogCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwogCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBOb3c7Ci0JCS8vIHJlc2V0IGFsbCB0aGUgdGltZXJzCisJCS8qIHJlc2V0IGFsbCB0aGUgdGltZXJzICovCiAJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwogCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CiAKLQkJLy8gcmVjb3JkIGRlc2lyZWQgQlNTIHBhcmFtZXRlcnMKKwkJLyogcmVjb3JkIGRlc2lyZWQgQlNTIHBhcmFtZXRlcnMgKi8KIAkJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBCc3NUeXBlOwogCQlwQWQtPk1sbWVBdXguU2NhblR5cGUgPSBTY2FuVHlwZTsKIAkJcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBTc2lkTGVuOwotICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CiAJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKIAotCQkvLyBzdGFydCBmcm9tIHRoZSBmaXJzdCBjaGFubmVsCisJCS8qIHN0YXJ0IGZyb20gdGhlIGZpcnN0IGNoYW5uZWwgKi8KIAkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSBGaXJzdENoYW5uZWwocEFkKTsKIAotCQkvLyBDaGFuZ2UgdGhlIHNjYW4gY2hhbm5lbCB3aGVuIGRlYWxpbmcgd2l0aCBDQ1ggYmVhY29uIHJlcG9ydAotCQlpZiAoKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fUEFTU0lWRSkgfHwgKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQUNUSVZFKSB8fAotCQkJKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEKSB8fCAoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19OT0lTRSkpCi0JCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsOwotCi0JCS8vIExldCBCQlAgcmVnaXN0ZXIgYXQgMjBNSHogdG8gZG8gc2NhbgorCQkvKiBMZXQgQkJQIHJlZ2lzdGVyIGF0IDIwTUh6IHRvIGRvIHNjYW4gKi8KIAkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOwogCQlCQlBWYWx1ZSAmPSAofjB4MTgpOwogCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CiAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBCQlAgUjQgdG8gMjBNSHoubFxuIikpOwogCQlTY2FuTmV4dENoYW5uZWwocEFkKTsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlEQkdQUklOVF9FUlIoKCJTWU5DIC0gTWxtZVNjYW5SZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOwogCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOwogCQlTdGF0dXMgPSBNTE1FX0lOVkFMSURfRk9STUFUOwotCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU0NBTl9DT05GLCAyLCAmU3RhdHVzKTsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwgMiwKKwkJCSAgICAmU3RhdHVzKTsKIAl9CiB9CiAKQEAgLTMzMSw0OSArMjk3LDQ3IEBACiAJCU1MTUUgSk9JTiByZXEgc3RhdGUgbWFjaGluZSBwcm9jZWR1cmUKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIE1sbWVKb2luUmVxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgTWxtZUpvaW5SZXFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVDSEFSICAgICAgICBCQlBWYWx1ZSA9IDA7Ci0JQlNTX0VOVFJZICAgICpwQnNzOwotCUJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7Ci0JSEVBREVSXzgwMl8xMSBIZHI4MDIxMTsKLQlORElTX1NUQVRVUyAgIE5TdGF0dXM7Ci0JVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0JUFVDSEFSICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlQVUNIQVIgICAgICAgIHBTdXBSYXRlID0gTlVMTDsKLQlVQ0hBUiAgICAgICAgIFN1cFJhdGVMZW47Ci0JUFVDSEFSICAgICAgICBwRXh0UmF0ZSA9IE5VTEw7Ci0JVUNIQVIgICAgICAgICBFeHRSYXRlTGVuOwotCVVDSEFSICAgICAgICAgQVN1cFJhdGVbXSA9IHsweDhDLCAweDEyLCAweDk4LCAweDI0LCAweGIwLCAweDQ4LCAweDYwLCAweDZDfTsKLQlVQ0hBUiAgICAgICAgIEFTdXBSYXRlTGVuID0gc2l6ZW9mKEFTdXBSYXRlKS9zaXplb2YoVUNIQVIpOwotCU1MTUVfSk9JTl9SRVFfU1RSVUNUICpwSW5mbyA9IChNTE1FX0pPSU5fUkVRX1NUUlVDVCAqKShFbGVtLT5Nc2cpOworCXU4IEJCUFZhbHVlID0gMDsKKwlzdHJ1Y3QgcnRfYnNzX2VudHJ5ICpwQnNzOworCUJPT0xFQU4gVGltZXJDYW5jZWxsZWQ7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgSGRyODAyMTE7CisJaW50IE5TdGF0dXM7CisJdW5zaWduZWQgbG9uZyBGcmFtZUxlbiA9IDA7CisJdTggKnBPdXRCdWZmZXIgPSBOVUxMOworCXU4ICpwU3VwUmF0ZSA9IE5VTEw7CisJdTggU3VwUmF0ZUxlbjsKKwl1OCAqcEV4dFJhdGUgPSBOVUxMOworCXU4IEV4dFJhdGVMZW47CisJdTggQVN1cFJhdGVbXSA9IHsgMHg4QywgMHgxMiwgMHg5OCwgMHgyNCwgMHhiMCwgMHg0OCwgMHg2MCwgMHg2QyB9OworCXU4IEFTdXBSYXRlTGVuID0gc2l6ZW9mKEFTdXBSYXRlKSAvIHNpemVvZih1OCk7CisJc3RydWN0IHJ0X21sbWVfam9pbl9yZXEgKnBJbmZvID0gKHN0cnVjdCBydF9tbG1lX2pvaW5fcmVxICopKEVsZW0tPk1zZyk7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gTWxtZUpvaW5SZXFBY3Rpb24oQlNTICMlbGQpXG4iLCBwSW5mby0+QnNzSWR4KSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIlNZTkMgLSBNbG1lSm9pblJlcUFjdGlvbihCU1MgIyVsZClcbiIsIHBJbmZvLT5Cc3NJZHgpKTsKIAotI2lmZGVmIFJUMjg2MAotICAgIGlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKSAmJgotICAgICAgICAoSURMRV9PTihwQWQpKSAmJgotCQkocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpICYmCi0JCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpKSkKLQl7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkgJiYKKwkgICAgKElETEVfT04ocEFkKSkgJiYKKwkgICAgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKSAmJgorCSAgICAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKSkpIHsKIAkJUlQyOHh4UGNpQXNpY1JhZGlvT24ocEFkLCBHVUlfSURMRV9QT1dFUl9TQVZFKTsKIAl9Ci0jZW5kaWYKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAotCS8vIHJlc2V0IGFsbCB0aGUgdGltZXJzCisJLyogcmVzZXQgYWxsIHRoZSB0aW1lcnMgKi8KIAlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CiAJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CiAKIAlwQnNzID0gJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W3BJbmZvLT5Cc3NJZHhdOwogCi0JLy8gcmVjb3JkIHRoZSBkZXNpcmVkIFNTSUQgJiBCU1NJRCB3ZSdyZSB3YWl0aW5nIGZvcgorCS8qIHJlY29yZCB0aGUgZGVzaXJlZCBTU0lEICYgQlNTSUQgd2UncmUgd2FpdGluZyBmb3IgKi8KIAlDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEJzcy0+QnNzaWQpOwogCi0JLy8gSWYgQVAncyBTU0lEIGlzIG5vdCBoaWRkZW4sIGl0IGlzIE9LIGZvciB1cGRhdGluZyBzc2lkIHRvIE1sbWVBdXggYWdhaW4uCi0JaWYgKHBCc3MtPkhpZGRlbiA9PSAwKQotCXsKKwkvKiBJZiBBUCdzIFNTSUQgaXMgbm90IGhpZGRlbiwgaXQgaXMgT0sgZm9yIHVwZGF0aW5nIHNzaWQgdG8gTWxtZUF1eCBhZ2Fpbi4gKi8KKwlpZiAocEJzcy0+SGlkZGVuID09IDApIHsKKwkJUlRNUFplcm9NZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CiAJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBwQnNzLT5Tc2lkLCBwQnNzLT5Tc2lkTGVuKTsKIAkJcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBwQnNzLT5Tc2lkTGVuOwogCX0KQEAgLTM4Miw4OCArMzQ2LDg3IEBACiAJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSBwQnNzLT5DaGFubmVsOwogCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCA9IHBCc3MtPkNlbnRyYWxDaGFubmVsOwogCi0JLy8gTGV0IEJCUCByZWdpc3RlciBhdCAyME1IeiB0byBkbyBzY2FuCisJLyogTGV0IEJCUCByZWdpc3RlciBhdCAyME1IeiB0byBkbyBzY2FuICovCiAJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOwogCUJCUFZhbHVlICY9ICh+MHgxOCk7CiAJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEJCUCBSNCB0byAyME1Iei5sXG4iKSk7CiAKLQkvLyBzd2l0Y2ggY2hhbm5lbCBhbmQgd2FpdGluZyBmb3IgYmVhY29uIHRpbWVyCisJLyogc3dpdGNoIGNoYW5uZWwgYW5kIHdhaXRpbmcgZm9yIGJlYWNvbiB0aW1lciAqLwogCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwsIEZBTFNFKTsKIAlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7CiAJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsIEpPSU5fVElNRU9VVCk7CiAKLSAgICBkbwotCXsKKwlkbyB7CiAJCWlmICgoKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmCi0gICAgICAgICAgICAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPiAxNCkgJiYKLSAgICAgICAgICAgICBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKSkKLSAgICAgICAgICAgICkKLQkJewotCQkJLy8KLQkJCS8vIFdlIGNhbid0IHNlbmQgYW55IFByb2JlIHJlcXVlc3QgZnJhbWUgdG8gbWVldCA4MDIuMTFoLgotCQkJLy8KKwkJICAgICAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPiAxNCkgJiYKKwkJICAgICBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKSkKKwkJICAgICkgeworCQkJLyogKi8KKwkJCS8qIFdlIGNhbid0IHNlbmQgYW55IFByb2JlIHJlcXVlc3QgZnJhbWUgdG8gbWVldCA4MDIuMTFoLiAqLworCQkJLyogKi8KIAkJCWlmIChwQnNzLT5IaWRkZW4gPT0gMCkKIAkJCQlicmVhazsKIAkJfQotCi0JCS8vCi0JCS8vIHNlbmQgcHJvYmUgcmVxdWVzdAotCQkvLworCQkvKiAqLworCQkvKiBzZW5kIHByb2JlIHJlcXVlc3QgKi8KKwkJLyogKi8KIAkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKLQkJaWYgKE5TdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJaWYgKHBBZC0+TWxtZUF1eC5DaGFubmVsIDw9IDE0KQotCQkJeworCQlpZiAoTlN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpIHsKIAkJCQlwU3VwUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGU7CiAJCQkJU3VwUmF0ZUxlbiA9IHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW47CiAJCQkJcEV4dFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlOwogCQkJCUV4dFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vCi0JCQkJLy8gT3ZlcndyaXRlIFN1cHBvcnQgUmF0ZSwgQ0NLIHJhdGUgYXJlIG5vdCBhbGxvd2VkCi0JCQkJLy8KKwkJCX0gZWxzZSB7CisJCQkJLyogKi8KKwkJCQkvKiBPdmVyd3JpdGUgU3VwcG9ydCBSYXRlLCBDQ0sgcmF0ZSBhcmUgbm90IGFsbG93ZWQgKi8KKwkJCQkvKiAqLwogCQkJCXBTdXBSYXRlID0gQVN1cFJhdGU7CiAJCQkJU3VwUmF0ZUxlbiA9IEFTdXBSYXRlTGVuOwogCQkJCUV4dFJhdGVMZW4gPSAwOwogCQkJfQogCiAJCQlpZiAocEFkLT5NbG1lQXV4LkJzc1R5cGUgPT0gQlNTX0lORlJBKQotCQkJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmSGRyODAyMTEsIFNVQlRZUEVfUFJPQkVfUkVRLCAwLCBwQWQtPk1sbWVBdXguQnNzaWQsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisJCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZIZHI4MDIxMSwKKwkJCQkJCSBTVUJUWVBFX1BST0JFX1JFUSwgMCwKKwkJCQkJCSBwQWQtPk1sbWVBdXguQnNzaWQsCisJCQkJCQkgcEFkLT5NbG1lQXV4LkJzc2lkKTsKIAkJCWVsc2UKLQkJCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLCBTVUJUWVBFX1BST0JFX1JFUSwgMCwgQlJPQURDQVNUX0FERFIsIEJST0FEQ0FTVF9BRERSKTsKKwkJCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLAorCQkJCQkJIFNVQlRZUEVfUFJPQkVfUkVRLCAwLAorCQkJCQkJIEJST0FEQ0FTVF9BRERSLAorCQkJCQkJIEJST0FEQ0FTVF9BRERSKTsKIAotCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCi0JCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICZIZHI4MDIxMSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+TWxtZUF1eC5Tc2lkTGVuLAotCQkJCQkJCSAgcEFkLT5NbG1lQXV4LlNzaWRMZW4sCSAgICBwQWQtPk1sbWVBdXguU3NpZCwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVJZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVMZW4sCi0JCQkJCQkJICBTdXBSYXRlTGVuLCAgICAgICAgICAgICAgIHBTdXBSYXRlLAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgJkZyYW1lTGVuLAorCQkJCQkgIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSksICZIZHI4MDIxMSwKKwkJCQkJICAxLCAmU3NpZEllLAorCQkJCQkgIDEsICZwQWQtPk1sbWVBdXguU3NpZExlbiwKKwkJCQkJICBwQWQtPk1sbWVBdXguU3NpZExlbiwKKwkJCQkJICBwQWQtPk1sbWVBdXguU3NpZCwgMSwgJlN1cFJhdGVJZSwgMSwKKwkJCQkJICAmU3VwUmF0ZUxlbiwgU3VwUmF0ZUxlbiwgcFN1cFJhdGUsCisJCQkJCSAgRU5EX09GX0FSR1MpOwogCi0JCQlpZiAoRXh0UmF0ZUxlbikKLQkJCXsKLQkJCQlVTE9ORyBUbXA7Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXAsCi0JCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCi0JCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlTGVuLAotCQkJCQkJCQkgIEV4dFJhdGVMZW4sICAgICAgICAgICAgICAgICAgICAgICBwRXh0UmF0ZSwKLQkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQlpZiAoRXh0UmF0ZUxlbikgeworCQkJCXVuc2lnbmVkIGxvbmcgVG1wOworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJlRtcCwKKwkJCQkJCSAgMSwgJkV4dFJhdGVJZSwKKwkJCQkJCSAgMSwgJkV4dFJhdGVMZW4sCisJCQkJCQkgIEV4dFJhdGVMZW4sIHBFeHRSYXRlLAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CiAJCQkJRnJhbWVMZW4gKz0gVG1wOwogCQkJfQogCi0KIAkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwogCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKIAkJfQotICAgIH0gd2hpbGUgKEZBTFNFKTsKKwl9IHdoaWxlIChGQUxTRSk7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gU3dpdGNoIHRvIGNoICVkLCBXYWl0IEJFQUNPTiBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQlwQnNzLT5DaGFubmVsLCBwQnNzLT5Cc3NpZFswXSwgcEJzcy0+QnNzaWRbMV0sIHBCc3MtPkJzc2lkWzJdLCBwQnNzLT5Cc3NpZFszXSwgcEJzcy0+QnNzaWRbNF0sIHBCc3MtPkJzc2lkWzVdKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIlNZTkMgLSBTd2l0Y2ggdG8gY2ggJWQsIFdhaXQgQkVBQ09OIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCSAgcEJzcy0+Q2hhbm5lbCwgcEJzcy0+QnNzaWRbMF0sIHBCc3MtPkJzc2lkWzFdLCBwQnNzLT5Cc3NpZFsyXSwKKwkJICBwQnNzLT5Cc3NpZFszXSwgcEJzcy0+QnNzaWRbNF0sIHBCc3MtPkJzc2lkWzVdKSk7CiAKIAlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gSk9JTl9XQUlUX0JFQUNPTjsKIH0KQEAgLTQ3NCw5NSArNDM3LDExMCBAQAogCQlNTE1FIFNUQVJUIFJlcXVlc3Qgc3RhdGUgbWFjaGluZSBwcm9jZWR1cmUsIHN0YXJ0aW5nIGFuIElCU1MKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIE1sbWVTdGFydFJlcUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIE1sbWVTdGFydFJlcUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVUNIQVIgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF0sIFNzaWRMZW47Ci0JQk9PTEVBTiAgICAgICBUaW1lckNhbmNlbGxlZDsKKwl1OCBTc2lkW01BWF9MRU5fT0ZfU1NJRF0sIFNzaWRMZW47CisJQk9PTEVBTiBUaW1lckNhbmNlbGxlZDsKIAotCS8vIE5ldyBmb3IgV1BBIHNlY3VyaXR5IHN1aXRlcwotCVVDSEFSCQkJCQkJVmFySUVbTUFYX1ZJRV9MRU5dOyAJLy8gVG90YWwgVklFIGxlbmd0aCA9IE1BWF9WSUVfTEVOIC0gLTUKLQlORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMJKnBWSUUgPSBOVUxMOwotCUxBUkdFX0lOVEVHRVIJCQkJVGltZVN0YW1wOworCS8qIE5ldyBmb3IgV1BBIHNlY3VyaXR5IHN1aXRlcyAqLworCXU4IFZhcklFW01BWF9WSUVfTEVOXTsJLyogVG90YWwgVklFIGxlbmd0aCA9IE1BWF9WSUVfTEVOIC0gLTUgKi8KKwlzdHJ1Y3QgcnRfbmRpc184MDJfMTFfdmFyaWFibGVfaWVzICpwVklFID0gTlVMTDsKKwlMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcDsKIAlCT09MRUFOIFByaXZhY3k7Ci0JVVNIT1JUIFN0YXR1czsKKwl1MTYgU3RhdHVzOwogCi0JLy8gSW5pdCBWYXJpYWJsZSBJRSBzdHJ1Y3R1cmUKLQlwVklFID0gKFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMpIFZhcklFOworCS8qIEluaXQgVmFyaWFibGUgSUUgc3RydWN0dXJlICovCisJcFZJRSA9IChzdHJ1Y3QgcnRfbmRpc184MDJfMTFfdmFyaWFibGVfaWVzICopVmFySUU7CiAJcFZJRS0+TGVuZ3RoID0gMDsKLQlUaW1lU3RhbXAudS5Mb3dQYXJ0ICA9IDA7CisJVGltZVN0YW1wLnUuTG93UGFydCA9IDA7CiAJVGltZVN0YW1wLnUuSGlnaFBhcnQgPSAwOwogCi0JaWYgKE1sbWVTdGFydFJlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBTc2lkLCAmU3NpZExlbikpCi0JewotCQkvLyByZXNldCBhbGwgdGhlIHRpbWVycworCWlmIChNbG1lU3RhcnRSZXFTYW5pdHkKKwkgICAgKHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIChjaGFyICopU3NpZCwgJlNzaWRMZW4pKSB7CisJCS8qIHJlc2V0IGFsbCB0aGUgdGltZXJzICovCiAJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKIAkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CiAKLQkJLy8KLQkJLy8gU3RhcnQgYSBuZXcgSUJTUy4gQWxsIElCU1MgcGFyYW1ldGVycyBhcmUgZGVjaWRlZCBub3cuLi4uCi0JCS8vCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTdGFydFJlcUFjdGlvbiAtIFN0YXJ0IGEgbmV3IElCU1MuIEFsbCBJQlNTIHBhcmFtZXRlcnMgYXJlIGRlY2lkZWQgbm93Li4uLiBcbiIpKTsKLQkJcEFkLT5NbG1lQXV4LkJzc1R5cGUgICAgICAgICAgID0gQlNTX0FESE9DOworCQkvKiAqLworCQkvKiBTdGFydCBhIG5ldyBJQlNTLiBBbGwgSUJTUyBwYXJhbWV0ZXJzIGFyZSBkZWNpZGVkIG5vdy4uLi4gKi8KKwkJLyogKi8KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJNbG1lU3RhcnRSZXFBY3Rpb24gLSBTdGFydCBhIG5ldyBJQlNTLiBBbGwgSUJTUyBwYXJhbWV0ZXJzIGFyZSBkZWNpZGVkIG5vdy4uLi4gXG4iKSk7CisJCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gQlNTX0FESE9DOwogCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgU3NpZCwgU3NpZExlbik7Ci0JCXBBZC0+TWxtZUF1eC5Tc2lkTGVuICAgICAgICAgICA9IFNzaWRMZW47CisJCXBBZC0+TWxtZUF1eC5Tc2lkTGVuID0gU3NpZExlbjsKIAotCQkvLyBnZW5lcmF0ZSBhIHJhZG9tIG51bWJlciBhcyBCU1NJRAorCQkvKiBnZW5lcmF0ZSBhIHJhZG9tIG51bWJlciBhcyBCU1NJRCAqLwogCQlNYWNBZGRyUmFuZG9tQnNzaWQocEFkLCBwQWQtPk1sbWVBdXguQnNzaWQpOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU3RhcnRSZXFBY3Rpb24gLSBnZW5lcmF0ZSBhIHJhZG9tIG51bWJlciBhcyBCU1NJRCBcbiIpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJNbG1lU3RhcnRSZXFBY3Rpb24gLSBnZW5lcmF0ZSBhIHJhZG9tIG51bWJlciBhcyBCU1NJRCBcbiIpKTsKIAotCQlQcml2YWN5ID0gKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSB8fAotCQkJCSAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAotCQkJCSAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKTsKLQkJcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvICAgID0gQ0FQX0dFTkVSQVRFKDAsMSxQcml2YWN5LCAocEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlU2hvcnQpLCAxLCAwKTsKLQkJcEFkLT5NbG1lQXV4LkJlYWNvblBlcmlvZCAgICAgID0gcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kOwotCQlwQWQtPk1sbWVBdXguQXRpbVdpbiAgICAgICAgICAgPSBwQWQtPlN0YUNmZy5BdGltV2luOwotCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCAgICAgICAgICAgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCQlQcml2YWN5ID0KKwkJICAgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkKKwkJICAgIHx8IChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJICAgIHx8IChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCk7CisJCXBBZC0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbyA9CisJCSAgICBDQVBfR0VORVJBVEUoMCwgMSwgUHJpdmFjeSwKKwkJCQkgKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPT0KKwkJCQkgIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCksIDEsIDApOworCQlwQWQtPk1sbWVBdXguQmVhY29uUGVyaW9kID0gcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kOworCQlwQWQtPk1sbWVBdXguQXRpbVdpbiA9IHBBZC0+U3RhQ2ZnLkF0aW1XaW47CisJCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKIAotCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCAgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwotCQlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgICAgPSBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbDsKKwkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCQlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbDsKIAotCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbj0gcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbjsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlN1cFJhdGUsIHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKLQkJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguU3VwUmF0ZSwgJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuKTsKKwkJcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3VwUmF0ZSwgcEFkLT5Db21tb25DZmcuU3VwUmF0ZSwKKwkJCSAgICAgICBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LlN1cFJhdGUsCisJCQkgICAgICAgJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuKTsKIAkJcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuOwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguRXh0UmF0ZSwgcEFkLT5Db21tb25DZmcuRXh0UmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOwotCQlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5FeHRSYXRlLCAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguRXh0UmF0ZSwgcEFkLT5Db21tb25DZmcuRXh0UmF0ZSwKKwkJCSAgICAgICBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LkV4dFJhdGUsCisJCQkgICAgICAgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKTsKIAotCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQotCQl7Ci0JCQlSVE1QVXBkYXRlSFRJRSgmcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LCAmcEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mby5NQ1NTZXRbMF0sICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCAmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbyk7Ci0JCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID0gc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpOwotCQkJLy8gTm90IHR1cm4gcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuYkh0RW5hYmxlID0gVFJVRSBoZXJlLgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuYkh0RW5hYmxlID0gVFJVRVxuIikpOwotCQl9Ci0JCWVsc2UKLQkJeworCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSB7CisJCQlSVE1QVXBkYXRlSFRJRSgmcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LAorCQkJCSAgICAgICAmcEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mby5NQ1NTZXRbMF0sCisJCQkJICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAorCQkJCSAgICAgICAmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbyk7CisJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID0gc2l6ZW9mKHN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llKTsKKwkJCS8qIE5vdCB0dXJuIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LmJIdEVuYWJsZSA9IFRSVUUgaGVyZS4gKi8KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlNZTkMgLXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LmJIdEVuYWJsZSA9IFRSVUVcbiIpKTsKKwkJfSBlbHNlIHsKIAkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSAwOwogCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKKwkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLgorCQkJCSAgICAgICBNQ1NTZXRbMF0sIDE2KTsKIAkJfQotCQkvLyB0ZW1wb3JhcmlseSBub3Qgc3VwcG9ydCBRT1MgaW4gSUJTUwotCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKLQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTsKLQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7CisJCS8qIHRlbXBvcmFyaWx5IG5vdCBzdXBwb3J0IFFPUyBpbiBJQlNTICovCisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBFZGNhUGFybSwgc2l6ZW9mKHN0cnVjdCBydF9lZGNhX3Bhcm0pKTsKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFic3NMb2FkLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfcWJzc19sb2FkX3Bhcm0pKTsKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFvc0NhcGFiaWxpdHksCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9xb3NfY2FwYWJpbGl0eV9wYXJtKSk7CiAKIAkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCwgRkFMU0UpOwogCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7CiAKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIE1sbWVTdGFydFJlcUFjdGlvbihjaD0gJWQsc3VwIHJhdGVzPSAlZCwgZXh0IHJhdGVzPSVkKVxuIiwKLQkJCXBBZC0+TWxtZUF1eC5DaGFubmVsLCBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJTWU5DIC0gTWxtZVN0YXJ0UmVxQWN0aW9uKGNoPSAlZCxzdXAgcmF0ZXM9ICVkLCBleHQgcmF0ZXM9JWQpXG4iLAorCQkJICBwQWQtPk1sbWVBdXguQ2hhbm5lbCwgcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCisJCQkgIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKSk7CiAKIAkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKIAkJU3RhdHVzID0gTUxNRV9TVUNDRVNTOwotCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU1RBUlRfQ09ORiwgMiwgJlN0YXR1cyk7Ci0JfQotCWVsc2UKLQl7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TVEFSVF9DT05GLCAyLAorCQkJICAgICZTdGF0dXMpOworCX0gZWxzZSB7CiAJCURCR1BSSU5UX0VSUigoIlNZTkMgLSBNbG1lU3RhcnRSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbC5cbiIpKTsKIAkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKIAkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKLQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NUQVJUX0NPTkYsIDIsICZTdGF0dXMpOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU1RBUlRfQ09ORiwgMiwKKwkJCSAgICAmU3RhdHVzKTsKIAl9CiB9CiAKQEAgLTU3MiwxMjYgKzU1MCwxMTYgQEAKIAkJcGVlciBzZW5kcyBiZWFjb24gYmFjayB3aGVuIHNjYW5uaW5nCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBQZWVyQmVhY29uQXRTY2FuQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgUGVlckJlYWNvbkF0U2NhbkFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVUNIQVIgICAgICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl0sIEFkZHIyW01BQ19BRERSX0xFTl07Ci0JVUNIQVIgICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXSwgQnNzVHlwZSwgQ2hhbm5lbCwgTmV3Q2hhbm5lbCwKLQkJCQkJU3NpZExlbiwgRHRpbUNvdW50LCBEdGltUGVyaW9kLCBCY2FzdEZsYWcsIE1lc3NhZ2VUb01lOwotCUNGX1BBUk0gICAgICAgICBDZlBhcm07Ci0JVVNIT1JUICAgICAgICAgIEJlYWNvblBlcmlvZCwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm87Ci0JUEZSQU1FXzgwMl8xMSAgIHBGcmFtZTsKLQlMQVJHRV9JTlRFR0VSICAgVGltZVN0YW1wOwotCVVDSEFSICAgICAgICAgICBFcnA7Ci0JVUNIQVIgICAgICAgICAJU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwotCVVDSEFSCQkgIAlTdXBSYXRlTGVuLCBFeHRSYXRlTGVuOwotCVVTSE9SVCAJCQlMZW5WSUU7Ci0JVUNIQVIJCQlDa2lwRmxhZzsKLQlVQ0hBUgkJCUFpcm9uZXRDZWxsUG93ZXJMaW1pdDsKLQlFRENBX1BBUk0gICAgICAgRWRjYVBhcm07Ci0JUUJTU19MT0FEX1BBUk0gIFFic3NMb2FkOwotCVFPU19DQVBBQklMSVRZX1BBUk0gUW9zQ2FwYWJpbGl0eTsKLQlVTE9ORwkJCQkJCVJhbGlua0llOwotCVVDSEFSCQkJCQkJVmFySUVbTUFYX1ZJRV9MRU5dOwkJLy8gVG90YWwgVklFIGxlbmd0aCA9IE1BWF9WSUVfTEVOIC0gLTUKLQlORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMJKnBWSUUgPSBOVUxMOwotCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKLQlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLQlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiA9IDAsIFByZU5IdENhcGFiaWxpdHlMZW4gPSAwOwotCVVDSEFSCQkJQWRkSHRJbmZvTGVuOwotCVVDSEFSCQkJTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CisJdTggQnNzaWRbTUFDX0FERFJfTEVOXSwgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwl1OCBTc2lkW01BWF9MRU5fT0ZfU1NJRF0sIEJzc1R5cGUsIENoYW5uZWwsIE5ld0NoYW5uZWwsCisJICAgIFNzaWRMZW4sIER0aW1Db3VudCwgRHRpbVBlcmlvZCwgQmNhc3RGbGFnLCBNZXNzYWdlVG9NZTsKKwlzdHJ1Y3QgcnRfY2ZfcGFybSBDZlBhcm07CisJdTE2IEJlYWNvblBlcmlvZCwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm87CisJc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqIHBGcmFtZTsKKwlMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcDsKKwl1OCBFcnA7CisJdTggU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sCisJICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCXU4IFN1cFJhdGVMZW4sIEV4dFJhdGVMZW47CisJdTE2IExlblZJRTsKKwl1OCBDa2lwRmxhZzsKKwl1OCBBaXJvbmV0Q2VsbFBvd2VyTGltaXQ7CisJc3RydWN0IHJ0X2VkY2FfcGFybSBFZGNhUGFybTsKKwlzdHJ1Y3QgcnRfcWJzc19sb2FkX3Bhcm0gUWJzc0xvYWQ7CisJc3RydWN0IHJ0X3Fvc19jYXBhYmlsaXR5X3Bhcm0gUW9zQ2FwYWJpbGl0eTsKKwl1bnNpZ25lZCBsb25nIFJhbGlua0llOworCXU4IFZhcklFW01BWF9WSUVfTEVOXTsJLyogVG90YWwgVklFIGxlbmd0aCA9IE1BWF9WSUVfTEVOIC0gLTUgKi8KKwlzdHJ1Y3QgcnRfbmRpc184MDJfMTFfdmFyaWFibGVfaWVzICpwVklFID0gTlVMTDsKKwlzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSBIdENhcGFiaWxpdHk7CisJc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llIEFkZEh0SW5mbzsJLyogQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFICovCisJdTggSHRDYXBhYmlsaXR5TGVuID0gMCwgUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IDA7CisJdTggQWRkSHRJbmZvTGVuOworCXU4IE5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOwogCi0JcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpIEVsZW0tPk1zZzsKLQkvLyBJbml0IFZhcmlhYmxlIElFIHN0cnVjdHVyZQotCXBWSUUgPSAoUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcykgVmFySUU7CisJLyogTmRpc0ZpbGxNZW1vcnkoU3NpZCwgTUFYX0xFTl9PRl9TU0lELCAweDAwKTsgKi8KKwlwRnJhbWUgPSAoc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqKSBFbGVtLT5Nc2c7CisJLyogSW5pdCBWYXJpYWJsZSBJRSBzdHJ1Y3R1cmUgKi8KKwlwVklFID0gKHN0cnVjdCBydF9uZGlzXzgwMl8xMV92YXJpYWJsZV9pZXMgKilWYXJJRTsKIAlwVklFLT5MZW5ndGggPSAwOwogCi0gICAgUlRNUFplcm9NZW1vcnkoJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEh0Q2FwYWJpbGl0eSkpOwotCVJUTVBaZXJvTWVtb3J5KCZBZGRIdEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCVJUTVBaZXJvTWVtb3J5KCZIdENhcGFiaWxpdHksIHNpemVvZihIdENhcGFiaWxpdHkpKTsKKwlSVE1QWmVyb01lbW9yeSgmQWRkSHRJbmZvLCBzaXplb2Yoc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llKSk7CiAKIAlpZiAoUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5KHBBZCwKLQkJCQkJCQkJRWxlbS0+TXNnLAotCQkJCQkJCQlFbGVtLT5Nc2dMZW4sCi0JCQkJCQkJCUVsZW0tPkNoYW5uZWwsCi0JCQkJCQkJCUFkZHIyLAotCQkJCQkJCQlCc3NpZCwKLQkJCQkJCQkJU3NpZCwKLQkJCQkJCQkJJlNzaWRMZW4sCi0JCQkJCQkJCSZCc3NUeXBlLAotCQkJCQkJCQkmQmVhY29uUGVyaW9kLAotCQkJCQkJCQkmQ2hhbm5lbCwKLQkJCQkJCQkJJk5ld0NoYW5uZWwsCi0JCQkJCQkJCSZUaW1lU3RhbXAsCi0JCQkJCQkJCSZDZlBhcm0sCi0JCQkJCQkJCSZBdGltV2luLAotCQkJCQkJCQkmQ2FwYWJpbGl0eUluZm8sCi0JCQkJCQkJCSZFcnAsCi0JCQkJCQkJCSZEdGltQ291bnQsCi0JCQkJCQkJCSZEdGltUGVyaW9kLAotCQkJCQkJCQkmQmNhc3RGbGFnLAotCQkJCQkJCQkmTWVzc2FnZVRvTWUsCi0JCQkJCQkJCVN1cFJhdGUsCi0JCQkJCQkJCSZTdXBSYXRlTGVuLAotCQkJCQkJCQlFeHRSYXRlLAotCQkJCQkJCQkmRXh0UmF0ZUxlbiwKLQkJCQkJCQkJJkNraXBGbGFnLAotCQkJCQkJCQkmQWlyb25ldENlbGxQb3dlckxpbWl0LAotCQkJCQkJCQkmRWRjYVBhcm0sCi0JCQkJCQkJCSZRYnNzTG9hZCwKLQkJCQkJCQkJJlFvc0NhcGFiaWxpdHksCi0JCQkJCQkJCSZSYWxpbmtJZSwKLQkJCQkJCQkJJkh0Q2FwYWJpbGl0eUxlbiwKLQkJCQkJCQkJJlByZU5IdENhcGFiaWxpdHlMZW4sCi0JCQkJCQkJCSZIdENhcGFiaWxpdHksCi0JCQkJCQkJCSZBZGRIdEluZm9MZW4sCi0JCQkJCQkJCSZBZGRIdEluZm8sCi0JCQkJCQkJCSZOZXdFeHRDaGFubmVsT2Zmc2V0LAotCQkJCQkJCQkmTGVuVklFLAotCQkJCQkJCQlwVklFKSkKLQl7Ci0JCVVMT05HIElkeDsKLQkJQ0hBUiBSc3NpID0gMDsKKwkJCQkJRWxlbS0+TXNnLAorCQkJCQlFbGVtLT5Nc2dMZW4sCisJCQkJCUVsZW0tPkNoYW5uZWwsCisJCQkJCUFkZHIyLAorCQkJCQlCc3NpZCwKKwkJCQkJKGNoYXIgKilTc2lkLAorCQkJCQkmU3NpZExlbiwKKwkJCQkJJkJzc1R5cGUsCisJCQkJCSZCZWFjb25QZXJpb2QsCisJCQkJCSZDaGFubmVsLAorCQkJCQkmTmV3Q2hhbm5lbCwKKwkJCQkJJlRpbWVTdGFtcCwKKwkJCQkJJkNmUGFybSwKKwkJCQkJJkF0aW1XaW4sCisJCQkJCSZDYXBhYmlsaXR5SW5mbywKKwkJCQkJJkVycCwKKwkJCQkJJkR0aW1Db3VudCwKKwkJCQkJJkR0aW1QZXJpb2QsCisJCQkJCSZCY2FzdEZsYWcsCisJCQkJCSZNZXNzYWdlVG9NZSwKKwkJCQkJU3VwUmF0ZSwKKwkJCQkJJlN1cFJhdGVMZW4sCisJCQkJCUV4dFJhdGUsCisJCQkJCSZFeHRSYXRlTGVuLAorCQkJCQkmQ2tpcEZsYWcsCisJCQkJCSZBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCisJCQkJCSZFZGNhUGFybSwKKwkJCQkJJlFic3NMb2FkLAorCQkJCQkmUW9zQ2FwYWJpbGl0eSwKKwkJCQkJJlJhbGlua0llLAorCQkJCQkmSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkmUHJlTkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJJkh0Q2FwYWJpbGl0eSwKKwkJCQkJJkFkZEh0SW5mb0xlbiwKKwkJCQkJJkFkZEh0SW5mbywKKwkJCQkJJk5ld0V4dENoYW5uZWxPZmZzZXQsICZMZW5WSUUsIHBWSUUpKSB7CisJCXVuc2lnbmVkIGxvbmcgSWR4OworCQljaGFyIFJzc2kgPSAwOwogCiAJCUlkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIEJzc2lkLCBDaGFubmVsKTsKIAkJaWYgKElkeCAhPSBCU1NfTk9UX0ZPVU5EKQogCQkJUnNzaSA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlJzc2k7CiAKLQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kwLCBSU1NJXzApLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTEsIFJTU0lfMSksIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMiwgUlNTSV8yKSk7CisJCVJzc2kgPQorCQkgICAgUlRNUE1heFJzc2kocEFkLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTAsIFJTU0lfMCksCisJCQkJQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kxLCBSU1NJXzEpLAorCQkJCUNvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMiwgUlNTSV8yKSk7CiAKIAkJaWYgKChIdENhcGFiaWxpdHlMZW4gPiAwKSB8fCAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA+IDApKQogCQkJSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7CiAKLQkJaWYgKChwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICE9IE1TUk5fVFlQRV9VTlVTRUQpICYmIChDaGFubmVsID09IHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsKSkKLQkJewotCQkJSWR4ID0gQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIsIEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCi0JCQkJCQkgJkNmUGFybSwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sRXh0UmF0ZSwgRXh0UmF0ZUxlbiwgJkh0Q2FwYWJpbGl0eSwKLQkJCQkJCSAmQWRkSHRJbmZvLCBIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwgTmV3RXh0Q2hhbm5lbE9mZnNldCwgQ2hhbm5lbCwgUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywKLQkJCQkJCSAmRWRjYVBhcm0sICZRb3NDYXBhYmlsaXR5LCAmUWJzc0xvYWQsIExlblZJRSwgcFZJRSk7Ci0JCQlpZiAoSWR4ICE9IEJTU19OT1RfRk9VTkQpCi0JCQl7Ci0JCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuQ0NYQnNzVGFiLkJzc0VudHJ5W0lkeF0uUFRTRiwgJkVsZW0tPk1zZ1syNF0sIDQpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIuQnNzRW50cnlbSWR4XS5UVFNGWzBdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYi5Cc3NFbnRyeVtJZHhdLlRUU0ZbNF0sICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKLQkJCQlpZiAocEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSA9PSBNU1JOX1RZUEVfQkVBQ09OX1JFUSkKLQkJCQkJQWlyb25ldEFkZEJlYWNvblJlcG9ydChwQWQsIElkeCwgRWxlbSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlJZHggPSBCc3NUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U2NhblRhYiwgQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCwKLQkJCQkJCSAgJkNmUGFybSwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sICAmSHRDYXBhYmlsaXR5LAotCQkJCQkJICZBZGRIdEluZm8sIEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLCBOZXdFeHRDaGFubmVsT2Zmc2V0LCBDaGFubmVsLCBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLAotCQkJCQkJICZFZGNhUGFybSwgJlFvc0NhcGFiaWxpdHksICZRYnNzTG9hZCwgTGVuVklFLCBwVklFKTsKKwkJSWR4ID0KKwkJICAgIEJzc1RhYmxlU2V0RW50cnkocEFkLCAmcEFkLT5TY2FuVGFiLCBCc3NpZCwgKGNoYXIgKilTc2lkLAorCQkJCSAgICAgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLCAmQ2ZQYXJtLAorCQkJCSAgICAgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsCisJCQkJICAgICBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLAorCQkJCSAgICAgJkh0Q2FwYWJpbGl0eSwgJkFkZEh0SW5mbywgSHRDYXBhYmlsaXR5TGVuLAorCQkJCSAgICAgQWRkSHRJbmZvTGVuLCBOZXdFeHRDaGFubmVsT2Zmc2V0LCBDaGFubmVsLAorCQkJCSAgICAgUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywgJkVkY2FQYXJtLAorCQkJCSAgICAgJlFvc0NhcGFiaWxpdHksICZRYnNzTG9hZCwgTGVuVklFLCBwVklFKTsKIAotCQkJaWYgKElkeCAhPSBCU1NfTk9UX0ZPVU5EKQotCQkJewotCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlBUU0YsICZFbGVtLT5Nc2dbMjRdLCA0KTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVFRTRlswXSwgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5UVFNGWzRdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7Ci0JCQl9CisJCWlmIChJZHggIT0gQlNTX05PVF9GT1VORCkgeworCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uUFRTRiwKKwkJCQkgICAgICAgJkVsZW0tPk1zZ1syNF0sIDQpOworCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlRUU0ZbMF0sCisJCQkJICAgICAgICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5UVFNGWzRdLAorCQkJCSAgICAgICAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7CiAJCX0KKwogCX0KLQkvLyBzYW5pdHkgY2hlY2sgZmFpbCwgaWdub3JlZAorCS8qIHNhbml0eSBjaGVjayBmYWlsLCBpZ25vcmVkICovCiB9CiAKIC8qCkBAIC03MDAsMTM0ICs2NjgsMjA3IEBACiAJCVdoZW4gd2FpdGluZyBqb2luaW5nIHRoZSAoSSlCU1MsIGJlYWNvbiByZWNlaXZlZCBmcm9tIGV4dGVybmFsCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBQZWVyQmVhY29uQXRKb2luQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgUGVlckJlYWNvbkF0Sm9pbkFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVUNIQVIgICAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dLCBBZGRyMltNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdLCBTc2lkTGVuLCBCc3NUeXBlLCBDaGFubmVsLCBNZXNzYWdlVG9NZSwKLQkJCQkgIER0aW1Db3VudCwgRHRpbVBlcmlvZCwgQmNhc3RGbGFnLCBOZXdDaGFubmVsOworCXU4IEJzc2lkW01BQ19BRERSX0xFTl0sIEFkZHIyW01BQ19BRERSX0xFTl07CisJdTggU3NpZFtNQVhfTEVOX09GX1NTSURdLCBTc2lkTGVuLCBCc3NUeXBlLCBDaGFubmVsLCBNZXNzYWdlVG9NZSwKKwkgICAgRHRpbUNvdW50LCBEdGltUGVyaW9kLCBCY2FzdEZsYWcsIE5ld0NoYW5uZWw7CiAJTEFSR0VfSU5URUdFUiBUaW1lU3RhbXA7Ci0JVVNIT1JUICAgICAgICBCZWFjb25QZXJpb2QsIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvOwotCUNGX1BBUk0gICAgICAgQ2Y7Ci0JQk9PTEVBTiAgICAgICBUaW1lckNhbmNlbGxlZDsKLQlVQ0hBUiAgICAgICAgIEVycDsKLQlVQ0hBUiAgICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUgkJICBTdXBSYXRlTGVuLCBFeHRSYXRlTGVuOwotCVVDSEFSICAgICAgICAgQ2tpcEZsYWc7Ci0JVVNIT1JUIAkJICBMZW5WSUU7Ci0JVUNIQVIJCSAgQWlyb25ldENlbGxQb3dlckxpbWl0OwotCUVEQ0FfUEFSTSAgICAgICBFZGNhUGFybTsKLQlRQlNTX0xPQURfUEFSTSAgUWJzc0xvYWQ7Ci0JUU9TX0NBUEFCSUxJVFlfUEFSTSBRb3NDYXBhYmlsaXR5OwotCVVTSE9SVCAgICAgICAgU3RhdHVzOwotCVVDSEFSCQkJCQkJVmFySUVbTUFYX1ZJRV9MRU5dOwkJLy8gVG90YWwgVklFIGxlbmd0aCA9IE1BWF9WSUVfTEVOIC0gLTUKLQlORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMJKnBWSUUgPSBOVUxMOwotCVVMT05HICAgICAgICAgICBSYWxpbmtJZTsKLQlVTE9ORyAgICAgICAgIElkeDsKLQlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7Ci0JQUREX0hUX0lORk9fSUUJCUFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCi0JVUNIQVIJCQkJSHRDYXBhYmlsaXR5TGVuID0gMCwgUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IDA7Ci0JVUNIQVIJCQlBZGRIdEluZm9MZW47Ci0JVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKLQlVQ0hBUgkJCUNlbnRyYWxDaGFubmVsOworCXUxNiBCZWFjb25QZXJpb2QsIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvOworCXN0cnVjdCBydF9jZl9wYXJtIENmOworCUJPT0xFQU4gVGltZXJDYW5jZWxsZWQ7CisJdTggRXJwOworCXU4IFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLAorCSAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwl1OCBTdXBSYXRlTGVuLCBFeHRSYXRlTGVuOworCXU4IENraXBGbGFnOworCXUxNiBMZW5WSUU7CisJdTggQWlyb25ldENlbGxQb3dlckxpbWl0OworCXN0cnVjdCBydF9lZGNhX3Bhcm0gRWRjYVBhcm07CisJc3RydWN0IHJ0X3Fic3NfbG9hZF9wYXJtIFFic3NMb2FkOworCXN0cnVjdCBydF9xb3NfY2FwYWJpbGl0eV9wYXJtIFFvc0NhcGFiaWxpdHk7CisJdTE2IFN0YXR1czsKKwl1OCBWYXJJRVtNQVhfVklFX0xFTl07CS8qIFRvdGFsIFZJRSBsZW5ndGggPSBNQVhfVklFX0xFTiAtIC01ICovCisJc3RydWN0IHJ0X25kaXNfODAyXzExX3ZhcmlhYmxlX2llcyAqcFZJRSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBSYWxpbmtJZTsKKwl1bnNpZ25lZCBsb25nIElkeDsKKwlzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSBIdENhcGFiaWxpdHk7CisJc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llIEFkZEh0SW5mbzsJLyogQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFICovCisJdTggSHRDYXBhYmlsaXR5TGVuID0gMCwgUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IDA7CisJdTggQWRkSHRJbmZvTGVuOworCXU4IE5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworCXU4IENlbnRyYWxDaGFubmVsOworCUJPT0xFQU4gYkFsbG93TnJhdGUgPSBGQUxTRTsKIAotCS8vIEluaXQgVmFyaWFibGUgSUUgc3RydWN0dXJlCi0JcFZJRSA9IChQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzKSBWYXJJRTsKKwkvKiBJbml0IFZhcmlhYmxlIElFIHN0cnVjdHVyZSAqLworCXBWSUUgPSAoc3RydWN0IHJ0X25kaXNfODAyXzExX3ZhcmlhYmxlX2llcyAqKVZhcklFOwogCXBWSUUtPkxlbmd0aCA9IDA7Ci0gICAgUlRNUFplcm9NZW1vcnkoJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEh0Q2FwYWJpbGl0eSkpOwotCVJUTVBaZXJvTWVtb3J5KCZBZGRIdEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOwotCisJUlRNUFplcm9NZW1vcnkoJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEh0Q2FwYWJpbGl0eSkpOworCVJUTVBaZXJvTWVtb3J5KCZBZGRIdEluZm8sIHNpemVvZihzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUpKTsKIAogCWlmIChQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkocEFkLAotCQkJCQkJCQlFbGVtLT5Nc2csCi0JCQkJCQkJCUVsZW0tPk1zZ0xlbiwKLQkJCQkJCQkJRWxlbS0+Q2hhbm5lbCwKLQkJCQkJCQkJQWRkcjIsCi0JCQkJCQkJCUJzc2lkLAotCQkJCQkJCQlTc2lkLAotCQkJCQkJCQkmU3NpZExlbiwKLQkJCQkJCQkJJkJzc1R5cGUsCi0JCQkJCQkJCSZCZWFjb25QZXJpb2QsCi0JCQkJCQkJCSZDaGFubmVsLAotCQkJCQkJCQkmTmV3Q2hhbm5lbCwKLQkJCQkJCQkJJlRpbWVTdGFtcCwKLQkJCQkJCQkJJkNmLAotCQkJCQkJCQkmQXRpbVdpbiwKLQkJCQkJCQkJJkNhcGFiaWxpdHlJbmZvLAotCQkJCQkJCQkmRXJwLAotCQkJCQkJCQkmRHRpbUNvdW50LAotCQkJCQkJCQkmRHRpbVBlcmlvZCwKLQkJCQkJCQkJJkJjYXN0RmxhZywKLQkJCQkJCQkJJk1lc3NhZ2VUb01lLAotCQkJCQkJCQlTdXBSYXRlLAotCQkJCQkJCQkmU3VwUmF0ZUxlbiwKLQkJCQkJCQkJRXh0UmF0ZSwKLQkJCQkJCQkJJkV4dFJhdGVMZW4sCi0JCQkJCQkJCSZDa2lwRmxhZywKLQkJCQkJCQkJJkFpcm9uZXRDZWxsUG93ZXJMaW1pdCwKLQkJCQkJCQkJJkVkY2FQYXJtLAotCQkJCQkJCQkmUWJzc0xvYWQsCi0JCQkJCQkJCSZRb3NDYXBhYmlsaXR5LAotCQkJCQkJCQkmUmFsaW5rSWUsCi0JCQkJCQkJCSZIdENhcGFiaWxpdHlMZW4sCi0JCQkJCQkJCSZQcmVOSHRDYXBhYmlsaXR5TGVuLAotCQkJCQkJCQkmSHRDYXBhYmlsaXR5LAotCQkJCQkJCQkmQWRkSHRJbmZvTGVuLAotCQkJCQkJCQkmQWRkSHRJbmZvLAotCQkJCQkJCQkmTmV3RXh0Q2hhbm5lbE9mZnNldCwKLQkJCQkJCQkJJkxlblZJRSwKLQkJCQkJCQkJcFZJRSkpCi0JewotCQkvLyBEaXNxdWFsaWZ5IDExYiBvbmx5IGFkaG9jIHdoZW4gd2UgYXJlIGluIDExZyBvbmx5IGFkaG9jIG1vZGUKLQkJaWYgKChCc3NUeXBlID09IEJTU19BREhPQykgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykgJiYgKChTdXBSYXRlTGVuK0V4dFJhdGVMZW4pPCAxMikpCisJCQkJCUVsZW0tPk1zZywKKwkJCQkJRWxlbS0+TXNnTGVuLAorCQkJCQlFbGVtLT5DaGFubmVsLAorCQkJCQlBZGRyMiwKKwkJCQkJQnNzaWQsCisJCQkJCShjaGFyICopU3NpZCwKKwkJCQkJJlNzaWRMZW4sCisJCQkJCSZCc3NUeXBlLAorCQkJCQkmQmVhY29uUGVyaW9kLAorCQkJCQkmQ2hhbm5lbCwKKwkJCQkJJk5ld0NoYW5uZWwsCisJCQkJCSZUaW1lU3RhbXAsCisJCQkJCSZDZiwKKwkJCQkJJkF0aW1XaW4sCisJCQkJCSZDYXBhYmlsaXR5SW5mbywKKwkJCQkJJkVycCwKKwkJCQkJJkR0aW1Db3VudCwKKwkJCQkJJkR0aW1QZXJpb2QsCisJCQkJCSZCY2FzdEZsYWcsCisJCQkJCSZNZXNzYWdlVG9NZSwKKwkJCQkJU3VwUmF0ZSwKKwkJCQkJJlN1cFJhdGVMZW4sCisJCQkJCUV4dFJhdGUsCisJCQkJCSZFeHRSYXRlTGVuLAorCQkJCQkmQ2tpcEZsYWcsCisJCQkJCSZBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCisJCQkJCSZFZGNhUGFybSwKKwkJCQkJJlFic3NMb2FkLAorCQkJCQkmUW9zQ2FwYWJpbGl0eSwKKwkJCQkJJlJhbGlua0llLAorCQkJCQkmSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkmUHJlTkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJJkh0Q2FwYWJpbGl0eSwKKwkJCQkJJkFkZEh0SW5mb0xlbiwKKwkJCQkJJkFkZEh0SW5mbywKKwkJCQkJJk5ld0V4dENoYW5uZWxPZmZzZXQsICZMZW5WSUUsIHBWSUUpKSB7CisJCS8qIERpc3F1YWxpZnkgMTFiIG9ubHkgYWRob2Mgd2hlbiB3ZSBhcmUgaW4gMTFnIG9ubHkgYWRob2MgbW9kZSAqLworCQlpZiAoKEJzc1R5cGUgPT0gQlNTX0FESE9DKQorCQkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykKKwkJICAgICYmICgoU3VwUmF0ZUxlbiArIEV4dFJhdGVMZW4pIDwgMTIpKQogCQkJcmV0dXJuOwogCi0JCS8vIEJFQUNPTiBmcm9tIGRlc2lyZWQgQlNTL0lCU1MgZm91bmQuIFdlIHNob3VsZCBiZSBhYmxlIHRvIGRlY2lkZSBtb3N0Ci0JCS8vIEJTUyBwYXJhbWV0ZXJzIGhlcmUuCi0JCS8vIFEuIEJ1dCB3aGF0IGhhcHBlbiBpZiB0aGlzIEpPSU4gZG9lc24ndCBjb25jbHVkZSBhIHN1Y2Nlc3NmdWwgQVNTT0NJQVRFSU9OPwotCQkvLyAgICBEbyB3ZSBuZWVkIHRvIHJlY2VvdmVyIGJhY2sgYWxsIHBhcmFtZXRlcnMgYmVsb25naW5nIHRvIHByZXZpb3VzIEJTUz8KLQkJLy8gQS4gU2hvdWxkIGJlIG5vdC4gVGhlcmUncyBubyBiYWNrLWRvb3IgcmVjb3ZlciB0byBwcmV2aW91cyBBUC4gSXQgc3RpbGwgbmVlZAotCQkvLyAgICBhIG5ldyBKT0lOLUFVVEgtQVNTT0Mgc2VxdWVuY2UuCi0JCWlmIChNQUNfQUREUl9FUVVBTChwQWQtPk1sbWVBdXguQnNzaWQsIEJzc2lkKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIHJlY2VpdmUgZGVzaXJlZCBCRUFDT04gYXQgSm9pbldhaXRCZWFjb24uLi4gQ2hhbm5lbCA9ICVkXG4iLCBDaGFubmVsKSk7Ci0JCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJLyogQkVBQ09OIGZyb20gZGVzaXJlZCBCU1MvSUJTUyBmb3VuZC4gV2Ugc2hvdWxkIGJlIGFibGUgdG8gZGVjaWRlIG1vc3QgKi8KKwkJLyogQlNTIHBhcmFtZXRlcnMgaGVyZS4gKi8KKwkJLyogUS4gQnV0IHdoYXQgaGFwcGVuIGlmIHRoaXMgSk9JTiBkb2Vzbid0IGNvbmNsdWRlIGEgc3VjY2Vzc2Z1bCBBU1NPQ0lBVEVJT04/ICovCisJCS8qICAgIERvIHdlIG5lZWQgdG8gcmVjZW92ZXIgYmFjayBhbGwgcGFyYW1ldGVycyBiZWxvbmdpbmcgdG8gcHJldmlvdXMgQlNTPyAqLworCQkvKiBBLiBTaG91bGQgYmUgbm90LiBUaGVyZSdzIG5vIGJhY2stZG9vciByZWNvdmVyIHRvIHByZXZpb3VzIEFQLiBJdCBzdGlsbCBuZWVkICovCisJCS8qICAgIGEgbmV3IEpPSU4tQVVUSC1BU1NPQyBzZXF1ZW5jZS4gKi8KKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQnNzaWQpKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJTWU5DIC0gcmVjZWl2ZSBkZXNpcmVkIEJFQUNPTiBhdCBKb2luV2FpdEJlYWNvbi4uLiBDaGFubmVsID0gJWRcbiIsCisJCQkJICBDaGFubmVsKSk7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwKKwkJCQkJJlRpbWVyQ2FuY2VsbGVkKTsKIAotCQkJLy8gVXBkYXRlIFJTU0kgdG8gcHJldmVudCBObyBzaWduYWwgZGlzcGxheSB3aGVuIGNhcmRzIGZpcnN0IGluaXRpYWxpemVkCi0JCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMAk9IENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMCwgUlNTSV8wKTsKLQkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxCT0gQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kxLCBSU1NJXzEpOwotCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTIsIFJTU0lfMik7Ci0JCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwCT0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTA7Ci0JCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwWDgJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwIDw8IDM7Ci0JCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxCT0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTE7Ci0JCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxWDgJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxIDw8IDM7Ci0JCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyCT0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTI7Ci0JCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyWDgJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyIDw8IDM7CisJCQkvKiBVcGRhdGUgUlNTSSB0byBwcmV2ZW50IE5vIHNpZ25hbCBkaXNwbGF5IHdoZW4gY2FyZHMgZmlyc3QgaW5pdGlhbGl6ZWQgKi8KKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwID0KKwkJCSAgICBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTAsIFJTU0lfMCk7CisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSA9CisJCQkgICAgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kxLCBSU1NJXzEpOworCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIgPQorCQkJICAgIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMiwgUlNTSV8yKTsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAgPQorCQkJICAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwOworCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMFg4ID0KKwkJCSAgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwIDw8IDM7CisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxID0KKwkJCSAgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMTsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTFYOCA9CisJCQkgICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSA8PCAzOworCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMiA9CisJCQkgICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTI7CisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyWDggPQorCQkJICAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTIgPDwgMzsKIAotCQkJLy8KLQkJCS8vIFdlIG5lZWQgdG8gY2hlY2sgaWYgU1NJRCBvbmx5IHNldCB0byBhbnksIHRoZW4gd2UgY2FuIHJlY29yZCB0aGUgY3VycmVudCBTU0lELgotCQkJLy8gT3RoZXJ3aXNlIHdpbGwgY2F1c2UgaGlkZGVuIFNTSUQgYXNzb2NpYXRpb24gZmFpbGVkLgotCQkJLy8KLQkJCWlmIChwQWQtPk1sbWVBdXguU3NpZExlbiA9PSAwKQotCQkJewotCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKKwkJCS8qICovCisJCQkvKiBXZSBuZWVkIHRvIGNoZWNrIGlmIFNTSUQgb25seSBzZXQgdG8gYW55LCB0aGVuIHdlIGNhbiByZWNvcmQgdGhlIGN1cnJlbnQgU1NJRC4gKi8KKwkJCS8qIE90aGVyd2lzZSB3aWxsIGNhdXNlIGhpZGRlbiBTU0lEIGFzc29jaWF0aW9uIGZhaWxlZC4gKi8KKwkJCS8qICovCisJCQlpZiAocEFkLT5NbG1lQXV4LlNzaWRMZW4gPT0gMCkgeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBTc2lkLAorCQkJCQkgICAgICAgU3NpZExlbik7CiAJCQkJcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBTc2lkTGVuOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCUlkeCA9IEJzc1NzaWRUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBCc3NpZCwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCBDaGFubmVsKTsKKwkJCX0gZWxzZSB7CisJCQkJSWR4ID0KKwkJCQkgICAgQnNzU3NpZFRhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIEJzc2lkLAorCQkJCQkJICAgICAgIHBBZC0+TWxtZUF1eC5Tc2lkLAorCQkJCQkJICAgICAgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLAorCQkJCQkJICAgICAgIENoYW5uZWwpOwogCi0JCQkJaWYgKElkeCAhPSBCU1NfTk9UX0ZPVU5EKQotCQkJCXsKLQkJCQkJLy8KLQkJCQkJLy8gTXVsdGlwbGUgU1NJRCBjYXNlLCB1c2VkIGNvcnJlY3QgQ2FwYWJpbGl0eUluZm8KLQkJCQkJLy8KLQkJCQkJQ2FwYWJpbGl0eUluZm8gPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5DYXBhYmlsaXR5SW5mbzsKKwkJCQlpZiAoSWR4ID09IEJTU19OT1RfRk9VTkQpIHsKKwkJCQkJY2hhciBSc3NpID0gMDsKKwkJCQkJUnNzaSA9CisJCQkJCSAgICBSVE1QTWF4UnNzaShwQWQsCisJCQkJCQkJQ29udmVydFRvUnNzaShwQWQsCisJCQkJCQkJCSAgICAgIEVsZW0tPgorCQkJCQkJCQkgICAgICBSc3NpMCwKKwkJCQkJCQkJICAgICAgUlNTSV8wKSwKKwkJCQkJCQlDb252ZXJ0VG9Sc3NpKHBBZCwKKwkJCQkJCQkJICAgICAgRWxlbS0+CisJCQkJCQkJCSAgICAgIFJzc2kxLAorCQkJCQkJCQkgICAgICBSU1NJXzEpLAorCQkJCQkJCUNvbnZlcnRUb1Jzc2kocEFkLAorCQkJCQkJCQkgICAgICBFbGVtLT4KKwkJCQkJCQkJICAgICAgUnNzaTIsCisJCQkJCQkJCSAgICAgIFJTU0lfMikpOworCQkJCQlJZHggPQorCQkJCQkgICAgQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlNjYW5UYWIsCisJCQkJCQkJICAgICBCc3NpZCwKKwkJCQkJCQkgICAgIChjaGFyICopIFNzaWQsCisJCQkJCQkJICAgICBTc2lkTGVuLCBCc3NUeXBlLAorCQkJCQkJCSAgICAgQmVhY29uUGVyaW9kLCAmQ2YsCisJCQkJCQkJICAgICBBdGltV2luLAorCQkJCQkJCSAgICAgQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkJICAgICBTdXBSYXRlLAorCQkJCQkJCSAgICAgU3VwUmF0ZUxlbiwKKwkJCQkJCQkgICAgIEV4dFJhdGUsCisJCQkJCQkJICAgICBFeHRSYXRlTGVuLAorCQkJCQkJCSAgICAgJkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkgICAgICZBZGRIdEluZm8sCisJCQkJCQkJICAgICBIdENhcGFiaWxpdHlMZW4sCisJCQkJCQkJICAgICBBZGRIdEluZm9MZW4sCisJCQkJCQkJICAgICBOZXdFeHRDaGFubmVsT2Zmc2V0LAorCQkJCQkJCSAgICAgQ2hhbm5lbCwgUnNzaSwKKwkJCQkJCQkgICAgIFRpbWVTdGFtcCwKKwkJCQkJCQkgICAgIENraXBGbGFnLAorCQkJCQkJCSAgICAgJkVkY2FQYXJtLAorCQkJCQkJCSAgICAgJlFvc0NhcGFiaWxpdHksCisJCQkJCQkJICAgICAmUWJzc0xvYWQsIExlblZJRSwKKwkJCQkJCQkgICAgIHBWSUUpOworCQkJCQlpZiAoSWR4ICE9IEJTU19OT1RfRk9VTkQpIHsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2NhblRhYi4KKwkJCQkJCQkgICAgICAgQnNzRW50cnlbSWR4XS4KKwkJCQkJCQkgICAgICAgUFRTRiwKKwkJCQkJCQkgICAgICAgJkVsZW0tPk1zZ1syNF0sCisJCQkJCQkJICAgICAgIDQpOworCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi4KKwkJCQkJCQkgICAgICAgQnNzRW50cnlbSWR4XS4KKwkJCQkJCQkgICAgICAgVFRTRlswXSwKKwkJCQkJCQkgICAgICAgJkVsZW0tPlRpbWVTdGFtcC4KKwkJCQkJCQkgICAgICAgdS5Mb3dQYXJ0LCA0KTsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuCisJCQkJCQkJICAgICAgIEJzc0VudHJ5W0lkeF0uCisJCQkJCQkJICAgICAgIFRUU0ZbNF0sCisJCQkJCQkJICAgICAgICZFbGVtLT5UaW1lU3RhbXAuCisJCQkJCQkJICAgICAgIHUuTG93UGFydCwgNCk7CisJCQkJCQlDYXBhYmlsaXR5SW5mbyA9CisJCQkJCQkgICAgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uCisJCQkJCQkgICAgQ2FwYWJpbGl0eUluZm87CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQkvKiAqLworCQkJCQkvKiBNdWx0aXBsZSBTU0lEIGNhc2UsIHVzZWQgY29ycmVjdCBDYXBhYmlsaXR5SW5mbyAqLworCQkJCQkvKiAqLworCQkJCQlDYXBhYmlsaXR5SW5mbyA9CisJCQkJCSAgICBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS4KKwkJCQkJICAgIENhcGFiaWxpdHlJbmZvOwogCQkJCX0KIAkJCX0KIAkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Cc3NpZCwgQnNzaWQsIE1BQ19BRERSX0xFTik7Ci0JCQlwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8gPSBDYXBhYmlsaXR5SW5mbyAmIFNVUFBPUlRFRF9DQVBBQklMSVRZX0lORk87CisJCQlwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8gPQorCQkJICAgIENhcGFiaWxpdHlJbmZvICYgU1VQUE9SVEVEX0NBUEFCSUxJVFlfSU5GTzsKIAkJCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gQnNzVHlwZTsKIAkJCXBBZC0+TWxtZUF1eC5CZWFjb25QZXJpb2QgPSBCZWFjb25QZXJpb2Q7CiAJCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IENoYW5uZWw7CkBAIC04MzYsMTA3ICs4NzcsMTU5IEBACiAJCQlwQWQtPk1sbWVBdXguQ2ZwTWF4RHVyYXRpb24gPSBDZi5DZnBNYXhEdXJhdGlvbjsKIAkJCXBBZC0+TWxtZUF1eC5BUFJhbGlua0llID0gUmFsaW5rSWU7CiAKLQkJCS8vIENvcHkgQVAncyBzdXBwb3J0ZWQgcmF0ZSB0byBNbG1lQXV4IGZvciBjcmVhdGluZyBhc3NvaWNhdGlvbiByZXF1ZXN0Ci0JCQkvLyBBbHNvIGZpbHRlciBvdXQgbm90IHN1cHBvcnRlZCByYXRlCisJCQkvKiBDb3B5IEFQJ3Mgc3VwcG9ydGVkIHJhdGUgdG8gTWxtZUF1eCBmb3IgY3JlYXRpbmcgYXNzb2ljYXRpb24gcmVxdWVzdCAqLworCQkJLyogQWxzbyBmaWx0ZXIgb3V0IG5vdCBzdXBwb3J0ZWQgcmF0ZSAqLwogCQkJcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4gPSBTdXBSYXRlTGVuOwotCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlN1cFJhdGUsIFN1cFJhdGUsIFN1cFJhdGVMZW4pOwotCQkJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguU3VwUmF0ZSwgJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5TdXBSYXRlLCBTdXBSYXRlLAorCQkJCSAgICAgICBTdXBSYXRlTGVuKTsKKwkJCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LlN1cFJhdGUsCisJCQkJICAgICAgICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbik7CiAJCQlwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiA9IEV4dFJhdGVMZW47Ci0JCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguRXh0UmF0ZSwgRXh0UmF0ZSwgRXh0UmF0ZUxlbik7Ci0JCQlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5FeHRSYXRlLCAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pOworCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkV4dFJhdGUsIEV4dFJhdGUsCisJCQkJICAgICAgIEV4dFJhdGVMZW4pOworCQkJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguRXh0UmF0ZSwKKwkJCQkgICAgICAgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKTsKIAotICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXQsIDE2KTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0LAorCQkJCSAgICAgICAxNik7CisKKwkJCWlmICgoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBOZGlzODAyXzExV0VQRW5hYmxlZCkKKwkJCSAgICAgJiYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPQorCQkJCSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSkKKwkJCSAgICB8fCAocEFkLT5Db21tb25DZmcuSFRfRGlzYWxsb3dUS0lQID09IEZBTFNFKSkgeworCQkJCWJBbGxvd05yYXRlID0gVFJVRTsKKwkJCX0KIAogCQkJcEFkLT5NbG1lQXV4Lk5ld0V4dENoYW5uZWxPZmZzZXQgPSBOZXdFeHRDaGFubmVsT2Zmc2V0OwogCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA9IEh0Q2FwYWJpbGl0eUxlbjsKIAotCQkJLy8gZmlsdGVyIG91dCB1bi1zdXBwb3J0ZWQgaHQgcmF0ZXMKLQkJCWlmICgoKEh0Q2FwYWJpbGl0eUxlbiA+IDApIHx8IChQcmVOSHRDYXBhYmlsaXR5TGVuID4gMCkpICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQotCQkJewotCQkJCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCBTSVpFX0hUX0NBUF9JRSk7Ci0gICAJCQkJUlRNUE1vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sICZBZGRIdEluZm8sIFNJWkVfQUREX0hUX0lORk9fSUUpOworCQkJUlRNUFplcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCisJCQkJICAgICAgIFNJWkVfSFRfQ0FQX0lFKTsKKwkJCS8qIGZpbHRlciBvdXQgdW4tc3VwcG9ydGVkIGh0IHJhdGVzICovCisJCQlpZiAoKChIdENhcGFiaWxpdHlMZW4gPiAwKSB8fCAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA+IDApKQorCQkJICAgICYmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQorCQkJCSYmIChiQWxsb3dOcmF0ZSkpKSB7CisJCQkJUlRNUE1vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sCisJCQkJCSAgICAgICAmQWRkSHRJbmZvLCBTSVpFX0FERF9IVF9JTkZPX0lFKTsKIAotCQkJCS8vIFN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5NQ1NTZXQgc3RvcmVzIFBlZXIgQVAncyAxMW4gUnggY2FwYWJpbGl0eQotCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0LCBIdENhcGFiaWxpdHkuTUNTU2V0LCAxNik7Ci0JCQkJcEFkLT5NbG1lQXV4Lk5ld0V4dENoYW5uZWxPZmZzZXQgPSBOZXdFeHRDaGFubmVsT2Zmc2V0OworCQkJCS8qIFN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5NQ1NTZXQgc3RvcmVzIFBlZXIgQVAncyAxMW4gUnggY2FwYWJpbGl0eSAqLworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uCisJCQkJCSAgICAgICBNQ1NTZXQsIEh0Q2FwYWJpbGl0eS5NQ1NTZXQsIDE2KTsKKwkJCQlwQWQtPk1sbWVBdXguTmV3RXh0Q2hhbm5lbE9mZnNldCA9CisJCQkJICAgIE5ld0V4dENoYW5uZWxPZmZzZXQ7CiAJCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOwotCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gVFJVRTsKKwkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9CisJCQkJICAgIFRSVUU7CiAJCQkJaWYgKFByZU5IdENhcGFiaWxpdHlMZW4gPiAwKQotCQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJQcmVOSHQgPSBUUlVFOwotCQkJCVJUTVBDaGVja0h0KHBBZCwgQlNTSURfV0NJRCwgJkh0Q2FwYWJpbGl0eSwgJkFkZEh0SW5mbyk7Ci0JCQkJLy8gQ29weSBBUCBQYXJhbWV0ZXIgdG8gU3RhQWN0aXZlLiAgVGhpcyBpcyBhbHNvIGluIExpbmtVcC4KLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQXRKb2luQWN0aW9uISAoTXBkdURlbnNpdHk9JWQsIE1heFJBbXBkdUZhY3Rvcj0lZCwgQlc9JWQpXG4iLAotCQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5NcGR1RGVuc2l0eSwgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuTWF4UkFtcGR1RmFjdG9yLCBIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCkpOworCQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLgorCQkJCQkgICAgYlByZU5IdCA9IFRSVUU7CisJCQkJUlRNUENoZWNrSHQocEFkLCBCU1NJRF9XQ0lELCAmSHRDYXBhYmlsaXR5LAorCQkJCQkgICAgJkFkZEh0SW5mbyk7CisJCQkJLyogQ29weSBBUCBQYXJhbWV0ZXIgdG8gU3RhQWN0aXZlLiAgVGhpcyBpcyBhbHNvIGluIExpbmtVcC4gKi8KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiUGVlckJlYWNvbkF0Sm9pbkFjdGlvbiEgKE1wZHVEZW5zaXR5PSVkLCBNYXhSQW1wZHVGYWN0b3I9JWQsIEJXPSVkKVxuIiwKKwkJCQkJICBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS4KKwkJCQkJICBNcGR1RGVuc2l0eSwKKwkJCQkJICBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS4KKwkJCQkJICBNYXhSQW1wZHVGYWN0b3IsCisJCQkJCSAgSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGgpKTsKIAotCQkJCWlmIChBZGRIdEluZm9MZW4gPiAwKQotCQkJCXsKKwkJCQlpZiAoQWRkSHRJbmZvTGVuID4gMCkgewogCQkJCQlDZW50cmFsQ2hhbm5lbCA9IEFkZEh0SW5mby5Db250cm9sQ2hhbjsKLQkJIAkJCS8vIENoZWNrIGFnYWluIHRoZSBCYW5kd2lkdGggY2FwYWJpbGl0eSBvZiB0aGlzIEFQLgotCQkgCQkJaWYgKChBZGRIdEluZm8uQ29udHJvbENoYW4gPiAyKSYmIChBZGRIdEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKSAmJiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQotCQkgCQkJewotCQkgCQkJCUNlbnRyYWxDaGFubmVsID0gQWRkSHRJbmZvLkNvbnRyb2xDaGFuIC0gMjsKLQkJIAkJCX0KLQkJIAkJCWVsc2UgaWYgKChBZGRIdEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0FCT1ZFKSAmJiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQotCQkgCQkJewotCQkgCQkJCUNlbnRyYWxDaGFubmVsID0gQWRkSHRJbmZvLkNvbnRyb2xDaGFuICsgMjsKLQkJIAkJCX0KKwkJCQkJLyogQ2hlY2sgYWdhaW4gdGhlIEJhbmR3aWR0aCBjYXBhYmlsaXR5IG9mIHRoaXMgQVAuICovCisJCQkJCWlmICgoQWRkSHRJbmZvLkNvbnRyb2xDaGFuID4gMikKKwkJCQkJICAgICYmIChBZGRIdEluZm8uQWRkSHRJbmZvLgorCQkJCQkJRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQkVMT1cpCisJCQkJCSAgICAmJiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby4KKwkJCQkJCUNoYW5uZWxXaWR0aCA9PSBCV180MCkpIHsKKwkJCQkJCUNlbnRyYWxDaGFubmVsID0KKwkJCQkJCSAgICBBZGRIdEluZm8uQ29udHJvbENoYW4gLSAyOworCQkJCQl9IGVsc2UKKwkJCQkJICAgIGlmICgoQWRkSHRJbmZvLkFkZEh0SW5mby4KKwkJCQkJCSBFeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9BQk9WRSkKKwkJCQkJCSYmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLgorCQkJCQkJICAgIENoYW5uZWxXaWR0aCA9PSBCV180MCkpIHsKKwkJCQkJCUNlbnRyYWxDaGFubmVsID0KKwkJCQkJCSAgICBBZGRIdEluZm8uQ29udHJvbENoYW4gKyAyOworCQkJCQl9CisJCQkJCS8qIENoZWNrIEVycm9yIC4gKi8KKwkJCQkJaWYgKHBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCAhPQorCQkJCQkgICAgQ2VudHJhbENoYW5uZWwpCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJCQkgKCJQZWVyQmVhY29uQXRKb2luQWN0aW9uIEhUPT09PkJlYWNvbiBDZW50cmFsIENoYW5uZWwgPSAlZCwgQ29udHJvbCBDaGFubmVsID0gJWQuIE1sbWVhdXggQ2VudHJhbENoYW5uZWwgPSAlZFxuIiwKKwkJCQkJCQkgIENlbnRyYWxDaGFubmVsLAorCQkJCQkJCSAgQWRkSHRJbmZvLkNvbnRyb2xDaGFuLAorCQkJCQkJCSAgcEFkLT5NbG1lQXV4LgorCQkJCQkJCSAgQ2VudHJhbENoYW5uZWwpKTsKIAotCQkJCQkvLyBDaGVjayBFcnJvciAuCi0JCQkJCWlmIChwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgIT0gQ2VudHJhbENoYW5uZWwpCi0JCSAJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUGVlckJlYWNvbkF0Sm9pbkFjdGlvbiBIVD09PT5CZWFjb24gQ2VudHJhbCBDaGFubmVsID0gJWQsIENvbnRyb2wgQ2hhbm5lbCA9ICVkLiBNbG1lYXV4IENlbnRyYWxDaGFubmVsID0gJWRcbiIsIENlbnRyYWxDaGFubmVsLCBBZGRIdEluZm8uQ29udHJvbENoYW4sIHBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCkpOwotCi0JCSAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQXRKb2luQWN0aW9uIEhUPT09PkNlbnRyYWwgQ2hhbm5lbCA9ICVkLCBDb250cm9sIENoYW5uZWwgPSAlZCwgIC5cbiIsIENlbnRyYWxDaGFubmVsLCBBZGRIdEluZm8uQ29udHJvbENoYW4pKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgKCJQZWVyQmVhY29uQXRKb2luQWN0aW9uIEhUPT09PkNlbnRyYWwgQ2hhbm5lbCA9ICVkLCBDb250cm9sIENoYW5uZWwgPSAlZCwgIC5cbiIsCisJCQkJCQkgIENlbnRyYWxDaGFubmVsLAorCQkJCQkJICBBZGRIdEluZm8uQ29udHJvbENoYW4pKTsKIAogCQkJCX0KIAotCQkJfQotCQkJZWxzZQotCQkJewotICAgCQkJCS8vIFRvIHByZXZlbnQgZXJyb3IsIGxldCBsZWdhY3kgQVAgbXVzdCBoYXZlIHNhbWUgQ2VudHJhbENoYW5uZWwgYW5kIENoYW5uZWwuCi0JCQkJaWYgKChIdENhcGFiaWxpdHlMZW4gPT0gMCkgJiYgKFByZU5IdENhcGFiaWxpdHlMZW4gPT0gMCkpCi0JCQkJCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+TWxtZUF1eC5DaGFubmVsOworCQkJfSBlbHNlIHsKKwkJCQkvKiBUbyBwcmV2ZW50IGVycm9yLCBsZXQgbGVnYWN5IEFQIG11c3QgaGF2ZSBzYW1lIENlbnRyYWxDaGFubmVsIGFuZCBDaGFubmVsLiAqLworCQkJCWlmICgoSHRDYXBhYmlsaXR5TGVuID09IDApCisJCQkJICAgICYmIChQcmVOSHRDYXBhYmlsaXR5TGVuID09IDApKQorCQkJCQlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgPQorCQkJCQkgICAgcEFkLT5NbG1lQXV4LkNoYW5uZWw7CiAKLQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IEZBTFNFOwotCQkJCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCBTSVpFX0hUX0NBUF9JRSk7Ci0JCQkJUlRNUFplcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sIFNJWkVfQUREX0hUX0lORk9fSUUpOworCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0KKwkJCQkgICAgRkFMU0U7CisJCQkJcEFkLT5NbG1lQXV4Lk5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworCQkJCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAorCQkJCQkgICAgICAgU0laRV9IVF9DQVBfSUUpOworCQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSAwOworCQkJCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQWRkSHRJbmZvLAorCQkJCQkgICAgICAgU0laRV9BRERfSFRfSU5GT19JRSk7CiAJCQl9CiAKIAkJCVJUTVBVcGRhdGVNbG1lUmF0ZShwQWQpOwogCi0JCQkvLyBjb3B5IFFPUyByZWxhdGVkIGluZm9ybWF0aW9uCisJCQkvKiBjb3B5IFFPUyByZWxhdGVkIGluZm9ybWF0aW9uICovCiAJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKQotCQkJCSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQotCQkJCSkKLQkJCXsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sICZFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRYnNzTG9hZCwgJlFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUW9zQ2FwYWJpbGl0eSwgJlFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7Ci0JCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTsKLQkJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTsKKwkJCSAgICB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQorCQkJICAgICkgeworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBFZGNhUGFybSwKKwkJCQkJICAgICAgICZFZGNhUGFybSwgc2l6ZW9mKHN0cnVjdCBydF9lZGNhX3Bhcm0pKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUWJzc0xvYWQsCisJCQkJCSAgICAgICAmUWJzc0xvYWQsCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X3Fic3NfbG9hZF9wYXJtKSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFvc0NhcGFiaWxpdHksCisJCQkJCSAgICAgICAmUW9zQ2FwYWJpbGl0eSwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfcW9zX2NhcGFiaWxpdHlfcGFybSkpOworCQkJfSBlbHNlIHsKKwkJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2VkY2FfcGFybSkpOworCQkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRYnNzTG9hZCwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfcWJzc19sb2FkX3Bhcm0pKTsKKwkJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUW9zQ2FwYWJpbGl0eSwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfcW9zX2NhcGFiaWxpdHlfcGFybSkpOwogCQkJfQogCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gYWZ0ZXIgSk9JTiwgU3VwUmF0ZUxlbj0lZCwgRXh0UmF0ZUxlbj0lZFxuIiwKLQkJCQkJCQkJCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlNZTkMgLSBhZnRlciBKT0lOLCBTdXBSYXRlTGVuPSVkLCBFeHRSYXRlTGVuPSVkXG4iLAorCQkJCSAgcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCisJCQkJICBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbikpOwogCi0JCQlpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0ICE9IDB4RkYpCi0JCQl7Ci0JCQkJLy9XZSBuZWVkIHRvIGNoYW5nZSBvdXIgVHhQb3dlciBmb3IgQ0NYIDIuMCBBUCBDb250cm9sIG9mIENsaWVudCBUcmFuc21pdCBQb3dlcgotCQkJCUNoYW5nZVRvQ2VsbFBvd2VyTGltaXQocEFkLCBBaXJvbmV0Q2VsbFBvd2VyTGltaXQpOwotCQkJfQotCQkJZWxzZSAgLy9Vc2VkIHRoZSBkZWZhdWx0IFRYIFBvd2VyIFBlcmNlbnRhZ2UuCi0JCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdDsKKwkJCWlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgIT0gMHhGRikgeworCQkJCS8qV2UgbmVlZCB0byBjaGFuZ2Ugb3VyIFR4UG93ZXIgZm9yIENDWCAyLjAgQVAgQ29udHJvbCBvZiBDbGllbnQgVHJhbnNtaXQgUG93ZXIgKi8KKwkJCQlDaGFuZ2VUb0NlbGxQb3dlckxpbWl0KHBBZCwKKwkJCQkJCSAgICAgICBBaXJvbmV0Q2VsbFBvd2VyTGltaXQpOworCQkJfSBlbHNlCS8qVXNlZCB0aGUgZGVmYXVsdCBUWCBQb3dlciBQZXJjZW50YWdlLiAqLworCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0KKwkJCQkgICAgcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7CiAKIAkJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CiAJCQlTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfSk9JTl9DT05GLCAyLCAmU3RhdHVzKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9KT0lOX0NPTkYsCisJCQkJICAgIDIsICZTdGF0dXMpOwogCQl9Ci0JCS8vIG5vdCB0byBtZSBCRUFDT04sIGlnbm9yZWQKKwkJLyogbm90IHRvIG1lIEJFQUNPTiwgaWdub3JlZCAqLwogCX0KLQkvLyBzYW5pdHkgY2hlY2sgZmFpbCwgaWdub3JlIHRoaXMgZnJhbWUKKwkvKiBzYW5pdHkgY2hlY2sgZmFpbCwgaWdub3JlIHRoaXMgZnJhbWUgKi8KIH0KIAogLyoKQEAgLTk0OCw2NjIgKzEwNDEsNjYwIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIFBlZXJCZWFjb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBQZWVyQmVhY29uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVQ0hBUiAgICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl0sIEFkZHIyW01BQ19BRERSX0xFTl07Ci0JQ0hBUiAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07Ci0JQ0ZfUEFSTSAgICAgICBDZlBhcm07Ci0JVUNIQVIgICAgICAgICBTc2lkTGVuLCBNZXNzYWdlVG9NZT0wLCBCc3NUeXBlLCBDaGFubmVsLCBOZXdDaGFubmVsLCBpbmRleD0wOwotCVVDSEFSICAgICAgICAgRHRpbUNvdW50PTAsIER0aW1QZXJpb2Q9MCwgQmNhc3RGbGFnPTA7Ci0JVVNIT1JUICAgICAgICBDYXBhYmlsaXR5SW5mbywgQXRpbVdpbiwgQmVhY29uUGVyaW9kOworCXU4IEJzc2lkW01BQ19BRERSX0xFTl0sIEFkZHIyW01BQ19BRERSX0xFTl07CisJY2hhciBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisJc3RydWN0IHJ0X2NmX3Bhcm0gQ2ZQYXJtOworCXU4IFNzaWRMZW4sIE1lc3NhZ2VUb01lID0gMCwgQnNzVHlwZSwgQ2hhbm5lbCwgTmV3Q2hhbm5lbCwgaW5kZXggPSAwOworCXU4IER0aW1Db3VudCA9IDAsIER0aW1QZXJpb2QgPSAwLCBCY2FzdEZsYWcgPSAwOworCXUxNiBDYXBhYmlsaXR5SW5mbywgQXRpbVdpbiwgQmVhY29uUGVyaW9kOwogCUxBUkdFX0lOVEVHRVIgVGltZVN0YW1wOwotCVVTSE9SVCAgICAgICAgVGJ0dE51bVRvTmV4dFdha2VVcDsKLQlVQ0hBUiAgICAgICAgIEVycDsKLQlVQ0hBUiAgICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUgkJICBTdXBSYXRlTGVuLCBFeHRSYXRlTGVuOwotCVVDSEFSCQkgIENraXBGbGFnOwotCVVTSE9SVCAgICAgICAgTGVuVklFOwotCVVDSEFSCQkgIEFpcm9uZXRDZWxsUG93ZXJMaW1pdDsKLQlFRENBX1BBUk0gICAgICAgRWRjYVBhcm07Ci0JUUJTU19MT0FEX1BBUk0gIFFic3NMb2FkOwotCVFPU19DQVBBQklMSVRZX1BBUk0gUW9zQ2FwYWJpbGl0eTsKLQlVTE9ORyAgICAgICAgICAgUmFsaW5rSWU7Ci0JLy8gTmV3IGZvciBXUEEgc2VjdXJpdHkgc3VpdGVzCi0JVUNIQVIJCQkJCQlWYXJJRVtNQVhfVklFX0xFTl07CQkvLyBUb3RhbCBWSUUgbGVuZ3RoID0gTUFYX1ZJRV9MRU4gLSAtNQotCU5ESVNfODAyXzExX1ZBUklBQkxFX0lFcwkqcFZJRSA9IE5VTEw7Ci0JSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OwotCUFERF9IVF9JTkZPX0lFCQlBZGRIdEluZm87CS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotCVVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLCBQcmVOSHRDYXBhYmlsaXR5TGVuOwotCVVDSEFSCQkJQWRkSHRJbmZvTGVuOwotCVVDSEFSCQkJTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CisJdTE2IFRidHROdW1Ub05leHRXYWtlVXA7CisJdTggRXJwOworCXU4IFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLAorCSAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwl1OCBTdXBSYXRlTGVuLCBFeHRSYXRlTGVuOworCXU4IENraXBGbGFnOworCXUxNiBMZW5WSUU7CisJdTggQWlyb25ldENlbGxQb3dlckxpbWl0OworCXN0cnVjdCBydF9lZGNhX3Bhcm0gRWRjYVBhcm07CisJc3RydWN0IHJ0X3Fic3NfbG9hZF9wYXJtIFFic3NMb2FkOworCXN0cnVjdCBydF9xb3NfY2FwYWJpbGl0eV9wYXJtIFFvc0NhcGFiaWxpdHk7CisJdW5zaWduZWQgbG9uZyBSYWxpbmtJZTsKKwkvKiBOZXcgZm9yIFdQQSBzZWN1cml0eSBzdWl0ZXMgKi8KKwl1OCBWYXJJRVtNQVhfVklFX0xFTl07CS8qIFRvdGFsIFZJRSBsZW5ndGggPSBNQVhfVklFX0xFTiAtIC01ICovCisJc3RydWN0IHJ0X25kaXNfODAyXzExX3ZhcmlhYmxlX2llcyAqcFZJRSA9IE5VTEw7CisJc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHlfaWUgSHRDYXBhYmlsaXR5OworCXN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSBBZGRIdEluZm87CS8qIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRSAqLworCXU4IEh0Q2FwYWJpbGl0eUxlbiwgUHJlTkh0Q2FwYWJpbGl0eUxlbjsKKwl1OCBBZGRIdEluZm9MZW47CisJdTggTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CiAKIAlpZiAoIShJTkZSQV9PTihwQWQpIHx8IEFESE9DX09OKHBBZCkKLQkJKSkKKwkgICAgKSkKIAkJcmV0dXJuOwogCi0JLy8gSW5pdCBWYXJpYWJsZSBJRSBzdHJ1Y3R1cmUKLQlwVklFID0gKFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMpIFZhcklFOworCS8qIEluaXQgVmFyaWFibGUgSUUgc3RydWN0dXJlICovCisJcFZJRSA9IChzdHJ1Y3QgcnRfbmRpc184MDJfMTFfdmFyaWFibGVfaWVzICopVmFySUU7CiAJcFZJRS0+TGVuZ3RoID0gMDsKLSAgICBSVE1QWmVyb01lbW9yeSgmSHRDYXBhYmlsaXR5LCBzaXplb2YoSHRDYXBhYmlsaXR5KSk7Ci0JUlRNUFplcm9NZW1vcnkoJkFkZEh0SW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisJUlRNUFplcm9NZW1vcnkoJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEh0Q2FwYWJpbGl0eSkpOworCVJUTVBaZXJvTWVtb3J5KCZBZGRIdEluZm8sIHNpemVvZihzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUpKTsKIAogCWlmIChQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkocEFkLAotCQkJCQkJCQlFbGVtLT5Nc2csCi0JCQkJCQkJCUVsZW0tPk1zZ0xlbiwKLQkJCQkJCQkJRWxlbS0+Q2hhbm5lbCwKLQkJCQkJCQkJQWRkcjIsCi0JCQkJCQkJCUJzc2lkLAotCQkJCQkJCQlTc2lkLAotCQkJCQkJCQkmU3NpZExlbiwKLQkJCQkJCQkJJkJzc1R5cGUsCi0JCQkJCQkJCSZCZWFjb25QZXJpb2QsCi0JCQkJCQkJCSZDaGFubmVsLAotCQkJCQkJCQkmTmV3Q2hhbm5lbCwKLQkJCQkJCQkJJlRpbWVTdGFtcCwKLQkJCQkJCQkJJkNmUGFybSwKLQkJCQkJCQkJJkF0aW1XaW4sCi0JCQkJCQkJCSZDYXBhYmlsaXR5SW5mbywKLQkJCQkJCQkJJkVycCwKLQkJCQkJCQkJJkR0aW1Db3VudCwKLQkJCQkJCQkJJkR0aW1QZXJpb2QsCi0JCQkJCQkJCSZCY2FzdEZsYWcsCi0JCQkJCQkJCSZNZXNzYWdlVG9NZSwKLQkJCQkJCQkJU3VwUmF0ZSwKLQkJCQkJCQkJJlN1cFJhdGVMZW4sCi0JCQkJCQkJCUV4dFJhdGUsCi0JCQkJCQkJCSZFeHRSYXRlTGVuLAotCQkJCQkJCQkmQ2tpcEZsYWcsCi0JCQkJCQkJCSZBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCi0JCQkJCQkJCSZFZGNhUGFybSwKLQkJCQkJCQkJJlFic3NMb2FkLAotCQkJCQkJCQkmUW9zQ2FwYWJpbGl0eSwKLQkJCQkJCQkJJlJhbGlua0llLAotCQkJCQkJCQkmSHRDYXBhYmlsaXR5TGVuLAotCQkJCQkJCQkmUHJlTkh0Q2FwYWJpbGl0eUxlbiwKLQkJCQkJCQkJJkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkJJkFkZEh0SW5mb0xlbiwKLQkJCQkJCQkJJkFkZEh0SW5mbywKLQkJCQkJCQkJJk5ld0V4dENoYW5uZWxPZmZzZXQsCi0JCQkJCQkJCSZMZW5WSUUsCi0JCQkJCQkJCXBWSUUpKQotCXsKKwkJCQkJRWxlbS0+TXNnLAorCQkJCQlFbGVtLT5Nc2dMZW4sCisJCQkJCUVsZW0tPkNoYW5uZWwsCisJCQkJCUFkZHIyLAorCQkJCQlCc3NpZCwKKwkJCQkJU3NpZCwKKwkJCQkJJlNzaWRMZW4sCisJCQkJCSZCc3NUeXBlLAorCQkJCQkmQmVhY29uUGVyaW9kLAorCQkJCQkmQ2hhbm5lbCwKKwkJCQkJJk5ld0NoYW5uZWwsCisJCQkJCSZUaW1lU3RhbXAsCisJCQkJCSZDZlBhcm0sCisJCQkJCSZBdGltV2luLAorCQkJCQkmQ2FwYWJpbGl0eUluZm8sCisJCQkJCSZFcnAsCisJCQkJCSZEdGltQ291bnQsCisJCQkJCSZEdGltUGVyaW9kLAorCQkJCQkmQmNhc3RGbGFnLAorCQkJCQkmTWVzc2FnZVRvTWUsCisJCQkJCVN1cFJhdGUsCisJCQkJCSZTdXBSYXRlTGVuLAorCQkJCQlFeHRSYXRlLAorCQkJCQkmRXh0UmF0ZUxlbiwKKwkJCQkJJkNraXBGbGFnLAorCQkJCQkmQWlyb25ldENlbGxQb3dlckxpbWl0LAorCQkJCQkmRWRjYVBhcm0sCisJCQkJCSZRYnNzTG9hZCwKKwkJCQkJJlFvc0NhcGFiaWxpdHksCisJCQkJCSZSYWxpbmtJZSwKKwkJCQkJJkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJJlByZU5IdENhcGFiaWxpdHlMZW4sCisJCQkJCSZIdENhcGFiaWxpdHksCisJCQkJCSZBZGRIdEluZm9MZW4sCisJCQkJCSZBZGRIdEluZm8sCisJCQkJCSZOZXdFeHRDaGFubmVsT2Zmc2V0LCAmTGVuVklFLCBwVklFKSkgewogCQlCT09MRUFOIGlzX215X2Jzc2lkLCBpc19teV9zc2lkOwotCQlVTE9ORyAgIEJzc2lkeCwgTm93OwotCQlCU1NfRU5UUlkgKnBCc3M7Ci0JCUNIQVIJCVJlYWxSc3NpID0gUlRNUE1heFJzc2kocEFkLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTAsIFJTU0lfMCksIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMSwgUlNTSV8xKSwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kyLCBSU1NJXzIpKTsKKwkJdW5zaWduZWQgbG9uZyBCc3NpZHgsIE5vdzsKKwkJc3RydWN0IHJ0X2Jzc19lbnRyeSAqcEJzczsKKwkJY2hhciBSZWFsUnNzaSA9CisJCSAgICBSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMCwgUlNTSV8wKSwKKwkJCQlDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTEsIFJTU0lfMSksCisJCQkJQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kyLCBSU1NJXzIpKTsKIAotCQlpc19teV9ic3NpZCA9IE1BQ19BRERSX0VRVUFMKEJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk/IFRSVUUgOiBGQUxTRTsKLQkJaXNfbXlfc3NpZCA9IFNTSURfRVFVQUwoU3NpZCwgU3NpZExlbiwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbik/IFRSVUU6RkFMU0U7CisJCWlzX215X2Jzc2lkID0KKwkJICAgIE1BQ19BRERSX0VRVUFMKEJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCkgPyBUUlVFIDogRkFMU0U7CisJCWlzX215X3NzaWQgPQorCQkgICAgU1NJRF9FUVVBTChTc2lkLCBTc2lkTGVuLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLAorCQkJICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pID8gVFJVRSA6IEZBTFNFOwogCi0KLQkJLy8gaWdub3JlIEJFQUNPTiBub3QgZm9yIG15IFNTSUQKLQkJaWYgKCghIGlzX215X3NzaWQpICYmICghIGlzX215X2Jzc2lkKSkKKwkJLyogaWdub3JlIEJFQUNPTiBub3QgZm9yIG15IFNTSUQgKi8KKwkJaWYgKCghaXNfbXlfc3NpZCkgJiYgKCFpc19teV9ic3NpZCkpCiAJCQlyZXR1cm47CiAKLQkJLy8gSXQgbWVhbnMgU1RBIHdhaXRzIGRpc2Fzc29jIGNvbXBsZXRlbHkgZnJvbSB0aGlzIEFQLCBpZ25vcmVzIHRoaXMgYmVhY29uLgorCQkvKiBJdCBtZWFucyBTVEEgd2FpdHMgZGlzYXNzb2MgY29tcGxldGVseSBmcm9tIHRoaXMgQVAsIGlnbm9yZXMgdGhpcyBiZWFjb24uICovCiAJCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfV0FJVF9ESVNBU1NPQykKIAkJCXJldHVybjsKIAotCQkvLyBDb3B5IENvbnRyb2wgY2hhbm5lbCBmb3IgdGhpcyBCU1NJRC4KKwkJLyogQ29weSBDb250cm9sIGNoYW5uZWwgZm9yIHRoaXMgQlNTSUQuICovCiAJCWlmIChBZGRIdEluZm9MZW4gIT0gMCkKIAkJCUNoYW5uZWwgPSBBZGRIdEluZm8uQ29udHJvbENoYW47CiAKIAkJaWYgKChIdENhcGFiaWxpdHlMZW4gPiAwKSB8fCAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA+IDApKQogCQkJSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7CiAKLQkJLy8KLQkJLy8gSG91c2VrZWVwaW5nICJTc2lkQnNzVGFiIiB0YWJsZSBmb3IgbGF0ZXItb24gUk9BTWluZyB1c2FnZS4KLQkJLy8KKwkJLyogKi8KKwkJLyogSG91c2VrZWVwaW5nICJTc2lkQnNzVGFiIiB0YWJsZSBmb3IgbGF0ZXItb24gUk9BTWluZyB1c2FnZS4gKi8KKwkJLyogKi8KIAkJQnNzaWR4ID0gQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgQnNzaWQsIENoYW5uZWwpOwotCQlpZiAoQnNzaWR4ID09IEJTU19OT1RfRk9VTkQpCi0JCXsKLQkJCS8vIGRpc2NvdmVyIG5ldyBBUCBvZiB0aGlzIG5ldHdvcmssIGNyZWF0ZSBCU1MgZW50cnkKLQkJCUJzc2lkeCA9IEJzc1RhYmxlU2V0RW50cnkocEFkLCAmcEFkLT5TY2FuVGFiLCBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLAotCQkJCQkJICZDZlBhcm0sIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLAotCQkJCQkJJkh0Q2FwYWJpbGl0eSwgJkFkZEh0SW5mbyxIdENhcGFiaWxpdHlMZW4sQWRkSHRJbmZvTGVuLE5ld0V4dENoYW5uZWxPZmZzZXQsIENoYW5uZWwsCi0JCQkJCQlSZWFsUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywgJkVkY2FQYXJtLCAmUW9zQ2FwYWJpbGl0eSwKLQkJCQkJCSZRYnNzTG9hZCwgTGVuVklFLCBwVklFKTsKLQkJCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkgLy8gcmV0dXJuIGlmIEJTUyB0YWJsZSBmdWxsCisJCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkgeworCQkJLyogZGlzY292ZXIgbmV3IEFQIG9mIHRoaXMgbmV0d29yaywgY3JlYXRlIEJTUyBlbnRyeSAqLworCQkJQnNzaWR4ID0KKwkJCSAgICBCc3NUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U2NhblRhYiwgQnNzaWQsIFNzaWQsCisJCQkJCSAgICAgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLAorCQkJCQkgICAgICZDZlBhcm0sIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvLAorCQkJCQkgICAgIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsCisJCQkJCSAgICAgRXh0UmF0ZUxlbiwgJkh0Q2FwYWJpbGl0eSwKKwkJCQkJICAgICAmQWRkSHRJbmZvLCBIdENhcGFiaWxpdHlMZW4sCisJCQkJCSAgICAgQWRkSHRJbmZvTGVuLCBOZXdFeHRDaGFubmVsT2Zmc2V0LAorCQkJCQkgICAgIENoYW5uZWwsIFJlYWxSc3NpLCBUaW1lU3RhbXAsCisJCQkJCSAgICAgQ2tpcEZsYWcsICZFZGNhUGFybSwKKwkJCQkJICAgICAmUW9zQ2FwYWJpbGl0eSwgJlFic3NMb2FkLCBMZW5WSUUsCisJCQkJCSAgICAgcFZJRSk7CisJCQlpZiAoQnNzaWR4ID09IEJTU19OT1RfRk9VTkQpCS8qIHJldHVybiBpZiBCU1MgdGFibGUgZnVsbCAqLwogCQkJCXJldHVybjsKIAotCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uUFRTRiwgJkVsZW0tPk1zZ1syNF0sIDQpOwotCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLlRUU0ZbMF0sICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKLQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5UVFNGWzRdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7Ci0KLQorCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uUFRTRiwKKwkJCQkgICAgICAgJkVsZW0tPk1zZ1syNF0sIDQpOworCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLlRUU0ZbMF0sCisJCQkJICAgICAgICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5UVFNGWzRdLAorCQkJCSAgICAgICAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7CiAKIAkJfQogCi0JCWlmICgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYgKE5ld0NoYW5uZWwgIT0gMCkgJiYgKENoYW5uZWwgIT0gTmV3Q2hhbm5lbCkpCi0JCXsKLQkJCS8vIFN3aXRjaGluZyB0byBjaGFubmVsIDEgY2FuIHByZXZlbnQgZnJvbSByZXNjYW5uaW5nIHRoZSBjdXJyZW50IGNoYW5uZWwgaW1tZWRpYXRlbHkgKGJ5IGF1dG8gcmVjb25uZWN0aW9uKS4KLQkJCS8vIEluIGFkZGl0aW9uLCBjbGVhciB0aGUgTUxNRSBxdWV1ZSBhbmQgdGhlIHNjYW4gdGFibGUgdG8gZGlzY2FyZCB0aGUgUlggcGFja2V0cyBhbmQgcHJldmlvdXMgc2Nhbm5pbmcgcmVzdWx0cy4KKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJiAoTmV3Q2hhbm5lbCAhPSAwKQorCQkgICAgJiYgKENoYW5uZWwgIT0gTmV3Q2hhbm5lbCkpIHsKKwkJCS8qIFN3aXRjaGluZyB0byBjaGFubmVsIDEgY2FuIHByZXZlbnQgZnJvbSByZXNjYW5uaW5nIHRoZSBjdXJyZW50IGNoYW5uZWwgaW1tZWRpYXRlbHkgKGJ5IGF1dG8gcmVjb25uZWN0aW9uKS4gKi8KKwkJCS8qIEluIGFkZGl0aW9uLCBjbGVhciB0aGUgTUxNRSBxdWV1ZSBhbmQgdGhlIHNjYW4gdGFibGUgdG8gZGlzY2FyZCB0aGUgUlggcGFja2V0cyBhbmQgcHJldmlvdXMgc2Nhbm5pbmcgcmVzdWx0cy4gKi8KIAkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgMSwgRkFMU0UpOwogCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgMSk7Ci0JCSAgICBMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJCUxpbmtEb3duKHBBZCwgRkFMU0UpOwogCQkJTWxtZVF1ZXVlSW5pdCgmcEFkLT5NbG1lLlF1ZXVlKTsKIAkJCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKLQkJICAgIFJUTVB1c2VjRGVsYXkoMTAwMDAwMCk7CQkvLyB1c2UgZGVsYXkgdG8gcHJldmVudCBTVEEgZG8gcmVhc3NvYworCQkJUlRNUHVzZWNEZWxheSgxMDAwMDAwKTsJLyogdXNlIGRlbGF5IHRvIHByZXZlbnQgU1RBIGRvIHJlYXNzb2MgKi8KIAotCQkJLy8gY2hhbm5lbCBzYW5pdHkgY2hlY2sKLQkJCWZvciAoaW5kZXggPSAwIDsgaW5kZXggPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpbmRleCsrKQotCQkJewotCQkJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2luZGV4XS5DaGFubmVsID09IE5ld0NoYW5uZWwpCi0JCQkJewotCQkJCQlwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5DaGFubmVsID0gTmV3Q2hhbm5lbDsKKwkJCS8qIGNoYW5uZWwgc2FuaXR5IGNoZWNrICovCisJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpbmRleCsrKSB7CisJCQkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLkNoYW5uZWwgPT0KKwkJCQkgICAgTmV3Q2hhbm5lbCkgeworCQkJCQlwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5DaGFubmVsID0KKwkJCQkJICAgIE5ld0NoYW5uZWw7CiAJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBOZXdDaGFubmVsOwotCQkJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKLQkJCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb24gLSBTVEEgcmVjZWl2ZSBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgSUUgKE5ldyBDaGFubmVsID0lZClcbiIsIE5ld0NoYW5uZWwpKTsKKwkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLAorCQkJCQkJCSAgcEFkLT5Db21tb25DZmcuCisJCQkJCQkJICBDaGFubmVsLCBGQUxTRSk7CisJCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsCisJCQkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICgiUGVlckJlYWNvbiAtIFNUQSByZWNlaXZlIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBJRSAoTmV3IENoYW5uZWwgPSVkKVxuIiwKKwkJCQkJCSAgTmV3Q2hhbm5lbCkpOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CiAKLQkJCWlmIChpbmRleCA+PSBwQWQtPkNoYW5uZWxMaXN0TnVtKQotCQkJeworCQkJaWYgKGluZGV4ID49IHBBZC0+Q2hhbm5lbExpc3ROdW0pIHsKIAkJCQlEQkdQUklOVF9FUlIoKCJQZWVyQmVhY29uKGNhbiBub3QgZmluZCBOZXcgQ2hhbm5lbD0lZCBpbiBDaGFubmVsTGlzdFslZF1cbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3ROdW0pKTsKIAkJCX0KIAkJfQorCQkvKiBpZiB0aGUgc3NpZCBtYXRjaGVkICYgYnNzaWQgdW5tYXRjaGVkLCB3ZSBzaG91bGQgc2VsZWN0IHRoZSBic3NpZCB3aXRoIGxhcmdlIHZhbHVlLiAqLworCQkvKiBUaGlzIG1pZ2h0IGhhcHBlbmVkIHdoZW4gdHdvIFNUQSBzdGFydCBhdCB0aGUgc2FtZSB0aW1lICovCisJCWlmICgoIWlzX215X2Jzc2lkKSAmJiBBREhPQ19PTihwQWQpKSB7CisJCQlpbnQgaTsKIAotCQkvLyBpZiB0aGUgc3NpZCBtYXRjaGVkICYgYnNzaWQgdW5tYXRjaGVkLCB3ZSBzaG91bGQgc2VsZWN0IHRoZSBic3NpZCB3aXRoIGxhcmdlIHZhbHVlLgotCQkvLyBUaGlzIG1pZ2h0IGhhcHBlbmVkIHdoZW4gdHdvIFNUQSBzdGFydCBhdCB0aGUgc2FtZSB0aW1lCi0JCWlmICgoISBpc19teV9ic3NpZCkgJiYgQURIT0NfT04ocEFkKSkKLQkJewotCQkJSU5UCWk7Ci0KLQkJCS8vIEFkZCB0aGUgc2FmZWd1YXJkIGFnYWluc3QgdGhlIG1pc21hdGNoIG9mIGFkaG9jIHdlcCBzdGF0dXMKLQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uV2VwU3RhdHVzKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBOb3QgbWF0Y2hlZCB3ZXAgc3RhdHVzICVkICVkXG4iLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLldlcFN0YXR1cykpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImJzc2lkPSVzXG4iLCBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5Cc3NpZCkpOworCQkJLyogQWRkIHRoZSBzYWZlZ3VhcmQgYWdhaW5zdCB0aGUgbWlzbWF0Y2ggb2YgYWRob2Mgd2VwIHN0YXR1cyAqLworCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPQorCQkJICAgIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLldlcFN0YXR1cykgewogCQkJCXJldHVybjsKIAkJCX0KLQotCQkJLy8gY29sbGFwc2UgaW50byB0aGUgQURIT0MgbmV0d29yayB3aGljaCBoYXMgYmlnZ2VyIEJTU0lEIHZhbHVlLgotCQkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQkJCXsKLQkJCQlpZiAoQnNzaWRbaV0gPiBwQWQtPkNvbW1vbkNmZy5Cc3NpZFtpXSkKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBtZXJnZSB0byB0aGUgSUJTUyB3aXRoIGJpZ2dlciBCU1NJRD0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCQkJCUJzc2lkWzBdLCBCc3NpZFsxXSwgQnNzaWRbMl0sIEJzc2lkWzNdLCBCc3NpZFs0XSwgQnNzaWRbNV0pKTsKKwkJCS8qIGNvbGxhcHNlIGludG8gdGhlIEFESE9DIG5ldHdvcmsgd2hpY2ggaGFzIGJpZ2dlciBCU1NJRCB2YWx1ZS4gKi8KKwkJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJCQlpZiAoQnNzaWRbaV0gPiBwQWQtPkNvbW1vbkNmZy5Cc3NpZFtpXSkgeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAoIlNZTkMgLSBtZXJnZSB0byB0aGUgSUJTUyB3aXRoIGJpZ2dlciBCU1NJRD0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQkJCSAgQnNzaWRbMF0sIEJzc2lkWzFdLCBCc3NpZFsyXSwKKwkJCQkJCSAgQnNzaWRbM10sIEJzc2lkWzRdLAorCQkJCQkJICBCc3NpZFs1XSkpOwogCQkJCQlBc2ljRGlzYWJsZVN5bmMocEFkKTsKLQkJCQkJQ09QWV9NQUNfQUREUihwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgQnNzaWQpOworCQkJCQlDT1BZX01BQ19BRERSKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQkJCQkJICAgICAgQnNzaWQpOwogCQkJCQlBc2ljU2V0QnNzaWQocEFkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQkJCU1ha2VJYnNzQmVhY29uKHBBZCk7ICAgICAgICAvLyByZS1idWlsZCBCRUFDT04gZnJhbWUKLQkJCQkJQXNpY0VuYWJsZUlic3NTeW5jKHBBZCk7ICAgIC8vIGNvcHkgQkVBQ09OIGZyYW1lIHRvIG9uLWNoaXAgbWVtb3J5CisJCQkJCU1ha2VJYnNzQmVhY29uKHBBZCk7CS8qIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZSAqLworCQkJCQlBc2ljRW5hYmxlSWJzc1N5bmMocEFkKTsJLyogY29weSBCRUFDT04gZnJhbWUgdG8gb24tY2hpcCBtZW1vcnkgKi8KIAkJCQkJaXNfbXlfYnNzaWQgPSBUUlVFOwogCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoQnNzaWRbaV0gPCBwQWQtPkNvbW1vbkNmZy5Cc3NpZFtpXSkKKwkJCQl9IGVsc2UgaWYgKEJzc2lkW2ldIDwgcEFkLT5Db21tb25DZmcuQnNzaWRbaV0pCiAJCQkJCWJyZWFrOwogCQkJfQogCQl9CiAKLQogCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwogCQlwQnNzID0gJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdOwotCQlwQnNzLT5Sc3NpID0gUmVhbFJzc2k7ICAgICAgIC8vIGxhc3Rlc3QgUlNTSQotCQlwQnNzLT5MYXN0QmVhY29uUnhUaW1lID0gTm93OyAgIC8vIGxhc3QgUlggdGltZXN0YW1wCisJCXBCc3MtPlJzc2kgPSBSZWFsUnNzaTsJLyogbGFzdGVzdCBSU1NJICovCisJCXBCc3MtPkxhc3RCZWFjb25SeFRpbWUgPSBOb3c7CS8qIGxhc3QgUlggdGltZXN0YW1wICovCiAKLQkJLy8KLQkJLy8gQkVBQ09OIGZyb20gbXkgQlNTSUQgLSBlaXRoZXIgSUJTUyBvciBJTkZSQSBuZXR3b3JrCi0JCS8vCi0JCWlmIChpc19teV9ic3NpZCkKLQkJewotCQkJUlhXSV9TVFJVQwlSeFdJOworCQkvKiAqLworCQkvKiBCRUFDT04gZnJvbSBteSBCU1NJRCAtIGVpdGhlciBJQlNTIG9yIElORlJBIG5ldHdvcmsgKi8KKwkJLyogKi8KKwkJaWYgKGlzX215X2Jzc2lkKSB7CisJCQlzdHJ1Y3QgcnRfcnh3aSBSeFdJOwogCiAJCQlwQWQtPlN0YUNmZy5EdGltQ291bnQgPSBEdGltQ291bnQ7CiAJCQlwQWQtPlN0YUNmZy5EdGltUGVyaW9kID0gRHRpbVBlcmlvZDsKIAkJCXBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgPSBOb3c7CiAKLQogCQkJUnhXSS5SU1NJMCA9IEVsZW0tPlJzc2kwOwogCQkJUnhXSS5SU1NJMSA9IEVsZW0tPlJzc2kxOwogCQkJUnhXSS5SU1NJMiA9IEVsZW0tPlJzc2kyOwogCiAJCQlVcGRhdGVfUnNzaV9TYW1wbGUocEFkLCAmcEFkLT5TdGFDZmcuUnNzaVNhbXBsZSwgJlJ4V0kpOwotCQkJaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCAhPSAweEZGKQotCQkJewotCQkJCS8vCi0JCQkJLy8gV2UgZ2V0IHRoZSBDaXNjbyAoY2N4KSAiVHhQb3dlciBMaW1pdCIgcmVxdWlyZWQKLQkJCQkvLyBDaGFuZ2VkIHRvIGFwcHJvcHJpYXRlIFR4UG93ZXIgTGltaXQgZm9yIENpc28gQ29tcGF0aWJsZSBFeHRlbnNpb25zCi0JCQkJLy8KLQkJCQlDaGFuZ2VUb0NlbGxQb3dlckxpbWl0KHBBZCwgQWlyb25ldENlbGxQb3dlckxpbWl0KTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLwotCQkJCS8vIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCBlcXVhbCB0byAweEZGIG1lYW5zIHRoZSBDaXNjbyAoY2N4KSAiVHhQb3dlciBMaW1pdCIgbm90IGV4aXN0LgotCQkJCS8vIFVzZWQgdGhlIGRlZmF1bHQgVFggUG93ZXIgUGVyY2VudGFnZSwgdGhhdCBzZXQgZnJvbSBVSS4KLQkJCQkvLwotCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7CisJCQlpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0ICE9IDB4RkYpIHsKKwkJCQkvKiAqLworCQkJCS8qIFdlIGdldCB0aGUgQ2lzY28gKGNjeCkgIlR4UG93ZXIgTGltaXQiIHJlcXVpcmVkICovCisJCQkJLyogQ2hhbmdlZCB0byBhcHByb3ByaWF0ZSBUeFBvd2VyIExpbWl0IGZvciBDaXNvIENvbXBhdGlibGUgRXh0ZW5zaW9ucyAqLworCQkJCS8qICovCisJCQkJQ2hhbmdlVG9DZWxsUG93ZXJMaW1pdChwQWQsCisJCQkJCQkgICAgICAgQWlyb25ldENlbGxQb3dlckxpbWl0KTsKKwkJCX0gZWxzZSB7CisJCQkJLyogKi8KKwkJCQkvKiBBaXJvbmV0Q2VsbFBvd2VyTGltaXQgZXF1YWwgdG8gMHhGRiBtZWFucyB0aGUgQ2lzY28gKGNjeCkgIlR4UG93ZXIgTGltaXQiIG5vdCBleGlzdC4gKi8KKwkJCQkvKiBVc2VkIHRoZSBkZWZhdWx0IFRYIFBvd2VyIFBlcmNlbnRhZ2UsIHRoYXQgc2V0IGZyb20gVUkuICovCisJCQkJLyogKi8KKwkJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9CisJCQkJICAgIHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OwogCQkJfQogCi0jaWZkZWYgUlQyODYwCi0JCQkvLyBhdCBsZWFzdCBvbmUgMTFiIHBlZXIgam9pbmVkLiBkb3duZ3JhZGUgdGhlIE1heFR4UmF0ZSB0byAxMU1icHMKLQkJCS8vIGFmdGVyIGxhc3QgMTFiIHBlZXIgbGVmdCBmb3Igc2V2ZXJhbCBzZWNvbmRzLCB3ZSdsbCBhdXRvIHN3aXRjaCBiYWNrIHRvIDExRyByYXRlCi0JCQkvLyBpbiBNbG1lUGVyaW9kaWNFeGVjKCkKLSNlbmRpZgotCQkJaWYgKEFESE9DX09OKHBBZCkgJiYgKENBUF9JU19JQlNTX09OKENhcGFiaWxpdHlJbmZvKSkpCi0JCQl7Ci0jaWZkZWYgUlQyODYwCi0JCQkJQk9PTEVBTgliUmVzdGFydDsKLSAgICAgICAgICAgICAgICBCT09MRUFOCWJuUmVzdGFydDsKKwkJCWlmIChBREhPQ19PTihwQWQpICYmIChDQVBfSVNfSUJTU19PTihDYXBhYmlsaXR5SW5mbykpKSB7CisJCQkJdTggTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IDA7CisJCQkJdTggaWR4OworCQkJCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeTsKIAotCQkJCWJSZXN0YXJ0ID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgYm5SZXN0YXJ0ID0gRkFMU0U7Ci0KLQkJCQlkbwotCQkJCXsKLQkJCQkJaWYgKChTdXBSYXRlTGVuK0V4dFJhdGVMZW4gPD0gNCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA+IFJBVEVfMTEpKQotCQkJCQl7Ci0JCQkJCQlpZiAocEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCA9PSBGQUxTRSkKLQkJCQkJCXsKLQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gMTFiIHBlZXIgam9pbmVkLiBkb3duLWdyYWRlIHRvIDExYiBUWCByYXRlcyBcbiIpKTsKLQkJCQkJCQliUmVzdGFydCA9IFRSVUU7Ci0JCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuU3VwUmF0ZSwgU3VwUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOwotCQkJCQkJCXBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gPSBTdXBSYXRlTGVuOwotCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLkV4dFJhdGUsIEV4dFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKLQkJCQkJCQlwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID0gRXh0UmF0ZUxlbjsKLQkJCQkJCQlwQWQtPlN0YUNmZy5BZGhvY0JPbmx5Sm9pbmVkID0gVFJVRTsKLQkJCQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IEZBTFNFOwotCQkJCQkJCUFzaWNTZXRFZGNhUGFybShwQWQsIE5VTEwpOwotCQkJCQkJfQotCi0JCQkJCQkvLyB0aGlzIHRpbWVzdGFtcCBpcyBmb3IgTWxtZVBlcmlvZGljRXhlYygpIHRvIGNoZWNrIGlmIGFsbCAxMUIgcGVlcnMgaGF2ZSBsZWZ0Ci0JCQkJCQlwQWQtPlN0YUNmZy5MYXN0MTFiQmVhY29uUnhUaW1lID0gTm93OwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQotCQkJCQkvLyBVcGRhdGUgSHQgUGh5LgotCQkJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCi0JCQkJCXsKLQkJCQkJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpICYmCi0JCQkJCQkJIXBBZC0+U3RhQ2ZnLkFkaG9jQkdKb2luZWQgJiYKLQkJCQkJCQkhcEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCkKLQkJCQkJCQlBZGhvY1R1cm5PblFvcyhwQWQpOwotCi0JCQkJCQkvLyBIYW5kbGUgcmF0ZSBzd2l0Y2ggaXNzdWUgd2hlbiBBZGhvYyBtb2RlCi0JCQkJCQlpZiAoKFN1cFJhdGVMZW4rRXh0UmF0ZUxlbiA+PSA4KSAmJiAoSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAwKSAmJiAoSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKSkKLQkJCQkJCXsKLQkJCQkJCQlpZiAocEFkLT5TdGFDZmcuQWRob2NCR0pvaW5lZCA9PSBGQUxTRSkKLQkJCQkJCQl7Ci0JCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSAxMWcgcGVlciBqb2luZWQuIGRvd24tZ3JhZGUgdG8gMTFnIFRYIHJhdGVzIFxuIikpOwotCQkJCQkJCQliUmVzdGFydCA9IFRSVUU7Ci0JCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cFJhdGUsIFN1cFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKLQkJCQkJCQkJcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47Ci0JCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLkV4dFJhdGUsIEV4dFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKLQkJCQkJCQkJcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9IEV4dFJhdGVMZW47Ci0JCQkJCQkJCXBBZC0+U3RhQ2ZnLkFkaG9jQkdKb2luZWQgPSBUUlVFOwotCQkJCQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IEZBTFNFOwotCQkJCQkJCQlBc2ljU2V0RWRjYVBhcm0ocEFkLCBOVUxMKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQkvLyB0aGlzIHRpbWVzdGFtcCBpcyBmb3IgTWxtZVBlcmlvZGljRXhlYygpIHRvIGNoZWNrIGlmIGFsbCAxMWcgcGVlcnMgaGF2ZSBsZWZ0Ci0JCQkJCQkJcEFkLT5TdGFDZmcuTGFzdDExZ0JlYWNvblJ4VGltZSA9IE5vdzsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKCFwQWQtPlN0YUNmZy5BZGhvY0JHSm9pbmVkICYmCi0JCQkJCQkJCSAhcEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCAmJgotCQkJCQkJCQkgKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCkgJiYKLQkJCQkJCQkJIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV18yMCkpCi0JCQkJCQl7Ci0JCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkFkaG9jMjBOSm9pbmVkID09IEZBTFNFKQotCQkJCQkJCXsKLQkJCQkJCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwotCi0JCQkJCQkJCXBBZC0+U3RhQ2ZnLkFkaG9jMjBOSm9pbmVkID0gVFJVRTsKLQkJCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksICZIdENhcGFiaWxpdHksIFNJWkVfSFRfQ0FQX0lFKTsKLQkJCQkJCQkJaWYgKEFkZEh0SW5mb0xlbiAhPSAwKQotCQkJCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sICZBZGRIdEluZm8sIEFkZEh0SW5mb0xlbik7Ci0JCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0LCBIdENhcGFiaWxpdHkuTUNTU2V0LCAxNik7Ci0KLQkJCQkJCQkJUlRNUENoZWNrSHQocEFkLCBFbGVtLT5XY2lkLCAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8pOwotCQkJCQkJCQlDT1BZX0hUU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKHBBZCk7Ci0JCQkJCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gVFJVRTsKLQkJCQkJCQkJYlJlc3RhcnQgPSBUUlVFOwotCQkJCQkJCQliblJlc3RhcnQgPSBUUlVFOwotCQkJCQkJCX0KLQkJCQkJCQkvLyB0aGlzIHRpbWVzdGFtcCBpcyBmb3IgTWxtZVBlcmlvZGljRXhlYygpIHRvIGNoZWNrIGlmIGFsbCAyME1IeiBOIHBlZXJzIGhhdmUgbGVmdAotCQkJCQkJCXBBZC0+U3RhQ2ZnLkxhc3QyME5CZWFjb25SeFRpbWUgPSBOb3c7Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCBTSVpFX0hUX0NBUF9JRSk7Ci0JCQkJCQlSVE1QWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywgU0laRV9BRERfSFRfSU5GT19JRSk7Ci0JCQkJCX0KLQkJCQl9d2hpbGUgKEZBTFNFKTsKLQotCQkJCS8vIElmIHBlZXIgQWRob2MgaXMgbGVnYWN5IG1vZGUsIEkgZG9uJ3QgbmVlZCB0byBjYWxsIE1sbWVVcGRhdGVIdFR4UmF0ZXMgbm8gbWF0dGVyIEkgc3VwcG9ydCBIVCBvciBub3QKLQkJCQlpZiAoKGJSZXN0YXJ0ID09IFRSVUUpICYmIChiblJlc3RhcnQgPT0gRkFMU0UpKQotCQkJCXsKLQkJCQkJTWxtZVVwZGF0ZVR4UmF0ZXMocEFkLCBGQUxTRSwgMCk7Ci0JCQkJCU1ha2VJYnNzQmVhY29uKHBBZCk7ICAgICAgICAvLyByZS1idWlsZCBCRUFDT04gZnJhbWUKLQkJCQkJQXNpY0VuYWJsZUlic3NTeW5jKHBBZCk7ICAgIC8vIGNvcHkgdG8gb24tY2hpcCBtZW1vcnkKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKGJSZXN0YXJ0ID09IFRSVUUpICYmIChiblJlc3RhcnQgPT0gVFJVRSkpCi0JCQkJewotCQkJCQlNbG1lVXBkYXRlVHhSYXRlcyhwQWQsIEZBTFNFLCBCU1MwKTsKLQkJCQkJTWxtZVVwZGF0ZUh0VHhSYXRlcyhwQWQsIEJTUzApOwotCQkJCQlNYWtlSWJzc0JlYWNvbihwQWQpOyAgICAgICAgLy8gcmUtYnVpbGQgQkVBQ09OIGZyYW1lCi0JCQkJCUFzaWNFbmFibGVJYnNzU3luYyhwQWQpOyAgICAvLyBjb3B5IHRvIG9uLWNoaXAgbWVtb3J5CisJCQkJLyogc3VwcG9ydGVkIHJhdGVzIGFycmF5IG1heSBub3QgYmUgc29ydGVkLiBzb3J0IGl0IGFuZCBmaW5kIHRoZSBtYXhpbXVtIHJhdGUgKi8KKwkJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IFN1cFJhdGVMZW47IGlkeCsrKSB7CisJCQkJCWlmIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzIDwKKwkJCQkJICAgIChTdXBSYXRlW2lkeF0gJiAweDdmKSkKKwkJCQkJCU1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPQorCQkJCQkJICAgIFN1cFJhdGVbaWR4XSAmIDB4N2Y7CiAJCQkJfQogCi0JCQkJLy8gQXQgbGVhc3QgYW5vdGhlciBwZWVyIGluIHRoaXMgSUJTUywgZGVjbGFyZSBNZWRpYVN0YXRlIGFzIENPTk5FQ1RFRAotCQkJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQotCQkJCXsKLQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7Ci0KLQkJCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKLQkJCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKLQkgICAgICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7Ci0JCQkJCUFzaWNTZXRCc3NpZChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQotCQkJCQkvLyAyMDAzLzAzLzEyIC0gam9obgotCQkJCQkvLyBNYWtlIHN1cmUgdGhpcyBlbnRyeSBpbiAiU2NhblRhYiIgdGFibGUsIHRodXMgY29tcGxpZXMgdG8gTWljcm9zb2Z0J3MgcG9saWN5IHRoYXQKLQkJCQkJLy8gInNpdGUgc3VydmV5IiByZXN1bHQgc2hvdWxkIGFsd2F5cyBpbmNsdWRlIHRoZSBjdXJyZW50IGNvbm5lY3RlZCBuZXR3b3JrLgotCQkJCQkvLwotCQkJCQlCc3NpZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBCc3NpZCwgQ2hhbm5lbCk7Ci0JCQkJCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkKLQkJCQkJewotCQkJCQkJQnNzaWR4ID0gQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlNjYW5UYWIsIEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCi0JCQkJCQkJCQkmQ2ZQYXJtLCBBdGltV2luLCBDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbiwgJkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkJCSZBZGRIdEluZm8sIEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLCBOZXdFeHRDaGFubmVsT2Zmc2V0LCBDaGFubmVsLCBSZWFsUnNzaSwgVGltZVN0YW1wLCAwLAotCQkJCQkJCQkJJkVkY2FQYXJtLCAmUW9zQ2FwYWJpbGl0eSwgJlFic3NMb2FkLCBMZW5WSUUsIHBWSUUpOwotCQkJCQl9Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFESE9DICBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRC5cbiIpKTsKKwkJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IEV4dFJhdGVMZW47IGlkeCsrKSB7CisJCQkJCWlmIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzIDwKKwkJCQkJICAgIChFeHRSYXRlW2lkeF0gJiAweDdmKSkKKwkJCQkJCU1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPQorCQkJCQkJICAgIEV4dFJhdGVbaWR4XSAmIDB4N2Y7CiAJCQkJfQogCi0JCQkJLy8gQWQtaG9jIG1vZGUgaXMgdXNpbmcgTUFDIGFkZHJlc3MgYXMgQkEgc2Vzc2lvbi4gU28gd2UgbmVlZCB0byBjb250aW51b3VzbHkgZmluZCBuZXdseSBqb2luZWQgYWRob2Mgc3RhdGlvbiBieSByZWNlaXZpbmcgYmVhY29uLgotCQkJCS8vIFRvIHByZXZlbnQgYWx3YXlzIGNoZWNrIHRoaXMsIHdlIHVzZSB3Y2lkID09IFJFU0VSVkVEX1dDSUQgdG8gcmVjb2duaXplIGl0IGFzIG5ld2x5IGpvaW5lZCBhZGhvYyBzdGF0aW9uLgotCQkJCWlmIChBREhPQ19PTihwQWQpICYmIChFbGVtLT5XY2lkID09IFJFU0VSVkVEX1dDSUQpKQotCQkJCXsKLQkJCQkJVUNIQVIJaWR4OwotCQkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKLQotCQkJCQkvLyBsb29rIHVwIHRoZSBleGlzdGluZyB0YWJsZQotCQkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIEFkZHIyKTsKLQkJCQkJaWYgKHBFbnRyeSA9PSBOVUxMKQotCQkJCQl7Ci0JCQkJCQkvLyBBbm90aGVyIGFkaG9jIGpvaW5pbmcsIGFkZCB0byBvdXIgTUFDIHRhYmxlLgotCQkJCQkJcEVudHJ5ID0gTWFjVGFibGVJbnNlcnRFbnRyeShwQWQsIEFkZHIyLCBCU1MwLCBGQUxTRSk7Ci0JCQkJCQlpZiAocEVudHJ5KQotCQkJCQkJewotCQkJCQkJCXBFbnRyeS0+U3N0ID0gU1NUX0FTU09DOwotCQkJCQkJCWlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKLQkJCQkJCQkvLyBBZnRlciBJbnNlcnRFbnRyeSwgV3JpdGUgdG8gQVNJQyBvbi1jaGlwIHRhYmxlLgotCQkJCQkJCVJUMjhYWF9TVEFfU0VDVVJJVFlfSU5GT19BREQocEFkLCBCU1MwLCBpZHgsIHBFbnRyeSk7Ci0JCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQURIT0MgJXg6JXg6JXg6JXg6JXg6JXggIGpvaW4gaW4uRW50cnk9JWRcbiIsIEFkZHIyWzBdLEFkZHIyWzFdLEFkZHIyWzJdLEFkZHIyWzNdLEFkZHIyWzRdLEFkZHIyWzVdLCBwRW50cnktPkFpZCkpOwotCi0JCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS53b3JkOwotCSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChIdENhcGFiaWxpdHlMZW4gPD0gMCkKLQkgICAgICAgICAgICAgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAwOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5CVyA9IDA7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAwOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKFN1cFJhdGVMZW4rRXh0UmF0ZUxlbiA8PSA0KSAmJiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkpCi0JICAgICAgICAJCQkJCXsKLQkgICAgICAgIAkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKLQkgICAgICAgIAkJCQkJfQotCSAgICAgICAgCQkJCQllbHNlCi0JICAgICAgICAJCQkJCXsKLQkgICAgICAgIAkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JICAgICAgICAJCQkJCX0KLQkJCQkJCQkJTWxtZVVwZGF0ZVR4UmF0ZXMocEFkLCBGQUxTRSwgMCk7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCQkJCQkJCWVsc2UKLQkJCQkJCQl7Ci0JCQkJCQkJCU1sbWVVcGRhdGVUeFJhdGVzKHBBZCwgRkFMU0UsIDApOwotCQkJCQkJCQlNbG1lVXBkYXRlSHRUeFJhdGVzKHBBZCwgQlNTMCk7Ci0JCQkJCQkJfQotCi0JICAgICAgICAgICAgICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdleHRfbm90aWZ5X2V2ZW50X2Fzc29jKHBBZCk7Ci0KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOwotCi0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotI2VuZGlmIC8qIFJUMjg2MCAqLwotI2lmZGVmIFJUMjg3MAotCQkJCVVDSEFSCQkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IDA7Ci0JCQkJVUNIQVIJCQlpZHg7Ci0JCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7Ci0KLQkJCQkvLyBzdXBwb3J0ZWQgcmF0ZXMgYXJyYXkgbWF5IG5vdCBiZSBzb3J0ZWQuIHNvcnQgaXQgYW5kIGZpbmQgdGhlIG1heGltdW0gcmF0ZQotCQkJICAgIGZvciAoaWR4PTA7IGlkeDxTdXBSYXRlTGVuOyBpZHgrKykKLQkJCSAgICB7Ci0JCQkgICAgICAgIGlmIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzIDwgKFN1cFJhdGVbaWR4XSAmIDB4N2YpKQotCQkJICAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IFN1cFJhdGVbaWR4XSAmIDB4N2Y7Ci0JCQkgICAgfQotCi0JCQkJZm9yIChpZHg9MDsgaWR4PEV4dFJhdGVMZW47IGlkeCsrKQotCQkJICAgIHsKLQkJCSAgICAgICAgaWYgKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPCAoRXh0UmF0ZVtpZHhdICYgMHg3ZikpCi0JCQkgICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gRXh0UmF0ZVtpZHhdICYgMHg3ZjsKLQkJCSAgICB9Ci0KLQkJCQkvLyBsb29rIHVwIHRoZSBleGlzdGluZyB0YWJsZQorCQkJCS8qIGxvb2sgdXAgdGhlIGV4aXN0aW5nIHRhYmxlICovCiAJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBBZGRyMik7CiAKLQkJCQkvLyBBZC1ob2MgbW9kZSBpcyB1c2luZyBNQUMgYWRkcmVzcyBhcyBCQSBzZXNzaW9uLiBTbyB3ZSBuZWVkIHRvIGNvbnRpbnVvdXNseSBmaW5kIG5ld2x5IGpvaW5lZCBhZGhvYyBzdGF0aW9uIGJ5IHJlY2VpdmluZyBiZWFjb24uCi0JCQkJLy8gVG8gcHJldmVudCBhbHdheXMgY2hlY2sgdGhpcywgd2UgdXNlIHdjaWQgPT0gUkVTRVJWRURfV0NJRCB0byByZWNvZ25pemUgaXQgYXMgbmV3bHkgam9pbmVkIGFkaG9jIHN0YXRpb24uCi0JCQkJaWYgKChBREhPQ19PTihwQWQpICYmIChFbGVtLT5XY2lkID09IFJFU0VSVkVEX1dDSUQpKSB8fAotCQkJCQkocEVudHJ5ICYmICgocEVudHJ5LT5MYXN0QmVhY29uUnhUaW1lICsgQURIT0NfRU5UUllfQkVBQ09OX0xPU1RfVElNRSkgPCBOb3cpKSkKLQkJCQl7CisJCQkJLyogQWQtaG9jIG1vZGUgaXMgdXNpbmcgTUFDIGFkZHJlc3MgYXMgQkEgc2Vzc2lvbi4gU28gd2UgbmVlZCB0byBjb250aW51b3VzbHkgZmluZCBuZXdseSBqb2luZWQgYWRob2Mgc3RhdGlvbiBieSByZWNlaXZpbmcgYmVhY29uLiAqLworCQkJCS8qIFRvIHByZXZlbnQgYWx3YXlzIGNoZWNrIHRoaXMsIHdlIHVzZSB3Y2lkID09IFJFU0VSVkVEX1dDSUQgdG8gcmVjb2duaXplIGl0IGFzIG5ld2x5IGpvaW5lZCBhZGhvYyBzdGF0aW9uLiAqLworCQkJCWlmICgoQURIT0NfT04ocEFkKQorCQkJCSAgICAgJiYgKEVsZW0tPldjaWQgPT0gUkVTRVJWRURfV0NJRCkpCisJCQkJICAgIHx8IChwRW50cnkKKwkJCQkJJiYKKwkJCQkJKChwRW50cnktPkxhc3RCZWFjb25SeFRpbWUgKworCQkJCQkgIEFESE9DX0VOVFJZX0JFQUNPTl9MT1NUX1RJTUUpIDwKKwkJCQkJIE5vdykpKSB7CiAJCQkJCWlmIChwRW50cnkgPT0gTlVMTCkKLQkJCQkJCS8vIEFub3RoZXIgYWRob2Mgam9pbmluZywgYWRkIHRvIG91ciBNQUMgdGFibGUuCi0JCQkJCQlwRW50cnkgPSBNYWNUYWJsZUluc2VydEVudHJ5KHBBZCwgQWRkcjIsIEJTUzAsIEZBTFNFKTsKKwkJCQkJCS8qIEFub3RoZXIgYWRob2Mgam9pbmluZywgYWRkIHRvIG91ciBNQUMgdGFibGUuICovCisJCQkJCQlwRW50cnkgPQorCQkJCQkJICAgIE1hY1RhYmxlSW5zZXJ0RW50cnkocEFkLAorCQkJCQkJCQkJQWRkcjIsCisJCQkJCQkJCQlCU1MwLAorCQkJCQkJCQkJRkFMU0UpOwogCi0JCQkJCWlmIChTdGFBZGRNYWNUYWJsZUVudHJ5KHBBZCwgcEVudHJ5LCBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzLCAmSHRDYXBhYmlsaXR5LCBIdENhcGFiaWxpdHlMZW4sIENhcGFiaWxpdHlJbmZvKSA9PSBGQUxTRSkKLQkJCQkJewotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQURIT0MgLSBBZGQgRW50cnkgZmFpbGVkLlxuIikpOworCQkJCQlpZiAoU3RhQWRkTWFjVGFibGVFbnRyeShwQWQsCisJCQkJCQkJCXBFbnRyeSwKKwkJCQkJCQkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcywKKwkJCQkJCQkJJkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkJSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCQkmQWRkSHRJbmZvLAorCQkJCQkJCQlBZGRIdEluZm9MZW4sCisJCQkJCQkJCUNhcGFiaWxpdHlJbmZvKQorCQkJCQkgICAgPT0gRkFMU0UpIHsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJCSAoIkFESE9DIC0gQWRkIEVudHJ5IGZhaWxlZC5cbiIpKTsKIAkJCQkJCXJldHVybjsKIAkJCQkJfQogCiAJCQkJCWlmIChwRW50cnkgJiYKLQkJCQkJCShFbGVtLT5XY2lkID09IFJFU0VSVkVEX1dDSUQpKQotCQkJCQl7CisJCQkJCSAgICAoRWxlbS0+V2NpZCA9PSBSRVNFUlZFRF9XQ0lEKSkgewogCQkJCQkJaWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOwotCQkJCQkJUlQyOFhYX1NUQV9TRUNVUklUWV9JTkZPX0FERChwQWQsIEJTUzAsIGlkeCwgcEVudHJ5KTsKKwkJCQkJCVJUTVBfU1RBX1NFQ1VSSVRZX0lORk9fQUREKHBBZCwKKwkJCQkJCQkJCSAgIEJTUzAsCisJCQkJCQkJCQkgICBpZHgsCisJCQkJCQkJCQkgICBwRW50cnkpOwogCQkJCQl9CiAJCQkJfQogCiAJCQkJaWYgKHBFbnRyeSAmJiBwRW50cnktPlZhbGlkQXNDTEkpCiAJCQkJCXBFbnRyeS0+TGFzdEJlYWNvblJ4VGltZSA9IE5vdzsKIAotCQkJCS8vIEF0IGxlYXN0IGFub3RoZXIgcGVlciBpbiB0aGlzIElCU1MsIGRlY2xhcmUgTWVkaWFTdGF0ZSBhcyBDT05ORUNURUQKLQkJCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJCQl7Ci0JCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworCQkJCS8qIEF0IGxlYXN0IGFub3RoZXIgcGVlciBpbiB0aGlzIElCU1MsIGRlY2xhcmUgTWVkaWFTdGF0ZSBhcyBDT05ORUNURUQgKi8KKwkJCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRworCQkJCSAgICAocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpIHsKKwkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLAorCQkJCQkJCSAgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwogCi0JCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisJCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0KKwkJCQkJICAgIE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwogCQkJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOwotCSAgICAgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsKKwkJCQkJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7CiAJCQkJCUFzaWNTZXRCc3NpZChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKIAotCQkJCQkvLyAyMDAzLzAzLzEyIC0gam9obgotCQkJCQkvLyBNYWtlIHN1cmUgdGhpcyBlbnRyeSBpbiAiU2NhblRhYiIgdGFibGUsIHRodXMgY29tcGxpZXMgdG8gTWljcm9zb2Z0J3MgcG9saWN5IHRoYXQKLQkJCQkJLy8gInNpdGUgc3VydmV5IiByZXN1bHQgc2hvdWxkIGFsd2F5cyBpbmNsdWRlIHRoZSBjdXJyZW50IGNvbm5lY3RlZCBuZXR3b3JrLgotCQkJCQkvLwotCQkJCQlCc3NpZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBCc3NpZCwgQ2hhbm5lbCk7Ci0JCQkJCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkKLQkJCQkJewotCQkJCQkJQnNzaWR4ID0gQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlNjYW5UYWIsIEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCi0JCQkJCQkJCQkmQ2ZQYXJtLCBBdGltV2luLCBDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbiwgJkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkJCSZBZGRIdEluZm8sIEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLCBOZXdFeHRDaGFubmVsT2Zmc2V0LCBDaGFubmVsLCBSZWFsUnNzaSwgVGltZVN0YW1wLCAwLAotCQkJCQkJCQkJJkVkY2FQYXJtLCAmUW9zQ2FwYWJpbGl0eSwgJlFic3NMb2FkLCBMZW5WSUUsIHBWSUUpOworCQkJCQkvKiAyMDAzLzAzLzEyIC0gam9obiAqLworCQkJCQkvKiBNYWtlIHN1cmUgdGhpcyBlbnRyeSBpbiAiU2NhblRhYiIgdGFibGUsIHRodXMgY29tcGxpZXMgdG8gTWljcm9zb2Z0J3MgcG9saWN5IHRoYXQgKi8KKwkJCQkJLyogInNpdGUgc3VydmV5IiByZXN1bHQgc2hvdWxkIGFsd2F5cyBpbmNsdWRlIHRoZSBjdXJyZW50IGNvbm5lY3RlZCBuZXR3b3JrLiAqLworCQkJCQkvKiAqLworCQkJCQlCc3NpZHggPQorCQkJCQkgICAgQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgQnNzaWQsCisJCQkJCQkJICAgQ2hhbm5lbCk7CisJCQkJCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkgeworCQkJCQkJQnNzaWR4ID0KKwkJCQkJCSAgICBCc3NUYWJsZVNldEVudHJ5KHBBZCwKKwkJCQkJCQkJICAgICAmcEFkLT4KKwkJCQkJCQkJICAgICBTY2FuVGFiLAorCQkJCQkJCQkgICAgIEJzc2lkLAorCQkJCQkJCQkgICAgIFNzaWQsCisJCQkJCQkJCSAgICAgU3NpZExlbiwKKwkJCQkJCQkJICAgICBCc3NUeXBlLAorCQkJCQkJCQkgICAgIEJlYWNvblBlcmlvZCwKKwkJCQkJCQkJICAgICAmQ2ZQYXJtLAorCQkJCQkJCQkgICAgIEF0aW1XaW4sCisJCQkJCQkJCSAgICAgQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkJCSAgICAgU3VwUmF0ZSwKKwkJCQkJCQkJICAgICBTdXBSYXRlTGVuLAorCQkJCQkJCQkgICAgIEV4dFJhdGUsCisJCQkJCQkJCSAgICAgRXh0UmF0ZUxlbiwKKwkJCQkJCQkJICAgICAmSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkgICAgICZBZGRIdEluZm8sCisJCQkJCQkJCSAgICAgSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCQkgICAgIEFkZEh0SW5mb0xlbiwKKwkJCQkJCQkJICAgICBOZXdFeHRDaGFubmVsT2Zmc2V0LAorCQkJCQkJCQkgICAgIENoYW5uZWwsCisJCQkJCQkJCSAgICAgUmVhbFJzc2ksCisJCQkJCQkJCSAgICAgVGltZVN0YW1wLAorCQkJCQkJCQkgICAgIDAsCisJCQkJCQkJCSAgICAgJkVkY2FQYXJtLAorCQkJCQkJCQkgICAgICZRb3NDYXBhYmlsaXR5LAorCQkJCQkJCQkgICAgICZRYnNzTG9hZCwKKwkJCQkJCQkJICAgICBMZW5WSUUsCisJCQkJCQkJCSAgICAgcFZJRSk7CiAJCQkJCX0KLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQURIT0MgIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVELlxuIikpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAoIkFESE9DICBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRC5cbiIpKTsKIAkJCQl9Ci0jZW5kaWYgLyogUlQyODcwICovCiAJCQl9CiAKLQkJCWlmIChJTkZSQV9PTihwQWQpKQotCQkJeworCQkJaWYgKElORlJBX09OKHBBZCkpIHsKIAkJCQlCT09MRUFOIGJVc2VTaG9ydFNsb3QsIGJVc2VCR1Byb3RlY3Rpb247CiAKLQkJCQkvLyBkZWNpZGUgdG8gdXNlL2NoYW5nZSB0byAtCi0JCQkJLy8gICAgICAxLiBsb25nIHNsb3QgKDIwIHVzKSBvciBzaG9ydCBzbG90ICg5IHVzKSB0aW1lCi0JCQkJLy8gICAgICAyLiB0dXJuIG9uL29mZiBSVFMvQ1RTIGFuZC9vciBDVFMtdG8tc2VsZiBwcm90ZWN0aW9uCi0JCQkJLy8gICAgICAzLiBzaG9ydCBwcmVhbWJsZQorCQkJCS8qIGRlY2lkZSB0byB1c2UvY2hhbmdlIHRvIC0gKi8KKwkJCQkvKiAgICAgIDEuIGxvbmcgc2xvdCAoMjAgdXMpIG9yIHNob3J0IHNsb3QgKDkgdXMpIHRpbWUgKi8KKwkJCQkvKiAgICAgIDIuIHR1cm4gb24vb2ZmIFJUUy9DVFMgYW5kL29yIENUUy10by1zZWxmIHByb3RlY3Rpb24gKi8KKwkJCQkvKiAgICAgIDMuIHNob3J0IHByZWFtYmxlICovCiAKLQkJCQkvL2JVc2VTaG9ydFNsb3QgPSBwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSAmJiBDQVBfSVNfU0hPUlRfU0xPVChDYXBhYmlsaXR5SW5mbyk7Ci0JCQkJYlVzZVNob3J0U2xvdCA9IENBUF9JU19TSE9SVF9TTE9UKENhcGFiaWxpdHlJbmZvKTsKLQkJCQlpZiAoYlVzZVNob3J0U2xvdCAhPSBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1NMT1RfSU5VU0VEKSkKKwkJCQkvKmJVc2VTaG9ydFNsb3QgPSBwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSAmJiBDQVBfSVNfU0hPUlRfU0xPVChDYXBhYmlsaXR5SW5mbyk7ICovCisJCQkJYlVzZVNob3J0U2xvdCA9CisJCQkJICAgIENBUF9JU19TSE9SVF9TTE9UKENhcGFiaWxpdHlJbmZvKTsKKwkJCQlpZiAoYlVzZVNob3J0U2xvdCAhPQorCQkJCSAgICBPUFNUQVRVU19URVNUX0ZMQUcocEFkLAorCQkJCQkJICAgICAgIGZPUF9TVEFUVVNfU0hPUlRfU0xPVF9JTlVTRUQpKQogCQkJCQlBc2ljU2V0U2xvdFRpbWUocEFkLCBiVXNlU2hvcnRTbG90KTsKIAotCQkJCWJVc2VCR1Byb3RlY3Rpb24gPSAocEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID09IDEpIHx8ICAgIC8vIGFsd2F5cyB1c2UKLQkJCQkJCQkJICAgKChwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPT0gMCkgJiYgRVJQX0lTX1VTRV9QUk9URUNUSU9OKEVycCkpOworCQkJCWJVc2VCR1Byb3RlY3Rpb24gPSAocEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID09IDEpIHx8CS8qIGFsd2F5cyB1c2UgKi8KKwkJCQkgICAgKChwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPT0gMCkKKwkJCQkgICAgICYmIEVSUF9JU19VU0VfUFJPVEVDVElPTihFcnApKTsKIAotCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpIC8vIGFsd2F5cyBubyBCRyBwcm90ZWN0aW9uIGluIEEtYmFuZC4gZmFsc2VseSBoYXBwZW5lZCB3aGVuIHN3aXRjaGluZyBBL0cgYmFuZCB0byBhIGR1YWwtYmFuZCBBUAorCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCS8qIGFsd2F5cyBubyBCRyBwcm90ZWN0aW9uIGluIEEtYmFuZC4gZmFsc2VseSBoYXBwZW5lZCB3aGVuIHN3aXRjaGluZyBBL0cgYmFuZCB0byBhIGR1YWwtYmFuZCBBUCAqLwogCQkJCQliVXNlQkdQcm90ZWN0aW9uID0gRkFMU0U7CiAKLQkJCQlpZiAoYlVzZUJHUHJvdGVjdGlvbiAhPSBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKSkKKwkJCQlpZiAoYlVzZUJHUHJvdGVjdGlvbiAhPQorCQkJCSAgICBPUFNUQVRVU19URVNUX0ZMQUcocEFkLAorCQkJCQkJICAgICAgIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpKQogCQkJCXsKLQkJCQkJaWYgKGJVc2VCR1Byb3RlY3Rpb24pCi0JCQkJCXsKLQkJCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCk7Ci0JCQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsIChPRkRNU0VUUFJPVEVDVHxDQ0tTRVRQUk9URUNUfEFMTE5fU0VUUFJPVEVDVCksRkFMU0UsKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPT0gMSkpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpOwotCQkJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCAoT0ZETVNFVFBST1RFQ1R8Q0NLU0VUUFJPVEVDVHxBTExOX1NFVFBST1RFQ1QpLFRSVUUsKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPT0gMSkpOworCQkJCQlpZiAoYlVzZUJHUHJvdGVjdGlvbikgeworCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLAorCQkJCQkJCQkgIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpOworCQkJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLAorCQkJCQkJCQkgIHBBZC0+TWxtZUF1eC4KKwkJCQkJCQkJICBBZGRIdEluZm8uCisJCQkJCQkJCSAgQWRkSHRJbmZvMi4KKwkJCQkJCQkJICBPcGVyYWlvbk1vZGUsCisJCQkJCQkJCSAgKE9GRE1TRVRQUk9URUNUCisJCQkJCQkJCSAgIHwKKwkJCQkJCQkJICAgQ0NLU0VUUFJPVEVDVAorCQkJCQkJCQkgICB8CisJCQkJCQkJCSAgIEFMTE5fU0VUUFJPVEVDVCksCisJCQkJCQkJCSAgRkFMU0UsCisJCQkJCQkJCSAgKHBBZC0+TWxtZUF1eC4KKwkJCQkJCQkJICAgQWRkSHRJbmZvLgorCQkJCQkJCQkgICBBZGRIdEluZm8yLgorCQkJCQkJCQkgICBOb25HZlByZXNlbnQKKwkJCQkJCQkJICAgPT0gMSkpOworCQkJCQl9IGVsc2UgeworCQkJCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsCisJCQkJCQkJCSAgICBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKTsKKwkJCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwKKwkJCQkJCQkJICBwQWQtPk1sbWVBdXguCisJCQkJCQkJCSAgQWRkSHRJbmZvLgorCQkJCQkJCQkgIEFkZEh0SW5mbzIuCisJCQkJCQkJCSAgT3BlcmFpb25Nb2RlLAorCQkJCQkJCQkgIChPRkRNU0VUUFJPVEVDVAorCQkJCQkJCQkgICB8CisJCQkJCQkJCSAgIENDS1NFVFBST1RFQ1QKKwkJCQkJCQkJICAgfAorCQkJCQkJCQkgICBBTExOX1NFVFBST1RFQ1QpLAorCQkJCQkJCQkgIFRSVUUsCisJCQkJCQkJCSAgKHBBZC0+TWxtZUF1eC4KKwkJCQkJCQkJICAgQWRkSHRJbmZvLgorCQkJCQkJCQkgICBBZGRIdEluZm8yLgorCQkJCQkJCQkgICBOb25HZlByZXNlbnQKKwkJCQkJCQkJICAgPT0gMSkpOwogCQkJCQl9CiAKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJTWU5DIC0gQVAgY2hhbmdlZCBCL0cgcHJvdGVjdGlvbiB0byAlZFxuIiwgYlVzZUJHUHJvdGVjdGlvbikpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLAorCQkJCQkJICgiU1lOQyAtIEFQIGNoYW5nZWQgQi9HIHByb3RlY3Rpb24gdG8gJWRcbiIsCisJCQkJCQkgIGJVc2VCR1Byb3RlY3Rpb24pKTsKIAkJCQl9Ci0KLQkJCQkvLyBjaGVjayBIdCBwcm90ZWN0aW9uIG1vZGUuIGFuZCBhZGhlcmUgdG8gdGhlIE5vbi1HRiBkZXZpY2UgaW5kaWNhdGlvbiBieSBBUC4KKwkJCQkvKiBjaGVjayBIdCBwcm90ZWN0aW9uIG1vZGUuIGFuZCBhZGhlcmUgdG8gdGhlIE5vbi1HRiBkZXZpY2UgaW5kaWNhdGlvbiBieSBBUC4gKi8KIAkJCQlpZiAoKEFkZEh0SW5mb0xlbiAhPSAwKSAmJgotCQkJCQkoKEFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSAhPSBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlKSB8fAotCQkJCQkoQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ICE9IHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpKSkKLQkJCQl7Ci0JCQkJCXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSBBZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQ7Ci0JCQkJCXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUgPSBBZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGU7Ci0JCQkJCWlmIChwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID09IDEpCi0JCQkJewotCQkJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBUUlVFKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIEZBTFNFKTsKKwkJCQkgICAgKChBZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUgIT0KKwkJCQkgICAgICBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuCisJCQkJICAgICAgT3BlcmFpb25Nb2RlKQorCQkJCSAgICAgfHwgKEFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCAhPQorCQkJCQkgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLgorCQkJCQkgTm9uR2ZQcmVzZW50KSkpIHsKKwkJCQkJcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLgorCQkJCQkgICAgTm9uR2ZQcmVzZW50ID0KKwkJCQkJICAgIEFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudDsKKwkJCQkJcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLgorCQkJCQkgICAgT3BlcmFpb25Nb2RlID0KKwkJCQkJICAgIEFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZTsKKwkJCQkJaWYgKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi4KKwkJCQkJICAgIE5vbkdmUHJlc2VudCA9PSAxKSB7CisJCQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsCisJCQkJCQkJCSAgcEFkLT5NbG1lQXV4LgorCQkJCQkJCQkgIEFkZEh0SW5mby4KKwkJCQkJCQkJICBBZGRIdEluZm8yLgorCQkJCQkJCQkgIE9wZXJhaW9uTW9kZSwKKwkJCQkJCQkJICBBTExOX1NFVFBST1RFQ1QsCisJCQkJCQkJCSAgRkFMU0UsIFRSVUUpOworCQkJCQl9IGVsc2UKKwkJCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwKKwkJCQkJCQkJICBwQWQtPk1sbWVBdXguCisJCQkJCQkJCSAgQWRkSHRJbmZvLgorCQkJCQkJCQkgIEFkZEh0SW5mbzIuCisJCQkJCQkJCSAgT3BlcmFpb25Nb2RlLAorCQkJCQkJCQkgIEFMTE5fU0VUUFJPVEVDVCwKKwkJCQkJCQkJICBGQUxTRSwgRkFMU0UpOwogCi0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBBUCBjaGFuZ2VkIE4gT3BlcmFpb25Nb2RlIHRvICVkXG4iLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlKSk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICgiU1lOQyAtIEFQIGNoYW5nZWQgTiBPcGVyYWlvbk1vZGUgdG8gJWRcbiIsCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uCisJCQkJCQkgIEFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlKSk7CiAJCQkJfQogCi0JCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKSAmJgotCQkJCQlFUlBfSVNfVVNFX0JBUktFUl9QUkVBTUJMRShFcnApKQotCQkJCXsKLQkJCQkJTWxtZVNldFR4UHJlYW1ibGUocEFkLCBSdDgwMl8xMVByZWFtYmxlTG9uZyk7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBBUCBmb3JjZWQgdG8gdXNlIExPTkcgcHJlYW1ibGVcbiIpKTsKKwkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHCisJCQkJICAgIChwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKQorCQkJCSAgICAmJiBFUlBfSVNfVVNFX0JBUktFUl9QUkVBTUJMRShFcnApKSB7CisJCQkJCU1sbWVTZXRUeFByZWFtYmxlKHBBZCwKKwkJCQkJCQkgIFJ0ODAyXzExUHJlYW1ibGVMb25nKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgKCJTWU5DIC0gQVAgZm9yY2VkIHRvIHVzZSBsb25nIHByZWFtYmxlXG4iKSk7CiAJCQkJfQogCi0JCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgICAgJiYKLQkJCQkJKEVkY2FQYXJtLmJWYWxpZCA9PSBUUlVFKSAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLQkJCQkJKEVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCAhPSBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCkpCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gQVAgY2hhbmdlIEVEQ0EgcGFyYW1ldGVycyhmcm9tICVkIHRvICVkKVxuIiwKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uRWRjYVVwZGF0ZUNvdW50LAotCQkJCQkJRWRjYVBhcm0uRWRjYVVwZGF0ZUNvdW50KSk7CisJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRworCQkJCSAgICAocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpCisJCQkJICAgICYmIChFZGNhUGFybS5iVmFsaWQgPT0gVFJVRSkKKwkJCQkgICAgJiYgKEVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCAhPQorCQkJCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLgorCQkJCQlFZGNhVXBkYXRlQ291bnQpKSB7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICgiU1lOQyAtIEFQIGNoYW5nZSBFRENBIHBhcmFtZXRlcnMoZnJvbSAlZCB0byAlZClcbiIsCisJCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uCisJCQkJCQkgIEVkY2FVcGRhdGVDb3VudCwKKwkJCQkJCSAgRWRjYVBhcm0uRWRjYVVwZGF0ZUNvdW50KSk7CiAJCQkJCUFzaWNTZXRFZGNhUGFybShwQWQsICZFZGNhUGFybSk7CiAJCQkJfQotCi0JCQkJLy8gY29weSBRT1MgcmVsYXRlZCBpbmZvcm1hdGlvbgotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BUFFic3NMb2FkLCAmUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BUFFvc0NhcGFiaWxpdHksICZRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpOworCQkJCS8qIGNvcHkgUU9TIHJlbGF0ZWQgaW5mb3JtYXRpb24gKi8KKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQVBRYnNzTG9hZCwKKwkJCQkJICAgICAgICZRYnNzTG9hZCwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfcWJzc19sb2FkX3Bhcm0pKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQVBRb3NDYXBhYmlsaXR5LAorCQkJCQkgICAgICAgJlFvc0NhcGFiaWxpdHksCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X3Fvc19jYXBhYmlsaXR5X3Bhcm0pKTsKIAkJCX0KLQotCQkJLy8gb25seSBJTkZSQVNUUlVDVFVSRSBtb2RlIHN1cHBvcnQgcG93ZXItc2F2aW5nIGZlYXR1cmUKLQkJCWlmICgoSU5GUkFfT04ocEFkKSAmJiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSkgfHwgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpKQotCQkJewotCQkJCVVDSEFSIEZyZWVOdW1iZXI7Ci0JCQkJLy8gIDEuIEFQIGhhcyBiYWNrbG9nZ2VkIHVuaWNhc3QtdG8tbWUgZnJhbWUsIHN0YXkgQVdBS0UsIHNlbmQgUFNQT0xMCi0JCQkJLy8gIDIuIEFQIGhhcyBiYWNrbG9nZ2VkIGJyb2FkY2FzdC9tdWx0aWNhc3QgZnJhbWUgYW5kIHdlIHdhbnQgdGhvc2UgZnJhbWVzLCBzdGF5IEFXQUtFCi0JCQkJLy8gIDMuIHdlIGhhdmUgb3V0Z29pbmcgZnJhbWVzIGluIFR4UmluZyBvciBNZ210UmluZywgYmV0dGVyIHN0YXkgQVdBS0UKLQkJCQkvLyAgNC4gUHNtIGNoYW5nZSB0byBQV1JfU0FWRSwgYnV0IEFQIG5vdCBiZWVuIGluZm9ybWVkIHlldCwgd2UgYmV0dGVyIHN0YXkgQVdBS0UKLQkJCQkvLyAgNS4gb3RoZXJ3aXNlLCBwdXQgUEhZIGJhY2sgdG8gc2xlZXAgdG8gc2F2ZSBiYXR0ZXJ5LgotCQkJCWlmIChNZXNzYWdlVG9NZSkKLQkJCQl7Ci0jaWZkZWYgUlQyODYwCi0JCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpCi0JCQkJCXsKLQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIHBBZC0+U3RhQ2ZnLkJCUFIzKTsKKwkJCS8qIG9ubHkgSU5GUkFTVFJVQ1RVUkUgbW9kZSBzdXBwb3J0IHBvd2VyLXNhdmluZyBmZWF0dXJlICovCisJCQlpZiAoKElORlJBX09OKHBBZCkgJiYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkpCisJCQkgICAgfHwgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpKSB7CisJCQkJdTggRnJlZU51bWJlcjsKKwkJCQkvKiAgMS4gQVAgaGFzIGJhY2tsb2dnZWQgdW5pY2FzdC10by1tZSBmcmFtZSwgc3RheSBBV0FLRSwgc2VuZCBQU1BPTEwgKi8KKwkJCQkvKiAgMi4gQVAgaGFzIGJhY2tsb2dnZWQgYnJvYWRjYXN0L211bHRpY2FzdCBmcmFtZSBhbmQgd2Ugd2FudCB0aG9zZSBmcmFtZXMsIHN0YXkgQVdBS0UgKi8KKwkJCQkvKiAgMy4gd2UgaGF2ZSBvdXRnb2luZyBmcmFtZXMgaW4gVHhSaW5nIG9yIE1nbXRSaW5nLCBiZXR0ZXIgc3RheSBBV0FLRSAqLworCQkJCS8qICA0LiBQc20gY2hhbmdlIHRvIFBXUl9TQVZFLCBidXQgQVAgbm90IGJlZW4gaW5mb3JtZWQgeWV0LCB3ZSBiZXR0ZXIgc3RheSBBV0FLRSAqLworCQkJCS8qICA1LiBvdGhlcndpc2UsIHB1dCBQSFkgYmFjayB0byBzbGVlcCB0byBzYXZlIGJhdHRlcnkuICovCisJCQkJaWYgKE1lc3NhZ2VUb01lKSB7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcKKwkJCQkJICAgIChwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKSB7CisJCQkJCQkvKiBSZXN0b3JlIHRvIGNvcnJlY3QgQkJQIFIzIHZhbHVlICovCisJCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+CisJCQkJCQkgICAgMSkKKwkJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lECisJCQkJCQkJICAgIChwQWQsIEJCUF9SMywKKwkJCQkJCQkgICAgIHBBZC0+U3RhQ2ZnLkJCUFIzKTsKKwkJCQkJCS8qIFR1cm4gY2xrIHRvIDgwTWh6LiAqLwogCQkJCQl9Ci0jZW5kaWYKLQkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSAmJgotCQkJCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRSAmJiBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLICYmIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgJiYgcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTykKLQkJCQkJewotCQkJCQkJcEFkLT5Db21tb25DZmcuYk5lZWRTZW5kVHJpZ2dlckZyYW1lID0gVFJVRTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQlSVDI4WFhfUFNfUE9MTF9FTlFVRVVFKHBBZCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKEJjYXN0RmxhZyAmJiAoRHRpbUNvdW50ID09IDApICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKSkKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKwkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZQorCQkJCQkgICAgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS4KKwkJCQkJICAgIGJBUFNEQ2FwYWJsZQorCQkJCQkgICAgJiYgcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRQorCQkJCQkgICAgJiYgcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CSworCQkJCQkgICAgJiYgcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSQorCQkJCQkgICAgJiYgcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTykgeworCQkJCQkJcEFkLT5Db21tb25DZmcuCisJCQkJCQkgICAgYk5lZWRTZW5kVHJpZ2dlckZyYW1lID0KKwkJCQkJCSAgICBUUlVFOworCQkJCQl9IGVsc2UKKwkJCQkJCVJUTVBfUFNfUE9MTF9FTlFVRVVFKHBBZCk7CisJCQkJfSBlbHNlIGlmIChCY2FzdEZsYWcgJiYgKER0aW1Db3VudCA9PSAwKQorCQkJCQkgICAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLAorCQkJCQkJCQkgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pKQogCQkJCXsKLSNpZmRlZiBSVDI4NjAKLQkJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKLQkJCQkJewotCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgcEFkLT5TdGFDZmcuQkJQUjMpOworI2lmZGVmIFJUTVBfTUFDX1BDSQorCQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHCisJCQkJCSAgICAocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkgeworCQkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPgorCQkJCQkJICAgIDEpCisJCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRAorCQkJCQkJCSAgICAocEFkLCBCQlBfUjMsCisJCQkJCQkJICAgICBwQWQtPlN0YUNmZy5CQlBSMyk7CiAJCQkJCX0KLSNlbmRpZgotCQkJCX0KLQkJCQllbHNlIGlmICgocEFkLT5UeFN3UXVldWVbUUlEX0FDX0JLXS5OdW1iZXIgIT0gMCkJCQkJCQkJCQkJCQkJfHwKLQkJCQkJCShwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQkVdLk51bWJlciAhPSAwKQkJCQkJCQkJCQkJCQkJfHwKLQkJCQkJCShwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVkldLk51bWJlciAhPSAwKQkJCQkJCQkJCQkJCQkJfHwKLQkJCQkJCShwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dLk51bWJlciAhPSAwKQkJCQkJCQkJCQkJCQkJfHwKLQkJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QocEFkLCBRSURfQUNfQkssIFRYX1JJTkdfU0laRSAtIDEsICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQl8fAotCQkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgVFhfUklOR19TSVpFIC0gMSwgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCXx8Ci0JCQkJCQkoUlRNUEZyZWVUWERSZXF1ZXN0KHBBZCwgUUlEX0FDX1ZJLCBUWF9SSU5HX1NJWkUgLSAxLCAmRnJlZU51bWJlcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykJfHwKLQkJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QocEFkLCBRSURfQUNfVk8sIFRYX1JJTkdfU0laRSAtIDEsICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQl8fAotCQkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdChwQWQsIFFJRF9NR01ULCBNR01UX1JJTkdfU0laRSAtIDEsICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKSkKLQkJCQl7Ci0JCQkJCS8vIFRPRE86IGNvbnNpZGVyIHNjaGVkdWxlZCBIQ0NBLiBtaWdodCBub3QgYmUgcHJvcGVyIHRvIHVzZSB0cmFkaXRpb25hbCBEVElNLWJhc2VkIHBvd2VyLXNhdmluZyBzY2hlbWUKLQkJCQkJLy8gY2FuIHdlIGNoZWF0IGhlcmUgKGkuZS4ganVzdCBjaGVjayBNR01UICYgQUNfQkUpIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2U/Ci0jaWZkZWYgUlQyODYwCi0JCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpCi0JCQkJCXsKLQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIHBBZC0+U3RhQ2ZnLkJCUFIzKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKwkJCQl9IGVsc2UKKwkJCQkgICAgaWYgKChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdLk51bWJlciAhPSAwKQorCQkJCQl8fCAocEFkLT5UeFN3UXVldWVbUUlEX0FDX0JFXS5OdW1iZXIgIT0KKwkJCQkJICAgIDApCisJCQkJCXx8IChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVkldLk51bWJlciAhPQorCQkJCQkgICAgMCkKKwkJCQkJfHwgKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WT10uTnVtYmVyICE9CisJCQkJCSAgICAwKQorCQkJCQl8fAorCQkJCQkoUlRNUEZyZWVUWERSZXF1ZXN0CisJCQkJCSAocEFkLCBRSURfQUNfQkssIFRYX1JJTkdfU0laRSAtIDEsCisJCQkJCSAgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJCXx8CisJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QKKwkJCQkJIChwQWQsIFFJRF9BQ19CRSwgVFhfUklOR19TSVpFIC0gMSwKKwkJCQkJICAmRnJlZU51bWJlcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQkJfHwKKwkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdAorCQkJCQkgKHBBZCwgUUlEX0FDX1ZJLCBUWF9SSU5HX1NJWkUgLSAxLAorCQkJCQkgICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCQl8fAorCQkJCQkoUlRNUEZyZWVUWERSZXF1ZXN0CisJCQkJCSAocEFkLCBRSURfQUNfVk8sIFRYX1JJTkdfU0laRSAtIDEsCisJCQkJCSAgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJCXx8CisJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QKKwkJCQkJIChwQWQsIFFJRF9NR01ULCBNR01UX1JJTkdfU0laRSAtIDEsCisJCQkJCSAgJkZyZWVOdW1iZXIpICE9CisJCQkJCSBORElTX1NUQVRVU19TVUNDRVNTKSkgeworCQkJCQkvKiBUT0RPOiBjb25zaWRlciBzY2hlZHVsZWQgSENDQS4gbWlnaHQgbm90IGJlIHByb3BlciB0byB1c2UgdHJhZGl0aW9uYWwgRFRJTS1iYXNlZCBwb3dlci1zYXZpbmcgc2NoZW1lICovCisJCQkJCS8qIGNhbiB3ZSBjaGVhdCBoZXJlIChpLmUuIGp1c3QgY2hlY2sgTUdNVCAmIEFDX0JFKSBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlPyAqLworI2lmZGVmIFJUTVBfTUFDX1BDSQorCQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHCisJCQkJCSAgICAocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkgeworCQkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPgorCQkJCQkJICAgIDEpCisJCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRAorCQkJCQkJCSAgICAocEFkLCBCQlBfUjMsCisJCQkJCQkJICAgICBwQWQtPlN0YUNmZy5CQlBSMyk7CiAJCQkJCX0KLSNlbmRpZgotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlVU0hPUlQgTmV4dER0aW0gPSBEdGltQ291bnQ7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKChwQWQtPkNvbW1vbkNmZy4KKwkJCQkJICAgICBiQUNNQVBTRFRyW1FJRF9BQ19WT10pCisJCQkJCSAgICB8fCAocEFkLT5Db21tb25DZmcuCisJCQkJCQliQUNNQVBTRFRyW1FJRF9BQ19WSV0pCisJCQkJCSAgICB8fCAocEFkLT5Db21tb25DZmcuCisJCQkJCQliQUNNQVBTRFRyW1FJRF9BQ19CS10pCisJCQkJCSAgICB8fCAocEFkLT5Db21tb25DZmcuCisJCQkJCQliQUNNQVBTRFRyW1FJRF9BQ19CRV0pKSB7CisJCQkJCQkvKgorCQkJCQkJICAgV01NIFNwZWMgdjEuMCAzLjYuMi40LAorCQkJCQkJICAgVGhlIFdNTSBTVEEgc2hhbGwgcmVtYWluIGF3YWtlIHVudGlsIGl0IHJlY2VpdmVzIGEKKwkJCQkJCSAgIFFvUyBEYXRhIG9yIE51bGwgZnJhbWUgYWRkcmVzc2VkIHRvIGl0LCB3aXRoIHRoZQorCQkJCQkJICAgRU9TUCBzdWJmaWVsZCBpbiBRb1MgQ29udHJvbCBmaWVsZCBzZXQgdG8gMS4KIAotCQkJCQlpZiAoTmV4dER0aW0gPT0gMCkKLQkJCQkJCU5leHREdGltID0gRHRpbVBlcmlvZDsKKwkJCQkJCSAgIFNvIHdlIGNhbiBub3Qgc2xlZXAgaGVyZSBvciB3ZSB3aWxsIHN1ZmZlciBhIGNhc2U6CiAKLQkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudDsKLQkJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKSAmJiAoVGJ0dE51bVRvTmV4dFdha2VVcCA+IE5leHREdGltKSkKLQkJCQkJCVRidHROdW1Ub05leHRXYWtlVXAgPSBOZXh0RHRpbTsKKwkJCQkJCSAgIFBTIE1hbmFnZW1lbnQgRnJhbWUgLS0+CisJCQkJCQkgICBUcmlnZ2VyIGZyYW1lIC0tPgorCQkJCQkJICAgQmVhY29uIChUSU09MCkgKEJlYWNvbiBpcyBjbG9zZXIgdG8gVHJpZyBmcmFtZSkgLS0+CisJCQkJCQkgICBTdGF0aW9uIGdvZXMgdG8gc2xlZXAgLS0+CisJCQkJCQkgICBBUCBkZWxpdmVyeSBxdWV1ZWQgVUFQU0QgcGFja2V0cyAtLT4KKwkJCQkJCSAgIFN0YXRpb24gY2FuIE5PVCByZWNlaXZlIHRoZSByZXBseQogCi0JCQkJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLQkJCQkJewotI2lmZGVmIFJUMjg2MAotCQkJCQkJLy8gU2V0IGEgZmxhZyB0byBnbyB0byBzbGVlcCAuIFRoZW4gYWZ0ZXIgcGFyc2UgdGhpcyBSeERvbmVJbnRlcnJ1cHQsIHdpbGwgZ28gdG8gc2xlZXAgbW9kZS4KLQkJCQkJCVJUTVBfU0VUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0dPX1RPX1NMRUVQX05PVyk7Ci0JCQkJCQlwQWQtPlRoaXNUYnR0TnVtVG9OZXh0V2FrZVVwID0gVGJ0dE51bVRvTmV4dFdha2VVcDsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQkJCQkJQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAocEFkLCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKLSNlbmRpZgorCQkJCQkJICAgTWF5YmUgd2UgbmVlZCBhIHRpbWVvdXQgdGltZXIgdG8gYXZvaWQgdGhhdCB3ZSBkbworCQkJCQkJICAgTk9UIHJlY2VpdmUgdGhlIEVPU1AgZnJhbWUuCisKKwkJCQkJCSAgIFdlIGNhbiBub3QgdXNlIE1vcmUgRGF0YSB0byBjaGVjayBpZiBTUCBpcyBlbmRlZAorCQkJCQkJICAgZHVlIHRvIE1heFNQTGVuZ3RoLgorCQkJCQkJICovCisJCQkJCX0gZWxzZSB7CisJCQkJCQl1MTYgTmV4dER0aW0gPSBEdGltQ291bnQ7CisKKwkJCQkJCWlmIChOZXh0RHRpbSA9PSAwKQorCQkJCQkJCU5leHREdGltID0gRHRpbVBlcmlvZDsKKworCQkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9CisJCQkJCQkgICAgcEFkLT5TdGFDZmcuCisJCQkJCQkgICAgRGVmYXVsdExpc3RlbkNvdW50OworCQkJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRworCQkJCQkJICAgIChwQWQsCisJCQkJCQkgICAgIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKQorCQkJCQkJICAgICYmIChUYnR0TnVtVG9OZXh0V2FrZVVwID4KKwkJCQkJCQlOZXh0RHRpbSkpCisJCQkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9CisJCQkJCQkJICAgIE5leHREdGltOworCisJCQkJCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRworCQkJCQkJICAgIChwQWQsIGZPUF9TVEFUVVNfRE9aRSkpIHsKKwkJCQkJCQkvKiBTZXQgYSBmbGFnIHRvIGdvIHRvIHNsZWVwIC4gVGhlbiBhZnRlciBwYXJzZSB0aGlzIFJ4RG9uZUludGVycnVwdCwgd2lsbCBnbyB0byBzbGVlcCBtb2RlLiAqLworCQkJCQkJCXBBZC0+CisJCQkJCQkJICAgIFRoaXNUYnR0TnVtVG9OZXh0V2FrZVVwCisJCQkJCQkJICAgID0KKwkJCQkJCQkgICAgVGJ0dE51bVRvTmV4dFdha2VVcDsKKwkJCQkJCQlBc2ljU2xlZXBUaGVuQXV0b1dha2V1cAorCQkJCQkJCSAgICAocEFkLAorCQkJCQkJCSAgICAgcEFkLT4KKwkJCQkJCQkgICAgIFRoaXNUYnR0TnVtVG9OZXh0V2FrZVVwKTsKKwkJCQkJCX0KIAkJCQkJfQogCQkJCX0KIAkJCX0KIAkJfQotCQkvLyBub3QgbXkgQlNTSUQsIGlnbm9yZSBpdAorCQkvKiBub3QgbXkgQlNTSUQsIGlnbm9yZSBpdCAqLwogCX0KLQkvLyBzYW5pdHkgY2hlY2sgZmFpbCwgaWdub3JlIHRoaXMgZnJhbWUKKwkvKiBzYW5pdHkgY2hlY2sgZmFpbCwgaWdub3JlIHRoaXMgZnJhbWUgKi8KIH0KIAogLyoKQEAgLTE2MTIsMTE2ICsxNzAzLDEyNiBAQAogCQlSZWNlaXZlIFBST0JFIFJFUSBmcm9tIHJlbW90ZSBwZWVyIHdoZW4gb3BlcmF0aW5nIGluIElCU1MgbW9kZQogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgUGVlclByb2JlUmVxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgUGVlclByb2JlUmVxQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVQ0hBUiAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07Ci0JQ0hBUiAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07Ci0JVUNIQVIgICAgICAgICBTc2lkTGVuOwotCVVDSEFSCQkgIEh0TGVuLCBBZGRIdExlbiwgTmV3RXh0TGVuOwotCUhFQURFUl84MDJfMTEgUHJvYmVSc3BIZHI7Ci0JTkRJU19TVEFUVVMgICBOU3RhdHVzOwotCVBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7CisJdTggQWRkcjJbTUFDX0FERFJfTEVOXTsKKwljaGFyIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKwl1OCBTc2lkTGVuOworCXU4IEh0TGVuLCBBZGRIdExlbiwgTmV3RXh0TGVuOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIFByb2JlUnNwSGRyOworCWludCBOU3RhdHVzOworCXU4ICpwT3V0QnVmZmVyID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuID0gMDsKIAlMQVJHRV9JTlRFR0VSIEZha2VUaW1lc3RhbXA7Ci0JVUNIQVIgICAgICAgICBEc0xlbiA9IDEsIElic3NMZW4gPSAyOwotCVVDSEFSICAgICAgICAgTG9jYWxFcnBJZVszXSA9IHtJRV9FUlAsIDEsIDB9OwotCUJPT0xFQU4gICAgICAgUHJpdmFjeTsKLQlVU0hPUlQgICAgICAgIENhcGFiaWxpdHlJbmZvOwotCVVDSEFSCQkgIFJTTkllID0gSUVfV1BBOworCXU4IERzTGVuID0gMSwgSWJzc0xlbiA9IDI7CisJdTggTG9jYWxFcnBJZVszXSA9IHsgSUVfRVJQLCAxLCAwIH07CisJQk9PTEVBTiBQcml2YWN5OworCXUxNiBDYXBhYmlsaXR5SW5mbzsKKwl1OCBSU05JZSA9IElFX1dQQTsKIAotCWlmICghIEFESE9DX09OKHBBZCkpCisJaWYgKCFBREhPQ19PTihwQWQpKQogCQlyZXR1cm47CiAKLQlpZiAoUGVlclByb2JlUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCBTc2lkLCAmU3NpZExlbikpCi0JewotCQlpZiAoKFNzaWRMZW4gPT0gMCkgfHwgU1NJRF9FUVVBTChTc2lkLCBTc2lkTGVuLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKSkKLQkJewotCQkJLy8gYWxsb2NhdGUgYW5kIHNlbmQgb3V0IFByb2JlUnNwIGZyYW1lCi0JCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmIChQZWVyUHJvYmVSZXFTYW5pdHkKKwkgICAgKHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCBTc2lkLCAmU3NpZExlbikpIHsKKwkJaWYgKChTc2lkTGVuID09IDApCisJCSAgICB8fCBTU0lEX0VRVUFMKFNzaWQsIFNzaWRMZW4sIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCisJCQkJICBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKSkgeworCQkJLyogYWxsb2NhdGUgYW5kIHNlbmQgb3V0IFByb2JlUnNwIGZyYW1lICovCisJCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwkvKkdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5ICovCiAJCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQogCQkJCXJldHVybjsKIAotCQkJLy9wQWQtPlN0YUNmZy5BdGltV2luID0gMDsgIC8vID8/Pz8/PworCQkJLypwQWQtPlN0YUNmZy5BdGltV2luID0gMDsgIC8vID8/Pz8/PyAqLwogCi0JCQlQcml2YWN5ID0gKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSB8fAotCQkJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKLQkJCQkJICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpOwotCQkJQ2FwYWJpbGl0eUluZm8gPSBDQVBfR0VORVJBVEUoMCwgMSwgUHJpdmFjeSwgKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZVNob3J0KSwgMCwgMCk7CisJCQlQcml2YWN5ID0KKwkJCSAgICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09CisJCQkgICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpCisJCQkgICAgfHwgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PQorCQkJCU5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCQkgICAgfHwgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PQorCQkJCU5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpOworCQkJQ2FwYWJpbGl0eUluZm8gPQorCQkJICAgIENBUF9HRU5FUkFURSgwLCAxLCBQcml2YWN5LAorCQkJCQkgKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPT0KKwkJCQkJICBSdDgwMl8xMVByZWFtYmxlU2hvcnQpLCAwLCAwKTsKIAotCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotCQkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAgICAgJlByb2JlUnNwSGRyLAotCQkJCQkJCSAgVElNRVNUQU1QX0xFTiwgICAgICAgICAgICAgICAgJkZha2VUaW1lc3RhbXAsCi0JCQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kLAotCQkJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNhcGFiaWxpdHlJbmZvLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLAotCQkJCQkJCSAgcEFkLT5Db21tb25DZmcuU3NpZExlbiwgICAgICAgcEFkLT5Db21tb25DZmcuU3NpZCwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiwKLQkJCQkJCQkgIHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sICAgIHBBZC0+U3RhQWN0aXZlLlN1cFJhdGUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRHNJZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEc0xlbiwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5DaGFubmVsLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklic3NJZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJYnNzTGVuLAotCQkJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQWN0aXZlLkF0aW1XaW4sCi0JCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAmRnJhbWVMZW4sCisJCQkJCSAgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSwgJlByb2JlUnNwSGRyLAorCQkJCQkgIFRJTUVTVEFNUF9MRU4sICZGYWtlVGltZXN0YW1wLAorCQkJCQkgIDIsICZwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QsCisJCQkJCSAgMiwgJkNhcGFiaWxpdHlJbmZvLAorCQkJCQkgIDEsICZTc2lkSWUsCisJCQkJCSAgMSwgJnBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sCisJCQkJCSAgcEFkLT5Db21tb25DZmcuU3NpZExlbiwKKwkJCQkJICBwQWQtPkNvbW1vbkNmZy5Tc2lkLCAxLCAmU3VwUmF0ZUllLCAxLAorCQkJCQkgICZwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLAorCQkJCQkgIHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sCisJCQkJCSAgcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZSwgMSwgJkRzSWUsIDEsCisJCQkJCSAgJkRzTGVuLCAxLCAmcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgMSwKKwkJCQkJICAmSWJzc0llLCAxLCAmSWJzc0xlbiwgMiwKKwkJCQkJICAmcEFkLT5TdGFBY3RpdmUuQXRpbVdpbiwgRU5EX09GX0FSR1MpOwogCi0JCQlpZiAocEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbikKLQkJCXsKLQkJCQlVTE9ORyB0bXA7Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgJnRtcCwKLQkJCQkJCQkJICAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbEVycEllLAotCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCi0JCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4sCi0JCQkJCQkJCSAgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiwgICAgJnBBZC0+U3RhQWN0aXZlLkV4dFJhdGUsCi0JCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJaWYgKHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4pIHsKKwkJCQl1bnNpZ25lZCBsb25nIHRtcDsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICZ0bXAsCisJCQkJCQkgIDMsIExvY2FsRXJwSWUsCisJCQkJCQkgIDEsICZFeHRSYXRlSWUsCisJCQkJCQkgIDEsICZwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuLAorCQkJCQkJICBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuLAorCQkJCQkJICAmcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IHRtcDsKKwkJCX0KKwkJCS8qIElmIGFkaG9jIHNlY3J1aXR5IGlzIHNldCBmb3IgV1BBLU5vbmUsIGFwcGVuZCB0aGUgY2lwaGVyIHN1aXRlIElFICovCisJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgeworCQkJCXVuc2lnbmVkIGxvbmcgdG1wOworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJCSAgMSwgJlJTTkllLAorCQkJCQkJICAxLCAmcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAorCQkJCQkJICBwQWQtPlN0YUNmZy5SU05JRV9MZW4sCisJCQkJCQkgIHBBZC0+U3RhQ2ZnLlJTTl9JRSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOwogCQkJCUZyYW1lTGVuICs9IHRtcDsKIAkJCX0KIAotCQkJLy8gSWYgYWRob2Mgc2VjcnVpdHkgaXMgc2V0IGZvciBXUEEtTm9uZSwgYXBwZW5kIHRoZSBjaXBoZXIgc3VpdGUgSUUKLQkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotCQkJewotCQkJCVVMT05HIHRtcDsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAJJnRtcCwKLQkJCQkJCSAgCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUlNOSWUsCi0JCQkJCQkgIAkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkmcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAotCQkJCQkJICAJCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4sICAgICAgCXBBZC0+U3RhQ2ZnLlJTTl9JRSwKLQkJCQkJCSAgCQkJRU5EX09GX0FSR1MpOwotCQkJCUZyYW1lTGVuICs9IHRtcDsKLQkJCX0KLQotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKLQkJCXsKLQkJCQlVTE9ORyBUbXBMZW47Ci0JCQkJVUNIQVIJQlJPQURDT01bNF0gPSB7MHgwLCAweDkwLCAweDRjLCAweDMzfTsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpIHsKKwkJCQl1bnNpZ25lZCBsb25nIFRtcExlbjsKKwkJCQl1OCBCUk9BRENPTVs0XSA9IHsgMHgwLCAweDkwLCAweDRjLCAweDMzIH07CiAJCQkJSHRMZW4gPSBzaXplb2YocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5KTsKIAkJCQlBZGRIdExlbiA9IHNpemVvZihwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pOwogCQkJCU5ld0V4dExlbiA9IDE7Ci0JCQkJLy9OZXcgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0IElFIGlzIGluY2x1ZGVkIGluIEJlYWNvbiwgUHJvYmUgUnNwIG9yIGNoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBGcmFtZQotCQkJCWlmIChwQWQtPmJCcm9hZENvbUhUID09IFRSVUUpCi0JCQkJewotCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJldwYUllLAotCQkJCQkJCQkgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQlJPQURDT01bMF0sCi0JCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXBMZW4sCi0JCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAotCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCi0JCQkJCQkJCSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSksICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCi0JCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBZGRIdEluZm9JZSwKLQkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFkZEh0TGVuLAotCQkJCQkJCQkgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSwgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywKLQkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk5ld0V4dENoYW5JZSwKLQkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk5ld0V4dExlbiwKLQkJCQkJCQkJIHNpemVvZihORVdfRVhUX0NIQU5fSUUpLCAgICAgICAgICAmcEFkLT5Db21tb25DZmcuTmV3RXh0Q2hhbk9mZnNldCwKLQkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJLypOZXcgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0IElFIGlzIGluY2x1ZGVkIGluIEJlYWNvbiwgUHJvYmUgUnNwIG9yIGNoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBGcmFtZSAqLworCQkJCWlmIChwQWQtPmJCcm9hZENvbUhUID09IFRSVUUpIHsKKwkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAorCQkJCQkJCSAgJlRtcExlbiwgMSwgJldwYUllLCA0LAorCQkJCQkJCSAgJkJST0FEQ09NWzBdLAorCQkJCQkJCSAgcEFkLT5NbG1lQXV4LgorCQkJCQkJCSAgSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCSAgJnBBZC0+TWxtZUF1eC4KKwkJCQkJCQkgIEh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCQl9IGVsc2UgeworCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCisJCQkJCQkJICAmVG1wTGVuLCAxLCAmSHRDYXBJZSwKKwkJCQkJCQkgIDEsICZIdExlbiwKKwkJCQkJCQkgIHNpemVvZgorCQkJCQkJCSAgKHN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llKSwKKwkJCQkJCQkgICZwQWQtPkNvbW1vbkNmZy4KKwkJCQkJCQkgIEh0Q2FwYWJpbGl0eSwgMSwKKwkJCQkJCQkgICZBZGRIdEluZm9JZSwgMSwKKwkJCQkJCQkgICZBZGRIdExlbiwKKwkJCQkJCQkgIHNpemVvZgorCQkJCQkJCSAgKHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSksCisJCQkJCQkJICAmcEFkLT5Db21tb25DZmcuCisJCQkJCQkJICBBZGRIVEluZm8sIDEsCisJCQkJCQkJICAmTmV3RXh0Q2hhbkllLCAxLAorCQkJCQkJCSAgJk5ld0V4dExlbiwKKwkJCQkJCQkgIHNpemVvZgorCQkJCQkJCSAgKHN0cnVjdCBydF9uZXdfZXh0X2NoYW5faWUpLAorCQkJCQkJCSAgJnBBZC0+Q29tbW9uQ2ZnLgorCQkJCQkJCSAgTmV3RXh0Q2hhbk9mZnNldCwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKIAkJCQl9CiAJCQkJRnJhbWVMZW4gKz0gVG1wTGVuOwogCQkJfQpAQCAtMTczMiwxMSArMTgzMyw5IEBACiAJfQogfQogCi1WT0lEIEJlYWNvblRpbWVvdXRBdEpvaW5BY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBCZWFjb25UaW1lb3V0QXRKb2luQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVU0hPUlQgU3RhdHVzOworCXUxNiBTdGF0dXM7CiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEJlYWNvblRpbWVvdXRBdEpvaW5BY3Rpb25cbiIpKTsKIAlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOwogCVN0YXR1cyA9IE1MTUVfUkVKX1RJTUVPVVQ7CkBAIC0xNzQ5LDIwICsxODQ4LDE4IEBACiAJCVNjYW4gdGltZW91dCBwcm9jZWR1cmUuIGJhc2ljYWxseSBhZGQgY2hhbm5lbCBpbmRleCBieSAxIGFuZCByZXNjYW4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIFNjYW5UaW1lb3V0QWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgU2NhblRpbWVvdXRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewogCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gTmV4dENoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7CiAKLQkvLyBPbmx5IG9uZSBjaGFubmVsIHNjYW5uZWQgZm9yIENJU0NPIGJlYWNvbiByZXF1ZXN0CisJLyogT25seSBvbmUgY2hhbm5lbCBzY2FubmVkIGZvciBDSVNDTyBiZWFjb24gcmVxdWVzdCAqLwogCWlmICgocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQUNUSVZFKSB8fAotCQkocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fUEFTU0lWRSkgfHwKLQkJKHBBZC0+TWxtZUF1eC5TY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX05PSVNFKSB8fAotCQkocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEKSkKKwkgICAgKHBBZC0+TWxtZUF1eC5TY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX1BBU1NJVkUpIHx8CisJICAgIChwQWQtPk1sbWVBdXguU2NhblR5cGUgPT0gU0NBTl9DSVNDT19OT0lTRSkgfHwKKwkgICAgKHBBZC0+TWxtZUF1eC5TY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRCkpCiAJCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gMDsKIAotCS8vIHRoaXMgcm91dGluZSB3aWxsIHN0b3AgaWYgcEFkLT5NbG1lQXV4LkNoYW5uZWwgPT0gMAorCS8qIHRoaXMgcm91dGluZSB3aWxsIHN0b3AgaWYgcEFkLT5NbG1lQXV4LkNoYW5uZWwgPT0gMCAqLwogCVNjYW5OZXh0Q2hhbm5lbChwQWQpOwogfQogCkBAIC0xNzcxLDEyICsxODY4LDEyIEBACiAJRGVzY3JpcHRpb246CiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBJbnZhbGlkU3RhdGVXaGVuU2NhbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIEludmFsaWRTdGF0ZVdoZW5TY2FuKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVU0hPUlQgU3RhdHVzOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFZTkMgLSBJbnZhbGlkU3RhdGVXaGVuU2NhbihzdGF0ZT0lbGQpLiBSZXNldCBTWU5DIG1hY2hpbmVcbiIsIHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUpKTsKKwl1MTYgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJBWU5DIC0gSW52YWxpZFN0YXRlV2hlblNjYW4oc3RhdGU9JWxkKS4gUmVzZXQgU1lOQyBtYWNoaW5lXG4iLAorCQkgIHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUpKTsKIAlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOwogCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CiAJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwgMiwgJlN0YXR1cyk7CkBAIC0xNzg3LDEyICsxODg0LDEyIEBACiAJRGVzY3JpcHRpb246CiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBJbnZhbGlkU3RhdGVXaGVuSm9pbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIEludmFsaWRTdGF0ZVdoZW5Kb2luKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVU0hPUlQgU3RhdHVzOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkludmFsaWRTdGF0ZVdoZW5Kb2luKHN0YXRlPSVsZCkuIFJlc2V0IFNZTkMgbWFjaGluZVxuIiwgcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSkpOworCXUxNiBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkludmFsaWRTdGF0ZVdoZW5Kb2luKHN0YXRlPSVsZCkuIFJlc2V0IFNZTkMgbWFjaGluZVxuIiwKKwkJICBwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlKSk7CiAJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKIAlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOwogCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9KT0lOX0NPTkYsIDIsICZTdGF0dXMpOwpAQCAtMTgwMywxMiArMTkwMCwxMiBAQAogCURlc2NyaXB0aW9uOgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgSW52YWxpZFN0YXRlV2hlblN0YXJ0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgSW52YWxpZFN0YXRlV2hlblN0YXJ0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVU0hPUlQgU3RhdHVzOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkludmFsaWRTdGF0ZVdoZW5TdGFydChzdGF0ZT0lbGQpLiBSZXNldCBTWU5DIG1hY2hpbmVcbiIsIHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUpKTsKKwl1MTYgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJJbnZhbGlkU3RhdGVXaGVuU3RhcnQoc3RhdGU9JWxkKS4gUmVzZXQgU1lOQyBtYWNoaW5lXG4iLAorCQkgIHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUpKTsKIAlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOwogCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CiAJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NUQVJUX0NPTkYsIDIsICZTdGF0dXMpOwpAQCAtMTgyMiw1NCArMTkxOSw1MSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBFbnF1ZXVlUHNQb2xsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQordm9pZCBFbnF1ZXVlUHNQb2xsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlpZiAocEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUCkKLSAgICAJcEFkLT5Qc1BvbGxGcmFtZS5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7Ci0JTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCAoUFVDSEFSKSZwQWQtPlBzUG9sbEZyYW1lLCBzaXplb2YoUFNQT0xMX0ZSQU1FKSk7Ci19CiAKKwlpZiAocEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUCkKKwkJcEFkLT5Qc1BvbGxGcmFtZS5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCAodTggKikmIHBBZC0+UHNQb2xsRnJhbWUsCisJCQkgIHNpemVvZihzdHJ1Y3QgcnRfcHNwb2xsX2ZyYW1lKSk7Cit9CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAlEZXNjcmlwdGlvbjoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEVucXVldWVQcm9iZVJlcXVlc3QoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCit2b2lkIEVucXVldWVQcm9iZVJlcXVlc3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCU5ESVNfU1RBVFVTICAgICBOU3RhdGU7Ci0JUFVDSEFSICAgICAgICAgIHBPdXRCdWZmZXI7Ci0JVUxPTkcgICAgICAgICAgIEZyYW1lTGVuID0gMDsKLQlIRUFERVJfODAyXzExICAgSGRyODAyMTE7CisJaW50IE5TdGF0ZTsKKwl1OCAqcE91dEJ1ZmZlcjsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuID0gMDsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBIZHI4MDIxMTsKIAogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImZvcmNlIG91dCBhIFByb2JlUmVxdWVzdCAuLi5cbiIpKTsKIAotCU5TdGF0ZSA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZiAoTlN0YXRlID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLCBTVUJUWVBFX1BST0JFX1JFUSwgMCwgQlJPQURDQVNUX0FERFIsIEJST0FEQ0FTVF9BRERSKTsKKwlOU3RhdGUgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CS8qR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkgKi8KKwlpZiAoTlN0YXRlID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZIZHI4MDIxMSwgU1VCVFlQRV9QUk9CRV9SRVEsIDAsCisJCQkJIEJST0FEQ0FTVF9BRERSLCBCUk9BRENBU1RfQUREUik7CiAKLQkJLy8gdGhpcyBQcm9iZVJlcXVlc3QgZXhwbGljaXRseSBzcGVjaWZ5IFNTSUQgdG8gcmVkdWNlIHVud2FudGVkIFByb2JlUmVzcG9uc2UKLQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAgICAgICAmRnJhbWVMZW4sCi0JCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgICAgICAgJkhkcjgwMjExLAotCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkSWUsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sCi0JCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sCQkgIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVJZSwKLQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiwKLQkJCQkJCSAgcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiwgICAgICBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlLAotCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCS8qIHRoaXMgUHJvYmVSZXF1ZXN0IGV4cGxpY2l0bHkgc3BlY2lmeSBTU0lEIHRvIHJlZHVjZSB1bndhbnRlZCBQcm9iZVJlc3BvbnNlICovCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICZGcmFtZUxlbiwKKwkJCQkgIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSksICZIZHI4MDIxMSwKKwkJCQkgIDEsICZTc2lkSWUsCisJCQkJICAxLCAmcEFkLT5Db21tb25DZmcuU3NpZExlbiwKKwkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCisJCQkJICAxLCAmU3VwUmF0ZUllLAorCQkJCSAgMSwgJnBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sCisJCQkJICBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLAorCQkJCSAgcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZSwgRU5EX09GX0FSR1MpOwogCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIAkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKIAl9CiAKIH0KIAotQk9PTEVBTiBTY2FuUnVubmluZygKLQkJSU4gUFJUTVBfQURBUFRFUiBwQWQpCitCT09MRUFOIFNjYW5SdW5uaW5nKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKIAlyZXR1cm4gKHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPT0gU0NBTl9MSVNURU4pID8gVFJVRSA6IEZBTFNFOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS93cGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3dwYS5jCmluZGV4IDhjMzRlMzkuLjY5YjhhMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3dwYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3dwYS5jCkBAIC0zNywxODEzICszNyw3IEBACiAqLwogI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgogCi0jZGVmaW5lCQlXUEFSU05JRQkweGRkCi0jZGVmaW5lCQlXUEEyUlNOSUUJMHgzMAotCi0vL2V4dGVybiBVQ0hBUiBCSVQ4W107Ci1VQ0hBUglDaXBoZXJXcGFQc2tUa2lwW10gPSB7Ci0JCTB4REQsIDB4MTYsCQkJCS8vIFJTTiBJRQotCQkweDAwLCAweDUwLCAweGYyLCAweDAxLAkvLyBvdWkKLQkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgotCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyBNdWx0aWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVuaWNhc3QKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gdW5pY2FzdAotCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCi0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIJLy8gYXV0aGVudGljYXRpb24KLQkJfTsKLVVDSEFSCUNpcGhlcldwYVBza1RraXBMZW4gPSAoc2l6ZW9mKENpcGhlcldwYVBza1RraXApIC8gc2l6ZW9mKFVDSEFSKSk7Ci0KLVVDSEFSCUNpcGhlcldwYVBza0Flc1tdID0gewotCQkweERELCAweDE2LCAJCQkvLyBSU04gSUUKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCi0JCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCwJLy8gTXVsdGljYXN0Ci0JCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0Ci0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDQsCS8vIHVuaWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAotCQkweDAwLCAweDUwLCAweGYyLCAweDAyCS8vIGF1dGhlbnRpY2F0aW9uCi0JCX07Ci1VQ0hBUglDaXBoZXJXcGFQc2tBZXNMZW4gPSAoc2l6ZW9mKENpcGhlcldwYVBza0FlcykgLyBzaXplb2YoVUNIQVIpKTsKLQotVUNIQVIJQ2lwaGVyU3VpdGVDaXNjb0NDS01bXSA9IHsKLQkJMHhERCwgMHgxNiwJCQkJLy8gUlNOIElFCi0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsIC8vIG91aQotCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCi0JCTB4MDAsIDB4NDAsIDB4OTYsIDB4MDEsIC8vIE11bHRpY2FzdAotCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdWljYXN0Ci0JCTB4MDAsIDB4NDAsIDB4OTYsIDB4MDEsIC8vIHVuaWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAotCQkweDAwLCAweDQwLCAweDk2LCAweDAwICAvLyBBdXRoZW50aWNhdGlvbgotCQl9OwotVUNIQVIJQ2lwaGVyU3VpdGVDaXNjb0NDS01MZW4gPSAoc2l6ZW9mKENpcGhlclN1aXRlQ2lzY29DQ0tNKSAvIHNpemVvZihVQ0hBUikpOwotCi1VQ0hBUglDaXBoZXJTdWl0ZUNpc2NvQ0NLTTI0W10gPSB7Ci0JCTB4REQsIDB4MTgsCQkJCS8vIFJTTiBJRQotCQkweDAwLCAweDUwLCAweGYyLCAweDAxLCAvLyBvdWkKLQkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgotCQkweDAwLCAweDQwLCAweDk2LCAweDAxLCAvLyBNdWx0aWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVpY2FzdAotCQkweDAwLCAweDQwLCAweDk2LCAweDAxLCAvLyB1bmljYXN0Ci0JCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKLQkJMHgwMCwgMHg0MCwgMHg5NiwgMHgwMCwKLQkJMHgyOCwgMHgwMC8vIEF1dGhlbnRpY2F0aW9uCi0JCX07Ci0KLVVDSEFSCUNpcGhlclN1aXRlQ2lzY29DQ0tNMjRMZW4gPSAoc2l6ZW9mKENpcGhlclN1aXRlQ2lzY29DQ0tNMjQpIC8gc2l6ZW9mKFVDSEFSKSk7Ci0KLVVDSEFSCUNpcGhlclN1aXRlQ0NYVGtpcFtdID0gewotCQkweERELCAweDE2LAkJCQkvLyBSU04gSUUKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCi0JCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gTXVsdGljYXN0Ci0JCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0Ci0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIHVuaWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAotCQkweDAwLCAweDUwLCAweGYyLCAweDAxCS8vIGF1dGhlbnRpY2F0aW9uCi0JCX07Ci1VQ0hBUglDaXBoZXJTdWl0ZUNDWFRraXBMZW4gPSAoc2l6ZW9mKENpcGhlclN1aXRlQ0NYVGtpcCkgLyBzaXplb2YoVUNIQVIpKTsKLQotVUNIQVIJQ0NYX0xMQ19IRFJbXSA9IHsweEFBLCAweEFBLCAweDAzLCAweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAyfTsKLVVDSEFSCUxMQ19OT1JNQUxbXSA9IHsweEFBLCAweEFBLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKLQotVUNIQVIJRUFQT0xfRlJBTUVbXSA9IHsweDg4LCAweDhFfTsKLQotQk9PTEVBTiBDaGVja1JTTklFKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCi0JSU4gIFVDSEFSICAgICAgICAgICBEYXRhTGVuLAotCU9VVAlVQ0hBUgkJCSpPZmZzZXQpOwotCi12b2lkIGluY19ieXRlX2FycmF5KFVDSEFSICpjb3VudGVyLCBpbnQgbGVuKTsKLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUNsYXNzaWZ5IFdQQSBFQVAgbWVzc2FnZSB0eXBlCi0KLQlBcmd1bWVudHM6Ci0JCUVBUFR5cGUJCVZhbHVlIG9mIEVBUCBtZXNzYWdlIHR5cGUKLQkJTXNnVHlwZQkJSW50ZXJuYWwgTWVzc2FnZSBkZWZpbml0aW9uIGZvciBNTE1FIHN0YXRlIG1hY2hpbmUKLQotCVJldHVybiBWYWx1ZToKLQkJVFJVRQkJRm91bmQgYXBwcm9wcmlhdGUgbWVzc2FnZSB0eXBlCi0JCUZBTFNFCQlObyBhcHByb3ByaWF0ZSBtZXNzYWdlIHR5cGUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQkJQWxsIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVmaW5lZCBpbiB3cGEuaAotCQlGb3Igc3VwcGxpY2FudCwgdGhlcmUgaXMgb25seSBFQVBPTCBLZXkgbWVzc2FnZSBhdmFsaWFibGUKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4JV3BhTXNnVHlwZVN1YnN0KAotCUlOCVVDSEFSCUVBUFR5cGUsCi0JT1VUCUlOVAkJKk1zZ1R5cGUpCi17Ci0Jc3dpdGNoIChFQVBUeXBlKQotCXsKLQkJY2FzZSBFQVBQYWNrZXQ6Ci0JCQkqTXNnVHlwZSA9IE1UMl9FQVBQYWNrZXQ7Ci0JCQlicmVhazsKLQkJY2FzZSBFQVBPTFN0YXJ0OgotCQkJKk1zZ1R5cGUgPSBNVDJfRUFQT0xTdGFydDsKLQkJCWJyZWFrOwotCQljYXNlIEVBUE9MTG9nb2ZmOgotCQkJKk1zZ1R5cGUgPSBNVDJfRUFQT0xMb2dvZmY7Ci0JCQlicmVhazsKLQkJY2FzZSBFQVBPTEtleToKLQkJCSpNc2dUeXBlID0gTVQyX0VBUE9MS2V5OwotCQkJYnJlYWs7Ci0JCWNhc2UgRUFQT0xBU0ZBbGVydDoKLQkJCSpNc2dUeXBlID0gTVQyX0VBUE9MQVNGQWxlcnQ7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBGQUxTRTsKLQl9Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJYXNzb2NpYXRpb24Jc3RhdGUgbWFjaGluZSBpbml0LAlpbmNsdWRpbmcgc3RhdGUJdHJhbnNpdGlvbiBhbmQgdGltZXIgaW5pdAotCVBhcmFtZXRlcnM6Ci0JCVMgLQlwb2ludGVyCXRvIHRoZSBhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBXcGFQc2tTdGF0ZU1hY2hpbmVJbml0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVNUQVRFX01BQ0hJTkUgKlMsCi0JT1VUCVNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQotewotCVN0YXRlTWFjaGluZUluaXQoUywJVHJhbnMsIE1BWF9XUEFfUFNLX1NUQVRFLCBNQVhfV1BBX1BTS19NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgV1BBX1BTS19JRExFLCBXUEFfTUFDSElORV9CQVNFKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgV1BBX1BTS19JRExFLCBNVDJfRUFQT0xLZXksIChTVEFURV9NQUNISU5FX0ZVTkMpV3BhRUFQT0xLZXlBY3Rpb24pOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVRoaXMgaXMJc3RhdGUgbWFjaGluZSBmdW5jdGlvbi4KLQkJV2hlbiByZWNlaXZpbmcgRUFQT0wgcGFja2V0cyB3aGljaCBpcyAgZm9yIDgwMi4xeCBrZXkgbWFuYWdlbWVudC4KLQkJVXNlCWJvdGggaW4JV1BBLCBhbmQgV1BBUFNLCWNhc2UuCi0JCUluIHRoaXMJZnVuY3Rpb24sIGZ1cnRoZXIgZGlzcGF0Y2ggdG8gZGlmZmVyZW50CWZ1bmN0aW9ucyBhY2NvcmRpbmcJdG8gdGhlIHJlY2VpdmVkCXBhY2tldC4JIDMgY2F0ZWdvcmllcyBhcmUgOgotCQkgIDEuICBub3JtYWwgNC13YXkgcGFpcndpc2VrZXkgYW5kIDItd2F5IGdyb3Vwa2V5IGhhbmRzaGFrZQotCQkgIDIuICBNSUMgZXJyb3IJKENvdW50ZXJtZWFzdXJlcyBhdHRhY2spICByZXBvcnQgcGFja2V0CWZyb20gU1RBLgotCQkgIDMuICBSZXF1ZXN0IGZvciBwYWlyd2lzZS9ncm91cCBrZXkgdXBkYXRlCWZyb20gU1RBCi0JUmV0dXJuOgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBXcGFFQVBPTEtleUFjdGlvbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglNTE1FX1FVRVVFX0VMRU0JKkVsZW0pCi0KLXsKLQlJTlQgICAgICAgICAgICAgTXNnVHlwZSA9IEVBUE9MX01TR19JTlZBTElEOwotCVBLRVlfREVTQ1JJUFRFUiBwS2V5RGVzYzsKLQlQSEVBREVSXzgwMl8xMSAgcEhlYWRlcjsgLy9yZWQKLQlVQ0hBUiAgICAgICAgICAgWmVyb1JlcGxheVtMRU5fS0VZX0RFU0NfUkVQTEFZXTsKLQlVQ0hBUiBFYXBvbFZyOwotCUtFWV9JTkZPCQlwZWVyS2V5SW5mbzsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLS0tPiBXcGFFQVBPTEtleUFjdGlvblxuIikpOwotCi0JLy8gR2V0IDgwMi4xMSBoZWFkZXIgZmlyc3QKLQlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSBFbGVtLT5Nc2c7Ci0KLQkvLyBHZXQgRUFQb0wtS2V5IERlc2NyaXB0b3IKLQlwS2V5RGVzYyA9IChQS0VZX0RFU0NSSVBURVIpICZFbGVtLT5Nc2dbKExFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSCArIExFTkdUSF9FQVBPTF9IKV07Ci0KLQlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgc2l6ZW9mKHBlZXJLZXlJbmZvKSk7Ci0JTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIChQVUNIQVIpJnBLZXlEZXNjLT5LZXlJbmZvLCBzaXplb2YoS0VZX0lORk8pKTsKLQotCSooKFVTSE9SVCAqKSZwZWVyS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmcGVlcktleUluZm8pKTsKLQotCi0JLy8gMS4gQ2hlY2sgRUFQT0wgZnJhbWUgdmVyc2lvbiBhbmQgdHlwZQotCUVhcG9sVnIJPSAoVUNIQVIpIEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExK0xFTkdUSF84MDJfMV9IXTsKLQotICAgIGlmICgoKEVhcG9sVnIgIT0gRUFQT0xfVkVSKSAmJiAoRWFwb2xWciAhPSBFQVBPTF9WRVIyKSkgfHwgKChwS2V5RGVzYy0+VHlwZSAhPSBXUEExX0tFWV9ERVNDKSAmJiAocEtleURlc2MtPlR5cGUgIT0gV1BBMl9LRVlfREVTQykpKQotCXsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiS2V5IGRlc2NyaXB0ZXIgZG9lcyBub3QgbWF0Y2ggd2l0aCBXUEEgcnVsZVxuIikpOwotCQkJcmV0dXJuOwotCX0KLQotCS8vIEZpcnN0IHZhbGlkYXRlIHJlcGxheSBjb3VudGVyLCBvbmx5IGFjY2VwdCBtZXNzYWdlIHdpdGggbGFyZ2VyIHJlcGxheSBjb3VudGVyCi0JLy8gTGV0IGVxdWFsIHBhc3MsIHNvbWUgQVAgc3RhcnQgd2l0aCBhbGwgemVybyByZXBsYXkgY291bnRlcgotCU5kaXNaZXJvTWVtb3J5KFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpOwotCi0JaWYoKFJUTVBDb21wYXJlTWVtb3J5KHBLZXlEZXNjLT5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAxKSAmJgotCQkoUlRNUENvbXBhcmVNZW1vcnkocEtleURlc2MtPlJlcGxheUNvdW50ZXIsIFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDApKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiICAgUmVwbGF5Q291bnRlciBub3QgbWF0Y2ggICBcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCS8vIFByb2Nlc3MgV1BBMlBTSyBmcmFtZQotCWlmKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCi0JewotCQlpZigocGVlcktleUluZm8uS2V5VHlwZSA9PSBQQUlSV0lTRUtFWSkgJiYKLQkJCShwZWVyS2V5SW5mby5FS0RfREwgPT0gMCkgJiYKLQkJCShwZWVyS2V5SW5mby5LZXlBY2sgPT0gMSkgJiYKLQkJCShwZWVyS2V5SW5mby5LZXlNaWMgPT0gMCkgJiYKLQkJCShwZWVyS2V5SW5mby5TZWN1cmUgPT0gMCkgJiYKLQkJCShwZWVyS2V5SW5mby5FcnJvciA9PSAwKSAmJgotCQkJKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkpCi0JCXsKLQkJCU1zZ1R5cGUgPSBFQVBPTF9QQUlSX01TR18xOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTCBLZXkgUGFpcndpc2UgTWVzc2FnZSAxXG4iKSk7Ci0JCX0gZWxzZSBpZigocGVlcktleUluZm8uS2V5VHlwZSA9PSBQQUlSV0lTRUtFWSkgJiYKLQkJCShwZWVyS2V5SW5mby5FS0RfREwgID09IDEpICYmCi0JCQkocGVlcktleUluZm8uS2V5QWNrID09IDEpICYmCi0JCQkocGVlcktleUluZm8uS2V5TWljID09IDEpICYmCi0JCQkocGVlcktleUluZm8uU2VjdXJlID09IDEpICYmCi0JCQkocGVlcktleUluZm8uRXJyb3IgPT0gMCkgJiYKLQkJCShwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApKQotCQl7Ci0JCQlNc2dUeXBlID0gRUFQT0xfUEFJUl9NU0dfMzsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0wgS2V5IFBhaXJ3aXNlIE1lc3NhZ2UgM1xuIikpOwotCQl9IGVsc2UgaWYoKHBlZXJLZXlJbmZvLktleVR5cGUgPT0gR1JPVVBLRVkpICYmCi0JCQkocGVlcktleUluZm8uRUtEX0RMID09IDEpICYmCi0JCQkocGVlcktleUluZm8uS2V5QWNrID09IDEpICYmCi0JCQkocGVlcktleUluZm8uS2V5TWljID09IDEpICYmCi0JCQkocGVlcktleUluZm8uU2VjdXJlID09IDEpICYmCi0JCQkocGVlcktleUluZm8uRXJyb3IgPT0gMCkgJiYKLQkJCShwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApKQotCQl7Ci0JCQlNc2dUeXBlID0gRUFQT0xfR1JPVVBfTVNHXzE7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MIEtleSBHcm91cCBNZXNzYWdlIDFcbiIpKTsKLQkJfQotCi0JCS8vIFdlIHdpbGwgYXNzdW1lIGxpbmsgaXMgdXAgKGFzc29jIHN1Y2Vlc3MgYW5kIHBvcnQgbm90IHNlY3VyZWQpLgotCQkvLyBBbGwgc3RhdGUgaGFzIHRvIGJlIGFibGUgdG8gcHJvY2VzcyBtZXNzYWdlIGZyb20gcHJldmlvdXMgc3RhdGUKLQkJc3dpdGNoKHBBZC0+U3RhQ2ZnLldwYVN0YXRlKQotCQl7Ci0JCWNhc2UgU1NfU1RBUlQ6Ci0JCQlpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEpCi0JCQl7Ci0JCQkJV3BhMlBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTU19XQUlUX01TR18zOgotCQkJaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKQotCQkJewotCQkJCVdwYTJQYWlyTXNnMUFjdGlvbihwQWQsIEVsZW0pOwotCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9NU0dfMzsKLQkJCX0KLQkJCWVsc2UgaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQotCQkJewotCQkJCVdwYTJQYWlyTXNnM0FjdGlvbihwQWQsIEVsZW0pOwotCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9HUk9VUDsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgU1NfV0FJVF9HUk9VUDoJCS8vIFdoZW4gZG9pbmcgZ3JvdXAga2V5IGV4Y2hhbmdlCi0JCWNhc2UgU1NfRklOSVNIOgkJCS8vIFRoaXMgaGFwcGVuZWQgd2hlbiB1cGRhdGUgZ3JvdXAga2V5Ci0JCQlpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEpCi0JCQl7Ci0JCQkgICAgLy8gUmVzZXQgcG9ydCBzZWN1cmVkIHZhcmlhYmxlCi0JCQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7Ci0JCQkJV3BhMlBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOwotCQkJfQotCQkJZWxzZSBpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCi0JCQl7Ci0JCQkgICAgLy8gUmVzZXQgcG9ydCBzZWN1cmVkIHZhcmlhYmxlCi0JCQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7Ci0JCQkJV3BhMlBhaXJNc2czQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX0dST1VQOwotCQkJfQotCQkJZWxzZSBpZihNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKQotCQkJewotCQkJCVdwYUdyb3VwTXNnMUFjdGlvbihwQWQsIEVsZW0pOwotCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfRklOSVNIOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotCS8vIFByb2Nlc3MgV1BBUFNLIEZyYW1lCi0JLy8gQ2xhc3NpZnkgbWVzc2FnZSBUeXBlLCBlaXRoZXIgcGFpcndpc2UgbWVzc2FnZSAxLCAzLCBvciBncm91cCBtZXNzYWdlIDEgZm9yIHN1cHBsaWNhbnQKLQllbHNlIGlmKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykKLQl7Ci0JCWlmKChwZWVyS2V5SW5mby5LZXlUeXBlID09IFBBSVJXSVNFS0VZKSAmJgotCQkJKHBlZXJLZXlJbmZvLktleUluZGV4ID09IDApICYmCi0JCQkocGVlcktleUluZm8uS2V5QWNrID09IDEpICYmCi0JCQkocGVlcktleUluZm8uS2V5TWljID09IDApICYmCi0JCQkocGVlcktleUluZm8uU2VjdXJlID09IDApICYmCi0JCQkocGVlcktleUluZm8uRXJyb3IgPT0gMCkgJiYKLQkJCShwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApKQotCQl7Ci0JCQlNc2dUeXBlID0gRUFQT0xfUEFJUl9NU0dfMTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0wgS2V5IFBhaXJ3aXNlIE1lc3NhZ2UgMVxuIikpOwotCQl9Ci0JCWVsc2UgaWYoKHBlZXJLZXlJbmZvLktleVR5cGUgPT0gUEFJUldJU0VLRVkpICYmCi0JCQkocGVlcktleUluZm8uS2V5SW5kZXggPT0gMCkgJiYKLQkJCShwZWVyS2V5SW5mby5LZXlBY2sgPT0gMSkgJiYKLQkJCShwZWVyS2V5SW5mby5LZXlNaWMgPT0gMSkgJiYKLQkJCShwZWVyS2V5SW5mby5TZWN1cmUgPT0gMCkgJiYKLQkJCShwZWVyS2V5SW5mby5FcnJvciA9PSAwKSAmJgotCQkJKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkpCi0JCXsKLQkJCU1zZ1R5cGUgPSBFQVBPTF9QQUlSX01TR18zOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTCBLZXkgUGFpcndpc2UgTWVzc2FnZSAzXG4iKSk7Ci0JCX0KLQkJZWxzZSBpZigocGVlcktleUluZm8uS2V5VHlwZSA9PSBHUk9VUEtFWSkgJiYKLQkJCShwZWVyS2V5SW5mby5LZXlJbmRleCAhPSAwKSAmJgotCQkJKHBlZXJLZXlJbmZvLktleUFjayA9PSAxKSAmJgotCQkJKHBlZXJLZXlJbmZvLktleU1pYyA9PSAxKSAmJgotCQkJKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAxKSAmJgotCQkJKHBlZXJLZXlJbmZvLkVycm9yID09IDApICYmCi0JCQkocGVlcktleUluZm8uUmVxdWVzdCA9PSAwKSkKLQkJewotCQkJTXNnVHlwZSA9IEVBUE9MX0dST1VQX01TR18xOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTCBLZXkgR3JvdXAgTWVzc2FnZSAxXG4iKSk7Ci0JCX0KLQotCQkvLyBXZSB3aWxsIGFzc3VtZSBsaW5rIGlzIHVwIChhc3NvYyBzdWNlZXNzIGFuZCBwb3J0IG5vdCBzZWN1cmVkKS4KLQkJLy8gQWxsIHN0YXRlIGhhcyB0byBiZSBhYmxlIHRvIHByb2Nlc3MgbWVzc2FnZSBmcm9tIHByZXZpb3VzIHN0YXRlCi0JCXN3aXRjaChwQWQtPlN0YUNmZy5XcGFTdGF0ZSkKLQkJewotCQljYXNlIFNTX1NUQVJUOgotCQkJaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKQotCQkJewotCQkJCVdwYVBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTU19XQUlUX01TR18zOgotCQkJaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKQotCQkJewotCQkJCVdwYVBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOwotCQkJfQotCQkJZWxzZSBpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCi0JCQl7Ci0JCQkJV3BhUGFpck1zZzNBY3Rpb24ocEFkLCBFbGVtKTsKLQkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfR1JPVVA7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIFNTX1dBSVRfR1JPVVA6CQkvLyBXaGVuIGRvaW5nIGdyb3VwIGtleSBleGNoYW5nZQotCQljYXNlIFNTX0ZJTklTSDoJCQkvLyBUaGlzIGhhcHBlbmVkIHdoZW4gdXBkYXRlIGdyb3VwIGtleQotCQkJaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKQotCQkJewotCQkJCVdwYVBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOwotCQkJCS8vIFJlc2V0IHBvcnQgc2VjdXJlZCB2YXJpYWJsZQotCQkJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOwotCQkJfQotCQkJZWxzZSBpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCi0JCQl7Ci0JCQkJV3BhUGFpck1zZzNBY3Rpb24ocEFkLCBFbGVtKTsKLQkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfR1JPVVA7Ci0JCQkJLy8gUmVzZXQgcG9ydCBzZWN1cmVkIHZhcmlhYmxlCi0JCQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7Ci0JCQl9Ci0JCQllbHNlIGlmKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpCi0JCQl7Ci0JCQkJV3BhR3JvdXBNc2cxQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19GSU5JU0g7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0tLS0gV3BhRUFQT0xLZXlBY3Rpb25cbiIpKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVByb2Nlc3MgUGFpcndpc2Uga2V5IDQtd2F5IGhhbmRzaGFraW5nCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCi0JCUVsZW0JCU1lc3NhZ2UgYm9keQotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlXcGFQYWlyTXNnMUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVBIRUFERVJfODAyXzExICAgICAgcEhlYWRlcjsKLQlVQ0hBUgkJCQkqbXBvb2wsICpQVEssICpkaWdlc3Q7Ci0JUFVDSEFSICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKLQlVTE9ORyAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKLQlQRUFQT0xfUEFDS0VUICAgICAgIHBNc2cxOwotCUVBUE9MX1BBQ0tFVCAgICAgICAgUGFja2V0OwotCVVDSEFSICAgICAgICAgICAgICAgTWljWzE2XTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYVBhaXJNc2cxQWN0aW9uIC0tLS0tPlxuIikpOwotCi0JLy8gYWxsb2NhdGUgbWVtb3J5IHBvb2wKLQlvc19hbGxvY19tZW0ocEFkLCAoUFVDSEFSICopJm1wb29sLCAyNTYpOwotCi0JaWYgKG1wb29sID09IE5VTEwpCi0JCXJldHVybjsKLQotCS8vIFBUSyBMZW4gPSA4MC4KLQlQVEsgPSAoVUNIQVIgKikgUk9VTkRfVVAobXBvb2wsIDQpOwotCS8vIGRpZ2VzdCBMZW4gPSA4MC4KLQlkaWdlc3QgPSAoVUNIQVIgKikgUk9VTkRfVVAoUFRLICsgODAsIDQpOwotCi0JcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgRWxlbS0+TXNnOwotCi0JLy8gUHJvY2VzcyBtZXNzYWdlIDEgZnJvbSBhdXRoZW50aWNhdG9yCi0JcE1zZzEgPSAoUEVBUE9MX1BBQ0tFVCkgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOwotCi0JLy8gMS4gU2F2ZSBSZXBsYXkgY291bnRlciwgaXQgd2lsbCB1c2UgdG8gdmVyaWZ5IG1lc3NhZ2UgMyBhbmQgY29uc3RydWN0IG1lc3NhZ2UgMgotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBNc2cxLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOwotCi0JLy8gMi4gU2F2ZSBBTm9uY2UKLQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5BTm9uY2UsIHBNc2cxLT5LZXlEZXNjLktleU5vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpOwotCi0JLy8gR2VuZXJhdGUgcmFuZG9tIFNOb25jZQotCUdlblJhbmRvbShwQWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+U3RhQ2ZnLlNOb25jZSk7Ci0KLQkvLyBDYWxjIFBUSyhBTm9uY2UsIFNOb25jZSkKLQlXcGFDb3VudFBUSyhwQWQsCi0JCXBBZC0+U3RhQ2ZnLlBNSywKLQkJcEFkLT5TdGFDZmcuQU5vbmNlLAotCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZCwKLQkJcEFkLT5TdGFDZmcuU05vbmNlLAotCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAotCQlQVEssCi0JCUxFTl9QVEspOwotCi0JLy8gU2F2ZSBrZXkgdG8gUFRLIGVudHJ5Ci0JTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUFRLLCBQVEssIExFTl9QVEspOwotCi0JLy8gaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0Ci0JTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7Ci0KLQkvLyBaZXJvIE1lc3NhZ2UgMiBib2R5Ci0JTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOwotCVBhY2tldC5Qcm9WZXIJPSBFQVBPTF9WRVI7Ci0JUGFja2V0LlByb1R5cGUJPSBFQVBPTEtleTsKLQkvLwotCS8vIE1lc3NhZ2UgMiBhcyAgRUFQT0wtS2V5KDAsMSwwLDAsMCxQLDAsU05vbmNlLE1JQyxSU04gSUUpCi0JLy8KLQlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMV9LRVlfREVTQzsKLQkvLyAxLiBLZXkgZGVzY3JpcHRvciB2ZXJzaW9uIGFuZCBhcHByb3ByaWF0ZSBSU04gSUUKLQlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JewotCQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSAyOwotCX0KLQllbHNlCSAgLy8gVEtJUAotCXsKLQkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gMTsKLQl9Ci0KLQkvLyBmaWxsIGluIERhdGEgTWF0ZXJpYWwgYW5kIGl0cyBsZW5ndGgKLQlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzBdID0gSUVfV1BBOwotCVBhY2tldC5LZXlEZXNjLktleURhdGFbMV0gPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47Ci0JUGFja2V0LktleURlc2MuS2V5RGF0YUxlblsxXSA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDI7Ci0JTmRpc01vdmVNZW1vcnkoJlBhY2tldC5LZXlEZXNjLktleURhdGFbMl0sIHBBZC0+U3RhQ2ZnLlJTTl9JRSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKLQotCS8vIFVwZGF0ZSBwYWNrZXQgbGVuZ3RoIGFmdGVyIGRlY2lkZSBLZXkgZGF0YSBwYXlsb2FkCi0JUGFja2V0LkJvZHlfTGVuWzFdICA9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFICsgUGFja2V0LktleURlc2MuS2V5RGF0YUxlblsxXTsKLQotCS8vIFVwZGF0ZSBLZXkgbGVuZ3RoCi0JUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzBdID0gcE1zZzEtPktleURlc2MuS2V5TGVuZ3RoWzBdOwotCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFsxXSA9IHBNc2cxLT5LZXlEZXNjLktleUxlbmd0aFsxXTsKLQkvLyAyLiBLZXkgVHlwZSBQZWVyS2V5Ci0JUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gUEFJUldJU0VLRVk7Ci0KLQkvLyAzLiBLZXlNaWMgZmllbGQgcHJlc2VudGVkCi0JUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMgID0gMTsKLQotCS8vQ29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KLQkqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykpOwotCi0KLQkvLyA0LiBGaWxsIFNOb25jZQotCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU5vbmNlLCBwQWQtPlN0YUNmZy5TTm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSk7Ci0KLQkvLyA1LiBLZXkgUmVwbGF5IENvdW50Ci0JTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0KLQkvLyBTZW5kIEVBUE9MKDAsIDEsIDAsIDAsIDAsIFAsIDAsIFNOb25jZSwgTUlDLCBSU05fSUUpCi0JLy8gT3V0IGJ1ZmZlciBmb3IgdHJhbnNtaXR0aW5nIG1lc3NhZ2UgMgotCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKLQlpZihwT3V0QnVmZmVyID09IE5VTEwpCi0JewotCQlvc19mcmVlX21lbShwQWQsIG1wb29sKTsKLQkJcmV0dXJuOwotCX0KLQkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KLQkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgotCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCi0JCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCi0JCUVORF9PRl9BUkdTKTsKLQotCS8vIDYuIFByZXBhcmUgYW5kIEZpbGwgTUlDIHZhbHVlCi0JTmRpc1plcm9NZW1vcnkoTWljLCBzaXplb2YoTWljKSk7Ci0JaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCXsJLy8gQUVTCi0KLQkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBQVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKLQkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOwotCX0KLQllbHNlCi0JewkvLyBUS0lQCi0JCWhtYWNfbWQ1KFBUSywgIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7Ci0JfQotCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKLQotCS8vaGV4X2R1bXAoIk1JQyIsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7Ci0KLQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgIAkmRnJhbWVMZW4sCi0JCQkgIAkJCUxFTkdUSF84MDJfMywgICAgIAkJCSZIZWFkZXI4MDJfMywKLQkJCQkJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCi0JCQkJCQlFTkRfT0ZfQVJHUyk7Ci0KLQotCS8vIDUuIENvcHkgZnJhbWUgdG8gVHggcmluZyBhbmQgc2VuZCBNc2cgMiB0byBhdXRoZW50aWNhdG9yCi0JUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLCAoUFVDSEFSKSZQYWNrZXQsIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsIFRSVUUpOwotCi0JTWxtZUZyZWVNZW1vcnkocEFkLCAoUFVDSEFSKXBPdXRCdWZmZXIpOwotCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFQYWlyTXNnMUFjdGlvbiA8LS0tLS1cbiIpKTsKLX0KLQotVk9JRCBXcGEyUGFpck1zZzFBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlQSEVBREVSXzgwMl8xMSAgICAgIHBIZWFkZXI7Ci0JVUNIQVIJCQkJKm1wb29sLCAqUFRLLCAqZGlnZXN0OwotCVBVQ0hBUiAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JVUNIQVIgICAgICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07Ci0JVUxPTkcgICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0JUEVBUE9MX1BBQ0tFVCAgICAgICBwTXNnMTsKLQlFQVBPTF9QQUNLRVQgICAgICAgIFBhY2tldDsKLQlVQ0hBUiAgICAgICAgICAgICAgIE1pY1sxNl07Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGEyUGFpck1zZzFBY3Rpb24gLS0tLS0+XG4iKSk7Ci0KLQkvLyBhbGxvY2F0ZSBtZW1vcnkgcG9vbAotCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmbXBvb2wsIDI1Nik7Ci0KLQlpZiAobXBvb2wgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JLy8gUFRLIExlbiA9IDgwLgotCVBUSyA9IChVQ0hBUiAqKSBST1VORF9VUChtcG9vbCwgNCk7Ci0JLy8gZGlnZXN0IExlbiA9IDgwLgotCWRpZ2VzdCA9IChVQ0hBUiAqKSBST1VORF9VUChQVEsgKyA4MCwgNCk7Ci0KLQlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSBFbGVtLT5Nc2c7Ci0KLQkvLyBQcm9jZXNzIG1lc3NhZ2UgMSBmcm9tIGF1dGhlbnRpY2F0b3IKLQkJcE1zZzEgPSAoUEVBUE9MX1BBQ0tFVCkJJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOwotCi0JLy8gMS4gU2F2ZSBSZXBsYXkgY291bnRlciwgaXQgd2lsbCB1c2UgdG8gdmVyaWZ5IG1lc3NhZ2UgMyBhbmQgY29uc3RydWN0IG1lc3NhZ2UgMgotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBNc2cxLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOwotCi0JLy8gMi4gU2F2ZSBBTm9uY2UKLQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5BTm9uY2UsIHBNc2cxLT5LZXlEZXNjLktleU5vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpOwotCi0JLy8gR2VuZXJhdGUgcmFuZG9tIFNOb25jZQotCUdlblJhbmRvbShwQWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+U3RhQ2ZnLlNOb25jZSk7Ci0KLQlpZihwTXNnMS0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdID4gMCApCi0JewotCQkvLyBjYWNoZWQgUE1LSUQKLQl9Ci0KLQkvLyBDYWxjIFBUSyhBTm9uY2UsIFNOb25jZSkKLQlXcGFDb3VudFBUSyhwQWQsCi0JCXBBZC0+U3RhQ2ZnLlBNSywKLQkJcEFkLT5TdGFDZmcuQU5vbmNlLAotCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZCwKLQkJcEFkLT5TdGFDZmcuU05vbmNlLAotCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAotCQlQVEssCi0JCUxFTl9QVEspOwotCi0JLy8gU2F2ZSBrZXkgdG8gUFRLIGVudHJ5Ci0JTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUFRLLCBQVEssIExFTl9QVEspOwotCi0JLy8gaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0Ci0JTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7Ci0KLQkvLyBaZXJvIG1lc3NhZ2UgMiBib2R5Ci0JTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOwotCVBhY2tldC5Qcm9WZXIJPSBFQVBPTF9WRVI7Ci0JUGFja2V0LlByb1R5cGUJPSBFQVBPTEtleTsKLQkvLwotCS8vIE1lc3NhZ2UgMiBhcyAgRUFQT0wtS2V5KDAsMSwwLDAsMCxQLDAsU05vbmNlLE1JQyxSU04gSUUpCi0JLy8KLQlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKLQotCS8vIDEuIEtleSBkZXNjcmlwdG9yIHZlcnNpb24gYW5kIGFwcHJvcHJpYXRlIFJTTiBJRQotCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCXsKLQkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gMjsKLQl9Ci0JZWxzZQkgIC8vIFRLSVAKLQl7Ci0JCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IDE7Ci0JfQotCi0JLy8gZmlsbCBpbiBEYXRhIE1hdGVyaWFsIGFuZCBpdHMgbGVuZ3RoCi0JUGFja2V0LktleURlc2MuS2V5RGF0YVswXSA9IElFX1dQQTI7Ci0JUGFja2V0LktleURlc2MuS2V5RGF0YVsxXSA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKLQlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhTGVuWzFdID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMjsKLQlOZGlzTW92ZU1lbW9yeSgmUGFja2V0LktleURlc2MuS2V5RGF0YVsyXSwgcEFkLT5TdGFDZmcuUlNOX0lFLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOwotCi0JLy8gVXBkYXRlIHBhY2tldCBsZW5ndGggYWZ0ZXIgZGVjaWRlIEtleSBkYXRhIHBheWxvYWQKLQlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUUgKyBQYWNrZXQuS2V5RGVzYy5LZXlEYXRhTGVuWzFdOwotCi0JLy8gMi4gS2V5IFR5cGUgUGVlcktleQotCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IFBBSVJXSVNFS0VZOwotCi0JLy8gMy4gS2V5TWljIGZpZWxkIHByZXNlbnRlZAotCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljICA9IDE7Ci0KLQkvLyBVcGRhdGUgS2V5IExlbmd0aAotCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFswXSA9IDA7Ci0JUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzFdID0gcE1zZzEtPktleURlc2MuS2V5TGVuZ3RoWzFdOwotCi0JLy8gNC4gRmlsbCBTTm9uY2UKLQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlOb25jZSwgcEFkLT5TdGFDZmcuU05vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpOwotCi0JLy8gNS4gS2V5IFJlcGxheSBDb3VudAotCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOwotCi0JLy8gQ29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KLQkqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykpOwotCi0JLy8gU2VuZCBFQVBPTC1LZXkoMCwxLDAsMCwwLFAsMCxTTm9uY2UsTUlDLFJTTiBJRSkKLQkvLyBPdXQgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgbWVzc2FnZSAyCi0JTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKLQlpZihwT3V0QnVmZmVyID09IE5VTEwpCi0JewotCQlvc19mcmVlX21lbShwQWQsIG1wb29sKTsKLQkJcmV0dXJuOwotCX0KLQotCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgotCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICZGcmFtZUxlbiwKLQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgJlBhY2tldCwKLQkJRU5EX09GX0FSR1MpOwotCi0JLy8gNi4gUHJlcGFyZSBhbmQgRmlsbCBNSUMgdmFsdWUKLQlOZGlzWmVyb01lbW9yeShNaWMsIHNpemVvZihNaWMpKTsKLQlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQl7Ci0JCS8vIEFFUwotCQlITUFDX1NIQTEocE91dEJ1ZmZlciwgRnJhbWVMZW4sIFBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOwotCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7Ci0JfQotCWVsc2UKLQl7Ci0JCWhtYWNfbWQ1KFBUSywgIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7Ci0JfQotCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKLQotCi0JLy8gTWFrZSAgVHJhbnNtaXR0aW5nIGZyYW1lCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgIAkmRnJhbWVMZW4sCi0JCQkgIAkJCUxFTkdUSF84MDJfMywgICAgIAkJJkhlYWRlcjgwMl8zLAotCQkJCQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgJlBhY2tldCwKLQkJCQkJCUVORF9PRl9BUkdTKTsKLQotCi0JLy8gNS4gQ29weSBmcmFtZSB0byBUeCByaW5nCi0JUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLCAoUFVDSEFSKSZQYWNrZXQsIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsIFRSVUUpOwotCi0JTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQlvc19mcmVlX21lbShwQWQsIG1wb29sKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYTJQYWlyTXNnMUFjdGlvbiA8LS0tLS1cbiIpKTsKLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUHJvY2VzcyBQYWlyd2lzZSBrZXkgNC13YXkgaGFuZHNoYWtpbmcKLQotCUFyZ3VtZW50czoKLQkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKLQkJRWxlbQkJTWVzc2FnZSBib2R5Ci0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVdwYVBhaXJNc2czQWN0aW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU1MTUVfUVVFVUVfRUxFTQkqRWxlbSkKLQotewotCVBIRUFERVJfODAyXzExICAgICAgcEhlYWRlcjsKLQlQVUNIQVIgICAgICAgICAgCXBPdXRCdWZmZXIgPSBOVUxMOwotCVVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbMTRdOwotCVVMT05HICAgICAgICAgICAJRnJhbWVMZW4gPSAwOwotCUVBUE9MX1BBQ0tFVCAgICAgICAgUGFja2V0OwotCVBFQVBPTF9QQUNLRVQgICAgICAgcE1zZzM7Ci0JVUNIQVIgICAgICAgICAgIAlNaWNbMTZdLCBPbGRNaWNbMTZdOwotCU1BQ19UQUJMRV9FTlRSWSAJKnBFbnRyeSA9IE5VTEw7Ci0JVUNIQVIJCQkJc2tpcF9vZmZzZXQ7Ci0JS0VZX0lORk8JCQlwZWVyS2V5SW5mbzsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYVBhaXJNc2czQWN0aW9uIC0tLS0tPlxuIikpOwotCi0JLy8gUmVjb3JkIDgwMi4xMSBoZWFkZXIgJiB0aGUgcmVjZWl2ZWQgRUFQT0wgcGFja2V0IE1zZzMKLQlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSBFbGVtLT5Nc2c7Ci0JcE1zZzMgPSAoUEVBUE9MX1BBQ0tFVCkJJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOwotCi0JTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIHNpemVvZihwZWVyS2V5SW5mbykpOwotCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCAoUFVDSEFSKSZwTXNnMy0+S2V5RGVzYy5LZXlJbmZvLCBzaXplb2YoS0VZX0lORk8pKTsKLQotCSooKFVTSE9SVCopJnBlZXJLZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCopJnBlZXJLZXlJbmZvKSk7Ci0KLQotCS8vIDEuIFZlcmlmeSBjaXBoZXIgdHlwZSBtYXRjaAotCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIgIT0gMikpCi0JewotCQlyZXR1cm47Ci0JfQotCWVsc2UgaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIgIT0gMSkpCi0JewotCQlyZXR1cm47Ci0JfQotCi0JLy8gVmVyaWZ5IFJTTiBJRQotCS8vaWYgKCFSVE1QRXF1YWxNZW1vcnkocE1zZzMtPktleURlc2MuS2V5RGF0YSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuKSkKLQlpZiAoIUNoZWNrUlNOSUUocEFkLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdLCAmc2tpcF9vZmZzZXQpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlNOX0lFIERpZmZlcmVudCBpbiBNc2cgMyBvZiBXUEExIDQtd2F5IGhhbmRzaGFrZSEhIFxuIikpOwotCQloZXhfZHVtcCgiVGhlIG9yaWdpbmFsIFJTTl9JRSIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOX0lFLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbik7Ci0JCWhleF9kdW1wKCJUaGUgcmVjZWl2ZWQgUlNOX0lFIiwgcE1zZzMtPktleURlc2MuS2V5RGF0YSwgcE1zZzMtPktleURlc2MuS2V5RGF0YUxlblsxXSk7Ci0JCXJldHVybjsKLQl9Ci0JZWxzZQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSU05fSUUgVkFMSUQgaW4gTXNnIDMgb2YgV1BBMSA0LXdheSBoYW5kc2hha2UhISBcbiIpKTsKLQotCi0JLy8gMi4gQ2hlY2sgTUlDIHZhbHVlCi0JLy8gU2F2ZSB0aGUgTUlDIGFuZCByZXBsYWNlIHdpdGggemVybwotCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcE1zZzMtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKLQlOZGlzWmVyb01lbW9yeShwTXNnMy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOwotCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQl7Ci0JCS8vIEFFUwotCQlVQ0hBUiBkaWdlc3RbODBdOwotCi0JCUhNQUNfU0hBMSgoUFVDSEFSKSBwTXNnMywgcE1zZzMtPkJvZHlfTGVuWzFdICsgNCwgcEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7Ci0JCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKLQl9Ci0JZWxzZQkvLyBUS0lQCi0JewotCQlobWFjX21kNShwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgKFBVQ0hBUikgcE1zZzMsIHBNc2czLT5Cb2R5X0xlblsxXSArIDQsIE1pYyk7Ci0JfQotCi0JaWYoIU5kaXNFcXVhbE1lbW9yeShPbGRNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQykpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIgTUlDIERpZmZlcmVudCBpbiBtc2cgMyBvZiA0LXdheSBoYW5kc2hha2UhISEhISEhISEhIFxuIikpOwotCQlyZXR1cm47Ci0JfQotCWVsc2UKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1JQyBWQUxJRCBpbiBtc2cgMyBvZiA0LXdheSBoYW5kc2hha2UhISEhISEhISEhIFxuIikpOwotCi0JLy8gMy4gQ2hlY2sgUmVwbGF5IENvdW50ZXIsIGl0IGhhcyB0byBiZSBsYXJnZXIgdGhhbiBsYXN0IG9uZS4gTm8gbmVlZCB0byBiZSBleGFjdCBvbmUgbGFyZ2VyCi0JaWYoUlRNUENvbXBhcmVNZW1vcnkocE1zZzMtPktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMSkKLQkJcmV0dXJuOwotCi0JLy8gVXBkYXRlIG5ldyByZXBsYXkgY291bnRlcgotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBNc2czLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOwotCi0JLy8gNC4gRG91YmxlIGNoZWNrIEFOb25jZQotCWlmKCFOZGlzRXF1YWxNZW1vcnkocEFkLT5TdGFDZmcuQU5vbmNlLCBwTXNnMy0+S2V5RGVzYy5LZXlOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKSkKLQkJcmV0dXJuOwotCi0JLy8gaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0Ci0JTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7Ci0KLQkvLyBaZXJvIE1lc3NhZ2UgNCBib2R5Ci0JTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOwotCVBhY2tldC5Qcm9WZXIJPSBFQVBPTF9WRVI7Ci0JUGFja2V0LlByb1R5cGUJPSBFQVBPTEtleTsKLQlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUU7CQkvLyBObyBkYXRhIGZpZWxkCi0KLQkvLwotCS8vIE1lc3NhZ2UgNCBhcyAgRUFQT0wtS2V5KDAsMSwwLDAsMCxQLDAsMCxNSUMsMCkKLQkvLwotCVBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEExX0tFWV9ERVNDOwotCi0JLy8gS2V5IGRlc2NyaXB0b3IgdmVyc2lvbiBhbmQgYXBwcm9wcmlhdGUgUlNOIElFCi0JUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gcGVlcktleUluZm8uS2V5RGVzY1ZlcjsKLQotCS8vIFVwZGF0ZSBLZXkgTGVuZ3RoCi0JUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzBdID0gcE1zZzMtPktleURlc2MuS2V5TGVuZ3RoWzBdOwotCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFsxXSA9IHBNc2czLT5LZXlEZXNjLktleUxlbmd0aFsxXTsKLQotCS8vIEtleSBUeXBlIFBlZXJLZXkKLQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSBQQUlSV0lTRUtFWTsKLQotCS8vIEtleU1pYyBmaWVsZCBwcmVzZW50ZWQKLQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYyAgPSAxOwotCi0JLy8gSW4gTXNnMywgIEtleUluZm8uc2VjdXJlID0wIGlmIEdyb3VwIEtleSBIUyB0byBjb21lLiAxIGlmIG5vIGdyb3VwIGtleSBIUwotCS8vIFN0YXRpb24gc2VuZHMgTXNnNCAgS2V5SW5mby5zZWN1cmUgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoYXQgaW4gTXNnLjMKLQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlNlY3VyZT0gcGVlcktleUluZm8uU2VjdXJlOwotCi0JLy8gQ29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KLQkqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykpOwotCi0JLy8gS2V5IFJlcGxheSBjb3VudAotCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBNc2czLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOwotCi0JLy8gT3V0IGJ1ZmZlciBmb3IgdHJhbnNtaXR0aW5nIG1lc3NhZ2UgNAotCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKLQlpZihwT3V0QnVmZmVyID09IE5VTEwpCi0JCXJldHVybjsKLQotCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgotCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKLQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgJlBhY2tldCwKLQkJRU5EX09GX0FSR1MpOwotCi0JLy8gUHJlcGFyZSBhbmQgRmlsbCBNSUMgdmFsdWUKLQlOZGlzWmVyb01lbW9yeShNaWMsIHNpemVvZihNaWMpKTsKLQlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JewotCQkvLyBBRVMKLQkJVUNIQVIgZGlnZXN0WzgwXTsKLQotCQlITUFDX1NIQTEocE91dEJ1ZmZlciwgRnJhbWVMZW4sIHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOwotCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7Ci0JfQotCWVsc2UKLQl7Ci0JCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwgTWljKTsKLQl9Ci0JTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOwotCi0JLy8gVXBkYXRlIFBUSwotCS8vIFByZXBhcmUgcGFpci13aXNlIGtleSBpbmZvcm1hdGlvbiBpbnRvIHNoYXJlZCBrZXkgdGFibGUKLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0sIHNpemVvZihDSVBIRVJfS0VZKSk7Ci0JcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7Ci0gICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCAmcEFkLT5TdGFDZmcuUFRLWzMyXSwgTEVOX1RLSVBfRUspOwotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4XSwgTEVOX1RLSVBfUlhNSUNLKTsKLQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OCtMRU5fVEtJUF9SWE1JQ0tdLCBMRU5fVEtJUF9UWE1JQ0spOwotCi0JLy8gRGVjaWRlIGl0cyBDaGlwZXJBbGcKLQlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQotCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKLQllbHNlIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7Ci0JZWxzZQotCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQotCS8vIFVwZGF0ZSB0aGVzZSByZWxhdGVkIGluZm9ybWF0aW9uIHRvIE1BQ19UQUJMRV9FTlRSWQotCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOwotCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LCAmcEFkLT5TdGFDZmcuUFRLWzMyXSwgTEVOX1RLSVBfRUspOwotCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuUnhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDhdLCBMRU5fVEtJUF9SWE1JQ0spOwotCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuVHhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDgrTEVOX1RLSVBfUlhNSUNLXSwgTEVOX1RLSVBfVFhNSUNLKTsKLQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZzsKLQotCS8vIFVwZGF0ZSBwYWlyd2lzZSBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCi0JQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKLQkJCQkJCSAgQlNTMCwKLQkJCQkJCSAgMCwKLQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAotCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCi0JCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLAotCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYyk7Ci0KLQkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKLQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKLQkJCQkJCQkgIEJTUzAsCi0JCQkJCQkJICAwLAotCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAotCQkJCQkJCSAgcEVudHJ5KTsKLQotCS8vIE1ha2UgdHJhbnNtaXR0aW5nIGZyYW1lCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgIAkmRnJhbWVMZW4sCi0JCQkgIAkJCUxFTkdUSF84MDJfMywgICAgIAkJJkhlYWRlcjgwMl8zLAotCQkJCQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgJlBhY2tldCwKLQkJCQkJCUVORF9PRl9BUkdTKTsKLQotCi0JLy8gQ29weSBmcmFtZSB0byBUeCByaW5nIGFuZCBTZW5kIE1lc3NhZ2UgNCB0byBhdXRoZW50aWNhdG9yCi0JUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLCAoUFVDSEFSKSZQYWNrZXQsIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsIFRSVUUpOwotCi0JTWxtZUZyZWVNZW1vcnkocEFkLCAoUFVDSEFSKXBPdXRCdWZmZXIpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhUGFpck1zZzNBY3Rpb24gPC0tLS0tXG4iKSk7Ci19Ci0KLVZPSUQgICAgV3BhMlBhaXJNc2czQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi0KLXsKLQlQSEVBREVSXzgwMl8xMSAgICAgIHBIZWFkZXI7Ci0JUFVDSEFSICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKLQlVTE9ORyAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKLQlFQVBPTF9QQUNLRVQgICAgICAgIFBhY2tldDsKLQlQRUFQT0xfUEFDS0VUICAgICAgIHBNc2czOwotCVVDSEFSICAgICAgICAgICAgICAgTWljWzE2XSwgT2xkTWljWzE2XTsKLQlVQ0hBUiAgICAgICAgICAgICAgICptcG9vbCwgKktFWURBVEEsICpkaWdlc3Q7Ci0JVUNIQVIgICAgICAgICAgICAgICBLZXlbMzJdOwotCU1BQ19UQUJMRV9FTlRSWSAJKnBFbnRyeSA9IE5VTEw7Ci0JS0VZX0lORk8JCQlwZWVyS2V5SW5mbzsKLQotCS8vIGFsbG9jYXRlIG1lbW9yeQotCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmbXBvb2wsIDEwMjQpOwotCi0JaWYobXBvb2wgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JLy8gS0VZREFUQSBMZW4gPSA1MTIuCi0JS0VZREFUQSA9IChVQ0hBUiAqKSBST1VORF9VUChtcG9vbCwgNCk7Ci0JLy8gZGlnZXN0IExlbiA9IDgwLgotCWRpZ2VzdCA9IChVQ0hBUiAqKSBST1VORF9VUChLRVlEQVRBICsgNTEyLCA0KTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYTJQYWlyTXNnM0FjdGlvbiAtLS0tLT5cbiIpKTsKLQotCXBIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpIEVsZW0tPk1zZzsKLQotCS8vIFByb2Nlc3MgbWVzc2FnZSAzIGZyYW1lLgotCXBNc2czID0gKFBFQVBPTF9QQUNLRVQpCSZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKLQotCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCBzaXplb2YocGVlcktleUluZm8pKTsKLQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgKFBVQ0hBUikmcE1zZzMtPktleURlc2MuS2V5SW5mbywgc2l6ZW9mKEtFWV9JTkZPKSk7Ci0KLQkqKChVU0hPUlQqKSZwZWVyS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQqKSZwZWVyS2V5SW5mbykpOwotCi0JLy8gMS4gVmVyaWZ5IGNpcGhlciB0eXBlIG1hdGNoCi0JaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkICYmIChwZWVyS2V5SW5mby5LZXlEZXNjVmVyIT0gMikpCi0JewotCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOwotCQlyZXR1cm47Ci0JfQotCWVsc2UgaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIgIT0gMSkpCi0JewotCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gMi4gQ2hlY2sgTUlDIHZhbHVlCi0JLy8gU2F2ZSB0aGUgTUlDIGFuZCByZXBsYWNlIHdpdGggemVybwotCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcE1zZzMtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKLQlOZGlzWmVyb01lbW9yeShwTXNnMy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOwotCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQl7Ci0JCS8vIEFFUwotCQlITUFDX1NIQTEoKFBVQ0hBUikgcE1zZzMsIHBNc2czLT5Cb2R5X0xlblsxXSArIDQsIHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOwotCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7Ci0JfQotCWVsc2UKLQl7Ci0JCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCAoUFVDSEFSKSBwTXNnMywgcE1zZzMtPkJvZHlfTGVuWzFdICsgNCwgTWljKTsKLQl9Ci0KLQlpZighTmRpc0VxdWFsTWVtb3J5KE9sZE1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiBNSUMgRGlmZmVyZW50IGluIG1zZyAzIG9mIDQtd2F5IGhhbmRzaGFrZSEhISEhISEhISEgXG4iKSk7Ci0JCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7Ci0JCXJldHVybjsKLQl9Ci0JZWxzZQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTUlDIFZBTElEIGluIG1zZyAzIG9mIDQtd2F5IGhhbmRzaGFrZSEhISEhISEhISEgXG4iKSk7Ci0KLQkvLyAzLiBDaGVjayBSZXBsYXkgQ291bnRlciwgaXQgaGFzIHRvIGJlIGxhcmdlciB0aGFuIGxhc3Qgb25lLiBObyBuZWVkIHRvIGJlIGV4YWN0IG9uZSBsYXJnZXIKLQlpZihSVE1QQ29tcGFyZU1lbW9yeShwTXNnMy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAxKQotCXsKLQkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKLQkJcmV0dXJuOwotCX0KLQotCS8vIFVwZGF0ZSBuZXcgcmVwbGF5IGNvdW50ZXIKLQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBwTXNnMy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKLQotCS8vIDQuIERvdWJsZSBjaGVjayBBTm9uY2UKLQlpZighTmRpc0VxdWFsTWVtb3J5KHBBZC0+U3RhQ2ZnLkFOb25jZSwgcE1zZzMtPktleURlc2MuS2V5Tm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSkpCi0JewotCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gT2J0YWluIEdUSwotCS8vIDUuIERlY3J5cHQgR1RLIGZyb20gS2V5IERhdGEKLQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiRUtEID0gJWRcbiIsIHBlZXJLZXlJbmZvLkVLRF9ETCkpOwotCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCXsKLQkJLy8gRGVjcnlwdCBBRVMgR1RLCi0JCUFFU19HVEtfS0VZX1VOV1JBUCgmcEFkLT5TdGFDZmcuUFRLWzE2XSwgS0VZREFUQSwgcE1zZzMtPktleURlc2MuS2V5RGF0YUxlblsxXSxwTXNnMy0+S2V5RGVzYy5LZXlEYXRhKTsKLQl9Ci0JZWxzZQkgIC8vIFRLSVAKLQl7Ci0JCUlOVCBpOwotCQkvLyBEZWNyeXB0IFRLSVAgR1RLCi0JCS8vIENvbnN0cnVjdCAzMiBieXRlcyBSQzQgS2V5Ci0JCU5kaXNNb3ZlTWVtb3J5KEtleSwgcE1zZzMtPktleURlc2MuS2V5SXYsIDE2KTsKLQkJTmRpc01vdmVNZW1vcnkoJktleVsxNl0sICZwQWQtPlN0YUNmZy5QVEtbMTZdLCAxNik7Ci0JCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBLZXksIDMyKTsKLQkJLy9kaXNjYXJkIGZpcnN0IDI1NiBieXRlcwotCQlmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKLQkJCUFSQ0ZPVVJfQllURSgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhUKTsKLQkJLy8gRGVjcnlwdCBHVEsuIEJlY2FyZWZ1bCwgdGhlcmUgaXMgbm8gSUNWIHRvIGNoZWNrIHRoZSByZXN1bHQgaXMgY29ycmVjdCBvciBub3QKLQkJQVJDRk9VUl9ERUNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIEtFWURBVEEsIHBNc2czLT5LZXlEZXNjLktleURhdGEsIHBNc2czLT5LZXlEZXNjLktleURhdGFMZW5bMV0pOwotCX0KLQotCWlmICghUGFyc2VLZXlEYXRhKHBBZCwgS0VZREFUQSwgcE1zZzMtPktleURlc2MuS2V5RGF0YUxlblsxXSwgMSkpCi0JewotCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gVXBkYXRlIEdUSyB0byBBU0lDCi0JLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKLQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAotCQkJCQkJICBCU1MwLAotCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCi0JCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAotCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwKLQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywKLQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYyk7Ci0KLQkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKLQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKLQkJCQkJCQkgIEJTUzAsCi0JCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCi0JCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKLQkJCQkJCQkgIE5VTEwpOwotCi0JLy8gaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0Ci0JTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7Ci0KLQkvLyBaZXJvIG1lc3NhZ2UgNCBib2R5Ci0JTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOwotCVBhY2tldC5Qcm9WZXIJPSBFQVBPTF9WRVI7Ci0JUGFja2V0LlByb1R5cGUJPSBFQVBPTEtleTsKLQlQYWNrZXQuQm9keV9MZW5bMV0gIAk9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFOwkJLy8gTm8gZGF0YSBmaWVsZAotCi0JLy8KLQkvLyBNZXNzYWdlIDQgYXMgIEVBUE9MLUtleSgwLDEsMCwwLDAsUCwwLDAsTUlDLDApCi0JLy8KLQlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKLQotCS8vIEtleSBkZXNjcmlwdG9yIHZlcnNpb24gYW5kIGFwcHJvcHJpYXRlIFJTTiBJRQotCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IHBlZXJLZXlJbmZvLktleURlc2NWZXI7Ci0KLQkvLyBVcGRhdGUgS2V5IExlbmd0aAotCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFswXSA9IHBNc2czLT5LZXlEZXNjLktleUxlbmd0aFswXTsKLQlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMV0gPSBwTXNnMy0+S2V5RGVzYy5LZXlMZW5ndGhbMV07Ci0KLQkvLyBLZXkgVHlwZSBQZWVyS2V5Ci0JUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gUEFJUldJU0VLRVk7Ci0KLQkvLyBLZXlNaWMgZmllbGQgcHJlc2VudGVkCi0JUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMgID0gMTsKLQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlNlY3VyZSA9IDE7Ci0KLQkvLyBDb252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgotCSooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSk7Ci0KLQkvLyBLZXkgUmVwbGF5IGNvdW50Ci0JTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcE1zZzMtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0KLQkvLyBPdXQgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgbWVzc2FnZSA0Ci0JTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBVQ0hBUiAqKSZwT3V0QnVmZmVyKTsgIC8vIGFsbG9jYXRlIG1lbW9yeQotCWlmKHBPdXRCdWZmZXIgPT0gTlVMTCkKLQl7Ci0JCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KLQkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgotCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCi0JCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCi0JCUVORF9PRl9BUkdTKTsKLQotCS8vIFByZXBhcmUgYW5kIEZpbGwgTUlDIHZhbHVlCi0JTmRpc1plcm9NZW1vcnkoTWljLCBzaXplb2YoTWljKSk7Ci0JaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JewotCQkvLyBBRVMKLQkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKLQkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOwotCX0KLQllbHNlCi0JewotCQlobWFjX21kNShwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7Ci0JfQotCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKLQotCS8vIFVwZGF0ZSBQVEsKLQkvLyBQcmVwYXJlIHBhaXItd2lzZSBrZXkgaW5mb3JtYXRpb24gaW50byBzaGFyZWQga2V5IHRhYmxlCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOwotCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IExFTl9US0lQX0VLOwotICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgJnBBZC0+U3RhQ2ZnLlBUS1szMl0sIExFTl9US0lQX0VLKTsKLQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OF0sIExFTl9US0lQX1JYTUlDSyk7Ci0JTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDgrTEVOX1RLSVBfUlhNSUNLXSwgTEVOX1RLSVBfVFhNSUNLKTsKLQotCS8vIERlY2lkZSBpdHMgQ2hpcGVyQWxnCi0JaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7Ci0JZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOwotCWVsc2UKLQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0KLQkvLyBVcGRhdGUgdGhlc2UgcmVsYXRlZCBpbmZvcm1hdGlvbiB0byBNQUNfVEFCTEVfRU5UUlkKLQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKLQlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5QYWlyd2lzZUtleS5LZXksICZwQWQtPlN0YUNmZy5QVEtbMzJdLCBMRU5fVEtJUF9FSyk7Ci0JTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+UGFpcndpc2VLZXkuUnhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDhdLCBMRU5fVEtJUF9SWE1JQ0spOwotCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPlBhaXJ3aXNlS2V5LlR4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4K0xFTl9US0lQX1JYTUlDS10sIExFTl9US0lQX1RYTUlDSyk7Ci0JcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGc7Ci0KLQkvLyBVcGRhdGUgcGFpcndpc2Uga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQotCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCi0JCQkJCQkgIEJTUzAsCi0JCQkJCQkgIDAsCi0JCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKLQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAotCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKLQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMpOwotCi0JLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCi0JUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCi0JCQkJCQkJICBCU1MwLAotCQkJCQkJCSAgMCwKLQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKLQkJCQkJCQkgIHBFbnRyeSk7Ci0KLQkvLyBNYWtlICBUcmFuc21pdHRpbmcgZnJhbWUKLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgCSZGcmFtZUxlbiwKLQkJCSAgCQkJTEVOR1RIXzgwMl8zLCAgICAgCQkmSGVhZGVyODAyXzMsCi0JCQkJCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAmUGFja2V0LAotCQkJCQkJRU5EX09GX0FSR1MpOwotCi0KLQkvLyBDb3B5IGZyYW1lIHRvIFR4IHJpbmcgYW5kIFNlbmQgTWVzc2FnZSA0IHRvIGF1dGhlbnRpY2F0b3IKLQlSVE1QVG9XaXJlbGVzc1N0YShwQWQsIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsIChQVUNIQVIpJlBhY2tldCwgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgVFJVRSk7Ci0KLQkvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAotCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKLQotICAgIC8vIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJCi0gICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKLQotCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUilwT3V0QnVmZmVyKTsKLQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOwotCi0KLQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIHNldCBrZXkgZG9uZSBXUEEyCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQotCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TRVRfS0VZX0RPTkVfV1BBMl9FVkVOVF9GTEFHLCBwRW50cnktPkFkZHIsIEJTUzAsIDApOwotCi0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiV3BhMlBhaXJNc2czQWN0aW9uIDwtLS0tLVxuIikpOwotCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlQcm9jZXNzIEdyb3VwIGtleSAyLXdheSBoYW5kc2hha2luZwotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgotCQlFbGVtCQlNZXNzYWdlIGJvZHkKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJV3BhR3JvdXBNc2cxQWN0aW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU1MTUVfUVVFVUVfRUxFTQkqRWxlbSkKLQotewotCVBVQ0hBUiAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JVUNIQVIgICAgICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07Ci0JVUxPTkcgICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0JRUFQT0xfUEFDS0VUICAgICAgICBQYWNrZXQ7Ci0JUEVBUE9MX1BBQ0tFVCAgICAgICBwR3JvdXA7Ci0JVUNIQVIgICAgICAgICAgICAgICAqbXBvb2wsICpkaWdlc3QsICpLRVlEQVRBOwotCVVDSEFSICAgICAgICAgICAgICAgTWljWzE2XSwgT2xkTWljWzE2XTsKLQlVQ0hBUiAgICAgICAgICAgICAgIEdUS1szMl0sIEtleVszMl07Ci0JS0VZX0lORk8JCQlwZWVyS2V5SW5mbzsKLQotCS8vIGFsbG9jYXRlIG1lbW9yeQotCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmbXBvb2wsIDEwMjQpOwotCi0JaWYobXBvb2wgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JLy8gZGlnZXN0IExlbiA9IDgwLgotCWRpZ2VzdCA9IChVQ0hBUiAqKSBST1VORF9VUChtcG9vbCwgNCk7Ci0JLy8gS0VZREFUQSBMZW4gPSA1MTIuCi0JS0VZREFUQSA9IChVQ0hBUiAqKSBST1VORF9VUChkaWdlc3QgKyA4MCwgNCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFHcm91cE1zZzFBY3Rpb24gLS0tLS0+XG4iKSk7Ci0KLQkvLyBQcm9jZXNzIEdyb3VwIE1lc3NhZ2UgMSBmcmFtZS4gc2tpcCA4MDIuMTEgaGVhZGVyKDI0KSAmIExMQ19TTkFQIGhlYWRlcig4KQotCXBHcm91cCA9IChQRUFQT0xfUEFDS0VUKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSF07Ci0KLQlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgc2l6ZW9mKHBlZXJLZXlJbmZvKSk7Ci0JTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIChQVUNIQVIpJnBHcm91cC0+S2V5RGVzYy5LZXlJbmZvLCBzaXplb2YoS0VZX0lORk8pKTsKLQotCSooKFVTSE9SVCopJnBlZXJLZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCopJnBlZXJLZXlJbmZvKSk7Ci0KLQkvLyAwLiBDaGVjayBjaXBoZXIgdHlwZSBtYXRjaAotCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCAmJiAocGVlcktleUluZm8uS2V5RGVzY1ZlciAhPSAyKSkKLQl7Ci0JCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7Ci0JCXJldHVybjsKLQl9Ci0JZWxzZSBpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIgIT0gMSkpCi0JewotCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gMS4gVmVyaWZ5IFJlcGxheSBjb3VudGVyCi0JLy8gICAgQ2hlY2sgUmVwbGF5IENvdW50ZXIsIGl0IGhhcyB0byBiZSBsYXJnZXIgdGhhbiBsYXN0IG9uZS4gTm8gbmVlZCB0byBiZSBleGFjdCBvbmUgbGFyZ2VyCi0JaWYoUlRNUENvbXBhcmVNZW1vcnkocEdyb3VwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDEpCi0JewotCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gVXBkYXRlIG5ldyByZXBsYXkgY291bnRlcgotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBHcm91cC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKLQotCS8vIDIuIFZlcmlmeSBNSUMgaXMgdmFsaWQKLQkvLyBTYXZlIHRoZSBNSUMgYW5kIHJlcGxhY2Ugd2l0aCB6ZXJvCi0JTmRpc01vdmVNZW1vcnkoT2xkTWljLCBwR3JvdXAtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKLQlOZGlzWmVyb01lbW9yeShwR3JvdXAtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKLQotCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQl7CS8vIEFFUwotCQlITUFDX1NIQTEoKFBVQ0hBUikgcEdyb3VwLCBwR3JvdXAtPkJvZHlfTGVuWzFdICsgNCwgcEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7Ci0JCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKLQl9Ci0JZWxzZQotCXsJLy8gVEtJUAotCQlobWFjX21kNShwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgKFBVQ0hBUikgcEdyb3VwLCBwR3JvdXAtPkJvZHlfTGVuWzFdICsgNCwgTWljKTsKLQl9Ci0KLQlpZighTmRpc0VxdWFsTWVtb3J5KE9sZE1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiBNSUMgRGlmZmVyZW50IGluIGdyb3VwIG1zZyAxIG9mIDItd2F5IGhhbmRzaGFrZSEhISEhISEhISEgXG4iKSk7Ci0JCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUiltcG9vbCk7Ci0JCXJldHVybjsKLQl9Ci0JZWxzZQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTUlDIFZBTElEIGluIGdyb3VwIG1zZyAxIG9mIDItd2F5IGhhbmRzaGFrZSEhISEhISEhISEgXG4iKSk7Ci0KLQotCS8vIDMuIERlY3J5cHQgR1RLIGZyb20gS2V5IERhdGEKLQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JewotCQkvLyBEZWNyeXB0IEFFUyBHVEsKLQkJQUVTX0dUS19LRVlfVU5XUkFQKCZwQWQtPlN0YUNmZy5QVEtbMTZdLCBLRVlEQVRBLCAgcEdyb3VwLT5LZXlEZXNjLktleURhdGFMZW5bMV0sIHBHcm91cC0+S2V5RGVzYy5LZXlEYXRhKTsKLQl9Ci0JZWxzZQkvLyBUS0lQCi0JewotCQlJTlQgaTsKLQotCQkvLyBEZWNyeXB0IFRLSVAgR1RLCi0JCS8vIENvbnN0cnVjdCAzMiBieXRlcyBSQzQgS2V5Ci0JCU5kaXNNb3ZlTWVtb3J5KEtleSwgcEdyb3VwLT5LZXlEZXNjLktleUl2LCAxNik7Ci0JCU5kaXNNb3ZlTWVtb3J5KCZLZXlbMTZdLCAmcEFkLT5TdGFDZmcuUFRLWzE2XSwgMTYpOwotCQlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS2V5LCAzMik7Ci0JCS8vZGlzY2FyZCBmaXJzdCAyNTYgYnl0ZXMKLQkJZm9yKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0JCQlBUkNGT1VSX0JZVEUoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCk7Ci0JCS8vIERlY3J5cHQgR1RLLiBCZWNhcmVmdWwsIHRoZXJlIGlzIG5vIElDViB0byBjaGVjayB0aGUgcmVzdWx0IGlzIGNvcnJlY3Qgb3Igbm90Ci0JCUFSQ0ZPVVJfREVDUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBLRVlEQVRBLCBwR3JvdXAtPktleURlc2MuS2V5RGF0YSwgcEdyb3VwLT5LZXlEZXNjLktleURhdGFMZW5bMV0pOwotCX0KLQotCS8vIFByb2Nlc3MgZGVjcnlwdGVkIGtleSBkYXRhIG1hdGVyaWFsCi0JLy8gUGFyc2Uga2V5RGF0YSB0byBoYW5kbGUgS0RFIGZvcm1hdCBmb3IgV1BBMlBTSwotCWlmIChwZWVyS2V5SW5mby5FS0RfREwpCi0JewotCQlpZiAoIVBhcnNlS2V5RGF0YShwQWQsIEtFWURBVEEsIHBHcm91cC0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdLCAwKSkKLQkJewotCQkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQllbHNlCS8vIFdQQVBTSwotCXsKLQkJLy8gc2V0IGtleSBtYXRlcmlhbCwgVHhNaWMgYW5kIFJ4TWljIGZvciBXUEFQU0sKLQkJTmRpc01vdmVNZW1vcnkoR1RLLCBLRVlEQVRBLCAzMik7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkdUSywgR1RLLCAzMik7Ci0JCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IHBlZXJLZXlJbmZvLktleUluZGV4OwotCi0JCS8vIFByZXBhcmUgcGFpci13aXNlIGtleSBpbmZvcm1hdGlvbiBpbnRvIHNoYXJlZCBrZXkgdGFibGUKLQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0sIHNpemVvZihDSVBIRVJfS0VZKSk7Ci0JCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBHVEssIExFTl9US0lQX0VLKTsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYywgJkdUS1sxNl0sIExFTl9US0lQX1JYTUlDSyk7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsICZHVEtbMjRdLCBMRU5fVEtJUF9UWE1JQ0spOwotCi0JCS8vIFVwZGF0ZSBTaGFyZWQgS2V5IENpcGhlckFsZwotCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOwotCQlpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7Ci0JCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7Ci0JCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCkKLQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkKQotCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotCi0gICAgCS8vaGV4X2R1bXAoIkdyb3VwIEtleSA6IiwgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksIExFTl9US0lQX0VLKTsKLQl9Ci0KLQkvLyBVcGRhdGUgZ3JvdXAga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQotCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCi0JCQkJCQkgIEJTUzAsCi0JCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKLQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCi0JCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LAotCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLAotCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljKTsKLQotCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQotCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAotCQkJCQkJCSAgQlNTMCwKLQkJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKLQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAotCQkJCQkJCSAgTlVMTCk7Ci0KLQkvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAotCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKLQotICAgIC8vIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJCi0gICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKLQotCS8vIGluaXQgaGVhZGVyIGFuZCBGaWxsIFBhY2tldAotCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRUFQT0wpOwotCi0JLy8gWmVybyBHcm91cCBtZXNzYWdlIDEgYm9keQotCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKLQlQYWNrZXQuUHJvVmVyCT0gRUFQT0xfVkVSOwotCVBhY2tldC5Qcm9UeXBlCT0gRUFQT0xLZXk7Ci0JUGFja2V0LkJvZHlfTGVuWzFdICA9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFOwkJLy8gTm8gZGF0YSBmaWVsZAotCi0JLy8KLQkvLyBHcm91cCBNZXNzYWdlIDIgYXMgIEVBUE9MLUtleSgxLDAsMCwwLEcsMCwwLE1JQywwKQotCS8vCi0JaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCi0JewotCQlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKLQl9Ci0JZWxzZQotCXsKLQkJUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7Ci0JfQotCi0JLy8gS2V5IGRlc2NyaXB0b3IgdmVyc2lvbiBhbmQgYXBwcm9wcmlhdGUgUlNOIElFCi0JUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gcGVlcktleUluZm8uS2V5RGVzY1ZlcjsKLQotCS8vIFVwZGF0ZSBLZXkgTGVuZ3RoCi0JUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzBdID0gcEdyb3VwLT5LZXlEZXNjLktleUxlbmd0aFswXTsKLQlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMV0gPSBwR3JvdXAtPktleURlc2MuS2V5TGVuZ3RoWzFdOwotCi0JLy8gS2V5IEluZGV4IGFzIEctTXNnIDEKLQlpZihwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spCi0JCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5SW5kZXggPSBwZWVyS2V5SW5mby5LZXlJbmRleDsKLQotCS8vIEtleSBUeXBlIEdyb3VwIGtleQotCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IEdST1VQS0VZOwotCi0JLy8gS2V5TWljIGZpZWxkIHByZXNlbnRlZAotCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljICA9IDE7Ci0KLQkvLyBTZWN1cmUgYml0Ci0JUGFja2V0LktleURlc2MuS2V5SW5mby5TZWN1cmUgID0gMTsKLQotCS8vIENvbnZlcnQgdG8gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCi0JKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pKTsKLQotCS8vIEtleSBSZXBsYXkgY291bnQKLQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwR3JvdXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0KLQkvLyBPdXQgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgZ3JvdXAgbWVzc2FnZSAyCi0JTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBVQ0hBUiAqKSZwT3V0QnVmZmVyKTsgIC8vIGFsbG9jYXRlIG1lbW9yeQotCWlmKHBPdXRCdWZmZXIgPT0gTlVMTCkKLQl7Ci0JCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUiltcG9vbCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KLQkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgotCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCi0JCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCi0JCUVORF9PRl9BUkdTKTsKLQotCS8vIFByZXBhcmUgYW5kIEZpbGwgTUlDIHZhbHVlCi0JTmRpc1plcm9NZW1vcnkoTWljLCBzaXplb2YoTWljKSk7Ci0JaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCXsKLQkJLy8gQUVTCi0JCUhNQUNfU0hBMShwT3V0QnVmZmVyLCBGcmFtZUxlbiwgcEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7Ci0JCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKLQl9Ci0JZWxzZQotCXsKLQkJaG1hY19tZDUocEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBNaWMpOwotCX0KLQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7Ci0KLQotCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgIAkJJkZyYW1lTGVuLAotCQkJCQkJTEVOR1RIXzgwMl8zLCAgICAgCQkmSGVhZGVyODAyXzMsCi0JCQkJCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAmUGFja2V0LAotCQkJCQkJRU5EX09GX0FSR1MpOwotCi0KLQkvLyA1LiBDb3B5IGZyYW1lIHRvIFR4IHJpbmcgYW5kIHByZXBhcmUgZm9yIGVuY3J5cHRpb24KLQlSVE1QVG9XaXJlbGVzc1N0YShwQWQsIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsIChQVUNIQVIpJlBhY2tldCwgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgRkFMU0UpOwotCi0JLy8gNiBGcmVlIGFsbG9jYXRlZCBtZW1vcnkKLQlNbG1lRnJlZU1lbW9yeShwQWQsIChQVUNIQVIpcE91dEJ1ZmZlcik7Ci0Jb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKLQotCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3Igc2V0IGtleSBkb25lIFdQQTIKLQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NFVF9LRVlfRE9ORV9XUEEyX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFHcm91cE1zZzFBY3Rpb24gPC0tLS0tXG4iKSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlJbml0IFdQQSBNQUMgaGVhZGVyCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVdwYU1hY0hlYWRlckluaXQoCi0JSU4JCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOIE9VVAlQSEVBREVSXzgwMl8xMQlwSGRyODAyMTEsCi0JSU4JCVVDSEFSCQkJd2VwLAotCUlOCQlQVUNIQVIJCSAgICBwQWRkcjEpCi17Ci0JTmRpc1plcm9NZW1vcnkocEhkcjgwMjExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCXBIZHI4MDIxMS0+RkMuVHlwZQk9IEJUWVBFX0RBVEE7Ci0JcEhkcjgwMjExLT5GQy5Ub0RzCT0gMTsKLQlpZiAod2VwCT09IDEpCi0JCXBIZHI4MDIxMS0+RkMuV2VwID0gMTsKLQotCSAvLwlBZGRyMTogQlNTSUQsIEFkZHIyOiBTQSwgQWRkcjM6CURBCi0JQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIxLCBwQWRkcjEpOwotCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci0JQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JcEhkcjgwMjExLT5TZXF1ZW5jZSA9CXBBZC0+U2VxdWVuY2U7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlDb3B5IGZyYW1lIGZyb20gd2FpdGluZyBxdWV1ZSBpbnRvIHJlbGF0aXZlIHJpbmcgYnVmZmVyIGFuZCBzZXQKLQlhcHByb3ByaWF0ZSBBU0lDIHJlZ2lzdGVyIHRvIGtpY2sgaGFyZHdhcmUgZW5jcnlwdGlvbiBiZWZvcmUgcmVhbGx5Ci0Jc2VudCBvdXQgdG8gYWlyLgotCi0JQXJndW1lbnRzOgotCQlwQWQJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKLQkJUE5ESVNfUEFDS0VUCVBvaW50ZXIgdG8gb3V0Z29pbmcgTmRpcyBmcmFtZQotCQlOdW1iZXJPZkZyYWcJTnVtYmVyIG9mIGZyYWdtZW50IHJlcXVpcmVkCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEICAgIFJUTVBUb1dpcmVsZXNzU3RhKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcEhlYWRlcjgwMl8zLAotICAgIElOICBVSU5UICAgICAgICAgICAgSGRyTGVuLAotCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCi0gICAgSU4gIFVJTlQgICAgICAgICAgICBEYXRhTGVuLAotICAgIElOCUJPT0xFQU4JCQlpczR3YXlGcmFtZSkKLQotewotCU5ESVNfU1RBVFVTICAgICBTdGF0dXM7Ci0JUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQ7Ci0JVUNIQVIgICBJbmRleDsKLQotCWRvCi0JewotCQkvLyAxLiBidWlsZCBhIE5ESVMgcGFja2V0IGFuZCBjYWxsIFJUTVBTZW5kUGFja2V0KCk7Ci0JCS8vICAgIGJlIGNhcmVmdWwgYWJvdXQgaG93L3doZW4gdG8gcmVsZWFzZSB0aGlzIGludGVybmFsIGFsbG9jYXRlZCBORElTIFBBQ0tFVCBidWZmZXIKLQkJU3RhdHVzID0gUlRNUEFsbG9jYXRlTmRpc1BhY2tldChwQWQsICZwUGFja2V0LCBwSGVhZGVyODAyXzMsIEhkckxlbiwgcERhdGEsIERhdGFMZW4pOwotCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCQlicmVhazsKLQotCQlpZiAoaXM0d2F5RnJhbWUpCi0JCQlSVE1QX1NFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKHBQYWNrZXQsIDEpOwotCQllbHNlCi0JCQlSVE1QX1NFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKHBQYWNrZXQsIDApOwotCi0JCS8vIDIuIHNlbmQgb3V0IHRoZSBwYWNrZXQKLQkJU3RhdHVzID0gU1RBU2VuZFBhY2tldChwQWQsIHBQYWNrZXQpOwotCQlpZihTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJLy8gRGVxdWV1ZSBvbmUgZnJhbWUgZnJvbSBUeFN3UXVldWUwLi4zIHF1ZXVlIGFuZCBwcm9jZXNzIGl0Ci0JCQkvLyBUaGVyZSBhcmUgdGhyZWUgcGxhY2UgY2FsbGluZyBkZXF1ZXVlIGZvciBUWCByaW5nLgotCQkJLy8gMS4gSGVyZSwgcmlnaHQgYWZ0ZXIgcXVldWVpbmcgdGhlIGZyYW1lLgotCQkJLy8gMi4gQXQgdGhlIGVuZCBvZiBUeFJpbmdUeERvbmUgc2VydmljZSByb3V0aW5lLgotCQkJLy8gMy4gVXBvbiBORElTIGNhbGwgUlRNUFNlbmRQYWNrZXRzCi0JCQlpZigoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpICYmCi0JCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKSkKLQkJCXsKLQkJCQlmb3IoSW5kZXggPSAwOyBJbmRleCA8IDU7IEluZGV4ICsrKQotCQkJCQlpZihwQWQtPlR4U3dRdWV1ZVtJbmRleF0uTnVtYmVyID4gMCkKLQkJCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIEluZGV4LCBNQVhfVFhfUFJPQ0VTUyk7Ci0JCQl9Ci0JCX0KLQl9IHdoaWxlKEZBTFNFKTsKLQotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBDaGVjayBTYW5pdHkgUlNOIElFIGZvcm0gQVAKLQotICAgIEFyZ3VtZW50czoKLQotICAgIFJldHVybiBWYWx1ZToKLQotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTiBDaGVja1JTTklFKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCi0JSU4gIFVDSEFSICAgICAgICAgICBEYXRhTGVuLAotCU9VVAlVQ0hBUgkJCSpPZmZzZXQpCi17Ci0JUFVDSEFSICAgICAgICAgICAgICBwVklFOwotCVVDSEFSICAgICAgICAgICAgICAgbGVuOwotCVBFSURfU1RSVUNUICAgICAgICAgcEVpZDsKLQlCT09MRUFOCQkJCXJlc3VsdCA9IEZBTFNFOwotCi0JcFZJRSA9IHBEYXRhOwotCWxlbgkgPSBEYXRhTGVuOwotCSpPZmZzZXQgPSAwOwotCi0Jd2hpbGUgKGxlbiA+IHNpemVvZihSU05JRTIpKQotCXsKLQkJcEVpZCA9IChQRUlEX1NUUlVDVCkgcFZJRTsKLQkJLy8gV1BBIFJTTiBJRQotCQlpZiAoKHBFaWQtPkVpZCA9PSBJRV9XUEEpICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpKSkKLQkJewotCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEgfHwgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgotCQkJCShOZGlzRXF1YWxNZW1vcnkocFZJRSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuKSkgJiYKLQkJCQkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPT0gKHBFaWQtPkxlbiArIDIpKSkKLQkJCXsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hlY2tSU05JRSA9PT4gV1BBL1dQQVBTSyBSU04gSUUgbWF0Y2hlZCBpbiBNc2cgMywgTGVuZ3RoKCVkKSBcbiIsIChwRWlkLT5MZW4gKyAyKSkpOwotCQkJCQlyZXN1bHQgPSBUUlVFOwotCQkJfQotCi0JCQkqT2Zmc2V0ICs9IChwRWlkLT5MZW4gKyAyKTsKLQkJfQotCQkvLyBXUEEyIFJTTiBJRQotCQllbHNlIGlmICgocEVpZC0+RWlkID09IElFX1JTTikgJiYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCArIDIsIFJTTl9PVUksIDMpKSkKLQkJewotCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyIHx8IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCi0JCQkJKE5kaXNFcXVhbE1lbW9yeShwVklFLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4pKSAmJgotCQkJCShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbiA9PSAocEVpZC0+TGVuICsgMikpKQotCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGVja1JTTklFID09PiBXUEEyL1dQQTJQU0sgUlNOIElFIG1hdGNoZWQgaW4gTXNnIDMsIExlbmd0aCglZCkgXG4iLCAocEVpZC0+TGVuICsgMikpKTsKLQkJCQkJcmVzdWx0ID0gVFJVRTsKLQkJCX0KLQotCQkJKk9mZnNldCArPSAocEVpZC0+TGVuICsgMik7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlicmVhazsKLQkJfQotCi0JCXBWSUUgKz0gKHBFaWQtPkxlbiArIDIpOwotCQlsZW4gIC09IChwRWlkLT5MZW4gKyAyKTsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGVja1JTTklFID09PiBza2lwX29mZnNldCglZCkgXG4iLCAqT2Zmc2V0KSk7Ci0KLQlyZXR1cm4gcmVzdWx0OwotCi19Ci0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIFJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgUGFyc2UgS0VZREFUQSBmaWVsZC4gIEtFWURBVEFbXSBNYXkgY29udGFpbiAyIFJTTiBJRSBhbmQgb3B0aW9uYWxseSBHVEsuCi0gICAgR1RLICBpcyBlbmNhcHR1bGF0ZWQgaW4gS0RFIGZvcm1hdCBhdCAgcC44MyA4MDIuMTFpIEQxMAotCi0gICAgQXJndW1lbnRzOgotCi0gICAgUmV0dXJuIFZhbHVlOgotCi0gICAgTm90ZToKLSAgICAgICAgODAyLjExaSBEMTAKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4gUGFyc2VLZXlEYXRhKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcEtleURhdGEsCi0JSU4gIFVDSEFSICAgICAgICAgICBLZXlEYXRhTGVuLAotCUlOCVVDSEFSCQkJYlBhaXJld2lzZSkKLXsKLSAgICBQS0RFX0VOQ0FQICAgICAgICAgIHBLREUgPSBOVUxMOwotICAgIFBVQ0hBUiAgICAgICAgICAgICAgcE15S2V5RGF0YSA9IHBLZXlEYXRhOwotICAgIFVDSEFSICAgICAgICAgICAgICAgS2V5RGF0YUxlbmd0aCA9IEtleURhdGFMZW47Ci0gICAgVUNIQVIgICAgICAgICAgICAgICBHVEtMRU47Ci0JVUNIQVIJCQkJc2tpcF9vZmZzZXQ7Ci0KLQkvLyBWZXJpZnkgVGhlIFJTTiBJRSBjb250YWluZWQgaW4gUGFpcmV3aXNlLU1zZyAzIGFuZCBza2lwIGl0Ci0JaWYgKGJQYWlyZXdpc2UpCi0gICAgewotCQkvLyBDaGVjayBSU04gSUUgd2hldGhlciBpdCBpcyBXUEEyL1dQQTJQU0sKLQkJaWYgKCFDaGVja1JTTklFKHBBZCwgcEtleURhdGEsIEtleURhdGFMZW4sICZza2lwX29mZnNldCkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlBhcnNlS2V5RGF0YSA9PT4gV1BBMi9XUEEyUFNLIFJTTiBJRSBtaXNtYXRjaGVkIFxuIikpOwotCQkJaGV4X2R1bXAoIkdldCBLRVlEQVRBIDoiLCBwS2V5RGF0YSwgS2V5RGF0YUxlbik7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0gICAgCX0KLSAgICAJZWxzZQotCQl7Ci0JCQkvLyBza2lwIFJTTiBJRQotCQkJcE15S2V5RGF0YSArPSBza2lwX29mZnNldDsKLQkJCUtleURhdGFMZW5ndGggLT0gc2tpcF9vZmZzZXQ7Ci0KLQkJCS8vREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGFyc2VLZXlEYXRhID09PiBXUEEyL1dQQTJQU0sgUlNOIElFIG1hdGNoZWQgaW4gTXNnIDMsIExlbmd0aCglZCkgXG4iLCBza2lwX29mZnNldCkpOwotCQl9Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJQYXJzZUtleURhdGEgPT0+IEtleURhdGFMZW5ndGggJWQgd2l0aG91dCBSU05fSUUgXG4iLCBLZXlEYXRhTGVuZ3RoKSk7Ci0KLQkvLyBQYXJzZSBFS0QgZm9ybWF0Ci0JaWYgKEtleURhdGFMZW5ndGggPj0gOCkKLSAgICB7Ci0gICAgICAgIHBLREUgPSAoUEtERV9FTkNBUCkgcE15S2V5RGF0YTsKLSAgICB9Ci0JZWxzZQotICAgIHsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IEtleURhdGFMZW5ndGggaXMgdG9vIHNob3J0IFxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0KLQkvLyBTYW5pdHkgY2hlY2sgLSBzaGFyZWQga2V5IGluZGV4IHNob3VsZCBub3QgYmUgMAotCWlmIChwS0RFLT5HVEtFbmNhcC5LaWQgPT0gMCkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SOiBHVEsgS2V5IGluZGV4IHplcm8gXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLQkvLyBTYW5pdHkgY2hlY2sgLSBLRUQgbGVuZ3RoCi0JaWYgKEtleURhdGFMZW5ndGggPCAocEtERS0+TGVuICsgMikpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogVGhlIGxlbiBmcm9tIEtERSBpcyB0b28gc2hvcnQgXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLQkvLyBHZXQgR1RLIGxlbmd0aCAtIHJlZmVyIHRvIElFRUUgODAyLjExaS0yMDA0IHAuODIKLQlHVEtMRU4gPSBwS0RFLT5MZW4gLTY7Ci0KLQlpZiAoR1RLTEVOIDwgTEVOX0FFU19LRVkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogR1RLIEtleSBsZW5ndGggaXMgdG9vIHNob3J0ICglZCkgXG4iLCBHVEtMRU4pKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCX0KLQllbHNlCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkdUSyBLZXkgd2l0aCBLREUgZm9ybWV0IGdvdCBpbmRleD0lZCwgbGVuPSVkIFxuIiwgcEtERS0+R1RLRW5jYXAuS2lkLCBHVEtMRU4pKTsKLQotCS8vIFVwZGF0ZSBHVEsKLQkvLyBzZXQga2V5IG1hdGVyaWFsLCBUeE1pYyBhbmQgUnhNaWMgZm9yIFdQQVBTSwotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkdUSywgcEtERS0+R1RLRW5jYXAuR1RLLCAzMik7Ci0JcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gcEtERS0+R1RLRW5jYXAuS2lkOwotCi0JLy8gVXBkYXRlIHNoYXJlZCBrZXkgdGFibGUKLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKLQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiA9IExFTl9US0lQX0VLOwotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBwS0RFLT5HVEtFbmNhcC5HVEssIExFTl9US0lQX0VLKTsKLQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljLCAmcEtERS0+R1RLRW5jYXAuR1RLWzE2XSwgTEVOX1RLSVBfUlhNSUNLKTsKLQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLCAmcEtERS0+R1RLRW5jYXAuR1RLWzI0XSwgTEVOX1RLSVBfVFhNSUNLKTsKLQotCS8vIFVwZGF0ZSBTaGFyZWQgS2V5IENpcGhlckFsZwotCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0JaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCi0JCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7Ci0JZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOwotCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCkKLQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0JZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCkKLQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotCi0JcmV0dXJuIFRSVUU7Ci0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUNpc2NvIENDS00gUFJGIGZ1bmN0aW9uCi0KLQlBcmd1bWVudHM6Ci0JCWtleQkJCQlDaXNjbyBCYXNlIFRyYW5zaWVudCBLZXkgKEJUSykKLQkJa2V5X2xlbgkJCVRoZSBrZXkgbGVuZ3RoIG9mIHRoZSBCVEsKLQkJZGF0YQkJCVJ1cXVlc3QgTnVtYmVyKFJOKSArIEJTU0lECi0JCWRhdGFfbGVuCQlUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhCi0JCW91dHB1dAkJCVN0b3JlIGZvciBQVEsoUGFpcndpc2UgdHJhbnNpZW50IGtleXMpCi0JCWxlbgkJCQlUaGUgbGVuZ3RoIG9mIHRoZSBvdXRwdXQKLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0JCTgwMi4xaQlBbm5leCBGLjkKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQ0NLTVBSRigKLQlJTglVQ0hBUgkqa2V5LAotCUlOCUlOVAkJa2V5X2xlbiwKLQlJTglVQ0hBUgkqZGF0YSwKLQlJTglJTlQJCWRhdGFfbGVuLAotCU9VVAlVQ0hBUgkqb3V0cHV0LAotCUlOCUlOVAkJbGVuKQotewotCUlOVAkJaTsKLQlVQ0hBUglpbnB1dFsxMDI0XTsKLQlJTlQJCWN1cnJlbnRpbmRleCA9IDA7Ci0JSU5UCQl0b3RhbF9sZW47Ci0KLQlOZGlzTW92ZU1lbW9yeShpbnB1dCwgZGF0YSwgZGF0YV9sZW4pOwotCXRvdGFsX2xlbiA9IGRhdGFfbGVuOwotCWlucHV0W3RvdGFsX2xlbl0gPSAwOwotCXRvdGFsX2xlbisrOwotCWZvcgkoaSA9IDA7CWkgPAkobGVuICsgMTkpIC8gMjA7IGkrKykKLQl7Ci0JCUhNQUNfU0hBMShpbnB1dCwgdG90YWxfbGVuLAlrZXksIGtleV9sZW4sICZvdXRwdXRbY3VycmVudGluZGV4XSk7Ci0JCWN1cnJlbnRpbmRleCArPQkyMDsKLQkJaW5wdXRbdG90YWxfbGVuIC0gMV0rKzsKLQl9Ci19Cit2b2lkIGluY19ieXRlX2FycmF5KHU4ICogY291bnRlciwgaW50IGxlbik7CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xODY0LDE4OSArNTgsMTc4IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUTVBSZXBvcnRNaWNFcnJvcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQQ0lQSEVSX0tFWSAJcFdwYUtleSkKK3ZvaWQgUlRNUFJlcG9ydE1pY0Vycm9yKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X2NpcGhlcl9rZXkgKnBXcGFLZXkpCiB7Ci0JVUxPTkcJTm93OwotICAgIFVDSEFSICAgdW5pY2FzdEtleSA9IChwV3BhS2V5LT5UeXBlID09IFBBSVJXSVNFX0tFWSA/IDE6MCk7CisJdW5zaWduZWQgbG9uZyBOb3c7CisJdTggdW5pY2FzdEtleSA9IChwV3BhS2V5LT5UeXBlID09IFBBSVJXSVNFX0tFWSA/IDEgOiAwKTsKIAotCS8vIFJlY29yZCBMYXN0IE1JQyBlcnJvciB0aW1lIGFuZCBjb3VudAotCU5vdyA9IGppZmZpZXM7Ci0JaWYgKHBBZC0+U3RhQ2ZnLk1pY0VyckNudCA9PSAwKQotCXsKKwkvKiBSZWNvcmQgTGFzdCBNSUMgZXJyb3IgdGltZSBhbmQgY291bnQgKi8KKwlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCWlmIChwQWQtPlN0YUNmZy5NaWNFcnJDbnQgPT0gMCkgewogCQlwQWQtPlN0YUNmZy5NaWNFcnJDbnQrKzsKIAkJcEFkLT5TdGFDZmcuTGFzdE1pY0Vycm9yVGltZSA9IE5vdzsKLSAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgOCk7Ci0JfQotCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLk1pY0VyckNudCA9PSAxKQotCXsKLQkJaWYgKChwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lICsgKDYwICogT1NfSFopKSA8IE5vdykKLQkJewotCQkJLy8gVXBkYXRlIExhc3QgTUlDIGVycm9yIHRpbWUsIHRoaXMgZGlkIG5vdCB2aW9sYXRlIHR3byBNSUMgZXJyb3JzIHdpdGhpbiA2MCBzZWNvbmRzCisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIDgpOworCX0gZWxzZSBpZiAocEFkLT5TdGFDZmcuTWljRXJyQ250ID09IDEpIHsKKwkJaWYgKChwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lICsgKDYwICogT1NfSFopKSA8IE5vdykgeworCQkJLyogVXBkYXRlIExhc3QgTUlDIGVycm9yIHRpbWUsIHRoaXMgZGlkIG5vdCB2aW9sYXRlIHR3byBNSUMgZXJyb3JzIHdpdGhpbiA2MCBzZWNvbmRzICovCiAJCQlwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lID0gTm93OwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCiAJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfQ09VTlRFUl9NRUFTVVJFU19FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsCisJCQkJCQkgICAgICBJV19DT1VOVEVSX01FQVNVUkVTX0VWRU5UX0ZMQUcsCisJCQkJCQkgICAgICBwQWQtPk1hY1RhYi4KKwkJCQkJCSAgICAgIENvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwKKwkJCQkJCSAgICAgIEJTUzAsIDApOwogCiAJCQlwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lID0gTm93OwotCQkJLy8gVmlvbGF0ZSBNSUMgZXJyb3IgY291bnRzLCBNSUMgY291bnRlcm1lYXN1cmVzIGtpY2tzIGluCisJCQkvKiBWaW9sYXRlIE1JQyBlcnJvciBjb3VudHMsIE1JQyBjb3VudGVybWVhc3VyZXMga2lja3MgaW4gKi8KIAkJCXBBZC0+U3RhQ2ZnLk1pY0VyckNudCsrOworCQkJLyogV2Ugc2hhbGwgYmxvY2sgYWxsIHJlY2VwdGlvbiAqLworCQkJLyogV2Ugc2hhbGwgY2xlYW4gYWxsIFR4IHJpbmcgYW5kIGRpc2Fzc29pY2F0ZSBmcm9tIEFQIGFmdGVyIG5leHQgRUFQT0wgZnJhbWUgKi8KKwkJCS8qICovCisJCQkvKiBObyBuZWNlc3NhcnkgdG8gY2xlYW4gYWxsIFR4IHJpbmcsIG9uIFJUTVBIYXJkVHJhbnNtaXQgd2lsbCBzdG9wIHNlbmRpbmcgbm9uLTgwMi4xWCBFQVBPTCBwYWNrZXRzICovCisJCQkvKiBpZiBwQWQtPlN0YUNmZy5NaWNFcnJDbnQgZ3JlYXRlciB0aGFuIDIuICovCisJCQkvKiAqLworCQkJLyogUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JLKTsgKi8KKwkJCS8qIFJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CRSk7ICovCisJCQkvKiBSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVkkpOyAqLworCQkJLyogUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZPKTsgKi8KKwkJCS8qIFJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9IQ0NBKTsgKi8KIAkJfQotCX0KLQllbHNlCi0JewotCQkvLyBNSUMgZXJyb3IgY291bnQgPj0gMgotCQkvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuCisJfSBlbHNlIHsKKwkJLyogTUlDIGVycm9yIGNvdW50ID49IDIgKi8KKwkJLyogVGhpcyBzaG91bGQgbm90IGhhcHBlbiAqLwogCQk7CiAJfQotICAgIE1sbWVFbnF1ZXVlKHBBZCwKLQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKLQkJCQlPSURfODAyXzExX01JQ19GQUlMVVJFX1JFUE9SVF9GUkFNRSwKLQkJCQkxLAotCQkJCSZ1bmljYXN0S2V5KTsKKwlNbG1lRW5xdWV1ZShwQWQsCisJCSAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJICAgIE9JRF84MDJfMTFfTUlDX0ZBSUxVUkVfUkVQT1JUX0ZSQU1FLCAxLCAmdW5pY2FzdEtleSk7CiAKLSAgICBpZiAocEFkLT5TdGFDZmcuTWljRXJyQ250ID09IDIpCi0gICAgewotICAgICAgICBSVE1QU2V0VGltZXIoJnBBZC0+U3RhQ2ZnLldwYURpc2Fzc29jQW5kQmxvY2tBc3NvY1RpbWVyLCAxMDApOwotICAgIH0KKwlpZiAocEFkLT5TdGFDZmcuTWljRXJyQ250ID09IDIpIHsKKwkJUlRNUFNldFRpbWVyKCZwQWQtPlN0YUNmZy5XcGFEaXNhc3NvY0FuZEJsb2NrQXNzb2NUaW1lciwgMTAwKTsKKwl9CiB9CiAKICNkZWZpbmUJTEVOR1RIX0VBUF9IICAgIDQKLS8vIElmIHRoZSByZWNlaXZlZCBmcmFtZSBpcyBFQVAtUGFja2V0ICxmaW5kIG91dCBpdHMgRUFQLUNvZGUgKFJlcXVlc3QoMHgwMSksIFJlc3BvbnNlKDB4MDIpLCBTdWNjZXNzKDB4MDMpLCBGYWlsdXJlKDB4MDQpKS4KLUlOVAkgICAgV3BhQ2hlY2tFYXBDb2RlKAotCUlOICBQUlRNUF9BREFQVEVSICAgCQlwQWQsCi0JSU4gIFBVQ0hBUgkJCQlwRnJhbWUsCi0JSU4gIFVTSE9SVAkJCQlGcmFtZUxlbiwKLQlJTiAgVVNIT1JUCQkJCU9mZlNldCkKKy8qIElmIHRoZSByZWNlaXZlZCBmcmFtZSBpcyBFQVAtUGFja2V0ICxmaW5kIG91dCBpdHMgRUFQLUNvZGUgKFJlcXVlc3QoMHgwMSksIFJlc3BvbnNlKDB4MDIpLCBTdWNjZXNzKDB4MDMpLCBGYWlsdXJlKDB4MDQpKS4gKi8KK2ludCBXcGFDaGVja0VhcENvZGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgdTggKnBGcmFtZSwgdTE2IEZyYW1lTGVuLCB1MTYgT2ZmU2V0KQogewogCi0JUFVDSEFSCXBEYXRhOwotCUlOVAlyZXN1bHQgPSAwOworCXU4ICpwRGF0YTsKKwlpbnQgcmVzdWx0ID0gMDsKIAotCWlmKCBGcmFtZUxlbiA8IE9mZlNldCArIExFTkdUSF9FQVBPTF9IICsgTEVOR1RIX0VBUF9IICkKKwlpZiAoRnJhbWVMZW4gPCBPZmZTZXQgKyBMRU5HVEhfRUFQT0xfSCArIExFTkdUSF9FQVBfSCkKIAkJcmV0dXJuIHJlc3VsdDsKIAotCXBEYXRhID0gcEZyYW1lICsgT2ZmU2V0OyAvLyBza2lwIG9mZnNldCBieXRlcworCXBEYXRhID0gcEZyYW1lICsgT2ZmU2V0OwkvKiBza2lwIG9mZnNldCBieXRlcyAqLwogCi0JaWYoKihwRGF0YSsxKSA9PSBFQVBQYWNrZXQpIAkvLyA4MDIuMXggaGVhZGVyIC0gUGFja2V0IFR5cGUKKwlpZiAoKihwRGF0YSArIDEpID09IEVBUFBhY2tldCkJLyogODAyLjF4IGhlYWRlciAtIFBhY2tldCBUeXBlICovCiAJewotCQkgcmVzdWx0ID0gKihwRGF0YSs0KTsJCS8vIEVBUCBoZWFkZXIgLSBDb2RlCisJCXJlc3VsdCA9ICoocERhdGEgKyA0KTsJLyogRUFQIGhlYWRlciAtIENvZGUgKi8KIAl9CiAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1WT0lEICAgIFdwYVNlbmRNaWNGYWlsdXJlVG9XcGFTdXBwbGljYW50KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgIHBBZCwKLSAgICBJTiAgQk9PTEVBTiAgICAgICAgICBiVW5pY2FzdCkKK3ZvaWQgV3BhU2VuZE1pY0ZhaWx1cmVUb1dwYVN1cHBsaWNhbnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBCT09MRUFOIGJVbmljYXN0KQogewotICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKLSAgICBjaGFyIGN1c3RvbVtJV19DVVNUT01fTUFYXSA9IHswfTsKKwljaGFyIGN1c3RvbVtJV19DVVNUT01fTUFYXSA9IHsgMCB9OwogCi0gICAgc3ByaW50ZihjdXN0b20sICJNTE1FLU1JQ0hBRUxNSUNGQUlMVVJFLmluZGljYXRpb24iKTsKLSAgICBpZiAoYlVuaWNhc3QpCi0gICAgICAgIHNwcmludGYoY3VzdG9tLCAiJXMgdW5pY2FzdCIsIGN1c3RvbSk7Ci0gICAgd3JxdS5kYXRhLmxlbmd0aCA9IHN0cmxlbihjdXN0b20pOwotICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgY3VzdG9tKTsKKwlzcHJpbnRmKGN1c3RvbSwgIk1MTUUtTUlDSEFFTE1JQ0ZBSUxVUkUuaW5kaWNhdGlvbiIpOworCWlmIChiVW5pY2FzdCkKKwkJc3ByaW50ZihjdXN0b20sICIlcyB1bmljYXN0IiwgY3VzdG9tKTsKIAotICAgIHJldHVybjsKKwlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIElXRVZDVVNUT00sIC0xLCBOVUxMLCAodTggKiljdXN0b20sCisJCQkJc3RybGVuKGN1c3RvbSkpOworCisJcmV0dXJuOwogfQogCi1WT0lECVdwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIFdwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JUFVDSEFSICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKLQlVTE9ORyAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKLQlFQVBPTF9QQUNLRVQgICAgICAgIFBhY2tldDsKLQlVQ0hBUiAgICAgICAgICAgICAgIE1pY1sxNl07Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICBiVW5pY2FzdDsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJdTggSGVhZGVyODAyXzNbMTRdOworCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW4gPSAwOworCXN0cnVjdCBydF9lYXBvbF9wYWNrZXQgUGFja2V0OworCXU4IE1pY1sxNl07CisJQk9PTEVBTiBiVW5pY2FzdDsKIAogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZSAtLS0tLT5cbiIpKTsKIAotICAgIGJVbmljYXN0ID0gKEVsZW0tPk1zZ1swXSA9PSAxID8gVFJVRTpGQUxTRSk7CisJYlVuaWNhc3QgPSAoRWxlbS0+TXNnWzBdID09IDEgPyBUUlVFIDogRkFMU0UpOwogCXBBZC0+U2VxdWVuY2UgPSAoKHBBZC0+U2VxdWVuY2UpICsgMSkgJiAoTUFYX1NFUV9OVU1CRVIpOwogCi0JLy8gaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0Ci0JTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CisJLyogaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0ICovCisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQkJICBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CiAKIAlOZGlzWmVyb01lbW9yeSgmUGFja2V0LCBzaXplb2YoUGFja2V0KSk7Ci0JUGFja2V0LlByb1Zlcgk9IEVBUE9MX1ZFUjsKLQlQYWNrZXQuUHJvVHlwZQk9IEVBUE9MS2V5OworCVBhY2tldC5Qcm9WZXIgPSBFQVBPTF9WRVI7CisJUGFja2V0LlByb1R5cGUgPSBFQVBPTEtleTsKIAogCVBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEExX0tFWV9ERVNDOwogCi0gICAgLy8gUmVxdWVzdCBmaWVsZCBwcmVzZW50ZWQKLSAgICBQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlJlcXVlc3QgPSAxOworCS8qIFJlcXVlc3QgZmllbGQgcHJlc2VudGVkICovCisJUGFja2V0LktleURlc2MuS2V5SW5mby5SZXF1ZXN0ID0gMTsKIAotCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQl7CisJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSB7CiAJCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IDI7Ci0JfQotCWVsc2UJICAvLyBUS0lQCisJfSBlbHNlCQkJLyogVEtJUCAqLwogCXsKIAkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gMTsKIAl9CiAKLSAgICBQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSAoYlVuaWNhc3QgPyBQQUlSV0lTRUtFWSA6IEdST1VQS0VZKTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSAoYlVuaWNhc3QgPyBQQUlSV0lTRUtFWSA6IEdST1VQS0VZKTsKIAotCS8vIEtleU1pYyBmaWVsZCBwcmVzZW50ZWQKLQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYyAgPSAxOworCS8qIEtleU1pYyBmaWVsZCBwcmVzZW50ZWQgKi8KKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYyA9IDE7CiAKLSAgICAvLyBFcnJvciBmaWVsZCBwcmVzZW50ZWQKLQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLkVycm9yICA9IDE7CisJLyogRXJyb3IgZmllbGQgcHJlc2VudGVkICovCisJUGFja2V0LktleURlc2MuS2V5SW5mby5FcnJvciA9IDE7CiAKLQkvLyBVcGRhdGUgcGFja2V0IGxlbmd0aCBhZnRlciBkZWNpZGUgS2V5IGRhdGEgcGF5bG9hZAotCVBhY2tldC5Cb2R5X0xlblsxXSAgPSBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRTsKKwkvKiBVcGRhdGUgcGFja2V0IGxlbmd0aCBhZnRlciBkZWNpZGUgS2V5IGRhdGEgcGF5bG9hZCAqLworCVNFVF91MTZfVE9fQVJSQVJZKFBhY2tldC5Cb2R5X0xlbiwgTEVOX0VBUE9MX0tFWV9NU0cpCisJICAgIC8qIEtleSBSZXBsYXkgQ291bnQgKi8KKwkgICAgTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwKKwkJCSAgIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCWluY19ieXRlX2FycmF5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIDgpOwogCi0JLy8gS2V5IFJlcGxheSBDb3VudAotCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOwotICAgIGluY19ieXRlX2FycmF5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIDgpOworCS8qIENvbnZlcnQgdG8gbGl0dGxlLWVuZGlhbiBmb3JtYXQuICovCisJKigodTE2ICopICYgUGFja2V0LktleURlc2MuS2V5SW5mbykgPQorCSAgICBjcHUybGUxNigqKCh1MTYgKikgJiBQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSk7CiAKLQkvLyBDb252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgotCSooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSk7Ci0KLQotCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKLQlpZihwT3V0QnVmZmVyID09IE5VTEwpCi0JeworCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICh1OCAqKikgJiBwT3V0QnVmZmVyKTsJLyogYWxsb2NhdGUgbWVtb3J5ICovCisJaWYgKHBPdXRCdWZmZXIgPT0gTlVMTCkgewogCQlyZXR1cm47CiAJfQorCS8qIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbiAqLworCS8qIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uICovCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgJkZyYW1lTGVuLAorCQkJICBDT05WX0FSUkFSWV9UT191MTYoUGFja2V0LkJvZHlfTGVuKSArIDQsICZQYWNrZXQsCisJCQkgIEVORF9PRl9BUkdTKTsKIAotCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgotCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCi0JCSAgICAgICAgICAgICAgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAmUGFja2V0LAotCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKLQotCS8vIFByZXBhcmUgYW5kIEZpbGwgTUlDIHZhbHVlCisJLyogUHJlcGFyZSBhbmQgRmlsbCBNSUMgdmFsdWUgKi8KIAlOZGlzWmVyb01lbW9yeShNaWMsIHNpemVvZihNaWMpKTsKLQlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JewkvLyBBRVMKLSAgICAgICAgVUNIQVIgZGlnZXN0WzIwXSA9IHswfTsKLQkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpIHsJLyogQUVTICovCisJCXU4IGRpZ2VzdFsyMF0gPSB7IDAgfTsKKwkJSE1BQ19TSEExKHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwKKwkJCSAgZGlnZXN0LCBTSEExX0RJR0VTVF9TSVpFKTsKIAkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOwotCX0KLQllbHNlCi0JewkvLyBUS0lQCi0JCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLlBUSywgIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7CisJfSBlbHNlIHsJCS8qIFRLSVAgKi8KKwkJSE1BQ19NRDUocEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLAorCQkJIE1pYywgTUQ1X0RJR0VTVF9TSVpFKTsKIAl9CiAJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOwogCi0gICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgIAkmRnJhbWVMZW4sCi0gICAgCSAgCQkJTEVOR1RIXzgwMl8zLCAgICAgCQkJJkhlYWRlcjgwMl8zLAotICAgIAkJCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICAgJlBhY2tldCwKLSAgICAJCQkJRU5EX09GX0FSR1MpOworCS8qIGNvcHkgZnJhbWUgdG8gVHggcmluZyBhbmQgc2VuZCBNSUMgZmFpbHVyZSByZXBvcnQgZnJhbWUgdG8gYXV0aGVudGljYXRvciAqLworCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sCisJCQkgIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsCisJCQkgICh1OCAqKSYgUGFja2V0LAorCQkJICBDT05WX0FSUkFSWV9UT191MTYoUGFja2V0LkJvZHlfTGVuKSArIDQsIEZBTFNFKTsKIAotCS8vIG9weSBmcmFtZSB0byBUeCByaW5nIGFuZCBzZW5kIE1JQyBmYWlsdXJlIHJlcG9ydCBmcmFtZSB0byBhdXRoZW50aWNhdG9yCi0JUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLCAoUFVDSEFSKSZQYWNrZXQsIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsIEZBTFNFKTsKLQotCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUilwT3V0QnVmZmVyKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsICh1OCAqKXBPdXRCdWZmZXIpOwogCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhTWljRmFpbHVyZVJlcG9ydEZyYW1lIDwtLS0tLVxuIikpOwogfQpAQCAtMjA2MCw3ICsyNDMsNyBAQAogICogcm9sbGluZyBvdmVyIHRvIG1vcmUgc2lnbmlmaWNhbnQgYnl0ZXMgaWYgdGhlIGJ5dGUgd2FzIGluY3JlbWVudGVkIGZyb20KICAqIDB4ZmYgdG8gMHgwMC4KICAqLwotdm9pZCBpbmNfYnl0ZV9hcnJheShVQ0hBUiAqY291bnRlciwgaW50IGxlbikKK3ZvaWQgaW5jX2J5dGVfYXJyYXkodTggKiBjb3VudGVyLCBpbnQgbGVuKQogewogCWludCBwb3MgPSBsZW4gLSAxOwogCXdoaWxlIChwb3MgPj0gMCkgewpAQCAtMjA3MSwyMSArMjU0LDEyMCBAQAogCX0KIH0KIAotVk9JRCBXcGFEaXNhc3NvY0FwQW5kQmxvY2tBc3NvYygKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0gICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit2b2lkIFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJCQl2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCQkJdm9pZCAqU3lzdGVtU3BlY2lmaWMyLAorCQkJCXZvaWQgKlN5c3RlbVNwZWNpZmljMykKIHsKLSAgICBSVE1QX0FEQVBURVIgICAgICAgICAgICAgICAgKnBBZCA9IChQUlRNUF9BREFQVEVSKUZ1bmN0aW9uQ29udGV4dDsKLSAgICBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgICAgRGlzYXNzb2NSZXE7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilGdW5jdGlvbkNvbnRleHQ7CisJc3RydWN0IHJ0X21sbWVfZGlzYXNzb2NfcmVxIERpc2Fzc29jUmVxOwogCi0JLy8gZGlzYXNzb2MgZnJvbSBjdXJyZW50IEFQIGZpcnN0Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFJlcG9ydE1pY0Vycm9yIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUCBhZnRlciBzZW5kaW5nIHNlY29uZCBjb250aW51b3VzIEVBUE9MIGZyYW1lXG4iKSk7Ci0JRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9NSUNfRkFJTFVSRSk7Ci0JTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOworCS8qIGRpc2Fzc29jIGZyb20gY3VycmVudCBBUCBmaXJzdCAqLworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJSVE1QUmVwb3J0TWljRXJyb3IgLSBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQIGFmdGVyIHNlbmRpbmcgc2Vjb25kIGNvbnRpbnVvdXMgRUFQT0wgZnJhbWVcbiIpKTsKKwlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwKKwkJCSBSRUFTT05fTUlDX0ZBSUxVUkUpOworCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLAorCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSksICZEaXNhc3NvY1JlcSk7CiAKIAlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0RJU0FTU09DOwogCXBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID0gVFJVRTsKIH0KIAordm9pZCBXcGFTdGFQYWlyd2lzZUtleVNldHRpbmcoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXN0cnVjdCBydF9jaXBoZXJfa2V5ICpwU2hhcmVkS2V5OworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeTsKKworCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworCisJLyogUGFpcndpc2Uga2V5IHNoYWxsIHVzZSBrZXkjMCAqLworCXBTaGFyZWRLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF07CisKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QVEssIHBFbnRyeS0+UFRLLCBMRU5fUFRLKTsKKworCS8qIFByZXBhcmUgcGFpci13aXNlIGtleSBpbmZvcm1hdGlvbiBpbnRvIHNoYXJlZCBrZXkgdGFibGUgKi8KKwlOZGlzWmVyb01lbW9yeShwU2hhcmVkS2V5LCBzaXplb2Yoc3RydWN0IHJ0X2NpcGhlcl9rZXkpKTsKKwlwU2hhcmVkS2V5LT5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKwlOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5LZXksICZwQWQtPlN0YUNmZy5QVEtbMzJdLCBMRU5fVEtJUF9FSyk7CisJTmRpc01vdmVNZW1vcnkocFNoYXJlZEtleS0+UnhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDhdLAorCQkgICAgICAgTEVOX1RLSVBfUlhNSUNLKTsKKwlOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5UeE1pYywKKwkJICAgICAgICZwQWQtPlN0YUNmZy5QVEtbNDggKyBMRU5fVEtJUF9SWE1JQ0tdLCBMRU5fVEtJUF9UWE1JQ0spOworCisJLyogRGVjaWRlIGl0cyBDaGlwZXJBbGcgKi8KKwlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwllbHNlIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisJZWxzZQorCQlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKworCS8qIFVwZGF0ZSB0aGVzZSByZWxhdGVkIGluZm9ybWF0aW9uIHRvIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKi8KKwlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LktleSwgJnBBZC0+U3RhQ2ZnLlBUS1szMl0sCisJCSAgICAgICBMRU5fVEtJUF9FSyk7CisJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OF0sCisJCSAgICAgICBMRU5fVEtJUF9SWE1JQ0spOworCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuVHhNaWMsCisJCSAgICAgICAmcEFkLT5TdGFDZmcuUFRLWzQ4ICsgTEVOX1RLSVBfUlhNSUNLXSwgTEVOX1RLSVBfVFhNSUNLKTsKKwlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBTaGFyZWRLZXktPkNpcGhlckFsZzsKKworCS8qIFVwZGF0ZSBwYWlyd2lzZSBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlICovCisJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKwkJCSAgICAgIEJTUzAsCisJCQkgICAgICAwLAorCQkJICAgICAgcFNoYXJlZEtleS0+Q2lwaGVyQWxnLAorCQkJICAgICAgcFNoYXJlZEtleS0+S2V5LAorCQkJICAgICAgcFNoYXJlZEtleS0+VHhNaWMsIHBTaGFyZWRLZXktPlJ4TWljKTsKKworCS8qIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSAqLworCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCAwLCBwU2hhcmVkS2V5LT5DaXBoZXJBbGcsIHBFbnRyeSk7CisJU1RBX1BPUlRfU0VDVVJFRChwQWQpOworCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiJXMgOiBBSUQoJWQpIHBvcnQgc2VjdXJlZFxuIiwgX19mdW5jX18sIHBFbnRyeS0+QWlkKSk7CisKK30KKwordm9pZCBXcGFTdGFHcm91cEtleVNldHRpbmcoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXN0cnVjdCBydF9jaXBoZXJfa2V5ICpwU2hhcmVkS2V5OworCisJcFNoYXJlZEtleSA9ICZwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdOworCisJLyogUHJlcGFyZSBwYWlyLXdpc2Uga2V5IGluZm9ybWF0aW9uIGludG8gc2hhcmVkIGtleSB0YWJsZSAqLworCU5kaXNaZXJvTWVtb3J5KHBTaGFyZWRLZXksIHNpemVvZihzdHJ1Y3QgcnRfY2lwaGVyX2tleSkpOworCXBTaGFyZWRLZXktPktleUxlbiA9IExFTl9US0lQX0VLOworCU5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPktleSwgcEFkLT5TdGFDZmcuR1RLLCBMRU5fVEtJUF9FSyk7CisJTmRpc01vdmVNZW1vcnkocFNoYXJlZEtleS0+UnhNaWMsICZwQWQtPlN0YUNmZy5HVEtbMTZdLAorCQkgICAgICAgTEVOX1RLSVBfUlhNSUNLKTsKKwlOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5UeE1pYywgJnBBZC0+U3RhQ2ZnLkdUS1syNF0sCisJCSAgICAgICBMRU5fVEtJUF9UWE1JQ0spOworCisJLyogVXBkYXRlIFNoYXJlZCBLZXkgQ2lwaGVyQWxnICovCisJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkKQorCQlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCkKKwkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKworCS8qIFVwZGF0ZSBncm91cCBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlICovCisJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKwkJCSAgICAgIEJTUzAsCisJCQkgICAgICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisJCQkgICAgICBwU2hhcmVkS2V5LT5DaXBoZXJBbGcsCisJCQkgICAgICBwU2hhcmVkS2V5LT5LZXksCisJCQkgICAgICBwU2hhcmVkS2V5LT5UeE1pYywgcFNoYXJlZEtleS0+UnhNaWMpOworCisJLyogVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlICovCisJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisJCQkJICBCU1MwLAorCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorCQkJCSAgcFNoYXJlZEtleS0+Q2lwaGVyQWxnLCBOVUxMKTsKKworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGFfaW9jdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhX2lvY3RsLmMKaW5kZXggYzBlMDQyNS4uZDhmYmU2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGFfaW9jdGwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YV9pb2N0bC5jCkBAIC00MCw3ICs0MCw3IEBACiAjaW5jbHVkZQkicnRfY29uZmlnLmgiCiAKICNpZmRlZiBEQkcKLWV4dGVybiBVTE9ORyAgICBSVERlYnVnTGV2ZWw7CitleHRlcm4gdW5zaWduZWQgbG9uZyBSVERlYnVnTGV2ZWw7CiAjZW5kaWYKIAogI2RlZmluZSBOUl9XRVBfS0VZUyAJCQkJNApAQCAtNDksNDI0ICs0OSwzMTAgQEAKIAogI2RlZmluZSBHUk9VUF9LRVlfTk8gICAgICAgICAgICAgICAgNAogCi1leHRlcm4gVUNIQVIgICAgQ2lwaGVyV3BhMlRlbXBsYXRlW107Ci1leHRlcm4gVUNIQVIgICAgQ2lwaGVyV3BhUHNrVGtpcFtdOwotZXh0ZXJuIFVDSEFSICAgIENpcGhlcldwYVBza1RraXBMZW47CitleHRlcm4gdTggQ2lwaGVyV3BhMlRlbXBsYXRlW107CiAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlRfVkVSU0lPTl9JTkZPewotICAgIFVDSEFSICAgICAgIERyaXZlclZlcnNpb25XOwotICAgIFVDSEFSICAgICAgIERyaXZlclZlcnNpb25YOwotICAgIFVDSEFSICAgICAgIERyaXZlclZlcnNpb25ZOwotICAgIFVDSEFSICAgICAgIERyaXZlclZlcnNpb25aOwotICAgIFVJTlQgICAgICAgIERyaXZlckJ1aWxkWWVhcjsKLSAgICBVSU5UICAgICAgICBEcml2ZXJCdWlsZE1vbnRoOwotICAgIFVJTlQgICAgICAgIERyaXZlckJ1aWxkRGF5OwotfSBSVF9WRVJTSU9OX0lORk8sICpQUlRfVkVSU0lPTl9JTkZPOwotCi1zdHJ1Y3QgaXdfcHJpdl9hcmdzIHByaXZ0YWJbXSA9IHsKLXsgUlRQUklWX0lPQ1RMX1NFVCwKLSAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCAwLAotICAic2V0In0sCi0KLXsgUlRQUklWX0lPQ1RMX1NIT1csIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssCi0gICIifSwKLXsgUlRQUklWX0lPQ1RMX1NIT1csIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKLSAgIiJ9LAotLyogLS0tIHN1Yi1pb2N0bHMgZGVmaW5pdGlvbnMgLS0tICovCi0gICAgeyBTSE9XX0NPTk5fU1RBVFVTLAotCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImNvbm5TdGF0dXMiIH0sCi0JeyBTSE9XX0RSVklFUl9WRVJJT04sCi0JICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiZHJpdmVyVmVyIiB9LAotICAgIHsgU0hPV19CQV9JTkZPLAotCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImJhaW5mbyIgfSwKLQl7IFNIT1dfREVTQ19JTkZPLAotCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImRlc2NpbmZvIiB9LAotICAgIHsgUkFJT19PRkYsCi0JICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAicmFkaW9fb2ZmIiB9LAotCXsgUkFJT19PTiwKLQkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJyYWRpb19vbiIgfSwKLQl7IFNIT1dfQ0ZHX1ZBTFVFLAotCSAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAic2hvdyIgfSwKLS8qIC0tLSBzdWItaW9jdGxzIHJlbGF0aW9ucyAtLS0gKi8KLQoteyBSVFBSSVZfSU9DVExfU1RBVElTVElDUywKLSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKLSAgInN0YXQifSwKLXsgUlRQUklWX0lPQ1RMX0dTSVRFU1VSVkVZLAotICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsCi0gICJnZXRfc2l0ZV9zdXJ2ZXkifSwKK3N0cnVjdCBQQUNLRUQgcnRfdmVyc2lvbl9pbmZvIHsKKwl1OCBEcml2ZXJWZXJzaW9uVzsKKwl1OCBEcml2ZXJWZXJzaW9uWDsKKwl1OCBEcml2ZXJWZXJzaW9uWTsKKwl1OCBEcml2ZXJWZXJzaW9uWjsKKwl1MzIgRHJpdmVyQnVpbGRZZWFyOworCXUzMiBEcml2ZXJCdWlsZE1vbnRoOworCXUzMiBEcml2ZXJCdWlsZERheTsKIH07CiAKLUlOVCBTZXRfU1NJRF9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOwotCi0jaWZkZWYgV01NX1NVUFBPUlQKLUlOVAlTZXRfV21tQ2FwYWJsZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0jZW5kaWYKLQotSU5UIFNldF9OZXR3b3JrVHlwZV9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOwotCi1JTlQgU2V0X0F1dGhNb2RlX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7Ci0KLUlOVCBTZXRfRW5jcnlwVHlwZV9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOwotCi1JTlQgU2V0X0RlZmF1bHRLZXlJRF9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOwotCi1JTlQgU2V0X0tleTFfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKLQotSU5UIFNldF9LZXkyX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7Ci0KLUlOVCBTZXRfS2V5M19Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOwotCi1JTlQgU2V0X0tleTRfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKLQotSU5UIFNldF9XUEFQU0tfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKLQotCi1JTlQgU2V0X1BTTW9kZV9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOwotCi1JTlQgU2V0X1dwYV9TdXBwb3J0KAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLU5ESVNfU1RBVFVTIFJUTVBXUEFOb25lQWRkS2V5UHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTglQVk9JRAkJCXBCdWYpOwotCi1JTlQgU2V0X0ZyYWdUZXN0X1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7Ci0KLUlOVCBTZXRfVEduV2lmaVRlc3RfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7Ci0KLUlOVCBTZXRfTG9uZ1JldHJ5TGltaXRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVCBTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1zdGF0aWMgc3RydWN0IHsKLQlDSEFSICpuYW1lOwotCUlOVCAoKnNldF9wcm9jKShQUlRNUF9BREFQVEVSIHBBZGFwdGVyLCBQVUNIQVIgYXJnKTsKLX0gKlBSVE1QX1BSSVZBVEVfU0VUX1BST0MsIFJUTVBfUFJJVkFURV9TVVBQT1JUX1BST0NbXSA9IHsKLQl7IkRyaXZlclZlcnNpb24iLAkJCQlTZXRfRHJpdmVyVmVyc2lvbl9Qcm9jfSwKLQl7IkNvdW50cnlSZWdpb24iLAkJCQlTZXRfQ291bnRyeVJlZ2lvbl9Qcm9jfSwKLQl7IkNvdW50cnlSZWdpb25BQmFuZCIsCQkJU2V0X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jfSwKLQl7IlNTSUQiLAkJCQkJCVNldF9TU0lEX1Byb2N9LAotCXsiV2lyZWxlc3NNb2RlIiwJCQkJU2V0X1dpcmVsZXNzTW9kZV9Qcm9jfSwKLQl7IlR4QnVyc3QiLAkJCQkJU2V0X1R4QnVyc3RfUHJvY30sCi0JeyJUeFByZWFtYmxlIiwJCQkJU2V0X1R4UHJlYW1ibGVfUHJvY30sCi0JeyJUeFBvd2VyIiwJCQkJCVNldF9UeFBvd2VyX1Byb2N9LAotCXsiQ2hhbm5lbCIsCQkJCQlTZXRfQ2hhbm5lbF9Qcm9jfSwKLQl7IkJHUHJvdGVjdGlvbiIsCQkJCVNldF9CR1Byb3RlY3Rpb25fUHJvY30sCi0JeyJSVFNUaHJlc2hvbGQiLAkJCQlTZXRfUlRTVGhyZXNob2xkX1Byb2N9LAotCXsiRnJhZ1RocmVzaG9sZCIsCQkJCVNldF9GcmFnVGhyZXNob2xkX1Byb2N9LAotCXsiSHRCdyIsCQkgICAgICAgICAgICAgICAgU2V0X0h0QndfUHJvY30sCi0JeyJIdE1jcyIsCQkgICAgICAgICAgICAgICAgU2V0X0h0TWNzX1Byb2N9LAotCXsiSHRHaSIsCQkgICAgICAgICAgICAgICAgU2V0X0h0R2lfUHJvY30sCi0JeyJIdE9wTW9kZSIsCQkgICAgICAgICAgICBTZXRfSHRPcE1vZGVfUHJvY30sCi0JeyJIdEV4dGNoYSIsCQkgICAgICAgICAgICBTZXRfSHRFeHRjaGFfUHJvY30sCi0JeyJIdE1wZHVEZW5zaXR5IiwJCSAgICAgICAgU2V0X0h0TXBkdURlbnNpdHlfUHJvY30sCi0JeyJIdEJhV2luU2l6ZSIsCQkgICAgICAgIAlTZXRfSHRCYVdpblNpemVfUHJvY30sCi0JeyJIdFJkZyIsCQkgICAgICAgIAkJU2V0X0h0UmRnX1Byb2N9LAotCXsiSHRBbXNkdSIsCQkgICAgICAgIAkJU2V0X0h0QW1zZHVfUHJvY30sCi0JeyJIdEF1dG9CYSIsCQkgICAgICAgIAlTZXRfSHRBdXRvQmFfUHJvY30sCi0JeyJIdEJhRGVjbGluZSIsCQkJCQlTZXRfQkFEZWNsaW5lX1Byb2N9LAotCXsiSHRQcm90ZWN0IiwJCSAgICAgICAgCVNldF9IdFByb3RlY3RfUHJvY30sCi0JeyJIdE1pbW9QcyIsCQkgICAgICAgIAlTZXRfSHRNaW1vUHNfUHJvY30sCi0jaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAotCXsiUGt0QWdncmVnYXRlIiwJCQkJU2V0X1BrdEFnZ3JlZ2F0ZV9Qcm9jfSwKLSNlbmRpZgotCi0jaWZkZWYgV01NX1NVUFBPUlQKLQl7IldtbUNhcGFibGUiLAkJCQkJU2V0X1dtbUNhcGFibGVfUHJvY30sCi0jZW5kaWYKLQl7IklFRUU4MDIxMUgiLAkJCQkJU2V0X0lFRUU4MDIxMUhfUHJvY30sCi0gICAgeyJOZXR3b3JrVHlwZSIsICAgICAgICAgICAgICAgICBTZXRfTmV0d29ya1R5cGVfUHJvY30sCi0JeyJBdXRoTW9kZSIsCQkJCQlTZXRfQXV0aE1vZGVfUHJvY30sCi0JeyJFbmNyeXBUeXBlIiwJCQkJCVNldF9FbmNyeXBUeXBlX1Byb2N9LAotCXsiRGVmYXVsdEtleUlEIiwJCQkJU2V0X0RlZmF1bHRLZXlJRF9Qcm9jfSwKLQl7IktleTEiLAkJCQkJCVNldF9LZXkxX1Byb2N9LAotCXsiS2V5MiIsCQkJCQkJU2V0X0tleTJfUHJvY30sCi0JeyJLZXkzIiwJCQkJCQlTZXRfS2V5M19Qcm9jfSwKLQl7IktleTQiLAkJCQkJCVNldF9LZXk0X1Byb2N9LAotCXsiV1BBUFNLIiwJCQkJCQlTZXRfV1BBUFNLX1Byb2N9LAotCXsiUmVzZXRDb3VudGVyIiwJCQkJU2V0X1Jlc2V0U3RhdENvdW50ZXJfUHJvY30sCi0JeyJQU01vZGUiLCAgICAgICAgICAgICAgICAgICAgICBTZXRfUFNNb2RlX1Byb2N9LAotI2lmZGVmIERCRwotCXsiRGVidWciLAkJCQkJCVNldF9EZWJ1Z19Qcm9jfSwKLSNlbmRpZgotICAgIHsiV3BhU3VwcG9ydCIsICAgICAgICAgICAgICAgICAgU2V0X1dwYV9TdXBwb3J0fSwKLQl7IkZpeGVkVHhNb2RlIiwgICAgICAgICAgICAgICAgIFNldF9GaXhlZFR4TW9kZV9Qcm9jfSwKLSAgICB7IlRHbldpZmlUZXN0IiwgICAgICAgICAgICAgICAgIFNldF9UR25XaWZpVGVzdF9Qcm9jfSwKLSAgICB7IkZvcmNlR0YiLAkJICAgICAgICAJCVNldF9Gb3JjZUdGX1Byb2N9LAotCXsiTG9uZ1JldHJ5IiwJICAgICAgICAJCVNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jfSwKLQl7IlNob3J0UmV0cnkiLAkgICAgICAgIAkJU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jfSwKLSNpZmRlZiBSVDI4NzAKLQl7ImVmdXNlRnJlZU51bWJlciIsCQkJCXNldF9lRnVzZUdldEZyZWVCbG9ja0NvdW50X1Byb2N9LAotCXsiZWZ1c2VEdW1wIiwJCQkJCXNldF9lRnVzZWR1bXBfUHJvY30sCi0JeyJlZnVzZUxvYWRGcm9tQmluIiwJCQkJc2V0X2VGdXNlTG9hZEZyb21CaW5fUHJvY30sCi0jZW5kaWYKLQl7TlVMTCx9CitzdGF0aWMgX19zMzIgcmFsaW5rcmF0ZVtdID0geyAyLCA0LCAxMSwgMjIsCS8qIENDSyAqLworCTEyLCAxOCwgMjQsIDM2LCA0OCwgNzIsIDk2LCAxMDgsCS8qIE9GRE0gKi8KKwkxMywgMjYsIDM5LCA1MiwgNzgsIDEwNCwgMTE3LCAxMzAsIDI2LCA1MiwgNzgsIDEwNCwgMTU2LCAyMDgsIDIzNCwgMjYwLAkvKiAyME1IeiwgODAwbnMgR0ksIE1DUzogMCB+IDE1ICovCisJMzksIDc4LCAxMTcsIDE1NiwgMjM0LCAzMTIsIDM1MSwgMzkwLAkvKiAyME1IeiwgODAwbnMgR0ksIE1DUzogMTYgfiAyMyAqLworCTI3LCA1NCwgODEsIDEwOCwgMTYyLCAyMTYsIDI0MywgMjcwLCA1NCwgMTA4LCAxNjIsIDIxNiwgMzI0LCA0MzIsIDQ4NiwgNTQwLAkvKiA0ME1IeiwgODAwbnMgR0ksIE1DUzogMCB+IDE1ICovCisJODEsIDE2MiwgMjQzLCAzMjQsIDQ4NiwgNjQ4LCA3MjksIDgxMCwJLyogNDBNSHosIDgwMG5zIEdJLCBNQ1M6IDE2IH4gMjMgKi8KKwkxNCwgMjksIDQzLCA1NywgODcsIDExNSwgMTMwLCAxNDQsIDI5LCA1OSwgODcsIDExNSwgMTczLCAyMzAsIDI2MCwgMjg4LAkvKiAyME1IeiwgNDAwbnMgR0ksIE1DUzogMCB+IDE1ICovCisJNDMsIDg3LCAxMzAsIDE3MywgMjYwLCAzMTcsIDM5MCwgNDMzLAkvKiAyME1IeiwgNDAwbnMgR0ksIE1DUzogMTYgfiAyMyAqLworCTMwLCA2MCwgOTAsIDEyMCwgMTgwLCAyNDAsIDI3MCwgMzAwLCA2MCwgMTIwLCAxODAsIDI0MCwgMzYwLCA0ODAsIDU0MCwgNjAwLAkvKiA0ME1IeiwgNDAwbnMgR0ksIE1DUzogMCB+IDE1ICovCisJOTAsIDE4MCwgMjcwLCAzNjAsIDU0MCwgNzIwLCA4MTAsIDkwMAogfTsKIAoraW50IFNldF9TU0lEX1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIsIGNoYXIgKmFyZyk7CiAKLVZPSUQgUlRNUEFkZEtleSgKLQlJTglQUlRNUF9BREFQVEVSCSAgICBwQWQsCi0JSU4JUE5ESVNfODAyXzExX0tFWSAgICBwS2V5KQoraW50IFNldF9OZXR3b3JrVHlwZV9Qcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyLCBjaGFyICphcmcpOworCit2b2lkIFJUTVBBZGRLZXkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbmRpc184MDJfMTFfa2V5ICpwS2V5KQogewotCVVMT05HCQkJCUtleUlkeDsKLQlNQUNfVEFCTEVfRU5UUlkgIAkqcEVudHJ5OworCXVuc2lnbmVkIGxvbmcgS2V5SWR4OworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeTsKIAotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBBZGRLZXkgLS0tLS0tPlxuIikpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBBZGRLZXkgLS0tLS0tPlxuIikpOwogCi0jaWZkZWYgUlQyODYwCi0JUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19DQU5fR09fU0xFRVApOwotCWlmIChSVE1QX1RFU1RfUFNGTEFHKHBBZCwgZlJUTVBfUFNfU0VUX1BDSV9DTEtfT0ZGX0NPTU1BTkQpKQotCXsKLQkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKLQkJewotCQkJUlRNUF9TRVRfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsKLQkJCXJldHVybjsKLQkJfQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBXUEFBZGRLZXlQcm9jMT09PlxuIikpOwotCQlSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKHBBZCwgUkVTVE9SRV9IQUxUKTsKLQkJUlRNUHVzZWNEZWxheSg2MDAwKTsKLQkJcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7Ci0JfQotI2VuZGlmCisJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgeworCQlpZiAocEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKSB7CisJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgeworCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywgMzIpOworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywKKwkJCQkJICAgICAgIHBLZXktPktleU1hdGVyaWFsLAorCQkJCQkgICAgICAgcEtleS0+S2V5TGVuZ3RoKTsKKwkJCQlnb3RvIGVuZDsKKwkJCX0KKwkJCS8qIFVwZGF0ZSBQVEsgKi8KKwkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVswXSwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9jaXBoZXJfa2V5KSk7CisJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKKwkJCQkgICAgICAgcEtleS0+S2V5TWF0ZXJpYWwsIExFTl9US0lQX0VLKTsKIAotCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0JewotCQlpZiAocEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQotCQl7Ci0JCSAgICBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5QTUssIDMyKTsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QTUssIHBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOwotICAgICAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICAgICAgfQotCQkgICAgLy8gVXBkYXRlIFBUSwotCQkgICAgTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOwotICAgICAgICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7Ci0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIHBLZXktPktleU1hdGVyaWFsLCBMRU5fVEtJUF9FSyk7CisJCQlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PQorCQkJICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywKKwkJCQkJICAgICAgIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssCisJCQkJCSAgICAgICBMRU5fVEtJUF9UWE1JQ0spOworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLAorCQkJCQkgICAgICAgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArCisJCQkJCSAgICAgICBMRU5fVEtJUF9UWE1JQ0ssCisJCQkJCSAgICAgICBMRU5fVEtJUF9SWE1JQ0spOworCQkJfSBlbHNlIHsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKKwkJCQkJICAgICAgIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssCisJCQkJCSAgICAgICBMRU5fVEtJUF9UWE1JQ0spOworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLAorCQkJCQkgICAgICAgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArCisJCQkJCSAgICAgICBMRU5fVEtJUF9UWE1JQ0ssCisJCQkJCSAgICAgICBMRU5fVEtJUF9SWE1JQ0spOworCQkJfQogCi0gICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOwotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOwotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOwotICAgICAgICAgICAgfQorCQkJLyogRGVjaWRlIGl0cyBDaGlwZXJBbGcgKi8KKwkJCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09CisJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0KKwkJCQkgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCQkJZWxzZQorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOwogCi0gICAgICAgICAgICAvLyBEZWNpZGUgaXRzIENoaXBlckFsZwotICAgICAgICAJaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLSAgICAgICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKLSAgICAgICAgCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLSAgICAgICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOwotICAgICAgICAJZWxzZQotICAgICAgICAJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQkJLyogVXBkYXRlIHRoZXNlIHJlbGF0ZWQgaW5mb3JtYXRpb24gdG8gc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqLworCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisJCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LktleSwKKwkJCQkgICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAorCQkJCSAgICAgICBMRU5fVEtJUF9FSyk7CisJCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlJ4TWljLAorCQkJCSAgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywKKwkJCQkgICAgICAgTEVOX1RLSVBfUlhNSUNLKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuVHhNaWMsCisJCQkJICAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLAorCQkJCSAgICAgICBMRU5fVEtJUF9UWE1JQ0spOworCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPQorCQkJICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZzsKIAotICAgICAgICAgICAgLy8gVXBkYXRlIHRoZXNlIHJlbGF0ZWQgaW5mb3JtYXRpb24gdG8gTUFDX1RBQkxFX0VOVFJZCi0gICAgICAgIAlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LCBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIExFTl9US0lQX0VLKTsKLSAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuUnhNaWMsIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCBMRU5fVEtJUF9SWE1JQ0spOwotICAgICAgICAJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5UeE1pYywgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsIExFTl9US0lQX1RYTUlDSyk7Ci0gICAgICAgIAlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZzsKKwkJCS8qIFVwZGF0ZSBwYWlyd2lzZSBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlICovCisJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorCQkJCQkgICAgICBCU1MwLAorCQkJCQkgICAgICAwLAorCQkJCQkgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisJCQkJCSAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKKwkJCQkJICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsCisJCQkJCSAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljKTsKIAotICAgICAgICAJLy8gVXBkYXRlIHBhaXJ3aXNlIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKLSAgICAgICAgCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCi0gICAgICAgIAkJCQkJCSAgQlNTMCwKLSAgICAgICAgCQkJCQkJICAwLAotICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKLSAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCi0gICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsCi0gICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMpOworCQkJLyogVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlICovCisJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCSAgQlNTMCwKKwkJCQkJCSAgMCwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uCisJCQkJCQkgIENpcGhlckFsZywgcEVudHJ5KTsKIAotICAgICAgICAJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCi0gICAgICAgIAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKLSAgICAgICAgCQkJCQkJCSAgQlNTMCwKLSAgICAgICAgCQkJCQkJCSAgMCwKLSAgICAgICAgCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAotICAgICAgICAJCQkJCQkJICBwRW50cnkpOwotCi0gICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHsKKwkJCQkvKiBzZXQgODAyLjF4IHBvcnQgY29udHJvbCAqLworCQkJCS8qcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsgKi8KIAkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CiAKLSAgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQotICAgICAgICAgICAgICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0gICAgICAgICAgICB9Ci0JCX0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBVcGRhdGUgR1RLCi0gICAgICAgICAgICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAocEtleS0+S2V5SW5kZXggJiAweEZGKTsKLSAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOwotICAgICAgICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBwS2V5LT5LZXlNYXRlcmlhbCwgTEVOX1RLSVBfRUspOworCQkJCS8qIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJICovCisJCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPQorCQkJCSAgICBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIFVwZGF0ZSBHVEsgKi8KKwkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChwS2V5LT5LZXlJbmRleCAmIDB4RkYpOworCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+CisJCQkJICAgICAgIFNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy4KKwkJCQkJCSAgICAgICBEZWZhdWx0S2V5SWRdLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2NpcGhlcl9rZXkpKTsKKwkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuID0KKwkJCSAgICBMRU5fVEtJUF9FSzsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+CisJCQkJICAgICAgIFNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy4KKwkJCQkJCSAgICAgICBEZWZhdWx0S2V5SWRdLktleSwKKwkJCQkgICAgICAgcEtleS0+S2V5TWF0ZXJpYWwsIExFTl9US0lQX0VLKTsKIAotICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKLSAgICAgICAgICAgIH0KKwkJCWlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PQorCQkJICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPgorCQkJCQkgICAgICAgU2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLgorCQkJCQkJCSAgICAgICBEZWZhdWx0S2V5SWRdLgorCQkJCQkgICAgICAgUnhNaWMsCisJCQkJCSAgICAgICBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLAorCQkJCQkgICAgICAgTEVOX1RLSVBfVFhNSUNLKTsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPgorCQkJCQkgICAgICAgU2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLgorCQkJCQkJCSAgICAgICBEZWZhdWx0S2V5SWRdLgorCQkJCQkgICAgICAgVHhNaWMsCisJCQkJCSAgICAgICBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsKKwkJCQkJICAgICAgIExFTl9US0lQX1RYTUlDSywKKwkJCQkJICAgICAgIExFTl9US0lQX1JYTUlDSyk7CisJCQl9IGVsc2UgeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+CisJCQkJCSAgICAgICBTaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuCisJCQkJCQkJICAgICAgIERlZmF1bHRLZXlJZF0uCisJCQkJCSAgICAgICBUeE1pYywKKwkJCQkJICAgICAgIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssCisJCQkJCSAgICAgICBMRU5fVEtJUF9UWE1JQ0spOworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+CisJCQkJCSAgICAgICBTaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuCisJCQkJCQkJICAgICAgIERlZmF1bHRLZXlJZF0uCisJCQkJCSAgICAgICBSeE1pYywKKwkJCQkJICAgICAgIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKworCQkJCQkgICAgICAgTEVOX1RLSVBfVFhNSUNLLAorCQkJCQkgICAgICAgTEVOX1RLSVBfUlhNSUNLKTsKKwkJCX0KIAotICAgICAgICAgICAgLy8gVXBkYXRlIFNoYXJlZCBLZXkgQ2lwaGVyQWxnCi0gICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOwotICAgIAkJaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCi0gICAgCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKLSAgICAJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0gICAgCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCQkJLyogVXBkYXRlIFNoYXJlZCBLZXkgQ2lwaGVyQWxnICovCisJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLgorCQkJICAgIENpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQkJaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09CisJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLgorCQkJCSAgICBDaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09CisJCQkJIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS4KKwkJCQkgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKIAotICAgICAgICAgICAgLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKLSAgICAgICAgCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCi0gICAgICAgIAkJCQkJCSAgQlNTMCwKLSAgICAgICAgCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCi0gICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCi0gICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksCi0gICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywKLSAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljKTsKKwkJCS8qIFVwZGF0ZSBncm91cCBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlICovCisJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorCQkJCQkgICAgICBCU1MwLAorCQkJCQkgICAgICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisJCQkJCSAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLgorCQkJCQkJCQkgICBEZWZhdWx0S2V5SWRdLgorCQkJCQkgICAgICBDaXBoZXJBbGcsCisJCQkJCSAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLgorCQkJCQkJCQkgICBEZWZhdWx0S2V5SWRdLgorCQkJCQkgICAgICBLZXksCisJCQkJCSAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLgorCQkJCQkJCQkgICBEZWZhdWx0S2V5SWRdLgorCQkJCQkgICAgICBUeE1pYywKKwkJCQkJICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuCisJCQkJCQkJCSAgIERlZmF1bHRLZXlJZF0uCisJCQkJCSAgICAgIFJ4TWljKTsKIAotICAgICAgICAJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCi0gICAgICAgIAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKLSAgICAgICAgCQkJCQkJCSAgQlNTMCwKLSAgICAgICAgCQkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAotICAgICAgICAJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKLSAgICAgICAgCQkJCQkJCSAgTlVMTCk7CisJCQkvKiBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgKi8KKwkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJICBCU1MwLAorCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+CisJCQkJCQkJCSAgICAgICBTdGFDZmcuCisJCQkJCQkJCSAgICAgICBEZWZhdWx0S2V5SWRdLgorCQkJCQkJICBDaXBoZXJBbGcsIE5VTEwpOwogCi0gICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorCQkJLyogc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wgKi8KKwkJCS8qcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsgKi8KIAkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKIAotICAgICAgICAgICAgLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKLSAgICAgICAgICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0gICAgICAgIH0KLQl9Ci0JZWxzZQkvLyBkeW5hbWljIFdFUCBmcm9tIHdwYV9zdXBwbGljYW50CisJCQkvKiBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSSAqLworCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJfQorCX0gZWxzZQkJCS8qIGR5bmFtaWMgV0VQIGZyb20gd3BhX3N1cHBsaWNhbnQgKi8KIAl7Ci0JCVVDSEFSCUNpcGhlckFsZzsKLSAgICAJUFVDSEFSCUtleTsKKwkJdTggQ2lwaGVyQWxnOworCQl1OCAqS2V5OwogCi0JCWlmKHBLZXktPktleUxlbmd0aCA9PSAzMikKKwkJaWYgKHBLZXktPktleUxlbmd0aCA9PSAzMikKIAkJCWdvdG8gZW5kOwogCiAJCUtleUlkeCA9IHBLZXktPktleUluZGV4ICYgMHgwZmZmZmZmZjsKIAotCQlpZiAoS2V5SWR4IDwgNCkKLQkJewotCQkJLy8gaXQgaXMgYSBkZWZhdWx0IHNoYXJlZCBrZXksIGZvciBQYWlyd2lzZSBrZXkgc2V0dGluZwotCQkJaWYgKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKLQkJCXsKKwkJaWYgKEtleUlkeCA8IDQpIHsKKwkJCS8qIGl0IGlzIGEgZGVmYXVsdCBzaGFyZWQga2V5LCBmb3IgUGFpcndpc2Uga2V5IHNldHRpbmcgKi8KKwkJCWlmIChwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApIHsKIAkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBLZXktPkJTU0lEKTsKIAotCQkJCWlmIChwRW50cnkpCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QQWRkS2V5OiBTZXQgUGFpci13aXNlIEtleVxuIikpOworCQkJCWlmIChwRW50cnkpIHsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgKCJSVE1QQWRkS2V5OiBTZXQgUGFpci13aXNlIEtleVxuIikpOwogCi0JCQkJCS8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKLSAJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuS2V5TGVuID0gKFVDSEFSKXBLZXktPktleUxlbmd0aDsKLQkJCQkJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKwkJCQkJLyogc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aCAqLworCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LktleUxlbiA9CisJCQkJCSAgICAodTgpcEtleS0+S2V5TGVuZ3RoOworCQkJCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LktleSwKKwkJCQkJCSAgICAgICAmcEtleS0+S2V5TWF0ZXJpYWwsCisJCQkJCQkgICAgICAgcEtleS0+S2V5TGVuZ3RoKTsKIAotCQkJCQkvLyBzZXQgQ2lwaGVyIHR5cGUKKwkJCQkJLyogc2V0IENpcGhlciB0eXBlICovCiAJCQkJCWlmIChwS2V5LT5LZXlMZW5ndGggPT0gNSkKLQkJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPQorCQkJCQkJICAgIENJUEhFUl9XRVA2NDsKIAkJCQkJZWxzZQotCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPQorCQkJCQkJICAgIENJUEhFUl9XRVAxMjg7CiAKLQkJCQkJLy8gQWRkIFBhaXItd2lzZSBrZXkgdG8gQXNpYwotCQkJCQlBc2ljQWRkUGFpcndpc2VLZXlFbnRyeSgKLQkJCQkJCXBBZCwKLQkJCQkJCXBFbnRyeS0+QWRkciwKLQkJCQkJCShVQ0hBUilwRW50cnktPkFpZCwKLSAgICAgICAgICAgICAgICAJCSZwRW50cnktPlBhaXJ3aXNlS2V5KTsKKwkJCQkJLyogQWRkIFBhaXItd2lzZSBrZXkgdG8gQXNpYyAqLworCQkJCQlBc2ljQWRkUGFpcndpc2VLZXlFbnRyeShwQWQsCisJCQkJCQkJCXBFbnRyeS0+QWRkciwKKwkJCQkJCQkJKHU4KXBFbnRyeS0+CisJCQkJCQkJCUFpZCwKKwkJCQkJCQkJJnBFbnRyeS0+CisJCQkJCQkJCVBhaXJ3aXNlS2V5KTsKIAotCQkJCQkvLyB1cGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGVudHJ5Ci0JCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkoCi0JCQkJCQlwQWQsCi0JCQkJCQlCU1MwLAotCQkJCQkJS2V5SWR4LCAvLyBUaGUgdmFsdWUgbWF5IGJlIG5vdCB6ZXJvCi0JCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZywKLQkJCQkJCXBFbnRyeSk7CisJCQkJCS8qIHVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZW50cnkgKi8KKwkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIEtleUlkeCwJLyogVGhlIHZhbHVlIG1heSBiZSBub3QgemVybyAqLworCQkJCQkJCQkgIHBFbnRyeS0+CisJCQkJCQkJCSAgUGFpcndpc2VLZXkuCisJCQkJCQkJCSAgQ2lwaGVyQWxnLAorCQkJCQkJCQkgIHBFbnRyeSk7CiAKIAkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0gICAgICAgICAgICB7Ci0JCQkJLy8gRGVmYXVsdCBrZXkgZm9yIHR4IChzaGFyZWQga2V5KQotCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgS2V5SWR4OworCQkJfSBlbHNlIHsKKwkJCQkvKiBEZWZhdWx0IGtleSBmb3IgdHggKHNoYXJlZCBrZXkpICovCisJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKHU4KUtleUlkeDsKIAotCQkJCS8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKLQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IChVQ0hBUikgcEtleS0+S2V5TGVuZ3RoOwotCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5LCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisJCQkJLyogc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aCAqLworCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0KKwkJCQkgICAgKHU4KXBLZXktPktleUxlbmd0aDsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleSwKKwkJCQkJICAgICAgICZwS2V5LT5LZXlNYXRlcmlhbCwKKwkJCQkJICAgICAgIHBLZXktPktleUxlbmd0aCk7CiAKLQkJCQkvLyBTZXQgQ2lwZXIgdHlwZQorCQkJCS8qIFNldCBDaXBlciB0eXBlICovCiAJCQkJaWYgKHBLZXktPktleUxlbmd0aCA9PSA1KQotCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPQorCQkJCQkgICAgQ0lQSEVSX1dFUDY0OwogCQkJCWVsc2UKLQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9CisJCQkJCSAgICBDSVBIRVJfV0VQMTI4OwogCi0gICAgCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc7Ci0gICAgCQkJS2V5ID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXk7CisJCQkJQ2lwaGVyQWxnID0KKwkJCQkgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc7CisJCQkJS2V5ID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXk7CiAKLQkJCQkvLyBTZXQgR3JvdXAga2V5IG1hdGVyaWFsIHRvIEFzaWMKLSAgICAJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKKwkJCQkvKiBTZXQgR3JvdXAga2V5IG1hdGVyaWFsIHRvIEFzaWMgKi8KKwkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBLZXlJZHgsCisJCQkJCQkgICAgICBDaXBoZXJBbGcsIEtleSwgTlVMTCwKKwkJCQkJCSAgICAgIE5VTEwpOwogCi0JCQkJLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBncm91cCBrZXkgdGFibGUKLQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIE5VTEwpOworCQkJCS8qIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZ3JvdXAga2V5IHRhYmxlICovCisJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIEtleUlkeCwKKwkJCQkJCQkgIENpcGhlckFsZywgTlVMTCk7CiAKIAkJCX0KIAkJfQogCX0KIGVuZDoKLSNpZmRlZiBSVDI4NjAKLQlSVE1QX1NFVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19DQU5fR09fU0xFRVApOwotICAgIERCR1BSSU5UKFJUX0RFQlVHX0lORk8sICgiPC0tLS0tLSBSVE1QQWRkS2V5XG4iKSk7Ci0jZW5kaWYKIAlyZXR1cm47CiB9CiAKLWNoYXIgKiBydHN0cmNocihjb25zdCBjaGFyICogcywgaW50IGMpCitjaGFyICpydHN0cmNocihjb25zdCBjaGFyICpzLCBpbnQgYykKIHsKLSAgICBmb3IoOyAqcyAhPSAoY2hhcikgYzsgKytzKQotICAgICAgICBpZiAoKnMgPT0gJ1wwJykKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgIHJldHVybiAoY2hhciAqKSBzOworCWZvciAoOyAqcyAhPSAoY2hhciljOyArK3MpCisJCWlmICgqcyA9PSAnXDAnKQorCQkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIChjaGFyICopczsKIH0KIAogLyoKQEAgLTQ3NSwxNTkgKzM2MSwxNjQgQEAKIAogaW50CiBydF9pb2N0bF9naXduYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCSAgIGNoYXIgKm5hbWUsIGNoYXIgKmV4dHJhKQorCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCiB7Ci0vLwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OwotCXN0cm5jcHkobmFtZSwgUlQyOHh4X0NISVBfTkFNRSAiIFdpcmVsZXNzIiwgSUZOQU1TSVopOworCXN0cm5jcHkobmFtZSwgIlJhbGluayBTVEEiLCBJRk5BTVNJWik7CisJLyogUlQyODcwIDIuMS4wLjAgdXNlcyAiUlQyODcwIFdpcmVsZXNzIiAqLworCS8qIFJUMzA5MCAyLjEuMC4wIHVzZXMgIlJUMjg2MCBXaXJlbGVzcyIgKi8KIAlyZXR1cm4gMDsKIH0KIAogaW50IHJ0X2lvY3RsX3Npd2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQlzdHJ1Y3QgaXdfZnJlcSAqZnJlcSwgY2hhciAqZXh0cmEpCisJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICBzdHJ1Y3QgaXdfZnJlcSAqZnJlcSwgY2hhciAqZXh0cmEpCiB7Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKLQlpbnQgCWNoYW4gPSAtMTsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciA9IE5VTEw7CisJaW50IGNoYW4gPSAtMTsKIAotICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0gICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotICAgICAgICByZXR1cm4gLUVORVRET1dOOwotICAgIH0KKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKIAorCS8qY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCXJldHVybiAtRU5FVERPV047CisJfQogCiAJaWYgKGZyZXEtPmUgPiAxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmKChmcmVxLT5lID09IDApICYmIChmcmVxLT5tIDw9IDEwMDApKQotCQljaGFuID0gZnJlcS0+bTsJLy8gU2V0dGluZyBieSBjaGFubmVsIG51bWJlcgorCWlmICgoZnJlcS0+ZSA9PSAwKSAmJiAoZnJlcS0+bSA8PSAxMDAwKSkKKwkJY2hhbiA9IGZyZXEtPm07CS8qIFNldHRpbmcgYnkgY2hhbm5lbCBudW1iZXIgKi8KIAllbHNlCi0JCU1BUF9LSFpfVE9fQ0hBTk5FTF9JRCggKGZyZXEtPm0gLzEwMCkgLCBjaGFuKTsgLy8gU2V0dGluZyBieSBmcmVxdWVuY3kgLSBzZWFyY2ggdGhlIHRhYmxlICwgbGlrZSAyLjQxMkcsIDIuNDIyRywKKwkJTUFQX0tIWl9UT19DSEFOTkVMX0lEKChmcmVxLT5tIC8gMTAwKSwgY2hhbik7CS8qIFNldHRpbmcgYnkgZnJlcXVlbmN5IC0gc2VhcmNoIHRoZSB0YWJsZSAsIGxpa2UgMi40MTJHLCAyLjQyMkcsICovCiAKLSAgICBpZiAoQ2hhbm5lbFNhbml0eShwQWRhcHRlciwgY2hhbikgPT0gVFJVRSkKLSAgICB7Ci0JcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsID0gY2hhbjsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI9PT5ydF9pb2N0bF9zaXdmcmVxOjpTSU9DU0lXRlJFUVtjbWQ9MHgleF0gKENoYW5uZWw9JWQpXG4iLCBTSU9DU0lXRlJFUSwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJaWYgKENoYW5uZWxTYW5pdHkocEFkYXB0ZXIsIGNoYW4pID09IFRSVUUpIHsKKwkJcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsID0gY2hhbjsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCI9PT5ydF9pb2N0bF9zaXdmcmVxOjpTSU9DU0lXRlJFUVtjbWQ9MHgleF0gKENoYW5uZWw9JWQpXG4iLAorCQkJICBTSU9DU0lXRlJFUSwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOwogCiAJcmV0dXJuIDA7CiB9CisKIGludCBydF9pb2N0bF9naXdmcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCSAgIHN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKKwkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgIHN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKIHsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OwotCVVDSEFSIGNoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsOwotCVVMT05HCW07CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIgPSBOVUxMOworCXU4IGNoOworCXVuc2lnbmVkIGxvbmcgbSA9IDI0MTIwMDA7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIj09PnJ0X2lvY3RsX2dpd2ZyZXEgICVkXG4iLCBjaCkpOworCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZGFwdGVyLCBkZXYpOwogCi0gICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKGNoLCBtKTsKKwljaCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PnJ0X2lvY3RsX2dpd2ZyZXEgICVkXG4iLCBjaCkpOworCisJTUFQX0NIQU5ORUxfSURfVE9fS0haKGNoLCBtKTsKIAlmcmVxLT5tID0gbSAqIDEwMDsKIAlmcmVxLT5lID0gMTsKIAlyZXR1cm4gMDsKIH0KIAogaW50IHJ0X2lvY3RsX3Npd21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJICAgX191MzIgKm1vZGUsIGNoYXIgKmV4dHJhKQorCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIF9fdTMyICogbW9kZSwgY2hhciAqZXh0cmEpCiB7Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciA9IE5VTEw7CiAKLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLSAgICB7Ci0gICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLSAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKLSAgICB9CisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkYXB0ZXIsIGRldik7CiAKLQlzd2l0Y2ggKCptb2RlKQotCXsKLQkJY2FzZSBJV19NT0RFX0FESE9DOgotCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJBZGhvYyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVdfTU9ERV9JTkZSQToKLQkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiSW5mcmEiKTsKLQkJCWJyZWFrOwotICAgICAgICBjYXNlIElXX01PREVfTU9OSVRPUjoKLQkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiTW9uaXRvciIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+cnRfaW9jdGxfc2l3bW9kZTo6U0lPQ1NJV01PREUgKHVua25vd24gJWQpXG4iLCAqbW9kZSkpOwotCQkJcmV0dXJuIC1FSU5WQUw7CisJLypjaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJcmV0dXJuIC1FTkVURE9XTjsKIAl9CiAKLQkvLyBSZXNldCBSYWxpbmsgc3VwcGxpY2FudCB0byBub3QgdXNlLCBpdCB3aWxsIGJlIHNldCB0byBzdGFydCB3aGVuIFVJIHNldCBQTUsga2V5CisJc3dpdGNoICgqbW9kZSkgeworCWNhc2UgSVdfTU9ERV9BREhPQzoKKwkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJBZGhvYyIpOworCQlicmVhazsKKwljYXNlIElXX01PREVfSU5GUkE6CisJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiSW5mcmEiKTsKKwkJYnJlYWs7CisJY2FzZSBJV19NT0RFX01PTklUT1I6CisJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiTW9uaXRvciIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIj09PT5ydF9pb2N0bF9zaXdtb2RlOjpTSU9DU0lXTU9ERSAodW5rbm93biAlZClcbiIsCisJCQkgICptb2RlKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFJlc2V0IFJhbGluayBzdXBwbGljYW50IHRvIG5vdCB1c2UsIGl0IHdpbGwgYmUgc2V0IHRvIHN0YXJ0IHdoZW4gVUkgc2V0IFBNSyBrZXkgKi8KIAlwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOwogCiAJcmV0dXJuIDA7CiB9CiAKIGludCBydF9pb2N0bF9naXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCSAgIF9fdTMyICptb2RlLCBjaGFyICpleHRyYSkKKwkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBfX3UzMiAqIG1vZGUsIGNoYXIgKmV4dHJhKQogewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIgPSBOVUxMOworCisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkYXB0ZXIsIGRldik7CiAKIAlpZiAoQURIT0NfT04ocEFkYXB0ZXIpKQogCQkqbW9kZSA9IElXX01PREVfQURIT0M7Ci0gICAgZWxzZSBpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKQorCWVsc2UgaWYgKElORlJBX09OKHBBZGFwdGVyKSkKIAkJKm1vZGUgPSBJV19NT0RFX0lORlJBOwotICAgIGVsc2UgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQotICAgIHsKLSAgICAgICAgKm1vZGUgPSBJV19NT0RFX01PTklUT1I7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgKm1vZGUgPSBJV19NT0RFX0FVVE87CisJZWxzZSBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpIHsKKwkJKm1vZGUgPSBJV19NT0RFX01PTklUT1I7CisJfSBlbHNlCisJCSptb2RlID0gSVdfTU9ERV9BVVRPOwogCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+cnRfaW9jdGxfZ2l3bW9kZShtb2RlPSVkKVxuIiwgKm1vZGUpKTsKIAlyZXR1cm4gMDsKIH0KIAogaW50IHJ0X2lvY3RsX3Npd3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJICAgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCisJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCiB7Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciA9IE5VTEw7CiAKLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0gICAgCXsKLSAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLSAgICAgICAgCXJldHVybiAtRU5FVERPV047Ci0gICAgCX0KKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKKworCS8qY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCXJldHVybiAtRU5FVERPV047CisJfQogCiAJcmV0dXJuIDA7CiB9CiAKIGludCBydF9pb2N0bF9naXdzZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCSAgIGNoYXIgKm5hbWUsIGNoYXIgKmV4dHJhKQorCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIGNoYXIgKm5hbWUsIGNoYXIgKmV4dHJhKQogewogCXJldHVybiAwOwogfQogCiBpbnQgcnRfaW9jdGxfZ2l3cmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKKwkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKIHsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OwotCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopIGV4dHJhOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyID0gTlVMTDsKKwlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKWV4dHJhOwogCXUxNiB2YWw7CiAJaW50IGk7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT0+cnRfaW9jdGxfZ2l3cmFuZ2VcbiIpKTsKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5ydF9pb2N0bF9naXdyYW5nZVxuIikpOwogCWRhdGEtPmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpOwogCW1lbXNldChyYW5nZSwgMCwgc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSkpOwogCiAJcmFuZ2UtPnR4cG93ZXJfY2FwYSA9IElXX1RYUE9XX0RCTTsKIAotCWlmIChJTkZSQV9PTihwQWRhcHRlcil8fEFESE9DX09OKHBBZGFwdGVyKSkKLQl7CisJaWYgKElORlJBX09OKHBBZGFwdGVyKSB8fCBBREhPQ19PTihwQWRhcHRlcikpIHsKIAkJcmFuZ2UtPm1pbl9wbXAgPSAxICogMTAyNDsKIAkJcmFuZ2UtPm1heF9wbXAgPSA2NTUzNSAqIDEwMjQ7CiAJCXJhbmdlLT5taW5fcG10ID0gMSAqIDEwMjQ7CkBAIC02MzUsNyArNTI2LDcgQEAKIAkJcmFuZ2UtPnBtcF9mbGFncyA9IElXX1BPV0VSX1BFUklPRDsKIAkJcmFuZ2UtPnBtdF9mbGFncyA9IElXX1BPV0VSX1RJTUVPVVQ7CiAJCXJhbmdlLT5wbV9jYXBhID0gSVdfUE9XRVJfUEVSSU9EIHwgSVdfUE9XRVJfVElNRU9VVCB8Ci0JCQlJV19QT1dFUl9VTklDQVNUX1IgfCBJV19QT1dFUl9BTExfUjsKKwkJICAgIElXX1BPV0VSX1VOSUNBU1RfUiB8IElXX1BPV0VSX0FMTF9SOwogCX0KIAogCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOwpAQCAtNjQ2LDE1ICs1MzcsMTQgQEAKIAlyYW5nZS0+bWluX3JldHJ5ID0gMDsKIAlyYW5nZS0+bWF4X3JldHJ5ID0gMjU1OwogCi0JcmFuZ2UtPm51bV9jaGFubmVscyA9ICBwQWRhcHRlci0+Q2hhbm5lbExpc3ROdW07CisJcmFuZ2UtPm51bV9jaGFubmVscyA9IHBBZGFwdGVyLT5DaGFubmVsTGlzdE51bTsKIAogCXZhbCA9IDA7Ci0JZm9yIChpID0gMTsgaSA8PSByYW5nZS0+bnVtX2NoYW5uZWxzOyBpKyspCi0JewotCQl1MzIgbTsKLQkJcmFuZ2UtPmZyZXFbdmFsXS5pID0gcEFkYXB0ZXItPkNoYW5uZWxMaXN0W2ktMV0uQ2hhbm5lbDsKLQkJTUFQX0NIQU5ORUxfSURfVE9fS0haKHBBZGFwdGVyLT5DaGFubmVsTGlzdFtpLTFdLkNoYW5uZWwsIG0pOwotCQlyYW5nZS0+ZnJlcVt2YWxdLm0gPSBtICogMTAwOyAvKiBIWiAqLworCWZvciAoaSA9IDE7IGkgPD0gcmFuZ2UtPm51bV9jaGFubmVsczsgaSsrKSB7CisJCXUzMiBtID0gMjQxMjAwMDsKKwkJcmFuZ2UtPmZyZXFbdmFsXS5pID0gcEFkYXB0ZXItPkNoYW5uZWxMaXN0W2kgLSAxXS5DaGFubmVsOworCQlNQVBfQ0hBTk5FTF9JRF9UT19LSFoocEFkYXB0ZXItPkNoYW5uZWxMaXN0W2kgLSAxXS5DaGFubmVsLCBtKTsKKwkJcmFuZ2UtPmZyZXFbdmFsXS5tID0gbSAqIDEwMDsJLyogT1NfSFogKi8KIAogCQlyYW5nZS0+ZnJlcVt2YWxdLmUgPSAxOwogCQl2YWwrKzsKQEAgLTY2MywxMSArNTUzLDExIEBACiAJfQogCXJhbmdlLT5udW1fZnJlcXVlbmN5ID0gdmFsOwogCi0JcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSAxMDA7IC8qIHdoYXQgaXMgY29ycmVjdCBtYXg/IFRoaXMgd2FzIG5vdAotCQkJCQkqIGRvY3VtZW50ZWQgZXhhY3RseS4gQXQgbGVhc3QKLQkJCQkJKiA2OSBoYXMgYmVlbiBvYnNlcnZlZC4gKi8KLQlyYW5nZS0+bWF4X3F1YWwubGV2ZWwgPSAwOyAvKiBkQiAqLwotCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IDA7IC8qIGRCICovCisJcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSAxMDA7CS8qIHdoYXQgaXMgY29ycmVjdCBtYXg/IFRoaXMgd2FzIG5vdAorCQkJCQkgKiBkb2N1bWVudGVkIGV4YWN0bHkuIEF0IGxlYXN0CisJCQkJCSAqIDY5IGhhcyBiZWVuIG9ic2VydmVkLiAqLworCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDA7CS8qIGRCICovCisJcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gMDsJLyogZEIgKi8KIAogCS8qIFdoYXQgd291bGQgYmUgc3VpdGFibGUgdmFsdWVzIGZvciAiYXZlcmFnZS90eXBpY2FsIiBxdWFsPyAqLwogCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gMjA7CkBAIC02ODcsNzAgKzU3Nyw2OCBAQAogCiAJLyogSVdfRU5DX0NBUEFfKiBiaXQgZmllbGQgKi8KIAlyYW5nZS0+ZW5jX2NhcGEgPSBJV19FTkNfQ0FQQV9XUEEgfCBJV19FTkNfQ0FQQV9XUEEyIHwKLQkJCQkJSVdfRU5DX0NBUEFfQ0lQSEVSX1RLSVAgfCBJV19FTkNfQ0FQQV9DSVBIRVJfQ0NNUDsKKwkgICAgSVdfRU5DX0NBUEFfQ0lQSEVSX1RLSVAgfCBJV19FTkNfQ0FQQV9DSVBIRVJfQ0NNUDsKIAogCXJldHVybiAwOwogfQogCiBpbnQgcnRfaW9jdGxfc2l3YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJICAgICAgc3RydWN0IHNvY2thZGRyICphcF9hZGRyLCBjaGFyICpleHRyYSkKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgc3RydWN0IHNvY2thZGRyICphcF9hZGRyLCBjaGFyICpleHRyYSkKIHsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OwotICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJzc2lkOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyID0gTlVMTDsKKwlORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCc3NpZDsKIAotCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0JaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotCXsKLSAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotICAgICAgIAlyZXR1cm4gLUVORVRET1dOOwotICAgIH0KKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKIAotCWlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQotICAgIHsKLSAgICAgICAgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKLSAgICB9CisJLypjaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CiAKLSAgICAvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKLSAgICAvLyB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLgotICAgIHBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7Ci0JLy8gUHJldmVudCB0byBjb25uZWN0IEFQIGFnYWluIGluIFNUQU1sbWVQZXJpb2RpY0V4ZWMKLQlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisJaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpIHsKKwkJUlRNUF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIk1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lIVxuIikpOworCX0KKwkvKiB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcgKi8KKwkvKiB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLiAqLworCXBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7CisJLyogUHJldmVudCB0byBjb25uZWN0IEFQIGFnYWluIGluIFNUQU1sbWVQZXJpb2RpY0V4ZWMgKi8KKwlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiA9IDMyOwogCi0gICAgbWVtc2V0KEJzc2lkLCAwLCBNQUNfQUREUl9MRU4pOwotICAgIG1lbWNweShCc3NpZCwgYXBfYWRkci0+c2FfZGF0YSwgTUFDX0FERFJfTEVOKTsKLSAgICBNbG1lRW5xdWV1ZShwQWRhcHRlciwKLSAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKLSAgICAgICAgICAgICAgICBPSURfODAyXzExX0JTU0lELAotICAgICAgICAgICAgICAgIHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUyksCi0gICAgICAgICAgICAgICAgKFZPSUQgKikmQnNzaWQpOworCW1lbXNldChCc3NpZCwgMCwgTUFDX0FERFJfTEVOKTsKKwltZW1jcHkoQnNzaWQsIGFwX2FkZHItPnNhX2RhdGEsIE1BQ19BRERSX0xFTik7CisJTWxtZUVucXVldWUocEFkYXB0ZXIsCisJCSAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJICAgIE9JRF84MDJfMTFfQlNTSUQsCisJCSAgICBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpLCAodm9pZCAqKSAmIEJzc2lkKTsKIAotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklPQ1RMOjpTSU9DU0lXQVAgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0gICAgICAgIEJzc2lkWzBdLCBCc3NpZFsxXSwgQnNzaWRbMl0sIEJzc2lkWzNdLCBCc3NpZFs0XSwgQnNzaWRbNV0pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiSU9DVEw6OlNJT0NTSVdBUCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwgQnNzaWRbMF0sCisJCSAgQnNzaWRbMV0sIEJzc2lkWzJdLCBCc3NpZFszXSwgQnNzaWRbNF0sIEJzc2lkWzVdKSk7CiAKIAlyZXR1cm4gMDsKIH0KIAogaW50IHJ0X2lvY3RsX2dpd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCSAgICAgIHN0cnVjdCBzb2NrYWRkciAqYXBfYWRkciwgY2hhciAqZXh0cmEpCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIHN0cnVjdCBzb2NrYWRkciAqYXBfYWRkciwgY2hhciAqZXh0cmEpCiB7Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciA9IE5VTEw7CiAKLQlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpIHx8IEFESE9DX09OKHBBZGFwdGVyKSkKLQl7CisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkYXB0ZXIsIGRldik7CisKKwlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpIHx8IEFESE9DX09OKHBBZGFwdGVyKSkgewogCQlhcF9hZGRyLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CiAJCW1lbWNweShhcF9hZGRyLT5zYV9kYXRhLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5Cc3NpZCwgRVRIX0FMRU4pOwogCX0KLSAgICAvLyBBZGQgZm9yIFJUMjg3MAotICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCi0gICAgewotICAgICAgICBhcF9hZGRyLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0gICAgICAgIG1lbWNweShhcF9hZGRyLT5zYV9kYXRhLCAmcEFkYXB0ZXItPk1sbWVBdXguQnNzaWQsIEVUSF9BTEVOKTsKLSAgICB9Ci0JZWxzZQotCXsKKwkvKiBBZGQgZm9yIFJUMjg3MCAqLworCWVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpIHsKKwkJYXBfYWRkci0+c2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQltZW1jcHkoYXBfYWRkci0+c2FfZGF0YSwgJnBBZGFwdGVyLT5NbG1lQXV4LkJzc2lkLCBFVEhfQUxFTik7CisJfSBlbHNlIHsKIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU9DVEw6OlNJT0NHSVdBUCg9RU1QVFkpXG4iKSk7CiAJCXJldHVybiAtRU5PVENPTk47CiAJfQpAQCAtNzc0LDMxNiArNjYyLDMxNyBAQAogICogTkI6IHZhcmlvdXMgY2FsY3VsYXRpb25zIGFyZSBiYXNlZCBvbiB0aGUgb3Jpbm9jby93YXZlbGFuCiAgKiAgICAgZHJpdmVycyBmb3IgY29tcGF0aWJpbGl0eQogICovCi1zdGF0aWMgdm9pZCBzZXRfcXVhbGl0eShQUlRNUF9BREFQVEVSIHBBZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3F1YWxpdHkgKmlxLAotICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIGNoYXIgcnNzaSkKK3N0YXRpYyB2b2lkIHNldF9xdWFsaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyLAorCQkJc3RydWN0IGl3X3F1YWxpdHkgKmlxLCBzaWduZWQgY2hhciByc3NpKQogewogCV9fdTggQ2hhbm5lbFF1YWxpdHk7CiAKLQkvLyBOb3JtYWxpemUgUnNzaQorCS8qIE5vcm1hbGl6ZSBSc3NpICovCiAJaWYgKHJzc2kgPj0gLTUwKQogCQlDaGFubmVsUXVhbGl0eSA9IDEwMDsKLQllbHNlIGlmIChyc3NpID49IC04MCkgLy8gYmV0d2VlbiAtNTAgfiAtODBkYm0KLQkJQ2hhbm5lbFF1YWxpdHkgPSAoX191OCkoMjQgKyAoKHJzc2kgKyA4MCkgKiAyNikvMTApOwotCWVsc2UgaWYgKHJzc2kgPj0gLTkwKSAgIC8vIGJldHdlZW4gLTgwIH4gLTkwZGJtCi0gICAgICAgIENoYW5uZWxRdWFsaXR5ID0gKF9fdTgpKChyc3NpICsgOTApICogMjYpLzEwOworCWVsc2UgaWYgKHJzc2kgPj0gLTgwKQkvKiBiZXR3ZWVuIC01MCB+IC04MGRibSAqLworCQlDaGFubmVsUXVhbGl0eSA9IChfX3U4KSAoMjQgKyAoKHJzc2kgKyA4MCkgKiAyNikgLyAxMCk7CisJZWxzZSBpZiAocnNzaSA+PSAtOTApCS8qIGJldHdlZW4gLTgwIH4gLTkwZGJtICovCisJCUNoYW5uZWxRdWFsaXR5ID0gKF9fdTgpICgocnNzaSArIDkwKSAqIDI2KSAvIDEwOwogCWVsc2UKIAkJQ2hhbm5lbFF1YWxpdHkgPSAwOwogCi0gICAgaXEtPnF1YWwgPSAoX191OClDaGFubmVsUXVhbGl0eTsKKwlpcS0+cXVhbCA9IChfX3U4KSBDaGFubmVsUXVhbGl0eTsKIAotICAgIGlxLT5sZXZlbCA9IChfX3U4KShyc3NpKTsKLSAgICBpcS0+bm9pc2UgPSAocEFkYXB0ZXItPkJicFdyaXRlTGF0Y2hbNjZdID4gcEFkYXB0ZXItPkJicFR1bmluZy5GYWxzZUNjYVVwcGVyVGhyZXNob2xkKSA/ICgoX191OClwQWRhcHRlci0+QmJwVHVuaW5nLkZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQpIDogKChfX3U4KSBwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0pOyAJLy8gbm9pc2UgbGV2ZWwgKGRCbSkKLSAgICBpcS0+bm9pc2UgKz0gMjU2IC0gMTQzOwotICAgIGlxLT51cGRhdGVkID0gcEFkYXB0ZXItPml3X3N0YXRzLnF1YWwudXBkYXRlZDsKKwlpcS0+bGV2ZWwgPSAoX191OCkgKHJzc2kpOworCWlxLT5ub2lzZSA9IChwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0gPiBwQWRhcHRlci0+QmJwVHVuaW5nLkZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQpID8gKChfX3U4KSBwQWRhcHRlci0+QmJwVHVuaW5nLkZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQpIDogKChfX3U4KSBwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0pOwkvKiBub2lzZSBsZXZlbCAoZEJtKSAqLworCWlxLT5ub2lzZSArPSAyNTYgLSAxNDM7CisJaXEtPnVwZGF0ZWQgPSBwQWRhcHRlci0+aXdfc3RhdHMucXVhbC51cGRhdGVkOwogfQogCiBpbnQgcnRfaW9jdGxfaXdhcGxpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQogewotIAlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyID0gTlVMTDsKIAogCXN0cnVjdCBzb2NrYWRkciBhZGRyW0lXX01BWF9BUF07CiAJc3RydWN0IGl3X3F1YWxpdHkgcXVhbFtJV19NQVhfQVBdOwogCWludCBpOwogCi0gICAJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLSAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0gICAgewotICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkYXB0ZXIsIGRldik7CisKKwkvKmNoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93biAqLworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwogCQlkYXRhLT5sZW5ndGggPSAwOwogCQlyZXR1cm4gMDsKLSAgICAgICAgLy9yZXR1cm4gLUVORVRET1dOOworCQkvKnJldHVybiAtRU5FVERPV047ICovCiAJfQogCi0JZm9yIChpID0gMDsgaSA8SVdfTUFYX0FQIDsgaSsrKQotCXsKLQkJaWYgKGkgPj0gIHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yKQorCWZvciAoaSA9IDA7IGkgPCBJV19NQVhfQVA7IGkrKykgeworCQlpZiAoaSA+PSBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcikKIAkJCWJyZWFrOwogCQlhZGRyW2ldLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLQkJCW1lbWNweShhZGRyW2ldLnNhX2RhdGEsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKLQkJc2V0X3F1YWxpdHkocEFkYXB0ZXIsICZxdWFsW2ldLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpKTsKKwkJbWVtY3B5KGFkZHJbaV0uc2FfZGF0YSwgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkLAorCQkgICAgICAgTUFDX0FERFJfTEVOKTsKKwkJc2V0X3F1YWxpdHkocEFkYXB0ZXIsICZxdWFsW2ldLAorCQkJICAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzc2kpOwogCX0KIAlkYXRhLT5sZW5ndGggPSBpOwotCW1lbWNweShleHRyYSwgJmFkZHIsIGkqc2l6ZW9mKGFkZHJbMF0pKTsKLQlkYXRhLT5mbGFncyA9IDE7CQkvKiBzaWduYWwgcXVhbGl0eSBwcmVzZW50IChzb3J0IG9mKSAqLwotCW1lbWNweShleHRyYSArIGkqc2l6ZW9mKGFkZHJbMF0pLCAmcXVhbCwgaSpzaXplb2YocXVhbFtpXSkpOworCW1lbWNweShleHRyYSwgJmFkZHIsIGkgKiBzaXplb2YoYWRkclswXSkpOworCWRhdGEtPmZsYWdzID0gMTsJLyogc2lnbmFsIHF1YWxpdHkgcHJlc2VudCAoc29ydCBvZikgKi8KKwltZW1jcHkoZXh0cmEgKyBpICogc2l6ZW9mKGFkZHJbMF0pLCAmcXVhbCwgaSAqIHNpemVvZihxdWFsW2ldKSk7CiAKIAlyZXR1cm4gMDsKIH0KIAogaW50IHJ0X2lvY3RsX3Npd3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQorCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKIHsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyID0gTlVMTDsKIAotCVVMT05HCQkJCQkJCQlOb3c7CisJdW5zaWduZWQgbG9uZyBOb3c7CiAJaW50IFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAKLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLQl7CisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkYXB0ZXIsIGRldik7CisKKwkvKmNoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93biAqLworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpIHsKIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwogCQlyZXR1cm4gLUVORVRET1dOOwogCX0KIAotCWlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBEcml2ZXIgaXMgaW4gTW9uaXRvciBNb2RlIG5vdyAhISFcbiIpKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotI2lmZGVmIFJUMjg2MAotCWlmICgocEFkYXB0ZXItPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiAoSURMRV9PTihwQWRhcHRlcikpCi0JCSYmIChwQWRhcHRlci0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKQotCQkmJiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpKSkKLQl7Ci0JCVJUMjh4eFBjaUFzaWNSYWRpb09uKHBBZGFwdGVyLCBHVUlfSURMRV9QT1dFUl9TQVZFKTsKKwlpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJEcml2ZXIgaXMgaW4gTW9uaXRvciBNb2RlIG5vdyFcbiIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCS8vIENoZWNrIGlmIHN0aWxsIHJhZGlvIG9mZi4KLQllbHNlIGlmIChwQWRhcHRlci0+YlBDSWNsa09mZiA9PSBUUlVFKQotCQlyZXR1cm4gMDsKLSNlbmRpZgotCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCi0JeworCisJaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkgewogCQlwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRTY2FuQ291bnQrKzsKIAl9CiAKLSAgICBwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOworCXBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IFRSVUU7CiAJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKLQkJcmV0dXJuIDA7Ci0JZG97CisJCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworCWRvIHsKIAkJTm93ID0gamlmZmllczsKIAotCQlpZiAoKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkgJiYKLQkJCShwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRTY2FuQ291bnQgPiAzKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIFdwYVN1cHBsaWNhbnRTY2FuQ291bnQgPiAzXG4iKSk7CisJCWlmICgocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQorCQkgICAgJiYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFNjYW5Db3VudCA+IDMpKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJXcGFTdXBwbGljYW50U2NhbkNvdW50ID4gM1xuIikpOwogCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkgJiYKLQkJCSgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8Ci0JCQkocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKSAmJgotCQkJKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExpbmsgVVAsIFBvcnQgTm90IFNlY3VyZWQhIGlnbm9yZSB0aGlzIHNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU5cbiIpKTsKKwkJaWYgKChPUFNUQVRVU19URVNUX0ZMQUcKKwkJICAgICAocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJICAgICYmICgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCQl8fCAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkJICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCisJCSAgICAmJiAocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PQorCQkJV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiTGluayBVUCwgUG9ydCBOb3QgU2VjdXJlZCEgaWdub3JlIHRoaXMgc2V0OjpPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTlxuIikpOwogCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCi0JCXsKLQkJCVJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworCQlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkgeworCQkJUlRNUF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUhXG4iKSk7CiAJCX0KLQotCQkvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKLQkJLy8gdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4KKwkJLyogdGVsbCBDTlRMIHN0YXRlIG1hY2hpbmUgdG8gY2FsbCBOZGlzTVNldEluZm9ybWF0aW9uQ29tcGxldGUoKSBhZnRlciBjb21wbGV0aW5nICovCisJCS8qIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuICovCiAJCXBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7Ci0JCS8vIFJlc2V0IGFsbG93ZWQgc2NhbiByZXRyaWVzCisJCS8qIFJlc2V0IGFsbG93ZWQgc2NhbiByZXRyaWVzICovCiAJCXBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDA7CiAJCXBBZGFwdGVyLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gTm93OwogCiAJCU1sbWVFbnF1ZXVlKHBBZGFwdGVyLAotCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCi0JCQlPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwKLQkJCTAsCi0JCQlOVUxMKTsKKwkJCSAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCSAgICBPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwgMCwgTlVMTCk7CiAKIAkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQkJUlQyOFhYX01MTUVfSEFORExFUihwQWRhcHRlcik7Ci0JfXdoaWxlKDApOwotCXJldHVybiAwOworCQlSVE1QX01MTUVfSEFORExFUihwQWRhcHRlcik7CisJfSB3aGlsZSAoMCk7CisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiB9CiAKIGludCBydF9pb2N0bF9naXdzY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKKwkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCiB7Ci0KLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OwotCWludCBpPTA7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIgPSBOVUxMOworCWludCBpID0gMDsKIAljaGFyICpjdXJyZW50X2V2ID0gZXh0cmEsICpwcmV2aW91c19ldiA9IGV4dHJhOwogCWNoYXIgKmVuZF9idWY7Ci0JY2hhciAqY3VycmVudF92YWwsIGN1c3RvbVtNQVhfQ1VTVE9NX0xFTl0gPSB7MH07CisJY2hhciAqY3VycmVudF92YWw7CisJY2hhciBjdXN0b21bTUFYX0NVU1RPTV9MRU5dID0geyAwIH07CiAJc3RydWN0IGl3X2V2ZW50IGl3ZTsKIAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCi0gICAgeworCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZGFwdGVyLCBkZXYpOworCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgewogCQkvKgogCQkgKiBTdGlsbCBzY2FubmluZywgaW5kaWNhdGUgdGhlIGNhbGxlciBzaG91bGQgdHJ5IGFnYWluLgogCQkgKi8KIAkJcmV0dXJuIC1FQUdBSU47CiAJfQogCi0JaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkKLQl7CisJaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkgewogCQlwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRTY2FuQ291bnQgPSAwOwogCX0KIAotCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NOciA9PSAwKQotCXsKKwlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIgPT0gMCkgewogCQlkYXRhLT5sZW5ndGggPSAwOwogCQlyZXR1cm4gMDsKIAl9CiAKLSAgICBpZiAoZGF0YS0+bGVuZ3RoID4gMCkKLSAgICAgICAgZW5kX2J1ZiA9IGV4dHJhICsgZGF0YS0+bGVuZ3RoOwotICAgIGVsc2UKLSAgICAgICAgZW5kX2J1ZiA9IGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQTsKKwlpZiAoZGF0YS0+bGVuZ3RoID4gMCkKKwkJZW5kX2J1ZiA9IGV4dHJhICsgZGF0YS0+bGVuZ3RoOworCWVsc2UKKwkJZW5kX2J1ZiA9IGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQTsKIAotCWZvciAoaSA9IDA7IGkgPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcjsgaSsrKQotCXsKLQkJaWYgKGN1cnJlbnRfZXYgPj0gZW5kX2J1ZikKKwlmb3IgKGkgPSAwOyBpIDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnI7IGkrKykgeworCQlpZiAoY3VycmVudF9ldiA+PSBlbmRfYnVmKSB7CiAJCQlyZXR1cm4gLUUyQklHOwotCi0JCS8vTUFDIGFkZHJlc3MKLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQl9CisJCS8qTUFDIGFkZHJlc3MgKi8KKwkJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwogCQlpd2UuY21kID0gU0lPQ0dJV0FQOwogCQlpd2UudS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLQkJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkLCBFVEhfQUxFTik7CisJCW1lbWNweShpd2UudS5hcF9hZGRyLnNhX2RhdGEsCisJCSAgICAgICAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWQsIEVUSF9BTEVOKTsKIAotICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7Ci0JCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBjdXJyZW50X2V2LGVuZF9idWYsICZpd2UsIElXX0VWX0FERFJfTEVOKTsKLSAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCi0JCXJldHVybiAtRTJCSUc7CisJCXByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKwkJY3VycmVudF9ldiA9CisJCSAgICBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLAorCQkJCQkgSVdfRVZfQUREUl9MRU4pOworCQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKwkJCXJldHVybiAtRTJCSUc7CiAKIAkJLyoKLQkJUHJvdG9jb2w6Ci0JCQlpdCB3aWxsIHNob3cgc2Nhbm5lZCBBUCdzIFdpcmVsZXNzTW9kZSAuCi0JCQlpdCBtaWdodCBiZQotCQkJCQk4MDIuMTFhCi0JCQkJCTgwMi4xMWEvbgotCQkJCQk4MDIuMTFnL24KLQkJCQkJODAyLjExYi9nL24KLQkJCQkJODAyLjExZwotCQkJCQk4MDIuMTFiL2cKLQkJKi8KKwkJICAgUHJvdG9jb2w6CisJCSAgIGl0IHdpbGwgc2hvdyBzY2FubmVkIEFQJ3MgV2lyZWxlc3NNb2RlIC4KKwkJICAgaXQgbWlnaHQgYmUKKwkJICAgODAyLjExYQorCQkgICA4MDIuMTFhL24KKwkJICAgODAyLjExZy9uCisJCSAgIDgwMi4xMWIvZy9uCisJCSAgIDgwMi4xMWcKKwkJICAgODAyLjExYi9nCisJCSAqLwogCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwogCQlpd2UuY21kID0gU0lPQ0dJV05BTUU7CiAKLQotCXsKLQkJUEJTU19FTlRSWSBwQnNzRW50cnk9JnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldOwotCQlCT09MRUFOIGlzR29ubHk9RkFMU0U7Ci0JCWludCByYXRlQ250PTA7Ci0KLQkJaWYgKHBCc3NFbnRyeS0+Q2hhbm5lbD4xNCkKIAkJewotCQkJaWYgKHBCc3NFbnRyeS0+SHRDYXBhYmlsaXR5TGVuIT0wKQotCQkJCXN0cmNweShpd2UudS5uYW1lLCI4MDIuMTFhL24iKTsKLQkJCWVsc2UKLQkJCQlzdHJjcHkoaXdlLnUubmFtZSwiODAyLjExYSIpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLyoKLQkJCQlpZiBvbmUgb2Ygbm9uIEIgbW9kZSByYXRlIGlzIHNldCBzdXBwb3J0ZWQgcmF0ZSAuIGl0IG1lYW4gRyBvbmx5LgotCQkJKi8KLQkJCWZvciAocmF0ZUNudD0wO3JhdGVDbnQ8cEJzc0VudHJ5LT5TdXBSYXRlTGVuO3JhdGVDbnQrKykKLQkJCXsKKwkJCXN0cnVjdCBydF9ic3NfZW50cnkgKnBCc3NFbnRyeSA9ICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXTsKKwkJCUJPT0xFQU4gaXNHb25seSA9IEZBTFNFOworCQkJaW50IHJhdGVDbnQgPSAwOworCisJCQlpZiAocEJzc0VudHJ5LT5DaGFubmVsID4gMTQpIHsKKwkJCQlpZiAocEJzc0VudHJ5LT5IdENhcGFiaWxpdHlMZW4gIT0gMCkKKwkJCQkJc3RyY3B5KGl3ZS51Lm5hbWUsICI4MDIuMTFhL24iKTsKKwkJCQllbHNlCisJCQkJCXN0cmNweShpd2UudS5uYW1lLCAiODAyLjExYSIpOworCQkJfSBlbHNlIHsKIAkJCQkvKgotCQkJCQk2TWJwcygxNDApIDlNYnBzKDE0NikgYW5kID49MTJNYnBzKDE1MikgYXJlIHN1cHBvcnRlZCByYXRlICwgaXQgbWVhbiBHIG9ubHkuCi0JCQkJKi8KLQkJCQlpZiAocEJzc0VudHJ5LT5TdXBSYXRlW3JhdGVDbnRdPT0xNDAgfHwgcEJzc0VudHJ5LT5TdXBSYXRlW3JhdGVDbnRdPT0xNDYgfHwgcEJzc0VudHJ5LT5TdXBSYXRlW3JhdGVDbnRdPj0xNTIpCi0JCQkJCWlzR29ubHk9VFJVRTsKLQkJCX0KKwkJCQkgICBpZiBvbmUgb2Ygbm9uIEIgbW9kZSByYXRlIGlzIHNldCBzdXBwb3J0ZWQgcmF0ZSAuIGl0IG1lYW4gRyBvbmx5LgorCQkJCSAqLworCQkJCWZvciAocmF0ZUNudCA9IDA7CisJCQkJICAgICByYXRlQ250IDwgcEJzc0VudHJ5LT5TdXBSYXRlTGVuOworCQkJCSAgICAgcmF0ZUNudCsrKSB7CisJCQkJCS8qCisJCQkJCSAgIDZNYnBzKDE0MCkgOU1icHMoMTQ2KSBhbmQgPj0xMk1icHMoMTUyKSBhcmUgc3VwcG9ydGVkIHJhdGUgLCBpdCBtZWFuIEcgb25seS4KKwkJCQkJICovCisJCQkJCWlmIChwQnNzRW50cnktPlN1cFJhdGVbcmF0ZUNudF0gPT0gMTQwCisJCQkJCSAgICB8fCBwQnNzRW50cnktPlN1cFJhdGVbcmF0ZUNudF0gPT0KKwkJCQkJICAgIDE0NgorCQkJCQkgICAgfHwgcEJzc0VudHJ5LT5TdXBSYXRlW3JhdGVDbnRdID49CisJCQkJCSAgICAxNTIpCisJCQkJCQlpc0dvbmx5ID0gVFJVRTsKKwkJCQl9CiAKLQkJCWZvciAocmF0ZUNudD0wO3JhdGVDbnQ8cEJzc0VudHJ5LT5FeHRSYXRlTGVuO3JhdGVDbnQrKykKLQkJCXsKLQkJCQlpZiAocEJzc0VudHJ5LT5FeHRSYXRlW3JhdGVDbnRdPT0xNDAgfHwgcEJzc0VudHJ5LT5FeHRSYXRlW3JhdGVDbnRdPT0xNDYgfHwgcEJzc0VudHJ5LT5FeHRSYXRlW3JhdGVDbnRdPj0xNTIpCi0JCQkJCWlzR29ubHk9VFJVRTsKLQkJCX0KKwkJCQlmb3IgKHJhdGVDbnQgPSAwOworCQkJCSAgICAgcmF0ZUNudCA8IHBCc3NFbnRyeS0+RXh0UmF0ZUxlbjsKKwkJCQkgICAgIHJhdGVDbnQrKykgeworCQkJCQlpZiAocEJzc0VudHJ5LT5FeHRSYXRlW3JhdGVDbnRdID09IDE0MAorCQkJCQkgICAgfHwgcEJzc0VudHJ5LT5FeHRSYXRlW3JhdGVDbnRdID09CisJCQkJCSAgICAxNDYKKwkJCQkJICAgIHx8IHBCc3NFbnRyeS0+RXh0UmF0ZVtyYXRlQ250XSA+PQorCQkJCQkgICAgMTUyKQorCQkJCQkJaXNHb25seSA9IFRSVUU7CisJCQkJfQogCi0KLQkJCWlmIChwQnNzRW50cnktPkh0Q2FwYWJpbGl0eUxlbiE9MCkKLQkJCXsKLQkJCQlpZiAoaXNHb25seT09VFJVRSkKLQkJCQkJc3RyY3B5KGl3ZS51Lm5hbWUsIjgwMi4xMWcvbiIpOwotCQkJCWVsc2UKLQkJCQkJc3RyY3B5KGl3ZS51Lm5hbWUsIjgwMi4xMWIvZy9uIik7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKGlzR29ubHk9PVRSVUUpCi0JCQkJCXN0cmNweShpd2UudS5uYW1lLCI4MDIuMTFnIik7Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJaWYgKHBCc3NFbnRyeS0+U3VwUmF0ZUxlbj09NCAmJiBwQnNzRW50cnktPkV4dFJhdGVMZW49PTApCi0JCQkJCQlzdHJjcHkoaXdlLnUubmFtZSwiODAyLjExYiIpOworCQkJCWlmIChwQnNzRW50cnktPkh0Q2FwYWJpbGl0eUxlbiAhPSAwKSB7CisJCQkJCWlmIChpc0dvbmx5ID09IFRSVUUpCisJCQkJCQlzdHJjcHkoaXdlLnUubmFtZSwgIjgwMi4xMWcvbiIpOwogCQkJCQllbHNlCi0JCQkJCQlzdHJjcHkoaXdlLnUubmFtZSwiODAyLjExYi9nIik7CisJCQkJCQlzdHJjcHkoaXdlLnUubmFtZSwKKwkJCQkJCSAgICAgICAiODAyLjExYi9nL24iKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoaXNHb25seSA9PSBUUlVFKQorCQkJCQkJc3RyY3B5KGl3ZS51Lm5hbWUsICI4MDIuMTFnIik7CisJCQkJCWVsc2UgeworCQkJCQkJaWYgKHBCc3NFbnRyeS0+U3VwUmF0ZUxlbiA9PSA0CisJCQkJCQkgICAgJiYgcEJzc0VudHJ5LT5FeHRSYXRlTGVuID09CisJCQkJCQkgICAgMCkKKwkJCQkJCQlzdHJjcHkoaXdlLnUubmFtZSwKKwkJCQkJCQkgICAgICAgIjgwMi4xMWIiKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlzdHJjcHkoaXdlLnUubmFtZSwKKwkJCQkJCQkgICAgICAgIjgwMi4xMWIvZyIpOworCQkJCQl9CiAJCQkJfQogCQkJfQogCQl9Ci0JfQogCiAJCXByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKLQkJY3VycmVudF9ldgkgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBJV19FVl9BRERSX0xFTik7Ci0gICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQotCQlyZXR1cm4gLUUyQklHOworCQljdXJyZW50X2V2ID0KKwkJICAgIGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsCisJCQkJCSBJV19FVl9BRERSX0xFTik7CisJCWlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorCQkJcmV0dXJuIC1FMkJJRzsKIAotCQkvL0VTU0lECi0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLypFU1NJRCAqLworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CiAJCWl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7CiAJCWl3ZS51LmRhdGEubGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbjsKIAkJaXdlLnUuZGF0YS5mbGFncyA9IDE7CiAKLSAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OwotCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgY3VycmVudF9ldixlbmRfYnVmLCAmaXdlLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkKTsKLSAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCi0JCXJldHVybiAtRTJCSUc7CisJCXByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKwkJY3VycmVudF9ldiA9CisJCSAgICBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLAorCQkJCQkgKGNoYXIgKilwQWRhcHRlci0+U2NhblRhYi4KKwkJCQkJIEJzc0VudHJ5W2ldLlNzaWQpOworCQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKwkJCXJldHVybiAtRTJCSUc7CiAKLQkJLy9OZXR3b3JrIFR5cGUKLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvKk5ldHdvcmsgVHlwZSAqLworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CiAJCWl3ZS5jbWQgPSBTSU9DR0lXTU9ERTsKLQkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc1R5cGUgPT0gTmRpczgwMl8xMUlCU1MpCi0JCXsKKwkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc1R5cGUgPT0gTmRpczgwMl8xMUlCU1MpIHsKIAkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0FESE9DOwotCQl9Ci0JCWVsc2UgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc1R5cGUgPT0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlKQotCQl7CisJCX0gZWxzZSBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzVHlwZSA9PQorCQkJICAgTmRpczgwMl8xMUluZnJhc3RydWN0dXJlKSB7CiAJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9JTkZSQTsKLQkJfQotCQllbHNlCi0JCXsKKwkJfSBlbHNlIHsKIAkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0FVVE87CiAJCX0KIAkJaXdlLmxlbiA9IElXX0VWX1VJTlRfTEVOOwogCi0gICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKLQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsICBJV19FVl9VSU5UX0xFTik7Ci0gICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQotCQlyZXR1cm4gLUUyQklHOworCQlwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisJCWN1cnJlbnRfZXYgPQorCQkgICAgaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwKKwkJCQkJIElXX0VWX1VJTlRfTEVOKTsKKwkJaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisJCQlyZXR1cm4gLUUyQklHOwogCi0JCS8vQ2hhbm5lbCBhbmQgRnJlcXVlbmN5Ci0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLypDaGFubmVsIGFuZCBGcmVxdWVuY3kgKi8KKwkJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwogCQlpd2UuY21kID0gU0lPQ0dJV0ZSRVE7CiAJCWlmIChJTkZSQV9PTihwQWRhcHRlcikgfHwgQURIT0NfT04ocEFkYXB0ZXIpKQpAQCAtMTA5NCwxNzIgKzk4MywyMTcgQEAKIAkJaXdlLnUuZnJlcS5pID0gMDsKIAogCQlwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7Ci0JCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBJV19FVl9GUkVRX0xFTik7Ci0gICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQotCQlyZXR1cm4gLUUyQklHOworCQljdXJyZW50X2V2ID0KKwkJICAgIGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsCisJCQkJCSBJV19FVl9GUkVRX0xFTik7CisJCWlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorCQkJcmV0dXJuIC1FMkJJRzsKIAotICAgICAgICAvL0FkZCBxdWFsaXR5IHN0YXRpc3RpY3MKLSAgICAgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICBtZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwotICAgIAlpd2UuY21kID0gSVdFVlFVQUw7Ci0gICAgCWl3ZS51LnF1YWwubGV2ZWwgPSAwOwotICAgIAlpd2UudS5xdWFsLm5vaXNlID0gMDsKLSAgICAgICAgc2V0X3F1YWxpdHkocEFkYXB0ZXIsICZpd2UudS5xdWFsLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpKTsKLSAgICAJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIElXX0VWX1FVQUxfTEVOKTsKLSAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCi0JCXJldHVybiAtRTJCSUc7CisJCS8qQWRkIHF1YWxpdHkgc3RhdGlzdGljcyAqLworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBJV0VWUVVBTDsKKwkJaXdlLnUucXVhbC5sZXZlbCA9IDA7CisJCWl3ZS51LnF1YWwubm9pc2UgPSAwOworCQlzZXRfcXVhbGl0eShwQWRhcHRlciwgJml3ZS51LnF1YWwsCisJCQkgICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaSk7CisJCWN1cnJlbnRfZXYgPQorCQkgICAgaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwKKwkJCQkJIElXX0VWX1FVQUxfTEVOKTsKKwkJaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisJCQlyZXR1cm4gLUUyQklHOwogCi0JCS8vRW5jeXB0aW9uIGtleQotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8qRW5jeXB0aW9uIGtleSAqLworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CiAJCWl3ZS5jbWQgPSBTSU9DR0lXRU5DT0RFOwotCQlpZiAoQ0FQX0lTX1BSSVZBQ1lfT04gKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNhcGFiaWxpdHlJbmZvICkpCi0JCQlpd2UudS5kYXRhLmZsYWdzID1JV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKKwkJaWYgKENBUF9JU19QUklWQUNZX09OCisJCSAgICAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2FwYWJpbGl0eUluZm8pKQorCQkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9FTkFCTEVEIHwgSVdfRU5DT0RFX05PS0VZOwogCQllbHNlCiAJCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOwogCi0gICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKLSAgICAgICAgY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsJml3ZSwgKGNoYXIgKilwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWyhpd2UudS5kYXRhLmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKS0xXS5LZXkpOwotICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKLQkJcmV0dXJuIC1FMkJJRzsKKwkJcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworCQljdXJyZW50X2V2ID0KKwkJICAgIGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsCisJCQkJCSAoY2hhciAqKXBBZGFwdGVyLT4KKwkJCQkJIFNoYXJlZEtleVtCU1MwXVsoaXdlLnUuZGF0YS4KKwkJCQkJCQkgIGZsYWdzICYKKwkJCQkJCQkgIElXX0VOQ09ERV9JTkRFWCkgLQorCQkJCQkJCSAxXS5LZXkpOworCQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKwkJCXJldHVybiAtRTJCSUc7CiAKLQkJLy9CaXQgUmF0ZQotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuKQotICAgICAgICB7Ci0gICAgICAgICAgICBVQ0hBUiB0bXBSYXRlID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZVtwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuLTFdOworCQkvKkJpdCBSYXRlICovCisJCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4pIHsKKwkJCXU4IHRtcFJhdGUgPQorCQkJICAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVbcEFkYXB0ZXItPgorCQkJCQkJCQkgIFNjYW5UYWIuCisJCQkJCQkJCSAgQnNzRW50cnlbaV0uCisJCQkJCQkJCSAgU3VwUmF0ZUxlbiAtCisJCQkJCQkJCSAgMV07CiAJCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwogCQkJaXdlLmNtZCA9IFNJT0NHSVdSQVRFOwotICAgIAkJY3VycmVudF92YWwgPSBjdXJyZW50X2V2ICsgSVdfRVZfTENQX0xFTjsKLSAgICAgICAgICAgIGlmICh0bXBSYXRlID09IDB4ODIpCi0gICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAxICogMTAwMDAwMDsKLSAgICAgICAgICAgIGVsc2UgaWYgKHRtcFJhdGUgPT0gMHg4NCkKLSAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDIgKiAxMDAwMDAwOwotICAgICAgICAgICAgZWxzZSBpZiAodG1wUmF0ZSA9PSAweDhCKQotICAgICAgICAgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgNS41ICogMTAwMDAwMDsKLSAgICAgICAgICAgIGVsc2UgaWYgKHRtcFJhdGUgPT0gMHg5NikKLSAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDExICogMTAwMDAwMDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAJCSAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gICh0bXBSYXRlLzIpICogMTAwMDAwMDsKKwkJCWN1cnJlbnRfdmFsID0gY3VycmVudF9ldiArIElXX0VWX0xDUF9MRU47CisJCQlpZiAodG1wUmF0ZSA9PSAweDgyKQorCQkJCWl3ZS51LmJpdHJhdGUudmFsdWUgPSAxICogMTAwMDAwMDsKKwkJCWVsc2UgaWYgKHRtcFJhdGUgPT0gMHg4NCkKKwkJCQlpd2UudS5iaXRyYXRlLnZhbHVlID0gMiAqIDEwMDAwMDA7CisJCQllbHNlIGlmICh0bXBSYXRlID09IDB4OEIpCisJCQkJaXdlLnUuYml0cmF0ZS52YWx1ZSA9IDUuNSAqIDEwMDAwMDA7CisJCQllbHNlIGlmICh0bXBSYXRlID09IDB4OTYpCisJCQkJaXdlLnUuYml0cmF0ZS52YWx1ZSA9IDExICogMTAwMDAwMDsKKwkJCWVsc2UKKwkJCQlpd2UudS5iaXRyYXRlLnZhbHVlID0gKHRtcFJhdGUgLyAyKSAqIDEwMDAwMDA7CisKKwkJCWlmICh0bXBSYXRlID09IDB4NmMKKwkJCSAgICAmJiBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5IdENhcGFiaWxpdHlMZW4gPgorCQkJICAgIDApIHsKKwkJCQlpbnQgcmF0ZV9jb3VudCA9CisJCQkJICAgIHNpemVvZihyYWxpbmtyYXRlKSAvIHNpemVvZihfX3MzMik7CisJCQkJc3RydWN0IHJ0X2h0X2NhcF9pbmZvIGNhcEluZm8gPQorCQkJCSAgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5IdENhcGFiaWxpdHkuCisJCQkJICAgIEh0Q2FwSW5mbzsKKwkJCQlpbnQgc2hvcnRHSSA9CisJCQkJICAgIGNhcEluZm8uQ2hhbm5lbFdpZHRoID8gY2FwSW5mby4KKwkJCQkgICAgU2hvcnRHSWZvcjQwIDogY2FwSW5mby5TaG9ydEdJZm9yMjA7CisJCQkJaW50IG1heE1DUyA9CisJCQkJICAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkh0Q2FwYWJpbGl0eS4KKwkJCQkgICAgTUNTU2V0WzFdID8gMTUgOiA3OworCQkJCWludCByYXRlX2luZGV4ID0KKwkJCQkgICAgMTIgKyAoKHU4KWNhcEluZm8uQ2hhbm5lbFdpZHRoICogMjQpICsKKwkJCQkgICAgKCh1OClzaG9ydEdJICogNDgpICsgKCh1OCltYXhNQ1MpOworCQkJCWlmIChyYXRlX2luZGV4IDwgMCkKKwkJCQkJcmF0ZV9pbmRleCA9IDA7CisJCQkJaWYgKHJhdGVfaW5kZXggPiByYXRlX2NvdW50KQorCQkJCQlyYXRlX2luZGV4ID0gcmF0ZV9jb3VudDsKKwkJCQlpd2UudS5iaXRyYXRlLnZhbHVlID0KKwkJCQkgICAgcmFsaW5rcmF0ZVtyYXRlX2luZGV4XSAqIDUwMDAwMDsKKwkJCX0KIAogCQkJaXdlLnUuYml0cmF0ZS5kaXNhYmxlZCA9IDA7CiAJCQljdXJyZW50X3ZhbCA9IGl3ZV9zdHJlYW1fYWRkX3ZhbHVlKGluZm8sIGN1cnJlbnRfZXYsCi0JCQkJY3VycmVudF92YWwsIGVuZF9idWYsICZpd2UsCi0gICAgCQkJSVdfRVZfUEFSQU1fTEVOKTsKKwkJCQkJCQkgICBjdXJyZW50X3ZhbCwgZW5kX2J1ZiwKKwkJCQkJCQkgICAmaXdlLAorCQkJCQkJCSAgIElXX0VWX1BBUkFNX0xFTik7CiAKLSAgICAgICAgCWlmKChjdXJyZW50X3ZhbC1jdXJyZW50X2V2KT5JV19FVl9MQ1BfTEVOKQotICAgICAgICAgICAgCWN1cnJlbnRfZXYgPSBjdXJyZW50X3ZhbDsKLSAgICAgICAgCWVsc2UKLQkJCXJldHVybiAtRTJCSUc7Ci0gICAgICAgIH0KLQotCQkvL1dQQSBJRQotCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW4gPiAwKQotCQl7CisJCQlpZiAoKGN1cnJlbnRfdmFsIC0gY3VycmVudF9ldikgPiBJV19FVl9MQ1BfTEVOKQorCQkJCWN1cnJlbnRfZXYgPSBjdXJyZW50X3ZhbDsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gLUUyQklHOworCQl9CisJCS8qV1BBIElFICovCisJCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbiA+IDApIHsKIAkJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CiAJCQltZW1zZXQoJmN1c3RvbVswXSwgMCwgTUFYX0NVU1RPTV9MRU4pOwotCQkJbWVtY3B5KGN1c3RvbSwgJihwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRVswXSksCi0JCQkJCQkgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbik7CisJCQltZW1jcHkoY3VzdG9tLAorCQkJICAgICAgICYocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVbMF0pLAorCQkJICAgICAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuKTsKIAkJCWl3ZS5jbWQgPSBJV0VWR0VOSUU7Ci0JCQlpd2UudS5kYXRhLmxlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuOwotCQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGN1c3RvbSk7CisJCQlpd2UudS5kYXRhLmxlbmd0aCA9CisJCQkgICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW47CisJCQljdXJyZW50X2V2ID0KKwkJCSAgICBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLAorCQkJCQkJICZpd2UsIGN1c3RvbSk7CiAJCQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKIAkJCQlyZXR1cm4gLUUyQklHOwogCQl9Ci0KLQkJLy9XUEEyIElFCi0gICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbiA+IDApCi0gICAgICAgIHsKLSAgICAgICAgCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCS8qV1BBMiBJRSAqLworCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4gPiAwKSB7CisJCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwogCQkJbWVtc2V0KCZjdXN0b21bMF0sIDAsIE1BWF9DVVNUT01fTEVOKTsKLQkJCW1lbWNweShjdXN0b20sICYocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVbMF0pLAotCQkJCQkJICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4pOworCQkJbWVtY3B5KGN1c3RvbSwKKwkJCSAgICAgICAmKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFWzBdKSwKKwkJCSAgICAgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbik7CiAJCQlpd2UuY21kID0gSVdFVkdFTklFOwotCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbjsKLQkJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBjdXN0b20pOworCQkJaXdlLnUuZGF0YS5sZW5ndGggPQorCQkJICAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuOworCQkJY3VycmVudF9ldiA9CisJCQkgICAgaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwKKwkJCQkJCSAmaXdlLCBjdXN0b20pOwogCQkJaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCiAJCQkJcmV0dXJuIC1FMkJJRzsKLSAgICAgICAgfQorCQl9CiAJfQogCiAJZGF0YS0+bGVuZ3RoID0gY3VycmVudF9ldiAtIGV4dHJhOwotICAgIHBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOwotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SICwoIj09PT5ydF9pb2N0bF9naXdzY2FuLiAlZCglZCkgQlNTIHJldHVybmVkLCBkYXRhLT5sZW5ndGggPSAlZFxuIixpICwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIsIGRhdGEtPmxlbmd0aCkpOworCXBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkgKCI9PT0+cnRfaW9jdGxfZ2l3c2Nhbi4gJWQoJWQpIEJTUyByZXR1cm5lZCwgZGF0YS0+bGVuZ3RoID0gJWRcbiIsCisJCSAgaSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIsIGRhdGEtPmxlbmd0aCkpOwogCXJldHVybiAwOwogfQogCiBpbnQgcnRfaW9jdGxfc2l3ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXNzaWQpCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXNzaWQpCiB7Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciA9IE5VTEw7CiAKLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLSAgICB7Ci0gICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLSAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKLSAgICB9CisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkYXB0ZXIsIGRldik7CiAKLQlpZiAoZGF0YS0+ZmxhZ3MpCi0JewotCQlQQ0hBUglwU3NpZFN0cmluZyA9IE5VTEw7CisJLypjaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CiAKLQkJLy8gSW5jbHVkZXMgbnVsbCBjaGFyYWN0ZXIuCisJaWYgKGRhdGEtPmZsYWdzKSB7CisJCWNoYXIgKnBTc2lkU3RyaW5nID0gTlVMTDsKKworCQkvKiBJbmNsdWRlcyBudWxsIGNoYXJhY3Rlci4gKi8KIAkJaWYgKGRhdGEtPmxlbmd0aCA+IChJV19FU1NJRF9NQVhfU0laRSArIDEpKQogCQkJcmV0dXJuIC1FMkJJRzsKIAotCQlwU3NpZFN0cmluZyA9IChDSEFSICopIGttYWxsb2MoTUFYX0xFTl9PRl9TU0lEKzEsIE1FTV9BTExPQ19GTEFHKTsKLQkJaWYgKHBTc2lkU3RyaW5nKQotCQl7Ci0JCQlOZGlzWmVyb01lbW9yeShwU3NpZFN0cmluZywgTUFYX0xFTl9PRl9TU0lEKzEpOworCQlwU3NpZFN0cmluZyA9IGttYWxsb2MoTUFYX0xFTl9PRl9TU0lEICsgMSwgTUVNX0FMTE9DX0ZMQUcpOworCQlpZiAocFNzaWRTdHJpbmcpIHsKKwkJCU5kaXNaZXJvTWVtb3J5KHBTc2lkU3RyaW5nLCBNQVhfTEVOX09GX1NTSUQgKyAxKTsKIAkJCU5kaXNNb3ZlTWVtb3J5KHBTc2lkU3RyaW5nLCBlc3NpZCwgZGF0YS0+bGVuZ3RoKTsKIAkJCWlmIChTZXRfU1NJRF9Qcm9jKHBBZGFwdGVyLCBwU3NpZFN0cmluZykgPT0gRkFMU0UpCiAJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJZWxzZQorCQl9IGVsc2UKIAkJCXJldHVybiAtRU5PTUVNOwotCX0KLQllbHNlCi0JewotCQkvLyBBTlkgc3NpZAorCX0gZWxzZSB7CisJCS8qIEFOWSBzc2lkICovCiAJCWlmIChTZXRfU1NJRF9Qcm9jKHBBZGFwdGVyLCAiIikgPT0gRkFMU0UpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLSAgICB9CisJfQogCXJldHVybiAwOwogfQogCiBpbnQgcnRfaW9jdGxfZ2l3ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXNzaWQpCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXNzaWQpCiB7Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciA9IE5VTEw7CisKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKIAogCWRhdGEtPmZsYWdzID0gMTsKLSAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCi0gICAgewotICAgICAgICBkYXRhLT5sZW5ndGggID0gMDsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorCWlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkgeworCQlkYXRhLT5sZW5ndGggPSAwOworCQlyZXR1cm4gMDsKKwl9CiAKLQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJNZWRpYVN0YXRlIGlzIGNvbm5lY3RlZFxuIikpOworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNZWRpYVN0YXRlIGlzIGNvbm5lY3RlZFxuIikpOwogCQlkYXRhLT5sZW5ndGggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW47Ci0JCW1lbWNweShlc3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW4pOworCQltZW1jcHkoZXNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZCwKKwkJICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbik7CiAJfQotI2lmZGVmIFJUMjg3MAotICAgIC8vIEFkZCBmb3IgUlQyODcwCi0gICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKLSAgICB7Ci0gICAgICAgIGRhdGEtPmxlbmd0aCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbjsKLQkJbWVtY3B5KGVzc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbik7CisjaWZkZWYgUlRNUF9NQUNfVVNCCisJLyogQWRkIGZvciBSVDI4NzAgKi8KKwllbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKSB7CisJCWRhdGEtPmxlbmd0aCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbjsKKwkJbWVtY3B5KGVzc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWQsCisJCSAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW4pOwogCX0KLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQllbHNlCi0Jey8vdGhlIEFOWSBzc2lkIHdhcyBzcGVjaWZpZWQKLQkJZGF0YS0+bGVuZ3RoICA9IDA7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIk1lZGlhU3RhdGUgaXMgbm90IGNvbm5lY3RlZCwgZXNzXG4iKSk7CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisJZWxzZSB7CQkJLyp0aGUgQU5ZIHNzaWQgd2FzIHNwZWNpZmllZCAqLworCQlkYXRhLT5sZW5ndGggPSAwOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIk1lZGlhU3RhdGUgaXMgbm90IGNvbm5lY3RlZCwgZXNzXG4iKSk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xMjY3LDE3ICsxMjAxLDE4IEBACiB9CiAKIGludCBydF9pb2N0bF9zaXduaWNrbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpuaWNrbmFtZSkKKwkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpuaWNrbmFtZSkKIHsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyID0gTlVMTDsKIAotICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0gICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotICAgICAgICByZXR1cm4gLUVORVRET1dOOwotICAgIH0KKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKKworCS8qY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCXJldHVybiAtRU5FVERPV047CisJfQogCiAJaWYgKGRhdGEtPmxlbmd0aCA+IElXX0VTU0lEX01BWF9TSVpFKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEyODUsNDUgKzEyMjAsNDcgQEAKIAltZW1zZXQocEFkYXB0ZXItPm5pY2tuYW1lLCAwLCBJV19FU1NJRF9NQVhfU0laRSArIDEpOwogCW1lbWNweShwQWRhcHRlci0+bmlja25hbWUsIG5pY2tuYW1lLCBkYXRhLT5sZW5ndGgpOwogCi0KIAlyZXR1cm4gMDsKIH0KIAogaW50IHJ0X2lvY3RsX2dpd25pY2tuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKm5pY2tuYW1lKQorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKm5pY2tuYW1lKQogewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIgPSBOVUxMOwogCi0JaWYgKGRhdGEtPmxlbmd0aCA+IHN0cmxlbihwQWRhcHRlci0+bmlja25hbWUpICsgMSkKLQkJZGF0YS0+bGVuZ3RoID0gc3RybGVuKHBBZGFwdGVyLT5uaWNrbmFtZSkgKyAxOworCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZGFwdGVyLCBkZXYpOworCisJaWYgKGRhdGEtPmxlbmd0aCA+IHN0cmxlbigoY2hhciAqKXBBZGFwdGVyLT5uaWNrbmFtZSkgKyAxKQorCQlkYXRhLT5sZW5ndGggPSBzdHJsZW4oKGNoYXIgKilwQWRhcHRlci0+bmlja25hbWUpICsgMTsKIAlpZiAoZGF0YS0+bGVuZ3RoID4gMCkgewotCQltZW1jcHkobmlja25hbWUsIHBBZGFwdGVyLT5uaWNrbmFtZSwgZGF0YS0+bGVuZ3RoLTEpOwotCQluaWNrbmFtZVtkYXRhLT5sZW5ndGgtMV0gPSAnXDAnOworCQltZW1jcHkobmlja25hbWUsIHBBZGFwdGVyLT5uaWNrbmFtZSwgZGF0YS0+bGVuZ3RoIC0gMSk7CisJCW5pY2tuYW1lW2RhdGEtPmxlbmd0aCAtIDFdID0gJ1wwJzsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKIGludCBydF9pb2N0bF9zaXdydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCSAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJ0cywgY2hhciAqZXh0cmEpCisJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQogewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIgPSBOVUxMOwogCXUxNiB2YWw7CiAKLSAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLSAgICAgICAgcmV0dXJuIC1FTkVURE9XTjsKLSAgICB9CisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkYXB0ZXIsIGRldik7CisKKwkvKmNoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93biAqLworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQlyZXR1cm4gLUVORVRET1dOOworCX0KIAogCWlmIChydHMtPmRpc2FibGVkKQogCQl2YWwgPSBNQVhfUlRTX1RIUkVTSE9MRDsKIAllbHNlIGlmIChydHMtPnZhbHVlIDwgMCB8fCBydHMtPnZhbHVlID4gTUFYX1JUU19USFJFU0hPTEQpCiAJCXJldHVybiAtRUlOVkFMOwogCWVsc2UgaWYgKHJ0cy0+dmFsdWUgPT0gMCkKLQkgICAgdmFsID0gTUFYX1JUU19USFJFU0hPTEQ7CisJCXZhbCA9IE1BWF9SVFNfVEhSRVNIT0xEOwogCWVsc2UKIAkJdmFsID0gcnRzLT52YWx1ZTsKIApAQCAtMTMzNCwxNyArMTI3MSwxOCBAQAogfQogCiBpbnQgcnRfaW9jdGxfZ2l3cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkgICAgICAgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQorCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKIHsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyID0gTlVMTDsKIAotCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0gICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLSAgICAJewotICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0gICAgICAgIAlyZXR1cm4gLUVORVRET1dOOwotICAgIAl9CisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkYXB0ZXIsIGRldik7CisKKwkvKmNoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93biAqLworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQlyZXR1cm4gLUVORVRET1dOOworCX0KIAogCXJ0cy0+dmFsdWUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZDsKIAlydHMtPmRpc2FibGVkID0gKHJ0cy0+dmFsdWUgPT0gTUFYX1JUU19USFJFU0hPTEQpOwpAQCAtMTM1NCwyNSArMTI5MiwyNyBAQAogfQogCiBpbnQgcnRfaW9jdGxfc2l3ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCXN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpCisJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmZyYWcsIGNoYXIgKmV4dHJhKQogewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIgPSBOVUxMOwogCXUxNiB2YWw7CiAKLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0gICAgCXsKLSAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotICAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKLSAgICAJfQorCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZGFwdGVyLCBkZXYpOworCisJLypjaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CiAKIAlpZiAoZnJhZy0+ZGlzYWJsZWQpCiAJCXZhbCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKLQllbHNlIGlmIChmcmFnLT52YWx1ZSA+PSBNSU5fRlJBR19USFJFU0hPTEQgJiYgZnJhZy0+dmFsdWUgPD0gTUFYX0ZSQUdfVEhSRVNIT0xEKQotCQl2YWwgPSBfX2NwdV90b19sZTE2KGZyYWctPnZhbHVlICYgfjB4MSk7IC8qIGV2ZW4gbnVtYmVycyBvbmx5ICovCisJZWxzZSBpZiAoZnJhZy0+dmFsdWUgPj0gTUlOX0ZSQUdfVEhSRVNIT0xECisJCSAmJiBmcmFnLT52YWx1ZSA8PSBNQVhfRlJBR19USFJFU0hPTEQpCisJCXZhbCA9IF9fY3B1X3RvX2xlMTYoZnJhZy0+dmFsdWUgJiB+MHgxKTsJLyogZXZlbiBudW1iZXJzIG9ubHkgKi8KIAllbHNlIGlmIChmcmFnLT52YWx1ZSA9PSAwKQotCSAgICB2YWwgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisJCXZhbCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKIAllbHNlCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0xMzgxLDE3ICsxMzIxLDE4IEBACiB9CiAKIGludCBydF9pb2N0bF9naXdmcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJc3RydWN0IGl3X3BhcmFtICpmcmFnLCBjaGFyICpleHRyYSkKKwkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgIHN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpCiB7Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciA9IE5VTEw7CiAKLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0gICAgCXsKLSAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotICAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKLSAgICAJfQorCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZGFwdGVyLCBkZXYpOworCisJLypjaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CiAKIAlmcmFnLT52YWx1ZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQ7CiAJZnJhZy0+ZGlzYWJsZWQgPSAoZnJhZy0+dmFsdWUgPT0gTUFYX0ZSQUdfVEhSRVNIT0xEKTsKQEAgLTE0MDMsMTU2ICsxMzQ0LDE2MSBAQAogI2RlZmluZSBNQVhfV0VQX0tFWV9TSVpFIDEzCiAjZGVmaW5lIE1JTl9XRVBfS0VZX1NJWkUgNQogaW50IHJ0X2lvY3RsX3Npd2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICBzdHJ1Y3QgaXdfcG9pbnQgKmVycSwgY2hhciAqZXh0cmEpCisJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICAgc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmV4dHJhKQogewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIgPSBOVUxMOwogCi0JLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLSAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotICAgIAl7Ci0gICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLSAgICAgICAgCXJldHVybiAtRU5FVERPV047Ci0gICAgCX0KKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKIAotCWlmICgoZXJxLT5sZW5ndGggPT0gMCkgJiYKLSAgICAgICAgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpKQotCXsKKwkvKmNoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93biAqLworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWlmICgoZXJxLT5sZW5ndGggPT0gMCkgJiYgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpKSB7CiAJCXBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKIAkJcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKIAkJcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOwotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKLSAgICAgICAgZ290byBkb25lOwotCX0gZWxzZSBpZiAoCi0JCSAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEIHx8IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfT1BFTikpIHsKKwkJcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworCQlnb3RvIGRvbmU7CisJfSBlbHNlIGlmIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQKKwkJICAgfHwgZXJxLT5mbGFncyAmIElXX0VOQ09ERV9PUEVOKSB7CisJCS8qcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOyAqLwogCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKIAkJcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CiAJCXBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKIAkJcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisJCXBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOwogCQlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKQogCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDsKLSAgICAJZWxzZQorCQllbHNlCiAJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKIAl9CiAKLSAgICBpZiAoZXJxLT5sZW5ndGggPiAwKQotCXsKKwlpZiAoZXJxLT5sZW5ndGggPiAwKSB7CiAJCWludCBrZXlJZHggPSAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOwogCQkvKiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUga2V5ICovCiAJCWlmIChlcnEtPmxlbmd0aCA+IE1BWF9XRVBfS0VZX1NJWkUpIHsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCS8qIENoZWNrIGtleSBpbmRleCAqLwotCQlpZiAoKGtleUlkeCA8IDApIHx8IChrZXlJZHggPj0gTlJfV0VQX0tFWVMpKQotICAgICAgICB7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6Oldyb25nIGtleUlkeD0lZCEgVXNpbmcgZGVmYXVsdCBrZXkgaW5zdGVhZCAoJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUlkeCwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKwkJaWYgKChrZXlJZHggPCAwKSB8fCAoa2V5SWR4ID49IE5SX1dFUF9LRVlTKSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpXcm9uZyBrZXlJZHg9JWQhIFVzaW5nIGRlZmF1bHQga2V5IGluc3RlYWQgKCVkKVxuIiwKKwkJCQkgIGtleUlkeCwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKIAotICAgICAgICAgICAgLy9Vc2luZyBkZWZhdWx0IGtleQorCQkJLypVc2luZyBkZWZhdWx0IGtleSAqLwogCQkJa2V5SWR4ID0gcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQ7Ci0gICAgICAgIH0KLQkJZWxzZQotCQkJcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQ9a2V5SWR4OworCQl9IGVsc2UKKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0ga2V5SWR4OwogCi0gICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksICAxNik7CisJCU5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIDE2KTsKIAotCQlpZiAoZXJxLT5sZW5ndGggPT0gTUFYX1dFUF9LRVlfU0laRSkKLSAgICAgICAgewotCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1BWF9XRVBfS0VZX1NJWkU7Ci0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLQkJfQotCQllbHNlIGlmIChlcnEtPmxlbmd0aCA9PSBNSU5fV0VQX0tFWV9TSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUlOX1dFUF9LRVlfU0laRTsKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0JCX0KLQkJZWxzZQorCQlpZiAoZXJxLT5sZW5ndGggPT0gTUFYX1dFUF9LRVlfU0laRSkgeworCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9CisJCQkgICAgTUFYX1dFUF9LRVlfU0laRTsKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPQorCQkJICAgIENJUEhFUl9XRVAxMjg7CisJCX0gZWxzZSBpZiAoZXJxLT5sZW5ndGggPT0gTUlOX1dFUF9LRVlfU0laRSkgeworCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9CisJCQkgICAgTUlOX1dFUF9LRVlfU0laRTsKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPQorCQkJICAgIENJUEhFUl9XRVA2NDsKKwkJfSBlbHNlCiAJCQkvKiBEaXNhYmxlIHRoZSBrZXkgKi8KIAkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSAwOwogCiAJCS8qIENoZWNrIGlmIHRoZSBrZXkgaXMgbm90IG1hcmtlZCBhcyBpbnZhbGlkICovCi0JCWlmKCEoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9OT0tFWSkpIHsKKwkJaWYgKCEoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9OT0tFWSkpIHsKIAkJCS8qIENvcHkgdGhlIGtleSBpbiB0aGUgZHJpdmVyICovCi0JCQlOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCBleHRyYSwgZXJxLT5sZW5ndGgpOwotICAgICAgICB9Ci0JfQotICAgIGVsc2UKLQkJCXsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksCisJCQkJICAgICAgIGV4dHJhLCBlcnEtPmxlbmd0aCk7CisJCX0KKwl9IGVsc2UgewogCQkvKiBEbyB3ZSB3YW50IHRvIGp1c3Qgc2V0IHRoZSB0cmFuc21pdCBrZXkgaW5kZXggPyAqLwogCQlpbnQgaW5kZXggPSAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOwotCQlpZiAoKGluZGV4ID49IDApICYmIChpbmRleCA8IDQpKQotICAgICAgICB7CisJCWlmICgoaW5kZXggPj0gMCkgJiYgKGluZGV4IDwgNCkpIHsKIAkJCXBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gaW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGVsc2UKKwkJfSBlbHNlCiAJCQkvKiBEb24ndCBjb21wbGFpbiBpZiBvbmx5IGNoYW5nZSB0aGUgbW9kZSAqLwotCQkJaWYgKCEoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9NT0RFKSkgewotCQkJCXJldHVybiAtRUlOVkFMOwotCQl9CisJCWlmICghKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfTU9ERSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIGRvbmU6Ci0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjplcnEtPmZsYWdzPSV4XG4iLGVycS0+ZmxhZ3MpKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OkF1dGhNb2RlPSV4XG4iLHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUpKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OkRlZmF1bHRLZXlJZD0leCwgS2V5TGVuID0gJWRcbiIscEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4pKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OldlcFN0YXR1cz0leFxuIixwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cykpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OmVycS0+ZmxhZ3M9JXhcbiIsIGVycS0+ZmxhZ3MpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpBdXRoTW9kZT0leFxuIiwKKwkJICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6RGVmYXVsdEtleUlkPSV4LCBLZXlMZW4gPSAlZFxuIiwKKwkJICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKwkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS4KKwkJICBLZXlMZW4pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpXZXBTdGF0dXM9JXhcbiIsCisJCSAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMpKTsKIAlyZXR1cm4gMDsKIH0KIAogaW50CiBydF9pb2N0bF9naXdlbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmtleSkKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmtleSkKIHsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OwogCWludCBraWQ7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIgPSBOVUxMOwogCi0JLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLQlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0JewotICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLSAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKKworCS8qY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCXJldHVybiAtRU5FVERPV047CiAJfQogCiAJa2lkID0gZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+cnRfaW9jdGxfZ2l3ZW5jb2RlICVkXG4iLCBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIj09PT5ydF9pb2N0bF9naXdlbmNvZGUgJWRcbiIsIGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpKTsKIAotCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0JeworCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpIHsKIAkJZXJxLT5sZW5ndGggPSAwOwogCQllcnEtPmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOwotCX0KLQllbHNlIGlmICgoa2lkID4gMCkgJiYgKGtpZCA8PTQpKQotCXsKLQkJLy8gY29weSB3ZXAga2V5Ci0JCWVycS0+ZmxhZ3MgPSBraWQgOwkJCS8qIE5COiBiYXNlIDEgKi8KLQkJaWYgKGVycS0+bGVuZ3RoID4gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtraWQtMV0uS2V5TGVuKQotCQkJZXJxLT5sZW5ndGggPSBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tpZC0xXS5LZXlMZW47Ci0JCW1lbWNweShrZXksIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2lkLTFdLktleSwgZXJxLT5sZW5ndGgpOwotCQkvL2lmICgoa2lkID09IHBBZGFwdGVyLT5Qb3J0Q2ZnLkRlZmF1bHRLZXlJZCkpCi0JCS8vZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsJLyogWFhYICovCisJfSBlbHNlIGlmICgoa2lkID4gMCkgJiYgKGtpZCA8PSA0KSkgeworCQkvKiBjb3B5IHdlcCBrZXkgKi8KKwkJZXJxLT5mbGFncyA9IGtpZDsJLyogTkI6IGJhc2UgMSAqLworCQlpZiAoZXJxLT5sZW5ndGggPiBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tpZCAtIDFdLktleUxlbikKKwkJCWVycS0+bGVuZ3RoID0gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtraWQgLSAxXS5LZXlMZW47CisJCW1lbWNweShrZXksIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2lkIC0gMV0uS2V5LAorCQkgICAgICAgZXJxLT5sZW5ndGgpOworCQkvKmlmICgoa2lkID09IHBBZGFwdGVyLT5Qb3J0Q2ZnLkRlZmF1bHRLZXlJZCkpICovCisJCS8qZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsgKi8JLyogWFhYICovCiAJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKLQkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CQkvKiBYWFggKi8KKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CS8qIFhYWCAqLwogCQllbHNlCi0JCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOwkJLyogWFhYICovCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOwkvKiBYWFggKi8KIAotCX0KLQllbHNlIGlmIChraWQgPT0gMCkKLQl7CisJfSBlbHNlIGlmIChraWQgPT0gMCkgewogCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCi0JCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOwkJLyogWFhYICovCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOwkvKiBYWFggKi8KIAkJZWxzZQotCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsJCS8qIFhYWCAqLwotCQllcnEtPmxlbmd0aCA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbjsKLQkJbWVtY3B5KGtleSwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBlcnEtPmxlbmd0aCk7Ci0JCS8vIGNvcHkgZGVmYXVsdCBrZXkgSUQKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CS8qIFhYWCAqLworCQllcnEtPmxlbmd0aCA9CisJCSAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS4KKwkJICAgIEtleUxlbjsKKwkJbWVtY3B5KGtleSwKKwkJICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLgorCQkgICAgICAgS2V5LCBlcnEtPmxlbmd0aCk7CisJCS8qIGNvcHkgZGVmYXVsdCBrZXkgSUQgKi8KIAkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQotCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsJCS8qIFhYWCAqLworCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsJLyogWFhYICovCiAJCWVsc2UKLQkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CQkvKiBYWFggKi8KLQkJZXJxLT5mbGFncyA9IHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkICsgMTsJCQkvKiBOQjogYmFzZSAxICovCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOwkvKiBYWFggKi8KKwkJZXJxLT5mbGFncyA9IHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkICsgMTsJLyogTkI6IGJhc2UgMSAqLwogCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOwkvKiBYWFggKi8KIAl9CiAKQEAgLTE1NjAsNzcwICsxNTA2LDU4NSBAQAogCiB9CiAKLXN0YXRpYyBpbnQKLXJ0X2lvY3RsX3NldHBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgdm9pZCAqdywgY2hhciAqZXh0cmEpCit2b2lkIGdldEJhSW5mbyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIGNoYXIgKnBPdXRCdWYpCiB7Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKLQlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWRhcHRlci0+T1NfQ29va2llOwotCWNoYXIgKnRoaXNfY2hhciA9IGV4dHJhOwotCWNoYXIgKnZhbHVlOwotCWludCAgU3RhdHVzPTA7CisJaW50IGksIGo7CisJc3RydWN0IHJ0X2JhX29yaV9lbnRyeSAqcE9yaUJBRW50cnk7CisJc3RydWN0IHJ0X2JhX3JlY19lbnRyeSAqcFJlY0JBRW50cnk7CiAKLQl7Ci0JCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKLSAgICAgICAgcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKLQl9Ci0KLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0gICAgCXsKLSAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotCQkJcmV0dXJuIC1FTkVURE9XTjsKLSAgICAJfQotCi0JaWYgKCEqdGhpc19jaGFyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCi0JICAgICp2YWx1ZSsrID0gMDsKLQotCWlmICghdmFsdWUpCi0JICAgIHJldHVybiAtRUlOVkFMOwotCi0JLy8gcmVqZWN0IHNldHRpbmcgbm90aGluZyBiZXNpZGVzIEFOWSBzc2lkKHNzaWRMZW49MCkKLSAgICBpZiAoISp2YWx1ZSAmJiAoc3RyY21wKHRoaXNfY2hhciwgIlNTSUQiKSAhPSAwKSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0KLQlmb3IgKFBSVE1QX1BSSVZBVEVfU0VUX1BST0MgPSBSVE1QX1BSSVZBVEVfU1VQUE9SVF9QUk9DOyBQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5uYW1lOyBQUlRNUF9QUklWQVRFX1NFVF9QUk9DKyspCi0JewotCSAgICBpZiAoc3RyY21wKHRoaXNfY2hhciwgUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+bmFtZSkgPT0gMCkKLQkgICAgewotCSAgICAgICAgaWYoIVBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPnNldF9wcm9jKHBBZGFwdGVyLCB2YWx1ZSkpCi0JICAgICAgICB7CS8vRkFMU0U6U2V0IHByaXZhdGUgZmFpbGVkIHRoZW4gcmV0dXJuIEludmFsaWQgYXJndW1lbnQKLQkJCSAgICBTdGF0dXMgPSAtRUlOVkFMOwotCSAgICAgICAgfQotCQkgICAgYnJlYWs7CS8vRXhpdCBmb3IgbG9vcC4KLQkgICAgfQotCX0KLQotCWlmKFBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPm5hbWUgPT0gTlVMTCkKLQl7ICAvL05vdCBmb3VuZCBhcmd1bWVudAotCSAgICBTdGF0dXMgPSAtRUlOVkFMOwotCSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+cnRfaW9jdGxfc2V0cGFyYW06OiAoaXdwcml2KSBOb3QgU3VwcG9ydCBTZXQgQ29tbWFuZCBbJXM9JXNdXG4iLCB0aGlzX2NoYXIsIHZhbHVlKSk7Ci0JfQotCi0gICAgcmV0dXJuIFN0YXR1czsKLX0KLQotCi1zdGF0aWMgaW50Ci1ydF9wcml2YXRlX2dldF9zdGF0aXN0aWNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCXN0cnVjdCBpd19wb2ludCAqd3JxLCBjaGFyICpleHRyYSkKLXsKLQlJTlQJCQkJU3RhdHVzID0gMDsKLSAgICBQUlRNUF9BREFQVEVSICAgcEFkID0gZGV2LT5tbF9wcml2OwotCi0gICAgaWYgKGV4dHJhID09IE5VTEwpCi0gICAgewotICAgICAgICB3cnEtPmxlbmd0aCA9IDA7Ci0gICAgICAgIHJldHVybiAtRUlPOwotICAgIH0KLQotICAgIG1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOwotICAgIHNwcmludGYoZXh0cmEsICJcblxuIik7Ci0KLQl7Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCk7Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyB3aXRob3V0IHJldHJ5ICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCAtIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0KTsKLQl9Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyBhZnRlciByZXRyeSAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQpOwotICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IGZhaWwgdG8gUmN2IEFDSyBhZnRlciByZXRyeSAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC5RdWFkUGFydCk7Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlRTIFN1Y2Nlc3MgUmN2IENUUyAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJUU1N1Y2Nlc3NDb3VudC5RdWFkUGFydCk7Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlRTIEZhaWwgUmN2IENUUyAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJUU0ZhaWx1cmVDb3VudC5RdWFkUGFydCk7Ci0KLSAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0KTsKLSAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCB3aXRoIENSQyAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC5RdWFkUGFydCk7Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUnggZHJvcCBkdWUgdG8gb3V0IG9mIHJlc291cmNlICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIpOwotICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IGR1cGxpY2F0ZSBmcmFtZSAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LlF1YWRQYXJ0KTsKLQotICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIkZhbHNlIENDQSAob25lIHNlY29uZCkgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0ZhbHNlQ0NBQ250KTsKLQl7Ci0gICAgCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKLSAgICAgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1CIChpZiBhdmFpbGFibGUpICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOwotICAgICAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUMgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG5cbiIsIChMT05HKShwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMiAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKLQl9Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiV3BhU3VwcGxpY2FudFVQICAgICAgICAgICAgICAgICA9ICVkXG5cbiIsIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCk7Ci0KLSAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gcnRfcHJpdmF0ZV9nZXRfc3RhdGlzdGljcywgd3JxLT5sZW5ndGggPSAlZFxuIiwgd3JxLT5sZW5ndGgpKTsKLQotICAgIHJldHVybiBTdGF0dXM7Ci19Ci0KLXZvaWQJZ2V0QmFJbmZvKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBPdXRCdWYpCi17Ci0JSU5UIGksIGo7Ci0JQkFfT1JJX0VOVFJZICpwT3JpQkFFbnRyeTsKLQlCQV9SRUNfRU5UUlkgKnBSZWNCQUVudHJ5OwotCi0JZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKLQl7Ci0JCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07Ci0JCWlmICgoKHBFbnRyeS0+VmFsaWRBc0NMSSB8fCBwRW50cnktPlZhbGlkQXNBcENsaSkgJiYgKHBFbnRyeS0+U3N0ID09IFNTVF9BU1NPQykpCi0JCQl8fCAocEVudHJ5LT5WYWxpZEFzV0RTKSB8fCAocEVudHJ5LT5WYWxpZEFzTWVzaCkpCi0JCXsKLQkJCXNwcmludGYocE91dEJ1ZiArIHN0cmxlbihwT3V0QnVmKSwgIlxuJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlggKEFpZCA9ICVkKSAoQVApIC1cbiIsCi0JCQkJcEVudHJ5LT5BZGRyWzBdLCBwRW50cnktPkFkZHJbMV0sIHBFbnRyeS0+QWRkclsyXSwKLQkJCQlwRW50cnktPkFkZHJbM10sIHBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdLCBwRW50cnktPkFpZCk7CisJZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspIHsKKwkJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CisJCWlmICgoKHBFbnRyeS0+VmFsaWRBc0NMSSB8fCBwRW50cnktPlZhbGlkQXNBcENsaSkKKwkJICAgICAmJiAocEVudHJ5LT5Tc3QgPT0gU1NUX0FTU09DKSkKKwkJICAgIHx8IChwRW50cnktPlZhbGlkQXNXRFMpIHx8IChwRW50cnktPlZhbGlkQXNNZXNoKSkgeworCQkJc3ByaW50ZihwT3V0QnVmICsgc3RybGVuKHBPdXRCdWYpLAorCQkJCSJcbiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIChBaWQgPSAlZCkgKEFQKSAtXG4iLAorCQkJCXBFbnRyeS0+QWRkclswXSwgcEVudHJ5LT5BZGRyWzFdLAorCQkJCXBFbnRyeS0+QWRkclsyXSwgcEVudHJ5LT5BZGRyWzNdLAorCQkJCXBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdLCBwRW50cnktPkFpZCk7CiAKIAkJCXNwcmludGYocE91dEJ1ZiwgIiVzW1JlY2lwaWVudF1cbiIsIHBPdXRCdWYpOwotCQkJZm9yIChqPTA7IGogPCBOVU1fT0ZfVElEOyBqKyspCi0JCQl7Ci0JCQkJaWYgKHBFbnRyeS0+QkFSZWNXY2lkQXJyYXlbal0gIT0gMCkKLQkJCQl7Ci0JCQkJCXBSZWNCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbcEVudHJ5LT5CQVJlY1djaWRBcnJheVtqXV07Ci0JCQkJCXNwcmludGYocE91dEJ1ZiArIHN0cmxlbihwT3V0QnVmKSwgIlRJRD0lZCwgQkFXaW5TaXplPSVkLCBMYXN0SW5kU2VxPSVkLCBSZW9yZGVyaW5nUGt0cz0lZFxuIiwgaiwgcFJlY0JBRW50cnktPkJBV2luU2l6ZSwgcFJlY0JBRW50cnktPkxhc3RJbmRTZXEsIHBSZWNCQUVudHJ5LT5saXN0LnFsZW4pOworCQkJZm9yIChqID0gMDsgaiA8IE5VTV9PRl9USUQ7IGorKykgeworCQkJCWlmIChwRW50cnktPkJBUmVjV2NpZEFycmF5W2pdICE9IDApIHsKKwkJCQkJcFJlY0JBRW50cnkgPQorCQkJCQkgICAgJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W3BFbnRyeS0+CisJCQkJCQkJCSAgICAgQkFSZWNXY2lkQXJyYXkKKwkJCQkJCQkJICAgICBbal1dOworCQkJCQlzcHJpbnRmKHBPdXRCdWYgKyBzdHJsZW4ocE91dEJ1ZiksCisJCQkJCQkiVElEPSVkLCBCQVdpblNpemU9JWQsIExhc3RJbmRTZXE9JWQsIFJlb3JkZXJpbmdQa3RzPSVkXG4iLAorCQkJCQkJaiwgcFJlY0JBRW50cnktPkJBV2luU2l6ZSwKKwkJCQkJCXBSZWNCQUVudHJ5LT5MYXN0SW5kU2VxLAorCQkJCQkJcFJlY0JBRW50cnktPmxpc3QucWxlbik7CiAJCQkJfQogCQkJfQogCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNcbiIsIHBPdXRCdWYpOwogCiAJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1tPcmlnaW5hdG9yXVxuIiwgcE91dEJ1Zik7Ci0JCQlmb3IgKGo9MDsgaiA8IE5VTV9PRl9USUQ7IGorKykKLQkJCXsKLQkJCQlpZiAocEVudHJ5LT5CQU9yaVdjaWRBcnJheVtqXSAhPSAwKQotCQkJCXsKLQkJCQkJcE9yaUJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtwRW50cnktPkJBT3JpV2NpZEFycmF5W2pdXTsKLQkJCQkJc3ByaW50ZihwT3V0QnVmICsgc3RybGVuKHBPdXRCdWYpLCAiVElEPSVkLCBCQVdpblNpemU9JWQsIFN0YXJ0U2VxPSVkLCBDdXJUeFNlcT0lZFxuIiwgaiwgcE9yaUJBRW50cnktPkJBV2luU2l6ZSwgcE9yaUJBRW50cnktPlNlcXVlbmNlLCBwRW50cnktPlR4U2VxW2pdKTsKKwkJCWZvciAoaiA9IDA7IGogPCBOVU1fT0ZfVElEOyBqKyspIHsKKwkJCQlpZiAocEVudHJ5LT5CQU9yaVdjaWRBcnJheVtqXSAhPSAwKSB7CisJCQkJCXBPcmlCQUVudHJ5ID0KKwkJCQkJICAgICZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtwRW50cnktPgorCQkJCQkJCQkgICAgIEJBT3JpV2NpZEFycmF5CisJCQkJCQkJCSAgICAgW2pdXTsKKwkJCQkJc3ByaW50ZihwT3V0QnVmICsgc3RybGVuKHBPdXRCdWYpLAorCQkJCQkJIlRJRD0lZCwgQkFXaW5TaXplPSVkLCBTdGFydFNlcT0lZCwgQ3VyVHhTZXE9JWRcbiIsCisJCQkJCQlqLCBwT3JpQkFFbnRyeS0+QkFXaW5TaXplLAorCQkJCQkJcE9yaUJBRW50cnktPlNlcXVlbmNlLAorCQkJCQkJcEVudHJ5LT5UeFNlcVtqXSk7CiAJCQkJfQogCQkJfQogCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNcblxuIiwgcE91dEJ1Zik7CiAJCX0KLSAgICAgICAgaWYgKHN0cmxlbihwT3V0QnVmKSA+IChJV19QUklWX1NJWkVfTUFTSyAtIDMwKSkKLSAgICAgICAgICAgICAgICBicmVhazsKKwkJaWYgKHN0cmxlbihwT3V0QnVmKSA+IChJV19QUklWX1NJWkVfTUFTSyAtIDMwKSkKKwkJCWJyZWFrOwogCX0KIAogCXJldHVybjsKIH0KIAotc3RhdGljIGludAotcnRfcHJpdmF0ZV9zaG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCXN0cnVjdCBpd19wb2ludCAqd3JxLCBjaGFyICpleHRyYSkKLXsKLSAgICBJTlQJCQkJU3RhdHVzID0gMDsKLSAgICBQUlRNUF9BREFQVEVSIHBBZCA9IGRldi0+bWxfcHJpdjsKLSAgICBQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0gICAgdTMyICAgICAgICAgICAgIHN1YmNtZCA9IHdycS0+ZmxhZ3M7Ci0KLSAgICBpZiAoZXh0cmEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHdycS0+bGVuZ3RoID0gMDsKLSAgICAgICAgcmV0dXJuIC1FSU87Ci0gICAgfQotICAgIG1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOwotCi0JewotCQlwT2JqLT5pb2N0bF9pZl90eXBlID0gSU5UX01BSU47Ci0gICAgICAgIHBPYmotPmlvY3RsX2lmID0gTUFJTl9NQlNTSUQ7Ci0JfQotCi0gICAgc3dpdGNoKHN1YmNtZCkKLSAgICB7Ci0KLSAgICAgICAgY2FzZSBTSE9XX0NPTk5fU1RBVFVTOgotICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCi0gICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVykKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIk1vbml0b3IgTW9kZShDZW50cmFsQ2hhbm5lbCAlZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJNb25pdG9yIE1vZGUoQ2hhbm5lbCAlZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9PSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZCkKLSAgICAgICAgICAgIAl7Ci0gICAgICAgICAgICAJICAgIGlmIChJTkZSQV9PTihwQWQpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJDb25uZWN0ZWQoQVA6ICVzWyUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXSlcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Tc2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFs0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzVdKTsKLSAgICAgICAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiU3NpZD0lcyAsU3NpZGxlbiA9ICVkXG4iLHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pKTsKLSAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFESE9DX09OKHBBZCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiQ29ubmVjdGVkXG4iKTsKLSAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAJZWxzZQotICAgICAgICAgICAgCXsKLSAgICAgICAgICAgIAkgICAgc3ByaW50ZihleHRyYSwgIkRpc2Nvbm5lY3RlZFxuIik7Ci0gICAgICAgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIkNvbm5TdGF0dXMgaXMgbm90IGNvbm5lY3RlZFxuIikpOwotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU0hPV19EUlZJRVJfVkVSSU9OOgotICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIkRyaXZlciB2ZXJzaW9uLSVzLCAlcyAlc1xuIiwgU1RBX0RSSVZFUl9WRVJTSU9OLCBfX0RBVEVfXywgX19USU1FX18gKTsKLSAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU0hPV19CQV9JTkZPOgotICAgICAgICAgICAgZ2V0QmFJbmZvKHBBZCwgZXh0cmEpOwotICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCi0gICAgICAgICAgICBicmVhazsKLQkJY2FzZSBTSE9XX0RFU0NfSU5GTzoKLQkJCXsKLQkJCQlTaG93X0Rlc2NJbmZvX1Byb2MocEFkLCBOVUxMKTsKLQkJCQl3cnEtPmxlbmd0aCA9IDA7IC8vIDE6IHNpemUgb2YgJ1wwJwotCQkJfQotCQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgUkFJT19PRkY6Ci0gICAgICAgICAgICBpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiU2Nhbm5pbmdcbiIpOwotICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlN3UmFkaW8gPSBGQUxTRTsKLSAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5iUmFkaW8gIT0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5iUmFkaW8gPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pOwotICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gRkFMU0UpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PZmYocEFkKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCi0JCQkJCXBBZC0+RXh0cmFJbmZvID0gU1dfUkFESU9fT0ZGOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJSYWRpbyBPZmZcbiIpOwotICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSQUlPX09OOgotI2lmZGVmIFJUMjg3MAotICAgICAgICAgICAgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIlNjYW5uaW5nXG4iKTsKLSAgICAgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlN3UmFkaW8gPSBUUlVFOwotICAgICAgICAgICAgLy9pZiAocEFkLT5TdGFDZmcuYlJhZGlvICE9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlJhZGlvID0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKTsKLSAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PbihwQWQpOwotICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KLQkJCQkJcEFkLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJSYWRpbyBPblxuIik7Ci0gICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKLSAgICAgICAgICAgIGJyZWFrOwotCi0JCWNhc2UgU0hPV19DRkdfVkFMVUU6Ci0JCQl7Ci0JCQkJU3RhdHVzID0gUlRNUFNob3dDZmdWYWx1ZShwQWQsIHdycS0+cG9pbnRlciwgZXh0cmEpOwotCQkJCWlmIChTdGF0dXMgPT0gMCkKLQkJCQkJd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCi0JCQl9Ci0JCQlicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIC0gdW5rbm93IHN1YmNtZCA9ICVkXG4iLCBfX2Z1bmNfXywgc3ViY21kKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gU3RhdHVzOwotfQotCiBpbnQgcnRfaW9jdGxfc2l3bWxtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCi0JCQkgICBjaGFyICpleHRyYSkKKwkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCVBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gTlVMTDsKIAlzdHJ1Y3QgaXdfbWxtZSAqcE1sbWUgPSAoc3RydWN0IGl3X21sbWUgKil3cnF1LT5kYXRhLnBvaW50ZXI7Ci0JTUxNRV9RVUVVRV9FTEVNCQkJCU1zZ0VsZW07Ci0JTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUCURpc0Fzc29jUmVxOwotCU1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgICAgICBEZUF1dGhSZXE7CisJc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSBNc2dFbGVtOworCXN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSBEaXNBc3NvY1JlcTsKKwlzdHJ1Y3QgcnRfbWxtZV9kZWF1dGhfcmVxIERlQXV0aFJlcTsKKworCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZCwgZGV2KTsKIAogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzXG4iLCBfX2Z1bmNfXykpOwogCiAJaWYgKHBNbG1lID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jc3dpdGNoKHBNbG1lLT5jbWQpCi0JeworCXN3aXRjaCAocE1sbWUtPmNtZCkgewogI2lmZGVmIElXX01MTUVfREVBVVRICi0JCWNhc2UgSVdfTUxNRV9ERUFVVEg6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIElXX01MTUVfREVBVVRIXG4iLCBfX2Z1bmNfXykpOwotCQkJQ09QWV9NQUNfQUREUihEZUF1dGhSZXEuQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQkJRGVBdXRoUmVxLlJlYXNvbiA9IHBNbG1lLT5yZWFzb25fY29kZTsKLQkJCU1zZ0VsZW0uTXNnTGVuID0gc2l6ZW9mKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QpOwotCQkJTmRpc01vdmVNZW1vcnkoTXNnRWxlbS5Nc2csICZEZUF1dGhSZXEsIHNpemVvZihNTE1FX0RFQVVUSF9SRVFfU1RSVUNUKSk7Ci0JCQlNbG1lRGVhdXRoUmVxQWN0aW9uKHBBZCwgJk1zZ0VsZW0pOwotCQkJaWYgKElORlJBX09OKHBBZCkpCi0JCQl7Ci0JCQkgICAgTGlua0Rvd24ocEFkLCBGQUxTRSk7Ci0JCQkgICAgcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwotCQkJfQotCQkJYnJlYWs7Ci0jZW5kaWYgLy8gSVdfTUxNRV9ERUFVVEggLy8KKwljYXNlIElXX01MTUVfREVBVVRIOgorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIj09PT0+ICVzIC0gSVdfTUxNRV9ERUFVVEhcbiIsIF9fZnVuY19fKSk7CisJCUNPUFlfTUFDX0FERFIoRGVBdXRoUmVxLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJRGVBdXRoUmVxLlJlYXNvbiA9IHBNbG1lLT5yZWFzb25fY29kZTsKKwkJTXNnRWxlbS5Nc2dMZW4gPSBzaXplb2Yoc3RydWN0IHJ0X21sbWVfZGVhdXRoX3JlcSk7CisJCU5kaXNNb3ZlTWVtb3J5KE1zZ0VsZW0uTXNnLCAmRGVBdXRoUmVxLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9kZWF1dGhfcmVxKSk7CisJCU1sbWVEZWF1dGhSZXFBY3Rpb24ocEFkLCAmTXNnRWxlbSk7CisJCWlmIChJTkZSQV9PTihwQWQpKSB7CisJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJfQorCQlicmVhazsKKyNlbmRpZiAvKiBJV19NTE1FX0RFQVVUSCAvLyAqLwogI2lmZGVmIElXX01MTUVfRElTQVNTT0MKLQkJY2FzZSBJV19NTE1FX0RJU0FTU09DOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXMgLSBJV19NTE1FX0RJU0FTU09DXG4iLCBfX2Z1bmNfXykpOwotCQkJQ09QWV9NQUNfQUREUihEaXNBc3NvY1JlcS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQlEaXNBc3NvY1JlcS5SZWFzb24gPSAgcE1sbWUtPnJlYXNvbl9jb2RlOworCWNhc2UgSVdfTUxNRV9ESVNBU1NPQzoKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCI9PT09PiAlcyAtIElXX01MTUVfRElTQVNTT0NcbiIsIF9fZnVuY19fKSk7CisJCUNPUFlfTUFDX0FERFIoRGlzQXNzb2NSZXEuQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQlEaXNBc3NvY1JlcS5SZWFzb24gPSBwTWxtZS0+cmVhc29uX2NvZGU7CiAKLQkJCU1zZ0VsZW0uTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7Ci0JCQlNc2dFbGVtLk1zZ1R5cGUgPSBNVDJfTUxNRV9ESVNBU1NPQ19SRVE7Ci0JCQlNc2dFbGVtLk1zZ0xlbiA9IHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpOwotCQkJTmRpc01vdmVNZW1vcnkoTXNnRWxlbS5Nc2csICZEaXNBc3NvY1JlcSwgc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCkpOworCQlNc2dFbGVtLk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQlNc2dFbGVtLk1zZ1R5cGUgPSBNVDJfTUxNRV9ESVNBU1NPQ19SRVE7CisJCU1zZ0VsZW0uTXNnTGVuID0gc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSk7CisJCU5kaXNNb3ZlTWVtb3J5KE1zZ0VsZW0uTXNnLCAmRGlzQXNzb2NSZXEsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSkpOwogCi0JCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9ESVNBU1NPQzsKLQkJCU1sbWVEaXNhc3NvY1JlcUFjdGlvbihwQWQsICZNc2dFbGVtKTsKLQkJCWJyZWFrOwotI2VuZGlmIC8vIElXX01MTUVfRElTQVNTT0MgLy8KLQkJZGVmYXVsdDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gVW5rbm93IENvbW1hbmRcbiIsIF9fZnVuY19fKSk7Ci0JCQlicmVhazsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfRElTQVNTT0M7CisJCU1sbWVEaXNhc3NvY1JlcUFjdGlvbihwQWQsICZNc2dFbGVtKTsKKwkJYnJlYWs7CisjZW5kaWYgLyogSVdfTUxNRV9ESVNBU1NPQyAvLyAqLworCWRlZmF1bHQ6CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiPT09PT4gJXMgLSBVbmtub3cgQ29tbWFuZFxuIiwgX19mdW5jX18pKTsKKwkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKIGludCBydF9pb2N0bF9zaXdhdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQorCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7Ci0JUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyID0gTlVMTDsKIAlzdHJ1Y3QgaXdfcGFyYW0gKnBhcmFtID0gJndycXUtPnBhcmFtOwogCi0gICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLQlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0JewotICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLSAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKKworCS8qY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCXJldHVybiAtRU5FVERPV047CiAJfQogCXN3aXRjaCAocGFyYW0tPmZsYWdzICYgSVdfQVVUSF9JTkRFWCkgewotICAgIAljYXNlIElXX0FVVEhfV1BBX1ZFUlNJT046Ci0gICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7Ci0JCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCi0JCQkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBMikKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKKwljYXNlIElXX0FVVEhfV1BBX1ZFUlNJT046CisJCWlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEEpIHsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7CisJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0KKwkJCQkgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKwkJfSBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEEyKQorCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CiAKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9WRVJTSU9OIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAJY2FzZSBJV19BVVRIX0NJUEhFUl9QQUlSV0lTRToKLSAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfTk9ORSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQNDAgfHwKLSAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVAxMDQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1RLSVApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfQ0NNUCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0NJUEhFUl9QQUlSV0lTRSAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgCWNhc2UgSVdfQVVUSF9DSVBIRVJfR1JPVVA6Ci0gICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX05PTkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVA0MCB8fAotICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDEwNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfVEtJUCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9DQ01QKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfQ0lQSEVSX0dST1VQIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAJY2FzZSBJV19BVVRIX0tFWV9NR01UOgotICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0tFWV9NR01UXzgwMl8xWCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBOwotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAvLyBXRVAgMXgKLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IDApCi0gICAgICAgICAgICB7Ci0JCQkJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9LRVlfTUdNVCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgCWNhc2UgSVdfQVVUSF9SWF9VTkVOQ1JZUFRFRF9FQVBPTDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIAljYXNlIElXX0FVVEhfUFJJVkFDWV9JTlZPS0VEOgotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfUFJJVkFDWV9JTlZPS0VEIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7Ci0gICAgCQlicmVhazsKLSAgICAJY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6Ci0gICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlICE9IDApCi0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKLQkJCWVsc2UKLQkJCXsKLQkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKLQkJCX0KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9WRVJTSU9OIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7Ci0gICAgCQlicmVhazsKLSAgICAJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgotCQkJaWYgKHBhcmFtLT52YWx1ZSAmIElXX0FVVEhfQUxHX1NIQVJFRF9LRVkpCi0gICAgICAgICAgICB7Ci0JCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDsKLQkJCX0KLSAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSAmIElXX0FVVEhfQUxHX09QRU5fU1lTVEVNKQotICAgICAgICAgICAgewotCQkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOwotCQkJfQotICAgICAgICAgICAgZWxzZQotCQkJCXJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfODAyMTFfQVVUSF9BTEcgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKLQkJCWJyZWFrOwotICAgIAljYXNlIElXX0FVVEhfV1BBX0VOQUJMRUQ6Ci0gICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9XUEFfRU5BQkxFRCAtIERyaXZlciBzdXBwb3J0cyBXUEEhKHBhcmFtLT52YWx1ZSA9ICVkKVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOwotICAgIAkJYnJlYWs7Ci0gICAgCWRlZmF1bHQ6Ci0gICAgCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci19CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiJXM6OklXX0FVVEhfV1BBX1ZFUlNJT04gLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsCisJCQkgIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKwkJYnJlYWs7CisJY2FzZSBJV19BVVRIX0NJUEhFUl9QQUlSV0lTRToKKwkJaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9OT05FKSB7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9CisJCQkgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJCX0gZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDQwIHx8CisJCQkgICBwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQMTA0KSB7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCQkJcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0KKwkJCSAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCQkJcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKKwkJfSBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfVEtJUCkgeworCQkJcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPQorCQkJICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPQorCQkJICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworCQkJcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0KKwkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQl9IGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9DQ01QKSB7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9CisJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9CisJCQkgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPQorCQkJICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCIlczo6SVdfQVVUSF9DSVBIRVJfUEFJUldJU0UgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsCisJCQkgIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKwkJYnJlYWs7CisJY2FzZSBJV19BVVRIX0NJUEhFUl9HUk9VUDoKKwkJaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9OT05FKSB7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCQl9IGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVA0MCB8fAorCQkJICAgcGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDEwNCkgeworCQkJcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCQl9IGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9US0lQKSB7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0KKwkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQl9IGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9DQ01QKSB7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0KKwkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiJXM6OklXX0FVVEhfQ0lQSEVSX0dST1VQIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLAorCQkJICBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisJCWJyZWFrOworCWNhc2UgSVdfQVVUSF9LRVlfTUdNVDoKKwkJaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0tFWV9NR01UXzgwMl8xWCkgeworCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0KKwkJCSAgICBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0KKwkJCQkgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBOworCQkJCXBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7CisJCQl9IGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0KKwkJCQkgICBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9CisJCQkJICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKKwkJCX0gZWxzZQorCQkJCS8qIFdFUCAxeCAqLworCQkJCXBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gVFJVRTsKKwkJfSBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gMCkgeworCQkJLypwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7ICovCisJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIiVzOjpJV19BVVRIX0tFWV9NR01UIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLAorCQkJICBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisJCWJyZWFrOworCWNhc2UgSVdfQVVUSF9SWF9VTkVOQ1JZUFRFRF9FQVBPTDoKKwkJYnJlYWs7CisJY2FzZSBJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRDoKKwkJLyppZiAocGFyYW0tPnZhbHVlID09IDApCisJCSAgIHsKKwkJICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisJCSAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCQkgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCQkgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCQkgICB9ICovCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiJXM6OklXX0FVVEhfUFJJVkFDWV9JTlZPS0VEIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLAorCQkJICBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisJCWJyZWFrOworCWNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgorCQlpZiAocGFyYW0tPnZhbHVlICE9IDApCisJCQlwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0KKwkJCSAgICBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCWVsc2UgeworCQkJLypwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7ICovCisJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIiVzOjpJV19BVVRIX1dQQV9WRVJTSU9OIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLAorCQkJICBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisJCWJyZWFrOworCWNhc2UgSVdfQVVUSF84MDIxMV9BVVRIX0FMRzoKKwkJaWYgKHBhcmFtLT52YWx1ZSAmIElXX0FVVEhfQUxHX1NIQVJFRF9LRVkpIHsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7CisJCX0gZWxzZSBpZiAocGFyYW0tPnZhbHVlICYgSVdfQVVUSF9BTEdfT1BFTl9TWVNURU0pIHsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIiVzOjpJV19BVVRIXzgwMjExX0FVVEhfQUxHIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLAorCQkJICBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisJCWJyZWFrOworCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCIlczo6SVdfQVVUSF9XUEFfRU5BQkxFRCAtIERyaXZlciBzdXBwb3J0cyBXUEEhKHBhcmFtLT52YWx1ZSA9ICVkKVxuIiwKKwkJCSAgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQogCiAJcmV0dXJuIDA7CiB9CiAKIGludCBydF9pb2N0bF9naXdhdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKKwkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCVBSVE1QX0FEQVBURVIgICBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciA9IE5VTEw7CiAJc3RydWN0IGl3X3BhcmFtICpwYXJhbSA9ICZ3cnF1LT5wYXJhbTsKIAotICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0JaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotICAgIHsKLSAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0gICAgCXJldHVybiAtRU5FVERPV047Ci0gICAgfQorCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZGFwdGVyLCBkZXYpOworCisJLypjaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CiAKIAlzd2l0Y2ggKHBhcmFtLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKIAljYXNlIElXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRDoKLSAgICAgICAgcGFyYW0tPnZhbHVlID0gKHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkgPyAwIDogMTsKKwkJcGFyYW0tPnZhbHVlID0KKwkJICAgIChwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9PQorCQkgICAgIE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkgPyAwIDogMTsKIAkJYnJlYWs7CiAKIAljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6Ci0gICAgICAgIHBhcmFtLT52YWx1ZSA9IChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkgPyBJV19BVVRIX0FMR19TSEFSRURfS0VZIDogSVdfQVVUSF9BTEdfT1BFTl9TWVNURU07CisJCXBhcmFtLT52YWx1ZSA9CisJCSAgICAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkgICAgIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkgPyBJV19BVVRIX0FMR19TSEFSRURfS0VZIDoKKwkJICAgIElXX0FVVEhfQUxHX09QRU5fU1lTVEVNOwogCQlicmVhazsKIAogCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKLQkJcGFyYW0tPnZhbHVlID0gKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSA/IDEgOiAwOworCQlwYXJhbS0+dmFsdWUgPQorCQkgICAgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0KKwkJICAgICBOZGlzODAyXzExQXV0aE1vZGVXUEEpID8gMSA6IDA7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9naXdhdXRoOjpwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIHBhcmFtLT52YWx1ZSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJydF9pb2N0bF9naXdhdXRoOjpwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIHBhcmFtLT52YWx1ZSkpOwogCXJldHVybiAwOwogfQogCi12b2lkIGZuU2V0Q2lwaGVyS2V5KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIElOVCAgICAgICAgICAgICBrZXlJZHgsCi0gICAgSU4gIFVDSEFSICAgICAgICAgICBDaXBoZXJBbGcsCi0gICAgSU4gIEJPT0xFQU4gICAgICAgICBiR1RLLAotICAgIElOICBzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0KQordm9pZCBmblNldENpcGhlcktleShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciwKKwkJICAgIGludCBrZXlJZHgsCisJCSAgICB1OCBDaXBoZXJBbGcsCisJCSAgICBJTiBCT09MRUFOIGJHVEssIElOIHN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQpCiB7Ci0jaWZkZWYgUlQyODYwCi0JUlRNUF9DTEVBUl9QU0ZMQUcocEFkYXB0ZXIsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7Ci0JaWYgKFJUTVBfVEVTVF9QU0ZMQUcocEFkYXB0ZXIsIGZSVE1QX1BTX1NFVF9QQ0lfQ0xLX09GRl9DT01NQU5EKSkKLQl7Ci0JCWlmIChwQWRhcHRlci0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKLQkJewotCQkJUlRNUF9TRVRfUFNGTEFHKHBBZGFwdGVyLCBmUlRNUF9QU19DQU5fR09fU0xFRVApOwotCQkJcmV0dXJuOwotCQl9Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFdQQUFkZEtleVByb2MxPT0+XG4iKSk7Ci0JCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkYXB0ZXIsIFJFU1RPUkVfSEFMVCk7Ci0JCVJUTVB1c2VjRGVsYXkoNjAwMCk7Ci0JCXBBZGFwdGVyLT5iUENJY2xrT2ZmID0gRkFMU0U7Ci0JfQotI2VuZGlmCi0gICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKLSAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7Ci0gICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgZXh0LT5rZXksIExFTl9US0lQX0VLKTsKLSAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uVHhNaWMsIGV4dC0+a2V5ICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7Ci0gICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlJ4TWljLCBleHQtPmtleSArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOwotICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XSwgc2l6ZW9mKHN0cnVjdCBydF9jaXBoZXJfa2V5KSk7CisJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IExFTl9US0lQX0VLOworCU5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dC0+a2V5LAorCQkgICAgICAgTEVOX1RLSVBfRUspOworCU5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5UeE1pYywKKwkJICAgICAgIGV4dC0+a2V5ICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7CisJTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlJ4TWljLAorCQkgICAgICAgZXh0LT5rZXkgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywKKwkJICAgICAgIExFTl9US0lQX1JYTUlDSyk7CisJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKIAotICAgIC8vIFVwZGF0ZSBncm91cCBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisJLyogVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUgKi8KIAlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCi0JCQkJCQkgIEJTUzAsCi0JCQkJCQkgIGtleUlkeCwKLQkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywKLQkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwKLQkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlR4TWljLAotCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uUnhNaWMpOworCQkJICAgICAgQlNTMCwKKwkJCSAgICAgIGtleUlkeCwKKwkJCSAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcsCisJCQkgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LAorCQkJICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlR4TWljLAorCQkJICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlJ4TWljKTsKIAotICAgIGlmIChiR1RLKQotICAgICAgICAvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKLSAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwKLSAgICAJCQkJCQkJICBCU1MwLAotICAgIAkJCQkJCQkgIGtleUlkeCwKLSAgICAJCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLAotICAgIAkJCQkJCQkgIE5VTEwpOwotICAgIGVsc2UKLSAgICAgICAgLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCi0gICAgCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsCi0gICAgCQkJCQkJCSAgQlNTMCwKLSAgICAJCQkJCQkJICBrZXlJZHgsCi0gICAgCQkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywKLSAgICAJCQkJCQkJICAmcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdKTsKLSNpZmRlZiBSVDI4NjAKLQlSVE1QX1NFVF9QU0ZMQUcocEFkYXB0ZXIsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7Ci0jZW5kaWYKKwlpZiAoYkdUSykKKwkJLyogVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlICovCisJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsCisJCQkJCSAgQlNTMCwKKwkJCQkJICBrZXlJZHgsCisJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLgorCQkJCQkgIENpcGhlckFsZywgTlVMTCk7CisJZWxzZQorCQkvKiBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgKi8KKwkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwKKwkJCQkJICBCU1MwLAorCQkJCQkgIGtleUlkeCwKKwkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uCisJCQkJCSAgQ2lwaGVyQWxnLAorCQkJCQkgICZwQWRhcHRlci0+TWFjVGFiLgorCQkJCQkgIENvbnRlbnRbQlNTSURfV0NJRF0pOwogfQogCiBpbnQgcnRfaW9jdGxfc2l3ZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKLQkJCSAgIGNoYXIgKmV4dHJhKQotCQkJewotICAgIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIgPSBOVUxMOwogCXN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcgPSAmd3JxdS0+ZW5jb2Rpbmc7CiAJc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOwotICAgIGludCBrZXlJZHgsIGFsZyA9IGV4dC0+YWxnOworCWludCBrZXlJZHgsIGFsZyA9IGV4dC0+YWxnOwogCi0gICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLQlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0JewotICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLSAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKKworCS8qY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCXJldHVybiAtRU5FVERPV047CiAJfQogCi0gICAgaWYgKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkKLQl7Ci0gICAgICAgIGtleUlkeCA9IChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKLSAgICAgICAgLy8gc2V0IEJTU0lEIHdjaWQgZW50cnkgb2YgdGhlIFBhaXItd2lzZSBLZXkgdGFibGUgYXMgbm8tc2VjdXJpdHkgbW9kZQotCSAgICBBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShwQWRhcHRlciwgQlNTMCwgQlNTSURfV0NJRCk7Ci0gICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSAwOworCWlmIChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHsKKwkJa2V5SWR4ID0gKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCQkvKiBzZXQgQlNTSUQgd2NpZCBlbnRyeSBvZiB0aGUgUGFpci13aXNlIEtleSB0YWJsZSBhcyBuby1zZWN1cml0eSBtb2RlICovCisJCUFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBCU1NJRF9XQ0lEKTsKKwkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IDA7CiAJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQkJQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCAwLCAoVUNIQVIpa2V5SWR4KTsKLSAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OlJlbW92ZSBhbGwga2V5cyEoZW5jb2RpbmctPmZsYWdzID0gJXgpXG4iLCBfX2Z1bmNfXywgZW5jb2RpbmctPmZsYWdzKSk7Ci0gICAgfQotCQkJCQllbHNlCi0gICAgewotICAgICAgICAvLyBHZXQgS2V5IEluZGV4IGFuZCBjb252ZXQgdG8gb3VyIG93biBkZWZpbmVkIGtleSBpbmRleAotICAgIAlrZXlJZHggPSAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7Ci0gICAgCWlmKChrZXlJZHggPCAwKSB8fCAoa2V5SWR4ID49IE5SX1dFUF9LRVlTKSkKLSAgICAJCXJldHVybiAtRUlOVkFMOworCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIDAsICh1OClrZXlJZHgpOworCQlOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfY2lwaGVyX2tleSkpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIiVzOjpSZW1vdmUgYWxsIGtleXMhKGVuY29kaW5nLT5mbGFncyA9ICV4KVxuIiwKKwkJCSAgX19mdW5jX18sIGVuY29kaW5nLT5mbGFncykpOworCX0gZWxzZSB7CisJCS8qIEdldCBLZXkgSW5kZXggYW5kIGNvbnZldCB0byBvdXIgb3duIGRlZmluZWQga2V5IGluZGV4ICovCisJCWtleUlkeCA9IChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwkJaWYgKChrZXlJZHggPCAwKSB8fCAoa2V5SWR4ID49IE5SX1dFUF9LRVlTKSkKKwkJCXJldHVybiAtRUlOVkFMOwogCi0gICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKLSAgICAgICAgewotICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBrZXlJZHg7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6RGVmYXVsdEtleUlkID0gJWRcbiIsIF9fZnVuY19fLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOwotICAgICAgICB9CisJCWlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkgeworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBrZXlJZHg7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCIlczo6RGVmYXVsdEtleUlkID0gJWRcbiIsIF9fZnVuY19fLAorCQkJCSAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKwkJfQogCi0gICAgICAgIHN3aXRjaCAoYWxnKSB7Ci0gICAgCQljYXNlIElXX0VOQ09ERV9BTEdfTk9ORToKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19OT05FXG4iLCBfX2Z1bmNfXykpOwotICAgIAkJCWJyZWFrOwotICAgIAkJY2FzZSBJV19FTkNPREVfQUxHX1dFUDoKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19XRVAgLSBleHQtPmtleV9sZW4gPSAlZCwga2V5SWR4ID0gJWRcbiIsIF9fZnVuY19fLCBleHQtPmtleV9sZW4sIGtleUlkeCkpOwotICAgIAkJCWlmIChleHQtPmtleV9sZW4gPT0gTUFYX1dFUF9LRVlfU0laRSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgIAkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBNQVhfV0VQX0tFWV9TSVpFOwotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLQkJCQl9Ci0gICAgICAgIAkJZWxzZSBpZiAoZXh0LT5rZXlfbGVuID09IE1JTl9XRVBfS0VZX1NJWkUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUlOX1dFUF9LRVlfU0laRTsKLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJc3dpdGNoIChhbGcpIHsKKwkJY2FzZSBJV19FTkNPREVfQUxHX05PTkU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCIlczo6SVdfRU5DT0RFX0FMR19OT05FXG4iLCBfX2Z1bmNfXykpOworCQkJYnJlYWs7CisJCWNhc2UgSVdfRU5DT0RFX0FMR19XRVA6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCIlczo6SVdfRU5DT0RFX0FMR19XRVAgLSBleHQtPmtleV9sZW4gPSAlZCwga2V5SWR4ID0gJWRcbiIsCisJCQkJICBfX2Z1bmNfXywgZXh0LT5rZXlfbGVuLCBrZXlJZHgpKTsKKwkJCWlmIChleHQtPmtleV9sZW4gPT0gTUFYX1dFUF9LRVlfU0laRSkgeworCQkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPQorCQkJCSAgICBNQVhfV0VQX0tFWV9TSVpFOworCQkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPQorCQkJCSAgICBDSVBIRVJfV0VQMTI4OworCQkJfSBlbHNlIGlmIChleHQtPmtleV9sZW4gPT0gTUlOX1dFUF9LRVlfU0laRSkgeworCQkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPQorCQkJCSAgICBNSU5fV0VQX0tFWV9TSVpFOworCQkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPQorCQkJCSAgICBDSVBIRVJfV0VQNjQ7CisJCQl9IGVsc2UKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwKKwkJCQkgICAgICAgMTYpOworCQkJTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwKKwkJCQkgICAgICAgZXh0LT5rZXksIGV4dC0+a2V5X2xlbik7CisJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9PQorCQkJICAgIE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZAorCQkJICAgIHx8IHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0KKwkJCSAgICBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkKSB7CisJCQkJLyogU2V0IEdyb3VwIGtleSBtYXRlcmlhbCB0byBBc2ljICovCisJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBrZXlJZHgsCisJCQkJCQkgICAgICBwQWRhcHRlci0+CisJCQkJCQkgICAgICBTaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS4KKwkJCQkJCSAgICAgIENpcGhlckFsZywKKwkJCQkJCSAgICAgIHBBZGFwdGVyLT4KKwkJCQkJCSAgICAgIFNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLgorCQkJCQkJICAgICAgS2V5LCBOVUxMLCBOVUxMKTsKKworCQkJCS8qIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZ3JvdXAga2V5IHRhYmxlICovCisJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwgQlNTMCwKKwkJCQkJCQkgIGtleUlkeCwKKwkJCQkJCQkgIHBBZGFwdGVyLT4KKwkJCQkJCQkgIFNoYXJlZEtleVtCU1MwXQorCQkJCQkJCSAgW2tleUlkeF0uQ2lwaGVyQWxnLAorCQkJCQkJCSAgTlVMTCk7CisKKwkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKworCQkJCS8qIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJICovCisJCQkJcEFkYXB0ZXItPkluZGljYXRlTWVkaWFTdGF0ZSA9CisJCQkJICAgIE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwogCQkJfQotICAgICAgICAJCWVsc2UKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0KLSAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCAgMTYpOwotCQkJICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dC0+a2V5LCBleHQtPmtleV9sZW4pOwotCQkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCB8fAotCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQpCisJCQlicmVhazsKKwkJY2FzZSBJV19FTkNPREVfQUxHX1RLSVA6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCIlczo6SVdfRU5DT0RFX0FMR19US0lQIC0ga2V5SWR4ID0gJWQsIGV4dC0+a2V5X2xlbiA9ICVkXG4iLAorCQkJCSAgX19mdW5jX18sIGtleUlkeCwgZXh0LT5rZXlfbGVuKSk7CisJCQlpZiAoZXh0LT5rZXlfbGVuID09IDMyKSB7CisJCQkJaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKSB7CisJCQkJCWZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsCisJCQkJCQkgICAgICAgQ0lQSEVSX1RLSVAsIEZBTFNFLCBleHQpOworCQkJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PQorCQkJCQkgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgeworCQkJCQkJLypwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7ICovCisJCQkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKwkJCQkJCXBBZGFwdGVyLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPQorCQkJCQkJICAgIE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChleHQtPgorCQkJCQkgICBleHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX0dST1VQX0tFWSkKIAkJCQl7Ci0JCQkJCS8vIFNldCBHcm91cCBrZXkgbWF0ZXJpYWwgdG8gQXNpYwotCQkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIEJTUzAsIGtleUlkeCwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgTlVMTCwgTlVMTCk7CisJCQkJCWZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsCisJCQkJCQkgICAgICAgQ0lQSEVSX1RLSVAsIFRSVUUsIGV4dCk7CiAKLQkJCQkJLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBncm91cCBrZXkgdGFibGUKLQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwgQlNTMCwga2V5SWR4LCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLCBOVUxMKTsKLQorCQkJCQkvKiBzZXQgODAyLjF4IHBvcnQgY29udHJvbCAqLworCQkJCQkvKnBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsgKi8KIAkJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7Ci0KLSAgICAJCQkJLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKLSAgICAJCQkJcEFkYXB0ZXItPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQkJCQlwQWRhcHRlci0+SW5kaWNhdGVNZWRpYVN0YXRlID0KKwkJCQkJICAgIE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwogCQkJCX0KLSAgICAJCQlicmVhazsKLSAgICAgICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19US0lQOgotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19FTkNPREVfQUxHX1RLSVAgLSBrZXlJZHggPSAlZCwgZXh0LT5rZXlfbGVuID0gJWRcbiIsIF9fZnVuY19fLCBrZXlJZHgsIGV4dC0+a2V5X2xlbikpOwotICAgICAgICAgICAgICAgIGlmIChleHQtPmtleV9sZW4gPT0gMzIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9US0lQLCBGQUxTRSwgZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisJCQl9IGVsc2UKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCQljYXNlIElXX0VOQ09ERV9BTEdfQ0NNUDoKKwkJCWlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkgeworCQkJCWZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9BRVMsCisJCQkJCSAgICAgICBGQUxTRSwgZXh0KTsKKwkJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PQorCQkJCSAgICBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorCQkJCQkvKnBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsgKi8KKwkJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisJCQkJcEFkYXB0ZXItPkluZGljYXRlTWVkaWFTdGF0ZSA9CisJCQkJICAgIE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQkJfSBlbHNlIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfR1JPVVBfS0VZKSB7CisJCQkJZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX0FFUywKKwkJCQkJICAgICAgIFRSVUUsIGV4dCk7CisKKwkJCQkvKiBzZXQgODAyLjF4IHBvcnQgY29udHJvbCAqLworCQkJCS8qcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOyAqLworCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworCQkJCXBBZGFwdGVyLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPQorCQkJCSAgICBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX0dST1VQX0tFWSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX1RLSVAsIFRSVUUsIGV4dCk7CisJfQogCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAotICAgICAgICAgICAgCSAgICAgICAgU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19DQ01QOgotICAgICAgICAgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKLQkJewotICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfQUVTLCBGQUxTRSwgZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKLSAgICAgICAgICAgICAgICAgICAgCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfR1JPVVBfS0VZKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX0FFUywgVFJVRSwgZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAotICAgICAgICAJICAgICAgICBTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgCQlkZWZhdWx0OgotICAgIAkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIGludAogcnRfaW9jdGxfZ2l3ZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IGRldi0+bWxfcHJpdjsKLQlQQ0hBUiBwS2V5ID0gTlVMTDsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSBOVUxMOworCWNoYXIgKnBLZXkgPSBOVUxMOwogCXN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcgPSAmd3JxdS0+ZW5jb2Rpbmc7CiAJc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOwogCWludCBpZHgsIG1heF9rZXlfbGVuOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PiBydF9pb2N0bF9naXdlbmNvZGVleHRcbiIpKTsKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWQsIGRldik7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IHJ0X2lvY3RsX2dpd2VuY29kZWV4dFxuIikpOwogCiAJbWF4X2tleV9sZW4gPSBlbmNvZGluZy0+bGVuZ3RoIC0gc2l6ZW9mKCpleHQpOwogCWlmIChtYXhfa2V5X2xlbiA8IDApCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWR4ID0gZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOwotCWlmIChpZHgpCi0JeworCWlmIChpZHgpIHsKIAkJaWYgKGlkeCA8IDEgfHwgaWR4ID4gNCkKIAkJCXJldHVybiAtRUlOVkFMOwogCQlpZHgtLTsKIAogCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAotCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkKLQkJewotCQkJaWYgKGlkeCAhPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQpCi0JCQl7CisJCSAgICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKSB7CisJCQlpZiAoaWR4ICE9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkgewogCQkJCWV4dC0+a2V5X2xlbiA9IDA7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCX0KLQl9Ci0JZWxzZQorCX0gZWxzZQogCQlpZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CiAKIAllbmNvZGluZy0+ZmxhZ3MgPSBpZHggKyAxOwogCW1lbXNldChleHQsIDAsIHNpemVvZigqZXh0KSk7CiAKIAlleHQtPmtleV9sZW4gPSAwOwotCXN3aXRjaChwQWQtPlN0YUNmZy5XZXBTdGF0dXMpIHsKLQkJY2FzZSBOZGlzODAyXzExV0VQRGlzYWJsZWQ6Ci0JCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfTk9ORTsKLQkJCWVuY29kaW5nLT5mbGFncyB8PSBJV19FTkNPREVfRElTQUJMRUQ7Ci0JCQlicmVhazsKLQkJY2FzZSBOZGlzODAyXzExV0VQRW5hYmxlZDoKLQkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19XRVA7Ci0JCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW4gPiBtYXhfa2V5X2xlbikKLQkJCQlyZXR1cm4gLUUyQklHOwotCQkJZWxzZQotCQkJewotCQkJCWV4dC0+a2V5X2xlbiA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuOwotCQkJCXBLZXkgPSAmKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5WzBdKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ6Ci0JCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDoKLQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLQkJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfVEtJUDsKLQkJCWVsc2UKLQkJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfQ0NNUDsKKwlzd2l0Y2ggKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykgeworCWNhc2UgTmRpczgwMl8xMVdFUERpc2FibGVkOgorCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfTk9ORTsKKwkJZW5jb2RpbmctPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwkJYnJlYWs7CisJY2FzZSBOZGlzODAyXzExV0VQRW5hYmxlZDoKKwkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX1dFUDsKKwkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuID4gbWF4X2tleV9sZW4pCisJCQlyZXR1cm4gLUUyQklHOworCQllbHNlIHsKKwkJCWV4dC0+a2V5X2xlbiA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuOworCQkJcEtleSA9IChjaGFyICopJiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlbMF0pOworCQl9CisJCWJyZWFrOworCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDoKKwljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ6CisJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19US0lQOworCQllbHNlCisJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfQ0NNUDsKIAotCQkJaWYgKG1heF9rZXlfbGVuIDwgMzIpCi0JCQkJcmV0dXJuIC1FMkJJRzsKLQkJCWVsc2UKLQkJCXsKLQkJCQlleHQtPmtleV9sZW4gPSAzMjsKLQkJCQlwS2V5ID0gJnBBZC0+U3RhQ2ZnLlBNS1swXTsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChtYXhfa2V5X2xlbiA8IDMyKQorCQkJcmV0dXJuIC1FMkJJRzsKKwkJZWxzZSB7CisJCQlleHQtPmtleV9sZW4gPSAzMjsKKwkJCXBLZXkgPSAoY2hhciAqKSYgcEFkLT5TdGFDZmcuUE1LWzBdOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChleHQtPmtleV9sZW4gJiYgcEtleSkKLQl7CisJaWYgKGV4dC0+a2V5X2xlbiAmJiBwS2V5KSB7CiAJCWVuY29kaW5nLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsKIAkJbWVtY3B5KGV4dC0+a2V5LCBwS2V5LCBleHQtPmtleV9sZW4pOwogCX0KQEAgLTIzMzIsMjIgKzIwOTMsMjUgQEAKIH0KIAogaW50IHJ0X2lvY3RsX3Npd2dlbmllKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlQUlRNUF9BREFQVEVSICAgcEFkID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IE5VTEw7CiAKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWQsIGRldik7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IHJ0X2lvY3RsX3Npd2dlbmllXG4iKSk7CisJcEFkLT5TdGFDZmcuYlJTTl9JRV9Gcm9tV3BhU3VwcGxpY2FudCA9IEZBTFNFOwogCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA+IE1BWF9MRU5fT0ZfUlNOSUUgfHwKIAkgICAgKHdycXUtPmRhdGEubGVuZ3RoICYmIGV4dHJhID09IE5VTEwpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICh3cnF1LT5kYXRhLmxlbmd0aCkKLQl7CisJaWYgKHdycXUtPmRhdGEubGVuZ3RoKSB7CiAJCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9IHdycXUtPmRhdGEubGVuZ3RoOwotCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBleHRyYSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKLQl9Ci0JZWxzZQotCXsKKwkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgZXh0cmEsCisJCQkgICAgICAgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKwkJcEFkLT5TdGFDZmcuYlJTTl9JRV9Gcm9tV3BhU3VwcGxpY2FudCA9IFRSVUU7CisJfSBlbHNlIHsKIAkJcEFkLT5TdGFDZmcuUlNOSUVfTGVuID0gMDsKIAkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgTUFYX0xFTl9PRl9SU05JRSk7CiAJfQpAQCAtMjM1NiwxODIgKzIxMjAsMjEzIEBACiB9CiAKIGludCBydF9pb2N0bF9naXdnZW5pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCVBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gTlVMTDsKKworCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZCwgZGV2KTsKIAogCWlmICgocEFkLT5TdGFDZmcuUlNOSUVfTGVuID09IDApIHx8Ci0JCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkpCi0JeworCSAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpKSB7CiAJCXdycXUtPmRhdGEubGVuZ3RoID0gMDsKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCi0JewotCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA8IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbikKLQkJcmV0dXJuIC1FMkJJRzsKKwlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkgeworCQlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pCisJCQlyZXR1cm4gLUUyQklHOwogCi0Jd3JxdS0+ZGF0YS5sZW5ndGggPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47Ci0JbWVtY3B5KGV4dHJhLCAmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOwotCX0KLQllbHNlCi0JewotCQlVQ0hBUiBSU05JZSA9IElFX1dQQTsKKwkJd3JxdS0+ZGF0YS5sZW5ndGggPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47CisJCW1lbWNweShleHRyYSwgJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKwl9IGVsc2UgeworCQl1OCBSU05JZSA9IElFX1dQQTsKIAotCQlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPCAocEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMikpIC8vIElELCBMZW4KKwkJaWYgKHdycXUtPmRhdGEubGVuZ3RoIDwgKHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDIpKQkvKiBJRCwgTGVuICovCiAJCQlyZXR1cm4gLUUyQklHOwogCQl3cnF1LT5kYXRhLmxlbmd0aCA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDI7CiAKIAkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB8fAotICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpKQorCQkgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpKQogCQkJUlNOSWUgPSBJRV9SU047CiAKIAkJZXh0cmFbMF0gPSAoY2hhcilSU05JZTsKIAkJZXh0cmFbMV0gPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47Ci0JCW1lbWNweShleHRyYSsyLCAmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCQltZW1jcHkoZXh0cmEgKyAyLCAmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLAorCQkgICAgICAgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAogaW50IHJ0X2lvY3RsX3Npd3Bta3NhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKLQkJCSAgIGNoYXIgKmV4dHJhKQorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlQUlRNUF9BREFQVEVSICAgcEFkID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IE5VTEw7CiAJc3RydWN0IGl3X3Bta3NhICpwUG1rc2EgPSAoc3RydWN0IGl3X3Bta3NhICopd3JxdS0+ZGF0YS5wb2ludGVyOwotCUlOVAlDYWNoZWRJZHggPSAwLCBpZHggPSAwOworCWludCBDYWNoZWRJZHggPSAwLCBpZHggPSAwOworCisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkLCBkZXYpOwogCiAJaWYgKHBQbWtzYSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PT4gcnRfaW9jdGxfc2l3cG1rc2FcbiIpKTsKLQlzd2l0Y2gocFBta3NhLT5jbWQpCi0JewotCQljYXNlIElXX1BNS1NBX0ZMVVNIOgotCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUssIHNpemVvZihCU1NJRF9JTkZPKSpQTUtJRF9OTyk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJydF9pb2N0bF9zaXdwbWtzYSAtIElXX1BNS1NBX0ZMVVNIXG4iKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBJV19QTUtTQV9SRU1PVkU6Ci0JCQlmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtOyBDYWNoZWRJZHgrKykKLQkJCXsKLQkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAotCQkgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocFBta3NhLT5ic3NpZC5zYV9kYXRhLCBwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pKQotCQkgICAgICAgIHsKLQkJICAgICAgICAJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRCwgTUFDX0FERFJfTEVOKTsKLQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5QTUtJRCwgMTYpOwotCQkJCQlmb3IgKGlkeCA9IENhY2hlZElkeDsgaWR4IDwgKHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtIC0gMSk7IGlkeCsrKQotCQkJCQl7Ci0JCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4XS5CU1NJRFswXSwgJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeCsxXS5CU1NJRFswXSwgTUFDX0FERFJfTEVOKTsKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHhdLlBNS0lEWzBdLCAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4KzFdLlBNS0lEWzBdLCAxNik7Ci0JCQkJCX0KLQkJCQkJcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW0tLTsKLQkJCSAgICAgICAgYnJlYWs7Ci0JCSAgICAgICAgfQotCSAgICAgICAgfQorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnRfaW9jdGxfc2l3cG1rc2FcbiIpKTsKKwlzd2l0Y2ggKHBQbWtzYS0+Y21kKSB7CisJY2FzZSBJV19QTUtTQV9GTFVTSDoKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUssCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9ic3NpZF9pbmZvKSAqIFBNS0lEX05PKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJydF9pb2N0bF9zaXdwbWtzYSAtIElXX1BNS1NBX0ZMVVNIXG4iKSk7CisJCWJyZWFrOworCWNhc2UgSVdfUE1LU0FfUkVNT1ZFOgorCQlmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtOworCQkgICAgIENhY2hlZElkeCsrKSB7CisJCQkvKiBjb21wYXJlIHRoZSBCU1NJRCAqLworCQkJaWYgKE5kaXNFcXVhbE1lbW9yeQorCQkJICAgIChwUG1rc2EtPmJzc2lkLnNhX2RhdGEsCisJCQkgICAgIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsCisJCQkgICAgIE1BQ19BRERSX0xFTikpIHsKKwkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLgorCQkJCQkgICAgICAgQlNTSUQsIE1BQ19BRERSX0xFTik7CisJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS4KKwkJCQkJICAgICAgIFBNS0lELCAxNik7CisJCQkJZm9yIChpZHggPSBDYWNoZWRJZHg7CisJCQkJICAgICBpZHggPCAocEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW0gLSAxKTsKKwkJCQkgICAgIGlkeCsrKSB7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy4KKwkJCQkJCSAgICAgICBTYXZlZFBNS1tpZHhdLkJTU0lEWzBdLAorCQkJCQkJICAgICAgICZwQWQtPlN0YUNmZy4KKwkJCQkJCSAgICAgICBTYXZlZFBNS1tpZHggKworCQkJCQkJCQkxXS5CU1NJRFswXSwKKwkJCQkJCSAgICAgICBNQUNfQUREUl9MRU4pOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuCisJCQkJCQkgICAgICAgU2F2ZWRQTUtbaWR4XS5QTUtJRFswXSwKKwkJCQkJCSAgICAgICAmcEFkLT5TdGFDZmcuCisJCQkJCQkgICAgICAgU2F2ZWRQTUtbaWR4ICsKKwkJCQkJCQkJMV0uUE1LSURbMF0sCisJCQkJCQkgICAgICAgMTYpOworCQkJCX0KKwkJCQlwQWQtPlN0YUNmZy5TYXZlZFBNS051bS0tOworCQkJCWJyZWFrOworCQkJfQorCQl9CiAKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfUkVNT1ZFXG4iKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBJV19QTUtTQV9BREQ6Ci0JCQlmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtOyBDYWNoZWRJZHgrKykKLQkJCXsKLQkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAotCQkgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocFBta3NhLT5ic3NpZC5zYV9kYXRhLCBwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pKQotCQkJICAgICAgICBicmVhazsKLQkgICAgICAgIH0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJydF9pb2N0bF9zaXdwbWtzYSAtIElXX1BNS1NBX1JFTU9WRVxuIikpOworCQlicmVhazsKKwljYXNlIElXX1BNS1NBX0FERDoKKwkJZm9yIChDYWNoZWRJZHggPSAwOyBDYWNoZWRJZHggPCBwQWQtPlN0YUNmZy5TYXZlZFBNS051bTsKKwkJICAgICBDYWNoZWRJZHgrKykgeworCQkJLyogY29tcGFyZSB0aGUgQlNTSUQgKi8KKwkJCWlmIChOZGlzRXF1YWxNZW1vcnkKKwkJCSAgICAocFBta3NhLT5ic3NpZC5zYV9kYXRhLAorCQkJICAgICBwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELAorCQkJICAgICBNQUNfQUREUl9MRU4pKQorCQkJCWJyZWFrOworCQl9CiAKLQkgICAgICAgIC8vIEZvdW5kLCByZXBsYWNlIGl0Ci0JICAgICAgICBpZiAoQ2FjaGVkSWR4IDwgUE1LSURfTk8pCi0JICAgICAgICB7Ci0JCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlVwZGF0ZSBQTUtJRCwgaWR4ID0gJWRcbiIsIENhY2hlZElkeCkpOwotCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lEWzBdLCBwUG1rc2EtPmJzc2lkLnNhX2RhdGEsIE1BQ19BRERSX0xFTik7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uUE1LSURbMF0sIHBQbWtzYS0+cG1raWQsIDE2KTsKLQkJICAgICAgICBwQWQtPlN0YUNmZy5TYXZlZFBNS051bSsrOwotCSAgICAgICAgfQotCSAgICAgICAgLy8gTm90IGZvdW5kLCByZXBsYWNlIHRoZSBsYXN0IG9uZQotCSAgICAgICAgZWxzZQotCSAgICAgICAgewotCQkgICAgICAgIC8vIFJhbmRvbWx5IHJlcGxhY2Ugb25lCi0JCSAgICAgICAgQ2FjaGVkSWR4ID0gKHBQbWtzYS0+YnNzaWQuc2FfZGF0YVs1XSAlIFBNS0lEX05PKTsKLQkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIFBNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7Ci0JCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSURbMF0sIHBQbWtzYS0+YnNzaWQuc2FfZGF0YSwgTUFDX0FERFJfTEVOKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5QTUtJRFswXSwgcFBta3NhLT5wbWtpZCwgMTYpOwotCSAgICAgICAgfQorCQkvKiBGb3VuZCwgcmVwbGFjZSBpdCAqLworCQlpZiAoQ2FjaGVkSWR4IDwgUE1LSURfTk8pIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwKKwkJCQkgKCJVcGRhdGUgUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLgorCQkJCSAgICAgICBCU1NJRFswXSwgcFBta3NhLT5ic3NpZC5zYV9kYXRhLAorCQkJCSAgICAgICBNQUNfQUREUl9MRU4pOworCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uCisJCQkJICAgICAgIFBNS0lEWzBdLCBwUG1rc2EtPnBta2lkLCAxNik7CisJCQlwQWQtPlN0YUNmZy5TYXZlZFBNS051bSsrOworCQl9CisJCS8qIE5vdCBmb3VuZCwgcmVwbGFjZSB0aGUgbGFzdCBvbmUgKi8KKwkJZWxzZSB7CisJCQkvKiBSYW5kb21seSByZXBsYWNlIG9uZSAqLworCQkJQ2FjaGVkSWR4ID0gKHBQbWtzYS0+YnNzaWQuc2FfZGF0YVs1XSAlIFBNS0lEX05PKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwKKwkJCQkgKCJVcGRhdGUgUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLgorCQkJCSAgICAgICBCU1NJRFswXSwgcFBta3NhLT5ic3NpZC5zYV9kYXRhLAorCQkJCSAgICAgICBNQUNfQUREUl9MRU4pOworCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uCisJCQkJICAgICAgIFBNS0lEWzBdLCBwUG1rc2EtPnBta2lkLCAxNik7CisJCX0KIAotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgicnRfaW9jdGxfc2l3cG1rc2EgLSBJV19QTUtTQV9BRERcbiIpKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgicnRfaW9jdGxfc2l3cG1rc2EgLSBVbmtub3cgQ29tbWFuZCEhXG4iKSk7Ci0JCQlicmVhazsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJydF9pb2N0bF9zaXdwbWtzYSAtIElXX1BNS1NBX0FERFxuIikpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoInJ0X2lvY3RsX3Npd3Bta3NhIC0gVW5rbm93biBDb21tYW5kIVxuIikpOworCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAogaW50IHJ0X2lvY3RsX3Npd3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKKwkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotICAgIFBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7Ci0gICAgVUlOVDMyICAgICAgICAgIHJhdGUgPSB3cnF1LT5iaXRyYXRlLnZhbHVlLCBmaXhlZCA9IHdycXUtPmJpdHJhdGUuZml4ZWQ7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gTlVMTDsKKwl1MzIgcmF0ZSA9IHdycXUtPmJpdHJhdGUudmFsdWUsIGZpeGVkID0gd3JxdS0+Yml0cmF0ZS5maXhlZDsKIAotICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0JaWYoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLQl7Ci0gIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfc2l3cmF0ZTo6TmV0d29yayBpcyBkb3duIVxuIikpOwotICAgIAlyZXR1cm4gLUVORVRET1dOOworCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZCwgZGV2KTsKKworCS8qY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJydF9pb2N0bF9zaXdyYXRlOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCXJldHVybiAtRU5FVERPV047CiAJfQogCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfc2l3cmF0ZTo6KHJhdGUgPSAlZCwgZml4ZWQgPSAlZClcbiIsIHJhdGUsIGZpeGVkKSk7Ci0gICAgLyogcmF0ZSA9IC0xID0+IGF1dG8gcmF0ZQotICAgICAgIHJhdGUgPSBYLCBmaXhlZCA9IDEgPT4gKGZpeGVkIHJhdGUgWCkKLSAgICAqLwotICAgIGlmIChyYXRlID09IC0xKQotICAgIHsKLQkJLy9BdXRvIFJhdGUKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgicnRfaW9jdGxfc2l3cmF0ZTo6KHJhdGUgPSAlZCwgZml4ZWQgPSAlZClcbiIsIHJhdGUsIGZpeGVkKSk7CisJLyogcmF0ZSA9IC0xID0+IGF1dG8gcmF0ZQorCSAgIHJhdGUgPSBYLCBmaXhlZCA9IDEgPT4gKGZpeGVkIHJhdGUgWCkKKwkgKi8KKwlpZiAocmF0ZSA9PSAtMSkgeworCQkvKkF1dG8gUmF0ZSAqLwogCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOwogCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CiAJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8PSBQSFlfMTFHKSB8fAotCQkgICAgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkKKwkJICAgIChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFIDw9CisJCSAgICAgTU9ERV9PRkRNKSkKIAkJCVJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCAtMSk7CiAKIAkJU2V0Q29tbW9uSFQocEFkKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKGZpeGVkKQotICAgICAgICB7Ci0gICAgICAgIAlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOwotICAgICAgICAgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDw9IFBIWV8xMUcpIHx8Ci0gICAgICAgICAgICAgICAgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkKLSAgICAgICAgICAgICAgICBSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgcmF0ZSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKLSAgICAgICAgICAgICAgICBTZXRDb21tb25IVChwQWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfc2l3cmF0ZTo6KEh0TWNzPSVkKVxuIixwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUykpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVE9ETzogcmF0ZSA9IFgsIGZpeGVkID0gMCA9PiAocmF0ZXMgPD0gWCkKLSAgICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKLSAgICAgICAgfQotICAgIH0KKwl9IGVsc2UgeworCQlpZiAoZml4ZWQpIHsKKwkJCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7CisJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPD0gUEhZXzExRykgfHwKKwkJCSAgICAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuCisJCQkgICAgIE1PREUgPD0gTU9ERV9PRkRNKSkKKwkJCQlSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgcmF0ZSk7CisJCQllbHNlIHsKKwkJCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9CisJCQkJICAgIE1DU19BVVRPOworCQkJCVNldENvbW1vbkhUKHBBZCk7CisJCQl9CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJydF9pb2N0bF9zaXdyYXRlOjooSHRNY3M9JWQpXG4iLAorCQkJCSAgcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC4KKwkJCQkgIE1DUykpOworCQl9IGVsc2UgeworCQkJLyogVE9ETzogcmF0ZSA9IFgsIGZpeGVkID0gMCA9PiAocmF0ZXMgPD0gWCkgKi8KKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJfQorCX0KIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBpbnQgcnRfaW9jdGxfZ2l3cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCisJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLSAgICBQUlRNUF9BREFQVEVSICAgcEFkID0gZGV2LT5tbF9wcml2OwotICAgIGludCByYXRlX2luZGV4ID0gMCwgcmF0ZV9jb3VudCA9IDA7Ci0gICAgSFRUUkFOU01JVF9TRVRUSU5HIGh0X3NldHRpbmc7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gTlVMTDsKKwlpbnQgcmF0ZV9pbmRleCA9IDAsIHJhdGVfY291bnQgPSAwOworCUhUVFJBTlNNSVRfU0VUVElORyBodF9zZXR0aW5nOworLyogUmVtb3ZlIHRvIGdsb2JhbCB2YXJpYWJsZQogICAgIF9fczMyIHJhbGlua3JhdGVbXSA9CiAJezIsICA0LCAgIDExLCAgMjIsIC8vIENDSwogCTEyLCAxOCwgICAyNCwgIDM2LCA0OCwgNzIsIDk2LCAxMDgsIC8vIE9GRE0KQEAgLTI1NDMsMzI5ICsyMzM4LDI5NSBAQAogCTQzLCA4NywgIDEzMCwgMTczLCAyNjAsIDMxNywgMzkwLCA0MzMsCQkJCQkJCQkJCSAgLy8gMjBNSHosIDQwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKIAkzMCwgNjAsICAgOTAsIDEyMCwgMTgwLCAyNDAsIDI3MCwgMzAwLCA2MCwgMTIwLCAxODAsIDI0MCwgMzYwLCA0ODAsIDU0MCwgNjAwLCAvLyA0ME1IeiwgNDAwbnMgR0ksIE1DUzogMCB+IDE1CiAJOTAsIDE4MCwgMjcwLCAzNjAsIDU0MCwgNzIwLCA4MTAsIDkwMH07CQkJCQkJCQkJCSAgLy8gNDBNSHosIDQwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKKyovCisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkLCBkZXYpOwogCi0gICAgcmF0ZV9jb3VudCA9IHNpemVvZihyYWxpbmtyYXRlKS9zaXplb2YoX19zMzIpOwotICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0JaWYoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLQl7Ci0gIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotICAgIAlyZXR1cm4gLUVORVRET1dOOworCXJhdGVfY291bnQgPSBzaXplb2YocmFsaW5rcmF0ZSkgLyBzaXplb2YoX19zMzIpOworCS8qY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQlyZXR1cm4gLUVORVRET1dOOwogCX0KIAotICAgIGlmICgocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gRkFMU0UpICYmCi0gICAgICAgIChJTkZSQV9PTihwQWQpKSAmJgotICAgICAgICAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPD0gUEhZXzExRykgfHwgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkpCi0gICAgICAgIGh0X3NldHRpbmcud29yZCA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS53b3JkOwotICAgIGVsc2UKLSAgICAgICAgaHRfc2V0dGluZy53b3JkID0gcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZDsKKwlpZiAoKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IEZBTFNFKSAmJgorCSAgICAoSU5GUkFfT04ocEFkKSkgJiYKKwkgICAgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDw9IFBIWV8xMUcpCisJICAgICB8fCAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PQorCQkgTU9ERV9PRkRNKSkpCisJCWh0X3NldHRpbmcud29yZCA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS53b3JkOworCWVsc2UKKwkJaHRfc2V0dGluZy53b3JkID0KKwkJICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQ7CiAKLSAgICBpZiAoaHRfc2V0dGluZy5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCi0gICAgewotICAgIAlyYXRlX2luZGV4ID0gMTIgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuQlcgKjI0KSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5TaG9ydEdJICo0OCkgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuTUNTKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIGlmIChodF9zZXR0aW5nLmZpZWxkLk1PREUgPT0gTU9ERV9PRkRNKQotICAgIAlyYXRlX2luZGV4ID0gKFVDSEFSKShodF9zZXR0aW5nLmZpZWxkLk1DUykgKyA0OwotICAgIGVsc2UgaWYgKGh0X3NldHRpbmcuZmllbGQuTU9ERSA9PSBNT0RFX0NDSykKLSAgICAJcmF0ZV9pbmRleCA9IChVQ0hBUikoaHRfc2V0dGluZy5maWVsZC5NQ1MpOworCWlmIChodF9zZXR0aW5nLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkgeworLyogICAgICByYXRlX2luZGV4ID0gMTIgKyAoKHU4KWh0X3NldHRpbmcuZmllbGQuQlcgKjE2KSArICgodTgpaHRfc2V0dGluZy5maWVsZC5TaG9ydEdJICozMikgKyAoKHU4KWh0X3NldHRpbmcuZmllbGQuTUNTKTsgKi8KKwkJcmF0ZV9pbmRleCA9CisJCSAgICAxMiArICgodTgpaHRfc2V0dGluZy5maWVsZC5CVyAqIDI0KSArCisJCSAgICAoKHU4KWh0X3NldHRpbmcuZmllbGQuU2hvcnRHSSAqIDQ4KSArCisJCSAgICAoKHU4KWh0X3NldHRpbmcuZmllbGQuTUNTKTsKKwl9IGVsc2UgaWYgKGh0X3NldHRpbmcuZmllbGQuTU9ERSA9PSBNT0RFX09GRE0pCisJCXJhdGVfaW5kZXggPSAodTgpKGh0X3NldHRpbmcuZmllbGQuTUNTKSArIDQ7CisJZWxzZSBpZiAoaHRfc2V0dGluZy5maWVsZC5NT0RFID09IE1PREVfQ0NLKQorCQlyYXRlX2luZGV4ID0gKHU4KShodF9zZXR0aW5nLmZpZWxkLk1DUyk7CiAKLSAgICBpZiAocmF0ZV9pbmRleCA8IDApCi0gICAgICAgIHJhdGVfaW5kZXggPSAwOworCWlmIChyYXRlX2luZGV4IDwgMCkKKwkJcmF0ZV9pbmRleCA9IDA7CiAKLSAgICBpZiAocmF0ZV9pbmRleCA+IHJhdGVfY291bnQpCi0gICAgICAgIHJhdGVfaW5kZXggPSByYXRlX2NvdW50OworCWlmIChyYXRlX2luZGV4ID4gcmF0ZV9jb3VudCkKKwkJcmF0ZV9pbmRleCA9IHJhdGVfY291bnQ7CiAKLSAgICB3cnF1LT5iaXRyYXRlLnZhbHVlID0gcmFsaW5rcmF0ZVtyYXRlX2luZGV4XSAqIDUwMDAwMDsKLSAgICB3cnF1LT5iaXRyYXRlLmRpc2FibGVkID0gMDsKKwl3cnF1LT5iaXRyYXRlLnZhbHVlID0gcmFsaW5rcmF0ZVtyYXRlX2luZGV4XSAqIDUwMDAwMDsKKwl3cnF1LT5iaXRyYXRlLmRpc2FibGVkID0gMDsKIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3QgaXdfaGFuZGxlciBydF9oYW5kbGVyW10gPQotewotCShpd19oYW5kbGVyKSBOVUxMLAkJCSAgICAgICAgICAgIC8qIFNJT0NTSVdDT01NSVQgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bmFtZSwJCQkvKiBTSU9DR0lXTkFNRSAgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkJICAgICAgICAgICAgLyogU0lPQ1NJV05XSUQgICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJCSAgICAgICAgICAgIC8qIFNJT0NHSVdOV0lEICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZnJlcSwJCSAgICAvKiBTSU9DU0lXRlJFUSAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2ZyZXEsCQkgICAgLyogU0lPQ0dJV0ZSRVEgICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdtb2RlLAkJICAgIC8qIFNJT0NTSVdNT0RFICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bW9kZSwJCSAgICAvKiBTSU9DR0lXTU9ERSAgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NFTlMgICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdTRU5TICAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCAvKiBub3QgdXNlZCAqLywJCS8qIFNJT0NTSVdSQU5HRSAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cmFuZ2UsCQkgICAgLyogU0lPQ0dJV1JBTkdFICAqLwotCShpd19oYW5kbGVyKSBOVUxMIC8qIG5vdCB1c2VkICovLAkJLyogU0lPQ1NJV1BSSVYgICAqLwotCShpd19oYW5kbGVyKSBOVUxMIC8qIGtlcm5lbCBjb2RlICovLCAgICAvKiBTSU9DR0lXUFJJViAgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8sCQkvKiBTSU9DU0lXU1RBVFMgICovCi0JKGl3X2hhbmRsZXIpIHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMgLyoga2VybmVsIGNvZGUgKi8sICAgIC8qIFNJT0NHSVdTVEFUUyAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU1BZICAgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NQWSAgICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NTSVdUSFJTUFkgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DR0lXVEhSU1BZICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2FwLCAgICAgICAgICAgIC8qIFNJT0NTSVdBUCAgICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3YXAsCQkgICAgLyogU0lPQ0dJV0FQICAgICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdtbG1lLAkgICAgICAgIC8qIFNJT0NTSVdNTE1FICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfaXdhcGxpc3QsCQkgICAgLyogU0lPQ0dJV0FQTElTVCAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdzY2FuLAkJICAgIC8qIFNJT0NTSVdTQ0FOICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3c2NhbiwJCSAgICAvKiBTSU9DR0lXU0NBTiAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2Vzc2lkLAkJICAgIC8qIFNJT0NTSVdFU1NJRCAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZXNzaWQsCQkgICAgLyogU0lPQ0dJV0VTU0lEICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXduaWNrbiwJCSAgICAvKiBTSU9DU0lXTklDS04gICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd25pY2tuLAkJICAgIC8qIFNJT0NHSVdOSUNLTiAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiAtLSBob2xlIC0tICAgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogLS0gaG9sZSAtLSAgICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdyYXRlLCAgICAgICAgICAvKiBTSU9DU0lXUkFURSAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3JhdGUsICAgICAgICAgIC8qIFNJT0NHSVdSQVRFICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3cnRzLAkJICAgIC8qIFNJT0NTSVdSVFMgICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cnRzLAkJICAgIC8qIFNJT0NHSVdSVFMgICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZnJhZywJCSAgICAvKiBTSU9DU0lXRlJBRyAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2ZyYWcsCQkgICAgLyogU0lPQ0dJV0ZSQUcgICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdUWFBPVyAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXVFhQT1cgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1JFVFJZICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdSRVRSWSAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZW5jb2RlLAkJLyogU0lPQ1NJV0VOQ09ERSAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdlbmNvZGUsCQkvKiBTSU9DR0lXRU5DT0RFICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1BPV0VSICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdQT1dFUiAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCQkJCQkvKiAtLSBob2xlIC0tICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkJCQkJLyogLS0gaG9sZSAtLSAqLwotICAgIChpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdnZW5pZSwgICAgICAgICAvKiBTSU9DU0lXR0VOSUUgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2dlbmllLCAgICAgICAgIC8qIFNJT0NHSVdHRU5JRSAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3YXV0aCwJCSAgICAvKiBTSU9DU0lXQVVUSCAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2F1dGgsCQkgICAgLyogU0lPQ0dJV0FVVEggICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdlbmNvZGVleHQsCSAgICAvKiBTSU9DU0lXRU5DT0RFRVhUICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2VuY29kZWV4dCwJCS8qIFNJT0NHSVdFTkNPREVFWFQgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3cG1rc2EsICAgICAgICAgLyogU0lPQ1NJV1BNS1NBICAqLworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgcnRfaGFuZGxlcltdID0geworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DU0lXQ09NTUlUICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd25hbWUsCS8qIFNJT0NHSVdOQU1FICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ1NJV05XSUQgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DR0lXTldJRCAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2ZyZXEsCS8qIFNJT0NTSVdGUkVRICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZnJlcSwJLyogU0lPQ0dJV0ZSRVEgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdtb2RlLAkvKiBTSU9DU0lXTU9ERSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd21vZGUsCS8qIFNJT0NHSVdNT0RFICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ1NJV1NFTlMgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DR0lXU0VOUyAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8gLAkvKiBTSU9DU0lXUkFOR0UgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3JhbmdlLAkvKiBTSU9DR0lXUkFOR0UgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8gLAkvKiBTSU9DU0lXUFJJViAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyoga2VybmVsIGNvZGUgKi8gLAkvKiBTSU9DR0lXUFJJViAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8gLAkvKiBTSU9DU0lXU1RBVFMgICovCisJKGl3X2hhbmRsZXIpIHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMgLyoga2VybmVsIGNvZGUgKi8gLAkvKiBTSU9DR0lXU1RBVFMgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NTSVdTUFkgICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ0dJV1NQWSAgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DU0lXVEhSU1BZICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NHSVdUSFJTUFkgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3YXAsCS8qIFNJT0NTSVdBUCAgICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3YXAsCS8qIFNJT0NHSVdBUCAgICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3bWxtZSwJLyogU0lPQ1NJV01MTUUgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9pd2FwbGlzdCwJLyogU0lPQ0dJV0FQTElTVCAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdzY2FuLAkvKiBTSU9DU0lXU0NBTiAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3NjYW4sCS8qIFNJT0NHSVdTQ0FOICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZXNzaWQsCS8qIFNJT0NTSVdFU1NJRCAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZXNzaWQsCS8qIFNJT0NHSVdFU1NJRCAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3bmlja24sCS8qIFNJT0NTSVdOSUNLTiAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bmlja24sCS8qIFNJT0NHSVdOSUNLTiAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogLS0gaG9sZSAtLSAgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiAtLSBob2xlIC0tICAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3JhdGUsCS8qIFNJT0NTSVdSQVRFICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cmF0ZSwJLyogU0lPQ0dJV1JBVEUgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdydHMsCS8qIFNJT0NTSVdSVFMgICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cnRzLAkvKiBTSU9DR0lXUlRTICAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2ZyYWcsCS8qIFNJT0NTSVdGUkFHICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZnJhZywJLyogU0lPQ0dJV0ZSQUcgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DU0lXVFhQT1cgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NHSVdUWFBPVyAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ1NJV1JFVFJZICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DR0lXUkVUUlkgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2VuY29kZSwJLyogU0lPQ1NJV0VOQ09ERSAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdlbmNvZGUsCS8qIFNJT0NHSVdFTkNPREUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ1NJV1BPV0VSICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DR0lXUE9XRVIgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIC0tIGhvbGUgLS0gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdnZW5pZSwJLyogU0lPQ1NJV0dFTklFICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdnZW5pZSwJLyogU0lPQ0dJV0dFTklFICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdhdXRoLAkvKiBTSU9DU0lXQVVUSCAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2F1dGgsCS8qIFNJT0NHSVdBVVRIICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZW5jb2RlZXh0LAkvKiBTSU9DU0lXRU5DT0RFRVhUICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2VuY29kZWV4dCwJLyogU0lPQ0dJV0VOQ09ERUVYVCAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdwbWtzYSwJLyogU0lPQ1NJV1BNS1NBICAqLwogfTsKIAotc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgcnRfcHJpdl9oYW5kbGVyc1tdID0gewotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAxICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3NldHBhcmFtLCAvKiArIDB4MDIgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAzICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNCAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDUgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA2ICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNyAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDggKi8KLQkoaXdfaGFuZGxlcikgcnRfcHJpdmF0ZV9nZXRfc3RhdGlzdGljcywgLyogKyAweDA5ICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwQSAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEIgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBDICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwRCAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEUgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBGICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxMCAqLwotCShpd19oYW5kbGVyKSBydF9wcml2YXRlX3Nob3csIC8qICsgMHgxMSAqLwotICAgIChpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTIgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDEzICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxNSAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTcgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDE4ICovCi19OwotCi1jb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcnQyOHh4X2l3X2hhbmRsZXJfZGVmID0KLXsKLSNkZWZpbmUJTihhKQkoc2l6ZW9mIChhKSAvIHNpemVvZiAoYVswXSkpCi0JLnN0YW5kYXJkCT0gKGl3X2hhbmRsZXIgKikgcnRfaGFuZGxlciwKLQkubnVtX3N0YW5kYXJkCT0gc2l6ZW9mKHJ0X2hhbmRsZXIpIC8gc2l6ZW9mKGl3X2hhbmRsZXIpLAotCS5wcml2YXRlCT0gKGl3X2hhbmRsZXIgKikgcnRfcHJpdl9oYW5kbGVycywKLQkubnVtX3ByaXZhdGUJCT0gTihydF9wcml2X2hhbmRsZXJzKSwKLQkucHJpdmF0ZV9hcmdzCT0gKHN0cnVjdCBpd19wcml2X2FyZ3MgKikgcHJpdnRhYiwKLQkubnVtX3ByaXZhdGVfYXJncwk9IE4ocHJpdnRhYiksCitjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcnQyOHh4X2l3X2hhbmRsZXJfZGVmID0geworCS5zdGFuZGFyZCA9IChpd19oYW5kbGVyICopIHJ0X2hhbmRsZXIsCisJLm51bV9zdGFuZGFyZCA9IHNpemVvZihydF9oYW5kbGVyKSAvIHNpemVvZihpd19oYW5kbGVyKSwKICNpZiBJV19IQU5ETEVSX1ZFUlNJT04gPj0gNwotICAgIC5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzLAorCS5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzLAogI2VuZGlmCiB9OwogCi1JTlQgcnQyOHh4X3N0YV9pb2N0bCgKLQlJTglzdHJ1Y3QgbmV0X2RldmljZQkqbmV0X2RldiwKLQlJTglPVVQJc3RydWN0IGlmcmVxCSpycSwKLQlJTglJTlQJCQkJCWNtZCkKK2ludCBydDI4eHhfc3RhX2lvY3RsKElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAorCQkgICAgIElOIE9VVCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQogewotCVJUTVBfQURBUFRFUiAqcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKLQlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKLQlzdHJ1Y3QgaXdyZXEgICAgICAgICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOwotCUJPT0xFQU4JCQkJU3RhdGVNYWNoaW5lVG91Y2hlZCA9IEZBTFNFOwotCUlOVAkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IE5VTEw7CisJc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopcnE7CisJQk9PTEVBTiBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7CisJaW50IFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAKLSAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0gICAgewotICAgICAgICB7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0JCSAgICByZXR1cm4gLUVORVRET1dOOwotICAgICAgICB9Ci0gICAgfQorCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZCwgbmV0X2Rldik7CiAKLQl7CS8vIGRldGVybWluZSB0aGlzIGlvY3RsIGNvbW1hbmQgaXMgY29tbWluZyBmcm9tIHdoaWNoIGludGVyZmFjZS4KKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCS8qY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpIHsKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQkJcmV0dXJuIC1FTkVURE9XTjsKKwkJfQorCX0KKworCXsJCQkvKiBkZXRlcm1pbmUgdGhpcyBpb2N0bCBjb21tYW5kIGlzIGNvbW1pbmcgZnJvbSB3aGljaCBpbnRlcmZhY2UuICovCiAJCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKIAkJcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKIAl9CiAKLQlzd2l0Y2goY21kKQotCXsKLSAgICAgICAgY2FzZSBTSU9DR0lGSFdBRERSOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU9DVEw6OlNJT0NHSUZIV0FERFJcbiIpKTsKLQkJCW1lbWNweSh3cnEtPnUubmFtZSwgcEFkLT5DdXJyZW50QWRkcmVzcywgRVRIX0FMRU4pOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0lPQ0dJV05BTUU6Ci0gICAgICAgIHsKLSAgICAgICAgCWNoYXIgKm5hbWU9JndycS0+dS5uYW1lWzBdOwotICAgICAgICAJcnRfaW9jdGxfZ2l3bmFtZShuZXRfZGV2LCBOVUxMLCBuYW1lLCBOVUxMKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ0dJRkhXQUREUjoKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU9DVEw6OlNJT0NHSUZIV0FERFJcbiIpKTsKKwkJbWVtY3B5KHdycS0+dS5uYW1lLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFVEhfQUxFTik7CisJCWJyZWFrOworCWNhc2UgU0lPQ0dJV05BTUU6CisJCXsKKwkJCWNoYXIgKm5hbWUgPSAmd3JxLT51Lm5hbWVbMF07CisJCQlydF9pb2N0bF9naXduYW1lKG5ldF9kZXYsIE5VTEwsIG5hbWUsIE5VTEwpOwogCQkJYnJlYWs7CiAJCX0KLQkJY2FzZSBTSU9DR0lXRVNTSUQ6ICAvL0dldCBFU1NJRAotICAgICAgICB7Ci0gICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmVzc2lkPSZ3cnEtPnUuZXNzaWQ7Ci0gICAgICAgIAlydF9pb2N0bF9naXdlc3NpZChuZXRfZGV2LCBOVUxMLCBlc3NpZCwgZXNzaWQtPnBvaW50ZXIpOworCWNhc2UgU0lPQ0dJV0VTU0lEOgkvKkdldCBFU1NJRCAqLworCQl7CisJCQlzdHJ1Y3QgaXdfcG9pbnQgKmVzc2lkID0gJndycS0+dS5lc3NpZDsKKwkJCXJ0X2lvY3RsX2dpd2Vzc2lkKG5ldF9kZXYsIE5VTEwsIGVzc2lkLCBlc3NpZC0+cG9pbnRlcik7CiAJCQlicmVhazsKIAkJfQotCQljYXNlIFNJT0NTSVdFU1NJRDogIC8vU2V0IEVTU0lECi0gICAgICAgIHsKLSAgICAgICAgCXN0cnVjdCBpd19wb2ludAkqZXNzaWQ9JndycS0+dS5lc3NpZDsKLSAgICAgICAgCXJ0X2lvY3RsX3Npd2Vzc2lkKG5ldF9kZXYsIE5VTEwsIGVzc2lkLCBlc3NpZC0+cG9pbnRlcik7CisJY2FzZSBTSU9DU0lXRVNTSUQ6CS8qU2V0IEVTU0lEICovCisJCXsKKwkJCXN0cnVjdCBpd19wb2ludCAqZXNzaWQgPSAmd3JxLT51LmVzc2lkOworCQkJcnRfaW9jdGxfc2l3ZXNzaWQobmV0X2RldiwgTlVMTCwgZXNzaWQsIGVzc2lkLT5wb2ludGVyKTsKIAkJCWJyZWFrOwogCQl9Ci0JCWNhc2UgU0lPQ1NJV05XSUQ6ICAgLy8gc2V0IG5ldHdvcmsgaWQgKHRoZSBjZWxsKQotCQljYXNlIFNJT0NHSVdOV0lEOiAgIC8vIGdldCBuZXR3b3JrIGlkCi0JCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKLQkJCWJyZWFrOwotCQljYXNlIFNJT0NTSVdGUkVROiAgIC8vc2V0IGNoYW5uZWwvZnJlcXVlbmN5IChIeikKLSAgICAgICAgewotICAgICAgICAJc3RydWN0IGl3X2ZyZXEgKmZyZXE9JndycS0+dS5mcmVxOwotICAgICAgICAJcnRfaW9jdGxfc2l3ZnJlcShuZXRfZGV2LCBOVUxMLCBmcmVxLCBOVUxMKTsKKwljYXNlIFNJT0NTSVdOV0lEOgkvKiBzZXQgbmV0d29yayBpZCAodGhlIGNlbGwpICovCisJY2FzZSBTSU9DR0lXTldJRDoJLyogZ2V0IG5ldHdvcmsgaWQgKi8KKwkJU3RhdHVzID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCWNhc2UgU0lPQ1NJV0ZSRVE6CS8qc2V0IGNoYW5uZWwvZnJlcXVlbmN5IChIeikgKi8KKwkJeworCQkJc3RydWN0IGl3X2ZyZXEgKmZyZXEgPSAmd3JxLT51LmZyZXE7CisJCQlydF9pb2N0bF9zaXdmcmVxKG5ldF9kZXYsIE5VTEwsIGZyZXEsIE5VTEwpOwogCQkJYnJlYWs7CiAJCX0KLQkJY2FzZSBTSU9DR0lXRlJFUTogICAvLyBnZXQgY2hhbm5lbC9mcmVxdWVuY3kgKEh6KQotICAgICAgICB7Ci0gICAgICAgIAlzdHJ1Y3QgaXdfZnJlcSAqZnJlcT0md3JxLT51LmZyZXE7Ci0gICAgICAgIAlydF9pb2N0bF9naXdmcmVxKG5ldF9kZXYsIE5VTEwsIGZyZXEsIE5VTEwpOworCWNhc2UgU0lPQ0dJV0ZSRVE6CS8qIGdldCBjaGFubmVsL2ZyZXF1ZW5jeSAoSHopICovCisJCXsKKwkJCXN0cnVjdCBpd19mcmVxICpmcmVxID0gJndycS0+dS5mcmVxOworCQkJcnRfaW9jdGxfZ2l3ZnJlcShuZXRfZGV2LCBOVUxMLCBmcmVxLCBOVUxMKTsKIAkJCWJyZWFrOwogCQl9Ci0JCWNhc2UgU0lPQ1NJV05JQ0tOOiAvL3NldCBub2RlIG5hbWUvbmlja25hbWUKLSAgICAgICAgewotICAgICAgICAJc3RydWN0IGl3X3BvaW50ICpkYXRhPSZ3cnEtPnUuZGF0YTsKLSAgICAgICAgCXJ0X2lvY3RsX3Npd25pY2tuKG5ldF9kZXYsIE5VTEwsIGRhdGEsIE5VTEwpOworCWNhc2UgU0lPQ1NJV05JQ0tOOgkvKnNldCBub2RlIG5hbWUvbmlja25hbWUgKi8KKwkJeworCQkJLypzdHJ1Y3QgaXdfcG9pbnQgKmRhdGE9JndycS0+dS5kYXRhOyAqLworCQkJLypydF9pb2N0bF9zaXduaWNrbihuZXRfZGV2LCBOVUxMLCBkYXRhLCBOVUxMKTsgKi8KIAkJCWJyZWFrOwogCQl9Ci0JCWNhc2UgU0lPQ0dJV05JQ0tOOiAvL2dldCBub2RlIG5hbWUvbmlja25hbWUKLSAgICAgICAgewotICAgICAgICAJc3RydWN0IGl3X3BvaW50ICpkYXRhPSZ3cnEtPnUuZGF0YTsKLSAgICAgICAgCXJ0X2lvY3RsX2dpd25pY2tuKG5ldF9kZXYsIE5VTEwsIGRhdGEsIE5VTEwpOworCWNhc2UgU0lPQ0dJV05JQ0tOOgkvKmdldCBub2RlIG5hbWUvbmlja25hbWUgKi8KKwkJeworCQkJc3RydWN0IGl3X3BvaW50ICplcnEgPSBOVUxMOworCQkJZXJxID0gJndycS0+dS5kYXRhOworCQkJZXJxLT5sZW5ndGggPSBzdHJsZW4oKGNoYXIgKilwQWQtPm5pY2tuYW1lKTsKKwkJCVN0YXR1cyA9CisJCQkgICAgY29weV90b191c2VyKGVycS0+cG9pbnRlciwgcEFkLT5uaWNrbmFtZSwKKwkJCQkJIGVycS0+bGVuZ3RoKTsKIAkJCWJyZWFrOwogCQl9Ci0JCWNhc2UgU0lPQ0dJV1JBVEU6ICAgLy9nZXQgZGVmYXVsdCBiaXQgcmF0ZSAoYnBzKQotCQkgICAgcnRfaW9jdGxfZ2l3cmF0ZShuZXRfZGV2LCBOVUxMLCAmd3JxLT51LCBOVUxMKTsKLSAgICAgICAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNJT0NTSVdSQVRFOiAgLy9zZXQgZGVmYXVsdCBiaXQgcmF0ZSAoYnBzKQotCSAgICAgICAgcnRfaW9jdGxfc2l3cmF0ZShuZXRfZGV2LCBOVUxMLCAmd3JxLT51LCBOVUxMKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNJT0NHSVdSVFM6ICAvLyBnZXQgUlRTL0NUUyB0aHJlc2hvbGQgKGJ5dGVzKQotICAgICAgICB7Ci0gICAgICAgIAlzdHJ1Y3QgaXdfcGFyYW0gKnJ0cz0md3JxLT51LnJ0czsKLSAgICAgICAgCXJ0X2lvY3RsX2dpd3J0cyhuZXRfZGV2LCBOVUxMLCBydHMsIE5VTEwpOworCWNhc2UgU0lPQ0dJV1JBVEU6CS8qZ2V0IGRlZmF1bHQgYml0IHJhdGUgKGJwcykgKi8KKwkJcnRfaW9jdGxfZ2l3cmF0ZShuZXRfZGV2LCBOVUxMLCAmd3JxLT51LCBOVUxMKTsKKwkJYnJlYWs7CisJY2FzZSBTSU9DU0lXUkFURToJLypzZXQgZGVmYXVsdCBiaXQgcmF0ZSAoYnBzKSAqLworCQlydF9pb2N0bF9zaXdyYXRlKG5ldF9kZXYsIE5VTEwsICZ3cnEtPnUsIE5VTEwpOworCQlicmVhazsKKwljYXNlIFNJT0NHSVdSVFM6CS8qIGdldCBSVFMvQ1RTIHRocmVzaG9sZCAoYnl0ZXMpICovCisJCXsKKwkJCXN0cnVjdCBpd19wYXJhbSAqcnRzID0gJndycS0+dS5ydHM7CisJCQlydF9pb2N0bF9naXdydHMobmV0X2RldiwgTlVMTCwgcnRzLCBOVUxMKTsKIAkJCWJyZWFrOwogCQl9Ci0gICAgICAgIGNhc2UgU0lPQ1NJV1JUUzogIC8vc2V0IFJUUy9DVFMgdGhyZXNob2xkIChieXRlcykKLSAgICAgICAgewotICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpydHM9JndycS0+dS5ydHM7Ci0gICAgICAgIAlydF9pb2N0bF9zaXdydHMobmV0X2RldiwgTlVMTCwgcnRzLCBOVUxMKTsKKwljYXNlIFNJT0NTSVdSVFM6CS8qc2V0IFJUUy9DVFMgdGhyZXNob2xkIChieXRlcykgKi8KKwkJeworCQkJc3RydWN0IGl3X3BhcmFtICpydHMgPSAmd3JxLT51LnJ0czsKKwkJCXJ0X2lvY3RsX3Npd3J0cyhuZXRfZGV2LCBOVUxMLCBydHMsIE5VTEwpOwogCQkJYnJlYWs7CiAJCX0KLSAgICAgICAgY2FzZSBTSU9DR0lXRlJBRzogIC8vZ2V0IGZyYWdtZW50YXRpb24gdGhyIChieXRlcykKLSAgICAgICAgewotICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpmcmFnPSZ3cnEtPnUuZnJhZzsKLSAgICAgICAgCXJ0X2lvY3RsX2dpd2ZyYWcobmV0X2RldiwgTlVMTCwgZnJhZywgTlVMTCk7CisJY2FzZSBTSU9DR0lXRlJBRzoJLypnZXQgZnJhZ21lbnRhdGlvbiB0aHIgKGJ5dGVzKSAqLworCQl7CisJCQlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWcgPSAmd3JxLT51LmZyYWc7CisJCQlydF9pb2N0bF9naXdmcmFnKG5ldF9kZXYsIE5VTEwsIGZyYWcsIE5VTEwpOwogCQkJYnJlYWs7CiAJCX0KLSAgICAgICAgY2FzZSBTSU9DU0lXRlJBRzogIC8vc2V0IGZyYWdtZW50YXRpb24gdGhyIChieXRlcykKLSAgICAgICAgewotICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpmcmFnPSZ3cnEtPnUuZnJhZzsKLSAgICAgICAgCXJ0X2lvY3RsX3Npd2ZyYWcobmV0X2RldiwgTlVMTCwgZnJhZywgTlVMTCk7CisJY2FzZSBTSU9DU0lXRlJBRzoJLypzZXQgZnJhZ21lbnRhdGlvbiB0aHIgKGJ5dGVzKSAqLworCQl7CisJCQlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWcgPSAmd3JxLT51LmZyYWc7CisJCQlydF9pb2N0bF9zaXdmcmFnKG5ldF9kZXYsIE5VTEwsIGZyYWcsIE5VTEwpOwogCQkJYnJlYWs7CiAJCX0KLSAgICAgICAgY2FzZSBTSU9DR0lXRU5DT0RFOiAgLy9nZXQgZW5jb2RpbmcgdG9rZW4gJiBtb2RlCi0gICAgICAgIHsKLSAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZXJxPSZ3cnEtPnUuZW5jb2Rpbmc7Ci0gICAgICAgIAlpZihlcnEtPnBvaW50ZXIpCi0gICAgICAgIAkJcnRfaW9jdGxfZ2l3ZW5jb2RlKG5ldF9kZXYsIE5VTEwsIGVycSwgZXJxLT5wb2ludGVyKTsKKwljYXNlIFNJT0NHSVdFTkNPREU6CS8qZ2V0IGVuY29kaW5nIHRva2VuICYgbW9kZSAqLworCQl7CisJCQlzdHJ1Y3QgaXdfcG9pbnQgKmVycSA9ICZ3cnEtPnUuZW5jb2Rpbmc7CisJCQlpZiAoZXJxKQorCQkJCXJ0X2lvY3RsX2dpd2VuY29kZShuZXRfZGV2LCBOVUxMLCBlcnEsCisJCQkJCQkgICBlcnEtPnBvaW50ZXIpOwogCQkJYnJlYWs7CiAJCX0KLSAgICAgICAgY2FzZSBTSU9DU0lXRU5DT0RFOiAgLy9zZXQgZW5jb2RpbmcgdG9rZW4gJiBtb2RlCi0gICAgICAgIHsKLSAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZXJxPSZ3cnEtPnUuZW5jb2Rpbmc7Ci0gICAgICAgIAlpZihlcnEtPnBvaW50ZXIpCi0gICAgICAgIAkJcnRfaW9jdGxfc2l3ZW5jb2RlKG5ldF9kZXYsIE5VTEwsIGVycSwgZXJxLT5wb2ludGVyKTsKKwljYXNlIFNJT0NTSVdFTkNPREU6CS8qc2V0IGVuY29kaW5nIHRva2VuICYgbW9kZSAqLworCQl7CisJCQlzdHJ1Y3QgaXdfcG9pbnQgKmVycSA9ICZ3cnEtPnUuZW5jb2Rpbmc7CisJCQlpZiAoZXJxKQorCQkJCXJ0X2lvY3RsX3Npd2VuY29kZShuZXRfZGV2LCBOVUxMLCBlcnEsCisJCQkJCQkgICBlcnEtPnBvaW50ZXIpOwogCQkJYnJlYWs7CiAJCX0KLQkJY2FzZSBTSU9DR0lXQVA6ICAgICAvL2dldCBhY2Nlc3MgcG9pbnQgTUFDIGFkZHJlc3NlcwotICAgICAgICB7Ci0gICAgICAgIAlzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHI9JndycS0+dS5hcF9hZGRyOwotICAgICAgICAJcnRfaW9jdGxfZ2l3YXAobmV0X2RldiwgTlVMTCwgYXBfYWRkciwgYXBfYWRkci0+c2FfZGF0YSk7CisJY2FzZSBTSU9DR0lXQVA6CS8qZ2V0IGFjY2VzcyBwb2ludCBNQUMgYWRkcmVzc2VzICovCisJCXsKKwkJCXN0cnVjdCBzb2NrYWRkciAqYXBfYWRkciA9ICZ3cnEtPnUuYXBfYWRkcjsKKwkJCXJ0X2lvY3RsX2dpd2FwKG5ldF9kZXYsIE5VTEwsIGFwX2FkZHIsCisJCQkJICAgICAgIGFwX2FkZHItPnNhX2RhdGEpOwogCQkJYnJlYWs7CiAJCX0KLQkgICAgY2FzZSBTSU9DU0lXQVA6ICAvL3NldCBhY2Nlc3MgcG9pbnQgTUFDIGFkZHJlc3NlcwotICAgICAgICB7Ci0gICAgICAgIAlzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHI9JndycS0+dS5hcF9hZGRyOwotICAgICAgICAJcnRfaW9jdGxfc2l3YXAobmV0X2RldiwgTlVMTCwgYXBfYWRkciwgYXBfYWRkci0+c2FfZGF0YSk7CisJY2FzZSBTSU9DU0lXQVA6CS8qc2V0IGFjY2VzcyBwb2ludCBNQUMgYWRkcmVzc2VzICovCisJCXsKKwkJCXN0cnVjdCBzb2NrYWRkciAqYXBfYWRkciA9ICZ3cnEtPnUuYXBfYWRkcjsKKwkJCXJ0X2lvY3RsX3Npd2FwKG5ldF9kZXYsIE5VTEwsIGFwX2FkZHIsCisJCQkJICAgICAgIGFwX2FkZHItPnNhX2RhdGEpOwogCQkJYnJlYWs7CiAJCX0KLQkJY2FzZSBTSU9DR0lXTU9ERTogICAvL2dldCBvcGVyYXRpb24gbW9kZQotICAgICAgICB7Ci0gICAgICAgIAlfX3UzMiAqbW9kZT0md3JxLT51Lm1vZGU7Ci0gICAgICAgIAlydF9pb2N0bF9naXdtb2RlKG5ldF9kZXYsIE5VTEwsIG1vZGUsIE5VTEwpOworCWNhc2UgU0lPQ0dJV01PREU6CS8qZ2V0IG9wZXJhdGlvbiBtb2RlICovCisJCXsKKwkJCV9fdTMyICptb2RlID0gJndycS0+dS5tb2RlOworCQkJcnRfaW9jdGxfZ2l3bW9kZShuZXRfZGV2LCBOVUxMLCBtb2RlLCBOVUxMKTsKIAkJCWJyZWFrOwogCQl9Ci0JCWNhc2UgU0lPQ1NJV01PREU6ICAgLy9zZXQgb3BlcmF0aW9uIG1vZGUKLSAgICAgICAgewotICAgICAgICAJX191MzIgKm1vZGU9JndycS0+dS5tb2RlOwotICAgICAgICAJcnRfaW9jdGxfc2l3bW9kZShuZXRfZGV2LCBOVUxMLCBtb2RlLCBOVUxMKTsKKwljYXNlIFNJT0NTSVdNT0RFOgkvKnNldCBvcGVyYXRpb24gbW9kZSAqLworCQl7CisJCQlfX3UzMiAqbW9kZSA9ICZ3cnEtPnUubW9kZTsKKwkJCXJ0X2lvY3RsX3Npd21vZGUobmV0X2RldiwgTlVMTCwgbW9kZSwgTlVMTCk7CiAJCQlicmVhazsKIAkJfQotCQljYXNlIFNJT0NHSVdTRU5TOiAgIC8vZ2V0IHNlbnNpdGl2aXR5IChkQm0pCi0JCWNhc2UgU0lPQ1NJV1NFTlM6CS8vc2V0IHNlbnNpdGl2aXR5IChkQm0pCi0JCWNhc2UgU0lPQ0dJV1BPV0VSOiAgLy9nZXQgUG93ZXIgTWFuYWdlbWVudCBzZXR0aW5ncwotCQljYXNlIFNJT0NTSVdQT1dFUjogIC8vc2V0IFBvd2VyIE1hbmFnZW1lbnQgc2V0dGluZ3MKLQkJY2FzZSBTSU9DR0lXVFhQT1c6ICAvL2dldCB0cmFuc21pdCBwb3dlciAoZEJtKQotCQljYXNlIFNJT0NTSVdUWFBPVzogIC8vc2V0IHRyYW5zbWl0IHBvd2VyIChkQm0pCi0JCWNhc2UgU0lPQ0dJV1JBTkdFOgkvL0dldCByYW5nZSBvZiBwYXJhbWV0ZXJzCi0JCWNhc2UgU0lPQ0dJV1JFVFJZOgkvL2dldCByZXRyeSBsaW1pdHMgYW5kIGxpZmV0aW1lCi0JCWNhc2UgU0lPQ1NJV1JFVFJZOgkvL3NldCByZXRyeSBsaW1pdHMgYW5kIGxpZmV0aW1lCi0JCWNhc2UgUlRfUFJJVl9JT0NUTDoKLQkJY2FzZSBSVF9QUklWX0lPQ1RMX0VYVDoKLQkJCVN0YXR1cyA9IC1FT1BOT1RTVVBQOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0lPQ0dJV1BSSVY6Ci0JCQlpZiAod3JxLT51LmRhdGEucG9pbnRlcikKLQkJCXsKLQkJCQlpZiAoIGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHNpemVvZihwcml2dGFiKSkgIT0gVFJVRSkKLQkJCQkJYnJlYWs7Ci0JCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHByaXZ0YWIpIC8gc2l6ZW9mKHByaXZ0YWJbMF0pOwotCQkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcHJpdnRhYiwgc2l6ZW9mKHByaXZ0YWIpKSkKLQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFJUUFJJVl9JT0NUTF9TRVQ6Ci0JCQlpZihhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCkgIT0gVFJVRSkKLQkJCQlicmVhazsKLQkJCXJ0X2lvY3RsX3NldHBhcmFtKG5ldF9kZXYsIE5VTEwsIE5VTEwsIHdycS0+dS5kYXRhLnBvaW50ZXIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUlRQUklWX0lPQ1RMX0dTSVRFU1VSVkVZOgotCQkJUlRNUElvY3RsR2V0U2l0ZVN1cnZleShwQWQsIHdycSk7Ci0JCSAgICBicmVhazsKLSAgICAgICAgY2FzZSBTSU9DRVRIVE9PTDoKLSAgICAgICAgICAgICAgICBicmVhazsKLQkJZGVmYXVsdDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIklPQ1RMOjp1bmtub3duIElPQ1RMJ3MgY21kID0gMHglMDh4XG4iLCBjbWQpKTsKLQkJCVN0YXR1cyA9IC1FT1BOT1RTVVBQOwotCQkJYnJlYWs7CisJY2FzZSBTSU9DR0lXU0VOUzoJLypnZXQgc2Vuc2l0aXZpdHkgKGRCbSkgKi8KKwljYXNlIFNJT0NTSVdTRU5TOgkvKnNldCBzZW5zaXRpdml0eSAoZEJtKSAqLworCWNhc2UgU0lPQ0dJV1BPV0VSOgkvKmdldCBQb3dlciBNYW5hZ2VtZW50IHNldHRpbmdzICovCisJY2FzZSBTSU9DU0lXUE9XRVI6CS8qc2V0IFBvd2VyIE1hbmFnZW1lbnQgc2V0dGluZ3MgKi8KKwljYXNlIFNJT0NHSVdUWFBPVzoJLypnZXQgdHJhbnNtaXQgcG93ZXIgKGRCbSkgKi8KKwljYXNlIFNJT0NTSVdUWFBPVzoJLypzZXQgdHJhbnNtaXQgcG93ZXIgKGRCbSkgKi8KKwljYXNlIFNJT0NHSVdSQU5HRToJLypHZXQgcmFuZ2Ugb2YgcGFyYW1ldGVycyAqLworCWNhc2UgU0lPQ0dJV1JFVFJZOgkvKmdldCByZXRyeSBsaW1pdHMgYW5kIGxpZmV0aW1lICovCisJY2FzZSBTSU9DU0lXUkVUUlk6CS8qc2V0IHJldHJ5IGxpbWl0cyBhbmQgbGlmZXRpbWUgKi8KKwljYXNlIFJUX1BSSVZfSU9DVEw6CisJY2FzZSBSVF9QUklWX0lPQ1RMX0VYVDoKKwljYXNlIFJUUFJJVl9JT0NUTF9TRVQ6CisJY2FzZSBSVFBSSVZfSU9DVExfR1NJVEVTVVJWRVk6CisJY2FzZSBTSU9DR0lXUFJJVjoKKwkJU3RhdHVzID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCWNhc2UgU0lPQ0VUSFRPT0w6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiSU9DVEw6OnVua25vd24gSU9DVEwncyBjbWQgPSAweCUwOHhcbiIsIGNtZCkpOworCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CiAJfQogCi0gICAgaWYoU3RhdGVNYWNoaW5lVG91Y2hlZCkgLy8gVXBwZXIgbGF5ZXIgc2VudCBhIE1MTUUtcmVsYXRlZCBvcGVyYXRpb25zCi0gICAgCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwlpZiAoU3RhdGVNYWNoaW5lVG91Y2hlZCkJLyogVXBwZXIgbGF5ZXIgc2VudCBhIE1MTUUtcmVsYXRlZCBvcGVyYXRpb25zICovCisJCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7CiAKIAlyZXR1cm4gU3RhdHVzOwogfQpAQCAtMjg3OCw5NSArMjYzOSw3NyBAQAogICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1JTlQgU2V0X1NTSURfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoraW50IFNldF9TU0lEX1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIsIGNoYXIgKmFyZykKIHsKLSAgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkLCAqcFNzaWQ9TlVMTDsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IFRSVUU7CisJc3RydWN0IHJ0X25kaXNfODAyXzExX3NzaWQgU3NpZCwgKnBTc2lkID0gTlVMTDsKKwlCT09MRUFOIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBGQUxTRTsKKwlpbnQgc3VjY2VzcyA9IFRSVUU7CiAKLSAgICBpZiggc3RybGVuKGFyZykgPD0gTUFYX0xFTl9PRl9TU0lEKQotICAgIHsKLSAgICAgICAgTmRpc1plcm9NZW1vcnkoJlNzaWQsIHNpemVvZihORElTXzgwMl8xMV9TU0lEKSk7Ci0gICAgICAgIGlmIChzdHJsZW4oYXJnKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShTc2lkLlNzaWQsIGFyZywgc3RybGVuKGFyZykpOwotICAgICAgICAgICAgU3NpZC5Tc2lkTGVuZ3RoID0gc3RybGVuKGFyZyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAgIC8vQU5ZIHNzaWQKLSAgICAgICAgewotICAgICAgICAgICAgU3NpZC5Tc2lkTGVuZ3RoID0gMDsKLQkJICAgIG1lbWNweShTc2lkLlNzaWQsICIiLCAwKTsKKwlpZiAoc3RybGVuKGFyZykgPD0gTUFYX0xFTl9PRl9TU0lEKSB7CisJCU5kaXNaZXJvTWVtb3J5KCZTc2lkLCBzaXplb2Yoc3RydWN0IHJ0X25kaXNfODAyXzExX3NzaWQpKTsKKwkJaWYgKHN0cmxlbihhcmcpICE9IDApIHsKKwkJCU5kaXNNb3ZlTWVtb3J5KFNzaWQuU3NpZCwgYXJnLCBzdHJsZW4oYXJnKSk7CisJCQlTc2lkLlNzaWRMZW5ndGggPSBzdHJsZW4oYXJnKTsKKwkJfSBlbHNlCQkvKkFOWSBzc2lkICovCisJCXsKKwkJCVNzaWQuU3NpZExlbmd0aCA9IDA7CisJCQltZW1jcHkoU3NpZC5Tc2lkLCAiIiwgMCk7CiAJCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7CiAJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKLQkgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQ7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9CisJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKIAkJfQotICAgICAgICBwU3NpZCA9ICZTc2lkOworCQlwU3NpZCA9ICZTc2lkOwogCi0gICAgICAgIGlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQotICAgICAgICB7Ci0gICAgICAgICAgICBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKLSAgICAgICAgfQorCQlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkgeworCQkJUlRNUF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUhXG4iKSk7CisJCX0KIAotICAgICAgICBwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IFRSVUU7Ci0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworCQlpZiAoKHBBZGFwdGVyLT5TdGFDZmcuV3BhUGFzc1BocmFzZUxlbiA+PSA4KSAmJgorCQkgICAgKHBBZGFwdGVyLT5TdGFDZmcuV3BhUGFzc1BocmFzZUxlbiA8PSA2NCkpIHsKKwkJCWNoYXIgcGFzc3BocmFzZV9zdHJbNjVdID0geyAwIH07CisJCQl1OCBrZXlNYXRlcmlhbFs0MF07CisKKwkJCVJUTVBNb3ZlTWVtb3J5KHBhc3NwaHJhc2Vfc3RyLAorCQkJCSAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVBhc3NQaHJhc2UsCisJCQkJICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhUGFzc1BocmFzZUxlbik7CisJCQlSVE1QWmVyb01lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlBNSywgMzIpOworCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhUGFzc1BocmFzZUxlbiA9PSA2NCkgeworCQkJCUF0b0goKGNoYXIgKilwQWRhcHRlci0+U3RhQ2ZnLldwYVBhc3NQaHJhc2UsCisJCQkJICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBNSywgMzIpOworCQkJfSBlbHNlIHsKKwkJCQlQYXNzd29yZEhhc2goKGNoYXIgKilwQWRhcHRlci0+U3RhQ2ZnLgorCQkJCQkgICAgIFdwYVBhc3NQaHJhc2UsIFNzaWQuU3NpZCwKKwkJCQkJICAgICBTc2lkLlNzaWRMZW5ndGgsIGtleU1hdGVyaWFsKTsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlBNSywKKwkJCQkJICAgICAgIGtleU1hdGVyaWFsLCAzMik7CisJCQl9CisJCX0KKworCQlwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IFRSVUU7CisJCXBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOwogCQlwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOwogCi0gICAgICAgIE1sbWVFbnF1ZXVlKHBBZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKLSAgICAgICAgICAgICAgICAgICAgT0lEXzgwMl8xMV9TU0lELAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoTkRJU184MDJfMTFfU1NJRCksCi0gICAgICAgICAgICAgICAgICAgIChWT0lEICopcFNzaWQpOworCQlNbG1lRW5xdWV1ZShwQWRhcHRlciwKKwkJCSAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCSAgICBPSURfODAyXzExX1NTSUQsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9uZGlzXzgwMl8xMV9zc2lkKSwgKHZvaWQgKikgcFNzaWQpOwogCi0gICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBUUlVFOwotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfU1NJRF9Qcm9jOjooTGVuPSVkLFNzaWQ9JXMpXG4iLCBTc2lkLlNzaWRMZW5ndGgsIFNzaWQuU3NpZCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHN1Y2Nlc3MgPSBGQUxTRTsKKwkJU3RhdGVNYWNoaW5lVG91Y2hlZCA9IFRSVUU7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiU2V0X1NTSURfUHJvYzo6KExlbj0lZCxTc2lkPSVzKVxuIiwgU3NpZC5Tc2lkTGVuZ3RoLAorCQkJICBTc2lkLlNzaWQpKTsKKwl9IGVsc2UKKwkJc3VjY2VzcyA9IEZBTFNFOwogCi0gICAgaWYgKFN0YXRlTWFjaGluZVRvdWNoZWQpIC8vIFVwcGVyIGxheWVyIHNlbnQgYSBNTE1FLXJlbGF0ZWQgb3BlcmF0aW9ucwotICAgIAlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZGFwdGVyKTsKKwlpZiAoU3RhdGVNYWNoaW5lVG91Y2hlZCkJLyogVXBwZXIgbGF5ZXIgc2VudCBhIE1MTUUtcmVsYXRlZCBvcGVyYXRpb25zICovCisJCVJUTVBfTUxNRV9IQU5ETEVSKHBBZGFwdGVyKTsKIAotICAgIHJldHVybiBzdWNjZXNzOworCXJldHVybiBzdWNjZXNzOwogfQogCi0jaWZkZWYgV01NX1NVUFBPUlQKLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFdtbUNhcGFibGUgRW5hYmxlIG9yIERpc2FibGUKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfV21tQ2FwYWJsZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlCT09MRUFOCWJXbW1DYXBhYmxlOwotCi0JYldtbUNhcGFibGUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKChiV21tQ2FwYWJsZSA9PSAxKQotI2lmZGVmIFJUMjg3MAotCQkmJiAocEFkLT5OdW1iZXJPZlBpcGVzID49IDUpCi0jZW5kaWYgLy8gUlQyODcwIC8vCi0JCSkKLQkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPSBUUlVFOwotCWVsc2UgaWYgKGJXbW1DYXBhYmxlID09IDApCi0JCXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID0gRkFMU0U7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XbW1DYXBhYmxlX1Byb2M6OihiV21tQ2FwYWJsZT0lZClcbiIsCi0JCXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLSNlbmRpZiAvLyBXTU1fU1VQUE9SVCAvLwotCiAvKgogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgRGVzY3JpcHRpb246CkBAIC0yOTc1LDE2NiArMjcxOCwxODQgQEAKICAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotSU5UIFNldF9OZXR3b3JrVHlwZV9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCitpbnQgU2V0X05ldHdvcmtUeXBlX1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIsIGNoYXIgKmFyZykKIHsKLSAgICBVSU5UMzIJVmFsdWUgPSAwOworCXUzMiBWYWx1ZSA9IDA7CiAKLSAgICBpZiAoc3RyY21wKGFyZywgIkFkaG9jIikgPT0gMCkKLQl7Ci0JCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgIT0gQlNTX0FESE9DKQotCQl7Ci0JCQkvLyBDb25maWcgaGFzIGNoYW5nZWQKKwlpZiAoc3RyY21wKGFyZywgIkFkaG9jIikgPT0gMCkgeworCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlICE9IEJTU19BREhPQykgeworCQkJLyogQ29uZmlnIGhhcyBjaGFuZ2VkICovCiAJCQlwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOwotICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLCBTVEFOT1JNQUwpOwotICAgICAgICAgICAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCQlpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpIHsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFJYX0ZJTFRSX0NGRywKKwkJCQkJCVNUQU5PUk1BTCk7CisJCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKIAkJCQlWYWx1ZSAmPSAofjB4ODApOwogCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPSBUUlVFOwotICAgICAgICAgICAgICAgIExpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7Ci0gICAgICAgICAgICB9Ci0JCQlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKQotCQkJewotCQkJCS8vQk9PTEVBTiBDYW5jZWxsZWQ7Ci0JCQkJLy8gU2V0IHRoZSBBdXRvUmVjb25uZWN0U3NpZCB0byBwcmV2ZW50IGl0IHJlY29ubmVjdCB0byBvbGQgU1NJRAotCQkJCS8vIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZSB1c2VyIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4KLQkJCQlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7Ci0JCQkJTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKKwkJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLAorCQkJCQkJICAgIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gVFJVRTsKKwkJCQlMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworCQkJfQorCQkJaWYgKElORlJBX09OKHBBZGFwdGVyKSkgeworCQkJCS8qQk9PTEVBTiBDYW5jZWxsZWQ7ICovCisJCQkJLyogU2V0IHRoZSBBdXRvUmVjb25uZWN0U3NpZCB0byBwcmV2ZW50IGl0IHJlY29ubmVjdCB0byBvbGQgU1NJRCAqLworCQkJCS8qIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZSB1c2VyIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4gKi8KKwkJCQlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiA9IDMyOworCQkJCU5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5NbG1lQXV4LgorCQkJCQkgICAgICAgQXV0b1JlY29ubmVjdFNzaWQsCisJCQkJCSAgICAgICBwQWRhcHRlci0+TWxtZUF1eC4KKwkJCQkJICAgICAgIEF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKIAogCQkJCUxpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CiAKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEJCIVxuIikpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEJCIVxuIikpOwogCQkJfQogCQl9CiAJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19BREhPQzsKLSAgICAgICAgcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBwQWRhcHRlci0+U3RhQ2ZnLk9yaURldlR5cGU7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5TZXRfTmV0d29ya1R5cGVfUHJvYzo6KEFELUhPQylcbiIpKTsKLQl9Ci0gICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIkluZnJhIikgPT0gMCkKLQl7Ci0JCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgIT0gQlNTX0lORlJBKQotCQl7Ci0JCQkvLyBDb25maWcgaGFzIGNoYW5nZWQKKwkJcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBwQWRhcHRlci0+U3RhQ2ZnLk9yaURldlR5cGU7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiPT09PlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooQUQtSE9DKVxuIikpOworCX0gZWxzZSBpZiAoc3RyY21wKGFyZywgIkluZnJhIikgPT0gMCkgeworCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlICE9IEJTU19JTkZSQSkgeworCQkJLyogQ29uZmlnIGhhcyBjaGFuZ2VkICovCiAJCQlwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOwotICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLCBTVEFOT1JNQUwpOwotICAgICAgICAgICAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCQlpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpIHsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFJYX0ZJTFRSX0NGRywKKwkJCQkJCVNUQU5PUk1BTCk7CisJCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKIAkJCQlWYWx1ZSAmPSAofjB4ODApOwogCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPSBUUlVFOwotICAgICAgICAgICAgICAgIExpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7Ci0gICAgICAgICAgICB9Ci0JCQlpZiAoQURIT0NfT04ocEFkYXB0ZXIpKQotCQkJewotCQkJCS8vIFNldCB0aGUgQXV0b1JlY29ubmVjdFNzaWQgdG8gcHJldmVudCBpdCByZWNvbm5lY3QgdG8gb2xkIFNTSUQKLQkJCQkvLyBTaW5jZSBjYWxsaW5nIHRoaXMgaW5kaWNhdGUgdXNlciBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuCi0JCQkJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOwotCQkJCU5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisJCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwKKwkJCQkJCSAgICBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IFRSVUU7CisJCQkJTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKwkJCX0KKwkJCWlmIChBREhPQ19PTihwQWRhcHRlcikpIHsKKwkJCQkvKiBTZXQgdGhlIEF1dG9SZWNvbm5lY3RTc2lkIHRvIHByZXZlbnQgaXQgcmVjb25uZWN0IHRvIG9sZCBTU0lEICovCisJCQkJLyogU2luY2UgY2FsbGluZyB0aGlzIGluZGljYXRlIHVzZXIgZG9uJ3Qgd2FudCB0byBjb25uZWN0IHRvIHRoYXQgU1NJRCBhbnltb3JlLiAqLworCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuID0gMzI7CisJCQkJTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPk1sbWVBdXguCisJCQkJCSAgICAgICBBdXRvUmVjb25uZWN0U3NpZCwKKwkJCQkJICAgICAgIHBBZGFwdGVyLT5NbG1lQXV4LgorCQkJCQkgICAgICAgQXV0b1JlY29ubmVjdFNzaWRMZW4pOwogCiAJCQkJTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKIAkJCX0KIAkJfQogCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7Ci0gICAgICAgIHBBZGFwdGVyLT5uZXRfZGV2LT50eXBlID0gcEFkYXB0ZXItPlN0YUNmZy5PcmlEZXZUeXBlOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+U2V0X05ldHdvcmtUeXBlX1Byb2M6OihJTkZSQSlcbiIpKTsKLQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7Ci0JfQotICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICJNb25pdG9yIikgPT0gMCkKLSAgICB7Ci0JCVVDSEFSCWJicFZhbHVlID0gMDsKKwkJcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBwQWRhcHRlci0+U3RhQ2ZnLk9yaURldlR5cGU7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiPT09PlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooSU5GUkEpXG4iKSk7CisJfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiTW9uaXRvciIpID09IDApIHsKKwkJdTggYmJwVmFsdWUgPSAwOwogCQlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOwogCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX0lORlJBX09OKTsKLSAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19BREhPQ19PTik7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfQURIT0NfT04pOwogCQlPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwotCQkvLyBkaXNhYmxlIGFsbCBwZXJpb2RpYyBzdGF0ZSBtYWNoaW5lCisJCS8qIGRpc2FibGUgYWxsIHBlcmlvZGljIHN0YXRlIG1hY2hpbmUgKi8KIAkJcEFkYXB0ZXItPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IEZBTFNFOwotCQkvLyByZXNldCBhbGwgbWxtZSBzdGF0ZSBtYWNoaW5lCi0JCVJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCBcbiIpKTsKLSAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBTl9NSVhFRCkKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gMzY7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IDY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgTl9DaGFubmVsQ2hlY2socEFkYXB0ZXIpOworCQkvKiByZXNldCBhbGwgbWxtZSBzdGF0ZSBtYWNoaW5lICovCisJCVJUTVBfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCBcbiIpKTsKKwkJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPT0gMCkgeworCQkJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBTl9NSVhFRCkKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gMzY7CisJCQllbHNlCisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IDY7CisJCX0gZWxzZQorCQkJTl9DaGFubmVsQ2hlY2socEFkYXB0ZXIpOwogCi0JaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCi0gICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCAmJgotICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID09IEVYVENIQV9BQk9WRSkKLQkJewotCQkJLy8gNDBNSHogLGNvbnRyb2wgY2hhbm5lbCBhdCBsb3dlcgotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsICZiYnBWYWx1ZSk7CisJCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgorCQkgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDAgJiYKKwkJICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9PQorCQkgICAgRVhUQ0hBX0FCT1ZFKSB7CisJCQkvKiA0ME1IeiAsY29udHJvbCBjaGFubmVsIGF0IGxvd2VyICovCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwKKwkJCQkJCSAgICAmYmJwVmFsdWUpOwogCQkJYmJwVmFsdWUgJj0gKH4weDE4KTsKIAkJCWJicFZhbHVlIHw9IDB4MTA7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsIGJicFZhbHVlKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwKKwkJCQkJCSAgICAgYmJwVmFsdWUpOwogCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKLQkJCS8vICBSWCA6IGNvbnRyb2wgY2hhbm5lbCBhdCBsb3dlcgotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsICZiYnBWYWx1ZSk7CisJCQkvKiAgUlggOiBjb250cm9sIGNoYW5uZWwgYXQgbG93ZXIgKi8KKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLAorCQkJCQkJICAgICZiYnBWYWx1ZSk7CiAJCQliYnBWYWx1ZSAmPSAofjB4MjApOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCBiYnBWYWx1ZSk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsCisJCQkJCQkgICAgIGJicFZhbHVlKTsKIAogCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOwogCQkJVmFsdWUgJj0gMHhmZmZmZmZmZTsKIAkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsIFZhbHVlKTsKLQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgKyAyOwotICAgICAgICAgICAgQXNpY1N3aXRjaENoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKLQkJICAgIEFzaWNMb2NrQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV180MCAsY29udHJvbF9jaGFubmVsKCVkKSwgQ2VudHJhbENoYW5uZWwoJWQpIFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKLQkJfQotCQllbHNlIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgotICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCAmJgotICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPT0gRVhUQ0hBX0JFTE9XKQotCQl7Ci0JCQkvLyA0ME1IeiAsY29udHJvbCBjaGFubmVsIGF0IHVwcGVyCi0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgJmJicFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPQorCQkJICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCArIDI7CisJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwKKwkJCQkJICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLAorCQkJCQkgIEZBTFNFKTsKKwkJCUFzaWNMb2NrQ2hhbm5lbChwQWRhcHRlciwKKwkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJCV180MCAsY29udHJvbF9jaGFubmVsKCVkKSwgQ2VudHJhbENoYW5uZWwoJWQpIFxuIiwKKwkJCQkgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwKKwkJCQkgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKKwkJfSBlbHNlIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRAorCQkJICAgJiYgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0KKwkJCSAgIEJXXzQwCisJCQkgICAmJiBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC4KKwkJCSAgIEVYVENIQSA9PSBFWFRDSEFfQkVMT1cpIHsKKwkJCS8qIDQwTUh6ICxjb250cm9sIGNoYW5uZWwgYXQgdXBwZXIgKi8KKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LAorCQkJCQkJICAgICZiYnBWYWx1ZSk7CiAJCQliYnBWYWx1ZSAmPSAofjB4MTgpOwogCQkJYmJwVmFsdWUgfD0gMHgxMDsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgYmJwVmFsdWUpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LAorCQkJCQkJICAgICBiYnBWYWx1ZSk7CiAJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOwogCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOwogCQkJVmFsdWUgfD0gMHgxOwogCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgVmFsdWUpOwogCi0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgJmJicFZhbHVlKTsKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLAorCQkJCQkJICAgICZiYnBWYWx1ZSk7CiAJCQliYnBWYWx1ZSB8PSAoMHgyMCk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsIGJicFZhbHVlKTsKLQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgLSAyOwotICAgICAgICAgICAgQXNpY1N3aXRjaENoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKLQkJICAgIEFzaWNMb2NrQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV180MCAsY29udHJvbF9jaGFubmVsKCVkKSwgQ2VudHJhbENoYW5uZWwoJWQpIFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIDIwTUh6Ci0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgJmJicFZhbHVlKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywKKwkJCQkJCSAgICAgYmJwVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9CisJCQkgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKKwkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZGFwdGVyLAorCQkJCQkgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsCisJCQkJCSAgRkFMU0UpOworCQkJQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLAorCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkJXXzQwICxjb250cm9sX2NoYW5uZWwoJWQpLCBDZW50cmFsQ2hhbm5lbCglZCkgXG4iLAorCQkJCSAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLAorCQkJCSAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOworCQl9IGVsc2UgeworCQkJLyogMjBNSHogKi8KKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LAorCQkJCQkJICAgICZiYnBWYWx1ZSk7CiAJCQliYnBWYWx1ZSAmPSAofjB4MTgpOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCBiYnBWYWx1ZSk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsCisJCQkJCQkgICAgIGJicFZhbHVlKTsKIAkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7Ci0JCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLAorCQkJCQkgIEZBTFNFKTsKIAkJCUFzaWNMb2NrQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzIwLCBDaGFubmVsKCVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJCV18yMCwgQ2hhbm5lbCglZClcbiIsCisJCQkJICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKIAkJfQotCQkvLyBFbmFibGUgUnggd2l0aCBwcm9taXNjdW91cyByZWNlcHRpb24KKwkJLyogRW5hYmxlIFJ4IHdpdGggcHJvbWlzY3VvdXMgcmVjZXB0aW9uICovCiAJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLCAweDMpOwotCQkvLyBBU0lDIHN1cHBvcnN0cyBzbmlmZmVyIGZ1bmN0aW9uIHdpdGggcmVwbGFjaW5nIFJTU0kgd2l0aCB0aW1lc3RhbXAuCi0JCS8vUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKLQkJLy9WYWx1ZSB8PSAoMHg4MCk7Ci0JCS8vUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLQkJLy8gZGlzYWJsZSBzeW5jCisJCS8qIEFTSUMgc3VwcG9yc3RzIHNuaWZmZXIgZnVuY3Rpb24gd2l0aCByZXBsYWNpbmcgUlNTSSB3aXRoIHRpbWVzdGFtcC4gKi8KKwkJLypSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOyAqLworCQkvKlZhbHVlIHw9ICgweDgwKTsgKi8KKwkJLypSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOyAqLworCQkvKiBkaXNhYmxlIHN5bmMgKi8KIAkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIEJDTl9USU1FX0NGRywgJmNzci53b3JkKTsKIAkJY3NyLmZpZWxkLmJCZWFjb25HZW4gPSAwOwogCQljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAwOwpAQCAtMzE0Miw2NTUgKzI5MDMsMTYgQEAKIAkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKIAogCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfTU9OSVRPUjsKLSAgICAgICAgcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBBUlBIUkRfSUVFRTgwMjExX1BSSVNNOyAvL0FSUEhSRF9JRUVFODAyMTE7IC8vIElFRUU4MDIxMQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+U2V0X05ldHdvcmtUeXBlX1Byb2M6OihNT05JVE9SKVxuIikpOwotICAgIH0KKwkJcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBBUlBIUkRfSUVFRTgwMjExX1BSSVNNOwkvKkFSUEhSRF9JRUVFODAyMTE7IC8vIElFRUU4MDIxMSAqLworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIj09PT5TZXRfTmV0d29ya1R5cGVfUHJvYzo6KE1PTklUT1IpXG4iKSk7CisJfQorCS8qIFJlc2V0IFJhbGluayBzdXBwbGljYW50IHRvIG5vdCB1c2UsIGl0IHdpbGwgYmUgc2V0IHRvIHN0YXJ0IHdoZW4gVUkgc2V0IFBNSyBrZXkgKi8KKwlwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOwogCi0gICAgLy8gUmVzZXQgUmFsaW5rIHN1cHBsaWNhbnQgdG8gbm90IHVzZSwgaXQgd2lsbCBiZSBzZXQgdG8gc3RhcnQgd2hlbiBVSSBzZXQgUE1LIGtleQotICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfTmV0d29ya1R5cGVfUHJvYzo6KE5ldHdvcmtUeXBlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlKSk7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgQXV0aGVudGljYXRpb24gbW9kZQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9BdXRoTW9kZV9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCi17Ci0gICAgaWYgKChzdHJjbXAoYXJnLCAiV0VQQVVUTyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid2VwYXV0byIpID09IDApKQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaDsKLSAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIk9QRU4iKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIm9wZW4iKSA9PSAwKSkKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47Ci0gICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJTSEFSRUQiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgInNoYXJlZCIpID09IDApKQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOwotICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBUFNLIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGFwc2siKSA9PSAwKSkKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKLSAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQU5PTkUiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYW5vbmUiKSA9PSAwKSkKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7Ci0gICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEEyUFNLIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGEycHNrIikgPT0gMCkpCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOwotICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGEiKSA9PSAwKSkKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKLSAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQTIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYTIiKSA9PSAwKSkKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0F1dGhNb2RlX1Byb2M6OihBdXRoTW9kZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUpKTsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBFbmNyeXB0aW9uIFR5cGUKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBTZXRfRW5jcnlwVHlwZV9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCi17Ci0gICAgaWYgKChzdHJjbXAoYXJnLCAiTk9ORSIpID09IDApIHx8IChzdHJjbXAoYXJnLCAibm9uZSIpID09IDApKQotICAgIHsKLSAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKLQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotICAgIH0KLSAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldFUCIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid2VwIikgPT0gMCkpCi0gICAgewotICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZwotCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOwotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKLQkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiVEtJUCIpID09IDApIHx8IChzdHJjbXAoYXJnLCAidGtpcCIpID09IDApKQotICAgIHsKLSAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZwotCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0JICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiQUVTIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJhZXMiKSA9PSAwKSkKLSAgICB7Ci0gICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKLQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0VuY3J5cFR5cGVfUHJvYzo6KEVuY3J5cFR5cGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cykpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IERlZmF1bHQgS2V5IElECi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X0RlZmF1bHRLZXlJRF9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCi17Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5SWR4OwotCi0gICAgS2V5SWR4ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLSAgICBpZigoS2V5SWR4ID49IDEgKSAmJiAoS2V5SWR4IDw9IDQpKQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgKEtleUlkeCAtIDEgKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0RlZmF1bHRLZXlJRF9Qcm9jOjooRGVmYXVsdEtleUlEPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBXRVAgS0VZMQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9LZXkxX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKLXsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OwotCi0gICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZwotCi0gICAgS2V5TGVuID0gc3RybGVuKGFyZyk7Ci0KLSAgICBzd2l0Y2ggKEtleUxlbikKLSAgICB7Ci0gICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW47Ci0gICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIGFyZywgS2V5TGVuKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OihLZXkxPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKLSAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gS2V5TGVuIC8gMiA7Ci0gICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIEtleUxlbiAvIDIpOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gS2V5TGVuOwotICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBhcmcsIEtleUxlbik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKLSAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gS2V5TGVuIC8gMiA7Ci0gICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIEtleUxlbiAvIDIpOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OihLZXkxPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0KLSAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQotICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLSAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0Ci0gICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCi0gICAgewotICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFdFUCBLRVkyCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X0tleTJfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQotewotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7Ci0KLSAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCi0KLSAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKLQotICAgIHN3aXRjaCAoS2V5TGVuKQotICAgIHsKLSAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCi0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbjsKLSAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgYXJnLCBLZXlMZW4pOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQotICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKLSAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgS2V5TGVuIC8gMik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW47Ci0gICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksIGFyZywgS2V5TGVuKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQotICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKLSAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgS2V5TGVuIC8gMik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0KLSAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQotICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLSAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0Ci0gICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCi0gICAgewotICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uQ2lwaGVyQWxnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBXRVAgS0VZMwotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9LZXkzX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKLXsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OwotCi0gICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZwotCi0gICAgS2V5TGVuID0gc3RybGVuKGFyZyk7Ci0KLSAgICBzd2l0Y2ggKEtleUxlbikKLSAgICB7Ci0gICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW47Ci0gICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIGFyZywgS2V5TGVuKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUFzY2lpKVxuIiwgYXJnKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKLSAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuIC8gMiA7Ci0gICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIEtleUxlbiAvIDIpOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9SGV4KVxuIiwgYXJnKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuOwotICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBhcmcsIEtleUxlbik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9QXNjaWkpXG4iLCBhcmcpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKLSAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuIC8gMiA7Ci0gICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIEtleUxlbiAvIDIpOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUhleClcbiIsIGFyZykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCi0gICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKLSAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAotICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgotICAgIHsKLSAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLkNpcGhlckFsZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgV0VQIEtFWTQKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBTZXRfS2V5NF9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCi17Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKLQotICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLSAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKLQotICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOwotCi0gICAgc3dpdGNoIChLZXlMZW4pCi0gICAgewotICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuOwotICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBhcmcsIEtleUxlbik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjooS2V5ND0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCi0gICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleUxlbiA9IEtleUxlbiAvIDIgOwotICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBLZXlMZW4gLyAyKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCi0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleUxlbiA9IEtleUxlbjsKLSAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwgYXJnLCBLZXlMZW4pOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCi0gICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleUxlbiA9IEtleUxlbiAvIDIgOwotICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBLZXlMZW4gLyAyKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjooS2V5ND0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKLQotICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCi0gICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKLSAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKLSAgICB7Ci0gICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5DaXBoZXJBbGcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgV1BBIFBTSyBrZXkKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBTZXRfV1BBUFNLX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKLXsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICBrZXlNYXRlcmlhbFs0MF07Ci0KLSAgICBpZiAoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgotICAgICAgICAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgotCSAgICAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotCQkpCi0gICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCi0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfV1BBUFNLX1Byb2M6OihXUEFQU0s9JXMpXG4iLCBhcmcpKTsKLQotICAgIE5kaXNaZXJvTWVtb3J5KGtleU1hdGVyaWFsLCA0MCk7Ci0KLSAgICBpZiAoKHN0cmxlbihhcmcpIDwgOCkgfHwgKHN0cmxlbihhcmcpID4gNjQpKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IGZhaWxlZCEhKFdQQVBTSz0lcyksIFdQQVBTSyBrZXktc3RyaW5nIHJlcXVpcmVkIDggfiA2NCBjaGFyYWN0ZXJzIFxuIiwgYXJnKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpZiAoc3RybGVuKGFyZykgPT0gNjQpCi0gICAgewotICAgICAgICBBdG9IKGFyZywga2V5TWF0ZXJpYWwsIDMyKTsKLSAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5QTUssIGtleU1hdGVyaWFsLCAzMik7Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgUGFzc3dvcmRIYXNoKChjaGFyICopYXJnLCBwQWRhcHRlci0+TWxtZUF1eC5Tc2lkLCBwQWRhcHRlci0+TWxtZUF1eC5Tc2lkTGVuLCBrZXlNYXRlcmlhbCk7Ci0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuUE1LLCBrZXlNYXRlcmlhbCwgMzIpOwotICAgIH0KLQotCi0KLSAgICBpZihwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DICYmCi0gICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotICAgIHsKLSAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8vIFN0YXJ0IFNUQSBzdXBwbGljYW50IHN0YXRlIG1hY2hpbmUKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1NUQVJUOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBQb3dlciBTYXZpbmcgbW9kZQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9QU01vZGVfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQotewotICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKQotICAgIHsKLSAgICAgICAgaWYgKChzdHJjbXAoYXJnLCAiTWF4X1BTUCIpID09IDApIHx8Ci0JCQkoc3RyY21wKGFyZywgIm1heF9wc3AiKSA9PSAwKSB8fAotCQkJKHN0cmNtcChhcmcsICJNQVhfUFNQIikgPT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQotICAgICAgICAgICAgLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCi0gICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOwotICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOwotICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gNTsKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiRmFzdF9QU1AiKSA9PSAwKSB8fAotCQkJCSAoc3RyY21wKGFyZywgImZhc3RfcHNwIikgPT0gMCkgfHwKLSAgICAgICAgICAgICAgICAgKHN0cmNtcChhcmcsICJGQVNUX1BTUCIpID09IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKLSAgICAgICAgICAgIC8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgotICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKLSAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCi0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOwotICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUDsKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIkxlZ2FjeV9QU1AiKSA9PSAwKSB8fAotICAgICAgICAgICAgICAgICAoc3RyY21wKGFyZywgImxlZ2FjeV9wc3AiKSA9PSAwKSB8fAotICAgICAgICAgICAgICAgICAoc3RyY21wKGFyZywgIkxFR0FDWV9QU1AiKSA9PSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCi0gICAgICAgICAgICAvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KLSAgICAgICAgICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7Ci0gICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQOwotICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQOwotICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy9EZWZhdWx0IE5kaXM4MDJfMTFQb3dlck1vZGVDQU0KLSAgICAgICAgICAgIC8vIGNsZWFyIFBTTSBiaXQgaW1tZWRpYXRlbHkKLSAgICAgICAgICAgIE1sbWVTZXRQc21CaXQocEFkYXB0ZXIsIFBXUl9BQ1RJVkUpOwotICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKLSAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCi0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOwotICAgICAgICB9Ci0KLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1BTTW9kZV9Qcm9jOjooUFNNb2RlPSVsZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFdwYVN1cHBvcnQgZmxhZy4KLSAgICBWYWx1ZToKLSAgICAgICAgMDogRHJpdmVyIGlnbm9yZSB3cGFfc3VwcGxpY2FudC4KLSAgICAgICAgMTogd3BhX3N1cHBsaWNhbnQgaW5pdGlhdGVzIHNjYW5uaW5nIGFuZCBBUCBzZWxlY3Rpb24uCi0gICAgICAgIDI6IGRyaXZlciB0YWtlcyBjYXJlIG9mIHNjYW5uaW5nLCBBUCBzZWxlY3Rpb24sIGFuZCBJRUVFIDgwMi4xMSBhc3NvY2lhdGlvbiBwYXJhbWV0ZXJzLgotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9XcGFfU3VwcG9ydCgKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0KLSAgICBpZiAoIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKLSAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRTsKLSAgICBlbHNlIGlmICggc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAxKQotICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEU7Ci0gICAgZWxzZSBpZiAoIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMikKLSAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFX1dJVEhfV0VCX1VJOwotICAgIGVsc2UKLSAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRTsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XcGFfU3VwcG9ydDo6KFdwYVN1cHBsaWNhbnRVUD0lZClcbiIsIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVCBTZXRfVEduV2lmaVRlc3RfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKLXsKLSAgICBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQotICAgICAgICBwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QgPSBGQUxTRTsKLSAgICBlbHNlCi0gICAgICAgIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCA9IFRSVUU7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfVEduV2lmaVRlc3RfUHJvYzo6KGJUR25XaWZpVGVzdD0lZClcbiIsIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCkpOwotCXJldHVybiBUUlVFOwotfQotCi1JTlQgU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVFhfUlRZX0NGR19TVFJVQwl0eF9ydHlfY2ZnOwotCVVDSEFSCQkJCUxvbmdSZXRyeUxpbWl0ID0gKFVDSEFSKXNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7Ci0JdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQgPSBMb25nUmV0cnlMaW1pdDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsIHR4X3J0eV9jZmcud29yZCk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2M6Oih0eF9ydHlfY2ZnPTB4JXgpXG4iLCB0eF9ydHlfY2ZnLndvcmQpKTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UIFNldF9TaG9ydFJldHJ5TGltaXRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlUWF9SVFlfQ0ZHX1NUUlVDCXR4X3J0eV9jZmc7Ci0JVUNIQVIJCQkJU2hvcnRSZXRyeUxpbWl0ID0gKFVDSEFSKXNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooTmV0d29ya1R5cGU9JWQpXG4iLAorCQkgIHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSkpOwogCi0JUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOwotCXR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdCA9IFNob3J0UmV0cnlMaW1pdDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsIHR4X3J0eV9jZmcud29yZCk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jOjoodHhfcnR5X2NmZz0weCV4KVxuIiwgdHhfcnR5X2NmZy53b3JkKSk7CiAJcmV0dXJuIFRSVUU7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3VzYl9tYWluX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC91c2JfbWFpbl9kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjVhMjM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC91c2JfbWFpbl9kZXYuYwpAQCAtMCwwICsxLDg4NyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicnRfY29uZmlnLmgiCisKKy8qIEZvbGxvd2luZyBpbmZvcm1hdGlvbiB3aWxsIGJlIHNob3cgd2hlbiB5b3UgcnVuICdtb2RpbmZvJyAqLworLyogKioqIElmIHlvdSBoYXZlIGEgc29sdXRpb24gZm9yIHRoZSBidWcgaW4gY3VycmVudCB2ZXJzaW9uIG9mIGRyaXZlciwgcGxlYXNlIG1haWwgdG8gbWUuICovCisvKiBPdGhlcndpc2UgcG9zdCB0byBmb3J1bSBpbiByYWxpbmt0ZWNoJ3Mgd2ViIHNpdGUod3d3LnJhbGlua3RlY2guY29tKSBhbmQgbGV0IGFsbCB1c2VycyBoZWxwIHlvdS4gKioqICovCitNT0RVTEVfQVVUSE9SKCJQYXVsIExpbiA8cGF1bF9saW5AcmFsaW5rdGVjaC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJUMjg3MC9SVDMwNzAgV2lyZWxlc3MgTGFuIExpbnV4IERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworI2lmZGVmIE1PRFVMRV9WRVJTSU9OCitNT0RVTEVfVkVSU0lPTihTVEFfRFJJVkVSX1ZFUlNJT04pOworI2VuZGlmCisKKy8qIG1vZHVsZSB0YWJsZSAqLworc3RydWN0IHVzYl9kZXZpY2VfaWQgcnR1c2JfdXNiX2lkW10gPSB7CisjaWZkZWYgUlQyODcwCisJe1VTQl9ERVZJQ0UoMHgxNDhGLCAweDI3NzApfSwJLyogUmFsaW5rICovCisJe1VTQl9ERVZJQ0UoMHgxNDhGLCAweDI4NzApfSwJLyogUmFsaW5rICovCisJe1VTQl9ERVZJQ0UoMHgwN0I4LCAweDI4NzApfSwJLyogQWJvQ29tICovCisJe1VTQl9ERVZJQ0UoMHgwN0I4LCAweDI3NzApfSwJLyogQWJvQ29tICovCisJe1VTQl9ERVZJQ0UoMHgwREY2LCAweDAwMzkpfSwJLyogU2l0ZWNvbSAyNzcwICovCisJe1VTQl9ERVZJQ0UoMHgwODNBLCAweDc1MTIpfSwJLyogQXJjYWR5YW4gMjc3MCAqLworCXtVU0JfREVWSUNFKDB4MDc4OSwgMHgwMTYyKX0sCS8qIExvZ2l0ZWMgMjg3MCAqLworCXtVU0JfREVWSUNFKDB4MDc4OSwgMHgwMTYzKX0sCS8qIExvZ2l0ZWMgMjg3MCAqLworCXtVU0JfREVWSUNFKDB4MDc4OSwgMHgwMTY0KX0sCS8qIExvZ2l0ZWMgMjg3MCAqLworCXtVU0JfREVWSUNFKDB4MTc3ZiwgMHgwMzAyKX0sCS8qIGxzdXNiICovCisJe1VTQl9ERVZJQ0UoMHgwQjA1LCAweDE3MzEpfSwJLyogQXN1cyAqLworCXtVU0JfREVWSUNFKDB4MEIwNSwgMHgxNzMyKX0sCS8qIEFzdXMgKi8KKwl7VVNCX0RFVklDRSgweDBCMDUsIDB4MTc0Mil9LAkvKiBBc3VzICovCisJe1VTQl9ERVZJQ0UoMHgwREY2LCAweDAwMTcpfSwJLyogU2l0ZWNvbSAqLworCXtVU0JfREVWSUNFKDB4MERGNiwgMHgwMDJCKX0sCS8qIFNpdGVjb20gKi8KKwl7VVNCX0RFVklDRSgweDBERjYsIDB4MDAyQyl9LAkvKiBTaXRlY29tICovCisJe1VTQl9ERVZJQ0UoMHgwREY2LCAweDAwMkQpfSwJLyogU2l0ZWNvbSAqLworCXtVU0JfREVWSUNFKDB4MTRCMiwgMHgzQzA2KX0sCS8qIENvbmNlcHRyb25pYyAqLworCXtVU0JfREVWSUNFKDB4MTRCMiwgMHgzQzI4KX0sCS8qIENvbmNlcHRyb25pYyAqLworCXtVU0JfREVWSUNFKDB4MjAxOSwgMHhFRDA2KX0sCS8qIFBsYW5leCBDb21tdW5pY2F0aW9ucywgSW5jLiAqLworCXtVU0JfREVWSUNFKDB4MDdEMSwgMHgzQzA5KX0sCS8qIEQtTGluayAqLworCXtVU0JfREVWSUNFKDB4MDdEMSwgMHgzQzExKX0sCS8qIEQtTGluayAqLworCXtVU0JfREVWSUNFKDB4MTRCMiwgMHgzQzA3KX0sCS8qIEFMICovCisJe1VTQl9ERVZJQ0UoMHgwNTBELCAweDgwNTMpfSwJLyogQmVsa2luICovCisJe1VTQl9ERVZJQ0UoMHgxNEIyLCAweDNDMjMpfSwJLyogQWlybGluayAqLworCXtVU0JfREVWSUNFKDB4MTRCMiwgMHgzQzI3KX0sCS8qIEFpcmxpbmsgKi8KKwl7VVNCX0RFVklDRSgweDA3QUEsIDB4MDAyRil9LAkvKiBDb3JlZ2EgKi8KKwl7VVNCX0RFVklDRSgweDA3QUEsIDB4MDAzQyl9LAkvKiBDb3JlZ2EgKi8KKwl7VVNCX0RFVklDRSgweDA3QUEsIDB4MDAzRil9LAkvKiBDb3JlZ2EgKi8KKwl7VVNCX0RFVklDRSgweDEwNDQsIDB4ODAwQil9LAkvKiBHaWdhYnl0ZSAqLworCXtVU0JfREVWSUNFKDB4MTVBOSwgMHgwMDA2KX0sCS8qIFNwYXJrbGFuICovCisJe1VTQl9ERVZJQ0UoMHgwODNBLCAweEI1MjIpfSwJLyogU01DICovCisJe1VTQl9ERVZJQ0UoMHgwODNBLCAweEE2MTgpfSwJLyogU01DICovCisJe1VTQl9ERVZJQ0UoMHgwODNBLCAweDg1MjIpfSwJLyogQXJjYWR5YW4gKi8KKwl7VVNCX0RFVklDRSgweDA4M0EsIDB4NzUyMil9LAkvKiBBcmNhZHlhbiAqLworCXtVU0JfREVWSUNFKDB4MENERSwgMHgwMDIyKX0sCS8qIFpDT00gKi8KKwl7VVNCX0RFVklDRSgweDA1ODYsIDB4MzQxNil9LAkvKiBaeXhlbCAqLworCXtVU0JfREVWSUNFKDB4MENERSwgMHgwMDI1KX0sCS8qIFp5eGVsICovCisJe1VTQl9ERVZJQ0UoMHgxNzQwLCAweDk3MDEpfSwJLyogRW5HZW5pdXMgKi8KKwl7VVNCX0RFVklDRSgweDE3NDAsIDB4OTcwMil9LAkvKiBFbkdlbml1cyAqLworCXtVU0JfREVWSUNFKDB4MDQ3MSwgMHgyMDBmKX0sCS8qIFBoaWxpcHMgKi8KKwl7VVNCX0RFVklDRSgweDE0QjIsIDB4M0MyNSl9LAkvKiBEcmF5dGVrICovCisJe1VTQl9ERVZJQ0UoMHgxM0QzLCAweDMyNDcpfSwJLyogQXp1cmVXYXZlICovCisJe1VTQl9ERVZJQ0UoMHgwODNBLCAweDY2MTgpfSwJLyogQWNjdG9uICovCisJe1VTQl9ERVZJQ0UoMHgxNWM1LCAweDAwMDgpfSwJLyogQW1pdCAqLworCXtVU0JfREVWSUNFKDB4MEU2NiwgMHgwMDAxKX0sCS8qIEhhd2tpbmcgKi8KKwl7VVNCX0RFVklDRSgweDBFNjYsIDB4MDAwMyl9LAkvKiBIYXdraW5nICovCisJe1VTQl9ERVZJQ0UoMHgxMjlCLCAweDE4MjgpfSwJLyogU2llbWVucyAqLworCXtVU0JfREVWSUNFKDB4MTU3RSwgMHgzMDBFKX0sCS8qIFUtTWVkaWEgKi8KKwl7VVNCX0RFVklDRSgweDA1MGQsIDB4ODA1Yyl9LAorCXtVU0JfREVWSUNFKDB4MDUwZCwgMHg4MTVjKX0sCisJe1VTQl9ERVZJQ0UoMHgxNDgyLCAweDNDMDkpfSwJLyogQWJvY29tICovCisJe1VTQl9ERVZJQ0UoMHgxNEIyLCAweDNDMDkpfSwJLyogQWxwaGEgKi8KKwl7VVNCX0RFVklDRSgweDA0RTgsIDB4MjAxOCl9LAkvKiBzYW1zdW5nICovCisJe1VTQl9ERVZJQ0UoMHg1QTU3LCAweDAyODApfSwJLyogWmlud2VsbCAqLworCXtVU0JfREVWSUNFKDB4NUE1NywgMHgwMjgyKX0sCS8qIFppbndlbGwgKi8KKwl7VVNCX0RFVklDRSgweDczOTIsIDB4NzcxOCl9LAorCXtVU0JfREVWSUNFKDB4NzM5MiwgMHg3NzE3KX0sCisJe1VTQl9ERVZJQ0UoMHgxNzM3LCAweDAwNzApfSwJLyogTGlua3N5cyBXVVNCMTAwICovCisJe1VTQl9ERVZJQ0UoMHgxNzM3LCAweDAwNzEpfSwJLyogTGlua3N5cyBXVVNCNjAwTiAqLworCXtVU0JfREVWSUNFKDB4MDQxMSwgMHgwMGU4KX0sCS8qIEJ1ZmZhbG8gV0xJLVVDLUczMDBOICovCisJe1VTQl9ERVZJQ0UoMHgwNTBkLCAweDgxNWMpfSwJLyogQmVsa2luIEY1RDgwNTMgKi8KKyNlbmRpZiAvKiBSVDI4NzAgLy8gKi8KKyNpZmRlZiBSVDMwNzAKKwl7VVNCX0RFVklDRSgweDE0OEYsIDB4MzA3MCl9LAkvKiBSYWxpbmsgMzA3MCAqLworCXtVU0JfREVWSUNFKDB4MTQ4RiwgMHgzMDcxKX0sCS8qIFJhbGluayAzMDcxICovCisJe1VTQl9ERVZJQ0UoMHgxNDhGLCAweDMwNzIpfSwJLyogUmFsaW5rIDMwNzIgKi8KKwl7VVNCX0RFVklDRSgweDBEQjAsIDB4MzgyMCl9LAkvKiBSYWxpbmsgMzA3MCAqLworCXtVU0JfREVWSUNFKDB4MERGNiwgMHgwMDNFKX0sCS8qIFNpdGVjb20gMzA3MCAqLworCXtVU0JfREVWSUNFKDB4MERGNiwgMHgwMDQyKX0sCS8qIFNpdGVjb20gMzA3MiAqLworCXtVU0JfREVWSUNFKDB4MTRCMiwgMHgzQzEyKX0sCS8qIEFMIDMwNzAgKi8KKwl7VVNCX0RFVklDRSgweDE4QzUsIDB4MDAxMil9LAkvKiBDb3JlZ2EgMzA3MCAqLworCXtVU0JfREVWSUNFKDB4MDgzQSwgMHg3NTExKX0sCS8qIEFyY2FkeWFuIDMwNzAgKi8KKwl7VVNCX0RFVklDRSgweDE3NDAsIDB4OTcwMyl9LAkvKiBFbkdlbml1cyAzMDcwICovCisJe1VTQl9ERVZJQ0UoMHgxNzQwLCAweDk3MDUpfSwJLyogRW5HZW5pdXMgMzA3MSAqLworCXtVU0JfREVWSUNFKDB4MTc0MCwgMHg5NzA2KX0sCS8qIEVuR2VuaXVzIDMwNzIgKi8KKwl7VVNCX0RFVklDRSgweDEzRDMsIDB4MzI3Myl9LAkvKiBBenVyZVdhdmUgMzA3MCAqLworCXtVU0JfREVWSUNFKDB4MTA0NCwgMHg4MDBEKX0sCS8qIEdpZ2FieXRlIEdOLVdCMzJMIDMwNzAgKi8KKwl7VVNCX0RFVklDRSgweDIwMTksIDB4QUIyNSl9LAkvKiBQbGFuZXggQ29tbXVuaWNhdGlvbnMsIEluYy4gUlQzMDcwICovCisJe1VTQl9ERVZJQ0UoMHgwN0I4LCAweDMwNzApfSwJLyogQWJvQ29tIDMwNzAgKi8KKwl7VVNCX0RFVklDRSgweDA3QjgsIDB4MzA3MSl9LAkvKiBBYm9Db20gMzA3MSAqLworCXtVU0JfREVWSUNFKDB4MDdCOCwgMHgzMDcyKX0sCS8qIEFib2NvbSAzMDcyICovCisJe1VTQl9ERVZJQ0UoMHg3MzkyLCAweDc3MTEpfSwJLyogRWRpbWF4IDMwNzAgKi8KKwl7VVNCX0RFVklDRSgweDFBMzIsIDB4MDMwNCl9LAkvKiBRdWFudGEgMzA3MCAqLworCXtVU0JfREVWSUNFKDB4MUVEQSwgMHgyMzEwKX0sCS8qIEFpclRpZXMgMzA3MCAqLworCXtVU0JfREVWSUNFKDB4MDdEMSwgMHgzQzBBKX0sCS8qIEQtTGluayAzMDcyICovCisJe1VTQl9ERVZJQ0UoMHgwN0QxLCAweDNDMEQpfSwJLyogRC1MaW5rIDMwNzAgKi8KKwl7VVNCX0RFVklDRSgweDA3RDEsIDB4M0MwRSl9LAkvKiBELUxpbmsgMzA3MCAqLworCXtVU0JfREVWSUNFKDB4MDdEMSwgMHgzQzBGKX0sCS8qIEQtTGluayAzMDcwICovCisJe1VTQl9ERVZJQ0UoMHgxRDRELCAweDAwMEMpfSwJLyogUGVnYXRyb24gQ29ycG9yYXRpb24gMzA3MCAqLworCXtVU0JfREVWSUNFKDB4MUQ0RCwgMHgwMDBFKX0sCS8qIFBlZ2F0cm9uIENvcnBvcmF0aW9uIDMwNzAgKi8KKwl7VVNCX0RFVklDRSgweDVBNTcsIDB4NTI1Nyl9LAkvKiBaaW53ZWxsIDMwNzAgKi8KKwl7VVNCX0RFVklDRSgweDVBNTcsIDB4MDI4Myl9LAkvKiBaaW53ZWxsIDMwNzIgKi8KKwl7VVNCX0RFVklDRSgweDA0QkIsIDB4MDk0NSl9LAkvKiBJLU8gREFUQSAzMDcyICovCisJe1VTQl9ERVZJQ0UoMHgyMDNELCAweDE0ODApfSwJLyogRW5jb3JlIDMwNzAgKi8KKyNlbmRpZiAvKiBSVDMwNzAgLy8gKi8KKwl7VVNCX0RFVklDRSgweDBERjYsIDB4MDAzRil9LAkvKiBTaXRlY29tIFdMLTYwOCAqLworCXtVU0JfREVWSUNFKDB4MTczNywgMHgwMDc3KX0sCS8qIExpbmtzeXMgV1VTQjU0R0MtRVUgdjMgKi8KKwl7VVNCX0RFVklDRSgweDIwMDEsIDB4M0MwOSl9LAkvKiBELUxpbmsgKi8KKwl7VVNCX0RFVklDRSgweDIwMDEsIDB4M0MwQSl9LAkvKiBELUxpbmsgMzA3MiAqLworCXtVU0JfREVWSUNFKDB4MjAxOSwgMHhFRDE0KX0sCS8qIFBsYW5leCBDb21tdW5pY2F0aW9ucywgSW5jLiAqLworCXt9CQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK2ludCBjb25zdCBydHVzYl91c2JfaWRfbGVuID0KKyAgICBzaXplb2YocnR1c2JfdXNiX2lkKSAvIHNpemVvZihzdHJ1Y3QgdXNiX2RldmljZV9pZCk7CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBydHVzYl91c2JfaWQpOworCitzdGF0aWMgdm9pZCBydDI4NzBfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBydDI4NzBfcHJvYmUoSU4gc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkJICBJTiBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwKKwkJCQkgIElOIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICpkZXZfaWQsCisJCQkJICBzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICoqIHBwQWQpOworCisjaWZuZGVmIFBGX05PRlJFRVpFCisjZGVmaW5lIFBGX05PRlJFRVpFICAwCisjZW5kaWYKKworZXh0ZXJuIGludCBydDI4eHhfY2xvc2UoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworZXh0ZXJuIGludCBydDI4eHhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CisKK3N0YXRpYyBCT09MRUFOIFVTQkRldkNvbmZpZ0luaXQoSU4gc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKKwkJCQlJTiBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCQlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIENoZWNrIHRoZSBjaGlwc2V0IHZlbmRvci9wcm9kdWN0IElELgorCitBcmd1bWVudHM6CisgICAgX2Rldl9wCQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQorCitSZXR1cm4gVmFsdWU6CisgICAgVFJVRQkJCQlDaGVjayBvaworCUZBTFNFCQkJCUNoZWNrIGZhaWwKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUlQyOFhYQ2hpcHNldENoZWNrKElOIHZvaWQgKl9kZXZfcCkKK3sKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKV9kZXZfcDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2X3AgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXUzMiBpOworCisJZm9yIChpID0gMDsgaSA8IHJ0dXNiX3VzYl9pZF9sZW47IGkrKykgeworCQlpZiAoZGV2X3AtPmRlc2NyaXB0b3IuaWRWZW5kb3IgPT0gcnR1c2JfdXNiX2lkW2ldLmlkVmVuZG9yICYmCisJCSAgICBkZXZfcC0+ZGVzY3JpcHRvci5pZFByb2R1Y3QgPT0gcnR1c2JfdXNiX2lkW2ldLmlkUHJvZHVjdCkgeworCQkJcHJpbnRrKCJydDI4NzA6IGlkVmVuZG9yID0gMHgleCwgaWRQcm9kdWN0ID0gMHgleFxuIiwKKwkJCSAgICAgICBkZXZfcC0+ZGVzY3JpcHRvci5pZFZlbmRvciwKKwkJCSAgICAgICBkZXZfcC0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaSA9PSBydHVzYl91c2JfaWRfbGVuKSB7CisJCXByaW50aygicnQyODcwOiBFcnJvciEgRGV2aWNlIERlc2NyaXB0b3Igbm90IG1hdGNoaW5nIVxuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyp0ZXN0ZWQgZm9yIGtlcm5lbCAyLjZzZXJpZXMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBydDI4NzBfc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKK3N0YXRpYyBpbnQgcnQyODcwX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CisjZW5kaWYgLyogQ09ORklHX1BNIC8vICovCisKK3N0YXRpYyBpbnQgcnR1c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOworc3RhdGljIHZvaWQgcnR1c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CisKK3N0YXRpYyBCT09MRUFOIFVTQkRldkNvbmZpZ0luaXQoSU4gc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKKwkJCQlJTiBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCQlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYzsKKwl1bnNpZ25lZCBsb25nIEJ1bGtPdXRJZHg7CisJdTMyIGk7CisKKwkvKiBnZXQgdGhlIGFjdGl2ZSBpbnRlcmZhY2UgZGVzY3JpcHRvciAqLworCWlmYWNlX2Rlc2MgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKKworCS8qIGdldCAjIG9mIGVucG9pbnRzICAqLworCXBBZC0+TnVtYmVyT2ZQaXBlcyA9IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiTnVtRW5kcG9pbnRzPSVkXG4iLCBpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHMpKTsKKworCS8qIENvbmZpZ3VyZSBQaXBlcyAqLworCUJ1bGtPdXRJZHggPSAwOworCisJZm9yIChpID0gMDsgaSA8IHBBZC0+TnVtYmVyT2ZQaXBlczsgaSsrKSB7CisJCWlmICgoaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy5ibUF0dHJpYnV0ZXMgPT0KKwkJICAgICBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSAmJgorCQkgICAgKChpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJFbmRwb2ludEFkZHJlc3MgJgorCQkgICAgICBVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfSU4pKSB7CisJCQlwQWQtPkJ1bGtJbkVwQWRkciA9CisJCQkgICAgaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy5iRW5kcG9pbnRBZGRyZXNzOworCQkJcEFkLT5CdWxrSW5NYXhQYWNrZXRTaXplID0KKwkJCSAgICBsZTJjcHUxNihpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLgorCQkJCSAgICAgd01heFBhY2tldFNpemUpOworCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkJICAgICAoIkJVTEsgSU4gTWF4UGFja2V0U2l6ZSA9ICVkXG4iLAorCQkJCSAgICAgIHBBZC0+QnVsa0luTWF4UGFja2V0U2l6ZSkpOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAgICAgKCJFUCBhZGRyZXNzID0gMHglMnhcbiIsCisJCQkJICAgICAgaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy4KKwkJCQkgICAgICBiRW5kcG9pbnRBZGRyZXNzKSk7CisJCX0gZWxzZQorCQkgICAgaWYgKChpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJtQXR0cmlidXRlcyA9PQorCQkJIFVTQl9FTkRQT0lOVF9YRkVSX0JVTEspCisJCQkmJgorCQkJKChpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLgorCQkJICBiRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PQorCQkJIFVTQl9ESVJfT1VUKSkgeworCQkJLyogdGhlcmUgYXJlIDYgYnVsayBvdXQgRVAuIEVQNiBoaWdoZXN0IHByaW9yaXR5LiAqLworCQkJLyogRVAxLTQgaXMgRURDQS4gIEVQNSBpcyBIQ0NBLiAqLworCQkJcEFkLT5CdWxrT3V0RXBBZGRyW0J1bGtPdXRJZHgrK10gPQorCQkJICAgIGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2MuYkVuZHBvaW50QWRkcmVzczsKKwkJCXBBZC0+QnVsa091dE1heFBhY2tldFNpemUgPQorCQkJICAgIGxlMmNwdTE2KGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2MuCisJCQkJICAgICB3TWF4UGFja2V0U2l6ZSk7CisKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkgICAgICgiQlVMSyBPVVQgTWF4UGFja2V0U2l6ZSA9ICVkXG4iLAorCQkJCSAgICAgIHBBZC0+QnVsa091dE1heFBhY2tldFNpemUpKTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkgICAgICgiRVAgYWRkcmVzcyA9IDB4JTJ4ICBcbiIsCisJCQkJICAgICAgaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy4KKwkJCQkgICAgICBiRW5kcG9pbnRBZGRyZXNzKSk7CisJCX0KKwl9CisKKwlpZiAoIShwQWQtPkJ1bGtJbkVwQWRkciAmJiBwQWQtPkJ1bGtPdXRFcEFkZHJbMF0pKSB7CisJCXByaW50aworCQkgICAgKCIlczogQ291bGQgbm90IGZpbmQgYm90aCBidWxrLWluIGFuZCBidWxrLW91dCBlbmRwb2ludHNcbiIsCisJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXBBZC0+Y29uZmlnID0gJmRldi0+Y29uZmlnLT5kZXNjOworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgcEFkKTsKKworCXJldHVybiBUUlVFOworCit9CisKK3N0YXRpYyBpbnQgcnR1c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXY7CisJaW50IHJ2OworCisJZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlkZXYgPSB1c2JfZ2V0X2RldihkZXYpOworCisJcnYgPSBydDI4NzBfcHJvYmUoaW50ZiwgZGV2LCBpZCwgJnBBZCk7CisJaWYgKHJ2ICE9IDApCisJCXVzYl9wdXRfZGV2KGRldik7CisKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyB2b2lkIHJ0dXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCisJcEFkID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCisJcnQyODcwX2Rpc2Nvbm5lY3QoZGV2LCBwQWQpOworfQorCitzdHJ1Y3QgdXNiX2RyaXZlciBydHVzYl9kcml2ZXIgPSB7CisJLm5hbWUgPSAicnQyODcwIiwKKwkucHJvYmUgPSBydHVzYl9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IHJ0dXNiX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlID0gcnR1c2JfdXNiX2lkLAorCisjaWZkZWYgQ09ORklHX1BNCitzdXNwZW5kOnJ0Mjg3MF9zdXNwZW5kLAorcmVzdW1lOnJ0Mjg3MF9yZXN1bWUsCisjZW5kaWYKK307CisKKyNpZmRlZiBDT05GSUdfUE0KKwordm9pZCBSVDI4NzBSZWplY3RQZW5kaW5nUGFja2V0cyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJLyogY2xlYXIgUFMgcGFja2V0cyAqLworCS8qIGNsZWFyIFR4U3cgcGFja2V0cyAqLworfQorCitzdGF0aWMgaW50IHJ0Mjg3MF9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODcwX3N1c3BlbmQoKVxuIikpOworCW5ldF9kZXYgPSBwQWQtPm5ldF9kZXY7CisJbmV0aWZfZGV2aWNlX2RldGFjaChuZXRfZGV2KTsKKworCXBBZC0+UE1fRmxnU3VzcGVuZCA9IDE7CisJaWYgKG5ldGlmX3J1bm5pbmcobmV0X2RldikpIHsKKwkJUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQKHBBZCk7CisJCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAocEFkKTsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBydDI4NzBfc3VzcGVuZCgpXG4iKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQyODcwX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4NzBfcmVzdW1lKClcbiIpKTsKKworCXBBZC0+UE1fRmxnU3VzcGVuZCA9IDA7CisJbmV0X2RldiA9IHBBZC0+bmV0X2RldjsKKwluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldF9kZXYpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldF9kZXYpOworCW5ldGlmX2NhcnJpZXJfb24obmV0X2Rldik7CisJbmV0aWZfd2FrZV9xdWV1ZShuZXRfZGV2KTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODcwX3Jlc3VtZSgpXG4iKSk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNIC8vICovCisKKy8qIEluaXQgZHJpdmVyIG1vZHVsZSAqLworaW50IF9faW5pdCBydHVzYl9pbml0KHZvaWQpCit7CisJcHJpbnRrKCJydHVzYiBpbml0IC0tLT5cbiIpOworCXJldHVybiB1c2JfcmVnaXN0ZXIoJnJ0dXNiX2RyaXZlcik7Cit9CisKKy8qIERlaW5pdCBkcml2ZXIgbW9kdWxlICovCit2b2lkIF9fZXhpdCBydHVzYl9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJnJ0dXNiX2RyaXZlcik7CisJcHJpbnRrKCI8LS0tIHJ0dXNiIGV4aXRcbiIpOworfQorCittb2R1bGVfaW5pdChydHVzYl9pbml0KTsKK21vZHVsZV9leGl0KHJ0dXNiX2V4aXQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLworLyogZnVuY3Rpb24gZGVjbGFyYXRpb25zCQkJCQkJCQkJCQkJKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSovCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgTUxNRSBrZXJuZWwgdGhyZWFkLgorCitBcmd1bWVudHM6CisJKkNvbnRleHQJCQl0aGUgcEFkLCBkcml2ZXIgY29udHJvbCBibG9jayBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKyAgICAwCQkJCQljbG9zZSB0aGUgdGhyZWFkCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgTWxtZVRocmVhZChJTiB2b2lkICpDb250ZXh0KQoreworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZDsKKwlzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpwVGFzazsKKwlpbnQgc3RhdHVzOworCXN0YXR1cyA9IDA7CisKKwlwVGFzayA9IChzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICopQ29udGV4dDsKKwlwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKXBUYXNrLT5wcml2OworCisJUnRtcE9TVGFza0N1c3RvbWl6ZShwVGFzayk7CisKKwl3aGlsZSAoIXBUYXNrLT50YXNrX2tpbGxlZCkgeworI2lmZGVmIEtUSFJFQURfU1VQUE9SVAorCQlSVE1QX1dBSVRfRVZFTlRfSU5URVJSVVBUSUJMRShwQWQsIHBUYXNrKTsKKyNlbHNlCisJCVJUTVBfU0VNX0VWRU5UX1dBSVQoJihwVGFzay0+dGFza1NlbWEpLCBzdGF0dXMpOworCisJCS8qIHVubG9jayB0aGUgZGV2aWNlIHBvaW50ZXJzICovCisJCWlmIChzdGF0dXMgIT0gMCkgeworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisKKwkJLyogbG9jayB0aGUgZGV2aWNlIHBvaW50ZXJzICwgbmVlZCB0byBjaGVjayBpZiByZXF1aXJlZCAqLworCQkvKmRvd24oJihwQWQtPnVzYmRldl9zZW1hcGhvcmUpKTsgKi8KKworCQlpZiAoIXBBZC0+UE1fRmxnU3VzcGVuZCkKKwkJCU1sbWVIYW5kbGVyKHBBZCk7CisJfQorCisJLyogbm90aWZ5IHRoZSBleGl0IHJvdXRpbmUgdGhhdCB3ZSdyZSBhY3R1YWxseSBleGl0aW5nIG5vdworCSAqCisJICogY29tcGxldGUoKS93YWl0X2Zvcl9jb21wbGV0aW9uKCkgaXMgc2ltaWxhciB0byB1cCgpL2Rvd24oKSwKKwkgKiBleGNlcHQgdGhhdCBjb21wbGV0ZSgpIGlzIHNhZmUgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHN0cnVjdHVyZQorCSAqIGlzIGdldHRpbmcgZGVsZXRlZCBpbiBhIHBhcmFsbGVsIG1vZGUgb2YgZXhlY3V0aW9uIChpLmUuIGp1c3QKKwkgKiBhZnRlciB0aGUgZG93bigpIC0tIHRoYXQncyBuZWNlc3NhcnkgZm9yIHRoZSB0aHJlYWQtc2h1dGRvd24KKwkgKiBjYXNlLgorCSAqCisJICogY29tcGxldGVfYW5kX2V4aXQoKSBnb2VzIGV2ZW4gZnVydGhlciB0aGFuIHRoaXMgLS0gaXQgaXMgc2FmZSBpbgorCSAqIHRoZSBjYXNlIHRoYXQgdGhlIHRocmVhZCBvZiB0aGUgY2FsbGVyIGlzIGdvaW5nIGF3YXkgKG5vdCBqdXN0CisJICogdGhlIHN0cnVjdHVyZSkgLS0gdGhpcyBpcyBuZWNlc3NhcnkgZm9yIHRoZSBtb2R1bGUtcmVtb3ZlIGNhc2UuCisJICogVGhpcyBpcyBpbXBvcnRhbnQgaW4gcHJlZW1wdGlvbiBrZXJuZWxzLCB3aGljaCB0cmFuc2ZlciB0aGUgZmxvdworCSAqIG9mIGV4ZWN1dGlvbiBpbW1lZGlhdGVseSB1cG9uIGEgY29tcGxldGUoKS4KKwkgKi8KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0tJXNcbiIsIF9fRlVOQ1RJT05fXykpOworI2lmbmRlZiBLVEhSRUFEX1NVUFBPUlQKKwlwVGFzay0+dGFza1BJRCA9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKwljb21wbGV0ZV9hbmRfZXhpdCgmcFRhc2stPnRhc2tDb21wbGV0ZSwgMCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKKworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFVTQiBjb21tYW5kIGtlcm5lbCB0aHJlYWQuCisKK0FyZ3VtZW50czoKKwkqQ29udGV4dAkJCXRoZSBwQWQsIGRyaXZlciBjb250cm9sIGJsb2NrIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIDAJCQkJCWNsb3NlIHRoZSB0aHJlYWQKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBSVFVTQkNtZFRocmVhZChJTiB2b2lkICpDb250ZXh0KQoreworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZDsKKwlzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpwVGFzazsKKwlpbnQgc3RhdHVzOworCXN0YXR1cyA9IDA7CisKKwlwVGFzayA9IChzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICopQ29udGV4dDsKKwlwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKXBUYXNrLT5wcml2OworCisJUnRtcE9TVGFza0N1c3RvbWl6ZShwVGFzayk7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKwlwQWQtPkNtZFEuQ21kUVN0YXRlID0gUlRNUF9UQVNLX1NUQVRfUlVOTklORzsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKworCXdoaWxlIChwQWQgJiYgcEFkLT5DbWRRLkNtZFFTdGF0ZSA9PSBSVE1QX1RBU0tfU1RBVF9SVU5OSU5HKSB7CisjaWZkZWYgS1RIUkVBRF9TVVBQT1JUCisJCVJUTVBfV0FJVF9FVkVOVF9JTlRFUlJVUFRJQkxFKHBBZCwgcFRhc2spOworI2Vsc2UKKwkJLyogbG9jayB0aGUgZGV2aWNlIHBvaW50ZXJzICovCisJCVJUTVBfU0VNX0VWRU5UX1dBSVQoJihwVGFzay0+dGFza1NlbWEpLCBzdGF0dXMpOworCisJCWlmIChzdGF0dXMgIT0gMCkgeworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisKKwkJaWYgKHBBZC0+Q21kUS5DbWRRU3RhdGUgPT0gUlRNUF9UQVNLX1NUQVRfU1RPUEVEKQorCQkJYnJlYWs7CisKKwkJaWYgKCFwQWQtPlBNX0ZsZ1N1c3BlbmQpCisJCQlDTURIYW5kbGVyKHBBZCk7CisJfQorCisJaWYgKHBBZCAmJiAhcEFkLT5QTV9GbGdTdXNwZW5kKSB7CS8qIENsZWFyIHRoZSBDbWRRRWxlbWVudHMuICovCisJCXN0cnVjdCBydF9jbWRxZWxtdCAqcENtZFFFbG10ID0gTlVMTDsKKworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKwkJcEFkLT5DbWRRLkNtZFFTdGF0ZSA9IFJUTVBfVEFTS19TVEFUX1NUT1BFRDsKKwkJd2hpbGUgKHBBZC0+Q21kUS5zaXplKSB7CisJCQlSVFVTQkRlcXVldWVDbWQoJnBBZC0+Q21kUSwgJnBDbWRRRWxtdCk7CisJCQlpZiAocENtZFFFbG10KSB7CisJCQkJaWYgKHBDbWRRRWxtdC0+Q21kRnJvbU5kaXMgPT0gVFJVRSkgeworCQkJCQlpZiAocENtZFFFbG10LT5idWZmZXIgIT0gTlVMTCkKKwkJCQkJCW9zX2ZyZWVfbWVtKHBBZCwKKwkJCQkJCQkgICAgcENtZFFFbG10LT5idWZmZXIpOworCQkJCQlvc19mcmVlX21lbShwQWQsICh1OCAqKXBDbWRRRWxtdCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKChwQ21kUUVsbXQtPmJ1ZmZlciAhPSBOVUxMKQorCQkJCQkgICAgJiYgKHBDbWRRRWxtdC0+YnVmZmVybGVuZ3RoICE9IDApKQorCQkJCQkJb3NfZnJlZV9tZW0ocEFkLAorCQkJCQkJCSAgICBwQ21kUUVsbXQtPmJ1ZmZlcik7CisJCQkJCW9zX2ZyZWVfbWVtKHBBZCwgKHU4ICopcENtZFFFbG10KTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKwl9CisJLyogbm90aWZ5IHRoZSBleGl0IHJvdXRpbmUgdGhhdCB3ZSdyZSBhY3R1YWxseSBleGl0aW5nIG5vdworCSAqCisJICogY29tcGxldGUoKS93YWl0X2Zvcl9jb21wbGV0aW9uKCkgaXMgc2ltaWxhciB0byB1cCgpL2Rvd24oKSwKKwkgKiBleGNlcHQgdGhhdCBjb21wbGV0ZSgpIGlzIHNhZmUgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHN0cnVjdHVyZQorCSAqIGlzIGdldHRpbmcgZGVsZXRlZCBpbiBhIHBhcmFsbGVsIG1vZGUgb2YgZXhlY3V0aW9uIChpLmUuIGp1c3QKKwkgKiBhZnRlciB0aGUgZG93bigpIC0tIHRoYXQncyBuZWNlc3NhcnkgZm9yIHRoZSB0aHJlYWQtc2h1dGRvd24KKwkgKiBjYXNlLgorCSAqCisJICogY29tcGxldGVfYW5kX2V4aXQoKSBnb2VzIGV2ZW4gZnVydGhlciB0aGFuIHRoaXMgLS0gaXQgaXMgc2FmZSBpbgorCSAqIHRoZSBjYXNlIHRoYXQgdGhlIHRocmVhZCBvZiB0aGUgY2FsbGVyIGlzIGdvaW5nIGF3YXkgKG5vdCBqdXN0CisJICogdGhlIHN0cnVjdHVyZSkgLS0gdGhpcyBpcyBuZWNlc3NhcnkgZm9yIHRoZSBtb2R1bGUtcmVtb3ZlIGNhc2UuCisJICogVGhpcyBpcyBpbXBvcnRhbnQgaW4gcHJlZW1wdGlvbiBrZXJuZWxzLCB3aGljaCB0cmFuc2ZlciB0aGUgZmxvdworCSAqIG9mIGV4ZWN1dGlvbiBpbW1lZGlhdGVseSB1cG9uIGEgY29tcGxldGUoKS4KKwkgKi8KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0tUlRVU0JDbWRUaHJlYWRcbiIpKTsKKworI2lmbmRlZiBLVEhSRUFEX1NVUFBPUlQKKwlwVGFzay0+dGFza1BJRCA9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKwljb21wbGV0ZV9hbmRfZXhpdCgmcFRhc2stPnRhc2tDb21wbGV0ZSwgMCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKKworfQorCit2b2lkIFJUVVNCV2F0Y2hEb2coc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQ7CisJaW50IGlkeDsKKwl1bnNpZ25lZCBsb25nIGlycUZsYWdzOworCVBVUkIgcFVyYjsKKwlCT09MRUFOIG5lZWREdW1wU2VxID0gRkFMU0U7CisJdTMyIE1BQ1ZhbHVlOworCXUzMiBUeFJ4UV9QY250OworCisJaWR4ID0gMDsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYUlhRX1BDTlQsICZNQUNWYWx1ZSk7CisJaWYgKChNQUNWYWx1ZSAmIDB4ZmYpICE9IDApIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJUWCBRVUVVRSAwIE5vdCBFTVBUWShWYWx1ZT0weCUweCkhXG4iLAorCQkJICBNQUNWYWx1ZSkpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfQ0ZHLCAweGY0MDAxMik7CisJCXdoaWxlICgoTUFDVmFsdWUgJiAweGZmKSAhPSAwICYmIChpZHgrKyA8IDEwKSkgeworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWFJYUV9QQ05ULCAmTUFDVmFsdWUpOworCQkJUlRNUHVzZWNEZWxheSgxKTsKKwkJfQorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfQ0ZHLCAweGY0MDAwNik7CisJfQorCisJaWYgKHBBZC0+d2F0Y2hEb2dSeE92ZXJGbG93Q250ID49IDIpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJNYXliZSB0aGUgUnggQnVsay1JbiBoYW5nZWQhIENhbmNlbCB0aGUgcGVuZGluZyBSeCBidWxrcyByZXF1ZXN0IVxuIikpOworCQlpZiAoKCFSVE1QX1RFU1RfRkxBRworCQkgICAgIChwQWQsCisJCSAgICAgIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJICAgICAgIGZSVE1QX0FEQVBURVJfQlVMS0lOX1JFU0VUIHwKKwkJICAgICAgIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8CisJCSAgICAgICBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkNhbGwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU4gdG8gY2FuY2VsIHRoZSBwZW5kaW5nIFJ4IEJ1bGshXG4iKSk7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQpOworCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19JTiwKKwkJCQkJCU5VTEwsIDApOworCQkJbmVlZER1bXBTZXEgPSBUUlVFOworCQl9CisJCXBBZC0+d2F0Y2hEb2dSeE92ZXJGbG93Q250ID0gMDsKKwl9CisKKwlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIDB4NDM4LCAmVHhSeFFfUGNudCk7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IE5VTV9PRl9UWF9SSU5HOyBpZHgrKykgeworCQlwVXJiID0gTlVMTDsKKworCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW2lkeF0sIGlycUZsYWdzKTsKKwkJaWYgKChwQWQtPkJ1bGtPdXRQZW5kaW5nW2lkeF0gPT0gVFJVRSkKKwkJICAgICYmIHBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnQpIHsKKwkJCWludCBhY3R1YWxfbGVuZ3RoID0gMCwgdHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IDA7CisJCQlCT09MRUFOIGlzRGF0YVBhY2tldCA9IEZBTFNFOworCQkJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFtpZHhdKys7CisKKwkJCWlmICgocEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFtpZHhdID4gMikgJiYKKwkJCSAgICAoIVJUTVBfVEVTVF9GTEFHCisJCQkgICAgIChwQWQsCisJCQkgICAgICAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJCQkgICAgICAgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCSAgICAgICBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QgfAorCQkJICAgICAgIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQkJICAgICkgeworCQkJCS8qIEZJWE1FOiBGb2xsb3dpbmcgY29kZSBqdXN0IHN1cHBvcnQgc2luZ2xlIGJ1bGsgb3V0LiBJZiB5b3Ugd2FubmEgc3VwcG9ydCBtdWx0aXBsZSBidWxrIG91dC4gTW9kaWZ5IGl0ISAqLworCQkJCXBIVFRYQ29udGV4dCA9CisJCQkJICAgIChzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCAqKSgmcEFkLT5UeENvbnRleHRbaWR4XSk7CisJCQkJaWYgKHBIVFRYQ29udGV4dC0+SVJQUGVuZGluZykgewkvKiBDaGVjayBUeENvbnRleHQuICovCisJCQkJCXBVcmIgPSBwSFRUWENvbnRleHQtPnBVcmI7CisKKwkJCQkJYWN0dWFsX2xlbmd0aCA9IHBVcmItPmFjdHVhbF9sZW5ndGg7CisJCQkJCXRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPQorCQkJCQkgICAgcFVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aDsKKwkJCQkJaXNEYXRhUGFja2V0ID0gVFJVRTsKKwkJCQl9IGVsc2UgaWYgKGlkeCA9PSBNR01UUElQRUlEWCkgeworCQkJCQlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcE1MTUVDb250ZXh0LCAqcE5VTExDb250ZXh0LAorCQkJCQkgICAgKnBQc1BvbGxDb250ZXh0OworCisJCQkJCS8qQ2hlY2sgTWdtdENvbnRleHQuICovCisJCQkJCXBNTE1FQ29udGV4dCA9CisJCQkJCSAgICAoc3RydWN0IHJ0X3R4X2NvbnRleHQgKikocEFkLT5NZ210UmluZy4KKwkJCQkJCQkgICBDZWxsW3BBZC0+TWdtdFJpbmcuCisJCQkJCQkJCVR4RG1hSWR4XS4KKwkJCQkJCQkgICBBbGxvY1ZhKTsKKwkJCQkJcFBzUG9sbENvbnRleHQgPQorCQkJCQkgICAgKHN0cnVjdCBydF90eF9jb250ZXh0ICopKCZwQWQtPlBzUG9sbENvbnRleHQpOworCQkJCQlwTlVMTENvbnRleHQgPQorCQkJCQkgICAgKHN0cnVjdCBydF90eF9jb250ZXh0ICopKCZwQWQtPk51bGxDb250ZXh0KTsKKworCQkJCQlpZiAocE1MTUVDb250ZXh0LT5JUlBQZW5kaW5nKSB7CisJCQkJCQlBU1NFUlQocE1MTUVDb250ZXh0LT4KKwkJCQkJCSAgICAgICBJUlBQZW5kaW5nKTsKKwkJCQkJCXBVcmIgPSBwTUxNRUNvbnRleHQtPnBVcmI7CisJCQkJCX0gZWxzZSBpZiAocE5VTExDb250ZXh0LT5JUlBQZW5kaW5nKSB7CisJCQkJCQlBU1NFUlQocE5VTExDb250ZXh0LT4KKwkJCQkJCSAgICAgICBJUlBQZW5kaW5nKTsKKwkJCQkJCXBVcmIgPSBwTlVMTENvbnRleHQtPnBVcmI7CisJCQkJCX0gZWxzZSBpZiAocFBzUG9sbENvbnRleHQtPklSUFBlbmRpbmcpIHsKKwkJCQkJCUFTU0VSVChwUHNQb2xsQ29udGV4dC0+CisJCQkJCQkgICAgICAgSVJQUGVuZGluZyk7CisJCQkJCQlwVXJiID0gcFBzUG9sbENvbnRleHQtPnBVcmI7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbaWR4XSwKKwkJCQkJCWlycUZsYWdzKTsKKworCQkJCXByaW50ayhLRVJOX0lORk8gIiVkOiVsdSBMVEw9JWQgLCBUTD0lZCBMOiVkXG4iLAorCQkJCSAgICAgICBpZHgsIHBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbaWR4XSwKKwkJCQkgICAgICAgcEFkLT5UcmFuc2ZlcmVkTGVuZ3RoW2lkeF0sCisJCQkJICAgICAgIGFjdHVhbF9sZW5ndGgsIHRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOworCisJCQkJaWYgKHBVcmIpIHsKKwkJCQkJaWYgKChpc0RhdGFQYWNrZXQKKwkJCQkJICAgICAmJiBwQWQtPlRyYW5zZmVyZWRMZW5ndGhbaWR4XSA9PQorCQkJCQkgICAgIGFjdHVhbF9sZW5ndGgKKwkJCQkJICAgICAmJiBwQWQtPlRyYW5zZmVyZWRMZW5ndGhbaWR4XSA8CisJCQkJCSAgICAgdHJhbnNmZXJfYnVmZmVyX2xlbmd0aAorCQkJCQkgICAgICYmIGFjdHVhbF9sZW5ndGggIT0gMAorLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFR4UnhRX1BjbnQ9PTAgKi8KKwkJCQkJICAgICAmJiBwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250W2lkeF0gPgorCQkJCQkgICAgIDMpCisJCQkJCSAgICB8fCBpc0RhdGFQYWNrZXQgPT0gRkFMU0UKKwkJCQkJICAgIHx8IHBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbaWR4XSA+CisJCQkJCSAgICA2KSB7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCQkgKCJNYXliZSB0aGUgVHggQnVsay1PdXQgaGFuZ2VkISBDYW5jZWwgdGhlIHBlbmRpbmcgVHggYnVsa3MgcmVxdWVzdCBvZiBpZHgoJWQpIVxuIiwKKwkJCQkJCQkgIGlkeCkpOworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkJICgiVW5saW5rIHRoZSBwZW5kaW5nIFVSQiFcbiIpKTsKKwkJCQkJCS8qIHVubGluayBpdCBub3cgKi8KKwkJCQkJCVJUVVNCX1VOTElOS19VUkIocFVyYik7CisJCQkJCQkvKiBTbGVlcCAyMDAgbWljcm9zZWNvbmRzIHRvIGdpdmUgY2FuY2VsbGF0aW9uIHRpbWUgdG8gd29yayAqLworCQkJCQkJLypSVE1QdXNlY0RlbGF5KDIwMCk7ICovCisJCQkJCQluZWVkRHVtcFNlcSA9IFRSVUU7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJCSAoIlVua25vd24gYnVsa091dCBVUkIgbWF5YmUgaGFuZ2VkIVxuIikpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW2lkeF0sCisJCQkJCQlpcnFGbGFncyk7CisJCQl9CisKKwkJCWlmIChpc0RhdGFQYWNrZXQgPT0gVFJVRSkKKwkJCQlwQWQtPlRyYW5zZmVyZWRMZW5ndGhbaWR4XSA9IGFjdHVhbF9sZW5ndGg7CisJCX0gZWxzZSB7CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbaWR4XSwgaXJxRmxhZ3MpOworCQl9CisJfQorCisJLyogRm9yIFNpZ21hIGRlYnVnLCBkdW1wIHRoZSBiYV9yZW9yZGVyaW5nIHNlcXVlbmNlLiAqLworCWlmICgobmVlZER1bXBTZXEgPT0gVFJVRSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9PSAwKSkgeworCQl1MTYgSWR4OworCQlzdHJ1Y3QgcnRfYmFfcmVjX2VudHJ5ICpwQkFFbnRyeSA9IE5VTEw7CisJCXU4IGNvdW50ID0gMDsKKwkJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGs7CisKKwkJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5CQVJlY1djaWRBcnJheVswXTsKKworCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOworCQlpZiAoKHBCQUVudHJ5LT5saXN0LnFsZW4gPiAwKSAmJiAocEJBRW50cnktPmxpc3QubmV4dCAhPSBOVUxMKSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiTklDVXBkYXRlUmF3Q291bnRlcnMoKTpUaGUgUXVldWVpbmcgcGt0IGluIHJlb3JkZXJpbmcgYnVmZmVyOlxuIikpOworCQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CisJCQltcGR1X2JsayA9IHBCQUVudHJ5LT5saXN0Lm5leHQ7CisJCQl3aGlsZSAobXBkdV9ibGspIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiXHQlZDpTZXEtJWQsIGJBTVNEVS0lZCFcbiIsIGNvdW50LAorCQkJCQkgIG1wZHVfYmxrLT5TZXF1ZW5jZSwKKwkJCQkJICBtcGR1X2Jsay0+YkFNU0RVKSk7CisJCQkJbXBkdV9ibGsgPSBtcGR1X2Jsay0+bmV4dDsKKwkJCQljb3VudCsrOworCQkJfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJcbnBCQUVudHJ5LT5MYXN0SW5kU2VxPSVkIVxuIiwKKwkJCQkgIHBCQUVudHJ5LT5MYXN0SW5kU2VxKSk7CisJCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKKwkJfQorCX0KK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBSZWxlYXNlIGFsbG9jYXRlZCByZXNvdXJjZXMuCisKK0FyZ3VtZW50czoKKyAgICAqZGV2CQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQorCXBBZAkJCQkJZHJpdmVyIGNvbnRyb2wgYmxvY2sgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgTm9uZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIHZvaWQgcnQyODcwX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkgKCJydHVzYl9kaXNjb25uZWN0OiB1bnJlZ2lzdGVyIHVzYm5ldCB1c2ItJXMtJXNcbiIsCisJCSAgZGV2LT5idXMtPmJ1c19uYW1lLCBkZXYtPmRldnBhdGgpKTsKKwlpZiAoIXBBZCkgeworCQl1c2JfcHV0X2RldihkZXYpOworCQlwcmludGsoInJ0dXNiX2Rpc2Nvbm5lY3Q6IHBBZCA9PSBOVUxMIVxuIik7CisJCXJldHVybjsKKwl9CisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCk7CisKKwkvKiBmb3IgZGVidWcsIHdhaXQgdG8gc2hvdyBzb21lIG1lc3NhZ2VzIHRvIC9wcm9jIHN5c3RlbSAqLworCXVkZWxheSgxKTsKKworCVJ0bXBQaHlOZXREZXZFeGl0KHBBZCwgcEFkLT5uZXRfZGV2KTsKKworCS8qIEZJWE1FOiBTaGFsbCB3ZSBuZWVkIGZvbGxvd2luZyBkZWxheSBhbmQgZmx1c2ggdGhlIHNjaGVkdWxlPz8gKi8KKwl1ZGVsYXkoMSk7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwl1ZGVsYXkoMSk7CisKKwkvKiBmcmVlIHRoZSByb290IG5ldF9kZXZpY2UgKi8KKwlSdG1wT1NOZXREZXZGcmVlKHBBZC0+bmV0X2Rldik7CisKKwlSdG1wUmFEZXZDdHJsRXhpdChwQWQpOworCisJLyogcmVsZWFzZSBhIHVzZSBvZiB0aGUgdXNiIGRldmljZSBzdHJ1Y3R1cmUgKi8KKwl1c2JfcHV0X2RldihkZXYpOworCXVkZWxheSgxKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiBSVFVTQiBkaXNjb25uZWN0IHN1Y2Nlc3NmdWxseVxuIikpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBydDI4NzBfcHJvYmUoSU4gc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkJICBJTiBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwKKwkJCQkgIElOIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICpkZXZfaWQsCisJCQkJICBzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICoqIHBwQWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBOVUxMOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopTlVMTDsKKwlpbnQgc3RhdHVzLCBydjsKKwl2b2lkICpoYW5kbGU7CisJc3RydWN0IHJ0X3J0bXBfb3NfbmV0ZGV2X29wX2hvb2sgbmV0RGV2SG9vazsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5ydDI4NzBfcHJvYmUoKSFcbiIpKTsKKworCS8qIENoZWNrIGNoaXBzZXQgdmVuZG9yL3Byb2R1Y3QgSUQgKi8KKwkvKmlmIChSVDI4WFhDaGlwc2V0Q2hlY2soX2Rldl9wKSA9PSBGQUxTRSkgKi8KKwkvKiAgICAgIGdvdG8gZXJyX291dDsgKi8KKworLypSdG1wRGV2SW5pdD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCS8qIEFsbG9jYXRlIHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgYWRhcHRlciBzdHJ1Y3R1cmUgKi8KKwloYW5kbGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgb3NfY29va2llKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGhhbmRsZSA9PSBOVUxMKSB7CisJCXByaW50aworCQkgICAgKCJydDI4NzBfcHJvYmUoKTogQWxsb2NhdGUgbWVtb3J5IGZvciBvcyBoYW5kbGUgZmFpbGVkIVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkoKHN0cnVjdCBvc19jb29raWUgKiloYW5kbGUpLT5wVXNiX0RldiA9IHVzYl9kZXY7CisKKwlydiA9IFJUTVBBbGxvY0FkYXB0ZXJCbG9jayhoYW5kbGUsICZwQWQpOworCWlmIChydiAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCWtmcmVlKGhhbmRsZSk7CisJCWdvdG8gZXJyX291dDsKKwl9CisvKlVTQkRldkluaXQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisJaWYgKFVTQkRldkNvbmZpZ0luaXQodXNiX2RldiwgaW50ZiwgcEFkKSA9PSBGQUxTRSkKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmFkZXY7CisKKwlSdG1wUmFEZXZDdHJsSW5pdChwQWQsIFJUTVBfREVWX0lORl9VU0IpOworCisvKk5ldERldkluaXQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisJbmV0X2RldiA9IFJ0bXBQaHlOZXREZXZJbml0KHBBZCwgJm5ldERldkhvb2spOworCWlmIChuZXRfZGV2ID09IE5VTEwpCisJCWdvdG8gZXJyX291dF9mcmVlX3JhZGV2OworCisJLyogSGVyZSBhcmUgdGhlIG5ldF9kZXZpY2Ugc3RydWN0dXJlIHdpdGggdXNiIHNwZWNpZmljIHBhcmFtZXRlcnMuICovCisJLyogZm9yIHN1cHBvcnRpbmcgTmV0d29yayBNYW5hZ2VyLgorCSAqIFNldCB0aGUgc3lzZnMgcGh5c2ljYWwgZGV2aWNlIHJlZmVyZW5jZSBmb3IgdGhlIG5ldHdvcmsgbG9naWNhbCBkZXZpY2UgaWYgc2V0IHByaW9yIHRvIHJlZ2lzdHJhdGlvbiB3aWxsCisJICogY2F1c2UgYSBzeW1saW5rIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKwkgKi8KKwlTRVRfTkVUREVWX0RFVihuZXRfZGV2LCAmKHVzYl9kZXYtPmRldikpOworCisJcEFkLT5TdGFDZmcuT3JpRGV2VHlwZSA9IG5ldF9kZXYtPnR5cGU7CisKKy8qQWxsIGRvbmUsIGl0J3MgdGltZSB0byByZWdpc3RlciB0aGUgbmV0IGRldmljZSB0byBsaW51eCBrZXJuZWwuICovCisJLyogUmVnaXN0ZXIgdGhpcyBkZXZpY2UgKi8KKwlzdGF0dXMgPSBSdG1wT1NOZXREZXZBdHRhY2gobmV0X2RldiwgJm5ldERldkhvb2spOworCWlmIChzdGF0dXMgIT0gMCkKKwkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OworCisjaWZkZWYgS1RIUkVBRF9TVVBQT1JUCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcEFkLT5tbG1lVGFzay5rdGhyZWFkX3EpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBBZC0+dGltZXJUYXNrLmt0aHJlYWRfcSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcEFkLT5jbWRRVGFzay5rdGhyZWFkX3EpOworI2VuZGlmCisKKwkqcHBBZCA9IHBBZDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT1ydDI4NzBfcHJvYmUoKSFcbiIpKTsKKworCXJldHVybiAwOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVSUk9SIEhBTkRMRSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2Vycl9vdXRfZnJlZV9uZXRkZXY6CisJUnRtcE9TTmV0RGV2RnJlZShuZXRfZGV2KTsKKworZXJyX291dF9mcmVlX3JhZGV2OgorCVJUTVBGcmVlQWRhcHRlcihwQWQpOworCitlcnJfb3V0OgorCSpwcEFkID0gTlVMTDsKKworCXJldHVybiAtMTsKKworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC93cGEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvd3BhLmgKaW5kZXggNzAwNmUzOC4uNjE5OWFlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC93cGEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3dwYS5oCkBAIC0zOCw3ICszOCw3IEBACiAjaWZuZGVmCV9fV1BBX0hfXwogI2RlZmluZQlfX1dQQV9IX18KIAotLy8gRUFQT0wgS2V5IGRlc2NyaXB0ZXIgZnJhbWUgZm9ybWF0IHJlbGF0ZWQgbGVuZ3RoCisvKiBFQVBPTCBLZXkgZGVzY3JpcHRlciBmcmFtZSBmb3JtYXQgcmVsYXRlZCBsZW5ndGggKi8KICNkZWZpbmUgTEVOX0tFWV9ERVNDX05PTkNFCQkJMzIKICNkZWZpbmUgTEVOX0tFWV9ERVNDX0lWCQkJCTE2CiAjZGVmaW5lIExFTl9LRVlfREVTQ19SU0MJCQk4CkBAIC00NiwzOSArNDYsMzggQEAKICNkZWZpbmUgTEVOX0tFWV9ERVNDX1JFUExBWQkJCTgKICNkZWZpbmUgTEVOX0tFWV9ERVNDX01JQwkJCTE2CiAKLS8vIFRoZSBsZW5ndGggaXMgdGhlIEVBUG9MLUtleSBmcmFtZSBleGNlcHQga2V5IGRhdGEgZmllbGQuCi0vLyBQbGVhc2UgcmVmZXIgdG8gODAyLjExaS0yMDA0ICxGaWd1cmUgNDN1IGluIHAuNzgKLSNkZWZpbmUgTEVOX0VBUE9MX0tFWV9NU0cJCQkoc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUUpCisvKiBUaGUgbGVuZ3RoIGlzIHRoZSBFQVBvTC1LZXkgZnJhbWUgZXhjZXB0IGtleSBkYXRhIGZpZWxkLiAqLworLyogUGxlYXNlIHJlZmVyIHRvIDgwMi4xMWktMjAwNCAsRmlndXJlIDQzdSBpbiBwLjc4ICovCisjZGVmaW5lIExFTl9FQVBPTF9LRVlfTVNHCQkJKHNpemVvZihzdHJ1Y3QgcnRfa2V5X2Rlc2NyaXB0ZXIpIC0gTUFYX0xFTl9PRl9SU05JRSkKIAotLy8gRUFQIENvZGUgVHlwZS4KKy8qIEVBUCBDb2RlIFR5cGUuICovCiAjZGVmaW5lIEVBUF9DT0RFX1JFUVVFU1QJMQogI2RlZmluZSBFQVBfQ09ERV9SRVNQT05TRQkyCiAjZGVmaW5lIEVBUF9DT0RFX1NVQ0NFU1MgICAgMwogI2RlZmluZSBFQVBfQ09ERV9GQUlMVVJFICAgIDQKIAotLy8gRUFQT0wgZnJhbWUgUHJvdG9jb2wgVmVyc2lvbgorLyogRUFQT0wgZnJhbWUgUHJvdG9jb2wgVmVyc2lvbiAqLwogI2RlZmluZQlFQVBPTF9WRVIJCQkJCTEKICNkZWZpbmUJRUFQT0xfVkVSMgkJCQkJMgogCi0vLyBFQVBPTC1LRVkgRGVzY3JpcHRvciBUeXBlCisvKiBFQVBPTC1LRVkgRGVzY3JpcHRvciBUeXBlICovCiAjZGVmaW5lCVdQQTFfS0VZX0RFU0MJCQkJMHhmZQogI2RlZmluZSBXUEEyX0tFWV9ERVNDICAgICAgICAgICAgICAgMHgwMgogCi0vLyBLZXkgRGVzY3JpcHRvciBWZXJzaW9uIG9mIEtleSBJbmZvcm1hdGlvbgorLyogS2V5IERlc2NyaXB0b3IgVmVyc2lvbiBvZiBLZXkgSW5mb3JtYXRpb24gKi8KICNkZWZpbmUJREVTQ19UWVBFX1RLSVAJCQkJMQogI2RlZmluZQlERVNDX1RZUEVfQUVTCQkJCTIKLSNkZWZpbmUgREVTQ19UWVBFX01FU0gJCQkJMwogCiAjZGVmaW5lIExFTl9NU0cxXzJXQVkgICAgICAgICAgICAgICAweDdmCiAjZGVmaW5lIE1BWF9MRU5fT0ZfRUFQX0hTICAgICAgICAgICAyNTYKIAogI2RlZmluZSBMRU5fTUFTVEVSX0tFWQkJCQkzMgogCi0vLyBFQVBPTCBFSywgTUsKKy8qIEVBUE9MIEVLLCBNSyAqLwogI2RlZmluZSBMRU5fRUFQX0VLCQkJCQkxNgogI2RlZmluZSBMRU5fRUFQX01JQ0sJCQkJMTYKICNkZWZpbmUgTEVOX0VBUF9LRVkJCQkJCSgoTEVOX0VBUF9FSykrKExFTl9FQVBfTUlDSykpCi0vLyBUS0lQIGtleSByZWxhdGVkCisvKiBUS0lQIGtleSByZWxhdGVkICovCiAjZGVmaW5lIExFTl9QTUtJRAkJCQkJMTYKICNkZWZpbmUgTEVOX1RLSVBfRUsJCQkJCTE2CiAjZGVmaW5lIExFTl9US0lQX1JYTUlDSwkJCQk4CkBAIC05MCwxMiArODksMTggQEAKICNkZWZpbmUgVEtJUF9BUF9SWE1JQ0tfT0ZGU0VUCQkoVEtJUF9BUF9UWE1JQ0tfT0ZGU0VUK0xFTl9US0lQX1RYTUlDSykKICNkZWZpbmUgVEtJUF9HVEtfTEVOR1RICQkJCSgoTEVOX1RLSVBfRUspKyhMRU5fVEtJUF9SWE1JQ0spKyhMRU5fVEtJUF9UWE1JQ0spKQogI2RlZmluZSBMRU5fUFRLCQkJCQkJKChMRU5fRUFQX0tFWSkrKExFTl9US0lQX0tFWSkpCisjZGVmaW5lIE1JTl9MRU5fT0ZfR1RLCQkJCTUKKyNkZWZpbmUgTEVOX1BNSwkJCQkJCTMyCisjZGVmaW5lIExFTl9QTUtfTkFNRQkJCQkxNgorI2RlZmluZSBMRU5fTk9OQ0UJCQkJCTMyCiAKLS8vIFJTTiBJRSBMZW5ndGggZGVmaW5pdGlvbgotI2RlZmluZSBNQVhfTEVOX09GX1JTTklFICAgICAgICAgCTkwCisvKiBSU04gSUUgTGVuZ3RoIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgTUFYX0xFTl9PRl9SU05JRQkJMjU1CiAjZGVmaW5lIE1JTl9MRU5fT0ZfUlNOSUUgICAgICAgICAJOAogCi0vL0VBUCBQYWNrZXQgVHlwZQorI2RlZmluZSBLRVlfTElGRVRJTUUJCQkJMzYwMAorCisvKkVBUCBQYWNrZXQgVHlwZSAqLwogI2RlZmluZQlFQVBQYWNrZXQJCTAKICNkZWZpbmUJRUFQT0xTdGFydAkJMQogI2RlZmluZQlFQVBPTExvZ29mZgkJMgpAQCAtMTE0LDExICsxMTksMzMgQEAKICNkZWZpbmUgUEFJUldJU0VLRVkJCQkJCTEKICNkZWZpbmUgR1JPVVBLRVkJCQkJCTAKIAotLy8gUmV0cnkgdGltZXIgY291bnRlciBpbml0aWFsIHZhbHVlCisvKiBSZXRyeSB0aW1lciBjb3VudGVyIGluaXRpYWwgdmFsdWUgKi8KICNkZWZpbmUgUEVFUl9NU0cxX1JFVFJZX1RJTUVSX0NUUiAgICAgICAgICAgMAogI2RlZmluZSBQRUVSX01TRzNfUkVUUllfVElNRVJfQ1RSICAgICAgICAgICAxMAogI2RlZmluZSBHUk9VUF9NU0cxX1JFVFJZX1RJTUVSX0NUUiAgICAgICAgICAyMAogCisvKiNpZmRlZiBDT05GSUdfQVBfU1VQUE9SVCAqLworLyogV1BBIG1lY2hhbmlzbSByZXRyeSB0aW1lciBpbnRlcnZhbCAqLworI2RlZmluZSBQRUVSX01TRzFfUkVUUllfRVhFQ19JTlRWICAgICAgICAgICAxMDAwCS8qIDEgc2VjICovCisjZGVmaW5lIFBFRVJfTVNHM19SRVRSWV9FWEVDX0lOVFYgICAgICAgICAgIDMwMDAJLyogMyBzZWMgKi8KKyNkZWZpbmUgR1JPVVBfS0VZX1VQREFURV9FWEVDX0lOVFYgICAgICAgICAgMTAwMAkvKiAxIHNlYyAqLworI2RlZmluZSBQRUVSX0dST1VQX0tFWV9VUERBVEVfSU5JVgkJCTIwMDAJLyogMiBzZWMgKi8KKworI2RlZmluZSBFTlFVRVVFX0VBUE9MX1NUQVJUX1RJTUVSCQkJMjAwCS8qIDIwMCBtcyAqLworCisvKiBncm91cCByZWtleSBpbnRlcnZhbCAqLworI2RlZmluZSBUSU1FX1JFS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBLVF9SRUtFWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRElTQUJMRV9SRUtFWSAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNQVhfUkVLRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgTUFYX1JFS0VZX0lOVEVSICAgICAgICAgICAgICAgICAgICAgMHgzZmZmZmZmCisvKiNlbmRpZiAvLyBDT05GSUdfQVBfU1VQUE9SVCAvLyAqLworCisjZGVmaW5lIEdST1VQX1NVSVRFCQkJCQkwCisjZGVmaW5lIFBBSVJXSVNFX1NVSVRFCQkJCTEKKyNkZWZpbmUgQUtNX1NVSVRFCQkJCQkyCisjZGVmaW5lIFBNS0lEX0xJU1QJCQkJCTMKIAogI2RlZmluZSBFQVBPTF9TVEFSVF9ESVNBQkxFCQkJCQkwCiAjZGVmaW5lIEVBUE9MX1NUQVJUX1BTSwkJCQkJCTEKQEAgLTEyOSwxMiArMTU2LDMzIEBACiAjZGVmaW5lIE1JWF9DSVBIRVJfV1BBMl9US0lQX09OKHgpICAgICAgKCgoeCkgJiAweDAyKSAhPSAwKQogI2RlZmluZSBNSVhfQ0lQSEVSX1dQQTJfQUVTX09OKHgpICAgICAgICgoKHgpICYgMHgwMSkgIT0gMCkKIAorI2lmbmRlZiBST1VORF9VUAogI2RlZmluZSBST1VORF9VUChfX3gsIF9feSkgXAotCSgoKFVMT05HKSgoX194KSsoKF9feSktMSkpKSAmICgoVUxPTkcpfigoX195KS0xKSkpCisJKCgodW5zaWduZWQgbG9uZykoKF9feCkrKChfX3kpLTEpKSkgJiAoKHVuc2lnbmVkIGxvbmcpfigoX195KS0xKSkpCisjZW5kaWYKKworI2RlZmluZQlTRVRfdTE2X1RPX0FSUkFSWShfViwgX0xFTikJCVwKK3sJCQkJCQkJCQkJCVwKKwlfVlswXSA9IChfTEVOICYgMHhGRjAwKSA+PiA4OwkJCVwKKwlfVlsxXSA9IChfTEVOICYgMHhGRik7CQkJCQlcCit9CisKKyNkZWZpbmUJSU5DX3UxNl9UT19BUlJBUlkoX1YsIF9MRU4pCQkJXAorewkJCQkJCQkJCQkJCVwKKwl1MTYJdmFyX2xlbjsJCQkJCQkJXAorCQkJCQkJCQkJCQkJXAorCXZhcl9sZW4gPSAoX1ZbMF08PDgpIHwgKF9WWzFdKTsJCQkJXAorCXZhcl9sZW4gKz0gX0xFTjsJCQkJCQkJXAorCQkJCQkJCQkJCQkJXAorCV9WWzBdID0gKHZhcl9sZW4gJiAweEZGMDApID4+IDg7CQkJXAorCV9WWzFdID0gKHZhcl9sZW4gJiAweEZGKTsJCQkJCVwKK30KKworI2RlZmluZQlDT05WX0FSUkFSWV9UT191MTYoX1YpCSgoX1ZbMF08PDgpIHwgKF9WWzFdKSkKIAogI2RlZmluZQlBRERfT05FX1RvXzY0QklUX1ZBUihfVikJCVwKIHsJCQkJCQkJCQkJXAotCVVDSEFSCWNudCA9IExFTl9LRVlfREVTQ19SRVBMQVk7CVwKKwl1OAljbnQgPSBMRU5fS0VZX0RFU0NfUkVQTEFZOwlcCiAJZG8JCQkJCQkJCQlcCiAJewkJCQkJCQkJCVwKIAkJY250LS07CQkJCQkJCVwKQEAgLTE0NiwxODIgKzE5NCwyMDAgQEAKIAogI2RlZmluZSBJU19XUEFfQ0FQQUJJTElUWShhKSAgICAgICAoKChhKSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpICYmICgoYSkgPD0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0spKQogCi0vLyBFQVBPTCBLZXkgSW5mb3JtYXRpb24gZGVmaW5pdGlvbiB3aXRoaW4gS2V5IGRlc2NyaXB0b3IgZm9ybWF0Ci10eXBlZGVmCXN0cnVjdCBQQUNLRUQgX0tFWV9JTkZPCi17Ci0JVUNIQVIJS2V5TWljOjE7Ci0JVUNIQVIJU2VjdXJlOjE7Ci0JVUNIQVIJRXJyb3I6MTsKLQlVQ0hBUglSZXF1ZXN0OjE7Ci0JVUNIQVIJRUtEX0RMOjE7ICAgICAgIC8vIEVLRCBmb3IgQVA7IERMIGZvciBTVEEKLQlVQ0hBUglSc3ZkOjM7Ci0JVUNIQVIJS2V5RGVzY1ZlcjozOwotCVVDSEFSCUtleVR5cGU6MTsKLQlVQ0hBUglLZXlJbmRleDoyOwotCVVDSEFSCUluc3RhbGw6MTsKLQlVQ0hBUglLZXlBY2s6MTsKLX0JS0VZX0lORk8sICpQS0VZX0lORk87CisvKiBFQVBPTCBLZXkgSW5mb3JtYXRpb24gZGVmaW5pdGlvbiB3aXRoaW4gS2V5IGRlc2NyaXB0b3IgZm9ybWF0ICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2tleV9pbmZvIHsKKwl1OCBLZXlNaWM6MTsKKwl1OCBTZWN1cmU6MTsKKwl1OCBFcnJvcjoxOworCXU4IFJlcXVlc3Q6MTsKKwl1OCBFS0RfREw6MTsJCS8qIEVLRCBmb3IgQVA7IERMIGZvciBTVEEgKi8KKwl1OCBSc3ZkOjM7CisJdTggS2V5RGVzY1ZlcjozOworCXU4IEtleVR5cGU6MTsKKwl1OCBLZXlJbmRleDoyOworCXU4IEluc3RhbGw6MTsKKwl1OCBLZXlBY2s6MTsKK307CiAKLS8vIEVBUE9MIEtleSBkZXNjcmlwdG9yIGZvcm1hdAotdHlwZWRlZglzdHJ1Y3QgUEFDS0VEIF9LRVlfREVTQ1JJUFRFUgotewotCVVDSEFSCQlUeXBlOwotCUtFWV9JTkZPCUtleUluZm87Ci0JVUNIQVIJCUtleUxlbmd0aFsyXTsKLQlVQ0hBUgkJUmVwbGF5Q291bnRlcltMRU5fS0VZX0RFU0NfUkVQTEFZXTsKLQlVQ0hBUgkJS2V5Tm9uY2VbTEVOX0tFWV9ERVNDX05PTkNFXTsKLQlVQ0hBUgkJS2V5SXZbTEVOX0tFWV9ERVNDX0lWXTsKLQlVQ0hBUgkJS2V5UnNjW0xFTl9LRVlfREVTQ19SU0NdOwotCVVDSEFSCQlLZXlJZFtMRU5fS0VZX0RFU0NfSURdOwotCVVDSEFSCQlLZXlNaWNbTEVOX0tFWV9ERVNDX01JQ107Ci0JVUNIQVIJCUtleURhdGFMZW5bMl07Ci0JVUNIQVIJCUtleURhdGFbTUFYX0xFTl9PRl9SU05JRV07Ci19CUtFWV9ERVNDUklQVEVSLCAqUEtFWV9ERVNDUklQVEVSOworLyogRUFQT0wgS2V5IGRlc2NyaXB0b3IgZm9ybWF0ICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2tleV9kZXNjcmlwdGVyIHsKKwl1OCBUeXBlOworCXN0cnVjdCBydF9rZXlfaW5mbyBLZXlJbmZvOworCXU4IEtleUxlbmd0aFsyXTsKKwl1OCBSZXBsYXlDb3VudGVyW0xFTl9LRVlfREVTQ19SRVBMQVldOworCXU4IEtleU5vbmNlW0xFTl9LRVlfREVTQ19OT05DRV07CisJdTggS2V5SXZbTEVOX0tFWV9ERVNDX0lWXTsKKwl1OCBLZXlSc2NbTEVOX0tFWV9ERVNDX1JTQ107CisJdTggS2V5SWRbTEVOX0tFWV9ERVNDX0lEXTsKKwl1OCBLZXlNaWNbTEVOX0tFWV9ERVNDX01JQ107CisJdTggS2V5RGF0YUxlblsyXTsKKwl1OCBLZXlEYXRhW01BWF9MRU5fT0ZfUlNOSUVdOworfTsKIAotdHlwZWRlZglzdHJ1Y3QgUEFDS0VEIF9FQVBPTF9QQUNLRVQKLXsKLQlVQ0hBUgkgCQkJUHJvVmVyOwotCVVDSEFSCSAJCQlQcm9UeXBlOwotCVVDSEFSCSAJCQlCb2R5X0xlblsyXTsKLQlLRVlfREVTQ1JJUFRFUgkJS2V5RGVzYzsKLX0JRUFQT0xfUEFDS0VULCAqUEVBUE9MX1BBQ0tFVDsKK3N0cnVjdCBQQUNLRUQgcnRfZWFwb2xfcGFja2V0IHsKKwl1OCBQcm9WZXI7CisJdTggUHJvVHlwZTsKKwl1OCBCb2R5X0xlblsyXTsKKwlzdHJ1Y3QgcnRfa2V5X2Rlc2NyaXB0ZXIgS2V5RGVzYzsKK307CiAKLS8vODAyLjExaSBEMTAgcGFnZSA4MwotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9HVEtfRU5DQVAKLXsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIEtpZDoyOwotICAgIFVDSEFSICAgICAgICAgICAgICAgdHg6MTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIHJzdjo1OwotICAgIFVDSEFSICAgICAgICAgICAgICAgcnN2MTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIEdUS1tUS0lQX0dUS19MRU5HVEhdOwotfSAgIEdUS19FTkNBUCwgKlBHVEtfRU5DQVA7CisvKjgwMi4xMWkgRDEwIHBhZ2UgODMgKi8KK3N0cnVjdCBQQUNLRUQgcnRfZ3RrX2VuY2FwIHsKKwl1OCBLaWQ6MjsKKwl1OCB0eDoxOworCXU4IHJzdjo1OworCXU4IHJzdjE7CisJdTggR1RLW1RLSVBfR1RLX0xFTkdUSF07Cit9OwogCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0tERV9FTkNBUAotewotICAgIFVDSEFSICAgICAgICAgICAgICAgVHlwZTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIExlbjsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIE9VSVszXTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIERhdGFUeXBlOwotICAgIEdUS19FTkNBUCAgICAgIEdUS0VuY2FwOwotfSAgIEtERV9FTkNBUCwgKlBLREVfRU5DQVA7CitzdHJ1Y3QgUEFDS0VEIHJ0X2tkZV9lbmNhcCB7CisJdTggVHlwZTsKKwl1OCBMZW47CisJdTggT1VJWzNdOworCXU4IERhdGFUeXBlOworCXN0cnVjdCBydF9ndGtfZW5jYXAgR1RLRW5jYXA7Cit9OwogCi0vLyBGb3IgV1BBMQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SU05JRSB7Ci0gICAgVUNIQVIgICBvdWlbNF07Ci0gICAgVVNIT1JUICB2ZXJzaW9uOwotICAgIFVDSEFSICAgbWNhc3RbNF07Ci0gICAgVVNIT1JUICB1Y291bnQ7Ci0gICAgc3RydWN0IFBBQ0tFRCB7Ci0gICAgICAgIFVDSEFSIG91aVs0XTsKLSAgICB9dWNhc3RbMV07Ci19IFJTTklFLCAqUFJTTklFOworLyogRm9yIFdQQTEgKi8KK3N0cnVjdCBQQUNLRUQgcnRfcnNuaWUgeworCXU4IG91aVs0XTsKKwl1MTYgdmVyc2lvbjsKKwl1OCBtY2FzdFs0XTsKKwl1MTYgdWNvdW50OworCXN0cnVjdCBQQUNLRUQgeworCQl1OCBvdWlbNF07CisJfSB1Y2FzdFsxXTsKK307CiAKLS8vIEZvciBXUEEyCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JTTklFMiB7Ci0gICAgVVNIT1JUICB2ZXJzaW9uOwotICAgIFVDSEFSICAgbWNhc3RbNF07Ci0gICAgVVNIT1JUICB1Y291bnQ7Ci0gICAgc3RydWN0IFBBQ0tFRCB7Ci0gICAgICAgIFVDSEFSIG91aVs0XTsKLSAgICB9dWNhc3RbMV07Ci19IFJTTklFMiwgKlBSU05JRTI7CisvKiBGb3IgV1BBMiAqLworc3RydWN0IFBBQ0tFRCBydF9yc25pZTIgeworCXUxNiB2ZXJzaW9uOworCXU4IG1jYXN0WzRdOworCXUxNiB1Y291bnQ7CisJc3RydWN0IFBBQ0tFRCB7CisJCXU4IG91aVs0XTsKKwl9IHVjYXN0WzFdOworfTsKIAotLy8gQUtNIFN1aXRlCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JTTklFX0FVVEggewotICAgIFVTSE9SVCBhY291bnQ7Ci0gICAgc3RydWN0IFBBQ0tFRCB7Ci0gICAgICAgIFVDSEFSIG91aVs0XTsKLSAgICB9YXV0aFsxXTsKLX0gUlNOSUVfQVVUSCwqUFJTTklFX0FVVEg7CisvKiBBS00gU3VpdGUgKi8KK3N0cnVjdCBQQUNLRUQgcnRfcnNuaWVfYXV0aCB7CisJdTE2IGFjb3VudDsKKwlzdHJ1Y3QgUEFDS0VEIHsKKwkJdTggb3VpWzRdOworCX0gYXV0aFsxXTsKK307CiAKLXR5cGVkZWYJdW5pb24gUEFDS0VEIF9SU05fQ0FQQUJJTElUSUVTCXsKLQlzdHJ1Y3QJUEFDS0VEIHsKLSAgICAgICAgVVNIT1JUCQlQcmVBdXRoOjE7Ci0JCVVTSE9SVAkJTm9fUGFpcndpc2U6MTsKLQkJVVNIT1JUCQlQVEtTQV9SX0NvdW50ZXI6MjsKLQkJVVNIT1JUCQlHVEtTQV9SX0NvdW50ZXI6MjsKLQkJVVNIT1JUCQlSc3ZkOjEwOwotCX0JZmllbGQ7Ci0JVVNIT1JUCQkJd29yZDsKLX0JUlNOX0NBUEFCSUxJVElFUywgKlBSU05fQ0FQQUJJTElUSUVTOwordHlwZWRlZiB1bmlvbiBQQUNLRUQgX1JTTl9DQVBBQklMSVRJRVMgeworCXN0cnVjdCBQQUNLRUQgeworCQl1MTYgUHJlQXV0aDoxOworCQl1MTYgTm9fUGFpcndpc2U6MTsKKwkJdTE2IFBUS1NBX1JfQ291bnRlcjoyOworCQl1MTYgR1RLU0FfUl9Db3VudGVyOjI7CisJCXUxNiBSc3ZkOjEwOworCX0gZmllbGQ7CisJdTE2IHdvcmQ7Cit9IFJTTl9DQVBBQklMSVRJRVMsICpQUlNOX0NBUEFCSUxJVElFUzsKIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9FQVBfSERSIHsKLSAgICBVQ0hBUiAgIFByb1ZlcjsKLSAgICBVQ0hBUiAgIFByb1R5cGU7Ci0gICAgVUNIQVIgICBCb2R5X0xlblsyXTsKLSAgICBVQ0hBUiAgIGNvZGU7Ci0gICAgVUNIQVIgICBpZGVudGlmaWVyOwotICAgIFVDSEFSICAgbGVuZ3RoWzJdOyAvLyBpbmNsdWRpbmcgY29kZSBhbmQgaWRlbnRpZmllciwgZm9sbG93ZWQgYnkgbGVuZ3RoLTIgb2N0ZXRzIG9mIGRhdGEKLX0gRUFQX0hEUiwgKlBFQVBfSERSOworc3RydWN0IFBBQ0tFRCBydF9lYXBfaGRyIHsKKwl1OCBQcm9WZXI7CisJdTggUHJvVHlwZTsKKwl1OCBCb2R5X0xlblsyXTsKKwl1OCBjb2RlOworCXU4IGlkZW50aWZpZXI7CisJdTggbGVuZ3RoWzJdOwkvKiBpbmNsdWRpbmcgY29kZSBhbmQgaWRlbnRpZmllciwgZm9sbG93ZWQgYnkgbGVuZ3RoLTIgb2N0ZXRzIG9mIGRhdGEgKi8KK307CiAKLS8vIEZvciBzdXBwbGljYW50IHN0YXRlIG1hY2hpbmUgc3RhdGVzLiA4MDIuMTFpIERyYWZ0IDQuMSwgcC4gOTcKLS8vIFdlIHNpbXBsaWZpZWQgaXQKLXR5cGVkZWYJZW51bQlfV3BhU3RhdGUKLXsKLQlTU19OT1RVU0UsCQkJCS8vIDAKLQlTU19TVEFSVCwJCQkJLy8gMQotCVNTX1dBSVRfTVNHXzMsCQkJLy8gMgotCVNTX1dBSVRfR1JPVVAsCQkJLy8gMwotCVNTX0ZJTklTSCwgIAkJCS8vIDQKLQlTU19LRVlVUERBVEUsCQkJLy8gNQotfQlXUEFfU1RBVEU7CisvKiBGb3Igc3VwcGxpY2FudCBzdGF0ZSBtYWNoaW5lIHN0YXRlcy4gODAyLjExaSBEcmFmdCA0LjEsIHAuIDk3ICovCisvKiBXZSBzaW1wbGlmaWVkIGl0ICovCit0eXBlZGVmIGVudW0gX1dwYVN0YXRlIHsKKwlTU19OT1RVU0UsCQkvKiAwICovCisJU1NfU1RBUlQsCQkvKiAxICovCisJU1NfV0FJVF9NU0dfMywJCS8qIDIgKi8KKwlTU19XQUlUX0dST1VQLAkJLyogMyAqLworCVNTX0ZJTklTSCwJCS8qIDQgKi8KKwlTU19LRVlVUERBVEUsCQkvKiA1ICovCit9IFdQQV9TVEFURTsKIAotLy8KLS8vCVRoZSBkZWZpbml0aW9uIG9mIHRoZSBjaXBoZXIgY29tYmluYXRpb24KLS8vCi0vLyAJIGJpdDMJYml0MiAgYml0MSAgIGJpdDAKLS8vCSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwotLy8gCXwJICBXUEEJIHwJICAgV1BBMiAgIHwKLS8vCSstLS0tLS0rLS0tLS0rLS0tLS0tKy0tLS0tKwotLy8JfCBUS0lQIHwgQUVTIHwgVEtJUCB8IEFFUyB8Ci0vLwl8CTAgIHwgIDEgIHwgICAxICB8ICAwICB8IC0+IDB4MDYKLS8vCXwJMCAgfCAgMSAgfCAgIDEgIHwgIDEgIHwgLT4gMHgwNwotLy8JfAkxICB8ICAwICB8ICAgMCAgfCAgMSAgfCAtPiAweDA5Ci0vLwl8CTEgIHwgIDAgIHwgICAxICB8ICAxICB8IC0+IDB4MEIKLS8vCXwJMSAgfCAgMSAgfCAgIDAgIHwgIDEgIHwgLT4gMHgwRAotLy8JfAkxICB8ICAxICB8ICAgMSAgfCAgMCAgfCAtPiAweDBFCi0vLwl8CTEgIHwgIDEgIHwgICAxICB8ICAxICB8CS0+IDB4MEYKLS8vCSstLS0tLS0rLS0tLS0rLS0tLS0tKy0tLS0tKwotLy8KLXR5cGVkZWYJZW51bQlfV3BhTWl4UGFpckNpcGhlcgotewotCU1JWF9DSVBIRVJfTk9UVVNFIAkJCT0gMHgwMCwKLQlXUEFfTk9ORV9XUEEyX1RLSVBBRVMJCT0gMHgwMywJCS8vIFdQQTItVEtJUEFFUwotCVdQQV9BRVNfV1BBMl9US0lQIAkJCT0gMHgwNiwKLQlXUEFfQUVTX1dQQTJfVEtJUEFFUwkJPSAweDA3LAotCVdQQV9US0lQX1dQQTJfQUVTCQkJPSAweDA5LAotCVdQQV9US0lQX1dQQTJfVEtJUEFFUwkJPSAweDBCLAotCVdQQV9US0lQQUVTX1dQQTJfTk9ORQkJPSAweDBDLAkJLy8gV1BBLVRLSVBBRVMKLQlXUEFfVEtJUEFFU19XUEEyX0FFUwkJPSAweDBELAotCVdQQV9US0lQQUVTX1dQQTJfVEtJUAkJPSAweDBFLAotCVdQQV9US0lQQUVTX1dQQTJfVEtJUEFFUwk9IDB4MEYsCi19CVdQQV9NSVhfUEFJUl9DSVBIRVI7CisvKiAqLworLyogICAgICBUaGUgZGVmaW5pdGlvbiBvZiB0aGUgY2lwaGVyIGNvbWJpbmF0aW9uICovCisvKiAqLworLyogICAgICAgYml0MyAgIGJpdDIgIGJpdDEgICBiaXQwICovCisvKiAgICAgICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKyAqLworLyogICAgICB8ICAgICAgICAgV1BBICAgIHwgICAgICAgICBXUEEyICAgfCAqLworLyogICAgICArLS0tLS0tKy0tLS0tKy0tLS0tLSstLS0tLSsgKi8KKy8qICAgICAgfCBUS0lQIHwgQUVTIHwgVEtJUCB8IEFFUyB8ICovCisvKiAgICAgIHwgICAgICAgMCAgfCAgMSAgfCAgIDEgIHwgIDAgIHwgLT4gMHgwNiAqLworLyogICAgICB8ICAgICAgIDAgIHwgIDEgIHwgICAxICB8ICAxICB8IC0+IDB4MDcgKi8KKy8qICAgICAgfCAgICAgICAxICB8ICAwICB8ICAgMCAgfCAgMSAgfCAtPiAweDA5ICovCisvKiAgICAgIHwgICAgICAgMSAgfCAgMCAgfCAgIDEgIHwgIDEgIHwgLT4gMHgwQiAqLworLyogICAgICB8ICAgICAgIDEgIHwgIDEgIHwgICAwICB8ICAxICB8IC0+IDB4MEQgKi8KKy8qICAgICAgfCAgICAgICAxICB8ICAxICB8ICAgMSAgfCAgMCAgfCAtPiAweDBFICovCisvKiAgICAgIHwgICAgICAgMSAgfCAgMSAgfCAgIDEgIHwgIDEgIHwgLT4gMHgwRiAqLworLyogICAgICArLS0tLS0tKy0tLS0tKy0tLS0tLSstLS0tLSsgKi8KKy8qICovCit0eXBlZGVmIGVudW0gX1dwYU1peFBhaXJDaXBoZXIgeworCU1JWF9DSVBIRVJfTk9UVVNFID0gMHgwMCwKKwlXUEFfTk9ORV9XUEEyX1RLSVBBRVMgPSAweDAzLAkvKiBXUEEyLVRLSVBBRVMgKi8KKwlXUEFfQUVTX1dQQTJfVEtJUCA9IDB4MDYsCisJV1BBX0FFU19XUEEyX1RLSVBBRVMgPSAweDA3LAorCVdQQV9US0lQX1dQQTJfQUVTID0gMHgwOSwKKwlXUEFfVEtJUF9XUEEyX1RLSVBBRVMgPSAweDBCLAorCVdQQV9US0lQQUVTX1dQQTJfTk9ORSA9IDB4MEMsCS8qIFdQQS1US0lQQUVTICovCisJV1BBX1RLSVBBRVNfV1BBMl9BRVMgPSAweDBELAorCVdQQV9US0lQQUVTX1dQQTJfVEtJUCA9IDB4MEUsCisJV1BBX1RLSVBBRVNfV1BBMl9US0lQQUVTID0gMHgwRiwKK30gV1BBX01JWF9QQUlSX0NJUEhFUjsKIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SU05fSUVfSEVBREVSX1NUUlVDVAl7Ci0JVUNIQVIJCUVpZDsKLQlVQ0hBUgkJTGVuZ3RoOwotCVVTSE9SVAkJVmVyc2lvbjsJLy8gTGl0dGxlIGVuZGlhbiBmb3JtYXQKLX0JUlNOX0lFX0hFQURFUl9TVFJVQ1QsICpQUlNOX0lFX0hFQURFUl9TVFJVQ1Q7CitzdHJ1Y3QgUEFDS0VEIHJ0X3Jzbl9pZV9oZWFkZXIgeworCXU4IEVpZDsKKwl1OCBMZW5ndGg7CisJdTE2IFZlcnNpb247CQkvKiBMaXR0bGUgZW5kaWFuIGZvcm1hdCAqLworfTsKIAotLy8gQ2lwaGVyIHN1aXRlIHNlbGVjdG9yIHR5cGVzCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0NJUEhFUl9TVUlURV9TVFJVQ1QJewotCVVDSEFSCQlPdWlbM107Ci0JVUNIQVIJCVR5cGU7Ci19CUNJUEhFUl9TVUlURV9TVFJVQ1QsICpQQ0lQSEVSX1NVSVRFX1NUUlVDVDsKKy8qIENpcGhlciBzdWl0ZSBzZWxlY3RvciB0eXBlcyAqLworc3RydWN0IFBBQ0tFRCBydF9jaXBoZXJfc3VpdGVfc3RydWN0IHsKKwl1OCBPdWlbM107CisJdTggVHlwZTsKK307CiAKLS8vIEF1dGhlbnRpY2F0aW9uIGFuZCBLZXkgTWFuYWdlbWVudCBzdWl0ZSBzZWxlY3RvcgotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9BS01fU1VJVEVfU1RSVUNUCXsKLQlVQ0hBUgkJT3VpWzNdOwotCVVDSEFSCQlUeXBlOwotfQlBS01fU1VJVEVfU1RSVUNULCAqUEFLTV9TVUlURV9TVFJVQ1Q7CisvKiBBdXRoZW50aWNhdGlvbiBhbmQgS2V5IE1hbmFnZW1lbnQgc3VpdGUgc2VsZWN0b3IgKi8KK3N0cnVjdCBQQUNLRUQgcnRfYWttX3N1aXRlIHsKKwl1OCBPdWlbM107CisJdTggVHlwZTsKK307CiAKLS8vIFJTTiBjYXBhYmlsaXR5Ci10eXBlZGVmIHN0cnVjdAlQQUNLRUQgX1JTTl9DQVBBQklMSVRZCXsKLQlVU0hPUlQJCVJzdjoxMDsKLQlVU0hPUlQJCUdUS1NBUmVwbGF5Q250OjI7Ci0JVVNIT1JUCQlQVEtTQVJlcGxheUNudDoyOwotCVVTSE9SVAkJTm9QYWlyd2lzZToxOwotCVVTSE9SVAkJUHJlQXV0aDoxOwotfQlSU05fQ0FQQUJJTElUWSwgKlBSU05fQ0FQQUJJTElUWTsKKy8qIFJTTiBjYXBhYmlsaXR5ICovCitzdHJ1Y3QgUEFDS0VEIHJ0X3Jzbl9jYXBhYmlsaXR5IHsKKwl1MTYgUnN2OjEwOworCXUxNiBHVEtTQVJlcGxheUNudDoyOworCXUxNiBQVEtTQVJlcGxheUNudDoyOworCXUxNiBOb1BhaXJ3aXNlOjE7CisJdTE2IFByZUF1dGg6MTsKK307CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVRoZSBwcm90b3R5cGUgaXMgZGVmaW5lZCBpbiBjbW1fd3BhLmMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitCT09MRUFOIFdwYU1zZ1R5cGVTdWJzdCh1OCBFQVBUeXBlLCBpbnQgKiBNc2dUeXBlKTsKKwordm9pZCBQUkYodTggKiBrZXksCisJIGludCBrZXlfbGVuLAorCSB1OCAqIHByZWZpeCwKKwkgaW50IHByZWZpeF9sZW4sCisJIHU4ICogZGF0YSwgaW50IGRhdGFfbGVuLCB1OCAqIG91dHB1dCwgaW50IGxlbik7CisKK2ludCBQYXNzd29yZEhhc2goY2hhciAqcGFzc3dvcmQsCisJCSB1bnNpZ25lZCBjaGFyICpzc2lkLCBpbnQgc3NpZGxlbmd0aCwgdW5zaWduZWQgY2hhciAqb3V0cHV0KTsKKwordTggKkdldFN1aXRlRnJvbVJTTklFKHU4ICpyc25pZSwKKwkJCSB1MzIgcnNuaWVfbGVuLCB1OCB0eXBlLCB1OCAqIGNvdW50KTsKKwordm9pZCBXcGFTaG93QWxsc3VpdGUodTggKnJzbmllLCB1MzIgcnNuaWVfbGVuKTsKKwordm9pZCBSVE1QSW5zZXJ0UlNOSUUodTggKnBGcmFtZUJ1ZiwKKwkJICAgICB1bnNpZ25lZCBsb25nICpwRnJhbWVMZW4sCisJCSAgICAgdTggKnJzbmllX3B0ciwKKwkJICAgICB1OCByc25pZV9sZW4sCisJCSAgICAgdTggKnBta2lkX3B0ciwgdTggcG1raWRfbGVuKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwLzI4NzBfbWFpbl9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvMjg3MF9tYWluX2Rldi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGVkNDhiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvMjg3MF9tYWluX2Rldi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUzMCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIHJ0bXBfbWFpbi5jCi0KLSAgICBBYnN0cmFjdDoKLSAgICBtYWluIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBOYW1lICAgICAgICBEYXRlICAgICAgICAgICAgTW9kaWZpY2F0aW9uIGxvZ3MKLSAgICBKYW4gTGVlCQkwMS0xMC0yMDA1CSAgICBtb2RpZmllZAotCVNhbXBsZQkJSnVuLzAxLzA3CQlNZXJnZSBSVDI4NzAgYW5kIFJUMjg2MCBkcml2ZXJzLgotKi8KLQotI2luY2x1ZGUgInJ0X2NvbmZpZy5oIgotCi0KLS8vIEZvbGxvd2luZyBpbmZvcm1hdGlvbiB3aWxsIGJlIHNob3cgd2hlbiB5b3UgcnVuICdtb2RpbmZvJwotLy8gKioqIElmIHlvdSBoYXZlIGEgc29sdXRpb24gZm9yIHRoZSBidWcgaW4gY3VycmVudCB2ZXJzaW9uIG9mIGRyaXZlciwgcGxlYXNlIG1haWwgdG8gbWUuCi0vLyBPdGhlcndpc2UgcG9zdCB0byBmb3J1bSBpbiByYWxpbmt0ZWNoJ3Mgd2ViIHNpdGUod3d3LnJhbGlua3RlY2guY29tKSBhbmQgbGV0IGFsbCB1c2VycyBoZWxwIHlvdS4gKioqCi1NT0RVTEVfQVVUSE9SKCJQYXVsIExpbiA8cGF1bF9saW5AcmFsaW5rdGVjaC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oUlQyOHh4X0NISVBfTkFNRSAiIFdpcmVsZXNzIExBTiBMaW51eCBEcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLSNpZmRlZiBNT0RVTEVfVkVSU0lPTgotTU9EVUxFX1ZFUlNJT04oU1RBX0RSSVZFUl9WRVJTSU9OKTsKLSNlbmRpZgotTU9EVUxFX0FMSUFTKCJydDMwNzBzdGEiKTsKLQotLyogS2VybmVsIHRocmVhZCBhbmQgdmFycywgd2hpY2ggaGFuZGxlcyBwYWNrZXRzIHRoYXQgYXJlIGNvbXBsZXRlZC4gT25seQotICogcGFja2V0cyB0aGF0IGhhdmUgYSAiY29tcGxldGUiIGZ1bmN0aW9uIGFyZSBzZW50IGhlcmUuIFRoaXMgd2F5LCB0aGUKLSAqIGNvbXBsZXRpb24gaXMgcnVuIG91dCBvZiBrZXJuZWwgY29udGV4dCwgYW5kIGRvZXNuJ3QgYmxvY2sgdGhlIHJlc3Qgb2YKLSAqIHRoZSBzdGFjay4gKi8KLQotZXh0ZXJuIElOVCBfX2RldmluaXQgcnQyOHh4X3Byb2JlKElOIHZvaWQgKl9kZXZfcCwgSU4gdm9pZCAqX2Rldl9pZF9wLAotCQkJCQkJCQkJSU4gVUlOVCBhcmdjLCBPVVQgUFJUTVBfQURBUFRFUiAqcHBBZCk7Ci0KLXN0cnVjdCB1c2JfZGV2aWNlX2lkIHJ0dXNiX3VzYl9pZFtdID0gewotCXsgVVNCX0RFVklDRSgweDE0OEYsIDB4Mjc3MCkgfSwgLyogUmFsaW5rICovCi0JeyBVU0JfREVWSUNFKDB4MTczNywgMHgwMDcxKSB9LCAvKiBMaW5rc3lzIFdVU0I2MDBOICovCi0JeyBVU0JfREVWSUNFKDB4MTczNywgMHgwMDcwKSB9LCAvKiBMaW5rc3lzICovCi0JeyBVU0JfREVWSUNFKDB4MTQ4RiwgMHgyODcwKSB9LCAvKiBSYWxpbmsgKi8KLQl7IFVTQl9ERVZJQ0UoMHgxNDhGLCAweDMwNzApIH0sIC8qIFJhbGluayAzMDcwICovCi0JeyBVU0JfREVWSUNFKDB4MTQ4RiwgMHgzMDcxKSB9LCAvKiBSYWxpbmsgMzA3MSAqLwotCXsgVVNCX0RFVklDRSgweDE0OEYsIDB4MzA3MikgfSwgLyogUmFsaW5rIDMwNzIgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwQjA1LCAweDE3MzEpIH0sIC8qIEFzdXMgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwQjA1LCAweDE3MzIpIH0sIC8qIEFzdXMgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwQjA1LCAweDE3NDIpIH0sIC8qIEFzdXMgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwREY2LCAweDAwMTcpIH0sIC8qIFNpdGVjb20gKi8KLQl7IFVTQl9ERVZJQ0UoMHgwREY2LCAweDAwMkIpIH0sIC8qIFNpdGVjb20gKi8KLQl7IFVTQl9ERVZJQ0UoMHgwREY2LCAweDAwMkMpIH0sIC8qIFNpdGVjb20gKi8KLQl7IFVTQl9ERVZJQ0UoMHgwREY2LCAweDAwM0UpIH0sIC8qIFNpdGVjb20gMzA3MCAqLwotCXsgVVNCX0RFVklDRSgweDBERjYsIDB4MDAyRCkgfSwgLyogU2l0ZWNvbSAqLwotCXsgVVNCX0RFVklDRSgweDBERjYsIDB4MDAzOSkgfSwgLyogU2l0ZWNvbSAyNzcwICovCi0JeyBVU0JfREVWSUNFKDB4MERGNiwgMHgwMDNGKSB9LCAvKiBTaXRlY29tIFdMLTYwOCAqLwotCXsgVVNCX0RFVklDRSgweDE0QjIsIDB4M0MwNikgfSwgLyogQ29uY2VwdHJvbmljICovCi0JeyBVU0JfREVWSUNFKDB4MTRCMiwgMHgzQzI4KSB9LCAvKiBDb25jZXB0cm9uaWMgKi8KLQl7IFVTQl9ERVZJQ0UoMHgyMDE5LCAweEVEMDYpIH0sIC8qIFBsYW5leCBDb21tdW5pY2F0aW9ucywgSW5jLiAqLwotCXsgVVNCX0RFVklDRSgweDIwMTksIDB4RUQxNCkgfSwgLyogUGxhbmV4IENvbW11bmljYXRpb25zLCBJbmMuICovCi0JeyBVU0JfREVWSUNFKDB4MjAxOSwgMHhBQjI1KSB9LCAvKiBQbGFuZXggQ29tbXVuaWNhdGlvbnMsIEluYy4gUlQzMDcwICovCi0JeyBVU0JfREVWSUNFKDB4MDdEMSwgMHgzQzA5KSB9LCAvKiBELUxpbmsgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwN0QxLCAweDNDMTEpIH0sIC8qIEQtTGluayAqLwotCXsgVVNCX0RFVklDRSgweDIwMDEsIDB4M0MwOSkgfSwgLyogRC1MaW5rICovCi0JeyBVU0JfREVWSUNFKDB4MjAwMSwgMHgzQzBBKSB9LCAvKiBELUxpbmsgMzA3MiovCi0JeyBVU0JfREVWSUNFKDB4MTRCMiwgMHgzQzA3KSB9LCAvKiBBTCAqLwotCXsgVVNCX0RFVklDRSgweDE0QjIsIDB4M0MxMikgfSwgLyogQUwgMzA3MCAqLwotCXsgVVNCX0RFVklDRSgweDA1MEQsIDB4ODA1MykgfSwgLyogQmVsa2luICovCi0JeyBVU0JfREVWSUNFKDB4MDUwRCwgMHg4MTVDKSB9LCAvKiBCZWxraW4gKi8KLQl7IFVTQl9ERVZJQ0UoMHgwNTBELCAweDgyNWEpIH0sIC8qIEJlbGtpbiAqLwotCXsgVVNCX0RFVklDRSgweDE0QjIsIDB4M0MyMykgfSwgLyogQWlybGluayAqLwotCXsgVVNCX0RFVklDRSgweDE0QjIsIDB4M0MyNykgfSwgLyogQWlybGluayAqLwotCXsgVVNCX0RFVklDRSgweDA3QUEsIDB4MDAyRikgfSwgLyogQ29yZWdhICovCi0JeyBVU0JfREVWSUNFKDB4MDdBQSwgMHgwMDNDKSB9LCAvKiBDb3JlZ2EgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwN0FBLCAweDAwM0YpIH0sIC8qIENvcmVnYSAqLwotCXsgVVNCX0RFVklDRSgweDE4QzUsIDB4MDAxMikgfSwgLyogQ29yZWdhIDMwNzAgKi8KLQl7IFVTQl9ERVZJQ0UoMHgxMDQ0LCAweDgwMEIpIH0sIC8qIEdpZ2FieXRlICovCi0JeyBVU0JfREVWSUNFKDB4MTA0NCwgMHg4MDBEKSB9LCAvKiBHaWdhYnl0ZSBHTi1XQjMyTCAzMDcwICovCi0JeyBVU0JfREVWSUNFKDB4MTVBOSwgMHgwMDA2KSB9LCAvKiBTcGFya2xhbiAqLwotCXsgVVNCX0RFVklDRSgweDA4M0EsIDB4QjUyMikgfSwgLyogU01DICovCi0JeyBVU0JfREVWSUNFKDB4MDgzQSwgMHhBNjE4KSB9LCAvKiBTTUMgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwODNBLCAweDg1MjIpIH0sIC8qIEFyY2FkeWFuICovCi0JeyBVU0JfREVWSUNFKDB4MDgzQSwgMHg3NTEyKSB9LCAvKiBBcmNhZHlhbiAyNzcwICovCi0JeyBVU0JfREVWSUNFKDB4MDgzQSwgMHg3NTIyKSB9LCAvKiBBcmNhZHlhbiAqLwotCXsgVVNCX0RFVklDRSgweDA4M0EsIDB4NzUxMSkgfSwgLyogQXJjYWR5YW4gMzA3MCAqLwotCXsgVVNCX0RFVklDRSgweDBDREUsIDB4MDAyMikgfSwgLyogWkNPTSAqLwotCXsgVVNCX0RFVklDRSgweDA1ODYsIDB4MzQxNikgfSwgLyogWnl4ZWwgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwQ0RFLCAweDAwMjUpIH0sIC8qIFp5eGVsICovCi0JeyBVU0JfREVWSUNFKDB4MTc0MCwgMHg5NzAxKSB9LCAvKiBFbkdlbml1cyAqLwotCXsgVVNCX0RFVklDRSgweDE3NDAsIDB4OTcwMikgfSwgLyogRW5HZW5pdXMgKi8KLQl7IFVTQl9ERVZJQ0UoMHgxNzQwLCAweDk3MDMpIH0sIC8qIEVuR2VuaXVzIDMwNzAgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwNDcxLCAweDIwMGYpIH0sIC8qIFBoaWxpcHMgKi8KLQl7IFVTQl9ERVZJQ0UoMHgxNEIyLCAweDNDMjUpIH0sIC8qIERyYXl0ZWsgKi8KLQl7IFVTQl9ERVZJQ0UoMHgxM0QzLCAweDMyNDcpIH0sIC8qIEF6dXJlV2F2ZSAqLwotCXsgVVNCX0RFVklDRSgweDEzRDMsIDB4MzI3MykgfSwgLyogQXp1cmVXYXZlIDMwNzAqLwotCXsgVVNCX0RFVklDRSgweDA4M0EsIDB4NjYxOCkgfSwgLyogQWNjdG9uICovCi0JeyBVU0JfREVWSUNFKDB4MTVjNSwgMHgwMDA4KSB9LCAvKiBBbWl0ICovCi0JeyBVU0JfREVWSUNFKDB4MEU2NiwgMHgwMDAxKSB9LCAvKiBIYXdraW5nICovCi0JeyBVU0JfREVWSUNFKDB4MEU2NiwgMHgwMDAzKSB9LCAvKiBIYXdraW5nICovCi0JeyBVU0JfREVWSUNFKDB4MTI5QiwgMHgxODI4KSB9LCAvKiBTaWVtZW5zICovCi0JeyBVU0JfREVWSUNFKDB4MTU3RSwgMHgzMDBFKSB9LCAvKiBVLU1lZGlhICovCi0JeyBVU0JfREVWSUNFKDB4MDUwZCwgMHg4MDVjKSB9LAotCXsgVVNCX0RFVklDRSgweDE0ODIsIDB4M0MwOSkgfSwgLyogQWJvY29tKi8KLQl7IFVTQl9ERVZJQ0UoMHgxNEIyLCAweDNDMDkpIH0sIC8qIEFscGhhICovCi0JeyBVU0JfREVWSUNFKDB4MDRFOCwgMHgyMDE4KSB9LCAvKiBzYW1zdW5nICovCi0JeyBVU0JfREVWSUNFKDB4MDdCOCwgMHgzMDcwKSB9LCAvKiBBYm9Db20gMzA3MCAqLwotCXsgVVNCX0RFVklDRSgweDA3QjgsIDB4MzA3MSkgfSwgLyogQWJvQ29tIDMwNzEgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwN0I4LCAweDI4NzApIH0sIC8qIEFib0NvbSAqLwotCXsgVVNCX0RFVklDRSgweDA3QjgsIDB4Mjc3MCkgfSwgLyogQWJvQ29tICovCi0JeyBVU0JfREVWSUNFKDB4MDdCOCwgMHgzMDcyKSB9LCAvKiBBYm9jb20gMzA3MiAqLwotCXsgVVNCX0RFVklDRSgweDczOTIsIDB4NzcxMSkgfSwgLyogRWRpbWF4IDMwNzAgKi8KLQl7IFVTQl9ERVZJQ0UoMHg1QTU3LCAweDAyODApIH0sIC8qIFppbndlbGwgKi8KLQl7IFVTQl9ERVZJQ0UoMHg1QTU3LCAweDAyODIpIH0sIC8qIFppbndlbGwgKi8KLQl7IFVTQl9ERVZJQ0UoMHgxQTMyLCAweDAzMDQpIH0sIC8qIFF1YW50YSAzMDcwICovCi0JeyBVU0JfREVWSUNFKDB4MDc4OSwgMHgwMTYyKSB9LCAvKiBMb2dpdGVjIDI4NzAgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwNzg5LCAweDAxNjMpIH0sIC8qIExvZ2l0ZWMgMjg3MCAqLwotCXsgVVNCX0RFVklDRSgweDA3ODksIDB4MDE2NCkgfSwgLyogTG9naXRlYyAyODcwICovCi0JeyBVU0JfREVWSUNFKDB4NzM5MiwgMHg3NzE3KSB9LCAvKiBFZGltYXggKi8KLQl7IFVTQl9ERVZJQ0UoMHgxRURBLCAweDIzMTApIH0sIC8qIEFpclRpZXMgMzA3MCAqLwotCXsgVVNCX0RFVklDRSgweDE3MzcsIDB4MDA3NykgfSwgLyogTGlua3N5cyBXVVNCNTRHQy1FVSB2MyAqLwotCXsgfSAvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwotfTsKLQotSU5UIGNvbnN0ICAgICAgICAgICAgICAgcnR1c2JfdXNiX2lkX2xlbiA9IHNpemVvZihydHVzYl91c2JfaWQpIC8gc2l6ZW9mKHN0cnVjdCB1c2JfZGV2aWNlX2lkKTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBydHVzYl91c2JfaWQpOwotCi0jaWZuZGVmIFBGX05PRlJFRVpFCi0jZGVmaW5lIFBGX05PRlJFRVpFICAwCi0jZW5kaWYKLQotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHJ0Mjg3MF9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwotc3RhdGljIGludCBydDI4NzBfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKLSNlbmRpZiAvLyBDT05GSUdfUE0gLy8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy90ZXN0ZWQgZm9yIGtlcm5lbCAyLjZzZXJpZXMKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgcnR1c2JfcHJvYmUgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAotCQkJCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKTsKLXN0YXRpYyB2b2lkIHJ0dXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwotCi1zdHJ1Y3QgdXNiX2RyaXZlciBydHVzYl9kcml2ZXIgPSB7Ci0JLm5hbWU9InJ0Mjg3MCIsCi0JLnByb2JlPXJ0dXNiX3Byb2JlLAotCS5kaXNjb25uZWN0PXJ0dXNiX2Rpc2Nvbm5lY3QsCi0JLmlkX3RhYmxlPXJ0dXNiX3VzYl9pZCwKLQotI2lmZGVmIENPTkZJR19QTQotCXN1c3BlbmQ6CXJ0Mjg3MF9zdXNwZW5kLAotCXJlc3VtZToJCXJ0Mjg3MF9yZXN1bWUsCi0jZW5kaWYKLQl9OwotCi0jaWZkZWYgQ09ORklHX1BNCi0KLVZPSUQgUlQyODYwUmVqZWN0UGVuZGluZ1BhY2tldHMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JLy8gY2xlYXIgUFMgcGFja2V0cwotCS8vIGNsZWFyIFR4U3cgcGFja2V0cwotfQotCi1zdGF0aWMgaW50IHJ0Mjg3MF9zdXNwZW5kKAotCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAotCXBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldjsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7Ci0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODcwX3N1c3BlbmQoKVxuIikpOwotCW5ldF9kZXYgPSBwQWQtPm5ldF9kZXY7Ci0JbmV0aWZfZGV2aWNlX2RldGFjaCAobmV0X2Rldik7Ci0KLQlwQWQtPlBNX0ZsZ1N1c3BlbmQgPSAxOwotCWlmIChuZXRpZl9ydW5uaW5nKG5ldF9kZXYpKSB7Ci0JCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUChwQWQpOwotCQlSVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKHBBZCk7Ci0JfQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODcwX3N1c3BlbmQoKVxuIikpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJ0Mjg3MF9yZXN1bWUoCi0Jc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwotCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IHJ0Mjg3MF9yZXN1bWUoKVxuIikpOwotCi0JcEFkLT5QTV9GbGdTdXNwZW5kID0gMDsKLQluZXRfZGV2ID0gcEFkLT5uZXRfZGV2OwotCW5ldGlmX2RldmljZV9hdHRhY2ggKG5ldF9kZXYpOwotCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldF9kZXYpOwotCW5ldGlmX2NhcnJpZXJfb24obmV0X2Rldik7Ci0JbmV0aWZfd2FrZV9xdWV1ZShuZXRfZGV2KTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODcwX3Jlc3VtZSgpXG4iKSk7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLy8gQ09ORklHX1BNIC8vCi0KLQotLy8gSW5pdCBkcml2ZXIgbW9kdWxlCi1JTlQgX19pbml0IHJ0dXNiX2luaXQodm9pZCkKLXsKLQlwcmludGsoInJ0dXNiIGluaXQgLS0tPlxuIik7Ci0JcmV0dXJuIHVzYl9yZWdpc3RlcigmcnR1c2JfZHJpdmVyKTsKLX0KLQotLy8gRGVpbml0IGRyaXZlciBtb2R1bGUKLVZPSUQgX19leGl0IHJ0dXNiX2V4aXQodm9pZCkKLXsKLQl1c2JfZGVyZWdpc3RlcigmcnR1c2JfZHJpdmVyKTsKLQlwcmludGsoIjwtLS0gcnR1c2IgZXhpdFxuIik7Ci19Ci0KLW1vZHVsZV9pbml0KHJ0dXNiX2luaXQpOwotbW9kdWxlX2V4aXQocnR1c2JfZXhpdCk7Ci0KLQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSovCi0vKiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMJCQkJCQkJCQkJCQkqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JKi8KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBNTE1FIGtlcm5lbCB0aHJlYWQuCi0KLUFyZ3VtZW50czoKLQkqQ29udGV4dAkJCXRoZSBwQWQsIGRyaXZlciBjb250cm9sIGJsb2NrIHBvaW50ZXIKLQotUmV0dXJuIFZhbHVlOgotICAgIDAJCQkJCWNsb3NlIHRoZSB0aHJlYWQKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBNbG1lVGhyZWFkKAotCUlOIHZvaWQgKkNvbnRleHQpCi17Ci0JUFJUTVBfQURBUFRFUglwQWQgPSAoUFJUTVBfQURBUFRFUilDb250ZXh0OwotCVBPU19DT09LSUUJcE9iajsKLQlpbnQgc3RhdHVzOwotCi0JcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOwotCi0JcnRtcF9vc190aHJlYWRfaW5pdCgicnQyODcwTWxtZVRocmVhZCIsIChQVk9JRCkmKHBBZC0+bWxtZUNvbXBsZXRlKSk7Ci0KLQl3aGlsZSAocEFkLT5tbG1lX2tpbGwgPT0gMCkKLQl7Ci0JCS8qIGxvY2sgdGhlIGRldmljZSBwb2ludGVycyAqLwotCQkvL2Rvd24oJihwQWQtPm1sbWVfc2VtYXBob3JlKSk7Ci0JCXN0YXR1cyA9IGRvd25faW50ZXJydXB0aWJsZSgmKHBBZC0+bWxtZV9zZW1hcGhvcmUpKTsKLQotCQkvKiBsb2NrIHRoZSBkZXZpY2UgcG9pbnRlcnMgLCBuZWVkIHRvIGNoZWNrIGlmIHJlcXVpcmVkKi8KLQkJLy9kb3duKCYocEFkLT51c2JkZXZfc2VtYXBob3JlKSk7Ci0KLQkJaWYgKCFwQWQtPlBNX0ZsZ1N1c3BlbmQpCi0JCU1sbWVIYW5kbGVyKHBBZCk7Ci0KLQkJLyogdW5sb2NrIHRoZSBkZXZpY2UgcG9pbnRlcnMgKi8KLQkJLy91cCgmKHBBZC0+dXNiZGV2X3NlbWFwaG9yZSkpOwotCQlpZiAoc3RhdHVzICE9IDApCi0JCXsKLQkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKiBub3RpZnkgdGhlIGV4aXQgcm91dGluZSB0aGF0IHdlJ3JlIGFjdHVhbGx5IGV4aXRpbmcgbm93Ci0JICoKLQkgKiBjb21wbGV0ZSgpL3dhaXRfZm9yX2NvbXBsZXRpb24oKSBpcyBzaW1pbGFyIHRvIHVwKCkvZG93bigpLAotCSAqIGV4Y2VwdCB0aGF0IGNvbXBsZXRlKCkgaXMgc2FmZSBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgc3RydWN0dXJlCi0JICogaXMgZ2V0dGluZyBkZWxldGVkIGluIGEgcGFyYWxsZWwgbW9kZSBvZiBleGVjdXRpb24gKGkuZS4ganVzdAotCSAqIGFmdGVyIHRoZSBkb3duKCkgLS0gdGhhdCdzIG5lY2Vzc2FyeSBmb3IgdGhlIHRocmVhZC1zaHV0ZG93bgotCSAqIGNhc2UuCi0JICoKLQkgKiBjb21wbGV0ZV9hbmRfZXhpdCgpIGdvZXMgZXZlbiBmdXJ0aGVyIHRoYW4gdGhpcyAtLSBpdCBpcyBzYWZlIGluCi0JICogdGhlIGNhc2UgdGhhdCB0aGUgdGhyZWFkIG9mIHRoZSBjYWxsZXIgaXMgZ29pbmcgYXdheSAobm90IGp1c3QKLQkgKiB0aGUgc3RydWN0dXJlKSAtLSB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIG1vZHVsZS1yZW1vdmUgY2FzZS4KLQkgKiBUaGlzIGlzIGltcG9ydGFudCBpbiBwcmVlbXB0aW9uIGtlcm5lbHMsIHdoaWNoIHRyYW5zZmVyIHRoZSBmbG93Ci0JICogb2YgZXhlY3V0aW9uIGltbWVkaWF0ZWx5IHVwb24gYSBjb21wbGV0ZSgpLgotCSAqLwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCggIjwtLS0lc1xuIixfX2Z1bmNfXykpOwotCi0JcE9iai0+TUxNRVRocl9waWQgPSBOVUxMOwotCi0JY29tcGxldGVfYW5kX2V4aXQgKCZwQWQtPm1sbWVDb21wbGV0ZSwgMCk7Ci0JcmV0dXJuIDA7Ci0KLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIFVTQiBjb21tYW5kIGtlcm5lbCB0aHJlYWQuCi0KLUFyZ3VtZW50czoKLQkqQ29udGV4dAkJCXRoZSBwQWQsIGRyaXZlciBjb250cm9sIGJsb2NrIHBvaW50ZXIKLQotUmV0dXJuIFZhbHVlOgotICAgIDAJCQkJCWNsb3NlIHRoZSB0aHJlYWQKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBSVFVTQkNtZFRocmVhZCgKLQlJTiB2b2lkICogQ29udGV4dCkKLXsKLQlQUlRNUF9BREFQVEVSCXBBZCA9IChQUlRNUF9BREFQVEVSKUNvbnRleHQ7Ci0JUE9TX0NPT0tJRQkJcE9iajsKLQlpbnQgc3RhdHVzOwotCi0JcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOwotCi0JcnRtcF9vc190aHJlYWRfaW5pdCgicnQyODcwQ21kVGhyZWFkIiwgKFBWT0lEKSYocEFkLT5DbWRRQ29tcGxldGUpKTsKLQotCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOwotCXBBZC0+Q21kUS5DbWRRU3RhdGUgPSBSVDI4NzBfVEhSRUFEX1JVTk5JTkc7Ci0JTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7Ci0KLQl3aGlsZSAocEFkLT5DbWRRLkNtZFFTdGF0ZSA9PSBSVDI4NzBfVEhSRUFEX1JVTk5JTkcpCi0JewotCQkvKiBsb2NrIHRoZSBkZXZpY2UgcG9pbnRlcnMgKi8KLQkJLy9kb3duKCYocEFkLT5SVFVTQkNtZF9zZW1hcGhvcmUpKTsKLQkJc3RhdHVzID0gZG93bl9pbnRlcnJ1cHRpYmxlKCYocEFkLT5SVFVTQkNtZF9zZW1hcGhvcmUpKTsKLQotCQlpZiAocEFkLT5DbWRRLkNtZFFTdGF0ZSA9PSBSVDI4NzBfVEhSRUFEX1NUT1BFRCkKLQkJCWJyZWFrOwotCi0JCWlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7Ci0JCQlicmVhazsKLQkJfQotCQkvKiBsb2NrIHRoZSBkZXZpY2UgcG9pbnRlcnMgLCBuZWVkIHRvIGNoZWNrIGlmIHJlcXVpcmVkKi8KLQkJLy9kb3duKCYocEFkLT51c2JkZXZfc2VtYXBob3JlKSk7Ci0KLQkJaWYgKCFwQWQtPlBNX0ZsZ1N1c3BlbmQpCi0JCUNNREhhbmRsZXIocEFkKTsKLQotCQkvKiB1bmxvY2sgdGhlIGRldmljZSBwb2ludGVycyAqLwotCQkvL3VwKCYocEFkLT51c2JkZXZfc2VtYXBob3JlKSk7Ci0JfQotCi0JaWYgKCFwQWQtPlBNX0ZsZ1N1c3BlbmQpCi0JewkvLyBDbGVhciB0aGUgQ21kUUVsZW1lbnRzLgotCQlDbWRRRWxtdAkqcENtZFFFbG10ID0gTlVMTDsKLQotCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKLQkJcEFkLT5DbWRRLkNtZFFTdGF0ZSA9IFJUMjg3MF9USFJFQURfU1RPUEVEOwotCQl3aGlsZShwQWQtPkNtZFEuc2l6ZSkKLQkJewotCQkJUlRVU0JEZXF1ZXVlQ21kKCZwQWQtPkNtZFEsICZwQ21kUUVsbXQpOwotCQkJaWYgKHBDbWRRRWxtdCkKLQkJCXsKLQkJCQlpZiAocENtZFFFbG10LT5DbWRGcm9tTmRpcyA9PSBUUlVFKQotCQkJCXsKLQkJCQkJaWYgKHBDbWRRRWxtdC0+YnVmZmVyICE9IE5VTEwpCi0JCQkJCQlOZGlzRnJlZU1lbW9yeShwQ21kUUVsbXQtPmJ1ZmZlciwgcENtZFFFbG10LT5idWZmZXJsZW5ndGgsIDApOwotCi0JCQkJCU5kaXNGcmVlTWVtb3J5KHBDbWRRRWxtdCwgc2l6ZW9mKENtZFFFbG10KSwgMCk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWlmICgocENtZFFFbG10LT5idWZmZXIgIT0gTlVMTCkgJiYgKHBDbWRRRWxtdC0+YnVmZmVybGVuZ3RoICE9IDApKQotCQkJCQkJTmRpc0ZyZWVNZW1vcnkocENtZFFFbG10LT5idWZmZXIsIHBDbWRRRWxtdC0+YnVmZmVybGVuZ3RoLCAwKTsKLQkJICAgICAgICAgICAgewotCQkJCQkJTmRpc0ZyZWVNZW1vcnkocENtZFFFbG10LCBzaXplb2YoQ21kUUVsbXQpLCAwKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOwotCX0KLQkvKiBub3RpZnkgdGhlIGV4aXQgcm91dGluZSB0aGF0IHdlJ3JlIGFjdHVhbGx5IGV4aXRpbmcgbm93Ci0JICoKLQkgKiBjb21wbGV0ZSgpL3dhaXRfZm9yX2NvbXBsZXRpb24oKSBpcyBzaW1pbGFyIHRvIHVwKCkvZG93bigpLAotCSAqIGV4Y2VwdCB0aGF0IGNvbXBsZXRlKCkgaXMgc2FmZSBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgc3RydWN0dXJlCi0JICogaXMgZ2V0dGluZyBkZWxldGVkIGluIGEgcGFyYWxsZWwgbW9kZSBvZiBleGVjdXRpb24gKGkuZS4ganVzdAotCSAqIGFmdGVyIHRoZSBkb3duKCkgLS0gdGhhdCdzIG5lY2Vzc2FyeSBmb3IgdGhlIHRocmVhZC1zaHV0ZG93bgotCSAqIGNhc2UuCi0JICoKLQkgKiBjb21wbGV0ZV9hbmRfZXhpdCgpIGdvZXMgZXZlbiBmdXJ0aGVyIHRoYW4gdGhpcyAtLSBpdCBpcyBzYWZlIGluCi0JICogdGhlIGNhc2UgdGhhdCB0aGUgdGhyZWFkIG9mIHRoZSBjYWxsZXIgaXMgZ29pbmcgYXdheSAobm90IGp1c3QKLQkgKiB0aGUgc3RydWN0dXJlKSAtLSB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIG1vZHVsZS1yZW1vdmUgY2FzZS4KLQkgKiBUaGlzIGlzIGltcG9ydGFudCBpbiBwcmVlbXB0aW9uIGtlcm5lbHMsIHdoaWNoIHRyYW5zZmVyIHRoZSBmbG93Ci0JICogb2YgZXhlY3V0aW9uIGltbWVkaWF0ZWx5IHVwb24gYSBjb21wbGV0ZSgpLgotCSAqLwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCggIjwtLS1SVFVTQkNtZFRocmVhZFxuIikpOwotCi0JcE9iai0+UlRVU0JDbWRUaHJfcGlkID0gTlVMTDsKLQotCWNvbXBsZXRlX2FuZF9leGl0ICgmcEFkLT5DbWRRQ29tcGxldGUsIDApOwotCXJldHVybiAwOwotCi19Ci0KLQotc3RhdGljIHZvaWQgUlQyODcwX1RpbWVyUV9IYW5kbGUoUlRNUF9BREFQVEVSICpwQWQpCi17Ci0JaW50IHN0YXR1czsKLQlSQUxJTktfVElNRVJfU1RSVUNUCSpwVGltZXI7Ci0JUlQyODcwX1RJTUVSX0VOVFJZCSpwRW50cnk7Ci0JdW5zaWduZWQgbG9uZwlpcnFGbGFnOwotCi0Jd2hpbGUoIXBBZC0+VGltZXJGdW5jX2tpbGwpCi0JewotLy8JCXByaW50aygid2FpdGluZyBmb3IgZXZlbnQhXG4iKTsKLQkJcFRpbWVyID0gTlVMTDsKLQotCQlzdGF0dXMgPSBkb3duX2ludGVycnVwdGlibGUoJihwQWQtPlJUVVNCVGltZXJfc2VtYXBob3JlKSk7Ci0KLQkJaWYgKHBBZC0+VGltZXJRLnN0YXR1cyA9PSBSVDI4NzBfVEhSRUFEX1NUT1BFRCkKLQkJCWJyZWFrOwotCi0JCS8vIGV2ZW50IGhhcHBlbmVkLgotCQl3aGlsZShwQWQtPlRpbWVyUS5wUUhlYWQpCi0JCXsKLQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZyk7Ci0JCQlwRW50cnkgPSBwQWQtPlRpbWVyUS5wUUhlYWQ7Ci0JCQlpZiAocEVudHJ5KQotCQkJewotCQkJCXBUaW1lciA9IHBFbnRyeS0+cFJhVGltZXI7Ci0KLQkJCQkvLyB1cGRhdGUgcFFIZWFkCi0JCQkJcEFkLT5UaW1lclEucFFIZWFkID0gcEVudHJ5LT5wTmV4dDsKLQkJCQlpZiAocEVudHJ5ID09IHBBZC0+VGltZXJRLnBRVGFpbCkKLQkJCQkJcEFkLT5UaW1lclEucFFUYWlsID0gTlVMTDsKLQotCQkJCS8vIHJldHVybiB0aGlzIHF1ZXVlIGVudHJ5IHRvIHRpbWVyUUZyZWVMaXN0LgotCQkJCXBFbnRyeS0+cE5leHQgPSBwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdDsKLQkJCQlwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdCA9IHBFbnRyeTsKLQkJCX0KLQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFnKTsKLQotCQkJaWYgKHBUaW1lcikKLQkJCXsKLQkJCQlpZiAocFRpbWVyLT5oYW5kbGUgIT0gTlVMTCkKLQkJCQlpZiAoIXBBZC0+UE1fRmxnU3VzcGVuZCkKLQkJCQkJcFRpbWVyLT5oYW5kbGUoTlVMTCwgKFBWT0lEKSBwVGltZXItPmNvb2tpZSwgTlVMTCwgcFRpbWVyKTsKLQkJCQlpZiAoKHBUaW1lci0+UmVwZWF0KSAmJiAocFRpbWVyLT5TdGF0ZSA9PSBGQUxTRSkpCi0JCQkJCVJUTVBfT1NfQWRkX1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBwVGltZXItPlRpbWVyVmFsdWUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCQlwQWQtPlRpbWVyUS5zdGF0dXMgPSBSVDI4NzBfVEhSRUFEX1NUT1BFRDsKLQkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLQotSU5UIFRpbWVyUVRocmVhZCgKLQlJTiBPVVQgUFZPSUQgQ29udGV4dCkKLXsKLQlQUlRNUF9BREFQVEVSCXBBZDsKLQlQT1NfQ09PS0lFCXBPYmo7Ci0KLQlwQWQgPSAoUFJUTVBfQURBUFRFUilDb250ZXh0OwotCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQlydG1wX29zX3RocmVhZF9pbml0KCJydDI4NzBUaW1lclFIYW5kbGUiLCAoUFZPSUQpJihwQWQtPlRpbWVyUUNvbXBsZXRlKSk7Ci0KLQlSVDI4NzBfVGltZXJRX0hhbmRsZShwQWQpOwotCi0JLyogbm90aWZ5IHRoZSBleGl0IHJvdXRpbmUgdGhhdCB3ZSdyZSBhY3R1YWxseSBleGl0aW5nIG5vdwotCSAqCi0JICogY29tcGxldGUoKS93YWl0X2Zvcl9jb21wbGV0aW9uKCkgaXMgc2ltaWxhciB0byB1cCgpL2Rvd24oKSwKLQkgKiBleGNlcHQgdGhhdCBjb21wbGV0ZSgpIGlzIHNhZmUgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHN0cnVjdHVyZQotCSAqIGlzIGdldHRpbmcgZGVsZXRlZCBpbiBhIHBhcmFsbGVsIG1vZGUgb2YgZXhlY3V0aW9uIChpLmUuIGp1c3QKLQkgKiBhZnRlciB0aGUgZG93bigpIC0tIHRoYXQncyBuZWNlc3NhcnkgZm9yIHRoZSB0aHJlYWQtc2h1dGRvd24KLQkgKiBjYXNlLgotCSAqCi0JICogY29tcGxldGVfYW5kX2V4aXQoKSBnb2VzIGV2ZW4gZnVydGhlciB0aGFuIHRoaXMgLS0gaXQgaXMgc2FmZSBpbgotCSAqIHRoZSBjYXNlIHRoYXQgdGhlIHRocmVhZCBvZiB0aGUgY2FsbGVyIGlzIGdvaW5nIGF3YXkgKG5vdCBqdXN0Ci0JICogdGhlIHN0cnVjdHVyZSkgLS0gdGhpcyBpcyBuZWNlc3NhcnkgZm9yIHRoZSBtb2R1bGUtcmVtb3ZlIGNhc2UuCi0JICogVGhpcyBpcyBpbXBvcnRhbnQgaW4gcHJlZW1wdGlvbiBrZXJuZWxzLCB3aGljaCB0cmFuc2ZlciB0aGUgZmxvdwotCSAqIG9mIGV4ZWN1dGlvbiBpbW1lZGlhdGVseSB1cG9uIGEgY29tcGxldGUoKS4KLQkgKi8KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoICI8LS0tJXNcbiIsX19mdW5jX18pKTsKLQotCXBPYmotPlRpbWVyUVRocl9waWQgPSBOVUxMOwotCi0JY29tcGxldGVfYW5kX2V4aXQoJnBBZC0+VGltZXJRQ29tcGxldGUsIDApOwotCXJldHVybiAwOwotCi19Ci0KLQotUlQyODcwX1RJTUVSX0VOVFJZICpSVDI4NzBfVGltZXJRX0luc2VydCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBSQUxJTktfVElNRVJfU1RSVUNUICpwVGltZXIpCi17Ci0JUlQyODcwX1RJTUVSX0VOVFJZICpwUU5vZGUgPSBOVUxMLCAqcFFUYWlsOwotCXVuc2lnbmVkIGxvbmcgaXJxRmxhZ3M7Ci0KLQotCVJUTVBfSVJRX0xPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOwotCWlmIChwQWQtPlRpbWVyUS5zdGF0dXMgJiBSVDI4NzBfVEhSRUFEX0NBTl9ET19JTlNFUlQpCi0JewotCQlpZihwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdCkKLQkJewotCQkJcFFOb2RlID0gcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3Q7Ci0JCQlwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdCA9IHBRTm9kZS0+cE5leHQ7Ci0KLQkJCXBRTm9kZS0+cFJhVGltZXIgPSBwVGltZXI7Ci0JCQlwUU5vZGUtPnBOZXh0ID0gTlVMTDsKLQotCQkJcFFUYWlsID0gcEFkLT5UaW1lclEucFFUYWlsOwotCQkJaWYgKHBBZC0+VGltZXJRLnBRVGFpbCAhPSBOVUxMKQotCQkJCXBRVGFpbC0+cE5leHQgPSBwUU5vZGU7Ci0JCQlwQWQtPlRpbWVyUS5wUVRhaWwgPSBwUU5vZGU7Ci0JCQlpZiAocEFkLT5UaW1lclEucFFIZWFkID09IE5VTEwpCi0JCQkJcEFkLT5UaW1lclEucFFIZWFkID0gcFFOb2RlOwotCQl9Ci0JCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7Ci0KLQkJaWYgKHBRTm9kZSkKLQkJCXVwKCZwQWQtPlJUVVNCVGltZXJfc2VtYXBob3JlKTsKLQkJCS8vd2FrZV91cCgmdGltZXJXYWl0USk7Ci0JfQotCWVsc2UKLQl7Ci0JCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7Ci0JfQotCXJldHVybiBwUU5vZGU7Ci19Ci0KLQotQk9PTEVBTiBSVDI4NzBfVGltZXJRX1JlbW92ZSgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBSQUxJTktfVElNRVJfU1RSVUNUICpwVGltZXIpCi17Ci0JUlQyODcwX1RJTUVSX0VOVFJZICpwTm9kZSwgKnBQcmV2ID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGlycUZsYWdzOwotCi0JUlRNUF9JUlFfTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7Ci0JaWYgKHBBZC0+VGltZXJRLnN0YXR1cyA+PSBSVDI4NzBfVEhSRUFEX0lOSVRFRCkKLQl7Ci0JCXBOb2RlID0gcEFkLT5UaW1lclEucFFIZWFkOwotCQl3aGlsZSAocE5vZGUpCi0JCXsKLQkJCWlmIChwTm9kZS0+cFJhVGltZXIgPT0gcFRpbWVyKQotCQkJCWJyZWFrOwotCQkJcFByZXYgPSBwTm9kZTsKLQkJCXBOb2RlID0gcE5vZGUtPnBOZXh0OwotCQl9Ci0KLQkJLy8gTm93IG1vdmUgaXQgdG8gZnJlZUxpc3QgcXVldWUuCi0JCWlmIChwTm9kZSkKLQkJewotCQkJaWYgKHBOb2RlID09IHBBZC0+VGltZXJRLnBRSGVhZCkKLQkJCQlwQWQtPlRpbWVyUS5wUUhlYWQgPSBwTm9kZS0+cE5leHQ7Ci0JCQlpZiAocE5vZGUgPT0gcEFkLT5UaW1lclEucFFUYWlsKQotCQkJCXBBZC0+VGltZXJRLnBRVGFpbCA9IHBQcmV2OwotCQkJaWYgKHBQcmV2ICE9IE5VTEwpCi0JCQkJcFByZXYtPnBOZXh0ID0gcE5vZGUtPnBOZXh0OwotCi0JCQkvLyByZXR1cm4gdGhpcyBxdWV1ZSBlbnRyeSB0byB0aW1lclFGcmVlTGlzdC4KLQkJCXBOb2RlLT5wTmV4dCA9IHBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0OwotCQkJcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3QgPSBwTm9kZTsKLQkJfQotCX0KLQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotdm9pZCBSVDI4NzBfVGltZXJRX0V4aXQoUlRNUF9BREFQVEVSICpwQWQpCi17Ci0JUlQyODcwX1RJTUVSX0VOVFJZICpwVGltZXJROwotCXVuc2lnbmVkIGxvbmcgaXJxRmxhZ3M7Ci0KLQlSVE1QX0lSUV9MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKLQl3aGlsZSAocEFkLT5UaW1lclEucFFIZWFkKQotCXsKLQkJcFRpbWVyUSA9IHBBZC0+VGltZXJRLnBRSGVhZDsKLQkJcEFkLT5UaW1lclEucFFIZWFkID0gcFRpbWVyUS0+cE5leHQ7Ci0JCS8vIHJlbW92ZSB0aGUgdGltZVEKLQl9Ci0JcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3QgPSBOVUxMOwotCW9zX2ZyZWVfbWVtKHBBZCwgcEFkLT5UaW1lclEucFRpbWVyUVBvbGwpOwotCXBBZC0+VGltZXJRLnBRVGFpbCA9IE5VTEw7Ci0JcEFkLT5UaW1lclEucFFIZWFkID0gTlVMTDsKLQlwQWQtPlRpbWVyUS5zdGF0dXMgPSBSVDI4NzBfVEhSRUFEX1NUT1BFRDsKLQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOwotCi19Ci0KLQotdm9pZCBSVDI4NzBfVGltZXJRX0luaXQoUlRNUF9BREFQVEVSICpwQWQpCi17Ci0JaW50IAlpOwotCVJUMjg3MF9USU1FUl9FTlRSWSAqcFFOb2RlLCAqcEVudHJ5OwotCXVuc2lnbmVkIGxvbmcgaXJxRmxhZ3M7Ci0KLQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5UaW1lclFMb2NrKTsKLQotCVJUTVBfSVJRX0xPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOwotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlRpbWVyUSwgc2l6ZW9mKHBBZC0+VGltZXJRKSk7Ci0JLy9JbnRlcmxvY2tlZEV4Y2hhbmdlKCZwQWQtPlRpbWVyUS5jb3VudCwgMCk7Ci0KLQkvKiBJbml0aWFsaXNlIHRoZSB3YWl0IHEgaGVhZCAqLwotCS8vaW5pdF93YWl0cXVldWVfaGVhZCgmdGltZXJXYWl0USk7Ci0KLQlvc19hbGxvY19tZW0ocEFkLCAmcEFkLT5UaW1lclEucFRpbWVyUVBvbGwsIHNpemVvZihSVDI4NzBfVElNRVJfRU5UUlkpICogVElNRVJfUVVFVUVfU0laRV9NQVgpOwotCWlmIChwQWQtPlRpbWVyUS5wVGltZXJRUG9sbCkKLQl7Ci0JCXBFbnRyeSA9IE5VTEw7Ci0JCXBRTm9kZSA9IChSVDI4NzBfVElNRVJfRU5UUlkgKilwQWQtPlRpbWVyUS5wVGltZXJRUG9sbDsKLQkJZm9yIChpID0gMCA7aSA8VElNRVJfUVVFVUVfU0laRV9NQVg7IGkrKykKLQkJewotCQkJcFFOb2RlLT5wTmV4dCA9IHBFbnRyeTsKLQkJCXBFbnRyeSA9IHBRTm9kZTsKLQkJCXBRTm9kZSsrOwotCQl9Ci0JCXBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0ID0gcEVudHJ5OwotCQlwQWQtPlRpbWVyUS5wUUhlYWQgPSBOVUxMOwotCQlwQWQtPlRpbWVyUS5wUVRhaWwgPSBOVUxMOwotCQlwQWQtPlRpbWVyUS5zdGF0dXMgPSBSVDI4NzBfVEhSRUFEX0lOSVRFRDsKLQl9Ci0JUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKLX0KLQotCi1WT0lEIFJUMjg3MF9XYXRjaERvZyhJTiBSVE1QX0FEQVBURVIgKnBBZCkKLXsKLQlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OwotCWludCAJCQkJCWlkeDsKLQlVTE9ORwkJCQlpcnFGbGFnczsKLQlQVVJCCQkgICAJCXBVcmI7Ci0JQk9PTEVBTgkJCQluZWVkRHVtcFNlcSA9IEZBTFNFOwotCVVJTlQzMiAgICAgICAgICAJTUFDVmFsdWU7Ci0KLQotCWlkeCA9IDA7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBUWFJYUV9QQ05ULCAmTUFDVmFsdWUpOwotCWlmICgoTUFDVmFsdWUgJiAweGZmKSAhPTAgKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVFggUVVFVUUgMCBOb3QgRU1QVFkoVmFsdWU9MHglMHgpLiAhISEhISEhISEhISEhISFcbiIsIE1BQ1ZhbHVlKSk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9DRkcsIDB4ZjQwMDEyKTsKLQkJd2hpbGUoKE1BQ1ZhbHVlICYweGZmKSAhPSAwICYmIChpZHgrKyA8IDEwKSkKLQkJewotCQkgICAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgVFhSWFFfUENOVCwgJk1BQ1ZhbHVlKTsKLQkJICAgICAgICBOZGlzTVNsZWVwKDEpOwotCQl9Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9DRkcsIDB4ZjQwMDA2KTsKLQl9Ci0KLS8vUFMgcGFja2V0cyB1c2UgSENDQSBxdWV1ZSB3aGVuIGRlcXVldWUgZnJvbSBQUyB1bmljYXN0IHF1ZXVlIChXaUZpIFdQQTIgTUE5X0RUMSBmb3IgTWFydmVsbCBCIFNUQSkKLQlpZHggPSAwOwotCWlmICgoTUFDVmFsdWUgJiAweGZmMDApICE9MCApCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUWCBRVUVVRSAxIE5vdCBFTVBUWShWYWx1ZT0weCUweCkuICEhISEhISEhISEhISEhIVxuIiwgTUFDVmFsdWUpKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX0NGRywgMHhmNDAwMGEpOwotCQl3aGlsZSgoTUFDVmFsdWUgJjB4ZmYwMCkgIT0gMCAmJiAoaWR4KysgPCAxMCkpCi0JCXsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhSWFFfUENOVCwgJk1BQ1ZhbHVlKTsKLQkJCU5kaXNNU2xlZXAoMSk7Ci0JCX0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX0NGRywgMHhmNDAwMDYpOwotCX0KLQotCWlmIChwQWQtPndhdGNoRG9nUnhPdmVyRmxvd0NudCA+PSAyKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWF5YmUgdGhlIFJ4IEJ1bGstSW4gaGFuZ2VkISBDYW5jZWwgdGhlIHBlbmRpbmcgUnggYnVsa3MgcmVxdWVzdCFcbiIpKTsKLQkJaWYgKCghUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8Ci0JCQkJCQkJCQlmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVCB8Ci0JCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDYWxsIENNRFRIUkVBRF9SRVNFVF9CVUxLX0lOIHRvIGNhbmNlbCB0aGUgcGVuZGluZyBSeCBCdWxrIVxuIikpOwotCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS0lOX1JFU0VUKTsKLQkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU4sIE5VTEwsIDApOwotCQkJbmVlZER1bXBTZXEgPSBUUlVFOwotCQl9Ci0JCXBBZC0+d2F0Y2hEb2dSeE92ZXJGbG93Q250ID0gMDsKLQl9Ci0KLQotCWZvciAoaWR4ID0gMDsgaWR4IDwgTlVNX09GX1RYX1JJTkc7IGlkeCsrKQotCXsKLQkJcFVyYiA9IE5VTEw7Ci0KLQkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tpZHhdLCBpcnFGbGFncyk7Ci0JCWlmICgocEFkLT5CdWxrT3V0UGVuZGluZ1tpZHhdID09IFRSVUUpICYmIHBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnQpCi0JCXsKLQkJCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbaWR4XSsrOwotCi0JCQlpZiAoKHBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbaWR4XSA+IDIpICYmCi0JCQkJICghUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCB8IGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQotCQkJCSkKLQkJCXsKLQkJCQkvLyBGSVhNRTogRm9sbG93aW5nIGNvZGUganVzdCBzdXBwb3J0IHNpbmdsZSBidWxrIG91dC4gSWYgeW91IHdhbm5hIHN1cHBvcnQgbXVsdGlwbGUgYnVsayBvdXQuIE1vZGlmeSBpdCEKLQkJCQlwSFRUWENvbnRleHQgPSAoUEhUX1RYX0NPTlRFWFQpKCZwQWQtPlR4Q29udGV4dFtpZHhdKTsKLQkJCQlpZiAocEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nKQotCQkJCXsJLy8gQ2hlY2sgVHhDb250ZXh0LgotCQkJCQlwVXJiID0gcEhUVFhDb250ZXh0LT5wVXJiOwotCQkJCX0KLQkJCQllbHNlIGlmIChpZHggPT0gTUdNVFBJUEVJRFgpCi0JCQkJewotCQkJCQlQVFhfQ09OVEVYVCBwTUxNRUNvbnRleHQsIHBOVUxMQ29udGV4dCwgcFBzUG9sbENvbnRleHQ7Ci0KLQkJCQkJLy9DaGVjayBNZ210Q29udGV4dC4KLQkJCQkJcE1MTUVDb250ZXh0ID0gKFBUWF9DT05URVhUKShwQWQtPk1nbXRSaW5nLkNlbGxbcEFkLT5NZ210UmluZy5UeERtYUlkeF0uQWxsb2NWYSk7Ci0JCQkJCXBQc1BvbGxDb250ZXh0ID0gKFBUWF9DT05URVhUKSgmcEFkLT5Qc1BvbGxDb250ZXh0KTsKLQkJCQkJcE5VTExDb250ZXh0ID0gKFBUWF9DT05URVhUKSgmcEFkLT5OdWxsQ29udGV4dCk7Ci0KLQkJCQkJaWYgKHBNTE1FQ29udGV4dC0+SVJQUGVuZGluZykKLQkJCQkJewotCQkJCQkJQVNTRVJUKHBNTE1FQ29udGV4dC0+SVJQUGVuZGluZyk7Ci0JCQkJCQlwVXJiID0gcE1MTUVDb250ZXh0LT5wVXJiOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHBOVUxMQ29udGV4dC0+SVJQUGVuZGluZykKLQkJCQkJewotCQkJCQkJQVNTRVJUKHBOVUxMQ29udGV4dC0+SVJQUGVuZGluZyk7Ci0JCQkJCQlwVXJiID0gcE5VTExDb250ZXh0LT5wVXJiOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHBQc1BvbGxDb250ZXh0LT5JUlBQZW5kaW5nKQotCQkJCQl7Ci0JCQkJCQlBU1NFUlQocFBzUG9sbENvbnRleHQtPklSUFBlbmRpbmcpOwotCQkJCQkJcFVyYiA9IHBQc1BvbGxDb250ZXh0LT5wVXJiOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW2lkeF0sIGlycUZsYWdzKTsKLQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1heWJlIHRoZSBUeCBCdWxrLU91dCBoYW5nZWQhIENhbmNlbCB0aGUgcGVuZGluZyBUeCBidWxrcyByZXF1ZXN0IG9mIGlkeCglZCkhXG4iLCBpZHgpKTsKLQkJCQlpZiAocFVyYikKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlVubGluayB0aGUgcGVuZGluZyBVUkIhXG4iKSk7Ci0JCQkJCS8vIHVubGluayBpdCBub3cKLQkJCQkJUlRVU0JfVU5MSU5LX1VSQihwVXJiKTsKLQkJCQkJLy8gU2xlZXAgMjAwIG1pY3Jvc2Vjb25kcyB0byBnaXZlIGNhbmNlbGxhdGlvbiB0aW1lIHRvIHdvcmsKLQkJCQkJUlRNUHVzZWNEZWxheSgyMDApOwotCQkJCQluZWVkRHVtcFNlcSA9IFRSVUU7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlVua29udyBidWxrT3V0IFVSQiBtYXliZSBoYW5nZWQhISEhISEhISEhISFcbiIpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW2lkeF0sIGlycUZsYWdzKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tpZHhdLCBpcnFGbGFncyk7Ci0JCX0KLQl9Ci0KLQkvLyBGb3IgU2lnbWEgZGVidWcsIGR1bXAgdGhlIGJhX3Jlb3JkZXJpbmcgc2VxdWVuY2UuCi0JaWYoKG5lZWREdW1wU2VxID09IFRSVUUpICYmIChwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPT0gMCkpCi0JewotCQlVU0hPUlQJCQkJSWR4OwotCQlQQkFfUkVDX0VOVFJZCQlwQkFFbnRyeSA9IE5VTEw7Ci0JCVVDSEFSCQkJCWNvdW50ID0gMDsKLQkJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGs7Ci0KLQkJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5CQVJlY1djaWRBcnJheVswXTsKLQotCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOwotCQlpZigocEJBRW50cnktPmxpc3QucWxlbiA+IDApICYmIChwQkFFbnRyeS0+bGlzdC5uZXh0ICE9IE5VTEwpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOSUNVcGRhdGVSYXdDb3VudGVycygpOlRoZSBRdWV1ZWluZyBwa3QgaW4gcmVvcmRlcmluZyBidWZmZXI6XG4iKSk7Ci0JCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKLQkJCW1wZHVfYmxrID0gcEJBRW50cnktPmxpc3QubmV4dDsKLQkJCXdoaWxlIChtcGR1X2JsaykKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJcdCVkOlNlcS0lZCwgYkFNU0RVLSVkIVxuIiwgY291bnQsIG1wZHVfYmxrLT5TZXF1ZW5jZSwgbXBkdV9ibGstPmJBTVNEVSkpOwotCQkJCW1wZHVfYmxrID0gbXBkdV9ibGstPm5leHQ7Ci0JCQkJY291bnQrKzsKLQkJCX0KLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiXG5wQkFFbnRyeS0+TGFzdEluZFNlcT0lZCFcbiIsIHBCQUVudHJ5LT5MYXN0SW5kU2VxKSk7Ci0JCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKLQkJfQotCX0KLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBSZWxlYXNlIGFsbG9jYXRlZCByZXNvdXJjZXMuCi0KLUFyZ3VtZW50czoKLSAgICAqZGV2CQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQotCXBBZAkJCQkJZHJpdmVyIGNvbnRyb2wgYmxvY2sgcG9pbnRlcgotCi1SZXR1cm4gVmFsdWU6Ci0gICAgTm9uZQotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIHZvaWQgX3J0dXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UJKm5ldF9kZXYgPSBOVUxMOwotCi0KLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJydHVzYl9kaXNjb25uZWN0OiB1bnJlZ2lzdGVyIHVzYm5ldCB1c2ItJXMtJXNcbiIsCi0JCQkJZGV2LT5idXMtPmJ1c19uYW1lLCBkZXYtPmRldnBhdGgpKTsKLQlpZiAoIXBBZCkKLQl7Ci0JCXVzYl9wdXRfZGV2KGRldik7Ci0KLQkJcHJpbnRrKCJydHVzYl9kaXNjb25uZWN0OiBwQWQgPT0gTlVMTCFcbiIpOwotCQlyZXR1cm47Ci0JfQotCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpOwotCi0KLQotCS8vIGZvciBkZWJ1Zywgd2FpdCB0byBzaG93IHNvbWUgbWVzc2FnZXMgdG8gL3Byb2Mgc3lzdGVtCi0JdWRlbGF5KDEpOwotCi0KLQotCi0JbmV0X2RldiA9IHBBZC0+bmV0X2RldjsKLQlpZiAocEFkLT5uZXRfZGV2ICE9IE5VTEwpCi0JewotCQlwcmludGsoInJ0dXNiX2Rpc2Nvbm5lY3Q6IHVucmVnaXN0ZXJfbmV0ZGV2KCksIGRldi0+bmFtZT0lcyFcbiIsIG5ldF9kZXYtPm5hbWUpOwotCQl1bnJlZ2lzdGVyX25ldGRldiAocEFkLT5uZXRfZGV2KTsKLQl9Ci0JdWRlbGF5KDEpOwotCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7Ci0JdWRlbGF5KDEpOwotCi0JLy8gZnJlZSBuZXRfZGV2aWNlIG1lbW9yeQotCWZyZWVfbmV0ZGV2KG5ldF9kZXYpOwotCi0JLy8gZnJlZSBhZGFwdGVyIG1lbW9yeQotCVJUTVBGcmVlQWRhcHRlcihwQWQpOwotCi0JLy8gcmVsZWFzZSBhIHVzZSBvZiB0aGUgdXNiIGRldmljZSBzdHJ1Y3R1cmUKLQl1c2JfcHV0X2RldihkZXYpOwotCXVkZWxheSgxKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiBSVFVTQiBkaXNjb25uZWN0IHN1Y2Nlc3NmdWxseVxuIikpOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgUHJvYmUgUlQyOFhYIGNoaXBzZXQuCi0KLUFyZ3VtZW50czoKLSAgICAqZGV2CQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQotCWludGVyZmFjZQotCSppZF90YWJsZQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZSBJRAotCi1SZXR1cm4gVmFsdWU6Ci0gICAgTm9uZQotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIGludCBydHVzYl9wcm9iZSAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCi0JCQkJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCi17Ci0JUFJUTVBfQURBUFRFUiBwQWQ7Ci0JcmV0dXJuIChpbnQpcnQyOHh4X3Byb2JlKCh2b2lkICopaW50ZiwgKHZvaWQgKilpZCwgMCwgJnBBZCk7Ci19Ci0KLQotc3RhdGljIHZvaWQgcnR1c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsKLQlzdHJ1Y3QgdXNiX2RldmljZSAgICpkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwotCVBSVE1QX0FEQVBURVIgICAgICAgcEFkOwotCi0KLQlwQWQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwotCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7Ci0KLQlfcnR1c2JfZGlzY29ubmVjdChkZXYsIHBBZCk7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBDbG9zZSBrZXJuZWwgdGhyZWFkcy4KLQotQXJndW1lbnRzOgotCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgotCi1SZXR1cm4gVmFsdWU6Ci0gICAgTk9ORQotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVDI4eHhUaHJlYWRUZXJtaW5hdGUoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpCi17Ci0JUE9TX0NPT0tJRQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCUlOVAkJCXJldDsKLQotCi0JLy8gU2xlZXAgNTAgbWlsbGlzZWNvbmRzIHNvIHBlbmRpbmcgaW8gbWlnaHQgZmluaXNoIG5vcm1hbGx5Ci0JUlRNUHVzZWNEZWxheSg1MDAwMCk7Ci0KLQkvLyBXZSB3YW50IHRvIHdhaXQgdW50aWwgYWxsIHBlbmRpbmcgcmVjZWl2ZXMgYW5kIHNlbmRzIHRvIHRoZQotCS8vIGRldmljZSBvYmplY3QuIFdlIGNhbmNlbCBhbnkKLQkvLyBpcnBzLiBXYWl0IHVudGlsIHNlbmRzIGFuZCByZWNlaXZlcyBoYXZlIHN0b3BwZWQuCi0JUlRVU0JDYW5jZWxQZW5kaW5nSVJQcyhwQWQpOwotCi0JLy8gVGVybWluYXRlIFRocmVhZHMKLQotCWlmIChwaWRfbnIocE9iai0+VGltZXJRVGhyX3BpZCkgPiAwKQotCXsKLQkJUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7Ci0KLQkJcHJpbnRrKCJUZXJtaW5hdGUgdGhlIFRpbWVyUVRocl9waWQ9JWQhXG4iLCBwaWRfbnIocE9iai0+VGltZXJRVGhyX3BpZCkpOwotCQltYigpOwotCQlwQWQtPlRpbWVyRnVuY19raWxsID0gMTsKLQkJbWIoKTsKLQkJcmV0ID0ga2lsbF9waWQocE9iai0+VGltZXJRVGhyX3BpZCwgU0lHVEVSTSwgMSk7Ci0JCWlmIChyZXQpCi0JCXsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gc3RvcCBUaW1lclFUaHJlYWQsIHBpZD0lZCwgcmV0PSVkIVxuIiwKLQkJCQkJcEFkLT5uZXRfZGV2LT5uYW1lLCBwaWRfbnIocE9iai0+VGltZXJRVGhyX3BpZCksIHJldCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZwQWQtPlRpbWVyUUNvbXBsZXRlKTsKLQkJCXBPYmotPlRpbWVyUVRocl9waWQgPSBOVUxMOwotCQl9Ci0JfQotCi0JaWYgKHBpZF9ucihwT2JqLT5NTE1FVGhyX3BpZCkgPiAwKQotCXsKLQkJcHJpbnRrKCJUZXJtaW5hdGUgdGhlIE1MTUVUaHJfcGlkPSVkIVxuIiwgcGlkX25yKHBPYmotPk1MTUVUaHJfcGlkKSk7Ci0JCW1iKCk7Ci0JCXBBZC0+bWxtZV9raWxsID0gMTsKLQkJLy9SVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Ci0JCW1iKCk7Ci0JCXJldCA9IGtpbGxfcGlkKHBPYmotPk1MTUVUaHJfcGlkLCBTSUdURVJNLCAxKTsKLQkJaWYgKHJldCkKLQkJewotCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gTWxtZSB0aHJlYWQsIHBpZD0lZCwgcmV0PSVkIVxuIiwKLQkJCQkJcEFkLT5uZXRfZGV2LT5uYW1lLCBwaWRfbnIocE9iai0+TUxNRVRocl9waWQpLCByZXQpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy93YWl0X2Zvcl9jb21wbGV0aW9uICgmcEFkLT5ub3RpZnkpOwotCQkJd2FpdF9mb3JfY29tcGxldGlvbiAoJnBBZC0+bWxtZUNvbXBsZXRlKTsKLQkJCXBPYmotPk1MTUVUaHJfcGlkID0gTlVMTDsKLQkJfQotCX0KLQotCWlmIChwaWRfbnIocE9iai0+UlRVU0JDbWRUaHJfcGlkKSA+IDApCi0JewotCQlwcmludGsoIlRlcm1pbmF0ZSB0aGUgUlRVU0JDbWRUaHJfcGlkPSVkIVxuIiwgcGlkX25yKHBPYmotPlJUVVNCQ21kVGhyX3BpZCkpOwotCQltYigpOwotCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKLQkJcEFkLT5DbWRRLkNtZFFTdGF0ZSA9IFJUMjg3MF9USFJFQURfU1RPUEVEOwotCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKLQkJbWIoKTsKLQkJLy9SVFVTQkNNRFVwKHBBZCk7Ci0JCXJldCA9IGtpbGxfcGlkKHBPYmotPlJUVVNCQ21kVGhyX3BpZCwgU0lHVEVSTSwgMSk7Ci0JCWlmIChyZXQpCi0JCXsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gUlRVU0JDbWQgdGhyZWFkLCBwaWQ9JWQsIHJldD0lZCFcbiIsCi0JCQkJCXBBZC0+bmV0X2Rldi0+bmFtZSwgcGlkX25yKHBPYmotPlJUVVNCQ21kVGhyX3BpZCksIHJldCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvL3dhaXRfZm9yX2NvbXBsZXRpb24gKCZwQWQtPm5vdGlmeSk7Ci0JCQl3YWl0X2Zvcl9jb21wbGV0aW9uICgmcEFkLT5DbWRRQ29tcGxldGUpOwotCQkJcE9iai0+UlRVU0JDbWRUaHJfcGlkID0gTlVMTDsKLQkJfQotCX0KLQotCS8vIEtpbGwgdGFza2xldHMKLQlwQWQtPm1sbWVfa2lsbCA9IDA7Ci0JcEFkLT5DbWRRLkNtZFFTdGF0ZSA9IFJUMjg3MF9USFJFQURfVU5LTk9XTjsKLQlwQWQtPlRpbWVyRnVuY19raWxsID0gMDsKLX0KLQotCi12b2lkIGtpbGxfdGhyZWFkX3Rhc2soSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JUE9TX0NPT0tJRSBwT2JqOwotCi0JcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCXRhc2tsZXRfa2lsbCgmcE9iai0+cnhfZG9uZV90YXNrKTsKLQl0YXNrbGV0X2tpbGwoJnBPYmotPm1nbXRfZG1hX2RvbmVfdGFzayk7Ci0JdGFza2xldF9raWxsKCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzayk7Ci0JdGFza2xldF9raWxsKCZwT2JqLT5hYzFfZG1hX2RvbmVfdGFzayk7Ci0JdGFza2xldF9raWxsKCZwT2JqLT5hYzJfZG1hX2RvbmVfdGFzayk7Ci0JdGFza2xldF9raWxsKCZwT2JqLT5hYzNfZG1hX2RvbmVfdGFzayk7Ci0JdGFza2xldF9raWxsKCZwT2JqLT5oY2NhX2RtYV9kb25lX3Rhc2spOwotCXRhc2tsZXRfa2lsbCgmcE9iai0+dGJ0dF90YXNrKTsKLQotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgQ2hlY2sgdGhlIGNoaXBzZXQgdmVuZG9yL3Byb2R1Y3QgSUQuCi0KLUFyZ3VtZW50czoKLSAgICBfZGV2X3AJCQkJUG9pbnQgdG8gdGhlIFBDSSBvciBVU0IgZGV2aWNlCi0KLVJldHVybiBWYWx1ZToKLSAgICBUUlVFCQkJCUNoZWNrIG9rCi0JRkFMU0UJCQkJQ2hlY2sgZmFpbAotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTiBSVDI4WFhDaGlwc2V0Q2hlY2soCi0JSU4gdm9pZCAqX2Rldl9wKQotewotCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gKHN0cnVjdCB1c2JfaW50ZXJmYWNlICopX2Rldl9wOwotCXN0cnVjdCB1c2JfZGV2aWNlICpkZXZfcCA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7Ci0JVUlOVDMyIGk7Ci0KLQotCWZvcihpPTA7IGk8cnR1c2JfdXNiX2lkX2xlbjsgaSsrKQotCXsKLQkJaWYgKGRldl9wLT5kZXNjcmlwdG9yLmlkVmVuZG9yID09IHJ0dXNiX3VzYl9pZFtpXS5pZFZlbmRvciAmJgotCQkJZGV2X3AtPmRlc2NyaXB0b3IuaWRQcm9kdWN0ID09IHJ0dXNiX3VzYl9pZFtpXS5pZFByb2R1Y3QpCi0JCXsKLQkJCXByaW50aygicnQyODcwOiBpZFZlbmRvciA9IDB4JXgsIGlkUHJvZHVjdCA9IDB4JXhcbiIsCi0JCQkJCWRldl9wLT5kZXNjcmlwdG9yLmlkVmVuZG9yLCBkZXZfcC0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoaSA9PSBydHVzYl91c2JfaWRfbGVuKQotCXsKLQkJcHJpbnRrKCJydDI4NzA6IEVycm9yISBEZXZpY2UgRGVzY3JpcHRvciBub3QgbWF0Y2hpbmchXG4iKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgSW5pdCBuZXQgZGV2aWNlIHN0cnVjdHVyZS4KLQotQXJndW1lbnRzOgotICAgIF9kZXZfcAkJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UKLSAgICAqbmV0X2RldgkJCVBvaW50IHRvIHRoZSBuZXQgZGV2aWNlCi0JKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCi0KLVJldHVybiBWYWx1ZToKLSAgICBUUlVFCQkJCUluaXQgb2sKLQlGQUxTRQkJCQlJbml0IGZhaWwKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4gUlQyOFhYTmV0RGV2SW5pdCgKLQlJTiB2b2lkIAkJCQkqX2Rldl9wLAotCUlOIHN0cnVjdCAgbmV0X2RldmljZQkqbmV0X2RldiwKLQlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKQotewotCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gKHN0cnVjdCB1c2JfaW50ZXJmYWNlICopX2Rldl9wOwotCXN0cnVjdCB1c2JfZGV2aWNlICpkZXZfcCA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7Ci0KLQotCXBBZC0+Y29uZmlnID0gJmRldl9wLT5jb25maWctPmRlc2M7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBJbml0IG5ldCBkZXZpY2Ugc3RydWN0dXJlLgotCi1Bcmd1bWVudHM6Ci0gICAgX2Rldl9wCQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQotCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgotCi1SZXR1cm4gVmFsdWU6Ci0gICAgVFJVRQkJCQlDb25maWcgb2sKLQlGQUxTRQkJCQlDb25maWcgZmFpbAotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTiBSVDI4WFhQcm9iZVBvc3RDb25maWcoCi0JSU4gdm9pZCAJCQkJKl9kZXZfcCwKLQlJTiBSVE1QX0FEQVBURVIgCQkqcEFkLAotCUlOIElOVDMyCQkJCWludGVyZmFjZSkKLXsKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKV9kZXZfcDsKLQlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9kZXNjOwotCVVMT05HIEJ1bGtPdXRJZHg7Ci0JVUlOVDMyIGk7Ci0KLQotCS8qIGdldCB0aGUgYWN0aXZlIGludGVyZmFjZSBkZXNjcmlwdG9yICovCi0JaWZhY2VfZGVzYyA9IGludGYtPmN1cl9hbHRzZXR0aW5nOwotCi0JLyogZ2V0ICMgb2YgZW5wb2ludHMgICovCi0JcEFkLT5OdW1iZXJPZlBpcGVzID0gaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAotCQkJKCJOdW1FbmRwb2ludHM9JWRcbiIsIGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50cykpOwotCi0JLyogQ29uZmlndXJlIFBpcGVzICovCi0JQnVsa091dElkeCA9IDA7Ci0KLQlmb3IoaT0wOyBpPHBBZC0+TnVtYmVyT2ZQaXBlczsgaSsrKQotCXsKLQkJaWYgKChpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJtQXR0cmlidXRlcyA9PQotCQkJCVVTQl9FTkRQT0lOVF9YRkVSX0JVTEspICYmCi0JCQkoKGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2MuYkVuZHBvaW50QWRkcmVzcyAmCi0JCQkJVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX0lOKSkKLQkJewotCQkJcEFkLT5CdWxrSW5FcEFkZHIgPSBpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJFbmRwb2ludEFkZHJlc3M7Ci0JCQlwQWQtPkJ1bGtJbk1heFBhY2tldFNpemUgPSBpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLndNYXhQYWNrZXRTaXplOwotCi0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCi0JCQkJKCJCVUxLIElOIE1heGltdW1QYWNrZXRTaXplID0gJWRcbiIsIHBBZC0+QnVsa0luTWF4UGFja2V0U2l6ZSkpOwotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAotCQkJCSgiRVAgYWRkcmVzcyA9IDB4JTJ4XG4iLCBpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJFbmRwb2ludEFkZHJlc3MpKTsKLQkJfQotCQllbHNlIGlmICgoaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy5ibUF0dHJpYnV0ZXMgPT0KLQkJCQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSykgJiYKLQkJCQkoKGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2MuYkVuZHBvaW50QWRkcmVzcyAmCi0JCQkJCVVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0gVVNCX0RJUl9PVVQpKQotCQl7Ci0JCQkvLyB0aGVyZSBhcmUgNiBidWxrIG91dCBFUC4gRVA2IGhpZ2hlc3QgcHJpb3JpdHkuCi0JCQkvLyBFUDEtNCBpcyBFRENBLiAgRVA1IGlzIEhDQ0EuCi0JCQlwQWQtPkJ1bGtPdXRFcEFkZHJbQnVsa091dElkeCsrXSA9IGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2MuYkVuZHBvaW50QWRkcmVzczsKLQkJCXBBZC0+QnVsa091dE1heFBhY2tldFNpemUgPSBpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLndNYXhQYWNrZXRTaXplOwotCi0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCi0JCQkJKCJCVUxLIE9VVCBNYXhpbXVtUGFja2V0U2l6ZSA9ICVkXG4iLCBwQWQtPkJ1bGtPdXRNYXhQYWNrZXRTaXplKSk7Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCi0JCQkJKCJFUCBhZGRyZXNzID0gMHglMnggIFxuIiwgaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy5iRW5kcG9pbnRBZGRyZXNzKSk7Ci0JCX0KLQl9Ci0KLQlpZiAoIShwQWQtPkJ1bGtJbkVwQWRkciAmJiBwQWQtPkJ1bGtPdXRFcEFkZHJbMF0pKQotCXsKLQkJcHJpbnRrKCIlczogQ291bGQgbm90IGZpbmQgYm90aCBidWxrLWluIGFuZCBidWxrLW91dCBlbmRwb2ludHNcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgRGlzYWJsZSBETUEuCi0KLUFyZ3VtZW50czoKLQkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlQyOFhYRE1BRGlzYWJsZSgKLQlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKQotewotCS8vIG5vIHVzZQotfQotCi0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBFbmFibGUgRE1BLgotCi1Bcmd1bWVudHM6Ci0JKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCi0KLVJldHVybiBWYWx1ZToKLQlOb25lCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUMjhYWERNQUVuYWJsZSgKLQlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKQotewotCVdQRE1BX0dMT19DRkdfU1RSVUMJR2xvQ2ZnOwotCVVTQl9ETUFfQ0ZHX1NUUlVDCVVzYkNmZzsKLQlpbnQJCQkJCWkgPSAwOwotCi0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4NCk7Ci0JZG8KLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKLQkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApICAmJiAoR2xvQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKLQkJCWJyZWFrOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiAgRE1BQnVzeVxuIikpOwotCQlSVE1QdXNlY0RlbGF5KDEwMDApOwotCQlpKys7Ci0JfXdoaWxlICggaSA8MjAwKTsKLQotCi0JUlRNUHVzZWNEZWxheSg1MCk7Ci0JR2xvQ2ZnLmZpZWxkLkVuVFhXcml0ZUJhY2tERE9ORSA9IDE7Ci0JR2xvQ2ZnLmZpZWxkLkVuYWJsZVJ4RE1BID0gMTsKLQlHbG9DZmcuZmllbGQuRW5hYmxlVHhETUEgPSAxOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBXUklURSBETUEgb2Zmc2V0IDB4MjA4ID0gMHgleFxuIiwgR2xvQ2ZnLndvcmQpKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7Ci0KLQlVc2JDZmcud29yZCA9IDA7Ci0JVXNiQ2ZnLmZpZWxkLnBoeWNsZWFyID0gMDsKLQkvKiB1c2IgdmVyc2lvbiBpcyAxLjEsZG8gbm90IHVzZSBidWxrIGluIGFnZ3JlZ2F0aW9uICovCi0JaWYgKHBBZC0+QnVsa0luTWF4UGFja2V0U2l6ZSA9PSA1MTIpCi0JCQlVc2JDZmcuZmllbGQuUnhCdWxrQWdnRW4gPSAxOwotCS8qIGZvciBsYXN0IHBhY2tldCwgUEJGIG1pZ2h0IHVzZSBtb3JlIHRoYW4gbGltaXRlZCwgc28gbWludXMgMiB0byBwcmV2ZW50IGZyb20gZXJyb3IgKi8KLQlVc2JDZmcuZmllbGQuUnhCdWxrQWdnTG10ID0gKE1BWF9SWEJVTEtfU0laRSAvMTAyNCktMzsKLQlVc2JDZmcuZmllbGQuUnhCdWxrQWdnVE91dCA9IDB4ODA7IC8qIDIwMDYtMTAtMTggKi8KLQlVc2JDZmcuZmllbGQuUnhCdWxrRW4gPSAxOwotCVVzYkNmZy5maWVsZC5UeEJ1bGtFbiA9IDE7Ci0KLQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBVU0JfRE1BX0NGRywgVXNiQ2ZnLndvcmQpOwotCi19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgV3JpdGUgQmVhY29uIGJ1ZmZlciB0byBBc2ljLgotCi1Bcmd1bWVudHM6Ci0JKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCi0KLVJldHVybiBWYWx1ZToKLQlOb25lCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUMjh4eF9VcGRhdGVCZWFjb25Ub0FzaWMoCi0JSU4gUlRNUF9BREFQVEVSCQkqcEFkLAotCUlOIElOVAkJCQlhcGlkeCwKLQlJTiBVTE9ORwkJCUZyYW1lTGVuLAotCUlOIFVMT05HCQkJVXBkYXRlUG9zKQotewotCVBVQ0hBUiAgICAgICAgCXBCZWFjb25GcmFtZSA9IE5VTEw7Ci0JVUNIQVIgIAkJCSpwdHI7Ci0JVUlOVCAgCQkJaSwgcGFkZGluZzsKLQlCRUFDT05fU1lOQ19TVFJVQ1QJKnBCZWFjb25TeW5jID0gcEFkLT5Db21tb25DZmcucEJlYWNvblN5bmM7Ci0JVUlOVDMyCQkJbG9uZ1ZhbHVlOwotCUJPT0xFQU4JCQliQmNuUmVxID0gRkFMU0U7Ci0JVUNIQVIJCQliY25faWR4ID0gMDsKLQotCi0JaWYgKHBCZWFjb25GcmFtZSA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJwQmVhY29uRnJhbWUgaXMgTlVMTCFcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwQmVhY29uU3luYyA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJwQmVhY29uU3luYyBpcyBOVUxMIVxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JLy9pZiAoKHBBZC0+V2RzVGFiLk1vZGUgPT0gV0RTX0JSSURHRV9NT0RFKSB8fAotCS8vCSgocEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLk1TU0lERGV2ID09IE5VTEwpIHx8ICEocEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLk1TU0lERGV2LT5mbGFncyAmIElGRl9VUCkpCi0JLy8JKQotCWlmIChiQmNuUmVxID09IEZBTFNFKQotCXsKLQkJLyogd2hlbiB0aGUgcmEgaW50ZXJmYWNlIGlzIGRvd24sIGRvIG5vdCBzZW5kIGl0cyBiZWFjb24gZnJhbWUgKi8KLQkJLyogY2xlYXIgYWxsIHplcm8gKi8KLQkJZm9yKGk9MDsgaTxUWFdJX1NJWkU7IGkrPTQpIHsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgaSwgMHgwMCk7Ci0JCX0KLQkJcEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCAmPSAofihCRUFDT05fQklUTUFQX01BU0sgJiAoMSA8PCBiY25faWR4KSkpOwotCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uVHhXSVtiY25faWR4XSwgVFhXSV9TSVpFKTsKLQl9Ci0JZWxzZQotCXsKLQkJcHRyID0gKFBVQ0hBUikmcEFkLT5CZWFjb25UeFdJOwotCi0JCWlmIChOZGlzRXF1YWxNZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvblR4V0lbYmNuX2lkeF0sICZwQWQtPkJlYWNvblR4V0ksIFRYV0lfU0laRSkgPT0gRkFMU0UpCi0JCXsJLy8gSWYgQmVhY29uVHhXSSBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHJld3JpdGUgdGhlIFR4V0kgZm9yIHRoZSBCZWFjb24gZnJhbWVzLgotCQkJcEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCAmPSAofihCRUFDT05fQklUTUFQX01BU0sgJiAoMSA8PCBiY25faWR4KSkpOwotCQkJTmRpc01vdmVNZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvblR4V0lbYmNuX2lkeF0sICZwQWQtPkJlYWNvblR4V0ksIFRYV0lfU0laRSk7Ci0JCX0KLQotCQlpZiAoKHBCZWFjb25TeW5jLT5CZWFjb25CaXRNYXAgJiAoMSA8PCBiY25faWR4KSkgIT0gKDEgPDwgYmNuX2lkeCkpCi0JCXsKLQkJCWZvciAoaT0wOyBpPFRYV0lfU0laRTsgaSs9NCkgIC8vIDE2LWJ5dGUgVFhXSSBmaWVsZAotCQkJewotCQkJCWxvbmdWYWx1ZSA9ICAqcHRyICsgKCoocHRyKzEpPDw4KSArICgqKHB0cisyKTw8MTYpICsgKCoocHRyKzMpPDwyNCk7Ci0JCQkJUlRNUF9JT19XUklURTMyKHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYmNuX2lkeF0gKyBpLCBsb25nVmFsdWUpOwotCQkJCXB0ciArPSA0OwotCQkJfQotCQl9Ci0KLQkJcHRyID0gcEJlYWNvblN5bmMtPkJlYWNvbkJ1ZltiY25faWR4XTsKLQkJcGFkZGluZyA9IChGcmFtZUxlbiAmIDB4MDEpOwotCQlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKShwQmVhY29uRnJhbWUgKyBGcmFtZUxlbiksIHBhZGRpbmcpOwotCQlGcmFtZUxlbiArPSBwYWRkaW5nOwotCQlmb3IgKGkgPSAwIDsgaSA8IEZyYW1lTGVuIC8qSFdfQkVBQ09OX09GRlNFVCovOyBpICs9IDIpCi0JCXsKLQkJCWlmIChOZGlzRXF1YWxNZW1vcnkocHRyLCBwQmVhY29uRnJhbWUsIDIpID09IEZBTFNFKQotCQkJewotCQkJCU5kaXNNb3ZlTWVtb3J5KHB0ciwgcEJlYWNvbkZyYW1lLCAyKTsKLQkJCQkvL3Nob3J0VmFsdWUgPSAqcHRyICsgKCoocHRyKzEpPDw4KTsKLQkJCQkvL1JUTVBfSU9fV1JJVEU4KHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYmNuX2lkeF0gKyBUWFdJX1NJWkUgKyBpLCBzaG9ydFZhbHVlKTsKLQkJCQlSVFVTQk11bHRpV3JpdGUocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIFRYV0lfU0laRSArIGksIHB0ciwgMik7Ci0JCQl9Ci0JCQlwdHIgKz0yOwotCQkJcEJlYWNvbkZyYW1lICs9IDI7Ci0JCX0KLQotCQlwQmVhY29uU3luYy0+QmVhY29uQml0TWFwIHw9ICgxIDw8IGJjbl9pZHgpOwotCi0JCS8vIEZvciBBUCBpbnRlcmZhY2UsIHNldCB0aGUgRHRpbUJpdE9uIHNvIHRoYXQgd2UgY2FuIHNlbmQgQmNhc3QvTWNhc3QgZnJhbWUgb3V0IGFmdGVyIHRoaXMgYmVhY29uIGZyYW1lLgotCX0KLQotfQotCi0KLVZPSUQgUlQyODcwX0Jzc0JlYWNvblN0b3AoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpCi17Ci0JQkVBQ09OX1NZTkNfU1RSVUNUCSpwQmVhY29uU3luYzsKLQlpbnQgaSwgb2Zmc2V0OwotCUJPT0xFQU4JQ2FuY2VsbGVkID0gVFJVRTsKLQotCXBCZWFjb25TeW5jID0gcEFkLT5Db21tb25DZmcucEJlYWNvblN5bmM7Ci0JaWYgKHBCZWFjb25TeW5jICYmIHBCZWFjb25TeW5jLT5FbmFibGVCZWFjb24pCi0JewotCQlJTlQgTnVtT2ZCY247Ci0KLQkJTnVtT2ZCY24gPSBNQVhfTUVTSF9OVU07Ci0KLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPkNvbW1vbkNmZy5CZWFjb25VcGRhdGVUaW1lciwgJkNhbmNlbGxlZCk7Ci0KLQkJZm9yKGk9MDsgaTxOdW1PZkJjbjsgaSsrKQotCQl7Ci0JCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uQnVmW2ldLCBIV19CRUFDT05fT0ZGU0VUKTsKLQkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25UeFdJW2ldLCBUWFdJX1NJWkUpOwotCi0JCQlmb3IgKG9mZnNldD0wOyBvZmZzZXQ8SFdfQkVBQ09OX09GRlNFVDsgb2Zmc2V0Kz00KQotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2ldICsgb2Zmc2V0LCAweDAwKTsKLQotCQkJcEJlYWNvblN5bmMtPkNhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvbltpXSA9IDA7Ci0JCQlwQmVhY29uU3luYy0+VGltSUVMb2NhdGlvbkluQmVhY29uW2ldID0gMDsKLQkJfQotCQlwQmVhY29uU3luYy0+QmVhY29uQml0TWFwID0gMDsKLQkJcEJlYWNvblN5bmMtPkR0aW1CaXRPbiA9IDA7Ci0JfQotfQotCi0KLVZPSUQgUlQyODcwX0Jzc0JlYWNvblN0YXJ0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKQotewotCWludCBhcGlkeDsKLQlCRUFDT05fU1lOQ19TVFJVQ1QJKnBCZWFjb25TeW5jOwotLy8JTEFSR0VfSU5URUdFUiAJdHNmVGltZSwgZGVsdGFUaW1lOwotCi0JcEJlYWNvblN5bmMgPSBwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYzsKLQlpZiAocEJlYWNvblN5bmMgJiYgcEJlYWNvblN5bmMtPkVuYWJsZUJlYWNvbikKLQl7Ci0JCUlOVCBOdW1PZkJjbjsKLQotCQlOdW1PZkJjbiA9IE1BWF9NRVNIX05VTTsKLQotCQlmb3IoYXBpZHg9MDsgYXBpZHg8TnVtT2ZCY247IGFwaWR4KyspCi0JCXsKLQkJCVVDSEFSIENhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvbiA9IDA7Ci0JCQlVQ0hBUiBUaW1JRUxvY2F0aW9uSW5CZWFjb24gPSAwOwotCi0JCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uQnVmW2FwaWR4XSwgSFdfQkVBQ09OX09GRlNFVCk7Ci0JCQlwQmVhY29uU3luYy0+Q2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uW2FwaWR4XSA9IENhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvbjsKLQkJCXBCZWFjb25TeW5jLT5UaW1JRUxvY2F0aW9uSW5CZWFjb25bYXBpZHhdID0gVGltSUVMb2NhdGlvbkluQmVhY29uOwotCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvblR4V0lbYXBpZHhdLCBUWFdJX1NJWkUpOwotCQl9Ci0JCXBCZWFjb25TeW5jLT5CZWFjb25CaXRNYXAgPSAwOwotCQlwQmVhY29uU3luYy0+RHRpbUJpdE9uID0gMDsKLQkJcEFkLT5Db21tb25DZmcuQmVhY29uVXBkYXRlVGltZXIuUmVwZWF0ID0gVFJVRTsKLQotCQlwQWQtPkNvbW1vbkNmZy5CZWFjb25BZGp1c3QgPSAwOwotCQlwQWQtPkNvbW1vbkNmZy5CZWFjb25GYWN0b3IgPSAweGZmZmZmZmZmIC8gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCAxMCk7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvblJlbWFpbiA9ICgweGZmZmZmZmZmICUgKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCAxMCkpICsgMTsKLQkJcHJpbnRrKFJUMjh4eF9DSElQX05BTUUgIl9Cc3NCZWFjb25TdGFydDpCZWFjb25GYWN0b3I9JWQsIEJlYWNvblJlbWFpbj0lZCFcbiIsIHBBZC0+Q29tbW9uQ2ZnLkJlYWNvbkZhY3RvciwgcEFkLT5Db21tb25DZmcuQmVhY29uUmVtYWluKTsKLQkJUlRNUFNldFRpbWVyKCZwQWQtPkNvbW1vbkNmZy5CZWFjb25VcGRhdGVUaW1lciwgcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kKTsKLQotCX0KLX0KLQotCi1WT0lEIFJUMjg3MF9Cc3NCZWFjb25Jbml0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKQotewotCUJFQUNPTl9TWU5DX1NUUlVDVAkqcEJlYWNvblN5bmM7Ci0JaW50IGk7Ci0KLQlOZGlzQWxsb2NNZW1vcnkocEFkLT5Db21tb25DZmcucEJlYWNvblN5bmMsIHNpemVvZihCRUFDT05fU1lOQ19TVFJVQ1QpLCBNRU1fQUxMT0NfRkxBRyk7Ci0JaWYgKHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jKQotCXsKLQkJcEJlYWNvblN5bmMgPSBwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYzsKLQkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMsIHNpemVvZihCRUFDT05fU1lOQ19TVFJVQ1QpKTsKLQkJZm9yKGk9MDsgaSA8IEhXX0JFQUNPTl9NQVhfQ09VTlQ7IGkrKykKLQkJewotCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvbkJ1ZltpXSwgSFdfQkVBQ09OX09GRlNFVCk7Ci0JCQlwQmVhY29uU3luYy0+Q2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uW2ldID0gMDsKLQkJCXBCZWFjb25TeW5jLT5UaW1JRUxvY2F0aW9uSW5CZWFjb25baV0gPSAwOwotCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvblR4V0lbaV0sIFRYV0lfU0laRSk7Ci0JCX0KLQkJcEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCA9IDA7Ci0KLQkJLy9SVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLkJlYWNvblVwZGF0ZVRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oQmVhY29uVXBkYXRlRXhlYyksIHBBZCwgVFJVRSk7Ci0JCXBCZWFjb25TeW5jLT5FbmFibGVCZWFjb24gPSBUUlVFOwotCX0KLX0KLQotCi1WT0lEIFJUMjg3MF9Cc3NCZWFjb25FeGl0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKQotewotCUJFQUNPTl9TWU5DX1NUUlVDVAkqcEJlYWNvblN5bmM7Ci0JQk9PTEVBTglDYW5jZWxsZWQgPSBUUlVFOwotCWludCBpOwotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jKQotCXsKLQkJcEJlYWNvblN5bmMgPSBwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYzsKLQkJcEJlYWNvblN5bmMtPkVuYWJsZUJlYWNvbiA9IEZBTFNFOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+Q29tbW9uQ2ZnLkJlYWNvblVwZGF0ZVRpbWVyLCAmQ2FuY2VsbGVkKTsKLQkJcEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCA9IDA7Ci0KLQkJZm9yKGk9MDsgaTxIV19CRUFDT05fTUFYX0NPVU5UOyBpKyspCi0JCXsKLQkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25CdWZbaV0sIEhXX0JFQUNPTl9PRkZTRVQpOwotCQkJcEJlYWNvblN5bmMtPkNhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvbltpXSA9IDA7Ci0JCQlwQmVhY29uU3luYy0+VGltSUVMb2NhdGlvbkluQmVhY29uW2ldID0gMDsKLQkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25UeFdJW2ldLCBUWFdJX1NJWkUpOwotCQl9Ci0KLQkJTmRpc0ZyZWVNZW1vcnkocEFkLT5Db21tb25DZmcucEJlYWNvblN5bmMsIEhXX0JFQUNPTl9PRkZTRVQgKiBIV19CRUFDT05fTUFYX0NPVU5ULCAwKTsKLQkJcEFkLT5Db21tb25DZmcucEJlYWNvblN5bmMgPSBOVUxMOwotCX0KLX0KLQotVk9JRCBCZWFjb25VcGRhdGVFeGVjKAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLSAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKLXsKLQlQUlRNUF9BREFQVEVSCXBBZCA9IChQUlRNUF9BREFQVEVSKUZ1bmN0aW9uQ29udGV4dDsKLQlMQVJHRV9JTlRFR0VSCXRzZlRpbWVfYTsvLywgdHNmVGltZV9iLCBkZWx0YVRpbWVfZXhwLCBkZWx0YVRpbWVfYWI7Ci0JVUlOVDMyCQkJZGVsdGEsIHJlbWFpbiwgcmVtYWluX2xvdywgcmVtYWluX2hpZ2g7Ci0vLwlCT09MRUFOCQkJcG9zaXRpdmU7Ci0KLQlSZVN5bmNCZWFjb25UaW1lKHBBZCk7Ci0KLQotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBUU0ZfVElNRVJfRFcwLCAmdHNmVGltZV9hLnUuTG93UGFydCk7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBUU0ZfVElNRVJfRFcxLCAmdHNmVGltZV9hLnUuSGlnaFBhcnQpOwotCi0KLQkvL3Bvc2l0aXZlPWdldERlbHRhVGltZSh0c2ZUaW1lX2EsIGV4cGVjdGVkVGltZSwgJmRlbHRhVGltZV9leHApOwotCXJlbWFpbl9oaWdoID0gcEFkLT5Db21tb25DZmcuQmVhY29uUmVtYWluICogdHNmVGltZV9hLnUuSGlnaFBhcnQ7Ci0JcmVtYWluX2xvdyA9IHRzZlRpbWVfYS51Lkxvd1BhcnQgJSAocEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDEwKTsKLQlyZW1haW4gPSAocmVtYWluX2hpZ2ggKyByZW1haW5fbG93KSUocEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDEwKTsKLQlkZWx0YSA9IChwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgMTApIC0gcmVtYWluOwotCi0JcEFkLT5Db21tb25DZmcuQmVhY29uVXBkYXRlVGltZXIuVGltZXJWYWx1ZSA9IChkZWx0YSA+PiAxMCkgKyAxMDsKLQotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL0tjb25maWcKaW5kZXggYWVhNWM4Mi4uZmQzYmEzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvS2NvbmZpZwpAQCAtMSw1ICsxLDcgQEAKIGNvbmZpZyBSVDI4NzAKIAl0cmlzdGF0ZSAiUmFsaW5rIDI4NzAvMzA3MCB3aXJlbGVzcyBzdXBwb3J0IgogCWRlcGVuZHMgb24gVVNCICYmIFg4NiAmJiBXTEFOCisJc2VsZWN0IFdJUkVMRVNTX0VYVAorCXNlbGVjdCBXRVhUX1BSSVYKIAktLS1oZWxwLS0tCiAJICBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBkcml2ZXIgZm9yIHRoZSBSYWxpbmsgeHg3MCB3aXJlbGVzcyBjaGlwcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL01ha2VmaWxlCmluZGV4IDMwNmMzMzEuLjUyM2U3ZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9NYWtlZmlsZQpAQCAtMSwyNyArMSwzNSBAQAorIwogb2JqLSQoQ09ORklHX1JUMjg3MCkJKz0gcnQyODcwc3RhLm8KIAogIyBUT0RPOiBhbGwgb2YgdGhlc2Ugc2hvdWxkIGJlIHJlbW92ZWQKIEVYVFJBX0NGTEFHUyArPSAtRExJTlVYIC1EQUdHUkVHQVRJT05fU1VQUE9SVCAtRFBJR0dZQkFDS19TVVBQT1JUIC1EV01NX1NVUFBPUlQKLUVYVFJBX0NGTEFHUyArPSAtRFJUMjg3MCAtRFJUMzA3MAorRVhUUkFfQ0ZMQUdTICs9IC1EUlRNUF9NQUNfVVNCIC1EUlRNUF9VU0JfU1VQUE9SVCAtRFJUMjg3MCAtRFJUTVBfVElNRVJfVEFTS19TVVBQT1JUCitFWFRSQV9DRkxBR1MgKz0gLURSVE1QX1JGX1JXX1NVUFBPUlQgLURSVE1QX0VGVVNFX1NVUFBPUlQgLURSVDMweHggLURSVDMwNzAKIEVYVFJBX0NGTEFHUyArPSAtRERCRwogCiBydDI4NzBzdGEtb2JqcyA6PQkJXAotCWNvbW1vbi9tZDUubwkJXAorCWNvbW1vbi9jcnlwdF9tZDUubwlcCisJY29tbW9uL2NyeXB0X3NoYTIubwlcCisJY29tbW9uL2NyeXB0X2htYWMubwlcCiAJY29tbW9uL21sbWUubwkJXAotCWNvbW1vbi9ydG1wX3dlcC5vCVwKKwljb21tb24vY21tX3dlcC5vCVwKIAljb21tb24vYWN0aW9uLm8JCVwKIAljb21tb24vY21tX2RhdGEubwlcCiAJY29tbW9uL3J0bXBfaW5pdC5vCVwKLQljb21tb24vcnRtcF90a2lwLm8JXAorCWNvbW1vbi9jbW1fdGtpcC5vCVwKKwljb21tb24vY21tX2Flcy5vCVwKIAljb21tb24vY21tX3N5bmMubwlcCiAJY29tbW9uL2VlcHJvbS5vCQlcCiAJY29tbW9uL2NtbV9zYW5pdHkubwlcCiAJY29tbW9uL2NtbV9pbmZvLm8JXAorCWNvbW1vbi9jbW1fY2ZnLm8JXAogCWNvbW1vbi9jbW1fd3BhLm8JXAogCWNvbW1vbi9kZnMubwkJXAogCWNvbW1vbi9zcGVjdHJ1bS5vCVwKKwljb21tb24vcnRtcF90aW1lci5vCVwKKwljb21tb24vcnRfY2hhbm5lbC5vCVwKKwljb21tb24vY21tX2FzaWMubwlcCiAJc3RhL2Fzc29jLm8JCVwKLQlzdGEvYWlyb25ldC5vCQlcCiAJc3RhL2F1dGgubwkJXAogCXN0YS9hdXRoX3JzcC5vCQlcCiAJc3RhL3N5bmMubwkJXApAQCAtMzAsMTQgKzM4LDE4IEBACiAJc3RhL2Nvbm5lY3QubwkJXAogCXN0YS93cGEubwkJXAogCXJ0X2xpbnV4Lm8JCVwKLQlydF9wcm9maWxlLm8JCVwKIAlydF9tYWluX2Rldi5vCQlcCiAJc3RhX2lvY3RsLm8JCVwKIAljb21tb24vYmFfYWN0aW9uLm8JXAotCTI4NzBfbWFpbl9kZXYubwkJXAotCWNvbW1vbi8yODcwX3J0bXBfaW5pdC5vCVwKKwl1c2JfbWFpbl9kZXYubwkJXAorCXJ0X3VzYi5vCQlcCisJY29tbW9uL2NtbV9tYWNfdXNiLm8JXAogCWNvbW1vbi9ydHVzYl9pby5vCVwKIAljb21tb24vcnR1c2JfYnVsay5vCVwKIAljb21tb24vcnR1c2JfZGF0YS5vCVwKLQljb21tb24vY21tX2RhdGFfMjg3MC5vCi0KKwljb21tb24vY21tX2RhdGFfdXNiLm8JXAorCWNvbW1vbi9ydG1wX21jdS5vCVwKKwljb21tb24vZWVfZWZ1c2UubwlcCisJY2hpcHMvcnQzMHh4Lm8JCVwKKwljb21tb24vcnRfcmYubwkJXAorCWNoaXBzL3J0MzA3MC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NoaXBzL3J0MzA3MC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jaGlwcy9ydDMwNzAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTZkYjVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jaGlwcy9ydDMwNzAuYwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSAiLi4vLi4vcnQyODYwL2NoaXBzL3J0MzA3MC5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jaGlwcy9ydDMweHguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY2hpcHMvcnQzMHh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1NmI4NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY2hpcHMvcnQzMHh4LmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uLy4uL3J0Mjg2MC9jaGlwcy9ydDMweHguYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uLzI4NzBfcnRtcF9pbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi8yODcwX3J0bXBfaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTE3ZDllLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uLzI4NzBfcnRtcF9pbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMwICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JMjg3MF9ydG1wX2luaXQuYwotCi0JQWJzdHJhY3Q6Ci0JTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCi0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVBhdWwgTGluICAgIDIwMDItMDgtMDEgICAgY3JlYXRlZAotICAgIEpvaG4gQ2hhbmcgIDIwMDQtMDgtMjAgICAgUlQyNTYxLzI2NjEgdXNlIHNjYXR0ZXItZ2F0aGVyIHNjaGVtZQotICAgIEphbiBMZWUgIAkyMDA2LTA5LTE1ICAgIFJUMjg2MC4gQ2hhbmdlIGZvciA4MDIuMTFuICwgRUVQUk9NLCBMZWQsIEJBLCBIVC4KLQlTYW1wbGUgTGluCTIwMDctMDUtMzEgICAgTWVyZ2UgUlQyODYwIGFuZCBSVDI4NzAgZHJpdmVycy4KLSovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi1zdGF0aWMgdm9pZCByeF9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyB2b2lkIHJ0Mjg3MF9oY2NhX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyB2b2lkIHJ0Mjg3MF9hYzNfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgcnQyODcwX2FjMl9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgdm9pZCBydDI4NzBfYWMxX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyB2b2lkIHJ0Mjg3MF9hYzBfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgcnQyODcwX21nbXRfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgcnQyODcwX251bGxfZnJhbWVfY29tcGxldGVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgcnQyODcwX3J0c19mcmFtZV9jb21wbGV0ZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgdm9pZCBydDI4NzBfcHNwb2xsX2ZyYW1lX2NvbXBsZXRlX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyB2b2lkIHJ0Mjg3MF9kYXRhb3V0X2NvbXBsZXRlX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEluaXRpYWxpemUgcmVjZWl2ZSBkYXRhIHN0cnVjdHVyZXMuCi0KLUFyZ3VtZW50czoKLSAgICBwQWQJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotUmV0dXJuIFZhbHVlOgotCU5ESVNfU1RBVFVTX1NVQ0NFU1MKLQlORElTX1NUQVRVU19SRVNPVVJDRVMKLQotTm90ZToKLQlJbml0aWFsaXplIGFsbCByZWNlaXZlIHJlbGVhdGVkIHByaXZhdGUgYnVmZmVyLCBpbmNsdWRlIHRob3NlIGRlZmluZQotCWluIFJUTVBfQURBUFRFUiBzdHJ1Y3R1cmUgYW5kIGFsbCBwcml2YXRlIGRhdGEgc3RydWN0dXJlcy4gVGhlIG1haG9yCi0Jd29yayBpcyB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIGVhY2ggcGFja2V0IGFuZCBjaGFpbiBidWZmZXIgdG8KLQlORElTIHBhY2tldCBkZXNjcmlwdG9yLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMJTklDSW5pdFJlY3YoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JVUNIQVIJCQkJaTsKLQlORElTX1NUQVRVUwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JUE9TX0NPT0tJRQkJCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJbml0UmVjdlxuIikpOwotCXBPYmogPSBwT2JqOwotCi0JLy9JbnRlcmxvY2tlZEV4Y2hhbmdlKCZwQWQtPlBlbmRpbmdSeCwgMCk7Ci0JcEFkLT5QZW5kaW5nUnggPSAwOwotCXBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4IAk9IDA7CS8vIE5leHQgUnggUmVhZCBpbmRleAotCXBBZC0+TmV4dFJ4QnVsa0luSW5kZXgJCT0gMCA7IC8vUlhfUklOR19TSVpFIC0xOyAvLyBSeCBCdWxrIHBvaW50ZXIKLQlwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uIAk9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgKFJYX1JJTkdfU0laRSk7IGkrKykKLQl7Ci0JCVBSWF9DT05URVhUICBwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7Ci0KLQkJLy9BbGxvY2F0ZSBVUkIKLQkJcFJ4Q29udGV4dC0+cFVyYiA9IFJUVVNCX0FMTE9DX1VSQigwKTsKLQkJaWYgKHBSeENvbnRleHQtPnBVcmIgPT0gTlVMTCkKLQkJewotCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwotCQkJZ290byBvdXQxOwotCQl9Ci0KLQkJLy8gQWxsb2NhdGUgdHJhbnNmZXIgYnVmZmVyCi0JCXBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyID0gUlRVU0JfVVJCX0FMTE9DX0JVRkZFUihwT2JqLT5wVXNiX0RldiwgTUFYX1JYQlVMS19TSVpFLCAmcFJ4Q29udGV4dC0+ZGF0YV9kbWEpOwotCQlpZiAocFJ4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPT0gTlVMTCkKLQkJewotCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwotCQkJZ290byBvdXQxOwotCQl9Ci0KLQkJTmRpc1plcm9NZW1vcnkocFJ4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXIsIE1BWF9SWEJVTEtfU0laRSk7Ci0KLQkJcFJ4Q29udGV4dC0+cEFkCT0gcEFkOwotCQlwUnhDb250ZXh0LT5wSXJwID0gTlVMTDsKLQkJcFJ4Q29udGV4dC0+SW5Vc2UJCT0gRkFMU0U7Ci0JCXBSeENvbnRleHQtPklSUFBlbmRpbmcJPSBGQUxTRTsKLQkJcFJ4Q29udGV4dC0+UmVhZGFibGUJPSBGQUxTRTsKLQkJLy9wUnhDb250ZXh0LT5SZW9yZGVySW5Vc2UgPSBGQUxTRTsKLQkJcFJ4Q29udGV4dC0+YlJ4SGFuZGxpbmcgPSBGQUxTRTsKLQkJcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0ID0gMDsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSW5pdFJlY3ZcbiIpKTsKLQlyZXR1cm4gU3RhdHVzOwotCi1vdXQxOgotCWZvciAoaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFKTsgaSsrKQotCXsKLQkJUFJYX0NPTlRFWFQgIHBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKLQotCQlpZiAoTlVMTCAhPSBwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlcikKLQkJewotCQkJUlRVU0JfVVJCX0ZSRUVfQlVGRkVSKHBPYmotPnBVc2JfRGV2LCBNQVhfUlhCVUxLX1NJWkUsCi0JCQkJCQkJCXBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLCBwUnhDb250ZXh0LT5kYXRhX2RtYSk7Ci0JCQlwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9IE5VTEw7Ci0JCX0KLQotCQlpZiAoTlVMTCAhPSBwUnhDb250ZXh0LT5wVXJiKQotCQl7Ci0JCQlSVFVTQl9VTkxJTktfVVJCKHBSeENvbnRleHQtPnBVcmIpOwotCQkJUlRVU0JfRlJFRV9VUkIocFJ4Q29udGV4dC0+cFVyYik7Ci0JCQlwUnhDb250ZXh0LT5wVXJiID0gTlVMTDsKLQkJfQotCX0KLQotCXJldHVybiBTdGF0dXM7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBJbml0aWFsaXplIHRyYW5zbWl0IGRhdGEgc3RydWN0dXJlcy4KLQotQXJndW1lbnRzOgotICAgIHBBZAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi1SZXR1cm4gVmFsdWU6Ci0JTkRJU19TVEFUVVNfU1VDQ0VTUwotCU5ESVNfU1RBVFVTX1JFU09VUkNFUwotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMJTklDSW5pdFRyYW5zbWl0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotI2RlZmluZSBMTV9VU0JfQUxMT0MocE9iaiwgQ29udGV4dCwgVEJfVHlwZSwgQnVmZmVyU2l6ZSwgU3RhdHVzLCBtc2cxLCBlcnIxLCBtc2cyLCBlcnIyKQlcCi0JQ29udGV4dC0+cFVyYiA9IFJUVVNCX0FMTE9DX1VSQigwKTsJCVwKLQlpZiAoQ29udGV4dC0+cFVyYiA9PSBOVUxMKSB7CQkJXAotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgbXNnMSk7CQlcCi0JCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsJCVwKLQkJZ290byBlcnIxOyB9CQkJCQkJXAotCQkJCQkJCQkJCQlcCi0JQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPSAJCQkJXAotCQkoVEJfVHlwZSlSVFVTQl9VUkJfQUxMT0NfQlVGRkVSKHBPYmotPnBVc2JfRGV2LCBCdWZmZXJTaXplLCAmQ29udGV4dC0+ZGF0YV9kbWEpOwlcCi0JaWYgKENvbnRleHQtPlRyYW5zZmVyQnVmZmVyID09IE5VTEwpIHsJXAotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgbXNnMik7CQlcCi0JCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsJCVwKLQkJZ290byBlcnIyOyB9Ci0KLSNkZWZpbmUgTE1fVVJCX0ZSRUUocE9iaiwgQ29udGV4dCwgQnVmZmVyU2l6ZSkJCQkJXAotCWlmIChOVUxMICE9IENvbnRleHQtPnBVcmIpIHsJCQkJCQkJXAotCQlSVFVTQl9VTkxJTktfVVJCKENvbnRleHQtPnBVcmIpOwkJCQkJXAotCQlSVFVTQl9GUkVFX1VSQihDb250ZXh0LT5wVXJiKTsJCQkJCQlcCi0JCUNvbnRleHQtPnBVcmIgPSBOVUxMOyB9CQkJCQkJCQlcCi0JaWYgKE5VTEwgIT0gQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIpIHsJCQkJXAotCQlSVFVTQl9VUkJfRlJFRV9CVUZGRVIocE9iai0+cFVzYl9EZXYsIEJ1ZmZlclNpemUsCVwKLQkJCQkJCQkJQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIsCVwKLQkJCQkJCQkJQ29udGV4dC0+ZGF0YV9kbWEpOwkJCVwKLQkJQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPSBOVUxMOyB9Ci0KLQlVQ0hBUgkJCWksIGFjaWR4OwotCU5ESVNfU1RBVFVTICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCVBUWF9DT05URVhUCQlwTnVsbENvbnRleHQgICA9ICYocEFkLT5OdWxsQ29udGV4dCk7Ci0JUFRYX0NPTlRFWFQJCXBQc1BvbGxDb250ZXh0ID0gJihwQWQtPlBzUG9sbENvbnRleHQpOwotCVBUWF9DT05URVhUCQlwUlRTQ29udGV4dCAgICA9ICYocEFkLT5SVFNDb250ZXh0KTsKLQlQVFhfQ09OVEVYVAkJcE1MTUVDb250ZXh0ID0gTlVMTDsKLS8vCVBIVF9UWF9DT05URVhUCXBIVFRYQ29udGV4dCA9IE5VTEw7Ci0JUE9TX0NPT0tJRQkJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQlQVk9JRAkJCVJpbmdCYXNlVmE7Ci0vLwlSVE1QX1RYX1JJTkcJKnBUeFJpbmc7Ci0JUlRNUF9NR01UX1JJTkcgICpwTWdtdFJpbmc7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDSW5pdFRyYW5zbWl0XG4iKSk7Ci0JcE9iaiA9IHBPYmo7Ci0KLQkvLyBJbml0IDQgc2V0IG9mIFR4IHBhcmFtZXRlcnMKLQlmb3IoYWNpZHggPSAwOyBhY2lkeCA8IE5VTV9PRl9UWF9SSU5HOyBhY2lkeCsrKQotCXsKLQkJLy8gSW5pdGlhbGl6ZSBhbGwgVHJhbnNtaXQgcmVsZWF0ZWQgcXVldWVzCi0JCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmcEFkLT5UeFN3UXVldWVbYWNpZHhdKTsKLQotCQkvLyBOZXh0IExvY2FsIHR4IHJpbmcgcG9pbnRlciB3YWl0aW5nIGZvciBidWNrIG91dAotCQlwQWQtPk5leHRCdWxrT3V0SW5kZXhbYWNpZHhdID0gYWNpZHg7Ci0JCXBBZC0+QnVsa091dFBlbmRpbmdbYWNpZHhdID0gRkFMU0U7IC8vIEJ1Y2sgT3V0IGNvbnRyb2wgZmxhZwotCQkvL3BBZC0+RGF0YUJ1bGtEb25lSWR4W2FjaWR4XSA9IDA7Ci0JfQotCi0JLy9wQWQtPk5leHRNTE1FSW5kZXgJPSAwOwotCS8vcEFkLT5QdXNoTWdtdEluZGV4CT0gMDsKLQkvL3BBZC0+UG9wTWdtdEluZGV4CT0gMDsKLQkvL0ludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+TWdtdFF1ZXVlU2l6ZSwgMCk7Ci0JLy9JbnRlcmxvY2tlZEV4Y2hhbmdlKCZwQWQtPlR4Q291bnQsIDApOwotCi0JLy9wQWQtPlByaW9SaW5nRmlyc3RJbmRleAk9IDA7Ci0JLy9wQWQtPlByaW9SaW5nVHhDbnQJCT0gMDsKLQotCWRvCi0JewotCQkvLwotCQkvLyBUWF9SSU5HX1NJWkUsIDQgQUNzCi0JCS8vCi0JCWZvcihhY2lkeD0wOyBhY2lkeDw0OyBhY2lkeCsrKQotCQl7Ci0JCQlQSFRfVFhfQ09OVEVYVAlwSFRUWENvbnRleHQgPSAmKHBBZC0+VHhDb250ZXh0W2FjaWR4XSk7Ci0KLQkJCU5kaXNaZXJvTWVtb3J5KHBIVFRYQ29udGV4dCwgc2l6ZW9mKEhUX1RYX0NPTlRFWFQpKTsKLQkJCS8vQWxsb2NhdGUgVVJCCi0JCQlMTV9VU0JfQUxMT0MocE9iaiwgcEhUVFhDb250ZXh0LCBQSFRUWF9CVUZGRVIsIHNpemVvZihIVFRYX0JVRkZFUiksIFN0YXR1cywKLQkJCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBUeENvbnRleHRbJWRdIHVyYiEhIFxuIiwgYWNpZHgpLAotCQkJCQkJCWRvbmUsCi0JCQkJCQkJKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggVHhDb250ZXh0WyVkXSBIVFRYX0JVRkZFUiAhISBcbiIsIGFjaWR4KSwKLQkJCQkJCQlvdXQxKTsKLQotCQkJTmRpc1plcm9NZW1vcnkocEhUVFhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+QWdncmVnYXRpb24sIDQpOwotCQkJcEhUVFhDb250ZXh0LT5wQWQgPSBwQWQ7Ci0JCQlwSFRUWENvbnRleHQtPnBJcnAgPSBOVUxMOwotCQkJcEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7Ci0JCQlwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPSAwOwotCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9IDA7Ci0JCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPSAwOwotCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgPSAwOwotCQkJcEhUVFhDb250ZXh0LT5CdWxrT3V0U2l6ZSA9IDA7Ci0JCQlwSFRUWENvbnRleHQtPkJ1bGtPdXRQaXBlSWQgPSBhY2lkeDsKLQkJCXBIVFRYQ29udGV4dC0+YlJpbmdFbXB0eSA9IFRSVUU7Ci0JCQlwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCA9IEZBTFNFOwotCi0JCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW2FjaWR4XSA9IEZBTFNFOwotCQl9Ci0KLQotCQkvLwotCQkvLyBNR01UX1JJTkdfU0laRQotCQkvLwotCQkvLyBBbGxvY2F0ZSBNR01UIHJpbmcgZGVzY3JpcHRvcidzIG1lbW9yeQotCQlwQWQtPk1nbXREZXNjUmluZy5BbGxvY1NpemUgPSBNR01UX1JJTkdfU0laRSAqIHNpemVvZihUWF9DT05URVhUKTsKLQkJUlRNUEFsbG9jYXRlTWVtb3J5KCZwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhLCBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1NpemUpOwotCQlpZiAocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSA9PSBOVUxMKQotCQl7Ci0JCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgYSBiaWcgYnVmZmVyIGZvciBNZ210RGVzY1JpbmchXG4iKSk7Ci0JCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7Ci0JCQlnb3RvIG91dDE7Ci0JCX0KLQkJTmRpc1plcm9NZW1vcnkocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplKTsKLQkJUmluZ0Jhc2VWYSAgICAgPSBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhOwotCi0JCS8vIEluaXRpYWxpemUgTUdNVCBSaW5nIGFuZCBhc3NvY2lhdGVkIGJ1ZmZlciBtZW1vcnkKLQkJcE1nbXRSaW5nID0gJnBBZC0+TWdtdFJpbmc7Ci0JCWZvciAoaSA9IDA7IGkgPCBNR01UX1JJTkdfU0laRTsgaSsrKQotCQl7Ci0JCQkvLyBsaW5rIHRoZSBwcmUtYWxsb2NhdGVkIE1nbXQgYnVmZmVyIHRvIE1nbXRSaW5nLkNlbGwKLQkJCXBNZ210UmluZy0+Q2VsbFtpXS5BbGxvY1NpemUgPSBzaXplb2YoVFhfQ09OVEVYVCk7Ci0JCQlwTWdtdFJpbmctPkNlbGxbaV0uQWxsb2NWYSA9IFJpbmdCYXNlVmE7Ci0JCQlwTWdtdFJpbmctPkNlbGxbaV0ucE5kaXNQYWNrZXQgPSBOVUxMOwotCQkJcE1nbXRSaW5nLT5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0KLQkJCS8vQWxsb2NhdGUgVVJCIGZvciBNTE1FQ29udGV4dAotCQkJcE1MTUVDb250ZXh0ID0gKFBUWF9DT05URVhUKSBwQWQtPk1nbXRSaW5nLkNlbGxbaV0uQWxsb2NWYTsKLQkJCXBNTE1FQ29udGV4dC0+cFVyYiA9IFJUVVNCX0FMTE9DX1VSQigwKTsKLQkJCWlmIChwTUxNRUNvbnRleHQtPnBVcmIgPT0gTlVMTCkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggTUxNRUNvbnRleHRbJWRdIHVyYiEhIFxuIiwgaSkpOwotCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKLQkJCQlnb3RvIG91dDI7Ci0JCQl9Ci0JCQlwTUxNRUNvbnRleHQtPnBBZCA9IHBBZDsKLQkJCXBNTE1FQ29udGV4dC0+cElycCA9IE5VTEw7Ci0JCQlwTUxNRUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyID0gTlVMTDsKLQkJCXBNTE1FQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKLQkJCXBNTE1FQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOwotCQkJcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPSBGQUxTRTsKLQkJCXBNTE1FQ29udGV4dC0+QnVsa091dFNpemUgPSAwOwotCQkJcE1MTUVDb250ZXh0LT5TZWxmSWR4ID0gaTsKLQotCQkJLy8gT2Zmc2V0IHRvIG5leHQgcmluZyBkZXNjcmlwdG9yIGFkZHJlc3MKLQkJCVJpbmdCYXNlVmEgPSAoUFVDSEFSKSBSaW5nQmFzZVZhICsgc2l6ZW9mKFRYX0NPTlRFWFQpOwotCQl9Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1HTVQgUmluZzogdG90YWwgJWQgZW50cnkgYWxsb2NhdGVkXG4iLCBpKSk7Ci0KLQkJLy9wQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID0gKE1HTVRfUklOR19TSVpFIC0gMSk7Ci0JCXBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPSBNR01UX1JJTkdfU0laRTsKLQkJcEFkLT5NZ210UmluZy5UeENwdUlkeCA9IDA7Ci0JCXBBZC0+TWdtdFJpbmcuVHhEbWFJZHggPSAwOwotCi0JCS8vCi0JCS8vIEJFQUNPTl9SSU5HX1NJWkUKLQkJLy8KLQkJZm9yKGk9MDsgaTxCRUFDT05fUklOR19TSVpFOyBpKyspIC8vIDIKLQkJewotCQkJUFRYX0NPTlRFWFQJcEJlYWNvbkNvbnRleHQgPSAmKHBBZC0+QmVhY29uQ29udGV4dFtpXSk7Ci0KLQotCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvbkNvbnRleHQsIHNpemVvZihUWF9DT05URVhUKSk7Ci0KLQkJCS8vQWxsb2NhdGUgVVJCCi0JCQlMTV9VU0JfQUxMT0MocE9iaiwgcEJlYWNvbkNvbnRleHQsIFBUWF9CVUZGRVIsIHNpemVvZihUWF9CVUZGRVIpLCBTdGF0dXMsCi0JCQkJCQkJKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggQmVhY29uQ29udGV4dFslZF0gdXJiISEgXG4iLCBpKSwKLQkJCQkJCQlvdXQyLAotCQkJCQkJCSgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIEJlYWNvbkNvbnRleHRbJWRdIFRYX0JVRkZFUiAhISBcbiIsIGkpLAotCQkJCQkJCW91dDMpOwotCi0JCQlwQmVhY29uQ29udGV4dC0+cEFkID0gcEFkOwotCQkJcEJlYWNvbkNvbnRleHQtPnBJcnAgPSBOVUxMOwotCQkJcEJlYWNvbkNvbnRleHQtPkluVXNlID0gRkFMU0U7Ci0JCQlwQmVhY29uQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOwotCQl9Ci0KLQkJLy8KLQkJLy8gTnVsbENvbnRleHQKLQkJLy8KLQkJTmRpc1plcm9NZW1vcnkocE51bGxDb250ZXh0LCBzaXplb2YoVFhfQ09OVEVYVCkpOwotCi0JCS8vQWxsb2NhdGUgVVJCCi0JCUxNX1VTQl9BTExPQyhwT2JqLCBwTnVsbENvbnRleHQsIFBUWF9CVUZGRVIsIHNpemVvZihUWF9CVUZGRVIpLCBTdGF0dXMsCi0JCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBOdWxsQ29udGV4dCB1cmIhISBcbiIpLAotCQkJCQkJb3V0MywKLQkJCQkJCSgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIE51bGxDb250ZXh0IFRYX0JVRkZFUiAhISBcbiIpLAotCQkJCQkJb3V0NCk7Ci0KLQkJcE51bGxDb250ZXh0LT5wQWQgPSBwQWQ7Ci0JCXBOdWxsQ29udGV4dC0+cElycCA9IE5VTEw7Ci0JCXBOdWxsQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKLQkJcE51bGxDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7Ci0KLQkJLy8KLQkJLy8gUlRTQ29udGV4dAotCQkvLwotCQlOZGlzWmVyb01lbW9yeShwUlRTQ29udGV4dCwgc2l6ZW9mKFRYX0NPTlRFWFQpKTsKLQotCQkvL0FsbG9jYXRlIFVSQgotCQlMTV9VU0JfQUxMT0MocE9iaiwgcFJUU0NvbnRleHQsIFBUWF9CVUZGRVIsIHNpemVvZihUWF9CVUZGRVIpLCBTdGF0dXMsCi0JCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBSVFNDb250ZXh0IHVyYiEhIFxuIiksCi0JCQkJCQlvdXQ0LAotCQkJCQkJKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggUlRTQ29udGV4dCBUWF9CVUZGRVIgISEgXG4iKSwKLQkJCQkJCW91dDUpOwotCi0JCXBSVFNDb250ZXh0LT5wQWQgPSBwQWQ7Ci0JCXBSVFNDb250ZXh0LT5wSXJwID0gTlVMTDsKLQkJcFJUU0NvbnRleHQtPkluVXNlID0gRkFMU0U7Ci0JCXBSVFNDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7Ci0KLQkJLy8KLQkJLy8gUHNQb2xsQ29udGV4dAotCQkvLwotCQkvL05kaXNaZXJvTWVtb3J5KHBQc1BvbGxDb250ZXh0LCBzaXplb2YoVFhfQ09OVEVYVCkpOwotCQkvL0FsbG9jYXRlIFVSQgotCQlMTV9VU0JfQUxMT0MocE9iaiwgcFBzUG9sbENvbnRleHQsIFBUWF9CVUZGRVIsIHNpemVvZihUWF9CVUZGRVIpLCBTdGF0dXMsCi0JCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBQc1BvbGxDb250ZXh0IHVyYiEhIFxuIiksCi0JCQkJCQlvdXQ1LAotCQkJCQkJKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggUHNQb2xsQ29udGV4dCBUWF9CVUZGRVIgISEgXG4iKSwKLQkJCQkJCW91dDYpOwotCi0JCXBQc1BvbGxDb250ZXh0LT5wQWQgPSBwQWQ7Ci0JCXBQc1BvbGxDb250ZXh0LT5wSXJwID0gTlVMTDsKLQkJcFBzUG9sbENvbnRleHQtPkluVXNlID0gRkFMU0U7Ci0JCXBQc1BvbGxDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7Ci0JCXBQc1BvbGxDb250ZXh0LT5iQWdncmVnYXRpYmxlID0gRkFMU0U7Ci0JCXBQc1BvbGxDb250ZXh0LT5MYXN0T25lID0gVFJVRTsKLQotCX0gICB3aGlsZSAoRkFMU0UpOwotCi0KLWRvbmU6Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE5JQ0luaXRUcmFuc21pdFxuIikpOwotCi0JcmV0dXJuIFN0YXR1czsKLQotCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFUlJPUiBIQU5ETEUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1vdXQ2OgotCUxNX1VSQl9GUkVFKHBPYmosIHBQc1BvbGxDb250ZXh0LCBzaXplb2YoVFhfQlVGRkVSKSk7Ci0KLW91dDU6Ci0JTE1fVVJCX0ZSRUUocE9iaiwgcFJUU0NvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKLQotb3V0NDoKLQlMTV9VUkJfRlJFRShwT2JqLCBwTnVsbENvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKLQotb3V0MzoKLQlmb3IoaT0wOyBpPEJFQUNPTl9SSU5HX1NJWkU7IGkrKykKLQl7Ci0JCVBUWF9DT05URVhUCXBCZWFjb25Db250ZXh0ID0gJihwQWQtPkJlYWNvbkNvbnRleHRbaV0pOwotCQlpZiAocEJlYWNvbkNvbnRleHQpCi0JCQlMTV9VUkJfRlJFRShwT2JqLCBwQmVhY29uQ29udGV4dCwgc2l6ZW9mKFRYX0JVRkZFUikpOwotCX0KLQotb3V0MjoKLQlpZiAocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSkKLQl7Ci0JCXBNZ210UmluZyA9ICZwQWQtPk1nbXRSaW5nOwotCWZvcihpPTA7IGk8TUdNVF9SSU5HX1NJWkU7IGkrKykKLQl7Ci0JCXBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVCkgcEFkLT5NZ210UmluZy5DZWxsW2ldLkFsbG9jVmE7Ci0JCWlmIChwTUxNRUNvbnRleHQpCi0JCQlMTV9VUkJfRlJFRShwT2JqLCBwTUxNRUNvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKLQl9Ci0JCU5kaXNGcmVlTWVtb3J5KHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSwgMCk7Ci0JCXBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEgPSBOVUxMOwotCX0KLQotb3V0MToKLQlmb3IgKGFjaWR4ID0gMDsgYWNpZHggPCA0OyBhY2lkeCsrKQotCXsKLQkJUEhUX1RYX0NPTlRFWFQgcFR4Q29udGV4dCA9ICYocEFkLT5UeENvbnRleHRbYWNpZHhdKTsKLQkJaWYgKHBUeENvbnRleHQpCi0JCQlMTV9VUkJfRlJFRShwT2JqLCBwVHhDb250ZXh0LCBzaXplb2YoSFRUWF9CVUZGRVIpKTsKLQl9Ci0KLQkvLyBIZXJlIHdlIGRpZG4ndCBoYXZlIGFueSBwcmUtYWxsb2NhdGVkIG1lbW9yeSBuZWVkIHRvIGZyZWUuCi0KLQlyZXR1cm4gU3RhdHVzOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgQWxsb2NhdGUgRE1BIG1lbW9yeSBibG9ja3MgZm9yIHNlbmQsIHJlY2VpdmUuCi0KLUFyZ3VtZW50czoKLSAgICBwQWQJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotUmV0dXJuIFZhbHVlOgotCU5ESVNfU1RBVFVTX1NVQ0NFU1MKLQlORElTX1NUQVRVU19GQUlMVVJFCi0JTkRJU19TVEFUVVNfUkVTT1VSQ0VTCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTX1NUQVRVUwlSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLS8vCUNPVU5URVJfODAyXzExCXBDb3VudGVyID0gJnBBZC0+V2xhbkNvdW50ZXJzOwotCU5ESVNfU1RBVFVTCQlTdGF0dXM7Ci0JSU5UCQkJCW51bTsKLQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5XG4iKSk7Ci0KLQotCWRvCi0JewotCQkvLyBJbml0IHRoZSBDbWRRIGFuZCBDbWRRTG9jawotCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7Ci0JCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOwotCQlSVFVTQkluaXRpYWxpemVDbWRRKCZwQWQtPkNtZFEpOwotCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKLQotCi0JCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1MTUVCdWxrT3V0TG9jayk7Ci0JCS8vTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TUxNRVdhaXRRdWV1ZUxvY2spOwotCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1swXSk7Ci0JCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrWzFdKTsKLQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbMl0pOwotCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1szXSk7Ci0JCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrWzRdKTsKLQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbNV0pOwotCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CdWxrSW5Mb2NrKTsKLQotCQlmb3IgKG51bSA9IDA7IG51bSA8IE5VTV9PRl9UWF9SSU5HOyBudW0rKykKLQkJewotCQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW251bV0pOwotCQl9Ci0KLS8vCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NZW1Mb2NrKTsJLy8gTm90IHVzZWQgaW4gUlQyOFhYCi0KLS8vCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsgLy8gaW5pdCBpdCBpbiBVc2VyQ2ZnSW5pdCgpCi0vLwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsgLy8gaW5pdCBpdCBpbiBCQVRhYmxlSW5pdCgpCi0KLS8vCQlmb3IobnVtPTA7IG51bTxNQVhfTEVOX09GX0JBX1JFQ19UQUJMRTsgbnVtKyspCi0vLwkJewotLy8JCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbbnVtXS5SeFJlUmluZ0xvY2spOwotLy8JCX0KLQotCQkvLwotCQkvLyBJbml0IE1hYyBUYWJsZQotCQkvLwotLy8JCU1hY1RhYmxlSW5pdGlhbGl6ZShwQWQpOwotCi0JCS8vCi0JCS8vIEluaXQgc2VuZCBkYXRhIHN0cnVjdHVyZXMgYW5kIHJlbGF0ZWQgcGFyYW1ldGVycwotCQkvLwotCQlTdGF0dXMgPSBOSUNJbml0VHJhbnNtaXQocEFkKTsKLQkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQkJYnJlYWs7Ci0KLQkJLy8KLQkJLy8gSW5pdCByZWNlaXZlIGRhdGEgc3RydWN0dXJlcyBhbmQgcmVsYXRlZCBwYXJhbWV0ZXJzCi0JCS8vCi0JCVN0YXR1cyA9IE5JQ0luaXRSZWN2KHBBZCk7Ci0JCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCWJyZWFrOwotCi0JCXBBZC0+UGVuZGluZ0lvQ291bnQgPSAxOwotCi0JfSB3aGlsZSAoRkFMU0UpOwotCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+RnJhZ0ZyYW1lLCBzaXplb2YoRlJBR01FTlRfRlJBTUUpKTsKLQlwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCA9ICBSVE1QX0FsbG9jYXRlRnJhZ1BhY2tldEJ1ZmZlcihwQWQsIFJYX0JVRkZFUl9OT1JNU0laRSk7Ci0KLQlpZiAocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQgPT0gTlVMTCkKLQl7Ci0JCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKLQl9Ci0KLQlEQkdQUklOVF9TKFN0YXR1cywgKCI8LS0gUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnksIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7Ci0JcmV0dXJuIFN0YXR1czsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotCUNhbGxzIFVTQl9JbnRlcmZhY2VTdG9wIGFuZCBmcmVlcyBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgVVJCcwotICAgIGNhbGxzIE5kaXNNRGVyZWdpc3RlckRldmljZSBhbmQgZnJlZXMgdGhlIG1lbW9yeQotICAgIGFsbG9jYXRlZCBpbiBWTmV0SW5pdGlhbGl6ZSBmb3IgdGhlIEFkYXB0ZXIgT2JqZWN0Ci0KLUFyZ3VtZW50czoKLQkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUEZyZWVUeFJ4UmluZ01lbW9yeSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLSNkZWZpbmUgTE1fVVJCX0ZSRUUocE9iaiwgQ29udGV4dCwgQnVmZmVyU2l6ZSkJCQkJXAotCWlmIChOVUxMICE9IENvbnRleHQtPnBVcmIpIHsJCQkJCQkJXAotCQlSVFVTQl9VTkxJTktfVVJCKENvbnRleHQtPnBVcmIpOwkJCQkJXAotCQlSVFVTQl9GUkVFX1VSQihDb250ZXh0LT5wVXJiKTsJCQkJCQlcCi0JCUNvbnRleHQtPnBVcmIgPSBOVUxMOyB9CQkJCQkJCQlcCi0JaWYgKE5VTEwgIT0gQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIpIHsJCQkJCVwKLQkJUlRVU0JfVVJCX0ZSRUVfQlVGRkVSKHBPYmotPnBVc2JfRGV2LCBCdWZmZXJTaXplLAlcCi0JCQkJCQkJCUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyLAlcCi0JCQkJCQkJCUNvbnRleHQtPmRhdGFfZG1hKTsJCQlcCi0JCUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyID0gTlVMTDsgfQotCi0KLQlVSU5UICAgICAgICAgICAgICAgIGksIGFjaWR4OwotCVBUWF9DT05URVhUCQkJcE51bGxDb250ZXh0ICAgPSAmcEFkLT5OdWxsQ29udGV4dDsKLQlQVFhfQ09OVEVYVAkJCXBQc1BvbGxDb250ZXh0ID0gJnBBZC0+UHNQb2xsQ29udGV4dDsKLQlQVFhfQ09OVEVYVAkJCXBSVFNDb250ZXh0ICAgID0gJnBBZC0+UlRTQ29udGV4dDsKLS8vCVBIVF9UWF9DT05URVhUIAkJcEhUVFhDb250ZXh0OwotCS8vUFJUTVBfUkVPUkRFUkJVRglwUmVvcmRlckJ1ZjsKLQlQT1NfQ09PS0lFCQkJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLS8vCVJUTVBfVFhfUklORwkJKnBUeFJpbmc7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLS0+IFJUTVBGcmVlVHhSeFJpbmdNZW1vcnlcbiIpKTsKLQlwT2JqID0gcE9iajsKLQotCS8vIEZyZWUgYWxsIHJlc291cmNlcyBmb3IgdGhlIFJFQ0VJVkUgYnVmZmVyIHF1ZXVlLgotCWZvcihpPTA7IGk8KFJYX1JJTkdfU0laRSk7IGkrKykKLQl7Ci0JCVBSWF9DT05URVhUICBwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7Ci0JCWlmIChwUnhDb250ZXh0KQotCQkJTE1fVVJCX0ZSRUUocE9iaiwgcFJ4Q29udGV4dCwgTUFYX1JYQlVMS19TSVpFKTsKLQl9Ci0KLQkvLyBGcmVlIFBzUG9sbCBmcmFtZSByZXNvdXJjZQotCUxNX1VSQl9GUkVFKHBPYmosIHBQc1BvbGxDb250ZXh0LCBzaXplb2YoVFhfQlVGRkVSKSk7Ci0KLQkvLyBGcmVlIE5VTEwgZnJhbWUgcmVzb3VyY2UKLQlMTV9VUkJfRlJFRShwT2JqLCBwTnVsbENvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKLQotCS8vIEZyZWUgUlRTIGZyYW1lIHJlc291cmNlCi0JTE1fVVJCX0ZSRUUocE9iaiwgcFJUU0NvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKLQotCi0JLy8gRnJlZSBiZWFjb24gZnJhbWUgcmVzb3VyY2UKLQlmb3IoaT0wOyBpPEJFQUNPTl9SSU5HX1NJWkU7IGkrKykKLQl7Ci0JCVBUWF9DT05URVhUCXBCZWFjb25Db250ZXh0ID0gJihwQWQtPkJlYWNvbkNvbnRleHRbaV0pOwotCQlpZiAocEJlYWNvbkNvbnRleHQpCi0JCQlMTV9VUkJfRlJFRShwT2JqLCBwQmVhY29uQ29udGV4dCwgc2l6ZW9mKFRYX0JVRkZFUikpOwotCX0KLQotCi0JLy8gRnJlZSBtZ210IGZyYW1lIHJlc291cmNlCi0JZm9yKGkgPSAwOyBpIDwgTUdNVF9SSU5HX1NJWkU7IGkrKykKLQl7Ci0JCVBUWF9DT05URVhUIHBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVClwQWQtPk1nbXRSaW5nLkNlbGxbaV0uQWxsb2NWYTsKLQkJLy9MTV9VUkJfRlJFRShwT2JqLCBwTUxNRUNvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKLQkJaWYgKE5VTEwgIT0gcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZGlzUGFja2V0KQotCQl7Ci0JCQlSVE1QRnJlZU5kaXNQYWNrZXQocEFkLCBwQWQtPk1nbXRSaW5nLkNlbGxbaV0ucE5kaXNQYWNrZXQpOwotCQkJcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZGlzUGFja2V0ID0gTlVMTDsKLQkJCXBNTE1FQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPSBOVUxMOwotCQl9Ci0KLQkJaWYgKHBNTE1FQ29udGV4dCkKLQkJewotCQkJaWYgKE5VTEwgIT0gcE1MTUVDb250ZXh0LT5wVXJiKQotCQkJewotCQkJCVJUVVNCX1VOTElOS19VUkIocE1MTUVDb250ZXh0LT5wVXJiKTsKLQkJCQlSVFVTQl9GUkVFX1VSQihwTUxNRUNvbnRleHQtPnBVcmIpOwotCQkJCXBNTE1FQ29udGV4dC0+cFVyYiA9IE5VTEw7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEpCi0JCU5kaXNGcmVlTWVtb3J5KHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSwgMCk7Ci0KLQotCS8vIEZyZWUgVHggZnJhbWUgcmVzb3VyY2UKLQkJZm9yKGFjaWR4PTA7IGFjaWR4PDQ7IGFjaWR4KyspCi0JCXsKLQkJUEhUX1RYX0NPTlRFWFQgcEhUVFhDb250ZXh0ID0gJihwQWQtPlR4Q29udGV4dFthY2lkeF0pOwotCQkJaWYgKHBIVFRYQ29udGV4dCkKLQkJCQlMTV9VUkJfRlJFRShwT2JqLCBwSFRUWENvbnRleHQsIHNpemVvZihIVFRYX0JVRkZFUikpOwotCQl9Ci0KLQlpZiAocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQpCi0JCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlmb3IoaT0wOyBpPDY7IGkrKykKLQl7Ci0JCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbaV0pOwotCX0KLQotCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+QnVsa0luTG9jayk7Ci0JTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5NTE1FQnVsa091dExvY2spOwotCi0JTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7Ci0KLQkvLyBDbGVhciBhbGwgcGVuZGluZyBidWxrLW91dCByZXF1ZXN0IGZsYWdzLgotCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsIDB4ZmZmZmZmZmYpOwotCi0vLwlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotCi0vLwlmb3IoaT0wOyBpPE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFOyBpKyspCi0vLwl7Ci0vLwkJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbaV0uUnhSZVJpbmdMb2NrKTsKLS8vCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIjwtLS0gUmVsZWFzZUFkYXB0ZXJcbiIpKTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWRhcHRlciBjb250cm9sIGJsb2NrLgotCi1Bcmd1bWVudHM6Ci0gICAgcEFkCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLVJldHVybiBWYWx1ZToKLQlORElTX1NUQVRVU19TVUNDRVNTCi0JTkRJU19TVEFUVVNfRkFJTFVSRQotCU5ESVNfU1RBVFVTX1JFU09VUkNFUwotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMgQWRhcHRlckJsb2NrQWxsb2NhdGVNZW1vcnkoCi0JSU4gUFZPSUQJaGFuZGxlLAotCU9VVAlQVk9JRAkqcHBBZCkKLXsKLQlQVVNCX0RFVgl1c2JfZGV2OwotCVBPU19DT09LSUUJcE9iaiA9IChQT1NfQ09PS0lFKSBoYW5kbGU7Ci0KLQotCXVzYl9kZXYgPSBwT2JqLT5wVXNiX0RldjsKLQotCXBPYmotPk1MTUVUaHJfcGlkCT0gTlVMTDsKLQlwT2JqLT5SVFVTQkNtZFRocl9waWQJPSBOVUxMOwotCi0JKnBwQWQgPSAoUFZPSUQpdm1hbGxvYyhzaXplb2YoUlRNUF9BREFQVEVSKSk7Ci0KLQlpZiAoKnBwQWQpCi0JewotCQlOZGlzWmVyb01lbW9yeSgqcHBBZCwgc2l6ZW9mKFJUTVBfQURBUFRFUikpOwotCQkoKFBSVE1QX0FEQVBURVIpKnBwQWQpLT5PU19Db29raWUgPSBoYW5kbGU7Ci0JCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JfQotCWVsc2UKLQl7Ci0JCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JfQotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgQ3JlYXRlIGtlcm5lbCB0aHJlYWRzICYgdGFza2xldHMuCi0KLUFyZ3VtZW50czoKLSAgICAqbmV0X2RldgkJCVBvaW50ZXIgdG8gd2lyZWxlc3MgbmV0IGRldmljZSBpbnRlcmZhY2UKLQotUmV0dXJuIFZhbHVlOgotCU5ESVNfU1RBVFVTX1NVQ0NFU1MKLQlORElTX1NUQVRVU19GQUlMVVJFCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTX1NUQVRVUwkgQ3JlYXRlVGhyZWFkcygKLQlJTglzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKLXsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7Ci0JUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCXBpZF90IHBpZF9udW1iZXI7Ci0KLQkvL2luaXRfTVVURVgoJihwQWQtPnVzYmRldl9zZW1hcGhvcmUpKTsKLQotCWluaXRfTVVURVhfTE9DS0VEKCYocEFkLT5tbG1lX3NlbWFwaG9yZSkpOwotCWluaXRfY29tcGxldGlvbiAoJnBBZC0+bWxtZUNvbXBsZXRlKTsKLQotCWluaXRfTVVURVhfTE9DS0VEKCYocEFkLT5SVFVTQkNtZF9zZW1hcGhvcmUpKTsKLQlpbml0X2NvbXBsZXRpb24gKCZwQWQtPkNtZFFDb21wbGV0ZSk7Ci0KLQlpbml0X01VVEVYX0xPQ0tFRCgmKHBBZC0+UlRVU0JUaW1lcl9zZW1hcGhvcmUpKTsKLQlpbml0X2NvbXBsZXRpb24gKCZwQWQtPlRpbWVyUUNvbXBsZXRlKTsKLQotCS8vIENyZWF0IE1MTUUgVGhyZWFkCi0JcE9iai0+TUxNRVRocl9waWQgPSBOVUxMOwotCXBpZF9udW1iZXIgPSBrZXJuZWxfdGhyZWFkKE1sbWVUaHJlYWQsIHBBZCwgQ0xPTkVfVk0pOwotCWlmIChwaWRfbnVtYmVyIDwgMCkKLQl7Ci0JCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogdW5hYmxlIHRvIHN0YXJ0IE1sbWUgdGhyZWFkXG4iLHBBZC0+bmV0X2Rldi0+bmFtZSk7Ci0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQotCXBPYmotPk1MTUVUaHJfcGlkID0gZmluZF9nZXRfcGlkKHBpZF9udW1iZXIpOwotCi0JLy8gV2FpdCBmb3IgdGhlIHRocmVhZCB0byBzdGFydAotCXdhaXRfZm9yX2NvbXBsZXRpb24oJihwQWQtPm1sbWVDb21wbGV0ZSkpOwotCi0JLy8gQ3JlYXQgQ29tbWFuZCBUaHJlYWQKLQlwT2JqLT5SVFVTQkNtZFRocl9waWQgPSBOVUxMOwotCXBpZF9udW1iZXIgPSBrZXJuZWxfdGhyZWFkKFJUVVNCQ21kVGhyZWFkLCBwQWQsIENMT05FX1ZNKTsKLQlpZiAocGlkX251bWJlciA8IDApCi0JewotCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IHVuYWJsZSB0byBzdGFydCBSVFVTQkNtZCB0aHJlYWRcbiIscEFkLT5uZXRfZGV2LT5uYW1lKTsKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0JcE9iai0+UlRVU0JDbWRUaHJfcGlkID0gZmluZF9nZXRfcGlkKHBpZF9udW1iZXIpOwotCi0Jd2FpdF9mb3JfY29tcGxldGlvbigmKHBBZC0+Q21kUUNvbXBsZXRlKSk7Ci0KLQlwT2JqLT5UaW1lclFUaHJfcGlkID0gTlVMTDsKLQlwaWRfbnVtYmVyID0ga2VybmVsX3RocmVhZChUaW1lclFUaHJlYWQsIHBBZCwgQ0xPTkVfVk0pOwotCWlmIChwaWRfbnVtYmVyIDwgMCkKLQl7Ci0JCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogdW5hYmxlIHRvIHN0YXJ0IFRpbWVyUVRocmVhZFxuIixwQWQtPm5ldF9kZXYtPm5hbWUpOwotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQlwT2JqLT5UaW1lclFUaHJfcGlkID0gZmluZF9nZXRfcGlkKHBpZF9udW1iZXIpOwotCi0JLy8gV2FpdCBmb3IgdGhlIHRocmVhZCB0byBzdGFydAotCXdhaXRfZm9yX2NvbXBsZXRpb24oJihwQWQtPlRpbWVyUUNvbXBsZXRlKSk7Ci0KLQkvLyBDcmVhdGUgcmVjZWl2ZSB0YXNrbGV0Ci0JdGFza2xldF9pbml0KCZwT2JqLT5yeF9kb25lX3Rhc2ssIHJ4X2RvbmVfdGFza2xldCwgKFVMT05HKXBBZCk7Ci0JdGFza2xldF9pbml0KCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2ssIHJ0Mjg3MF9tZ210X2RtYV9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7Ci0JdGFza2xldF9pbml0KCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzaywgcnQyODcwX2FjMF9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOwotCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2ssIHJ0Mjg3MF9hYzFfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrLCBydDI4NzBfYWMyX2RtYV9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7Ci0JdGFza2xldF9pbml0KCZwT2JqLT5hYzNfZG1hX2RvbmVfdGFzaywgcnQyODcwX2FjM19kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOwotCXRhc2tsZXRfaW5pdCgmcE9iai0+aGNjYV9kbWFfZG9uZV90YXNrLCBydDI4NzBfaGNjYV9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOwotCXRhc2tsZXRfaW5pdCgmcE9iai0+dGJ0dF90YXNrLCB0YnR0X3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7Ci0JdGFza2xldF9pbml0KCZwT2JqLT5udWxsX2ZyYW1lX2NvbXBsZXRlX3Rhc2ssIHJ0Mjg3MF9udWxsX2ZyYW1lX2NvbXBsZXRlX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7Ci0JdGFza2xldF9pbml0KCZwT2JqLT5ydHNfZnJhbWVfY29tcGxldGVfdGFzaywgcnQyODcwX3J0c19mcmFtZV9jb21wbGV0ZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOwotCXRhc2tsZXRfaW5pdCgmcE9iai0+cHNwb2xsX2ZyYW1lX2NvbXBsZXRlX3Rhc2ssIHJ0Mjg3MF9wc3BvbGxfZnJhbWVfY29tcGxldGVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotIAlBcyBTVEEncyBCU1NJRCBpcyBhIFdDIHRvbywgaXQgdXNlcyBzaGFyZWQga2V5IHRhYmxlLgotIAlUaGlzIGZ1bmN0aW9uIHdyaXRlIGNvcnJlY3QgdW5pY2FzdCBUWCBrZXkgdG8gQVNJQyBXQ0lELgotIAlBbmQgd2Ugc3RpbGwgbWFrZSBhIGNvcHkgaW4gb3VyIE1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LgotCUNhbGxlciBndWFyYW50ZWUgVEtJUC9BRVMgYWx3YXlzIGhhcyBrZXlpZHggPSAwLiAocGFpcndpc2Uga2V5KQotCUNhbGxlciBndWFyYW50ZWUgV0VQIGNhbGxzIHRoaXMgZnVuY3Rpb24gd2hlbiBzZXQgVHhrZXksICBkZWZhdWx0IGtleSBpbmRleD0wfjMuCi0KLUFyZ3VtZW50czoKLQlwQWQgCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JcEtleQkJCQkJUG9pbnRlciB0byB0aGUgd2hlcmUgdGhlIGtleSBzdG9yZWQKLQotUmV0dXJuIFZhbHVlOgotCU5ESVNfU1VDQ0VTUwkJCUFkZCBrZXkgc3VjY2Vzc2Z1bGx5Ci0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBBZGRCU1NJRENpcGhlcigKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JVUNIQVIJCQkJQWlkLAotCUlOCVBORElTXzgwMl8xMV9LRVkJcEtleSwKLQlJTiAgVUNIQVIgICAJCQlDaXBoZXJBbGcpCi17Ci0JUFVDSEFSCQlwVHhNaWMsIHBSeE1pYzsKLQlCT09MRUFOIAliS2V5UlNDLCBiQXV0aGVudGljYXRvcjsgLy8gaW5kaWNhdGUgdGhlIHJlY2VpdmUgU0Mgc2V0IGJ5IEtleVJTQyB2YWx1ZQotLy8JVUNIQVIJCUNpcGhlckFsZzsKLQlVQ0hBUgkJaTsKLQlVTE9ORwkJV0NJREF0dHJpOwotCVVTSE9SVAkgCW9mZnNldDsKLQlVQ0hBUgkJS2V5SWR4LCBJVkVJVls4XTsKLQlVSU5UMzIJCVZhbHVlOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUEFkZEJTU0lEQ2lwaGVyPT0+IEFpZCA9ICVkXG4iLEFpZCkpOwotCi0JLy8gQml0IDI5IG9mIEFkZC1rZXkgS2V5UlNDCi0JYktleVJTQyAJICAgPSAocEtleS0+S2V5SW5kZXggJiAweDIwMDAwMDAwKSA/IFRSVUUgOiBGQUxTRTsKLQotCS8vIEJpdCAyOCBvZiBBZGQta2V5IEF1dGhlbnRpY2F0b3IKLQliQXV0aGVudGljYXRvciA9IChwS2V5LT5LZXlJbmRleCAmIDB4MTAwMDAwMDApID8gVFJVRSA6IEZBTFNFOwotCUtleUlkeCA9IChVQ0hBUilwS2V5LT5LZXlJbmRleCYweGZmOwotCi0JaWYgKEtleUlkeCA+IDQpCi0JCXJldHVybjsKLQotCi0JaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApCi0JewlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKLQkJewotCQkJLy8gZm9yIFdQQS1Ob25lIFR4LCBSeCBNSUMgaXMgdGhlIHNhbWUKLQkJCXBUeE1pYyA9IChQVUNIQVIpICgmcEtleS0+S2V5TWF0ZXJpYWwpICsgMTY7Ci0JCQlwUnhNaWMgPSBwVHhNaWM7Ci0JCX0KLQkJZWxzZSBpZiAoYkF1dGhlbnRpY2F0b3IgPT0gVFJVRSkKLQkJewotCQkJcFR4TWljID0gKFBVQ0hBUikgKCZwS2V5LT5LZXlNYXRlcmlhbCkgKyAxNjsKLQkJCXBSeE1pYyA9IChQVUNIQVIpICgmcEtleS0+S2V5TWF0ZXJpYWwpICsgMjQ7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwUnhNaWMgPSAoUFVDSEFSKSAoJnBLZXktPktleU1hdGVyaWFsKSArIDE2OwotCQkJcFR4TWljID0gKFBVQ0hBUikgKCZwS2V5LT5LZXlNYXRlcmlhbCkgKyAyNDsKLQkJfQotCi0JCW9mZnNldCA9IFBBSVJXSVNFX0tFWV9UQUJMRV9CQVNFICsgKEFpZCAqIEhXX0tFWV9FTlRSWV9TSVpFKSArIDB4MTA7Ci0JCWZvciAoaT0wOyBpPDg7ICkKLQkJewotCQkJVmFsdWUgPSAqKHBUeE1pYytpKTsKLQkJCVZhbHVlICs9ICgqKHBUeE1pYytpKzEpPDw4KTsKLQkJCVZhbHVlICs9ICgqKHBUeE1pYytpKzIpPDwxNik7Ci0JCQlWYWx1ZSArPSAoKihwVHhNaWMraSszKTw8MjQpOwotCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0K2ksIFZhbHVlKTsKLQkJCWkrPTQ7Ci0JCX0KLQotCQlvZmZzZXQgPSBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRSArIChBaWQgKiBIV19LRVlfRU5UUllfU0laRSkgKyAweDE4OwotCQlmb3IgKGk9MDsgaTw4OyApCi0JCXsKLQkJCVZhbHVlID0gKihwUnhNaWMraSk7Ci0JCQlWYWx1ZSArPSAoKihwUnhNaWMraSsxKTw8OCk7Ci0JCQlWYWx1ZSArPSAoKihwUnhNaWMraSsyKTw8MTYpOwotCQkJVmFsdWUgKz0gKCoocFJ4TWljK2krMyk8PDI0KTsKLQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCtpLCBWYWx1ZSk7Ci0JCQlpKz00OwotCQl9Ci0KLQkJLy8gT25seSBLZXkgbGVudGggZXF1YWwgdG8gVEtJUCBrZXkgaGF2ZSB0aGVzZQotCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuUnhNaWMsIHBSeE1pYywgOCk7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5UeE1pYywgcFR4TWljLCA4KTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKLQkJCQkoIglUeE1JQyAgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggXG4iLAotCQkJCXBUeE1pY1swXSxwVHhNaWNbMV0scFR4TWljWzJdLHBUeE1pY1szXSwKLQkJCQlwVHhNaWNbNF0scFR4TWljWzVdLHBUeE1pY1s2XSxwVHhNaWNbN10pKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCi0JCQkJKCIJUnhNSUMgID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFxuIiwKLQkJCQlwUnhNaWNbMF0scFJ4TWljWzFdLHBSeE1pY1syXSxwUnhNaWNbM10sCi0JCQkJcFJ4TWljWzRdLHBSeE1pY1s1XSxwUnhNaWNbNl0scFJ4TWljWzddKSk7Ci0JfQotCi0JLy8gMi4gUmVjb3JkIFNlY3VyaXR5IEtleS4KLQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LktleUxlbj0gKFVDSEFSKXBLZXktPktleUxlbmd0aDsKLQlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuS2V5LCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7Ci0KLQkvLyAzLiBDaGVjayBSeFRzYy4gQW5kIHVzZWQgdG8gaW5pdCB0byBBU0lDIElWLgotCWlmIChiS2V5UlNDID09IFRSVUUpCi0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5SeFRzYywgJnBLZXktPktleVJTQywgNik7Ci0JZWxzZQotCQlOZGlzWmVyb01lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuUnhUc2MsIDYpOwotCi0JLy8gNC4gSW5pdCBUeFRzYyB0byBvbmUgYmFzZWQgb24gV2lGaSBXUEEgc3BlY3MKLQlwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuVHhUc2NbMF0gPSAxOwotCXBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5UeFRzY1sxXSA9IDA7Ci0JcEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LlR4VHNjWzJdID0gMDsKLQlwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuVHhUc2NbM10gPSAwOwotCXBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5UeFRzY1s0XSA9IDA7Ci0JcEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LlR4VHNjWzVdID0gMDsKLQotCUNpcGhlckFsZyA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5DaXBoZXJBbGc7Ci0KLQlvZmZzZXQgPSBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRSArIChBaWQgKiBIV19LRVlfRU5UUllfU0laRSk7Ci0JUlRVU0JNdWx0aVdyaXRlKHBBZCwgKFVTSE9SVCkgb2Zmc2V0LCBwS2V5LT5LZXlNYXRlcmlhbCwKLQkJCQkoKHBLZXktPktleUxlbmd0aCA9PSBMRU5fVEtJUF9LRVkpID8gMTYgOiAoVVNIT1JUKXBLZXktPktleUxlbmd0aCkpOwotCi0Jb2Zmc2V0ID0gU0hBUkVEX0tFWV9UQUJMRV9CQVNFICsgKEtleUlkeCAqIEhXX0tFWV9FTlRSWV9TSVpFKTsKLQlSVFVTQk11bHRpV3JpdGUocEFkLCAoVVNIT1JUKSBvZmZzZXQsIHBLZXktPktleU1hdGVyaWFsLCAoVVNIT1JUKXBLZXktPktleUxlbmd0aCk7Ci0KLQlvZmZzZXQgPSBQQUlSV0lTRV9JVkVJVl9UQUJMRV9CQVNFICsgKEFpZCAqIEhXX0lWRUlWX0VOVFJZX1NJWkUpOwotCU5kaXNaZXJvTWVtb3J5KElWRUlWLCA4KTsKLQotCS8vIElWL0VJVgotCWlmICgoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQKSB8fAotCQkoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQX05PX01JQykgfHwKLQkJKENpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSkKLQl7Ci0JCUlWRUlWWzNdID0gMHgyMDsgLy8gRWl2IGJpdCBvbi4ga2V5aWQgYWx3YXlzIDAgZm9yIHBhaXJ3aXNlIGtleQotCX0KLQkvLyBkZWZhdWx0IGtleSBpZHggbmVlZHMgdG8gc2V0LgotCS8vIGluIFRLSVAvQUVTIEtleUlkeCA9IDAgLCBXRVAgS2V5SWR4IGlzIGRlZmF1bHQgdHgga2V5LgotCWVsc2UKLQl7Ci0JCUlWRUlWWzNdIHw9IChLZXlJZHg8PCA2KTsKLQl9Ci0JUlRVU0JNdWx0aVdyaXRlKHBBZCwgKFVTSE9SVCkgb2Zmc2V0LCBJVkVJViwgOCk7Ci0KLQkvLyBXQ0lEIEF0dHJpYnV0ZSBVREY6MywgQlNTSWR4OjMsIEFsZzozLCBLZXl0YWJsZToxPVBBSVJXSVNFIEtFWSwgQlNTSWR4IGlzIDAKLQlpZiAoKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkgfHwKLQkJKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpIHx8Ci0JCShDaXBoZXJBbGcgPT0gQ0lQSEVSX0FFUykpCi0JewotCQlXQ0lEQXR0cmkgPSAoQ2lwaGVyQWxnPDwxKXxTSEFSRURLRVlUQUJMRTsKLQl9Ci0JZWxzZQotCQlXQ0lEQXR0cmkgPSAoQ2lwaGVyQWxnPDwxKXxTSEFSRURLRVlUQUJMRTsKLQotCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKEFpZCogSFdfV0NJRF9BVFRSSV9TSVpFKTsKLQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsIFdDSURBdHRyaSk7Ci0JUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsICZWYWx1ZSk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCU1NJRF9XQ0lEIDogb2Zmc2V0ID0gJXgsIFdDSURBdHRyaSA9ICVseFxuIiwKLQkJCW9mZnNldCwgV0NJREF0dHJpKSk7Ci0KLQkvLyBwQWRkcgotCS8vIEFkZCBCc3NpZCBtYWMgYWRkcmVzcyBhdCBsaW5rdXAuIG5vdCBoZXJlLiAgY2hlY2shCi0JLypvZmZzZXQgPSBNQUNfV0NJRF9CQVNFICsgKEJTU0lEX1dDSUQgKiBIV19XQ0lEX0VOVFJZX1NJWkUpOwotCSpmb3IgKGk9MDsgaTxNQUNfQUREUl9MRU47IGkrKykKLQl7Ci0JCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0K2ksIHBLZXktPkJTU0lEW2ldKTsKLQl9Ci0JKi8KLQotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFkZEJTU0lEYXNXQ0lERW50cnk6IEFsZz0lcywgS2V5TGVuZ3RoID0gJWRcbiIsCi0JCQlDaXBoZXJOYW1lW0NpcGhlckFsZ10sIHBLZXktPktleUxlbmd0aCkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIktleSBbaWR4PSV4XSBbS2V5TGVuID0gJWRdXG4iLAotCQkJcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOwotCWZvcihpPTA7IGk8cEtleS0+S2V5TGVuZ3RoOyBpKyspCi0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIiAleDoiLCBwS2V5LT5LZXlNYXRlcmlhbFtpXSkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiCSBcbiIpKTsKLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBHZXQgYSByZWNlaXZlZCBwYWNrZXQuCi0KLUFyZ3VtZW50czoKLQlwQWQJCQkJCWRldmljZSBjb250cm9sIGJsb2NrCi0JcFNhdmVSeEQJCQlyZWNlaXZlIGRlc2NyaXB0b3IgaW5mb3JtYXRpb24KLQkqcGJSZXNjaGVkdWxlCQluZWVkIHJlc2NoZWR1bGUgZmxhZwotCSpwUnhQZW5kaW5nCQkJcGVuZGluZyByZWNlaXZlZCBwYWNrZXQgZmxhZwotCi1SZXR1cm4gVmFsdWU6Ci0gICAgdGhlIHJlY2lldmVkIHBhY2tldAotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotI2RlZmluZSBSVDI4NzBfUlhETUFMRU5fRklFTERfU0laRQkJCTQKLVBORElTX1BBQ0tFVCBHZXRQYWNrZXRGcm9tUnhSaW5nKAotCUlOCQlQUlRNUF9BREFQVEVSCQlwQWQsCi0JT1VUCQlQUlQyOFhYX1JYRF9TVFJVQwlwU2F2ZVJ4RCwKLQlPVVQJCUJPT0xFQU4JCQkJKnBiUmVzY2hlZHVsZSwKLQlJTiBPVVQJVUlOVDMyCQkJCSpwUnhQZW5kaW5nKQotewotCVBSWF9DT05URVhUCQlwUnhDb250ZXh0OwotCVBORElTX1BBQ0tFVAlwU2tiOwotCVBVQ0hBUgkJCXBEYXRhOwotCVVMT05HCQkJVGhpc0ZyYW1lTGVuOwotCVVMT05HCQkJUnhCdWZmZXJMZW5ndGg7Ci0JUFJYV0lfU1RSVUMJCXBSeFdJOwotCi0JcFJ4Q29udGV4dCA9ICZwQWQtPlJ4Q29udGV4dFtwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleF07Ci0JaWYgKChwUnhDb250ZXh0LT5SZWFkYWJsZSA9PSBGQUxTRSkgfHwgKHBSeENvbnRleHQtPkluVXNlID09IFRSVUUpKQotCQlyZXR1cm4gTlVMTDsKLQotCVJ4QnVmZmVyTGVuZ3RoID0gcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0IC0gcEFkLT5SZWFkUG9zaXRpb247Ci0JaWYgKFJ4QnVmZmVyTGVuZ3RoIDwgKFJUMjg3MF9SWERNQUxFTl9GSUVMRF9TSVpFICsgc2l6ZW9mKFJYV0lfU1RSVUMpICsgc2l6ZW9mKFJYSU5GT19TVFJVQykpKQotCXsKLQkJZ290byBsYWJlbF9udWxsOwotCX0KLQotCXBEYXRhID0gJnBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyW3BBZC0+UmVhZFBvc2l0aW9uXTsgLyogNEtCICovCi0JLy8gVGhlIFJYRE1BIGZpZWxkIGlzIDQgYnl0ZXMsIG5vdyBqdXN0IHVzZSB0aGUgZmlyc3QgMiBieXRlcy4gVGhlIExlbmd0aCBpbmNsdWRpbmcgdGhlIChSWFdJICsgTVNEVSArIFBhZGRpbmcpCi0JVGhpc0ZyYW1lTGVuID0gKnBEYXRhICsgKCoocERhdGErMSk8PDgpOwotICAgIGlmIChUaGlzRnJhbWVMZW4gPT0gMCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJJUklkeCglZCk6IFJYRE1BTGVuIGlzIHplcm8uWyVsZF0sIEJ1bGtJbkJ1ZkxlbiA9ICVsZClcbiIsCi0JCQkJCQkJCXBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4LCBUaGlzRnJhbWVMZW4sIHBSeENvbnRleHQtPkJ1bGtJbk9mZnNldCkpOwotCQlnb3RvIGxhYmVsX251bGw7Ci0JfQotCWlmICgoVGhpc0ZyYW1lTGVuJjB4MykgIT0gMCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkJJUklkeCglZCk6IFJYRE1BTGVuIG5vdCBtdWx0aXBsZSBvZiA0LlslbGRdLCBCdWxrSW5CdWZMZW4gPSAlbGQpXG4iLAotCQkJCQkJCQlwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCwgVGhpc0ZyYW1lTGVuLCBwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQpKTsKLQkJZ290byBsYWJlbF9udWxsOwotCX0KLQotCWlmICgoVGhpc0ZyYW1lTGVuICsgOCk+IFJ4QnVmZmVyTGVuZ3RoKQkvLyA4IGZvciAoUlQyODcwX1JYRE1BTEVOX0ZJRUxEX1NJWkUgKyBzaXplb2YoUlhJTkZPX1NUUlVDKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQklSSWR4KCVkKTpGcmFtZUxlbigweCVseCkgb3V0cmFuZ2VzLiBCdWxrSW5MZW49MHglbHgsIHJlbWFpbmluZyBSeEJ1Zkxlbj0weCVseCwgUmVhZFBvcz0weCVseFxuIiwKLQkJCQkJCXBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4LCBUaGlzRnJhbWVMZW4sIHBSeENvbnRleHQtPkJ1bGtJbk9mZnNldCwgUnhCdWZmZXJMZW5ndGgsIHBBZC0+UmVhZFBvc2l0aW9uKSk7Ci0KLQkJLy8gZXJyb3IgZnJhbWUuIGZpbmlzaCB0aGlzIGxvb3AKLQkJZ290byBsYWJlbF9udWxsOwotCX0KLQotCS8vIHNraXAgVVNCIGZyYW1lIGxlbmd0aCBmaWVsZAotCXBEYXRhICs9IFJUMjg3MF9SWERNQUxFTl9GSUVMRF9TSVpFOwotCXBSeFdJID0gKFBSWFdJX1NUUlVDKXBEYXRhOwotCi0JaWYgKHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPiBUaGlzRnJhbWVMZW4pCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcygpOnBSeFdJTVBEVXRvdGFsQnl0ZUNvdW50KCVkKSBsYXJnZSB0aGFuIFJ4RE1BTGVuKCVsZClcbiIsCi0JCQkJCQkJCQlfX2Z1bmNfXywgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCwgVGhpc0ZyYW1lTGVuKSk7Ci0JCWdvdG8gbGFiZWxfbnVsbDsKLQl9Ci0KLQkvLyBhbGxvY2F0ZSBhIHJ4IHBhY2tldAotCXBTa2IgPSBkZXZfYWxsb2Nfc2tiKFRoaXNGcmFtZUxlbik7Ci0JaWYgKHBTa2IgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiJXMoKTpDYW5ub3QgQWxsb2NhdGUgc2sgYnVmZmVyIGZvciB0aGlzIEJ1bGstSW4gYnVmZmVyIVxuIiwgX19mdW5jX18pKTsKLQkJZ290byBsYWJlbF9udWxsOwotCX0KLQotCS8vIGNvcHkgdGhlIHJ4IHBhY2tldAotCW1lbWNweShza2JfcHV0KHBTa2IsIFRoaXNGcmFtZUxlbiksIHBEYXRhLCBUaGlzRnJhbWVMZW4pOwotCVJUUEtUX1RPX09TUEtUKHBTa2IpLT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBCU1MwKTsKLQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKE9TUEtUX1RPX1JUUEtUKHBTa2IpLCBQS1RTUkNfTkRJUyk7Ci0KLQkvLyBjb3B5IFJ4RAotCSpwU2F2ZVJ4RCA9ICooUFJYSU5GT19TVFJVQykocERhdGEgKyBUaGlzRnJhbWVMZW4pOwotCi0JLy8gdXBkYXRlIG5leHQgcGFja2V0IHJlYWQgcG9zaXRpb24uCi0JcEFkLT5SZWFkUG9zaXRpb24gKz0gKFRoaXNGcmFtZUxlbiArIFJUMjg3MF9SWERNQUxFTl9GSUVMRF9TSVpFICsgUlhJTkZPX1NJWkUpOwkvLyA4IGZvciAoUlQyODcwX1JYRE1BTEVOX0ZJRUxEX1NJWkUgKyBzaXplb2YoUlhJTkZPX1NUUlVDKSkKLQotCXJldHVybiBwU2tiOwotCi1sYWJlbF9udWxsOgotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBIYW5kbGUgcmVjZWl2ZWQgcGFja2V0cy4KLQotQXJndW1lbnRzOgotCWRhdGEJCQkJLSBVUkIgaW5mb3JtYXRpb24gcG9pbnRlcgotCi1SZXR1cm4gVmFsdWU6Ci0gICAgTm9uZQotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIHZvaWQgcnhfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlwdXJiYl90IAkJCXBVcmI7Ci0JUFJYX0NPTlRFWFQJCQlwUnhDb250ZXh0OwotCVBSVE1QX0FEQVBURVIJCXBBZDsKLQlOVFNUQVRVUwkJCVN0YXR1czsKLQl1bnNpZ25lZCBpbnQJCUlycUZsYWdzOwotCi0JcFVyYgkJPSAocHVyYmJfdClkYXRhOwotCXBSeENvbnRleHQJPSAoUFJYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKLQlwQWQgCQk9IHBSeENvbnRleHQtPnBBZDsKLQlTdGF0dXMgPSBwVXJiLT5zdGF0dXM7Ci0KLQotCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOwotCXBSeENvbnRleHQtPkluVXNlID0gRkFMU0U7Ci0JcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOwotCXBSeENvbnRleHQtPkJ1bGtJbk9mZnNldCArPSBwVXJiLT5hY3R1YWxfbGVuZ3RoOwotCS8vTmRpc0ludGVybG9ja2VkRGVjcmVtZW50KCZwQWQtPlBlbmRpbmdSeCk7Ci0JcEFkLT5QZW5kaW5nUngtLTsKLQotCWlmIChTdGF0dXMgPT0gVVNCX1NUX05PRVJST1IpCi0JewotCQlwQWQtPkJ1bGtJbkNvbXBsZXRlKys7Ci0JCXBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24gPSAwOwotCQlpZiAocFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0KQkvLyBBcyBqYW4ncyBjb21tZW50LCBpdCBtYXkgYnVsay1pbiBzdWNjZXNzIGJ1dCBzaXplIGlzIHplcm8uCi0JCXsKLQkJCXBSeENvbnRleHQtPlJlYWRhYmxlID0gVFJVRTsKLQkJCUlOQ19SSU5HX0lOREVYKHBBZC0+TmV4dFJ4QnVsa0luSW5kZXgsIFJYX1JJTkdfU0laRSk7Ci0JCX0KLQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKLQl9Ci0JZWxzZQkgLy8gU1RBVFVTX09USEVSCi0JewotCQlwQWQtPkJ1bGtJbkNvbXBsZXRlRmFpbCsrOwotCQkvLyBTdGlsbCByZWFkIHRoaXMgcGFja2V0IGFsdGhvdWdoIGl0IG1heSBjb210YWluIHdyb25nIGJ5dGVzLgotCQlwUnhDb250ZXh0LT5SZWFkYWJsZSA9IEZBTFNFOwotCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOwotCi0JCS8vIFBhcnNpbmcgYWxsIHBhY2tldHMuIGJlY2F1c2UgYWZ0ZXIgcmVzZXQsIHRoZSBpbmRleCB3aWxsIHJlc2V0IHRvIGFsbCB6ZXJvLgotCQlpZiAoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKLQkJCQkJCQkJCWZSVE1QX0FEQVBURVJfQlVMS0lOX1JFU0VUIHwKLQkJCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8Ci0JCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCi0JCXsKLQotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIkJ1bGsgSW4gRmFpbGVkLiBTdGF0dXM9JWQsIEJJSWR4PTB4JXgsIEJJUklkeD0weCV4LCBhY3R1YWxfbGVuZ3RoPSAweCV4XG4iLAotCQkJCQkJCVN0YXR1cywgcEFkLT5OZXh0UnhCdWxrSW5JbmRleCwgcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXgsIHBSeENvbnRleHQtPnBVcmItPmFjdHVhbF9sZW5ndGgpKTsKLQotCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS0lOX1JFU0VUKTsKLQkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU4sIE5VTEwsIDApOwotCQl9Ci0JfQotCi0JQVNTRVJUKChwUnhDb250ZXh0LT5JblVzZSA9PSBwUnhDb250ZXh0LT5JUlBQZW5kaW5nKSk7Ci0KLQlSVFVTQkJ1bGtSZWNlaXZlKHBBZCk7Ci0KLQlyZXR1cm47Ci0KLX0KLQotCi1zdGF0aWMgdm9pZCBydDI4NzBfbWdtdF9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlQUlRNUF9BREFQVEVSIAlwQWQ7Ci0JUFRYX0NPTlRFWFQJCXBNTE1FQ29udGV4dDsKLQlpbnQJCQkJaW5kZXg7Ci0JUE5ESVNfUEFDS0VUCXBQYWNrZXQ7Ci0JcHVyYmJfdAkJCXBVcmI7Ci0JTlRTVEFUVVMJCVN0YXR1czsKLQl1bnNpZ25lZCBsb25nCUlycUZsYWdzOwotCi0KLQlwVXJiCQkJPSAocHVyYmJfdClkYXRhOwotCXBNTE1FQ29udGV4dAk9IChQVFhfQ09OVEVYVClwVXJiLT5jb250ZXh0OwotCXBBZCAJCQk9IHBNTE1FQ29udGV4dC0+cEFkOwotCVN0YXR1cwkJCT0gcFVyYi0+c3RhdHVzOwotCWluZGV4IAkJCT0gcE1MTUVDb250ZXh0LT5TZWxmSWR4OwotCi0JQVNTRVJUKChwQWQtPk1nbXRSaW5nLlR4RG1hSWR4ID09IGluZGV4KSk7Ci0KLQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW01HTVRQSVBFSURYXSwgSXJxRmxhZ3MpOwotCi0KLQlpZiAoU3RhdHVzICE9IFVTQl9TVF9OT0VSUk9SKQotCXsKLQkJLy9CdWxrLU91dCBmYWlsIHN0YXR1cyBoYW5kbGUKLQkJaWYgKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkgJiYKLQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSAmJgotCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpICYmCi0JCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkpCi0JCXsKLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJCdWxrIE91dCBNTE1FIEZhaWxlZCwgU3RhdHVzPSVkIVxuIiwgU3RhdHVzKSk7Ci0JCQkvLyBUT0RPOiBIb3cgdG8gaGFuZGxlIGFib3V0IHRoZSBNTE1FQnVsa091dCBmYWlsZWQgaXNzdWUuIE5lZWQgdG8gcmVzZW5kIHRoZSBtZ210IHBrdD8KLQkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOwotCQkJcEFkLT5idWxrUmVzZXRQaXBlaWQgPSAoTUdNVFBJUEVJRFggfCBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRyk7Ci0JCX0KLQl9Ci0KLQlwQWQtPkJ1bGtPdXRQZW5kaW5nW01HTVRQSVBFSURYXSA9IEZBTFNFOwotCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tNR01UUElQRUlEWF0sIElycUZsYWdzKTsKLQotCVJUTVBfSVJRX0xPQ0soJnBBZC0+TUxNRUJ1bGtPdXRMb2NrLCBJcnFGbGFncyk7Ci0JLy8gUmVzZXQgTUxNRSBjb250ZXh0IGZsYWdzCi0JcE1MTUVDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7Ci0JcE1MTUVDb250ZXh0LT5JblVzZSA9IEZBTFNFOwotCXBNTE1FQ29udGV4dC0+YldhaXRpbmdCdWxrT3V0ID0gRkFMU0U7Ci0JcE1MTUVDb250ZXh0LT5CdWxrT3V0U2l6ZSA9IDA7Ci0KLQlwUGFja2V0ID0gcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5wTmRpc1BhY2tldDsKLQlwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0ID0gTlVMTDsKLQotCS8vIEluY3JlYXNlIE1nbXRSaW5nIEluZGV4Ci0JSU5DX1JJTkdfSU5ERVgocEFkLT5NZ210UmluZy5UeERtYUlkeCwgTUdNVF9SSU5HX1NJWkUpOwotCXBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHgrKzsKLQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+TUxNRUJ1bGtPdXRMb2NrLCBJcnFGbGFncyk7Ci0KLQkvLyBOby1tYXR0ZXIgc3VjY2VzcyBvciBmYWlsLCB3ZSBmcmVlIHRoZSBtZ210IHBhY2tldC4KLQlpZiAocFBhY2tldCkKLQkJUlRNUEZyZWVOZGlzUGFja2V0KHBBZCwgcFBhY2tldCk7Ci0KLQlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCi0JewotCQkvLyBkbyBub3RoaW5nIGFuZCByZXR1cm4gZGlyZWN0bHkuCi0JfQotCWVsc2UKLQl7Ci0JCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkgJiYKLQkJCSgocEFkLT5idWxrUmVzZXRQaXBlaWQgJiBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRykgPT0gQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcpKQotCQl7CS8vIEZvciBNZ210IEJ1bGstT3V0IGZhaWxlZCwgaWdub3JlIGl0IG5vdy4KLQkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKLQkJfQotCQllbHNlCi0JCXsKLQotCQkJLy8gQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuCi0JCQkvLyBUaGUgcHJvdGVjdGlvb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUKLQkJCWlmIChwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4IDwgTUdNVF9SSU5HX1NJWkUgLyogcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPT0gVFJVRSAqLykKLQkJCXsKLQkJCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX01MTUUpOwotCQkJfQotCQkJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKLQkJCX0KLQkJfQotCi19Ci0KLQotc3RhdGljIHZvaWQgcnQyODcwX2hjY2FfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JUFJUTVBfQURBUFRFUgkJcEFkOwotCVBIVF9UWF9DT05URVhUCQlwSFRUWENvbnRleHQ7Ci0JVUNIQVIJCQkJQnVsa091dFBpcGVJZCA9IDQ7Ci0JcHVyYmJfdAkJCQlwVXJiOwotCi0JREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIi0tLT5oY2NhX2RtYV9kb25lX3Rhc2tsZXRcbiIpKTsKLQotCXBVcmIJCQk9IChwdXJiYl90KWRhdGE7Ci0JcEhUVFhDb250ZXh0CT0gKFBIVF9UWF9DT05URVhUKXBVcmItPmNvbnRleHQ7Ci0JcEFkCQkJCT0gcEhUVFhDb250ZXh0LT5wQWQ7Ci0KLQlydDI4NzBfZGF0YW91dF9jb21wbGV0ZV90YXNrbGV0KCh1bnNpZ25lZCBsb25nKXBVcmIpOwotCi0JaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKLQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKLQkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKQotCXsKLQkJLy8gZG8gbm90aGluZyBhbmQgcmV0dXJuIGRpcmVjdGx5LgotCX0KLQllbHNlCi0JewotCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKQotCQl7Ci0JCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7Ci0JCX0KLQkJZWxzZQotCQl7CXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtCdWxrT3V0UGlwZUlkXTsKLQkJCWlmICgocEFkLT5UeFN3UXVldWVbQnVsa091dFBpcGVJZF0uTnVtYmVyID4gMCkgJiYKLQkJCQkvKigocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID4gKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiArIDB4NjAwMCkpIHx8IChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPiBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyAweDYwMDApKSAmJiAqLwotCQkJCShwQWQtPkRlUXVldWVSdW5uaW5nW0J1bGtPdXRQaXBlSWRdID09IEZBTFNFKSAmJgotCQkJCShwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09IEZBTFNFKSkKLQkJCXsKLQkJCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBCdWxrT3V0UGlwZUlkLCBNQVhfVFhfUFJPQ0VTUyk7Ci0JCQl9Ci0KLQkJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUw8PDQpOwotCQkJUlRVU0JLaWNrQnVsa091dChwQWQpOwotCQl9Ci0JfQotCi0JREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIjwtLS1oY2NhX2RtYV9kb25lX3Rhc2tsZXRcbiIpKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBydDI4NzBfYWMzX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCVBSVE1QX0FEQVBURVIJCXBBZDsKLQlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OwotCVVDSEFSCQkJCUJ1bGtPdXRQaXBlSWQgPSAzOwotCXB1cmJiX3QJCQkJcFVyYjsKLQotCi0JcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKLQlwSFRUWENvbnRleHQJPSAoUEhUX1RYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKLQlwQWQJCQkJPSBwSFRUWENvbnRleHQtPnBBZDsKLQotCXJ0Mjg3MF9kYXRhb3V0X2NvbXBsZXRlX3Rhc2tsZXQoKHVuc2lnbmVkIGxvbmcpcFVyYik7Ci0KLQlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCi0JewotCQkvLyBkbyBub3RoaW5nIGFuZCByZXR1cm4gZGlyZWN0bHkuCi0JfQotCWVsc2UKLQl7Ci0JCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpCi0JCXsKLQkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKLQkJfQotCQllbHNlCi0JCXsJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOwotCQkJaWYgKChwQWQtPlR4U3dRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPiAwKSAmJgotCQkJCS8qKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uICsgMHg2MDAwKSkgfHwgKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA+IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIDB4NjAwMCkpICYmICovCi0JCQkJKHBBZC0+RGVRdWV1ZVJ1bm5pbmdbQnVsa091dFBpcGVJZF0gPT0gRkFMU0UpICYmCi0JCQkJKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gRkFMU0UpKQotCQkJewotCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIEJ1bGtPdXRQaXBlSWQsIE1BWF9UWF9QUk9DRVNTKTsKLQkJCX0KLQotCQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTDw8Myk7Ci0JCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7Ci0JCX0KLQl9Ci0KLQotCQlyZXR1cm47Ci19Ci0KLQotc3RhdGljIHZvaWQgcnQyODcwX2FjMl9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlQUlRNUF9BREFQVEVSCQlwQWQ7Ci0JUEhUX1RYX0NPTlRFWFQJCXBIVFRYQ29udGV4dDsKLQlVQ0hBUgkJCQlCdWxrT3V0UGlwZUlkID0gMjsKLQlwdXJiYl90CQkJCXBVcmI7Ci0KLQotCXBVcmIJCQk9IChwdXJiYl90KWRhdGE7Ci0JcEhUVFhDb250ZXh0CT0gKFBIVF9UWF9DT05URVhUKXBVcmItPmNvbnRleHQ7Ci0JcEFkCQkJCT0gcEhUVFhDb250ZXh0LT5wQWQ7Ci0KLQlydDI4NzBfZGF0YW91dF9jb21wbGV0ZV90YXNrbGV0KCh1bnNpZ25lZCBsb25nKXBVcmIpOwotCi0JaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKLQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKLQkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKQotCXsKLQkJLy8gZG8gbm90aGluZyBhbmQgcmV0dXJuIGRpcmVjdGx5LgotCX0KLQllbHNlCi0JewotCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKQotCQl7Ci0JCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7Ci0JCX0KLQkJZWxzZQotCQl7CXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtCdWxrT3V0UGlwZUlkXTsKLQkJCWlmICgocEFkLT5UeFN3UXVldWVbQnVsa091dFBpcGVJZF0uTnVtYmVyID4gMCkgJiYKLQkJCQkvKigocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID4gKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiArIDB4NjAwMCkpIHx8IChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPiBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyAweDYwMDApKSAmJiAqLwotCQkJCShwQWQtPkRlUXVldWVSdW5uaW5nW0J1bGtPdXRQaXBlSWRdID09IEZBTFNFKSAmJgotCQkJCShwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09IEZBTFNFKSkKLQkJCXsKLQkJCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBCdWxrT3V0UGlwZUlkLCBNQVhfVFhfUFJPQ0VTUyk7Ci0JCQl9Ci0KLQkJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUw8PDIpOwotCQkJUlRVU0JLaWNrQnVsa091dChwQWQpOwotCQl9Ci0JfQotCi0JCXJldHVybjsKLX0KLQotCi1zdGF0aWMgdm9pZCBydDI4NzBfYWMxX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCVBSVE1QX0FEQVBURVIJCXBBZDsKLQlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OwotCVVDSEFSCQkJCUJ1bGtPdXRQaXBlSWQgPSAxOwotCXB1cmJiX3QJCQkJcFVyYjsKLQotCi0JcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKLQlwSFRUWENvbnRleHQJPSAoUEhUX1RYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKLQlwQWQJCQkJPSBwSFRUWENvbnRleHQtPnBBZDsKLQotCXJ0Mjg3MF9kYXRhb3V0X2NvbXBsZXRlX3Rhc2tsZXQoKHVuc2lnbmVkIGxvbmcpcFVyYik7Ci0KLQlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCi0JewotCQkvLyBkbyBub3RoaW5nIGFuZCByZXR1cm4gZGlyZWN0bHkuCi0JfQotCWVsc2UKLQl7Ci0JCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpCi0JCXsKLQkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKLQkJfQotCQllbHNlCi0JCXsJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOwotCQkJaWYgKChwQWQtPlR4U3dRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPiAwKSAmJgotCQkJCS8qKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uICsgMHg2MDAwKSkgfHwgKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA+IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIDB4NjAwMCkpICYmICovCi0JCQkJKHBBZC0+RGVRdWV1ZVJ1bm5pbmdbQnVsa091dFBpcGVJZF0gPT0gRkFMU0UpICYmCi0JCQkJKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gRkFMU0UpKQotCQkJewotCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIEJ1bGtPdXRQaXBlSWQsIE1BWF9UWF9QUk9DRVNTKTsKLQkJCX0KLQotCQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTDw8MSk7Ci0JCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7Ci0JCX0KLQl9Ci0KLQotCXJldHVybjsKLX0KLQotCi1zdGF0aWMgdm9pZCBydDI4NzBfYWMwX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCVBSVE1QX0FEQVBURVIJCXBBZDsKLQlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OwotCVVDSEFSCQkJCUJ1bGtPdXRQaXBlSWQgPSAwOwotCXB1cmJiX3QJCQkJcFVyYjsKLQotCi0JcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKLQlwSFRUWENvbnRleHQJPSAoUEhUX1RYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKLQlwQWQJCQkJPSBwSFRUWENvbnRleHQtPnBBZDsKLQotCXJ0Mjg3MF9kYXRhb3V0X2NvbXBsZXRlX3Rhc2tsZXQoKHVuc2lnbmVkIGxvbmcpcFVyYik7Ci0KLQlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCi0JewotCQkvLyBkbyBub3RoaW5nIGFuZCByZXR1cm4gZGlyZWN0bHkuCi0JfQotCWVsc2UKLQl7Ci0JCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpCi0JCXsKLQkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKLQkJfQotCQllbHNlCi0JCXsJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOwotCQkJaWYgKChwQWQtPlR4U3dRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPiAwKSAmJgotCQkJCS8qICAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA+IChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gKyAweDYwMDApKSB8fCAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uID4gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgMHg2MDAwKSkgJiYgKi8KLQkJCQkocEFkLT5EZVF1ZXVlUnVubmluZ1tCdWxrT3V0UGlwZUlkXSA9PSBGQUxTRSkgJiYKLQkJCQkocEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9PSBGQUxTRSkpCi0JCQl7Ci0JCQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgQnVsa091dFBpcGVJZCwgTUFYX1RYX1BST0NFU1MpOwotCQkJfQotCi0JCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMKTsKLQkJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKLQkJfQotCX0KLQotCi0JcmV0dXJuOwotCi19Ci0KLQotc3RhdGljIHZvaWQgcnQyODcwX251bGxfZnJhbWVfY29tcGxldGVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JUFJUTVBfQURBUFRFUglwQWQ7Ci0JUFRYX0NPTlRFWFQJCXBOdWxsQ29udGV4dDsKLQlwdXJiYl90CQkJcFVyYjsKLQlOVFNUQVRVUwkJU3RhdHVzOwotCXVuc2lnbmVkIGxvbmcJaXJxRmxhZzsKLQotCi0JcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKLQlwTnVsbENvbnRleHQJPSAoUFRYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKLQlwQWQgCQkJPSBwTnVsbENvbnRleHQtPnBBZDsKLQlTdGF0dXMgCQkJPSBwVXJiLT5zdGF0dXM7Ci0KLQkvLyBSZXNldCBOdWxsIGZyYW1lIGNvbnRleHQgZmxhZ3MKLQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKLQlwTnVsbENvbnRleHQtPklSUFBlbmRpbmcgCT0gRkFMU0U7Ci0JcE51bGxDb250ZXh0LT5JblVzZSAJCT0gRkFMU0U7Ci0JcEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9IEZBTFNFOwotCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbMF0gPSAwOwotCi0JaWYgKFN0YXR1cyA9PSBVU0JfU1RfTk9FUlJPUikKLQl7Ci0JCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7Ci0KLQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKLQl9Ci0JZWxzZQkvLyBTVEFUVVNfT1RIRVIKLQl7Ci0JCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCi0JCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKLQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgotCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQotCQl7Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgTnVsbCBGcmFtZSBGYWlsZWQsIFJlYXNvbkNvZGU9JWQhXG4iLCBTdGF0dXMpKTsKLQkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOwotCQkJcEFkLT5idWxrUmVzZXRQaXBlaWQgPSAoTUdNVFBJUEVJRFggfCBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRyk7Ci0JCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIGlycUZsYWcpOwotCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsIE5VTEwsIDApOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKLQkJfQotCX0KLQotCS8vIEFsd2F5cyBjYWxsIEJ1bGsgcm91dGluZSwgZXZlbiByZXNldCBidWxrLgotCS8vIFRoZSBwcm90ZWN0aW9vbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZQotCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKLQotfQotCi0KLXN0YXRpYyB2b2lkIHJ0Mjg3MF9ydHNfZnJhbWVfY29tcGxldGVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JUFJUTVBfQURBUFRFUglwQWQ7Ci0JUFRYX0NPTlRFWFQJCXBSVFNDb250ZXh0OwotCXB1cmJiX3QJCQlwVXJiOwotCU5UU1RBVFVTCQlTdGF0dXM7Ci0JdW5zaWduZWQgbG9uZwlpcnFGbGFnOwotCi0KLQlwVXJiCQk9IChwdXJiYl90KWRhdGE7Ci0JcFJUU0NvbnRleHQJPSAoUFRYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKLQlwQWQJCQk9IHBSVFNDb250ZXh0LT5wQWQ7Ci0JU3RhdHVzCQk9IHBVcmItPnN0YXR1czsKLQotCS8vIFJlc2V0IFJUUyBmcmFtZSBjb250ZXh0IGZsYWdzCi0JUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7Ci0JcFJUU0NvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKLQlwUlRTQ29udGV4dC0+SW5Vc2UJCT0gRkFMU0U7Ci0KLQlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKQotCXsKLQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKLQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKLQl9Ci0JZWxzZQkvLyBTVEFUVVNfT1RIRVIKLQl7Ci0JCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCi0JCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKLQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgotCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQotCQl7Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgUlRTIEZyYW1lIEZhaWxlZFxuIikpOwotCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7Ci0JCQlwQWQtPmJ1bGtSZXNldFBpcGVpZCA9IChNR01UUElQRUlEWCB8IEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKTsKLQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7Ci0JCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIGlycUZsYWcpOwotCQl9Ci0JfQotCi0JUlRNUF9TRU1fTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twUlRTQ29udGV4dC0+QnVsa091dFBpcGVJZF0pOwotCXBBZC0+QnVsa091dFBlbmRpbmdbcFJUU0NvbnRleHQtPkJ1bGtPdXRQaXBlSWRdID0gRkFMU0U7Ci0JUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BSVFNDb250ZXh0LT5CdWxrT3V0UGlwZUlkXSk7Ci0KLQkvLyBBbHdheXMgY2FsbCBCdWxrIHJvdXRpbmUsIGV2ZW4gcmVzZXQgYnVsay4KLQkvLyBUaGUgcHJvdGVjdGlvb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUKLQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7Ci0KLX0KLQotCi1zdGF0aWMgdm9pZCBydDI4NzBfcHNwb2xsX2ZyYW1lX2NvbXBsZXRlX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCVBSVE1QX0FEQVBURVIJcEFkOwotCVBUWF9DT05URVhUCQlwUHNQb2xsQ29udGV4dDsKLQlwdXJiYl90CQkJcFVyYjsKLQlOVFNUQVRVUwkJU3RhdHVzOwotCi0KLQlwVXJiCQkJPSAocHVyYmJfdClkYXRhOwotCXBQc1BvbGxDb250ZXh0CT0gKFBUWF9DT05URVhUKXBVcmItPmNvbnRleHQ7Ci0JcEFkCQkJCT0gcFBzUG9sbENvbnRleHQtPnBBZDsKLQlTdGF0dXMJCQk9IHBVcmItPnN0YXR1czsKLQotCS8vIFJlc2V0IFBzUG9sbCBjb250ZXh0IGZsYWdzCi0JcFBzUG9sbENvbnRleHQtPklSUFBlbmRpbmcJPSBGQUxTRTsKLQlwUHNQb2xsQ29udGV4dC0+SW5Vc2UJCT0gRkFMU0U7Ci0JcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFswXSA9IDA7Ci0KLQlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKQotCXsKLQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKLQl9Ci0JZWxzZSAvLyBTVEFUVVNfT1RIRVIKLQl7Ci0JCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCi0JCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKLQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgotCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQotCQl7Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgUFNQb2xsIEZhaWxlZFxuIikpOwotCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7Ci0JCQlwQWQtPmJ1bGtSZXNldFBpcGVpZCA9IChNR01UUElQRUlEWCB8IEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKTsKLQkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKLQkJfQotCX0KLQotCVJUTVBfU0VNX0xPQ0soJnBBZC0+QnVsa091dExvY2tbMF0pOwotCXBBZC0+QnVsa091dFBlbmRpbmdbMF0gPSBGQUxTRTsKLQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0pOwotCi0JLy8gQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuCi0JLy8gVGhlIHByb3RlY3Rpb29uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lCi0JUlRVU0JLaWNrQnVsa091dChwQWQpOwotCi19Ci0KLQotc3RhdGljIHZvaWQgcnQyODcwX2RhdGFvdXRfY29tcGxldGVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JUFJUTVBfQURBUFRFUgkJcEFkOwotCXB1cmJiX3QJCQkJcFVyYjsKLQlQT1NfQ09PS0lFCQkJcE9iajsKLQlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OwotCVVDSEFSCQkJCUJ1bGtPdXRQaXBlSWQ7Ci0JTlRTVEFUVVMJCQlTdGF0dXM7Ci0JdW5zaWduZWQgbG9uZwkJSXJxRmxhZ3M7Ci0KLQotCXBVcmIJCQk9IChwdXJiYl90KWRhdGE7Ci0JcEhUVFhDb250ZXh0CT0gKFBIVF9UWF9DT05URVhUKXBVcmItPmNvbnRleHQ7Ci0JcEFkCQkJCT0gcEhUVFhDb250ZXh0LT5wQWQ7Ci0JcE9iaiAJCQk9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQlTdGF0dXMJCQk9IHBVcmItPnN0YXR1czsKLQotCS8vIFN0b3JlIEJ1bGtPdXQgUGlwZUlkCi0JQnVsa091dFBpcGVJZCA9IHBIVFRYQ29udGV4dC0+QnVsa091dFBpcGVJZDsKLQlwQWQtPkJ1bGtPdXREYXRhT25lU2VjQ291bnQrKzsKLQotCS8vREJHUFJJTlQoUlRfREVCVUdfTE9VRCwgKCJEb25lLUIoJWQpOkk9MHglbHgsIENXUG9zPSVsZCwgTkJQb3M9JWxkLCBFTkJQb3M9JWxkLCBiQ29weT0lZCFcbiIsIEJ1bGtPdXRQaXBlSWQsIGluX2ludGVycnVwdCgpLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sCi0JLy8JCXBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQpKTsKLQotCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKLQlwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID0gRkFMU0U7Ci0JcEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7Ci0JcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFtCdWxrT3V0UGlwZUlkXSA9IDA7Ci0KLQlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKQotCXsKLQkJcEFkLT5CdWxrT3V0Q29tcGxldGUrKzsKLQotCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKLQotCQlwQWQtPkNvdW50ZXJzODAyMy5Hb29kVHJhbnNtaXRzKys7Ci0JCS8vUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKLQkJRlJFRV9IVFRYX1JJTkcocEFkLCBCdWxrT3V0UGlwZUlkLCBwSFRUWENvbnRleHQpOwotCQkvL1JUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKLQotCi0JfQotCWVsc2UJLy8gU1RBVFVTX09USEVSCi0JewotCQlQVUNIQVIJcEJ1ZjsKLQotCQlwQWQtPkJ1bGtPdXRDb21wbGV0ZU90aGVyKys7Ci0KLQkJcEJ1ZiA9ICZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb25dOwotCi0JCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8Ci0JCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwKLQkJCQkJCQkJCWZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQotCQl7Ci0JCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKLQkJCXBBZC0+YnVsa1Jlc2V0UGlwZWlkID0gQnVsa091dFBpcGVJZDsKLQkJCXBBZC0+YnVsa1Jlc2V0UmVxW0J1bGtPdXRQaXBlSWRdID0gcEFkLT5CdWxrT3V0UmVxOwotCQl9Ci0JCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOwotCi0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJCdWxrT3V0RGF0YVBhY2tldCBmYWlsZWQ6IFJlYXNvbkNvZGU9JWQhXG4iLCBTdGF0dXMpKTsKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlx0Pj5CdWxrT3V0IFJlcT0weCVseCwgQ29tcGxldGU9MHglbHgsIE90aGVyPTB4JWx4XG4iLCBwQWQtPkJ1bGtPdXRSZXEsIHBBZC0+QnVsa091dENvbXBsZXRlLCBwQWQtPkJ1bGtPdXRDb21wbGV0ZU90aGVyKSk7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJcdD4+QnVsa091dCBIZWFkZXI6JXggJXggJXggJXggJXggJXggJXggJXhcbiIsIHBCdWZbMF0sIHBCdWZbMV0sIHBCdWZbMl0sIHBCdWZbM10sIHBCdWZbNF0sIHBCdWZbNV0sIHBCdWZbNl0sIHBCdWZbN10pKTsKLQkJLy9EQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiPj5CdWxrT3V0Q29tcGxldGVDYW5jZWw9MHgleCwgQnVsa091dENvbXBsZXRlT3RoZXI9MHgleFxuIiwgcEFkLT5CdWxrT3V0Q29tcGxldGVDYW5jZWwsIHBBZC0+QnVsa091dENvbXBsZXRlT3RoZXIpKTsKLQotCX0KLQotCS8vCi0JLy8gYkluVXNlID0gVFJVRSwgbWVhbnMgc29tZSBwcm9jZXNzIGFyZSBmaWxsaW5nIFRYIGRhdGEsIGFmdGVyIHRoYXQgbXVzdCB0dXJuIG9uIGJXYWl0aW5nQnVsa091dAotCS8vIGJXYWl0aW5nQnVsa091dCA9IFRSVUUsIG1lYW5zIHRoZSBUWCBkYXRhIGFyZSB3YWl0aW5nIGZvciBidWxrIG91dC4KLQkvLwotCS8vUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKLQlpZiAoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gIT0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSAmJgotCQkocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiAhPSAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKzgpKSAmJgotCQkhUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBRyA8PCBCdWxrT3V0UGlwZUlkKSkpCi0JewotCQkvLyBJbmRpY2F0ZSBUaGVyZSBpcyBkYXRhIGF2YWxpYWJsZQotCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBCdWxrT3V0UGlwZUlkKSk7Ci0JfQotCS8vUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOwotCi0JLy8gQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuCi0JLy8gVGhlIHByb3RlY3Rpb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUKLQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7Ci19Ci0KLS8qIEVuZCBvZiAyODcwX3J0bXBfaW5pdC5jICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9hY2N0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9hY2N0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ4MDZjMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2FjY3Rpb24uYwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSAiLi4vLi4vcnQyODYwL2NvbW1vbi9hY3Rpb24uYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9hZXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9hZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWQ2YTE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2Flcy5jCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICIuLi8uLi9ydDI4NjAvY29tbW9uL2NtbV9hZXMuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9hc2ljLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fYXNpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZGU4MTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fYXNpYy5jCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICIuLi8uLi9ydDI4NjAvY29tbW9uL2NtbV9hc2ljLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fY2ZnLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fY2ZnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIyYmRkNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9jZmcuYwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSAiLi4vLi4vcnQyODYwL2NvbW1vbi9jbW1fY2ZnLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fZGF0YV8yODcwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fZGF0YV8yODcwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNjNhNDguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2RhdGFfMjg3MC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTM2ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8qCi0gICBBbGwgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBtdXN0IGJlIFVTQi1kZXBlbmRlZCwgb3IgeW91IHNob3VsZCBvdXQgeW91ciBmdW5jdGlvbgotCWluIG90aGVyIGZpbGVzLgotCi0qLwotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLS8qCi0JV2UgY2FuIGRvIGNvcHkgdGhlIGZyYW1lIGludG8gcFR4Q29udGV4dCB3aGVuIG1hdGNoIGZvbGxvd2luZyBjb25kaXRpb25zLgotCQk9PgotCQk9PgotCQk9PgotKi8KLXN0YXRpYyBpbmxpbmUgTkRJU19TVEFUVVMgUnRtcFVTQkNhbkRvV3JpdGUoCi0JSU4gUlRNUF9BREFQVEVSCQkqcEFkLAotCUlOIFVDSEFSCQkJUXVlSWR4LAotCUlOIEhUX1RYX0NPTlRFWFQgCSpwSFRUWENvbnRleHQpCi17Ci0JTkRJU19TVEFUVVMJY2FuV3JpdGUgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7Ci0KLQlpZiAoKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pIDwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSAmJiAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgTE9DQUxfVFhCVUZfU0laRSkgPiBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24pCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlJ0bXBVU0JDYW5Eb1dyaXRlIGMxIVxuIikpOwotCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBRdWVJZHgpKTsKLQl9Ci0JZWxzZSBpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA9PSA4KSAmJiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uIDwgTE9DQUxfVFhCVUZfU0laRSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlJ0bXBVU0JDYW5Eb1dyaXRlIGMyIVxuIikpOwotCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBRdWVJZHgpKTsKLQl9Ci0JZWxzZSBpZiAocEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9PSBUUlVFKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJSdG1wVVNCQ2FuRG9Xcml0ZSBjMyFcbiIpKTsKLQl9Ci0JZWxzZQotCXsKLQkJY2FuV3JpdGUgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCX0KLQotCi0JcmV0dXJuIGNhbldyaXRlOwotfQotCi0KLVVTSE9SVCBSdG1wVVNCX1dyaXRlU3ViVHhSZXNvdXJjZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCUJPT0xFQU4JCQliSXNMYXN0LAotCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcikKLXsKLQotCS8vIER1bW15IGZ1bmN0aW9uLiBTaG91bGQgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgotCXJldHVybiAwOwotCi19Ci0KLVVTSE9SVAlSdG1wVVNCX1dyaXRlRnJhZ1R4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVQ0hBUgkJCWZyYWdOdW0sCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKQotewotCUhUX1RYX0NPTlRFWFQJKnBIVFRYQ29udGV4dDsKLQlVU0hPUlQJCQlod0hkckxlbjsJLy8gVGhlIGh3SGRyTGVuIGNvbnNpc3Qgb2YgODAyLjExIGhlYWRlciBsZW5ndGggcGx1cyB0aGUgaGVhZGVyIHBhZGRpbmcgbGVuZ3RoLgotCVVJTlQzMgkJCWZpbGxPZmZzZXQ7Ci0JVFhJTkZPX1NUUlVDCSpwVHhJbmZvOwotCVRYV0lfU1RSVUMJCSpwVHhXSTsKLQlQVUNIQVIJCQlwV2lyZWxlc3NQYWNrZXQgPSBOVUxMOwotCVVDSEFSCQkJUXVlSWR4OwotCU5ESVNfU1RBVFVTCQlTdGF0dXM7Ci0JdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKLQlVSU5UMzIJCQlVU0JETUFwa3RMZW4gPSAwLCBETUFIZHJMZW4sIHBhZGRpbmc7Ci0JQk9PTEVBTgkJCVR4UUxhc3RSb3VuZCA9IEZBTFNFOwotCi0JLy8KLQkvLyBnZXQgVHggUmluZyBSZXNvdXJjZSAmIERtYSBCdWZmZXIgYWRkcmVzcwotCS8vCi0JUXVlSWR4ID0gcFR4QmxrLT5RdWVJZHg7Ci0JcEhUVFhDb250ZXh0ICA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOwotCi0JUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOwotCi0JcEhUVFhDb250ZXh0ICA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOwotCWZpbGxPZmZzZXQgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247Ci0KLQlpZihmcmFnTnVtID09IDApCi0JewotCQkvLyBDaGVjayBpZiB3ZSBoYXZlIGVub3VnaCBzcGFjZSBmb3IgdGhpcyBidWxrLW91dCBiYXRjaC4KLQkJU3RhdHVzID0gUnRtcFVTQkNhbkRvV3JpdGUocEFkLCBRdWVJZHgsIHBIVFRYQ29udGV4dCk7Ci0JCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9IFRSVUU7Ci0KLQkJCS8vIFJlc2VydmUgc3BhY2UgZm9yIDggYnl0ZXMgcGFkZGluZy4KLQkJCWlmICgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKQotCQkJewotCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gKz0gODsKLQkJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gODsKLQkJCQlmaWxsT2Zmc2V0ICs9IDg7Ci0JCQl9Ci0JCQlwVHhCbGstPlByaXYgPSAwOwotCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKLQotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQlyZXR1cm4oU3RhdHVzKTsKLQkJfQotCX0KLQllbHNlCi0JewotCQkvLyBGb3Igc3ViLXNlcXVlbnQgZnJhbWVzIG9mIHRoaXMgYnVsay1vdXQgYmF0Y2guIEp1c3QgY29weSBpdCB0byBvdXIgYnVsay1vdXQgYnVmZmVyLgotCQlTdGF0dXMgPSAoKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gVFJVRSkgPyBORElTX1NUQVRVU19TVUNDRVNTIDogTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJZmlsbE9mZnNldCArPSBwVHhCbGstPlByaXY7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKLQotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQlyZXR1cm4oU3RhdHVzKTsKLQkJfQotCX0KLQotCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpKCZwVHhCbGstPkhlYWRlckJ1ZlswXSksIFRYSU5GT19TSVpFKTsKLQlwVHhJbmZvID0gKFBUWElORk9fU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZlswXSk7Ci0JcFR4V0k9IChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSk7Ci0KLQlwV2lyZWxlc3NQYWNrZXQgPSAmcEhUVFhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbZmlsbE9mZnNldF07Ci0KLQkvLyBjb3B5IFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCi0JLy9od0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbiwgNCk7Ci0JaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKLQotCS8vIEJ1aWxkIG91ciBVUkIgZm9yIFVTQkQKLQlETUFIZHJMZW4gPSBUWFdJX1NJWkUgKyBod0hkckxlbjsKLQlVU0JETUFwa3RMZW4gPSBETUFIZHJMZW4gKyBwVHhCbGstPlNyY0J1ZkxlbjsKLQlwYWRkaW5nID0gKDQgLSAoVVNCRE1BcGt0TGVuICUgNCkpICYgMHgwMzsJLy8gcm91bmQgdXAgdG8gNCBieXRlIGFsaWdubWVudAotCVVTQkRNQXBrdExlbiArPSBwYWRkaW5nOwotCi0JcFR4QmxrLT5Qcml2ICs9IChUWElORk9fU0laRSArIFVTQkRNQXBrdExlbik7Ci0KLQkvLyBGb3IgVHhJbmZvLCB0aGUgbGVuZ3RoIG9mIFVTQkRNQXBrdExlbiA9IFRYV0lfU0laRSArIDgwMi4xMSBoZWFkZXIgKyBwYXlsb2FkCi0JUlRNUFdyaXRlVHhJbmZvKHBBZCwgcFR4SW5mbywgKFVTSE9SVCkoVVNCRE1BcGt0TGVuKSwgRkFMU0UsIEZJRk9fRURDQSwgRkFMU0UgLypOZXh0VmFsaWQqLywgIEZBTFNFKTsKLQotCWlmIChmcmFnTnVtID09IHBUeEJsay0+VG90YWxGcmFnTnVtKQotCXsKLQkJcFR4SW5mby0+VVNCRE1BVHhidXJzdCA9IDA7Ci0JCWlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgcFR4QmxrLT5Qcml2ICsgMzkwNik+IE1BWF9UWEJVTEtfTElNSVQpCi0JCXsKLQkJCXBUeEluZm8tPlN3VXNlTGFzdFJvdW5kID0gMTsKLQkJCVR4UUxhc3RSb3VuZCA9IFRSVUU7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJcFR4SW5mby0+VVNCRE1BVHhidXJzdCA9IDE7Ci0JfQotCi0JTmRpc01vdmVNZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwVHhCbGstPkhlYWRlckJ1ZiwgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbik7Ci0JcFdpcmVsZXNzUGFja2V0ICs9IChUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGRyTGVuKTsKLQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyArPSAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbik7Ci0KLQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKLQotCU5kaXNNb3ZlTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcFR4QmxrLT5wU3JjQnVmRGF0YSwgcFR4QmxrLT5TcmNCdWZMZW4pOwotCi0JLy8JWmVybyB0aGUgbGFzdCBwYWRkaW5nLgotCXBXaXJlbGVzc1BhY2tldCArPSBwVHhCbGstPlNyY0J1ZkxlbjsKLQlOZGlzWmVyb01lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBhZGRpbmcgKyA4KTsKLQotCWlmIChmcmFnTnVtID09IHBUeEJsay0+VG90YWxGcmFnTnVtKQotCXsKLQkJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOwotCi0JCS8vIFVwZGF0ZSB0aGUgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLiAzOTA2IHVzZWQgdG8gcHJldmVudCB0aGUgTmV4dEJ1bGtPdXQgaXMgYSBBLVJBTElOSy9BLU1TRFUgRnJhbWUuCi0JCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArPSBwVHhCbGstPlByaXY7Ci0JCWlmIChUeFFMYXN0Um91bmQgPT0gVFJVRSkKLQkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA9IDg7Ci0JCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOwotCi0KLQkJLy8gRmluYWxseSwgc2V0IGJDdXJXcml0aW5nIGFzIEZBTFNFCi0JcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9IEZBTFNFOwotCi0JCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOwotCi0JCS8vIHN1Y2NlZWQgYW5kIHJlbGVhc2UgdGhlIHNrYiBidWZmZXIKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JfQotCi0KLQlyZXR1cm4oU3RhdHVzKTsKLQotfQotCi0KLVVTSE9SVCBSdG1wVVNCX1dyaXRlU2luZ2xlVHhSZXNvdXJjZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCUJPT0xFQU4JCQliSXNMYXN0LAotCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcikKLXsKLQlIVF9UWF9DT05URVhUCSpwSFRUWENvbnRleHQ7Ci0JVVNIT1JUCQkJaHdIZHJMZW47Ci0JVUlOVDMyCQkJZmlsbE9mZnNldDsKLQlUWElORk9fU1RSVUMJKnBUeEluZm87Ci0JVFhXSV9TVFJVQwkJKnBUeFdJOwotCVBVQ0hBUgkJCXBXaXJlbGVzc1BhY2tldDsKLQlVQ0hBUgkJCVF1ZUlkeDsKLQl1bnNpZ25lZCBsb25nCUlycUZsYWdzOwotCU5ESVNfU1RBVFVTCQlTdGF0dXM7Ci0JVUlOVDMyCQkJVVNCRE1BcGt0TGVuID0gMCwgRE1BSGRyTGVuLCBwYWRkaW5nOwotCUJPT0xFQU4JCQliVHhRTGFzdFJvdW5kID0gRkFMU0U7Ci0KLQkvLyBGb3IgVVNCLCBkaWRuJ3QgbmVlZCBQQ0lfTUFQX1NJTkdMRSgpCi0JLy9TcmNCdWZQQSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgKGNoYXIgKikgcFR4QmxrLT5wU3JjQnVmRGF0YSwgcFR4QmxrLT5TcmNCdWZMZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOwotCi0KLQkvLwotCS8vIGdldCBUeCBSaW5nIFJlc291cmNlICYgRG1hIEJ1ZmZlciBhZGRyZXNzCi0JLy8KLQlRdWVJZHggPSBwVHhCbGstPlF1ZUlkeDsKLQotCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKLQlwSFRUWENvbnRleHQgID0gJnBBZC0+VHhDb250ZXh0W1F1ZUlkeF07Ci0JZmlsbE9mZnNldCA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKLQotCi0KLQkvLyBDaGVjayByaW5nIGZ1bGwuCi0JU3RhdHVzID0gUnRtcFVTQkNhbkRvV3JpdGUocEFkLCBRdWVJZHgsIHBIVFRYQ29udGV4dCk7Ci0JaWYoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID0gVFJVRTsKLQotCQlwVHhJbmZvID0gKFBUWElORk9fU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZlswXSk7Ci0JCXBUeFdJPSAoUFRYV0lfU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pOwotCi0JCS8vIFJlc2VydmUgc3BhY2UgZm9yIDggYnl0ZXMgcGFkZGluZy4KLQkJaWYgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID09IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikpCi0JCXsKLQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gKz0gODsKLQkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArPSA4OwotCQkJZmlsbE9mZnNldCArPSA4OwotCQl9Ci0JCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOwotCi0JCXBXaXJlbGVzc1BhY2tldCA9ICZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtmaWxsT2Zmc2V0XTsKLQotCQkvLyBjb3B5IFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCi0JCS8vaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4sIDQpOwotCQlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOwotCi0JCS8vIEJ1aWxkIG91ciBVUkIgZm9yIFVTQkQKLQkJRE1BSGRyTGVuID0gVFhXSV9TSVpFICsgaHdIZHJMZW47Ci0JCVVTQkRNQXBrdExlbiA9IERNQUhkckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOwotCQlwYWRkaW5nID0gKDQgLSAoVVNCRE1BcGt0TGVuICUgNCkpICYgMHgwMzsJLy8gcm91bmQgdXAgdG8gNCBieXRlIGFsaWdubWVudAotCQlVU0JETUFwa3RMZW4gKz0gcGFkZGluZzsKLQotCQlwVHhCbGstPlByaXYgPSAoVFhJTkZPX1NJWkUgKyBVU0JETUFwa3RMZW4pOwotCi0JCS8vIEZvciBUeEluZm8sIHRoZSBsZW5ndGggb2YgVVNCRE1BcGt0TGVuID0gVFhXSV9TSVpFICsgODAyLjExIGhlYWRlciArIHBheWxvYWQKLQkJLy9QUyBwYWNrZXRzIHVzZSBIQ0NBIHF1ZXVlIHdoZW4gZGVxdWV1ZSBmcm9tIFBTIHVuaWNhc3QgcXVldWUgKFdpRmkgV1BBMiBNQTlfRFQxIGZvciBNYXJ2ZWxsIEIgU1RBKQotCQlSVE1QV3JpdGVUeEluZm8ocEFkLCBwVHhJbmZvLCAoVVNIT1JUKShVU0JETUFwa3RMZW4pLCBGQUxTRSwgRklGT19FRENBLCBGQUxTRSAvKk5leHRWYWxpZCovLCAgRkFMU0UpOwotCi0JCWlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgMzkwNiArIHBUeEJsay0+UHJpdikgPiBNQVhfVFhCVUxLX0xJTUlUKQotCQl7Ci0JCQlwVHhJbmZvLT5Td1VzZUxhc3RSb3VuZCA9IDE7Ci0JCQliVHhRTGFzdFJvdW5kID0gVFJVRTsKLQkJfQotCQlOZGlzTW92ZU1lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBUeEJsay0+SGVhZGVyQnVmLCBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGRyTGVuKTsKLQkJcFdpcmVsZXNzUGFja2V0ICs9IChUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGRyTGVuKTsKLQotCQkvLyBXZSB1bmxvY2sgaXQgaGVyZSB0byBwcmV2ZW50IHRoZSBmaXJzdCA4IGJ5dGVzIG1heWJlIG92ZXItd3JpdGVkIGlzc3VlLgotCQkvLwkxLiBGaXJzdCB3ZSBnb3QgQ3VyV3JpdGVQb3NpdGlvbiBidXQgdGhlIGZpcnN0IDggYnl0ZXMgc3RpbGwgbm90IHdyaXRlIHRvIHRoZSBwVHhjb250ZXh0LgotCQkvLwkyLiBBbiBpbnRlcnJ1cHQgYnJlYWsgb3VyIHJvdXRpbmUgYW5kIGhhbmRsZSBidWxrLW91dCBjb21wbGV0ZS4KLQkJLy8JMy4gSW4gdGhlIGJ1bGstb3V0IGNvbXBsbGV0ZSwgaXQgbmVlZCB0byBkbyBhbm90aGVyIGJ1bGstb3V0LAotCQkvLwkJCWlmIHRoZSBFTmV4dEJ1bGtPdXRQb3NpdGlvbiBpcyBqdXN0IHRoZSBzYW1lIGFzIEN1cldyaXRlUG9zaXRpb24sIGl0IHdpbGwgc2F2ZSB0aGUgZmlyc3QgOCBieXRlcyBmcm9tIEN1cldyaXRlUG9zaXRpb24sCi0JCS8vCQkJYnV0IHRoZSBwYXlsb2FkIHN0aWxsIG5vdCBjb3B5ZWQuIHRoZSBwVHhDb250ZXh0LT5TYXZlZFBhZFtdIHdpbGwgc2F2ZSBhcyBhbGx6ZXJvLiBhbmQgc2V0IHRoZSBiQ29weVBhZCA9IFRSVUUuCi0JCS8vCTQuIEludGVycnVwdCBjb21wbGV0ZS4KLQkJLy8gIDUuIE91ciBpbnRlcnJ1cHRlZCByb3V0aW5lIGdvIGJhY2sgYW5kIGZpbGwgdGhlIGZpcnN0IDggYnl0ZXMgdG8gcFR4Q29udGV4dC4KLQkJLy8JNi4gTmV4dCB0aW1lIHdoZW4gZG8gYnVsay1vdXQsIGl0IGZvdW5kIHRoZSBiQ29weVBhZD09VFJVRSBhbmQgd2lsbCBjb3B5IHRoZSBTYXZlZFBhZFtdIHRvIHBUeENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24uCi0JCS8vCQlhbmQgdGhlIHBhY2tldCB3aWxsIHdyb25nLgotCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyArPSAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbik7Ci0JCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOwotCi0JCU5kaXNNb3ZlTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcFR4QmxrLT5wU3JjQnVmRGF0YSwgcFR4QmxrLT5TcmNCdWZMZW4pOwotCQlwV2lyZWxlc3NQYWNrZXQgKz0gcFR4QmxrLT5TcmNCdWZMZW47Ci0JCU5kaXNaZXJvTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcGFkZGluZyArIDgpOwotCi0JCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKLQotCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gcFR4QmxrLT5Qcml2OwotCQlpZiAoYlR4UUxhc3RSb3VuZCkKLQkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA9IDg7Ci0JCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOwotCi0JcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9IEZBTFNFOwotCX0KLQotCi0JUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7Ci0KLQotCS8vIHN1Y2NlZWQgYW5kIHJlbGVhc2UgdGhlIHNrYiBidWZmZXIKLQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybihTdGF0dXMpOwotCi19Ci0KLQotVVNIT1JUIFJ0bXBVU0JfV3JpdGVNdWx0aVR4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVQ0hBUgkJCWZyYW1lTnVtLAotCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcikKLXsKLQlIVF9UWF9DT05URVhUCSpwSFRUWENvbnRleHQ7Ci0JVVNIT1JUCQkJaHdIZHJMZW47CS8vIFRoZSBod0hkckxlbiBjb25zaXN0IG9mIDgwMi4xMSBoZWFkZXIgbGVuZ3RoIHBsdXMgdGhlIGhlYWRlciBwYWRkaW5nIGxlbmd0aC4KLQlVSU5UMzIJCQlmaWxsT2Zmc2V0OwotCVRYSU5GT19TVFJVQwkqcFR4SW5mbzsKLQlUWFdJX1NUUlVDCQkqcFR4V0k7Ci0JUFVDSEFSCQkJcFdpcmVsZXNzUGFja2V0ID0gTlVMTDsKLQlVQ0hBUgkJCVF1ZUlkeDsKLQlORElTX1NUQVRVUwkJU3RhdHVzOwotCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7Ci0JLy9VSU5UMzIJCQlVU0JETUFwa3RMZW4gPSAwLCBETUFIZHJMZW4sIHBhZGRpbmc7Ci0KLQkvLwotCS8vIGdldCBUeCBSaW5nIFJlc291cmNlICYgRG1hIEJ1ZmZlciBhZGRyZXNzCi0JLy8KLQlRdWVJZHggPSBwVHhCbGstPlF1ZUlkeDsKLQlwSFRUWENvbnRleHQgID0gJnBBZC0+VHhDb250ZXh0W1F1ZUlkeF07Ci0KLQlSVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7Ci0KLQlpZihmcmFtZU51bSA9PSAwKQotCXsKLQkJLy8gQ2hlY2sgaWYgd2UgaGF2ZSBlbm91Z2ggc3BhY2UgZm9yIHRoaXMgYnVsay1vdXQgYmF0Y2guCi0JCVN0YXR1cyA9IFJ0bXBVU0JDYW5Eb1dyaXRlKHBBZCwgUXVlSWR4LCBwSFRUWENvbnRleHQpOwotCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCXsKLQkJCXBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPSBUUlVFOwotCi0JCQlwVHhJbmZvID0gKFBUWElORk9fU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZlswXSk7Ci0JCQlwVHhXST0gKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKTsKLQotCi0JCQkvLyBSZXNlcnZlIHNwYWNlIGZvciA4IGJ5dGVzIHBhZGRpbmcuCi0JCQlpZiAoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPT0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSkKLQkJCXsKLQotCQkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArPSA4OwotCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gKz0gODsKLQkJCX0KLQkJCWZpbGxPZmZzZXQgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247Ci0JCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKLQotCQkJcFdpcmVsZXNzUGFja2V0ID0gJnBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W2ZpbGxPZmZzZXRdOwotCi0JCQkvLwotCQkJLy8gQ29weSBUWElORk8gKyBUWFdJICsgV0xBTiBIZWFkZXIgKyBMTEMgaW50byBETUEgSGVhZGVyIEJ1ZmZlcgotCQkJLy8KLQkJCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNU0RVX0ZSQU1FKQotCQkJCS8vaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4tTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCwgNCkrTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKLQkJCQlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbi1MRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEICsgcFR4QmxrLT5IZHJQYWRMZW4gKyBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOwotCQkJZWxzZSBpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUpCi0JCQkJLy9od0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbi1MRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQsIDQpK0xFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRDsKLQkJCQlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbi1MRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQgKyBwVHhCbGstPkhkclBhZExlbiArIExFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRDsKLQkJCWVsc2UKLQkJCQkvL2h3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLCA0KTsKLQkJCQlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOwotCi0JCQkvLyBVcGRhdGUgdGhlIHBUeEJsay0+UHJpdi4KLQkJCXBUeEJsay0+UHJpdiA9IFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW47Ci0KLQkJCS8vCXBUeEluZm8tPlVTQkRNQXBrdExlbiBub3cganVzdCBhIHRlbXAgdmFsdWUgYW5kIHdpbGwgdG8gY29ycmVjdCBsYXR0ZXIuCi0JCQlSVE1QV3JpdGVUeEluZm8ocEFkLCBwVHhJbmZvLCAoVVNIT1JUKShwVHhCbGstPlByaXYpLCBGQUxTRSwgRklGT19FRENBLCBGQUxTRSAvKk5leHRWYWxpZCovLCAgRkFMU0UpOwotCi0JCQkvLyBDb3B5IGl0LgotCQkJTmRpc01vdmVNZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwVHhCbGstPkhlYWRlckJ1ZiwgcFR4QmxrLT5Qcml2KTsKLQkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zICs9IHBUeEJsay0+UHJpdjsKLQkJCXBXaXJlbGVzc1BhY2tldCArPSBwVHhCbGstPlByaXY7Ci0JCX0KLQl9Ci0JZWxzZQotCXsJLy8gRm9yIHN1Yi1zZXF1ZW50IGZyYW1lcyBvZiB0aGlzIGJ1bGstb3V0IGJhdGNoLiBKdXN0IGNvcHkgaXQgdG8gb3VyIGJ1bGstb3V0IGJ1ZmZlci4KLQotCQlTdGF0dXMgPSAoKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gVFJVRSkgPyBORElTX1NUQVRVU19TVUNDRVNTIDogTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJZmlsbE9mZnNldCA9ICAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgcFR4QmxrLT5Qcml2KTsKLQkJCXBXaXJlbGVzc1BhY2tldCA9ICZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtmaWxsT2Zmc2V0XTsKLQotCQkJLy9od0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcFR4QmxrLT5IZWFkZXJCdWYsIHBUeEJsay0+TXBkdUhlYWRlckxlbik7Ci0JCQlwV2lyZWxlc3NQYWNrZXQgKz0gKHBUeEJsay0+TXBkdUhlYWRlckxlbik7Ci0JCQlwVHhCbGstPlByaXYgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOwotCQl9Ci0JCWVsc2UKLQkJewkvLyBJdCBzaG91bGQgbm90IGhhcHBlbmVkIG5vdyB1bmxlc3Mgd2UgYXJlIGdvaW5nIHRvIHNodXRkb3duLgotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiV3JpdGVNdWx0aVR4UmVzb3VyY2UoKTpiQ3VyV3JpdGluZyBpcyBGQUxTRSB3aGVuIGhhbmRsZSBzdWItc2VxdWVudCBmcmFtZXMuXG4iKSk7Ci0JCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwotCQl9Ci0JfQotCi0KLQkvLyBXZSB1bmxvY2sgaXQgaGVyZSB0byBwcmV2ZW50IHRoZSBmaXJzdCA4IGJ5dGVzIG1heWJlIG92ZXItd3JpdGUgaXNzdWUuCi0JLy8JMS4gRmlyc3Qgd2UgZ290IEN1cldyaXRlUG9zaXRpb24gYnV0IHRoZSBmaXJzdCA4IGJ5dGVzIHN0aWxsIG5vdCB3cml0ZSB0byB0aGUgcFR4Q29udGV4dC4KLQkvLwkyLiBBbiBpbnRlcnJ1cHQgYnJlYWsgb3VyIHJvdXRpbmUgYW5kIGhhbmRsZSBidWxrLW91dCBjb21wbGV0ZS4KLQkvLwkzLiBJbiB0aGUgYnVsay1vdXQgY29tcGxsZXRlLCBpdCBuZWVkIHRvIGRvIGFub3RoZXIgYnVsay1vdXQsCi0JLy8JCQlpZiB0aGUgRU5leHRCdWxrT3V0UG9zaXRpb24gaXMganVzdCB0aGUgc2FtZSBhcyBDdXJXcml0ZVBvc2l0aW9uLCBpdCB3aWxsIHNhdmUgdGhlIGZpcnN0IDggYnl0ZXMgZnJvbSBDdXJXcml0ZVBvc2l0aW9uLAotCS8vCQkJYnV0IHRoZSBwYXlsb2FkIHN0aWxsIG5vdCBjb3B5ZWQuIHRoZSBwVHhDb250ZXh0LT5TYXZlZFBhZFtdIHdpbGwgc2F2ZSBhcyBhbGx6ZXJvLiBhbmQgc2V0IHRoZSBiQ29weVBhZCA9IFRSVUUuCi0JLy8JNC4gSW50ZXJydXB0IGNvbXBsZXRlLgotCS8vICA1LiBPdXIgaW50ZXJydXB0ZWQgcm91dGluZSBnbyBiYWNrIGFuZCBmaWxsIHRoZSBmaXJzdCA4IGJ5dGVzIHRvIHBUeENvbnRleHQuCi0JLy8JNi4gTmV4dCB0aW1lIHdoZW4gZG8gYnVsay1vdXQsIGl0IGZvdW5kIHRoZSBiQ29weVBhZD09VFJVRSBhbmQgd2lsbCBjb3B5IHRoZSBTYXZlZFBhZFtdIHRvIHBUeENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24uCi0JLy8JCWFuZCB0aGUgcGFja2V0IHdpbGwgd3JvbmcuCi0JUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7Ci0KLQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIldyaXRlTXVsdGlUeFJlc291cmNlOiBDV1BvcyA9ICVsZCwgTkJPdXRQb3MgPSAlbGQuXG4iLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbikpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLy8gQ29weSB0aGUgZnJhbWUgY29udGVudCBpbnRvIERNQSBidWZmZXIgYW5kIHVwZGF0ZSB0aGUgcFR4QmxrLT5Qcml2Ci0JTmRpc01vdmVNZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwVHhCbGstPnBTcmNCdWZEYXRhLCBwVHhCbGstPlNyY0J1Zkxlbik7Ci0JcFdpcmVsZXNzUGFja2V0ICs9IHBUeEJsay0+U3JjQnVmTGVuOwotCXBUeEJsay0+UHJpdiArPSBwVHhCbGstPlNyY0J1ZkxlbjsKLQotZG9uZToKLQkvLyBSZWxlYXNlIHRoZSBza2IgYnVmZmVyIGhlcmUKLQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybihTdGF0dXMpOwotCi19Ci0KLQotVk9JRCBSdG1wVVNCX0ZpbmFsV3JpdGVUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JVVNIT1JUCQkJdG90YWxNUERVU2l6ZSwKLQlJTglVU0hPUlQJCQlUeElkeCkKLXsKLQlVQ0hBUgkJCVF1ZUlkeDsKLQlIVF9UWF9DT05URVhUCSpwSFRUWENvbnRleHQ7Ci0JVUlOVDMyCQkJZmlsbE9mZnNldDsKLQlUWElORk9fU1RSVUMJKnBUeEluZm87Ci0JVFhXSV9TVFJVQwkJKnBUeFdJOwotCVVJTlQzMgkJCVVTQkRNQXBrdExlbiwgcGFkZGluZzsKLQl1bnNpZ25lZCBsb25nCUlycUZsYWdzOwotCVBVQ0hBUgkJCXBXaXJlbGVzc1BhY2tldDsKLQotCVF1ZUlkeCA9IHBUeEJsay0+UXVlSWR4OwotCXBIVFRYQ29udGV4dCAgPSAmcEFkLT5UeENvbnRleHRbUXVlSWR4XTsKLQotCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKLQotCWlmIChwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09IFRSVUUpCi0JewotCQlmaWxsT2Zmc2V0ID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOwotCQlpZiAoKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID09IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikgfHwgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uLTgpID09IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikpCi0JCQkmJiAocEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQgPT0gVFJVRSkpCi0JCQlwV2lyZWxlc3NQYWNrZXQgPSAoUFVDSEFSKSgmcEhUVFhDb250ZXh0LT5TYXZlZFBhZFswXSk7Ci0JCWVsc2UKLQkJCXBXaXJlbGVzc1BhY2tldCA9IChQVUNIQVIpKCZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtmaWxsT2Zmc2V0XSk7Ci0KLQkJLy8KLQkJLy8gVXBkYXRlIFR4SW5mby0+VVNCRE1BcGt0TGVuICwKLQkJLy8JCXRoZSBsZW5ndGggPSBUWFdJX1NJWkUgKyA4MDIuMTFfaGRyICsgODAyLjExX2hkcl9wYWQgKyBwYXlsb2FkX29mX2FsbF9iYXRjaF9mcmFtZXMgKyBCdWxrLU91dC1wYWRkaW5nCi0JCS8vCi0JCXBUeEluZm8gPSAoUFRYSU5GT19TVFJVQykocFdpcmVsZXNzUGFja2V0KTsKLQotCQkvLyBDYWxjdWxhdGUgdGhlIGJ1bGstb3V0IHBhZGRpbmcKLQkJVVNCRE1BcGt0TGVuID0gcFR4QmxrLT5Qcml2IC0gVFhJTkZPX1NJWkU7Ci0JCXBhZGRpbmcgPSAoNCAtIChVU0JETUFwa3RMZW4gJSA0KSkgJiAweDAzOwkvLyByb3VuZCB1cCB0byA0IGJ5dGUgYWxpZ25tZW50Ci0JCVVTQkRNQXBrdExlbiArPSBwYWRkaW5nOwotCi0JCXBUeEluZm8tPlVTQkRNQVR4UGt0TGVuID0gVVNCRE1BcGt0TGVuOwotCi0JCS8vCi0JCS8vIFVwZGF0ZSBUWFdJLT5NUERVdG90YWxCeXRlQ291bnQgLAotCQkvLwkJdGhlIGxlbmd0aCA9IDgwMi4xMSBoZWFkZXIgKyBwYXlsb2FkX29mX2FsbF9iYXRjaF9mcmFtZXMKLQkJcFR4V0k9IChQVFhXSV9TVFJVQykocFdpcmVsZXNzUGFja2V0ICsgVFhJTkZPX1NJWkUpOwotCQlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gdG90YWxNUERVU2l6ZTsKLQotCQkvLwotCQkvLyBVcGRhdGUgdGhlIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbgotCQkvLwotCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gKFRYSU5GT19TSVpFICsgVVNCRE1BcGt0TGVuKTsKLQkJaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyAzOTA2KT4gTUFYX1RYQlVMS19MSU1JVCkKLQkJewkvLyBBZGQgMzkwNiBmb3IgcHJldmVudCB0aGUgTmV4dEJ1bGtPdXQgcGFja2V0IHNpemUgaXMgYSBBLVJBTElOSy9BLU1TRFUgRnJhbWUuCi0JCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPSA4OwotCQkJcFR4SW5mby0+U3dVc2VMYXN0Um91bmQgPSAxOwotCQl9Ci0JCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOwotCi0KLQkJLy8KLQkJLy8JWmVybyB0aGUgbGFzdCBwYWRkaW5nLgotCQkvLwotCQlwV2lyZWxlc3NQYWNrZXQgPSAoJnBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W2ZpbGxPZmZzZXQgKyBwVHhCbGstPlByaXZdKTsKLQkJTmRpc1plcm9NZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwYWRkaW5nICsgOCk7Ci0KLQkJLy8gRmluYWxseSwgc2V0IGJDdXJXcml0aW5nIGFzIEZBTFNFCi0JCXBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPSBGQUxTRTsKLQotCX0KLQllbHNlCi0JewkvLyBJdCBzaG91bGQgbm90IGhhcHBlbmVkIG5vdyB1bmxlc3Mgd2UgYXJlIGdvaW5nIHRvIHNodXRkb3duLgotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJGaW5hbFdyaXRlVHhSZXNvdXJjZSgpOmJDdXJXcml0aW5nIGlzIEZBTFNFIHdoZW4gaGFuZGxlIGxhc3QgZnJhbWVzLlxuIikpOwotCX0KLQotCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOwotCi19Ci0KLQotVk9JRCBSdG1wVVNCRGF0YUxhc3RUeElkeCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCVF1ZUlkeCwKLQlJTglVU0hPUlQJCQlUeElkeCkKLXsKLQkvLyBETyBub3RoaW5nIGZvciBVU0IuCi19Ci0KLQotLyoKLQlXaGVuIGNhbiBkbyBidWxrLW91dDoKLQkJMS4gVHhTd0ZyZWVJZHggPCBUWF9SSU5HX1NJWkU7Ci0JCQlJdCBtZWFucyBoYXMgYXQgbGVhc3Qgb25lIFJpbmcgZW50aXR5IGlzIHJlYWR5IGZvciBidWxrLW91dCwga2ljayBpdCBvdXQuCi0JCTIuIElmIFR4U3dGcmVlSWR4ID09IFRYX1JJTkdfU0laRQotCQkJQ2hlY2sgaWYgdGhlIEN1cldyaXRpbmcgZmxhZyBpcyBGQUxTRSwgaWYgaXQncyBGQUxTRSwgd2UgY2FuIGRvIGtpY2sgb3V0LgotCi0qLwotVk9JRCBSdG1wVVNCRGF0YUtpY2tPdXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVQ0hBUgkJCVF1ZUlkeCkKLXsKLQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBRdWVJZHgpKTsKLQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7Ci0KLX0KLQotCi0vKgotCU11c3QgYmUgcnVuIGluIEludGVycnVwdCBjb250ZXh0Ci0JVGhpcyBmdW5jdGlvbiBoYW5kbGUgUlQyODcwIHNwZWNpZmljIFR4RGVzYyBhbmQgY3B1IGluZGV4IHVwZGF0ZSBhbmQga2ljayB0aGUgcGFja2V0IG91dC4KLSAqLwotaW50IFJ0bXBVU0JNZ210S2lja091dCgKLQlJTiBSVE1QX0FEQVBURVIgCSpwQWQsCi0JSU4gVUNIQVIgCQkJUXVlSWR4LAotCUlOIFBORElTX1BBQ0tFVAkJcFBhY2tldCwKLQlJTiBQVUNIQVIJCQlwU3JjQnVmVkEsCi0JSU4gVUlOVCAJCQlTcmNCdWZMZW4pCi17Ci0JUFRYSU5GT19TVFJVQwlwVHhJbmZvOwotCVVMT05HCQkJQnVsa091dFNpemU7Ci0JVUNIQVIJCQlwYWRMZW47Ci0JUFVDSEFSCQkJcERlc3Q7Ci0JVUxPTkcJCQlTd0lkeCA9IHBBZC0+TWdtdFJpbmcuVHhDcHVJZHg7Ci0JUFRYX0NPTlRFWFQJCXBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVClwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLkFsbG9jVmE7Ci0JdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKLQotCi0JcFR4SW5mbyA9IChQVFhJTkZPX1NUUlVDKShwU3JjQnVmVkEpOwotCi0JLy8gQnVpbGQgb3VyIFVSQiBmb3IgVVNCRAotCUJ1bGtPdXRTaXplID0gU3JjQnVmTGVuOwotCUJ1bGtPdXRTaXplID0gKEJ1bGtPdXRTaXplICsgMykgJiAofjMpOwotCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sIChVU0hPUlQpKEJ1bGtPdXRTaXplIC0gVFhJTkZPX1NJWkUpLCBUUlVFLCBFcFRvUXVldWVbTUdNVFBJUEVJRFhdLCBGQUxTRSwgIEZBTFNFKTsKLQotCUJ1bGtPdXRTaXplICs9IDQ7IC8vIEFsd2F5cyBhZGQgNCBleHRyYSBieXRlcyBhdCBldmVyeSBwYWNrZXQuCi0KLQkvLyBJZiBCdWxrT3V0U2l6ZSBpcyBtdWx0aXBsZSBvZiBCdWxrT3V0TWF4UGFja2V0U2l6ZSwgYWRkIGV4dHJhIDQgYnl0ZXMgYWdhaW4uCi0JaWYgKChCdWxrT3V0U2l6ZSAlIHBBZC0+QnVsa091dE1heFBhY2tldFNpemUpID09IDApCi0JCUJ1bGtPdXRTaXplICs9IDQ7Ci0KLQlwYWRMZW4gPSBCdWxrT3V0U2l6ZSAtIFNyY0J1ZkxlbjsKLQlBU1NFUlQoKHBhZExlbiA8PSBSVE1QX1BLVF9UQUlMX1BBRERJTkcpKTsKLQotCS8vIE5vdyBtZW16ZXJvIGFsbCBleHRyYSBwYWRkaW5nIGJ5dGVzLgotCXBEZXN0ID0gKFBVQ0hBUikocFNyY0J1ZlZBICsgU3JjQnVmTGVuKTsKLQlza2JfcHV0KEdFVF9PU19QS1RfVFlQRShwUGFja2V0KSwgcGFkTGVuKTsKLQlOZGlzWmVyb01lbW9yeShwRGVzdCwgcGFkTGVuKTsKLQotCVJUTVBfSVJRX0xPQ0soJnBBZC0+TUxNRUJ1bGtPdXRMb2NrLCBJcnFGbGFncyk7Ci0KLQlwQWQtPk1nbXRSaW5nLkNlbGxbcEFkLT5NZ210UmluZy5UeENwdUlkeF0ucE5kaXNQYWNrZXQgPSBwUGFja2V0OwotCXBNTE1FQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPSAoUFRYX0JVRkZFUikoR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpKTsKLQotCS8vIExlbmd0aCBpbiBUeEluZm8gc2hvdWxkIGJlIDggbGVzcyB0aGFuIGJ1bGtvdXQgc2l6ZS4KLQlwTUxNRUNvbnRleHQtPkJ1bGtPdXRTaXplID0gQnVsa091dFNpemU7Ci0JcE1MTUVDb250ZXh0LT5JblVzZSA9IFRSVUU7Ci0JcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPSBUUlVFOwotCi0KLQkvL2ZvciBkZWJ1ZwotCS8vaGV4X2R1bXAoIlJ0bXBVU0JNZ210S2lja091dCIsICZwTUxNRUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFswXSwgKHBNTE1FQ29udGV4dC0+QnVsa091dFNpemUgPiAxNiA/IDE2IDogcE1MTUVDb250ZXh0LT5CdWxrT3V0U2l6ZSkpOwotCi0JLy9wQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7Ci0JLy9wQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7Ci0KLQkvL2lmIChwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID09IE1HTVRfUklOR19TSVpFKQotCS8vCW5lZWRLaWNrT3V0ID0gVFJVRTsKLQotCS8vIERlY3JlYXNlIHRoZSBUeFN3RnJlZUlkeCBhbmQgSW5jcmVhc2UgdGhlIFRYX0NUWF9JRFgKLQlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4LS07Ci0JSU5DX1JJTkdfSU5ERVgocEFkLT5NZ210UmluZy5UeENwdUlkeCwgTUdNVF9SSU5HX1NJWkUpOwotCi0JUlRNUF9JUlFfVU5MT0NLKCZwQWQtPk1MTUVCdWxrT3V0TG9jaywgSXJxRmxhZ3MpOwotCi0JUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9NTE1FKTsKLQkvL2lmIChuZWVkS2lja091dCkKLQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1WT0lEIFJ0bXBVU0JOdWxsRnJhbWVLaWNrT3V0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFVDSEFSCQlRdWVJZHgsCi0JSU4gVUNIQVIJCSpwTnVsbEZyYW1lLAotCUlOIFVJTlQzMgkJZnJhbWVMZW4pCi17Ci0JaWYgKHBBZC0+TnVsbENvbnRleHQuSW5Vc2UgPT0gRkFMU0UpCi0JewotCQlQVFhfQ09OVEVYVAkJcE51bGxDb250ZXh0OwotCQlQVFhJTkZPX1NUUlVDCXBUeEluZm87Ci0JCVBUWFdJX1NUUlVDCQlwVHhXSTsKLQkJUFVDSEFSCQkJcFdpcmVsZXNzUGt0OwotCi0JCXBOdWxsQ29udGV4dCA9ICYocEFkLT5OdWxsQ29udGV4dCk7Ci0KLQkJLy8gU2V0IHRoZSBpbiB1c2UgYml0Ci0JCXBOdWxsQ29udGV4dC0+SW5Vc2UgPSBUUlVFOwotCQlwV2lyZWxlc3NQa3QgPSAoUFVDSEFSKSZwTnVsbENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFswXTsKLQotCQlSVE1QWmVyb01lbW9yeSgmcFdpcmVsZXNzUGt0WzBdLCAxMDApOwotCQlwVHhJbmZvID0gKFBUWElORk9fU1RSVUMpJnBXaXJlbGVzc1BrdFswXTsKLQkJUlRNUFdyaXRlVHhJbmZvKHBBZCwgcFR4SW5mbywgKFVTSE9SVCkoc2l6ZW9mKEhFQURFUl84MDJfMTEpK1RYV0lfU0laRSksIFRSVUUsIEVwVG9RdWV1ZVtNR01UUElQRUlEWF0sIEZBTFNFLCAgRkFMU0UpOwotCQlwVHhJbmZvLT5RU0VMID0gRklGT19FRENBOwotCQlwVHhXSSA9IChQVFhXSV9TVFJVQykmcFdpcmVsZXNzUGt0W1RYSU5GT19TSVpFXTsKLQkJUlRNUFdyaXRlVHhXSShwQWQsIHBUeFdJLCAgRkFMU0UsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIFRSVUUsIEZBTFNFLCAwLCBCU1NJRF9XQ0lELCAoc2l6ZW9mKEhFQURFUl84MDJfMTEpKSwKLQkJCTAsIDAsIChVQ0hBUilwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTLCBJRlNfSFRUWE9QLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7Ci0JCVJUTVBNb3ZlTWVtb3J5KCZwV2lyZWxlc3NQa3RbVFhXSV9TSVpFK1RYSU5GT19TSVpFXSwgJnBBZC0+TnVsbEZyYW1lLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCQlwQWQtPk51bGxDb250ZXh0LkJ1bGtPdXRTaXplID0gIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgc2l6ZW9mKHBBZC0+TnVsbEZyYW1lKSArIDQ7Ci0KLQkJLy8gRmlsbCBvdXQgZnJhbWUgbGVuZ3RoIGluZm9ybWF0aW9uIGZvciBnbG9iYWwgQnVsayBvdXQgYXJiaXRvcgotCQkvL3BOdWxsQ29udGV4dC0+QnVsa091dFNpemUgPSBUcmFuc2ZlckJ1ZmZlckxlbmd0aDsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIHNlbmQgTlVMTCBGcmFtZSBAJWQgTWJwcy4uLlxuIiwgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZV0pKTsKLQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05VTEwpOwotCi0JCS8vIEtpY2sgYnVsayBvdXQKLQkJUlRVU0JLaWNrQnVsa091dChwQWQpOwotCX0KLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJQ2hlY2sgUnggZGVzY3JpcHRvciwgcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkUgaWYgYW55IGVycm9yIGRvdW5kCi0KLQlBcmd1bWVudHM6Ci0JCXBSeEQJCVBvaW50ZXIJdG8gdGhlIFJ4IGRlc2NyaXB0b3IKLQotCVJldHVybiBWYWx1ZToKLQkJTkRJU19TVEFUVVNfU1VDQ0VTUwkJTm8gZXJyCi0JCU5ESVNfU1RBVFVTX0ZBSUxVUkUJCUVycm9yCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMJUlRNUENoZWNrUnhFcnJvcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQSEVBREVSXzgwMl8xMQlwSGVhZGVyLAotCUlOCVBSWFdJX1NUUlVDCXBSeFdJLAotCUlOCVBSVDI4WFhfUlhEX1NUUlVDCXBSeElORk8pCi17Ci0JUENJUEhFUl9LRVkgcFdwYUtleTsKLQlJTlQJZEJtOwotCi0JaWYgKHBBZC0+YlByb21pc2N1b3VzID09IFRSVUUpCi0JCXJldHVybihORElTX1NUQVRVU19TVUNDRVNTKTsKLQlpZihwUnhJTkZPID09IE5VTEwpCi0JCXJldHVybihORElTX1NUQVRVU19GQUlMVVJFKTsKLQotCS8vIFBoeSBlcnJvcnMgJiBDUkMgZXJyb3JzCi0JaWYgKHBSeElORk8tPkNyYykKLQl7Ci0JCS8vIENoZWNrIFJTU0kgZm9yIE5vaXNlIEhpc3Qgc3RhdGlzdGljIGNvbGxlY3Rpb24uCi0JCWRCbSA9IChJTlQpIChwUnhXSS0+UlNTSTApIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKLQkJaWYgKGRCbSA8PSAtODcpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzBdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtODIpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzFdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtNzcpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzJdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtNzIpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzNdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtNjcpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzRdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtNjIpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzVdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtNTcpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzZdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA+IC01NykKLQkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbN10gKz0gMTsKLQotCQlyZXR1cm4oTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JfQotCi0JLy8gQWRkIFJ4IHNpemUgdG8gY2hhbm5lbCBsb2FkIGNvdW50ZXIsIHdlIHNob3VsZCBpZ25vcmUgZXJyb3IgY291bnRzCi0JcEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgKz0gKHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQrIDE0KTsKLQotCS8vIERyb3AgVG9EcyBwcm9taXNjb3VzIGZyYW1lLCBpdCBpcyBvcGVuZWQgZHVlIHRvIENDWCAyIGNoYW5uZWwgbG9hZCBzdGF0aXN0aWNzCi0JaWYgKHBIZWFkZXItPkZDLlRvRHMpCi0JewotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiRXJyO0ZDLlRvRHNcbiIpKTsKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0JLy8gUGF1bCAwNC0wMyBmb3IgT0ZETSBSeCBsZW5ndGggaXNzdWUKLQlpZiAocFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA+IE1BWF9BR0dSRUdBVElPTl9TSVpFKQotCXsKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoInJlY2VpdmVkIHBhY2tldCB0b28gbG9uZ1xuIikpOwotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQkvLyBEcm9wIG5vdCBVMk0gZnJhbWVzLCBjYW50J3MgZHJvcCBoZXJlIGJlY2F1c2Ugd2Ugd2lsbCBkcm9wIGJlYWNvbiBpbiB0aGlzIGNhc2UKLQkvLyBJIGFtIGtpbmQgb2YgZG91YnRpbmcgdGhlIFUyTSBiaXQgb3BlcmF0aW9uCi0JLy8gaWYgKHBSeEQtPlUyTSA9PSAwKQotCS8vCXJldHVybihORElTX1NUQVRVU19GQUlMVVJFKTsKLQotCS8vIGRyb3AgZGVjeXB0aW9uIGZhaWwgZnJhbWUKLQlpZiAocFJ4SU5GTy0+RGVjcnlwdGVkICYmIHBSeElORk8tPkNpcGhlckVycikKLQl7Ci0KLQkJLy8KLQkJLy8gTUlDIEVycm9yCi0JCS8vCi0JCWlmICgocFJ4SU5GTy0+Q2lwaGVyRXJyID09IDIpICYmIHBSeElORk8tPk15QnNzKQotCQl7Ci0JCQlwV3BhS2V5ID0gJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BSeFdJLT5LZXlJbmRleF07Ci0JCQlSVE1QUmVwb3J0TWljRXJyb3IocEFkLCBwV3BhS2V5KTsKLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIlJ4IE1JQyBWYWx1ZSBlcnJvclxuIikpOwotCQl9Ci0KLQkJaWYgKHBSeElORk8tPkRlY3J5cHRlZCAmJgotCQkJKHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BSeFdJLT5LZXlJbmRleF0uQ2lwaGVyQWxnID09IENJUEhFUl9BRVMpICYmCi0JCQkocEhlYWRlci0+U2VxdWVuY2UgPT0gcEFkLT5GcmFnRnJhbWUuU2VxdWVuY2UpKQotCQl7Ci0JCQkvLwotCQkJLy8gQWNjZXB0YWJsZSBzaW5jZSB0aGUgRmlyc3QgRnJhZ0ZyYW1lIG5vIENpcGhlckVyciBwcm9ibGVtLgotCQkJLy8KLQkJCXJldHVybihORElTX1NUQVRVU19TVUNDRVNTKTsKLQkJfQotCi0JCXJldHVybihORElTX1NUQVRVU19GQUlMVVJFKTsKLQl9Ci0KLQlyZXR1cm4oTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci19Ci0KLVZPSUQgUlQyOHh4VXNiU3RhQXNpY0ZvcmNlV2FrZXVwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIEJPT0xFQU4gICAgICAgYkZyb21UeCkKLXsKLSAgICBBVVRPX1dBS0VVUF9TVFJVQwlBdXRvV2FrZXVwQ2ZnOwotCi0JQXV0b1dha2V1cENmZy53b3JkID0gMDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7Ci0KLQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIDB4ZmYsIDB4MDAsIDB4MDIpOwotCi0JT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7Ci19Ci0KLVZPSUQgUlQyOHh4VXNiU3RhQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIFRidHROdW1Ub05leHRXYWtlVXApCi17Ci0JQVVUT19XQUtFVVBfU1RSVUMJQXV0b1dha2V1cENmZzsKLQotCS8vIHdlIGhhdmUgZGVjaWRlZCB0byBTTEVFUCwgc28gYXQgbGVhc3QgZG8gaXQgZm9yIGEgQkVBQ09OIHBlcmlvZC4KLQlpZiAoVGJ0dE51bVRvTmV4dFdha2VVcCA9PSAwKQotCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gMTsKLQotCUF1dG9XYWtldXBDZmcud29yZCA9IDA7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOwotCi0JQXV0b1dha2V1cENmZy5maWVsZC5OdW1vZlNsZWVwaW5nVGJ0dCA9IFRidHROdW1Ub05leHRXYWtlVXAgLSAxOwotCUF1dG9XYWtldXBDZmcuZmllbGQuRW5hYmxlQXV0b1dha2V1cCA9IDE7Ci0JQXV0b1dha2V1cENmZy5maWVsZC5BdXRvTGVhZFRpbWUgPSA1OwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKLQotCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMCwgMHhmZiwgMHhmZiwgMHgwMik7ICAgLy8gc2VuZCBQT1dFUi1TQVZFIGNvbW1hbmQgdG8gTUNVLiBUaW1lb3V0IDQwdXMuCi0KLQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7Ci0KLX0KLQotVk9JRCBSVDI4eHhVc2JNbG1lUmFkaW9PbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUMjh4eFVzYk1sbWVSYWRpb09uKClcbiIpKTsKLQotCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCi0JCXJldHVybjsKLQotICAgIAlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIDB4ZmYsIDB4MDAsIDB4MDIpOwotCQlSVE1QdXNlY0RlbGF5KDEwMDAwKTsKLQotCU5JQ1Jlc2V0RnJvbUVycm9yKHBBZCk7Ci0KLQkvLyBFbmFibGUgVHgvUngKLQlSVE1QRW5hYmxlUnhUeChwQWQpOwotCi0jaWZkZWYgUlQzMDcwCi0JaWYgKElTX1JUMzA3MShwQWQpKQotCXsKLQkJUlQzMHh4UmV2ZXJzZVJGU2xlZXBNb2RlU2V0dXAocEFkKTsKLQl9Ci0jZW5kaWYgLy8gUlQzMDcwIC8vCi0KLQkvLyBDbGVhciBSYWRpbyBvZmYgZmxhZwotCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKLQotCVJUVVNCQnVsa1JlY2VpdmUocEFkKTsKLQotCS8vIFNldCBMRUQKLQlSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09OKTsKLX0KLQotVk9JRCBSVDI4eHhVc2JNbG1lUmFkaW9PRkYoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JV1BETUFfR0xPX0NGR19TVFJVQwlHbG9DZmc7Ci0JVUlOVDMyCVZhbHVlLCBpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVDI4eHhVc2JNbG1lUmFkaW9PRkYoKVxuIikpOwotCi0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQotCQlyZXR1cm47Ci0KLQkvLyBTZXQgTEVECi0JUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PRkYpOwotCS8vIFNldCBSYWRpbyBvZmYgZmxhZwotCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7Ci0KLQl7Ci0JCS8vIExpbmsgZG93biBmaXJzdCBpZiBhbnkgYXNzb2NpYXRpb24gZXhpc3RzCi0JCWlmIChJTkZSQV9PTihwQWQpIHx8IEFESE9DX09OKHBBZCkpCi0JCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKLQkJUlRNUHVzZWNEZWxheSgxMDAwMCk7Ci0KLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJLy8gQ2xlYW4gdXAgb2xkIGJzcyB0YWJsZQotCQlCc3NUYWJsZUluaXQoJnBBZC0+U2NhblRhYik7Ci0JfQotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkKLQl7Ci0JCS8vIE11c3QgdXNpbmcgNDBNSHouCi0JCUFzaWNUdXJuT2ZmUkZDbGsocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIE11c3QgdXNpbmcgMjBNSHouCi0JCUFzaWNUdXJuT2ZmUkZDbGsocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQl9Ci0KLQkvLyBEaXNhYmxlIFR4L1J4IERNQQotCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsJICAgLy8gZGlzYWJsZSBETUEKLQlHbG9DZmcuZmllbGQuRW5hYmxlVHhETUEgPSAwOwotCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IDA7Ci0JUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOwkgICAvLyBhYm9ydCBhbGwgVFggcmluZ3MKLQotCS8vIFdhaXRpbmcgZm9yIERNQSBpZGxlCi0JaSA9IDA7Ci0JZG8KLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKLQkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQotCQkJYnJlYWs7Ci0KLQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQl9d2hpbGUgKGkrKyA8IDEwMCk7Ci0KLQkvLyBEaXNhYmxlIE1BQyBUeC9SeAotCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwotCVZhbHVlICY9ICgweGZmZmZmZmYzKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLQotCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMCwgMHhmZiwgMHhmZiwgMHgwMik7Ci19Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9kYXRhX3VzYi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2RhdGFfdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA0Njc1ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9kYXRhX3VzYi5jCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICIuLi8uLi9ydDI4NjAvY29tbW9uL2NtbV9kYXRhX3VzYi5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX21hY191c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9tYWNfdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI2YWY0YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9tYWNfdXNiLmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uLy4uL3J0Mjg2MC9jb21tb24vY21tX21hY191c2IuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9wcm9maWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fcHJvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MjZlNDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fcHJvZmlsZS5jCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICIuLi8uLi9ydDI4NjAvY29tbW9uL2NtbV9wcm9maWxlLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fdGtpcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX3RraXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzNjNzFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX3RraXAuYwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSAiLi4vLi4vcnQyODYwL2NvbW1vbi9jbW1fdGtpcC5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX3dlcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX3dlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNjgxMDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fd2VwLmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uLy4uL3J0Mjg2MC9jb21tb24vY21tX3dlcC5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY3J5cHRfaG1hYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY3J5cHRfaG1hYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZDg0ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jcnlwdF9obWFjLmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uLy4uL3J0Mjg2MC9jb21tb24vY3J5cHRfaG1hYy5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY3J5cHRfbWQ1LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jcnlwdF9tZDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTdhMmNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY3J5cHRfbWQ1LmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uLy4uL3J0Mjg2MC9jb21tb24vY3J5cHRfbWQ1LmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jcnlwdF9zaGEyLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jcnlwdF9zaGEyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdmZmIzMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NyeXB0X3NoYTIuYwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSAiLi4vLi4vcnQyODYwL2NvbW1vbi9jcnlwdF9zaGEyLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9lZV9lZnVzZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vZWVfZWZ1c2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTM0ZTY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vZWVfZWZ1c2UuYwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSAiLi4vLi4vcnQyODYwL2NvbW1vbi9lZV9lZnVzZS5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnRfY2hhbm5lbC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnRfY2hhbm5lbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4Y2ViNGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydF9jaGFubmVsLmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uLy4uL3J0Mjg2MC9jb21tb24vcnRfY2hhbm5lbC5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnRfcmYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0X3JmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgxY2ZmMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0X3JmLmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uLy4uL3J0Mjg2MC9jb21tb24vcnRfcmYuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0bXBfbWN1LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydG1wX21jdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYjdmMTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydG1wX21jdS5jCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICIuLi8uLi9ydDI4NjAvY29tbW9uL3J0bXBfbWN1LmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydG1wX3RpbWVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydG1wX3RpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ0YWVkYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0bXBfdGltZXIuYwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSAiLi4vLi4vcnQyODYwL2NvbW1vbi9ydG1wX3RpbWVyLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydHVzYl9idWxrLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydHVzYl9idWxrLmMKaW5kZXggYTQyNDRiNS4uMzc5NzgwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfYnVsay5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0dXNiX2J1bGsuYwpAQCAtMSw0ICsxLDQgQEAKLSAvKgorLyoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBSYWxpbmsgVGVjaCBJbmMuCiAgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCkBAIC0zNywxMzMgKzM3LDEyNCBAQAogCiAqLwogCisjaWZkZWYgUlRNUF9NQUNfVVNCCisKICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLS8vIE1hdGNoIHRvdGFsIDYgYnVsa291dCBlbmRwb2ludCB0byBjb3JyZXNwb25kaW5nIHF1ZXVlLgotVUNIQVIJRXBUb1F1ZXVlWzZdPXtGSUZPX0VEQ0EsIEZJRk9fRURDQSwgRklGT19FRENBLCBGSUZPX0VEQ0EsIEZJRk9fRURDQSwgRklGT19NR01UfTsKKy8qIE1hdGNoIHRvdGFsIDYgYnVsa291dCBlbmRwb2ludCB0byBjb3JyZXNwb25kaW5nIHF1ZXVlLiAqLwordTggRXBUb1F1ZXVlWzZdID0KKyAgICB7IEZJRk9fRURDQSwgRklGT19FRENBLCBGSUZPX0VEQ0EsIEZJRk9fRURDQSwgRklGT19FRENBLCBGSUZPX01HTVQgfTsKIAotLy9zdGF0aWMgQk9PTEVBTiBTaW5nbGVCdWxrT3V0ID0gRkFMU0U7CisvKnN0YXRpYyBCT09MRUFOIFNpbmdsZUJ1bGtPdXQgPSBGQUxTRTsgKi8KIAotdm9pZCBSVFVTQl9GSUxMX0JVTEtfVVJCIChzdHJ1Y3QgdXJiICpwVXJiLAotCXN0cnVjdCB1c2JfZGV2aWNlICpwVXNiX0RldiwKLQl1bnNpZ25lZCBpbnQgYnVsa3BpcGUsCi0Jdm9pZCAqcFRyYW5zZmVyQnVmLAotCWludCBCdWZTaXplLAotCXVzYl9jb21wbGV0ZV90IENvbXBsZXRlLAotCXZvaWQgKnBDb250ZXh0KQordm9pZCBSVFVTQl9GSUxMX0JVTEtfVVJCKHN0cnVjdCB1cmIgKnBVcmIsCisJCQkgc3RydWN0IHVzYl9kZXZpY2UgKnBVc2JfRGV2LAorCQkJIHVuc2lnbmVkIGludCBidWxrcGlwZSwKKwkJCSB2b2lkICpwVHJhbnNmZXJCdWYsCisJCQkgaW50IEJ1ZlNpemUsIHVzYl9jb21wbGV0ZV90IENvbXBsZXRlLCB2b2lkICpwQ29udGV4dCkKIHsKIAotCXVzYl9maWxsX2J1bGtfdXJiKHBVcmIsIHBVc2JfRGV2LCBidWxrcGlwZSwgcFRyYW5zZmVyQnVmLCBCdWZTaXplLCAodXNiX2NvbXBsZXRlX3QpQ29tcGxldGUsIHBDb250ZXh0KTsKKwl1c2JfZmlsbF9idWxrX3VyYihwVXJiLCBwVXNiX0RldiwgYnVsa3BpcGUsIHBUcmFuc2ZlckJ1ZiwgQnVmU2l6ZSwKKwkJCSAgKHVzYl9jb21wbGV0ZV90KSBDb21wbGV0ZSwgcENvbnRleHQpOwogCiB9CiAKLVZPSUQJUlRVU0JJbml0VHhEZXNjKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBUWF9DT05URVhUCQlwVHhDb250ZXh0LAotCUlOCVVDSEFSCQkJQnVsa091dFBpcGVJZCwKLQlJTgl1c2JfY29tcGxldGVfdAlGdW5jKQordm9pZCBSVFVTQkluaXRUeERlc2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgIHN0cnVjdCBydF90eF9jb250ZXh0ICpwVHhDb250ZXh0LAorCQkgICAgIHU4IEJ1bGtPdXRQaXBlSWQsIElOIHVzYl9jb21wbGV0ZV90IEZ1bmMpCiB7Ci0JUFVSQgkJCQlwVXJiOwotCVBVQ0hBUgkJCQlwU3JjID0gTlVMTDsKLQlQT1NfQ09PS0lFCQkJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKwlQVVJCIHBVcmI7CisJdTggKnBTcmMgPSBOVUxMOworCXN0cnVjdCBvc19jb29raWUgKnBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOwogCiAJcFVyYiA9IHBUeENvbnRleHQtPnBVcmI7CiAJQVNTRVJUKHBVcmIpOwogCi0JLy8gU3RvcmUgQnVsa091dCBQaXBlSWQKKwkvKiBTdG9yZSBCdWxrT3V0IFBpcGVJZCAqLwogCXBUeENvbnRleHQtPkJ1bGtPdXRQaXBlSWQgPSBCdWxrT3V0UGlwZUlkOwogCi0JaWYgKHBUeENvbnRleHQtPmJBZ2dyZWdhdGlibGUpCi0JeworCWlmIChwVHhDb250ZXh0LT5iQWdncmVnYXRpYmxlKSB7CiAJCXBTcmMgPSAmcFR4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXItPkFnZ3JlZ2F0aW9uWzJdOwotCX0KLQllbHNlCi0JewotCQlwU3JjID0gKFBVQ0hBUikgcFR4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0OworCX0gZWxzZSB7CisJCXBTcmMgPQorCQkgICAgKHU4ICopcFR4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0OwogCX0KIAotCi0JLy9Jbml0aWFsaXplIGEgdHggYnVsayB1cmIKKwkvKkluaXRpYWxpemUgYSB0eCBidWxrIHVyYiAqLwogCVJUVVNCX0ZJTExfQlVMS19VUkIocFVyYiwKLQkJCQkJCXBPYmotPnBVc2JfRGV2LAotCQkJCQkJdXNiX3NuZGJ1bGtwaXBlKHBPYmotPnBVc2JfRGV2LCBwQWQtPkJ1bGtPdXRFcEFkZHJbQnVsa091dFBpcGVJZF0pLAotCQkJCQkJcFNyYywKLQkJCQkJCXBUeENvbnRleHQtPkJ1bGtPdXRTaXplLAotCQkJCQkJRnVuYywKLQkJCQkJCXBUeENvbnRleHQpOworCQkJICAgIHBPYmotPnBVc2JfRGV2LAorCQkJICAgIHVzYl9zbmRidWxrcGlwZShwT2JqLT5wVXNiX0RldiwKKwkJCQkJICAgIHBBZC0+QnVsa091dEVwQWRkcltCdWxrT3V0UGlwZUlkXSksCisJCQkgICAgcFNyYywgcFR4Q29udGV4dC0+QnVsa091dFNpemUsIEZ1bmMsIHBUeENvbnRleHQpOwogCiAJaWYgKHBUeENvbnRleHQtPmJBZ2dyZWdhdGlibGUpCi0JCXBVcmItPnRyYW5zZmVyX2RtYQk9IChwVHhDb250ZXh0LT5kYXRhX2RtYSArIFRYX0JVRkZFUl9OT1JNU0laRSArIDIpOworCQlwVXJiLT50cmFuc2Zlcl9kbWEgPQorCQkgICAgKHBUeENvbnRleHQtPmRhdGFfZG1hICsgVFhfQlVGRkVSX05PUk1TSVpFICsgMik7CiAJZWxzZQotCQlwVXJiLT50cmFuc2Zlcl9kbWEJPSBwVHhDb250ZXh0LT5kYXRhX2RtYTsKKwkJcFVyYi0+dHJhbnNmZXJfZG1hID0gcFR4Q29udGV4dC0+ZGF0YV9kbWE7CiAKIAlwVXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKIAogfQogCi1WT0lECVJUVVNCSW5pdEhUVHhEZXNjKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBIVF9UWF9DT05URVhUCXBUeENvbnRleHQsCi0JSU4JVUNIQVIJCQlCdWxrT3V0UGlwZUlkLAotCUlOCVVMT05HCQkJQnVsa091dFNpemUsCi0JSU4JdXNiX2NvbXBsZXRlX3QJRnVuYykKK3ZvaWQgUlRVU0JJbml0SFRUeERlc2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICAgc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBUeENvbnRleHQsCisJCSAgICAgICB1OCBCdWxrT3V0UGlwZUlkLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBCdWxrT3V0U2l6ZSwgSU4gdXNiX2NvbXBsZXRlX3QgRnVuYykKIHsKLQlQVVJCCQkJCXBVcmI7Ci0JUFVDSEFSCQkJCXBTcmMgPSBOVUxMOwotCVBPU19DT09LSUUJCQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCVBVUkIgcFVyYjsKKwl1OCAqcFNyYyA9IE5VTEw7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CiAKIAlwVXJiID0gcFR4Q29udGV4dC0+cFVyYjsKIAlBU1NFUlQocFVyYik7CiAKLQkvLyBTdG9yZSBCdWxrT3V0IFBpcGVJZAorCS8qIFN0b3JlIEJ1bGtPdXQgUGlwZUlkICovCiAJcFR4Q29udGV4dC0+QnVsa091dFBpcGVJZCA9IEJ1bGtPdXRQaXBlSWQ7CiAKLQlwU3JjID0gJnBUeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtwVHhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uXTsKKwlwU3JjID0KKwkgICAgJnBUeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtwVHhDb250ZXh0LT4KKwkJCQkJCQkgICAgICBOZXh0QnVsa091dFBvc2l0aW9uXTsKIAotCi0JLy9Jbml0aWFsaXplIGEgdHggYnVsayB1cmIKKwkvKkluaXRpYWxpemUgYSB0eCBidWxrIHVyYiAqLwogCVJUVVNCX0ZJTExfQlVMS19VUkIocFVyYiwKLQkJCQkJCXBPYmotPnBVc2JfRGV2LAotCQkJCQkJdXNiX3NuZGJ1bGtwaXBlKHBPYmotPnBVc2JfRGV2LCBwQWQtPkJ1bGtPdXRFcEFkZHJbQnVsa091dFBpcGVJZF0pLAotCQkJCQkJcFNyYywKLQkJCQkJCUJ1bGtPdXRTaXplLAotCQkJCQkJRnVuYywKLQkJCQkJCXBUeENvbnRleHQpOworCQkJICAgIHBPYmotPnBVc2JfRGV2LAorCQkJICAgIHVzYl9zbmRidWxrcGlwZShwT2JqLT5wVXNiX0RldiwKKwkJCQkJICAgIHBBZC0+QnVsa091dEVwQWRkcltCdWxrT3V0UGlwZUlkXSksCisJCQkgICAgcFNyYywgQnVsa091dFNpemUsIEZ1bmMsIHBUeENvbnRleHQpOwogCi0JcFVyYi0+dHJhbnNmZXJfZG1hCT0gKHBUeENvbnRleHQtPmRhdGFfZG1hICsgcFR4Q29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbik7CisJcFVyYi0+dHJhbnNmZXJfZG1hID0KKwkgICAgKHBUeENvbnRleHQtPmRhdGFfZG1hICsgcFR4Q29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbik7CiAJcFVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CiAKIH0KIAotVk9JRAlSVFVTQkluaXRSeERlc2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFJYX0NPTlRFWFQJCXBSeENvbnRleHQpCit2b2lkIFJUVVNCSW5pdFJ4RGVzYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9yeF9jb250ZXh0ICpwUnhDb250ZXh0KQogewotCVBVUkIJCQkJcFVyYjsKLQlQT1NfQ09PS0lFCQkJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQlVTE9ORwkJCQlSWF9idWxrX3NpemU7Ci0KKwlQVVJCIHBVcmI7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisJdW5zaWduZWQgbG9uZyBSWF9idWxrX3NpemU7CiAKIAlwVXJiID0gcFJ4Q29udGV4dC0+cFVyYjsKIAlBU1NFUlQocFVyYik7CiAKLQlpZiAoIHBBZC0+QnVsa0luTWF4UGFja2V0U2l6ZSA9PSA2NCkKKwlpZiAocEFkLT5CdWxrSW5NYXhQYWNrZXRTaXplID09IDY0KQogCQlSWF9idWxrX3NpemUgPSA0MDk2OwogCWVsc2UKIAkJUlhfYnVsa19zaXplID0gTUFYX1JYQlVMS19TSVpFOwogCi0JLy9Jbml0aWFsaXplIGEgcnggYnVsayB1cmIKKwkvKkluaXRpYWxpemUgYSByeCBidWxrIHVyYiAqLwogCVJUVVNCX0ZJTExfQlVMS19VUkIocFVyYiwKLQkJCQkJCXBPYmotPnBVc2JfRGV2LAotCQkJCQkJdXNiX3JjdmJ1bGtwaXBlKHBPYmotPnBVc2JfRGV2LCBwQWQtPkJ1bGtJbkVwQWRkciksCi0JCQkJCQkmKHBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyW3BBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb25dKSwKLQkJCQkJCVJYX2J1bGtfc2l6ZSAtIChwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uKSwKLQkJCQkJCSh1c2JfY29tcGxldGVfdClSVFVTQkJ1bGtSeENvbXBsZXRlLAotCQkJCQkJKHZvaWQgKilwUnhDb250ZXh0KTsKKwkJCSAgICBwT2JqLT5wVXNiX0RldiwKKwkJCSAgICB1c2JfcmN2YnVsa3BpcGUocE9iai0+cFVzYl9EZXYsIHBBZC0+QnVsa0luRXBBZGRyKSwKKwkJCSAgICAmKHBSeENvbnRleHQtPgorCQkJICAgICAgVHJhbnNmZXJCdWZmZXJbcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbl0pLAorCQkJICAgIFJYX2J1bGtfc2l6ZSAtIChwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uKSwKKwkJCSAgICAodXNiX2NvbXBsZXRlX3QpIFJUVVNCQnVsa1J4Q29tcGxldGUsCisJCQkgICAgKHZvaWQgKilwUnhDb250ZXh0KTsKIAotCXBVcmItPnRyYW5zZmVyX2RtYQk9IHBSeENvbnRleHQtPmRhdGFfZG1hICsgcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbjsKKwlwVXJiLT50cmFuc2Zlcl9kbWEgPSBwUnhDb250ZXh0LT5kYXRhX2RtYSArIHBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb247CiAJcFVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CiAKLQogfQogCiAvKgpAQCAtMTg4LDE3NyArMTc5LDIxNSBAQAogCQlpZigxIC8qIShpbl9pbnRlcnJ1cHQoKSAmIDB4ZmZmZjAwMDApKi8pCVwKIAkJCVJUTVBfSVJRX1VOTE9DSygocExvY2spLCBJcnFGbGFncyk7CiAKLQotVk9JRAlSVFVTQkJ1bGtPdXREYXRhUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJQnVsa091dFBpcGVJZCwKLQlJTglVQ0hBUgkJCUluZGV4KQordm9pZCBSVFVTQkJ1bGtPdXREYXRhUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICB1OCBCdWxrT3V0UGlwZUlkLCB1OCBJbmRleCkKIHsKIAotCVBIVF9UWF9DT05URVhUCXBIVFRYQ29udGV4dDsKLQlQVVJCCQkJcFVyYjsKLQlpbnQJCQkJcmV0ID0gMDsKLQlQVFhJTkZPX1NUUlVDCXBUeEluZm8sIHBMYXN0VHhJbmZvID0gTlVMTDsKLQlQVFhXSV9TVFJVQyAgICAgICAgICAgICBwVHhXSTsKLQlVTE9ORwkJCVRtcEJ1bGtFbmRQb3MsIFRoaXNCdWxrU2l6ZTsKLQl1bnNpZ25lZCBsb25nCUlycUZsYWdzID0gMCwgSXJxRmxhZ3MyID0gMDsKLQlQVUNIQVIJCQlwV2lyZWxlc3NQa3QsIHBBcHBlbmRhbnQ7Ci0JQk9PTEVBTgkJCWJUeFFMYXN0Um91bmQgPSBGQUxTRTsKLQlVQ0hBUgkJCWFsbHplcm9bNF09IHsweDAsMHgwLDB4MCwweDB9OworCXN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQ7CisJUFVSQiBwVXJiOworCWludCByZXQgPSAwOworCXN0cnVjdCBydF90eGluZm8gKnBUeEluZm8sICpwTGFzdFR4SW5mbyA9IE5VTEw7CisJc3RydWN0IHJ0X3R4d2kgKiBwVHhXSTsKKwl1bnNpZ25lZCBsb25nIFRtcEJ1bGtFbmRQb3MsIFRoaXNCdWxrU2l6ZTsKKwl1bnNpZ25lZCBsb25nIElycUZsYWdzID0gMCwgSXJxRmxhZ3MyID0gMDsKKwl1OCAqcFdpcmVsZXNzUGt0LCAqcEFwcGVuZGFudDsKKwlCT09MRUFOIGJUeFFMYXN0Um91bmQgPSBGQUxTRTsKKwl1OCBhbGx6ZXJvWzRdID0geyAweDAsIDB4MCwgMHgwLCAweDAgfTsKIAogCUJVTEtfT1VUX0xPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKLQlpZiAoKHBBZC0+QnVsa091dFBlbmRpbmdbQnVsa091dFBpcGVJZF0gPT0gVFJVRSkgfHwgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9UWCkpCi0JeworCWlmICgocEFkLT5CdWxrT3V0UGVuZGluZ1tCdWxrT3V0UGlwZUlkXSA9PSBUUlVFKQorCSAgICB8fCBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTkVFRF9TVE9QX1RYKSkgewogCQlCVUxLX09VVF9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKIAkJcmV0dXJuOwogCX0KIAlwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID0gVFJVRTsKIAogCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpCi0JCSkKLQl7CisJICAgICkgewogCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID0gRkFMU0U7CiAJCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOwogCQlyZXR1cm47CiAJfQogCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOwogCi0KIAlwSFRUWENvbnRleHQgPSAmKHBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdKTsKIAogCUJVTEtfT1VUX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFnczIpOwotCWlmICgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pCi0JCXx8ICgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbi04KSA9PSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKQotCXsKLQkJQlVMS19PVVRfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MyKTsKKwlpZiAoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPT0KKwkgICAgIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikKKwkgICAgfHwgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uIC0gOCkgPT0KKwkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSkgeworCQlCVUxLX09VVF9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLAorCQkJCUlycUZsYWdzMik7CiAKIAkJQlVMS19PVVRfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOwogCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID0gRkFMU0U7CiAKLQkJLy8gQ2xlYXIgRGF0YSBmbGFnCi0JCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsIChmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHIDw8IEJ1bGtPdXRQaXBlSWQpKTsKLQkJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBCdWxrT3V0UGlwZUlkKSk7CisJCS8qIENsZWFyIERhdGEgZmxhZyAqLworCQlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLAorCQkJCSAgICAgIChmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHIDw8CisJCQkJICAgICAgIEJ1bGtPdXRQaXBlSWQpKTsKKwkJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwKKwkJCQkgICAgICAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8CisJCQkJICAgICAgIEJ1bGtPdXRQaXBlSWQpKTsKIAogCQlCVUxLX09VVF9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKIAkJcmV0dXJuOwogCX0KKwkvKiBDbGVhciBEYXRhIGZsYWcgKi8KKwlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLAorCQkJICAgICAgKGZSVFVTQl9CVUxLX09VVF9EQVRBX0ZSQUcgPDwgQnVsa091dFBpcGVJZCkpOworCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsCisJCQkgICAgICAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IEJ1bGtPdXRQaXBlSWQpKTsKIAotCS8vIENsZWFyIERhdGEgZmxhZwotCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsIChmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHIDw8IEJ1bGtPdXRQaXBlSWQpKTsKLQlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IEJ1bGtPdXRQaXBlSWQpKTsKLQotCS8vREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCdWxrT3V0LUI6ST0weCVseCwgQ1dQb3M9JWxkLCBDV1JQb3M9JWxkLCBOQlBvcz0lbGQsIEVOQlBvcz0lbGQsIGJDb3B5PSVkIVxuIiwgaW5faW50ZXJydXB0KCksCi0JLy8JCQkJCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcywgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLAotCS8vCQkJCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkKSk7CisJLypEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJ1bGtPdXQtQjpJPTB4JWx4LCBDV1Bvcz0lbGQsIENXUlBvcz0lbGQsIE5CUG9zPSVsZCwgRU5CUG9zPSVsZCwgYkNvcHk9JWQhXG4iLCBpbl9pbnRlcnJ1cHQoKSwgKi8KKwkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MsIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwgKi8KKwkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkKSk7ICovCiAJcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uID0gcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbjsKIAlUaGlzQnVsa1NpemUgPSAwOwogCVRtcEJ1bGtFbmRQb3MgPSBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb247CiAJcFdpcmVsZXNzUGt0ID0gJnBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0WzBdOwogCi0JaWYgKChwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCA9PSBUUlVFKSkKLQl7Ci0JCWlmIChSVE1QRXF1YWxNZW1vcnkocEhUVFhDb250ZXh0LT5TYXZlZFBhZCwgYWxsemVybyw0KSkKLQkJewotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiZTEsIGFsbHplcm8gOiAleCAgJXggICV4ICAleCAgJXggICV4ICAleCAgJXggXG4iLAotCQkJCXBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMF0sIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMV0sIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMl0scEhUVFhDb250ZXh0LT5TYXZlZFBhZFszXQotCQkJCSxwSFRUWENvbnRleHQtPlNhdmVkUGFkWzRdLCBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzVdLCBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzZdLHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbN10pKTsKKwlpZiAoKHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkID09IFRSVUUpKSB7CisJCWlmIChSVE1QRXF1YWxNZW1vcnkocEhUVFhDb250ZXh0LT5TYXZlZFBhZCwgYWxsemVybywgNCkpIHsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwKKwkJCQkgICAgICgiZTEsIGFsbHplcm8gOiAleCAgJXggICV4ICAleCAgJXggICV4ICAleCAgJXggXG4iLAorCQkJCSAgICAgIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMF0sCisJCQkJICAgICAgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFsxXSwKKwkJCQkgICAgICBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzJdLAorCQkJCSAgICAgIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbM10KKwkJCQkgICAgICAsIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbNF0sCisJCQkJICAgICAgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFs1XSwKKwkJCQkgICAgICBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzZdLAorCQkJCSAgICAgIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbN10pKTsKIAkJfQotCQlOZGlzTW92ZU1lbW9yeSgmcFdpcmVsZXNzUGt0W1RtcEJ1bGtFbmRQb3NdLCBwSFRUWENvbnRleHQtPlNhdmVkUGFkLCA4KTsKKwkJTmRpc01vdmVNZW1vcnkoJnBXaXJlbGVzc1BrdFtUbXBCdWxrRW5kUG9zXSwKKwkJCSAgICAgICBwSFRUWENvbnRleHQtPlNhdmVkUGFkLCA4KTsKIAkJcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQgPSBGQUxTRTsKIAkJaWYgKHBBZC0+YkZvcmNlUHJpbnRUWCA9PSBUUlVFKQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVFVTQkJ1bGtPdXREYXRhUGFja2V0IC0tPiBDT1BZIFBBRC4gQ3VyV3JpdGUgPSAlbGQsIE5leHRCdWxrID0gJWxkLiAgIEVOZXh0QnVsayA9ICVsZC5cbiIsICAgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24pKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlJUVVNCQnVsa091dERhdGFQYWNrZXQgLS0+IENPUFkgUEFELiBDdXJXcml0ZSA9ICVsZCwgTmV4dEJ1bGsgPSAlbGQuICAgRU5leHRCdWxrID0gJWxkLlxuIiwKKwkJCQkgIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwKKwkJCQkgIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwKKwkJCQkgIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24pKTsKIAl9CiAKLQlkbwotCXsKLQkJcFR4SW5mbyA9IChQVFhJTkZPX1NUUlVDKSZwV2lyZWxlc3NQa3RbVG1wQnVsa0VuZFBvc107Ci0JCXBUeFdJID0gKFBUWFdJX1NUUlVDKSZwV2lyZWxlc3NQa3RbVG1wQnVsa0VuZFBvcyArIFRYSU5GT19TSVpFXTsKKwlkbyB7CisJCXBUeEluZm8gPSAoc3RydWN0IHJ0X3R4aW5mbyAqKSYgcFdpcmVsZXNzUGt0W1RtcEJ1bGtFbmRQb3NdOworCQlwVHhXSSA9CisJCSAgICAoc3RydWN0IHJ0X3R4d2kgKikgJiBwV2lyZWxlc3NQa3RbVG1wQnVsa0VuZFBvcyArIFRYSU5GT19TSVpFXTsKIAogCQlpZiAocEFkLT5iRm9yY2VQcmludFRYID09IFRSVUUpCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVFVTQkJ1bGtPdXREYXRhUGFja2V0IEFNUERVID0gJWQuXG4iLCAgIHBUeFdJLT5BTVBEVSkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiUlRVU0JCdWxrT3V0RGF0YVBhY2tldCBBTVBEVSA9ICVkLlxuIiwKKwkJCQkgIHBUeFdJLT5BTVBEVSkpOwogCi0JCS8vIGFkZCBieSBJdmVyc29uLCBsaW1pdCBCdWxrT3V0IHNpemUgdG8gNGsgdG8gcGFzcyBXTU0gYiBtb2RlIDJUMVIgdGVzdCBpdGVtcwotCQkvL2lmICgoVGhpc0J1bGtTaXplICE9IDApICAmJiAocFR4V0ktPkFNUERVID09IDApKQotCQlpZiAoKFRoaXNCdWxrU2l6ZSAhPSAwKSAmJiAocFR4V0ktPlBIWU1PREUgPT0gTU9ERV9DQ0spKQotCQl7Ci0JCQlpZiAoKChUaGlzQnVsa1NpemUmMHhmZmZmODAwMCkgIT0gMCkgfHwgKChUaGlzQnVsa1NpemUmMHgxMDAwKSA9PSAweDEwMDApKQotCQkJewotCQkJCS8vIExpbWl0IEJ1bGtPdXQgc2l6ZSB0byBhYm91dCA0ayBieXRlcy4KLQkJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID0gVG1wQnVsa0VuZFBvczsKKwkJLyogYWRkIGJ5IEl2ZXJzb24sIGxpbWl0IEJ1bGtPdXQgc2l6ZSB0byA0ayB0byBwYXNzIFdNTSBiIG1vZGUgMlQxUiB0ZXN0IGl0ZW1zICovCisJCS8qaWYgKChUaGlzQnVsa1NpemUgIT0gMCkgICYmIChwVHhXSS0+QU1QRFUgPT0gMCkpICovCisJCWlmICgoVGhpc0J1bGtTaXplICE9IDApICYmIChwVHhXSS0+UEhZTU9ERSA9PSBNT0RFX0NDSykpIHsKKwkJCWlmICgoKFRoaXNCdWxrU2l6ZSAmIDB4ZmZmZjgwMDApICE9IDApCisJCQkgICAgfHwgKChUaGlzQnVsa1NpemUgJiAweDEwMDApID09IDB4MTAwMCkpIHsKKwkJCQkvKiBMaW1pdCBCdWxrT3V0IHNpemUgdG8gYWJvdXQgNGsgYnl0ZXMuICovCisJCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9CisJCQkJICAgIFRtcEJ1bGtFbmRQb3M7CiAJCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmICgoKHBBZC0+QnVsa091dE1heFBhY2tldFNpemUgPCA1MTIpICYmICgoVGhpc0J1bGtTaXplJjB4ZmZmZmY4MDApICE9IDApICkgLyp8fCAoIChUaGlzQnVsa1NpemUgIT0gMCkgICYmIChwVHhXSS0+QU1QRFUgPT0gMCkpKi8pCi0JCQl7Ci0JCQkJLy8gRm9yIFVTQiAxLjEgb3IgcGVlciB3aGljaCBkaWRuJ3Qgc3VwcG9ydCBBTVBEVSwgbGltaXQgdGhlIEJ1bGtPdXQgc2l6ZS4KLQkJCQkvLyBGb3IgcGVyZm9ybWVuY2UgaW4gYi9nIG1vZGUsIG5vdyBqdXN0IGNoZWNrIGZvciBVU0IgMS4xIGFuZCBkaWRuJ3QgY2FyZSBhYm91dCB0aGUgQVBNRFUgb3Igbm90ISAyMDA4LzA2LzA0LgotCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPSBUbXBCdWxrRW5kUG9zOworCQkJfSBlbHNlCisJCQkgICAgaWYgKCgocEFkLT5CdWxrT3V0TWF4UGFja2V0U2l6ZSA8IDUxMikKKwkJCQkgJiYgKChUaGlzQnVsa1NpemUgJiAweGZmZmZmODAwKSAhPQorCQkJCSAgICAgMCkpCisJCQkJLyp8fCAoIChUaGlzQnVsa1NpemUgIT0gMCkgICYmIChwVHhXSS0+QU1QRFUgPT0gMCkpICovCisJCQkJKSB7CisJCQkJLyogRm9yIFVTQiAxLjEgb3IgcGVlciB3aGljaCBkaWRuJ3Qgc3VwcG9ydCBBTVBEVSwgbGltaXQgdGhlIEJ1bGtPdXQgc2l6ZS4gKi8KKwkJCQkvKiBGb3IgcGVyZm9ybWVuY2UgaW4gYi9nIG1vZGUsIG5vdyBqdXN0IGNoZWNrIGZvciBVU0IgMS4xIGFuZCBkaWRuJ3QgY2FyZSBhYm91dCB0aGUgQVBNRFUgb3Igbm90ISAyMDA4LzA2LzA0LiAqLworCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPQorCQkJCSAgICBUbXBCdWxrRW5kUG9zOwogCQkJCWJyZWFrOwogCQkJfQogCQl9Ci0JCS8vIGVuZCBJdmVyc29uCi0JCWVsc2UKLQkJewotCQkJaWYgKCgoVGhpc0J1bGtTaXplJjB4ZmZmZjgwMDApICE9IDApIHx8ICgoVGhpc0J1bGtTaXplJjB4NjAwMCkgPT0gMHg2MDAwKSkKLQkJCXsJLy8gTGltaXQgQnVsa091dCBzaXplIHRvIGFib3V0IDI0ayBieXRlcy4KLQkJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID0gVG1wQnVsa0VuZFBvczsKKwkJLyogZW5kIEl2ZXJzb24gKi8KKwkJZWxzZSB7CisJCQlpZiAoKChUaGlzQnVsa1NpemUgJiAweGZmZmY4MDAwKSAhPSAwKSB8fCAoKFRoaXNCdWxrU2l6ZSAmIDB4NjAwMCkgPT0gMHg2MDAwKSkgewkvKiBMaW1pdCBCdWxrT3V0IHNpemUgdG8gYWJvdXQgMjRrIGJ5dGVzLiAqLworCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPQorCQkJCSAgICBUbXBCdWxrRW5kUG9zOwogCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZiAoKChwQWQtPkJ1bGtPdXRNYXhQYWNrZXRTaXplIDwgNTEyKSAmJiAoKFRoaXNCdWxrU2l6ZSYweGZmZmZmODAwKSAhPSAwKSApIC8qfHwgKCAoVGhpc0J1bGtTaXplICE9IDApICAmJiAocFR4V0ktPkFNUERVID09IDApKSovKQotCQkJewkvLyBGb3IgVVNCIDEuMSBvciBwZWVyIHdoaWNoIGRpZG4ndCBzdXBwb3J0IEFNUERVLCBsaW1pdCB0aGUgQnVsa091dCBzaXplLgotCQkJCS8vIEZvciBwZXJmb3JtZW5jZSBpbiBiL2cgbW9kZSwgbm93IGp1c3QgY2hlY2sgZm9yIFVTQiAxLjEgYW5kIGRpZG4ndCBjYXJlIGFib3V0IHRoZSBBUE1EVSBvciBub3QhIDIwMDgvMDYvMDQuCi0JCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9IFRtcEJ1bGtFbmRQb3M7CisJCQl9IGVsc2UgaWYgKCgocEFkLT5CdWxrT3V0TWF4UGFja2V0U2l6ZSA8IDUxMikgJiYgKChUaGlzQnVsa1NpemUgJiAweGZmZmZmODAwKSAhPSAwKSkgLyp8fCAoIChUaGlzQnVsa1NpemUgIT0gMCkgICYmIChwVHhXSS0+QU1QRFUgPT0gMCkpICovICkgewkvKiBGb3IgVVNCIDEuMSBvciBwZWVyIHdoaWNoIGRpZG4ndCBzdXBwb3J0IEFNUERVLCBsaW1pdCB0aGUgQnVsa091dCBzaXplLiAqLworCQkJCS8qIEZvciBwZXJmb3JtZW5jZSBpbiBiL2cgbW9kZSwgbm93IGp1c3QgY2hlY2sgZm9yIFVTQiAxLjEgYW5kIGRpZG4ndCBjYXJlIGFib3V0IHRoZSBBUE1EVSBvciBub3QhIDIwMDgvMDYvMDQuICovCisJCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9CisJCQkJICAgIFRtcEJ1bGtFbmRQb3M7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAotCQlpZiAoVG1wQnVsa0VuZFBvcyA9PSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pCi0JCXsKKwkJaWYgKFRtcEJ1bGtFbmRQb3MgPT0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSB7CiAJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID0gVG1wQnVsa0VuZFBvczsKIAkJCWJyZWFrOwogCQl9CiAKLQkJLy9QUyBwYWNrZXRzIHVzZSBIQ0NBIHF1ZXVlIHdoZW4gZGVxdWV1ZSBmcm9tIFBTIHVuaWNhc3QgcXVldWUgKFdpRmkgV1BBMiBNQTlfRFQxIGZvciBNYXJ2ZWxsIEIgU1RBKQotCQlpZiAocFR4SW5mby0+UVNFTCAhPSBGSUZPX0VEQ0EpCi0JCXsKLQkJCXByaW50aygiJXMoKTogPT09PT4gcFR4SW5mby0+UXVldWVTZWwoJWQpIT0gRklGT19FRENBISEhIVxuIiwgX19mdW5jX18sIHBUeEluZm8tPlFTRUwpOwotCQkJcHJpbnRrKCJcdENXUG9zPSVsZCwgTkJQb3M9JWxkLCBFTkJQb3M9JWxkLCBiQ29weT0lZCFcbiIsIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCk7Ci0JCQloZXhfZHVtcCgiV3JvbmcgUVNlbCBQa3Q6IiwgKFBVQ0hBUikmcFdpcmVsZXNzUGt0W1RtcEJ1bGtFbmRQb3NdLCAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uIC0gcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSk7CisJCWlmIChwVHhJbmZvLT5RU0VMICE9IEZJRk9fRURDQSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiJXMoKTogPT09PT4gcFR4SW5mby0+UXVldWVTZWwoJWQpIT0gRklGT19FRENBISEhIVxuIiwKKwkJCQkgIF9fRlVOQ1RJT05fXywgcFR4SW5mby0+UVNFTCkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiXHRDV1Bvcz0lbGQsIE5CUG9zPSVsZCwgRU5CUG9zPSVsZCwgYkNvcHk9JWQhXG4iLAorCQkJCSAgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLAorCQkJCSAgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLAorCQkJCSAgcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiwKKwkJCQkgIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkKSk7CisJCQloZXhfZHVtcCgiV3JvbmcgUVNlbCBQa3Q6IiwKKwkJCQkgKHU4ICopJiBwV2lyZWxlc3NQa3RbVG1wQnVsa0VuZFBvc10sCisJCQkJIChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gLQorCQkJCSAgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSk7CiAJCX0KIAotCQlpZiAocFR4SW5mby0+VVNCRE1BVHhQa3RMZW4gPD0gOCkKLQkJewotCQkJQlVMS19PVVRfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MyKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SIC8qUlRfREVCVUdfVFJBQ0UqLywoImUyLCBVU0JETUFUeFBrdExlbj09MCwgU2l6ZT0lbGQsIGJDU1BhZD0lZCwgQ1dQb3M9JWxkLCBOQlBvcz0lbGQsIENXUlBvcz0lbGQhXG4iLAotCQkJCQlwSFRUWENvbnRleHQtPkJ1bGtPdXRTaXplLCBwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zKSk7CisJCWlmIChwVHhJbmZvLT5VU0JETUFUeFBrdExlbiA8PSA4KSB7CisJCQlCVUxLX09VVF9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLAorCQkJCQlJcnFGbGFnczIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IgLypSVF9ERUJVR19UUkFDRSAqLyAsCisJCQkJICgiZTIsIFVTQkRNQVR4UGt0TGVuPT0wLCBTaXplPSVsZCwgYkNTUGFkPSVkLCBDV1Bvcz0lbGQsIE5CUG9zPSVsZCwgQ1dSUG9zPSVsZCFcbiIsCisJCQkJICBwSFRUWENvbnRleHQtPkJ1bGtPdXRTaXplLAorCQkJCSAgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQsCisJCQkJICBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sCisJCQkJICBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sCisJCQkJICBwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcykpOwogCQkJewotCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiAvKlJUX0RFQlVHX1RSQUNFKi8sKCIleCAgJXggICV4ICAleCAgJXggICV4ICAleCAgJXggXG4iLAotCQkJCQlwSFRUWENvbnRleHQtPlNhdmVkUGFkWzBdLCBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzFdLCBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzJdLHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbM10KLQkJCQkJLHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbNF0sIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbNV0sIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbNl0scEhUVFhDb250ZXh0LT5TYXZlZFBhZFs3XSkpOworCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiAvKlJUX0RFQlVHX1RSQUNFICovCisJCQkJCSAgICAgLAorCQkJCQkgICAgICgiJXggICV4ICAleCAgJXggICV4ICAleCAgJXggICV4IFxuIiwKKwkJCQkJICAgICAgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFswXSwKKwkJCQkJICAgICAgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFsxXSwKKwkJCQkJICAgICAgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFsyXSwKKwkJCQkJICAgICAgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFszXQorCQkJCQkgICAgICAsIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbNF0sCisJCQkJCSAgICAgIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbNV0sCisJCQkJCSAgICAgIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbNl0sCisJCQkJCSAgICAgIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbN10pKTsKIAkJCX0KIAkJCXBBZC0+YkZvcmNlUHJpbnRUWCA9IFRSVUU7Ci0JCQlCVUxLX09VVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJCQlCVUxLX09VVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLAorCQkJCSAgICAgIElycUZsYWdzKTsKIAkJCXBBZC0+QnVsa091dFBlbmRpbmdbQnVsa091dFBpcGVJZF0gPSBGQUxTRTsKLQkJCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOwotCQkJLy9EQkdQUklOVChSVF9ERUJVR19MT1VELCgiT3V0OnBUeEluZm8tPlVTQkRNQVR4UGt0TGVuPSVkIVxuIiwgcFR4SW5mby0+VVNCRE1BVHhQa3RMZW4pKTsKKwkJCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwKKwkJCQkJSXJxRmxhZ3MpOworCQkJLypEQkdQUklOVChSVF9ERUJVR19MT1VELCgiT3V0OnBUeEluZm8tPlVTQkRNQVR4UGt0TGVuPSVkIVxuIiwgcFR4SW5mby0+VVNCRE1BVHhQa3RMZW4pKTsgKi8KIAkJCXJldHVybjsKIAkJfQotCi0JCQkvLyBJbmNyZWFzZSBUb3RhbCB0cmFuc21pdCBieXRlIGNvdW50ZXIKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUcmFuc21pdHRlZEJ5dGVDb3VudCArPSAgcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudDsKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudCArPSAgcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudDsKKwkJLyogSW5jcmVhc2UgVG90YWwgdHJhbnNtaXQgYnl0ZSBjb3VudGVyICovCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0KKwkJICAgIHBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0KKwkJICAgIHBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQ7CiAKIAkJcExhc3RUeEluZm8gPSBwVHhJbmZvOwogCi0JCS8vIE1ha2Ugc3VyZSB3ZSB1c2UgRURDQSBRVUVVRS4KLQkJcFR4SW5mby0+UVNFTCA9IEZJRk9fRURDQTsgIC8vUFMgcGFja2V0cyB1c2UgSENDQSBxdWV1ZSB3aGVuIGRlcXVldWUgZnJvbSBQUyB1bmljYXN0IHF1ZXVlIChXaUZpIFdQQTIgTUE5X0RUMSBmb3IgTWFydmVsbCBCIFNUQSkKLQkJVGhpc0J1bGtTaXplICs9IChwVHhJbmZvLT5VU0JETUFUeFBrdExlbis0KTsKLQkJVG1wQnVsa0VuZFBvcyArPSAocFR4SW5mby0+VVNCRE1BVHhQa3RMZW4rNCk7CisJCS8qIE1ha2Ugc3VyZSB3ZSB1c2UgRURDQSBRVUVVRS4gKi8KKwkJcFR4SW5mby0+UVNFTCA9IEZJRk9fRURDQTsKKwkJVGhpc0J1bGtTaXplICs9IChwVHhJbmZvLT5VU0JETUFUeFBrdExlbiArIDQpOworCQlUbXBCdWxrRW5kUG9zICs9IChwVHhJbmZvLT5VU0JETUFUeFBrdExlbiArIDQpOwogCiAJCWlmIChUbXBCdWxrRW5kUG9zICE9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikKIAkJCXBUeEluZm8tPlVTQkRNQU5leHRWTEQgPSAxOwogCi0JCWlmIChwVHhJbmZvLT5Td1VzZUxhc3RSb3VuZCA9PSAxKQotCQl7CisJCWlmIChwVHhJbmZvLT5Td1VzZUxhc3RSb3VuZCA9PSAxKSB7CiAJCQlpZiAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID09IDgpCiAJCQkJcFR4SW5mby0+VVNCRE1BTmV4dFZMRCA9IDA7CiAJCQlwVHhJbmZvLT5Td1VzZUxhc3RSb3VuZCA9IDA7CkBAIC0zNjgsNjggKzM5Nyw4OCBAQAogCiAJCQlicmVhazsKIAkJfQotCX13aGlsZSAoVFJVRSk7CiAKLQkvLyBhZGp1c3QgdGhlIHBUeEluZm8tPlVTQkRNQU5leHRWTEQgdmFsdWUgb2YgbGFzdCBwVHhJbmZvLgotCWlmIChwTGFzdFR4SW5mbykKLQl7CisJfSB3aGlsZSAoVFJVRSk7CisKKwkvKiBhZGp1c3QgdGhlIHBUeEluZm8tPlVTQkRNQU5leHRWTEQgdmFsdWUgb2YgbGFzdCBwVHhJbmZvLiAqLworCWlmIChwTGFzdFR4SW5mbykgewogCQlwTGFzdFR4SW5mby0+VVNCRE1BTmV4dFZMRCA9IDA7CiAJfQogCiAJLyoKLQkJV2UgbmVlZCB0byBjb3B5IFNhdmVkUGFkIHdoZW4gZm9sbG93aW5nIGNvbmRpdGlvbiBtYXRjaGVkIQotCQkJMS4gTm90IHRoZSBsYXN0IHJvdW5kIG9mIHRoZSBUeFF1ZXVlIGFuZAotCQkJMi4gYW55IG1hdGNoIG9mIGZvbGxvd2luZyBjYXNlczoKLQkJCQkoMSkuIFRoZSBFbmQgUG9zaXRpb24gb2YgdGhpcyBidWxrIG91dCBpcyByZWFjaCB0byB0aGUgQ3VycmVuY3QgV3JpdGUgcG9zaXRpb24gYW5kCi0JCQkJCQl0aGUgVHhJbmZvIGFuZCByZWxhdGVkIGhlYWRlciBhbHJlYWR5IHdyaXRlIHRvIHRoZSBDdXJXcml0ZVBvc2l0aW9uLgotCQkJICAgCQk9PihFTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PSBDdXJXcml0ZVBvc2l0aW9uKSAmJiAoQ3VyV3JpdGVSZWFsUG9zID4gQ3VyV3JpdGVQb3NpdGlvbikKKwkgICBXZSBuZWVkIHRvIGNvcHkgU2F2ZWRQYWQgd2hlbiBmb2xsb3dpbmcgY29uZGl0aW9uIG1hdGNoZWQhCisJICAgMS4gTm90IHRoZSBsYXN0IHJvdW5kIG9mIHRoZSBUeFF1ZXVlIGFuZAorCSAgIDIuIGFueSBtYXRjaCBvZiBmb2xsb3dpbmcgY2FzZXM6CisJICAgKDEpLiBUaGUgRW5kIFBvc2l0aW9uIG9mIHRoaXMgYnVsayBvdXQgaXMgcmVhY2ggdG8gdGhlIEN1cnJlbmN0IFdyaXRlIHBvc2l0aW9uIGFuZAorCSAgIHRoZSBUeEluZm8gYW5kIHJlbGF0ZWQgaGVhZGVyIGFscmVhZHkgd3JpdGUgdG8gdGhlIEN1cldyaXRlUG9zaXRpb24uCisJICAgPT4oRU5leHRCdWxrT3V0UG9zaXRpb24gPT0gQ3VyV3JpdGVQb3NpdGlvbikgJiYgKEN1cldyaXRlUmVhbFBvcyA+IEN1cldyaXRlUG9zaXRpb24pCiAKLQkJCQkoMikuIFRoZSBFbmRQb3NpdGlvbiBvZiB0aGUgYnVsayBvdXQgaXMgbm90IHJlYWNoIHRvIHRoZSBDdXJyZW50IFdyaXRlIFBvc2l0aW9uLgotCQkJCQk9PihFTmV4dEJ1bGtPdXRQb3NpdGlvbiAhPSBDdXJXcml0ZVBvc2l0aW9uKQotCSovCisJICAgKDIpLiBUaGUgRW5kUG9zaXRpb24gb2YgdGhlIGJ1bGsgb3V0IGlzIG5vdCByZWFjaCB0byB0aGUgQ3VycmVudCBXcml0ZSBQb3NpdGlvbi4KKwkgICA9PihFTmV4dEJ1bGtPdXRQb3NpdGlvbiAhPSBDdXJXcml0ZVBvc2l0aW9uKQorCSAqLwogCWlmICgoYlR4UUxhc3RSb3VuZCA9PSBGQUxTRSkgJiYKLQkJICgoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPT0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSAmJiAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgPiBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKSB8fAotCQkgIChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICE9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikpCi0JCSkKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBIVFRYQ29udGV4dC0+U2F2ZWRQYWQsICZwV2lyZWxlc3NQa3RbcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbl0sIDgpOworCSAgICAoKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID09CisJICAgICAgIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikKKwkgICAgICAmJiAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgPgorCQkgIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikpCisJICAgICB8fCAocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiAhPQorCQkgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSkKKwkgICAgKSB7CisJCU5kaXNNb3ZlTWVtb3J5KHBIVFRYQ29udGV4dC0+U2F2ZWRQYWQsCisJCQkgICAgICAgJnBXaXJlbGVzc1BrdFtwSFRUWENvbnRleHQtPgorCQkJCQkgICAgIEVOZXh0QnVsa091dFBvc2l0aW9uXSwgOCk7CiAJCXBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkID0gVFJVRTsKLQkJaWYgKFJUTVBFcXVhbE1lbW9yeShwSFRUWENvbnRleHQtPlNhdmVkUGFkLCBhbGx6ZXJvLDQpKQotCQl7Ci0JCQlQVUNIQVIJcEJ1ZiA9ICZwSFRUWENvbnRleHQtPlNhdmVkUGFkWzBdOwotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiV0FSTklORy1aZXJvLTM6JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngsQ1dQb3M9JWxkLCBDV1JQb3M9JWxkLCBiQ1c9JWQsIE5CUG9zPSVsZCwgVEJQb3M9JWxkLCBUQlNpemU9JWxkXG4iLAotCQkJCXBCdWZbMF0sIHBCdWZbMV0sIHBCdWZbMl0scEJ1ZlszXSxwQnVmWzRdLCBwQnVmWzVdLCBwQnVmWzZdLHBCdWZbN10sIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MsCi0JCQkJcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZywgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLCBUbXBCdWxrRW5kUG9zLCBUaGlzQnVsa1NpemUpKTsKKwkJaWYgKFJUTVBFcXVhbE1lbW9yeShwSFRUWENvbnRleHQtPlNhdmVkUGFkLCBhbGx6ZXJvLCA0KSkgeworCQkJdTggKnBCdWYgPSAmcEhUVFhDb250ZXh0LT5TYXZlZFBhZFswXTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwKKwkJCQkgICAgICgiV0FSTklORy1aZXJvLTM6JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngsQ1dQb3M9JWxkLCBDV1JQb3M9JWxkLCBiQ1c9JWQsIE5CUG9zPSVsZCwgVEJQb3M9JWxkLCBUQlNpemU9JWxkXG4iLAorCQkJCSAgICAgIHBCdWZbMF0sIHBCdWZbMV0sIHBCdWZbMl0sIHBCdWZbM10sCisJCQkJICAgICAgcEJ1Zls0XSwgcEJ1Zls1XSwgcEJ1Zls2XSwgcEJ1Zls3XSwKKwkJCQkgICAgICBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sCisJCQkJICAgICAgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MsCisJCQkJICAgICAgcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZywKKwkJCQkgICAgICBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sCisJCQkJICAgICAgVG1wQnVsa0VuZFBvcywgVGhpc0J1bGtTaXplKSk7CiAKIAkJCXBCdWYgPSAmcFdpcmVsZXNzUGt0W3BIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbl07Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJcdENXUG9zPSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLCBwQnVmWzBdLCBwQnVmWzFdLCBwQnVmWzJdLHBCdWZbM10scEJ1Zls0XSwgcEJ1Zls1XSwgcEJ1Zls2XSxwQnVmWzddKSk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsCisJCQkJICAgICAoIlx0Q1dQb3M9JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCisJCQkJICAgICAgcEJ1ZlswXSwgcEJ1ZlsxXSwgcEJ1ZlsyXSwgcEJ1ZlszXSwKKwkJCQkgICAgICBwQnVmWzRdLCBwQnVmWzVdLCBwQnVmWzZdLCBwQnVmWzddKSk7CiAJCX0KLQkJLy9EQkdQUklOVChSVF9ERUJVR19MT1VELCgiRU5Qb3M9PUNXUG9zPSVsZCwgQ1dSUG9zPSVsZCwgYkNTUGFkPSVkIVxuIiwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcywgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQpKTsKKwkJLypEQkdQUklOVChSVF9ERUJVR19MT1VELCgiRU5Qb3M9PUNXUG9zPSVsZCwgQ1dSUG9zPSVsZCwgYkNTUGFkPSVkIVxuIiwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcywgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQpKTsgKi8KIAl9CiAKIAlpZiAocEFkLT5iRm9yY2VQcmludFRYID09IFRSVUUpCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQnVsa091dC1BOlNpemU9JWxkLCBDV1Bvcz0lbGQsIE5CUG9zPSVsZCwgRU5CUG9zPSVsZCwgYkNvcHk9JWQhXG4iLCBUaGlzQnVsa1NpemUsIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCkpOwotCS8vREJHUFJJTlQoUlRfREVCVUdfTE9VRCwoIkJ1bGtPdXQtQTpTaXplPSVsZCwgQ1dQb3M9JWxkLCBDV1JQb3M9JWxkLCBOQlBvcz0lbGQsIEVOQlBvcz0lbGQsIGJDb3B5PSVkLCBiTFJvdW5kPSVkIVxuIiwgVGhpc0J1bGtTaXplLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkLCBiVHhRTGFzdFJvdW5kKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQnVsa091dC1BOlNpemU9JWxkLCBDV1Bvcz0lbGQsIE5CUG9zPSVsZCwgRU5CUG9zPSVsZCwgYkNvcHk9JWQhXG4iLAorCQkJICBUaGlzQnVsa1NpemUsIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwKKwkJCSAgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLAorCQkJICBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uLAorCQkJICBwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCkpOworCS8qREJHUFJJTlQoUlRfREVCVUdfTE9VRCwoIkJ1bGtPdXQtQTpTaXplPSVsZCwgQ1dQb3M9JWxkLCBDV1JQb3M9JWxkLCBOQlBvcz0lbGQsIEVOQlBvcz0lbGQsIGJDb3B5PSVkLCBiTFJvdW5kPSVkIVxuIiwgVGhpc0J1bGtTaXplLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkLCBiVHhRTGFzdFJvdW5kKSk7ICovCiAKLQkJLy8gVVNCIERNQSBlbmdpbmUgcmVxdWlyZXMgdG8gcGFkIGV4dHJhIDQgYnl0ZXMuIFRoaXMgcGFkIGRvZXNuJ3QgY291bnQgaW50byByZWFsIGJ1bGtvdXRzaXplLgorCS8qIFVTQiBETUEgZW5naW5lIHJlcXVpcmVzIHRvIHBhZCBleHRyYSA0IGJ5dGVzLiBUaGlzIHBhZCBkb2Vzbid0IGNvdW50IGludG8gcmVhbCBidWxrb3V0c2l6ZS4gKi8KIAlwQXBwZW5kYW50ID0gJnBXaXJlbGVzc1BrdFtUbXBCdWxrRW5kUG9zXTsKIAlOZGlzWmVyb01lbW9yeShwQXBwZW5kYW50LCA4KTsKKwlUaGlzQnVsa1NpemUgKz0gNDsKKwlwSFRUWENvbnRleHQtPkxhc3RPbmUgPSBUUlVFOworCWlmICgoVGhpc0J1bGtTaXplICUgcEFkLT5CdWxrT3V0TWF4UGFja2V0U2l6ZSkgPT0gMCkKIAkJVGhpc0J1bGtTaXplICs9IDQ7Ci0JCXBIVFRYQ29udGV4dC0+TGFzdE9uZSA9IFRSVUU7Ci0JCWlmICgoVGhpc0J1bGtTaXplICUgcEFkLT5CdWxrT3V0TWF4UGFja2V0U2l6ZSkgPT0gMCkKLQkJCVRoaXNCdWxrU2l6ZSArPSA0OwogCXBIVFRYQ29udGV4dC0+QnVsa091dFNpemUgPSBUaGlzQnVsa1NpemU7CiAKIAlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250W0J1bGtPdXRQaXBlSWRdID0gMTsKIAlCVUxLX09VVF9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFnczIpOwogCi0JLy8gSW5pdCBUeCBjb250ZXh0IGRlc2NyaXB0b3IKLQlSVFVTQkluaXRIVFR4RGVzYyhwQWQsIHBIVFRYQ29udGV4dCwgQnVsa091dFBpcGVJZCwgVGhpc0J1bGtTaXplLCAodXNiX2NvbXBsZXRlX3QpUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKTsKKwkvKiBJbml0IFR4IGNvbnRleHQgZGVzY3JpcHRvciAqLworCVJUVVNCSW5pdEhUVHhEZXNjKHBBZCwgcEhUVFhDb250ZXh0LCBCdWxrT3V0UGlwZUlkLCBUaGlzQnVsa1NpemUsCisJCQkgICh1c2JfY29tcGxldGVfdCkgUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKTsKIAogCXBVcmIgPSBwSFRUWENvbnRleHQtPnBVcmI7Ci0JaWYoKHJldCA9IFJUVVNCX1NVQk1JVF9VUkIocFVyYikpIT0wKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRVU0JCdWxrT3V0RGF0YVBhY2tldDogU3VibWl0IFR4IFVSQiBmYWlsZWQgJWRcbiIsIHJldCkpOworCWlmICgocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwVXJiKSkgIT0gMCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIlJUVVNCQnVsa091dERhdGFQYWNrZXQ6IFN1Ym1pdCBUeCBVUkIgZmFpbGVkICVkXG4iLAorCQkJICByZXQpKTsKIAogCQlCVUxLX09VVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CiAJCXBBZC0+QnVsa091dFBlbmRpbmdbQnVsa091dFBpcGVJZF0gPSBGQUxTRTsKQEAgLTQ0Niw0OCArNDk1LDQxIEBACiAKIH0KIAotCi1WT0lEIFJUVVNCQnVsa091dERhdGFQYWNrZXRDb21wbGV0ZShwdXJiYl90IHBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKQordm9pZCBSVFVTQkJ1bGtPdXREYXRhUGFja2V0Q29tcGxldGUoc3RydWN0IHVyYiAqcFVyYiwgc3RydWN0IHB0X3JlZ3MgKiBwdF9yZWdzKQogewotCVBIVF9UWF9DT05URVhUCXBIVFRYQ29udGV4dDsKLQlQUlRNUF9BREFQVEVSCXBBZDsKLQlQT1NfQ09PS0lFIAkJcE9iajsKLQlVQ0hBUgkJCUJ1bGtPdXRQaXBlSWQ7CisJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dDsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQ7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iajsKKwl1OCBCdWxrT3V0UGlwZUlkOwogCisJcEhUVFhDb250ZXh0ID0gKHN0cnVjdCBydF9odF90eF9jb250ZXh0ICopcFVyYi0+Y29udGV4dDsKKwlwQWQgPSBwSFRUWENvbnRleHQtPnBBZDsKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKIAotCXBIVFRYQ29udGV4dAk9IChQSFRfVFhfQ09OVEVYVClwVXJiLT5jb250ZXh0OwotCXBBZCAJCQk9IHBIVFRYQ29udGV4dC0+cEFkOwotCXBPYmogCQkJPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQkvLyBTdG9yZSBCdWxrT3V0IFBpcGVJZAotCUJ1bGtPdXRQaXBlSWQJPSBwSFRUWENvbnRleHQtPkJ1bGtPdXRQaXBlSWQ7CisJLyogU3RvcmUgQnVsa091dCBQaXBlSWQgKi8KKwlCdWxrT3V0UGlwZUlkID0gcEhUVFhDb250ZXh0LT5CdWxrT3V0UGlwZUlkOwogCXBBZC0+QnVsa091dERhdGFPbmVTZWNDb3VudCsrOwogCi0Jc3dpdGNoIChCdWxrT3V0UGlwZUlkKQotCXsKLQkJY2FzZSAwOgotCQkJCXBPYmotPmFjMF9kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOwotCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrKTsKLQkJCQlicmVhazsKLQkJY2FzZSAxOgotCQkJCXBPYmotPmFjMV9kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOwotCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrKTsKLQkJCQlicmVhazsKLQkJY2FzZSAyOgotCQkJCXBPYmotPmFjMl9kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOwotCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrKTsKLQkJCQlicmVhazsKLQkJY2FzZSAzOgotCQkJCXBPYmotPmFjM19kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOwotCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrKTsKLQkJCQlicmVhazsKLQkJY2FzZSA0OgotCQkJCXBPYmotPmhjY2FfZG1hX2RvbmVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFVyYjsKLQkJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5oY2NhX2RtYV9kb25lX3Rhc2spOwotCQkJCWJyZWFrOworCXN3aXRjaCAoQnVsa091dFBpcGVJZCkgeworCWNhc2UgMDoKKwkJcE9iai0+YWMwX2RtYV9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlwT2JqLT5hYzFfZG1hX2RvbmVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFVyYjsKKwkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2spOworCQlicmVhazsKKwljYXNlIDI6CisJCXBPYmotPmFjMl9kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOworCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzJfZG1hX2RvbmVfdGFzayk7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJcE9iai0+YWMzX2RtYV9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrKTsKKwkJYnJlYWs7CiAJfQotfQogCit9CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC01MDIsMTcgKzU0NCwxNiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVFVTQkJ1bGtPdXROdWxsRnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCit2b2lkIFJUVVNCQnVsa091dE51bGxGcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JUFRYX0NPTlRFWFQJCXBOdWxsQ29udGV4dCA9ICYocEFkLT5OdWxsQ29udGV4dCk7Ci0JUFVSQgkJCXBVcmI7Ci0JaW50CQkJCXJldCA9IDA7Ci0JdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcE51bGxDb250ZXh0ID0gJihwQWQtPk51bGxDb250ZXh0KTsKKwlQVVJCIHBVcmI7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBJcnFGbGFnczsKIAogCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKLQlpZiAoKHBBZC0+QnVsa091dFBlbmRpbmdbMF0gPT0gVFJVRSkgfHwgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9UWCkpCi0JeworCWlmICgocEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9PSBUUlVFKQorCSAgICB8fCBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTkVFRF9TVE9QX1RYKSkgewogCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKIAkJcmV0dXJuOwogCX0KQEAgLTUyMSw0NSArNTYyLDQ1IEBACiAJcE51bGxDb250ZXh0LT5JUlBQZW5kaW5nID0gVFJVRTsKIAlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKIAotCS8vIEluY3JlYXNlIFRvdGFsIHRyYW5zbWl0IGJ5dGUgY291bnRlcgotCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0gIHBOdWxsQ29udGV4dC0+QnVsa091dFNpemU7CisJLyogSW5jcmVhc2UgVG90YWwgdHJhbnNtaXQgYnl0ZSBjb3VudGVyICovCisJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudCArPSBwTnVsbENvbnRleHQtPkJ1bGtPdXRTaXplOwogCi0KLQkvLyBDbGVhciBOdWxsIGZyYW1lIGJ1bGsgZmxhZworCS8qIENsZWFyIE51bGwgZnJhbWUgYnVsayBmbGFnICovCiAJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTlVMTCk7CiAKLQkvLyBJbml0IFR4IGNvbnRleHQgZGVzY3JpcHRvcgotCVJUVVNCSW5pdFR4RGVzYyhwQWQsIHBOdWxsQ29udGV4dCwgMCwgKHVzYl9jb21wbGV0ZV90KVJUVVNCQnVsa091dE51bGxGcmFtZUNvbXBsZXRlKTsKKwkvKiBJbml0IFR4IGNvbnRleHQgZGVzY3JpcHRvciAqLworCVJUVVNCSW5pdFR4RGVzYyhwQWQsIHBOdWxsQ29udGV4dCwgMCwKKwkJCSh1c2JfY29tcGxldGVfdCkgUlRVU0JCdWxrT3V0TnVsbEZyYW1lQ29tcGxldGUpOwogCiAJcFVyYiA9IHBOdWxsQ29udGV4dC0+cFVyYjsKLQlpZigocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwVXJiKSkhPTApCi0JeworCWlmICgocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwVXJiKSkgIT0gMCkgewogCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CiAJCXBBZC0+QnVsa091dFBlbmRpbmdbMF0gPSBGQUxTRTsKIAkJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFswXSA9IDA7CiAJCXBOdWxsQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOwogCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKIAotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkJ1bGtPdXROdWxsRnJhbWU6IFN1Ym1pdCBUeCBVUkIgZmFpbGVkICVkXG4iLCByZXQpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJSVFVTQkJ1bGtPdXROdWxsRnJhbWU6IFN1Ym1pdCBUeCBVUkIgZmFpbGVkICVkXG4iLAorCQkJICByZXQpKTsKIAkJcmV0dXJuOwogCX0KIAogfQogCi0vLyBOVUxMIGZyYW1lIHVzZSBCdWxrT3V0UGlwZUlkID0gMAotVk9JRCBSVFVTQkJ1bGtPdXROdWxsRnJhbWVDb21wbGV0ZShwdXJiYl90IHBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKQorLyogTlVMTCBmcmFtZSB1c2UgQnVsa091dFBpcGVJZCA9IDAgKi8KK3ZvaWQgUlRVU0JCdWxrT3V0TnVsbEZyYW1lQ29tcGxldGUoc3RydWN0IHVyYiAqcFVyYiwgc3RydWN0IHB0X3JlZ3MgKiBwdF9yZWdzKQogewotCVBSVE1QX0FEQVBURVIJCXBBZDsKLQlQVFhfQ09OVEVYVAkJCXBOdWxsQ29udGV4dDsKLQlOVFNUQVRVUwkJCVN0YXR1czsKLQlQT1NfQ09PS0lFCQkJcE9iajsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQ7CisJc3RydWN0IHJ0X3R4X2NvbnRleHQgKnBOdWxsQ29udGV4dDsKKwlpbnQgU3RhdHVzOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CiAKKwlwTnVsbENvbnRleHQgPSAoc3RydWN0IHJ0X3R4X2NvbnRleHQgKilwVXJiLT5jb250ZXh0OworCXBBZCA9IHBOdWxsQ29udGV4dC0+cEFkOworCVN0YXR1cyA9IHBVcmItPnN0YXR1czsKIAotCXBOdWxsQ29udGV4dAk9IChQVFhfQ09OVEVYVClwVXJiLT5jb250ZXh0OwotCXBBZCAJCQk9IHBOdWxsQ29udGV4dC0+cEFkOwotCVN0YXR1cyAJCQk9IHBVcmItPnN0YXR1czsKLQotCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisJcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CiAJcE9iai0+bnVsbF9mcmFtZV9jb21wbGV0ZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOwogCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPm51bGxfZnJhbWVfY29tcGxldGVfdGFzayk7CiB9CkBAIC01NzcsMzQgKzYxOCwzMCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVFVTQkJ1bGtPdXRNTE1FUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJSW5kZXgpCit2b2lkIFJUVVNCQnVsa091dE1MTUVQYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBJbmRleCkKIHsKLQlQVFhfQ09OVEVYVAkJcE1MTUVDb250ZXh0OwotCVBVUkIJCQlwVXJiOwotCWludAkJCQlyZXQgPSAwOwotCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisJc3RydWN0IHJ0X3R4X2NvbnRleHQgKnBNTE1FQ29udGV4dDsKKwlQVVJCIHBVcmI7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBJcnFGbGFnczsKIAotCXBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVClwQWQtPk1nbXRSaW5nLkNlbGxbcEFkLT5NZ210UmluZy5UeERtYUlkeF0uQWxsb2NWYTsKKwlwTUxNRUNvbnRleHQgPQorCSAgICAoc3RydWN0IHJ0X3R4X2NvbnRleHQgKilwQWQtPk1nbXRSaW5nLkNlbGxbcEFkLT5NZ210UmluZy5UeERtYUlkeF0uQWxsb2NWYTsKIAlwVXJiID0gcE1MTUVDb250ZXh0LT5wVXJiOwogCiAJaWYgKChwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID49IE1HTVRfUklOR19TSVpFKSB8fAotCQkocE1MTUVDb250ZXh0LT5JblVzZSA9PSBGQUxTRSkgfHwKLQkJKHBNTE1FQ29udGV4dC0+YldhaXRpbmdCdWxrT3V0ID09IEZBTFNFKSkKLQl7CisJICAgIChwTUxNRUNvbnRleHQtPkluVXNlID09IEZBTFNFKSB8fAorCSAgICAocE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPT0gRkFMU0UpKSB7CiAKLQotCQkvLyBDbGVhciBNTE1FIGJ1bGsgZmxhZworCQkvKiBDbGVhciBNTE1FIGJ1bGsgZmxhZyAqLwogCQlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfTUxNRSk7CiAKIAkJcmV0dXJuOwogCX0KIAotCiAJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tNR01UUElQRUlEWF0sIElycUZsYWdzKTsKLQlpZiAoKHBBZC0+QnVsa091dFBlbmRpbmdbTUdNVFBJUEVJRFhdID09IFRSVUUpIHx8IFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgpKQotCXsKKwlpZiAoKHBBZC0+QnVsa091dFBlbmRpbmdbTUdNVFBJUEVJRFhdID09IFRSVUUpCisJICAgIHx8IFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgpKSB7CiAJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tNR01UUElQRUlEWF0sIElycUZsYWdzKTsKIAkJcmV0dXJuOwogCX0KQEAgLTYxNSwyMyArNjUyLDI1IEBACiAJcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPSBGQUxTRTsKIAlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbTUdNVFBJUEVJRFhdLCBJcnFGbGFncyk7CiAKLQkvLyBJbmNyZWFzZSBUb3RhbCB0cmFuc21pdCBieXRlIGNvdW50ZXIKLQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50ICs9ICBwTUxNRUNvbnRleHQtPkJ1bGtPdXRTaXplOworCS8qIEluY3JlYXNlIFRvdGFsIHRyYW5zbWl0IGJ5dGUgY291bnRlciAqLworCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0gcE1MTUVDb250ZXh0LT5CdWxrT3V0U2l6ZTsKIAotCS8vIENsZWFyIE1MTUUgYnVsayBmbGFnCisJLyogQ2xlYXIgTUxNRSBidWxrIGZsYWcgKi8KIAlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfTUxNRSk7CiAKLQkvLyBJbml0IFR4IGNvbnRleHQgZGVzY3JpcHRvcgotCVJUVVNCSW5pdFR4RGVzYyhwQWQsIHBNTE1FQ29udGV4dCwgTUdNVFBJUEVJRFgsICh1c2JfY29tcGxldGVfdClSVFVTQkJ1bGtPdXRNTE1FUGFja2V0Q29tcGxldGUpOworCS8qIEluaXQgVHggY29udGV4dCBkZXNjcmlwdG9yICovCisJUlRVU0JJbml0VHhEZXNjKHBBZCwgcE1MTUVDb250ZXh0LCBNR01UUElQRUlEWCwKKwkJCSh1c2JfY29tcGxldGVfdCkgUlRVU0JCdWxrT3V0TUxNRVBhY2tldENvbXBsZXRlKTsKIAotCS8vRm9yIG1nbXQgdXJiIGJ1ZmZlciwgYmVjYXVzZSB3ZSB1c2Ugc2tfYnVmZiwgc28gd2UgbmVlZCB0byBub3RpZnkgdGhlIFVTQiBjb250cm9sbGVyIGRvIGRtYSBtYXBwaW5nLgotCXBVcmItPnRyYW5zZmVyX2RtYQk9IDA7CisJLypGb3IgbWdtdCB1cmIgYnVmZmVyLCBiZWNhdXNlIHdlIHVzZSBza19idWZmLCBzbyB3ZSBuZWVkIHRvIG5vdGlmeSB0aGUgVVNCIGNvbnRyb2xsZXIgZG8gZG1hIG1hcHBpbmcuICovCisJcFVyYi0+dHJhbnNmZXJfZG1hID0gMDsKIAlwVXJiLT50cmFuc2Zlcl9mbGFncyAmPSAoflVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQKTsKIAogCXBVcmIgPSBwTUxNRUNvbnRleHQtPnBVcmI7Ci0JaWYoKHJldCA9IFJUVVNCX1NVQk1JVF9VUkIocFVyYikpIT0wKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRVU0JCdWxrT3V0TUxNRVBhY2tldDogU3VibWl0IE1MTUUgVVJCIGZhaWxlZCAlZFxuIiwgcmV0KSk7CisJaWYgKChyZXQgPSBSVFVTQl9TVUJNSVRfVVJCKHBVcmIpKSAhPSAwKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiUlRVU0JCdWxrT3V0TUxNRVBhY2tldDogU3VibWl0IE1MTUUgVVJCIGZhaWxlZCAlZFxuIiwKKwkJCSAgcmV0KSk7CiAJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbTUdNVFBJUEVJRFhdLCBJcnFGbGFncyk7CiAJCXBBZC0+QnVsa091dFBlbmRpbmdbTUdNVFBJUEVJRFhdID0gRkFMU0U7CiAJCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbTUdNVFBJUEVJRFhdID0gMDsKQEAgLTY0MSwzMiArNjgwLDI5IEBACiAKIAkJcmV0dXJuOwogCX0KLQotCS8vREJHUFJJTlRfUkFXKFJUX0RFQlVHX0lORk8sICgiPC0tLVJUVVNCQnVsa091dE1MTUVQYWNrZXQgXG4iKSk7Ci0vLwlwcmludGsoIjwtLS1SVFVTQkJ1bGtPdXRNTE1FUGFja2V0LENwdT0lZCEsIERtYT0lZCwgU3dJZHg9JWQhXG4iLCBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4LCBwQWQtPk1nbXRSaW5nLlR4RG1hSWR4LCBwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4KTsKKwkvKkRCR1BSSU5UX1JBVyhSVF9ERUJVR19JTkZPLCAoIjwtLS1SVFVTQkJ1bGtPdXRNTE1FUGFja2V0IFxuIikpOyAqLworLyogICAgICBwcmludGsoIjwtLS1SVFVTQkJ1bGtPdXRNTE1FUGFja2V0LENwdT0lZCEsIERtYT0lZCwgU3dJZHg9JWQhXG4iLCBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4LCBwQWQtPk1nbXRSaW5nLlR4RG1hSWR4LCBwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4KTsgKi8KIH0KIAotCi1WT0lEIFJUVVNCQnVsa091dE1MTUVQYWNrZXRDb21wbGV0ZShwdXJiYl90IHBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKQordm9pZCBSVFVTQkJ1bGtPdXRNTE1FUGFja2V0Q29tcGxldGUoc3RydWN0IHVyYiAqcFVyYiwgc3RydWN0IHB0X3JlZ3MgKiBwdF9yZWdzKQogewotCVBUWF9DT05URVhUCQkJcE1MTUVDb250ZXh0OwotCVBSVE1QX0FEQVBURVIJCXBBZDsKLQlOVFNUQVRVUwkJCVN0YXR1czsKLQlQT1NfQ09PS0lFIAkJCXBPYmo7Ci0JaW50CQkJCQlpbmRleDsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcE1MTUVDb250ZXh0OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZDsKKwlpbnQgU3RhdHVzOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisJaW50IGluZGV4OwogCi0JLy9EQkdQUklOVF9SQVcoUlRfREVCVUdfSU5GTywgKCItLS0+UlRVU0JCdWxrT3V0TUxNRVBhY2tldENvbXBsZXRlXG4iKSk7Ci0JcE1MTUVDb250ZXh0CT0gKFBUWF9DT05URVhUKXBVcmItPmNvbnRleHQ7Ci0JcEFkIAkJCT0gcE1MTUVDb250ZXh0LT5wQWQ7Ci0JcE9iaiAJCQk9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOwotCVN0YXR1cwkJCT0gcFVyYi0+c3RhdHVzOwotCWluZGV4IAkJCT0gcE1MTUVDb250ZXh0LT5TZWxmSWR4OworCS8qREJHUFJJTlRfUkFXKFJUX0RFQlVHX0lORk8sICgiLS0tPlJUVVNCQnVsa091dE1MTUVQYWNrZXRDb21wbGV0ZVxuIikpOyAqLworCXBNTE1FQ29udGV4dCA9IChzdHJ1Y3QgcnRfdHhfY29udGV4dCAqKXBVcmItPmNvbnRleHQ7CisJcEFkID0gcE1MTUVDb250ZXh0LT5wQWQ7CisJcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisJU3RhdHVzID0gcFVyYi0+c3RhdHVzOworCWluZGV4ID0gcE1MTUVDb250ZXh0LT5TZWxmSWR4OwogCiAJcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOwogCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPm1nbXRfZG1hX2RvbmVfdGFzayk7CiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtNjgwLDE3ICs3MTYsMTYgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJUlRVU0JCdWxrT3V0UHNQb2xsKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQordm9pZCBSVFVTQkJ1bGtPdXRQc1BvbGwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCVBUWF9DT05URVhUCQlwUHNQb2xsQ29udGV4dCA9ICYocEFkLT5Qc1BvbGxDb250ZXh0KTsKLQlQVVJCCQkJcFVyYjsKLQlpbnQJCQkJcmV0ID0gMDsKLQl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCXN0cnVjdCBydF90eF9jb250ZXh0ICpwUHNQb2xsQ29udGV4dCA9ICYocEFkLT5Qc1BvbGxDb250ZXh0KTsKKwlQVVJCIHBVcmI7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBJcnFGbGFnczsKIAogCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKLQlpZiAoKHBBZC0+QnVsa091dFBlbmRpbmdbMF0gPT0gVFJVRSkgfHwgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9UWCkpCi0JeworCWlmICgocEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9PSBUUlVFKQorCSAgICB8fCBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTkVFRF9TVE9QX1RYKSkgewogCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKIAkJcmV0dXJuOwogCX0KQEAgLTY5OSw1NyArNzM0LDU3IEBACiAJcFBzUG9sbENvbnRleHQtPklSUFBlbmRpbmcgPSBUUlVFOwogCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOwogCi0KLQkvLyBDbGVhciBQUy1Qb2xsIGJ1bGsgZmxhZworCS8qIENsZWFyIFBTLVBvbGwgYnVsayBmbGFnICovCiAJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX1BTUE9MTCk7CiAKLQkvLyBJbml0IFR4IGNvbnRleHQgZGVzY3JpcHRvcgotCVJUVVNCSW5pdFR4RGVzYyhwQWQsIHBQc1BvbGxDb250ZXh0LCBNR01UUElQRUlEWCwgKHVzYl9jb21wbGV0ZV90KVJUVVNCQnVsa091dFBzUG9sbENvbXBsZXRlKTsKKwkvKiBJbml0IFR4IGNvbnRleHQgZGVzY3JpcHRvciAqLworCVJUVVNCSW5pdFR4RGVzYyhwQWQsIHBQc1BvbGxDb250ZXh0LCBNR01UUElQRUlEWCwKKwkJCSh1c2JfY29tcGxldGVfdCkgUlRVU0JCdWxrT3V0UHNQb2xsQ29tcGxldGUpOwogCiAJcFVyYiA9IHBQc1BvbGxDb250ZXh0LT5wVXJiOwotCWlmKChyZXQgPSBSVFVTQl9TVUJNSVRfVVJCKHBVcmIpKSE9MCkKLQl7CisJaWYgKChyZXQgPSBSVFVTQl9TVUJNSVRfVVJCKHBVcmIpKSAhPSAwKSB7CiAJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKIAkJcEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9IEZBTFNFOwogCQlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250WzBdID0gMDsKIAkJcFBzUG9sbENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKIAkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CiAKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRVU0JCdWxrT3V0UHNQb2xsOiBTdWJtaXQgVHggVVJCIGZhaWxlZCAlZFxuIiwgcmV0KSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiUlRVU0JCdWxrT3V0UHNQb2xsOiBTdWJtaXQgVHggVVJCIGZhaWxlZCAlZFxuIiwKKwkJCSAgcmV0KSk7CiAJCXJldHVybjsKIAl9CiAKIH0KIAotLy8gUFMtUG9sbCBmcmFtZSB1c2UgQnVsa091dFBpcGVJZCA9IDAKLVZPSUQgUlRVU0JCdWxrT3V0UHNQb2xsQ29tcGxldGUocHVyYmJfdCBwVXJiLHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKQorLyogUFMtUG9sbCBmcmFtZSB1c2UgQnVsa091dFBpcGVJZCA9IDAgKi8KK3ZvaWQgUlRVU0JCdWxrT3V0UHNQb2xsQ29tcGxldGUoc3RydWN0IHVyYiAqcFVyYiwgc3RydWN0IHB0X3JlZ3MgKiBwdF9yZWdzKQogewotCVBSVE1QX0FEQVBURVIJCXBBZDsKLQlQVFhfQ09OVEVYVAkJCXBQc1BvbGxDb250ZXh0OwotCU5UU1RBVFVTCQkJU3RhdHVzOwotCVBPU19DT09LSUUJCQlwT2JqOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZDsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcFBzUG9sbENvbnRleHQ7CisJaW50IFN0YXR1czsKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqOwogCi0KLQlwUHNQb2xsQ29udGV4dD0gKFBUWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcFBzUG9sbENvbnRleHQgPSAoc3RydWN0IHJ0X3R4X2NvbnRleHQgKilwVXJiLT5jb250ZXh0OwogCXBBZCA9IHBQc1BvbGxDb250ZXh0LT5wQWQ7CiAJU3RhdHVzID0gcFVyYi0+c3RhdHVzOwogCi0JcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKIAlwT2JqLT5wc3BvbGxfZnJhbWVfY29tcGxldGVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFVyYjsKIAl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5wc3BvbGxfZnJhbWVfY29tcGxldGVfdGFzayk7CiB9CiAKLVZPSUQgRG9CdWxrSW4oSU4gUlRNUF9BREFQVEVSICpwQWQpCit2b2lkIERvQnVsa0luKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dDsKLQlQVVJCCQkJcFVyYjsKLQlpbnQJCQkJcmV0ID0gMDsKLQl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCXN0cnVjdCBydF9yeF9jb250ZXh0ICpwUnhDb250ZXh0OworCVBVUkIgcFVyYjsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIElycUZsYWdzOwogCiAJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CiAJcFJ4Q29udGV4dCA9ICYocEFkLT5SeENvbnRleHRbcEFkLT5OZXh0UnhCdWxrSW5JbmRleF0pOwotCWlmICgocEFkLT5QZW5kaW5nUnggPiAwKSB8fCAocFJ4Q29udGV4dC0+UmVhZGFibGUgPT0gVFJVRSkgfHwgKHBSeENvbnRleHQtPkluVXNlID09IFRSVUUpKQotCXsKKwlpZiAoKHBBZC0+UGVuZGluZ1J4ID4gMCkgfHwgKHBSeENvbnRleHQtPlJlYWRhYmxlID09IFRSVUUpCisJICAgIHx8IChwUnhDb250ZXh0LT5JblVzZSA9PSBUUlVFKSkgewogCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOwogCQlyZXR1cm47CiAJfQpAQCAtNzU5LDEzICs3OTQsMTIgQEAKIAlwQWQtPkJ1bGtJblJlcSsrOwogCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CiAKLQkvLyBJbml0IFJ4IGNvbnRleHQgZGVzY3JpcHRvcgorCS8qIEluaXQgUnggY29udGV4dCBkZXNjcmlwdG9yICovCiAJTmRpc1plcm9NZW1vcnkocFJ4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXIsIHBSeENvbnRleHQtPkJ1bGtJbk9mZnNldCk7CiAJUlRVU0JJbml0UnhEZXNjKHBBZCwgcFJ4Q29udGV4dCk7CiAKIAlwVXJiID0gcFJ4Q29udGV4dC0+cFVyYjsKLQlpZiAoKHJldCA9IFJUVVNCX1NVQk1JVF9VUkIocFVyYikpIT0wKQotCXsJLy8gZmFpbAorCWlmICgocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwVXJiKSkgIT0gMCkgewkvKiBmYWlsICovCiAKIAkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CiAJCXBSeENvbnRleHQtPkluVXNlID0gRkFMU0U7CkBAIC03NzMsMTYgKzgwNywxNCBAQAogCQlwQWQtPlBlbmRpbmdSeC0tOwogCQlwQWQtPkJ1bGtJblJlcS0tOwogCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOwotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkJ1bGtSZWNlaXZlOiBTdWJtaXQgUnggVVJCIGZhaWxlZCAlZFxuIiwgcmV0KSk7Ci0JfQotCWVsc2UKLQl7CS8vIHN1Y2Nlc3MKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJSVFVTQkJ1bGtSZWNlaXZlOiBTdWJtaXQgUnggVVJCIGZhaWxlZCAlZFxuIiwgcmV0KSk7CisJfSBlbHNlIHsJCS8qIHN1Y2Nlc3MgKi8KIAkJQVNTRVJUKChwUnhDb250ZXh0LT5JblVzZSA9PSBwUnhDb250ZXh0LT5JUlBQZW5kaW5nKSk7Ci0JCS8vcHJpbnRrKCJCSURvbmUsIFBlbmQ9JWQsQklJZHg9JWQsQklSSWR4PSVkIVxuIiwgcEFkLT5QZW5kaW5nUngsIHBBZC0+TmV4dFJ4QnVsa0luSW5kZXgsIHBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4KTsKKwkJLypwcmludGsoIkJJRG9uZSwgUGVuZD0lZCxCSUlkeD0lZCxCSVJJZHg9JWQhXG4iLCBwQWQtPlBlbmRpbmdSeCwgcEFkLT5OZXh0UnhCdWxrSW5JbmRleCwgcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXgpOyAqLwogCX0KIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC04MTMsNDQgKzg0NSw0MCBAQAogCQkgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwgXAogCQkgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MpCiAKLVZPSUQJUlRVU0JCdWxrUmVjZWl2ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3ZvaWQgUlRVU0JCdWxrUmVjZWl2ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JUFJYX0NPTlRFWFQJCXBSeENvbnRleHQ7Ci0JdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKLQorCXN0cnVjdCBydF9yeF9jb250ZXh0ICpwUnhDb250ZXh0OworCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CiAKIAkvKiBzYW5pdHkgY2hlY2sgKi8KIAlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9IQU5ETEVfUlgpKQogCQlyZXR1cm47CiAKLQl3aGlsZSgxKQotCXsKKwl3aGlsZSAoMSkgewogCiAJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOwogCQlwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleF0pOwotCQlpZiAoKChwUnhDb250ZXh0LT5JblVzZSA9PSBGQUxTRSkgJiYgKHBSeENvbnRleHQtPlJlYWRhYmxlID09IFRSVUUpKSAmJgotCQkJKHBSeENvbnRleHQtPmJSeEhhbmRsaW5nID09IEZBTFNFKSkKLQkJeworCQlpZiAoKChwUnhDb250ZXh0LT5JblVzZSA9PSBGQUxTRSkKKwkJICAgICAmJiAocFJ4Q29udGV4dC0+UmVhZGFibGUgPT0gVFJVRSkpCisJCSAgICAmJiAocFJ4Q29udGV4dC0+YlJ4SGFuZGxpbmcgPT0gRkFMU0UpKSB7CiAJCQlwUnhDb250ZXh0LT5iUnhIYW5kbGluZyA9IFRSVUU7CiAJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOwogCi0JCQkvLyByZWFkIFJ4Q29udGV4dCwgU2luY2Ugbm90CisJCQkvKiByZWFkIFJ4Q29udGV4dCwgU2luY2Ugbm90ICovCiAJCQlTVEFSeERvbmVJbnRlcnJ1cHRIYW5kbGUocEFkLCBUUlVFKTsKIAotCQkJLy8gRmluaXNoIHRvIGhhbmRsZSB0aGlzIGJ1bGtJbiBidWZmZXIuCisJCQkvKiBGaW5pc2ggdG8gaGFuZGxlIHRoaXMgYnVsa0luIGJ1ZmZlci4gKi8KIAkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOwogCQkJcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0ID0gMDsKIAkJCXBSeENvbnRleHQtPlJlYWRhYmxlID0gRkFMU0U7CiAJCQlwUnhDb250ZXh0LT5iUnhIYW5kbGluZyA9IEZBTFNFOwogCQkJcEFkLT5SZWFkUG9zaXRpb24gPSAwOwogCQkJcEFkLT5UcmFuc2ZlckJ1ZmZlckxlbmd0aCA9IDA7Ci0JCQlJTkNfUklOR19JTkRFWChwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCwgUlhfUklOR19TSVpFKTsKKwkJCUlOQ19SSU5HX0lOREVYKHBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4LAorCQkJCSAgICAgICBSWF9SSU5HX1NJWkUpOwogCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKIAotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKIAkJCWJyZWFrOwogCQl9CkBAIC04NjEsNyArODg5LDYgQEAKIAogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTg4NSwyNyArOTEyLDI0IEBACiAJCUFsd2F5cyByZXR1cm5zIFNUQVRVU19NT1JFX1BST0NFU1NJTkdfUkVRVUlSRUQKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIFJUVVNCQnVsa1J4Q29tcGxldGUocHVyYmJfdCBwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncykKK3ZvaWQgUlRVU0JCdWxrUnhDb21wbGV0ZShzdHJ1Y3QgdXJiICpwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncykKIHsKLQkvLyB1c2UgYSByZWNlaXZlIHRhc2tsZXQgdG8gaGFuZGxlIHJlY2VpdmVkIHBhY2tldHM7Ci0JLy8gb3Igc29tZXRpbWVzIGhhcmR3YXJlIElSUSB3aWxsIGJlIGRpc2FibGVkIGhlcmUsIHNvIHdlIGNhbiBub3QKLQkvLyB1c2Ugc3Bpbl9sb2NrX2JoKCkvc3Bpbl91bmxvY2tfYmgoKSBhZnRlciBJUlEgaXMgZGlzYWJsZWQuIDo8Ci0JUFJYX0NPTlRFWFQJCXBSeENvbnRleHQ7Ci0JUFJUTVBfQURBUFRFUglwQWQ7Ci0JUE9TX0NPT0tJRSAJCXBPYmo7CisJLyogdXNlIGEgcmVjZWl2ZSB0YXNrbGV0IHRvIGhhbmRsZSByZWNlaXZlZCBwYWNrZXRzOyAqLworCS8qIG9yIHNvbWV0aW1lcyBoYXJkd2FyZSBJUlEgd2lsbCBiZSBkaXNhYmxlZCBoZXJlLCBzbyB3ZSBjYW4gbm90ICovCisJLyogdXNlIHNwaW5fbG9ja19iaCgpL3NwaW5fdW5sb2NrX2JoKCkgYWZ0ZXIgSVJRIGlzIGRpc2FibGVkLiA6PCAqLworCXN0cnVjdCBydF9yeF9jb250ZXh0ICpwUnhDb250ZXh0OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZDsKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqOwogCi0KLQlwUnhDb250ZXh0CT0gKFBSWF9DT05URVhUKXBVcmItPmNvbnRleHQ7Ci0JcEFkIAkJPSBwUnhDb250ZXh0LT5wQWQ7Ci0JcE9iaiAJCT0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCXBSeENvbnRleHQgPSAoc3RydWN0IHJ0X3J4X2NvbnRleHQgKilwVXJiLT5jb250ZXh0OworCXBBZCA9IHBSeENvbnRleHQtPnBBZDsKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKIAogCXBPYmotPnJ4X2RvbmVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFVyYjsKIAl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5yeF9kb25lX3Rhc2spOwogCiB9CiAKLQotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC05MTksODYgKzk0Myw3OCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVFVTQktpY2tCdWxrT3V0KAotCUlOCVBSVE1QX0FEQVBURVIgcEFkKQordm9pZCBSVFVTQktpY2tCdWxrT3V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQkvLyBCdWxrSW4gUmVzZXQgd2lsbCByZXNldCB3aG9sZSBVU0IgUEhZLiBTbyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVCBub3QgZmxhZ2VkLgotCWlmICghUlRNUF9URVNUX0ZMQUcocEFkICxmUlRNUF9BREFQVEVSX05FRURfU1RPUF9UWCkKLQkJKQotCXsKLQkJLy8gMi4gUFMtUG9sbCBmcmFtZSBpcyBuZXh0Ci0JCWlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9QU1BPTEwpKQotCQl7CisJLyogQnVsa0luIFJlc2V0IHdpbGwgcmVzZXQgd2hvbGUgVVNCIFBIWS4gU28gd2UgbmVlZCB0byBtYWtlIHN1cmUgZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQgbm90IGZsYWdlZC4gKi8KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgpCisJICAgICkgeworCQkvKiAyLiBQUy1Qb2xsIGZyYW1lIGlzIG5leHQgKi8KKwkJaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX1BTUE9MTCkpIHsKIAkJCVJUVVNCQnVsa091dFBzUG9sbChwQWQpOwogCQl9Ci0KLQkJLy8gNS4gTWxtZSBmcmFtZSBpcyBuZXh0Ci0JCWVsc2UgaWYgKChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9NTE1FKSkgJiYKLQkJCQkgKHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPCBNR01UX1JJTkdfU0laRSkpCi0JCXsKKwkJLyogNS4gTWxtZSBmcmFtZSBpcyBuZXh0ICovCisJCWVsc2UgaWYgKChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9NTE1FKSkgfHwKKwkJCSAocEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA8IE1HTVRfUklOR19TSVpFKSkgewogCQkJUlRVU0JCdWxrT3V0TUxNRVBhY2tldChwQWQsIHBBZC0+TWdtdFJpbmcuVHhEbWFJZHgpOwogCQl9Ci0KLQkJLy8gNi4gRGF0YSBmcmFtZSBub3JtYWwgaXMgbmV4dAotCQlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwpKQotCQl7Ci0JCQlpZiAoKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgfHwKLQkJCQkoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJCQkpKQotCQkJewotCQkJCVJUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAwLCBwQWQtPk5leHRCdWxrT3V0SW5kZXhbMF0pOworCQkvKiA2LiBEYXRhIGZyYW1lIG5vcm1hbCBpcyBuZXh0ICovCisJCWlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCkpIHsKKwkJCWlmICgoKCFSVE1QX1RFU1RfRkxBRworCQkJICAgICAgKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCQkgICAgIHx8CisJCQkgICAgICghT1BTVEFUVVNfVEVTVF9GTEFHCisJCQkgICAgICAocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCQkgICAgKSkgeworCQkJCVJUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAwLAorCQkJCQkJICAgICAgIHBBZC0+CisJCQkJCQkgICAgICAgTmV4dEJ1bGtPdXRJbmRleFswXSk7CiAJCQl9CiAJCX0KLQkJaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMXzIpKQotCQl7Ci0JCQlpZiAoKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgfHwKLQkJCQkoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJCQkpKQotCQkJewotCQkJCVJUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAxLCBwQWQtPk5leHRCdWxrT3V0SW5kZXhbMV0pOworCQlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfMikpIHsKKwkJCWlmICgoKCFSVE1QX1RFU1RfRkxBRworCQkJICAgICAgKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCQkgICAgIHx8CisJCQkgICAgICghT1BTVEFUVVNfVEVTVF9GTEFHCisJCQkgICAgICAocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCQkgICAgKSkgeworCQkJCVJUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAxLAorCQkJCQkJICAgICAgIHBBZC0+CisJCQkJCQkgICAgICAgTmV4dEJ1bGtPdXRJbmRleFsxXSk7CiAJCQl9CiAJCX0KLQkJaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMXzMpKQotCQl7Ci0JCQlpZiAoKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgfHwKLQkJCQkoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJCQkpKQotCQkJewotCQkJCVJUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAyLCBwQWQtPk5leHRCdWxrT3V0SW5kZXhbMl0pOworCQlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfMykpIHsKKwkJCWlmICgoKCFSVE1QX1RFU1RfRkxBRworCQkJICAgICAgKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCQkgICAgIHx8CisJCQkgICAgICghT1BTVEFUVVNfVEVTVF9GTEFHCisJCQkgICAgICAocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCQkgICAgKSkgeworCQkJCVJUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAyLAorCQkJCQkJICAgICAgIHBBZC0+CisJCQkJCQkgICAgICAgTmV4dEJ1bGtPdXRJbmRleFsyXSk7CiAJCQl9CiAJCX0KLQkJaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMXzQpKQotCQl7Ci0JCQlpZiAoKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgfHwKLQkJCQkoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJCQkpKQotCQkJewotCQkJCVJUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAzLCBwQWQtPk5leHRCdWxrT3V0SW5kZXhbM10pOworCQlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfNCkpIHsKKwkJCWlmICgoKCFSVE1QX1RFU1RfRkxBRworCQkJICAgICAgKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCQkgICAgIHx8CisJCQkgICAgICghT1BTVEFUVVNfVEVTVF9GTEFHCisJCQkgICAgICAocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCQkgICAgKSkgeworCQkJCVJUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAzLAorCQkJCQkJICAgICAgIHBBZC0+CisJCQkJCQkgICAgICAgTmV4dEJ1bGtPdXRJbmRleFszXSk7CiAJCQl9CiAJCX0KLQotCQkvL1BTIHBhY2tldHMgdXNlIEhDQ0EgcXVldWUgd2hlbiBkZXF1ZXVlIGZyb20gUFMgdW5pY2FzdCBxdWV1ZSAoV2lGaSBXUEEyIE1BOV9EVDEgZm9yIE1hcnZlbGwgQiBTVEEpCi0JCWlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTF81KSkKLQkJewotCQkJaWYgKCgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpIHx8Ci0JCQkJKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCi0JCQkJKSkKLQkJCXsKLQkJCX0KLQkJfQotCi0JCS8vIDcuIE51bGwgZnJhbWUgaXMgdGhlIGxhc3QKLQkJZWxzZSBpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OVUxMKSkKLQkJewotCQkJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQotCQkJeworCQkvKiA3LiBOdWxsIGZyYW1lIGlzIHRoZSBsYXN0ICovCisJCWVsc2UgaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTlVMTCkpIHsKKwkJCWlmICghUlRNUF9URVNUX0ZMQUcKKwkJCSAgICAocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgewogCQkJCVJUVVNCQnVsa091dE51bGxGcmFtZShwQWQpOwogCQkJfQogCQl9Ci0KLQkJLy8gOC4gTm8gZGF0YSBhdmFsaWFibGUKLQkJZWxzZQotCQl7CisJCS8qIDguIE5vIGRhdGEgYXZhbGlhYmxlICovCisJCWVsc2UgewogCiAJCX0KIAl9CkBAIC0xMDE3LDE2ICsxMDMzLDE0IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUVVNCQ2xlYW5VcERhdGFCdWxrT3V0UXVldWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCit2b2lkIFJUVVNCQ2xlYW5VcERhdGFCdWxrT3V0UXVldWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCVVDSEFSCQkJSWR4OwotCVBIVF9UWF9DT05URVhUCXBUeENvbnRleHQ7CisJdTggSWR4OworCXN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwVHhDb250ZXh0OwogCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkNsZWFuVXBEYXRhQnVsa091dFF1ZXVlXG4iKSk7CiAKLQlmb3IgKElkeCA9IDA7IElkeCA8IDQ7IElkeCsrKQotCXsKKwlmb3IgKElkeCA9IDA7IElkeCA8IDQ7IElkeCsrKSB7CiAJCXBUeENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbSWR4XTsKIAogCQlwVHhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID0gcFR4Q29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbjsKQEAgLTEwNTIsMTQgKzEwNjYsMTIgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJUlRVU0JDbGVhblVwTUxNRUJ1bGtPdXRRdWV1ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3ZvaWQgUlRVU0JDbGVhblVwTUxNRUJ1bGtPdXRRdWV1ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7CiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkNsZWFuVXBNTE1FQnVsa091dFF1ZXVlXG4iKSk7CiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tLUNsZWFuVXBNTE1FQnVsa091dFF1ZXVlXG4iKSk7CiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMTA2OSwxMyArMTA4MSwxMSBAQAogCiAJUmV0dXJuIFZhbHVlOgogCi0KIAlOb3RlOgogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVFVTQkNhbmNlbFBlbmRpbmdJUlBzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQordm9pZCBSVFVTQkNhbmNlbFBlbmRpbmdJUlBzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKIAlSVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlAocEFkKTsKIAlSVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKHBBZCk7CkBAIC0xMDk0LDI5ICsxMTA0LDI1IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3ZvaWQgUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dDsKLQlVSU5UCQkJaTsKKwlzdHJ1Y3QgcnRfcnhfY29udGV4dCAqcFJ4Q29udGV4dDsKKwl1MzIgaTsKIAogCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCItLS0+UlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQXG4iKSk7Ci0JZm9yICggaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFKTsgaSsrKQotCXsKKwlmb3IgKGkgPSAwOyBpIDwgKFJYX1JJTkdfU0laRSk7IGkrKykgewogCQlwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7Ci0JCWlmKHBSeENvbnRleHQtPklSUFBlbmRpbmcgPT0gVFJVRSkKLQkJeworCQlpZiAocFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9PSBUUlVFKSB7CiAJCQlSVFVTQl9VTkxJTktfVVJCKHBSeENvbnRleHQtPnBVcmIpOwogCQkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOwogCQkJcFJ4Q29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKLQkJCS8vTmRpc0ludGVybG9ja2VkRGVjcmVtZW50KCZwQWQtPlBlbmRpbmdSeCk7Ci0JCQkvL3BBZC0+UGVuZGluZ1J4LS07CisJCQkvKk5kaXNJbnRlcmxvY2tlZERlY3JlbWVudCgmcEFkLT5QZW5kaW5nUngpOyAqLworCQkJLypwQWQtPlBlbmRpbmdSeC0tOyAqLwogCQl9CiAJfQogCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCI8LS0tUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQXG4iKSk7CiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMTEzMCw4MyArMTEzNiw3NCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQordm9pZCBSVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OwotCVBUWF9DT05URVhUCQkJcE1MTUVDb250ZXh0OwotCVBUWF9DT05URVhUCQkJcEJlYWNvbkNvbnRleHQ7Ci0JUFRYX0NPTlRFWFQJCQlwTnVsbENvbnRleHQ7Ci0JUFRYX0NPTlRFWFQJCQlwUHNQb2xsQ29udGV4dDsKLQlQVFhfQ09OVEVYVAkJCXBSVFNDb250ZXh0OwotCVVJTlQJCQkJaSwgSWR4OwotLy8JdW5zaWduZWQgaW50IAkJSXJxRmxhZ3M7Ci0vLwlORElTX1NQSU5fTE9DSwkJKnBMb2NrOwotLy8JQk9PTEVBTgkJCQkqcFBlbmRpbmc7CisJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dDsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcE1MTUVDb250ZXh0OworCXN0cnVjdCBydF90eF9jb250ZXh0ICpwQmVhY29uQ29udGV4dDsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcE51bGxDb250ZXh0OworCXN0cnVjdCBydF90eF9jb250ZXh0ICpwUHNQb2xsQ29udGV4dDsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcFJUU0NvbnRleHQ7CisJdTMyIGksIElkeDsKKy8qICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgSXJxRmxhZ3M7ICovCisvKiAgICAgIHNwaW5sb2NrX3QgICAgICAgICAgKnBMb2NrOyAqLworLyogICAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICpwUGVuZGluZzsgKi8KIAorLyogICAgICBwTG9jayA9ICZwQWQtPkJ1bGtPdXRMb2NrW01HTVRQSVBFSURYXTsgKi8KKy8qICAgICAgcFBlbmRpbmcgPSAmcEFkLT5CdWxrT3V0UGVuZGluZ1tNR01UUElQRUlEWF07ICovCiAKLS8vCXBMb2NrID0gJnBBZC0+QnVsa091dExvY2tbTUdNVFBJUEVJRFhdOwotLy8JcFBlbmRpbmcgPSAmcEFkLT5CdWxrT3V0UGVuZGluZ1tNR01UUElQRUlEWF07Ci0KLQlmb3IgKElkeCA9IDA7IElkeCA8IDQ7IElkeCsrKQotCXsKKwlmb3IgKElkeCA9IDA7IElkeCA8IDQ7IElkeCsrKSB7CiAJCXBIVFRYQ29udGV4dCA9ICYocEFkLT5UeENvbnRleHRbSWR4XSk7CiAKLQkJaWYgKHBIVFRYQ29udGV4dC0+SVJQUGVuZGluZyA9PSBUUlVFKQotCQl7CisJCWlmIChwSFRUWENvbnRleHQtPklSUFBlbmRpbmcgPT0gVFJVRSkgewogCi0JCQkvLyBHZXQgdGhlIFVTQl9DT05URVhUIGFuZCBjYW5jZWwgaXQncyBJUlA7IHRoZSBjb21wbGV0aW9uIHJvdXRpbmUgd2lsbCBpdHNlbGYKLQkJCS8vIHJlbW92ZSBpdCBmcm9tIHRoZSBIZWFkUGVuZGluZ1NlbmRMaXN0IGFuZCBOVUxMIG91dCBIZWFkUGVuZGluZ1NlbmRMaXN0Ci0JCQkvLwl3aGVuIHRoZSBsYXN0IElSUCBvbiB0aGUgbGlzdCBoYXMgYmVlbgljYW5jZWxsZWQ7IHRoYXQncyBob3cgd2UgZXhpdCB0aGlzIGxvb3AKLQkJCS8vCisJCQkvKiBHZXQgdGhlIFVTQl9DT05URVhUIGFuZCBjYW5jZWwgaXQncyBJUlA7IHRoZSBjb21wbGV0aW9uIHJvdXRpbmUgd2lsbCBpdHNlbGYgKi8KKwkJCS8qIHJlbW92ZSBpdCBmcm9tIHRoZSBIZWFkUGVuZGluZ1NlbmRMaXN0IGFuZCBOVUxMIG91dCBIZWFkUGVuZGluZ1NlbmRMaXN0ICovCisJCQkvKiAgICAgIHdoZW4gdGhlIGxhc3QgSVJQIG9uIHRoZSBsaXN0IGhhcyBiZWVuICBjYW5jZWxsZWQ7IHRoYXQncyBob3cgd2UgZXhpdCB0aGlzIGxvb3AgKi8KKwkJCS8qICovCiAKIAkJCVJUVVNCX1VOTElOS19VUkIocEhUVFhDb250ZXh0LT5wVXJiKTsKIAotCQkJLy8gU2xlZXAgMjAwIG1pY3Jvc2Vjb25kcyB0byBnaXZlIGNhbmNlbGxhdGlvbiB0aW1lIHRvIHdvcmsKKwkJCS8qIFNsZWVwIDIwMCBtaWNyb3NlY29uZHMgdG8gZ2l2ZSBjYW5jZWxsYXRpb24gdGltZSB0byB3b3JrICovCiAJCQlSVE1QdXNlY0RlbGF5KDIwMCk7CiAJCX0KIAogCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW0lkeF0gPSBGQUxTRTsKIAl9CiAKLQkvL1JUTVBfSVJRX0xPQ0socExvY2ssIElycUZsYWdzKTsKLQlmb3IgKGkgPSAwOyBpIDwgTUdNVF9SSU5HX1NJWkU7IGkrKykKLQl7Ci0JCXBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVClwQWQtPk1nbXRSaW5nLkNlbGxbaV0uQWxsb2NWYTsKLQkJaWYocE1MTUVDb250ZXh0ICYmIChwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcgPT0gVFJVRSkpCi0JCXsKKwkvKlJUTVBfSVJRX0xPQ0socExvY2ssIElycUZsYWdzKTsgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUdNVF9SSU5HX1NJWkU7IGkrKykgeworCQlwTUxNRUNvbnRleHQgPSAoc3RydWN0IHJ0X3R4X2NvbnRleHQgKilwQWQtPk1nbXRSaW5nLkNlbGxbaV0uQWxsb2NWYTsKKwkJaWYgKHBNTE1FQ29udGV4dCAmJiAocE1MTUVDb250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpKSB7CiAKLQkJCS8vIEdldCB0aGUgVVNCX0NPTlRFWFQgYW5kIGNhbmNlbCBpdCdzIElSUDsgdGhlIGNvbXBsZXRpb24gcm91dGluZSB3aWxsIGl0c2VsZgotCQkJLy8gcmVtb3ZlIGl0IGZyb20gdGhlIEhlYWRQZW5kaW5nU2VuZExpc3QgYW5kIE5VTEwgb3V0IEhlYWRQZW5kaW5nU2VuZExpc3QKLQkJCS8vCXdoZW4gdGhlIGxhc3QgSVJQIG9uIHRoZSBsaXN0IGhhcyBiZWVuCWNhbmNlbGxlZDsgdGhhdCdzIGhvdyB3ZSBleGl0IHRoaXMgbG9vcAotCQkJLy8KKwkJCS8qIEdldCB0aGUgVVNCX0NPTlRFWFQgYW5kIGNhbmNlbCBpdCdzIElSUDsgdGhlIGNvbXBsZXRpb24gcm91dGluZSB3aWxsIGl0c2VsZiAqLworCQkJLyogcmVtb3ZlIGl0IGZyb20gdGhlIEhlYWRQZW5kaW5nU2VuZExpc3QgYW5kIE5VTEwgb3V0IEhlYWRQZW5kaW5nU2VuZExpc3QgKi8KKwkJCS8qICAgICAgd2hlbiB0aGUgbGFzdCBJUlAgb24gdGhlIGxpc3QgaGFzIGJlZW4gIGNhbmNlbGxlZDsgdGhhdCdzIGhvdyB3ZSBleGl0IHRoaXMgbG9vcCAqLworCQkJLyogKi8KIAogCQkJUlRVU0JfVU5MSU5LX1VSQihwTUxNRUNvbnRleHQtPnBVcmIpOwogCQkJcE1MTUVDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CiAKLQkJCS8vIFNsZWVwIDIwMCBtaWNyb3NlY3MgdG8gZ2l2ZSBjYW5jZWxsYXRpb24gdGltZSB0byB3b3JrCisJCQkvKiBTbGVlcCAyMDAgbWljcm9zZWNzIHRvIGdpdmUgY2FuY2VsbGF0aW9uIHRpbWUgdG8gd29yayAqLwogCQkJUlRNUHVzZWNEZWxheSgyMDApOwogCQl9CiAJfQogCXBBZC0+QnVsa091dFBlbmRpbmdbTUdNVFBJUEVJRFhdID0gRkFMU0U7Ci0JLy9SVE1QX0lSUV9VTkxPQ0socExvY2ssIElycUZsYWdzKTsKKwkvKlJUTVBfSVJRX1VOTE9DSyhwTG9jaywgSXJxRmxhZ3MpOyAqLwogCi0KLQlmb3IgKGkgPSAwOyBpIDwgQkVBQ09OX1JJTkdfU0laRTsgaSsrKQotCXsKKwlmb3IgKGkgPSAwOyBpIDwgQkVBQ09OX1JJTkdfU0laRTsgaSsrKSB7CiAJCXBCZWFjb25Db250ZXh0ID0gJihwQWQtPkJlYWNvbkNvbnRleHRbaV0pOwogCi0JCWlmKHBCZWFjb25Db250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpCi0JCXsKKwkJaWYgKHBCZWFjb25Db250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpIHsKIAotCQkJLy8gR2V0IHRoZSBVU0JfQ09OVEVYVCBhbmQgY2FuY2VsIGl0J3MgSVJQOyB0aGUgY29tcGxldGlvbiByb3V0aW5lIHdpbGwgaXRzZWxmCi0JCQkvLyByZW1vdmUgaXQgZnJvbSB0aGUgSGVhZFBlbmRpbmdTZW5kTGlzdCBhbmQgTlVMTCBvdXQgSGVhZFBlbmRpbmdTZW5kTGlzdAotCQkJLy8Jd2hlbiB0aGUgbGFzdCBJUlAgb24gdGhlIGxpc3QgaGFzIGJlZW4JY2FuY2VsbGVkOyB0aGF0J3MgaG93IHdlIGV4aXQgdGhpcyBsb29wCi0JCQkvLworCQkJLyogR2V0IHRoZSBVU0JfQ09OVEVYVCBhbmQgY2FuY2VsIGl0J3MgSVJQOyB0aGUgY29tcGxldGlvbiByb3V0aW5lIHdpbGwgaXRzZWxmICovCisJCQkvKiByZW1vdmUgaXQgZnJvbSB0aGUgSGVhZFBlbmRpbmdTZW5kTGlzdCBhbmQgTlVMTCBvdXQgSGVhZFBlbmRpbmdTZW5kTGlzdCAqLworCQkJLyogICAgICB3aGVuIHRoZSBsYXN0IElSUCBvbiB0aGUgbGlzdCBoYXMgYmVlbiAgY2FuY2VsbGVkOyB0aGF0J3MgaG93IHdlIGV4aXQgdGhpcyBsb29wICovCisJCQkvKiAqLwogCiAJCQlSVFVTQl9VTkxJTktfVVJCKHBCZWFjb25Db250ZXh0LT5wVXJiKTsKIAotCQkJLy8gU2xlZXAgMjAwIG1pY3Jvc2VjcyB0byBnaXZlIGNhbmNlbGxhdGlvbiB0aW1lIHRvIHdvcmsKKwkJCS8qIFNsZWVwIDIwMCBtaWNyb3NlY3MgdG8gZ2l2ZSBjYW5jZWxsYXRpb24gdGltZSB0byB3b3JrICovCiAJCQlSVE1QdXNlY0RlbGF5KDIwMCk7CiAJCX0KIAl9CkBAIC0xMjIzLDExICsxMjIwLDExIEBACiAJaWYgKHBQc1BvbGxDb250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpCiAJCVJUVVNCX1VOTElOS19VUkIocFBzUG9sbENvbnRleHQtPnBVcmIpOwogCi0JZm9yIChJZHggPSAwOyBJZHggPCA0OyBJZHgrKykKLQl7CisJZm9yIChJZHggPSAwOyBJZHggPCA0OyBJZHgrKykgewogCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrW0lkeF0pOwogCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW0lkeF0gPSBGQUxTRTsKIAkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1tJZHhdKTsKIAl9CiB9CiAKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0dXNiX2RhdGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0dXNiX2RhdGEuYwppbmRleCA2YjAwM2Y2Li40NTgzNzY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydHVzYl9kYXRhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfZGF0YS5jCkBAIC0zNiw4MiArMzYsMTAyIEBACiAJSmFuICAgICAgICAgICAgMDMtMjUtMjAwNiAgICBjcmVhdGVkCiAKICovCisKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwogI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgogCi1leHRlcm4gIFVDSEFSIFBoeTExQkdOZXh0UmF0ZVVwd2FyZFtdOyAvLyBkZWZpbmVkIGluIG1sbWUuYwotZXh0ZXJuIFVDSEFSCUVwVG9RdWV1ZVtdOworZXh0ZXJuIHU4IFBoeTExQkdOZXh0UmF0ZVVwd2FyZFtdOwkvKiBkZWZpbmVkIGluIG1sbWUuYyAqLworZXh0ZXJuIHU4IEVwVG9RdWV1ZVtdOwogCi1WT0lEIFJFUE9SVF9BTVNEVV9GUkFNRVNfVE9fTExDKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVMT05HCQkJRGF0YVNpemUpCit2b2lkIFJFUE9SVF9BTVNEVV9GUkFNRVNfVE9fTExDKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQl1OCAqcERhdGEsIHVuc2lnbmVkIGxvbmcgRGF0YVNpemUpCiB7Ci0JUE5ESVNfUEFDS0VUCXBQYWNrZXQ7Ci0JVUlOVAkJCW5NU0RVOwotCXN0cnVjdAkJCXNrX2J1ZmYgKnBTa2I7CisJdm9pZCAqcFBhY2tldDsKKwl1MzIgbk1TRFU7CisJc3RydWN0IHNrX2J1ZmYgKnBTa2I7CiAKIAluTVNEVSA9IDA7CiAJLyogYWxsb2NhdGUgYSByeCBwYWNrZXQgKi8KIAlwU2tiID0gZGV2X2FsbG9jX3NrYihSWF9CVUZGRVJfQUdHUkVTSVpFKTsKLQlwUGFja2V0ID0gKFBORElTX1BBQ0tFVClPU1BLVF9UT19SVFBLVChwU2tiKTsKLQlpZiAocFNrYikKLQl7CisJcFBhY2tldCA9ICh2b2lkICopT1NQS1RfVE9fUlRQS1QocFNrYik7CisJaWYgKHBTa2IpIHsKIAogCQkvKiBjb252ZXJ0IDgwMi4xMSB0byA4MDIuMyBwYWNrZXQgKi8KIAkJcFNrYi0+ZGV2ID0gZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgQlNTMCk7CiAJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UocFBhY2tldCwgUEtUU1JDX05ESVMpOwogCQlkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZShwQWQsIHBQYWNrZXQsIHBEYXRhLCBEYXRhU2l6ZSk7Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQ2FuJ3QgYWxsb2NhdGUgc2tiXG4iKSk7CisJfSBlbHNlIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQ2FuJ3QgYWxsb2NhdGUgc2tiXG4iKSk7CiAJfQogfQogCi1ORElTX1NUQVRVUwlSVFVTQkZyZWVEZXNjcmlwdG9yUmVxdWVzdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCUJ1bGtPdXRQaXBlSWQsCi0JSU4JVUlOVDMyCQkJTnVtYmVyUmVxdWlyZWQpCi17Ci0vLwlVQ0hBUgkJCUZyZWVOdW1iZXIgPSAwOwotLy8JVUlOVAkJCUluZGV4OwotCU5ESVNfU1RBVFVTCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwotCXVuc2lnbmVkIGxvbmcgICBJcnFGbGFnczsKLQlIVF9UWF9DT05URVhUCSpwSFRUWENvbnRleHQ7CisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJVGhpcyBzdWJyb3V0aW5lIHdpbGwgc2NhbiB0aHJvdWdoIHJlbGVhdGl2ZSByaW5nIGRlc2NyaXB0b3IgdG8gZmluZAorCQlvdXQgYXZhbGlhYmxlIGZyZWUgcmluZyBkZXNjcmlwdG9yIGFuZCBjb21wYXJlIHdpdGggcmVxdWVzdCBzaXplLgorCisJQXJndW1lbnRzOgorCQlwQWQJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgorCQlSaW5nVHlwZQlTZWxlY3RlZCBSaW5nCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX0ZBSUxVUkUJCU5vdCBlbm91Z2ggZnJlZSBkZXNjcmlwdG9yCisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MJCUVub3VnaCBmcmVlIGRlc2NyaXB0b3IKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgUlRVU0JGcmVlRGVzY3JpcHRvclJlcXVlc3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgICAgICB1OCBCdWxrT3V0UGlwZUlkLAorCQkJCSAgICAgICB1MzIgTnVtYmVyUmVxdWlyZWQpCit7CisvKiAgICAgIHU4ICAgICAgICAgICAgICAgICAgIEZyZWVOdW1iZXIgPSAwOyAqLworLyogICAgICB1MzIgICAgICAgICAgICAgICAgICAgIEluZGV4OyAqLworCWludCBTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CisJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dDsKIAogCXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtCdWxrT3V0UGlwZUlkXTsKIAlSVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOwotCWlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uIDwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSAmJiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIE51bWJlclJlcXVpcmVkICsgTE9DQUxfVFhCVUZfU0laRSkgPiBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24pKQotCXsKKwlpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA8IHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbikKKwkgICAgJiYKKwkgICAgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyBOdW1iZXJSZXF1aXJlZCArCisJICAgICAgTE9DQUxfVFhCVUZfU0laRSkgPiBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24pKSB7CiAKLQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIChmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwgPDwgQnVsa091dFBpcGVJZCkpOwotCX0KLQllbHNlIGlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID09IDgpICYmIChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPCAoTnVtYmVyUmVxdWlyZWQgKyBMT0NBTF9UWEJVRl9TSVpFKSkpCi0JewotCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBCdWxrT3V0UGlwZUlkKSk7Ci0JfQotCWVsc2UgaWYgKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gVFJVRSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRVU0JGcmVlRCBjMyAtLT4gUXVlSWR4PSVkLCBDV1Bvcz0lbGQsIE5CT3V0UG9zPSVsZCFcbiIsIEJ1bGtPdXRQaXBlSWQsIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSk7Ci0JCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IEJ1bGtPdXRQaXBlSWQpKTsKLQl9Ci0JZWxzZQotCXsKKwkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsCisJCQkJICAgIChmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwgPDwKKwkJCQkgICAgIEJ1bGtPdXRQaXBlSWQpKTsKKwl9IGVsc2UgaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPT0gOCkKKwkJICAgJiYgKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA8CisJCSAgICAgICAoTnVtYmVyUmVxdWlyZWQgKyBMT0NBTF9UWEJVRl9TSVpFKSkpIHsKKwkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsCisJCQkJICAgIChmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwgPDwKKwkJCQkgICAgIEJ1bGtPdXRQaXBlSWQpKTsKKwl9IGVsc2UgaWYgKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gVFJVRSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlJUVVNCRnJlZUQgYzMgLS0+IFF1ZUlkeD0lZCwgQ1dQb3M9JWxkLCBOQk91dFBvcz0lbGQhXG4iLAorCQkJICBCdWxrT3V0UGlwZUlkLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sCisJCQkgIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbikpOworCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwKKwkJCQkgICAgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PAorCQkJCSAgICAgQnVsa091dFBpcGVJZCkpOworCX0gZWxzZSB7CiAJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiAJfQogCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKIAotCiAJcmV0dXJuIChTdGF0dXMpOwogfQogCi1ORElTX1NUQVRVUyBSVFVTQkZyZWVEZXNjcmlwdG9yUmVsZWFzZSgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBVQ0hBUgkJQnVsa091dFBpcGVJZCkKK2ludCBSVFVTQkZyZWVEZXNjcmlwdG9yUmVsZWFzZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgICAgIHU4IEJ1bGtPdXRQaXBlSWQpCiB7Ci0JdW5zaWduZWQgbG9uZyAgIElycUZsYWdzOwotCUhUX1RYX0NPTlRFWFQJKnBIVFRYQ29udGV4dDsKKwl1bnNpZ25lZCBsb25nIElycUZsYWdzOworCXN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQ7CiAKIAlwSFRUWENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbQnVsa091dFBpcGVJZF07CiAJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKQEAgLTEyMSwyOCArMTQxLDMyIEBACiAJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKIH0KIAotCi1CT09MRUFOCVJUVVNCTmVlZFF1ZXVlQmFja0ZvckFnZygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBVQ0hBUgkJQnVsa091dFBpcGVJZCkKK0JPT0xFQU4gUlRVU0JOZWVkUXVldWVCYWNrRm9yQWdnKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggQnVsa091dFBpcGVJZCkKIHsKLQl1bnNpZ25lZCBsb25nICAgSXJxRmxhZ3M7Ci0JSFRfVFhfQ09OVEVYVAkqcEhUVFhDb250ZXh0OwotCUJPT0xFQU4JCQluZWVkUXVlQmFjayA9IEZBTFNFOworCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CisJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dDsKKwlCT09MRUFOIG5lZWRRdWVCYWNrID0gRkFMU0U7CiAKIAlwSFRUWENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbQnVsa091dFBpcGVJZF07CiAKIAlSVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOwotCWlmICgocEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpICAvKiYmIChwQWQtPlR4U3dRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPT0gMCkgKi8pCi0JewotCQlpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA8IHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24pICYmCi0JCQkoKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uK01BWF9BR0dSRUdBVElPTl9TSVpFKSA8IE1BWF9UWEJVTEtfTElNSVQpIHx8IChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPiBNQVhfQUdHUkVHQVRJT05fU0laRSkpKQotCQl7CisJaWYgKChwSFRUWENvbnRleHQtPklSUFBlbmRpbmcgPT0KKwkgICAgIFRSVUUpIC8qJiYgKHBBZC0+VHhTd1F1ZXVlW0J1bGtPdXRQaXBlSWRdLk51bWJlciA9PSAwKSAqLyApIHsKKwkJaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPAorCQkgICAgIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24pCisJCSAgICAmJgorCQkgICAgKCgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiArCisJCSAgICAgICBNQVhfQUdHUkVHQVRJT05fU0laRSkgPCBNQVhfVFhCVUxLX0xJTUlUKQorCQkgICAgIHx8IChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPgorCQkJIE1BWF9BR0dSRUdBVElPTl9TSVpFKSkpIHsKIAkJCW5lZWRRdWVCYWNrID0gVFJVRTsKLQkJfQotCQllbHNlIGlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID4gcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbikgJiYKLQkJCQkgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICsgTUFYX0FHR1JFR0FUSU9OX1NJWkUpIDwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSkKLQkJeworCQl9IGVsc2UKKwkJICAgIGlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID4KKwkJCSBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uKQorCQkJJiYKKwkJCSgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiArCisJCQkgIE1BWF9BR0dSRUdBVElPTl9TSVpFKSA8CisJCQkgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSkgewogCQkJbmVlZFF1ZUJhY2sgPSBUUlVFOwogCQl9CiAJfQpAQCAtMTUyLDcgKzE3Niw2IEBACiAKIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0xNjgsMjEgKzE5MSwxNyBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVFVTQlJlamVjdFBlbmRpbmdQYWNrZXRzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQordm9pZCBSVFVTQlJlamVjdFBlbmRpbmdQYWNrZXRzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlVQ0hBUgkJCUluZGV4OwotCVBRVUVVRV9FTlRSWQlwRW50cnk7Ci0JUE5ESVNfUEFDS0VUCXBQYWNrZXQ7Ci0JUFFVRVVFX0hFQURFUglwUXVldWU7CisJdTggSW5kZXg7CisJc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICpwRW50cnk7CisJdm9pZCAqcFBhY2tldDsKKwlzdHJ1Y3QgcnRfcXVldWVfaGVhZGVyICpwUXVldWU7CiAKLQotCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IDQ7IEluZGV4KyspCi0JeworCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IDQ7IEluZGV4KyspIHsKIAkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5UeFN3UXVldWVMb2NrW0luZGV4XSk7Ci0JCXdoaWxlIChwQWQtPlR4U3dRdWV1ZVtJbmRleF0uSGVhZCAhPSBOVUxMKQotCQl7Ci0JCQlwUXVldWUgPSAoUFFVRVVFX0hFQURFUikgJihwQWQtPlR4U3dRdWV1ZVtJbmRleF0pOworCQl3aGlsZSAocEFkLT5UeFN3UXVldWVbSW5kZXhdLkhlYWQgIT0gTlVMTCkgeworCQkJcFF1ZXVlID0gKHN0cnVjdCBydF9xdWV1ZV9oZWFkZXIgKikmIChwQWQtPlR4U3dRdWV1ZVtJbmRleF0pOwogCQkJcEVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKHBRdWV1ZSk7CiAJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBFbnRyeSk7CiAJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CkBAIC0xOTMsMjAgKzIxMiw0NiBAQAogCiB9CiAKLVZPSUQgUlRNUFdyaXRlVHhJbmZvKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBUWElORk9fU1RSVUMgCXBUeEluZm8sCi0JSU4JICBVU0hPUlQJCVVTQkRNQXBrdExlbiwKLQlJTgkgIEJPT0xFQU4JCWJXaXYsCi0JSU4JICBVQ0hBUgkJCVF1ZXVlU2VsLAotCUlOCSAgVUNIQVIJCQlOZXh0VmFsaWQsCi0JSU4JICBVQ0hBUgkJCVR4QnVyc3QpCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ2FsY3VsYXRlcyB0aGUgZHVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gdHJhbnNtaXQgb3V0IGZyYW1lcworCXdpdGggZ2l2ZW4gc2l6ZSBhbmQgc3BlY2lmaWVkIHJhdGUuCisKKwlBcmd1bWVudHM6CisJCXBUeEQJCVBvaW50ZXIgdG8gdHJhbnNtaXQgZGVzY3JpcHRvcgorCQlBY2sJCQlTZXR0aW5nIGZvciBBY2sgcmVxdWlyZW1lbnQgYml0CisJCUZyYWdtZW50CVNldHRpbmcgZm9yIEZyYWdtZW50IGJpdAorCQlSZXRyeU1vZGUJU2V0dGluZyBmb3IgcmV0cnkgbW9kZQorCQlJZnMJCQlTZXR0aW5nIGZvciBJRlMgZ2FwCisJCVJhdGUJCVNldHRpbmcgZm9yIHRyYW5zbWl0IHJhdGUKKwkJU2VydmljZQkJU2V0dGluZyBmb3Igc2VydmljZQorCQlMZW5ndGgJCUZyYW1lIGxlbmd0aAorCQlUeFByZWFtYmxlICBTaG9ydCBvciBMb25nIHByZWFtYmxlIHdoZW4gdXNpbmcgQ0NLIHJhdGVzCisJCVF1ZUlkeCAtIDAtMywgYWNjb3JkaW5nIHRvIDgwMi4xMWUvZDQuNCBKdW5lLzIwMDMKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKwordm9pZCBSVE1QV3JpdGVUeEluZm8oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgIHN0cnVjdCBydF90eGluZm8gKnBUeEluZm8sCisJCSAgICAgdTE2IFVTQkRNQXBrdExlbiwKKwkJICAgICBJTiBCT09MRUFOIGJXaXYsCisJCSAgICAgdTggUXVldWVTZWwsIHU4IE5leHRWYWxpZCwgdTggVHhCdXJzdCkKIHsKIAlwVHhJbmZvLT5VU0JETUFUeFBrdExlbiA9IFVTQkRNQXBrdExlbjsKIAlwVHhJbmZvLT5RU0VMID0gUXVldWVTZWw7CiAJaWYgKFF1ZXVlU2VsICE9IEZJRk9fRURDQSkKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gUXVldWVTZWwgIT0gRklGT19FRENBPD09PT09PT09PT09PVxuIikpOwotCXBUeEluZm8tPlVTQkRNQU5leHRWTEQgPSBGQUxTRTsgLy9OZXh0VmFsaWQ7ICAvLyBOZWVkIHRvIGNoZWNrIHdpdGggSmFuIGFib3V0IHRoaXMuCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiPT09PT4gUXVldWVTZWwgIT0gRklGT19FRENBPD09PT09PT09PT09PVxuIikpOworCXBUeEluZm8tPlVTQkRNQU5leHRWTEQgPSBGQUxTRTsJLypOZXh0VmFsaWQ7ICAvLyBOZWVkIHRvIGNoZWNrIHdpdGggSmFuIGFib3V0IHRoaXMuICovCiAJcFR4SW5mby0+VVNCRE1BVHhidXJzdCA9IFR4QnVyc3Q7CiAJcFR4SW5mby0+V0lWID0gYldpdjsKIAlwVHhJbmZvLT5Td1VzZUxhc3RSb3VuZCA9IDA7CkBAIC0yMTQsMyArMjU5LDQgQEAKIAlwVHhJbmZvLT5yc3YyID0gMDsKIH0KIAorI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0dXNiX2lvLmMKaW5kZXggMWQ2OTU5MC4uMzQ0NDNmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydHVzYl9pby5jCkBAIC0zNiw4ICszNiw5IEBACiAJUGF1bCBMaW4gICAgMDYtMjUtMjAwNCAgY3JlYXRlZAogKi8KIAotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorI2lmZGVmIFJUTVBfTUFDX1VTQgogCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC01NSwyNiArNTYsMTggQEAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCiAKLU5UU1RBVFVTCVJUVVNCRmlybXdhcmVSdW4oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCitzdGF0aWMgaW50IFJUVVNCRmlybXdhcmVSdW4oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCU5UU1RBVFVTCVN0YXR1czsKKwlpbnQgU3RhdHVzOwogCi0JU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdCgKLQkJcEFkLAotCQlVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9PVVQsCi0JCURFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQsCi0JCTB4MDEsCi0JCTB4OCwKLQkJMCwKLQkJTlVMTCwKLQkJMCk7CisJU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdChwQWQsCisJCQkJICAgICBVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9PVVQsCisJCQkJICAgICBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAorCQkJCSAgICAgMHgwMSwgMHg4LCAwLCBOVUxMLCAwKTsKIAogCXJldHVybiBTdGF0dXM7CiB9CiAKLQotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC05MCwxOSArODMsMTYgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLU5UU1RBVFVTIFJUVVNCRmlybXdhcmVXcml0ZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIJCXBGd0ltYWdlLAotCUlOIFVMT05HCQlGd0xlbikKK2ludCBSVFVTQkZpcm13YXJlV3JpdGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHU4ICpwRndJbWFnZSwgdW5zaWduZWQgbG9uZyBGd0xlbikKIHsKLQlVSU5UMzIJCU1hY1JlZzsKLQlOVFNUQVRVUyAJU3RhdHVzOwotLy8JVUxPTkcgCQlpOwotCVVTSE9SVAkJd3JpdGVMZW47CisJdTMyIE1hY1JlZzsKKwlpbnQgU3RhdHVzOworLyogICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBpOyAqLworCXUxNiB3cml0ZUxlbjsKIAogCVN0YXR1cyA9IFJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgTUFDX0NTUjAsICZNYWNSZWcpOwogCi0KIAl3cml0ZUxlbiA9IEZ3TGVuOwogCVJUVVNCTXVsdGlXcml0ZShwQWQsIEZJUk1XQVJFX0lNQUdFX0JBU0UsIHBGd0ltYWdlLCB3cml0ZUxlbik7CiAKQEAgLTExMCw2NiArMTAwLDI4IEBACiAJU3RhdHVzID0gUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgMHg3MDFjLCAweGZmZmZmZmZmKTsKIAlTdGF0dXMgPSBSVFVTQkZpcm13YXJlUnVuKHBBZCk7CiAKKwkvKjIwMDgvMTEvMjg6S0ggYWRkIHRvIGZpeCB0aGUgZGVhZCByZiBmcmVxdWVuY3kgb2Zmc2V0IGJ1ZzwtLSAqLwogCVJUTVB1c2VjRGVsYXkoMTAwMDApOwotCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsSDJNX01BSUxCT1hfQ1NSLDApOwotCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg3MiwgMHgwMCwgMHgwMCwgMHgwMCk7Ly9yZXNldCByZiBieSBNQ1Ugc3VwcG9ydGVkIGJ5IG5ldyBmaXJtd2FyZQorCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIEgyTV9NQUlMQk9YX0NTUiwgMCk7CisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDcyLCAweDAwLCAweDAwLCAweDAwKTsJLypyZXNldCByZiBieSBNQ1Ugc3VwcG9ydGVkIGJ5IG5ldyBmaXJtd2FyZSAqLworCS8qMjAwOC8xMS8yODpLSCBhZGQgdG8gZml4IHRoZSBkZWFkIHJmIGZyZXF1ZW5jeSBvZmZzZXQgYnVnLS0+ICovCiAKIAlyZXR1cm4gU3RhdHVzOwogfQogCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOiBHZXQgY3VycmVudCBmaXJtd2FyZSBvcGVyYXRpb24gbW9kZSAoUmV0dXJuIFZhbHVlKQotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCQkwIG9yIDEgPSBEb3dubG9hZGVkIGJ5IGhvc3QgZHJpdmVyCi0JCW90aGVycyA9IERyaXZlciBkb2Vzbid0IGRvd25sb2FkIGZpcm13YXJlCi0KLQlJUlFMID0KLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1OVFNUQVRVUwlSVFVTQkZpcm13YXJlT3Btb2RlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUlOVDMyCQkJcFZhbHVlKQoraW50IFJUVVNCVmVuZGVyUmVzZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCU5UU1RBVFVTCVN0YXR1czsKLQotCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCi0JCXBBZCwKLQkJKFVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX0lOIHwgVVNCRF9TSE9SVF9UUkFOU0ZFUl9PSyksCi0JCURFVklDRV9WRU5ET1JfUkVRVUVTVF9JTiwKLQkJMHgxLAotCQkweDExLAotCQkwLAotCQlwVmFsdWUsCi0JCTQpOwotCXJldHVybiBTdGF0dXM7Ci19Ci1OVFNUQVRVUwlSVFVTQlZlbmRlclJlc2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCU5UU1RBVFVTCVN0YXR1czsKKwlpbnQgU3RhdHVzOwogCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCItLT5SVFVTQlZlbmRlclJlc2V0XG4iKSk7Ci0JU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdCgKLQkJcEFkLAotCQlVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9PVVQsCi0JCURFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQsCi0JCTB4MDEsCi0JCTB4MSwKLQkJMCwKLQkJTlVMTCwKLQkJMCk7CisJU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdChwQWQsCisJCQkJICAgICBVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9PVVQsCisJCQkJICAgICBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAorCQkJCSAgICAgMHgwMSwgMHgxLCAwLCBOVUxMLCAwKTsKIAogCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCI8LS1SVFVTQlZlbmRlclJlc2V0XG4iKSk7CiAJcmV0dXJuIFN0YXR1czsKIH0KKwogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMTg1LDIzICsxMzcsMTYgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLU5UU1RBVFVTCVJUVVNCTXVsdGlSZWFkKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVAkJCU9mZnNldCwKLQlPVVQJUFVDSEFSCQkJcERhdGEsCi0JSU4JVVNIT1JUCQkJbGVuZ3RoKQoraW50IFJUVVNCTXVsdGlSZWFkKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCXUxNiBPZmZzZXQsIHU4ICpwRGF0YSwgdTE2IGxlbmd0aCkKIHsKLQlOVFNUQVRVUwlTdGF0dXM7CisJaW50IFN0YXR1czsKIAotCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCi0JCXBBZCwKLQkJKFVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX0lOIHwgVVNCRF9TSE9SVF9UUkFOU0ZFUl9PSyksCi0JCURFVklDRV9WRU5ET1JfUkVRVUVTVF9JTiwKLQkJMHg3LAotCQkwLAotCQlPZmZzZXQsCi0JCXBEYXRhLAotCQlsZW5ndGgpOworCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QocEFkLAorCQkJCSAgICAgKFVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX0lOIHwKKwkJCQkgICAgICBVU0JEX1NIT1JUX1RSQU5TRkVSX09LKSwKKwkJCQkgICAgIERFVklDRV9WRU5ET1JfUkVRVUVTVF9JTiwgMHg3LCAwLCBPZmZzZXQsCisJCQkJICAgICBwRGF0YSwgbGVuZ3RoKTsKIAogCXJldHVybiBTdGF0dXM7CiB9CkBAIC0yMjEsNzcgKzE2Niw1NiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotTlRTVEFUVVMJUlRVU0JNdWx0aVdyaXRlX09uZUJ5dGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCUlOCVBVQ0hBUgkJCXBEYXRhKQoraW50IFJUVVNCTXVsdGlXcml0ZV9PbmVCeXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgdTE2IE9mZnNldCwgdTggKnBEYXRhKQogewotCU5UU1RBVFVTCVN0YXR1czsKKwlpbnQgU3RhdHVzOwogCi0JLy8gVE9ETzogSW4gMjg3MCwgdXNlIHRoaXMgZnVuY2l0b24gY2FyZWZ1bGx5IGNhdXNlIGl0J3Mgbm90IHN0YWJsZS4KLQlTdGF0dXMgPSBSVFVTQl9WZW5kb3JSZXF1ZXN0KAotCQlwQWQsCi0JCVVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX09VVCwKLQkJREVWSUNFX1ZFTkRPUl9SRVFVRVNUX09VVCwKLQkJMHg2LAotCQkwLAotCQlPZmZzZXQsCi0JCXBEYXRhLAotCQkxKTsKKwkvKiBUT0RPOiBJbiAyODcwLCB1c2UgdGhpcyBmdW5jaXRvbiBjYXJlZnVsbHkgY2F1c2UgaXQncyBub3Qgc3RhYmxlLiAqLworCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QocEFkLAorCQkJCSAgICAgVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VULAorCQkJCSAgICAgREVWSUNFX1ZFTkRPUl9SRVFVRVNUX09VVCwKKwkJCQkgICAgIDB4NiwgMCwgT2Zmc2V0LCBwRGF0YSwgMSk7CiAKIAlyZXR1cm4gU3RhdHVzOwogfQogCi1OVFNUQVRVUwlSVFVTQk11bHRpV3JpdGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVTSE9SVAkJCWxlbmd0aCkKK2ludCBSVFVTQk11bHRpV3JpdGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHUxNiBPZmZzZXQsIHU4ICpwRGF0YSwgdTE2IGxlbmd0aCkKIHsKLQlOVFNUQVRVUwlTdGF0dXM7CisJaW50IFN0YXR1czsKIAorCXUxNiBpbmRleCA9IDAsIFZhbHVlOworCXU4ICpwU3JjID0gcERhdGE7CisJdTE2IHJlc3VkZSA9IDA7CiAKLSAgICAgICAgVVNIT1JUICAgICAgICAgIGluZGV4ID0gMCxWYWx1ZTsKLSAgICAgICAgUFVDSEFSICAgICAgICAgIHBTcmMgPSBwRGF0YTsKLSAgICAgICAgVVNIT1JUICAgICAgICAgIHJlc3VkZSA9IDA7Ci0KLSAgICAgICAgcmVzdWRlID0gbGVuZ3RoICUgMjsKLQkJbGVuZ3RoICArPSByZXN1ZGU7Ci0JCWRvCi0JCXsKLQkJCVZhbHVlID0oVVNIT1JUKSggKnBTcmMgIHwgKCoocFNyYyArIDEpIDw8IDgpKTsKLQkJU3RhdHVzID0gUlRVU0JTaW5nbGVXcml0ZShwQWQsT2Zmc2V0ICsgaW5kZXgsVmFsdWUpOwotICAgICAgICAgICAgaW5kZXggKz0yOwotICAgICAgICAgICAgbGVuZ3RoIC09IDI7Ci0gICAgICAgICAgICBwU3JjID0gcFNyYyArIDI7Ci0gICAgICAgIH13aGlsZShsZW5ndGggPiAwKTsKKwlyZXN1ZGUgPSBsZW5ndGggJSAyOworCWxlbmd0aCArPSByZXN1ZGU7CisJZG8geworCQlWYWx1ZSA9ICh1MTYpKCpwU3JjIHwgKCoocFNyYyArIDEpIDw8IDgpKTsKKwkJU3RhdHVzID0gUlRVU0JTaW5nbGVXcml0ZShwQWQsIE9mZnNldCArIGluZGV4LCBWYWx1ZSk7CisJCWluZGV4ICs9IDI7CisJCWxlbmd0aCAtPSAyOworCQlwU3JjID0gcFNyYyArIDI7CisJfSB3aGlsZSAobGVuZ3RoID4gMCk7CiAKIAlyZXR1cm4gU3RhdHVzOwogfQogCi0KLU5UU1RBVFVTIFJUVVNCU2luZ2xlV3JpdGUoCi0JSU4gCVJUTVBfQURBUFRFUiAJKnBBZCwKLQlJTglVU0hPUlQJCQlPZmZzZXQsCi0JSU4JVVNIT1JUCQkJVmFsdWUpCitpbnQgUlRVU0JTaW5nbGVXcml0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgIHUxNiBPZmZzZXQsIHUxNiBWYWx1ZSkKIHsKLQlOVFNUQVRVUwlTdGF0dXM7CisJaW50IFN0YXR1czsKIAotCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCi0JCXBBZCwKLQkJVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VULAotCQlERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAotCQkweDIsCi0JCVZhbHVlLAotCQlPZmZzZXQsCi0JCU5VTEwsCi0JCTApOworCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QocEFkLAorCQkJCSAgICAgVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VULAorCQkJCSAgICAgREVWSUNFX1ZFTkRPUl9SRVFVRVNUX09VVCwKKwkJCQkgICAgIDB4MiwgVmFsdWUsIE9mZnNldCwgTlVMTCwgMCk7CiAKIAlyZXR1cm4gU3RhdHVzOwogCiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMzA3LDM0ICsyMzEsMjYgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLU5UU1RBVFVTCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVAkJCU9mZnNldCwKLQlPVVQJUFVJTlQzMgkJCXBWYWx1ZSkKK2ludCBSVFVTQlJlYWRNQUNSZWdpc3RlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICB1MTYgT2Zmc2V0LCB1MzIgKnBWYWx1ZSkKIHsKLQlOVFNUQVRVUwlTdGF0dXM7Ci0JVUlOVDMyCQlsb2NhbFZhbDsKKwlpbnQgU3RhdHVzID0gMDsKKwl1MzIgbG9jYWxWYWw7CiAKLQlTdGF0dXMgPSBSVFVTQl9WZW5kb3JSZXF1ZXN0KAotCQlwQWQsCi0JCShVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9JTiB8IFVTQkRfU0hPUlRfVFJBTlNGRVJfT0spLAotCQlERVZJQ0VfVkVORE9SX1JFUVVFU1RfSU4sCi0JCTB4NywKLQkJMCwKLQkJT2Zmc2V0LAotCQkmbG9jYWxWYWwsCi0JCTQpOworCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QocEFkLAorCQkJCSAgICAgKFVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX0lOIHwKKwkJCQkgICAgICBVU0JEX1NIT1JUX1RSQU5TRkVSX09LKSwKKwkJCQkgICAgIERFVklDRV9WRU5ET1JfUkVRVUVTVF9JTiwgMHg3LCAwLCBPZmZzZXQsCisJCQkJICAgICAmbG9jYWxWYWwsIDQpOwogCiAJKnBWYWx1ZSA9IGxlMmNwdTMyKGxvY2FsVmFsKTsKIAotCiAJaWYgKFN0YXR1cyA8IDApCiAJCSpwVmFsdWUgPSAweGZmZmZmZmZmOwogCiAJcmV0dXJuIFN0YXR1czsKIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0zNTAsMjUgKzI2NiwyMiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotTlRTVEFUVVMJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVAkJCU9mZnNldCwKLQlJTglVSU5UMzIJCQlWYWx1ZSkKK2ludCBSVFVTQldyaXRlTUFDUmVnaXN0ZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgIHUxNiBPZmZzZXQsIHUzMiBWYWx1ZSkKIHsKLQlOVFNUQVRVUwlTdGF0dXM7Ci0JVUlOVDMyCQlsb2NhbFZhbDsKKwlpbnQgU3RhdHVzOworCXUzMiBsb2NhbFZhbDsKIAogCWxvY2FsVmFsID0gVmFsdWU7CiAKLQlTdGF0dXMgPSBSVFVTQlNpbmdsZVdyaXRlKHBBZCwgT2Zmc2V0LCAoVVNIT1JUKShsb2NhbFZhbCAmIDB4ZmZmZikpOwotCVN0YXR1cyA9IFJUVVNCU2luZ2xlV3JpdGUocEFkLCBPZmZzZXQgKyAyLCAoVVNIT1JUKSgobG9jYWxWYWwgJiAweGZmZmYwMDAwKSA+PiAxNikpOworCVN0YXR1cyA9IFJUVVNCU2luZ2xlV3JpdGUocEFkLCBPZmZzZXQsICh1MTYpKGxvY2FsVmFsICYgMHhmZmZmKSk7CisJU3RhdHVzID0KKwkgICAgUlRVU0JTaW5nbGVXcml0ZShwQWQsIE9mZnNldCArIDIsCisJCQkgICAgICh1MTYpKChsb2NhbFZhbCAmIDB4ZmZmZjAwMDApID4+IDE2KSk7CiAKIAlyZXR1cm4gU3RhdHVzOwogfQogCi0KLQotI2lmIDEKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTM4NCwxMzkgKzI5Nyw3NyBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotTlRTVEFUVVMJUlRVU0JSZWFkQkJQUmVnaXN0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlJZCwKLQlJTglQVUNIQVIJCQlwVmFsdWUpCitpbnQgUlRVU0JSZWFkQkJQUmVnaXN0ZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgdTggSWQsIHU4ICpwVmFsdWUpCiB7Ci0JQkJQX0NTUl9DRkdfU1RSVUMJQmJwQ3NyOwotCVVJTlQJCQlpID0gMDsKLQlOVFNUQVRVUwkJc3RhdHVzOworCUJCUF9DU1JfQ0ZHX1NUUlVDIEJicENzcjsKKwl1MzIgaSA9IDA7CisJaW50IHN0YXR1czsKIAotCS8vIFZlcmlmeSB0aGUgYnVzeSBjb25kaXRpb24KLQlkbwotCXsKKwkvKiBWZXJpZnkgdGhlIGJ1c3kgY29uZGl0aW9uICovCisJZG8gewogCQlzdGF0dXMgPSBSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIEJCUF9DU1JfQ0ZHLCAmQmJwQ3NyLndvcmQpOwotCQlpZihzdGF0dXMgPj0gMCkKLQkJewotCQlpZiAoIShCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSkKLQkJCWJyZWFrOworCQlpZiAoc3RhdHVzID49IDApIHsKKwkJCWlmICghKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpKQorCQkJCWJyZWFrOwogCQl9Ci0JCXByaW50aygiUlRVU0JSZWFkQkJQUmVnaXN0ZXIoQkJQX0NTUl9DRkdfMSk6cmV0cnkgY291bnQ9JWQhXG4iLCBpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJSVFVTQlJlYWRCQlBSZWdpc3RlcihCQlBfQ1NSX0NGR18xKTpyZXRyeSBjb3VudD0lZCFcbiIsCisJCQkgIGkpKTsKIAkJaSsrOwotCX0KLQl3aGlsZSAoKGkgPCBSRVRSWV9MSU1JVCkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKTsKKwl9IHdoaWxlICgoaSA8IFJFVFJZX0xJTUlUKQorCQkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKTsKIAotCWlmICgoaSA9PSBSRVRSWV9MSU1JVCkgfHwgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCi0JewotCQkvLwotCQkvLyBSZWFkIGZhaWxlZCB0aGVuIFJldHVybiBEZWZhdWx0IHZhbHVlLgotCQkvLworCWlmICgoaSA9PSBSRVRSWV9MSU1JVCkKKwkgICAgfHwgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpIHsKKwkJLyogKi8KKwkJLyogUmVhZCBmYWlsZWQgdGhlbiBSZXR1cm4gRGVmYXVsdCB2YWx1ZS4gKi8KKwkJLyogKi8KIAkJKnBWYWx1ZSA9IHBBZC0+QmJwV3JpdGVMYXRjaFtJZF07CiAKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlJldHJ5IGNvdW50IGV4aGF1c3RlZCBvciBkZXZpY2UgcmVtb3ZlZCEhIVxuIikpOworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsCisJCQkgICAgICgiUmV0cnkgY291bnQgZXhoYXVzdGVkIG9yIGRldmljZSByZW1vdmVkISEhXG4iKSk7CiAJCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOwogCX0KLQotCS8vIFByZXBhcmUgZm9yIHdyaXRlIG1hdGVyaWFsCi0JQmJwQ3NyLndvcmQgCQkJCT0gMDsKLQlCYnBDc3IuZmllbGQuZlJlYWQJCQk9IDE7Ci0JQmJwQ3NyLmZpZWxkLkJ1c3kJCQk9IDE7Ci0JQmJwQ3NyLmZpZWxkLlJlZ051bSAJCT0gSWQ7CisJLyogUHJlcGFyZSBmb3Igd3JpdGUgbWF0ZXJpYWwgKi8KKwlCYnBDc3Iud29yZCA9IDA7CisJQmJwQ3NyLmZpZWxkLmZSZWFkID0gMTsKKwlCYnBDc3IuZmllbGQuQnVzeSA9IDE7CisJQmJwQ3NyLmZpZWxkLlJlZ051bSA9IElkOwogCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIEJCUF9DU1JfQ0ZHLCBCYnBDc3Iud29yZCk7CiAKIAlpID0gMDsKLQkvLyBWZXJpZnkgdGhlIGJ1c3kgY29uZGl0aW9uCi0JZG8KLQl7CisJLyogVmVyaWZ5IHRoZSBidXN5IGNvbmRpdGlvbiAqLworCWRvIHsKIAkJc3RhdHVzID0gUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBCQlBfQ1NSX0NGRywgJkJicENzci53b3JkKTsKLQkJaWYgKHN0YXR1cyA+PSAwKQotCQl7Ci0JCWlmICghKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpKQotCQl7Ci0JCQkqcFZhbHVlID0gKFVDSEFSKUJicENzci5maWVsZC5WYWx1ZTsKLQkJCWJyZWFrOwotCQl9Ci0JCX0KLQkJcHJpbnRrKCJSVFVTQlJlYWRCQlBSZWdpc3RlcihCQlBfQ1NSX0NGR18yKTpyZXRyeSBjb3VudD0lZCFcbiIsIGkpOwotCQlpKys7Ci0JfQotCXdoaWxlICgoaSA8IFJFVFJZX0xJTUlUKSAmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpOwotCi0JaWYgKChpID09IFJFVFJZX0xJTUlUKSB8fCAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKLQl7Ci0JCS8vCi0JCS8vIFJlYWQgZmFpbGVkIHRoZW4gUmV0dXJuIERlZmF1bHQgdmFsdWUuCi0JCS8vCi0JCSpwVmFsdWUgPSBwQWQtPkJicFdyaXRlTGF0Y2hbSWRdOwotCi0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSZXRyeSBjb3VudCBleGhhdXN0ZWQgb3IgZGV2aWNlIHJlbW92ZWQhISFcbiIpKTsKLQkJcmV0dXJuIFNUQVRVU19VTlNVQ0NFU1NGVUw7Ci0JfQotCi0JcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotfQotI2Vsc2UKLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOiBSZWFkIDgtYml0IEJCUCByZWdpc3RlciB2aWEgZmlybXdhcmUKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCUlSUUwgPQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5UU1RBVFVTCVJUVVNCUmVhZEJCUFJlZ2lzdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJSWQsCi0JSU4JUFVDSEFSCQkJcFZhbHVlKQotewotCUJCUF9DU1JfQ0ZHX1NUUlVDCUJicENzcjsKLQlpbnQJCQkJCWksIGs7Ci0JZm9yIChpPTA7IGk8TUFYX0JVU1lfQ09VTlQ7IGkrKykKLQl7Ci0JCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsKLQkJaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpCi0JCXsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCUJicENzci53b3JkID0gMDsKLQkJQmJwQ3NyLmZpZWxkLmZSZWFkID0gMTsKLQkJQmJwQ3NyLmZpZWxkLkJCUF9SV19NT0RFID0gMTsKLQkJQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOwotCQlCYnBDc3IuZmllbGQuUmVnTnVtID0gSWQ7Ci0JCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIEgyTV9CQlBfQUdFTlQsIEJicENzci53b3JkKTsKLQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDgwLCAweGZmLCAweDAsIDB4MCk7Ci0JCWZvciAoaz0wOyBrPE1BWF9CVVNZX0NPVU5UOyBrKyspCi0JCXsKLQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsKLQkJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKQorCQlpZiAoc3RhdHVzID49IDApIHsKKwkJCWlmICghKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpKSB7CisJCQkJKnBWYWx1ZSA9ICh1OClCYnBDc3IuZmllbGQuVmFsdWU7CiAJCQkJYnJlYWs7CisJCQl9CiAJCX0KLQkJaWYgKChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKSAmJgotCQkJKEJicENzci5maWVsZC5SZWdOdW0gPT0gSWQpKQotCQl7Ci0JCQkqcFZhbHVlID0gKFVDSEFSKUJicENzci5maWVsZC5WYWx1ZTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiQkJQIHJlYWQgUiVkPTB4JXggZmFpbFxuIiwgSWQsIEJicENzci53b3JkKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiUlRVU0JSZWFkQkJQUmVnaXN0ZXIoQkJQX0NTUl9DRkdfMik6cmV0cnkgY291bnQ9JWQhXG4iLAorCQkJICBpKSk7CisJCWkrKzsKKwl9IHdoaWxlICgoaSA8IFJFVFJZX0xJTUlUKQorCQkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKTsKKworCWlmICgoaSA9PSBSRVRSWV9MSU1JVCkKKwkgICAgfHwgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpIHsKKwkJLyogKi8KKwkJLyogUmVhZCBmYWlsZWQgdGhlbiBSZXR1cm4gRGVmYXVsdCB2YWx1ZS4gKi8KKwkJLyogKi8KIAkJKnBWYWx1ZSA9IHBBZC0+QmJwV3JpdGVMYXRjaFtJZF07CisKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAorCQkJICAgICAoIlJldHJ5IGNvdW50IGV4aGF1c3RlZCBvciBkZXZpY2UgcmVtb3ZlZCEhIVxuIikpOwogCQlyZXR1cm4gU1RBVFVTX1VOU1VDQ0VTU0ZVTDsKIAl9CisKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9Ci0jZW5kaWYKIAotI2lmIDEKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTUzMiw5NSArMzgzLDQ2IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1OVFNUQVRVUwlSVFVTQldyaXRlQkJQUmVnaXN0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlJZCwKLQlJTglVQ0hBUgkJCVZhbHVlKQoraW50IFJUVVNCV3JpdGVCQlBSZWdpc3RlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgdTggSWQsIHU4IFZhbHVlKQogewotCUJCUF9DU1JfQ0ZHX1NUUlVDCUJicENzcjsKLQlVSU5UCQkJaSA9IDA7Ci0JTlRTVEFUVVMJCXN0YXR1czsKLQkvLyBWZXJpZnkgdGhlIGJ1c3kgY29uZGl0aW9uCi0JZG8KLQl7CisJQkJQX0NTUl9DRkdfU1RSVUMgQmJwQ3NyOworCXUzMiBpID0gMDsKKwlpbnQgc3RhdHVzOworCS8qIFZlcmlmeSB0aGUgYnVzeSBjb25kaXRpb24gKi8KKwlkbyB7CiAJCXN0YXR1cyA9IFJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7Ci0JCWlmIChzdGF0dXMgPj0gMCkKLQkJewotCQlpZiAoIShCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSkKLQkJCWJyZWFrOworCQlpZiAoc3RhdHVzID49IDApIHsKKwkJCWlmICghKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpKQorCQkJCWJyZWFrOwogCQl9Ci0JCXByaW50aygiUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKEJCUF9DU1JfQ0ZHKTpyZXRyeSBjb3VudD0lZCFcbiIsIGkpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlJUVVNCV3JpdGVCQlBSZWdpc3RlcihCQlBfQ1NSX0NGRyk6cmV0cnkgY291bnQ9JWQhXG4iLAorCQkJICBpKSk7CiAJCWkrKzsKIAl9Ci0Jd2hpbGUgKChpIDwgUkVUUllfTElNSVQpICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSk7CisJd2hpbGUgKChpIDwgUkVUUllfTElNSVQpCisJICAgICAgICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSk7CiAKLQlpZiAoKGkgPT0gUkVUUllfTElNSVQpIHx8IChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQotCXsKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlJldHJ5IGNvdW50IGV4aGF1c3RlZCBvciBkZXZpY2UgcmVtb3ZlZCEhIVxuIikpOworCWlmICgoaSA9PSBSRVRSWV9MSU1JVCkKKwkgICAgfHwgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpIHsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAorCQkJICAgICAoIlJldHJ5IGNvdW50IGV4aGF1c3RlZCBvciBkZXZpY2UgcmVtb3ZlZCEhIVxuIikpOwogCQlyZXR1cm4gU1RBVFVTX1VOU1VDQ0VTU0ZVTDsKIAl9Ci0KLQkvLyBQcmVwYXJlIGZvciB3cml0ZSBtYXRlcmlhbAotCUJicENzci53b3JkIAkJCQk9IDA7Ci0JQmJwQ3NyLmZpZWxkLmZSZWFkCQkJPSAwOwotCUJicENzci5maWVsZC5WYWx1ZQkJCT0gVmFsdWU7Ci0JQmJwQ3NyLmZpZWxkLkJ1c3kJCQk9IDE7Ci0JQmJwQ3NyLmZpZWxkLlJlZ051bSAJCT0gSWQ7CisJLyogUHJlcGFyZSBmb3Igd3JpdGUgbWF0ZXJpYWwgKi8KKwlCYnBDc3Iud29yZCA9IDA7CisJQmJwQ3NyLmZpZWxkLmZSZWFkID0gMDsKKwlCYnBDc3IuZmllbGQuVmFsdWUgPSBWYWx1ZTsKKwlCYnBDc3IuZmllbGQuQnVzeSA9IDE7CisJQmJwQ3NyLmZpZWxkLlJlZ051bSA9IElkOwogCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIEJCUF9DU1JfQ0ZHLCBCYnBDc3Iud29yZCk7CiAKIAlwQWQtPkJicFdyaXRlTGF0Y2hbSWRdID0gVmFsdWU7CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9Ci0jZWxzZQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotCVJvdXRpbmUgRGVzY3JpcHRpb246IFdyaXRlIDgtYml0IEJCUCByZWdpc3RlciB2aWEgZmlybXdhcmUKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCUlSUUwgPQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLQotTlRTVEFUVVMJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJSWQsCi0JSU4JVUNIQVIJCQlWYWx1ZSkKLQotewotCUJCUF9DU1JfQ0ZHX1NUUlVDCUJicENzcjsKLQlpbnQJCQkJCUJ1c3lDbnQ7Ci0JZm9yIChCdXN5Q250PTA7IEJ1c3lDbnQ8TUFYX0JVU1lfQ09VTlQ7IEJ1c3lDbnQrKykKLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsKLQkJaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpCi0JCQljb250aW51ZTsKLQkJQmJwQ3NyLndvcmQgPSAwOwotCQlCYnBDc3IuZmllbGQuZlJlYWQgPSAwOwotCQlCYnBDc3IuZmllbGQuQkJQX1JXX01PREUgPSAxOwotCQlCYnBDc3IuZmllbGQuQnVzeSA9IDE7Ci0JCUJicENzci5maWVsZC5WYWx1ZSA9IFZhbHVlOwotCQlCYnBDc3IuZmllbGQuUmVnTnVtID0gSWQ7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9CQlBfQUdFTlQsIEJicENzci53b3JkKTsKLQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDgwLCAweGZmLCAweDAsIDB4MCk7Ci0JCXBBZC0+QmJwV3JpdGVMYXRjaFtJZF0gPSBWYWx1ZTsKLQkJYnJlYWs7Ci0JfQotCWlmIChCdXN5Q250ID09IE1BWF9CVVNZX0NPVU5UKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiQkJQIHdyaXRlIFIlZD0weCV4IGZhaWxcbiIsIElkLCBCYnBDc3Iud29yZCkpOwotCQlyZXR1cm4gU1RBVFVTX1VOU1VDQ0VTU0ZVTDsKLQl9Ci0JcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotfQotI2VuZGlmCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC02MzYsMzEgKzQzOCwzMSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotTlRTVEFUVVMJUlRVU0JXcml0ZVJGUmVnaXN0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUlOVDMyCQkJVmFsdWUpCitpbnQgUlRVU0JXcml0ZVJGUmVnaXN0ZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1MzIgVmFsdWUpCiB7Ci0JUEhZX0NTUjRfU1RSVUMJUGh5Q3NyNDsKLQlVSU5UCQkJaSA9IDA7Ci0JTlRTVEFUVVMJCXN0YXR1czsKKwlQSFlfQ1NSNF9TVFJVQyBQaHlDc3I0OworCXUzMiBpID0gMDsKKwlpbnQgc3RhdHVzOwogCiAJTmRpc1plcm9NZW1vcnkoJlBoeUNzcjQsIHNpemVvZihQSFlfQ1NSNF9TVFJVQykpOwotCWRvCi0JeworCWRvIHsKIAkJc3RhdHVzID0gUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBSRl9DU1JfQ0ZHMCwgJlBoeUNzcjQud29yZCk7Ci0JCWlmIChzdGF0dXMgPj0gMCkKLQkJewotCQlpZiAoIShQaHlDc3I0LmZpZWxkLkJ1c3kpKQotCQkJYnJlYWs7CisJCWlmIChzdGF0dXMgPj0gMCkgeworCQkJaWYgKCEoUGh5Q3NyNC5maWVsZC5CdXN5KSkKKwkJCQlicmVhazsKIAkJfQotCQlwcmludGsoIlJUVVNCV3JpdGVSRlJlZ2lzdGVyKFJGX0NTUl9DRkcwKTpyZXRyeSBjb3VudD0lZCFcbiIsIGkpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlJUVVNCV3JpdGVSRlJlZ2lzdGVyKFJGX0NTUl9DRkcwKTpyZXRyeSBjb3VudD0lZCFcbiIsCisJCQkgIGkpKTsKIAkJaSsrOwogCX0KLQl3aGlsZSAoKGkgPCBSRVRSWV9MSU1JVCkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKTsKKwl3aGlsZSAoKGkgPCBSRVRSWV9MSU1JVCkKKwkgICAgICAgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKTsKIAotCWlmICgoaSA9PSBSRVRSWV9MSU1JVCkgfHwgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCi0JewotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUmV0cnkgY291bnQgZXhoYXVzdGVkIG9yIGRldmljZSByZW1vdmVkISEhXG4iKSk7CisJaWYgKChpID09IFJFVFJZX0xJTUlUKQorCSAgICB8fCAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkgeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsCisJCQkgICAgICgiUmV0cnkgY291bnQgZXhoYXVzdGVkIG9yIGRldmljZSByZW1vdmVkISEhXG4iKSk7CiAJCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOwogCX0KIApAQCAtNjcyLDExNSArNDc0LDYgQEAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLQlSb3V0aW5lIERlc2NyaXB0aW9uOiBXcml0ZSBSVDMweHggUkYgcmVnaXN0ZXIgdGhyb3VnaCBNQUMKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCUlSUUwgPQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5UU1RBVFVTIFJUMzB4eFdyaXRlUkZSZWdpc3RlcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCVJlZ0lELAotCUlOCVVDSEFSCQkJVmFsdWUpCi17Ci0JUkZfQ1NSX0NGR19TVFJVQwlyZmNzcjsKLQlVSU5UCQkJCWkgPSAwOwotCi0JZG8KLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgUkZfQ1NSX0NGRywgJnJmY3NyLndvcmQpOwotCi0JCWlmICghcmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0spCi0JCQlicmVhazsKLQkJaSsrOwotCX0KLQl3aGlsZSAoKGkgPCBSRVRSWV9MSU1JVCkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKTsKLQotCWlmICgoaSA9PSBSRVRSWV9MSU1JVCkgfHwgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCi0JewotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUmV0cnkgY291bnQgZXhoYXVzdGVkIG9yIGRldmljZSByZW1vdmVkISEhXG4iKSk7Ci0JCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOwotCX0KLQotCXJmY3NyLmZpZWxkLlJGX0NTUl9XUiA9IDE7Ci0JcmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0sgPSAxOwotCXJmY3NyLmZpZWxkLlRFU1RDU1JfUkZBQ0NfUkVHTlVNID0gUmVnSUQ7Ci0JcmZjc3IuZmllbGQuUkZfQ1NSX0RBVEEgPSBWYWx1ZTsKLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJGX0NTUl9DRkcsIHJmY3NyLndvcmQpOwotCi0JcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOiBSZWFkIFJUMzB4eCBSRiByZWdpc3RlciB0aHJvdWdoIE1BQwotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JSVJRTCA9Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTlRTVEFUVVMgUlQzMHh4UmVhZFJGUmVnaXN0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlSZWdJRCwKLQlJTglQVUNIQVIJCQlwVmFsdWUpCi17Ci0JUkZfQ1NSX0NGR19TVFJVQwlyZmNzcjsKLQlVSU5UCQkJCWk9MCwgaz0wOwotCi0JZm9yIChpPTA7IGk8TUFYX0JVU1lfQ09VTlQ7IGkrKykKLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgUkZfQ1NSX0NGRywgJnJmY3NyLndvcmQpOwotCi0JCWlmIChyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9PSBCVVNZKQotCQl7Ci0JCQljb250aW51ZTsKLQkJfQotCQlyZmNzci53b3JkID0gMDsKLQkJcmZjc3IuZmllbGQuUkZfQ1NSX1dSID0gMDsKLQkJcmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0sgPSAxOwotCQlyZmNzci5maWVsZC5URVNUQ1NSX1JGQUNDX1JFR05VTSA9IFJlZ0lEOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSRl9DU1JfQ0ZHLCByZmNzci53b3JkKTsKLQkJZm9yIChrPTA7IGs8TUFYX0JVU1lfQ09VTlQ7IGsrKykKLQkJewotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBSRl9DU1JfQ0ZHLCAmcmZjc3Iud29yZCk7Ci0KLQkJCWlmIChyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9PSBJRExFKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmICgocmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0sgPT0gSURMRSkgJiYKLQkJCShyZmNzci5maWVsZC5URVNUQ1NSX1JGQUNDX1JFR05VTSA9PSBSZWdJRCkpCi0JCXsKLQkJCSpwVmFsdWUgPSAoVUNIQVIpcmZjc3IuZmllbGQuUkZfQ1NSX0RBVEE7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAocmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0sgPT0gQlVTWSkKLQl7Ci0JCURCR1BSSU5UX0VSUigoIlJGIHJlYWQgUiVkPTB4JXggZmFpbCwgaVslZF0sIGtbJWRdXG4iLCBSZWdJRCwgcmZjc3Iud29yZCxpLGspKTsKLQkJcmV0dXJuIFNUQVRVU19VTlNVQ0NFU1NGVUw7Ci0JfQotCi0JcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCiAJUm91dGluZSBEZXNjcmlwdGlvbjoKIAogCUFyZ3VtZW50czoKQEAgLTc5MywyOCArNDg2LDE2IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1OVFNUQVRVUwlSVFVTQlJlYWRFRVBST00oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCU9VVAlQVUNIQVIJCQlwRGF0YSwKLQlJTglVU0hPUlQJCQlsZW5ndGgpCitpbnQgUlRVU0JSZWFkRUVQUk9NKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSB1MTYgT2Zmc2V0LCB1OCAqcERhdGEsIHUxNiBsZW5ndGgpCiB7Ci0JTlRTVEFUVVMJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CisJaW50IFN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwogCi0JaWYocEFkLT5iVXNlRWZ1c2UpCi0JCVN0YXR1cyA9ZUZ1c2VSZWFkKHBBZCwgT2Zmc2V0LCBwRGF0YSwgbGVuZ3RoKTsKLQllbHNlCi0JewotCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCi0JCXBBZCwKLQkJKFVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX0lOIHwgVVNCRF9TSE9SVF9UUkFOU0ZFUl9PSyksCi0JCURFVklDRV9WRU5ET1JfUkVRVUVTVF9JTiwKLQkJMHg5LAotCQkwLAotCQlPZmZzZXQsCi0JCXBEYXRhLAotCQlsZW5ndGgpOwotCX0KKwlTdGF0dXMgPSBSVFVTQl9WZW5kb3JSZXF1ZXN0KHBBZCwKKwkJCQkgICAgIChVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9JTiB8CisJCQkJICAgICAgVVNCRF9TSE9SVF9UUkFOU0ZFUl9PSyksCisJCQkJICAgICBERVZJQ0VfVkVORE9SX1JFUVVFU1RfSU4sIDB4OSwgMCwgT2Zmc2V0LAorCQkJCSAgICAgcERhdGEsIGxlbmd0aCk7CiAKIAlyZXR1cm4gU3RhdHVzOwogfQpAQCAtODM0LDMyICs1MTUsMzMgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLU5UU1RBVFVTCVJUVVNCV3JpdGVFRVBST00oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVTSE9SVAkJCWxlbmd0aCkKK2ludCBSVFVTQldyaXRlRUVQUk9NKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgdTE2IE9mZnNldCwgdTggKnBEYXRhLCB1MTYgbGVuZ3RoKQogewotCU5UU1RBVFVTCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworCWludCBTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKIAotCWlmKHBBZC0+YlVzZUVmdXNlKQotCQlTdGF0dXMgPSBlRnVzZVdyaXRlKHBBZCwgT2Zmc2V0LCBwRGF0YSwgbGVuZ3RoKTsKLQllbHNlCi0JewotCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCi0JCXBBZCwKLQkJVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VULAotCQlERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAotCQkweDgsCi0JCTAsCi0JCU9mZnNldCwKLQkJcERhdGEsCi0JCWxlbmd0aCk7Ci0JfQorCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QocEFkLAorCQkJCSAgICAgVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VULAorCQkJCSAgICAgREVWSUNFX1ZFTkRPUl9SRVFVRVNUX09VVCwKKwkJCQkgICAgIDB4OCwgMCwgT2Zmc2V0LCBwRGF0YSwgbGVuZ3RoKTsKIAogCXJldHVybiBTdGF0dXM7CiB9CiAKK2ludCBSVFVTQlJlYWRFRVBST00xNihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB1MTYgb2Zmc2V0LCB1MTYgKnBEYXRhKQoreworCWludCBzdGF0dXM7CisJdTE2IGxvY2FsRGF0YTsKKworCXN0YXR1cyA9IFJUVVNCUmVhZEVFUFJPTShwQWQsIG9mZnNldCwgKHU4ICopKCZsb2NhbERhdGEpLCAyKTsKKwlpZiAoc3RhdHVzID09IFNUQVRVU19TVUNDRVNTKQorCQkqcERhdGEgPSBsZTJjcHUxNihsb2NhbERhdGEpOworCisJcmV0dXJuIHN0YXR1czsKKworfQorCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC04NzUsMTYgKzU1NywxNSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBSVFVTQlB1dFRvU2xlZXAoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCit2b2lkIFJUVVNCUHV0VG9TbGVlcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JVUlOVDMyCQl2YWx1ZTsKKwl1MzIgdmFsdWU7CiAKLQkvLyBUaW1lb3V0IDB4NDAgeCA1MHVzCi0JdmFsdWUgPSAoU0xFRVBDSUQ8PDE2KSsoT1dORVJNQ1U8PDI0KSsgKDB4NDA8PDgpKzE7CisJLyogVGltZW91dCAweDQwIHggNTB1cyAqLworCXZhbHVlID0gKFNMRUVQQ0lEIDw8IDE2KSArIChPV05FUk1DVSA8PCAyNCkgKyAoMHg0MCA8PCA4KSArIDE7CiAJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgMHg3MDEwLCB2YWx1ZSk7CiAJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgMHg0MDQsIDB4MzApOwotCS8vUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisJLypSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsgKi8KIAlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiU2xlZXAgTWFpbGJveCB0ZXN0dmFsdWUgJXhcbiIsIHZhbHVlKSk7CiAKIH0KQEAgLTkwNCwyMCArNTg1LDE0IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1OVFNUQVRVUyBSVFVTQldha2VVcCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKK2ludCBSVFVTQldha2VVcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JTlRTVEFUVVMJU3RhdHVzOworCWludCBTdGF0dXM7CiAKLQlTdGF0dXMgPSBSVFVTQl9WZW5kb3JSZXF1ZXN0KAotCQlwQWQsCi0JCVVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX09VVCwKLQkJREVWSUNFX1ZFTkRPUl9SRVFVRVNUX09VVCwKLQkJMHgwMSwKLQkJMHgwOSwKLQkJMCwKLQkJTlVMTCwKLQkJMCk7CisJU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdChwQWQsCisJCQkJICAgICBVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9PVVQsCisJCQkJICAgICBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAorCQkJCSAgICAgMHgwMSwgMHgwOSwgMCwgTlVMTCwgMCk7CiAKIAlyZXR1cm4gU3RhdHVzOwogfQpAQCAtOTM3LDEzICs2MTIsMTIgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJUlRVU0JJbml0aWFsaXplQ21kUSgKLQlJTglQQ21kUQljbWRxKQordm9pZCBSVFVTQkluaXRpYWxpemVDbWRRKHN0cnVjdCBydF9jbWRxICpjbWRxKQogewogCWNtZHEtPmhlYWQgPSBOVUxMOwogCWNtZHEtPnRhaWwgPSBOVUxMOwogCWNtZHEtPnNpemUgPSAwOwotCWNtZHEtPkNtZFFTdGF0ZSA9IFJUMjg3MF9USFJFQURfSU5JVEVEOworCWNtZHEtPkNtZFFTdGF0ZSA9IFJUTVBfVEFTS19TVEFUX0lOSVRFRDsKIH0KIAogLyoKQEAgLTk2MSw0MSArNjM1LDQ1IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1ORElTX1NUQVRVUwlSVFVTQkVucXVldWVDbWRGcm9tTmRpcygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglORElTX09JRAkJT2lkLAotCUlOCUJPT0xFQU4JCQlTZXRJbmZvcm1hdGlvbiwKLQlJTglQVk9JRAkJCXBJbmZvcm1hdGlvbkJ1ZmZlciwKLQlJTglVSU5UMzIJCQlJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCkKK2ludCBSVFVTQkVucXVldWVDbWRGcm9tTmRpcyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgIElOIE5ESVNfT0lEIE9pZCwKKwkJCQkgICAgSU4gQk9PTEVBTiBTZXRJbmZvcm1hdGlvbiwKKwkJCQkgICAgdm9pZCAqcEluZm9ybWF0aW9uQnVmZmVyLAorCQkJCSAgICB1MzIgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpCiB7Ci0JTkRJU19TVEFUVVMJc3RhdHVzOwotCVBDbWRRRWxtdAljbWRxZWxtdCA9IE5VTEw7Ci0JUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCWludCBzdGF0dXM7CisJc3RydWN0IHJ0X2NtZHFlbG10ICpjbWRxZWxtdCA9IE5VTEw7CisJc3RydWN0IHJ0X3J0bXBfb3NfdGFzayAqcFRhc2sgPSAmcEFkLT5jbWRRVGFzazsKIAotCWlmIChwaWRfbnIocE9iai0+UlRVU0JDbWRUaHJfcGlkKSA+IDApCi0JCXJldHVybiAoTkRJU19TVEFUVVNfUkVTT1VSQ0VTKTsKKyNpZmRlZiBLVEhSRUFEX1NVUFBPUlQKKwlpZiAocFRhc2stPmt0aHJlYWRfdGFzayA9PSBOVUxMKQorI2Vsc2UKKwlDSEVDS19QSURfTEVHQUxJVFkocFRhc2stPnRhc2tQSUQpIHsKKwl9CisJZWxzZQorI2VuZGlmCisJcmV0dXJuIChORElTX1NUQVRVU19SRVNPVVJDRVMpOwogCi0Jc3RhdHVzID0gUlRNUEFsbG9jYXRlTWVtb3J5KChQVk9JRCAqKSZjbWRxZWxtdCwgc2l6ZW9mKENtZFFFbG10KSk7CisJc3RhdHVzID0gb3NfYWxsb2NfbWVtKHBBZCwgKHU4ICoqKSAoJmNtZHFlbG10KSwgc2l6ZW9mKHN0cnVjdCBydF9jbWRxZWxtdCkpOwogCWlmICgoc3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHx8IChjbWRxZWxtdCA9PSBOVUxMKSkKIAkJcmV0dXJuIChORElTX1NUQVRVU19SRVNPVVJDRVMpOwogCi0JCWNtZHFlbG10LT5idWZmZXIgPSBOVUxMOwotCQlpZiAocEluZm9ybWF0aW9uQnVmZmVyICE9IE5VTEwpCi0JCXsKLQkJCXN0YXR1cyA9IFJUTVBBbGxvY2F0ZU1lbW9yeSgoUFZPSUQgKikmY21kcWVsbXQtPmJ1ZmZlciwgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpOwotCQkJaWYgKChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgfHwgKGNtZHFlbG10LT5idWZmZXIgPT0gTlVMTCkpCi0JCQl7Ci0JCQkJa2ZyZWUoY21kcWVsbXQpOwotCQkJCXJldHVybiAoTkRJU19TVEFUVVNfUkVTT1VSQ0VTKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlOZGlzTW92ZU1lbW9yeShjbWRxZWxtdC0+YnVmZmVyLCBwSW5mb3JtYXRpb25CdWZmZXIsIEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoKTsKLQkJCQljbWRxZWxtdC0+YnVmZmVybGVuZ3RoID0gSW5mb3JtYXRpb25CdWZmZXJMZW5ndGg7Ci0JCQl9CisJY21kcWVsbXQtPmJ1ZmZlciA9IE5VTEw7CisJaWYgKHBJbmZvcm1hdGlvbkJ1ZmZlciAhPSBOVUxMKSB7CisJCXN0YXR1cyA9CisJCSAgICBvc19hbGxvY19tZW0ocEFkLCAodTggKiopICYgY21kcWVsbXQtPmJ1ZmZlciwKKwkJCQkgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpOworCQlpZiAoKHN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkgICAgfHwgKGNtZHFlbG10LT5idWZmZXIgPT0gTlVMTCkpIHsKKwkJCWtmcmVlKGNtZHFlbG10KTsKKwkJCXJldHVybiAoTkRJU19TVEFUVVNfUkVTT1VSQ0VTKTsKKwkJfSBlbHNlIHsKKwkJCU5kaXNNb3ZlTWVtb3J5KGNtZHFlbG10LT5idWZmZXIsIHBJbmZvcm1hdGlvbkJ1ZmZlciwKKwkJCQkgICAgICAgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpOworCQkJY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCA9IEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoOwogCQl9Ci0JCWVsc2UKLQkJCWNtZHFlbG10LT5idWZmZXJsZW5ndGggPSAwOworCX0gZWxzZQorCQljbWRxZWxtdC0+YnVmZmVybGVuZ3RoID0gMDsKIAogCWNtZHFlbG10LT5jb21tYW5kID0gT2lkOwogCWNtZHFlbG10LT5DbWRGcm9tTmRpcyA9IFRSVUU7CkBAIC0xMDA1LDI4ICs2ODMsMjIgQEAKIAkJY21kcWVsbXQtPlNldE9wZXJhdGlvbiA9IEZBTFNFOwogCiAJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7Ci0JaWYgKHBBZC0+Q21kUS5DbWRRU3RhdGUgJiBSVDI4NzBfVEhSRUFEX0NBTl9ET19JTlNFUlQpCi0JeworCWlmIChwQWQtPkNtZFEuQ21kUVN0YXRlICYgUlRNUF9UQVNLX0NBTl9ET19JTlNFUlQpIHsKIAkJRW5xdWV1ZUNtZCgoJnBBZC0+Q21kUSksIGNtZHFlbG10KTsKIAkJc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlzdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwogCX0KIAlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKIAotCWlmIChzdGF0dXMgPT0gTkRJU19TVEFUVVNfRkFJTFVSRSkKLQl7CisJaWYgKHN0YXR1cyA9PSBORElTX1NUQVRVU19GQUlMVVJFKSB7CiAJCWlmIChjbWRxZWxtdC0+YnVmZmVyKQotCQkJTmRpc0ZyZWVNZW1vcnkoY21kcWVsbXQtPmJ1ZmZlciwgY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCwgMCk7Ci0JCU5kaXNGcmVlTWVtb3J5KGNtZHFlbG10LCBzaXplb2YoQ21kUUVsbXQpLCAwKTsKLQl9Ci0JZWxzZQotCVJUVVNCQ01EVXAocEFkKTsKKwkJCW9zX2ZyZWVfbWVtKHBBZCwgY21kcWVsbXQtPmJ1ZmZlcik7CisJCW9zX2ZyZWVfbWVtKHBBZCwgY21kcWVsbXQpOworCX0gZWxzZQorCQlSVFVTQkNNRFVwKHBBZCk7CiAKLQotICAgIHJldHVybihORElTX1NUQVRVU19TVUNDRVNTKTsKKwlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwogfQogCiAvKgpAQCAtMTA0NCwzNyArNzE2LDMzIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1ORElTX1NUQVRVUyBSVFVTQkVucXVldWVJbnRlcm5hbENtZCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBORElTX09JRAkJCU9pZCwKLQlJTiBQVk9JRAkJCXBJbmZvcm1hdGlvbkJ1ZmZlciwKLQlJTiBVSU5UMzIJCQlJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCkKK2ludCBSVFVTQkVucXVldWVJbnRlcm5hbENtZChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgIElOIE5ESVNfT0lEIE9pZCwKKwkJCQkgICAgdm9pZCAqcEluZm9ybWF0aW9uQnVmZmVyLAorCQkJCSAgICB1MzIgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpCiB7Ci0JTkRJU19TVEFUVVMJc3RhdHVzOwotCVBDbWRRRWxtdAljbWRxZWxtdCA9IE5VTEw7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgcnRfY21kcWVsbXQgKmNtZHFlbG10ID0gTlVMTDsKIAotCi0Jc3RhdHVzID0gUlRNUEFsbG9jYXRlTWVtb3J5KChQVk9JRCAqKSZjbWRxZWxtdCwgc2l6ZW9mKENtZFFFbG10KSk7CisJc3RhdHVzID0gb3NfYWxsb2NfbWVtKHBBZCwgKHU4ICoqKSAmIGNtZHFlbG10LCBzaXplb2Yoc3RydWN0IHJ0X2NtZHFlbG10KSk7CiAJaWYgKChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgfHwgKGNtZHFlbG10ID09IE5VTEwpKQogCQlyZXR1cm4gKE5ESVNfU1RBVFVTX1JFU09VUkNFUyk7Ci0JTmRpc1plcm9NZW1vcnkoY21kcWVsbXQsIHNpemVvZihDbWRRRWxtdCkpOworCU5kaXNaZXJvTWVtb3J5KGNtZHFlbG10LCBzaXplb2Yoc3RydWN0IHJ0X2NtZHFlbG10KSk7CiAKLQlpZihJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCA+IDApCi0JewotCQlzdGF0dXMgPSBSVE1QQWxsb2NhdGVNZW1vcnkoKFBWT0lEICopJmNtZHFlbG10LT5idWZmZXIsIEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoKTsKLQkJaWYgKChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgfHwgKGNtZHFlbG10LT5idWZmZXIgPT0gTlVMTCkpCi0JCXsKLQkJCU5kaXNGcmVlTWVtb3J5KGNtZHFlbG10LCBzaXplb2YoQ21kUUVsbXQpLCAwKTsKKwlpZiAoSW5mb3JtYXRpb25CdWZmZXJMZW5ndGggPiAwKSB7CisJCXN0YXR1cyA9CisJCSAgICBvc19hbGxvY19tZW0ocEFkLCAodTggKiopICYgY21kcWVsbXQtPmJ1ZmZlciwKKwkJCQkgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpOworCQlpZiAoKHN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkgICAgfHwgKGNtZHFlbG10LT5idWZmZXIgPT0gTlVMTCkpIHsKKwkJCW9zX2ZyZWVfbWVtKHBBZCwgY21kcWVsbXQpOwogCQkJcmV0dXJuIChORElTX1NUQVRVU19SRVNPVVJDRVMpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJTmRpc01vdmVNZW1vcnkoY21kcWVsbXQtPmJ1ZmZlciwgcEluZm9ybWF0aW9uQnVmZmVyLCBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCk7CisJCX0gZWxzZSB7CisJCQlOZGlzTW92ZU1lbW9yeShjbWRxZWxtdC0+YnVmZmVyLCBwSW5mb3JtYXRpb25CdWZmZXIsCisJCQkJICAgICAgIEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoKTsKIAkJCWNtZHFlbG10LT5idWZmZXJsZW5ndGggPSBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aDsKIAkJfQotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCWNtZHFlbG10LT5idWZmZXIgPSBOVUxMOwogCQljbWRxZWxtdC0+YnVmZmVybGVuZ3RoID0gMDsKIAl9CkBAIC0xMDgyLDMwICs3NTAsMjQgQEAKIAljbWRxZWxtdC0+Y29tbWFuZCA9IE9pZDsKIAljbWRxZWxtdC0+Q21kRnJvbU5kaXMgPSBGQUxTRTsKIAotCWlmIChjbWRxZWxtdCAhPSBOVUxMKQotCXsKKwlpZiAoY21kcWVsbXQgIT0gTlVMTCkgewogCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKLQkJaWYgKHBBZC0+Q21kUS5DbWRRU3RhdGUgJiBSVDI4NzBfVEhSRUFEX0NBTl9ET19JTlNFUlQpCi0JCXsKKwkJaWYgKHBBZC0+Q21kUS5DbWRRU3RhdGUgJiBSVE1QX1RBU0tfQ0FOX0RPX0lOU0VSVCkgewogCQkJRW5xdWV1ZUNtZCgoJnBBZC0+Q21kUSksIGNtZHFlbG10KTsKIAkJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JCX0KLQkJZWxzZQotCQl7CisJCX0gZWxzZSB7CiAJCQlzdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwogCQl9CiAJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOwogCi0JCWlmIChzdGF0dXMgPT0gTkRJU19TVEFUVVNfRkFJTFVSRSkKLQkJeworCQlpZiAoc3RhdHVzID09IE5ESVNfU1RBVFVTX0ZBSUxVUkUpIHsKIAkJCWlmIChjbWRxZWxtdC0+YnVmZmVyKQotCQkJCU5kaXNGcmVlTWVtb3J5KGNtZHFlbG10LT5idWZmZXIsIGNtZHFlbG10LT5idWZmZXJsZW5ndGgsIDApOwotCQkJTmRpc0ZyZWVNZW1vcnkoY21kcWVsbXQsIHNpemVvZihDbWRRRWxtdCksIDApOwotCQl9Ci0JCWVsc2UKLQkJUlRVU0JDTURVcChwQWQpOworCQkJCW9zX2ZyZWVfbWVtKHBBZCwgY21kcWVsbXQtPmJ1ZmZlcik7CisJCQlvc19mcmVlX21lbShwQWQsIGNtZHFlbG10KTsKKwkJfSBlbHNlCisJCQlSVFVTQkNNRFVwKHBBZCk7CiAJfQotCXJldHVybihORElTX1NUQVRVU19TVUNDRVNTKTsKKwlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwogfQogCiAvKgpAQCAtMTEyMywxNCArNzg1LDExIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUVVNCRGVxdWV1ZUNtZCgKLQlJTglQQ21kUQkJY21kcSwKLQlPVVQJUENtZFFFbG10CSpwY21kcWVsbXQpCit2b2lkIFJUVVNCRGVxdWV1ZUNtZChzdHJ1Y3QgcnRfY21kcSAqY21kcSwgc3RydWN0IHJ0X2NtZHFlbG10ICogKiBwY21kcWVsbXQpCiB7CiAJKnBjbWRxZWxtdCA9IGNtZHEtPmhlYWQ7CiAKLQlpZiAoKnBjbWRxZWxtdCAhPSBOVUxMKQotCXsKKwlpZiAoKnBjbWRxZWxtdCAhPSBOVUxMKSB7CiAJCWNtZHEtPmhlYWQgPSBjbWRxLT5oZWFkLT5uZXh0OwogCQljbWRxLT5zaXplLS07CiAJCWlmIChjbWRxLT5zaXplID09IDApCkBAIC0xMTY0LDcgKzgyMyw2IEBACiAJICBtZXRob2QgY2FuIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlLiAgU2luY2UgeW91IGRvbid0IGhhdmUgYSBoYW5kbGUgb24KIAkgIHRoZSBVUkIgdXNlZCwgeW91IGNhbid0IGNhbmNlbCB0aGUgcmVxdWVzdC4KIAotCiAJUm91dGluZSBEZXNjcmlwdGlvbjoKIAogCUFyZ3VtZW50czoKQEAgLTExNzUsNjggKzgzMywxMDkgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLU5UU1RBVFVTICAgIFJUVVNCX1ZlbmRvclJlcXVlc3QoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUlOVDMyCQkJVHJhbnNmZXJGbGFncywKLQlJTglVQ0hBUgkJCVJlcXVlc3RUeXBlLAotCUlOCVVDSEFSCQkJUmVxdWVzdCwKLQlJTglVU0hPUlQJCQlWYWx1ZSwKLQlJTglVU0hPUlQJCQlJbmRleCwKLQlJTglQVk9JRAkJCVRyYW5zZmVyQnVmZmVyLAotCUlOCVVJTlQzMgkJCVRyYW5zZmVyQnVmZmVyTGVuZ3RoKQoraW50IFJUVVNCX1ZlbmRvclJlcXVlc3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB1MzIgVHJhbnNmZXJGbGFncywKKwkJCSAgICAgdTggUmVxdWVzdFR5cGUsCisJCQkgICAgIHU4IFJlcXVlc3QsCisJCQkgICAgIHUxNiBWYWx1ZSwKKwkJCSAgICAgdTE2IEluZGV4LAorCQkJICAgICB2b2lkICpUcmFuc2ZlckJ1ZmZlciwKKwkJCSAgICAgdTMyIFRyYW5zZmVyQnVmZmVyTGVuZ3RoKQogewotCWludAkJCQlyZXQ7Ci0JUE9TX0NPT0tJRQkJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKIAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JeworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpIHsKIAkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiZGV2aWNlIGRpc2Nvbm5lY3RlZFxuIikpOwogCQlyZXR1cm4gLTE7Ci0JfQotCWVsc2UgaWYgKGluX2ludGVycnVwdCgpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiaW5faW50ZXJydXB0LCBSVFVTQl9WZW5kb3JSZXF1ZXN0IFJlcXVlc3QlMDJ4IFZhbHVlJTA0eCBPZmZzZXQlMDR4XG4iLFJlcXVlc3QsVmFsdWUsSW5kZXgpKTsKKwl9IGVsc2UgaWYgKGluX2ludGVycnVwdCgpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiaW5faW50ZXJydXB0LCBSVFVTQl9WZW5kb3JSZXF1ZXN0IFJlcXVlc3QlMDJ4IFZhbHVlJTA0eCBPZmZzZXQlMDR4XG4iLAorCQkJICBSZXF1ZXN0LCBWYWx1ZSwgSW5kZXgpKTsKIAogCQlyZXR1cm4gLTE7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKICNkZWZpbmUgTUFYX1JFVFJZX0NPVU5UICAxMAogCiAJCWludCByZXRyeUNvdW50ID0gMDsKLQkJdm9pZAkqdG1wQnVmID0gVHJhbnNmZXJCdWZmZXI7CisJCXZvaWQgKnRtcEJ1ZiA9IFRyYW5zZmVyQnVmZmVyOwogCi0JCS8vIEFjcXVpcmUgQ29udHJvbCB0b2tlbgotCQlkbyB7Ci0JCWlmKCBSZXF1ZXN0VHlwZSA9PSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VUKQotCQkJcmV0PXVzYl9jb250cm9sX21zZyhwT2JqLT5wVXNiX0RldiwgdXNiX3NuZGN0cmxwaXBlKCBwT2JqLT5wVXNiX0RldiwgMCApLCBSZXF1ZXN0LCBSZXF1ZXN0VHlwZSwgVmFsdWUsSW5kZXgsIHRtcEJ1ZiwgVHJhbnNmZXJCdWZmZXJMZW5ndGgsIENPTlRST0xfVElNRU9VVF9KSUZGSUVTKTsKLQkJZWxzZSBpZihSZXF1ZXN0VHlwZSA9PSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfSU4pCi0JCQlyZXQ9dXNiX2NvbnRyb2xfbXNnKHBPYmotPnBVc2JfRGV2LCB1c2JfcmN2Y3RybHBpcGUoIHBPYmotPnBVc2JfRGV2LCAwICksIFJlcXVlc3QsIFJlcXVlc3RUeXBlLCBWYWx1ZSxJbmRleCwgdG1wQnVmLCBUcmFuc2ZlckJ1ZmZlckxlbmd0aCwgQ09OVFJPTF9USU1FT1VUX0pJRkZJRVMpOwotCQllbHNlCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInZlbmRvciByZXF1ZXN0IGRpcmVjdGlvbiBpcyBmYWlsZWRcbiIpKTsKLQkJCXJldCA9IC0xOworCQlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJihwQWQtPlVzYlZlbmRvclJlcV9zZW1hcGhvcmUpKTsKKwkJaWYgKHBBZC0+VXNiVmVuZG9yUmVxQnVmKSB7CisJCQlBU1NFUlQoVHJhbnNmZXJCdWZmZXJMZW5ndGggPCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOworCisJCQl0bXBCdWYgPSAodm9pZCAqKXBBZC0+VXNiVmVuZG9yUmVxQnVmOworCQkJTmRpc1plcm9NZW1vcnkocEFkLT5Vc2JWZW5kb3JSZXFCdWYsCisJCQkJICAgICAgIFRyYW5zZmVyQnVmZmVyTGVuZ3RoKTsKKworCQkJaWYgKFJlcXVlc3RUeXBlID09IERFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQpCisJCQkJTmRpc01vdmVNZW1vcnkodG1wQnVmLCBUcmFuc2ZlckJ1ZmZlciwKKwkJCQkJICAgICAgIFRyYW5zZmVyQnVmZmVyTGVuZ3RoKTsKIAkJfQogCisJCWRvIHsKKwkJCWlmIChSZXF1ZXN0VHlwZSA9PSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VUKQorCQkJCXJldCA9CisJCQkJICAgIHVzYl9jb250cm9sX21zZyhwT2JqLT5wVXNiX0RldiwKKwkJCQkJCSAgICB1c2Jfc25kY3RybHBpcGUocE9iai0+CisJCQkJCQkJCSAgICBwVXNiX0RldiwKKwkJCQkJCQkJICAgIDApLCBSZXF1ZXN0LAorCQkJCQkJICAgIFJlcXVlc3RUeXBlLCBWYWx1ZSwgSW5kZXgsCisJCQkJCQkgICAgdG1wQnVmLAorCQkJCQkJICAgIFRyYW5zZmVyQnVmZmVyTGVuZ3RoLAorCQkJCQkJICAgIENPTlRST0xfVElNRU9VVF9KSUZGSUVTKTsKKwkJCWVsc2UgaWYgKFJlcXVlc3RUeXBlID09IERFVklDRV9WRU5ET1JfUkVRVUVTVF9JTikKKwkJCQlyZXQgPQorCQkJCSAgICB1c2JfY29udHJvbF9tc2cocE9iai0+cFVzYl9EZXYsCisJCQkJCQkgICAgdXNiX3JjdmN0cmxwaXBlKHBPYmotPgorCQkJCQkJCQkgICAgcFVzYl9EZXYsCisJCQkJCQkJCSAgICAwKSwgUmVxdWVzdCwKKwkJCQkJCSAgICBSZXF1ZXN0VHlwZSwgVmFsdWUsIEluZGV4LAorCQkJCQkJICAgIHRtcEJ1ZiwKKwkJCQkJCSAgICBUcmFuc2ZlckJ1ZmZlckxlbmd0aCwKKwkJCQkJCSAgICBDT05UUk9MX1RJTUVPVVRfSklGRklFUyk7CisJCQllbHNlIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJICgidmVuZG9yIHJlcXVlc3QgZGlyZWN0aW9uIGlzIGZhaWxlZFxuIikpOworCQkJCXJldCA9IC0xOworCQkJfQorCiAJCQlyZXRyeUNvdW50Kys7CiAJCQlpZiAocmV0IDwgMCkgewotCQkJCXByaW50aygiI1xuIik7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIiNcbiIpKTsKIAkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOwogCQkJfQotCQl9IHdoaWxlKChyZXQgPCAwKSAmJiAocmV0cnlDb3VudCA8IE1BWF9SRVRSWV9DT1VOVCkpOworCQl9IHdoaWxlICgocmV0IDwgMCkgJiYgKHJldHJ5Q291bnQgPCBNQVhfUkVUUllfQ09VTlQpKTsKIAotICAgICAgICBpZiAocmV0IDwgMCkgewotLy8JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJVU0JWZW5kb3JSZXF1ZXN0IGZhaWxlZCByZXQ9JWQgXG4iLHJldCkpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRVU0JfVmVuZG9yUmVxdWVzdCBmYWlsZWQoJWQpLFR4RmxhZ3M9MHgleCwgUmVxVHlwZT0lcywgUmVxPTB4JXgsIEluZGV4PTB4JXhcbiIsCi0JCQkJCQlyZXQsIFRyYW5zZmVyRmxhZ3MsIChSZXF1ZXN0VHlwZSA9PSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VUID8gIk9VVCIgOiAiSU4iKSwgUmVxdWVzdCwgSW5kZXgpKTsKKwkJaWYgKChwQWQtPlVzYlZlbmRvclJlcUJ1ZikKKwkJICAgICYmIChSZXF1ZXN0VHlwZSA9PSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfSU4pKQorCQkJTmRpc01vdmVNZW1vcnkoVHJhbnNmZXJCdWZmZXIsIHRtcEJ1ZiwKKwkJCQkgICAgICAgVHJhbnNmZXJCdWZmZXJMZW5ndGgpOworCQl1cCgmKHBBZC0+VXNiVmVuZG9yUmVxX3NlbWFwaG9yZSkpOworCisJCWlmIChyZXQgPCAwKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCJSVFVTQl9WZW5kb3JSZXF1ZXN0IGZhaWxlZCglZCksVHhGbGFncz0weCV4LCBSZXFUeXBlPSVzLCBSZXE9MHgleCwgSW5kZXg9MHgleFxuIiwKKwkJCQkgIHJldCwgVHJhbnNmZXJGbGFncywKKwkJCQkgIChSZXF1ZXN0VHlwZSA9PQorCQkJCSAgIERFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQgPyAiT1VUIiA6ICJJTiIpLAorCQkJCSAgUmVxdWVzdCwgSW5kZXgpKTsKIAkJCWlmIChSZXF1ZXN0ID09IDB4MikKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJcdFJlcXVlc3QgVmFsdWU9MHglMDR4IVxuIiwgVmFsdWUpKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJICgiXHRSZXF1ZXN0IFZhbHVlPTB4JTA0eCFcbiIsIFZhbHVlKSk7CiAKLQkJCWlmICgoVHJhbnNmZXJCdWZmZXIhPSBOVUxMKSAmJiAoVHJhbnNmZXJCdWZmZXJMZW5ndGggPiAwKSkKLQkJCQloZXhfZHVtcCgiRmFpbGVkIFRyYW5zZmVyQnVmZmVyIHZhbHVlIiwgVHJhbnNmZXJCdWZmZXIsIFRyYW5zZmVyQnVmZmVyTGVuZ3RoKTsKLSAgICAgICAgfQorCQkJaWYgKChUcmFuc2ZlckJ1ZmZlciAhPSBOVUxMKQorCQkJICAgICYmIChUcmFuc2ZlckJ1ZmZlckxlbmd0aCA+IDApKQorCQkJCWhleF9kdW1wKCJGYWlsZWQgVHJhbnNmZXJCdWZmZXIgdmFsdWUiLAorCQkJCQkgVHJhbnNmZXJCdWZmZXIsIFRyYW5zZmVyQnVmZmVyTGVuZ3RoKTsKKwkJfQorCiAJfQotCXJldHVybiByZXQ7CisKKwlpZiAocmV0ICE9IC0xKQorCQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CisJZWxzZQorCQlyZXR1cm4gU1RBVFVTX1VOU1VDQ0VTU0ZVTDsKIH0KIAogLyoKQEAgLTEyNTUsMjggKzk1NCwyNSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotTlRTVEFUVVMJUlRVU0JfUmVzZXREZXZpY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCitpbnQgUlRVU0JfUmVzZXREZXZpY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCU5UU1RBVFVTCQlTdGF0dXMgPSBUUlVFOworCWludCBTdGF0dXMgPSBUUlVFOwogCiAJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT5VU0JfUmVzZXREZXZpY2VcbiIpKTsKLQkvL1JUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKTsKKwkvKlJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKTsgKi8KIAlyZXR1cm4gU3RhdHVzOwogfQogCi1WT0lEIENNREhhbmRsZXIoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQpCit2b2lkIENNREhhbmRsZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCVBDbWRRRWxtdAkJY21kcWVsbXQ7Ci0JUFVDSEFSCQkJcERhdGE7Ci0JTkRJU19TVEFUVVMJCU5kaXNTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotLy8JVUxPTkcJCQlOb3cgPSAwOwotCU5UU1RBVFVTCQludFN0YXR1czsKLS8vCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisJc3RydWN0IHJ0X2NtZHFlbG10ICpjbWRxZWxtdDsKKwl1OCAqcERhdGE7CisJaW50IE5kaXNTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworLyogICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICAgIE5vdyA9IDA7ICovCisJaW50IG50U3RhdHVzOworLyogICAgICB1bnNpZ25lZCBsb25nICAgSXJxRmxhZ3M7ICovCiAKLQl3aGlsZSAocEFkLT5DbWRRLnNpemUgPiAwKQotCXsKKwl3aGlsZSAocEFkICYmIHBBZC0+Q21kUS5zaXplID4gMCkgewogCQlOZGlzU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAogCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKQEAgLTEyODgsNTkxICs5ODQsMTEyOSBAQAogCiAJCXBEYXRhID0gY21kcWVsbXQtPmJ1ZmZlcjsKIAotCQlpZighKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSB8fCBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpKQotCQl7Ci0JCQlzd2l0Y2ggKGNtZHFlbG10LT5jb21tYW5kKQotCQkJewotCQkJCWNhc2UgQ01EVEhSRUFEX0NIRUNLX0dQSU86CisJCWlmICghCisJCSAgICAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpCisJCSAgICAgfHwgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSkgeworCQkJc3dpdGNoIChjbWRxZWxtdC0+Y29tbWFuZCkgeworCQkJY2FzZSBDTURUSFJFQURfQ0hFQ0tfR1BJTzoKKwkJCQl7CisJCQkJCXUzMiBkYXRhOworCiAJCQkJCXsKLQkJCQkJCVVJTlQzMiBkYXRhOworCQkJCQkJLyogUmVhZCBHUElPIHBpbjIgYXMgSGFyZHdhcmUgY29udHJvbGxlZCByYWRpbyBzdGF0ZSAqLwogCi0JCQkJCQl7Ci0JCQkJCQkJLy8gUmVhZCBHUElPIHBpbjIgYXMgSGFyZHdhcmUgY29udHJvbGxlZCByYWRpbyBzdGF0ZQorCQkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLAorCQkJCQkJCQkgICAgIEdQSU9fQ1RSTF9DRkcsCisJCQkJCQkJCSAgICAgJmRhdGEpOwogCi0JCQkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIoIHBBZCwgR1BJT19DVFJMX0NGRywgJmRhdGEpOworCQkJCQkJaWYgKGRhdGEgJiAweDA0KSB7CisJCQkJCQkJcEFkLT5TdGFDZmcuYkh3UmFkaW8gPQorCQkJCQkJCSAgICBUUlVFOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlwQWQtPlN0YUNmZy5iSHdSYWRpbyA9CisJCQkJCQkJICAgIEZBTFNFOworCQkJCQkJfQogCi0JCQkJCQkJaWYgKGRhdGEgJiAweDA0KQotCQkJCQkJCXsKLQkJCQkJCQkJcEFkLT5TdGFDZmcuYkh3UmFkaW8gPSBUUlVFOworCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyAhPQorCQkJCQkJICAgIChwQWQtPlN0YUNmZy5iSHdSYWRpbworCQkJCQkJICAgICAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpIHsKKwkJCQkJCQlwQWQtPlN0YUNmZy5iUmFkaW8gPQorCQkJCQkJCSAgICAocEFkLT5TdGFDZmcuCisJCQkJCQkJICAgICBiSHdSYWRpbworCQkJCQkJCSAgICAgJiYgcEFkLT5TdGFDZmcuCisJCQkJCQkJICAgICBiU3dSYWRpbyk7CisJCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLgorCQkJCQkJCSAgICBiUmFkaW8gPT0gVFJVRSkgeworCQkJCQkJCQlEQkdQUklOVF9SQVcKKwkJCQkJCQkJICAgIChSVF9ERUJVR19FUlJPUiwKKwkJCQkJCQkJICAgICAoIiEhISBSYWRpbyBPbiAhISFcbiIpKTsKKworCQkJCQkJCQlNbG1lUmFkaW9PbgorCQkJCQkJCQkgICAgKHBBZCk7CisJCQkJCQkJCS8qIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbiAqLworCQkJCQkJCQlwQWQtPkV4dHJhSW5mbyA9CisJCQkJCQkJCSAgICBFWFRSQV9JTkZPX0NMRUFSOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCURCR1BSSU5UX1JBVworCQkJCQkJCQkgICAgKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJCQkgICAgICgiISEhIFJhZGlvIE9mZiAhISFcbiIpKTsKKworCQkJCQkJCQlNbG1lUmFkaW9PZmYKKwkJCQkJCQkJICAgIChwQWQpOworCQkJCQkJCQkvKiBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gKi8KKwkJCQkJCQkJcEFkLT5FeHRyYUluZm8gPQorCQkJCQkJCQkgICAgSFdfUkFESU9fT0ZGOwogCQkJCQkJCX0KLQkJCQkJCQllbHNlCi0JCQkJCQkJewotCQkJCQkJCQlwQWQtPlN0YUNmZy5iSHdSYWRpbyA9IEZBTFNFOwotCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKIAotCQkJCQkJCWlmKHBBZC0+U3RhQ2ZnLmJSYWRpbyAhPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pKQotCQkJCQkJCXsKLQkJCQkJCQkJcEFkLT5TdGFDZmcuYlJhZGlvID0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKTsKLQkJCQkJCQkJaWYocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCi0JCQkJCQkJCXsKLQkJCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCIhISEgUmFkaW8gT24gISEhXG4iKSk7CisJCQljYXNlIENNRFRIUkVBRF9RS0VSSU9ESUNfRVhFQ1VUOgorCQkJCXsKKwkJCQkJU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYyhOVUxMLCBwQWQsCisJCQkJCQkJCSAgICAgTlVMTCwKKwkJCQkJCQkJICAgICBOVUxMKTsKKwkJCQl9CisJCQkJYnJlYWs7CiAKLQkJCQkJCQkJCU1sbWVSYWRpb09uKHBBZCk7Ci0JCQkJCQkJCQkvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KLQkJCQkJCQkJCXBBZC0+RXh0cmFJbmZvID0gRVhUUkFfSU5GT19DTEVBUjsKKwkJCWNhc2UgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VUOgorCQkJCXsKKwkJCQkJdTMyIE1BQ1ZhbHVlOworCQkJCQl1OCBJbmRleDsKKwkJCQkJaW50IHJldCA9IDA7CisJCQkJCXN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQ7CisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcnRfcnRtcF90eF9yaW5nICpwVHhSaW5nOyAqLworCQkJCQl1bnNpZ25lZCBsb25nIElycUZsYWdzOworCisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAgICAgKCJDbWRUaHJlYWQgOiBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQoUmVzZXRQaXBlaWQ9MHglMHgpPT09PlxuIiwKKwkJCQkJCSAgICAgIHBBZC0+YnVsa1Jlc2V0UGlwZWlkKSk7CisJCQkJCS8qIEFsbCB0cmFuc2ZlcnMgbXVzdCBiZSBhYm9ydGVkIG9yIGNhbmNlbGxlZCBiZWZvcmUgYXR0ZW1wdGluZyB0byByZXNldCB0aGUgcGlwZS4gKi8KKwkJCQkJLypSVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKHBBZCk7ICovCisJCQkJCS8qIFdhaXQgMTBtcyB0byBsZXQgcHJldmlvdXMgcGFja2V0IHRoYXQgYXJlIGFscmVhZHkgaW4gSFcgRklGTyB0byBjbGVhci4gYnkgTUFYTEVFIDEyLTI1LTIwMDcgKi8KKwkJCQkJSW5kZXggPSAwOworCQkJCQlkbyB7CisJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsCisJCQkJCQkJCSAgICAgVFhSWFFfUENOVCwKKwkJCQkJCQkJICAgICAmTUFDVmFsdWUpOworCQkJCQkJaWYgKChNQUNWYWx1ZSAmIDB4ZjAwMDAwCisJCQkJCQkgICAgIC8qMHg4MDAwMDAgKi8gKSA9PSAwKQorCQkJCQkJCWJyZWFrOworCQkJCQkJSW5kZXgrKzsKKwkJCQkJCVJUTVB1c2VjRGVsYXkoMTAwMDApOworCQkJCQl9IHdoaWxlIChJbmRleCA8IDEwMCk7CisJCQkJCU1BQ1ZhbHVlID0gMDsKKwkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBVU0JfRE1BX0NGRywKKwkJCQkJCQkgICAgICZNQUNWYWx1ZSk7CisJCQkJCS8qIFRvIHByZXZlbnQgUmVhZCBSZWdpc3RlciBlcnJvciwgd2UgMm5kIGNoZWNrIHRoZSB2YWxpZGl0eS4gKi8KKwkJCQkJaWYgKChNQUNWYWx1ZSAmIDB4YzAwMDAwKSA9PSAwKQorCQkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLAorCQkJCQkJCQkgICAgIFVTQl9ETUFfQ0ZHLAorCQkJCQkJCQkgICAgICZNQUNWYWx1ZSk7CisJCQkJCS8qIFRvIHByZXZlbnQgUmVhZCBSZWdpc3RlciBlcnJvciwgd2UgM3JkIGNoZWNrIHRoZSB2YWxpZGl0eS4gKi8KKwkJCQkJaWYgKChNQUNWYWx1ZSAmIDB4YzAwMDAwKSA9PSAwKQorCQkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLAorCQkJCQkJCQkgICAgIFVTQl9ETUFfQ0ZHLAorCQkJCQkJCQkgICAgICZNQUNWYWx1ZSk7CisJCQkJCU1BQ1ZhbHVlIHw9IDB4ODAwMDA7CisJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIFVTQl9ETUFfQ0ZHLAorCQkJCQkJCSAgICAgIE1BQ1ZhbHVlKTsKKworCQkJCQkvKiBXYWl0IDFtcyB0byBwcmV2ZW50IG5leHQgVVJCIHRvIGJ1bGtvdXQgYmVmb3JlIEhXIHJlc2V0LiBieSBNQVhMRUUgMTItMjUtMjAwNyAqLworCQkJCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCisJCQkJCU1BQ1ZhbHVlICY9ICh+MHg4MDAwMCk7CisJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIFVTQl9ETUFfQ0ZHLAorCQkJCQkJCSAgICAgIE1BQ1ZhbHVlKTsKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICAgICAoIlx0U2V0IDB4MmEwIGJpdDE5LiBDbGVhciBVU0IgRE1BIFRYIHBhdGhcbiIpKTsKKworCQkJCQkvKiBXYWl0IDVtcyB0byBwcmV2ZW50IG5leHQgVVJCIHRvIGJ1bGtvdXQgYmVmb3JlIEhXIHJlc2V0LiBieSBNQVhMRUUgMTItMjUtMjAwNyAqLworCQkJCQkvKlJUTVB1c2VjRGVsYXkoNTAwMCk7ICovCisKKwkJCQkJaWYgKChwQWQtPgorCQkJCQkgICAgIGJ1bGtSZXNldFBpcGVpZCAmCisJCQkJCSAgICAgQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcpID09CisJCQkJCSAgICBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRykgeworCQkJCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKwkJCQkJCWlmIChwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4IDwKKwkJCQkJCSAgICBNR01UX1JJTkdfU0laRQorCQkJCQkJICAgIC8qIHBNTE1FQ29udGV4dC0+YldhaXRpbmdCdWxrT3V0ID09IFRSVUUgKi8KKwkJCQkJCSAgICApIHsKKwkJCQkJCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwKKwkJCQkJCQkJCSAgICBmUlRVU0JfQlVMS19PVVRfTUxNRSk7CisJCQkJCQl9CisJCQkJCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisKKwkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkJCQkgICAgICgiXHRUWCBNR01UIFJFQ09WRVIgRG9uZSFcbiIpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXBIVFRYQ29udGV4dCA9CisJCQkJCQkgICAgJihwQWQtPgorCQkJCQkJICAgICAgVHhDb250ZXh0W3BBZC0+CisJCQkJCQkJCWJ1bGtSZXNldFBpcGVpZF0pOworCQkJCQkJLypOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSk7ICovCisJCQkJCQlSVE1QX0lOVF9MT0NLKCZwQWQtPgorCQkJCQkJCSAgICAgIEJ1bGtPdXRMb2NrW3BBZC0+CisJCQkJCQkJCQkgIGJ1bGtSZXNldFBpcGVpZF0sCisJCQkJCQkJICAgICAgSXJxRmxhZ3MpOworCQkJCQkJaWYgKHBBZC0+CisJCQkJCQkgICAgQnVsa091dFBlbmRpbmdbcEFkLT4KKwkJCQkJCQkJICAgYnVsa1Jlc2V0UGlwZWlkXQorCQkJCQkJICAgID09IEZBTFNFKSB7CisJCQkJCQkJcEFkLT4KKwkJCQkJCQkgICAgQnVsa091dFBlbmRpbmdbcEFkLT4KKwkJCQkJCQkJCSAgIGJ1bGtSZXNldFBpcGVpZF0KKwkJCQkJCQkgICAgPSBUUlVFOworCQkJCQkJCXBIVFRYQ29udGV4dC0+CisJCQkJCQkJICAgIElSUFBlbmRpbmcgPSBUUlVFOworCQkJCQkJCXBBZC0+CisJCQkJCQkJICAgIHdhdGNoRG9nVHhQZW5kaW5nQ250CisJCQkJCQkJICAgIFtwQWQtPgorCQkJCQkJCSAgICAgYnVsa1Jlc2V0UGlwZWlkXSA9CisJCQkJCQkJICAgIDE7CisKKwkJCQkJCQkvKiBubyBtYXR0ZXIgd2hhdCwgY2xlYW4gdGhlIGZsYWcgKi8KKwkJCQkJCQlSVE1QX0NMRUFSX0ZMQUcocEFkLAorCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKworCQkJCQkJCS8qTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0pOyAqLworCQkJCQkJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT4KKwkJCQkJCQkJCUJ1bGtPdXRMb2NrCisJCQkJCQkJCQlbcEFkLT4KKwkJCQkJCQkJCSBidWxrUmVzZXRQaXBlaWRdLAorCQkJCQkJCQkJSXJxRmxhZ3MpOworCQkJCQkJCXsKKwkJCQkJCQkJUlRVU0JJbml0SFRUeERlc2MKKwkJCQkJCQkJICAgIChwQWQsCisJCQkJCQkJCSAgICAgcEhUVFhDb250ZXh0LAorCQkJCQkJCQkgICAgIHBBZC0+CisJCQkJCQkJCSAgICAgYnVsa1Jlc2V0UGlwZWlkLAorCQkJCQkJCQkgICAgIHBIVFRYQ29udGV4dC0+CisJCQkJCQkJCSAgICAgQnVsa091dFNpemUsCisJCQkJCQkJCSAgICAgKHVzYl9jb21wbGV0ZV90KQorCQkJCQkJCQkgICAgIFJUVVNCQnVsa091dERhdGFQYWNrZXRDb21wbGV0ZSk7CisKKwkJCQkJCQkJaWYgKChyZXQgPQorCQkJCQkJCQkgICAgIFJUVVNCX1NVQk1JVF9VUkIKKwkJCQkJCQkJICAgICAocEhUVFhDb250ZXh0LT4KKwkJCQkJCQkJICAgICAgcFVyYikpICE9CisJCQkJCQkJCSAgICAwKSB7CisJCQkJCQkJCQlSVE1QX0lOVF9MT0NLCisJCQkJCQkJCQkgICAgKCZwQWQtPgorCQkJCQkJCQkJICAgICBCdWxrT3V0TG9jaworCQkJCQkJCQkJICAgICBbcEFkLT4KKwkJCQkJCQkJCSAgICAgIGJ1bGtSZXNldFBpcGVpZF0sCisJCQkJCQkJCQkgICAgIElycUZsYWdzKTsKKwkJCQkJCQkJCXBBZC0+CisJCQkJCQkJCQkgICAgQnVsa091dFBlbmRpbmcKKwkJCQkJCQkJCSAgICBbcEFkLT4KKwkJCQkJCQkJCSAgICAgYnVsa1Jlc2V0UGlwZWlkXQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBGQUxTRTsKKwkJCQkJCQkJCXBIVFRYQ29udGV4dC0+CisJCQkJCQkJCQkgICAgSVJQUGVuZGluZworCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBGQUxTRTsKKwkJCQkJCQkJCXBBZC0+CisJCQkJCQkJCQkgICAgd2F0Y2hEb2dUeFBlbmRpbmdDbnQKKwkJCQkJCQkJCSAgICBbcEFkLT4KKwkJCQkJCQkJCSAgICAgYnVsa1Jlc2V0UGlwZWlkXQorCQkJCQkJCQkJICAgID0gMDsKKwkJCQkJCQkJCVJUTVBfSU5UX1VOTE9DSworCQkJCQkJCQkJICAgICgmcEFkLT4KKwkJCQkJCQkJCSAgICAgQnVsa091dExvY2sKKwkJCQkJCQkJCSAgICAgW3BBZC0+CisJCQkJCQkJCQkgICAgICBidWxrUmVzZXRQaXBlaWRdLAorCQkJCQkJCQkJICAgICBJcnFGbGFncyk7CisKKwkJCQkJCQkJCURCR1BSSU5UCisJCQkJCQkJCQkgICAgKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJCQkJICAgICAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVDogU3VibWl0IFR4IFVSQiBmYWlsZWQgJWRcbiIsCisJCQkJCQkJCQkgICAgICByZXQpKTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCVJUTVBfSVJRX0xPQ0sKKwkJCQkJCQkJCSAgICAoJnBBZC0+CisJCQkJCQkJCQkgICAgIEJ1bGtPdXRMb2NrCisJCQkJCQkJCQkgICAgIFtwQWQtPgorCQkJCQkJCQkJICAgICAgYnVsa1Jlc2V0UGlwZWlkXSwKKwkJCQkJCQkJCSAgICAgSXJxRmxhZ3MpOworCQkJCQkJCQkJREJHUFJJTlRfUkFXCisJCQkJCQkJCQkgICAgKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJCQkJICAgICAoIlx0Q01EVEhSRUFEX1JFU0VUX0JVTEtfT1VUOiBUeENvbnRleHRbJWRdOkNXUG9zPSVsZCwgTkJQb3M9JWxkLCBFTkJQb3M9JWxkLCBiQ29weT0lZCwgcGVuZGluZz0lZCFcbiIsCisJCQkJCQkJCQkgICAgICBwQWQtPgorCQkJCQkJCQkJICAgICAgYnVsa1Jlc2V0UGlwZWlkLAorCQkJCQkJCQkJICAgICAgcEhUVFhDb250ZXh0LT4KKwkJCQkJCQkJCSAgICAgIEN1cldyaXRlUG9zaXRpb24sCisJCQkJCQkJCQkgICAgICBwSFRUWENvbnRleHQtPgorCQkJCQkJCQkJICAgICAgTmV4dEJ1bGtPdXRQb3NpdGlvbiwKKwkJCQkJCQkJCSAgICAgIHBIVFRYQ29udGV4dC0+CisJCQkJCQkJCQkgICAgICBFTmV4dEJ1bGtPdXRQb3NpdGlvbiwKKwkJCQkJCQkJCSAgICAgIHBIVFRYQ29udGV4dC0+CisJCQkJCQkJCQkgICAgICBiQ29weVNhdmVQYWQsCisJCQkJCQkJCQkgICAgICBwQWQtPgorCQkJCQkJCQkJICAgICAgQnVsa091dFBlbmRpbmcKKwkJCQkJCQkJCSAgICAgIFtwQWQtPgorCQkJCQkJCQkJICAgICAgIGJ1bGtSZXNldFBpcGVpZF0pKTsKKwkJCQkJCQkJCURCR1BSSU5UX1JBVworCQkJCQkJCQkJICAgIChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCQkJCSAgICAgKCJcdFx0QnVsa091dCBSZXE9MHglbHgsIENvbXBsZXRlPTB4JWx4LCBPdGhlcj0weCVseFxuIiwKKwkJCQkJCQkJCSAgICAgIHBBZC0+CisJCQkJCQkJCQkgICAgICBCdWxrT3V0UmVxLAorCQkJCQkJCQkJICAgICAgcEFkLT4KKwkJCQkJCQkJCSAgICAgIEJ1bGtPdXRDb21wbGV0ZSwKKwkJCQkJCQkJCSAgICAgIHBBZC0+CisJCQkJCQkJCQkgICAgICBCdWxrT3V0Q29tcGxldGVPdGhlcikpOworCQkJCQkJCQkJUlRNUF9JUlFfVU5MT0NLCisJCQkJCQkJCQkgICAgKCZwQWQtPgorCQkJCQkJCQkJICAgICBCdWxrT3V0TG9jaworCQkJCQkJCQkJICAgICBbcEFkLT4KKwkJCQkJCQkJCSAgICAgIGJ1bGtSZXNldFBpcGVpZF0sCisJCQkJCQkJCQkgICAgIElycUZsYWdzKTsKKwkJCQkJCQkJCURCR1BSSU5UX1JBVworCQkJCQkJCQkJICAgIChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCQkJCSAgICAgKCJcdENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVDogU3VibWl0IFR4IERBVEEgVVJCIGZvciBmYWlsZWQgQnVsa1JlcSgweCVseCkgRG9uZSwgc3RhdHVzPSVkIVxuIiwKKwkJCQkJCQkJCSAgICAgIHBBZC0+CisJCQkJCQkJCQkgICAgICBidWxrUmVzZXRSZXEKKwkJCQkJCQkJCSAgICAgIFtwQWQtPgorCQkJCQkJCQkJICAgICAgIGJ1bGtSZXNldFBpcGVpZF0sCisJCQkJCQkJCQkgICAgICBwSFRUWENvbnRleHQtPgorCQkJCQkJCQkJICAgICAgcFVyYi0+CisJCQkJCQkJCQkgICAgICBzdGF0dXMpKTsKKwogCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvKk5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbcEFkLT5idWxrUmVzZXRQaXBlaWRdKTsgKi8KKwkJCQkJCQkvKlJUTVBfSU5UX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0sIElycUZsYWdzKTsgKi8KKworCQkJCQkJCURCR1BSSU5UX1JBVworCQkJCQkJCSAgICAoUlRfREVCVUdfRVJST1IsCisJCQkJCQkJICAgICAoIkNtZFRocmVhZCA6IFRYIERBVEEgUkVDT1ZFUiBGQUlMIGZvciBCdWxrUmVxKDB4JWx4KSBiZWNhdXNlIEJ1bGtPdXRQZW5kaW5nWyVkXSBpcyBUUlVFIVxuIiwKKwkJCQkJCQkgICAgICBwQWQtPgorCQkJCQkJCSAgICAgIGJ1bGtSZXNldFJlcVtwQWQtPgorCQkJCQkJCQkJICAgYnVsa1Jlc2V0UGlwZWlkXSwKKwkJCQkJCQkgICAgICBwQWQtPgorCQkJCQkJCSAgICAgIGJ1bGtSZXNldFBpcGVpZCkpOworCQkJCQkJCWlmIChwQWQtPgorCQkJCQkJCSAgICBidWxrUmVzZXRQaXBlaWQgPT0KKwkJCQkJCQkgICAgMCkgeworCQkJCQkJCQl1OAorCQkJCQkJCQkgICAgcGVuZGluZ0NvbnRleHQKKwkJCQkJCQkJICAgID0gMDsKKwkJCQkJCQkJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKgorCQkJCQkJCQkgICAgcEhUVFhDb250ZXh0CisJCQkJCQkJCSAgICA9CisJCQkJCQkJCSAgICAoc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKikKKwkJCQkJCQkJICAgICgmcEFkLT4KKwkJCQkJCQkJICAgICBUeENvbnRleHQKKwkJCQkJCQkJICAgICBbcEFkLT4KKwkJCQkJCQkJICAgICAgYnVsa1Jlc2V0UGlwZWlkXSk7CisJCQkJCQkJCXN0cnVjdCBydF90eF9jb250ZXh0ICoKKwkJCQkJCQkJICAgIHBNTE1FQ29udGV4dAorCQkJCQkJCQkgICAgPQorCQkJCQkJCQkgICAgKHN0cnVjdCBydF90eF9jb250ZXh0ICopCisJCQkJCQkJCSAgICAocEFkLT4KKwkJCQkJCQkJICAgICBNZ210UmluZy4KKwkJCQkJCQkJICAgICBDZWxsW3BBZC0+CisJCQkJCQkJCQkgIE1nbXRSaW5nLgorCQkJCQkJCQkJICBUeERtYUlkeF0uCisJCQkJCQkJCSAgICAgQWxsb2NWYSk7CisJCQkJCQkJCXN0cnVjdCBydF90eF9jb250ZXh0ICoKKwkJCQkJCQkJICAgIHBOVUxMQ29udGV4dAorCQkJCQkJCQkgICAgPQorCQkJCQkJCQkgICAgKHN0cnVjdCBydF90eF9jb250ZXh0ICopCisJCQkJCQkJCSAgICAoJnBBZC0+CisJCQkJCQkJCSAgICAgUHNQb2xsQ29udGV4dCk7CisJCQkJCQkJCXN0cnVjdCBydF90eF9jb250ZXh0ICoKKwkJCQkJCQkJICAgIHBQc1BvbGxDb250ZXh0CisJCQkJCQkJCSAgICA9CisJCQkJCQkJCSAgICAoc3RydWN0IHJ0X3R4X2NvbnRleHQgKikKKwkJCQkJCQkJICAgICgmcEFkLT4KKwkJCQkJCQkJICAgICBOdWxsQ29udGV4dCk7CisKKwkJCQkJCQkJaWYgKHBIVFRYQ29udGV4dC0+SVJQUGVuZGluZykKKwkJCQkJCQkJCXBlbmRpbmdDb250ZXh0CisJCQkJCQkJCQkgICAgfD0KKwkJCQkJCQkJCSAgICAxOworCQkJCQkJCQllbHNlIGlmCisJCQkJCQkJCSAgICAocE1MTUVDb250ZXh0LT4KKwkJCQkJCQkJICAgICBJUlBQZW5kaW5nKQorCQkJCQkJCQkJcGVuZGluZ0NvbnRleHQKKwkJCQkJCQkJCSAgICB8PQorCQkJCQkJCQkJICAgIDI7CisJCQkJCQkJCWVsc2UgaWYKKwkJCQkJCQkJICAgIChwTlVMTENvbnRleHQtPgorCQkJCQkJCQkgICAgIElSUFBlbmRpbmcpCisJCQkJCQkJCQlwZW5kaW5nQ29udGV4dAorCQkJCQkJCQkJICAgIHw9CisJCQkJCQkJCQkgICAgNDsKKwkJCQkJCQkJZWxzZSBpZgorCQkJCQkJCQkgICAgKHBQc1BvbGxDb250ZXh0LT4KKwkJCQkJCQkJICAgICBJUlBQZW5kaW5nKQorCQkJCQkJCQkJcGVuZGluZ0NvbnRleHQKKwkJCQkJCQkJCSAgICB8PQorCQkJCQkJCQkJICAgIDg7CiAJCQkJCQkJCWVsc2UKLQkJCQkJCQkJewotCQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIiEhISBSYWRpbyBPZmYgISEhXG4iKSk7CisJCQkJCQkJCQlwZW5kaW5nQ29udGV4dAorCQkJCQkJCQkJICAgID0gMDsKIAotCQkJCQkJCQkJTWxtZVJhZGlvT2ZmKHBBZCk7Ci0JCQkJCQkJCQkvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KLQkJCQkJCQkJCXBBZC0+RXh0cmFJbmZvID0gSFdfUkFESU9fT0ZGOwotCQkJCQkJCQl9CisJCQkJCQkJCURCR1BSSU5UX1JBVworCQkJCQkJCQkgICAgKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJCQkgICAgICgiXHRUWCBPY2N1cGllZCBieSAlZCFcbiIsCisJCQkJCQkJCSAgICAgIHBlbmRpbmdDb250ZXh0KSk7CiAJCQkJCQkJfQorCQkJCQkJCS8qIG5vIG1hdHRlciB3aGF0LCBjbGVhbiB0aGUgZmxhZyAqLworCQkJCQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsCisJCQkJCQkJCQlmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCisJCQkJCQkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPgorCQkJCQkJCQkJQnVsa091dExvY2sKKwkJCQkJCQkJCVtwQWQtPgorCQkJCQkJCQkJIGJ1bGtSZXNldFBpcGVpZF0sCisJCQkJCQkJCQlJcnFGbGFncyk7CisKKwkJCQkJCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwKKwkJCQkJCQkJCSAgICAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMCisJCQkJCQkJCQkgICAgIDw8CisJCQkJCQkJCQkgICAgIHBBZC0+CisJCQkJCQkJCQkgICAgIGJ1bGtSZXNldFBpcGVpZCkpOwogCQkJCQkJfQorCisJCQkJCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLAorCQkJCQkJCQkgIE5VTV9PRl9UWF9SSU5HLAorCQkJCQkJCQkgIE1BWF9UWF9QUk9DRVNTKTsKKwkJCQkJCS8qUlRVU0JLaWNrQnVsa091dChwQWQpOyAqLwogCQkJCQl9Ci0JCQkJCWJyZWFrOwogCi0JCQkJY2FzZSBDTURUSFJFQURfUUtFUklPRElDX0VYRUNVVDoKKwkJCQl9CisJCQkJLyoKKwkJCQkgICAvLyBEb24ndCBjYW5jZWwgQlVMS0lOLgorCQkJCSAgIHdoaWxlICgoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA+IDApICYmCisJCQkJICAgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQorCQkJCSAgIHsKKwkJCQkgICBpZiAoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA+IDApCisJCQkJICAgeworCQkJCSAgIERCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJCdWxrSW4gSVJQIFBlbmRpbmchIWNhbmNlbCBpdCFcbiIpKTsKKwkJCQkgICBSVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlAocEFkKTsKKwkJCQkgICB9CisJCQkJICAgUlRNUHVzZWNEZWxheSgxMDAwMDApOworCQkJCSAgIH0KKworCQkJCSAgIGlmICgoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA9PSAwKSAmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkpCisJCQkJICAgeworCQkJCSAgIHU4ICAgICAgICBpOworCQkJCSAgIFJUVVNCUnhQYWNrZXQocEFkKTsKKwkJCQkgICBwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCA9IDA7ICAgICAgLy8gTmV4dCBSeCBSZWFkIGluZGV4CisJCQkJICAgcEFkLT5OZXh0UnhCdWxrSW5JbmRleCAgICAgICAgICAgICAgID0gMDsgICAgLy8gUnggQnVsayBwb2ludGVyCisJCQkJICAgZm9yIChpID0gMDsgaSA8IChSWF9SSU5HX1NJWkUpOyBpKyspCisJCQkJICAgeworCQkJCSAgIHN0cnVjdCBydF9yeF9jb250ZXh0ICpwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7CisKKwkJCQkgICBwUnhDb250ZXh0LT5wQWQgICAgICA9IHBBZDsKKwkJCQkgICBwUnhDb250ZXh0LT5JblVzZSAgICAgICAgICAgID0gRkFMU0U7CisJCQkJICAgcFJ4Q29udGV4dC0+SVJQUGVuZGluZyAgICAgICA9IEZBTFNFOworCQkJCSAgIHBSeENvbnRleHQtPlJlYWRhYmxlID0gRkFMU0U7CisJCQkJICAgcFJ4Q29udGV4dC0+UmVvcmRlckluVXNlID0gRkFMU0U7CisKKwkJCQkgICB9CisJCQkJICAgUlRVU0JCdWxrUmVjZWl2ZShwQWQpOworCQkJCSAgIERCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkJ1bGtSZWNlaXZlXG4iKSk7CisJCQkJICAgfSAqLworCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkJICAgICAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVDw9PT1cbiIpKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBDTURUSFJFQURfUkVTRVRfQlVMS19JTjoKKwkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAgICAgKCJDbWRUaHJlYWQgOiBDTURUSFJFQURfUkVTRVRfQlVMS19JTiA9PT0gPlxuIikpOworCisJCQkJLyogQWxsIHRyYW5zZmVycyBtdXN0IGJlIGFib3J0ZWQgb3IgY2FuY2VsbGVkIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlc2V0IHRoZSBwaXBlLiAqLworCQkJCXsKKwkJCQkJdTMyIE1BQ1ZhbHVlOworCiAJCQkJCXsKLQkJCQkJCVN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMoTlVMTCwgcEFkLCBOVUxMLCBOVUxMKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VUOgotCQkJCQl7Ci0JCQkJCQlVSU5UMzIJCU1BQ1ZhbHVlOwotCQkJCQkJVUNIQVIJCUluZGV4OwotCQkJCQkJaW50CQkJcmV0PTA7Ci0JCQkJCQlQSFRfVFhfQ09OVEVYVAlwSFRUWENvbnRleHQ7Ci0vLwkJCQkJCVJUTVBfVFhfUklORyAqcFR4UmluZzsKLQkJCQkJCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7Ci0KLQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJDbWRUaHJlYWQgOiBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQoUmVzZXRQaXBlaWQ9MHglMHgpPT09PlxuIiwgcEFkLT5idWxrUmVzZXRQaXBlaWQpKTsKLQkJCQkJCS8vIEFsbCB0cmFuc2ZlcnMgbXVzdCBiZSBhYm9ydGVkIG9yIGNhbmNlbGxlZCBiZWZvcmUgYXR0ZW1wdGluZyB0byByZXNldCB0aGUgcGlwZS4KLQkJCQkJCS8vUlRVU0JDYW5jZWxQZW5kaW5nQnVsa091dElSUChwQWQpOwotCQkJCQkJLy8gV2FpdCAxMG1zIHRvIGxldCBwcmV2aW91cyBwYWNrZXQgdGhhdCBhcmUgYWxyZWFkeSBpbiBIVyBGSUZPIHRvIGNsZWFyLiBieSBNQVhMRUUgMTItMjUtMjAwNwotCQkJCQkJSW5kZXggPSAwOwotCQkJCQkJZG8KKwkJCQkJCS8qd2hpbGUgKChhdG9taWNfcmVhZCgmcEFkLT5QZW5kaW5nUngpID4gMCkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSAqLworCQkJCQkJaWYgKChwQWQtPlBlbmRpbmdSeCA+IDApCisJCQkJCQkgICAgJiYKKwkJCQkJCSAgICAoIVJUTVBfVEVTVF9GTEFHCisJCQkJCQkgICAgIChwQWQsCisJCQkJCQkgICAgICBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKIAkJCQkJCXsKLQkJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIFRYUlhRX1BDTlQsICZNQUNWYWx1ZSk7Ci0JCQkJCQkJaWYgKChNQUNWYWx1ZSAmIDB4ZjAwMDAwLyoweDgwMDAwMCovKSA9PSAwKQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQlJbmRleCsrOwotCQkJCQkJCVJUTVB1c2VjRGVsYXkoMTAwMDApOwotCQkJCQkJfXdoaWxlKEluZGV4IDwgMTAwKTsKLQkJCQkJCU1BQ1ZhbHVlID0gMDsKLQkJCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgVVNCX0RNQV9DRkcsICZNQUNWYWx1ZSk7Ci0JCQkJCQkvLyBUbyBwcmV2ZW50IFJlYWQgUmVnaXN0ZXIgZXJyb3IsIHdlIDJuZCBjaGVjayB0aGUgdmFsaWRpdHkuCi0JCQkJCQlpZiAoKE1BQ1ZhbHVlICYgMHhjMDAwMDApID09IDApCi0JCQkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBVU0JfRE1BX0NGRywgJk1BQ1ZhbHVlKTsKLQkJCQkJCS8vIFRvIHByZXZlbnQgUmVhZCBSZWdpc3RlciBlcnJvciwgd2UgM3JkIGNoZWNrIHRoZSB2YWxpZGl0eS4KLQkJCQkJCWlmICgoTUFDVmFsdWUgJiAweGMwMDAwMCkgPT0gMCkKLQkJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIFVTQl9ETUFfQ0ZHLCAmTUFDVmFsdWUpOwotCQkJCQkJTUFDVmFsdWUgfD0gMHg4MDAwMDsKLQkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIFVTQl9ETUFfQ0ZHLCBNQUNWYWx1ZSk7Ci0KLQkJCQkJCS8vIFdhaXQgMW1zIHRvIHByZXZlbnQgbmV4dCBVUkIgdG8gYnVsa291dCBiZWZvcmUgSFcgcmVzZXQuIGJ5IE1BWExFRSAxMi0yNS0yMDA3Ci0JCQkJCQlSVE1QdXNlY0RlbGF5KDEwMDApOwotCi0JCQkJCQlNQUNWYWx1ZSAmPSAofjB4ODAwMDApOwotCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgVVNCX0RNQV9DRkcsIE1BQ1ZhbHVlKTsKLQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJcdFNldCAweDJhMCBiaXQxOS4gQ2xlYXIgVVNCIERNQSBUWCBwYXRoXG4iKSk7Ci0KLQkJCQkJCS8vIFdhaXQgNW1zIHRvIHByZXZlbnQgbmV4dCBVUkIgdG8gYnVsa291dCBiZWZvcmUgSFcgcmVzZXQuIGJ5IE1BWExFRSAxMi0yNS0yMDA3Ci0JCQkJCQkvL1JUTVB1c2VjRGVsYXkoNTAwMCk7Ci0KLQkJCQkJCWlmICgocEFkLT5idWxrUmVzZXRQaXBlaWQgJiBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRykgPT0gQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcpCi0JCQkJCQl7Ci0JCQkJCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKLQkJCQkJCQlpZiAocEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA8IE1HTVRfUklOR19TSVpFIC8qIHBNTE1FQ29udGV4dC0+YldhaXRpbmdCdWxrT3V0ID09IFRSVUUgKi8pCi0JCQkJCQkJewotCQkJCQkJCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX01MTUUpOwotCQkJCQkJCX0KLQkJCQkJCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7Ci0KLQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiXHRUWCBNR01UIFJFQ09WRVIgRG9uZSFcbiIpKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlwSFRUWENvbnRleHQgPSAmKHBBZC0+VHhDb250ZXh0W3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSk7Ci0JCQkJCQkJLy9OZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSk7Ci0JCQkJCQkJUlRNUF9JTlRfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0sIElycUZsYWdzKTsKLQkJCQkJCQlpZiAoIHBBZC0+QnVsa091dFBlbmRpbmdbcEFkLT5idWxrUmVzZXRQaXBlaWRdID09IEZBTFNFKQotCQkJCQkJCXsKLQkJCQkJCQkJcEFkLT5CdWxrT3V0UGVuZGluZ1twQWQtPmJ1bGtSZXNldFBpcGVpZF0gPSBUUlVFOwotCQkJCQkJCQlwSFRUWENvbnRleHQtPklSUFBlbmRpbmcgPSBUUlVFOwotCQkJCQkJCQlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250W3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSA9IDE7Ci0KLQkJCQkJCQkJLy8gbm8gbWF0dGVyIHdoYXQsIGNsZWFuIHRoZSBmbGFnCi0JCQkJCQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7Ci0KLQkJCQkJCQkJLy9OZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSk7Ci0JCQkJCQkJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0sIElycUZsYWdzKTsKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JCQkJCQkJCXsKLQkJCQkJCQkJUlRVU0JJbml0SFRUeERlc2MocEFkLCBwSFRUWENvbnRleHQsIHBBZC0+YnVsa1Jlc2V0UGlwZWlkLCBwSFRUWENvbnRleHQtPkJ1bGtPdXRTaXplLCAodXNiX2NvbXBsZXRlX3QpUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKTsKLQotCQkJCQkJCQlpZigocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwSFRUWENvbnRleHQtPnBVcmIpKSE9MCkKLQkJCQkJCQkJewotCQkJCQkJCQkJCVJUTVBfSU5UX0xPQ0soJnBBZC0+QnVsa091dExvY2tbcEFkLT5idWxrUmVzZXRQaXBlaWRdLCBJcnFGbGFncyk7Ci0JCQkJCQkJCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSA9IEZBTFNFOwotCQkJCQkJCQkJcEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7Ci0JCQkJCQkJCQkJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFtwQWQtPmJ1bGtSZXNldFBpcGVpZF0gPSAwOwotCQkJCQkJCQkJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0sIElycUZsYWdzKTsKLQotCQkJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVDogU3VibWl0IFR4IFVSQiBmYWlsZWQgJWRcbiIsIHJldCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlCi0JCQkJCQkJCQl7Ci0JCQkJCQkJCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0sIElycUZsYWdzKTsKLQkJCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJcdENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVDogVHhDb250ZXh0WyVkXTpDV1Bvcz0lbGQsIE5CUG9zPSVsZCwgRU5CUG9zPSVsZCwgYkNvcHk9JWQsIHBlbmRpbmc9JWQhXG4iLAotCQkJCQkJCQkJCQkJcEFkLT5idWxrUmVzZXRQaXBlaWQsIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLAotCQkJCQkJCQkJCQkJCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQsIHBBZC0+QnVsa091dFBlbmRpbmdbcEFkLT5idWxrUmVzZXRQaXBlaWRdKSk7Ci0JCQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiXHRcdEJ1bGtPdXQgUmVxPTB4JWx4LCBDb21wbGV0ZT0weCVseCwgT3RoZXI9MHglbHhcbiIsCi0JCQkJCQkJCQkJCQkJCQlwQWQtPkJ1bGtPdXRSZXEsIHBBZC0+QnVsa091dENvbXBsZXRlLCBwQWQtPkJ1bGtPdXRDb21wbGV0ZU90aGVyKSk7Ci0JCQkJCQkJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgSXJxRmxhZ3MpOwotCQkJCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJcdENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVDogU3VibWl0IFR4IERBVEEgVVJCIGZvciBmYWlsZWQgQnVsa1JlcSgweCVseCkgRG9uZSwgc3RhdHVzPSVkIVxuIiwgcEFkLT5idWxrUmVzZXRSZXFbcEFkLT5idWxrUmVzZXRQaXBlaWRdLCBwSFRUWENvbnRleHQtPnBVcmItPnN0YXR1cykpOwotCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZQotCQkJCQkJCXsKLQkJCQkJCQkJLy9OZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSk7Ci0JCQkJCQkJCS8vUlRNUF9JTlRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgSXJxRmxhZ3MpOwotCi0JCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJDbWRUaHJlYWQgOiBUWCBEQVRBIFJFQ09WRVIgRkFJTCBmb3IgQnVsa1JlcSgweCVseCkgYmVjYXVzZSBCdWxrT3V0UGVuZGluZ1slZF0gaXMgVFJVRSFcbiIsIHBBZC0+YnVsa1Jlc2V0UmVxW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgcEFkLT5idWxrUmVzZXRQaXBlaWQpKTsKLQkJCQkJCQkJaWYgKHBBZC0+YnVsa1Jlc2V0UGlwZWlkID09IDApCi0JCQkJCQkJCXsKLQkJCQkJCQkJCVVDSEFSCXBlbmRpbmdDb250ZXh0ID0gMDsKLQkJCQkJCQkJCVBIVF9UWF9DT05URVhUIHBIVFRYQ29udGV4dCA9IChQSFRfVFhfQ09OVEVYVCkoJnBBZC0+VHhDb250ZXh0W3BBZC0+YnVsa1Jlc2V0UGlwZWlkIF0pOwotCQkJCQkJCQkJUFRYX0NPTlRFWFQgcE1MTUVDb250ZXh0ID0gKFBUWF9DT05URVhUKShwQWQtPk1nbXRSaW5nLkNlbGxbcEFkLT5NZ210UmluZy5UeERtYUlkeF0uQWxsb2NWYSk7Ci0JCQkJCQkJCQlQVFhfQ09OVEVYVCBwTlVMTENvbnRleHQgPSAoUFRYX0NPTlRFWFQpKCZwQWQtPlBzUG9sbENvbnRleHQpOwotCQkJCQkJCQkJUFRYX0NPTlRFWFQgcFBzUG9sbENvbnRleHQgPSAoUFRYX0NPTlRFWFQpKCZwQWQtPk51bGxDb250ZXh0KTsKLQotCQkJCQkJCQkJaWYgKHBIVFRYQ29udGV4dC0+SVJQUGVuZGluZykKLQkJCQkJCQkJCQlwZW5kaW5nQ29udGV4dCB8PSAxOwotCQkJCQkJCQkJZWxzZSBpZiAocE1MTUVDb250ZXh0LT5JUlBQZW5kaW5nKQotCQkJCQkJCQkJCXBlbmRpbmdDb250ZXh0IHw9IDI7Ci0JCQkJCQkJCQllbHNlIGlmIChwTlVMTENvbnRleHQtPklSUFBlbmRpbmcpCi0JCQkJCQkJCQkJcGVuZGluZ0NvbnRleHQgfD0gNDsKLQkJCQkJCQkJCWVsc2UgaWYgKHBQc1BvbGxDb250ZXh0LT5JUlBQZW5kaW5nKQotCQkJCQkJCQkJCXBlbmRpbmdDb250ZXh0IHw9IDg7Ci0JCQkJCQkJCQllbHNlCi0JCQkJCQkJCQkJcGVuZGluZ0NvbnRleHQgPSAwOwotCi0JCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiXHRUWCBPY2N1cGllZCBieSAlZCFcbiIsIHBlbmRpbmdDb250ZXh0KSk7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCS8vIG5vIG1hdHRlciB3aGF0LCBjbGVhbiB0aGUgZmxhZwotCQkJCQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7Ci0KLQkJCQkJCQkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgSXJxRmxhZ3MpOwotCi0JCQkJCQkJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IHBBZC0+YnVsa1Jlc2V0UGlwZWlkKSk7Ci0JCQkJCQkJfQotCi0JCQkJCQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKLQkJCQkJCQkvL1JUVVNCS2lja0J1bGtPdXQocEFkKTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJCS8qCi0JCQkJCQkvLyBEb24ndCBjYW5jZWwgQlVMS0lOLgotCQkJCQkJd2hpbGUgKChhdG9taWNfcmVhZCgmcEFkLT5QZW5kaW5nUngpID4gMCkgJiYKLQkJCQkJCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQotCQkJCQkJewotCQkJCQkJCWlmIChhdG9taWNfcmVhZCgmcEFkLT5QZW5kaW5nUngpID4gMCkKLQkJCQkJCQl7Ci0JCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJCdWxrSW4gSVJQIFBlbmRpbmchIWNhbmNlbCBpdCFcbiIpKTsKLQkJCQkJCQkJUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQKHBBZCk7Ci0JCQkJCQkJfQotCQkJCQkJCVJUTVB1c2VjRGVsYXkoMTAwMDAwKTsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKChhdG9taWNfcmVhZCgmcEFkLT5QZW5kaW5nUngpID09IDApICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSkKLQkJCQkJCXsKLQkJCQkJCQlVQ0hBUglpOwotCQkJCQkJCVJUVVNCUnhQYWNrZXQocEFkKTsKLQkJCQkJCQlwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCA9IDA7CS8vIE5leHQgUnggUmVhZCBpbmRleAotCQkJCQkJCXBBZC0+TmV4dFJ4QnVsa0luSW5kZXgJCT0gMDsJLy8gUnggQnVsayBwb2ludGVyCi0JCQkJCQkJZm9yIChpID0gMDsgaSA8IChSWF9SSU5HX1NJWkUpOyBpKyspCi0JCQkJCQkJewotCQkJCQkJCQlQUlhfQ09OVEVYVCAgcFJ4Q29udGV4dCA9ICYocEFkLT5SeENvbnRleHRbaV0pOwotCi0JCQkJCQkJCXBSeENvbnRleHQtPnBBZAk9IHBBZDsKLQkJCQkJCQkJcFJ4Q29udGV4dC0+SW5Vc2UJCT0gRkFMU0U7Ci0JCQkJCQkJCXBSeENvbnRleHQtPklSUFBlbmRpbmcJPSBGQUxTRTsKLQkJCQkJCQkJcFJ4Q29udGV4dC0+UmVhZGFibGUJPSBGQUxTRTsKLQkJCQkJCQkJcFJ4Q29udGV4dC0+UmVvcmRlckluVXNlID0gRkFMU0U7Ci0KLQkJCQkJCQl9Ci0JCQkJCQkJUlRVU0JCdWxrUmVjZWl2ZShwQWQpOwotCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkJ1bGtSZWNlaXZlXG4iKSk7Ci0JCQkJCQl9Ki8KLQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVDw9PT1cbiIpKTsKLSAgICAJICAgCQkJYnJlYWs7Ci0KLQkJCQljYXNlIENNRFRIUkVBRF9SRVNFVF9CVUxLX0lOOgotCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQ21kVGhyZWFkIDogQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU4gPT09ID5cbiIpKTsKLQotCQkJCQkvLyBBbGwgdHJhbnNmZXJzIG11c3QgYmUgYWJvcnRlZCBvciBjYW5jZWxsZWQgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcmVzZXQgdGhlIHBpcGUuCi0JCQkJCXsKLQkJCQkJCVVJTlQzMgkJTUFDVmFsdWU7Ci0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCQkJCQkJewotCQkJCQkJLy93aGlsZSAoKGF0b21pY19yZWFkKCZwQWQtPlBlbmRpbmdSeCkgPiAwKSAmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCi0JCQkJCQlpZigocEFkLT5QZW5kaW5nUnggPiAwKSAmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCi0JCQkJCQl7Ci0JCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIkJ1bGtJbiBJUlAgUGVuZGluZyEhIVxuIikpOwotCQkJCQkJCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUChwQWQpOworCQkJCQkJCURCR1BSSU5UX1JBVworCQkJCQkJCSAgICAoUlRfREVCVUdfRVJST1IsCisJCQkJCQkJICAgICAoIkJ1bGtJbiBJUlAgUGVuZGluZyEhIVxuIikpOworCQkJCQkJCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUAorCQkJCQkJCSAgICAocEFkKTsKIAkJCQkJCQlSVE1QdXNlY0RlbGF5KDEwMDAwMCk7CiAJCQkJCQkJcEFkLT5QZW5kaW5nUnggPSAwOwogCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJLyogV2FpdCAxMG1zIGJlZm9yZSByZWFkaW5nIHJlZ2lzdGVyLiAqLworCQkJCQlSVE1QdXNlY0RlbGF5KDEwMDAwKTsKKwkJCQkJbnRTdGF0dXMgPQorCQkJCQkgICAgUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBNQUNfQ1NSMCwKKwkJCQkJCQkJICZNQUNWYWx1ZSk7CisKKwkJCQkJaWYgKChOVF9TVUNDRVNTKG50U3RhdHVzKSA9PSBUUlVFKSAmJgorCQkJCQkgICAgKCEoUlRNUF9URVNUX0ZMQUcKKwkJCQkJICAgICAgIChwQWQsCisJCQkJCQkoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUworCQkJCQkJIHwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAorCQkJCQkJIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUworCQkJCQkJIHwKKwkJCQkJCSBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpKQorCQkJCQl7CisJCQkJCQl1OCBpOworCisJCQkJCQlpZiAoUlRNUF9URVNUX0ZMQUcKKwkJCQkJCSAgICAocEFkLAorCQkJCQkJICAgICAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUworCQkJCQkJICAgICAgfCBmUlRNUF9BREFQVEVSX1JBRElPX09GRgorCQkJCQkJICAgICAgfAorCQkJCQkJICAgICAgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTCisJCQkJCQkgICAgICB8CisJCQkJCQkgICAgICBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwkJCQkJCQlicmVhazsKKwkJCQkJCXBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24gPQorCQkJCQkJICAgIHBBZC0+UnhDb250ZXh0W3BBZC0+CisJCQkJCQkJCSAgIE5leHRSeEJ1bGtJbkluZGV4XS4KKwkJCQkJCSAgICBCdWxrSW5PZmZzZXQ7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCQkgKCJCVUxLX0lOX1JFU0VUOiBOQklJZHg9MHgleCxOQklSSWR4PTB4JXgsIEJJUlBvcz0weCVseC4gQklSZXE9eCVseCwgQklDb21wbGV0ZT0weCVseCwgQklDRmFpbDB4JWx4XG4iLAorCQkJCQkJCSAgcEFkLT4KKwkJCQkJCQkgIE5leHRSeEJ1bGtJbkluZGV4LAorCQkJCQkJCSAgcEFkLT4KKwkJCQkJCQkgIE5leHRSeEJ1bGtJblJlYWRJbmRleCwKKwkJCQkJCQkgIHBBZC0+CisJCQkJCQkJICBOZXh0UnhCdWxrSW5Qb3NpdGlvbiwKKwkJCQkJCQkgIHBBZC0+QnVsa0luUmVxLAorCQkJCQkJCSAgcEFkLT5CdWxrSW5Db21wbGV0ZSwKKwkJCQkJCQkgIHBBZC0+CisJCQkJCQkJICBCdWxrSW5Db21wbGV0ZUZhaWwpKTsKKwkJCQkJCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7CisJCQkJCQkgICAgIGkrKykgeworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJCQkgKCJcdFJ4Q29udGV4dFslZF06IElSUFBlbmRpbmc9JWQsIEluVXNlPSVkLCBSZWFkYWJsZT0lZCFcbiIsCisJCQkJCQkJCSAgaSwKKwkJCQkJCQkJICBwQWQtPgorCQkJCQkJCQkgIFJ4Q29udGV4dFtpXS4KKwkJCQkJCQkJICBJUlBQZW5kaW5nLAorCQkJCQkJCQkgIHBBZC0+CisJCQkJCQkJCSAgUnhDb250ZXh0W2ldLgorCQkJCQkJCQkgIEluVXNlLAorCQkJCQkJCQkgIHBBZC0+CisJCQkJCQkJCSAgUnhDb250ZXh0W2ldLgorCQkJCQkJCQkgIFJlYWRhYmxlKSk7CiAJCQkJCQl9CisJCQkJCQkvKgogCi0JCQkJCQkvLyBXYWl0IDEwbXMgYmVmb3JlIHJlYWRpbmcgcmVnaXN0ZXIuCi0JCQkJCQlSVE1QdXNlY0RlbGF5KDEwMDAwKTsKLQkJCQkJCW50U3RhdHVzID0gUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBNQUNfQ1NSMCwgJk1BQ1ZhbHVlKTsKKwkJCQkJCSAgIERCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpKTsKIAotCQkJCQkJaWYgKChOVF9TVUNDRVNTKG50U3RhdHVzKSA9PSBUUlVFKSAmJgotCQkJCQkJCSghKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8Ci0JCQkJCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKSkKLQkJCQkJCXsKLQkJCQkJCQlVQ0hBUglpOworCQkJCQkJICAgcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXggPSAwOyAgICAgIC8vIE5leHQgUnggUmVhZCBpbmRleAorCQkJCQkJICAgcEFkLT5OZXh0UnhCdWxrSW5JbmRleCAgICAgICAgICAgICAgID0gMDsgICAgLy8gUnggQnVsayBwb2ludGVyCisJCQkJCQkgICBmb3IgKGkgPSAwOyBpIDwgKFJYX1JJTkdfU0laRSk7IGkrKykKKwkJCQkJCSAgIHsKKwkJCQkJCSAgIHN0cnVjdCBydF9yeF9jb250ZXh0ICpwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7CiAKLQkJCQkJCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGIHwKLQkJCQkJCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCisJCQkJCQkgICBwUnhDb250ZXh0LT5wQWQgICAgICA9IHBBZDsKKwkJCQkJCSAgIHBSeENvbnRleHQtPkluVXNlICAgICAgICAgICAgPSBGQUxTRTsKKwkJCQkJCSAgIHBSeENvbnRleHQtPklSUFBlbmRpbmcgICAgICAgPSBGQUxTRTsKKwkJCQkJCSAgIHBSeENvbnRleHQtPlJlYWRhYmxlID0gRkFMU0U7CisJCQkJCQkgICBwUnhDb250ZXh0LT5SZW9yZGVySW5Vc2UgPSBGQUxTRTsKKworCQkJCQkJICAgfSAqLworCQkJCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQpOworCQkJCQkJZm9yIChpID0gMDsKKwkJCQkJCSAgICAgaSA8CisJCQkJCQkgICAgIHBBZC0+Q29tbW9uQ2ZnLgorCQkJCQkJICAgICBOdW1PZkJ1bGtJbklSUDsgaSsrKSB7CisJCQkJCQkJLypSVFVTQkJ1bGtSZWNlaXZlKHBBZCk7ICovCisJCQkJCQkJc3RydWN0IHJ0X3J4X2NvbnRleHQgKnBSeENvbnRleHQ7CisJCQkJCQkJUFVSQiBwVXJiOworCQkJCQkJCWludCByZXQgPSAwOworCQkJCQkJCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CisKKwkJCQkJCQlSVE1QX0lSUV9MT0NLKCZwQWQtPgorCQkJCQkJCQkgICAgICBCdWxrSW5Mb2NrLAorCQkJCQkJCQkgICAgICBJcnFGbGFncyk7CisJCQkJCQkJcFJ4Q29udGV4dCA9CisJCQkJCQkJICAgICYocEFkLT4KKwkJCQkJCQkgICAgICBSeENvbnRleHRbcEFkLT4KKwkJCQkJCQkJCU5leHRSeEJ1bGtJbkluZGV4XSk7CisJCQkJCQkJaWYgKChwQWQtPlBlbmRpbmdSeCA+IDApCisJCQkJCQkJICAgIHx8IChwUnhDb250ZXh0LT4KKwkJCQkJCQkJUmVhZGFibGUgPT0KKwkJCQkJCQkJVFJVRSkKKwkJCQkJCQkgICAgfHwgKHBSeENvbnRleHQtPgorCQkJCQkJCQlJblVzZSA9PQorCQkJCQkJCQlUUlVFKSkgeworCQkJCQkJCQlSVE1QX0lSUV9VTkxPQ0sKKwkJCQkJCQkJICAgICgmcEFkLT4KKwkJCQkJCQkJICAgICBCdWxrSW5Mb2NrLAorCQkJCQkJCQkgICAgIElycUZsYWdzKTsKIAkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbiA9IHBBZC0+UnhDb250ZXh0W3BBZC0+TmV4dFJ4QnVsa0luSW5kZXhdLkJ1bGtJbk9mZnNldDsKLQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCVUxLX0lOX1JFU0VUOiBOQklJZHg9MHgleCxOQklSSWR4PTB4JXgsIEJJUlBvcz0weCVseC4gQklSZXE9eCVseCwgQklDb21wbGV0ZT0weCVseCwgQklDRmFpbDB4JWx4XG4iLAotCQkJCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5JbmRleCwgIHBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4LCBwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uLCBwQWQtPkJ1bGtJblJlcSwgcEFkLT5CdWxrSW5Db21wbGV0ZSwgcEFkLT5CdWxrSW5Db21wbGV0ZUZhaWwpKTsKLQkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspCi0JCQkJCQkJewotIAkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiXHRSeENvbnRleHRbJWRdOiBJUlBQZW5kaW5nPSVkLCBJblVzZT0lZCwgUmVhZGFibGU9JWQhXG4iCi0JCQkJCQkJCQksIGksIHBBZC0+UnhDb250ZXh0W2ldLklSUFBlbmRpbmcsIHBBZC0+UnhDb250ZXh0W2ldLkluVXNlLCBwQWQtPlJ4Q29udGV4dFtpXS5SZWFkYWJsZSkpOwogCQkJCQkJCX0KLSAJCQkJCQkJLyoKKwkJCQkJCQlwUnhDb250ZXh0LT5JblVzZSA9CisJCQkJCQkJICAgIFRSVUU7CisJCQkJCQkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9CisJCQkJCQkJICAgIFRSVUU7CisJCQkJCQkJcEFkLT5QZW5kaW5nUngrKzsKKwkJCQkJCQlwQWQtPkJ1bGtJblJlcSsrOworCQkJCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT4KKwkJCQkJCQkJCUJ1bGtJbkxvY2ssCisJCQkJCQkJCQlJcnFGbGFncyk7CiAKLQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKSk7CisJCQkJCQkJLyogSW5pdCBSeCBjb250ZXh0IGRlc2NyaXB0b3IgKi8KKwkJCQkJCQlSVFVTQkluaXRSeERlc2MocEFkLAorCQkJCQkJCQkJcFJ4Q29udGV4dCk7CisJCQkJCQkJcFVyYiA9IHBSeENvbnRleHQtPnBVcmI7CisJCQkJCQkJaWYgKChyZXQgPSBSVFVTQl9TVUJNSVRfVVJCKHBVcmIpKSAhPSAwKSB7CS8qIGZhaWwgKi8KIAotCQkJCQkJCXBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4ID0gMDsJLy8gTmV4dCBSeCBSZWFkIGluZGV4Ci0JCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5JbmRleAkJPSAwOwkvLyBSeCBCdWxrIHBvaW50ZXIKLQkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgKFJYX1JJTkdfU0laRSk7IGkrKykKLQkJCQkJCQl7Ci0JCQkJCQkJCVBSWF9DT05URVhUICBwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7Ci0KLQkJCQkJCQkJcFJ4Q29udGV4dC0+cEFkCT0gcEFkOwotCQkJCQkJCQlwUnhDb250ZXh0LT5JblVzZQkJPSBGQUxTRTsKLQkJCQkJCQkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZwk9IEZBTFNFOwotCQkJCQkJCQlwUnhDb250ZXh0LT5SZWFkYWJsZQk9IEZBTFNFOwotCQkJCQkJCQlwUnhDb250ZXh0LT5SZW9yZGVySW5Vc2UgPSBGQUxTRTsKLQotCQkJCQkJCX0qLwotCQkJCQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS0lOX1JFU0VUKTsKLQkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgcEFkLT5Db21tb25DZmcuTnVtT2ZCdWxrSW5JUlA7IGkrKykKLQkJCQkJCQl7Ci0JCQkJCQkJCS8vUlRVU0JCdWxrUmVjZWl2ZShwQWQpOwotCQkJCQkJCQlQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dDsKLQkJCQkJCQkJUFVSQgkJCXBVcmI7Ci0JCQkJCQkJCWludAkJCQlyZXQgPSAwOwotCQkJCQkJCQl1bnNpZ25lZCBsb25nCUlycUZsYWdzOwotCi0KLQkJCQkJCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7Ci0JCQkJCQkJCXBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W3BBZC0+TmV4dFJ4QnVsa0luSW5kZXhdKTsKLQkJCQkJCQkJaWYgKChwQWQtPlBlbmRpbmdSeCA+IDApIHx8IChwUnhDb250ZXh0LT5SZWFkYWJsZSA9PSBUUlVFKSB8fCAocFJ4Q29udGV4dC0+SW5Vc2UgPT0gVFJVRSkpCi0JCQkJCQkJCXsKLQkJCQkJCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCQlwUnhDb250ZXh0LT5JblVzZSA9IFRSVUU7Ci0JCQkJCQkJCXBSeENvbnRleHQtPklSUFBlbmRpbmcgPSBUUlVFOwotCQkJCQkJCQlwQWQtPlBlbmRpbmdSeCsrOwotCQkJCQkJCQlwQWQtPkJ1bGtJblJlcSsrOwotCQkJCQkJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOwotCi0JCQkJCQkJCS8vIEluaXQgUnggY29udGV4dCBkZXNjcmlwdG9yCi0JCQkJCQkJCVJUVVNCSW5pdFJ4RGVzYyhwQWQsIHBSeENvbnRleHQpOwotCQkJCQkJCQlwVXJiID0gcFJ4Q29udGV4dC0+cFVyYjsKLQkJCQkJCQkJaWYgKChyZXQgPSBSVFVTQl9TVUJNSVRfVVJCKHBVcmIpKSE9MCkKLQkJCQkJCQkJewkvLyBmYWlsCi0KLQkJCQkJCQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOwotCQkJCQkJCQkJcFJ4Q29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKLQkJCQkJCQkJCXBSeENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKLQkJCQkJCQkJCXBBZC0+UGVuZGluZ1J4LS07Ci0JCQkJCQkJCQlwQWQtPkJ1bGtJblJlcS0tOwotCQkJCQkJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKLQkJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkNNRFRIUkVBRF9SRVNFVF9CVUxLX0lOOiBTdWJtaXQgUnggVVJCIGZhaWxlZCglZCksIHN0YXR1cz0lZFxuIiwgcmV0LCBwVXJiLT5zdGF0dXMpKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlCi0JCQkJCQkJCXsJLy8gc3VjY2VzcwotCQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkNNRFRIUkVBRF9SRVNFVF9CVUxLX0lOOiBTdWJtaXQgUnggVVJCIERvbmUsIHN0YXR1cz0lZCFcbiIsIHBVcmItPnN0YXR1cykpOwotCQkJCQkJCQkJQVNTRVJUKChwUnhDb250ZXh0LT5JblVzZSA9PSBwUnhDb250ZXh0LT5JUlBQZW5kaW5nKSk7Ci0JCQkJCQkJCX0KKwkJCQkJCQkJUlRNUF9JUlFfTE9DSworCQkJCQkJCQkgICAgKCZwQWQtPgorCQkJCQkJCQkgICAgIEJ1bGtJbkxvY2ssCisJCQkJCQkJCSAgICAgSXJxRmxhZ3MpOworCQkJCQkJCQlwUnhDb250ZXh0LT4KKwkJCQkJCQkJICAgIEluVXNlID0KKwkJCQkJCQkJICAgIEZBTFNFOworCQkJCQkJCQlwUnhDb250ZXh0LT4KKwkJCQkJCQkJICAgIElSUFBlbmRpbmcgPQorCQkJCQkJCQkgICAgRkFMU0U7CisJCQkJCQkJCXBBZC0+CisJCQkJCQkJCSAgICBQZW5kaW5nUngtLTsKKwkJCQkJCQkJcEFkLT4KKwkJCQkJCQkJICAgIEJ1bGtJblJlcS0tOworCQkJCQkJCQlSVE1QX0lSUV9VTkxPQ0sKKwkJCQkJCQkJICAgICgmcEFkLT4KKwkJCQkJCQkJICAgICBCdWxrSW5Mb2NrLAorCQkJCQkJCQkgICAgIElycUZsYWdzKTsKKwkJCQkJCQkJREJHUFJJTlQKKwkJCQkJCQkJICAgIChSVF9ERUJVR19FUlJPUiwKKwkJCQkJCQkJICAgICAoIkNNRFRIUkVBRF9SRVNFVF9CVUxLX0lOOiBTdWJtaXQgUnggVVJCIGZhaWxlZCglZCksIHN0YXR1cz0lZFxuIiwKKwkJCQkJCQkJICAgICAgcmV0LAorCQkJCQkJCQkgICAgICBwVXJiLT4KKwkJCQkJCQkJICAgICAgc3RhdHVzKSk7CisJCQkJCQkJfSBlbHNlIHsJLyogc3VjY2VzcyAqLworCQkJCQkJCQkvKkRCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJJRG9uZSwgUGVuZD0lZCxCSUlkeD0lZCxCSVJJZHg9JWQhXG4iLCAqLworCQkJCQkJCQkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+UGVuZGluZ1J4LCBwQWQtPk5leHRSeEJ1bGtJbkluZGV4LCBwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCkpOyAqLworCQkJCQkJCQlEQkdQUklOVF9SQVcKKwkJCQkJCQkJICAgIChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCQkJICAgICAoIkNNRFRIUkVBRF9SRVNFVF9CVUxLX0lOOiBTdWJtaXQgUnggVVJCIERvbmUsIHN0YXR1cz0lZCFcbiIsCisJCQkJCQkJCSAgICAgIHBVcmItPgorCQkJCQkJCQkgICAgICBzdGF0dXMpKTsKKwkJCQkJCQkJQVNTRVJUKChwUnhDb250ZXh0LT5JblVzZSA9PSBwUnhDb250ZXh0LT5JUlBQZW5kaW5nKSk7CiAJCQkJCQkJfQotCiAJCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJLy8gQ2FyZCBtdXN0IGJlIHJlbW92ZWQKLQkJCQkJCQlpZiAoTlRfU1VDQ0VTUyhudFN0YXR1cykgIT0gVFJVRSkKLQkJCQkJCQl7Ci0JCQkJCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCk7Ci0JCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJDTURUSFJFQURfUkVTRVRfQlVMS19JTjogUmVhZCBSZWdpc3RlciBGYWlsZWQhQ2FyZCBtdXN0IGJlIHJlbW92ZWQhIVxuXG4iKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UKLQkJCQkJCQl7Ci0JCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJDTURUSFJFQURfUkVTRVRfQlVMS19JTjogQ2Fubm90IGRvIGJ1bGsgaW4gYmVjYXVzZSBmbGFncygweCVseCkgb24gIVxuIiwgcEFkLT5GbGFncykpOworCisJCQkJCX0gZWxzZSB7CisJCQkJCQkvKiBDYXJkIG11c3QgYmUgcmVtb3ZlZCAqLworCQkJCQkJaWYgKE5UX1NVQ0NFU1MobnRTdGF0dXMpICE9CisJCQkJCQkgICAgVFJVRSkgeworCQkJCQkJCVJUTVBfU0VUX0ZMQUcocEFkLAorCQkJCQkJCQkgICAgICBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpOworCQkJCQkJCURCR1BSSU5UX1JBVworCQkJCQkJCSAgICAoUlRfREVCVUdfRVJST1IsCisJCQkJCQkJICAgICAoIkNNRFRIUkVBRF9SRVNFVF9CVUxLX0lOOiBSZWFkIFJlZ2lzdGVyIEZhaWxlZCFDYXJkIG11c3QgYmUgcmVtb3ZlZCEhXG5cbiIpKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJREJHUFJJTlRfUkFXCisJCQkJCQkJICAgIChSVF9ERUJVR19FUlJPUiwKKwkJCQkJCQkgICAgICgiQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU46IENhbm5vdCBkbyBidWxrIGluIGJlY2F1c2UgZmxhZ3MoMHglbHgpIG9uICFcbiIsCisJCQkJCQkJICAgICAgcEFkLT5GbGFncykpOwogCQkJCQkJfQogCQkJCQl9Ci0JCQkJCX0KLQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9SRVNFVF9CVUxLX0lOIDw9PT1cbiIpKTsKLQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkJICAgICAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9SRVNFVF9CVUxLX0lOIDw9PT1cbiIpKTsKKwkJCQlicmVhazsKIAotCQkJCWNhc2UgQ01EVEhSRUFEX1NFVF9BU0lDX1dDSUQ6CisJCQljYXNlIENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lEOgorCQkJCXsKKwkJCQkJc3RydWN0IHJ0X3NldF9hc2ljX3djaWQgU2V0QXNpY1djaWQ7CisJCQkJCXUxNiBvZmZzZXQ7CisJCQkJCXUzMiBNQUNWYWx1ZSwgTUFDUlZhbHVlID0gMDsKKwkJCQkJU2V0QXNpY1djaWQgPQorCQkJCQkgICAgKigoc3RydWN0IHJ0X3NldF9hc2ljX3djaWQgKikocERhdGEpKTsKKworCQkJCQlpZiAoU2V0QXNpY1djaWQuV0NJRCA+PQorCQkJCQkgICAgTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCQkJCQlyZXR1cm47CisKKwkJCQkJb2Zmc2V0ID0KKwkJCQkJICAgIE1BQ19XQ0lEX0JBU0UgKworCQkJCQkgICAgKCh1OClTZXRBc2ljV2NpZC5XQ0lEKSAqCisJCQkJCSAgICBIV19XQ0lEX0VOVFJZX1NJWkU7CisKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICAgICAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lEIDogV0NJRCA9ICVsZCwgU2V0VGlkICA9ICVseCwgRGVsZXRlVGlkID0gJWx4LlxuIiwKKwkJCQkJCSAgICAgIFNldEFzaWNXY2lkLldDSUQsCisJCQkJCQkgICAgICBTZXRBc2ljV2NpZC5TZXRUaWQsCisJCQkJCQkgICAgICBTZXRBc2ljV2NpZC5EZWxldGVUaWQpKTsKKwkJCQkJTUFDVmFsdWUgPQorCQkJCQkgICAgKHBBZC0+TWFjVGFiLgorCQkJCQkgICAgIENvbnRlbnRbU2V0QXNpY1djaWQuV0NJRF0uCisJCQkJCSAgICAgQWRkclszXSA8PCAyNCkgKworCQkJCQkgICAgKHBBZC0+TWFjVGFiLgorCQkJCQkgICAgIENvbnRlbnRbU2V0QXNpY1djaWQuV0NJRF0uCisJCQkJCSAgICAgQWRkclsyXSA8PCAxNikgKworCQkJCQkgICAgKHBBZC0+TWFjVGFiLgorCQkJCQkgICAgIENvbnRlbnRbU2V0QXNpY1djaWQuV0NJRF0uCisJCQkJCSAgICAgQWRkclsxXSA8PCA4KSArCisJCQkJCSAgICAocEFkLT5NYWNUYWIuCisJCQkJCSAgICAgQ29udGVudFtTZXRBc2ljV2NpZC5XQ0lEXS5BZGRyWzBdKTsKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICAgICAoIjEtTUFDVmFsdWU9ICV4LFxuIiwKKwkJCQkJCSAgICAgIE1BQ1ZhbHVlKSk7CisJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwKKwkJCQkJCQkgICAgICBNQUNWYWx1ZSk7CisJCQkJCS8qIFJlYWQgYml0bWFzayAqLworCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIG9mZnNldCArIDQsCisJCQkJCQkJICAgICAmTUFDUlZhbHVlKTsKKwkJCQkJaWYgKFNldEFzaWNXY2lkLkRlbGV0ZVRpZCAhPSAweGZmZmZmZmZmKQorCQkJCQkJTUFDUlZhbHVlICY9CisJCQkJCQkgICAgKH5TZXRBc2ljV2NpZC5EZWxldGVUaWQpOworCQkJCQlpZiAoU2V0QXNpY1djaWQuU2V0VGlkICE9IDB4ZmZmZmZmZmYpCisJCQkJCQlNQUNSVmFsdWUgfD0KKwkJCQkJCSAgICAoU2V0QXNpY1djaWQuU2V0VGlkKTsKKwkJCQkJTUFDUlZhbHVlICY9IDB4ZmZmZjAwMDA7CisKKwkJCQkJTUFDVmFsdWUgPQorCQkJCQkgICAgKHBBZC0+TWFjVGFiLgorCQkJCQkgICAgIENvbnRlbnRbU2V0QXNpY1djaWQuV0NJRF0uCisJCQkJCSAgICAgQWRkcls1XSA8PCA4KSArCisJCQkJCSAgICBwQWQtPk1hY1RhYi5Db250ZW50W1NldEFzaWNXY2lkLgorCQkJCQkJCQlXQ0lEXS5BZGRyWzRdOworCQkJCQlNQUNWYWx1ZSB8PSBNQUNSVmFsdWU7CisJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCArIDQsCisJCQkJCQkJICAgICAgTUFDVmFsdWUpOworCisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAgICAgKCIyLU1BQ1ZhbHVlPSAleCxcbiIsCisJCQkJCQkgICAgICBNQUNWYWx1ZSkpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBDTURUSFJFQURfU0VUX0FTSUNfV0NJRF9DSVBIRVI6CisJCQkJeworCQkJCQlzdHJ1Y3QgcnRfc2V0X2FzaWNfd2NpZF9hdHRyaSBTZXRBc2ljV2NpZEF0dHJpOworCQkJCQl1MTYgb2Zmc2V0OworCQkJCQl1MzIgTUFDUlZhbHVlID0gMDsKKwkJCQkJU0hBUkVES0VZX01PREVfU1RSVUMgY3NyMTsKKwkJCQkJU2V0QXNpY1djaWRBdHRyaSA9CisJCQkJCSAgICAqKChzdHJ1Y3QgcnRfc2V0X2FzaWNfd2NpZF9hdHRyaSAqKQorCQkJCQkgICAgICAocERhdGEpKTsKKworCQkJCQlpZiAoU2V0QXNpY1djaWRBdHRyaS5XQ0lEID49CisJCQkJCSAgICBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJCQkJCXJldHVybjsKKworCQkJCQlvZmZzZXQgPQorCQkJCQkgICAgTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKworCQkJCQkgICAgKCh1OClTZXRBc2ljV2NpZEF0dHJpLldDSUQpICoKKwkJCQkJICAgIEhXX1dDSURfQVRUUklfU0laRTsKKworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgICAgICgiQ21kIDogQ01EVEhSRUFEX1NFVF9BU0lDX1dDSURfQ0lQSEVSIDogV0NJRCA9ICVsZCwgQ2lwaGVyID0gJWx4LlxuIiwKKwkJCQkJCSAgICAgIFNldEFzaWNXY2lkQXR0cmkuV0NJRCwKKwkJCQkJCSAgICAgIFNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyKSk7CisJCQkJCS8qIFJlYWQgYml0bWFzayAqLworCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwKKwkJCQkJCQkgICAgICZNQUNSVmFsdWUpOworCQkJCQlNQUNSVmFsdWUgPSAwOworCQkJCQlNQUNSVmFsdWUgfD0KKwkJCQkJICAgICgoKHU4KVNldEFzaWNXY2lkQXR0cmkuCisJCQkJCSAgICAgIENpcGhlcikgPDwgMSk7CisKKwkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0LAorCQkJCQkJCSAgICAgIE1BQ1JWYWx1ZSk7CisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAgICAgKCIyLW9mZnNldCA9ICV4ICwgTUFDVmFsdWU9ICV4LFxuIiwKKwkJCQkJCSAgICAgIG9mZnNldCwgTUFDUlZhbHVlKSk7CisKKwkJCQkJb2Zmc2V0ID0KKwkJCQkJICAgIFBBSVJXSVNFX0lWRUlWX1RBQkxFX0JBU0UgKworCQkJCQkgICAgKCh1OClTZXRBc2ljV2NpZEF0dHJpLldDSUQpICoKKwkJCQkJICAgIEhXX0lWRUlWX0VOVFJZX1NJWkU7CisJCQkJCU1BQ1JWYWx1ZSA9IDA7CisJCQkJCWlmICgoU2V0QXNpY1djaWRBdHRyaS5DaXBoZXIgPD0KKwkJCQkJICAgICBDSVBIRVJfV0VQMTI4KSkKKwkJCQkJCU1BQ1JWYWx1ZSB8PQorCQkJCQkJICAgIChwQWQtPlN0YUNmZy4KKwkJCQkJCSAgICAgRGVmYXVsdEtleUlkIDw8IDMwKTsKKwkJCQkJZWxzZQorCQkJCQkJTUFDUlZhbHVlIHw9ICgweDIwMDAwMDAwKTsKKwkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0LAorCQkJCQkJCSAgICAgIE1BQ1JWYWx1ZSk7CisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAgICAgKCIyLW9mZnNldCA9ICV4ICwgTUFDVmFsdWU9ICV4LFxuIiwKKwkJCQkJCSAgICAgIG9mZnNldCwgTUFDUlZhbHVlKSk7CisKKwkJCQkJLyogKi8KKwkJCQkJLyogVXBkYXRlIGNpcGhlciBhbGdvcml0aG0uIFdTVEEgYWx3YXlzIHVzZSBCU1MwICovCisJCQkJCS8qICovCisJCQkJCS8qIGZvciBhZGhvYyBtb2RlIG9ubHkgLGJlY2F1c2Ugd2VwIHN0YXR1cyBzbG93IHRoYW4gYWRkIGtleSwgd2hlbiB1c2UgemVybyBjb25maWcgKi8KKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKSB7CisJCQkJCQlvZmZzZXQgPQorCQkJCQkJICAgIE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFOworCisJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsCisJCQkJCQkJCSAgICAgb2Zmc2V0LAorCQkJCQkJCQkgICAgICZNQUNSVmFsdWUpOworCQkJCQkJTUFDUlZhbHVlICY9ICh+MHhlKTsKKwkJCQkJCU1BQ1JWYWx1ZSB8PQorCQkJCQkJICAgICgoKHU4KVNldEFzaWNXY2lkQXR0cmkuCisJCQkJCQkgICAgICBDaXBoZXIpIDw8IDEpOworCisJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLAorCQkJCQkJCQkgICAgICBvZmZzZXQsCisJCQkJCQkJCSAgICAgIE1BQ1JWYWx1ZSk7CisKKwkJCQkJCS8qVXBkYXRlIGdyb3VwIGtleSBjaXBoZXIsLGJlY2F1c2Ugd2VwIHN0YXR1cyBzbG93IHRoYW4gYWRkIGtleSwgd2hlbiB1c2UgemVybyBjb25maWcgKi8KKwkJCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwKKwkJCQkJCQkJICAgICBTSEFSRURfS0VZX01PREVfQkFTRQorCQkJCQkJCQkgICAgICsKKwkJCQkJCQkJICAgICA0ICogKDAgLworCQkJCQkJCQkJICAyKSwKKwkJCQkJCQkJICAgICAmY3NyMS4KKwkJCQkJCQkJICAgICB3b3JkKTsKKworCQkJCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9CisJCQkJCQkgICAgU2V0QXNpY1djaWRBdHRyaS5DaXBoZXI7CisJCQkJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0KKwkJCQkJCSAgICBTZXRBc2ljV2NpZEF0dHJpLkNpcGhlcjsKKworCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwKKwkJCQkJCQkJICAgICAgU0hBUkVEX0tFWV9NT0RFX0JBU0UKKwkJCQkJCQkJICAgICAgKworCQkJCQkJCQkgICAgICA0ICogKDAgLworCQkJCQkJCQkJICAgMiksCisJCQkJCQkJCSAgICAgIGNzcjEuCisJCQkJCQkJCSAgICAgIHdvcmQpOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCisvKkJlbnNvbiBtb2RpZmllZCBmb3IgVVNCIGludGVyZmFjZSwgYXZvaWQgaW4gaW50ZXJydXB0IHdoZW4gd3JpdGUga2V5LCAyMDA4MDcyNCAtLT4gKi8KKwkJCWNhc2UgUlRfQ01EX1NFVF9LRVlfVEFCTEU6CS8qR2VuZXJhbCBjYWxsIGZvciBBc2ljQWRkUGFpcndpc2VLZXlFbnRyeSgpICovCisJCQkJeworCQkJCQlzdHJ1Y3QgcnRfYWRkX3BhaXJ3aXNlX2tleV9lbnRyeSBLZXlJbmZvOworCQkJCQlLZXlJbmZvID0KKwkJCQkJICAgICooKHN0cnVjdCBydF9hZGRfcGFpcndpc2Vfa2V5X2VudHJ5ICopCisJCQkJCSAgICAgIChwRGF0YSkpOworCQkJCQlBc2ljQWRkUGFpcndpc2VLZXlFbnRyeShwQWQsCisJCQkJCQkJCUtleUluZm8uTWFjQWRkciwKKwkJCQkJCQkJKHU4KUtleUluZm8uCisJCQkJCQkJCU1hY1RhYk1hdGNoV0NJRCwKKwkJCQkJCQkJJktleUluZm8uCisJCQkJCQkJCUNpcGhlcktleSk7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIFJUX0NNRF9TRVRfUlhfV0NJRF9UQUJMRToJLypHZW5lcmFsIGNhbGwgZm9yIFJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkoKSAqLworCQkJCXsKKwkJCQkJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5OworCQkJCQl1OCBLZXlJZHggPSAwOworCQkJCQl1OCBDaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCQkJdTggQXBJZHggPSBCU1MwOworCisJCQkJCXBFbnRyeSA9IChzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICopKHBEYXRhKTsKKworCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCQkJICBBcElkeCwKKwkJCQkJCQkJICBLZXlJZHgsCisJCQkJCQkJCSAgQ2lwaGVyQWxnLAorCQkJCQkJCQkgIHBFbnRyeSk7CisJCQkJfQorCQkJCWJyZWFrOworLypCZW5zb24gbW9kaWZpZWQgZm9yIFVTQiBpbnRlcmZhY2UsIGF2b2lkIGluIGludGVycnVwdCB3aGVuIHdyaXRlIGtleSwgMjAwODA3MjQgPC0tICovCisKKwkJCWNhc2UgQ01EVEhSRUFEX1NFVF9DTElFTlRfTUFDX0VOVFJZOgorCQkJCXsKKwkJCQkJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5OworCQkJCQlwRW50cnkgPSAoc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqKXBEYXRhOworCiAJCQkJCXsKLQkJCQkJCVJUX1NFVF9BU0lDX1dDSUQJU2V0QXNpY1djaWQ7Ci0JCQkJCQlVU0hPUlQJCW9mZnNldDsKLQkJCQkJCVVJTlQzMgkJTUFDVmFsdWUsIE1BQ1JWYWx1ZSA9IDA7Ci0JCQkJCQlTZXRBc2ljV2NpZCA9ICooKFBSVF9TRVRfQVNJQ19XQ0lEKShwRGF0YSkpOwotCi0JCQkJCQlpZiAoU2V0QXNpY1djaWQuV0NJRCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKLQkJCQkJCQlyZXR1cm47Ci0KLQkJCQkJCW9mZnNldCA9IE1BQ19XQ0lEX0JBU0UgKyAoKFVDSEFSKVNldEFzaWNXY2lkLldDSUQpKkhXX1dDSURfRU5UUllfU0laRTsKLQotCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lEIDogV0NJRCA9ICVsZCwgU2V0VGlkICA9ICVseCwgRGVsZXRlVGlkID0gJWx4LlxuIiwgU2V0QXNpY1djaWQuV0NJRCwgU2V0QXNpY1djaWQuU2V0VGlkLCBTZXRBc2ljV2NpZC5EZWxldGVUaWQpKTsKLQkJCQkJCU1BQ1ZhbHVlID0gKHBBZC0+TWFjVGFiLkNvbnRlbnRbU2V0QXNpY1djaWQuV0NJRF0uQWRkclszXTw8MjQpKyhwQWQtPk1hY1RhYi5Db250ZW50W1NldEFzaWNXY2lkLldDSURdLkFkZHJbMl08PDE2KSsocEFkLT5NYWNUYWIuQ29udGVudFtTZXRBc2ljV2NpZC5XQ0lEXS5BZGRyWzFdPDw4KSsocEFkLT5NYWNUYWIuQ29udGVudFtTZXRBc2ljV2NpZC5XQ0lEXS5BZGRyWzBdKTsKLQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIxLU1BQ1ZhbHVlPSAleCxcbiIsIE1BQ1ZhbHVlKSk7Ci0JCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsIE1BQ1ZhbHVlKTsKLQkJCQkJCS8vIFJlYWQgYml0bWFzawotCQkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQrNCwgJk1BQ1JWYWx1ZSk7Ci0JCQkJCQlpZiAoIFNldEFzaWNXY2lkLkRlbGV0ZVRpZCAhPSAweGZmZmZmZmZmKQotCQkJCQkJCU1BQ1JWYWx1ZSAmPSAoflNldEFzaWNXY2lkLkRlbGV0ZVRpZCk7Ci0JCQkJCQlpZiAoU2V0QXNpY1djaWQuU2V0VGlkICE9IDB4ZmZmZmZmZmYpCi0JCQkJCQkJTUFDUlZhbHVlIHw9IChTZXRBc2ljV2NpZC5TZXRUaWQpOwotCQkJCQkJTUFDUlZhbHVlICY9IDB4ZmZmZjAwMDA7Ci0KLQkJCQkJCU1BQ1ZhbHVlID0gKHBBZC0+TWFjVGFiLkNvbnRlbnRbU2V0QXNpY1djaWQuV0NJRF0uQWRkcls1XTw8OCkrcEFkLT5NYWNUYWIuQ29udGVudFtTZXRBc2ljV2NpZC5XQ0lEXS5BZGRyWzRdOwotCQkJCQkJTUFDVmFsdWUgfD0gTUFDUlZhbHVlOwotCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0KzQsIE1BQ1ZhbHVlKTsKLQotCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIjItTUFDVmFsdWU9ICV4LFxuIiwgTUFDVmFsdWUpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQ01EVEhSRUFEX1NFVF9BU0lDX1dDSURfQ0lQSEVSOgotCQkJCQl7Ci0JCQkJCQlSVF9TRVRfQVNJQ19XQ0lEX0FUVFJJCVNldEFzaWNXY2lkQXR0cmk7Ci0JCQkJCQlVU0hPUlQJCW9mZnNldDsKLQkJCQkJCVVJTlQzMgkJTUFDUlZhbHVlID0gMDsKLQkJCQkJCVNIQVJFREtFWV9NT0RFX1NUUlVDIGNzcjE7Ci0JCQkJCQlTZXRBc2ljV2NpZEF0dHJpID0gKigoUFJUX1NFVF9BU0lDX1dDSURfQVRUUkkpKHBEYXRhKSk7Ci0KLQkJCQkJCWlmIChTZXRBc2ljV2NpZEF0dHJpLldDSUQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCi0JCQkJCQkJcmV0dXJuOwotCi0JCQkJCQlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArICgoVUNIQVIpU2V0QXNpY1djaWRBdHRyaS5XQ0lEKSpIV19XQ0lEX0FUVFJJX1NJWkU7Ci0KLQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJDbWQgOiBDTURUSFJFQURfU0VUX0FTSUNfV0NJRF9DSVBIRVIgOiBXQ0lEID0gJWxkLCBDaXBoZXIgPSAlbHguXG4iLCBTZXRBc2ljV2NpZEF0dHJpLldDSUQsIFNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyKSk7Ci0JCQkJCQkvLyBSZWFkIGJpdG1hc2sKLQkJCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0LCAmTUFDUlZhbHVlKTsKLQkJCQkJCU1BQ1JWYWx1ZSA9IDA7Ci0JCQkJCQlNQUNSVmFsdWUgfD0gKCgoVUNIQVIpU2V0QXNpY1djaWRBdHRyaS5DaXBoZXIpIDw8IDEpOwotCi0JCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsIE1BQ1JWYWx1ZSk7Ci0JCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiMi1vZmZzZXQgPSAleCAsIE1BQ1ZhbHVlPSAleCxcbiIsIG9mZnNldCwgTUFDUlZhbHVlKSk7Ci0KLQkJCQkJCW9mZnNldCA9IFBBSVJXSVNFX0lWRUlWX1RBQkxFX0JBU0UgKyAoKFVDSEFSKVNldEFzaWNXY2lkQXR0cmkuV0NJRCkqSFdfSVZFSVZfRU5UUllfU0laRTsKLQkJCQkJCU1BQ1JWYWx1ZSA9IDA7Ci0JCQkJCQlpZiAoIChTZXRBc2ljV2NpZEF0dHJpLkNpcGhlciA8PSBDSVBIRVJfV0VQMTI4KSkKLQkJCQkJCQlNQUNSVmFsdWUgfD0gKCBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPDwgMzApOwotCQkJCQkJZWxzZQotCQkJCQkJCU1BQ1JWYWx1ZSB8PSAoMHgyMDAwMDAwMCk7Ci0JCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsIE1BQ1JWYWx1ZSk7Ci0JCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiMi1vZmZzZXQgPSAleCAsIE1BQ1ZhbHVlPSAleCxcbiIsIG9mZnNldCwgTUFDUlZhbHVlKSk7Ci0KLQkJCQkJCS8vCi0JCQkJCQkvLyBVcGRhdGUgY2lwaGVyIGFsZ29yaXRobS4gV1NUQSBhbHdheXMgdXNlIEJTUzAKLQkJCQkJCS8vCi0JCQkJCQkvLyBmb3IgYWRob2MgbW9kZSBvbmx5ICxiZWNhdXNlIHdlcCBzdGF0dXMgc2xvdyB0aGFuIGFkZCBrZXksIHdoZW4gdXNlIHplcm8gY29uZmlnCi0JCQkJCQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MgKQorCQkJCQkJQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkLAorCQkJCQkJCQkJICAgcEVudHJ5LT4KKwkJCQkJCQkJCSAgIGFwaWR4LAorCQkJCQkJCQkJICAgKHU4KQorCQkJCQkJCQkJICAgcEVudHJ5LT4KKwkJCQkJCQkJCSAgIEFpZCk7CisJCQkJCQlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPD0KKwkJCQkJCSAgICAgTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkKKwkJCQkJCSAgICAmJiAocEVudHJ5LT5XZXBTdGF0dXMgPT0KKwkJCQkJCQlOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSkKIAkJCQkJCXsKLQkJCQkJCQlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRTsKKwkJCQkJCQl1MzIgdUlWID0gMTsKKwkJCQkJCQl1OCAqcHRyOwogCi0JCQkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsICZNQUNSVmFsdWUpOwotCQkJCQkJCU1BQ1JWYWx1ZSAmPSAofjB4ZSk7Ci0JCQkJCQkJTUFDUlZhbHVlIHw9ICgoKFVDSEFSKVNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyKSA8PCAxKTsKKwkJCQkJCQlwdHIgPSAodTggKikmIHVJVjsKKwkJCQkJCQkqKHB0ciArIDMpID0KKwkJCQkJCQkgICAgKHBBZC0+U3RhQ2ZnLgorCQkJCQkJCSAgICAgRGVmYXVsdEtleUlkIDw8IDYpOworCQkJCQkJCUFzaWNVcGRhdGVXQ0lESVZFSVYocEFkLAorCQkJCQkJCQkJICAgIHBFbnRyeS0+CisJCQkJCQkJCQkgICAgQWlkLAorCQkJCQkJCQkJICAgIHVJViwKKwkJCQkJCQkJCSAgICAwKTsKKwkJCQkJCQlBc2ljVXBkYXRlV0NJREF0dHJpYnV0ZQorCQkJCQkJCSAgICAocEFkLCBwRW50cnktPkFpZCwKKwkJCQkJCQkgICAgIEJTUzAsCisJCQkJCQkJICAgICBwQWQtPgorCQkJCQkJCSAgICAgU2hhcmVkS2V5W0JTUzBdCisJCQkJCQkJICAgICBbcEFkLT5TdGFDZmcuCisJCQkJCQkJICAgICAgRGVmYXVsdEtleUlkXS4KKwkJCQkJCQkgICAgIENpcGhlckFsZywgRkFMU0UpOworCQkJCQkJfSBlbHNlIGlmIChwRW50cnktPkF1dGhNb2RlID09CisJCQkJCQkJICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJCQkJCXsKKwkJCQkJCQl1MzIgdUlWID0gMTsKKwkJCQkJCQl1OCAqcHRyOwogCi0JCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0LCBNQUNSVmFsdWUpOwotCi0JCQkJCQkJLy9VcGRhdGUgZ3JvdXAga2V5IGNpcGhlciwsYmVjYXVzZSB3ZXAgc3RhdHVzIHNsb3cgdGhhbiBhZGQga2V5LCB3aGVuIHVzZSB6ZXJvIGNvbmZpZwotCQkJCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UrNCooMC8yKSwgJmNzcjEud29yZCk7Ci0KLQkJCQkJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gU2V0QXNpY1djaWRBdHRyaS5DaXBoZXI7Ci0JCQkJCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IFNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyOwotCi0JCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UrNCooMC8yKSwgY3NyMS53b3JkKTsKKwkJCQkJCQlwdHIgPSAodTggKikmIHVJVjsKKwkJCQkJCQkqKHB0ciArIDMpID0KKwkJCQkJCQkgICAgKHBBZC0+U3RhQ2ZnLgorCQkJCQkJCSAgICAgRGVmYXVsdEtleUlkIDw8IDYpOworCQkJCQkJCUFzaWNVcGRhdGVXQ0lESVZFSVYocEFkLAorCQkJCQkJCQkJICAgIHBFbnRyeS0+CisJCQkJCQkJCQkgICAgQWlkLAorCQkJCQkJCQkJICAgIHVJViwKKwkJCQkJCQkJCSAgICAwKTsKKwkJCQkJCQlBc2ljVXBkYXRlV0NJREF0dHJpYnV0ZQorCQkJCQkJCSAgICAocEFkLCBwRW50cnktPkFpZCwKKwkJCQkJCQkgICAgIEJTUzAsCisJCQkJCQkJICAgICBwQWQtPgorCQkJCQkJCSAgICAgU2hhcmVkS2V5W0JTUzBdCisJCQkJCQkJICAgICBbcEFkLT5TdGFDZmcuCisJCQkJCQkJICAgICAgRGVmYXVsdEtleUlkXS4KKwkJCQkJCQkgICAgIENpcGhlckFsZywgRkFMU0UpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvKiAqLworCQkJCQkJCS8qIE90aGVyIGNhc2UsIGRpc2FibGUgZW5naW5lLiAqLworCQkJCQkJCS8qIERvbid0IHdvcnJ5IFdQQSBrZXksIHdlIHdpbGwgYWRkIFdQQSBLZXkgYWZ0ZXIgNC1XYXkgaGFuZHNoYWtpbmcuICovCisJCQkJCQkJLyogKi8KKwkJCQkJCQl1MTYgb2Zmc2V0OworCQkJCQkJCW9mZnNldCA9CisJCQkJCQkJICAgIE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFCisJCQkJCQkJICAgICsKKwkJCQkJCQkgICAgKHBFbnRyeS0+QWlkICoKKwkJCQkJCQkgICAgIEhXX1dDSURfQVRUUklfU0laRSk7CisJCQkJCQkJLyogUlhfUEtFWV9NT0RFOjAgZm9yIG5vIHNlY3VyaXR5OyBSWF9LRVlfVEFCOjAgZm9yIHNoYXJlZCBrZXkgdGFibGU7IEJTU19JRFg6MCAqLworCQkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcgorCQkJCQkJCSAgICAocEFkLCBvZmZzZXQsIDApOwogCQkJCQkJfQogCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ01EVEhSRUFEX1NFVF9DTElFTlRfTUFDX0VOVFJZOgotCQkJCQl7Ci0JCQkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKLQkJCQkJCXBFbnRyeSA9IChNQUNfVEFCTEVfRU5UUlkgKilwRGF0YTsKIAotCQkJCQkJewotCQkJCQkJCUFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwgcEVudHJ5LT5hcGlkeCwgKFVDSEFSKXBFbnRyeS0+QWlkKTsKLQkJCQkJCQlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPD0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkgJiYgKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpKQotCQkJCQkJCXsKLQkJCQkJCQkJVUlOVDMyIHVJViA9IDA7Ci0JCQkJCQkJCVBVQ0hBUiAgcHRyOworCQkJCQlBc2ljVXBkYXRlUnhXQ0lEVGFibGUocEFkLCBwRW50cnktPkFpZCwKKwkJCQkJCQkgICAgICBwRW50cnktPkFkZHIpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAoIlVwZGF0ZVJ4V0NJRFRhYmxlKCk6IEFpZD0lZCwgQWRkcj0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCFcbiIsCisJCQkJCQkgIHBFbnRyeS0+QWlkLCBwRW50cnktPkFkZHJbMF0sCisJCQkJCQkgIHBFbnRyeS0+QWRkclsxXSwKKwkJCQkJCSAgcEVudHJ5LT5BZGRyWzJdLAorCQkJCQkJICBwRW50cnktPkFkZHJbM10sCisJCQkJCQkgIHBFbnRyeS0+QWRkcls0XSwKKwkJCQkJCSAgcEVudHJ5LT5BZGRyWzVdKSk7CisJCQkJfQorCQkJCWJyZWFrOwogCi0JCQkJCQkJCXB0ciA9IChQVUNIQVIpICZ1SVY7Ci0JCQkJCQkJCSoocHRyICsgMykgPSAocEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkIDw8IDYpOwotCQkJCQkJCQlBc2ljVXBkYXRlV0NJRElWRUlWKHBBZCwgcEVudHJ5LT5BaWQsIHVJViwgMCk7Ci0JCQkJCQkJCUFzaWNVcGRhdGVXQ0lEQXR0cmlidXRlKHBBZCwgcEVudHJ5LT5BaWQsIEJTUzAsIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLCBGQUxTRSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYgKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKLQkJCQkJCQl7Ci0JCQkJCQkJCVVJTlQzMiB1SVYgPSAwOwotCQkJCQkJCQlQVUNIQVIgIHB0cjsKKy8qIGFkZCBieSBqb2hubGksIGZpeCAiaW5faW50ZXJydXB0IiBlcnJvciB3aGVuIGNhbGwgIk1hY1RhYmxlRGVsZXRlRW50cnkiIGluIFJ4IHRhc2tsZXQgKi8KKwkJCWNhc2UgQ01EVEhSRUFEX1VQREFURV9QUk9URUNUOgorCQkJCXsKKwkJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCAwLAorCQkJCQkJCSAgKEFMTE5fU0VUUFJPVEVDVCksCisJCQkJCQkJICBUUlVFLCAwKTsKKwkJCQl9CisJCQkJYnJlYWs7CisvKiBlbmQgam9obmxpICovCiAKLQkJCQkJCQkJcHRyID0gKFBVQ0hBUikgJnVJVjsKLQkJCQkJCQkJKihwdHIgKyAzKSA9IChwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPDwgNik7Ci0JCQkJCQkJCUFzaWNVcGRhdGVXQ0lESVZFSVYocEFkLCBwRW50cnktPkFpZCwgdUlWLCAwKTsKLQkJCQkJCQkJQXNpY1VwZGF0ZVdDSURBdHRyaWJ1dGUocEFkLCBwRW50cnktPkFpZCwgQlNTMCwgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsIEZBTFNFKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZQotCQkJCQkJCXsKLQkJCQkJCQkJLy8KLQkJCQkJCQkJLy8gT3RoZXIgY2FzZSwgZGlzYWJsZSBlbmdpbmUuCi0JCQkJCQkJCS8vIERvbid0IHdvcnJ5IFdQQSBrZXksIHdlIHdpbGwgYWRkIFdQQSBLZXkgYWZ0ZXIgNC1XYXkgaGFuZHNoYWtpbmcuCi0JCQkJCQkJCS8vCi0JCQkJCQkJCVVTSE9SVCAgIG9mZnNldDsKLQkJCQkJCQkJb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAocEVudHJ5LT5BaWQgKiBIV19XQ0lEX0FUVFJJX1NJWkUpOwotCQkJCQkJCQkvLyBSWF9QS0VZX01PREU6MCBmb3Igbm8gc2VjdXJpdHk7IFJYX0tFWV9UQUI6MCBmb3Igc2hhcmVkIGtleSB0YWJsZTsgQlNTX0lEWDowCi0JCQkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgMCk7Ci0JCQkJCQkJfQorCQkJY2FzZSBPSURfODAyXzExX0FERF9XRVA6CisJCQkJeworCQkJCQl1MzIgaTsKKwkJCQkJdTMyIEtleUlkeDsKKwkJCQkJc3RydWN0IHJ0X25kaXNfODAyXzExX3dlcCAqcFdlcEtleTsKKworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAoIkNtZFRocmVhZDo6T0lEXzgwMl8xMV9BRERfV0VQICBcbiIpKTsKKworCQkJCQlwV2VwS2V5ID0gKHN0cnVjdCBydF9uZGlzXzgwMl8xMV93ZXAgKilwRGF0YTsKKwkJCQkJS2V5SWR4ID0gcFdlcEtleS0+S2V5SW5kZXggJiAweDBmZmZmZmZmOworCisJCQkJCS8qIGl0IGlzIGEgc2hhcmVkIGtleSAqLworCQkJCQlpZiAoKEtleUlkeCA+PSA0KQorCQkJCQkgICAgfHwgKChwV2VwS2V5LT5LZXlMZW5ndGggIT0gNSkKKwkJCQkJCSYmIChwV2VwS2V5LT5LZXlMZW5ndGggIT0KKwkJCQkJCSAgICAxMykpKSB7CisJCQkJCQlOZGlzU3RhdHVzID0KKwkJCQkJCSAgICBORElTX1NUQVRVU19JTlZBTElEX0RBVEE7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJCQkgKCJDbWRUaHJlYWQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgSU5WQUxJRF9EQVRBISFcbiIpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXU4IENpcGhlckFsZzsKKwkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uCisJCQkJCQkgICAgS2V5TGVuID0KKwkJCQkJCSAgICAodTgpcFdlcEtleS0+S2V5TGVuZ3RoOworCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT4KKwkJCQkJCQkgICAgICAgU2hhcmVkS2V5W0JTUzBdCisJCQkJCQkJICAgICAgIFtLZXlJZHhdLktleSwKKwkJCQkJCQkgICAgICAgJnBXZXBLZXktPgorCQkJCQkJCSAgICAgICBLZXlNYXRlcmlhbCwKKwkJCQkJCQkgICAgICAgcFdlcEtleS0+CisJCQkJCQkJICAgICAgIEtleUxlbmd0aCk7CisJCQkJCQlDaXBoZXJBbGcgPQorCQkJCQkJICAgIChwQWQtPgorCQkJCQkJICAgICBTaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS4KKwkJCQkJCSAgICAgS2V5TGVuID09CisJCQkJCQkgICAgIDUpID8gQ0lQSEVSX1dFUDY0IDoKKwkJCQkJCSAgICBDSVBIRVJfV0VQMTI4OworCisJCQkJCQkvKiAqLworCQkJCQkJLyogQ2hhbmdlIHRoZSBXRVAgY2lwaGVyIHRvIENLSVAgY2lwaGVyIGlmIENLSVAgS1Agb24uICovCisJCQkJCQkvKiBGdW5rIFVJIG9yIE1lZXRpbmdob3VzZSBVSSB3aWxsIGFkZCBja2lwIGtleSBmcm9tIHRoaXMgcGF0aC4gKi8KKwkJCQkJCS8qICovCisKKwkJCQkJCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSB7CisJCQkJCQkJcEFkLT5NYWNUYWIuCisJCQkJCQkJICAgIENvbnRlbnRbQlNTSURfV0NJRF0uCisJCQkJCQkJICAgIFBhaXJ3aXNlS2V5LgorCQkJCQkJCSAgICBDaXBoZXJBbGcgPQorCQkJCQkJCSAgICBwQWQtPgorCQkJCQkJCSAgICBTaGFyZWRLZXlbQlNTMF0KKwkJCQkJCQkgICAgW0tleUlkeF0uQ2lwaGVyQWxnOworCQkJCQkJCXBBZC0+TWFjVGFiLgorCQkJCQkJCSAgICBDb250ZW50W0JTU0lEX1dDSURdLgorCQkJCQkJCSAgICBQYWlyd2lzZUtleS5LZXlMZW4gPQorCQkJCQkJCSAgICBwQWQtPgorCQkJCQkJCSAgICBTaGFyZWRLZXlbQlNTMF0KKwkJCQkJCQkgICAgW0tleUlkeF0uS2V5TGVuOwogCQkJCQkJfQorCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS4KKwkJCQkJCSAgICBDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQkJCQlpZiAocFdlcEtleS0+CisJCQkJCQkgICAgS2V5SW5kZXggJiAweDgwMDAwMDAwKSB7CisJCQkJCQkJLyogRGVmYXVsdCBrZXkgZm9yIHR4IChzaGFyZWQga2V5KSAqLworCQkJCQkJCXU4IElWRUlWWzhdOworCQkJCQkJCXUzMiBXQ0lEQXR0cmksIFZhbHVlOworCQkJCQkJCXUxNiBvZmZzZXQsIG9mZnNldDI7CisJCQkJCQkJTmRpc1plcm9NZW1vcnkoSVZFSVYsCisJCQkJCQkJCSAgICAgICA4KTsKKwkJCQkJCQlwQWQtPlN0YUNmZy4KKwkJCQkJCQkgICAgRGVmYXVsdEtleUlkID0KKwkJCQkJCQkgICAgKHU4KUtleUlkeDsKKwkJCQkJCQkvKiBBZGQgQlNTSUQgdG8gV0NUYWJsZS4gYmVjYXVzZSB0aGlzIGlzIFR4IHdlcCBrZXkuICovCisJCQkJCQkJLyogV0NJRCBBdHRyaWJ1dGUgVURGOjMsIEJTU0lkeDozLCBBbGc6MywgS2V5dGFibGU6MT1QQUlSV0lTRSBLRVksIEJTU0lkeCBpcyAwICovCisJCQkJCQkJV0NJREF0dHJpID0KKwkJCQkJCQkgICAgKENpcGhlckFsZyA8PCAxKSB8CisJCQkJCQkJICAgIFNIQVJFREtFWVRBQkxFOwogCi0JCQkJCQlBc2ljVXBkYXRlUnhXQ0lEVGFibGUocEFkLCBwRW50cnktPkFpZCwgcEVudHJ5LT5BZGRyKTsKLQkJCQkJCXByaW50aygiVXBkYXRlUnhXQ0lEVGFibGUoKTogQWlkPSVkLCBBZGRyPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IVxuIiwgcEVudHJ5LT5BaWQsCi0JCQkJCQkJCXBFbnRyeS0+QWRkclswXSwgcEVudHJ5LT5BZGRyWzFdLCBwRW50cnktPkFkZHJbMl0sIHBFbnRyeS0+QWRkclszXSwgcEVudHJ5LT5BZGRyWzRdLCBwRW50cnktPkFkZHJbNV0pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ01EVEhSRUFEX1VQREFURV9QUk9URUNUOgotCQkJCQl7Ci0JCQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIDAsIChBTExOX1NFVFBST1RFQ1QpLCBUUlVFLCAwKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE9JRF84MDJfMTFfQUREX1dFUDoKLQkJCQkJewotCQkJCQkJVUlOVAlpOwotCQkJCQkJVUlOVDMyCUtleUlkeDsKLQkJCQkJCVBORElTXzgwMl8xMV9XRVAJcFdlcEtleTsKLQotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ21kVGhyZWFkOjpPSURfODAyXzExX0FERF9XRVAgIFxuIikpOwotCi0JCQkJCQlwV2VwS2V5ID0gKFBORElTXzgwMl8xMV9XRVApcERhdGE7Ci0JCQkJCQlLZXlJZHggPSBwV2VwS2V5LT5LZXlJbmRleCAmIDB4MGZmZmZmZmY7Ci0KLQkJCQkJCS8vIGl0IGlzIGEgc2hhcmVkIGtleQotCQkJCQkJaWYgKChLZXlJZHggPj0gNCkgfHwgKChwV2VwS2V5LT5LZXlMZW5ndGggIT0gNSkgJiYgKHBXZXBLZXktPktleUxlbmd0aCAhPSAxMykpKQotCQkJCQkJewotCQkJCQkJCU5kaXNTdGF0dXMgPSBORElTX1NUQVRVU19JTlZBTElEX0RBVEE7Ci0JCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQ21kVGhyZWFkOjpPSURfODAyXzExX0FERF9XRVAsIElOVkFMSURfREFUQSEhXG4iKSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJVUNIQVIgQ2lwaGVyQWxnOwotCQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gKFVDSEFSKSBwV2VwS2V5LT5LZXlMZW5ndGg7Ci0JCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXksICZwV2VwS2V5LT5LZXlNYXRlcmlhbCwgcFdlcEtleS0+S2V5TGVuZ3RoKTsKLQkJCQkJCQlDaXBoZXJBbGcgPSAocEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPT0gNSk/IENJUEhFUl9XRVA2NCA6IENJUEhFUl9XRVAxMjg7Ci0KLQkJCQkJCQkvLwotCQkJCQkJCS8vIENoYW5nZSB0aGUgV0VQIGNpcGhlciB0byBDS0lQIGNpcGhlciBpZiBDS0lQIEtQIG9uLgotCQkJCQkJCS8vIEZ1bmsgVUkgb3IgTWVldGluZ2hvdXNlIFVJIHdpbGwgYWRkIGNraXAga2V5IGZyb20gdGhpcyBwYXRoLgotCQkJCQkJCS8vCi0KLQkJCQkJCQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLQkJCQkJCSAJewotCQkJCQkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnOwotCQkJCQkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LktleUxlbiA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuOwotCQkJCQkJIAl9Ci0JCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCQkJCQkJaWYgKHBXZXBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKLQkJCQkJCQl7Ci0JCQkJCQkJCS8vIERlZmF1bHQga2V5IGZvciB0eCAoc2hhcmVkIGtleSkKLQkJCQkJCQkJVUNIQVIJSVZFSVZbOF07Ci0JCQkJCQkJCVVJTlQzMglXQ0lEQXR0cmksIFZhbHVlOwotCQkJCQkJCQlVU0hPUlQJb2Zmc2V0LCBvZmZzZXQyOwotCQkJCQkJCQlOZGlzWmVyb01lbW9yeShJVkVJViwgOCk7Ci0JCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgS2V5SWR4OwotCQkJCQkJCQkvLyBBZGQgQlNTSUQgdG8gV0NUYWJsZS4gYmVjYXVzZSB0aGlzIGlzIFR4IHdlcCBrZXkuCi0JCQkJCQkJCS8vIFdDSUQgQXR0cmlidXRlIFVERjozLCBCU1NJZHg6MywgQWxnOjMsIEtleXRhYmxlOjE9UEFJUldJU0UgS0VZLCBCU1NJZHggaXMgMAotCQkJCQkJCQlXQ0lEQXR0cmkgPSAoQ2lwaGVyQWxnPDwxKXxTSEFSRURLRVlUQUJMRTsKLQotCQkJCQkJCQlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChCU1NJRF9XQ0lEKiBIV19XQ0lEX0FUVFJJX1NJWkUpOwotCQkJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsIFdDSURBdHRyaSk7Ci0JCQkJCQkJCS8vIDEuIElWL0VJVgotCQkJCQkJCQkvLyBTcGVjaWZ5IGtleSBpbmRleCB0byBmaW5kIHNoYXJlZCBrZXkuCi0JCQkJCQkJCUlWRUlWWzNdID0gKFVDSEFSKShLZXlJZHg8PCA2KTsJLy9XRVAgRWl2IGJpdCBvZmYuIGdyb3Vwa2V5IGluZGV4IGlzIG5vdCAwCi0JCQkJCQkJCW9mZnNldCA9IFBBSVJXSVNFX0lWRUlWX1RBQkxFX0JBU0UgKyAoQlNTME1jYXN0X1dDSUQgKiBIV19JVkVJVl9FTlRSWV9TSVpFKTsKLQkJCQkJCQkJb2Zmc2V0MiA9IFBBSVJXSVNFX0lWRUlWX1RBQkxFX0JBU0UgKyAoQlNTSURfV0NJRCogSFdfSVZFSVZfRU5UUllfU0laRSk7Ci0JCQkJCQkJCWZvciAoaT0wOyBpPDg7KQotCQkJCQkJCQl7Ci0JCQkJCQkJCQlWYWx1ZSA9IElWRUlWW2ldOwotCQkJCQkJCQkJVmFsdWUgKz0gKElWRUlWW2krMV08PDgpOwotCQkJCQkJCQkJVmFsdWUgKz0gKElWRUlWW2krMl08PDE2KTsKLQkJCQkJCQkJCVZhbHVlICs9IChJVkVJVltpKzNdPDwyNCk7Ci0JCQkJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQraSwgVmFsdWUpOwotCQkJCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0MitpLCBWYWx1ZSk7Ci0JCQkJCQkJCQlpKz00OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQkJLy8gMi4gV0NJRCBBdHRyaWJ1dGUgVURGOjMsIEJTU0lkeDozLCBBbGc6MywgS2V5dGFibGU6dXNlIHNoYXJlIGtleSwgQlNTSWR4IGlzIDAKLQkJCQkJCQkJV0NJREF0dHJpID0gKHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnPDwxKXxTSEFSRURLRVlUQUJMRTsKLQkJCQkJCQkJb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoQlNTME1jYXN0X1dDSUQqIEhXX1dDSURfQVRUUklfU0laRSk7Ci0JCQkJCQkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCU1MwTWNhc3RfV0NJRCA6IG9mZnNldCA9ICV4LCBXQ0lEQXR0cmkgPSAleFxuIiwgb2Zmc2V0LCBXQ0lEQXR0cmkpKTsKLQkJCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0LCBXQ0lEQXR0cmkpOwotCisJCQkJCQkJb2Zmc2V0ID0KKwkJCQkJCQkgICAgTUFDX1dDSURfQVRUUklCVVRFX0JBU0UKKwkJCQkJCQkgICAgKworCQkJCQkJCSAgICAoQlNTSURfV0NJRCAqCisJCQkJCQkJICAgICBIV19XQ0lEX0FUVFJJX1NJWkUpOworCQkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcgorCQkJCQkJCSAgICAocEFkLCBvZmZzZXQsCisJCQkJCQkJICAgICBXQ0lEQXR0cmkpOworCQkJCQkJCS8qIDEuIElWL0VJViAqLworCQkJCQkJCS8qIFNwZWNpZnkga2V5IGluZGV4IHRvIGZpbmQgc2hhcmVkIGtleS4gKi8KKwkJCQkJCQlJVkVJVlszXSA9ICh1OCkoS2V5SWR4IDw8IDYpOwkvKldFUCBFaXYgYml0IG9mZi4gZ3JvdXBrZXkgaW5kZXggaXMgbm90IDAgKi8KKwkJCQkJCQlvZmZzZXQgPQorCQkJCQkJCSAgICBQQUlSV0lTRV9JVkVJVl9UQUJMRV9CQVNFCisJCQkJCQkJICAgICsKKwkJCQkJCQkgICAgKEJTUzBNY2FzdF9XQ0lEICoKKwkJCQkJCQkgICAgIEhXX0lWRUlWX0VOVFJZX1NJWkUpOworCQkJCQkJCW9mZnNldDIgPQorCQkJCQkJCSAgICBQQUlSV0lTRV9JVkVJVl9UQUJMRV9CQVNFCisJCQkJCQkJICAgICsKKwkJCQkJCQkgICAgKEJTU0lEX1dDSUQgKgorCQkJCQkJCSAgICAgSFdfSVZFSVZfRU5UUllfU0laRSk7CisJCQkJCQkJZm9yIChpID0gMDsgaSA8IDg7KSB7CisJCQkJCQkJCVZhbHVlID0KKwkJCQkJCQkJICAgIElWRUlWW2ldOworCQkJCQkJCQlWYWx1ZSArPQorCQkJCQkJCQkgICAgKElWRUlWCisJCQkJCQkJCSAgICAgW2kgKworCQkJCQkJCQkgICAgICAxXSA8PCA4KTsKKwkJCQkJCQkJVmFsdWUgKz0KKwkJCQkJCQkJICAgIChJVkVJVgorCQkJCQkJCQkgICAgIFtpICsKKwkJCQkJCQkJICAgICAgMl0gPDwgMTYpOworCQkJCQkJCQlWYWx1ZSArPQorCQkJCQkJCQkgICAgKElWRUlWCisJCQkJCQkJCSAgICAgW2kgKworCQkJCQkJCQkgICAgICAzXSA8PCAyNCk7CisJCQkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcgorCQkJCQkJCQkgICAgKHBBZCwKKwkJCQkJCQkJICAgICBvZmZzZXQgKyBpLAorCQkJCQkJCQkgICAgIFZhbHVlKTsKKwkJCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyCisJCQkJCQkJCSAgICAocEFkLAorCQkJCQkJCQkgICAgIG9mZnNldDIgKworCQkJCQkJCQkgICAgIGksIFZhbHVlKTsKKwkJCQkJCQkJaSArPSA0OwogCQkJCQkJCX0KLQkJCQkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCAoVUNIQVIpS2V5SWR4LCBDaXBoZXJBbGcsIHBXZXBLZXktPktleU1hdGVyaWFsLCBOVUxMLCBOVUxMKTsKLQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbWRUaHJlYWQ6Ok9JRF84MDJfMTFfQUREX1dFUCAoS2V5SWR4PSVkLCBMZW49JWQtYnl0ZSlcbiIsIEtleUlkeCwgcFdlcEtleS0+S2V5TGVuZ3RoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7CiAKLQkJCQljYXNlIENNRFRIUkVBRF84MDJfMTFfQ09VTlRFUl9NRUFTVVJFOgotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gQ29udHJvbCBUaHJlYWQgISEgRVJST1IgISEgVW5rbm93bihjbWRxZWxtdC0+Y29tbWFuZD0weCV4KSAhISBcbiIsIGNtZHFlbG10LT5jb21tYW5kKSk7Ci0JCQkJCWJyZWFrOworCQkJCQkJCS8qIDIuIFdDSUQgQXR0cmlidXRlIFVERjozLCBCU1NJZHg6MywgQWxnOjMsIEtleXRhYmxlOnVzZSBzaGFyZSBrZXksIEJTU0lkeCBpcyAwICovCisJCQkJCQkJV0NJREF0dHJpID0KKwkJCQkJCQkgICAgKHBBZC0+CisJCQkJCQkJICAgICBTaGFyZWRLZXlbQlNTMF0KKwkJCQkJCQkgICAgIFtLZXlJZHhdLgorCQkJCQkJCSAgICAgQ2lwaGVyQWxnIDw8IDEpIHwKKwkJCQkJCQkgICAgU0hBUkVES0VZVEFCTEU7CisJCQkJCQkJb2Zmc2V0ID0KKwkJCQkJCQkgICAgTUFDX1dDSURfQVRUUklCVVRFX0JBU0UKKwkJCQkJCQkgICAgKworCQkJCQkJCSAgICAoQlNTME1jYXN0X1dDSUQgKgorCQkJCQkJCSAgICAgSFdfV0NJRF9BVFRSSV9TSVpFKTsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCQkJICgiQlNTME1jYXN0X1dDSUQgOiBvZmZzZXQgPSAleCwgV0NJREF0dHJpID0gJXhcbiIsCisJCQkJCQkJCSAgb2Zmc2V0LAorCQkJCQkJCQkgIFdDSURBdHRyaSkpOworCQkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcgorCQkJCQkJCSAgICAocEFkLCBvZmZzZXQsCisJCQkJCQkJICAgICBXQ0lEQXR0cmkpOworCisJCQkJCQl9CisJCQkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLAorCQkJCQkJCQkgICAgICAodTgpCisJCQkJCQkJCSAgICAgIEtleUlkeCwKKwkJCQkJCQkJICAgICAgQ2lwaGVyQWxnLAorCQkJCQkJCQkgICAgICBwV2VwS2V5LT4KKwkJCQkJCQkJICAgICAgS2V5TWF0ZXJpYWwsCisJCQkJCQkJCSAgICAgIE5VTEwsCisJCQkJCQkJCSAgICAgIE5VTEwpOworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkJICgiQ21kVGhyZWFkOjpPSURfODAyXzExX0FERF9XRVAgKEtleUlkeD0lZCwgTGVuPSVkLWJ5dGUpXG4iLAorCQkJCQkJCSAgS2V5SWR4LAorCQkJCQkJCSAgcFdlcEtleS0+S2V5TGVuZ3RoKSk7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQ01EVEhSRUFEXzgwMl8xMV9DT1VOVEVSX01FQVNVUkU6CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQ01EVEhSRUFEX1NFVF9HUk9VUF9LRVk6CisJCQkJV3BhU3RhR3JvdXBLZXlTZXR0aW5nKHBBZCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQ01EVEhSRUFEX1NFVF9QQUlSV0lTRV9LRVk6CisJCQkJV3BhU3RhUGFpcndpc2VLZXlTZXR0aW5nKHBBZCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQ01EVEhSRUFEX1NFVF9QU01fQklUOgorCQkJCXsKKwkJCQkJdTE2ICpwUHNtID0gKHUxNiAqKSBwRGF0YTsKKwkJCQkJTWxtZVNldFBzbUJpdChwQWQsICpwUHNtKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIENNRFRIUkVBRF9GT1JDRV9XQUtFX1VQOgorCQkJCUFzaWNGb3JjZVdha2V1cChwQWQsIFRSVUUpOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkgKCItLT4gQ29udHJvbCBUaHJlYWQgISEgRVJST1IgISEgVW5rbm93bihjbWRxZWxtdC0+Y29tbWFuZD0weCV4KSAhISBcbiIsCisJCQkJCSAgY21kcWVsbXQtPmNvbW1hbmQpKTsKKwkJCQlicmVhazsKIAkJCX0KIAkJfQogCi0JCWlmIChjbWRxZWxtdC0+Q21kRnJvbU5kaXMgPT0gVFJVRSkKLQkJewotCQkJCWlmIChjbWRxZWxtdC0+YnVmZmVyICE9IE5VTEwpCi0JCQkJCU5kaXNGcmVlTWVtb3J5KGNtZHFlbG10LT5idWZmZXIsIGNtZHFlbG10LT5idWZmZXJsZW5ndGgsIDApOwotCi0JCQlOZGlzRnJlZU1lbW9yeShjbWRxZWxtdCwgc2l6ZW9mKENtZFFFbG10KSwgMCk7CisJCWlmIChjbWRxZWxtdC0+Q21kRnJvbU5kaXMgPT0gVFJVRSkgeworCQkJaWYgKGNtZHFlbG10LT5idWZmZXIgIT0gTlVMTCkKKwkJCQlvc19mcmVlX21lbShwQWQsIGNtZHFlbG10LT5idWZmZXIpOworCQkJb3NfZnJlZV9tZW0ocEFkLCBjbWRxZWxtdCk7CisJCX0gZWxzZSB7CisJCQlpZiAoKGNtZHFlbG10LT5idWZmZXIgIT0gTlVMTCkKKwkJCSAgICAmJiAoY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCAhPSAwKSkKKwkJCQlvc19mcmVlX21lbShwQWQsIGNtZHFlbG10LT5idWZmZXIpOworCQkJb3NfZnJlZV9tZW0ocEFkLCBjbWRxZWxtdCk7CiAJCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAoKGNtZHFlbG10LT5idWZmZXIgIT0gTlVMTCkgJiYgKGNtZHFlbG10LT5idWZmZXJsZW5ndGggIT0gMCkpCi0JCQkJTmRpc0ZyZWVNZW1vcnkoY21kcWVsbXQtPmJ1ZmZlciwgY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCwgMCk7Ci0gICAgICAgICAgICB7Ci0JCQkJTmRpc0ZyZWVNZW1vcnkoY21kcWVsbXQsIHNpemVvZihDbWRRRWxtdCksIDApOwotCQkJfQotCQl9Ci0JfQkvKiBlbmQgb2Ygd2hpbGUgKi8KKwl9CQkJLyogZW5kIG9mIHdoaWxlICovCiB9CiAKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnQyODcwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0Mjg3MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzY3YmFmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnQyODcwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1ODMgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfX1JUMjg3MF9IX18KLSNkZWZpbmUgX19SVDI4NzBfSF9fCi0KLS8vdXNiIGhlYWRlciBmaWxlcwotI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgotCi0vKiBydG1wX2RlZi5oICovCi0vLwotI2RlZmluZSBCVUxLQUdHUkVfWklTRSAgICAgICAgICAxMDAKLSNkZWZpbmUgUlQyOFhYX0RSVkRBVEFfU0VUKF9hKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9zZXRfaW50ZmRhdGEoX2EsIHBBZCk7Ci0jZGVmaW5lIFJUMjhYWF9QVVRfREVWSUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2JfcHV0X2RldgotI2RlZmluZSBSVFVTQl9BTExPQ19VUkIoaXNvKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiX2FsbG9jX3VyYihpc28sIEdGUF9BVE9NSUMpCi0jZGVmaW5lIFJUVVNCX1NVQk1JVF9VUkIocFVyYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Jfc3VibWl0X3VyYihwVXJiLCBHRlBfQVRPTUlDKQotI2RlZmluZQlSVFVTQl9VUkJfQUxMT0NfQlVGRkVSKHBVc2JfRGV2LCBCdWZTaXplLCBwRG1hX2FkZHIpICAgICAgICAgICAgICAgdXNiX2J1ZmZlcl9hbGxvYyhwVXNiX0RldiwgQnVmU2l6ZSwgR0ZQX0FUT01JQywgcERtYV9hZGRyKQotI2RlZmluZQlSVFVTQl9VUkJfRlJFRV9CVUZGRVIocFVzYl9EZXYsIEJ1ZlNpemUsIHBUcmFuc2ZlckJ1ZiwgRG1hX2FkZHIpICAgdXNiX2J1ZmZlcl9mcmVlKHBVc2JfRGV2LCBCdWZTaXplLCBwVHJhbnNmZXJCdWYsIERtYV9hZGRyKQotCi0jZGVmaW5lIFJYQlVMS0FHR1JFX1pJU0UgICAgICAgIDEyCi0jZGVmaW5lIE1BWF9UWEJVTEtfTElNSVQgICAgICAgIChMT0NBTF9UWEJVRl9TSVpFKihCVUxLQUdHUkVfWklTRS0xKSkKLSNkZWZpbmUgTUFYX1RYQlVMS19TSVpFICAgICAgICAgKExPQ0FMX1RYQlVGX1NJWkUqQlVMS0FHR1JFX1pJU0UpCi0jZGVmaW5lIE1BWF9SWEJVTEtfU0laRSAgICAgICAgIChMT0NBTF9UWEJVRl9TSVpFKlJYQlVMS0FHR1JFX1pJU0UpCi0jZGVmaW5lIE1BWF9NTE1FX0hBTkRMRVJfTUVNT1JZIDIwCi0jZGVmaW5lCVJFVFJZX0xJTUlUICAgICAgICAgICAgIDEwCi0jZGVmaW5lIEJVRkZFUl9TSVpFCQkJCTI0MDAJLy8yMDQ4Ci0jZGVmaW5lCVRYX1JJTkcJCQkJCTB4YQotI2RlZmluZQlQUklPX1JJTkcJCQkJMHhjCi0KLQotLy8gRmxhZ3MgZm9yIEJ1bGtmbGFncyBjb250cm9sIGZvciBidWxrIG91dCBkYXRhCi0vLwotI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9OVUxMCQkJCTB4MDAwMDAwMDEKLSNkZWZpbmUgZlJUVVNCX0JVTEtfT1VUX1JUUwkJCQkJCTB4MDAwMDAwMDIKLSNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX01MTUUJCQkJCTB4MDAwMDAwMDQKLQotI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwJCQkJMHgwMDAxMDAwMAotI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfMgkJCTB4MDAwMjAwMDAKLSNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMXzMJCQkweDAwMDQwMDAwCi0jZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTF80CQkJMHgwMDA4MDAwMAotI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfNQkJCTB4MDAxMDAwMDAKLQotI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfUFNQT0xMCQkJCQkweDAwMDAwMDIwCi0jZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9EQVRBX0ZSQUcJCQkJMHgwMDAwMDA0MAotI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHXzIJCQkJMHgwMDAwMDA4MAotI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHXzMJCQkJMHgwMDAwMDEwMAotI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHXzQJCQkJMHgwMDAwMDIwMAotCi0jZGVmaW5lCUZSRUVfSFRUWF9SSU5HKF9wLCBfYiwgX3QpCQkJXAotewkJCQkJCQkJCQlcCi0JaWYgKChfdCktPkVOZXh0QnVsa091dFBvc2l0aW9uID09IChfdCktPkN1cldyaXRlUG9zaXRpb24pCQkJCVwKLQl7CQkJCQkJCQkJCQkJCQkJCQlcCi0JCShfdCktPmJSaW5nRW1wdHkgPSBUUlVFOwkJCVwKLQl9CQkJCQkJCQkJCQkJCQkJCQlcCi0JLypOZGlzSW50ZXJsb2NrZWREZWNyZW1lbnQoJihfcCktPlR4Q291bnQpOyAqL1wKLX0KLQotLy8KLS8vIFJYSU5GTyBhcHBlbmRzIGF0IHRoZSBlbmQgb2YgZWFjaCByeCBwYWNrZXQuCi0vLwotdHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9SWElORk9fU1RSVUMgewotCVVJTlQzMgkJQkE6MTsKLQlVSU5UMzIJCURBVEE6MTsKLQlVSU5UMzIJCU5VTExEQVRBOjE7Ci0JVUlOVDMyCQlGUkFHOjE7Ci0JVUlOVDMyCQlVMk06MTsgICAgICAgICAgICAgIC8vIDE6IHRoaXMgUlggZnJhbWUgaXMgdW5pY2FzdCB0byBtZQotCVVJTlQzMgkJTWNhc3Q6MTsgICAgICAgICAgICAvLyAxOiB0aGlzIGlzIGEgbXVsdGljYXN0IGZyYW1lCi0JVUlOVDMyCQlCY2FzdDoxOyAgICAgICAgICAgIC8vIDE6IHRoaXMgaXMgYSBicm9hZGNhc3QgZnJhbWUKLQlVSU5UMzIJCU15QnNzOjE7ICAJLy8gMTogdGhpcyBmcmFtZSBiZWxvbmdzIHRvIHRoZSBzYW1lIEJTU0lECi0JVUlOVDMyCQlDcmM6MTsgICAgICAgICAgICAgIC8vIDE6IENSQyBlcnJvcgotCVVJTlQzMgkJQ2lwaGVyRXJyOjI7ICAgICAgICAvLyAwOiBkZWNyeXB0aW9uIG9rYXksIDE6SUNWIGVycm9yLCAyOk1JQyBlcnJvciwgMzpLRVkgbm90IHZhbGlkCi0JVUlOVDMyCQlBTVNEVToxOwkJLy8gcnggd2l0aCA4MDIuMyBoZWFkZXIsIG5vdCA4MDIuMTEgaGVhZGVyLgotCVVJTlQzMgkJSFRDOjE7Ci0JVUlOVDMyCQlSU1NJOjE7Ci0JVUlOVDMyCQlMMlBBRDoxOwotCVVJTlQzMgkJQU1QRFU6MTsJCS8vIFRvIGJlIG1vdmVkCi0JVUlOVDMyCQlEZWNyeXB0ZWQ6MTsKLQlVSU5UMzIJCVBsY3BSc3NpbDoxOwotCVVJTlQzMgkJQ2lwaGVyQWxnOjE7Ci0JVUlOVDMyCQlMYXN0QU1TRFU6MTsKLQlVSU5UMzIJCVBsY3BTaWduYWw6MTI7Ci19CVJYSU5GT19TVFJVQywgKlBSWElORk9fU1RSVUMsIFJUMjhYWF9SWERfU1RSVUMsICpQUlQyOFhYX1JYRF9TVFJVQzsKLQotLy8KLS8vIFRYSU5GTwotLy8KLXR5cGVkZWYJc3RydWN0CV9UWElORk9fU1RSVUMgewotCS8vIFdvcmQJMAotCVVJTlQzMgkJVVNCRE1BVHhQa3RMZW46MTY7CS8vdXNlZCBPTkxZIGluIFVTQiBidWxrIEFnZ3JlZ2F0aW9uLCAgVG90YWwgYnl0ZSBjb3VudHMgb2YgYWxsIHN1Yi1mcmFtZS4KLQlVSU5UMzIJCXJzdjo4OwotCVVJTlQzMgkJV0lWOjE7CS8vIFdpcmVsZXNzIEluZm8gVmFsaWQuIDEgaWYgRHJpdmVyIGFscmVhZHkgZmlsbCBXSSwgIG8gaWYgRE1BIG5lZWRzIHRvIGNvcHkgV0kgdG8gY29ycmVjdHBvc2l0aW9uCi0JVUlOVDMyCQlRU0VMOjI7CS8vIHNlbGVjdCBvbi1jaGlwIEZJRk8gSUQgZm9yIDJuZC1zdGFnZSBvdXRwdXQgc2NoZWR1bGVyLjA6TUdNVCwgMTpIQ0NBIDI6RURDQQotCVVJTlQzMgkJU3dVc2VMYXN0Um91bmQ6MTsgLy8gU29mdHdhcmUgdXNlLgotCVVJTlQzMgkJcnN2MjoyOyAgLy8gU29mdHdhcmUgdXNlLgotCVVJTlQzMgkJVVNCRE1BTmV4dFZMRDoxOwkvL3VzZWQgT05MWSBpbiBVU0IgYnVsayBBZ2dyZWdhdGlvbiwgTmV4dFZhbGlkCi0JVUlOVDMyCQlVU0JETUFUeGJ1cnN0OjE7Ly91c2VkIE9OTFkgaW4gVVNCIGJ1bGsgQWdncmUuIEZvcmNlIFVTQiBETUEgdHJhbnNtaXQgZnJhbWUgZnJvbSBjdXJyZW50IHNlbGVjdGVkIGVuZHBvaW50Ci19CVRYSU5GT19TVFJVQywgKlBUWElORk9fU1RSVUM7Ci0KLSNkZWZpbmUgVFhJTkZPX1NJWkUJCQkJNAotI2RlZmluZSBSWElORk9fU0laRQkJCQk0Ci0jZGVmaW5lIFRYUEFERElOR19TSVpFCQkJMTEKLQotLy8KLS8vIE1hbmFnZW1lbnQgcmluZyBidWZmZXIgZm9ybWF0Ci0vLwotdHlwZWRlZglzdHJ1Y3QJX01HTVRfU1RSVUMJewotCUJPT0xFQU4JCVZhbGlkOwotCVBVQ0hBUgkJcEJ1ZmZlcjsKLQlVTE9ORwkJTGVuZ3RoOwotfQlNR01UX1NUUlVDLCAqUE1HTVRfU1RSVUM7Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0gRUVQUk9NIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSNkZWZpbmUgUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBvZmZzZXQsIHZhcikJCQkJCVwKLQlkbyB7CQkJCQkJCQkJCQkJCQlcCi0JCVJUVVNCUmVhZEVFUFJPTShwQWQsIG9mZnNldCwgKFBVQ0hBUikmKHZhciksIDIpOwkJXAotCQlpZighcEFkLT5iVXNlRWZ1c2UpCQkJCQkJCQkJCVwKLQkJdmFyID0gbGUyY3B1MTYodmFyKTsJCQkJCQkJCQlcCi0JfXdoaWxlKDApCi0KLSNkZWZpbmUgUlQyOHh4X0VFUFJPTV9XUklURTE2KHBBZCwgb2Zmc2V0LCB2YXIpCQkJCQlcCi0JZG97CQkJCQkJCQkJCQkJCQkJXAotCQlVU0hPUlQgX3RtcFZhcj12YXI7CQkJCQkJCQkJCVwKLQkJaWYoIXBBZC0+YlVzZUVmdXNlKQkJCQkJCQkJCVwKLQkJX3RtcFZhciA9IGNwdTJsZTE2KHZhcik7CQkJCQkJCQlcCi0JCVJUVVNCV3JpdGVFRVBST00ocEFkLCBvZmZzZXQsIChQVUNIQVIpJihfdG1wVmFyKSwgMik7CVwKLQl9d2hpbGUoMCkKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0gVEFTSy9USFJFQUQgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLwotI2RlZmluZSBSVDI4WFhfVEFTS19USFJFQURfSU5JVChwQWQsIFN0YXR1cykJCVwKLQlTdGF0dXMgPSBDcmVhdGVUaHJlYWRzKG5ldF9kZXYpOwotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tIEZyaW13YXJlIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSNkZWZpbmUgUlQyOFhYX1dSSVRFX0ZJUk1XQVJFKF9wQWQsIF9wRndJbWFnZSwgX0Z3TGVuKQkJXAotCVJUVVNCRmlybXdhcmVXcml0ZShfcEFkLCBfcEZ3SW1hZ2UsIF9Gd0xlbikKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0gVFggUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLwotI2RlZmluZSBSVDI4WFhfU1RBUlRfREVRVUVVRShwQWQsIFF1ZUlkeCwgaXJxRmxhZ3MpCQkJCVwKLQkJCXsJCQkJCQkJCQkJCQkJXAotCQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+RGVRdWV1ZUxvY2tbUXVlSWR4XSwgaXJxRmxhZ3MpOwkJXAotCQkJCWlmIChwQWQtPkRlUXVldWVSdW5uaW5nW1F1ZUlkeF0pCQkJCQkJXAotCQkJCXsJCQkJCQkJCQkJCQkJCVwKLQkJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkRlUXVldWVMb2NrW1F1ZUlkeF0sIGlycUZsYWdzKTtcCi0JCQkJCXByaW50aygiRGVRdWV1ZVJ1bm5pbmdbJWRdPSBUUlVFIVxuIiwgUXVlSWR4KTsJCVwKLQkJCQkJY29udGludWU7CQkJCQkJCQkJCQlcCi0JCQkJfQkJCQkJCQkJCQkJCQkJXAotCQkJCWVsc2UJCQkJCQkJCQkJCQkJXAotCQkJCXsJCQkJCQkJCQkJCQkJCVwKLQkJCQkJcEFkLT5EZVF1ZXVlUnVubmluZ1tRdWVJZHhdID0gVFJVRTsJCQkJCVwKLQkJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkRlUXVldWVMb2NrW1F1ZUlkeF0sIGlycUZsYWdzKTtcCi0JCQkJfQkJCQkJCQkJCQkJCQkJXAotCQkJfQotI2RlZmluZSBSVDI4WFhfU1RPUF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBpcnFGbGFncykJCQkJCQlcCi0JCQlkb3sJCQkJCQkJCQkJCQkJCQlcCi0JCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5EZVF1ZXVlTG9ja1tRdWVJZHhdLCBpcnFGbGFncyk7CQlcCi0JCQkJcEFkLT5EZVF1ZXVlUnVubmluZ1tRdWVJZHhdID0gRkFMU0U7CQkJCQlcCi0JCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkRlUXVldWVMb2NrW1F1ZUlkeF0sIGlycUZsYWdzKTsJXAotCQkJfXdoaWxlKDApCi0KLQotI2RlZmluZQlSVDI4WFhfSEFTX0VOT1VHSF9GUkVFX0RFU0MocEFkLCBwVHhCbGssIGZyZWVOdW0sIHBQYWNrZXQpIFwKLQkJKFJUVVNCRnJlZURlc2NyaXB0b3JSZXF1ZXN0KHBBZCwgcFR4QmxrLT5RdWVJZHgsIChwVHhCbGstPlRvdGFsRnJhbWVMZW4gKyBHRVRfT1NfUEtUX0xFTihwUGFja2V0KSkpID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0KLSNkZWZpbmUgUlQyOFhYX1JFTEVBU0VfREVTQ19SRVNPVVJDRShwQWQsIFF1ZUlkeCkJCQlcCi0JCWRve313aGlsZSgwKQotCi0jZGVmaW5lIE5FRURfUVVFVUVfQkFDS19GT1JfQUdHKF9wQWQsIF9RdWVJZHgsIF9mcmVlTnVtLCBfVHhGcmFtZVR5cGUpIAkJXAotCQkoKF9UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUpICYmIChSVFVTQk5lZWRRdWV1ZUJhY2tGb3JBZ2coX3BBZCwgX1F1ZUlkeCkpKQotCi0KLQotI2RlZmluZSBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9UWAkJXAotCQkoZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwJXAotCQkgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCB8IFwKLQkJIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGIHwgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MpCi0KLQotI2RlZmluZSBIQUxfV3JpdGVTdWJUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBiSXNMYXN0LCBwRnJlZU51bWJlcikJXAotCQkJUnRtcFVTQl9Xcml0ZVN1YlR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGJJc0xhc3QsIHBGcmVlTnVtYmVyKQotCi0jZGVmaW5lIEhBTF9Xcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssYklzTGFzdCwgcEZyZWVOdW1iZXIpCVwKLQkJCVJ0bXBVU0JfV3JpdGVTaW5nbGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLGJJc0xhc3QsIHBGcmVlTnVtYmVyKQotCi0jZGVmaW5lIEhBTF9Xcml0ZUZyYWdUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFnTnVtLCBwRnJlZU51bWJlcikgXAotCQkJUnRtcFVTQl9Xcml0ZUZyYWdUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFnTnVtLCBwRnJlZU51bWJlcikKLQotI2RlZmluZSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssZnJhbWVOdW0sIHBGcmVlTnVtYmVyKQlcCi0JCQlSdG1wVVNCX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLGZyYW1lTnVtLCBwRnJlZU51bWJlcikKLQotI2RlZmluZSBIQUxfRmluYWxXcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIHRvdGFsTVBEVVNpemUsIFR4SWR4KQlcCi0JCQlSdG1wVVNCX0ZpbmFsV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCB0b3RhbE1QRFVTaXplLCBUeElkeCkKLQotI2RlZmluZSBIQUxfTGFzdFR4SWR4KHBBZCwgUXVlSWR4LFR4SWR4KSBcCi0JCQkvKlJ0bXBVU0JEYXRhTGFzdFR4SWR4KHBBZCwgUXVlSWR4LFR4SWR4KSovCi0KLSNkZWZpbmUgSEFMX0tpY2tPdXRUeChwQWQsIHBUeEJsaywgUXVlSWR4KQlcCi0JCQlSdG1wVVNCRGF0YUtpY2tPdXQocEFkLCBwVHhCbGssIFF1ZUlkeCkKLQotCi0jZGVmaW5lIEhBTF9LaWNrT3V0TWdtdFR4KHBBZCwgUXVlSWR4LCBwUGFja2V0LCBwU3JjQnVmVkEsIFNyY0J1ZkxlbikJXAotCQkJUnRtcFVTQk1nbXRLaWNrT3V0KHBBZCwgUXVlSWR4LCBwUGFja2V0LCBwU3JjQnVmVkEsIFNyY0J1ZkxlbikKLQotI2RlZmluZSBIQUxfS2lja091dE51bGxGcmFtZVR4KF9wQWQsIF9RdWVJZHgsIF9wTnVsbEZyYW1lLCBfZnJhbWVMZW4pCVwKLQkJCVJ0bXBVU0JOdWxsRnJhbWVLaWNrT3V0KF9wQWQsIF9RdWVJZHgsIF9wTnVsbEZyYW1lLCBfZnJhbWVMZW4pCi0KLSNkZWZpbmUgUlRNUF9QS1RfVEFJTF9QQURESU5HIAkxMSAvLyAzKG1heCA0IGJ5dGUgcGFkZGluZykgKyA0IChsYXN0IHBhY2tldCBwYWRkaW5nKSArIDQgKE1heEJ1bGtPdXRzaXplIGFsaWduIHBhZGRpbmcpCi0KLWV4dGVybiBVQ0hBUiBFcFRvUXVldWVbNl07Ci0KLQotI2lmZGVmIFJUMjg3MAotI2RlZmluZSBHRVRfVFhSSU5HX0ZSRUVOTyhfcEFkLCBfUXVlSWR4KSAJKF9RdWVJZHgpIC8vKF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeFN3RnJlZUlkeCkKLSNkZWZpbmUgR0VUX01HTVRSSU5HX0ZSRUVOTyhfcEFkKSAJCQkoX3BBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHgpCi0jZW5kaWYgLy8gUlQyODcwIC8vCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0gUlggUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLwotLy8jZGVmaW5lIFJUMjhYWF9SWF9FUlJPUl9DSEVDSwkJCQlSVE1QQ2hlY2tSeFdJCi0KLSNkZWZpbmUgUlQyOFhYX1JWX0FMTF9CVUZfRU5EKGJCdWxrUmVjZWl2ZSkJCVwKLQkvKiBXZSByZXR1cm4gU1RBVFVTX01PUkVfUFJPQ0VTU0lOR19SRVFVSVJFRCBzbyB0aGF0IHRoZSBjb21wbGV0aW9uICovCVwKLQkvKiByb3V0aW5lIChJb2ZDb21wbGV0ZVJlcXVlc3QpIHdpbGwgc3RvcCB3b3JraW5nIG9uIHRoZSBpcnAuICovCQlcCi0JaWYgKGJCdWxrUmVjZWl2ZSA9PSBUUlVFKQlSVFVTQkJ1bGtSZWNlaXZlKHBBZCk7Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0gQVNJQyBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8vIHJlc2V0IE1BQyBvZiBhIHN0YXRpb24gZW50cnkgdG8gMHhGRkZGRkZGRkZGRkYKLSNkZWZpbmUgUlQyOFhYX1NUQV9FTlRSWV9NQUNfUkVTRVQocEFkLCBXY2lkKQkJCQkJXAotCXsJUlRfU0VUX0FTSUNfV0NJRAlTZXRBc2ljV2NpZDsJCQkJCQlcCi0JCVNldEFzaWNXY2lkLldDSUQgPSBXY2lkOwkJCQkJCQkJXAotCQlTZXRBc2ljV2NpZC5TZXRUaWQgPSAweGZmZmZmZmZmOwkJCQkJCVwKLQkJU2V0QXNpY1djaWQuRGVsZXRlVGlkID0gMHhmZmZmZmZmZjsJCQkJCQlcCi0JCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1NFVF9BU0lDX1dDSUQsIAlcCi0JCQkJJlNldEFzaWNXY2lkLCBzaXplb2YoUlRfU0VUX0FTSUNfV0NJRCkpOwl9Ci0KLS8vIGFkZCB0aGlzIGVudHJ5IGludG8gQVNJQyBSWCBXQ0lEIHNlYXJjaCB0YWJsZQotI2RlZmluZSBSVDI4WFhfU1RBX0VOVFJZX0FERChwQWQsIHBFbnRyeSkJCQkJCQkJXAotCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1NFVF9DTElFTlRfTUFDX0VOVFJZLCAJXAotCQkJCQkJCXBFbnRyeSwgc2l6ZW9mKE1BQ19UQUJMRV9FTlRSWSkpOwotCi0vLyByZW1vdmUgUGFpci13aXNlIGtleSBtYXRlcmlhbCBmcm9tIEFTSUMKLS8vIHlldCBpbXBsZW1lbnQKLSNkZWZpbmUgUlQyOFhYX1NUQV9FTlRSWV9LRVlfREVMKHBBZCwgQnNzSWR4LCBXY2lkKQotCi0vLyBhZGQgQ2xpZW50IHNlY3VyaXR5IGluZm9ybWF0aW9uIGludG8gQVNJQyBXQ0lEIHRhYmxlIGFuZCBJVkVJViB0YWJsZQotI2RlZmluZSBSVDI4WFhfU1RBX1NFQ1VSSVRZX0lORk9fQUREKHBBZCwgYXBpZHgsIEtleUlELCBwRW50cnkpCQkJCQkJXAotCXsJUlQyOFhYX1NUQV9FTlRSWV9NQUNfUkVTRVQocEFkLCBwRW50cnktPkFpZCk7CQkJCQkJCQlcCi0JCWlmIChwRW50cnktPkFpZCA+PSAxKSB7CQkJCQkJCQkJCQkJCQlcCi0JCQlSVF9TRVRfQVNJQ19XQ0lEX0FUVFJJCVNldEFzaWNXY2lkQXR0cmk7CQkJCQkJCQlcCi0JCQlTZXRBc2ljV2NpZEF0dHJpLldDSUQgPSBwRW50cnktPkFpZDsJCQkJCQkJCQlcCi0JCQlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPD0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkgJiYJCQkJXAotCQkJCShwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSkJCQkJXAotCQkJewkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQlTZXRBc2ljV2NpZEF0dHJpLkNpcGhlciA9IHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJRF0uQ2lwaGVyQWxnOwlcCi0JCQl9CQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJZWxzZSBpZiAocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQkJCQkJXAotCQkJewkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQlTZXRBc2ljV2NpZEF0dHJpLkNpcGhlciA9IHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJRF0uQ2lwaGVyQWxnOwlcCi0JCQl9CQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJZWxzZSBTZXRBc2ljV2NpZEF0dHJpLkNpcGhlciA9IDA7CQkJCQkJCQkJCVwKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImFpZCBjaXBoZXIgPSAlbGRcbiIsU2V0QXNpY1djaWRBdHRyaS5DaXBoZXIpKTsgICAgICAgXAotCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfU0VUX0FTSUNfV0NJRF9DSVBIRVIsIAkJCVwKLQkJCQkJCQkmU2V0QXNpY1djaWRBdHRyaSwgc2l6ZW9mKFJUX1NFVF9BU0lDX1dDSURfQVRUUkkpKTsgfSB9Ci0KLS8vIEluc2VydCB0aGUgQkEgYml0bWFwIHRvIEFTSUMgZm9yIHRoZSBXY2lkIGVudHJ5Ci0jZGVmaW5lIFJUMjhYWF9BRERfQkFfU0VTU0lPTl9UT19BU0lDKF9wQWQsIF9BaWQsIF9USUQpCQkJCQlcCi0JCWRvewkJCQkJCQkJCQkJCQkJCQlcCi0JCQlSVF9TRVRfQVNJQ19XQ0lECVNldEFzaWNXY2lkOwkJCQkJCQlcCi0JCQlTZXRBc2ljV2NpZC5XQ0lEID0gKF9BaWQpOwkJCQkJCQkJCVwKLQkJCVNldEFzaWNXY2lkLlNldFRpZCA9ICgweDEwMDAwPDwoX1RJRCkpOwkJCQkJCVwKLQkJCVNldEFzaWNXY2lkLkRlbGV0ZVRpZCA9IDB4ZmZmZmZmZmY7CQkJCQkJCVwKLQkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKChfcEFkKSwgQ01EVEhSRUFEX1NFVF9BU0lDX1dDSUQsICZTZXRBc2ljV2NpZCwgc2l6ZW9mKFJUX1NFVF9BU0lDX1dDSUQpKTsJXAotCQl9d2hpbGUoMCkKLQotLy8gUmVtb3ZlIHRoZSBCQSBiaXRtYXAgZnJvbSBBU0lDIGZvciB0aGUgV2NpZCBlbnRyeQotI2RlZmluZSBSVDI4WFhfREVMX0JBX1NFU1NJT05fRlJPTV9BU0lDKF9wQWQsIF9XY2lkLCBfVElEKQkJCQlcCi0JCWRvewkJCQkJCQkJCQkJCQkJCQlcCi0JCQlSVF9TRVRfQVNJQ19XQ0lECVNldEFzaWNXY2lkOwkJCQkJCQlcCi0JCQlTZXRBc2ljV2NpZC5XQ0lEID0gKF9XY2lkKTsJCQkJCQkJCQlcCi0JCQlTZXRBc2ljV2NpZC5TZXRUaWQgPSAoMHhmZmZmZmZmZik7CQkJCQkJCVwKLQkJCVNldEFzaWNXY2lkLkRlbGV0ZVRpZCA9ICgweDEwMDAwPDwoX1RJRCkgKTsJCQkJCVwKLQkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKChfcEFkKSwgQ01EVEhSRUFEX1NFVF9BU0lDX1dDSUQsICZTZXRBc2ljV2NpZCwgc2l6ZW9mKFJUX1NFVF9BU0lDX1dDSUQpKTsJXAotCQl9d2hpbGUoMCkKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLSBQQ0kvVVNCIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSNkZWZpbmUgUlQyOFhYX0hBTkRMRV9ERVZfQVNTSUdOKGhhbmRsZSwgZGV2X3ApCQkJXAotCSgoUE9TX0NPT0tJRSloYW5kbGUpLT5wVXNiX0RldiA9IGRldl9wOwotCi0vLyBubyB1c2UKLSNkZWZpbmUgUlQyOFhYX1VOTUFQKCkKLSNkZWZpbmUgUlQyOFhYX0lSUV9SRVFVRVNUKG5ldF9kZXYpCi0jZGVmaW5lIFJUMjhYWF9JUlFfUkVMRUFTRShuZXRfZGV2KQotI2RlZmluZSBSVDI4WFhfSVJRX0lOSVQocEFkKQotI2RlZmluZSBSVDI4WFhfSVJRX0VOQUJMRShwQWQpCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0gTUxNRSBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCi0jZGVmaW5lIFJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKQkJCVJUVVNCTWxtZVVwKHBBZCkKLQotI2RlZmluZSBSVDI4WFhfTUxNRV9QUkVfU0FOSVRZX0NIRUNLKHBBZCkJCQkJCQkJCVwKLQl7CWlmICgocEFkLT5Db21tb25DZmcuYkhhcmR3YXJlUmFkaW8gPT0gVFJVRSkgJiYgCQkJCQlcCi0JCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkgJiYJCVwKLQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSkgewlcCi0JCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9DSEVDS19HUElPLCBOVUxMLCAwKTsgfSB9Ci0KLSNkZWZpbmUgUlQyOFhYX01MTUVfU1RBX1FVSUNLX1JTUF9XQUtFX1VQKHBBZCkJXAotCXsJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUUtFUklPRElDX0VYRUNVVCwgTlVMTCwgMCk7CVwKLQkJUlRVU0JNbG1lVXAocEFkKTsgfQotCi0jZGVmaW5lIFJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkKQlcCi0JCSAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFU0VUX0NPTkYsIDAsIE5VTEwpOwlcCi0JCSAgICAgICAgUlRVU0JNbG1lVXAocEFkKTsKLQotI2RlZmluZSBSVDI4WFhfSEFORExFX0NPVU5URVJfTUVBU1VSRShfcEFkLCBfcEVudHJ5KQkJXAotCXsJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQoX3BBZCwgQ01EVEhSRUFEXzgwMl8xMV9DT1VOVEVSX01FQVNVUkUsIF9wRW50cnksIHNpemVvZihNQUNfVEFCTEVfRU5UUlkpKTsJXAotCQlSVFVTQk1sbWVVcChfcEFkKTsJCQkJCQkJCQlcCi0JfQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tIFBvd2VyIFNhdmUgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLwotI2RlZmluZSBSVDI4WFhfUFNfUE9MTF9FTlFVRVVFKHBBZCkJCQkJCQlcCi0JewlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX1BTUE9MTCk7CVwKLQkJUlRVU0JLaWNrQnVsa091dChwQWQpOyB9Ci0KLSNkZWZpbmUgUlQyOHh4X0NISVBfTkFNRSAgICAgICAgICAgICJSVHh4NzAiCi0KLSNkZWZpbmUgVVNCX0NZQ19DRkcgICAgICAgICAgICAgICAgIDB4MDJhNAotI2RlZmluZSBTVEFUVVNfU1VDQ0VTUwkJCQkweDAwCi0jZGVmaW5lIFNUQVRVU19VTlNVQ0NFU1NGVUwgCQkweDAxCi0jZGVmaW5lIE5UX1NVQ0NFU1Moc3RhdHVzKQkJCSgoKHN0YXR1cykgPiAwKSA/ICgxKTooMCkpCi0jZGVmaW5lIEludGVybG9ja2VkSW5jcmVtZW50IAkgCWF0b21pY19pbmMKLSNkZWZpbmUgTmRpc0ludGVybG9ja2VkSW5jcmVtZW50IAlhdG9taWNfaW5jCi0jZGVmaW5lIEludGVybG9ja2VkRGVjcmVtZW50CQlhdG9taWNfZGVjCi0jZGVmaW5lIE5kaXNJbnRlcmxvY2tlZERlY3JlbWVudCAJYXRvbWljX2RlYwotI2RlZmluZSBJbnRlcmxvY2tlZEV4Y2hhbmdlCQkJYXRvbWljX3NldAotLy8jZGVmaW5lIE5kaXNNU2VuZENvbXBsZXRlCQkJUlRNUF9TZW5kQ29tcGxldGUKLSNkZWZpbmUgTmRpc01DYW5jZWxUaW1lcgkJCVJUTVBDYW5jZWxUaW1lcgotI2RlZmluZSBOZGlzQWxsb2NNZW1vcnkoX3B0ciwgX3NpemUsIF9mbGFnKQlcCi0JCQkJCQkJCQlkb3tfcHRyID0ga21hbGxvYygoX3NpemUpLChfZmxhZykpO313aGlsZSgwKQotI2RlZmluZSBOZGlzRnJlZU1lbW9yeShhLCBiLCBjKSAJa2ZyZWUoKGEpKQotI2RlZmluZSBOZGlzTVNsZWVwCQkJCQlSVE1QdXNlY0RlbGF5CQkvKiB1bml0OiBtaWNyb3NlY29uZCAqLwotCi0KLSNkZWZpbmUgVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VUCQkwCi0jZGVmaW5lIFVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX0lOCQkwCi0jZGVmaW5lIFVTQkRfU0hPUlRfVFJBTlNGRVJfT0sJCQkwCi0jZGVmaW5lIFBVUkIJCQlwdXJiYl90Ci0KLSNkZWZpbmUgUlRVU0JfRlJFRV9VUkIocFVyYikJdXNiX2ZyZWVfdXJiKHBVcmIpCi0KLS8vI3VuZGVmIE1sbWVBbGxvY2F0ZU1lbW9yeQotLy8jdW5kZWYgTWxtZUZyZWVNZW1vcnkKLQotdHlwZWRlZiBzdHJ1Y3QgdXNiX2RldmljZQkqIFBVU0JfREVWOwotCi0vKiBNQUNSTyBmb3IgbGludXggdXNiICovCi10eXBlZGVmIHN0cnVjdCB1cmIgKnB1cmJiX3Q7Ci10eXBlZGVmIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgZGV2Y3RybHJlcXVlc3Q7Ci0jZGVmaW5lIFBJUlAJCVBWT0lECi0jZGVmaW5lIFBNREwJCVBWT0lECi0jZGVmaW5lIE5ESVNfT0lECVVJTlQKLSNpZm5kZWYgVVNCX1NUX05PRVJST1IKLSNkZWZpbmUgVVNCX1NUX05PRVJST1IgICAgIDAKLSNlbmRpZgotCi0vLyB2ZW5kb3Itc3BlY2lmaWMgY29udHJvbCBvcGVyYXRpb25zCi0jZGVmaW5lIENPTlRST0xfVElNRU9VVF9KSUZGSUVTICggKDEwMCAqIEhaKSAvIDEwMDApCi0jZGVmaW5lIFVOTElOS19USU1FT1VUX01TCQkzCi0KLS8qIHVubGluayB1cmIJKi8KLSNkZWZpbmUgUlRVU0JfVU5MSU5LX1VSQihwVXJiKQkJdXNiX2tpbGxfdXJiKHBVcmIpCi0KLS8vIFByb3RvdHlwZXMgb2YgY29tcGxldGlvbiBmdW51Yy4KLVZPSUQgUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKHB1cmJiX3QgcHVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpOwotVk9JRCBSVFVTQkJ1bGtPdXRNTE1FUGFja2V0Q29tcGxldGUocHVyYmJfdCBwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncyk7Ci1WT0lEIFJUVVNCQnVsa091dE51bGxGcmFtZUNvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpOwotVk9JRCBSVFVTQkJ1bGtPdXRSVFNGcmFtZUNvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpOwotVk9JRCBSVFVTQkJ1bGtPdXRQc1BvbGxDb21wbGV0ZShwdXJiYl90IHBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKTsKLVZPSUQgUlRVU0JCdWxrUnhDb21wbGV0ZShwdXJiYl90IHBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKTsKLQotI2RlZmluZSBSVFVTQk1sbWVVcChwQWQpCSAgICAgICAgXAotewkJCQkJCQkJICAgIFwKLQlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CVwKLQlpZiAocGlkX25yKHBPYmotPk1MTUVUaHJfcGlkKSA+IDApIFwKLSAgICAgICAgdXAoJihwQWQtPm1sbWVfc2VtYXBob3JlKSk7IFwKLX0KLQotI2RlZmluZSBSVFVTQkNNRFVwKHBBZCkJICAgICAgICAgICAgICAgIFwKLXsJCQkJCQkJCQkgICAgXAotCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsJXAotCWlmIChwaWRfbnIocE9iai0+UlRVU0JDbWRUaHJfcGlkKSA+IDApIFwKLQkgICAgdXAoJihwQWQtPlJUVVNCQ21kX3NlbWFwaG9yZSkpOyBcCi19Ci0KLXN0YXRpYyBpbmxpbmUgTkRJU19TVEFUVVMgUlRNUEFsbG9jYXRlTWVtb3J5KAotCU9VVCBQVk9JRCAqcHRyLAotCUlOIHNpemVfdCBzaXplKQotewotCSpwdHIgPSBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOwotCWlmKCpwdHIpCi0JCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotCWVsc2UKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKLX0KLQotLyogcnRtcC5oICovCi0jZGVmaW5lCUJFQUNPTl9SSU5HX1NJWkUgICAgICAgICAgICAgICAgMgotI2RlZmluZSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VUICAgICAgIDB4NDAKLSNkZWZpbmUgREVWSUNFX1ZFTkRPUl9SRVFVRVNUX0lOICAgICAgICAweGMwCi0jZGVmaW5lIElOVEVSRkFDRV9WRU5ET1JfUkVRVUVTVF9PVVQgICAgMHg0MQotI2RlZmluZSBJTlRFUkZBQ0VfVkVORE9SX1JFUVVFU1RfSU4gICAgIDB4YzEKLSNkZWZpbmUgTUdNVFBJUEVJRFgJCQkJCQkwCS8vIEVQNiBpcyBoaWdoZXN0IHByaW9yaXR5Ci0KLSNkZWZpbmUgQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcJCQkJMHg4MAotCi0jZGVmaW5lIFJUVVNCX1NFVF9CVUxLX0ZMQUcoX00sIF9GKQkJCQkoKF9NKS0+QnVsa0ZsYWdzIHw9IChfRikpCi0jZGVmaW5lIFJUVVNCX0NMRUFSX0JVTEtfRkxBRyhfTSwgX0YpCQkJKChfTSktPkJ1bGtGbGFncyAmPSB+KF9GKSkKLSNkZWZpbmUgUlRVU0JfVEVTVF9CVUxLX0ZMQUcoX00sIF9GKQkJCSgoKF9NKS0+QnVsa0ZsYWdzICYgKF9GKSkgIT0gMCkKLQotI2RlZmluZSBFbnF1ZXVlQ21kKGNtZHEsIGNtZHFlbG10KQkJXAotewkJCQkJCQkJCQlcCi0JaWYgKGNtZHEtPnNpemUgPT0gMCkJCQkJXAotCQljbWRxLT5oZWFkID0gY21kcWVsbXQ7CQkJXAotCWVsc2UJCQkJCQkJCVwKLQkJY21kcS0+dGFpbC0+bmV4dCA9IGNtZHFlbG10OwlcCi0JY21kcS0+dGFpbCA9IGNtZHFlbG10OwkJCQlcCi0JY21kcWVsbXQtPm5leHQgPSBOVUxMOwkJCQlcCi0JY21kcS0+c2l6ZSsrOwkJCQkJCVwKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgICBfUlRfU0VUX0FTSUNfV0NJRCB7Ci0JVUxPTkcgV0NJRDsgICAgICAgICAgLy8gbWVjaGFuaXNtIGZvciByZWtleWluZzogMDpkaXNhYmxlLCAxOiB0aW1lLWJhc2VkLCAyOiBwYWNrZXQtYmFzZWQKLQlVTE9ORyBTZXRUaWQ7ICAgICAgICAvLyB0aW1lLWJhc2VkOiBzZWNvbmRzLCBwYWNrZXQtYmFzZWQ6IGtpbG8tcGFja2V0cwotCVVMT05HIERlbGV0ZVRpZDsgICAgICAgIC8vIHRpbWUtYmFzZWQ6IHNlY29uZHMsIHBhY2tldC1iYXNlZDoga2lsby1wYWNrZXRzCi0JVUNIQVIgQWRkcltNQUNfQUREUl9MRU5dOwkvLyBhdm9pZCBpbiBpbnRlcnJ1cHQgd2hlbiB3cml0ZSBrZXkKLX0gUlRfU0VUX0FTSUNfV0NJRCwqUFJUX1NFVF9BU0lDX1dDSUQ7Ci0KLXR5cGVkZWYgc3RydWN0ICAgX1JUX1NFVF9BU0lDX1dDSURfQVRUUkkgewotCVVMT05HCVdDSUQ7ICAgICAgICAgIC8vIG1lY2hhbmlzbSBmb3IgcmVrZXlpbmc6IDA6ZGlzYWJsZSwgMTogdGltZS1iYXNlZCwgMjogcGFja2V0LWJhc2VkCi0JVUxPTkcJQ2lwaGVyOyAgICAgICAgLy8gQVNJQyBDaXBoZXIgZGVmaW5pdGlvbgotCVVDSEFSCUFkZHJbRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKLX0gUlRfU0VUX0FTSUNfV0NJRF9BVFRSSSwqUFJUX1NFVF9BU0lDX1dDSURfQVRUUkk7Ci0KLXR5cGVkZWYgc3RydWN0IF9NTE1FX01FTU9SWV9TVFJVQ1QgewotCVBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NWYTsgICAgLy9Qb2ludGVyIHRvIHRoZSBiYXNlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeQotCXN0cnVjdCBfTUxNRV9NRU1PUllfU1RSVUNUICAgICAgKk5leHQ7ICAgICAgLy9Qb2ludGVyIHRvIHRoZSBuZXh0IHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeQotfSAgIE1MTUVfTUVNT1JZX1NUUlVDVCwgKlBNTE1FX01FTU9SWV9TVFJVQ1Q7Ci0KLXR5cGVkZWYgc3RydWN0ICBfTUxNRV9NRU1PUllfSEFORExFUiB7Ci0JQk9PTEVBTiAgICAgICAgICAgICAgICAgTWVtUnVubmluZzsgICAgICAgICAvL1RoZSBmbGFnIG9mIHRoZSBNbG1lIG1lbW9yeSBoYW5kbGVyJ3Mgc3RhdHVzCi0JVUlOVCAgICAgICAgICAgICAgICAgICAgTWVtb3J5Q291bnQ7ICAgICAgICAvL1RvdGFsIG5vbnBhZ2VkIHN5c3RlbS1zcGFjZSBtZW1vcnkgbm90IHNpemUKLQlVSU5UICAgICAgICAgICAgICAgICAgICBJblVzZUNvdW50OyAgICAgICAgIC8vTm9ucGFnZWQgc3lzdGVtLXNwYWNlIG1lbW9yeSBpbiB1c2VkIGNvdW50cwotCVVJTlQgICAgICAgICAgICAgICAgICAgIFVuVXNlQ291bnQ7ICAgICAgICAgLy9Ob25wYWdlZCBzeXN0ZW0tc3BhY2UgbWVtb3J5IGF2YWlsYWJsZSBjb3VudHMKLQlJTlQgICAgICAgICAgICAgICAgICAgIFBlbmRpbmdDb3VudDsgICAgICAgLy9Ob25wYWdlZCBzeXN0ZW0tc3BhY2UgbWVtb3J5IGZvciBmcmVlIGNvdW50cwotCVBNTE1FX01FTU9SWV9TVFJVQ1QgICAgIHBJblVzZUhlYWQ7ICAgICAgICAgLy9Qb2ludGVyIHRvIHRoZSBmaXJzdCBub25wYWVkIG1lbW9yeSBub3QgdXNlZAotCVBNTE1FX01FTU9SWV9TVFJVQ1QgICAgIHBJblVzZVRhaWw7ICAgICAgICAgLy9Qb2ludGVyIHRvIHRoZSBsYXN0IG5vbnBhZ2VkIG1lbW9yeSBub3QgdXNlZAotCVBNTE1FX01FTU9SWV9TVFJVQ1QgICAgIHBVblVzZUhlYWQ7ICAgICAgICAgLy9Qb2ludGVyIHRvIHRoZSBmaXJzdCBub25wYWdlZCBtZW1vcnkgaW4gdXNlZAotCVBNTE1FX01FTU9SWV9TVFJVQ1QgICAgIHBVblVzZVRhaWw7ICAgICAgICAgLy9Qb2ludGVyIHRvIHRoZSBsYXN0IG5vbnBhZ2VkIG1lbW9yeSBpbiB1c2VkCi0JUFVMT05HICAgICAgICAgICAgICAgICAgTWVtRnJlZVBlbmRpbmdbTUFYX01MTUVfSEFORExFUl9NRU1PUlldOyAgIC8vYW4gYXJyYXkgdG8ga2VlcCBwZW5kaW5nIGZyZWUtbWVtb3J5J3MgcG9pbnRlciAoMzJiaXRzKQotfSAgIE1MTUVfTUVNT1JZX0hBTkRMRVIsICpQTUxNRV9NRU1PUllfSEFORExFUjsKLQotdHlwZWRlZglzdHJ1Y3QgX0NtZFFFbG10CXsKLQlVSU5UCQkJCWNvbW1hbmQ7Ci0JUFZPSUQJCQkJYnVmZmVyOwotCVVMT05HCQkJCWJ1ZmZlcmxlbmd0aDsKLQlCT09MRUFOCQkJCUNtZEZyb21OZGlzOwotCUJPT0xFQU4JCQkJU2V0T3BlcmF0aW9uOwotCXN0cnVjdCBfQ21kUUVsbXQJKm5leHQ7Ci19CUNtZFFFbG10LCAqUENtZFFFbG10OwotCi10eXBlZGVmCXN0cnVjdAlfQ21kUQl7Ci0JVUlOVAkJc2l6ZTsKLQlDbWRRRWxtdAkqaGVhZDsKLQlDbWRRRWxtdAkqdGFpbDsKLQlVSU5UMzIJCUNtZFFTdGF0ZTsKLX1DbWRRLCAqUENtZFE7Ci0KLS8qIG9pZC5oICovCi0vLyBDaXBoZXIgc3VpdGUgdHlwZSBmb3IgbWl4ZWQgbW9kZSBncm91cCBjaXBoZXIsIFA4MDIuMTFpLTIwMDQKLXR5cGVkZWYgZW51bSBfUlRfODAyXzExX0NJUEhFUl9TVUlURV9UWVBFIHsKLQlDaXBoZXJfVHlwZV9OT05FLAotCUNpcGhlcl9UeXBlX1dFUDQwLAotCUNpcGhlcl9UeXBlX1RLSVAsCi0JQ2lwaGVyX1R5cGVfUlNWRCwKLQlDaXBoZXJfVHlwZV9DQ01QLAotCUNpcGhlcl9UeXBlX1dFUDEwNAotfSBSVF84MDJfMTFfQ0lQSEVSX1NVSVRFX1RZUEUsICpQUlRfODAyXzExX0NJUEhFUl9TVUlURV9UWVBFOwotCi0vL0NNRFRIUkVBRF9NVUxUSV9SRUFEX01BQwotLy9DTURUSFJFQURfTVVMVElfV1JJVEVfTUFDCi0vL0NNRFRIUkVBRF9WRU5ET1JfRUVQUk9NX1JFQUQKLS8vQ01EVEhSRUFEX1ZFTkRPUl9FRVBST01fV1JJVEUKLXR5cGVkZWYJc3RydWN0CV9DTURIYW5kbGVyX1RMVgl7Ci0JVVNIT1JUCQlPZmZzZXQ7Ci0JVVNIT1JUCQlMZW5ndGg7Ci0JVUNIQVIJCURhdGFGaXJzdDsKLX0JQ01ESGFuZGxlcl9UTFYsICpQQ01ESGFuZGxlcl9UTFY7Ci0KLS8vIE5ldyBmb3IgTWVldGluZ0hvdXNlIEFwaSBzdXBwb3J0Ci0jZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDEwMQkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9VTlBMVUcgICAgICAgICAgICAgICAgICAgICAweDBENzMwMTAyCS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfVkVORE9SX1NXSVRDSF9GVU5DVElPTiAgICAgICAgICAgIDB4MEQ3MzAxMDMJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF9NVUxUSV9XUklURV9NQUMgICAgICAgICAgICAgICAgICAgMHgwRDczMDEwNwkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX01VTFRJX1JFQURfTUFDICAgICAgICAgICAgICAgICAgICAweDBENzMwMTA4CS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfVkVORE9SX0VFUFJPTV9XUklURSAgICAgICAgICAgICAgIDB4MEQ3MzAxMEEJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfRUVQUk9NX1JFQUQgICAgICAgICAgICAgICAgMHgwRDczMDEwQgkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9FTlRFUl9URVNUTU9ERSAgICAgICAgICAgICAweDBENzMwMTBDCS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfVkVORE9SX0VYSVRfVEVTVE1PREUgICAgICAgICAgICAgIDB4MEQ3MzAxMEQJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfV1JJVEVfQkJQICAgICAgICAgICAgICAgICAgMHgwRDczMDExOQkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9SRUFEX0JCUCAgICAgICAgICAgICAgICAgICAweDBENzMwMTE4CS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfVkVORE9SX1dSSVRFX1JGICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAxMUEJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfRkxJUF9JUSAgICAgICAgICAgICAgICAgICAgMHgwRDczMDExRAkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VUICAgICAgICAgICAgICAgICAgICAweDBENzMwMjEwCS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfUkVTRVRfQlVMS19JTiAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMTEJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF9TRVRfUFNNX0JJVF9TQVZFICAgICAgICAgICAgICAgICAgMHgwRDczMDIxMgkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX1NFVF9SQURJTyAgICAgICAgICAgICAgICAgICAgICAgICAweDBENzMwMjE0CS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfVVBEQVRFX1RYX1JBVEUgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMTYJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF84MDJfMTFfQUREX0tFWV9XRVAgICAgICAgICAgICAgICAgMHgwRDczMDIxOAkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX1JFU0VUX0ZST01fRVJST1IgICAgICAgICAgICAgICAgICAweDBENzMwMjFBCS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfTElOS19ET1dOICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMUIJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF9SRVNFVF9GUk9NX05ESVMgICAgICAgICAgICAgICAgICAgMHgwRDczMDIxQwkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX0NIRUNLX0dQSU8gICAgICAgICAgICAgICAgICAgICAgICAweDBENzMwMjE1CS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfRk9SQ0VfV0FLRV9VUCAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMjIJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF9TRVRfQlcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIyNQkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX1NFVF9BU0lDX1dDSUQgICAgICAgICAgICAgICAgICAgICAweDBENzMwMjI2CS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfU0VUX0FTSUNfV0NJRF9DSVBIRVIgICAgICAgICAgICAgIDB4MEQ3MzAyMjcJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF9RS0VSSU9ESUNfRVhFQ1VUICAgICAgICAgICAgICAgICAgMHgwRDczMDIzRAkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX1NFVF9DTElFTlRfTUFDX0VOVFJZICAgICAgICAgICAgICAweDBENzMwMjNFCS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfODAyXzExX1FVRVJZX0hBUkRXQVJFX1JFR0lTVEVSICAgIDB4MEQ3MTAxMDUJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF84MDJfMTFfU0VUX1BIWV9NT0RFICAgICAgICAgICAgICAgMHgwRDc5MDEwQwkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEXzgwMl8xMV9TRVRfU1RBX0NPTkZJRyAgICAgICAgICAgICAweDBENzkwMTExCS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfODAyXzExX1NFVF9QUkVBTUJMRSAgICAgICAgICAgICAgIDB4MEQ3OTAxMDEJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF84MDJfMTFfQ09VTlRFUl9NRUFTVVJFCQkJMHgwRDc5MDEwMgkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX1VQREFURV9QUk9URUNUCQkJCQkweDBENzkwMTAzCS8vIGNtZAotCi0jZGVmaW5lIFdQQTFBS01CSVQJICAgIDB4MDEKLSNkZWZpbmUgV1BBMkFLTUJJVAkgICAgMHgwMgotI2RlZmluZSBXUEExUFNLQUtNQklUICAgMHgwNAotI2RlZmluZSBXUEEyUFNLQUtNQklUICAgMHgwOAotI2RlZmluZSBUS0lQQklUICAgICAgICAgMHgwMQotI2RlZmluZSBDQ01QQklUICAgICAgICAgMHgwMgotCi0KLSNkZWZpbmUgUlQyOFhYX1NUQV9GT1JDRV9XQUtFVVAocEFkLCBiRnJvbVR4KSBcCi0gICAgUlQyOHh4VXNiU3RhQXNpY0ZvcmNlV2FrZXVwKHBBZCwgYkZyb21UeCk7Ci0KLSNkZWZpbmUgUlQyOFhYX1NUQV9TTEVFUF9USEVOX0FVVE9fV0FLRVVQKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCkgXAotICAgIFJUMjh4eFVzYlN0YUFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCk7Ci0KLSNkZWZpbmUgUlQyOFhYX01MTUVfUkFESU9fT04ocEFkKSBcCi0gICAgUlQyOHh4VXNiTWxtZVJhZGlvT24ocEFkKTsKLQotI2RlZmluZSBSVDI4WFhfTUxNRV9SQURJT19PRkYocEFkKSBcCi0gICAgUlQyOHh4VXNiTWxtZVJhZGlvT0ZGKHBBZCk7Ci0KLSNlbmRpZiAvL19fUlQyODcwX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUwMmQ0YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfdXNiLmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uL3J0Mjg2MC9ydF91c2IuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvdXNiX21haW5fZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3VzYl9tYWluX2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNjNiYzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3VzYl9tYWluX2Rldi5jCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICIuLi9ydDI4NjAvdXNiX21haW5fZGV2LmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDcwL2Zpcm13YXJlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDcwL2Zpcm13YXJlLmgKaW5kZXggYjA3NzgzZS4uNWNmOWNiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA3MC9maXJtd2FyZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwNzAvZmlybXdhcmUuaApAQCAtNDMsNyArNDMsNyBAQAogLyogQVVUTyBHRU4gUExFQVNFIERPIE5PVCBNT0RJRlkgSVQgKi8KIAogCi1VQ0hBUiBGaXJtd2FyZUltYWdlIFtdID0gewordTggRmlybXdhcmVJbWFnZV8yODcwIFtdID0gewogMHhmZiwgMHhmZiwgMHhmZiwgMHgwMiwgMHgxMCwgMHgyOCwgMHgwMiwgMHgxMCwgMHgzMiwgMHgwMiwgMHgxMCwgMHg3OCwgMHgwMiwgMHgxMiwgMHg2NywgMHgwMiwKIDB4MTIsIDB4NjgsIDB4MDIsIDB4MTIsIDB4ODcsIDB4MDIsIDB4MTIsIDB4OGMsIDB4MTIsIDB4MTIsIDB4ODgsIDB4MjIsIDB4MDIsIDB4MTYsIDB4NDksIDB4MDIsCiAweDE3LCAweDFmLCAweDAyLCAweDEzLCAweDc3LCAweDAyLCAweDEyLCAweDhkLCAweDMwLCAweDA1LCAweDA2LCAweDIwLCAweDBkLCAweDAzLCAweDEyLCAweDE3LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA3MC9tZDQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwNzAvbWQ0LmgKaW5kZXggZjFlNWI1Mi4uYTljYzdiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA3MC9tZDQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDcwL21kNC5oCkBAIC0zMCwxMyArMzAsMTMgQEAKIAogLyogTUQ0IGNvbnRleHQuICovCiB0eXBlZGVmCXN0cnVjdAlfTUQ0X0NUWF8JewotCVVMT05HCXN0YXRlWzRdOyAgICAgICAgLyogc3RhdGUgKEFCQ0QpICovCi0JVUxPTkcJY291bnRbMl07ICAgICAgICAvKiBudW1iZXIgb2YgYml0cywgbW9kdWxvIDJeNjQgKGxzYiBmaXJzdCkgKi8KLQlVQ0hBUglidWZmZXJbNjRdOyAgICAgIC8qIGlucHV0IGJ1ZmZlciAqLworCXVuc2lnbmVkIGxvbmcJc3RhdGVbNF07ICAgICAgICAvKiBzdGF0ZSAoQUJDRCkgKi8KKwl1bnNpZ25lZCBsb25nCWNvdW50WzJdOyAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMsIG1vZHVsbyAyXjY0IChsc2IgZmlyc3QpICovCisJdTgJYnVmZmVyWzY0XTsgICAgICAvKiBpbnB1dCBidWZmZXIgKi8KIH0JTUQ0X0NUWDsKIAotVk9JRCBNRDRJbml0IChNRDRfQ1RYICopOwotVk9JRCBNRDRVcGRhdGUgKE1ENF9DVFggKiwgUFVDSEFSLCBVSU5UKTsKLVZPSUQgTUQ0RmluYWwgKFVDSEFSIFsxNl0sIE1ENF9DVFggKik7Cit2b2lkIE1ENEluaXQgKE1ENF9DVFggKik7Cit2b2lkIE1ENFVwZGF0ZSAoTUQ0X0NUWCAqLCB1OCAqLCBVSU5UKTsKK3ZvaWQgTUQ0RmluYWwgKHU4IFsxNl0sIE1ENF9DVFggKik7CiAKICNlbmRpZiAvL19fTUQ0X0hfXwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzZjc0NS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL0tjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWNvbmZpZyBSVDMwOTAKLQl0cmlzdGF0ZSAiUmFsaW5rIDMwOTAgd2lyZWxlc3Mgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBDSSAmJiBYODYgJiYgV0xBTgotCS0tLWhlbHAtLS0KLQkgIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGRyaXZlciBmb3IgdGhlIFJhbGluayAzMDkwIHdpcmVsZXNzIGNoaXAuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk1NDkxYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotb2JqLSQoQ09ORklHX1JUMzA5MCkJKz0gcnQzMDkwc3RhLm8KLQotaW5jbHVkZSBkcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbmZpZy5tawotCi1ydDMwOTBzdGEtb2JqcyA6PSBcCi0JY29tbW9uL2NyeXB0X21kNS5vIFwKLQljb21tb24vY3J5cHRfc2hhMi5vIFwKLQljb21tb24vY3J5cHRfaG1hYy5vIFwKLQljb21tb24vbWxtZS5vIFwKLQljb21tb24vY21tX3dlcC5vIFwKLQljb21tb24vYWN0aW9uLm8gXAotCWNvbW1vbi9jbW1fZGF0YS5vIFwKLQljb21tb24vcnRtcF9pbml0Lm8gXAotCWNvbW1vbi9jbW1fdGtpcC5vIFwKLQljb21tb24vY21tX2Flcy5vIFwKLQljb21tb24vY21tX3N5bmMubyBcCi0JY29tbW9uL2VlcHJvbS5vIFwKLQljb21tb24vY21tX3Nhbml0eS5vIFwKLQljb21tb24vY21tX2luZm8ubyBcCi0JY29tbW9uL2NtbV9jZmcubyBcCi0JY29tbW9uL2NtbV93cGEubyBcCi0JY29tbW9uL2Rmcy5vIFwKLQljb21tb24vc3BlY3RydW0ubyBcCi0JY29tbW9uL3J0bXBfdGltZXIubyBcCi0JY29tbW9uL3J0X2NoYW5uZWwubyBcCi0JY29tbW9uL2NtbV9wcm9maWxlLm8gXAotCWNvbW1vbi9jbW1fYXNpYy5vIFwKLQlzdGEvYXNzb2MubyBcCi0Jc3RhL2F1dGgubyBcCi0Jc3RhL2F1dGhfcnNwLm8gXAotCXN0YS9zeW5jLm8gXAotCXN0YS9zYW5pdHkubyBcCi0Jc3RhL3J0bXBfZGF0YS5vIFwKLQlzdGEvY29ubmVjdC5vIFwKLQlzdGEvd3BhLm8gXAotCXJ0X2xpbnV4Lm8gXAotCXJ0X3Byb2ZpbGUubyBcCi0JcnRfbWFpbl9kZXYubyBcCi0Jc3RhX2lvY3RsLm8KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotaWZlcSAoJChIQVNfRE9UMTFfTl9TVVBQT1JUKSx5KQotcnQzMDkwc3RhLW9ianMgKz0gXAotCWNvbW1vbi9iYV9hY3Rpb24ubwotZW5kaWYKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotI2lmZGVmIEVUSF9DT05WRVJUCi1pZmVxICgkKEhBU19FVEhfQ09OVkVSVF9TVVBQT1JUKSwgeSkKLXJ0MzA5MHN0YS1vYmpzICs9IFwKLQljb21tb24vY21tX21hdC5vIFwKLQljb21tb24vY21tX21hdF9pcGFycC5vIFwKLQljb21tb24vY21tX21hdF9wcHBvZS5vIFwKLQljb21tb24vY21tX21hdF9pcHY2Lm8KLWVuZGlmCi0jZW5kaWYgLy8gRVRIX0NPTlZFUlQgLy8KLQotaWZlcSAoJChIQVNfQkxPQ0tfTkVUX0lGKSx5KQotcnQzMDkwc3RhLW9ianMgKz0gY29tbW9uL25ldGlmX2Jsb2NrLm8KLWVuZGlmCi0KLWlmZXEgKCQoSEFTX1FPU19ETFNfU1VQUE9SVCkseSkKLXJ0MzA5MHN0YS1vYmpzICs9IHN0YS9kbHMubwotZW5kaWYKLQotcnQzMDkwc3RhLW9ianMgKz0gXAotCXBjaV9tYWluX2Rldi5vIFwKLQlydF9wY2lfcmJ1cy5vIFwKLQljb21tb24vY21tX21hY19wY2kubyBcCi0JY29tbW9uL2NtbV9kYXRhX3BjaS5vIFwKLQljb21tb24vZWVfcHJvbS5vIFwKLQljb21tb24vZWVfZWZ1c2UubyBcCi0JY29tbW9uL3J0bXBfbWN1Lm8gXAotCWNoaXBzL3J0MzB4eC5vIFwKLQljb21tb24vcnRfcmYubyBcCi0JY2hpcHMvcnQzMDkwLm8KLQotaWZlcSAoJChIQVNfQVRFKSx5KQotcnQzMDkwc3RhLW9ianMgKz0gcnRfYXRlLm8KLWVuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FjdGlvbi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9hY3Rpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMwYTBhMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FjdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQlhaXJvbmV0LmgKLQotCUFic3RyYWN0OgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCQlXaGVuCQkJV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKLQlQYXVsIExpbgkwNC0wNi0xNQkJSW5pdGlhbAotKi8KLQotI2lmbmRlZglfX0FDVElPTl9IX18KLSNkZWZpbmUJX19BQ1RJT05fSF9fCi0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfX0hUX0lORk9fT0NURVQKLXsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JVUNIQVIJUmVzZXJ2ZWQ6NTsKLQlVQ0hBUglTVEFfQ2hhbm5lbF9XaWR0aDoxOwotCVVDSEFSCUZvcnR5X01Iel9JbnRvbGVyYW50OjE7Ci0JVUNIQVIJUmVxdWVzdDoxOwotI2Vsc2UKLQlVQ0hBUglSZXF1ZXN0OjE7Ci0JVUNIQVIJRm9ydHlfTUh6X0ludG9sZXJhbnQ6MTsKLQlVQ0hBUglTVEFfQ2hhbm5lbF9XaWR0aDoxOwotCVVDSEFSCVJlc2VydmVkOjU7Ci0jZW5kaWYKLX0gSFRfSU5GT1JNQVRJT05fT0NURVQ7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9fRlJBTUVfSFRfSU5GTwotewotCUhFQURFUl84MDJfMTEJCQlIZHI7Ci0JVUNIQVIJCQkJCUNhdGVnb3J5OwotCVVDSEFSCQkJCQlBY3Rpb247Ci0JSFRfSU5GT1JNQVRJT05fT0NURVQJSFRfSW5mbzsKLX0gICBGUkFNRV9IVF9JTkZPLCAqUEZSQU1FX0hUX0lORk87Ci0KLSNlbmRpZiAvKiBfX0FDVElPTl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg5NDMwMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MTIgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBhcC5oCi0KLSAgICBBYnN0cmFjdDoKLSAgICBNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgUGF1bCBMaW4gICAgMDgtMDEtMjAwMiAgICBjcmVhdGVkCi0gICAgSmFtZXMgVGFuICAgMDktMDYtMjAwMiAgICBtb2RpZmllZCAoUmV2aXNlIE5UQ1JlZ1RhYmxlKQotICAgIEpvaG4gQ2hhbmcgIDEyLTIyLTIwMDQgICAgbW9kaWZpZWQgZm9yIFJUMjU2MS8yNjYxLiBtZXJnZSB3aXRoIFNUQSBkcml2ZXIKLSovCi0jaWZuZGVmIF9fQVBfSF9fCi0jZGVmaW5lIF9fQVBfSF9fCi0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gICAgICBGdW5jdGlvbiBQcm90b3R5cGVzCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIGFwX2RhdGEuYwotCi1CT09MRUFOIEFQQnJpZGdlVG9XaXJlbGVzc1N0YSgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIHBIZWFkZXIsCi0gICAgSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKLSAgICBJTiAgVUlOVCAgICAgICAgICAgIERhdGFMZW4sCi0gICAgSU4gIFVMT05HICAgICAgICAgICBmcm9td2RzaWR4KTsKLQotCi1WT0lECUFQU2VuZFBhY2tldHMoCi0JSU4JTkRJU19IQU5ETEUJCU1pbmlwb3J0QWRhcHRlckNvbnRleHQsCi0JSU4JUFBORElTX1BBQ0tFVAlwcFBhY2tldEFycmF5LAotCUlOCVVJTlQJCQlOdW1iZXJPZlBhY2tldHMpOwotCi1ORElTX1NUQVRVUyBBUFNlbmRQYWNrZXQoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKLQotCi1ORElTX1NUQVRVUyBBUEhhcmRUcmFuc21pdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCVVDSEFSCQkJUXVlSWR4KTsKLQotVk9JRCBBUFJ4RUFQT0xGcmFtZUluZGljYXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLU5ESVNfU1RBVFVTIEFQQ2hlY2tSeEVycm9yKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBSVDI4WFhfUlhEX1NUUlVDCQlwUnhELAotCUlOCVVDSEFSCQkJV2NpZCk7Ci0KLUJPT0xFQU4gQVBDaGVja0NsYXNzMkNsYXNzM0Vycm9yKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOIFVMT05HIFdjaWQsCi0JSU4gIFBIRUFERVJfODAyXzExICBwSGVhZGVyKTsKLQotVk9JRCBBUEhhbmRsZVJ4UHNQb2xsKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBBZGRyLAotCUlOCVVTSE9SVAkJCUFpZCwKLSAgICBJTglCT09MRUFOCQkJaXNBY3RpdmUpOwotCi1WT0lEICAgIFJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKAotICAgIElOICBQVUNIQVIgICAgICAgICAgcERhdGEsCi0gICAgSU4gIFVMT05HICAgICAgICAgICBEZXNjcmlwdG9yVHlwZSk7Ci0KLVZPSUQgICAgUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQVUNIQVIgICAgICAgICAgcERhdGEsCi0gICAgSU4gIFVMT05HICAgICAgICAgICBEaXIsCi0gICAgSU4gIEJPT0xFQU4gICAgICAgICBGcm9tUnhEb25lSW50KTsKLQotLy8gYXBfYXNzb2MuYwotCi1WT0lEIEFQQXNzb2NTdGF0ZU1hY2hpbmVJbml0KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBTVEFURV9NQUNISU5FICpTLAotICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7Ci0KLVZPSUQgIEFQUGVlckFzc29jUmVxQWN0aW9uKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEICBBUFBlZXJSZWFzc29jUmVxQWN0aW9uKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEICBBUFBlZXJEaXNhc3NvY1JlcUFjdGlvbigKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBNYnNzS2lja091dFN0YXMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gSU5UIGFwaWR4LAotCUlOIFVTSE9SVCBSZWFzb24pOwotCi1WT0lEIEFQTWxtZUtpY2tPdXRTdGEoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBTdGFBZGRyLAotCUlOIFVDSEFSIFdjaWQsCi0JSU4gVVNIT1JUIFJlYXNvbik7Ci0KLVZPSUQgQVBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCAgQVBDbHMzZXJyQWN0aW9uKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCVVMT05HIFdjaWQsCi0gICAgSU4JUEhFQURFUl84MDJfMTEJcEhlYWRlcik7Ci0KLQotVVNIT1JUIEFQQnVpbGRBc3NvY2lhdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSwKLSAgICBJTiBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCi0gICAgSU4gVUNIQVIgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMsCi0gICAgSU4gVUNIQVIgICpSU04sCi0gICAgSU4gVUNIQVIgICpwUlNOTGVuLAotICAgIElOIEJPT0xFQU4gYldtbUNhcGFibGUsCi0gICAgSU4gVUxPTkcgIFJhbGlua0llLAotI2lmZGVmIERPVDExTl9EUkFGVDMKLSAgICBJTiBFWFRfQ0FQX0lORk9fRUxFTUVOVCBFeHRDYXBJbmZvLAotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLQlJTiBIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKLQlJTiBVQ0hBUgkJIEh0Q2FwYWJpbGl0eUxlbiwKLSAgICBPVVQgVVNIT1JUICpwQWlkKTsKLQotLyoKLVZPSUQJUlRNUEFkZENsaWVudFNlYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUglCc3NJZHgsCi0JSU4gVUNIQVIJCSBLZXlJZHgsCi0JSU4gVUNIQVIJCSBDaXBoZXJBbGcsCi0JSU4gUFVDSEFSCQkgcEtleSwKLQlJTiBQVUNIQVIJCSBwVHhNaWMsCi0JSU4gUFVDSEFSCQkgcFJ4TWljLAotCUlOIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5KTsKLSovCi0KLS8vIGFwX2F1dGguYwotCi12b2lkIEFQQXV0aFN0YXRlTWFjaGluZUluaXQoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gU1RBVEVfTUFDSElORSAqU20sCi0gICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKLQotVk9JRCBBUENsczJlcnJBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcgV2NpZCwKLSAgICBJTglQSEVBREVSXzgwMl8xMQlwSGVhZGVyKTsKLQotLy8gYXBfY29ubmVjdC5jCi0KLQotVk9JRCBBUE1ha2VCc3NCZWFjb24oCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4JSU5UCQkJCWFwaWR4KTsKLQotVk9JRCAgQVBVcGRhdGVCZWFjb25GcmFtZSgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTglJTlQJCQkJYXBpZHgpOwotCi1WT0lEIEFQTWFrZUFsbEJzc0JlYWNvbigKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgIEFQVXBkYXRlQWxsQmVhY29uRnJhbWUoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi0KLS8vIGFwX3N5bmMuYwotCi1WT0lEIEFQU3luY1N0YXRlTWFjaGluZUluaXQoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gU1RBVEVfTUFDSElORSAqU20sCi0gICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKLQotVk9JRCBBUFNjYW5UaW1lb3V0KAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Ci0KLVZPSUQgQVBJbnZhbGlkU3RhdGVXaGVuU2NhbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIEFQU2NhblRpbWVvdXRBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBBUFBlZXJQcm9iZVJlcUFjdGlvbigKLSAgICBJTiAgUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgQVBQZWVyQmVhY29uQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgQVBNbG1lU2NhblJlcUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIEFQUGVlckJlYWNvbkF0U2NhbkFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIEFQU2NhbkNuY2xBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBBcFNpdGVTdXJ2ZXkoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCVBORElTXzgwMl8xMV9TU0lECXBTc2lkLAotCUlOCVVDSEFSCQkJCVNjYW5UeXBlKTsKLQotVk9JRCBTdXBwb3J0UmF0ZSgKLQlJTiBQVUNIQVIgU3VwUmF0ZSwKLQlJTiBVQ0hBUiBTdXBSYXRlTGVuLAotCUlOIFBVQ0hBUiBFeHRSYXRlLAotCUlOIFVDSEFSIEV4dFJhdGVMZW4sCi0JT1VUIFBVQ0hBUiAqUmF0ZXMsCi0JT1VUIFBVQ0hBUiBSYXRlc0xlbiwKLQlPVVQgUFVDSEFSIHBNYXhTdXBwb3J0UmF0ZSk7Ci0KLQotQk9PTEVBTiBBcFNjYW5SdW5uaW5nKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotI2lmZGVmIERPVDExTl9EUkFGVDMKLVZPSUQgQVBPdmVybGFwcGluZ0JTU1NjYW4oCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpOwotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLQotLy8gYXBfd3BhLmMKLVZPSUQgV3BhU3RhdGVNYWNoaW5lSW5pdCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgU1RBVEVfTUFDSElORSAqU20sCi0gICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKLQotLy8gYXBfbWxtZS5jCi1WT0lEIEFQTWxtZVBlcmlvZGljRXhlYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgQVBNbG1lU2VsZWN0VHhSYXRlVGFibGUoCi0JSU4gUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOIFBNQUNfVEFCTEVfRU5UUlkJCXBFbnRyeSwKLQlJTiBQVUNIQVIJCQkJKnBwVGFibGUsCi0JSU4gUFVDSEFSCQkJCXBUYWJsZVNpemUsCi0JSU4gUFVDSEFSCQkJCXBJbml0VHhSYXRlSWR4KTsKLQotVk9JRCBBUE1sbWVTZXRUeFJhdGUoCi0JSU4gUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOIFBNQUNfVEFCTEVfRU5UUlkJCXBFbnRyeSwKLQlJTiBQUlRNUF9UWF9SQVRFX1NXSVRDSAlwVHhSYXRlKTsKLQotVk9JRCBBUE1sbWVEeW5hbWljVHhSYXRlU3dpdGNoaW5nKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBBUFF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMoCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotQk9PTEVBTiBBUE1zZ1R5cGVTdWJzdCgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBQRlJBTUVfODAyXzExIHBGcmFtZSwKLSAgICBPVVQgSU5UICpNYWNoaW5lLAotICAgIE9VVCBJTlQgKk1zZ1R5cGUpOwotCi1WT0lEIEFQUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYygKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0gICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi0KLVZPSUQgUlRNUFNldFBpZ2d5QmFjaygKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBCT09MRUFOCQkJYlBpZ2d5QmFjayk7Ci0KLVZPSUQgQVBBc2ljRXZhbHVhdGVSeEFudCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgQVBBc2ljUnhBbnRFdmFsVGltZW91dCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLS8vIGFwLmMKLQotVk9JRCBBUFN3aXRjaENoYW5uZWwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gSU5UIENoYW5uZWwpOwotCi1ORElTX1NUQVRVUyBBUEluaXRpYWxpemUoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIEFQU2h1dGRvd24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQpOwotCi1WT0lEIEFQU3RhcnRVcCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgQVBTdG9wKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCBBUENsZWFudXBQc1F1ZXVlKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQUVVFVUVfSEVBREVSICAgcFF1ZXVlKTsKLQotVk9JRCBNYWNUYWJsZVJlc2V0KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotTUFDX1RBQkxFX0VOVFJZICpNYWNUYWJsZUluc2VydEVudHJ5KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQVUNIQVIgICAgICAgICAgcEFkZHIsCi0JSU4JVUNIQVIJCQlhcGlkeCwKLQlJTiBCT09MRUFOCUNsZWFuQWxsKTsKLQotQk9PTEVBTiBNYWNUYWJsZURlbGV0ZUVudHJ5KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOIFVTSE9SVCB3Y2lkLAotICAgIElOICBQVUNIQVIgICAgICAgICAgcEFkZHIpOwotCi1NQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlTG9va3VwKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQVUNIQVIgICAgICAgICAgcEFkZHIpOwotCi1WT0lEIE1hY1RhYmxlTWFpbnRlbmFuY2UoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1VSU5UMzIgTWFjVGFibGVBc3NvY1N0YU51bUdldCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLU1BQ19UQUJMRV9FTlRSWSAqQVBTc1BzSW5xdWlyeSgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIHBBZGRyLAotICAgIE9VVCBTU1QgICAgICAgICAgICAgKlNzdCwKLSAgICBPVVQgVVNIT1JUICAgICAgICAgICpBaWQsCi0gICAgT1VUIFVDSEFSICAgICAgICAgICAqUHNNb2RlLAotICAgIE9VVCBVQ0hBUiAgICAgICAgICAgKlJhdGUpOwotCi1CT09MRUFOIEFQUHNJbmRpY2F0ZSgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIHBBZGRyLAotCUlOIFVMT05HIFdjaWQsCi0gICAgSU4gIFVDSEFSICAgICAgICAgICBQc20pOwotCi1WT0lEIEFwTG9nRXZlbnQoCi0gICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0gICAgSU4gUFVDSEFSICAgICAgICAgICBwQWRkciwKLSAgICBJTiBVU0hPUlQgICAgICAgICAgIEV2ZW50KTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotVk9JRCBBUFVwZGF0ZU9wZXJhdGlvbk1vZGUoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1WT0lEIEFQVXBkYXRlQ2FwYWJpbGl0eUFuZEVycEllKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotQk9PTEVBTiBBcENoZWNrQWNjZXNzQ29udHJvbExpc3QoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSICAgICAgICBwQWRkciwKLQlJTiBVQ0hBUiAgICAgICAgIEFwaWR4KTsKLQotVk9JRCBBcFVwZGF0ZUFjY2Vzc0NvbnRyb2xMaXN0KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFVDSEFSICAgICAgICAgQXBpZHgpOwotCi1WT0lEIEFwRW5xdWV1ZU51bGxGcmFtZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgICAgICAgIHBBZGRyLAotCUlOIFVDSEFSICAgICAgICAgVHhSYXRlLAotCUlOIFVDSEFSICAgICAgICAgUElELAotCUlOIFVDSEFSICAgICAgICAgYXBpZHgsCi0gICAgSU4gQk9PTEVBTiAgICAgICBiUW9zTnVsbCwKLSAgICBJTiBCT09MRUFOICAgICAgIGJFT1NQLAotICAgIElOIFVDSEFSICAgICAgICAgT2xkVVApOwotCi1WT0lEIEFwU2VuZEZyYW1lKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQVk9JRCAgICAgICAgICAgcEJ1ZmZlciwKLSAgICBJTiAgVUxPTkcgICAgICAgICAgIExlbmd0aCwKLSAgICBJTiAgVUNIQVIgICAgICAgICAgIFR4UmF0ZSwKLSAgICBJTiAgVUNIQVIgICAgICAgICAgIFBJRCk7Ci0KLVZPSUQgQXBFbnF1ZXVlQWNrRnJhbWUoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gUFVDSEFSICAgICAgICBwQWRkciwKLSAgICBJTiBVQ0hBUiAgICAgICAgIFR4UmF0ZSwKLQlJTiBVQ0hBUiAgICAgICAgIGFwaWR4KTsKLQotLy8gYXBfc2FuaXR5LmMKLQotCi1CT09MRUFOIFBlZXJBc3NvY1JlcUNtbVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBCT09MRUFOIGlzUmVzc29jLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0gICAgT1VUIFBVQ0hBUiBwQWRkcjIsCi0gICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAotICAgIE9VVCBVU0hPUlQgKnBMaXN0ZW5JbnRlcnZhbCwKLSAgICBPVVQgUFVDSEFSIHBBcEFkZHIsCi0gICAgT1VUIFVDSEFSICpwU3NpZExlbiwKLSAgICBPVVQgY2hhciAqU3NpZCwKLSAgICBPVVQgVUNIQVIgKnBSYXRlc0xlbiwKLSAgICBPVVQgVUNIQVIgUmF0ZXNbXSwKLSAgICBPVVQgVUNIQVIgKlJTTiwKLSAgICBPVVQgVUNIQVIgKnBSU05MZW4sCi0gICAgT1VUIEJPT0xFQU4gKnBiV21tQ2FwYWJsZSwKLSAgICBPVVQgVUxPTkcgICpwUmFsaW5rSWUsCi0jaWZkZWYgRE9UMTFOX0RSQUZUMwotICAgIE9VVCBFWFRfQ0FQX0lORk9fRUxFTUVOVAkqcEV4dENhcEluZm8sCi0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotICAgIE9VVCBVQ0hBUgkJICpwSHRDYXBhYmlsaXR5TGVuLAotICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5KTsKLQotCi1CT09MRUFOIFBlZXJEaXNhc3NvY1JlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIyLAotICAgIE9VVCBVU0hPUlQgKlJlYXNvbik7Ci0KLUJPT0xFQU4gUGVlckRlYXV0aFJlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIyLAotICAgIE9VVCBVU0hPUlQgKlJlYXNvbik7Ci0KLUJPT0xFQU4gQVBQZWVyQXV0aFNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotCU9VVCBQVUNIQVIgcEFkZHIxLAotICAgIE9VVCBQVUNIQVIgcEFkZHIyLAotICAgIE9VVCBVU0hPUlQgKkFsZywKLSAgICBPVVQgVVNIT1JUICpTZXEsCi0gICAgT1VUIFVTSE9SVCAqU3RhdHVzLAotICAgIE9VVCBDSEFSICpDaGxnVGV4dAotCSk7Ci0KLUJPT0xFQU4gQVBQZWVyUHJvYmVSZXFTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBBZGRyMiwKLSAgICBPVVQgQ0hBUiBTc2lkW10sCi0gICAgT1VUIFVDSEFSICpTc2lkTGVuKTsKLQotQk9PTEVBTiBBUFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIyLAotICAgIE9VVCBQVUNIQVIgcEJzc2lkLAotICAgIE9VVCBDSEFSIFNzaWRbXSwKLSAgICBPVVQgVUNIQVIgKlNzaWRMZW4sCi0gICAgT1VUIFVDSEFSICpCc3NUeXBlLAotICAgIE9VVCBVU0hPUlQgKkJlYWNvblBlcmlvZCwKLSAgICBPVVQgVUNIQVIgKkNoYW5uZWwsCi0gICAgT1VUIExBUkdFX0lOVEVHRVIgKlRpbWVzdGFtcCwKLSAgICBPVVQgVVNIT1JUICpDYXBhYmlsaXR5SW5mbywKLSAgICBPVVQgVUNIQVIgUmF0ZVtdLAotICAgIE9VVCBVQ0hBUiAqUmF0ZUxlbiwKLSAgICBPVVQgQk9PTEVBTiAqRXh0ZW5kZWRSYXRlSWVFeGlzdCwKLSAgICBPVVQgVUNIQVIgKkVycCk7Ci0jaWYgZGVmaW5lZChSVDMweHgpIHx8IGRlZmluZWQoUlQzMDV4KQotVk9JRCBFbmFibGVBUE1JTU9QUygKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgRGlzYWJsZUFQTUlNT1BTKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkKTsKLSNlbmRpZgotI2VuZGlmICAvLyBfX0FQX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9hcF9hcGNsaS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9hcF9hcGNsaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzYzYzM2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXBfYXBjbGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIGFwX2FwY2xpLmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBTaGlhbmcsIEZvbmNoaSAgICAwMi0xMy0yMDA3ICAgICAgY3JlYXRlZAotKi8KLQotI2lmbmRlZiBfQVBfQVBDTElfSF8KLSNkZWZpbmUgX0FQX0FQQ0xJX0hfCi0KLSNpZmRlZiBBUENMSV9TVVBQT1JUCi0KLSNpbmNsdWRlICJydG1wLmgiCi0KLSNkZWZpbmUgQVVUSF9USU1FT1VUCTMwMCAgICAgICAgIC8vIHVuaXQ6IG1zZWMKLSNkZWZpbmUgQVNTT0NfVElNRU9VVAkzMDAgICAgICAgICAvLyB1bml0OiBtc2VjCi0vLyNkZWZpbmUgSk9JTl9USU1FT1VUCTIwMDAgICAgICAgIC8vIHVuaXQ6IG1zZWMgLy8gbm90IHVzZWQgaW4gQXAtY2xpZW50IG1vZGUsIHJlbW92ZSBpdAotI2RlZmluZSBQUk9CRV9USU1FT1VUCTEwMDAgICAgICAgIC8vIHVuaXQ6IG1zZWMKLQotI2RlZmluZSBBUENMSV9ST09UX0JTU0lEX0dFVChwQWQsIHdjaWQpICgocEFkKS0+TWFjVGFiLkNvbnRlbnRbKHdjaWQpXS5BZGRyKQotI2RlZmluZSBBUENMSV9JRl9VUF9DSEVDSyhwQWQsIGlmaWR4KSAoKHBBZCktPkFwQ2ZnLkFwQ2xpVGFiWyhpZmlkeCldLmRldi0+ZmxhZ3MgJiBJRkZfVVApCi0KLS8qIHNhbml0eSBjaGVjayBmb3IgYXBpZHggKi8KLSNkZWZpbmUgQVBDTElfTVJfQVBJRFhfU0FOSVRZX0NIRUNLKGlkeCkgXAoteyBcCi0JaWYgKChpZHgpID49IE1BWF9BUENMSV9OVU0pIFwKLQl7IFwKLQkJKGlkeCkgPSAwOyBcCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzPiBFcnJvciEgYXBjbGktaWR4ID4gTUFYX0FQQ0xJX05VTSFcbiIsIF9fRlVOQ1RJT05fXykpOyBcCi0JfSBcCi19Ci0KLXR5cGVkZWYgc3RydWN0IF9BUENMSV9NTE1FX0pPSU5fUkVRX1NUUlVDVCB7Ci0JVUNIQVIJQnNzaWRbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUglTc2lkTGVuOwotCVVDSEFSCVNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKLX0gQVBDTElfTUxNRV9KT0lOX1JFUV9TVFJVQ1Q7Ci0KLXR5cGVkZWYgc3RydWN0IF9TVEFfQ1RSTF9KT0lOX1JFUV9TVFJVQ1QgewotCVVTSE9SVAlTdGF0dXM7Ci19IEFQQ0xJX0NUUkxfTVNHX1NUUlVDVCwgKlBTVEFfQ1RSTF9NU0dfU1RSVUNUOwotCi1CT09MRUFOIGlzVmFsaWRBcENsaUlmKAotCVNIT1JUIGlmSW5kZXgpOwotCi0vLwotLy8gUHJpdmF0ZSByb3V0aW5lcyBpbiBhcGNsaV9jdHJsLmMKLS8vCi1WT0lEIEFwQ2xpQ3RybFN0YXRlTWFjaGluZUluaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gU1RBVEVfTUFDSElORV9FWCAqU20sCi0JT1VUIFNUQVRFX01BQ0hJTkVfRlVOQ19FWCBUcmFuc1tdKTsKLQotLy8KLS8vIFByaXZhdGUgcm91dGluZXMgaW4gYXBjbGlfc3luYy5jCi0vLwotVk9JRCBBcENsaVN5bmNTdGF0ZU1hY2hpbmVJbml0KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFNUQVRFX01BQ0hJTkVfRVggKlNtLAotICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkNfRVggVHJhbnNbXSk7Ci0KLS8vCi0vLyBQcml2YXRlIHJvdXRpbmVzIGluIGFwY2xpX2F1dGguYwotLy8KLVZPSUQgQXBDbGlBdXRoU3RhdGVNYWNoaW5lSW5pdCgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBTVEFURV9NQUNISU5FX0VYICpTbSwKLSAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DX0VYIFRyYW5zW10pOwotCi0vLwotLy8gUHJpdmF0ZSByb3V0aW5lcyBpbiBhcGNsaV9hc3NvYy5jCi0vLwotVk9JRCBBcENsaUFzc29jU3RhdGVNYWNoaW5lSW5pdCgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBTVEFURV9NQUNISU5FX0VYICpTbSwKLSAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DX0VYIFRyYW5zW10pOwotCi1NQUNfVEFCTEVfRU5UUlkgKkFwQ2xpVGFibGVMb29rVXBCeVdjaWQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgd2NpZCwKLQlJTiBQVUNIQVIgcEFkZHJzKTsKLQotCi1CT09MRUFOIEFwQ2xpQWxsb3dUb1NlbmRQYWNrZXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gUE5ESVNfUEFDS0VUIHBQYWNrZXQsCi0JT1VUIFVDSEFSCQkqcFdjaWQpOwotCi1CT09MRUFOCQlBcENsaVZhbGlkYXRlUlNOSUUoCi0JSU4JCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCQlQRUlEX1NUUlVDVAlwRWlkX3B0ciwKLQlJTgkJVVNIT1JUCQkJZWlkX2xlbiwKLQlJTgkJVVNIT1JUCQkJaWR4KTsKLQotVk9JRCBSVDI4eHhfQXBDbGlfSW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBQTkVUX0RFVgkJCXBQaHlOZXREZXYpOwotCi1WT0lEIFJUMjh4eF9BcENsaV9DbG9zZSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgUlQyOHh4X0FwQ2xpX1JlbW92ZSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLQotVk9JRCBSVDI4eHhfQXBDbGlfUmVtb3ZlKAotCUlOIFBSVE1QX0FEQVBURVIgYWRfcCk7Ci0KLUlOVCBBcENsaUlmTG9va1VwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwQWRkcik7Ci0KLUlOVCBBcENsaV9WaXJ0dWFsSUZfT3BlbigKLQlJTglQTkVUX0RFVglkZXZfcCk7Ci0KLUlOVCBBcENsaV9WaXJ0dWFsSUZfQ2xvc2UoCi0JSU4JUE5FVF9ERVYJZGV2X3ApOwotCi1JTlQgQXBDbGlfVmlydHVhbElGX1BhY2tldFNlbmQoCi0JSU4gUE5ESVNfUEFDS0VUCQlza2JfcCwKLQlJTiBQTkVUX0RFVgkJCWRldl9wKTsKLQotSU5UIEFwQ2xpX1ZpcnR1YWxJRl9Jb2N0bCgKLQlJTiBQTkVUX0RFVgkJCQlkZXZfcCwKLQlJTiBPVVQgc3RydWN0IGlmcmVxCSpycV9wLAotCUlOIElOVCBjbWQpOwotCi0KLVZPSUQgQXBDbGlNZ3RNYWNIZWFkZXJJbml0KAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAotICAgIElOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCi0gICAgSU4gVUNIQVIgU3ViVHlwZSwKLSAgICBJTiBVQ0hBUiBUb0RzLAotICAgIElOIFBVQ0hBUiBwREEsCi0gICAgSU4gUFVDSEFSIHBCc3NpZCwKLSAgICBJTiBVU0hPUlQgaWZJbmRleCk7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLUJPT0xFQU4gQXBDbGlDaGVja0h0KAotCUlOCQlQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JCVVTSE9SVAkJCQlJZkluZGV4LAotCUlOIE9VVAlIVF9DQVBBQklMSVRZX0lFCSpwSHRDYXBhYmlsaXR5LAotCUlOIE9VVAlBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8pOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1CT09MRUFOIEFwQ2xpTGlua1VwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSIGlmSW5kZXgpOwotCi1WT0lEIEFwQ2xpTGlua0Rvd24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgaWZJbmRleCk7Ci0KLVZPSUQgQXBDbGlJZlVwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBBcENsaUlmRG93bigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgQXBDbGlJZk1vbml0b3IoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1CT09MRUFOIEFwQ2xpTXNnVHlwZVN1YnN0KAotCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKLQlJTiBQRlJBTUVfODAyXzExIHBGcmFtZSwKLQlPVVQgSU5UICpNYWNoaW5lLAotCU9VVCBJTlQgKk1zZ1R5cGUpOwotCi1CT09MRUFOIHByZUNoZWNrTXNnVHlwZVN1YnNldCgKLQlJTiBQUlRNUF9BREFQVEVSICBwQWQsCi0JSU4gUEZSQU1FXzgwMl8xMSBwRnJhbWUsCi0JT1VUIElOVCAqTWFjaGluZSwKLQlPVVQgSU5UICpNc2dUeXBlKTsKLQotQk9PTEVBTiBBcENsaVBlZXJBc3NvY1JzcFNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpwTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBBZGRyMiwKLSAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCi0gICAgT1VUIFVTSE9SVCAqcFN0YXR1cywKLSAgICBPVVQgVVNIT1JUICpwQWlkLAotICAgIE9VVCBVQ0hBUiBTdXBSYXRlW10sCi0gICAgT1VUIFVDSEFSICpwU3VwUmF0ZUxlbiwKLSAgICBPVVQgVUNIQVIgRXh0UmF0ZVtdLAotICAgIE9VVCBVQ0hBUiAqcEV4dFJhdGVMZW4sCi0gICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCi0gICAgT1VUIEFERF9IVF9JTkZPX0lFICpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLSAgICBPVVQgVUNIQVIgKnBIdENhcGFiaWxpdHlMZW4sCi0gICAgT1VUIFVDSEFSICpwQWRkSHRJbmZvTGVuLAotICAgIE9VVCBVQ0hBUiAqcE5ld0V4dENoYW5uZWxPZmZzZXQsCi0gICAgT1VUIFBFRENBX1BBUk0gcEVkY2FQYXJtLAotICAgIE9VVCBVQ0hBUiAqcENraXBGbGFnKTsKLQotVk9JRAlBcENsaVBlZXJQYWlyTXNnMUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLSAgICBJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7Ci0KLVZPSUQJQXBDbGlQZWVyUGFpck1zZzNBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0gICAgSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOwotCi1WT0lECUFwQ2xpUGVlckdyb3VwTXNnMUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLSAgICBJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7Ci0KLUJPT0xFQU4gQXBDbGlDaGVja1JTTklFKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCi0JSU4gIFVDSEFSICAgICAgICAgICBEYXRhTGVuLAotCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSwKLQlPVVQJVUNIQVIJCQkqT2Zmc2V0KTsKLQotQk9PTEVBTiBBcENsaVBhcnNlS2V5RGF0YSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBLZXlEYXRhLAotCUlOICBVQ0hBUiAgICAgICAgICAgS2V5RGF0YUxlbiwKLQlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnksCi0JSU4JVUNIQVIJCQlJZklkeCwKLQlJTglVQ0hBUgkJCWJQYWlyZXdpc2UpOwotCi1CT09MRUFOICBBcENsaUhhbmRsZVJ4QnJvYWRjYXN0RnJhbWUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnksCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLVZPSUQgQVBDbGlVcGRhdGVQYWlyd2lzZUtleVRhYmxlKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCVVDSEFSCQkJKktleVJzYywKLQlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnkpOwotCi1CT09MRUFOIEFQQ2xpVXBkYXRlU2hhcmVkS2V5VGFibGUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5LAotCUlOICBVQ0hBUiAgICAgICAgICAgS2V5TGVuLAotCUlOCVVDSEFSCQkJRGVmYXVsdEtleUlkeCwKLQlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnkpOwotCi0jZW5kaWYgLy8gQVBDTElfU1VQUE9SVCAvLwotCi0jZW5kaWYgLyogX0FQX0FQQ0xJX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FwX2F1dG9DaFNlbC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9hcF9hdXRvQ2hTZWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY4ODFmZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FwX2F1dG9DaFNlbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBhcF9hdXRvQ2hTZWwuaAotCi0gICAgQWJzdHJhY3Q6Ci0gICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotI2luY2x1ZGUgImFwX2F1dG9DaFNlbF9jbW0uaCIKLQotI2lmbmRlZiBfX0FVVE9DSFNFTEVDVF9IX18KLSNkZWZpbmUgX19BVVRPQ0hTRUxFQ1RfSF9fCi0KLSNpZmRlZiBBVVRPX0NIX1NFTEVDVF9FTkhBTkNFCi0jZGVmaW5lIEFQX0FVVE9fQ0hfU0VMKF9fUCwgX19PKQlOZXdfQVBBdXRvU2VsZWN0Q2hhbm5lbCgoX19QKSwgKF9fTykpCi0jZWxzZQotI2RlZmluZSBBUF9BVVRPX0NIX1NFTChfX1AsIF9fTykJQVBBdXRvU2VsZWN0Q2hhbm5lbCgoX19QKSwgKF9fTykpCi0jZW5kaWYKLQotCi1VTE9ORyBBdXRvQ2hCc3NJbnNlcnRFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcEJzc2lkLAotCUlOIENIQVIgU3NpZFtdLAotCUlOIFVDSEFSIFNzaWRMZW4sCi0JSU4gVUNIQVIgQ2hhbm5lbE5vLAotCUlOIFVDSEFSIEV4dENoT2Zmc2V0LAotCUlOIENIQVIgUnNzaSk7Ci0KLXZvaWQgQXV0b0NoQnNzVGFibGVJbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotdm9pZCBDaGFubmVsSW5mb0luaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi12b2lkIEF1dG9DaEJzc1RhYmxlRGVzdHJveSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLXZvaWQgQ2hhbm5lbEluZm9EZXN0cm95KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVUNIQVIgTmV3X0FQQXV0b1NlbGVjdENoYW5uZWwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gQk9PTEVBTiBPcHRpbWFsKTsKLQotVUNIQVIgQVBBdXRvU2VsZWN0Q2hhbm5lbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBCT09MRUFOIE9wdGltYWwpOwotCi0jZW5kaWYgLy8gX19BVVRPQ0hTRUxFQ1RfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FwX2F1dG9DaFNlbF9jbW0uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXBfYXV0b0NoU2VsX2NtbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDc3ZWMxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXBfYXV0b0NoU2VsX2NtbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBhcF9hdXRvQ2hTZWxfY21tLmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLQotI2lmbmRlZiBfX0FVVE9DSFNFTEVDVF9DTU1fSF9fCi0jZGVmaW5lIF9fQVVUT0NIU0VMRUNUX0NNTV9IX18KLQotI2RlZmluZSBSU1NJX1RPX0RCTV9PRkZTRVQgMTIwIC8vIFJTU0ktMTE1ID0gZEJtCi0KLQotdHlwZWRlZiBzdHJ1Y3QgewotCVVMT05HIGRpcnR5bmVzc1tNQVhfTlVNX09GX0NIQU5ORUxTKzFdOwotCVVMT05HIG1heF9yc3NpW01BWF9OVU1fT0ZfQ0hBTk5FTFMrMV07Ci0JVUxPTkcgdG90YWxfcnNzaVtNQVhfTlVNX09GX0NIQU5ORUxTKzFdOwotCVVJTlQzMiBGYWxzZUNDQVtNQVhfTlVNX09GX0NIQU5ORUxTKzFdOwotfSBDSEFOTkVMSU5GTywgKlBDSEFOTkVMSU5GTzsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCVVDSEFSIEJzc2lkW01BQ19BRERSX0xFTl07Ci0JVUNIQVIgU3NpZExlbjsKLQlDSEFSIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKLQlVQ0hBUiBDaGFubmVsOwotCVVDSEFSIEV4dENoT2Zmc2V0OwotCVVDSEFSIFJzc2k7Ci19IEJTU0VOVFJZLCAqUEJTU0VOVFJZOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JVUNIQVIgQnNzTnI7Ci0JQlNTRU5UUlkgQnNzRW50cnlbTUFYX0xFTl9PRl9CU1NfVEFCTEVdOwotfSBCU1NJTkZPLCAqUEJTU0lORk87Ci0KLSNlbmRpZiAvLyBfX0FVVE9DSFNFTEVDVF9DTU1fSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FwX2NmZy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9hcF9jZmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M5OTQyMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FwX2NmZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgYXBfY2ZnLmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0jaWZuZGVmIF9fQVBfQ0ZHX0hfXwotI2RlZmluZSBfX0FQX0NGR19IX18KLQotCi0jaW5jbHVkZSAicnRfY29uZmlnLmgiCi0KLUlOVCBSVE1QQVBQcml2SW9jdGxTZXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gc3RydWN0IGl3cmVxICpwSW9jdGxDbWRTdHIpOwotCi1JTlQgUlRNUEFQUHJpdklvY3RsU2hvdygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBzdHJ1Y3QgaXdyZXEgKnBJb2N0bENtZFN0cik7Ci0KLUlOVCBSVE1QQVBTZXRJbmZvcm1hdGlvbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglPVVQJc3RydWN0IGl3cmVxCSpycSwKLQlJTglJTlQJCQkJY21kKTsKLQotSU5UIFJUTVBBUFF1ZXJ5SW5mb3JtYXRpb24oCi0JSU4JUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCi0JSU4JT1VUCXN0cnVjdCBpd3JlcSAgICAqcnEsCi0JSU4JSU5UICAgICAgICAgICAgICAgICBjbWQpOwotCi1WT0lEIFJUTVBJb2N0bFN0YXRpc3RpY3MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gc3RydWN0IGl3cmVxICp3cnEpOwotCi1WT0lEIFJUTVBJb2N0bEdldE1hY1RhYmxlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIHN0cnVjdCBpd3JlcSAqd3JxKTsKLQotI2lmZGVmIERCRwotVk9JRCBSVE1QQVBJb2N0bEJCUCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBzdHJ1Y3QgaXdyZXEgICAgKndycSk7Ci0KLVZPSUQgUlRNUEFQSW9jdGxNQUMoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgc3RydWN0IGl3cmVxICAgICp3cnEpOwotCi1WT0lEIFJUTVBBUElvY3RsRTJQUk9NKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIHN0cnVjdCBpd3JlcSAgICAqd3JxKTsKLQotI2lmZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotVk9JRCBSVE1QQVBJb2N0bFJGKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEpOwotI2VuZGlmIC8vIFJUTVBfUkZfUldfU1VQUE9SVCAvLwotCi0jZW5kaWYgLy8gREJHIC8vCi0KLVZPSUQgUlQyOFhYX0lPQ1RMX01heFJhdGVHZXQoCi0JSU4JUlRNUF9BREFQVEVSCQkJKnBBZCwKLQlJTglQSFRUUkFOU01JVF9TRVRUSU5HCXBIdFBoeU1vZGUsCi0JT1VUCVVJTlQzMgkJCQkJKnBSYXRlKTsKLQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi1WT0lEIFJUTVBJb2N0bFF1ZXJ5QmFUYWJsZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLVZPSUQgUlRNUElvY3RsU3RhdGljV2VwQ29weSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSk7Ci0KLVZPSUQgUlRNUElvY3RsUmFkaXVzRGF0YSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBzdHJ1Y3QgaXdyZXEJCSp3cnEpOwotCi1WT0lEIFJUTVBJb2N0bEFkZFdQQUtleSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSk7Ci0KLVZPSUQgUlRNUElvY3RsQWRkUE1LSURDYWNoZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSk7Ci0KLSNlbmRpZiAvLyBfX0FQX0NGR19IX18gLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXBfaWRzLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FwX2lkcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjg3OTdmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXBfaWRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIGFwX2lkcy5oCi0KLSAgICBBYnN0cmFjdDoKLSAgICBNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi1WT0lEIFJUTVBJZHNQZXJpb2RpY0V4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotQk9PTEVBTiBSVE1QU3Bvb2ZlZE1nbXREZXRlY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gUEhFQURFUl84MDJfMTEJcEhlYWRlciwKLQlJTiBDSEFSCQkJCVJzc2kwLAotCUlOIENIQVIJCQkJUnNzaTEsCi0JSU4gQ0hBUgkJCQlSc3NpMik7Ci0KLVZPSUQgUlRNUENvbmZsaWN0U3NpZERldGVjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBQVUNIQVIJCQlwU3NpZCwKLQlJTiBVQ0hBUgkJCVNzaWRMZW4sCi0JSU4gQ0hBUgkJCQlSc3NpMCwKLQlJTiBDSEFSCQkJCVJzc2kxLAotCUlOIENIQVIJCQkJUnNzaTIpOwotCi1CT09MRUFOIFJUTVBSZXBsYXlBdHRhY2tEZXRlY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gUFVDSEFSCQkJcEFkZHIyLAotCUlOIENIQVIJCQkJUnNzaTAsCi0JSU4gQ0hBUgkJCQlSc3NpMSwKLQlJTiBDSEFSCQkJCVJzc2kyKTsKLQotVk9JRCBSVE1QVXBkYXRlU3RhTWdtdENvdW50ZXIoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVVNIT1JUCQkJdHlwZSk7Ci0KLVZPSUQgUlRNUENsZWFyQWxsSWRzQ291bnRlcigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgUlRNUElkc1N0YXJ0KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotVk9JRCBSVE1QSWRzU3RvcCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgcnRtcF9yZWFkX2lkc19mcm9tX2ZpbGUoCi0JCQlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCi0JCQljaGFyICp0bXBidWYsCi0JCQljaGFyICpidWZmZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9hcF9tYnNzLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FwX21ic3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc4NTU2Yy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FwX21ic3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgYXBfbWJzcy5oCi0KLSAgICBBYnN0cmFjdDoKLSAgICBNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaWZuZGVmIE1PRFVMRV9NQlNTCi0KLSNkZWZpbmUgTUJTU19FWFRFUk4gICAgZXh0ZXJuCi0KLSNlbHNlCi0KLSNkZWZpbmUgTUJTU19FWFRFUk4KLQotI2VuZGlmIC8vIE1PRFVMRV9NQlNTIC8vCi0KLQotLyogUHVibGljIGZ1bmN0aW9uIGxpc3QgKi8KLU1CU1NfRVhURVJOIFZPSUQgUlQyOHh4X01CU1NfSW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIGFkX3AsCi0JSU4gUE5FVF9ERVYgbWFpbl9kZXZfcCk7Ci0KLU1CU1NfRVhURVJOIFZPSUQgUlQyOHh4X01CU1NfQ2xvc2UoCi0JSU4gUFJUTVBfQURBUFRFUiBhZF9wKTsKLQotTUJTU19FWFRFUk4gVk9JRCBSVDI4eHhfTUJTU19SZW1vdmUoCi0JSU4gUFJUTVBfQURBUFRFUiBhZF9wKTsKLQotSU5UIE1CU1NfVmlydHVhbElGX09wZW4oCi0JSU4JUE5FVF9ERVYJCQlkZXZfcCk7Ci1JTlQgTUJTU19WaXJ0dWFsSUZfQ2xvc2UoCi0JSU4JUE5FVF9ERVYJCQlkZXZfcCk7Ci1JTlQgTUJTU19WaXJ0dWFsSUZfUGFja2V0U2VuZCgKLQlJTiBQTkRJU19QQUNLRVQJCQlza2JfcCwKLQlJTiBQTkVUX0RFVgkJCQlkZXZfcCk7Ci1JTlQgTUJTU19WaXJ0dWFsSUZfSW9jdGwoCi0JSU4gUE5FVF9ERVYJCQkJZGV2X3AsCi0JSU4gT1VUIHN0cnVjdCBpZnJlcQkqcnFfcCwKLQlJTiBJTlQgY21kKTsKLQotLyogRW5kIG9mIGFwX21ic3MuaCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9hcF91YXBzZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9hcF91YXBzZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDlhOWU3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXBfdWFwc2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzNiArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIGFwX3VhcHNkLmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLS8qIG9ubHkgZm9yIFVBUFNEX1RJTUlOR19SRUNPUkQgKi8KLQotLy8jZGVmaW5lIFVBUFNEX1RJTUlOR19SRUNPUkRfRlVOQwotCi0jZGVmaW5lIFVBUFNEX1RJTUlOR19SRUNPUkRfTUFYCQkJCTEwMDAKLSNkZWZpbmUgVUFQU0RfVElNSU5HX1JFQ09SRF9ESVNQTEFZX1RJTUVTCTEwCi0KLSNkZWZpbmUgVUFQU0RfVElNSU5HX1JFQ09SRF9JU1IJCQkJMQotI2RlZmluZSBVQVBTRF9USU1JTkdfUkVDT1JEX1RBU0tMRVQJCQkyCi0jZGVmaW5lIFVBUFNEX1RJTUlOR19SRUNPUkRfVFJHX1JDVgkJCTMKLSNkZWZpbmUgVUFQU0RfVElNSU5HX1JFQ09SRF9NT1ZFMlRYCQkJNAotI2RlZmluZSBVQVBTRF9USU1JTkdfUkVDT1JEX1RYMkFJUgkJCTUKLQotI2RlZmluZSBVQVBTRF9USU1JTkdfQ1RSTF9TVE9QCQkJCTAKLSNkZWZpbmUgVUFQU0RfVElNSU5HX0NUUkxfU1RBUlQJCQkJMQotI2RlZmluZSBVQVBTRF9USU1JTkdfQ1RSTF9TVVNQRU5ECQkJMgotCi0jZGVmaW5lIFVBUFNEX1RJTUVTVEFNUF9HRVQoX19wQWQsIF9fVGltZVN0YW1wKQkJCVwKLQl7CQkJCQkJCQkJCQkJCVwKLQkJVUlOVDMyIF9fQ1NSPTA7CVVJTlQ2NCBfX1ZhbHVlNjQ7CQkJCVwKLQkJUlRNUF9JT19SRUFEMzIoKF9fcEFkKSwgVFNGX1RJTUVSX0RXMCwgJl9fQ1NSKTsJXAotCQlfX1RpbWVTdGFtcCA9IChVSU5UNjQpX19DU1I7CQkJCQlcCi0JCVJUTVBfSU9fUkVBRDMyKChfX3BBZCksIFRTRl9USU1FUl9EVzEsICZfX0NTUik7CVwKLQkJX19WYWx1ZTY0ID0gKFVJTlQ2NClfX0NTUjsJCQkJCQlcCi0JCV9fVGltZVN0YW1wIHw9IChfX1ZhbHVlNjQgPDwgMzIpOwkJCQlcCi0JfQotCi0jaWZkZWYgTElOVVgKLSNkZWZpbmUgVUFQU0RfVElNRV9HRVQoX19wQWQsIF9fVGltZSkJCQkJCVwKLQkJX19UaW1lID0gamlmZmllcwotI2VuZGlmIC8vIExJTlVYIC8vCi0KLQotI2lmZGVmIFVBUFNEX1RJTUlOR19SRUNPUkRfRlVOQwotI2RlZmluZSBVQVBTRF9USU1JTkdfUkVDT1JEX1NUQVJUKCkJCQkJXAotCVVBUFNEX1RpbWluZ1JlY29yZEN0cmwoVUFQU0RfVElNSU5HX0NUUkxfU1RBUlQpOwotI2RlZmluZSBVQVBTRF9USU1JTkdfUkVDT1JEX1NUT1AoKQkJCQlcCi0JVUFQU0RfVGltaW5nUmVjb3JkQ3RybChVQVBTRF9USU1JTkdfQ1RSTF9TVE9QKTsKLSNkZWZpbmUgVUFQU0RfVElNSU5HX1JFQ09SRChfX3BBZCwgX19UeXBlKQkJXAotCVVBUFNEX1RpbWluZ1JlY29yZChfX3BBZCwgX19UeXBlKTsKLSNkZWZpbmUgVUFQU0RfVElNSU5HX1JFQ09SRF9JTkRFWChfX0xvb3BJbmRleCkJXAotCVVBUFNEX1RpbWVpbmdSZWNvcmRMb29wSW5kZXgoX19Mb29wSW5kZXgpOwotI2Vsc2UKLQotI2RlZmluZSBVQVBTRF9USU1JTkdfUkVDT1JEX1NUQVJUKCkKLSNkZWZpbmUgVUFQU0RfVElNSU5HX1JFQ09SRF9TVE9QKCkKLSNkZWZpbmUgVUFQU0RfVElNSU5HX1JFQ09SRChfX3BBZCwgX190eXBlKQotI2RlZmluZSBVQVBTRF9USU1JTkdfUkVDT1JEX0lOREVYKF9fTG9vcEluZGV4KQotI2VuZGlmIC8vIFVBUFNEX1RJTUlOR19SRUNPUkRfRlVOQyAvLwotCi0KLSNpZm5kZWYgTU9EVUxFX1dNTV9VQVBTRAotCi0jZGVmaW5lIFVBUFNEX0VYVEVSTgkJCWV4dGVybgotCi0vKiBQdWJsaWMgTWFyY28gbGlzdCAqLwotCi0vKgotCUluaXQgc29tZSBwYXJhbWV0ZXJzIGluIHBhY2tldCBzdHJ1Y3R1cmUgZm9yIFFvUyBOdWxsIGZyYW1lOwotCXB1cnBvc2U6IGlzIGZvciBtYW5hZ2VtZW50IGZyYW1lIHR4IGRvbmUgdXNlCi0qLwotI2RlZmluZSBVQVBTRF9NUl9RT1NfTlVMTF9IQU5ETEUoX19wQWQsIF9fcERhdGEsIF9fcFBhY2tldCkJCQkJCVwKLQl7CQkJCQkJCQkJCQkJCQkJCQkJXAotCQlQSEVBREVSXzgwMl8xMSBfX3BIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpKF9fcERhdGEpOwkJCQlcCi0JCU1BQ19UQUJMRV9FTlRSWSAqX19wRW50cnk7CQkJCQkJCQkJCQlcCi0JCWlmIChfX3BIZWFkZXItPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9RT1NfTlVMTCkJCQkJCQlcCi0JCXsJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCVJUTVBfU0VUX1BBQ0tFVF9RT1NfTlVMTCgoX19wUGFja2V0KSk7CQkJCQkJCVwKLQkJCV9fcEVudHJ5ID0gTWFjVGFibGVMb29rdXAoKF9fcEFkKSwgX19wSGVhZGVyLT5BZGRyMSk7CQkJXAotCQkJaWYgKF9fcEVudHJ5ICE9IE5VTEwpCQkJCQkJCQkJCQlcCi0JCQl7CQkJCQkJCQkJCQkJCQkJCVwKLQkJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRCgoX19wUGFja2V0KSwgX19wRW50cnktPkFpZCk7CQkJXAotCQkJfQkJCQkJCQkJCQkJCQkJCQlcCi0JCX0JCQkJCQkJCQkJCQkJCQkJCVwKLQkJZWxzZQkJCQkJCQkJCQkJCQkJCQlcCi0JCXsJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCVJUTVBfU0VUX1BBQ0tFVF9OT05fUU9TX05VTEwoKF9fcFBhY2tldCkpOwkJCQkJCVwKLQkJfQkJCQkJCQkJCQkJCQkJCQkJXAotCX0KLQotLyoKLQlJbml0IE1BQyBlbnRyeSBVQVBTRCBwYXJhbWV0ZXJzOwotCXB1cnBvc2U6IGluaXRpYWxpemUgVUFQU0QgUFMgcXVldWUgYW5kIGNvbnRyb2wgcGFyYW1ldGVycwotKi8KLSNkZWZpbmUgVUFQU0RfTVJfRU5UUllfSU5JVChfX3BFbnRyeSkJCQkJCQkJCQkJXAotCXsJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCVVJTlQxNglfX0lkQWM7CQkJCQkJCQkJCQkJCQlcCi0JCWZvcihfX0lkQWM9MDsgX19JZEFjPFdNTV9OVU1fT0ZfQUM7IF9fSWRBYysrKQkJCQkJCVwKLQkJCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmKF9fcEVudHJ5KS0+VUFQU0RRdWV1ZVtfX0lkQWNdKTsJCQlcCi0JCShfX3BFbnRyeSktPlVBUFNEVHhOdW0gPSAwOwkJCQkJCQkJCQkJXAotCQkoX19wRW50cnkpLT5wVUFQU0RFT1NQRnJhbWUgPSBOVUxMOwkJCQkJCQkJCVwKLQkJKF9fcEVudHJ5KS0+YkFQU0RGbGFnU1BTdGFydCA9IDA7CQkJCQkJCQkJXAotCQkoX19wRW50cnkpLT5iQVBTREZsYWdFT1NQT0sgPSAwOwkJCQkJCQkJCVwKLQkJKF9fcEVudHJ5KS0+TWF4U1BMZW5ndGggPSAwOwkJCQkJCQkJCQlcCi0JfQotCi0vKgotCVJlc2V0IE1BQyBlbnRyeSBVQVBTRCBwYXJhbWV0ZXJzOwotICAgcHVycG9zZTogY2xlYW4gYWxsIFVBUFNEIFBTIHF1ZXVlOyByZWxlYXNlIHRoZSBFT1NQIGZyYW1lIGlmIGV4aXN0czsKLQkJCXJlc2V0IGNvbnRyb2wgcGFyYW1ldGVycwotKi8KLSNkZWZpbmUgVUFQU0RfTVJfRU5UUllfUkVTRVQoX19wQWQsIF9fcEVudHJ5KQkJCQkJCQkJXAotCXsJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCU1BQ19UQUJMRV9FTlRSWSAqX19wU3RhOwkJCQkJCQkJCQkJXAotCQlVSU5UMzIgX19JZEFjOwkJCQkJCQkJCQkJCQkJXAotCQlfX3BTdGEgPSAoX19wRW50cnkpOwkJCQkJCQkJCQkJCVwKLQkJLyogY2xlYXIgYWxsIFUtQVBTRCBxdWV1ZXMgKi8JCQkJCQkJCQkJXAotCQlmb3IoX19JZEFjPTA7IF9fSWRBYzxXTU1fTlVNX09GX0FDOyBfX0lkQWMrKykJCQkJCQlcCi0JCQlBUENsZWFudXBQc1F1ZXVlKChfX3BBZCksICZfX3BTdGEtPlVBUFNEUXVldWVbX19JZEFjXSk7CQlcCi0JCS8qIGNsZWFyIEVPU1AgZnJhbWUgKi8JCQkJCQkJCQkJCQlcCi0JCV9fcFN0YS0+VUFQU0RUeE51bSA9IDA7CQkJCQkJCQkJCQkJXAotCQlpZiAoX19wU3RhLT5wVUFQU0RFT1NQRnJhbWUgIT0gTlVMTCkgewkJCQkJCQkJXAotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVCgoX19wQWQpLAkJCQkJCQkJCVwKLQkJCQkJCQlRVUVVRV9FTlRSWV9UT19QQUNLRVQoX19wU3RhLT5wVUFQU0RFT1NQRnJhbWUpLAlcCi0JCQkJCQkJTkRJU19TVEFUVVNfRkFJTFVSRSk7CQkJCQkJCVwKLQkJCV9fcFN0YS0+cFVBUFNERU9TUEZyYW1lID0gTlVMTDsgfQkJCQkJCQkJXAotCQlfX3BTdGEtPmJBUFNERmxhZ1NQU3RhcnQgPSAwOwkJCQkJCQkJCQlcCi0JCV9fcFN0YS0+YkFQU0RGbGFnRU9TUE9LID0gMDsgfQotCi0vKgotCUVuYWJsZSBvciBkaXNhYmxlIFVBUFNEIGZsYWcgaW4gV01NIGVsZW1lbnQgaW4gYmVhY29uIGZyYW1lOwotCXB1cnBvc2U6IHNldCBVQVBTRCBlbmFibGUvZGlzYWJsZSBiaXQKLSovCi0jZGVmaW5lIFVBUFNEX01SX0lFX0ZJTEwoX19Rb3NDdHJsRmllbGQsIF9fcEFkKQkJCQkJCQkJXAotCQkoX19Rb3NDdHJsRmllbGQpIHw9ICgoX19wQWQpLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlKSA/IDB4ODAgOiAweDAwOwotCi0vKgotCUNoZWNrIGlmIHdlIGRvIE5PVCBuZWVkIHRvIGNvbnRyb2wgVElNIGJpdCBmb3IgdGhlIHN0YXRpb247Ci0Jbm90ZTogd2UgY29udHJvbCBUSU0gYml0IG9ubHkgd2hlbiBhbGwgQUMgYXJlIFVBUFNEIEFDCi0qLwotI2RlZmluZSBVQVBTRF9NUl9JU19OT1RfVElNX0JJVF9ORUVERURfSEFORExFRChfX3BNYWNFbnRyeSwgX19RdWVJZHgpCQlcCi0JCShDTElFTlRfU1RBVFVTX1RFU1RfRkxBRygoX19wTWFjRW50cnkpLCBmQ0xJRU5UX1NUQVRVU19BUFNEX0NBUEFCTEUpICYmIFwKLQkJCSghKF9fcE1hY0VudHJ5KS0+YkFQU0REZWxpdmVyRW5hYmxlZFBlckFDW1FJRF9BQ19WT10gfHwJCQlcCi0JCQkhKF9fcE1hY0VudHJ5KS0+YkFQU0REZWxpdmVyRW5hYmxlZFBlckFDW1FJRF9BQ19WSV0gfHwJCQlcCi0JCQkhKF9fcE1hY0VudHJ5KS0+YkFQU0REZWxpdmVyRW5hYmxlZFBlckFDW1FJRF9BQ19CRV0gfHwJCQlcCi0JCQkhKF9fcE1hY0VudHJ5KS0+YkFQU0REZWxpdmVyRW5hYmxlZFBlckFDW1FJRF9BQ19CS10pICYmCQkJXAotCQkoX19wTWFjRW50cnkpLT5iQVBTRERlbGl2ZXJFbmFibGVkUGVyQUNbX19RdWVJZHhdKQotCi0vKiBjaGVjayBpZiB0aGUgQUMgaXMgVUFQU0QgZGVsaXZlcnktZW5hYmxlZCBBQyAqLwotI2RlZmluZSBVQVBTRF9NUl9JU19VQVBTRF9BQyhfX3BNYWNFbnRyeSwgX19BY0lkKQkJCQkJCQlcCi0JCShDTElFTlRfU1RBVFVTX1RFU1RfRkxBRygoX19wTWFjRW50cnkpLCBmQ0xJRU5UX1NUQVRVU19BUFNEX0NBUEFCTEUpICYmCVwKLQkJCSgoMCA8PSAoX19BY0lkKSkgJiYgKChfX0FjSWQpIDwgV01NX05VTV9PRl9BQykpICYmIC8qIDAgfiAzICovCVwKLQkJCShfX3BNYWNFbnRyeSktPmJBUFNERGVsaXZlckVuYWJsZWRQZXJBQ1soX19BY0lkKV0pCi0KLS8qIGNoZWNrIGlmIGFsbCBBQyBhcmUgVUFQU0QgZGVsaXZlcnktZW5hYmxlZCBBQyAqLwotI2RlZmluZSBVQVBTRF9NUl9JU19BTExfQUNfVUFQU0QoX19GbGdJc0FjdGl2ZSwgX19wTWFjRW50cnkpCQkJCVwKLQkJKCgoX19GbGdJc0FjdGl2ZSkgPT0gRkFMU0UpICYmICgoX19wTWFjRW50cnkpLT5iQVBTREFsbEFDID09IDEpKQotCi0vKiBzdXNwZW5kIFNQICovCi0jZGVmaW5lIFVBUFNEX01SX1NQX1NVU1BFTkQoX19wQWQpCQkJCQkJCQkJCQlcCi0JCShfX3BBZCktPmJBUFNERmxhZ1NQU3VzcGVuZCA9IDE7Ci0KLS8qIHJlc3VtZSBTUCAqLwotI2RlZmluZSBVQVBTRF9NUl9TUF9SRVNVTUUoX19wQWQpCQkJCQkJCQkJCQlcCi0JCShfX3BBZCktPmJBUFNERmxhZ1NQU3VzcGVuZCA9IDA7Ci0KLS8qIG1hcmsgUFMgcG9sbCBmcmFtZSBzZW50IGluIG1peCBtb2RlICovCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0vKgotCU5vdGU6Ci0JKDEpIFdoZW4gU1AgaXMgbm90IHN0YXJ0ZWQsIHRyeSB0byBtYXJrIGEgZmxhZyB0byByZWNvcmQgaWYgdGhlIGxlZ2FjeSBwcwotCQlwYWNrZXQgaXMgaGFuZGxlZCBpbiBzdGF0aXN0aWNzIGhhbmRsZXI7Ci0JKDIpIFdoZW4gU1AgaXMgc3RhcnRlZCwgaW5jcmVhc2UgdGhlIFVBUFNEIGNvdW50IG51bWJlciBmb3IgdGhlIGxlZ2FjeSBQUy4KLSovCi0jZGVmaW5lIFVBUFNEX01SX01JWF9QU19QT0xMX1JDVihfX3BBZCwgX19wTWFjRW50cnkpCQkJCQkJXAotCQlpZiAoKF9fcE1hY0VudHJ5KS0+YkFQU0RGbGFnU3BSb3VnaFVzZSA9PSAwKQkJCQkJCVwKLQkJewkJCQkJCQkJCQkJCQkJCQkJXAotCQkJaWYgKChfX3BNYWNFbnRyeSktPmJBUFNERmxhZ1NQU3RhcnQgPT0gMCkJCQkJCQlcCi0JCQl7CQkJCQkJCQkJCQkJCQkJCVwKLQkJCQlpZiAoKF9fcE1hY0VudHJ5KS0+YkFQU0RGbGFnTGVnYWN5U2VudCA9PSAxKQkJCQlcCi0JCQkJCU5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycygoX19wQWQpKTsJCQkJCQlcCi0JCQkJKF9fcE1hY0VudHJ5KS0+YkFQU0RGbGFnTGVnYWN5U2VudCA9IDE7CQkJCQkJXAotCQkJfQkJCQkJCQkJCQkJCQkJCQlcCi0JCQllbHNlCQkJCQkJCQkJCQkJCQkJXAotCQkJewkJCQkJCQkJCQkJCQkJCQlcCi0JCQkJKF9fcE1hY0VudHJ5KS0+VUFQU0RUeE51bSArKzsJCQkJCQkJCVwKLQkJCX0JCQkJCQkJCQkJCQkJCQkJXAotCQl9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotI2Vsc2UKLQotI2RlZmluZSBVQVBTRF9FWFRFUk4KLSNkZWZpbmUgVUFQU0RfUU9TX05VTExfUVVFX0lECTB4N2YKLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotLyoKLQlJbiBSVDI4NzAsIEZJRk8gY291bnRlciBpcyBmb3IgYWxsIHN0YXRpb25zLCBub3QgZm9yIHBlci1lbnRyeSwKLQlzbyB3ZSBjYW4gbm90IHVzZSBhY2N1cmF0ZSBtZXRob2QgaW4gUlQyODcwCi0qLwotCi0vKgotCU5vdGUgZm9yIFNQIEFDQ1VSQVRFIE1lY2hhbmlzbToKLQkxLiBXaGVuIHRyYWZmaWMgaXMgYnVzeSBmb3IgdGhlIFBTIHN0YXRpb24KLQkJU3RhdGlzdGljcyBGSUZPIGNvdW50ZXIgbWF5YmUgb3ZlcmZsb3cgYmVmb3JlIHdlIHJlYWQgaXQsIHNvIFVBUFNECi0JCWNvdW50aW5nIG1lY2hhbmlzbSB3aWxsIG5vdCBhY2N1cmF0ZWx5LgotCi0JCVNvbHV0aW9uOgotCQlXZSBuZWVkIHRvIGF2b2lkIHRoZSB3b3JzZSBjYXNlIHNvIHdlIHN1Z2dlc3QgYSBtYXhpbXVtIGludGVydmFsIGZvcgotCQlhIFNQIHRoYXQgdGhlIGludGVydmFsIGJldHdlZW4gbGFzdCBmcmFtZSBmcm9tIFFBUCBhbmQgZGF0YSBmcmFtZSBmcm9tCi0JCVFTVEEgaXMgbGFyZ2VyIHRoYW4gVUFQU0RfRVBUX1NQX0lOVC4KLQotCTIuIFdoZW4gdHJhZmZpYyB1c2UgQ0NLLzFNYnBzIGZyb20gUUFQCi0JCVN0YXRpc3RpY3MgRklGTyB3aWxsIG5vdCBjb3VudCB0aGUgcGFja2V0LiBUaGVyZSBhcmUgMiBjYXNlczoKLQkJKDEpIFdlIGZvcmNlIHRvIGRvd25ncmFnZSBBUlAgcmVzcG9uc2UgJiBESENQIHBhY2tldCB0byAxTWJwczsKLQkJKDIpIEFmdGVyIHJhdGUgc3dpdGNoIG1lY2hhbmlzbSwgdHggcmF0ZSBpcyBmaXhlZCB0byAxTWJwcy4KLQotCQlTb2x1dGlvbjoKLQkJVXNlIG9sZCBETUEgVUFQU0QgbWVjaGFuaXNtLgotCi0JMy4gV2hlbiBwYXJ0IG9mIEFDIHVzZXMgbGVnYWN5IFBTIG1vZGUKLQkJU3RhdGlzdGljcyBjb3VudCB3aWxsIGluY2x1ZSBwYWNrZXQgc3RhdGlzdGljcyBmb3IgbGVnYWN5IFBTIHBhY2tldHMKLQkJc28gd2UgY2FuIG5vdCBrbm93IHdoaWNoIG9uZSBpcyBVQVBTRCwgd2hpY2ggb25lIGlzIGxlZ2FjeS4KLQotCQlTb2x1dGlvbjoKLQkJQ291bmQgdGhlIGxlZ2FjeSBQUyBwYWNrZXQuCi0KLQk0LiBDaGVjayBGSUZPIHN0YXRpc3RpY3MgY291bnQgaW4gUnggRG9uZSBmdW5jdGlvbgotCQlXZSBjYW4gbm90IHRvIGNoZWNrIFRYIEZJRk8gc3RhdGlzdGljcyBjb3VudCBpbiBSeCBEb25lIGZ1bmN0aW9uIG9yCi0JCXRoZSByZWFsIHBhY2tldCB0eC9yeCBzZXF1ZW5jZSB3aWxsIGJlIGRpc2FycmFuZ2VkLgotCi0JCVNvbHV0aW9uOgotCQlTdXNwZW5kIFNQIGhhbmRsZSBiZWZvcmUgcnggZG9uZSBhbmQgcmVzdW1lIFNQIGhhbmRsZSBhZnRlciByeCBkb25lLgotKi8KLSNkZWZpbmUgVUFQU0RfU1BfQUNDVVJBVEUJCS8qIHVzZSBtb3JlIGFjY3VyYXRlIG1ldGhvZCB0byBzZW5kIEVPU1AgKi8KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotI2RlZmluZSBVQVBTRF9FUFRfU1BfSU5UCQkoMTAwMDAwLygxMDAwMDAwL09TX0haKSkgLyogMTAwbXMgKi8KLQotI2VuZGlmIC8vIE1PRFVMRV9XTU1fVUFQU0QgLy8KLQotCi0vKiBtYXggVUFQU0QgYnVmZmVyIHF1ZXVlIHNpemUgKi8KLSNkZWZpbmUgTUFYX1BBQ0tFVFNfSU5fVUFQU0RfUVVFVUUJMTYJLyogZm9yIGVhY2ggQUMgPSAxNio0ID0gNjQgKi8KLQotCi0vKiBQdWJsaWMgZnVuY3Rpb24gbGlzdCAqLwotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLQlVQVBTRCBNb2R1bGUgSW5pdC4KLQotQXJndW1lbnRzOgotCXBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi1SZXR1cm4gVmFsdWU6Ci0JTm9uZQotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVUFQU0RfRVhURVJOIFZPSUQgVUFQU0RfSW5pdCgKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQpOwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JVUFQU0QgTW9kdWxlIFJlbGVhc2UuCi0KLUFyZ3VtZW50czoKLQlwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVBUFNEX0VYVEVSTiBWT0lEIFVBUFNEX1JlbGVhc2UoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkKTsKLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotCUZyZWUgYWxsIEVPU1AgZnJhbWVzIGFuZCBjbG9zZSBhbGwgU1AuCi0KLUFyZ3VtZW50czoKLQlwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVBUFNEX0VYVEVSTiBWT0lEIFVBUFNEX0ZyZWVBbGwoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkKTsKLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotCUNsb3NlIGN1cnJlbnQgU2VydmljZSBQZXJpb2QuCi0KLUFyZ3VtZW50czoKLQlwQWQJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCXBFbnRyeQkJCUNsb3NlIHRoZSBTUCBvZiB0aGUgZW50cnkKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVBUFNEX0VYVEVSTiBWT0lEIFVBUFNEX1NQX0Nsb3NlKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKLQlJTglNQUNfVEFCTEVfRU5UUlkJCSpwRW50cnkpOwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JRGVsaXZlciBhbGwgcXVldWVkIHBhY2tldHMuCi0KLUFyZ3VtZW50czoKLQlwQWQgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JKnBFbnRyeSAgICAgICAgU1RBVElPTgotCi1SZXR1cm4gVmFsdWU6Ci0JTm9uZQotCi1Ob3RlOgotCVNNUCBwcm90ZWN0aW9uIGJ5IGNhbGxlciBmb3IgcGFja2V0IGVucXVldWUuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VQVBTRF9FWFRFUk4gVk9JRCBVQVBTRF9BbGxQYWNrZXREZWxpdmVyKAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglNQUNfVEFCTEVfRU5UUlkJCSpwRW50cnkpOwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JUGFyc2UgdGhlIFVBUFNEIGZpZWxkIGluIFdNTSBlbGVtZW50IGluIChyZSlhc3NvY2lhdGlvbiByZXF1ZXN0IGZyYW1lLgotCi1Bcmd1bWVudHM6Ci0JcEFkCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkqcEVudHJ5CQkJU1RBVElPTgotCSpwRWxtCQkJUW9TIGluZm9ybWF0aW9uIGZpZWxkCi0KLVJldHVybiBWYWx1ZToKLQlOb25lCi0KLU5vdGU6Ci0JTm8gcHJvdGVjdGlvbiBpcyBuZWVkZWQuCi0KLQkxLiBBc3NvY2lhdGlvbiAtPiBUU1BFQzoKLQkJdXNlIHN0YXRpYyBVQVBTRCBzZXR0aW5ncyBpbiBBc3NvY2lhdGlvbgotCQl1cGRhdGUgVUFQU0Qgc2V0dGluZ3MgaW4gVFNQRUMKLQotCTIuIEFzc29jaWF0aW9uIC0+IFRTUEVDKDExcikgLT4gUmVhc3NvY2lhdGlvbjoKLQkJdXBkYXRlIFVBUFNEIHNldHRpbmdzIGluIFRTUEVDCi0JCWJhY2t1cCBzdGF0aWMgVUFQU0Qgc2V0dGluZ3MgaW4gUmVhc3NvY2lhdGlvbgotCi0JMy4gQXNzb2NpYXRpb24gLT4gUmVhc3NvY2lhdGlvbjoKLQkJdXBkYXRlIFVBUFNEIHNldHRpbmdzIGluIFRTUEVDCi0JCWJhY2t1cCBzdGF0aWMgVUFQU0Qgc2V0dGluZ3MgaW4gUmVhc3NvY2lhdGlvbgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVUFQU0RfRVhURVJOIFZPSUQgVUFQU0RfQXNzb2NQYXJzZSgKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JTUFDX1RBQkxFX0VOVFJZCQkqcEVudHJ5LAotCUlOCVVDSEFSCQkJCSpwRWxtKTsKLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotCUVucXVldWUgYSBVQVBTRCBwYWNrZXQuCi0KLUFyZ3VtZW50czoKLQlwQWQJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCSpwRW50cnkJCQlTVEFUSU9OCi0JcFBhY2tldAkJCVVBUFNEIGRubGluayBwYWNrZXQKLQlJZEFjCQkJVUFQU0QgQUMgSUQgKDAgfiAzKQotCi1SZXR1cm4gVmFsdWU6Ci0JTm9uZQotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVUFQU0RfRVhURVJOIFZPSUQgVUFQU0RfUGFja2V0RW5xdWV1ZSgKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JTUFDX1RBQkxFX0VOVFJZCQkqcEVudHJ5LAotCUlOCVBORElTX1BBQ0tFVAkJcFBhY2tldCwKLQlJTglVSU5UMzIJCQkJSWRBYyk7Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLQlIYW5kbGUgUW9TIE51bGwgRnJhbWUgVHggRG9uZSBvciBNYW5hZ2VtZW50IFR4IERvbmUgaW50ZXJydXB0LgotCi1Bcmd1bWVudHM6Ci0JcEFkCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQlwUGFja2V0CQkJQ29tcGxldGVkIFRYIHBhY2tldAotCXBEc3RNYWMJCQlEZXN0aW5hdGVkIE1BQyBhZGRyZXNzCi0KLVJldHVybiBWYWx1ZToKLQlOb25lCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VQVBTRF9FWFRFUk4gVk9JRCBVQVBTRF9Rb1NOdWxsVHhNZ210VHhEb25lSGFuZGxlKAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJCXBQYWNrZXQsCi0JSU4JVUNIQVIJCQkJKnBEc3RNYWMpOwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JTWFpbnRlbmFuY2Ugb3VyIFVBUFNEIFBTIHF1ZXVlLiAgUmVsZWFzZSBhbGwgcXVldWVkIHBhY2tldCBpZiB0aW1lb3V0LgotCi1Bcmd1bWVudHM6Ci0JcEFkCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkqcEVudHJ5CQkJU1RBVElPTgotCi1SZXR1cm4gVmFsdWU6Ci0JTm9uZQotCi1Ob3RlOgotCUlmIGluIFJUMjg3MCwgcEVudHJ5IGNhbiBub3QgYmUgcmVtb3ZlZCBkdXJpbmcgVUFQU0RfUXVldWVNYWludGVuYW5jZSgpCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VQVBTRF9FWFRFUk4gVk9JRCBVQVBTRF9RdWV1ZU1haW50ZW5hbmNlKAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglNQUNfVEFCTEVfRU5UUlkJCSpwRW50cnkpOwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JQ2xvc2UgU1AgaW4gVHggRG9uZSwgbm90IFR4IERNQSBEb25lLgotCi1Bcmd1bWVudHM6Ci0JcEFkICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCXBFbnRyeQkJCWRlc3RpbmF0aW9uIGVudHJ5Ci0JRmxnU3VjY2VzcwkJMDp0eCBzdWNjZXNzLCAxOnR4IGZhaWwKLQotUmV0dXJuIFZhbHVlOgotICAgIE5vbmUKLQotTm90ZToKLQlGb3IgUlQyOHh4IHNlcmllcywgZm9yIHBhY2tldElEPTAgb3IgbXVsdGljYXN0IGZyYW1lLCBubyBzdGF0aXN0aWNzCi0JY291bnQgY2FuIGJlIGdvdCwgZXg6IEFSUCByZXNwb25zZSBvciBESENQIHBhY2tldHMsIHdlIHdpbGwgdXNlCi0JbG93IHJhdGUgdG8gc2V0IChDQ0ssIE1DUz0wPXBhY2tldElEKS4KLQlTbyBTUCB3aWxsIG5vdCBiZSBjbG9zZSB1bnRpbCBVQVBTRF9FUFRfU1BfSU5UIHRpbWVvdXQuCi0KLQlTbyBpZiB0aGUgdHggcmF0ZSBpcyAxTWJwcyBmb3IgYSBlbnRyeSwgd2Ugd2lsbCB1c2UgRE1BIGRvbmUsIG5vdAotCXVzZSBVQVBTRF9TUF9BVUVfSGFuZGxlKCkuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VQVBTRF9FWFRFUk4gVk9JRCBVQVBTRF9TUF9BVUVfSGFuZGxlKAotCUlOIFJUTVBfQURBUFRFUgkJKnBBZCwKLSAgICBJTiBNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKLQlJTiBVQ0hBUgkJCUZsZ1N1Y2Nlc3MpOwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JQ2xvc2UgY3VycmVudCBTZXJ2aWNlIFBlcmlvZC4KLQotQXJndW1lbnRzOgotCXBBZAkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLVJldHVybiBWYWx1ZToKLQlOb25lCi0KLU5vdGU6Ci0JV2hlbiB3ZSByZWNlaXZlIEVPU1AgZnJhbWUgdHggZG9uZSBpbnRlcnJ1cHQgYW5kIGEgdXBsaW5rIHBhY2tldAotCWZyb20gdGhlIHN0YXRpb24gc2ltdWx0YW5lb3VzbHksIHdlIHdpbGwgcmVnYXJkIGl0IGFzIGEgbmV3IHRyaWdnZXIKLQlmcmFtZSBiZWNhdXNlIHRoZSBwYWNrZXQgaXMgcmVjZWl2ZWQgd2hlbiBFT1NQIGZyYW1lIHR4IGRvbmUgaW50ZXJydXB0LgotCi0JV2UgY2FuIG5vdCBzdXJlIHRoZSB1cGxpbmsgcGFja2V0IGlzIHNlbnQgYWZ0ZXIgb2xkIFNQIG9yIGluIHRoZSBvbGQgU1AuCi0JU28gd2UgbXVzdCBjbG9zZSB0aGUgb2xkIFNQIGluIHJlY2VpdmUgZG9uZSBJU1IgdG8gYXZvaWQgdGhlIHByb2JsZW0uCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VQVBTRF9FWFRFUk4gVk9JRCBVQVBTRF9TUF9DbG9zZUluUlZEb25lKAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCk7Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLQlDaGVjayBpZiB3ZSBuZWVkIHRvIGNsb3NlIGN1cnJlbnQgU1AuCi0KLUFyZ3VtZW50czoKLQlwQWQJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCXBQYWNrZXQJCQlDb21wbGV0ZWQgVFggcGFja2V0Ci0JcERzdE1hYwkJCURlc3RpbmF0ZWQgTUFDIGFkZHJlc3MKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLQkxLiBXZSBuZWVkIHRvIGNhbGwgdGhlIGZ1bmN0aW9uIGluIFR4RG9uZSBJU1IuCi0JMi4gU01QIHByb3RlY3Rpb24gYnkgY2FsbGVyIGZvciBwYWNrZXQgZW5xdWV1ZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVBUFNEX0VYVEVSTiBWT0lEIFVBUFNEX1NQX1BhY2tldENoZWNrKAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJCXBQYWNrZXQsCi0JSU4JVUNIQVIJCQkJKnBEc3RNYWMpOwotCi0KLSNpZmRlZiBVQVBTRF9USU1JTkdfUkVDT1JEX0ZVTkMKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JRW5hYmxlL0Rpc2FibGUgVGltaW5nIFJlY29yZCBGdW5jdGlvbi4KLQotQXJndW1lbnRzOgotCXBBZAkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JRmxhZwkJCTEgKEVuYWJsZSkgb3IgMCAoRGlzYWJsZSkKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVBUFNEX0VYVEVSTiBWT0lEIFVBUFNEX1RpbWluZ1JlY29yZEN0cmwoCi0JSU4JVUlOVDMyCQkJCUZsYWcpOwotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotCVJlY29yZCBzb21lIHRpbWluZ3MuCi0KLUFyZ3VtZW50czoKLQlwQWQJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCVR5cGUJCQlUaGUgdGltaW5nIGlzIGZvciB3aGF0IHR5cGUKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLQlVQVBTRF9USU1JTkdfUkVDT1JEX0lTUgotCVVBUFNEX1RJTUlOR19SRUNPUkRfVEFTS0xFVAotCVVBUFNEX1RJTUlOR19SRUNPUkRfVFJHX1JDVgotCVVBUFNEX1RJTUlOR19SRUNPUkRfTU9WRTJUWAotCVVBUFNEX1RJTUlOR19SRUNPUkRfVFgyQUlSCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VQVBTRF9FWFRFUk4gVk9JRCBVQVBTRF9UaW1pbmdSZWNvcmQoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCVVJTlQzMgkJCQlUeXBlKTsKLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLQlSZWNvcmQgdGhlIGxvb3AgaW5kZXggZm9yIHJlY2VpdmVkIHBhY2tldCBoYW5kbGUuCi0KLUFyZ3VtZW50czoKLQlwQWQJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCUxvb3BJbmRleAkJVGhlIFJ4UHJvY2Vzc2VkIGluIEFQUnhEb25lSW50ZXJydXB0SGFuZGxlKCkKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVBUFNEX0VYVEVSTiBWT0lEIFVBUFNEX1RpbWVpbmdSZWNvcmRMb29wSW5kZXgoCi0JSU4JVUlOVDMyCQkJCUxvb3BJbmRleCk7Ci0jZW5kaWYgLy8gVUFQU0RfVElNSU5HX1JFQ09SRF9GVU5DIC8vCi0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLQlIYW5kbGUgVUFQU0QgVHJpZ2dlciBGcmFtZS4KLQotQXJndW1lbnRzOgotCXBBZAkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JKnBFbnRyeQkJCXRoZSBzb3VyY2UgU1RBVElPTgotCVVwT2ZGcmFtZQkJdGhlIFVQIG9mIHRoZSB0cmlnZ2VyIGZyYW1lCi0KLVJldHVybiBWYWx1ZToKLQlOb25lCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VQVBTRF9FWFRFUk4gVk9JRCBVQVBTRF9UcmlnZ2VyRnJhbWVIYW5kbGUoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCU1BQ19UQUJMRV9FTlRSWQkJKnBFbnRyeSwKLQlJTglVQ0hBUgkJCQlVcE9mRnJhbWUpOwotCi0KLQotLyogRW5kIG9mIGFwX3VhcHNkLmggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXBfd2RzLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FwX3dkcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmNiMTA3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXBfd2RzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBhcF9jZmcuaAotCi0gICAgQWJzdHJhY3Q6Ci0gICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEZvbmNoaSAgICAwMi0xMy0yMDA3ICAgICAgY3JlYXRlZAotKi8KLQotI2lmbmRlZiBfQVBfV0RTX0hfCi0jZGVmaW5lIF9BUF9XRFNfSF8KLQotI2RlZmluZSBXRFNfRU5UUllfUkVUUllfSU5URVJWQUwJKDEwMCAqIE9TX0haIC8gMTAwMCkKLQotCi1zdGF0aWMgaW5saW5lIEJPT0xFQU4gV0RTX0lGX1VQX0NIRUNLKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVTE9ORyBpZmlkeCkKLXsKLQlpZiAoKHBBZC0+ZmxnX3dkc19pbml0ICE9IFRSVUUpIHx8Ci0JCShpZmlkeCA+PSBNQVhfV0RTX0VOVFJZKSkKLQkJcmV0dXJuIEZBTFNFOwotCi0vLwlpZiAocEFkLT5XZHNUYWIuV2RzRW50cnlbaWZpZHhdLmRldi0+ZmxhZ3MgJiBJRkZfVVApCi0vLyBQYXRjaCBmb3Igd2RzICx3aGVuIGRpcnZlciBjYWxsIGFwbWxtZXBlcmlvZCA9PiBBUE1sbWVEeW5hbWljVHhSYXRlU3dpdGNoaW5nIGNoZWNrIGlmIHdkcyBkZXZpY2UgcmVhZHkKLWlmICgocEFkLT5XZHNUYWIuV2RzRW50cnlbaWZpZHhdLmRldiAhPSBOVUxMKSAmJiAocEFkLT5XZHNUYWIuV2RzRW50cnlbaWZpZHhdLmRldi0+ZmxhZ3MgJiBJRkZfVVApKQotCQlyZXR1cm4gVFJVRTsKLQotCXJldHVybiBGQUxTRTsKLX0KLQotTE9ORyBXZHNFbnRyeUFsbG9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwQWRkcik7Ci0KLVZPSUQgV2RzRW50cnlEZWwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBBZGRyKTsKLQotTUFDX1RBQkxFX0VOVFJZICpNYWNUYWJsZUluc2VydFdEU0VudHJ5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgcEFkZHIsCi0JVUlOVCBXZHNUYWJJZHgpOwotCi1CT09MRUFOIE1hY1RhYmxlRGVsZXRlV0RTRW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIHdjaWQsCi0JSU4gUFVDSEFSIHBBZGRyKTsKLQotCi1CT09MRUFOIEFwV2RzQWxsb3dUb1NlbmRQYWNrZXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gUE5ESVNfUEFDS0VUIHBQYWNrZXQsCi0JT1VUCVVDSEFSCQkqcFdjaWQpOwotCi1NQUNfVEFCTEVfRU5UUlkgKldkc1RhYmxlTG9va3VwQnlXY2lkKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOIFVDSEFSIHdjaWQsCi0JSU4gUFVDSEFSIHBBZGRyLAotCUlOIEJPT0xFQU4gYlJlc2V0SWRlbENvdW50KTsKLQotTUFDX1RBQkxFX0VOVFJZICpXZHNUYWJsZUxvb2t1cCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIHBBZGRyLAotCUlOIEJPT0xFQU4gYlJlc2V0SWRlbENvdW50KTsKLQotTUFDX1RBQkxFX0VOVFJZICpGaW5kV2RzRW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUNIQVIJCQlXY2lkLAotCUlOIFBVQ0hBUgkJCXBBZGRyLAotCUlOIFVJTlQzMgkJCVBoeU1vZGUpOwotCi1WT0lEIFdkc1RhYmxlTWFpbnRlbmFuY2UoCi0gICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQpOwotCi1WT0lEIFJUMjh4eF9XRFNfSW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQTkVUX0RFViBuZXRfZGV2KTsKLQotVk9JRCBSVDI4eHhfV0RTX0Nsb3NlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBSVDI4eHhfV0RTX1JlbW92ZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgV2RzRG93bigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgQXNpY1VwZGF0ZVdkc1J4V0NJRFRhYmxlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBBc2ljVXBkYXRlV2RzRW5jcnlwdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiB3Y2lkKTsKLQotVk9JRCBXZHNQZWVyQmVhY29uUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSwKLQlJTiBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCi0JSU4gVUNIQVIgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcywKLQlJTiBVQ0hBUiBNYXhTdXBwb3J0ZWRSYXRlTGVuLAotCUlOIEJPT0xFQU4gYldtbUNhcGFibGUsCi0JSU4gVUxPTkcgQ2xpZW50UmFsaW5rSWUsCi0JSU4gSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKLQlJTiBVQ0hBUiBIdENhcGFiaWxpdHlMZW4pOwotCi1WT0lEIEFQV2RzSW5pdGlhbGl6ZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLUlOVAlTaG93X1dkc1RhYmxlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLVZPSUQgcnRtcF9yZWFkX3dkc19mcm9tX2ZpbGUoCi0JCQlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCi0JCQlQU1RSSU5HIHRtcGJ1ZiwKLQkJCVBTVFJJTkcgYnVmZmVyKTsKLQotVk9JRCBXZHNQcmVwYXJlV2VwS2V5RnJvbU1haW5Cc3MoCi0JSU4gIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotSU5UIFdkc1ZpcnR1YWxJRlNlbmRQYWNrZXRzKAotCUlOIFBORElTX1BBQ0tFVCBwU2tiLAotCUlOIFBORVRfREVWIGRldik7Ci0KLUlOVCBXZHNWaXJ0dWFsSUZfb3BlbigKLQlJTiBQTkVUX0RFViBkZXYpOwotCi1JTlQgV2RzVmlydHVhbElGX2Nsb3NlKAotCUlOIFBORVRfREVWIGRldik7Ci0KLUlOVCBXZHNWaXJ0dWFsSUZfaW9jdGwoCi0JSU4gUE5FVF9ERVYgbmV0X2RldiwKLQlJTiBPVVQgc3RydWN0IGlmcmVxICpycSwKLQlJTiBJTlQgY21kKTsKLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlDaGVjayB0aGUgV0RTIEVudHJ5IGlzIHZhbGlkIG9yIG5vdC4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1zdGF0aWMgaW5saW5lIEJPT0xFQU4gVmFsaWRXZHNFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiBXZHNJbmRleCkKLXsKLQlCT09MRUFOIHJlc3VsdDsKLQlQTUFDX1RBQkxFX0VOVFJZIHBNYWNFbnRyeTsKLQotCWRvCi0JewotCQlpZiAoV2RzSW5kZXggPj0gTUFYX1dEU19FTlRSWSkKLQkJewotCQkJcmVzdWx0ID0gRkFMU0U7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChwQWQtPldkc1RhYi5XZHNFbnRyeVtXZHNJbmRleF0uVmFsaWQgIT0gVFJVRSkKLQkJewotCQkJcmVzdWx0ID0gRkFMU0U7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmICgocEFkLT5XZHNUYWIuV2RzRW50cnlbV2RzSW5kZXhdLk1hY1RhYk1hdGNoV0NJRD09MCkKLQkJCXx8IChwQWQtPldkc1RhYi5XZHNFbnRyeVtXZHNJbmRleF0uTWFjVGFiTWF0Y2hXQ0lEID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKSkKLQkJewotCQkJcmVzdWx0ID0gRkFMU0U7Ci0JCQlicmVhazsKLQkJfQotCi0JCXBNYWNFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BBZC0+V2RzVGFiLldkc0VudHJ5W1dkc0luZGV4XS5NYWNUYWJNYXRjaFdDSURdOwotCQlpZiAocE1hY0VudHJ5LT5WYWxpZEFzV0RTICE9IFRSVUUpCi0JCXsKLQkJCXJlc3VsdCA9IEZBTFNFOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXN1bHQgPSBUUlVFOwotCX0gd2hpbGUoRkFMU0UpOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLSNlbmRpZiAvLyBfQVBfV0RTX0hfIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NoaXBzL3J0MzA5MC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jaGlwcy9ydDMwOTAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjNTQ5ZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NoaXBzL3J0MzA5MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JcnQzMDkwLmMKLQotCUFic3RyYWN0OgotCVNwZWNpZmljIGZ1bmNpdG9ucyBhbmQgdmFyaWFibGVzIGZvciBSVDMwNzAKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0JLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaWZkZWYgUlQzMDkwCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi0jaWZuZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotI2Vycm9yICJZb3UgU2hvdWxkIEVuYWJsZSBjb21waWxlIGZsYWcgUlRNUF9SRl9SV19TVVBQT1JUIGZvciB0aGlzIGNoaXAiCi0jZW5kaWYgLy8gUlRNUF9SRl9SV19TVVBQT1JUIC8vCi0KLQotVk9JRCBOSUNJbml0UlQzMDkwUkZSZWdpc3RlcnMoSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JCUlOVCBpOwotCS8vIERyaXZlciBtdXN0IHJlYWQgRUVQUk9NIHRvIGdldCBSZkljVHlwZSBiZWZvcmUgaW5pdGlhbCBSRiByZWdpc3RlcnMKLQkvLyBJbml0aWFsaXplIFJGIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKLQlpZiAoSVNfUlQzMDkwKHBBZCkpCi0JewotCQkvLyBJbml0IFJGIGNhbGlicmF0aW9uCi0JCS8vIERyaXZlciBzaG91bGQgdG9nZ2xlIFJGIFIzMCBiaXQ3IGJlZm9yZSBpbml0IFJGIHJlZ2lzdGVycwotCQlVSU5UMzIgUmZSZWcgPSAwLCBkYXRhOwotCi0JCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjMwLCAoUFVDSEFSKSZSZlJlZyk7Ci0JCVJmUmVnIHw9IDB4ODA7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKFVDSEFSKVJmUmVnKTsKLQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQkJUmZSZWcgJj0gMHg3RjsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMwLCAoVUNIQVIpUmZSZWcpOwotCi0JCS8vIGluaXQgUjI0LCBSMzEKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCAweDBGKTsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCAweDBGKTsKLQotCQkvLyBSVDMwOXggdmVyc2lvbiBFIGhhcyBmaXhlZCB0aGlzIGlzc3VlCi0JCWlmICgocEFkLT5OaWNDb25maWcyLmZpZWxkLkRBQ1Rlc3RCaXQgPT0gMSkgJiYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjExKSkKLQkJewotCQkJLy8gcGF0Y2ggdHggRVZNIGlzc3VlIHRlbXBvcmFyaWx5Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIExET19DRkcwLCAmZGF0YSk7Ci0JCQlkYXRhID0gKChkYXRhICYgMHhFMEZGRkZGRikgfCAweDBEMDAwMDAwKTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIExET19DRkcwLCBkYXRhKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTERPX0NGRzAsICZkYXRhKTsKLQkJCWRhdGEgPSAoKGRhdGEgJiAweEUwRkZGRkZGKSB8IDB4MDEwMDAwMDApOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTERPX0NGRzAsIGRhdGEpOwotCQl9Ci0KLQkJLy8gcGF0Y2ggTE5BX1BFX0cxIGZhaWxlZCBpc3N1ZQotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEdQSU9fU1dJVENILCAmZGF0YSk7Ci0JCWRhdGEgJj0gfigweDIwKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgR1BJT19TV0lUQ0gsIGRhdGEpOwotCi0JCS8vIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQotCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1JGX1JFR19QQVJNUzsgaSsrKQotCQl7Ci0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSVDMweHhfUkZSZWdUYWJsZVtpXS5SZWdpc3RlciwgUlQzMHh4X1JGUmVnVGFibGVbaV0uVmFsdWUpOwotCQl9Ci0KLQkJLy8gRHJpdmVyIHNob3VsZCBzZXQgUkYgUjYgYml0NiBvbiBiZWZvcmUgY2FsaWJyYXRpb24KLQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDYsIChQVUNIQVIpJlJmUmVnKTsKLQkJUmZSZWcgfD0gMHg0MDsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA2LCAoVUNIQVIpUmZSZWcpOwotCi0JCS8vRm9yIFJGIGZpbHRlciBDYWxpYnJhdGlvbgotCQlSVE1QRmlsdGVyQ2FsaWJyYXRpb24ocEFkKTsKLQotCQkvLyBJbml0aWFsaXplIFJGIFIyNyByZWdpc3Rlciwgc2V0IFJGIFIyNyBtdXN0IGJlIGJlaGluZCBSVE1QRmlsdGVyQ2FsaWJyYXRpb24oKQotCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMTEpCi0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsIDB4Myk7Ci0KLQkJLy8gc2V0IGxlZCBvcGVuIGRyYWluIGVuYWJsZQotCQlSVE1QX0lPX1JFQUQzMihwQWQsIE9QVF8xNCwgJmRhdGEpOwotCQlkYXRhIHw9IDB4MDE7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE9QVF8xNCwgZGF0YSk7Ci0KLQkJLy8gc2V0IGRlZmF1bHQgYW50ZW5uYSBhcyBtYWluCi0JCWlmIChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMCkKLQkJCUFzaWNTZXRSeEFudChwQWQsIHBBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQpOwotCi0JCS8vIGFkZCBieSBqb2hubGksIFJGIHBvd2VyIHNlcXVlbmNlIHNldHVwLCBsb2FkIFJGIG5vcm1hbCBvcGVyYXRpb24tbW9kZSBzZXR1cAotCQlSVDMweHhMb2FkUkZOb3JtYWxNb2RlU2V0dXAocEFkKTsKLQl9Ci0KLX0KLQotI2VuZGlmIC8vIFJUMzA5MCAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jaGlwcy9ydDMweHguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY2hpcHMvcnQzMHh4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljOGFlMDAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jaGlwcy9ydDMweHguYworKysgL2Rldi9udWxsCkBAIC0xLDUyNSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXJ0MzB4eC5jCi0KLQlBYnN0cmFjdDoKLQlTcGVjaWZpYyBmdW5jaXRvbnMgYW5kIHZhcmlhYmxlcyBmb3IgUlQzMHh4LgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLQktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLQotI2lmZGVmIFJUMzB4eAotCi0KLSNpZm5kZWYgUlRNUF9SRl9SV19TVVBQT1JUCi0jZXJyb3IgIllvdSBTaG91bGQgRW5hYmxlIGNvbXBpbGUgZmxhZyBSVE1QX1JGX1JXX1NVUFBPUlQgZm9yIHRoaXMgY2hpcCIKLSNlbmRpZiAvLyBSVE1QX1JGX1JXX1NVUFBPUlQgLy8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLS8vCi0vLyBSRiByZWdpc3RlciBpbml0aWFsaXphdGlvbiBzZXQKLS8vCi1SRUdfUEFJUiAgIFJUMzB4eF9SRlJlZ1RhYmxlW10gPSB7Ci0gICAgICAgIHtSRl9SMDQsICAgICAgICAgIDB4NDB9LAotICAgICAgICB7UkZfUjA1LCAgICAgICAgICAweDAzfSwKLSAgICAgICAge1JGX1IwNiwgICAgICAgICAgMHgwMn0sCi0gICAgICAgIHtSRl9SMDcsICAgICAgICAgIDB4NzB9LAotICAgICAgICB7UkZfUjA5LCAgICAgICAgICAweDBGfSwKLSAgICAgICAge1JGX1IxMCwgICAgICAgICAgMHg0MX0sCi0gICAgICAgIHtSRl9SMTEsICAgICAgICAgIDB4MjF9LAotICAgICAgICB7UkZfUjEyLCAgICAgICAgICAweDdCfSwKLSAgICAgICAge1JGX1IxNCwgICAgICAgICAgMHg5MH0sCi0gICAgICAgIHtSRl9SMTUsICAgICAgICAgIDB4NTh9LAotICAgICAgICB7UkZfUjE2LCAgICAgICAgICAweEIzfSwKLSAgICAgICAge1JGX1IxNywgICAgICAgICAgMHg5Mn0sCi0gICAgICAgIHtSRl9SMTgsICAgICAgICAgIDB4MkN9LAotICAgICAgICB7UkZfUjE5LCAgICAgICAgICAweDAyfSwKLSAgICAgICAge1JGX1IyMCwgICAgICAgICAgMHhCQX0sCi0gICAgICAgIHtSRl9SMjEsICAgICAgICAgIDB4REJ9LAotICAgICAgICB7UkZfUjI0LCAgICAgICAgICAweDE2fSwKLSAgICAgICAge1JGX1IyNSwgICAgICAgICAgMHgwMX0sCi0gICAgICAgIHtSRl9SMjksICAgICAgICAgIDB4MUZ9LAotfTsKLQotVUNIQVIgTlVNX1JGX1JFR19QQVJNUyA9IChzaXplb2YoUlQzMHh4X1JGUmVnVGFibGUpIC8gc2l6ZW9mKFJFR19QQUlSKSk7Ci0KLQotCi0vLyBBbnRlbm5hIGRpdmVzaXR5IHVzZSBHUElPMyBhbmQgRUVTSyBwaW4gZm9yIGNvbnRyb2wKLS8vIEFudGVubmEgYW5kIEVFUFJPTSBhY2Nlc3MgYXJlIGJvdGggdXNpbmcgRUVTSyBwaW4sCi0vLyBUaGVyZWZvciB3ZSBzaG91bGQgYXZvaWQgYWNjZXNzaW5nIEVFU0sgYXQgdGhlIHNhbWUgdGltZQotLy8gVGhlbiByZXN0b3JlIGFudGVubmEgYWZ0ZXIgRUVQUk9NIGFjY2VzcwotLy8gVGhlIG9yaWdpbmFsIG5hbWUgb2YgdGhpcyBmdW5jdGlvbiBpcyBBc2ljU2V0UnhBbnQoKSwgbm93IGNoYW5nZSB0bwotLy9WT0lEIEFzaWNTZXRSeEFudCgKLVZPSUQgUlQzMHh4U2V0UnhBbnQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUNIQVIJCQlBbnQpCi17Ci0JVUlOVDMyCVZhbHVlOwotCVVJTlQzMgl4OwotCi0JaWYgKChwQWQtPkVlcHJvbUFjY2VzcykgfHwKLQkJKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpCXx8Ci0JCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpCXx8Ci0JCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkgfHwKLQkJKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCi0JewotCQlyZXR1cm47Ci0JfQotCi0JLy8gdGhlIGFudGVubmEgc2VsZWN0aW9uIGlzIHRocm91Z2ggZmlybXdhcmUgYW5kIE1BQyByZWdpc3RlcihHUElPMykKLQlpZiAoQW50ID09IDApCi0JewotCQkvLyBNYWluIGFudGVubmEKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7Ci0JCXggfD0gKEVFU0spOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKLSNlbHNlCi0JCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg3MywgMHhGRiwgMHgxLCAweDApOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgR1BJT19DVFJMX0NGRywgJlZhbHVlKTsKLQkJVmFsdWUgJj0gfigweDA4MDgpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBHUElPX0NUUkxfQ0ZHLCBWYWx1ZSk7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJBc2ljU2V0UnhBbnQsIHN3aXRjaCB0byBtYWluIGFudGVubmFcbiIpKTsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gQXV4IGFudGVubmEKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7Ci0JCXggJj0gfihFRVNLKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7Ci0jZWxzZQotCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NzMsIDB4RkYsIDB4MCwgMHgwKTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBHUElPX0NUUkxfQ0ZHLCAmVmFsdWUpOwotCQlWYWx1ZSAmPSB+KDB4MDgwOCk7Ci0JCVZhbHVlIHw9IDB4MDg7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEdQSU9fQ1RSTF9DRkcsIFZhbHVlKTsKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNTZXRSeEFudCwgc3dpdGNoIHRvIGF1eCBhbnRlbm5hXG4iKSk7Ci0JfQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlGb3IgUkYgZmlsdGVyIGNhbGlicmF0aW9uIHB1cnBvc2UKLQotCUFyZ3VtZW50czoKLQkJcEFkICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUTVBGaWx0ZXJDYWxpYnJhdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlVQ0hBUglSNTV4ID0gMCwgdmFsdWUsIEZpbHRlclRhcmdldCA9IDB4MUUsIEJCUFZhbHVlPTA7Ci0JVUlOVAlsb29wID0gMCwgY291bnQgPSAwLCBsb29wY250ID0gMCwgUmVUcnkgPSAwOwotCVVDSEFSCVJGX1IyNF9WYWx1ZSA9IDA7Ci0KLQkvLyBHaXZlIGJicCBmaWx0ZXIgaW5pdGlhbCB2YWx1ZQotCXBBZC0+TWxtZS5DYWxpQlcyMFJmUjI0ID0gMHgxRjsKLQlwQWQtPk1sbWUuQ2FsaUJXNDBSZlIyNCA9IDB4MkY7IC8vQml0WzVdIG11c3QgYmUgMSBmb3IgQlcgNDAKLQotCWRvCi0JewotCQlpZiAobG9vcCA9PSAxKQkvL0JhbmRXaWR0aCA9IDQwIE1IegotCQl7Ci0JCQkvLyBXcml0ZSAweDI3IHRvIFJGX1IyNCB0byBwcm9ncmFtIGZpbHRlcgotCQkJUkZfUjI0X1ZhbHVlID0gMHgyNzsKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgUkZfUjI0X1ZhbHVlKTsKLQkJCWlmIChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKXx8IElTX1JUMzM5MChwQWQpKQotCQkJCUZpbHRlclRhcmdldCA9IDB4MTU7Ci0JCQllbHNlCi0JCQkJRmlsdGVyVGFyZ2V0ID0gMHgxOTsKLQotCQkJLy8gd2hlbiBjYWxpYnJhdGUgQlc0MCwgQkJQIG1hc2sgbXVzdCBzZXQgdG8gQlc0MC4KLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKLQkJCUJCUFZhbHVlJj0gKH4weDE4KTsKLQkJCUJCUFZhbHVlfD0gKDB4MTApOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOwotCi0JCQkvLyBzZXQgdG8gQlc0MAotCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMzEsICZ2YWx1ZSk7Ci0JCQl2YWx1ZSB8PSAweDIwOwotCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCB2YWx1ZSk7Ci0JCX0KLQkJZWxzZQkJCS8vQmFuZFdpZHRoID0gMjAgTUh6Ci0JCXsKLQkJCS8vIFdyaXRlIDB4MDcgdG8gUkZfUjI0IHRvIHByb2dyYW0gZmlsdGVyCi0JCQlSRl9SMjRfVmFsdWUgPSAweDA3OwotCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCBSRl9SMjRfVmFsdWUpOwotCQkJaWYgKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpfHwgSVNfUlQzMzkwKHBBZCkpCi0JCQkJRmlsdGVyVGFyZ2V0ID0gMHgxMzsKLQkJCWVsc2UKLQkJCQlGaWx0ZXJUYXJnZXQgPSAweDE2OwotCi0JCQkvLyBzZXQgdG8gQlcyMAotCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMzEsICZ2YWx1ZSk7Ci0JCQl2YWx1ZSAmPSAofjB4MjApOwotCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCB2YWx1ZSk7Ci0JCX0KLQotCQkvLyBXcml0ZSAweDAxIHRvIFJGX1IyMiB0byBlbmFibGUgYmFzZWJhbmQgbG9vcGJhY2sgbW9kZQotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgJnZhbHVlKTsKLQkJdmFsdWUgfD0gMHgwMTsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIyLCB2YWx1ZSk7Ci0KLQkJLy8gV3JpdGUgMHgwMCB0byBCQlBfUjI0IHRvIHNldCBwb3dlciAmIGZyZXF1ZW5jeSBvZiBwYXNzYmFuZCB0ZXN0IHRvbmUKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjQsIDApOwotCi0JCWRvCi0JCXsKLQkJCS8vIFdyaXRlIDB4OTAgdG8gQkJQX1IyNSB0byB0cmFuc21pdCB0ZXN0IHRvbmUKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI1LCAweDkwKTsKLQotCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQkJCS8vIFJlYWQgQkJQX1I1NVs2OjBdIGZvciByZWNlaXZlZCBwb3dlciwgc2V0IFI1NXggPSBCQlBfUjU1WzY6MF0KLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNTUsICZ2YWx1ZSk7Ci0JCQlSNTV4ID0gdmFsdWUgJiAweEZGOwotCi0JCX0gd2hpbGUgKChSZVRyeSsrIDwgMTAwKSAmJiAoUjU1eCA9PSAwKSk7Ci0KLQkJLy8gV3JpdGUgMHgwNiB0byBCQlBfUjI0IHRvIHNldCBwb3dlciAmIGZyZXF1ZW5jeSBvZiBzdG9wYmFuZCB0ZXN0IHRvbmUKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjQsIDB4MDYpOwotCi0JCXdoaWxlKFRSVUUpCi0JCXsKLQkJCS8vIFdyaXRlIDB4OTAgdG8gQkJQX1IyNSB0byB0cmFuc21pdCB0ZXN0IHRvbmUKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI1LCAweDkwKTsKLQotCQkJLy9XZSBuZWVkIHRvIHdhaXQgZm9yIGNhbGlicmF0aW9uCi0JCQlSVE1QdXNlY0RlbGF5KDEwMDApOwotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I1NSwgJnZhbHVlKTsKLQkJCXZhbHVlICY9IDB4RkY7Ci0JCQlpZiAoKFI1NXggLSB2YWx1ZSkgPCBGaWx0ZXJUYXJnZXQpCi0JCQl7Ci0JCQkJUkZfUjI0X1ZhbHVlICsrOwotCQkJfQotCQkJZWxzZSBpZiAoKFI1NXggLSB2YWx1ZSkgPT0gRmlsdGVyVGFyZ2V0KQotCQkJewotCQkJCVJGX1IyNF9WYWx1ZSArKzsKLQkJCQljb3VudCArKzsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLy8gcHJldmVudCBpbmZpbml0ZSBsb29wIGNhdXNlIGRyaXZlciBoYW5nLgotCQkJaWYgKGxvb3BjbnQrKyA+IDEwMCkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVE1QRmlsdGVyQ2FsaWJyYXRpb24gLSBjYW4ndCBmaW5kIGEgdmFsaWQgdmFsdWUsIGxvb3BjbnQ9JWQgc3RvcCBjYWxpYnJhdGluZyIsIGxvb3BjbnQpKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLy8gV3JpdGUgUkZfUjI0IHRvIHByb2dyYW0gZmlsdGVyCi0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjQsIFJGX1IyNF9WYWx1ZSk7Ci0JCX0KLQotCQlpZiAoY291bnQgPiAwKQotCQl7Ci0JCQlSRl9SMjRfVmFsdWUgPSBSRl9SMjRfVmFsdWUgLSAoKGNvdW50KSA/ICgxKSA6ICgwKSk7Ci0JCX0KLQotCQkvLyBTdG9yZSBmb3IgZnV0dXJlIHVzYWdlCi0JCWlmIChsb29wY250IDwgMTAwKQotCQl7Ci0JCQlpZiAobG9vcCsrID09IDApCi0JCQl7Ci0JCQkJLy9CYW5kV2lkdGggPSAyMCBNSHoKLQkJCQlwQWQtPk1sbWUuQ2FsaUJXMjBSZlIyNCA9IChVQ0hBUilSRl9SMjRfVmFsdWU7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy9CYW5kV2lkdGggPSA0MCBNSHoKLQkJCQlwQWQtPk1sbWUuQ2FsaUJXNDBSZlIyNCA9IChVQ0hBUilSRl9SMjRfVmFsdWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJYnJlYWs7Ci0KLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCBSRl9SMjRfVmFsdWUpOwotCi0JCS8vIHJlc2V0IGNvdW50Ci0JCWNvdW50ID0gMDsKLQl9IHdoaWxlKFRSVUUpOwotCi0JLy8KLQkvLyBTZXQgYmFjayB0byBpbml0aWFsIHN0YXRlCi0JLy8KLQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNCwgMCk7Ci0KLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgJnZhbHVlKTsKLQl2YWx1ZSAmPSB+KDB4MDEpOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgdmFsdWUpOwotCi0JLy8gc2V0IEJCUCBiYWNrIHRvIEJXMjAKLQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7Ci0JQkJQVmFsdWUmPSAofjB4MTgpOwotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBGaWx0ZXJDYWxpYnJhdGlvbiAtIENhbGlCVzIwUmZSMjQ9MHgleCwgQ2FsaUJXNDBSZlIyND0weCV4XG4iLCBwQWQtPk1sbWUuQ2FsaUJXMjBSZlIyNCwgcEFkLT5NbG1lLkNhbGlCVzQwUmZSMjQpKTsKLX0KLQotCi0vLyBhZGQgYnkgam9obmxpLCBSRiBwb3dlciBzZXF1ZW5jZSBzZXR1cAotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JTG9hZCBSRiBub3JtYWwgb3BlcmF0aW9uLW1vZGUgc2V0dXAKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgUlQzMHh4TG9hZFJGTm9ybWFsTW9kZVNldHVwKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotCVVDSEFSIFJGVmFsdWU7Ci0KLQkvLyBSWDBfUEQgJiBUWDBfUEQsIFJGIFIxIHJlZ2lzdGVyIEJpdCAyICYgQml0IDMgdG8gMCBhbmQgUkZfQkxPQ0tfZW4sUlgxX1BEICYgVFgxX1BELCBCaXQwLCBCaXQgNCAmIEJpdDUgdG8gMQotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCAmUkZWYWx1ZSk7Ci0JUkZWYWx1ZSA9IChSRlZhbHVlICYgKH4weDBDKSkgfCAweDMxOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgUkZWYWx1ZSk7Ci0KLQkvLyBUWF9MTzJfZW4sIFJGIFIxNSByZWdpc3RlciBCaXQgMyB0byAwCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMTUsICZSRlZhbHVlKTsKLQlSRlZhbHVlICY9ICh+MHgwOCk7Ci0JUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjE1LCBSRlZhbHVlKTsKLQotCS8qIG1vdmUgdG8gTklDSW5pdFJUMzB4eFJGUmVnaXN0ZXJzCi0JLy8gVFhfTE8xX2VuLCBSRiBSMTcgcmVnaXN0ZXIgQml0IDMgdG8gMAotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjE3LCAmUkZWYWx1ZSk7Ci0JUkZWYWx1ZSAmPSAofjB4MDgpOwotCS8vIHRvIGZpeCByeCBsb25nIHJhbmdlIGlzc3VlCi0JaWYgKCgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA+PSAweDAyMTEpICYmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JHID09IDApKQotCXsKLQkJUkZWYWx1ZSB8PSAweDIwOwotCX0KLQkvLyBzZXQgUkZfUjE3X2JpdFsyOjBdIGVxdWFsIHRvIEVFUFJPTSBzZXR0aW5nIGF0IDB4NDhoCi0JaWYgKHBBZC0+VHhNaXhlckdhaW4yNEcgPj0gMikKLQl7Ci0JCVJGVmFsdWUgJj0gKH4weDcpOyAgLy8gY2xlYW4gYml0IFsyOjBdCi0JCVJGVmFsdWUgfD0gcEFkLT5UeE1peGVyR2FpbjI0RzsKLQl9Ci0JUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjE3LCBSRlZhbHVlKTsKLQkqLwotCi0JLy8gUlhfTE8xX2VuLCBSRiBSMjAgcmVnaXN0ZXIgQml0IDMgdG8gMAotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIwLCAmUkZWYWx1ZSk7Ci0JUkZWYWx1ZSAmPSAofjB4MDgpOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMCwgUkZWYWx1ZSk7Ci0KLQkvLyBSWF9MTzJfZW4sIFJGIFIyMSByZWdpc3RlciBCaXQgMyB0byAwCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjEsICZSRlZhbHVlKTsKLQlSRlZhbHVlICY9ICh+MHgwOCk7Ci0JUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIxLCBSRlZhbHVlKTsKLQotCS8qIGFkZCBieSBqb2hubGksIHJlc2V0IFJGX1IyNyB3aGVuIGludGVyZmFjZSBkb3duICYgdXAgdG8gZml4IHRocm91Z2hwdXQgcHJvYmxlbSovCi0JLy8gTERPUkZfVkMsIFJGIFIyNyByZWdpc3RlciBCaXQgMiB0byAwCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsICZSRlZhbHVlKTsKLQkvLyBUWCB0byBSWCBJUSBnbGl0Y2goUkZfUjI3KSBoYXMgYmVlbiBmaXhlZCBpbiBSVDMwNzAoRikuCi0JLy8gUmFpc2luZyBSRiB2b2x0YWdlIGlzIG5vIGxvbmdlciBuZWVkZWQgZm9yIFJUMzA3MChGKQotCWlmIChJU19SVDMwOTAocEFkKSkJLy8gUlQzMDl4IGFuZCBSVDMwNzEvNzIKLQl7Ci0JCWlmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIxMSkKLQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmICh+MHg3NykpIHwgMHgzOwotCQllbHNlCi0JCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAofjB4NzcpKTsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCBSRlZhbHVlKTsKLQl9Ci0JLyogZW5kIGpvaG5saSAqLwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlMb2FkIFJGIHNsZWVwLW1vZGUgc2V0dXAKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgUlQzMHh4TG9hZFJGU2xlZXBNb2RlU2V0dXAoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JVUNIQVIgUkZWYWx1ZTsKLQlVSU5UMzIgTUFDVmFsdWU7Ci0KLQotCXsKLQkJLy8gUkZfQkxPQ0tfZW4uIFJGIFIxIHJlZ2lzdGVyIEJpdCAwIHRvIDAKLQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDEsICZSRlZhbHVlKTsKLQkJUkZWYWx1ZSAmPSAofjB4MDEpOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDEsIFJGVmFsdWUpOwotCi0JCS8vIFZDT19JQywgUkYgUjcgcmVnaXN0ZXIgQml0IDQgJiBCaXQgNSB0byAwCi0JCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjA3LCAmUkZWYWx1ZSk7Ci0JCVJGVmFsdWUgJj0gKH4weDMwKTsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA3LCBSRlZhbHVlKTsKLQotCQkvLyBJZG9oLCBSRiBSOSByZWdpc3RlciBCaXQgMSwgQml0IDIgJiBCaXQgMyB0byAwCi0JCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjA5LCAmUkZWYWx1ZSk7Ci0JCVJGVmFsdWUgJj0gKH4weDBFKTsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA5LCBSRlZhbHVlKTsKLQotCQkvLyBSWF9DVEJfZW4sIFJGIFIyMSByZWdpc3RlciBCaXQgNyB0byAwCi0JCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIxLCAmUkZWYWx1ZSk7Ci0JCVJGVmFsdWUgJj0gKH4weDgwKTsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIxLCBSRlZhbHVlKTsKLQl9Ci0KLQlpZiAoSVNfUlQzMDkwKHBBZCkgfHwJLy8gSVNfUlQzMDkwIGluY2x1ZGluZyBSVDMwOXggYW5kIFJUMzA3MS83MgotCQlJU19SVDM1NzIocEFkKSB8fAotCQkoSVNfUlQzMDcwKHBBZCkgJiYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjAxKSkpCi0JewotCQl7Ci0JCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgJlJGVmFsdWUpOwotCQkJUkZWYWx1ZSB8PSAweDc3OwotCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCBSRlZhbHVlKTsKLQkJfQotCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgTERPX0NGRzAsICZNQUNWYWx1ZSk7Ci0JCU1BQ1ZhbHVlIHw9IDB4MUQwMDAwMDA7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIExET19DRkcwLCBNQUNWYWx1ZSk7Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlSZXZlcnNlIFJGIHNsZWVwLW1vZGUgc2V0dXAKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgUlQzMHh4UmV2ZXJzZVJGU2xlZXBNb2RlU2V0dXAoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JVUNIQVIgUkZWYWx1ZTsKLQlVSU5UMzIgTUFDVmFsdWU7Ci0KLQl7Ci0JCS8vIFJGX0JMT0NLX2VuLCBSRiBSMSByZWdpc3RlciBCaXQgMCB0byAxCi0JCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCAmUkZWYWx1ZSk7Ci0JCVJGVmFsdWUgfD0gMHgwMTsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCBSRlZhbHVlKTsKLQotCQkvLyBWQ09fSUMsIFJGIFI3IHJlZ2lzdGVyIEJpdCA0ICYgQml0IDUgdG8gMQotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNywgJlJGVmFsdWUpOwotCQlSRlZhbHVlIHw9IDB4MzA7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwNywgUkZWYWx1ZSk7Ci0KLQkJLy8gSWRvaCwgUkYgUjkgcmVnaXN0ZXIgQml0IDEsIEJpdCAyICYgQml0IDMgdG8gMQotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwOSwgJlJGVmFsdWUpOwotCQlSRlZhbHVlIHw9IDB4MEU7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwOSwgUkZWYWx1ZSk7Ci0KLQkJLy8gUlhfQ1RCX2VuLCBSRiBSMjEgcmVnaXN0ZXIgQml0IDcgdG8gMQotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMSwgJlJGVmFsdWUpOwotCQlSRlZhbHVlIHw9IDB4ODA7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMSwgUkZWYWx1ZSk7Ci0JfQotCi0JaWYgKElTX1JUMzA5MChwQWQpIHx8CS8vIElTX1JUMzA5MCBpbmNsdWRpbmcgUlQzMDl4IGFuZCBSVDMwNzEvNzIKLQkJSVNfUlQzNTcyKHBBZCkgfHwKLQkJSVNfUlQzMzkwKHBBZCkgfHwKLQkJKElTX1JUMzA3MChwQWQpICYmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIwMSkpKQotCXsKLQkJewotCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsICZSRlZhbHVlKTsKLQkJCWlmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIxMSkKLQkJCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAofjB4NzcpKSB8IDB4MzsKLQkJCWVsc2UKLQkJCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAofjB4NzcpKTsKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgUkZWYWx1ZSk7Ci0JCX0KLQotCQkvLyBSVDMwNzEgdmVyc2lvbiBFIGhhcyBmaXhlZCB0aGlzIGlzc3VlCi0JCWlmICgocEFkLT5OaWNDb25maWcyLmZpZWxkLkRBQ1Rlc3RCaXQgPT0gMSkgJiYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjExKSkKLQkJewotCQkJLy8gcGF0Y2ggdHggRVZNIGlzc3VlIHRlbXBvcmFyaWx5Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIExET19DRkcwLCAmTUFDVmFsdWUpOwotCQkJTUFDVmFsdWUgPSAoKE1BQ1ZhbHVlICYgMHhFMEZGRkZGRikgfCAweDBEMDAwMDAwKTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIExET19DRkcwLCBNQUNWYWx1ZSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIExET19DRkcwLCAmTUFDVmFsdWUpOwotCQkJTUFDVmFsdWUgPSAoKE1BQ1ZhbHVlICYgMHhFMEZGRkZGRikgfCAweDAxMDAwMDAwKTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIExET19DRkcwLCBNQUNWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQlpZihJU19SVDM1NzIocEFkKSkKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA4LCAweDgwKTsKLX0KLS8vIGVuZCBqb2hubGkKLQotVk9JRCBSVDMweHhIYWx0QWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotCVVJTlQzMgkJVHhQaW5DZmcgPSAweDAwMDUwRjBGOwotCi0JLy8KLQkvLyBUdXJuIG9mZiBMTkFfUEUgb3IgVFJTV19QT0wKLQkvLwotCWlmIChJU19SVDMwNzAocEFkKSB8fCBJU19SVDMwNzEocEFkKSB8fCBJU19SVDM1NzIocEFkKSkKLQl7Ci0JCWlmICgoSVNfUlQzMDcxKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkpCi0jaWZkZWYgUlRNUF9FRlVTRV9TVVBQT1JUCi0JCQkmJiAocEFkLT5iVXNlRWZ1c2UpCi0jZW5kaWYgLy8gUlRNUF9FRlVTRV9TVVBQT1JUIC8vCi0JCQkpCi0JCXsKLQkJCVR4UGluQ2ZnICY9IDB4RkZGQkYwRjA7IC8vIGJpdDE4IG9mZgotCQl9Ci0JCWVsc2UKLQkJewotCQkJVHhQaW5DZmcgJj0gMHhGRkZGRjBGMDsKLQkJfQotCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKLQl9Ci19Ci0KLSNlbmRpZiAvLyBSVDMweHggLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY2hpcHMvcnQzMzcwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NoaXBzL3J0MzM3MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGVjYjA2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY2hpcHMvcnQzMzcwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQlydDMzNzAuYwotCi0JQWJzdHJhY3Q6Ci0JU3BlY2lmaWMgZnVuY2l0b25zIGFuZCB2YXJpYWJsZXMgZm9yIFJUMzB4eC4KLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0JLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaWZkZWYgUlQzMzcwCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi0jaWZuZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotI2Vycm9yICJZb3UgU2hvdWxkIEVuYWJsZSBjb21waWxlIGZsYWcgUlRNUF9SRl9SV19TVVBQT1JUIGZvciB0aGlzIGNoaXAiCi0jZW5kaWYgLy8gUlRNUF9SRl9SV19TVVBQT1JUIC8vCi0KLQotVk9JRCBOSUNJbml0UlQzMzcwUkZSZWdpc3RlcnMoSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JCUlOVCBpOwotCS8vIERyaXZlciBtdXN0IHJlYWQgRUVQUk9NIHRvIGdldCBSZkljVHlwZSBiZWZvcmUgaW5pdGlhbCBSRiByZWdpc3RlcnMKLQkvLyBJbml0aWFsaXplIFJGIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKLQlpZiAoSVNfUlQzMDkwKHBBZCl8fElTX1JUMzM5MChwQWQpfHxJU19SVDM1NzIocEFkKSkKLQl7Ci0JCS8vIEluaXQgUkYgY2FsaWJyYXRpb24KLQkJLy8gRHJpdmVyIHNob3VsZCB0b2dnbGUgUkYgUjMwIGJpdDcgYmVmb3JlIGluaXQgUkYgcmVnaXN0ZXJzCi0JCVVJTlQzMiBSZlJlZyA9IDAsIGRhdGE7Ci0KLQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMzAsIChQVUNIQVIpJlJmUmVnKTsKLQkJUmZSZWcgfD0gMHg4MDsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMwLCAoVUNIQVIpUmZSZWcpOwotCQlSVE1QdXNlY0RlbGF5KDEwMDApOwotCQlSZlJlZyAmPSAweDdGOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMzAsIChVQ0hBUilSZlJlZyk7Ci0KLQkJLy8gaW5pdCBSMjQsIFIzMQotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjQsIDB4MEYpOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMzEsIDB4MEYpOwotCi0JCWlmIChJU19SVDMzOTAocEFkKSkKLQkJewotCQkJLy8gcGF0Y2ggTE5BX1BFX0cxIGZhaWxlZCBpc3N1ZQotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBHUElPX1NXSVRDSCwgJmRhdGEpOwotCQkJZGF0YSAmPSB+KDB4MjApOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgR1BJT19TV0lUQ0gsIGRhdGEpOwotCi0JCQkvLyBSRiByZWdpc3RlcnMgaW5pdGlhbGl6YXRpb24KLQkJCWZvciAoaSA9IDA7IGkgPCBOVU1fUkZfUkVHX1BBUk1TX09WRVJfUlQzMzkwOyBpKyspCi0JCQl7Ci0JCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZSZWdUYWJsZU92ZXJSVDMzOTBbaV0uUmVnaXN0ZXIsIFJGUmVnVGFibGVPdmVyUlQzMzkwW2ldLlZhbHVlKTsKLQkJCX0KLQkJfQotCi0JCS8vIHBhdGNoIExOQV9QRV9HMSBmYWlsZWQgaXNzdWUKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBHUElPX1NXSVRDSCwgJmRhdGEpOwotCQlkYXRhICY9IH4oMHgyMCk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEdQSU9fU1dJVENILCBkYXRhKTsKLQotCQkvLyBJbml0aWFsaXplIFJGIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKLQkJZm9yIChpID0gMDsgaSA8IE5VTV9SRl9SRUdfUEFSTVNfT1ZFUl9SVDMzOTA7IGkrKykKLQkJewotCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUlQzMHh4X1JGUmVnVGFibGVbaV0uUmVnaXN0ZXIsIFJUMzB4eF9SRlJlZ1RhYmxlW2ldLlZhbHVlKTsKLQkJfQotCi0JCS8vIERyaXZlciBzaG91bGQgc2V0IFJGIFI2IGJpdDYgb24gYmVmb3JlIGNhbGlicmF0aW9uCi0JCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjA2LCAoUFVDSEFSKSZSZlJlZyk7Ci0JCVJmUmVnIHw9IDB4NDA7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwNiwgKFVDSEFSKVJmUmVnKTsKLQotCQkvL0ZvciBSRiBmaWx0ZXIgQ2FsaWJyYXRpb24KLQkJUlRNUEZpbHRlckNhbGlicmF0aW9uKHBBZCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBSRiBSMjcgcmVnaXN0ZXIsIHNldCBSRiBSMjcgbXVzdCBiZSBiZWhpbmQgUlRNUEZpbHRlckNhbGlicmF0aW9uKCkKLQkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjExKQotCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCAweDMpOwotCi0JCS8vIHNldCBsZWQgb3BlbiBkcmFpbiBlbmFibGUKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBPUFRfMTQsICZkYXRhKTsKLQkJZGF0YSB8PSAweDAxOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBPUFRfMTQsIGRhdGEpOwotCi0JCS8vIHNldCBkZWZhdWx0IGFudGVubmEgYXMgbWFpbgotCQlpZiAocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjApCi0JCQlBc2ljU2V0UnhBbnQocEFkLCBwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50KTsKLQotCQkvLyBhZGQgYnkgam9obmxpLCBSRiBwb3dlciBzZXF1ZW5jZSBzZXR1cCwgbG9hZCBSRiBub3JtYWwgb3BlcmF0aW9uLW1vZGUgc2V0dXAKLQkJUlQzMHh4TG9hZFJGTm9ybWFsTW9kZVNldHVwKHBBZCk7Ci0JfQotCi19Ci0jZW5kaWYgLy8gUlQzMDcwIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NoaXBzL3J0MzM5MC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jaGlwcy9ydDMzOTAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZlZDllNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NoaXBzL3J0MzM5MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JcnQzMzkwLmMKLQotCUFic3RyYWN0OgotCVNwZWNpZmljIGZ1bmNpdG9ucyBhbmQgdmFyaWFibGVzIGZvciBSVDMweHguCi0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotI2lmZGVmIFJUMzM5MAotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotI2lmbmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKLSNlcnJvciAiWW91IFNob3VsZCBFbmFibGUgY29tcGlsZSBmbGFnIFJUTVBfUkZfUldfU1VQUE9SVCBmb3IgdGhpcyBjaGlwIgotI2VuZGlmIC8vIFJUTVBfUkZfUldfU1VQUE9SVCAvLwotCi0KLVZPSUQgTklDSW5pdFJUMzM5MFJGUmVnaXN0ZXJzKElOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCQlJTlQgaTsKLQkvLyBEcml2ZXIgbXVzdCByZWFkIEVFUFJPTSB0byBnZXQgUmZJY1R5cGUgYmVmb3JlIGluaXRpYWwgUkYgcmVnaXN0ZXJzCi0JLy8gSW5pdGlhbGl6ZSBSRiByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlCi0JaWYgKElTX1JUMzA5MChwQWQpfHxJU19SVDMzOTAocEFkKXx8SVNfUlQzNTcyKHBBZCkpCi0JewotCQkvLyBJbml0IFJGIGNhbGlicmF0aW9uCi0JCS8vIERyaXZlciBzaG91bGQgdG9nZ2xlIFJGIFIzMCBiaXQ3IGJlZm9yZSBpbml0IFJGIHJlZ2lzdGVycwotCQlVSU5UMzIgUmZSZWcgPSAwLCBkYXRhOwotCi0JCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjMwLCAoUFVDSEFSKSZSZlJlZyk7Ci0JCVJmUmVnIHw9IDB4ODA7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKFVDSEFSKVJmUmVnKTsKLQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQkJUmZSZWcgJj0gMHg3RjsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMwLCAoVUNIQVIpUmZSZWcpOwotCi0JCS8vIGluaXQgUjI0LCBSMzEKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCAweDBGKTsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCAweDBGKTsKLQotCQlpZiAoSVNfUlQzMzkwKHBBZCkpCi0JCXsKLQkJCS8vIHBhdGNoIExOQV9QRV9HMSBmYWlsZWQgaXNzdWUKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgR1BJT19TV0lUQ0gsICZkYXRhKTsKLQkJCWRhdGEgJj0gfigweDIwKTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEdQSU9fU1dJVENILCBkYXRhKTsKLQotCQkJLy8gUkYgcmVnaXN0ZXJzIGluaXRpYWxpemF0aW9uCi0JCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1JGX1JFR19QQVJNU19PVkVSX1JUMzM5MDsgaSsrKQotCQkJewotCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGUmVnVGFibGVPdmVyUlQzMzkwW2ldLlJlZ2lzdGVyLCBSRlJlZ1RhYmxlT3ZlclJUMzM5MFtpXS5WYWx1ZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBwYXRjaCBMTkFfUEVfRzEgZmFpbGVkIGlzc3VlCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgR1BJT19TV0lUQ0gsICZkYXRhKTsKLQkJZGF0YSAmPSB+KDB4MjApOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBHUElPX1NXSVRDSCwgZGF0YSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBSRiByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlCi0JCWZvciAoaSA9IDA7IGkgPCBOVU1fUkZfUkVHX1BBUk1TX09WRVJfUlQzMzkwOyBpKyspCi0JCXsKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGUmVnVGFibGVPdmVyUlQzMzkwW2ldLlJlZ2lzdGVyLCBSRlJlZ1RhYmxlT3ZlclJUMzM5MFtpXS5WYWx1ZSk7Ci0JCX0KLQotCQkvLyBEcml2ZXIgc2hvdWxkIHNldCBSRiBSNiBiaXQ2IG9uIGJlZm9yZSBjYWxpYnJhdGlvbgotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNiwgKFBVQ0hBUikmUmZSZWcpOwotCQlSZlJlZyB8PSAweDQwOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDYsIChVQ0hBUilSZlJlZyk7Ci0KLQkJLy9Gb3IgUkYgZmlsdGVyIENhbGlicmF0aW9uCi0JCVJUTVBGaWx0ZXJDYWxpYnJhdGlvbihwQWQpOwotCi0JCS8vIEluaXRpYWxpemUgUkYgUjI3IHJlZ2lzdGVyLCBzZXQgUkYgUjI3IG11c3QgYmUgYmVoaW5kIFJUTVBGaWx0ZXJDYWxpYnJhdGlvbigpCi0JCWlmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIxMSkKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgMHgzKTsKLQotCQkvLyBzZXQgbGVkIG9wZW4gZHJhaW4gZW5hYmxlCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgT1BUXzE0LCAmZGF0YSk7Ci0JCWRhdGEgfD0gMHgwMTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgT1BUXzE0LCBkYXRhKTsKLQotCQkvLyBzZXQgZGVmYXVsdCBhbnRlbm5hIGFzIG1haW4KLQkJaWYgKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIwKQotCQkJQXNpY1NldFJ4QW50KHBBZCwgcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudCk7Ci0KLQkJLy8gYWRkIGJ5IGpvaG5saSwgUkYgcG93ZXIgc2VxdWVuY2Ugc2V0dXAsIGxvYWQgUkYgbm9ybWFsIG9wZXJhdGlvbi1tb2RlIHNldHVwCi0JCVJUMzN4eExvYWRSRk5vcm1hbE1vZGVTZXR1cChwQWQpOwotCX0KLQotfQotCi0jZW5kaWYgLy8gUlQzMzkwIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NoaXBzL3J0MzN4eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jaGlwcy9ydDMzeHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZmMzc2Yy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NoaXBzL3J0MzN4eC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTM2ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JcnQzM3h4LmMKLQotCUFic3RyYWN0OgotCVNwZWNpZmljIGZ1bmNpdG9ucyBhbmQgdmFyaWFibGVzIGZvciBSVDMweHguCi0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotCi0jaWZkZWYgUlQzM3h4Ci0KLQotI2lmbmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKLSNlcnJvciAiWW91IFNob3VsZCBFbmFibGUgY29tcGlsZSBmbGFnIFJUTVBfUkZfUldfU1VQUE9SVCBmb3IgdGhpcyBjaGlwIgotI2VuZGlmIC8vIFJUTVBfUkZfUldfU1VQUE9SVCAvLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotLy8KLS8vIFJGIHJlZ2lzdGVyIGluaXRpYWxpemF0aW9uIHNldAotLy8KLVJFR19QQUlSIFJGUmVnVGFibGVPdmVyUlQzMzkwW10gPSB7Ci0Je1JGX1IwMCwJCTB4QTB9LAotCXtSRl9SMDEsCQkweEUxfSwKLQl7UkZfUjAyLAkJMHhGMX0sCi0Je1JGX1IwMywJCTB4NjJ9LAotCXtSRl9SMDQsCQkweDQwfSwKLQl7UkZfUjA1LAkJMHg4Qn0sCi0Je1JGX1IwNiwJCTB4NDJ9LAotCXtSRl9SMDcsCQkweDM0fSwKLQl7UkZfUjA4LAkJMHgwMH0sIC8vIFJlYWQgb25seQotCXtSRl9SMDksCQkweEMwfSwKLQotCXtSRl9SMTAsCQkweDYxfSwKLQl7UkZfUjExLAkJMHgyMX0sCi0Je1JGX1IxMiwJCTB4M0J9LAotCXtSRl9SMTMsCQkweEUwfSwKLQl7UkZfUjE0LAkJMHg5MH0sCi0Je1JGX1IxNSwJCTB4NTN9LAotCXtSRl9SMTYsCQkweDBFfSwKLQl7UkZfUjE3LAkJMHg5NH0sCi0Je1JGX1IxOCwJCTB4NUN9LAotCXtSRl9SMTksCQkweDRBfSwKLQotCXtSRl9SMjAsCQkweEIyfSwKLQl7UkZfUjIxLAkJMHhGNn0sCi0Je1JGX1IyMiwJCTB4MDB9LAotCXtSRl9SMjMsCQkweDE0fSwKLQl7UkZfUjI0LAkJMHgwOH0sCi0Je1JGX1IyNSwJCTB4M0R9LAotCXtSRl9SMjYsCQkweDg1fSwKLQl7UkZfUjI3LAkJMHgwMH0sCi0Je1JGX1IyOCwJCTB4NDF9LAotCXtSRl9SMjksCQkweDhGfSwKLQl7UkZfUjMwLAkJMHgyMH0sCi0Je1JGX1IzMSwJCTB4MEZ9LAotfTsKLQotVUNIQVIgTlVNX1JGX1JFR19QQVJNU19PVkVSX1JUMzM5MD0oc2l6ZW9mKFJGUmVnVGFibGVPdmVyUlQzMzkwKSAvIHNpemVvZihSRUdfUEFJUikpOwotCi0KLQotLy8gQW50ZW5uYSBkaXZlc2l0eSB1c2UgR1BJTzMgYW5kIEVFU0sgcGluIGZvciBjb250cm9sCi0vLyBBbnRlbm5hIGFuZCBFRVBST00gYWNjZXNzIGFyZSBib3RoIHVzaW5nIEVFU0sgcGluLAotLy8gVGhlcmVmb3Igd2Ugc2hvdWxkIGF2b2lkIGFjY2Vzc2luZyBFRVNLIGF0IHRoZSBzYW1lIHRpbWUKLS8vIFRoZW4gcmVzdG9yZSBhbnRlbm5hIGFmdGVyIEVFUFJPTSBhY2Nlc3MKLS8vIFRoZSBvcmlnaW5hbCBuYW1lIG9mIHRoaXMgZnVuY3Rpb24gaXMgQXNpY1NldFJ4QW50KCksIG5vdyBjaGFuZ2UgdG8KLS8vVk9JRCBBc2ljU2V0UnhBbnQoCi0KLVZPSUQgUlQzM3h4U2V0UnhBbnQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUNIQVIJCQlBbnQpCi17Ci0JVUlOVDMyCVZhbHVlOwotCVVJTlQzMgl4OwotCi0JaWYgKChwQWQtPkVlcHJvbUFjY2VzcykgfHwKLQkJKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpCXx8Ci0JCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpCXx8Ci0JCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkgfHwKLQkJKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCi0JewotCQlyZXR1cm47Ci0JfQotCi0JLy8gdGhlIGFudGVubmEgc2VsZWN0aW9uIGlzIHRocm91Z2ggZmlybXdhcmUgYW5kIE1BQyByZWdpc3RlcihHUElPMykKLQlpZiAoQW50ID09IDApCi0JewotCQkvLyBNYWluIGFudGVubmEKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7Ci0JCXggfD0gKEVFU0spOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKLQotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEdQSU9fQ1RSTF9DRkcsICZWYWx1ZSk7Ci0JCVZhbHVlICY9IH4oMHgwODA4KTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgR1BJT19DVFJMX0NGRywgVmFsdWUpOwotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1NldFJ4QW50LCBzd2l0Y2ggdG8gbWFpbiBhbnRlbm5hXG4iKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIEF1eCBhbnRlbm5hCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOwotCQl4ICY9IH4oRUVTSyk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOwotCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgR1BJT19DVFJMX0NGRywgJlZhbHVlKTsKLQkJVmFsdWUgJj0gfigweDA4MDgpOwotCQlWYWx1ZSB8PSAweDA4OwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBHUElPX0NUUkxfQ0ZHLCBWYWx1ZSk7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJBc2ljU2V0UnhBbnQsIHN3aXRjaCB0byBhdXggYW50ZW5uYVxuIikpOwotCX0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJRm9yIFJGIGZpbHRlciBjYWxpYnJhdGlvbiBwdXJwb3NlCi0KLQlBcmd1bWVudHM6Ci0JCXBBZCAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QRmlsdGVyQ2FsaWJyYXRpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JVUNIQVIJUjU1eCA9IDAsIHZhbHVlLCBGaWx0ZXJUYXJnZXQgPSAweDFFLCBCQlBWYWx1ZT0wOwotCVVJTlQJbG9vcCA9IDAsIGNvdW50ID0gMCwgbG9vcGNudCA9IDAsIFJlVHJ5ID0gMDsKLQlVQ0hBUglSRl9SMjRfVmFsdWUgPSAwOwotCi0JLy8gR2l2ZSBiYnAgZmlsdGVyIGluaXRpYWwgdmFsdWUKLQlwQWQtPk1sbWUuQ2FsaUJXMjBSZlIyNCA9IDB4MUY7Ci0JcEFkLT5NbG1lLkNhbGlCVzQwUmZSMjQgPSAweDJGOyAvL0JpdFs1XSBtdXN0IGJlIDEgZm9yIEJXIDQwCi0KLQlkbwotCXsKLQkJaWYgKGxvb3AgPT0gMSkJLy9CYW5kV2lkdGggPSA0MCBNSHoKLQkJewotCQkJLy8gV3JpdGUgMHgyNyB0byBSRl9SMjQgdG8gcHJvZ3JhbSBmaWx0ZXIKLQkJCVJGX1IyNF9WYWx1ZSA9IDB4Mjc7Ci0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjQsIFJGX1IyNF9WYWx1ZSk7Ci0JCQlpZiAoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCl8fCBJU19SVDMzOTAocEFkKSkKLQkJCQlGaWx0ZXJUYXJnZXQgPSAweDE1OwotCQkJZWxzZQotCQkJCUZpbHRlclRhcmdldCA9IDB4MTk7Ci0KLQkJCS8vIHdoZW4gY2FsaWJyYXRlIEJXNDAsIEJCUCBtYXNrIG11c3Qgc2V0IHRvIEJXNDAuCi0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7Ci0JCQlCQlBWYWx1ZSY9ICh+MHgxOCk7Ci0JCQlCQlBWYWx1ZXw9ICgweDEwKTsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKLQotCQkJLy8gc2V0IHRvIEJXNDAKLQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCAmdmFsdWUpOwotCQkJdmFsdWUgfD0gMHgyMDsKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMSwgdmFsdWUpOwotCQl9Ci0JCWVsc2UJCQkvL0JhbmRXaWR0aCA9IDIwIE1IegotCQl7Ci0JCQkvLyBXcml0ZSAweDA3IHRvIFJGX1IyNCB0byBwcm9ncmFtIGZpbHRlcgotCQkJUkZfUjI0X1ZhbHVlID0gMHgwNzsKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgUkZfUjI0X1ZhbHVlKTsKLQkJCWlmIChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKXx8IElTX1JUMzM5MChwQWQpKQotCQkJCUZpbHRlclRhcmdldCA9IDB4MTM7Ci0JCQllbHNlCi0JCQkJRmlsdGVyVGFyZ2V0ID0gMHgxNjsKLQotCQkJLy8gc2V0IHRvIEJXMjAKLQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCAmdmFsdWUpOwotCQkJdmFsdWUgJj0gKH4weDIwKTsKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMSwgdmFsdWUpOwotCQl9Ci0KLQkJLy8gV3JpdGUgMHgwMSB0byBSRl9SMjIgdG8gZW5hYmxlIGJhc2ViYW5kIGxvb3BiYWNrIG1vZGUKLQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjIsICZ2YWx1ZSk7Ci0JCXZhbHVlIHw9IDB4MDE7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgdmFsdWUpOwotCi0JCS8vIFdyaXRlIDB4MDAgdG8gQkJQX1IyNCB0byBzZXQgcG93ZXIgJiBmcmVxdWVuY3kgb2YgcGFzc2JhbmQgdGVzdCB0b25lCi0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI0LCAwKTsKLQotCQlkbwotCQl7Ci0JCQkvLyBXcml0ZSAweDkwIHRvIEJCUF9SMjUgdG8gdHJhbnNtaXQgdGVzdCB0b25lCi0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNSwgMHg5MCk7Ci0KLQkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7Ci0JCQkvLyBSZWFkIEJCUF9SNTVbNjowXSBmb3IgcmVjZWl2ZWQgcG93ZXIsIHNldCBSNTV4ID0gQkJQX1I1NVs2OjBdCi0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjU1LCAmdmFsdWUpOwotCQkJUjU1eCA9IHZhbHVlICYgMHhGRjsKLQotCQl9IHdoaWxlICgoUmVUcnkrKyA8IDEwMCkgJiYgKFI1NXggPT0gMCkpOwotCi0JCS8vIFdyaXRlIDB4MDYgdG8gQkJQX1IyNCB0byBzZXQgcG93ZXIgJiBmcmVxdWVuY3kgb2Ygc3RvcGJhbmQgdGVzdCB0b25lCi0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI0LCAweDA2KTsKLQotCQl3aGlsZShUUlVFKQotCQl7Ci0JCQkvLyBXcml0ZSAweDkwIHRvIEJCUF9SMjUgdG8gdHJhbnNtaXQgdGVzdCB0b25lCi0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNSwgMHg5MCk7Ci0KLQkJCS8vV2UgbmVlZCB0byB3YWl0IGZvciBjYWxpYnJhdGlvbgotCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNTUsICZ2YWx1ZSk7Ci0JCQl2YWx1ZSAmPSAweEZGOwotCQkJaWYgKChSNTV4IC0gdmFsdWUpIDwgRmlsdGVyVGFyZ2V0KQotCQkJewotCQkJCVJGX1IyNF9WYWx1ZSArKzsKLQkJCX0KLQkJCWVsc2UgaWYgKChSNTV4IC0gdmFsdWUpID09IEZpbHRlclRhcmdldCkKLQkJCXsKLQkJCQlSRl9SMjRfVmFsdWUgKys7Ci0JCQkJY291bnQgKys7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8vIHByZXZlbnQgaW5maW5pdGUgbG9vcCBjYXVzZSBkcml2ZXIgaGFuZy4KLQkJCWlmIChsb29wY250KysgPiAxMDApCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRNUEZpbHRlckNhbGlicmF0aW9uIC0gY2FuJ3QgZmluZCBhIHZhbGlkIHZhbHVlLCBsb29wY250PSVkIHN0b3AgY2FsaWJyYXRpbmciLCBsb29wY250KSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8vIFdyaXRlIFJGX1IyNCB0byBwcm9ncmFtIGZpbHRlcgotCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCBSRl9SMjRfVmFsdWUpOwotCQl9Ci0KLQkJaWYgKGNvdW50ID4gMCkKLQkJewotCQkJUkZfUjI0X1ZhbHVlID0gUkZfUjI0X1ZhbHVlIC0gKChjb3VudCkgPyAoMSkgOiAoMCkpOwotCQl9Ci0KLQkJLy8gU3RvcmUgZm9yIGZ1dHVyZSB1c2FnZQotCQlpZiAobG9vcGNudCA8IDEwMCkKLQkJewotCQkJaWYgKGxvb3ArKyA9PSAwKQotCQkJewotCQkJCS8vQmFuZFdpZHRoID0gMjAgTUh6Ci0JCQkJcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQgPSAoVUNIQVIpUkZfUjI0X1ZhbHVlOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vQmFuZFdpZHRoID0gNDAgTUh6Ci0JCQkJcEFkLT5NbG1lLkNhbGlCVzQwUmZSMjQgPSAoVUNIQVIpUkZfUjI0X1ZhbHVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCWJyZWFrOwotCi0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgUkZfUjI0X1ZhbHVlKTsKLQotCQkvLyByZXNldCBjb3VudAotCQljb3VudCA9IDA7Ci0JfSB3aGlsZShUUlVFKTsKLQotCS8vCi0JLy8gU2V0IGJhY2sgdG8gaW5pdGlhbCBzdGF0ZQotCS8vCi0JUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjQsIDApOwotCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjIsICZ2YWx1ZSk7Ci0JdmFsdWUgJj0gfigweDAxKTsKLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjIsIHZhbHVlKTsKLQotCS8vIHNldCBCQlAgYmFjayB0byBCVzIwCi0JUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOwotCUJCUFZhbHVlJj0gKH4weDE4KTsKLQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QRmlsdGVyQ2FsaWJyYXRpb24gLSBDYWxpQlcyMFJmUjI0PTB4JXgsIENhbGlCVzQwUmZSMjQ9MHgleFxuIiwgcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQsIHBBZC0+TWxtZS5DYWxpQlc0MFJmUjI0KSk7Ci19Ci0KLQotLy8gYWRkIGJ5IGpvaG5saSwgUkYgcG93ZXIgc2VxdWVuY2Ugc2V0dXAKLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUxvYWQgUkYgbm9ybWFsIG9wZXJhdGlvbi1tb2RlIHNldHVwCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFJUMzN4eExvYWRSRk5vcm1hbE1vZGVTZXR1cCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVQ0hBUiBSRlZhbHVlOwotCi0JLy8gUlgwX1BEICYgVFgwX1BELCBSRiBSMSByZWdpc3RlciBCaXQgMiAmIEJpdCAzIHRvIDAgYW5kIFJGX0JMT0NLX2VuLFJYMV9QRCAmIFRYMV9QRCwgQml0MCwgQml0IDQgJiBCaXQ1IHRvIDEKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgJlJGVmFsdWUpOwotCVJGVmFsdWUgPSAoUkZWYWx1ZSAmICh+MHgwQykpIHwgMHgzMTsKLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDEsIFJGVmFsdWUpOwotCi0JLy8gVFhfTE8yX2VuLCBSRiBSMTUgcmVnaXN0ZXIgQml0IDMgdG8gMAotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjE1LCAmUkZWYWx1ZSk7Ci0JUkZWYWx1ZSAmPSAofjB4MDgpOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IxNSwgUkZWYWx1ZSk7Ci0KLQkvKiBtb3ZlIHRvIE5JQ0luaXRSVDMweHhSRlJlZ2lzdGVycwotCS8vIFRYX0xPMV9lbiwgUkYgUjE3IHJlZ2lzdGVyIEJpdCAzIHRvIDAKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IxNywgJlJGVmFsdWUpOwotCVJGVmFsdWUgJj0gKH4weDA4KTsKLQkvLyB0byBmaXggcnggbG9uZyByYW5nZSBpc3N1ZQotCWlmICgoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPj0gMHgwMjExKSAmJiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yRyA9PSAwKSkKLQl7Ci0JCVJGVmFsdWUgfD0gMHgyMDsKLQl9Ci0JLy8gc2V0IFJGX1IxN19iaXRbMjowXSBlcXVhbCB0byBFRVBST00gc2V0dGluZyBhdCAweDQ4aAotCWlmIChwQWQtPlR4TWl4ZXJHYWluMjRHID49IDIpCi0JewotCQlSRlZhbHVlICY9ICh+MHg3KTsgIC8vIGNsZWFuIGJpdCBbMjowXQotCQlSRlZhbHVlIHw9IHBBZC0+VHhNaXhlckdhaW4yNEc7Ci0JfQotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IxNywgUkZWYWx1ZSk7Ci0JKi8KLQotCS8vIFJYX0xPMV9lbiwgUkYgUjIwIHJlZ2lzdGVyIEJpdCAzIHRvIDAKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMCwgJlJGVmFsdWUpOwotCVJGVmFsdWUgJj0gKH4weDA4KTsKLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjAsIFJGVmFsdWUpOwotCi0JLy8gUlhfTE8yX2VuLCBSRiBSMjEgcmVnaXN0ZXIgQml0IDMgdG8gMAotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIxLCAmUkZWYWx1ZSk7Ci0JUkZWYWx1ZSAmPSAofjB4MDgpOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMSwgUkZWYWx1ZSk7Ci0KLQkvKiBhZGQgYnkgam9obmxpLCByZXNldCBSRl9SMjcgd2hlbiBpbnRlcmZhY2UgZG93biAmIHVwIHRvIGZpeCB0aHJvdWdocHV0IHByb2JsZW0qLwotCS8vIExET1JGX1ZDLCBSRiBSMjcgcmVnaXN0ZXIgQml0IDIgdG8gMAotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCAmUkZWYWx1ZSk7Ci0JLy8gVFggdG8gUlggSVEgZ2xpdGNoKFJGX1IyNykgaGFzIGJlZW4gZml4ZWQgaW4gUlQzMDcwKEYpLgotCS8vIFJhaXNpbmcgUkYgdm9sdGFnZSBpcyBubyBsb25nZXIgbmVlZGVkIGZvciBSVDMwNzAoRikKLQlpZiAoSVNfUlQzMDkwKHBBZCkpCS8vIFJUMzA5eCBhbmQgUlQzMDcxLzcyCi0JewotCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMTEpCi0JCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAofjB4NzcpKSB8IDB4MzsKLQkJZWxzZQotCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgKH4weDc3KSk7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgUkZWYWx1ZSk7Ci0JfQotCS8qIGVuZCBqb2hubGkgKi8KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JTG9hZCBSRiBzbGVlcC1tb2RlIHNldHVwCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFJUMzN4eExvYWRSRlNsZWVwTW9kZVNldHVwKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotCVVDSEFSIFJGVmFsdWU7Ci0JVUlOVDMyIE1BQ1ZhbHVlOwotCi0KLQl7Ci0JCS8vIFJGX0JMT0NLX2VuLiBSRiBSMSByZWdpc3RlciBCaXQgMCB0byAwCi0JCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCAmUkZWYWx1ZSk7Ci0JCVJGVmFsdWUgJj0gKH4weDAxKTsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCBSRlZhbHVlKTsKLQotCQkvLyBWQ09fSUMsIFJGIFI3IHJlZ2lzdGVyIEJpdCA0ICYgQml0IDUgdG8gMAotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNywgJlJGVmFsdWUpOwotCQlSRlZhbHVlICY9ICh+MHgzMCk7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwNywgUkZWYWx1ZSk7Ci0KLQkJLy8gSWRvaCwgUkYgUjkgcmVnaXN0ZXIgQml0IDEsIEJpdCAyICYgQml0IDMgdG8gMAotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwOSwgJlJGVmFsdWUpOwotCQlSRlZhbHVlICY9ICh+MHgwRSk7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwOSwgUkZWYWx1ZSk7Ci0KLQkJLy8gUlhfQ1RCX2VuLCBSRiBSMjEgcmVnaXN0ZXIgQml0IDcgdG8gMAotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMSwgJlJGVmFsdWUpOwotCQlSRlZhbHVlICY9ICh+MHg4MCk7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMSwgUkZWYWx1ZSk7Ci0JfQotCi0JaWYgKElTX1JUMzA5MChwQWQpIHx8CS8vIElTX1JUMzA5MCBpbmNsdWRpbmcgUlQzMDl4IGFuZCBSVDMwNzEvNzIKLQkJSVNfUlQzNTcyKHBBZCkgfHwKLQkJSVNfUlQzMzkwKHBBZCkgfHwKLQkJKElTX1JUMzA3MChwQWQpICYmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIwMSkpKQotCXsKLQkJewotCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsICZSRlZhbHVlKTsKLQkJCVJGVmFsdWUgfD0gMHg3NzsKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgUkZWYWx1ZSk7Ci0JCX0KLQotCQlSVE1QX0lPX1JFQUQzMihwQWQsIExET19DRkcwLCAmTUFDVmFsdWUpOwotCQlNQUNWYWx1ZSB8PSAweDFEMDAwMDAwOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBMRE9fQ0ZHMCwgTUFDVmFsdWUpOwotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JUmV2ZXJzZSBSRiBzbGVlcC1tb2RlIHNldHVwCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFJUMzN4eFJldmVyc2VSRlNsZWVwTW9kZVNldHVwKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotCVVDSEFSIFJGVmFsdWU7Ci0JVUlOVDMyIE1BQ1ZhbHVlOwotCi0JewotCQkvLyBSRl9CTE9DS19lbiwgUkYgUjEgcmVnaXN0ZXIgQml0IDAgdG8gMQotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgJlJGVmFsdWUpOwotCQlSRlZhbHVlIHw9IDB4MDE7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgUkZWYWx1ZSk7Ci0KLQkJLy8gVkNPX0lDLCBSRiBSNyByZWdpc3RlciBCaXQgNCAmIEJpdCA1IHRvIDEKLQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsICZSRlZhbHVlKTsKLQkJUkZWYWx1ZSB8PSAweDMwOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsIFJGVmFsdWUpOwotCi0JCS8vIElkb2gsIFJGIFI5IHJlZ2lzdGVyIEJpdCAxLCBCaXQgMiAmIEJpdCAzIHRvIDEKLQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDksICZSRlZhbHVlKTsKLQkJUkZWYWx1ZSB8PSAweDBFOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDksIFJGVmFsdWUpOwotCi0JCS8vIFJYX0NUQl9lbiwgUkYgUjIxIHJlZ2lzdGVyIEJpdCA3IHRvIDEKLQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjEsICZSRlZhbHVlKTsKLQkJUkZWYWx1ZSB8PSAweDgwOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjEsIFJGVmFsdWUpOwotCX0KLQotCWlmIChJU19SVDMwOTAocEFkKSB8fAkvLyBJU19SVDMwOTAgaW5jbHVkaW5nIFJUMzA5eCBhbmQgUlQzMDcxLzcyCi0JCUlTX1JUMzU3MihwQWQpIHx8Ci0JCUlTX1JUMzM5MChwQWQpIHx8Ci0JCShJU19SVDMwNzAocEFkKSAmJiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMDEpKSkKLQl7Ci0JCXsKLQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCAmUkZWYWx1ZSk7Ci0JCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMTEpCi0JCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgKH4weDc3KSkgfCAweDM7Ci0JCQllbHNlCi0JCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgKH4weDc3KSk7Ci0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsIFJGVmFsdWUpOwotCQl9Ci0KLQkJLy8gUlQzMDcxIHZlcnNpb24gRSBoYXMgZml4ZWQgdGhpcyBpc3N1ZQotCQlpZiAoKHBBZC0+TmljQ29uZmlnMi5maWVsZC5EQUNUZXN0Qml0ID09IDEpICYmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIxMSkpCi0JCXsKLQkJCS8vIHBhdGNoIHR4IEVWTSBpc3N1ZSB0ZW1wb3JhcmlseQotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBMRE9fQ0ZHMCwgJk1BQ1ZhbHVlKTsKLQkJCU1BQ1ZhbHVlID0gKChNQUNWYWx1ZSAmIDB4RTBGRkZGRkYpIHwgMHgwRDAwMDAwMCk7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBMRE9fQ0ZHMCwgTUFDVmFsdWUpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBMRE9fQ0ZHMCwgJk1BQ1ZhbHVlKTsKLQkJCU1BQ1ZhbHVlID0gKChNQUNWYWx1ZSAmIDB4RTBGRkZGRkYpIHwgMHgwMTAwMDAwMCk7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBMRE9fQ0ZHMCwgTUFDVmFsdWUpOwotCQl9Ci0JfQotCi0JaWYoSVNfUlQzNTcyKHBBZCkpCi0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwOCwgMHg4MCk7Ci19Ci0vLyBlbmQgam9obmxpCi0KLVZPSUQgUlQzM3h4SGFsdEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVSU5UMzIJCVR4UGluQ2ZnID0gMHgwMDA1MEYwRjsKLQotCS8vCi0JLy8gVHVybiBvZmYgTE5BX1BFIG9yIFRSU1dfUE9MCi0JLy8KLQlpZiAoSVNfUlQzMDcwKHBBZCkgfHwgSVNfUlQzMDcxKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCl8fElTX1JUMzU3MihwQWQpKQotCXsKLQkvL0tIPyBCb3RoIHN1cHBvcnQgMzM5MCB1c2IgYW5kICBQQ0kKLQkJaWYgKChJU19SVDMwNzEocEFkKSB8fCBJU19SVDM1NzIocEFkKXx8SVNfUlQzMzkwKHBBZCkpCi0jaWZkZWYgUlRNUF9FRlVTRV9TVVBQT1JUCi0JCQkmJiAocEFkLT5iVXNlRWZ1c2UpCi0jZW5kaWYgLy8gUlRNUF9FRlVTRV9TVVBQT1JUIC8vCi0JCQkpCi0JCXsKLQkJCVR4UGluQ2ZnICY9IDB4RkZGQkYwRjA7IC8vIGJpdDE4IG9mZgotCQl9Ci0JCWVsc2UKLQkJewotCQkJVHhQaW5DZmcgJj0gMHhGRkZGRjBGMDsKLQkJfQotCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKLQl9Ci19Ci0KLSNlbmRpZiAvLyBSVDMweHggLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY2hsaXN0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NobGlzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDNjYjQ3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY2hsaXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBjaGxpc3QuaAotCi0gICAgQWJzdHJhY3Q6Ci0gICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUZvbmNoaSBXdSAgIDIwMDctMTItMTkgICAgY3JlYXRlZAotKi8KLQotI2lmbmRlZiBfX0NITElTVF9IX18KLSNkZWZpbmUgX19DSExJU1RfSF9fCi0KLSNpbmNsdWRlICJydG1wX3R5cGUuaCIKLSNpbmNsdWRlICJydG1wX2RlZi5oIgotCi0KLSNkZWZpbmUgT0RPUgkJCTAKLSNkZWZpbmUgSURPUgkJCTEKLSNkZWZpbmUgQk9USAkJCTIKLQotI2RlZmluZSBCQU5EXzVHICAgICAgICAgMAotI2RlZmluZSBCQU5EXzI0RyAgICAgICAgMQotI2RlZmluZSBCQU5EX0JPVEggICAgICAgMgotCi10eXBlZGVmIHN0cnVjdCBfQ0hfREVTUCB7Ci0JVUNIQVIgRmlyc3RDaGFubmVsOwotCVVDSEFSIE51bU9mQ2g7Ci0JQ0hBUiBNYXhUeFB3cjsJCQkvLyBkQm0KLQlVQ0hBUiBHZW9ncmFwaHk7CQkJLy8gMDpvdXQgZG9vciwgMTppbiBkb29yLCAyOmJvdGgKLQlCT09MRUFOIERmc1JlcTsJCQkvLyBEZnMgcmVxdWlyZSwgMDogTm8sIDE6IHllcy4KLX0gQ0hfREVTUCwgKlBDSF9ERVNQOwotCi10eXBlZGVmIHN0cnVjdCBfQ0hfUkVHSU9OIHsKLQlVQ0hBUiBDb3VudFJlZ1szXTsKLQlVQ0hBUiBEZnNUeXBlOwkJCS8vIDA6IENFLCAxOiBGQ0MsIDI6IEpBUCwgMzpKQVBfVzUzLCBKQVBfVzU2Ci0JQ0hfREVTUCBDaERlc3BbMTBdOwotfSBDSF9SRUdJT04sICpQQ0hfUkVHSU9OOwotCi1leHRlcm4gQ0hfUkVHSU9OIENoUmVnaW9uW107Ci0KLXR5cGVkZWYgc3RydWN0IF9DSF9GUkVRX01BUF97Ci0JVUlOVDE2CQljaGFubmVsOwotCVVJTlQxNgkJZnJlcUtIejsKLX1DSF9GUkVRX01BUDsKLQotZXh0ZXJuIENIX0ZSRVFfTUFQIENIX0haX0lEX01BUFtdOwotZXh0ZXJuIGludCBDSF9IWl9JRF9NQVBfTlVNOwotCi0KLSNkZWZpbmUgICAgIE1BUF9DSEFOTkVMX0lEX1RPX0tIWihfY2gsIF9raHopCQkJCQlcCi0JCWRvewkJCQkJCQkJCQkJCQlcCi0JCQlpbnQgX2NoSWR4OwkJCQkJCQkJCQkJXAotCQkJZm9yIChfY2hJZHggPSAwOyBfY2hJZHggPCBDSF9IWl9JRF9NQVBfTlVNOyBfY2hJZHgrKylcCi0JCQl7CQkJCQkJCQkJCQkJCVwKLQkJCQlpZiAoKF9jaCkgPT0gQ0hfSFpfSURfTUFQW19jaElkeF0uY2hhbm5lbCkJCQlcCi0JCQkJewkJCQkJCQkJCQkJCVwKLQkJCQkJKF9raHopID0gQ0hfSFpfSURfTUFQW19jaElkeF0uZnJlcUtIeiAqIDEwMDA7CVwKLQkJCQkJYnJlYWs7CQkJCQkJCQkJCVwKLQkJCQl9CQkJCQkJCQkJCQkJXAotCQkJfQkJCQkJCQkJCQkJCQlcCi0JCQlpZiAoX2NoSWR4ID09IENIX0haX0lEX01BUF9OVU0pCQkJCQlcCi0JCQkJKF9raHopID0gMjQxMjAwMDsJCQkJCQkJCQlcCi0gICAgICAgICAgICB9d2hpbGUoMCkKLQotI2RlZmluZSAgICAgTUFQX0tIWl9UT19DSEFOTkVMX0lEKF9raHosIF9jaCkgICAgICAgICAgICAgICAgIFwKLQkJZG97CQkJCQkJCQkJCQkJCVwKLQkJCWludCBfY2hJZHg7CQkJCQkJCQkJCQlcCi0JCQlmb3IgKF9jaElkeCA9IDA7IF9jaElkeCA8IENIX0haX0lEX01BUF9OVU07IF9jaElkeCsrKVwKLQkJCXsJCQkJCQkJCQkJCQkJXAotCQkJCWlmICgoX2toeikgPT0gQ0hfSFpfSURfTUFQW19jaElkeF0uZnJlcUtIeikJCQlcCi0JCQkJewkJCQkJCQkJCQkJCVwKLQkJCQkJKF9jaCkgPSBDSF9IWl9JRF9NQVBbX2NoSWR4XS5jaGFubmVsOwkJCVwKLQkJCQkJYnJlYWs7CQkJCQkJCQkJCVwKLQkJCQl9CQkJCQkJCQkJCQkJXAotCQkJfQkJCQkJCQkJCQkJCQlcCi0JCQlpZiAoX2NoSWR4ID09IENIX0haX0lEX01BUF9OVU0pCQkJCQlcCi0JCQkJKF9jaCkgPSAxOwkJCQkJCQkJCQkJXAotCQl9d2hpbGUoMCkKLQotCi1WT0lEIEJ1aWxkQ2hhbm5lbExpc3RFeCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgQnVpbGRCZWFjb25DaExpc3QoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JT1VUIFBVQ0hBUiBwQnVmLAotCU9VVAlQVUxPTkcgcEJ1Zkxlbik7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLVZPSUQgTl9DaGFubmVsQ2hlY2soCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIE5fU2V0Q2VuQ2goCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1VSU5UOCBHZXRDdW50cnlNYXhUeFB3cigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVSU5UOCBjaGFubmVsKTsKLQotI2VuZGlmIC8vIF9fQ0hMSVNUX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vYWN0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9hY3Rpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUzYjBhMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9hY3Rpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDEwNTcgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLQlhY3Rpb24uYwotCi0gICAgQWJzdHJhY3Q6Ci0gICAgSGFuZGxlIGFzc29jaWF0aW9uIHJlbGF0ZWQgcmVxdWVzdHMgZWl0aGVyIGZyb20gV1NUQSBvciBmcm9tIGxvY2FsIE1MTUUKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JSmFuIExlZQkJMjAwNgkJY3JlYXRlZCBmb3IgcnQyODYwCi0gKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotI2luY2x1ZGUgIi4uL2FjdGlvbi5oIgotCi0KLXN0YXRpYyBWT0lEIFJlc2VydmVkQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lIGluaXQsIGluY2x1ZGluZyBzdGF0ZSB0cmFuc2l0aW9uIGFuZCB0aW1lciBpbml0Ci0gICAgUGFyYW1ldGVyczoKLSAgICAgICAgUyAtIHBvaW50ZXIgdG8gdGhlIGFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUKLSAgICBOb3RlOgotICAgICAgICBUaGUgc3RhdGUgbWFjaGluZSBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmcKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNTT0NfSURMRQotICAgICAgICBNVDJfTUxNRV9ESVNBU1NPQ19SRVEgICAgbWxtZV9kaXNhc3NvY19yZXFfYWN0aW9uCi0gICAgICAgIE1UMl9QRUVSX0RJU0FTU09DX1JFUSAgICBwZWVyX2Rpc2Fzc29jX2FjdGlvbgotICAgICAgICBNVDJfUEVFUl9BU1NPQ19SRVEgICAgICAgZHJvcAotICAgICAgICBNVDJfUEVFUl9SRUFTU09DX1JFUSAgICAgZHJvcAotICAgICAgICBNVDJfQ0xTM0VSUiAgICAgICAgICAgICAgY2xzM2Vycl9hY3Rpb24KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFjdGlvblN0YXRlTWFjaGluZUluaXQoCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCi0gICAgSU4gIFNUQVRFX01BQ0hJTkUgKlMsCi0gICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQotewotCVN0YXRlTWFjaGluZUluaXQoUywgKFNUQVRFX01BQ0hJTkVfRlVOQyAqKVRyYW5zLCBNQVhfQUNUX1NUQVRFLCBNQVhfQUNUX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylEcm9wLCBBQ1RfSURMRSwgQUNUX01BQ0hJTkVfQkFTRSk7Ci0KLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX1NQRUNUUlVNX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclNwZWN0cnVtQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX1FPU19DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJRT1NBY3Rpb24pOwotCi0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9ETFNfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylSZXNlcnZlZEFjdGlvbik7Ci0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfRExTX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRMU0FjdGlvbik7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX0JBX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckJBQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX0hUX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckhUQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX0FERF9CQV9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVBRERCQUFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfTUxNRV9PUklfREVMQkFfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lREVMQkFBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfUkVDX0RFTEJBX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZURFTEJBQWN0aW9uKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfUFVCTElDX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclB1YmxpY0FjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9STV9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJSTUFjdGlvbik7Ci0KLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX1FPU19DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVRT1NBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfRExTX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZURMU0FjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfQUNUX0lOVkFMSUQsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZUludmFsaWRBY3Rpb24pOwotCi0KLX0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotVk9JRCBNbG1lQUREQkFBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotCi17Ci0JTUxNRV9BRERCQV9SRVFfU1RSVUNUICpwSW5mbzsKLQlVQ0hBUiAgICAgICAgICAgQWRkcls2XTsKLQlQVUNIQVIgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyAgICAgTlN0YXR1czsKLQlVTE9ORwkJSWR4OwotCUZSQU1FX0FEREJBX1JFUSAgRnJhbWU7Ci0JVUxPTkcJCUZyYW1lTGVuOwotCUJBX09SSV9FTlRSWQkJCSpwQkFFbnRyeSA9IE5VTEw7Ci0KLQlwSW5mbyA9IChNTE1FX0FEREJBX1JFUV9TVFJVQ1QgKilFbGVtLT5Nc2c7Ci0JTmRpc1plcm9NZW1vcnkoJkZyYW1lLCBzaXplb2YoRlJBTUVfQUREQkFfUkVRKSk7Ci0KLQlpZihNbG1lQWRkQkFSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcikpCi0JewotCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOwotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIDEuIGZpbmQgZW50cnkKLQkJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQkFPcmlXY2lkQXJyYXlbcEluZm8tPlRJRF07Ci0JCWlmIChJZHggPT0gMCkKLQkJewotCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBjYW4ndCBmaW5kIEJBT3JpRW50cnkgXG4iKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W0lkeF07Ci0JCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0JCQlpZiAoQURIT0NfT04ocEFkKSkKLQkJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEluZm8tPnBBZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQllbHNlCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uVmFsaWRBc0RscykKLQkJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEluZm8tPnBBZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQllbHNlCi0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0JCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBJbmZvLT5wQWRkcik7Ci0KLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JCUZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfQkE7Ci0JCUZyYW1lLkFjdGlvbiA9IEFEREJBX1JFUTsKLQkJRnJhbWUuQmFQYXJtLkFNU0RVU3VwcG9ydGVkID0gMDsKLQkJRnJhbWUuQmFQYXJtLkJBUG9saWN5ID0gSU1NRURfQkE7Ci0JCUZyYW1lLkJhUGFybS5USUQgPSBwSW5mby0+VElEOwotCQlGcmFtZS5CYVBhcm0uQnVmU2l6ZSA9IHBJbmZvLT5CYUJ1ZlNpemU7Ci0JCUZyYW1lLlRva2VuID0gcEluZm8tPlRva2VuOwotCQlGcmFtZS5UaW1lT3V0VmFsdWUgPSBwSW5mby0+VGltZU91dFZhbHVlOwotCQlGcmFtZS5CYVN0YXJ0U2VxLmZpZWxkLkZyYWdOdW0gPSAwOwotCQlGcmFtZS5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxID0gcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uVHhTZXFbcEluZm8tPlRJRF07Ci0KLQkJKihVU0hPUlQgKikoJkZyYW1lLkJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmRnJhbWUuQmFQYXJtKSk7Ci0JCUZyYW1lLlRpbWVPdXRWYWx1ZSA9IGNwdTJsZTE2KEZyYW1lLlRpbWVPdXRWYWx1ZSk7Ci0JCUZyYW1lLkJhU3RhcnRTZXEud29yZCA9IGNwdTJsZTE2KEZyYW1lLkJhU3RhcnRTZXEud29yZCk7Ci0KLQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCSAgICZGcmFtZUxlbiwKLQkJICAgICAgICAgICAgICBzaXplb2YoRlJBTUVfQUREQkFfUkVRKSwgJkZyYW1lLAotCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKLQotCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIChNR01UX1VTRV9RVUVVRV9GTEFHIHwgTWFwVXNlclByaW9yaXR5VG9BY2Nlc3NDYXRlZ29yeVtwSW5mby0+VElEXSksIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQotCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJBIC0gU2VuZCBBRERCQSByZXF1ZXN0LiBTdGFydFNlcSA9ICV4LCAgRnJhbWVMZW4gPSAlbGQuIEJ1ZlNpemUgPSAlZFxuIiwgRnJhbWUuQmFTdGFydFNlcS5maWVsZC5TdGFydFNlcSwgRnJhbWVMZW4sIEZyYW1lLkJhUGFybS5CdWZTaXplKSk7Ci0gICAgfQotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIHNlbmQgREVMQkEgYW5kIGRlbGV0ZSBCYUVudHJ5IGlmIGFueQotICAgIFBhcmFtZXRyczoKLSAgICAgICAgRWxlbSAtIE1MTUUgbWVzc2FnZSBNTE1FX0RFTEJBX1JFUV9TVFJVQ1QKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNbG1lREVMQkFBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAqcEluZm87Ci0JUFVDSEFSICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JUFVDSEFSCQkgICBwT3V0QnVmZmVyMiA9IE5VTEw7Ci0JTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7Ci0JVUxPTkcJCUlkeDsKLQlGUkFNRV9ERUxCQV9SRVEgIEZyYW1lOwotCVVMT05HCQlGcmFtZUxlbjsKLQlGUkFNRV9CQVIJRnJhbWVCYXI7Ci0KLQlwSW5mbyA9IChNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgKilFbGVtLT5Nc2c7Ci0JLy8gbXVzdCBzZW5kIGJhY2sgREVMQkEKLQlOZGlzWmVyb01lbW9yeSgmRnJhbWUsIHNpemVvZihGUkFNRV9ERUxCQV9SRVEpKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gTWxtZURFTEJBQWN0aW9uKCksIEluaXRpYXRvciglZCkgXG4iLCBwSW5mby0+SW5pdGlhdG9yKSk7Ci0KLQlpZihNbG1lRGVsQkFSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikpCi0JewotCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIDEuIFxuIikpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyMik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkJBIC0gTWxtZURFTEJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCAyLiBcbiIpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFNFTkQgQkFSIChTZW5kIEJBUiB0byByZWZyZXNoIHBlZXIgcmVvcmRlcmluZyBidWZmZXIuKQotCQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5CQU9yaVdjaWRBcnJheVtwSW5mby0+VElEXTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJQmFySGVhZGVySW5pdChwQWQsICZGcmFtZUJhciwgcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuRnJhZ051bSA9IDA7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgotCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLlR4U2VxW3BJbmZvLT5USURdOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KLQkJRnJhbWVCYXIuQmFyQ29udHJvbC5USUQgPSBwSW5mby0+VElEOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KLQkJRnJhbWVCYXIuQmFyQ29udHJvbC5BQ0tQb2xpY3kgPSBJTU1FRF9CQTsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCi0JCUZyYW1lQmFyLkJhckNvbnRyb2wuQ29tcHJlc3NlZCA9IDE7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgotCQlGcmFtZUJhci5CYXJDb250cm9sLk1USUQgPSAwOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KLQotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyMiwJCQkJJkZyYW1lTGVuLAotCQkJCQkgIHNpemVvZihGUkFNRV9CQVIpLAkgICZGcmFtZUJhciwKLQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyMiwgRnJhbWVMZW4pOwotCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIyKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSAtIE1sbWVERUxCQUFjdGlvbigpIC4gU2VuZCBCQVIgdG8gcmVmcmVzaCBwZWVyIHJlb3JkZXJpbmcgYnVmZmVyIFxuIikpOwotCi0JCS8vIFNFTkQgREVMQkEgRlJBTUUKLQkJRnJhbWVMZW4gPSAwOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0JCQlpZiAoQURIT0NfT04ocEFkKSkKLQkJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQkJZWxzZQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLlZhbGlkQXNEbHMpCi0JCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJCWVsc2UKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQkJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCAgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIpOwotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCUZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfQkE7Ci0JCUZyYW1lLkFjdGlvbiA9IERFTEJBOwotCQlGcmFtZS5EZWxiYVBhcm0uSW5pdGlhdG9yID0gcEluZm8tPkluaXRpYXRvcjsKLQkJRnJhbWUuRGVsYmFQYXJtLlRJRCA9IHBJbmZvLT5USUQ7Ci0JCUZyYW1lLlJlYXNvbkNvZGUgPSAzOTsgLy8gVGltZSBPdXQKLQkJKihVU0hPUlQgKikoJkZyYW1lLkRlbGJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmRnJhbWUuRGVsYmFQYXJtKSk7Ci0JCUZyYW1lLlJlYXNvbkNvZGUgPSBjcHUybGUxNihGcmFtZS5SZWFzb25Db2RlKTsKLQotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJICAgICAgICAgICAgICBzaXplb2YoRlJBTUVfREVMQkFfUkVRKSwgICAgJkZyYW1lLAotCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKLQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSAuIDMgREVMQkEgc2VudC4gSW5pdGlhdG9yKCVkKVxuIiwgcEluZm8tPkluaXRpYXRvcikpOwotCX0KLX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotVk9JRCBNbG1lUU9TQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLX0KLQotVk9JRCBNbG1lRExTQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLX0KLQotVk9JRCBNbG1lSW52YWxpZEFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JLy9QVUNIQVIJCSAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCS8vUmV0dXJuIHRoZSByZWNlaXZpbmcgZnJhbWUgZXhjZXB0IHRoZSBNU0Igb2YgY2F0ZWdvcnkgZmlsZWQgc2V0IHRvIDEuICA3LjMuMS4xMQotfQotCi1WT0lEIFBlZXJRT1NBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotfQotCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi1WT0lEIFBlZXJETFNBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVDSEFSCUFjdGlvbiA9IEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzFdOwotCi0Jc3dpdGNoKEFjdGlvbikKLQl7Ci0JCWNhc2UgQUNUSU9OX0RMU19SRVFVRVNUOgotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCVBlZXJEbHNSZXFBY3Rpb24ocEFkLCBFbGVtKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNUSU9OX0RMU19SRVNQT05TRToKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQlQZWVyRGxzUnNwQWN0aW9uKHBBZCwgRWxlbSk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCQlicmVhazsKLQotCQljYXNlIEFDVElPTl9ETFNfVEVBUkRPV046Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJUGVlckRsc1RlYXJEb3duQWN0aW9uKHBBZCwgRWxlbSk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCQlicmVhazsKLQl9Ci19Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi1WT0lEIFBlZXJCQUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVUNIQVIJQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMV07Ci0KLQlzd2l0Y2goQWN0aW9uKQotCXsKLQkJY2FzZSBBRERCQV9SRVE6Ci0JCQlQZWVyQWRkQkFSZXFBY3Rpb24ocEFkLEVsZW0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgQUREQkFfUkVTUDoKLQkJCVBlZXJBZGRCQVJzcEFjdGlvbihwQWQsRWxlbSk7Ci0JCQlicmVhazsKLQkJY2FzZSBERUxCQToKLQkJCVBlZXJEZWxCQUFjdGlvbihwQWQsRWxlbSk7Ci0JCQlicmVhazsKLQl9Ci19Ci0KLQotI2lmZGVmIERPVDExTl9EUkFGVDMKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotVk9JRCBTdGFQdWJsaWNBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgQnNzMjA0MENvZXhpc3QpCi17Ci0JQlNTXzIwNDBfQ09FWElTVF9JRQkJQnNzQ29leGlzdDsKLQlNTE1FX1NDQU5fUkVRX1NUUlVDVAkJCVNjYW5SZXE7Ci0KLQlCc3NDb2V4aXN0LndvcmQgPSBCc3MyMDQwQ29leGlzdDsKLQkvLyBBUCBhc2tzIFN0YXRpb24gdG8gcmV0dXJuIGEgMjAvNDAgQlNTIENvZXhpc3RlbmNlIG1nbXQgZnJhbWUuICBTbyB3ZSBmaXJzdCBzdGFydHMgYSBzY2FuLCB0aGVuIHNlbmQgYmFjayAyMC80MCBCU1MgQ29leGlzdGVuY2UgbWdtdCBmcmFtZQotCWlmICgoQnNzQ29leGlzdC5maWVsZC5JbmZvUmVxID09IDEpICYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NDQU5fMjA0MCkpKQotCXsKLQkJLy8gQ2xlYXIgcmVjb3JkIGZpcnN0LiAgQWZ0ZXIgc2NhbiAsIHdpbGwgdXBkYXRlIHRob3NlIGJpdCBhbmQgc2VuZCBiYWNrIHRvIHRyYW5zbWl0ZXIuCi0JCXBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLmZpZWxkLkluZm9SZXEgPSAxOwotCQlwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC5maWVsZC5JbnRvbGVyYW50NDAgPSAwOwotCQlwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC5maWVsZC5CU1MyMFdpZHRoUmVxID0gMDsKLQkJLy8gRmlsbCBvdXQgc3R1ZmYgZm9yIHNjYW4gcmVxdWVzdAotCQlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgWmVyb1NzaWQsIDAsIEJTU19BTlksIFNDQU5fMjA0MF9CU1NfQ09FWElTVCk7Ci0JCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwgc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOwotCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47Ci0JfQotfQotCi0KLS8qCi1EZXNjcmlwdGlvbiA6IEJ1aWxkIEludG9sZXJhbnQgQ2hhbm5lbCBSZXJwb3QgZnJvbSBUcmlnZ2VyIGV2ZW50IHRhYmxlLgotcmV0dXJuIDogaG93IG1hbnkgYnl0ZXMgY29waWVkLgotKi8KLVVMT05HIEJ1aWxkSW50b2xlcmFudENoYW5uZWxSZXAoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gICAgUFVDSEFSICBwRGVzdCkKLXsKLQlVTE9ORwkJCUZyYW1lTGVuID0gMDsKLQlVTE9ORwkJCVJlYWRPZmZzZXQgPSAwOwotCVVDSEFSCQkJaTsKLQlVQ0hBUgkJCUxhc3RSZWdDbGFzcyA9IDB4ZmY7Ci0JUFVDSEFSCQkJcExlbjsKLQotCWZvciAoIGkgPSAwO2kgPCBNQVhfVFJJR0dFUl9FVkVOVDtpKyspCi0JewotCQlpZiAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5iVmFsaWQgPT0gVFJVRSkKLQkJewotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uUmVnQ2xhc3MgPT0gTGFzdFJlZ0NsYXNzKQotCQkJewotCQkJCSoocERlc3QgKyBSZWFkT2Zmc2V0KSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLkNoYW5uZWw7Ci0JCQkJKnBMZW4rKzsKLQkJCQlSZWFkT2Zmc2V0Kys7Ci0JCQkJRnJhbWVMZW4rKzsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkqKHBEZXN0ICsgUmVhZE9mZnNldCkgPSBJRV8yMDQwX0JTU19JTlRPTEVSQU5UX1JFUE9SVDsgIC8vIElFCi0JCQkJKihwRGVzdCArIFJlYWRPZmZzZXQgKyAxKSA9IDI7CS8vIExlbiA9IFJlZ0NsYXNzIGJ5dGUgKyBjaGFubmVsIGJ5dGUuCi0JCQkJcExlbiA9IHBEZXN0ICsgUmVhZE9mZnNldCArIDE7Ci0JCQkJTGFzdFJlZ0NsYXNzID0gcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5SZWdDbGFzczsKLQkJCQkqKHBEZXN0ICsgUmVhZE9mZnNldCArIDIpID0gTGFzdFJlZ0NsYXNzOwkvLyBMZW4gPSBSZWdDbGFzcyBieXRlICsgY2hhbm5lbCBieXRlLgotCQkJCSoocERlc3QgKyBSZWFkT2Zmc2V0ICsgMykgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5DaGFubmVsOwotCQkJCUZyYW1lTGVuICs9IDQ7Ci0JCQkJUmVhZE9mZnNldCArPSA0OwotCQkJfQotCi0JCX0KLQl9Ci0JcmV0dXJuIEZyYW1lTGVuOwotfQotCi0KLS8qCi1EZXNjcmlwdGlvbiA6IFNlbmQgMjAvNDAgQlNTIENvZXhpc3RlbmNlIEFjdGlvbiBmcmFtZSBJZiBvbmUgdHJpZ2dlciBldmVudCBpcyB0cmlnZ2VyZWQuCi0qLwotVk9JRCBTZW5kMjA0MENvZXhpc3RBY3Rpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gICAgVUNIQVIgIFdjaWQsCi0JSU4JQk9PTEVBTgliQWRkSW50b2xlcmFudENoYSkKLXsKLQlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUwlOU3RhdHVzOwotCUZSQU1FX0FDVElPTl9IRFIJRnJhbWU7Ci0JVUxPTkcJCQlGcmFtZUxlbjsKLQlVTE9ORwkJCUludG9sZXJhbnRDaGFSZXBMZW47Ci0KLQlJbnRvbGVyYW50Q2hhUmVwTGVuID0gMDsKLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQUNUIC0gU2VuZDIwNDBDb2V4aXN0QWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JRnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9QVUJMSUM7Ci0JRnJhbWUuQWN0aW9uID0gQUNUSU9OX0JTU18yMDQwX0NPRVhJU1Q7Ci0KLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCi0JCQkJICBzaXplb2YoRlJBTUVfQUNUSU9OX0hEUiksCSAgJkZyYW1lLAotCQkJCSAgRU5EX09GX0FSR1MpOwotCi0JKihwT3V0QnVmZmVyICsgRnJhbWVMZW4pID0gcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAud29yZDsKLQlGcmFtZUxlbisrOwotCi0JaWYgKGJBZGRJbnRvbGVyYW50Q2hhID09IFRSVUUpCi0JCUludG9sZXJhbnRDaGFSZXBMZW4gPSBCdWlsZEludG9sZXJhbnRDaGFubmVsUmVwKHBBZCwgcE91dEJ1ZmZlciArIEZyYW1lTGVuKTsKLQotCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiArIEludG9sZXJhbnRDaGFSZXBMZW4pOwotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQUNUIC0gU2VuZDIwNDBDb2V4aXN0QWN0aW9uKCBCU1NDb2V4aXN0MjA0MCA9IDB4JXggKSAgXG4iLCBwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC53b3JkKSk7Ci0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JQWZ0ZXIgc2NhbiwgVXBkYXRlIDIwLzQwIEJTUyBDb2V4aXN0ZW5jZSBJRSBhbmQgc2VuZCBvdXQuCi0JQWNjb3JkaW5nIHRvIDgwMi4xMW4gRDMuMDMgMTEuMTQuMTAKLQotCVBhcmFtZXRlcnM6Ci0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBVcGRhdGUyMDQwQ29leGlzdEZyYW1lQW5kTm90aWZ5KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICAgIFVDSEFSICBXY2lkLAotCUlOCUJPT0xFQU4JYkFkZEludG9sZXJhbnRDaGEpCi17Ci0JQlNTXzIwNDBfQ09FWElTVF9JRQlPbGRWYWx1ZTsKLQotCU9sZFZhbHVlLndvcmQgPSBwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC53b3JkOwotCWlmICgocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QU5vID4gMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEJDb3VudERvd24gPiAwKSkKLQkJcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAuZmllbGQuQlNTMjBXaWR0aFJlcSA9IDE7Ci0KLQkvLyBOZWVkIHRvIGNoZWNrICEhISEKLQkvLyBIb3cgU1RBIHdpbGwgc2V0IEludG9sZXJhbnQ0MCBpZiBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQuIE5vdyB3ZSBkb24ndCBzZXQgdGhpcyBiaXQgZmlyc3QuISEhISEKLQkvLyBTbyBPbmx5IGNoZWNrIEJTUzIwV2lkdGhSZXEgY2hhbmdlLgotCWlmIChPbGRWYWx1ZS5maWVsZC5CU1MyMFdpZHRoUmVxICE9IHBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLmZpZWxkLkJTUzIwV2lkdGhSZXEpCi0JewotCQlTZW5kMjA0MENvZXhpc3RBY3Rpb24ocEFkLCBXY2lkLCBiQWRkSW50b2xlcmFudENoYSk7Ci0JfQotfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLUJPT0xFQU4gQ2hhbm5lbFN3aXRjaFNhbml0eUNoZWNrKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICAgIFVDSEFSICBXY2lkLAotCUlOICAgIFVDSEFSICBOZXdDaGFubmVsLAotCUlOICAgIFVDSEFSICBTZWNvbmRhcnkpCi17Ci0JVUNIQVIJCWk7Ci0KLQlpZiAoV2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JaWYgKChOZXdDaGFubmVsID4gNykgJiYgKFNlY29uZGFyeSA9PSAxKSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JaWYgKChOZXdDaGFubmVsIDwgNSkgJiYgKFNlY29uZGFyeSA9PSAzKSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JLy8gMC4gQ2hlY2sgaWYgbmV3IGNoYW5uZWwgaXMgaW4gdGhlIGNoYW5uZWxsaXN0LgotCWZvciAoaSA9IDA7aSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07aSsrKQotCXsKLQkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCA9PSBOZXdDaGFubmVsKQotCQl7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChpID09IHBBZC0+Q2hhbm5lbExpc3ROdW0pCi0JCXJldHVybiBGQUxTRTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLVZPSUQgQ2hhbm5lbFN3aXRjaEFjdGlvbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiAgICBVQ0hBUiAgV2NpZCwKLQlJTiAgICBVQ0hBUiAgTmV3Q2hhbm5lbCwKLQlJTiAgICBVQ0hBUiAgU2Vjb25kYXJ5KQotewotCVVDSEFSCQlCQlBWYWx1ZSA9IDA7Ci0JVUxPTkcJCU1BQ1ZhbHVlOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTUEVDVFJVTSAtIENoYW5uZWxTd2l0Y2hBY3Rpb24oTmV3Q2hhbm5lbCA9ICVkICwgU2Vjb25kYXJ5ID0gJWQpICBcbiIsIE5ld0NoYW5uZWwsIFNlY29uZGFyeSkpOwotCi0JaWYgKENoYW5uZWxTd2l0Y2hTYW5pdHlDaGVjayhwQWQsIFdjaWQsIE5ld0NoYW5uZWwsIFNlY29uZGFyeSkgPT0gRkFMU0UpCi0JCXJldHVybjsKLQotCS8vIDEuICBTd2l0Y2hlcyB0byBCVyA9IDIwLgotCWlmIChTZWNvbmRhcnkgPT0gMCkKLQl7Ci0JCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKLQkJQkJQVmFsdWUmPSAofjB4MTgpOwotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7Ci0JCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKLQkJewotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIDB4MTYpOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIDB4MDgpOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIDB4MTEpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcnQyODYwQyAhISEgXG4iICkpOwotCQl9Ci0JCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOwotCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gTmV3Q2hhbm5lbDsKLQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwotCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsRkFMU0UpOwotCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5IVFBoeU1vZGUuZmllbGQuQlcgPSAwOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEyME1IeiAgICEhISBcbiIgKSk7Ci0JfQotCS8vIDEuICBTd2l0Y2hlcyB0byBCVyA9IDQwIEFuZCBTdGF0aW9uIHN1cHBvcnRzIEJXID0gNDAuCi0JZWxzZSBpZiAoKChTZWNvbmRhcnkgPT0gMSkgfHwgKFNlY29uZGFyeSA9PSAzKSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IDEpKQotCXsKLQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IE5ld0NoYW5uZWw7Ci0KLQkJaWYgKFNlY29uZGFyeSA9PSAxKQotCQl7Ci0JCQkvLyBTZWNvbmRhcnkgYWJvdmUuCi0JCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgKyAyOwotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJk1BQ1ZhbHVlKTsKLQkJCU1BQ1ZhbHVlICY9IDB4ZmU7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgTUFDVmFsdWUpOwotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOwotCQkJQkJQVmFsdWUmPSAofjB4MTgpOwotCQkJQkJQVmFsdWV8PSAoMHgxMCk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7Ci0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlBWYWx1ZSk7Ci0JCQlCQlBWYWx1ZSY9ICh+MHgyMCk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBWYWx1ZSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISE0ME1IeiBMb3dlciBMSU5LIFVQICEhISBDb250cm9sIENoYW5uZWwgYXQgQmVsb3cuIENlbnRyYWwgPSAlZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gU2Vjb25kYXJ5IGJlbG93LgotCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZNQUNWYWx1ZSk7Ci0JCQlNQUNWYWx1ZSAmPSAweGZlOwotCQkJTUFDVmFsdWUgfD0gMHgxOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIE1BQ1ZhbHVlKTsKLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKLQkJCUJCUFZhbHVlJj0gKH4weDE4KTsKLQkJCUJCUFZhbHVlfD0gKDB4MTApOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOwotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQVmFsdWUpOwotCQkJQkJQVmFsdWUmPSAofjB4MjApOwotCQkJQkJQVmFsdWV8PSAoMHgyMCk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBWYWx1ZSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISE0ME1IeiBVcHBlciBMSU5LIFVQICEhISBDb250cm9sIENoYW5uZWwgYXQgVXBwZXJDZW50cmFsID0gJWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCApKTsKLQkJfQotCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKLQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOwotCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uSFRQaHlNb2RlLmZpZWxkLkJXID0gMTsKLQl9Ci19Ci0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1WT0lEIFBlZXJQdWJsaWNBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotI2lmZGVmIERPVDExX05fU1VQUE9SVAotI2lmZGVmIERPVDExTl9EUkFGVDMKLQlVQ0hBUglBY3Rpb24gPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsxXTsKLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JaWYgKEVsZW0tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCi0JCXJldHVybjsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotI2lmZGVmIERPVDExTl9EUkFGVDMKLQlzd2l0Y2goQWN0aW9uKQotCXsKLQkJY2FzZSBBQ1RJT05fQlNTXzIwNDBfQ09FWElTVDoJLy8gRm9ybWF0IGRlZmluZWQgaW4gSUVFRSA3LjQuN2EuMSBpbiAxMW4gRHJhZjMuMDMKLQkJCXsKLQkJCQkvL1VDSEFSCUJzc0NvZXhpc3Q7Ci0JCQkJQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UCQkqcENvZXhpc3RJbmZvOwotCQkJCUJTU18yMDQwX0NPRVhJU1RfSUUJCQkqcEJzc0NvZXhpc3RJZTsKLQkJCQlCU1NfMjA0MF9JTlRPTEVSQU5UX0NIX1JFUE9SVAkqcEludG9sZXJhbnRSZXBvcnQgPSBOVUxMOwotCi0JCQkJaWYgKEVsZW0tPk1zZ0xlbiA8PSAoTEVOR1RIXzgwMl8xMSArIHNpemVvZihCU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQpKSApCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBQ1RJT04gLSAyMC80MCBCU1MgQ29leGlzdGVuY2UgTWFuYWdlbWVudCBGcmFtZSBsZW5ndGggdG9vIHNob3J0ISBsZW4gPSAlbGQhXG4iLCBFbGVtLT5Nc2dMZW4pKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFDVElPTiAtIDIwLzQwIEJTUyBDb2V4aXN0ZW5jZSBNYW5hZ2VtZW50IGFjdGlvbi0tLS0+IFxuIikpOwotCQkJCWhleF9kdW1wKCJDb2V4aXN0ZW5jZU1nbXRGcmFtZSIsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKTsKLQotCi0JCQkJcENvZXhpc3RJbmZvID0gKEJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVCAqKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl07Ci0JCQkJLy9oZXhfZHVtcCgiQ29leGlzdEluZm8iLCAoUFVDSEFSKXBDb2V4aXN0SW5mbywgc2l6ZW9mKEJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVCkpOwotCQkJCWlmIChFbGVtLT5Nc2dMZW4gPj0gKExFTkdUSF84MDJfMTEgKyBzaXplb2YoQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UKSArIHNpemVvZihCU1NfMjA0MF9JTlRPTEVSQU5UX0NIX1JFUE9SVCkpKQotCQkJCXsKLQkJCQkJcEludG9sZXJhbnRSZXBvcnQgPSAoQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQgKikoKFBVQ0hBUilwQ29leGlzdEluZm8gKyBzaXplb2YoQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UKSk7Ci0JCQkJfQotCQkJCS8vaGV4X2R1bXAoIkludG9sZXJhbnRSZXBvcnQgIiwgKFBVQ0hBUilwSW50b2xlcmFudFJlcG9ydCwgc2l6ZW9mKEJTU18yMDQwX0lOVE9MRVJBTlRfQ0hfUkVQT1JUKSk7Ci0KLQkJCQlwQnNzQ29leGlzdEllID0gKEJTU18yMDQwX0NPRVhJU1RfSUUgKikoJnBDb2V4aXN0SW5mby0+QnNzQ29leGlzdEllKTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQkJewotCQkJCQlpZiAoSU5GUkFfT04ocEFkKSkKLQkJCQkJewotCQkJCQkJU3RhUHVibGljQWN0aW9uKHBBZCwgcENvZXhpc3RJbmZvKTsKLQkJCQkJfQotCQkJCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCQkJfQotCQkJYnJlYWs7Ci0JfQotCi0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi19Ci0KLQotc3RhdGljIFZPSUQgUmVzZXJ2ZWRBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVDSEFSIENhdGVnb3J5OwotCi0JaWYgKEVsZW0tPk1zZ0xlbiA8PSBMRU5HVEhfODAyXzExKQotCXsKLQkJcmV0dXJuOwotCX0KLQotCUNhdGVnb3J5ID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTFdOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUmN2IHJlc2VydmVkIGNhdGVnb3J5KCVkKSBBY3Rpb24gRnJhbWVcbiIsIENhdGVnb3J5KSk7Ci0JaGV4X2R1bXAoIlJlc2VydmVkIEFjdGlvbiBGcmFtZSIsICZFbGVtLT5Nc2dbMF0sIEVsZW0tPk1zZ0xlbik7Ci19Ci0KLVZPSUQgUGVlclJNQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLQotewotCXJldHVybjsKLX0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotc3RhdGljIFZPSUQgcmVzcG9uZF9odF9pbmZvcm1hdGlvbl9leGNoYW5nZV9hY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOwotCU5ESVNfU1RBVFVTCQlOU3RhdHVzOwotCVVMT05HCQkJRnJhbWVMZW47Ci0JRlJBTUVfSFRfSU5GTwlIVElORk9mcmFtZSwgKnBGcmFtZTsKLQlVQ0hBUgkJCSpwQWRkcjsKLQotCi0JLy8gMi4gQWx3YXlzIHNlbmQgYmFjayBBRERCQSBSZXNwb25zZQotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CSAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0KLQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSByZXNwb25kX2h0X2luZm9ybWF0aW9uX2V4Y2hhbmdlX2FjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyBnZXQgUkEKLQlwRnJhbWUgPSAoRlJBTUVfSFRfSU5GTyAqKSAmRWxlbS0+TXNnWzBdOwotCXBBZGRyID0gcEZyYW1lLT5IZHIuQWRkcjI7Ci0KLQlOZGlzWmVyb01lbW9yeSgmSFRJTkZPZnJhbWUsIHNpemVvZihGUkFNRV9IVF9JTkZPKSk7Ci0JLy8gMi0xLiBQcmVwYXJlIEFEREJBIFJlc3BvbnNlIGZyYW1lLgotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlpZiAoQURIT0NfT04ocEFkKSkKLQkJCUFjdEhlYWRlckluaXQocEFkLCAmSFRJTkZPZnJhbWUuSGRyLCBwQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQllbHNlCi0JCUFjdEhlYWRlckluaXQocEFkLCAmSFRJTkZPZnJhbWUuSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkZHIpOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCUhUSU5GT2ZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfSFQ7Ci0JSFRJTkZPZnJhbWUuQWN0aW9uID0gSFRfSU5GT19FWENIQU5HRTsKLQlIVElORk9mcmFtZS5IVF9JbmZvLlJlcXVlc3QgPSAwOwotCUhUSU5GT2ZyYW1lLkhUX0luZm8uRm9ydHlfTUh6X0ludG9sZXJhbnQgPSBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkZvcnR5X01oel9JbnRvbGVyYW50OwotCUhUSU5GT2ZyYW1lLkhUX0luZm8uU1RBX0NoYW5uZWxfV2lkdGgJID0gcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoOwotCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJCSZGcmFtZUxlbiwKLQkJCQkJICBzaXplb2YoRlJBTUVfSFRfSU5GTyksCSZIVElORk9mcmFtZSwKLQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0KLQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci19Ci0KLQotI2lmZGVmIERPVDExTl9EUkFGVDMKLVZPSUQgU2VuZE5vdGlmeUJXQWN0aW9uRnJhbWUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgIFdjaWQsCi0JSU4gVUNIQVIgYXBpZHgpCi17Ci0JUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7Ci0JTkRJU19TVEFUVVMJTlN0YXR1czsKLQlGUkFNRV9BQ1RJT05fSERSCUZyYW1lOwotCVVMT05HCQkJRnJhbWVMZW47Ci0JUFVDSEFSCQkJcEFkZHIxOwotCi0KLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQUNUIC0gU2VuZE5vdGlmeUJXQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChXY2lkID09IE1DQVNUX1dDSUQpCi0JCXBBZGRyMSA9ICZCUk9BRENBU1RfQUREUlswXTsKLQllbHNlCi0JCXBBZGRyMSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcjsKLQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEFkZHIxLCBwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uQnNzaWQsIHBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5Cc3NpZCk7Ci0KLQlGcmFtZS5DYXRlZ29yeSA9IENBVEVHT1JZX0hUOwotCUZyYW1lLkFjdGlvbiA9IE5PVElGWV9CV19BQ1RJT047Ci0KLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCi0JCQkJICBzaXplb2YoRlJBTUVfQUNUSU9OX0hEUiksCSAgJkZyYW1lLAotCQkJCSAgRU5EX09GX0FSR1MpOwotCi0JKihwT3V0QnVmZmVyICsgRnJhbWVMZW4pID0gcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoOwotCUZyYW1lTGVuKys7Ci0KLQotCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1QgLSBTZW5kTm90aWZ5QldBY3Rpb24oTm90aWZ5Qlc9ICVkKSFcbiIsIHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCkpOwotCi19Ci0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotCi0KLVZPSUQgUGVlckhUQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVQ0hBUglBY3Rpb24gPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsxXTsKLQotCWlmIChFbGVtLT5XY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQotCQlyZXR1cm47Ci0KLQlzd2l0Y2goQWN0aW9uKQotCXsKLQkJY2FzZSBOT1RJRllfQldfQUNUSU9OOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSBIVCBOb3RpZnkgQ2hhbm5lbCBiYW5kd2lkdGggYWN0aW9uLS0tLT4gXG4iKSk7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQlpZihwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBGQUxTRSkKLQkJCXsKLQkJCQkvLyBOb3RlLCB0aGlzIGlzIHRvIHBhdGNoIERJUi0xMzUzIEFQLiBXaGVuIHRoZSBBUCBzZXQgdG8gV2VwLCBpdCB3aWxsIHVzZSBsZWdhY3kgbW9kZS4gQnV0IEFQIHN0aWxsIGtlZXBzCi0JCQkJLy8gc2VuZGluZyBCV19Ob3RpZnkgQWN0aW9uIGZyYW1lLCBhbmQgY2F1c2UgdXMgdG8gbGlua3VwIGFuZCBsaW5rZG93bi4KLQkJCQkvLyBJbiBsZWdhY3kgbW9kZSwgZG9uJ3QgbmVlZCB0byBwYXJzZSBIVCBhY3Rpb24gZnJhbWUuCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLUlnbm9yZSBIVCBOb3RpZnkgQ2hhbm5lbCBCVyB3aGVuIGxpbmsgYXMgbGVnYWN5IG1vZGUuIEJXID0gJWQtLS0+IFxuIiwKLQkJCQkJCQkJRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl0gKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkJCWlmIChFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsyXSA9PSAwKQkvLyA3LjQuOC4yLiBpZiB2YWx1ZSBpcyAxLCBrZWVwIHRoZSBzYW1lIGFzIHN1cHBvcnRlZCBjaGFubmVsIGJhbmR3aWR0aC4KLQkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLkhUUGh5TW9kZS5maWVsZC5CVyA9IDA7Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgU01QU19BQ1RJT046Ci0JCQkvLyA3LjMuMS4yNQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSBTTVBTIGFjdGlvbi0tLS0+IFxuIikpOwotCQkJaWYgKCgoRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl0mMHgxKSA9PSAwKSkKLQkJCXsKLQkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLk1tcHNNb2RlID0gTU1QU19FTkFCTEU7Ci0JCQl9Ci0JCQllbHNlIGlmICgoKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdJjB4MikgPT0gMCkpCi0JCQl7Ci0JCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5NbXBzTW9kZSA9IE1NUFNfU1RBVElDOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uTW1wc01vZGUgPSBNTVBTX0RZTkFNSUM7Ci0JCQl9Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQWlkKCVkKSBNSU1PIFBTID0gJWRcbiIsIEVsZW0tPldjaWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uTW1wc01vZGUpKTsKLQkJCS8vIHJ0Mjg2MGMgOiBhZGQgc29tZXRoaW5nIGZvciBzbXBzIGNoYW5nZS4KLQkJCWJyZWFrOwotCi0JCWNhc2UgU0VUUENPX0FDVElPTjoKLQkJCWJyZWFrOwotCi0JCWNhc2UgTUlNT19DSEFfTUVBU1VSRV9BQ1RJT046Ci0JCQlicmVhazsKLQotCQljYXNlIEhUX0lORk9fRVhDSEFOR0U6Ci0JCQl7Ci0JCQkJSFRfSU5GT1JNQVRJT05fT0NURVQJKnBIVF9pbmZvOwotCi0JCQkJcEhUX2luZm8gPSAoSFRfSU5GT1JNQVRJT05fT0NURVQgKikgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdOwotCQkJCS8vIDcuNC44LjEwCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSBIVCBJbmZvcm1hdGlvbiBFeGNoYW5nZSBhY3Rpb24tLS0tPiBcbiIpKTsKLQkJCQlpZiAocEhUX2luZm8tPlJlcXVlc3QpCi0JCQkJewotCQkJCQlyZXNwb25kX2h0X2luZm9ybWF0aW9uX2V4Y2hhbmdlX2FjdGlvbihwQWQsIEVsZW0pOwotCQkJCX0KLQkJCX0KLQkJYnJlYWs7Ci0JfQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJUmV0cnkgc2VuZGluZyBBRERCQSBSZXFlc3QuCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCVBhcmFtZXRyczoKLQlwODAyM0hlYWRlcjogaWYgdGhpcyBpcyBhbHJlYWR5IDgwMi4zIGZvcm1hdCwgcDgwMjNIZWFkZXIgaXMgTlVMTAotCi0JUmV0dXJuCTogVFJVRSBpZiBwdXQgaW50byByeCByZW9yZGVyaW5nIGJ1ZmZlciwgc2hvdWxkbid0IGluZGljYXRlcnhoZXJlLgotCQkJCUZBTFNFICwgdGhlbiBjb250aW51ZSBpbmRpY2F0ZXJ4IGF0IHRoaXMgbW9tZW50LgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgT1JJQkFUaW1lclRpbWVvdXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnk7Ci0JSU5UCQkJaSwgdG90YWw7Ci0vLwlGUkFNRV9CQVIJCQlGcmFtZUJhcjsKLS8vCVVMT05HCQkJRnJhbWVMZW47Ci0vLwlORElTX1NUQVRVUwlOU3RhdHVzOwotLy8JUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7Ci0vLwlVU0hPUlQJCQlTZXF1ZW5jZTsKLQlVQ0hBUgkJCVRJRDsKLQotI2lmZGVmIFJBTElOS19BVEUKLQlpZiAoQVRFX09OKHBBZCkpCi0JCXJldHVybjsKLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLQl0b3RhbCA9IHBBZC0+TWFjVGFiLlNpemUgKiBOVU1fT0ZfVElEOwotCi0JZm9yIChpID0gMTsgKChpIDxNQVhfTEVOX09GX0JBX09SSV9UQUJMRSkgJiYgKHRvdGFsID4gMCkpIDsgaSsrKQotCXsKLQkJaWYgIChwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXS5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfRG9uZSkKLQkJewotCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaV0uV2NpZF07Ci0JCQlUSUQgPSBwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXS5USUQ7Ci0KLQkJCUFTU0VSVChwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXS5XY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpOwotCQl9Ci0JCXRvdGFsIC0tOwotCX0KLX0KLQotCi1WT0lEIFNlbmRSZWZyZXNoQkFSKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5KQotewotCUZSQU1FX0JBUgkJRnJhbWVCYXI7Ci0JVUxPTkcJCQlGcmFtZUxlbjsKLQlORElTX1NUQVRVUwlOU3RhdHVzOwotCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOwotCVVTSE9SVAkJCVNlcXVlbmNlOwotCVVDSEFSCQkJaSwgVElEOwotCVVTSE9SVAkJCWlkeDsKLQlCQV9PUklfRU5UUlkJKnBCQUVudHJ5OwotCi0JZm9yIChpID0gMDsgaSA8TlVNX09GX1RJRDsgaSsrKQotCXsKLQkJaWR4ID0gcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtpXTsKLQkJaWYgKGlkeCA9PSAwKQotCQl7Ci0JCQljb250aW51ZTsKLQkJfQotCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpZHhdOwotCi0JCWlmICAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKQotCQl7Ci0JCQlUSUQgPSBwQkFFbnRyeS0+VElEOwotCi0JCQlBU1NFUlQocEJBRW50cnktPldjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSk7Ci0KLQkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JCQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJCQSAtIE1sbWVBRERCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlTZXF1ZW5jZSA9IHBFbnRyeS0+VHhTZXFbVElEXTsKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJCUJhckhlYWRlckluaXQocEFkLCAmRnJhbWVCYXIsIHBFbnRyeS0+QWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkJCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLkZyYWdOdW0gPSAwOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jdGlvbi4KLQkJCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxID0gU2VxdWVuY2U7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgotCQkJRnJhbWVCYXIuQmFyQ29udHJvbC5USUQgPSBUSUQ7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgotCi0JCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCi0JCQkJCQkJICBzaXplb2YoRlJBTUVfQkFSKSwJICAmRnJhbWVCYXIsCi0JCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQkvL2lmICghKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQpKSkKLQkJCWlmICgxKQkvLyBOb3cgd2UgYWx3YXlzIHNlbmQgQkFSLgotCQkJewotCQkJCS8vTWluaXBvcnRNTVJlcXVlc3RVbmxvY2socEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAoTUdNVF9VU0VfUVVFVUVfRkxBRyB8IE1hcFVzZXJQcmlvcml0eVRvQWNjZXNzQ2F0ZWdvcnlbVElEXSksIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQotCQkJfQotCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQkJfQotCX0KLX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotVk9JRCBBY3RIZWFkZXJJbml0KAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAotICAgIElOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCi0gICAgSU4gUFVDSEFSIEFkZHIxLAotICAgIElOIFBVQ0hBUiBBZGRyMiwKLSAgICBJTiBQVUNIQVIgQWRkcjMpCi17Ci0gICAgTmRpc1plcm9NZW1vcnkocEhkcjgwMjExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotICAgIHBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX01HTVQ7Ci0gICAgcEhkcjgwMjExLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9BQ1RJT047Ci0KLSAgICBDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjEsIEFkZHIxKTsKLQlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjIsIEFkZHIyKTsKLSAgICBDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIEFkZHIzKTsKLX0KLQotVk9JRCBCYXJIZWFkZXJJbml0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOIE9VVCBQRlJBTUVfQkFSIHBDbnRsQmFyLAotCUlOIFBVQ0hBUiBwREEsCi0JSU4gUFVDSEFSIHBTQSkKLXsKLS8vCVVTSE9SVAlEdXJhdGlvbjsKLQotCU5kaXNaZXJvTWVtb3J5KHBDbnRsQmFyLCBzaXplb2YoRlJBTUVfQkFSKSk7Ci0JcENudGxCYXItPkZDLlR5cGUgPSBCVFlQRV9DTlRMOwotCXBDbnRsQmFyLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9CTE9DS19BQ0tfUkVROwotCXBDbnRsQmFyLT5CYXJDb250cm9sLk1USUQgPSAwOwotCXBDbnRsQmFyLT5CYXJDb250cm9sLkNvbXByZXNzZWQgPSAxOwotCXBDbnRsQmFyLT5CYXJDb250cm9sLkFDS1BvbGljeSA9IDA7Ci0KLQotCXBDbnRsQmFyLT5EdXJhdGlvbiA9IDE2ICsgUlRNUENhbGNEdXJhdGlvbihwQWQsIFJBVEVfMSwgc2l6ZW9mKEZSQU1FX0JBKSk7Ci0KLQlDT1BZX01BQ19BRERSKHBDbnRsQmFyLT5BZGRyMSwgcERBKTsKLQlDT1BZX01BQ19BRERSKHBDbnRsQmFyLT5BZGRyMiwgcFNBKTsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUluc2VydCBDYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUgaW50byB0aGUgYWN0aW9uIGZyYW1lLgotCi0JUGFyYW1ldHJzOgotCQkxLiBmcmFtZSBidWZmZXIgcG9pbnRlci4KLQkJMi4gZnJhbWUgbGVuZ3RoLgotCQkzLiBjYXRlZ29yeSBjb2RlIG9mIHRoZSBmcmFtZS4KLQkJNC4gYWN0aW9uIGNvZGUgb2YgdGhlIGZyYW1lLgotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEluc2VydEFjdEZpZWxkKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAotCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAotCUlOIFVJTlQ4IENhdGVnb3J5LAotCUlOIFVJTlQ4IEFjdENvZGUpCi17Ci0JVUxPTkcgVGVtcExlbjsKLQotCU1ha2VPdXRnb2luZ0ZyYW1lKAlwRnJhbWVCdWYsCQkmVGVtcExlbiwKLQkJCQkJCTEsCQkJCSZDYXRlZ29yeSwKLQkJCQkJCTEsCQkJCSZBY3RDb2RlLAotCQkJCQkJRU5EX09GX0FSR1MpOwotCi0JKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOwotCi0JcmV0dXJuOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vYmFfYWN0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9iYV9hY3Rpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzczMjQ4OS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9iYV9hY3Rpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDE3NzkgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi0jZGVmaW5lIEJBX09SSV9JTklUX1NFUQkJKHBFbnRyeS0+VHhTZXFbVElEXSkgLy8xCQkJLy8gaW5pdGFsIHNlcXVlbmNlIG51bWJlciBvZiBCQSBzZXNzaW9uCi0KLSNkZWZpbmUgT1JJX1NFU1NJT05fTUFYX1JFVFJZCTgKLSNkZWZpbmUgT1JJX0JBX1NFU1NJT05fVElNRU9VVAkoMjAwMCkJLy8gbXMKLSNkZWZpbmUgUkVDX0JBX1NFU1NJT05fSURMRV9USU1FT1VUCSgxMDAwKQkvLyBtcwotCi0jZGVmaW5lIFJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQJCSgoMTAwICogT1NfSFopLzEwMDApCS8vIHN5c3RlbSB0aWNrcyAtLSAxMDAgbXMKLSNkZWZpbmUgTUFYX1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQJKCgzMDAwICogT1NfSFopLzEwMDApCS8vIHN5c3RlbSB0aWNrcyAtLSAxMDAgbXMKLQotI2RlZmluZSBSRVNFVF9SQ1ZfU0VRCQkoMHhGRkZGKQotCi1zdGF0aWMgdm9pZCBiYV9tcGR1X2Jsa19mcmVlKFBSVE1QX0FEQVBURVIgcEFkLCBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2Jsayk7Ci0KLQotQkFfT1JJX0VOVFJZICpCQVRhYmxlQWxsb2NPcmlFbnRyeSgKLQkJCQkJCQkJICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQkJCQkJCQkJICBPVVQgVVNIT1JUICAgICAgICAgICpJZHgpOwotCi1CQV9SRUNfRU5UUlkgKkJBVGFibGVBbGxvY1JlY0VudHJ5KAotCQkJCQkJCQkgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCQkJCQkJCQkgIE9VVCBVU0hPUlQgICAgICAgICAgKklkeCk7Ci0KLVZPSUQgQkFPcmlTZXNzaW9uU2V0dXBUaW1lb3V0KAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLSAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Ci0KLVZPSUQgQkFSZWNTZXNzaW9uSWRsZVRpbWVvdXQoCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotCi1CVUlMRF9USU1FUl9GVU5DVElPTihCQU9yaVNlc3Npb25TZXR1cFRpbWVvdXQpOwotQlVJTERfVElNRVJfRlVOQ1RJT04oQkFSZWNTZXNzaW9uSWRsZVRpbWVvdXQpOwotCi0jZGVmaW5lIEFOTk9VTkNFX1JFT1JERVJJTkdfUEFDS0VUKF9wQWQsIF9tcGR1X2JsaykJXAotCQkJQW5ub3VuY2VfUmVvcmRlcmluZ19QYWNrZXQoX3BBZCwgX21wZHVfYmxrKTsKLQotVk9JRCBCQV9NYXhXaW5TaXplUmVhc2lnbigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnlQZWVyLAotCU9VVCBVQ0hBUgkJCSpwV2luU2l6ZSkKLXsKLQlVQ0hBUiBNYXhTaXplOwotCi0KLQlpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgzX1ZFUlNJT04pIC8vIDMqMwotCXsKLQkJaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMzA3MF9WRVJTSU9OKQotCQl7Ci0JCQlpZiAocEVudHJ5UGVlci0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpCi0JCQkJTWF4U2l6ZSA9IDc7IC8vIGZvciBub24tb3BlbiBtb2RlCi0JCQllbHNlCi0JCQkJTWF4U2l6ZSA9IDEzOwotCQl9Ci0JCWVsc2UKLQkJCU1heFNpemUgPSAzMTsKLQl9Ci0JZWxzZSBpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgwRV9WRVJTSU9OKSAvLyAyODgwIGUKLQl7Ci0JCWlmIChwRW50cnlQZWVyLT5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkKLQkJCU1heFNpemUgPSA3OyAvLyBmb3Igbm9uLW9wZW4gbW9kZQotCQllbHNlCi0JCQlNYXhTaXplID0gMTM7Ci0JfQotCWVsc2UKLQkJTWF4U2l6ZSA9IDc7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJiYT4gV2luIFNpemUgPSAlZCwgTWF4IFNpemUgPSAlZFxuIiwKLQkJCSpwV2luU2l6ZSwgTWF4U2l6ZSkpOwotCi0JaWYgKCgqcFdpblNpemUpID4gTWF4U2l6ZSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImJhPiByZWFzc2lnbiBtYXggd2luIHNpemUgZnJvbSAlZCB0byAlZFxuIiwKLQkJCQkqcFdpblNpemUsIE1heFNpemUpKTsKLQotCQkqcFdpblNpemUgPSBNYXhTaXplOwotCX0KLX0KLQotdm9pZCBBbm5vdW5jZV9SZW9yZGVyaW5nX1BhY2tldChJTiBQUlRNUF9BREFQVEVSCQkJcEFkLAotCQkJCQkJCQlJTiBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1CSptcGR1KQotewotCVBORElTX1BBQ0tFVCAgICBwUGFja2V0OwotCi0JcFBhY2tldCA9IG1wZHUtPnBQYWNrZXQ7Ci0KLQlpZiAobXBkdS0+YkFNU0RVKQotCXsKLQkJQVNTRVJUKDApOwotCQlCQV9SZW9yZGVyX0FNU0RVX0Fubm5vdW5jZShwQWQsIHBQYWNrZXQpOwotCX0KLQllbHNlCi0JewotCQkvLwotCQkvLyBwYXNzIHRoaXMgODAyLjMgcGFja2V0IHRvIHVwcGVyIGxheWVyIG9yIGZvcndhcmQgdGhpcyBwYWNrZXQgdG8gV00gZGlyZWN0bHkKLQkJLy8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwUGFja2V0LCBSVE1QX0dFVF9QQUNLRVRfSUYocFBhY2tldCkpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCX0KLX0KLQotLyoKLSAqIEluc2VydCBhIHJlb3JkZXJpbmcgbXBkdSBpbnRvIHNvcnRlZCBsaW5rZWQgbGlzdCBieSBzZXF1ZW5jZSBuby4KLSAqLwotQk9PTEVBTiBiYV9yZW9yZGVyaW5nX21wZHVfaW5zZXJ0c29ydGVkKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QsIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHUpCi17Ci0KLQlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICoqcHBTY2FuID0gJmxpc3QtPm5leHQ7Ci0KLQl3aGlsZSAoKnBwU2NhbiAhPSBOVUxMKQotCXsKLQkJaWYgKFNFUV9TTUFMTEVSKCgqcHBTY2FuKS0+U2VxdWVuY2UsIG1wZHUtPlNlcXVlbmNlLCBNQVhTRVEpKQotCQl7Ci0JCQlwcFNjYW4gPSAmKCpwcFNjYW4pLT5uZXh0OwotCQl9Ci0JCWVsc2UgaWYgKCgqcHBTY2FuKS0+U2VxdWVuY2UgPT0gbXBkdS0+U2VxdWVuY2UpCi0JCXsKLQkJCS8qIGdpdmUgdXAgdGhpcyBkdXBsaWNhdGVkIGZyYW1lICovCi0JCQlyZXR1cm4oRkFMU0UpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLyogZmluZCBwb3NpdGlvbiAqLwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQltcGR1LT5uZXh0ID0gKnBwU2NhbjsKLQkqcHBTY2FuID0gbXBkdTsKLQlsaXN0LT5xbGVuKys7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIGNhbGxlciBsb2NrIGNyaXRpY2FsIHNlY3Rpb24gaWYgbmVjZXNzYXJ5Ci0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBiYV9lbnF1ZXVlKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QsIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrKQotewotCWxpc3QtPnFsZW4rKzsKLQltcGR1X2Jsay0+bmV4dCA9IGxpc3QtPm5leHQ7Ci0JbGlzdC0+bmV4dCA9IG1wZHVfYmxrOwotfQotCi0vKgotICogY2FsbGVyIGxvY2sgY3JpdGljYWwgc2VjdGlvbiBpZiBuZWNlc3NhcnkKLSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICogYmFfZGVxdWV1ZShzdHJ1Y3QgcmVvcmRlcmluZ19saXN0ICpsaXN0KQotewotCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrID0gTlVMTDsKLQotCUFTU0VSVChsaXN0KTsKLQotCQlpZiAobGlzdC0+cWxlbikKLQkJewotCQkJbGlzdC0+cWxlbi0tOwotCQkJbXBkdV9ibGsgPSBsaXN0LT5uZXh0OwotCQkJaWYgKG1wZHVfYmxrKQotCQkJewotCQkJCWxpc3QtPm5leHQgPSBtcGR1X2Jsay0+bmV4dDsKLQkJCQltcGR1X2Jsay0+bmV4dCA9IE5VTEw7Ci0JCQl9Ci0JCX0KLQlyZXR1cm4gbXBkdV9ibGs7Ci19Ci0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICAqYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoc3RydWN0IHJlb3JkZXJpbmdfbGlzdCAqbGlzdCkKLXsKLQlyZXR1cm4oYmFfZGVxdWV1ZShsaXN0KSk7Ci19Ci0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICAqYmFfcmVvcmRlcmluZ19tcGR1X3Byb2JlKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QpCi0JewotCUFTU0VSVChsaXN0KTsKLQotCQlyZXR1cm4obGlzdC0+bmV4dCk7Ci0JfQotCi0KLS8qCi0gKiBmcmVlIGFsbCByZXNvdXJjZSBmb3IgcmVvcmRlcmluZyBtZWNoYW5pc20KLSAqLwotdm9pZCBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JQkFfVEFCTEUgICAgICAgICpUYWI7Ci0JUEJBX1JFQ19FTlRSWSAgIHBCQUVudHJ5OwotCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOwotCWludCBpOwotCi0JVGFiID0gJnBBZC0+QkFUYWJsZTsKLQotCS8qIEkuICByZWxlYXNlIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgcGFja2V0ICovCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRTsgaSsrKQotCXsKLQkJcEJBRW50cnkgPSAmVGFiLT5CQVJlY0VudHJ5W2ldOwotCQlpZiAocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgIT0gUmVjaXBpZW50X05PTkUpCi0JCXsKLQkJCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfZGVxdWV1ZSgmcEJBRW50cnktPmxpc3QpKSkKLQkJCXsKLQkJCQlBU1NFUlQobXBkdV9ibGstPnBQYWNrZXQpOwotCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBtcGR1X2Jsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKLQkJCX0KLQkJfQotCX0KLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7Ci0KLQlBU1NFUlQocEJBRW50cnktPmxpc3QucWxlbiA9PSAwKTsKLQkvKiBJSS4gZnJlZSBtZW1vcnkgb2YgcmVvcmRlcmluZyBtcGR1IHRhYmxlICovCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOwotCW9zX2ZyZWVfbWVtKHBBZCwgcEFkLT5tcGR1X2Jsa19wb29sLm1lbSk7Ci0JTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOwotfQotCi0KLQotLyoKLSAqIEFsbG9jYXRlIGFsbCByZXNvdXJjZSBmb3IgcmVvcmRlcmluZyBtZWNoYW5pc20KLSAqLwotQk9PTEVBTiBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX2luaXQoUFJUTVBfQURBUFRFUiBwQWQsIGludCBudW0pCi17Ci0JaW50ICAgICBpOwotCVBVQ0hBUiAgbWVtOwotCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOwotCXN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmZyZWVsaXN0OwotCi0JLyogYWxsb2NhdGUgc3BpbmxvY2sgKi8KLQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOwotCi0JLyogaW5pdGlhbGl6ZSBmcmVlbGlzdCAqLwotCWZyZWVsaXN0ID0gJnBBZC0+bXBkdV9ibGtfcG9vbC5mcmVlbGlzdDsKLQlmcmVlbGlzdC0+bmV4dCA9IE5VTEw7Ci0JZnJlZWxpc3QtPnFsZW4gPSAwOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWxsb2NhdGUgJWQgbWVtb3J5IGZvciBCQSByZW9yZGVyaW5nXG4iLCAoVUlOVDMyKShudW0qc2l6ZW9mKHN0cnVjdCByZW9yZGVyaW5nX21wZHUpKSkpOwotCi0JLyogYWxsb2NhdGUgbnVtYmVyIG9mIG1wZHVfYmxrIG1lbW9yeSAqLwotCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmbWVtLCAobnVtKnNpemVvZihzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1KSkpOwotCi0JcEFkLT5tcGR1X2Jsa19wb29sLm1lbSA9IG1lbTsKLQotCWlmIChtZW0gPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkNhbid0IEFsbG9jYXRlIE1lbW9yeSBmb3IgQkEgUmVvcmRlcmluZ1xuIikpOwotCQlyZXR1cm4oRkFMU0UpOwotCX0KLQotCS8qIGJ1aWxkIG1wZHVfYmxrIGZyZWUgbGlzdCAqLwotCWZvciAoaT0wOyBpPG51bTsgaSsrKQotCXsKLQkJLyogZ2V0IG1wZHVfYmxrICovCi0JCW1wZHVfYmxrID0gKHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKikgbWVtOwotCQkvKiBpbml0aWFsIG1wZHVfYmxrICovCi0JCU5kaXNaZXJvTWVtb3J5KG1wZHVfYmxrLCBzaXplb2Yoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSkpOwotCQkvKiBuZXh0IG1wZHVfYmxrICovCi0JCW1lbSArPSBzaXplb2Yoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSk7Ci0JCS8qIGluc2VydCBtcGR1X2JsayBpbnRvIGZyZWVsaXN0ICovCi0JCWJhX2VucXVldWUoZnJlZWxpc3QsIG1wZHVfYmxrKTsKLQl9Ci0KLQlyZXR1cm4oVFJVRSk7Ci19Ci0KLS8vc3RhdGljIGludCBibGtfY291bnQ9MDsgLy8gc2FtcGxlIHRha2Ugb2ZmLCBubyB1c2UKLQotc3RhdGljIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKmJhX21wZHVfYmxrX2FsbG9jKFBSVE1QX0FEQVBURVIgcEFkKQotewotCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOwotCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOwotCW1wZHVfYmxrID0gYmFfZGVxdWV1ZSgmcEFkLT5tcGR1X2Jsa19wb29sLmZyZWVsaXN0KTsKLQlpZiAobXBkdV9ibGspCi0JewotLy8JCWJsa19jb3VudCsrOwotCQkvKiByZXNldCBtcGR1X2JsayAqLwotCQlOZGlzWmVyb01lbW9yeShtcGR1X2Jsaywgc2l6ZW9mKHN0cnVjdCByZW9yZGVyaW5nX21wZHUpKTsKLQl9Ci0JTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOwotCXJldHVybiBtcGR1X2JsazsKLX0KLQotc3RhdGljIHZvaWQgYmFfbXBkdV9ibGtfZnJlZShQUlRNUF9BREFQVEVSIHBBZCwgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGspCi17Ci0JQVNTRVJUKG1wZHVfYmxrKTsKLQotCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKLS8vCWJsa19jb3VudC0tOwotCWJhX2VucXVldWUoJnBBZC0+bXBkdV9ibGtfcG9vbC5mcmVlbGlzdCwgbXBkdV9ibGspOwotCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKLX0KLQotCi1zdGF0aWMgVVNIT1JUIGJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfaW5fb3JkZXIoCi0JCQkJCQkJCQkJCQkgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQkJCQkJCQkJCQkJCSAgIElOIFBCQV9SRUNfRU5UUlkgICAgcEJBRW50cnksCi0JCQkJCQkJCQkJCQkgICBJTiBVU0hPUlQgICAgICAgICAgIFN0YXJ0U2VxKQotewotCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOwotCVVTSE9SVCAgTGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7Ci0KLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKLQotCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfcHJvYmUoJnBCQUVudHJ5LT5saXN0KSkpCi0JCXsKLQkJCS8qIGZpbmQgaW4tb3JkZXIgZnJhbWUgKi8KLQkJaWYgKCFTRVFfU1RFUE9ORShtcGR1X2Jsay0+U2VxdWVuY2UsIFN0YXJ0U2VxLCBNQVhTRVEpKQotCQkJewotCQkJCWJyZWFrOwotCQkJfQotCQkJLyogZGVxdWV1ZSBpbi1vcmRlciBmcmFtZSBmcm9tIHJlb2RlcmluZyBsaXN0ICovCi0JCQltcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9kZXF1ZXVlKCZwQkFFbnRyeS0+bGlzdCk7Ci0JCQkvKiBwYXNzIHRoaXMgZnJhbWUgdXAgKi8KLQkJQU5OT1VOQ0VfUkVPUkRFUklOR19QQUNLRVQocEFkLCBtcGR1X2Jsayk7Ci0JCS8qIG1vdmUgdG8gbmV4dCBzZXF1ZW5jZSAqLwotCQkJU3RhcnRTZXEgPSBtcGR1X2Jsay0+U2VxdWVuY2U7Ci0JCUxhc3RJbmRTZXEgPSBTdGFydFNlcTsKLQkJLyogZnJlZSBtcGR1X2JsayAqLwotCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKLQl9Ci0KLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKLQotCS8qIHVwZGF0ZSBsYXN0IGluZGljYXRlZCBzZXF1ZW5jZSAqLwotCXJldHVybiBMYXN0SW5kU2VxOwotfQotCi1zdGF0aWMgdm9pZCBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcSgKLQkJCQkJCQkJCQkJICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JCQkJCQkJCQkJCSAgIElOIFBCQV9SRUNfRU5UUlkgICAgcEJBRW50cnksCi0JCQkJCQkJCQkJCSAgIElOIFVTSE9SVCAgICAgICAgICAgU2VxdWVuY2UpCi17Ci0Jc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGs7Ci0KLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKLQl3aGlsZSAoKG1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X3Byb2JlKCZwQkFFbnRyeS0+bGlzdCkpKQotCQl7Ci0JCQkvKiBmaW5kIGluLW9yZGVyIGZyYW1lICovCi0JCWlmICgobXBkdV9ibGstPlNlcXVlbmNlID09IFNlcXVlbmNlKSB8fCBTRVFfU01BTExFUihtcGR1X2Jsay0+U2VxdWVuY2UsIFNlcXVlbmNlLCBNQVhTRVEpKQotCQl7Ci0JCQkvKiBkZXF1ZXVlIGluLW9yZGVyIGZyYW1lIGZyb20gcmVvZGVyaW5nIGxpc3QgKi8KLQkJCW1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoJnBCQUVudHJ5LT5saXN0KTsKLQkJCS8qIHBhc3MgdGhpcyBmcmFtZSB1cCAqLwotCQkJQU5OT1VOQ0VfUkVPUkRFUklOR19QQUNLRVQocEFkLCBtcGR1X2Jsayk7Ci0JCQkvKiBmcmVlIG1wZHVfYmxrICovCi0JCQliYV9tcGR1X2Jsa19mcmVlKHBBZCwgbXBkdV9ibGspOwotCQl9Ci0JCWVsc2UKLQkJCXsKLQkJCQlicmVhazsKLQkJCX0KLQl9Ci0JTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7Ci19Ci0KLQotc3RhdGljIHZvaWQgYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKAotCQkJCQkJCQkJICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JCQkJCQkJCQkgICBQQkFfUkVDX0VOVFJZICAgICAgIHBCQUVudHJ5KQotewotCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOwotCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7Ci0KLQkJCS8qIGRlcXVldWUgaW4tb3JkZXIgZnJhbWUgZnJvbSByZW9kZXJpbmcgbGlzdCAqLwotCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfZGVxdWV1ZSgmcEJBRW50cnktPmxpc3QpKSkKLQl7Ci0JCQkvKiBwYXNzIHRoaXMgZnJhbWUgdXAgKi8KLQkJQU5OT1VOQ0VfUkVPUkRFUklOR19QQUNLRVQocEFkLCBtcGR1X2Jsayk7Ci0KLQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBtcGR1X2Jsay0+U2VxdWVuY2U7Ci0JCQliYV9tcGR1X2Jsa19mcmVlKHBBZCwgbXBkdV9ibGspOwotCi0JCS8qIHVwZGF0ZSBsYXN0IGluZGljYXRlZCBzZXF1ZW5jZSAqLwotCX0KLQlBU1NFUlQocEJBRW50cnktPmxpc3QucWxlbiA9PSAwKTsKLQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7Ci0JTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7Ci19Ci0KLQotLy9zdGF0aWMKLXZvaWQgYmFfZmx1c2hfcmVvcmRlcmluZ190aW1lb3V0X21wZHVzKAotCQkJCQkJCQkJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JCQkJCQkJCQlJTiBQQkFfUkVDX0VOVFJZICAgIHBCQUVudHJ5LAotCQkJCQkJCQkJSU4gVUxPTkcgICAgICAgICAgICBOb3czMikKLQotewotCVVTSE9SVCBTZXF1ZW5jZTsKLQotLy8JaWYgKChSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpICYmCi0vLwkJIChwQkFFbnRyeS0+bGlzdC5xbGVuID4gKChwQkFFbnRyeS0+QkFXaW5TaXplKjcpLzgpKSkgLy98fAotLy8JCShSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrKDEwKlJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQpKSkgJiYKLS8vCQkgKHBCQUVudHJ5LT5saXN0LnFsZW4gPiAocEJBRW50cnktPkJBV2luU2l6ZS84KSkpCi0JaWYgKFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcisoTUFYX1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQvNikpKQotCQkgJiYocEJBRW50cnktPmxpc3QucWxlbiA+IDEpCi0JCSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgidGltZW91dFslZF0gKCUwOGx4LSUwOGx4ID0gJWQgPiAlZCk6ICV4LCBmbHVzaCBhbGwhXG4gIiwgcEJBRW50cnktPmxpc3QucWxlbiwgTm93MzIsIChwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIpLAotCQkJICAgKGludCkoKGxvbmcpIE5vdzMyIC0gKGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcikpLCBNQVhfUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCwKLQkJCSAgIHBCQUVudHJ5LT5MYXN0SW5kU2VxKSk7Ci0JCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKLQkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7Ci0JfQotCWVsc2UKLQlpZiAoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKyhSRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUKSkpCi0JCSYmIChwQkFFbnRyeS0+bGlzdC5xbGVuID4gMCkKLQkgICApCi0JCXsKLS8vCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgidGltZW91dFslZF0gKCVseC0lbHggPSAlZCA+ICVkKTogJXgsICIsIHBCQUVudHJ5LT5saXN0LnFsZW4sIE5vdzMyLCAocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKSwKLS8vCQkJICAgKGludCkoKGxvbmcpIE5vdzMyIC0gKGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcikpLCBSRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VULAotLy8JCQkgICBwQkFFbnRyeS0+TGFzdEluZFNlcSkpOwotCQkvLwotCQkvLyBmb3JjZSBMYXN0SW5kU2VxIHRvIHNoaWZ0IHRvIExhc3RJbmRTZXErMQotCQkvLwotCQlTZXF1ZW5jZSA9IChwQkFFbnRyeS0+TGFzdEluZFNlcSsxKSAmIE1BWFNFUTsKLQkJYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19sZV9zZXEocEFkLCBwQkFFbnRyeSwgU2VxdWVuY2UpOwotCQlwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgPSBOb3czMjsKLQkJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gU2VxdWVuY2U7Ci0JCS8vCi0JCS8vIGluZGljYXRlIGluLW9yZGVyIG1wZHVzCi0JCS8vCi0JCVNlcXVlbmNlID0gYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19pbl9vcmRlcihwQWQsIHBCQUVudHJ5LCBTZXF1ZW5jZSk7Ci0JCWlmIChTZXF1ZW5jZSAhPSBSRVNFVF9SQ1ZfU0VRKQotCQl7Ci0JCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFNlcXVlbmNlOwotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIiV4LCBmbHVzaCBvbmUhXG4iLCBwQkFFbnRyeS0+TGFzdEluZFNlcSkpOwotCi0JfQotfQotCi0KLS8qCi0gKiBnZW5lcmF0ZSBBRERCQSByZXF1ZXN0IHRvCi0gKiBzZXQgdXAgQkEgYWdyZWVtZW50Ci0gKi8KLVZPSUQgQkFPcmlTZXNzaW9uU2V0VXAoCi0JCQkJCSAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JCQkJCSAgSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAotCQkJCQkgIElOIFVDSEFSICAgICAgICAgICAgVElELAotCQkJCQkgIElOIFVTSE9SVCAgICAgICAgICAgVGltZU91dCwKLQkJCQkJICBJTiBVTE9ORyAgICAgICAgICAgIERlbGF5VGltZSwKLQkJCQkJICBJTiBCT09MRUFOICAgICAgICAgIGlzRm9yY2VkKQotCi17Ci0JLy9NTE1FX0FEREJBX1JFUV9TVFJVQ1QJQWRkYmFSZXE7Ci0JQkFfT1JJX0VOVFJZICAgICAgICAgICAgKnBCQUVudHJ5ID0gTlVMTDsKLQlVU0hPUlQgICAgICAgICAgICAgICAgICBJZHg7Ci0JQk9PTEVBTiAgICAgICAgICAgICAgICAgQ2FuY2VsbGVkOwotCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBICE9IFRSVUUpICAmJiAgKGlzRm9yY2VkID09IEZBTFNFKSkKLQkJcmV0dXJuOwotCi0JLy8gaWYgdGhpcyBlbnRyeSBpcyBsaW1pdGVkIHRvIHVzZSBsZWdhY3kgdHggbW9kZSwgaXQgZG9lc24ndCBnZW5lcmF0ZSBCQS4KLQlpZiAoUlRNUFN0YUZpeGVkVHhNb2RlKHBBZCwgcEVudHJ5KSAhPSBGSVhFRF9UWE1PREVfSFQpCi0JCXJldHVybjsKLQotCWlmICgocEVudHJ5LT5CQURlY2xpbmVCaXRtYXAgJiAoMTw8VElEKSkgJiYgKGlzRm9yY2VkID09IEZBTFNFKSkKLQl7Ci0JCS8vIHRyeSBhZ2FpbiBhZnRlciAzIHNlY3MKLQkJRGVsYXlUaW1lID0gMzAwMDsKLS8vCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEZUNsaW5lIEJBIGZyb20gUGVlclxuIikpOwotLy8JCXJldHVybjsKLQl9Ci0KLQotCUlkeCA9IHBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbVElEXTsKLQlpZiAoSWR4ID09IDApCi0JewotCQkvLyBhbGxvY2F0ZSBhIEJBIHNlc3Npb24KLQkJcEJBRW50cnkgPSBCQVRhYmxlQWxsb2NPcmlFbnRyeShwQWQsICZJZHgpOwotCQlpZiAocEJBRW50cnkgPT0gTlVMTCkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBRERCQSAtIE1sbWVBRERCQUFjdGlvbigpIGFsbG9jYXRlIEJBIHNlc3Npb24gZmFpbGVkIFxuIikpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKLQl9Ci0KLQlpZiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPj0gT3JpZ2luYXRvcl9XYWl0UmVzKQotCXsKLQkJcmV0dXJuOwotCX0KLQotCXBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbVElEXSA9IElkeDsKLQotCS8vIEluaXRpYWxpemUgQkEgc2Vzc2lvbgotCXBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID0gT3JpZ2luYXRvcl9XYWl0UmVzOwotCXBCQUVudHJ5LT5XY2lkID0gcEVudHJ5LT5BaWQ7Ci0JcEJBRW50cnktPkJBV2luU2l6ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQ7Ci0JcEJBRW50cnktPlNlcXVlbmNlID0gQkFfT1JJX0lOSVRfU0VROwotCXBCQUVudHJ5LT5Ub2tlbiA9IDE7CS8vICgyMDA4LTAxLTIxKSBKYW4gTGVlIHJlY29tbWVuZHMgaXQgLSB0aGlzIHRva2VuIGNhbid0IGJlIDAKLQlwQkFFbnRyeS0+VElEID0gVElEOwotCXBCQUVudHJ5LT5UaW1lT3V0VmFsdWUgPSBUaW1lT3V0OwotCXBCQUVudHJ5LT5wQWRhcHRlciA9IHBBZDsKLQotCWlmICghKHBFbnRyeS0+VFhCQWJpdG1hcCAmICgxPDxUSUQpKSkKLQl7Ci0JCVJUTVBJbml0VGltZXIocEFkLCAmcEJBRW50cnktPk9SSUJBVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihCQU9yaVNlc3Npb25TZXR1cFRpbWVvdXQpLCBwQkFFbnRyeSwgRkFMU0UpOwotCX0KLQllbHNlCi0JCVJUTVBDYW5jZWxUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsICZDYW5jZWxsZWQpOwotCi0JLy8gc2V0IHRpbWVyIHRvIHNlbmQgQUREQkEgcmVxdWVzdAotCVJUTVBTZXRUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsIERlbGF5VGltZSk7Ci19Ci0KLVZPSUQgQkFPcmlTZXNzaW9uQWRkKAotCQkJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JCQkJCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKLQkJCUlOIFBGUkFNRV9BRERCQV9SU1AgcEZyYW1lKQotewotCUJBX09SSV9FTlRSWSAgKnBCQUVudHJ5ID0gTlVMTDsKLQlCT09MRUFOICAgICAgIENhbmNlbGxlZDsKLQlVQ0hBUiAgICAgICAgIFRJRDsKLQlVU0hPUlQgICAgICAgIElkeDsKLQlQVUNIQVIgICAgICAgICAgcE91dEJ1ZmZlcjIgPSBOVUxMOwotCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOwotCVVMT05HICAgICAgICAgICBGcmFtZUxlbjsKLQlGUkFNRV9CQVIgICAgICAgRnJhbWVCYXI7Ci0KLQlUSUQgPSBwRnJhbWUtPkJhUGFybS5USUQ7Ci0JSWR4ID0gcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtUSURdOwotCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKLQotCS8vIFN0YXJ0IGZpbGwgaW4gcGFyYW1ldGVycy4KLQlpZiAoKElkeCAhPTApICYmIChwQkFFbnRyeS0+VElEID09IFRJRCkgJiYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfV2FpdFJlcykpCi0JewotCQlwQkFFbnRyeS0+QkFXaW5TaXplID0gbWluKHBCQUVudHJ5LT5CQVdpblNpemUsICgoVUNIQVIpcEZyYW1lLT5CYVBhcm0uQnVmU2l6ZSkpOwotCQlCQV9NYXhXaW5TaXplUmVhc2lnbihwQWQsIHBFbnRyeSwgJnBCQUVudHJ5LT5CQVdpblNpemUpOwotCi0JCXBCQUVudHJ5LT5UaW1lT3V0VmFsdWUgPSBwRnJhbWUtPlRpbWVPdXRWYWx1ZTsKLQkJcEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX0RvbmU7Ci0JCXBBZC0+QkFUYWJsZS5udW1Eb25lT3JpZ2luYXRvciArKzsKLQotCQkvLyByZXNldCBzZXF1ZW5jZSBudW1iZXIKLQkJcEJBRW50cnktPlNlcXVlbmNlID0gQkFfT1JJX0lOSVRfU0VROwotCQkvLyBTZXQgQml0bWFwIGZsYWcuCi0JCXBFbnRyeS0+VFhCQWJpdG1hcCB8PSAoMTw8VElEKTsKLQkJCQlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKLQotCQlwQkFFbnRyeS0+T1JJQkFUaW1lci5UaW1lclZhbHVlID0gMDsJLy9wRnJhbWUtPlRpbWVPdXRWYWx1ZTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzIDogVFhCQWJpdG1hcCA9ICV4LCBCQVdpblNpemUgPSAlZCwgVGltZU91dCA9ICVsZFxuIiwgX19GVU5DVElPTl9fLCBwRW50cnktPlRYQkFiaXRtYXAsCi0JCQkJCQkJCSBwQkFFbnRyeS0+QkFXaW5TaXplLCBwQkFFbnRyeS0+T1JJQkFUaW1lci5UaW1lclZhbHVlKSk7Ci0KLQkJLy8gU0VORCBCQVIgOwotCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQkJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSAtIEJBT3JpU2Vzc2lvbkFkZCgpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQlCYXJIZWFkZXJJbml0KHBBZCwgJkZyYW1lQmFyLCBwQWQtPk1hY1RhYi5Db250ZW50W3BCQUVudHJ5LT5XY2lkXS5BZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5GcmFnTnVtID0gMDsJLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY3Rpb24uCi0JCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxID0gcEJBRW50cnktPlNlcXVlbmNlOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KLQkJRnJhbWVCYXIuQmFyQ29udHJvbC5USUQgPSBwQkFFbnRyeS0+VElEOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KLQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlcjIsICAgICAgICAgICAgICAmRnJhbWVMZW4sCi0JCQkJCQkgIHNpemVvZihGUkFNRV9CQVIpLCAgICAgICZGcmFtZUJhciwKLQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyMiwgRnJhbWVMZW4pOwotCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIyKTsKLQotCi0JCWlmIChwQkFFbnRyeS0+T1JJQkFUaW1lci5UaW1lclZhbHVlKQotCQkJUlRNUFNldFRpbWVyKCZwQkFFbnRyeS0+T1JJQkFUaW1lciwgcEJBRW50cnktPk9SSUJBVGltZXIuVGltZXJWYWx1ZSk7IC8vIGluIG1TZWMKLQl9Ci19Ci0KLUJPT0xFQU4gQkFSZWNTZXNzaW9uQWRkKAotCQkJCQkgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQkJCQkJICAgSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAotCQkJCQkgICBJTiBQRlJBTUVfQUREQkFfUkVRIHBGcmFtZSkKLXsKLQlCQV9SRUNfRU5UUlkgICAgICAgICAgICAqcEJBRW50cnkgPSBOVUxMOwotCUJPT0xFQU4gICAgICAgICAgICAgICAgIFN0YXR1cyA9IFRSVUU7Ci0JQk9PTEVBTiAgICAgICAgICAgICAgICAgQ2FuY2VsbGVkOwotCVVTSE9SVCAgICAgICAgICAgICAgICAgIElkeDsKLQlVQ0hBUiAgICAgICAgICAgICAgICAgICBUSUQ7Ci0JVUNIQVIgICAgICAgICAgICAgICAgICAgQkFXaW5TaXplOwotCS8vVUlOVDMyICAgICAgICAgICAgICAgICAgVmFsdWU7Ci0JLy9VSU5UICAgICAgICAgICAgICAgICAgICBvZmZzZXQ7Ci0KLQotCUFTU0VSVChwRW50cnkpOwotCi0JLy8gZmluZCBUSUQKLQlUSUQgPSBwRnJhbWUtPkJhUGFybS5USUQ7Ci0KLQlCQVdpblNpemUgPSBtaW4oKChVQ0hBUilwRnJhbWUtPkJhUGFybS5CdWZTaXplKSwgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQpOwotCi0JLy8gSW50ZWwgcGF0Y2gKLQlpZiAoQkFXaW5TaXplID09IDApCi0JewotCQlCQVdpblNpemUgPSA2NDsKLQl9Ci0KLQlJZHggPSBwRW50cnktPkJBUmVjV2NpZEFycmF5W1RJRF07Ci0KLQotCWlmIChJZHggPT0gMCkKLQl7Ci0JCXBCQUVudHJ5ID0gQkFUYWJsZUFsbG9jUmVjRW50cnkocEFkLCAmSWR4KTsKLQl9Ci0JZWxzZQotCXsKLQkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKLQkJLy8gZmx1c2ggYWxsIHBlbmRpbmcgcmVvcmRlcmluZyBtcGR1cwotCQliYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcyglbGQpOiBJZHggPSAlZCwgQkFXaW5TaXplKHJlcSAlZCkgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQsIElkeCwKLQkJCQkJCQkgcEZyYW1lLT5CYVBhcm0uQnVmU2l6ZSwgQkFXaW5TaXplKSk7Ci0KLQkvLyBTdGFydCBmaWxsIGluIHBhcmFtZXRlcnMuCi0JaWYgKHBCQUVudHJ5ICE9IE5VTEwpCi0JewotCQlBU1NFUlQocEJBRW50cnktPmxpc3QucWxlbiA9PSAwKTsKLQotCQlwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9IYW5kbGVSZXM7Ci0JCXBCQUVudHJ5LT5CQVdpblNpemUgPSBCQVdpblNpemU7Ci0JCXBCQUVudHJ5LT5XY2lkID0gcEVudHJ5LT5BaWQ7Ci0JCXBCQUVudHJ5LT5USUQgPSBUSUQ7Ci0JCXBCQUVudHJ5LT5UaW1lT3V0VmFsdWUgPSBwRnJhbWUtPlRpbWVPdXRWYWx1ZTsKLQkJcEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPSBSZWNpcGllbnRfQWNjZXB0OwotCQkvLyBpbml0aWFsIHNlcXVlbmNlIG51bWJlcgotCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7IC8vcEZyYW1lLT5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJTdGFydCBTZXEgPSAlMDh4XG4iLCAgcEZyYW1lLT5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxKSk7Ci0KLQkJaWYgKHBFbnRyeS0+UlhCQWJpdG1hcCAmICgxPDxUSUQpKQotCQl7Ci0JCQlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5SRUNCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVJUTVBJbml0VGltZXIocEFkLCAmcEJBRW50cnktPlJFQ0JBVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihCQVJlY1Nlc3Npb25JZGxlVGltZW91dCksIHBCQUVudHJ5LCBUUlVFKTsKLQkJfQotCi0KLQkJLy8gU2V0IEJpdG1hcCBmbGFnLgotCQlwRW50cnktPlJYQkFiaXRtYXAgfD0gKDE8PFRJRCk7Ci0JCXBFbnRyeS0+QkFSZWNXY2lkQXJyYXlbVElEXSA9IElkeDsKLQotCQlwRW50cnktPkJBRGVjbGluZUJpdG1hcCAmPSB+KDE8PFRJRCk7Ci0KLQkJLy8gU2V0IEJBIHNlc3Npb24gbWFzayBpbiBXQ0lEIHRhYmxlLgotCQlSVE1QX0FERF9CQV9TRVNTSU9OX1RPX0FTSUMocEFkLCBwRW50cnktPkFpZCwgVElEKTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1BQ0VudHJ5WyVkXVJYQkFiaXRtYXAgPSAweCV4LiBCQVJlY1djaWRBcnJheT0lZFxuIiwKLQkJCQlwRW50cnktPkFpZCwgcEVudHJ5LT5SWEJBYml0bWFwLCBwRW50cnktPkJBUmVjV2NpZEFycmF5W1RJRF0pKTsKLQl9Ci0JZWxzZQotCXsKLQkJU3RhdHVzID0gRkFMU0U7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ2FuJ3QgQWNjZXB0IEFEREJBIGZvciAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBUSUQgPSAlZFxuIiwKLQkJCQlQUklOVF9NQUMocEVudHJ5LT5BZGRyKSwgVElEKSk7Ci0JfQotCXJldHVybihTdGF0dXMpOwotfQotCi0KLUJBX1JFQ19FTlRSWSAqQkFUYWJsZUFsbG9jUmVjRW50cnkoCi0JCQkJCQkJCSAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JCQkJCQkJCSAgT1VUIFVTSE9SVCAgICAgICAgICAqSWR4KQotewotCWludCAgICAgICAgICAgICBpOwotCUJBX1JFQ19FTlRSWSAgICAqcEJBRW50cnkgPSBOVUxMOwotCi0KLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7Ci0KLQlpZiAocEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50ID49IE1BWF9CQVJFQ0lfU0VTU0lPTikKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJCQSBSZWNpcGVpbnQgU2Vzc2lvbiAoJWxkKSA+ICVkXG4iLAotCQkJCQkJCXBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCwgTUFYX0JBUkVDSV9TRVNTSU9OKSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvLyByZXNlcnZlIGlkeCAwIHRvIGlkZW50aWZ5IEJBV2NpZEFycmF5W1RJRF0gYXMgZW1wdHkKLQlmb3IgKGk9MTsgaSA8IE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFOyBpKyspCi0JewotCQlwQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W2ldOwotCQlpZiAoKHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID09IFJlY2lwaWVudF9OT05FKSkKLQkJewotCQkJLy8gZ2V0IG9uZQotCQkJcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50Kys7Ci0JCQlwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9VU0VEOwotCQkJKklkeCA9IGk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotZG9uZToKLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7Ci0JcmV0dXJuIHBCQUVudHJ5OwotfQotCi1CQV9PUklfRU5UUlkgKkJBVGFibGVBbGxvY09yaUVudHJ5KAotCQkJCQkJCQkgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCQkJCQkJCQkgIE9VVCBVU0hPUlQgICAgICAgICAgKklkeCkKLXsKLQlpbnQgICAgICAgICAgICAgaTsKLQlCQV9PUklfRU5UUlkgICAgKnBCQUVudHJ5ID0gTlVMTDsKLQotCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKLQotCWlmIChwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yID49IChNQVhfTEVOX09GX0JBX09SSV9UQUJMRSkpCi0JewotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLy8gcmVzZXJ2ZSBpZHggMCB0byBpZGVudGlmeSBCQVdjaWRBcnJheVtUSURdIGFzIGVtcHR5Ci0JZm9yIChpPTE7IGk8TUFYX0xFTl9PRl9CQV9PUklfVEFCTEU7IGkrKykKLQl7Ci0JCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaV07Ci0JCWlmICgocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9OT05FKSkKLQkJewotCQkJLy8gZ2V0IG9uZQotCQkJcEFkLT5CQVRhYmxlLm51bUFzT3JpZ2luYXRvcisrOwotCQkJcEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX1VTRUQ7Ci0JCQlwQkFFbnRyeS0+cEFkYXB0ZXIgPSBwQWQ7Ci0JCQkqSWR4ID0gaTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi1kb25lOgotCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKLQlyZXR1cm4gcEJBRW50cnk7Ci19Ci0KLQotVk9JRCBCQVRhYmxlRnJlZU9yaUVudHJ5KAotCQkJCQkJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JCQkJCQlJTiAgVUxPTkcgICAgICAgICAgIElkeCkKLXsKLQlCQV9PUklfRU5UUlkgICAgKnBCQUVudHJ5ID0gTlVMTDsKLQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKLQotCi0JaWYgKChJZHggPT0gMCkgfHwgKElkeCA+PSBNQVhfTEVOX09GX0JBX09SSV9UQUJMRSkpCi0JCXJldHVybjsKLQotCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKLQotCWlmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyAhPSBPcmlnaW5hdG9yX05PTkUpCi0JewotCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwQkFFbnRyeS0+V2NpZF07Ci0JCXBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbcEJBRW50cnktPlRJRF0gPSAwOwotCi0KLQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOwotCQlpZiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKQotCQl7Ci0JCQlwQWQtPkJBVGFibGUubnVtRG9uZU9yaWdpbmF0b3IgLT0gMTsKLQkJCXBFbnRyeS0+VFhCQWJpdG1hcCAmPSAofigxPDwocEJBRW50cnktPlRJRCkgKSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCQVRhYmxlRnJlZU9yaUVudHJ5IG51bUFzT3JpZ2luYXRvcj0gJWxkXG4iLCBwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQpKTsKLQkJCS8vIEVyYXNlIEJpdG1hcCBmbGFnLgotCQl9Ci0KLQkJQVNTRVJUKHBBZC0+QkFUYWJsZS5udW1Bc09yaWdpbmF0b3IgIT0gMCk7Ci0KLQkJcEFkLT5CQVRhYmxlLm51bUFzT3JpZ2luYXRvciAtPSAxOwotCi0JCXBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID0gT3JpZ2luYXRvcl9OT05FOwotCQlwQkFFbnRyeS0+VG9rZW4gPSAwOwotCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7Ci0JfQotfQotCi0KLVZPSUQgQkFUYWJsZUZyZWVSZWNFbnRyeSgKLQkJCQkJCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCQkJCQkJSU4gIFVMT05HICAgICAgICAgICBJZHgpCi17Ci0JQkFfUkVDX0VOVFJZICAgICpwQkFFbnRyeSA9IE5VTEw7Ci0JTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7Ci0KLQotCWlmICgoSWR4ID09IDApIHx8IChJZHggPj0gTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEUpKQotCQlyZXR1cm47Ci0KLQlwQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W0lkeF07Ci0KLQlpZiAocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgIT0gUmVjaXBpZW50X05PTkUpCi0JewotCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwQkFFbnRyeS0+V2NpZF07Ci0JCXBFbnRyeS0+QkFSZWNXY2lkQXJyYXlbcEJBRW50cnktPlRJRF0gPSAwOwotCi0JCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKLQotCQlBU1NFUlQocEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50ICE9IDApOwotCi0JCXBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCAtPSAxOwotCi0JCXBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID0gUmVjaXBpZW50X05PTkU7Ci0JCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKLQl9Ci19Ci0KLQotVk9JRCBCQU9yaVNlc3Npb25UZWFyRG93bigKLQkJCQkJCSBJTiBPVVQgIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JCQkJCQkgSU4gICAgICBVQ0hBUiAgICAgICAgICAgV2NpZCwKLQkJCQkJCSBJTiAgICAgIFVDSEFSICAgICAgICAgICBUSUQsCi0JCQkJCQkgSU4gICAgICBCT09MRUFOICAgICAgICAgYlBhc3NpdmUsCi0JCQkJCQkgSU4gICAgICBCT09MRUFOICAgICAgICAgYkZvcmNlU2VuZCkKLXsKLQlVTE9ORyAgICAgICAgICAgSWR4ID0gMDsKLQlCQV9PUklfRU5UUlkgICAgKnBCQUVudHJ5OwotCUJPT0xFQU4gICAgICAgICBDYW5jZWxsZWQ7Ci0KLQlpZiAoV2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKLQl7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLwotCS8vIExvY2F0ZSBjb3JyZXNwb25kaW5nIEJBIE9yaWdpbmF0b3IgRW50cnkgaW4gQkEgVGFibGUgd2l0aCB0aGUgKHBBZGRyLFRJRCkuCi0JLy8KLQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkJBT3JpV2NpZEFycmF5W1RJRF07Ci0JaWYgKChJZHggPT0gMCkgfHwgKElkeCA+PSBNQVhfTEVOX09GX0JBX09SSV9UQUJMRSkpCi0JewotCQlpZiAoYkZvcmNlU2VuZCA9PSBUUlVFKQotCQl7Ci0JCQkvLyBmb3JjZSBzZW5kIHNwZWNpZmllZCBUSUQgRGVsQkEKLQkJCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAgIERlbGJhUmVxOwotCQkJTUxNRV9RVUVVRV9FTEVNICpFbGVtID0gKE1MTUVfUVVFVUVfRUxFTSAqKSBrbWFsbG9jKHNpemVvZihNTE1FX1FVRVVFX0VMRU0pLCBNRU1fQUxMT0NfRkxBRyk7Ci0JCQlpZiAoRWxlbSAhPSBOVUxMKQotCQkJewotCQkJCU5kaXNaZXJvTWVtb3J5KCZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7Ci0JCQkJTmRpc1plcm9NZW1vcnkoRWxlbSwgc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSkpOwotCi0JCQkJQ09QWV9NQUNfQUREUihEZWxiYVJlcS5BZGRyLCBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHIpOwotCQkJCURlbGJhUmVxLldjaWQgPSBXY2lkOwotCQkJCURlbGJhUmVxLlRJRCA9IFRJRDsKLQkJCQlEZWxiYVJlcS5Jbml0aWF0b3IgPSBPUklHSU5BVE9SOwotCQkJCUVsZW0tPk1zZ0xlbiAgPSBzaXplb2YoRGVsYmFSZXEpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KEVsZW0tPk1zZywgJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKLQkJCQlNbG1lREVMQkFBY3Rpb24ocEFkLCBFbGVtKTsKLQkJCQlrZnJlZShFbGVtKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyhiRm9yY2VTZW5kKTphbGxvYyBtZW1vcnkgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm47Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcz09PT5XY2lkPSVkLlRJRD0lZCBcbiIsIF9fRlVOQ1RJT05fXywgV2NpZCwgVElEKSk7Ci0KLQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtJZHhdOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiXHQ9PT0+SWR4ID0gJWxkLCBXY2lkPSVkLlRJRD0lZCwgT1JJX0JBX1N0YXR1cyA9ICVkIFxuIiwgSWR4LCBXY2lkLCBUSUQsIHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzKSk7Ci0JLy8KLQkvLyBQcmVwYXJlIERlbEJBIGFjdGlvbiBmcmFtZSBhbmQgc2VuZCB0byB0aGUgcGVlci4KLQkvLwotCWlmICgoYlBhc3NpdmUgPT0gRkFMU0UpICYmIChUSUQgPT0gcEJBRW50cnktPlRJRCkgJiYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfRG9uZSkpCi0JewotCQlNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgICBEZWxiYVJlcTsKLQkJTUxNRV9RVUVVRV9FTEVNICpFbGVtID0gKE1MTUVfUVVFVUVfRUxFTSAqKSBrbWFsbG9jKHNpemVvZihNTE1FX1FVRVVFX0VMRU0pLCBNRU1fQUxMT0NfRkxBRyk7Ci0JCWlmIChFbGVtICE9IE5VTEwpCi0JCXsKLQkJCU5kaXNaZXJvTWVtb3J5KCZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7Ci0JCQlOZGlzWmVyb01lbW9yeShFbGVtLCBzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSk7Ci0KLQkJCUNPUFlfTUFDX0FERFIoRGVsYmFSZXEuQWRkciwgcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5BZGRyKTsKLQkJCURlbGJhUmVxLldjaWQgPSBXY2lkOwotCQkJRGVsYmFSZXEuVElEID0gcEJBRW50cnktPlRJRDsKLQkJCURlbGJhUmVxLkluaXRpYXRvciA9IE9SSUdJTkFUT1I7Ci0JCQlFbGVtLT5Nc2dMZW4gID0gc2l6ZW9mKERlbGJhUmVxKTsKLQkJCU5kaXNNb3ZlTWVtb3J5KEVsZW0tPk1zZywgJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKLQkJCU1sbWVERUxCQUFjdGlvbihwQWQsIEVsZW0pOwotCQkJa2ZyZWUoRWxlbSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcygpOmFsbG9jIG1lbW9yeSBmYWlsZWQhXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKLQlCQVRhYmxlRnJlZU9yaUVudHJ5KHBBZCwgSWR4KTsKLQotCWlmIChiUGFzc2l2ZSkKLQl7Ci0JCS8vQkFPcmlTZXNzaW9uU2V0VXAocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwgVElELCAwLCAxMDAwMCwgVFJVRSk7Ci0JfQotfQotCi1WT0lEIEJBUmVjU2Vzc2lvblRlYXJEb3duKAotCQkJCQkJIElOIE9VVCAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQkJCQkJCSBJTiAgICAgIFVDSEFSICAgICAgICAgICBXY2lkLAotCQkJCQkJIElOICAgICAgVUNIQVIgICAgICAgICAgIFRJRCwKLQkJCQkJCSBJTiAgICAgIEJPT0xFQU4gICAgICAgICBiUGFzc2l2ZSkKLXsKLQlVTE9ORyAgICAgICAgICAgSWR4ID0gMDsKLQlCQV9SRUNfRU5UUlkgICAgKnBCQUVudHJ5OwotCi0JaWYgKFdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCi0JewotCQlyZXR1cm47Ci0JfQotCi0JLy8KLQkvLyAgTG9jYXRlIGNvcnJlc3BvbmRpbmcgQkEgT3JpZ2luYXRvciBFbnRyeSBpbiBCQSBUYWJsZSB3aXRoIHRoZSAocEFkZHIsVElEKS4KLQkvLwotCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQkFSZWNXY2lkQXJyYXlbVElEXTsKLQlpZiAoSWR4ID09IDApCi0JCXJldHVybjsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXM9PT0+V2NpZD0lZC5USUQ9JWQgXG4iLCBfX0ZVTkNUSU9OX18sIFdjaWQsIFRJRCkpOwotCi0KLQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiXHQ9PT0+SWR4ID0gJWxkLCBXY2lkPSVkLlRJRD0lZCwgUkVDX0JBX1N0YXR1cyA9ICVkIFxuIiwgSWR4LCBXY2lkLCBUSUQsIHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzKSk7Ci0JLy8KLQkvLyBQcmVwYXJlIERlbEJBIGFjdGlvbiBmcmFtZSBhbmQgc2VuZCB0byB0aGUgcGVlci4KLQkvLwotCWlmICgoVElEID09IHBCQUVudHJ5LT5USUQpICYmIChwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9PSBSZWNpcGllbnRfQWNjZXB0KSkKLQl7Ci0JCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAgIERlbGJhUmVxOwotCQlCT09MRUFOCQkJCQlDYW5jZWxsZWQ7Ci0JCS8vVUxPTkcgICBvZmZzZXQ7Ci0JCS8vVUlOVDMyICBWQUxVRTsKLQotCQlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5SRUNCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKLQotCQkvLwotCQkvLyAxLiBTZW5kIERFTEJBIEFjdGlvbiBGcmFtZQotCQkvLwotCQlpZiAoYlBhc3NpdmUgPT0gRkFMU0UpCi0JCXsKLQkJCU1MTUVfUVVFVUVfRUxFTSAqRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOwotCQkJaWYgKEVsZW0gIT0gTlVMTCkKLQkJCXsKLQkJCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOwotCQkJCU5kaXNaZXJvTWVtb3J5KEVsZW0sIHNpemVvZihNTE1FX1FVRVVFX0VMRU0pKTsKLQotCQkJCUNPUFlfTUFDX0FERFIoRGVsYmFSZXEuQWRkciwgcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5BZGRyKTsKLQkJCQlEZWxiYVJlcS5XY2lkID0gV2NpZDsKLQkJCQlEZWxiYVJlcS5USUQgPSBUSUQ7Ci0JCQkJRGVsYmFSZXEuSW5pdGlhdG9yID0gUkVDSVBJRU5UOwotCQkJCUVsZW0tPk1zZ0xlbiAgPSBzaXplb2YoRGVsYmFSZXEpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KEVsZW0tPk1zZywgJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKLQkJCQlNbG1lREVMQkFBY3Rpb24ocEFkLCBFbGVtKTsKLQkJCQlrZnJlZShFbGVtKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcygpOmFsbG9jIG1lbW9yeSBmYWlsZWQhXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCi0JCS8vCi0JCS8vIDIuIEZyZWUgcmVzb3VyY2Ugb2YgQkEgc2Vzc2lvbgotCQkvLwotCQkvLyBmbHVzaCBhbGwgcGVuZGluZyByZW9yZGVyaW5nIG1wZHVzCi0JCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKLQotCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7Ci0KLQkJLy8gRXJhc2UgQml0bWFwIGZsYWcuCi0JCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gUkVTRVRfUkNWX1NFUTsKLQkJcEJBRW50cnktPkJBV2luU2l6ZSA9IDA7Ci0JCS8vIEVyYXNlIEJpdG1hcCBmbGFnIGF0IHNvZnR3YXJlIG1hY3RhYmxlCi0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uUlhCQWJpdG1hcCAmPSAofigxPDwocEJBRW50cnktPlRJRCkpKTsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5CQVJlY1djaWRBcnJheVtUSURdID0gMDsKLQotCQlSVE1QX0RFTF9CQV9TRVNTSU9OX0ZST01fQVNJQyhwQWQsIFdjaWQsIFRJRCk7Ci0KLQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOwotCi0JfQotCi0JQkFUYWJsZUZyZWVSZWNFbnRyeShwQWQsIElkeCk7Ci19Ci0KLVZPSUQgQkFTZXNzaW9uVGVhckRvd25BTEwoCi0JCQkJCQkgSU4gT1VUICBQUlRNUF9BREFQVEVSIHBBZCwKLQkJCQkJCSBJTiAgICAgIFVDSEFSIFdjaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGk9MDsgaTxOVU1fT0ZfVElEOyBpKyspCi0JewotCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWQsIFdjaWQsIGksIEZBTFNFLCBGQUxTRSk7Ci0JCUJBUmVjU2Vzc2lvblRlYXJEb3duKHBBZCwgV2NpZCwgaSwgRkFMU0UpOwotCX0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVJldHJ5IHNlbmRpbmcgQUREQkEgUmVxZXN0LgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlQYXJhbWV0cnM6Ci0JcDgwMjNIZWFkZXI6IGlmIHRoaXMgaXMgYWxyZWFkeSA4MDIuMyBmb3JtYXQsIHA4MDIzSGVhZGVyIGlzIE5VTEwKLQotCVJldHVybgk6IFRSVUUgaWYgcHV0IGludG8gcnggcmVvcmRlcmluZyBidWZmZXIsIHNob3VsZG4ndCBpbmRpY2F0ZXJ4aGVyZS4KLQkJCQlGQUxTRSAsIHRoZW4gY29udGludWUgaW5kaWNhdGVyeCBhdCB0aGlzIG1vbWVudC4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEJBT3JpU2Vzc2lvblNldHVwVGltZW91dCgKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0gICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCi17Ci0JQkFfT1JJX0VOVFJZICAgICpwQkFFbnRyeSA9IChCQV9PUklfRU5UUlkgKilGdW5jdGlvbkNvbnRleHQ7Ci0JTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7Ci0JUFJUTVBfQURBUFRFUiAgIHBBZDsKLQotCWlmIChwQkFFbnRyeSA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlwQWQgPSBwQkFFbnRyeS0+cEFkYXB0ZXI7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJLy8gRG8gbm90aGluZyBpZiBtb25pdG9yIG1vZGUgaXMgb24KLQkJaWYgKE1PTklUT1JfT04ocEFkKSkKLQkJCXJldHVybjsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNpZmRlZiBSQUxJTktfQVRFCi0JLy8gTm90aGluZyB0byBkbyBpbiBBVEUgbW9kZS4KLQlpZiAoQVRFX09OKHBBZCkpCi0JCXJldHVybjsKLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwQkFFbnRyeS0+V2NpZF07Ci0KLQlpZiAoKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfV2FpdFJlcykgJiYgKHBCQUVudHJ5LT5Ub2tlbiA8IE9SSV9TRVNTSU9OX01BWF9SRVRSWSkpCi0JewotCQlNTE1FX0FEREJBX1JFUV9TVFJVQ1QgICAgQWRkYmFSZXE7Ci0KLQkJTmRpc1plcm9NZW1vcnkoJkFkZGJhUmVxLCBzaXplb2YoQWRkYmFSZXEpKTsKLQkJQ09QWV9NQUNfQUREUihBZGRiYVJlcS5wQWRkciwgcEVudHJ5LT5BZGRyKTsKLQkJQWRkYmFSZXEuV2NpZCA9IChVQ0hBUikocEVudHJ5LT5BaWQpOwotCQlBZGRiYVJlcS5USUQgPSBwQkFFbnRyeS0+VElEOwotCQlBZGRiYVJlcS5CYUJ1ZlNpemUgPSBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0OwotCQlBZGRiYVJlcS5UaW1lT3V0VmFsdWUgPSAwOwotCQlBZGRiYVJlcS5Ub2tlbiA9IHBCQUVudHJ5LT5Ub2tlbjsKLQkJTWxtZUVucXVldWUocEFkLCBBQ1RJT05fU1RBVEVfTUFDSElORSwgTVQyX01MTUVfQUREX0JBX0NBVEUsIHNpemVvZihNTE1FX0FEREJBX1JFUV9TVFJVQ1QpLCAoUFZPSUQpJkFkZGJhUmVxKTsKLQkJUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSBPcmkgU2Vzc2lvbiBUaW1lb3V0KCVkKSA6IFNlbmQgQUREIEJBIGFnYWluXG4iLCBwQkFFbnRyeS0+VG9rZW4pKTsKLQotCQlwQkFFbnRyeS0+VG9rZW4rKzsKLQkJUlRNUFNldFRpbWVyKCZwQkFFbnRyeS0+T1JJQkFUaW1lciwgT1JJX0JBX1NFU1NJT05fVElNRU9VVCk7Ci0JfQotCWVsc2UKLQl7Ci0JCUJBVGFibGVGcmVlT3JpRW50cnkocEFkLCBwRW50cnktPkJBT3JpV2NpZEFycmF5W3BCQUVudHJ5LT5USURdKTsKLQl9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJUmV0cnkgc2VuZGluZyBBRERCQSBSZXFlc3QuCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCVBhcmFtZXRyczoKLQlwODAyM0hlYWRlcjogaWYgdGhpcyBpcyBhbHJlYWR5IDgwMi4zIGZvcm1hdCwgcDgwMjNIZWFkZXIgaXMgTlVMTAotCi0JUmV0dXJuCTogVFJVRSBpZiBwdXQgaW50byByeCByZW9yZGVyaW5nIGJ1ZmZlciwgc2hvdWxkbid0IGluZGljYXRlcnhoZXJlLgotCQkJCUZBTFNFICwgdGhlbiBjb250aW51ZSBpbmRpY2F0ZXJ4IGF0IHRoaXMgbW9tZW50LgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQkFSZWNTZXNzaW9uSWRsZVRpbWVvdXQoCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQotewotCi0JQkFfUkVDX0VOVFJZICAgICpwQkFFbnRyeSA9IChCQV9SRUNfRU5UUlkgKilGdW5jdGlvbkNvbnRleHQ7Ci0JUFJUTVBfQURBUFRFUiAgIHBBZDsKLQlVTE9ORyAgICAgICAgICAgTm93MzI7Ci0KLQlpZiAocEJBRW50cnkgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JaWYgKChwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9PSBSZWNpcGllbnRfQWNjZXB0KSkKLQl7Ci0JCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdzMyKTsKLQotCQlpZiAoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyICsgUkVDX0JBX1NFU1NJT05fSURMRV9USU1FT1VUKSkpCi0JCXsKLQkJCXBBZCA9IHBCQUVudHJ5LT5wQWRhcHRlcjsKLQkJCS8vIGZsdXNoIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgbXBkdXMKLQkJCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIlbGQ6IFJFQyBCQSBzZXNzaW9uIFRpbWVvdXRcbiIsIE5vdzMyKSk7Ci0JCX0KLQl9Ci19Ci0KLQotVk9JRCBQZWVyQWRkQkFSZXFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotCi17Ci0JLy8JNy40LjQuMQotCS8vVUxPTkcJSWR4OwotCVVDSEFSICAgU3RhdHVzID0gMTsKLQlVQ0hBUiAgIHBBZGRyWzZdOwotCUZSQU1FX0FEREJBX1JTUCBBRERmcmFtZTsKLQlQVUNIQVIgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyAgICAgTlN0YXR1czsKLQlQRlJBTUVfQUREQkFfUkVRICBwQWRkcmVxRnJhbWUgPSBOVUxMOwotCS8vVUNIQVIJCUJ1ZlNpemU7Ci0JVUxPTkcgICAgICAgRnJhbWVMZW47Ci0JUFVMT05HICAgICAgcHRlbXA7Ci0JUE1BQ19UQUJMRV9FTlRSWQlwTWFjRW50cnk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA9PT4gKFdjaWQgPSAlZClcbiIsIF9fRlVOQ1RJT05fXywgRWxlbS0+V2NpZCkpOwotCi0JLy9oZXhfZHVtcCgiQWRkQkFSZXEiLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbik7Ci0KLQkvL0FEREJBIFJlcXVlc3QgZnJvbSB1bmtub3duIHBlZXIsIGlnbm9yZSB0aGlzLgotCWlmIChFbGVtLT5XY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQotCQlyZXR1cm47Ci0KLQlwTWFjRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gUGVlckFkZEJBUmVxQWN0aW9uLS0tLT4gXG4iKSk7Ci0JcHRlbXAgPSAoUFVMT05HKUVsZW0tPk1zZzsKLQkvL0RCR1BSSU5UX1JBVyhSVF9ERUJVR19FTVUsICgiJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4XG4iLCAqKHB0ZW1wKSwgKihwdGVtcCsxKSwgKihwdGVtcCsyKSwgKihwdGVtcCszKSwgKihwdGVtcCs0KSwgKihwdGVtcCs1KSwgKihwdGVtcCs2KSwgKihwdGVtcCs3KSwgKihwdGVtcCs4KSkpOwotCi0JaWYgKFBlZXJBZGRCQVJlcUFjdGlvblNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBwQWRkcikpCi0JewotCi0JCWlmICgocEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9PSBGQUxTRSkgJiYgSVNfSFRfU1RBKHBNYWNFbnRyeSkpCi0JCXsKLQkJCXBBZGRyZXFGcmFtZSA9IChQRlJBTUVfQUREQkFfUkVRKSgmRWxlbS0+TXNnWzBdKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJSY3YgV2NpZCglZCkgQWRkQkFSZXFcbiIsIEVsZW0tPldjaWQpKTsKLQkJCWlmIChCQVJlY1Nlc3Npb25BZGQocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXSwgcEFkZHJlcUZyYW1lKSkKLQkJCQlTdGF0dXMgPSAwOwotCQkJZWxzZQotCQkJCVN0YXR1cyA9IDM4OyAvLyBtb3JlIHBhcmFtZXRlcnMgaGF2ZSBpbnZhbGlkIHZhbHVlcwotCQl9Ci0JCWVsc2UKLQkJewotCQkJU3RhdHVzID0gMzc7IC8vIHRoZSByZXF1ZXN0IGhhcyBiZWVuIGRlY2xpbmVkLgotCQl9Ci0JfQotCi0JaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uVmFsaWRBc0NMSSkKLQkJQVNTRVJUKHBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uU3N0ID09IFNTVF9BU1NPQyk7Ci0KLQlwQWRkcmVxRnJhbWUgPSAoUEZSQU1FX0FEREJBX1JFUSkoJkVsZW0tPk1zZ1swXSk7Ci0JLy8gMi4gQWx3YXlzIHNlbmQgYmFjayBBRERCQSBSZXNwb25zZQotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CSAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUSU9OIC0gUGVlckJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCU5kaXNaZXJvTWVtb3J5KCZBRERmcmFtZSwgc2l6ZW9mKEZSQU1FX0FEREJBX1JTUCkpOwotCS8vIDItMS4gUHJlcGFyZSBBRERCQSBSZXNwb25zZSBmcmFtZS4KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJaWYgKEFESE9DX09OKHBBZCkpCi0JCQlBY3RIZWFkZXJJbml0KHBBZCwgJkFERGZyYW1lLkhkciwgcEFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJZWxzZQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5WYWxpZEFzRGxzKQotCQkJQWN0SGVhZGVySW5pdChwQWQsICZBRERmcmFtZS5IZHIsIHBBZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCWVsc2UKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQkJQWN0SGVhZGVySW5pdChwQWQsICZBRERmcmFtZS5IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWRkcik7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCUFERGZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfQkE7Ci0JQUREZnJhbWUuQWN0aW9uID0gQUREQkFfUkVTUDsKLQlBRERmcmFtZS5Ub2tlbiA9IHBBZGRyZXFGcmFtZS0+VG9rZW47Ci0JLy8gV2hhdCBpcyB0aGUgU3RhdHVzIGNvZGU/PyAgbmVlZCB0byBjaGVjay4KLQlBRERmcmFtZS5TdGF0dXNDb2RlID0gU3RhdHVzOwotCUFERGZyYW1lLkJhUGFybS5CQVBvbGljeSA9IElNTUVEX0JBOwotCUFERGZyYW1lLkJhUGFybS5BTVNEVVN1cHBvcnRlZCA9IDA7Ci0JQUREZnJhbWUuQmFQYXJtLlRJRCA9IHBBZGRyZXFGcmFtZS0+QmFQYXJtLlRJRDsKLQlBRERmcmFtZS5CYVBhcm0uQnVmU2l6ZSA9IG1pbigoKFVDSEFSKXBBZGRyZXFGcmFtZS0+QmFQYXJtLkJ1ZlNpemUpLCAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCk7Ci0JaWYgKEFERGZyYW1lLkJhUGFybS5CdWZTaXplID09IDApCi0JewotCQlBRERmcmFtZS5CYVBhcm0uQnVmU2l6ZSA9IDY0OwotCX0KLQlBRERmcmFtZS5UaW1lT3V0VmFsdWUgPSAwOyAvL3BBZGRyZXFGcmFtZS0+VGltZU91dFZhbHVlOwotCi0JKihVU0hPUlQgKikoJkFERGZyYW1lLkJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmQUREZnJhbWUuQmFQYXJtKSk7Ci0JQUREZnJhbWUuU3RhdHVzQ29kZSA9IGNwdTJsZTE2KEFERGZyYW1lLlN0YXR1c0NvZGUpOwotCUFERGZyYW1lLlRpbWVPdXRWYWx1ZSA9IGNwdTJsZTE2KEFERGZyYW1lLlRpbWVPdXRWYWx1ZSk7Ci0KLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJCQkJICBzaXplb2YoRlJBTUVfQUREQkFfUlNQKSwgICZBRERmcmFtZSwKLQkJCSAgRU5EX09GX0FSR1MpOwotCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCVkKTogVElEKCVkKSwgQnVmU2l6ZSglZCkgPD09IFxuIiwgX19GVU5DVElPTl9fLCBFbGVtLT5XY2lkLCBBRERmcmFtZS5CYVBhcm0uVElELAotCQkJCQkJCSAgQUREZnJhbWUuQmFQYXJtLkJ1ZlNpemUpKTsKLX0KLQotCi1WT0lEIFBlZXJBZGRCQVJzcEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi0KLXsKLQkvL1VDSEFSCQlJZHgsIGk7Ci0JLy9QVUNIQVIJCSAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCVBGUkFNRV9BRERCQV9SU1AgICAgcEZyYW1lID0gTlVMTDsKLQkvL1BCQV9PUklfRU5UUlkJCXBCQUVudHJ5OwotCi0JLy9BRERCQSBSZXNwb25zZSBmcm9tIHVua25vd24gcGVlciwgaWdub3JlIHRoaXMuCi0JaWYgKEVsZW0tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCi0JCXJldHVybjsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzID09PiBXY2lkKCVkKVxuIiwgX19GVU5DVElPTl9fLCBFbGVtLT5XY2lkKSk7Ci0KLQkvL2hleF9kdW1wKCJQZWVyQWRkQkFSc3BBY3Rpb24oKSIsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKTsKLQotCWlmIChQZWVyQWRkQkFSc3BBY3Rpb25TYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikpCi0JewotCQlwRnJhbWUgPSAoUEZSQU1FX0FEREJBX1JTUCkoJkVsZW0tPk1zZ1swXSk7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiXHRcdCBTdGF0dXNDb2RlID0gJWRcbiIsIHBGcmFtZS0+U3RhdHVzQ29kZSkpOwotCQlzd2l0Y2ggKHBGcmFtZS0+U3RhdHVzQ29kZSkKLQkJewotCQkJY2FzZSAwOgotCQkJCS8vIEkgd2FudCBhIEJBc2Vzc2lvbiB3aXRoIHRoaXMgcGVlciBhcyBhbiBvcmlnaW5hdG9yLgotCQkJCUJBT3JpU2Vzc2lvbkFkZChwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLCBwRnJhbWUpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQkvLyBjaGVjayBzdGF0dXMgPT0gVVNFRCA/Pz8KLQkJCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWQsIEVsZW0tPldjaWQsIHBGcmFtZS0+QmFQYXJtLlRJRCwgVFJVRSwgRkFMU0UpOwotCQkJCWJyZWFrOwotCQl9Ci0JCS8vIFJjdiBEZWNsaW5lIFN0YXR1c0NvZGUKLQkJaWYgKChwRnJhbWUtPlN0YXR1c0NvZGUgPT0gMzcpCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0gICAgICAgICAgICB8fCAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIFNUQV9UR05fV0lGSV9PTihwQWQpICYmIChwRnJhbWUtPlN0YXR1c0NvZGUgIT0gMCkpCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0gICAgICAgICAgICApCi0JCXsKLQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uQkFEZWNsaW5lQml0bWFwIHw9IDE8PHBGcmFtZS0+QmFQYXJtLlRJRDsKLQkJfQotCX0KLX0KLQotVk9JRCBQZWVyRGVsQkFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotCi17Ci0JLy9VQ0hBUgkJCQlJZHg7Ci0JLy9QVUNIQVIJCQkJcE91dEJ1ZmZlciA9IE5VTEw7Ci0JUEZSQU1FX0RFTEJBX1JFUSAgICBwRGVsRnJhbWUgPSBOVUxMOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcyA9PT5cbiIsIF9fRlVOQ1RJT05fXykpOwotCS8vREVMQkEgUmVxdWVzdCBmcm9tIHVua25vd24gcGVlciwgaWdub3JlIHRoaXMuCi0JaWYgKFBlZXJEZWxCQUFjdGlvblNhbml0eShwQWQsIEVsZW0tPldjaWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKSkKLQl7Ci0JCXBEZWxGcmFtZSA9IChQRlJBTUVfREVMQkFfUkVRKSgmRWxlbS0+TXNnWzBdKTsKLQkJaWYgKHBEZWxGcmFtZS0+RGVsYmFQYXJtLkluaXRpYXRvciA9PSBPUklHSU5BVE9SKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gUGVlckRlbEJBQWN0aW9uLS0tLT4gT1JJR0lOQVRPUlxuIikpOwotCQkJQkFSZWNTZXNzaW9uVGVhckRvd24ocEFkLCBFbGVtLT5XY2lkLCBwRGVsRnJhbWUtPkRlbGJhUGFybS5USUQsIFRSVUUpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSAtIFBlZXJEZWxCQUFjdGlvbi0tLS0+IFJFQ0lQSUVOVCwgUmVhc29uID0gJWRcbiIsICBwRGVsRnJhbWUtPlJlYXNvbkNvZGUpKTsKLQkJCS8vaGV4X2R1bXAoIkRlbEJBIEZyYW1lIiwgcERlbEZyYW1lLCBFbGVtLT5Nc2dMZW4pOwotCQkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBFbGVtLT5XY2lkLCBwRGVsRnJhbWUtPkRlbGJhUGFybS5USUQsIFRSVUUsIEZBTFNFKTsKLQkJfQotCX0KLX0KLQotCi1CT09MRUFOIENudGxFbnF1ZXVlRm9yUmVjdigKLQkJCQkJCSAgSU4gUFJUTVBfQURBUFRFUgkJcEFkLAotCQkJCQkJICBJTiBVTE9ORwkJCQlXY2lkLAotCQkJCQkJICBJTiBVTE9ORwkJCQlNc2dMZW4sCi0JCQkJCQkgIElOIFBGUkFNRV9CQV9SRVEJCXBNc2cpCi17Ci0JUEZSQU1FX0JBX1JFUSAgIHBGcmFtZSA9IHBNc2c7Ci0JLy9QUlRNUF9SRU9SREVSQlVGCXBCdWZmZXI7Ci0JLy9QUlRNUF9SRU9SREVSQlVGCXBEbWFCdWY7Ci0JUEJBX1JFQ19FTlRSWSBwQkFFbnRyeTsKLQkvL0JPT0xFQU4JUmVzdWx0OwotCVVMT05HICAgSWR4OwotCS8vVUNIQVIJTnVtUnhQa3Q7Ci0JVUNIQVIJVElEOy8vLCBpOwotCi0JVElEID0gKFVDSEFSKXBGcmFtZS0+QkFSQ29udHJvbC5USUQ7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpOiBCQVItV2NpZCglbGQpLCBUaWQgKCVkKVxuIiwgX19GVU5DVElPTl9fLCBXY2lkLCBUSUQpKTsKLQkvL2hleF9kdW1wKCJCQVIiLCAoUENIQVIpIHBGcmFtZSwgTXNnTGVuKTsKLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQkvLyBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUKLQlpZiAoTXNnTGVuID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpCi0JewotCQlEQkdQUklOVF9FUlIoKCJDbnRsRW5xdWV1ZUZvclJlY3Y6IGZyYW1lIHRvbyBsYXJnZSwgc2l6ZSA9ICVsZCBcbiIsIE1zZ0xlbikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCWVsc2UgaWYgKE1zZ0xlbiAhPSBzaXplb2YoRlJBTUVfQkFfUkVRKSkKLQl7Ci0JCURCR1BSSU5UX0VSUigoIkNudGxFbnF1ZXVlRm9yUmVjdjogQmxvY2tBY2sgUmVxdWVzdCBmcmFtZSBsZW5ndGggc2l6ZSA9ICVsZCBpbmNvcnJlY3RcbiIsIE1zZ0xlbikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCWVsc2UgaWYgKE1zZ0xlbiAhPSBzaXplb2YoRlJBTUVfQkFfUkVRKSkKLQl7Ci0JCURCR1BSSU5UX0VSUigoIkNudGxFbnF1ZXVlRm9yUmVjdjogQmxvY2tBY2sgUmVxdWVzdCBmcmFtZSBsZW5ndGggc2l6ZSA9ICVsZCBpbmNvcnJlY3RcbiIsIE1zZ0xlbikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JaWYgKChXY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpICYmIChUSUQgPCA4KSkKLQkJewotCQkvLyBpZiB0aGlzIHJlY2VpdmluZyBwYWNrZXQgaXMgZnJvbSBTQSB0aGF0IGlzIGluIG91ciBPcmlFbnRyeS4gU2luY2UgV0NJRCA8OSBoYXMgZGlyZWN0IG1hcHBpbmcuIG5vIG5lZWQgc2VhcmNoLgotCQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkJBUmVjV2NpZEFycmF5W1RJRF07Ci0JCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W0lkeF07Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCQVIoJWxkKSA6IFRpZCAoJWQpIC0gJTA0eDolMDR4XG4iLCBXY2lkLCBUSUQsIHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSwgcEJBRW50cnktPkxhc3RJbmRTZXEgKSk7Ci0KLQlpZiAoU0VRX1NNQUxMRVIocEJBRW50cnktPkxhc3RJbmRTZXEsIHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSwgTUFYU0VRKSkKLQl7Ci0JCS8vREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkFSIFNlcSA9ICV4LCBMYXN0SW5kU2VxID0gJXhcbiIsIHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSwgcEJBRW50cnktPkxhc3RJbmRTZXEpKTsKLQkJYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19sZV9zZXEocEFkLCBwQkFFbnRyeSwgcEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxKTsKLQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSAocEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxID09IDApID8gTUFYU0VRIDoocEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxIC0xKTsKLQl9Ci0JLy9iYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi1EZXNjcmlwdGlvbiA6IFNlbmQgUFNNUCBBY3Rpb24gZnJhbWUgSWYgUFNNUCBtb2RlIHN3aXRjaGVzLgotKi8KLVZPSUQgU2VuZFBTTVBBY3Rpb24oCi0JCQkJICAgSU4gUFJUTVBfQURBUFRFUgkJcEFkLAotCQkJCSAgIElOIFVDSEFSCQkJCVdjaWQsCi0JCQkJICAgSU4gVUNIQVIJCQkJUHNtcCkKLXsKLQlQVUNIQVIgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7Ci0JLy9VTE9ORyAgICAgICAgICAgSWR4OwotCUZSQU1FX1BTTVBfQUNUSU9OICAgRnJhbWU7Ci0JVUxPTkcgICAgICAgICAgIEZyYW1lTGVuOwotCi0JTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJCQSAtIE1sbWVBRERCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHIpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JRnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9IVDsKLQlGcmFtZS5BY3Rpb24gPSBTTVBTX0FDVElPTjsKLQlzd2l0Y2ggKFBzbXApCi0JewotCQljYXNlIE1NUFNfRU5BQkxFOgotI2lmZGVmIFJUMzB4eAotCQkJaWYgKElTX1JUMzB4eChwQWQpCi0JCQkJJiYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aD4xfHxwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoPjEpKQotCQkJewotCQkJCVJUTVBfQVNJQ19NTVBTX0RJU0FCTEUocEFkKTsKLQkJCX0KLSNlbmRpZiAvLyBSVDMweHggLy8KLQkJCUZyYW1lLlBzbXAgPSAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgTU1QU19EWU5BTUlDOgotCQkJRnJhbWUuUHNtcCA9IDM7Ci0JCQlicmVhazsKLQkJY2FzZSBNTVBTX1NUQVRJQzoKLSNpZmRlZiBSVDMweHgKLQkJCWlmIChJU19SVDMweHgocEFkKQotCQkJCSYmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGg+MXx8cEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aD4xKSkKLQkJCXsKLQkJCQlSVE1QX0FTSUNfTU1QU19FTkFCTEUocEFkKTsKLQkJCX0KLSNlbmRpZiAvLyBSVDMweHggLy8KLQkJCUZyYW1lLlBzbXAgPSAxOwotCQkJYnJlYWs7Ci0JfQotCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotCQkJCQkgIHNpemVvZihGUkFNRV9QU01QX0FDVElPTiksICAgICAgJkZyYW1lLAotCQkJCQkgIEVORF9PRl9BUkdTKTsKLQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJIVCAtIFNlbmRQU01QQWN0aW9uKCAlZCApICBcbiIsIEZyYW1lLlBzbXApKTsKLX0KLQotCi0jZGVmaW5lIFJBRElPX01FQVNVUkVNRU5UX1JFUVVFU1RfQUNUSU9OCTAKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VECi17Ci0JVUNIQVIJUmVndWxhdG9yeUNsYXNzOwotCVVDSEFSCUNoYW5uZWxOdW1iZXI7Ci0JVVNIT1JUCVJhbmRvbUludGVydmFsOwotCVVTSE9SVAlNZWFzdXJlbWVudER1cmF0aW9uOwotCVVDSEFSCU1lYXN1cmVtZW50TW9kZTsKLQlVQ0hBUiAgIEJTU0lEW01BQ19BRERSX0xFTl07Ci0JVUNIQVIJUmVwb3J0aW5nQ29uZGl0aW9uOwotCVVDSEFSCVRocmVzaG9sZDsKLQlVQ0hBUiAgIFNTSURJRVsyXTsJCQkvLyAyIGJ5dGUKLX0gQkVBQ09OX1JFUVVFU1Q7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRAotewotCVVDSEFSCUlEOwotCVVDSEFSCUxlbmd0aDsKLQlVQ0hBUglUb2tlbjsKLQlVQ0hBUglSZXF1ZXN0TW9kZTsKLQlVQ0hBUglUeXBlOwotfSBNRUFTVVJFTUVOVF9SRVE7Ci0KLQotCi0KLXZvaWQgY29udmVydF9yZW9yZGVyaW5nX3BhY2tldF90b19wcmVBTVNEVV9vcl84MDJfM19wYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTiAgVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKLXsKLQlQTkRJU19QQUNLRVQJcFJ4UGt0OwotCVVDSEFSCQkJSGVhZGVyODAyXzNbTEVOR1RIXzgwMl8zXTsKLQotCS8vIDEuIGdldCA4MDIuMyBIZWFkZXIKLQkvLyAyLiByZW1vdmUgTExDCi0JLy8JCWEuIHBvaW50ZXIgcFJ4QmxrLT5wRGF0YSB0byBwYXlsb2FkCi0JLy8gICAgICBiLiBtb2RpZnkgcFJ4QmxrLT5EYXRhU2l6ZQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJUlRNUF84MDJfMTFfUkVNT1ZFX0xMQ19BTkRfQ09OVkVSVF9UT184MDJfMyhwUnhCbGssIEhlYWRlcjgwMl8zKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCUFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7Ci0JcFJ4UGt0ID0gUlRQS1RfVE9fT1NQS1QocFJ4QmxrLT5wUnhQYWNrZXQpOwotCi0JU0VUX09TX1BLVF9ORVRERVYocFJ4UGt0LCBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBGcm9tV2hpY2hCU1NJRCkpOwotCVNFVF9PU19QS1RfREFUQVBUUihwUnhQa3QsIHBSeEJsay0+cERhdGEpOwotCVNFVF9PU19QS1RfTEVOKHBSeFBrdCwgcFJ4QmxrLT5EYXRhU2l6ZSk7Ci0JU0VUX09TX1BLVF9EQVRBVEFJTChwUnhQa3QsIHBSeEJsay0+cERhdGEsIHBSeEJsay0+RGF0YVNpemUpOwotCi0JLy8KLQkvLyBjb3B5IDgwMi4zIGhlYWRlciwgaWYgbmVjZXNzYXJ5Ci0JLy8KLQlpZiAoIVJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQU1TRFUpKQotCXsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0jaWZkZWYgTElOVVgKLQkJCU5kaXNNb3ZlTWVtb3J5KHNrYl9wdXNoKHBSeFBrdCwgTEVOR1RIXzgwMl8zKSwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMyk7Ci0jZW5kaWYKLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCX0KLX0KLQotCi0jZGVmaW5lIElORElDQVRFX0xFR0FDWV9PUl9BTVNEVShfcEFkLCBfcFJ4QmxrLCBfZnJvbVdoaWNoQlNTSUQpCQlcCi0JZG8JCQkJCQkJCQkJCQkJCQkJCVwKLQl7CQkJCQkJCQkJCQkJCQkJCQlcCi0JaWYgKFJYX0JMS19URVNUX0ZMQUcoX3BSeEJsaywgZlJYX0FNU0RVKSkJCQkJCQlcCi0JewkJCQkJCQkJCQkJCQkJCQlcCi0JCUluZGljYXRlX0FNU0RVX1BhY2tldChfcEFkLCBfcFJ4QmxrLCBfZnJvbVdoaWNoQlNTSUQpOwkJXAotCX0JCQkJCQkJCQkJCQkJCQkJXAotCQllbHNlIGlmIChSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIGZSWF9FQVApKQkJCQkJXAotCQl7CQkJCQkJCQkJCQkJCQkJCVwKLQkJCUluZGljYXRlX0VBUE9MX1BhY2tldChfcEFkLCBfcFJ4QmxrLCBfZnJvbVdoaWNoQlNTSUQpOwkJXAotCQl9CQkJCQkJCQkJCQkJCQkJCVwKLQllbHNlCQkJCQkJCQkJCQkJCQkJXAotCXsJCQkJCQkJCQkJCQkJCQkJXAotCQlJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KF9wQWQsIF9wUnhCbGssIF9mcm9tV2hpY2hCU1NJRCk7CQlcCi0JfQkJCQkJCQkJCQkJCQkJCQlcCi0JfSB3aGlsZSAoMCk7Ci0KLQotCi1zdGF0aWMgVk9JRCBiYV9lbnF1ZXVlX3Jlb3JkZXJpbmdfcGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBCQV9SRUNfRU5UUlkJcEJBRW50cnksCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQotewotCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOwotCVVJTlQxNglTZXF1ZW5jZSA9IChVSU5UMTYpIHBSeEJsay0+cEhlYWRlci0+U2VxdWVuY2U7Ci0KLQltcGR1X2JsayA9IGJhX21wZHVfYmxrX2FsbG9jKHBBZCk7Ci0JaWYgKChtcGR1X2JsayAhPSBOVUxMKSAmJgotCQkoIVJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfRUFQKSkpCi0JewotCQkvLyBXcml0ZSBSeEQgYnVmZmVyIGFkZHJlc3MgJiBhbGxvY2F0ZWQgYnVmZmVyIGxlbmd0aAotCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKLQotCQltcGR1X2Jsay0+U2VxdWVuY2UgPSBTZXF1ZW5jZTsKLQotCQltcGR1X2Jsay0+YkFNU0RVID0gUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSk7Ci0KLQkJY29udmVydF9yZW9yZGVyaW5nX3BhY2tldF90b19wcmVBTVNEVV9vcl84MDJfM19wYWNrZXQocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKLQotCQlTVEFUU19JTkNfUlhfUEFDS0VUUyhwQWQsIEZyb21XaGljaEJTU0lEKTsKLQotICAgICAgICAvLwotCQkvLyBpdCBpcyBuZWNlc3NhcnkgZm9yIHJlb3JkZXJpbmcgcGFja2V0IHRvIHJlY29yZAotCQkvLyB3aGljaCBCU1MgaXQgY29tZSBmcm9tCi0JCS8vCi0JCVJUTVBfU0VUX1BBQ0tFVF9JRihwUnhCbGstPnBSeFBhY2tldCwgRnJvbVdoaWNoQlNTSUQpOwotCi0JCW1wZHVfYmxrLT5wUGFja2V0ID0gcFJ4QmxrLT5wUnhQYWNrZXQ7Ci0KLQkJaWYgKGJhX3Jlb3JkZXJpbmdfbXBkdV9pbnNlcnRzb3J0ZWQoJnBCQUVudHJ5LT5saXN0LCBtcGR1X2JsaykgPT0gRkFMU0UpCi0JCXsKLQkJCS8vIGhhZCBiZWVuIGFscmVhZHkgd2l0aGluIHJlb3JkZXJpbmcgbGlzdAotCQkJLy8gZG9uJ3QgaW5kaWNhdGUKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCQliYV9tcGR1X2Jsa19mcmVlKHBBZCwgbXBkdV9ibGspOwotCQl9Ci0KLQkJQVNTRVJUKCgwPD0gcEJBRW50cnktPmxpc3QucWxlbikgICYmIChwQkFFbnRyeS0+bGlzdC5xbGVuIDw9IHBCQUVudHJ5LT5CQVdpblNpemUpKTsKLQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAgKCIhISEgKCVkKSBDYW4ndCBhbGxvY2F0ZSByZW9yZGVyaW5nIG1wZHUgYmxrXG4iLAotCQkJCQkJCQkgICBwQkFFbnRyeS0+bGlzdC5xbGVuKSk7Ci0JCS8qCi0JCSAqIGZsdXNoIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgbXBkdXMKLQkJICogYW5kIHJlY2V2aW5nIG1wZHUgdG8gdXBwZXIgbGF5ZXIKLQkJICogbWFrZSB0Y3AvaXAgdG8gdGFrZSBjYXJlIHJlb3JkZXJpbmcgbWVjaGFuaXNtCi0JCSAqLwotCQkvL2JhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKLQkJYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19sZV9zZXEocEFkLCBwQkFFbnRyeSwgU2VxdWVuY2UpOwotCi0JCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gU2VxdWVuY2U7Ci0JCUlORElDQVRFX0xFR0FDWV9PUl9BTVNEVShwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwotCX0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUluZGljYXRlIHRoaXMgcGFja2V0IHRvIHVwcGVyIGxheWVyIG9yIHB1dCBpdCBpbnRvIHJlb3JkZXJpbmcgYnVmZmVyCi0KLQlQYXJhbWV0cnM6Ci0JCXBSeEJsayAgICAgICAgIDogY2FycnkgbmVjZXNzYXJ5IHBhY2tldCBpbmZvIDgwMi4xMSBmb3JtYXQKLQkJRnJvbVdoaWNoQlNTSUQgOiB0aGUgcGFja2V0IHJlY2VpdmVkIGZyb20gd2hpY2ggQlNTCi0KLQlSZXR1cm4JOgotCQkJICBub25lCi0KLQlOb3RlICAgIDoKLQkgICAgICAgICAgdGhlIHBhY2tldCBxdWV1ZWQgaW50byByZW9yZGVyaW5nIGJ1ZmZlciBuZWVkIHRvIGNvdmVyIHRvIDgwMi4zIGZvcm1hdAotCQkJICBvciBwcmVfQU1TRFUgZm9ybWF0Ci0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotCi1WT0lEIEluZGljYXRlX0FNUERVX1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCi17Ci0JVVNIT1JUCQkJCUlkeDsKLQlQQkFfUkVDX0VOVFJZCQlwQkFFbnRyeSA9IE5VTEw7Ci0JVUlOVDE2CQkJCVNlcXVlbmNlID0gcFJ4QmxrLT5wSGVhZGVyLT5TZXF1ZW5jZTsKLQlVTE9ORwkJCQlOb3czMjsKLQlVQ0hBUgkJCQlXY2lkID0gcFJ4QmxrLT5wUnhXSS0+V2lyZWxlc3NDbGlJRDsKLQlVQ0hBUgkJCQlUSUQgPSBwUnhCbGstPnBSeFdJLT5USUQ7Ci0KLQotCWlmICghUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSkgJiYgIChwUnhCbGstPkRhdGFTaXplID4gTUFYX1JYX1BLVF9MRU4pKQotCXsKLQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJcmV0dXJuOwotCX0KLQotCi0KLQlpZiAoV2NpZCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQotCXsKLQkJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5CQVJlY1djaWRBcnJheVtUSURdOwotCQlpZiAoSWR4ID09IDApCi0JCXsKLQkJCS8qIFJlYyBCQSBTZXNzaW9uIGhhZCBiZWVuIHRvcm4gZG93biAqLwotCQkJSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gaW1wb3NzaWJsZSAhISEKLQkJQVNTRVJUKDApOwotCQkvLyByZWxlYXNlIHBhY2tldAotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQlyZXR1cm47Ci0JfQotCi0JQVNTRVJUKHBCQUVudHJ5KTsKLQotCS8vIHVwZGF0ZSBsYXN0IHJ4IHRpbWUKLQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3czMik7Ci0KLQlwQkFFbnRyeS0+cmN2U2VxID0gU2VxdWVuY2U7Ci0KLQotCWJhX2ZsdXNoX3Jlb3JkZXJpbmdfdGltZW91dF9tcGR1cyhwQWQsIHBCQUVudHJ5LCBOb3czMik7Ci0JcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7Ci0KLQkvLwotCS8vIFJlc2V0IExhc3QgSW5kaWNhdGUgU2VxdWVuY2UKLQkvLwotCWlmIChwQkFFbnRyeS0+TGFzdEluZFNlcSA9PSBSRVNFVF9SQ1ZfU0VRKQotCXsKLQkJQVNTRVJUKChwQkFFbnRyeS0+bGlzdC5xbGVuID09IDApICYmIChwQkFFbnRyeS0+bGlzdC5uZXh0ID09IE5VTEwpKTsKLQotCQkvLyByZXNldCByY3Ygc2VxdWVuY2Ugb2YgQkEgc2Vzc2lvbgotCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFNlcXVlbmNlOwotCQlwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgPSBOb3czMjsKLQkJSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLwotCS8vIEkuIENoZWNrIGlmIGluIG9yZGVyLgotCS8vCi0JaWYgKFNFUV9TVEVQT05FKFNlcXVlbmNlLCBwQkFFbnRyeS0+TGFzdEluZFNlcSwgTUFYU0VRKSkKLQl7Ci0JCVVTSE9SVCAgTGFzdEluZFNlcTsKLQotCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFNlcXVlbmNlOwotCQlJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKLQkJTGFzdEluZFNlcSA9IGJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfaW5fb3JkZXIocEFkLCBwQkFFbnRyeSwgcEJBRW50cnktPkxhc3RJbmRTZXEpOwotCQlpZiAoTGFzdEluZFNlcSAhPSBSRVNFVF9SQ1ZfU0VRKQotCQl7Ci0JCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IExhc3RJbmRTZXE7Ci0JCX0KLQkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7Ci0JfQotCS8vCi0JLy8gSUkuIERyb3AgRHVwbGljYXRlZCBQYWNrZXQKLQkvLwotCWVsc2UgaWYgKFNlcXVlbmNlID09IHBCQUVudHJ5LT5MYXN0SW5kU2VxKQotCXsKLQotCQkvLyBkcm9wIGFuZCByZWxlYXNlIHBhY2tldAotCQlwQkFFbnRyeS0+bkRyb3BQYWNrZXQrKzsKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQl9Ci0JLy8KLQkvLyBJSUkuIERyb3AgT2xkIFJlY2VpdmVkIFBhY2tldAotCS8vCi0JZWxzZSBpZiAoU0VRX1NNQUxMRVIoU2VxdWVuY2UsIHBCQUVudHJ5LT5MYXN0SW5kU2VxLCBNQVhTRVEpKQotCXsKLQotCQkvLyBkcm9wIGFuZCByZWxlYXNlIHBhY2tldAotCQlwQkFFbnRyeS0+bkRyb3BQYWNrZXQrKzsKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQl9Ci0JLy8KLQkvLyBJVi4gUmVjZWl2ZSBTZXF1ZW5jZSB3aXRoaW4gV2luZG93IFNpemUKLQkvLwotCWVsc2UgaWYgKFNFUV9TTUFMTEVSKFNlcXVlbmNlLCAoKChwQkFFbnRyeS0+TGFzdEluZFNlcStwQkFFbnRyeS0+QkFXaW5TaXplKzEpKSAmIE1BWFNFUSksIE1BWFNFUSkpCi0JewotCQliYV9lbnF1ZXVlX3Jlb3JkZXJpbmdfcGFja2V0KHBBZCwgcEJBRW50cnksIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwotCX0KLQkvLwotCS8vIFYuIFJlY2VpdmUgc2VxIHN1cnBhc3NlcyBXaW4obGFzdHNlcSArIG5NU0RVKS4gU28gcmVmcmVzaCBhbGwgcmVvcmRlciBidWZmZXIKLQkvLwotCWVsc2UKLQl7Ci0JCUxPTkcgV2luU3RhcnRTZXEsIFRtcFNlcTsKLQotCi0JCVRtcFNlcSA9IFNlcXVlbmNlIC0gKHBCQUVudHJ5LT5CQVdpblNpemUpIC0xOwotCQlpZiAoVG1wU2VxIDwgMCkKLQkJewotCQkJVG1wU2VxID0gKE1BWFNFUSsxKSArIFRtcFNlcTsKLQkJfQotCQlXaW5TdGFydFNlcSA9IChUbXBTZXErMSkgJiBNQVhTRVE7Ci0JCWJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfbGVfc2VxKHBBZCwgcEJBRW50cnksIFdpblN0YXJ0U2VxKTsKLQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBXaW5TdGFydFNlcTsgLy9UbXBTZXE7Ci0KLQkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7Ci0KLQkJYmFfZW5xdWV1ZV9yZW9yZGVyaW5nX3BhY2tldChwQWQsIHBCQUVudHJ5LCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKLQotCQlUbXBTZXEgPSBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2luX29yZGVyKHBBZCwgcEJBRW50cnksIHBCQUVudHJ5LT5MYXN0SW5kU2VxKTsKLQkJaWYgKFRtcFNlcSAhPSBSRVNFVF9SQ1ZfU0VRKQotCQl7Ci0JCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFRtcFNlcTsKLQkJfQotCX0KLX0KLQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX2Flcy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX2Flcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2NiYmJmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV9hZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDE1NjAgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQljbW1fYWVzLmMKLQotCUFic3RyYWN0OgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCQlXaGVuCQkJV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlQYXVsIFd1CQkwMi0yNS0wMgkJSW5pdGlhbAotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLXR5cGVkZWYJc3RydWN0Ci17Ci0gICAgVUlOVDMyIGVya1s2NF07ICAgICAvKiBlbmNyeXB0aW9uIHJvdW5kIGtleXMgKi8KLSAgICBVSU5UMzIgZHJrWzY0XTsgICAgIC8qIGRlY3J5cHRpb24gcm91bmQga2V5cyAqLwotICAgIGludCBucjsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHJvdW5kcyAqLwotfQotYWVzX2NvbnRleHQ7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKiBTQk9YIFRhYmxlICoqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotVUNIQVIgU2JveFRhYmxlWzI1Nl0gPQotewotCTB4NjMsIDB4N2MsIDB4NzcsIDB4N2IsIDB4ZjIsIDB4NmIsIDB4NmYsIDB4YzUsCi0JMHgzMCwgMHgwMSwgMHg2NywgMHgyYiwgMHhmZSwgMHhkNywgMHhhYiwgMHg3NiwKLQkweGNhLCAweDgyLCAweGM5LCAweDdkLCAweGZhLCAweDU5LCAweDQ3LCAweGYwLAotCTB4YWQsIDB4ZDQsIDB4YTIsIDB4YWYsIDB4OWMsIDB4YTQsIDB4NzIsIDB4YzAsCi0JMHhiNywgMHhmZCwgMHg5MywgMHgyNiwgMHgzNiwgMHgzZiwgMHhmNywgMHhjYywKLQkweDM0LCAweGE1LCAweGU1LCAweGYxLCAweDcxLCAweGQ4LCAweDMxLCAweDE1LAotCTB4MDQsIDB4YzcsIDB4MjMsIDB4YzMsIDB4MTgsIDB4OTYsIDB4MDUsIDB4OWEsCi0JMHgwNywgMHgxMiwgMHg4MCwgMHhlMiwgMHhlYiwgMHgyNywgMHhiMiwgMHg3NSwKLQkweDA5LCAweDgzLCAweDJjLCAweDFhLCAweDFiLCAweDZlLCAweDVhLCAweGEwLAotCTB4NTIsIDB4M2IsIDB4ZDYsIDB4YjMsIDB4MjksIDB4ZTMsIDB4MmYsIDB4ODQsCi0JMHg1MywgMHhkMSwgMHgwMCwgMHhlZCwgMHgyMCwgMHhmYywgMHhiMSwgMHg1YiwKLQkweDZhLCAweGNiLCAweGJlLCAweDM5LCAweDRhLCAweDRjLCAweDU4LCAweGNmLAotCTB4ZDAsIDB4ZWYsIDB4YWEsIDB4ZmIsIDB4NDMsIDB4NGQsIDB4MzMsIDB4ODUsCi0JMHg0NSwgMHhmOSwgMHgwMiwgMHg3ZiwgMHg1MCwgMHgzYywgMHg5ZiwgMHhhOCwKLQkweDUxLCAweGEzLCAweDQwLCAweDhmLCAweDkyLCAweDlkLCAweDM4LCAweGY1LAotCTB4YmMsIDB4YjYsIDB4ZGEsIDB4MjEsIDB4MTAsIDB4ZmYsIDB4ZjMsIDB4ZDIsCi0JMHhjZCwgMHgwYywgMHgxMywgMHhlYywgMHg1ZiwgMHg5NywgMHg0NCwgMHgxNywKLQkweGM0LCAweGE3LCAweDdlLCAweDNkLCAweDY0LCAweDVkLCAweDE5LCAweDczLAotCTB4NjAsIDB4ODEsIDB4NGYsIDB4ZGMsIDB4MjIsIDB4MmEsIDB4OTAsIDB4ODgsCi0JMHg0NiwgMHhlZSwgMHhiOCwgMHgxNCwgMHhkZSwgMHg1ZSwgMHgwYiwgMHhkYiwKLQkweGUwLCAweDMyLCAweDNhLCAweDBhLCAweDQ5LCAweDA2LCAweDI0LCAweDVjLAotCTB4YzIsIDB4ZDMsIDB4YWMsIDB4NjIsIDB4OTEsIDB4OTUsIDB4ZTQsIDB4NzksCi0JMHhlNywgMHhjOCwgMHgzNywgMHg2ZCwgMHg4ZCwgMHhkNSwgMHg0ZSwgMHhhOSwKLQkweDZjLCAweDU2LCAweGY0LCAweGVhLCAweDY1LCAweDdhLCAweGFlLCAweDA4LAotCTB4YmEsIDB4NzgsIDB4MjUsIDB4MmUsIDB4MWMsIDB4YTYsIDB4YjQsIDB4YzYsCi0JMHhlOCwgMHhkZCwgMHg3NCwgMHgxZiwgMHg0YiwgMHhiZCwgMHg4YiwgMHg4YSwKLQkweDcwLCAweDNlLCAweGI1LCAweDY2LCAweDQ4LCAweDAzLCAweGY2LCAweDBlLAotCTB4NjEsIDB4MzUsIDB4NTcsIDB4YjksIDB4ODYsIDB4YzEsIDB4MWQsIDB4OWUsCi0JMHhlMSwgMHhmOCwgMHg5OCwgMHgxMSwgMHg2OSwgMHhkOSwgMHg4ZSwgMHg5NCwKLQkweDliLCAweDFlLCAweDg3LCAweGU5LCAweGNlLCAweDU1LCAweDI4LCAweGRmLAotCTB4OGMsIDB4YTEsIDB4ODksIDB4MGQsIDB4YmYsIDB4ZTYsIDB4NDIsIDB4NjgsCi0JMHg0MSwgMHg5OSwgMHgyZCwgMHgwZiwgMHhiMCwgMHg1NCwgMHhiYiwgMHgxNgotfTsKLQotVk9JRCB4b3JfMzIoCi0JSU4gIFBVQ0hBUiAgYSwKLQlJTiAgUFVDSEFSICBiLAotCU9VVCBQVUNIQVIgIG91dCkKLXsKLQlJTlQgaTsKLQotCWZvciAoaT0wO2k8NDsgaSsrKQotCXsKLQkJb3V0W2ldID0gYVtpXSBeIGJbaV07Ci0JfQotfQotCi1WT0lEIHhvcl8xMjgoCi0JSU4gIFBVQ0hBUiAgYSwKLQlJTiAgUFVDSEFSICBiLAotCU9VVCBQVUNIQVIgIG91dCkKLXsKLQlJTlQgaTsKLQotCWZvciAoaT0wO2k8MTY7IGkrKykKLQl7Ci0JCW91dFtpXSA9IGFbaV0gXiBiW2ldOwotCX0KLX0KLQotVUNIQVIgUlRNUENraXBTYm94KAotCUlOICBVQ0hBUiAgIGEpCi17Ci0JcmV0dXJuIFNib3hUYWJsZVsoaW50KWFdOwotfQotCi1WT0lEIG5leHRfa2V5KAotCUlOICBQVUNIQVIgIGtleSwKLQlJTiAgSU5UICAgICByb3VuZCkKLXsKLQlVQ0hBUiAgICAgICByY29uOwotCVVDSEFSICAgICAgIHNib3hfa2V5WzRdOwotCVVDSEFSICAgICAgIHJjb25fdGFibGVbMTJdID0KLQl7Ci0JCTB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsCi0JCTB4MWIsIDB4MzYsIDB4MzYsIDB4MzYKLQl9OwotCi0Jc2JveF9rZXlbMF0gPSBSVE1QQ2tpcFNib3goa2V5WzEzXSk7Ci0Jc2JveF9rZXlbMV0gPSBSVE1QQ2tpcFNib3goa2V5WzE0XSk7Ci0Jc2JveF9rZXlbMl0gPSBSVE1QQ2tpcFNib3goa2V5WzE1XSk7Ci0Jc2JveF9rZXlbM10gPSBSVE1QQ2tpcFNib3goa2V5WzEyXSk7Ci0KLQlyY29uID0gcmNvbl90YWJsZVtyb3VuZF07Ci0KLQl4b3JfMzIoJmtleVswXSwgc2JveF9rZXksICZrZXlbMF0pOwotCWtleVswXSA9IGtleVswXSBeIHJjb247Ci0KLQl4b3JfMzIoJmtleVs0XSwgJmtleVswXSwgJmtleVs0XSk7Ci0JeG9yXzMyKCZrZXlbOF0sICZrZXlbNF0sICZrZXlbOF0pOwotCXhvcl8zMigma2V5WzEyXSwgJmtleVs4XSwgJmtleVsxMl0pOwotfQotCi1WT0lEIGJ5dGVfc3ViKAotCUlOICBQVUNIQVIgIGluLAotCU9VVCBQVUNIQVIgIG91dCkKLXsKLQlJTlQgaTsKLQotCWZvciAoaT0wOyBpPCAxNjsgaSsrKQotCXsKLQkJb3V0W2ldID0gUlRNUENraXBTYm94KGluW2ldKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBiaXR3aXNlX3hvcigpICAgICAgICAgICAgICAgICAgICAqLwotLyogQSAxMjggYml0LCBiaXR3aXNlIGV4Y2x1c2l2ZSBvciAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYml0d2lzZV94b3IodW5zaWduZWQgY2hhciAqaW5hLCB1bnNpZ25lZCBjaGFyICppbmIsIHVuc2lnbmVkIGNoYXIgKm91dCkKLXsKLQlpbnQgaTsKLQlmb3IgKGk9MDsgaTwxNjsgaSsrKQotCXsKLQkJb3V0W2ldID0gaW5hW2ldIF4gaW5iW2ldOwotCX0KLX0KLQotVk9JRCBzaGlmdF9yb3coCi0JSU4gIFBVQ0hBUiAgaW4sCi0JT1VUIFBVQ0hBUiAgb3V0KQotewotCW91dFswXSA9ICBpblswXTsKLQlvdXRbMV0gPSAgaW5bNV07Ci0Jb3V0WzJdID0gIGluWzEwXTsKLQlvdXRbM10gPSAgaW5bMTVdOwotCW91dFs0XSA9ICBpbls0XTsKLQlvdXRbNV0gPSAgaW5bOV07Ci0Jb3V0WzZdID0gIGluWzE0XTsKLQlvdXRbN10gPSAgaW5bM107Ci0Jb3V0WzhdID0gIGluWzhdOwotCW91dFs5XSA9ICBpblsxM107Ci0Jb3V0WzEwXSA9IGluWzJdOwotCW91dFsxMV0gPSBpbls3XTsKLQlvdXRbMTJdID0gaW5bMTJdOwotCW91dFsxM10gPSBpblsxXTsKLQlvdXRbMTRdID0gaW5bNl07Ci0Jb3V0WzE1XSA9IGluWzExXTsKLX0KLQotVk9JRCBtaXhfY29sdW1uKAotCUlOICBQVUNIQVIgIGluLAotCU9VVCBQVUNIQVIgIG91dCkKLXsKLQlJTlQgICAgICAgICBpOwotCVVDSEFSICAgICAgIGFkZDFiWzRdOwotCVVDSEFSICAgICAgIGFkZDFiZjdbNF07Ci0JVUNIQVIgICAgICAgcm90bFs0XTsKLQlVQ0hBUiAgICAgICBzd2FwX2hhbGZzWzRdOwotCVVDSEFSICAgICAgIGFuZGY3WzRdOwotCVVDSEFSICAgICAgIHJvdHJbNF07Ci0JVUNIQVIgICAgICAgdGVtcFs0XTsKLQlVQ0hBUiAgICAgICB0ZW1wYls0XTsKLQotCWZvciAoaT0wIDsgaTw0OyBpKyspCi0JewotCQlpZiAoKGluW2ldICYgMHg4MCk9PSAweDgwKQotCQkJYWRkMWJbaV0gPSAweDFiOwotCQllbHNlCi0JCQlhZGQxYltpXSA9IDB4MDA7Ci0JfQotCi0Jc3dhcF9oYWxmc1swXSA9IGluWzJdOyAgICAvKiBTd2FwIGhhbGZzICovCi0Jc3dhcF9oYWxmc1sxXSA9IGluWzNdOwotCXN3YXBfaGFsZnNbMl0gPSBpblswXTsKLQlzd2FwX2hhbGZzWzNdID0gaW5bMV07Ci0KLQlyb3RsWzBdID0gaW5bM107ICAgICAgICAvKiBSb3RhdGUgbGVmdCA4IGJpdHMgKi8KLQlyb3RsWzFdID0gaW5bMF07Ci0Jcm90bFsyXSA9IGluWzFdOwotCXJvdGxbM10gPSBpblsyXTsKLQotCWFuZGY3WzBdID0gaW5bMF0gJiAweDdmOwotCWFuZGY3WzFdID0gaW5bMV0gJiAweDdmOwotCWFuZGY3WzJdID0gaW5bMl0gJiAweDdmOwotCWFuZGY3WzNdID0gaW5bM10gJiAweDdmOwotCi0JZm9yIChpID0gMzsgaT4wOyBpLS0pICAgIC8qIGxvZ2ljYWwgc2hpZnQgbGVmdCAxIGJpdCAqLwotCXsKLQkJYW5kZjdbaV0gPSBhbmRmN1tpXSA8PCAxOwotCQlpZiAoKGFuZGY3W2ktMV0gJiAweDgwKSA9PSAweDgwKQotCQl7Ci0JCQlhbmRmN1tpXSA9IChhbmRmN1tpXSB8IDB4MDEpOwotCQl9Ci0JfQotCWFuZGY3WzBdID0gYW5kZjdbMF0gPDwgMTsKLQlhbmRmN1swXSA9IGFuZGY3WzBdICYgMHhmZTsKLQotCXhvcl8zMihhZGQxYiwgYW5kZjcsIGFkZDFiZjcpOwotCi0JeG9yXzMyKGluLCBhZGQxYmY3LCByb3RyKTsKLQotCXRlbXBbMF0gPSByb3RyWzBdOyAgICAgICAgIC8qIFJvdGF0ZSByaWdodCA4IGJpdHMgKi8KLQlyb3RyWzBdID0gcm90clsxXTsKLQlyb3RyWzFdID0gcm90clsyXTsKLQlyb3RyWzJdID0gcm90clszXTsKLQlyb3RyWzNdID0gdGVtcFswXTsKLQotCXhvcl8zMihhZGQxYmY3LCByb3RyLCB0ZW1wKTsKLQl4b3JfMzIoc3dhcF9oYWxmcywgcm90bCx0ZW1wYik7Ci0JeG9yXzMyKHRlbXAsIHRlbXBiLCBvdXQpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBjb25zdHJ1Y3RfbWljX2hlYWRlcjEoKSAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQnVpbGRzIHRoZSBmaXJzdCBNSUMgaGVhZGVyIGJsb2NrIGZyb20gICAgICAgKi8KLS8qIGhlYWRlciBmaWVsZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGNvbnN0cnVjdF9taWNfaGVhZGVyMSgKLQl1bnNpZ25lZCBjaGFyICptaWNfaGVhZGVyMSwKLQlpbnQgaGVhZGVyX2xlbmd0aCwKLQl1bnNpZ25lZCBjaGFyICptcGR1KQotewotCW1pY19oZWFkZXIxWzBdID0gKHVuc2lnbmVkIGNoYXIpKChoZWFkZXJfbGVuZ3RoIC0gMikgLyAyNTYpOwotCW1pY19oZWFkZXIxWzFdID0gKHVuc2lnbmVkIGNoYXIpKChoZWFkZXJfbGVuZ3RoIC0gMikgJSAyNTYpOwotCW1pY19oZWFkZXIxWzJdID0gbXBkdVswXSAmIDB4Y2Y7ICAgIC8qIE11dGUgQ0YgcG9sbCAmIENGIGFjayBiaXRzICovCi0JbWljX2hlYWRlcjFbM10gPSBtcGR1WzFdICYgMHhjNzsgICAgLyogTXV0ZSByZXRyeSwgbW9yZSBkYXRhIGFuZCBwd3IgbWd0IGJpdHMgKi8KLQltaWNfaGVhZGVyMVs0XSA9IG1wZHVbNF07ICAgICAgIC8qIEExICovCi0JbWljX2hlYWRlcjFbNV0gPSBtcGR1WzVdOwotCW1pY19oZWFkZXIxWzZdID0gbXBkdVs2XTsKLQltaWNfaGVhZGVyMVs3XSA9IG1wZHVbN107Ci0JbWljX2hlYWRlcjFbOF0gPSBtcGR1WzhdOwotCW1pY19oZWFkZXIxWzldID0gbXBkdVs5XTsKLQltaWNfaGVhZGVyMVsxMF0gPSBtcGR1WzEwXTsgICAgIC8qIEEyICovCi0JbWljX2hlYWRlcjFbMTFdID0gbXBkdVsxMV07Ci0JbWljX2hlYWRlcjFbMTJdID0gbXBkdVsxMl07Ci0JbWljX2hlYWRlcjFbMTNdID0gbXBkdVsxM107Ci0JbWljX2hlYWRlcjFbMTRdID0gbXBkdVsxNF07Ci0JbWljX2hlYWRlcjFbMTVdID0gbXBkdVsxNV07Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBjb25zdHJ1Y3RfbWljX2hlYWRlcjIoKSAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQnVpbGRzIHRoZSBsYXN0IE1JQyBoZWFkZXIgYmxvY2sgZnJvbSAgICAgICAgKi8KLS8qIGhlYWRlciBmaWVsZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGNvbnN0cnVjdF9taWNfaGVhZGVyMigKLQl1bnNpZ25lZCBjaGFyICptaWNfaGVhZGVyMiwKLQl1bnNpZ25lZCBjaGFyICptcGR1LAotCWludCBhNF9leGlzdHMsCi0JaW50IHFjX2V4aXN0cykKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGk8MTY7IGkrKykgbWljX2hlYWRlcjJbaV09MHgwMDsKLQotCW1pY19oZWFkZXIyWzBdID0gbXBkdVsxNl07ICAgIC8qIEEzICovCi0JbWljX2hlYWRlcjJbMV0gPSBtcGR1WzE3XTsKLQltaWNfaGVhZGVyMlsyXSA9IG1wZHVbMThdOwotCW1pY19oZWFkZXIyWzNdID0gbXBkdVsxOV07Ci0JbWljX2hlYWRlcjJbNF0gPSBtcGR1WzIwXTsKLQltaWNfaGVhZGVyMls1XSA9IG1wZHVbMjFdOwotCi0JLy8gSW4gU2VxdWVuY2UgQ29udHJvbCBmaWVsZCwgbXV0ZSBzZXF1ZW5jZSBudW1lciBiaXRzICgxMi1iaXQpCi0JbWljX2hlYWRlcjJbNl0gPSBtcGR1WzIyXSAmIDB4MGY7ICAgLyogU0MgKi8KLQltaWNfaGVhZGVyMls3XSA9IDB4MDA7IC8qIG1wZHVbMjNdOyAqLwotCi0JaWYgKCghcWNfZXhpc3RzKSAmIGE0X2V4aXN0cykKLQl7Ci0JCWZvciAoaT0wO2k8NjtpKyspIG1pY19oZWFkZXIyWzgraV0gPSBtcGR1WzI0K2ldOyAgIC8qIEE0ICovCi0KLQl9Ci0KLQlpZiAocWNfZXhpc3RzICYmICghYTRfZXhpc3RzKSkKLQl7Ci0JCW1pY19oZWFkZXIyWzhdID0gbXBkdVsyNF0gJiAweDBmOyAvKiBtdXRlIGJpdHMgMTUgLSA0ICovCi0JCW1pY19oZWFkZXIyWzldID0gbXBkdVsyNV0gJiAweDAwOwotCX0KLQotCWlmIChxY19leGlzdHMgJiYgYTRfZXhpc3RzKQotCXsKLQkJZm9yIChpPTA7aTw2O2krKykgbWljX2hlYWRlcjJbOCtpXSA9IG1wZHVbMjQraV07ICAgLyogQTQgKi8KLQotCQltaWNfaGVhZGVyMlsxNF0gPSBtcGR1WzMwXSAmIDB4MGY7Ci0JCW1pY19oZWFkZXIyWzE1XSA9IG1wZHVbMzFdICYgMHgwMDsKLQl9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIGNvbnN0cnVjdF9taWNfaXYoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBCdWlsZHMgdGhlIE1JQyBJViBmcm9tIGhlYWRlciBmaWVsZHMgYW5kIFBOICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBjb25zdHJ1Y3RfbWljX2l2KAotCXVuc2lnbmVkIGNoYXIgKm1pY19pdiwKLQlpbnQgcWNfZXhpc3RzLAotCWludCBhNF9leGlzdHMsCi0JdW5zaWduZWQgY2hhciAqbXBkdSwKLQl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW5ndGgsCi0JdW5zaWduZWQgY2hhciAqcG5fdmVjdG9yKQotewotCWludCBpOwotCi0JbWljX2l2WzBdID0gMHg1OTsKLQlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykKLQkJbWljX2l2WzFdID0gbXBkdVszMF0gJiAweDBmOyAgICAvKiBRb1NfVEMgICAgICAgICAgICovCi0JaWYgKHFjX2V4aXN0cyAmJiAhYTRfZXhpc3RzKQotCQltaWNfaXZbMV0gPSBtcGR1WzI0XSAmIDB4MGY7ICAgLyogbXV0ZSBiaXRzIDctNCAgICAqLwotCWlmICghcWNfZXhpc3RzKQotCQltaWNfaXZbMV0gPSAweDAwOwotCWZvciAoaSA9IDI7IGkgPCA4OyBpKyspCi0JCW1pY19pdltpXSA9IG1wZHVbaSArIDhdOyAgICAgICAgICAgICAgICAgICAgLyogbWljX2l2WzI6N10gPSBBMlswOjVdID0gbXBkdVsxMDoxNV0gKi8KLSNpZmRlZiBDT05TSVNURU5UX1BOX09SREVSCi0JCWZvciAoaSA9IDg7IGkgPCAxNDsgaSsrKQotCQkJbWljX2l2W2ldID0gcG5fdmVjdG9yW2kgLSA4XTsgICAgICAgICAgIC8qIG1pY19pdls4OjEzXSA9IFBOWzA6NV0gKi8KLSNlbHNlCi0JCWZvciAoaSA9IDg7IGkgPCAxNDsgaSsrKQotCQkJbWljX2l2W2ldID0gcG5fdmVjdG9yWzEzIC0gaV07ICAgICAgICAgIC8qIG1pY19pdls4OjEzXSA9IFBOWzU6MF0gKi8KLSNlbmRpZgotCWkgPSAocGF5bG9hZF9sZW5ndGggLyAyNTYpOwotCWkgPSAocGF5bG9hZF9sZW5ndGggJSAyNTYpOwotCW1pY19pdlsxNF0gPSAodW5zaWduZWQgY2hhcikgKHBheWxvYWRfbGVuZ3RoIC8gMjU2KTsKLQltaWNfaXZbMTVdID0gKHVuc2lnbmVkIGNoYXIpIChwYXlsb2FkX2xlbmd0aCAlIDI1Nik7Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBhZXMxMjhrMTI4ZCgpICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBlcmZvcm1zIGEgMTI4IGJpdCBBRVMgZW5jcnlwdCB3aXRoICAqLwotLyogMTI4IGJpdCBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgYWVzMTI4azEyOGQodW5zaWduZWQgY2hhciAqa2V5LCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBjaGFyICpjaXBoZXJ0ZXh0KQotewotCWludCByb3VuZDsKLQlpbnQgaTsKLQl1bnNpZ25lZCBjaGFyIGludGVybWVkaWF0ZWFbMTZdOwotCXVuc2lnbmVkIGNoYXIgaW50ZXJtZWRpYXRlYlsxNl07Ci0JdW5zaWduZWQgY2hhciByb3VuZF9rZXlbMTZdOwotCi0JZm9yKGk9MDsgaTwxNjsgaSsrKSByb3VuZF9rZXlbaV0gPSBrZXlbaV07Ci0KLQlmb3IgKHJvdW5kID0gMDsgcm91bmQgPCAxMTsgcm91bmQrKykKLQl7Ci0JCWlmIChyb3VuZCA9PSAwKQotCQl7Ci0JCQl4b3JfMTI4KHJvdW5kX2tleSwgZGF0YSwgY2lwaGVydGV4dCk7Ci0JCQluZXh0X2tleShyb3VuZF9rZXksIHJvdW5kKTsKLQkJfQotCQllbHNlIGlmIChyb3VuZCA9PSAxMCkKLQkJewotCQkJYnl0ZV9zdWIoY2lwaGVydGV4dCwgaW50ZXJtZWRpYXRlYSk7Ci0JCQlzaGlmdF9yb3coaW50ZXJtZWRpYXRlYSwgaW50ZXJtZWRpYXRlYik7Ci0JCQl4b3JfMTI4KGludGVybWVkaWF0ZWIsIHJvdW5kX2tleSwgY2lwaGVydGV4dCk7Ci0JCX0KLQkJZWxzZSAgICAvKiAxIC0gOSAqLwotCQl7Ci0JCQlieXRlX3N1YihjaXBoZXJ0ZXh0LCBpbnRlcm1lZGlhdGVhKTsKLQkJCXNoaWZ0X3JvdyhpbnRlcm1lZGlhdGVhLCBpbnRlcm1lZGlhdGViKTsKLQkJCW1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbMF0sICZpbnRlcm1lZGlhdGVhWzBdKTsKLQkJCW1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbNF0sICZpbnRlcm1lZGlhdGVhWzRdKTsKLQkJCW1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbOF0sICZpbnRlcm1lZGlhdGVhWzhdKTsKLQkJCW1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbMTJdLCAmaW50ZXJtZWRpYXRlYVsxMl0pOwotCQkJeG9yXzEyOChpbnRlcm1lZGlhdGVhLCByb3VuZF9rZXksIGNpcGhlcnRleHQpOwotCQkJbmV4dF9rZXkocm91bmRfa2V5LCByb3VuZCk7Ci0JCX0KLQl9Ci0KLX0KLQotdm9pZCBjb25zdHJ1Y3RfY3RyX3ByZWxvYWQoCi0JdW5zaWduZWQgY2hhciAqY3RyX3ByZWxvYWQsCi0JaW50IGE0X2V4aXN0cywKLQlpbnQgcWNfZXhpc3RzLAotCXVuc2lnbmVkIGNoYXIgKm1wZHUsCi0JdW5zaWduZWQgY2hhciAqcG5fdmVjdG9yLAotCWludCBjKQotewotCi0JaW50IGkgPSAwOwotCWZvciAoaT0wOyBpPDE2OyBpKyspIGN0cl9wcmVsb2FkW2ldID0gMHgwMDsKLQlpID0gMDsKLQotCWN0cl9wcmVsb2FkWzBdID0gMHgwMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZyAqLwotCWlmIChxY19leGlzdHMgJiYgYTRfZXhpc3RzKSBjdHJfcHJlbG9hZFsxXSA9IG1wZHVbMzBdICYgMHgwZjsgICAvKiBRb0NfQ29udHJvbCAgKi8KLQlpZiAocWNfZXhpc3RzICYmICFhNF9leGlzdHMpIGN0cl9wcmVsb2FkWzFdID0gbXBkdVsyNF0gJiAweDBmOwotCi0JZm9yIChpID0gMjsgaSA8IDg7IGkrKykKLQkJY3RyX3ByZWxvYWRbaV0gPSBtcGR1W2kgKyA4XTsgICAgICAgICAgICAgICAgICAgICAgIC8qIGN0cl9wcmVsb2FkWzI6N10gPSBBMlswOjVdID0gbXBkdVsxMDoxNV0gKi8KLSNpZmRlZiBDT05TSVNURU5UX1BOX09SREVSCi0JICBmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKLQkJCWN0cl9wcmVsb2FkW2ldID0gICAgcG5fdmVjdG9yW2kgLSA4XTsgICAgICAgICAgIC8qIGN0cl9wcmVsb2FkWzg6MTNdID0gUE5bMDo1XSAqLwotI2Vsc2UKLQkgIGZvciAoaSA9IDg7IGkgPCAxNDsgaSsrKQotCQkJY3RyX3ByZWxvYWRbaV0gPSAgICBwbl92ZWN0b3JbMTMgLSBpXTsgICAgICAgICAgLyogY3RyX3ByZWxvYWRbODoxM10gPSBQTls1OjBdICovCi0jZW5kaWYKLQljdHJfcHJlbG9hZFsxNF0gPSAgKHVuc2lnbmVkIGNoYXIpIChjIC8gMjU2KTsgLy8gQ3RyCi0JY3RyX3ByZWxvYWRbMTVdID0gICh1bnNpZ25lZCBjaGFyKSAoYyAlIDI1Nik7Ci0KLX0KLQotQk9PTEVBTiBSVE1QU29mdERlY3J5cHRBRVMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSCXBEYXRhLAotCUlOIFVMT05HCURhdGFCeXRlQ250LAotCUlOIFBDSVBIRVJfS0VZCXBXcGFLZXkpCi17Ci0JVUNIQVIJCQlLZXlJRDsKLQlVSU5UCQkJSGVhZGVyTGVuOwotCVVDSEFSCQkJUE5bNl07Ci0JVUlOVAkJCXBheWxvYWRfbGVuOwotCVVJTlQJCQludW1fYmxvY2tzOwotCVVJTlQJCQlwYXlsb2FkX3JlbWFpbmRlcjsKLQlVU0hPUlQJCQlmYzsKLQlVQ0hBUgkJCWZjMDsKLQlVQ0hBUgkJCWZjMTsKLQlVSU5UCQkJZnJhbWVfdHlwZTsKLQlVSU5UCQkJZnJhbWVfc3VidHlwZTsKLQlVSU5UCQkJZnJvbV9kczsKLQlVSU5UCQkJdG9fZHM7Ci0JSU5UCQkJCWE0X2V4aXN0czsKLQlJTlQJCQkJcWNfZXhpc3RzOwotCVVDSEFSCQkJYWVzX291dFsxNl07Ci0JaW50CQkJcGF5bG9hZF9pbmRleDsKLQlVSU5UCQkJaTsKLQlVQ0hBUgkJCWN0cl9wcmVsb2FkWzE2XTsKLQlVQ0hBUgkJCWNoYWluX2J1ZmZlclsxNl07Ci0JVUNIQVIJCQlwYWRkZWRfYnVmZmVyWzE2XTsKLQlVQ0hBUgkJCW1pY19pdlsxNl07Ci0JVUNIQVIJCQltaWNfaGVhZGVyMVsxNl07Ci0JVUNIQVIJCQltaWNfaGVhZGVyMlsxNl07Ci0JVUNIQVIJCQlNSUNbOF07Ci0JVUNIQVIJCQlUcmFpbE1JQ1s4XTsKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBEYXRhLCBESVJfUkVBRCwgRkFMU0UpOwotI2VuZGlmCi0KLQlmYzAgPSAqcERhdGE7Ci0JZmMxID0gKihwRGF0YSArIDEpOwotCi0JZmMgPSAqKChQVVNIT1JUKXBEYXRhKTsKLQotCWZyYW1lX3R5cGUgPSAoKGZjMCA+PiAyKSAmIDB4MDMpOwotCWZyYW1lX3N1YnR5cGUgPSAoKGZjMCA+PiA0KSAmIDB4MGYpOwotCi0JZnJvbV9kcyA9IChmYzEgJiAweDIpID4+IDE7Ci0JdG9fZHMgPSAoZmMxICYgMHgxKTsKLQotCWE0X2V4aXN0cyA9IChmcm9tX2RzICYgdG9fZHMpOwotCXFjX2V4aXN0cyA9ICgoZnJhbWVfc3VidHlwZSA9PSAweDA4KSB8fCAgICAvKiBBc3N1bWVkIFFvUyBzdWJ0eXBlcyAqLwotCQkJCSAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwOSkgfHwgICAvKiBMaWtlbHkgdG8gY2hhbmdlLiAgICAqLwotCQkJCSAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwYSkgfHwKLQkJCQkgIChmcmFtZV9zdWJ0eXBlID09IDB4MGIpCi0JCQkJICk7Ci0KLQlIZWFkZXJMZW4gPSAyNDsKLQlpZiAoYTRfZXhpc3RzKQotCQlIZWFkZXJMZW4gKz0gNjsKLQotCUtleUlEID0gKigoUFVDSEFSKShwRGF0YSsgSGVhZGVyTGVuICsgMykpOwotCUtleUlEID0gS2V5SUQgPj4gNjsKLQotCWlmIChwV3BhS2V5W0tleUlEXS5LZXlMZW4gPT0gMCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTb2Z0RGVjcnlwdEFFUyBmYWlsZWQhKEtleUlEWyVkXSBMZW5ndGggY2FuIG5vdCBiZSAwKVxuIiwgS2V5SUQpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCVBOWzBdID0gKihwRGF0YSsgSGVhZGVyTGVuKTsKLQlQTlsxXSA9ICoocERhdGErIEhlYWRlckxlbiArIDEpOwotCVBOWzJdID0gKihwRGF0YSsgSGVhZGVyTGVuICsgNCk7Ci0JUE5bM10gPSAqKHBEYXRhKyBIZWFkZXJMZW4gKyA1KTsKLQlQTls0XSA9ICoocERhdGErIEhlYWRlckxlbiArIDYpOwotCVBOWzVdID0gKihwRGF0YSsgSGVhZGVyTGVuICsgNyk7Ci0KLQlwYXlsb2FkX2xlbiA9IERhdGFCeXRlQ250IC0gSGVhZGVyTGVuIC0gOCAtIDg7CS8vIDggYnl0ZXMgZm9yIENDTVAgaGVhZGVyICwgOCBieXRlcyBmb3IgTUlDCi0JcGF5bG9hZF9yZW1haW5kZXIgPSAocGF5bG9hZF9sZW4pICUgMTY7Ci0JbnVtX2Jsb2NrcyA9IChwYXlsb2FkX2xlbikgLyAxNjsKLQotCi0KLQkvLyBGaW5kIHN0YXJ0IG9mIHBheWxvYWQKLQlwYXlsb2FkX2luZGV4ID0gSGVhZGVyTGVuICsgODsgLy9JVitFSVYKLQotCWZvciAoaT0wOyBpPCBudW1fYmxvY2tzOyBpKyspCi0JewotCQljb25zdHJ1Y3RfY3RyX3ByZWxvYWQoY3RyX3ByZWxvYWQsCi0JCQkJCQkJCWE0X2V4aXN0cywKLQkJCQkJCQkJcWNfZXhpc3RzLAotCQkJCQkJCQlwRGF0YSwKLQkJCQkJCQkJUE4sCi0JCQkJCQkJCWkrMSApOwotCi0JCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOwotCi0JCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgY2hhaW5fYnVmZmVyKTsKLQkJTmRpc01vdmVNZW1vcnkocERhdGEgKyBwYXlsb2FkX2luZGV4IC0gOCwgY2hhaW5fYnVmZmVyLCAxNik7Ci0JCXBheWxvYWRfaW5kZXggKz0gMTY7Ci0JfQotCi0JLy8KLQkvLyBJZiB0aGVyZSBpcyBhIHNob3J0IGZpbmFsIGJsb2NrLCB0aGVuIHBhZCBpdAotCS8vIGVuY3J5cHQgaXQgYW5kIGNvcHkgdGhlIHVucGFkZGVkIHBhcnQgYmFjawotCS8vCi0JaWYgKHBheWxvYWRfcmVtYWluZGVyID4gMCkKLQl7Ci0JCWNvbnN0cnVjdF9jdHJfcHJlbG9hZChjdHJfcHJlbG9hZCwKLQkJCQkJCQkJYTRfZXhpc3RzLAotCQkJCQkJCQlxY19leGlzdHMsCi0JCQkJCQkJCXBEYXRhLAotCQkJCQkJCQlQTiwKLQkJCQkJCQkJbnVtX2Jsb2NrcyArIDEpOwotCi0JCU5kaXNaZXJvTWVtb3J5KHBhZGRlZF9idWZmZXIsIDE2KTsKLQkJTmRpc01vdmVNZW1vcnkocGFkZGVkX2J1ZmZlciwgcERhdGEgKyBwYXlsb2FkX2luZGV4LCBwYXlsb2FkX3JlbWFpbmRlcik7Ci0KLQkJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjdHJfcHJlbG9hZCwgYWVzX291dCk7Ci0KLQkJYml0d2lzZV94b3IoYWVzX291dCwgcGFkZGVkX2J1ZmZlciwgY2hhaW5fYnVmZmVyKTsKLQkJTmRpc01vdmVNZW1vcnkocERhdGEgKyBwYXlsb2FkX2luZGV4IC0gOCwgY2hhaW5fYnVmZmVyLCBwYXlsb2FkX3JlbWFpbmRlcik7Ci0JCXBheWxvYWRfaW5kZXggKz0gcGF5bG9hZF9yZW1haW5kZXI7Ci0JfQotCi0JLy8KLQkvLyBEZXNjcnlwdCB0aGUgTUlDCi0JLy8KLQljb25zdHJ1Y3RfY3RyX3ByZWxvYWQoY3RyX3ByZWxvYWQsCi0JCQkJCQkJYTRfZXhpc3RzLAotCQkJCQkJCXFjX2V4aXN0cywKLQkJCQkJCQlwRGF0YSwKLQkJCQkJCQlQTiwKLQkJCQkJCQkwKTsKLQlOZGlzWmVyb01lbW9yeShwYWRkZWRfYnVmZmVyLCAxNik7Ci0JTmRpc01vdmVNZW1vcnkocGFkZGVkX2J1ZmZlciwgcERhdGEgKyBwYXlsb2FkX2luZGV4LCA4KTsKLQotCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOwotCi0JYml0d2lzZV94b3IoYWVzX291dCwgcGFkZGVkX2J1ZmZlciwgY2hhaW5fYnVmZmVyKTsKLQotCU5kaXNNb3ZlTWVtb3J5KFRyYWlsTUlDLCBjaGFpbl9idWZmZXIsIDgpOwotCi0KLQkvLwotCS8vIENhbGN1bGF0ZSBNSUMKLQkvLwotCi0JLy9Gb3JjZSB0aGUgcHJvdGVjdGVkIGZyYW1lIGJpdCBvbgotCSoocERhdGEgKyAxKSA9ICoocERhdGEgKyAxKSB8IDB4NDA7Ci0KLQkvLyBGaW5kIHN0YXJ0IG9mIHBheWxvYWQKLQkvLyBCZWNhdXNlIHRoZSBDQ01QIGhlYWRlciBoYXMgYmVlbiByZW1vdmVkCi0JcGF5bG9hZF9pbmRleCA9IEhlYWRlckxlbjsKLQotCWNvbnN0cnVjdF9taWNfaXYoCi0JCQkJCW1pY19pdiwKLQkJCQkJcWNfZXhpc3RzLAotCQkJCQlhNF9leGlzdHMsCi0JCQkJCXBEYXRhLAotCQkJCQlwYXlsb2FkX2xlbiwKLQkJCQkJUE4pOwotCi0JY29uc3RydWN0X21pY19oZWFkZXIxKAotCQkJCQkJbWljX2hlYWRlcjEsCi0JCQkJCQlIZWFkZXJMZW4sCi0JCQkJCQlwRGF0YSk7Ci0KLQljb25zdHJ1Y3RfbWljX2hlYWRlcjIoCi0JCQkJCQltaWNfaGVhZGVyMiwKLQkJCQkJCXBEYXRhLAotCQkJCQkJYTRfZXhpc3RzLAotCQkJCQkJcWNfZXhpc3RzKTsKLQotCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgbWljX2l2LCBhZXNfb3V0KTsKLQliaXR3aXNlX3hvcihhZXNfb3V0LCBtaWNfaGVhZGVyMSwgY2hhaW5fYnVmZmVyKTsKLQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7Ci0JYml0d2lzZV94b3IoYWVzX291dCwgbWljX2hlYWRlcjIsIGNoYWluX2J1ZmZlcik7Ci0JYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOwotCi0JLy8gaXRlcmF0ZSB0aHJvdWdoIGVhY2ggMTYgYnl0ZSBwYXlsb2FkIGJsb2NrCi0JZm9yIChpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykKLQl7Ci0JCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgY2hhaW5fYnVmZmVyKTsKLQkJcGF5bG9hZF9pbmRleCArPSAxNjsKLQkJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOwotCX0KLQotCS8vIEFkZCBvbiB0aGUgZmluYWwgcGF5bG9hZCBibG9jayBpZiBpdCBuZWVkcyBwYWRkaW5nCi0JaWYgKHBheWxvYWRfcmVtYWluZGVyID4gMCkKLQl7Ci0JCU5kaXNaZXJvTWVtb3J5KHBhZGRlZF9idWZmZXIsIDE2KTsKLQkJTmRpc01vdmVNZW1vcnkocGFkZGVkX2J1ZmZlciwgcERhdGEgKyBwYXlsb2FkX2luZGV4LCBwYXlsb2FkX3JlbWFpbmRlcik7Ci0KLQkJYml0d2lzZV94b3IoYWVzX291dCwgcGFkZGVkX2J1ZmZlciwgY2hhaW5fYnVmZmVyKTsKLQkJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOwotCX0KLQotCS8vIGFlc19vdXQgY29udGFpbnMgcGFkZGVkIG1pYywgZGlzY2FyZCBtb3N0IHNpZ25pZmljYW50Ci0JLy8gOCBieXRlcyB0byBnZW5lcmF0ZSA2NCBiaXQgTUlDCi0JZm9yIChpID0gMCA7IGkgPCA4OyBpKyspIE1JQ1tpXSA9IGFlc19vdXRbaV07Ci0KLQlpZiAoIU5kaXNFcXVhbE1lbW9yeShNSUMsIFRyYWlsTUlDLCA4KSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTb2Z0RGVjcnlwdEFFUywgTUlDIEVycm9yICFcbiIpKTsJIC8vTUlDIGVycm9yLgotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0jaWZkZWYgUlRfQklHX0VORElBTgotCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpcERhdGEsIERJUl9SRUFELCBGQUxTRSk7Ci0jZW5kaWYKLQotCXJldHVybiBUUlVFOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09ICBBRVMgRW4vRGVjcnlwdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2lmbmRlZgl1aW50OAotI2RlZmluZQl1aW50OCAgdW5zaWduZWQJY2hhcgotI2VuZGlmCi0KLSNpZm5kZWYJdWludDMyCi0jZGVmaW5lCXVpbnQzMiB1bnNpZ25lZAlpbnQKLSNlbmRpZgotCi0vKiBmb3J3YXJkIFMtYm94ICovCi1zdGF0aWMgdWludDMyIEZTYlsyNTZdID0KLXsKLQkweDYzLCAweDdDLAkweDc3LCAweDdCLAkweEYyLCAweDZCLAkweDZGLCAweEM1LAotCTB4MzAsIDB4MDEsCTB4NjcsIDB4MkIsCTB4RkUsIDB4RDcsCTB4QUIsIDB4NzYsCi0JMHhDQSwgMHg4MiwJMHhDOSwgMHg3RCwJMHhGQSwgMHg1OSwJMHg0NywgMHhGMCwKLQkweEFELCAweEQ0LAkweEEyLCAweEFGLAkweDlDLCAweEE0LAkweDcyLCAweEMwLAotCTB4QjcsIDB4RkQsCTB4OTMsIDB4MjYsCTB4MzYsIDB4M0YsCTB4RjcsIDB4Q0MsCi0JMHgzNCwgMHhBNSwJMHhFNSwgMHhGMSwJMHg3MSwgMHhEOCwJMHgzMSwgMHgxNSwKLQkweDA0LCAweEM3LAkweDIzLCAweEMzLAkweDE4LCAweDk2LAkweDA1LCAweDlBLAotCTB4MDcsIDB4MTIsCTB4ODAsIDB4RTIsCTB4RUIsIDB4MjcsCTB4QjIsIDB4NzUsCi0JMHgwOSwgMHg4MywJMHgyQywgMHgxQSwJMHgxQiwgMHg2RSwJMHg1QSwgMHhBMCwKLQkweDUyLCAweDNCLAkweEQ2LCAweEIzLAkweDI5LCAweEUzLAkweDJGLCAweDg0LAotCTB4NTMsIDB4RDEsCTB4MDAsIDB4RUQsCTB4MjAsIDB4RkMsCTB4QjEsIDB4NUIsCi0JMHg2QSwgMHhDQiwJMHhCRSwgMHgzOSwJMHg0QSwgMHg0QywJMHg1OCwgMHhDRiwKLQkweEQwLCAweEVGLAkweEFBLCAweEZCLAkweDQzLCAweDRELAkweDMzLCAweDg1LAotCTB4NDUsIDB4RjksCTB4MDIsIDB4N0YsCTB4NTAsIDB4M0MsCTB4OUYsIDB4QTgsCi0JMHg1MSwgMHhBMywJMHg0MCwgMHg4RiwJMHg5MiwgMHg5RCwJMHgzOCwgMHhGNSwKLQkweEJDLCAweEI2LAkweERBLCAweDIxLAkweDEwLCAweEZGLAkweEYzLCAweEQyLAotCTB4Q0QsIDB4MEMsCTB4MTMsIDB4RUMsCTB4NUYsIDB4OTcsCTB4NDQsIDB4MTcsCi0JMHhDNCwgMHhBNywJMHg3RSwgMHgzRCwJMHg2NCwgMHg1RCwJMHgxOSwgMHg3MywKLQkweDYwLCAweDgxLAkweDRGLCAweERDLAkweDIyLCAweDJBLAkweDkwLCAweDg4LAotCTB4NDYsIDB4RUUsCTB4QjgsIDB4MTQsCTB4REUsIDB4NUUsCTB4MEIsIDB4REIsCi0JMHhFMCwgMHgzMiwJMHgzQSwgMHgwQSwJMHg0OSwgMHgwNiwJMHgyNCwgMHg1QywKLQkweEMyLCAweEQzLAkweEFDLCAweDYyLAkweDkxLCAweDk1LAkweEU0LCAweDc5LAotCTB4RTcsIDB4QzgsCTB4MzcsIDB4NkQsCTB4OEQsIDB4RDUsCTB4NEUsIDB4QTksCi0JMHg2QywgMHg1NiwJMHhGNCwgMHhFQSwJMHg2NSwgMHg3QSwJMHhBRSwgMHgwOCwKLQkweEJBLCAweDc4LAkweDI1LCAweDJFLAkweDFDLCAweEE2LAkweEI0LCAweEM2LAotCTB4RTgsIDB4REQsCTB4NzQsIDB4MUYsCTB4NEIsIDB4QkQsCTB4OEIsIDB4OEEsCi0JMHg3MCwgMHgzRSwJMHhCNSwgMHg2NiwJMHg0OCwgMHgwMywJMHhGNiwgMHgwRSwKLQkweDYxLCAweDM1LAkweDU3LCAweEI5LAkweDg2LCAweEMxLAkweDFELCAweDlFLAotCTB4RTEsIDB4RjgsCTB4OTgsIDB4MTEsCTB4NjksIDB4RDksCTB4OEUsIDB4OTQsCi0JMHg5QiwgMHgxRSwJMHg4NywgMHhFOSwJMHhDRSwgMHg1NSwJMHgyOCwgMHhERiwKLQkweDhDLCAweEExLAkweDg5LCAweDBELAkweEJGLCAweEU2LAkweDQyLCAweDY4LAotCTB4NDEsIDB4OTksCTB4MkQsIDB4MEYsCTB4QjAsIDB4NTQsCTB4QkIsIDB4MTYKLX07Ci0KLS8qIGZvcndhcmQgdGFibGUgKi8KLSNkZWZpbmUJRlQgXAotXAotCVYoQzYsNjMsNjMsQTUpLAlWKEY4LDdDLDdDLDg0KSwJVihFRSw3Nyw3Nyw5OSksCVYoRjYsN0IsN0IsOEQpLAlcCi0JVihGRixGMixGMiwwRCksCVYoRDYsNkIsNkIsQkQpLAlWKERFLDZGLDZGLEIxKSwJVig5MSxDNSxDNSw1NCksCVwKLQlWKDYwLDMwLDMwLDUwKSwJVigwMiwwMSwwMSwwMyksCVYoQ0UsNjcsNjcsQTkpLAlWKDU2LDJCLDJCLDdEKSwJXAotCVYoRTcsRkUsRkUsMTkpLAlWKEI1LEQ3LEQ3LDYyKSwJVig0RCxBQixBQixFNiksCVYoRUMsNzYsNzYsOUEpLAlcCi0JVig4RixDQSxDQSw0NSksCVYoMUYsODIsODIsOUQpLAlWKDg5LEM5LEM5LDQwKSwJVihGQSw3RCw3RCw4NyksCVwKLQlWKEVGLEZBLEZBLDE1KSwJVihCMiw1OSw1OSxFQiksCVYoOEUsNDcsNDcsQzkpLAlWKEZCLEYwLEYwLDBCKSwJXAotCVYoNDEsQUQsQUQsRUMpLAlWKEIzLEQ0LEQ0LDY3KSwJVig1RixBMixBMixGRCksCVYoNDUsQUYsQUYsRUEpLAlcCi0JVigyMyw5Qyw5QyxCRiksCVYoNTMsQTQsQTQsRjcpLAlWKEU0LDcyLDcyLDk2KSwJVig5QixDMCxDMCw1QiksCVwKLQlWKDc1LEI3LEI3LEMyKSwJVihFMSxGRCxGRCwxQyksCVYoM0QsOTMsOTMsQUUpLAlWKDRDLDI2LDI2LDZBKSwJXAotCVYoNkMsMzYsMzYsNUEpLAlWKDdFLDNGLDNGLDQxKSwJVihGNSxGNyxGNywwMiksCVYoODMsQ0MsQ0MsNEYpLAlcCi0JVig2OCwzNCwzNCw1QyksCVYoNTEsQTUsQTUsRjQpLAlWKEQxLEU1LEU1LDM0KSwJVihGOSxGMSxGMSwwOCksCVwKLQlWKEUyLDcxLDcxLDkzKSwJVihBQixEOCxEOCw3MyksCVYoNjIsMzEsMzEsNTMpLAlWKDJBLDE1LDE1LDNGKSwJXAotCVYoMDgsMDQsMDQsMEMpLAlWKDk1LEM3LEM3LDUyKSwJVig0NiwyMywyMyw2NSksCVYoOUQsQzMsQzMsNUUpLAlcCi0JVigzMCwxOCwxOCwyOCksCVYoMzcsOTYsOTYsQTEpLAlWKDBBLDA1LDA1LDBGKSwJVigyRiw5QSw5QSxCNSksCVwKLQlWKDBFLDA3LDA3LDA5KSwJVigyNCwxMiwxMiwzNiksCVYoMUIsODAsODAsOUIpLAlWKERGLEUyLEUyLDNEKSwJXAotCVYoQ0QsRUIsRUIsMjYpLAlWKDRFLDI3LDI3LDY5KSwJVig3RixCMixCMixDRCksCVYoRUEsNzUsNzUsOUYpLAlcCi0JVigxMiwwOSwwOSwxQiksCVYoMUQsODMsODMsOUUpLAlWKDU4LDJDLDJDLDc0KSwJVigzNCwxQSwxQSwyRSksCVwKLQlWKDM2LDFCLDFCLDJEKSwJVihEQyw2RSw2RSxCMiksCVYoQjQsNUEsNUEsRUUpLAlWKDVCLEEwLEEwLEZCKSwJXAotCVYoQTQsNTIsNTIsRjYpLAlWKDc2LDNCLDNCLDREKSwJVihCNyxENixENiw2MSksCVYoN0QsQjMsQjMsQ0UpLAlcCi0JVig1MiwyOSwyOSw3QiksCVYoREQsRTMsRTMsM0UpLAlWKDVFLDJGLDJGLDcxKSwJVigxMyw4NCw4NCw5NyksCVwKLQlWKEE2LDUzLDUzLEY1KSwJVihCOSxEMSxEMSw2OCksCVYoMDAsMDAsMDAsMDApLAlWKEMxLEVELEVELDJDKSwJXAotCVYoNDAsMjAsMjAsNjApLAlWKEUzLEZDLEZDLDFGKSwJVig3OSxCMSxCMSxDOCksCVYoQjYsNUIsNUIsRUQpLAlcCi0JVihENCw2QSw2QSxCRSksCVYoOEQsQ0IsQ0IsNDYpLAlWKDY3LEJFLEJFLEQ5KSwJVig3MiwzOSwzOSw0QiksCVwKLQlWKDk0LDRBLDRBLERFKSwJVig5OCw0Qyw0QyxENCksCVYoQjAsNTgsNTgsRTgpLAlWKDg1LENGLENGLDRBKSwJXAotCVYoQkIsRDAsRDAsNkIpLAlWKEM1LEVGLEVGLDJBKSwJVig0RixBQSxBQSxFNSksCVYoRUQsRkIsRkIsMTYpLAlcCi0JVig4Niw0Myw0MyxDNSksCVYoOUEsNEQsNEQsRDcpLAlWKDY2LDMzLDMzLDU1KSwJVigxMSw4NSw4NSw5NCksCVwKLQlWKDhBLDQ1LDQ1LENGKSwJVihFOSxGOSxGOSwxMCksCVYoMDQsMDIsMDIsMDYpLAlWKEZFLDdGLDdGLDgxKSwJXAotCVYoQTAsNTAsNTAsRjApLAlWKDc4LDNDLDNDLDQ0KSwJVigyNSw5Riw5RixCQSksCVYoNEIsQTgsQTgsRTMpLAlcCi0JVihBMiw1MSw1MSxGMyksCVYoNUQsQTMsQTMsRkUpLAlWKDgwLDQwLDQwLEMwKSwJVigwNSw4Riw4Riw4QSksCVwKLQlWKDNGLDkyLDkyLEFEKSwJVigyMSw5RCw5RCxCQyksCVYoNzAsMzgsMzgsNDgpLAlWKEYxLEY1LEY1LDA0KSwJXAotCVYoNjMsQkMsQkMsREYpLAlWKDc3LEI2LEI2LEMxKSwJVihBRixEQSxEQSw3NSksCVYoNDIsMjEsMjEsNjMpLAlcCi0JVigyMCwxMCwxMCwzMCksCVYoRTUsRkYsRkYsMUEpLAlWKEZELEYzLEYzLDBFKSwJVihCRixEMixEMiw2RCksCVwKLQlWKDgxLENELENELDRDKSwJVigxOCwwQywwQywxNCksCVYoMjYsMTMsMTMsMzUpLAlWKEMzLEVDLEVDLDJGKSwJXAotCVYoQkUsNUYsNUYsRTEpLAlWKDM1LDk3LDk3LEEyKSwJVig4OCw0NCw0NCxDQyksCVYoMkUsMTcsMTcsMzkpLAlcCi0JVig5MyxDNCxDNCw1NyksCVYoNTUsQTcsQTcsRjIpLAlWKEZDLDdFLDdFLDgyKSwJVig3QSwzRCwzRCw0NyksCVwKLQlWKEM4LDY0LDY0LEFDKSwJVihCQSw1RCw1RCxFNyksCVYoMzIsMTksMTksMkIpLAlWKEU2LDczLDczLDk1KSwJXAotCVYoQzAsNjAsNjAsQTApLAlWKDE5LDgxLDgxLDk4KSwJVig5RSw0Riw0RixEMSksCVYoQTMsREMsREMsN0YpLAlcCi0JVig0NCwyMiwyMiw2NiksCVYoNTQsMkEsMkEsN0UpLAlWKDNCLDkwLDkwLEFCKSwJVigwQiw4OCw4OCw4MyksCVwKLQlWKDhDLDQ2LDQ2LENBKSwJVihDNyxFRSxFRSwyOSksCVYoNkIsQjgsQjgsRDMpLAlWKDI4LDE0LDE0LDNDKSwJXAotCVYoQTcsREUsREUsNzkpLAlWKEJDLDVFLDVFLEUyKSwJVigxNiwwQiwwQiwxRCksCVYoQUQsREIsREIsNzYpLAlcCi0JVihEQixFMCxFMCwzQiksCVYoNjQsMzIsMzIsNTYpLAlWKDc0LDNBLDNBLDRFKSwJVigxNCwwQSwwQSwxRSksCVwKLQlWKDkyLDQ5LDQ5LERCKSwJVigwQywwNiwwNiwwQSksCVYoNDgsMjQsMjQsNkMpLAlWKEI4LDVDLDVDLEU0KSwJXAotCVYoOUYsQzIsQzIsNUQpLAlWKEJELEQzLEQzLDZFKSwJVig0MyxBQyxBQyxFRiksCVYoQzQsNjIsNjIsQTYpLAlcCi0JVigzOSw5MSw5MSxBOCksCVYoMzEsOTUsOTUsQTQpLAlWKEQzLEU0LEU0LDM3KSwJVihGMiw3OSw3OSw4QiksCVwKLQlWKEQ1LEU3LEU3LDMyKSwJVig4QixDOCxDOCw0MyksCVYoNkUsMzcsMzcsNTkpLAlWKERBLDZELDZELEI3KSwJXAotCVYoMDEsOEQsOEQsOEMpLAlWKEIxLEQ1LEQ1LDY0KSwJVig5Qyw0RSw0RSxEMiksCVYoNDksQTksQTksRTApLAlcCi0JVihEOCw2Qyw2QyxCNCksCVYoQUMsNTYsNTYsRkEpLAlWKEYzLEY0LEY0LDA3KSwJVihDRixFQSxFQSwyNSksCVwKLQlWKENBLDY1LDY1LEFGKSwJVihGNCw3QSw3QSw4RSksCVYoNDcsQUUsQUUsRTkpLAlWKDEwLDA4LDA4LDE4KSwJXAotCVYoNkYsQkEsQkEsRDUpLAlWKEYwLDc4LDc4LDg4KSwJVig0QSwyNSwyNSw2RiksCVYoNUMsMkUsMkUsNzIpLAlcCi0JVigzOCwxQywxQywyNCksCVYoNTcsQTYsQTYsRjEpLAlWKDczLEI0LEI0LEM3KSwJVig5NyxDNixDNiw1MSksCVwKLQlWKENCLEU4LEU4LDIzKSwJVihBMSxERCxERCw3QyksCVYoRTgsNzQsNzQsOUMpLAlWKDNFLDFGLDFGLDIxKSwJXAotCVYoOTYsNEIsNEIsREQpLAlWKDYxLEJELEJELERDKSwJVigwRCw4Qiw4Qiw4NiksCVYoMEYsOEEsOEEsODUpLAlcCi0JVihFMCw3MCw3MCw5MCksCVYoN0MsM0UsM0UsNDIpLAlWKDcxLEI1LEI1LEM0KSwJVihDQyw2Niw2NixBQSksCVwKLQlWKDkwLDQ4LDQ4LEQ4KSwJVigwNiwwMywwMywwNSksCVYoRjcsRjYsRjYsMDEpLAlWKDFDLDBFLDBFLDEyKSwJXAotCVYoQzIsNjEsNjEsQTMpLAlWKDZBLDM1LDM1LDVGKSwJVihBRSw1Nyw1NyxGOSksCVYoNjksQjksQjksRDApLAlcCi0JVigxNyw4Niw4Niw5MSksCVYoOTksQzEsQzEsNTgpLAlWKDNBLDFELDFELDI3KSwJVigyNyw5RSw5RSxCOSksCVwKLQlWKEQ5LEUxLEUxLDM4KSwJVihFQixGOCxGOCwxMyksCVYoMkIsOTgsOTgsQjMpLAlWKDIyLDExLDExLDMzKSwJXAotCVYoRDIsNjksNjksQkIpLAlWKEE5LEQ5LEQ5LDcwKSwJVigwNyw4RSw4RSw4OSksCVYoMzMsOTQsOTQsQTcpLAlcCi0JVigyRCw5Qiw5QixCNiksCVYoM0MsMUUsMUUsMjIpLAlWKDE1LDg3LDg3LDkyKSwJVihDOSxFOSxFOSwyMCksCVwKLQlWKDg3LENFLENFLDQ5KSwJVihBQSw1NSw1NSxGRiksCVYoNTAsMjgsMjgsNzgpLAlWKEE1LERGLERGLDdBKSwJXAotCVYoMDMsOEMsOEMsOEYpLAlWKDU5LEExLEExLEY4KSwJVigwOSw4OSw4OSw4MCksCVYoMUEsMEQsMEQsMTcpLAlcCi0JVig2NSxCRixCRixEQSksCVYoRDcsRTYsRTYsMzEpLAlWKDg0LDQyLDQyLEM2KSwJVihEMCw2OCw2OCxCOCksCVwKLQlWKDgyLDQxLDQxLEMzKSwJVigyOSw5OSw5OSxCMCksCVYoNUEsMkQsMkQsNzcpLAlWKDFFLDBGLDBGLDExKSwJXAotCVYoN0IsQjAsQjAsQ0IpLAlWKEE4LDU0LDU0LEZDKSwJVig2RCxCQixCQixENiksCVYoMkMsMTYsMTYsM0EpCi0KLSNkZWZpbmUJVihhLGIsYyxkKSAweCMjYSMjYiMjYyMjZAotc3RhdGljIHVpbnQzMiBGVDBbMjU2XSA9IHsgRlQgfTsKLSN1bmRlZiBWCi0KLSNkZWZpbmUJVihhLGIsYyxkKSAweCMjZCMjYSMjYiMjYwotc3RhdGljIHVpbnQzMiBGVDFbMjU2XSA9IHsgRlQgfTsKLSN1bmRlZiBWCi0KLSNkZWZpbmUJVihhLGIsYyxkKSAweCMjYyMjZCMjYSMjYgotc3RhdGljIHVpbnQzMiBGVDJbMjU2XSA9IHsgRlQgfTsKLSN1bmRlZiBWCi0KLSNkZWZpbmUJVihhLGIsYyxkKSAweCMjYiMjYyMjZCMjYQotc3RhdGljIHVpbnQzMiBGVDNbMjU2XSA9IHsgRlQgfTsKLSN1bmRlZiBWCi0KLSN1bmRlZiBGVAotCi0vKiByZXZlcnNlIFMtYm94ICovCi0KLXN0YXRpYyB1aW50MzIgUlNiWzI1Nl0gPQotewotCTB4NTIsIDB4MDksCTB4NkEsIDB4RDUsCTB4MzAsIDB4MzYsCTB4QTUsIDB4MzgsCi0JMHhCRiwgMHg0MCwJMHhBMywgMHg5RSwJMHg4MSwgMHhGMywJMHhENywgMHhGQiwKLQkweDdDLCAweEUzLAkweDM5LCAweDgyLAkweDlCLCAweDJGLAkweEZGLCAweDg3LAotCTB4MzQsIDB4OEUsCTB4NDMsIDB4NDQsCTB4QzQsIDB4REUsCTB4RTksIDB4Q0IsCi0JMHg1NCwgMHg3QiwJMHg5NCwgMHgzMiwJMHhBNiwgMHhDMiwJMHgyMywgMHgzRCwKLQkweEVFLCAweDRDLAkweDk1LCAweDBCLAkweDQyLCAweEZBLAkweEMzLCAweDRFLAotCTB4MDgsIDB4MkUsCTB4QTEsIDB4NjYsCTB4MjgsIDB4RDksCTB4MjQsIDB4QjIsCi0JMHg3NiwgMHg1QiwJMHhBMiwgMHg0OSwJMHg2RCwgMHg4QiwJMHhEMSwgMHgyNSwKLQkweDcyLCAweEY4LAkweEY2LCAweDY0LAkweDg2LCAweDY4LAkweDk4LCAweDE2LAotCTB4RDQsIDB4QTQsCTB4NUMsIDB4Q0MsCTB4NUQsIDB4NjUsCTB4QjYsIDB4OTIsCi0JMHg2QywgMHg3MCwJMHg0OCwgMHg1MCwJMHhGRCwgMHhFRCwJMHhCOSwgMHhEQSwKLQkweDVFLCAweDE1LAkweDQ2LCAweDU3LAkweEE3LCAweDhELAkweDlELCAweDg0LAotCTB4OTAsIDB4RDgsCTB4QUIsIDB4MDAsCTB4OEMsIDB4QkMsCTB4RDMsIDB4MEEsCi0JMHhGNywgMHhFNCwJMHg1OCwgMHgwNSwJMHhCOCwgMHhCMywJMHg0NSwgMHgwNiwKLQkweEQwLCAweDJDLAkweDFFLCAweDhGLAkweENBLCAweDNGLAkweDBGLCAweDAyLAotCTB4QzEsIDB4QUYsCTB4QkQsIDB4MDMsCTB4MDEsIDB4MTMsCTB4OEEsIDB4NkIsCi0JMHgzQSwgMHg5MSwJMHgxMSwgMHg0MSwJMHg0RiwgMHg2NywJMHhEQywgMHhFQSwKLQkweDk3LCAweEYyLAkweENGLCAweENFLAkweEYwLCAweEI0LAkweEU2LCAweDczLAotCTB4OTYsIDB4QUMsCTB4NzQsIDB4MjIsCTB4RTcsIDB4QUQsCTB4MzUsIDB4ODUsCi0JMHhFMiwgMHhGOSwJMHgzNywgMHhFOCwJMHgxQywgMHg3NSwJMHhERiwgMHg2RSwKLQkweDQ3LCAweEYxLAkweDFBLCAweDcxLAkweDFELCAweDI5LAkweEM1LCAweDg5LAotCTB4NkYsIDB4QjcsCTB4NjIsIDB4MEUsCTB4QUEsIDB4MTgsCTB4QkUsIDB4MUIsCi0JMHhGQywgMHg1NiwJMHgzRSwgMHg0QiwJMHhDNiwgMHhEMiwJMHg3OSwgMHgyMCwKLQkweDlBLCAweERCLAkweEMwLCAweEZFLAkweDc4LCAweENELAkweDVBLCAweEY0LAotCTB4MUYsIDB4REQsCTB4QTgsIDB4MzMsCTB4ODgsIDB4MDcsCTB4QzcsIDB4MzEsCi0JMHhCMSwgMHgxMiwJMHgxMCwgMHg1OSwJMHgyNywgMHg4MCwJMHhFQywgMHg1RiwKLQkweDYwLCAweDUxLAkweDdGLCAweEE5LAkweDE5LCAweEI1LAkweDRBLCAweDBELAotCTB4MkQsIDB4RTUsCTB4N0EsIDB4OUYsCTB4OTMsIDB4QzksCTB4OUMsIDB4RUYsCi0JMHhBMCwgMHhFMCwJMHgzQiwgMHg0RCwJMHhBRSwgMHgyQSwJMHhGNSwgMHhCMCwKLQkweEM4LCAweEVCLAkweEJCLCAweDNDLAkweDgzLCAweDUzLAkweDk5LCAweDYxLAotCTB4MTcsIDB4MkIsCTB4MDQsIDB4N0UsCTB4QkEsIDB4NzcsCTB4RDYsIDB4MjYsCi0JMHhFMSwgMHg2OSwJMHgxNCwgMHg2MywJMHg1NSwgMHgyMSwJMHgwQywgMHg3RAotfTsKLQotLyogcmV2ZXJzZSB0YWJsZSAqLwotCi0jZGVmaW5lCVJUIFwKLVwKLQlWKDUxLEY0LEE3LDUwKSwJVig3RSw0MSw2NSw1MyksCVYoMUEsMTcsQTQsQzMpLAlWKDNBLDI3LDVFLDk2KSwJXAotCVYoM0IsQUIsNkIsQ0IpLAlWKDFGLDlELDQ1LEYxKSwJVihBQyxGQSw1OCxBQiksCVYoNEIsRTMsMDMsOTMpLAlcCi0JVigyMCwzMCxGQSw1NSksCVYoQUQsNzYsNkQsRjYpLAlWKDg4LENDLDc2LDkxKSwJVihGNSwwMiw0QywyNSksCVwKLQlWKDRGLEU1LEQ3LEZDKSwJVihDNSwyQSxDQixENyksCVYoMjYsMzUsNDQsODApLAlWKEI1LDYyLEEzLDhGKSwJXAotCVYoREUsQjEsNUEsNDkpLAlWKDI1LEJBLDFCLDY3KSwJVig0NSxFQSwwRSw5OCksCVYoNUQsRkUsQzAsRTEpLAlcCi0JVihDMywyRiw3NSwwMiksCVYoODEsNEMsRjAsMTIpLAlWKDhELDQ2LDk3LEEzKSwJVig2QixEMyxGOSxDNiksCVwKLQlWKDAzLDhGLDVGLEU3KSwJVigxNSw5Miw5Qyw5NSksCVYoQkYsNkQsN0EsRUIpLAlWKDk1LDUyLDU5LERBKSwJXAotCVYoRDQsQkUsODMsMkQpLAlWKDU4LDc0LDIxLEQzKSwJVig0OSxFMCw2OSwyOSksCVYoOEUsQzksQzgsNDQpLAlcCi0JVig3NSxDMiw4OSw2QSksCVYoRjQsOEUsNzksNzgpLAlWKDk5LDU4LDNFLDZCKSwJVigyNyxCOSw3MSxERCksCVwKLQlWKEJFLEUxLDRGLEI2KSwJVihGMCw4OCxBRCwxNyksCVYoQzksMjAsQUMsNjYpLAlWKDdELENFLDNBLEI0KSwJXAotCVYoNjMsREYsNEEsMTgpLAlWKEU1LDFBLDMxLDgyKSwJVig5Nyw1MSwzMyw2MCksCVYoNjIsNTMsN0YsNDUpLAlcCi0JVihCMSw2NCw3NyxFMCksCVYoQkIsNkIsQUUsODQpLAlWKEZFLDgxLEEwLDFDKSwJVihGOSwwOCwyQiw5NCksCVwKLQlWKDcwLDQ4LDY4LDU4KSwJVig4Riw0NSxGRCwxOSksCVYoOTQsREUsNkMsODcpLAlWKDUyLDdCLEY4LEI3KSwJXAotCVYoQUIsNzMsRDMsMjMpLAlWKDcyLDRCLDAyLEUyKSwJVihFMywxRiw4Riw1NyksCVYoNjYsNTUsQUIsMkEpLAlcCi0JVihCMixFQiwyOCwwNyksCVYoMkYsQjUsQzIsMDMpLAlWKDg2LEM1LDdCLDlBKSwJVihEMywzNywwOCxBNSksCVwKLQlWKDMwLDI4LDg3LEYyKSwJVigyMyxCRixBNSxCMiksCVYoMDIsMDMsNkEsQkEpLAlWKEVELDE2LDgyLDVDKSwJXAotCVYoOEEsQ0YsMUMsMkIpLAlWKEE3LDc5LEI0LDkyKSwJVihGMywwNyxGMixGMCksCVYoNEUsNjksRTIsQTEpLAlcCi0JVig2NSxEQSxGNCxDRCksCVYoMDYsMDUsQkUsRDUpLAlWKEQxLDM0LDYyLDFGKSwJVihDNCxBNixGRSw4QSksCVwKLQlWKDM0LDJFLDUzLDlEKSwJVihBMixGMyw1NSxBMCksCVYoMDUsOEEsRTEsMzIpLAlWKEE0LEY2LEVCLDc1KSwJXAotCVYoMEIsODMsRUMsMzkpLAlWKDQwLDYwLEVGLEFBKSwJVig1RSw3MSw5RiwwNiksCVYoQkQsNkUsMTAsNTEpLAlcCi0JVigzRSwyMSw4QSxGOSksCVYoOTYsREQsMDYsM0QpLAlWKERELDNFLDA1LEFFKSwJVig0RCxFNixCRCw0NiksCVwKLQlWKDkxLDU0LDhELEI1KSwJVig3MSxDNCw1RCwwNSksCVYoMDQsMDYsRDQsNkYpLAlWKDYwLDUwLDE1LEZGKSwJXAotCVYoMTksOTgsRkIsMjQpLAlWKEQ2LEJELEU5LDk3KSwJVig4OSw0MCw0MyxDQyksCVYoNjcsRDksOUUsNzcpLAlcCi0JVihCMCxFOCw0MixCRCksCVYoMDcsODksOEIsODgpLAlWKEU3LDE5LDVCLDM4KSwJVig3OSxDOCxFRSxEQiksCVwKLQlWKEExLDdDLDBBLDQ3KSwJVig3Qyw0MiwwRixFOSksCVYoRjgsODQsMUUsQzkpLAlWKDAwLDAwLDAwLDAwKSwJXAotCVYoMDksODAsODYsODMpLAlWKDMyLDJCLEVELDQ4KSwJVigxRSwxMSw3MCxBQyksCVYoNkMsNUEsNzIsNEUpLAlcCi0JVihGRCwwRSxGRixGQiksCVYoMEYsODUsMzgsNTYpLAlWKDNELEFFLEQ1LDFFKSwJVigzNiwyRCwzOSwyNyksCVwKLQlWKDBBLDBGLEQ5LDY0KSwJVig2OCw1QyxBNiwyMSksCVYoOUIsNUIsNTQsRDEpLAlWKDI0LDM2LDJFLDNBKSwJXAotCVYoMEMsMEEsNjcsQjEpLAlWKDkzLDU3LEU3LDBGKSwJVihCNCxFRSw5NixEMiksCVYoMUIsOUIsOTEsOUUpLAlcCi0JVig4MCxDMCxDNSw0RiksCVYoNjEsREMsMjAsQTIpLAlWKDVBLDc3LDRCLDY5KSwJVigxQywxMiwxQSwxNiksCVwKLQlWKEUyLDkzLEJBLDBBKSwJVihDMCxBMCwyQSxFNSksCVYoM0MsMjIsRTAsNDMpLAlWKDEyLDFCLDE3LDFEKSwJXAotCVYoMEUsMDksMEQsMEIpLAlWKEYyLDhCLEM3LEFEKSwJVigyRCxCNixBOCxCOSksCVYoMTQsMUUsQTksQzgpLAlcCi0JVig1NyxGMSwxOSw4NSksCVYoQUYsNzUsMDcsNEMpLAlWKEVFLDk5LERELEJCKSwJVihBMyw3Riw2MCxGRCksCVwKLQlWKEY3LDAxLDI2LDlGKSwJVig1Qyw3MixGNSxCQyksCVYoNDQsNjYsM0IsQzUpLAlWKDVCLEZCLDdFLDM0KSwJXAotCVYoOEIsNDMsMjksNzYpLAlWKENCLDIzLEM2LERDKSwJVihCNixFRCxGQyw2OCksCVYoQjgsRTQsRjEsNjMpLAlcCi0JVihENywzMSxEQyxDQSksCVYoNDIsNjMsODUsMTApLAlWKDEzLDk3LDIyLDQwKSwJVig4NCxDNiwxMSwyMCksCVwKLQlWKDg1LDRBLDI0LDdEKSwJVihEMixCQiwzRCxGOCksCVYoQUUsRjksMzIsMTEpLAlWKEM3LDI5LEExLDZEKSwJXAotCVYoMUQsOUUsMkYsNEIpLAlWKERDLEIyLDMwLEYzKSwJVigwRCw4Niw1MixFQyksCVYoNzcsQzEsRTMsRDApLAlcCi0JVigyQixCMywxNiw2QyksCVYoQTksNzAsQjksOTkpLAlWKDExLDk0LDQ4LEZBKSwJVig0NyxFOSw2NCwyMiksCVwKLQlWKEE4LEZDLDhDLEM0KSwJVihBMCxGMCwzRiwxQSksCVYoNTYsN0QsMkMsRDgpLAlWKDIyLDMzLDkwLEVGKSwJXAotCVYoODcsNDksNEUsQzcpLAlWKEQ5LDM4LEQxLEMxKSwJVig4QyxDQSxBMixGRSksCVYoOTgsRDQsMEIsMzYpLAlcCi0JVihBNixGNSw4MSxDRiksCVYoQTUsN0EsREUsMjgpLAlWKERBLEI3LDhFLDI2KSwJVigzRixBRCxCRixBNCksCVwKLQlWKDJDLDNBLDlELEU0KSwJVig1MCw3OCw5MiwwRCksCVYoNkEsNUYsQ0MsOUIpLAlWKDU0LDdFLDQ2LDYyKSwJXAotCVYoRjYsOEQsMTMsQzIpLAlWKDkwLEQ4LEI4LEU4KSwJVigyRSwzOSxGNyw1RSksCVYoODIsQzMsQUYsRjUpLAlcCi0JVig5Riw1RCw4MCxCRSksCVYoNjksRDAsOTMsN0MpLAlWKDZGLEQ1LDJELEE5KSwJVihDRiwyNSwxMixCMyksCVwKLQlWKEM4LEFDLDk5LDNCKSwJVigxMCwxOCw3RCxBNyksCVYoRTgsOUMsNjMsNkUpLAlWKERCLDNCLEJCLDdCKSwJXAotCVYoQ0QsMjYsNzgsMDkpLAlWKDZFLDU5LDE4LEY0KSwJVihFQyw5QSxCNywwMSksCVYoODMsNEYsOUEsQTgpLAlcCi0JVihFNiw5NSw2RSw2NSksCVYoQUEsRkYsRTYsN0UpLAlWKDIxLEJDLENGLDA4KSwJVihFRiwxNSxFOCxFNiksCVwKLQlWKEJBLEU3LDlCLEQ5KSwJVig0QSw2RiwzNixDRSksCVYoRUEsOUYsMDksRDQpLAlWKDI5LEIwLDdDLEQ2KSwJXAotCVYoMzEsQTQsQjIsQUYpLAlWKDJBLDNGLDIzLDMxKSwJVihDNixBNSw5NCwzMCksCVYoMzUsQTIsNjYsQzApLAlcCi0JVig3NCw0RSxCQywzNyksCVYoRkMsODIsQ0EsQTYpLAlWKEUwLDkwLEQwLEIwKSwJVigzMyxBNyxEOCwxNSksCVwKLQlWKEYxLDA0LDk4LDRBKSwJVig0MSxFQyxEQSxGNyksCVYoN0YsQ0QsNTAsMEUpLAlWKDE3LDkxLEY2LDJGKSwJXAotCVYoNzYsNEQsRDYsOEQpLAlWKDQzLEVGLEIwLDREKSwJVihDQyxBQSw0RCw1NCksCVYoRTQsOTYsMDQsREYpLAlcCi0JVig5RSxEMSxCNSxFMyksCVYoNEMsNkEsODgsMUIpLAlWKEMxLDJDLDFGLEI4KSwJVig0Niw2NSw1MSw3RiksCVwKLQlWKDlELDVFLEVBLDA0KSwJVigwMSw4QywzNSw1RCksCVYoRkEsODcsNzQsNzMpLAlWKEZCLDBCLDQxLDJFKSwJXAotCVYoQjMsNjcsMUQsNUEpLAlWKDkyLERCLEQyLDUyKSwJVihFOSwxMCw1NiwzMyksCVYoNkQsRDYsNDcsMTMpLAlcCi0JVig5QSxENyw2MSw4QyksCVYoMzcsQTEsMEMsN0EpLAlWKDU5LEY4LDE0LDhFKSwJVihFQiwxMywzQyw4OSksCVwKLQlWKENFLEE5LDI3LEVFKSwJVihCNyw2MSxDOSwzNSksCVYoRTEsMUMsRTUsRUQpLAlWKDdBLDQ3LEIxLDNDKSwJXAotCVYoOUMsRDIsREYsNTkpLAlWKDU1LEYyLDczLDNGKSwJVigxOCwxNCxDRSw3OSksCVYoNzMsQzcsMzcsQkYpLAlcCi0JVig1MyxGNyxDRCxFQSksCVYoNUYsRkQsQUEsNUIpLAlWKERGLDNELDZGLDE0KSwJVig3OCw0NCxEQiw4NiksCVwKLQlWKENBLEFGLEYzLDgxKSwJVihCOSw2OCxDNCwzRSksCVYoMzgsMjQsMzQsMkMpLAlWKEMyLEEzLDQwLDVGKSwJXAotCVYoMTYsMUQsQzMsNzIpLAlWKEJDLEUyLDI1LDBDKSwJVigyOCwzQyw0OSw4QiksCVYoRkYsMEQsOTUsNDEpLAlcCi0JVigzOSxBOCwwMSw3MSksCVYoMDgsMEMsQjMsREUpLAlWKEQ4LEI0LEU0LDlDKSwJVig2NCw1NixDMSw5MCksCVwKLQlWKDdCLENCLDg0LDYxKSwJVihENSwzMixCNiw3MCksCVYoNDgsNkMsNUMsNzQpLAlWKEQwLEI4LDU3LDQyKQotCi0jZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2EjI2IjI2MjI2QKLXN0YXRpYyB1aW50MzIgUlQwWzI1Nl0gPSB7IFJUIH07Ci0jdW5kZWYgVgotCi0jZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2QjI2EjI2IjI2MKLXN0YXRpYyB1aW50MzIgUlQxWzI1Nl0gPSB7IFJUIH07Ci0jdW5kZWYgVgotCi0jZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2MjI2QjI2EjI2IKLXN0YXRpYyB1aW50MzIgUlQyWzI1Nl0gPSB7IFJUIH07Ci0jdW5kZWYgVgotCi0jZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2IjI2MjI2QjI2EKLXN0YXRpYyB1aW50MzIgUlQzWzI1Nl0gPSB7IFJUIH07Ci0jdW5kZWYgVgotCi0jdW5kZWYgUlQKLQotLyogcm91bmQgY29uc3RhbnRzICovCi0KLXN0YXRpYyB1aW50MzIgUkNPTlsxMF0gPQotewotCTB4MDEwMDAwMDAsCTB4MDIwMDAwMDAsCTB4MDQwMDAwMDAsCTB4MDgwMDAwMDAsCi0JMHgxMDAwMDAwMCwJMHgyMDAwMDAwMCwJMHg0MDAwMDAwMCwJMHg4MDAwMDAwMCwKLQkweDFCMDAwMDAwLAkweDM2MDAwMDAwCi19OwotCi0vKiBrZXkgc2NoZWR1bGUJdGFibGVzICovCi0KLXN0YXRpYyBpbnQgS1RfaW5pdCA9IDE7Ci0KLXN0YXRpYyB1aW50MzIgS1QwWzI1Nl07Ci1zdGF0aWMgdWludDMyIEtUMVsyNTZdOwotc3RhdGljIHVpbnQzMiBLVDJbMjU2XTsKLXN0YXRpYyB1aW50MzIgS1QzWzI1Nl07Ci0KLS8qIHBsYXRmb3JtLWluZGVwZW5kYW50CTMyLWJpdCBpbnRlZ2VyIG1hbmlwdWxhdGlvbgltYWNyb3MgKi8KLQotI2RlZmluZQlHRVRfVUlOVDMyKG4sYixpKQkJCQkJCVwKLXsJCQkJCQkJCQkJCQlcCi0JKG4pCT0gKAkodWludDMyKSAoYilbKGkpCV0gPDwgMjQJKQkJXAotCQl8ICgJKHVpbnQzMikgKGIpWyhpKSArIDFdIDw8IDE2CSkJCVwKLQkJfCAoCSh1aW50MzIpIChiKVsoaSkgKyAyXSA8PCAgOAkpCQlcCi0JCXwgKAkodWludDMyKSAoYilbKGkpICsgM10JCSk7CQlcCi19Ci0KLSNkZWZpbmUJUFVUX1VJTlQzMihuLGIsaSkJCQkJCQlcCi17CQkJCQkJCQkJCQkJXAotCShiKVsoaSkJICAgXSA9ICh1aW50OCkgKCAobikgPj4JMjQgKTsJCVwKLQkoYilbKGkpCSsgMV0gPSAodWludDgpICggKG4pID4+CTE2ICk7CQlcCi0JKGIpWyhpKQkrIDJdID0gKHVpbnQ4KSAoIChuKSA+PgkgOCApOwkJXAotCShiKVsoaSkJKyAzXSA9ICh1aW50OCkgKCAobikJICAgKTsJCVwKLX0KLQotCi1pbnQJcnRfYWVzX3NldF9rZXkoIGFlc19jb250ZXh0ICpjdHgsIHVpbnQ4ICprZXksIGludCBuYml0cyApCi17Ci0JaW50CWk7Ci0JdWludDMyICpSSywJKlNLOwotCi0Jc3dpdGNoKAluYml0cyApCi0JewotCQljYXNlIDEyODogY3R4LT5uciA9CTEwOwlicmVhazsKLQkJY2FzZSAxOTI6IGN0eC0+bnIgPQkxMjsJYnJlYWs7Ci0JCWNhc2UgMjU2OiBjdHgtPm5yID0JMTQ7CWJyZWFrOwotCQlkZWZhdWx0CTogcmV0dXJuKCAxCSk7Ci0JfQotCi0JUksgPSAodWludDMyICopIGN0eC0+ZXJrOwotCi0JZm9yKCBpID0gMDsJaSA8CShuYml0cyA+PiA1KTsgaSsrICkKLQl7Ci0JCUdFVF9VSU5UMzIoCVJLW2ldLCBrZXksCWkgKgk0ICk7Ci0JfQotCi0JLyogc2V0dXAgZW5jcnlwdGlvbglyb3VuZCBrZXlzICovCi0KLQlzd2l0Y2goCW5iaXRzICkKLQl7Ci0JY2FzZSAxMjg6Ci0KLQkJZm9yKCBpID0gMDsJaSA8CTEwOwlpKyssIFJLCSs9IDQgKQotCQl7Ci0JCQlSS1s0XSAgPSBSS1swXSBeIFJDT05baV0gXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1szXSA+PiAxNiApIF0gPDwJMjQgKSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzNdID4+ICA4ICkgXSA8PAkxNiApIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbM10JCSApIF0gPDwJIDggKSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzNdID4+IDI0ICkgXQkgICApOwotCi0JCQlSS1s1XSAgPSBSS1sxXSBeIFJLWzRdOwotCQkJUktbNl0gID0gUktbMl0gXiBSS1s1XTsKLQkJCVJLWzddICA9IFJLWzNdIF4gUktbNl07Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIDE5MjoKLQotCQlmb3IoIGkgPSAwOwlpIDwJODsgaSsrLAlSSyArPSA2CSkKLQkJewotCQkJUktbNl0gID0gUktbMF0gXiBSQ09OW2ldIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbNV0gPj4gMTYgKSBdIDw8CTI0ICkgXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s1XSA+PiAgOCApIF0gPDwJMTYgKSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzVdCQkgKSBdIDw8CSA4ICkgXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s1XSA+PiAyNCApIF0JICAgKTsKLQotCQkJUktbN10gID0gUktbMV0gXiBSS1s2XTsKLQkJCVJLWzhdICA9IFJLWzJdIF4gUktbN107Ci0JCQlSS1s5XSAgPSBSS1szXSBeIFJLWzhdOwotCQkJUktbMTBdID0gUktbNF0gXiBSS1s5XTsKLQkJCVJLWzExXSA9IFJLWzVdIF4gUktbMTBdOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSAyNTY6Ci0KLQkJZm9yKCBpID0gMDsJaSA8CTc7IGkrKywJUksgKz0gOAkpCi0JCXsKLQkJCVJLWzhdICA9IFJLWzBdIF4gUkNPTltpXSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzddID4+IDE2ICkgXSA8PAkyNCApIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbN10gPj4gIDggKSBdIDw8CTE2ICkgXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s3XQkJICkgXSA8PAkgOCApIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbN10gPj4gMjQgKSBdCSAgICk7Ci0KLQkJCVJLWzldICA9IFJLWzFdIF4gUktbOF07Ci0JCQlSS1sxMF0gPSBSS1syXSBeIFJLWzldOwotCQkJUktbMTFdID0gUktbM10gXiBSS1sxMF07Ci0KLQkJCVJLWzEyXSA9IFJLWzRdIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbMTFdCT4+IDI0ICkJXSA8PCAyNAkpIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbMTFdCT4+IDE2ICkJXSA8PCAxNgkpIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbMTFdCT4+CTggKQldIDw8ICA4CSkgXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1sxMV0JCSAgKQldCQkpOwotCi0JCQlSS1sxM10gPSBSS1s1XSBeIFJLWzEyXTsKLQkJCVJLWzE0XSA9IFJLWzZdIF4gUktbMTNdOwotCQkJUktbMTVdID0gUktbN10gXiBSS1sxNF07Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JLyogc2V0dXAgZGVjcnlwdGlvbglyb3VuZCBrZXlzICovCi0KLQlpZigJS1RfaW5pdAkpCi0JewotCQlmb3IoIGkgPSAwOwlpIDwJMjU2OyBpKysgKQotCQl7Ci0JCQlLVDBbaV0gPSBSVDBbIEZTYltpXSBdOwotCQkJS1QxW2ldID0gUlQxWyBGU2JbaV0gXTsKLQkJCUtUMltpXSA9IFJUMlsgRlNiW2ldIF07Ci0JCQlLVDNbaV0gPSBSVDNbIEZTYltpXSBdOwotCQl9Ci0KLQkJS1RfaW5pdAk9IDA7Ci0JfQotCi0JU0sgPSAodWludDMyICopIGN0eC0+ZHJrOwotCi0JKlNLKysgPQkqUksrKzsKLQkqU0srKyA9CSpSSysrOwotCSpTSysrID0JKlJLKys7Ci0JKlNLKysgPQkqUksrKzsKLQotCWZvciggaSA9IDE7CWkgPAljdHgtPm5yOyBpKysgKQotCXsKLQkJUksgLT0gODsKLQotCQkqU0srKyA9CUtUMFsgKHVpbnQ4KSAoICpSSyA+PiAyNCApIF0gXgotCQkJCUtUMVsgKHVpbnQ4KSAoICpSSyA+PiAxNiApIF0gXgotCQkJCUtUMlsgKHVpbnQ4KSAoICpSSyA+PiAgOCApIF0gXgotCQkJCUtUM1sgKHVpbnQ4KSAoICpSSwkJICkgXTsgUksrKzsKLQotCQkqU0srKyA9CUtUMFsgKHVpbnQ4KSAoICpSSyA+PiAyNCApIF0gXgotCQkJCUtUMVsgKHVpbnQ4KSAoICpSSyA+PiAxNiApIF0gXgotCQkJCUtUMlsgKHVpbnQ4KSAoICpSSyA+PiAgOCApIF0gXgotCQkJCUtUM1sgKHVpbnQ4KSAoICpSSwkJICkgXTsgUksrKzsKLQotCQkqU0srKyA9CUtUMFsgKHVpbnQ4KSAoICpSSyA+PiAyNCApIF0gXgotCQkJCUtUMVsgKHVpbnQ4KSAoICpSSyA+PiAxNiApIF0gXgotCQkJCUtUMlsgKHVpbnQ4KSAoICpSSyA+PiAgOCApIF0gXgotCQkJCUtUM1sgKHVpbnQ4KSAoICpSSwkJICkgXTsgUksrKzsKLQotCQkqU0srKyA9CUtUMFsgKHVpbnQ4KSAoICpSSyA+PiAyNCApIF0gXgotCQkJCUtUMVsgKHVpbnQ4KSAoICpSSyA+PiAxNiApIF0gXgotCQkJCUtUMlsgKHVpbnQ4KSAoICpSSyA+PiAgOCApIF0gXgotCQkJCUtUM1sgKHVpbnQ4KSAoICpSSwkJICkgXTsgUksrKzsKLQl9Ci0KLQlSSyAtPSA4OwotCi0JKlNLKysgPQkqUksrKzsKLQkqU0srKyA9CSpSSysrOwotCSpTSysrID0JKlJLKys7Ci0JKlNLKysgPQkqUksrKzsKLQotCXJldHVybigJMCApOwotfQotCi0vKiBBRVMgMTI4LWJpdCBibG9jayBlbmNyeXB0aW9uCXJvdXRpbmUJKi8KLQotdm9pZCBydF9hZXNfZW5jcnlwdChhZXNfY29udGV4dCAqY3R4LCB1aW50OCBpbnB1dFsxNl0sCXVpbnQ4IG91dHB1dFsxNl0gKQotewotCXVpbnQzMiAqUkssCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMzsKLQotCVJLID0gKHVpbnQzMiAqKSBjdHgtPmVyazsKLQlHRVRfVUlOVDMyKAlYMCwJaW5wdXQsCTAgKTsgWDAJXj0gUktbMF07Ci0JR0VUX1VJTlQzMigJWDEsCWlucHV0LAk0ICk7IFgxCV49IFJLWzFdOwotCUdFVF9VSU5UMzIoCVgyLAlpbnB1dCwJOCApOyBYMglePSBSS1syXTsKLQlHRVRfVUlOVDMyKAlYMywJaW5wdXQsIDEyICk7IFgzCV49IFJLWzNdOwotCi0jZGVmaW5lCUFFU19GUk9VTkQoWDAsWDEsWDIsWDMsWTAsWTEsWTIsWTMpCQlcCi17CQkJCQkJCQkJCQkJXAotCVJLICs9IDQ7CQkJCQkJCQkJXAotCQkJCQkJCQkJCQkJXAotCVgwID0gUktbMF0gXiBGVDBbICh1aW50OCkgKAlZMCA+PiAyNCApIF0gXglcCi0JCQkJIEZUMVsgKHVpbnQ4KSAoCVkxID4+IDE2ICkgXSBeCVwKLQkJCQkgRlQyWyAodWludDgpICgJWTIgPj4gIDggKSBdIF4JXAotCQkJCSBGVDNbICh1aW50OCkgKAlZMwkJICkgXTsJXAotCQkJCQkJCQkJCQkJXAotCVgxID0gUktbMV0gXiBGVDBbICh1aW50OCkgKAlZMSA+PiAyNCApIF0gXglcCi0JCQkJIEZUMVsgKHVpbnQ4KSAoCVkyID4+IDE2ICkgXSBeCVwKLQkJCQkgRlQyWyAodWludDgpICgJWTMgPj4gIDggKSBdIF4JXAotCQkJCSBGVDNbICh1aW50OCkgKAlZMAkJICkgXTsJXAotCQkJCQkJCQkJCQkJXAotCVgyID0gUktbMl0gXiBGVDBbICh1aW50OCkgKAlZMiA+PiAyNCApIF0gXglcCi0JCQkJIEZUMVsgKHVpbnQ4KSAoCVkzID4+IDE2ICkgXSBeCVwKLQkJCQkgRlQyWyAodWludDgpICgJWTAgPj4gIDggKSBdIF4JXAotCQkJCSBGVDNbICh1aW50OCkgKAlZMQkJICkgXTsJXAotCQkJCQkJCQkJCQkJXAotCVgzID0gUktbM10gXiBGVDBbICh1aW50OCkgKAlZMyA+PiAyNCApIF0gXglcCi0JCQkJIEZUMVsgKHVpbnQ4KSAoCVkwID4+IDE2ICkgXSBeCVwKLQkJCQkgRlQyWyAodWludDgpICgJWTEgPj4gIDggKSBdIF4JXAotCQkJCSBGVDNbICh1aW50OCkgKAlZMgkJICkgXTsJXAotfQotCi0JQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCAxICovCi0JQUVTX0ZST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCAyICovCi0JQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCAzICovCi0JQUVTX0ZST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA0ICovCi0JQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA1ICovCi0JQUVTX0ZST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA2ICovCi0JQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA3ICovCi0JQUVTX0ZST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA4ICovCi0JQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA5ICovCi0KLQlpZigJY3R4LT5ucgk+IDEwICkKLQl7Ci0JCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkvKiByb3VuZCAxMAkqLwotCQlBRVNfRlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJLyogcm91bmQgMTEJKi8KLQl9Ci0KLQlpZigJY3R4LT5ucgk+IDEyICkKLQl7Ci0JCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkvKiByb3VuZCAxMgkqLwotCQlBRVNfRlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJLyogcm91bmQgMTMJKi8KLQl9Ci0KLQkvKiBsYXN0CXJvdW5kICovCi0KLQlSSyArPSA0OwotCi0JWDAgPSBSS1swXSBeICggRlNiWwkodWludDgpCSggWTAgPj4JMjQgKSBdIDw8IDI0ICkgXgotCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkxID4+CTE2ICkgXSA8PCAxNiApIF4KLQkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMiA+PgkgOCApIF0gPDwgIDggKSBeCi0JCQkJICggRlNiWwkodWludDgpCSggWTMJICAgKSBdCQkgKTsKLQotCVgxID0gUktbMV0gXiAoIEZTYlsJKHVpbnQ4KQkoIFkxID4+CTI0ICkgXSA8PCAyNCApIF4KLQkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMiA+PgkxNiApIF0gPDwgMTYgKSBeCi0JCQkJICggRlNiWwkodWludDgpCSggWTMgPj4JIDggKSBdIDw8ICA4ICkgXgotCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkwCSAgICkgXQkJICk7Ci0KLQlYMiA9IFJLWzJdIF4gKCBGU2JbCSh1aW50OCkJKCBZMiA+PgkyNCApIF0gPDwgMjQgKSBeCi0JCQkJICggRlNiWwkodWludDgpCSggWTMgPj4JMTYgKSBdIDw8IDE2ICkgXgotCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkwID4+CSA4ICkgXSA8PCAgOCApIF4KLQkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMQkgICApIF0JCSApOwotCi0JWDMgPSBSS1szXSBeICggRlNiWwkodWludDgpCSggWTMgPj4JMjQgKSBdIDw8IDI0ICkgXgotCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkwID4+CTE2ICkgXSA8PCAxNiApIF4KLQkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMSA+PgkgOCApIF0gPDwgIDggKSBeCi0JCQkJICggRlNiWwkodWludDgpCSggWTIJICAgKSBdCQkgKTsKLQotCVBVVF9VSU5UMzIoCVgwLAlvdXRwdXQsCSAwICk7Ci0JUFVUX1VJTlQzMigJWDEsCW91dHB1dCwJIDQgKTsKLQlQVVRfVUlOVDMyKAlYMiwJb3V0cHV0LAkgOCApOwotCVBVVF9VSU5UMzIoCVgzLAlvdXRwdXQsCTEyICk7Ci19Ci0KLS8qIEFFUyAxMjgtYml0IGJsb2NrIGRlY3J5cHRpb24Jcm91dGluZQkqLwotCi12b2lkIHJ0X2Flc19kZWNyeXB0KCBhZXNfY29udGV4dCAqY3R4LAl1aW50OCBpbnB1dFsxNl0sIHVpbnQ4IG91dHB1dFsxNl0gKQotewotCXVpbnQzMiAqUkssCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMzsKLQotCVJLID0gKHVpbnQzMiAqKSBjdHgtPmRyazsKLQotCUdFVF9VSU5UMzIoCVgwLAlpbnB1dCwJMCApOyBYMAlePSBSS1swXTsKLQlHRVRfVUlOVDMyKAlYMSwJaW5wdXQsCTQgKTsgWDEJXj0gUktbMV07Ci0JR0VUX1VJTlQzMigJWDIsCWlucHV0LAk4ICk7IFgyCV49IFJLWzJdOwotCUdFVF9VSU5UMzIoCVgzLAlpbnB1dCwgMTIgKTsgWDMJXj0gUktbM107Ci0KLSNkZWZpbmUJQUVTX1JST1VORChYMCxYMSxYMixYMyxZMCxZMSxZMixZMykJCVwKLXsJCQkJCQkJCQkJCQlcCi0JUksgKz0gNDsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JWDAgPSBSS1swXSBeIFJUMFsgKHVpbnQ4KSAoCVkwID4+IDI0ICkgXSBeCVwKLQkJCQkgUlQxWyAodWludDgpICgJWTMgPj4gMTYgKSBdIF4JXAotCQkJCSBSVDJbICh1aW50OCkgKAlZMiA+PiAgOCApIF0gXglcCi0JCQkJIFJUM1sgKHVpbnQ4KSAoCVkxCQkgKSBdOwlcCi0JCQkJCQkJCQkJCQlcCi0JWDEgPSBSS1sxXSBeIFJUMFsgKHVpbnQ4KSAoCVkxID4+IDI0ICkgXSBeCVwKLQkJCQkgUlQxWyAodWludDgpICgJWTAgPj4gMTYgKSBdIF4JXAotCQkJCSBSVDJbICh1aW50OCkgKAlZMyA+PiAgOCApIF0gXglcCi0JCQkJIFJUM1sgKHVpbnQ4KSAoCVkyCQkgKSBdOwlcCi0JCQkJCQkJCQkJCQlcCi0JWDIgPSBSS1syXSBeIFJUMFsgKHVpbnQ4KSAoCVkyID4+IDI0ICkgXSBeCVwKLQkJCQkgUlQxWyAodWludDgpICgJWTEgPj4gMTYgKSBdIF4JXAotCQkJCSBSVDJbICh1aW50OCkgKAlZMCA+PiAgOCApIF0gXglcCi0JCQkJIFJUM1sgKHVpbnQ4KSAoCVkzCQkgKSBdOwlcCi0JCQkJCQkJCQkJCQlcCi0JWDMgPSBSS1szXSBeIFJUMFsgKHVpbnQ4KSAoCVkzID4+IDI0ICkgXSBeCVwKLQkJCQkgUlQxWyAodWludDgpICgJWTIgPj4gMTYgKSBdIF4JXAotCQkJCSBSVDJbICh1aW50OCkgKAlZMSA+PiAgOCApIF0gXglcCi0JCQkJIFJUM1sgKHVpbnQ4KSAoCVkwCQkgKSBdOwlcCi19Ci0KLQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDEgKi8KLQlBRVNfUlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDIgKi8KLQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDMgKi8KLQlBRVNfUlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDQgKi8KLQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDUgKi8KLQlBRVNfUlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDYgKi8KLQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDcgKi8KLQlBRVNfUlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDggKi8KLQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDkgKi8KLQotCWlmKAljdHgtPm5yCT4gMTAgKQotCXsKLQkJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CS8qIHJvdW5kIDEwCSovCi0JCUFFU19SUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkvKiByb3VuZCAxMQkqLwotCX0KLQotCWlmKAljdHgtPm5yCT4gMTIgKQotCXsKLQkJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CS8qIHJvdW5kIDEyCSovCi0JCUFFU19SUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkvKiByb3VuZCAxMwkqLwotCX0KLQotCS8qIGxhc3QJcm91bmQgKi8KLQotCVJLICs9IDQ7Ci0KLQlYMCA9IFJLWzBdIF4gKCBSU2JbCSh1aW50OCkJKCBZMCA+PgkyNCApIF0gPDwgMjQgKSBeCi0JCQkJICggUlNiWwkodWludDgpCSggWTMgPj4JMTYgKSBdIDw8IDE2ICkgXgotCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkyID4+CSA4ICkgXSA8PCAgOCApIF4KLQkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMQkgICApIF0JCSApOwotCi0JWDEgPSBSS1sxXSBeICggUlNiWwkodWludDgpCSggWTEgPj4JMjQgKSBdIDw8IDI0ICkgXgotCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkwID4+CTE2ICkgXSA8PCAxNiApIF4KLQkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMyA+PgkgOCApIF0gPDwgIDggKSBeCi0JCQkJICggUlNiWwkodWludDgpCSggWTIJICAgKSBdCQkgKTsKLQotCVgyID0gUktbMl0gXiAoIFJTYlsJKHVpbnQ4KQkoIFkyID4+CTI0ICkgXSA8PCAyNCApIF4KLQkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMSA+PgkxNiApIF0gPDwgMTYgKSBeCi0JCQkJICggUlNiWwkodWludDgpCSggWTAgPj4JIDggKSBdIDw8ICA4ICkgXgotCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkzCSAgICkgXQkJICk7Ci0KLQlYMyA9IFJLWzNdIF4gKCBSU2JbCSh1aW50OCkJKCBZMyA+PgkyNCApIF0gPDwgMjQgKSBeCi0JCQkJICggUlNiWwkodWludDgpCSggWTIgPj4JMTYgKSBdIDw8IDE2ICkgXgotCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkxID4+CSA4ICkgXSA8PCAgOCApIF4KLQkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMAkgICApIF0JCSApOwotCi0JUFVUX1VJTlQzMigJWDAsCW91dHB1dCwJIDAgKTsKLQlQVVRfVUlOVDMyKAlYMSwJb3V0cHV0LAkgNCApOwotCVBVVF9VSU5UMzIoCVgyLAlvdXRwdXQsCSA4ICk7Ci0JUFVUX1VJTlQzMigJWDMsCW91dHB1dCwJMTIgKTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBFTkNSWVBUIEFFUyBHVEsgYmVmb3JlIHNlbmRpbmcgaW4gRUFQT0wgZnJhbWUuCi0gICAgICAgIEFFUyBHVEsgbGVuZ3RoID0gMTI4IGJpdCwgIHNvIGZpeCBibG9ja3MgZm9yIGFlcy1rZXktd3JhcCBhcyAyIGluIHRoaXMgZnVuY3Rpb24uCi0gICAgICAgIFRoaXMgZnVuY3Rpb24gcmVmZXJlbmNlcyB0byBSRkMgMzM5NCBmb3IgYWVzIGtleSB3cmFwIGFsZ29yaXRobS4KLSAgICBSZXR1cm46Ci0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEFFU19HVEtfS0VZX1dSQVAoCi0gICAgSU4gVUNIQVIgICAgKmtleSwKLSAgICBJTiBVQ0hBUiAgICAqcGxhaW50ZXh0LAotICAgIElOIFVJTlQzMiAgICBwX2xlbiwKLSAgICBPVVQgVUNIQVIgICAqY2lwaGVydGV4dCkKLXsKLSAgICBVQ0hBUiAgICAgICBBWzhdLCBCSU5bMTZdLCBCT1VUWzE2XTsKLSAgICBVQ0hBUiAgICAgICBSWzUxMl07Ci0gICAgSU5UICAgICAgICAgbnVtX2Jsb2NrcyA9IHBfbGVuLzg7ICAgLy8gdW5pdDo2NGJpdHMKLSAgICBJTlQgICAgICAgICBpLCBqOwotICAgIGFlc19jb250ZXh0IGFlc2N0eDsKLSAgICBVQ0hBUiAgICAgICB4b3I7Ci0KLSAgICBydF9hZXNfc2V0X2tleSgmYWVzY3R4LCBrZXksIDEyOCk7Ci0KLSAgICAvLyBJbml0IElBCi0gICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLSAgICAgICAgQVtpXSA9IDB4YTY7Ci0KLSAgICAvL0lucHV0IHBsYWludGV4dAotICAgIGZvciAoaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspCi0gICAgewotICAgICAgICBmb3IgKGogPSAwIDsgaiA8IDg7IGorKykKLSAgICAgICAgICAgIFJbOCAqIChpICsgMSkgKyBqXSA9IHBsYWludGV4dFs4ICogaSArIGpdOwotICAgIH0KLQotICAgIC8vIEtleSBNaXgKLSAgICBmb3IgKGogPSAwOyBqIDwgNjsgaisrKQotICAgIHsKLSAgICAgICAgZm9yKGkgPSAxOyBpIDw9IG51bV9ibG9ja3M7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgLy9waGFzZSAxCi0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShCSU4sIEEsIDgpOwotICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJkJJTls4XSwgJlJbOCAqIGldLCA4KTsKLSAgICAgICAgICAgIHJ0X2Flc19lbmNyeXB0KCZhZXNjdHgsIEJJTiwgQk9VVCk7Ci0KLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KEEsICZCT1VUWzBdLCA4KTsKLSAgICAgICAgICAgIHhvciA9IG51bV9ibG9ja3MgKiBqICsgaTsKLSAgICAgICAgICAgIEFbN10gPSBCT1VUWzddIF4geG9yOwotICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJlJbOCAqIGldLCAmQk9VVFs4XSwgOCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBPdXRwdXQgY2lwaGVydGV4dAotICAgIE5kaXNNb3ZlTWVtb3J5KGNpcGhlcnRleHQsIEEsIDgpOwotCi0gICAgZm9yIChpID0gMTsgaSA8PSBudW1fYmxvY2tzOyBpKyspCi0gICAgewotICAgICAgICBmb3IgKGogPSAwIDsgaiA8IDg7IGorKykKLSAgICAgICAgICAgIGNpcGhlcnRleHRbOCAqIGkgKyBqXSA9IFJbOCAqIGkgKyBqXTsKLSAgICB9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlNaXNjIGZ1bmN0aW9uIHRvIGRlY3J5cHQgQUVTIGJvZHkKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCU5vdGU6Ci0JCVRoaXMgZnVuY3Rpb24gcmVmZXJlbmNlcyB0bwlSRkMJMzM5NCBmb3IgYWVzIGtleSB1bndyYXAgYWxnb3JpdGhtLgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlBRVNfR1RLX0tFWV9VTldSQVAoCi0JSU4JVUNIQVIJKmtleSwKLQlPVVQJVUNIQVIJKnBsYWludGV4dCwKLQlJTglVSU5UMzIgICBjX2xlbiwKLQlJTglVQ0hBUgkqY2lwaGVydGV4dCkKLQotewotCVVDSEFSICAgICAgIEFbOF0sIEJJTlsxNl0sIEJPVVRbMTZdOwotCVVDSEFSICAgICAgIHhvcjsKLQlJTlQgICAgICAgICBpLCBqOwotCWFlc19jb250ZXh0IGFlc2N0eDsKLQlVQ0hBUiAgICAgICAqUjsKLQlJTlQgICAgICAgICBudW1fYmxvY2tzID0gY19sZW4vODsJLy8gdW5pdDo2NGJpdHMKLQotCi0Jb3NfYWxsb2NfbWVtKE5VTEwsIChQVUNIQVIgKikmUiwgNTEyKTsKLQotCWlmIChSID09IE5VTEwpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIhISFBRVNfR1RLX0tFWV9VTldSQVA6IG5vIG1lbW9yeSEhIVxuIikpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotCS8vIEluaXRpYWxpemUKLQlOZGlzTW92ZU1lbW9yeShBLCBjaXBoZXJ0ZXh0LCA4KTsKLQkvL0lucHV0IHBsYWludGV4dAotCWZvcihpID0gMDsgaSA8IChjX2xlbi04KTsgaSsrKQotCXsKLQkJUlsgaV0gPSBjaXBoZXJ0ZXh0W2kgKyA4XTsKLQl9Ci0KLQlydF9hZXNfc2V0X2tleSgmYWVzY3R4LCBrZXksIDEyOCk7Ci0KLQlmb3IoaiA9IDU7IGogPj0gMDsgai0tKQotCXsKLQkJZm9yKGkgPSAobnVtX2Jsb2Nrcy0xKTsgaSA+IDA7IGktLSkKLQkJewotCQkJeG9yID0gKG51bV9ibG9ja3MgLTEgKSogaiArIGk7Ci0JCQlOZGlzTW92ZU1lbW9yeShCSU4sIEEsIDgpOwotCQkJQklOWzddID0gQVs3XSBeIHhvcjsKLQkJCU5kaXNNb3ZlTWVtb3J5KCZCSU5bOF0sICZSWyhpLTEpKjhdLCA4KTsKLQkJCXJ0X2Flc19kZWNyeXB0KCZhZXNjdHgsIEJJTiwgQk9VVCk7Ci0JCQlOZGlzTW92ZU1lbW9yeShBLCAmQk9VVFswXSwgOCk7Ci0JCQlOZGlzTW92ZU1lbW9yeSgmUlsoaS0xKSo4XSwgJkJPVVRbOF0sIDgpOwotCQl9Ci0JfQotCi0JLy8gT1VUUFVUCi0JZm9yKGkgPSAwOyBpIDwgY19sZW47IGkrKykKLQl7Ci0JCXBsYWludGV4dFtpXSA9IFJbaV07Ci0JfQotCi0KLQlvc19mcmVlX21lbShOVUxMLCBSKTsKLX0KLQotCi0vKiA9PT09PT09ICBUaGUgcmVsYXRlZCBmdW5jdGlvbiBvZiBBRVMtMTI4LUNNQUMgID09PT09PT0gKi8KLVZPSUQgbGVmdHNoaWZ0X29uZWJpdCgKLQlJTiAgUFVDSEFSCWlucHV0LAotCU9VVCBQVUNIQVIJb3V0cHV0KQotewotCUlOVCBpOwotCVVDSEFSIG92ZXJmbG93ID0gMDsKLQotCWZvciAoaT0xNTsgaT49MDsgaS0tKQotCXsKLQkJb3V0cHV0W2ldID0gaW5wdXRbaV0gPDwgMTsKLQkJb3V0cHV0W2ldIHw9IG92ZXJmbG93OwotCQlvdmVyZmxvdyA9IChpbnB1dFtpXSAmIDB4ODApID8gMSA6IDA7Ci0JfQotfQotCi1WT0lEIGRvX3BhZGRpbmcoCi0JSU4JUFVDSEFSCWxhc3RiLAotCU9VVAlQVUNIQVIJcGFkLAotCUlOICBJTlQJCWxlbikKLXsKLQlJTlQJajsKLQotCWZvciAoaj0wOyBqPDE2OyBqKyspCi0JewotCQlpZiAoaiA8IGxlbikKLQkJCXBhZFtqXSA9IGxhc3RiW2pdOwotCQllbHNlIGlmIChqID09IGxlbikKLQkJCXBhZFtqXSA9IDB4ODA7Ci0JCWVsc2UKLQkJCXBhZFtqXSA9IDB4MDA7Ci0JfQotCi0KLX0KLQotLyoKLSAqCVRoZSBTdWJrZXkgR2VuZXJhdGlvbiBBbGdvcml0aG0KLSAqLwotVk9JRCBnZW5lcmF0ZV9zdWJrZXkoCi0JSU4JUFVDSEFSIGtleSwKLQlPVVQJUFVDSEFSIEsxLAotCU9VVCBQVUNIQVIgSzIpCi17Ci0JYWVzX2NvbnRleHQgYWVzY3R4OwotCVVDSEFSIGFlc18xMjhfa2V5WzE2XTsKLQlVQ0hBUiBjb25zdF9aZXJvWzE2XTsKLQlVQ0hBUiB0bXBbMTZdOwotCVVDSEFSIGNvbnN0X1JiWzE2XSA9IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCQkJCQkgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg3fTsKLQotCS8vIGluaXRpYWwgdGhlIGtleSBtYXRlcmlhbAotCW1lbXNldChjb25zdF9aZXJvLCAwLCAxNik7Ci0JbWVtc2V0KGFlc18xMjhfa2V5LCAwLCAxNik7Ci0KLQkvLyBBRVMtMTI4IHdpdGgga2V5IGlzIGFwcGxpZWQgdG8gYW4gYWxsLXplcm8gaW5wdXQgYmxvY2sKLQlydF9hZXNfc2V0X2tleSgmYWVzY3R4LCBrZXksIDEyOCk7Ci0JcnRfYWVzX2VuY3J5cHQoJmFlc2N0eCwgY29uc3RfWmVybywgYWVzXzEyOF9rZXkpOwotCi0JLy8gZGVyaXZlIEsxKDEyOC1iaXQgZmlyc3Qgc3Via2V5KSBhbmQgSzIoMTI4LWJpdCBzZWNvbmQgc3Via2V5KSwgcmVmZXIgdG8gcmZjLTQ0OTMgY2ggMi4zCi0JaWYgKChhZXNfMTI4X2tleVswXSAmIDB4ODApID09IDApCi0JewotCQlsZWZ0c2hpZnRfb25lYml0KGFlc18xMjhfa2V5LCBLMSk7Ci0JfQotCWVsc2UKLQl7Ci0JCWxlZnRzaGlmdF9vbmViaXQoYWVzXzEyOF9rZXksIHRtcCk7Ci0JCXhvcl8xMjgodG1wLCBjb25zdF9SYiwgSzEpOwotCX0KLQotCWlmICgoSzFbMF0gJiAweDgwKSA9PSAwKQotCXsKLQkJbGVmdHNoaWZ0X29uZWJpdChLMSwgSzIpOwotCX0KLQllbHNlCi0JewotCQlsZWZ0c2hpZnRfb25lYml0KEsxLCB0bXApOwotCQl4b3JfMTI4KHRtcCwgY29uc3RfUmIsIEsyKTsKLQl9Ci0KLX0KLQotLyoKLSAqCUFFUy1DTUFDIEFsZ29yaXRobS4gKHJlZmVyIHRvIHJmYy00NDkzIGFuZCBTUDgwMC0zOEIpCi0gKgotICoJSW5wdXQgOiBrZXkJCSgxMjgtYml0IGtleSkKLSAqCQkJaW5wdXQJCShtZXNzYWdlIHRvIGJlIGF1dGhlbnRpY2F0ZWQpCi0gKgkJCWxlbgkJCShsZW5ndGggb2YgdGhlIG1lc3NhZ2UgaW4gb2N0ZXRzKQotICoKLSAqCW91dHB1dDogbWFjCQkJKG1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZSkKLSAqLwotVk9JRCBBRVNfMTI4X0NNQUMoCi0JSU4JUFVDSEFSCWtleSwKLQlJTglQVUNIQVIJaW5wdXQsCi0JSU4JSU5UCQlsZW4sCi0JT1VUCVBVQ0hBUgltYWMpCi17Ci0JVUNIQVIJWFsxNl0sIFlbMTZdLCBNX2xhc3RbMTZdLCBwYWRkZWRbMTZdOwotCVVDSEFSCUsxWzE2XSwgSzJbMTZdOwotCWFlc19jb250ZXh0IGFlc2N0eDsKLQlJTlQJCW4sIGksIGZsYWc7Ci0KLQlnZW5lcmF0ZV9zdWJrZXkoa2V5LCBLMSwgSzIpOwotCi0JbiA9IChsZW4rMTUpIC8gMTY7CQkvLyBuIGlzIG51bWJlciBvZiByb3VuZHMKLQotCWlmIChuID09IDApCi0JewotCQluID0gMTsKLQkJZmxhZyA9IDA7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmICgobGVuJTE2KSA9PSAwKQotCQkJZmxhZyA9IDE7CQkJLy8gaW5kaWNhdGUgdGhhdCBsYXN0IGJsb2NrIGlzIGEgY29tcGxldGUgYmxvY2sKLQkJZWxzZQotCQkJZmxhZyA9IDA7CQkJLy8gaW5kaWNhdGUgdGhhdCBsYXN0IGJsb2NrIGlzIG5vdCBhIGNvbXBsZXRlIGJsb2NrCi0JfQotCi0JaWYgKGZsYWcpCi0JewotCQl4b3JfMTI4KCZpbnB1dFsxNioobi0xKV0sIEsxLCBNX2xhc3QpOwotCX0KLQllbHNlCi0JewotCQlkb19wYWRkaW5nKCZpbnB1dFsxNioobi0xKV0sIHBhZGRlZCwgbGVuJTE2KTsKLQkJeG9yXzEyOChwYWRkZWQsIEsyLCBNX2xhc3QpOwotCX0KLQotCW1lbXNldChYLCAwLCAxNik7Ci0JZm9yIChpPTA7IGk8bi0xOyBpKyspCi0JewotCQl4b3JfMTI4KFgsICZpbnB1dFsxNippXSwgWSk7Ci0JCXJ0X2Flc19zZXRfa2V5KCZhZXNjdHgsIGtleSwgMTI4KTsKLQkJcnRfYWVzX2VuY3J5cHQoJmFlc2N0eCwgWSwgWCk7Ci0JfQotCi0JeG9yXzEyOChYLCBNX2xhc3QsIFkpOwotCXJ0X2Flc19zZXRfa2V5KCZhZXNjdHgsIGtleSwgMTI4KTsKLQlydF9hZXNfZW5jcnlwdCgmYWVzY3R4LCBZLCBYKTsKLQotCWZvciAoaT0wOyBpPDE2OyBpKyspCi0JewotCQltYWNbaV0gPSBYW2ldOwotCX0KLQotfQotLyogPT09PT09PSAgVGhlIHJlbGF0ZWQgZnVuY3Rpb24gb2YgQUVTLTEyOC1DTUFDICA9PT09PT09ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fYXNpYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX2FzaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxYzgwOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fYXNpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc1MyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCWNtbV9hc2ljLmMKLQotCUFic3RyYWN0OgotCUZ1bmN0aW9ucyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggQVNJQwotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCQlXaGVuCQkJV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi0vLyBSZXNldCB0aGUgUkZJQyBzZXR0aW5nIHRvIG5ldyBzZXJpZXMKLVJUTVBfUkZfUkVHUyBSRjI4NTBSZWdUYWJsZVtdID0gewotLy8JCWNoCSBSMQkJIFIyCQkgUjMoVFgwfjQ9MCkgUjQKLQkJezEsICAweDk4NDAyZWNjLCAweDk4NGMwNzg2LCAweDk4MTZiNDU1LCAweDk4MDA1MTBifSwKLQkJezIsICAweDk4NDAyZWNjLCAweDk4NGMwNzg2LCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKLQkJezMsICAweDk4NDAyZWNjLCAweDk4NGMwNzhhLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKLQkJezQsICAweDk4NDAyZWNjLCAweDk4NGMwNzhhLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKLQkJezUsICAweDk4NDAyZWNjLCAweDk4NGMwNzhlLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKLQkJezYsICAweDk4NDAyZWNjLCAweDk4NGMwNzhlLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKLQkJezcsICAweDk4NDAyZWNjLCAweDk4NGMwNzkyLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKLQkJezgsICAweDk4NDAyZWNjLCAweDk4NGMwNzkyLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKLQkJezksICAweDk4NDAyZWNjLCAweDk4NGMwNzk2LCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKLQkJezEwLCAweDk4NDAyZWNjLCAweDk4NGMwNzk2LCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKLQkJezExLCAweDk4NDAyZWNjLCAweDk4NGMwNzlhLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKLQkJezEyLCAweDk4NDAyZWNjLCAweDk4NGMwNzlhLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKLQkJezEzLCAweDk4NDAyZWNjLCAweDk4NGMwNzllLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKLQkJezE0LCAweDk4NDAyZWNjLCAweDk4NGMwN2EyLCAweDk4MTY4YTU1LCAweDk4MDA1MTkzfSwKLQotCQkvLyA4MDIuMTEgVU5JIC8gSHlwZXJMYW4gMgotCQl7MzYsIDB4OTg0MDJlY2MsIDB4OTg0YzA5OWEsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LAotCQl7MzgsIDB4OTg0MDJlY2MsIDB4OTg0YzA5OWUsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9LAotCQl7NDAsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODIsIDB4OTgxNThhNTUsIDB4OTgwZWQxODN9LAotCQl7NDQsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODIsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LAotCQl7NDYsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODYsIDB4OTgxNThhNTUsIDB4OTgwZWQxOGJ9LAotCQl7NDgsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODYsIDB4OTgxNThhNTUsIDB4OTgwZWQxOWJ9LAotCQl7NTIsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OGEsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9LAotCQl7NTQsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OGEsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LAotCQl7NTYsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OGUsIDB4OTgxNThhNTUsIDB4OTgwZWQxOGJ9LAotCQl7NjAsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OTIsIDB4OTgxNThhNTUsIDB4OTgwZWQxODN9LAotCQl7NjIsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OTIsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9LAotCQl7NjQsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OTIsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LCAvLyBQbHVnZmVzdCM0LCBEYXk0LCBjaGFuZ2UgUkZSMyBsZWZ0NHRoIDktPjUuCi0KLQkJLy8gODAyLjExIEh5cGVyTGFuIDIKLQkJezEwMCwgMHg5ODQwMmVjOCwgMHg5ODRjMDZiMiwgMHg5ODE3OGE1NSwgMHg5ODBlZDc4M30sCi0KLQkJLy8gMjAwOC4wNC4zMCBtb2RpZmllZAotCQkvLyBUaGUgc3lzdGVtIHRlYW0gaGFzIEFOIHRvIGltcHJvdmUgdGhlIEVWTSB2YWx1ZQotCQkvLyBmb3IgY2hhbm5lbCAxMDIgdG8gMTA4IGZvciB0aGUgUlQyODUwL1JUMjc1MCBkdWFsIGJhbmQgc29sdXRpb24uCi0JCXsxMDIsIDB4OTg0MDJlYzgsIDB4OTg1YzA2YjIsIDB4OTg1NzhhNTUsIDB4OTgwZWQ3OTN9LAotCQl7MTA0LCAweDk4NDAyZWM4LCAweDk4NWMwNmIyLCAweDk4NTc4YTU1LCAweDk4MGVkMWEzfSwKLQkJezEwOCwgMHg5ODQwMmVjYywgMHg5ODVjMGEzMiwgMHg5ODU3OGE1NSwgMHg5ODBlZDE5M30sCi0KLQkJezExMCwgMHg5ODQwMmVjYywgMHg5ODRjMGEzNiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4M30sCi0JCXsxMTIsIDB4OTg0MDJlY2MsIDB4OTg0YzBhMzYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOWJ9LAotCQl7MTE2LCAweDk4NDAyZWNjLCAweDk4NGMwYTNhLCAweDk4MTc4YTU1LCAweDk4MGVkMWEzfSwKLQkJezExOCwgMHg5ODQwMmVjYywgMHg5ODRjMGEzZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5M30sCi0JCXsxMjAsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODN9LAotCQl7MTI0LCAweDk4NDAyZWM0LCAweDk4NGMwMzgyLCAweDk4MTc4YTU1LCAweDk4MGVkMTkzfSwKLQkJezEyNiwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE1Yn0sIC8vIDB4OTgwZWQxYmItPjB4OTgwZWQxNWIgcmVxdWlyZWQgYnkgUm9yeSAyMDA3MDkyNwotCQl7MTI4LCAweDk4NDAyZWM0LCAweDk4NGMwMzgyLCAweDk4MTc4YTU1LCAweDk4MGVkMWEzfSwKLQkJezEzMiwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4NiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4Yn0sCi0JCXsxMzQsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOTN9LAotCQl7MTM2LCAweDk4NDAyZWM0LCAweDk4NGMwMzg2LCAweDk4MTc4YTU1LCAweDk4MGVkMTlifSwKLQkJezE0MCwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4YSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4M30sCi0KLQkJLy8gODAyLjExIFVOSUkKLQkJezE0OSwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4YSwgMHg5ODE3OGE1NSwgMHg5ODBlZDFhN30sCi0JCXsxNTEsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGUsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODd9LAotCQl7MTUzLCAweDk4NDAyZWM0LCAweDk4NGMwMzhlLCAweDk4MTc4YTU1LCAweDk4MGVkMThmfSwKLQkJezE1NywgMHg5ODQwMmVjNCwgMHg5ODRjMDM4ZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5Zn0sCi0JCXsxNTksIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGUsIDB4OTgxNzhhNTUsIDB4OTgwZWQxYTd9LAotCQl7MTYxLCAweDk4NDAyZWM0LCAweDk4NGMwMzkyLCAweDk4MTc4YTU1LCAweDk4MGVkMTg3fSwKLQkJezE2NSwgMHg5ODQwMmVjNCwgMHg5ODRjMDM5MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5N30sCi0JCXsxNjcsIDB4OTg0MDJlYzQsIDB4OTg0YzAzZDIsIDB4OTgxNzk4NTUsIDB4OTgxNTUzMWZ9LAotCQl7MTY5LCAweDk4NDAyZWM0LCAweDk4NGMwM2QyLCAweDk4MTc5ODU1LCAweDk4MTU1MzI3fSwKLQkJezE3MSwgMHg5ODQwMmVjNCwgMHg5ODRjMDNkNiwgMHg5ODE3OTg1NSwgMHg5ODE1NTMwN30sCi0JCXsxNzMsIDB4OTg0MDJlYzQsIDB4OTg0YzAzZDYsIDB4OTgxNzk4NTUsIDB4OTgxNTUzMGZ9LAotCi0JCS8vIEphcGFuCi0JCXsxODQsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5MWUsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMGJ9LAotCQl7MTg4LCAweDk1MDAyY2NjLCAweDk1MDA0OTIyLCAweDk1MDliZTU1LCAweDk1MGMwYTEzfSwKLQkJezE5MiwgMHg5NTAwMmNjYywgMHg5NTAwNDkyNiwgMHg5NTA5YmU1NSwgMHg5NTBjMGExYn0sCi0JCXsxOTYsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5MmEsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMjN9LAotCQl7MjA4LCAweDk1MDAyY2NjLCAweDk1MDA0OTNhLCAweDk1MDliZTU1LCAweDk1MGMwYTEzfSwKLQkJezIxMiwgMHg5NTAwMmNjYywgMHg5NTAwNDkzZSwgMHg5NTA5YmU1NSwgMHg5NTBjMGExYn0sCi0JCXsyMTYsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5ODIsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMjN9LAotCi0JCS8vIHN0aWxsIGxhY2sgb2YgTU1BQyhKYXBhbikgY2ggMzQsMzgsNDIsNDYKLX07Ci1VQ0hBUglOVU1fT0ZfMjg1MF9DSE5MID0gKHNpemVvZihSRjI4NTBSZWdUYWJsZSkgLyBzaXplb2YoUlRNUF9SRl9SRUdTKSk7Ci0KLUZSRVFVRU5DWV9JVEVNIEZyZXFJdGVtczMwMjBbXSA9Ci17Ci0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCS8vIElTTSA6IDIuNCB0byAyLjQ4MyBHSHogICAgICAgICAgICAgICAgICAgICAgICAgLy8KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLy8gMTFnCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCS8vLUNILS0tTi0tLS0tLS1SLS0tSy0tLS0tLS0tLS0tCi0JezEsICAgIDI0MSwgIDIsICAyfSwKLQl7MiwgICAgMjQxLAkgMiwgIDd9LAotCXszLCAgICAyNDIsCSAyLCAgMn0sCi0JezQsICAgIDI0MiwJIDIsICA3fSwKLQl7NSwgICAgMjQzLAkgMiwgIDJ9LAotCXs2LCAgICAyNDMsCSAyLCAgN30sCi0JezcsICAgIDI0NCwJIDIsICAyfSwKLQl7OCwgICAgMjQ0LAkgMiwgIDd9LAotCXs5LCAgICAyNDUsCSAyLCAgMn0sCi0JezEwLCAgIDI0NSwJIDIsICA3fSwKLQl7MTEsICAgMjQ2LAkgMiwgIDJ9LAotCXsxMiwgICAyNDYsCSAyLCAgN30sCi0JezEzLCAgIDI0NywJIDIsICAyfSwKLQl7MTQsICAgMjQ4LAkgMiwgIDR9LAotfTsKLVVDSEFSCU5VTV9PRl8zMDIwX0NITkwgPSAoc2l6ZW9mKEZyZXFJdGVtczMwMjApIC8gc2l6ZW9mKEZSRVFVRU5DWV9JVEVNKSk7Ci0KLQotVk9JRCBBc2ljVXBkYXRlQXV0b0ZhbGxCYWNrVGFibGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcFJhdGVUYWJsZSkKLXsKLQlVQ0hBUgkJCQkJaTsKLQlIVF9GQktfQ0ZHMF9TVFJVQwkJSHRDZmcwOwotCUhUX0ZCS19DRkcxX1NUUlVDCQlIdENmZzE7Ci0JTEdfRkJLX0NGRzBfU1RSVUMJCUxnQ2ZnMDsKLQlMR19GQktfQ0ZHMV9TVFJVQwkJTGdDZmcxOwotCVBSVE1QX1RYX1JBVEVfU1dJVENICXBDdXJyVHhSYXRlLCBwTmV4dFR4UmF0ZTsKLQotCS8vIHNldCB0byBpbml0aWFsIHZhbHVlCi0JSHRDZmcwLndvcmQgPSAweDY1NDMyMTAwOwotCUh0Q2ZnMS53b3JkID0gMHhlZGNiYTk4ODsKLQlMZ0NmZzAud29yZCA9IDB4ZWRjYmE5ODg7Ci0JTGdDZmcxLndvcmQgPSAweDAwMDAyMTAwOwotCi0JcE5leHRUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpcFJhdGVUYWJsZSsxOwotCWZvciAoaSA9IDE7IGkgPCAqKChQVUNIQVIpIHBSYXRlVGFibGUpOyBpKyspCi0JewotCQlwQ3VyclR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSClwUmF0ZVRhYmxlKzEraTsKLQkJc3dpdGNoIChwQ3VyclR4UmF0ZS0+TW9kZSkKLQkJewotCQkJY2FzZSAwOgkJLy9DQ0sKLQkJCQlicmVhazsKLQkJCWNhc2UgMToJCS8vT0ZETQotCQkJCXsKLQkJCQkJc3dpdGNoKHBDdXJyVHhSYXRlLT5DdXJyTUNTKQotCQkJCQl7Ci0JCQkJCQljYXNlIDA6Ci0JCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1MwRkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAxOgotCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTMUZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgMjoKLQkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzJGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDM6Ci0JCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1MzRkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSA0OgotCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTNEZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgNToKLQkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzVGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDY6Ci0JCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1M2RkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSA3OgotCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTN0ZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCWNhc2UgMjoJCS8vSFQtTUlYCi0JCQljYXNlIDM6CQkvL0hULUdGCi0JCQkJewotCQkJCQlpZiAoKHBOZXh0VHhSYXRlLT5Nb2RlID49IE1PREVfSFRNSVgpICYmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyAhPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUykpCi0JCQkJCXsKLQkJCQkJCXN3aXRjaChwQ3VyclR4UmF0ZS0+Q3Vyck1DUykKLQkJCQkJCXsKLQkJCQkJCQljYXNlIDA6Ci0JCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzBGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAxOgotCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MxRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMjoKLQkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTMkZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDM6Ci0JCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzNGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSA0OgotCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1M0RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgNToKLQkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTNUZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDY6Ci0JCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzZGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSA3OgotCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1M3RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgODoKLQkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTOEZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDk6Ci0JCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzlGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAxMDoKLQkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTBGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAxMToKLQkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTFGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAxMjoKLQkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTJGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAxMzoKLQkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTNGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAxNDoKLQkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTRGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAxNToKLQkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTVGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQXNpY1VwZGF0ZUF1dG9GYWxsQmFja1RhYmxlOiBub3Qgc3VwcG9ydCBDdXJyTUNTPSVkXG4iLCBwQ3VyclR4UmF0ZS0+Q3Vyck1DUykpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQl9Ci0KLQkJcE5leHRUeFJhdGUgPSBwQ3VyclR4UmF0ZTsKLQl9Ci0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIVF9GQktfQ0ZHMCwgSHRDZmcwLndvcmQpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEhUX0ZCS19DRkcxLCBIdENmZzEud29yZCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgTEdfRkJLX0NGRzAsIExnQ2ZnMC53b3JkKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBMR19GQktfQ0ZHMSwgTGdDZmcxLndvcmQpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJU2V0IE1BQyByZWdpc3RlciB2YWx1ZSBhY2NvcmRpbmcgb3BlcmF0aW9uIG1vZGUuCi0JCU9wZXJhdGlvbk1vZGUgQU5EIGJOb25HRkV4aXN0IGFyZSBmb3IgTU0gYW5kIEdGIFByb3RlY2l0b24uCi0JCUlmIE1NIG9yIEdGIG1hc2sgaXMgbm90IHNldCwgdGhvc2UgcGFzc2luZyBhcmd1bWVudCBkb2Vzbid0IG5vdCB0YWtlIGVmZmVjdC4KLQotCQlPcGVyYXRpb24gbW9kZSBtZWFuaW5nOgotCQk9IDAgOiBQdXJlIEhULCBubyBwcmVvdGVjdGlvbi4KLQkJPSAweDAxOyB0aGVyZSBtYXkgYmUgbm9uLUhUIGRldmljZXMgaW4gYm90aCB0aGUgY29udHJvbCBhbmQgZXh0ZW5zaW9uIGNoYW5uZWwsIHByb3RlY3Rpb24gaXMgb3B0aW9uYWwgaW4gQlNTLgotCQk9IDB4MTA6IE5vIFRyYW5zbWlzc2lvbiBpbiA0ME0gaXMgcHJvdGVjdGVkLgotCQk9IDB4MTE6IFRyYW5zbWlzc2lvbiBpbiBib3RoIDQwTSBhbmQgMjBNIHNoYWxsIGJlIHByb3RlY3RlZAotCQlpZiAoYk5vbkdGRXhpc3QpCi0JCQl3ZSBzaG91bGQgY2hvb3NlIG5vdCB0byB1c2UgR0YuIEJ1dCBzdGlsbCBzZXQgY29ycmVjdCBBU0lDIHJlZ2lzdGVycy4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECUFzaWNVcGRhdGVQcm90ZWN0KAotCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKLQlJTgkJVVNIT1JUCQkJT3BlcmF0aW9uTW9kZSwKLQlJTgkJVUNIQVIJCQlTZXRNYXNrLAotCUlOCQlCT09MRUFOCQkJYkRpc2FibGVCR1Byb3RlY3QsCi0JSU4JCUJPT0xFQU4JCQliTm9uR0ZFeGlzdCkKLXsKLQlQUk9UX0NGR19TVFJVQwlQcm90Q2ZnLCBQcm90Q2ZnNDsKLQlVSU5UMzIgUHJvdGVjdFs2XTsKLQlVU0hPUlQJCQlvZmZzZXQ7Ci0JVUNIQVIJCQlpOwotCVVJTlQzMiBNYWNSZWcgPSAwOwotCi0jaWZkZWYgUkFMSU5LX0FURQotCWlmIChBVEVfT04ocEFkKSkKLQkJcmV0dXJuOwotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCWlmICghKHBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QpICYmIChPcGVyYXRpb25Nb2RlICE9IDgpKQotCXsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwQWQtPkJBVGFibGUubnVtRG9uZU9yaWdpbmF0b3IpCi0JewotCQkvLwotCQkvLyBlbmFibGUgdGhlIFJUUy9DVFMgdG8gYXZvaWQgY2hhbm5lbCBjb2xsaXNpb24KLQkJLy8KLQkJU2V0TWFzayA9IEFMTE5fU0VUUFJPVEVDVDsKLQkJT3BlcmF0aW9uTW9kZSA9IDg7Ci0JfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JLy8gQ29uZmlnIEFTSUMgUlRTIHRocmVzaG9sZCByZWdpc3RlcgotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfUlRTX0NGRywgJk1hY1JlZyk7Ci0JTWFjUmVnICY9IDB4RkYwMDAwRkY7Ci0JLy8gSWYgdGhlIHVzZXIgd2FudCBkaXNhYmxlIFJ0c1RocmVzaG9sZCBhbmQgZW5iYWxlIEFtc2R1L1JhbGluay1BZ2dyZWdhdGlvbiwgc2V0IHRoZSBSdHNUaHJlc2hvbGQgYXMgNDA5NgotICAgICAgICBpZiAoKAotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSkgfHwKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCShwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID09IFRSVUUpKQotICAgICAgICAgICAgJiYgcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID09IE1BWF9SVFNfVEhSRVNIT0xEKQotICAgICAgICB7Ci0JCQlNYWNSZWcgfD0gKDB4MTAwMCA8PCA4KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLQkJCU1hY1JlZyB8PSAocEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkIDw8IDgpOwotICAgICAgICB9Ci0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9SVFNfQ0ZHLCBNYWNSZWcpOwotCi0JLy8gSW5pdGlhbCBjb21tb24gcHJvdGVjdGlvbiBzZXR0aW5ncwotCVJUTVBaZXJvTWVtb3J5KFByb3RlY3QsIHNpemVvZihQcm90ZWN0KSk7Ci0JUHJvdENmZzQud29yZCA9IDA7Ci0JUHJvdENmZy53b3JkID0gMDsKLQlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0dGNDAgPSAxOwotCVByb3RDZmcuZmllbGQuVHhvcEFsbG93R0YyMCA9IDE7Ci0JUHJvdENmZy5maWVsZC5UeG9wQWxsb3dNTTQwID0gMTsKLQlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd01NMjAgPSAxOwotCVByb3RDZmcuZmllbGQuVHhvcEFsbG93T2ZkbSA9IDE7Ci0JUHJvdENmZy5maWVsZC5UeG9wQWxsb3dDY2sgPSAxOwotCVByb3RDZmcuZmllbGQuUlRTVGhFbiA9IDE7Ci0JUHJvdENmZy5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKLQotCS8vIHVwZGF0ZSBQSFkgbW9kZSBhbmQgcmF0ZQotCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCi0JCVByb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgPSAweDQwMDA7Ci0JUHJvdENmZy5maWVsZC5Qcm90ZWN0UmF0ZSB8PSBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlOwotCi0JLy8gSGFuZGxlIGxlZ2FjeShCL0cpIHByb3RlY3Rpb24KLQlpZiAoYkRpc2FibGVCR1Byb3RlY3QpCi0JewotCQkvL1Byb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlOwotCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gMDsKLQkJUHJvdGVjdFswXSA9IFByb3RDZmcud29yZDsKLQkJUHJvdGVjdFsxXSA9IFByb3RDZmcud29yZDsKLQkJcEFkLT5GbGdDdHNFbmFibGVkID0gMDsgLyogQ1RTLXNlbGYgaXMgbm90IHVzZWQgKi8KLQl9Ci0JZWxzZQotCXsKLQkJLy9Qcm90Q2ZnLmZpZWxkLlByb3RlY3RSYXRlID0gcEFkLT5Db21tb25DZmcuUnRzUmF0ZTsKLQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IDA7CQkJLy8gQ0NLIGRvIG5vdCBuZWVkIHRvIGJlIHByb3RlY3RlZAotCQlQcm90ZWN0WzBdID0gUHJvdENmZy53b3JkOwotCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19DVFM7CS8vIE9GRE0gbmVlZHMgdXNpbmcgQ0NLIHRvIHByb3RlY3QKLQkJUHJvdGVjdFsxXSA9IFByb3RDZmcud29yZDsKLQkJcEFkLT5GbGdDdHNFbmFibGVkID0gMTsgLyogQ1RTLXNlbGYgaXMgdXNlZCAqLwotCX0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCS8vIERlY2lkZSBIVCBmcmFtZSBwcm90ZWN0aW9uLgotCWlmICgoU2V0TWFzayAmIEFMTE5fU0VUUFJPVEVDVCkgIT0gMCkKLQl7Ci0JCXN3aXRjaChPcGVyYXRpb25Nb2RlKQotCQl7Ci0JCQljYXNlIDB4MDoKLQkJCQkvLyBOTyBQUk9URUNUCi0JCQkJLy8gMS5BbGwgU1RBcyBpbiB0aGUgQlNTIGFyZSAyMC80MCBNSHogSFQKLQkJCQkvLyAyLiBpbiBhaSAyMC80ME1IeiBCU1MKLQkJCQkvLyAzLiBhbGwgU1RBcyBhcmUgMjBNSHogaW4gYSAyME1IeiBCU1MKLQkJCQkvLyBQdXJlIEhULiBubyBwcm90ZWN0aW9uLgotCi0JCQkJLy8gTU0yMF9QUk9UX0NGRwotCQkJCS8vCVJlc2VydmVkICgzMToyNykKLQkJCQkvLwlQUk9UX1RYT1AoMjU6MjApIC0tIDAxMDExMQotCQkJCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQotCQkJCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQotCQkJCS8vCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkKLQkJCQlQcm90ZWN0WzJdID0gMHgwMTc0NDAwNDsKLQotCQkJCS8vIE1NNDBfUFJPVF9DRkcKLQkJCQkvLwlSZXNlcnZlZCAoMzE6MjcpCi0JCQkJLy8JUFJPVF9UWE9QKDI1OjIwKSAtLSAxMTExMTEKLQkJCQkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKLQkJCQkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKLQkJCQkvLwlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDA4NCAoZHVwbGljYXRlIE9GRE0gMjRNKQotCQkJCVByb3RlY3RbM10gPSAweDAzZjQ0MDg0OwotCi0JCQkJLy8gQ0YyMF9QUk9UX0NGRwotCQkJCS8vCVJlc2VydmVkICgzMToyNykKLQkJCQkvLwlQUk9UX1RYT1AoMjU6MjApIC0tIDAxMDExMQotCQkJCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQotCQkJCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQotCQkJCS8vCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkKLQkJCQlQcm90ZWN0WzRdID0gMHgwMTc0NDAwNDsKLQotCQkJCS8vIENGNDBfUFJPVF9DRkcKLQkJCQkvLwlSZXNlcnZlZCAoMzE6MjcpCi0JCQkJLy8JUFJPVF9UWE9QKDI1OjIwKSAtLSAxMTExMTEKLQkJCQkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKLQkJCQkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKLQkJCQkvLwlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDA4NCAoZHVwbGljYXRlIE9GRE0gMjRNKQotCQkJCVByb3RlY3RbNV0gPSAweDAzZjQ0MDg0OwotCi0JCQkJaWYgKGJOb25HRkV4aXN0KQotCQkJCXsKLQkJCQkJLy8gUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3RpaW9uKQotCQkJCQkvLyBQUk9UX0NUUkwoMTc6MTYpIC0tIDAxIChSVFMvQ1RTKQotCQkJCQlQcm90ZWN0WzRdID0gMHgwMTc1NDAwNDsKLQkJCQkJUHJvdGVjdFs1XSA9IDB4MDNmNTQwODQ7Ci0JCQkJfQotCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBGQUxTRTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSAxOgotCQkJCS8vIFRoaXMgaXMgIkhUIG5vbi1tZW1iZXIgcHJvdGVjdGlvbiBtb2RlLiIKLQkJCQkvLyBJZiB0aGVyZSBtYXkgYmUgbm9uLUhUIFNUQXMgbXkgQlNTCi0JCQkJUHJvdENmZy53b3JkID0gMHgwMTc0NDAwNDsJLy8gUFJPVF9DVFJMKDE3OjE2KSA6IDAgKE5vbmUpCi0JCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDQwODQ7IC8vIGR1cGxpY2FldCBsZWdhY3kgMjRNLiBCVyBzZXQgMS4KLQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCkpCi0JCQkJewotCQkJCQlQcm90Q2ZnLndvcmQgPSAweDAxNzQwMDAzOwkvL0VSUCB1c2UgUHJvdGVjdGlvbiBiaXQgaXMgc2V0LCB1c2UgcHJvdGVjdGlvbiByYXRlIGF0IENsYXVzZSAxOC4uCi0JCQkJCVByb3RDZmc0LndvcmQgPSAweDAzZjQwMDAzOyAvLyBEb24ndCBkdXBsaWNhdGUgUlRTL0NUUyBpbiBDQ0sgbW9kZS4gMHgwM2Y0MDA4MzsKLQkJCQl9Ci0JCQkJLy9Bc3NpZ24gUHJvdGVjdGlvbiBtZXRob2QgZm9yIDIwJjQwIE1IeiBwYWNrZXRzCi0JCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOwotCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7Ci0JCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKLQkJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKLQkJCQlQcm90ZWN0WzJdID0gUHJvdENmZy53b3JkOwotCQkJCVByb3RlY3RbM10gPSBQcm90Q2ZnNC53b3JkOwotCQkJCVByb3RlY3RbNF0gPSBQcm90Q2ZnLndvcmQ7Ci0JCQkJUHJvdGVjdFs1XSA9IFByb3RDZmc0LndvcmQ7Ci0JCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IFRSVUU7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgMjoKLQkJCQkvLyBJZiBvbmx5IEhUIFNUQXMgYXJlIGluIEJTUy4gYXQgbGVhc3Qgb25lIGlzIDIwTUh6LiBPbmx5IHByb3RlY3QgNDBNSHogcGFja2V0cwotCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDQwMDQ7ICAvLyBQUk9UX0NUUkwoMTc6MTYpIDogMCAoTm9uZSkKLQkJCQlQcm90Q2ZnNC53b3JkID0gMHgwM2Y0NDA4NDsgLy8gZHVwbGljYWV0IGxlZ2FjeSAyNE0uIEJXIHNldCAxLgotCi0JCQkJLy9Bc3NpZ24gUHJvdGVjdGlvbiBtZXRob2QgZm9yIDQwTUh6IHBhY2tldHMKLQkJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOwotCQkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOwotCQkJCVByb3RlY3RbMl0gPSBQcm90Q2ZnLndvcmQ7Ci0JCQkJUHJvdGVjdFszXSA9IFByb3RDZmc0LndvcmQ7Ci0JCQkJaWYgKGJOb25HRkV4aXN0KQotCQkJCXsKLQkJCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOwotCQkJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOwotCQkJCX0KLQkJCQlQcm90ZWN0WzRdID0gUHJvdENmZy53b3JkOwotCQkJCVByb3RlY3RbNV0gPSBQcm90Q2ZnNC53b3JkOwotCi0JCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IEZBTFNFOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIDM6Ci0JCQkJLy8gSFQgbWl4ZWQgbW9kZS4JIFBST1RFQ1QgQUxMIQotCQkJCS8vIEFzc2lnbiBSYXRlCi0JCQkJUHJvdENmZy53b3JkID0gMHgwMTc0NDAwNDsJLy9kdXBsaWNhZXQgbGVnYWN5IDI0TS4gQlcgc2V0IDEuCi0JCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDQwODQ7Ci0JCQkJLy8gYm90aCAyME1IeiBhbmQgNDBNSHogYXJlIHByb3RlY3RlZC4gV2hldGhlciB1c2UgUlRTIG9yIENUUy10by1zZWxmIGRlcGVuZHMgb24gdGhlCi0JCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpKQotCQkJCXsKLQkJCQkJUHJvdENmZy53b3JkID0gMHgwMTc0MDAwMzsJLy9FUlAgdXNlIFByb3RlY3Rpb24gYml0IGlzIHNldCwgdXNlIHByb3RlY3Rpb24gcmF0ZSBhdCBDbGF1c2UgMTguLgotCQkJCQlQcm90Q2ZnNC53b3JkID0gMHgwM2Y0MDAwMzsgLy8gRG9uJ3QgZHVwbGljYXRlIFJUUy9DVFMgaW4gQ0NLIG1vZGUuIDB4MDNmNDAwODMKLQkJCQl9Ci0JCQkJLy9Bc3NpZ24gUHJvdGVjdGlvbiBtZXRob2QgZm9yIDIwJjQwIE1IeiBwYWNrZXRzCi0JCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOwotCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7Ci0JCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKLQkJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKLQkJCQlQcm90ZWN0WzJdID0gUHJvdENmZy53b3JkOwotCQkJCVByb3RlY3RbM10gPSBQcm90Q2ZnNC53b3JkOwotCQkJCVByb3RlY3RbNF0gPSBQcm90Q2ZnLndvcmQ7Ci0JCQkJUHJvdGVjdFs1XSA9IFByb3RDZmc0LndvcmQ7Ci0JCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IFRSVUU7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgODoKLQkJCQkvLyBTcGVjaWFsIG9uIGZvciBBdGhlcm9zIHByb2JsZW0gbiBjaGlwLgotCQkJCVByb3RlY3RbMl0gPSAweDAxNzU0MDA0OwotCQkJCVByb3RlY3RbM10gPSAweDAzZjU0MDg0OwotCQkJCVByb3RlY3RbNF0gPSAweDAxNzU0MDA0OwotCQkJCVByb3RlY3RbNV0gPSAweDAzZjU0MDg0OwotCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBUUlVFOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0Jb2Zmc2V0ID0gQ0NLX1BST1RfQ0ZHOwotCWZvciAoaSA9IDA7aSA8IDY7aSsrKQotCXsKLQkJCWlmICgoU2V0TWFzayAmICgxPDwgaSkpKQotCQl7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCArIGkqNCwgUHJvdGVjdFtpXSk7Ci0JfQotfQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNTd2l0Y2hDaGFubmVsKAotCQkJCQkgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVDSEFSCQkJQ2hhbm5lbCwKLQlJTglCT09MRUFOCQkJYlNjYW4pCi17Ci0JVUxPTkcJCQlSMiA9IDAsIFIzID0gREVGQVVMVF9SRl9UWF9QT1dFUiwgUjQgPSAwOwotCUNIQVIgICAgVHhQd2VyID0gMCwgVHhQd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7IC8vQmJwOTQgPSBCQlBSOTRfREVGQVVMVCwgVHhQd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JVUNIQVIJaW5kZXg7Ci0JVUlOVDMyCVZhbHVlID0gMDsgLy9CYnBSZWcsIFZhbHVlOwotCVJUTVBfUkZfUkVHUyAqUkZSZWdUYWJsZTsKLQlVQ0hBUglSRlZhbHVlOwotCi0JUkZWYWx1ZSA9IDA7Ci0JLy8gU2VhcmNoIFR4IHBvd2VyIHZhbHVlCi0JLy8gV2UgY2FuJ3QgdXNlIENoYW5uZWxMaXN0IHRvIHNlYXJjaCBjaGFubmVsLCBzaW5jZSBzb21lIGNlbnRyYWwgY2hhbm5sJ3MgdHhwb3dyIGRvZXNuJ3QgbGlzdAotCS8vIGluIENoYW5uZWxMaXN0LCBzbyB1c2UgVHhQb3dlciBhcnJheSBpbnN0ZWFkLgotCS8vCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUFYX05VTV9PRl9DSEFOTkVMUzsgaW5kZXgrKykKLQl7Ci0JCWlmIChDaGFubmVsID09IHBBZC0+VHhQb3dlcltpbmRleF0uQ2hhbm5lbCkKLQkJewotCQkJVHhQd2VyID0gcEFkLT5UeFBvd2VyW2luZGV4XS5Qb3dlcjsKLQkJCVR4UHdlcjIgPSBwQWQtPlR4UG93ZXJbaW5kZXhdLlBvd2VyMjsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKGluZGV4ID09IE1BWF9OVU1fT0ZfQ0hBTk5FTFMpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBc2ljU3dpdGNoQ2hhbm5lbDogQ2FuJ3QgZmluZCB0aGUgQ2hhbm5lbCMlZCBcbiIsIENoYW5uZWwpKTsKLQl9Ci0KLSNpZmRlZiBSVDMweHgKLQkvLyBUaGUgUkYgcHJvZ3JhbW1pbmcgc2VxdWVuY2UgaXMgZGlmZmVyZW5jZSBiZXR3ZWVuIDN4eHggYW5kIDJ4eHgKLQlpZiAoKElTX1JUMzA3MChwQWQpIHx8IElTX1JUMzA5MChwQWQpfHxJU19SVDMzOTAocEFkKSkgJiYgKChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMCkgfHwgKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18yMDIwKSB8fAotCQkocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjEpIHx8IChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMikpKQotCXsKLQkJLyogbW9kaWZ5IGJ5IFdZIGZvciBSZWFkIFJGIFJlZy4gZXJyb3IgKi8KLQotCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMzAyMF9DSE5MOyBpbmRleCsrKQotCQl7Ci0JCQlpZiAoQ2hhbm5lbCA9PSBGcmVxSXRlbXMzMDIwW2luZGV4XS5DaGFubmVsKQotCQkJewotCQkJCS8vIFByb2dyYW1taW5nIGNoYW5uZWwgcGFyYW1ldGVycwotCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwMiwgRnJlcUl0ZW1zMzAyMFtpbmRleF0uTik7Ci0JCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjAzLCBGcmVxSXRlbXMzMDIwW2luZGV4XS5LKTsKLQkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNiwgJlJGVmFsdWUpOwotCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmIDB4RkMpIHwgRnJlcUl0ZW1zMzAyMFtpbmRleF0uUjsKLQkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDYsIFJGVmFsdWUpOwotCi0JCQkJLy8gU2V0IFR4MCBQb3dlcgotCQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjEyLCAmUkZWYWx1ZSk7Ci0JCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgMHhFMCkgfCBUeFB3ZXI7Ci0JCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjEyLCBSRlZhbHVlKTsKLQotCQkJCS8vIFNldCBUeDEgUG93ZXIKLQkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IxMywgJlJGVmFsdWUpOwotCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmIDB4RTApIHwgVHhQd2VyMjsKLQkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMTMsIFJGVmFsdWUpOwotCi0JCQkJLy8gVHgvUnggU3RyZWFtIHNldHRpbmcKLQkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgJlJGVmFsdWUpOwotCQkJCS8vaWYgKElTX1JUMzA5MChwQWQpKQotCQkJCS8vCVJGVmFsdWUgfD0gMHgwMTsgLy8gRW5hYmxlIFJGIGJsb2NrLgotCQkJCVJGVmFsdWUgJj0gMHgwMzsJLy9jbGVhciBiaXRbN34yXQotCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCi0JCQkJCVJGVmFsdWUgfD0gMHhBMDsKLQkJCQllbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpCi0JCQkJCVJGVmFsdWUgfD0gMHg4MDsKLQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQotCQkJCQlSRlZhbHVlIHw9IDB4NTA7Ci0JCQkJZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQotCQkJCQlSRlZhbHVlIHw9IDB4NDA7Ci0JCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCBSRlZhbHVlKTsKLQotCQkJCS8vIFNldCBSRiBvZmZzZXQKLQkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMywgJlJGVmFsdWUpOwotCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmIDB4ODApIHwgcEFkLT5SZkZyZXFPZmZzZXQ7Ci0JCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIzLCBSRlZhbHVlKTsKLQotCQkJCS8vIFNldCBCVwotCQkJCWlmICghYlNjYW4gJiYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkpCi0JCQkJewotCQkJCQlSRlZhbHVlID0gcEFkLT5NbG1lLkNhbGlCVzQwUmZSMjQ7Ci0JCQkJCS8vRElTQUJMRV8xMU5fQ0hFQ0socEFkKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJUkZWYWx1ZSA9IHBBZC0+TWxtZS5DYWxpQlcyMFJmUjI0OwotCQkJCX0KLQkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjQsIFJGVmFsdWUpOwotCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMSwgUkZWYWx1ZSk7Ci0KLQkJCQkvLyBFbmFibGUgUkYgdHVuaW5nCi0JCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsICZSRlZhbHVlKTsKLQkJCQlSRlZhbHVlID0gUkZWYWx1ZSB8IDB4MTsKLQkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsIFJGVmFsdWUpOwotCi0JCQkJLy8gbGF0Y2ggY2hhbm5lbCBmb3IgZnV0dXJlIHVzYWdlLgotCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA9IENoYW5uZWw7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3dpdGNoQ2hhbm5lbCMlZChSRj0lZCwgUHdyMD0lZCwgUHdyMT0lZCwgJWRUKSwgTj0weCUwMlgsIEs9MHglMDJYLCBSPTB4JTAyWFxuIiwKLQkJCUNoYW5uZWwsCi0JCQlwQWQtPlJmSWNUeXBlLAotCQkJVHhQd2VyLAotCQkJVHhQd2VyMiwKLQkJCXBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGgsCi0JCQlGcmVxSXRlbXMzMDIwW2luZGV4XS5OLAotCQkJRnJlcUl0ZW1zMzAyMFtpbmRleF0uSywKLQkJCUZyZXFJdGVtczMwMjBbaW5kZXhdLlIpKTsKLQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCWVsc2UKLSNlbmRpZiAvLyBSVDMweHggLy8KLQl7Ci0JCVJGUmVnVGFibGUgPSBSRjI4NTBSZWdUYWJsZTsKLQkJc3dpdGNoIChwQWQtPlJmSWNUeXBlKQotCQl7Ci0JCQljYXNlIFJGSUNfMjgyMDoKLQkJCWNhc2UgUkZJQ18yODUwOgotCQkJY2FzZSBSRklDXzI3MjA6Ci0JCQljYXNlIFJGSUNfMjc1MDoKLQotCQkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl8yODUwX0NITkw7IGluZGV4KyspCi0JCQkJewotCQkJCQlpZiAoQ2hhbm5lbCA9PSBSRlJlZ1RhYmxlW2luZGV4XS5DaGFubmVsKQotCQkJCQl7Ci0JCQkJCQlSMiA9IFJGUmVnVGFibGVbaW5kZXhdLlIyOwotCQkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKLQkJCQkJCXsKLQkJCQkJCQlSMiB8PSAweDQwMDA7CS8vIElmIFRYcGF0aCBpcyAxLCBiaXQgMTQgPSAxOwotCQkJCQkJfQotCi0JCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQotCQkJCQkJewotCQkJCQkJCVIyIHw9IDB4NDA7CS8vIHdyaXRlIDEgdG8gb2ZmIFJ4cGF0aC4KLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKLQkJCQkJCXsKLQkJCQkJCQlSMiB8PSAweDIwMDQwOwkvLyB3cml0ZSAxIHRvIG9mZiBSeFBhdGgKLQkJCQkJCX0KLQotCQkJCQkJaWYgKENoYW5uZWwgPiAxNCkKLQkJCQkJCXsKLQkJCQkJCQkvLyBpbml0aWFsaXplIFIzLCBSNAotCQkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmZmYzFmZik7Ci0JCQkJCQkJUjQgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjQgJiAofjB4MDAxZjg3YzApKSB8IChwQWQtPlJmRnJlcU9mZnNldCA8PCAxNSk7Ci0KLQkJCQkJCQkvLyA1RyBiYW5kIHBvd2VyIHJhbmdlOiAweEY5fjBYMEYsIFRYMCBSZWczIGJpdDkvVFgxIFJlZzQgYml0Nj0iMCIgbWVhbnMgdGhlIFRYIHBvd2VyIHJlZHVjZSA3ZEIKLQkJCQkJCQkvLyBSMwotCQkJCQkJCWlmICgoVHhQd2VyID49IC03KSAmJiAoVHhQd2VyIDwgMCkpCi0JCQkJCQkJewotCQkJCQkJCQlUeFB3ZXIgPSAoNytUeFB3ZXIpOwotCQkJCQkJCQlUeFB3ZXIgPSAoVHhQd2VyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcik7Ci0JCQkJCQkJCVIzIHw9IChUeFB3ZXIgPDwgMTApOwotCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBc2ljU3dpdGNoQ2hhbm5lbDogVHhQd2VyPSVkIFxuIiwgVHhQd2VyKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UKLQkJCQkJCQl7Ci0JCQkJCQkJCVR4UHdlciA9IChUeFB3ZXIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyKTsKLQkJCQkJCQkJUjMgfD0gKFR4UHdlciA8PCAxMCkgfCAoMSA8PCA5KTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQkvLyBSNAotCQkJCQkJCWlmICgoVHhQd2VyMiA+PSAtNykgJiYgKFR4UHdlcjIgPCAwKSkKLQkJCQkJCQl7Ci0JCQkJCQkJCVR4UHdlcjIgPSAoNytUeFB3ZXIyKTsKLQkJCQkJCQkJVHhQd2VyMiA9IChUeFB3ZXIyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcjIpOwotCQkJCQkJCQlSNCB8PSAoVHhQd2VyMiA8PCA3KTsKLQkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQXNpY1N3aXRjaENoYW5uZWw6IFR4UHdlcjI9JWQgXG4iLCBUeFB3ZXIyKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UKLQkJCQkJCQl7Ci0JCQkJCQkJCVR4UHdlcjIgPSAoVHhQd2VyMiA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIyKTsKLQkJCQkJCQkJUjQgfD0gKFR4UHdlcjIgPDwgNykgfCAoMSA8PCA2KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJUjMgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjMgJiAweGZmZmZjMWZmKSB8IChUeFB3ZXIgPDwgOSk7IC8vIHNldCBUWCBwb3dlcjAKLQkJCQkJCVI0ID0gKFJGUmVnVGFibGVbaW5kZXhdLlI0ICYgKH4weDAwMWY4N2MwKSkgfCAocEFkLT5SZkZyZXFPZmZzZXQgPDwgMTUpIHwgKFR4UHdlcjIgPDw2KTsvLyBTZXQgZnJlcSBPZmZzZXQgJiBUeFB3cjEKLQkJCQkJCX0KLQotCQkJCQkJLy8gQmFzZWQgb24gQkJQIGN1cnJlbnQgbW9kZSBiZWZvcmUgY2hhbmdpbmcgUkYgY2hhbm5lbC4KLQkJCQkJCWlmICghYlNjYW4gJiYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkpCi0JCQkJCQl7Ci0JCQkJCQkJUjQgfD0weDIwMDAwMDsKLQkJCQkJCX0KLQotCQkJCQkJLy8gVXBkYXRlIHZhcmlhYmxlcwotCQkJCQkJcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID0gQ2hhbm5lbDsKLQkJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjEgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMTsKLQkJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjIgPSBSMjsKLQkJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSBSMzsKLQkJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSNDsKLQotI2lmZGVmIERGU19ERUJVRwotI2lmZGVmIERGU19GQ0NfQlc0MF9GSVgKLQkJCQkJCWlmIChwQWQtPmluZlR5cGUgPT0gUlRNUF9ERVZfSU5GX1BDSSkgLy8gUlQyODgwIFBDSQotCQkJCQkJewotCQkJCQkJCS8qIG9ubHkgZm9yIFJUMjg4MCAqLwotCQkJCQkJCS8vIEZDQyBERlMgdGVzdAotCQkJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjEgfD0gMHgxMDA7Ci0JCQkJCQkJcEFkLT5MYXRjaFJmUmVncy5SNCB8PSAweDAwNDAwMDAwOwotCQkJCQkJfQotI2VuZGlmIC8vIERGU19GQ0NfQlc0MF9GSVggLy8KLSNlbmRpZiAvLyBERlNfREVCVUcgLy8KLQotCQkJCQkJLy8gU2V0IFJGIHZhbHVlIDEncyBzZXQgUjNbYml0Ml0gPSBbMF0KLQkJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOwotCQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMik7Ci0JCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCAocEFkLT5MYXRjaFJmUmVncy5SMyAmICh+MHgwNCkpKTsKLQkJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOwotCi0JCQkJCQlSVE1QdXNlY0RlbGF5KDIwMCk7Ci0KLQkJCQkJCS8vIFNldCBSRiB2YWx1ZSAyJ3Mgc2V0IFIzW2JpdDJdID0gWzFdCi0JCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKLQkJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOwotCQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgfCAweDA0KSk7Ci0JCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKLQotCQkJCQkJUlRNUHVzZWNEZWxheSgyMDApOwotCi0JCQkJCQkvLyBTZXQgUkYgdmFsdWUgMydzIHNldCBSM1tiaXQyXSA9IFswXQotCQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMSk7Ci0JCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKLQkJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIChwQWQtPkxhdGNoUmZSZWdzLlIzICYgKH4weDA0KSkpOwotCQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SNCk7Ci0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3dpdGNoQ2hhbm5lbCMlZChSRj0lZCwgUHdyMD0lbHUsIFB3cjE9JWx1LCAlZFQpIHRvICwgUjE9MHglMDhseCwgUjI9MHglMDhseCwgUjM9MHglMDhseCwgUjQ9MHglMDhseFxuIiwKLQkJCQkJCQkgIENoYW5uZWwsCi0JCQkJCQkJICBwQWQtPlJmSWNUeXBlLAotCQkJCQkJCSAgKFIzICYgMHgwMDAwM2UwMCkgPj4gOSwKLQkJCQkJCQkgIChSNCAmIDB4MDAwMDA3YzApID4+IDYsCi0JCQkJCQkJICBwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoLAotCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMSwKLQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjIsCi0JCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIzLAotCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SNCkpOwotCX0KLQotCS8vIENoYW5nZSBCQlAgc2V0dGluZyBkdXJpbmcgc2l3dGNoIGZyb20gYS0+ZywgZy0+YQotCWlmIChDaGFubmVsIDw9IDE0KQotCXsKLQkJVUxPTkcJVHhQaW5DZmcgPSAweDAwMDUwRjBBOy8vR2FyeSAyMDA3LzA4LzA5IDB4MDUwQTBBCi0KLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjIsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjMsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjQsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODYsIDApOy8vKDB4NDQgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOwkvLyBBY2NvcmRpbmcgdGhlIFJvcnkncyBzdWdnZXN0aW9uIHRvIHNvbHZlIHRoZSBtaWRkbGUgcmFuZ2UgaXNzdWUuCi0JCS8vUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4NjIpOwotCi0JCS8vIFJ4IEhpZ2ggcG93ZXIgVkdBIG9mZnNldCBmb3IgTE5BIHNlbGVjdAotCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yRykKLQkJewotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4NjIpOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzUsIDB4NDYpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4ODQpOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzUsIDB4NTApOwotCQl9Ci0KLQkJLy8gNUcgYmFuZCBzZWxlY3Rpb24gUElOLCBiaXQxIGFuZCBiaXQyIGFyZSBjb21wbGVtZW50Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZWYWx1ZSk7Ci0JCVZhbHVlICY9ICh+MHg2KTsKLQkJVmFsdWUgfD0gKDB4MDQpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgVmFsdWUpOwotCi0JCS8vIFR1cm4gb2ZmIHVudXNlZCBQQSBvciBMTkEgd2hlbiBvbmx5IDFUIG9yIDFSCi0JCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCi0JCXsKLQkJCVR4UGluQ2ZnICY9IDB4RkZGRkZGRjM7Ci0JCX0KLQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKLQkJewotCQkJVHhQaW5DZmcgJj0gMHhGRkZGRjNGRjsKLQkJfQotCi0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUElOX0NGRywgVHhQaW5DZmcpOwotCi0jaWYgZGVmaW5lZChSVDMwOTApIHx8IGRlZmluZWQoUlQzMzkwKQotCQkvLyBQQ0llIFBIWSBUcmFuc21pdCBhdHRlbnVhdGlvbiBhZGp1c3RtZW50Ci0JCWlmIChJU19SVDMwOTBBKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpCi0JCXsKLQkJCVRYX0FUVEVOVUFUSU9OX0NUUkxfU1RSVUMgVHhBdHRlbnVhdGlvbkN0cmwgPSB7MH07Ci0KLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgUENJRV9QSFlfVFhfQVRURU5VQVRJT05fQ1RSTCwgJlR4QXR0ZW51YXRpb25DdHJsLndvcmQpOwotCi0JCQlpZiAoQ2hhbm5lbCA9PSAxNCkgLy8gQ2hhbm5lbCAjMTQKLQkJCXsKLQkJCQlUeEF0dGVudWF0aW9uQ3RybC5maWVsZC5QQ0lFX1BIWV9UWF9BVFRFTl9FTiA9IDE7IC8vIEVuYWJsZSBQQ0llIFBIWSBUeCBhdHRlbnVhdGlvbgotCQkJCVR4QXR0ZW51YXRpb25DdHJsLmZpZWxkLlBDSUVfUEhZX1RYX0FUVEVOX1ZBTFVFID0gNDsgLy8gOS8xNiBmdWxsIGRyaXZlIGxldmVsCi0JCQl9Ci0JCQllbHNlIC8vIENoYW5uZWwgIzF+IzEzCi0JCQl7Ci0JCQkJVHhBdHRlbnVhdGlvbkN0cmwuZmllbGQuUENJRV9QSFlfVFhfQVRURU5fRU4gPSAwOyAvLyBEaXNhYmxlIFBDSWUgUEhZIFR4IGF0dGVudWF0aW9uCi0JCQkJVHhBdHRlbnVhdGlvbkN0cmwuZmllbGQuUENJRV9QSFlfVFhfQVRURU5fVkFMVUUgPSAwOyAvLyBuL2EKLQkJCX0KLQotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgUENJRV9QSFlfVFhfQVRURU5VQVRJT05fQ1RSTCwgVHhBdHRlbnVhdGlvbkN0cmwud29yZCk7Ci0JCX0KLSNlbmRpZgotCX0KLQllbHNlCi0JewotCQlVTE9ORwlUeFBpbkNmZyA9IDB4MDAwNTBGMDU7Ly9HYXJ5IDIwMDcvOC85IDB4MDUwNTA1Ci0KLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjIsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjMsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjQsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODYsIDApOy8vKDB4NDQgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOyAgIC8vIEFjY29yZGluZyB0aGUgUm9yeSdzIHN1Z2dlc3Rpb24gdG8gc29sdmUgdGhlIG1pZGRsZSByYW5nZSBpc3N1ZS4KLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweEYyKTsKLQotCQkvLyBSeCBIaWdoIHBvd2VyIFZHQSBvZmZzZXQgZm9yIExOQSBzZWxlY3QKLQkJaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckEpCi0JCXsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjc1LCAweDQ2KTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjc1LCAweDUwKTsKLQkJfQotCi0JCS8vIDVHIGJhbmQgc2VsZWN0aW9uIFBJTiwgYml0MSBhbmQgYml0MiBhcmUgY29tcGxlbWVudAotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOwotCQlWYWx1ZSAmPSAofjB4Nik7Ci0JCVZhbHVlIHw9ICgweDAyKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIFZhbHVlKTsKLQotCQkvLyBUdXJuIG9mZiB1bnVzZWQgUEEgb3IgTE5BIHdoZW4gb25seSAxVCBvciAxUgotCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQotCQl7Ci0JCQlUeFBpbkNmZyAmPSAweEZGRkZGRkYzOwotCQl9Ci0JCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCi0JCXsKLQkJCVR4UGluQ2ZnICY9IDB4RkZGRkYzRkY7Ci0JCX0KLQotCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKLQotCX0KLQotCS8vIFI2NiBzaG91bGQgYmUgc2V0IGFjY29yZGluZyB0byBDaGFubmVsIGFuZCB1c2UgMjBNSHogd2hlbiBzY2FubmluZwotCS8vUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsICgweDJFICsgR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQlpZiAoYlNjYW4pCi0JCVJUTVBTZXRBR0NJbml0VmFsdWUocEFkLCBCV18yMCk7Ci0JZWxzZQotCQlSVE1QU2V0QUdDSW5pdFZhbHVlKHBBZCwgcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXKTsKLQotCS8vCi0JLy8gT24gMTFBLCBXZSBzaG91bGQgZGVsYXkgYW5kIHdhaXQgUkYvQkJQIHRvIGJlIHN0YWJsZQotCS8vIGFuZCB0aGUgYXBwcm9wcmlhdGUgdGltZSBzaG91bGQgYmUgMTAwMCBtaWNybyBzZWNvbmRzCi0JLy8gMjAwNS8wNi8wNSAtIE9uIDExRywgV2UgYWxzbyBuZWVkIHRoaXMgZGVsYXkgdGltZS4gT3RoZXJ3aXNlIGl0J3MgZGlmZmljdWx0IHRvIHBhc3MgdGhlIFdIUUwuCi0JLy8KLQlSVE1QdXNlY0RlbGF5KDEwMDApOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIDI0MjEgb25seSwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBkdXJpbmcKLQkJc2l0ZSBzdXJ2ZXkuIEl0J3Mgb25seSByZXF1aXJlZCBhZnRlciBOSUMgZGVjaWRlZCB0byBzdGF5IGF0IGEgY2hhbm5lbAotCQlmb3IgYSBsb25nZXIgcGVyaW9kLgotCQlXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBpdCdzIGFsd2F5cyBhZnRlciBBc2ljU3dpdGNoQ2hhbm5lbCgpLgotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXNpY0xvY2tDaGFubmVsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSIENoYW5uZWwpCi17Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi0jaWZkZWYgQU5UX0RJVkVSU0lUWV9TVVBQT1JUCi1WT0lECUFzaWNBbnRlbm5hU2VsZWN0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJQ2hhbm5lbCkKLXsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCWlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDIgPT0gMSkKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQl7Ci0JCS8vIHBhdGNoIGZvciBBc2ljU2V0UnhBbnQgZmFpbGVkCi0JCXBBZC0+UnhBbnQuRXZhbHVhdGVQZXJpb2QgPSAwOwotCi0JCS8vIGNoZWNrIGV2ZXJ5IDIgc2Vjb25kLiBJZiByY3YtYmVhY29uIGxlc3MgdGhhbiA1IGluIHRoZSBwYXN0IDIgc2Vjb25kLCB0aGVuIEF2Z1JTU0kgaXMgbm8gbG9uZ2VyIGEKLQkJLy8gdmFsaWQgaW5kaWNhdGlvbiBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGlzIEFQIGFuZCBpdHMgY2xpZW50cy4KLQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJewotCQkJU0hPUlQJcmVhbGF2Z3Jzc2kxOwotCi0JCQkvLyBpZiBubyB0cmFmZmljIHRoZW4gcmVzZXQgYXZlcmFnZSByc3NpIHRvIHRyaWdnZXIgZXZhbHVhdGlvbgotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkJaWYgKHBBZC0+U3RhQ2ZnLk51bU9mQXZnUnNzaVNhbXBsZSA8IDUpCi0JCQl7Ci0JCQkJcEFkLT5SeEFudC5QYWlyMUxhc3RBdmdSc3NpID0gKC05OSk7Ci0JCQkJcEFkLT5SeEFudC5QYWlyMkxhc3RBdmdSc3NpID0gKC05OSk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVBlcmlvZGljRXhlYzogbm8gdHJhZmZpYy9iZWFjb24sIHJlc2V0IFJTU0lcbiIpKTsKLQkJCX0KLQotCQkJcEFkLT5TdGFDZmcuTnVtT2ZBdmdSc3NpU2FtcGxlID0gMDsKLQkJCXJlYWxhdmdyc3NpMSA9IChwQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVtwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50XSA+PiAzKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBbnQtcmVhbHJzc2kwKCVkKSwgTGFzdHJzc2kwKCVkKSwgRXZhbHVhdGVTdGFibGVDbnQ9JWRcbiIsIHJlYWxhdmdyc3NpMSwgcEFkLT5SeEFudC5QYWlyMUxhc3RBdmdSc3NpLCBwQWQtPlJ4QW50LkV2YWx1YXRlU3RhYmxlQ250KSk7Ci0KLQkJCS8vIGlmIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHJzc2kgaXMgbGFyZ2VyIG9yIGxlc3MgdGhhbiA1LCB0aGVuIGV2YWx1YXRlIHRoZSBvdGhlciBhbnRlbm5hCi0JCQlpZiAoKHBBZC0+UnhBbnQuRXZhbHVhdGVTdGFibGVDbnQgPCAyKSB8fCAocmVhbGF2Z3Jzc2kxID4gKHBBZC0+UnhBbnQuUGFpcjFMYXN0QXZnUnNzaSArIDUpKSB8fCAocmVhbGF2Z3Jzc2kxIDwgKHBBZC0+UnhBbnQuUGFpcjFMYXN0QXZnUnNzaSAtIDUpKSkKLQkJCQlBc2ljRXZhbHVhdGVSeEFudChwQWQpOwotCi0JCQkJcEFkLT5SeEFudC5QYWlyMUxhc3RBdmdSc3NpID0gcmVhbGF2Z3Jzc2kxOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gaWYgbm90IGNvbm5lY3RlZCwgYWx3YXlzIHN3aXRjaCBhbnRlbm5hIHRvIHRyeSB0byBjb25uZWN0Ci0JCQlVQ0hBUgl0ZW1wOwotCi0JCQl0ZW1wID0gcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudDsKLQkJCXBBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQgPSBwQWQtPlJ4QW50LlBhaXIxU2Vjb25kYXJ5UnhBbnQ7Ci0JCQlwQWQtPlJ4QW50LlBhaXIxU2Vjb25kYXJ5UnhBbnQgPSB0ZW1wOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lUGVyaW9kaWNFeGVjOiBubyBjb25uZWN0LCBzd2l0Y2ggdG8gYW5vdGhlciBvbmUgdG8gdHJ5IGNvbm5lY3Rpb25cbiIpKTsKLQotCQkJQXNpY1NldFJ4QW50KHBBZCwgcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudCk7Ci0JCX0KLQl9Ci19Ci0jZW5kaWYgLy8gQU5UX0RJVkVSU0lUWV9TVVBQT1JUIC8vCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlBbnRlbm5hIG1pc2NlbGxhbmVvdXMgc2V0dGluZy4KLQotCUFyZ3VtZW50czoKLQkJcEFkCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlCYW5kU3RhdGUJCQkJSW5kaWNhdGUgY3VycmVudCBCYW5kIFN0YXRlLgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMIDw9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCQkxLikgRnJhbWUgRW5kIHR5cGUgY29udHJvbAotCQkJb25seSB2YWxpZCBmb3IgRyBvbmx5IChSRl8yNTI3ICYgUkZfMjUyOSkKLQkJCTA6IG1lYW5zIERQRFQsIHNldCBCQlAgUjQgYml0IDUgdG8gMQotCQkJMTogbWVhbnMgU1BEVCwgc2V0IEJCUCBSNCBiaXQgNSB0byAwCi0KLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJQXNpY0FudGVubmFTZXR0aW5nKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCUFCR0JBTkRfU1RBVEUJQmFuZFN0YXRlKQotewotfQotCi1WT0lEIEFzaWNSZlR1bmluZ0V4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQotewotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUdpdmVzIENDSyBUWCByYXRlIDIgbW9yZSBkQiBUWCBwb3dlci4KLQkJVGhpcyByb3V0aW5lIHdvcmtzIG9ubHkgaW4gTElOSyBVUCBpbiBJTkZSQVNUUlVDVFVSRSBtb2RlLgotCi0JCWNhbGN1bGF0ZSBkZXNpcmVkIFR4IHBvd2VyIGluIFJGIFIzLlR4MH41LAlzaG91bGQgY29uc2lkZXIgLQotCQkwLiBpZiBjdXJyZW50IHJhZGlvIGlzIGEgbm9pc3kgZW52aXJvbm1lbnQgKHBBZC0+RHJzQ291bnRlcnMuZk5vaXN5RW52aXJvbm1lbnQpCi0JCTEuIFR4UG93ZXJQZXJjZW50YWdlCi0JCTIuIGF1dG8gY2FsaWJyYXRpb24gYmFzZWQgb24gVFNTSSBmZWVkYmFjawotCQkzLiBleHRyYSAyIGRiIGZvciBDQ0sKLQkJNC4gLTEwIGRiIHVwb24gdmVyeS1zaG9ydCBkaXN0YW5jZSAoQXZnUlNTSSA+PSAtNDBkYikgdG8gQVAKLQotCU5PVEU6IFNpbmNlIHRoaXMgcm91dGluZSByZXF1aXJlcyB0aGUgdmFsdWUgb2YgKHBBZC0+RHJzQ291bnRlcnMuZk5vaXN5RW52aXJvbm1lbnQpLAotCQlpdCBzaG91bGQgYmUgY2FsbGVkIEFGVEVSIE1sbWVEeW5hbWljVHhSYXRTd2l0Y2hpbmcoKQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXNpY0FkanVzdFR4UG93ZXIoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JSU5UCQkJaSwgajsKLQlDSEFSCQlEZWx0YVB3ciA9IDA7Ci0JQk9PTEVBTgkJYkF1dG9UeEFnYyA9IEZBTFNFOwotCVVDSEFSCQlUc3NpUmVmLCAqcFRzc2lNaW51c0JvdW5kYXJ5LCAqcFRzc2lQbHVzQm91bmRhcnksIFR4QWdjU3RlcDsKLQlVQ0hBUgkJQmJwUjEgPSAwLCBCYnBSNDkgPSAwLCBpZHg7Ci0JUENIQVIJCXBUeEFnY0NvbXBlbnNhdGU7Ci0JVUxPTkcJCVR4UHdyWzVdOwotCUNIQVIJCVZhbHVlOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUNIQVIJCVJzc2kgPSAtMTI3OwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotI2lmZGVmIENBUlJJRVJfU0VOU0VfTkVXX0FMR08KLQl1bnNpZ25lZCBsb25nIGZsYWdzOyAvL0tIIEFkZCB0byBGaXggUENJZSBQb3dlci1TYXZpbmcgYnVnCi0jZW5kaWYgLy8gQ0FSUklFUl9TRU5TRV9ORVdfQUxHTyAvLwotCi0KLSNpZmRlZiBDQVJSSUVSX1NFTlNFX05FV19BTEdPCi0JLy9LSCBBZGQgdG8gRml4IFBDSWUgUG93ZXItU2F2aW5nIGJ1ZzwtLQotCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkvL0tIIEFkZCB0byBGaXggUENJZSBQb3dlci1TYXZpbmcgYnVnLS0+Ci0jZW5kaWYgLy8gQ0FSUklFUl9TRU5TRV9ORVdfQUxHTyAvLwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkgfHwKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJKHBBZC0+YlBDSWNsa09mZiA9PSBUUlVFKSB8fAotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpIHx8Ci0JCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCi17Ci0KLSNpZmRlZiBDQVJSSUVSX1NFTlNFX05FV19BTEdPCi0JLy9LSCBBZGQgdG8gRml4IFBDSWUgUG93ZXItU2F2aW5nIGJ1ZzwtLQotCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCS8vS0ggYWRkIHRvIGZpeCBQQ0llLVBvd2VyIFNhdmluZyAtLT4KLSNlbmRpZiAvLyBDQVJSSUVSX1NFTlNFX05FV19BTEdPIC8vCi0JCXJldHVybjsKLX0KLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLAotCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCwKLQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEsCi0JCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCWlmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApCi0JewotCQlpZiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPiAxNCkKLQkJewotCQkJVHhQd3JbMF0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMF07Ci0JCQlUeFB3clsxXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFsxXTsKLQkJCVR4UHdyWzJdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzJdOwotCQkJVHhQd3JbM10gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbM107Ci0JCQlUeFB3cls0XSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFs0XTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVR4UHdyWzBdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzBdOwotCQkJVHhQd3JbMV0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMV07Ci0JCQlUeFB3clsyXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFsyXTsKLQkJCVR4UHdyWzNdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzNdOwotCQkJVHhQd3JbNF0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbNF07Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKLQkJewotCQkJVHhQd3JbMF0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMF07Ci0JCQlUeFB3clsxXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFsxXTsKLQkJCVR4UHdyWzJdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzJdOwotCQkJVHhQd3JbM10gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbM107Ci0JCQlUeFB3cls0XSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFs0XTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVR4UHdyWzBdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzBdOwotCQkJVHhQd3JbMV0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMV07Ci0JCQlUeFB3clsyXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFsyXTsKLQkJCVR4UHdyWzNdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzNdOwotCQkJVHhQd3JbNF0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbNF07Ci0JCX0KLQl9Ci0KLQkvLyBUWCBwb3dlciBjb21wZW5zYXRpb24gZm9yIHRlbXBlcmF0dXJlIHZhcmlhdGlvbiBiYXNlZCBvbiBUU1NJLiB0cnkgZXZlcnkgNCBzZWNvbmQKLQlpZiAocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSA0ID09IDApCi0JewotCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkKLQkJewotCQkJLyogYmcgY2hhbm5lbCAqLwotCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjRzsKLQkJCVRzc2lSZWYgICAgICAgICAgICA9IHBBZC0+VHNzaVJlZkc7Ci0JCQlwVHNzaU1pbnVzQm91bmRhcnkgPSAmcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMF07Ci0JCQlwVHNzaVBsdXNCb3VuZGFyeSAgPSAmcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1swXTsKLQkJCVR4QWdjU3RlcCAgICAgICAgICA9IHBBZC0+VHhBZ2NTdGVwRzsKLQkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUc7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvKiBhIGNoYW5uZWwgKi8KLQkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0E7Ci0JCQlUc3NpUmVmICAgICAgICAgICAgPSBwQWQtPlRzc2lSZWZBOwotCQkJcFRzc2lNaW51c0JvdW5kYXJ5ID0gJnBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzBdOwotCQkJcFRzc2lQbHVzQm91bmRhcnkgID0gJnBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMF07Ci0JCQlUeEFnY1N0ZXAgICAgICAgICAgPSBwQWQtPlR4QWdjU3RlcEE7Ci0JCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVBOwotCQl9Ci0KLQkJaWYgKGJBdXRvVHhBZ2MpCi0JCXsKLQkJCS8qIEJicFIxIGlzIHVuc2lnbmVkIGNoYXIgKi8KLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNDksICZCYnBSNDkpOwotCi0JCQkvKiAocCkgVHNzaVBsdXNCb3VuZGFyeUdbMF0gPSAwID0gKG0pIFRzc2lNaW51c0JvdW5kYXJ5R1swXSAqLwotCQkJLyogY29tcGVuc2F0ZTogKzQgICAgICszICAgKzIgICArMSAgICAwICAgLTEgICAtMiAgIC0zICAgLTQgKiBzdGVwcyAqLwotCQkJLyogc3RlcCB2YWx1ZSBpcyBkZWZpbmVkIGluIHBBZC0+VHhBZ2NTdGVwRyBmb3IgdHggcG93ZXIgdmFsdWUgKi8KLQotCQkJLyogWzRdKzErWzRdICAgcDQgICAgIHAzICAgcDIgICBwMSAgIG8xICAgbTEgICBtMiAgIG0zICAgbTQgKi8KLQkJCS8qIGV4OiAgICAgICAgIDB4MDAgMHgxNSAweDI1IDB4NDUgMHg4OCAweEEwIDB4QjUgMHhEMCAweEYwCi0JCQkgICBhYm92ZSB2YWx1ZSBhcmUgZXhhbWluZWQgaW4gbWFzcyBmYWN0b3J5IHByb2R1Y3Rpb24gKi8KLQkJCS8qICAgICAgICAgICAgIFs0XSAgICBbM10gIFsyXSAgWzFdICBbMF0gIFsxXSAgWzJdICBbM10gIFs0XSAqLwotCi0JCQkvKiBwbHVzICgrKSBpcyAweDAwIH4gMHg0NSwgbWludXMgKC0pIGlzIDB4YTAgfiAweGYwICovCi0JCQkvKiBpZiB2YWx1ZSBpcyBiZXR3ZWVuIHAxIH4gbzEgb3IgbzEgfiBzMSwgbm8gbmVlZCB0byBhZGp1c3QgdHggcG93ZXIgKi8KLQkJCS8qIGlmIHZhbHVlIGlzIDB4YTUsIHR4IHBvd2VyIHdpbGwgYmUgLT0gVHhBZ2NTdGVwKigyLTEpICovCi0KLQkJCWlmIChCYnBSNDkgPiBwVHNzaU1pbnVzQm91bmRhcnlbMV0pCi0JCQl7Ci0JCQkJLy8gUmVhZGluZyBpcyBsYXJnZXIgdGhhbiB0aGUgcmVmZXJlbmNlIHZhbHVlCi0JCQkJLy8gY2hlY2sgZm9yIGhvdyBsYXJnZSB3ZSBuZWVkIHRvIGRlY3JlYXNlIHRoZSBUeCBwb3dlcgotCQkJCWZvciAoaWR4ID0gMTsgaWR4IDwgNTsgaWR4KyspCi0JCQkJewotCQkJCQlpZiAoQmJwUjQ5IDw9IHBUc3NpTWludXNCb3VuZGFyeVtpZHhdKSAgLy8gRm91bmQgdGhlIHJhbmdlCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLy8gVGhlIGluZGV4IGlzIHRoZSBzdGVwIHdlIHNob3VsZCBkZWNyZWFzZSwgaWR4ID0gMCBtZWFucyB0aGVyZSBpcyBub3RoaW5nIHRvIGNvbXBlbnNhdGUKLS8vCQkJCWlmIChSMyA+IChVTE9ORykgKFR4QWdjU3RlcCAqIChpZHgtMSkpKQotCQkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IC0oVHhBZ2NTdGVwICogKGlkeC0xKSk7Ci0vLwkJCQllbHNlCi0vLwkJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSAtKChVQ0hBUilSMyk7Ci0KLQkJCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tIFR4IFBvd2VyLCBCQlAgUjE9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9IC0lZFxuIiwKLQkJCQkJQmJwUjQ5LCBUc3NpUmVmLCBUeEFnY1N0ZXAsIGlkeC0xKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChCYnBSNDkgPCBwVHNzaVBsdXNCb3VuZGFyeVsxXSkKLQkJCXsKLQkJCQkvLyBSZWFkaW5nIGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVmZXJlbmNlIHZhbHVlCi0JCQkJLy8gY2hlY2sgZm9yIGhvdyBsYXJnZSB3ZSBuZWVkIHRvIGluY3JlYXNlIHRoZSBUeCBwb3dlcgotCQkJCWZvciAoaWR4ID0gMTsgaWR4IDwgNTsgaWR4KyspCi0JCQkJewotCQkJCQlpZiAoQmJwUjQ5ID49IHBUc3NpUGx1c0JvdW5kYXJ5W2lkeF0pICAgLy8gRm91bmQgdGhlIHJhbmdlCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLy8gVGhlIGluZGV4IGlzIHRoZSBzdGVwIHdlIHNob3VsZCBpbmNyZWFzZSwgaWR4ID0gMCBtZWFucyB0aGVyZSBpcyBub3RoaW5nIHRvIGNvbXBlbnNhdGUKLQkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IFR4QWdjU3RlcCAqIChpZHgtMSk7Ci0JCQkJRGVsdGFQd3IgKz0gKCpwVHhBZ2NDb21wZW5zYXRlKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIrKyBUeCBQb3dlciwgQkJQIFIxPSV4LCBUc3NpUmVmPSV4LCBUeEFnY1N0ZXA9JXgsIHN0ZXAgPSArJWRcbiIsCi0JCQkJCUJicFI0OSwgVHNzaVJlZiwgVHhBZ2NTdGVwLCBpZHgtMSkpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gMDsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgICBUeCBQb3dlciwgQkJQIFI0OT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gKyVkXG4iLAotCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgMCkpOwotCQkJfQotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KQotCQl7Ci0JCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NHOwotCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlRzsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0E7Ci0JCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVBOwotCQl9Ci0KLQkJaWYgKGJBdXRvVHhBZ2MpCi0JCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOwotCX0KLQotCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJicFIxKTsKLQlCYnBSMSAmPSAweEZDOwotCi0jaWZkZWYgU0lOR0xFX1NLVQotCS8vIEhhbmRsZSByZWd1bGF0b3J5IG1heCB0eCBwb3dlciBjb25zdHJhaW4KLQlkbwotCXsKLQkJVUNIQVIgICAgVHhQd3JJbkVFUFJPTSA9IDB4RkYsIENvdW50cnlUeFB3ciA9IDB4RkYsIGNyaXRlcmlvbjsKLQkJVUNIQVIgICAgQWRqdXN0TWF4VHhQd3JbNDBdOwotCi0JCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpIC8vIDVHIGJhbmQKLQkJCVR4UHdySW5FRVBST00gPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlZmluZU1heFR4UHdyICYgMHhGRjAwKSA+PiA4KTsKLQkJZWxzZSAvLyAyLjRHIGJhbmQKLQkJCVR4UHdySW5FRVBST00gPSAocEFkLT5Db21tb25DZmcuRGVmaW5lTWF4VHhQd3IgJiAweDAwRkYpOwotCQlDb3VudHJ5VHhQd3IgPSBHZXRDdW50cnlNYXhUeFB3cihwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCi0JCS8vIGVycm9yIGhhbmRsaW5nLCByYW5nZSBjaGVjawotCQlpZiAoKFR4UHdySW5FRVBST00gPiAweDUwKSB8fCAoQ291bnRyeVR4UHdyID4gMHg1MCkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQXNpY0FkanVzdFR4UG93ZXIgLSBJbnZhbGlkIG1heCB0eCBwb3dlciAoPTB4JTAyeCksIENvdW50cnlUeFB3cj0lZFxuIiwgVHhQd3JJbkVFUFJPTSwgQ291bnRyeVR4UHdyKSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWNyaXRlcmlvbiA9ICooKFBVQ0hBUilUeFB3ciArIDIpICYgMHhGOyAgICAgICAgLy8gRkFFIHVzZSBPRkRNIDZNIGFzIGNyaXRlcmlvbgotCi0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGp1c3RUeFBvd2VyIChjcml0ZXJpb249JWQsIFR4UHdySW5FRVBST009JWQsIENvdW50cnlUeFB3cj0lZClcbiIsIGNyaXRlcmlvbiwgVHhQd3JJbkVFUFJPTSwgQ291bnRyeVR4UHdyKSk7Ci0KLQkJLy8gQWRqdXN0IG1heCB0eCBwb3dlciBhY2NvcmRpbmcgdG8gdGhlIHJlbGF0aW9uc2hpcCBvZiB0eCBwb3dlciBpbiBFMlBST00KLQkJZm9yIChpPTA7IGk8NTsgaSsrKQotCQl7Ci0JCQkvLyBDQ0sgd2lsbCBoYXZlIDRkQm0gbGFyZ2VyIHRoYW4gT0ZETQotCQkJLy8gVGhlcmVmb3JlLCB3ZSBzaG91bGQgc2VwYXJhdGUgdG8gcGFyc2UgdGhlIHR4IHBvd2VyIGZpZWxkCi0JCQlpZiAoaSA9PSAwKQotCQkJewotCQkJCWZvciAoaj0wOyBqPDg7IGorKykKLQkJCQl7Ci0JCQkJCVZhbHVlID0gKENIQVIpKChUeFB3cltpXSA+PiBqKjQpICYgMHgwRik7Ci0KLQkJCQkJaWYgKGogPCA0KQotCQkJCQl7Ci0JCQkJCQkvLyBDQ0sgd2lsbCBoYXZlIDRkQm0gbGFyZ2VyIHRoYW4gT0ZETQotCQkJCQkJQWRqdXN0TWF4VHhQd3JbaSo4K2pdID0gVHhQd3JJbkVFUFJPTSArIChWYWx1ZSAtIGNyaXRlcmlvbikgKyA0OwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJQWRqdXN0TWF4VHhQd3JbaSo4K2pdID0gVHhQd3JJbkVFUFJPTSArIChWYWx1ZSAtIGNyaXRlcmlvbik7Ci0JCQkJCX0KLQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiQXNpY0FkanVzdFR4UG93ZXIgKGkvaj0lZC8lZCwgVmFsdWU9JWQsICVkKVxuIiwgaSwgaiwgVmFsdWUsIEFkanVzdE1heFR4UHdyW2kqOCtqXSkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlmb3IgKGo9MDsgajw4OyBqKyspCi0JCQkJewotCQkJCQlWYWx1ZSA9IChDSEFSKSgoVHhQd3JbaV0gPj4gaio0KSAmIDB4MEYpOwotCi0JCQkJCUFkanVzdE1heFR4UHdyW2kqOCtqXSA9IFR4UHdySW5FRVBST00gKyAoVmFsdWUgLSBjcml0ZXJpb24pOwotCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRqdXN0VHhQb3dlciAoaS9qPSVkLyVkLCBWYWx1ZT0lZCwgJWQpXG4iLCBpLCBqLCBWYWx1ZSwgQWRqdXN0TWF4VHhQd3JbaSo4K2pdKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gQWRqdXN0IHR4IHBvd2VyIGFjY29yZGluZyB0byB0aGUgcmVsYXRpb25zaGlwCi0JCWZvciAoaT0wOyBpPDU7IGkrKykKLQkJewotCQkJaWYgKFR4UHdyW2ldICE9IDB4ZmZmZmZmZmYpCi0JCQl7Ci0JCQkJZm9yIChqPTA7IGo8ODsgaisrKQotCQkJCXsKLQkJCQkJVmFsdWUgPSAoQ0hBUikoKFR4UHdyW2ldID4+IGoqNCkgJiAweDBGKTsKLQotCQkJCQkvLyBUaGUgc3lzdGVtIHR4IHBvd2VyIGlzIGxhcmdlciB0aGFuIHRoZSByZWd1bGF0b3J5LCB0aGUgcG93ZXIgc2hvdWxkIGJlIHJlc3RyYWluCi0JCQkJCWlmIChBZGp1c3RNYXhUeFB3cltpKjgral0gPiBDb3VudHJ5VHhQd3IpCi0JCQkJCXsKLQkJCQkJCS8vIGRlY3JlYXNlIHRvIHplcm8gYW5kIGRvbid0IG5lZWQgdG8gdGFrZSBjYXJlIEJCUFIxCi0JCQkJCQlpZiAoKFZhbHVlIC0gKEFkanVzdE1heFR4UHdyW2kqOCtqXSAtIENvdW50cnlUeFB3cikpID4gMCkKLQkJCQkJCQlWYWx1ZSAtPSAoQWRqdXN0TWF4VHhQd3JbaSo4K2pdIC0gQ291bnRyeVR4UHdyKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlWYWx1ZSA9IDA7Ci0KLQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGp1c3RUeFBvd2VyIChpL2o9JWQvJWQsIFZhbHVlPSVkLCAlZClcbiIsIGksIGosIFZhbHVlLCBBZGp1c3RNYXhUeFB3cltpKjgral0pKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRqdXN0VHhQb3dlciAoaS9qPSVkLyVkLCBWYWx1ZT0lZCwgJWQsIG5vIGNoYW5nZSlcbiIsIGksIGosIFZhbHVlLCBBZGp1c3RNYXhUeFB3cltpKjgral0pKTsKLQotCQkJCQkJVHhQd3JbaV0gPSAoVHhQd3JbaV0gJiB+KDB4MDAwMDAwMEYgPDwgaio0KSkgfCAoVmFsdWUgPDwgaio0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9IHdoaWxlIChGQUxTRSk7Ci0jZW5kaWYgLy8gU0lOR0xFX1NLVSAvLwotCi0JLyogY2FsY3VsYXRlIGRlbHRhIHBvd2VyIGJhc2VkIG9uIHRoZSBwZXJjZW50YWdlIHNwZWNpZmllZCBmcm9tIFVJICovCi0JLy8gRTJQUk9NIHNldHRpbmcgaXMgY2FsaWJyYXRlZCBmb3IgbWF4aW11bSBUWCBwb3dlciAoaS5lLiAxMDAlKQotCS8vIFdlIGxvd2VyIFRYIHBvd2VyIGhlcmUgYWNjb3JkaW5nIHRvIHRoZSBwZXJjZW50YWdlIHNwZWNpZmllZCBmcm9tIFVJCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID09IDB4ZmZmZmZmZmYpICAgICAgIC8vIEFVVE8gVFggUE9XRVIgY29udHJvbAotCXsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJLy8gdG8gcGF0Y2ggaGlnaCBwb3dlciBpc3N1ZSB3aXRoIHNvbWUgQVBzLCBsaWtlIEJlbGtpbiBOMS4KLQkJCWlmIChSc3NpID4gLTM1KQotCQkJewotCQkJCUJicFIxIHw9IDB4MDI7CQkvLyBEZWx0YVB3ciAtPSAxMjsKLQkJCX0KLQkJCWVsc2UgaWYgKFJzc2kgPiAtNDApCi0JCQl7Ci0JCQkJQmJwUjEgfD0gMHgwMTsJCS8vIERlbHRhUHdyIC09IDY7Ci0JCQl9Ci0JCQllbHNlCi0JCTsKLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCX0KLQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDkwKSAgLy8gOTEgfiAxMDAlICYgQVVUTywgdHJlYXQgYXMgMTAwJSBpbiB0ZXJtcyBvZiBtVwotCQk7Ci0JZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA2MCkgIC8vIDYxIH4gOTAlLCB0cmVhdCBhcyA3NSUgaW4gdGVybXMgb2YgbVcJCS8vIERlbHRhUHdyIC09IDE7Ci0JewotCQlEZWx0YVB3ciAtPSAxOwotCX0KLQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDMwKSAgLy8gMzEgfiA2MCUsIHRyZWF0IGFzIDUwJSBpbiB0ZXJtcyBvZiBtVwkJLy8gRGVsdGFQd3IgLT0gMzsKLQl7Ci0JCURlbHRhUHdyIC09IDM7Ci0JfQotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gMTUpICAvLyAxNiB+IDMwJSwgdHJlYXQgYXMgMjUlIGluIHRlcm1zIG9mIG1XCQkvLyBEZWx0YVB3ciAtPSA2OwotCXsKLQkJQmJwUjEgfD0gMHgwMTsKLQl9Ci0JZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA5KSAgIC8vIDEwIH4gMTUlLCB0cmVhdCBhcyAxMi41JSBpbiB0ZXJtcyBvZiBtVwkJLy8gRGVsdGFQd3IgLT0gOTsKLQl7Ci0JCUJicFIxIHw9IDB4MDE7Ci0JCURlbHRhUHdyIC09IDM7Ci0JfQotCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMCB+IDkgJSwgdHJlYXQgYXMgTUlOKH4zJSkgaW4gdGVybXMgb2YgbVcJCS8vIERlbHRhUHdyIC09IDEyOwotCXsKLQkJQmJwUjEgfD0gMHgwMjsKLQl9Ci0KLQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCYnBSMSk7Ci0KLQkvKiByZXNldCBkaWZmZXJlbnQgbmV3IHR4IHBvd2VyIGZvciBkaWZmZXJlbnQgVFggcmF0ZSAqLwotCWZvcihpPTA7IGk8NTsgaSsrKQotCXsKLQkJaWYgKFR4UHdyW2ldICE9IDB4ZmZmZmZmZmYpCi0JCXsKLQkJCWZvciAoaj0wOyBqPDg7IGorKykKLQkJCXsKLQkJCQlWYWx1ZSA9IChDSEFSKSgoVHhQd3JbaV0gPj4gaio0KSAmIDB4MEYpOyAvKiAwIH4gMTUgKi8KLQotCQkJCWlmICgoVmFsdWUgKyBEZWx0YVB3cikgPCAwKQotCQkJCXsKLQkJCQkJVmFsdWUgPSAwOyAvKiBtaW4gKi8KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKFZhbHVlICsgRGVsdGFQd3IpID4gMHhGKQotCQkJCXsKLQkJCQkJVmFsdWUgPSAweEY7IC8qIG1heCAqLwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlWYWx1ZSArPSBEZWx0YVB3cjsgLyogdGVtcGVyYXR1cmUgY29tcGVuc2F0aW9uICovCi0JCQkJfQotCi0JCQkJLyogZmlsbCBuZXcgdmFsdWUgdG8gQ1NSIG9mZnNldCAqLwotCQkJCVR4UHdyW2ldID0gKFR4UHdyW2ldICYgfigweDAwMDAwMDBGIDw8IGoqNCkpIHwgKFZhbHVlIDw8IGoqNCk7Ci0JCQl9Ci0KLQkJCS8qIHdyaXRlIHR4IHBvd2VyIHZhbHVlIHRvIENTUiAqLwotCQkJLyogVFhfUFdSX0NGR18wICg4IHR4IHJhdGUpIGZvcglUWCBwb3dlciBmb3IgT0ZETSAxMk0vMThNCi0JCQkJCQkJCQkJCVRYIHBvd2VyIGZvciBPRkRNIDZNLzlNCi0JCQkJCQkJCQkJCVRYIHBvd2VyIGZvciBDQ0s1LjVNLzExTQotCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgQ0NLMU0vMk0gKi8KLQkJCS8qIFRYX1BXUl9DRkdfMSB+IFRYX1BXUl9DRkdfNCAqLwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBUeFB3cltpXSk7Ci0JCX0KLQl9Ci0KLSNpZmRlZiBDQVJSSUVSX1NFTlNFX05FV19BTEdPCi0JLy9LSCBBZGQgdG8gRml4IFBDSWUgUG93ZXItU2F2aW5nIGJ1ZzwtLQotCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCS8vS0ggYWRkIHRvIGZpeCBQQ0llLVBvd2VyIFNhdmluZyAtLT4KLSNlbmRpZiAvLyBDQVJSSUVSX1NFTlNFX05FV19BTEdPIC8vCi0KLX0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1WT0lEIEFzaWNSZXNldEJCUEFnZW50KAotSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JQkJQX0NTUl9DRkdfU1RSVUMJQmJwQ3NyOwotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJlc2V0IEJCUCBBZ2VudCBidXN5IGJpdC4hISBcbiIpKTsKLQkvLyBTdGlsbCBuZWVkIHRvIGZpbmQgd2h5IEJCUCBhZ2VudCBrZWVwcyBidXN5LCBidXQgaW4gZmFjdCwgaGFyZHdhcmUgc3RpbGwgZnVuY3Rpb24gb2suIE5vdyBjbGVhciBidXN5IGZpcnN0LgotCVJUTVBfSU9fUkVBRDMyKHBBZCwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsKLQlCYnBDc3IuZmllbGQuQnVzeSA9IDA7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX0JCUF9BR0VOVCwgQmJwQ3NyLndvcmQpOwotfQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlwdXQgUEhZIHRvIHNsZWVwIGhlcmUsIGFuZCBzZXQgbmV4dCB3YWtldXAgdGltZXIuIFBIWSBkb2Vzbid0IG5vdCB3YWtldXAKLQkJYXV0b21hdGljYWxseS4gSW5zdGVhZCwgTUNVIHdpbGwgaXNzdWUgYSBUd2FrZVVwSW50ZXJydXB0IHRvIGhvc3QgYWZ0ZXIKLQkJdGhlIHdha2V1cCB0aW1lciB0aW1lb3V0LiBEcml2ZXIgaGFzIHRvIGlzc3VlIGEgc2VwYXJhdGUgY29tbWFuZCB0byB3YWtlCi0JCVBIWSB1cC4KLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQgVGJ0dE51bVRvTmV4dFdha2VVcCkKLXsKLQlSVE1QX1NUQV9TTEVFUF9USEVOX0FVVE9fV0FLRVVQKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJQXNpY0ZvcmNlV2FrZXVwKCkgaXMgdXNlZCB3aGVuZXZlciBtYW51YWwgd2FrZXVwIGlzIHJlcXVpcmVkCi0JCUFzaWNGb3JjZVNsZWVwKCkgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIG5vdCBpbiBJTkZSQSBCU1MuIFdoZW4KLQkJaW4gSU5GUkEgQlNTLCB3ZSBzaG91bGQgdXNlIEFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKCkgaW5zdGVhZC4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNGb3JjZVNsZWVwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJQXNpY0ZvcmNlV2FrZXVwKCkgaXMgdXNlZCB3aGVuZXZlciBUd2FrZXVwIHRpbWVyIChzZXQgdmlhIEFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKQotCQlleHBpcmVkLgotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNGb3JjZVdha2V1cCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBCT09MRUFOICAgIGJGcm9tVHgpCi17Ci0gICAgREJHUFJJTlQoUlRfREVCVUdfSU5GTywgKCItLT4gQXNpY0ZvcmNlV2FrZXVwIFxuIikpOwotICAgIFJUTVBfU1RBX0ZPUkNFX1dBS0VVUChwQWQsIGJGcm9tVHgpOwotfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJU2V0IE15IEJTU0lECi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXNpY1NldEJzc2lkKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwQnNzaWQpCi17Ci0JVUxPTkcJCSAgQWRkcjQ7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT09PT09PT09PT0+IEFzaWNTZXRCc3NpZCAleDoleDoleDoleDoleDoleFxuIiwKLQkJcEJzc2lkWzBdLHBCc3NpZFsxXSxwQnNzaWRbMl0scEJzc2lkWzNdLCBwQnNzaWRbNF0scEJzc2lkWzVdKSk7Ci0KLQlBZGRyNCA9IChVTE9ORykocEJzc2lkWzBdKQkJIHwKLQkJCShVTE9ORykocEJzc2lkWzFdIDw8IDgpICB8Ci0JCQkoVUxPTkcpKHBCc3NpZFsyXSA8PCAxNikgfAotCQkJKFVMT05HKShwQnNzaWRbM10gPDwgMjQpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19CU1NJRF9EVzAsIEFkZHI0KTsKLQotCUFkZHI0ID0gMDsKLQkvLyBhbHdheXMgb25lIEJTU0lEIGluIFNUQSBtb2RlCi0JQWRkcjQgPSAoVUxPTkcpKHBCc3NpZFs0XSkgfCAoVUxPTkcpKHBCc3NpZFs1XSA8PCA4KTsKLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19CU1NJRF9EVzEsIEFkZHI0KTsKLX0KLQotVk9JRCBBc2ljU2V0TWNhc3RXQygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdOwotCVVTSE9SVAkJb2Zmc2V0OwotCi0JcEVudHJ5LT5Tc3QgICAgICAgID0gU1NUX0FTU09DOwotCXBFbnRyeS0+QWlkICAgICAgICA9IE1DQVNUX1dDSUQ7CS8vIFNvZnRhcCBzdXBwb3J0cyAxIEJTU0lEIGFuZCB1c2UgV0NJRD0wIGFzIG11bHRpY2FzdCBXY2lkIGluZGV4Ci0JcEVudHJ5LT5Qc01vZGUgICAgID0gUFdSX0FDVElWRTsKLQlwRW50cnktPkN1cnJUeFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKLQlvZmZzZXQgPSBNQUNfV0NJRF9CQVNFICsgQlNTME1jYXN0X1dDSUQgKiBIV19XQ0lEX0VOVFJZX1NJWkU7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljRGVsV2NpZFRhYigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUglXY2lkKQotewotCVVMT05HCQkgIEFkZHIwID0gMHgwLCBBZGRyMSA9IDB4MDsKLQlVTE9ORwkJb2Zmc2V0OwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY0RlbFdjaWRUYWI9PT5XY2lkID0gMHgleFxuIixXY2lkKSk7Ci0Jb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIFdjaWQgKiBIV19XQ0lEX0VOVFJZX1NJWkU7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBBZGRyMCk7Ci0Jb2Zmc2V0ICs9IDQ7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBBZGRyMSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljRW5hYmxlUkRHKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVRYX0xJTktfQ0ZHX1NUUlVDCVR4TGlua0NmZzsKLQlVSU5UMzIJCQkJRGF0YSA9IDA7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0xJTktfQ0ZHLCAmVHhMaW5rQ2ZnLndvcmQpOwotCVR4TGlua0NmZy5maWVsZC5UeFJER0VuID0gMTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9MSU5LX0NGRywgVHhMaW5rQ2ZnLndvcmQpOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBFRENBX0FDMF9DRkcsICZEYXRhKTsKLQlEYXRhICAmPSAweEZGRkZGRjAwOwotCURhdGEgIHw9IDB4ODA7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBEYXRhKTsKLQotCS8vT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNEaXNhYmxlUkRHKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVRYX0xJTktfQ0ZHX1NUUlVDCVR4TGlua0NmZzsKLQlVSU5UMzIJCQkJRGF0YSA9IDA7Ci0KLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfTElOS19DRkcsICZUeExpbmtDZmcud29yZCk7Ci0JVHhMaW5rQ2ZnLmZpZWxkLlR4UkRHRW4gPSAwOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0xJTktfQ0ZHLCBUeExpbmtDZmcud29yZCk7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOwotCi0JRGF0YSAgJj0gMHhGRkZGRkYwMDsKLQkvL0RhdGEgIHw9IDB4MjA7Ci0jaWZuZGVmIFdJRklfVEVTVAotCS8vaWYgKCBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCApCi0JLy8JRGF0YSB8PSAweDYwOyAvLyBmb3IgcGVyZm9ybWFuY2UgaXNzdWUgbm90IHNldCB0aGUgVFhPUCB0byAwCi0jZW5kaWYKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0RZTkFNSUNfQkVfVFhPUF9BQ1RJVkUpCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCSYmIChwQWQtPk1hY1RhYi5mQW55U3RhdGlvbk1JTU9QU0R5bmFtaWMgPT0gRkFMU0UpCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JKQotCXsKLQkJLy8gRm9yIENXQyB0ZXN0LCBjaGFuZ2UgdHhvcCBmcm9tIDB4MzAgdG8gMHgyMCBpbiBUeEJ1cnN0IG1vZGUKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KQotCQlEYXRhIHw9IDB4MjA7Ci0JfQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNEaXNhYmxlU3luYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkRpc2FibGUgVFNGIHN5bmNocm9uaXphdGlvblxuIikpOwotCi0JLy8gMjAwMy0xMi0yMCBkaXNhYmxlIFRTRiBhbmQgVEJUVCB3aGlsZSBOSUMgaW4gcG93ZXItc2F2aW5nIGhhdmUgc2lkZSBlZmZlY3QKLQkvLwkJCSAgdGhhdCBOSUMgd2lsbCBuZXZlciB3YWtlcyB1cCBiZWNhdXNlIFRTRiBzdG9wcyBhbmQgbm8gbW9yZQotCS8vCQkJICBUQlRUIGludGVycnVwdHMKLQlwQWQtPlRidHRUaWNrQ291bnQgPSAwOwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOwotCWNzci5maWVsZC5iQmVhY29uR2VuID0gMDsKLQljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAwOwotCWNzci5maWVsZC5Uc2ZTeW5jTW9kZSA9IDA7Ci0JY3NyLmZpZWxkLmJUc2ZUaWNraW5nID0gMDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXNpY0VuYWJsZUJzc1N5bmMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT5Bc2ljRW5hYmxlQnNzU3luYyhJTkZSQSBtb2RlKVxuIikpOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBCQ05fVElNRV9DRkcsICZjc3Iud29yZCk7Ci0vLwlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIDB4MDAwMDAwMDApOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQljc3IuZmllbGQuQmVhY29uSW50ZXJ2YWwgPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgNDsgLy8gQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVCi0JCWNzci5maWVsZC5iVHNmVGlja2luZyA9IDE7Ci0JCWNzci5maWVsZC5Uc2ZTeW5jTW9kZSA9IDE7IC8vIHN5bmMgVFNGIGluIElORlJBU1RSVUNUVVJFIG1vZGUKLQkJY3NyLmZpZWxkLmJCZWFjb25HZW4gID0gMDsgLy8gZG8gTk9UIGdlbmVyYXRlIEJFQUNPTgotCQljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAxOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCU5vdGU6Ci0JCUJFQUNPTiBmcmFtZSBpbiBzaGFyZWQgbWVtb3J5IHNob3VsZCBiZSBidWlsdCBvayBiZWZvcmUgdGhpcyByb3V0aW5lCi0JCWNhbiBiZSBjYWxsZWQuIE90aGVyd2lzZSwgYSBnYXJiYWdlIGZyYW1lIG1heWJlIHRyYW5zbWl0dGVkIG91dCBldmVyeQotCQlCZWFjb24gcGVyaW9kLgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNFbmFibGVJYnNzU3luYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOTsKLQlQVUNIQVIJCQlwdHI7Ci0JVUlOVCBpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkFzaWNFbmFibGVJYnNzU3luYyhBREhPQyBtb2RlLiBNUERVdG90YWxCeXRlQ291bnQgPSAlZClcbiIsIHBBZC0+QmVhY29uVHhXSS5NUERVdG90YWxCeXRlQ291bnQpKTsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyOS53b3JkKTsKLQljc3I5LmZpZWxkLmJCZWFjb25HZW4gPSAwOwotCWNzcjkuZmllbGQuYlRCVFRFbmFibGUgPSAwOwotCWNzcjkuZmllbGQuYlRzZlRpY2tpbmcgPSAwOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyOS53b3JkKTsKLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCS8vIG1vdmUgQkVBQ09OIFRYRCBhbmQgZnJhbWUgY29udGVudCB0byBvbi1jaGlwIG1lbW9yeQotCXB0ciA9IChQVUNIQVIpJnBBZC0+QmVhY29uVHhXSTsKLQlmb3IgKGk9MDsgaTxUWFdJX1NJWkU7IGkrPTQpICAvLyAxNi1ieXRlIFRYV0kgZmllbGQKLQl7Ci0JCVVJTlQzMiBsb25ncHRyID0gICpwdHIgKyAoKihwdHIrMSk8PDgpICsgKCoocHRyKzIpPDwxNikgKyAoKihwdHIrMyk8PDI0KTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgSFdfQkVBQ09OX0JBU0UwICsgaSwgbG9uZ3B0cik7Ci0JCXB0ciArPSA0OwotCX0KLQotCS8vIHN0YXJ0IHJpZ2h0IGFmdGVyIHRoZSAxNi1ieXRlIFRYV0kgZmllbGQKLQlwdHIgPSBwQWQtPkJlYWNvbkJ1ZjsKLQlmb3IgKGk9MDsgaTwgcEFkLT5CZWFjb25UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudDsgaSs9NCkKLQl7Ci0JCVVJTlQzMiBsb25ncHRyID0gICpwdHIgKyAoKihwdHIrMSk8PDgpICsgKCoocHRyKzIpPDwxNikgKyAoKihwdHIrMyk8PDI0KTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgSFdfQkVBQ09OX0JBU0UwICsgVFhXSV9TSVpFICsgaSwgbG9uZ3B0cik7Ci0JCXB0ciArPTQ7Ci0JfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0KLQkvLwotCS8vIEZvciBXaS1GaSBmYWlseSBnZW5lcmF0ZWQgYmVhY29ucyBiZXR3ZWVuIHBhcnRpY2lwYXRpbmcgc3RhdGlvbnMuCi0JLy8gU2V0IFRCVFQgcGhhc2UgYWRhcHRpdmUgYWRqdXN0bWVudCBzdGVwIHRvIDh1cyAoZGVmYXVsdCAxNnVzKQotCS8vIGRvbid0IGNoYW5nZSBzZXR0aW5ncyAyMDA2LTUtIGJ5IEplcnJ5Ci0JLy9SVE1QX0lPX1dSSVRFMzIocEFkLCBUQlRUX1NZTkNfQ0ZHLCAweDAwMDAxMDEwKTsKLQotCS8vIHN0YXJ0IHNlbmRpbmcgQkVBQ09OCi0JY3NyOS5maWVsZC5CZWFjb25JbnRlcnZhbCA9IHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCA0OyAvLyBBU0lDIHJlZ2lzdGVyIGluIHVuaXRzIG9mIDEvMTYgVFUKLQljc3I5LmZpZWxkLmJUc2ZUaWNraW5nID0gMTsKLQljc3I5LmZpZWxkLlRzZlN5bmNNb2RlID0gMjsgLy8gc3luYyBUU0YgaW4gSUJTUyBtb2RlCi0JY3NyOS5maWVsZC5iVEJUVEVuYWJsZSA9IDE7Ci0JY3NyOS5maWVsZC5iQmVhY29uR2VuID0gMTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzcjkud29yZCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNTZXRFZGNhUGFybSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQRURDQV9QQVJNCSBwRWRjYVBhcm0pCi17Ci0JRURDQV9BQ19DRkdfU1RSVUMgICBBYzBDZmcsIEFjMUNmZywgQWMyQ2ZnLCBBYzNDZmc7Ci0JQUNfVFhPUF9DU1IwX1NUUlVDIGNzcjA7Ci0JQUNfVFhPUF9DU1IxX1NUUlVDIGNzcjE7Ci0JQUlGU05fQ1NSX1NUUlVDICAgIEFpZnNuQ3NyOwotCUNXTUlOX0NTUl9TVFJVQyAgICBDd21pbkNzcjsKLQlDV01BWF9DU1JfU1RSVUMgICAgQ3dtYXhDc3I7Ci0JaW50IGk7Ci0KLQlBYzBDZmcud29yZCA9IDA7Ci0JQWMxQ2ZnLndvcmQgPSAwOwotCUFjMkNmZy53b3JkID0gMDsKLQlBYzNDZmcud29yZCA9IDA7Ci0JaWYgKChwRWRjYVBhcm0gPT0gTlVMTCkgfHwgKHBFZGNhUGFybS0+YlZhbGlkID09IEZBTFNFKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXNpY1NldEVkY2FQYXJtXG4iKSk7Ci0JCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpOwotCQlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQotCQl7Ci0JCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJIHx8IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0FwQ2xpKQotCQkJCUNMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtpXSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpOwotCQl9Ci0KLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQkvLyAgICAgIE1BQyBSZWdpc3RlciBoYXMgYSBjb3B5IC4KLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8jaWZuZGVmIFdJRklfVEVTVAotCQlpZiggcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgKQotCQl7Ci0JCQkvLyBGb3IgQ1dDIHRlc3QsIGNoYW5nZSB0eG9wIGZyb20gMHgzMCB0byAweDIwIGluIFR4QnVyc3QgbW9kZQotCQkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9IDB4MjA7IC8vIFN1Z2dlc3QgYnkgSm9obiBmb3IgVHhCdXJzdCBpbiBIVCBNb2RlCi0JCX0KLQkJZWxzZQotCQkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9IDA7CS8vIFFJRF9BQ19CRQotLy8jZWxzZQotLy8JCUFjMENmZy5maWVsZC5BY1R4b3AgPSAwOwkvLyBRSURfQUNfQkUKLS8vI2VuZGlmCi0JCUFjMENmZy5maWVsZC5Dd21pbiA9IENXX01JTl9JTl9CSVRTOwotCQlBYzBDZmcuZmllbGQuQ3dtYXggPSBDV19NQVhfSU5fQklUUzsKLQkJQWMwQ2ZnLmZpZWxkLkFpZnNuID0gMjsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBBYzBDZmcud29yZCk7Ci0KLQkJQWMxQ2ZnLmZpZWxkLkFjVHhvcCA9IDA7CS8vIFFJRF9BQ19CSwotCQlBYzFDZmcuZmllbGQuQ3dtaW4gPSBDV19NSU5fSU5fQklUUzsKLQkJQWMxQ2ZnLmZpZWxkLkN3bWF4ID0gQ1dfTUFYX0lOX0JJVFM7Ci0JCUFjMUNmZy5maWVsZC5BaWZzbiA9IDI7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMxX0NGRywgQWMxQ2ZnLndvcmQpOwotCi0JCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCi0JCXsKLQkJCUFjMkNmZy5maWVsZC5BY1R4b3AgPSAxOTI7CS8vIEFDX1ZJOiAxOTIqMzJ1cyB+PSA2bXMKLQkJCUFjM0NmZy5maWVsZC5BY1R4b3AgPSA5NjsJLy8gQUNfVk86IDk2KjMydXMgIH49IDNtcwotCQl9Ci0JCWVsc2UKLQkJewotCQkJQWMyQ2ZnLmZpZWxkLkFjVHhvcCA9IDk2OwkvLyBBQ19WSTogOTYqMzJ1cyB+PSAzbXMKLQkJCUFjM0NmZy5maWVsZC5BY1R4b3AgPSA0ODsJLy8gQUNfVk86IDQ4KjMydXMgfj0gMS41bXMKLQkJfQotCQlBYzJDZmcuZmllbGQuQ3dtaW4gPSBDV19NSU5fSU5fQklUUzsKLQkJQWMyQ2ZnLmZpZWxkLkN3bWF4ID0gQ1dfTUFYX0lOX0JJVFM7Ci0JCUFjMkNmZy5maWVsZC5BaWZzbiA9IDI7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMyX0NGRywgQWMyQ2ZnLndvcmQpOwotCQlBYzNDZmcuZmllbGQuQ3dtaW4gPSBDV19NSU5fSU5fQklUUzsKLQkJQWMzQ2ZnLmZpZWxkLkN3bWF4ID0gQ1dfTUFYX0lOX0JJVFM7Ci0JCUFjM0NmZy5maWVsZC5BaWZzbiA9IDI7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMzX0NGRywgQWMzQ2ZnLndvcmQpOwotCi0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJLy8gICAgICBETUEgUmVnaXN0ZXIgaGFzIGEgY29weSB0b28uCi0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJY3NyMC5maWVsZC5BYzBUeG9wID0gMDsJCS8vIFFJRF9BQ19CRQotCQljc3IwLmZpZWxkLkFjMVR4b3AgPSAwOwkJLy8gUUlEX0FDX0JLCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9UWE9QMF9DRkcsIGNzcjAud29yZCk7Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCi0JCXsKLQkJCWNzcjEuZmllbGQuQWMyVHhvcCA9IDE5MjsJCS8vIEFDX1ZJOiAxOTIqMzJ1cyB+PSA2bXMKLQkJCWNzcjEuZmllbGQuQWMzVHhvcCA9IDk2OwkJLy8gQUNfVk86IDk2KjMydXMgIH49IDNtcwotCQl9Ci0JCWVsc2UKLQkJewotCQkJY3NyMS5maWVsZC5BYzJUeG9wID0gOTY7CQkvLyBBQ19WSTogOTYqMzJ1cyB+PSAzbXMKLQkJCWNzcjEuZmllbGQuQWMzVHhvcCA9IDQ4OwkJLy8gQUNfVk86IDQ4KjMydXMgfj0gMS41bXMKLQkJfQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDFfQ0ZHLCBjc3IxLndvcmQpOwotCi0JCUN3bWluQ3NyLndvcmQgPSAwOwotCQlDd21pbkNzci5maWVsZC5Dd21pbjAgPSBDV19NSU5fSU5fQklUUzsKLQkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4xID0gQ1dfTUlOX0lOX0JJVFM7Ci0JCUN3bWluQ3NyLmZpZWxkLkN3bWluMiA9IENXX01JTl9JTl9CSVRTOwotCQlDd21pbkNzci5maWVsZC5Dd21pbjMgPSBDV19NSU5fSU5fQklUUzsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0NXTUlOX0NGRywgQ3dtaW5Dc3Iud29yZCk7Ci0KLQkJQ3dtYXhDc3Iud29yZCA9IDA7Ci0JCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MCA9IENXX01BWF9JTl9CSVRTOwotCQlDd21heENzci5maWVsZC5Dd21heDEgPSBDV19NQVhfSU5fQklUUzsKLQkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgyID0gQ1dfTUFYX0lOX0JJVFM7Ci0JCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MyA9IENXX01BWF9JTl9CSVRTOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNQVhfQ0ZHLCBDd21heENzci53b3JkKTsKLQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQUlGU05fQ0ZHLCAweDAwMDAyMjIyKTsKLQotCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOwotCX0KLQllbHNlCi0JewotCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCk7Ci0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJLy8gICAgICBNQUMgUmVnaXN0ZXIgaGFzIGEgY29weS4KLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQkvLwotCQkvLyBNb2RpZnkgQ3dtaW4vQ3dtYXgvVHhvcCBvbiBxdWV1ZVtRSURfQUNfVkldLCBSZWNvbW1lbmQgYnkgSmVycnkgMjAwNS8wNy8yNwotCQkvLyBUbyBkZWdyYWRlIG91ciBWSURPIFF1ZXVlJ3MgdGhyb3VnaHB1dCBmb3IgV2lGaSBXTU0gUzNUMDcgSXNzdWUuCi0JCS8vCi0JCS8vcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV0gPSBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZJXSAqIDcgLyAxMDsgLy8gcnQyODYwYyBuZWVkIHRoaXMKLQotCQlBYzBDZmcuZmllbGQuQWNUeG9wID0gIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQkVdOwotCQlBYzBDZmcuZmllbGQuQ3dtaW49IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JFXTsKLQkJQWMwQ2ZnLmZpZWxkLkN3bWF4ID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQkVdOwotCQlBYzBDZmcuZmllbGQuQWlmc24gPSBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CRV07IC8vKzE7Ci0KLQkJQWMxQ2ZnLmZpZWxkLkFjVHhvcCA9ICBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JLXTsKLQkJQWMxQ2ZnLmZpZWxkLkN3bWluID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQktdOyAvLysyOwotCQlBYzFDZmcuZmllbGQuQ3dtYXggPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CS107Ci0JCUFjMUNmZy5maWVsZC5BaWZzbiA9IHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JLXTsgLy8rMTsKLQotCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gKHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldICogNikgLyAxMDsKLQkJaWYocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQotCQl7Ci0JCQlBYzJDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WSV0gKyAxOwotCQkJQWMyQ2ZnLmZpZWxkLkN3bWF4ID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVkldICsgMTsKLQkJfQotCQllbHNlCi0JCXsKLQkJQWMyQ2ZnLmZpZWxkLkN3bWluID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVkldOwotCQlBYzJDZmcuZmllbGQuQ3dtYXggPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19WSV07Ci0JCX0KLQkJQWMyQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldICsgMTsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2lmZGVmIElORl9BTUFaT05fU0UKLSNlbmRpZiAvLyBJTkZfQU1BWk9OX1NFIC8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJLy8gVHVuaW5nIGZvciBXaS1GaSBXTU0gUzA2Ci0JCQlpZiAocEFkLT5Db21tb25DZmcuYldpRmlUZXN0ICYmCi0JCQkJcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldID09IDEwKQotCQkJCUFjMkNmZy5maWVsZC5BaWZzbiAtPSAxOwotCi0JCQkvLyBUdW5pbmcgZm9yIFRHbiBXaS1GaSA1LjIuMzIKLQkJCS8vIFNUQSBUZXN0QmVkIGNoYW5nZXMgaW4gdGhpcyBpdGVtOiBjb25leGFudCBsZWdhY3kgc3RhID09PiBicm9hZGNvbSAxMW4gc3RhCi0JCQlpZiAoU1RBX1RHTl9XSUZJX09OKHBBZCkgJiYKLQkJCQlwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV0gPT0gMTApCi0JCQl7Ci0JCQkJQWMwQ2ZnLmZpZWxkLkFpZnNuID0gMzsKLQkJCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gNTsKLQkJCX0KLQotI2lmZGVmIFJUMzB4eAotCQkJaWYgKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIwIHx8IHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18yMDIwKQotCQkJewotCQkJCS8vIFR1bmluZyBmb3IgV2lGaSBXTU0gUzMtVDA3OiBjb25uZXhhbnQgbGVnYWN5IHN0YSA9PT4gYnJvYWRjb20gMTFuIHN0YS4KLQkJCQlBYzJDZmcuZmllbGQuQWlmc24gPSA1OwotCQkJfQotI2VuZGlmIC8vIFJUMzB4eCAvLwotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkJQWMzQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVk9dOwotCQlBYzNDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WT107Ci0JCUFjM0NmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZPXTsKLQkJQWMzQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVk9dOwotCi0vLyNpZmRlZiBXSUZJX1RFU1QKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCkKLQkJewotCQkJaWYgKEFjM0NmZy5maWVsZC5BY1R4b3AgPT0gMTAyKQotCQkJewotCQkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQkVdID8gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CRV0gOiAxMDsKLQkJCQlBYzBDZmcuZmllbGQuQWlmc24gID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdLTE7IC8qIEFJRlNOIG11c3QgPj0gMSAqLwotCQkJQWMxQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQktdOwotCQkJCUFjMUNmZy5maWVsZC5BaWZzbiAgPSBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CS107Ci0JCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV07Ci0JCQl9IC8qIEVuZCBvZiBpZiAqLwotCQl9Ci0vLyNlbmRpZiAvLyBXSUZJX1RFU1QgLy8KLQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIEFjMENmZy53b3JkKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzFfQ0ZHLCBBYzFDZmcud29yZCk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMyX0NGRywgQWMyQ2ZnLndvcmQpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDM19DRkcsIEFjM0NmZy53b3JkKTsKLQotCi0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJLy8gICAgICBETUEgUmVnaXN0ZXIgaGFzIGEgY29weSB0b28uCi0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJY3NyMC5maWVsZC5BYzBUeG9wID0gQWMwQ2ZnLmZpZWxkLkFjVHhvcDsKLQkJY3NyMC5maWVsZC5BYzFUeG9wID0gQWMxQ2ZnLmZpZWxkLkFjVHhvcDsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AwX0NGRywgY3NyMC53b3JkKTsKLQotCQljc3IxLmZpZWxkLkFjMlR4b3AgPSBBYzJDZmcuZmllbGQuQWNUeG9wOwotCQljc3IxLmZpZWxkLkFjM1R4b3AgPSBBYzNDZmcuZmllbGQuQWNUeG9wOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDFfQ0ZHLCBjc3IxLndvcmQpOwotCi0JCUN3bWluQ3NyLndvcmQgPSAwOwotCQlDd21pbkNzci5maWVsZC5Dd21pbjAgPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CRV07Ci0JCUN3bWluQ3NyLmZpZWxkLkN3bWluMSA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JLXTsKLQkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4yID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVkldOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4zID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVk9dIC0gMTsgLy9mb3IgVEduIHdpZmkgdGVzdAotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNSU5fQ0ZHLCBDd21pbkNzci53b3JkKTsKLQotCQlDd21heENzci53b3JkID0gMDsKLQkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgwID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQkVdOwotCQlDd21heENzci5maWVsZC5Dd21heDEgPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CS107Ci0JCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MiA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZJXTsKLQkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgzID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVk9dOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNQVhfQ0ZHLCBDd21heENzci53b3JkKTsKLQotCQlBaWZzbkNzci53b3JkID0gMDsKLQkJQWlmc25Dc3IuZmllbGQuQWlmc24wID0gQWMwQ2ZnLmZpZWxkLkFpZnNuOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JFXTsKLQkJQWlmc25Dc3IuZmllbGQuQWlmc24xID0gQWMxQ2ZnLmZpZWxkLkFpZnNuOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JLXTsKLQkJQWlmc25Dc3IuZmllbGQuQWlmc24yID0gQWMyQ2ZnLmZpZWxkLkFpZnNuOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXTsKLSNpZmRlZiBJTkZfQU1BWk9OX1NFCi0jZW5kaWYgLy8gSU5GX0FNQVpPTl9TRSAvLwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCS8vIFR1bmluZyBmb3IgV2ktRmkgV01NIFMwNgotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCAmJgotCQkJCXBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9PSAxMCkKLQkJCQlBaWZzbkNzci5maWVsZC5BaWZzbjIgPSBBYzJDZmcuZmllbGQuQWlmc24gLSA0OwotCi0JCQkvLyBUdW5pbmcgZm9yIFRHbiBXaS1GaSA1LjIuMzIKLQkJCS8vIFNUQSBUZXN0QmVkIGNoYW5nZXMgaW4gdGhpcyBpdGVtOiBjb25uZXhhbnQgbGVnYWN5IHN0YSA9PT4gYnJvYWRjb20gMTFuIHN0YQotCQkJaWYgKFNUQV9UR05fV0lGSV9PTihwQWQpICYmCi0JCQkJcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldID09IDEwKQotCQkJewotCQkJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMCA9IDM7Ci0JCQkJQWlmc25Dc3IuZmllbGQuQWlmc24yID0gNzsKLQkJCX0KLQotCQkJaWYgKElORlJBX09OKHBBZCkpCi0JCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpOwotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJQWlmc25Dc3IuZmllbGQuQWlmc24zID0gQWMzQ2ZnLmZpZWxkLkFpZnNuIC0gMTsgLy9wRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WT107IC8vZm9yIFRHbiB3aWZpIHRlc3QKLSNpZmRlZiBSVDMweHgKLQkJCS8vIFRPRE86IFNoaWFuZywgdGhpcyBtb2RpZmljYXRpb24gYWxzbyBzdWl0YWJsZSBmb3IgUlQzMDUyL1JUMzA1MCA/Pz8KLQkJCWlmIChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMCB8fCBwQWQtPlJmSWNUeXBlID09IFJGSUNfMjAyMCkKLQkJCXsKLQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJCQlBaWZzbkNzci5maWVsZC5BaWZzbjIgPSAweDI7IC8vcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldOyAvL2ZvciBXaUZpIFdNTSBTNC1UMDQuCi0JCQl9Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCi0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0FJRlNOX0NGRywgQWlmc25Dc3Iud29yZCk7Ci0KLQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0sIHBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOwotCQlpZiAoIUFESE9DX09OKHBBZCkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRURDQSBbIyVkXTogQUlGU04gQ1dtaW4gQ1dtYXggIFRYT1AodXMpICBBQ01cbiIsIHBFZGNhUGFybS0+RWRjYVVwZGF0ZUNvdW50KSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiAgICAgQUNfQkUgICAgICAlMmQgICAgICUyZCAgICAgJTJkICAgICAgJTRkICAgICAlZFxuIiwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPkFpZnNuWzBdLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtaW5bMF0sCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21heFswXSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPlR4b3BbMF08PDUsCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5iQUNNWzBdKSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiAgICAgQUNfQksgICAgICAlMmQgICAgICUyZCAgICAgJTJkICAgICAgJTRkICAgICAlZFxuIiwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPkFpZnNuWzFdLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtaW5bMV0sCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21heFsxXSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPlR4b3BbMV08PDUsCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5iQUNNWzFdKSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiAgICAgQUNfVkkgICAgICAlMmQgICAgICUyZCAgICAgJTJkICAgICAgJTRkICAgICAlZFxuIiwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPkFpZnNuWzJdLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtaW5bMl0sCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21heFsyXSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPlR4b3BbMl08PDUsCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5iQUNNWzJdKSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiAgICAgQUNfVk8gICAgICAlMmQgICAgICUyZCAgICAgJTJkICAgICAgJTRkICAgICAlZFxuIiwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPkFpZnNuWzNdLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtaW5bM10sCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21heFszXSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPlR4b3BbM108PDUsCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5iQUNNWzNdKSk7Ci0JCX0KLQl9Ci0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQJQXNpY1NldFNsb3RUaW1lKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIEJPT0xFQU4gYlVzZVNob3J0U2xvdFRpbWUpCi17Ci0JVUxPTkcJU2xvdFRpbWU7Ci0JVUlOVDMyCVJlZ1ZhbHVlID0gMDsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCi0JCWJVc2VTaG9ydFNsb3RUaW1lID0gVFJVRTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCWlmIChiVXNlU2hvcnRTbG90VGltZSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1NMT1RfSU5VU0VEKSkKLQkJcmV0dXJuOwotCWVsc2UgaWYgKCghYlVzZVNob3J0U2xvdFRpbWUpICYmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCkpKQotCQlyZXR1cm47Ci0KLQlpZiAoYlVzZVNob3J0U2xvdFRpbWUpCi0JCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCk7Ci0JZWxzZQotCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCk7Ci0KLQlTbG90VGltZSA9IChiVXNlU2hvcnRTbG90VGltZSk/IDkgOiAyMDsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQkvLyBmb3JjZSB1c2luZyBzaG9ydCBTTE9UIHRpbWUgZm9yIEZBRSB0byBkZW1vIHBlcmZvcm1hbmNlIHdoZW4gVHhCdXJzdCBpcyBPTgotCQlpZiAoKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBGQUxTRSkgJiYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkpKQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJfHwgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBUUlVFKSAmJiAocEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9PSBCQV9OT1RVU0UpKQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJKQotCQl7Ci0JCQkvLyBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgdGhpbmsgaXQgaXMgZG9pbmcgV2ktRmkgdGVzdAotCQkJLy8gQW5kIHdlIHdpbGwgbm90IHNldCB0byBzaG9ydCBzbG90IHdoZW4gYkVuYWJsZVR4QnVyc3QgaXMgVFJVRS4KLQkJfQotCQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkKLQkJewotCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1NMT1RfSU5VU0VEKTsKLQkJCVNsb3RUaW1lID0gOTsKLQkJfQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCS8vCi0JLy8gRm9yIHNvbWUgcmVhc29ucywgYWx3YXlzIHNldCBpdCB0byBzaG9ydCBzbG90IHRpbWUuCi0JLy8KLQkvLyBUb0RvOiBTaG91bGQgY29uc2lkZXIgY2FwYWJpbGl0eSB3aXRoIDExQgotCS8vCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKLQkJewotCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfU0xPVF9JTlVTRUQpOwotCQkJU2xvdFRpbWUgPSAyMDsKLQkJfQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgQktPRkZfU0xPVF9DRkcsICZSZWdWYWx1ZSk7Ci0JUmVnVmFsdWUgPSBSZWdWYWx1ZSAmIDB4RkZGRkZGMDA7Ci0KLQlSZWdWYWx1ZSB8PSBTbG90VGltZTsKLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJLT0ZGX1NMT1RfQ0ZHLCBSZWdWYWx1ZSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUFkZCBTaGFyZWQga2V5IGluZm9ybWF0aW9uIGludG8gQVNJQy4KLQkJVXBkYXRlIHNoYXJlZCBrZXksIFR4TWljIGFuZCBSeE1pYyB0byBBc2ljIFNoYXJlZCBrZXkgdGFibGUKLQkJVXBkYXRlIGl0cyBjaXBoZXJBbGcgdG8gQXNpYyBTaGFyZWQga2V5IE1vZGUuCi0KLSAgICBSZXR1cm46Ci0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBc2ljQWRkU2hhcmVkS2V5RW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIJCSBCc3NJbmRleCwKLQlJTiBVQ0hBUgkJIEtleUlkeCwKLQlJTiBVQ0hBUgkJIENpcGhlckFsZywKLQlJTiBQVUNIQVIJCSBwS2V5LAotCUlOIFBVQ0hBUgkJIHBUeE1pYywKLQlJTiBQVUNIQVIJCSBwUnhNaWMpCi17Ci0JVUxPTkcgb2Zmc2V0OyAvLywgY3NyMDsKLQlTSEFSRURLRVlfTU9ERV9TVFJVQyBjc3IxOwotI2lmZGVmIFJUTVBfTUFDX1BDSQotCUlOVCAgIGk7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljQWRkU2hhcmVkS2V5RW50cnkgQnNzSW5kZXg9JWQsIEtleUlkeD0lZFxuIiwgQnNzSW5kZXgsS2V5SWR4KSk7Ci0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGRTaGFyZWRLZXlFbnRyeTogJXMga2V5ICMlZFxuIiwgQ2lwaGVyTmFtZVtDaXBoZXJBbGddLCBCc3NJbmRleCo0ICsgS2V5SWR4KSk7Ci0JREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIgkJS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJcEtleVswXSxwS2V5WzFdLHBLZXlbMl0scEtleVszXSxwS2V5WzRdLHBLZXlbNV0scEtleVs2XSxwS2V5WzddLHBLZXlbOF0scEtleVs5XSxwS2V5WzEwXSxwS2V5WzExXSxwS2V5WzEyXSxwS2V5WzEzXSxwS2V5WzE0XSxwS2V5WzE1XSkpOwotCWlmIChwUnhNaWMpCi0JewotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiCQlSeCBNSUMgS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQkJcFJ4TWljWzBdLHBSeE1pY1sxXSxwUnhNaWNbMl0scFJ4TWljWzNdLHBSeE1pY1s0XSxwUnhNaWNbNV0scFJ4TWljWzZdLHBSeE1pY1s3XSkpOwotCX0KLQlpZiAocFR4TWljKQotCXsKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIgkJVHggTUlDIEtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCXBUeE1pY1swXSxwVHhNaWNbMV0scFR4TWljWzJdLHBUeE1pY1szXSxwVHhNaWNbNF0scFR4TWljWzVdLHBUeE1pY1s2XSxwVHhNaWNbN10pKTsKLQl9Ci0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JLy8KLQkvLyBmaWxsIGtleSBtYXRlcmlhbCAtIGtleSArIFRYIE1JQyArIFJYIE1JQwotCS8vCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0Jb2Zmc2V0ID0gU0hBUkVEX0tFWV9UQUJMRV9CQVNFICsgKDQqQnNzSW5kZXggKyBLZXlJZHgpKkhXX0tFWV9FTlRSWV9TSVpFOwotCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfU0hBUkVfS0VZOyBpKyspCi0JewotCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBLZXlbaV0pOwotCX0KLQotCW9mZnNldCArPSBNQVhfTEVOX09GX1NIQVJFX0tFWTsKLQlpZiAocFR4TWljKQotCXsKLQkJZm9yIChpPTA7IGk8ODsgaSsrKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBUeE1pY1tpXSk7Ci0JCX0KLQl9Ci0KLQlvZmZzZXQgKz0gODsKLQlpZiAocFJ4TWljKQotCXsKLQkJZm9yIChpPTA7IGk8ODsgaSsrKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBSeE1pY1tpXSk7Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotCS8vCi0JLy8gVXBkYXRlIGNpcGhlciBhbGdvcml0aG0uIFdTVEEgYWx3YXlzIHVzZSBCU1MwCi0JLy8KLQlSVE1QX0lPX1JFQUQzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFKzQqKEJzc0luZGV4LzIpLCAmY3NyMS53b3JkKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJlYWQ6IFNIQVJFRF9LRVlfTU9ERV9CQVNFIGF0IHRoaXMgQnNzWyVkXSBLZXlJZHhbJWRdPSAweCV4IFxuIiwgQnNzSW5kZXgsS2V5SWR4LCBjc3IxLndvcmQpKTsKLQlpZiAoKEJzc0luZGV4JTIpID09IDApCi0JewotCQlpZiAoS2V5SWR4ID09IDApCi0JCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQllbHNlIGlmIChLZXlJZHggPT0gMSkKLQkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCWVsc2UgaWYgKEtleUlkeCA9PSAyKQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJZWxzZQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IENpcGhlckFsZzsKLQl9Ci0JZWxzZQotCXsKLQkJaWYgKEtleUlkeCA9PSAwKQotCQkJY3NyMS5maWVsZC5Cc3MxS2V5MENpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCi0JCQljc3IxLmZpZWxkLkJzczFLZXkxQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQllbHNlIGlmIChLZXlJZHggPT0gMikKLQkJCWNzcjEuZmllbGQuQnNzMUtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCWVsc2UKLQkJCWNzcjEuZmllbGQuQnNzMUtleTNDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JfQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiV3JpdGU6IFNIQVJFRF9LRVlfTU9ERV9CQVNFIGF0IHRoaXMgQnNzWyVkXSA9IDB4JXggXG4iLCBCc3NJbmRleCwgY3NyMS53b3JkKSk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UrNCooQnNzSW5kZXgvMiksIGNzcjEud29yZCk7Ci0KLX0KLQotLy8JSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIEFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUgkJIEJzc0luZGV4LAotCUlOIFVDSEFSCQkgS2V5SWR4KQotewotCS8vVUxPTkcgU2VjQ3NyMDsKLQlTSEFSRURLRVlfTU9ERV9TVFJVQyBjc3IxOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnk6ICMlZCBcbiIsIEJzc0luZGV4KjQgKyBLZXlJZHgpKTsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UrNCooQnNzSW5kZXgvMiksICZjc3IxLndvcmQpOwotCWlmICgoQnNzSW5kZXglMikgPT0gMCkKLQl7Ci0JCWlmIChLZXlJZHggPT0gMCkKLQkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSAwOwotCQllbHNlIGlmIChLZXlJZHggPT0gMSkKLQkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPSAwOwotCQllbHNlIGlmIChLZXlJZHggPT0gMikKLQkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSAwOwotCQllbHNlCi0JCQljc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID0gMDsKLQl9Ci0JZWxzZQotCXsKLQkJaWYgKEtleUlkeCA9PSAwKQotCQkJY3NyMS5maWVsZC5Cc3MxS2V5MENpcGhlckFsZyA9IDA7Ci0JCWVsc2UgaWYgKEtleUlkeCA9PSAxKQotCQkJY3NyMS5maWVsZC5Cc3MxS2V5MUNpcGhlckFsZyA9IDA7Ci0JCWVsc2UgaWYgKEtleUlkeCA9PSAyKQotCQkJY3NyMS5maWVsZC5Cc3MxS2V5MkNpcGhlckFsZyA9IDA7Ci0JCWVsc2UKLQkJCWNzcjEuZmllbGQuQnNzMUtleTNDaXBoZXJBbGcgPSAwOwotCX0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIldyaXRlOiBTSEFSRURfS0VZX01PREVfQkFTRSBhdCB0aGlzIEJzc1slZF0gPSAweCV4IFxuIiwgQnNzSW5kZXgsIGNzcjEud29yZCkpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFKzQqKEJzc0luZGV4LzIpLCBjc3IxLndvcmQpOwotCUFTU0VSVChCc3NJbmRleCA8IDQpOwotCUFTU0VSVChLZXlJZHggPCA0KTsKLQotfQotCi0KLVZPSUQgQXNpY1VwZGF0ZVdDSURBdHRyaWJ1dGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUCQlXQ0lELAotCUlOIFVDSEFSCQlCc3NJbmRleCwKLQlJTiBVQ0hBUiAgICAgICAgQ2lwaGVyQWxnLAotCUlOIEJPT0xFQU4JCWJVc2VQYWlyZXdpc2VLZXlUYWJsZSkKLXsKLQlVTE9ORyAgIFdDSURBdHRyaSA9IDAsIG9mZnNldDsKLQotCS8vCi0JLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlLgotCS8vIE9ubHkgVHhLZXkgY291bGQgdXBkYXRlIFdDSUQgYXR0cmlidXRlLgotCS8vCi0Jb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoV0NJRCAqIEhXX1dDSURfQVRUUklfU0laRSk7Ci0JV0NJREF0dHJpID0gKEJzc0luZGV4IDw8IDQpIHwgKENpcGhlckFsZyA8PCAxKSB8IChiVXNlUGFpcmV3aXNlS2V5VGFibGUpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgV0NJREF0dHJpKTsKLX0KLQotVk9JRCBBc2ljVXBkYXRlV0NJRElWRUlWKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVAkJV0NJRCwKLQlJTiBVTE9ORyAgICAgICAgdUlWLAotCUlOIFVMT05HICAgICAgICB1RUlWKQotewotCVVMT05HCW9mZnNldDsKLQotCW9mZnNldCA9IE1BQ19JVkVJVl9UQUJMRV9CQVNFICsgKFdDSUQgKiBIV19JVkVJVl9FTlRSWV9TSVpFKTsKLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgdUlWKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQgKyA0LCB1RUlWKTsKLX0KLQotVk9JRCBBc2ljVXBkYXRlUnhXQ0lEVGFibGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUCQlXQ0lELAotCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIpCi17Ci0JVUxPTkcgb2Zmc2V0OwotCVVMT05HIEFkZHI7Ci0KLQlvZmZzZXQgPSBNQUNfV0NJRF9CQVNFICsgKFdDSUQgKiBIV19XQ0lEX0VOVFJZX1NJWkUpOwotCUFkZHIgPSBwQWRkclswXSArIChwQWRkclsxXSA8PCA4KSArKHBBZGRyWzJdIDw8IDE2KSArKHBBZGRyWzNdIDw8IDI0KTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIEFkZHIpOwotCUFkZHIgPSBwQWRkcls0XSArIChwQWRkcls1XSA8PCA4KTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQgKyA0LCBBZGRyKTsKLX0KLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IENpcGhlciBLZXksIENpcGhlciBhbGdvcml0aG0sIElWL0VJViB0byBBc2ljCi0KLSAgICBBcmd1bWVudHM6Ci0gICAgICAgIHBBZCAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLSAgICAgICAgV0NJRCAgICAgICAgICAgICAgICAgICAgV0NJRCBFbnRyeSBudW1iZXIuCi0gICAgICAgIEJzc0luZGV4ICAgICAgICAgICAgICAgIEJTU0lEIGluZGV4LCBzdGF0aW9uIG9yIG5vbmUgbXVsdGlwbGUgQlNTSUQgc3VwcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHZhbHVlIHNob3VsZCBiZSAwLgotICAgICAgICBLZXlJZHggICAgICAgICAgICAgICAgICBUaGlzIEtleUlkeCB3aWxsIHNldCB0byBJVidzIEtleUlEIGlmIGJUeEtleSBlbmFibGVkCi0gICAgICAgIHBDaXBoZXJLZXkgICAgICAgICAgICAgIFBvaW50ZXIgdG8gQ2lwaGVyIEtleS4KLSAgICAgICAgYlVzZVBhaXJld2lzZUtleVRhYmxlICAgVFJVRSBtZWFucyBzYXZlZCB0aGUga2V5IGluIFNoYXJlZEtleSB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIFBhaXJld2lzZUtleSB0YWJsZQotICAgICAgICBiVHhLZXkgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSB0cmFuc21pdCBrZXkgaWYgZW5hYmxlZC4KLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgTm9uZQotCi0gICAgTm90ZToKLSAgICAgICAgVGhpcyByb3V0aW5lIHdpbGwgc2V0IHRoZSByZWxhdGl2ZSBrZXkgc3R1ZmYgdG8gQXNpYyBpbmNsdWRpbmcgV0NJRCBhdHRyaWJ1dGUsCi0gICAgICAgIENpcGhlciBLZXksIENpcGhlciBhbGdvcml0aG0gYW5kIElWL0VJVi4KLQotICAgICAgICBJVi9FSVYgd2lsbCBiZSB1cGRhdGUgaWYgdGhpcyBDaXBoZXJLZXkgaXMgdGhlIHRyYW5zbWlzc2lvbiBrZXkgYmVjYXVzZQotICAgICAgICBBU0lDIHdpbGwgYmFzZSBvbiBJVidzIEtleUlEIHZhbHVlIHRvIHNlbGVjdCBDaXBoZXIgS2V5LgotCi0gICAgICAgIElmIGJUeEtleSBzZXRzIHRvIEZBTFNFLCB0aGlzIGlzIG5vdCB0aGUgVFgga2V5LCBidXQgaXQgY291bGQgYmUKLSAgICAgICAgUlgga2V5Ci0KLQlGb3IgQVAgbW9kZSBiVHhLZXkgbXVzdCBiZSBhbHdheXMgc2V0IHRvIFRSVUUuCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBc2ljQWRkS2V5RW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUCQlXQ0lELAotCUlOIFVDSEFSCQlCc3NJbmRleCwKLQlJTiBVQ0hBUgkJS2V5SWR4LAotCUlOIFBDSVBIRVJfS0VZCXBDaXBoZXJLZXksCi0JSU4gQk9PTEVBTgkJYlVzZVBhaXJld2lzZUtleVRhYmxlLAotCUlOIEJPT0xFQU4JCWJUeEtleSkKLXsKLQlVTE9ORwlvZmZzZXQ7Ci0vLwlVTE9ORyAgIFdDSURBdHRyaSA9IDA7Ci0JVUNIQVIJSVY0ID0gMDsKLQlQVUNIQVIJCXBLZXkgPSBwQ2lwaGVyS2V5LT5LZXk7Ci0vLwlVTE9ORwkJS2V5TGVuID0gcENpcGhlcktleS0+S2V5TGVuOwotCVBVQ0hBUgkJcFR4TWljID0gcENpcGhlcktleS0+VHhNaWM7Ci0JUFVDSEFSCQlwUnhNaWMgPSBwQ2lwaGVyS2V5LT5SeE1pYzsKLQlQVUNIQVIJCXBUeHRzYyA9IHBDaXBoZXJLZXktPlR4VHNjOwotCVVDSEFSCQlDaXBoZXJBbGcgPSBwQ2lwaGVyS2V5LT5DaXBoZXJBbGc7Ci0JU0hBUkVES0VZX01PREVfU1RSVUMgY3NyMTsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlVQ0hBUgkJaTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotLy8JQVNTRVJUKEtleUxlbiA8PSBNQVhfTEVOX09GX1BFRVJfS0VZKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBBc2ljQWRkS2V5RW50cnlcbiIpKTsKLQkvLwotCS8vIDEuKSBkZWNpZGUga2V5IHRhYmxlIG9mZnNldAotCS8vCi0JaWYgKGJVc2VQYWlyZXdpc2VLZXlUYWJsZSkKLQkJb2Zmc2V0ID0gUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UgKyAoV0NJRCAqIEhXX0tFWV9FTlRSWV9TSVpFKTsKLQllbHNlCi0JCW9mZnNldCA9IFNIQVJFRF9LRVlfVEFCTEVfQkFTRSArICg0ICogQnNzSW5kZXggKyBLZXlJZHgpICogSFdfS0VZX0VOVFJZX1NJWkU7Ci0KLQkvLwotCS8vIDIuKSBTZXQgS2V5IHRvIEFzaWMKLQkvLwotCS8vZm9yIChpID0gMDsgaSA8IEtleUxlbjsgaSsrKQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX1BFRVJfS0VZOyBpKyspCi0JewotCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBLZXlbaV0pOwotCX0KLQlvZmZzZXQgKz0gTUFYX0xFTl9PRl9QRUVSX0tFWTsKLQotCS8vCi0JLy8gMy4pIFNldCBNSUMga2V5IGlmIGF2YWlsYWJsZQotCS8vCi0JaWYgKHBUeE1pYykKLQl7Ci0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCXsKLQkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcFR4TWljW2ldKTsKLQkJfQotCX0KLQlvZmZzZXQgKz0gTEVOX1RLSVBfVFhNSUNLOwotCi0JaWYgKHBSeE1pYykKLQl7Ci0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCXsKLQkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcFJ4TWljW2ldKTsKLQkJfQotCX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi0JLy8KLQkvLyA0LikgTW9kaWZ5IElWL0VJViBpZiBuZWVkcwotCS8vICAgICBUaGlzIHdpbGwgZm9yY2UgQXNpYyB0byB1c2UgdGhpcyBrZXkgSUQgYnkgc2V0dGluZyBJVi4KLQkvLwotCWlmIChiVHhLZXkpCi0JewotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQlvZmZzZXQgPSBNQUNfSVZFSVZfVEFCTEVfQkFTRSArIChXQ0lEICogSFdfSVZFSVZfRU5UUllfU0laRSk7Ci0JCS8vCi0JCS8vIFdyaXRlIElWCi0JCS8vCi0JCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0LCBwVHh0c2NbMV0pOwotCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIDEsICgocFR4dHNjWzFdIHwgMHgyMCkgJiAweDdmKSk7Ci0JCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgMiwgcFR4dHNjWzBdKTsKLQotCQlJVjQgPSAoS2V5SWR4IDw8IDYpOwotCQlpZiAoKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkgfHwgKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpIHx8KENpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSkKLQkJCUlWNCB8PSAweDIwOyAgLy8gdHVybiBvbiBleHRlbnNpb24gYml0IG1lYW5zIEVJViBleGlzdGVuY2UKLQotCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIDMsIElWNCk7Ci0KLQkJLy8KLQkJLy8gV3JpdGUgRUlWCi0JCS8vCi0JCW9mZnNldCArPSA0OwotCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBUeHRzY1tpICsgMl0pOwotCQl9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQkJQXNpY1VwZGF0ZVdDSURBdHRyaWJ1dGUocEFkLCBXQ0lELCBCc3NJbmRleCwgQ2lwaGVyQWxnLCBiVXNlUGFpcmV3aXNlS2V5VGFibGUpOwotCX0KLQotCWlmICghYlVzZVBhaXJld2lzZUtleVRhYmxlKQotCXsKLQkJLy8KLQkJLy8gT25seSB1cGRhdGUgdGhlIHNoYXJlZCBrZXkgc2VjdXJpdHkgbW9kZQotCQkvLwotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFICsgNCAqIChCc3NJbmRleCAvIDIpLCAmY3NyMS53b3JkKTsKLQkJaWYgKChCc3NJbmRleCAlIDIpID09IDApCi0JCXsKLQkJCWlmIChLZXlJZHggPT0gMCkKLQkJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCi0JCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJCWVsc2UgaWYgKEtleUlkeCA9PSAyKQotCQkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCQllbHNlCi0JCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChLZXlJZHggPT0gMCkKLQkJCQljc3IxLmZpZWxkLkJzczFLZXkwQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCi0JCQkJY3NyMS5maWVsZC5Cc3MxS2V5MUNpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJCWVsc2UgaWYgKEtleUlkeCA9PSAyKQotCQkJCWNzcjEuZmllbGQuQnNzMUtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCQllbHNlCi0JCQkJY3NyMS5maWVsZC5Cc3MxS2V5M0NpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJfQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSArIDQgKiAoQnNzSW5kZXggLyAyKSwgY3NyMS53b3JkKTsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gQXNpY0FkZEtleUVudHJ5XG4iKSk7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJQWRkIFBhaXItd2lzZSBrZXkgbWF0ZXJpYWwgaW50byBBU0lDLgotCQlVcGRhdGUgcGFpcndpc2Uga2V5LCBUeE1pYyBhbmQgUnhNaWMgdG8gQXNpYyBQYWlyLXdpc2Uga2V5IHRhYmxlCi0KLSAgICBSZXR1cm46Ci0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBc2ljQWRkUGFpcndpc2VLZXlFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgICAgICAgIHBBZGRyLAotCUlOIFVDSEFSCQlXQ0lELAotCUlOIENJUEhFUl9LRVkJCSAqcENpcGhlcktleSkKLXsKLQlJTlQgaTsKLQlVTE9ORwkJb2Zmc2V0OwotCVBVQ0hBUgkJIHBLZXkgPSBwQ2lwaGVyS2V5LT5LZXk7Ci0JUFVDSEFSCQkgcFR4TWljID0gcENpcGhlcktleS0+VHhNaWM7Ci0JUFVDSEFSCQkgcFJ4TWljID0gcENpcGhlcktleS0+UnhNaWM7Ci0jaWZkZWYgREJHCi0JVUNIQVIJCUNpcGhlckFsZyA9IHBDaXBoZXJLZXktPkNpcGhlckFsZzsKLSNlbmRpZiAvLyBEQkcgLy8KLQotCS8vIEVLRVkKLQlvZmZzZXQgPSBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRSArIChXQ0lEICogSFdfS0VZX0VOVFJZX1NJWkUpOwotI2lmZGVmIFJUTVBfTUFDX1BDSQotCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfUEVFUl9LRVk7IGkrKykKLQl7Ci0JCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcEtleVtpXSk7Ci0JfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfUEVFUl9LRVk7IGkrPTQpCi0JewotCQlVSU5UMzIgVmFsdWU7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgb2Zmc2V0ICsgaSwgJlZhbHVlKTsKLQl9Ci0KLQlvZmZzZXQgKz0gTUFYX0xFTl9PRl9QRUVSX0tFWTsKLQotCS8vICBNSUMgS0VZCi0JaWYgKHBUeE1pYykKLQl7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCWZvciAoaT0wOyBpPDg7IGkrKykKLQkJewotCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQraSwgcFR4TWljW2ldKTsKLQkJfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCX0KLQlvZmZzZXQgKz0gODsKLQlpZiAocFJ4TWljKQotCXsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJZm9yIChpPTA7IGk8ODsgaSsrKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCtpLCBwUnhNaWNbaV0pOwotCQl9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRkUGFpcndpc2VLZXlFbnRyeTogV0NJRCAjJWQgQWxnPSVzXG4iLFdDSUQsIENpcGhlck5hbWVbQ2lwaGVyQWxnXSkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiCUtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCXBLZXlbMF0scEtleVsxXSxwS2V5WzJdLHBLZXlbM10scEtleVs0XSxwS2V5WzVdLHBLZXlbNl0scEtleVs3XSxwS2V5WzhdLHBLZXlbOV0scEtleVsxMF0scEtleVsxMV0scEtleVsxMl0scEtleVsxM10scEtleVsxNF0scEtleVsxNV0pKTsKLQlpZiAocFJ4TWljKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiCVJ4IE1JQyBLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCQlwUnhNaWNbMF0scFJ4TWljWzFdLHBSeE1pY1syXSxwUnhNaWNbM10scFJ4TWljWzRdLHBSeE1pY1s1XSxwUnhNaWNbNl0scFJ4TWljWzddKSk7Ci0JfQotCWlmIChwVHhNaWMpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIJVHggTUlDIEtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCXBUeE1pY1swXSxwVHhNaWNbMV0scFR4TWljWzJdLHBUeE1pY1szXSxwVHhNaWNbNF0scFR4TWljWzVdLHBUeE1pY1s2XSxwVHhNaWNbN10pKTsKLQl9Ci19Ci0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlSZW1vdmUgUGFpci13aXNlIGtleSBtYXRlcmlhbCBmcm9tIEFTSUMuCi0KLSAgICBSZXR1cm46Ci0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUgkJIEJzc0lkeCwKLQlJTiBVQ0hBUgkJIFdjaWQpCi17Ci0JVUxPTkcJCVdDSURBdHRyaTsKLQlVU0hPUlQJCW9mZnNldDsKLQotCS8vIHJlLXNldCB0aGUgZW50cnkncyBXQ0lEIGF0dHJpYnV0ZSBhcyBPUEVOLU5PTkUuCi0Jb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoV2NpZCAqIEhXX1dDSURfQVRUUklfU0laRSk7Ci0JV0NJREF0dHJpID0gKEJzc0lkeDw8NCkgfCBQQUlSV0lTRUtFWVRBQkxFOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgV0NJREF0dHJpKTsKLX0KLQotQk9PTEVBTiBBc2ljU2VuZENvbW1hbmRUb01jdSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUgkJIENvbW1hbmQsCi0JSU4gVUNIQVIJCSBUb2tlbiwKLQlJTiBVQ0hBUgkJIEFyZzAsCi0JSU4gVUNIQVIJCSBBcmcxKQotewotCi0KLQlpZiAocEFkLT5jaGlwT3BzLnNlbmRDb21tYW5kVG9NY3UpCi0JCXBBZC0+Y2hpcE9wcy5zZW5kQ29tbWFuZFRvTWN1KHBBZCwgQ29tbWFuZCwgVG9rZW4sIEFyZzAsIEFyZzEpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotVk9JRCBBc2ljU2V0UnhBbnQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUNIQVIJCQlBbnQpCi17Ci0jaWZkZWYgUlQzM3h4Ci0JUlQzM3h4U2V0UnhBbnQocEFkLCBBbnQpOwotI2Vsc2UKLSNpZmRlZiBSVDMweHgKLQkvKiBSVDM1NzIgQVRFIG5lZWQgbm90IHRvIGRvIHRoaXMuICovCi0JUlQzMHh4U2V0UnhBbnQocEFkLCBBbnQpOwotI2VuZGlmIC8vIFJUMzB4eCAvLwotI2VuZGlmIC8vIFJUMzN4eCAvLwotfQotCi0KLVZPSUQgQXNpY1R1cm5PZmZSRkNsaygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVQ0hBUgkJQ2hhbm5lbCkKLXsKLQlpZiAocEFkLT5jaGlwT3BzLkFzaWNSZlR1cm5PZmYpCi0JewotCQlwQWQtPmNoaXBPcHMuQXNpY1JmVHVybk9mZihwQWQpOwotCX0KLQllbHNlCi0JewotCQkvLyBSRiBSMiBiaXQgMTggPSAwCi0JCVVJTlQzMgkJCVIxID0gMCwgUjIgPSAwLCBSMyA9IDA7Ci0JCVVDSEFSCQkJaW5kZXg7Ci0JCVJUTVBfUkZfUkVHUwkqUkZSZWdUYWJsZTsKLQotCQlSRlJlZ1RhYmxlID0gUkYyODUwUmVnVGFibGU7Ci0KLQkJc3dpdGNoIChwQWQtPlJmSWNUeXBlKQotCQl7Ci0JCQljYXNlIFJGSUNfMjgyMDoKLQkJCWNhc2UgUkZJQ18yODUwOgotCQkJY2FzZSBSRklDXzI3MjA6Ci0JCQljYXNlIFJGSUNfMjc1MDoKLQotCQkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl8yODUwX0NITkw7IGluZGV4KyspCi0JCQkJewotCQkJCQlpZiAoQ2hhbm5lbCA9PSBSRlJlZ1RhYmxlW2luZGV4XS5DaGFubmVsKQotCQkJCQl7Ci0JCQkJCQlSMSA9IFJGUmVnVGFibGVbaW5kZXhdLlIxICYgMHhmZmZmZGZmZjsKLQkJCQkJCVIyID0gUkZSZWdUYWJsZVtpbmRleF0uUjIgJiAweGZmZmJmZmZmOwotCQkJCQkJUjMgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMyAmIDB4ZmZmM2ZmZmY7Ci0KLQkJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIxKTsKLQkJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIyKTsKLQotCQkJCQkJLy8gUHJvZ3JhbSBSMWIxMyB0byAxLCBSMy9iMTgsMTkgdG8gMCwgUjJiMTggdG8gMC4KLQkJCQkJCS8vIFNldCBSRiBSMiBiaXQxOD0wLCBSMyBiaXRbMTg6MTldPTAKLQkJCQkJCS8vaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKLQkJCQkJCWlmICgxKQotCQkJCQkJewotCQkJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIzKTsKLQotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNUdXJuT2ZmUkZDbGsjJWQoUkY9JWQsICkgLCBSMj0weCUwOHgsICBSMyA9IDB4JTA4eCBcbiIsCi0JCQkJCQkJCUNoYW5uZWwsIHBBZC0+UmZJY1R5cGUsIFIyLCBSMykpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNUdXJuT2ZmUkZDbGsjJWQoUkY9JWQsICkgLCBSMj0weCUwOHggXG4iLAotCQkJCQkJCQlDaGFubmVsLCBwQWQtPlJmSWNUeXBlLCBSMikpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLQotVk9JRCBBc2ljVHVybk9uUkZDbGsoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUNIQVIJCQlDaGFubmVsKQotewotCS8vIFJGIFIyIGJpdCAxOCA9IDAKLQlVSU5UMzIJCQlSMSA9IDAsIFIyID0gMCwgUjMgPSAwOwotCVVDSEFSCQkJaW5kZXg7Ci0JUlRNUF9SRl9SRUdTCSpSRlJlZ1RhYmxlOwotCi0jaWZkZWYgUENJRV9QU19TVVBQT1JUCi0JLy8gVGhlIFJGIHByb2dyYW1taW5nIHNlcXVlbmNlIGlzIGRpZmZlcmVuY2UgYmV0d2VlbiAzeHh4IGFuZCAyeHh4Ci0JaWYgKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkpCi0JewotCQlyZXR1cm47Ci0JfQotI2VuZGlmIC8vIFBDSUVfUFNfU1VQUE9SVCAvLwotCi0JUkZSZWdUYWJsZSA9IFJGMjg1MFJlZ1RhYmxlOwotCi0Jc3dpdGNoIChwQWQtPlJmSWNUeXBlKQotCXsKLQkJY2FzZSBSRklDXzI4MjA6Ci0JCWNhc2UgUkZJQ18yODUwOgotCQljYXNlIFJGSUNfMjcyMDoKLQkJY2FzZSBSRklDXzI3NTA6Ci0KLQkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl8yODUwX0NITkw7IGluZGV4KyspCi0JCQl7Ci0JCQkJaWYgKENoYW5uZWwgPT0gUkZSZWdUYWJsZVtpbmRleF0uQ2hhbm5lbCkKLQkJCQl7Ci0JCQkJCVIzID0gcEFkLT5MYXRjaFJmUmVncy5SMzsKLQkJCQkJUjMgJj0gMHhmZmYzZmZmZjsKLQkJCQkJUjMgfD0gMHgwMDA4MDAwMDsKLQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjMpOwotCi0JCQkJCVIxID0gUkZSZWdUYWJsZVtpbmRleF0uUjE7Ci0JCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIxKTsKLQotCQkJCQlSMiA9IFJGUmVnVGFibGVbaW5kZXhdLlIyOwotCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQotCQkJCQl7Ci0JCQkJCQlSMiB8PSAweDQwMDA7CS8vIElmIFRYcGF0aCBpcyAxLCBiaXQgMTQgPSAxOwotCQkJCQl9Ci0KLQkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKLQkJCQkJewotCQkJCQkJUjIgfD0gMHg0MDsJLy8gd3JpdGUgMSB0byBvZmYgUnhwYXRoLgotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKLQkJCQkJewotCQkJCQkJUjIgfD0gMHgyMDA0MDsJLy8gd3JpdGUgMSB0byBvZmYgUnhQYXRoCi0JCQkJCX0KLQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjIpOwotCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljVHVybk9uUkZDbGsjJWQoUkY9JWQsICkgLCBSMj0weCUwOHhcbiIsCi0JCUNoYW5uZWwsCi0JCXBBZC0+UmZJY1R5cGUsCi0JCVIyKSk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fY2ZnLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fY2ZnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YmU5NzkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX2NmZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0JY21tX2NmZy5jCi0KLSAgICBBYnN0cmFjdDoKLSAgICBSYWxpbmsgV2lGaSBEcml2ZXIgY29uZmlndXJhdGlvbiByZWxhdGVkIHN1YnJvdXRpbmVzCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotY2hhciogR2V0UGh5TW9kZSgKLQlpbnQgTW9kZSkKLXsKLQlzd2l0Y2goTW9kZSkKLQl7Ci0JCWNhc2UgTU9ERV9DQ0s6Ci0JCQlyZXR1cm4gIkNDSyI7Ci0KLQkJY2FzZSBNT0RFX09GRE06Ci0JCQlyZXR1cm4gIk9GRE0iOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQljYXNlIE1PREVfSFRNSVg6Ci0JCQlyZXR1cm4gIkhUTUlYIjsKLQotCQljYXNlIE1PREVfSFRHUkVFTkZJRUxEOgotCQkJcmV0dXJuICJHUkVFTiI7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gIk4vQSI7Ci0JfQotfQotCi0KLWNoYXIqIEdldEJXKAotCWludCBCVykKLXsKLQlzd2l0Y2goQlcpCi0JewotCQljYXNlIEJXXzEwOgotCQkJcmV0dXJuICIxME0iOwotCi0JCWNhc2UgQldfMjA6Ci0JCQlyZXR1cm4gIjIwTSI7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWNhc2UgQldfNDA6Ci0JCQlyZXR1cm4gIjQwTSI7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gIk4vQSI7Ci0JfQotfQotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IENvdW50cnkgUmVnaW9uIHRvIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24uCi0gICAgICAgIFRoaXMgY29tbWFuZCB3aWxsIG5vdCB3b3JrLCBpZiB0aGUgZmllbGQgb2YgQ291bnRyeVJlZ2lvbiBpbiBlZXByb20gaXMgcHJvZ3JhbW1lZC4KLQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFJUX0NmZ1NldENvdW50cnlSZWdpb24oCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gUFNUUklORwkJCWFyZywKLQlJTiBJTlQJCQkJYmFuZCkKLXsKLQlMT05HIHJlZ2lvbiwgcmVnaW9uTWF4OwotCVVDSEFSICpwQ291bnRyeVJlZ2lvbjsKLQotCXJlZ2lvbiA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoYmFuZCA9PSBCQU5EXzI0RykKLQl7Ci0JCXBDb3VudHJ5UmVnaW9uID0gJnBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb247Ci0JCXJlZ2lvbk1heCA9IFJFR0lPTl9NQVhJTVVNX0JHX0JBTkQ7Ci0JfQotCWVsc2UKLQl7Ci0JCXBDb3VudHJ5UmVnaW9uID0gJnBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZDsKLQkJcmVnaW9uTWF4ID0gUkVHSU9OX01BWElNVU1fQV9CQU5EOwotCX0KLQotCS8vIFRPRE86IElzIGl0IG5lY2Nlc2F5IGZvciBmb2xsb3dpbmcgY2hlY2s/Pz8KLQkvLyBDb3VudHJ5IGNhbiBiZSBzZXQgb25seSB3aGVuIEVFUFJPTSBub3QgcHJvZ3JhbW1lZAotCWlmICgqcENvdW50cnlSZWdpb24gJiAweDgwKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQ2ZnU2V0Q291bnRyeVJlZ2lvbigpOkNvdW50cnlSZWdpb24gaW4gZWVwcm9tIHdhcyBwcm9ncmFtbWVkXG4iKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlpZigocmVnaW9uID49IDApICYmIChyZWdpb24gPD0gUkVHSU9OX01BWElNVU1fQkdfQkFORCkpCi0JewotCQkqcENvdW50cnlSZWdpb249IChVQ0hBUikgcmVnaW9uOwotCX0KLQllbHNlIGlmICgocmVnaW9uID09IFJFR0lPTl8zMV9CR19CQU5EKSAmJiAoYmFuZCA9PSBCQU5EXzI0RykpCi0JewotCQkqcENvdW50cnlSZWdpb24gPSAoVUNIQVIpIHJlZ2lvbjsKLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQ2ZnU2V0Q291bnRyeVJlZ2lvbigpOnJlZ2lvbiglbGQpIG91dCBvZiByYW5nZSFcbiIsIHJlZ2lvbikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci0KLX0KLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBXaXJlbGVzcyBNb2RlCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgUlRfQ2ZnU2V0V2lyZWxlc3NNb2RlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JSU5UCQlNYXhQaHlNb2RlID0gUEhZXzExRzsKLQlMT05HCVdpcmVsZXNzTW9kZTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCU1heFBoeU1vZGUgPSBQSFlfMTFOXzVHOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JV2lyZWxlc3NNb2RlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlpZiAoV2lyZWxlc3NNb2RlIDw9IE1heFBoeU1vZGUpCi0JewotCQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gV2lyZWxlc3NNb2RlOwotCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkUGh5TW9kZSA9IFdpcmVsZXNzTW9kZTsKLQkJcmV0dXJuIFRSVUU7Ci0JfQotCi0JcmV0dXJuIEZBTFNFOwotCi19Ci0KLQotSU5UIFJUX0NmZ1NldFNob3J0U2xvdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCUxPTkcgU2hvcnRTbG90OwotCi0JU2hvcnRTbG90ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChTaG9ydFNsb3QgPT0gMSkKLQkJcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSBUUlVFOwotCWVsc2UgaWYgKFNob3J0U2xvdCA9PSAwKQotCQlwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IEZBTFNFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBXRVAgS0VZIGJhc2Ugb24gS2V5SWR4Ci0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJUlRfQ2ZnU2V0V2VwS2V5KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlrZXlTdHJpbmcsCi0JSU4JQ0lQSEVSX0tFWQkJKnBTaGFyZWRLZXksCi0JSU4JSU5UCQkJCWtleUlkeCkKLXsKLQlJTlQJCQkJS2V5TGVuOwotCUlOVAkJCQlpOwotCVVDSEFSCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0JQk9PTEVBTgkJCWJLZXlJc0hleCA9IEZBTFNFOwotCi0JLy8gVE9ETzogU2hhbGwgd2UgZG8gbWVtc2V0IGZvciB0aGUgb3JpZ2luYWwga2V5IGluZm8/PwotCW1lbXNldChwU2hhcmVkS2V5LCAwLCBzaXplb2YoQ0lQSEVSX0tFWSkpOwotCUtleUxlbiA9IHN0cmxlbihrZXlTdHJpbmcpOwotCXN3aXRjaCAoS2V5TGVuKQotCXsKLQkJY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCi0JCWNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCi0JCQliS2V5SXNIZXggPSBGQUxTRTsKLQkJCXBTaGFyZWRLZXktPktleUxlbiA9IEtleUxlbjsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPktleSwga2V5U3RyaW5nLCBLZXlMZW4pOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKLQkJY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCi0JCQlmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCi0JCQl7Ci0JCQkJaWYoICFpc3hkaWdpdCgqKGtleVN0cmluZytpKSkgKQotCQkJCQlyZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7Ci0JCQl9Ci0JCQliS2V5SXNIZXggPSBUUlVFOwotCQkJcFNoYXJlZEtleS0+S2V5TGVuID0gS2V5TGVuLzIgOwotCQkJQXRvSChrZXlTdHJpbmcsIHBTaGFyZWRLZXktPktleSwgcFNoYXJlZEtleS0+S2V5TGVuKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRfQ2ZnU2V0V2VwS2V5KGtleUlkeD0lZCk6SW52YWxpZCBhcmd1bWVudCAoYXJnPSVzKVxuIiwga2V5SWR4LCBrZXlTdHJpbmcpKTsKLQkJCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSAoKEtleUxlbiAlIDUpID8gQ0lQSEVSX1dFUDEyOCA6IENJUEhFUl9XRVA2NCk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRfQ2ZnU2V0V2VwS2V5OihLZXlJZHg9JWQsdHlwZT0lcywgQWxnPSVzKVxuIiwKLQkJCQkJCWtleUlkeCwgKGJLZXlJc0hleCA9PSBGQUxTRSA/ICJBc2NpaSIgOiAiSGV4IiksIENpcGhlck5hbWVbQ2lwaGVyQWxnXSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgV1BBIFBTSyBrZXkKLQotICAgIEFyZ3VtZW50czoKLSAgICAgICAgcEFkYXB0ZXIJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotICAgICAgICBrZXlTdHJpbmcJV1BBIHByZS1zaGFyZWQga2V5IHN0cmluZwotICAgICAgICBwSGFzaFN0cglTdHJpbmcgdXNlZCBmb3IgcGFzc3dvcmQgaGFzaCBmdW5jdGlvbgotICAgICAgICBoYXNoU3RyTGVuCUxlbmdodCBvZiB0aGUgaGFzaCBzdHJpbmcKLSAgICAgICAgcFBNS0J1ZgkJT3V0cHV0IGJ1ZmZlciBvZiBXUEFQU0sga2V5Ci0KLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBSVF9DZmdTZXRXUEFQU0tLZXkoCi0JSU4gUlRNUF9BREFQVEVSCSpwQWQsCi0JSU4gUFNUUklORwkJa2V5U3RyaW5nLAotCUlOIFVDSEFSCQkqcEhhc2hTdHIsCi0JSU4gSU5UCQkJaGFzaFN0ckxlbiwKLQlPVVQgUFVDSEFSCQlwUE1LQnVmKQotewotCWludCBrZXlMZW47Ci0JVUNIQVIga2V5TWF0ZXJpYWxbNDBdOwotCi0Ja2V5TGVuID0gc3RybGVuKGtleVN0cmluZyk7Ci0JaWYgKChrZXlMZW4gPCA4KSB8fCAoa2V5TGVuID4gNjQpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV1BBUFNLIEtleSBsZW5ndGgoJWQpIGVycm9yLCByZXF1aXJlZCA4IH4gNjQgY2hhcmFjdGVycyEoa2V5U3RyPSVzKVxuIiwKLQkJCQkJCQkJCWtleUxlbiwga2V5U3RyaW5nKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQltZW1zZXQocFBNS0J1ZiwgMCwgMzIpOwotCWlmIChrZXlMZW4gPT0gNjQpCi0JewotCSAgICBBdG9IKGtleVN0cmluZywgcFBNS0J1ZiwgMzIpOwotCX0KLQllbHNlCi0JewotCSAgICBQYXNzd29yZEhhc2goa2V5U3RyaW5nLCBwSGFzaFN0ciwgaGFzaFN0ckxlbiwga2V5TWF0ZXJpYWwpOwotCSAgICBOZGlzTW92ZU1lbW9yeShwUE1LQnVmLCBrZXlNYXRlcmlhbCwgMzIpOwotCX0KLQotCXJldHVybiBUUlVFOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX2RhdGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV9kYXRhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNDAwNzEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX2RhdGEuYworKysgL2Rldi9udWxsCkBAIC0xLDI3NjMgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLQljbW1fZGF0YS5jCi0KLSAgICBBYnN0cmFjdDoKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotVUNIQVIJU05BUF84MDJfMUhbXSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKLVVDSEFSCVNOQVBfQlJJREdFX1RVTk5FTFtdID0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4Zjh9OwotLy8gQWRkIENpc2NvIEFpcm9uZXQgU05BUCBoZWFkZSBmb3IgQ0NYMiBzdXBwb3J0Ci1VQ0hBUglTTkFQX0FJUk9ORVRbXSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAwfTsKLVVDSEFSCUNLSVBfTExDX1NOQVBbXSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAyfTsKLVVDSEFSCUVBUE9MX0xMQ19TTkFQW109IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweDhlfTsKLVVDSEFSCUVBUE9MW10gPSB7MHg4OCwgMHg4ZX07Ci1VQ0hBUiAgIFRQSURbXSA9IHsweDgxLCAweDAwfTsgLyogVkxBTiByZWxhdGVkICovCi0KLVVDSEFSCUlQWFtdID0gezB4ODEsIDB4Mzd9OwotVUNIQVIJQVBQTEVfVEFMS1tdID0gezB4ODAsIDB4ZjN9OwotVUNIQVIJUmF0ZUlkVG9QbGNwU2lnbmFsWzEyXSA9IHsKLQkgMCwgLyogUkFURV8xICovCTEsIC8qIFJBVEVfMiAqLwkJMiwgLyogUkFURV81XzUgKi8JMywgLyogUkFURV8xMSAqLwkvLyBzZWUgQkJQIHNwZWMKLQkxMSwgLyogUkFURV82ICovICAgMTUsIC8qIFJBVEVfOSAqLyAgICAxMCwgLyogUkFURV8xMiAqLyAgIDE0LCAvKiBSQVRFXzE4ICovCS8vIHNlZSBJRUVFODAyLjExYS0xOTk5IHAuMTQKLQkgOSwgLyogUkFURV8yNCAqLyAgMTMsIC8qIFJBVEVfMzYgKi8JOCwgLyogUkFURV80OCAqLyAgIDEyICAvKiBSQVRFXzU0ICovIH07IC8vIHNlZSBJRUVFODAyLjExYS0xOTk5IHAuMTQKLQotVUNIQVIJIE9mZG1TaWduYWxUb1JhdGVJZFsxNl0gPSB7Ci0JUkFURV81NCwgIFJBVEVfNTQsCVJBVEVfNTQsICBSQVRFXzU0LAkvLyBPRkRNIFBMQ1AgU2lnbmFsID0gMCwgIDEsICAyLCAgMyByZXNwZWN0aXZlbHkKLQlSQVRFXzU0LCAgUkFURV81NCwJUkFURV81NCwgIFJBVEVfNTQsCS8vIE9GRE0gUExDUCBTaWduYWwgPSA0LCAgNSwgIDYsICA3IHJlc3BlY3RpdmVseQotCVJBVEVfNDgsICBSQVRFXzI0LAlSQVRFXzEyLCAgUkFURV82LAkvLyBPRkRNIFBMQ1AgU2lnbmFsID0gOCwgIDksICAxMCwgMTEgcmVzcGVjdGl2ZWx5Ci0JUkFURV81NCwgIFJBVEVfMzYsCVJBVEVfMTgsICBSQVRFXzksCS8vIE9GRE0gUExDUCBTaWduYWwgPSAxMiwgMTMsIDE0LCAxNSByZXNwZWN0aXZlbHkKLX07Ci0KLVVDSEFSCSBPZmRtUmF0ZVRvUnh3aU1DU1sxMl0gPSB7Ci0JMCwgIDAsCTAsICAwLAotCTAsICAxLAkyLCAgMywJLy8gT0ZETSByYXRlIDYsOSwxMiwxOCA9IHJ4d2kgbWNzIDAsMSwyLDMKLQk0LCAgNSwJNiwgIDcsCS8vIE9GRE0gcmF0ZSAyNCwzNiw0OCw1NCA9IHJ4d2kgbWNzIDQsNSw2LDcKLX07Ci1VQ0hBUgkgUnh3aU1DU1RvT2ZkbVJhdGVbMTJdID0gewotCVJBVEVfNiwgIFJBVEVfOSwJUkFURV8xMiwgIFJBVEVfMTgsCi0JUkFURV8yNCwgIFJBVEVfMzYsCVJBVEVfNDgsICBSQVRFXzU0LAkvLyBPRkRNIHJhdGUgNiw5LDEyLDE4ID0gcnh3aSBtY3MgMCwxLDIsMwotCTQsICA1LAk2LCAgNywJLy8gT0ZETSByYXRlIDI0LDM2LDQ4LDU0ID0gcnh3aSBtY3MgNCw1LDYsNwotfTsKLQotY2hhciogICBNQ1NUb01icHNbXSA9IHsiMU1icHMiLCIyTWJwcyIsIjUuNU1icHMiLCIxMU1icHMiLCIwNk1icHMiLCIwOU1icHMiLCIxMk1icHMiLCIxOE1icHMiLCIyNE1icHMiLCIzNk1icHMiLCI0OE1icHMiLCI1NE1icHMiLCJNTS0wIiwiTU0tMSIsIk1NLTIiLCJNTS0zIiwiTU0tNCIsIk1NLTUiLCJNTS02IiwiTU0tNyIsIk1NLTgiLCJNTS05IiwiTU0tMTAiLCJNTS0xMSIsIk1NLTEyIiwiTU0tMTMiLCJNTS0xNCIsIk1NLTE1IiwiTU0tMzIiLCJlZTEiLCJlZTIiLCJlZTMifTsKLQotVUNIQVIgZGVmYXVsdF9jd21pbltdPXtDV19NSU5fSU5fQklUUywgQ1dfTUlOX0lOX0JJVFMsIENXX01JTl9JTl9CSVRTLTEsIENXX01JTl9JTl9CSVRTLTJ9OwotLy9VQ0hBUiBkZWZhdWx0X2N3bWF4W109e0NXX01BWF9JTl9CSVRTLCBDV19NQVhfSU5fQklUUywgQ1dfTUlOX0lOX0JJVFMsIENXX01JTl9JTl9CSVRTLTF9OwotVUNIQVIgZGVmYXVsdF9zdGFfYWlmc25bXT17Myw3LDIsMn07Ci0KLVVDSEFSIE1hcFVzZXJQcmlvcml0eVRvQWNjZXNzQ2F0ZWdvcnlbOF0gPSB7UUlEX0FDX0JFLCBRSURfQUNfQkssIFFJRF9BQ19CSywgUUlEX0FDX0JFLCBRSURfQUNfVkksIFFJRF9BQ19WSSwgUUlEX0FDX1ZPLCBRSURfQUNfVk99OwotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlBUEkgZm9yIE1MTUUgdG8gdHJhbnNtaXQgbWFuYWdlbWVudCBmcmFtZSB0byBBUCAoQlNTIE1vZGUpCi0Jb3Igc3RhdGlvbiAoSUJTUyBNb2RlKQotCi0JQXJndW1lbnRzOgotCQlwQWQgUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwRGF0YQkJUG9pbnRlciB0byB0aGUgb3V0Z29pbmcgODAyLjExIGZyYW1lCi0JCUxlbmd0aAkJU2l6ZSBvZiBvdXRnb2luZyBtYW5hZ2VtZW50IGZyYW1lCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5ESVNfU1RBVFVTX0ZBSUxVUkUKLQkJTkRJU19TVEFUVVNfUEVORElORwotCQlORElTX1NUQVRVU19TVUNDRVNTCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5ESVNfU1RBVFVTIE1pbmlwb3J0TU1SZXF1ZXN0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJUXVlSWR4LAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVJTlQJCQlMZW5ndGgpCi17Ci0JUE5ESVNfUEFDS0VUCXBQYWNrZXQ7Ci0JTkRJU19TVEFUVVMJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQlVTE9ORwkJCUZyZWVOdW07Ci0JVUNIQVIJCQlydG1wSHdIZHJbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOyAvL1JUTVBfSFdfSERSX0xFTl07Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JdW5zaWduZWQgbG9uZwlJcnFGbGFncyA9IDA7Ci0JVUNIQVIJCQlJcnFTdGF0ZTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQlCT09MRUFOCQkJYlVzZURhdGFRID0gRkFMU0U7Ci0JaW50CQkJcmV0cnlDbnQgPSAwOwotCi0JQVNTRVJUKExlbmd0aCA8PSBNR01UX0RNQV9CVUZGRVJfU0laRSk7Ci0KLQlpZiAoKFF1ZUlkeCAmIE1HTVRfVVNFX1FVRVVFX0ZMQUcpID09IE1HTVRfVVNFX1FVRVVFX0ZMQUcpCi0JewotCQliVXNlRGF0YVEgPSBUUlVFOwotCQlRdWVJZHggJj0gKH5NR01UX1VTRV9RVUVVRV9GTEFHKTsKLQl9Ci0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkvLyAyODYwQyB1c2UgVHggUmluZwotCUlycVN0YXRlID0gcEFkLT5pcnFfZGlzYWJsZWQ7Ci0JaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQotCXsKLQkJUXVlSWR4ID0gKGJVc2VEYXRhUSA9PVRSVUUgPyBRdWVJZHggOiAzKTsKLQkJYlVzZURhdGFRID0gVFJVRTsKLQl9Ci0JaWYgKGJVc2VEYXRhUSAmJiAoIUlycVN0YXRlKSkKLQkJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JZG8KLQl7Ci0JCS8vIFJlc2V0IGlzIGluIHByb2dyZXNzLCBzdG9wIGltbWVkaWF0ZWx5Ci0JCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpIHx8Ci0JCQkgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpfHwKLQkJCSAhUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1NUQVJUX1VQKSkKLQkJewotCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gQ2hlY2sgRnJlZSBwcmlvcml0eSBxdWV1ZQotCQkvLyBTaW5jZSB3ZSB1c2UgUEJGIFF1ZXVlMiBmb3IgbWFuYWdlbWVudCBmcmFtZS4gIEl0cyBjb3JyZXNwb25kaW5nIERNQSByaW5nIHNob3VsZCBiZSB1c2luZyBUeFJpbmcuCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCWlmIChiVXNlRGF0YVEpCi0JCXsKLQkJCXJldHJ5Q250ID0gTUFYX0RBVEFNTV9SRVRSWTsKLQkJCS8vIGZyZWUgVHgoUXVlSWR4KSByZXNvdXJjZXMKLQkJCVJUTVBGcmVlVFhEVXBvblR4RG1hRG9uZShwQWQsIFF1ZUlkeCk7Ci0JCQlGcmVlTnVtID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOwotCQl9Ci0JCWVsc2UKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQkJewotCQkJRnJlZU51bSA9IEdFVF9NR01UUklOR19GUkVFTk8ocEFkKTsKLQkJfQotCi0JCWlmICgoRnJlZU51bSA+IDApKQotCQl7Ci0JCQkvLyBXZSBuZWVkIHRvIHJlc2VydmUgc3BhY2UgZm9yIHJ0bXAgaGFyZHdhcmUgaGVhZGVyLiBpLmUuLCBUeFdJIGZvciBSVDI4NjAgYW5kIFR4SW5mbytUeFdJIGZvciBSVDI4NzAKLQkJCU5kaXNaZXJvTWVtb3J5KCZydG1wSHdIZHIsIChUWElORk9fU0laRSArIFRYV0lfU0laRSkpOwotCQkJU3RhdHVzID0gUlRNUEFsbG9jYXRlTmRpc1BhY2tldChwQWQsICZwUGFja2V0LCAoUFVDSEFSKSZydG1wSHdIZHIsIChUWElORk9fU0laRSArIFRYV0lfU0laRSksIHBEYXRhLCBMZW5ndGgpOwotCQkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiTWluaXBvcnRNTVJlcXVlc3QgKGVycm9yOjogY2FuJ3QgYWxsb2NhdGUgTkRJUyBQQUNLRVQpXG4iKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8vcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKLQkJCS8vcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzI7Ci0KLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQkJaWYgKGJVc2VEYXRhUSkKLQkJCXsKLQkJCQlTdGF0dXMgPSBNbG1lRGF0YUhhcmRUcmFuc21pdChwQWQsIFF1ZUlkeCwgcFBhY2tldCk7Ci0JCQkJcmV0cnlDbnQtLTsKLQkJCX0KLQkJCWVsc2UKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQkJCQlTdGF0dXMgPSBNbG1lSGFyZFRyYW5zbWl0KHBBZCwgUXVlSWR4LCBwUGFja2V0KTsKLQkJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCQlyZXRyeUNudCA9IDA7Ci0JCQllbHNlCi0JCQkJUlRNUEZyZWVOZGlzUGFja2V0KHBBZCwgcFBhY2tldCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50Kys7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCQlpZiAoYlVzZURhdGFRKQotCQkJewotCQkJCXJldHJ5Q250LS07Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicmV0cnlDbnQgJWRcbiIsIHJldHJ5Q250KSk7Ci0JCQkJaWYgKHJldHJ5Q250ID09IDApCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJRaWR4KCVkKSwgbm90IGVub3VnaCBzcGFjZSBpbiBEYXRhUmluZywgTWdtdFJpbmdGdWxsQ291bnQ9JWxkIVxuIiwKLQkJCQkJCQkJCQkJUXVlSWR4LCBwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50KSk7Ci0JCQkJfQotCQkJfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUWlkeCglZCksIG5vdCBlbm91Z2ggc3BhY2UgaW4gTWdtdFJpbmcsIE1nbXRSaW5nRnVsbENvdW50PSVsZCFcbiIsCi0JCQkJCQkJCQkJUXVlSWR4LCBwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50KSk7Ci0KLQotCi0JCX0KLQl9IHdoaWxlIChyZXRyeUNudCA+IDApOwotCi0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlpZiAoYlVzZURhdGFRICYmICghSXJxU3RhdGUpKQotCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCXJldHVybiBTdGF0dXM7Ci19Ci0KLQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlDb3B5IGZyYW1lIGZyb20gd2FpdGluZyBxdWV1ZSBpbnRvIHJlbGF0aXZlIHJpbmcgYnVmZmVyIGFuZCBzZXQKLQlhcHByb3ByaWF0ZSBBU0lDIHJlZ2lzdGVyIHRvIGtpY2sgaGFyZHdhcmUgdHJhbnNtaXQgZnVuY3Rpb24KLQotCUFyZ3VtZW50czoKLQkJcEFkIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcEJ1ZmZlcgkJUG9pbnRlciB0bwltZW1vcnkgb2Ygb3V0Z29pbmcgZnJhbWUKLQkJTGVuZ3RoCQlTaXplIG9mIG91dGdvaW5nIG1hbmFnZW1lbnQgZnJhbWUKLQotCVJldHVybiBWYWx1ZToKLQkJTkRJU19TVEFUVVNfRkFJTFVSRQotCQlORElTX1NUQVRVU19QRU5ESU5HCi0JCU5ESVNfU1RBVFVTX1NVQ0NFU1MKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCVF1ZUlkeCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKLXsKLQlQQUNLRVRfSU5GTwlQYWNrZXRJbmZvOwotCVBVQ0hBUgkJCXBTcmNCdWZWQTsKLQlVSU5UCQkJU3JjQnVmTGVuOwotCVBIRUFERVJfODAyXzExCXBIZWFkZXJfODAyXzExOwotCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgIT0gUkRfTk9STUFMX01PREUpCi0jaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAotI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KLQkJKQotCXsKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0JUlRNUF9RdWVyeVBhY2tldEluZm8ocFBhY2tldCwgJlBhY2tldEluZm8sICZwU3JjQnVmVkEsICZTcmNCdWZMZW4pOwotCWlmIChwU3JjQnVmVkEgPT0gTlVMTCkKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0KLQlwSGVhZGVyXzgwMl8xMSA9IChQSEVBREVSXzgwMl8xMSkgKHBTcmNCdWZWQSArIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFKTsKLQotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JaWYgKCBwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCApCi0JCXJldHVybiBNbG1lSGFyZFRyYW5zbWl0VHhSaW5nKHBBZCxRdWVJZHgscFBhY2tldCk7Ci0JZWxzZQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCQlyZXR1cm4gTWxtZUhhcmRUcmFuc21pdE1nbXRSaW5nKHBBZCxRdWVJZHgscFBhY2tldCk7Ci0KLX0KLQotCi1ORElTX1NUQVRVUyBNbG1lSGFyZFRyYW5zbWl0TWdtdFJpbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJUXVlSWR4LAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQotewotCVBBQ0tFVF9JTkZPCVBhY2tldEluZm87Ci0JUFVDSEFSCQkJcFNyY0J1ZlZBOwotCVVJTlQJCQlTcmNCdWZMZW47Ci0JUEhFQURFUl84MDJfMTEJcEhlYWRlcl84MDJfMTE7Ci0JQk9PTEVBTgkJCWJBY2tSZXF1aXJlZCwgYkluc2VydFRpbWVzdGFtcDsKLQlVQ0hBUgkJCU1sbWVSYXRlOwotCVBUWFdJX1NUUlVDCXBGaXJzdFR4V0k7Ci0JTUFDX1RBQkxFX0VOVFJZCSpwTWFjRW50cnkgPSBOVUxMOwotCVVDSEFSCQkJUElEOwotCi0JUlRNUF9RdWVyeVBhY2tldEluZm8ocFBhY2tldCwgJlBhY2tldEluZm8sICZwU3JjQnVmVkEsICZTcmNCdWZMZW4pOwotCi0JLy8gTWFrZSBzdXJlIE1HTVQgcmluZyByZXNvdXJjZSB3b24ndCBiZSB1c2VkIGJ5IG90aGVyIHRocmVhZHMKLQlSVE1QX1NFTV9MT0NLKCZwQWQtPk1nbXRSaW5nTG9jayk7Ci0JaWYgKHBTcmNCdWZWQSA9PSBOVUxMKQotCXsKLQkJLy8gVGhlIGJ1ZmZlciBzaG91bGRuJ3QgYmUgTlVMTAotCQkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1nbXRSaW5nTG9jayk7Ci0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQkvLyBvdXRnb2luZyBmcmFtZSBhbHdheXMgd2FrZXVwIFBIWSB0byBwcmV2ZW50IGZyYW1lIGxvc3QKLQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0JCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlwRmlyc3RUeFdJID0gKFBUWFdJX1NUUlVDKShwU3JjQnVmVkEgKyAgVFhJTkZPX1NJWkUpOwotCXBIZWFkZXJfODAyXzExID0gKFBIRUFERVJfODAyXzExKSAocFNyY0J1ZlZBICsgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpOyAvL1RYV0lfU0laRSk7Ci0KLQlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkKLQl7Ci0JCU1sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuQmFzaWNNbG1lUmF0ZTsKLQl9Ci0JZWxzZQotCXsKLQkJTWxtZVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKLQl9Ci0KLQkvLyBWZXJpZnkgTWxtZSByYXRlIGZvciBhIC8gZyBiYW5kcy4KLQlpZiAoKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KSAmJiAoTWxtZVJhdGUgPCBSQVRFXzYpKSAvLyAxMUEgYmFuZAotCQlNbG1lUmF0ZSA9IFJBVEVfNjsKLQotCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPT0gQlRZUEVfREFUQSkgJiYKLQkJKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUU9TX05VTEwpKQotCXsKLQkJcE1hY0VudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwSGVhZGVyXzgwMl8xMS0+QWRkcjEpOwotCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQkvLyBGaXhlZCBXNTIgd2l0aCBBY3Rpdml0eSBzY2FuIGlzc3VlIGluIEFCR19NSVhFRCBhbmQgQUJHTl9NSVhFRCBtb2RlLgotCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdfTUlYRUQKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCXx8IHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRAotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkpCi0JCXsKLQkJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkKLQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IDE7Ci0JCQllbHNlCi0JCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSAwOwotCQl9Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JLy8KLQkvLyBTaG91bGQgbm90IGJlIGhhcmQgY29kZSB0byBzZXQgUHdyTWdtdCB0byAwIChQV1JfQUNUSVZFKQotCS8vIFNuaWNlIGl0J3MgYmVlbiBzZXQgdG8gMCB3aGlsZSBvbiBNZ3RNYWNIZWFkZXJJbml0Ci0JLy8gQnkgdGhlIHdheSB0aGlzIHdpbGwgY2F1c2UgZnJhbWUgdG8gYmUgc2VuZCBvbiBQV1JfU0FWRSBmYWlsZWQuCi0JLy8KLQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IFBXUl9BQ1RJVkU7IC8vIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JLy8KLQkvLyBJbiBXTU0tVUFQU0QsIG1sbWUgZnJhbWUgc2hvdWxkIGJlIHNldCBwc20gYXMgcG93ZXIgc2F2aW5nIGJ1dCBwcm9iZSByZXF1ZXN0IGZyYW1lCi0JLy8gRGF0YS1OdWxsIHBhY2tldHMgYWxzZSBwYXNzIHRocm91Z2ggTU1SZXF1ZXN0IGluIFJUMjg2MCwgaG93ZXZlciwgd2UgaG9wZSBjb250cm9sIHRoZSBwc20gYml0IHRvIHBhc3MgQVBTRAotLy8JaWYgKChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSAhPSBCVFlQRV9EQVRBKSAmJiAocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgIT0gQlRZUEVfQ05UTCkpCi0JewotCQlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfQUNUSU9OKSB8fAotCQkJKChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9PSBCVFlQRV9EQVRBKSAmJgotCQkJKChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1FPU19OVUxMKSB8fAotCQkJKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfTlVMTF9GVU5DKSkpKQotCQl7Ci0JCQlpZiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKQotCQkJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7Ci0JCQllbHNlCi0JCQkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlOwotCQl9Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLQotCi0KLQliSW5zZXJ0VGltZXN0YW1wID0gRkFMU0U7Ci0JaWYgKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlID09IEJUWVBFX0NOVEwpIC8vIG11c3QgYmUgUFMtUE9MTAotCXsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJLy9TZXQgUE0gYml0IGluIHBzLXBvbGwsIHRvIGZpeCBXTEsgMS4yICBQb3dlclNhdmVNb2RlX2V4dCBmYWlsdXJlIGlzc3VlLgotCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1BTX1BPTEwpKQotCQl7Ci0JCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IFBXUl9TQVZFOwotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCWJBY2tSZXF1aXJlZCA9IEZBTFNFOwotCX0KLQllbHNlIC8vIEJUWVBFX01HTVQgb3IgQlRZUEVfREFUQShtdXN0IGJlIE5VTEwgZnJhbWUpCi0JewotCQkvL3BBZC0+U2VxdWVuY2UrKzsKLQkJLy9wSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwQWQtPlNlcXVlbmNlOwotCi0JCWlmIChwSGVhZGVyXzgwMl8xMS0+QWRkcjFbMF0gJiAweDAxKSAvLyBNVUxUSUNBU1QsIEJST0FEQ0FTVAotCQl7Ci0JCQliQWNrUmVxdWlyZWQgPSBGQUxTRTsKLQkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IDA7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQliQWNrUmVxdWlyZWQgPSBUUlVFOwotCQkJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gUlRNUENhbGNEdXJhdGlvbihwQWQsIE1sbWVSYXRlLCAxNCk7Ci0JCQlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUFJPQkVfUlNQKSAmJiAocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPT0gQlRZUEVfTUdNVCkpCi0JCQl7Ci0JCQkJYkluc2VydFRpbWVzdGFtcCA9IFRSVUU7Ci0JCQkJYkFja1JlcXVpcmVkID0gRkFMU0U7IC8vIERpc2FibGUgQUNLIHRvIHByZXZlbnQgcmV0cnkgMHgxZiBmb3IgUHJvYmUgUmVzcG9uc2UKLQkJCX0KLQkJCWVsc2UgaWYgKChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1BST0JFX1JFUSkgJiYgKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlID09IEJUWVBFX01HTVQpKQotCQkJewotCQkJCWJBY2tSZXF1aXJlZCA9IEZBTFNFOyAvLyBEaXNhYmxlIEFDSyB0byBwcmV2ZW50IHJldHJ5IDB4MWYgZm9yIFByb2JlIFJlcXVlc3QKLQkJCX0KLQkJfQotCX0KLQotCXBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBBZC0+U2VxdWVuY2UrKzsKLQlpZiAocEFkLT5TZXF1ZW5jZSA+MHhmZmYpCi0JCXBBZC0+U2VxdWVuY2UgPSAwOwotCi0JLy8gQmVmb3JlIHJhZGFyIGRldGVjdGlvbiBkb25lLCBtZ210IGZyYW1lIGNhbiBub3QgYmUgc2VudCBidXQgcHJvYmUgcmVxCi0JLy8gQmVjYXVzZSB3ZSBuZWVkIHRvIHVzZSBwcm9iZSByZXEgdG8gdHJpZ2dlciBkcml2ZXIgdG8gc2VuZCBwcm9iZSByZXEgaW4gcGFzc2l2ZSBzY2FuCi0JaWYgKChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSAhPSBTVUJUWVBFX1BST0JFX1JFUSkKLQkJJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpCi0JCSYmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgIT0gUkRfTk9STUFMX01PREUpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJNbG1lSGFyZFRyYW5zbWl0IC0tPiByYWRhciBkZXRlY3Qgbm90IGluIG5vcm1hbCBtb2RlICEhIVxuIikpOwotLy8JCWlmICghSXJxU3RhdGUpCi0JCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NZ210UmluZ0xvY2spOwotCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCX0KLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBIZWFkZXJfODAyXzExLCBESVJfV1JJVEUsIEZBTFNFKTsKLSNlbmRpZgotCi0JLy8KLQkvLyBmaWxsIHNjYXR0ZXItYW5kLWdhdGhlciBidWZmZXIgbGlzdCBpbnRvIFRYRC4gSW50ZXJuYWxseSBjcmVhdGVkIE5ESVMgUEFDS0VUCi0JLy8gc2hvdWxkIGFsd2F5cyBoYXMgb25seSBvbmUgcGh5c2ljYWwgYnVmZmVyLCBhbmQgdGhlIHdob2xlIGZyYW1lIHNpemUgZXF1YWxzCi0JLy8gdG8gdGhlIGZpcnN0IHNjYXR0ZXIgYnVmZmVyIHNpemUKLQkvLwotCi0JLy8gSW5pdGlhbGl6ZSBUWCBEZXNjcmlwdG9yCi0JLy8gRm9yIGludGVyLWZyYW1lIGdhcCwgdGhlIG51bWJlciBpcyBmb3IgdGhpcyBmcmFtZSBhbmQgbmV4dCBmcmFtZQotCS8vIEZvciBNTE1FIHJhdGUsIHdlIHdpbGwgZml4IGFzIDJNYiB0byBtYXRjaCBvdGhlciB2ZW5kb3IncyBpbXBsZW1lbnQKLS8vCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gMTsKLQotLy8gbWFuYWdlbWVudCBmcmFtZSBkb2Vzbid0IG5lZWQgZW5jcnlwdGlvbi4gc28gdXNlIFJFU0VSVkVEX1dDSUQgbm8gbWF0dGVyIHUgYXJlIHNlbmRpbmcgdG8gc3BlY2lmaWMgd2NpZCBvciBub3QuCi0JUElEID0gUElEX01HTVQ7Ci0KLQotCWlmIChwTWFjRW50cnkgPT0gTlVMTCkKLQl7Ci0JCVJUTVBXcml0ZVR4V0kocEFkLCBwRmlyc3RUeFdJLCBGQUxTRSwgRkFMU0UsIGJJbnNlcnRUaW1lc3RhbXAsIEZBTFNFLCBiQWNrUmVxdWlyZWQsIEZBTFNFLAotCQkwLCBSRVNFUlZFRF9XQ0lELCAoU3JjQnVmTGVuIC0gVFhJTkZPX1NJWkUgLSBUWFdJX1NJWkUpLCBQSUQsIDAsICAoVUNIQVIpcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUywgSUZTX0JBQ0tPRkYsIEZBTFNFLCAmcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0KTsKLQl9Ci0JZWxzZQotCXsKLQkJLyogZG9udCB1c2UgbG93IHJhdGUgdG8gc2VuZCBRb1MgTnVsbCBkYXRhIGZyYW1lICovCi0JCVJUTVBXcml0ZVR4V0kocEFkLCBwRmlyc3RUeFdJLCBGQUxTRSwgRkFMU0UsCi0JCQkJCWJJbnNlcnRUaW1lc3RhbXAsIEZBTFNFLCBiQWNrUmVxdWlyZWQsIEZBTFNFLAotCQkJCQkwLCBwTWFjRW50cnktPkFpZCwgKFNyY0J1ZkxlbiAtIFRYSU5GT19TSVpFIC0gVFhXSV9TSVpFKSwKLQkJCQkJcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTLCAwLAotCQkJCQkoVUNIQVIpcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTLAotCQkJCQlJRlNfQkFDS09GRiwgRkFMU0UsICZwTWFjRW50cnktPk1heEhUUGh5TW9kZSk7Ci0JfQotCi0jaWZkZWYgUlRfQklHX0VORElBTgotCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKXBGaXJzdFR4V0ksIFRZUEVfVFhXSSk7Ci0jZW5kaWYKLQotCS8vIE5vdyBkbyBoYXJkd2FyZS1kZXBlbmVkIGtpY2sgb3V0LgotCUhBTF9LaWNrT3V0TWdtdFR4KHBBZCwgUXVlSWR4LCBwUGFja2V0LCBwU3JjQnVmVkEsIFNyY0J1Zkxlbik7Ci0KLQkvLyBNYWtlIHN1cmUgdG8gcmVsZWFzZSBNR01UIHJpbmcgcmVzb3VyY2UKLS8vCWlmICghSXJxU3RhdGUpCi0JCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NZ210UmluZ0xvY2spOwotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTmV3IERlUXVldWUgUHJvY2VkdXJlcy4KLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIERFUVVFVUVfTE9DSyhsb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpCQkJCVwKLQkJCWRvewkJCQkJCQkJCQkJCQlcCi0JCQkJaWYgKGJJbnRDb250ZXh0ID09IEZBTFNFKQkJCQkJCVwKLQkJCQlSVE1QX0lSUV9MT0NLKChsb2NrKSwgSXJxRmxhZ3MpOwkJXAotCQkJfXdoaWxlKDApCi0KLSNkZWZpbmUgREVRVUVVRV9VTkxPQ0sobG9jaywgYkludENvbnRleHQsIElycUZsYWdzKQkJCQlcCi0JCQlkb3sJCQkJCQkJCQkJCQkJXAotCQkJCWlmIChiSW50Q29udGV4dCA9PSBGQUxTRSkJCQkJCQlcCi0JCQkJCVJUTVBfSVJRX1VOTE9DSygobG9jayksIElycUZsYWdzKTsJXAotCQkJfXdoaWxlKDApCi0KLQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JVHggUGF0aCBkZXNpZ24gYWxnb3JpdGhtOgotCQlCYXNpY2FsbHksIHdlIGRpdmlkZSB0aGUgcGFja2V0cyBpbnRvIGZvdXIgdHlwZXMsIEJyb2FkY2FzdC9NdWx0aWNhc3QsIDExTiBSYXRlKEFNUERVLCBBTVNEVSwgTm9ybWFsKSwgQi9HIFJhdGUoQVJBTElOSywgTm9ybWFsKSwKLQkJU3BlY2lmaWMgUGFja2V0IFR5cGUuIEZvbGxvd2luZyBzaG93IHRoZSBjbGFzc2lmaWNhdGlvbiBydWxlIGFuZCBwb2xpY3kgZm9yIGVhY2gga2luZHMgb2YgcGFja2V0cy4KLQkJCQlDbGFzc2lmaWNhdGlvbiBSdWxlPT4KLQkJCQkJTXVsdGljYXN0OiAoKmFkZHIxICYgMHgwMSkgPT0gMHgwMQotCQkJCQlTcGVjaWZpYyA6IGJESENQRnJhbWUsIGJBUlBGcmFtZSwgYkVBUE9MRnJhbWUsIGV0Yy4KLQkJCQkJMTFOIFJhdGUgOiBJZiBwZWVyIHN1cHBvcnQgSFQKLQkJCQkJCQkJKDEpLkFNUERVICAtLSBJZiBUWEJBIGlzIG5lZ290aWF0ZWQuCi0JCQkJCQkJCSgyKS5BTVNEVSAgLS0gSWYgQU1TRFUgaXMgY2FwYWJsZSBmb3IgYm90aCBwZWVyIGFuZCBvdXJzZWxmLgotCQkJCQkJCQkJCQkqKS4gQU1TRFUgY2FuIGVtYmVkZGVkIGluIGEgQU1QRFUsIGJ1dCBub3cgd2UgZGlkbid0IHN1cHBvcnQgaXQuCi0JCQkJCQkJCSgzKS5Ob3JtYWwgLS0gT3RoZXIgcGFja2V0cyB3aGljaCBzZW5kIGFzIDExbiByYXRlLgotCi0JCQkJCUIvRyBSYXRlIDogSWYgcGVlciBpcyBiL2cgb25seS4KLQkJCQkJCQkJKDEpLkFSQUxJTkstLSBJZiBib3RoIG9mIHBlZXIvdXMgc3VwcHJvdCBSYWxpbmsgcHJvcHJpZXRhcnkgQWdncmVnYXRpb24gYW5kIHRoZSBUeFJhdGUgaXMgbGFyZ2UgdGhhbiBSQVRFXzYKLQkJCQkJCQkJKDIpLk5vcm1hbCAtLSBPdGhlciBwYWNrZXRzIHdoaWNoIHNlbmQgYXMgYi9nIHJhdGUuCi0JCQkJCUZyYWdtZW50OgotCQkJCQkJCQlUaGUgcGFja2V0IG11c3QgYmUgdW5pY2FzdCwgTk9UIEEtUkFMSU5LLCBOT1QgQS1NU0RVLCBOT1QgMTFuLCB0aGVuIGNhbiBjb25zaWRlciBhYm91dCBmcmFnbWVudC4KLQotCQkJCUNsYXNzaWZpZWQgUGFja2V0IEhhbmRsZSBSdWxlPT4KLQkJCQkJTXVsdGljYXN0OgotCQkJCQkJCQlObyBBQ0ssCQkJLy9wVHhCbGstPmJBY2tSZXF1aXJlZCA9IEZBTFNFOwotCQkJCQkJCQlObyBXTU0sCQkJLy9wVHhCbGstPmJXTU0gPSBGQUxTRTsKLQkJCQkJCQkJTm8gcGlnZ3liYWNrLCAgIC8vcFR4QmxrLT5iUGlnZ3lCYWNrID0gRkFMU0U7Ci0JCQkJCQkJCUZvcmNlIExvd1JhdGUsICAvL3BUeEJsay0+YkZvcmNlTG93UmF0ZSA9IFRSVUU7Ci0JCQkJCVNwZWNpZmljIDoJQmFzaWNhbGx5LCBmb3Igc3BlY2lmaWMgcGFja2V0LCB3ZSBzaG91bGQgaGFuZGxlIGl0IHNwZWNpZmljYWxseSwgYnV0IG5vdyBhbGwgc3BlY2lmaWMgcGFja2V0cyBhcmUgdXNlCi0JCQkJCQkJCQl0aGUgc2FtZSBwb2xpY3kgdG8gaGFuZGxlIGl0LgotCQkJCQkJCQlGb3JjZSBMb3dSYXRlLCAgLy9wVHhCbGstPmJGb3JjZUxvd1JhdGUgPSBUUlVFOwotCi0JCQkJCTExTiBSYXRlIDoKLQkJCQkJCQkJTm8gcGlnZ3liYWNrLAkvL3BUeEJsay0+YlBpZ2d5QmFjayA9IEZBTFNFOwotCi0JCQkJCQkJCSgxKS5BTVNEVQotCQkJCQkJCQkJcFR4QmxrLT5iV01NID0gVFJVRTsKLQkJCQkJCQkJKDIpLkFNUERVCi0JCQkJCQkJCQlwVHhCbGstPmJXTU0gPSBUUlVFOwotCQkJCQkJCQkoMykuTm9ybWFsCi0KLQkJCQkJQi9HIFJhdGUgOgotCQkJCQkJCQkoMSkuQVJBTElOSwotCi0JCQkJCQkJCSgyKS5Ob3JtYWwKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgVUNIQVIgVHhQa3RDbGFzc2lmaWNhdGlvbigKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBQTkRJU19QQUNLRVQgIHBQYWNrZXQpCi17Ci0JVUNIQVIJCQlUeEZyYW1lVHlwZSA9IFRYX1VOS09XTl9GUkFNRTsKLQlVQ0hBUgkJCVdjaWQ7Ci0JTUFDX1RBQkxFX0VOVFJZCSpwTWFjRW50cnkgPSBOVUxMOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCUJPT0xFQU4JCQliSFRSYXRlID0gRkFMU0U7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlXY2lkID0gUlRNUF9HRVRfUEFDS0VUX1dDSUQocFBhY2tldCk7Ci0JaWYgKFdjaWQgPT0gTUNBU1RfV0NJRCkKLQl7CS8vIEhhbmRsZSBmb3IgUkEgaXMgQnJvYWRjYXN0L011bHRpY2FzdCBBZGRyZXNzLgotCQlyZXR1cm4gVFhfTUNBU1RfRlJBTUU7Ci0JfQotCi0JLy8gSGFuZGxlIGZvciB1bmljYXN0IHBhY2tldHMKLQlwTWFjRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXTsKLQlpZiAoUlRNUF9HRVRfUEFDS0VUX0xPV1JBVEUocFBhY2tldCkpCi0JewkvLyBJdCdzIGEgc3BlY2lmaWMgcGFja2V0IG5lZWQgdG8gZm9yY2UgbG93IHJhdGUsIGkuZS4sIGJESENQRnJhbWUsIGJFQVBPTEZyYW1lLCBiV0FJRnJhbWUKLQkJVHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7Ci0JfQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCWVsc2UgaWYgKElTX0hUX1JBVEUocE1hY0VudHJ5KSkKLQl7CS8vIGl0J3MgYSAxMW4gY2FwYWJsZSBwYWNrZXQKLQotCQkvLyBEZXBlbmRzIG9uIEhUUGh5TW9kZSB0byBjaGVjayBpZiB0aGUgcGVlciBzdXBwb3J0IHRoZSBIVFJhdGUgdHJhbnNtaXNzaW9uLgotCQkvLwlDdXJyZW50bHkgZGlkbid0IHN1cHBvcnQgQS1NU0RVIGVtYmVkZGVkIGluIEEtTVBEVQotCQliSFRSYXRlID0gVFJVRTsKLQkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KSB8fCAocE1hY0VudHJ5LT5Qc01vZGUgPT0gUFdSX1NBVkUpKQotCQkJVHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7Ci0jaWZkZWYgVUFQU0RfQVBfU1VQUE9SVAotCQllbHNlIGlmIChSVE1QX0dFVF9QQUNLRVRfRU9TUChwUGFja2V0KSkKLQkJCVR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOwotI2VuZGlmIC8vIFVBUFNEX0FQX1NVUFBPUlQgLy8KLQkJZWxzZSBpZigocE1hY0VudHJ5LT5UWEJBYml0bWFwICYgKDE8PChSVE1QX0dFVF9QQUNLRVRfVVAocFBhY2tldCkpKSkgIT0gMCkKLQkJCXJldHVybiBUWF9BTVBEVV9GUkFNRTsKLQkJZWxzZSBpZihDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRCkpCi0JCQlyZXR1cm4gVFhfQU1TRFVfRlJBTUU7Ci0JCWVsc2UKLQkJCVR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOwotCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQllbHNlCi0JewkvLyBpdCdzIGEgbGVnYWN5IGIvZyBwYWNrZXQuCi0JCWlmICgoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19BR0dSRUdBVElPTl9DQVBBQkxFKSAmJiBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKSAmJgotCQkJKFJUTVBfR0VUX1BBQ0tFVF9UWFJBVEUocFBhY2tldCkgPj0gUkFURV82KSAmJgotCQkJKCEoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSkpKQotCQl7CS8vIGlmIHBlZXIgc3VwcG9ydCBSYWxpbmsgQWdncmVnYXRpb24sIHdlIHVzZSBpdC4KLQkJCVR4RnJhbWVUeXBlID0gVFhfUkFMSU5LX0ZSQU1FOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJVHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7Ci0JCX0KLQl9Ci0KLQkvLyBDdXJyZW50bHksIG91ciBmcmFnbWVudCBvbmx5IHN1cHBvcnQgd2hlbiBhIHVuaWNhc3QgcGFja2V0IHNlbmQgYXMgTk9ULUFSQUxJTkssIE5PVC1BTVNEVSBhbmQgTk9ULUFNUERVLgotCWlmICgoUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0KSA+IDEpICYmIChUeEZyYW1lVHlwZSA9PSBUWF9MRUdBQ1lfRlJBTUUpKQotCQlUeEZyYW1lVHlwZSA9IFRYX0ZSQUdfRlJBTUU7Ci0KLQlyZXR1cm4gVHhGcmFtZVR5cGU7Ci19Ci0KLQotQk9PTEVBTiBSVE1QX0ZpbGxUeEJsa0luZm8oCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gVFhfQkxLICpwVHhCbGspCi17Ci0JUEFDS0VUX0lORk8JCQlQYWNrZXRJbmZvOwotCVBORElTX1BBQ0tFVAkJcFBhY2tldDsKLQlQTUFDX1RBQkxFX0VOVFJZCXBNYWNFbnRyeSA9IE5VTEw7Ci0KLQlwUGFja2V0ID0gcFR4QmxrLT5wUGFja2V0OwotCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFR4QmxrLT5wU3JjQnVmSGVhZGVyLCAmcFR4QmxrLT5TcmNCdWZMZW4pOwotCi0JcFR4QmxrLT5XY2lkCQkJCT0gUlRNUF9HRVRfUEFDS0VUX1dDSUQocFBhY2tldCk7Ci0JcFR4QmxrLT5hcGlkeAkJCQk9IFJUTVBfR0VUX1BBQ0tFVF9JRihwUGFja2V0KTsKLQlwVHhCbGstPlVzZXJQcmlvcml0eQkJPSBSVE1QX0dFVF9QQUNLRVRfVVAocFBhY2tldCk7Ci0JcFR4QmxrLT5GcmFtZUdhcCA9IElGU19IVFRYT1A7CQkvLyBBU0lDIGRldGVybWluZSBGcmFtZSBHYXAKLQotCWlmIChSVE1QX0dFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKHBUeEJsay0+cFBhY2tldCkpCi0JCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iQ2xlYXJFQVBGcmFtZSk7Ci0JZWxzZQotCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iQ2xlYXJFQVBGcmFtZSk7Ci0KLQkvLyBEZWZhdWx0IHRvIGNsZWFyIHRoaXMgZmxhZwotCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JGb3JjZU5vblFvUyk7Ci0KLQotCWlmIChwVHhCbGstPldjaWQgPT0gTUNBU1RfV0NJRCkKLQl7Ci0JCXBUeEJsay0+cE1hY0VudHJ5ID0gTlVMTDsKLQkJewotI2lmZGVmIE1DQVNUX1JBVEVfU1BFQ0lGSUMKLQkJCVBVQ0hBUiBwREEgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7Ci0JCQlpZiAoKCgqcERBICYgMHgwMSkgPT0gMHgwMSkgJiYgKCpwREEgIT0gMHhmZikpCi0JCQkJcFR4QmxrLT5wVHJhbnNtaXQgPSAmcEFkLT5Db21tb25DZmcuTUNhc3RQaHlNb2RlOwotCQkJZWxzZQotI2VuZGlmIC8vIE1DQVNUX1JBVEVfU1BFQ0lGSUMgLy8KLQkJCQlwVHhCbGstPnBUcmFuc21pdCA9ICZwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZTsKLQkJfQotCi0JCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7CS8vIEFja1JlcXVpcmVkID0gRkFMU0UsIHdoZW4gYnJvYWRjYXN0IHBhY2tldCBpbiBBZGhvYyBtb2RlLgotCQkvL1RYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iRm9yY2VMb3dSYXRlKTsKLQkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYkFsbG93RnJhZyk7Ci0JCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JXTU0pOwotCQlpZiAoUlRNUF9HRVRfUEFDS0VUX01PUkVEQVRBKHBQYWNrZXQpKQotCQl7Ci0JCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYk1vcmVEYXRhKTsKLQkJfQotCi0JfQotCWVsc2UKLQl7Ci0JCXBUeEJsay0+cE1hY0VudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcFR4QmxrLT5XY2lkXTsKLQkJcFR4QmxrLT5wVHJhbnNtaXQgPSAmcFR4QmxrLT5wTWFjRW50cnktPkhUUGh5TW9kZTsKLQotCQlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKLQotCi0JCS8vIEZvciBhbGwgdW5pY2FzdCBwYWNrZXRzLCBuZWVkIEFjayB1bmxlc3MgdGhlIEFjayBQb2xpY3kgaXMgbm90IHNldCBhcyBOT1JNQUxfQUNLLgotCQlpZiAocEFkLT5Db21tb25DZmcuQWNrUG9saWN5W3BUeEJsay0+UXVlSWR4XSAhPSBOT1JNQUxfQUNLKQotCQkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYkFja1JlcXVpcmVkKTsKLQkJZWxzZQotCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJgotCQkJKEFESE9DX09OKHBBZCkpICYmCi0JCQkoUlhfRklMVEVSX1RFU1RfRkxBRyhwQWQsIGZSWF9GSUxURVJfQUNDRVBUX1BST01JU0NVT1VTKSkpCi0JCXsKLQkJCWlmKHBBZC0+Q29tbW9uQ2ZnLlBTUFhsaW5rKQotCQkJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7Ci0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCQl7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQl7Ci0KLQkJCQkvLyBJZiBzdXBwb3J0IFdNTSwgZW5hYmxlIGl0LgotCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpICYmCi0JCQkJCUNMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpKQotCQkJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSk7Ci0KLS8vCQkJCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCkKLS8vCQkJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfQXV0b1JhdGVTd2l0Y2gpOwotCQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQl9Ci0KLQkJaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfTEVHQUNZX0ZSQU1FKQotCQl7Ci0JCQlpZiAoIChSVE1QX0dFVF9QQUNLRVRfTE9XUkFURShwUGFja2V0KSkgfHwKLSAgICAgICAgICAgICAgICAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkgJiYgKHBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPT0gTU9ERV9DQ0spICYmIChwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gUkFURV8xKSkpCi0JCQl7CS8vIFNwZWNpZmljIHBhY2tldCwgaS5lLiwgYkRIQ1BGcmFtZSwgYkVBUE9MRnJhbWUsIGJXQUlGcmFtZSwgbmVlZCBmb3JjZSBsb3cgcmF0ZS4KLQkJCQlwVHhCbGstPnBUcmFuc21pdCA9ICZwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZTsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCQkvLyBNb2RpZnkgdGhlIFdNTSBiaXQgZm9yIElDViBpc3N1ZS4gSWYgd2UgaGF2ZSBhIHBhY2tldCB3aXRoIEVPU1AgZmllbGQgbmVlZCB0byBzZXQgYXMgMSwgaG93IHRvIGhhbmRsZSBpdD8/PwotCQkJCWlmIChJU19IVF9TVEEocFR4QmxrLT5wTWFjRW50cnkpICYmCi0JCQkJCShDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKSkgJiYKLQkJCQkJKChwQWQtPkNvbW1vbkNmZy5iUmRnID09IFRSVUUpICYmIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpKSkKLQkJCQl7Ci0JCQkJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JXTU0pOwotCQkJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYkZvcmNlTm9uUW9TKTsKLQkJCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQl9Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCWlmICggKElTX0hUX1JBVEUocE1hY0VudHJ5KSA9PSBGQUxTRSkgJiYKLQkJCQkoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19QSUdHWUJBQ0tfQ0FQQUJMRSkpKQotCQkJewkvLyBDdXJyZW50bHkgcGlnZ3ktYmFjayBvbmx5IHN1cHBvcnQgd2hlbiBwZWVyIGlzIG9wZXJhdGUgaW4gYi9nIG1vZGUuCi0JCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JQaWdneUJhY2spOwotCQkJfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JCQlpZiAoUlRNUF9HRVRfUEFDS0VUX01PUkVEQVRBKHBQYWNrZXQpKQotCQkJewotCQkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iTW9yZURhdGEpOwotCQkJfQotI2lmZGVmIFVBUFNEX0FQX1NVUFBPUlQKLQkJCWlmIChSVE1QX0dFVF9QQUNLRVRfRU9TUChwUGFja2V0KSkKLQkJCXsKLQkJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYldNTV9VQVBTRF9FT1NQKTsKLQkJCX0KLSNlbmRpZiAvLyBVQVBTRF9BUF9TVVBQT1JUIC8vCi0JCX0KLQkJZWxzZSBpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9GUkFHX0ZSQU1FKQotCQl7Ci0JCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYkFsbG93RnJhZyk7Ci0JCX0KLQotCQlwTWFjRW50cnktPkRlYnVnVHhDb3VudCsrOwotCX0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLUJPT0xFQU4gQ2FuRG9BZ2dyZWdhdGVUcmFuc21pdCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBORElTX1BBQ0tFVCAqcFBhY2tldCwKLQlJTiBUWF9CTEsJCSpwVHhCbGspCi17Ci0KLQkvL0RCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoZWNrIGlmIGNhbiBkbyBhZ2dyZWdhdGlvbiEgVHhGcmFtZVR5cGU9JWQhXG4iLCBwVHhCbGstPlR4RnJhbWVUeXBlKSk7Ci0KLQlpZiAoUlRNUF9HRVRfUEFDS0VUX1dDSUQocFBhY2tldCkgPT0gTUNBU1RfV0NJRCkKLQkJcmV0dXJuIEZBTFNFOwotCi0JaWYgKFJUTVBfR0VUX1BBQ0tFVF9ESENQKHBQYWNrZXQpIHx8Ci0JCVJUTVBfR0VUX1BBQ0tFVF9FQVBPTChwUGFja2V0KSB8fAotCQlSVE1QX0dFVF9QQUNLRVRfV0FJKHBQYWNrZXQpKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlpZiAoKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1TRFVfRlJBTUUpICYmCi0JCSgocFR4QmxrLT5Ub3RhbEZyYW1lTGVuICsgR0VUX09TX1BLVF9MRU4ocFBhY2tldCkpPiAoUlhfQlVGRkVSX0FHR1JFU0laRSAtIDEwMCkpKQotCXsJLy8gRm9yIEFNU0RVLCBhbGxvdyB0aGUgcGFja2V0cyB3aXRoIHRvdGFsIGxlbmd0aCA8IG1heC1hbXNkdSBzaXplCi0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlpZiAoKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfUkFMSU5LX0ZSQU1FKSAmJgotCQkocFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyID09IDIpKQotCXsJLy8gRm9yIFJBTElOSy1BZ2dyZWdhdGlvbiwgYWxsb3cgdHdvIGZyYW1lcyBpbiBvbmUgYmF0Y2guCi0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlpZiAoKElORlJBX09OKHBBZCkpICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkgLy8gbXVzdCBiZSB1bmljYXN0IHRvIEFQCi0JCXJldHVybiBUUlVFOwotCWVsc2UKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJcmV0dXJuIEZBTFNFOwotCi19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVRvIGRvIHRoZSBlbnF1ZXVlIG9wZXJhdGlvbiBhbmQgZXh0cmFjdCB0aGUgZmlyc3QgaXRlbSBvZiB3YWl0aW5nCi0JCWxpc3QuIElmIGEgbnVtYmVyIG9mIGF2YWlsYWJsZSBzaGFyZWQgbWVtb3J5IHNlZ21lbnRzIGNvdWxkIG1lZXQKLQkJdGhlIHJlcXVlc3Qgb2YgZXh0cmFjdGVkIGl0ZW0sIHRoZSBleHRyYWN0ZWQgaXRlbSB3aWxsIGJlIGZyYWdtZW50ZWQKLQkJaW50byBzaGFyZWQgbWVtb3J5IHNlZ21lbnRzLgotCi0JQXJndW1lbnRzOgotCQlwQWQgUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwUXVldWUJCVBvaW50ZXIgdG8gV2FpdGluZyBRdWV1ZQotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUTVBEZVF1ZXVlUGFja2V0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBCT09MRUFOICAgICAgICAgYkludENvbnRleHQsCi0JSU4gIFVDSEFSCQkJUUlkeCwgLyogQnVsa091dFBpcGVJZCAqLwotCUlOICBVQ0hBUiAgICAgICAgICAgTWF4X1R4X1BhY2tldHMpCi17Ci0JUFFVRVVFX0VOVFJZICAgIHBFbnRyeSA9IE5VTEw7Ci0JUE5ESVNfUEFDS0VUCXBQYWNrZXQ7Ci0JTkRJU19TVEFUVVMgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JVUNIQVIgICAgICAgICAgIENvdW50PTA7Ci0JUFFVRVVFX0hFQURFUiAgIHBRdWV1ZTsKLQlVTE9ORyAgICAgICAgICAgRnJlZU51bWJlcltOVU1fT0ZfVFhfUklOR107Ci0JVUNIQVIJCQlRdWVJZHgsIHNRSWR4LCBlUUlkeDsKLQl1bnNpZ25lZCBsb25nCUlycUZsYWdzID0gMDsKLQlCT09MRUFOCQkJaGFzVHhEZXNjID0gRkFMU0U7Ci0JVFhfQkxLCQkJVHhCbGs7Ci0JVFhfQkxLCQkJKnBUeEJsazsKLQotI2lmZGVmIERCR19ESUFHTk9TRQotCUJPT0xFQU4JCQlmaXJzdFJvdW5kOwotCVJ0bXBEaWFnU3RydWN0CSpwRGlhZ1N0cnVjdCA9ICZwQWQtPkRpYWdTdHJ1Y3Q7Ci0jZW5kaWYKLQotCi0JaWYgKFFJZHggPT0gTlVNX09GX1RYX1JJTkcpCi0JewotCQlzUUlkeCA9IDA7Ci0JCWVRSWR4ID0gMzsJLy8gNCBBQ3MsIHN0YXJ0IGZyb20gMC4KLQl9Ci0JZWxzZQotCXsKLQkJc1FJZHggPSBlUUlkeCA9IFFJZHg7Ci0JfQotCi0JZm9yIChRdWVJZHg9c1FJZHg7IFF1ZUlkeCA8PSBlUUlkeDsgUXVlSWR4KyspCi0JewotCQlDb3VudD0wOwotCi0JCVJUTVBfU1RBUlRfREVRVUVVRShwQWQsIFF1ZUlkeCwgSXJxRmxhZ3MpOwotCi0jaWZkZWYgREJHX0RJQUdOT1NFCi0JCWZpcnN0Um91bmQgPSAoKFF1ZUlkeCA9PSAwKSA/IFRSVUUgOiBGQUxTRSk7Ci0jZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCi0KLQkJd2hpbGUgKDEpCi0JCXsKLQkJCWlmICgoUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyB8Ci0JCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAotCQkJCQkJCQkJCWZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8Ci0JCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKQotCQkJewotCQkJCVJUTVBfU1RPUF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBJcnFGbGFncyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAoQ291bnQgPj0gTWF4X1R4X1BhY2tldHMpCi0JCQkJYnJlYWs7Ci0KLQkJCURFUVVFVUVfTE9DSygmcEFkLT5pcnFfbG9jaywgYkludENvbnRleHQsIElycUZsYWdzKTsKLQkJCWlmICgmcEFkLT5UeFN3UXVldWVbUXVlSWR4XSA9PSBOVUxMKQotCQkJewotI2lmZGVmIERCR19ESUFHTk9TRQotCQkJCWlmIChmaXJzdFJvdW5kID09IFRSVUUpCi0JCQkJCXBEaWFnU3RydWN0LT5UeFNXUXVlQ250W3BEaWFnU3RydWN0LT5BcnJheUN1cklkeF1bMF0rKzsKLSNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KLQkJCQlERVFVRVVFX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgYkludENvbnRleHQsIElycUZsYWdzKTsKLQkJCQlicmVhazsKLQkJCX0KLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQkJRnJlZU51bWJlcltRdWVJZHhdID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOwotCi0jaWZkZWYgREJHX0RJQUdOT1NFCi0JCQlpZiAoZmlyc3RSb3VuZCA9PSBUUlVFKQotCQkJewotCQkJCVVDSEFSCXR4RGVzY051bUxldmVsLCB0eFN3UU51bUxldmVsOwotCi0JCQkJdHhEZXNjTnVtTGV2ZWwgPSAoVFhfUklOR19TSVpFIC0gRnJlZU51bWJlcltRdWVJZHhdKTsgLy8gTnVtYmVyIG9mIG9jY3VwaWVkIGh3IGRlc2MuCi0JCQkJdHhEZXNjTnVtTGV2ZWwgPSAoKHR4RGVzY051bUxldmVsIDw9MTUpID8gdHhEZXNjTnVtTGV2ZWwgOiAxNSk7Ci0JCQkJcERpYWdTdHJ1Y3QtPlR4RGVzY0NudFtwRGlhZ1N0cnVjdC0+QXJyYXlDdXJJZHhdW3R4RGVzY051bUxldmVsXSsrOwotCi0JCQkJdHhTd1FOdW1MZXZlbCA9ICgocEFkLT5UeFN3UXVldWVbUXVlSWR4XS5OdW1iZXIgPD03KSA/IHBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0uTnVtYmVyIDogOCk7Ci0JCQkJcERpYWdTdHJ1Y3QtPlR4U1dRdWVDbnRbcERpYWdTdHJ1Y3QtPkFycmF5Q3VySWR4XVt0eFN3UU51bUxldmVsXSsrOwotCi0JCQkJZmlyc3RSb3VuZCA9IEZBTFNFOwotCQkJfQotI2VuZGlmIC8vIERCR19ESUFHTk9TRSAvLwotCi0JCQlpZiAoRnJlZU51bWJlcltRdWVJZHhdIDw9IDUpCi0JCQl7Ci0JCQkJLy8gZnJlZSBUeChRdWVJZHgpIHJlc291cmNlcwotCQkJCVJUTVBGcmVlVFhEVXBvblR4RG1hRG9uZShwQWQsIFF1ZUlkeCk7Ci0JCQkJRnJlZU51bWJlcltRdWVJZHhdID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOwotCQkJfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JCQkvLyBwcm9iZSB0aGUgUXVldWUgSGVhZAotCQkJcFF1ZXVlID0gJnBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF07Ci0JCQlpZiAoKHBFbnRyeSA9IHBRdWV1ZS0+SGVhZCkgPT0gTlVMTCkKLQkJCXsKLQkJCQlERVFVRVVFX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgYkludENvbnRleHQsIElycUZsYWdzKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJcFR4QmxrID0gJlR4QmxrOwotCQkJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUilwVHhCbGssIHNpemVvZihUWF9CTEspKTsKLQkJCS8vSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CQkvLyBEaWRuJ3QgbmVlZCBpdCBiZWNhdXNlIHdlIGFscmVhZHkgbWVtemVybyBpdC4KLQkJCXBUeEJsay0+UXVlSWR4ID0gUXVlSWR4OwotCi0JCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBFbnRyeSk7Ci0KLQotCQkJLy8gRWFybHkgY2hlY2sgdG8gbWFrZSBzdXJlIHdlIGhhdmUgZW5vZ3VoIFR4IFJlc291cmNlLgotCQkJaGFzVHhEZXNjID0gUlRNUF9IQVNfRU5PVUdIX0ZSRUVfREVTQyhwQWQsIHBUeEJsaywgRnJlZU51bWJlcltRdWVJZHhdLCBwUGFja2V0KTsKLQkJCWlmICghaGFzVHhEZXNjKQotCQkJewotCQkJCXBBZC0+UHJpdmF0ZUluZm8uVHhSaW5nRnVsbENudCsrOwotCi0JCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7Ci0KLQkJCQlicmVhazsKLQkJCX0KLQotCQkJcFR4QmxrLT5UeEZyYW1lVHlwZSA9IFR4UGt0Q2xhc3NpZmljYXRpb24ocEFkLCBwUGFja2V0KTsKLQkJCXBFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZShwUXVldWUpOwotCQkJcFR4QmxrLT5Ub3RhbEZyYW1lTnVtKys7Ci0JCQlwVHhCbGstPlRvdGFsRnJhZ051bSArPSBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpOwkvLyBUaGUgcmVhbCBmcmFnbWVudCBudW1iZXIgbWF5YmUgdmFyeQotCQkJcFR4QmxrLT5Ub3RhbEZyYW1lTGVuICs9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOwotCQkJcFR4QmxrLT5wUGFja2V0ID0gcFBhY2tldDsKLQkJCUluc2VydFRhaWxRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QsIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSk7Ci0KLQkJCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX1JBTElOS19GUkFNRSB8fCBwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNU0RVX0ZSQU1FKQotCQkJewotCQkJCS8vIEVuaGFuY2UgU1cgQWdncmVnYXRpb24gTWVjaGFuaXNtCi0JCQkJaWYgKE5FRURfUVVFVUVfQkFDS19GT1JfQUdHKHBBZCwgUXVlSWR4LCBGcmVlTnVtYmVyW1F1ZUlkeF0sIHBUeEJsay0+VHhGcmFtZVR5cGUpKQotCQkJCXsKLQkJCQkJSW5zZXJ0SGVhZFF1ZXVlKHBRdWV1ZSwgUEFDS0VUX1RPX1FVRVVFX0VOVFJZKHBQYWNrZXQpKTsKLQkJCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWRvewotCQkJCQlpZigocEVudHJ5ID0gcFF1ZXVlLT5IZWFkKSA9PSBOVUxMKQotCQkJCQkJYnJlYWs7Ci0KLQkJCQkJLy8gRm9yIFRYX0FNU0RVX0ZSQU1FL1RYX1JBTElOS19GUkFNRSwgTmVlZCB0byBjaGVjayBpZiBuZXh0IHBha2NldCBjYW4gZG8gYWdncmVnYXRpb24uCi0JCQkJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocEVudHJ5KTsKLQkJCQkJRnJlZU51bWJlcltRdWVJZHhdID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOwotCQkJCQloYXNUeERlc2MgPSBSVE1QX0hBU19FTk9VR0hfRlJFRV9ERVNDKHBBZCwgcFR4QmxrLCBGcmVlTnVtYmVyW1F1ZUlkeF0sIHBQYWNrZXQpOwotCQkJCQlpZiAoKGhhc1R4RGVzYyA9PSBGQUxTRSkgfHwgKENhbkRvQWdncmVnYXRlVHJhbnNtaXQocEFkLCBwUGFja2V0LCBwVHhCbGspID09IEZBTFNFKSkKLQkJCQkJCWJyZWFrOwotCi0JCQkJCS8vUmVtb3ZlIHRoZSBwYWNrZXQgZnJvbSB0aGUgVHhTd1F1ZXVlIGFuZCBpbnNlcnQgaW50byBwVHhCbGsKLQkJCQkJcEVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKHBRdWV1ZSk7Ci0JCQkJCUFTU0VSVChwRW50cnkpOwotCQkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBFbnRyeSk7Ci0JCQkJCXBUeEJsay0+VG90YWxGcmFtZU51bSsrOwotCQkJCQlwVHhCbGstPlRvdGFsRnJhZ051bSArPSBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpOwkvLyBUaGUgcmVhbCBmcmFnbWVudCBudW1iZXIgbWF5YmUgdmFyeQotCQkJCQlwVHhCbGstPlRvdGFsRnJhbWVMZW4gKz0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7Ci0JCQkJCUluc2VydFRhaWxRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QsIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSk7Ci0JCQkJfXdoaWxlKDEpOwotCi0JCQkJaWYgKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlciA9PSAxKQotCQkJCQlwVHhCbGstPlR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOwotCQkJfQotCi0KLQkJCUNvdW50ICs9IHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcjsKLQotCi0JCQkJLy8gRG8gSGFyZFRyYW5zbWl0IG5vdy4KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQkJU3RhdHVzID0gU1RBSGFyZFRyYW5zbWl0KHBBZCwgcFR4QmxrLCBRdWVJZHgpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCQlERVFVRVVFX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgYkludENvbnRleHQsIElycUZsYWdzKTsKLQkJCS8vIHN0YXRpYyByYXRlIGFsc28gbmVlZCBOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMoKSBmdW5jdGlvbi4KLQkJCS8vaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkpCi0JCQkJTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKHBBZCk7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQkJfQotCi0JCVJUTVBfU1RPUF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBJcnFGbGFncyk7Ci0KLQotI2lmZGVmIEJMT0NLX05FVF9JRgotCQlpZiAoKHBBZC0+YmxvY2tRdWV1ZVRhYltRdWVJZHhdLlN3VHhRdWV1ZUJsb2NrRmxhZyA9PSBUUlVFKQotCQkJJiYgKHBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0uTnVtYmVyIDwgMSkpCi0JCXsKLQkJCXJlbGVhc2VOZXRJZigmcEFkLT5ibG9ja1F1ZXVlVGFiW1F1ZUlkeF0pOwotCQl9Ci0jZW5kaWYgLy8gQkxPQ0tfTkVUX0lGIC8vCi0KLQl9Ci0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQ2FsY3VsYXRlcyB0aGUgZHVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gdHJhbnNtaXQgb3V0IGZyYW1lcwotCXdpdGggZ2l2ZW4gc2l6ZSBhbmQgc3BlY2lmaWVkIHJhdGUuCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCVJhdGUJCQlUcmFuc21pdCByYXRlCi0JCVNpemUJCQlGcmFtZSBzaXplIGluIHVuaXRzIG9mIGJ5dGUKLQotCVJldHVybiBWYWx1ZToKLQkJRHVyYXRpb24gbnVtYmVyIGluIHVuaXRzIG9mIHVzZWMKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVVNIT1JUCVJUTVBDYWxjRHVyYXRpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlSYXRlLAotCUlOCVVMT05HCQkJU2l6ZSkKLXsKLQlVTE9ORwlEdXJhdGlvbiA9IDA7Ci0KLQlpZiAoUmF0ZSA8IFJBVEVfRklSU1RfT0ZETV9SQVRFKSAvLyBDQ0sKLQl7Ci0JCWlmICgoUmF0ZSA+IFJBVEVfMSkgJiYgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpKQotCQkJRHVyYXRpb24gPSA5NjsJLy8gNzIrMjQgcHJlYW1ibGUrcGxjcAotCQllbHNlCi0JCQlEdXJhdGlvbiA9IDE5MjsgLy8gMTQ0KzQ4IHByZWFtYmxlK3BsY3AKLQotCQlEdXJhdGlvbiArPSAoVVNIT1JUKSgoU2l6ZSA8PCA0KSAvIFJhdGVJZFRvNTAwS2Jwc1tSYXRlXSk7Ci0JCWlmICgoU2l6ZSA8PCA0KSAlIFJhdGVJZFRvNTAwS2Jwc1tSYXRlXSkKLQkJCUR1cmF0aW9uICsrOwotCX0KLQllbHNlIGlmIChSYXRlIDw9IFJBVEVfTEFTVF9PRkRNX1JBVEUpLy8gT0ZETSByYXRlcwotCXsKLQkJRHVyYXRpb24gPSAyMCArIDY7CQkvLyAxNis0IHByZWFtYmxlK3BsY3AgKyBTaWduYWwgRXh0ZW5zaW9uCi0JCUR1cmF0aW9uICs9IDQgKiAoVVNIT1JUKSgoMTEgKyBTaXplICogNCkgLyBSYXRlSWRUbzUwMEticHNbUmF0ZV0pOwotCQlpZiAoKDExICsgU2l6ZSAqIDQpICUgUmF0ZUlkVG81MDBLYnBzW1JhdGVdKQotCQkJRHVyYXRpb24gKz0gNDsKLQl9Ci0JZWxzZQkvL21pbW8gcmF0ZQotCXsKLQkJRHVyYXRpb24gPSAyMCArIDY7CQkvLyAxNis0IHByZWFtYmxlK3BsY3AgKyBTaWduYWwgRXh0ZW5zaW9uCi0JfQotCi0JcmV0dXJuIChVU0hPUlQpRHVyYXRpb247Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUNhbGN1bGF0ZXMgdGhlIGR1cmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHRyYW5zbWl0IG91dCBmcmFtZXMKLQl3aXRoIGdpdmVuIHNpemUgYW5kIHNwZWNpZmllZCByYXRlLgotCi0JQXJndW1lbnRzOgotCQlwVHhXSQkJUG9pbnRlciB0byBoZWFkIG9mIGVhY2ggTVBEVSB0byBIVy4KLQkJQWNrCQlTZXR0aW5nIGZvciBBY2sgcmVxdWlyZW1lbnQgYml0Ci0JCUZyYWdtZW50CVNldHRpbmcgZm9yIEZyYWdtZW50IGJpdAotCQlSZXRyeU1vZGUJU2V0dGluZyBmb3IgcmV0cnkgbW9kZQotCQlJZnMJCVNldHRpbmcgZm9yIElGUyBnYXAKLQkJUmF0ZQkJU2V0dGluZyBmb3IgdHJhbnNtaXQgcmF0ZQotCQlTZXJ2aWNlCQlTZXR0aW5nIGZvciBzZXJ2aWNlCi0JCUxlbmd0aAkJRnJhbWUgbGVuZ3RoCi0JCVR4UHJlYW1ibGUJU2hvcnQgb3IgTG9uZyBwcmVhbWJsZSB3aGVuIHVzaW5nIENDSyByYXRlcwotCQlRdWVJZHggLSAwLTMsIGFjY29yZGluZyB0byA4MDIuMTFlL2Q0LjQgSnVuZS8yMDAzCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICBTZWUgYWxzbyA6IEJBU21hcnRIYXJkVHJhbnNtaXQoKSAgICAhISEKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUFdyaXRlVHhXSSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVFhXSV9TVFJVQwlwT3V0VHhXSSwKLQlJTglCT09MRUFOCQkJRlJBRywKLQlJTglCT09MRUFOCQkJQ0ZBQ0ssCi0JSU4JQk9PTEVBTgkJCUluc1RpbWVzdGFtcCwKLQlJTglCT09MRUFOCQkJQU1QRFUsCi0JSU4JQk9PTEVBTgkJCUFjaywKLQlJTglCT09MRUFOCQkJTlNlcSwJCS8vIEhXIG5ldyBhIHNlcXVlbmNlLgotCUlOCVVDSEFSCQkJQkFTaXplLAotCUlOCVVDSEFSCQkJV0NJRCwKLQlJTglVTE9ORwkJCUxlbmd0aCwKLQlJTglVQ0hBUgkJCVBJRCwKLQlJTglVQ0hBUgkJCVRJRCwKLQlJTglVQ0hBUgkJCVR4UmF0ZSwKLQlJTglVQ0hBUgkJCVR4b3Btb2RlLAotCUlOCUJPT0xFQU4JCQlDZkFjaywKLQlJTglIVFRSQU5TTUlUX1NFVFRJTkcJKnBUcmFuc21pdCkKLXsKLQlQTUFDX1RBQkxFX0VOVFJZCXBNYWMgPSBOVUxMOwotCVRYV0lfU1RSVUMJCVR4V0k7Ci0JUFRYV0lfU1RSVUMJcFR4V0k7Ci0KLQlpZiAoV0NJRCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQotCQlwTWFjID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbV0NJRF07Ci0KLQkvLwotCS8vIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLgotCS8vIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcwotCS8vCi0JT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKLQlOZGlzWmVyb01lbW9yeSgmVHhXSSwgVFhXSV9TSVpFKTsKLQlwVHhXSSA9ICZUeFdJOwotCi0JcFR4V0ktPkZSQUc9IEZSQUc7Ci0KLQlwVHhXSS0+Q0ZBQ0sgPSBDRkFDSzsKLQlwVHhXSS0+VFM9IEluc1RpbWVzdGFtcDsKLQlwVHhXSS0+QU1QRFUgPSBBTVBEVTsKLQlwVHhXSS0+QUNLID0gQWNrOwotCXBUeFdJLT50eG9wPSBUeG9wbW9kZTsKLQotCXBUeFdJLT5OU0VRID0gTlNlcTsKLQkvLyBKb2huIHR1bmUgdGhlIHBlcmZvcm1hY2Ugd2l0aCBJbnRlbCBDbGllbnQgaW4gMjAgTUh6IHBlcmZvcm1hbmNlCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JQkFTaXplID0gcEFkLT5Db21tb25DZmcuVHhCQVNpemU7Ci0JaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NzIwMjAwKQotCXsKLQkJaWYoIEJBU2l6ZSA+MTMgKQotCQkJQkFTaXplID0xMzsKLQl9Ci0JZWxzZQotCXsKLQkJaWYoIEJBU2l6ZSA+NyApCi0JCQlCQVNpemUgPTc7Ci0JfQotCXBUeFdJLT5CQVdpblNpemUgPSBCQVNpemU7Ci0JcFR4V0ktPlNob3J0R0kgPSBwVHJhbnNtaXQtPmZpZWxkLlNob3J0R0k7Ci0JcFR4V0ktPlNUQkMgPSBwVHJhbnNtaXQtPmZpZWxkLlNUQkM7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlwVHhXSS0+V2lyZWxlc3NDbGlJRCA9IFdDSUQ7Ci0JcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA9IExlbmd0aDsKLQlwVHhXSS0+UGFja2V0SWQgPSBQSUQ7Ci0KLQkvLyBJZiBDQ0sgb3IgT0ZETSwgQlcgbXVzdCBiZSAyMAotCXBUeFdJLT5CVyA9IChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0jaWZkZWYgRE9UMTFOX0RSQUZUMwotCWlmIChwVHhXSS0+QlcpCi0JCXBUeFdJLT5CVyA9IChwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGggPT0gMCkgPyAoQldfMjApIDogKHBUcmFuc21pdC0+ZmllbGQuQlcpOwotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCXBUeFdJLT5NQ1MgPSBwVHJhbnNtaXQtPmZpZWxkLk1DUzsKLQlwVHhXSS0+UEhZTU9ERSA9IHBUcmFuc21pdC0+ZmllbGQuTU9ERTsKLQlwVHhXSS0+Q0ZBQ0sgPSBDZkFjazsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCWlmIChwTWFjKQotCXsKLSAgICAgICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUpCi0gICAgICAgIHsKLQkJaWYgKChwTWFjLT5NbXBzTW9kZSA9PSBNTVBTX0RZTkFNSUMpICYmIChwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpKQotCQkJewotCQkJCS8vIER5bmFtaWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKLQkJCQlwVHhXSS0+TUlNT3BzID0gMTsKLQkJCX0KLQkJCWVsc2UgaWYgKHBNYWMtPk1tcHNNb2RlID09IE1NUFNfU1RBVElDKQotCQkJewotCQkJCS8vIFN0YXRpYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQotCQkJCWlmIChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCAmJiBwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpCi0JCQkJewotCQkJCQlwVHhXSS0+TUNTID0gNzsKLQkJCQkJcFR4V0ktPk1JTU9wcyA9IDA7Ci0JCQkJfQotCQkJfQotICAgICAgICB9Ci0JCS8vcFR4V0ktPk1JTU9wcyA9IChwTWFjLT5Qc01vZGUgPT0gUFdSX01NUFMpPyAxOjA7Ci0JCWlmIChwTWFjLT5iSUFtQmFkQXRoZXJvcyAmJiAocE1hYy0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkpCi0JCXsKLQkJCXBUeFdJLT5NcGR1RGVuc2l0eSA9IDc7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCXBUeFdJLT5NcGR1RGVuc2l0eSA9IHBNYWMtPk1wZHVEZW5zaXR5OwotCX0KLQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlwVHhXSS0+UGFja2V0SWQgPSBwVHhXSS0+TUNTOwotCU5kaXNNb3ZlTWVtb3J5KHBPdXRUeFdJLCAmVHhXSSwgc2l6ZW9mKFRYV0lfU1RSVUMpKTsKLX0KLQotCi1WT0lEIFJUTVBXcml0ZVR4V0lfRGF0YSgKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JT1VUIFBUWFdJX1NUUlVDCQlwVHhXSSwKLQlJTglUWF9CTEsJCQkJKnBUeEJsaykKLXsKLQlIVFRSQU5TTUlUX1NFVFRJTkcJKnBUcmFuc21pdDsKLQlQTUFDX1RBQkxFX0VOVFJZCXBNYWNFbnRyeTsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlVQ0hBUgkJCQlCQVNpemU7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQotCUFTU0VSVChwVHhXSSk7Ci0KLQlwVHJhbnNtaXQgPSBwVHhCbGstPnBUcmFuc21pdDsKLQlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKLQotCi0JLy8KLQkvLyBBbHdheXMgdXNlIExvbmcgcHJlYW1ibGUgYmVmb3JlIHZlcmlmaWF0aW9uIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3Mgd2VsbC4KLQkvLyBUb2RvOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGlmIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3MKLQkvLwotCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7Ci0JTmRpc1plcm9NZW1vcnkocFR4V0ksIFRYV0lfU0laRSk7Ci0KLQlwVHhXSS0+RlJBRwkJPSBUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JBbGxvd0ZyYWcpOwotCXBUeFdJLT5BQ0sJCT0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iQWNrUmVxdWlyZWQpOwotCXBUeFdJLT50eG9wCQk9IHBUeEJsay0+RnJhbWVHYXA7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQlpZiAocE1hY0VudHJ5ICYmCi0JCShwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkgJiYKLQkJKHBNYWNFbnRyeS0+VmFsaWRBc0RscyA9PSBUUlVFKSkKLQkJcFR4V0ktPldpcmVsZXNzQ2xpSUQgPSBCU1NJRF9XQ0lEOwotCWVsc2UKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQlwVHhXSS0+V2lyZWxlc3NDbGlJRAkJPSBwVHhCbGstPldjaWQ7Ci0KLQlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50CT0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5TcmNCdWZMZW47Ci0JcFR4V0ktPkNGQUNLCQkJCT0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iUGlnZ3lCYWNrKTsKLQotCS8vIElmIENDSyBvciBPRkRNLCBCVyBtdXN0IGJlIDIwCi0JcFR4V0ktPkJXID0gKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSNpZmRlZiBET1QxMU5fRFJBRlQzCi0JaWYgKHBUeFdJLT5CVykKLQkJcFR4V0ktPkJXID0gKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCA9PSAwKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7Ci0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotCXBUeFdJLT5BTVBEVQk9ICgocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVBEVV9GUkFNRSkgPyBUUlVFIDogRkFMU0UpOwotCi0JLy8gSm9obiB0dW5lIHRoZSBwZXJmb3JtYWNlIHdpdGggSW50ZWwgQ2xpZW50IGluIDIwIE1IeiBwZXJmb3JtYW5jZQotCUJBU2l6ZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4QkFTaXplOwotCWlmKChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNUERVX0ZSQU1FKSAmJiAocE1hY0VudHJ5KSkKLQl7Ci0JCVVDSEFSCQlSQUJBT3JpSWR4ID0gMDsJLy9UaGUgUkEncyBCQSBPcmlnaW5hdG9yIHRhYmxlIGluZGV4LgotCi0JCVJBQkFPcmlJZHggPSBwVHhCbGstPnBNYWNFbnRyeS0+QkFPcmlXY2lkQXJyYXlbcFR4QmxrLT5Vc2VyUHJpb3JpdHldOwotCQlCQVNpemUgPSBwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtSQUJBT3JpSWR4XS5CQVdpblNpemU7Ci0JfQotCi0KLQlwVHhXSS0+VHhCRiA9IHBUcmFuc21pdC0+ZmllbGQuVHhCRjsKLQlwVHhXSS0+QkFXaW5TaXplID0gQkFTaXplOwotCXBUeFdJLT5TaG9ydEdJID0gcFRyYW5zbWl0LT5maWVsZC5TaG9ydEdJOwotCXBUeFdJLT5TVEJDID0gcFRyYW5zbWl0LT5maWVsZC5TVEJDOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JcFR4V0ktPk1DUyA9IHBUcmFuc21pdC0+ZmllbGQuTUNTOwotCXBUeFdJLT5QSFlNT0RFID0gcFRyYW5zbWl0LT5maWVsZC5NT0RFOwotCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlpZiAocE1hY0VudHJ5KQotCXsKLQkJaWYgKChwTWFjRW50cnktPk1tcHNNb2RlID09IE1NUFNfRFlOQU1JQykgJiYgKHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykpCi0JCXsKLQkJCS8vIER5bmFtaWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKLQkJCXBUeFdJLT5NSU1PcHMgPSAxOwotCQl9Ci0JCWVsc2UgaWYgKHBNYWNFbnRyeS0+TW1wc01vZGUgPT0gTU1QU19TVEFUSUMpCi0JCXsKLQkJCS8vIFN0YXRpYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQotCQkJaWYgKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYICYmIHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykKLQkJCXsKLQkJCQlwVHhXSS0+TUNTID0gNzsKLQkJCQlwVHhXSS0+TUlNT3BzID0gMDsKLQkJCX0KLQkJfQotCi0JCWlmIChwTWFjRW50cnktPmJJQW1CYWRBdGhlcm9zICYmIChwTWFjRW50cnktPldlcFN0YXR1cyAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpKQotCQl7Ci0JCQlwVHhXSS0+TXBkdURlbnNpdHkgPSA3OwotCQl9Ci0JCWVsc2UKLQkJewotCQlwVHhXSS0+TXBkdURlbnNpdHkgPSBwTWFjRW50cnktPk1wZHVEZW5zaXR5OwotCX0KLQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLSNpZmRlZiBEQkdfRElBR05PU0UKLQkJaWYgKHBUeEJsay0+UXVlSWR4PT0gMCkKLQkJewotCQkJcEFkLT5EaWFnU3RydWN0LlR4RGF0YUNudFtwQWQtPkRpYWdTdHJ1Y3QuQXJyYXlDdXJJZHhdKys7Ci0JCQlwQWQtPkRpYWdTdHJ1Y3QuVHhNY3NDbnRbcEFkLT5EaWFnU3RydWN0LkFycmF5Q3VySWR4XVtwVHhXSS0+TUNTXSsrOwotCQl9Ci0jZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCi0KLQkvLyBmb3IgcmF0ZSBhZGFwYXRpb24KLQlwVHhXSS0+UGFja2V0SWQgPSBwVHhXSS0+TUNTOwotI2lmZGVmIElORl9BTUFaT05fU0UKLS8qSXZlcnNvbiBwYXRjaCBmb3IgV01NIEE1LVQwNyAsV2lyZWxlc3NTdGFUb1dpcmVsZXNzU3RhIGRvIG5vdCBidWxrIG91dCBhZ2dyZWdhdGUgKi8KLQlpZiggUlRNUF9HRVRfUEFDS0VUX05PQlVMS09VVChwVHhCbGstPnBQYWNrZXQpKQotCXsKLQkJaWYocFR4V0ktPlBIWU1PREUgPT0gTU9ERV9DQ0spCi0JCXsKLQkJCXBUeFdJLT5QYWNrZXRJZCA9IDY7Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gSU5GX0FNQVpPTl9TRSAvLwotfQotCi0KLVZPSUQgUlRNUFdyaXRlVHhXSV9DYWNoZSgKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JT1VUIFBUWFdJX1NUUlVDCQlwVHhXSSwKLQlJTglUWF9CTEsJCQkJKnBUeEJsaykKLXsKLQlQSFRUUkFOU01JVF9TRVRUSU5HCS8qcFR4SFRQaHlNb2RlLCovIHBUcmFuc21pdDsKLQlQTUFDX1RBQkxFX0VOVFJZCXBNYWNFbnRyeTsKLQotCS8vCi0JLy8gdXBkYXRlIFRYV0kKLQkvLwotCXBNYWNFbnRyeSA9IHBUeEJsay0+cE1hY0VudHJ5OwotCXBUcmFuc21pdCA9IHBUeEJsay0+cFRyYW5zbWl0OwotCi0JLy9pZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSkKLQkvL2lmIChSVE1QQ2hlY2tFbnRyeUVuYWJsZUF1dG9SYXRlU3dpdGNoKHBBZCwgcE1hY0VudHJ5KSkKLQkvL2lmIChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX0F1dG9SYXRlU3dpdGNoKSkKLQlpZiAocE1hY0VudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCkKLQl7Ci0JCXBUeFdJLT50eG9wID0gSUZTX0hUVFhPUDsKLQotCQkvLyBJZiBDQ0sgb3IgT0ZETSwgQlcgbXVzdCBiZSAyMAotCQlwVHhXSS0+QlcgPSAocFRyYW5zbWl0LT5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkgPyAoQldfMjApIDogKHBUcmFuc21pdC0+ZmllbGQuQlcpOwotCQlwVHhXSS0+U2hvcnRHSSA9IHBUcmFuc21pdC0+ZmllbGQuU2hvcnRHSTsKLQkJcFR4V0ktPlNUQkMgPSBwVHJhbnNtaXQtPmZpZWxkLlNUQkM7Ci0KLQkJcFR4V0ktPk1DUyA9IHBUcmFuc21pdC0+ZmllbGQuTUNTOwotCQlwVHhXSS0+UEhZTU9ERSA9IHBUcmFuc21pdC0+ZmllbGQuTU9ERTsKLQotCQkvLyBzZXQgUElEIGZvciBUeFJhdGVTd2l0Y2hpbmcKLQkJcFR4V0ktPlBhY2tldElkID0gcFRyYW5zbWl0LT5maWVsZC5NQ1M7Ci0JfQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JcFR4V0ktPkFNUERVID0gKChwTWFjRW50cnktPk5vQkFEYXRhQ291bnREb3duID09IDApID8gVFJVRTogRkFMU0UpOwotCXBUeFdJLT5NSU1PcHMgPSAwOwotCi0jaWZkZWYgRE9UMTFOX0RSQUZUMwotCWlmIChwVHhXSS0+QlcpCi0JCXBUeFdJLT5CVyA9IChwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGggPT0gMCkgPyAoQldfMjApIDogKHBUcmFuc21pdC0+ZmllbGQuQlcpOwotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLQotICAgIGlmIChwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlKQotICAgIHsKLQkJLy8gTUlNTyBQb3dlciBTYXZlIE1vZGUKLQkJaWYgKChwTWFjRW50cnktPk1tcHNNb2RlID09IE1NUFNfRFlOQU1JQykgJiYgKHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykpCi0JCXsKLQkJCS8vIER5bmFtaWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKLQkJCXBUeFdJLT5NSU1PcHMgPSAxOwotCQl9Ci0JCWVsc2UgaWYgKHBNYWNFbnRyeS0+TW1wc01vZGUgPT0gTU1QU19TVEFUSUMpCi0JCXsKLQkJCS8vIFN0YXRpYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQotCQkJaWYgKChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkgJiYgKHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykpCi0JCQl7Ci0JCQkJcFR4V0ktPk1DUyA9IDc7Ci0JCQkJcFR4V0ktPk1JTU9wcyA9IDA7Ci0JCQl9Ci0JCX0KLSAgICB9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLSNpZmRlZiBEQkdfRElBR05PU0UKLQlpZiAocFR4QmxrLT5RdWVJZHg9PSAwKQotCXsKLQkJcEFkLT5EaWFnU3RydWN0LlR4RGF0YUNudFtwQWQtPkRpYWdTdHJ1Y3QuQXJyYXlDdXJJZHhdKys7Ci0JCXBBZC0+RGlhZ1N0cnVjdC5UeE1jc0NudFtwQWQtPkRpYWdTdHJ1Y3QuQXJyYXlDdXJJZHhdW3BUeFdJLT5NQ1NdKys7Ci0JfQotI2VuZGlmIC8vIERCR19ESUFHTk9TRSAvLwotCi0JcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOwotCi19Ci0KLQotLy8gc2hvdWxkIGJlIGNhbGxlZCBvbmx5IHdoZW4gLQotLy8gMS4gTUVBRElBX0NPTk5FQ1RFRAotLy8gMi4gQUdHUkVHQVRJT05fSU5fVVNFRAotLy8gMy4gRnJhZ21lbnRhdGlvbiBub3QgaW4gdXNlZAotLy8gNC4gZWl0aGVyIG5vIHByZXZpb3VzIGZyYW1lIChwUHJldkFkZHIxPU5VTEwpIC5PUi4gcHJldmlvdWQgZnJhbWUgaXMgYWdncmVnYXRpYmxlCi1CT09MRUFOIFR4RnJhbWVJc0FnZ3JlZ2F0aWJsZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwUHJldkFkZHIxLAotCUlOCVBVQ0hBUgkJCXA4MDIzaGRyKQotewotCi0JLy8gY2FuJ3QgYWdncmVnYXRlIEVBUE9MICg4MDIuMXgpIGZyYW1lCi0JaWYgKChwODAyM2hkclsxMl0gPT0gMHg4OCkgJiYgKHA4MDIzaGRyWzEzXSA9PSAweDhlKSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JLy8gY2FuJ3QgYWdncmVnYXRlIG11bHRpY2FzdC9icm9hZGNhc3QgZnJhbWUKLQlpZiAocDgwMjNoZHJbMF0gJiAweDAxKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlpZiAoSU5GUkFfT04ocEFkKSkgLy8gbXVzdCBiZSB1bmljYXN0IHRvIEFQCi0JCXJldHVybiBUUlVFOwotCWVsc2UgaWYgKChwUHJldkFkZHIxID09IE5VTEwpIHx8IE1BQ19BRERSX0VRVUFMKHBQcmV2QWRkcjEsIHA4MDIzaGRyKSkgLy8gdW5pY2FzdCB0byBzYW1lIFNUQQotCQlyZXR1cm4gVFJVRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkgICBDaGVjayB0aGUgTVNEVSBBZ2dyZWdhdGlvbiBwb2xpY3kKLQkxLkhUIGFnZ3JlZ2F0aW9uIGlzIEEtTVNEVQotCTIubGVnYWFjeSByYXRlIGFnZ3JlZ2F0aW9uIGlzIHNvZnR3YXJlIGFnZ3JlZ2F0aW9uIGJ5IFJhbGluay4KLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1CT09MRUFOIFBlZXJJc0FnZ3JlT24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUxPTkcJCSAgIFR4UmF0ZSwKLQlJTglQTUFDX1RBQkxFX0VOVFJZIHBNYWNFbnRyeSkKLXsKLQlVTE9ORwlBRmxhZ3MgPSAoZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VEIHwgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSk7Ci0KLQlpZiAocE1hY0VudHJ5ICE9IE5VTEwgJiYgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBBRmxhZ3MpKQotCXsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJaWYgKHBNYWNFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKLQkJewotCQkJcmV0dXJuIFRSVUU7Ci0JCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKLQkJaWYgKFR4UmF0ZSA+PSBSQVRFXzYgJiYgcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSAmJiAoIShPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpICYmIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpKSkpCi0JCXsJLy8gbGVnYWN5ICBSYWxpbmsgQWdncmVnYXRpb24gc3VwcG9ydAotCQkJcmV0dXJuIFRSVUU7Ci0JCX0KLSNlbmRpZiAvLyBBR0dSRUdBVElPTl9TVVBQT1JUIC8vCi0JfQotCi0JcmV0dXJuIEZBTFNFOwotCi19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUNoZWNrIGFuZCBmaW5lIHRoZSBwYWNrZXQgd2FpdGluZyBpbiBTVyBxdWV1ZSB3aXRoIGhpZ2hlc3QgcHJpb3JpdHkKLQotCUFyZ3VtZW50czoKLQkJcEFkIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJcFF1ZXVlCQlQb2ludGVyIHRvIFdhaXRpbmcgUXVldWUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVBRVUVVRV9IRUFERVIJUlRNUENoZWNrVHhTd1F1ZXVlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVCBQVUNIQVIJCQlwUXVlSWR4KQotewotCi0JVUxPTkcJTnVtYmVyOwotCS8vIDIwMDQtMTEtMTUgdG8gYmUgcmVtb3ZlZC4gdGVzdCBhZ2dyZWdhdGlvbiBvbmx5Ci0vLwlpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKSkgJiYgKCpwTnVtYmVyIDwgMikpCi0vLwkJIHJldHVybiBOVUxMOwotCi0JTnVtYmVyID0gcEFkLT5UeFN3UXVldWVbUUlEX0FDX0JLXS5OdW1iZXIKLQkJCSArIHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0uTnVtYmVyCi0JCQkgKyBwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVkldLk51bWJlcgotCQkJICsgcEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZPXS5OdW1iZXI7Ci0JCQkgLyorIHBBZC0+VHhTd1F1ZXVlW1FJRF9IQ0NBXS5OdW1iZXI7Ki8KLQotCWlmIChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dLkhlYWQgIT0gTlVMTCkKLQl7Ci0JCSpwUXVlSWR4ID0gUUlEX0FDX1ZPOwotCQlyZXR1cm4gKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dKTsKLQl9Ci0JZWxzZSBpZiAocEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXS5IZWFkICE9IE5VTEwpCi0JewotCQkqcFF1ZUlkeCA9IFFJRF9BQ19WSTsKLQkJcmV0dXJuICgmcEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXSk7Ci0JfQotCWVsc2UgaWYgKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0uSGVhZCAhPSBOVUxMKQotCXsKLQkJKnBRdWVJZHggPSBRSURfQUNfQkU7Ci0JCXJldHVybiAoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0pOwotCX0KLQllbHNlIGlmIChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdLkhlYWQgIT0gTlVMTCkKLQl7Ci0JCSpwUXVlSWR4ID0gUUlEX0FDX0JLOwotCQlyZXR1cm4gKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdKTsKLQl9Ci0JLyoKLQllbHNlIGlmIChwQWQtPlR4U3dRdWV1ZVtRSURfSENDQV0uSGVhZCAhPSBOVUxMKQotCXsKLQkJKnBRdWVJZHggPSBRSURfSENDQTsKLQkJcmV0dXJuICgmcEFkLT5UeFN3UXVldWVbUUlEX0hDQ0FdKTsKLQl9Ci0JKi8KLQotCS8vIE5vIHBhY2tldCBwZW5kaW5nIGluIFR4IFN3IHF1ZXVlCi0JKnBRdWVJZHggPSBRSURfQUNfQks7Ci0KLQlyZXR1cm4gKE5VTEwpOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlTdXNwZW5kIE1TRFUgdHJhbnNtaXNzaW9uCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBTdXNwZW5kTXNkdVRyYW5zbWlzc2lvbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNDQU5OSU5HLCBzdXNwZW5kIE1TRFUgdHJhbnNtaXNzaW9uIC4uLlxuIikpOwotCi0KLQkvLwotCS8vIEJlZm9yZSBCU1NfU0NBTl9JTl9QUk9HUkVTUywgd2UgbmVlZCB0byBrZWVwIEN1cnJlbnQgUjY2IHZhbHVlIGFuZAotCS8vIHVzZSBMb3dib3VuZCBhcyBSNjYgdmFsdWUgb24gU2Nhbk5leHRDaGFubmVsKC4uLikKLQkvLwotCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsICZwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUpOwotCi0JLy8gc2V0IEJCUF9SNjYgdG8gMHgzMC8weDQwIHdoZW4gc2Nhbm5pbmcgKEFzaWNTd2l0Y2hDaGFubmVsIHdpbGwgc2V0IFI2NiBhY2NvcmRpbmcgdG8gY2hhbm5lbCB3aGVuIHNjYW5uaW5nKQotCS8vUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsICgweDI2ICsgR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQlSVE1QU2V0QUdDSW5pdFZhbHVlKHBBZCwgQldfMjApOwotCi0JUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOwotCS8vUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ05UTF9DU1IsIDB4MDAwZjAwMDApOwkJLy8gYWJvcnQgYWxsIFRYIHJpbmdzCi19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVJlc3VtZSBNU0RVIHRyYW5zbWlzc2lvbgotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotLy8gICAgVUNIQVIJCQlJcnFTdGF0ZTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU0NBTiBkb25lLCByZXN1bWUgTVNEVSB0cmFuc21pc3Npb24gLi4uXG4iKSk7Ci0KLQotCS8vIEFmdGVyIGZpbmlzaCBCU1NfU0NBTl9JTl9QUk9HUkVTUywgd2UgbmVlZCB0byByZXN0b3JlIEN1cnJlbnQgUjY2IHZhbHVlCi0JLy8gUjY2IHNob3VsZCBub3QgYmUgMAotCWlmIChwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUgPT0gMCkKLQl7Ci0JCXBBZC0+QmJwVHVuaW5nLlI2NkN1cnJlbnRWYWx1ZSA9IDB4Mzg7Ci0JCURCR1BSSU5UX0VSUigoIlJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uLCBSNjZDdXJyZW50VmFsdWU9MC4uLlxuIikpOwotCX0KLQotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlKTsKLQotCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOwotLy8gc2FtcGxlLCBmb3IgSVJRIExPQ0sgdG8gU0VNIExPQ0sKLS8vICAgIElycVN0YXRlID0gcEFkLT5pcnFfZGlzYWJsZWQ7Ci0vLwlpZiAoSXJxU3RhdGUpCi0vLwkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBUUlVFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOwotLy8gICAgZWxzZQotCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7Ci19Ci0KLQotVUlOVCBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlQTkRJU19QQUNLRVQJCXBQYWNrZXQsCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4JVUxPTkcJCQlEYXRhU2l6ZSkKLXsKLQlVU0hPUlQJCQlQYXlsb2FkU2l6ZTsKLQlVU0hPUlQJCQlTdWJGcmFtZVNpemU7Ci0JUEhFQURFUl84MDJfMwlwQU1TRFVzdWJoZWFkZXI7Ci0JVUlOVAkJCW5NU0RVOwotICAgIFVDSEFSCQkJSGVhZGVyODAyXzNbMTRdOwotCi0JUFVDSEFSCQkJcFBheWxvYWQsIHBEQSwgcFNBLCBwUmVtb3ZlZExMQ1NOQVA7Ci0JUE5ESVNfUEFDS0VUCXBDbG9uZVBhY2tldDsKLQotCi0KLQluTVNEVSA9IDA7Ci0KLQl3aGlsZSAoRGF0YVNpemUgPiBMRU5HVEhfODAyXzMpCi0JewotCi0JCW5NU0RVKys7Ci0KLQkJLy9oZXhfZHVtcCgic3ViaGVhZGVyIiwgcERhdGEsIDY0KTsKLQkJcEFNU0RVc3ViaGVhZGVyID0gKFBIRUFERVJfODAyXzMpcERhdGE7Ci0JCS8vcERhdGEgKz0gTEVOR1RIXzgwMl8zOwotCQlQYXlsb2FkU2l6ZSA9IHBBTVNEVXN1YmhlYWRlci0+T2N0ZXRbMV0gKyAocEFNU0RVc3ViaGVhZGVyLT5PY3RldFswXTw8OCk7Ci0JCVN1YkZyYW1lU2l6ZSA9IFBheWxvYWRTaXplICsgTEVOR1RIXzgwMl8zOwotCi0KLQkJaWYgKChEYXRhU2l6ZSA8IFN1YkZyYW1lU2l6ZSkgfHwgKFBheWxvYWRTaXplID4gMTUxOCApKQotCQl7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8vREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlZCBzdWJmcmFtZTogU2l6ZSA9ICVkXG4iLCAgbk1TRFUsIFBheWxvYWRTaXplKSk7Ci0KLQkJcFBheWxvYWQgPSBwRGF0YSArIExFTkdUSF84MDJfMzsKLQkJcERBID0gcERhdGE7Ci0JCXBTQSA9IHBEYXRhICsgTUFDX0FERFJfTEVOOwotCi0JCS8vIGNvbnZlcnQgdG8gODAyLjMgaGVhZGVyCi0gICAgICAgIENPTlZFUlRfVE9fODAyXzMoSGVhZGVyODAyXzMsIHBEQSwgcFNBLCBwUGF5bG9hZCwgUGF5bG9hZFNpemUsIHBSZW1vdmVkTExDU05BUCk7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJaWYgKChIZWFkZXI4MDJfM1sxMl0gPT0gMHg4OCkgJiYgKEhlYWRlcjgwMl8zWzEzXSA9PSAweDhFKSApCi0JCXsKLQkJCS8qIGF2b2lkIGxvY2FsIGhlYXAgb3ZlcmZsb3csIHVzZSBkeWFuYW1pYyBhbGxvY2F0aW9uICovCi0JCSAgIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOwotCQkJaWYgKEVsZW0gIT0gTlVMTCkKLQkJCXsKLQkJCQltZW1tb3ZlKEVsZW0tPk1zZysoTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IKSwgcFBheWxvYWQsIFBheWxvYWRTaXplKTsKLQkJCQlFbGVtLT5Nc2dMZW4gPSBMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0ggKyBQYXlsb2FkU2l6ZTsKLQkJCQkvL1dwYUVBUE9MS2V5QWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQkJUkVQT1JUX01HTVRfRlJBTUVfVE9fTUxNRShwQWQsIEJTU0lEX1dDSUQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAwLCAwLCAwLCAwKTsKLQkJCQlrZnJlZShFbGVtKTsKLQkJCX0KLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCWlmIChwUmVtb3ZlZExMQ1NOQVApCi0JCQl7Ci0JCQkJcFBheWxvYWQgLT0gTEVOR1RIXzgwMl8zOwotCQkJCVBheWxvYWRTaXplICs9IExFTkdUSF84MDJfMzsKLQkJCQlOZGlzTW92ZU1lbW9yeShwUGF5bG9hZCwgJkhlYWRlcjgwMl8zWzBdLCBMRU5HVEhfODAyXzMpOwotCQkJfQotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkJcENsb25lUGFja2V0ID0gQ2xvbmVQYWNrZXQocEFkLCBwUGFja2V0LCBwUGF5bG9hZCwgUGF5bG9hZFNpemUpOwotCQlpZiAocENsb25lUGFja2V0KQotCQl7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJCUFOTk9VTkNFX09SX0ZPUldBUkRfODAyXzNfUEFDS0VUKHBBZCwgcENsb25lUGFja2V0LCBSVE1QX0dFVF9QQUNLRVRfSUYocFBhY2tldCkpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQl9Ci0KLQotCQkvLyBBLU1TRFUgaGFzIHBhZGRpbmcgdG8gbXVsdGlwbGUgb2YgNCBpbmNsdWRpbmcgc3ViZnJhbWUgaGVhZGVyLgotCQkvLyBhbGlnbiBTdWJGcmFtZVNpemUgdXAgdG8gbXVsdGlwbGUgb2YgNAotCQlTdWJGcmFtZVNpemUgPSAoU3ViRnJhbWVTaXplKzMpJih+MHgzKTsKLQotCi0JCWlmIChTdWJGcmFtZVNpemUgPiAxNTI4IHx8IFN1YkZyYW1lU2l6ZSA8IDMyKQotCQl7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChEYXRhU2l6ZSA+IFN1YkZyYW1lU2l6ZSkKLQkJewotCQkJcERhdGEgKz0gU3ViRnJhbWVTaXplOwotCQkJRGF0YVNpemUgLT0gU3ViRnJhbWVTaXplOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gZW5kIG9mIEEtTVNEVQotCQkJRGF0YVNpemUgPSAwOwotCQl9Ci0JfQotCi0JLy8gZmluYWxseSByZWxlYXNlIG9yaWdpbmFsIHJ4IHBhY2tldAotCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBuTVNEVTsKLX0KLQotCi1VSU5UIEJBX1Jlb3JkZXJfQU1TRFVfQW5ubm91bmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQotewotCVBVQ0hBUgkJCXBEYXRhOwotCVVTSE9SVAkJCURhdGFTaXplOwotCVVJTlQJCQluTVNEVSA9IDA7Ci0KLQlwRGF0YSA9IChQVUNIQVIpIEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKLQlEYXRhU2l6ZSA9IChVU0hPUlQpIEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOwotCi0Jbk1TRFUgPSBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZShwQWQsIHBQYWNrZXQsIHBEYXRhLCBEYXRhU2l6ZSk7Ci0KLQlyZXR1cm4gbk1TRFU7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlMb29rIHVwIHRoZSBNQUMgYWRkcmVzcyBpbiB0aGUgTUFDIHRhYmxlLiBSZXR1cm4gTlVMTCBpZiBub3QgZm91bmQuCi0JUmV0dXJuOgotCQlwRW50cnkgLSBwb2ludGVyIHRvIHRoZSBNQUMgZW50cnk7IE5VTEwgaXMgbm90IGZvdW5kCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1NQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlTG9va3VwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCVBVQ0hBUiBwQWRkcikKLXsKLQlVTE9ORyBIYXNoSWR4OwotCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTDsKLQotCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZGRyKTsKLQlwRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOwotCi0Jd2hpbGUgKHBFbnRyeSAmJiAocEVudHJ5LT5WYWxpZEFzQ0xJIHx8IHBFbnRyeS0+VmFsaWRBc1dEUyB8fCBwRW50cnktPlZhbGlkQXNBcENsaSB8fCBwRW50cnktPlZhbGlkQXNNZXNoKSkKLQl7Ci0JCWlmIChNQUNfQUREUl9FUVVBTChwRW50cnktPkFkZHIsIHBBZGRyKSkKLQkJewotCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZQotCQkJcEVudHJ5ID0gcEVudHJ5LT5wTmV4dDsKLQl9Ci0KLQlyZXR1cm4gcEVudHJ5OwotfQotCi1NQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlSW5zZXJ0RW50cnkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUgkJCXBBZGRyLAotCUlOCVVDSEFSCQkJYXBpZHgsCi0JSU4gQk9PTEVBTglDbGVhbkFsbCkKLXsKLQlVQ0hBUiBIYXNoSWR4OwotCWludCBpLCBGaXJzdFdjaWQ7Ci0JTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMLCAqcEN1cnJFbnRyeTsKLS8vCVVTSE9SVAlvZmZzZXQ7Ci0vLwlVTE9ORwlhZGRyOwotCi0JLy8gaWYgRlVMTCwgcmV0dXJuCi0JaWYgKHBBZC0+TWFjVGFiLlNpemUgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCi0JCXJldHVybiBOVUxMOwotCi0JRmlyc3RXY2lkID0gMTsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKLQkJRmlyc3RXY2lkID0gMjsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCS8vIGFsbG9jYXRlIG9uZSBNQUMgZW50cnkKLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotCWZvciAoaSA9IEZpcnN0V2NpZDsgaTwgTUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykgICAvLyBza2lwIGVudHJ5IzAgc28gdGhhdCAiZW50cnkgaW5kZXggPT0gQUlEIiBmb3IgZmFzdCBsb29rdXAKLQl7Ci0JCS8vIHBpY2sgdXAgdGhlIGZpcnN0IGF2YWlsYWJsZSB2YWNhbmN5Ci0JCWlmICgocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJID09IEZBTFNFKSAmJgotCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc1dEUyA9PSBGQUxTRSkgJiYKLQkJCShwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNBcENsaT09IEZBTFNFKSAmJgotCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc01lc2ggPT0gRkFMU0UpCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCQkmJiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzRGxzID09IEZBTFNFKQotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkJKQotCQl7Ci0JCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKLQkJCWlmIChDbGVhbkFsbCA9PSBUUlVFKQotCQkJewotCQkJCXBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7Ci0JCQkJcEVudHJ5LT5DdXJyVHhSYXRlID0gUkFURV8xMTsKLQkJCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNQUNfVEFCTEVfRU5UUlkpKTsKLQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LktleUxlbiA9IDA7Ci0JCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQkJCX0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJCWlmIChhcGlkeCA+PSBNSU5fTkVUX0RFVklDRV9GT1JfRExTKQotCQkJewotCQkJCXBFbnRyeS0+VmFsaWRBc0NMSSA9IEZBTFNFOwotCQkJCXBFbnRyeS0+VmFsaWRBc1dEUyA9IEZBTFNFOwotCQkJCXBFbnRyeS0+VmFsaWRBc0FwQ2xpID0gRkFMU0U7Ci0JCQkJcEVudHJ5LT5WYWxpZEFzTWVzaCA9IEZBTFNFOwotCQkJCXBFbnRyeS0+VmFsaWRBc0RscyA9IFRSVUU7Ci0JCQkJcEVudHJ5LT5pc0NhY2hlZCA9IEZBTFNFOwotCQkJfQotCQkJZWxzZQotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkJewotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCQl7Ci0JCQkJCXBFbnRyeS0+VmFsaWRBc0NMSSA9IFRSVUU7Ci0JCQkJCXBFbnRyeS0+VmFsaWRBc1dEUyA9IEZBTFNFOwotCQkJCQlwRW50cnktPlZhbGlkQXNBcENsaSA9IEZBTFNFOwotCQkJCQlwRW50cnktPlZhbGlkQXNNZXNoID0gRkFMU0U7Ci0JCQkJCXBFbnRyeS0+VmFsaWRBc0RscyA9IEZBTFNFOwotCQkJCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJCX0KLQotCQkJcEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9IEZBTFNFOwotCQkJcEVudHJ5LT5wQWQgPSBwQWQ7Ci0JCQlwRW50cnktPkNNVGltZXJSdW5uaW5nID0gRkFMU0U7Ci0JCQlwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nID0gRUFQT0xfU1RBUlRfRElTQUJMRTsKLQkJCXBFbnRyeS0+UlNOSUVfTGVuID0gMDsKLQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+Ul9Db3VudGVyLCBzaXplb2YocEVudHJ5LT5SX0NvdW50ZXIpKTsKLQkJCXBFbnRyeS0+UmVUcnlDb3VudGVyID0gUEVFUl9NU0cxX1JFVFJZX1RJTUVSX0NUUjsKLQotCQkJaWYgKHBFbnRyeS0+VmFsaWRBc01lc2gpCi0JCQkJcEVudHJ5LT5hcGlkeCA9IChhcGlkeCAtIE1JTl9ORVRfREVWSUNFX0ZPUl9NRVNIKTsKLQkJCWVsc2UgaWYgKHBFbnRyeS0+VmFsaWRBc0FwQ2xpKQotCQkJCXBFbnRyeS0+YXBpZHggPSAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkpOwotCQkJZWxzZSBpZiAocEVudHJ5LT5WYWxpZEFzV0RTKQotCQkJCXBFbnRyeS0+YXBpZHggPSAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTKTsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJCWVsc2UgaWYgKHBFbnRyeS0+VmFsaWRBc0RscykKLQkJCQlwRW50cnktPmFwaWR4ID0gKGFwaWR4IC0gTUlOX05FVF9ERVZJQ0VfRk9SX0RMUyk7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCQllbHNlCi0JCQkJcEVudHJ5LT5hcGlkeCA9IGFwaWR4OwotCi0KLQkJCXsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQkJewotCQkJCQlwRW50cnktPkF1dGhNb2RlID0gcEFkLT5TdGFDZmcuQXV0aE1vZGU7Ci0JCQkJCXBFbnRyeS0+V2VwU3RhdHVzID0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOwotCQkJCQlwRW50cnktPlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbDsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJCQkJQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkLCBwRW50cnktPmFwaWR4LCAoVUNIQVIpaSk7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JCQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkJfQotCi0JCQlwRW50cnktPkdUS1N0YXRlID0gUkVLRVlfTkVHT1RJQVRJTkc7Ci0JCQlwRW50cnktPlBhaXJ3aXNlS2V5LktleUxlbiA9IDA7Ci0JCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9OT05FOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQkJaWYgKHBFbnRyeS0+VmFsaWRBc0RscyA9PSBUUlVFKQotCQkJCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQkJCWVsc2UKLSNlbmRpZiAvL1FPU19ETFNfU1VQUE9SVAotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkJCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7Ci0KLQkJCXBFbnRyeS0+UE1LSURfQ2FjaGVJZHggPSBFTlRSWV9OT1RfRk9VTkQ7Ci0JCQlDT1BZX01BQ19BRERSKHBFbnRyeS0+QWRkciwgcEFkZHIpOwotCQkJcEVudHJ5LT5Tc3QgPSBTU1RfTk9UX0FVVEg7Ci0JCQlwRW50cnktPkF1dGhTdGF0ZSA9IEFTX05PVF9BVVRIOwotCQkJcEVudHJ5LT5BaWQgPSAoVVNIT1JUKWk7ICAvLzA7Ci0JCQlwRW50cnktPkNhcGFiaWxpdHlJbmZvID0gMDsKLQkJCXBFbnRyeS0+UHNNb2RlID0gUFdSX0FDVElWRTsKLQkJCXBFbnRyeS0+UHNRSWRsZUNvdW50ID0gMDsKLQkJCXBFbnRyeS0+Tm9EYXRhSWRsZUNvdW50ID0gMDsKLQkJCXBFbnRyeS0+QXNzb2NEZWFkTGluZSA9IE1BQ19UQUJMRV9BU1NPQ19USU1FT1VUOwotCQkJcEVudHJ5LT5Db250aW51ZVR4RmFpbENudCA9IDA7Ci0jaWZkZWYgV0RTX1NVUFBPUlQKLQkJCXBFbnRyeS0+TG9ja0VudHJ5VHggPSBGQUxTRTsKLQkJCXBFbnRyeS0+VGltZVN0YW1wX3RvVHhSaW5nID0gMDsKLSNlbmRpZiAvLyBXRFNfU1VQUE9SVCAvLwotCQkJSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwRW50cnktPlBzUXVldWUpOwotCi0KLQkJCXBBZC0+TWFjVGFiLlNpemUgKys7Ci0JCQkvLyBBZGQgdGhpcyBlbnRyeSBpbnRvIEFTSUMgUlggV0NJRCBzZWFyY2ggdGFibGUKLQkJCVJUTVBfU1RBX0VOVFJZX0FERChwQWQsIHBFbnRyeSk7Ci0KLQotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNUYWJsZUluc2VydEVudHJ5IC0gYWxsb2NhdGUgZW50cnkgIyVkLCBUb3RhbD0gJWRcbiIsaSwgcEFkLT5NYWNUYWIuU2l6ZSkpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvLyBhZGQgdGhpcyBNQUMgZW50cnkgaW50byBIQVNIIHRhYmxlCi0JaWYgKHBFbnRyeSkKLQl7Ci0JCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZGRyKTsKLQkJaWYgKHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPT0gTlVMTCkKLQkJewotCQkJcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9IHBFbnRyeTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBDdXJyRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOwotCQkJd2hpbGUgKHBDdXJyRW50cnktPnBOZXh0ICE9IE5VTEwpCi0JCQkJcEN1cnJFbnRyeSA9IHBDdXJyRW50cnktPnBOZXh0OwotCQkJcEN1cnJFbnRyeS0+cE5leHQgPSBwRW50cnk7Ci0JCX0KLQl9Ci0KLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotCXJldHVybiBwRW50cnk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJRGVsZXRlIGEgc3BlY2lmaWVkIGNsaWVudCBmcm9tIE1BQyB0YWJsZQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLUJPT0xFQU4gTWFjVGFibGVEZWxldGVFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQgd2NpZCwKLQlJTiBQVUNIQVIgcEFkZHIpCi17Ci0JVVNIT1JUIEhhc2hJZHg7Ci0JTUFDX1RBQkxFX0VOVFJZICpwRW50cnksICpwUHJldkVudHJ5LCAqcFByb2JlRW50cnk7Ci0JQk9PTEVBTiBDYW5jZWxsZWQ7Ci0JLy9VU0hPUlQJb2Zmc2V0OwkvLyB1bnVzZWQgdmFyaWFibGUKLQkvL1VDSEFSCWo7CQkJLy8gdW51c2VkIHZhcmlhYmxlCi0KLQlpZiAod2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKLQotCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZGRyKTsKLQkvL3BFbnRyeSA9IHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF07Ci0JcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbd2NpZF07Ci0KLQlpZiAocEVudHJ5ICYmIChwRW50cnktPlZhbGlkQXNDTEkgfHwgcEVudHJ5LT5WYWxpZEFzQXBDbGkgfHwgcEVudHJ5LT5WYWxpZEFzV0RTIHx8IHBFbnRyeS0+VmFsaWRBc01lc2gKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJfHwgcEVudHJ5LT5WYWxpZEFzRGxzCi0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCSkpCi0JewotCQlpZiAoTUFDX0FERFJfRVFVQUwocEVudHJ5LT5BZGRyLCBwQWRkcikpCi0JCXsKLQotCQkJLy8gRGVsZXRlIHRoaXMgZW50cnkgZnJvbSBBU0lDIG9uLWNoaXAgV0NJRCBUYWJsZQotCQkJUlRNUF9TVEFfRU5UUllfTUFDX1JFU0VUKHBBZCwgd2NpZCk7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCS8vIGZyZWUgcmVzb3VyY2VzIG9mIEJBCi0JCQlCQVNlc3Npb25UZWFyRG93bkFMTChwQWQsIHBFbnRyeS0+QWlkKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCi0JCQlwUHJldkVudHJ5ID0gTlVMTDsKLQkJCXBQcm9iZUVudHJ5ID0gcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XTsKLQkJCUFTU0VSVChwUHJvYmVFbnRyeSk7Ci0KLQkJCS8vIHVwZGF0ZSBIYXNoIGxpc3QKLQkJCWRvCi0JCQl7Ci0JCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKLQkJCQl7Ci0JCQkJCWlmIChwUHJldkVudHJ5ID09IE5VTEwpCi0JCQkJCXsKLQkJCQkJCXBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPSBwRW50cnktPnBOZXh0OwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJcFByZXZFbnRyeS0+cE5leHQgPSBwRW50cnktPnBOZXh0OwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCXBQcmV2RW50cnkgPSBwUHJvYmVFbnRyeTsKLQkJCQlwUHJvYmVFbnRyeSA9IHBQcm9iZUVudHJ5LT5wTmV4dDsKLQkJCX0gd2hpbGUgKHBQcm9iZUVudHJ5KTsKLQotCQkJLy8gbm90IGZvdW5kICEhIQotCQkJQVNTRVJUKHBQcm9iZUVudHJ5ICE9IE5VTEwpOwotCi0JCQlSVE1QX1NUQV9FTlRSWV9LRVlfREVMKHBBZCwgQlNTMCwgd2NpZCk7Ci0KLQotCQlpZiAocEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyAhPSBFQVBPTF9TVEFSVF9ESVNBQkxFKQotCQl7Ci0gICAgICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBFbnRyeS0+RW5xdWV1ZVN0YXJ0Rm9yUFNLVGltZXIsICZDYW5jZWxsZWQpOwotCQkJcEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyA9IEVBUE9MX1NUQVJUX0RJU0FCTEU7Ci0gICAgICAgIH0KLQotCi0JCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNQUNfVEFCTEVfRU5UUlkpKTsKLQkJCXBBZC0+TWFjVGFiLlNpemUgLS07Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNUYWJsZURlbGV0ZUVudHJ5MSAtIFRvdGFsPSAlZFxuIiwgcEFkLT5NYWNUYWIuU2l6ZSkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlxuJXM6IEltcG9zc2libGUgV2NpZCA9ICVkICEhISEhXG4iLCBfX0ZVTkNUSU9OX18sIHdjaWQpKTsKLQkJfQotCX0KLQotCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0KLQkvL1Jlc2V0IG9wZXJhdGluZyBtb2RlIHdoZW4gbm8gU3RhLgotCWlmIChwQWQtPk1hY1RhYi5TaXplID09IDApCi0JewotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUgPSAwOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkvL0FzaWNVcGRhdGVQcm90ZWN0KHBBZCwgMCAvKnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSovLCAoQUxMTl9TRVRQUk9URUNUKSwgVFJVRSwgMCAvKnBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTm9uR0YqLyk7Ci0JCVJUTVBfVVBEQVRFX1BST1RFQ1QocEFkKTsgIC8vIGVkaXQgYnkgam9obmxpLCBmaXggImluX2ludGVycnVwdCIgZXJyb3Igd2hlbiBjYWxsICJNYWNUYWJsZURlbGV0ZUVudHJ5IiBpbiBSeCB0YXNrbGV0Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlUaGlzIHJvdXRpbmUgcmVzZXQgdGhlIGVudGlyZSBNQUMgdGFibGUuIEFsbCBwYWNrZXRzIHBlbmRpbmcgaW4KLQkJdGhlIHBvd2VyLXNhdmluZyBxdWV1ZXMgYXJlIGZyZWVkIGhlcmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNYWNUYWJsZVJlc2V0KAotCUlOICBQUlRNUF9BREFQVEVSICBwQWQpCi17Ci0JaW50ICAgICAgICAgaTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY1RhYmxlUmVzZXRcbiIpKTsKLQkvL05kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0KLQotCWZvciAoaT0xOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCi0JewotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQlSVE1QX1NUQV9FTlRSWV9NQUNfUkVTRVQocEFkLCBpKTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSA9PSBUUlVFKQotCSAgIHsKLQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkvLyBmcmVlIHJlc291cmNlcyBvZiBCQQotCQkJQkFTZXNzaW9uVGVhckRvd25BTEwocEFkLCBpKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCQkJcEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJID0gRkFMU0U7Ci0KLQotCi0KLQkJCS8vQXNpY0RlbFdjaWRUYWIocEFkLCBpKTsKLQkJfQotCX0KLQotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQXNzb2NQYXJtRmlsbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBPVVQgTUxNRV9BU1NPQ19SRVFfU1RSVUNUICpBc3NvY1JlcSwKLQlJTiBQVUNIQVIgICAgICAgICAgICAgICAgICAgICBwQWRkciwKLQlJTiBVU0hPUlQgICAgICAgICAgICAgICAgICAgICBDYXBhYmlsaXR5SW5mbywKLQlJTiBVTE9ORyAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0LAotCUlOIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgIExpc3RlbkludHYpCi17Ci0JQ09QWV9NQUNfQUREUihBc3NvY1JlcS0+QWRkciwgcEFkZHIpOwotCS8vIEFkZCBtYXNrIHRvIHN1cHBvcnQgODAyLjExYiBtb2RlIG9ubHkKLQlBc3NvY1JlcS0+Q2FwYWJpbGl0eUluZm8gPSBDYXBhYmlsaXR5SW5mbyAmIFNVUFBPUlRFRF9DQVBBQklMSVRZX0lORk87IC8vIG5vdCBjZi1wb2xsYWJsZSwgbm90IGNmLXBvbGwtcmVxdWVzdAotCUFzc29jUmVxLT5UaW1lb3V0ID0gVGltZW91dDsKLQlBc3NvY1JlcS0+TGlzdGVuSW50diA9IExpc3RlbkludHY7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgRGlzYXNzb2NQYXJtRmlsbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBPVVQgTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICpEaXNhc3NvY1JlcSwKLQlJTiBQVUNIQVIgcEFkZHIsCi0JSU4gVVNIT1JUIFJlYXNvbikKLXsKLQlDT1BZX01BQ19BRERSKERpc2Fzc29jUmVxLT5BZGRyLCBwQWRkcik7Ci0JRGlzYXNzb2NSZXEtPlJlYXNvbiA9IFJlYXNvbjsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQ2hlY2sgdGhlIG91dCBnb2luZyBmcmFtZSwgaWYgdGhpcyBpcyBhbiBESENQIG9yIEFSUCBkYXRhZ3JhbQotCXdpbGwgYmUgZHVwbGljYXRlIGFub3RoZXIgZnJhbWUgYXQgbG93IGRhdGEgcmF0ZSB0cmFuc21pdC4KLQotCUFyZ3VtZW50czoKLQkJcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCXBQYWNrZXQJCVBvaW50ZXIgdG8gb3V0Z29pbmcgTmRpcyBmcmFtZQotCi0JUmV0dXJuIFZhbHVlOgotCQlUUlVFCQlUbyBiZSBkdXBsaWNhdGUgYXQgTG93IGRhdGEgcmF0ZSB0cmFuc21pdC4gKDFtYikKLQkJRkFMU0UJCURvIG5vdGhpbmcuCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQkJTUFDIGhlYWRlciArIElQIEhlYWRlciArIFVEUCBIZWFkZXIKLQkJICAxNCBCeXRlcwkgIDIwIEJ5dGVzCi0KLQkJVURQIEhlYWRlcgotCQkwMHwwMXwwMnwwM3wwNHwwNXwwNnwwN3wwOHwwOXwxMHwxMXwxMnwxM3wxNHwxNXwKLQkJCQkJCVNvdXJjZSBQb3J0Ci0JCTE2fDE3fDE4fDE5fDIwfDIxfDIyfDIzfDI0fDI1fDI2fDI3fDI4fDI5fDMwfDMxfAotCQkJCQlEZXN0aW5hdGlvbiBQb3J0Ci0KLQkJcG9ydCAweDQzIG1lYW5zIEJvb3RzdHJhcCBQcm90b2NvbCwgc2VydmVyLgotCQlQb3J0IDB4NDQgbWVhbnMgQm9vdHN0cmFwIFByb3RvY29sLCBjbGllbnQuCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi0KLUJPT0xFQU4gUlRNUENoZWNrREhDUEZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQotewotCVBBQ0tFVF9JTkZPCVBhY2tldEluZm87Ci0JVUxPTkcJCQlOdW1iZXJPZkJ5dGVzUmVhZCA9IDA7Ci0JVUxPTkcJCQlDdXJyZW50T2Zmc2V0ID0gMDsKLQlQVk9JRAkJCXBWaXJ0dWFsQWRkcmVzcyA9IE5VTEw7Ci0JVUlOVAkJCU5kaXNCdWZmZXJMZW5ndGg7Ci0JUFVDSEFSCQkJcFNyYzsKLQlVU0hPUlQJCQlQcm90b2NvbDsKLQlVQ0hBUgkJCUJ5dGVPZmZzZXQzNiA9IDA7Ci0JVUNIQVIJCQlCeXRlT2Zmc2V0MzggPSAwOwotCUJPT0xFQU4JCQlSZWFkRmlyc3RQYXJtID0gVFJVRTsKLQotCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAoUFVDSEFSICopJnBWaXJ0dWFsQWRkcmVzcywgJk5kaXNCdWZmZXJMZW5ndGgpOwotCi0JTnVtYmVyT2ZCeXRlc1JlYWQgKz0gTmRpc0J1ZmZlckxlbmd0aDsKLQlwU3JjID0gKFBVQ0hBUikgcFZpcnR1YWxBZGRyZXNzOwotCVByb3RvY29sID0gKihwU3JjICsgMTIpICogMjU2ICsgKihwU3JjICsgMTMpOwotCi0JLy8KLQkvLyBDaGVjayBESENQICYgQk9PVFAgcHJvdG9jb2wKLQkvLwotCXdoaWxlIChOdW1iZXJPZkJ5dGVzUmVhZCA8PSBQYWNrZXRJbmZvLlRvdGFsUGFja2V0TGVuZ3RoKQotCXsKLQkJaWYgKChOdW1iZXJPZkJ5dGVzUmVhZCA+PSAzNSkgJiYgKFJlYWRGaXJzdFBhcm0gPT0gVFJVRSkpCi0JCXsKLQkJCUN1cnJlbnRPZmZzZXQgPSAzNSAtIChOdW1iZXJPZkJ5dGVzUmVhZCAtIE5kaXNCdWZmZXJMZW5ndGgpOwotCQkJQnl0ZU9mZnNldDM2ID0gKihwU3JjICsgQ3VycmVudE9mZnNldCk7Ci0JCQlSZWFkRmlyc3RQYXJtID0gRkFMU0U7Ci0JCX0KLQotCQlpZiAoTnVtYmVyT2ZCeXRlc1JlYWQgPj0gMzcpCi0JCXsKLQkJCUN1cnJlbnRPZmZzZXQgPSAzNyAtIChOdW1iZXJPZkJ5dGVzUmVhZCAtIE5kaXNCdWZmZXJMZW5ndGgpOwotCQkJQnl0ZU9mZnNldDM4ID0gKihwU3JjICsgQ3VycmVudE9mZnNldCk7Ci0JCQkvL0VuZCBvZiBSZWFkCi0JCQlicmVhazsKLQkJfQotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JLy8gQ2hlY2sgZm9yIERIQ1AgJiBCT09UUCBwcm90b2NvbAotCWlmICgoQnl0ZU9mZnNldDM2ICE9IDB4NDQpIHx8IChCeXRlT2Zmc2V0MzggIT0gMHg0MykpCi0JCXsKLQkJLy8KLQkJLy8gMjA1NCAoaGV4IDA4MDYpIGZvciBBUlAgZGF0YWdyYW1zCi0JCS8vIGlmIHRoaXMgcGFja2V0IGlzIG5vdCBBUlAgZGF0YWdyYW1zLCB0aGVuIGRvIG5vdGhpbmcKLQkJLy8gQVJQIGRhdGFncmFtcyB3aWxsIGFsc28gYmUgZHVwbGljYXRlIGF0IDFtYiBicm9hZGNhc3QgZnJhbWVzCi0JCS8vCi0JCWlmIChQcm90b2NvbCAhPSAweDA4MDYgKQotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi1CT09MRUFOIFJUTVBDaGVja0V0aGVyVHlwZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKLXsKLQlVU0hPUlQJVHlwZUxlbjsKLQlVQ0hBUglCeXRlMCwgQnl0ZTE7Ci0JUFVDSEFSCXBTcmNCdWY7Ci0JVUlOVDMyCXBrdExlbjsKLQlVSU5UMTYJc3JjUG9ydCwgZHN0UG9ydDsKLQlCT09MRUFOCXN0YXR1cyA9IFRSVUU7Ci0KLQotCXBTcmNCdWYgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7Ci0JcGt0TGVuID0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7Ci0KLQlBU1NFUlQocFNyY0J1Zik7Ci0KLQlSVE1QX1NFVF9QQUNLRVRfU1BFQ0lGSUMocFBhY2tldCwgMCk7Ci0KLQkvLyBnZXQgRXRoZXJuZXQgcHJvdG9jb2wgZmllbGQKLQlUeXBlTGVuID0gKHBTcmNCdWZbMTJdIDw8IDgpICsgcFNyY0J1ZlsxM107Ci0KLQlwU3JjQnVmICs9IExFTkdUSF84MDJfMzsJLy8gU2tpcCB0aGUgRXRoZXJuZXQgSGVhZGVyLgotCi0JaWYgKFR5cGVMZW4gPD0gMTUwMCkKLQl7CS8vIDgwMi4zLCA4MDIuMyBMTEMKLQkJLyoKLQkJCURlc3RNQUMoNikgKyBTcmNNQUMoNikgKyBMZW5naHQoMikgKwotCQkJRFNBUCgxKSArIFNTQVAoMSkgKyBDb250cm9sKDEpICsKLQkJCWlmIHRoZSBEU0FQID0gMHhBQSwgU1NBUD0weEFBLCBDb250b3JsID0gMHgwMywgaXQgaGFzIGEgNS1ieXRlcyBTTkFQIGhlYWRlci4KLQkJCQk9PiArIFNOQVAgKDUsIE9yaWdpbmF0aW9uSUQoMykgKyBldGhlclR5cGUoMikpCi0JCSovCi0JCWlmIChwU3JjQnVmWzBdID09IDB4QUEgJiYgcFNyY0J1ZlsxXSA9PSAweEFBICYmIHBTcmNCdWZbMl0gPT0gMHgwMykKLQkJewotCQkJU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcigoUE5ESVNfQlVGRkVSKXBTcmNCdWYsIDYsICZCeXRlMCwgJkJ5dGUxKTsKLQkJCVJUTVBfU0VUX1BBQ0tFVF9MTENTTkFQKHBQYWNrZXQsIDEpOwotCQkJVHlwZUxlbiA9IChVU0hPUlQpKChCeXRlMCA8PCA4KSArIEJ5dGUxKTsKLQkJCXBTcmNCdWYgKz0gODsgLy8gU2tpcCB0aGlzIExMQy9TTkFQIGhlYWRlcgotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy9JdCBqdXN0IGhhcyAzLWJ5dGUgTExDIGhlYWRlciwgbWF5YmUgYSBsZWdhY3kgZXRoZXIgdHlwZSBmcmFtZS4gd2UgZGlkbid0IGhhbmRsZSBpdC4KLQkJfQotCX0KLQotCS8vIElmIGl0J3MgYSBWTEFOIHBhY2tldCwgZ2V0IHRoZSByZWFsIFR5cGUvTGVuZ3RoIGZpZWxkLgotCWlmIChUeXBlTGVuID09IDB4ODEwMCkKLQl7Ci0JCS8qIDB4ODEwMCBtZWFucyBWTEFOIHBhY2tldHMgKi8KLQotCQkvKiBEZXN0LiBNQUMgQWRkcmVzcyAoNi1ieXRlcykgKwotCQkgICBTb3VyY2UgTUFDIEFkZHJlc3MgKDYtYnl0ZXMpICsKLQkJICAgTGVuZ3RoL1R5cGUgPSA4MDIuMVEgVGFnIFR5cGUgKDItYnl0ZSkgKwotCQkgICBUYWcgQ29udHJvbCBJbmZvcm1hdGlvbiAoMi1ieXRlcykgKwotCQkgICBMZW5ndGggLyBUeXBlICgyLWJ5dGVzKSArCi0JCSAgIGRhdGEgcGF5bG9hZCAoMC1uIGJ5dGVzKSArCi0JCSAgIFBhZCAoMC1wIGJ5dGVzKSArCi0JCSAgIEZyYW1lIENoZWNrIFNlcXVlbmNlICg0LWJ5dGVzKSAqLwotCi0JCVJUTVBfU0VUX1BBQ0tFVF9WTEFOKHBQYWNrZXQsIDEpOwotCQlTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKChQTkRJU19CVUZGRVIpcFNyY0J1ZiwgMiwgJkJ5dGUwLCAmQnl0ZTEpOwotCQlUeXBlTGVuID0gKFVTSE9SVCkoKEJ5dGUwIDw8IDgpICsgQnl0ZTEpOwotCi0JCXBTcmNCdWYgKz0gNDsgLy8gU2tpcCB0aGUgVkxBTiBIZWFkZXIuCi0JfQotCi0Jc3dpdGNoIChUeXBlTGVuKQotCXsKLQkJY2FzZSAweDA4MDA6Ci0JCQl7Ci0JCQkJQVNTRVJUKChwa3RMZW4gPiAzNCkpOwotCQkJCWlmICgqKHBTcmNCdWYgKyA5KSA9PSAweDExKQotCQkJCXsJLy8gdWRwIHBhY2tldAotCQkJCQlBU1NFUlQoKHBrdExlbiA+IDM0KSk7CS8vIDE0IGZvciBldGhlcm5ldCBoZWFkZXIsIDIwIGZvciBJUCBoZWFkZXIKLQotCQkJCQlwU3JjQnVmICs9IDIwOwkvLyBTa2lwIHRoZSBJUCBoZWFkZXIKLQkJCQkJc3JjUG9ydCA9IE9TX05UT0hTKGdldF91bmFsaWduZWQoKFBVSU5UMTYpKHBTcmNCdWYpKSk7Ci0JCQkJCWRzdFBvcnQgPSBPU19OVE9IUyhnZXRfdW5hbGlnbmVkKChQVUlOVDE2KShwU3JjQnVmKzIpKSk7Ci0KLQkJCQkJaWYgKChzcmNQb3J0PT0weDQ0ICYmIGRzdFBvcnQ9PTB4NDMpIHx8IChzcmNQb3J0PT0weDQzICYmIGRzdFBvcnQ9PTB4NDQpKQotCQkJCQl7CS8vSXQncyBhIEJPT1RQL0RIQ1AgcGFja2V0Ci0JCQkJCQlSVE1QX1NFVF9QQUNLRVRfREhDUChwUGFja2V0LCAxKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDB4MDgwNjoKLQkJCXsKLQkJCQkvL0FSUCBQYWNrZXQuCi0JCQkJUlRNUF9TRVRfUEFDS0VUX0RIQ1AocFBhY2tldCwgMSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAweDg4OGU6Ci0JCQl7Ci0JCQkJLy8gRUFQT0wgUGFja2V0LgotCQkJCVJUTVBfU0VUX1BBQ0tFVF9FQVBPTChwUGFja2V0LCAxKTsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJc3RhdHVzID0gRkFMU0U7Ci0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotCi19Ci0KLQotCi1WT0lEIFVwZGF0ZV9Sc3NpX1NhbXBsZSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBSU1NJX1NBTVBMRQkJKnBSc3NpLAotCUlOIFBSWFdJX1NUUlVDCQlwUnhXSSkKLQkJewotCUNIQVIJcnNzaTAgPSBwUnhXSS0+UlNTSTA7Ci0JQ0hBUglyc3NpMSA9IHBSeFdJLT5SU1NJMTsKLQlDSEFSCXJzc2kyID0gcFJ4V0ktPlJTU0kyOwotCi0JaWYgKHJzc2kwICE9IDApCi0JewotCQlwUnNzaS0+TGFzdFJzc2kwCT0gQ29udmVydFRvUnNzaShwQWQsIChDSEFSKXJzc2kwLCBSU1NJXzApOwotCQlwUnNzaS0+QXZnUnNzaTBYOAk9IChwUnNzaS0+QXZnUnNzaTBYOCAtIHBSc3NpLT5BdmdSc3NpMCkgKyBwUnNzaS0+TGFzdFJzc2kwOwotCQlwUnNzaS0+QXZnUnNzaTAJPSBwUnNzaS0+QXZnUnNzaTBYOCA+PiAzOwotCX0KLQotCWlmIChyc3NpMSAhPSAwKQotCXsKLQkJcFJzc2ktPkxhc3RSc3NpMQk9IENvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUilyc3NpMSwgUlNTSV8xKTsKLQkJcFJzc2ktPkF2Z1Jzc2kxWDgJPSAocFJzc2ktPkF2Z1Jzc2kxWDggLSBwUnNzaS0+QXZnUnNzaTEpICsgcFJzc2ktPkxhc3RSc3NpMTsKLQkJcFJzc2ktPkF2Z1Jzc2kxCT0gcFJzc2ktPkF2Z1Jzc2kxWDggPj4gMzsKLQl9Ci0KLQlpZiAocnNzaTIgIT0gMCkKLQl7Ci0JCXBSc3NpLT5MYXN0UnNzaTIJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpcnNzaTIsIFJTU0lfMik7Ci0JCXBSc3NpLT5BdmdSc3NpMlg4ICA9IChwUnNzaS0+QXZnUnNzaTJYOCAtIHBSc3NpLT5BdmdSc3NpMikgKyBwUnNzaS0+TGFzdFJzc2kyOwotCQlwUnNzaS0+QXZnUnNzaTIgPSBwUnNzaS0+QXZnUnNzaTJYOCA+PiAzOwotCX0KLX0KLQotCi0KLS8vIE5vcm1hbCBsZWdhY3kgUnggcGFja2V0IGluZGljYXRpb24KLVZPSUQgSW5kaWNhdGVfTGVnYWN5X1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCi17Ci0JUE5ESVNfUEFDS0VUCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OwotCVVDSEFSCQkJSGVhZGVyODAyXzNbTEVOR1RIXzgwMl8zXTsKLQotCS8vIDEuIGdldCA4MDIuMyBIZWFkZXIKLQkvLyAyLiByZW1vdmUgTExDCi0JLy8JCWEuIHBvaW50ZXIgcFJ4QmxrLT5wRGF0YSB0byBwYXlsb2FkCi0JLy8gICAgICBiLiBtb2RpZnkgcFJ4QmxrLT5EYXRhU2l6ZQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCVJUTVBfODAyXzExX1JFTU9WRV9MTENfQU5EX0NPTlZFUlRfVE9fODAyXzMocFJ4QmxrLCBIZWFkZXI4MDJfMyk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlpZiAocFJ4QmxrLT5EYXRhU2l6ZSA+IE1BWF9SWF9QS1RfTEVOKQotCXsKLQotCQkvLyByZWxlYXNlIHBhY2tldAotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJcmV0dXJuOwotCX0KLQotCi0JU1RBVFNfSU5DX1JYX1BBQ0tFVFMocEFkLCBGcm9tV2hpY2hCU1NJRCk7Ci0KLQotCXdsYW5fODAyXzExX3RvXzgwMl8zX3BhY2tldChwQWQsIHBSeEJsaywgSGVhZGVyODAyXzMsIEZyb21XaGljaEJTU0lEKTsKLQotCS8vCi0JLy8gcGFzcyB0aGlzIDgwMi4zIHBhY2tldCB0byB1cHBlciBsYXllciBvciBmb3J3YXJkIHRoaXMgcGFja2V0IHRvIFdNIGRpcmVjdGx5Ci0JLy8KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQlBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgRnJvbVdoaWNoQlNTSUQpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi19Ci0KLQotLy8gTm9ybWFsLCBBTVBEVSBvciBBTVNEVQotVk9JRCBDbW1SeG5vblJhbGlua0ZyYW1lSW5kaWNhdGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQotewotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCWlmIChSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNUERVKSAmJiAocEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID09IDApKQotCXsKLQkJSW5kaWNhdGVfQU1QRFVfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0JfQotCWVsc2UKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQl7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWlmIChSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKSkKLQkJewotCQkJLy8gaGFuZGxlIEEtTVNEVQotCQkJSW5kaWNhdGVfQU1TRFVfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0JCX0KLQkJZWxzZQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQl7Ci0JCQlJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0JCX0KLQl9Ci19Ci0KLQotVk9JRCBDbW1SeFJhbGlua0ZyYW1lSW5kaWNhdGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQotewotCVVDSEFSCQkJSGVhZGVyODAyXzNbTEVOR1RIXzgwMl8zXTsKLQlVSU5UMTYJCQlNc2R1MlNpemU7Ci0JVUlOVDE2CQkJUGF5bG9hZDFTaXplLCBQYXlsb2FkMlNpemU7Ci0JUFVDSEFSCQkJcERhdGEyOwotCVBORElTX1BBQ0tFVAlwUGFja2V0MiA9IE5VTEw7Ci0KLQotCi0JTXNkdTJTaXplID0gKihwUnhCbGstPnBEYXRhKSArICgqKHBSeEJsay0+cERhdGErMSkgPDwgOCk7Ci0KLQlpZiAoKE1zZHUyU2l6ZSA8PSAxNTM2KSAmJiAoTXNkdTJTaXplIDwgcFJ4QmxrLT5EYXRhU2l6ZSkpCi0JewotCQkvKiBza2lwIHR3byBieXRlIE1TRFUyIGxlbiAqLwotCQlwUnhCbGstPnBEYXRhICs9IDI7Ci0JCXBSeEJsay0+RGF0YVNpemUgLT0gMjsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJcmV0dXJuOwotCX0KLQotCS8vIGdldCA4MDIuMyBIZWFkZXIgYW5kICByZW1vdmUgTExDCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJUlRNUF84MDJfMTFfUkVNT1ZFX0xMQ19BTkRfQ09OVkVSVF9UT184MDJfMyhwUnhCbGssIEhlYWRlcjgwMl8zKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0JQVNTRVJUKHBSeEJsay0+cFJ4UGFja2V0KTsKLQotCS8vIFJhbGluayBBZ2dyZWdhdGlvbiBmcmFtZQotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhBZ2dyZWdhdGlvbkNvdW50ICsrOwotCVBheWxvYWQxU2l6ZSA9IHBSeEJsay0+RGF0YVNpemUgLSBNc2R1MlNpemU7Ci0JUGF5bG9hZDJTaXplID0gTXNkdTJTaXplIC0gTEVOR1RIXzgwMl8zOwotCi0JcERhdGEyID0gcFJ4QmxrLT5wRGF0YSArIFBheWxvYWQxU2l6ZSArIExFTkdUSF84MDJfMzsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQlwUGFja2V0MiA9IGR1cGxpY2F0ZV9wa3QocEFkLCAocERhdGEyLUxFTkdUSF84MDJfMyksIExFTkdUSF84MDJfMywgcERhdGEyLCBQYXlsb2FkMlNpemUsIEZyb21XaGljaEJTU0lEKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCWlmICghcFBhY2tldDIpCi0JewotCQkvLyByZWxlYXNlIHBhY2tldAotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gdXBkYXRlIHBheWxvYWQgc2l6ZSBvZiAxc3QgcGFja2V0Ci0JcFJ4QmxrLT5EYXRhU2l6ZSA9IFBheWxvYWQxU2l6ZTsKLQl3bGFuXzgwMl8xMV90b184MDJfM19wYWNrZXQocEFkLCBwUnhCbGssIEhlYWRlcjgwMl8zLCBGcm9tV2hpY2hCU1NJRCk7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQlBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBGcm9tV2hpY2hCU1NJRCk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlpZiAocFBhY2tldDIpCi0JewotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwUGFja2V0MiwgRnJvbVdoaWNoQlNTSUQpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCX0KLX0KLQotCi0jZGVmaW5lIFJFU0VUX0ZSQUdGUkFNRShfZnJhZ0ZyYW1lKSBcCi0JewkJCQkJCQkJXAotCQlfZnJhZ0ZyYW1lLlJ4U2l6ZSA9IDA7CQlcCi0JCV9mcmFnRnJhbWUuU2VxdWVuY2UgPSAwOwlcCi0JCV9mcmFnRnJhbWUuTGFzdEZyYWcgPSAwOwlcCi0JCV9mcmFnRnJhbWUuRmxhZ3MgPSAwOwkJXAotCX0KLQotCi1QTkRJU19QQUNLRVQgUlRNUERlRnJhZ21lbnREYXRhRnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaykKLXsKLQlQSEVBREVSXzgwMl8xMQlwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOwotCVBORElTX1BBQ0tFVAlwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKLQlVQ0hBUgkJCSpwRGF0YSA9IHBSeEJsay0+cERhdGE7Ci0JVVNIT1JUCQkJRGF0YVNpemUgPSBwUnhCbGstPkRhdGFTaXplOwotCVBORElTX1BBQ0tFVAlwUmV0UGFja2V0ID0gTlVMTDsKLQlVQ0hBUgkJCSpwRnJhZ0J1ZmZlciA9IE5VTEw7Ci0JQk9PTEVBTgkJCWJSZWFzc0RvbmUgPSBGQUxTRTsKLQlVQ0hBUgkJCUhlYWRlclJvb20gPSAwOwotCi0KLQlBU1NFUlQocEhlYWRlcik7Ci0KLQlIZWFkZXJSb29tID0gcERhdGEgLSAoVUNIQVIgKilwSGVhZGVyOwotCi0JLy8gUmUtYXNzZW1ibGUgdGhlIGZyYWdtZW50ZWQgcGFja2V0cwotCWlmIChwSGVhZGVyLT5GcmFnID09IDApCQkvLyBGcmFnLiBOdW1iZXIgaXMgMCA6IEZpcnN0IGZyYWcgb3Igb25seSBvbmUgcGt0Ci0JewotCQkvLyB0aGUgZmlyc3QgcGt0IG9mIGZyYWdtZW50LCByZWNvcmQgaXQuCi0JCWlmIChwSGVhZGVyLT5GQy5Nb3JlRnJhZykKLQkJewotCQkJQVNTRVJUKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0KTsKLQkJCXBGcmFnQnVmZmVyID0gR0VUX09TX1BLVF9EQVRBUFRSKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0KTsKLQkJCXBBZC0+RnJhZ0ZyYW1lLlJ4U2l6ZSAgID0gRGF0YVNpemUgKyBIZWFkZXJSb29tOwotCQkJTmRpc01vdmVNZW1vcnkocEZyYWdCdWZmZXIsCSBwSGVhZGVyLCBwQWQtPkZyYWdGcmFtZS5SeFNpemUpOwotCQkJcEFkLT5GcmFnRnJhbWUuU2VxdWVuY2UgPSBwSGVhZGVyLT5TZXF1ZW5jZTsKLQkJCXBBZC0+RnJhZ0ZyYW1lLkxhc3RGcmFnID0gcEhlYWRlci0+RnJhZzsJICAgLy8gU2hvdWxkIGJlIDAKLQkJCUFTU0VSVChwQWQtPkZyYWdGcmFtZS5MYXN0RnJhZyA9PSAwKTsKLQkJCWdvdG8gZG9uZTsJLy8gZW5kIG9mIHByb2Nlc3NpbmcgdGhpcyBmcmFtZQotCQl9Ci0JfQotCWVsc2UJLy9NaWRkbGUgJiBFbmQgb2YgZnJhZ21lbnQKLQl7Ci0JCWlmICgocEhlYWRlci0+U2VxdWVuY2UgIT0gcEFkLT5GcmFnRnJhbWUuU2VxdWVuY2UpIHx8Ci0JCQkocEhlYWRlci0+RnJhZyAhPSAocEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgKyAxKSkpCi0JCXsKLQkJCS8vIEZyYWdtZW50IGlzIG5vdCB0aGUgc2FtZSBzZXF1ZW5jZSBvciBvdXQgb2YgZnJhZ21lbnQgbnVtYmVyIG9yZGVyCi0JCQkvLyBSZXNldCBGcmFnbWVudCBjb250cm9sIGJsawotCQkJUkVTRVRfRlJBR0ZSQU1FKHBBZC0+RnJhZ0ZyYW1lKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkZyYWdtZW50IGlzIG5vdCB0aGUgc2FtZSBzZXF1ZW5jZSBvciBvdXQgb2YgZnJhZ21lbnQgbnVtYmVyIG9yZGVyLlxuIikpOwotCQkJZ290byBkb25lOyAvLyBnaXZlIHVwIHRoaXMgZnJhbWUKLQkJfQotCQllbHNlIGlmICgocEFkLT5GcmFnRnJhbWUuUnhTaXplICsgRGF0YVNpemUpID4gTUFYX0ZSQU1FX1NJWkUpCi0JCXsKLQkJCS8vIEZyYWdtZW50IGZyYW1lIGlzIHRvbyBsYXJnZSwgaXQgZXhlZWRzIHRoZSBtYXhpbXVtIGZyYW1lIHNpemUuCi0JCQkvLyBSZXNldCBGcmFnbWVudCBjb250cm9sIGJsawotCQkJUkVTRVRfRlJBR0ZSQU1FKHBBZC0+RnJhZ0ZyYW1lKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkZyYWdtZW50IGZyYW1lIGlzIHRvbyBsYXJnZSwgaXQgZXhlZWRzIHRoZSBtYXhpbXVtIGZyYW1lIHNpemUuXG4iKSk7Ci0JCQlnb3RvIGRvbmU7IC8vIGdpdmUgdXAgdGhpcyBmcmFtZQotCQl9Ci0KLSAgICAgICAgLy8KLQkJLy8gQnJvYWRjb20gQVAoQkNNOTQ3MDRBR1IpIHdpbGwgc2VuZCBvdXQgTExDIGluIGZyYWdtZW50J3MgcGFja2V0LCBMTEMgb25seSBjYW4gYWNjcGV0IGF0IGZpcnN0IGZyYWdtZW50LgotCQkvLyBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgZHJvcHQgaXQuCi0JCS8vCi0JCWlmIChOZGlzRXF1YWxNZW1vcnkocERhdGEsIFNOQVBfODAyXzFILCBzaXplb2YoU05BUF84MDJfMUgpKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRmluZCBhbm90aGVyIExMQyBhdCBNaWRkbGUgb3IgRW5kIGZyYWdtZW50KFNOPSVkLCBGcmFnPSVkKVxuIiwgcEhlYWRlci0+U2VxdWVuY2UsIHBIZWFkZXItPkZyYWcpKTsKLQkJCWdvdG8gZG9uZTsgLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCi0JCX0KLQotCQlwRnJhZ0J1ZmZlciA9IEdFVF9PU19QS1RfREFUQVBUUihwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCk7Ci0KLQkJLy8gY29uY2F0ZW5hdGUgdGhpcyBmcmFnbWVudCBpbnRvIHRoZSByZS1hc3NlbWJseSBidWZmZXIKLQkJTmRpc01vdmVNZW1vcnkoKHBGcmFnQnVmZmVyICsgcEFkLT5GcmFnRnJhbWUuUnhTaXplKSwgcERhdGEsIERhdGFTaXplKTsKLQkJcEFkLT5GcmFnRnJhbWUuUnhTaXplICArPSBEYXRhU2l6ZTsKLQkJcEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgPSBwSGVhZGVyLT5GcmFnOwkgICAvLyBVcGRhdGUgZnJhZ21lbnQgbnVtYmVyCi0KLQkJLy8gTGFzdCBmcmFnbWVudAotCQlpZiAocEhlYWRlci0+RkMuTW9yZUZyYWcgPT0gRkFMU0UpCi0JCXsKLQkJCWJSZWFzc0RvbmUgPSBUUlVFOwotCQl9Ci0JfQotCi1kb25lOgotCS8vIGFsd2F5cyByZWxlYXNlIHJ4IGZyYWdtZW50ZWQgcGFja2V0Ci0JUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0KLQkvLyByZXR1cm4gZGVmcmFnbWVudGVkIHBhY2tldCBpZiBwYWNrZXQgaXMgcmVhc3NlbWJsZWQgY29tcGxldGVseQotCS8vIG90aGVyd2lzZSByZXR1cm4gTlVMTAotCWlmIChiUmVhc3NEb25lKQotCXsKLQkJUE5ESVNfUEFDS0VUIHBOZXdGcmFnUGFja2V0OwotCi0JCS8vIGFsbG9jYXRlIGEgbmV3IHBhY2tldCBidWZmZXIgZm9yIGZyYWdtZW50Ci0JCXBOZXdGcmFnUGFja2V0ID0gUlRNUF9BbGxvY2F0ZUZyYWdQYWNrZXRCdWZmZXIocEFkLCBSWF9CVUZGRVJfTk9STVNJWkUpOwotCQlpZiAocE5ld0ZyYWdQYWNrZXQpCi0JCXsKLQkJCS8vIHVwZGF0ZSBSeEJsawotCQkJcFJldFBhY2tldCA9IHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0OwotCQkJcEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQgPSBwTmV3RnJhZ1BhY2tldDsKLQkJCXBSeEJsay0+cEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgR0VUX09TX1BLVF9EQVRBUFRSKHBSZXRQYWNrZXQpOwotCQkJcFJ4QmxrLT5wRGF0YSA9IChVQ0hBUiAqKXBSeEJsay0+cEhlYWRlciArIEhlYWRlclJvb207Ci0JCQlwUnhCbGstPkRhdGFTaXplID0gcEFkLT5GcmFnRnJhbWUuUnhTaXplIC0gSGVhZGVyUm9vbTsKLQkJCXBSeEJsay0+cFJ4UGFja2V0ID0gcFJldFBhY2tldDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVJFU0VUX0ZSQUdGUkFNRShwQWQtPkZyYWdGcmFtZSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcFJldFBhY2tldDsKLX0KLQotCi1WT0lEIEluZGljYXRlX0FNU0RVX1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCi17Ci0JVUlOVAkJCW5NU0RVOwotCi0JdXBkYXRlX29zX3BhY2tldF9pbmZvKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0JUlRNUF9TRVRfUEFDS0VUX0lGKHBSeEJsay0+cFJ4UGFja2V0LCBGcm9tV2hpY2hCU1NJRCk7Ci0Jbk1TRFUgPSBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZShwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBwUnhCbGstPnBEYXRhLCBwUnhCbGstPkRhdGFTaXplKTsKLX0KLQotVk9JRCBJbmRpY2F0ZV9FQVBPTF9QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQotewotCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTDsKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOwotCQlTVEFSeEVBUE9MRnJhbWVJbmRpY2F0ZShwQWQsIHBFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0JCXJldHVybjsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlpZiAocEVudHJ5ID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIkluZGljYXRlX0VBUE9MX1BhY2tldDogZHJvcCBhbmQgcmVsZWFzZSB0aGUgaW52YWxpZCBwYWNrZXQuXG4iKSk7Ci0JCS8vIHJlbGVhc2UgcGFja2V0Ci0JCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCXJldHVybjsKLQl9Ci19Ci0KLSNkZWZpbmUgQkNOX1RCVFRfT0ZGU0VUCQk2NAkvL2RlZmVyIDY0IHVzCi1WT0lEIFJlU3luY0JlYWNvblRpbWUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCi17Ci0KLQlVSU5UMzIgIE9mZnNldDsKLQotCi0JT2Zmc2V0ID0gKHBBZC0+VGJ0dFRpY2tDb3VudCkgJSAoQkNOX1RCVFRfT0ZGU0VUKTsKLQotCXBBZC0+VGJ0dFRpY2tDb3VudCsrOwotCi0JLy8KLQkvLyBUaGUgdXBkYXRlZCBCZWFjb25JbnRlcnZhbCBWYWx1ZSB3aWxsIGFmZmVjdCBCZWFjb24gSW50ZXJ2YWwgYWZ0ZXIgdHdvIFRCVFQKLQkvLyBiZWFjYXN1ZSB0aGUgb3JpZ2luYWwgQmVhY29uSW50ZXJ2YWwgaGFkIGJlZW4gbG9hZGVkIGludG8gbmV4dCBUQlRUX1RJTUVSCi0JLy8KLQlpZiAoT2Zmc2V0ID09IChCQ05fVEJUVF9PRkZTRVQtMikpCi0JewotCQlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOwotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEJDTl9USU1FX0NGRywgJmNzci53b3JkKTsKLQkJY3NyLmZpZWxkLkJlYWNvbkludGVydmFsID0gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCA0KSAtIDEgOwkvLyBBU0lDIHJlZ2lzdGVyIGluIHVuaXRzIG9mIDEvMTYgVFUgPSA2NHVzCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyLndvcmQpOwotCX0KLQllbHNlCi0JewotCQlpZiAoT2Zmc2V0ID09IChCQ05fVEJUVF9PRkZTRVQtMSkpCi0JCXsKLQkJCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7Ci0KLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOwotCQkJY3NyLmZpZWxkLkJlYWNvbkludGVydmFsID0gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCkgPDwgNDsgLy8gQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVCi0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV9kYXRhX3BjaS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX2RhdGFfcGNpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NGY4MTkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX2RhdGFfcGNpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTc2ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyoKLSAgIEFsbCBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIG11c3QgYmUgUENJLWRlcGVuZGVkLCBvciB5b3Ugc2hvdWxkIG91dCB5b3VyIGZ1bmN0aW9uCi0JaW4gb3RoZXIgZmlsZXMuCi0KLSovCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotVVNIT1JUIFJ0bXBQQ0lfV3JpdGVUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JQk9PTEVBTgkJCWJJc0xhc3QsCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKQotewotCi0JVUNIQVIJCQkqcERNQUhlYWRlckJ1ZlZBOwotCVVTSE9SVAkJCVR4SWR4LCBSZXRUeElkeDsKLQlQVFhEX1NUUlVDCQlwVHhEOwotCVVJTlQzMgkJCUJ1ZkJhc2VQYUxvdzsKLQlQUlRNUF9UWF9SSU5HCXBUeFJpbmc7Ci0JVVNIT1JUCQkJaHdIZWFkZXJMZW47Ci0KLQkvLwotCS8vIGdldCBUeCBSaW5nIFJlc291cmNlCi0JLy8KLQlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XTsKLQlUeElkeCA9IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5UeENwdUlkeDsKLQlwRE1BSGVhZGVyQnVmVkEgPSAoUFVDSEFSKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NWYTsKLQlCdWZCYXNlUGFMb3cgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NQYSk7Ci0KLQkvLyBjb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCi0JaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1TRFVfRlJBTUUpCi0JewotCQkvL2h3SGVhZGVyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLUxFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQsIDQpK0xFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7Ci0JCWh3SGVhZGVyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuIC0gTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArIHBUeEJsay0+SGRyUGFkTGVuICsgTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKLQl9Ci0JZWxzZQotCXsKLQkJLy9od0hlYWRlckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbiwgNCk7Ci0JCWh3SGVhZGVyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5IZHJQYWRMZW47Ci0JfQotCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQSwgcFR4QmxrLT5IZWFkZXJCdWYsIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZWFkZXJMZW4pOwotCi0JcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQgPSBwVHhCbGstPnBQYWNrZXQ7Ci0JcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLQotCS8vCi0JLy8gYnVpbGQgVHggRGVzY3JpcHRvcgotCS8vCi0KLQlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7Ci0JTmRpc1plcm9NZW1vcnkocFR4RCwgVFhEX1NJWkUpOwotCi0JcFR4RC0+U0RQdHIwID0gQnVmQmFzZVBhTG93OwotCXBUeEQtPlNETGVuMCA9IFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZWFkZXJMZW47IC8vIGluY2x1ZGUgcGFkZGluZwotCXBUeEQtPlNEUHRyMSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFR4QmxrLCAwLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQlwVHhELT5TRExlbjEgPSBwVHhCbGstPlNyY0J1ZkxlbjsKLQlwVHhELT5MYXN0U2VjMCA9IDA7Ci0JcFR4RC0+TGFzdFNlYzEgPSAoYklzTGFzdCkgPyAxIDogMDsKLQotCVJUTVBXcml0ZVR4RGVzY3JpcHRvcihwQWQsIHBUeEQsIEZBTFNFLCBGSUZPX0VEQ0EpOwotCi0JUmV0VHhJZHggPSBUeElkeDsKLQkvLwotCS8vIFVwZGF0ZSBUeCBpbmRleAotCS8vCi0JSU5DX1JJTkdfSU5ERVgoVHhJZHgsIFRYX1JJTkdfU0laRSk7Ci0JcFR4UmluZy0+VHhDcHVJZHggPSBUeElkeDsKLQotCSpGcmVlTnVtYmVyIC09IDE7Ci0KLQlyZXR1cm4gUmV0VHhJZHg7Ci19Ci0KLQotVVNIT1JUIFJ0bXBQQ0lfV3JpdGVTaW5nbGVUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JQk9PTEVBTgkJCWJJc0xhc3QsCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKQotewotCi0JVUNIQVIJCQkqcERNQUhlYWRlckJ1ZlZBOwotCVVTSE9SVAkJCVR4SWR4LCBSZXRUeElkeDsKLQlQVFhEX1NUUlVDCQlwVHhEOwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSAgICBQVFhEX1NUUlVDICAgICAgcERlc3RUeEQ7Ci0gICAgVFhEX1NUUlVDICAgICAgIFR4RDsKLSNlbmRpZgotCVVJTlQzMgkJCUJ1ZkJhc2VQYUxvdzsKLQlQUlRNUF9UWF9SSU5HCXBUeFJpbmc7Ci0JVVNIT1JUCQkJaHdIZWFkZXJMZW47Ci0KLQkvLwotCS8vIGdldCBUeCBSaW5nIFJlc291cmNlCi0JLy8KLQlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XTsKLQlUeElkeCA9IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5UeENwdUlkeDsKLQlwRE1BSGVhZGVyQnVmVkEgPSAoUFVDSEFSKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NWYTsKLQlCdWZCYXNlUGFMb3cgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NQYSk7Ci0KLQkvLyBjb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCi0JLy9od0hlYWRlckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbiwgNCk7Ci0JaHdIZWFkZXJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKLQotCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQSwgcFR4QmxrLT5IZWFkZXJCdWYsIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZWFkZXJMZW4pOwotCi0JcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQgPSBwVHhCbGstPnBQYWNrZXQ7Ci0JcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLQotCS8vCi0JLy8gYnVpbGQgVHggRGVzY3JpcHRvcgotCS8vCi0jaWZuZGVmIFJUX0JJR19FTkRJQU4KLQlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7Ci0jZWxzZQotCXBEZXN0VHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7Ci0JVHhEID0gKnBEZXN0VHhEOwotCXBUeEQgPSAmVHhEOwotI2VuZGlmCi0JTmRpc1plcm9NZW1vcnkocFR4RCwgVFhEX1NJWkUpOwotCi0JcFR4RC0+U0RQdHIwID0gQnVmQmFzZVBhTG93OwotCXBUeEQtPlNETGVuMCA9IFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZWFkZXJMZW47IC8vIGluY2x1ZGUgcGFkZGluZwotCXBUeEQtPlNEUHRyMSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFR4QmxrLCAwLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTs7Ci0JcFR4RC0+U0RMZW4xID0gcFR4QmxrLT5TcmNCdWZMZW47Ci0JcFR4RC0+TGFzdFNlYzAgPSAwOwotCXBUeEQtPkxhc3RTZWMxID0gKGJJc0xhc3QpID8gMSA6IDA7Ci0KLQlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBGQUxTRSwgRklGT19FRENBKTsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpKHBETUFIZWFkZXJCdWZWQSArIFRYSU5GT19TSVpFKSwgVFlQRV9UWFdJKTsKLQlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKShwRE1BSGVhZGVyQnVmVkEgKyBUWElORk9fU0laRSArIFRYV0lfU0laRSksIERJUl9XUklURSwgRkFMU0UpOwotCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOwotCVdyaXRlQmFja1RvRGVzY3JpcHRvcigoUFVDSEFSKXBEZXN0VHhELCAoUFVDSEFSKXBUeEQsIEZBTFNFLCBUWVBFX1RYRCk7Ci0jZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLwotCi0JUmV0VHhJZHggPSBUeElkeDsKLQkvLwotCS8vIFVwZGF0ZSBUeCBpbmRleAotCS8vCi0JSU5DX1JJTkdfSU5ERVgoVHhJZHgsIFRYX1JJTkdfU0laRSk7Ci0JcFR4UmluZy0+VHhDcHVJZHggPSBUeElkeDsKLQotCSpGcmVlTnVtYmVyIC09IDE7Ci0KLQlyZXR1cm4gUmV0VHhJZHg7Ci19Ci0KLQotVVNIT1JUIFJ0bXBQQ0lfV3JpdGVNdWx0aVR4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVQ0hBUgkJCWZyYW1lTnVtLAotCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcikKLXsKLQlCT09MRUFOIGJJc0xhc3Q7Ci0JVUNIQVIJCQkqcERNQUhlYWRlckJ1ZlZBOwotCVVTSE9SVAkJCVR4SWR4LCBSZXRUeElkeDsKLQlQVFhEX1NUUlVDCQlwVHhEOwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSAgICBQVFhEX1NUUlVDICAgICAgcERlc3RUeEQ7Ci0gICAgVFhEX1NUUlVDICAgICAgIFR4RDsKLSNlbmRpZgotCVVJTlQzMgkJCUJ1ZkJhc2VQYUxvdzsKLQlQUlRNUF9UWF9SSU5HCXBUeFJpbmc7Ci0JVVNIT1JUCQkJaHdIZHJMZW47Ci0JVUlOVDMyCQkJZmlyc3RETUFMZW47Ci0KLQliSXNMYXN0ID0gKChmcmFtZU51bSA9PSAocFR4QmxrLT5Ub3RhbEZyYW1lTnVtIC0gMSkpID8gMSA6IDApOwotCi0JLy8KLQkvLyBnZXQgVHggUmluZyBSZXNvdXJjZQotCS8vCi0JcFR4UmluZyA9ICZwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF07Ci0JVHhJZHggPSBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uVHhDcHVJZHg7Ci0JcERNQUhlYWRlckJ1ZlZBID0gKFBVQ0hBUikgcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7Ci0JQnVmQmFzZVBhTG93ID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOwotCi0JaWYgKGZyYW1lTnVtID09IDApCi0JewotCQkvLyBjb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCi0JCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNU0RVX0ZSQU1FKQotCQkJLy9od0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbi1MRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFELCA0KStMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOwotCQkJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gLSBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEICsgcFR4QmxrLT5IZHJQYWRMZW4gKyBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOwotCQllbHNlIGlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX1JBTElOS19GUkFNRSkKLQkJCS8vaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4tTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxELCA0KStMRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQ7Ci0JCQlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiAtIExFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRCArIHBUeEJsay0+SGRyUGFkTGVuICsgTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxEOwotCQllbHNlCi0JCQkvL2h3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLCA0KTsKLQkJCWh3SGRyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5IZHJQYWRMZW47Ci0KLQkJZmlyc3RETUFMZW4gPSBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGRyTGVuOwotCX0KLQllbHNlCi0JewotCQlmaXJzdERNQUxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKLQl9Ci0KLQlOZGlzTW92ZU1lbW9yeShwRE1BSGVhZGVyQnVmVkEsIHBUeEJsay0+SGVhZGVyQnVmLCBmaXJzdERNQUxlbik7Ci0KLQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldCA9IHBUeEJsay0+cFBhY2tldDsKLQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCi0JLy8KLQkvLyBidWlsZCBUeCBEZXNjcmlwdG9yCi0JLy8KLSNpZm5kZWYgUlRfQklHX0VORElBTgotCXBUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKLSNlbHNlCi0JcERlc3RUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKLQlUeEQgPSAqcERlc3RUeEQ7Ci0JcFR4RCA9ICZUeEQ7Ci0jZW5kaWYKLQlOZGlzWmVyb01lbW9yeShwVHhELCBUWERfU0laRSk7Ci0KLQlwVHhELT5TRFB0cjAgPSBCdWZCYXNlUGFMb3c7Ci0JcFR4RC0+U0RMZW4wID0gZmlyc3RETUFMZW47IC8vIGluY2x1ZGUgcGFkZGluZwotCXBUeEQtPlNEUHRyMSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFR4QmxrLCAwLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTs7Ci0JcFR4RC0+U0RMZW4xID0gcFR4QmxrLT5TcmNCdWZMZW47Ci0JcFR4RC0+TGFzdFNlYzAgPSAwOwotCXBUeEQtPkxhc3RTZWMxID0gKGJJc0xhc3QpID8gMSA6IDA7Ci0KLQlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBGQUxTRSwgRklGT19FRENBKTsKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlpZiAoZnJhbWVOdW0gPT0gMCkKLQkJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUikocERNQUhlYWRlckJ1ZlZBKyBUWElORk9fU0laRSArIFRYV0lfU0laRSksIERJUl9XUklURSwgRkFMU0UpOwotCi0JaWYgKGZyYW1lTnVtICE9IDApCi0JCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKShwRE1BSGVhZGVyQnVmVkEgKyBUWElORk9fU0laRSksIFRZUEVfVFhXSSk7Ci0KLQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLQlXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLQotCVJldFR4SWR4ID0gVHhJZHg7Ci0JLy8KLQkvLyBVcGRhdGUgVHggaW5kZXgKLQkvLwotCUlOQ19SSU5HX0lOREVYKFR4SWR4LCBUWF9SSU5HX1NJWkUpOwotCXBUeFJpbmctPlR4Q3B1SWR4ID0gVHhJZHg7Ci0KLQkqRnJlZU51bWJlciAtPSAxOwotCi0JcmV0dXJuIFJldFR4SWR4OwotCi19Ci0KLQotVk9JRCBSdG1wUENJX0ZpbmFsV3JpdGVUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JVVNIT1JUCQkJdG90YWxNUERVU2l6ZSwKLQlJTglVU0hPUlQJCQlGaXJzdFR4SWR4KQotewotCi0JUFRYV0lfU1RSVUMJCXBUeFdJOwotCVBSVE1QX1RYX1JJTkcJcFR4UmluZzsKLQotCS8vCi0JLy8gZ2V0IFR4IFJpbmcgUmVzb3VyY2UKLQkvLwotCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdOwotCXBUeFdJID0gKFBUWFdJX1NUUlVDKSBwVHhSaW5nLT5DZWxsW0ZpcnN0VHhJZHhdLkRtYUJ1Zi5BbGxvY1ZhOwotCXBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPSB0b3RhbE1QRFVTaXplOwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhXSSwgVFlQRV9UWFdJKTsKLSNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCi0KLX0KLQotCi1WT0lEIFJ0bXBQQ0lEYXRhTGFzdFR4SWR4KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJUXVlSWR4LAotCUlOCVVTSE9SVAkJCUxhc3RUeElkeCkKLXsKLQlQVFhEX1NUUlVDCQlwVHhEOwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSAgICBQVFhEX1NUUlVDICAgICAgcERlc3RUeEQ7Ci0gICAgVFhEX1NUUlVDICAgICAgIFR4RDsKLSNlbmRpZgotCVBSVE1QX1RYX1JJTkcJcFR4UmluZzsKLQotCS8vCi0JLy8gZ2V0IFR4IFJpbmcgUmVzb3VyY2UKLQkvLwotCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUXVlSWR4XTsKLQotCS8vCi0JLy8gYnVpbGQgVHggRGVzY3JpcHRvcgotCS8vCi0jaWZuZGVmIFJUX0JJR19FTkRJQU4KLQlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbTGFzdFR4SWR4XS5BbGxvY1ZhOwotI2Vsc2UKLQlwRGVzdFR4RCA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW0xhc3RUeElkeF0uQWxsb2NWYTsKLQlUeEQgPSAqcERlc3RUeEQ7Ci0JcFR4RCA9ICZUeEQ7Ci0jZW5kaWYKLQotCXBUeEQtPkxhc3RTZWMxID0gMTsKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLQlXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLQotfQotCi0KLVVTSE9SVAlSdG1wUENJX1dyaXRlRnJhZ1R4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVQ0hBUgkJCWZyYWdOdW0sCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKQotewotCVVDSEFSCQkJKnBETUFIZWFkZXJCdWZWQTsKLQlVU0hPUlQJCQlUeElkeCwgUmV0VHhJZHg7Ci0JUFRYRF9TVFJVQwkJcFR4RDsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0gICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOwotICAgIFRYRF9TVFJVQyAgICAgICBUeEQ7Ci0jZW5kaWYKLQlVSU5UMzIJCQlCdWZCYXNlUGFMb3c7Ci0JUFJUTVBfVFhfUklORwlwVHhSaW5nOwotCVVTSE9SVAkJCWh3SGVhZGVyTGVuOwotCVVJTlQzMgkJCWZpcnN0RE1BTGVuOwotCi0JLy8KLQkvLyBHZXQgVHggUmluZyBSZXNvdXJjZQotCS8vCi0JcFR4UmluZyA9ICZwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF07Ci0JVHhJZHggPSBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uVHhDcHVJZHg7Ci0JcERNQUhlYWRlckJ1ZlZBID0gKFBVQ0hBUikgcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7Ci0JQnVmQmFzZVBhTG93ID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOwotCi0JLy8KLQkvLyBDb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCi0JLy8KLQkvL2h3SGVhZGVyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLCA0KTsKLQlod0hlYWRlckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOwotCi0JZmlyc3RETUFMZW4gPSBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGVhZGVyTGVuOwotCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQSwgcFR4QmxrLT5IZWFkZXJCdWYsIGZpcnN0RE1BTGVuKTsKLQotCi0JLy8KLQkvLyBCdWlsZCBUeCBEZXNjcmlwdG9yCi0JLy8KLSNpZm5kZWYgUlRfQklHX0VORElBTgotCXBUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKLSNlbHNlCi0JcERlc3RUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKLQlUeEQgPSAqcERlc3RUeEQ7Ci0JcFR4RCA9ICZUeEQ7Ci0jZW5kaWYKLQlOZGlzWmVyb01lbW9yeShwVHhELCBUWERfU0laRSk7Ci0KLQlpZiAoZnJhZ051bSA9PSBwVHhCbGstPlRvdGFsRnJhZ051bSkKLQl7Ci0JCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0ID0gcFR4QmxrLT5wUGFja2V0OwotCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCX0KLQotCXBUeEQtPlNEUHRyMCA9IEJ1ZkJhc2VQYUxvdzsKLQlwVHhELT5TRExlbjAgPSBmaXJzdERNQUxlbjsgLy8gaW5jbHVkZSBwYWRkaW5nCi0JcFR4RC0+U0RQdHIxID0gUENJX01BUF9TSU5HTEUocEFkLCBwVHhCbGssIDAsIDEsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCXBUeEQtPlNETGVuMSA9IHBUeEJsay0+U3JjQnVmTGVuOwotCXBUeEQtPkxhc3RTZWMwID0gMDsKLQlwVHhELT5MYXN0U2VjMSA9IDE7Ci0KLQlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBGQUxTRSwgRklGT19FRENBKTsKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUikocERNQUhlYWRlckJ1ZlZBICsgVFhJTkZPX1NJWkUpLCBUWVBFX1RYV0kpOwotCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpKHBETUFIZWFkZXJCdWZWQSArIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFKSwgRElSX1dSSVRFLCBGQUxTRSk7Ci0JUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0gICAgV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKLSNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCi0KLQlSZXRUeElkeCA9IFR4SWR4OwotCXBUeEJsay0+UHJpdiArPSBwVHhCbGstPlNyY0J1ZkxlbjsKLQotCS8vCi0JLy8gVXBkYXRlIFR4IGluZGV4Ci0JLy8KLQlJTkNfUklOR19JTkRFWChUeElkeCwgVFhfUklOR19TSVpFKTsKLQlwVHhSaW5nLT5UeENwdUlkeCA9IFR4SWR4OwotCi0JKkZyZWVOdW1iZXIgLT0gMTsKLQotCXJldHVybiBSZXRUeElkeDsKLQotfQotCi0KLS8qCi0JTXVzdCBiZSBydW4gaW4gSW50ZXJydXB0IGNvbnRleHQKLQlUaGlzIGZ1bmN0aW9uIGhhbmRsZSBQQ0kgc3BlY2lmaWMgVHhEZXNjIGFuZCBjcHUgaW5kZXggdXBkYXRlIGFuZCBraWNrIHRoZSBwYWNrZXQgb3V0LgotICovCi1pbnQgUnRtcFBDSU1nbXRLaWNrT3V0KAotCUlOIFJUTVBfQURBUFRFUgkJKnBBZCwKLQlJTiBVQ0hBUgkJCVF1ZUlkeCwKLQlJTiBQTkRJU19QQUNLRVQJCXBQYWNrZXQsCi0JSU4gUFVDSEFSCQkJcFNyY0J1ZlZBLAotCUlOIFVJTlQJCQkJU3JjQnVmTGVuKQotewotCVBUWERfU1RSVUMJCXBUeEQ7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotICAgIFBUWERfU1RSVUMgICAgICBwRGVzdFR4RDsKLSAgICBUWERfU1RSVUMgICAgICAgVHhEOwotI2VuZGlmCi0JVUxPTkcJCQlTd0lkeCA9IHBBZC0+TWdtdFJpbmcuVHhDcHVJZHg7Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0gICAgcERlc3RUeEQgID0gKFBUWERfU1RSVUMpcEFkLT5NZ210UmluZy5DZWxsW1N3SWR4XS5BbGxvY1ZhOwotICAgIFR4RCA9ICpwRGVzdFR4RDsKLSAgICBwVHhEID0gJlR4RDsKLSAgICBSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLSNlbHNlCi0JcFR4RCAgPSAoUFRYRF9TVFJVQykgcEFkLT5NZ210UmluZy5DZWxsW1N3SWR4XS5BbGxvY1ZhOwotI2VuZGlmCi0KLQlwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLnBOZGlzUGFja2V0ID0gcFBhY2tldDsKLQlwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0KLQlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBUUlVFLCBGSUZPX01HTVQpOwotCXBUeEQtPkxhc3RTZWMwID0gMTsKLQlwVHhELT5MYXN0U2VjMSA9IDE7Ci0JcFR4RC0+RE1BRE9ORSA9IDA7Ci0JcFR4RC0+U0RMZW4xID0gMDsKLQlwVHhELT5TRFB0cjAgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIHBTcmNCdWZWQSwgU3JjQnVmTGVuLCAwLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQlwVHhELT5TRExlbjAgPSBTcmNCdWZMZW47Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0gICAgV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKLSNlbmRpZgotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLyoJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIk1MTUVIYXJkVHJhbnNtaXRcbiIpKTsKLQlmb3IgKGkgPSAwOyBpIDwgKFRYV0lfU0laRSsyNCk7IGkrKykKLQl7Ci0KLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiV4OiIsICoocFNyY0J1ZlZBK2kpKSk7Ci0JCWlmICggaSU0ID09IDMpCi0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiIDo6ICIpKTsKLQkJaWYgKCBpJTE2ID09IDE1KQotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlxuICAgICAgIikpOwotCX0KLQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiXG4gICAgICAiKSk7Ki8KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7Ci0KLQkvLyBJbmNyZWFzZSBUWF9DVFhfSURYLCBidXQgd3JpdGUgdG8gcmVnaXN0ZXIgbGF0ZXIuCi0JSU5DX1JJTkdfSU5ERVgocEFkLT5NZ210UmluZy5UeENwdUlkeCwgTUdNVF9SSU5HX1NJWkUpOwotCi0JUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTUdNVENUWF9JRFgsICBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4KTsKLQotCXJldHVybiAwOwotfQotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlDaGVjayBSeCBkZXNjcmlwdG9yLCByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRSBpZiBhbnkgZXJyb3IgZG91bmQKLQotCUFyZ3VtZW50czoKLQkJcFJ4RAkJUG9pbnRlciB0byB0aGUgUnggZGVzY3JpcHRvcgotCi0JUmV0dXJuIFZhbHVlOgotCQlORElTX1NUQVRVU19TVUNDRVNTCU5vIGVycgotCQlORElTX1NUQVRVU19GQUlMVVJFCUVycm9yCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMgUlRNUENoZWNrUnhFcnJvcigKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JUEhFQURFUl84MDJfMTEJCXBIZWFkZXIsCi0JSU4JUFJYV0lfU1RSVUMJCXBSeFdJLAotCUlOICBQUlQyOFhYX1JYRF9TVFJVQwlwUnhEKQotewotCVBDSVBIRVJfS0VZIHBXcGFLZXk7Ci0JSU5UIGRCbTsKLQotCS8vIFBoeSBlcnJvcnMgJiBDUkMgZXJyb3JzCi0JaWYgKC8qKHBSeEQtPlBoeUVycikgfHwqLyAocFJ4RC0+Q3JjKSkKLQl7Ci0JCS8vIENoZWNrIFJTU0kgZm9yIE5vaXNlIEhpc3Qgc3RhdGlzdGljIGNvbGxlY3Rpb24uCi0JCWRCbSA9IChJTlQpIChwUnhXSS0+UlNTSTApIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKLQkJaWYgKGRCbSA8PSAtODcpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzBdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtODIpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzFdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtNzcpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzJdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtNzIpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzNdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtNjcpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzRdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtNjIpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzVdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtNTcpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzZdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA+IC01NykKLQkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbN10gKz0gMTsKLQotCQlyZXR1cm4oTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JfQotCi0JLy8gQWRkIFJ4IHNpemUgdG8gY2hhbm5lbCBsb2FkIGNvdW50ZXIsIHdlIHNob3VsZCBpZ25vcmUgZXJyb3IgY291bnRzCi0JcEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgKz0gKHBSeEQtPlNETDAgKyAxNCk7Ci0KLQkvLyBEcm9wIFRvRHMgcHJvbWlzY291cyBmcmFtZSwgaXQgaXMgb3BlbmVkIGR1ZSB0byBDQ1ggMiBjaGFubmVsIGxvYWQgc3RhdGlzdGljcwotCWlmIChwSGVhZGVyICE9IE5VTEwpCi0JewotCQlpZiAocEhlYWRlci0+RkMuVG9EcykKLQkJewotCQkJcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQl9Ci0JfQotCi0JLy8gRHJvcCBub3QgVTJNIGZyYW1lcywgY2FudCdzIGRyb3AgaGVyZSBiZWNhdXNlIHdlIHdpbGwgZHJvcCBiZWFjb24gaW4gdGhpcyBjYXNlCi0JLy8gSSBhbSBraW5kIG9mIGRvdWJ0aW5nIHRoZSBVMk0gYml0IG9wZXJhdGlvbgotCS8vIGlmIChwUnhELT5VMk0gPT0gMCkKLQkvLwlyZXR1cm4oTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0KLQkvLyBkcm9wIGRlY3lwdGlvbiBmYWlsIGZyYW1lCi0JaWYgKHBSeEQtPkNpcGhlckVycikKLQl7Ci0JCWlmIChwUnhELT5DaXBoZXJFcnIgPT0gMikKLQkJCXtEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJwUnhEIEVSUk9SOiBJQ1Ygb2sgYnV0IE1JQ0VyciAiKSk7fQotCQllbHNlIGlmIChwUnhELT5DaXBoZXJFcnIgPT0gMSkKLQkJCXtEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJwUnhEIEVSUk9SOiBJQ1YgRXJyICIpKTt9Ci0JCWVsc2UgaWYgKHBSeEQtPkNpcGhlckVyciA9PSAzKQotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgicFJ4RCBFUlJPUjogS2V5IG5vdCB2YWxpZCAiKSk7Ci0KLSAgICAgICAgaWYgKCgocFJ4RC0+Q2lwaGVyRXJyICYgMSkgPT0gMSkgJiYgcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQgJiYgSU5GUkFfT04ocEFkKSkKLSAgICAgICAgICAgIFJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0lDVl9FUlJPUl9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOwotCi0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIiAlZCAobGVuPSVkLCBNY2FzdD0lZCwgTXlCc3M9JWQsIFdjaWQ9JWQsIEtleUlkPSVkKVxuIiwKLQkJCXBSeEQtPkNpcGhlckVyciwKLQkJCXBSeEQtPlNETDAsCi0JCQlwUnhELT5NY2FzdCB8IHBSeEQtPkJjYXN0LAotCQkJcFJ4RC0+TXlCc3MsCi0JCQlwUnhXSS0+V2lyZWxlc3NDbGlJRCwKLS8vCQkJQ2lwaGVyTmFtZVtwUnhELT5DaXBoZXJBbGddLAotCQkJcFJ4V0ktPktleUluZGV4KSk7Ci0KLQkJLy8KLQkJLy8gTUlDIEVycm9yCi0JCS8vCi0JCWlmIChwUnhELT5DaXBoZXJFcnIgPT0gMikKLQkJewotCQkJcFdwYUtleSA9ICZwQWQtPlNoYXJlZEtleVtCU1MwXVtwUnhXSS0+S2V5SW5kZXhdOwotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApCi0gICAgICAgICAgICAgICAgV3BhU2VuZE1pY0ZhaWx1cmVUb1dwYVN1cHBsaWNhbnQocEFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFdwYUtleS0+VHlwZSA9PSBQQUlSV0lTRUtFWSkgPyBUUlVFOkZBTFNFKTsKLSAgICAgICAgICAgIGVsc2UKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0JCQkgICAgUlRNUFJlcG9ydE1pY0Vycm9yKHBBZCwgcFdwYUtleSk7Ci0KLSAgICAgICAgICAgIGlmICgoKHBSeEQtPkNpcGhlckVyciAmIDIpID09IDIpICYmIHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50ICYmIElORlJBX09OKHBBZCkpCi0gICAgICAgICAgICAgICAgUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfTUlDX0VSUk9SX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7Ci0KLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIlJ4IE1JQyBWYWx1ZSBlcnJvclxuIikpOwotCQl9Ci0KLQkJaWYgKHBIZWFkZXIgPT0gTlVMTCkKLQkJCXJldHVybihORElTX1NUQVRVU19TVUNDRVNTKTsKLQkJLyppZiAoKHBSeEQtPkNpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSAmJgotCQkJKHBIZWFkZXItPlNlcXVlbmNlID09IHBBZC0+RnJhZ0ZyYW1lLlNlcXVlbmNlKSkKLQkJewotCQkJLy8KLQkJCS8vIEFjY2VwdGFibGUgc2luY2UgdGhlIEZpcnN0IEZyYWdGcmFtZSBubyBDaXBoZXJFcnIgcHJvYmxlbS4KLQkJCS8vCi0JCQlyZXR1cm4oTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCX0qLwotCi0JCXJldHVybihORElTX1NUQVRVU19GQUlMVVJFKTsKLQl9Ci0KLQlyZXR1cm4oTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci19Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotQk9PTEVBTiAgUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVDSEFSCQkJUXVlSWR4KQotewotCVBSVE1QX1RYX1JJTkcgcFR4UmluZzsKLQlQVFhEX1NUUlVDCSAgcFR4RDsKLSNpZmRlZglSVF9CSUdfRU5ESUFOCi0gICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOwotI2VuZGlmCi0JUE5ESVNfUEFDS0VUICBwUGFja2V0OwotCVVDSEFSCUZSRUUgPSAwOwotCVRYRF9TVFJVQwlUeEQsICpwT3JpVHhEOwotCS8vVUxPTkcJCUlycUZsYWdzOwotCUJPT0xFQU4JCQliUmVzY2hlZHVsZSA9IEZBTFNFOwotCi0KLQlBU1NFUlQoUXVlSWR4IDwgTlVNX09GX1RYX1JJTkcpOwotCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUXVlSWR4XTsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDAgKyBRdWVJZHggKiBSSU5HUkVHX0RJRkYsICZwVHhSaW5nLT5UeERtYUlkeCk7Ci0Jd2hpbGUgKHBUeFJpbmctPlR4U3dGcmVlSWR4ICE9IHBUeFJpbmctPlR4RG1hSWR4KQotCXsKLS8vCQlSVE1QX0lSUV9MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7Ci0jaWZkZWYgUkFMSU5LX0FURQotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0JCVBIRUFERVJfODAyXzExCXBIZWFkZXI4MDIxMTsKLQotCQlpZiAoKEFURV9PTihwQWQpKSAmJiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSkKLQkJewotCQkJaWYgKHBBZC0+YXRlLlFJRCA9PSBRdWVJZHgpCi0JCQl7Ci0JCQkJcEFkLT5hdGUuVHhEb25lQ291bnQrKzsKLQkJCQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7Ci0KLQkJCQkvKiBhbHdheXMgdXNlIFFJRF9BQ19CRSBhbmQgRklGT19FRENBICovCi0JCQkJQVNTRVJUKHBBZC0+YXRlLlFJRCA9PSAwKTsKLQkJCQlwQWQtPmF0ZS5UeEFjMCsrOwotCi0JCQkJRlJFRSsrOwotI2lmbmRlZiBSVF9CSUdfRU5ESUFOCi0JCQkJcFR4RCA9IChQVFhEX1NUUlVDKSAocFR4UmluZy0+Q2VsbFtwVHhSaW5nLT5UeFN3RnJlZUlkeF0uQWxsb2NWYSk7Ci0JCQkJcE9yaVR4RCA9IHBUeEQ7Ci0JCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJlR4RCwgcFR4RCwgc2l6ZW9mKFRYRF9TVFJVQykpOwotCQkJCXBUeEQgPSAmVHhEOwotI2Vsc2UKLQkJICAgICAgICBwRGVzdFR4RCA9IChQVFhEX1NUUlVDKSAocFR4UmluZy0+Q2VsbFtwVHhSaW5nLT5UeFN3RnJlZUlkeF0uQWxsb2NWYSk7Ci0JCSAgICAgICAgcE9yaVR4RCA9IHBEZXN0VHhEIDsKLQkJICAgICAgICBUeEQgPSAqcERlc3RUeEQ7Ci0JCSAgICAgICAgcFR4RCA9ICZUeEQ7Ci0JCSAgICAgICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0jZW5kaWYKLQkJCQlwVHhELT5ETUFET05FID0gMDsKLQotCQkJCXBIZWFkZXI4MDIxMSA9IHBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLkRtYUJ1Zi5BbGxvY1ZhICsgc2l6ZW9mKFRYV0lfU1RSVUMpOwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQkJCQlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBIZWFkZXI4MDIxMSwgRElSX1JFQUQsIEZBTFNFKTsKLSNlbmRpZgotCQkJCXBIZWFkZXI4MDIxMS0+U2VxdWVuY2UgPSArK3BBZC0+YXRlLnNlcTsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCQkJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwSGVhZGVyODAyMTEsIERJUl9XUklURSwgRkFMU0UpOwotI2VuZGlmCi0KLQkJCQlpZiAgKChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpICYmIChwQWQtPmF0ZS5Nb2RlICYgQVRFX1RYRlJBTUUpICYmIChwQWQtPmF0ZS5UeERvbmVDb3VudCA8IHBBZC0+YXRlLlR4Q291bnQpKQotCQkJCXsKLQkJCQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudCArPSAgKHBUeEQtPlNETGVuMSArIHBUeEQtPlNETGVuMCk7Ci0JCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0gKHBUeEQtPlNETGVuMSArIHBUeEQtPlNETGVuMCk7Ci0JCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRG1hRG9uZUNvdW50W1F1ZUlkeF0gKys7Ci0JCQkJCUlOQ19SSU5HX0lOREVYKHBUeFJpbmctPlR4U3dGcmVlSWR4LCBUWF9SSU5HX1NJWkUpOwotCi0JCQkJCS8qIGdldCBUWF9EVFhfSURYIGFnYWluICovCi0JCQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDAgKyBRdWVJZHggKiBSSU5HUkVHX0RJRkYgLCAgJnBUeFJpbmctPlR4RG1hSWR4KTsKLQkJCQkJZ290byBraWNrX291dDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKHBBZC0+YXRlLlR4U3RhdHVzID09IDEpLyogb3IgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkgPz8/ICovICYmIChwQWQtPmF0ZS5UeERvbmVDb3VudCA9PSBwQWQtPmF0ZS5UeENvdW50KSkKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiYWxsIFR4IGlzIGRvbmVcbiIpKTsKLQotCQkJCQkvLyBUeCBzdGF0dXMgZW50ZXJzIGlkbGUgbW9kZS4KLQkJCQkJcEFkLT5hdGUuVHhTdGF0dXMgPSAwOwotCQkJCX0KLQkJCQllbHNlIGlmICghKHBBZC0+YXRlLk1vZGUgJiBBVEVfVFhGUkFNRSkpCi0JCQkJewotCQkJCQkvKiBub3QgY29tcGxldGUgc2VuZGluZyB5ZXQsIGJ1dCBzb21lb25lIHByZXNzIHRoZSBTdG9wIFRYIGJvdHRvbiAqLwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIm5vdCBjb21wbGV0ZSBzZW5kaW5nIHlldCwgYnV0IHNvbWVvbmUgcHJlc3NlZCB0aGUgU3RvcCBUWCBib3R0b21cbiIpKTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJwQWQtPmF0ZS5Nb2RlID0gMHglMDJ4XG4iLCBwQWQtPmF0ZS5Nb2RlKSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwoInBUeFJpbmctPlR4U3dGcmVlSWR4ID0gJWRcbiIsIHBUeFJpbmctPlR4U3dGcmVlSWR4KSk7Ci0JCQkJfQotCi0jaWZuZGVmIFJUX0JJR19FTkRJQU4KLQkJCU5kaXNNb3ZlTWVtb3J5KHBPcmlUeEQsIHBUeEQsIHNpemVvZihUWERfU1RSVUMpKTsKLSNlbHNlCi0JCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLQkJCSpwRGVzdFR4RCA9IFR4RDsKLSNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCi0KLQkJCQlJTkNfUklOR19JTkRFWChwVHhSaW5nLT5UeFN3RnJlZUlkeCwgVFhfUklOR19TSVpFKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCi0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0JCS8vIHN0YXRpYyByYXRlIGFsc28gbmVlZCBOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMoKSBmdW5jdGlvbi4KLQkJLy9pZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSkKLQkJCU5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycyhwQWQpOwotCi0JCS8qIE5vdGUgOiBJZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSwgd2Ugd2lsbCBuZXZlciByZWFjaCBoZXJlLiAqLwotCQlGUkVFKys7Ci0jaWZuZGVmIFJUX0JJR19FTkRJQU4KLSAgICAgICAgICAgICAgICBwVHhEID0gKFBUWERfU1RSVUMpIChwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5BbGxvY1ZhKTsKLQkJcE9yaVR4RCA9IHBUeEQ7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJlR4RCwgcFR4RCwgc2l6ZW9mKFRYRF9TVFJVQykpOwotCQlwVHhEID0gJlR4RDsKLSNlbHNlCi0gICAgICAgIHBEZXN0VHhEID0gKFBUWERfU1RSVUMpIChwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5BbGxvY1ZhKTsKLSAgICAgICAgcE9yaVR4RCA9IHBEZXN0VHhEIDsKLSAgICAgICAgVHhEID0gKnBEZXN0VHhEOwotICAgICAgICBwVHhEID0gJlR4RDsKLSAgICAgICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0jZW5kaWYKLQotCQlwVHhELT5ETUFET05FID0gMDsKLQotCi0jaWZkZWYgUkFMSU5LX0FURQotCQkvKiBFeGVjdXRpb24gb2YgdGhpcyBibG9jayBpcyBub3QgYWxsb3dlZCB3aGVuIEFURSBpcyBydW5uaW5nLiAqLwotCQlpZiAoIShBVEVfT04ocEFkKSkpCi0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCQl7Ci0JCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtwVHhSaW5nLT5UeFN3RnJlZUlkeF0ucE5kaXNQYWNrZXQ7Ci0JCQlpZiAocFBhY2tldCkKLQkJCXsKLSNpZmRlZiBDT05GSUdfNVZUX0VOSEFOQ0UKLQkJCQlpZiAoUlRNUF9HRVRfUEFDS0VUXzVWVChwUGFja2V0KSkKLQkJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgMTYsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCWVsc2UKLSNlbmRpZiAvLyBDT05GSUdfNVZUX0VOSEFOQ0UgLy8KLQkJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgcFR4RC0+U0RMZW4xLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCQl9Ci0JCQkvL0Fsd2F5cyBhc3NpZ24gcE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgotCQkJcFR4UmluZy0+Q2VsbFtwVHhSaW5nLT5UeFN3RnJlZUlkeF0ucE5kaXNQYWNrZXQgPSBOVUxMOwotCi0JCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtwVHhSaW5nLT5UeFN3RnJlZUlkeF0ucE5leHROZGlzUGFja2V0OwotCi0JCQlBU1NFUlQocFBhY2tldCA9PSBOVUxMKTsKLQkJCWlmIChwUGFja2V0KQotCQkJewotI2lmZGVmIENPTkZJR181VlRfRU5IQU5DRQotCQkJCWlmIChSVE1QX0dFVF9QQUNLRVRfNVZUKHBQYWNrZXQpKQotCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCAxNiwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkJZWxzZQotI2VuZGlmIC8vIENPTkZJR181VlRfRU5IQU5DRSAvLwotCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQkJCX0KLQkJCS8vQWx3YXlzIGFzc2lnbiBwTmV4dE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgotCQkJcFR4UmluZy0+Q2VsbFtwVHhSaW5nLT5UeFN3RnJlZUlkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLQkJfQotCi0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0gIChwVHhELT5TRExlbjEgKyBwVHhELT5TRExlbjApOwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0RtYURvbmVDb3VudFtRdWVJZHhdICsrOwotCQlJTkNfUklOR19JTkRFWChwVHhSaW5nLT5UeFN3RnJlZUlkeCwgVFhfUklOR19TSVpFKTsKLQkJLyogZ2V0IHR4X3RkeF9pZHggYWdhaW4gKi8KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMCArIFF1ZUlkeCAqIFJJTkdSRUdfRElGRiAsICAmcFR4UmluZy0+VHhEbWFJZHgpOwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSAgICAgICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0gICAgICAgICpwRGVzdFR4RCA9IFR4RDsKLSNlbHNlCi0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBPcmlUeEQsIHBUeEQsIHNpemVvZihUWERfU1RSVUMpKTsKLSNlbmRpZgotCi0jaWZkZWYgUkFMSU5LX0FURQotI2lmZGVmIFJBTElOS18yOHh4X1FBCi1raWNrX291dDoKLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotCi0JCS8qCi0JCQlBVEVfVFhDT05UIG1vZGUgYWxzbyBuZWVkIHRvIHNlbmQgc29tZSBub3JtYWwgZnJhbWVzLCBzbyBsZXQgaXQgaW4uCi0JCQlBVEVfU1RPUCBtdXN0IGJlIGNoYW5nZWQgbm90IHRvIGJlIDB4ZmYKLQkJCXRvIHByZXZlbnQgaXQgZnJvbSBydW5uaW5nIGludG8gdGhpcyBibG9jay4KLQkJKi8KLQkJaWYgKChwQWQtPmF0ZS5Nb2RlICYgQVRFX1RYRlJBTUUpICYmIChwQWQtPmF0ZS5RSUQgPT0gUXVlSWR4KSkKLQkJewotCQkJLy8gVHhEb25lQ291bnQrKyBoYXMgYmVlbiBkb25lIGlmIFFBIGlzIHVzZWQuCi0JCQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBGQUxTRSkKLQkJCXsKLQkJCQlwQWQtPmF0ZS5UeERvbmVDb3VudCsrOwotCQkJfQotCQkJaWYgKCgocEFkLT5hdGUuVHhDb3VudCAtIHBBZC0+YXRlLlR4RG9uZUNvdW50ICsgMSkgPj0gVFhfUklOR19TSVpFKSkKLQkJCXsKLQkJCQkvKiBOb3RlIDogV2UgaW5jcmVhc2UgVHhDcHVJZHggaGVyZSwgbm90IFR4U3dGcmVlSWR4ICEgKi8KLQkJCQlJTkNfUklOR19JTkRFWChwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4LCBUWF9SSU5HX1NJWkUpOwotI2lmbmRlZiBSVF9CSUdfRU5ESUFOCi0JCQkJcFR4RCA9IChQVFhEX1NUUlVDKSAocFR4UmluZy0+Q2VsbFtwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4XS5BbGxvY1ZhKTsKLQkJCQlwT3JpVHhEID0gcFR4RDsKLQkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmVHhELCBwVHhELCBzaXplb2YoVFhEX1NUUlVDKSk7Ci0JCQkJcFR4RCA9ICZUeEQ7Ci0jZWxzZQotCQkgICAgICAgIHBEZXN0VHhEID0gKFBUWERfU1RSVUMpIChwVHhSaW5nLT5DZWxsW3BBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHhdLkFsbG9jVmEpOwotCQkgICAgICAgIHBPcmlUeEQgPSBwRGVzdFR4RCA7Ci0JCSAgICAgICAgVHhEID0gKnBEZXN0VHhEOwotCQkgICAgICAgIHBUeEQgPSAmVHhEOwotCQkgICAgICAgIFJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOwotI2VuZGlmCi0JCQkJcFR4RC0+RE1BRE9ORSA9IDA7Ci0jaWZuZGVmIFJUX0JJR19FTkRJQU4KLQkJCU5kaXNNb3ZlTWVtb3J5KHBPcmlUeEQsIHBUeEQsIHNpemVvZihUWERfU1RSVUMpKTsKLSNlbHNlCi0JCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLQkJCSpwRGVzdFR4RCA9IFR4RDsKLSNlbmRpZgotCQkJCS8vIGtpY2sgVHgtUmluZwotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0NUWF9JRFgwICsgUXVlSWR4ICogUklOR1JFR19ESUZGLCBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4KTsKLQkJCQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7Ci0JCQl9Ci0JCX0KLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0vLyAgICAgICAgIFJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwotCX0KLQotCi0JcmV0dXJuICBiUmVzY2hlZHVsZTsKLQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlQcm9jZXNzIFRYIFJpbmdzIERNQSBEb25lIGludGVycnVwdCwgcnVubmluZyBpbiBEUEMgbGV2ZWwKLQotCUFyZ3VtZW50czoKLQkJQWRhcHRlcgkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4JUlRNUEhhbmRsZVR4UmluZ0RtYURvbmVJbnRlcnJ1cHQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JSU5UX1NPVVJDRV9DU1JfU1RSVUMgVHhSaW5nQml0bWFwKQotewotLy8JVUNIQVIJCQlDb3VudCA9IDA7Ci0gICAgdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKLQlCT09MRUFOCQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKLQotCS8vIE1ha2Ugc3VyZSBUeCByaW5nIHJlc291cmNlIHdvbid0IGJlIHVzZWQgYnkgb3RoZXIgdGhyZWFkcwotCS8vTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5UeFJpbmdMb2NrKTsKLQotCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLQotCWlmIChUeFJpbmdCaXRtYXAuZmllbGQuQWMwRG1hRG9uZSkKLQkJYlJlc2NoZWR1bGUgPSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfQkUpOwotLyoKLQlpZiAoVHhSaW5nQml0bWFwLmZpZWxkLkhjY2FEbWFEb25lKQotCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfSENDQSk7Ci0qLwotCi0JaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzNEbWFEb25lKQotCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfVk8pOwotCi0JaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzJEbWFEb25lKQotCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfVkkpOwotCi0JaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzFEbWFEb25lKQotCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfQkspOwotCi0JLy8gTWFrZSBzdXJlIHRvIHJlbGVhc2UgVHggcmluZyByZXNvdXJjZQotCS8vTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5UeFJpbmdMb2NrKTsKLQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLQotCS8vIERlcXVldWUgb3V0Z29pbmcgZnJhbWVzIGZyb20gVHhTd1F1ZXVlW10gYW5kIHByb2Nlc3MgaXQKLQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOwotCi0JcmV0dXJuICBiUmVzY2hlZHVsZTsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUHJvY2VzcyBNR01UIHJpbmcgRE1BIGRvbmUgaW50ZXJydXB0LCBydW5uaW5nIGluIERQQyBsZXZlbAotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBIYW5kbGVNZ210UmluZ0RtYURvbmVJbnRlcnJ1cHQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JUFRYRF9TVFJVQwkgcFR4RDsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0gICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOwotICAgIFRYRF9TVFJVQyAgICAgICBUeEQ7Ci0jZW5kaWYKLQlQTkRJU19QQUNLRVQgcFBhY2tldDsKLS8vCWludAkJIGk7Ci0JVUNIQVIJRlJFRSA9IDA7Ci0JUFJUTVBfTUdNVF9SSU5HIHBNZ210UmluZyA9ICZwQWQtPk1nbXRSaW5nOwotCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBUWF9NR01URFRYX0lEWCwgJnBNZ210UmluZy0+VHhEbWFJZHgpOwotCXdoaWxlIChwTWdtdFJpbmctPlR4U3dGcmVlSWR4IT0gcE1nbXRSaW5nLT5UeERtYUlkeCkKLQl7Ci0JCUZSRUUrKzsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0gICAgICAgIHBEZXN0VHhEID0gKFBUWERfU1RSVUMpIChwTWdtdFJpbmctPkNlbGxbcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeF0uQWxsb2NWYSk7Ci0gICAgICAgIFR4RCA9ICpwRGVzdFR4RDsKLSAgICAgICAgcFR4RCA9ICZUeEQ7Ci0JCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOwotI2Vsc2UKLQkJcFR4RCA9IChQVFhEX1NUUlVDKSAocE1nbXRSaW5nLT5DZWxsW3BBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHhdLkFsbG9jVmEpOwotI2VuZGlmCi0JCXBUeEQtPkRNQURPTkUgPSAwOwotCQlwUGFja2V0ID0gcE1nbXRSaW5nLT5DZWxsW3BNZ210UmluZy0+VHhTd0ZyZWVJZHhdLnBOZGlzUGFja2V0OwotCi0KLQkJaWYgKHBQYWNrZXQpCi0JCXsKLQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCX0KLQkJcE1nbXRSaW5nLT5DZWxsW3BNZ210UmluZy0+VHhTd0ZyZWVJZHhdLnBOZGlzUGFja2V0ID0gTlVMTDsKLQotCQlwUGFja2V0ID0gcE1nbXRSaW5nLT5DZWxsW3BNZ210UmluZy0+VHhTd0ZyZWVJZHhdLnBOZXh0TmRpc1BhY2tldDsKLQkJaWYgKHBQYWNrZXQpCi0JCXsKLQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCX0KLQkJcE1nbXRSaW5nLT5DZWxsW3BNZ210UmluZy0+VHhTd0ZyZWVJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0JCUlOQ19SSU5HX0lOREVYKHBNZ210UmluZy0+VHhTd0ZyZWVJZHgsIE1HTVRfUklOR19TSVpFKTsKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSAgICAgICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0gICAgICAgIFdyaXRlQmFja1RvRGVzY3JpcHRvcigoUFVDSEFSKXBEZXN0VHhELCAoUFVDSEFSKXBUeEQsIFRSVUUsIFRZUEVfVFhEKTsKLSNlbmRpZgotCX0KLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1nbXRSaW5nTG9jayk7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIuIERlcXVldWUgYWxsIHBvd2VyIHNhZmUgZGVsYXllZCBicmFvZGNhc3QgZnJhbWVzIGFmdGVyIGJlYWNvbi4KLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QSGFuZGxlVEJUVEludGVycnVwdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQl7Ci0JCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQotCQl7Ci0JCX0KLQl9Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JQXJndW1lbnRzOgotCQlwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIuIFJld3JpdGUgYmVhY29uIGNvbnRlbnQgYmVmb3JlIG5leHQgc2VuZC1vdXQuCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JewotCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQuLi5cbiIpKTsKLQkJfQotCX0KLQotCi19Ci0KLVZPSUQJUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JV1BETUFfR0xPX0NGR19TVFJVQwlHbG9DZmc7Ci0KLQlpZiAocEFkID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBwQWQgaXMgTlVMTCwgcmV0dXJuLlxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFJUTVBIYW5kbGVSeENvaGVyZW50SW50ZXJydXB0IFxuIikpOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHICwgJkdsb0NmZy53b3JkKTsKLQotCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPSAwOwotCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IDA7Ci0JR2xvQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7Ci0KLQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkUpOwotCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CSyk7Ci0JUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZJKTsKLQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVk8pOwotCS8qUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0hDQ0EpOyovCi0JUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX01HTVQpOwotCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9SWCk7Ci0KLQlSVE1QRW5hYmxlUnhUeChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IFJUTVBIYW5kbGVSeENvaGVyZW50SW50ZXJydXB0IFxuIikpOwotfQotCi0KLQotCi1WT0lEIERCR1BSSU5UX1RYX1JJTkcoCi0JSU4gUFJUTVBfQURBUFRFUiAgcEFkLAotCUlOIFVDSEFSICAgICAgICAgIFF1ZUlkeCkKLXsKLQlVSU5UMzIJCUFjMEJhc2U7Ci0JVUlOVDMyCQlBYzBId0lkeCA9IDAsIEFjMFN3SWR4ID0gMCwgQUMwZnJlZUlkeDsKLQlpbnQJCQlpOwotLy8JUFVMT05HCQlwVHhEOwotCVBVTE9ORwlwdGVtcDsKLQotCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICIgICkpOwotCXN3aXRjaCAoUXVlSWR4KQotCXsKLQkJY2FzZSBRSURfQUNfQkU6Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBU0VfUFRSMCwgJkFjMEJhc2UpOwotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9DVFhfSURYMCwgJkFjMFN3SWR4KTsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDAsICZBYzBId0lkeCk7Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQWxsIFFJRF9BQ19CRSBERVNDUklQVE9SICBcbiAiICApKTsKLQkJCWZvciAoaT0wO2k8VFhfUklOR19TSVpFO2krKykKLQkJCXsKLQkJCQlwdGVtcD0gKFBVTE9ORylwQWQtPlR4UmluZ1tRSURfQUNfQkVdLkNlbGxbaV0uQWxsb2NWYTsKLQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiWyUwMmRdICAlMDhseDogJTA4bHg6ICUwOGx4OiAlMDhseFxuICIgLCBpLCAqcHRlbXAsKihwdGVtcCsxKSwqKHB0ZW1wKzIpLCoocHRlbXArMykpKTsKLQkJCX0KLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIgIFxuICIgICkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUUlEX0FDX0JLOgotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQVNFX1BUUjEsICZBYzBCYXNlKTsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQ1RYX0lEWDEsICZBYzBTd0lkeCk7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgxLCAmQWMwSHdJZHgpOwotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkFsbCBRSURfQUNfQksgREVTQ1JJUFRPUiAgXG4gIiAgKSk7Ci0JCQlmb3IgKGk9MDtpPFRYX1JJTkdfU0laRTtpKyspCi0JCQl7Ci0JCQkJcHRlbXA9IChQVUxPTkcpcEFkLT5UeFJpbmdbUUlEX0FDX0JLXS5DZWxsW2ldLkFsbG9jVmE7Ci0JCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlslMDJkXSAgJTA4bHg6ICUwOGx4OiAlMDhseDogJTA4bHhcbiAiICwgaSwgKnB0ZW1wLCoocHRlbXArMSksKihwdGVtcCsyKSwqKHB0ZW1wKzMpKSk7Ci0JCQl9Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiICBcbiAiICApKTsKLQkJCWJyZWFrOwotCQljYXNlIFFJRF9BQ19WSToKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFTRV9QVFIyLCAmQWMwQmFzZSk7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0NUWF9JRFgyLCAmQWMwU3dJZHgpOwotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMiwgJkFjMEh3SWR4KTsKLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJBbGwgUUlEX0FDX1ZJIERFU0NSSVBUT1IgXG4gIiAgKSk7Ci0JCQlmb3IgKGk9MDtpPFRYX1JJTkdfU0laRTtpKyspCi0JCQl7Ci0JCQkJcHRlbXA9IChQVUxPTkcpcEFkLT5UeFJpbmdbUUlEX0FDX1ZJXS5DZWxsW2ldLkFsbG9jVmE7Ci0JCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlslMDJkXSAgJTA4bHg6ICUwOGx4OiAlMDhseDogJTA4bHhcbiAiICwgaSwgKnB0ZW1wLCoocHRlbXArMSksKihwdGVtcCsyKSwqKHB0ZW1wKzMpKSk7Ci0JCQl9Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiICBcbiAiICApKTsKLQkJCWJyZWFrOwotCQljYXNlIFFJRF9BQ19WTzoKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFTRV9QVFIzLCAmQWMwQmFzZSk7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0NUWF9JRFgzLCAmQWMwU3dJZHgpOwotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMywgJkFjMEh3SWR4KTsKLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJBbGwgUUlEX0FDX1ZPIERFU0NSSVBUT1IgXG4gIiAgKSk7Ci0JCQlmb3IgKGk9MDtpPFRYX1JJTkdfU0laRTtpKyspCi0JCQl7Ci0JCQkJcHRlbXA9IChQVUxPTkcpcEFkLT5UeFJpbmdbUUlEX0FDX1ZPXS5DZWxsW2ldLkFsbG9jVmE7Ci0JCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlslMDJkXSAgJTA4bHg6ICUwOGx4OiAlMDhseDogJTA4bHhcbiAiICwgaSwgKnB0ZW1wLCoocHRlbXArMSksKihwdGVtcCsyKSwqKHB0ZW1wKzMpKSk7Ci0JCQl9Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiICBcbiAiICApKTsKLQkJCWJyZWFrOwotCQljYXNlIFFJRF9NR01UOgotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQVNFX1BUUjUsICZBYzBCYXNlKTsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQ1RYX0lEWDUsICZBYzBTd0lkeCk7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFg1LCAmQWMwSHdJZHgpOwotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiBBbGwgUUlEX01HTVQgIERFU0NSSVBUT1IgXG4gIiAgKSk7Ci0JCQlmb3IgKGk9MDtpPE1HTVRfUklOR19TSVpFO2krKykKLQkJCXsKLQkJCQlwdGVtcD0gKFBVTE9ORylwQWQtPk1nbXRSaW5nLkNlbGxbaV0uQWxsb2NWYTsKLQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiWyUwMmRdICAlMDhseDogJTA4bHg6ICUwOGx4OiAlMDhseFxuICIgLCBpLCAqcHRlbXAsKihwdGVtcCsxKSwqKHB0ZW1wKzIpLCoocHRlbXArMykpKTsKLQkJCX0KLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIgIFxuICIgICkpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCURCR1BSSU5UX0VSUigoIkRCR1BSSU5UX1RYX1JJTkcoUmluZyAlZCkgbm90IHN1cHBvcnRlZFxuIiwgUXVlSWR4KSk7Ci0JCQlicmVhazsKLQl9Ci0JQUMwZnJlZUlkeCA9IHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhTd0ZyZWVJZHg7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlR4UmluZyVkLCBUWF9EVFhfSURYPSVkLCBUWF9DVFhfSURYPSVkXG4iLCBRdWVJZHgsIEFjMEh3SWR4LCBBYzBTd0lkeCkpOwotCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIglUeFN3RnJlZUlkeFslZF0iLCBBQzBmcmVlSWR4KSk7Ci0JREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiCXBlbmRpbmctTkRJUz0lbGRcbiIsIHBBZC0+UmFsaW5rQ291bnRlcnMuUGVuZGluZ05kaXNQYWNrZXRDb3VudCkpOwotCi0KLX0KLQotCi1WT0lEIERCR1BSSU5UX1JYX1JJTkcoCi0JSU4gUFJUTVBfQURBUFRFUiAgcEFkKQotewotCVVJTlQzMgkJQWMwQmFzZTsKLQlVSU5UMzIJCUFjMEh3SWR4ID0gMCwgQWMwU3dJZHggPSAwLCBBQzBmcmVlSWR4OwotLy8JUFVMT05HCSBwVHhEOwotCWludAkJCWk7Ci0JVUlOVDMyCSpwdGVtcDsKLS8vCVBSWERfU1RSVUMJCXBSeEQ7Ci0KLQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAiICApKTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX0JBU0VfUFRSLCAmQWMwQmFzZSk7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBSWF9DUlhfSURYLCAmQWMwU3dJZHgpOwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfRFJYX0lEWCwgJkFjMEh3SWR4KTsKLQlBQzBmcmVlSWR4ID0gcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHg7Ci0KLQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQWxsIFJYIERTUCAgXG4gIiAgKSk7Ci0JZm9yIChpPTA7aTxSWF9SSU5HX1NJWkU7aSsrKQotCXsKLQkJcHRlbXAgPSAoVUlOVDMyICopcEFkLT5SeFJpbmcuQ2VsbFtpXS5BbGxvY1ZhOwotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiWyUwMmRdICAlMDh4OiAlMDh4OiAlMDh4OiAlMDh4XG4gIiAsIGksICpwdGVtcCwqKHB0ZW1wKzEpLCoocHRlbXArMiksKihwdGVtcCszKSkpOwotCX0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJ4UmluZywgUlhfRFJYX0lEWD0lZCwgUlhfQ1JYX0lEWD0lZCBcbiIsIEFjMEh3SWR4LCBBYzBTd0lkeCkpOwotCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIglSeFN3UmVhZElkeCBbJWRdPSIsIEFDMGZyZWVJZHgpKTsKLQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCIJcGVuZGluZy1ORElTPSVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5QZW5kaW5nTmRpc1BhY2tldENvdW50KSk7Ci19Ci0KLQotUE5ESVNfUEFDS0VUIEdldFBhY2tldEZyb21SeFJpbmcoCi0JSU4JCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAkJUFJUMjhYWF9SWERfU1RSVUMJcFNhdmVSeEQsCi0JT1VUCQlCT09MRUFOCQkJKnBiUmVzY2hlZHVsZSwKLQlJTiBPVVQJVUlOVDMyCQkJKnBSeFBlbmRpbmcpCi17Ci0JUFJYRF9TVFJVQwkJCQlwUnhEOwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlQUlhEX1NUUlVDCQkJCXBEZXN0UnhEOwotCVJYRF9TVFJVQwkJCQlSeEQ7Ci0jZW5kaWYKLQlQTkRJU19QQUNLRVQJCQlwUnhQYWNrZXQgPSBOVUxMOwotCVBORElTX1BBQ0tFVAkJCXBOZXdQYWNrZXQ7Ci0JUFZPSUQJCQkJCUFsbG9jVmE7Ci0JTkRJU19QSFlTSUNBTF9BRERSRVNTCUFsbG9jUGE7Ci0JQk9PTEVBTgkJCQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKLQotCVJUTVBfU0VNX0xPQ0soJnBBZC0+UnhSaW5nTG9jayk7Ci0KLQlpZiAoKnBSeFBlbmRpbmcgPT0gMCkKLQl7Ci0JCS8vIEdldCBob3cgbWF5IHBhY2tldHMgaGFkIGJlZW4gcmVjZWl2ZWQKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9EUlhfSURYICwgJnBBZC0+UnhSaW5nLlJ4RG1hSWR4KTsKLQotCQlpZiAocEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPT0gcEFkLT5SeFJpbmcuUnhEbWFJZHgpCi0JCXsKLQkJCS8vIG5vIG1vcmUgcnggcGFja2V0cwotCQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCS8vIGdldCByeCBwZW5kaW5nIGNvdW50Ci0JCWlmIChwQWQtPlJ4UmluZy5SeERtYUlkeCA+IHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4KQotCQkJKnBSeFBlbmRpbmcgPSBwQWQtPlJ4UmluZy5SeERtYUlkeCAtIHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4OwotCQllbHNlCi0JCQkqcFJ4UGVuZGluZwk9IHBBZC0+UnhSaW5nLlJ4RG1hSWR4ICsgUlhfUklOR19TSVpFIC0gcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHg7Ci0KLQl9Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JcERlc3RSeEQgPSAoUFJYRF9TVFJVQykgcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0uQWxsb2NWYTsKLQlSeEQgPSAqcERlc3RSeEQ7Ci0JcFJ4RCA9ICZSeEQ7Ci0JUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwUnhELCBUWVBFX1JYRCk7Ci0jZWxzZQotCS8vIFBvaW50IHRvIFJ4IGluZGV4ZWQgcnggcmluZyBkZXNjcmlwdG9yCi0JcFJ4RCA9IChQUlhEX1NUUlVDKSBwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5BbGxvY1ZhOwotI2VuZGlmCi0KLQlpZiAocFJ4RC0+RERPTkUgPT0gMCkKLQl7Ci0JCSpwUnhQZW5kaW5nID0gMDsKLQkJLy8gRE1BSW5keCBoYWQgZG9uZSBidXQgRERPTkUgYml0IG5vdCByZWFkeQotCQliUmVzY2hlZHVsZSA9IFRSVUU7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQotCS8vIHJldHVybiByeCBkZXNjcmlwdG9yCi0JTmRpc01vdmVNZW1vcnkocFNhdmVSeEQsIHBSeEQsIFJYRF9TSVpFKTsKLQotCXBOZXdQYWNrZXQgPSBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIocEFkLCBSWF9CVUZGRVJfQUdHUkVTSVpFLCBGQUxTRSwgJkFsbG9jVmEsICZBbGxvY1BhKTsKLQotCWlmIChwTmV3UGFja2V0KQotCXsKLQkJLy8gdW5tYXAgdGhlIHJ4IGJ1ZmZlcgotCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0uRG1hQnVmLkFsbG9jUGEsCi0JCQkJCSBwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5EbWFCdWYuQWxsb2NTaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQlwUnhQYWNrZXQgPSBwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5wTmRpc1BhY2tldDsKLQotCQlwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5EbWFCdWYuQWxsb2NTaXplCT0gUlhfQlVGRkVSX0FHR1JFU0laRTsKLQkJcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0ucE5kaXNQYWNrZXQJCT0gKFBORElTX1BBQ0tFVCkgcE5ld1BhY2tldDsKLQkJcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0uRG1hQnVmLkFsbG9jVmEJPSBBbGxvY1ZhOwotCQlwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5EbWFCdWYuQWxsb2NQYQk9IEFsbG9jUGE7Ci0JCS8qIHVwZGF0ZSBTRFAwIHRvIG5ldyBidWZmZXIgb2YgcnggcGFja2V0ICovCi0JCXBSeEQtPlNEUDAgPSBBbGxvY1BhOwotCX0KLQllbHNlCi0JewotCQkvL0RCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiTm8gUnggQnVmZmVyXG4iKSk7Ci0JCXBSeFBhY2tldCA9IE5VTEw7Ci0JCWJSZXNjaGVkdWxlID0gVFJVRTsKLQl9Ci0KLQlwUnhELT5ERE9ORSA9IDA7Ci0KLQkvLyBoYWQgaGFuZGxlZCBvbmUgcnggcGFja2V0Ci0JKnBSeFBlbmRpbmcgPSAqcFJ4UGVuZGluZyAtIDE7Ci0KLQkvLyB1cGRhdGUgcnggZGVzY3JpcHRvciBhbmQga2ljayByeAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBSeEQsIFRZUEVfUlhEKTsKLQlXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFJ4RCwgKFBVQ0hBUilwUnhELCBGQUxTRSwgVFlQRV9SWEQpOwotI2VuZGlmCi0JSU5DX1JJTkdfSU5ERVgocEFkLT5SeFJpbmcuUnhTd1JlYWRJZHgsIFJYX1JJTkdfU0laRSk7Ci0KLQlwQWQtPlJ4UmluZy5SeENwdUlkeCA9IChwQWQtPlJ4UmluZy5SeFN3UmVhZElkeCA9PSAwKSA/IChSWF9SSU5HX1NJWkUtMSkgOiAocEFkLT5SeFJpbmcuUnhTd1JlYWRJZHgtMSk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgUlhfQ1JYX0lEWCwgcEFkLT5SeFJpbmcuUnhDcHVJZHgpOwotCi1kb25lOgotCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5SeFJpbmdMb2NrKTsKLQkqcGJSZXNjaGVkdWxlID0gYlJlc2NoZWR1bGU7Ci0JcmV0dXJuIHBSeFBhY2tldDsKLX0KLQotCi1ORElTX1NUQVRVUyBNbG1lSGFyZFRyYW5zbWl0VHhSaW5nKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCVF1ZUlkeCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKLXsKLQlQQUNLRVRfSU5GTwlQYWNrZXRJbmZvOwotCVBVQ0hBUgkJCXBTcmNCdWZWQTsKLQlVSU5UCQkJU3JjQnVmTGVuOwotCVBUWERfU1RSVUMJCXBUeEQ7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotICAgIFBUWERfU1RSVUMgICAgICBwRGVzdFR4RDsKLSAgICBUWERfU1RSVUMgICAgICAgVHhEOwotI2VuZGlmCi0JUEhFQURFUl84MDJfMTEJcEhlYWRlcl84MDJfMTE7Ci0JQk9PTEVBTgkJCWJBY2tSZXF1aXJlZCwgYkluc2VydFRpbWVzdGFtcDsKLQlVTE9ORwkJCVNyY0J1ZlBBOwotCS8vVUNIQVIJCQlUeEJ1ZklkeDsKLQlVQ0hBUgkJCU1sbWVSYXRlOwotCVVMT05HCQkJU3dJZHggPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4OwotCVBUWFdJX1NUUlVDCXBGaXJzdFR4V0k7Ci0JLy9VTE9ORwlpOwotCS8vSFRUUkFOU01JVF9TRVRUSU5HCU1sbWVUcmFuc21pdDsgICAvL1JhdGUgZm9yIHRoaXMgTUdNVCBmcmFtZS4KLQlVTE9ORwkgRnJlZU51bTsKLQlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeSA9IE5VTEw7Ci0KLQotCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFNyY0J1ZlZBLCAmU3JjQnVmTGVuKTsKLQotCi0JaWYgKHBTcmNCdWZWQSA9PSBOVUxMKQotCXsKLQkJLy8gVGhlIGJ1ZmZlciBzaG91bGRuJ3QgYmUgTlVMTAotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQkvLyBNYWtlIHN1cmUgTUdNVCByaW5nIHJlc291cmNlIHdvbid0IGJlIHVzZWQgYnkgb3RoZXIgdGhyZWFkcwotCS8vTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5UeFJpbmdMb2NrKTsKLQotCUZyZWVOdW0gPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7Ci0KLQlpZiAoRnJlZU51bSA9PSAwKQotCXsKLQkJLy9OZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPlR4UmluZ0xvY2spOwotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQlTd0lkeCA9IHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHg7Ci0KLSNpZm5kZWYgUlRfQklHX0VORElBTgotCXBUeEQgID0gKFBUWERfU1RSVUMpIHBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0uQWxsb2NWYTsKLSNlbHNlCi0gICAgcERlc3RUeEQgID0gKFBUWERfU1RSVUMpcEFkLT5UeFJpbmdbUXVlSWR4XS5DZWxsW1N3SWR4XS5BbGxvY1ZhOwotICAgIFR4RCA9ICpwRGVzdFR4RDsKLSAgICBwVHhEID0gJlR4RDsKLSAgICBSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLSNlbmRpZgotCi0JaWYgKHBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0ucE5kaXNQYWNrZXQpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiTWxtZUhhcmRUcmFuc21pdCBFcnJvclxuIikpOwotCQkvL05kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+VHhSaW5nTG9jayk7Ci0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCS8vIG91dGdvaW5nIGZyYW1lIGFsd2F5cyB3YWtldXAgUEhZIHRvIHByZXZlbnQgZnJhbWUgbG9zdAotCQkvLyBpZiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKQotCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLQkJCUFzaWNGb3JjZVdha2V1cChwQWQsIFRSVUUpOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQlwRmlyc3RUeFdJCT0oUFRYV0lfU1RSVUMpcFNyY0J1ZlZBOwotCi0JcEhlYWRlcl84MDJfMTEgPSAoUEhFQURFUl84MDJfMTEpIChwU3JjQnVmVkEgKyBUWFdJX1NJWkUpOwotCWlmIChwSGVhZGVyXzgwMl8xMS0+QWRkcjFbMF0gJiAweDAxKQotCXsKLQkJTWxtZVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5CYXNpY01sbWVSYXRlOwotCX0KLQllbHNlCi0JewotCQlNbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlOwotCX0KLQotCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPT0gQlRZUEVfREFUQSkgJiYKLQkJKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUU9TX05VTEwpKQotCXsKLQkJcE1hY0VudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwSGVhZGVyXzgwMl8xMS0+QWRkcjEpOwotCX0KLQotCS8vIFZlcmlmeSBNbG1lIHJhdGUgZm9yIGEgLyBnIGJhbmRzLgotCWlmICgocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID4gMTQpICYmIChNbG1lUmF0ZSA8IFJBVEVfNikpIC8vIDExQSBiYW5kCi0JCU1sbWVSYXRlID0gUkFURV82OwotCi0JLy8KLQkvLyBTaG91bGQgbm90IGJlIGhhcmQgY29kZSB0byBzZXQgUHdyTWdtdCB0byAwIChQV1JfQUNUSVZFKQotCS8vIFNuaWNlIGl0J3MgYmVlbiBzZXQgdG8gMCB3aGlsZSBvbiBNZ3RNYWNIZWFkZXJJbml0Ci0JLy8gQnkgdGhlIHdheSB0aGlzIHdpbGwgY2F1c2UgZnJhbWUgdG8gYmUgc2VuZCBvbiBQV1JfU0FWRSBmYWlsZWQuCi0JLy8KLQkvLwotCS8vIEluIFdNTS1VQVBTRCwgbWxtZSBmcmFtZSBzaG91bGQgYmUgc2V0IHBzbSBhcyBwb3dlciBzYXZpbmcgYnV0IHByb2JlIHJlcXVlc3QgZnJhbWUKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSAgICAvLyBEYXRhLU51bGwgcGFja2V0cyBhbHNlIHBhc3MgdGhyb3VnaCBNTVJlcXVlc3QgaW4gUlQyODYwLCBob3dldmVyLCB3ZSBob3BlIGNvbnRyb2wgdGhlIHBzbSBiaXQgdG8gcGFzcyBBUFNECi0JaWYgKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlICE9IEJUWVBFX0RBVEEpCi0gICAgewotCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9QUk9CRV9SRVEpIHx8ICEocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKSkKLQl7Ci0JCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX0FDVElWRTsKLQl9Ci0JZWxzZQotCXsKLQkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlOwotCX0KLSAgICB9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQliSW5zZXJ0VGltZXN0YW1wID0gRkFMU0U7Ci0JaWYgKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlID09IEJUWVBFX0NOVEwpIC8vIG11c3QgYmUgUFMtUE9MTAotCXsKLQkJYkFja1JlcXVpcmVkID0gRkFMU0U7Ci0JfQotCWVsc2UgLy8gQlRZUEVfTUdNVCBvciBCVFlQRV9EQVRBKG11c3QgYmUgTlVMTCBmcmFtZSkKLQl7Ci0JCWlmIChwSGVhZGVyXzgwMl8xMS0+QWRkcjFbMF0gJiAweDAxKSAvLyBNVUxUSUNBU1QsIEJST0FEQ0FTVAotCQl7Ci0JCQliQWNrUmVxdWlyZWQgPSBGQUxTRTsKLQkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IDA7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQliQWNrUmVxdWlyZWQgPSBUUlVFOwotCQkJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gUlRNUENhbGNEdXJhdGlvbihwQWQsIE1sbWVSYXRlLCAxNCk7Ci0JCQlpZiAocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9QUk9CRV9SU1ApCi0JCQl7Ci0JCQkJYkluc2VydFRpbWVzdGFtcCA9IFRSVUU7Ci0JCQl9Ci0JCX0KLQl9Ci0JcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcEFkLT5TZXF1ZW5jZSsrOwotCWlmIChwQWQtPlNlcXVlbmNlID4gMHhmZmYpCi0JCXBBZC0+U2VxdWVuY2UgPSAwOwotCS8vIEJlZm9yZSByYWRhciBkZXRlY3Rpb24gZG9uZSwgbWdtdCBmcmFtZSBjYW4gbm90IGJlIHNlbnQgYnV0IHByb2JlIHJlcQotCS8vIEJlY2F1c2Ugd2UgbmVlZCB0byB1c2UgcHJvYmUgcmVxIHRvIHRyaWdnZXIgZHJpdmVyIHRvIHNlbmQgcHJvYmUgcmVxIGluIHBhc3NpdmUgc2NhbgotCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgIT0gU1VCVFlQRV9QUk9CRV9SRVEpCi0JCSYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQotCQkmJiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlICE9IFJEX05PUk1BTF9NT0RFKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiTWxtZUhhcmRUcmFuc21pdCAtLT4gcmFkYXIgZGV0ZWN0IG5vdCBpbiBub3JtYWwgbW9kZSAhISFcbiIpKTsKLQkJLy9OZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPlR4UmluZ0xvY2spOwotCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCX0KLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBIZWFkZXJfODAyXzExLCBESVJfV1JJVEUsIEZBTFNFKTsKLSNlbmRpZgotCS8vCi0JLy8gZmlsbCBzY2F0dGVyLWFuZC1nYXRoZXIgYnVmZmVyIGxpc3QgaW50byBUWEQuIEludGVybmFsbHkgY3JlYXRlZCBORElTIFBBQ0tFVAotCS8vIHNob3VsZCBhbHdheXMgaGFzIG9ubHkgb25lIG9oeXNpY2FsIGJ1ZmZlciwgYW5kIHRoZSB3aG9sZSBmcmFtZSBzaXplIGVxdWFscwotCS8vIHRvIHRoZSBmaXJzdCBzY2F0dGVyIGJ1ZmZlciBzaXplCi0JLy8KLQotCS8vIEluaXRpYWxpemUgVFggRGVzY3JpcHRvcgotCS8vIEZvciBpbnRlci1mcmFtZSBnYXAsIHRoZSBudW1iZXIgaXMgZm9yIHRoaXMgZnJhbWUgYW5kIG5leHQgZnJhbWUKLQkvLyBGb3IgTUxNRSByYXRlLCB3ZSB3aWxsIGZpeCBhcyAyTWIgdG8gbWF0Y2ggb3RoZXIgdmVuZG9yJ3MgaW1wbGVtZW50Ci0vLwlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IDE7Ci0KLS8vIG1hbmFnZW1lbnQgZnJhbWUgZG9lc24ndCBuZWVkIGVuY3J5cHRpb24uIHNvIHVzZSBSRVNFUlZFRF9XQ0lEIG5vIG1hdHRlciB1IGFyZSBzZW5kaW5nIHRvIHNwZWNpZmljIHdjaWQgb3Igbm90LgotCS8vIE9ubHkgYmVhY29uIHVzZSBOc2VxPVRSVUUuIFNvIGhlcmUgd2UgdXNlIE5zZXE9RkFMU0UuCi0JaWYgKHBNYWNFbnRyeSA9PSBOVUxMKQotCXsKLQlSVE1QV3JpdGVUeFdJKHBBZCwgcEZpcnN0VHhXSSwgRkFMU0UsIEZBTFNFLCBiSW5zZXJ0VGltZXN0YW1wLCBGQUxTRSwgYkFja1JlcXVpcmVkLCBGQUxTRSwKLQkJMCwgUkVTRVJWRURfV0NJRCwgKFNyY0J1ZkxlbiAtIFRYV0lfU0laRSksIFBJRF9NR01ULCAwLCAgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MsIElGU19CQUNLT0ZGLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7Ci0JfQotCWVsc2UKLQl7Ci0JCVJUTVBXcml0ZVR4V0kocEFkLCBwRmlyc3RUeFdJLCBGQUxTRSwgRkFMU0UsCi0JCQkJCWJJbnNlcnRUaW1lc3RhbXAsIEZBTFNFLCBiQWNrUmVxdWlyZWQsIEZBTFNFLAotCQkJCQkwLCBwTWFjRW50cnktPkFpZCwgKFNyY0J1ZkxlbiAtIFRYV0lfU0laRSksCi0JCQkJCXBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUywgMCwKLQkJCQkJKFVDSEFSKXBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUywKLQkJCQkJSUZTX0JBQ0tPRkYsIEZBTFNFLCAmcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUpOwotCX0KLQotCXBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0ucE5kaXNQYWNrZXQgPSBwUGFja2V0OwotCXBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLS8vCXBGaXJzdFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA9IFNyY0J1ZkxlbiAtIFRYV0lfU0laRTsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpcEZpcnN0VHhXSSwgVFlQRV9UWFdJKTsKLSNlbmRpZgotCVNyY0J1ZlBBID0gUENJX01BUF9TSU5HTEUocEFkLCBwU3JjQnVmVkEsIFNyY0J1ZkxlbiwgMCwgUENJX0RNQV9UT0RFVklDRSk7Ci0KLQotCVJUTVBXcml0ZVR4RGVzY3JpcHRvcihwQWQsIHBUeEQsIFRSVUUsIEZJRk9fRURDQSk7Ci0JcFR4RC0+TGFzdFNlYzAgPSAxOwotCXBUeEQtPkxhc3RTZWMxID0gMTsKLQlwVHhELT5TRExlbjAgPSBTcmNCdWZMZW47Ci0JcFR4RC0+U0RMZW4xID0gMDsKLQlwVHhELT5TRFB0cjAgPSBTcmNCdWZQQTsKLQlwVHhELT5ETUFET05FID0gMDsKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSAgICBSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLSAgICBXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOwotI2VuZGlmCi0KLQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOwotCi0JLy8gSW5jcmVhc2UgVFhfQ1RYX0lEWCwgYnV0IHdyaXRlIHRvIHJlZ2lzdGVyIGxhdGVyLgotCUlOQ19SSU5HX0lOREVYKHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHgsIFRYX1JJTkdfU0laRSk7Ci0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFF1ZUlkeCoweDEwLCAgcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCk7Ci0KLQkvLyBNYWtlIHN1cmUgdG8gcmVsZWFzZSBNR01UIHJpbmcgcmVzb3VyY2UKLS8vCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+VHhSaW5nTG9jayk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1ORElTX1NUQVRVUyBNbG1lRGF0YUhhcmRUcmFuc21pdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUglRdWVJZHgsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCi17Ci0JaWYgKChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgIT0gUkRfTk9STUFMX01PREUpCi0JCSkKLQl7Ci0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQotCXJldHVybiBNbG1lSGFyZFRyYW5zbWl0VHhSaW5nKHBBZCxRdWVJZHgscFBhY2tldCk7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUNhbGN1bGF0ZXMgdGhlIGR1cmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHRyYW5zbWl0IG91dCBmcmFtZXMKLQl3aXRoIGdpdmVuIHNpemUgYW5kIHNwZWNpZmllZCByYXRlLgotCi0JQXJndW1lbnRzOgotCQlwVHhECQlQb2ludGVyIHRvIHRyYW5zbWl0IGRlc2NyaXB0b3IKLQkJQWNrCQlTZXR0aW5nIGZvciBBY2sgcmVxdWlyZW1lbnQgYml0Ci0JCUZyYWdtZW50CVNldHRpbmcgZm9yIEZyYWdtZW50IGJpdAotCQlSZXRyeU1vZGUJU2V0dGluZyBmb3IgcmV0cnkgbW9kZQotCQlJZnMJCVNldHRpbmcgZm9yIElGUyBnYXAKLQkJUmF0ZQkJU2V0dGluZyBmb3IgdHJhbnNtaXQgcmF0ZQotCQlTZXJ2aWNlCQlTZXR0aW5nIGZvciBzZXJ2aWNlCi0JCUxlbmd0aAkJRnJhbWUgbGVuZ3RoCi0JCVR4UHJlYW1ibGUJU2hvcnQgb3IgTG9uZyBwcmVhbWJsZSB3aGVuIHVzaW5nIENDSyByYXRlcwotCQlRdWVJZHggLSAwLTMsIGFjY29yZGluZyB0byA4MDIuMTFlL2Q0LjQgSnVuZS8yMDAzCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUTVBXcml0ZVR4RGVzY3JpcHRvcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVFhEX1NUUlVDCQlwVHhELAotCUlOCUJPT0xFQU4JCQliV0lWLAotCUlOCVVDSEFSCQkJUXVldWVTRUwpCi17Ci0JLy8KLQkvLyBBbHdheXMgdXNlIExvbmcgcHJlYW1ibGUgYmVmb3JlIHZlcmlmaWF0aW9uIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3Mgd2VsbC4KLQkvLyBUb2RvOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGlmIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3MKLQkvLwotCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7Ci0KLQlwVHhELT5XSVYJPSAoYldJVikgPyAxOiAwOwotCXBUeEQtPlFTRUw9IChRdWV1ZVNFTCk7Ci0JLy9SVDI4NjBjPz8gIGZpeGVkIHVzaW5nIEVEQ0EgcXVldWUgZm9yIHRlc3QuLi4gIFdlIGRvdWJ0IFF1ZXVlMSBoYXMgcHJvYmxlbS4gIDIwMDYtMDktMjYgSmFuCi0JLy9wVHhELT5RU0VMPSBGSUZPX0VEQ0E7Ci0JLyoKLQlpZiAocEFkLT5iR2VuT25lSENDQSA9PSBUUlVFKQotCQlwVHhELT5RU0VMPSBGSUZPX0hDQ0E7Ci0JKi8KLQlwVHhELT5ETUFET05FID0gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV9pbmZvLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1faW5mby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTUxZTk4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV9pbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzE4ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0JY21tX2luZm8uYwotCi0gICAgQWJzdHJhY3Q6Ci0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotSU5UCVNob3dfU1NJRF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X1dpcmVsZXNzTW9kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X1R4QnVyc3RfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19UeFByZWFtYmxlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotSU5UCVNob3dfVHhQb3dlcl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0NoYW5uZWxfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19CR1Byb3RlY3Rpb25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19SVFNUaHJlc2hvbGRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19GcmFnVGhyZXNob2xkX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotSU5UCVNob3dfSHRCd19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0h0TWNzX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotSU5UCVNob3dfSHRHaV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0h0T3BNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotSU5UCVNob3dfSHRFeHRjaGFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19IdE1wZHVEZW5zaXR5X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotSU5UCVNob3dfSHRCYVdpblNpemVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19IdFJkZ19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0h0QW1zZHVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19IdEF1dG9CYV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLUlOVAlTaG93X0NvdW50cnlSZWdpb25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19Db3VudHJ5Q29kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLSNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCi1JTlQJU2hvd19Qa3RBZ2dyZWdhdGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KLQotI2lmZGVmIFdNTV9TVVBQT1JUCi1JTlQJU2hvd19XbW1DYXBhYmxlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLSNlbmRpZiAvLyBXTU1fU1VQUE9SVCAvLwotCi1JTlQJU2hvd19JRUVFODAyMTFIX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotSU5UCVNob3dfTmV0d29ya1R5cGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLUlOVAlTaG93X0F1dGhNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotSU5UCVNob3dfRW5jcnlwVHlwZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0RlZmF1bHRLZXlJRF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0tleTFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19LZXkyX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotSU5UCVNob3dfS2V5M19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0tleTRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19XUEFQU0tfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1zdGF0aWMgc3RydWN0IHsKLQlQU1RSSU5HIG5hbWU7Ci0JSU5UICgqc2hvd19wcm9jKShQUlRNUF9BREFQVEVSIHBBZGFwdGVyLCBQU1RSSU5HIGFyZyk7Ci19ICpQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DLCBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0NbXSA9IHsKLQl7IlNTSUQiLAkJCQkJU2hvd19TU0lEX1Byb2N9LAotCXsiV2lyZWxlc3NNb2RlIiwJCQlTaG93X1dpcmVsZXNzTW9kZV9Qcm9jfSwKLQl7IlR4QnVyc3QiLAkJCQkJU2hvd19UeEJ1cnN0X1Byb2N9LAotCXsiVHhQcmVhbWJsZSIsCQkJCVNob3dfVHhQcmVhbWJsZV9Qcm9jfSwKLQl7IlR4UG93ZXIiLAkJCQkJU2hvd19UeFBvd2VyX1Byb2N9LAotCXsiQ2hhbm5lbCIsCQkJCQlTaG93X0NoYW5uZWxfUHJvY30sCi0JeyJCR1Byb3RlY3Rpb24iLAkJCVNob3dfQkdQcm90ZWN0aW9uX1Byb2N9LAotCXsiUlRTVGhyZXNob2xkIiwJCQlTaG93X1JUU1RocmVzaG9sZF9Qcm9jfSwKLQl7IkZyYWdUaHJlc2hvbGQiLAkJCVNob3dfRnJhZ1RocmVzaG9sZF9Qcm9jfSwKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQl7Ikh0QnciLAkJCQkJU2hvd19IdEJ3X1Byb2N9LAotCXsiSHRNY3MiLAkJCQkJU2hvd19IdE1jc19Qcm9jfSwKLQl7Ikh0R2kiLAkJCQkJU2hvd19IdEdpX1Byb2N9LAotCXsiSHRPcE1vZGUiLAkJCQlTaG93X0h0T3BNb2RlX1Byb2N9LAotCXsiSHRFeHRjaGEiLAkJCQlTaG93X0h0RXh0Y2hhX1Byb2N9LAotCXsiSHRNcGR1RGVuc2l0eSIsCQkJU2hvd19IdE1wZHVEZW5zaXR5X1Byb2N9LAotCXsiSHRCYVdpblNpemUiLAkJICAgICAgICBTaG93X0h0QmFXaW5TaXplX1Byb2N9LAotCXsiSHRSZGciLAkJCQlTaG93X0h0UmRnX1Byb2N9LAotCXsiSHRBbXNkdSIsCQkJCVNob3dfSHRBbXNkdV9Qcm9jfSwKLQl7Ikh0QXV0b0JhIiwJCSAgICAgICAgU2hvd19IdEF1dG9CYV9Qcm9jfSwKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQl7IkNvdW50cnlSZWdpb24iLAkJCVNob3dfQ291bnRyeVJlZ2lvbl9Qcm9jfSwKLQl7IkNvdW50cnlSZWdpb25BQmFuZCIsCQlTaG93X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jfSwKLQl7IkNvdW50cnlDb2RlIiwJCQkJU2hvd19Db3VudHJ5Q29kZV9Qcm9jfSwKLSNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCi0JeyJQa3RBZ2dyZWdhdGUiLAkJCVNob3dfUGt0QWdncmVnYXRlX1Byb2N9LAotI2VuZGlmCi0KLSNpZmRlZiBXTU1fU1VQUE9SVAotCXsiV21tQ2FwYWJsZSIsCQkJCVNob3dfV21tQ2FwYWJsZV9Qcm9jfSwKLSNlbmRpZgotCXsiSUVFRTgwMjExSCIsCQkJCVNob3dfSUVFRTgwMjExSF9Qcm9jfSwKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSAgICB7Ik5ldHdvcmtUeXBlIiwJCQkJU2hvd19OZXR3b3JrVHlwZV9Qcm9jfSwKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQl7IkF1dGhNb2RlIiwJCQkJU2hvd19BdXRoTW9kZV9Qcm9jfSwKLQl7IkVuY3J5cFR5cGUiLAkJCQlTaG93X0VuY3J5cFR5cGVfUHJvY30sCi0JeyJEZWZhdWx0S2V5SUQiLAkJCVNob3dfRGVmYXVsdEtleUlEX1Byb2N9LAotCXsiS2V5MSIsCQkJCQlTaG93X0tleTFfUHJvY30sCi0JeyJLZXkyIiwJCQkJCVNob3dfS2V5Ml9Qcm9jfSwKLQl7IktleTMiLAkJCQkJU2hvd19LZXkzX1Byb2N9LAotCXsiS2V5NCIsCQkJCQlTaG93X0tleTRfUHJvY30sCi0JeyJXUEFQU0siLAkJCQkJU2hvd19XUEFQU0tfUHJvY30sCi0Je05VTEwsIE5VTEx9Ci19OwotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIEdldCBEcml2ZXIgdmVyc2lvbi4KLQotICAgIFJldHVybjoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBTZXRfRHJpdmVyVmVyc2lvbl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEcml2ZXIgdmVyc2lvbi0lc1xuIiwgU1RBX0RSSVZFUl9WRVJTSU9OKSk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBDb3VudHJ5IFJlZ2lvbi4KLSAgICAgICAgVGhpcyBjb21tYW5kIHdpbGwgbm90IHdvcmssIGlmIHRoZSBmaWVsZCBvZiBDb3VudHJ5UmVnaW9uIGluIGVlcHJvbSBpcyBwcm9ncmFtbWVkLgotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9Db3VudHJ5UmVnaW9uX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlpbnQgcmV0dmFsOwotCi0jaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAotCXJldHVybiAtRU9QTk9UU1VQUDsKLSNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCi0KLQlyZXR2YWwgPSBSVF9DZmdTZXRDb3VudHJ5UmVnaW9uKHBBZCwgYXJnLCBCQU5EXzI0Ryk7Ci0JaWYgKHJldHZhbCA9PSBGQUxTRSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JLy8gaWYgc2V0IGNvdW50cnkgcmVnaW9uLCBkcml2ZXIgbmVlZHMgdG8gYmUgcmVzZXQKLQlCdWlsZENoYW5uZWxMaXN0KHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQ291bnRyeVJlZ2lvbl9Qcm9jOjooQ291bnRyeVJlZ2lvbj0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24pKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IENvdW50cnkgUmVnaW9uIGZvciBBIGJhbmQuCi0gICAgICAgIFRoaXMgY29tbWFuZCB3aWxsIG5vdCB3b3JrLCBpZiB0aGUgZmllbGQgb2YgQ291bnRyeVJlZ2lvbiBpbiBlZXByb20gaXMgcHJvZ3JhbW1lZC4KLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlpbnQgcmV0dmFsOwotCi0jaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAotCXJldHVybiAtRU9QTk9UU1VQUDsKLSNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCi0KLQlyZXR2YWwgPSBSVF9DZmdTZXRDb3VudHJ5UmVnaW9uKHBBZCwgYXJnLCBCQU5EXzVHKTsKLQlpZiAocmV0dmFsID09IEZBTFNFKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQkvLyBpZiBzZXQgY291bnRyeSByZWdpb24sIGRyaXZlciBuZWVkcyB0byBiZSByZXNldAotCUJ1aWxkQ2hhbm5lbExpc3QocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYzo6KENvdW50cnlSZWdpb249JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFdpcmVsZXNzIE1vZGUKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfV2lyZWxlc3NNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlJTlQJc3VjY2VzcyA9IFRSVUU7Ci0KLQlzdWNjZXNzID0gUlRfQ2ZnU2V0V2lyZWxlc3NNb2RlKHBBZCwgYXJnKTsKLQlpZiAoc3VjY2VzcykKLQl7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJTE9ORwlXaXJlbGVzc01vZGUgPSBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlOwotCi0JCQlSVE1QU2V0UGh5TW9kZShwQWQsIFdpcmVsZXNzTW9kZSk7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQlpZiAoV2lyZWxlc3NNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCi0JCQl7Ci0JCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IFRSVUU7Ci0JCQkJcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IFRSVUU7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IEZBTFNFOwotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKLQkJCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCS8vIFNldCBBZGhvY01vZGUgcmF0ZXMKLQkJCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKLQkJCXsKLQkJCQlNbG1lVXBkYXRlVHhSYXRlcyhwQWQsIEZBTFNFLCAwKTsKLQkJCQlNYWtlSWJzc0JlYWNvbihwQWQpOyAgICAgICAgICAgLy8gcmUtYnVpbGQgQkVBQ09OIGZyYW1lCi0JCQkJQXNpY0VuYWJsZUlic3NTeW5jKHBBZCk7ICAgICAgIC8vIGNvcHkgdG8gb24tY2hpcCBtZW1vcnkKLQkJCX0KLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JCS8vIGl0IGlzIG5lZWRlZCB0byBzZXQgU1NJRCB0byB0YWtlIGVmZmVjdAotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQlTZXRDb21tb25IVChwQWQpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfV2lyZWxlc3NNb2RlX1Byb2M6Oig9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9XaXJlbGVzc01vZGVfUHJvYzo6cGFyYW1ldGVycyBvdXQgb2YgcmFuZ2VcbiIpKTsKLQl9Ci0KLQlyZXR1cm4gc3VjY2VzczsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgQ2hhbm5lbAotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9DaGFubmVsX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlJTlQJCXN1Y2Nlc3MgPSBUUlVFOwotCVVDSEFSCUNoYW5uZWw7Ci0KLQlDaGFubmVsID0gKFVDSEFSKSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JLy8gY2hlY2sgaWYgdGhpcyBjaGFubmVsIGlzIHZhbGlkCi0JaWYgKENoYW5uZWxTYW5pdHkocEFkLCBDaGFubmVsKSA9PSBUUlVFKQotCXsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IENoYW5uZWw7Ci0KLQkJCWlmIChNT05JVE9SX09OKHBBZCkpCi0JCQl7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkJTl9DaGFubmVsQ2hlY2socEFkKTsKLQkJCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCi0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCkKLQkJCQl7Ci0JCQkJCU5fU2V0Q2VuQ2gocEFkKTsKLQkJCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKLQkJCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfNDAsIGNvbnRyb2xfY2hhbm5lbCglZCksIENlbnRyYWxDaGFubmVsKCVkKSBcbiIsCi0JCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKSk7Ci0JCQkJfQotCQkJCWVsc2UKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCQl7Ci0JCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwotCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfMjAsIENoYW5uZWwoJWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCXN1Y2Nlc3MgPSBUUlVFOwotCX0KLQllbHNlCi0JewotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQlzdWNjZXNzID0gRkFMU0U7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JfQotCi0KLQlpZiAoc3VjY2VzcyA9PSBUUlVFKQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQ2hhbm5lbF9Qcm9jOjooQ2hhbm5lbD0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKLQotCXJldHVybiBzdWNjZXNzOwotfQotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFNob3J0IFNsb3QgVGltZSBFbmFibGUgb3IgRGlzYWJsZQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9TaG9ydFNsb3RfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCWludCByZXR2YWw7Ci0KLQlyZXR2YWwgPSBSVF9DZmdTZXRTaG9ydFNsb3QocEFkLCBhcmcpOwotCWlmIChyZXR2YWwgPT0gVFJVRSkKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1Nob3J0U2xvdF9Qcm9jOjooU2hvcnRTbG90PSVkKVxuIiwgcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUpKTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgVHggcG93ZXIKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfVHhQb3dlcl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JTE9ORyBUeFBvd2VyOwotCUlOVCAgIHN1Y2Nlc3MgPSBGQUxTRTsKLQotCVR4UG93ZXIgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCWlmIChUeFBvd2VyIDw9IDEwMCkKLQl7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQgPSBUeFBvd2VyOwotCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdDsKLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQlzdWNjZXNzID0gVFJVRTsKLQl9Ci0JZWxzZQotCQlzdWNjZXNzID0gRkFMU0U7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfVHhQb3dlcl9Qcm9jOjooVHhQb3dlclBlcmNlbnRhZ2U9JWxkKVxuIiwgcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UpKTsKLQotCXJldHVybiBzdWNjZXNzOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCAxMUIvMTFHIFByb3RlY3Rpb24KLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfQkdQcm90ZWN0aW9uX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkpCi0JewotCQljYXNlIDA6IC8vQVVUTwotCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMDsKLQkJCWJyZWFrOwotCQljYXNlIDE6IC8vQWx3YXlzIE9uCi0JCQlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjogLy9BbHdheXMgT0ZGCi0JCQlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAyOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6ICAvL0ludmFsaWQgYXJndW1lbnQKLQkJCXJldHVybiBGQUxTRTsKLQl9Ci0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9CR1Byb3RlY3Rpb25fUHJvYzo6KEJHUHJvdGVjdGlvbj0lbGQpXG4iLCBwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24pKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBUeFByZWFtYmxlCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X1R4UHJlYW1ibGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVJUXzgwMl8xMV9QUkVBTUJMRQlQcmVhbWJsZTsKLQotCVByZWFtYmxlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCi0Jc3dpdGNoIChQcmVhbWJsZSkKLQl7Ci0JCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZVNob3J0OgotCQkJcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFByZWFtYmxlOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCQlNbG1lU2V0VHhQcmVhbWJsZShwQWQsIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCQlicmVhazsKLQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlTG9uZzoKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlQXV0bzoKLQkJCS8vIGlmIHVzZXIgd2FudHMgQVVUTywgaW5pdGlhbGl6ZSB0byBMT05HIGhlcmUsIHRoZW4gY2hhbmdlIGFjY29yZGluZyB0byBBUCdzCi0JCQkvLyBjYXBhYmlsaXR5IHVwb24gYXNzb2NpYXRpb24uCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCQlwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUHJlYW1ibGU7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJCU1sbWVTZXRUeFByZWFtYmxlKHBBZCwgUnQ4MDJfMTFQcmVhbWJsZUxvbmcpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAotCQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9UeFByZWFtYmxlX1Byb2M6OihUeFByZWFtYmxlPSVsZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBSVFMgVGhyZXNob2xkCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X1JUU1RocmVzaG9sZF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JIE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQgICAgICAgICAgIFJ0c1RocmVzaDsKLQotCVJ0c1RocmVzaCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZigoUnRzVGhyZXNoID4gMCkgJiYgKFJ0c1RocmVzaCA8PSBNQVhfUlRTX1RIUkVTSE9MRCkpCi0JCXBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCAgPSAoVVNIT1JUKVJ0c1RocmVzaDsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQllbHNlIGlmIChSdHNUaHJlc2ggPT0gMCkKLQkJcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gTUFYX1JUU19USFJFU0hPTEQ7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1JUU1RocmVzaG9sZF9Qcm9jOjooUlRTVGhyZXNob2xkPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgRnJhZ21lbnQgVGhyZXNob2xkCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X0ZyYWdUaHJlc2hvbGRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCSBORElTXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCAgICAgRnJhZ1RocmVzaDsKLQotCUZyYWdUaHJlc2ggPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKEZyYWdUaHJlc2ggPiBNQVhfRlJBR19USFJFU0hPTEQgfHwgRnJhZ1RocmVzaCA8IE1JTl9GUkFHX1RIUkVTSE9MRCkKLQl7Ci0JCS8vSWxsZWdhbCBGcmFnVGhyZXNoIHNvIHdlIHNldCBpdCB0byBkZWZhdWx0Ci0JCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gTUFYX0ZSQUdfVEhSRVNIT0xEOwotCX0KLQllbHNlIGlmIChGcmFnVGhyZXNoICUgMiA9PSAxKQotCXsKLQkJLy8gVGhlIGxlbmd0aCBvZiBlYWNoIGZyYWdtZW50IHNoYWxsIGFsd2F5cyBiZSBhbiBldmVuIG51bWJlciBvZiBvY3RldHMsIGV4Y2VwdCBmb3IgdGhlIGxhc3QgZnJhZ21lbnQKLQkJLy8gb2YgYW4gTVNEVSBvciBNTVBEVSwgd2hpY2ggbWF5IGJlIGVpdGhlciBhbiBldmVuIG9yIGFuIG9kZCBudW1iZXIgb2Ygb2N0ZXRzLgotCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IChVU0hPUlQpKEZyYWdUaHJlc2ggLSAxKTsKLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSAoVVNIT1JUKUZyYWdUaHJlc2g7Ci0JfQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9PSBNQVhfRlJBR19USFJFU0hPTEQpCi0JCQlwQWQtPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gVFJVRTsKLQkJZWxzZQotCQkJcEFkLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IEZBTFNFOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9GcmFnVGhyZXNob2xkX1Byb2M6OihGcmFnVGhyZXNob2xkPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBUeEJ1cnN0Ci0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X1R4QnVyc3RfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCUxPTkcgVHhCdXJzdDsKLQotCVR4QnVyc3QgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCWlmIChUeEJ1cnN0ID09IDEpCi0JCXBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gVFJVRTsKLQllbHNlIGlmIChUeEJ1cnN0ID09IDApCi0JCXBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gRkFMU0U7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9UeEJ1cnN0X1Byb2M6OihUeEJ1cnN0PSVkKVxuIiwgcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0jaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgVHhCdXJzdAotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9Qa3RBZ2dyZWdhdGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCUxPTkcgYWdncmU7Ci0KLQlhZ2dyZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoYWdncmUgPT0gMSkKLQkJcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9IFRSVUU7Ci0JZWxzZSBpZiAoYWdncmUgPT0gMCkKLQkJcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9IEZBTFNFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9Qa3RBZ2dyZWdhdGVfUHJvYzo6KEFHR1JFPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0jZW5kaWYKLQotCi0jaWZkZWYgSU5GX0FNQVpPTl9QUEEKLUlOVAlTZXRfSU5GX0FNQVpPTl9TRV9QUEFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVUxPTkcgYWdncmU7Ci0JVUlOVCBzdGF0dXM7Ci0KLQlhZ2dyZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoYWdncmUgPT0gMSkKLQl7Ci0JCWlmKHBBZC0+UFBBRW5hYmxlPT1UUlVFKQotCQl7Ci0JCQlwcmludGsoIklORl9BTUFaT05fU0VfUFBBIGFscmVhZHkgZW5hYmxlZCBcbiIpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKHBwYV9ob29rX2RpcmVjdHBhdGhfcmVnaXN0ZXJfZGV2X2ZuKQotCQkJewotCQkJCVVJTlQzMiBnX2lmX2lkOwotCi0JCQkJaWYgKHBBZC0+cERpcmVjdHBhdGhDYiA9PSBOVUxMKQotCQkJCXsKLQkJCQkJIHBBZC0+cERpcmVjdHBhdGhDYiA9IChQUEFfRElSRUNUUEFUSF9DQiAqKSBrbWFsbG9jIChzaXplb2YoUFBBX0RJUkVDVFBBVEhfQ0IpLCBHRlBfQVRPTUlDKTsKLQkJCQkgICAgICAgIHByaW50aygiUmVhbGxvYyBtZW1vcnkgZm9yICBwRGlyZWN0cGF0aENiID8/XG4iKTsKLQkJCQl9Ci0KLQkJCQkvKiByZWdpc3RlciBjYWxsYmFjayAqLwotCQkJCXBBZC0+cERpcmVjdHBhdGhDYi0+cnhfZm4gPSBOVUxMOwotCQkJCXBBZC0+cERpcmVjdHBhdGhDYi0+c3RvcF90eF9mbiA9IE5VTEw7Ci0JCQkJcEFkLT5wRGlyZWN0cGF0aENiLT5zdGFydF90eF9mbiA9IE5VTEw7Ci0KLQkJCQlzdGF0dXMgPSBwcGFfaG9va19kaXJlY3RwYXRoX3JlZ2lzdGVyX2Rldl9mbigmZ19pZl9pZCwgcEFkLT5uZXRfZGV2LCBwQWQtPnBEaXJlY3RwYXRoQ2IsIFBQQV9GX0RJUkVDVFBBVEhfRVRIX0lGKTsKLQotCQkJCWlmKHN0YXR1cz09MSkKLQkJCQl7Ci0JCQkJCXBBZC0+Z19pZl9pZD1nX2lmX2lkOwotCQkJCQlwcmludGsoInJlZ2lzdGVyIElORl9BTUFaT05fU0VfUFBBIHN1Y2Nlc3MgOnJldDolZCBpZDolZDolZFxuIixzdGF0dXMscEFkLT5nX2lmX2lkLGdfaWZfaWQpOwotCQkJCQlwQWQtPlBQQUVuYWJsZT1UUlVFOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlwcmludGsoInJlZ2lzdGVyIElORl9BTUFaT05fU0VfUFBBIGZhaWwgOnJldDolZFxuIixzdGF0dXMpOwotCQkJCX0KLQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXByaW50aygiSU5GX0FNQVpPTl9TRV9QUEEgZW5hYmxlIGZhaWwgOiB0aGVyZSBpcyBubyBJTkZfQU1BWk9OX1NFX1BQQSBtb2R1bGUgLiBcbiIpOwotCQkJfQotCQl9Ci0KLQotCX0KLQllbHNlIGlmIChhZ2dyZSA9PSAwKQotCXsKLQkJaWYocEFkLT5QUEFFbmFibGU9PUZBTFNFKQotCQl7Ci0KLXByaW50aygiSU5GX0FNQVpPTl9TRV9QUEEgYWxyZWFkeSBkaXNhYmxlIFxuIik7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAocHBhX2hvb2tfZGlyZWN0cGF0aF9yZWdpc3Rlcl9kZXZfZm4pCi0JCQl7Ci0JCQkJVUlOVDMyIGdfaWZfaWQ7Ci0JCQkJZ19pZl9pZD1wQWQtPmdfaWZfaWQ7Ci0JCQkJcHJpbnRrKCJnX2lmX2lkPSVkIFxuIixwQWQtPmdfaWZfaWQpOwotCQkJCXN0YXR1cz1wcGFfaG9va19kaXJlY3RwYXRoX3JlZ2lzdGVyX2Rldl9mbigmZ19pZl9pZCwgcEFkLT5uZXRfZGV2LCBOVUxMLCBQUEFfRl9ESVJFQ1RQQVRIX0RFUkVHSVNURVIpOwotCi0JCQkJaWYoc3RhdHVzPT0xKQotCQkJCXsKLQkJCQkJcEFkLT5nX2lmX2lkPTA7Ci0JCQkJCXByaW50aygidW5yZWdpc3RlciBJTkZfQU1BWk9OX1NFX1BQQSBzdWNjZXNzIDpyZXQ6JWRcbiIsc3RhdHVzKTsKLQkJCQkJcEFkLT5QUEFFbmFibGU9RkFMU0U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXByaW50aygidW5yZWdpc3RlciBJTkZfQU1BWk9OX1NFX1BQQSBmYWlsIDpyZXQ6JWRcbiIsc3RhdHVzKTsKLQkJCQl9Ci0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwcmludGsoIklORl9BTUFaT05fU0VfUFBBIGVuYWJsZSBmYWlsIDogdGhlcmUgaXMgbm8gSU5GX0FNQVpPTl9TRV9QUEEgbW9kdWxlIC4gXG4iKTsKLQkJCX0KLQkJfQotCi0JfQotCWVsc2UKLQl7Ci0JCXByaW50aygiSW52YWxpZCBhcmd1bWVudCAlZCBcbiIsYWdncmUpOwotCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLQotfQotI2VuZGlmIC8vIElORl9BTUFaT05fUFBBIC8vCi0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgSUVFRTgwMjExSC4KLSAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgMSB3aGVuIG5lZWRzIHJhZGFyIGRldGVjdGlvbiwgb3RoZXJ3aXNlIDAKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfSUVFRTgwMjExSF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0gICAgTE9ORyBpZWVlODAyMTFoOwotCi0JaWVlZTgwMjExaCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoaWVlZTgwMjExaCA9PSAxKQotCQlwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9IFRSVUU7Ci0JZWxzZSBpZiAoaWVlZTgwMjExaCA9PSAwKQotCQlwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9IEZBTFNFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSUVFRTgwMjExSF9Qcm9jOjooSUVFRTgwMjExSD0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0jaWZkZWYgREJHCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIEZvciBEZWJ1ZyBpbmZvcm1hdGlvbgotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9EZWJ1Z19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFNldF9EZWJ1Z19Qcm9jICoqKioqKioqKioqKioqKioqKipcbiIpKTsKLQotICAgIGlmKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPD0gUlRfREVCVUdfTE9VRCkKLSAgICAgICAgUlREZWJ1Z0xldmVsID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBTZXRfRGVidWdfUHJvYyhSVERlYnVnTGV2ZWwgPSAlbGQpXG4iLCBSVERlYnVnTGV2ZWwpKTsKLQotCXJldHVybiBUUlVFOwotfQotI2VuZGlmCi0KLUlOVAlTaG93X0Rlc2NJbmZvX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlJTlQgaSwgUXVlSWR4PTA7Ci0vLyAgVUxPTkcJUmVnVmFsdWU7Ci0gICAgICAgIFBSVDI4WFhfUlhEX1NUUlVDIHBSeEQ7Ci0gICAgICAgIFBUWERfU1RSVUMgcFR4RDsKLQlQUlRNUF9UWF9SSU5HCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUXVlSWR4XTsKLQlQUlRNUF9NR01UX1JJTkcJcE1nbXRSaW5nID0gJnBBZC0+TWdtdFJpbmc7Ci0JUFJUTVBfUlhfUklORwlwUnhSaW5nID0gJnBBZC0+UnhSaW5nOwotCi0JZm9yKGk9MDtpPFRYX1JJTkdfU0laRTtpKyspCi0JewotCSAgICBwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbaV0uQWxsb2NWYTsKLQkgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIkRlc2MgIyVkXG4iLGkpKTsKLQkgICAgaGV4X2R1bXAoIlR4IERlc2NyaXB0b3IiLCAoUFVDSEFSKXBUeEQsIDE2KTsKLQkgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoInBUeEQtPkRNQURPTkUgPSAleFxuIiwgcFR4RC0+RE1BRE9ORSkpOwotCX0KLQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKSk7Ci0JZm9yKGk9MDtpPE1HTVRfUklOR19TSVpFO2krKykKLQl7Ci0JICAgIHBUeEQgPSAoUFRYRF9TVFJVQykgcE1nbXRSaW5nLT5DZWxsW2ldLkFsbG9jVmE7Ci0JICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJEZXNjICMlZFxuIixpKSk7Ci0JICAgIGhleF9kdW1wKCJNZ210IERlc2NyaXB0b3IiLCAoUFVDSEFSKXBUeEQsIDE2KTsKLQkgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoInBNZ210LT5ETUFET05FID0gJXhcbiIsIHBUeEQtPkRNQURPTkUpKTsKLQl9Ci0JREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIikpOwotCWZvcihpPTA7aTxSWF9SSU5HX1NJWkU7aSsrKQotCXsKLQkgICAgcFJ4RCA9IChQUlQyOFhYX1JYRF9TVFJVQykgcFJ4UmluZy0+Q2VsbFtpXS5BbGxvY1ZhOwotCSAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiRGVzYyAjJWRcbiIsaSkpOwotCSAgICBoZXhfZHVtcCgiUnggRGVzY3JpcHRvciIsIChQVUNIQVIpcFJ4RCwgMTYpOwotCSAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgicFJ4RC0+RERPTkUgPSAleFxuIiwgcFJ4RC0+RERPTkUpKTsKLQl9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBSZXNldCBzdGF0aXN0aWNzIGNvdW50ZXIKLQotICAgIEFyZ3VtZW50czoKLSAgICAgICAgcEFkYXB0ZXIgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0gICAgICAgIGFyZwotCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X1Jlc2V0U3RhdENvdW50ZXJfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCS8vVUNIQVIgICAgICAgICAgIGk7Ci0JLy9NQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PlNldF9SZXNldFN0YXRDb3VudGVyX1Byb2NcbiIpKTsKLQotCS8vIGFkZCB0aGUgbW9zdCB1cC10by1kYXRlIGgvdyByYXcgY291bnRlcnMgaW50byBzb2Z0d2FyZSBjb3VudGVycwotCU5JQ1VwZGF0ZVJhd0NvdW50ZXJzKHBBZCk7Ci0KLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5XbGFuQ291bnRlcnMsIHNpemVvZihDT1VOVEVSXzgwMl8xMSkpOwotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvdW50ZXJzODAyMywgc2l6ZW9mKENPVU5URVJfODAyXzMpKTsKLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5SYWxpbmtDb3VudGVycywgc2l6ZW9mKENPVU5URVJfUkFMSU5LKSk7Ci0KLQkvLyBSZXNldCBIb3RTcG90IGNvdW50ZXIKLQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlBZGQgV1BBIGtleSBwcm9jZXNzLgotCQlJbiBBZGhvYyBXUEFOT05FLCBiUGFpcndpc2UgPSAwOyAgS2V5SWR4ID0gMDsKLQotCUFyZ3VtZW50czoKLQkJcEFkCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCXBCdWYJCQkJCQkJUG9pbnRlciB0byB0aGUgd2hlcmUgdGhlIGtleSBzdG9yZWQKLQotCVJldHVybiBWYWx1ZToKLQkJTkRJU19TVUNDRVNTCQkJCQlBZGQga2V5IHN1Y2Nlc3NmdWxseQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotCi1CT09MRUFOIFJUTVBDaGVja1N0clByaW50QWJsZSgKLSAgICBJTiAgQ0hBUiAqcEluUHV0U3RyLAotICAgIElOICBVQ0hBUiBzdHJMZW4pCi17Ci0gICAgVUNIQVIgaT0wOwotCi0gICAgZm9yIChpPTA7IGk8c3RyTGVuOyBpKyspCi0gICAgewotICAgICAgICBpZiAoKHBJblB1dFN0cltpXSA8IDB4MjEpIHx8Ci0gICAgICAgICAgICAocEluUHV0U3RyW2ldID4gMHg3RSkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlSZW1vdmUgV1BBIEtleSBwcm9jZXNzCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwQnVmCQkJCQkJCVBvaW50ZXIgdG8gdGhlIHdoZXJlIHRoZSBrZXkgc3RvcmVkCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5ESVNfU1VDQ0VTUwkJCQkJQWRkIGtleSBzdWNjZXNzZnVsbHkKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLVZPSUQgICAgUlRNUFNldERlc2lyZWRSYXRlcygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBMT05HICAgICAgICAgICAgUmF0ZXMpCi17Ci0gICAgTkRJU184MDJfMTFfUkFURVMgYXJ5UmF0ZXM7Ci0KLSAgICBtZW1zZXQoJmFyeVJhdGVzLCAweDAwLCBzaXplb2YoTkRJU184MDJfMTFfUkFURVMpKTsKLSAgICBzd2l0Y2ggKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgUEhZXzExQTogLy8gQSBvbmx5Ci0gICAgICAgICAgICBzd2l0Y2ggKFJhdGVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgNjAwMDAwMDogLy82TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MGM7IC8vIDZNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA5MDAwMDAwOiAvLzlNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgxMjsgLy8gOU0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDEyMDAwMDAwOiAvLzEyTQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTg7IC8vIDEyTQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMTgwMDAwMDA6IC8vMThNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgyNDsgLy8gMThNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDAwMDAwMDogLy8yNE0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDMwOyAvLyAyNE0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU180OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDM2MDAwMDAwOiAvLzM2TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NDg7IC8vIDM2TQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNDgwMDAwMDA6IC8vNDhNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2MDsgLy8gNDhNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA1NDAwMDAwMDogLy81NE0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDZjOyAvLyA1NE0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU183OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIC0xOiAvL0F1dG8KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NmM7IC8vIDU0TWJwcwotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1sxXSA9IDB4NjA7IC8vIDQ4TWJwcwotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1syXSA9IDB4NDg7IC8vIDM2TWJwcwotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1szXSA9IDB4MzA7IC8vIDI0TWJwcwotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s0XSA9IDB4MjQ7IC8vIDE4TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s1XSA9IDB4MTg7IC8vIDEyTQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s2XSA9IDB4MTI7IC8vIDlNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzddID0gMHgwYzsgLy8gNk0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBIWV8xMUJHX01JWEVEOiAvLyBCL0cgTWl4ZWQKLSAgICAgICAgY2FzZSBQSFlfMTFCOiAvLyBCIG9ubHkKLSAgICAgICAgY2FzZSBQSFlfMTFBQkdfTUlYRUQ6IC8vIEEvQi9HIE1peGVkCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBzd2l0Y2ggKFJhdGVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgMTAwMDAwMDogLy8xTQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MDI7Ci0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDAwMDAwOiAvLzJNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgwNDsKLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDUwMDAwMDA6IC8vNS41TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MGI7IC8vIDUuNU0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18yOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDExMDAwMDAwOiAvLzExTQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTY7IC8vIDExTQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNjAwMDAwMDogLy82TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MGM7IC8vIDZNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA5MDAwMDAwOiAvLzlNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgxMjsgLy8gOU0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDEyMDAwMDAwOiAvLzEyTQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTg7IC8vIDEyTQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMTgwMDAwMDA6IC8vMThNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgyNDsgLy8gMThNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDAwMDAwMDogLy8yNE0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDMwOyAvLyAyNE0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU180OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDM2MDAwMDAwOiAvLzM2TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NDg7IC8vIDM2TQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNDgwMDAwMDA6IC8vNDhNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2MDsgLy8gNDhNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA1NDAwMDAwMDogLy81NE0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDZjOyAvLyA1NE0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU183OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIC0xOiAvL0F1dG8KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCi0gICAgICAgICAgICAgICAgICAgIHsgLy9CIE9ubHkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgxNjsgLy8gMTFNYnBzCi0gICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1sxXSA9IDB4MGI7IC8vIDUuNU1icHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzJdID0gMHgwNDsgLy8gMk1icHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzNdID0gMHgwMjsgLy8gMU1icHMKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsgLy8oQi9HKSBNaXhlZCBvciAoQS9CL0cpIE1peGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NmM7IC8vIDU0TWJwcwotICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMV0gPSAweDYwOyAvLyA0OE1icHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzJdID0gMHg0ODsgLy8gMzZNYnBzCi0gICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1szXSA9IDB4MzA7IC8vIDI0TWJwcwotICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNF0gPSAweDE2OyAvLyAxMU1icHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzVdID0gMHgwYjsgLy8gNS41TWJwcwotICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNl0gPSAweDA0OyAvLyAyTWJwcwotICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbN10gPSAweDAyOyAvLyAxTWJwcwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKLSAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGUsICZhcnlSYXRlcywgc2l6ZW9mKE5ESVNfODAyXzExX1JBVEVTKSk7Ci0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIFJUTVBTZXREZXNpcmVkUmF0ZXMgKCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeClcbiIsCi0gICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0sCi0gICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10sCi0gICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs0XSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNV0sCi0gICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs2XSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbN10gKSk7Ci0gICAgLy8gQ2hhbmdpbmcgRGVzaXJlZFJhdGUgbWF5IGFmZmVjdCB0aGUgTUFYIFRYIHJhdGUgd2UgdXNlZCB0byBUWCBmcmFtZXMgb3V0Ci0gICAgTWxtZVVwZGF0ZVR4UmF0ZXMocEFkYXB0ZXIsIEZBTFNFLCAwKTsKLX0KLQotTkRJU19TVEFUVVMgUlRNUFdQQVJlbW92ZUtleVByb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFZPSUQJCQlwQnVmKQotewotCVBORElTXzgwMl8xMV9SRU1PVkVfS0VZIHBLZXk7Ci0JVUxPTkcJCQkJCUtleUlkeDsKLQlORElTX1NUQVRVUwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JQk9PTEVBTgkJYlR4S2V5OwkJCS8vIFNldCB0aGUga2V5IGFzIHRyYW5zbWl0IGtleQotCUJPT0xFQU4JCWJQYWlyd2lzZTsJCS8vIEluZGljYXRlIHRoZSBrZXkgaXMgcGFpcndpc2Uga2V5Ci0JQk9PTEVBTgkJYktleVJTQzsJCS8vIGluZGljYXRlIHRoZSByZWNlaXZlICBTQyBzZXQgYnkgS2V5UlNDIHZhbHVlLgotCQkJCQkJCQkvLyBPdGhlcndpc2UsIGl0IHdpbGwgc2V0IGJ5IHRoZSBOSUMuCi0JQk9PTEVBTgkJYkF1dGhlbnRpY2F0b3I7IC8vIGluZGljYXRlIGtleSBpcyBzZXQgYnkgYXV0aGVudGljYXRvci4KLQlJTlQJCWk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIi0tLT4gUlRNUFdQQVJlbW92ZUtleVByb2NcbiIpKTsKLQotCXBLZXkgPSAoUE5ESVNfODAyXzExX1JFTU9WRV9LRVkpIHBCdWY7Ci0JS2V5SWR4ID0gcEtleS0+S2V5SW5kZXggJiAweGZmOwotCS8vIEJpdCAzMSBvZiBBZGQta2V5LCBUeCBLZXkKLQliVHhLZXkJCSAgID0gKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkgPyBUUlVFIDogRkFMU0U7Ci0JLy8gQml0IDMwIG9mIEFkZC1rZXkgUGFpcndpc2VLZXkKLQliUGFpcndpc2UJICAgPSAocEtleS0+S2V5SW5kZXggJiAweDQwMDAwMDAwKSA/IFRSVUUgOiBGQUxTRTsKLQkvLyBCaXQgMjkgb2YgQWRkLWtleSBLZXlSU0MKLQliS2V5UlNDCQkgICA9IChwS2V5LT5LZXlJbmRleCAmIDB4MjAwMDAwMDApID8gVFJVRSA6IEZBTFNFOwotCS8vIEJpdCAyOCBvZiBBZGQta2V5IEF1dGhlbnRpY2F0b3IKLQliQXV0aGVudGljYXRvciA9IChwS2V5LT5LZXlJbmRleCAmIDB4MTAwMDAwMDApID8gVFJVRSA6IEZBTFNFOwotCi0JLy8gMS4gSWYgYlR4IGlzIFRSVUUsIHJldHVybiBmYWlsdXJlIGluZm9ybWF0aW9uCi0JaWYgKGJUeEtleSA9PSBUUlVFKQotCQlyZXR1cm4oTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBKTsKLQotCS8vIDIuIENoZWNrIFBhaXJ3aXNlIEtleQotCWlmIChiUGFpcndpc2UpCi0JewotCQkvLyBhLiBJZiBCU1NJRCBpcyBicm9hZGNhc3QsIHJlbW92ZSBhbGwgcGFpcndpc2Uga2V5cy4KLQkJLy8gYi4gSWYgbm90IGJyb2FkY2FzdCwgcmVtb3ZlIHRoZSBwYWlyd2lzZSBzcGVjaWZpZWQgYnkgQlNTSUQKLQkJZm9yIChpID0gMDsgaSA8IFNIQVJFX0tFWV9OVU07IGkrKykKLQkJewotCQkJaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkJzc0lkLCBwS2V5LT5CU1NJRCkpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVE1QV1BBUmVtb3ZlS2V5UHJvYyhLZXlJZHg9JWQpXG4iLCBpKSk7Ci0JCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uS2V5TGVuID0gMDsKLQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQkJCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCAoVUNIQVIpaSk7Ci0JCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQkvLyAzLiBHcm91cCBLZXkKLQllbHNlCi0JewotCQkvLyBhLiBJZiBCU1NJRCBpcyBicm9hZGNhc3QsIHJlbW92ZSBhbGwgZ3JvdXAga2V5cyBpbmRleGVkCi0JCS8vIGIuIElmIEJTU0lEIG1hdGNoZWQsIGRlbGV0ZSB0aGUgZ3JvdXAga2V5IGluZGV4ZWQuCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFdQQVJlbW92ZUtleVByb2MoS2V5SWR4PSVsZClcbiIsIEtleUlkeCkpOwotCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IDA7Ci0JCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0JCUFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIChVQ0hBUilLZXlJZHgpOwotCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCX0KLQotCXJldHVybiAoU3RhdHVzKTsKLX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUmVtb3ZlIEFsbCBXUEEgS2V5cwotCi0JQXJndW1lbnRzOgotCQlwQWQJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QV1BBUmVtb3ZlQWxsS2V5cygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQotCVVDSEFSCWk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBXUEFSZW1vdmVBbGxLZXlzKEF1dGhNb2RlPSVkLCBXZXBTdGF0dXM9JWQpXG4iLCBwQWQtPlN0YUNmZy5BdXRoTW9kZSwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzKSk7Ci0JUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19DQU5fR09fU0xFRVApOwotCS8vIEZvciBXRVAvQ0tJUCwgdGhlcmUgaXMgbm8gbmVlZCB0byByZW1vdmUgaXQsIHNpbmNlIFdpblhQIHdvbid0IHNldCBpdCBhZ2FpbiBhZnRlcgotCS8vIExpbmsgdXAuIEFuZCBpdCB3aWxsIGJlIHJlcGxhY2VkIGlmIHVzZXIgY2hhbmdlZCBpdC4KLQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0JCXJldHVybjsKLQotCS8vIEZvciBXUEEtTm9uZSwgdGhlcmUgaXMgbm8gbmVlZCB0byByZW1vdmUgaXQsIHNpbmNlIFdpblhQIHdvbid0IHNldCBpdCBhZ2FpbiBhZnRlcgotCS8vIExpbmsgdXAuIEFuZCBpdCB3aWxsIGJlIHJlcGxhY2VkIGlmIHVzZXIgY2hhbmdlZCBpdC4KLQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKLQkJcmV0dXJuOwotCi0JLy8gc2V0IEJTU0lEIHdjaWQgZW50cnkgb2YgdGhlIFBhaXItd2lzZSBLZXkgdGFibGUgYXMgbm8tc2VjdXJpdHkgbW9kZQotCUFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwgQlNTMCwgQlNTSURfV0NJRCk7Ci0KLQkvLyBzZXQgYWxsIHNoYXJlZCBrZXkgbW9kZSBhcyBuby1zZWN1cml0eS4KLQlmb3IgKGkgPSAwOyBpIDwgU0hBUkVfS0VZX05VTTsgaSsrKQotICAgIHsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJyZW1vdmUgJXMga2V5ICMlZFxuIiwgQ2lwaGVyTmFtZVtwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGddLCBpKSk7Ci0JCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVtpXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKLQotCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBpKTsKLQl9Ci0JUlRNUF9TRVRfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsKLQotfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlBcyBTVEEncyBCU1NJRCBpcyBhIFdDIHRvbywgaXQgdXNlcyBzaGFyZWQga2V5IHRhYmxlLgotCQlUaGlzIGZ1bmN0aW9uIHdyaXRlIGNvcnJlY3QgdW5pY2FzdCBUWCBrZXkgdG8gQVNJQyBXQ0lELgotCQlBbmQgd2Ugc3RpbGwgbWFrZSBhIGNvcHkgaW4gb3VyIE1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LgotCQlDYWxsZXIgZ3VhcmFudGVlIFRLSVAvQUVTIGFsd2F5cyBoYXMga2V5aWR4ID0gMC4gKHBhaXJ3aXNlIGtleSkKLQkJQ2FsbGVyIGd1YXJhbnRlZSBXRVAgY2FsbHMgdGhpcyBmdW5jdGlvbiB3aGVuIHNldCBUeGtleSwgIGRlZmF1bHQga2V5IGluZGV4PTB+My4KLQotCUFyZ3VtZW50czoKLQkJcEFkCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCXBLZXkJCQkJCQkJUG9pbnRlciB0byB0aGUgd2hlcmUgdGhlIGtleSBzdG9yZWQKLQotCVJldHVybiBWYWx1ZToKLQkJTkRJU19TVUNDRVNTCQkJCQlBZGQga2V5IHN1Y2Nlc3NmdWxseQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlDaGFuZ2UgTklDIFBIWSBtb2RlLiBSZS1hc3NvY2lhdGlvbiBtYXkgYmUgbmVjZXNzYXJ5LiBwb3NzaWJsZSBzZXR0aW5ncwotCQlpbmNsdWRlIC0gUEhZXzExQiwgUEhZXzExQkdfTUlYRUQsIFBIWV8xMUEsIGFuZCBQSFlfMTFBQkdfTUlYRUQKLQotCUFyZ3VtZW50czoKLQkJcEFkIC0gUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwaHltb2RlICAtCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QU2V0UGh5TW9kZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVTE9ORyBwaHltb2RlKQotewotCUlOVCBpOwotCS8vIHRoZSBzZWxlY3RlZCBwaHltb2RlIG11c3QgYmUgc3VwcG9ydGVkIGJ5IHRoZSBSRiBJQyBlbmNvZGVkIGluIEUyUFJPTQotCi0JLy8gaWYgbm8gY2hhbmdlLCBkbyBub3RoaW5nCi0JLyogYnVnIGZpeAotCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IHBoeW1vZGUpCi0JCXJldHVybjsKLSAgICAqLwotCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSAoVUNIQVIpcGh5bW9kZTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFNldFBoeU1vZGUgOiBQaHlNb2RlPSVkLCBjaGFubmVsPSVkIFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOwotI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKLQlCdWlsZENoYW5uZWxMaXN0RXgocEFkKTsKLSNlbHNlCi0JQnVpbGRDaGFubmVsTGlzdChwQWQpOwotI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KLQotCS8vIHNhbml0eSBjaGVjayB1c2VyIHNldHRpbmcKLQlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQotCXsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkKLQl7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gRmlyc3RDaGFubmVsKHBBZCk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTZXRQaHlNb2RlOiBjaGFubmVsIGlzIG91dCBvZiByYW5nZSwgdXNlIGZpcnN0IGNoYW5uZWw9JWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7Ci0JfQotCi0JTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuU3VwUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOwotCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKLQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7Ci0Jc3dpdGNoIChwaHltb2RlKSB7Ci0JCWNhc2UgUEhZXzExQjoKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF0gID0gMHg4MjsJICAvLyAxIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzFdICA9IDB4ODQ7CSAgLy8gMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsyXSAgPSAweDhCOwkgIC8vIDUuNSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVszXSAgPSAweDk2OwkgIC8vIDExIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuICA9IDQ7Ci0JCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuICA9IDA7Ci0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzBdICA9IDI7CSAgIC8vIDEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0gID0gNDsJICAgLy8gMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSAgPSAxMTsgICAgLy8gNS41IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdICA9IDIyOyAgICAvLyAxMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOyAvLyBUaGlzIE1PREUgaXMgb25seSBGWUkuIG5vdCB1c2UKLQkJCWJyZWFrOwotCi0JCWNhc2UgUEhZXzExRzoKLQkJY2FzZSBQSFlfMTFCR19NSVhFRDoKLQkJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWNhc2UgUEhZXzExTl8yXzRHOgotCQljYXNlIFBIWV8xMUFCR05fTUlYRUQ6Ci0JCWNhc2UgUEhZXzExQkdOX01JWEVEOgotCQljYXNlIFBIWV8xMUdOX01JWEVEOgotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVswXSAgPSAweDgyOwkgIC8vIDEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMV0gID0gMHg4NDsJICAvLyAyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzJdICA9IDB4OEI7CSAgLy8gNS41IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzNdICA9IDB4OTY7CSAgLy8gMTEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNF0gID0gMHgxMjsJICAvLyA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzVdICA9IDB4MjQ7CSAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNl0gID0gMHg0ODsJICAvLyAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs3XSAgPSAweDZjOwkgIC8vIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuICA9IDg7Ci0JCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzBdICA9IDB4MEM7CSAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZVsxXSAgPSAweDE4OwkgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzJdICA9IDB4MzA7CSAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbM10gID0gMHg2MDsJICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiAgPSA0OwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSAgPSAyOwkgICAvLyAxIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdICA9IDQ7CSAgIC8vIDIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0gID0gMTE7ICAgIC8vIDUuNSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVszXSAgPSAyMjsgICAgLy8gMTEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNF0gID0gMTI7ICAgIC8vIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNV0gID0gMTg7ICAgIC8vIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0gID0gMjQ7ICAgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICA9IDM2OyAgICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs4XSAgPSA0ODsgICAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbOV0gID0gNzI7ICAgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzEwXSA9IDk2OyAgICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxMV0gPSAxMDg7ICAgLy8gNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCWJyZWFrOwotCi0JCWNhc2UgUEhZXzExQToKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJY2FzZSBQSFlfMTFBTl9NSVhFRDoKLQkJY2FzZSBQSFlfMTFBR05fTUlYRUQ6Ci0JCWNhc2UgUEhZXzExTl81RzoKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF0gID0gMHg4QzsJICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzFdICA9IDB4MTI7CSAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsyXSAgPSAweDk4OwkgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzNdICA9IDB4MjQ7CSAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNF0gID0gMHhiMDsJICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs1XSAgPSAweDQ4OwkgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzZdICA9IDB4NjA7CSAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbN10gID0gMHg2YzsJICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiAgPSA4OwotCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiAgPSAwOwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSAgPSAxMjsgICAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxXSAgPSAxODsgICAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSAgPSAyNDsgICAgLy8gMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10gID0gMzY7ICAgIC8vIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzRdICA9IDQ4OyAgICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs1XSAgPSA3MjsgICAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0gID0gOTY7ICAgIC8vIDQ4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICA9IDEwODsgICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsgLy8gVGhpcyBNT0RFIGlzIG9ubHkgRllJLiBub3QgdXNlCi0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JfQotCi0KLQlwQWQtPkNvbW1vbkNmZy5CYW5kU3RhdGUgPSBVTktOT1dOX0JBTkQ7Ci19Ci0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlDYWxsZXIgZW5zdXJlcyB3ZSBoYXMgODAyLjExbiBzdXBwb3J0LgotCQlDYWxscyBhdCBzZXR0aW5nIEhUIGZyb20gQVAvU1RBU2V0aW5mb3JtYXRpb24KLQotCUFyZ3VtZW50czoKLQkJcEFkIC0gUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwaHltb2RlICAtCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBTZXRIVCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglPSURfU0VUX0hUX1BIWU1PREUgKnBIVFBoeU1vZGUpCi17Ci0JLy9VTE9ORwkqcG1jczsKLQlVSU5UMzIJVmFsdWUgPSAwOwotCVVDSEFSCUJCUFZhbHVlID0gMDsKLQlVQ0hBUglCQlAzVmFsdWUgPSAwOwotCVVDSEFSCVJ4U3RyZWFtID0gcEFkLT5Db21tb25DZmcuUnhTdHJlYW07Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SFQgOiBIVF9tb2RlKCVkKSwgRXh0T2Zmc2V0KCVkKSwgTUNTKCVkKSwgQlcoJWQpLCBTVEJDKCVkKSwgU0hPUlRHSSglZClcbiIsCi0JCQkJCQkJCQkJcEhUUGh5TW9kZS0+SHRNb2RlLCBwSFRQaHlNb2RlLT5FeHRPZmZzZXQsCi0JCQkJCQkJCQkJcEhUUGh5TW9kZS0+TUNTLCBwSFRQaHlNb2RlLT5CVywKLQkJCQkJCQkJCQlwSFRQaHlNb2RlLT5TVEJDLCBwSFRQaHlNb2RlLT5TSE9SVEdJKSk7Ci0KLQkvLyBEb24ndCB6ZXJvIHN1cHBvcnRlZEh5UGh5IHN0cnVjdHVyZS4KLQlSVE1QWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LCBzaXplb2YocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5KSk7Ci0JUlRNUFplcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbykpOwotCVJUTVBaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5OZXdFeHRDaGFuT2Zmc2V0LCBzaXplb2YocEFkLT5Db21tb25DZmcuTmV3RXh0Q2hhbk9mZnNldCkpOwotCVJUTVBaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHksIHNpemVvZihwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkpKTsKLQotCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnKQotCXsKLQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gMTsKLQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0ID0gMTsKLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gMDsKLQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0ID0gMDsKLQl9Ci0KLQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvciA9IDM7Ci0JcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1heFJBbXBkdUZhY3RvciA9IDM7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SFQgOiBSeEJBV2luTGltaXQgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCkpOwotCi0JLy8gTWltbyBwb3dlciBzYXZlLCBBLU1TRFUgc2l6ZSwKLQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZTsKLQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdVNpemU7Ci0JcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcyA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGU7Ci0JcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eTsKLQotCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOwotCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGU7Ci0JcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SFQgOiBBTXNkdVNpemUgPSAlZCwgTWltb1BzID0gJWQsIE1wZHVEZW5zaXR5ID0gJWQsIE1heFJBbXBkdUZhY3RvciA9ICVkXG4iLAotCQkJCQkJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUsCi0JCQkJCQkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcywKLQkJCQkJCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHksCi0JCQkJCQkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1heFJBbXBkdUZhY3RvcikpOwotCi0JaWYocEhUUGh5TW9kZS0+SHRNb2RlID09IEhUTU9ERV9HRikKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uR0YgPSAxOwotCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YgPSAxOwotCX0KLQllbHNlCi0JCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRiA9IDA7Ci0KLQkvLyBEZWNpZGUgUnggTUNTU2V0Ci0Jc3dpdGNoIChSeFN0cmVhbSkKLQl7Ci0JCWNhc2UgMToKLQkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAgMHhmZjsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAgMHgwMDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgMjoKLQkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAgMHhmZjsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAgMHhmZjsKLQkJCWJyZWFrOwotCi0JCWNhc2UgMzogLy8gMyozCi0JCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gIDB4ZmY7Ci0JCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gIDB4ZmY7Ci0JCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzJdID0gIDB4ZmY7Ci0JCQlicmVhazsKLQl9Ci0KLQlpZiAocEFkLT5Db21tb25DZmcuYkZvcnR5X01oel9JbnRvbGVyYW50ICYmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KSAmJiAocEhUUGh5TW9kZS0+QlcgPT0gQldfNDApICkKLQl7Ci0JCXBIVFBoeU1vZGUtPkJXID0gQldfMjA7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uRm9ydHlfTWh6X0ludG9sZXJhbnQgPSAxOwotCX0KLQotCWlmKHBIVFBoeU1vZGUtPkJXID09IEJXXzQwKQotCXsKLQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFs0XSA9IDB4MTsgLy8gTUNTIDMyCi0JCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID0gMTsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpCi0JCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNDS21vZGVpbjQwID0gMTsKLQotCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID0gMTsKLQkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoID0gMTsKLQkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID0gKHBIVFBoeU1vZGUtPkV4dE9mZnNldCA9PSBFWFRDSEFfQkVMT1cpPyAoRVhUQ0hBX0JFTE9XKTogRVhUQ0hBX0FCT1ZFOwotCQkvLyBTZXQgUmVnc2l0ZXIgZm9yIGV4dGVuc2lvbiBjaGFubmVsIHBvc2l0aW9uLgotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOwotCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlAzVmFsdWUpOwotCQlpZiAoKHBIVFBoeU1vZGUtPkV4dE9mZnNldCA9PSBFWFRDSEFfQkVMT1cpKQotCQl7Ci0JCQlWYWx1ZSB8PSAweDE7Ci0JCQlCQlAzVmFsdWUgfD0gKDB4MjApOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIFZhbHVlKTsKLQkJfQotCQllbHNlIGlmICgocEhUUGh5TW9kZS0+RXh0T2Zmc2V0ID09IEVYVENIQV9BQk9WRSkpCi0JCXsKLQkJCVZhbHVlICY9IDB4ZmU7Ci0JCQlCQlAzVmFsdWUgJj0gKH4weDIwKTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7Ci0JCX0KLQotCQkvLyBUdXJuIG9uIEJCUCA0ME1IeiBtb2RlIG5vdyBvbmx5IGFzIEFQIC4KLQkJLy8gU3RhIGNhbiB0dXJuIG9uIEJCUCA0ME1IeiBhZnRlciBjb25uZWN0aW9uIHdpdGggNDBNSHogQVAuIFN0YSBvbmx5IGJyb2FkY2FzdCA0ME1IeiBjYXBhYmlsaXR5IGJlZm9yZSBjb25uZWN0aW9uLgotCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkgfHwgSU5GUkFfT04ocEFkKSB8fCBBREhPQ19PTihwQWQpCi0JCQkpCi0JCXsKLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKLQkJCUJCUFZhbHVlICY9ICh+MHgxOCk7Ci0JCQlCQlBWYWx1ZSB8PSAweDEwOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOwotCi0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlAzVmFsdWUpOwotCQkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPSAwOwotCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID0gMDsKLQkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoID0gMDsKLQkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID0gRVhUQ0hBX05PTkU7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKLQkJLy8gVHVybiBvbiBCQlAgMjBNSHogbW9kZSBieSByZXF1ZXN0IGhlcmUuCi0JCXsKLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKLQkJCUJCUFZhbHVlICY9ICh+MHgxOCk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7Ci0JCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKLQkJfQotCX0KLQotCWlmKHBIVFBoeU1vZGUtPlNUQkMgPT0gU1RCQ19VU0UpCi0JewotCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlR4U1RCQyA9IDE7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMgPSAxOwotCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQyA9IDE7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5SeFNUQkMgPSAxOwotCX0KLQllbHNlCi0JewotCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDID0gMDsKLQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlJ4U1RCQyA9IDA7Ci0JfQotCi0JaWYocEhUUGh5TW9kZS0+U0hPUlRHSSA9PSBHSV80MDApCi0JewotCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCA9IDE7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gMTsKLQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCA9IDE7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDAgPSAxOwotCX0KLQllbHNlCi0JewotCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCA9IDA7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gMDsKLQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCA9IDA7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDAgPSAwOwotCX0KLQotCS8vIFdlIHN1cHBvcnQgbGluayBhZGFwdGF0aW9uIGZvciB1bnNvbGljaXQgTUNTIGZlZWRiYWNrLCBzZXQgdG8gMi4KLQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLk1DU0ZlZWRiYWNrID0gTUNTRkJLX05PTkU7IC8vTUNTRkJLX1VOU09MSUNJVDsKLQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQ29udHJvbENoYW4gPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwotCS8vIDEsIHRoZSBleHRlbnNpb24gY2hhbm5lbCBhYm92ZSB0aGUgY29udHJvbCBjaGFubmVsLgotCi0JLy8gRURDQSBwYXJhbWV0ZXJzIHVzZWQgZm9yIEFQJ3Mgb3duIHRyYW5zbWlzc2lvbgotCWlmIChwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJWYWxpZCA9PSBGQUxTRSkKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYlZhbGlkID0gVFJVRTsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblswXSA9IDM7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMV0gPSA3OwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzJdID0gMTsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblszXSA9IDE7Ci0KLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblswXSA9IDQ7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bMV0gPSA0OwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzJdID0gMzsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblszXSA9IDI7Ci0KLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFswXSA9IDY7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbMV0gPSAxMDsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFsyXSA9IDQ7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbM10gPSAzOwotCi0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFswXSAgPSAwOwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMV0gID0gMDsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzJdICA9IDk0OwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbM10gID0gNDc7Ci0JfQotCUFzaWNTZXRFZGNhUGFybShwQWQsICZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtKTsKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQlSVE1QU2V0SW5kaXZpZHVhbEhUKHBBZCwgMCk7Ci0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUNhbGxlciBlbnN1cmVzIHdlIGhhcyA4MDIuMTFuIHN1cHBvcnQuCi0JCUNhbGxzIGF0IHNldHRpbmcgSFQgZnJvbSBBUC9TVEFTZXRpbmZvcm1hdGlvbgotCi0JQXJndW1lbnRzOgotCQlwQWQgLSBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCXBoeW1vZGUgIC0KLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUFNldEluZGl2aWR1YWxIVCgKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JVUNIQVIJCQkJYXBpZHgpCi17Ci0JUFJUX0hUX1BIWV9JTkZPCQlwRGVzaXJlZF9odF9waHkgPSBOVUxMOwotCVVDSEFSCVR4U3RyZWFtID0gcEFkLT5Db21tb25DZmcuVHhTdHJlYW07Ci0JVUNIQVIJRGVzaXJlZE1jcwk9IE1DU19BVVRPOwotCi0JZG8KLQl7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJcERlc2lyZWRfaHRfcGh5ID0gJnBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm87Ci0JCQlEZXNpcmVkTWNzID0gcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1M7Ci0JCQkvL3BBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gKERlc2lyZWRNY3MgPT0gTUNTX0FVVE8pID8gVFJVRSA6IEZBTFNFOwotCQkJCWJyZWFrOwotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JfSB3aGlsZSAoRkFMU0UpOwotCi0JaWYgKHBEZXNpcmVkX2h0X3BoeSA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRNUFNldEluZGl2aWR1YWxIVDogaW52YWxpZCBhcGlkeCglZClcbiIsIGFwaWR4KSk7Ci0JCXJldHVybjsKLQl9Ci0JUlRNUFplcm9NZW1vcnkocERlc2lyZWRfaHRfcGh5LCBzaXplb2YoUlRfSFRfUEhZX0lORk8pKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTZXRJbmRpdmlkdWFsSFQgOiBEZXNpcmVkIE1DUyA9ICVkXG4iLCBEZXNpcmVkTWNzKSk7Ci0JLy8gQ2hlY2sgdGhlIHZhbGlkaXR5IG9mIE1DUwotCWlmICgoVHhTdHJlYW0gPT0gMSkgJiYgKChEZXNpcmVkTWNzID49IE1DU184KSAmJiAoRGVzaXJlZE1jcyA8PSBNQ1NfMTUpKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUlRNUFNldEluZGl2aWR1YWxIVDogTUNTKCVkKSBpcyBpbnZhbGlkIGluIDFTLCByZXNldCBpdCBhcyBNQ1NfN1xuIiwgRGVzaXJlZE1jcykpOwotCQlEZXNpcmVkTWNzID0gTUNTXzc7Ci0JfQotCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID09IEJXXzIwKSAmJiAoRGVzaXJlZE1jcyA9PSBNQ1NfMzIpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJSVE1QU2V0SW5kaXZpZHVhbEhUOiBNQ1NfMzIgaXMgb25seSBzdXBwb3J0ZWQgaW4gNDAtTUh6LCByZXNldCBpdCBhcyBNQ1NfMFxuIikpOwotCQlEZXNpcmVkTWNzID0gTUNTXzA7Ci0JfQotCi0JcERlc2lyZWRfaHRfcGh5LT5iSHRFbmFibGUgPSBUUlVFOwotCi0JLy8gRGVjaWRlIGRlc2lyZWQgVHggTUNTCi0Jc3dpdGNoIChUeFN0cmVhbSkKLQl7Ci0JCWNhc2UgMToKLQkJCWlmIChEZXNpcmVkTWNzID09IE1DU19BVVRPKQotCQkJewotCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzBdPSAweGZmOwotCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzFdPSAweDAwOwotCQkJfQotCQkJZWxzZSBpZiAoRGVzaXJlZE1jcyA8PSBNQ1NfNykKLQkJCXsKLQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXT0gMTw8RGVzaXJlZE1jczsKLQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXT0gMHgwMDsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgMjoKLQkJCWlmIChEZXNpcmVkTWNzID09IE1DU19BVVRPKQotCQkJewotCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzBdPSAweGZmOwotCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzFdPSAweGZmOwotCQkJfQotCQkJZWxzZSBpZiAoRGVzaXJlZE1jcyA8PSBNQ1NfMTUpCi0JCQl7Ci0JCQkJVUxPTkcgbW9kZTsKLQotCQkJCW1vZGUgPSBEZXNpcmVkTWNzIC8gODsKLQkJCQlpZiAobW9kZSA8IDIpCi0JCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0W21vZGVdID0gKDEgPDwgKERlc2lyZWRNY3MgLSBtb2RlICogOCkpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSAzOiAvLyAzKjMKLQkJCWlmIChEZXNpcmVkTWNzID09IE1DU19BVVRPKQotCQkJewotCQkJCS8qIE1DUzAgfiBNQ1MyMywgMyBieXRlcyAqLwotCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzBdPSAweGZmOwotCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzFdPSAweGZmOwotCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzJdPSAweGZmOwotCQkJfQotCQkJZWxzZSBpZiAoRGVzaXJlZE1jcyA8PSBNQ1NfMjMpCi0JCQl7Ci0JCQkJVUxPTkcgbW9kZTsKLQotCQkJCW1vZGUgPSBEZXNpcmVkTWNzIC8gODsKLQkJCQlpZiAobW9kZSA8IDMpCi0JCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0W21vZGVdID0gKDEgPDwgKERlc2lyZWRNY3MgLSBtb2RlICogOCkpOwotCQkJfQotCQkJYnJlYWs7Ci0JfQotCi0JaWYocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCA9PSBCV180MCkKLQl7Ci0JCWlmIChEZXNpcmVkTWNzID09IE1DU19BVVRPIHx8IERlc2lyZWRNY3MgPT0gTUNTXzMyKQotCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbNF0gPSAweDE7Ci0JfQotCi0JLy8gdXBkYXRlIEhUIFJhdGUgc2V0dGluZwotICAgIGlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQotICAgICAgICBNbG1lVXBkYXRlSHRUeFJhdGVzKHBBZCwgQlNTMCk7Ci0gICAgZWxzZQotCSAgICBNbG1lVXBkYXRlSHRUeFJhdGVzKHBBZCwgYXBpZHgpOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJVXBkYXRlIEhUIElFIGZyb20gb3VyIGNhcGFiaWxpdHkuCi0KLQlBcmd1bWVudHM6Ci0JCVNlbmQgYWxsIEhUIElFIGluIGJlYWNvbi9wcm9iZSByc3AvYXNzb2MgcnNwL2FjdGlvbiBmcmFtZS4KLQotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QVXBkYXRlSFRJRSgKLQlJTglSVF9IVF9DQVBBQklMSVRZCSpwUnRIdCwKLQlJTgkJVUNIQVIJCQkJKnBNY3NTZXQsCi0JT1VUCQlIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAotCU9VVAkJQUREX0hUX0lORk9fSUUJCSpwQWRkSHRJbmZvKQotewotCVJUTVBaZXJvTWVtb3J5KHBIdENhcGFiaWxpdHksIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7Ci0JUlRNUFplcm9NZW1vcnkocEFkZEh0SW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7Ci0KLQkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9IHBSdEh0LT5DaGFubmVsV2lkdGg7Ci0JCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5NaW1vUHMgPSBwUnRIdC0+TWltb1BzOwotCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uR0YgPSBwUnRIdC0+R0Y7Ci0JCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yMjAgPSBwUnRIdC0+U2hvcnRHSWZvcjIwOwotCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gcFJ0SHQtPlNob3J0R0lmb3I0MDsKLQkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlR4U1RCQyA9IHBSdEh0LT5UeFNUQkM7Ci0JCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5SeFNUQkMgPSBwUnRIdC0+UnhTVEJDOwotCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQU1zZHVTaXplID0gcFJ0SHQtPkFtc2R1U2l6ZTsKLQkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvciA9IHBSdEh0LT5NYXhSQW1wZHVGYWN0b3I7Ci0JCXBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IHBSdEh0LT5NcGR1RGVuc2l0eTsKLQotCQlwQWRkSHRJbmZvLT5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9IHBSdEh0LT5FeHRDaGFuT2Zmc2V0IDsKLQkJcEFkZEh0SW5mby0+QWRkSHRJbmZvLlJlY29tV2lkdGggPSBwUnRIdC0+UmVjb21XaWR0aDsKLQkJcEFkZEh0SW5mby0+QWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUgPSBwUnRIdC0+T3BlcmFpb25Nb2RlOwotCQlwQWRkSHRJbmZvLT5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9IHBSdEh0LT5Ob25HZlByZXNlbnQ7Ci0JCVJUTVBNb3ZlTWVtb3J5KHBBZGRIdEluZm8tPk1DU1NldCwgLypwUnRIdC0+TUNTU2V0Ki9wTWNzU2V0LCA0KTsgLy8gcnQyODYwIG9ubHkgc3VwcG9ydCBNQ1MgbWF4PTMyLCBubyBuZWVkIHRvIGNvcHkgYWxsIDE2IHVjaGFyLgotCi0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFVwZGF0ZUhUSUUgPD09IFxuIikpOwotfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlBZGQgQ2xpZW50IHNlY3VyaXR5IGluZm9ybWF0aW9uIGludG8gQVNJQyBXQ0lEIHRhYmxlIGFuZCBJVkVJViB0YWJsZS4KLSAgICBSZXR1cm46Ci0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJQnNzSWR4LAotCUlOCVVDSEFSCQkJS2V5SWR4LAotCUlOCVVDSEFSCQkJQ2lwaGVyQWxnLAotCUlOCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5KQotewotCVVJTlQzMgkJV0NJREF0dHJpID0gMDsKLQlVU0hPUlQJCW9mZnNldDsKLQlVQ0hBUgkJSVZFSVYgPSAwOwotCVVTSE9SVAkJV2NpZCA9IDA7Ci0KLQl7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCWlmIChCc3NJZHggPiBCU1MwKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnk6IFRoZSBCU1MtaW5kZXgoJWQpIGlzIG91dCBvZiByYW5nZSBmb3IgSW5mcmEgbGluay4gXG4iLCBCc3NJZHgpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIDEuCUluIEFESE9DIG1vZGUsIHRoZSBBSUQgaXMgd2NpZCBudW1iZXIuIEFuZCBOTyBtZXNoIGxpbmsgZXhpc3RzLgotCQkJLy8gMi4JSW4gSW5mcmEgbW9kZSwgdGhlIEFJRDoxIE1VU1QgYmUgd2NpZCBvZiBpbmZyYSBTVEEuCi0JCQkvLwkJCQkJICAgdGhlIEFJRDoyfiBhc3NpZ24gdG8gbWVzaCBsaW5rIGVudHJ5LgotCQkJaWYgKHBFbnRyeSkKLQkJCQlXY2lkID0gcEVudHJ5LT5BaWQ7Ci0JCQllbHNlCi0JCQkJV2NpZCA9IE1DQVNUX1dDSUQ7Ci0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQl9Ci0KLQkvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUKLQlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChXY2lkICogSFdfV0NJRF9BVFRSSV9TSVpFKTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlpZiAocEVudHJ5ICYmIHBFbnRyeS0+VmFsaWRBc01lc2gpCi0JCQlXQ0lEQXR0cmkgPSAoQ2lwaGVyQWxnPDwxKSB8IFBBSVJXSVNFS0VZVEFCTEU7Ci0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCWVsc2UgaWYgKChwRW50cnkpICYmIChwRW50cnktPlZhbGlkQXNEbHMpICYmCi0JCQkJCSgoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQKSB8fAotCQkJCQkoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQX05PX01JQykgfHwKLQkJCQkJKENpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSB8fAotCQkJCQkoQ2lwaGVyQWxnID09IENJUEhFUl9OT05FKSkpCi0JCQlXQ0lEQXR0cmkgPSAoQ2lwaGVyQWxnPDwxKSB8IFBBSVJXSVNFS0VZVEFCTEU7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0JCWVsc2UKLQkJV0NJREF0dHJpID0gKENpcGhlckFsZzw8MSkgfCBTSEFSRURLRVlUQUJMRTsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIFdDSURBdHRyaSk7Ci0KLQotCS8vIFVwZGF0ZSBJVi9FSVYgdGFibGUKLQlvZmZzZXQgPSBNQUNfSVZFSVZfVEFCTEVfQkFTRSArIChXY2lkICogSFdfSVZFSVZfRU5UUllfU0laRSk7Ci0KLQkvLyBXUEEgbW9kZQotCWlmICgoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQKSB8fCAoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQX05PX01JQykgfHwgKENpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSkKLQl7Ci0JCS8vIEVpdiBiaXQgb24uIGtleWlkIGFsd2F5cyBpcyAwIGZvciBwYWlyd2lzZSBrZXkKLQkJSVZFSVYgPSAoS2V5SWR4IDw8NikgfCAweDIwOwotCX0KLQllbHNlCi0JewotCQkvLyBXRVAgS2V5SWR4IGlzIGRlZmF1bHQgdHgga2V5LgotCQlJVkVJViA9IChLZXlJZHggPDwgNik7Ci0JfQotCi0JLy8gRm9yIGtleSBpbmRleCBhbmQgZXh0IElWIGJpdCwgc28gb25seSBuZWVkIHRvIHVwZGF0ZSB0aGUgcG9zaXRpb24ob2Zmc2V0KzMpLgotI2lmZGVmIFJUTVBfTUFDX1BDSQotCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0KzMsIElWRUlWKTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeTogV0NJRCAjJWQsIEtleUluZGV4ICMlZCwgQWxnPSVzXG4iLFdjaWQsIEtleUlkeCwgQ2lwaGVyTmFtZVtDaXBoZXJBbGddKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIJV0NJREF0dHJpID0gMHgleCBcbiIsICBXQ0lEQXR0cmkpKTsKLQotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFBhcnNlIGVuY3J5cHRpb24gdHlwZQotQXJndW1lbnRzOgotICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0gICAgd3JxICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50Ci0KLSAgICBSZXR1cm4gVmFsdWU6Ci0gICAgICAgIE5vbmUKLQotICAgIE5vdGU6Ci0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1QU1RSSU5HIEdldEVuY3J5cHRUeXBlKENIQVIgZW5jKQotewotICAgIGlmKGVuYyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0gICAgICAgIHJldHVybiAiTk9ORSI7Ci0gICAgaWYoZW5jID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKQotCXJldHVybiAiV0VQIjsKLSAgICBpZihlbmMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLQlyZXR1cm4gIlRLSVAiOwotICAgIGlmKGVuYyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCXJldHVybiAiQUVTIjsKLQlpZihlbmMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZCkKLQlyZXR1cm4gIlRLSVBBRVMiOwotICAgIGVsc2UKLQlyZXR1cm4gIlVOS05PVyI7Ci19Ci0KLVBTVFJJTkcgR2V0QXV0aE1vZGUoQ0hBUiBhdXRoKQotewotICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKLQlyZXR1cm4gIk9QRU4iOwotICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQotCXJldHVybiAiU0hBUkVEIjsKLQlpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gpCi0JcmV0dXJuICJBVVRPV0VQIjsKLSAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLQlyZXR1cm4gIldQQSI7Ci0gICAgaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spCi0JcmV0dXJuICJXUEFQU0siOwotICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKLQlyZXR1cm4gIldQQU5PTkUiOwotICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKLQlyZXR1cm4gIldQQTIiOwotICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKLQlyZXR1cm4gIldQQTJQU0siOwotCWlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVdQQTIpCi0JcmV0dXJuICJXUEExV1BBMiI7Ci0JaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSykKLQlyZXR1cm4gIldQQTFQU0tXUEEyUFNLIjsKLQotCXJldHVybiAiVU5LTk9XIjsKLX0KLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIEdldCBzaXRlIHN1cnZleSByZXN1bHRzCi0JQXJndW1lbnRzOgotCSAgICBwQWRhcHRlciAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCSAgICB3cnEgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW9jdGwgYXJndW1lbnQKLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgTm9uZQotCi0gICAgTm90ZToKLSAgICAgICAgVXNhZ2U6Ci0JCQkxLikgVUkgbmVlZHMgdG8gd2FpdCA0IHNlY29uZHMgYWZ0ZXIgaXNzdWUgYSBzaXRlIHN1cnZleSBjb21tYW5kCi0JCQkyLikgaXdwcml2IHJhMCBnZXRfc2l0ZV9zdXJ2ZXkKLQkJCTMuKSBVSSBuZWVkcyB0byBwcmVwYXJlIGF0IGxlYXN0IDQwOTZieXRlcyB0byBnZXQgdGhlIHJlc3VsdHMKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLSNkZWZpbmUJTElORV9MRU4JKDQrMzMrMjArMjMrOSs3KzMpCS8vIENoYW5uZWwrU1NJRCtCc3NpZCtTZWN1cml0eStTaWduYWwrV2lyZXNzTW9kZStOZXR3b3JrVHlwZQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotVk9JRAlSVE1QQ29tbVNpdGVTdXJ2ZXlEYXRhKAotCUlOICBQU1RSSU5HCQltc2csCi0JSU4gIFBCU1NfRU5UUlkJcEJzcykKLXsKLQlJTlQgICAgICAgICBSc3NpID0gMDsKLQlVSU5UICAgICAgICBSc3NpX1F1YWxpdHkgPSAwOwotCU5ESVNfODAyXzExX05FVFdPUktfVFlQRSAgICB3aXJlbGVzc19tb2RlOwotCUNIQVIJCVNzaWRbTUFYX0xFTl9PRl9TU0lEICsxXTsKLQlTVFJJTkcJCVNlY3VyaXR5U3RyWzMyXSA9IHswfTsKLQlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlhcF9jaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOwotCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUJYXBfYXV0aF9tb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKLQotCW1lbXNldChTc2lkLCAwICwoTUFYX0xFTl9PRl9TU0lEICsxKSk7Ci0KLQkJLy9DaGFubmVsCi0JCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTRkIiwgcEJzcy0+Q2hhbm5lbCk7Ci0JCS8vU1NJRAotCQltZW1jcHkoU3NpZCwgcEJzcy0+U3NpZCwgcEJzcy0+U3NpZExlbik7Ci0JCVNzaWRbcEJzcy0+U3NpZExlbl0gPSAnXDAnOwotCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0zM3MiLCBTc2lkKTsKLQkJLy9CU1NJRAotCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggICAiLAotCQkJcEJzcy0+QnNzaWRbMF0sCi0JCQlwQnNzLT5Cc3NpZFsxXSwKLQkJCXBCc3MtPkJzc2lkWzJdLAotCQkJcEJzcy0+QnNzaWRbM10sCi0JCQlwQnNzLT5Cc3NpZFs0XSwKLQkJCXBCc3MtPkJzc2lkWzVdKTsKLQotCS8vU2VjdXJpdHkKLQlpZiAoKE5kaXM4MDJfMTFBdXRoTW9kZVdQQSA8PSBwQnNzLT5BdXRoTW9kZSkgJiYKLQkJKHBCc3MtPkF1dGhNb2RlIDw9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLKSkKLQl7Ci0JCWlmIChwQnNzLT5BdXRoTW9kZUF1eCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotCQl7Ci0JCQlhcF9hdXRoX21vZGUgPSBwQnNzLT5BdXRoTW9kZTsKLQkJCWlmIChwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0JCQkJYXBfY2lwaGVyID0gcEJzcy0+V1BBLlBhaXJDaXBoZXI7Ci0JCQllbHNlCi0JCQkJYXBfY2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDsKLQkJfQotCQllbHNlIGlmIChwQnNzLT5BdXRoTW9kZUF1eCA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQotCQl7Ci0JCQlhcF9hdXRoX21vZGUgPSBwQnNzLT5BdXRoTW9kZTsKLQkJCWlmICgoYXBfYXV0aF9tb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKLQkJCQkoYXBfYXV0aF9tb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCi0JCQl7Ci0JCQkJaWYgKHBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKLQkJCQkJYXBfY2lwaGVyID0gcEJzcy0+V1BBLlBhaXJDaXBoZXI7Ci0JCQkJZWxzZQotCQkJCQlhcF9jaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkOwotCQkJfQotCQkJZWxzZSBpZiAoKGFwX2F1dGhfbW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAotCQkJCQkgKGFwX2F1dGhfbW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKLQkJCXsKLQkJCQlpZiAocEJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4ID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKLQkJCQkJYXBfY2lwaGVyID0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyOwotCQkJCWVsc2UKLQkJCQkJYXBfY2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDsKLQkJCX0KLQkJfQotCQllbHNlIGlmICgocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAotCQkJCSAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCi0JCXsKLQkJCWlmICgocEJzcy0+QXV0aE1vZGVBdXggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAotCQkJCShwQnNzLT5BdXRoTW9kZUF1eCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKLQkJCQlhcF9hdXRoX21vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSzsKLQkJCWVsc2UKLQkJCQlhcF9hdXRoX21vZGUgPSBwQnNzLT5BdXRoTW9kZTsKLQotCQkJaWYgKHBCc3MtPldQQS5QYWlyQ2lwaGVyICE9IHBCc3MtPldQQTIuUGFpckNpcGhlcikKLQkJCQlhcF9jaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkOwotCQkJZWxzZSBpZiAoKHBCc3MtPldQQS5QYWlyQ2lwaGVyID09IHBCc3MtPldQQTIuUGFpckNpcGhlcikgJiYKLQkJCQkJIChwQnNzLT5XUEEuUGFpckNpcGhlckF1eCAhPSBwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXgpKQotCQkJCWFwX2NpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ7Ci0JCQllbHNlIGlmICgocEJzcy0+V1BBLlBhaXJDaXBoZXIgPT0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyKSAmJgotCQkJCQkgKHBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID09IHBCc3MtPldQQTIuUGFpckNpcGhlckF1eCkgJiYKLQkJCQkJIChwQnNzLT5XUEEuUGFpckNpcGhlckF1eCAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpKQotCQkJCWFwX2NpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ7Ci0JCQllbHNlIGlmICgocEJzcy0+V1BBLlBhaXJDaXBoZXIgPT0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyKSAmJgotCQkJCQkgKHBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID09IHBCc3MtPldQQTIuUGFpckNpcGhlckF1eCkgJiYKLQkJCQkJIChwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpKQotCQkJCWFwX2NpcGhlciA9IHBCc3MtPldQQS5QYWlyQ2lwaGVyOwotCQl9Ci0JCWVsc2UgaWYgKChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8Ci0JCQkJIChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSkKLQkJewotCQkJaWYgKChwQnNzLT5BdXRoTW9kZUF1eCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8Ci0JCQkJKHBCc3MtPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpKQotCQkJCWFwX2F1dGhfbW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyOwotCQkJZWxzZQotCQkJCWFwX2F1dGhfbW9kZSA9IHBCc3MtPkF1dGhNb2RlOwotCi0JCQlpZiAocEJzcy0+V1BBLlBhaXJDaXBoZXIgIT0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyKQotCQkJCWFwX2NpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ7Ci0JCQllbHNlIGlmICgocEJzcy0+V1BBLlBhaXJDaXBoZXIgPT0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyKSAmJgotCQkJCQkgKHBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ICE9IHBCc3MtPldQQTIuUGFpckNpcGhlckF1eCkpCi0JCQkJYXBfY2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDsKLQkJCWVsc2UgaWYgKChwQnNzLT5XUEEuUGFpckNpcGhlciA9PSBwQnNzLT5XUEEyLlBhaXJDaXBoZXIpICYmCi0JCQkJCSAocEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPT0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4KSAmJgotCQkJCQkgKHBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkpCi0JCQkJYXBfY2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDsKLQkJCWVsc2UgaWYgKChwQnNzLT5XUEEuUGFpckNpcGhlciA9PSBwQnNzLT5XUEEyLlBhaXJDaXBoZXIpICYmCi0JCQkJCSAocEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPT0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4KSAmJgotCQkJCQkgKHBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkpCi0JCQkJYXBfY2lwaGVyID0gcEJzcy0+V1BBLlBhaXJDaXBoZXI7Ci0JCX0KLQotCQlzcHJpbnRmKFNlY3VyaXR5U3RyLCAiJXMvJXMiLCBHZXRBdXRoTW9kZSgoQ0hBUilhcF9hdXRoX21vZGUpLCBHZXRFbmNyeXB0VHlwZSgoQ0hBUilhcF9jaXBoZXIpKTsKLQl9Ci0JZWxzZQotCXsKLQkJYXBfYXV0aF9tb2RlID0gcEJzcy0+QXV0aE1vZGU7Ci0JCWFwX2NpcGhlciA9IHBCc3MtPldlcFN0YXR1czsKLQkJaWYgKGFwX2NpcGhlciA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0JCQlzcHJpbnRmKFNlY3VyaXR5U3RyLCAiTk9ORSIpOwotCQllbHNlIGlmIChhcF9jaXBoZXIgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpCi0JCQlzcHJpbnRmKFNlY3VyaXR5U3RyLCAiV0VQIik7Ci0JCWVsc2UKLQkJCXNwcmludGYoU2VjdXJpdHlTdHIsICIlcy8lcyIsIEdldEF1dGhNb2RlKChDSEFSKWFwX2F1dGhfbW9kZSksIEdldEVuY3J5cHRUeXBlKChDSEFSKWFwX2NpcGhlcikpOwotCX0KLQotCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiJS0yM3MiLCBTZWN1cml0eVN0cik7Ci0KLQkJLy8gUnNzaQotCQlSc3NpID0gKElOVClwQnNzLT5Sc3NpOwotCQlpZiAoUnNzaSA+PSAtNTApCi0JCQlSc3NpX1F1YWxpdHkgPSAxMDA7Ci0JCWVsc2UgaWYgKFJzc2kgPj0gLTgwKSAgICAvLyBiZXR3ZWVuIC01MCB+IC04MGRibQotCQkJUnNzaV9RdWFsaXR5ID0gKFVJTlQpKDI0ICsgKChSc3NpICsgODApICogMjYpLzEwKTsKLQkJZWxzZSBpZiAoUnNzaSA+PSAtOTApICAgLy8gYmV0d2VlbiAtODAgfiAtOTBkYm0KLQkJCVJzc2lfUXVhbGl0eSA9IChVSU5UKSgoKFJzc2kgKyA5MCkgKiAyNikvMTApOwotCQllbHNlICAgIC8vIDwgLTg0IGRibQotCQkJUnNzaV9RdWFsaXR5ID0gMDsKLQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtOWQiLCBSc3NpX1F1YWxpdHkpOwotCQkvLyBXaXJlbGVzcyBNb2RlCi0JCXdpcmVsZXNzX21vZGUgPSBOZXR3b3JrVHlwZUluVXNlU2FuaXR5KHBCc3MpOwotCQlpZiAod2lyZWxlc3NfbW9kZSA9PSBOZGlzODAyXzExRkggfHwKLQkJCXdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMURTKQotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAiMTFiIik7Ci0JCWVsc2UgaWYgKHdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMU9GRE01KQotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAiMTFhIik7Ci0JCWVsc2UgaWYgKHdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMU9GRE01X04pCi0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICIxMWEvbiIpOwotCQllbHNlIGlmICh3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFPRkRNMjQpCi0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICIxMWIvZyIpOwotCQllbHNlIGlmICh3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFPRkRNMjRfTikKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTdzIiwgIjExYi9nL24iKTsKLQkJZWxzZQotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAidW5rbm93Iik7Ci0JCS8vTmV0d29yayBUeXBlCi0JCWlmIChwQnNzLT5Cc3NUeXBlID09IEJTU19BREhPQykKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTNzIiwgIiBBZCIpOwotCQllbHNlCi0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0zcyIsICIgSW4iKTsKLQotICAgICAgICBzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiXG4iKTsKLQotCXJldHVybjsKLX0KLQotVk9JRCBSVE1QSW9jdGxHZXRTaXRlU3VydmV5KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEpCi17Ci0JUFNUUklORwkJbXNnOwotCUlOVAkJaT0wOwotCUlOVAkJCVdhaXRDbnQ7Ci0JSU5UCQlTdGF0dXM9MDsKLSAgICBJTlQgICAgICAgICBtYXhfbGVuID0gTElORV9MRU47Ci0JUEJTU19FTlRSWQlwQnNzOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlvc19hbGxvY19tZW0oTlVMTCwgKFBVQ0hBUiAqKSZtc2csIHNpemVvZihDSEFSKSooKE1BWF9MRU5fT0ZfQlNTX1RBQkxFKSptYXhfbGVuKSk7Ci0KLQlpZiAobXNnID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QSW9jdGxHZXRTaXRlU3VydmV5IC0gbXNnIG1lbW9yeSBhbGxvYyBmYWlsLlxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JbWVtc2V0KG1zZywgMCAsKE1BWF9MRU5fT0ZfQlNTX1RBQkxFKSptYXhfbGVuICk7Ci0Jc3ByaW50Zihtc2csIiVzIiwiXG4iKTsKLQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS00cyUtMzNzJS0yMHMlLTIzcyUtOXMlLTdzJS0zc1xuIiwKLQkgICAgIkNoIiwgIlNTSUQiLCAiQlNTSUQiLCAiU2VjdXJpdHkiLCAiU2lnYW5sKCUpIiwgIlctTW9kZSIsICIgTlQiKTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlXYWl0Q250ID0gMDsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOwotCXdoaWxlICgoU2NhblJ1bm5pbmcocEFkYXB0ZXIpID09IFRSVUUpICYmIChXYWl0Q250KysgPCAyMDApKQotCQlPU19XQUlUKDUwMCk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlmb3IoaT0wOyBpPHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yIDtpKyspCi0JewotCQlwQnNzID0gJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldOwotCi0JCWlmKCBwQnNzLT5DaGFubmVsPT0wKQotCQkJYnJlYWs7Ci0KLQkJaWYoKHN0cmxlbihtc2cpK21heF9sZW4gKSA+PSBJV19TQ0FOX01BWF9EQVRBKQotCQkJYnJlYWs7Ci0KLQotCQlSVE1QQ29tbVNpdGVTdXJ2ZXlEYXRhKG1zZywgcEJzcyk7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCXBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihtc2cpOwotCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBtc2csIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QSW9jdGxHZXRTaXRlU3VydmV5IC0gd3JxLT51LmRhdGEubGVuZ3RoID0gJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCkpOwotCW9zX2ZyZWVfbWVtKE5VTEwsIChQVUNIQVIpbXNnKTsKLX0KLQotI2RlZmluZQlNQUNfTElORV9MRU4JKDE0KzQrNCsxMCsxMCsxMCs2KzYpCS8vIEFkZHIrYWlkK3BzbStkYXRhdGltZStyeGJ5dGUrdHhieXRlK2N1cnJlbnQgdHggcmF0ZStsYXN0IHR4IHJhdGUKLVZPSUQgUlRNUElvY3RsR2V0TWFjVGFibGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gc3RydWN0IGl3cmVxICp3cnEpCi17Ci0JSU5UIGk7Ci0JUlRfODAyXzExX01BQ19UQUJMRSBNYWNUYWI7Ci0JY2hhciAqbXNnOwotCi0JTWFjVGFiLk51bSA9IDA7Ci0JZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKLQl7Ci0JCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgJiYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uU3N0ID09IFNTVF9BU1NPQykpCi0JCXsKLQkJCUNPUFlfTUFDX0FERFIoTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkFkZHIsICZwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFkZHIpOwotCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkFpZCA9IChVQ0hBUilwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFpZDsKLQkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5Qc20gPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlBzTW9kZTsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5NaW1vUHMgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLk1tcHNNb2RlOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JCQkvLyBGaWxsIGluIFJTU0kgcGVyIGVudHJ5Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQXZnUnNzaTAgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlJzc2lTYW1wbGUuQXZnUnNzaTA7Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQXZnUnNzaTEgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlJzc2lTYW1wbGUuQXZnUnNzaTE7Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQXZnUnNzaTIgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlJzc2lTYW1wbGUuQXZnUnNzaTI7Ci0KLQkJCS8vIHRoZSBjb25uZWN0ZWQgdGltZSBwZXIgZW50cnkKLQkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5Db25uZWN0ZWRUaW1lID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5TdGFDb25uZWN0VGltZTsKLQkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuTUNTID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQuTUNTOwotCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5CVyA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLkJXOwotCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5TaG9ydEdJID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKLQkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuU1RCQyA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLlNUQkM7Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLmZpZWxkLnJzdiA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLnJzdjsKLQkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuTU9ERSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLk1PREU7Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLndvcmQgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhUUGh5TW9kZS53b3JkOwotCi0JCQlNYWNUYWIuTnVtICs9IDE7Ci0JCX0KLQl9Ci0Jd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUXzgwMl8xMV9NQUNfVEFCTEUpOwotCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk1hY1RhYiwgd3JxLT51LmRhdGEubGVuZ3RoKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOiBjb3B5X3RvX3VzZXIoKSBmYWlsXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQl9Ci0KLQltc2cgPSBrbWFsbG9jKHNpemVvZihDSEFSKSooTUFYX0xFTl9PRl9NQUNfVEFCTEUqTUFDX0xJTkVfTEVOKSwgTUVNX0FMTE9DX0ZMQUcpOwotCWlmIChtc2cgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzKCk6QWxsb2MgbWVtb3J5IGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybjsKLQl9Ci0JbWVtc2V0KG1zZywgMCAsTUFYX0xFTl9PRl9NQUNfVEFCTEUqTUFDX0xJTkVfTEVOICk7Ci0Jc3ByaW50Zihtc2csIiVzIiwiXG4iKTsKLQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xNHMlLTRzJS00cyUtMTBzJS0xMHMlLTEwcyUtNnMlLTZzXG4iLAotCQkiTUFDIiwgIkFJRCIsICJQU00iLCAiTERUIiwgIlJ4QiIsICJUeEIiLCJDVHhSIiwgIkxUeFIiKTsKLQotCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCi0JewotCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOwotCQlpZiAocEVudHJ5LT5WYWxpZEFzQ0xJICYmIChwRW50cnktPlNzdCA9PSBTU1RfQVNTT0MpKQotCQl7Ci0JCQlpZigoc3RybGVuKG1zZykrTUFDX0xJTkVfTEVOICkgPj0gKE1BWF9MRU5fT0ZfTUFDX1RBQkxFKk1BQ19MSU5FX0xFTikgKQotCQkJCWJyZWFrOwotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAgIiwKLQkJCQlwRW50cnktPkFkZHJbMF0sIHBFbnRyeS0+QWRkclsxXSwgcEVudHJ5LT5BZGRyWzJdLAotCQkJCXBFbnRyeS0+QWRkclszXSwgcEVudHJ5LT5BZGRyWzRdLCBwRW50cnktPkFkZHJbNV0pOwotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtNGQiLCAoaW50KXBFbnRyeS0+QWlkKTsKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTRkIiwgKGludClwRW50cnktPlBzTW9kZSk7Ci0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xMGQiLDAvKnBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFNDb3VudGVyLkxhc3REYXRhUGFja2V0VGltZSovKTsgLy8gVG9EbwotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTBkIiwwLypwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhTQ291bnRlci5Ub3RhbFJ4Qnl0ZUNvdW50Ki8pOyAvLyBUb0RvCi0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xMGQiLDAvKnBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFNDb3VudGVyLlRvdGFsVHhCeXRlQ291bnQqLyk7IC8vIFRvRG8KLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTZkIixSYXRlSWRUb01icHNbcEFkLT5NYWNUYWIuQ29udGVudFtpXS5DdXJyVHhSYXRlXSk7Ci0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS02ZFxuIiwwLypSYXRlSWRUb01icHNbcEFkLT5NYWNUYWIuQ29udGVudFtpXS5MYXN0VHhSYXRlXSovKTsgLy8gVG9EbwotCQl9Ci0JfQotCS8vIGZvciBjb21wYXRpYmxlIHdpdGggb2xkIEFQSSBqdXN0IGRvIHRoZSBwcmludGsgdG8gY29uc29sZQotCS8vd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKG1zZyk7Ci0JLy9pZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIG1zZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIiwgbXNnKSk7Ci0JfQotCi0Ja2ZyZWUobXNnKTsKLX0KLQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi1JTlQJU2V0X0JBU2V0dXBfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotICAgIFVDSEFSIG1hY1s2XSwgdGlkOwotCVBTVFJJTkcgdG9rZW47Ci0JU1RSSU5HIHNlcFZhbHVlW10gPSAiOiIsIERBU0ggPSAnLSc7Ci0JSU5UIGk7Ci0gICAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7Ci0KLS8qCi0JVGhlIEJBU2V0dXAgaW51cHQgc3RyaW5nIGZvcm1hdCBzaG91bGQgYmUgeHg6eHg6eHg6eHg6eHg6eHgtZCwKLQkJPT5UaGUgc2l4IDIgZGlnaXQgaGV4LWRlY2ltYWwgbnVtYmVyIHByZXZpb3VzIGFyZSB0aGUgTWFjIGFkZHJlc3MsCi0JCT0+VGhlIHNldmVudGggZGVjaW1hbCBudW1iZXIgaXMgdGhlIHRpZCB2YWx1ZS4KLSovCi0JLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlxuJXNcbiIsIGFyZykpOwotCi0JaWYoc3RybGVuKGFyZykgPCAxOSkgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3IHBsdXMgdGhlICItIiBhbmQgdGlkIHZhbHVlIGluIGRlY2ltYWwgZm9ybWF0LgotCQlyZXR1cm4gRkFMU0U7Ci0KLQl0b2tlbiA9IHN0cmNocihhcmcsIERBU0gpOwotCWlmICgodG9rZW4gIT0gTlVMTCkgJiYgKHN0cmxlbih0b2tlbik+MSkpCi0JewotCQl0aWQgPSAoVUNIQVIpIHNpbXBsZV9zdHJ0b2woKHRva2VuKzEpLCAwLCAxMCk7Ci0JCWlmICh0aWQgPiAxNSkKLQkJCXJldHVybiBGQUxTRTsKLQotCQkqdG9rZW4gPSAnXDAnOwotCQlmb3IgKGkgPSAwLCB0b2tlbiA9IHJzdHJ0b2soYXJnLCAmc2VwVmFsdWVbMF0pOyB0b2tlbjsgdG9rZW4gPSByc3RydG9rKE5VTEwsICZzZXBWYWx1ZVswXSksIGkrKykKLQkJewotCQkJaWYoKHN0cmxlbih0b2tlbikgIT0gMikgfHwgKCFpc3hkaWdpdCgqdG9rZW4pKSB8fCAoIWlzeGRpZ2l0KCoodG9rZW4rMSkpKSkKLQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQlBdG9IKHRva2VuLCAoJm1hY1tpXSksIDEpOwotCQl9Ci0JCWlmKGkgIT0gNikKLQkJCXJldHVybiBGQUxTRTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiXG4lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC0lMDJ4XG4iLAotCQkJCQkJCQltYWNbMF0sIG1hY1sxXSwgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdLCB0aWQpKTsKLQotCSAgICBwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIChQVUNIQVIpIG1hYyk7Ci0KLQlpZiAocEVudHJ5KSB7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJcblNldHVwIEJBIFNlc3Npb246IFRpZCA9ICVkXG4iLCB0aWQpKTsKLQkgICAgICAgIEJBT3JpU2Vzc2lvblNldFVwKHBBZCwgcEVudHJ5LCB0aWQsIDAsIDEwMCwgVFJVRSk7Ci0JfQotCi0JCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKLQotfQotCi1JTlQJU2V0X0JBRGVjbGluZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUxPTkcgYkJBRGVjbGluZTsKLQotCWJCQURlY2xpbmUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKGJCQURlY2xpbmUgPT0gMCkKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPSBGQUxTRTsKLQl9Ci0JZWxzZSBpZiAoYkJBRGVjbGluZSA9PSAxKQotCXsKLQkJcEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9IFRSVUU7Ci0JfQotCWVsc2UKLQl7Ci0JCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0JBRGVjbGluZV9Qcm9jOjooQkFEZWNsaW5lPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfQkFPcmlUZWFyRG93bl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0gICAgVUNIQVIgbWFjWzZdLCB0aWQ7Ci0JUFNUUklORyB0b2tlbjsKLQlTVFJJTkcgc2VwVmFsdWVbXSA9ICI6IiwgREFTSCA9ICctJzsKLQlJTlQgaTsKLSAgICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKLQotICAgIC8vREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJcbiVzXG4iLCBhcmcpKTsKLS8qCi0JVGhlIEJBT3JpVGVhckRvd24gaW51cHQgc3RyaW5nIGZvcm1hdCBzaG91bGQgYmUgeHg6eHg6eHg6eHg6eHg6eHgtZCwKLQkJPT5UaGUgc2l4IDIgZGlnaXQgaGV4LWRlY2ltYWwgbnVtYmVyIHByZXZpb3VzIGFyZSB0aGUgTWFjIGFkZHJlc3MsCi0JCT0+VGhlIHNldmVudGggZGVjaW1hbCBudW1iZXIgaXMgdGhlIHRpZCB2YWx1ZS4KLSovCi0gICAgaWYoc3RybGVuKGFyZykgPCAxOSkgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3IHBsdXMgdGhlICItIiBhbmQgdGlkIHZhbHVlIGluIGRlY2ltYWwgZm9ybWF0LgotCQlyZXR1cm4gRkFMU0U7Ci0KLQl0b2tlbiA9IHN0cmNocihhcmcsIERBU0gpOwotCWlmICgodG9rZW4gIT0gTlVMTCkgJiYgKHN0cmxlbih0b2tlbik+MSkpCi0JewotCQl0aWQgPSBzaW1wbGVfc3RydG9sKCh0b2tlbisxKSwgMCwgMTApOwotCQlpZiAodGlkID4gTlVNX09GX1RJRCkKLQkJCXJldHVybiBGQUxTRTsKLQotCQkqdG9rZW4gPSAnXDAnOwotCQlmb3IgKGkgPSAwLCB0b2tlbiA9IHJzdHJ0b2soYXJnLCAmc2VwVmFsdWVbMF0pOyB0b2tlbjsgdG9rZW4gPSByc3RydG9rKE5VTEwsICZzZXBWYWx1ZVswXSksIGkrKykKLQkJewotCQkJaWYoKHN0cmxlbih0b2tlbikgIT0gMikgfHwgKCFpc3hkaWdpdCgqdG9rZW4pKSB8fCAoIWlzeGRpZ2l0KCoodG9rZW4rMSkpKSkKLQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQlBdG9IKHRva2VuLCAoJm1hY1tpXSksIDEpOwotCQl9Ci0JCWlmKGkgIT0gNikKLQkJCXJldHVybiBGQUxTRTsKLQotCSAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiXG4lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC0lMDJ4IiwKLQkJCQkJCQkJbWFjWzBdLCBtYWNbMV0sIG1hY1syXSwgbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSwgdGlkKSk7Ci0KLQkgICAgcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCAoUFVDSEFSKSBtYWMpOwotCi0JICAgIGlmIChwRW50cnkpIHsKLQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJcblRlYXIgZG93biBPcmkgQkEgU2Vzc2lvbjogVGlkID0gJWRcbiIsIHRpZCkpOwotCSAgICAgICAgQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBwRW50cnktPkFpZCwgdGlkLCBGQUxTRSwgVFJVRSk7Ci0JICAgIH0KLQotCQlyZXR1cm4gVFJVRTsKLQl9Ci0KLQlyZXR1cm4gRkFMU0U7Ci0KLX0KLQotSU5UCVNldF9CQVJlY1RlYXJEb3duX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLSAgICBVQ0hBUiBtYWNbNl0sIHRpZDsKLQlQU1RSSU5HIHRva2VuOwotCVNUUklORyBzZXBWYWx1ZVtdID0gIjoiLCBEQVNIID0gJy0nOwotCUlOVCBpOwotICAgIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OwotCi0gICAgLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlxuJXNcbiIsIGFyZykpOwotLyoKLQlUaGUgQkFSZWNUZWFyRG93biBpbnVwdCBzdHJpbmcgZm9ybWF0IHNob3VsZCBiZSB4eDp4eDp4eDp4eDp4eDp4eC1kLAotCQk9PlRoZSBzaXggMiBkaWdpdCBoZXgtZGVjaW1hbCBudW1iZXIgcHJldmlvdXMgYXJlIHRoZSBNYWMgYWRkcmVzcywKLQkJPT5UaGUgc2V2ZW50aCBkZWNpbWFsIG51bWJlciBpcyB0aGUgdGlkIHZhbHVlLgotKi8KLSAgICBpZihzdHJsZW4oYXJnKSA8IDE5KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcgcGx1cyB0aGUgIi0iIGFuZCB0aWQgdmFsdWUgaW4gZGVjaW1hbCBmb3JtYXQuCi0JCXJldHVybiBGQUxTRTsKLQotCXRva2VuID0gc3RyY2hyKGFyZywgREFTSCk7Ci0JaWYgKCh0b2tlbiAhPSBOVUxMKSAmJiAoc3RybGVuKHRva2VuKT4xKSkKLQl7Ci0JCXRpZCA9IHNpbXBsZV9zdHJ0b2woKHRva2VuKzEpLCAwLCAxMCk7Ci0JCWlmICh0aWQgPiBOVU1fT0ZfVElEKQotCQkJcmV0dXJuIEZBTFNFOwotCi0JCSp0b2tlbiA9ICdcMCc7Ci0JCWZvciAoaSA9IDAsIHRva2VuID0gcnN0cnRvayhhcmcsICZzZXBWYWx1ZVswXSk7IHRva2VuOyB0b2tlbiA9IHJzdHJ0b2soTlVMTCwgJnNlcFZhbHVlWzBdKSwgaSsrKQotCQl7Ci0JCQlpZigoc3RybGVuKHRva2VuKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp0b2tlbikpIHx8ICghaXN4ZGlnaXQoKih0b2tlbisxKSkpKQotCQkJCXJldHVybiBGQUxTRTsKLQkJCUF0b0godG9rZW4sICgmbWFjW2ldKSwgMSk7Ci0JCX0KLQkJaWYoaSAhPSA2KQotCQkJcmV0dXJuIEZBTFNFOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LSUwMngiLAotCQkJCQkJCQltYWNbMF0sIG1hY1sxXSwgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdLCB0aWQpKTsKLQotCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIChQVUNIQVIpIG1hYyk7Ci0KLQkJaWYgKHBFbnRyeSkgewotCQkgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlxuVGVhciBkb3duIFJlYyBCQSBTZXNzaW9uOiBUaWQgPSAlZFxuIiwgdGlkKSk7Ci0JCSAgICBCQVJlY1Nlc3Npb25UZWFyRG93bihwQWQsIHBFbnRyeS0+QWlkLCB0aWQsIEZBTFNFKTsKLQkJfQotCi0JCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKLQotfQotCi1JTlQJU2V0X0h0QndfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVMT05HIEh0Qnc7Ci0KLQlIdEJ3ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlpZiAoSHRCdyA9PSBCV180MCkKLQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzQwOwotCWVsc2UgaWYgKEh0QncgPT0gQldfMjApCi0JCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV18yMDsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEJ3X1Byb2M6OihIdEJ3PSVkKVxuIiwgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UCVNldF9IdE1jc19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUxPTkcgSHRNY3MsIE1jc190bXA7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0gICAgQk9PTEVBTiBiQXV0b1JhdGUgPSBGQUxTRTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCU1jc190bXAgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKE1jc190bXAgPD0gMTUgfHwgTWNzX3RtcCA9PSAzMikKLQkJSHRNY3MgPSBNY3NfdG1wOwotCWVsc2UKLQkJSHRNY3MgPSBNQ1NfQVVUTzsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IEh0TWNzOwotCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IChIdE1jcyA9PSBNQ1NfQVVUTykgPyBUUlVFOkZBTFNFOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRNY3NfUHJvYzo6KEh0TWNzPSVkLCBiQXV0b1R4UmF0ZVN3aXRjaCA9ICVkKVxuIiwKLQkJCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTLCBwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCkpOwotCi0JCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8IFBIWV8xMUFCR05fTUlYRUQpIHx8Ci0JCQkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8IE1PREVfSFRNSVgpKQotCQl7Ci0JICAgICAgICBpZiAoKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICE9IE1DU19BVVRPKSAmJgotCQkJCShIdE1jcyA+PSAwICYmIEh0TWNzIDw9IDMpICYmCi0JICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUgPT0gRklYRURfVFhNT0RFX0NDSykpCi0JCQl7Ci0JCQkJUlRNUFNldERlc2lyZWRSYXRlcyhwQWQsIChMT05HKSAoUmF0ZUlkVG9NYnBzW0h0TWNzXSAqIDEwMDAwMDApKTsKLQkJCX0KLQkgICAgICAgIGVsc2UgaWYgKChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAhPSBNQ1NfQVVUTykgJiYKLQkJCQkJKEh0TWNzID49IDAgJiYgSHRNY3MgPD0gNykgJiYKLQkJCShwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlID09IEZJWEVEX1RYTU9ERV9PRkRNKSkKLQkJCXsKLQkJCQlSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgKExPTkcpIChSYXRlSWRUb01icHNbSHRNY3MrNF0gKiAxMDAwMDAwKSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJYkF1dG9SYXRlID0gVFJVRTsKLQotCQkJaWYgKGJBdXRvUmF0ZSkKLQkJCXsKLQkgICAgICAgICAgICBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOwotCQkJCVJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCAtMSk7Ci0JCQl9Ci0JICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRNY3NfUHJvYzo6KEZpeGVkVHhNb2RlPSVkKVxuIixwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlKSk7Ci0JCX0KLSAgICAgICAgaWYgKEFESE9DX09OKHBBZCkpCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlTZXRDb21tb25IVChwQWQpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfSHRHaV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUxPTkcgSHRHaTsKLQotCUh0R2kgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKCBIdEdpID09IEdJXzQwMCkKLQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kgPSBHSV80MDA7Ci0JZWxzZSBpZiAoIEh0R2kgPT0gR0lfODAwICkKLQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEdpX1Byb2M6OihTaG9ydEdJPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotSU5UCVNldF9IdFR4QkFTaXplX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVQ0hBUiBTaXplOwotCi0JU2l6ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoU2l6ZSA8PTAgfHwgU2l6ZSA+PTY0KQotCXsKLQkJU2l6ZSA9IDg7Ci0JfQotCXBBZC0+Q29tbW9uQ2ZnLlR4QkFTaXplID0gU2l6ZS0xOwotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9IdFR4QkFTaXplIDo6KFR4QkFTaXplPSAlZClcbiIsIFNpemUpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0RGlzYWxsb3dUS0lQX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChWYWx1ZSA9PSAxKQotCXsKLQkJcEFkLT5Db21tb25DZmcuSFRfRGlzYWxsb3dUS0lQID0gVFJVRTsKLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5Db21tb25DZmcuSFRfRGlzYWxsb3dUS0lQID0gRkFMU0U7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0RGlzYWxsb3dUS0lQX1Byb2MgOjolc1xuIiwKLQkJCQkocEFkLT5Db21tb25DZmcuSFRfRGlzYWxsb3dUS0lQID09IFRSVUUpID8gImVuYWJsZWQiIDogImRpc2FibGVkIikpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfSHRPcE1vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCi0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoVmFsdWUgPT0gSFRNT0RFX0dGKQotCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFICA9IEhUTU9ERV9HRjsKLQllbHNlIGlmICggVmFsdWUgPT0gSFRNT0RFX01NICkKLQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSAgPSBIVE1PREVfTU07Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE9wTW9kZV9Qcm9jOjooSHRPcE1vZGU9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUpKTsKLQotCXJldHVybiBUUlVFOwotCi19Ci0KLUlOVAlTZXRfSHRTdGJjX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKFZhbHVlID09IFNUQkNfVVNFKQotCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQyA9IFNUQkNfVVNFOwotCWVsc2UgaWYgKCBWYWx1ZSA9PSBTVEJDX05PTkUgKQotCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlTZXRDb21tb25IVChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1N0YmNfUHJvYzo6KEh0U3RiYz0lZClcbiIscEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkMpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0SHRjX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCWlmIChWYWx1ZSA9PSAwKQotCQlwQWQtPkhUQ0VuYWJsZSA9IEZBTFNFOwotCWVsc2UgaWYgKCBWYWx1ZSA9PTEgKQotICAgICAgICBwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0SHRjX1Byb2M6OihIdEh0Yz0lZClcbiIscEFkLT5IVENFbmFibGUpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0RXh0Y2hhX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKFZhbHVlID09IDApCi0JCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgID0gRVhUQ0hBX0JFTE9XOwotCWVsc2UgaWYgKCBWYWx1ZSA9PTEgKQotICAgICAgICBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0FCT1ZFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRFeHRjaGFfUHJvYzo6KEh0RXh0Y2hhPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UCVNldF9IdE1wZHVEZW5zaXR5X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChWYWx1ZSA8PTcgJiYgVmFsdWUgPj0gMCkKLQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gVmFsdWU7Ci0JZWxzZQotCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSA0OwotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE1wZHVEZW5zaXR5X1Byb2M6OihIdE1wZHVEZW5zaXR5PSVkKVxuIixwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0QmFXaW5TaXplX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCi0JaWYgKFZhbHVlID49MSAmJiBWYWx1ZSA8PSA2NCkKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSBWYWx1ZTsKLQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IFZhbHVlOwotCX0KLQllbHNlCi0JewotICAgICAgICBwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gNjQ7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSA2NDsKLQl9Ci0KLQlTZXRDb21tb25IVChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0QmFXaW5TaXplX1Byb2M6OihIdEJhV2luU2l6ZT0lZClcbiIscEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfSHRSZGdfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKFZhbHVlID09IDApCi0JCXBBZC0+Q29tbW9uQ2ZnLmJSZGcgPSBGQUxTRTsKLQllbHNlIGlmICggVmFsdWUgPT0xICkKLQl7Ci0JCXBBZC0+SFRDRW5hYmxlID0gVFJVRTsKLSAgICAgICAgcEFkLT5Db21tb25DZmcuYlJkZyA9IFRSVUU7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRSZGdfUHJvYzo6KEh0UmRnPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5iUmRnKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UCVNldF9IdExpbmtBZGFwdF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0JaWYgKFZhbHVlID09IDApCi0JCXBBZC0+YkxpbmtBZGFwdCA9IEZBTFNFOwotCWVsc2UgaWYgKCBWYWx1ZSA9PTEgKQotCXsKLQkJCXBBZC0+SFRDRW5hYmxlID0gVFJVRTsKLQkJCXBBZC0+YkxpbmtBZGFwdCA9IFRSVUU7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdExpbmtBZGFwdF9Qcm9jOjooSHRMaW5rQWRhcHQ9JWQpXG4iLHBBZC0+YkxpbmtBZGFwdCkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfSHRBbXNkdV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0JaWYgKFZhbHVlID09IDApCi0JCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSA9IEZBTFNFOwotCWVsc2UgaWYgKCBWYWx1ZSA9PSAxICkKLSAgICAgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlID0gVFJVRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlTZXRDb21tb25IVChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0QW1zZHVfUHJvYzo6KEh0QW1zZHU9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfSHRBdXRvQmFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCWlmIChWYWx1ZSA9PSAwKQotCXsKLQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IEZBTFNFOwotCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gQkFfTk9UVVNFOwotCX0KLSAgICBlbHNlIGlmIChWYWx1ZSA9PSAxKQotICAgIHsKLQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IFRSVUU7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBJTU1FRF9CQTsKLSAgICB9Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0gICAgcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkE7Ci0JcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3k7Ci0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEF1dG9CYV9Qcm9jOjooSHRBdXRvQmE9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEpKTsKLQotCXJldHVybiBUUlVFOwotCi19Ci0KLUlOVAlTZXRfSHRQcm90ZWN0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlpZiAoVmFsdWUgPT0gMCkKLQkJcEFkLT5Db21tb25DZmcuYkhUUHJvdGVjdCA9IEZBTFNFOwotICAgIGVsc2UgaWYgKFZhbHVlID09IDEpCi0JCXBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QgPSBUUlVFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdFByb3RlY3RfUHJvYzo6KEh0UHJvdGVjdD0lZClcbiIscEFkLT5Db21tb25DZmcuYkhUUHJvdGVjdCkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfU2VuZFBTTVBBY3Rpb25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotICAgIFVDSEFSIG1hY1s2XSwgbW9kZTsKLQlQU1RSSU5HIHRva2VuOwotCVNUUklORyBzZXBWYWx1ZVtdID0gIjoiLCBEQVNIID0gJy0nOwotCUlOVCBpOwotICAgIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OwotCi0gICAgLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlxuJXNcbiIsIGFyZykpOwotLyoKLQlUaGUgQkFSZWNUZWFyRG93biBpbnVwdCBzdHJpbmcgZm9ybWF0IHNob3VsZCBiZSB4eDp4eDp4eDp4eDp4eDp4eC1kLAotCQk9PlRoZSBzaXggMiBkaWdpdCBoZXgtZGVjaW1hbCBudW1iZXIgcHJldmlvdXMgYXJlIHRoZSBNYWMgYWRkcmVzcywKLQkJPT5UaGUgc2V2ZW50aCBkZWNpbWFsIG51bWJlciBpcyB0aGUgbW9kZSB2YWx1ZS4KLSovCi0gICAgaWYoc3RybGVuKGFyZykgPCAxOSkgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3IHBsdXMgdGhlICItIiBhbmQgbW9kZSB2YWx1ZSBpbiBkZWNpbWFsIGZvcm1hdC4KLQkJcmV0dXJuIEZBTFNFOwotCi0JdG9rZW4gPSBzdHJjaHIoYXJnLCBEQVNIKTsKLQlpZiAoKHRva2VuICE9IE5VTEwpICYmIChzdHJsZW4odG9rZW4pPjEpKQotCXsKLQkJbW9kZSA9IHNpbXBsZV9zdHJ0b2woKHRva2VuKzEpLCAwLCAxMCk7Ci0JCWlmIChtb2RlID4gTU1QU19FTkFCTEUpCi0JCQlyZXR1cm4gRkFMU0U7Ci0KLQkJKnRva2VuID0gJ1wwJzsKLQkJZm9yIChpID0gMCwgdG9rZW4gPSByc3RydG9rKGFyZywgJnNlcFZhbHVlWzBdKTsgdG9rZW47IHRva2VuID0gcnN0cnRvayhOVUxMLCAmc2VwVmFsdWVbMF0pLCBpKyspCi0JCXsKLQkJCWlmKChzdHJsZW4odG9rZW4pICE9IDIpIHx8ICghaXN4ZGlnaXQoKnRva2VuKSkgfHwgKCFpc3hkaWdpdCgqKHRva2VuKzEpKSkpCi0JCQkJcmV0dXJuIEZBTFNFOwotCQkJQXRvSCh0b2tlbiwgKCZtYWNbaV0pLCAxKTsKLQkJfQotCQlpZihpICE9IDYpCi0JCQlyZXR1cm4gRkFMU0U7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlxuJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngtJTAyeCIsCi0JCQkJCQkJCW1hY1swXSwgbWFjWzFdLCBtYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0sIG1vZGUpKTsKLQotCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIG1hYyk7Ci0KLQkJaWYgKHBFbnRyeSkgewotCQkgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlxuU2VuZFBTTVBBY3Rpb24gTUlQUyBtb2RlID0gJWRcbiIsIG1vZGUpKTsKLQkJICAgIFNlbmRQU01QQWN0aW9uKHBBZCwgcEVudHJ5LT5BaWQsIG1vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIFRSVUU7Ci0JfQotCi0JcmV0dXJuIEZBTFNFOwotCi0KLX0KLQotSU5UCVNldF9IdE1JTU9QU21vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKFZhbHVlIDw9MyAmJiBWYWx1ZSA+PSAwKQotCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBWYWx1ZTsKLQllbHNlCi0JCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IDM7Ci0KLQlTZXRDb21tb25IVChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0TUlNT1BTbW9kZV9Qcm9jOjooTUlNT1BTIG1vZGU9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotSU5UCVNldF9Gb3JjZVNob3J0R0lfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCWlmIChWYWx1ZSA9PSAwKQotCQlwQWQtPldJRkl0ZXN0YmVkLmJTaG9ydEdJID0gRkFMU0U7Ci0JZWxzZSBpZiAoVmFsdWUgPT0gMSkKLQkJcEFkLT5XSUZJdGVzdGJlZC5iU2hvcnRHSSA9IFRSVUU7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9Gb3JjZVNob3J0R0lfUHJvYzo6KEZvcmNlU2hvcnRHST0lZClcbiIsIHBBZC0+V0lGSXRlc3RiZWQuYlNob3J0R0kpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLQotSU5UCVNldF9Gb3JjZUdGX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlpZiAoVmFsdWUgPT0gMCkKLQkJcEFkLT5XSUZJdGVzdGJlZC5iR3JlZW5GaWVsZCA9IEZBTFNFOwotCWVsc2UgaWYgKFZhbHVlID09IDEpCi0JCXBBZC0+V0lGSXRlc3RiZWQuYkdyZWVuRmllbGQgPSBUUlVFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRm9yY2VHRl9Qcm9jOjooRm9yY2VHRj0lZClcbiIsIHBBZC0+V0lGSXRlc3RiZWQuYkdyZWVuRmllbGQpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0TWltb1BzX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlpZiAoVmFsdWUgPT0gMCkKLQkJcEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSA9IEZBTFNFOwotCWVsc2UgaWYgKFZhbHVlID09IDEpCi0JCXBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUgPSBUUlVFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE1pbW9Qc19Qcm9jOjooSHRNaW1vUHM9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUpKTsKLQotCXJldHVybiBUUlVFOwotfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLUlOVAlTZXRDb21tb25IVCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlPSURfU0VUX0hUX1BIWU1PREUJCVNldEhUOwotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPCBQSFlfMTFBQkdOX01JWEVEKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlTZXRIVC5QaHlNb2RlID0gcEFkLT5Db21tb25DZmcuUGh5TW9kZTsKLQlTZXRIVC5UcmFuc21pdE5vID0gKChVQ0hBUilwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoKTsKLQlTZXRIVC5IdE1vZGUgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERTsKLQlTZXRIVC5FeHRPZmZzZXQgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQTsKLQlTZXRIVC5NQ1MgPSBNQ1NfQVVUTzsKLQlTZXRIVC5CVyA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlc7Ci0JU2V0SFQuU1RCQyA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQzsKLQlTZXRIVC5TSE9SVEdJID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJOwotCi0JUlRNUFNldEhUKHBBZCwgJlNldEhUKTsKLQotCXJldHVybiBUUlVFOwotfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1JTlQJU2V0X0ZpeGVkVHhNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVQ0hBUglmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKLQotCWlmIChzdHJjbXAoYXJnLCAiT0ZETSIpID09IDAgfHwgc3RyY21wKGFyZywgIm9mZG0iKSA9PSAwKQotCXsKLQkJZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfT0ZETTsKLQl9Ci0JZWxzZSBpZiAoc3RyY21wKGFyZywgIkNDSyIpID09IDAgfHwgc3RyY21wKGFyZywgImNjayIpID09IDApCi0JewotICAgICAgICBmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9DQ0s7Ci0JfQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSA9IGZpeF90eF9tb2RlOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0ZpeGVkVHhNb2RlX1Byb2M6OihGaXhlZFR4TW9kZT0lZClcbiIsIGZpeF90eF9tb2RlKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCi1JTlQJU2V0X09wTW9kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQ2FuIG5vdCBzd2l0Y2ggb3BlcmF0ZSBtb2RlIG9uIGludGVyZmFjZSB1cCAhISBcbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCWlmIChWYWx1ZSA9PSAwKQotCQlwQWQtPk9wTW9kZSA9IE9QTU9ERV9TVEE7Ci0JZWxzZSBpZiAoVmFsdWUgPT0gMSkKLQkJcEFkLT5PcE1vZGUgPSBPUE1PREVfQVA7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X09wTW9kZV9Qcm9jOjooT3BNb2RlPSVzKVxuIiwgcEFkLT5PcE1vZGUgPT0gMSA/ICJBUCBNb2RlIiA6ICJTVEEgTW9kZSIpKTsKLQotCXJldHVybiBUUlVFOwotfQotI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCi0KLQotCi1JTlQgU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVRYX1JUWV9DRkdfU1RSVUMJdHhfcnR5X2NmZzsKLQlVQ0hBUgkJCQlMb25nUmV0cnlMaW1pdCA9IChVQ0hBUilzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOwotCXR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0ID0gTG9uZ1JldHJ5TGltaXQ7Ci0JUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklGIFNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jOjoodHhfcnR5X2NmZz0weCV4KVxuIiwgdHhfcnR5X2NmZy53b3JkKSk7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVCBTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVRYX1JUWV9DRkdfU1RSVUMJdHhfcnR5X2NmZzsKLQlVQ0hBUgkJCQlTaG9ydFJldHJ5TGltaXQgPSAoVUNIQVIpc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKLQl0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQgPSBTaG9ydFJldHJ5TGltaXQ7Ci0JUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklGIFNldF9TaG9ydFJldHJ5TGltaXRfUHJvYzo6KHR4X3J0eV9jZmc9MHgleClcbiIsIHR4X3J0eV9jZmcud29yZCkpOwotCXJldHVybiBUUlVFOwotfQotCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLVBTVFJJTkcgUlRNUEdldFJhbGlua0F1dGhNb2RlU3RyKAotICAgIElOICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFIGF1dGhNb2RlKQotewotCXN3aXRjaChhdXRoTW9kZSkKLQl7Ci0JCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlT3BlbjoKLQkJCXJldHVybiAiT1BFTiI7Ci0JCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOgotCQkJcmV0dXJuICJXUEFQU0siOwotCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDoKLQkJCXJldHVybiAiU0hBUkVEIjsKLQkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEE6Ci0JCQlyZXR1cm4gIldQQSI7Ci0JCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMjoKLQkJCXJldHVybiAiV1BBMiI7Ci0JCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzoKLQkJCXJldHVybiAiV1BBMlBTSyI7Ci0gICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0s6Ci0JCQlyZXR1cm4gIldQQVBTS1dQQTJQU0siOwotICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyOgotCQkJcmV0dXJuICJXUEExV1BBMiI7Ci0JCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZToKLQkJCXJldHVybiAiV1BBTk9ORSI7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gIlVOS05PVyI7Ci0JfQotfQotCi1QU1RSSU5HIFJUTVBHZXRSYWxpbmtFbmNyeU1vZGVTdHIoCi0gICAgSU4gIFVTSE9SVCBlbmNyeU1vZGUpCi17Ci0Jc3dpdGNoKGVuY3J5TW9kZSkKLQl7Ci0JCWNhc2UgTmRpczgwMl8xMVdFUERpc2FibGVkOgotCQkJcmV0dXJuICJOT05FIjsKLQkJY2FzZSBOZGlzODAyXzExV0VQRW5hYmxlZDoKLQkJCXJldHVybiAiV0VQIjsKLQkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOgotCQkJcmV0dXJuICJUS0lQIjsKLQkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOgotCQkJcmV0dXJuICJBRVMiOwotICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ6Ci0JCQlyZXR1cm4gIlRLSVBBRVMiOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuICJVTktOT1ciOwotCX0KLX0KLQotSU5UIFJUTVBTaG93Q2ZnVmFsdWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCXBOYW1lLAotCUlOCVBTVFJJTkcJCQlwQnVmKQotewotCUlOVAlTdGF0dXMgPSAwOwotCi0JZm9yIChQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DID0gUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DOyBQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DLT5uYW1lOyBQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DKyspCi0JewotCQlpZiAoIXN0cmNtcChwTmFtZSwgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZSkpCi0JCXsKLQkJCWlmKFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPnNob3dfcHJvYyhwQWQsIHBCdWYpKQotCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQlicmVhazsgIC8vRXhpdCBmb3IgbG9vcC4KLQkJfQotCX0KLQotCWlmKFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPm5hbWUgPT0gTlVMTCkKLQl7Ci0JCXNwcmludGYocEJ1ZiwgIlxuIik7Ci0JCWZvciAoUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQyA9IFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQzsgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZTsgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQysrKQotCQkJc3ByaW50ZihwQnVmLCAiJXMlc1xuIiwgcEJ1ZiwgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZSk7Ci0JfQotCi0JcmV0dXJuIFN0YXR1czsKLX0KLQotSU5UCVNob3dfU1NJRF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5Tc2lkKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfV2lyZWxlc3NNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXN3aXRjaChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKQotCXsKLQkJY2FzZSBQSFlfMTFCR19NSVhFRDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0MTFCL0ciKTsKLQkJCWJyZWFrOwotCQljYXNlIFBIWV8xMUI6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdDExQiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExQToKLQkJCXNwcmludGYocEJ1ZiwgIlx0MTFBIik7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdDExQS9CL0ciKTsKLQkJCWJyZWFrOwotCQljYXNlIFBIWV8xMUc6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdDExRyIpOwotCQkJYnJlYWs7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWNhc2UgUEhZXzExQUJHTl9NSVhFRDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0MTFBL0IvRy9OIik7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFOXzJfNEc6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdDExTiBvbmx5IHdpdGggMi40RyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExR05fTUlYRUQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdDExRy9OIik7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFBTl9NSVhFRDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0MTFBL04iKTsKLQkJCWJyZWFrOwotCQljYXNlIFBIWV8xMUJHTl9NSVhFRDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0MTFCL0cvTiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExQUdOX01JWEVEOgotCQkJc3ByaW50ZihwQnVmLCAiXHQxMUEvRy9OIik7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFOXzVHOgotCQkJc3ByaW50ZihwQnVmLCAiXHQxMU4gb25seSB3aXRoIDVHIik7Ci0JCQlicmVhazsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJZGVmYXVsdDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVkKSIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpOwotCQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi0KLUlOVAlTaG93X1R4QnVyc3RfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID8gIlRSVUUiOiJGQUxTRSIpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19UeFByZWFtYmxlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXN3aXRjaChwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlKQotCXsKLQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlU2hvcnQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdFNob3J0Iik7Ci0JCQlicmVhazsKLQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlTG9uZzoKLQkJCXNwcmludGYocEJ1ZiwgIlx0TG9uZyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZUF1dG86Ci0JCQlzcHJpbnRmKHBCdWYsICJcdEF1dG8iKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJWx1KSIsIHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpOwotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X1R4UG93ZXJfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQlbHUiLCBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0NoYW5uZWxfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQlZCIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19CR1Byb3RlY3Rpb25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0Jc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbikKLQl7Ci0JCWNhc2UgMTogLy9BbHdheXMgT24KLQkJCXNwcmludGYocEJ1ZiwgIlx0T04iKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6IC8vQWx3YXlzIE9GRgotCQkJc3ByaW50ZihwQnVmLCAiXHRPRkYiKTsKLQkJCWJyZWFrOwotCQljYXNlIDA6IC8vQVVUTwotCQkJc3ByaW50ZihwQnVmLCAiXHRBdXRvIik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVsdSkiLCBwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24pOwotCQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19SVFNUaHJlc2hvbGRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQldSIsIHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0ZyYWdUaHJlc2hvbGRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQldSIsIHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKTsKLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotSU5UCVNob3dfSHRCd19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlpZiAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKQotCXsKLQkJc3ByaW50ZihwQnVmLCAiXHQ0MCBNSHoiKTsKLQl9Ci0JZWxzZQotCXsKLSAgICAgICAgc3ByaW50ZihwQnVmLCAiXHQyMCBNSHoiKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0h0TWNzX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJc3ByaW50ZihwQnVmLCAiXHQldSIsIHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfSHRHaV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlzd2l0Y2gocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kpCi0JewotCQljYXNlIEdJXzQwMDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0R0lfNDAwIik7Ci0JCQlicmVhazsKLQkJY2FzZSBHSV84MDA6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdEdJXzgwMCIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSgldSkiLCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSk7Ci0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0h0T3BNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXN3aXRjaChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFKQotCXsKLQkJY2FzZSBIVE1PREVfR0Y6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdEdGIik7Ci0JCQlicmVhazsKLQkJY2FzZSBIVE1PREVfTU06Ci0JCQlzcHJpbnRmKHBCdWYsICJcdE1NIik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCV1KSIsIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUpOwotCQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19IdEV4dGNoYV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlzd2l0Y2gocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSkKLQl7Ci0JCWNhc2UgRVhUQ0hBX0JFTE9XOgotCQkJc3ByaW50ZihwQnVmLCAiXHRCZWxvdyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRVhUQ0hBX0FCT1ZFOgotCQkJc3ByaW50ZihwQnVmLCAiXHRBYm92ZSIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSgldSkiLCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBKTsKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi1JTlQJU2hvd19IdE1wZHVEZW5zaXR5X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19IdEJhV2luU2l6ZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlzcHJpbnRmKHBCdWYsICJcdCV1IiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0h0UmRnX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5iUmRnID8gIlRSVUUiOiJGQUxTRSIpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19IdEFtc2R1X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUgPyAiVFJVRSI6IkZBTFNFIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0h0QXV0b0JhX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID8gIlRSVUUiOiJGQUxTRSIpOwotCXJldHVybiAwOwotfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1JTlQJU2hvd19Db3VudHJ5UmVnaW9uX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JWQiLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JWQiLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19Db3VudHJ5Q29kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpOwotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAotSU5UCVNob3dfUGt0QWdncmVnYXRlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID8gIlRSVUUiOiJGQUxTRSIpOwotCXJldHVybiAwOwotfQotI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KLQotI2lmZGVmIFdNTV9TVVBQT1JUCi1JTlQJU2hvd19XbW1DYXBhYmxlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID8gIlRSVUUiOiJGQUxTRSIpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLy8gV01NX1NVUFBPUlQgLy8KLQotSU5UCVNob3dfSUVFRTgwMjExSF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPyAiVFJVRSI6IkZBTFNFIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLUlOVAlTaG93X05ldHdvcmtUeXBlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXN3aXRjaChwQWQtPlN0YUNmZy5Cc3NUeXBlKQotCXsKLQkJY2FzZSBCU1NfQURIT0M6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdEFkaG9jIik7Ci0JCQlicmVhazsKLQkJY2FzZSBCU1NfSU5GUkE6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdEluZnJhIik7Ci0JCQlicmVhazsKLQkJY2FzZSBCU1NfQU5ZOgotCQkJc3ByaW50ZihwQnVmLCAiXHRBbnkiKTsKLQkJCWJyZWFrOwotCQljYXNlIEJTU19NT05JVE9SOgotCQkJc3ByaW50ZihwQnVmLCAiXHRNb25pdG9yIik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVkKSIsIHBBZC0+U3RhQ2ZnLkJzc1R5cGUpOwotCQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotSU5UCVNob3dfQXV0aE1vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0JTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERQlBdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQlBdXRoTW9kZSA9IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JaWYgKChBdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKSAmJgotCQkoQXV0aE1vZGUgPD0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0spKQotCQlzcHJpbnRmKHBCdWYsICJcdCVzIiwgUlRNUEdldFJhbGlua0F1dGhNb2RlU3RyKEF1dGhNb2RlKSk7Ci0JZWxzZQotCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglZCkiLCBBdXRoTW9kZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfRW5jcnlwVHlwZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlORElTXzgwMl8xMV9XRVBfU1RBVFVTCVdlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCVdlcFN0YXR1cyA9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCWlmICgoV2VwU3RhdHVzID49IE5kaXM4MDJfMTFXRVBFbmFibGVkKSAmJgotCQkoV2VwU3RhdHVzIDw9IE5kaXM4MDJfMTFFbmNyeXB0aW9uNEtleUFic2VudCkpCi0JCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBSVE1QR2V0UmFsaW5rRW5jcnlNb2RlU3RyKFdlcFN0YXR1cykpOwotCWVsc2UKLQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJWQpIiwgV2VwU3RhdHVzKTsKLQotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19EZWZhdWx0S2V5SURfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0JVUNIQVIgRGVmYXVsdEtleUlkID0gMDsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCURlZmF1bHRLZXlJZCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCXNwcmludGYocEJ1ZiwgIlx0JWQiLCBEZWZhdWx0S2V5SWQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X1dlcEtleV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICBJTlQJCQkJS2V5SWR4LAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlVQ0hBUiAgIEtleVsxNl0gPSB7MH0sIEtleUxlbmd0aCA9IDA7Ci0JSU5UCQlpbmRleCA9IEJTUzA7Ci0KLQlLZXlMZW5ndGggPSBwQWQtPlNoYXJlZEtleVtpbmRleF1bS2V5SWR4XS5LZXlMZW47Ci0JTmRpc01vdmVNZW1vcnkoS2V5LCBwQWQtPlNoYXJlZEtleVtpbmRleF1bS2V5SWR4XS5LZXksIEtleUxlbmd0aCk7Ci0KLQkvL2NoZWNrIGtleSBzdHJpbmcgaXMgQVNDSUkgb3Igbm90Ci0gICAgaWYgKFJUTVBDaGVja1N0clByaW50QWJsZSgoUENIQVIpS2V5LCBLZXlMZW5ndGgpKQotICAgICAgICBzcHJpbnRmKHBCdWYsICJcdCVzIiwgS2V5KTsKLSAgICBlbHNlCi0gICAgewotICAgICAgICBpbnQgaWR4OwotICAgICAgICBzcHJpbnRmKHBCdWYsICJcdCIpOwotICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IEtleUxlbmd0aDsgaWR4KyspCi0gICAgICAgICAgICBzcHJpbnRmKHBCdWYrc3RybGVuKHBCdWYpLCAiJTAyWCIsIEtleVtpZHhdKTsKLSAgICB9Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0tleTFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0JU2hvd19XZXBLZXlfUHJvYyhwQWQsIDAsIHBCdWYpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19LZXkyX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCVNob3dfV2VwS2V5X1Byb2MocEFkLCAxLCBwQnVmKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfS2V5M19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlTaG93X1dlcEtleV9Qcm9jKHBBZCwgMiwgcEJ1Zik7Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0tleTRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0JU2hvd19XZXBLZXlfUHJvYyhwQWQsIDMsIHBCdWYpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19XUEFQU0tfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0JSU5UCWlkeDsKLQlVQ0hBUglQTUtbMzJdID0gezB9OwotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQlOZGlzTW92ZU1lbW9yeShQTUssIHBBZC0+U3RhQ2ZnLlBNSywgMzIpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0gICAgc3ByaW50ZihwQnVmLCAiXHRQTUsgPSAiKTsKLSAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IDMyOyBpZHgrKykKLSAgICAgICAgc3ByaW50ZihwQnVmK3N0cmxlbihwQnVmKSwgIiUwMlgiLCBQTUtbaWR4XSk7Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV9tYWNfcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fbWFjX3BjaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTE2MzYzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV9tYWNfcGNpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzU3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUFsbG9jYXRlIERNQSBtZW1vcnkgYmxvY2tzIGZvciBzZW5kLCByZWNlaXZlCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTkRJU19TVEFUVVNfU1VDQ0VTUwotCQlORElTX1NUQVRVU19GQUlMVVJFCi0JCU5ESVNfU1RBVFVTX1JFU09VUkNFUwotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTX1NUQVRVUwlSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlORElTX1NUQVRVUwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQlVTE9ORwkJCVJpbmdCYXNlUGFIaWdoOwotCVVMT05HCQkJUmluZ0Jhc2VQYUxvdzsKLQlQVk9JRAkJCVJpbmdCYXNlVmE7Ci0JSU5UCQkJCWluZGV4LCBudW07Ci0JUFRYRF9TVFJVQwkJcFR4RDsKLQlQUlhEX1NUUlVDCQlwUnhEOwotCVVMT05HCQkJRXJyb3JWYWx1ZSA9IDA7Ci0JUFJUTVBfVFhfUklORwlwVHhSaW5nOwotCVBSVE1QX0RNQUJVRglwRG1hQnVmOwotCVBORElTX1BBQ0tFVAlwUGFja2V0OwotLy8JUFJUTVBfUkVPUkRFUkJVRglwUmVvcmRlckJ1ZjsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeVxuIikpOwotCWRvCi0JewotCQkvLwotCQkvLyBBbGxvY2F0ZSBhbGwgcmluZyBkZXNjcmlwdG9ycywgaW5jbHVkZSBUeEQsIFJ4RCwgTWdtdEQuCi0JCS8vIEFsdGhvdWdoIGVhY2ggc2l6ZSBpcyBkaWZmZXJlbnQsIHRvIHByZXZlbnQgY2FjaGVsaW5lIGFuZCBhbGlnbm1lbnQKLQkJLy8gaXNzdWUsIEkgaW50ZW50aW9uYWwgc2V0IHRoZW0gYWxsIHRvIDY0IGJ5dGVzLgotCQkvLwotCQlmb3IgKG51bT0wOyBudW08TlVNX09GX1RYX1JJTkc7IG51bSsrKQotCQl7Ci0JCQlVTE9ORyAgQnVmQmFzZVBhSGlnaDsKLQkJCVVMT05HICBCdWZCYXNlUGFMb3c7Ci0JCQlQVk9JRCAgQnVmQmFzZVZhOwotCi0JCQkvLwotCQkJLy8gQWxsb2NhdGUgVHggcmluZyBkZXNjcmlwdG9yJ3MgbWVtb3J5ICg1IFRYIHJpbmdzID0gNCBBQ3MgKyAxIEhDQ0EpCi0JCQkvLwotCQkJcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NTaXplID0gVFhfUklOR19TSVpFICogVFhEX1NJWkU7Ci0JCQlSVE1QX0FsbG9jYXRlVHhEZXNjTWVtb3J5KAotCQkJCXBBZCwKLQkJCQludW0sCi0JCQkJcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NTaXplLAotCQkJCUZBTFNFLAotCQkJCSZwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhLAotCQkJCSZwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1BhKTsKLQotCQkJaWYgKHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEgPT0gTlVMTCkKLQkJCXsKLQkJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOwotCQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpKTsKLQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8vIFplcm8gaW5pdCB0aGlzIG1lbW9yeSBibG9jawotCQkJTmRpc1plcm9NZW1vcnkocEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NWYSwgcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NTaXplKTsKLQotCQkJLy8gU2F2ZSBQQSAmIFZBIGZvciBmdXJ0aGVyIG9wZXJhdGlvbgotCQkJUmluZ0Jhc2VQYUhpZ2ggPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2gocEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NQYSk7Ci0JCQlSaW5nQmFzZVBhTG93ICA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93IChwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1BhKTsKLQkJCVJpbmdCYXNlVmEgICAgID0gcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NWYTsKLQotCQkJLy8KLQkJCS8vIEFsbG9jYXRlIGFsbCAxc3QgVFhCdWYncyBtZW1vcnkgZm9yIHRoaXMgVHhSaW5nCi0JCQkvLwotCQkJcEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NTaXplID0gVFhfUklOR19TSVpFICogVFhfRE1BXzFTVF9CVUZGRVJfU0laRTsKLQkJCVJUTVBfQWxsb2NhdGVGaXJzdFR4QnVmZmVyKAotCQkJCXBBZCwKLQkJCQludW0sCi0JCQkJcEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NTaXplLAotCQkJCUZBTFNFLAotCQkJCSZwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1ZhLAotCQkJCSZwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1BhKTsKLQotCQkJaWYgKHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jVmEgPT0gTlVMTCkKLQkJCXsKLQkJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOwotCQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpKTsKLQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8vIFplcm8gaW5pdCB0aGlzIG1lbW9yeSBibG9jawotCQkJTmRpc1plcm9NZW1vcnkocEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NWYSwgcEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NTaXplKTsKLQotCQkJLy8gU2F2ZSBQQSAmIFZBIGZvciBmdXJ0aGVyIG9wZXJhdGlvbgotCQkJQnVmQmFzZVBhSGlnaCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1BhKTsKLQkJCUJ1ZkJhc2VQYUxvdyAgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyAocEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NQYSk7Ci0JCQlCdWZCYXNlVmEgICAgID0gcEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NWYTsKLQotCQkJLy8KLQkJCS8vIEluaXRpYWxpemUgVHggUmluZyBEZXNjcmlwdG9yIGFuZCBhc3NvY2lhdGVkIGJ1ZmZlciBtZW1vcnkKLQkJCS8vCi0JCQlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW251bV07Ci0JCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBUWF9SSU5HX1NJWkU7IGluZGV4KyspCi0JCQl7Ci0JCQkJcFR4UmluZy0+Q2VsbFtpbmRleF0ucE5kaXNQYWNrZXQgPSBOVUxMOwotCQkJCXBUeFJpbmctPkNlbGxbaW5kZXhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0JCQkJLy8gSW5pdCBUeCBSaW5nIFNpemUsIFZhLCBQYSB2YXJpYWJsZXMKLQkJCQlwVHhSaW5nLT5DZWxsW2luZGV4XS5BbGxvY1NpemUgPSBUWERfU0laRTsKLQkJCQlwVHhSaW5nLT5DZWxsW2luZGV4XS5BbGxvY1ZhID0gUmluZ0Jhc2VWYTsKLQkJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2gocFR4UmluZy0+Q2VsbFtpbmRleF0uQWxsb2NQYSwgUmluZ0Jhc2VQYUhpZ2gpOwotCQkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93IChwVHhSaW5nLT5DZWxsW2luZGV4XS5BbGxvY1BhLCBSaW5nQmFzZVBhTG93KTsKLQotCQkJCS8vIFNldHVwIFR4IEJ1ZmZlciBzaXplICYgYWRkcmVzcy4gb25seSA4MDIuMTEgaGVhZGVyIHdpbGwgc3RvcmUgaW4gdGhpcyBzcGFjZQotCQkJCXBEbWFCdWYgPSAmcFR4UmluZy0+Q2VsbFtpbmRleF0uRG1hQnVmOwotCQkJCXBEbWFCdWYtPkFsbG9jU2l6ZSA9IFRYX0RNQV8xU1RfQlVGRkVSX1NJWkU7Ci0JCQkJcERtYUJ1Zi0+QWxsb2NWYSA9IEJ1ZkJhc2VWYTsKLQkJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2gocERtYUJ1Zi0+QWxsb2NQYSwgQnVmQmFzZVBhSGlnaCk7Ci0JCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3cocERtYUJ1Zi0+QWxsb2NQYSwgQnVmQmFzZVBhTG93KTsKLQotCQkJCS8vIGxpbmsgdGhlIHByZS1hbGxvY2F0ZWQgVHhCdWYgdG8gVFhECi0JCQkJcFR4RCA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW2luZGV4XS5BbGxvY1ZhOwotCQkJCXBUeEQtPlNEUHRyMCA9IEJ1ZkJhc2VQYUxvdzsKLQkJCQkvLyBhZHZhbmNlIHRvIG5leHQgcmluZyBkZXNjcmlwdG9yIGFkZHJlc3MKLQkJCQlwVHhELT5ETUFET05FID0gMTsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0jZW5kaWYKLQkJCQlSaW5nQmFzZVBhTG93ICs9IFRYRF9TSVpFOwotCQkJCVJpbmdCYXNlVmEgPSAoUFVDSEFSKSBSaW5nQmFzZVZhICsgVFhEX1NJWkU7Ci0KLQkJCQkvLyBhZHZhbmNlIHRvIG5leHQgVHhCdWYgYWRkcmVzcwotCQkJCUJ1ZkJhc2VQYUxvdyArPSBUWF9ETUFfMVNUX0JVRkZFUl9TSVpFOwotCQkJCUJ1ZkJhc2VWYSA9IChQVUNIQVIpIEJ1ZkJhc2VWYSArIFRYX0RNQV8xU1RfQlVGRkVSX1NJWkU7Ci0JCQl9Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeFJpbmdbJWRdOiB0b3RhbCAlZCBlbnRyeSBhbGxvY2F0ZWRcbiIsIG51bSwgaW5kZXgpKTsKLQkJfQotCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1JFU09VUkNFUykKLQkJCWJyZWFrOwotCi0JCS8vCi0JCS8vIEFsbG9jYXRlIE1HTVQgcmluZyBkZXNjcmlwdG9yJ3MgbWVtb3J5IGV4Y2VwdCBUeCByaW5nIHdoaWNoIGFsbG9jYXRlZCBlYXJpbGVyCi0JCS8vCi0JCXBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSA9IE1HTVRfUklOR19TSVpFICogVFhEX1NJWkU7Ci0JCVJUTVBfQWxsb2NhdGVNZ210RGVzY01lbW9yeSgKLQkJCXBBZCwKLQkJCXBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSwKLQkJCUZBTFNFLAotCQkJJnBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsCi0JCQkmcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NQYSk7Ci0KLQkJaWYgKHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEgPT0gTlVMTCkKLQkJewotCQkJRXJyb3JWYWx1ZSA9IEVSUkxPR19PVVRfT0ZfU0hBUkVEX01FTU9SWTsKLQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpKTsKLQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrCi0JCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSk7Ci0KLQkJLy8gU2F2ZSBQQSAmIFZBIGZvciBmdXJ0aGVyIG9wZXJhdGlvbgotCQlSaW5nQmFzZVBhSGlnaCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1BhKTsKLQkJUmluZ0Jhc2VQYUxvdyAgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyAocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NQYSk7Ci0JCVJpbmdCYXNlVmEgICAgID0gcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYTsKLQotCQkvLwotCQkvLyBJbml0aWFsaXplIE1HTVQgUmluZyBhbmQgYXNzb2NpYXRlZCBidWZmZXIgbWVtb3J5Ci0JCS8vCi0JCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1HTVRfUklOR19TSVpFOyBpbmRleCsrKQotCQl7Ci0JCQlwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0ID0gTlVMTDsKLQkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLQkJCS8vIEluaXQgTUdNVCBSaW5nIFNpemUsIFZhLCBQYSB2YXJpYWJsZXMKLQkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NTaXplID0gVFhEX1NJWkU7Ci0JCQlwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLkFsbG9jVmEgPSBSaW5nQmFzZVZhOwotCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NQYSwgUmluZ0Jhc2VQYUhpZ2gpOwotCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3cgKHBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NQYSwgUmluZ0Jhc2VQYUxvdyk7Ci0KLQkJCS8vIE9mZnNldCB0byBuZXh0IHJpbmcgZGVzY3JpcHRvciBhZGRyZXNzCi0JCQlSaW5nQmFzZVBhTG93ICs9IFRYRF9TSVpFOwotCQkJUmluZ0Jhc2VWYSA9IChQVUNIQVIpIFJpbmdCYXNlVmEgKyBUWERfU0laRTsKLQotCQkJLy8gbGluayB0aGUgcHJlLWFsbG9jYXRlZCBUeEJ1ZiB0byBUWEQKLQkJCXBUeEQgPSAoUFRYRF9TVFJVQykgcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5BbGxvY1ZhOwotCQkJcFR4RC0+RE1BRE9ORSA9IDE7Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLSNlbmRpZgotCQkJLy8gbm8gcHJlLWFsbG9jYXRlZCBidWZmZXIgcmVxdWlyZWQgaW4gTWdtdFJpbmcgZm9yIHNjYXR0ZXItZ2F0aGVyIGNhc2UKLQkJfQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNR01UIFJpbmc6IHRvdGFsICVkIGVudHJ5IGFsbG9jYXRlZFxuIiwgaW5kZXgpKTsKLQotCQkvLwotCQkvLyBBbGxvY2F0ZSBSWCByaW5nIGRlc2NyaXB0b3IncyBtZW1vcnkgZXhjZXB0IFR4IHJpbmcgd2hpY2ggYWxsb2NhdGVkIGVhcmlsZXIKLQkJLy8KLQkJcEFkLT5SeERlc2NSaW5nLkFsbG9jU2l6ZSA9IFJYX1JJTkdfU0laRSAqIFJYRF9TSVpFOwotCQlSVE1QX0FsbG9jYXRlUnhEZXNjTWVtb3J5KAotCQkJcEFkLAotCQkJcEFkLT5SeERlc2NSaW5nLkFsbG9jU2l6ZSwKLQkJCUZBTFNFLAotCQkJJnBBZC0+UnhEZXNjUmluZy5BbGxvY1ZhLAotCQkJJnBBZC0+UnhEZXNjUmluZy5BbGxvY1BhKTsKLQotCQlpZiAocEFkLT5SeERlc2NSaW5nLkFsbG9jVmEgPT0gTlVMTCkKLQkJewotCQkJRXJyb3JWYWx1ZSA9IEVSUkxPR19PVVRfT0ZfU0hBUkVEX01FTU9SWTsKLQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpKTsKLQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrCi0JCU5kaXNaZXJvTWVtb3J5KHBBZC0+UnhEZXNjUmluZy5BbGxvY1ZhLCBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NTaXplKTsKLQotCi0JCURCR1BSSU5UKFJUX0RFQlVHX09GRiwKLQkJCQkJKCJSWCBERVNDICVwICBzaXplID0gJWxkXG4iLCBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5SeERlc2NSaW5nLkFsbG9jU2l6ZSkpOwotCi0JCS8vIFNhdmUgUEEgJiBWQSBmb3IgZnVydGhlciBvcGVyYXRpb24KLQkJUmluZ0Jhc2VQYUhpZ2ggPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2gocEFkLT5SeERlc2NSaW5nLkFsbG9jUGEpOwotCQlSaW5nQmFzZVBhTG93ICA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93IChwQWQtPlJ4RGVzY1JpbmcuQWxsb2NQYSk7Ci0JCVJpbmdCYXNlVmEgICAgID0gcEFkLT5SeERlc2NSaW5nLkFsbG9jVmE7Ci0KLQkJLy8KLQkJLy8gSW5pdGlhbGl6ZSBSeCBSaW5nIGFuZCBhc3NvY2lhdGVkIGJ1ZmZlciBtZW1vcnkKLQkJLy8KLQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgUlhfUklOR19TSVpFOyBpbmRleCsrKQotCQl7Ci0JCQkvLyBJbml0IFJYIFJpbmcgU2l6ZSwgVmEsIFBhIHZhcmlhYmxlcwotCQkJcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NTaXplID0gUlhEX1NJWkU7Ci0JCQlwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5BbGxvY1ZhID0gUmluZ0Jhc2VWYTsKLQkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5BbGxvY1BhLCBSaW5nQmFzZVBhSGlnaCk7Ci0JCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyAocEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NQYSwgUmluZ0Jhc2VQYUxvdyk7Ci0KLQkJCS8vTmRpc1plcm9NZW1vcnkoUmluZ0Jhc2VWYSwgUlhEX1NJWkUpOwotCi0JCQkvLyBPZmZzZXQgdG8gbmV4dCByaW5nIGRlc2NyaXB0b3IgYWRkcmVzcwotCQkJUmluZ0Jhc2VQYUxvdyArPSBSWERfU0laRTsKLQkJCVJpbmdCYXNlVmEgPSAoUFVDSEFSKSBSaW5nQmFzZVZhICsgUlhEX1NJWkU7Ci0KLQkJCS8vIFNldHVwIFJ4IGFzc29jaWF0ZWQgQnVmZmVyIHNpemUgJiBhbGxvY2F0ZSBzaGFyZSBtZW1vcnkKLQkJCXBEbWFCdWYgPSAmcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uRG1hQnVmOwotCQkJcERtYUJ1Zi0+QWxsb2NTaXplID0gUlhfQlVGRkVSX0FHR1JFU0laRTsKLQkJCXBQYWNrZXQgPSBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIoCi0JCQkJcEFkLAotCQkJCXBEbWFCdWYtPkFsbG9jU2l6ZSwKLQkJCQlGQUxTRSwKLQkJCQkmcERtYUJ1Zi0+QWxsb2NWYSwKLQkJCQkmcERtYUJ1Zi0+QWxsb2NQYSk7Ci0KLQkJCS8qIGtlZXAgYWxsb2NhdGVkIHJ4IHBhY2tldCAqLwotCQkJcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQgPSBwUGFja2V0OwotCi0JCQkvLyBFcnJvciBoYW5kbGluZwotCQkJaWYgKHBEbWFCdWYtPkFsbG9jVmEgPT0gTlVMTCkKLQkJCXsKLQkJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOwotCQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBSeFJpbmcncyAxc3QgYnVmZmVyXG4iKSk7Ci0JCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvLyBaZXJvIGluaXQgdGhpcyBtZW1vcnkgYmxvY2sKLQkJCU5kaXNaZXJvTWVtb3J5KHBEbWFCdWYtPkFsbG9jVmEsIHBEbWFCdWYtPkFsbG9jU2l6ZSk7Ci0KLQkJCS8vIFdyaXRlIFJ4RCBidWZmZXIgYWRkcmVzcyAmIGFsbG9jYXRlZCBidWZmZXIgbGVuZ3RoCi0JCQlwUnhEID0gKFBSWERfU1RSVUMpIHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkFsbG9jVmE7Ci0JCQlwUnhELT5TRFAwID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocERtYUJ1Zi0+QWxsb2NQYSk7Ci0JCQlwUnhELT5ERE9ORSA9IDA7Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBSeEQsIFRZUEVfUlhEKTsKLSNlbmRpZgotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUnggUmluZzogdG90YWwgJWQgZW50cnkgYWxsb2NhdGVkXG4iLCBpbmRleCkpOwotCi0JfQl3aGlsZSAoRkFMU0UpOwotCi0KLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5GcmFnRnJhbWUsIHNpemVvZihGUkFHTUVOVF9GUkFNRSkpOwotCXBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0ID0gIFJUTVBfQWxsb2NhdGVGcmFnUGFja2V0QnVmZmVyKHBBZCwgUlhfQlVGRkVSX05PUk1TSVpFKTsKLQotCWlmIChwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCA9PSBOVUxMKQotCXsKLQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwotCX0KLQotCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCS8vIExvZyBlcnJvciBpbmZvcmFtdGlvbgotCQlOZGlzV3JpdGVFcnJvckxvZ0VudHJ5KAotCQkJcEFkLT5BZGFwdGVySGFuZGxlLAotCQkJTkRJU19FUlJPUl9DT0RFX09VVF9PRl9SRVNPVVJDRVMsCi0JCQkxLAotCQkJRXJyb3JWYWx1ZSk7Ci0JfQotCi0JLy8gRm9sbG93aW5nIGNvZGUgc2VnbWVudCBnZXQgZnJvbSBvcmlnaW5hbCBmdW5jOk5JQ0luaXRUeFJ4UmluZ0FuZEJhY2tsb2dRdWV1ZSgpLCBub3cgc2hvdWxkIGludGVncmF0ZSBpdCB0byBoZXJlLgotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ0luaXRUeFJ4UmluZ0FuZEJhY2tsb2dRdWV1ZVxuIikpOwotCi0vKgotCQkvLyBEaXNhYmxlIERNQS4KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOwotCQlHbG9DZmcud29yZCAmPSAweGZmMDsKLQkJR2xvQ2ZnLmZpZWxkLkVuVFhXcml0ZUJhY2tERE9ORSA9MTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOwotKi8KLQotCQkvLyBJbml0aWFsaXplIGFsbCB0cmFuc21pdCByZWxhdGVkIHNvZnR3YXJlIHF1ZXVlcwotCQlmb3IoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl9UWF9SSU5HOyBpbmRleCsrKQotCQl7Ci0JCQlJbml0aWFsaXplUXVldWVIZWFkZXIoJnBBZC0+VHhTd1F1ZXVlW2luZGV4XSk7Ci0JCQkvLyBJbml0IFRYIHJpbmdzIGluZGV4IHBvaW50ZXIKLQkJCXBBZC0+VHhSaW5nW2luZGV4XS5UeFN3RnJlZUlkeCA9IDA7Ci0JCQlwQWQtPlR4UmluZ1tpbmRleF0uVHhDcHVJZHggPSAwOwotCQkJLy9SVE1QX0lPX1dSSVRFMzIocEFkLCAoVFhfQ1RYX0lEWDAgKyBpICogMHgxMCkgLCAgcEFkLT5UeFJpbmdbaV0uVFhfQ1RYX0lEWCk7Ci0JCX0KLQotCQkvLyBJbml0IFJYIFJpbmcgaW5kZXggcG9pbnRlcgotCQlwQWQtPlJ4UmluZy5SeFN3UmVhZElkeCA9IDA7Ci0JCXBBZC0+UnhSaW5nLlJ4Q3B1SWR4ID0gUlhfUklOR19TSVpFIC0gMTsKLQkJLy9SVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9DUlhfSURYLCBwQWQtPlJ4UmluZy5SWF9DUlhfSURYMCk7Ci0KLQotCQkvLyBpbml0IE1HTVQgcmluZyBpbmRleCBwb2ludGVyCi0JCXBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPSAwOwotCQlwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4ID0gMDsKLQotCQlwQWQtPlByaXZhdGVJbmZvLlR4UmluZ0Z1bGxDbnQgPSAwOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJbml0VHhSeFJpbmdBbmRCYWNrbG9nUXVldWVcbiIpKTsKLQl9Ci0KLQlEQkdQUklOVF9TKFN0YXR1cywgKCI8LS0gUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnksIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7Ci0JcmV0dXJuIFN0YXR1czsKLX0KLQotCi0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVJlc2V0IE5JQyBBc2ljcy4gQ2FsbCBhZnRlciByZXN0IERNQS4gU28gcmVzZXQgVFhfQ1RYX0lEWCB0byB6ZXJvLgotCi0JQXJndW1lbnRzOgotCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQkJUmVzZXQgTklDIHRvIGluaXRpYWwgc3RhdGUgQVMgSVMgc3lzdGVtIGJvb3QgdXAgdGltZS4KLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUFJpbmdDbGVhblVwKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJUmluZ1R5cGUpCi17Ci0JUFRYRF9TVFJVQwkJcFR4RDsKLQlQUlhEX1NUUlVDCQlwUnhEOwotCVBRVUVVRV9FTlRSWQlwRW50cnk7Ci0JUE5ESVNfUEFDS0VUCXBQYWNrZXQ7Ci0JaW50CQkJCWk7Ci0JUFJUTVBfVFhfUklORwlwVHhSaW5nOwotCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7Ci0JLy9VSU5UMzIJCQlSeFN3UmVhZElkeDsKLQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVE1QUmluZ0NsZWFuVXAoUmluZ0lkeD0lZCwgUGVuZGluZy1ORElTPSVsZClcbiIsIFJpbmdUeXBlLCBwQWQtPlJhbGlua0NvdW50ZXJzLlBlbmRpbmdOZGlzUGFja2V0Q291bnQpKTsKLQlzd2l0Y2ggKFJpbmdUeXBlKQotCXsKLQkJY2FzZSBRSURfQUNfQks6Ci0JCWNhc2UgUUlEX0FDX0JFOgotCQljYXNlIFFJRF9BQ19WSToKLQkJY2FzZSBRSURfQUNfVk86Ci0JCS8qY2FzZSBRSURfSENDQToqLwotCi0JCQlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1JpbmdUeXBlXTsKLQotCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwotCQkJLy8gV2UgaGF2ZSB0byBjbGVhbiBhbGwgZGVzY3JpcHRvcnMgaW4gY2FzZSBzb21lIGVycm9yIGhhcHBlbmVkIHdpdGggcmVzZXQKLQkJCWZvciAoaT0wOyBpPFRYX1JJTkdfU0laRTsgaSsrKSAvLyBXZSBoYXZlIHRvIHNjYW4gYWxsIFRYIHJpbmcKLQkJCXsKLQkJCQlwVHhEICA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW2ldLkFsbG9jVmE7Ci0KLQkJCQlwUGFja2V0ID0gKFBORElTX1BBQ0tFVCkgcFR4UmluZy0+Q2VsbFtpXS5wTmRpc1BhY2tldDsKLQkJCQkvLyByZWxlYXNlIHNjYXR0ZXItYW5kLWdhdGhlciBORElTX1BBQ0tFVAotCQkJCWlmIChwUGFja2V0KQotCQkJCXsKLQkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJCQlwVHhSaW5nLT5DZWxsW2ldLnBOZGlzUGFja2V0ID0gTlVMTDsKLQkJCQl9Ci0KLQkJCQlwUGFja2V0ID0gKFBORElTX1BBQ0tFVCkgcFR4UmluZy0+Q2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQ7Ci0JCQkJLy8gcmVsZWFzZSBzY2F0dGVyLWFuZC1nYXRoZXIgTkRJU19QQUNLRVQKLQkJCQlpZiAocFBhY2tldCkKLQkJCQl7Ci0JCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCQkJcFR4UmluZy0+Q2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCQkJCX0KLQkJCX0KLQotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMCArIFJpbmdUeXBlICogMHgxMCwgJnBUeFJpbmctPlR4RG1hSWR4KTsKLQkJCXBUeFJpbmctPlR4U3dGcmVlSWR4ID0gcFR4UmluZy0+VHhEbWFJZHg7Ci0JCQlwVHhSaW5nLT5UeENwdUlkeCA9IHBUeFJpbmctPlR4RG1hSWR4OwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ1RYX0lEWDAgKyBSaW5nVHlwZSAqIDB4MTAsIHBUeFJpbmctPlR4Q3B1SWR4KTsKLQotCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7Ci0KLQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLQkJCXdoaWxlIChwQWQtPlR4U3dRdWV1ZVtSaW5nVHlwZV0uSGVhZCAhPSBOVUxMKQotCQkJewotCQkJCXBFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcEFkLT5UeFN3UXVldWVbUmluZ1R5cGVdKTsKLQkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBFbnRyeSk7Ci0JCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUmVsZWFzZSAxIE5ESVMgcGFja2V0IGZyb20gcy93IGJhY2tsb2cgcXVldWVcbiIpKTsKLQkJCX0KLQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBRSURfTUdNVDoKLQkJCS8vIFdlIGhhdmUgdG8gY2xlYW4gYWxsIGRlc2NyaXB0b3JzIGluIGNhc2Ugc29tZSBlcnJvciBoYXBwZW5lZCB3aXRoIHJlc2V0Ci0JCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1nbXRSaW5nTG9jayk7Ci0KLQkJCWZvciAoaT0wOyBpPE1HTVRfUklOR19TSVpFOyBpKyspCi0JCQl7Ci0JCQkJcFR4RCAgPSAoUFRYRF9TVFJVQykgcEFkLT5NZ210UmluZy5DZWxsW2ldLkFsbG9jVmE7Ci0KLQkJCQlwUGFja2V0ID0gKFBORElTX1BBQ0tFVCkgcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZGlzUGFja2V0OwotCQkJCS8vIHJsZWFzZSBzY2F0dGVyLWFuZC1nYXRoZXIgTkRJU19QQUNLRVQKLQkJCQlpZiAocFBhY2tldCkKLQkJCQl7Ci0JCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCQl9Ci0JCQkJcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZGlzUGFja2V0ID0gTlVMTDsKLQotCQkJCXBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUKSBwQWQtPk1nbXRSaW5nLkNlbGxbaV0ucE5leHROZGlzUGFja2V0OwotCQkJCS8vIHJlbGVhc2Ugc2NhdHRlci1hbmQtZ2F0aGVyIE5ESVNfUEFDS0VUCi0JCQkJaWYgKHBQYWNrZXQpCi0JCQkJewotCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQl9Ci0JCQkJcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0KLQkJCX0KLQotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9NR01URFRYX0lEWCwgJnBBZC0+TWdtdFJpbmcuVHhEbWFJZHgpOwotCQkJcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA9IHBBZC0+TWdtdFJpbmcuVHhEbWFJZHg7Ci0JCQlwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4ID0gcEFkLT5NZ210UmluZy5UeERtYUlkeDsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01HTVRDVFhfSURYLCBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4KTsKLQotCQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOwotCQkJcEFkLT5SYWxpbmtDb3VudGVycy5NZ210UmluZ0Z1bGxDb3VudCA9IDA7Ci0JCQlicmVhazsKLQotCQljYXNlIFFJRF9SWDoKLQkJCS8vIFdlIGhhdmUgdG8gY2xlYW4gYWxsIGRlc2NyaXB0b3JzIGluIGNhc2Ugc29tZSBlcnJvciBoYXBwZW5lZCB3aXRoIHJlc2V0Ci0JCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPlJ4UmluZ0xvY2spOwotCi0JCQlmb3IgKGk9MDsgaTxSWF9SSU5HX1NJWkU7IGkrKykKLQkJCXsKLQkJCQlwUnhEICA9IChQUlhEX1NUUlVDKSBwQWQtPlJ4UmluZy5DZWxsW2ldLkFsbG9jVmE7Ci0gICAgICAgICAgICAgICAgcFJ4RC0+RERPTkUgPSAwIDsKLQkJCX0KLQotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9EUlhfSURYLCAmcEFkLT5SeFJpbmcuUnhEbWFJZHgpOwotCQkJcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPSBwQWQtPlJ4UmluZy5SeERtYUlkeDsKLQkJCXBBZC0+UnhSaW5nLlJ4Q3B1SWR4ID0gKChwQWQtPlJ4UmluZy5SeERtYUlkeCA9PSAwKSA/IChSWF9SSU5HX1NJWkUtMSkgOiAocEFkLT5SeFJpbmcuUnhEbWFJZHgtMSkpOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfQ1JYX0lEWCwgcEFkLT5SeFJpbmcuUnhDcHVJZHgpOwotCi0JCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPlJ4UmluZ0xvY2spOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCX0KLX0KLQotCi1WT0lEIFJUTVBGcmVlVHhSeFJpbmdNZW1vcnkoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCi17Ci0JaW50IGluZGV4LCBudW0gLCBqOwotCVBSVE1QX1RYX1JJTkcgcFR4UmluZzsKLQlQVFhEX1NUUlVDCSAgcFR4RDsKLQlQTkRJU19QQUNLRVQgIHBQYWNrZXQ7Ci0JdW5zaWduZWQgaW50ICBJcnFGbGFnczsKLQotCS8vUE9TX0NPT0tJRSBwT2JqID0oUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gUlRNUEZyZWVUeFJ4UmluZ01lbW9yeVxuIikpOwotCi0JLy8gRnJlZSBUeFN3UXVldWUgUGFja2V0Ci0JZm9yIChpbmRleD0wOyBpbmRleCA8TlVNX09GX1RYX1JJTkc7IGluZGV4KyspCi0JewotCQlQUVVFVUVfRU5UUlkgcEVudHJ5OwotCQlQTkRJU19QQUNLRVQgcFBhY2tldDsKLQkJUFFVRVVFX0hFQURFUiAgIHBRdWV1ZTsKLQotCQlSVE1QX0lSUV9MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7Ci0JCXBRdWV1ZSA9ICZwQWQtPlR4U3dRdWV1ZVtpbmRleF07Ci0JCXdoaWxlIChwUXVldWUtPkhlYWQpCi0JCXsKLQkJCXBFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZShwUXVldWUpOwotCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwRW50cnkpOwotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQl9Ci0JCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwotCX0KLQotCS8vIEZyZWUgVHggUmluZyBQYWNrZXQKLQlmb3IgKGluZGV4PTA7aW5kZXg8IE5VTV9PRl9UWF9SSU5HO2luZGV4KyspCi0JewotCQlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW2luZGV4XTsKLQotCQlmb3IgKGo9MDsgajwgVFhfUklOR19TSVpFOyBqKyspCi0JCXsKLQkJCXBUeEQgPSAoUFRYRF9TVFJVQykgKHBUeFJpbmctPkNlbGxbal0uQWxsb2NWYSk7Ci0JCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtqXS5wTmRpc1BhY2tldDsKLQotCQkJaWYgKHBQYWNrZXQpCi0JCQl7Ci0JCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMCwgcFR4RC0+U0RMZW4wLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCQl9Ci0JCQkvL0Fsd2F5cyBhc3NpZ24gcE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgotCQkJcFR4UmluZy0+Q2VsbFtqXS5wTmRpc1BhY2tldCA9IE5VTEw7Ci0KLQkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW2pdLnBOZXh0TmRpc1BhY2tldDsKLQotCQkJaWYgKHBQYWNrZXQpCi0JCQl7Ci0JCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgcFR4RC0+U0RMZW4xLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCQl9Ci0JCQkvL0Fsd2F5cyBhc3NpZ24gcE5leHROZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKLQkJCXBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0KLQkJfQotCX0KLQotCWZvciAoaW5kZXggPSBSWF9SSU5HX1NJWkUgLSAxIDsgaW5kZXggPj0gMDsgaW5kZXgtLSkKLQl7Ci0JCWlmICgocEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uRG1hQnVmLkFsbG9jVmEpICYmIChwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5wTmRpc1BhY2tldCkpCi0JCXsKLQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5EbWFCdWYuQWxsb2NQYSwgcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uRG1hQnVmLkFsbG9jU2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5wTmRpc1BhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCX0KLQl9Ci0JTmRpc1plcm9NZW1vcnkocEFkLT5SeFJpbmcuQ2VsbCwgUlhfUklOR19TSVpFICogc2l6ZW9mKFJUTVBfRE1BQ0IpKTsKLQotCWlmIChwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSkKLSAgICB7Ci0JCVJUTVBfRnJlZURlc2NNZW1vcnkocEFkLCBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NTaXplLCBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5SeERlc2NSaW5nLkFsbG9jUGEpOwotICAgIH0KLSAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5SeERlc2NSaW5nLCBzaXplb2YoUlRNUF9ETUFCVUYpKTsKLQotCWlmIChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhKQotCXsKLQkJUlRNUF9GcmVlRGVzY01lbW9yeShwQWQsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSwgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NQYSk7Ci0JfQotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1nbXREZXNjUmluZywgc2l6ZW9mKFJUTVBfRE1BQlVGKSk7Ci0KLQlmb3IgKG51bSA9IDA7IG51bSA8IE5VTV9PRl9UWF9SSU5HOyBudW0rKykKLQl7Ci0JaWYgKHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jVmEpCi0JCXsKLQkJCVJUTVBfRnJlZUZpcnN0VHhCdWZmZXIocEFkLCBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1NpemUsIEZBTFNFLCBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1ZhLCBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1BhKTsKLQkgICAgfQotCSAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5UeEJ1ZlNwYWNlW251bV0sIHNpemVvZihSVE1QX0RNQUJVRikpOwotCi0JaWYgKHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEpCi0JCXsKLQkJCVJUTVBfRnJlZURlc2NNZW1vcnkocEFkLCBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1NpemUsIHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEsIHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jUGEpOwotCSAgICB9Ci0JICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlR4RGVzY1JpbmdbbnVtXSwgc2l6ZW9mKFJUTVBfRE1BQlVGKSk7Ci0JfQotCi0JaWYgKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0KQotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIFJUTVBGcmVlVHhSeFJpbmdNZW1vcnlcbiIpKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKglyZWdpc3RlciByZWxhdGVkIHByb2NlZHVyZXMuCi0gICoKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIERpc2FibGUgRE1BLgotCi1Bcmd1bWVudHM6Ci0JKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCi0KLVJldHVybiBWYWx1ZToKLQlOb25lCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUMjhYWERNQURpc2FibGUoCi0JSU4gUlRNUF9BREFQVEVSCQkJKnBBZCkKLXsKLQlXUERNQV9HTE9fQ0ZHX1NUUlVDICAgICBHbG9DZmc7Ci0KLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKLQlHbG9DZmcud29yZCAmPSAweGZmMDsKLQlHbG9DZmcuZmllbGQuRW5UWFdyaXRlQmFja0RET05FID0xOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEVuYWJsZSBETUEuCi0KLUFyZ3VtZW50czoKLQkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlQyOFhYRE1BRW5hYmxlKAotCUlOIFJUTVBfQURBUFRFUgkJCSpwQWQpCi17Ci0JV1BETUFfR0xPX0NGR19TVFJVQwlHbG9DZmc7Ci0JaW50IGkgPSAwOwotCi0JUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDQpOwotCWRvCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7Ci0JCWlmICgoR2xvQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKSAgJiYgKEdsb0NmZy5maWVsZC5SeERNQUJ1c3kgPT0gMCkpCi0JCQlicmVhazsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gIERNQUJ1c3lcbiIpKTsKLQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQkJaSsrOwotCX13aGlsZSAoIGkgPDIwMCk7Ci0KLQlSVE1QdXNlY0RlbGF5KDUwKTsKLQotCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPSAxOwotCUdsb0NmZy5maWVsZC5XUERNQUJ1cnN0U0laRSA9IDI7Ci0JR2xvQ2ZnLmZpZWxkLkVuYWJsZVJ4RE1BID0gMTsKLQlHbG9DZmcuZmllbGQuRW5hYmxlVHhETUEgPSAxOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IFdSSVRFIERNQSBvZmZzZXQgMHgyMDggPSAweCV4XG4iLCBHbG9DZmcud29yZCkpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKLQotfQotCi0KLUJPT0xFQU4gQXNpY0NoZWNrQ29tbWFuT2soCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIJCSBDb21tYW5kKQotewotCVVJTlQzMglDbWRTdGF0dXMgPSAwLCBDSUQgPSAwLCBpOwotCVVJTlQzMglUaGlzQ0lETWFzayA9IDA7Ci0KLQlpID0gMDsKLQlkbwotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBIMk1fTUFJTEJPWF9DSUQsICZDSUQpOwotCQkvLyBGaW5kIHdoZXJlIHRoZSBjb21tYW5kIGlzLiBCZWNhdXNlIHRoaXMgaXMgcmFuZG9tbHkgc3BlY2lmaWVkIGJ5IGZpcm13YXJlLgotCQlpZiAoKENJRCAmIENJRDBNQVNLKSA9PSBDb21tYW5kKQotCQl7Ci0JCQlUaGlzQ0lETWFzayA9IENJRDBNQVNLOwotCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZSBpZiAoKCgoQ0lEICYgQ0lEMU1BU0spPj44KSAmIDB4ZmYpID09IENvbW1hbmQpCi0JCXsKLQkJCVRoaXNDSURNYXNrID0gQ0lEMU1BU0s7Ci0JCQlicmVhazsKLQkJfQotCQllbHNlIGlmICgoKChDSUQgJiBDSUQyTUFTSyk+PjE2KSAmIDB4ZmYpID09IENvbW1hbmQpCi0JCXsKLQkJCVRoaXNDSURNYXNrID0gQ0lEMk1BU0s7Ci0JCQlicmVhazsKLQkJfQotCQllbHNlIGlmICgoKChDSUQgJiBDSUQzTUFTSyk+PjI0KSAmIDB4ZmYpID09IENvbW1hbmQpCi0JCXsKLQkJCVRoaXNDSURNYXNrID0gQ0lEM01BU0s7Ci0JCQlicmVhazsKLQkJfQotCi0JCVJUTVB1c2VjRGVsYXkoMTAwKTsKLQkJaSsrOwotCX13aGlsZSAoaSA8IDIwMCk7Ci0KLQkvLyBHZXQgQ29tbWFuZFN0YXR1cyBWYWx1ZQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgSDJNX01BSUxCT1hfU1RBVFVTLCAmQ21kU3RhdHVzKTsKLQotCS8vIFRoaXMgY29tbWFuZCdzIHN0YXR1cyBpcyBhdCB0aGUgc2FtZSBwb3NpdGlvbiBhcyBjb21tYW5kLiBTbyBBTkQgY29tbWFuZCBwb3NpdGlvbidzIGJpdG1hc2sgdG8gcmVhZCBzdGF0dXMuCi0JaWYgKGkgPCAyMDApCi0JewotCQkvLyBJZiBTdGF0dXMgaXMgMSwgdGhlIGNvbWFtbmQgaXMgc3VjY2Vzcy4KLQkJaWYgKCgoQ21kU3RhdHVzICYgVGhpc0NJRE1hc2spID09IDB4MSkgfHwgKChDbWRTdGF0dXMgJiBUaGlzQ0lETWFzaykgPT0gMHgxMDApCi0JCQl8fCAoKENtZFN0YXR1cyAmIFRoaXNDSURNYXNrKSA9PSAweDEwMDAwKSB8fCAoKENtZFN0YXR1cyAmIFRoaXNDSURNYXNrKSA9PSAweDEwMDAwMDApKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gQXNpY0NoZWNrQ29tbWFuT2sgQ0lEID0gMHgleCwgQ21kU3RhdHVzPSAweCV4IFxuIiwgQ0lELCBDbWRTdGF0dXMpKTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX1NUQVRVUywgMHhmZmZmZmZmZik7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DSUQsIDB4ZmZmZmZmZmYpOwotCQkJcmV0dXJuIFRSVUU7Ci0JCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEFzaWNDaGVja0NvbW1hbkZhaWwxIENJRCA9IDB4JXgsIENtZFN0YXR1cz0gMHgleCBcbiIsIENJRCwgQ21kU3RhdHVzKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBBc2ljQ2hlY2tDb21tYW5GYWlsMiBUaW1lb3V0IENvbW1hbmQgPSAlZCwgQ21kU3RhdHVzPSAweCV4IFxuIiwgQ29tbWFuZCwgQ21kU3RhdHVzKSk7Ci0JfQotCS8vIENsZWFyIENvbW1hbmQgYW5kIFN0YXR1cy4KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9TVEFUVVMsIDB4ZmZmZmZmZmYpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX0NJRCwgMHhmZmZmZmZmZik7Ci0KLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBXcml0ZSBCZWFjb24gYnVmZmVyIHRvIEFzaWMuCi0KLUFyZ3VtZW50czoKLQkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlQyOHh4X1VwZGF0ZUJlYWNvblRvQXNpYygKLQlJTiBSVE1QX0FEQVBURVIJCSpwQWQsCi0JSU4gSU5UCQkJCWFwaWR4LAotCUlOIFVMT05HCQkJRnJhbWVMZW4sCi0JSU4gVUxPTkcJCQlVcGRhdGVQb3MpCi17Ci0JVUxPTkcJCQkJQ2FwSW5mb1BvcyA9IDA7Ci0JVUNIQVIJCQkqcHRyLCAqcHRyX3VwZGF0ZSwgKnB0cl9jYXBpbmZvOwotCVVJTlQJCQlpOwotCUJPT0xFQU4JCQliQmNuUmVxID0gRkFMU0U7Ci0JVUNIQVIJCQliY25faWR4ID0gMDsKLQotCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcygpIDogTm8gdmFsaWQgSW50ZXJmYWNlIGJlIGZvdW5kLlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvL2lmICgocEFkLT5XZHNUYWIuTW9kZSA9PSBXRFNfQlJJREdFX01PREUpCi0JLy8JfHwgKChwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uTVNTSUREZXYgPT0gTlVMTCkKLQkvLwkJfHwgIShwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uTVNTSUREZXYtPmZsYWdzICYgSUZGX1VQKSkKLQkvLwkpCi0JaWYgKGJCY25SZXEgPT0gRkFMU0UpCi0JewotCQkvKiB3aGVuIHRoZSByYSBpbnRlcmZhY2UgaXMgZG93biwgZG8gbm90IHNlbmQgaXRzIGJlYWNvbiBmcmFtZSAqLwotCQkvKiBjbGVhciBhbGwgemVybyAqLwotCQlmb3IoaT0wOyBpPFRYV0lfU0laRTsgaSs9NCkKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgaSwgMHgwMCk7Ci0JfQotCWVsc2UKLQl7Ci0JCXB0ciA9IChQVUNIQVIpJnBBZC0+QmVhY29uVHhXSTsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCVJUTVBXSUVuZGlhbkNoYW5nZShwdHIsIFRZUEVfVFhXSSk7Ci0jZW5kaWYKLQkJZm9yIChpPTA7IGk8VFhXSV9TSVpFOyBpKz00KSAgLy8gMTYtYnl0ZSBUWFdJIGZpZWxkCi0JCXsKLQkJCVVJTlQzMiBsb25ncHRyID0gICpwdHIgKyAoKihwdHIrMSk8PDgpICsgKCoocHRyKzIpPDwxNikgKyAoKihwdHIrMyk8PDI0KTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgaSwgbG9uZ3B0cik7Ci0JCQlwdHIgKz0gNDsKLQkJfQotCi0JCS8vIFVwZGF0ZSBDYXBhYmlsaXR5SW5mbyBpbiBCZWFjb24KLQkJZm9yIChpID0gQ2FwSW5mb1BvczsgaSA8IChDYXBJbmZvUG9zKzIpOyBpKyspCi0JCXsKLQkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYmNuX2lkeF0gKyBUWFdJX1NJWkUgKyBpLCAqcHRyX2NhcGluZm8pOwotCQkJcHRyX2NhcGluZm8gKys7Ci0JCX0KLQotCQlpZiAoRnJhbWVMZW4gPiBVcGRhdGVQb3MpCi0JCXsKLQkJCWZvciAoaT0gVXBkYXRlUG9zOyBpPCAoRnJhbWVMZW4pOyBpKyspCi0JCQl7Ci0JCQkJUlRNUF9JT19XUklURTgocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIFRYV0lfU0laRSArIGksICpwdHJfdXBkYXRlKTsKLQkJCQlwdHJfdXBkYXRlICsrOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1WT0lEIFJUMjh4eFBjaVN0YUFzaWNGb3JjZVdha2V1cCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBCT09MRUFOICAgICAgIGJGcm9tVHgpCi17Ci0gICAgQVVUT19XQUtFVVBfU1RSVUMJQXV0b1dha2V1cENmZzsKLQotICAgIGlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV0FLRVVQX05PVykpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3YWtpbmcgdXAgbm93IVxuIikpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dBS0VVUF9OT1cpOwotCi0gICAgUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19HT19UT19TTEVFUF9OT1cpOwotCi0gICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpCi0JCSYmcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpCi0gICAgewotICAgICAgICAvLyBTdXBwb3J0IFBDSWUgQWR2YW5jZSBQb3dlciBTYXZlCi0JaWYgKGJGcm9tVHggPT0gVFJVRQotCQkJJiYocEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPT0gVFJVRSkpCi0JewotICAgICAgICAgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKLQkJUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsIFJFU1RPUkVfV0FLRVVQKTsKLQkJUlRNUHVzZWNEZWxheSgzMDAwKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT09PT1Bc2ljRm9yY2VXYWtldXA9PT1iRnJvbVR4XG4iKSk7Ci0JfQotCi0JCUF1dG9XYWtldXBDZmcud29yZCA9IDA7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKLQotICAgICAgICBpZiAoUlQyOHh4UGNpQXNpY1JhZGlvT24ocEFkLCBET1QxMVBPV0VSU0FWRSkpCi0gICAgICAgIHsKLSNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKLQkJCS8vIGFkZCBieSBqb2hubGksIFJGIHBvd2VyIHNlcXVlbmNlIHNldHVwLCBsb2FkIFJGIG5vcm1hbCBvcGVyYXRpb24tbW9kZSBzZXR1cAotCQkJaWYgKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkpCi0JCQl7Ci0JCQkJUlRNUF9DSElQX09QICpwQ2hpcE9wcyA9ICZwQWQtPmNoaXBPcHM7Ci0KLQkJCQlpZiAocENoaXBPcHMtPkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlKQotCQkJCQlwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUocEFkKTsKLQkJCX0KLQkJCWVsc2UKLSNlbmRpZiAvLyBQQ0lFX1BTX1NVUFBPUlQgLy8KLQkJCXsKLQkJCS8vIGVuZCBqb2hubGkKLQkJCQkvLyBJbiBSYWRpbyBPZmYsIHdlIHR1cm4gb2ZmIFJGIGNsaywgU28gbm93IG5lZWQgdG8gY2FsbCBBU0lDU3dpdGNoQ2hhbm5lbCBhZ2Fpbi4KLQkJCQlpZiAoSU5GUkFfT04ocEFkKSAmJiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQkJCQkJJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCi0JCQkJewotCQkJCQkvLyBNdXN0IHVzaW5nIDQwTUh6LgotCQkJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0JCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJLy8gTXVzdCB1c2luZyAyME1Iei4KLQkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCQkJCX0KLQkJCX0KLSAgICAgICAgfQotI2lmZGVmIFBDSUVfUFNfU1VQUE9SVAotCQkvLyAzMDkwIE1DVSBXYWtldXAgY29tbWFuZCBuZWVkcyBtb3JlIHRpbWUgdG8gYmUgc3RhYmxlLgotCQkvLyBCZWZvcmUgc3RhYmxlLCBkb24ndCBpc3N1ZSBvdGhlciBNQ1UgY29tbWFuZCB0byBwcmV2ZW50IGZyb20gZmlybXdhcmUgZXJyb3IuCi0JCWlmICgoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKSkgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkKLQkJCSYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID09IDMpCi0JCQkmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpKQotCQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09UlQyOHh4UGNpU3RhQXNpY0ZvcmNlV2FrZXVwOjpSZWxlYXNlIHRoZSBNQ1UgTG9jaygzMDkwKVxuIikpOwotCQkJUlRNUF9TRU1fTE9DSygmcEFkLT5NY3VDbWRMb2NrKTsKLQkJCXBBZC0+YnJ0MzB4eEJhbk1jdUNtZCA9IEZBTFNFOwotCQkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1jdUNtZExvY2spOwotCQkJfQotI2VuZGlmIC8vIFBDSUVfUFNfU1VQUE9SVCAvLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvLyBQQ0ksIDI4NjAtUENJZQotICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09UlQyOHh4UGNpU3RhQXNpY0ZvcmNlV2FrZXVwOjpPcmlnaW5hbCBQQ0kgUG93ZXIgU2F2aW5nXG4iKSk7Ci0gICAgICAgIEFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMSwgMHhmZiwgMHgwMCwgMHgwMik7Ci0gICAgICAgIEF1dG9XYWtldXBDZmcud29yZCA9IDA7Ci0JICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKLSAgICB9Ci0KLSAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKLSAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19XQUtFVVBfTk9XKTsKLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09PT09PVJUMjh4eFBjaVN0YUFzaWNGb3JjZVdha2V1cFxuIikpOwotfQotCi0KLVZPSUQgUlQyOHh4UGNpU3RhQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIFRidHROdW1Ub05leHRXYWtlVXApCi17Ci0JQk9PTEVBTiBicmM7Ci0KLQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQotCXsKLQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpCi0JCSYmcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpCi0JewotCQlVTE9ORwlOb3cgPSAwOwotCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XQUtFVVBfTk9XKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid2FraW5nIHVwIG5vdyFcbiIpKTsKLQkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKLQkJLy8gSWYgbGFzdCBzZW5kIE5VTEwgZnJhbSB0aW1lIGlzIHRvbyBjbG9zZSB0byB0aGlzIHJlY2VpdmluZyBiZWFjb24gKHdpdGhpbiA4bXMpLCBkb24ndCBnbyB0byBzbGVlcCBmb3IgdGhpcyBEVE0uCi0JCS8vIEJlY2F1c2UgU29tZSBBUCBjYW4ndCBxdWV1aW5nIG91dGdvaW5nIGZyYW1lcyBpbW1lZGlhdGVseS4KLQkJaWYgKCgocEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUgKyA4KSA+PSBOb3cpICYmIChwQWQtPk1sbWUuTGFzdFNlbmROVUxMcHNtVGltZSA8PSBOb3cpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOb3cgPSAlbHUsIExhc3RTZW5kTlVMTHBzbVRpbWU9JWx1IDogIFJ4Q291bnRTaW5jZUxhc3ROVUxMID0gJWx1LiBcbiIsIE5vdywgcEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUsIHBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudFNpbmNlTGFzdE5VTEwpKTsKLQkJCXJldHVybjsKLQkJfQotCQllbHNlIGlmICgocEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCA+IDApICYmICgocEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUgKyBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QpID49IE5vdykpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vdyA9ICVsdSwgTGFzdFNlbmROVUxMcHNtVGltZT0lbHU6IFJ4Q291bnRTaW5jZUxhc3ROVUxMID0gJWx1ID4gMCBcbiIsIE5vdywgcEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUsICBwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnRTaW5jZUxhc3ROVUxMKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlicmMgPSBSVDI4eHhQY2lBc2ljUmFkaW9PZmYocEFkLCBET1QxMVBPV0VSU0FWRSwgVGJ0dE51bVRvTmV4dFdha2VVcCk7Ci0JCWlmIChicmM9PVRSVUUpCi0JCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7Ci0JfQotCWVsc2UKLQl7Ci0JCUFVVE9fV0FLRVVQX1NUUlVDCUF1dG9XYWtldXBDZmc7Ci0JCS8vIHdlIGhhdmUgZGVjaWRlZCB0byBTTEVFUCwgc28gYXQgbGVhc3QgZG8gaXQgZm9yIGEgQkVBQ09OIHBlcmlvZC4KLQkJaWYgKFRidHROdW1Ub05leHRXYWtlVXAgPT0gMCkKLQkJCVRidHROdW1Ub05leHRXYWtlVXAgPSAxOwotCi0JCS8vUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX01BU0tfQ1NSLCBBdXRvV2FrZXVwSW50KTsKLQotCQlBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7Ci0JCUF1dG9XYWtldXBDZmcuZmllbGQuTnVtb2ZTbGVlcGluZ1RidHQgPSBUYnR0TnVtVG9OZXh0V2FrZVVwIC0gMTsKLQkJQXV0b1dha2V1cENmZy5maWVsZC5FbmFibGVBdXRvV2FrZXVwID0gMTsKLQkJQXV0b1dha2V1cENmZy5maWVsZC5BdXRvTGVhZFRpbWUgPSA1OwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7Ci0JCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMCwgMHhmZiwgMHhmZiwgMHgwMCk7ICAgLy8gc2VuZCBQT1dFUi1TQVZFIGNvbW1hbmQgdG8gTUNVLiBUaW1lb3V0IDQwdXMuCi0JCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tICVzLCBUYnR0TnVtVG9OZXh0V2FrZVVwPSVkIFxuIiwgX19GVU5DVElPTl9fLCBUYnR0TnVtVG9OZXh0V2FrZVVwKSk7Ci0JfQotCi19Ci0KLQotVk9JRCBQc1BvbGxXYWtlRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCi17Ci0JUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIi0tPlBzUG9sbFdha2VFeGVjIFxuIikpOwotCi0JUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotICAgIGlmIChwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZykKLSAgICB7Ci0JICAgIFJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLCBSRVNUT1JFX1dBS0VVUCk7Ci0gICAgfQotICAgIHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7Ci0JUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0jaWZkZWYgUENJRV9QU19TVVBQT1JUCi0JLy8gRm9yIHJ0MzB4eCBwb3dlciBzb2x1dGlvbiAzLCBVc2Ugc29mdHdhcmUgdGltZXIgdG8gd2FrZSB1cCBpbiBwc20uIFNvIGNhbGwKLQkvLyBBc2ljRm9yY2VXYWtldXAgaGVyZSBpbnN0ZWFkIG9mIGhhbmRsaW5nIHR3YWtldXAgaW50ZXJydXB0LgotCWlmICgoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKSkKLQkmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQotCSYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIjwtLVBzUG9sbFdha2VFeGVjOjozMDkwIGNhbGxzIEFzaWNGb3JjZVdha2V1cChwQWQsIERPVDExUE9XRVJTQVZFKSBpbiBhZHZhbmNlIFxuIikpOwotCQlBc2ljRm9yY2VXYWtldXAocEFkLCBET1QxMVBPV0VSU0FWRSk7Ci0JfQotCi0jZW5kaWYgLy8gUENJRV9QU19TVVBQT1JUIC8vCi19Ci0KLVZPSUQgIFJhZGlvT25FeGVjKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKLXsKLQlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7Ci0JUlRNUF9DSElQX09QICpwQ2hpcE9wcyA9ICZwQWQtPmNoaXBPcHM7Ci0JV1BETUFfR0xPX0NGR19TVFJVQwlEbWFDZmc7Ci0JQk9PTEVBTgkJCQlDYW5jZWxsZWQ7Ci0KLQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiLS0+UmFkaW9PbkV4ZWMoKSByZXR1cm4gb24gZk9QX1NUQVRVU19ET1pFID09IFRSVUU7IFxuIikpOwotLy9LSCBEZWJ1ZzogQWRkIHRoZSBjb21waWxlIGZsYWcgIlJUMjg2MCBhbmQgY29uZGl0aW9uCi0jaWZkZWYgUlRNUF9QQ0lfU1VQUE9SVAotCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkKLQkJCSYmcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpCi0JCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwgMTApOwotI2VuZGlmIC8vIFJUTVBfUENJX1NVUFBPUlQgLy8KLQkJcmV0dXJuOwotCX0KLQotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCItLT5SYWRpb09uRXhlYygpIHJldHVybiBvbiBTQ0FOX0lOX1BST0dSRVNTOyBcbiIpKTsKLQotCi0jaWZkZWYgUlRNUF9QQ0lfU1VQUE9SVAotaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpCi0JJiZwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkKLQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCAxMCk7Ci0jZW5kaWYgLy8gUlRNUF9QQ0lfU1VQUE9SVCAvLwotCQlyZXR1cm47Ci0JfQotLy9LSCBEZWJ1ZzogbmVlZCB0byBjaGVjay4gSSBhZGQgdGhlIGNvbXBpbGUgZmxhZyAiQ09ORklHX1NUQV9TVVBQT1JUIiB0byBlbmNsb3NlIHRoZSBmb2xsb3dpbmcgY29kZXMuCi0jaWZkZWYgUlRNUF9QQ0lfU1VQUE9SVAotaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpCi0JJiZwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkKLQl7Ci0JcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKLQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwJJkNhbmNlbGxlZCk7Ci0JfQotI2VuZGlmIC8vIFJUTVBfUENJX1NVUFBPUlQgLy8KLQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCi0JewotCQlwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKLQkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JLKTsKLQkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JFKTsKLQkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZJKTsKLQkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZPKTsKLQkJLypSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfSENDQSk7Ki8KLQkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX01HTVQpOwotCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfUlgpOwotCi0JCS8vIDIuIFNlbmQgd2FrZSB1cCBjb21tYW5kLgotCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIFBvd2VyV2FrZUNJRCwgMHgwMCwgMHgwMik7Ci0JCS8vIDItMS4gd2FpdCBjb21tYW5kIG9rLgotCQlBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyV2FrZUNJRCk7Ci0KLQkJLy8gV2hlbiBQQ0kgY2xvY2sgaXMgb2ZmLCBkb24ndCB3YW50IHRvIHNlcnZpY2UgaW50ZXJydXB0LiBTbyB3aGVuIGJhY2sgdG8gY2xvY2sgb24sIGVuYWJsZSBpbnRlcnJ1cHQuCi0JCS8vUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX01BU0tfQ1NSLCAoREVMQVlJTlRNQVNLfFJ4SU5UKSk7Ci0JCVJUTVBfQVNJQ19JTlRFUlJVUFRfRU5BQkxFKHBBZCk7Ci0KLQkJLy8gMy4gRW5hYmxlIFR4IERNQS4KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmRG1hQ2ZnLndvcmQpOwotCQlEbWFDZmcuZmllbGQuRW5hYmxlVHhETUEgPSAxOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBEbWFDZmcud29yZCk7Ci0KLQkJLy8gSW4gUmFkaW8gT2ZmLCB3ZSB0dXJuIG9mZiBSRiBjbGssIFNvIG5vdyBuZWVkIHRvIGNhbGwgQVNJQ1N3aXRjaENoYW5uZWwgYWdhaW4uCi0JCWlmIChJTkZSQV9PTihwQWQpICYmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQotCQkJJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCi0JCXsKLQkJCS8vIE11c3QgdXNpbmcgNDBNSHouCi0JCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0JCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyBNdXN0IHVzaW5nIDIwTUh6LgotCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJfQotLy9LSCBEZWJ1ZzpUaGUgZm9sbG93aW5nIGNvZGVzIHNob3VsZCBiZSBlbmNsb3NlZCBieSBSVDMwOTAgY29tcGlsZSBmbGFnCi0JCWlmIChwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUpCi0JCQlwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUocEFkKTsKLSNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLS8vIDMwOTAgTUNVIFdha2V1cCBjb21tYW5kIG5lZWRzIG1vcmUgdGltZSB0byBiZSBzdGFibGUuCi0vLyBCZWZvcmUgc3RhYmxlLCBkb24ndCBpc3N1ZSBvdGhlciBNQ1UgY29tbWFuZCB0byBwcmV2ZW50IGZyb20gZmlybXdhcmUgZXJyb3IuCi1pZiAoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKQotCSYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID09IDMpCi0JJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSkKLQl7Ci0JUlRNUF9TRU1fTE9DSygmcEFkLT5NY3VDbWRMb2NrKTsKLQlwQWQtPmJydDMweHhCYW5NY3VDbWQgPSBGQUxTRTsKLQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWN1Q21kTG9jayk7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFBDSUVfUFNfU1VQUE9SVCAvLwotCQkvLyBDbGVhciBSYWRpbyBvZmYgZmxhZwotCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7Ci0KLQkJLy8gU2V0IExFRAotCQlSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09OKTsKLQotICAgICAgICBpZiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9BQ1RJVkUpCi0gICAgICAgIHsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgcEFkLT5TdGFDZmcuQkJQUjMpOwotICAgICAgICB9Ci0JfQotCWVsc2UKLQl7Ci0JCVJUMjh4eFBjaUFzaWNSYWRpb09mZihwQWQsIEdVSVJBRElPX09GRiwgMCk7Ci0JfQotfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyByb3V0aW5lIHNlbmRzIGNvbW1hbmQgdG8gZmlybXdhcmUgYW5kIHR1cm4gb3VyIGNoaXAgdG8gd2FrZSB1cCBtb2RlIGZyb20gcG93ZXIgc2F2ZSBtb2RlLgotCQlCb3RoIFJhZGlvT24gYW5kIC4xMSBwb3dlciBzYXZlIGZ1bmN0aW9uIG5lZWRzIHRvIGNhbGwgdGhpcyByb3V0aW5lLgotCUlucHV0OgotCQlMZXZlbCA9IEdVSVJBRElPX09GRiA6IGNhbGwgdGhpcyBmdW5jdGlvbiBpcyBmcm9tIFJhZGlvIE9mZiB0byBSYWRpbyBPbi4gIE5lZWQgdG8gcmVzdG9yZSBQQ0kgaG9zdCB2YWx1ZS4KLQkJTGV2ZWwgPSBvdGhlciB2YWx1ZSA6IG5vcm1hbCB3YWtlIHVwIGZ1bmN0aW9uLgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotQk9PTEVBTiBSVDI4eHhQY2lBc2ljUmFkaW9PbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiAgICAgTGV2ZWwpCi17Ci0gICAgLy9XUERNQV9HTE9fQ0ZHX1NUUlVDCURtYUNmZzsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlCT09MRUFOCQkJCUNhbmNlbGxlZDsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSAgICAvL1VJTlQzMgkJCSAgICBNQUNWYWx1ZTsKLQotCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVAgJiYgTGV2ZWw9PURPVDExUE9XRVJTQVZFKQotCQlyZXR1cm4gRkFMU0U7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpCi0JewotCQlpZiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpCi0JCXsKLQkgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCSZDYW5jZWxsZWQpOwotCQl9Ci0JCWlmICgocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpJiYKLQkJKChMZXZlbCA9PSBHVUlSQURJT19PRkYpIHx8IChMZXZlbCA9PSBHVUlfSURMRV9QT1dFUl9TQVZFKSkKLQkJfHwoUlRNUF9URVNUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX1NFVF9QQ0lfQ0xLX09GRl9DT01NQU5EKSkpCi0JCXsKLQkJCS8vIFNvbWUgY2hpcHMgZG9uJ3QgbmVlZCB0byBkZWxheSA2bXMsIHNvIGNvcHkgUlRNUFBDSWVQb3dlckxpbmtDdHJsUmVzdG9yZQotCQkJLy8gcmV0dXJuIGNvbmRpdGlvbiBoZXJlLgotCQkJLyoKLQkJCWlmICgoKHBBZC0+TUFDVmVyc2lvbiYweGZmZmYwMDAwKSAhPSAweDI4NjAwMDAwKQotCQkJCSYmICgocEFkLT5EZXZpY2VJRCA9PSBOSUMyODYwX1BDSWVfREVWSUNFX0lEKQotCQkJCXx8KHBBZC0+RGV2aWNlSUQgPT0gTklDMjc5MF9QQ0llX0RFVklDRV9JRCkpKQotCQkJKi8KLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlQyOHh4UGNpQXNpY1JhZGlvT24gKClcbiIpKTsKLQkJCS8vIDEuIFNldCBQQ0kgTGluayBDb250cm9sIGluIENvbmZpZ3VyYXRpb24gU3BhY2UuCi0JCQlSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKHBBZCwgUkVTVE9SRV9XQUtFVVApOwotCQkJUlRNUHVzZWNEZWxheSg2MDAwKTsKLQkJfQotCX0KLQl9Ci0KLSNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKLWlmICghKCgoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpICYmIElTX1ZFUlNJT05fQUZURVJfRihwQWQpCi0JJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPT0gMykKLQkmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpKSkpCi0jZW5kaWYgLy8gUENJRV9QU19TVVBQT1JUIC8vCi0JewotICAgIHBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQU00gOjMwOXhiUENJY2xrT2ZmID09ICVkXG4iLCBwQWQtPmJQQ0ljbGtPZmYpKTsKLQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkvLyAyLiBTZW5kIHdha2UgdXAgY29tbWFuZC4KLQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIFBvd2VyV2FrZUNJRCwgMHgwMCwgMHgwMik7Ci0JcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7Ci0JLy8gMi0xLiB3YWl0IGNvbW1hbmQgb2suCi0JQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlcldha2VDSUQpOwotCVJUTVBfQVNJQ19JTlRFUlJVUFRfRU5BQkxFKHBBZCk7Ci0KLQotCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpOwotCWlmIChMZXZlbCA9PSBHVUlfSURMRV9QT1dFUl9TQVZFKQotCXsKLSNpZmRlZiAgUENJRV9QU19TVVBQT1JUCi0KLQkJCS8vIGFkZCBieSBqb2hubGksIFJGIHBvd2VyIHNlcXVlbmNlIHNldHVwLCBsb2FkIFJGIG5vcm1hbCBvcGVyYXRpb24tbW9kZSBzZXR1cAotCQkJaWYgKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkpCi0JCQl7Ci0JCQkJUlRNUF9DSElQX09QICpwQ2hpcE9wcyA9ICZwQWQtPmNoaXBPcHM7Ci0KLQkJCQlpZiAocENoaXBPcHMtPkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlKQotCQkJCQlwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUocEFkKTsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCQkvLyAzMDkwIE1DVSBXYWtldXAgY29tbWFuZCBuZWVkcyBtb3JlIHRpbWUgdG8gYmUgc3RhYmxlLgotCQkJCS8vIEJlZm9yZSBzdGFibGUsIGRvbid0IGlzc3VlIG90aGVyIE1DVSBjb21tYW5kIHRvIHByZXZlbnQgZnJvbSBmaXJtd2FyZSBlcnJvci4KLQkJCQlpZiAoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKQotCQkJCQkmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQotCQkJCQkmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpKQotCQkJCQl7Ci0JCQkJCQlSVE1QX1NFTV9MT0NLKCZwQWQtPk1jdUNtZExvY2spOwotCQkJCQkJcEFkLT5icnQzMHh4QmFuTWN1Q21kID0gRkFMU0U7Ci0JCQkJCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWN1Q21kTG9jayk7Ci0JCQkJCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJCX0KLQkJCWVsc2UKLQkJCS8vIGVuZCBqb2hubGkKLSNlbmRpZiAvLyBQQ0lFX1BTX1NVUFBPUlQgLy8KLQkJCXsKLQkJCS8vIEluIFJhZGlvIE9mZiwgd2UgdHVybiBvZmYgUkYgY2xrLCBTbyBub3cgbmVlZCB0byBjYWxsIEFTSUNTd2l0Y2hDaGFubmVsIGFnYWluLgotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCQl7Ci0JCQkJaWYgKElORlJBX09OKHBBZCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCi0JCQkJCSYmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQotCQkJCXsKLQkJCQkJLy8gTXVzdCB1c2luZyA0ME1Iei4KLQkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOwotCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCS8vIE11c3QgdXNpbmcgMjBNSHouCi0JCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwotCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJCQl9Ci0JCQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkJfQotCX0KLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVRoaXMgcm91dGluZSBzZW5kcyBjb21tYW5kIHRvIGZpcm13YXJlIGFuZCB0dXJuIG91ciBjaGlwIHRvIHBvd2VyIHNhdmUgbW9kZS4KLQkJQm90aCBSYWRpb09mZiBhbmQgLjExIHBvd2VyIHNhdmUgZnVuY3Rpb24gbmVlZHMgdG8gY2FsbCB0aGlzIHJvdXRpbmUuCi0JSW5wdXQ6Ci0JCUxldmVsID0gR1VJUkFESU9fT0ZGICA6IEdVSSBSYWRpbyBPZmYgbW9kZQotCQlMZXZlbCA9IERPVDExUE9XRVJTQVZFICA6IDgwMi4xMSBwb3dlciBzYXZlIG1vZGUKLQkJTGV2ZWwgPSBSVE1QX0hBTFQgIDogV2hlbiBEaXNhYmxlIGRldmljZS4KLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLUJPT0xFQU4gUlQyOHh4UGNpQXNpY1JhZGlvT2ZmKAotCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCUlOIFVDSEFSICAgICAgICAgICAgTGV2ZWwsCi0JSU4gVVNIT1JUICAgICAgICAgICBUYnR0TnVtVG9OZXh0V2FrZVVwKQotewotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCVdQRE1BX0dMT19DRkdfU1RSVUMJRG1hQ2ZnOwotCVVDSEFSCQlpLCB0ZW1wQkJQX1IzID0gMDsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQlCT09MRUFOCQlicmMgPSBGQUxTRSwgQ2FuY2VsbGVkOwotICAgIFVJTlQzMgkJVGJUVFRpbWUgPSAwOwotCVVJTlQzMgkJUHNQb2xsVGltZSA9IDAvKiwgTUFDVmFsdWUqLzsKLSAgICBVTE9ORwkJQmVhY29uUGVyaW9kVGltZTsKLSAgICBVSU5UMzIJCVJ4RG1hSWR4LCBSeENwdUlkeDsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljUmFkaW9PZmYgPT09PiBMdj0gJWQsIFR4Q3B1SWR4ID0gJWQsIFR4RG1hSWR4ID0gJWQuIFJ4Q3B1SWR4ID0gJWQsIFJ4RG1hSWR4ID0gJWQuXG4iLCBMZXZlbCxwQWQtPlR4UmluZ1swXS5UeENwdUlkeCwgcEFkLT5UeFJpbmdbMF0uVHhEbWFJZHgsIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4LCBwQWQtPlJ4UmluZy5SeERtYUlkeCkpOwotCi0JaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCAmJiBMZXZlbD09RE9UMTFQT1dFUlNBVkUpCi0JCXJldHVybiBGQUxTRTsKLQotICAgIC8vIENoZWNrIFJ4IERNQSBidXN5IHN0YXR1cywgaWYgbW9yZSB0aGFuIGhhbGYgaXMgb2NjdXBpZWQsIGdpdmUgdXAgdGhpcyByYWRpbyBvZmYuCi0JUlRNUF9JT19SRUFEMzIocEFkLCBSWF9EUlhfSURYICwgJlJ4RG1hSWR4KTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX0NSWF9JRFggLCAmUnhDcHVJZHgpOwotCWlmICgoUnhEbWFJZHggPiBSeENwdUlkeCkgJiYgKChSeERtYUlkeCAtIFJ4Q3B1SWR4KSA+IFJYX1JJTkdfU0laRS8zKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNSYWRpb09mZiA9PT0+IHJldHVybjEuIFJ4RG1hSWR4ID0gJWQgLCAgUnhDcHVJZHggPSAlZC4gXG4iLCBSeERtYUlkeCwgUnhDcHVJZHgpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQllbHNlIGlmICgoUnhDcHVJZHggPj0gUnhEbWFJZHgpICYmICgoUnhDcHVJZHggLSBSeERtYUlkeCkgPCBSWF9SSU5HX1NJWkUvMykpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljUmFkaW9PZmYgPT09PiByZXR1cm4yLiAgUnhDcHVJZHggPSAlZC4gUnhEbWFJZHggPSAlZCAsICBcbiIsIFJ4Q3B1SWR4LCBSeERtYUlkeCkpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0gICAgLy8gT25jZSBnbyBpbnRvIHRoaXMgZnVuY3Rpb24sIGRpc2FibGUgdHggYmVjYXVzZSBkb24ndCB3YW50IHRvbyBtYW55IHBhY2tldHMgaW4gcXVldWUgdG8gcHJldmVudCBIVyBzdG9wcy4KLQkvL3BBZC0+YlBDSWNsa09mZkRpc2FibGVUeCA9IFRSVUU7Ci0JUlRNUF9TRVRfUFNGTEFHKHBBZCwgZlJUTVBfUFNfRElTQUJMRV9UWCk7Ci0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpCi0JCSYmIHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJJiZwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkpCi0JewotCi0JICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwJJkNhbmNlbGxlZCk7Ci0JICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAkmQ2FuY2VsbGVkKTsKLQotCSAgICBpZiAoTGV2ZWwgPT0gRE9UMTFQT1dFUlNBVkUpCi0JCXsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVEJUVF9USU1FUiwgJlRiVFRUaW1lKTsKLQkJCVRiVFRUaW1lICY9IDB4MWZmZmY7Ci0JCQkvLyAwMC4gY2hlY2sgaWYgbmVlZCB0byBkbyBzbGVlcCBpbiB0aGlzIERUSU0gcGVyaW9kLiAgIElmIG5leHQgYmVhY29uIHdpbGwgYXJyaXZlIHdpdGhpbiAzMG1zICwgLi4uZG9lc24ndCBuZWNlc3NhcmlseSBzbGVlcC4KLQkJCS8vIFRiVFRUaW1lIHVpbnQgPSA2NHVzLCBMRUFEX1RJTUUgdW5pdCA9IDEwMjR1cywgUHNQb2xsVGltZSB1bml0ID0gMW1zCi0JICAgICAgICBpZiAgKCgoNjQqVGJUVFRpbWUpIDwoKExFQURfVElNRSoxMDI0KSArIDQwMDAwKSkgJiYgKFRidHROdW1Ub05leHRXYWtlVXAgPT0gMCkpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGJUVFRpbWUgPSAweCV4ICwgZ2l2ZSB1cCB0aGlzIHNsZWVwLiBcbiIsIFRiVFRUaW1lKSk7Ci0JICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7Ci0JICAgICAgICAgICAgLy9wQWQtPmJQQ0ljbGtPZmZEaXNhYmxlVHggPSBGQUxTRTsKLQkgICAgICAgICAgICBSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0RJU0FCTEVfVFgpOwotCQkJCXJldHVybiBGQUxTRTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlQc1BvbGxUaW1lID0gKDY0KlRiVFRUaW1lLSBMRUFEX1RJTUUqMTAyNCkvMTAwMDsKLSNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCQlpZiAoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKQotCQkJCSYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID09IDMpCi0JCQkJJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSkKLQkJCQl7Ci0JCQkJCQkJUHNQb2xsVGltZSAtPSA1OwotCQkJCX0KLQkJCQllbHNlCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gUENJRV9QU19TVVBQT1JUIC8vCi0JCQkJUHNQb2xsVGltZSAtPSAzOwotCi0JICAgICAgICAgICAgQmVhY29uUGVyaW9kVGltZSA9IHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCoxMDIvMTAwOwotCQkJCWlmIChUYnR0TnVtVG9OZXh0V2FrZVVwID4gMCkKLQkJCQkJUHNQb2xsVGltZSArPSAoKFRidHROdW1Ub05leHRXYWtlVXAgLTEpICogQmVhY29uUGVyaW9kVGltZSk7Ci0KLQkgICAgICAgICAgICBwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZyA9IFRSVUU7Ci0JCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsIFBzUG9sbFRpbWUpOwotCQkJfQotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUMjh4eFBjaUFzaWNSYWRpb09mZjo6TGV2ZWwhPURPVDExUE9XRVJTQVZFIFxuIikpOwotCX0KLQotCXBBZC0+YlBDSWNsa09mZkRpc2FibGVUeCA9IEZBTFNFOwotICAgIFJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotICAgIC8vIFNldCB0byAxUi4KLQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+IDEgJiYgcEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLQl7Ci0gICAgdGVtcEJCUF9SMyA9IChwQWQtPlN0YUNmZy5CQlBSMyAmIDB4RTcpOwotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIHRlbXBCQlBfUjMpOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCS8vIEluIFJhZGlvIE9mZiwgd2UgdHVybiBvZmYgUkYgY2xrLCBTbyBub3cgbmVlZCB0byBjYWxsIEFTSUNTd2l0Y2hDaGFubmVsIGFnYWluLgotCWlmICgoSU5GUkFfT04ocEFkKSB8fCBwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApICYmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQotCQkmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKLQl7Ci0JCS8vIE11c3QgdXNpbmcgNDBNSHouCi0JCUFzaWNUdXJuT2ZmUkZDbGsocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIE11c3QgdXNpbmcgMjBNSHouCi0JCUFzaWNUdXJuT2ZmUkZDbGsocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQl9Ci0KLQlpZiAoTGV2ZWwgIT0gUlRNUF9IQUxUKQotCXsKLQkJLy8gQ2hhbmdlIEludGVycnVwdCBiaXRtYXNrLgotICAgIC8vIFdoZW4gUENJIGNsb2NrIGlzIG9mZiwgZG9uJ3Qgd2FudCB0byBzZXJ2aWNlIGludGVycnVwdC4KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfTUFTS19DU1IsIEF1dG9XYWtldXBJbnQpOwotCX0KLQllbHNlCi0JewotCQlSVE1QX0FTSUNfSU5URVJSVVBUX0RJU0FCTEUocEFkKTsKLQl9Ci0KLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0NSWF9JRFgsIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4KTsKLQkvLyAgMi4gU2VuZCBTbGVlcCBjb21tYW5kCi0JUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfU1RBVFVTLCAweGZmZmZmZmZmKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DSUQsIDB4ZmZmZmZmZmYpOwotCS8vIHNlbmQgUE9XRVItU0FWRSBjb21tYW5kIHRvIE1DVS4gaGlnaC1ieXRlID0gMSBzYXZlIHBvd2VyIGFzIG11Y2ggYXMgcG9zc2libGUuIGhpZ2ggYnl0ZSA9IDAgc2F2ZSBsZXNzIHBvd2VyCi0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMwLCBQb3dlclNhZmVDSUQsIDB4ZmYsIDB4MSk7Ci0JLy8gIDItMS4gV2FpdCBjb21tYW5kIHN1Y2Nlc3MKLQkvLyBTdGF0dXMgPSAxIDogc3VjY2VzcywgU3RhdHVzID0gMiwgYWxyZWFkeSBzbGVlcCwgU3RhdHVzID0gMywgTWF5YmUgTUFDIGlzIGJ1c3kgc28gY2FuJ3QgZmluaXNoIHRoaXMgdGFzay4KLQlicmMgPSBBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyU2FmZUNJRCk7Ci0KLQkvLyAgMy4gQWZ0ZXIgMHgzMCBjb21tYW5kIGlzIG9rLCBzZW5kIHJhZGlvIG9mZiBjb21tYW5kLiBsb3dieXRlID0gMCBmb3IgcG93ZXIgc2FmZS4KLQkvLyBJZiAweDMwIGNvbW1hbmQgaXMgbm90IG9rIHRoaXMgdGltZSwgd2UgY2FuIGlnbm9yZSAweDM1IGNvbW1hbmQuIEl0IHdpbGwgbWFrZSBzdXJlIG5vdCBjYXVzZSBmaXJtd2FyZSdyIHByb2JsZW0uCi0JaWYgKChMZXZlbCA9PSBET1QxMVBPV0VSU0FWRSkgJiYgKGJyYyA9PSBUUlVFKSkKLQl7Ci0JCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzNSwgUG93ZXJSYWRpb09mZkNJRCwgMCwgMHgwMCk7CS8vIGxvd2J5dGUgPSAwIG1lYW5zIHRvIGRvIHBvd2VyIHNhZmUsIE5PVCB0dXJuIG9mZiByYWRpby4KLQkJLy8gIDMtMS4gV2FpdCBjb21tYW5kIHN1Y2Nlc3MKLQkJQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlclJhZGlvT2ZmQ0lEKTsKLQl9Ci0JZWxzZSBpZiAoYnJjID09IFRSVUUpCi0JewotCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzUsIFBvd2VyUmFkaW9PZmZDSUQsIDEsIDB4MDApOwkvLyBsb3dieXRlID0gMCBtZWFucyB0byBkbyBwb3dlciBzYWZlLCBOT1QgdHVybiBvZmYgcmFkaW8uCi0JCS8vICAzLTEuIFdhaXQgY29tbWFuZCBzdWNjZXNzCi0JCUFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJSYWRpb09mZkNJRCk7Ci0JfQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JLy8gMS4gV2FpdCBETUEgbm90IGJ1c3kKLQlpID0gMDsKLQlkbwotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmRG1hQ2ZnLndvcmQpOwotCQlpZiAoKERtYUNmZy5maWVsZC5SeERNQUJ1c3kgPT0gMCkgJiYgKERtYUNmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkpCi0JCQlicmVhazsKLQkJUlRNUHVzZWNEZWxheSgyMCk7Ci0JCWkrKzsKLQl9d2hpbGUoaSA8IDUwKTsKLQotCS8qCi0JaWYgKGkgPj0gNTApCi0JewotCQlwQWQtPkNoZWNrRG1hQnVzeUNvdW50Kys7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRNQSBSeCBrZWVwcyBidXN5LiAgcmV0dXJuIG9uIEFzaWNSYWRpb09mZiAoKSBDaGVja0RtYUJ1c3lDb3VudCA9ICVkIFxuIiwgcEFkLT5DaGVja0RtYUJ1c3lDb3VudCkpOwotCX0KLQllbHNlCi0JewotCQlwQWQtPkNoZWNrRG1hQnVzeUNvdW50ID0gMDsKLQl9Ci0JKi8KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLS8vS0ggRGVidWc6TXkgb3JpZ2luYWwgY29kZXMgaGF2ZSB0aGUgZm9sbHdvaW5nIGNvZGVzLCBidXQgY3VycmVjbnQgY29kZXMgZG8gbm90IGhhdmUgaXQuCi0vLyBEaXNhYmxlIGZvciBzdGFiaWxpdHkuIElmIFBDSUUgTGluayBDb250cm9sIGlzIG1vZGlmaWVkIGZvciBhZHZhbmNlIHBvd2VyIHNhdmUsIHJlLWNvdmVyeSB0aGlzIGNvZGUgc2VnbWVudC4KLVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHgxMjgwKTsKLS8vT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0NMS1NFTEVDVF80ME1IWik7Ci0KLSNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLWlmICgoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpICYmIElTX1ZFUlNJT05fQUZURVJfRihwQWQpCi0JJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPT0gMykKLQkmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpKQotCXsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVDI4eHhQY2lBc2ljUmFkaW9PZmY6OjMwOTAgcmV0dXJuIHRvIHNraXAgdGhlIGZvbGxvd2luZyBUYnR0TnVtVG9OZXh0V2FrZVVwIHNldHRpbmcgZm9yIDI3OXhcbiIpKTsKLQlwQWQtPmJQQ0ljbGtPZmYgPSBUUlVFOwotCVJUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfRElTQUJMRV9UWCk7Ci0JLy8gRm9yIHRoaXMgY2FzZSwgZG9lc24ndCBuZWVkIHRvIGJlbG93IGFjdGlvbnMsIHNvIHJldHVybiBoZXJlLgotCXJldHVybiBicmM7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFBDSUVfUFNfU1VQUE9SVCAvLwotCWlmIChMZXZlbCA9PSBET1QxMVBPV0VSU0FWRSkKLQl7Ci0JCUFVVE9fV0FLRVVQX1NUUlVDCUF1dG9XYWtldXBDZmc7Ci0JCS8vUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsIDkwKTsKLQotCQkvLyB3ZSBoYXZlIGRlY2lkZWQgdG8gU0xFRVAsIHNvIGF0IGxlYXN0IGRvIGl0IGZvciBhIEJFQUNPTiBwZXJpb2QuCi0JCWlmIChUYnR0TnVtVG9OZXh0V2FrZVVwID09IDApCi0JCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gMTsKLQotCQlBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7Ci0KLQkJLy8gMS4gU2V0IGF1dG8gd2FrZSB1cCB0aW1lci4KLQkJQXV0b1dha2V1cENmZy5maWVsZC5OdW1vZlNsZWVwaW5nVGJ0dCA9IFRidHROdW1Ub05leHRXYWtlVXAgLSAxOwotCQlBdXRvV2FrZXVwQ2ZnLmZpZWxkLkVuYWJsZUF1dG9XYWtldXAgPSAxOwotCQlBdXRvV2FrZXVwQ2ZnLmZpZWxkLkF1dG9MZWFkVGltZSA9IExFQURfVElNRTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOwotCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCS8vICA0LTEuIElmIGl0J3MgdG8gZGlzYWJsZSBvdXIgZGV2aWNlLiBOZWVkIHRvIHJlc3RvcmUgUENJIENvbmZpZ3VyYXRpb24gU3BhY2UgdG8gaXRzIG9yaWdpbmFsIHZhbHVlLgotCWlmIChMZXZlbCA9PSBSVE1QX0hBTFQgJiYgcEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLQl7Ci0JCWlmICgoYnJjID09IFRSVUUpICYmIChpIDwgNTApKQotCQkJUlRNUFBDSWVMaW5rQ3RybFNldHRpbmcocEFkLCAxKTsKLQl9Ci0JLy8gIDQuIFNldCBQQ0kgY29uZmlndXJhdGlvbiBTcGFjZSBMaW5rIENvbXRyb2wgZmllbGRzLiAgT25seSBSYWRpbyBPZmYgbmVlZHMgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uCi0JZWxzZSBpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLQl7Ci0JCWlmICgoYnJjID09IFRSVUUpICYmIChpIDwgNTApKQotCQkJUlRNUFBDSWVMaW5rQ3RybFNldHRpbmcocEFkLCAzKTsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkvL3BBZC0+YlBDSWNsa09mZkRpc2FibGVUeCA9IEZBTFNFOwotCVJUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfRElTQUJMRV9UWCk7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotCi0KLVZPSUQgUlQyOHh4UGNpTWxtZVJhZGlvT24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0gICAgaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKLQkJcmV0dXJuOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcz09PT5cbiIsIF9fRlVOQ1RJT05fXykpOwotCi0gICAgaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApIHx8Ci0gICAgICAgICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLSAgICAgICAgJiYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotICAgICAgICB8fHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBGQUxTRQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotICAgICAgICApKSkKLSAgICB7Ci0JUlQyOHh4UGNpQXNpY1JhZGlvT24ocEFkLCBHVUlfSURMRV9QT1dFUl9TQVZFKTsKLQkvL05JQ1Jlc2V0RnJvbUVycm9yKHBBZCk7Ci0KLQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkspOwotCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CRSk7Ci0JUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZJKTsKLQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVk8pOwotCS8qUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0hDQ0EpOyovCi0JUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX01HTVQpOwotCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9SWCk7Ci0KLQkvLyBFbmFibGUgVHgvUngKLQlSVE1QRW5hYmxlUnhUeChwQWQpOwotCi0JLy8gQ2xlYXIgUmFkaW8gb2ZmIGZsYWcKLQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7Ci0JUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRik7Ci0JICAgIC8vIFNldCBMRUQKLQkgICAgUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PTik7Ci0gICAgfQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0gICAgaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJgotICAgICAgICAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpCi0gICAgICAgICYmKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSkKLSAgICB7Ci0gICAgICAgIEJPT0xFQU4JCUNhbmNlbGxlZDsKLQotCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLCBSRVNUT1JFX1dBS0VVUCk7Ci0KLSAgICAgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKLQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwJJkNhbmNlbGxlZCk7Ci0JUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLAkmQ2FuY2VsbGVkKTsKLQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsIDQwKTsKLSAgICB9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi19Ci0KLQotVk9JRCBSVDI4eHhQY2lNbG1lUmFkaW9PRkYoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JQk9PTEVBTiBicmM9VFJVRTsKLQotICAgIGlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKLQlyZXR1cm47Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkvLyBMaW5rIGRvd24gZmlyc3QgaWYgYW55IGFzc29jaWF0aW9uIGV4aXN0cwotCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCXsKLQkJaWYgKElORlJBX09OKHBBZCkgfHwgQURIT0NfT04ocEFkKSkKLQkJewotCQkJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUIERpc1JlcTsKLQkJCU1MTUVfUVVFVUVfRUxFTSAqcE1zZ0VsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKLQotCQkJaWYgKHBNc2dFbGVtKQotCQkJewotCQkJCUNPUFlfTUFDX0FERFIoJkRpc1JlcS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQkJRGlzUmVxLlJlYXNvbiA9ICBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkc7Ci0KLQkJCQlwTXNnRWxlbS0+TWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7Ci0JCQkJcE1zZ0VsZW0tPk1zZ1R5cGUgPSBNVDJfTUxNRV9ESVNBU1NPQ19SRVE7Ci0JCQkJcE1zZ0VsZW0tPk1zZ0xlbiA9IHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KHBNc2dFbGVtLT5Nc2csICZEaXNSZXEsIHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpKTsKLQotCQkJCU1sbWVEaXNhc3NvY1JlcUFjdGlvbihwQWQsIHBNc2dFbGVtKTsKLQkJCQlrZnJlZShwTXNnRWxlbSk7Ci0KLQkJCQlSVE1QdXNlY0RlbGF5KDEwMDApOwotCQkJfQotCQl9Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcz09PT5cbiIsIF9fRlVOQ1RJT05fXykpOwotCi0JLy8gU2V0IExFRAotCS8vUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PRkYpOwotCS8vIFNldCBSYWRpbyBvZmYgZmxhZwotCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotICAgIHsKLQlCT09MRUFOCQlDYW5jZWxsZWQ7Ci0JaWYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKQotCQl7Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCi0JewotCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCAmQ2FuY2VsbGVkKTsKLQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOwotCX0KLQkJCS8vIElmIGR1cmluZyBwb3dlciBzYWZlIG1vZGUuCi0JCQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCItLT5NbG1lUmFkaW9PZmYoKSByZXR1cm4gb24gYlJhZGlvID09IFRSVUU7IFxuIikpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCS8vIEFsd2F5cyByYWRpbyBvbiBzaW5jZSB0aGUgTklDIG5lZWRzIHRvIHNldCB0aGUgTUNVIGNvbW1hbmQgKExFRF9SQURJT19PRkYpLgotCQkJaWYgKElETEVfT04ocEFkKSAmJgotCQkJCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpKSkKLQkJCXsKLQkJCQlSVDI4eHhQY2lBc2ljUmFkaW9PbihwQWQsIEdVSV9JRExFX1BPV0VSX1NBVkUpOwotCQkJfQotCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJPT0xFQU4gQ2FuY2VsbGVkOwotICAgICAgICAgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKLSAgICAgICAgICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAkmQ2FuY2VsbGVkKTsKLQkgICAgICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwJJkNhbmNlbGxlZCk7Ci0gICAgICAgIH0KLQkJfQotCi0gICAgICAgIC8vIExpbmsgZG93biBmaXJzdCBpZiBhbnkgYXNzb2NpYXRpb24gZXhpc3RzCi0gICAgICAgIGlmIChJTkZSQV9PTihwQWQpIHx8IEFESE9DX09OKHBBZCkpCi0gICAgICAgICAgICBMaW5rRG93bihwQWQsIEZBTFNFKTsKLSAgICAgICAgUlRNUHVzZWNEZWxheSgxMDAwMCk7Ci0gICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIC8vIENsZWFuIHVwIG9sZCBic3MgdGFibGUKLSAgICAgICAgQnNzVGFibGVJbml0KCZwQWQtPlNjYW5UYWIpOwotCi0gICAgICAgIC8qCi0gICAgICAgIGlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkKLSAgICAgICAgewotICAgICAgICAgICAgUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCAxMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgKi8KLSAgICB9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JLy8gU2V0IExFRC5Nb3ZlIHRvIGhlcmUgZm9yIGZpeGluZyBMRUQgYnVnLiBUaGlzIGZsYWcgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgTGlua0Rvd24KLQlSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09GRik7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLS8vS0ggRGVidWc6QWxsIFBDSWUgZGV2aWNlcyBuZWVkIHRvIHVzZSB0aW1lciB0byBleGVjdXRlIHJhZGlvIG9mZiBmdW5jdGlvbiwgb3IgdGhlIFBDSWUmJkVuYWJsZU5ld1BTIG5lZWRzLgotLy9LSCBBbnM6SXQgaXMgcmlnaHQsIGJlY2F1c2Ugb25seSB3aGVuIHRoZSBQQ0llIGFuZCBFbmFibGVOZXdQcyBpcyB0cnVlLCB3ZSBuZWVkIHRvIGRlbGF5IHRoZSBSYWRpb09mZlRpbWVyCi0vL3RvIGF2b2lkIHRoZSBkZWFkbG9jayB3aXRoIFBDSWUgUG93ZXIgc2F2aW5nIGZ1bmN0aW9uLgotaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEmJgotCU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpJiYKLQlwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkKLQl7Ci0JUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCAxMCk7Ci0JfQotZWxzZQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotewotCi0KLQlicmM9UlQyOHh4UGNpQXNpY1JhZGlvT2ZmKHBBZCwgR1VJUkFESU9fT0ZGLCAwKTsKLQotCWlmIChicmM9PUZBTFNFKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCIlcyBjYWxsIFJUMjh4eFBjaUFzaWNSYWRpb09mZiBmYWlsICEhXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQl9Ci19Ci0vKgotCS8vIERpc2FibGUgVHgvUnggRE1BCi0JUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOwkgICAvLyBkaXNhYmxlIERNQQotCUdsb0NmZy5maWVsZC5FbmFibGVUeERNQSA9IDA7Ci0JR2xvQ2ZnLmZpZWxkLkVuYWJsZVJ4RE1BID0gMDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7CSAgIC8vIGFib3J0IGFsbCBUWCByaW5ncwotCi0KLQkvLyBNQUNfU1lTX0NUUkwgPT4gdmFsdWUgPSAweDAgPT4gNDBtQQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMCk7Ci0KLQkvLyBQV1JfUElOX0NGRyA9PiB2YWx1ZSA9IDB4MCA9PiA0MG1BCi0JUlRNUF9JT19XUklURTMyKHBBZCwgUFdSX1BJTl9DRkcsIDApOwotCi0JLy8gVFhfUElOX0NGRyA9PiB2YWx1ZSA9IDB4MCA9PiAyMG1BCi0JUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUElOX0NGRywgMCk7Ci0KLQlpZiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKQotCXsKLQkJLy8gTXVzdCB1c2luZyA0ME1Iei4KLQkJQXNpY1R1cm5PZmZSRkNsayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gTXVzdCB1c2luZyAyME1Iei4KLQkJQXNpY1R1cm5PZmZSRkNsayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCX0KLQotCS8vIFdhaXRpbmcgZm9yIERNQSBpZGxlCi0JaSA9IDA7Ci0JZG8KLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKLQkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQotCQkJYnJlYWs7Ci0KLQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQl9d2hpbGUgKGkrKyA8IDEwMCk7Ci0qLwotfQotCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fcHJvZmlsZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX3Byb2ZpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgwM2Y0Mi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fcHJvZmlsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMyMSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotCWNtbV9wcm9maWxlLmMKLQotICAgIEFic3RyYWN0OgotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi0jZGVmaW5lIEVUSF9NQUNfQUREUl9TVFJfTEVOIDE3ICAvLyBpbiBmb3JtYXQgb2YgeHg6eHg6eHg6eHg6eHg6eHgKLQotLy8gV2UgYXNzdW1lIHRoZSBzMSBpcyBhIHN0aW5nLCBzMiBpcyBhIG1lbW9yeSBzcGFjZSB3aXRoIDYgYnl0ZXMuIGFuZCBjb250ZW50IG9mIHMxIHdpbGwgYmUgY2hhbmdlZC4KLUJPT0xFQU4gcnRzdHJtYWN0b2hleChQU1RSSU5HIHMxLCBQU1RSSU5HIHMyKQotewotCWludCBpID0gMDsKLQlQU1RSSU5HIHB0b2tTID0gczEsIHB0b2tFID0gczE7Ci0KLQlpZiAoc3RybGVuKHMxKSAhPSBFVEhfTUFDX0FERFJfU1RSX0xFTikKLQkJcmV0dXJuIEZBTFNFOwotCi0Jd2hpbGUoKCpwdG9rUykgIT0gJ1wwJykKLQl7Ci0JCWlmKChwdG9rRSA9IHN0cmNocihwdG9rUywgJzonKSkgIT0gTlVMTCkKLQkJCSpwdG9rRSsrID0gJ1wwJzsKLQkJaWYgKChzdHJsZW4ocHRva1MpICE9IDIpIHx8ICghaXN4ZGlnaXQoKnB0b2tTKSkgfHwgKCFpc3hkaWdpdCgqKHB0b2tTKzEpKSkpCi0JCQlicmVhazsgLy8gZmFpbAotCQlBdG9IKHB0b2tTLCAoUFVDSEFSKSZzMltpKytdLCAxKTsKLQkJcHRva1MgPSBwdG9rRTsKLQkJaWYgKGkgPT0gNikKLQkJCWJyZWFrOyAvLyBwYXJzaW5nIGZpbmlzaGVkCi0JfQotCi0JcmV0dXJuICggaSA9PSA2ID8gVFJVRSA6IEZBTFNFKTsKLQotfQotCi0KLS8vIHdlIGFzc3VtZSB0aGUgczEgYW5kIHMyIGJvdGggYXJlIHN0cmluZ3MuCi1CT09MRUFOIHJ0c3RyY2FzZWNtcChQU1RSSU5HIHMxLCBQU1RSSU5HIHMyKQotewotCVBTVFJJTkcgcDEgPSBzMSwgcDIgPSBzMjsKLQotCWlmIChzdHJsZW4oczEpICE9IHN0cmxlbihzMikpCi0JCXJldHVybiBGQUxTRTsKLQotCXdoaWxlKCpwMSAhPSAnXDAnKQotCXsKLQkJaWYoKCpwMSAhPSAqcDIpICYmICgoKnAxIF4gKnAyKSAhPSAweDIwKSkKLQkJCXJldHVybiBGQUxTRTsKLQkJcDErKzsKLQkJcDIrKzsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLy8gd2UgYXNzdW1lIHRoZSBzMSAoYnVmZmVyKSBhbmQgczIgKGtleSkgYm90aCBhcmUgc3RyaW5ncy4KLVBTVFJJTkcgcnRzdHJzdHJ1bmNhc2VjbXAoUFNUUklORyBzMSwgUFNUUklORyBzMikKLXsKLQlJTlQgbDEsIGwyLCBpOwotCWNoYXIgdGVtcDEsIHRlbXAyOwotCi0JbDIgPSBzdHJsZW4oczIpOwotCWlmICghbDIpCi0JCXJldHVybiAoY2hhciAqKSBzMTsKLQotCWwxID0gc3RybGVuKHMxKTsKLQotCXdoaWxlIChsMSA+PSBsMikKLQl7Ci0JCWwxLS07Ci0KLQkJZm9yKGk9MDsgaTxsMjsgaSsrKQotCQl7Ci0JCQl0ZW1wMSA9ICooczEraSk7Ci0JCQl0ZW1wMiA9ICooczIraSk7Ci0KLQkJCWlmICgoJ2EnIDw9IHRlbXAxKSAmJiAodGVtcDEgPD0gJ3onKSkKLQkJCQl0ZW1wMSA9ICdBJysodGVtcDEtJ2EnKTsKLQkJCWlmICgoJ2EnIDw9IHRlbXAyKSAmJiAodGVtcDIgPD0gJ3onKSkKLQkJCQl0ZW1wMiA9ICdBJysodGVtcDItJ2EnKTsKLQotCQkJaWYgKHRlbXAxICE9IHRlbXAyKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGkgPT0gbDIpCi0JCQlyZXR1cm4gKGNoYXIgKikgczE7Ci0KLQkJczErKzsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsgLy8gbm90IGZvdW5kCi19Ci0KLS8vYWRkIGJ5IGthdGh5Ci0KLSAvKioKLSAgKiBzdHJzdHIgLSBGaW5kIHRoZSBmaXJzdCBzdWJzdHJpbmcgaW4gYSAlTlVMIHRlcm1pbmF0ZWQgc3RyaW5nCi0gICogQHMxOiBUaGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkCi0gICogQHMyOiBUaGUgc3RyaW5nIHRvIHNlYXJjaCBmb3IKLSAgKi8KLVBTVFJJTkcgcnRzdHJzdHIoUFNUUklORyBzMSxjb25zdCBQU1RSSU5HIHMyKQotewotCUlOVCBsMSwgbDI7Ci0KLQlsMiA9IHN0cmxlbihzMik7Ci0JaWYgKCFsMikKLQkJcmV0dXJuIHMxOwotCi0JbDEgPSBzdHJsZW4oczEpOwotCi0Jd2hpbGUgKGwxID49IGwyKQotCXsKLQkJbDEtLTsKLQkJaWYgKCFtZW1jbXAoczEsczIsbDIpKQotCQkJcmV0dXJuIHMxOwotCQlzMSsrOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi0vKioKLSAqIHJzdHJ0b2sgLSBTcGxpdCBhIHN0cmluZyBpbnRvIHRva2VucwotICogQHM6IFRoZSBzdHJpbmcgdG8gYmUgc2VhcmNoZWQKLSAqIEBjdDogVGhlIGNoYXJhY3RlcnMgdG8gc2VhcmNoIGZvcgotICogKiBXQVJOSU5HOiBzdHJ0b2sgaXMgZGVwcmVjYXRlZCwgdXNlIHN0cnNlcCBpbnN0ZWFkLiBIb3dldmVyIHN0cnNlcCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIG9sZCBhcmNoaXRlY3R1cmUuCi0gKi8KLVBTVFJJTkcgX19yc3RydG9rOwotUFNUUklORyByc3RydG9rKFBTVFJJTkcgcyxjb25zdCBQU1RSSU5HIGN0KQotewotCVBTVFJJTkcgc2JlZ2luLCBzZW5kOwotCi0Jc2JlZ2luICA9IHMgPyBzIDogX19yc3RydG9rOwotCWlmICghc2JlZ2luKQotCXsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0Jc2JlZ2luICs9IHN0cnNwbihzYmVnaW4sY3QpOwotCWlmICgqc2JlZ2luID09ICdcMCcpCi0JewotCQlfX3JzdHJ0b2sgPSBOVUxMOwotCQlyZXR1cm4oIE5VTEwgKTsKLQl9Ci0KLQlzZW5kID0gc3RycGJyayggc2JlZ2luLCBjdCk7Ci0JaWYgKHNlbmQgJiYgKnNlbmQgIT0gJ1wwJykKLQkJKnNlbmQrKyA9ICdcMCc7Ci0KLQlfX3JzdHJ0b2sgPSBzZW5kOwotCi0JcmV0dXJuIChzYmVnaW4pOwotfQotCi0vKioKLSAqIGRlbGltaXRjbnQgLSByZXR1cm4gdGhlIGNvdW50IG9mIGEgZ2l2ZW4gZGVsaW1pdGVyIGluIGEgZ2l2ZW4gc3RyaW5nLgotICogQHM6IFRoZSBzdHJpbmcgdG8gYmUgc2VhcmNoZWQuCi0gKiBAY3Q6IFRoZSBkZWxpbWl0ZXIgdG8gc2VhcmNoIGZvci4KLSAqIE5vdGljZSA6IFdlIHN1cHBvc2UgdGhlIGRlbGltaXRlciBpcyBhIHNpbmdsZS1jaGFyIHN0cmluZyhmb3IgZXhhbXBsZSA6ICI7IikuCi0gKi8KLUlOVCBkZWxpbWl0Y250KFBTVFJJTkcgcyxQU1RSSU5HIGN0KQotewotCUlOVCBjb3VudCA9IDA7Ci0JLyogcG9pbnQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSAqLwotCVBTVFJJTkcgdG9rZW4gPSBzOwotCi0JZm9yICggOzsgKQotCXsKLQkJdG9rZW4gPSBzdHJwYnJrKHRva2VuLCBjdCk7IC8qIHNlYXJjaCBmb3IgZGVsaW1pdGVycyAqLwotCi0gICAgICAgIGlmICggdG9rZW4gPT0gTlVMTCApCi0JCXsKLQkJCS8qIGFkdmFuY2VkIHRvIHRoZSB0ZXJtaW5hdGluZyBudWxsIGNoYXJhY3RlciAqLwotCQkJYnJlYWs7Ci0JCX0KLQkJLyogc2tpcCB0aGUgZGVsaW1pdGVyICovCi0JICAgICsrdG9rZW47Ci0KLQkJLyoKLQkJICogUHJpbnQgdGhlIGZvdW5kIHRleHQ6IHVzZSBsZW4gd2l0aCAlLipzIHRvIHNwZWNpZnkgZmllbGQgd2lkdGguCi0JCSAqLwotCi0JCS8qIGFjY3VtdWxhdGUgZGVsaW1pdGVyIGNvdW50ICovCi0JICAgICsrY291bnQ7Ci0JfQotICAgIHJldHVybiBjb3VudDsKLX0KLQotLyoKLSAgKiBjb252ZXJ0cyB0aGUgSW50ZXJuZXQgaG9zdCBhZGRyZXNzIGZyb20gdGhlIHN0YW5kYXJkIG51bWJlcnMtYW5kLWRvdHMgbm90YXRpb24KLSAgKiBpbnRvIGJpbmFyeSBkYXRhLgotICAqIHJldHVybnMgbm9uemVybyBpZiB0aGUgYWRkcmVzcyBpcyB2YWxpZCwgemVybyBpZiBub3QuCi0gICovCi1pbnQgcnRpbmV0X2F0b24oUFNUUklORyBjcCwgdW5zaWduZWQgaW50ICphZGRyKQotewotCXVuc2lnbmVkIGludAl2YWw7Ci0JaW50CQliYXNlLCBuOwotCVNUUklORwkJYzsKLQl1bnNpZ25lZCBpbnQgICAgcGFydHNbNF07Ci0JdW5zaWduZWQgaW50ICAgICpwcCA9IHBhcnRzOwotCi0JZm9yICg7OykKLSAgICB7Ci0gICAgICAgICAvKgotICAgICAgICAgICogQ29sbGVjdCBudW1iZXIgdXAgdG8gYGAuJycuCi0gICAgICAgICAgKiBWYWx1ZXMgYXJlIHNwZWNpZmllZCBhcyBmb3IgQzoKLSAgICAgICAgICAqCTB4PWhleCwgMD1vY3RhbCwgb3RoZXI9ZGVjaW1hbC4KLSAgICAgICAgICAqLwotICAgICAgICAgdmFsID0gMDsKLSAgICAgICAgIGJhc2UgPSAxMDsKLSAgICAgICAgIGlmICgqY3AgPT0gJzAnKQotICAgICAgICAgewotICAgICAgICAgICAgIGlmICgqKytjcCA9PSAneCcgfHwgKmNwID09ICdYJykKLSAgICAgICAgICAgICAgICAgYmFzZSA9IDE2LCBjcCsrOwotICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgYmFzZSA9IDg7Ci0gICAgICAgICB9Ci0gICAgICAgICB3aGlsZSAoKGMgPSAqY3ApICE9ICdcMCcpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAgaWYgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpIGMpKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgdmFsID0gKHZhbCAqIGJhc2UpICsgKGMgLSAnMCcpOwotICAgICAgICAgICAgICAgICBjcCsrOwotICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgaWYgKGJhc2UgPT0gMTYgJiYgaXN4ZGlnaXQoKHVuc2lnbmVkIGNoYXIpIGMpKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgdmFsID0gKHZhbCA8PCA0KSArCi0gICAgICAgICAgICAgICAgICAgICAoYyArIDEwIC0gKGlzbG93ZXIoKHVuc2lnbmVkIGNoYXIpIGMpID8gJ2EnIDogJ0EnKSk7Ci0gICAgICAgICAgICAgICAgIGNwKys7Ci0gICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmICgqY3AgPT0gJy4nKQotICAgICAgICAgewotICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICogSW50ZXJuZXQgZm9ybWF0OiBhLmIuYy5kIGEuYi5jICAgKHdpdGggYyB0cmVhdGVkIGFzIDE2LWJpdHMpCi0gICAgICAgICAgICAgICogYS5iICAgICAod2l0aCBiIHRyZWF0ZWQgYXMgMjQgYml0cykKLSAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICBpZiAocHAgPj0gcGFydHMgKyAzIHx8IHZhbCA+IDB4ZmYpCi0gICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICpwcCsrID0gdmFsLCBjcCsrOwotICAgICAgICAgfQotICAgICAgICAgZWxzZQotICAgICAgICAgICAgIGJyZWFrOwotICAgICB9Ci0KLSAgICAgLyoKLSAgICAgICogQ2hlY2sgZm9yIHRyYWlsaW5nIGp1bmsuCi0gICAgICAqLwotICAgICB3aGlsZSAoKmNwKQotICAgICAgICAgaWYgKCFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSAqY3ArKykpCi0gICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgLyoKLSAgICAgICogQ29uY29jdCB0aGUgYWRkcmVzcyBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBwYXJ0cyBzcGVjaWZpZWQuCi0gICAgICAqLwotICAgICBuID0gcHAgLSBwYXJ0cyArIDE7Ci0gICAgIHN3aXRjaCAobikKLSAgICAgewotCi0gICAgICAgICBjYXNlIDE6ICAgICAgICAgLyogYSAtLSAzMiBiaXRzICovCi0gICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgIGNhc2UgMjogICAgICAgICAvKiBhLmIgLS0gOC4yNCBiaXRzICovCi0gICAgICAgICAgICAgaWYgKHZhbCA+IDB4ZmZmZmZmKQotICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICB2YWwgfD0gcGFydHNbMF0gPDwgMjQ7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgIGNhc2UgMzogICAgICAgICAvKiBhLmIuYyAtLSA4LjguMTYgYml0cyAqLwotICAgICAgICAgICAgIGlmICh2YWwgPiAweGZmZmYpCi0gICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgIHZhbCB8PSAocGFydHNbMF0gPDwgMjQpIHwgKHBhcnRzWzFdIDw8IDE2KTsKLSAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgY2FzZSA0OiAgICAgICAgIC8qIGEuYi5jLmQgLS0gOC44LjguOCBiaXRzICovCi0gICAgICAgICAgICAgaWYgKHZhbCA+IDB4ZmYpCi0gICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgIHZhbCB8PSAocGFydHNbMF0gPDwgMjQpIHwgKHBhcnRzWzFdIDw8IDE2KSB8IChwYXJ0c1syXSA8PCA4KTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgfQotCi0gICAgICphZGRyID0gaHRvbmwodmFsKTsKLSAgICAgcmV0dXJuIDE7Ci0KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIFJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgICAgIEZpbmQga2V5IHNlY3Rpb24gZm9yIEdldCBrZXkgcGFyYW1ldGVyLgotCi0gICAgQXJndW1lbnRzOgotICAgICAgICBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHN0YXJ0IGZpbmQgdGhlIGtleSBzZWN0aW9uCi0gICAgICAgIHNlY3Rpb24gICAgICAgICAgICAgICAgICAgICB0aGUga2V5IG9mIHRoZSBzZWNpb24gdG8gYmUgZmluZAotCi0gICAgUmV0dXJuIFZhbHVlOgotICAgICAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgRmFpbAotICAgICAgICBPdGhlcnMgICAgICAgICAgICAgICAgICAgICAgU3VjY2VzcwotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVBTVFJJTkcgUlRNUEZpbmRTZWN0aW9uKAotICAgIElOICBQU1RSSU5HICAgYnVmZmVyKQotewotICAgIFNUUklORyB0ZW1wX2J1ZlszMl07Ci0gICAgUFNUUklORyAgcHRyOwotCi0gICAgc3RyY3B5KHRlbXBfYnVmLCAiRGVmYXVsdCIpOwotCi0gICAgaWYoKHB0ciA9IHJ0c3Ryc3RyKGJ1ZmZlciwgdGVtcF9idWYpKSAhPSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIChwdHIrc3RybGVuKCJcbiIpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgotICAgICAgICBHZXQga2V5IHBhcmFtZXRlci4KLQotICAgIEFyZ3VtZW50czoKLQlrZXkJCQlQb2ludGVyIHRvIGtleSBzdHJpbmcKLQlkZXN0CQkJUG9pbnRlciB0byBkZXN0aW5hdGlvbgotCWRlc3RzaXplCQlUaGUgZGF0YXNpemUgb2YgdGhlIGRlc3RpbmF0aW9uCi0JYnVmZmVyCQlQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gc3RhcnQgZmluZCB0aGUga2V5Ci0JYlRyaW1TcGFjZQlTZXQgdHJ1ZSBpZiB5b3Ugd2FudCB0byBzdHJpcCB0aGUgc3BhY2UgY2hhcmFjdGVyIG9mIHRoZSByZXN1bHQgcGF0dGVybgotCi0gICAgUmV0dXJuIFZhbHVlOgotICAgICAgICBUUlVFICAgICAgICAgICAgICAgICAgICAgICAgU3VjY2VzcwotICAgICAgICBGQUxTRSAgICAgICAgICAgICAgICAgICAgICAgRmFpbAotCi0gICAgTm90ZToKLQlUaGlzIHJvdXRpbmUgZ2V0IHRoZSB2YWx1ZSB3aXRoIHRoZSBtYXRjaGVkIGtleSAoY2FzZSBjYXNlLXNlbnNpdGl2ZSkKLQlGb3IgU1NJRCBhbmQgc2VjdXJpdHkga2V5IHJlbGF0ZWQgcGFyYW1ldGVycywgd2UgU0hBTEwgTk9UIHRyaW0gdGhlIHNwYWNlKCcgJykgY2hhcmFjdGVyLgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBSVE1QR2V0S2V5UGFyYW1ldGVyKAotICAgIElOIFBTVFJJTkcga2V5LAotICAgIE9VVCBQU1RSSU5HIGRlc3QsCi0gICAgSU4gSU5UIGRlc3RzaXplLAotICAgIElOIFBTVFJJTkcgYnVmZmVyLAotICAgIElOIEJPT0xFQU4gYlRyaW1TcGFjZSkKLXsKLQlQU1RSSU5HIHBNZW1CdWYsIHRlbXBfYnVmMSA9IE5VTEwsIHRlbXBfYnVmMiA9IE5VTEw7Ci0JUFNUUklORyBzdGFydF9wdHIsIGVuZF9wdHI7Ci0JUFNUUklORyBwdHI7Ci0JUFNUUklORyBvZmZzZXQgPSBOVUxMOwotCUlOVCAgbGVuLCBrZXlMZW47Ci0KLQotCWtleUxlbiA9IHN0cmxlbihrZXkpOwotCW9zX2FsbG9jX21lbShOVUxMLCAoUFVDSEFSICopJnBNZW1CdWYsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSAgKiAyKTsKLQlpZiAocE1lbUJ1ZiA9PSBOVUxMKQotCQlyZXR1cm4gKEZBTFNFKTsKLQotCW1lbXNldChwTWVtQnVmLCAwLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUgKiAyKTsKLQl0ZW1wX2J1ZjEgPSBwTWVtQnVmOwotCXRlbXBfYnVmMiA9IChQU1RSSU5HKShwTWVtQnVmICsgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKLQotCi0JLy9maW5kIHNlY3Rpb24KLQlpZigob2Zmc2V0ID0gUlRNUEZpbmRTZWN0aW9uKGJ1ZmZlcikpID09IE5VTEwpCi0JewotCQlvc19mcmVlX21lbShOVUxMLCAoUFVDSEFSKXBNZW1CdWYpOwotCQlyZXR1cm4gKEZBTFNFKTsKLQl9Ci0KLQlzdHJjcHkodGVtcF9idWYxLCAiXG4iKTsKLQlzdHJjYXQodGVtcF9idWYxLCBrZXkpOwotCXN0cmNhdCh0ZW1wX2J1ZjEsICI9Iik7Ci0KLQkvL3NlYXJjaCBrZXkKLQlpZigoc3RhcnRfcHRyPXJ0c3Ryc3RyKG9mZnNldCwgdGVtcF9idWYxKSkgPT0gTlVMTCkKLQl7Ci0JCW9zX2ZyZWVfbWVtKE5VTEwsIChQVUNIQVIpcE1lbUJ1Zik7Ci0JCXJldHVybiAoRkFMU0UpOwotCX0KLQotCXN0YXJ0X3B0ciArPSBzdHJsZW4oIlxuIik7Ci0JaWYoKGVuZF9wdHIgPSBydHN0cnN0cihzdGFydF9wdHIsICJcbiIpKT09TlVMTCkKLQkJZW5kX3B0ciA9IHN0YXJ0X3B0citzdHJsZW4oc3RhcnRfcHRyKTsKLQotCWlmIChlbmRfcHRyPHN0YXJ0X3B0cikKLQl7Ci0JCW9zX2ZyZWVfbWVtKE5VTEwsIChQVUNIQVIpcE1lbUJ1Zik7Ci0JCXJldHVybiAoRkFMU0UpOwotCX0KLQotCU5kaXNNb3ZlTWVtb3J5KHRlbXBfYnVmMiwgc3RhcnRfcHRyLCBlbmRfcHRyLXN0YXJ0X3B0cik7Ci0JdGVtcF9idWYyW2VuZF9wdHItc3RhcnRfcHRyXT0nXDAnOwotCWlmKChzdGFydF9wdHI9cnRzdHJzdHIodGVtcF9idWYyLCAiPSIpKSA9PSBOVUxMKQotCXsKLQkJb3NfZnJlZV9tZW0oTlVMTCwgKFBVQ0hBUilwTWVtQnVmKTsKLQkJcmV0dXJuIChGQUxTRSk7Ci0JfQotCXB0ciA9IChzdGFydF9wdHIgKzEpOwotCS8vdHJpbSBzcGVjaWFsIGNoYXJhY3RlcnMsIGkuZS4sICBUQUIgb3Igc3BhY2UKLQl3aGlsZSgqc3RhcnRfcHRyICE9IDB4MDApCi0JewotCQlpZiggKCgqcHRyID09ICcgJykgJiYgYlRyaW1TcGFjZSkgfHwgKCpwdHIgPT0gJ1x0JykgKQotCQkJcHRyKys7Ci0JCWVsc2UKLQkJCWJyZWFrOwotCX0KLQlsZW4gPSBzdHJsZW4oc3RhcnRfcHRyKTsKLQotCW1lbXNldChkZXN0LCAweDAwLCBkZXN0c2l6ZSk7Ci0Jc3RybmNweShkZXN0LCBwdHIsICgobGVuID49IGRlc3RzaXplKSA/IGRlc3RzaXplOiBsZW4pKTsKLQotCW9zX2ZyZWVfbWVtKE5VTEwsIChQVUNIQVIpcE1lbUJ1Zik7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICAgICAgR2V0IG11bHRpcGxlIGtleSBwYXJhbWV0ZXIuCi0KLSAgICBBcmd1bWVudHM6Ci0gICAgICAgIGtleSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGtleSBzdHJpbmcKLSAgICAgICAgZGVzdCAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gZGVzdGluYXRpb24KLSAgICAgICAgZGVzdHNpemUgICAgICAgICAgICAgICAgICAgIFRoZSBkYXRhc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24KLSAgICAgICAgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBzdGFydCBmaW5kIHRoZSBrZXkKLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgVFJVRSAgICAgICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MKLSAgICAgICAgRkFMU0UgICAgICAgICAgICAgICAgICAgICAgIEZhaWwKLQotICAgIE5vdGU6Ci0gICAgICAgIFRoaXMgcm91dGluZSBnZXQgdGhlIHZhbHVlIHdpdGggdGhlIG1hdGNoZWQga2V5IChjYXNlIGNhc2Utc2Vuc2l0aXZlKQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBSVE1QR2V0S2V5UGFyYW1ldGVyV2l0aE9mZnNldCgKLSAgICBJTiAgUFNUUklORyAgIGtleSwKLSAgICBPVVQgUFNUUklORyAgIGRlc3QsCi0gICAgT1VUCVVTSE9SVAkqZW5kX29mZnNldCwKLSAgICBJTiAgSU5UICAgICBkZXN0c2l6ZSwKLSAgICBJTiAgUFNUUklORyAgIGJ1ZmZlciwKLSAgICBJTglCT09MRUFOCWJUcmltU3BhY2UpCi17Ci0gICAgUFNUUklORyB0ZW1wX2J1ZjEgPSBOVUxMOwotICAgIFBTVFJJTkcgdGVtcF9idWYyID0gTlVMTDsKLSAgICBQU1RSSU5HIHN0YXJ0X3B0cjsKLSAgICBQU1RSSU5HIGVuZF9wdHI7Ci0gICAgUFNUUklORyBwdHI7Ci0gICAgUFNUUklORyBvZmZzZXQgPSAwOwotICAgIElOVCAgbGVuOwotCi0JaWYgKCplbmRfb2Zmc2V0ID49IE1BWF9JTklfQlVGRkVSX1NJWkUpCi0JCXJldHVybiAoRkFMU0UpOwotCi0Jb3NfYWxsb2NfbWVtKE5VTEwsIChQVUNIQVIgKikmdGVtcF9idWYxLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOwotCi0JaWYodGVtcF9idWYxID09IE5VTEwpCi0gICAgICAgIHJldHVybiAoRkFMU0UpOwotCi0Jb3NfYWxsb2NfbWVtKE5VTEwsIChQVUNIQVIgKikmdGVtcF9idWYyLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOwotCWlmKHRlbXBfYnVmMiA9PSBOVUxMKQotCXsKLQkJb3NfZnJlZV9tZW0oTlVMTCwgKFBVQ0hBUil0ZW1wX2J1ZjEpOwotICAgICAgICByZXR1cm4gKEZBTFNFKTsKLQl9Ci0KLSAgICAvL2ZpbmQgc2VjdGlvbgotCWlmKCplbmRfb2Zmc2V0ID09IDApCi0gICAgewotCQlpZiAoKG9mZnNldCA9IFJUTVBGaW5kU2VjdGlvbihidWZmZXIpKSA9PSBOVUxMKQotCQl7Ci0JCQlvc19mcmVlX21lbShOVUxMLCAoUFVDSEFSKXRlbXBfYnVmMSk7Ci0JCW9zX2ZyZWVfbWVtKE5VTEwsIChQVUNIQVIpdGVtcF9idWYyKTsKLQkgICAgcmV0dXJuIChGQUxTRSk7Ci0JCX0KLSAgICB9Ci0JZWxzZQotCQlvZmZzZXQgPSBidWZmZXIgKyAoKmVuZF9vZmZzZXQpOwotCi0gICAgc3RyY3B5KHRlbXBfYnVmMSwgIlxuIik7Ci0gICAgc3RyY2F0KHRlbXBfYnVmMSwga2V5KTsKLSAgICBzdHJjYXQodGVtcF9idWYxLCAiPSIpOwotCi0gICAgLy9zZWFyY2gga2V5Ci0gICAgaWYoKHN0YXJ0X3B0cj1ydHN0cnN0cihvZmZzZXQsIHRlbXBfYnVmMSkpPT1OVUxMKQotICAgIHsKLQkJb3NfZnJlZV9tZW0oTlVMTCwgKFBVQ0hBUil0ZW1wX2J1ZjEpOwotCW9zX2ZyZWVfbWVtKE5VTEwsIChQVUNIQVIpdGVtcF9idWYyKTsKLSAgICAgICAgcmV0dXJuIChGQUxTRSk7Ci0gICAgfQotCi0gICAgc3RhcnRfcHRyKz1zdHJsZW4oIlxuIik7Ci0gICAgaWYoKGVuZF9wdHI9cnRzdHJzdHIoc3RhcnRfcHRyLCAiXG4iKSk9PU5VTEwpCi0gICAgICAgZW5kX3B0cj1zdGFydF9wdHIrc3RybGVuKHN0YXJ0X3B0cik7Ci0KLSAgICBpZiAoZW5kX3B0cjxzdGFydF9wdHIpCi0gICAgewotCQlvc19mcmVlX21lbShOVUxMLCAoUFVDSEFSKXRlbXBfYnVmMSk7Ci0Jb3NfZnJlZV9tZW0oTlVMTCwgKFBVQ0hBUil0ZW1wX2J1ZjIpOwotICAgICAgICByZXR1cm4gKEZBTFNFKTsKLSAgICB9Ci0KLQkqZW5kX29mZnNldCA9IGVuZF9wdHIgLSBidWZmZXI7Ci0KLSAgICBOZGlzTW92ZU1lbW9yeSh0ZW1wX2J1ZjIsIHN0YXJ0X3B0ciwgZW5kX3B0ci1zdGFydF9wdHIpOwotICAgIHRlbXBfYnVmMltlbmRfcHRyLXN0YXJ0X3B0cl09J1wwJzsKLSAgICBsZW4gPSBzdHJsZW4odGVtcF9idWYyKTsKLSAgICBzdHJjcHkodGVtcF9idWYxLCB0ZW1wX2J1ZjIpOwotICAgIGlmKChzdGFydF9wdHI9cnRzdHJzdHIodGVtcF9idWYxLCAiPSIpKSA9PSBOVUxMKQotICAgIHsKLQkJb3NfZnJlZV9tZW0oTlVMTCwgKFBVQ0hBUil0ZW1wX2J1ZjEpOwotCW9zX2ZyZWVfbWVtKE5VTEwsIChQVUNIQVIpdGVtcF9idWYyKTsKLSAgICAgICAgcmV0dXJuIChGQUxTRSk7Ci0gICAgfQotCi0gICAgc3RyY3B5KHRlbXBfYnVmMiwgc3RhcnRfcHRyKzEpOwotICAgIHB0ciA9IHRlbXBfYnVmMjsKLSAgICAvL3RyaW0gc3BhY2Ugb3IgdGFiCi0gICAgd2hpbGUoKnB0ciAhPSAweDAwKQotICAgIHsKLSAgICAgICAgaWYoKGJUcmltU3BhY2UgJiYgKCpwdHIgPT0gJyAnKSkgfHwgKCpwdHIgPT0gJ1x0JykgKQotICAgICAgICAgICAgcHRyKys7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgbGVuID0gc3RybGVuKHB0cik7Ci0gICAgbWVtc2V0KGRlc3QsIDB4MDAsIGRlc3RzaXplKTsKLSAgICBzdHJuY3B5KGRlc3QsIHB0ciwgbGVuID49IGRlc3RzaXplID8gIGRlc3RzaXplOiBsZW4pOwotCi0Jb3NfZnJlZV9tZW0oTlVMTCwgKFBVQ0hBUil0ZW1wX2J1ZjEpOwotICAgIG9zX2ZyZWVfbWVtKE5VTEwsIChQVUNIQVIpdGVtcF9idWYyKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi1zdGF0aWMgaW50IHJ0bXBfcGFyc2Vfa2V5X2J1ZmZlcl9mcm9tX2ZpbGUoSU4gIFBSVE1QX0FEQVBURVIgcEFkLElOICBQU1RSSU5HIGJ1ZmZlcixJTiAgVUxPTkcgS2V5VHlwZSxJTiAgSU5UIEJTU0lkeCxJTiAgSU5UIEtleUlkeCkKLXsKLQlQU1RSSU5HCQlrZXlidWZmOwotCS8vSU5UCQkJaSA9IEJTU0lkeCwgaWR4ID0gS2V5SWR4LCByZXRWYWw7Ci0JVUxPTkcJCUtleUxlbjsKLQkvL1VDSEFSCQlDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0JQ0lQSEVSX0tFWQkqcFNoYXJlZEtleTsKLQotCWtleWJ1ZmYgPSBidWZmZXI7Ci0JS2V5TGVuID0gc3RybGVuKGtleWJ1ZmYpOwotCXBTaGFyZWRLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTSWR4XVtLZXlJZHhdOwotCi0JaWYoKChLZXlUeXBlICE9IDApICYmIChLZXlUeXBlICE9IDEpKSB8fAotCSAgICAoKEtleVR5cGUgPT0gMCkgJiYgKEtleUxlbiAhPSAxMCkgJiYgKEtleUxlbiAhPSAyNikpIHx8Ci0JICAgICgoS2V5VHlwZT09IDEpICYmIChLZXlMZW4gIT0gNSkgJiYgKEtleUxlbiAhPSAxMykpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiS2V5JWRTdHIgaXMgSW52YWxpZCBrZXkgbGVuZ3RoKCVsZCkgb3IgVHlwZSglbGQpXG4iLAotCQkJCQkJCQlLZXlJZHgrMSwgS2V5TGVuLCBLZXlUeXBlKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0JZWxzZQotCXsKLQkJcmV0dXJuIFJUX0NmZ1NldFdlcEtleShwQWQsIGJ1ZmZlciwgcFNoYXJlZEtleSwgS2V5SWR4KTsKLQl9Ci0KLX0KLQotCi1zdGF0aWMgdm9pZCBydG1wX3JlYWRfa2V5X3Bhcm1zX2Zyb21fZmlsZShJTiAgUFJUTVBfQURBUFRFUiBwQWQsIFBTVFJJTkcgdG1wYnVmLCBQU1RSSU5HIGJ1ZmZlcikKLXsKLQlTVFJJTkcJCXRva19zdHJbMTZdOwotCVBTVFJJTkcJCW1hY3B0cjsKLQlJTlQJCQlpID0gMCwgaWR4OwotCVVMT05HCQlLZXlUeXBlW01BWF9NQlNTSURfTlVNXTsKLQlVTE9ORwkJS2V5SWR4OwotCi0JTmRpc1plcm9NZW1vcnkoS2V5VHlwZSwgc2l6ZW9mKEtleVR5cGUpKTsKLQotCS8vRGVmYXVsdEtleUlECi0JaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRGVmYXVsdEtleUlEIiwgdG1wYnVmLCAyNSwgYnVmZmVyLCBUUlVFKSkKLQl7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJS2V5SWR4ID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQkJCWlmKChLZXlJZHggPj0gMSApICYmIChLZXlJZHggPD0gNCkpCi0JCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSAoS2V5SWR4IC0gMSk7Ci0JCQllbHNlCi0JCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gMDsKLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRGVmYXVsdEtleUlEKDB+Myk9JWRcbiIsIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOwotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JfQotCi0KLQlmb3IgKGlkeCA9IDA7IGlkeCA8IDQ7IGlkeCsrKQotCXsKLQkJc3ByaW50Zih0b2tfc3RyLCAiS2V5JWRUeXBlIiwgaWR4ICsgMSk7Ci0JCS8vS2V5MVR5cGUKLQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIodG9rX3N0ciwgdG1wYnVmLCAxMjgsIGJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJICAgIGZvciAoaSA9IDAsIG1hY3B0ciA9IHJzdHJ0b2sodG1wYnVmLCI7Iik7IG1hY3B0cjsgbWFjcHRyID0gcnN0cnRvayhOVUxMLCI7IiksIGkrKykKLQkJICAgIHsKLQkJCQkvKgotCQkJCQlkbyBzYW5pdHkgY2hlY2sgZm9yIEtleVR5cGUgbGVuZ3RoOwotCQkJCQlvciBpbiBzdGF0aW9uIG1vZGUsIHRoZSBLZXlUeXBlIGxlbmd0aCA+IDEsCi0JCQkJCXRoZSBjb2RlIHdpbGwgb3ZlcndyaXRlIHRoZSBzdGFjayBvZiBjYWxsZXIKLQkJCQkJKFJUTVBTZXRQcm9maWxlUGFyYW1ldGVycykgYW5kIGNhdXNlIHNyY2J1ZiA9IE5VTEwKLQkJCQkqLwotCQkJCWlmIChpIDwgTUFYX01CU1NJRF9OVU0pCi0JCQkJCUtleVR5cGVbaV0gPSBzaW1wbGVfc3RydG9sKG1hY3B0ciwgMCwgMTApOwotCQkgICAgfQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJewotCQkJCXNwcmludGYodG9rX3N0ciwgIktleSVkU3RyIiwgaWR4ICsgMSk7Ci0JCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIodG9rX3N0ciwgdG1wYnVmLCAxMjgsIGJ1ZmZlciwgRkFMU0UpKQotCQkJCXsKLQkJCQkJcnRtcF9wYXJzZV9rZXlfYnVmZmVyX2Zyb21fZmlsZShwQWQsIHRtcGJ1ZiwgS2V5VHlwZVtCU1MwXSwgQlNTMCwgaWR4KTsKLQkJCQl9Ci0JCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCX0KLQl9Ci19Ci0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1zdGF0aWMgdm9pZCBydG1wX3JlYWRfc3RhX3dtbV9wYXJtc19mcm9tX2ZpbGUoSU4gIFBSVE1QX0FEQVBURVIgcEFkLCBjaGFyICp0bXBidWYsIGNoYXIgKmJ1ZmZlcikKLXsKLQlQU1RSSU5HCQkJCQltYWNwdHI7Ci0JSU5UCQkJCQkJaT0wOwotCUJPT0xFQU4JCQkJCWJXbW1FbmFibGUgPSBGQUxTRTsKLQotCS8vV21tQ2FwYWJsZQotCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIldtbUNhcGFibGUiLCB0bXBidWYsIDMyLCBidWZmZXIsIFRSVUUpKQotCXsKLQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKSAvL0VuYWJsZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9IFRSVUU7Ci0JCQliV21tRW5hYmxlID0gVFJVRTsKLQkJfQotCQllbHNlIC8vRGlzYWJsZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9IEZBTFNFOwotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV21tQ2FwYWJsZT0lZFxuIiwgcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpKTsKLQl9Ci0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkvL0RMU0NhcGFibGUKLQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJETFNDYXBhYmxlIiwgdG1wYnVmLCAzMiwgYnVmZmVyLCBUUlVFKSkKLQl7Ci0JCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlID0gVFJVRTsKLQkJfQotCQllbHNlIC8vRGlzYWJsZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSA9IEZBTFNFOwotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiYkRMU0NhcGFibGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKSk7Ci0JfQotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCi0JLy9BY2tQb2xpY3kgZm9yIEFDX0JLLCBBQ19CRSwgQUNfVkksIEFDX1ZPCi0JaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQWNrUG9saWN5IiwgdG1wYnVmLCAzMiwgYnVmZmVyLCBUUlVFKSkKLQl7Ci0JCWZvciAoaSA9IDAsIG1hY3B0ciA9IHJzdHJ0b2sodG1wYnVmLCI7Iik7IG1hY3B0cjsgbWFjcHRyID0gcnN0cnRvayhOVUxMLCI7IiksIGkrKykKLQkJewotCQkJcEFkLT5Db21tb25DZmcuQWNrUG9saWN5W2ldID0gKFVDSEFSKXNpbXBsZV9zdHJ0b2wobWFjcHRyLCAwLCAxMCk7Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFja1BvbGljeVslZF09JWRcbiIsIGksIHBBZC0+Q29tbW9uQ2ZnLkFja1BvbGljeVtpXSkpOwotCQl9Ci0JfQotCi0JaWYgKGJXbW1FbmFibGUpCi0JewotCQkvL0FQU0RDYXBhYmxlCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkFQU0RDYXBhYmxlIiwgdG1wYnVmLCAxMCwgYnVmZmVyLCBUUlVFKSkKLQkJewotCQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKSAgLy9FbmFibGUKLQkJCQlwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgPSBUUlVFOwotCQkJZWxzZQotCQkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSA9IEZBTFNFOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBUFNEQ2FwYWJsZT0lZFxuIiwgcEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlKSk7Ci0JCX0KLQotCQkvL01heFNQTGVuZ3RoCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIk1heFNQTGVuZ3RoIiwgdG1wYnVmLCAxMCwgYnVmZmVyLCBUUlVFKSkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuTWF4U1BMZW5ndGggPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYXhTUExlbmd0aD0lZFxuIiwgcEFkLT5Db21tb25DZmcuTWF4U1BMZW5ndGgpKTsKLQkJfQotCi0JCS8vQVBTREFDIGZvciBBQ19CRSwgQUNfQkssIEFDX1ZJLCBBQ19WTwotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJBUFNEQUMiLCB0bXBidWYsIDMyLCBidWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlCT09MRUFOIGFwc2RfYWNbNF07Ci0KLQkJCWZvciAoaSA9IDAsIG1hY3B0ciA9IHJzdHJ0b2sodG1wYnVmLCI7Iik7IG1hY3B0cjsgbWFjcHRyID0gcnN0cnRvayhOVUxMLCI7IiksIGkrKykKLQkJCXsKLQkJCQlhcHNkX2FjW2ldID0gKEJPT0xFQU4pc2ltcGxlX3N0cnRvbChtYWNwdHIsIDAsIDEwKTsKLQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFQU0RBQyVkICAlZFxuIiwgaSwgIGFwc2RfYWNbaV0pKTsKLQkJCX0KLQotCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRSA9IGFwc2RfYWNbMF07Ci0JCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLID0gYXBzZF9hY1sxXTsKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgPSBhcHNkX2FjWzJdOwotCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTyA9IGFwc2RfYWNbM107Ci0KLQkJCXBBZC0+Q29tbW9uQ2ZnLmJBQ01BUFNEVHJbMF0gPSBhcHNkX2FjWzBdOwotCQkJcEFkLT5Db21tb25DZmcuYkFDTUFQU0RUclsxXSA9IGFwc2RfYWNbMV07Ci0JCQlwQWQtPkNvbW1vbkNmZy5iQUNNQVBTRFRyWzJdID0gYXBzZF9hY1syXTsKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJBQ01BUFNEVHJbM10gPSBhcHNkX2FjWzNdOwotCQl9Ci0JfQotCi19Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotc3RhdGljIHZvaWQgSFRQYXJhbWV0ZXJzSG9vaygKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglQU1RSSU5HCQkgIHBWYWx1ZVN0ciwKLQlJTglQU1RSSU5HCQkgIHBJbnB1dCkKLXsKLQotCWxvbmcgVmFsdWU7Ci0KLSAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfUFJPVEVDVCIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCwgVFJVRSkpCi0gICAgewotICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0gICAgICAgIGlmIChWYWx1ZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0ID0gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0ID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogUHJvdGVjdGlvbiAgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7Ci0gICAgfQotCi0gICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX01JTU9QU0VuYWJsZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCwgVFJVRSkpCi0gICAgewotICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0gICAgICAgIGlmIChWYWx1ZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlID0gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTUlNT1BTRW5hYmxlICA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKLSAgICB9Ci0KLQotICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9NSU1PUFNNb2RlIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0LCBUUlVFKSkKLSAgICB7Ci0gICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLSAgICAgICAgaWYgKFZhbHVlID4gTU1QU19FTkFCTEUpCi0gICAgICAgIHsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IE1NUFNfRU5BQkxFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy9UT0RPOiBhZGQgbWltbyBwb3dlciBzYXZpbmcgbWVjaGFuaXNtCi0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBNTVBTX0VOQUJMRTsKLQkJCS8vcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gVmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1JTU9QUyBNb2RlICA9ICVkXG4iLCAoSU5UKSBWYWx1ZSkpOwotICAgIH0KLQotICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9CQURlY2xpbmUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQsIFRSVUUpKQotICAgIHsKLSAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotICAgICAgICBpZiAoVmFsdWUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9IEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEJBIERlY2xpbmUgID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOwotICAgIH0KLQotCi0gICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0Rpc2FibGVSZW9yZGVyaW5nIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0LCBUUlVFKSkKLSAgICB7Ci0gICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLSAgICAgICAgaWYgKFZhbHVlID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9IEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogRGlzYWJsZVJlb3JkZXJpbmcgID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOwotICAgIH0KLQotICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9BdXRvQkEiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQsIFRSVUUpKQotICAgIHsKLSAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotICAgICAgICBpZiAoVmFsdWUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IEZBTFNFOwotCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9IEJBX05PVFVTRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBUUlVFOwotCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9IElNTUVEX0JBOwotICAgICAgICB9Ci0gICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBOwotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogQXV0byBCQSAgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7Ci0gICAgfQotCi0JLy8gVHhfK0hUQyBmcmFtZQotICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9IVEMiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQsIFRSVUUpKQotCXsKLQkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotCQlpZiAoVmFsdWUgPT0gMCkKLQkJewotCQkJcEFkLT5IVENFbmFibGUgPSBGQUxTRTsKLQkJfQotCQllbHNlCi0JCXsKLSAgICAgICAgICAgIHBBZC0+SFRDRW5hYmxlID0gVFJVRTsKLQkJfQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogVHggK0hUQyBmcmFtZSA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKLQl9Ci0KLQkvLyBFbmFibGUgSFQgTGluayBBZGFwdGF0aW9uIENvbnRyb2wKLQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfTGlua0FkYXB0IiwgcFZhbHVlU3RyLCAyNSwgcElucHV0LCBUUlVFKSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQkJaWYgKFZhbHVlID09IDApCi0JCXsKLQkJCXBBZC0+YkxpbmtBZGFwdCA9IEZBTFNFOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEFkLT5IVENFbmFibGUgPSBUUlVFOwotCQkJcEFkLT5iTGlua0FkYXB0ID0gVFJVRTsKLQkJfQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTGluayBBZGFwdGF0aW9uIENvbnRyb2wgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUoK0hUQykiKSk7Ci0JfQotCi0JLy8gUmV2ZXJzZSBEaXJlY3Rpb24gTWVjaGFuaXNtCi0gICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX1JERyIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCwgVFJVRSkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0JCWlmIChWYWx1ZSA9PSAwKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5iUmRnID0gRkFMU0U7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iUmRnID0gVFJVRTsKLQkJfQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogUkRHID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlKCtIVEMpIikpOwotCX0KLQotCi0KLQotCS8vIFR4IEEtTVNVRCA/Ci0gICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0FNU0RVIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0LCBUUlVFKSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQkJaWYgKFZhbHVlID09IDApCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSA9IEZBTFNFOwotCQl9Ci0JCWVsc2UKLQkJewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlID0gVFJVRTsKLQkJfQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogVHggQS1NU0RVID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOwotCX0KLQotCS8vIE1QRFUgRGVuc2l0eQotICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9NcGR1RGVuc2l0eSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCwgVFJVRSkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0JCWlmIChWYWx1ZSA8PTcgJiYgVmFsdWUgPj0gMCkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gVmFsdWU7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTVBEVSBEZW5zaXR5ID0gJWRcbiIsIChJTlQpIFZhbHVlKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSA0OwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1QRFUgRGVuc2l0eSA9ICVkIChEZWZhdWx0KVxuIiwgNCkpOwotCQl9Ci0JfQotCi0JLy8gTWF4IFJ4IEJBIFdpbmRvdyBTaXplCi0gICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0JBV2luU2l6ZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCwgVFJVRSkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0KLQkJaWYgKFZhbHVlID49MSAmJiBWYWx1ZSA8PSA2NCkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IFZhbHVlOwotCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IFZhbHVlOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEJBIFdpbmR3IFNpemUgPSAlZFxuIiwgKElOVCkgVmFsdWUpKTsKLQkJfQotCQllbHNlCi0JCXsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSA2NDsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSA2NDsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBCQSBXaW5kdyBTaXplID0gNjQgKERlZnVhbHQpXG4iKSk7Ci0JCX0KLQotCX0KLQotCS8vIEd1YXJkIEludGVydmFsCi0JaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0dJIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0LCBUUlVFKSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQotCQlpZiAoVmFsdWUgPT0gR0lfNDAwKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSA9IEdJXzQwMDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJID0gR0lfODAwOwotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEd1YXJkIEludGVydmFsID0gJXNcbiIsIChWYWx1ZT09R0lfNDAwKSA/ICI0MDAiIDogIjgwMCIgKSk7Ci0JfQotCi0JLy8gSFQgT3BlcmF0aW9uIE1vZGUgOiBNaXhlZCBNb2RlICwgR3JlZW4gRmllbGQKLQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfT3BNb2RlIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0LCBUUlVFKSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQotCQlpZiAoVmFsdWUgPT0gSFRNT0RFX0dGKQotCQl7Ci0KLQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUgID0gSFRNT0RFX0dGOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSAgPSBIVE1PREVfTU07Ci0JCX0KLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogT3BlcmF0ZSBNb2RlID0gJXNcbiIsIChWYWx1ZT09SFRNT0RFX0dGKSA/ICJHcmVlbiBGaWVsZCIgOiAiTWl4ZWQgTW9kZSIgKSk7Ci0JfQotCi0JLy8gRml4ZWQgVHggbW9kZSA6IENDSywgT0ZETQotCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJGaXhlZFR4TW9kZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCwgVFJVRSkpCi0JewotCQlVQ0hBUglmaXhfdHhfbW9kZTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0JCQlmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKLQotCQkJaWYgKHN0cmNtcChwVmFsdWVTdHIsICJPRkRNIikgPT0gMCB8fCBzdHJjbXAocFZhbHVlU3RyLCAib2ZkbSIpID09IDApCi0JCQl7Ci0JCQkJZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfT0ZETTsKLQkJCX0KLQkJCWVsc2UgaWYgKHN0cmNtcChwVmFsdWVTdHIsICJDQ0siKSA9PSAwIHx8IHN0cmNtcChwVmFsdWVTdHIsICJjY2siKSA9PSAwKQotCQkJewotCQkgICAgICAgIGZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX0NDSzsKLQkJCX0KLQkJCWVsc2UgaWYgKHN0cmNtcChwVmFsdWVTdHIsICJIVCIpID09IDAgfHwgc3RyY21wKHBWYWx1ZVN0ciwgImh0IikgPT0gMCkKLQkJCXsKLQkJICAgICAgICBmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0JCQkJLy8gMSA6IENDSwotCQkJCS8vIDIgOiBPRkRNCi0JCQkJLy8gb3RoZXJ3aXNlIDogSFQKLQkJCQlpZiAoVmFsdWUgPT0gRklYRURfVFhNT0RFX0NDSyB8fCBWYWx1ZSA9PSBGSVhFRF9UWE1PREVfT0ZETSkKLQkJCQkJZml4X3R4X21vZGUgPSBWYWx1ZTsKLQkJCQllbHNlCi0JCQkJCWZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX0hUOwotCQl9Ci0KLQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUgPSBmaXhfdHhfbW9kZTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZpeGVkIFR4IE1vZGUgPSAlZFxuIiwgZml4X3R4X21vZGUpKTsKLQotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JfQotCi0KLQkvLyBDaGFubmVsIFdpZHRoCi0JaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0JXIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0LCBUUlVFKSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQotCQlpZiAoVmFsdWUgPT0gQldfNDApCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV180MDsKLQkJfQotCQllbHNlCi0JCXsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV18yMDsKLQkJfQotCi0jaWZkZWYgTUNBU1RfUkFURV9TUEVDSUZJQwotCQlwQWQtPkNvbW1vbkNmZy5NQ2FzdFBoeU1vZGUuZmllbGQuQlcgPSBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlc7Ci0jZW5kaWYgLy8gTUNBU1RfUkFURV9TUEVDSUZJQyAvLwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBDaGFubmVsIFdpZHRoID0gJXNcbiIsIChWYWx1ZT09QldfNDApID8gIjQwIE1IeiIgOiAiMjAgTUh6IiApKTsKLQl9Ci0KLQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfRVhUQ0hBIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0LCBUUlVFKSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQotCQlpZiAoVmFsdWUgPT0gMCkKLQkJewotCi0JCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBICA9IEVYVENIQV9CRUxPVzsKLQkJfQotCQllbHNlCi0JCXsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQUJPVkU7Ci0JCX0KLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogRXh0IENoYW5uZWwgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJCRUxPVyIgOiAiQUJPVkUiICkpOwotCX0KLQotCS8vIE1TQwotCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9NQ1MiLCBwVmFsdWVTdHIsIDUwLCBwSW5wdXQsIFRSVUUpKQotCXsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0JCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0KLS8vCQkJaWYgKChWYWx1ZSA+PSAwICYmIFZhbHVlIDw9IDE1KSB8fCAoVmFsdWUgPT0gMzIpKQotCQkJaWYgKChWYWx1ZSA+PSAwICYmIFZhbHVlIDw9IDIzKSB8fCAoVmFsdWUgPT0gMzIpKSAvLyAzKjMKLQkJewotCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICA9IFZhbHVlOwotCQkJCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1DUyA9ICVkXG4iLCBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUykpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICA9IE1DU19BVVRPOwotCQkJCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTUNTID0gQVVUT1xuIikpOwotCQl9Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCX0KLQotCS8vIFNUQkMKLSAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfU1RCQyIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCwgVFJVRSkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0JCWlmIChWYWx1ZSA9PSBTVEJDX1VTRSkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkMgPSBTVEJDX1VTRTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDID0gU1RCQ19OT05FOwotCQl9Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBTVEJDID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDKSk7Ci0JfQotCi0JLy8gNDBfTWh6X0ludG9sZXJhbnQKLQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfNDBNSFpfSU5UT0xFUkFOVCIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCwgVFJVRSkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0JCWlmIChWYWx1ZSA9PSAwKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5iRm9ydHlfTWh6X0ludG9sZXJhbnQgPSBGQUxTRTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJGb3J0eV9NaHpfSW50b2xlcmFudCA9IFRSVUU7Ci0JCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IDQwTUhaIElOVE9MRVJBTlQgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuYkZvcnR5X01oel9JbnRvbGVyYW50KSk7Ci0JfQotCS8vSFRfVHhTdHJlYW0KLQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9UeFN0cmVhbSIsIHBWYWx1ZVN0ciwgMTAsIHBJbnB1dCwgVFJVRSkpCi0JewotCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCkpCi0JCXsKLQkJCWNhc2UgMToKLQkJCQlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSAyOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzOiAvLyAzKjMKLQkJCWRlZmF1bHQ6Ci0JCQkJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSAzOwotCi0JCQkJaWYgKHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18yODgzX1ZFUlNJT04pCi0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID0gMjsgLy8gb25seSAyIHR4IHN0cmVhbXMgZm9yIFJUMjg2MCBzZXJpZXMKLQkJCQlicmVhazsKLQkJfQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogVHggU3RyZWFtID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtKSk7Ci0JfQotCS8vSFRfUnhTdHJlYW0KLQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9SeFN0cmVhbSIsIHBWYWx1ZVN0ciwgMTAsIHBJbnB1dCwgVFJVRSkpCi0JewotCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCkpCi0JCXsKLQkJCWNhc2UgMToKLQkJCQlwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAyOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzOgotCQkJZGVmYXVsdDoKLQkJCQlwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9IDM7Ci0KLQkJCQlpZiAocEFkLT5NQUNWZXJzaW9uIDwgUkFMSU5LXzI4ODNfVkVSU0lPTikKLQkJCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAyOyAvLyBvbmx5IDIgcnggc3RyZWFtcyBmb3IgUlQyODYwIHNlcmllcwotCQkJCWJyZWFrOwotCQl9Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBSeCBTdHJlYW0gPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUnhTdHJlYW0pKTsKLQl9Ci0JLy8yMDA4LzExLzA1OiBLSCBhZGQgdG8gc3VwcG9ydCBBbnRlbm5hIHBvd2VyLXNhdmluZyBvZiBBUDwtLQotCS8vR3JlZW4gQVAKLQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJHcmVlbkFQIiwgcFZhbHVlU3RyLCAxMCwgcElucHV0LCBUUlVFKSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQkJaWYgKFZhbHVlID09IDApCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJHcmVlbkFQRW5hYmxlID0gRkFMU0U7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5iR3JlZW5BUEVuYWJsZSA9IFRSVUU7Ci0JCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEdyZWVuIEFQPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuYkdyZWVuQVBFbmFibGUpKTsKLQl9Ci0KLQkvLyBIVF9EaXNhbGxvd1RLSVAKLQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfRGlzYWxsb3dUS0lQIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0LCBUUlVFKSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQotCQlpZiAoVmFsdWUgPT0gMSkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuSFRfRGlzYWxsb3dUS0lQID0gVFJVRTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkhUX0Rpc2FsbG93VEtJUCA9IEZBTFNFOwotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IERpc2FsbG93IFRLSVAgbW9kZSA9ICVzXG4iLCAocEFkLT5Db21tb25DZmcuSFRfRGlzYWxsb3dUS0lQID09IFRSVUUpID8gIk9OIiA6ICJPRkYiICkpOwotCX0KLQotCi0JLy8yMDA4LzExLzA1OktIIGFkZCB0byBzdXBwb3J0IEFudGVubmEgcG93ZXItc2F2aW5nIG9mIEFQLS0+Ci19Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQotTkRJU19TVEFUVVMJUlRNUFNldFByb2ZpbGVQYXJhbWV0ZXJzKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFBTVFJJTkcJcEJ1ZmZlcikKLXsKLQlQU1RSSU5HCQkJCQl0bXBidWY7Ci0JVUxPTkcJCQkJCVJ0c1RocmVzaDsKLQlVTE9ORwkJCQkJRnJhZ1RocmVzaDsKLQlQU1RSSU5HCQkJCQltYWNwdHI7Ci0JSU5UCQkJCQkJaSA9IDAsIHJldHZhbDsKLQl0bXBidWYgPSBrbWFsbG9jKE1BWF9QQVJBTV9CVUZGRVJfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOwotCWlmKHRtcGJ1ZiA9PSBOVUxMKQotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQotCWRvCi0JewotCQkvLyBzZXQgZmlsZSBwYXJhbWV0ZXIgdG8gcG9ydGNmZwotCQkvL0NvdW50cnlSZWdpb24KLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ291bnRyeVJlZ2lvbiIsIHRtcGJ1ZiwgMjUsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlyZXR2YWwgPSBSVF9DZmdTZXRDb3VudHJ5UmVnaW9uKHBBZCwgdG1wYnVmLCBCQU5EXzI0Ryk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDb3VudHJ5UmVnaW9uPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKSk7Ci0JCX0KLQkJLy9Db3VudHJ5UmVnaW9uQUJhbmQKLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ291bnRyeVJlZ2lvbkFCYW5kIiwgdG1wYnVmLCAyNSwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJCXJldHZhbCA9IFJUX0NmZ1NldENvdW50cnlSZWdpb24ocEFkLCB0bXBidWYsIEJBTkRfNUcpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ291bnRyeVJlZ2lvbkFCYW5kPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQpKTsKLQkJfQotI2lmZGVmIFJUTVBfRUZVU0VfU1VQUE9SVAotI2lmZGVmIFJUMzB4eAotCQkvL0VmdXNlQnVmZmVyTW9kZQotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJFZnVzZUJ1ZmZlck1vZGUiLCB0bXBidWYsIDI1LCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkJcEFkLT5iRUVQUk9NRmlsZSA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkVmdXNlQnVmZmVyTW9kZT0lZFxuIiwgcEFkLT5iVXNlRWZ1c2UpKTsKLQkJfQotI2VuZGlmIC8vIFJUMzB4eCAvLwotI2VuZGlmIC8vIFJUTVBfRUZVU0VfU1VQUE9SVCAvLwotCQkvL0NvdW50cnlDb2RlCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNvdW50cnlDb2RlIiwgdG1wYnVmLCAyNSwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlLCB0bXBidWYgLCAyKTsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCi0JCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlN0YU9yaUNvdW50cnlDb2RlLCB0bXBidWYgLCAyKTsKLSNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCQlpZiAoc3RybGVuKChQU1RSSU5HKSBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSkgIT0gMCkKLQkJCXsKLQkJCQlwQWQtPkNvbW1vbkNmZy5iQ291bnRyeUZsYWcgPSBUUlVFOwotCQkJfQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ291bnRyeUNvZGU9JXNcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlKSk7Ci0JCX0KLQkJLy9DaGFubmVsR2VvZ3JhcGh5Ci0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNoYW5uZWxHZW9ncmFwaHkiLCB0bXBidWYsIDI1LCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkJVUNIQVIgR2VvZ3JhcGh5ID0gKFVDSEFSKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCQkJaWYgKEdlb2dyYXBoeSA8PSBCT1RIKQotCQkJewotCQkJCXBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9IEdlb2dyYXBoeTsKLQkJCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZVsyXSA9Ci0JCQkJCShwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPT0gQk9USCkgPyAnICcgOiAoKHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9PSBJRE9SKSA/ICdJJyA6ICdPJyk7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAotCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQkJCXBBZC0+U3RhQ2ZnLlN0YU9yaUdlb2dyYXBoeSA9IHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeTsKLSNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbEdlb2dyYXBoeT0lZFxuIiwgcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5KSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBCT1RIOwotCQkJcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGVbMl0gPSAnICc7Ci0JCX0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCS8vU1NJRAotCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlNTSUQiLCB0bXBidWYsIDI1NiwgcEJ1ZmZlciwgRkFMU0UpKQotCQkJewotCQkJCWlmIChzdHJsZW4odG1wYnVmKSA8PSAzMikKLQkJCQl7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuID0gKFVDSEFSKSBzdHJsZW4odG1wYnVmKTsKLQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuU3NpZCwgTkRJU184MDJfMTFfTEVOR1RIX1NTSUQpOwotCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPkNvbW1vbkNmZy5Tc2lkLCB0bXBidWYsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pOwotCQkJCQlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4gPSBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuOwotCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIE5ESVNfODAyXzExX0xFTkdUSF9TU0lEKTsKLQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCB0bXBidWYsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7Ci0JCQkJCXBBZC0+TWxtZUF1eC5Tc2lkTGVuID0gcEFkLT5Db21tb25DZmcuU3NpZExlbjsKLQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIE5ESVNfODAyXzExX0xFTkdUSF9TU0lEKTsKLQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIHRtcGJ1ZiwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KFNTSUQ9JXMpXG4iLCBfX0ZVTkNUSU9OX18sIHRtcGJ1ZikpOwotCQkJCX0KLQkJCX0KLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCS8vTmV0d29ya1R5cGUKLQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJOZXR3b3JrVHlwZSIsIHRtcGJ1ZiwgMjUsIHBCdWZmZXIsIFRSVUUpKQotCQkJewotCQkJCXBBZC0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOwotCQkJCWlmIChzdHJjbXAodG1wYnVmLCAiQWRob2MiKSA9PSAwKQotCQkJCQlwQWQtPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0FESE9DOwotCQkJCWVsc2UgLy9EZWZhdWx0IEluZnJhc3RydWN0dXJlIG1vZGUKLQkJCQkJcEFkLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsKLQkJCQkvLyBSZXNldCBSYWxpbmsgc3VwcGxpY2FudCB0byBub3QgdXNlLCBpdCB3aWxsIGJlIHNldCB0byBzdGFydCB3aGVuIFVJIHNldCBQTUsga2V5Ci0JCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihOZXR3b3JrVHlwZT0lZClcbiIsIF9fRlVOQ1RJT05fXywgcEFkLT5TdGFDZmcuQnNzVHlwZSkpOwotCQkJfQotCQl9Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCS8vTmV3UENJZVBTCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIk5ld1BDSWVQUyIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlVQ0hBUiB0ZW1wX2J1ZmZlciA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQkJCWlmKHRlbXBfYnVmZmVyPjApCi0JCQkJcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTPVRSVUU7Ci0JCQkJZWxzZQotCQkJCQlwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFM9RkFMU0U7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOZXdQQ0llUFM9JWRcbiIsIHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUykpOwotCQl9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0jaWZkZWYgUlQzMDkwCi0JCS8vUENJZVBvd2VyTGV2ZWwKLQotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJQQ0llUG93ZXJMZXZlbCIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID0gKFVDSEFSKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUENJZVBvd2VyTGV2ZWw9JWRcbiIsIHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUpKTsKLQkJfQotCQkvL0ZvbGxvd0hvc3RBU1BNCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkZvbGxvd0hvc3RBU1BNIiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJCVVDSEFSIHRlbXBfYnVmZmVyID0gKFVDSEFSKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCi0JCQlpZih0ZW1wX2J1ZmZlcj4wKQotCQkJCXBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhGb2xsb3dIb3N0QVNQTT1UUlVFOwotCQkJCWVsc2UKLQkJCQkJcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eEZvbGxvd0hvc3RBU1BNPUZBTFNFOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnQzMHh4Rm9sbG93SG9zdEFTUE09JWRcbiIsIHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhGb2xsb3dIb3N0QVNQTSkpOwotCQl9Ci0JCS8vRm9yY2VUZXN0QVNQTQotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJGb3JjZVRlc3RBU1BNIiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJCVVDSEFSIHRlbXBfYnVmZmVyID0gKFVDSEFSKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCi0JCQlpZih0ZW1wX2J1ZmZlcj4wKQotCQkJCXBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhGb3JjZUFTUE1UZXN0PVRSVUU7Ci0JCQkJZWxzZQotCQkJCQlwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4Rm9yY2VBU1BNVGVzdD1GQUxTRTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0MzB4eEZvcmNlQVNQTT0lZFxuIiwgcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eEZvcmNlQVNQTVRlc3QpKTsKLQkJfQotI2VuZGlmIC8vIFJUMzA5MCAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkvL0NoYW5uZWwKLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ2hhbm5lbCIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gKFVDSEFSKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbD0lZFxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOwotCQl9Ci0JCS8vV2lyZWxlc3NNb2RlCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIldpcmVsZXNzTW9kZSIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlSVF9DZmdTZXRXaXJlbGVzc01vZGUocEFkLCB0bXBidWYpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGh5TW9kZT0lZFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSkpOwotCQl9Ci0JICAgIC8vQmFzaWNSYXRlCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkJhc2ljUmF0ZSIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXAgPSAoVUxPTkcpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCYXNpY1JhdGU9JWxkXG4iLCBwQWQtPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXApKTsKLQkJfQotCQkvL0JlYWNvblBlcmlvZAotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJCZWFjb25QZXJpb2QiLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kID0gKFVTSE9SVCkgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJlYWNvblBlcmlvZD0lZFxuIiwgcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kKSk7Ci0JCX0KLQkgICAgLy9UeFBvd2VyCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlR4UG93ZXIiLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSAoVUxPTkcpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0ID0gcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2U7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeFBvd2VyPSVsZFxuIiwgcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UpKTsKLQkJfQotCQkvL0JHUHJvdGVjdGlvbgotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJCR1Byb3RlY3Rpb24iLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCS8vI2lmIDAJLy8jaWZuZGVmIFdJRklfVEVTVAotCS8vCQlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAyOy8vIGRpc2FibGUgYi9nIHByb3RlY3Rpb24gZm9yIHRocm91Z2hwdXQgdGVzdAotCS8vI2Vsc2UKLQkJCXN3aXRjaCAoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSkKLQkJCXsKLQkJCQljYXNlIDE6IC8vQWx3YXlzIE9uCi0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDE7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjogLy9BbHdheXMgT0ZGCi0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDI7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMDogLy9BVVRPCi0JCQkJZGVmYXVsdDoKLQkJCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMDsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JLy8jZW5kaWYKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJHUHJvdGVjdGlvbj0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbikpOwotCQl9Ci0JCS8vT0xCQ0RldGVjdGlvbgotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJEaXNhYmxlT0xCQyIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkpCi0JCQl7Ci0JCQkJY2FzZSAxOiAvL2Rpc2FibGUgT0xCQyBEZXRlY3Rpb24KLQkJCQkJcEFkLT5Db21tb25DZmcuRGlzYWJsZU9MQkNEZXRlY3QgPSAxOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDA6IC8vZW5hYmxlIE9MQkMgRGV0ZWN0aW9uCi0JCQkJCXBBZC0+Q29tbW9uQ2ZnLkRpc2FibGVPTEJDRGV0ZWN0ID0gMDsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcEFkLT5Db21tb25DZmcuRGlzYWJsZU9MQkNEZXRlY3Q9IDA7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiT0xCQ0RldGVjdGlvbj0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkRpc2FibGVPTEJDRGV0ZWN0KSk7Ci0JCX0KLQkJLy9UeFByZWFtYmxlCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlR4UHJlYW1ibGUiLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkJc3dpdGNoIChzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApKQotCQkJewotCQkJCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZVNob3J0OgotCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUnQ4MDJfMTFQcmVhbWJsZVNob3J0OwotCQkJCQlicmVhazsKLQkJCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVMb25nOgotCQkJCWRlZmF1bHQ6Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBSdDgwMl8xMVByZWFtYmxlTG9uZzsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeFByZWFtYmxlPSVsZFxuIiwgcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSkpOwotCQl9Ci0JCS8vUlRTVGhyZXNob2xkCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlJUU1RocmVzaG9sZCIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlSdHNUaHJlc2ggPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCQkJaWYoIChSdHNUaHJlc2ggPj0gMSkgJiYgKFJ0c1RocmVzaCA8PSBNQVhfUlRTX1RIUkVTSE9MRCkgKQotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCAgPSAoVVNIT1JUKVJ0c1RocmVzaDsKLQkJCWVsc2UKLQkJCQlwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSBNQVhfUlRTX1RIUkVTSE9MRDsKLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRTVGhyZXNob2xkPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpKTsKLQkJfQotCQkvL0ZyYWdUaHJlc2hvbGQKLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRnJhZ1RocmVzaG9sZCIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlGcmFnVGhyZXNoID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBGQUxTRTsKLQotCQkJaWYgKEZyYWdUaHJlc2ggPiBNQVhfRlJBR19USFJFU0hPTEQgfHwgRnJhZ1RocmVzaCA8IE1JTl9GUkFHX1RIUkVTSE9MRCkKLQkJCXsgLy9pbGxlZ2FsIEZyYWdUaHJlc2ggc28gd2Ugc2V0IGl0IHRvIGRlZmF1bHQKLQkJCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKLQkJCQlwQWQtPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gVFJVRTsKLQkJCX0KLQkJCWVsc2UgaWYgKEZyYWdUaHJlc2ggJSAyID09IDEpCi0JCQl7Ci0JCQkJLy8gVGhlIGxlbmd0aCBvZiBlYWNoIGZyYWdtZW50IHNoYWxsIGFsd2F5cyBiZSBhbiBldmVuIG51bWJlciBvZiBvY3RldHMsIGV4Y2VwdCBmb3IgdGhlIGxhc3QgZnJhZ21lbnQKLQkJCQkvLyBvZiBhbiBNU0RVIG9yIE1NUERVLCB3aGljaCBtYXkgYmUgZWl0aGVyIGFuIGV2ZW4gb3IgYW4gb2RkIG51bWJlciBvZiBvY3RldHMuCi0JCQkJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSAoVVNIT1JUKShGcmFnVGhyZXNoIC0gMSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSAoVVNIT1JUKUZyYWdUaHJlc2g7Ci0JCQl9Ci0JCQkvL3BBZC0+Q29tbW9uQ2ZnLkFsbG93RnJhZ1NpemUgPSAocEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQpIC0gTEVOR1RIXzgwMl8xMSAtIExFTkdUSF9DUkM7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGcmFnVGhyZXNob2xkPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkpOwotCQl9Ci0JCS8vVHhCdXJzdAotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJUeEJ1cnN0IiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkvLyNpZmRlZiBXSUZJX1RFU1QKLQkvLwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gRkFMU0U7Ci0JLy8jZWxzZQotCQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKSAgLy9FbmFibGUKLQkJCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA9IFRSVUU7Ci0JCQllbHNlIC8vRGlzYWJsZQotCQkJCXBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gRkFMU0U7Ci0JLy8jZW5kaWYKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4QnVyc3Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KSk7Ci0JCX0KLQotI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKLQkJLy9Qa3RBZ2dyZWdhdGUKLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiUGt0QWdncmVnYXRlIiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCi0JCQkJcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9IFRSVUU7Ci0JCQllbHNlIC8vRGlzYWJsZQotCQkJCXBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUgPSBGQUxTRTsKLSNpZmRlZiBQSUdHWUJBQ0tfU1VQUE9SVAotCQkJcEFkLT5Db21tb25DZmcuYlBpZ2d5QmFja0NhcGFibGUgPSBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlOwotI2VuZGlmIC8vIFBJR0dZQkFDS19TVVBQT1JUIC8vCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQa3RBZ2dyZWdhdGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpKTsKLQkJfQotI2Vsc2UKLQkJcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9IEZBTFNFOwotCQlwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSA9IEZBTFNFOwotI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KLQotCQkvLyBXbW1DYXBhYmxlCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCXJ0bXBfcmVhZF9zdGFfd21tX3Bhcm1zX2Zyb21fZmlsZShwQWQsIHRtcGJ1ZiwgcEJ1ZmZlcik7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkJLy9TaG9ydFNsb3QKLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiU2hvcnRTbG90IiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJCVJUX0NmZ1NldFNob3J0U2xvdChwQWQsIHRtcGJ1Zik7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTaG9ydFNsb3Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lKSk7Ci0JCX0KLQkJLy9JRUVFODAyMTFICi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIklFRUU4MDIxMUgiLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkgICAgZm9yIChpID0gMCwgbWFjcHRyID0gcnN0cnRvayh0bXBidWYsIjsiKTsgbWFjcHRyOyBtYWNwdHIgPSByc3RydG9rKE5VTEwsIjsiKSwgaSsrKQotCQkgICAgewotCQkJCWlmKHNpbXBsZV9zdHJ0b2wobWFjcHRyLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCi0JCQkJCXBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID0gVFJVRTsKLQkJCQllbHNlIC8vRGlzYWJsZQotCQkJCQlwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9IEZBTFNFOwotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUVFRTgwMjExSD0lZFxuIiwgcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUgpKTsKLQkJICAgIH0KLQkJfQotCQkvL0NTUGVyaW9kCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNTUGVyaW9kIiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJICAgIGlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkKLQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DU1BlcmlvZCA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0JCQllbHNlCi0JCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ1NQZXJpb2QgPSAwOwotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ1NQZXJpb2Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTUGVyaW9kKSk7Ci0JCX0KLQotI2lmZGVmIE1FUkdFX0FSQ0hfVEVBTQotCQkvLyBEZnNMb3dlckxpbWl0Ci0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkRmc0xvd2VyTGltaXQiLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKQotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc0xvd2VyTGltaXQgPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEZnNMb3dlckxpbWl0PSVsZFxuIiwgcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzTG93ZXJMaW1pdCkpOwotCQl9Ci0KLQkJLy8gRGZzVXBwZXJMaW1pdAotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJEZnNVcHBlckxpbWl0IiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkKLQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNVcHBlckxpbWl0ID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRGZzVXBwZXJMaW1pdD0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1VwcGVyTGltaXQpKTsKLQkJfQotCi0JCS8vIEZpeERmc0xpbWl0Ci0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkZpeERmc0xpbWl0IiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJICAgIGlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkKLQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5GaXhEZnNMaW1pdCA9IFRSVUU7Ci0JCQllbHNlCi0JCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRml4RGZzTGltaXQgPSBGQUxTRTsKLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRml4RGZzTGltaXQ9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkZpeERmc0xpbWl0KSk7Ci0JCX0KLQotCQkvLyBMb25nUHVsc2VSYWRhclRoCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkxvbmdQdWxzZVJhZGFyVGgiLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkgICAgaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKQotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkxvbmdQdWxzZVJhZGFyVGggPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJMb25nUHVsc2VSYWRhclRoPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5Mb25nUHVsc2VSYWRhclRoKSk7Ci0JCX0KLQotCQkvLyBBdmdSc3NpUmVxCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkF2Z1Jzc2lSZXEiLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKQotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkF2Z1Jzc2lSZXEgPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBdmdSc3NpUmVxPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5BdmdSc3NpUmVxKSk7Ci0JCX0KLQotI2VuZGlmIC8vIE1FUkdFX0FSQ0hfVEVBTSAvLwotCi0JCS8vUkRSZWdpb24KLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiUkRSZWdpb24iLCB0bXBidWYsIDEyOCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJCQkJCVJBREFSX0RFVEVDVF9TVFJVQ1QJKnBSYWRhckRldGVjdCA9ICZwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdDsKLQkJCWlmICgoc3RybmNtcCh0bXBidWYsICJKQVBfVzUzIiwgNykgPT0gMCkgfHwgKHN0cm5jbXAodG1wYnVmLCAiamFwX3c1MyIsIDcpID09IDApKQotCQkJewotCQkJCQkJCXBSYWRhckRldGVjdC0+UkREdXJSZWdpb24gPSBKQVBfVzUzOwotCQkJCQkJCXBSYWRhckRldGVjdC0+RGZzU2Vzc2lvblRpbWUgPSAxNTsKLQkJCX0KLQkJCWVsc2UgaWYgKChzdHJuY21wKHRtcGJ1ZiwgIkpBUF9XNTYiLCA3KSA9PSAwKSB8fCAoc3RybmNtcCh0bXBidWYsICJqYXBfdzU2IiwgNykgPT0gMCkpCi0JCQl7Ci0JCQkJCQkJcFJhZGFyRGV0ZWN0LT5SRER1clJlZ2lvbiA9IEpBUF9XNTY7Ci0JCQkJCQkJcFJhZGFyRGV0ZWN0LT5EZnNTZXNzaW9uVGltZSA9IDEzOwotCQkJfQotCQkJZWxzZSBpZiAoKHN0cm5jbXAodG1wYnVmLCAiSkFQIiwgMykgPT0gMCkgfHwgKHN0cm5jbXAodG1wYnVmLCAiamFwIiwgMykgPT0gMCkpCi0JCQl7Ci0JCQkJCQkJcFJhZGFyRGV0ZWN0LT5SRER1clJlZ2lvbiA9IEpBUDsKLQkJCQkJCQlwUmFkYXJEZXRlY3QtPkRmc1Nlc3Npb25UaW1lID0gNTsKLQkJCX0KLQkJCWVsc2UgIGlmICgoc3RybmNtcCh0bXBidWYsICJGQ0MiLCAzKSA9PSAwKSB8fCAoc3RybmNtcCh0bXBidWYsICJmY2MiLCAzKSA9PSAwKSkKLQkJCXsKLQkJCQkJCQlwUmFkYXJEZXRlY3QtPlJERHVyUmVnaW9uID0gRkNDOwotCQkJCQkJCXBSYWRhckRldGVjdC0+RGZzU2Vzc2lvblRpbWUgPSA1OwotI2lmZGVmIERGU19GQ0NfQlc0MF9GSVgKLQkJCQkJCQlwUmFkYXJEZXRlY3QtPkRmc1Nlc3Npb25GY2NPZmYgPSAwOwotI2VuZGlmIC8vIERGU19GQ0NfQlc0MF9GSVggLy8KLQkJCX0KLQkJCWVsc2UgaWYgKChzdHJuY21wKHRtcGJ1ZiwgIkNFIiwgMikgPT0gMCkgfHwgKHN0cm5jbXAodG1wYnVmLCAiY2UiLCAyKSA9PSAwKSkKLQkJCXsKLQkJCQkJCQlwUmFkYXJEZXRlY3QtPlJERHVyUmVnaW9uID0gQ0U7Ci0JCQkJCQkJcFJhZGFyRGV0ZWN0LT5EZnNTZXNzaW9uVGltZSA9IDEzOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCQkJCXBSYWRhckRldGVjdC0+UkREdXJSZWdpb24gPSBDRTsKLQkJCQkJCQlwUmFkYXJEZXRlY3QtPkRmc1Nlc3Npb25UaW1lID0gMTM7Ci0JCQl9Ci0KLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJEUmVnaW9uPSVkXG4iLCBwUmFkYXJEZXRlY3QtPlJERHVyUmVnaW9uKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IENFOwotCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKLQkJfQotCi0JCS8vV2lyZWxlc3NFdmVudAotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXaXJlbGVzc0V2ZW50IiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLSNpZiBXSVJFTEVTU19FWFQgPj0gMTUKLQkJICAgIGlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkKLQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0JCQllbHNlCi0JCQkJcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQgPSAwOwkvLyBkaXNhYmxlCi0jZWxzZQotCQkJcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQgPSAwOwkvLyBkaXNhYmxlCi0jZW5kaWYKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXaXJlbGVzc0V2ZW50PSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkpOwotCQl9Ci0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIldpRmlUZXN0IiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJICAgIGlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkKLQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3Q9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0JCQllbHNlCi0JCQkJcEFkLT5Db21tb25DZmcuYldpRmlUZXN0ID0gMDsJLy8gZGlzYWJsZQotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV2lGaVRlc3Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCkpOwotCQl9Ci0JCS8vQXV0aE1vZGUKLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQXV0aE1vZGUiLCB0bXBidWYsIDEyOCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQl7Ci0JCQkJaWYgKChzdHJjbXAodG1wYnVmLCAiV0VQQVVUTyIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid2VwYXV0byIpID09IDApKQotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2g7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJTSEFSRUQiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgInNoYXJlZCIpID09IDApKQotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDsKLQkgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIldQQVBTSyIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid3BhcHNrIikgPT0gMCkpCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOwotCSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiV1BBTk9ORSIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid3Bhbm9uZSIpID09IDApKQotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJXUEEyUFNLIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3cGEycHNrIikgPT0gMCkpCi0JCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0JCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJXUEEiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndwYSIpID09IDApKQotCQkJICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKLQkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIldQQTIiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndwYTIiKSA9PSAwKSkKLQkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQkgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKLQotCSAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOwotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihFbmNyeXBUeXBlPSVkKVxuIiwgX19GVU5DVElPTl9fLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMpKTsKLQkJCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJfQotCQkvL0VuY3J5cFR5cGUKLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRW5jcnlwVHlwZSIsIHRtcGJ1ZiwgMTI4LCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJewotCQkJCWlmICgoc3RyY21wKHRtcGJ1ZiwgIldFUCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid2VwIikgPT0gMCkpCi0JCQkJCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cwk9IE5kaXM4MDJfMTFXRVBFbmFibGVkOwotCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiVEtJUCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAidGtpcCIpID09IDApKQotCQkJCQlwQWQtPlN0YUNmZy5XZXBTdGF0dXMJPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOwotCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiQUVTIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJhZXMiKSA9PSAwKSkKLQkJCQkJcEFkLT5TdGFDZmcuV2VwU3RhdHVzCT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKLQkJCQllbHNlCi0JCQkJCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cwk9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQotCQkJCS8vIFVwZGF0ZSBhbGwgd2Vwc3RhdHVzIHJlbGF0ZWQKLQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyCQk9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKLQkJCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlcgkJPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7Ci0JCQkJcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cwk9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKLQkJCQlwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyCQk9IEZBTFNFOwotCi0JCQkJLy9SVE1QTWFrZVJTTklFKHBBZCwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywgMCk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihFbmNyeXBUeXBlPSVkKVxuIiwgX19GVU5DVElPTl9fLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMpKTsKLQkJCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJfQotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiV1BBUFNLIiwgdG1wYnVmLCA1MTIsIHBCdWZmZXIsIEZBTFNFKSkKLQkJCXsKLQkJCQlpbnQgICAgIHJldCA9IFRSVUU7Ci0KLQkJCQl0bXBidWZbc3RybGVuKHRtcGJ1ZildID0gJ1wwJzsgLy8gbWFrZSBTVEEgY2FuIHByb2Nlc3MgLiReJiBmb3IgV1BBUFNLIGlucHV0Ci0KLQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKLQkJCQkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCi0JCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotCQkJCQkpCi0JCQkJewotCQkJCQlyZXQgPSBGQUxTRTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcmV0ID0gUlRfQ2ZnU2V0V1BBUFNLS2V5KHBBZCwgdG1wYnVmLCAoUFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sIHBBZC0+U3RhQ2ZnLlBNSyk7Ci0JCQkJfQotCi0JCQkJaWYgKHJldCA9PSBUUlVFKQotCQkJCXsKLQkJCVJUTVBaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLldwYVBhc3NQaHJhc2UsIDY0KTsKLQkJCVJUTVBNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLldwYVBhc3NQaHJhc2UsIHRtcGJ1Ziwgc3RybGVuKHRtcGJ1ZikpOwotCQkJCQlwQWQtPlN0YUNmZy5XcGFQYXNzUGhyYXNlTGVuPSBzdHJsZW4odG1wYnVmKTsKLQotCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKLQkJCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKLQkJCQkJewotCQkJCQkJLy8gU3RhcnQgU1RBIHN1cHBsaWNhbnQgc3RhdGUgbWFjaGluZQotCQkJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19TVEFSVDsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotCQkJCQl7Ci0JCQkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKLQkJCQkJfQotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KFdQQVBTSz0lcylcbiIsIF9fRlVOQ1RJT05fXywgdG1wYnVmKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkJLy9EZWZhdWx0S2V5SUQsIEtleVR5cGUsIEtleVN0cgotCQlydG1wX3JlYWRfa2V5X3Bhcm1zX2Zyb21fZmlsZShwQWQsIHRtcGJ1ZiwgcEJ1ZmZlcik7Ci0KLQotCQkvL0hTQ291bnRlcgotCQkvKmlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhTQ291bnRlciIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkpCi0JCQl7Ci0JCQkJY2FzZSAxOiAvL0VuYWJsZQotCQkJCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlSFNDb3VudGVyID0gVFJVRTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAwOiAvL0Rpc2FibGUKLQkJCQlkZWZhdWx0OgotCQkJCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlSFNDb3VudGVyID0gRkFMU0U7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICJIU0NvdW50ZXI9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVIU0NvdW50ZXIpOwotCQl9Ki8KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQlIVFBhcmFtZXRlcnNIb29rKHBBZCwgdG1wYnVmLCBwQnVmZmVyKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCi0jaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAotCQkJLy9DYXJyaWVyRGV0ZWN0Ci0JCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDYXJyaWVyRGV0ZWN0IiwgdG1wYnVmLCAxMjgsIHBCdWZmZXIsIFRSVUUpKQotCQkJewotCQkJCWlmICgoc3RybmNtcCh0bXBidWYsICIwIiwgMSkgPT0gMCkpCi0JCQkJCXBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID0gRkFMU0U7Ci0JCQkJZWxzZSBpZiAoKHN0cm5jbXAodG1wYnVmLCAiMSIsIDEpID09IDApKQotCQkJCQlwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IFRSVUU7Ci0JCQkJZWxzZQotCQkJCQlwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IEZBTFNFOwotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2FycmllckRldGVjdC5FbmFibGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlKSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSBGQUxTRTsKLSNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJLy9QU01vZGUKLQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJQU01vZGUiLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJCXsKLQkJCQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCi0JCQkJewotCQkJCQlpZiAoKHN0cmNtcCh0bXBidWYsICJNQVhfUFNQIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJtYXhfcHNwIikgPT0gMCkpCi0JCQkJCXsKLQkJCQkJCS8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQotCQkJCQkJLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCi0JCQkJCQkvLwkgICBNbG1lU2V0UHNtKHBBZCwgUFdSX1NBVkUpOwotCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7Ci0JCQkJCQlpZiAocEFkLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKLQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1A7Ci0JCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOwotCQkJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gNTsKLQkJCQkJfQotCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIkZhc3RfUFNQIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJmYXN0X3BzcCIpID09IDApCi0JCQkJCQl8fCAoc3RyY21wKHRtcGJ1ZiwgIkZBU1RfUFNQIikgPT0gMCkpCi0JCQkJCXsKLQkJCQkJCS8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQotCQkJCQkJLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCi0JCQkJCQkvLwkgICBNbG1lU2V0UHNtQml0KHBBZCwgUFdSX1NBVkUpOwotCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7Ci0JCQkJCQlpZiAocEFkLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKLQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOwotCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1A7Ci0JCQkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiTGVnYWN5X1BTUCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAibGVnYWN5X3BzcCIpID09IDApCi0JCQkJCQl8fCAoc3RyY21wKHRtcGJ1ZiwgIkxFR0FDWV9QU1AiKSA9PSAwKSkKLQkJCQkJewotCQkJCQkJLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCi0JCQkJCQkvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KLQkJCQkJCS8vCSAgIE1sbWVTZXRQc21CaXQocEFkLCBQV1JfU0FWRSk7Ci0JCQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKLQkJCQkJCWlmIChwQWQtPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQotCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUDsKLQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1A7Ci0JCQkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJeyAvL0RlZmF1bHQgTmRpczgwMl8xMVBvd2VyTW9kZUNBTQotCQkJCQkJLy8gY2xlYXIgUFNNIGJpdCBpbW1lZGlhdGVseQotCQkJCQkJUlRNUF9TRVRfUFNNX0JJVChwQWQsIFBXUl9BQ1RJVkUpOwotCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7Ci0JCQkJCQlpZiAocEFkLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKLQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKLQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKLQkJCQkJfQotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQU01vZGU9JWxkXG4iLCBwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlKSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gQXV0b1JvYW1pbmcgYnkgUlNTSQotCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkF1dG9Sb2FtaW5nIiwgdG1wYnVmLCAzMiwgcEJ1ZmZlciwgVFJVRSkpCi0JCQl7Ci0JCQkJaWYgKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgPT0gMCkKLQkJCQkJcEFkLT5TdGFDZmcuYkF1dG9Sb2FtaW5nID0gRkFMU0U7Ci0JCQkJZWxzZQotCQkJCQlwQWQtPlN0YUNmZy5iQXV0b1JvYW1pbmcgPSBUUlVFOwotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXV0b1JvYW1pbmc9JWRcbiIsIHBBZC0+U3RhQ2ZnLmJBdXRvUm9hbWluZykpOwotCQkJfQotCQkJLy8gUm9hbVRocmVzaG9sZAotCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlJvYW1UaHJlc2hvbGQiLCB0bXBidWYsIDMyLCBwQnVmZmVyLCBUUlVFKSkKLQkJCXsKLQkJCQlsb25nIGxJbmZvID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQotCQkJCWlmIChsSW5mbyA+IDkwIHx8IGxJbmZvIDwgNjApCi0JCQkJCXBBZC0+U3RhQ2ZnLmRCbVRvUm9hbSA9IC03MDsKLQkJCQllbHNlCi0JCQkJCXBBZC0+U3RhQ2ZnLmRCbVRvUm9hbSA9IChDSEFSKSgtMSkqbEluZm87Ci0KLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSb2FtVGhyZXNob2xkPSVkICBkQm1cbiIsIHBBZC0+U3RhQ2ZnLmRCbVRvUm9hbSkpOwotCQkJfQotCi0JCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJUR25XaWZpVGVzdCIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQkJewotCQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgPT0gMCkKLQkJCQkJcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0ID0gRkFMU0U7Ci0JCQkJZWxzZQotCQkJCQlwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QgPSBUUlVFOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUR25XaWZpVGVzdD0lZFxuIiwgcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0KSk7Ci0JCQl9Ci0KLQkJCS8vIEJlYWNvbiBMb3N0IFRpbWUKLQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJCZWFjb25Mb3N0VGltZSIsIHRtcGJ1ZiwgMzIsIHBCdWZmZXIsIFRSVUUpKQotCQkJewotCQkJCVVMT05HIGxJbmZvID0gKFVMT05HKXNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0KLQkJCQlpZiAoKGxJbmZvICE9IDApICYmIChsSW5mbyA8PSA2MCkpCi0JCQkJCXBBZC0+U3RhQ2ZnLkJlYWNvbkxvc3RUaW1lID0gKGxJbmZvICogT1NfSFopOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJlYWNvbkxvc3RUaW1lPSVsZCBcbiIsIHBBZC0+U3RhQ2ZnLkJlYWNvbkxvc3RUaW1lKSk7Ci0JCQl9Ci0KLQotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCi0jaWZkZWYgUlQzMHh4Ci0jaWZkZWYgQU5UX0RJVkVSU0lUWV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkFudERpdmVyc2l0eSIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQkJewotCQkJCWZvciAoaSA9IDAsIG1hY3B0ciA9IHJzdHJ0b2sodG1wYnVmLCI7Iik7IG1hY3B0cjsgbWFjcHRyID0gcnN0cnRvayhOVUxMLCI7IiksIGkrKykKLQkJCQl7Ci0JCQkJCVVDSEFSIEFudCA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0JCQkJCWlmKEFudCA8IDMpCi0JCQkJCQlwQWQtPkNvbW1vbkNmZy5iUnhBbnREaXZlcnNpdHkgPSBBbnQ7Ci0JCQkJCWVsc2UKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJSeEFudERpdmVyc2l0eSA9IEFOVF9ESVZFUlNJVFlfRElTQUJMRTsKLQotCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBbnREaXZlcnNpdHk9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJSeEFudERpdmVyc2l0eSkpOwotCQkJCX0KLQkJCX0KLQkJfQotI2VuZGlmIC8vIEFOVF9ESVZFUlNJVFlfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFJUMzB4eCAvLwotCi0JfXdoaWxlKDApOwotCi0KLQlrZnJlZSh0bXBidWYpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0KLX0KLQotCi0jaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCi0vLyByZWNvcmQgd2hldGhlciB0aGUgY2FyZCBpbiB0aGUgY2FyZCBsaXN0IGlzIHVzZWQgaW4gdGhlIGNhcmQgZmlsZQotVUlOVDggIE1DX0NhcmRVc2VkW01BWF9OVU1fT0ZfTVVMVElQTEVfQ0FSRF07Ci0vLyByZWNvcmQgdXNlZCBjYXJkIG1hYyBhZGRyZXNzIGluIHRoZSBjYXJkIGxpc3QKLXN0YXRpYyBVSU5UOCAgTUNfQ2FyZE1hY1tNQVhfTlVNX09GX01VTFRJUExFX0NBUkRdWzZdOwotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEdldCBjYXJkIHByb2ZpbGUgcGF0aC4KLQotQXJndW1lbnRzOgotICAgIHBBZAotCi1SZXR1cm4gVmFsdWU6Ci0gICAgVFJVRQkJLSBGaW5kIGEgY2FyZCBwcm9maWxlCi0JRkFMU0UJCS0gdXNlIGRlZmF1bHQgcHJvZmlsZQotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTiBSVE1QX0NhcmRJbmZvUmVhZCgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCkKLXsKLSNkZWZpbmUgTUNfU0VMRUNUX0NBUkRJRAkJMAkvKiB1c2UgQ0FSRCBJRCAoMCB+IDMxKSB0byBpZGVudGlmeSBkaWZmZXJlbnQgY2FyZHMgKi8KLSNkZWZpbmUgTUNfU0VMRUNUX01BQwkJCTEJLyogdXNlIENBUkQgTUFDIHRvIGlkZW50aWZ5IGRpZmZlcmVudCBjYXJkcyAqLwotI2RlZmluZSBNQ19TRUxFQ1RfQ0FSRFRZUEUJCTIJLyogdXNlIENBUkQgdHlwZSAoYWJnbiBvciBiZ24pIHRvIGlkZW50aWZ5IGRpZmZlcmVudCBjYXJkcyAqLwotCi0jZGVmaW5lIExFVFRFUl9DQVNFX1RSQU5TTEFURSh0eHRfcCwgY2FyZF9pZCkJCQlcCi0JewlVSU5UMzIgX2xlbjsgY2hhciBfY2hhcjsJCQkJCQlcCi0JCWZvcihfbGVuPTA7IF9sZW48c3RybGVuKGNhcmRfaWQpOyBfbGVuKyspIHsJCVwKLQkJCV9jaGFyID0gKih0eHRfcCArIF9sZW4pOwkJCQkJXAotCQkJaWYgKCgnQScgPD0gX2NoYXIpICYmIChfY2hhciA8PSAnWicpKQkJXAotCQkJCSoodHh0X3ArX2xlbikgPSAnYScrKF9jaGFyLSdBJyk7CQlcCi0JCX0gfQotCi0JUlRNUF9PU19GRCBzcmNmOwotCUlOVCByZXR2YWw7Ci0JUFNUUklORyBidWZmZXIsIHRtcGJ1ZjsKLQlTVFJJTkcgY2FyZF9pZF9idWZbMzBdLCBSRklDX3dvcmRbMzBdOwotCUJPT0xFQU4gZmxnX21hdGNoX29rID0gRkFMU0U7Ci0JSU5UMzIgY2FyZF9zZWxlY3RfbWV0aG9kOwotCUlOVDMyIGNhcmRfZnJlZV9pZCwgY2FyZF9ub3VzZV9pZCwgY2FyZF9zYW1lX21hY19pZCwgY2FyZF9tYXRjaF9pZDsKLQlFRVBST01fQU5URU5OQV9TVFJVQyBhbnRlbm5hOwotCVVTSE9SVCBhZGRyMDEsIGFkZHIyMywgYWRkcjQ1OwotCVVJTlQ4IG1hY1s2XTsKLQlVSU5UMzIgZGF0YSwgY2FyZF9pbmRleDsKLQlVQ0hBUiAqc3RhcnRfcHRyOwotCVJUTVBfT1NfRlNfSU5GTyBvc0ZTSW5mbzsKLQotCS8vIGluaXQKLQlidWZmZXIgPSBrbWFsbG9jKE1BWF9JTklfQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKLQlpZiAoYnVmZmVyID09IE5VTEwpCi0JCXJldHVybiBGQUxTRTsKLQotCXRtcGJ1ZiA9IGttYWxsb2MoTUFYX1BBUkFNX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7Ci0JaWYodG1wYnVmID09IE5VTEwpCi0JewotCQlrZnJlZShidWZmZXIpOwotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQkvLyBnZXQgUkYgSUMgdHlwZQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJmRhdGEpOwotCi0JaWYgKChkYXRhICYgMHgzMCkgPT0gMCkKLQkJcEFkLT5FRVBST01BZGRyZXNzTnVtID0gNjsJLy8gOTNDNDYKLQllbHNlIGlmICgoZGF0YSAmIDB4MzApID09IDB4MTApCi0JCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDg7CS8vIDkzQzY2Ci0JZWxzZQotCQlwQWQtPkVFUFJPTUFkZHJlc3NOdW0gPSA4OwkvLyA5M0M4NgotCi0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTklDMV9PRkZTRVQsIGFudGVubmEud29yZCk7Ci0KLQlpZiAoKGFudGVubmEuZmllbGQuUmZJY1R5cGUgPT0gUkZJQ18yODUwKSB8fAotCQkoYW50ZW5uYS5maWVsZC5SZkljVHlwZSA9PSBSRklDXzI3NTApKQotCXsKLQkJLyogQUJHTiBjYXJkICovCi0JCXN0cmNweShSRklDX3dvcmQsICJhYmduIik7Ci0JfQotCWVsc2UKLQl7Ci0JCS8qIEJHTiBjYXJkICovCi0JCXN0cmNweShSRklDX3dvcmQsICJiZ24iKTsKLQl9Ci0KLQkvLyBnZXQgTUFDIGFkZHJlc3MKLQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDQsIGFkZHIwMSk7Ci0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDA2LCBhZGRyMjMpOwotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgwOCwgYWRkcjQ1KTsKLQotCW1hY1swXSA9IChVQ0hBUikoYWRkcjAxICYgMHhmZik7Ci0JbWFjWzFdID0gKFVDSEFSKShhZGRyMDEgPj4gOCk7Ci0JbWFjWzJdID0gKFVDSEFSKShhZGRyMjMgJiAweGZmKTsKLQltYWNbM10gPSAoVUNIQVIpKGFkZHIyMyA+PiA4KTsKLQltYWNbNF0gPSAoVUNIQVIpKGFkZHI0NSAmIDB4ZmYpOwotCW1hY1s1XSA9IChVQ0hBUikoYWRkcjQ1ID4+IDgpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgibWFjIGFkZHI9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnghXG4iLCBQUklOVF9NQUMobWFjKSkpOwotCi0JUnRtcE9TRlNJbmZvQ2hhbmdlKCZvc0ZTSW5mbywgVFJVRSk7Ci0JLy8gb3BlbiBjYXJkIGluZm9ybWF0aW9uIGZpbGUKLQlzcmNmID0gUnRtcE9TRmlsZU9wZW4oQ0FSRF9JTkZPX1BBVEgsIE9fUkRPTkxZLCAwKTsKLQlpZiAoSVNfRklMRV9PUEVOX0VSUihzcmNmKSkKLQl7Ci0JCS8qIGNhcmQgaW5mb3JtYXRpb24gZmlsZSBkb2VzIG5vdCBleGlzdCAqLwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCi0JCQkJKCItLT4gRXJyb3Igb3BlbmluZyAlc1xuIiwgQ0FSRF9JTkZPX1BBVEgpKTsKLQkJZ290byAgZnJlZV9yZXNvdXJjZTsKLQl9Ci0KLQkvKiBjYXJkIGluZm9ybWF0aW9uIGZpbGUgZXhpc3RzIHNvIHJlYWRpbmcgdGhlIGNhcmQgaW5mb3JtYXRpb24gKi8KLQltZW1zZXQoYnVmZmVyLCAweDAwLCBNQVhfSU5JX0JVRkZFUl9TSVpFKTsKLQlyZXR2YWwgPSBSdG1wT1NGaWxlUmVhZChzcmNmLCBidWZmZXIsIE1BWF9JTklfQlVGRkVSX1NJWkUpOwotCWlmIChyZXR2YWwgPCAwKQotCXsKLQkJLyogcmVhZCBmYWlsICovCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKLQkJCQkoIi0tPiBSZWFkICVzIGVycm9yICVkXG4iLCBDQVJEX0lORk9fUEFUSCwgLXJldHZhbCkpOwotCX0KLQllbHNlCi0JewotCQkvKiBnZXQgY2FyZCBzZWxlY3Rpb24gbWV0aG9kICovCi0JCW1lbXNldCh0bXBidWYsIDB4MDAsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7Ci0JCWNhcmRfc2VsZWN0X21ldGhvZCA9IE1DX1NFTEVDVF9DQVJEVFlQRTsgLy8gZGVmYXVsdAotCi0JCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJTRUxFQ1QiLCB0bXBidWYsIDI1NiwgYnVmZmVyLCBUUlVFKSkKLQkJewotCQkJaWYgKHN0cmNtcCh0bXBidWYsICJDQVJESUQiKSA9PSAwKQotCQkJCWNhcmRfc2VsZWN0X21ldGhvZCA9IE1DX1NFTEVDVF9DQVJESUQ7Ci0JCQllbHNlIGlmIChzdHJjbXAodG1wYnVmLCAiTUFDIikgPT0gMCkKLQkJCQljYXJkX3NlbGVjdF9tZXRob2QgPSBNQ19TRUxFQ1RfTUFDOwotCQkJZWxzZSBpZiAoc3RyY21wKHRtcGJ1ZiwgIkNBUkRUWVBFIikgPT0gMCkKLQkJCQljYXJkX3NlbGVjdF9tZXRob2QgPSBNQ19TRUxFQ1RfQ0FSRFRZUEU7Ci0JCX0KLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKLQkJCQkoIk1DPiBDYXJkIFNlbGVjdGlvbiA9ICVkXG4iLCBjYXJkX3NlbGVjdF9tZXRob2QpKTsKLQotCQkvLyBpbml0Ci0JCWNhcmRfZnJlZV9pZCA9IC0xOwotCQljYXJkX25vdXNlX2lkID0gLTE7Ci0JCWNhcmRfc2FtZV9tYWNfaWQgPSAtMTsKLQkJY2FyZF9tYXRjaF9pZCA9IC0xOwotCi0JCS8vIHNlYXJjaCBjdXJyZW50IGNhcmQgaW5mb3JtYXRpb24gcmVjb3JkcwotCQlmb3IoY2FyZF9pbmRleD0wOwotCQkJY2FyZF9pbmRleDxNQVhfTlVNX09GX01VTFRJUExFX0NBUkQ7Ci0JCQljYXJkX2luZGV4KyspCi0JCXsKLQkJCWlmICgoKihVSU5UMzIgKikmTUNfQ2FyZE1hY1tjYXJkX2luZGV4XVswXSA9PSAwKSAmJgotCQkJCSgqKFVJTlQxNiAqKSZNQ19DYXJkTWFjW2NhcmRfaW5kZXhdWzRdID09IDApKQotCQkJewotCQkJCS8vIE1BQyBpcyBhbGwtMCBzbyB0aGUgZW50cnkgaXMgYXZhaWxhYmxlCi0JCQkJTUNfQ2FyZFVzZWRbY2FyZF9pbmRleF0gPSAwOwotCi0JCQkJaWYgKGNhcmRfZnJlZV9pZCA8IDApCi0JCQkJCWNhcmRfZnJlZV9pZCA9IGNhcmRfaW5kZXg7IC8vIDFzdCBmcmVlIGVudHJ5Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKG1lbWNtcChNQ19DYXJkTWFjW2NhcmRfaW5kZXhdLCBtYWMsIDYpID09IDApCi0JCQkJewotCQkJCQkvLyB3ZSBmaW5kIHRoZSBlbnRyeSB3aXRoIHNhbWUgTUFDCi0JCQkJCWlmIChjYXJkX3NhbWVfbWFjX2lkIDwgMCkKLQkJCQkJCWNhcmRfc2FtZV9tYWNfaWQgPSBjYXJkX2luZGV4OyAvLyAxc3Qgc2FtZSBlbnRyeQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkvLyBNQUMgaXMgbm90IGFsbC0wIGJ1dCB1c2VkIGZsYWcgPT0gMAotCQkJCQlpZiAoKE1DX0NhcmRVc2VkW2NhcmRfaW5kZXhdID09IDApICYmCi0JCQkJCQkoY2FyZF9ub3VzZV9pZCA8IDApKQotCQkJCQl7Ci0JCQkJCQljYXJkX25vdXNlX2lkID0gY2FyZF9pbmRleDsgLy8gMXN0IGF2YWlsYWJsZSBlbnRyeQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCi0JCQkJKCJNQz4gRnJlZSA9ICVkLCBTYW1lID0gJWQsIE5PVVNFID0gJWRcbiIsCi0JCQkJY2FyZF9mcmVlX2lkLCBjYXJkX3NhbWVfbWFjX2lkLCBjYXJkX25vdXNlX2lkKSk7Ci0KLQkJaWYgKChjYXJkX3NhbWVfbWFjX2lkID49IDApICYmCi0JCQkoKGNhcmRfc2VsZWN0X21ldGhvZCA9PSBNQ19TRUxFQ1RfQ0FSRElEKSB8fAotCQkJKGNhcmRfc2VsZWN0X21ldGhvZCA9PSBNQ19TRUxFQ1RfQ0FSRFRZUEUpKSkKLQkJewotCQkJLy8gc2FtZSBNQUMgZW50cnkgaXMgZm91bmQKLQkJCWNhcmRfbWF0Y2hfaWQgPSBjYXJkX3NhbWVfbWFjX2lkOwotCi0JCQlpZiAoY2FyZF9zZWxlY3RfbWV0aG9kID09IE1DX1NFTEVDVF9DQVJEVFlQRSkKLQkJCXsKLQkJCQkvLyBmb3IgQ0FSRFRZUEUKLQkJCQlzcHJpbnRmKGNhcmRfaWRfYnVmLCAiJTAyZENBUkRUWVBFJXMiLAotCQkJCQkJY2FyZF9tYXRjaF9pZCwgUkZJQ193b3JkKTsKLQotCQkJCWlmICgoc3RhcnRfcHRyID0gKFBVQ0hBUilydHN0cnN0cnVuY2FzZWNtcChidWZmZXIsIGNhcmRfaWRfYnVmKSkgIT0gTlVMTCkKLQkJCQl7Ci0JCQkJCS8vIHdlIGZvdW5kIHRoZSBjYXJkIElECi0JCQkJCUxFVFRFUl9DQVNFX1RSQU5TTEFURShzdGFydF9wdHIsIGNhcmRfaWRfYnVmKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyB0aGUgY2FyZCBpcyAxc3QgcGx1Zy1pbiwgdHJ5IHRvIGZpbmQgdGhlIG1hdGNoIGNhcmQgcHJvZmlsZQotCQkJc3dpdGNoKGNhcmRfc2VsZWN0X21ldGhvZCkKLQkJCXsKLQkJCQljYXNlIE1DX1NFTEVDVF9DQVJESUQ6IC8vIENBUkRJRAotCQkJCWRlZmF1bHQ6Ci0JCQkJCWlmIChjYXJkX2ZyZWVfaWQgPj0gMCkKLQkJCQkJCWNhcmRfbWF0Y2hfaWQgPSBjYXJkX2ZyZWVfaWQ7Ci0JCQkJCWVsc2UKLQkJCQkJCWNhcmRfbWF0Y2hfaWQgPSBjYXJkX25vdXNlX2lkOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgTUNfU0VMRUNUX01BQzogLy8gTUFDCi0JCQkJCXNwcmludGYoY2FyZF9pZF9idWYsICJNQUMlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCi0JCQkJCQkJbWFjWzBdLCBtYWNbMV0sIG1hY1syXSwKLQkJCQkJCQltYWNbM10sIG1hY1s0XSwgbWFjWzVdKTsKLQotCQkJCQkvKiB0cnkgdG8gZmluZCB0aGUga2V5IHdvcmQgaW4gdGhlIGNhcmQgZmlsZSAqLwotCQkJCQlpZiAoKHN0YXJ0X3B0ciA9IChQVUNIQVIpcnRzdHJzdHJ1bmNhc2VjbXAoYnVmZmVyLCBjYXJkX2lkX2J1ZikpICE9IE5VTEwpCi0JCQkJCXsKLQkJCQkJCUxFVFRFUl9DQVNFX1RSQU5TTEFURShzdGFydF9wdHIsIGNhcmRfaWRfYnVmKTsKLQotCQkJCQkJLyogZ2V0IHRoZSByb3cgSUQgKDIgQVNDSUkgY2hhcmFjdGVycykgKi8KLQkJCQkJCXN0YXJ0X3B0ciAtPSAyOwotCQkJCQkJY2FyZF9pZF9idWZbMF0gPSAqKHN0YXJ0X3B0cik7Ci0JCQkJCQljYXJkX2lkX2J1ZlsxXSA9ICooc3RhcnRfcHRyKzEpOwotCQkJCQkJY2FyZF9pZF9idWZbMl0gPSAweDAwOwotCi0JCQkJCQljYXJkX21hdGNoX2lkID0gc2ltcGxlX3N0cnRvbChjYXJkX2lkX2J1ZiwgMCwgMTApOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBNQ19TRUxFQ1RfQ0FSRFRZUEU6IC8vIENBUkRUWVBFCi0JCQkJCWNhcmRfbm91c2VfaWQgPSAtMTsKLQotCQkJCQlmb3IoY2FyZF9pbmRleD0wOwotCQkJCQkJY2FyZF9pbmRleDxNQVhfTlVNX09GX01VTFRJUExFX0NBUkQ7Ci0JCQkJCQljYXJkX2luZGV4KyspCi0JCQkJCXsKLQkJCQkJCXNwcmludGYoY2FyZF9pZF9idWYsICIlMDJkQ0FSRFRZUEUlcyIsCi0JCQkJCQkJCWNhcmRfaW5kZXgsIFJGSUNfd29yZCk7Ci0KLQkJCQkJCWlmICgoc3RhcnRfcHRyID0gKFBVQ0hBUilydHN0cnN0cnVuY2FzZWNtcChidWZmZXIsCi0JCQkJCQkJCQkJCQkJY2FyZF9pZF9idWYpKSAhPSBOVUxMKQotCQkJCQkJewotCQkJCQkJCUxFVFRFUl9DQVNFX1RSQU5TTEFURShzdGFydF9wdHIsIGNhcmRfaWRfYnVmKTsKLQotCQkJCQkJCWlmIChNQ19DYXJkVXNlZFtjYXJkX2luZGV4XSA9PSAwKQotCQkJCQkJCXsKLQkJCQkJCQkJLyogY3VycmVudCB0aGUgY2FyZCBwcm9maWxlIGlzIG5vdCB1c2VkICovCi0JCQkJCQkJCWlmICgoKihVSU5UMzIgKikmTUNfQ2FyZE1hY1tjYXJkX2luZGV4XVswXSA9PSAwKSAmJgotCQkJCQkJCQkJKCooVUlOVDE2ICopJk1DX0NhcmRNYWNbY2FyZF9pbmRleF1bNF0gPT0gMCkpCi0JCQkJCQkJCXsKLQkJCQkJCQkJCS8vIGZpbmQgaXQgYW5kIG5vIHByZXZpb3VzIGNhcmQgdXNlIGl0Ci0JCQkJCQkJCQljYXJkX21hdGNoX2lkID0gY2FyZF9pbmRleDsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UKLQkJCQkJCQkJewotCQkJCQkJCQkJLy8gZXZlciBhIGNhcmQgdXNlIGl0Ci0JCQkJCQkJCQlpZiAoY2FyZF9ub3VzZV9pZCA8IDApCi0JCQkJCQkJCQkJY2FyZF9ub3VzZV9pZCA9IGNhcmRfaW5kZXg7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvLyBpZiBub3QgZmluZCBhIGZyZWUgb25lLCB1c2UgdGhlIGF2YWlsYWJsZSBvbmUKLQkJCQkJaWYgKGNhcmRfbWF0Y2hfaWQgPCAwKQotCQkJCQkJY2FyZF9tYXRjaF9pZCA9IGNhcmRfbm91c2VfaWQ7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKGNhcmRfbWF0Y2hfaWQgPj0gMCkKLQkJewotCQkJLy8gbWFrZSB1cCBzZWFyY2gga2V5d29yZAotCQkJc3dpdGNoKGNhcmRfc2VsZWN0X21ldGhvZCkKLQkJCXsKLQkJCQljYXNlIE1DX1NFTEVDVF9DQVJESUQ6IC8vIENBUkRJRAotCQkJCQlzcHJpbnRmKGNhcmRfaWRfYnVmLCAiJTAyZENBUkRJRCIsIGNhcmRfbWF0Y2hfaWQpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgTUNfU0VMRUNUX01BQzogLy8gTUFDCi0JCQkJCXNwcmludGYoY2FyZF9pZF9idWYsCi0JCQkJCQkJIiUwMmRtYWMlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCi0JCQkJCQkJY2FyZF9tYXRjaF9pZCwKLQkJCQkJCQltYWNbMF0sIG1hY1sxXSwgbWFjWzJdLAotCQkJCQkJCW1hY1szXSwgbWFjWzRdLCBtYWNbNV0pOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgTUNfU0VMRUNUX0NBUkRUWVBFOiAvLyBDQVJEVFlQRQotCQkJCWRlZmF1bHQ6Ci0JCQkJCXNwcmludGYoY2FyZF9pZF9idWYsICIlMDJkY2FyZHR5cGUlcyIsCi0JCQkJCQkJY2FyZF9tYXRjaF9pZCwgUkZJQ193b3JkKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlYXJjaCBLZXl3b3JkID0gJXNcbiIsIGNhcmRfaWRfYnVmKSk7Ci0KLQkJCS8vIHJlYWQgY2FyZCBmaWxlIHBhdGgKLQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKGNhcmRfaWRfYnVmLCB0bXBidWYsIDI1NiwgYnVmZmVyLCBUUlVFKSkKLQkJCXsKLQkJCQlpZiAoc3RybGVuKHRtcGJ1ZikgPCBzaXplb2YocEFkLT5NQ19GaWxlTmFtZSkpCi0JCQkJewotCQkJCQkvLyBiYWNrdXAgY2FyZCBpbmZvcm1hdGlvbgotCQkJCQlwQWQtPk1DX1Jvd0lEID0gY2FyZF9tYXRjaF9pZDsgLyogYmFzZSAwICovCi0JCQkJCU1DX0NhcmRVc2VkW2NhcmRfbWF0Y2hfaWRdID0gMTsKLQkJCQkJbWVtY3B5KE1DX0NhcmRNYWNbY2FyZF9tYXRjaF9pZF0sIG1hYywgc2l6ZW9mKG1hYykpOwotCi0JCQkJCS8vIGJhY2t1cCBjYXJkIGZpbGUgcGF0aAotCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1DX0ZpbGVOYW1lLCB0bXBidWYgLCBzdHJsZW4odG1wYnVmKSk7Ci0JCQkJCXBBZC0+TUNfRmlsZU5hbWVbc3RybGVuKHRtcGJ1ZildID0gJ1wwJzsKLQkJCQkJZmxnX21hdGNoX29rID0gVFJVRTsKLQotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKLQkJCQkJCQkoIkNhcmQgUHJvZmlsZSBOYW1lID0gJXNcbiIsIHBBZC0+TUNfRmlsZU5hbWUpKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCi0JCQkJCQkJKCJDYXJkIFByb2ZpbGUgTmFtZSBsZW5ndGggdG9vIGxhcmdlIVxuIikpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKLQkJCQkJCSgiQ2FuIG5vdCBmaW5kIHNlYXJjaCBrZXkgd29yZCBpbiBjYXJkLmRhdCFcbiIpKTsKLQkJCX0KLQotCQkJaWYgKChmbGdfbWF0Y2hfb2sgIT0gVFJVRSkgJiYKLQkJCQkoY2FyZF9tYXRjaF9pZCA8IE1BWF9OVU1fT0ZfTVVMVElQTEVfQ0FSRCkpCi0JCQl7Ci0JCQkJTUNfQ2FyZFVzZWRbY2FyZF9tYXRjaF9pZF0gPSAwOwotCQkJCW1lbXNldChNQ19DYXJkTWFjW2NhcmRfbWF0Y2hfaWRdLCAwLCBzaXplb2YobWFjKSk7Ci0JCQl9Ci0JCX0gLy8gaWYgKGNhcmRfbWF0Y2hfaWQgPj0gMCkKLQl9Ci0KLQotCS8vIGNsb3NlIGZpbGUKLQlyZXR2YWwgPSBSdG1wT1NGaWxlQ2xvc2Uoc3JjZik7Ci0KLWZyZWVfcmVzb3VyY2U6Ci0JUnRtcE9TRlNJbmZvQ2hhbmdlKCZvc0ZTSW5mbywgRkFMU0UpOwotCWtmcmVlKGJ1ZmZlcik7Ci0Ja2ZyZWUodG1wYnVmKTsKLQotCXJldHVybiBmbGdfbWF0Y2hfb2s7Ci19Ci0jZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fc2FuaXR5LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fc2FuaXR5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNjMxYzMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX3Nhbml0eS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcxOCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXNhbml0eS5jCi0KLQlBYnN0cmFjdDoKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JSm9obiBDaGFuZyAgMjAwNC0wOS0wMSAgICAgIGFkZCBXTU0gc3VwcG9ydAotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLWV4dGVybiBVQ0hBUglDSVNDT19PVUlbXTsKLQotZXh0ZXJuIFVDSEFSCVdQQV9PVUlbXTsKLWV4dGVybiBVQ0hBUglSU05fT1VJW107Ci1leHRlcm4gVUNIQVIJV01FX0lORk9fRUxFTVtdOwotZXh0ZXJuIFVDSEFSCVdNRV9QQVJNX0VMRU1bXTsKLWV4dGVybiBVQ0hBUglDY3gyUW9zSW5mb1tdOwotZXh0ZXJuIFVDSEFSCVJBTElOS19PVUlbXTsKLWV4dGVybiBVQ0hBUglCUk9BRENPTV9PVUlbXTsKLWV4dGVybiBVQ0hBUiAgICBXUFNfT1VJW107Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjawotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIE1sbWVBZGRCQVJlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIyKQotewotICAgIFBNTE1FX0FEREJBX1JFUV9TVFJVQ1QgICBwSW5mbzsKLQotICAgIHBJbmZvID0gKE1MTUVfQUREQkFfUkVRX1NUUlVDVCAqKU1zZzsKLQotICAgIGlmICgoTXNnTGVuICE9IHNpemVvZihNTE1FX0FEREJBX1JFUV9TVFJVQ1QpKSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVBZGRCQVJlcVNhbml0eSBmYWlsIC0gbWVzc2FnZSBsZW5naHQgbm90IGNvcnJlY3QuXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpZiAoKHBJbmZvLT5XY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVBZGRCQVJlcVNhbml0eSBmYWlsIC0gVGhlIHBlZXIgTWFjIGlzIG5vdCBhc3NvY2lhdGVkIHlldC5cbiIpKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotCS8qCi0gICAgaWYgKChwSW5mby0+QmFCdWZTaXplID4gTUFYX1JYX1JFT1JERVJCVUYpIHx8IChwSW5mby0+QmFCdWZTaXplIDwgMikpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lQWRkQkFSZXFTYW5pdHkgZmFpbCAtIFJ4IFJlb3JkZXJpbmcgYnVmZmVyIHRvbyBiaWcgb3IgdG9vIHNtYWxsXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0JKi8KLQotICAgIGlmICgocEluZm8tPnBBZGRyWzBdJjB4MDEpID09IDB4MDEpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lQWRkQkFSZXFTYW5pdHkgZmFpbCAtIGJyb2FkY2FzdCBhZGRyZXNzIG5vdCBzdXBwb3J0IEJBXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLUJPT0xFQU4gTWxtZURlbEJBUmVxU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4pCi17Ci0JTUxNRV9ERUxCQV9SRVFfU1RSVUNUICpwSW5mbzsKLQlwSW5mbyA9IChNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgKilNc2c7Ci0KLSAgICBpZiAoKE1zZ0xlbiAhPSBzaXplb2YoTUxNRV9ERUxCQV9SRVFfU1RSVUNUKSkpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNbG1lRGVsQkFSZXFTYW5pdHkgZmFpbCAtIG1lc3NhZ2UgbGVuZ2h0IG5vdCBjb3JyZWN0LlxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgaWYgKChwSW5mby0+V2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNbG1lRGVsQkFSZXFTYW5pdHkgZmFpbCAtIFRoZSBwZWVyIE1hYyBpcyBub3QgYXNzb2NpYXRlZCB5ZXQuXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpZiAoKHBJbmZvLT5USUQgJiAweGYwKSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk1sbWVEZWxCQVJlcVNhbml0eSBmYWlsIC0gVGhlIHBlZXIgVElEIGlzIGluY29ycmVjdC5cbiIpKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotCWlmIChOZGlzRXF1YWxNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQWRkciwgcEluZm8tPkFkZHIsIE1BQ19BRERSX0xFTikgPT0gMCkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk1sbWVEZWxCQVJlcVNhbml0eSBmYWlsIC0gdGhlIHBlZXIgYWRkciBkb3Nlbid0IGV4aXN0LlxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUJPT0xFQU4gUGVlckFkZEJBUmVxQWN0aW9uU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKnBNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotCU9VVCBQVUNIQVIgcEFkZHIyKQotewotCVBGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKLQlQRlJBTUVfQUREQkFfUkVRIHBBZGRGcmFtZTsKLQlwQWRkRnJhbWUgPSAoUEZSQU1FX0FEREJBX1JFUSkocE1zZyk7Ci0JaWYgKE1zZ0xlbiA8IChzaXplb2YoRlJBTUVfQUREQkFfUkVRKSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVxdWVzdCBmcmFtZSBsZW5ndGggc2l6ZSA9ICVsZCBpbmNvcnJlY3RcbiIsIE1zZ0xlbikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCS8vIHdlIHN1cHBvcnQgaW1tZWRpYXRlIEJBLgotI2lmZGVmIFVOQUxJR05NRU5UX1NVUFBPUlQKLQl7Ci0JCUJBX1BBUk0JCXRtcEJhUGFybTsKLQotCQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSgmdG1wQmFQYXJtKSwgKFBVQ0hBUikoJnBBZGRGcmFtZS0+QmFQYXJtKSwgc2l6ZW9mKEJBX1BBUk0pKTsKLQkJKihVU0hPUlQgKikoJnRtcEJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmdG1wQmFQYXJtKSk7Ci0JCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpKCZwQWRkRnJhbWUtPkJhUGFybSksIChQVUNIQVIpKCZ0bXBCYVBhcm0pLCBzaXplb2YoQkFfUEFSTSkpOwotCX0KLSNlbHNlCi0JKihVU0hPUlQgKikoJnBBZGRGcmFtZS0+QmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwQWRkRnJhbWUtPkJhUGFybSkpOwotI2VuZGlmCi0JcEFkZEZyYW1lLT5UaW1lT3V0VmFsdWUgPSBjcHUybGUxNihwQWRkRnJhbWUtPlRpbWVPdXRWYWx1ZSk7Ci0JcEFkZEZyYW1lLT5CYVN0YXJ0U2VxLndvcmQgPSBjcHUybGUxNihwQWRkRnJhbWUtPkJhU3RhcnRTZXEud29yZCk7Ci0KLQlpZiAocEFkZEZyYW1lLT5CYVBhcm0uQkFQb2xpY3kgIT0gSU1NRURfQkEpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVxdWVzdCBCYSBQb2xpY3lbJWRdIG5vdCBzdXBwb3J0XG4iLCBwQWRkRnJhbWUtPkJhUGFybS5CQVBvbGljeSkpOwotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkFEREJBIFJlcXVlc3QuIHRpZD0leCwgQnVmc2l6ZT0leCwgQU1TRFVTdXBwb3J0ZWQ9JXggXG4iLCBwQWRkRnJhbWUtPkJhUGFybS5USUQsIHBBZGRGcmFtZS0+QmFQYXJtLkJ1ZlNpemUsIHBBZGRGcmFtZS0+QmFQYXJtLkFNU0RVU3VwcG9ydGVkKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQkvLyB3ZSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4KLQlpZiAocEFkZEZyYW1lLT5CYVBhcm0uVElEICYweGZmZjApCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVxdWVzdCBpbmNvcnJlY3QgVElEID0gJWRcbiIsIHBBZGRGcmFtZS0+QmFQYXJtLlRJRCkpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCUNPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLUJPT0xFQU4gUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKnBNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuKQotewotCS8vUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOwotCVBGUkFNRV9BRERCQV9SU1AgcEFkZEZyYW1lOwotCi0JcEFkZEZyYW1lID0gKFBGUkFNRV9BRERCQV9SU1ApKHBNc2cpOwotCWlmIChNc2dMZW4gPCAoc2l6ZW9mKEZSQU1FX0FEREJBX1JTUCkpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSc3BBY3Rpb25TYW5pdHk6IEFEREJBIFJlc3BvbnNlIGZyYW1lIGxlbmd0aCBzaXplID0gJWxkIGluY29ycmVjdFxuIiwgTXNnTGVuKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0JLy8gd2Ugc3VwcG9ydCBpbW1lZGlhdGUgQkEuCi0jaWZkZWYgVU5BTElHTk1FTlRfU1VQUE9SVAotCXsKLQkJQkFfUEFSTQkJdG1wQmFQYXJtOwotCi0JCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpKCZ0bXBCYVBhcm0pLCAoUFVDSEFSKSgmcEFkZEZyYW1lLT5CYVBhcm0pLCBzaXplb2YoQkFfUEFSTSkpOwotCQkqKFVTSE9SVCAqKSgmdG1wQmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZ0bXBCYVBhcm0pKTsKLQkJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikoJnBBZGRGcmFtZS0+QmFQYXJtKSwgKFBVQ0hBUikoJnRtcEJhUGFybSksIHNpemVvZihCQV9QQVJNKSk7Ci0JfQotI2Vsc2UKLQkqKFVTSE9SVCAqKSgmcEFkZEZyYW1lLT5CYVBhcm0pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBBZGRGcmFtZS0+QmFQYXJtKSk7Ci0jZW5kaWYKLQlwQWRkRnJhbWUtPlN0YXR1c0NvZGUgPSBjcHUybGUxNihwQWRkRnJhbWUtPlN0YXR1c0NvZGUpOwotCXBBZGRGcmFtZS0+VGltZU91dFZhbHVlID0gY3B1MmxlMTYocEFkZEZyYW1lLT5UaW1lT3V0VmFsdWUpOwotCi0JaWYgKHBBZGRGcmFtZS0+QmFQYXJtLkJBUG9saWN5ICE9IElNTUVEX0JBKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlc3BvbnNlIEJhIFBvbGljeVslZF0gbm90IHN1cHBvcnRcbiIsIHBBZGRGcmFtZS0+QmFQYXJtLkJBUG9saWN5KSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQkvLyB3ZSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4KLQlpZiAocEFkZEZyYW1lLT5CYVBhcm0uVElEICYweGZmZjApCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJzcEFjdGlvblNhbml0eTogQUREQkEgUmVzcG9uc2UgaW5jb3JyZWN0IFRJRCA9ICVkXG4iLCBwQWRkRnJhbWUtPkJhUGFybS5USUQpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQlyZXR1cm4gVFJVRTsKLQotfQotCi1CT09MRUFOIFBlZXJEZWxCQUFjdGlvblNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBVQ0hBUiBXY2lkLAotICAgIElOIFZPSUQgKnBNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuICkKLXsKLQkvL1BGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKLQlQRlJBTUVfREVMQkFfUkVRICBwRGVsRnJhbWU7Ci0JaWYgKE1zZ0xlbiAhPSAoc2l6ZW9mKEZSQU1FX0RFTEJBX1JFUSkpKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlpZiAoV2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JcERlbEZyYW1lID0gKFBGUkFNRV9ERUxCQV9SRVEpKHBNc2cpOwotCi0JKihVU0hPUlQgKikoJnBEZWxGcmFtZS0+RGVsYmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwRGVsRnJhbWUtPkRlbGJhUGFybSkpOwotCXBEZWxGcmFtZS0+UmVhc29uQ29kZSA9IGNwdTJsZTE2KHBEZWxGcmFtZS0+UmVhc29uQ29kZSk7Ci0KLQlpZiAocERlbEZyYW1lLT5EZWxiYVBhcm0uVElEICYweGZmZjApCi0JCXJldHVybiBGQUxTRTsKLQotCXJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotQk9PTEVBTiBQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBJTiBVQ0hBUiAgTXNnQ2hhbm5lbCwKLSAgICBPVVQgUFVDSEFSIHBBZGRyMiwKLSAgICBPVVQgUFVDSEFSIHBCc3NpZCwKLSAgICBPVVQgQ0hBUiBTc2lkW10sCi0gICAgT1VUIFVDSEFSICpwU3NpZExlbiwKLSAgICBPVVQgVUNIQVIgKnBCc3NUeXBlLAotICAgIE9VVCBVU0hPUlQgKnBCZWFjb25QZXJpb2QsCi0gICAgT1VUIFVDSEFSICpwQ2hhbm5lbCwKLSAgICBPVVQgVUNIQVIgKnBOZXdDaGFubmVsLAotICAgIE9VVCBMQVJHRV9JTlRFR0VSICpwVGltZXN0YW1wLAotICAgIE9VVCBDRl9QQVJNICpwQ2ZQYXJtLAotICAgIE9VVCBVU0hPUlQgKnBBdGltV2luLAotICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKLSAgICBPVVQgVUNIQVIgKnBFcnAsCi0gICAgT1VUIFVDSEFSICpwRHRpbUNvdW50LAotICAgIE9VVCBVQ0hBUiAqcER0aW1QZXJpb2QsCi0gICAgT1VUIFVDSEFSICpwQmNhc3RGbGFnLAotICAgIE9VVCBVQ0hBUiAqcE1lc3NhZ2VUb01lLAotICAgIE9VVCBVQ0hBUiBTdXBSYXRlW10sCi0gICAgT1VUIFVDSEFSICpwU3VwUmF0ZUxlbiwKLSAgICBPVVQgVUNIQVIgRXh0UmF0ZVtdLAotICAgIE9VVCBVQ0hBUiAqcEV4dFJhdGVMZW4sCi0gICAgT1VUCVVDSEFSICpwQ2tpcEZsYWcsCi0gICAgT1VUCVVDSEFSICpwQWlyb25ldENlbGxQb3dlckxpbWl0LAotICAgIE9VVCBQRURDQV9QQVJNICAgICAgIHBFZGNhUGFybSwKLSAgICBPVVQgUFFCU1NfTE9BRF9QQVJNICBwUWJzc0xvYWQsCi0gICAgT1VUIFBRT1NfQ0FQQUJJTElUWV9QQVJNIHBRb3NDYXBhYmlsaXR5LAotICAgIE9VVCBVTE9ORyAqcFJhbGlua0llLAotICAgIE9VVCBVQ0hBUgkJICpwSHRDYXBhYmlsaXR5TGVuLAotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotICAgIE9VVCBVQ0hBUgkJICpwUHJlTkh0Q2FwYWJpbGl0eUxlbiwKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKLQlPVVQgVUNIQVIJCSAqQWRkSHRJbmZvTGVuLAotCU9VVCBBRERfSFRfSU5GT19JRSAqQWRkSHRJbmZvLAotCU9VVCBVQ0hBUiAqTmV3RXh0Q2hhbm5lbE9mZnNldCwJCS8vIEh0IGV4dGVuc2lvbiBjaGFubmVsIG9mZnNldChhYm92ZSBvciBiZWxvdykKLSAgICBPVVQgVVNIT1JUICpMZW5ndGhWSUUsCi0gICAgT1VUCVBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSkKLXsKLSAgICBVQ0hBUgkJCQkqUHRyOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCVVDSEFSCQkJCVRpbUxlbjsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSAgICBQRlJBTUVfODAyXzExCQlwRnJhbWU7Ci0gICAgUEVJRF9TVFJVQ1QgICAgICAgICBwRWlkOwotICAgIFVDSEFSCQkJCVN1YlR5cGU7Ci0gICAgVUNIQVIJCQkJU2FuaXR5OwotICAgIC8vVUNIQVIJCQkJRUNXTWluLCBFQ1dNYXg7Ci0gICAgLy9NQUNfQ1NSOV9TVFJVQwkJQ3NyOTsKLSAgICBVTE9ORwkJCQlMZW5ndGggPSAwOwotCi0JLy8gRm9yIHNvbWUgMTFhIEFQIHdoaWNoIGRpZG4ndCBoYXZlIERTX0lFLCB3ZSB1c2UgdHdvIGNvbmRpdGlvbnMgdG8gZGVjaWRlIHRoZSBjaGFubmVsCi0JLy8JMS4gSWYgdGhlIEFQIGlzIDExbiBlbmFibGVkLCB0aGVuIGNoZWNrIHRoZSBjb250cm9sIGNoYW5uZWwuCi0JLy8JMi4gSWYgdGhlIEFQIGRpZG4ndCBoYXZlIGFueSBpbmZvIGFib3V0IGNoYW5uZWwsIHVzZSB0aGUgY2hhbm5lbCB3ZSByZWNlaXZlZCB0aGlzIGZyYW1lIGFzIHRoZSBjaGFubmVsLiAoTWF5IGluYWNjdXJhY3khISkKLQlVQ0hBUgkJCUN0cmxDaGFubmVsID0gMDsKLQotICAgIC8vIEFkZCBmb3IgMyBuZWNlc3NhcnkgRUlEIGZpZWxkIGNoZWNrCi0gICAgU2FuaXR5ID0gMDsKLQotICAgICpwQXRpbVdpbiA9IDA7Ci0gICAgKnBFcnAgPSAwOwotICAgICpwRHRpbUNvdW50ID0gMDsKLSAgICAqcER0aW1QZXJpb2QgPSAwOwotICAgICpwQmNhc3RGbGFnID0gMDsKLSAgICAqcE1lc3NhZ2VUb01lID0gMDsKLSAgICAqcEV4dFJhdGVMZW4gPSAwOwotICAgICpwQ2tpcEZsYWcgPSAwOwkJCSAgICAgICAgLy8gRGVmYXVsdCBvZiBDa2lwRmxhZyBpcyAwCi0gICAgKnBBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPSAweEZGOyAgLy8gRGVmYXVsdCBvZiBBaXJvbmV0Q2VsbFBvd2VyTGltaXQgaXMgMHhGRgotICAgICpMZW5ndGhWSUUgPSAwOwkJCQkJLy8gU2V0IHRoZSBsZW5ndGggb2YgVklFIHRvIGluaXQgdmFsdWUgMAotICAgICpwSHRDYXBhYmlsaXR5TGVuID0gMDsJCQkJCS8vIFNldCB0aGUgbGVuZ3RoIG9mIFZJRSB0byBpbml0IHZhbHVlIDAKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLQkJKnBQcmVOSHRDYXBhYmlsaXR5TGVuID0gMDsJCQkJCS8vIFNldCB0aGUgbGVuZ3RoIG9mIFZJRSB0byBpbml0IHZhbHVlIDAKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSAgICAqQWRkSHRJbmZvTGVuID0gMDsJCQkJCS8vIFNldCB0aGUgbGVuZ3RoIG9mIFZJRSB0byBpbml0IHZhbHVlIDAKLSAgICAqcFJhbGlua0llID0gMDsKLSAgICAqcE5ld0NoYW5uZWwgPSAwOwotICAgICpOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsJLy9EZWZhdWx0IDB4ZmYgbWVhbnMgbm8gc3VjaCBJRQotICAgIHBDZlBhcm0tPmJWYWxpZCA9IEZBTFNFOyAgICAgICAgLy8gZGVmYXVsdDogbm8gSUVfQ0YgZm91bmQKLSAgICBwUWJzc0xvYWQtPmJWYWxpZCA9IEZBTFNFOyAgICAgIC8vIGRlZmF1bHQ6IG5vIElFX1FCU1NfTE9BRCBmb3VuZAotICAgIHBFZGNhUGFybS0+YlZhbGlkID0gRkFMU0U7ICAgICAgLy8gZGVmYXVsdDogbm8gSUVfRURDQV9QQVJBTUVURVIgZm91bmQKLSAgICBwUW9zQ2FwYWJpbGl0eS0+YlZhbGlkID0gRkFMU0U7IC8vIGRlZmF1bHQ6IG5vIElFX1FPU19DQVBBQklMSVRZIGZvdW5kCi0KLSAgICBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7Ci0KLSAgICAvLyBnZXQgc3VidHlwZSBmcm9tIGhlYWRlcgotICAgIFN1YlR5cGUgPSAoVUNIQVIpcEZyYW1lLT5IZHIuRkMuU3ViVHlwZTsKLQotICAgIC8vIGdldCBBZGRyMiBhbmQgQlNTSUQgZnJvbSBoZWFkZXIKLSAgICBDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOwotICAgIENPUFlfTUFDX0FERFIocEJzc2lkLCBwRnJhbWUtPkhkci5BZGRyMyk7Ci0KLS8vCWhleF9kdW1wKCJCZWFjb24iLCBNc2csIE1zZ0xlbik7Ci0KLSAgICBQdHIgPSBwRnJhbWUtPk9jdGV0OwotICAgIExlbmd0aCArPSBMRU5HVEhfODAyXzExOwotCi0gICAgLy8gZ2V0IHRpbWVzdGFtcCBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKLSAgICBOZGlzTW92ZU1lbW9yeShwVGltZXN0YW1wLCBQdHIsIFRJTUVTVEFNUF9MRU4pOwotCi0JcFRpbWVzdGFtcC0+dS5Mb3dQYXJ0ID0gY3B1MmxlMzIocFRpbWVzdGFtcC0+dS5Mb3dQYXJ0KTsKLQlwVGltZXN0YW1wLT51LkhpZ2hQYXJ0ID0gY3B1MmxlMzIocFRpbWVzdGFtcC0+dS5IaWdoUGFydCk7Ci0KLSAgICBQdHIgKz0gVElNRVNUQU1QX0xFTjsKLSAgICBMZW5ndGggKz0gVElNRVNUQU1QX0xFTjsKLQotICAgIC8vIGdldCBiZWFjb24gaW50ZXJ2YWwgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgTmRpc01vdmVNZW1vcnkocEJlYWNvblBlcmlvZCwgUHRyLCAyKTsKLSAgICBQdHIgKz0gMjsKLSAgICBMZW5ndGggKz0gMjsKLQotICAgIC8vIGdldCBjYXBhYmlsaXR5IGluZm8gZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgTmRpc01vdmVNZW1vcnkocENhcGFiaWxpdHlJbmZvLCBQdHIsIDIpOwotICAgIFB0ciArPSAyOwotICAgIExlbmd0aCArPSAyOwotCi0gICAgaWYgKENBUF9JU19FU1NfT04oKnBDYXBhYmlsaXR5SW5mbykpCi0gICAgICAgICpwQnNzVHlwZSA9IEJTU19JTkZSQTsKLSAgICBlbHNlCi0gICAgICAgICpwQnNzVHlwZSA9IEJTU19BREhPQzsKLQotICAgIHBFaWQgPSAoUEVJRF9TVFJVQ1QpIFB0cjsKLQotICAgIC8vIGdldCB2YXJpYWJsZSBmaWVsZHMgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgd2hpbGUgKChMZW5ndGggKyAyICsgcEVpZC0+TGVuKSA8PSBNc2dMZW4pCi0gICAgewotICAgICAgICAvLwotICAgICAgICAvLyBTZWN1cmUgY29weSBWSUUgdG8gVmFySUVbTUFYX1ZJRV9MRU5dIGRpZG4ndCBvdmVyZmxvdy4KLSAgICAgICAgLy8KLSAgICAgICAgaWYgKCgqTGVuZ3RoVklFICsgcEVpZC0+TGVuICsgMikgPj0gTUFYX1ZJRV9MRU4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gVmFyaWFibGUgSUVzIG91dCBvZiByZXNvdXJjZSBbbGVuKD0lZCkgPiBNQVhfVklFX0xFTig9JWQpXVxuIiwKLSAgICAgICAgICAgICAgICAgICAgKCpMZW5ndGhWSUUgKyBwRWlkLT5MZW4gKyAyKSwgTUFYX1ZJRV9MRU4pKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoKHBFaWQtPkVpZCkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBJRV9TU0lEOgotICAgICAgICAgICAgICAgIC8vIEFscmVhZHkgaGFzIG9uZSBTU0lEIEVJRCBpbiB0aGlzIGJlYWNvbiwgaWdub3JlIHRoZSBzZWNvbmQgb25lCi0gICAgICAgICAgICAgICAgaWYgKFNhbml0eSAmIDB4MSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgaWYocEVpZC0+TGVuIDw9IE1BWF9MRU5fT0ZfU1NJRCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFNzaWQsIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOwotICAgICAgICAgICAgICAgICAgICAqcFNzaWRMZW4gPSBwRWlkLT5MZW47Ci0gICAgICAgICAgICAgICAgICAgIFNhbml0eSB8PSAweDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX1NTSUQgKGxlbj0lZClcbiIscEVpZC0+TGVuKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgSUVfU1VQUF9SQVRFUzoKLSAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTYW5pdHkgfD0gMHgyOwotICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShTdXBSYXRlLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKLSAgICAgICAgICAgICAgICAgICAgKnBTdXBSYXRlTGVuID0gcEVpZC0+TGVuOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IDIwMDQtMDktMTQgbm90IGEgZ29vZCBkZXNpZ24gaGVyZSwgY2F1c2UgaXQgZXhjbHVkZSBleHRyYSByYXRlcwotICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIFNjYW5UYWIuIFdlIHNob3VsZCByZXBvcnQgYXMgaXMuIEFuZCBmaWx0ZXIgb3V0IHVuc3VwcG9ydGVkCi0gICAgICAgICAgICAgICAgICAgIC8vIHJhdGVzIGluIE1sbWVBdXguCi0gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGFnYWluc3QgdGhlIHN1cHBvcnRlZCByYXRlcwotICAgICAgICAgICAgICAgICAgICAvLyBSVE1QQ2hlY2tSYXRlcyhwQWQsIFN1cFJhdGUsIHBTdXBSYXRlTGVuKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfU1VQUF9SQVRFUyAobGVuPSVkKVxuIixwRWlkLT5MZW4pKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBJRV9IVF9DQVA6Ci0JCQlpZiAocEVpZC0+TGVuID49IFNJWkVfSFRfQ0FQX0lFKSAgLy9Ob3RlOiBhbGxvdyBleHRlbnNpb24uISEKLQkJCXsKLQkJCQlOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LCBwRWlkLT5PY3RldCwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKLQkJCQkqcEh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOwkvLyBObm93IHdlIG9ubHkgc3VwcG9ydCAyNiBieXRlcy4KLQotCQkJCSooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykpOwotI2lmZGVmIFVOQUxJR05NRU5UX1NVUFBPUlQKLQkJCQl7Ci0JCQkJCUVYVF9IVF9DQVBfSU5GTyBleHRIdENhcEluZm87Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpKCZleHRIdENhcEluZm8pLCAoUFVDSEFSKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSwgc2l6ZW9mKEVYVF9IVF9DQVBfSU5GTykpOwotCQkJCQkqKFVTSE9SVCAqKSgmZXh0SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZleHRIdENhcEluZm8pKTsKLQkJCQkJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbyksIChQVUNIQVIpKCZleHRIdENhcEluZm8pLCBzaXplb2YoRVhUX0hUX0NBUF9JTkZPKSk7Ci0JCQkJfQotI2Vsc2UKLQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pKTsKLSNlbmRpZiAvLyBVTkFMSUdOTUVOVF9TVVBQT1JUIC8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJCXsKLQkJCQkJKnBQcmVOSHRDYXBhYmlsaXR5TGVuID0gMDsJLy8gTm93IHdlIG9ubHkgc3VwcG9ydCAyNiBieXRlcy4KLQotCQkJCQlQdHIgPSAoUFVDSEFSKSBwVklFOwotCQkJCQlOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLCAmcEVpZC0+RWlkLCBwRWlkLT5MZW4gKyAyKTsKLQkJCQkJKkxlbmd0aFZJRSArPSAocEVpZC0+TGVuICsgMik7Ci0JCQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfSFRfQ0FQLiBwRWlkLT5MZW4gPSAlZFxuIiwgcEVpZC0+TGVuKSk7Ci0JCQl9Ci0KLQkJYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElFX0FERF9IVDoKLQkJCWlmIChwRWlkLT5MZW4gPj0gc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSkKLQkJCXsKLQkJCQkvLyBUaGlzIElFIGFsbG93cyBleHRlbnNpb24sIGJ1dCB3ZSBjYW4gaWdub3JlIGV4dHJhIGJ5dGVzIGJleW9uZCBvdXIga25vd2xlZGdlICwgc28gb25seQotCQkJCS8vIGNvcHkgZmlyc3Qgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKQotCQkJCU5kaXNNb3ZlTWVtb3J5KEFkZEh0SW5mbywgcEVpZC0+T2N0ZXQsIHNpemVvZihBRERfSFRfSU5GT19JRSkpOwotCQkJCSpBZGRIdEluZm9MZW4gPSBTSVpFX0FERF9IVF9JTkZPX0lFOwotCi0JCQkJQ3RybENoYW5uZWwgPSBBZGRIdEluZm8tPkNvbnRyb2xDaGFuOwotCi0JCQkJKihVU0hPUlQgKikoJkFkZEh0SW5mby0+QWRkSHRJbmZvMikgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmQWRkSHRJbmZvLT5BZGRIdEluZm8yKSk7Ci0JCQkJKihVU0hPUlQgKikoJkFkZEh0SW5mby0+QWRkSHRJbmZvMykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmQWRkSHRJbmZvLT5BZGRIdEluZm8zKSk7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJCXsKLQkJCSAgICAgICAgICAgICAgICBQdHIgPSAoUFVDSEFSKSBwVklFOwotCQkJICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOwotCQkJICAgICAgICAgICAgICAgICpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOwotCQkJCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX0FERF9IVC4gXG4iKSk7Ci0JCQl9Ci0KLQkJYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElFX1NFQ09OREFSWV9DSF9PRkZTRVQ6Ci0JCQlpZiAocEVpZC0+TGVuID09IDEpCi0JCQl7Ci0JCQkJKk5ld0V4dENoYW5uZWxPZmZzZXQgPSBwRWlkLT5PY3RldFswXTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX1NFQ09OREFSWV9DSF9PRkZTRVQuIFxuIikpOwotCQkJfQotCi0JCWJyZWFrOwotICAgICAgICAgICAgY2FzZSBJRV9GSF9QQVJNOgotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eShJRV9GSF9QQVJNKSBcbiIpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBJRV9EU19QQVJNOgotICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA9PSAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKnBDaGFubmVsID0gKnBFaWQtPk9jdGV0OwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJCQl7Ci0JCQkJCQlpZiAoQ2hhbm5lbFNhbml0eShwQWQsICpwQ2hhbm5lbCkgPT0gMCkKLQkJCQkJCXsKLQotCQkJCQkJCXJldHVybiBGQUxTRTsKLQkJCQkJCX0KLQkJCQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotICAgICAgICAgICAgICAgICAgICBTYW5pdHkgfD0gMHg0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9EU19QQVJNIChsZW49JWQpXG4iLHBFaWQtPkxlbikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIElFX0NGX1BBUk06Ci0gICAgICAgICAgICAgICAgaWYocEVpZC0+TGVuID09IDYpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5iVmFsaWQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBDb3VudCA9IHBFaWQtPk9jdGV0WzBdOwotICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBQZXJpb2QgPSBwRWlkLT5PY3RldFsxXTsKLSAgICAgICAgICAgICAgICAgICAgcENmUGFybS0+Q2ZwTWF4RHVyYXRpb24gPSBwRWlkLT5PY3RldFsyXSArIDI1NiAqIHBFaWQtPk9jdGV0WzNdOwotICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBEdXJSZW1haW5pbmcgPSBwRWlkLT5PY3RldFs0XSArIDI1NiAqIHBFaWQtPk9jdGV0WzVdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9DRl9QQVJNXG4iKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgSUVfSUJTU19QQVJNOgotICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA9PSAyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEF0aW1XaW4sIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9JQlNTX1BBUk1cbiIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotICAgICAgICAgICAgY2FzZSBJRV9USU06Ci0gICAgICAgICAgICAgICAgaWYoSU5GUkFfT04ocEFkKSAmJiBTdWJUeXBlID09IFNVQlRZUEVfQkVBQ09OKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgR2V0VGltQml0KChQQ0hBUilwRWlkLCBwQWQtPlN0YUFjdGl2ZS5BaWQsICZUaW1MZW4sIHBCY2FzdEZsYWcsIHBEdGltQ291bnQsIHBEdGltUGVyaW9kLCBwTWVzc2FnZVRvTWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSAgICAgICAgICAgIGNhc2UgSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UOgotICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA9PSAzKQotICAgICAgICAgICAgICAgIHsKLQkJCSpwTmV3Q2hhbm5lbCA9IHBFaWQtPk9jdGV0WzFdOwkvL2V4dHJhY3QgbmV3IGNoYW5uZWwgbnVtYmVyCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvLyBOZXcgZm9yIFdQQQotICAgICAgICAgICAgLy8gQ0NYIHYyIGhhcyB0aGUgc2FtZSBJRSwgd2UgbmVlZCB0byBwYXJzZSB0aGF0IHRvbwotICAgICAgICAgICAgLy8gV2lmaSBXTU0gdXNlIHRoZSBzYW1lIElFIHZhbGUsIG5lZWQgdG8gcGFyc2UgdGhhdCB0b28KLSAgICAgICAgICAgIC8vIGNhc2UgSUVfV1BBOgotICAgICAgICAgICAgY2FzZSBJRV9WRU5ET1JfU1BFQ0lGSUM6Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgQnJvYWRjb20vQXRoZXJvcyA4MDIuMTFuIE9VSSB2ZXJzaW9uLCBmb3IgSFQgQ2FwYWJpbGl0eSBJRS4KLSAgICAgICAgICAgICAgICAvLyBUaGlzIEhUIElFIGlzIGJlZm9yZSBJRUVFIGRyYWZ0IHNldCBIVCBJRSB2YWx1ZS4yMDA2LTA5LTI4IGJ5IEphbi4KLSAgICAgICAgICAgICAgICAvKmlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIEJST0FEQ09NX09VSSwgMykgJiYgKHBFaWQtPkxlbiA+PSA0KSkKLSAgICAgICAgICAgICAgICB7Ci0JCQlpZiAoKHBFaWQtPk9jdGV0WzNdID09IE9VSV9CUk9BRENPTV9IVCkgJiYgKHBFaWQtPkxlbiA+PSAzMCkpCi0JCQl7Ci0JCQkJewotCQkJCQlOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LCAmcEVpZC0+T2N0ZXRbNF0sIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7Ci0JCQkJCSpwSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7CS8vIE5ub3cgd2Ugb25seSBzdXBwb3J0IDI2IGJ5dGVzLgotCQkJCX0KLQkJCX0KLQkJCWlmICgocEVpZC0+T2N0ZXRbM10gPT0gT1VJX0JST0FEQ09NX0hUKSAmJiAocEVpZC0+TGVuID49IDI2KSkKLQkJCXsKLQkJCQl7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KEFkZEh0SW5mbywgJnBFaWQtPk9jdGV0WzRdLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKLQkJCQkJKkFkZEh0SW5mb0xlbiA9IFNJWkVfQUREX0hUX0lORk9fSUU7CS8vIE5ub3cgd2Ugb25seSBzdXBwb3J0IDI2IGJ5dGVzLgotCQkJCX0KLQkJCX0KLSAgICAgICAgICAgICAgICB9Ci0JCQkJKi8KLSAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgT1VJIHZlcnNpb24sIGZpbHRlciBvdXQgbm9uLXN0YW5kYXJkIHVzYWdlCi0gICAgICAgICAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgUkFMSU5LX09VSSwgMykgJiYgKHBFaWQtPkxlbiA9PSA3KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vKnBSYWxpbmtJZSA9IHBFaWQtPk9jdGV0WzNdOwotICAgICAgICAgICAgICAgICAgICBpZiAocEVpZC0+T2N0ZXRbM10gIT0gMCkKLQkJCQkJKnBSYWxpbmtJZSA9IHBFaWQtPk9jdGV0WzNdOwotCQkJCWVsc2UKLQkJCQkJKnBSYWxpbmtJZSA9IDB4ZjAwMDAwMDA7IC8vIFNldCB0byBub24temVybyB2YWx1ZSAoY2FuJ3Qgc2V0IGJpdDAtMikgdG8gcmVwcmVzZW50IHRoaXMgaXMgUmFsaW5rIENoaXAuIFNvIGF0IGxpbmt1cCwgd2Ugd2lsbCBzZXQgcmFsaW5rY2hpcCBmbGFnLgotICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJLy8gVGhpcyBIVCBJRSBpcyBiZWZvcmUgSUVFRSBkcmFmdCBzZXQgSFQgSUUgdmFsdWUuMjAwNi0wOS0yOCBieSBKYW4uCi0KLSAgICAgICAgICAgICAgICAvLyBPdGhlciB2ZW5kb3JzIGhhZCBwcm9kdWN0aW9uIGJlZm9yZSBJRV9IVF9DQVAgdmFsdWUgaXMgYXNzaWduZWQuIFRvIGJhY2t3YXJkIHN1cHBvcnQgdGhvc2Ugb2xkLWZpcm13YXJlIEFQLAotICAgICAgICAgICAgICAgIC8vIENoZWNrIGJyb2FkY29tLWRlZmllbmQgcHJlLTgwMi4xMW5EMS4wIE9VSSBmb3IgSFQgcmVsYXRlZCBJRSwgaW5jbHVkaW5nIEhUIENhcGF0aWxpdGllcyBJRSBhbmQgSFQgSW5mb3JtYXRpb24gSUUKLSAgICAgICAgICAgICAgICBlbHNlIGlmICgoKnBIdENhcGFiaWxpdHlMZW4gPT0gMCkgJiYgTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBQUkVfTl9IVF9PVUksIDMpICYmIChwRWlkLT5MZW4gPj0gNCkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChwRWlkLT5PY3RldFszXSA9PSBPVUlfUFJFTl9IVF9DQVApICYmIChwRWlkLT5MZW4gPj0gMzApICYmICgqcEh0Q2FwYWJpbGl0eUxlbiA9PSAwKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEh0Q2FwYWJpbGl0eSwgJnBFaWQtPk9jdGV0WzRdLCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgKnBQcmVOSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoKHBFaWQtPk9jdGV0WzNdID09IE9VSV9QUkVOX0FERF9IVCkgJiYgKHBFaWQtPkxlbiA+PSAyNikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KEFkZEh0SW5mbywgJnBFaWQtPk9jdGV0WzRdLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpBZGRIdEluZm9MZW4gPSBTSVpFX0FERF9IVF9JTkZPX0lFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IHRvIHBWSUUgd2hpY2ggd2lsbCByZXBvcnQgdG8gbWljcm9zb2Z0IGJzc2lkIGxpc3QuCi0gICAgICAgICAgICAgICAgICAgIFB0ciA9IChQVUNIQVIpIHBWSUU7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOwotICAgICAgICAgICAgICAgICAgICAqTGVuZ3RoVklFICs9IChwRWlkLT5MZW4gKyAyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXTUVfUEFSTV9FTEVNLCA2KSAmJiAocEVpZC0+TGVuID09IDI0KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFBVQ0hBUiBwdHI7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHBhcnNpbmcgRURDQSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlZhbGlkICAgICAgICAgID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUUFjayAgICAgICAgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDEwOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJRdWV1ZVJlcXVlc3QgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4MjA7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlR4b3BSZXF1ZXN0ICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHg0MDsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5FZGNhVXBkYXRlQ291bnQgPSBwRWlkLT5PY3RldFs2XSAmIDB4MGY7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFQU0RDYXBhYmxlICAgID0gKHBFaWQtPk9jdGV0WzZdICYgMHg4MCkgPyAxIDogMDsKLSAgICAgICAgICAgICAgICAgICAgcHRyID0gJnBFaWQtPk9jdGV0WzhdOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGFjaSA9ICgqcHRyICYgMHg2MCkgPj4gNTsgLy8gYjV+NiBpcyBBQyBJTkRFWAotICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW2FjaV0gID0gKCgoKnB0cikgJiAweDEwKSA9PSAweDEwKTsgICAvLyBiNSBpcyBBQ00KLSAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bYWNpXSA9ICgqcHRyKSAmIDB4MGY7ICAgICAgICAgICAgICAgLy8gYjB+MyBpcyBBSUZTTgotICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pblthY2ldID0gKihwdHIrMSkgJiAweDBmOyAgICAgICAgICAgICAvLyBiMH40IGlzIEN3bWluCi0gICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W2FjaV0gPSAqKHB0cisxKSA+PiA0OyAgICAgICAgICAgICAgIC8vIGI1fjggaXMgQ3dtYXgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFthY2ldICA9ICoocHRyKzIpICsgMjU2ICogKCoocHRyKzMpKTsgLy8gaW4gdW5pdCBvZiAzMi11cwotICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IDQ7IC8vIHBvaW50IHRvIG5leHQgQUMKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdNRV9JTkZPX0VMRU0sIDYpICYmIChwRWlkLT5MZW4gPT0gNykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBwYXJzaW5nIEVEQ0EgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJWYWxpZCAgICAgICAgICA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlFBY2sgICAgICAgICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHgxMDsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUXVldWVSZXF1ZXN0ICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDIwOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJUeG9wUmVxdWVzdCAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4NDA7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+RWRjYVVwZGF0ZUNvdW50ID0gcEVpZC0+T2N0ZXRbNl0gJiAweDBmOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBUFNEQ2FwYWJsZSAgICA9IChwRWlkLT5PY3RldFs2XSAmIDB4ODApID8gMSA6IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGRlZmF1bHQgRURDQSBwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW1FJRF9BQ19CRV0gID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdID0gMzsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQkVdID0gQ1dfTUlOX0lOX0JJVFM7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JFXSA9IENXX01BWF9JTl9CSVRTOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JFXSAgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFDTVtRSURfQUNfQktdICA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JLXSA9IDc7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JLXSA9IENXX01JTl9JTl9CSVRTOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CS10gPSBDV19NQVhfSU5fQklUUzsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CS10gID0gMDsKLQotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBQ01bUUlEX0FDX1ZJXSAgPSAwOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV0gPSAyOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WSV0gPSBDV19NSU5fSU5fQklUUy0xOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19WSV0gPSBDV19NQVhfSU5fQklUUzsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV0gID0gOTY7ICAgLy8gQUNfVkk6IDk2KjMydXMgfj0gM21zCi0KLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW1FJRF9BQ19WT10gID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVk9dID0gMjsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVk9dID0gQ1dfTUlOX0lOX0JJVFMtMjsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVk9dID0gQ1dfTUFYX0lOX0JJVFMtMTsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WT10gID0gNDg7ICAgLy8gQUNfVk86IDQ4KjMydXMgfj0gMS41bXMKLSAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIElFX0VYVF9TVVBQX1JBVEVTOgotICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShFeHRSYXRlLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKLSAgICAgICAgICAgICAgICAgICAgKnBFeHRSYXRlTGVuID0gcEVpZC0+TGVuOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IDIwMDQtMDktMTQgbm90IGEgZ29vZCBkZXNpZ24gaGVyZSwgY2F1c2UgaXQgZXhjbHVkZSBleHRyYSByYXRlcwotICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIFNjYW5UYWIuIFdlIHNob3VsZCByZXBvcnQgYXMgaXMuIEFuZCBmaWx0ZXIgb3V0IHVuc3VwcG9ydGVkCi0gICAgICAgICAgICAgICAgICAgIC8vIHJhdGVzIGluIE1sbWVBdXguCi0gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGFnYWluc3QgdGhlIHN1cHBvcnRlZCByYXRlcwotICAgICAgICAgICAgICAgICAgICAvLyBSVE1QQ2hlY2tSYXRlcyhwQWQsIEV4dFJhdGUsIHBFeHRSYXRlTGVuKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgSUVfRVJQOgotICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gPT0gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICpwRXJwID0gKFVDSEFSKXBFaWQtPk9jdGV0WzBdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBJRV9BSVJPTkVUX0NLSVA6Ci0gICAgICAgICAgICAgICAgLy8gMC4gQ2hlY2sgQWlyb25ldCBJRSBsZW5ndGgsIGl0IG11c3QgYmUgbGFyZ2VyIG9yIGVxdWFsIHRvIDI4Ci0gICAgICAgICAgICAgICAgLy8gQ2lzY28gQVAzNTAgdXNlZCBsZW5ndGggYXMgMjgKLSAgICAgICAgICAgICAgICAvLyBDaXNjbyBBUDEyWFggdXNlZCBsZW5ndGggYXMgMzAKLSAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuIDwgKENLSVBfTkVHT1RJQVRJT05fTEVOR1RIIC0gMikpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgLy8gMS4gQ29weSBDS0lQIGZsYWcgYnl0ZSB0byBidWZmZXIgZm9yIHByb2Nlc3MKLSAgICAgICAgICAgICAgICAqcENraXBGbGFnID0gKihwRWlkLT5PY3RldCArIDgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIElFX0FQX1RYX1BPV0VSOgotICAgICAgICAgICAgICAgIC8vIEFQIENvbnRyb2wgb2YgQ2xpZW50IFRyYW5zbWl0IFBvd2VyCi0gICAgICAgICAgICAgICAgLy8wLiBDaGVjayBBaXJvbmV0IElFIGxlbmd0aCwgaXQgbXVzdCBiZSA2Ci0gICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiAhPSAweDA2KQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIC8vIEdldCBjZWxsIHBvd2VyIGxpbWl0IGluIGRCbQotICAgICAgICAgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIENJU0NPX09VSSwgMykgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgKnBBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPSAqKHBFaWQtPk9jdGV0ICsgNCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8vIFdQQTIgJiA4MDIuMTFpIFJTTgotICAgICAgICAgICAgY2FzZSBJRV9SU046Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gT1VJIGZvciB2ZXJzaW9uIGFueW1vcmUsIGNoZWNrIHRoZSBncm91cCBjaXBoZXIgT1VJIGJlZm9yZSBjb3B5aW5nCi0gICAgICAgICAgICAgICAgaWYgKFJUTVBFcXVhbE1lbW9yeShwRWlkLT5PY3RldCArIDIsIFJTTl9PVUksIDMpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ29weSB0byBwVklFIHdoaWNoIHdpbGwgcmVwb3J0IHRvIG1pY3Jvc29mdCBic3NpZCBsaXN0LgotICAgICAgICAgICAgICAgICAgICBQdHIgPSAoUFVDSEFSKSBwVklFOwotICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLCAmcEVpZC0+RWlkLCBwRWlkLT5MZW4gKyAyKTsKLSAgICAgICAgICAgICAgICAgICAgKkxlbmd0aFZJRSArPSAocEVpZC0+TGVuICsgMik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKLQkJCWNhc2UgSUVfQ09VTlRSWToKLQkJCQlQdHIgPSAoUFVDSEFSKSBwVklFOwotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOwotICAgICAgICAgICAgICAgICpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOwotCQkJCWJyZWFrOwotI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgTGVuZ3RoID0gTGVuZ3RoICsgMiArIHBFaWQtPkxlbjsgIC8vIEVpZFsxXSArIExlblsxXSsgY29udGVudFtMZW5dCi0gICAgICAgIHBFaWQgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopcEVpZCArIDIgKyBwRWlkLT5MZW4pOwotICAgIH0KLQotICAgIC8vIEZvciBzb21lIDExYSBBUC4gaXQgZGlkIG5vdCBoYXZlIHRoZSBjaGFubmVsIEVJRCwgcGF0Y2ggaGVyZQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlVQ0hBUiBMYXRjaFJmQ2hhbm5lbCA9IE1zZ0NoYW5uZWw7Ci0JCWlmICgocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID4gMTQpICYmICgoU2FuaXR5ICYgMHg0KSA9PSAwKSkKLQkJewotCQkJaWYgKEN0cmxDaGFubmVsICE9IDApCi0JCQkJKnBDaGFubmVsID0gQ3RybENoYW5uZWw7Ci0JCQllbHNlCi0JCQkJKnBDaGFubmVsID0gTGF0Y2hSZkNoYW5uZWw7Ci0JCQlTYW5pdHkgfD0gMHg0OwotCQl9Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JaWYgKFNhbml0eSAhPSAweDcpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19MT1VELCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIG1pc3NpbmcgZmllbGQsIFNhbml0eT0weCUwMnhcbiIsIFNhbml0eSkpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCWVsc2UKLQl7Ci0JCXJldHVybiBUUlVFOwotCX0KLQotfQotCi0jaWZkZWYgRE9UMTFOX0RSQUZUMwotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrIGZvciBzb21lIElFIGFkZHJlc3NlZCAgaW4gODAyLjExbiBkMy4wMy4KLQlSZXR1cm46Ci0JCVRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotQk9PTEVBTiBQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkyKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFZPSUQgKk1zZywKLQlJTiBVTE9ORyBNc2dMZW4sCi0JT1VUIFVDSEFSCSpSZWdDbGFzcykKLXsKLQlDSEFSCQkJCSpQdHI7Ci0JUEZSQU1FXzgwMl8xMQkJcEZyYW1lOwotCVBFSURfU1RSVUNUCQkJcEVpZDsKLQlVTE9ORwkJCQlMZW5ndGggPSAwOwotCi0JcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOwotCi0JKlJlZ0NsYXNzID0gMDsKLQlQdHIgPSAoUENIQVIpIHBGcmFtZS0+T2N0ZXQ7Ci0JTGVuZ3RoICs9IExFTkdUSF84MDJfMTE7Ci0KLQkvLyBnZXQgdGltZXN0YW1wIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotCVB0ciArPSBUSU1FU1RBTVBfTEVOOwotCUxlbmd0aCArPSBUSU1FU1RBTVBfTEVOOwotCi0JLy8gZ2V0IGJlYWNvbiBpbnRlcnZhbCBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKLQlQdHIgKz0gMjsKLQlMZW5ndGggKz0gMjsKLQotCS8vIGdldCBjYXBhYmlsaXR5IGluZm8gZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0JUHRyICs9IDI7Ci0JTGVuZ3RoICs9IDI7Ci0KLQlwRWlkID0gKFBFSURfU1RSVUNUKSBQdHI7Ci0KLQkvLyBnZXQgdmFyaWFibGUgZmllbGRzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotCXdoaWxlICgoTGVuZ3RoICsgMiArIHBFaWQtPkxlbikgPD0gTXNnTGVuKQotCXsKLQkJc3dpdGNoKHBFaWQtPkVpZCkKLQkJewotCQkJY2FzZSBJRV9TVVBQX1JFR19DTEFTUzoKLQkJCQlpZihwRWlkLT5MZW4gPiAwKQotCQkJCXsKLQkJCQkJKlJlZ0NsYXNzID0gKnBFaWQtPk9jdGV0OwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9TU0lEIChsZW49JWQpXG4iLHBFaWQtPkxlbikpOwotCQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJTGVuZ3RoID0gTGVuZ3RoICsgMiArIHBFaWQtPkxlbjsgIC8vIEVpZFsxXSArIExlblsxXSsgY29udGVudFtMZW5dCi0JCXBFaWQgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopcEVpZCArIDIgKyBwRWlkLT5MZW4pOwotCX0KLQotCXJldHVybiBUUlVFOwotCi19Ci0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIE1sbWVTY2FuUmVxU2FuaXR5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFZPSUQgKk1zZywKLQlJTiBVTE9ORyBNc2dMZW4sCi0JT1VUIFVDSEFSICpwQnNzVHlwZSwKLQlPVVQgQ0hBUiBTc2lkW10sCi0JT1VUIFVDSEFSICpwU3NpZExlbiwKLQlPVVQgVUNIQVIgKnBTY2FuVHlwZSkKLXsKLQlNTE1FX1NDQU5fUkVRX1NUUlVDVCAqSW5mbzsKLQotCUluZm8gPSAoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgKikoTXNnKTsKLQkqcEJzc1R5cGUgPSBJbmZvLT5Cc3NUeXBlOwotCSpwU3NpZExlbiA9IEluZm8tPlNzaWRMZW47Ci0JTmRpc01vdmVNZW1vcnkoU3NpZCwgSW5mby0+U3NpZCwgKnBTc2lkTGVuKTsKLQkqcFNjYW5UeXBlID0gSW5mby0+U2NhblR5cGU7Ci0KLQlpZiAoKCpwQnNzVHlwZSA9PSBCU1NfSU5GUkEgfHwgKnBCc3NUeXBlID09IEJTU19BREhPQyB8fCAqcEJzc1R5cGUgPT0gQlNTX0FOWSkKLQkJJiYgKCpwU2NhblR5cGUgPT0gU0NBTl9BQ1RJVkUgfHwgKnBTY2FuVHlwZSA9PSBTQ0FOX1BBU1NJVkUKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJKSkKLQl7Ci0JCXJldHVybiBUUlVFOwotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU2NhblJlcVNhbml0eSBmYWlsIC0gd3JvbmcgQnNzVHlwZSBvciBTY2FuVHlwZVxuIikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotfQotCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVVDSEFSIENoYW5uZWxTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVUNIQVIgY2hhbm5lbCkKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpICsrKQotICAgIHsKLSAgICAgICAgaWYgKGNoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotQk9PTEVBTiBQZWVyRGVhdXRoU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0gICAgT1VUIFBVQ0hBUiBwQWRkcjIsCi0gICAgT1VUIFVTSE9SVCAqcFJlYXNvbikKLXsKLSAgICBQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKLQotICAgIENPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7Ci0gICAgTmRpc01vdmVNZW1vcnkocFJlYXNvbiwgJnBGcmFtZS0+T2N0ZXRbMF0sIDIpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjawotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIFBlZXJBdXRoU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0gICAgT1VUIFBVQ0hBUiBwQWRkciwKLSAgICBPVVQgVVNIT1JUICpwQWxnLAotICAgIE9VVCBVU0hPUlQgKnBTZXEsCi0gICAgT1VUIFVTSE9SVCAqcFN0YXR1cywKLSAgICBDSEFSICpwQ2hsZ1RleHQpCi17Ci0gICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7Ci0KLSAgICBDT1BZX01BQ19BRERSKHBBZGRyLCAgIHBGcmFtZS0+SGRyLkFkZHIyKTsKLSAgICBOZGlzTW92ZU1lbW9yeShwQWxnLCAgICAmcEZyYW1lLT5PY3RldFswXSwgMik7Ci0gICAgTmRpc01vdmVNZW1vcnkocFNlcSwgICAgJnBGcmFtZS0+T2N0ZXRbMl0sIDIpOwotICAgIE5kaXNNb3ZlTWVtb3J5KHBTdGF0dXMsICZwRnJhbWUtPk9jdGV0WzRdLCAyKTsKLQotICAgIGlmICgqcEFsZyA9PSBBVVRIX01PREVfT1BFTikKLSAgICB7Ci0gICAgICAgIGlmICgqcFNlcSA9PSAxIHx8ICpwU2VxID09IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckF1dGhTYW5pdHkgZmFpbCAtIHdyb25nIFNlZyNcbiIpKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICgqcEFsZyA9PSBBVVRIX01PREVfS0VZKQotICAgIHsKLSAgICAgICAgaWYgKCpwU2VxID09IDEgfHwgKnBTZXEgPT0gNCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoKnBTZXEgPT0gMiB8fCAqcFNlcSA9PSAzKQotICAgICAgICB7Ci0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQ2hsZ1RleHQsICZwRnJhbWUtPk9jdGV0WzhdLCBDSVBIRVJfVEVYVF9MRU4pOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQXV0aFNhbml0eSBmYWlsIC0gd3JvbmcgU2VnI1xuIikpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBdXRoU2FuaXR5IGZhaWwgLSB3cm9uZyBhbGdvcml0aG1cbiIpKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotQk9PTEVBTiBNbG1lQXV0aFJlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIsCi0gICAgT1VUIFVMT05HICpwVGltZW91dCwKLSAgICBPVVQgVVNIT1JUICpwQWxnKQotewotICAgIE1MTUVfQVVUSF9SRVFfU1RSVUNUICpwSW5mbzsKLQotICAgIHBJbmZvICA9IChNTE1FX0FVVEhfUkVRX1NUUlVDVCAqKU1zZzsKLSAgICBDT1BZX01BQ19BRERSKHBBZGRyLCBwSW5mby0+QWRkcik7Ci0gICAgKnBUaW1lb3V0ID0gcEluZm8tPlRpbWVvdXQ7Ci0gICAgKnBBbGcgPSBwSW5mby0+QWxnOwotCi0gICAgaWYgKCgoKnBBbGcgPT0gQVVUSF9NT0RFX0tFWSkgfHwoKnBBbGcgPT0gQVVUSF9NT0RFX09QRU4pCi0JKSAmJgotICAgICAgICAoKCpwQWRkciAmIDB4MDEpID09IDApKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVBdXRoUmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBhbGdvcml0aG1cbiIpKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLUJPT0xFQU4gTWxtZUFzc29jUmVxU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0gICAgT1VUIFBVQ0hBUiBwQXBBZGRyLAotICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKLSAgICBPVVQgVUxPTkcgKnBUaW1lb3V0LAotICAgIE9VVCBVU0hPUlQgKnBMaXN0ZW5JbnR2KQotewotICAgIE1MTUVfQVNTT0NfUkVRX1NUUlVDVCAqcEluZm87Ci0KLSAgICBwSW5mbyA9IChNTE1FX0FTU09DX1JFUV9TVFJVQ1QgKilNc2c7Ci0gICAgKnBUaW1lb3V0ID0gcEluZm8tPlRpbWVvdXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aW1lb3V0Ci0gICAgQ09QWV9NQUNfQUREUihwQXBBZGRyLCBwSW5mby0+QWRkcik7ICAgICAgICAgICAgICAgICAgIC8vIEFQIGFkZHJlc3MKLSAgICAqcENhcGFiaWxpdHlJbmZvID0gcEluZm8tPkNhcGFiaWxpdHlJbmZvOyAgICAgICAgICAgICAgIC8vIGNhcGFiaWxpdHkgaW5mbwotICAgICpwTGlzdGVuSW50diA9IHBJbmZvLT5MaXN0ZW5JbnR2OwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjawotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIFBlZXJEaXNhc3NvY1Nhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIyLAotICAgIE9VVCBVU0hPUlQgKnBSZWFzb24pCi17Ci0gICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7Ci0KLSAgICBDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOwotICAgIE5kaXNNb3ZlTWVtb3J5KHBSZWFzb24sICZwRnJhbWUtPk9jdGV0WzBdLCAyKTsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVNhbml0eSBjaGVjayBOZXR3b3JrVHlwZSAoMTFiLCAxMWcgb3IgMTFhKQotCi0JQXJndW1lbnRzOgotCQlwQnNzIC0gUG9pbnRlciB0byBCU1MgdGFibGUuCi0KLQlSZXR1cm4gVmFsdWU6Ci0gICAgICAgIE5kaXM4MDJfMTFEUyAuLi4uLi4uKDExYikKLSAgICAgICAgTmRpczgwMl8xMU9GRE0yNC4uLi4oMTFnKQotICAgICAgICBOZGlzODAyXzExT0ZETTUuLi4uLigxMWEpCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5ESVNfODAyXzExX05FVFdPUktfVFlQRSBOZXR3b3JrVHlwZUluVXNlU2FuaXR5KAotICAgIElOIFBCU1NfRU5UUlkgcEJzcykKLXsKLQlORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUJTmV0V29ya1R5cGU7Ci0JVUNIQVIJCQkJCQlyYXRlLCBpOwotCi0JTmV0V29ya1R5cGUgPSBOZGlzODAyXzExRFM7Ci0KLQlpZiAocEJzcy0+Q2hhbm5lbCA8PSAxNCkKLQl7Ci0JCS8vCi0JCS8vIEZpcnN0IGNoZWNrIHN1cHBvcnQgUmF0ZS4KLQkJLy8KLQkJZm9yIChpID0gMDsgaSA8IHBCc3MtPlN1cFJhdGVMZW47IGkrKykKLQkJewotCQkJcmF0ZSA9IHBCc3MtPlN1cFJhdGVbaV0gJiAweDdmOyAvLyBNYXNrIG91dCBiYXNpYyByYXRlIHNldCBiaXQKLQkJCWlmICgocmF0ZSA9PSAyKSB8fCAocmF0ZSA9PSA0KSB8fCAocmF0ZSA9PSAxMSkgfHwgKHJhdGUgPT0gMjIpKQotCQkJewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vCi0JCQkJLy8gT3RoZXJ3aXNlIChldmVuIHJhdGUgPiAxMDgpIG1lYW5zIE5kaXM4MDJfMTFPRkRNMjQKLQkJCQkvLwotCQkJCU5ldFdvcmtUeXBlID0gTmRpczgwMl8xMU9GRE0yNDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCS8vCi0JCS8vIFNlY29uZCBjaGVjayBFeHRlbmQgUmF0ZS4KLQkJLy8KLQkJaWYgKE5ldFdvcmtUeXBlICE9IE5kaXM4MDJfMTFPRkRNMjQpCi0JCXsKLQkJCWZvciAoaSA9IDA7IGkgPCBwQnNzLT5FeHRSYXRlTGVuOyBpKyspCi0JCQl7Ci0JCQkJcmF0ZSA9IHBCc3MtPlN1cFJhdGVbaV0gJiAweDdmOyAvLyBNYXNrIG91dCBiYXNpYyByYXRlIHNldCBiaXQKLQkJCQlpZiAoKHJhdGUgPT0gMikgfHwgKHJhdGUgPT0gNCkgfHwgKHJhdGUgPT0gMTEpIHx8IChyYXRlID09IDIyKSkKLQkJCQl7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkvLwotCQkJCQkvLyBPdGhlcndpc2UgKGV2ZW4gcmF0ZSA+IDEwOCkgbWVhbnMgTmRpczgwMl8xMU9GRE0yNAotCQkJCQkvLwotCQkJCQlOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNMjQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JewotCQlOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNNTsKLQl9Ci0KLSAgICBpZiAocEJzcy0+SHRDYXBhYmlsaXR5TGVuICE9IDApCi0gICAgewotICAgICAgICBpZiAoTmV0V29ya1R5cGUgPT0gTmRpczgwMl8xMU9GRE01KQotICAgICAgICAgICAgTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTVfTjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTI0X047Ci0gICAgfQotCi0JcmV0dXJuIE5ldFdvcmtUeXBlOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIENoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgcmVjZWl2ZWQgRUFQb0wgZnJhbWUKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLAotICAgICAgICBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIFBlZXJXcGFNZXNzYWdlU2FuaXR5KAotICAgIElOCVBSVE1QX0FEQVBURVIJCXBBZCwKLSAgICBJTglQRUFQT0xfUEFDS0VUCQlwTXNnLAotICAgIElOCVVMT05HCQkJCU1zZ0xlbiwKLSAgICBJTglVQ0hBUgkJCQlNc2dUeXBlLAotICAgIElOCU1BQ19UQUJMRV9FTlRSWQkJKnBFbnRyeSkKLXsKLQlVQ0hBUgkJCW1pY1tMRU5fS0VZX0RFU0NfTUlDXSwgZGlnZXN0WzgwXSwgS0VZREFUQVtNQVhfTEVOX09GX1JTTklFXTsKLQlCT09MRUFOCQkJYlJlcGxheURpZmYgPSBGQUxTRTsKLQlCT09MRUFOCQkJYldQQTIgPSBGQUxTRTsKLQlLRVlfSU5GTwkJRWFwb2xLZXlJbmZvOwotCVVDSEFSCQkJR3JvdXBLZXlJbmRleCA9IDA7Ci0KLQotCU5kaXNaZXJvTWVtb3J5KG1pYywgc2l6ZW9mKG1pYykpOwotCU5kaXNaZXJvTWVtb3J5KGRpZ2VzdCwgc2l6ZW9mKGRpZ2VzdCkpOwotCU5kaXNaZXJvTWVtb3J5KEtFWURBVEEsIHNpemVvZihLRVlEQVRBKSk7Ci0JTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikmRWFwb2xLZXlJbmZvLCBzaXplb2YoRWFwb2xLZXlJbmZvKSk7Ci0KLQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSZFYXBvbEtleUluZm8sIChQVUNIQVIpJnBNc2ctPktleURlc2MuS2V5SW5mbywgc2l6ZW9mKEtFWV9JTkZPKSk7Ci0KLQkqKChVU0hPUlQgKikmRWFwb2xLZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZFYXBvbEtleUluZm8pKTsKLQotCS8vIENob29zZSBXUEEyIG9yIG5vdAotCWlmICgocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fCAocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKLQkJYldQQTIgPSBUUlVFOwotCi0JLy8gMC4gQ2hlY2sgTXNnVHlwZQotCWlmICgoTXNnVHlwZSA+IEVBUE9MX0dST1VQX01TR18yKSB8fCAoTXNnVHlwZSA8IEVBUE9MX1BBSVJfTVNHXzEpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiVGhlIG1lc3NhZ2UgdHlwZSBpcyBpbnZhbGlkKCVkKSEgXG4iLCBNc2dUeXBlKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQkvLyAxLiBSZXBsYXkgY291bnRlciBjaGVjawotCWlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEgfHwgTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zIHx8IE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpCS8vIEZvciBzdXBwbGljYW50Ci0gICAgewotCS8vIEZpcnN0IHZhbGlkYXRlIHJlcGxheSBjb3VudGVyLCBvbmx5IGFjY2VwdCBtZXNzYWdlIHdpdGggbGFyZ2VyIHJlcGxheSBjb3VudGVyLgotCQkvLyBMZXQgZXF1YWwgcGFzcywgc29tZSBBUCBzdGFydCB3aXRoIGFsbCB6ZXJvIHJlcGxheSBjb3VudGVyCi0JCVVDSEFSCVplcm9SZXBsYXlbTEVOX0tFWV9ERVNDX1JFUExBWV07Ci0KLSAgICAgICAgTmRpc1plcm9NZW1vcnkoWmVyb1JlcGxheSwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0JCWlmICgoUlRNUENvbXBhcmVNZW1vcnkocE1zZy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwRW50cnktPlJfQ291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMSkgJiYKLQkJCShSVE1QQ29tcGFyZU1lbW9yeShwTXNnLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDApKQotCXsKLQkJCWJSZXBsYXlEaWZmID0gVFJVRTsKLQl9Ci0JfQotCWVsc2UgaWYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMiB8fCBNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzQgfHwgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMikJLy8gRm9yIGF1dGhlbnRpY2F0b3IKLQl7Ci0JCS8vIGNoZWNrIFJlcGxheSBDb3VudGVyIGNvcmVzcG9uZHMgdG8gTVNHIGZyb20gYXV0aGVudGljYXRvciwgb3RoZXJ3aXNlIGRpc2NhcmQKLQlpZiAoIU5kaXNFcXVhbE1lbW9yeShwTXNnLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBFbnRyeS0+Ul9Db3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKSkKLQl7Ci0JCQliUmVwbGF5RGlmZiA9IFRSVUU7Ci0JfQotCX0KLQotCS8vIFJlcGxheSBDb3VudGVyIGRpZmZlcmVudCBjb25kaXRpb24KLQlpZiAoYlJlcGxheURpZmYpCi0JewotCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIHJlcGxheSBjb3VudGVyIGRpZmZlcmVudAotCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19SRVBMQVlfQ09VTlRFUl9ESUZGX0VWRU5UX0ZMQUcsIHBFbnRyeS0+QWRkciwgcEVudHJ5LT5hcGlkeCwgMCk7Ci0KLQkJaWYgKE1zZ1R5cGUgPCBFQVBPTF9HUk9VUF9NU0dfMSkKLQkJewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSZXBsYXkgQ291bnRlciBEaWZmZXJlbnQgaW4gcGFpcndpc2UgbXNnICVkIG9mIDQtd2F5IGhhbmRzaGFrZSFcbiIsIE1zZ1R5cGUpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJlcGxheSBDb3VudGVyIERpZmZlcmVudCBpbiBncm91cCBtc2cgJWQgb2YgMi13YXkgaGFuZHNoYWtlIVxuIiwgKE1zZ1R5cGUgLSBFQVBPTF9QQUlSX01TR180KSkpOwotCQl9Ci0KLQkJaGV4X2R1bXAoIlJlY2VpdmUgcmVwbGF5IGNvdW50ZXIgIiwgcE1zZy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKLQkJaGV4X2R1bXAoIkN1cnJlbnQgcmVwbGF5IGNvdW50ZXIgIiwgcEVudHJ5LT5SX0NvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0JfQotCi0JLy8gMi4gVmVyaWZ5IE1JQyBleGNlcHQgUGFpcndpc2UgTXNnMQotCWlmIChNc2dUeXBlICE9IEVBUE9MX1BBSVJfTVNHXzEpCi0JewotCQlVQ0hBUgkJCXJjdmRfbWljW0xFTl9LRVlfREVTQ19NSUNdOwotCi0JCS8vIFJlY29yZCB0aGUgcmVjZWl2ZWQgTUlDIGZvciBjaGVjayBsYXRlcgotCQlOZGlzTW92ZU1lbW9yeShyY3ZkX21pYywgcE1zZy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOwotCQlOZGlzWmVyb01lbW9yeShwTXNnLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7Ci0KLSAgICAgICAgaWYgKEVhcG9sS2V5SW5mby5LZXlEZXNjVmVyID09IERFU0NfVFlQRV9US0lQKQkvLyBUS0lQCi0gICAgICAgIHsKLSAgICAgICAgICAgIEhNQUNfTUQ1KHBFbnRyeS0+UFRLLCBMRU5fRUFQX01JQ0ssIChQVUNIQVIpcE1zZywgTXNnTGVuLCBtaWMsIE1ENV9ESUdFU1RfU0laRSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoRWFwb2xLZXlJbmZvLktleURlc2NWZXIgPT0gREVTQ19UWVBFX0FFUykJLy8gQUVTCi0gICAgICAgIHsKLSAgICAgICAgICAgIEhNQUNfU0hBMShwRW50cnktPlBUSywgTEVOX0VBUF9NSUNLLCAoUFVDSEFSKXBNc2csIE1zZ0xlbiwgZGlnZXN0LCBTSEExX0RJR0VTVF9TSVpFKTsKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KG1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghTmRpc0VxdWFsTWVtb3J5KHJjdmRfbWljLCBtaWMsIExFTl9LRVlfREVTQ19NSUMpKQotICAgICAgICB7Ci0JCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIE1JQyBkaWZmZXJlbnQKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19NSUNfRElGRl9FVkVOVF9GTEFHLCBwRW50cnktPkFkZHIsIHBFbnRyeS0+YXBpZHgsIDApOwotCi0JCQlpZiAoTXNnVHlwZSA8IEVBUE9MX0dST1VQX01TR18xKQotCQkJewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNSUMgRGlmZmVyZW50IGluIHBhaXJ3aXNlIG1zZyAlZCBvZiA0LXdheSBoYW5kc2hha2UhXG4iLCBNc2dUeXBlKSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTUlDIERpZmZlcmVudCBpbiBncm91cCBtc2cgJWQgb2YgMi13YXkgaGFuZHNoYWtlIVxuIiwgKE1zZ1R5cGUgLSBFQVBPTF9QQUlSX01TR180KSkpOwotCQkJfQotCi0JCQloZXhfZHVtcCgiUmVjZWl2ZWQgTUlDIiwgcmN2ZF9taWMsIExFTl9LRVlfREVTQ19NSUMpOwotCQkJaGV4X2R1bXAoIkRlc2lyZWQgIE1JQyIsIG1pYywgTEVOX0tFWV9ERVNDX01JQyk7Ci0KLQkJCXJldHVybiBGQUxTRTsKLSAgICAgICAgfQotCX0KLQotCS8vIDEuIERlY3J5cHQgdGhlIEtleSBEYXRhIGZpZWxkIGlmIEdUSyBpcyBpbmNsdWRlZC4KLQkvLyAyLiBFeHRyYWN0IHRoZSBjb250ZXh0IG9mIHRoZSBLZXkgRGF0YSBmaWVsZCBpZiBpdCBleGlzdC4KLQkvLyBUaGUgZmllbGQgaW4gcGFpcndpc2VfbXNnXzJfV1BBMShXUEEyKSAmIHBhaXJ3aXNlX21zZ18zX1dQQTEgaXMgY2xlYXIuCi0JLy8gVGhlIGZpZWxkIGluIGdyb3VwX21zZ18xX1dQQTEoV1BBMikgJiBwYWlyd2lzZV9tc2dfM19XUEEyIGlzIGVuY3J5cHRlZC4KLQlpZiAoQ09OVl9BUlJBUllfVE9fVUlOVDE2KHBNc2ctPktleURlc2MuS2V5RGF0YUxlbikgPiAwKQotCXsKLQkJLy8gRGVjcnlwdCB0aGlzIGZpZWxkCi0JCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zICYmIGJXUEEyKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCi0JCXsKLQkJCWlmKAotCQkJCShFYXBvbEtleUluZm8uS2V5RGVzY1ZlciA9PSBERVNDX1RZUEVfQUVTKSkKLQkJCXsKLQkJCQkvLyBBRVMKLQkJCQlBRVNfR1RLX0tFWV9VTldSQVAoJnBFbnRyeS0+UFRLWzE2XSwgS0VZREFUQSwKLQkJCQkJCQkJCUNPTlZfQVJSQVJZX1RPX1VJTlQxNihwTXNnLT5LZXlEZXNjLktleURhdGFMZW4pLAotCQkJCQkJCQkJcE1zZy0+S2V5RGVzYy5LZXlEYXRhKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlJTlQJaTsKLQkJCQlVQ0hBUiAgIEtleVszMl07Ci0JCQkJLy8gRGVjcnlwdCBUS0lQIEdUSwotCQkJCS8vIENvbnN0cnVjdCAzMiBieXRlcyBSQzQgS2V5Ci0JCQkJTmRpc01vdmVNZW1vcnkoS2V5LCBwTXNnLT5LZXlEZXNjLktleUl2LCAxNik7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJktleVsxNl0sICZwRW50cnktPlBUS1sxNl0sIDE2KTsKLQkJCQlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS2V5LCAzMik7Ci0JCQkJLy9kaXNjYXJkIGZpcnN0IDI1NiBieXRlcwotCQkJCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQotCQkJCQlBUkNGT1VSX0JZVEUoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCk7Ci0JCQkJLy8gRGVjcnlwdCBHVEsuIEJlY2FyZWZ1bCwgdGhlcmUgaXMgbm8gSUNWIHRvIGNoZWNrIHRoZSByZXN1bHQgaXMgY29ycmVjdCBvciBub3QKLQkJCQlBUkNGT1VSX0RFQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS0VZREFUQSwKLQkJCQkJCQkJcE1zZy0+S2V5RGVzYy5LZXlEYXRhLAotCQkJCQkJCQlDT05WX0FSUkFSWV9UT19VSU5UMTYocE1zZy0+S2V5RGVzYy5LZXlEYXRhTGVuKSk7Ci0JCQl9Ci0KLQkJCWlmICghYldQQTIgJiYgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKQotCQkJCUdyb3VwS2V5SW5kZXggPSBFYXBvbEtleUluZm8uS2V5SW5kZXg7Ci0KLQkJfQotCQllbHNlIGlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18yKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zICYmICFiV1BBMikpCi0JCXsKLQkJCU5kaXNNb3ZlTWVtb3J5KEtFWURBVEEsIHBNc2ctPktleURlc2MuS2V5RGF0YSwgQ09OVl9BUlJBUllfVE9fVUlOVDE2KHBNc2ctPktleURlc2MuS2V5RGF0YUxlbikpOwotCQl9Ci0JCWVsc2UKLQkJewotCi0JCQlyZXR1cm4gVFJVRTsKLQkJfQotCi0JCS8vIFBhcnNlIEtleSBEYXRhIGZpZWxkIHRvCi0JCS8vIDEuIHZlcmlmeSBSU04gSUUgZm9yIHBhaXJ3aXNlX21zZ18yX1dQQTEoV1BBMikgLHBhaXJ3aXNlX21zZ18zX1dQQTEoV1BBMikKLQkJLy8gMi4gdmVyaWZ5IEtERSBmb3JtYXQgZm9yIHBhaXJ3aXNlX21zZ18zX1dQQTIsIGdyb3VwX21zZ18xX1dQQTIKLQkJLy8gMy4gdXBkYXRlIHNoYXJlZCBrZXkgZm9yIHBhaXJ3aXNlX21zZ18zX1dQQTIsIGdyb3VwX21zZ18xX1dQQTEoV1BBMikKLQkJaWYgKCFSVE1QUGFyc2VFYXBvbEtleURhdGEocEFkLCBLRVlEQVRBLAotCQkJCQkJCQkgIENPTlZfQVJSQVJZX1RPX1VJTlQxNihwTXNnLT5LZXlEZXNjLktleURhdGFMZW4pLAotCQkJCQkJCQkgIEdyb3VwS2V5SW5kZXgsIE1zZ1R5cGUsIGJXUEEyLCBwRW50cnkpKQotCQl7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLQotfQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi1CT09MRUFOIE1sbWVEbHNSZXFTYW5pdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFJUXzgwMl8xMV9ETFMgKnBETFMsCi0gICAgT1VUIFBVU0hPUlQgcFJlYXNvbikKLXsKLQlNTE1FX0RMU19SRVFfU1RSVUNUICpwSW5mbzsKLQotICAgIHBJbmZvID0gKE1MTUVfRExTX1JFUV9TVFJVQ1QgKilNc2c7Ci0KLQkqcERMUyA9IHBJbmZvLT5wRExTOwotCSpwUmVhc29uID0gcEluZm8tPlJlYXNvbjsKLQotCXJldHVybiBUUlVFOwotfQotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi1CT09MRUFOIFBlZXJEbHNSZXFTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBEQSwKLSAgICBPVVQgUFVDSEFSIHBTQSwKLSAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCi0gICAgT1VUIFVTSE9SVCAqcERsc1RpbWVvdXQsCi0gICAgT1VUIFVDSEFSICpwUmF0ZXNMZW4sCi0gICAgT1VUIFVDSEFSIFJhdGVzW10sCi0JT1VUIFVDSEFSICpwSHRDYXBhYmlsaXR5TGVuLAotICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5KQotewotCUNIQVIgICAgICAgICAgICAqUHRyOwotICAgIFBGUkFNRV84MDJfMTEJRnIgPSAoUEZSQU1FXzgwMl8xMSlNc2c7Ci0JUEVJRF9TVFJVQ1QgIGVpZF9wdHI7Ci0KLSAgICAvLyB0byBwcmV2ZW50IGNhbGxlciBmcm9tIHVzaW5nIGdhcmJhZ2Ugb3V0cHV0IHZhbHVlCi0gICAgKnBDYXBhYmlsaXR5SW5mbwk9IDA7Ci0gICAgKnBEbHNUaW1lb3V0CT0gMDsKLQkqcEh0Q2FwYWJpbGl0eUxlbiA9IDA7Ci0KLSAgICBQdHIgPSAoUENIQVIpRnItPk9jdGV0OwotCi0JLy8gb2Zmc2V0IHRvIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzIChDYXRlZ29yeSBhbmQgQWN0aW9uIGZpZWxkKQotICAgIFB0ciArPSAyOwotCi0gICAgLy8gZ2V0IERBIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIE5kaXNNb3ZlTWVtb3J5KHBEQSwgUHRyLCBNQUNfQUREUl9MRU4pOwotICAgIFB0ciArPSBNQUNfQUREUl9MRU47Ci0KLSAgICAvLyBnZXQgU0EgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgTmRpc01vdmVNZW1vcnkocFNBLCBQdHIsIE1BQ19BRERSX0xFTik7Ci0gICAgUHRyICs9IE1BQ19BRERSX0xFTjsKLQotICAgIC8vIGdldCBjYXBhYmlsaXR5IGluZm8gZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgTmRpc01vdmVNZW1vcnkocENhcGFiaWxpdHlJbmZvLCBQdHIsIDIpOwotICAgIFB0ciArPSAyOwotCi0gICAgLy8gZ2V0IGNhcGFiaWxpdHkgaW5mbyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKLSAgICBOZGlzTW92ZU1lbW9yeShwRGxzVGltZW91dCwgUHRyLCAyKTsKLSAgICBQdHIgKz0gMjsKLQotCS8vIENhdGVnb3J5IGFuZCBBY3Rpb24gZmllbGQgKyBEQSArIFNBICsgY2FwYWJpbGl0eSArIFRpbWVvdXQKLQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSAmRnItPk9jdGV0WzE4XTsKLQotCXdoaWxlICgoKFVDSEFSKillaWRfcHRyICsgZWlkX3B0ci0+TGVuICsgMSkgPCAoKFVDSEFSKilGciArIE1zZ0xlbikpCi0JewotCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQotCQl7Ci0JCQljYXNlIElFX1NVUFBfUkFURVM6Ci0gICAgICAgICAgICAgICAgaWYgKChlaWRfcHRyLT5MZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpICYmIChlaWRfcHRyLT5MZW4gPiAwKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFJhdGVzLCBlaWRfcHRyLT5PY3RldCwgZWlkX3B0ci0+TGVuKTsKLSAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JlcVNhbml0eSAtIElFX1NVUFBfUkFURVMuLCBMZW49JWQuIFJhdGVzWzBdPSV4XG4iLGVpZF9wdHItPkxlbiwgUmF0ZXNbMF0pKTsKLSAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmF0ZXNbMV09JXggJXggJXggJXggJXggJXggJXhcbiIsIFJhdGVzWzFdLCBSYXRlc1syXSwgUmF0ZXNbM10sIFJhdGVzWzRdLCBSYXRlc1s1XSwgUmF0ZXNbNl0sIFJhdGVzWzddKSk7Ci0gICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSBlaWRfcHRyLT5MZW47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSA4OwotCQkJCQlSYXRlc1swXSA9IDB4ODI7Ci0JCQkJCVJhdGVzWzFdID0gMHg4NDsKLQkJCQkJUmF0ZXNbMl0gPSAweDhiOwotCQkJCQlSYXRlc1szXSA9IDB4OTY7Ci0JCQkJCVJhdGVzWzRdID0gMHgxMjsKLQkJCQkJUmF0ZXNbNV0gPSAweDI0OwotCQkJCQlSYXRlc1s2XSA9IDB4NDg7Ci0JCQkJCVJhdGVzWzddID0gMHg2YzsKLSAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JlcVNhbml0eSAtIHdyb25nIElFX1NVUFBfUkFURVMuLCBMZW49JWRcbiIsZWlkX3B0ci0+TGVuKSk7Ci0gICAgICAgICAgICAgICAgfQotCQkJCWJyZWFrOwotCi0JCQljYXNlIElFX0VYVF9TVVBQX1JBVEVTOgotICAgICAgICAgICAgICAgIGlmIChlaWRfcHRyLT5MZW4gKyAqcFJhdGVzTGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJlJhdGVzWypwUmF0ZXNMZW5dLCBlaWRfcHRyLT5PY3RldCwgZWlkX3B0ci0+TGVuKTsKLSAgICAgICAgICAgICAgICAgICAgKnBSYXRlc0xlbiA9ICgqcFJhdGVzTGVuKSArIGVpZF9wdHItPkxlbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJlJhdGVzWypwUmF0ZXNMZW5dLCBlaWRfcHRyLT5PY3RldCwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMgLSAoKnBSYXRlc0xlbikpOwotICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7Ci0gICAgICAgICAgICAgICAgfQotCQkJCWJyZWFrOwotCi0JCQljYXNlIElFX0hUX0NBUDoKLQkJCQlpZiAoZWlkX3B0ci0+TGVuID49IHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSkKLQkJCQl7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksIGVpZF9wdHItPk9jdGV0LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOwotCi0JCQkJCSooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykpOwotI2lmZGVmIFVOQUxJR05NRU5UX1NVUFBPUlQKLQkJCQkJewotCQkJCQkJRVhUX0hUX0NBUF9JTkZPIGV4dEh0Q2FwSW5mbzsKLQotCQkJCQkJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikoJmV4dEh0Q2FwSW5mbyksIChQVUNIQVIpKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pLCBzaXplb2YoRVhUX0hUX0NBUF9JTkZPKSk7Ci0JCQkJCQkqKFVTSE9SVCAqKSgmZXh0SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZleHRIdENhcEluZm8pKTsKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pLCAoUFVDSEFSKSgmZXh0SHRDYXBJbmZvKSwgc2l6ZW9mKEVYVF9IVF9DQVBfSU5GTykpOwotCQkJCQl9Ci0jZWxzZQotCQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pKTsKLSNlbmRpZiAvLyBVTkFMSUdOTUVOVF9TVVBQT1JUIC8vCi0JCQkJCSpwSHRDYXBhYmlsaXR5TGVuID0gc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpOwotCi0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSZXFTYW5pdHkgLSBJRV9IVF9DQVBcbiIpKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JlcVNhbml0eSAtIHdyb25nIElFX0hUX0NBUC5laWRfcHRyLT5MZW4gPSAlZFxuIiwgZWlkX3B0ci0+TGVuKSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQl9Ci0KLQkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7Ci0JfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUJPT0xFQU4gUGVlckRsc1JzcFNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcERBLAotICAgIE9VVCBQVUNIQVIgcFNBLAotICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKLSAgICBPVVQgVVNIT1JUICpwU3RhdHVzLAotICAgIE9VVCBVQ0hBUiAqcFJhdGVzTGVuLAotICAgIE9VVCBVQ0hBUiBSYXRlc1tdLAotICAgIE9VVCBVQ0hBUiAqcEh0Q2FwYWJpbGl0eUxlbiwKLSAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSkKLXsKLSAgICBDSEFSICAgICAgICAgICAgKlB0cjsKLSAgICBQRlJBTUVfODAyXzExCUZyID0gKFBGUkFNRV84MDJfMTEpTXNnOwotCVBFSURfU1RSVUNUICBlaWRfcHRyOwotCi0gICAgLy8gdG8gcHJldmVudCBjYWxsZXIgZnJvbSB1c2luZyBnYXJiYWdlIG91dHB1dCB2YWx1ZQotICAgICpwU3RhdHVzCQk9IDA7Ci0gICAgKnBDYXBhYmlsaXR5SW5mbwk9IDA7Ci0JKnBIdENhcGFiaWxpdHlMZW4gPSAwOwotCi0gICAgUHRyID0gKFBDSEFSKUZyLT5PY3RldDsKLQotCS8vIG9mZnNldCB0byBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyAoQ2F0ZWdvcnkgYW5kIEFjdGlvbiBmaWVsZCkKLSAgICBQdHIgKz0gMjsKLQotCS8vIGdldCBzdGF0dXMgY29kZSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKLSAgICBOZGlzTW92ZU1lbW9yeShwU3RhdHVzLCBQdHIsIDIpOwotICAgIFB0ciArPSAyOwotCi0gICAgLy8gZ2V0IERBIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIE5kaXNNb3ZlTWVtb3J5KHBEQSwgUHRyLCBNQUNfQUREUl9MRU4pOwotICAgIFB0ciArPSBNQUNfQUREUl9MRU47Ci0KLSAgICAvLyBnZXQgU0EgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgTmRpc01vdmVNZW1vcnkocFNBLCBQdHIsIE1BQ19BRERSX0xFTik7Ci0gICAgUHRyICs9IE1BQ19BRERSX0xFTjsKLQotCWlmIChwU3RhdHVzID09IDApCi0JewotCSAgICAvLyBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotCSAgICBOZGlzTW92ZU1lbW9yeShwQ2FwYWJpbGl0eUluZm8sIFB0ciwgMik7Ci0JICAgIFB0ciArPSAyOwotCX0KLQotCS8vIENhdGVnb3J5IGFuZCBBY3Rpb24gZmllbGQgKyBzdGF0dXMgY29kZSArIERBICsgU0EgKyBjYXBhYmlsaXR5Ci0JZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkgJkZyLT5PY3RldFsxOF07Ci0KLQl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChVQ0hBUiopRnIgKyBNc2dMZW4pKQotCXsKLQkJc3dpdGNoKGVpZF9wdHItPkVpZCkKLQkJewotCQkJY2FzZSBJRV9TVVBQX1JBVEVTOgotICAgICAgICAgICAgICAgIGlmICgoZWlkX3B0ci0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKSAmJiAoZWlkX3B0ci0+TGVuID4gMCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShSYXRlcywgZWlkX3B0ci0+T2N0ZXQsIGVpZF9wdHItPkxlbik7Ci0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSc3BTYW5pdHkgLSBJRV9TVVBQX1JBVEVTLiwgTGVuPSVkLiBSYXRlc1swXT0leFxuIixlaWRfcHRyLT5MZW4sIFJhdGVzWzBdKSk7Ci0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhdGVzWzFdPSV4ICV4ICV4ICV4ICV4ICV4ICV4XG4iLCBSYXRlc1sxXSwgUmF0ZXNbMl0sIFJhdGVzWzNdLCBSYXRlc1s0XSwgUmF0ZXNbNV0sIFJhdGVzWzZdLCBSYXRlc1s3XSkpOwotICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gZWlkX3B0ci0+TGVuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gODsKLQkJCQkJUmF0ZXNbMF0gPSAweDgyOwotCQkJCQlSYXRlc1sxXSA9IDB4ODQ7Ci0JCQkJCVJhdGVzWzJdID0gMHg4YjsKLQkJCQkJUmF0ZXNbM10gPSAweDk2OwotCQkJCQlSYXRlc1s0XSA9IDB4MTI7Ci0JCQkJCVJhdGVzWzVdID0gMHgyNDsKLQkJCQkJUmF0ZXNbNl0gPSAweDQ4OwotCQkJCQlSYXRlc1s3XSA9IDB4NmM7Ci0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSc3BTYW5pdHkgLSB3cm9uZyBJRV9TVVBQX1JBVEVTLiwgTGVuPSVkXG4iLGVpZF9wdHItPkxlbikpOwotICAgICAgICAgICAgICAgIH0KLQkJCQlicmVhazsKLQotCQkJY2FzZSBJRV9FWFRfU1VQUF9SQVRFUzoKLSAgICAgICAgICAgICAgICBpZiAoZWlkX3B0ci0+TGVuICsgKnBSYXRlc0xlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSYXRlc1sqcFJhdGVzTGVuXSwgZWlkX3B0ci0+T2N0ZXQsIGVpZF9wdHItPkxlbik7Ci0gICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSAoKnBSYXRlc0xlbikgKyBlaWRfcHRyLT5MZW47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSYXRlc1sqcFJhdGVzTGVuXSwgZWlkX3B0ci0+T2N0ZXQsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTIC0gKCpwUmF0ZXNMZW4pKTsKLSAgICAgICAgICAgICAgICAgICAgKnBSYXRlc0xlbiA9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOwotICAgICAgICAgICAgICAgIH0KLQkJCQlicmVhazsKLQotCQkJY2FzZSBJRV9IVF9DQVA6Ci0JCQkJaWYgKGVpZF9wdHItPkxlbiA+PSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpCi0JCQkJewotCQkJCQlOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LCBlaWRfcHRyLT5PY3RldCwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKLQotCQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pKTsKLSNpZmRlZiBVTkFMSUdOTUVOVF9TVVBQT1JUCi0JCQkJCXsKLQkJCQkJCUVYVF9IVF9DQVBfSU5GTyBleHRIdENhcEluZm87Ci0KLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpKCZleHRIdENhcEluZm8pLCAoUFVDSEFSKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSwgc2l6ZW9mKEVYVF9IVF9DQVBfSU5GTykpOwotCQkJCQkJKihVU0hPUlQgKikoJmV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmZXh0SHRDYXBJbmZvKSk7Ci0JCQkJCQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSwgKFBVQ0hBUikoJmV4dEh0Q2FwSW5mbyksIHNpemVvZihFWFRfSFRfQ0FQX0lORk8pKTsKLQkJCQkJfQotI2Vsc2UKLQkJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSk7Ci0jZW5kaWYgLy8gVU5BTElHTk1FTlRfU1VQUE9SVCAvLwotCQkJCQkqcEh0Q2FwYWJpbGl0eUxlbiA9IHNpemVvZihIVF9DQVBBQklMSVRZX0lFKTsKLQotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyRGxzUnNwU2FuaXR5IC0gSUVfSFRfQ0FQXG4iKSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSc3BTYW5pdHkgLSB3cm9uZyBJRV9IVF9DQVAuZWlkX3B0ci0+TGVuID0gJWRcbiIsIGVpZF9wdHItPkxlbikpOwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJfQotCi0JCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOwotCX0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi1CT09MRUFOIFBlZXJEbHNUZWFyRG93blNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcERBLAotICAgIE9VVCBQVUNIQVIgcFNBLAotICAgIE9VVCBVU0hPUlQgKnBSZWFzb24pCi17Ci0gICAgQ0hBUiAgICAgICAgICAgICpQdHI7Ci0gICAgUEZSQU1FXzgwMl8xMQlGciA9IChQRlJBTUVfODAyXzExKU1zZzsKLQotICAgIC8vIHRvIHByZXZlbnQgY2FsbGVyIGZyb20gdXNpbmcgZ2FyYmFnZSBvdXRwdXQgdmFsdWUKLSAgICAqcFJlYXNvbgk9IDA7Ci0KLSAgICBQdHIgPSAoUENIQVIpRnItPk9jdGV0OwotCi0JLy8gb2Zmc2V0IHRvIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzIChDYXRlZ29yeSBhbmQgQWN0aW9uIGZpZWxkKQotICAgIFB0ciArPSAyOwotCi0gICAgLy8gZ2V0IERBIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIE5kaXNNb3ZlTWVtb3J5KHBEQSwgUHRyLCBNQUNfQUREUl9MRU4pOwotICAgIFB0ciArPSBNQUNfQUREUl9MRU47Ci0KLSAgICAvLyBnZXQgU0EgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgTmRpc01vdmVNZW1vcnkocFNBLCBQdHIsIE1BQ19BRERSX0xFTik7Ci0gICAgUHRyICs9IE1BQ19BRERSX0xFTjsKLQotCS8vIGdldCByZWFzb24gY29kZSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKLSAgICBOZGlzTW92ZU1lbW9yeShwUmVhc29uLCBQdHIsIDIpOwotICAgIFB0ciArPSAyOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fc3luYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX3N5bmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ3Yjk3NC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fc3luYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzM0ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JY21tX3N5bmMuYwotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUpvaG4gQ2hhbmcJMjAwNC0wOS0wMSAgICAgIG1vZGlmaWVkIGZvciBydDI1NjEvMjY2MQotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLS8vIDIuNCBHaHogY2hhbm5lbCBwbGFuIGluZGV4IGluIHRoZSBUeFBvd2VyIGFycmF5cy4KLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fMF9TVEFSVAkwCQkJLy8gMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEKLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fMF9TSVpFCTExCi0jZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzFfU1RBUlQJMAkJCS8vIDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzCi0jZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzFfU0laRQkxMwotI2RlZmluZQlCR19CQU5EX1JFR0lPTl8yX1NUQVJUCTkJCQkvLyAxMCwxMQotI2RlZmluZQlCR19CQU5EX1JFR0lPTl8yX1NJWkUJMgotI2RlZmluZQlCR19CQU5EX1JFR0lPTl8zX1NUQVJUCTkJCQkvLyAxMCwxMSwxMiwxMwotI2RlZmluZQlCR19CQU5EX1JFR0lPTl8zX1NJWkUJNAotI2RlZmluZQlCR19CQU5EX1JFR0lPTl80X1NUQVJUCTEzCQkJLy8gMTQKLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fNF9TSVpFCTEKLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fNV9TVEFSVAkwCQkJLy8gMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQKLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fNV9TSVpFCTE0Ci0jZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzZfU1RBUlQJMgkJCS8vIDMsNCw1LDYsNyw4LDkKLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fNl9TSVpFCTcKLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fN19TVEFSVAk0CQkJLy8gNSw2LDcsOCw5LDEwLDExLDEyLDEzCi0jZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzdfU0laRQk5Ci0jZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzMxX1NUQVJUCTAJCQkvLyAxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNAotI2RlZmluZQlCR19CQU5EX1JFR0lPTl8zMV9TSVpFCTE0Ci0KLS8vIDUgR2h6IGNoYW5uZWwgcGxhbiBpbmRleCBpbiB0aGUgVHhQb3dlciBhcnJheXMuCi1VQ0hBUiBBX0JBTkRfUkVHSU9OXzBfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9OwotVUNIQVIgQV9CQU5EX1JFR0lPTl8xX0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwfTsKLVVDSEFSIEFfQkFORF9SRUdJT05fMl9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0fTsKLVVDSEFSIEFfQkFORF9SRUdJT05fM19DSEFOTkVMX0xJU1RbXT17NTIsIDU2LCA2MCwgNjQsIDE0OSwgMTUzLCAxNTcsIDE2MX07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzRfQ0hBTk5FTF9MSVNUW109ezE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fTsKLVVDSEFSIEFfQkFORF9SRUdJT05fNV9DSEFOTkVMX0xJU1RbXT17MTQ5LCAxNTMsIDE1NywgMTYxfTsKLVVDSEFSIEFfQkFORF9SRUdJT05fNl9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDh9OwotVUNIQVIgQV9CQU5EX1JFR0lPTl83X0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NSwgMTY5LCAxNzN9OwotVUNIQVIgQV9CQU5EX1JFR0lPTl84X0NIQU5ORUxfTElTVFtdPXs1MiwgNTYsIDYwLCA2NH07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzlfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEzMiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fTsKLVVDSEFSIEFfQkFORF9SRUdJT05fMTBfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzExX0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDE0OSwgMTUzLCAxNTcsIDE2MX07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzEyX0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwfTsKLVVDSEFSIEFfQkFORF9SRUdJT05fMTNfQ0hBTk5FTF9MSVNUW109ezUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxfTsKLVVDSEFSIEFfQkFORF9SRUdJT05fMTRfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzE1X0NIQU5ORUxfTElTVFtdPXsxNDksIDE1MywgMTU3LCAxNjEsIDE2NSwgMTY5LCAxNzN9OwotCi0KLS8vQmFTaXplQXJyYXkgZm9sbG93cyB0aGUgODAyLjExbiBkZWZpbml0aW9uIGFzIE1heFJ4RmFjdG9yLiAgMl4oMTMrZmFjdG9yKSBieXRlcy4gV2hlbiBmYWN0b3IgPTAsIGl0J3MgYWJvdXQgQmEgYnVmZmVyIHNpemUgPTguCi1VQ0hBUiBCYVNpemVBcnJheVs0XSA9IHs4LDE2LDMyLDY0fTsKLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlVcGRhdGUgU3RhQ2ZnLT5DaGFubmVsTGlzdFtdIGFjY29yZGluZyB0byAxKSBDb3VudHJ5IFJlZ2lvbiAyKSBSRiBJQyB0eXBlLAotCQlhbmQgMykgUEhZLW1vZGUgdXNlciBzZWxlY3RlZC4KLQkJVGhlIG91dGNvbWUgaXMgdXNlZCBieSBkcml2ZXIgd2hlbiBkb2luZyBzaXRlIHN1cnZleS4KLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEJ1aWxkQ2hhbm5lbExpc3QoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JVUNIQVIgaSwgaiwgaW5kZXg9MCwgbnVtPTA7Ci0JUFVDSEFSCXBDaGFubmVsTGlzdCA9IE5VTEw7Ci0KLQlOZGlzWmVyb01lbW9yeShwQWQtPkNoYW5uZWxMaXN0LCBNQVhfTlVNX09GX0NIQU5ORUxTICogc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpKTsKLQotCS8vIGlmIG5vdCAxMWEtb25seSBtb2RlLCBjaGFubmVsIGxpc3Qgc3RhcnRzIGZyb20gMi40R2h6IGJhbmQKLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgIT0gUEhZXzExQSkKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgIT0gUEhZXzExQU5fTUlYRUQpICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlICE9IFBIWV8xMU5fNUcpCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JKQotCXsKLQkJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICAmIDB4N2YpCi0JCXsKLQkJCWNhc2UgUkVHSU9OXzBfQkdfQkFORDoJLy8gMSAtMTEKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fMF9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzBfU0laRSk7Ci0JCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fMF9TSVpFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fMV9CR19CQU5EOgkvLyAxIC0gMTMKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fMV9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzFfU0laRSk7Ci0JCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fMV9TSVpFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fMl9CR19CQU5EOgkvLyAxMCAtIDExCi0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzJfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl8yX1NJWkUpOwotCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzJfU0laRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzNfQkdfQkFORDoJLy8gMTAgLSAxMwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl8zX1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fM19TSVpFKTsKLQkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8zX1NJWkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl80X0JHX0JBTkQ6CS8vIDE0Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzRfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl80X1NJWkUpOwotCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzRfU0laRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzVfQkdfQkFORDoJLy8gMSAtIDE0Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzVfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl81X1NJWkUpOwotCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzVfU0laRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzZfQkdfQkFORDoJLy8gMyAtIDkKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fNl9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzZfU0laRSk7Ci0JCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fNl9TSVpFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fN19CR19CQU5EOiAgLy8gNSAtIDEzCi0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzdfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl83X1NJWkUpOwotCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzdfU0laRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzMxX0JHX0JBTkQ6CS8vIDEgLSAxNAotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl8zMV9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzMxX1NJWkUpOwotCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzMxX1NJWkU7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OiAgICAgICAgICAgIC8vIEVycm9yLiBzaG91bGQgbmV2ZXIgaGFwcGVuCi0JCQkJYnJlYWs7Ci0JCX0KLQkJZm9yIChpPTA7IGk8aW5kZXg7IGkrKykKLQkJCXBBZC0+Q2hhbm5lbExpc3RbaV0uTWF4VHhQd3IgPSAyMDsKLQl9Ci0KLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQSkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHX01JWEVEKQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQl8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdOX01JWEVEKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBTl9NSVhFRCkKLQkJfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUdOX01JWEVEKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzVHKQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCSkKLQl7Ci0JCXN3aXRjaCAocEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kICYgMHg3ZikKLQkJewotCQkJY2FzZSBSRUdJT05fMF9BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMF9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8wX0NIQU5ORUxfTElTVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzFfQV9CQU5EOgotCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzFfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMV9DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl8yX0FfQkFORDoKLQkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8yX0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKLQkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzJfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fM19BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fM19DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8zX0NIQU5ORUxfTElTVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzRfQV9CQU5EOgotCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzRfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fNF9DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl81X0FfQkFORDoKLQkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl81X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKLQkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzVfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fNl9BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fNl9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl82X0NIQU5ORUxfTElTVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzdfQV9CQU5EOgotCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzdfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fN19DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl84X0FfQkFORDoKLQkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl84X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKLQkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzhfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fOV9BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fOV9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl85X0NIQU5ORUxfTElTVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzEwX0FfQkFORDoKLQkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8xMF9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xMF9DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl8xMV9BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMTFfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMTFfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fMTJfQV9CQU5EOgotCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzEyX0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKLQkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzEyX0NIQU5ORUxfTElTVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzEzX0FfQkFORDoKLQkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8xM19DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xM19DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl8xNF9BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMTRfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMTRfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fMTVfQV9CQU5EOgotCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzE1X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKLQkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzE1X0NIQU5ORUxfTElTVDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6ICAgICAgICAgICAgLy8gRXJyb3IuIHNob3VsZCBuZXZlciBoYXBwZW4KLQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCgiY291bnRyeXJlZ2lvbj0lZCBub3Qgc3VwcG9ydCIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCkpOwotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKG51bSAhPSAwKQotCQl7Ci0JCQlVQ0hBUiBSYWRhckNoWzE1XT17NTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwfTsKLQkJCWZvciAoaT0wOyBpPG51bTsgaSsrKQotCQkJewotCQkJCWZvciAoaj0wOyBqPE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGorKykKLQkJCQl7Ci0JCQkJCWlmIChwQ2hhbm5lbExpc3RbaV0gPT0gcEFkLT5UeFBvd2VyW2pdLkNoYW5uZWwpCi0JCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleCtpXSwgJnBBZC0+VHhQb3dlcltqXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpKTsKLQkJCQkJfQotCQkJCWZvciAoaj0wOyBqPDE1OyBqKyspCi0JCQkJewotCQkJCQlpZiAocENoYW5uZWxMaXN0W2ldID09IFJhZGFyQ2hbal0pCi0JCQkJCQlwQWQtPkNoYW5uZWxMaXN0W2luZGV4K2ldLkRmc1JlcSA9IFRSVUU7Ci0JCQkJfQotCQkJCXBBZC0+Q2hhbm5lbExpc3RbaW5kZXgraV0uTWF4VHhQd3IgPSAyMDsKLQkJCX0KLQkJCWluZGV4ICs9IG51bTsKLQkJfQotCX0KLQotCXBBZC0+Q2hhbm5lbExpc3ROdW0gPSBpbmRleDsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoImNvdW50cnkgY29kZT0lZC8lZCwgUkZJQz0lZCwgUEhZIG1vZGU9JWQsIHN1cHBvcnQgJWQgY2hhbm5lbHNcbiIsCi0JCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24sIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCwgcEFkLT5SZkljVHlwZSwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSwgcEFkLT5DaGFubmVsTGlzdE51bSkpOwotI2lmZGVmIERCRwotCWZvciAoaT0wO2k8cEFkLT5DaGFubmVsTGlzdE51bTtpKyspCi0JewotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJCdWlsZENoYW5uZWwgIyAlZCA6OiBQd3IwID0gJWQsIFB3cjEgPSVkLCBcbiAiLCBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3RbaV0uUG93ZXIsIHBBZC0+Q2hhbm5lbExpc3RbaV0uUG93ZXIyKSk7Ci0JfQotI2VuZGlmCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyByb3V0aW5lIHJldHVybiB0aGUgZmlyc3QgY2hhbm5lbCBudW1iZXIgYWNjb3JkaW5nIHRvIHRoZSBjb3VudHJ5Ci0JCWNvZGUgc2VsZWN0aW9uIGFuZCBSRiBJQyBzZWxlY3Rpb24gKHNpZ25hbCBiYW5kIG9yIGR1YWwgYmFuZCkuIEl0IGlzIGNhbGxlZAotCQl3aGVuZXZlciBkcml2ZXIgbmVlZCB0byBzdGFydCBhIHNpdGUgc3VydmV5IG9mIGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMuCi0JUmV0dXJuOgotCQljaCAtIHRoZSBmaXJzdCBjaGFubmVsIG51bWJlciBvZiBjdXJyZW50IGNvdW50cnkgY29kZSBzZXR0aW5nCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVUNIQVIgRmlyc3RDaGFubmVsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCXJldHVybiBwQWQtPkNoYW5uZWxMaXN0WzBdLkNoYW5uZWw7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIG5leHQgY2hhbm5lbCBudW1iZXIuIFRoaXMgcm91dGluZSBpcyBjYWxsZWQKLQkJZHVyaW5nIGRyaXZlciBuZWVkIHRvIHN0YXJ0IGEgc2l0ZSBzdXJ2ZXkgb2YgYWxsIHN1cHBvcnRlZCBjaGFubmVscy4KLQlSZXR1cm46Ci0JCW5leHRfY2hhbm5lbCAtIHRoZSBuZXh0IGNoYW5uZWwgbnVtYmVyIHZhbGlkIGluIGN1cnJlbnQgY291bnRyeSBjb2RlIHNldHRpbmcuCi0JTm90ZToKLQkJcmV0dXJuIDAgaWYgbm8gbW9yZSBuZXh0IGNoYW5uZWwKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1VQ0hBUiBOZXh0Q2hhbm5lbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiBjaGFubmVsKQotewotCWludCBpOwotCVVDSEFSIG5leHRfY2hhbm5lbCA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgKHBBZC0+Q2hhbm5lbExpc3ROdW0gLSAxKTsgaSsrKQotCQlpZiAoY2hhbm5lbCA9PSBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwpCi0JCXsKLQkJCW5leHRfY2hhbm5lbCA9IHBBZC0+Q2hhbm5lbExpc3RbaSsxXS5DaGFubmVsOwotCQkJYnJlYWs7Ci0JfQotCXJldHVybiBuZXh0X2NoYW5uZWw7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyByb3V0aW5lIGlzIGZvciBDaXNjbyBDb21wYXRpYmxlIEV4dGVuc2lvbnMgMi5YCi0JCVNwZWMzMS4gQVAgQ29udHJvbCBvZiBDbGllbnQgVHJhbnNtaXQgUG93ZXIKLQlSZXR1cm46Ci0JCU5vbmUKLQlOb3RlOgotCSAgIFJlcXVpcmVkIGJ5IEFpcm9uZXQgZEJtKG1XKQotCQkgICAwZEJtKDFtVyksICAgMWRCbSg1bVcpLCAxM2RCbSgyMG1XKSwgMTVkQm0oMzBtVyksCi0JCSAgMTdkQm0oNTBtdyksIDIwZEJtKDEwMG1XKQotCi0JICAgV2Ugc3VwcG9ydGVkCi0JCSAgIDNkQm0oTG93ZXN0KSwgNmRCbSgxMCUpLCA5ZEJtKDI1JSksIDEyZEJtKDUwJSksCi0JCSAgMTRkQm0oNzUlKSwgICAxNWRCbSgxMDAlKQotCi0JCVRoZSBjbGllbnQgc3RhdGlvbidzIGFjdHVhbCB0cmFuc21pdCBwb3dlciBzaGFsbCBiZSB3aXRoaW4gKy8tIDVkQiBvZgotCQl0aGUgbWluaW11bSB2YWx1ZSBvciBuZXh0IGxvd2VyIHZhbHVlLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQ2hhbmdlVG9DZWxsUG93ZXJMaW1pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiAgICAgICAgIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCkKLXsKLQkvL3ZhbHVkIDB4RkYgbWVhbnMgdGhhdCBoYXNuJ3QgZm91bmQgcG93ZXIgbGltaXQgaW5mb3JtYXRpb24KLQkvL2Zyb20gdGhlIEFQJ3MgQmVhY29uL1Byb2JlIHJlc3BvbnNlLgotCWlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPT0gMHhGRikKLQkJcmV0dXJuOwotCi0JaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDYpIC8vVXNlZCBMb3dlc3QgUG93ZXIgUGVyY2VudGFnZS4KLQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSA2OwotCWVsc2UgaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDkpCi0JCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gMTA7Ci0JZWxzZSBpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0IDwgMTIpCi0JCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gMjU7Ci0JZWxzZSBpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0IDwgMTQpCi0JCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gNTA7Ci0JZWxzZSBpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0IDwgMTUpCi0JCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gNzU7Ci0JZWxzZQotCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDEwMDsgLy9lbHNlIHVzZWQgbWF4aW11bQotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQpCi0JCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7Ci0KLX0KLQotQ0hBUglDb252ZXJ0VG9Sc3NpKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIENIQVIJCQkJUnNzaSwKLQlJTiBVQ0hBUgkJCVJzc2lOdW1iZXIpCi17Ci0JVUNIQVIJUnNzaU9mZnNldCwgTE5BR2FpbjsKLQotCS8vIFJzc2kgZXF1YWxzIHRvIHplcm8gc2hvdWxkIGJlIGFuIGludmFsaWQgdmFsdWUKLQlpZiAoUnNzaSA9PSAwKQotCQlyZXR1cm4gLTk5OwotCi0JTE5BR2FpbiA9IEdFVF9MTkFfR0FJTihwQWQpOwotICAgIGlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkKLSAgICB7Ci0gICAgICAgIGlmIChSc3NpTnVtYmVyID09IDApCi0JCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDA7Ci0JCWVsc2UgaWYgKFJzc2lOdW1iZXIgPT0gMSkKLQkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MTsKLQkJZWxzZQotCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoUnNzaU51bWJlciA9PSAwKQotCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MDsKLQkJZWxzZSBpZiAoUnNzaU51bWJlciA9PSAxKQotCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MTsKLQkJZWxzZQotCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MjsKLSAgICB9Ci0KLSAgICByZXR1cm4gKC0xMiAtIFJzc2lPZmZzZXQgLSBMTkFHYWluIC0gUnNzaSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJU2NhbiBuZXh0IGNoYW5uZWwKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFNjYW5OZXh0Q2hhbm5lbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlIRUFERVJfODAyXzExICAgSGRyODAyMTE7Ci0JUFVDSEFSICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOwotCVVMT05HICAgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0JVUNIQVIgICAgICAgICAgIFNzaWRMZW4gPSAwLCBTY2FuVHlwZSA9IHBBZC0+TWxtZUF1eC5TY2FuVHlwZSwgQkJQVmFsdWUgPSAwOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCVVTSE9SVCAgICAgICAgICBTdGF0dXM7Ci0JUEhFQURFUl84MDJfMTEgIHBIZHI4MDIxMTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQlVSU5UCQkJU2NhblRpbWVJbjVnQ2hhbm5lbCA9IFNIT1JUX0NIQU5ORUxfVElNRTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlpZiAoTU9OSVRPUl9PTihwQWQpKQotCQkJcmV0dXJuOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2lmZGVmIFJBTElOS19BVEUKLQkvLyBOb3RoaW5nIHRvIGRvIGluIEFURSBtb2RlLgotCWlmIChBVEVfT04ocEFkKSkKLQkJcmV0dXJuOwotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA9PSAwKQotCXsKLQkJaWYgKChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQkmJiAoSU5GUkFfT04ocEFkKQotCQkJCXx8IChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApKQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkJKQotCQl7Ci0JCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0JCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7Ci0JCQlCQlBWYWx1ZSAmPSAofjB4MTgpOwotCQkJQkJQVmFsdWUgfD0gMHgxMDsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBFbmQgb2YgU0NBTiwgcmVzdG9yZSB0byA0ME1IeiBjaGFubmVsICVkLCBUb3RhbCBCU1NbJTAyZF1cbiIscEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIHBBZC0+U2NhblRhYi5Cc3NOcikpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBFbmQgb2YgU0NBTiwgcmVzdG9yZSB0byBjaGFubmVsICVkLCBUb3RhbCBCU1NbJTAyZF1cbiIscEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5TY2FuVGFiLkJzc05yKSk7Ci0JCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0JCQkvLwotCQkJLy8gVG8gcHJldmVudCBkYXRhIGxvc3QuCi0JCQkvLyBTZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9uIHRvIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCBiZWZvcmUgU0NBTiBwcm9ncmVzcy4KLQkJCS8vIE5vdywgd2UgbmVlZCB0byBzZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9mZiB0byBBUCwgd2hlbiBzY2FuIHByb2dyZXNzIGRvbmUKLQkJCS8vCi0JCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpICYmIChJTkZSQV9PTihwQWQpKSkKLQkJCXsKLQkJCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsKLQkJCQlpZiAoTlN0YXR1cwk9PSBORElTX1NUQVRVU19TVUNDRVNTKQotCQkJCXsKLQkJCQkJcEhkcjgwMjExID0gKFBIRUFERVJfODAyXzExKSBwT3V0QnVmZmVyOwotCQkJCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcEhkcjgwMjExLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJCQkJcEhkcjgwMjExLT5EdXJhdGlvbiA9IDA7Ci0JCQkJCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX0RBVEE7Ci0JCQkJCXBIZHI4MDIxMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOwotCi0JCQkJCS8vIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKLQkJCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU2NhblJlcUFjdGlvbiAtLSBTZW5kIFBTTSBEYXRhIGZyYW1lXG4iKSk7Ci0JCQkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0JCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7Ci0JCQkJfQotCQkJfQotCi0JCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOwotCQkJU3RhdHVzID0gTUxNRV9TVUNDRVNTOwotCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwgMiwgJlN0YXR1cyk7Ci0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0JCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOwotCX0KLQllbHNlCi0JewotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0JCS8vIEJCUCBhbmQgUkYgYXJlIG5vdCBhY2Nlc3NpYmxlIGluIFBTIG1vZGUsIHdlIGhhcyB0byB3YWtlIHRoZW0gdXAgZmlyc3QKLQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0JCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKLQotCQkJLy8gbGVhdmUgUFNNIGR1cmluZyBzY2FubmluZy4gb3RoZXJ3aXNlIHdlIG1heSBsb3N0IFByb2JlUnNwICYgQkVBQ09OCi0JCQlpZiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKQotCQkJCVJUTVBfU0VUX1BTTV9CSVQocEFkLCBQV1JfQUNUSVZFKTsKLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwsIFRSVUUpOwotCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJaWYgKHBBZC0+TWxtZUF1eC5DaGFubmVsID4gMTQpCi0JCQl7Ci0JCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJiBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKSkKLQkJCQl7Ci0JCQkJCVNjYW5UeXBlID0gU0NBTl9QQVNTSVZFOwotCQkJCQlTY2FuVGltZUluNWdDaGFubmVsID0gTUlOX0NIQU5ORUxfVElNRTsKLQkJCQl9Ci0JCQl9Ci0KLSNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vIFJvZ2VyIHN5bmMgQ2FycmllcgotCQkJLy8gY2FycmllciBkZXRlY3Rpb24KLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9PSBUUlVFKQotCQkJewotCQkJCVNjYW5UeXBlID0gU0NBTl9QQVNTSVZFOwotCQkJCVNjYW5UaW1lSW41Z0NoYW5uZWwgPSBNSU5fQ0hBTk5FTF9USU1FOwotCQkJfQotI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KLQkJfQotCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkJLy9HbG9iYWwgY291bnRyeSBkb21haW4oY2gxLTExOmFjdGl2ZSBzY2FuLCBjaDEyLTE0IHBhc3NpdmUgc2NhbikKLQkJaWYgKChwQWQtPk1sbWVBdXguQ2hhbm5lbCA8PSAxNCkgJiYgKHBBZC0+TWxtZUF1eC5DaGFubmVsID49IDEyKSAmJiAoKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gJiAweDdmKSA9PSBSRUdJT05fMzFfQkdfQkFORCkpCi0JCXsKLQkJCVNjYW5UeXBlID0gU0NBTl9QQVNTSVZFOwotCQl9Ci0KLQkJLy8gV2UgbmVlZCB0byBzaG9ydGVuIGFjdGl2ZSBzY2FuIHRpbWUgaW4gb3JkZXIgZm9yIFdaQyBjb25uZWN0IGlzc3VlCi0JCS8vIENobmFnZSB0aGUgY2hhbm5lbCBzY2FuIHRpbWUgZm9yIENJU0NPIHN0dWZmIGJhc2VkIG9uIGl0cyBJQVBQIGFubm91bmNlbWVudAotCQlpZiAoU2NhblR5cGUgPT0gRkFTVF9TQ0FOX0FDVElWRSkKLQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgRkFTVF9BQ1RJVkVfU0NBTl9USU1FKTsKLQkJZWxzZSAvLyBtdXN0IGJlIFNDQU5fUEFTU0lWRSBvciBTQ0FOX0FDVElWRQotCQl7Ci0JCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHX01JWEVEKQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJCXx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR05fTUlYRUQpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFHTl9NSVhFRCkKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCSkKLQkJCXsKLQkJCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPiAxNCkKLQkJCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCBTY2FuVGltZUluNWdDaGFubmVsKTsKLQkJCQllbHNlCi0JCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCBNSU5fQ0hBTk5FTF9USU1FKTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIE1BWF9DSEFOTkVMX1RJTUUpOwotCQl9Ci0KLQkJaWYgKChTY2FuVHlwZSA9PSBTQ0FOX0FDVElWRSkKLQkJCXx8IChTY2FuVHlwZSA9PSBGQVNUX1NDQU5fQUNUSVZFKQotCQkJKQotCQl7Ci0JCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCQkJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gU2Nhbk5leHRDaGFubmVsKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxcbiIpKTsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJCXsKLQkJCQkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKLQkJCQkJU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOwotCQkJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU0NBTl9DT05GLCAyLCAmU3RhdHVzKTsKLQkJCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2VuZCBicm9hZGNhc3QgcHJvYmUgcmVxdWVzdCBpZiBhY3RpdmUgc2NhbiBpcyBpbiBlZmZlY3QuCi0JCQlpZiAoKFNjYW5UeXBlID09IFNDQU5fQUNUSVZFKSB8fCAoU2NhblR5cGUgPT0gRkFTVF9TQ0FOX0FDVElWRSkKLQkJCQkpCi0JCQkJU3NpZExlbiA9IHBBZC0+TWxtZUF1eC5Tc2lkTGVuOwotCQkJZWxzZQotCQkJCVNzaWRMZW4gPSAwOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmSGRyODAyMTEsIFNVQlRZUEVfUFJPQkVfUkVRLCAwLCBCUk9BRENBU1RfQUREUiwgQlJPQURDQVNUX0FERFIpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotCQkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAmSGRyODAyMTEsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkTGVuLAotCQkJCQkJCSAgU3NpZExlbiwJCQkgICAgICAgIHBBZC0+TWxtZUF1eC5Tc2lkLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiwKLQkJCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW4sICBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlLAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCi0JCQlpZiAocEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbikKLQkJCXsKLQkJCQlVTE9ORyBUbXA7Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXAsCi0JCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCi0JCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuLAotCQkJCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW4sICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGUsCi0JCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJCUZyYW1lTGVuICs9IFRtcDsKLQkJCX0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKLQkJCXsKLQkJCQlVTE9ORwlUbXA7Ci0JCQkJVUNIQVIJSHRMZW47Ci0JCQkJVUNIQVIJQlJPQURDT01bNF0gPSB7MHgwLCAweDkwLCAweDRjLCAweDMzfTsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCQkJSFRfQ0FQQUJJTElUWV9JRSBIdENhcGFiaWxpdHlUbXA7Ci0jZW5kaWYKLQkJCQlpZiAocEFkLT5iQnJvYWRDb21IVCA9PSBUUlVFKQotCQkJCXsKLQkJCQkJSHRMZW4gPSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuICsgNDsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZIdENhcGFiaWxpdHlUbXAsICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCBTSVpFX0hUX0NBUF9JRSk7Ci0JCQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykpOwotI2lmZGVmIFVOQUxJR05NRU5UX1NVUFBPUlQKLQkJCQkJewotCQkJCQkJRVhUX0hUX0NBUF9JTkZPIGV4dEh0Q2FwSW5mbzsKLQotCQkJCQkJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikoJmV4dEh0Q2FwSW5mbyksIChQVUNIQVIpKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSwgc2l6ZW9mKEVYVF9IVF9DQVBfSU5GTykpOwotCQkJCQkJKihVU0hPUlQgKikoJmV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmZXh0SHRDYXBJbmZvKSk7Ci0JCQkJCQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbyksIChQVUNIQVIpKCZleHRIdENhcEluZm8pLCBzaXplb2YoRVhUX0hUX0NBUF9JTkZPKSk7Ci0JCQkJCX0KLSNlbHNlCi0JCQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSk7Ci0jZW5kaWYgLy8gVU5BTElHTk1FTlRfU1VQUE9SVCAvLwotCi0JCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgJlRtcCwKLQkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCi0JCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAotCQkJCQkJCQkJNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKLQkJCQkJCQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAmSHRDYXBhYmlsaXR5VG1wLAotCQkJCQkJCQkJRU5EX09GX0FSR1MpOwotI2Vsc2UKLQkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAmVG1wLAotCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZXcGFJZSwKLQkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCi0JCQkJCQkJCQk0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJST0FEQ09NWzBdLAotCQkJCQkJCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAotCQkJCQkJCQkJRU5EX09GX0FSR1MpOwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJSHRMZW4gPSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuOwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQkJCQkJTmRpc01vdmVNZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgU0laRV9IVF9DQVBfSUUpOwotCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pKTsKLSNpZmRlZiBVTkFMSUdOTUVOVF9TVVBQT1JUCi0JCQkJCXsKLQkJCQkJCUVYVF9IVF9DQVBfSU5GTyBleHRIdENhcEluZm87Ci0KLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpKCZleHRIdENhcEluZm8pLCAoUFVDSEFSKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbyksIHNpemVvZihFWFRfSFRfQ0FQX0lORk8pKTsKLQkJCQkJCSooVVNIT1JUICopKCZleHRIdENhcEluZm8pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJmV4dEh0Q2FwSW5mbykpOwotCQkJCQkJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pLCAoUFVDSEFSKSgmZXh0SHRDYXBJbmZvKSwgc2l6ZW9mKEVYVF9IVF9DQVBfSU5GTykpOwotCQkJCQl9Ci0jZWxzZQotCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykpOwotI2VuZGlmIC8vIFVOQUxJR05NRU5UX1NVUFBPUlQgLy8KLQotCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICZUbXAsCi0JCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCi0JCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAotCQkJCQkJCQkJSHRMZW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcGFiaWxpdHlUbXAsCi0JCQkJCQkJCQlFTkRfT0ZfQVJHUyk7Ci0jZWxzZQotCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICZUbXAsCi0JCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCi0JCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAotCQkJCQkJCQkJSHRMZW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCi0JCQkJCQkJCQlFTkRfT0ZfQVJHUyk7Ci0jZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLwotCQkJCX0KLQkJCQlGcmFtZUxlbiArPSBUbXA7Ci0KLSNpZmRlZiBET1QxMU5fRFJBRlQzCi0JCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5iMjA0MENvZXhpc3RTY2FuU3VwID09IDEpCi0JCQkJewotCQkJCQlVTE9ORwkJVG1wOwotCQkJCQlIdExlbiA9IDE7Ci0JCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wLAotCQkJCQkJCQkJICAxLAkJCQkJJkV4dEh0Q2FwSWUsCi0JCQkJCQkJCQkgIDEsCQkJCQkmSHRMZW4sCi0JCQkJCQkJCQkgIDEsCQkJCSZwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC53b3JkLAotCQkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0KLQkJCQkJRnJhbWVMZW4gKz0gVG1wOwotCQkJCX0KLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0JCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQotCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCQl9Ci0KLQkJLy8gRm9yIFNDQU5fQ0lTQ09fUEFTU0lWRSwgZG8gbm90aGluZyBhbmQgc2lsZW50bHkgd2FpdCBmb3IgYmVhY29uIG9yIG90aGVyIHByb2JlIHJlcG9uc2UKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNDQU5fTElTVEVOOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JfQotfQotCi1WT0lEIE1ndFByb2JSZXFNYWNIZWFkZXJJbml0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCi0JSU4gVUNIQVIgU3ViVHlwZSwKLQlJTiBVQ0hBUiBUb0RzLAotCUlOIFBVQ0hBUiBwREEsCi0JSU4gUFVDSEFSIHBCc3NpZCkKLXsKLQlOZGlzWmVyb01lbW9yeShwSGRyODAyMTEsIHNpemVvZihIRUFERVJfODAyXzExKSk7Ci0KLQlwSGRyODAyMTEtPkZDLlR5cGUgPSBCVFlQRV9NR01UOwotCXBIZHI4MDIxMS0+RkMuU3ViVHlwZSA9IFN1YlR5cGU7Ci0JaWYgKFN1YlR5cGUgPT0gU1VCVFlQRV9BQ0spCi0JCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX0NOVEw7Ci0JcEhkcjgwMjExLT5GQy5Ub0RzID0gVG9EczsKLQlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjEsIHBEQSk7Ci0JQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKLQlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIHBCc3NpZCk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fdGtpcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX3RraXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI0NzRmMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fdGtpcC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTY2ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JY21tX3RraXAuYwotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVBhdWwgV3UJCTAyLTI1LTAyCQlJbml0aWFsCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotLy8gUm90YXRpb24gZnVuY3Rpb25zIG9uIDMyIGJpdCB2YWx1ZXMKLSNkZWZpbmUgUk9MMzIoIEEsIG4gKSBcCi0JKCAoKEEpIDw8IChuKSkgfCAoICgoQSk+PigzMi0obikpKSAmICggKDFVTCA8PCAobikpIC0gMSApICkgKQotI2RlZmluZSBST1IzMiggQSwgbiApIFJPTDMyKCAoQSksIDMyLShuKSApCi0KLVVJTlQgVGtpcF9TYm94X0xvd2VyWzI1Nl0gPQotewotCTB4QTUsMHg4NCwweDk5LDB4OEQsMHgwRCwweEJELDB4QjEsMHg1NCwKLQkweDUwLDB4MDMsMHhBOSwweDdELDB4MTksMHg2MiwweEU2LDB4OUEsCi0JMHg0NSwweDlELDB4NDAsMHg4NywweDE1LDB4RUIsMHhDOSwweDBCLAotCTB4RUMsMHg2NywweEZELDB4RUEsMHhCRiwweEY3LDB4OTYsMHg1QiwKLQkweEMyLDB4MUMsMHhBRSwweDZBLDB4NUEsMHg0MSwweDAyLDB4NEYsCi0JMHg1QywweEY0LDB4MzQsMHgwOCwweDkzLDB4NzMsMHg1MywweDNGLAotCTB4MEMsMHg1MiwweDY1LDB4NUUsMHgyOCwweEExLDB4MEYsMHhCNSwKLQkweDA5LDB4MzYsMHg5QiwweDNELDB4MjYsMHg2OSwweENELDB4OUYsCi0JMHgxQiwweDlFLDB4NzQsMHgyRSwweDJELDB4QjIsMHhFRSwweEZCLAotCTB4RjYsMHg0RCwweDYxLDB4Q0UsMHg3QiwweDNFLDB4NzEsMHg5NywKLQkweEY1LDB4NjgsMHgwMCwweDJDLDB4NjAsMHgxRiwweEM4LDB4RUQsCi0JMHhCRSwweDQ2LDB4RDksMHg0QiwweERFLDB4RDQsMHhFOCwweDRBLAotCTB4NkIsMHgyQSwweEU1LDB4MTYsMHhDNSwweEQ3LDB4NTUsMHg5NCwKLQkweENGLDB4MTAsMHgwNiwweDgxLDB4RjAsMHg0NCwweEJBLDB4RTMsCi0JMHhGMywweEZFLDB4QzAsMHg4QSwweEFELDB4QkMsMHg0OCwweDA0LAotCTB4REYsMHhDMSwweDc1LDB4NjMsMHgzMCwweDFBLDB4MEUsMHg2RCwKLQkweDRDLDB4MTQsMHgzNSwweDJGLDB4RTEsMHhBMiwweENDLDB4MzksCi0JMHg1NywweEYyLDB4ODIsMHg0NywweEFDLDB4RTcsMHgyQiwweDk1LAotCTB4QTAsMHg5OCwweEQxLDB4N0YsMHg2NiwweDdFLDB4QUIsMHg4MywKLQkweENBLDB4MjksMHhEMywweDNDLDB4NzksMHhFMiwweDFELDB4NzYsCi0JMHgzQiwweDU2LDB4NEUsMHgxRSwweERCLDB4MEEsMHg2QywweEU0LAotCTB4NUQsMHg2RSwweEVGLDB4QTYsMHhBOCwweEE0LDB4MzcsMHg4QiwKLQkweDMyLDB4NDMsMHg1OSwweEI3LDB4OEMsMHg2NCwweEQyLDB4RTAsCi0JMHhCNCwweEZBLDB4MDcsMHgyNSwweEFGLDB4OEUsMHhFOSwweDE4LAotCTB4RDUsMHg4OCwweDZGLDB4NzIsMHgyNCwweEYxLDB4QzcsMHg1MSwKLQkweDIzLDB4N0MsMHg5QywweDIxLDB4REQsMHhEQywweDg2LDB4ODUsCi0JMHg5MCwweDQyLDB4QzQsMHhBQSwweEQ4LDB4MDUsMHgwMSwweDEyLAotCTB4QTMsMHg1RiwweEY5LDB4RDAsMHg5MSwweDU4LDB4MjcsMHhCOSwKLQkweDM4LDB4MTMsMHhCMywweDMzLDB4QkIsMHg3MCwweDg5LDB4QTcsCi0JMHhCNiwweDIyLDB4OTIsMHgyMCwweDQ5LDB4RkYsMHg3OCwweDdBLAotCTB4OEYsMHhGOCwweDgwLDB4MTcsMHhEQSwweDMxLDB4QzYsMHhCOCwKLQkweEMzLDB4QjAsMHg3NywweDExLDB4Q0IsMHhGQywweEQ2LDB4M0EKLX07Ci0KLVVJTlQgVGtpcF9TYm94X1VwcGVyWzI1Nl0gPQotewotCTB4QzYsMHhGOCwweEVFLDB4RjYsMHhGRiwweEQ2LDB4REUsMHg5MSwKLQkweDYwLDB4MDIsMHhDRSwweDU2LDB4RTcsMHhCNSwweDRELDB4RUMsCi0JMHg4RiwweDFGLDB4ODksMHhGQSwweEVGLDB4QjIsMHg4RSwweEZCLAotCTB4NDEsMHhCMywweDVGLDB4NDUsMHgyMywweDUzLDB4RTQsMHg5QiwKLQkweDc1LDB4RTEsMHgzRCwweDRDLDB4NkMsMHg3RSwweEY1LDB4ODMsCi0JMHg2OCwweDUxLDB4RDEsMHhGOSwweEUyLDB4QUIsMHg2MiwweDJBLAotCTB4MDgsMHg5NSwweDQ2LDB4OUQsMHgzMCwweDM3LDB4MEEsMHgyRiwKLQkweDBFLDB4MjQsMHgxQiwweERGLDB4Q0QsMHg0RSwweDdGLDB4RUEsCi0JMHgxMiwweDFELDB4NTgsMHgzNCwweDM2LDB4REMsMHhCNCwweDVCLAotCTB4QTQsMHg3NiwweEI3LDB4N0QsMHg1MiwweERELDB4NUUsMHgxMywKLQkweEE2LDB4QjksMHgwMCwweEMxLDB4NDAsMHhFMywweDc5LDB4QjYsCi0JMHhENCwweDhELDB4NjcsMHg3MiwweDk0LDB4OTgsMHhCMCwweDg1LAotCTB4QkIsMHhDNSwweDRGLDB4RUQsMHg4NiwweDlBLDB4NjYsMHgxMSwKLQkweDhBLDB4RTksMHgwNCwweEZFLDB4QTAsMHg3OCwweDI1LDB4NEIsCi0JMHhBMiwweDVELDB4ODAsMHgwNSwweDNGLDB4MjEsMHg3MCwweEYxLAotCTB4NjMsMHg3NywweEFGLDB4NDIsMHgyMCwweEU1LDB4RkQsMHhCRiwKLQkweDgxLDB4MTgsMHgyNiwweEMzLDB4QkUsMHgzNSwweDg4LDB4MkUsCi0JMHg5MywweDU1LDB4RkMsMHg3QSwweEM4LDB4QkEsMHgzMiwweEU2LAotCTB4QzAsMHgxOSwweDlFLDB4QTMsMHg0NCwweDU0LDB4M0IsMHgwQiwKLQkweDhDLDB4QzcsMHg2QiwweDI4LDB4QTcsMHhCQywweDE2LDB4QUQsCi0JMHhEQiwweDY0LDB4NzQsMHgxNCwweDkyLDB4MEMsMHg0OCwweEI4LAotCTB4OUYsMHhCRCwweDQzLDB4QzQsMHgzOSwweDMxLDB4RDMsMHhGMiwKLQkweEQ1LDB4OEIsMHg2RSwweERBLDB4MDEsMHhCMSwweDlDLDB4NDksCi0JMHhEOCwweEFDLDB4RjMsMHhDRiwweENBLDB4RjQsMHg0NywweDEwLAotCTB4NkYsMHhGMCwweDRBLDB4NUMsMHgzOCwweDU3LDB4NzMsMHg5NywKLQkweENCLDB4QTEsMHhFOCwweDNFLDB4OTYsMHg2MSwweDBELDB4MEYsCi0JMHhFMCwweDdDLDB4NzEsMHhDQywweDkwLDB4MDYsMHhGNywweDFDLAotCTB4QzIsMHg2QSwweEFFLDB4NjksMHgxNywweDk5LDB4M0EsMHgyNywKLQkweEQ5LDB4RUIsMHgyQiwweDIyLDB4RDIsMHhBOSwweDA3LDB4MzMsCi0JMHgyRCwweDNDLDB4MTUsMHhDOSwweDg3LDB4QUEsMHg1MCwweEE1LAotCTB4MDMsMHg1OSwweDA5LDB4MUEsMHg2NSwweEQ3LDB4ODQsMHhEMCwKLQkweDgyLDB4MjksMHg1QSwweDFFLDB4N0IsMHhBOCwweDZELDB4MkMKLX07Ci0KLS8vCi0vLyBFeHBhbmRlZCBJViBmb3IgVEtJUCBmdW5jdGlvbi4KLS8vCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgX0lWX0NPTlRST0xfCi17Ci0JdW5pb24gUEFDS0VECi0JewotCQlzdHJ1Y3QgUEFDS0VECi0JCXsKLQkJCVVDSEFSCQlyYzA7Ci0JCQlVQ0hBUgkJcmMxOwotCQkJVUNIQVIJCXJjMjsKLQotCQkJdW5pb24gUEFDS0VECi0JCQl7Ci0JCQkJc3RydWN0IFBBQ0tFRAotCQkJCXsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCQkJCVVDSEFSCUtleUlEOjI7Ci0JCQkJCVVDSEFSCUV4dElWOjE7Ci0JCQkJCVVDSEFSCVJzdmQ6NTsKLSNlbHNlCi0JCQkJCVVDSEFSCVJzdmQ6NTsKLQkJCQkJVUNIQVIJRXh0SVY6MTsKLQkJCQkJVUNIQVIJS2V5SUQ6MjsKLSNlbmRpZgotCQkJCX0JZmllbGQ7Ci0JCQkJVUNIQVIJCUJ5dGU7Ci0JCQl9CUNPTlRST0w7Ci0JCX0JZmllbGQ7Ci0KLQkJVUxPTkcJd29yZDsKLQl9CUlWMTY7Ci0KLQlVTE9ORwlJVjMyOwotfQlUS0lQX0lWLCAqUFRLSVBfSVY7Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUNvbnZlcnQgZnJvbSBVQ0hBUltdIHRvIFVMT05HIGluIGEgcG9ydGFibGUgd2F5Ci0KLQlBcmd1bWVudHM6Ci0gICAgICBwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVMT05HCVJUTVBUa2lwR2V0VUludDMyKAotCUlOCVBVQ0hBUglwTUlDS2V5KQotewotCVVMT05HCXJlcyA9IDA7Ci0JSU5UCQlpOwotCi0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLQl7Ci0JCXJlcyB8PSAoKnBNSUNLZXkrKykgPDwgKDggKiBpKTsKLQl9Ci0KLQlyZXR1cm4gcmVzOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJQ29udmVydCBmcm9tIFVMT05HIHRvIFVDSEFSW10gaW4gYSBwb3J0YWJsZSB3YXkKLQotCUFyZ3VtZW50czoKLSAgICAgIHBEc3QJCQlwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGZvciBjb252ZXJ0IFVMT05HIHRvIFVDSEFSW10KLSAgICAgIHZhbAkJCXRoZSB2YWx1ZSBmb3IgY29udmVydAotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBUa2lwUHV0VUludDMyKAotCUlOIE9VVAlQVUNIQVIJCXBEc3QsCi0JSU4JCVVMT05HCQl2YWwpCi17Ci0JSU5UIGk7Ci0KLQlmb3IoaSA9IDA7IGkgPCA0OyBpKyspCi0JewotCQkqcERzdCsrID0gKFVDSEFSKSAodmFsICYgMHhmZik7Ci0JCXZhbCA+Pj0gODsKLQl9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlTZXQgdGhlIE1JQyBLZXkuCi0KLQlBcmd1bWVudHM6Ci0gICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLSAgICAgIHBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUTVBUa2lwU2V0TUlDS2V5KAotCUlOCVBUS0lQX0tFWV9JTkZPCXBUa2lwLAotCUlOCVBVQ0hBUgkJCXBNSUNLZXkpCi17Ci0JLy8gU2V0IHRoZSBrZXkKLQlwVGtpcC0+SzAgPSBSVE1QVGtpcEdldFVJbnQzMihwTUlDS2V5KTsKLQlwVGtpcC0+SzEgPSBSVE1QVGtpcEdldFVJbnQzMihwTUlDS2V5ICsgNCk7Ci0JLy8gYW5kIHJlc2V0IHRoZSBtZXNzYWdlCi0JcFRraXAtPkwgPSBwVGtpcC0+SzA7Ci0JcFRraXAtPlIgPSBwVGtpcC0+SzE7Ci0JcFRraXAtPm5CeXRlc0luTSA9IDA7Ci0JcFRraXAtPk0gPSAwOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJQ2FsY3VsYXRlIHRoZSBNSUMgVmFsdWUuCi0KLQlBcmd1bWVudHM6Ci0gICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLSAgICAgIHVDaGFyCQkJQXBwZW5kIHRoaXMgdUNoYXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QVGtpcEFwcGVuZEJ5dGUoCi0JSU4JUFRLSVBfS0VZX0lORk8JcFRraXAsCi0JSU4JVUNIQVIJCQl1Q2hhcikKLXsKLQkvLyBBcHBlbmQgdGhlIGJ5dGUgdG8gb3VyIHdvcmQtc2l6ZWQgYnVmZmVyCi0JcFRraXAtPk0gfD0gKHVDaGFyIDw8ICg4KiBwVGtpcC0+bkJ5dGVzSW5NKSk7Ci0JcFRraXAtPm5CeXRlc0luTSsrOwotCS8vIFByb2Nlc3MgdGhlIHdvcmQgaWYgaXQgaXMgZnVsbC4KLQlpZiggcFRraXAtPm5CeXRlc0luTSA+PSA0ICkKLQl7Ci0JCXBUa2lwLT5MIF49IHBUa2lwLT5NOwotCQlwVGtpcC0+UiBePSBST0wzMiggcFRraXAtPkwsIDE3ICk7Ci0JCXBUa2lwLT5MICs9IHBUa2lwLT5SOwotCQlwVGtpcC0+UiBePSAoKHBUa2lwLT5MICYgMHhmZjAwZmYwMCkgPj4gOCkgfCAoKHBUa2lwLT5MICYgMHgwMGZmMDBmZikgPDwgOCk7Ci0JCXBUa2lwLT5MICs9IHBUa2lwLT5SOwotCQlwVGtpcC0+UiBePSBST0wzMiggcFRraXAtPkwsIDMgKTsKLQkJcFRraXAtPkwgKz0gcFRraXAtPlI7Ci0JCXBUa2lwLT5SIF49IFJPUjMyKCBwVGtpcC0+TCwgMiApOwotCQlwVGtpcC0+TCArPSBwVGtpcC0+UjsKLQkJLy8gQ2xlYXIgdGhlIGJ1ZmZlcgotCQlwVGtpcC0+TSA9IDA7Ci0JCXBUa2lwLT5uQnl0ZXNJbk0gPSAwOwotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUNhbGN1bGF0ZSB0aGUgTUlDIFZhbHVlLgotCi0JQXJndW1lbnRzOgotICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0gICAgICBwU3JjCQkJUG9pbnRlciB0byBzb3VyY2UgZGF0YSBmb3IgQ2FsY3VsYXRlIE1JQyBWYWx1ZQotICAgICAgTGVuCQkJSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgc291cmNlIGRhdGEKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QVGtpcEFwcGVuZCgKLQlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCwKLQlJTglQVUNIQVIJCQlwU3JjLAotCUlOCVVJTlQJCQluQnl0ZXMpCi17Ci0JLy8gVGhpcyBpcyBzaW1wbGUKLQl3aGlsZShuQnl0ZXMgPiAwKQotCXsKLQkJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAqcFNyYysrKTsKLQkJbkJ5dGVzLS07Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJR2V0IHRoZSBNSUMgVmFsdWUuCi0KLQlBcmd1bWVudHM6Ci0gICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCQl0aGUgTUlDIFZhbHVlIGlzIHN0b3JlIGluIHBBZC0+UHJpdmF0ZUluZm8uTUlDCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QVGtpcEdldE1JQygKLQlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCkKLXsKLQkvLyBBcHBlbmQgdGhlIG1pbmltdW0gcGFkZGluZwotCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMHg1YSApOwotCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOwotCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOwotCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOwotCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOwotCS8vIGFuZCB0aGVuIHplcm9lcyB1bnRpbCB0aGUgbGVuZ3RoIGlzIGEgbXVsdGlwbGUgb2YgNAotCXdoaWxlKCBwVGtpcC0+bkJ5dGVzSW5NICE9IDAgKQotCXsKLQkJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAwICk7Ci0JfQotCS8vIFRoZSBhcHBlbmRCeXRlIGZ1bmN0aW9uIGhhcyBhbHJlYWR5IGNvbXB1dGVkIHRoZSByZXN1bHQuCi0JUlRNUFRraXBQdXRVSW50MzIocFRraXAtPk1JQywgcFRraXAtPkwpOwotCVJUTVBUa2lwUHV0VUludDMyKHBUa2lwLT5NSUMgKyA0LCBwVGtpcC0+Uik7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlJbml0IFRraXAgZnVuY3Rpb24uCi0KLQlBcmd1bWVudHM6Ci0gICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcFRLZXkgICAgICAgUG9pbnRlciB0byB0aGUgVGVtcG9yYWwgS2V5IChUSyksIFRLIHNoYWxsIGJlIDEyOGJpdHMuCi0JCUtleUlkCQlUSyBLZXkgSUQKLQkJcFRBCQkJUG9pbnRlciB0byB0cmFuc21pdHRlciBhZGRyZXNzCi0JCXBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBJbml0VGtpcEVuZ2luZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwS2V5LAotCUlOCVVDSEFSCQkJS2V5SWQsCi0JSU4JUFVDSEFSCQkJcFRBLAotCUlOCVBVQ0hBUgkJCXBNSUNLZXksCi0JSU4JUFVDSEFSCQkJcFRTQywKLQlPVVQJUFVMT05HCQkJcElWMTYsCi0JT1VUCVBVTE9ORwkJCXBJVjMyKQotewotCVRLSVBfSVYJdGtpcEl2OwotCi0JLy8gUHJlcGFyZSA4IGJ5dGVzIFRLSVAgZW5jYXBzdWxhdGlvbiBmb3IgTVBEVQotCU5kaXNaZXJvTWVtb3J5KCZ0a2lwSXYsIHNpemVvZihUS0lQX0lWKSk7Ci0JdGtpcEl2LklWMTYuZmllbGQucmMwID0gKihwVFNDICsgMSk7Ci0JdGtpcEl2LklWMTYuZmllbGQucmMxID0gKHRraXBJdi5JVjE2LmZpZWxkLnJjMCB8IDB4MjApICYgMHg3ZjsKLQl0a2lwSXYuSVYxNi5maWVsZC5yYzIgPSAqcFRTQzsKLQl0a2lwSXYuSVYxNi5maWVsZC5DT05UUk9MLmZpZWxkLkV4dElWID0gMTsgIC8vIDA6IG5vbi1leHRlbmRlZCBJViwgMTogYW4gZXh0ZW5kZWQgSVYKLQl0a2lwSXYuSVYxNi5maWVsZC5DT05UUk9MLmZpZWxkLktleUlEID0gS2V5SWQ7Ci0vLwl0a2lwSXYuSVYzMiA9ICooUFVMT05HKShwVFNDICsgMik7Ci0JTmRpc01vdmVNZW1vcnkoJnRraXBJdi5JVjMyLCAocFRTQyArIDIpLCA0KTsgICAvLyBDb3B5IElWCi0KLQkqcElWMTYgPSB0a2lwSXYuSVYxNi53b3JkOwotCSpwSVYzMiA9IHRraXBJdi5JVjMyOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJSW5pdCBNSUMgVmFsdWUgY2FsY3VsYXRpb24gZnVuY3Rpb24gd2hpY2ggaW5jbHVkZSBzZXQgTUlDIGtleSAmCi0JCWNhbGN1bGF0ZSBmaXJzdCAxNiBieXRlcyAoREEgKyBTQSArIHByaW9yaXR5ICsgIDApCi0KLQlBcmd1bWVudHM6Ci0gICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcFRLZXkgICAgICAgUG9pbnRlciB0byB0aGUgVGVtcG9yYWwgS2V5IChUSyksIFRLIHNoYWxsIGJlIDEyOGJpdHMuCi0JCXBEQQkJCVBvaW50ZXIgdG8gREEgYWRkcmVzcwotCQlwU0EJCQlQb2ludGVyIHRvIFNBIGFkZHJlc3MKLQkJcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5Ci0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBJbml0TUlDRW5naW5lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBLZXksCi0JSU4JUFVDSEFSCQkJcERBLAotCUlOCVBVQ0hBUgkJCXBTQSwKLQlJTiAgVUNIQVIgICAgICAgICAgIFVzZXJQcmlvcml0eSwKLQlJTglQVUNIQVIJCQlwTUlDS2V5KQotewotCVVMT05HIFByaW9yaXR5ID0gVXNlclByaW9yaXR5OwotCi0JLy8gSW5pdCBNSUMgdmFsdWUgY2FsY3VsYXRpb24KLQlSVE1QVGtpcFNldE1JQ0tleSgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcE1JQ0tleSk7Ci0JLy8gREEKLQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcERBLCBNQUNfQUREUl9MRU4pOwotCS8vIFNBCi0JUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBTQSwgTUFDX0FERFJfTEVOKTsKLQkvLyBQcmlvcml0eSArIDMgYnl0ZXMgb2YgMAotCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCAoUFVDSEFSKSZQcmlvcml0eSwgNCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlDb21wYXJlIE1JQyB2YWx1ZSBvZiByZWNlaXZlZCBNU0RVCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHJlY2VpdmVkIFBsYWluIHRleHQgZGF0YQotCQlwREEJCQlQb2ludGVyIHRvIERBIGFkZHJlc3MKLQkJcFNBCQkJUG9pbnRlciB0byBTQSBhZGRyZXNzCi0JCXBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQotCQlMZW4gICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSByZWNlaXZlZCBwbGFpbiB0ZXh0IGRhdGEgZXhjbHVkZSBNSUMgdmFsdWUKLQotCVJldHVybiBWYWx1ZToKLQkJVFJVRSAgICAgICAgTUlDIHZhbHVlIG1hdGNoZWQKLQkJRkFMU0UgICAgICAgTUlDIHZhbHVlIG1pc21hdGNoZWQKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4JUlRNUFRraXBDb21wYXJlTUlDVmFsdWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcFNyYywKLQlJTglQVUNIQVIJCQlwREEsCi0JSU4JUFVDSEFSCQkJcFNBLAotCUlOCVBVQ0hBUgkJCXBNSUNLZXksCi0JSU4JVUNIQVIJCQlVc2VyUHJpb3JpdHksCi0JSU4JVUlOVAkJCUxlbikKLXsKLQlVQ0hBUglPbGRNaWNbOF07Ci0JVUxPTkcJUHJpb3JpdHkgPSBVc2VyUHJpb3JpdHk7Ci0KLQkvLyBJbml0IE1JQyB2YWx1ZSBjYWxjdWxhdGlvbgotCVJUTVBUa2lwU2V0TUlDS2V5KCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwTUlDS2V5KTsKLQkvLyBEQQotCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwREEsIE1BQ19BRERSX0xFTik7Ci0JLy8gU0EKLQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcFNBLCBNQUNfQUREUl9MRU4pOwotCS8vIFByaW9yaXR5ICsgMyBieXRlcyBvZiAwCi0JUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIChQVUNIQVIpJlByaW9yaXR5LCA0KTsKLQotCS8vIENhbGN1bGF0ZSBNSUMgdmFsdWUgZnJvbSBwbGFpbiB0ZXh0IGRhdGEKLQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcFNyYywgTGVuKTsKLQotCS8vIEdldCBNSUMgdmFsdWRlIGZyb20gcmVjZWl2ZWQgZnJhbWUKLQlOZGlzTW92ZU1lbW9yeShPbGRNaWMsIHBTcmMgKyBMZW4sIDgpOwotCi0JLy8gR2V0IE1JQyB2YWx1ZSBmcm9tIGRlY3J5cHRlZCBwbGFpbiBkYXRhCi0JUlRNUFRraXBHZXRNSUMoJnBBZC0+UHJpdmF0ZUluZm8uUngpOwotCi0JLy8gTW92ZSBNSUMgdmFsdWUgZnJvbSBNU0RVLCB0aGlzIHN0ZXBzIHNob3VsZCBtb3ZlIHRvIGRhdGEgcGF0aC4KLQkvLyBTaW5jZSB0aGUgTUlDIHZhbHVlIG1pZ2h0IGNyb3NzIE1QRFVzLgotCWlmKCFOZGlzRXF1YWxNZW1vcnkocEFkLT5Qcml2YXRlSW5mby5SeC5NSUMsIE9sZE1pYywgOCkpCi0JewotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUlRNUFRraXBDb21wYXJlTUlDVmFsdWUoKTogVEtJUCBNSUMgRXJyb3IgIVxuIikpOyAgLy9NSUMgZXJyb3IuCi0KLQotCQlyZXR1cm4gKEZBTFNFKTsKLQl9Ci0JcmV0dXJuIChUUlVFKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUNvbXBhcmUgTUlDIHZhbHVlIG9mIHJlY2VpdmVkIE1TRFUKLQotCUFyZ3VtZW50czoKLQkJcEFkCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcExMQwkJTExDIGhlYWRlcgotCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSByZWNlaXZlZCBQbGFpbiB0ZXh0IGRhdGEKLQkJcERBCQkJUG9pbnRlciB0byBEQSBhZGRyZXNzCi0JCXBTQQkJCVBvaW50ZXIgdG8gU0EgYWRkcmVzcwotCQlwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKLQkJTGVuICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgcmVjZWl2ZWQgcGxhaW4gdGV4dCBkYXRhIGV4Y2x1ZGUgTUlDIHZhbHVlCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCVRSVUUgICAgICAgIE1JQyB2YWx1ZSBtYXRjaGVkCi0JCUZBTFNFICAgICAgIE1JQyB2YWx1ZSBtaXNtYXRjaGVkCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1CT09MRUFOCVJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlV2l0aExMQygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwTExDLAotCUlOCVBVQ0hBUgkJCXBTcmMsCi0JSU4JUFVDSEFSCQkJcERBLAotCUlOCVBVQ0hBUgkJCXBTQSwKLQlJTglQVUNIQVIJCQlwTUlDS2V5LAotCUlOCVVJTlQJCQlMZW4pCi17Ci0JVUNIQVIJT2xkTWljWzhdOwotCVVMT05HCVByaW9yaXR5ID0gMDsKLQotCS8vIEluaXQgTUlDIHZhbHVlIGNhbGN1bGF0aW9uCi0JUlRNUFRraXBTZXRNSUNLZXkoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBNSUNLZXkpOwotCS8vIERBCi0JUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBEQSwgTUFDX0FERFJfTEVOKTsKLQkvLyBTQQotCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwU0EsIE1BQ19BRERSX0xFTik7Ci0JLy8gUHJpb3JpdHkgKyAzIGJ5dGVzIG9mIDAKLQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgKFBVQ0hBUikmUHJpb3JpdHksIDQpOwotCi0JLy8gU3RhcnQgd2l0aCBMTEMgaGVhZGVyCi0JUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBMTEMsIDgpOwotCi0JLy8gQ2FsY3VsYXRlIE1JQyB2YWx1ZSBmcm9tIHBsYWluIHRleHQgZGF0YQotCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwU3JjLCBMZW4pOwotCi0JLy8gR2V0IE1JQyB2YWx1ZGUgZnJvbSByZWNlaXZlZCBmcmFtZQotCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcFNyYyArIExlbiwgOCk7Ci0KLQkvLyBHZXQgTUlDIHZhbHVlIGZyb20gZGVjcnlwdGVkIHBsYWluIGRhdGEKLQlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5SeCk7Ci0KLQkvLyBNb3ZlIE1JQyB2YWx1ZSBmcm9tIE1TRFUsIHRoaXMgc3RlcHMgc2hvdWxkIG1vdmUgdG8gZGF0YSBwYXRoLgotCS8vIFNpbmNlIHRoZSBNSUMgdmFsdWUgbWlnaHQgY3Jvc3MgTVBEVXMuCi0JaWYoIU5kaXNFcXVhbE1lbW9yeShwQWQtPlByaXZhdGVJbmZvLlJ4Lk1JQywgT2xkTWljLCA4KSkKLQl7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZVdpdGhMTEMoKTogVEtJUCBNSUMgRXJyb3IgIVxuIikpOyAgLy9NSUMgZXJyb3IuCi0KLQotCQlyZXR1cm4gKEZBTFNFKTsKLQl9Ci0JcmV0dXJuIChUUlVFKTsKLX0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlDb3B5IGZyYW1lIGZyb20gd2FpdGluZyBxdWV1ZSBpbnRvIHJlbGF0aXZlIHJpbmcgYnVmZmVyIGFuZCBzZXQKLQlhcHByb3ByaWF0ZSBBU0lDIHJlZ2lzdGVyIHRvIGtpY2sgaGFyZHdhcmUgdHJhbnNtaXQgZnVuY3Rpb24KLQotCUFyZ3VtZW50czoKLQkJcEFkCQlQb2ludGVyCXRvIG91ciBhZGFwdGVyCi0JCVBORElTX1BBQ0tFVAlQb2ludGVyIHRvIE5kaXMgUGFja2V0IGZvciBNSUMgY2FsY3VsYXRpb24KLQkJcEVuY2FwCQkJUG9pbnRlciB0byBMTEMgZW5jYXAgZGF0YQotCQlMZW5FbmNhcAkJVG90YWwgZW5jYXAgbGVuZ3RoLCBtaWdodCBiZSAwIHdoaWNoIGluZGljYXRlcyBubyBlbmNhcAotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBDYWxjdWxhdGVNSUNWYWx1ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKLQlJTglQVUNIQVIJCQlwRW5jYXAsCi0JSU4JUENJUEhFUl9LRVkJCXBLZXksCi0JSU4JVUNIQVIJCQlhcGlkeCkKLXsKLQlQQUNLRVRfSU5GTwkJUGFja2V0SW5mbzsKLQlQVUNIQVIJCQlwU3JjQnVmVkE7Ci0JVUlOVAkJCVNyY0J1ZkxlbjsKLQlQVUNIQVIJCQlwU3JjOwotICAgIFVDSEFSICAgICAgICAgICBVc2VyUHJpb3JpdHk7Ci0JVUNIQVIJCQl2bGFuX29mZnNldCA9IDA7Ci0KLQlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7Ci0KLQlVc2VyUHJpb3JpdHkgPSBSVE1QX0dFVF9QQUNLRVRfVVAocFBhY2tldCk7Ci0JcFNyYyA9IHBTcmNCdWZWQTsKLQotCS8vIGRldGVybWluZSBpZiB0aGlzIGlzIGEgdmxhbiBwYWNrZXQKLQlpZiAoKCgqKHBTcmMgKyAxMikgPDwgOCkgKyAqKHBTcmMgKyAxMykpID09IDB4ODEwMCkKLQkJdmxhbl9vZmZzZXQgPSA0OwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JewotCQlSVE1QSW5pdE1JQ0VuZ2luZSgKLQkJCXBBZCwKLQkJCXBLZXktPktleSwKLQkJCXBTcmMsCi0JCQlwU3JjICsgNiwKLQkJCVVzZXJQcmlvcml0eSwKLQkJCXBLZXktPlR4TWljKTsKLQl9Ci0KLQotCWlmIChwRW5jYXAgIT0gTlVMTCkKLQl7Ci0JCS8vIExMQyBlbmNhcHN1bGF0aW9uCi0JCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwRW5jYXAsIDYpOwotCQkvLyBQcm90b2NvbCBUeXBlCi0JCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwU3JjICsgMTIgKyB2bGFuX29mZnNldCwgMik7Ci0JfQotCVNyY0J1ZkxlbiAtPSAoMTQgKyB2bGFuX29mZnNldCk7Ci0JcFNyYyArPSAoMTQgKyB2bGFuX29mZnNldCk7Ci0JZG8KLQl7Ci0JCWlmIChTcmNCdWZMZW4gPiAwKQotCQl7Ci0JCQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcFNyYywgU3JjQnVmTGVuKTsKLQkJfQotCi0JCWJyZWFrOwkvLyBObyBuZWVkIGhhbmRsZSBuZXh0IHBhY2tldAotCi0JfQl3aGlsZSAoVFJVRSk7CQkvLyBFbmQgb2YgY29weWluZyBwYXlsb2FkCi0KLQkvLyBDb21wdXRlIHRoZSBmaW5hbCBNSUMgVmFsdWUKLQlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5UeCk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIHRraXBfc2JveCgpCQkJCQkJCQkJCQkJCQkJCSovCi0vKiBSZXR1cm5zIGEgMTYgYml0IHZhbHVlIGZyb20gYSA2NEsgZW50cnkgdGFibGUuIFRoZSBUYWJsZSAqLwotLyogaXMgc3ludGhlc2l6ZWQgZnJvbSB0d28gMjU2IGVudHJ5IGJ5dGUgd2lkZSB0YWJsZXMuCQkqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotVUlOVCB0a2lwX3Nib3goVUlOVCBpbmRleCkKLXsKLQlVSU5UIGluZGV4X2xvdzsKLQlVSU5UIGluZGV4X2hpZ2g7Ci0JVUlOVCBsZWZ0LCByaWdodDsKLQotCWluZGV4X2xvdyA9IChpbmRleCAlIDI1Nik7Ci0JaW5kZXhfaGlnaCA9ICgoaW5kZXggPj4gOCkgJSAyNTYpOwotCi0JbGVmdCA9IFRraXBfU2JveF9Mb3dlcltpbmRleF9sb3ddICsgKFRraXBfU2JveF9VcHBlcltpbmRleF9sb3ddICogMjU2KTsKLQlyaWdodCA9IFRraXBfU2JveF9VcHBlcltpbmRleF9oaWdoXSArIChUa2lwX1Nib3hfTG93ZXJbaW5kZXhfaGlnaF0gKiAyNTYpOwotCi0JcmV0dXJuIChsZWZ0IF4gcmlnaHQpOwotfQotCi1VSU5UIHJvdHIxKFVJTlQgYSkKLXsKLQl1bnNpZ25lZCBpbnQgYjsKLQotCWlmICgoYSAmIDB4MDEpID09IDB4MDEpCi0JewotCQliID0gKGEgPj4gMSkgfCAweDgwMDA7Ci0JfQotCWVsc2UKLQl7Ci0JCWIgPSAoYSA+PiAxKSAmIDB4N2ZmZjsKLQl9Ci0JYiA9IGIgJSA2NTUzNjsKLQlyZXR1cm4gYjsKLX0KLQotVk9JRCBSVE1QVGtpcE1peEtleSgKLQlVQ0hBUiAqa2V5LAotCVVDSEFSICp0YSwKLQlVTE9ORyBwbmwsIC8qIExlYXN0IHNpZ25pZmljYW50IDE2IGJpdHMgb2YgUE4gKi8KLQlVTE9ORyBwbmgsIC8qIE1vc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyBvZiBQTiAqLwotCVVDSEFSICpyYzRrZXksCi0JVUlOVCAqcDFrKQotewotCi0JVUlOVCB0c2MwOwotCVVJTlQgdHNjMTsKLQlVSU5UIHRzYzI7Ci0KLQlVSU5UIHBwazA7Ci0JVUlOVCBwcGsxOwotCVVJTlQgcHBrMjsKLQlVSU5UIHBwazM7Ci0JVUlOVCBwcGs0OwotCVVJTlQgcHBrNTsKLQotCUlOVCBpOwotCUlOVCBqOwotCi0JdHNjMCA9ICh1bnNpZ25lZCBpbnQpKChwbmggPj4gMTYpICUgNjU1MzYpOyAvKiBtc2IgKi8KLQl0c2MxID0gKHVuc2lnbmVkIGludCkocG5oICUgNjU1MzYpOwotCXRzYzIgPSAodW5zaWduZWQgaW50KShwbmwgJSA2NTUzNik7IC8qIGxzYiAqLwotCi0JLyogUGhhc2UgMSwgc3RlcCAxICovCi0JcDFrWzBdID0gdHNjMTsKLQlwMWtbMV0gPSB0c2MwOwotCXAxa1syXSA9IChVSU5UKSh0YVswXSArICh0YVsxXSoyNTYpKTsKLQlwMWtbM10gPSAoVUlOVCkodGFbMl0gKyAodGFbM10qMjU2KSk7Ci0JcDFrWzRdID0gKFVJTlQpKHRhWzRdICsgKHRhWzVdKjI1NikpOwotCi0JLyogUGhhc2UgMSwgc3RlcCAyICovCi0JZm9yIChpPTA7IGk8ODsgaSsrKQotCXsKLQkJaiA9IDIqKGkgJiAxKTsKLQkJcDFrWzBdID0gKHAxa1swXSArIHRraXBfc2JveCggKHAxa1s0XSBeICgoMjU2KmtleVsxK2pdKSArIGtleVtqXSkpICUgNjU1MzYgKSkgJSA2NTUzNjsKLQkJcDFrWzFdID0gKHAxa1sxXSArIHRraXBfc2JveCggKHAxa1swXSBeICgoMjU2KmtleVs1K2pdKSArIGtleVs0K2pdKSkgJSA2NTUzNiApKSAlIDY1NTM2OwotCQlwMWtbMl0gPSAocDFrWzJdICsgdGtpcF9zYm94KCAocDFrWzFdIF4gKCgyNTYqa2V5Wzkral0pICsga2V5Wzgral0pKSAlIDY1NTM2ICkpICUgNjU1MzY7Ci0JCXAxa1szXSA9IChwMWtbM10gKyB0a2lwX3Nib3goIChwMWtbMl0gXiAoKDI1NiprZXlbMTMral0pICsga2V5WzEyK2pdKSkgJSA2NTUzNiApKSAlIDY1NTM2OwotCQlwMWtbNF0gPSAocDFrWzRdICsgdGtpcF9zYm94KCAocDFrWzNdIF4gKCgoMjU2KmtleVsxK2pdKSArIGtleVtqXSkpKSAlIDY1NTM2ICkpICUgNjU1MzY7Ci0JCXAxa1s0XSA9IChwMWtbNF0gKyBpKSAlIDY1NTM2OwotCX0KLQotCS8qIFBoYXNlIDIsIFN0ZXAgMSAqLwotCXBwazAgPSBwMWtbMF07Ci0JcHBrMSA9IHAxa1sxXTsKLQlwcGsyID0gcDFrWzJdOwotCXBwazMgPSBwMWtbM107Ci0JcHBrNCA9IHAxa1s0XTsKLQlwcGs1ID0gKHAxa1s0XSArIHRzYzIpICUgNjU1MzY7Ci0KLQkvKiBQaGFzZTIsIFN0ZXAgMiAqLwotCXBwazAgPSBwcGswICsgdGtpcF9zYm94KCAocHBrNSBeICgoMjU2KmtleVsxXSkgKyBrZXlbMF0pKSAlIDY1NTM2KTsKLQlwcGsxID0gcHBrMSArIHRraXBfc2JveCggKHBwazAgXiAoKDI1NiprZXlbM10pICsga2V5WzJdKSkgJSA2NTUzNik7Ci0JcHBrMiA9IHBwazIgKyB0a2lwX3Nib3goIChwcGsxIF4gKCgyNTYqa2V5WzVdKSArIGtleVs0XSkpICUgNjU1MzYpOwotCXBwazMgPSBwcGszICsgdGtpcF9zYm94KCAocHBrMiBeICgoMjU2KmtleVs3XSkgKyBrZXlbNl0pKSAlIDY1NTM2KTsKLQlwcGs0ID0gcHBrNCArIHRraXBfc2JveCggKHBwazMgXiAoKDI1NiprZXlbOV0pICsga2V5WzhdKSkgJSA2NTUzNik7Ci0JcHBrNSA9IHBwazUgKyB0a2lwX3Nib3goIChwcGs0IF4gKCgyNTYqa2V5WzExXSkgKyBrZXlbMTBdKSkgJSA2NTUzNik7Ci0KLQlwcGswID0gcHBrMCArIHJvdHIxKHBwazUgXiAoKDI1NiprZXlbMTNdKSArIGtleVsxMl0pKTsKLQlwcGsxID0gcHBrMSArIHJvdHIxKHBwazAgXiAoKDI1NiprZXlbMTVdKSArIGtleVsxNF0pKTsKLQlwcGsyID0gcHBrMiArIHJvdHIxKHBwazEpOwotCXBwazMgPSBwcGszICsgcm90cjEocHBrMik7Ci0JcHBrNCA9IHBwazQgKyByb3RyMShwcGszKTsKLQlwcGs1ID0gcHBrNSArIHJvdHIxKHBwazQpOwotCi0JLyogUGhhc2UgMiwgU3RlcCAzICovCi0gICAgLyogUGhhc2UgMiwgU3RlcCAzICovCi0KLQl0c2MwID0gKHVuc2lnbmVkIGludCkoKHBuaCA+PiAxNikgJSA2NTUzNik7IC8qIG1zYiAqLwotCXRzYzEgPSAodW5zaWduZWQgaW50KShwbmggJSA2NTUzNik7Ci0JdHNjMiA9ICh1bnNpZ25lZCBpbnQpKHBubCAlIDY1NTM2KTsgLyogbHNiICovCi0KLQlyYzRrZXlbMF0gPSAodHNjMiA+PiA4KSAlIDI1NjsKLQlyYzRrZXlbMV0gPSAoKCh0c2MyID4+IDgpICUgMjU2KSB8IDB4MjApICYgMHg3ZjsKLQlyYzRrZXlbMl0gPSB0c2MyICUgMjU2OwotCXJjNGtleVszXSA9ICgocHBrNSBeICgoMjU2KmtleVsxXSkgKyBrZXlbMF0pKSA+PiAxKSAlIDI1NjsKLQotCXJjNGtleVs0XSA9IHBwazAgJSAyNTY7Ci0JcmM0a2V5WzVdID0gKHBwazAgPj4gOCkgJSAyNTY7Ci0KLQlyYzRrZXlbNl0gPSBwcGsxICUgMjU2OwotCXJjNGtleVs3XSA9IChwcGsxID4+IDgpICUgMjU2OwotCi0JcmM0a2V5WzhdID0gcHBrMiAlIDI1NjsKLQlyYzRrZXlbOV0gPSAocHBrMiA+PiA4KSAlIDI1NjsKLQotCXJjNGtleVsxMF0gPSBwcGszICUgMjU2OwotCXJjNGtleVsxMV0gPSAocHBrMyA+PiA4KSAlIDI1NjsKLQotCXJjNGtleVsxMl0gPSBwcGs0ICUgMjU2OwotCXJjNGtleVsxM10gPSAocHBrNCA+PiA4KSAlIDI1NjsKLQotCXJjNGtleVsxNF0gPSBwcGs1ICUgMjU2OwotCXJjNGtleVsxNV0gPSAocHBrNSA+PiA4KSAlIDI1NjsKLX0KLQotCi0vLwotLy8gVFJVRTogU3VjY2VzcyEKLS8vIEZBTFNFOiBEZWNyeXB0IEVycm9yIQotLy8KLUJPT0xFQU4gUlRNUFNvZnREZWNyeXB0VEtJUCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIJcERhdGEsCi0JSU4gVUxPTkcJRGF0YUJ5dGVDbnQsCi0JSU4gVUNIQVIgICAgVXNlclByaW9yaXR5LAotCUlOIFBDSVBIRVJfS0VZCXBXcGFLZXkpCi17Ci0JVUNIQVIJCQlLZXlJRDsKLQlVSU5UCQkJSGVhZGVyTGVuOwotICAgIFVDSEFSCQkJZmMwOwotCVVDSEFSCQkJZmMxOwotCVVTSE9SVAkJCWZjOwotCVVJTlQJCQlmcmFtZV90eXBlOwotCVVJTlQJCQlmcmFtZV9zdWJ0eXBlOwotICAgIFVJTlQJCQlmcm9tX2RzOwotICAgIFVJTlQJCQl0b19kczsKLQlJTlQJCQkJYTRfZXhpc3RzOwotCUlOVAkJCQlxY19leGlzdHM7Ci0JVVNIT1JUCQkJZHVyYXRpb247Ci0JVVNIT1JUCQkJc2VxX2NvbnRyb2w7Ci0JVVNIT1JUCQkJcW9zX2NvbnRyb2w7Ci0JVUNIQVIJCQlUQVtNQUNfQUREUl9MRU5dOwotCVVDSEFSCQkJREFbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUgkJCVNBW01BQ19BRERSX0xFTl07Ci0JVUNIQVIJCQlSQzRLZXlbMTZdOwotCVVJTlQJCQlwMWtbNV07IC8vZm9yIG1peF9rZXk7Ci0JVUxPTkcJCQlwbmw7LyogTGVhc3Qgc2lnbmlmaWNhbnQgMTYgYml0cyBvZiBQTiAqLwotCVVMT05HCQkJcG5oOy8qIE1vc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyBvZiBQTiAqLwotCVVJTlQJCQludW1fYmxvY2tzOwotCVVJTlQJCQlwYXlsb2FkX3JlbWFpbmRlcjsKLQlBUkNGT1VSQ09OVEVYVAlBcmNGb3VyQ29udGV4dDsKLQlVSU5UCQkJY3JjMzIgPSAwOwotCVVJTlQJCQl0cmFpbGZjcyA9IDA7Ci0JVUNIQVIJCQlNSUNbOF07Ci0JVUNIQVIJCQlUcmFpbE1JQ1s4XTsKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBEYXRhLCBESVJfUkVBRCwgRkFMU0UpOwotI2VuZGlmCi0KLQlmYzAgPSAqcERhdGE7Ci0JZmMxID0gKihwRGF0YSArIDEpOwotCi0JZmMgPSAqKChQVVNIT1JUKXBEYXRhKTsKLQotCWZyYW1lX3R5cGUgPSAoKGZjMCA+PiAyKSAmIDB4MDMpOwotCWZyYW1lX3N1YnR5cGUgPSAoKGZjMCA+PiA0KSAmIDB4MGYpOwotCi0gICAgZnJvbV9kcyA9IChmYzEgJiAweDIpID4+IDE7Ci0gICAgdG9fZHMgPSAoZmMxICYgMHgxKTsKLQotICAgIGE0X2V4aXN0cyA9IChmcm9tX2RzICYgdG9fZHMpOwotICAgIHFjX2V4aXN0cyA9ICgoZnJhbWVfc3VidHlwZSA9PSAweDA4KSB8fCAgICAvKiBBc3N1bWVkIFFvUyBzdWJ0eXBlcyAqLwotICAgICAgICAgICAgICAgICAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwOSkgfHwgICAvKiBMaWtlbHkgdG8gY2hhbmdlLiAgICAqLwotICAgICAgICAgICAgICAgICAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwYSkgfHwKLSAgICAgICAgICAgICAgICAgIChmcmFtZV9zdWJ0eXBlID09IDB4MGIpCi0gICAgICAgICAgICAgICAgICk7Ci0KLQlIZWFkZXJMZW4gPSAyNDsKLQlpZiAoYTRfZXhpc3RzKQotCQlIZWFkZXJMZW4gKz0gNjsKLQotCUtleUlEID0gKigoUFVDSEFSKShwRGF0YSsgSGVhZGVyTGVuICsgMykpOwotCUtleUlEID0gS2V5SUQgPj4gNjsKLQotCWlmIChwV3BhS2V5W0tleUlEXS5LZXlMZW4gPT0gMCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTb2Z0RGVjcnlwdFRLSVAgZmFpbGVkIShLZXlJRFslZF0gTGVuZ3RoIGNhbiBub3QgYmUgMClcbiIsIEtleUlEKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlkdXJhdGlvbiA9ICooKFBVU0hPUlQpKHBEYXRhKzIpKTsKLQotCXNlcV9jb250cm9sID0gKigoUFVTSE9SVCkocERhdGErMjIpKTsKLQotCWlmIChxY19leGlzdHMpCi0JewotCQlpZiAoYTRfZXhpc3RzKQotCQl7Ci0JCQlxb3NfY29udHJvbCA9ICooKFBVU0hPUlQpKHBEYXRhKzMwKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlxb3NfY29udHJvbCA9ICooKFBVU0hPUlQpKHBEYXRhKzI0KSk7Ci0JCX0KLQl9Ci0KLQlpZiAodG9fZHMgPT0gMCAmJiBmcm9tX2RzID09IDEpCi0JewotCQlOZGlzTW92ZU1lbW9yeShEQSwgcERhdGErNCwgTUFDX0FERFJfTEVOKTsKLQkJTmRpc01vdmVNZW1vcnkoU0EsIHBEYXRhKzE2LCBNQUNfQUREUl9MRU4pOwotCQlOZGlzTW92ZU1lbW9yeShUQSwgcERhdGErMTAsIE1BQ19BRERSX0xFTik7ICAvL0JTU0lECi0JfQotCWVsc2UgaWYgKHRvX2RzID09IDAgJiYgZnJvbV9kcyA9PSAwICkKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKLQkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhKzQsIE1BQ19BRERSX0xFTik7Ci0JCU5kaXNNb3ZlTWVtb3J5KFNBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKLQl9Ci0JZWxzZSBpZiAodG9fZHMgPT0gMSAmJiBmcm9tX2RzID09IDApCi0JewotCQlOZGlzTW92ZU1lbW9yeShTQSwgcERhdGErMTAsIE1BQ19BRERSX0xFTik7Ci0JCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKLQkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhKzE2LCBNQUNfQUREUl9MRU4pOwotCX0KLQllbHNlIGlmICh0b19kcyA9PSAxICYmIGZyb21fZHMgPT0gMSkKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKLQkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhKzE2LCBNQUNfQUREUl9MRU4pOwotCQlOZGlzTW92ZU1lbW9yeShTQSwgcERhdGErMjIsIE1BQ19BRERSX0xFTik7Ci0JfQotCi0JbnVtX2Jsb2NrcyA9IChEYXRhQnl0ZUNudCAtIDE2KSAvIDE2OwotCXBheWxvYWRfcmVtYWluZGVyID0gKERhdGFCeXRlQ250IC0gMTYpICUgMTY7Ci0KLQlwbmwgPSAoKihwRGF0YSArIEhlYWRlckxlbikpICogMjU2ICsgKihwRGF0YSArIEhlYWRlckxlbiArIDIpOwotCXBuaCA9ICooKFBVTE9ORykocERhdGEgKyBIZWFkZXJMZW4gKyA0KSk7Ci0JcG5oID0gY3B1MmxlMzIocG5oKTsKLQlSVE1QVGtpcE1peEtleShwV3BhS2V5W0tleUlEXS5LZXksIFRBLCBwbmwsIHBuaCwgUkM0S2V5LCBwMWspOwotCi0JQVJDRk9VUl9JTklUKCZBcmNGb3VyQ29udGV4dCwgUkM0S2V5LCAxNik7Ci0KLQlBUkNGT1VSX0RFQ1JZUFQoJkFyY0ZvdXJDb250ZXh0LCBwRGF0YSArIEhlYWRlckxlbiwgcERhdGEgKyBIZWFkZXJMZW4gKyA4LCBEYXRhQnl0ZUNudCAtIEhlYWRlckxlbiAtIDgpOwotCU5kaXNNb3ZlTWVtb3J5KCZ0cmFpbGZjcywgcERhdGEgKyBEYXRhQnl0ZUNudCAtIDggLSA0LCA0KTsKLQljcmMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihQUFBJTklURkNTMzIsIHBEYXRhICsgSGVhZGVyTGVuLCBEYXRhQnl0ZUNudCAtIEhlYWRlckxlbiAtIDggLSA0KTsgIC8vU2tpcCBJVitFSVYgOCBieXRlcyAmIFNraXAgbGFzdCA0IGJ5dGVzKEZDUykuCi0JY3JjMzIgXj0gMHhmZmZmZmZmZjsgICAgICAgICAgICAgLyogY29tcGxlbWVudCAqLwotCi0gICAgaWYoY3JjMzIgIT0gY3B1MmxlMzIodHJhaWxmY3MpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNvZnREZWNyeXB0VEtJUCwgV0VQIERhdGEgSUNWIEVycm9yICFcbiIpKTsJIC8vSUNWIGVycm9yLgotCi0JCXJldHVybiAoRkFMU0UpOwotCX0KLQotCU5kaXNNb3ZlTWVtb3J5KFRyYWlsTUlDLCBwRGF0YSArIERhdGFCeXRlQ250IC0gOCAtIDggLSA0LCA4KTsKLQlSVE1QSW5pdE1JQ0VuZ2luZShwQWQsIHBXcGFLZXlbS2V5SURdLktleSwgREEsIFNBLCBVc2VyUHJpb3JpdHksIHBXcGFLZXlbS2V5SURdLlJ4TWljKTsKLQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcERhdGEgKyBIZWFkZXJMZW4sIERhdGFCeXRlQ250IC0gSGVhZGVyTGVuIC0gOCAtIDEyKTsKLQlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5UeCk7Ci0JTmRpc01vdmVNZW1vcnkoTUlDLCBwQWQtPlByaXZhdGVJbmZvLlR4Lk1JQywgOCk7Ci0KLQlpZiAoIU5kaXNFcXVhbE1lbW9yeShNSUMsIFRyYWlsTUlDLCA4KSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTb2Z0RGVjcnlwdFRLSVAsIFdFUCBEYXRhIE1JQyBFcnJvciAhXG4iKSk7CSAvL01JQyBlcnJvci4KLQkJLy9SVE1QUmVwb3J0TWljRXJyb3IocEFkLCAmcFdwYUtleVtLZXlJRF0pOwkvLyBtYXJrZWQgYnkgQWxiZXJ0WSBAIDIwMDYwNjMwCi0JCXJldHVybiAoRkFMU0UpOwotCX0KLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBEYXRhLCBESVJfUkVBRCwgRkFMU0UpOwotI2VuZGlmCi0JLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwgIlJUTVBTb2Z0RGVjcnlwdFRLSVAgRGVjcmlwdCBkb25lISFcbiIpOwotCXJldHVybiBUUlVFOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX3dlcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX3dlcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGRkZmIyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV93ZXAuYworKysgL2Rldi9udWxsCkBAIC0xLDUwMCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXJ0bXBfd2VwLmMKLQotCUFic3RyYWN0OgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCQlXaGVuCQkJV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlQYXVsIFd1CQkxMC0yOC0wMgkJSW5pdGlhbAotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLVVJTlQgRkNTVEFCXzMyWzI1Nl0gPQotewotCTB4MDAwMDAwMDAsIDB4NzcwNzMwOTYsIDB4ZWUwZTYxMmMsIDB4OTkwOTUxYmEsCi0JMHgwNzZkYzQxOSwgMHg3MDZhZjQ4ZiwgMHhlOTYzYTUzNSwgMHg5ZTY0OTVhMywKLQkweDBlZGI4ODMyLCAweDc5ZGNiOGE0LCAweGUwZDVlOTFlLCAweDk3ZDJkOTg4LAotCTB4MDliNjRjMmIsIDB4N2ViMTdjYmQsIDB4ZTdiODJkMDcsIDB4OTBiZjFkOTEsCi0JMHgxZGI3MTA2NCwgMHg2YWIwMjBmMiwgMHhmM2I5NzE0OCwgMHg4NGJlNDFkZSwKLQkweDFhZGFkNDdkLCAweDZkZGRlNGViLCAweGY0ZDRiNTUxLCAweDgzZDM4NWM3LAotCTB4MTM2Yzk4NTYsIDB4NjQ2YmE4YzAsIDB4ZmQ2MmY5N2EsIDB4OGE2NWM5ZWMsCi0JMHgxNDAxNWM0ZiwgMHg2MzA2NmNkOSwgMHhmYTBmM2Q2MywgMHg4ZDA4MGRmNSwKLQkweDNiNmUyMGM4LCAweDRjNjkxMDVlLCAweGQ1NjA0MWU0LCAweGEyNjc3MTcyLAotCTB4M2MwM2U0ZDEsIDB4NGIwNGQ0NDcsIDB4ZDIwZDg1ZmQsIDB4YTUwYWI1NmIsCi0JMHgzNWI1YThmYSwgMHg0MmIyOTg2YywgMHhkYmJiYzlkNiwgMHhhY2JjZjk0MCwKLQkweDMyZDg2Y2UzLCAweDQ1ZGY1Yzc1LCAweGRjZDYwZGNmLCAweGFiZDEzZDU5LAotCTB4MjZkOTMwYWMsIDB4NTFkZTAwM2EsIDB4YzhkNzUxODAsIDB4YmZkMDYxMTYsCi0JMHgyMWI0ZjRiNSwgMHg1NmIzYzQyMywgMHhjZmJhOTU5OSwgMHhiOGJkYTUwZiwKLQkweDI4MDJiODllLCAweDVmMDU4ODA4LCAweGM2MGNkOWIyLCAweGIxMGJlOTI0LAotCTB4MmY2ZjdjODcsIDB4NTg2ODRjMTEsIDB4YzE2MTFkYWIsIDB4YjY2NjJkM2QsCi0JMHg3NmRjNDE5MCwgMHgwMWRiNzEwNiwgMHg5OGQyMjBiYywgMHhlZmQ1MTAyYSwKLQkweDcxYjE4NTg5LCAweDA2YjZiNTFmLCAweDlmYmZlNGE1LCAweGU4YjhkNDMzLAotCTB4NzgwN2M5YTIsIDB4MGYwMGY5MzQsIDB4OTYwOWE4OGUsIDB4ZTEwZTk4MTgsCi0JMHg3ZjZhMGRiYiwgMHgwODZkM2QyZCwgMHg5MTY0NmM5NywgMHhlNjYzNWMwMSwKLQkweDZiNmI1MWY0LCAweDFjNmM2MTYyLCAweDg1NjUzMGQ4LCAweGYyNjIwMDRlLAotCTB4NmMwNjk1ZWQsIDB4MWIwMWE1N2IsIDB4ODIwOGY0YzEsIDB4ZjUwZmM0NTcsCi0JMHg2NWIwZDljNiwgMHgxMmI3ZTk1MCwgMHg4YmJlYjhlYSwgMHhmY2I5ODg3YywKLQkweDYyZGQxZGRmLCAweDE1ZGEyZDQ5LCAweDhjZDM3Y2YzLCAweGZiZDQ0YzY1LAotCTB4NGRiMjYxNTgsIDB4M2FiNTUxY2UsIDB4YTNiYzAwNzQsIDB4ZDRiYjMwZTIsCi0JMHg0YWRmYTU0MSwgMHgzZGQ4OTVkNywgMHhhNGQxYzQ2ZCwgMHhkM2Q2ZjRmYiwKLQkweDQzNjllOTZhLCAweDM0NmVkOWZjLCAweGFkNjc4ODQ2LCAweGRhNjBiOGQwLAotCTB4NDQwNDJkNzMsIDB4MzMwMzFkZTUsIDB4YWEwYTRjNWYsIDB4ZGQwZDdjYzksCi0JMHg1MDA1NzEzYywgMHgyNzAyNDFhYSwgMHhiZTBiMTAxMCwgMHhjOTBjMjA4NiwKLQkweDU3NjhiNTI1LCAweDIwNmY4NWIzLCAweGI5NjZkNDA5LCAweGNlNjFlNDlmLAotCTB4NWVkZWY5MGUsIDB4MjlkOWM5OTgsIDB4YjBkMDk4MjIsIDB4YzdkN2E4YjQsCi0JMHg1OWIzM2QxNywgMHgyZWI0MGQ4MSwgMHhiN2JkNWMzYiwgMHhjMGJhNmNhZCwKLQkweGVkYjg4MzIwLCAweDlhYmZiM2I2LCAweDAzYjZlMjBjLCAweDc0YjFkMjlhLAotCTB4ZWFkNTQ3MzksIDB4OWRkMjc3YWYsIDB4MDRkYjI2MTUsIDB4NzNkYzE2ODMsCi0JMHhlMzYzMGIxMiwgMHg5NDY0M2I4NCwgMHgwZDZkNmEzZSwgMHg3YTZhNWFhOCwKLQkweGU0MGVjZjBiLCAweDkzMDlmZjlkLCAweDBhMDBhZTI3LCAweDdkMDc5ZWIxLAotCTB4ZjAwZjkzNDQsIDB4ODcwOGEzZDIsIDB4MWUwMWYyNjgsIDB4NjkwNmMyZmUsCi0JMHhmNzYyNTc1ZCwgMHg4MDY1NjdjYiwgMHgxOTZjMzY3MSwgMHg2ZTZiMDZlNywKLQkweGZlZDQxYjc2LCAweDg5ZDMyYmUwLCAweDEwZGE3YTVhLCAweDY3ZGQ0YWNjLAotCTB4ZjliOWRmNmYsIDB4OGViZWVmZjksIDB4MTdiN2JlNDMsIDB4NjBiMDhlZDUsCi0JMHhkNmQ2YTNlOCwgMHhhMWQxOTM3ZSwgMHgzOGQ4YzJjNCwgMHg0ZmRmZjI1MiwKLQkweGQxYmI2N2YxLCAweGE2YmM1NzY3LCAweDNmYjUwNmRkLCAweDQ4YjIzNjRiLAotCTB4ZDgwZDJiZGEsIDB4YWYwYTFiNGMsIDB4MzYwMzRhZjYsIDB4NDEwNDdhNjAsCi0JMHhkZjYwZWZjMywgMHhhODY3ZGY1NSwgMHgzMTZlOGVlZiwgMHg0NjY5YmU3OSwKLQkweGNiNjFiMzhjLCAweGJjNjY4MzFhLCAweDI1NmZkMmEwLCAweDUyNjhlMjM2LAotCTB4Y2MwYzc3OTUsIDB4YmIwYjQ3MDMsIDB4MjIwMjE2YjksIDB4NTUwNTI2MmYsCi0JMHhjNWJhM2JiZSwgMHhiMmJkMGIyOCwgMHgyYmI0NWE5MiwgMHg1Y2IzNmEwNCwKLQkweGMyZDdmZmE3LCAweGI1ZDBjZjMxLCAweDJjZDk5ZThiLCAweDViZGVhZTFkLAotCTB4OWI2NGMyYjAsIDB4ZWM2M2YyMjYsIDB4NzU2YWEzOWMsIDB4MDI2ZDkzMGEsCi0JMHg5YzA5MDZhOSwgMHhlYjBlMzYzZiwgMHg3MjA3Njc4NSwgMHgwNTAwNTcxMywKLQkweDk1YmY0YTgyLCAweGUyYjg3YTE0LCAweDdiYjEyYmFlLCAweDBjYjYxYjM4LAotCTB4OTJkMjhlOWIsIDB4ZTVkNWJlMGQsIDB4N2NkY2VmYjcsIDB4MGJkYmRmMjEsCi0JMHg4NmQzZDJkNCwgMHhmMWQ0ZTI0MiwgMHg2OGRkYjNmOCwgMHgxZmRhODM2ZSwKLQkweDgxYmUxNmNkLCAweGY2YjkyNjViLCAweDZmYjA3N2UxLCAweDE4Yjc0Nzc3LAotCTB4ODgwODVhZTYsIDB4ZmYwZjZhNzAsIDB4NjYwNjNiY2EsIDB4MTEwMTBiNWMsCi0JMHg4ZjY1OWVmZiwgMHhmODYyYWU2OSwgMHg2MTZiZmZkMywgMHgxNjZjY2Y0NSwKLQkweGEwMGFlMjc4LCAweGQ3MGRkMmVlLCAweDRlMDQ4MzU0LCAweDM5MDNiM2MyLAotCTB4YTc2NzI2NjEsIDB4ZDA2MDE2ZjcsIDB4NDk2OTQ3NGQsIDB4M2U2ZTc3ZGIsCi0JMHhhZWQxNmE0YSwgMHhkOWQ2NWFkYywgMHg0MGRmMGI2NiwgMHgzN2Q4M2JmMCwKLQkweGE5YmNhZTUzLCAweGRlYmI5ZWM1LCAweDQ3YjJjZjdmLCAweDMwYjVmZmU5LAotCTB4YmRiZGYyMWMsIDB4Y2FiYWMyOGEsIDB4NTNiMzkzMzAsIDB4MjRiNGEzYTYsCi0JMHhiYWQwMzYwNSwgMHhjZGQ3MDY5MywgMHg1NGRlNTcyOSwgMHgyM2Q5NjdiZiwKLQkweGIzNjY3YTJlLCAweGM0NjE0YWI4LCAweDVkNjgxYjAyLCAweDJhNmYyYjk0LAotCTB4YjQwYmJlMzcsIDB4YzMwYzhlYTEsIDB4NWEwNWRmMWIsIDB4MmQwMmVmOGQKLX07Ci0KLS8qCi1VQ0hBUiAgIFdFUEtFWVtdID0gewotCQkvL0lWCi0JCTB4MDAsIDB4MTEsIDB4MjIsCi0JCS8vV0VQIEtFWQotCQkweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LCAweDg4LCAweDk5LCAweEFBLCAweEJCLCAweENDCi0JfTsKLSAqLwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJSW5pdCBXRVAgZnVuY3Rpb24uCi0KLQlBcmd1bWVudHM6Ci0gICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcEtleSAgICAgICAgUG9pbnRlciB0byB0aGUgV0VQIEtFWQotCQlLZXlJZAkJICAgV0VQIEtleSBJRAotCQlLZXlMZW4gICAgICB0aGUgbGVuZ3RoIG9mIFdFUCBLRVkKLQkJcERlc3QgICAgICAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gd2hpY2ggRW5jcnlwdGlvbiBkYXRhIHdpbGwgc3RvcmUgaW4uCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUEluaXRXZXBFbmdpbmUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcEtleSwKLQlJTglVQ0hBUgkJCUtleUlkLAotCUlOCVVDSEFSCQkJS2V5TGVuLAotCUlOIE9VVAlQVUNIQVIJCXBEZXN0KQotewotCVVJTlQgaTsKLQlVQ0hBUiAgIFdFUEtFWVtdID0gewotCQkvL0lWCi0JCTB4MDAsIDB4MTEsIDB4MjIsCi0JCS8vV0VQIEtFWQotCQkweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LCAweDg4LCAweDk5LCAweEFBLCAweEJCLCAweENDCi0JfTsKLQotCXBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIgPSBQUFBJTklURkNTMzI7ICAgLy9Jbml0IGNyYzMyLgotCi0gICAgewotCQlOZGlzTW92ZU1lbW9yeShXRVBLRVkgKyAzLCBwS2V5LCBLZXlMZW4pOwotCi0gICAgICAgIGZvcihpID0gMDsgaSA8IDM7IGkrKykKLQkJCVdFUEtFWVtpXSA9IFJhbmRvbUJ5dGUocEFkKTsgICAvL0NhbGwgbWxtZSBSYW5kb21CeXRlKCkgZnVuY3Rpb24uCi0JCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBXRVBLRVksIEtleUxlbiArIDMpOyAgLy9JTklUIFNCT1gsIEtFWUxFTiszKElWKQotCi0JCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBXRVBLRVksIDMpOyAgLy9BcHBlbmQgSW5pdCBWZWN0b3IKLSAgICB9Ci0JKihwRGVzdCszKSA9IChLZXlJZCA8PCA2KTsgICAgICAgLy9BcHBlbmQgS0VZSUQKLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJRW5jcnlwdCB0cmFuc2ltaXR0ZWQgZGF0YQotCi0JQXJndW1lbnRzOgotICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0gICAgICBwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSB0cmFuc2ltaXR0ZWQgc291cmNlIGRhdGEgdGhhdCB3aWxsIGJlIGVuY3J5cHQKLSAgICAgIHBEZXN0ICAgICAgIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIHdoZXJlIGVudHJ5cHRpb24gZGF0YSB3aWxsIGJlIHN0b3JlIGluLgotICAgICAgTGVuCQkJSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgc291cmNlIGRhdGEKLQotCVJldHVybiBWYWx1ZToKLSAgICAgIE5vbmUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUEVuY3J5cHREYXRhKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBTcmMsCi0JSU4JUFVDSEFSCQkJcERlc3QsCi0JSU4JVUlOVAkJCUxlbikKLXsKLQlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyID0gUlRNUF9DQUxDX0ZDUzMyKHBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIsIHBTcmMsIExlbik7Ci0JQVJDRk9VUl9FTkNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIHBEZXN0LCBwU3JjLCBMZW4pOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlEZWNyeXB0IHJlY2VpdmVkIFdFUCBkYXRhCi0KLQlBcmd1bWVudHM6Ci0JCXBBZGFwdGVyCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHJlY2VpdmVkIGRhdGEKLQkJTGVuICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgcmVjZWl2ZWQgZGF0YQotCi0JUmV0dXJuIFZhbHVlOgotCQlUUlVFICAgICAgICBEZWNyeXB0IFdFUCBkYXRhIHN1Y2Nlc3MKLQkJRkFMU0UgICAgICAgRGVjcnlwdCBXRVAgZGF0YSBmYWlsZWQKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1CT09MRUFOCVJUTVBTb2Z0RGVjcnlwdFdFUCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBQVUNIQVIJCQlwRGF0YSwKLQlJTiBVTE9ORwkJCURhdGFCeXRlQ250LAotCUlOIFBDSVBIRVJfS0VZCQlwR3JvdXBLZXkpCi17Ci0JVUlOVAl0cmFpbGZjczsKLQlVSU5UICAgIGNyYzMyOwotCVVDSEFSCUtleUlkeDsKLQlVQ0hBUiAgIFdFUEtFWVtdID0gewotCQkvL0lWCi0JCTB4MDAsIDB4MTEsIDB4MjIsCi0JCS8vV0VQIEtFWQotCQkweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LCAweDg4LCAweDk5LCAweEFBLCAweEJCLCAweENDCi0JfTsKLQlVQ0hBUgkqcFBheWxvYWQgPSAoVUNIQVIgKilwRGF0YSArIExFTkdUSF84MDJfMTE7Ci0JVUxPTkcJcGF5bG9hZF9sZW4gPSBEYXRhQnl0ZUNudCAtIExFTkdUSF84MDJfMTE7Ci0KLQlOZGlzTW92ZU1lbW9yeShXRVBLRVksIHBQYXlsb2FkLCAzKTsgICAgLy9HZXQgV0VQIElWCi0KLQlLZXlJZHggPSAoKihwUGF5bG9hZCArIDMpICYgMHhjMCkgPj4gNjsKLQlpZiAocEdyb3VwS2V5W0tleUlkeF0uS2V5TGVuID09IDApCi0JCXJldHVybiAoRkFMU0UpOwotCi0JTmRpc01vdmVNZW1vcnkoV0VQS0VZICsgMywgcEdyb3VwS2V5W0tleUlkeF0uS2V5LCBwR3JvdXBLZXlbS2V5SWR4XS5LZXlMZW4pOwotCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBXRVBLRVksIHBHcm91cEtleVtLZXlJZHhdLktleUxlbiArIDMpOwotCUFSQ0ZPVVJfREVDUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBwUGF5bG9hZCwgcFBheWxvYWQgKyA0LCBwYXlsb2FkX2xlbiAtIDQpOwotCU5kaXNNb3ZlTWVtb3J5KCZ0cmFpbGZjcywgcFBheWxvYWQgKyBwYXlsb2FkX2xlbiAtIDgsIDQpOwotCWNyYzMyID0gUlRNUF9DQUxDX0ZDUzMyKFBQUElOSVRGQ1MzMiwgcFBheWxvYWQsIHBheWxvYWRfbGVuIC0gOCk7ICAvL1NraXAgbGFzdCA0IGJ5dGVzKEZDUykuCi0JY3JjMzIgXj0gMHhmZmZmZmZmZjsgICAgICAgICAgICAgLyogY29tcGxlbWVudCAqLwotCi0gICAgaWYoY3JjMzIgIT0gY3B1MmxlMzIodHJhaWxmY3MpKQotICAgIHsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISBXRVAgRGF0YSBDUkMgRXJyb3IgIVxuIikpOwkgLy9DUkMgZXJyb3IuCi0JCXJldHVybiAoRkFMU0UpOwotCX0KLQlyZXR1cm4gKFRSVUUpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJVGhlIFN0cmVhbSBDaXBoZXIgRW5jcnlwdGlvbiBBbGdvcml0aG0gIkFSQ0ZPVVIiIGluaXRpYWxpemUKLQotCUFyZ3VtZW50czoKLQkgICBDdHggICAgICAgICBQb2ludGVyIHRvIEFSQ0ZPVVIgQ09OVEVYVCAoU0JPWCkKLQkJcEtleSAgICAgICAgUG9pbnRlciB0byB0aGUgV0VQIEtFWQotCQlLZXlMZW4gICAgICBJbmRpY2F0ZSB0aGUgbGVuZ3RoIGZvIHRoZSBXRVAgS0VZCi0KLQlSZXR1cm4gVmFsdWU6Ci0JICAgTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlBUkNGT1VSX0lOSVQoCi0JSU4JUEFSQ0ZPVVJDT05URVhUCUN0eCwKLQlJTglQVUNIQVIJCQlwS2V5LAotCUlOCVVJTlQJCQlLZXlMZW4pCi17Ci0JVUNIQVIJdCwgdTsKLQlVSU5UCWtleWluZGV4OwotCVVJTlQJc3RhdGVpbmRleDsKLQlQVUNIQVIJc3RhdGU7Ci0JVUlOVAljb3VudGVyOwotCi0Jc3RhdGUgPSBDdHgtPlNUQVRFOwotCUN0eC0+WCA9IDA7Ci0JQ3R4LT5ZID0gMDsKLQlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgMjU2OyBjb3VudGVyKyspCi0JCXN0YXRlW2NvdW50ZXJdID0gKFVDSEFSKWNvdW50ZXI7Ci0Ja2V5aW5kZXggPSAwOwotCXN0YXRlaW5kZXggPSAwOwotCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCAyNTY7IGNvdW50ZXIrKykKLQl7Ci0JCXQgPSBzdGF0ZVtjb3VudGVyXTsKLQkJc3RhdGVpbmRleCA9IChzdGF0ZWluZGV4ICsgcEtleVtrZXlpbmRleF0gKyB0KSAmIDB4ZmY7Ci0JCXUgPSBzdGF0ZVtzdGF0ZWluZGV4XTsKLQkJc3RhdGVbc3RhdGVpbmRleF0gPSB0OwotCQlzdGF0ZVtjb3VudGVyXSA9IHU7Ci0JCWlmICgrK2tleWluZGV4ID49IEtleUxlbikKLQkJCWtleWluZGV4ID0gMDsKLQl9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlHZXQgYnl0ZXMgZnJvbSBBUkNGT1VSIENPTlRFWFQgKFMtQk9YKQotCi0JQXJndW1lbnRzOgotCSAgIEN0eCAgICAgICAgIFBvaW50ZXIgdG8gQVJDRk9VUiBDT05URVhUIChTQk9YKQotCi0JUmV0dXJuIFZhbHVlOgotCSAgIFVDSEFSICAtIHRoZSB2YWx1ZSBvZiB0aGUgQVJDRk9VUiBDT05URVhUIChTLUJPWCkKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VQ0hBUglBUkNGT1VSX0JZVEUoCi0JSU4JUEFSQ0ZPVVJDT05URVhUCQlDdHgpCi17Ci0gIFVJTlQgeDsKLSAgVUlOVCB5OwotICBVQ0hBUiBzeCwgc3k7Ci0gIFBVQ0hBUiBzdGF0ZTsKLQotICBzdGF0ZSA9IEN0eC0+U1RBVEU7Ci0gIHggPSAoQ3R4LT5YICsgMSkgJiAweGZmOwotICBzeCA9IHN0YXRlW3hdOwotICB5ID0gKHN4ICsgQ3R4LT5ZKSAmIDB4ZmY7Ci0gIHN5ID0gc3RhdGVbeV07Ci0gIEN0eC0+WCA9IHg7Ci0gIEN0eC0+WSA9IHk7Ci0gIHN0YXRlW3ldID0gc3g7Ci0gIHN0YXRlW3hdID0gc3k7Ci0KLSAgcmV0dXJuKHN0YXRlWyhzeCArIHN5KSAmIDB4ZmZdKTsKLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJVGhlIFN0cmVhbSBDaXBoZXIgRGVjcnlwdGlvbiBBbGdvcml0aG0KLQotCUFyZ3VtZW50czoKLQkJQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCi0JCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KLQkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgU291cmNlIGRhdGEKLQkJTGVuICAgICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgU291cmNlIGRhdGEKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJQVJDRk9VUl9ERUNSWVBUKAotCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCi0JSU4JUFVDSEFSCQkJcERlc3QsCi0JSU4JUFVDSEFSCQkJcFNyYywKLQlJTglVSU5UCQkJTGVuKQotewotCVVJTlQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBMZW47IGkrKykKLQkJcERlc3RbaV0gPSBwU3JjW2ldIF4gQVJDRk9VUl9CWVRFKEN0eCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlUaGUgU3RyZWFtIENpcGhlciBFbmNyeXB0aW9uIEFsZ29yaXRobQotCi0JQXJndW1lbnRzOgotCQlDdHggICAgICAgICBQb2ludGVyIHRvIEFSQ0ZPVVIgQ09OVEVYVCAoU0JPWCkKLQkJcERlc3QJCQlQb2ludGVyIHRvIHRoZSBEZXN0aW5hdGlvbgotCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSBTb3VyY2UgZGF0YQotCQlMZW4gICAgICAgICBJbmRpY2F0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBTb3VyY2UgZHRhCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJQVJDRk9VUl9FTkNSWVBUKAotCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCi0JSU4JUFVDSEFSCQkJcERlc3QsCi0JSU4JUFVDSEFSCQkJcFNyYywKLQlJTglVSU5UCQkJTGVuKQotewotCVVJTlQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBMZW47IGkrKykKLQkJcERlc3RbaV0gPSBwU3JjW2ldIF4gQVJDRk9VUl9CWVRFKEN0eCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlUaGUgU3RyZWFtIENpcGhlciBFbmNyeXB0aW9uIEFsZ29yaXRobSB3aGljaCBjb25mb3JtIHRvIHRoZSBzcGVjaWFsIHJlcXVpcmVtZW50IHRvIGVuY3J5cHQgIEdUSy4KLQotCUFyZ3VtZW50czoKLQkJQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCi0JCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KLQkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgU291cmNlIGRhdGEKLQkJTGVuICAgICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgU291cmNlIGR0YQotCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi0KLVZPSUQJV1BBQVJDRk9VUl9FTkNSWVBUKAotCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCi0JSU4JUFVDSEFSCQkJcERlc3QsCi0JSU4JUFVDSEFSCQkJcFNyYywKLQlJTglVSU5UCQkJTGVuKQotewotCVVJTlQgaTsKLSAgICAgICAgLy9kaXNjYXJkIGZpcnN0IDI1NiBieXRlcwotCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLSAgICAgICAgICAgIEFSQ0ZPVVJfQllURShDdHgpOwotCi0JZm9yIChpID0gMDsgaSA8IExlbjsgaSsrKQotCQlwRGVzdFtpXSA9IHBTcmNbaV0gXiBBUkNGT1VSX0JZVEUoQ3R4KTsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJQ2FsY3VsYXRlIGEgbmV3IEZDUyBnaXZlbiB0aGUgY3VycmVudCBGQ1MgYW5kIHRoZSBuZXcgZGF0YS4KLQotCUFyZ3VtZW50czoKLQkJRmNzCSAgICAgIHRoZSBvcmlnaW5hbCBGQ1MgdmFsdWUKLQkJQ3AgICAgICAgICAgcG9pbnRlciB0byB0aGUgZGF0YSB3aGljaCB3aWxsIGJlIGNhbGN1bGF0ZSB0aGUgRkNTCi0JCUxlbiAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEKLQotCVJldHVybiBWYWx1ZToKLQkJVUlOVCAtIEZDUyAzMiBiaXRzCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VSU5UCVJUTVBfQ0FMQ19GQ1MzMigKLQlJTglVSU5UCUZjcywKLQlJTglQVUNIQVIJQ3AsCi0JSU4JSU5UCQlMZW4pCi17Ci0Jd2hpbGUgKExlbi0tKQotCSAgIEZjcyA9ICgoKEZjcykgPj4gOCkgXiBGQ1NUQUJfMzJbKChGY3MpIF4gKCpDcCsrKSkgJiAweGZmXSk7Ci0KLQlyZXR1cm4gKEZjcyk7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUdldCBsYXN0IEZDUyBhbmQgZW5jcnlwdCBpdCB0byB0aGUgZGVzdGluYXRpb24KLQotCUFyZ3VtZW50czoKLQkJcERlc3QJCQlQb2ludGVyIHRvIHRoZSBEZXN0aW5hdGlvbgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QU2V0SUNWKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUglwRGVzdCkKLXsKLQlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyIF49IDB4ZmZmZmZmZmY7ICAgICAgICAgICAgIC8qIGNvbXBsZW1lbnQgKi8KLQlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyID0gY3B1MmxlMzIocEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMik7Ci0KLQlBUkNGT1VSX0VOQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcERlc3QsIChQVUNIQVIpICZwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCA0KTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV93cGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV93cGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY2OGFkOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fd3BhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQ5ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0Jd3BhLmMKLQotCUFic3RyYWN0OgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCQlXaGVuCQkJV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlKYW4JTGVlCQkwMy0wNy0yMgkJSW5pdGlhbAotCVBhdWwgTGluCTAzLTExLTI4CQlNb2RpZnkgZm9yIHN1cHBsaWNhbnQKLSovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi0vLyBXUEEgT1VJCi1VQ0hBUgkJT1VJX1dQQV9OT05FX0FLTVs0XQkJPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwMH07Ci1VQ0hBUiAgICAgICBPVUlfV1BBX1ZFUlNJT05bNF0gICAgICA9IHsweDAwLCAweDUwLCAweEYyLCAweDAxfTsKLVVDSEFSICAgICAgIE9VSV9XUEFfV0VQNDBbNF0gICAgICA9IHsweDAwLCAweDUwLCAweEYyLCAweDAxfTsKLVVDSEFSICAgICAgIE9VSV9XUEFfVEtJUFs0XSAgICAgPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwMn07Ci1VQ0hBUiAgICAgICBPVUlfV1BBX0NDTVBbNF0gICAgID0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDR9OwotVUNIQVIgICAgICAgT1VJX1dQQV9XRVAxMDRbNF0gICAgICA9IHsweDAwLCAweDUwLCAweEYyLCAweDA1fTsKLVVDSEFSICAgICAgIE9VSV9XUEFfODAyMVhfQUtNWzRdCT0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDF9OwotVUNIQVIgICAgICAgT1VJX1dQQV9QU0tfQUtNWzRdICAgICAgPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwMn07Ci0vLyBXUEEyIE9VSQotVUNIQVIgICAgICAgT1VJX1dQQTJfV0VQNDBbNF0gICA9IHsweDAwLCAweDBGLCAweEFDLCAweDAxfTsKLVVDSEFSICAgICAgIE9VSV9XUEEyX1RLSVBbNF0gICAgICAgID0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDJ9OwotVUNIQVIgICAgICAgT1VJX1dQQTJfQ0NNUFs0XSAgICAgICAgPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwNH07Ci1VQ0hBUiAgICAgICBPVUlfV1BBMl84MDIxWF9BS01bNF0gICA9IHsweDAwLCAweDBGLCAweEFDLCAweDAxfTsKLVVDSEFSICAgICAgIE9VSV9XUEEyX1BTS19BS01bNF0JCT0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDJ9OwotVUNIQVIgICAgICAgT1VJX1dQQTJfV0VQMTA0WzRdICAgPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwNX07Ci0KLQotCi1zdGF0aWMgVk9JRAlDb25zdHJ1Y3RFYXBvbEtleURhdGEoCi0JSU4JUE1BQ19UQUJMRV9FTlRSWQlwRW50cnksCi0JSU4JVUNIQVIJCQlHcm91cEtleVdlcFN0YXR1cywKLQlJTglVQ0hBUgkJCWtleURlc2NWZXIsCi0JSU4JVUNIQVIJCQlNc2dUeXBlLAotCUlOCVVDSEFSCQkJRGVmYXVsdEtleUlkeCwKLQlJTglVQ0hBUgkJCSpHVEssCi0JSU4JVUNIQVIJCQkqUlNOSUUsCi0JSU4JVUNIQVIJCQlSU05JRV9MRU4sCi0JT1VUIFBFQVBPTF9QQUNLRVQgICBwTXNnKTsKLQotc3RhdGljIFZPSUQJQ2FsY3VsYXRlTUlDKAotCUlOCVVDSEFSCQkJS2V5RGVzY1ZlciwKLQlJTglVQ0hBUgkJCSpQVEssCi0JT1VUIFBFQVBPTF9QQUNLRVQgICBwTXNnKTsKLQotc3RhdGljIFZPSUQgV3BhRUFQUGFja2V0QWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLXN0YXRpYyBWT0lEIFdwYUVBUE9MQVNGQWxlcnRBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotc3RhdGljIFZPSUQgV3BhRUFQT0xMb2dvZmZBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotc3RhdGljIFZPSUQgV3BhRUFQT0xTdGFydEFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKLQotc3RhdGljIFZPSUQgV3BhRUFQT0xLZXlBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZSBpbml0LCBpbmNsdWRpbmcgc3RhdGUgdHJhbnNpdGlvbiBhbmQgdGltZXIgaW5pdAotICAgIFBhcmFtZXRlcnM6Ci0gICAgICAgIFMgLSBwb2ludGVyIHRvIHRoZSBhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBXcGFTdGF0ZU1hY2hpbmVJbml0KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBTVEFURV9NQUNISU5FICpTLAotICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKLXsKLSAgICBTdGF0ZU1hY2hpbmVJbml0KFMsIChTVEFURV9NQUNISU5FX0ZVTkMgKilUcmFucywgTUFYX1dQQV9QVEtfU1RBVEUsIE1BWF9XUEFfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIFdQQV9QVEssIFdQQV9NQUNISU5FX0JBU0UpOwotCi0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFdQQV9QVEssIE1UMl9FQVBQYWNrZXQsIChTVEFURV9NQUNISU5FX0ZVTkMpV3BhRUFQUGFja2V0QWN0aW9uKTsKLSAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgV1BBX1BUSywgTVQyX0VBUE9MU3RhcnQsIChTVEFURV9NQUNISU5FX0ZVTkMpV3BhRUFQT0xTdGFydEFjdGlvbik7Ci0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFdQQV9QVEssIE1UMl9FQVBPTExvZ29mZiwgKFNUQVRFX01BQ0hJTkVfRlVOQylXcGFFQVBPTExvZ29mZkFjdGlvbik7Ci0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFdQQV9QVEssIE1UMl9FQVBPTEtleSwgKFNUQVRFX01BQ0hJTkVfRlVOQylXcGFFQVBPTEtleUFjdGlvbik7Ci0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFdQQV9QVEssIE1UMl9FQVBPTEFTRkFsZXJ0LCAoU1RBVEVfTUFDSElORV9GVU5DKVdwYUVBUE9MQVNGQWxlcnRBY3Rpb24pOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIHRoaXMgaXMgc3RhdGUgbWFjaGluZSBmdW5jdGlvbi4KLSAgICAgICAgV2hlbiByZWNlaXZpbmcgRUFQIHBhY2tldHMgd2hpY2ggaXMgIGZvciA4MDIuMXggYXV0aGVudGljYXRpb24gdXNlLgotICAgICAgICBOb3QgdXNlIGluIFBTSyBjYXNlCi0gICAgUmV0dXJuOgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBXcGFFQVBQYWNrZXRBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotfQotCi1WT0lEIFdwYUVBUE9MQVNGQWxlcnRBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotfQotCi1WT0lEIFdwYUVBUE9MTG9nb2ZmQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgIFN0YXJ0IDQtd2F5IEhTIHdoZW4gcmN2IEVBUE9MX1NUQVJUIHdoaWNoIG1heSBjcmVhdGUgYnkgb3VyIGRyaXZlciBpbiBhc3NvYy5jCi0gICAgUmV0dXJuOgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBXcGFFQVBPTFN0YXJ0QWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pCi17Ci0gICAgTUFDX1RBQkxFX0VOVFJZICAgICAqcEVudHJ5OwotICAgIFBIRUFERVJfODAyXzExICAgICAgcEhlYWRlcjsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYUVBUE9MU3RhcnRBY3Rpb24gPT09PiBcbiIpKTsKLQotICAgIHBIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpRWxlbS0+TXNnOwotCi0gICAgLy9Gb3Igbm9ybWFvbCBQU0ssIHdlIGVucXVldWUgYW4gRUFQT0wtU3RhcnQgY29tbWFuZCB0byB0cmlnZ2VyIHRoZSBwcm9jZXNzLgotICAgIGlmIChFbGVtLT5Nc2dMZW4gPT0gNikKLSAgICAgICAgcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBFbGVtLT5Nc2cpOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcEhlYWRlci0+QWRkcjIpOwotICAgIH0KLQotICAgIGlmIChwRW50cnkpCi0gICAgewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgUG9ydFNlY3VyZWQoJWQpLCBXcGFTdGF0ZSglZCksIEF1dGhNb2RlKCVkKSwgUE1LSURfQ2FjaGVJZHgoJWQpIFxuIiwgcEVudHJ5LT5Qb3J0U2VjdXJlZCwgcEVudHJ5LT5XcGFTdGF0ZSwgcEVudHJ5LT5BdXRoTW9kZSwgcEVudHJ5LT5QTUtJRF9DYWNoZUlkeCkpOwotCi0gICAgICAgIGlmICgocEVudHJ5LT5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpCi0JCQkmJiAocEVudHJ5LT5XcGFTdGF0ZSA8IEFTX1BUS1NUQVJUKQotICAgICAgICAgICAgJiYgKChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwgKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgfHwgKChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpICYmIChwRW50cnktPlBNS0lEX0NhY2hlSWR4ICE9IEVOVFJZX05PVF9GT1VORCkpKSkKLSAgICAgICAgewotICAgICAgICAgICAgcEVudHJ5LT5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUDsKLSAgICAgICAgICAgIHBFbnRyeS0+V3BhU3RhdGUgPSBBU19JTklUUFNLOwotICAgICAgICAgICAgcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKLSAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+Ul9Db3VudGVyLCBzaXplb2YocEVudHJ5LT5SX0NvdW50ZXIpKTsKLSAgICAgICAgICAgIHBFbnRyeS0+UmVUcnlDb3VudGVyID0gUEVFUl9NU0cxX1JFVFJZX1RJTUVSX0NUUjsKLQotICAgICAgICAgICAgV1BBU3RhcnQ0V2F5SFMocEFkLCBwRW50cnksIFBFRVJfTVNHMV9SRVRSWV9FWEVDX0lOVFYpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFRoaXMgaXMgc3RhdGUgbWFjaGluZSBmdW5jdGlvbi4KLSAgICAgICAgV2hlbiByZWNlaXZpbmcgRUFQT0wgcGFja2V0cyB3aGljaCBpcyAgZm9yIDgwMi4xeCBrZXkgbWFuYWdlbWVudC4KLSAgICAgICAgVXNlIGJvdGggaW4gV1BBLCBhbmQgV1BBUFNLIGNhc2UuCi0gICAgICAgIEluIHRoaXMgZnVuY3Rpb24sIGZ1cnRoZXIgZGlzcGF0Y2ggdG8gZGlmZmVyZW50IGZ1bmN0aW9ucyBhY2NvcmRpbmcgdG8gdGhlIHJlY2VpdmVkIHBhY2tldC4gIDMgY2F0ZWdvcmllcyBhcmUgOgotICAgICAgICAgIDEuICBub3JtYWwgNC13YXkgcGFpcndpc2VrZXkgYW5kIDItd2F5IGdyb3Vwa2V5IGhhbmRzaGFrZQotICAgICAgICAgIDIuICBNSUMgZXJyb3IgKENvdW50ZXJtZWFzdXJlcyBhdHRhY2spICByZXBvcnQgcGFja2V0IGZyb20gU1RBLgotICAgICAgICAgIDMuICBSZXF1ZXN0IGZvciBwYWlyd2lzZS9ncm91cCBrZXkgdXBkYXRlIGZyb20gU1RBCi0gICAgUmV0dXJuOgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBXcGFFQVBPTEtleUFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKQotewotICAgIE1BQ19UQUJMRV9FTlRSWSAgICAgKnBFbnRyeTsKLSAgICBQSEVBREVSXzgwMl8xMSAgICAgIHBIZWFkZXI7Ci0gICAgUEVBUE9MX1BBQ0tFVCAgICAgICBwRWFwb2xfcGFja2V0OwotCUtFWV9JTkZPCQkJcGVlcktleUluZm87Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFFQVBPTEtleUFjdGlvbiA9PT0+XG4iKSk7Ci0KLSAgICBwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKUVsZW0tPk1zZzsKLSAgICBwRWFwb2xfcGFja2V0ID0gKFBFQVBPTF9QQUNLRVQpJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOwotCi0JTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIHNpemVvZihwZWVyS2V5SW5mbykpOwotCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCAoUFVDSEFSKSZwRWFwb2xfcGFja2V0LT5LZXlEZXNjLktleUluZm8sIHNpemVvZihLRVlfSU5GTykpOwotCi0JaGV4X2R1bXAoIlJlY2VpdmVkIEVhcG9sIGZyYW1lIiwgKHVuc2lnbmVkIGNoYXIgKilwRWFwb2xfcGFja2V0LCAoRWxlbS0+TXNnTGVuIC0gTEVOR1RIXzgwMl8xMSAtIExFTkdUSF84MDJfMV9IKSk7Ci0KLQkqKChVU0hPUlQgKikmcGVlcktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJnBlZXJLZXlJbmZvKSk7Ci0KLSAgICBkbwotICAgIHsKLSAgICAgICAgcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwSGVhZGVyLT5BZGRyMik7Ci0KLQkJaWYgKCFwRW50cnkgfHwgKCghcEVudHJ5LT5WYWxpZEFzQ0xJKSAmJiAoIXBFbnRyeS0+VmFsaWRBc0FwQ2xpKSkpCi0gICAgICAgICAgICBicmVhazsKLQotCQlpZiAocEVudHJ5LT5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLQkJCQlicmVhazsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUG9MLUtleSBmcmFtZSBmcm9tIFNUQSAlMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWFxuIiwgUFJJTlRfTUFDKHBFbnRyeS0+QWRkcikpKTsKLQotICAgICAgICBpZiAoKChwRWFwb2xfcGFja2V0LT5Qcm9WZXIgIT0gRUFQT0xfVkVSKSAmJiAocEVhcG9sX3BhY2tldC0+UHJvVmVyICE9IEVBUE9MX1ZFUjIpKSB8fAotCQkJKChwRWFwb2xfcGFja2V0LT5LZXlEZXNjLlR5cGUgIT0gV1BBMV9LRVlfREVTQykgJiYgKHBFYXBvbF9wYWNrZXQtPktleURlc2MuVHlwZSAhPSBXUEEyX0tFWV9ERVNDKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIktleSBkZXNjcmlwdGVyIGRvZXMgbm90IG1hdGNoIHdpdGggV1BBIHJ1bGVcbiIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLQkJLy8gVGhlIHZhbHVlIDEgc2hhbGwgYmUgdXNlZCBmb3IgYWxsIEVBUE9MLUtleSBmcmFtZXMgdG8gYW5kIGZyb20gYSBTVEEgd2hlbgotCQkvLyBuZWl0aGVyIHRoZSBncm91cCBub3IgcGFpcndpc2UgY2lwaGVycyBhcmUgQ0NNUCBmb3IgS2V5IERlc2NyaXB0b3IgMS4KLQkJaWYgKChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJiAocGVlcktleUluZm8uS2V5RGVzY1ZlciAhPSBERVNDX1RZUEVfVEtJUCkpCi0gICAgICAgIHsKLQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIktleSBkZXNjcmlwdGVyIHZlcnNpb24gbm90IG1hdGNoKFRLSVApIFxuIikpOwotCSAgICBicmVhazsKLQl9Ci0JCS8vIFRoZSB2YWx1ZSAyIHNoYWxsIGJlIHVzZWQgZm9yIGFsbCBFQVBPTC1LZXkgZnJhbWVzIHRvIGFuZCBmcm9tIGEgU1RBIHdoZW4KLQkJLy8gZWl0aGVyIHRoZSBwYWlyd2lzZSBvciB0aGUgZ3JvdXAgY2lwaGVyIGlzIEFFUy1DQ01QIGZvciBLZXkgRGVzY3JpcHRvciAyLgotCWVsc2UgaWYgKChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSAmJiAocGVlcktleUluZm8uS2V5RGVzY1ZlciAhPSBERVNDX1RZUEVfQUVTKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIktleSBkZXNjcmlwdGVyIHZlcnNpb24gbm90IG1hdGNoKEFFUykgXG4iKSk7Ci0JCWJyZWFrOwotCX0KLQotCQkvLyBDaGVjayBpZiB0aGlzIFNUQSBpcyBpbiBjbGFzcyAzIHN0YXRlIGFuZCB0aGUgV1BBIHN0YXRlIGlzIHN0YXJ0ZWQKLSAgICAgICAgaWYgKChwRW50cnktPlNzdCA9PSBTU1RfQVNTT0MpICYmIChwRW50cnktPldwYVN0YXRlID49IEFTX0lOSVRQU0spKQotICAgICAgICB7Ci0JCQkvLyBDaGVjayB0aGUgS2V5IEFjayAoYml0IDcpIG9mIHRoZSBLZXkgSW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lIHRoZSBBdXRoZW50aWNhdG9yCi0JCQkvLyBvciBub3QuCi0JCQkvLyBBbiBFQVBPTC1LZXkgZnJhbWUgdGhhdCBpcyBzZW50IGJ5IHRoZSBTdXBwbGljYW50IGluIHJlc3BvbnNlIHRvIGFuIEVBUE9MLQotCQkJLy8gS2V5IGZyYW1lIGZyb20gdGhlIEF1dGhlbnRpY2F0b3IgbXVzdCBub3QgaGF2ZSB0aGUgQWNrIGJpdCBzZXQuCi0JCQlpZiAocGVlcktleUluZm8uS2V5QWNrID09IDEpCi0JCQl7Ci0JCQkJLy8gVGhlIGZyYW1lIGlzIHNuZXQgYnkgQXV0aGVudGljYXRvci4KLQkJCQkvLyBTbyB0aGUgU3VwcGxpY2FudCBzaWRlIHNoYWxsIGhhbmRsZSB0aGlzLgotCi0JCQkJaWYgKChwZWVyS2V5SW5mby5TZWN1cmUgPT0gMCkgJiYgKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkgJiYKLQkJCQkJKHBlZXJLZXlJbmZvLkVycm9yID09IDApICYmIChwZWVyS2V5SW5mby5LZXlUeXBlID09IFBBSVJXSVNFS0VZKSkKLQkJCQl7Ci0JCQkJCS8vIFByb2Nlc3MgMS4gdGhlIG1lc3NhZ2UgMSBvZiA0LXdheSBIUyBpbiBXUEEgb3IgV1BBMgotCQkJCQkvLwkJCSAgRUFQT0wtS2V5KDAsMCwxLDAsUCwwLDAsQU5vbmNlLDAsRGF0YUtEX00xKQotCQkJCQkvLwkJICAgMi4gdGhlIG1lc3NhZ2UgMyBvZiA0LXdheSBIUyBpbiBXUEEKLQkJCQkJLy8JCQkgIEVBUE9MLUtleSgwLDEsMSwxLFAsMCxLZXlSU0MsQU5vbmNlLE1JQyxEYXRhS0RfTTMpCi0JCQkJCWlmIChwZWVyS2V5SW5mby5LZXlNaWMgPT0gMCkKLQkJCVBlZXJQYWlyTXNnMUFjdGlvbihwQWQsIHBFbnRyeSwgRWxlbSk7Ci0JICAgICAgICAgICAgICAgIGVsc2UKLQkgICAgICAgICAgICAgICAgUGVlclBhaXJNc2czQWN0aW9uKHBBZCwgcEVudHJ5LCBFbGVtKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAxKSAmJgotCQkJCQkJIChwZWVyS2V5SW5mby5LZXlNaWMgPT0gMSkgJiYKLQkJCQkJCSAocGVlcktleUluZm8uUmVxdWVzdCA9PSAwKSAmJgotCQkJCQkJIChwZWVyS2V5SW5mby5FcnJvciA9PSAwKSkKLQkJCQl7Ci0JCQkJCS8vIFByb2Nlc3MgMS4gdGhlIG1lc3NhZ2UgMyBvZiA0LXdheSBIUyBpbiBXUEEyCi0JCQkJCS8vCQkJICBFQVBPTC1LZXkoMSwxLDEsMSxQLDAsS2V5UlNDLEFOb25jZSxNSUMsRGF0YUtEX00zKQotCQkJCQkvLwkJICAgMi4gdGhlIG1lc3NhZ2UgMSBvZiBncm91cCBLUyBpbiBXUEEgb3IgV1BBMgotCQkJCQkvLwkJCSAgRUFQT0wtS2V5KDEsMSwxLDAsRywwLEtleSBSU0MsMCwgTUlDLEdUS1tOXSkKLQkJCQkJaWYgKHBlZXJLZXlJbmZvLktleVR5cGUgPT0gUEFJUldJU0VLRVkpCi0JCQkJCQlQZWVyUGFpck1zZzNBY3Rpb24ocEFkLCBwRW50cnksIEVsZW0pOwotCQkJCQllbHNlCi0JCQkJCQlQZWVyR3JvdXBNc2cxQWN0aW9uKHBBZCwgcEVudHJ5LCBFbGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gVGhlIGZyYW1lIGlzIHNuZXQgYnkgU3VwcGxpY2FudC4KLQkJCQkvLyBTbyB0aGUgQXV0aGVudGljYXRvciBzaWRlIHNoYWxsIGhhbmRsZSB0aGlzLgotCQkJCWlmICgocGVlcktleUluZm8uUmVxdWVzdCA9PSAwKSAmJgotCQkJCQkJIChwZWVyS2V5SW5mby5FcnJvciA9PSAwKSAmJgotCQkJCQkJIChwZWVyS2V5SW5mby5LZXlNaWMgPT0gMSkpCi0JCQkJewotCQkJCQlpZiAocGVlcktleUluZm8uU2VjdXJlID09IDAgJiYgcGVlcktleUluZm8uS2V5VHlwZSA9PSBQQUlSV0lTRUtFWSkKLQkJCQkJewotCQkJCQkJLy8gRUFQT0wtS2V5KDAsMSwwLDAsUCwwLDAsU05vbmNlLE1JQyxEYXRhKQotCQkJCQkJLy8gUHJvY2VzcyAxLiBtZXNzYWdlIDIgb2YgNC13YXkgSFMgaW4gV1BBIG9yIFdQQTIKLQkJCQkJCS8vCQkgICAyLiBtZXNzYWdlIDQgb2YgNC13YXkgSFMgaW4gV1BBCi0JCQkJCQlpZiAoQ09OVl9BUlJBUllfVE9fVUlOVDE2KHBFYXBvbF9wYWNrZXQtPktleURlc2MuS2V5RGF0YUxlbikgPT0gMCkKLQkJCQkJCXsKLQkJCQkJCQlQZWVyUGFpck1zZzRBY3Rpb24ocEFkLCBwRW50cnksIEVsZW0pOwotCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCVBlZXJQYWlyTXNnMkFjdGlvbihwQWQsIHBFbnRyeSwgRWxlbSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAocGVlcktleUluZm8uU2VjdXJlID09IDEgJiYgcGVlcktleUluZm8uS2V5VHlwZSA9PSBQQUlSV0lTRUtFWSkKLQkJCQkJewotCQkJCQkJLy8gRUFQT0wtS2V5KDEsMSwwLDAsUCwwLDAsMCxNSUMsMCkKLQkJCQkJCS8vIFByb2Nlc3MgbWVzc2FnZSA0IG9mIDQtd2F5IEhTIGluIFdQQTIKLQkJCQkJCVBlZXJQYWlyTXNnNEFjdGlvbihwQWQsIHBFbnRyeSwgRWxlbSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAocGVlcktleUluZm8uU2VjdXJlID09IDEgJiYgcGVlcktleUluZm8uS2V5VHlwZSA9PSBHUk9VUEtFWSkKLQkJCQkJewotCQkJCQkJLy8gRUFQT0wtS2V5KDEsMSwwLDAsRywwLDAsMCxNSUMsMCkKLQkJCQkJCS8vIFByb2Nlc3MgbWVzc2FnZSAyIG9mIEdyb3VwIGtleSBIUyBpbiBXUEEgb3IgV1BBMgotCQkJCQkJUGVlckdyb3VwTXNnMkFjdGlvbihwQWQsIHBFbnRyeSwgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExXSwgKEVsZW0tPk1zZ0xlbiAtIExFTkdUSF84MDJfMTEpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLSAgICAgICAgfQotICAgIH13aGlsZShGQUxTRSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlDb3B5IGZyYW1lIGZyb20gd2FpdGluZyBxdWV1ZSBpbnRvIHJlbGF0aXZlIHJpbmcgYnVmZmVyIGFuZCBzZXQKLQlhcHByb3ByaWF0ZSBBU0lDIHJlZ2lzdGVyIHRvIGtpY2sgaGFyZHdhcmUgZW5jcnlwdGlvbiBiZWZvcmUgcmVhbGx5Ci0Jc2VudCBvdXQgdG8gYWlyLgotCi0JQXJndW1lbnRzOgotCQlwQWQJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKLQkJUE5ESVNfUEFDS0VUCVBvaW50ZXIgdG8gb3V0Z29pbmcgTmRpcyBmcmFtZQotCQlOdW1iZXJPZkZyYWcJTnVtYmVyIG9mIGZyYWdtZW50IHJlcXVpcmVkCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEICAgIFJUTVBUb1dpcmVsZXNzU3RhKAotICAgIElOICBQUlRNUF9BREFQVEVSCQlwQWQsCi0gICAgSU4gIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5LAotICAgIElOICBQVUNIQVIJCQlwSGVhZGVyODAyXzMsCi0gICAgSU4gIFVJTlQJCQlIZHJMZW4sCi0gICAgSU4gIFBVQ0hBUgkJCXBEYXRhLAotICAgIElOICBVSU5UCQkJRGF0YUxlbiwKLSAgICBJTglCT09MRUFOCQkJCWJDbGVhckZyYW1lKQotewotICAgIFBORElTX1BBQ0tFVCAgICBwUGFja2V0OwotICAgIE5ESVNfU1RBVFVTICAgICBTdGF0dXM7Ci0KLQlpZiAoKCFwRW50cnkpIHx8ICgoIXBFbnRyeS0+VmFsaWRBc0NMSSkgJiYgKCFwRW50cnktPlZhbGlkQXNBcENsaSkpKQotCQlyZXR1cm47Ci0KLSAgICBkbyB7Ci0JCS8vIGJ1aWxkIGEgTkRJUyBwYWNrZXQKLQkJU3RhdHVzID0gUlRNUEFsbG9jYXRlTmRpc1BhY2tldChwQWQsICZwUGFja2V0LCBwSGVhZGVyODAyXzMsIEhkckxlbiwgcERhdGEsIERhdGFMZW4pOwotCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCWJyZWFrOwotCi0KLQkJCWlmIChiQ2xlYXJGcmFtZSkKLQkJCQlSVE1QX1NFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKHBQYWNrZXQsIDEpOwotCQkJZWxzZQotCQkJCVJUTVBfU0VUX1BBQ0tFVF9DTEVBUl9FQVBfRlJBTUUocFBhY2tldCwgMCk7Ci0JCXsKLQkJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UocFBhY2tldCwgUEtUU1JDX05ESVMpOwotCi0JCQlSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9NQlNTSUQocFBhY2tldCwgTUFJTl9NQlNTSUQpOwkvLyBzZXQgYSBkZWZhdWx0IHZhbHVlCi0JCQlpZihwRW50cnktPmFwaWR4ICE9IDApCi0JCQlSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9NQlNTSUQocFBhY2tldCwgcEVudHJ5LT5hcGlkeCk7Ci0KLQkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocFBhY2tldCwgKFVDSEFSKXBFbnRyeS0+QWlkKTsKLQkJCVJUTVBfU0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0LCBGQUxTRSk7Ci0JCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0JCSAgICAvLyBzZW5kIG91dCB0aGUgcGFja2V0Ci0JICAgICAgICBTdGF0dXMgPSBTVEFTZW5kUGFja2V0KHBBZCwgcFBhY2tldCk7Ci0JICAgIGlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCXsKLQkJCQlVQ0hBUiAgIEluZGV4OwotCi0JCQkJLy8gRGVxdWV1ZSBvbmUgZnJhbWUgZnJvbSBUeFN3UXVldWUwLi4zIHF1ZXVlIGFuZCBwcm9jZXNzIGl0Ci0JCQkJLy8gVGhlcmUgYXJlIHRocmVlIHBsYWNlIGNhbGxpbmcgZGVxdWV1ZSBmb3IgVFggcmluZy4KLQkJCQkvLyAxLiBIZXJlLCByaWdodCBhZnRlciBxdWV1ZWluZyB0aGUgZnJhbWUuCi0JCQkJLy8gMi4gQXQgdGhlIGVuZCBvZiBUeFJpbmdUeERvbmUgc2VydmljZSByb3V0aW5lLgotCQkJCS8vIDMuIFVwb24gTkRJUyBjYWxsIFJUTVBTZW5kUGFja2V0cwotCQkJCWlmKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgJiYKLQkJCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKSkKLQkJCQl7Ci0JCQkJCWZvcihJbmRleCA9IDA7IEluZGV4IDwgNTsgSW5kZXggKyspCi0JCQkJCQlpZihwQWQtPlR4U3dRdWV1ZVtJbmRleF0uTnVtYmVyID4gMCkKLQkJCQkJCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBJbmRleCwgTUFYX1RYX1BST0NFU1MpOwotCQkJCX0KLQkJCX0KLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0gICAgfSB3aGlsZSAoRkFMU0UpOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFRoaXMgaXMgYSBmdW5jdGlvbiB0byBpbml0aWxpemUgNC13YXkgaGFuZHNoYWtlCi0KLSAgICBSZXR1cm46Ci0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgV1BBU3RhcnQ0V2F5SFMoCi0gICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0gICAgSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAotICAgIElOIFVMT05HCQkJVGltZUludGVydmFsKQotewotICAgIFVDSEFSICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07Ci0gICAgRUFQT0xfUEFDS0VUCUVBUE9MUEtUOwotCVBVSU5UOAkJCXBCc3NpZCA9IE5VTEw7Ci0JVUNIQVIJCQlncm91cF9jaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IFdQQVN0YXJ0NFdheUhTXG4iKSk7Ci0KLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIltFUlJPUl1XUEFTdGFydDRXYXlIUyA6IFRoZSBpbnRlcmZhY2UgaXMgY2xvc2VkLi4uXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQotCWlmIChwQnNzaWQgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIltFUlJPUl1XUEFTdGFydDRXYXlIUyA6IE5vIGNvcnJlc3BvbmRpbmcgQXV0aGVudGljYXRvci5cbiIpKTsKLQkJcmV0dXJuOwotICAgIH0KLQotCS8vIENoZWNrIHRoZSBzdGF0dXMKLSAgICBpZiAoKHBFbnRyeS0+V3BhU3RhdGUgPiBBU19QVEtTVEFSVCkgfHwgKHBFbnRyeS0+V3BhU3RhdGUgPCBBU19JTklUUE1LKSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIltFUlJPUl1XUEFTdGFydDRXYXlIUyA6IE5vdCBleHBlY3QgY2FsbGluZ1xuIikpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0KLQkvLyBJbmNyZW1lbnQgcmVwbGF5IGNvdW50ZXIgYnkgMQotCUFERF9PTkVfVG9fNjRCSVRfVkFSKHBFbnRyeS0+Ul9Db3VudGVyKTsKLQotCS8vIFJhbmRvbWx5IGdlbmVyYXRlIEFOb25jZQotCUdlblJhbmRvbShwQWQsIChVQ0hBUiAqKXBCc3NpZCwgcEVudHJ5LT5BTm9uY2UpOwotCi0JLy8gQ29uc3RydWN0IEVBUG9MIG1lc3NhZ2UgLSBQYWlyd2lzZSBNc2cgMQotCS8vIEVBUE9MLUtleSgwLDAsMSwwLFAsMCwwLEFOb25jZSwwLERhdGFLRF9NMSkKLQlOZGlzWmVyb01lbW9yeSgmRUFQT0xQS1QsIHNpemVvZihFQVBPTF9QQUNLRVQpKTsKLQlDb25zdHJ1Y3RFYXBvbE1zZyhwRW50cnksCi0JCQkJCSAgZ3JvdXBfY2lwaGVyLAotCQkJCQkgIEVBUE9MX1BBSVJfTVNHXzEsCi0JCQkJCSAgMCwJCQkJCS8vIERlZmF1bHQga2V5IGluZGV4Ci0JCQkJCSAgcEVudHJ5LT5BTm9uY2UsCi0JCQkJCSAgTlVMTCwJCQkJCS8vIFR4UlNDCi0JCQkJCSAgTlVMTCwJCQkJCS8vIEdUSwotCQkJCQkgIE5VTEwsCQkJCQkvLyBSU05JRQotCQkJCQkgIDAsCQkJCQkvLyBSU05JRSBsZW5ndGgKLQkJCQkJICAmRUFQT0xQS1QpOwotCi0KLQkvLyBNYWtlIG91dGdvaW5nIGZyYW1lCi0gICAgTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBFbnRyeS0+QWRkciwgcEJzc2lkLCBFQVBPTCk7Ci0gICAgUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBwRW50cnksIEhlYWRlcjgwMl8zLAotCQkJCQkgIExFTkdUSF84MDJfMywgKFBVQ0hBUikmRUFQT0xQS1QsCi0JCQkJCSAgQ09OVl9BUlJBUllfVE9fVUlOVDE2KEVBUE9MUEtULkJvZHlfTGVuKSArIDQsCi0JCQkJCSAgKHBFbnRyeS0+UG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpID8gRkFMU0UgOiBUUlVFKTsKLQotCS8vIFRyaWdnZXIgUmV0cnkgVGltZXIKLSAgICBSVE1QTW9kVGltZXIoJnBFbnRyeS0+UmV0cnlUaW1lciwgVGltZUludGVydmFsKTsKLQotCS8vIFVwZGF0ZSBTdGF0ZQotICAgIHBFbnRyeS0+V3BhU3RhdGUgPSBBU19QVEtTVEFSVDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gV1BBU3RhcnQ0V2F5SFM6IHNlbmQgTXNnMSBvZiA0LXdheSBcbiIpKTsKLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUHJvY2VzcyBQYWlyd2lzZSBrZXkgTXNnLTEgb2YgNC13YXkgaGFuZHNoYWtpbmcgYW5kIHNlbmQgTXNnLTIKLQotCUFyZ3VtZW50czoKLQkJcEFkCQkJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgotCQlFbGVtCQlNZXNzYWdlIGJvZHkKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUGVlclBhaXJNc2cxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKQotewotCVVDSEFSCQkJCVBUS1s4MF07Ci0JVUNIQVIgICAgICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07Ci0JUEVBUE9MX1BBQ0tFVAkJcE1zZzE7Ci0JVUlOVAkJCU1zZ0xlbjsKLQlFQVBPTF9QQUNLRVQJCUVBUE9MUEtUOwotCVBVSU5UOAkJCQlwQ3VycmVudEFkZHIgPSBOVUxMOwotCVBVSU5UOAkJCQlwbWtfcHRyID0gTlVMTDsKLQlVQ0hBUgkJCQlncm91cF9jaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0JUFVJTlQ4CQkJCXJzbmllX3B0ciA9IE5VTEw7Ci0JVUNIQVIJCQkJcnNuaWVfbGVuID0gMDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gUGVlclBhaXJNc2cxQWN0aW9uIFxuIikpOwotCi0JaWYgKCghcEVudHJ5KSB8fCAoKCFwRW50cnktPlZhbGlkQXNDTEkpICYmICghcEVudHJ5LT5WYWxpZEFzQXBDbGkpKSkKLQkJcmV0dXJuOwotCi0gICAgaWYgKEVsZW0tPk1zZ0xlbiA8IChMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0ggKyBMRU5HVEhfRUFQT0xfSCArIHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFIC0gMikpCi0gICAgICAgIHJldHVybjsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlwQ3VycmVudEFkZHIgPSBwQWQtPkN1cnJlbnRBZGRyZXNzOwotCQlwbWtfcHRyID0gcEFkLT5TdGFDZmcuUE1LOwotCQlncm91cF9jaXBoZXIgPSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcjsKLQkJcnNuaWVfcHRyID0gcEFkLT5TdGFDZmcuUlNOX0lFOwotCQlyc25pZV9sZW4gPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JLy8gU3RvcmUgdGhlIHJlY2VpdmVkIGZyYW1lCi0JcE1zZzEgPSAoUEVBUE9MX1BBQ0tFVCkgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOwotCU1zZ0xlbiA9IEVsZW0tPk1zZ0xlbiAtIExFTkdUSF84MDJfMTEgLSBMRU5HVEhfODAyXzFfSDsKLQotCS8vIFNhbml0eSBDaGVjayBwZWVyIFBhaXJ3aXNlIG1lc3NhZ2UgMSAtIFJlcGxheSBDb3VudGVyCi0JaWYgKFBlZXJXcGFNZXNzYWdlU2FuaXR5KHBBZCwgcE1zZzEsIE1zZ0xlbiwgRUFQT0xfUEFJUl9NU0dfMSwgcEVudHJ5KSA9PSBGQUxTRSkKLQkJcmV0dXJuOwotCi0JLy8gU3RvcmUgUmVwbGF5IGNvdW50ZXIsIGl0IHdpbGwgdXNlIHRvIHZlcmlmeSBtZXNzYWdlIDMgYW5kIGNvbnN0cnVjdCBtZXNzYWdlIDIKLQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlJfQ291bnRlciwgcE1zZzEtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0KLQkvLyBTdG9yZSBBTm9uY2UKLQlOZGlzTW92ZU1lbW9yeShwRW50cnktPkFOb25jZSwgcE1zZzEtPktleURlc2MuS2V5Tm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSk7Ci0KLQkvLyBHZW5lcmF0ZSByYW5kb20gU05vbmNlCi0JR2VuUmFuZG9tKHBBZCwgKFVDSEFSICopcEN1cnJlbnRBZGRyLCBwRW50cnktPlNOb25jZSk7Ci0KLQl7Ci0JICAgIC8vIENhbGN1bGF0ZSBQVEsoQU5vbmNlLCBTTm9uY2UpCi0JICAgIFdwYURlcml2ZVBUSyhwQWQsCi0JCQkJcG1rX3B0ciwKLQkJCQlwRW50cnktPkFOb25jZSwKLQkJCQkJcEVudHJ5LT5BZGRyLAotCQkJCQlwRW50cnktPlNOb25jZSwKLQkJCQkJcEN1cnJlbnRBZGRyLAotCQkJCSAgICBQVEssCi0JCQkJICAgIExFTl9QVEspOwotCi0JCS8vIFNhdmUga2V5IHRvIFBUSyBlbnRyeQotCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBUSywgUFRLLCBMRU5fUFRLKTsKLQl9Ci0KLQkvLyBVcGRhdGUgV3BhU3RhdGUKLQlwRW50cnktPldwYVN0YXRlID0gQVNfUFRLSU5JVF9ORUdPVElBVElORzsKLQotCS8vIENvbnN0cnVjdCBFQVBvTCBtZXNzYWdlIC0gUGFpcndpc2UgTXNnIDIKLQkvLyAgRUFQT0wtS2V5KDAsMSwwLDAsUCwwLDAsU05vbmNlLE1JQyxEYXRhS0RfTTIpCi0JTmRpc1plcm9NZW1vcnkoJkVBUE9MUEtULCBzaXplb2YoRUFQT0xfUEFDS0VUKSk7Ci0JQ29uc3RydWN0RWFwb2xNc2cocEVudHJ5LAotCQkJCQkgIGdyb3VwX2NpcGhlciwKLQkJCQkJICBFQVBPTF9QQUlSX01TR18yLAotCQkJCQkgIDAsCQkJCS8vIERlZmF1bHRLZXlJZHgKLQkJCQkJICBwRW50cnktPlNOb25jZSwKLQkJCQkJICBOVUxMLAkJCQkvLyBUeFJzYwotCQkJCQkgIE5VTEwsCQkJCS8vIEdUSwotCQkJCQkgIChVQ0hBUiAqKXJzbmllX3B0ciwKLQkJCQkJICByc25pZV9sZW4sCi0JCQkJCSAgJkVBUE9MUEtUKTsKLQotCS8vIE1ha2Ugb3V0Z29pbmcgZnJhbWUKLQlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEVudHJ5LT5BZGRyLCBwQ3VycmVudEFkZHIsIEVBUE9MKTsKLQotCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgcEVudHJ5LAotCQkJCQkgIEhlYWRlcjgwMl8zLCBzaXplb2YoSGVhZGVyODAyXzMpLCAoUFVDSEFSKSZFQVBPTFBLVCwKLQkJCQkJICBDT05WX0FSUkFSWV9UT19VSU5UMTYoRUFQT0xQS1QuQm9keV9MZW4pICsgNCwgVFJVRSk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IFBlZXJQYWlyTXNnMUFjdGlvbjogc2VuZCBNc2cyIG9mIDQtd2F5IFxuIikpOwotfQotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgV2hlbiByZWNlaXZpbmcgdGhlIHNlY29uZCBwYWNrZXQgb2YgNC13YXkgcGFpcndpc2VrZXkgaGFuZHNoYWtlLgotICAgIFJldHVybjoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUGVlclBhaXJNc2cyQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKQotewotCVVDSEFSCQkJCVBUS1s4MF07Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICBDYW5jZWxsZWQ7Ci0gICAgUEhFQURFUl84MDJfMTEgICAgICBwSGVhZGVyOwotCUVBUE9MX1BBQ0tFVCAgICAgICAgRUFQT0xQS1Q7Ci0JUEVBUE9MX1BBQ0tFVCAgICAgICBwTXNnMjsKLQlVSU5UCQkJTXNnTGVuOwotICAgIFVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbTEVOR1RIXzgwMl8zXTsKLQlVQ0hBUgkJCQlUeFRzY1s2XTsKLQlQVUlOVDgJCQkJcEJzc2lkID0gTlVMTDsKLQlQVUlOVDgJCQkJcG1rX3B0ciA9IE5VTEw7Ci0JUFVJTlQ4CQkJCWd0a19wdHIgPSBOVUxMOwotCVVDSEFSCQkJCWRlZmF1bHRfa2V5ID0gMDsKLQlVQ0hBUgkJCQlncm91cF9jaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0JUFVJTlQ4CQkJCXJzbmllX3B0ciA9IE5VTEw7Ci0JVUNIQVIJCQkJcnNuaWVfbGVuID0gMDsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gUGVlclBhaXJNc2cyQWN0aW9uIFxuIikpOwotCi0gICAgaWYgKCghcEVudHJ5KSB8fCAoIXBFbnRyeS0+VmFsaWRBc0NMSSkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChFbGVtLT5Nc2dMZW4gPCAoTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgTEVOR1RIX0VBUE9MX0ggKyBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRSAtIDIpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBjaGVjayBFbnRyeSBpbiB2YWxpZCBTdGF0ZQotICAgIGlmIChwRW50cnktPldwYVN0YXRlIDwgQVNfUFRLU1RBUlQpCi0gICAgICAgIHJldHVybjsKLQotCi0KLSAgICAvLyBwb2ludGVyIHRvIDgwMi4xMSBoZWFkZXIKLQlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKUVsZW0tPk1zZzsKLQotCS8vIHNraXAgODAyLjExX2hlYWRlcigyNC1ieXRlKSBhbmQgTExDX2hlYWRlcig4KQotCXBNc2cyID0gKFBFQVBPTF9QQUNLRVQpJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOwotCU1zZ0xlbiA9IEVsZW0tPk1zZ0xlbiAtIExFTkdUSF84MDJfMTEgLSBMRU5HVEhfODAyXzFfSDsKLQotCS8vIFN0b3JlIFNOb25jZQotCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+U05vbmNlLCBwTXNnMi0+S2V5RGVzYy5LZXlOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKTsKLQotCXsKLQkJLy8gRGVyaXZlIFBUSwotCQlXcGFEZXJpdmVQVEsocEFkLAotCQkJCQkoVUNIQVIgKilwbWtfcHRyLAotCQkJCQlwRW50cnktPkFOb25jZSwJCQkvLyBBTk9OQ0UKLQkJCQkJKFVDSEFSICopcEJzc2lkLAotCQkJCQlwRW50cnktPlNOb25jZSwJCQkvLyBTTk9OQ0UKLQkJCQkJcEVudHJ5LT5BZGRyLAotCQkJCQlQVEssCi0JCQkJCUxFTl9QVEspOwotCi0JTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QVEssIFBUSywgTEVOX1BUSyk7Ci0JfQotCi0JLy8gU2FuaXR5IENoZWNrIHBlZXIgUGFpcndpc2UgbWVzc2FnZSAyIC0gUmVwbGF5IENvdW50ZXIsIE1JQywgUlNOSUUKLQlpZiAoUGVlcldwYU1lc3NhZ2VTYW5pdHkocEFkLCBwTXNnMiwgTXNnTGVuLCBFQVBPTF9QQUlSX01TR18yLCBwRW50cnkpID09IEZBTFNFKQotCQlyZXR1cm47Ci0KLSAgICBkbwotICAgIHsKLSAgICAgICAgLy8gZGVsZXRlIHJldHJ5IHRpbWVyCi0JCVJUTVBDYW5jZWxUaW1lcigmcEVudHJ5LT5SZXRyeVRpbWVyLCAmQ2FuY2VsbGVkKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUKLSAgICAgICAgcEVudHJ5LT5XcGFTdGF0ZSA9IEFTX1BUS0lOSVRfTkVHT1RJQVRJTkc7Ci0KLQkJLy8gSW5jcmVtZW50IHJlcGxheSBjb3VudGVyIGJ5IDEKLQkJQUREX09ORV9Ub182NEJJVF9WQVIocEVudHJ5LT5SX0NvdW50ZXIpOwotCi0JCS8vIENvbnN0cnVjdCBFQVBvTCBtZXNzYWdlIC0gUGFpcndpc2UgTXNnIDMKLQkJTmRpc1plcm9NZW1vcnkoJkVBUE9MUEtULCBzaXplb2YoRUFQT0xfUEFDS0VUKSk7Ci0JCUNvbnN0cnVjdEVhcG9sTXNnKHBFbnRyeSwKLQkJCQkJCSAgZ3JvdXBfY2lwaGVyLAotCQkJCQkJICBFQVBPTF9QQUlSX01TR18zLAotCQkJCQkJICBkZWZhdWx0X2tleSwKLQkJCQkJCSAgcEVudHJ5LT5BTm9uY2UsCi0JCQkJCQkgIFR4VHNjLAotCQkJCQkJICAoVUNIQVIgKilndGtfcHRyLAotCQkJCQkJICAoVUNIQVIgKilyc25pZV9wdHIsCi0JCQkJCQkgIHJzbmllX2xlbiwKLQkJCQkJCSAgJkVBUE9MUEtUKTsKLQotICAgICAgICAvLyBNYWtlIG91dGdvaW5nIGZyYW1lCi0gICAgICAgIE1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwRW50cnktPkFkZHIsIHBCc3NpZCwgRUFQT0wpOwotICAgICAgICBSVE1QVG9XaXJlbGVzc1N0YShwQWQsIHBFbnRyeSwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMywKLQkJCQkJCSAgKFBVQ0hBUikmRUFQT0xQS1QsCi0JCQkJCQkgIENPTlZfQVJSQVJZX1RPX1VJTlQxNihFQVBPTFBLVC5Cb2R5X0xlbikgKyA0LAotCQkJCQkJICAocEVudHJ5LT5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkgPyBGQUxTRSA6IFRSVUUpOwotCi0gICAgICAgIHBFbnRyeS0+UmVUcnlDb3VudGVyID0gUEVFUl9NU0czX1JFVFJZX1RJTUVSX0NUUjsKLQkJUlRNUFNldFRpbWVyKCZwRW50cnktPlJldHJ5VGltZXIsIFBFRVJfTVNHM19SRVRSWV9FWEVDX0lOVFYpOwotCi0JCS8vIFVwZGF0ZSBTdGF0ZQotICAgICAgICBwRW50cnktPldwYVN0YXRlID0gQVNfUFRLSU5JVF9ORUdPVElBVElORzsKLSAgICB9d2hpbGUoRkFMU0UpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBQZWVyUGFpck1zZzJBY3Rpb246IHNlbmQgTXNnMyBvZiA0LXdheSBcbiIpKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVByb2Nlc3MgUGFpcndpc2Uga2V5IE1zZyAzIG9mIDQtd2F5IGhhbmRzaGFraW5nIGFuZCBzZW5kIE1zZyA0Ci0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCi0JCUVsZW0JCU1lc3NhZ2UgYm9keQotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBQZWVyUGFpck1zZzNBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0gICAgSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pCi17Ci0JUEhFQURFUl84MDJfMTEJCXBIZWFkZXI7Ci0JVUNIQVIgICAgICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07Ci0JRUFQT0xfUEFDS0VUCQlFQVBPTFBLVDsKLQlQRUFQT0xfUEFDS0VUCQlwTXNnMzsKLQlVSU5UCQkJTXNnTGVuOwotCVBVSU5UOAkJCQlwQ3VycmVudEFkZHIgPSBOVUxMOwotCVVDSEFSCQkJCWdyb3VwX2NpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gUGVlclBhaXJNc2czQWN0aW9uIFxuIikpOwotCi0JaWYgKCghcEVudHJ5KSB8fCAoKCFwRW50cnktPlZhbGlkQXNDTEkpICYmICghcEVudHJ5LT5WYWxpZEFzQXBDbGkpKSkKLQkJcmV0dXJuOwotCi0gICAgaWYgKEVsZW0tPk1zZ0xlbiA8IChMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0ggKyBMRU5HVEhfRUFQT0xfSCArIHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFIC0gMikpCi0JCXJldHVybjsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlwQ3VycmVudEFkZHIgPSBwQWQtPkN1cnJlbnRBZGRyZXNzOwotCQlncm91cF9jaXBoZXIgPSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcjsKLQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCS8vIFJlY29yZCA4MDIuMTEgaGVhZGVyICYgdGhlIHJlY2VpdmVkIEVBUE9MIHBhY2tldCBNc2czCi0JcEhlYWRlcgk9IChQSEVBREVSXzgwMl8xMSkgRWxlbS0+TXNnOwotCXBNc2czID0gKFBFQVBPTF9QQUNLRVQpICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKLQlNc2dMZW4gPSBFbGVtLT5Nc2dMZW4gLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIXzgwMl8xX0g7Ci0KLQkvLyBTYW5pdHkgQ2hlY2sgcGVlciBQYWlyd2lzZSBtZXNzYWdlIDMgLSBSZXBsYXkgQ291bnRlciwgTUlDLCBSU05JRQotCWlmIChQZWVyV3BhTWVzc2FnZVNhbml0eShwQWQsIHBNc2czLCBNc2dMZW4sIEVBUE9MX1BBSVJfTVNHXzMsIHBFbnRyeSkgPT0gRkFMU0UpCi0JCXJldHVybjsKLQotCS8vIFNhdmUgUmVwbGF5IGNvdW50ZXIsIGl0IHdpbGwgdXNlIGNvbnN0cnVjdCBtZXNzYWdlIDQKLQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlJfQ291bnRlciwgcE1zZzMtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0KLQkvLyBEb3VibGUgY2hlY2sgQU5vbmNlCi0JaWYgKCFOZGlzRXF1YWxNZW1vcnkocEVudHJ5LT5BTm9uY2UsIHBNc2czLT5LZXlEZXNjLktleU5vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpKQotCXsKLQkJcmV0dXJuOwotCX0KLQotCS8vIENvbnN0cnVjdCBFQVBvTCBtZXNzYWdlIC0gUGFpcndpc2UgTXNnIDQKLQlOZGlzWmVyb01lbW9yeSgmRUFQT0xQS1QsIHNpemVvZihFQVBPTF9QQUNLRVQpKTsKLQlDb25zdHJ1Y3RFYXBvbE1zZyhwRW50cnksCi0JCQkJCSAgZ3JvdXBfY2lwaGVyLAotCQkJCQkgIEVBUE9MX1BBSVJfTVNHXzQsCi0JCQkJCSAgMCwJCQkJCS8vIGdyb3VwIGtleSBpbmRleCBub3QgdXNlZCBpbiBtZXNzYWdlIDQKLQkJCQkJICBOVUxMLAkJCQkJLy8gTm9uY2Ugbm90IHVzZWQgaW4gbWVzc2FnZSA0Ci0JCQkJCSAgTlVMTCwJCQkJCS8vIFR4UlNDIG5vdCB1c2VkIGluIG1lc3NhZ2UgNAotCQkJCQkgIE5VTEwsCQkJCQkvLyBHVEsgbm90IHVzZWQgaW4gbWVzc2FnZSA0Ci0JCQkJCSAgTlVMTCwJCQkJCS8vIFJTTiBJRSBub3QgdXNlZCBpbiBtZXNzYWdlIDQKLQkJCQkJICAwLAotCQkJCQkgICZFQVBPTFBLVCk7Ci0KLQkvLyBVcGRhdGUgV3BhU3RhdGUKLQlwRW50cnktPldwYVN0YXRlID0gQVNfUFRLSU5JVERPTkU7Ci0KLQkvLyBVcGRhdGUgcGFpcndpc2Uga2V5Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCVBDSVBIRVJfS0VZIHBTaGFyZWRLZXk7Ci0KLQkJcFNoYXJlZEtleSA9ICZwQWQtPlNoYXJlZEtleVtCU1MwXVswXTsKLQotCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QVEssIHBFbnRyeS0+UFRLLCBMRU5fUFRLKTsKLQotCQkvLyBQcmVwYXJlIHBhaXItd2lzZSBrZXkgaW5mb3JtYXRpb24gaW50byBzaGFyZWQga2V5IHRhYmxlCi0JCU5kaXNaZXJvTWVtb3J5KHBTaGFyZWRLZXksIHNpemVvZihDSVBIRVJfS0VZKSk7Ci0JCXBTaGFyZWRLZXktPktleUxlbiA9IExFTl9US0lQX0VLOwotCSAgICBOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5LZXksICZwQWQtPlN0YUNmZy5QVEtbMzJdLCBMRU5fVEtJUF9FSyk7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPlJ4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4XSwgTEVOX1RLSVBfUlhNSUNLKTsKLQkJTmRpc01vdmVNZW1vcnkocFNoYXJlZEtleS0+VHhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDgrTEVOX1RLSVBfUlhNSUNLXSwgTEVOX1RLSVBfVFhNSUNLKTsKLQotCQkvLyBEZWNpZGUgaXRzIENoaXBlckFsZwotCQlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQotCQkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7Ci0JCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQkJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9BRVM7Ci0JCWVsc2UKLQkJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9OT05FOwotCi0JCS8vIFVwZGF0ZSB0aGVzZSByZWxhdGVkIGluZm9ybWF0aW9uIHRvIE1BQ19UQUJMRV9FTlRSWQotCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKLQkJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5LZXksICZwQWQtPlN0YUNmZy5QVEtbMzJdLCBMRU5fVEtJUF9FSyk7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuUnhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDhdLCBMRU5fVEtJUF9SWE1JQ0spOwotCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlR4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4K0xFTl9US0lQX1JYTUlDS10sIExFTl9US0lQX1RYTUlDSyk7Ci0JCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcFNoYXJlZEtleS0+Q2lwaGVyQWxnOwotCi0JCS8vIFVwZGF0ZSBwYWlyd2lzZSBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCi0JCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCi0JCQkJCQkJICBCU1MwLAotCQkJCQkJCSAgMCwKLQkJCQkJCQkgIHBTaGFyZWRLZXktPkNpcGhlckFsZywKLQkJCQkJCQkgIHBTaGFyZWRLZXktPktleSwKLQkJCQkJCQkgIHBTaGFyZWRLZXktPlR4TWljLAotCQkJCQkJCSAgcFNoYXJlZEtleS0+UnhNaWMpOwotCi0JCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQotCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKLQkJCQkJCQkJICBCU1MwLAotCQkJCQkJCQkgIDAsCi0JCQkJCQkJCSAgcFNoYXJlZEtleS0+Q2lwaGVyQWxnLAotCQkJCQkJCQkgIHBFbnRyeSk7Ci0KLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkvLyBvcGVuIDgwMi4xeCBwb3J0IGNvbnRyb2wgYW5kIHByaXZhY3kgZmlsdGVyCi0JaWYgKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSyB8fAotCQlwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCi0JewotCQlwRW50cnktPlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7Ci0JCXBFbnRyeS0+UHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyQWNjZXB0QWxsOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKLQkgICAgLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKLQkgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlclBhaXJNc2czQWN0aW9uOiBBdXRoTW9kZSglcykgUGFpcndpc2VDaXBoZXIoJXMpIEdyb3VwQ2lwaGVyKCVzKSBcbiIsCi0JCQkJCQkJCQlHZXRBdXRoTW9kZShwRW50cnktPkF1dGhNb2RlKSwKLQkJCQkJCQkJCUdldEVuY3J5cHRUeXBlKHBFbnRyeS0+V2VwU3RhdHVzKSwKLQkJCQkJCQkJCUdldEVuY3J5cHRUeXBlKGdyb3VwX2NpcGhlcikpKTsKLQl9Ci0JZWxzZQotCXsKLQl9Ci0KLQkvLyBJbml0IDgwMi4zIGhlYWRlciBhbmQgc2VuZCBvdXQKLQlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEVudHJ5LT5BZGRyLCBwQ3VycmVudEFkZHIsIEVBUE9MKTsKLQlSVE1QVG9XaXJlbGVzc1N0YShwQWQsIHBFbnRyeSwKLQkJCQkJICBIZWFkZXI4MDJfMywgc2l6ZW9mKEhlYWRlcjgwMl8zKSwKLQkJCQkJICAoUFVDSEFSKSZFQVBPTFBLVCwKLQkJCQkJICBDT05WX0FSUkFSWV9UT19VSU5UMTYoRUFQT0xQS1QuQm9keV9MZW4pICsgNCwgVFJVRSk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IFBlZXJQYWlyTXNnM0FjdGlvbjogc2VuZCBNc2c0IG9mIDQtd2F5IFxuIikpOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFdoZW4gcmVjZWl2aW5nIHRoZSBsYXN0IHBhY2tldCBvZiA0LXdheSBwYWlyd2lzZWtleSBoYW5kc2hha2UuCi0gICAgICAgIEluaXRpbGl6ZSAyLXdheSBncm91cGtleSBoYW5kc2hha2UgZm9sbG93aW5nLgotICAgIFJldHVybjoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUGVlclBhaXJNc2c0QWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKQotewotCVBFQVBPTF9QQUNLRVQJCXBNc2c0OwotICAgIFBIRUFERVJfODAyXzExICAgICAgcEhlYWRlcjsKLSAgICBVSU5UCQlNc2dMZW47Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICBDYW5jZWxsZWQ7Ci0JVUNIQVIJCQkJZ3JvdXBfY2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBQZWVyUGFpck1zZzRBY3Rpb25cbiIpKTsKLQotICAgIGRvCi0gICAgewotICAgICAgICBpZiAoKCFwRW50cnkpIHx8ICghcEVudHJ5LT5WYWxpZEFzQ0xJKSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGlmIChFbGVtLT5Nc2dMZW4gPCAoTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgTEVOR1RIX0VBUE9MX0ggKyBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRSAtIDIgKSApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAocEVudHJ5LT5XcGFTdGF0ZSA8IEFTX1BUS0lOSVRfTkVHT1RJQVRJTkcpCi0gICAgICAgICAgICBicmVhazsKLQotCi0gICAgICAgIC8vIHBvaW50ZXIgdG8gODAyLjExIGhlYWRlcgotICAgICAgICBwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKUVsZW0tPk1zZzsKLQotCQkvLyBza2lwIDgwMi4xMV9oZWFkZXIoMjQtYnl0ZSkgYW5kIExMQ19oZWFkZXIoOCkKLQkJcE1zZzQgPSAoUEVBUE9MX1BBQ0tFVCkmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSF07Ci0JCU1zZ0xlbiA9IEVsZW0tPk1zZ0xlbiAtIExFTkdUSF84MDJfMTEgLSBMRU5HVEhfODAyXzFfSDsKLQotICAgICAgICAvLyBTYW5pdHkgQ2hlY2sgcGVlciBQYWlyd2lzZSBtZXNzYWdlIDQgLSBSZXBsYXkgQ291bnRlciwgTUlDCi0JCWlmIChQZWVyV3BhTWVzc2FnZVNhbml0eShwQWQsIHBNc2c0LCBNc2dMZW4sIEVBUE9MX1BBSVJfTVNHXzQsIHBFbnRyeSkgPT0gRkFMU0UpCi0JCQlicmVhazsKLQotICAgICAgICAvLyAzLiB1c2VzIHRoZSBNTE1FLlNFVEtFWVMucmVxdWVzdCB0byBjb25maWd1cmUgUFRLIGludG8gTUFDCi0gICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwRW50cnktPlBhaXJ3aXNlS2V5LCBzaXplb2YoQ0lQSEVSX0tFWSkpOwotCi0JCS8vIHJlc2V0IElWRUlWIGluIEFzaWMKLQkJQXNpY1VwZGF0ZVdDSURJVkVJVihwQWQsIHBFbnRyeS0+QWlkLCAxLCAwKTsKLQotICAgICAgICBwRW50cnktPlBhaXJ3aXNlS2V5LktleUxlbiA9IExFTl9US0lQX0VLOwotICAgICAgICBOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LktleSwgJnBFbnRyeS0+UFRLWzMyXSwgTEVOX1RLSVBfRUspOwotICAgICAgICBOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlJ4TWljLCAmcEVudHJ5LT5QVEtbVEtJUF9BUF9SWE1JQ0tfT0ZGU0VUXSwgTEVOX1RLSVBfUlhNSUNLKTsKLSAgICAgICAgTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5UeE1pYywgJnBFbnRyeS0+UFRLW1RLSVBfQVBfVFhNSUNLX09GRlNFVF0sIExFTl9US0lQX1RYTUlDSyk7Ci0KLQkJLy8gU2V0IHBhaXJ3aXNlIGtleSB0byBBc2ljCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0gICAgICAgICAgICBpZiAocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLSAgICAgICAgICAgICAgICBwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9US0lQOwotICAgICAgICAgICAgZWxzZSBpZiAocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLSAgICAgICAgICAgICAgICBwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9BRVM7Ci0KLQkJCS8vIEFkZCBQYWlyLXdpc2Uga2V5IHRvIEFzaWMKLSAgICAgICAgICAgIEFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KAotICAgICAgICAgICAgICAgIHBBZCwKLSAgICAgICAgICAgICAgICBwRW50cnktPkFkZHIsCi0gICAgICAgICAgICAgICAgKFVDSEFSKXBFbnRyeS0+QWlkLAotICAgICAgICAgICAgICAgICZwRW50cnktPlBhaXJ3aXNlS2V5KTsKLQotCQkJLy8gdXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBlbnRyeQotCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeSgKLQkJCQlwQWQsCi0JCQkJcEVudHJ5LT5hcGlkeCwKLQkJCQkwLAotCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnLAotCQkJCXBFbnRyeSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyA0LiB1cGdyYWRlIHN0YXRlCi0gICAgICAgIHBFbnRyeS0+UHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyQWNjZXB0QWxsOwotICAgICAgICBwRW50cnktPldwYVN0YXRlID0gQVNfUFRLSU5JVERPTkU7Ci0JCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQotCi0JCWlmIChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIgfHwKLQkJCXBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKLQkJewotCQkJcEVudHJ5LT5HVEtTdGF0ZSA9IFJFS0VZX0VTVEFCTElTSEVEOwotCQkJUlRNUENhbmNlbFRpbWVyKCZwRW50cnktPlJldHJ5VGltZXIsICZDYW5jZWxsZWQpOwotCi0KLQkJCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3Igc2V0IGtleSBkb25lIFdQQTIKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TRVRfS0VZX0RPTkVfV1BBMl9FVkVOVF9GTEFHLCBwRW50cnktPkFkZHIsIHBFbnRyeS0+YXBpZHgsIDApOwotCi0JICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiQVAgU0VUS0VZUyBET05FIC0gV1BBMiwgQXV0aE1vZGUoJWQpPSVzLCBXZXBTdGF0dXMoJWQpPSVzLCBHcm91cFdlcFN0YXR1cyglZCk9JXNcblxuIiwKLQkJCQkJCQkJCXBFbnRyeS0+QXV0aE1vZGUsIEdldEF1dGhNb2RlKHBFbnRyeS0+QXV0aE1vZGUpLAotCQkJCQkJCQkJcEVudHJ5LT5XZXBTdGF0dXMsIEdldEVuY3J5cHRUeXBlKHBFbnRyeS0+V2VwU3RhdHVzKSwKLQkJCQkJCQkJCWdyb3VwX2NpcGhlciwKLQkJCQkJCQkJCUdldEVuY3J5cHRUeXBlKGdyb3VwX2NpcGhlcikpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJLy8gNS4gaW5pdCBHcm91cCAyLXdheSBoYW5kc2hha2UgaWYgbmVjZXNzYXJ5LgotCSAgICAgICAgV1BBU3RhcnQyV2F5R3JvdXBIUyhwQWQsIHBFbnRyeSk7Ci0KLQkJcEVudHJ5LT5SZVRyeUNvdW50ZXIgPSBHUk9VUF9NU0cxX1JFVFJZX1RJTUVSX0NUUjsKLQkJCVJUTVBNb2RUaW1lcigmcEVudHJ5LT5SZXRyeVRpbWVyLCBQRUVSX01TRzNfUkVUUllfRVhFQ19JTlRWKTsKLQkJfQotICAgIH13aGlsZShGQUxTRSk7Ci0KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBUaGlzIGlzIGEgZnVuY3Rpb24gdG8gc2VuZCB0aGUgZmlyc3QgcGFja2V0IG9mIDItd2F5IGdyb3Vwa2V5IGhhbmRzaGFrZQotICAgIFJldHVybjoKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBXUEFTdGFydDJXYXlHcm91cEhTKAotICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSkKLXsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKLQlVQ0hBUgkJCQlUeFRzY1s2XTsKLSAgICBFQVBPTF9QQUNLRVQJRUFQT0xQS1Q7Ci0JVUNIQVIJCQkJZ3JvdXBfY2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCVVDSEFSCQkJCWRlZmF1bHRfa2V5ID0gMDsKLQlQVUlOVDgJCQkJZ25vbmNlX3B0ciA9IE5VTEw7Ci0JUFVJTlQ4CQkJCWd0a19wdHIgPSBOVUxMOwotCVBVSU5UOAkJCQlwQnNzaWQgPSBOVUxMOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBXUEFTdGFydDJXYXlHcm91cEhTXG4iKSk7Ci0KLSAgICBpZiAoKCFwRW50cnkpIHx8ICghcEVudHJ5LT5WYWxpZEFzQ0xJKSkKLSAgICAgICAgcmV0dXJuOwotCi0KLSAgICBkbwotICAgIHsKLSAgICAgICAgLy8gSW5jcmVtZW50IHJlcGxheSBjb3VudGVyIGJ5IDEKLQkJQUREX09ORV9Ub182NEJJVF9WQVIocEVudHJ5LT5SX0NvdW50ZXIpOwotCi0JCS8vIENvbnN0cnVjdCBFQVBvTCBtZXNzYWdlIC0gR3JvdXAgTXNnIDEKLQkJTmRpc1plcm9NZW1vcnkoJkVBUE9MUEtULCBzaXplb2YoRUFQT0xfUEFDS0VUKSk7Ci0JCUNvbnN0cnVjdEVhcG9sTXNnKHBFbnRyeSwKLQkJCQkJCSAgZ3JvdXBfY2lwaGVyLAotCQkJCQkJICBFQVBPTF9HUk9VUF9NU0dfMSwKLQkJCQkJCSAgZGVmYXVsdF9rZXksCi0JCQkJCQkgIChVQ0hBUiAqKWdub25jZV9wdHIsCi0JCQkJCQkgIFR4VHNjLAotCQkJCQkJICAoVUNIQVIgKilndGtfcHRyLAotCQkJCQkJICBOVUxMLAotCQkJCQkJICAwLAotCQkJCQkJICAmRUFQT0xQS1QpOwotCi0JCS8vIE1ha2Ugb3V0Z29pbmcgZnJhbWUKLSAgICAgICAgTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBFbnRyeS0+QWRkciwgcEJzc2lkLCBFQVBPTCk7Ci0gICAgICAgIFJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgcEVudHJ5LAotCQkJCQkJICBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLAotCQkJCQkJICAoUFVDSEFSKSZFQVBPTFBLVCwKLQkJCQkJCSAgQ09OVl9BUlJBUllfVE9fVUlOVDE2KEVBUE9MUEtULkJvZHlfTGVuKSArIDQsIEZBTFNFKTsKLQotCi0KLSAgICB9d2hpbGUgKEZBTFNFKTsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gV1BBU3RhcnQyV2F5R3JvdXBIUyA6IHNlbmQgb3V0IEdyb3VwIE1lc3NhZ2UgMSBcbiIpKTsKLQotICAgIHJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVByb2Nlc3MgR3JvdXAga2V5IDItd2F5IGhhbmRzaGFraW5nCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCi0JCUVsZW0JCU1lc3NhZ2UgYm9keQotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlQZWVyR3JvdXBNc2cxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKQotewotICAgIFVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbMTRdOwotCUVBUE9MX1BBQ0tFVAkJRUFQT0xQS1Q7Ci0JUEVBUE9MX1BBQ0tFVAkJcEdyb3VwOwotCVVJTlQJCQlNc2dMZW47Ci0JQk9PTEVBTiAgICAgICAgICAgICBDYW5jZWxsZWQ7Ci0JVUNIQVIJCQkJZGVmYXVsdF9rZXkgPSAwOwotCVVDSEFSCQkJCWdyb3VwX2NpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQlQVUlOVDgJCQkJcEN1cnJlbnRBZGRyID0gTlVMTDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gUGVlckdyb3VwTXNnMUFjdGlvbiBcbiIpKTsKLQotCWlmICgoIXBFbnRyeSkgfHwgKCghcEVudHJ5LT5WYWxpZEFzQ0xJKSAmJiAoIXBFbnRyeS0+VmFsaWRBc0FwQ2xpKSkpCi0gICAgICAgIHJldHVybjsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlwQ3VycmVudEFkZHIgPSBwQWQtPkN1cnJlbnRBZGRyZXNzOwotCQlncm91cF9jaXBoZXIgPSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcjsKLQkJZGVmYXVsdF9rZXkgPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JLy8gUHJvY2VzcyBHcm91cCBNZXNzYWdlIDEgZnJhbWUuIHNraXAgODAyLjExIGhlYWRlcigyNCkgJiBMTENfU05BUCBoZWFkZXIoOCkKLQlwR3JvdXAgPSAoUEVBUE9MX1BBQ0tFVCkgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOwotCU1zZ0xlbiA9IEVsZW0tPk1zZ0xlbiAtIExFTkdUSF84MDJfMTEgLSBMRU5HVEhfODAyXzFfSDsKLQotCS8vIFNhbml0eSBDaGVjayBwZWVyIGdyb3VwIG1lc3NhZ2UgMSAtIFJlcGxheSBDb3VudGVyLCBNSUMsIFJTTklFCi0JaWYgKFBlZXJXcGFNZXNzYWdlU2FuaXR5KHBBZCwgcEdyb3VwLCBNc2dMZW4sIEVBUE9MX0dST1VQX01TR18xLCBwRW50cnkpID09IEZBTFNFKQotCQlyZXR1cm47Ci0KLQkvLyBkZWxldGUgcmV0cnkgdGltZXIKLQlSVE1QQ2FuY2VsVGltZXIoJnBFbnRyeS0+UmV0cnlUaW1lciwgJkNhbmNlbGxlZCk7Ci0KLQkvLyBTYXZlIFJlcGxheSBjb3VudGVyLCBpdCB3aWxsIHVzZSB0byBjb25zdHJ1Y3QgbWVzc2FnZSAyCi0JTmRpc01vdmVNZW1vcnkocEVudHJ5LT5SX0NvdW50ZXIsIHBHcm91cC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKLQotCS8vIENvbnN0cnVjdCBFQVBvTCBtZXNzYWdlIC0gR3JvdXAgTXNnIDIKLQlOZGlzWmVyb01lbW9yeSgmRUFQT0xQS1QsIHNpemVvZihFQVBPTF9QQUNLRVQpKTsKLQlDb25zdHJ1Y3RFYXBvbE1zZyhwRW50cnksCi0JCQkJCSAgZ3JvdXBfY2lwaGVyLAotCQkJCQkgIEVBUE9MX0dST1VQX01TR18yLAotCQkJCQkgIGRlZmF1bHRfa2V5LAotCQkJCQkgIE5VTEwsCQkJCQkvLyBOb25jZSBub3QgdXNlZAotCQkJCQkgIE5VTEwsCQkJCQkvLyBUeFJTQyBub3QgdXNlZAotCQkJCQkgIE5VTEwsCQkJCQkvLyBHVEsgbm90IHVzZWQKLQkJCQkJICBOVUxMLAkJCQkJLy8gUlNOIElFIG5vdCB1c2VkCi0JCQkJCSAgMCwKLQkJCQkJICAmRUFQT0xQS1QpOwotCi0gICAgLy8gb3BlbiA4MDIuMXggcG9ydCBjb250cm9sIGFuZCBwcml2YWN5IGZpbHRlcgotCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQlwRW50cnktPlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbDsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKLSAgICAvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQotICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyR3JvdXBNc2cxQWN0aW9uOiBBdXRoTW9kZSglcykgUGFpcndpc2VDaXBoZXIoJXMpIEdyb3VwQ2lwaGVyKCVzKSBcbiIsCi0JCQkJCQkJCQlHZXRBdXRoTW9kZShwRW50cnktPkF1dGhNb2RlKSwKLQkJCQkJCQkJCUdldEVuY3J5cHRUeXBlKHBFbnRyeS0+V2VwU3RhdHVzKSwKLQkJCQkJCQkJCUdldEVuY3J5cHRUeXBlKGdyb3VwX2NpcGhlcikpKTsKLQotCS8vIGluaXQgaGVhZGVyIGFuZCBGaWxsIFBhY2tldCBhbmQgc2VuZCBNc2cgMiB0byBhdXRoZW50aWNhdG9yCi0JTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBFbnRyeS0+QWRkciwgcEN1cnJlbnRBZGRyLCBFQVBPTCk7Ci0JUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBwRW50cnksCi0JCQkJCSAgSGVhZGVyODAyXzMsIHNpemVvZihIZWFkZXI4MDJfMyksCi0JCQkJCSAgKFBVQ0hBUikmRUFQT0xQS1QsCi0JCQkJCSAgQ09OVl9BUlJBUllfVE9fVUlOVDE2KEVBUE9MUEtULkJvZHlfTGVuKSArIDQsIEZBTFNFKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gUGVlckdyb3VwTXNnMUFjdGlvbjogc25lZCBncm91cCBtZXNzYWdlIDJcbiIpKTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBXaGVuIHJlY2VpdmluZyB0aGUgbGFzdCBwYWNrZXQgb2YgMi13YXkgZ3JvdXBrZXkgaGFuZHNoYWtlLgotICAgIFJldHVybjoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUGVlckdyb3VwTXNnMkFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLSAgICBJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCi0gICAgSU4gVk9JRCAgICAgICAgICAgICAqTXNnLAotICAgIElOIFVJTlQgICAgICAgICAgICAgTXNnTGVuKQotewotICAgIFVJTlQJCUxlbjsKLSAgICBQVUNIQVIJCXBEYXRhOwotICAgIEJPT0xFQU4JCUNhbmNlbGxlZDsKLQlQRUFQT0xfUEFDS0VUICAgICAgIHBNc2cyOwotCVVDSEFSCQkJCWdyb3VwX2NpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gUGVlckdyb3VwTXNnMkFjdGlvbiBcbiIpKTsKLQotICAgIGRvCi0gICAgewotICAgICAgICBpZiAoKCFwRW50cnkpIHx8ICghcEVudHJ5LT5WYWxpZEFzQ0xJKSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGlmIChNc2dMZW4gPCAoTEVOR1RIXzgwMl8xX0ggKyBMRU5HVEhfRUFQT0xfSCArIHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFIC0gMikpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAocEVudHJ5LT5XcGFTdGF0ZSAhPSBBU19QVEtJTklURE9ORSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0KLSAgICAgICAgcERhdGEgPSAoUFVDSEFSKU1zZzsKLQkJcE1zZzIgPSAoUEVBUE9MX1BBQ0tFVCkgKHBEYXRhICsgTEVOR1RIXzgwMl8xX0gpOwotICAgICAgICBMZW4gPSBNc2dMZW4gLSBMRU5HVEhfODAyXzFfSDsKLQotCQkvLyBTYW5pdHkgQ2hlY2sgcGVlciBncm91cCBtZXNzYWdlIDIgLSBSZXBsYXkgQ291bnRlciwgTUlDCi0JCWlmIChQZWVyV3BhTWVzc2FnZVNhbml0eShwQWQsIHBNc2cyLCBMZW4sIEVBUE9MX0dST1VQX01TR18yLCBwRW50cnkpID09IEZBTFNFKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLy8gMy4gIHVwZ3JhZGUgc3RhdGUKLQotCQlSVE1QQ2FuY2VsVGltZXIoJnBFbnRyeS0+UmV0cnlUaW1lciwgJkNhbmNlbGxlZCk7Ci0gICAgICAgIHBFbnRyeS0+R1RLU3RhdGUgPSBSRUtFWV9FU1RBQkxJU0hFRDsKLQotCQlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCi0JCXsKLQkJCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3Igc2V0IGtleSBkb25lIFdQQTIKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TRVRfS0VZX0RPTkVfV1BBMl9FVkVOVF9GTEFHLCBwRW50cnktPkFkZHIsIHBFbnRyeS0+YXBpZHgsIDApOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiQVAgU0VUS0VZUyBET05FIC0gV1BBMiwgQXV0aE1vZGUoJWQpPSVzLCBXZXBTdGF0dXMoJWQpPSVzLCBHcm91cFdlcFN0YXR1cyglZCk9JXNcblxuIiwKLQkJCQkJCQkJCQlwRW50cnktPkF1dGhNb2RlLCBHZXRBdXRoTW9kZShwRW50cnktPkF1dGhNb2RlKSwKLQkJCQkJCQkJCQlwRW50cnktPldlcFN0YXR1cywgR2V0RW5jcnlwdFR5cGUocEVudHJ5LT5XZXBTdGF0dXMpLAotCQkJCQkJCQkJCWdyb3VwX2NpcGhlciwgR2V0RW5jcnlwdFR5cGUoZ3JvdXBfY2lwaGVyKSkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBzZXQga2V5IGRvbmUgV1BBCi0JCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU0VUX0tFWV9ET05FX1dQQTFfRVZFTlRfRkxBRywgcEVudHJ5LT5BZGRyLCBwRW50cnktPmFwaWR4LCAwKTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiQVAgU0VUS0VZUyBET05FIC0gV1BBMSwgQXV0aE1vZGUoJWQpPSVzLCBXZXBTdGF0dXMoJWQpPSVzLCBHcm91cFdlcFN0YXR1cyglZCk9JXNcblxuIiwKLQkJCQkJCQkJCQlwRW50cnktPkF1dGhNb2RlLCBHZXRBdXRoTW9kZShwRW50cnktPkF1dGhNb2RlKSwKLQkJCQkJCQkJCQlwRW50cnktPldlcFN0YXR1cywgR2V0RW5jcnlwdFR5cGUocEVudHJ5LT5XZXBTdGF0dXMpLAotCQkJCQkJCQkJCWdyb3VwX2NpcGhlciwgR2V0RW5jcnlwdFR5cGUoZ3JvdXBfY2lwaGVyKSkpOwotCQl9Ci0gICAgfXdoaWxlKEZBTFNFKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUNsYXNzaWZ5IFdQQSBFQVAgbWVzc2FnZSB0eXBlCi0KLQlBcmd1bWVudHM6Ci0JCUVBUFR5cGUJCVZhbHVlIG9mIEVBUCBtZXNzYWdlIHR5cGUKLQkJTXNnVHlwZQkJSW50ZXJuYWwgTWVzc2FnZSBkZWZpbml0aW9uIGZvciBNTE1FIHN0YXRlIG1hY2hpbmUKLQotCVJldHVybiBWYWx1ZToKLQkJVFJVRQkJRm91bmQgYXBwcm9wcmlhdGUgbWVzc2FnZSB0eXBlCi0JCUZBTFNFCQlObyBhcHByb3ByaWF0ZSBtZXNzYWdlIHR5cGUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQkJQWxsIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVmaW5lZCBpbiB3cGEuaAotCQlGb3Igc3VwcGxpY2FudCwgdGhlcmUgaXMgb25seSBFQVBPTCBLZXkgbWVzc2FnZSBhdmFsaWFibGUKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4JV3BhTXNnVHlwZVN1YnN0KAotCUlOCVVDSEFSCUVBUFR5cGUsCi0JT1VUCUlOVAkJKk1zZ1R5cGUpCi17Ci0Jc3dpdGNoIChFQVBUeXBlKQotCXsKLQkJY2FzZSBFQVBQYWNrZXQ6Ci0JCQkqTXNnVHlwZSA9IE1UMl9FQVBQYWNrZXQ7Ci0JCQlicmVhazsKLQkJY2FzZSBFQVBPTFN0YXJ0OgotCQkJKk1zZ1R5cGUgPSBNVDJfRUFQT0xTdGFydDsKLQkJCWJyZWFrOwotCQljYXNlIEVBUE9MTG9nb2ZmOgotCQkJKk1zZ1R5cGUgPSBNVDJfRUFQT0xMb2dvZmY7Ci0JCQlicmVhazsKLQkJY2FzZSBFQVBPTEtleToKLQkJCSpNc2dUeXBlID0gTVQyX0VBUE9MS2V5OwotCQkJYnJlYWs7Ci0JCWNhc2UgRUFQT0xBU0ZBbGVydDoKLQkJCSpNc2dUeXBlID0gTVQyX0VBUE9MQVNGQWxlcnQ7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBGQUxTRTsKLQl9Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlUaGUgcHNldWRvLXJhbmRvbSBmdW5jdGlvbihQUkYpIHRoYXQgaGFzaGVzIHZhcmlvdXMgaW5wdXRzIHRvCi0JCWRlcml2ZSBhIHBzZXVkby1yYW5kb20gdmFsdWUuIFRvIGFkZCBsaXZlbmVzcyB0byB0aGUgcHNldWRvLXJhbmRvbQotCQl2YWx1ZSwgYSBub25jZSBzaG91bGQgYmUgb25lIG9mIHRoZSBpbnB1dHMuCi0KLQkJSXQgaXMgdXNlZCB0byBnZW5lcmF0ZSBQVEssIEdUSyBvciBzb21lIHNwZWNpZmljIHJhbmRvbSB2YWx1ZS4KLQotCUFyZ3VtZW50czoKLQkJVUNIQVIJKmtleSwJCS0JdGhlIGtleSBtYXRlcmlhbCBmb3IgSE1BQ19TSEExIHVzZQotCQlJTlQJCWtleV9sZW4JCS0JdGhlIGxlbmd0aCBvZiBrZXkKLQkJVUNIQVIJKnByZWZpeAkJLQlhIHByZWZpeCBsYWJlbAotCQlJTlQJCXByZWZpeF9sZW4JLQl0aGUgbGVuZ3RoIG9mIHRoZSBsYWJlbAotCQlVQ0hBUgkqZGF0YQkJLQlhIHNwZWNpZmljIGRhdGEgd2l0aCB2YXJpYWJsZSBsZW5ndGgKLQkJSU5UCQlkYXRhX2xlbgktCXRoZSBsZW5ndGggb2YgYSBzcGVjaWZpYyBkYXRhCi0JCUlOVAkJbGVuCQkJLQl0aGUgb3V0cHV0IGxlbmdodAotCi0JUmV0dXJuIFZhbHVlOgotCQlVQ0hBUgkqb3V0cHV0CQktCXRoZSBjYWxjdWxhdGVkIHJlc3VsdAotCi0JTm90ZToKLQkJODAyLjExaS0yMDA0CUFubmV4IEguMwotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlQUkYoCi0JSU4JVUNIQVIJKmtleSwKLQlJTglJTlQJCWtleV9sZW4sCi0JSU4JVUNIQVIJKnByZWZpeCwKLQlJTglJTlQJCXByZWZpeF9sZW4sCi0JSU4JVUNIQVIJKmRhdGEsCi0JSU4JSU5UCQlkYXRhX2xlbiwKLQlPVVQJVUNIQVIJKm91dHB1dCwKLQlJTglJTlQJCWxlbikKLXsKLQlJTlQJCWk7Ci0gICAgVUNIQVIgICAqaW5wdXQ7Ci0JSU5UCQljdXJyZW50aW5kZXggPSAwOwotCUlOVAkJdG90YWxfbGVuOwotCi0JLy8gQWxsb2NhdGUgbWVtb3J5IGZvciBpbnB1dAotCW9zX2FsbG9jX21lbShOVUxMLCAoUFVDSEFSICopJmlucHV0LCAxMDI0KTsKLQotICAgIGlmIChpbnB1dCA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiISEhUFJGOiBubyBtZW1vcnkhISFcbiIpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotCS8vIEdlbmVyYXRlIGNvbmNhdGVuYXRpb24gaW5wdXQKLQlOZGlzTW92ZU1lbW9yeShpbnB1dCwgcHJlZml4LCBwcmVmaXhfbGVuKTsKLQotCS8vIENvbmNhdGVuYXRlIGEgc2luZ2xlIG9jdGV0IGNvbnRhaW5pbmcgMAotCWlucHV0W3ByZWZpeF9sZW5dID0JMDsKLQotCS8vIENvbmNhdGVuYXRlIHNwZWNpZmljIGRhdGEKLQlOZGlzTW92ZU1lbW9yeSgmaW5wdXRbcHJlZml4X2xlbiArIDFdLCBkYXRhLCBkYXRhX2xlbik7Ci0JdG90YWxfbGVuID0JcHJlZml4X2xlbiArIDEgKyBkYXRhX2xlbjsKLQotCS8vIENvbmNhdGVuYXRlIGEgc2luZ2xlIG9jdGV0IGNvbnRhaW5pbmcgMAotCS8vIFRoaXMgb2N0ZXQgc2hhbGwgYmUgdXBkYXRlIGxhdGVyCi0JaW5wdXRbdG90YWxfbGVuXSA9IDA7Ci0JdG90YWxfbGVuKys7Ci0KLQkvLyBJdGVyYXRlIHRvIGNhbGN1bGF0ZSB0aGUgcmVzdWx0IGJ5IGhtYWMtc2hhLTEKLQkvLyBUaGVuIGNvbmNhdGVuYXRlIHRvIGxhc3QgcmVzdWx0Ci0JZm9yCShpID0gMDsJaSA8CShsZW4gKyAxOSkgLyAyMDsgaSsrKQotCXsKLQkJSE1BQ19TSEExKGtleSwga2V5X2xlbiwgaW5wdXQsIHRvdGFsX2xlbiwgJm91dHB1dFtjdXJyZW50aW5kZXhdLCBTSEExX0RJR0VTVF9TSVpFKTsKLQkJY3VycmVudGluZGV4ICs9CTIwOwotCi0JCS8vIHVwZGF0ZSB0aGUgbGFzdCBvY3RldAotCQlpbnB1dFt0b3RhbF9sZW4gLSAxXSsrOwotCX0KLSAgICBvc19mcmVlX21lbShOVUxMLCBpbnB1dCk7Ci19Ci0KLS8qCi0qIEYoUCwgUywgYywgaSkgPSBVMSB4b3IgVTIgeG9yIC4uLiBVYwotKiBVMSA9IFBSRihQLCBTIHx8IEludChpKSkKLSogVTIgPSBQUkYoUCwgVTEpCi0qIFVjID0gUFJGKFAsIFVjLTEpCi0qLwotCi1zdGF0aWMgdm9pZCBGKGNoYXIgKnBhc3N3b3JkLCB1bnNpZ25lZCBjaGFyICpzc2lkLCBpbnQgc3NpZGxlbmd0aCwgaW50IGl0ZXJhdGlvbnMsIGludCBjb3VudCwgdW5zaWduZWQgY2hhciAqb3V0cHV0KQotewotICAgIHVuc2lnbmVkIGNoYXIgZGlnZXN0WzM2XSwgZGlnZXN0MVtTSEExX0RJR0VTVF9TSVpFXTsKLSAgICBpbnQgaSwgajsKLQotICAgIC8qIFUxID0gUFJGKFAsIFMgfHwgaW50KGkpKSAqLwotICAgIG1lbWNweShkaWdlc3QsIHNzaWQsIHNzaWRsZW5ndGgpOwotICAgIGRpZ2VzdFtzc2lkbGVuZ3RoXSA9ICh1bnNpZ25lZCBjaGFyKSgoY291bnQ+PjI0KSAmIDB4ZmYpOwotICAgIGRpZ2VzdFtzc2lkbGVuZ3RoKzFdID0gKHVuc2lnbmVkIGNoYXIpKChjb3VudD4+MTYpICYgMHhmZik7Ci0gICAgZGlnZXN0W3NzaWRsZW5ndGgrMl0gPSAodW5zaWduZWQgY2hhcikoKGNvdW50Pj44KSAmIDB4ZmYpOwotICAgIGRpZ2VzdFtzc2lkbGVuZ3RoKzNdID0gKHVuc2lnbmVkIGNoYXIpKGNvdW50ICYgMHhmZik7Ci0gICAgSE1BQ19TSEExKCh1bnNpZ25lZCBjaGFyKikgcGFzc3dvcmQsIChpbnQpIHN0cmxlbihwYXNzd29yZCksIGRpZ2VzdCwgc3NpZGxlbmd0aCs0LCBkaWdlc3QxLCBTSEExX0RJR0VTVF9TSVpFKTsgLy8gZm9yIFdQQSB1cGRhdGUKLQotICAgIC8qIG91dHB1dCA9IFUxICovCi0gICAgbWVtY3B5KG91dHB1dCwgZGlnZXN0MSwgU0hBMV9ESUdFU1RfU0laRSk7Ci0KLSAgICBmb3IgKGkgPSAxOyBpIDwgaXRlcmF0aW9uczsgaSsrKQotICAgIHsKLSAgICAgICAgLyogVW4gPSBQUkYoUCwgVW4tMSkgKi8KLSAgICAgICAgSE1BQ19TSEExKCh1bnNpZ25lZCBjaGFyKikgcGFzc3dvcmQsIChpbnQpIHN0cmxlbihwYXNzd29yZCksIGRpZ2VzdDEsIFNIQTFfRElHRVNUX1NJWkUsIGRpZ2VzdCwgU0hBMV9ESUdFU1RfU0laRSk7IC8vIGZvciBXUEEgdXBkYXRlCi0gICAgICAgIG1lbWNweShkaWdlc3QxLCBkaWdlc3QsIFNIQTFfRElHRVNUX1NJWkUpOwotCi0gICAgICAgIC8qIG91dHB1dCA9IG91dHB1dCB4b3IgVW4gKi8KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IFNIQTFfRElHRVNUX1NJWkU7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0W2pdIF49IGRpZ2VzdFtqXTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoKLSogcGFzc3dvcmQgLSBhc2NpaSBzdHJpbmcgdXAgdG8gNjMgY2hhcmFjdGVycyBpbiBsZW5ndGgKLSogc3NpZCAtIG9jdGV0IHN0cmluZyB1cCB0byAzMiBvY3RldHMKLSogc3NpZGxlbmd0aCAtIGxlbmd0aCBvZiBzc2lkIGluIG9jdGV0cwotKiBvdXRwdXQgbXVzdCBiZSA0MCBvY3RldHMgaW4gbGVuZ3RoIGFuZCBvdXRwdXRzIDI1NiBiaXRzIG9mIGtleQotKi8KLWludCBQYXNzd29yZEhhc2goUFNUUklORyBwYXNzd29yZCwgUFVDSEFSIHNzaWQsIElOVCBzc2lkbGVuZ3RoLCBQVUNIQVIgb3V0cHV0KQotewotICAgIGlmICgoc3RybGVuKHBhc3N3b3JkKSA+IDYzKSB8fCAoc3NpZGxlbmd0aCA+IDMyKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBGKHBhc3N3b3JkLCBzc2lkLCBzc2lkbGVuZ3RoLCA0MDk2LCAxLCBvdXRwdXQpOwotICAgIEYocGFzc3dvcmQsIHNzaWQsIHNzaWRsZW5ndGgsIDQwOTYsIDIsICZvdXRwdXRbU0hBMV9ESUdFU1RfU0laRV0pOwotICAgIHJldHVybiAxOwotfQotCi0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUl0IHV0aWxpemVzIFBSRi0zODQgb3IgUFJGLTUxMiB0byBkZXJpdmUgc2Vzc2lvbi1zcGVjaWZpYyBrZXlzIGZyb20gYSBQTUsuCi0JCUl0IHNoYWxsIGJlIGNhbGxlZCBieSA0LXdheSBoYW5kc2hha2UgcHJvY2Vzc2luZy4KLQotCUFyZ3VtZW50czoKLQkJcEFkCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAotCQlQTUsJCS0JcG9pbnRlciB0byBQTUsKLQkJQU5vbmNlCS0JcG9pbnRlciB0byBBTm9uY2UKLQkJQUEJCS0JcG9pbnRlciB0byBBdXRoZW50aWNhdG9yIEFkZHJlc3MKLQkJU05vbmNlCS0JcG9pbnRlciB0byBTTm9uY2UKLQkJU0EJCS0JcG9pbnRlciB0byBTdXBwbGljYW50IEFkZHJlc3MKLQkJbGVuCQktCWluZGljYXRlIHRoZSBsZW5ndGggb2YgUFRLIChvY3RldCkKLQotCVJldHVybiBWYWx1ZToKLQkJT3V0cHV0CQlwb2ludGVyIHRvIHRoZSBQVEsKLQotCU5vdGU6Ci0JCVJlZmVyIHRvIElFRUUgODAyLjExaS0yMDA0IDguNS4xLjIKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgV3BhRGVyaXZlUFRLKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCSpQTUssCi0JSU4JVUNIQVIJKkFOb25jZSwKLQlJTglVQ0hBUgkqQUEsCi0JSU4JVUNIQVIJKlNOb25jZSwKLQlJTglVQ0hBUgkqU0EsCi0JT1VUCVVDSEFSCSpvdXRwdXQsCi0JSU4JVUlOVAlsZW4pCi17Ci0JVUNIQVIJY29uY2F0ZW5hdGlvbls3Nl07Ci0JVUlOVAlDdXJyUG9zID0gMDsKLQlVQ0hBUgl0ZW1wWzMyXTsKLQlVQ0hBUglQcmVmaXhbXSA9IHsnUCcsICdhJywgJ2knLCAncicsICd3JywgJ2knLCAncycsICdlJywgJyAnLCAnaycsICdlJywgJ3knLCAnICcsCi0JCQkJCQknZScsICd4JywgJ3AnLCAnYScsICduJywgJ3MnLCAnaScsICdvJywgJ24nfTsKLQotCS8vIGluaXRpYXRlIHRoZSBjb25jYXRlbmF0aW9uIGlucHV0Ci0JTmRpc1plcm9NZW1vcnkodGVtcCwgc2l6ZW9mKHRlbXApKTsKLQlOZGlzWmVyb01lbW9yeShjb25jYXRlbmF0aW9uLCA3Nik7Ci0KLQkvLyBHZXQgc21hbGxlciBhZGRyZXNzCi0JaWYgKFJUTVBDb21wYXJlTWVtb3J5KFNBLCBBQSwgNikgPT0gMSkKLQkJTmRpc01vdmVNZW1vcnkoY29uY2F0ZW5hdGlvbiwgQUEsIDYpOwotCWVsc2UKLQkJTmRpc01vdmVNZW1vcnkoY29uY2F0ZW5hdGlvbiwgU0EsIDYpOwotCUN1cnJQb3MgKz0gNjsKLQotCS8vIEdldCBsYXJnZXIgYWRkcmVzcwotCWlmIChSVE1QQ29tcGFyZU1lbW9yeShTQSwgQUEsIDYpID09IDEpCi0JCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBTQSwgNik7Ci0JZWxzZQotCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgQUEsIDYpOwotCi0JLy8gc3RvcmUgdGhlIGxhcmdlciBtYWMgYWRkcmVzcyBmb3IgYmFja3dhcmQgY29tcGF0aWJsZSBvZgotCS8vIHJhbGluayBwcm9wcmlldGFyeSBTVEEta2V5IGlzc3VlCi0JTmRpc01vdmVNZW1vcnkodGVtcCwgJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIE1BQ19BRERSX0xFTik7Ci0JQ3VyclBvcyArPSA2OwotCi0JLy8gR2V0IHNtYWxsZXIgTm9uY2UKLQlpZiAoUlRNUENvbXBhcmVNZW1vcnkoQU5vbmNlLCBTTm9uY2UsIDMyKSA9PSAwKQotCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgdGVtcCwgMzIpOwkvLyBwYXRjaCBmb3IgcmFsaW5rIHByb3ByaWV0YXJ5IFNUQS1rZXkgaXNzdWUKLQllbHNlIGlmIChSVE1QQ29tcGFyZU1lbW9yeShBTm9uY2UsIFNOb25jZSwgMzIpID09IDEpCi0JCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBTTm9uY2UsIDMyKTsKLQllbHNlCi0JCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBBTm9uY2UsIDMyKTsKLQlDdXJyUG9zICs9IDMyOwotCi0JLy8gR2V0IGxhcmdlciBOb25jZQotCWlmIChSVE1QQ29tcGFyZU1lbW9yeShBTm9uY2UsIFNOb25jZSwgMzIpID09IDApCi0JCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCB0ZW1wLCAzMik7CS8vIHBhdGNoIGZvciByYWxpbmsgcHJvcHJpZXRhcnkgU1RBLWtleSBpc3N1ZQotCWVsc2UgaWYgKFJUTVBDb21wYXJlTWVtb3J5KEFOb25jZSwgU05vbmNlLCAzMikgPT0gMSkKLQkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIEFOb25jZSwgMzIpOwotCWVsc2UKLQkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIFNOb25jZSwgMzIpOwotCUN1cnJQb3MgKz0gMzI7Ci0KLQloZXhfZHVtcCgiY29uY2F0ZW5hdGlvbj0iLCBjb25jYXRlbmF0aW9uLCA3Nik7Ci0KLQkvLyBVc2UgUFJGIHRvIGdlbmVyYXRlIFBUSwotCVBSRihQTUssIExFTl9NQVNURVJfS0VZLCBQcmVmaXgsIDIyLCBjb25jYXRlbmF0aW9uLCA3Niwgb3V0cHV0LCBsZW4pOwotCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlHZW5lcmF0ZSByYW5kb20gbnVtYmVyIGJ5IHNvZnR3YXJlLgotCi0JQXJndW1lbnRzOgotCQlwQWQJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAotCQltYWNBZGRyCS0JcG9pbnRlciB0byBsb2NhbCBNQUMgYWRkcmVzcwotCi0JUmV0dXJuIFZhbHVlOgotCi0JTm90ZToKLQkJODAyLjFpaS0yMDA0ICBBbm5leCBILjUKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJR2VuUmFuZG9tKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJKm1hY0FkZHIsCi0JT1VUCVVDSEFSCQkJKnJhbmRvbSkKLXsKLQlJTlQJCWksIGN1cnI7Ci0JVUNIQVIJbG9jYWxbODBdLCBLZXlDb3VudGVyWzMyXTsKLQlVQ0hBUglyZXN1bHRbODBdOwotCVVMT05HCUN1cnJlbnRUaW1lOwotCVVDSEFSCXByZWZpeFtdID0geydJJywgJ24nLCAnaScsICd0JywgJyAnLCAnQycsICdvJywgJ3UnLCAnbicsICd0JywgJ2UnLCAncid9OwotCi0JLy8gWmVybyB0aGUgcmVsYXRlZCBpbmZvcm1hdGlvbgotCU5kaXNaZXJvTWVtb3J5KHJlc3VsdCwgODApOwotCU5kaXNaZXJvTWVtb3J5KGxvY2FsLCA4MCk7Ci0JTmRpc1plcm9NZW1vcnkoS2V5Q291bnRlciwgMzIpOwotCi0JZm9yCShpID0gMDsJaSA8CTMyOwlpKyspCi0JewotCQkvLyBjb3B5IHRoZSBsb2NhbCBNQUMgYWRkcmVzcwotCQlDT1BZX01BQ19BRERSKGxvY2FsLCBtYWNBZGRyKTsKLQkJY3VyciA9CU1BQ19BRERSX0xFTjsKLQotCQkvLyBjb25jYXRlbmF0ZSB0aGUgY3VycmVudCB0aW1lCi0JCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJkN1cnJlbnRUaW1lKTsKLQkJTmRpc01vdmVNZW1vcnkoJmxvY2FsW2N1cnJdLCAgJkN1cnJlbnRUaW1lLAlzaXplb2YoQ3VycmVudFRpbWUpKTsKLQkJY3VyciArPQlzaXplb2YoQ3VycmVudFRpbWUpOwotCi0JCS8vIGNvbmNhdGVuYXRlIHRoZSBsYXN0IHJlc3VsdAotCQlOZGlzTW92ZU1lbW9yeSgmbG9jYWxbY3Vycl0sICByZXN1bHQsIDMyKTsKLQkJY3VyciArPQkzMjsKLQotCQkvLyBjb25jYXRlbmF0ZSBhIHZhcmlhYmxlCi0JCU5kaXNNb3ZlTWVtb3J5KCZsb2NhbFtjdXJyXSwgICZpLCAgMik7Ci0JCWN1cnIgKz0JMjsKLQotCQkvLyBjYWxjdWxhdGUgdGhlIHJlc3VsdAotCQlQUkYoS2V5Q291bnRlciwgMzIsIHByZWZpeCwxMiwgbG9jYWwsIGN1cnIsIHJlc3VsdCwgMzIpOwotCX0KLQotCU5kaXNNb3ZlTWVtb3J5KHJhbmRvbSwgcmVzdWx0LAkzMik7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlCdWlsZCBjaXBoZXIgc3VpdGUgaW4gUlNOLUlFLgotCQlJdCBvbmx5IHNoYWxsIGJlIGNhbGxlZCBieSBSVE1QTWFrZVJTTklFLgotCi0JQXJndW1lbnRzOgotCQlwQWQJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKLQlFbGVtZW50SUQJLQlpbmRpY2F0ZSB0aGUgV1BBMSBvciBXUEEyCi0JV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQotCQliTWl4Q2lwaGVyCS0JYSBib29sZWFuIHRvIGluZGljYXRlIHRoZSBwYWlyd2lzZSBjaXBoZXIgYW5kIGdyb3VwCi0JCQkJCQljaXBoZXIgYXJlIHRoZSBzYW1lIG9yIG5vdAotCi0JUmV0dXJuIFZhbHVlOgotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyBWT0lEIFJUTVBNYWtlUnNuSWVDaXBoZXIoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4JVUNIQVIJCQlFbGVtZW50SUQsCi0JSU4JVUlOVAkJCVdlcFN0YXR1cywKLQlJTglCT09MRUFOCQkJYk1peENpcGhlciwKLQlJTglVQ0hBUgkJCUZsZXhpYmxlQ2lwaGVyLAotCU9VVAlQVUNIQVIJCQlwUnNuSWUsCi0JT1VUCVVDSEFSCQkJKnJzbl9sZW4pCi17Ci0JVUNIQVIJUGFpcndpc2VDbnQ7Ci0KLQkqcnNuX2xlbiA9IDA7Ci0KLQkvLyBkZWNpZGUgV1BBMiBvciBXUEExCi0JaWYgKEVsZW1lbnRJRCA9PSBXcGEySWUpCi0JewotCQlSU05JRTIJKnBSc25pZV9jaXBoZXIgPSAoUlNOSUUyKilwUnNuSWU7Ci0KLQkJLy8gQXNzaWduIHRoZSB2ZXJzb24gYXMgMQotCQlwUnNuaWVfY2lwaGVyLT52ZXJzaW9uID0gMTsKLQotICAgICAgICBzd2l0Y2ggKFdlcFN0YXR1cykKLSAgICAgICAgewotCQkvLyBUS0lQIG1vZGUKLSAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDoKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfVEtJUCwgNCk7Ci0gICAgICAgICAgICAgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gMTsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEEyX1RLSVAsIDQpOwotICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFMik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQkJCS8vIEFFUyBtb2RlCi0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ6Ci0JCQkJaWYgKGJNaXhDaXBoZXIpCi0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9US0lQLCA0KTsKLQkJCQllbHNlCi0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9DQ01QLCA0KTsKLSAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSAxOwotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQTJfQ0NNUCwgNCk7Ci0gICAgICAgICAgICAgICAgKnJzbl9sZW4gPSBzaXplb2YoUlNOSUUyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotCQkJLy8gVEtJUC1BRVMgbWl4IG1vZGUKLSAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDoKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfVEtJUCwgNCk7Ci0KLQkJCQlQYWlyd2lzZUNudCA9IDE7Ci0JCQkJLy8gSW5zZXJ0IFdQQTIgVEtJUCBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyCi0JCQkJaWYgKE1JWF9DSVBIRVJfV1BBMl9US0lQX09OKEZsZXhpYmxlQ2lwaGVyKSkKLQkJCQl7Ci0JCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEEyX1RLSVAsIDQpOwotCQkJCQkvLyBJbnNlcnQgV1BBMiBBRVMgYXMgdGhlIHNlY29uZGFyeSBwYWlyd2lzZSBjaXBoZXIKLQkJCQkJaWYgKE1JWF9DSVBIRVJfV1BBMl9BRVNfT04oRmxleGlibGVDaXBoZXIpKQotCQkJCQl7Ci0JCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpICsgNCwgT1VJX1dQQTJfQ0NNUCwgNCk7Ci0JCQkJCQlQYWlyd2lzZUNudCA9IDI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJLy8gSW5zZXJ0IFdQQTIgQUVTIGFzIHRoZSBmaXJzdCBwYWlyd2lzZSBjaXBoZXIKLQkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBMl9DQ01QLCA0KTsKLQkJCQl9Ci0KLSAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSBQYWlyd2lzZUNudDsKLSAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRTIpICsgKDQgKiAoUGFpcndpc2VDbnQgLSAxKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmCi0JCQkocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgJiYKLQkJCShwQWQtPlN0YUNmZy5Hcm91cENpcGhlciAhPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkKLQkJewotCQkJVUlOVAlHcm91cENpcGhlciA9IHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyOwotCQkJc3dpdGNoKEdyb3VwQ2lwaGVyKQotCQkJewotCQkJCWNhc2UgTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkOgotCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfV0VQNDAsIDQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQ6Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9XRVAxMDQsIDQpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JCS8vIHN3YXAgZm9yIGJpZy1lbmRpYW4gcGxhdGZvcm0KLQkJcFJzbmllX2NpcGhlci0+dmVyc2lvbiA9IGNwdTJsZTE2KHBSc25pZV9jaXBoZXItPnZlcnNpb24pOwotCSAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSBjcHUybGUxNihwUnNuaWVfY2lwaGVyLT51Y291bnQpOwotCX0KLQllbHNlCi0JewotCQlSU05JRQkqcFJzbmllX2NpcGhlciA9IChSU05JRSopcFJzbkllOwotCi0JCS8vIEFzc2lnbiBPVUkgYW5kIHZlcnNpb24KLQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+b3VpLCBPVUlfV1BBX1ZFUlNJT04sIDQpOwotICAgICAgICBwUnNuaWVfY2lwaGVyLT52ZXJzaW9uID0gMTsKLQotCQlzd2l0Y2ggKFdlcFN0YXR1cykKLQkJewotCQkJLy8gVEtJUCBtb2RlCi0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ6Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfVEtJUCwgNCk7Ci0gICAgICAgICAgICAgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gMTsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEFfVEtJUCwgNCk7Ci0gICAgICAgICAgICAgICAgKnJzbl9sZW4gPSBzaXplb2YoUlNOSUUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0JCQkvLyBBRVMgbW9kZQotICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOgotCQkJCWlmIChiTWl4Q2lwaGVyKQotCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQV9US0lQLCA0KTsKLQkJCQllbHNlCi0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX0NDTVAsIDQpOwotICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IDE7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBX0NDTVAsIDQpOwotICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotCQkJLy8gVEtJUC1BRVMgbWl4IG1vZGUKLSAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDoKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQV9US0lQLCA0KTsKLQotCQkJCVBhaXJ3aXNlQ250ID0gMTsKLQkJCQkvLyBJbnNlcnQgV1BBIFRLSVAgYXMgdGhlIGZpcnN0IHBhaXJ3aXNlIGNpcGhlcgotCQkJCWlmIChNSVhfQ0lQSEVSX1dQQV9US0lQX09OKEZsZXhpYmxlQ2lwaGVyKSkKLQkJCQl7Ci0JCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEFfVEtJUCwgNCk7Ci0JCQkJCS8vIEluc2VydCBXUEEgQUVTIGFzIHRoZSBzZWNvbmRhcnkgcGFpcndpc2UgY2lwaGVyCi0JCQkJCWlmIChNSVhfQ0lQSEVSX1dQQV9BRVNfT04oRmxleGlibGVDaXBoZXIpKQotCQkJCQl7Ci0JCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpICsgNCwgT1VJX1dQQV9DQ01QLCA0KTsKLQkJCQkJCVBhaXJ3aXNlQ250ID0gMjsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkvLyBJbnNlcnQgV1BBIEFFUyBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyCi0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQV9DQ01QLCA0KTsKLQkJCQl9Ci0KLSAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSBQYWlyd2lzZUNudDsKLSAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRSkgKyAoNCAqIChQYWlyd2lzZUNudCAtIDEpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYKLQkJCShwQWQtPlN0YUNmZy5Hcm91cENpcGhlciAhPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgotCQkJKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKQotCQl7Ci0JCQlVSU5UCUdyb3VwQ2lwaGVyID0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXI7Ci0JCQlzd2l0Y2goR3JvdXBDaXBoZXIpCi0JCQl7Ci0JCQkJY2FzZSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQ6Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX1dFUDQwLCA0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkOgotCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQV9XRVAxMDQsIDQpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JCS8vIHN3YXAgZm9yIGJpZy1lbmRpYW4gcGxhdGZvcm0KLQkJcFJzbmllX2NpcGhlci0+dmVyc2lvbiA9IGNwdTJsZTE2KHBSc25pZV9jaXBoZXItPnZlcnNpb24pOwotCSAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSBjcHUybGUxNihwUnNuaWVfY2lwaGVyLT51Y291bnQpOwotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUJ1aWxkIEFLTSBzdWl0ZSBpbiBSU04tSUUuCi0JCUl0IG9ubHkgc2hhbGwgYmUgY2FsbGVkIGJ5IFJUTVBNYWtlUlNOSUUuCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAotCUVsZW1lbnRJRAktCWluZGljYXRlIHRoZSBXUEExIG9yIFdQQTIKLQlBdXRoTW9kZQktCWluZGljYXRlIHRoZSBhdXRoZW50aWNhdGlvbiBtb2RlCi0JCWFwaWR4CQktCWluZGljYXRlIHRoZSBpbnRlcmZhY2UgaW5kZXgKLQotCVJldHVybiBWYWx1ZToKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgVk9JRCBSVE1QTWFrZVJzbkllQUtNKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCVVDSEFSCQkJRWxlbWVudElELAotCUlOCVVJTlQJCQlBdXRoTW9kZSwKLQlJTglVQ0hBUgkJCWFwaWR4LAotCU9VVAlQVUNIQVIJCQlwUnNuSWUsCi0JT1VUCVVDSEFSCQkJKnJzbl9sZW4pCi17Ci0JUlNOSUVfQVVUSAkJKnBSc25pZV9hdXRoOwotCVVDSEFSCQkJQWttQ250ID0gMTsJCS8vIGRlZmF1bHQgYXMgMQotCi0JcFJzbmllX2F1dGggPSAoUlNOSUVfQVVUSCopKHBSc25JZSArICgqcnNuX2xlbikpOwotCi0JLy8gZGVjaWRlIFdQQTIgb3IgV1BBMQotCWlmIChFbGVtZW50SUQgPT0gV3BhMkllKQotCXsKLQotCQlzd2l0Y2ggKEF1dGhNb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI6Ci0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyOgotCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2F1dGgtPmF1dGhbMF0ub3VpLCBPVUlfV1BBMl84MDIxWF9BS00sIDQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s6Ci0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLOgotCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2F1dGgtPmF1dGhbMF0ub3VpLCBPVUlfV1BBMl9QU0tfQUtNLCA0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJQWttQ250ID0gMDsKLQkJCQlicmVhazsKLQotICAgICAgICB9Ci0JfQotCWVsc2UKLQl7Ci0JCXN3aXRjaCAoQXV0aE1vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBOgotICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMjoKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksIE9VSV9XUEFfODAyMVhfQUtNLCA0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s6Ci0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLOgotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwgT1VJX1dQQV9QU0tfQUtNLCA0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotCQkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOgotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwgT1VJX1dQQV9OT05FX0FLTSwgNCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCUFrbUNudCA9IDA7Ci0JCQkJYnJlYWs7Ci0gICAgICAgIH0KLQl9Ci0KLQlwUnNuaWVfYXV0aC0+YWNvdW50ID0gQWttQ250OwotCXBSc25pZV9hdXRoLT5hY291bnQgPSBjcHUybGUxNihwUnNuaWVfYXV0aC0+YWNvdW50KTsKLQotCS8vIHVwZGF0ZSBjdXJyZW50IFJTTklFIGxlbmd0aAotCSgqcnNuX2xlbikgKz0gKHNpemVvZihSU05JRV9BVVRIKSArICg0ICogKEFrbUNudCAtIDEpKSk7Ci0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUJ1aWxkIGNhcGFiaWxpdHkgaW4gUlNOLUlFLgotCQlJdCBvbmx5IHNoYWxsIGJlIGNhbGxlZCBieSBSVE1QTWFrZVJTTklFLgotCi0JQXJndW1lbnRzOgotCQlwQWQJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKLQlFbGVtZW50SUQJLQlpbmRpY2F0ZSB0aGUgV1BBMSBvciBXUEEyCi0JCWFwaWR4CQktCWluZGljYXRlIHRoZSBpbnRlcmZhY2UgaW5kZXgKLQotCVJldHVybiBWYWx1ZToKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgVk9JRCBSVE1QTWFrZVJzbkllQ2FwKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCVVDSEFSCQkJRWxlbWVudElELAotCUlOCVVDSEFSCQkJYXBpZHgsCi0JT1VUCVBVQ0hBUgkJCXBSc25JZSwKLQlPVVQJVUNIQVIJCQkqcnNuX2xlbikKLXsKLQlSU05fQ0FQQUJJTElUSUVTICAgICpwUlNOX0NhcDsKLQotCS8vIGl0IGNvdWxkIGJlIGlnbm9yZWQgaW4gV1BBMSBtb2RlCi0JaWYgKEVsZW1lbnRJRCA9PSBXcGFJZSkKLQkJcmV0dXJuOwotCi0JcFJTTl9DYXAgPSAoUlNOX0NBUEFCSUxJVElFUyopKHBSc25JZSArICgqcnNuX2xlbikpOwotCi0KLQlwUlNOX0NhcC0+d29yZCA9IGNwdTJsZTE2KHBSU05fQ2FwLT53b3JkKTsKLQotCSgqcnNuX2xlbikgKz0gc2l6ZW9mKFJTTl9DQVBBQklMSVRJRVMpOwkvLyB1cGRhdGUgY3VycmVudCBSU05JRSBsZW5ndGgKLQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlCdWlsZCBSU04gSUUgY29udGV4dC4gSXQgaXMgbm90IGluY2x1ZGVkIGVsZW1lbnQtSUQgYW5kIGxlbmd0aC4KLQotCUFyZ3VtZW50czoKLQkJcEFkCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0Ci0JQXV0aE1vZGUJLQlpbmRpY2F0ZSB0aGUgYXV0aGVudGljYXRpb24gbW9kZQotCVdlcFN0YXR1cwktCWluZGljYXRlIHRoZSBlbmNyeXB0aW9uIHR5cGUKLQkJYXBpZHgJCS0JaW5kaWNhdGUgdGhlIGludGVyZmFjZSBpbmRleAotCi0JUmV0dXJuIFZhbHVlOgotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUE1ha2VSU05JRSgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgVUlOVCAgICAgICAgICAgIEF1dGhNb2RlLAotICAgIElOICBVSU5UICAgICAgICAgICAgV2VwU3RhdHVzLAotCUlOCVVDSEFSCQkJYXBpZHgpCi17Ci0JUFVDSEFSCQlwUnNuSWUgPSBOVUxMOwkJCS8vIHByaW1hcnkgUlNOSUUKLQlVQ0hBUgkJKnJzbmllbGVuX2N1cl9wID0gMDsJLy8gdGhlIGxlbmd0aCBvZiB0aGUgcHJpbWFyeSBSU05JRQotCVVDSEFSCQkqcnNuaWVsZW5fZXhfY3VyX3AgPSAwOwkvLyB0aGUgbGVuZ3RoIG9mIHRoZSBzZWNvbmRhcnkgUlNOSUUKLQlVQ0hBUgkJUHJpbWFyeVJzbmllOwotCUJPT0xFQU4JCWJNaXhDaXBoZXIgPSBGQUxTRTsJLy8gaW5kaWNhdGUgdGhlIHBhaXJ3aXNlIGFuZCBncm91cCBjaXBoZXIgYXJlIGRpZmZlcmVudAotCVVDSEFSCQlwX29mZnNldDsKLQlXUEFfTUlYX1BBSVJfQ0lQSEVSCQlGbGV4aWJsZUNpcGhlciA9IFdQQV9US0lQQUVTX1dQQTJfVEtJUEFFUzsJLy8gaXQgcHJvdmlkZSB0aGUgbW9yZSBmbGV4aWJsZSBjaXBoZXIgY29tYmluYXRpb24gaW4gV1BBLVdQQTIgYW5kIFRLSVBBRVMgbW9kZQotCi0JcnNuaWVsZW5fY3VyX3AgPSBOVUxMOwotCXJzbmllbGVuX2V4X2N1cl9wID0gTlVMTDsKLQotCXsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQkJCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKLQkJCXsKLQkJCQlpZiAoQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0JCQl7Ci0JCQkJLy8gU3VwcG9ydCBXUEFQU0sgb3IgV1BBMlBTSyBpbiBTVEEtSW5mcmEgbW9kZQotCQkJCS8vIFN1cHBvcnQgV1BBTm9uZSBpbiBTVEEtQWRob2MgbW9kZQotCQkJCWlmICgoQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgotCQkJCQkoQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKLQkJCQkJKEF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCi0JCQkJCSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIj09PiBSVE1QTWFrZVJTTklFKFNUQSlcbiIpKTsKLQotCQkJLy8gWmVybyBSU05JRSBjb250ZXh0Ci0JCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4gPSAwOwotCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUlNOX0lFLCBNQVhfTEVOX09GX1JTTklFKTsKLQotCQkJLy8gUG9pbnRlciB0byBSU05JRQotCQkJcnNuaWVsZW5fY3VyX3AgPSAmcEFkLT5TdGFDZmcuUlNOSUVfTGVuOwotCQkJcFJzbkllID0gcEFkLT5TdGFDZmcuUlNOX0lFOwotCi0JCQliTWl4Q2lwaGVyID0gcEFkLT5TdGFDZmcuYk1peENpcGhlcjsKLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCX0KLQotCS8vIGluZGljYXRlIHByaW1hcnkgUlNOSUUgYXMgV1BBIG9yIFdQQTIKLQlpZiAoKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKLQkJKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKLQkJKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpIHx8Ci0JCShBdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMikgfHwKLQkJKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLKSkKLQkJUHJpbWFyeVJzbmllID0gV3BhSWU7Ci0JZWxzZQotCQlQcmltYXJ5UnNuaWUgPSBXcGEySWU7Ci0KLQl7Ci0JCS8vIEJ1aWxkIHRoZSBwcmltYXJ5IFJTTklFCi0JCS8vIDEuIGluc2VydCBjaXBoZXIgc3VpdGUKLQkJUlRNUE1ha2VSc25JZUNpcGhlcihwQWQsIFByaW1hcnlSc25pZSwgV2VwU3RhdHVzLCBiTWl4Q2lwaGVyLCBGbGV4aWJsZUNpcGhlciwgcFJzbkllLCAmcF9vZmZzZXQpOwotCi0JCS8vIDIuIGluc2VydCBBS00KLQkJUlRNUE1ha2VSc25JZUFLTShwQWQsIFByaW1hcnlSc25pZSwgQXV0aE1vZGUsIGFwaWR4LCBwUnNuSWUsICZwX29mZnNldCk7Ci0KLQkJLy8gMy4gaW5zZXJ0IGNhcGFiaWxpdHkKLQkJUlRNUE1ha2VSc25JZUNhcChwQWQsIFByaW1hcnlSc25pZSwgYXBpZHgsIHBSc25JZSwgJnBfb2Zmc2V0KTsKLQl9Ci0KLQkvLyA0LiB1cGRhdGUgdGhlIFJTTklFIGxlbmd0aAotCSpyc25pZWxlbl9jdXJfcCA9IHBfb2Zmc2V0OwotCi0JaGV4X2R1bXAoIlRoZSBwcmltYXJ5IFJTTklFIiwgcFJzbkllLCAoKnJzbmllbGVuX2N1cl9wKSk7Ci0KLQotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0JCUNoZWNrIHdoZXRoZXIgdGhlIHJlY2VpdmVkIGZyYW1lIGlzIEVBUCBmcmFtZS4KLQotCUFyZ3VtZW50czoKLQkJcEFkCQkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAotCQlwRW50cnkJCQktCXBvaW50ZXIgdG8gYWN0aXZlIGVudHJ5Ci0JCXBEYXRhCQkJLQl0aGUgcmVjZWl2ZWQgZnJhbWUKLQkJRGF0YUJ5dGVDb3VudAktCXRoZSByZWNlaXZlZCBmcmFtZSdzIGxlbmd0aAotCQlGcm9tV2hpY2hCU1NJRAktCWluZGljYXRlIHRoZSBpbnRlcmZhY2UgaW5kZXgKLQotICAgIFJldHVybjoKLSAgICAgICAgIFRSVUUJCQktCVRoaXMgZnJhbWUgaXMgRUFQIGZyYW1lCi0gICAgICAgICBGQUxTRQkJCS0Jb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1CT09MRUFOIFJUTVBDaGVja1dQQWZyYW1lKAotICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5LAotICAgIElOIFBVQ0hBUiAgICAgICAgICAgcERhdGEsCi0gICAgSU4gVUxPTkcgICAgICAgICAgICBEYXRhQnl0ZUNvdW50LAotCUlOIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCi17Ci0JVUxPTkcJQm9keV9sZW47Ci0JQk9PTEVBTiBDYW5jZWxsZWQ7Ci0KLQotICAgIGlmKERhdGFCeXRlQ291bnQgPCAoTEVOR1RIXzgwMl8xX0ggKyBMRU5HVEhfRUFQT0xfSCkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotCi0JLy8gU2tpcCBMTEMgaGVhZGVyCi0gICAgaWYgKE5kaXNFcXVhbE1lbW9yeShTTkFQXzgwMl8xSCwgcERhdGEsIDYpIHx8Ci0gICAgICAgIC8vIENpc2NvIDEyMDAgQVAgbWF5IHNlbmQgcGFja2V0IHdpdGggU05BUF9CUklER0VfVFVOTkVMCi0gICAgICAgIE5kaXNFcXVhbE1lbW9yeShTTkFQX0JSSURHRV9UVU5ORUwsIHBEYXRhLCA2KSkKLSAgICB7Ci0gICAgICAgIHBEYXRhICs9IDY7Ci0gICAgfQotCS8vIFNraXAgMi1ieXRlcyBFQVBvTCB0eXBlCi0gICAgaWYgKE5kaXNFcXVhbE1lbW9yeShFQVBPTCwgcERhdGEsIDIpKQotLy8JaWYgKCooVUlOVDE2ICopRUFQT0wgPT0gKihVSU5UMTYgKilwRGF0YSkKLSAgICB7Ci0gICAgICAgIHBEYXRhICs9IDI7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgc3dpdGNoICgqKHBEYXRhKzEpKQotICAgIHsKLSAgICAgICAgY2FzZSBFQVBQYWNrZXQ6Ci0JCQlCb2R5X2xlbiA9ICgqKHBEYXRhKzIpPDw4KSB8ICgqKHBEYXRhKzMpKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQLVBhY2tldCBmcmFtZSwgVFlQRSA9IDAsIExlbmd0aCA9ICVsZFxuIiwgQm9keV9sZW4pKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVBUE9MU3RhcnQ6Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MLVN0YXJ0IGZyYW1lLCBUWVBFID0gMSBcbiIpKTsKLQkJCWlmIChwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nICE9IEVBUE9MX1NUQVJUX0RJU0FCTEUpCi0gICAgICAgICAgICB7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNhbmNlbCB0aGUgRW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgXG4iKSk7Ci0gICAgICAgICAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwRW50cnktPkVucXVldWVTdGFydEZvclBTS1RpbWVyLCAmQ2FuY2VsbGVkKTsKLSAgICAgICAgICAgICAgICBwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nID0gRUFQT0xfU1RBUlRfRElTQUJMRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVBUE9MTG9nb2ZmOgotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTExvZ29mZiBmcmFtZSwgVFlQRSA9IDIgXG4iKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFQVBPTEtleToKLQkJCUJvZHlfbGVuID0gKCoocERhdGErMik8PDgpIHwgKCoocERhdGErMykpOwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTC1LZXkgZnJhbWUsIFRZUEUgPSAzLCBMZW5ndGggPSAlbGRcbiIsIEJvZHlfbGVuKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFQVBPTEFTRkFsZXJ0OgotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTEFTRkFsZXJ0IGZyYW1lLCBUWVBFID0gNCBcbiIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0JCVJlcG9ydCB0aGUgRUFQIG1lc3NhZ2UgdHlwZQotCi0JQXJndW1lbnRzOgotCQltc2cJCS0JRUFQT0xfUEFJUl9NU0dfMQotCQkJCQlFQVBPTF9QQUlSX01TR18yCi0JCQkJCUVBUE9MX1BBSVJfTVNHXzMKLQkJCQkJRUFQT0xfUEFJUl9NU0dfNAotCQkJCQlFQVBPTF9HUk9VUF9NU0dfMQotCQkJCQlFQVBPTF9HUk9VUF9NU0dfMgotCi0gICAgUmV0dXJuOgotICAgICAgICAgbWVzc2FnZSB0eXBlIHN0cmluZwotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1QU1RSSU5HIEdldEVhcG9sTXNnVHlwZShDSEFSIG1zZykKLXsKLSAgICBpZihtc2cgPT0gRUFQT0xfUEFJUl9NU0dfMSkKLSAgICAgICAgcmV0dXJuICJQYWlyd2lzZSBNZXNzYWdlIDEiOwotICAgIGVsc2UgaWYobXNnID09IEVBUE9MX1BBSVJfTVNHXzIpCi0gICAgICAgIHJldHVybiAiUGFpcndpc2UgTWVzc2FnZSAyIjsKLQllbHNlIGlmKG1zZyA9PSBFQVBPTF9QQUlSX01TR18zKQotICAgICAgICByZXR1cm4gIlBhaXJ3aXNlIE1lc3NhZ2UgMyI7Ci0JZWxzZSBpZihtc2cgPT0gRUFQT0xfUEFJUl9NU0dfNCkKLSAgICAgICAgcmV0dXJuICJQYWlyd2lzZSBNZXNzYWdlIDQiOwotCWVsc2UgaWYobXNnID09IEVBUE9MX0dST1VQX01TR18xKQotICAgICAgICByZXR1cm4gIkdyb3VwIE1lc3NhZ2UgMSI7Ci0JZWxzZSBpZihtc2cgPT0gRUFQT0xfR1JPVVBfTVNHXzIpCi0gICAgICAgIHJldHVybiAiR3JvdXAgTWVzc2FnZSAyIjsKLSAgICBlbHNlCi0JcmV0dXJuICJJbnZhbGlkIE1lc3NhZ2UiOwotfQotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIENoZWNrIFNhbml0eSBSU04gSUUgb2YgRUFQb0wgbWVzc2FnZQotCi0gICAgQXJndW1lbnRzOgotCi0gICAgUmV0dXJuIFZhbHVlOgotCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1CT09MRUFOIFJUTVBDaGVja1JTTklFKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCi0JSU4gIFVDSEFSICAgICAgICAgICBEYXRhTGVuLAotCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSwKLQlPVVQJVUNIQVIJCQkqT2Zmc2V0KQotewotCVBVQ0hBUiAgICAgICAgICAgICAgcFZJRTsKLQlVQ0hBUiAgICAgICAgICAgICAgIGxlbjsKLQlQRUlEX1NUUlVDVCAgICAgICAgIHBFaWQ7Ci0JQk9PTEVBTgkJCQlyZXN1bHQgPSBGQUxTRTsKLQotCXBWSUUgPSBwRGF0YTsKLQlsZW4JID0gRGF0YUxlbjsKLQkqT2Zmc2V0ID0gMDsKLQotCXdoaWxlIChsZW4gPiBzaXplb2YoUlNOSUUyKSkKLQl7Ci0JCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBWSUU7Ci0JCS8vIFdQQSBSU04gSUUKLQkJaWYgKChwRWlkLT5FaWQgPT0gSUVfV1BBKSAmJiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXUEFfT1VJLCA0KSkpCi0JCXsKLQkJCWlmICgocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEgfHwgcEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCi0JCQkJKE5kaXNFcXVhbE1lbW9yeShwVklFLCBwRW50cnktPlJTTl9JRSwgcEVudHJ5LT5SU05JRV9MZW4pKSAmJgotCQkJCShwRW50cnktPlJTTklFX0xlbiA9PSAocEVpZC0+TGVuICsgMikpKQotCQkJewotCQkJCQlyZXN1bHQgPSBUUlVFOwotCQkJfQotCi0JCQkqT2Zmc2V0ICs9IChwRWlkLT5MZW4gKyAyKTsKLQkJfQotCQkvLyBXUEEyIFJTTiBJRQotCQllbHNlIGlmICgocEVpZC0+RWlkID09IElFX1JTTikgJiYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCArIDIsIFJTTl9PVUksIDMpKSkKLQkJewotCQkJaWYgKChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIgfHwgcEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgotCQkJCShwRWlkLT5FaWQgPT0gcEVudHJ5LT5SU05fSUVbMF0pICYmCi0JCQkJKChwRWlkLT5MZW4gKyAyKSA+PSBwRW50cnktPlJTTklFX0xlbikgJiYKLQkJCQkoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCAmcEVudHJ5LT5SU05fSUVbMl0sIHBFbnRyeS0+UlNOSUVfTGVuIC0gMikpKQotCQkJewotCi0JCQkJCXJlc3VsdCA9IFRSVUU7Ci0JCQl9Ci0KLQkJCSpPZmZzZXQgKz0gKHBFaWQtPkxlbiArIDIpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJYnJlYWs7Ci0JCX0KLQotCQlwVklFICs9IChwRWlkLT5MZW4gKyAyKTsKLQkJbGVuICAtPSAocEVpZC0+TGVuICsgMik7Ci0JfQotCi0KLQlyZXR1cm4gcmVzdWx0OwotCi19Ci0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIFJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgUGFyc2UgS0VZREFUQSBmaWVsZC4gIEtFWURBVEFbXSBNYXkgY29udGFpbiAyIFJTTiBJRSBhbmQgb3B0aW9uYWxseSBHVEsuCi0gICAgR1RLICBpcyBlbmNhcHR1bGF0ZWQgaW4gS0RFIGZvcm1hdCBhdCAgcC44MyA4MDIuMTFpIEQxMAotCi0gICAgQXJndW1lbnRzOgotCi0gICAgUmV0dXJuIFZhbHVlOgotCi0gICAgTm90ZToKLSAgICAgICAgODAyLjExaSBEMTAKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4gUlRNUFBhcnNlRWFwb2xLZXlEYXRhKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcEtleURhdGEsCi0JSU4gIFVDSEFSICAgICAgICAgICBLZXlEYXRhTGVuLAotCUlOCVVDSEFSCQkJR3JvdXBLZXlJbmRleCwKLQlJTglVQ0hBUgkJCU1zZ1R5cGUsCi0JSU4JQk9PTEVBTgkJCWJXUEEyLAotCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSkKLXsKLSAgICBQS0RFX0VOQ0FQICAgICAgICAgIHBLREUgPSBOVUxMOwotICAgIFBVQ0hBUiAgICAgICAgICAgICAgcE15S2V5RGF0YSA9IHBLZXlEYXRhOwotICAgIFVDSEFSICAgICAgICAgICAgICAgS2V5RGF0YUxlbmd0aCA9IEtleURhdGFMZW47Ci0gICAgVUNIQVIgICAgICAgICAgICAgICBHVEtMRU4gPSAwOwotCVVDSEFSCQkJCURlZmF1bHRJZHggPSAwOwotCVVDSEFSCQkJCXNraXBfb2Zmc2V0OwotCi0JLy8gVmVyaWZ5IFRoZSBSU04gSUUgY29udGFpbmVkIGluIHBhaXJld2lzZV9tc2dfMiAmJiBwYWlyZXdpc2VfbXNnXzMgYW5kIHNraXAgaXQKLQlpZiAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18yIHx8IE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykKLSAgICB7Ci0JCS8vIENoZWNrIFJTTiBJRSB3aGV0aGVyIGl0IGlzIFdQQTIvV1BBMlBTSwotCQlpZiAoIVJUTVBDaGVja1JTTklFKHBBZCwgcEtleURhdGEsIEtleURhdGFMZW4sIHBFbnRyeSwgJnNraXBfb2Zmc2V0KSkKLQkJewotCQkJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBSU04gSUUgZGlmZmVyZW50Ci0JCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfUlNOSUVfRElGRl9FVkVOVF9GTEFHLCBwRW50cnktPkFkZHIsIHBFbnRyeS0+YXBpZHgsIDApOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJTTl9JRSBEaWZmZXJlbnQgaW4gbXNnICVkIG9mIDQtd2F5IGhhbmRzaGFrZSFcbiIsIE1zZ1R5cGUpKTsKLQkJCWhleF9kdW1wKCJSZWNlaXZlIFJTTl9JRSAiLCBwS2V5RGF0YSwgS2V5RGF0YUxlbik7Ci0JCQloZXhfZHVtcCgiRGVzaXJlZCBSU05fSUUgIiwgcEVudHJ5LT5SU05fSUUsIHBFbnRyeS0+UlNOSUVfTGVuKTsKLQotCQkJcmV0dXJuIEZBTFNFOwotCX0KLQllbHNlCi0JCXsKLQkJCWlmIChiV1BBMiAmJiBNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCi0JCQl7Ci0JCQkJV3BhU2hvd0FsbHN1aXRlKHBNeUtleURhdGEsIHNraXBfb2Zmc2V0KTsKLQotCQkJCS8vIHNraXAgUlNOIElFCi0JCQkJcE15S2V5RGF0YSArPSBza2lwX29mZnNldDsKLQkJCQlLZXlEYXRhTGVuZ3RoIC09IHNraXBfb2Zmc2V0OwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBQYXJzZUVhcG9sS2V5RGF0YSA9PT4gV1BBMi9XUEEyUFNLIFJTTiBJRSBtYXRjaGVkIGluIE1zZyAzLCBMZW5ndGgoJWQpIFxuIiwgc2tpcF9vZmZzZXQpKTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlyZXR1cm4gVFJVRTsKLQkJfQotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFBhcnNlRWFwb2xLZXlEYXRhID09PiBLZXlEYXRhTGVuZ3RoICVkIHdpdGhvdXQgUlNOX0lFIFxuIiwgS2V5RGF0YUxlbmd0aCkpOwotCS8vaGV4X2R1bXAoInJlbWFpbiBkYXRhIiwgcE15S2V5RGF0YSwgS2V5RGF0YUxlbmd0aCk7Ci0KLQotCS8vIFBhcnNlIEVLRCBmb3JtYXQgaW4gcGFpcndpc2VfbXNnXzNfV1BBMiAmJiBncm91cF9tc2dfMV9XUEEyCi0JaWYgKGJXUEEyICYmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgfHwgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCi0JewotCQlpZiAoS2V5RGF0YUxlbmd0aCA+PSA4KQkvLyBLREUgZm9ybWF0IGV4Y2x1ZGUgR1RLIGxlbmd0aAotCXsKLQkJcEtERSA9IChQS0RFX0VOQ0FQKSBwTXlLZXlEYXRhOwotCi0KLQkJCURlZmF1bHRJZHggPSBwS0RFLT5HVEtFbmNhcC5LaWQ7Ci0KLQkJCS8vIFNhbml0eSBjaGVjayAtIEtFRCBsZW5ndGgKLQkJCWlmIChLZXlEYXRhTGVuZ3RoIDwgKHBLREUtPkxlbiArIDIpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogVGhlIGxlbiBmcm9tIEtERSBpcyB0b28gc2hvcnQgXG4iKSk7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCX0KLQotCQkJLy8gR2V0IEdUSyBsZW5ndGggLSByZWZlciB0byBJRUVFIDgwMi4xMWktMjAwNCBwLjgyCi0JCQlHVEtMRU4gPSBwS0RFLT5MZW4gLTY7Ci0JCQlpZiAoR1RLTEVOIDwgTEVOX0FFU19LRVkpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IEdUSyBLZXkgbGVuZ3RoIGlzIHRvbyBzaG9ydCAoJWQpIFxuIiwgR1RLTEVOKSk7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCQl9Ci0KLQl9Ci0JCWVsc2UKLQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogS0RFIGZvcm1hdCBsZW5ndGggaXMgdG9vIHNob3J0IFxuIikpOwotCSAgICAgICAgcmV0dXJuIEZBTFNFOwotCX0KLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJHVEsgaW4gS0RFIGZvcm1hdCAsRGVmYXVsdEtleUlEPSVkLCBLZXlMZW49JWQgXG4iLCBEZWZhdWx0SWR4LCBHVEtMRU4pKTsKLQkJLy8gc2tpcCBpdAotCQlwTXlLZXlEYXRhICs9IDg7Ci0JCUtleURhdGFMZW5ndGggLT0gODsKLQotCX0KLQllbHNlIGlmICghYldQQTIgJiYgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkKLQl7Ci0JCURlZmF1bHRJZHggPSBHcm91cEtleUluZGV4OwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJHVEsgRGVmYXVsdEtleUlEPSVkIFxuIiwgRGVmYXVsdElkeCkpOwotCX0KLQotCS8vIFNhbml0eSBjaGVjayAtIHNoYXJlZCBrZXkgaW5kZXggbXVzdCBiZSAxIH4gMwotCWlmIChEZWZhdWx0SWR4IDwgMSB8fCBEZWZhdWx0SWR4ID4gMykKLSAgICB7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IEdUSyBLZXkgaW5kZXgoJWQpIGlzIGludmFsaWQgaW4gJXMgJXMgXG4iLCBEZWZhdWx0SWR4LCAoKGJXUEEyKSA/ICJXUEEyIiA6ICJXUEEiKSwgR2V0RWFwb2xNc2dUeXBlKE1zZ1R5cGUpKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlQQ0lQSEVSX0tFWSBwU2hhcmVkS2V5OwotCi0JCS8vIHNldCBrZXkgbWF0ZXJpYWwsIFR4TWljIGFuZCBSeE1pYwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5HVEssIHBNeUtleURhdGEsIDMyKTsKLQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gRGVmYXVsdElkeDsKLQotCQlwU2hhcmVkS2V5ID0gJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF07Ci0KLQkJLy8gUHJlcGFyZSBwYWlyLXdpc2Uga2V5IGluZm9ybWF0aW9uIGludG8gc2hhcmVkIGtleSB0YWJsZQotCQlOZGlzWmVyb01lbW9yeShwU2hhcmVkS2V5LCBzaXplb2YoQ0lQSEVSX0tFWSkpOwotCQlwU2hhcmVkS2V5LT5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKLQkJTmRpc01vdmVNZW1vcnkocFNoYXJlZEtleS0+S2V5LCBwQWQtPlN0YUNmZy5HVEssIExFTl9US0lQX0VLKTsKLQkJTmRpc01vdmVNZW1vcnkocFNoYXJlZEtleS0+UnhNaWMsICZwQWQtPlN0YUNmZy5HVEtbMTZdLCBMRU5fVEtJUF9SWE1JQ0spOwotCQlOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5UeE1pYywgJnBBZC0+U3RhQ2ZnLkdUS1syNF0sIExFTl9US0lQX1RYTUlDSyk7Ci0KLQkJLy8gVXBkYXRlIFNoYXJlZCBLZXkgQ2lwaGVyQWxnCi0JCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9OT05FOwotCQlpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLQkJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9US0lQOwotCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCQkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKLQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkKQotCQkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkKQotCQkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLQotCi0JCS8vIFVwZGF0ZSBncm91cCBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCi0JCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCi0JCQkJCQkJICBCU1MwLAotCQkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAotCQkJCQkJCSAgcFNoYXJlZEtleS0+Q2lwaGVyQWxnLAotCQkJCQkJCSAgcFNoYXJlZEtleS0+S2V5LAotCQkJCQkJCSAgcFNoYXJlZEtleS0+VHhNaWMsCi0JCQkJCQkJICBwU2hhcmVkS2V5LT5SeE1pYyk7Ci0KLQkJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCi0JCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAotCQkJCQkJCQkgIEJTUzAsCi0JCQkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAotCQkJCQkJCQkgIHBTaGFyZWRLZXktPkNpcGhlckFsZywKLQkJCQkJCQkJICBOVUxMKTsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlyZXR1cm4gVFJVRTsKLQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlDb25zdHJ1Y3QgRUFQb0wgbWVzc2FnZSBmb3IgV1BBIGhhbmRzaGFraW5nCi0JCUl0cyBmb3JtYXQgaXMgYmVsb3csCi0KLQkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCQl8IFByb3RvY29sIFZlcnNpb24JIHwgIDEgb2N0ZXQKLQkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCQl8IFByb3RvY29sIFR5cGUJCSB8CTEgb2N0ZXQKLQkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCQl8IEJvZHkgTGVuZ3RoCQkgfCAgMiBvY3RldHMKLQkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCQl8IERlc2NyaXB0b3IgVHlwZQkgfAkxIG9jdGV0Ci0JCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkJfCBLZXkgSW5mb3JtYXRpb24gICAgfAkyIG9jdGV0cwotCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JCXwgS2V5IExlbmd0aAkgICAgIHwgIDEgb2N0ZXQKLQkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCQl8IEtleSBSZXBhbHkgQ291bnRlciB8CTggb2N0ZXRzCi0JCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkJfCBLZXkgTm9uY2UJCSAgICAgfCAgMzIgb2N0ZXRzCi0JCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkJfCBLZXkgSVYJCQkgfCAgMTYgb2N0ZXRzCi0JCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkJfCBLZXkgUlNDCQkJIHwgIDggb2N0ZXRzCi0JCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkJfCBLZXkgSUQgb3IgUmVzZXJ2ZWQgfAk4IG9jdGV0cwotCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JCXwgS2V5IE1JQwkJCSB8CTE2IG9jdGV0cwotCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JCXwgS2V5IERhdGEgTGVuZ3RoCSB8CTIgb2N0ZXRzCi0JCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkJfCBLZXkgRGF0YQkJCSB8CW4gb2N0ZXRzCi0JCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQotCi0JQXJndW1lbnRzOgotCQlwQWQJCQlQb2ludGVyCXRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECUNvbnN0cnVjdEVhcG9sTXNnKAotCUlOCVBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5LAotICAgIElOCVVDSEFSCQkJCUdyb3VwS2V5V2VwU3RhdHVzLAotICAgIElOCVVDSEFSCQkJCU1zZ1R5cGUsCi0gICAgSU4JVUNIQVIJCQkJRGVmYXVsdEtleUlkeCwKLQlJTglVQ0hBUgkJCQkqS2V5Tm9uY2UsCi0JSU4JVUNIQVIJCQkJKlR4UlNDLAotCUlOCVVDSEFSCQkJCSpHVEssCi0JSU4JVUNIQVIJCQkJKlJTTklFLAotCUlOCVVDSEFSCQkJCVJTTklFX0xlbiwKLSAgICBPVVQgUEVBUE9MX1BBQ0tFVCAgICAgICBwTXNnKQotewotCUJPT0xFQU4JYldQQTIgPSBGQUxTRTsKLQlVQ0hBUglLZXlEZXNjVmVyOwotCi0JLy8gQ2hvb3NlIFdQQTIgb3Igbm90Ci0JaWYgKChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8Ci0JCShwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQotCQliV1BBMiA9IFRSVUU7Ci0KLSAgICAvLyBJbml0IFBhY2tldCBhbmQgRmlsbCBoZWFkZXIKLSAgICBwTXNnLT5Qcm9WZXIgPSBFQVBPTF9WRVI7Ci0gICAgcE1zZy0+UHJvVHlwZSA9IEVBUE9MS2V5OwotCi0JLy8gRGVmYXVsdCA5NSBieXRlcywgdGhlIEVBUG9MLUtleSBkZXNjcmlwdG9yIGV4Y2x1ZGUgS2V5LWRhdGEgZmllbGQKLQlTRVRfVUlOVDE2X1RPX0FSUkFSWShwTXNnLT5Cb2R5X0xlbiwgTEVOX0VBUE9MX0tFWV9NU0cpOwotCi0JLy8gRmlsbCBpbiBFQVBvTCBkZXNjcmlwdG9yCi0JaWYgKGJXUEEyKQotCQlwTXNnLT5LZXlEZXNjLlR5cGUgPSBXUEEyX0tFWV9ERVNDOwotCWVsc2UKLQkJcE1zZy0+S2V5RGVzYy5UeXBlID0gV1BBMV9LRVlfREVTQzsKLQotCS8vIEtleSBEZXNjcmlwdG9yIFZlcnNpb24gKGJpdHMgMC0yKSBzcGVjaWZpZXMgdGhlIGtleSBkZXNjcmlwdG9yIHZlcnNpb24gdHlwZQotCXsKLQkJLy8gRmlsbCBpbiBLZXkgaW5mb3JtYXRpb24sIHJlZmVyIHRvIElFRUUgU3RkIDgwMi4xMWktMjAwNCBwYWdlIDc4Ci0JCS8vIFdoZW4gZWl0aGVyIHRoZSBwYWlyd2lzZSBvciB0aGUgZ3JvdXAgY2lwaGVyIGlzIEFFUywgdGhlIERFU0NfVFlQRV9BRVMoMikgc2hhbGwgYmUgdXNlZC4KLQkJS2V5RGVzY1ZlciA9ICgoKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpIHx8Ci0JCQkJCShHcm91cEtleVdlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkgPyAoREVTQ19UWVBFX0FFUykgOiAoREVTQ19UWVBFX1RLSVApKTsKLQl9Ci0KLQlwTXNnLT5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IEtleURlc2NWZXI7Ci0KLQkvLyBTcGVjaWZ5IEtleSBUeXBlIGFzIEdyb3VwKDApIG9yIFBhaXJ3aXNlKDEpCi0JaWYgKE1zZ1R5cGUgPj0gRUFQT0xfR1JPVVBfTVNHXzEpCi0JCXBNc2ctPktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gR1JPVVBLRVk7Ci0JZWxzZQotCQlwTXNnLT5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IFBBSVJXSVNFS0VZOwotCi0JLy8gU3BlY2lmeSBLZXkgSW5kZXgsIG9ubHkgZ3JvdXBfbXNnMV9XUEExCi0JaWYgKCFiV1BBMiAmJiAoTXNnVHlwZSA+PSBFQVBPTF9HUk9VUF9NU0dfMSkpCi0JCXBNc2ctPktleURlc2MuS2V5SW5mby5LZXlJbmRleCA9IERlZmF1bHRLZXlJZHg7Ci0KLQlpZiAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQotCQlwTXNnLT5LZXlEZXNjLktleUluZm8uSW5zdGFsbCA9IDE7Ci0KLQlpZiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSkgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKQotCQlwTXNnLT5LZXlEZXNjLktleUluZm8uS2V5QWNrID0gMTsKLQotCWlmIChNc2dUeXBlICE9IEVBUE9MX1BBSVJfTVNHXzEpCi0JCXBNc2ctPktleURlc2MuS2V5SW5mby5LZXlNaWMgPSAxOwotCi0JaWYgKChiV1BBMiAmJiAoTXNnVHlwZSA+PSBFQVBPTF9QQUlSX01TR18zKSkgfHwKLQkJKCFiV1BBMiAmJiAoTXNnVHlwZSA+PSBFQVBPTF9HUk9VUF9NU0dfMSkpKQotICAgIHsKLQlwTXNnLT5LZXlEZXNjLktleUluZm8uU2VjdXJlID0gMTsKLSAgICB9Ci0KLQlpZiAoYldQQTIgJiYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpIHx8Ci0JCShNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkpCi0gICAgewotICAgICAgICBwTXNnLT5LZXlEZXNjLktleUluZm8uRUtEX0RMID0gMTsKLSAgICB9Ci0KLQkvLyBrZXkgSW5mb3JtYXRpb24gZWxlbWVudCBoYXMgZG9uZS4KLQkqKFVTSE9SVCAqKSgmcE1zZy0+S2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwTXNnLT5LZXlEZXNjLktleUluZm8pKTsKLQotCS8vIEZpbGwgaW4gS2V5IExlbmd0aAotCXsKLQkJaWYgKE1zZ1R5cGUgPj0gRUFQT0xfR1JPVVBfTVNHXzEpCi0JCXsKLQkJCS8vIHRoZSBsZW5ndGggb2YgZ3JvdXAga2V5IGNpcGhlcgotCQkJcE1zZy0+S2V5RGVzYy5LZXlMZW5ndGhbMV0gPSAoKEdyb3VwS2V5V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpID8gVEtJUF9HVEtfTEVOR1RIIDogTEVOX0FFU19LRVkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gdGhlIGxlbmd0aCBvZiBwYWlyd2lzZSBrZXkgY2lwaGVyCi0JCQlwTXNnLT5LZXlEZXNjLktleUxlbmd0aFsxXSA9ICgocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgPyBMRU5fVEtJUF9LRVkgOiBMRU5fQUVTX0tFWSk7Ci0JCX0KLQl9Ci0KLQkvLyBGaWxsIGluIHJlcGxheSBjb3VudGVyCi0gICAgTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwRW50cnktPlJfQ291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0KLQkvLyBGaWxsIEtleSBOb25jZSBmaWVsZAotCS8vIEFOb25jZSA6IHBhaXJ3aXNlX21zZzEgJiBwYWlyd2lzZV9tc2czCi0JLy8gU05vbmNlIDogcGFpcndpc2VfbXNnMgotCS8vIEdOb25jZSA6IGdyb3VwX21zZzFfd3BhMQotCWlmICgoTXNnVHlwZSA8PSBFQVBPTF9QQUlSX01TR18zKSB8fCAoKCFiV1BBMiAmJiAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpKSkKLQlOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLktleU5vbmNlLCBLZXlOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKTsKLQotCS8vIEZpbGwga2V5IElWIC0gV1BBMiBhcyAwLCBXUEExIGFzIHJhbmRvbQotCWlmICghYldQQTIgJiYgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKQotCXsKLQkJLy8gU3VnZ2VzdCBJViBiZSByYW5kb20gbnVtYmVyIHBsdXMgc29tZSBudW1iZXIsCi0JCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5SXYsICZLZXlOb25jZVsxNl0sIExFTl9LRVlfREVTQ19JVik7Ci0gICAgICAgIHBNc2ctPktleURlc2MuS2V5SXZbMTVdICs9IDI7Ci0JfQotCi0gICAgLy8gRmlsbCBLZXkgUlNDIGZpZWxkCi0gICAgLy8gSXQgY29udGFpbnMgdGhlIFJTQyBmb3IgdGhlIEdUSyBiZWluZyBpbnN0YWxsZWQuCi0JaWYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgJiYgYldQQTIpIHx8IChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkKLQl7Ci0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5UnNjLCBUeFJTQywgNik7Ci0JfQotCi0JLy8gQ2xlYXIgS2V5IE1JQyBmaWVsZCBmb3IgTUlDIGNhbGN1bGF0aW9uIGxhdGVyCi0gICAgTmRpc1plcm9NZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOwotCi0JQ29uc3RydWN0RWFwb2xLZXlEYXRhKHBFbnRyeSwKLQkJCQkJCSAgR3JvdXBLZXlXZXBTdGF0dXMsCi0JCQkJCQkgIEtleURlc2NWZXIsCi0JCQkJCQkgIE1zZ1R5cGUsCi0JCQkJCQkgIERlZmF1bHRLZXlJZHgsCi0JCQkJCQkgIEdUSywKLQkJCQkJCSAgUlNOSUUsCi0JCQkJCQkgIFJTTklFX0xlbiwKLQkJCQkJCSAgcE1zZyk7Ci0KLQkvLyBDYWxjdWxhdGUgTUlDIGFuZCBmaWxsIGluIEtleU1pYyBGaWVsZCBleGNlcHQgUGFpcndpc2UgTXNnIDEuCi0JaWYgKE1zZ1R5cGUgIT0gRUFQT0xfUEFJUl9NU0dfMSkKLQl7Ci0JCUNhbGN1bGF0ZU1JQyhLZXlEZXNjVmVyLCBwRW50cnktPlBUSywgcE1zZyk7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBDb25zdHJ1Y3RFYXBvbE1zZyBmb3IgJXMgJXNcbiIsICgoYldQQTIpID8gIldQQTIiIDogIldQQSIpLCBHZXRFYXBvbE1zZ1R5cGUoTXNnVHlwZSkpKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIJICAgICBCb2R5IGxlbmd0aCA9ICVkIFxuIiwgQ09OVl9BUlJBUllfVE9fVUlOVDE2KHBNc2ctPkJvZHlfTGVuKSkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIgkgICAgIEtleSBsZW5ndGggID0gJWQgXG4iLCBDT05WX0FSUkFSWV9UT19VSU5UMTYocE1zZy0+S2V5RGVzYy5LZXlMZW5ndGgpKSk7Ci0KLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQ29uc3RydWN0IHRoZSBLZXkgRGF0YSBmaWVsZCBvZiBFQVBvTCBtZXNzYWdlCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKLQkJRWxlbQkJTWVzc2FnZSBib2R5Ci0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECUNvbnN0cnVjdEVhcG9sS2V5RGF0YSgKLQlJTglQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSwKLQlJTglVQ0hBUgkJCUdyb3VwS2V5V2VwU3RhdHVzLAotCUlOCVVDSEFSCQkJa2V5RGVzY1ZlciwKLQlJTglVQ0hBUgkJCU1zZ1R5cGUsCi0JSU4JVUNIQVIJCQlEZWZhdWx0S2V5SWR4LAotCUlOCVVDSEFSCQkJKkdUSywKLQlJTglVQ0hBUgkJCSpSU05JRSwKLQlJTglVQ0hBUgkJCVJTTklFX0xFTiwKLQlPVVQgUEVBUE9MX1BBQ0tFVCAgIHBNc2cpCi17Ci0JVUNIQVIJCSptcG9vbCwgKktleV9EYXRhLCAqUmM0R1RLOwotCVVDSEFSICAgICAgIGVrZXlbKExFTl9LRVlfREVTQ19JVitMRU5fRUFQX0VLKV07Ci0JVUxPTkcJCWRhdGFfb2Zmc2V0OwotCUJPT0xFQU4JCWJXUEEyQ2FwYWJsZSA9IEZBTFNFOwotCVBSVE1QX0FEQVBURVIJcEFkID0gcEVudHJ5LT5wQWQ7Ci0JQk9PTEVBTgkJR1RLX0luY2x1ZGVkID0gRkFMU0U7Ci0KLQkvLyBDaG9vc2UgV1BBMiBvciBub3QKLQlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKLQkJKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCi0JCWJXUEEyQ2FwYWJsZSA9IFRSVUU7Ci0KLQlpZiAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xIHx8Ci0JCU1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfNCB8fAotCQlNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18yKQotCQlyZXR1cm47Ci0KLQkvLyBhbGxvY2F0ZSBtZW1vcnkgcG9vbAotCW9zX2FsbG9jX21lbShOVUxMLCAoUFVDSEFSICopJm1wb29sLCAxNTAwKTsKLQotICAgIGlmIChtcG9vbCA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQkvKiBSYzRHVEsgTGVuID0gNTEyICovCi0JUmM0R1RLID0gKFVDSEFSICopIFJPVU5EX1VQKG1wb29sLCA0KTsKLQkvKiBLZXlfRGF0YSBMZW4gPSA1MTIgKi8KLQlLZXlfRGF0YSA9IChVQ0hBUiAqKSBST1VORF9VUChSYzRHVEsgKyA1MTIsIDQpOwotCi0JTmRpc1plcm9NZW1vcnkoS2V5X0RhdGEsIDUxMik7Ci0JU0VUX1VJTlQxNl9UT19BUlJBUlkocE1zZy0+S2V5RGVzYy5LZXlEYXRhTGVuLCAwKTsKLQlkYXRhX29mZnNldCA9IDA7Ci0KLQkvLyBFbmNhcHN1bGF0ZSBSU05JRSBpbiBwYWlyd2lzZV9tc2cyICYgcGFpcndpc2VfbXNnMwotCWlmIChSU05JRV9MRU4gJiYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzIpIHx8IChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpKSkKLQl7Ci0JCVBVSU5UOAlwbWtpZF9wdHIgPSBOVUxMOwotCQlVSU5UOAlwbWtpZF9sZW4gPSAwOwotCi0KLQkJUlRNUEluc2VydFJTTklFKCZLZXlfRGF0YVtkYXRhX29mZnNldF0sCi0JCQkJCQkoUFVMT05HKSZkYXRhX29mZnNldCwKLQkJCQkJCVJTTklFLAotCQkJCQkJUlNOSUVfTEVOLAotCQkJCQkJcG1raWRfcHRyLAotCQkJCQkJcG1raWRfbGVuKTsKLQl9Ci0KLQotCS8vIEVuY2Fwc3VsYXRlIEtERSBmb3JtYXQgaW4gcGFpcndpc2VfbXNnM19XUEEyICYgZ3JvdXBfbXNnMV9XUEEyCi0JaWYgKGJXUEEyQ2FwYWJsZSAmJiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKSkKLQl7Ci0JCS8vIEtleSBEYXRhIEVuY2Fwc3VsYXRpb24gKEtERSkgZm9ybWF0IC0gODAyLjExaS0yMDA0ICBGaWd1cmUtNDN3IGFuZCBUYWJsZS0yMGgKLSAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAwXSA9IDB4REQ7Ci0KLQkJaWYgKEdyb3VwS2V5V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JCXsKLQkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMV0gPSAweDE2Oy8vIDQrMisxNihPVUkrRGF0YVR5cGUrRGF0YUZpZWxkKQotCQl9Ci0JCWVsc2UKLQkJewotCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAxXSA9IDB4MjY7Ly8gNCsyKzMyKE9VSStEYXRhVHlwZStEYXRhRmllbGQpCi0JCX0KLQotICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDJdID0gMHgwMDsKLSAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAzXSA9IDB4MEY7Ci0gICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgNF0gPSAweEFDOwotICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDVdID0gMHgwMTsKLQotCQkvLyBHVEsgS0RFIGZvcm1hdCAtIDgwMi4xMWktMjAwNCAgRmlndXJlLTQzeAotICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDZdID0gKERlZmF1bHRLZXlJZHggJiAweDAzKTsKLSAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyA3XSA9IDB4MDA7CS8vIFJlc2VydmVkIEJ5dGUKLQotCQlkYXRhX29mZnNldCArPSA4OwotCX0KLQotCi0JLy8gRW5jYXBzdWxhdGUgR1RLCi0JLy8gT25seSBmb3IgcGFpcndpc2VfbXNnM19XUEEyIGFuZCBncm91cF9tc2cxCi0JaWYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgJiYgYldQQTJDYXBhYmxlKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCi0JewotCQkvLyBGaWxsIGluIEdUSwotCQlpZiAoR3JvdXBLZXlXZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQkJewotCQkJTmRpc01vdmVNZW1vcnkoJktleV9EYXRhW2RhdGFfb2Zmc2V0XSwgR1RLLCBMRU5fQUVTX0tFWSk7Ci0JCQlkYXRhX29mZnNldCArPSBMRU5fQUVTX0tFWTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCU5kaXNNb3ZlTWVtb3J5KCZLZXlfRGF0YVtkYXRhX29mZnNldF0sIEdUSywgVEtJUF9HVEtfTEVOR1RIKTsKLQkJCWRhdGFfb2Zmc2V0ICs9IFRLSVBfR1RLX0xFTkdUSDsKLQkJfQotCi0JCUdUS19JbmNsdWRlZCA9IFRSVUU7Ci0JfQotCi0KLQkvLyBUaGlzIHdob2xlIGtleS1kYXRhIGZpZWxkIHNoYWxsIGJlIGVuY3J5cHRlZCBpZiBhIEdUSyBpcyBpbmNsdWRlZC4KLQkvLyBFbmNyeXB0IHRoZSBkYXRhIG1hdGVyaWFsIGluIGtleSBkYXRhIGZpZWxkIHdpdGggS0VLCi0JaWYgKEdUS19JbmNsdWRlZCkKLQl7Ci0JCS8vaGV4X2R1bXAoIkdUS19JbmNsdWRlZCIsIEtleV9EYXRhLCBkYXRhX29mZnNldCk7Ci0KLQkJaWYgKAotCQkJKGtleURlc2NWZXIgPT0gREVTQ19UWVBFX0FFUykpCi0JCXsKLQkJCVVDSEFSCXJlbWFpbmRlciA9IDA7Ci0JCQlVQ0hBUglwYWRfbGVuID0gMDsKLQotCQkJLy8gS2V5IERlc2NyaXB0b3IgVmVyc2lvbiAyIG9yIDM6IEFFUyBrZXkgd3JhcCwgZGVmaW5lZCBpbiBJRVRGIFJGQyAzMzk0LAotCQkJLy8gc2hhbGwgYmUgdXNlZCB0byBlbmNyeXB0IHRoZSBLZXkgRGF0YSBmaWVsZCB1c2luZyB0aGUgS0VLIGZpZWxkIGZyb20KLQkJCS8vIHRoZSBkZXJpdmVkIFBUSy4KLQotCQkJLy8gSWYgdGhlIEtleSBEYXRhIGZpZWxkIHVzZXMgdGhlIE5JU1QgQUVTIGtleSB3cmFwLCB0aGVuIHRoZSBLZXkgRGF0YSBmaWVsZAotCQkJLy8gc2hhbGwgYmUgcGFkZGVkIGJlZm9yZSBlbmNyeXB0aW5nIGlmIHRoZSBrZXkgZGF0YSBsZW5ndGggaXMgbGVzcyB0aGFuIDE2Ci0JCQkvLyBvY3RldHMgb3IgaWYgaXQgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gVGhlIHBhZGRpbmcgY29uc2lzdHMgb2YgYXBwZW5kaW5nCi0JCQkvLyBhIHNpbmdsZSBvY3RldCAweGRkIGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSAweDAwIG9jdGV0cy4KLQkJCWlmICgocmVtYWluZGVyID0gZGF0YV9vZmZzZXQgJiAweDA3KSAhPSAwKQotCQkJewotCQkJCUlOVAkJaTsKLQotCQkJCXBhZF9sZW4gPSAoOCAtIHJlbWFpbmRlcik7Ci0JCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXRdID0gMHhERDsKLQkJCQlmb3IgKGkgPSAxOyBpIDwgcGFkX2xlbjsgaSsrKQotCQkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIGldID0gMDsKLQotCQkJCWRhdGFfb2Zmc2V0ICs9IHBhZF9sZW47Ci0JCQl9Ci0KLQkJCUFFU19HVEtfS0VZX1dSQVAoJnBFbnRyeS0+UFRLWzE2XSwgS2V5X0RhdGEsIGRhdGFfb2Zmc2V0LCBSYzRHVEspOwotICAgICAgICAgICAgLy8gQUVTIHdyYXAgZnVuY3Rpb24gd2lsbCBncm93IDggYnl0ZXMgaW4gbGVuZ3RoCi0gICAgICAgICAgICBkYXRhX29mZnNldCArPSA4OwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLyoJS2V5IERlc2NyaXB0b3IgVmVyc2lvbiAxOiBBUkM0IGlzIHVzZWQgdG8gZW5jcnlwdCB0aGUgS2V5IERhdGEgZmllbGQKLQkJCQl1c2luZyB0aGUgS0VLIGZpZWxkIGZyb20gdGhlIGRlcml2ZWQgUFRLLiAqLwotCi0JCQkvLyBQUkVQQVJFIEVuY3J5cHRlZCAgIktleSBEQVRBIiBmaWVsZC4gIChFbmNyeXB0IEdUSyB3aXRoIFJDNCwgdXNpbmYgUFRLWzE2XS0+WzMxXSBhcyBLZXksIElWLWZpZWxkIGFzIElWKQotCQkJLy8gcHV0IFR4VHNjIGluIEtleSBSU0MgZmllbGQKLQkJCXBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIgPSBQUFBJTklURkNTMzI7ICAgLy9Jbml0IGNyYzMyLgotCi0JCQkvLyBla2V5IGlzIHRoZSBjb250YW5ldGlvbiBvZiBJVi1maWVsZCwgYW5kIFBUS1sxNl0tPlBUS1szMV0KLQkJCU5kaXNNb3ZlTWVtb3J5KGVrZXksIHBNc2ctPktleURlc2MuS2V5SXYsIExFTl9LRVlfREVTQ19JVik7Ci0JCQlOZGlzTW92ZU1lbW9yeSgmZWtleVtMRU5fS0VZX0RFU0NfSVZdLCAmcEVudHJ5LT5QVEtbMTZdLCBMRU5fRUFQX0VLKTsKLQkJCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBla2V5LCBzaXplb2YoZWtleSkpOyAgLy9JTklUIFNCT1gsIEtFWUxFTiszKElWKQotCQkJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCBLZXlfRGF0YSwgZGF0YV9vZmZzZXQpOwotCQkJV1BBQVJDRk9VUl9FTkNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIFJjNEdUSywgS2V5X0RhdGEsIGRhdGFfb2Zmc2V0KTsKLQkJfQotCi0JCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5RGF0YSwgUmM0R1RLLCBkYXRhX29mZnNldCk7Ci0JfQotCWVsc2UKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5RGF0YSwgS2V5X0RhdGEsIGRhdGFfb2Zmc2V0KTsKLQl9Ci0KLQkvLyBVcGRhdGUga2V5IGRhdGEgbGVuZ3RoIGZpZWxkIGFuZCB0b3RhbCBib2R5IGxlbmd0aAotCVNFVF9VSU5UMTZfVE9fQVJSQVJZKHBNc2ctPktleURlc2MuS2V5RGF0YUxlbiwgZGF0YV9vZmZzZXQpOwotCUlOQ19VSU5UMTZfVE9fQVJSQVJZKHBNc2ctPkJvZHlfTGVuLCBkYXRhX29mZnNldCk7Ci0KLQlvc19mcmVlX21lbShOVUxMLCBtcG9vbCk7Ci0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUNhbGNhdWxhdGUgTUlDLiBJdCBpcyB1c2VkIGR1cmluZyA0LXdheXMgaGFuZHNoYXJraW5nLgotCi0JQXJndW1lbnRzOgotCQlwQWQJCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0Ci0JUGVlcldlcFN0YXR1cwktCWluZGljYXRlIHRoZSBlbmNyeXB0aW9uIHR5cGUKLQotCVJldHVybiBWYWx1ZToKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgVk9JRAlDYWxjdWxhdGVNSUMoCi0JSU4JVUNIQVIJCQlLZXlEZXNjVmVyLAotCUlOCVVDSEFSCQkJKlBUSywKLQlPVVQgUEVBUE9MX1BBQ0tFVCAgIHBNc2cpCi17Ci0gICAgVUNIQVIgICAqT3V0QnVmZmVyOwotCVVMT05HCUZyYW1lTGVuID0gMDsKLQlVQ0hBUgltaWNbTEVOX0tFWV9ERVNDX01JQ107Ci0JVUNIQVIJZGlnZXN0WzgwXTsKLQotCS8vIGFsbG9jYXRlIG1lbW9yeSBmb3IgTUlDIGNhbGN1bGF0aW9uCi0Jb3NfYWxsb2NfbWVtKE5VTEwsIChQVUNIQVIgKikmT3V0QnVmZmVyLCA1MTIpOwotCi0gICAgaWYgKE91dEJ1ZmZlciA9PSBOVUxMKQotICAgIHsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiISEhQ2FsY3VsYXRlTUlDOiBubyBtZW1vcnkhISFcbiIpKTsKLQkJcmV0dXJuOwotICAgIH0KLQotCS8vIG1ha2UgYSBmcmFtZSBmb3IgY2FsY3VsYXRpbmcgTUlDLgotICAgIE1ha2VPdXRnb2luZ0ZyYW1lKE91dEJ1ZmZlciwJCSZGcmFtZUxlbiwKLSAgICAgICAgICAgICAgICAgICAgICBDT05WX0FSUkFSWV9UT19VSU5UMTYocE1zZy0+Qm9keV9MZW4pICsgNCwJcE1zZywKLSAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7Ci0KLQlOZGlzWmVyb01lbW9yeShtaWMsIHNpemVvZihtaWMpKTsKLQotCS8vIENhbGN1bGF0ZSBNSUMKLSAgICBpZiAoS2V5RGVzY1ZlciA9PSBERVNDX1RZUEVfQUVTKQotCXsKLQkJSE1BQ19TSEExKFBUSywgTEVOX0VBUF9NSUNLLCBPdXRCdWZmZXIsICBGcmFtZUxlbiwgZGlnZXN0LCBTSEExX0RJR0VTVF9TSVpFKTsKLQkJTmRpc01vdmVNZW1vcnkobWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOwotCX0KLQllbHNlCi0JewotCQlITUFDX01ENShQVEssICBMRU5fRUFQX01JQ0ssIE91dEJ1ZmZlciwgRnJhbWVMZW4sIG1pYywgTUQ1X0RJR0VTVF9TSVpFKTsKLQl9Ci0KLQkvLyBzdG9yZSB0aGUgY2FsY3VsYXRlZCBNSUMKLQlOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLktleU1pYywgbWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKLQotCW9zX2ZyZWVfbWVtKE5VTEwsIE91dEJ1ZmZlcik7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlTb21lIHJlY2VpdmVkIGZyYW1lcyBjYW4ndCBkZWNyeXB0IGJ5IEFzaWMsIHNvIGRlY3J5cHQgdGhlbSBieSBzb2Z0d2FyZS4KLQotCUFyZ3VtZW50czoKLQkJcEFkCQkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAotCVBlZXJXZXBTdGF0dXMJLQlpbmRpY2F0ZSB0aGUgZW5jcnlwdGlvbiB0eXBlCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5ESVNfU1RBVFVTX1NVQ0NFU1MJCS0JZGVjcnlwdGlvbiBzdWNjZXNzZnVsCi0JCU5ESVNfU1RBVFVTX0ZBSUxVUkUJCS0JZGVjcnlwdGlvbiBmYWlsdXJlCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTX1NUQVRVUwlSVE1QU29mdERlY3J5cHRCcm9hZENhc3REYXRhKAotCUlOCVBSVE1QX0FEQVBURVIJCQkJCXBBZCwKLQlJTglSWF9CTEsJCQkJCQkJKnBSeEJsaywKLQlJTiAgTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJR3JvdXBDaXBoZXIsCi0JSU4gIFBDSVBIRVJfS0VZCQkJCQkJcFNoYXJkX2tleSkKLXsKLQlQUlhXSV9TVFJVQwkJCXBSeFdJID0gcFJ4QmxrLT5wUnhXSTsKLQotCi0KLQkvLyBoYW5kbGUgV0VQIGRlY3J5cHRpb24KLQlpZiAoR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkKLSAgICB7Ci0JCWlmIChSVE1QU29mdERlY3J5cHRXRVAocEFkLCBwUnhCbGstPnBEYXRhLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50LCBwU2hhcmRfa2V5KSkKLQkJewotCi0JCQkvL01pbnVzIElWWzRdICYgSUNWWzRdCi0JCQlwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50IC09IDg7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUiA6IFNvZnR3YXJlIGRlY3J5cHQgV0VQIGRhdGEgZmFpbHMuXG4iKSk7Ci0JCQkvLyBnaXZlIHVwIHRoaXMgZnJhbWUKLQkJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCQl9Ci0JfQotCS8vIGhhbmRsZSBUS0lQIGRlY3J5cHRpb24KLQllbHNlIGlmIChHcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQotCXsKLQkJaWYgKFJUTVBTb2Z0RGVjcnlwdFRLSVAocEFkLCBwUnhCbGstPnBEYXRhLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50LCAwLCBwU2hhcmRfa2V5KSkKLQkJewotCi0JCQkvL01pbnVzIDggYnl0ZXMgTUlDLCA4IGJ5dGVzIElWL0VJViwgNCBieXRlcyBJQ1YKLQkJCXBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgLT0gMjA7Ci0JCX0KLSAgICAgICAgZWxzZQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUiA6IFJUTVBTb2Z0RGVjcnlwdFRLSVAgRmFpbGVkXG4iKSk7Ci0JCQkvLyBnaXZlIHVwIHRoaXMgZnJhbWUKLQkJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotICAgICAgICB9Ci0JfQotCS8vIGhhbmRsZSBBRVMgZGVjcnlwdGlvbgotCWVsc2UgaWYgKEdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JewotCQlpZiAoUlRNUFNvZnREZWNyeXB0QUVTKHBBZCwgcFJ4QmxrLT5wRGF0YSwgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCAsIHBTaGFyZF9rZXkpKQotCQl7Ci0KLQkJCS8vOCBieXRlcyBNSUMsIDggYnl0ZXMgSVYvRUlWIChDQ01QIEhlYWRlcikKLQkJCXBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgLT0gMTY7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUiA6IFJUTVBTb2Z0RGVjcnlwdEFFUyBGYWlsZWRcbiIpKTsKLQkJCS8vIGdpdmUgdXAgdGhpcyBmcmFtZQotCQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCi0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotCi19Ci0KLQotUFVJTlQ4CUdldFN1aXRlRnJvbVJTTklFKAotCQlJTglQVUlOVDgJcnNuaWUsCi0JCUlOCVVJTlQJcnNuaWVfbGVuLAotCQlJTglVSU5UOAl0eXBlLAotCQlPVVQJVUlOVDgJKmNvdW50KQotewotCVBFSURfU1RSVUNUIHBFaWQ7Ci0JSU5UCQkJbGVuOwotCVBVSU5UOAkJcEJ1ZjsKLQlJTlQJCQlvZmZzZXQgPSAwOwotCVBSU05JRV9BVVRICXBBa207Ci0JVUlOVDE2CQlhY291bnQ7Ci0JQk9PTEVBTgkJaXNXUEEyID0gRkFMU0U7Ci0KLQlwRWlkID0gKFBFSURfU1RSVUNUKXJzbmllOwotCWxlbiA9IHJzbmllX2xlbiAtIDI7CS8vIGV4Y2x1ZGUgSUUgYW5kIGxlbmd0aAotCXBCdWYgPSAoUFVJTlQ4KSZwRWlkLT5PY3RldFswXTsKLQotCi0KLQkvLyBzZXQgZGVmYXVsdCB2YWx1ZQotCSpjb3VudCA9IDA7Ci0KLQkvLyBDaGVjayBsZW5ndGgKLQlpZiAoKGxlbiA8PSAwKSB8fCAocEVpZC0+TGVuICE9IGxlbikpCi0JewotCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBsZW5ndGggaXMgaW52YWxpZFxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCS8vIENoZWNrIFdQQSBvciBXUEEyCi0JaWYgKHBFaWQtPkVpZCA9PSBJRV9XUEEpCi0JewotCQlQUlNOSUUJcFJzbmllID0gKFBSU05JRSlwQnVmOwotCQlVSU5UMTYgdWNvdW50OwotCi0JCWlmIChsZW4gPCBzaXplb2YoUlNOSUUpKQotCQl7Ci0JCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBsZW5ndGggaXMgdG9vIHNob3J0IGZvciBXUEFcbiIsIF9fRlVOQ1RJT05fXykpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQotCQkvLyBHZXQgdGhlIGNvdW50IG9mIHBhaXJ3aXNlIGNpcGhlcgotCQl1Y291bnQgPSBjcHUybGUxNihwUnNuaWUtPnVjb3VudCk7Ci0JCWlmICh1Y291bnQgPiAyKQotCQl7Ci0JCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBjb3VudCglZCkgb2YgcGFpcndpc2UgY2lwaGVyIGlzIGludmxhaWRcbiIsCi0JCQkJCQkJCQkJCV9fRlVOQ1RJT05fXywgdWNvdW50KSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCi0JCS8vIEdldCB0aGUgZ3JvdXAgY2lwaGVyCi0JCWlmICh0eXBlID09IEdST1VQX1NVSVRFKQotCQl7Ci0JCQkqY291bnQgPSAxOwotCQkJcmV0dXJuIHBSc25pZS0+bWNhc3Q7Ci0JCX0KLQkJLy8gR2V0IHRoZSBwYWlyd2lzZSBjaXBoZXIgc3VpdGUKLQkJZWxzZSBpZiAodHlwZSA9PSBQQUlSV0lTRV9TVUlURSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgOiBUaGUgY291bnQgb2YgcGFpcndpc2UgY2lwaGVyIGlzICVkXG4iLAotCQkJCQkJCQkJCV9fRlVOQ1RJT05fXywgdWNvdW50KSk7Ci0JCQkqY291bnQgPSB1Y291bnQ7Ci0JCQlyZXR1cm4gcFJzbmllLT51Y2FzdFswXS5vdWk7Ci0JCX0KLQotCQlvZmZzZXQgPSBzaXplb2YoUlNOSUUpICsgKDQgKiAodWNvdW50IC0gMSkpOwotCi0JfQotCWVsc2UgaWYgKHBFaWQtPkVpZCA9PSBJRV9SU04pCi0JewotCQlQUlNOSUUyCXBSc25pZSA9IChQUlNOSUUyKXBCdWY7Ci0JCVVJTlQxNiB1Y291bnQ7Ci0KLQkJaXNXUEEyID0gVFJVRTsKLQotCQlpZiAobGVuIDwgc2l6ZW9mKFJTTklFMikpCi0JCXsKLQkJCURCR1BSSU5UX0VSUigoIiVzIDogVGhlIGxlbmd0aCBpcyB0b28gc2hvcnQgZm9yIFdQQTJcbiIsIF9fRlVOQ1RJT05fXykpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQotCQkvLyBHZXQgdGhlIGNvdW50IG9mIHBhaXJ3aXNlIGNpcGhlcgotCQl1Y291bnQgPSBjcHUybGUxNihwUnNuaWUtPnVjb3VudCk7Ci0JCWlmICh1Y291bnQgPiAyKQotCQl7Ci0JCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBjb3VudCglZCkgb2YgcGFpcndpc2UgY2lwaGVyIGlzIGludmxhaWRcbiIsCi0JCQkJCQkJCQkJCV9fRlVOQ1RJT05fXywgdWNvdW50KSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCi0JCS8vIEdldCB0aGUgZ3JvdXAgY2lwaGVyCi0JCWlmICh0eXBlID09IEdST1VQX1NVSVRFKQotCQl7Ci0JCQkqY291bnQgPSAxOwotCQkJcmV0dXJuIHBSc25pZS0+bWNhc3Q7Ci0JCX0KLQkJLy8gR2V0IHRoZSBwYWlyd2lzZSBjaXBoZXIgc3VpdGUKLQkJZWxzZSBpZiAodHlwZSA9PSBQQUlSV0lTRV9TVUlURSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgOiBUaGUgY291bnQgb2YgcGFpcndpc2UgY2lwaGVyIGlzICVkXG4iLAotCQkJCQkJCQkJCV9fRlVOQ1RJT05fXywgdWNvdW50KSk7Ci0JCQkqY291bnQgPSB1Y291bnQ7Ci0JCQlyZXR1cm4gcFJzbmllLT51Y2FzdFswXS5vdWk7Ci0JCX0KLQotCQlvZmZzZXQgPSBzaXplb2YoUlNOSUUyKSArICg0ICogKHVjb3VudCAtIDEpKTsKLQotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVF9FUlIoKCIlcyA6IFVua25vd24gSUUgKCVkKVxuIiwgX19GVU5DVElPTl9fLCBwRWlkLT5FaWQpKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JLy8gc2tpcCBncm91cCBjaXBoZXIgYW5kIHBhaXJ3aXNlIGNpcGhlciBzdWl0ZQotCXBCdWYgKz0gb2Zmc2V0OwotCWxlbiAtPSBvZmZzZXQ7Ci0KLQlpZiAobGVuIDwgc2l6ZW9mKFJTTklFX0FVVEgpKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiJXMgOiBUaGUgbGVuZ3RoIG9mIFJTTklFIGlzIHRvbyBzaG9ydFxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCS8vIHBvaW50ZXIgdG8gQUtNIGNvdW50Ci0JcEFrbSA9IChQUlNOSUVfQVVUSClwQnVmOwotCi0JLy8gR2V0IHRoZSBjb3VudCBvZiBwYWlyd2lzZSBjaXBoZXIKLQlhY291bnQgPSBjcHUybGUxNihwQWttLT5hY291bnQpOwotCWlmIChhY291bnQgPiAyKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiJXMgOiBUaGUgY291bnQoJWQpIG9mIEFLTSBpcyBpbnZsYWlkXG4iLAotCQkJCQkJCQkJCV9fRlVOQ1RJT05fXywgYWNvdW50KSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCS8vIEdldCB0aGUgQUtNIHN1aXRlCi0JaWYgKHR5cGUgPT0gQUtNX1NVSVRFKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgOiBUaGUgY291bnQgb2YgQUtNIGlzICVkXG4iLAotCQkJCQkJCQkJX19GVU5DVElPTl9fLCBhY291bnQpKTsKLQkJKmNvdW50ID0gYWNvdW50OwotCQlyZXR1cm4gcEFrbS0+YXV0aFswXS5vdWk7Ci0JfQotCW9mZnNldCA9IHNpemVvZihSU05JRV9BVVRIKSArICg0ICogKGFjb3VudCAtIDEpKTsKLQotCXBCdWYgKz0gb2Zmc2V0OwotCWxlbiAtPSBvZmZzZXQ7Ci0KLQkvLyBUaGUgcmVtYWluaW5nIGxlbmd0aCBtdXN0IGxhcmdlciB0aGFuIChSU04tQ2FwYWJpbGl0eSgyKSArIFBNS0lELUNvdW50KDIpICsgUE1LSUQoMTZ+KSkKLQlpZiAobGVuID49IChzaXplb2YoUlNOX0NBUEFCSUxJVElFUykgKyAyICsgTEVOX1BNS0lEKSkKLQl7Ci0JCS8vIFNraXAgUlNOIGNhcGFiaWxpdHkgYW5kIFBNS0lELUNvdW50Ci0JCXBCdWYgKz0gKHNpemVvZihSU05fQ0FQQUJJTElUSUVTKSArIDIpOwotCQlsZW4gLT0gKHNpemVvZihSU05fQ0FQQUJJTElUSUVTKSArIDIpOwotCi0JCS8vIEdldCBQTUtJRAotCQlpZiAodHlwZSA9PSBQTUtJRF9MSVNUKQotCQl7Ci0JCQkqY291bnQgPSAxOwotCQkJcmV0dXJuIHBCdWY7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlRfRVJSKCgiJXMgOiBpdCBjYW4ndCBnZXQgYW55IG1vcmUgaW5mb3JtYXRpb24gYmV5b25kIEFLTSBcbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkqY291bnQgPSAwOwotCS8vREJHUFJJTlRfRVJSKCgiJXMgOiBUaGUgdHlwZSglZCkgZG9lc24ndCBzdXBwb3J0IFxuIiwgX19GVU5DVElPTl9fLCB0eXBlKSk7Ci0JcmV0dXJuIE5VTEw7Ci0KLX0KLQotVk9JRCBXcGFTaG93QWxsc3VpdGUoCi0JSU4JUFVJTlQ4CXJzbmllLAotCUlOCVVJTlQJcnNuaWVfbGVuKQotewotCVBVSU5UOCBwU3VpdGUgPSBOVUxMOwotCVVJTlQ4IGNvdW50OwotCi0JaGV4X2R1bXAoIlJTTklFIiwgcnNuaWUsIHJzbmllX2xlbik7Ci0KLQkvLyBncm91cCBjaXBoZXIKLQlpZiAoKHBTdWl0ZSA9IEdldFN1aXRlRnJvbVJTTklFKHJzbmllLCByc25pZV9sZW4sIEdST1VQX1NVSVRFLCAmY291bnQpKSAhPSBOVUxMKQotCXsKLQkJaGV4X2R1bXAoImdyb3VwIGNpcGhlciIsIHBTdWl0ZSwgNCpjb3VudCk7Ci0JfQotCi0JLy8gcGFpcndpc2UgY2lwaGVyCi0JaWYgKChwU3VpdGUgPSBHZXRTdWl0ZUZyb21SU05JRShyc25pZSwgcnNuaWVfbGVuLCBQQUlSV0lTRV9TVUlURSwgJmNvdW50KSkgIT0gTlVMTCkKLQl7Ci0JCWhleF9kdW1wKCJwYWlyd2lzZSBjaXBoZXIiLCBwU3VpdGUsIDQqY291bnQpOwotCX0KLQotCS8vIEFLTQotCWlmICgocFN1aXRlID0gR2V0U3VpdGVGcm9tUlNOSUUocnNuaWUsIHJzbmllX2xlbiwgQUtNX1NVSVRFLCAmY291bnQpKSAhPSBOVUxMKQotCXsKLQkJaGV4X2R1bXAoIkFLTSBzdWl0ZSIsIHBTdWl0ZSwgNCpjb3VudCk7Ci0JfQotCi0JLy8gUE1LSUQKLQlpZiAoKHBTdWl0ZSA9IEdldFN1aXRlRnJvbVJTTklFKHJzbmllLCByc25pZV9sZW4sIFBNS0lEX0xJU1QsICZjb3VudCkpICE9IE5VTEwpCi0JewotCQloZXhfZHVtcCgiUE1LSUQiLCBwU3VpdGUsIExFTl9QTUtJRCk7Ci0JfQotCi19Ci0KLVZPSUQgUlRNUEluc2VydFJTTklFKAotCUlOIFBVQ0hBUiBwRnJhbWVCdWYsCi0JT1VUIFBVTE9ORyBwRnJhbWVMZW4sCi0JSU4gUFVJTlQ4IHJzbmllX3B0ciwKLQlJTiBVSU5UOCAgcnNuaWVfbGVuLAotCUlOIFBVSU5UOCBwbWtpZF9wdHIsCi0JSU4gVUlOVDggIHBta2lkX2xlbikKLXsKLQlQVUNIQVIJcFRtcEJ1ZjsKLQlVTE9ORwlUZW1wTGVuID0gMDsKLQlVSU5UOAlleHRyYV9sZW4gPSAwOwotCVVJTlQxNglwbWtfY291bnQgPSAwOwotCVVDSEFSCWllX251bTsKLQlVSU5UOAl0b3RhbF9sZW4gPSAwOwotICAgIFVDSEFSCVdQQTJfT1VJWzNdPXsweDAwLDB4MEYsMHhBQ307Ci0KLQlwVG1wQnVmID0gcEZyYW1lQnVmOwotCi0JLyogUE1LSUQtTGlzdCBNdXN0IGxhcmdlciB0aGFuIDAgYW5kIHRoZSBtdWx0aXBsZSBvZiAxNi4gKi8KLQlpZiAocG1raWRfbGVuID4gMCAmJiAoKHBta2lkX2xlbiAmIDB4MGYpID09IDApKQotCXsKLQkJZXh0cmFfbGVuID0gc2l6ZW9mKFVJTlQxNikgKyBwbWtpZF9sZW47Ci0KLQkJcG1rX2NvdW50ID0gKHBta2lkX2xlbiA+PiA0KTsKLQkJcG1rX2NvdW50ID0gY3B1MmxlMTYocG1rX2NvdW50KTsKLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCIlcyA6IFRoZSBsZW5ndGggaXMgUE1LSUQtTGlzdCBpcyBpbnZhbGlkICglZCksIHNvIGRvbid0IGluc2VydCBpdC5cbiIsCi0JCQkJCQkJCQlfX0ZVTkNUSU9OX18sIHBta2lkX2xlbikpOwotCX0KLQotCWlmIChyc25pZV9sZW4gIT0gMCkKLQl7Ci0JCWllX251bSA9IElFX1dQQTsKLQkJdG90YWxfbGVuID0gcnNuaWVfbGVuOwotCi0JCWlmIChOZGlzRXF1YWxNZW1vcnkocnNuaWVfcHRyICsgMiwgV1BBMl9PVUksIHNpemVvZihXUEEyX09VSSkpKQotCQl7Ci0JCQlpZV9udW0gPSBJRV9SU047Ci0JCQl0b3RhbF9sZW4gKz0gZXh0cmFfbGVuOwotCQl9Ci0KLQkJLyogY29uc3RydWN0IFJTTklFIGJvZHkgKi8KLQkJTWFrZU91dGdvaW5nRnJhbWUocFRtcEJ1ZiwJCQkmVGVtcExlbiwKLQkJCQkJCSAgMSwJCQkJJmllX251bSwKLQkJCQkJCSAgMSwJCQkJJnRvdGFsX2xlbiwKLQkJCQkJCSAgcnNuaWVfbGVuLAkJcnNuaWVfcHRyLAotCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0KLQkJcFRtcEJ1ZiArPSBUZW1wTGVuOwotCQkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47Ci0KLQkJaWYgKGllX251bSA9PSBJRV9SU04pCi0JCXsKLQkJCS8qIEluc2VydCBQTUtJRC1MaXN0IGZpZWxkICovCi0JCQlpZiAoZXh0cmFfbGVuID4gMCkKLQkJCXsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwVG1wQnVmLAkJCQkJJlRlbXBMZW4sCi0JCQkJCQkJCSAgMiwJCQkJCQkmcG1rX2NvdW50LAotCQkJCQkJCQkgIHBta2lkX2xlbiwJCQkJcG1raWRfcHRyLAotCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQotCQkJCXBUbXBCdWYgKz0gVGVtcExlbjsKLQkJCQkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm47Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jcnlwdF9hZXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NyeXB0X2Flcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDAwZjFlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NyeXB0X2Flcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAwNyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCWNyeXB0X2Flcy5jCi0KLQlBYnN0cmFjdDoKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIEVkZHkgICAgICAgIDIwMDkvMDEvMTkgICAgICBDcmVhdGUgQUVTLTEyOCwgQUVTLTE5MiwgQUVTLTI1NiwgQUVTLUNCQwotKi8KLQotI2luY2x1ZGUgImNyeXB0X2Flcy5oIgotCi0vKiBUaGUgdmFsdWUgZ2l2ZW4gYnkgW3heKGktMSksezAwfSx7MDB9LHswMH1dLCB3aXRoIHheKGktMSkgYmVpbmcgcG93ZXJzIG9mIHggaW4gdGhlIGZpZWxkIEdGKDJeOCkuICovCi1zdGF0aWMgY29uc3QgVUlOVDMyIGFlc19yY29uW10gPSB7Ci0JMHgwMDAwMDAwMCwgMHgwMTAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwNDAwMDAwMCwKLSAgICAweDA4MDAwMDAwLCAweDEwMDAwMDAwLCAweDIwMDAwMDAwLCAweDQwMDAwMDAwLAotICAgIDB4ODAwMDAwMDAsIDB4MUIwMDAwMDAsIDB4MzYwMDAwMDB9OwotCi1zdGF0aWMgY29uc3QgVUlOVDggYWVzX3Nib3hfZW5jW10gPSB7Ci0gIC8qICAwICAgICAxICAgICAyICAgICAzICAgICA0ICAgICA1ICAgICA2ICAgICA3ICAgICA4ICAgICA5ICAgICBhICAgICBiICAgICBjICAgICBkICAgICBlICAgICBmICAgICovCi0gICAgMHg2MywgMHg3YywgMHg3NywgMHg3YiwgMHhmMiwgMHg2YiwgMHg2ZiwgMHhjNSwgMHgzMCwgMHgwMSwgMHg2NywgMHgyYiwgMHhmZSwgMHhkNyAsMHhhYiwgMHg3NiwgLyogMCAqLwotICAgIDB4Y2EsIDB4ODIsIDB4YzksIDB4N2QsIDB4ZmEsIDB4NTksIDB4NDcsIDB4ZjAsIDB4YWQsIDB4ZDQsIDB4YTIsIDB4YWYsIDB4OWMsIDB4YTQgLDB4NzIsIDB4YzAsIC8qIDEgKi8KLSAgICAweGI3LCAweGZkLCAweDkzLCAweDI2LCAweDM2LCAweDNmLCAweGY3LCAweGNjLCAweDM0LCAweGE1LCAweGU1LCAweGYxLCAweDcxLCAweGQ4ICwweDMxLCAweDE1LCAvKiAyICovCi0gICAgMHgwNCwgMHhjNywgMHgyMywgMHhjMywgMHgxOCwgMHg5NiwgMHgwNSwgMHg5YSwgMHgwNywgMHgxMiwgMHg4MCwgMHhlMiwgMHhlYiwgMHgyNyAsMHhiMiwgMHg3NSwgLyogMyAqLwotICAgIDB4MDksIDB4ODMsIDB4MmMsIDB4MWEsIDB4MWIsIDB4NmUsIDB4NWEsIDB4YTAsIDB4NTIsIDB4M2IsIDB4ZDYsIDB4YjMsIDB4MjksIDB4ZTMgLDB4MmYsIDB4ODQsIC8qIDQgKi8KLSAgICAweDUzLCAweGQxLCAweDAwLCAweGVkLCAweDIwLCAweGZjLCAweGIxLCAweDViLCAweDZhLCAweGNiLCAweGJlLCAweDM5LCAweDRhLCAweDRjICwweDU4LCAweGNmLCAvKiA1ICovCi0gICAgMHhkMCwgMHhlZiwgMHhhYSwgMHhmYiwgMHg0MywgMHg0ZCwgMHgzMywgMHg4NSwgMHg0NSwgMHhmOSwgMHgwMiwgMHg3ZiwgMHg1MCwgMHgzYyAsMHg5ZiwgMHhhOCwgLyogNiAqLwotICAgIDB4NTEsIDB4YTMsIDB4NDAsIDB4OGYsIDB4OTIsIDB4OWQsIDB4MzgsIDB4ZjUsIDB4YmMsIDB4YjYsIDB4ZGEsIDB4MjEsIDB4MTAsIDB4ZmYgLDB4ZjMsIDB4ZDIsIC8qIDcgKi8KLSAgICAweGNkLCAweDBjLCAweDEzLCAweGVjLCAweDVmLCAweDk3LCAweDQ0LCAweDE3LCAweGM0LCAweGE3LCAweDdlLCAweDNkLCAweDY0LCAweDVkICwweDE5LCAweDczLCAvKiA4ICovCi0gICAgMHg2MCwgMHg4MSwgMHg0ZiwgMHhkYywgMHgyMiwgMHgyYSwgMHg5MCwgMHg4OCwgMHg0NiwgMHhlZSwgMHhiOCwgMHgxNCwgMHhkZSwgMHg1ZSAsMHgwYiwgMHhkYiwgLyogOSAqLwotICAgIDB4ZTAsIDB4MzIsIDB4M2EsIDB4MGEsIDB4NDksIDB4MDYsIDB4MjQsIDB4NWMsIDB4YzIsIDB4ZDMsIDB4YWMsIDB4NjIsIDB4OTEsIDB4OTUgLDB4ZTQsIDB4NzksIC8qIGEgKi8KLSAgICAweGU3LCAweGM4LCAweDM3LCAweDZkLCAweDhkLCAweGQ1LCAweDRlLCAweGE5LCAweDZjLCAweDU2LCAweGY0LCAweGVhLCAweDY1LCAweDdhICwweGFlLCAweDA4LCAvKiBiICovCi0gICAgMHhiYSwgMHg3OCwgMHgyNSwgMHgyZSwgMHgxYywgMHhhNiwgMHhiNCwgMHhjNiwgMHhlOCwgMHhkZCwgMHg3NCwgMHgxZiwgMHg0YiwgMHhiZCAsMHg4YiwgMHg4YSwgLyogYyAqLwotICAgIDB4NzAsIDB4M2UsIDB4YjUsIDB4NjYsIDB4NDgsIDB4MDMsIDB4ZjYsIDB4MGUsIDB4NjEsIDB4MzUsIDB4NTcsIDB4YjksIDB4ODYsIDB4YzEgLDB4MWQsIDB4OWUsIC8qIGQgKi8KLSAgICAweGUxLCAweGY4LCAweDk4LCAweDExLCAweDY5LCAweGQ5LCAweDhlLCAweDk0LCAweDliLCAweDFlLCAweDg3LCAweGU5LCAweGNlLCAweDU1ICwweDI4LCAweGRmLCAvKiBlICovCi0gICAgMHg4YywgMHhhMSwgMHg4OSwgMHgwZCwgMHhiZiwgMHhlNiwgMHg0MiwgMHg2OCwgMHg0MSwgMHg5OSwgMHgyZCwgMHgwZiwgMHhiMCwgMHg1NCAsMHhiYiwgMHgxNiwgLyogZiAqLwotfTsKLQotc3RhdGljIGNvbnN0IFVJTlQ4IGFlc19zYm94X2RlY1tdID0gewotICAvKiAgMCAgICAgMSAgICAgMiAgICAgMyAgICAgNCAgICAgNSAgICAgNiAgICAgNyAgICAgOCAgICAgOSAgICAgYSAgICAgYiAgICAgYyAgICAgZCAgICAgZSAgICAgZiAgICAqLwotICAgIDB4NTIsIDB4MDksIDB4NmEsIDB4ZDUsIDB4MzAsIDB4MzYsIDB4YTUsIDB4MzgsIDB4YmYsIDB4NDAsIDB4YTMsIDB4OWUsIDB4ODEsIDB4ZjMsIDB4ZDcsIDB4ZmIsIC8qIDAgKi8KLSAgICAweDdjLCAweGUzLCAweDM5LCAweDgyLCAweDliLCAweDJmLCAweGZmLCAweDg3LCAweDM0LCAweDhlLCAweDQzLCAweDQ0LCAweGM0LCAweGRlLCAweGU5LCAweGNiLCAvKiAxICovCi0gICAgMHg1NCwgMHg3YiwgMHg5NCwgMHgzMiwgMHhhNiwgMHhjMiwgMHgyMywgMHgzZCwgMHhlZSwgMHg0YywgMHg5NSwgMHgwYiwgMHg0MiwgMHhmYSwgMHhjMywgMHg0ZSwgLyogMiAqLwotICAgIDB4MDgsIDB4MmUsIDB4YTEsIDB4NjYsIDB4MjgsIDB4ZDksIDB4MjQsIDB4YjIsIDB4NzYsIDB4NWIsIDB4YTIsIDB4NDksIDB4NmQsIDB4OGIsIDB4ZDEsIDB4MjUsIC8qIDMgKi8KLSAgICAweDcyLCAweGY4LCAweGY2LCAweDY0LCAweDg2LCAweDY4LCAweDk4LCAweDE2LCAweGQ0LCAweGE0LCAweDVjLCAweGNjLCAweDVkLCAweDY1LCAweGI2LCAweDkyLCAvKiA0ICovCi0gICAgMHg2YywgMHg3MCwgMHg0OCwgMHg1MCwgMHhmZCwgMHhlZCwgMHhiOSwgMHhkYSwgMHg1ZSwgMHgxNSwgMHg0NiwgMHg1NywgMHhhNywgMHg4ZCwgMHg5ZCwgMHg4NCwgLyogNSAqLwotICAgIDB4OTAsIDB4ZDgsIDB4YWIsIDB4MDAsIDB4OGMsIDB4YmMsIDB4ZDMsIDB4MGEsIDB4ZjcsIDB4ZTQsIDB4NTgsIDB4MDUsIDB4YjgsIDB4YjMsIDB4NDUsIDB4MDYsIC8qIDYgKi8KLSAgICAweGQwLCAweDJjLCAweDFlLCAweDhmLCAweGNhLCAweDNmLCAweDBmLCAweDAyLCAweGMxLCAweGFmLCAweGJkLCAweDAzLCAweDAxLCAweDEzLCAweDhhLCAweDZiLCAvKiA3ICovCi0gICAgMHgzYSwgMHg5MSwgMHgxMSwgMHg0MSwgMHg0ZiwgMHg2NywgMHhkYywgMHhlYSwgMHg5NywgMHhmMiwgMHhjZiwgMHhjZSwgMHhmMCwgMHhiNCwgMHhlNiwgMHg3MywgLyogOCAqLwotICAgIDB4OTYsIDB4YWMsIDB4NzQsIDB4MjIsIDB4ZTcsIDB4YWQsIDB4MzUsIDB4ODUsIDB4ZTIsIDB4ZjksIDB4MzcsIDB4ZTgsIDB4MWMsIDB4NzUsIDB4ZGYsIDB4NmUsIC8qIDkgKi8KLSAgICAweDQ3LCAweGYxLCAweDFhLCAweDcxLCAweDFkLCAweDI5LCAweGM1LCAweDg5LCAweDZmLCAweGI3LCAweDYyLCAweDBlLCAweGFhLCAweDE4LCAweGJlLCAweDFiLCAvKiBhICovCi0gICAgMHhmYywgMHg1NiwgMHgzZSwgMHg0YiwgMHhjNiwgMHhkMiwgMHg3OSwgMHgyMCwgMHg5YSwgMHhkYiwgMHhjMCwgMHhmZSwgMHg3OCwgMHhjZCwgMHg1YSwgMHhmNCwgLyogYiAqLwotICAgIDB4MWYsIDB4ZGQsIDB4YTgsIDB4MzMsIDB4ODgsIDB4MDcsIDB4YzcsIDB4MzEsIDB4YjEsIDB4MTIsIDB4MTAsIDB4NTksIDB4MjcsIDB4ODAsIDB4ZWMsIDB4NWYsIC8qIGMgKi8KLSAgICAweDYwLCAweDUxLCAweDdmLCAweGE5LCAweDE5LCAweGI1LCAweDRhLCAweDBkLCAweDJkLCAweGU1LCAweDdhLCAweDlmLCAweDkzLCAweGM5LCAweDljLCAweGVmLCAvKiBkICovCi0gICAgMHhhMCwgMHhlMCwgMHgzYiwgMHg0ZCwgMHhhZSwgMHgyYSwgMHhmNSwgMHhiMCwgMHhjOCwgMHhlYiwgMHhiYiwgMHgzYywgMHg4MywgMHg1MywgMHg5OSwgMHg2MSwgLyogZSAqLwotICAgIDB4MTcsIDB4MmIsIDB4MDQsIDB4N2UsIDB4YmEsIDB4NzcsIDB4ZDYsIDB4MjYsIDB4ZTEsIDB4NjksIDB4MTQsIDB4NjMsIDB4NTUsIDB4MjEsIDB4MGMsIDB4N2QsIC8qIGYgKi8KLX07Ci0KLS8qIEFycmF5SW5kZXgqezAyfSAqLwotc3RhdGljIGNvbnN0IFVJTlQ4IGFlc19tdWxfMltdID0gewotICAvKiAgMCAgICAgMSAgICAgMiAgICAgMyAgICAgNCAgICAgNSAgICAgNiAgICAgNyAgICAgOCAgICAgOSAgICAgYSAgICAgYiAgICAgYyAgICAgZCAgICAgZSAgICAgZiAgICAqLwotICAgIDB4MDAsIDB4MDIsIDB4MDQsIDB4MDYsIDB4MDgsIDB4MGEsIDB4MGMsIDB4MGUsIDB4MTAsIDB4MTIsIDB4MTQsIDB4MTYsIDB4MTgsIDB4MWEsIDB4MWMsIDB4MWUsIC8qIDAgKi8KLSAgICAweDIwLCAweDIyLCAweDI0LCAweDI2LCAweDI4LCAweDJhLCAweDJjLCAweDJlLCAweDMwLCAweDMyLCAweDM0LCAweDM2LCAweDM4LCAweDNhLCAweDNjLCAweDNlLCAvKiAxICovCi0gICAgMHg0MCwgMHg0MiwgMHg0NCwgMHg0NiwgMHg0OCwgMHg0YSwgMHg0YywgMHg0ZSwgMHg1MCwgMHg1MiwgMHg1NCwgMHg1NiwgMHg1OCwgMHg1YSwgMHg1YywgMHg1ZSwgLyogMiAqLwotICAgIDB4NjAsIDB4NjIsIDB4NjQsIDB4NjYsIDB4NjgsIDB4NmEsIDB4NmMsIDB4NmUsIDB4NzAsIDB4NzIsIDB4NzQsIDB4NzYsIDB4NzgsIDB4N2EsIDB4N2MsIDB4N2UsIC8qIDMgKi8KLSAgICAweDgwLCAweDgyLCAweDg0LCAweDg2LCAweDg4LCAweDhhLCAweDhjLCAweDhlLCAweDkwLCAweDkyLCAweDk0LCAweDk2LCAweDk4LCAweDlhLCAweDljLCAweDllLCAvKiA0ICovCi0gICAgMHhhMCwgMHhhMiwgMHhhNCwgMHhhNiwgMHhhOCwgMHhhYSwgMHhhYywgMHhhZSwgMHhiMCwgMHhiMiwgMHhiNCwgMHhiNiwgMHhiOCwgMHhiYSwgMHhiYywgMHhiZSwgLyogNSAqLwotICAgIDB4YzAsIDB4YzIsIDB4YzQsIDB4YzYsIDB4YzgsIDB4Y2EsIDB4Y2MsIDB4Y2UsIDB4ZDAsIDB4ZDIsIDB4ZDQsIDB4ZDYsIDB4ZDgsIDB4ZGEsIDB4ZGMsIDB4ZGUsIC8qIDYgKi8KLSAgICAweGUwLCAweGUyLCAweGU0LCAweGU2LCAweGU4LCAweGVhLCAweGVjLCAweGVlLCAweGYwLCAweGYyLCAweGY0LCAweGY2LCAweGY4LCAweGZhLCAweGZjLCAweGZlLCAvKiA3ICovCi0gICAgMHgxYiwgMHgxOSwgMHgxZiwgMHgxZCwgMHgxMywgMHgxMSwgMHgxNywgMHgxNSwgMHgwYiwgMHgwOSwgMHgwZiwgMHgwZCwgMHgwMywgMHgwMSwgMHgwNywgMHgwNSwgLyogOCAqLwotICAgIDB4M2IsIDB4MzksIDB4M2YsIDB4M2QsIDB4MzMsIDB4MzEsIDB4MzcsIDB4MzUsIDB4MmIsIDB4MjksIDB4MmYsIDB4MmQsIDB4MjMsIDB4MjEsIDB4MjcsIDB4MjUsIC8qIDkgKi8KLSAgICAweDViLCAweDU5LCAweDVmLCAweDVkLCAweDUzLCAweDUxLCAweDU3LCAweDU1LCAweDRiLCAweDQ5LCAweDRmLCAweDRkLCAweDQzLCAweDQxLCAweDQ3LCAweDQ1LCAvKiBhICovCi0gICAgMHg3YiwgMHg3OSwgMHg3ZiwgMHg3ZCwgMHg3MywgMHg3MSwgMHg3NywgMHg3NSwgMHg2YiwgMHg2OSwgMHg2ZiwgMHg2ZCwgMHg2MywgMHg2MSwgMHg2NywgMHg2NSwgLyogYiAqLwotICAgIDB4OWIsIDB4OTksIDB4OWYsIDB4OWQsIDB4OTMsIDB4OTEsIDB4OTcsIDB4OTUsIDB4OGIsIDB4ODksIDB4OGYsIDB4OGQsIDB4ODMsIDB4ODEsIDB4ODcsIDB4ODUsIC8qIGMgKi8KLSAgICAweGJiLCAweGI5LCAweGJmLCAweGJkLCAweGIzLCAweGIxLCAweGI3LCAweGI1LCAweGFiLCAweGE5LCAweGFmLCAweGFkLCAweGEzLCAweGExLCAweGE3LCAweGE1LCAvKiBkICovCi0gICAgMHhkYiwgMHhkOSwgMHhkZiwgMHhkZCwgMHhkMywgMHhkMSwgMHhkNywgMHhkNSwgMHhjYiwgMHhjOSwgMHhjZiwgMHhjZCwgMHhjMywgMHhjMSwgMHhjNywgMHhjNSwgLyogZSAqLwotICAgIDB4ZmIsIDB4ZjksIDB4ZmYsIDB4ZmQsIDB4ZjMsIDB4ZjEsIDB4ZjcsIDB4ZjUsIDB4ZWIsIDB4ZTksIDB4ZWYsIDB4ZWQsIDB4ZTMsIDB4ZTEsIDB4ZTcsIDB4ZTUsIC8qIGYgKi8KLX07Ci0KLS8qIEFycmF5SW5kZXgqezAzfSAqLwotc3RhdGljIGNvbnN0IFVJTlQ4IGFlc19tdWxfM1tdID0gewotICAvKiAgMCAgICAgMSAgICAgMiAgICAgMyAgICAgNCAgICAgNSAgICAgNiAgICAgNyAgICAgOCAgICAgOSAgICAgYSAgICAgYiAgICAgYyAgICAgZCAgICAgZSAgICAgZiAgICAqLwotICAgIDB4MDAsIDB4MDMsIDB4MDYsIDB4MDUsIDB4MGMsIDB4MGYsIDB4MGEsIDB4MDksIDB4MTgsIDB4MWIsIDB4MWUsIDB4MWQsIDB4MTQsIDB4MTcsIDB4MTIsIDB4MTEsIC8qIDAgKi8KLSAgICAweDMwLCAweDMzLCAweDM2LCAweDM1LCAweDNjLCAweDNmLCAweDNhLCAweDM5LCAweDI4LCAweDJiLCAweDJlLCAweDJkLCAweDI0LCAweDI3LCAweDIyLCAweDIxLCAvKiAxICovCi0gICAgMHg2MCwgMHg2MywgMHg2NiwgMHg2NSwgMHg2YywgMHg2ZiwgMHg2YSwgMHg2OSwgMHg3OCwgMHg3YiwgMHg3ZSwgMHg3ZCwgMHg3NCwgMHg3NywgMHg3MiwgMHg3MSwgLyogMiAqLwotICAgIDB4NTAsIDB4NTMsIDB4NTYsIDB4NTUsIDB4NWMsIDB4NWYsIDB4NWEsIDB4NTksIDB4NDgsIDB4NGIsIDB4NGUsIDB4NGQsIDB4NDQsIDB4NDcsIDB4NDIsIDB4NDEsIC8qIDMgKi8KLSAgICAweGMwLCAweGMzLCAweGM2LCAweGM1LCAweGNjLCAweGNmLCAweGNhLCAweGM5LCAweGQ4LCAweGRiLCAweGRlLCAweGRkLCAweGQ0LCAweGQ3LCAweGQyLCAweGQxLCAvKiA0ICovCi0gICAgMHhmMCwgMHhmMywgMHhmNiwgMHhmNSwgMHhmYywgMHhmZiwgMHhmYSwgMHhmOSwgMHhlOCwgMHhlYiwgMHhlZSwgMHhlZCwgMHhlNCwgMHhlNywgMHhlMiwgMHhlMSwgLyogNSAqLwotICAgIDB4YTAsIDB4YTMsIDB4YTYsIDB4YTUsIDB4YWMsIDB4YWYsIDB4YWEsIDB4YTksIDB4YjgsIDB4YmIsIDB4YmUsIDB4YmQsIDB4YjQsIDB4YjcsIDB4YjIsIDB4YjEsIC8qIDYgKi8KLSAgICAweDkwLCAweDkzLCAweDk2LCAweDk1LCAweDljLCAweDlmLCAweDlhLCAweDk5LCAweDg4LCAweDhiLCAweDhlLCAweDhkLCAweDg0LCAweDg3LCAweDgyLCAweDgxLCAvKiA3ICovCi0gICAgMHg5YiwgMHg5OCwgMHg5ZCwgMHg5ZSwgMHg5NywgMHg5NCwgMHg5MSwgMHg5MiwgMHg4MywgMHg4MCwgMHg4NSwgMHg4NiwgMHg4ZiwgMHg4YywgMHg4OSwgMHg4YSwgLyogOCAqLwotICAgIDB4YWIsIDB4YTgsIDB4YWQsIDB4YWUsIDB4YTcsIDB4YTQsIDB4YTEsIDB4YTIsIDB4YjMsIDB4YjAsIDB4YjUsIDB4YjYsIDB4YmYsIDB4YmMsIDB4YjksIDB4YmEsIC8qIDkgKi8KLSAgICAweGZiLCAweGY4LCAweGZkLCAweGZlLCAweGY3LCAweGY0LCAweGYxLCAweGYyLCAweGUzLCAweGUwLCAweGU1LCAweGU2LCAweGVmLCAweGVjLCAweGU5LCAweGVhLCAvKiBhICovCi0gICAgMHhjYiwgMHhjOCwgMHhjZCwgMHhjZSwgMHhjNywgMHhjNCwgMHhjMSwgMHhjMiwgMHhkMywgMHhkMCwgMHhkNSwgMHhkNiwgMHhkZiwgMHhkYywgMHhkOSwgMHhkYSwgLyogYiAqLwotICAgIDB4NWIsIDB4NTgsIDB4NWQsIDB4NWUsIDB4NTcsIDB4NTQsIDB4NTEsIDB4NTIsIDB4NDMsIDB4NDAsIDB4NDUsIDB4NDYsIDB4NGYsIDB4NGMsIDB4NDksIDB4NGEsIC8qIGMgKi8KLSAgICAweDZiLCAweDY4LCAweDZkLCAweDZlLCAweDY3LCAweDY0LCAweDYxLCAweDYyLCAweDczLCAweDcwLCAweDc1LCAweDc2LCAweDdmLCAweDdjLCAweDc5LCAweDdhLCAvKiBkICovCi0gICAgMHgzYiwgMHgzOCwgMHgzZCwgMHgzZSwgMHgzNywgMHgzNCwgMHgzMSwgMHgzMiwgMHgyMywgMHgyMCwgMHgyNSwgMHgyNiwgMHgyZiwgMHgyYywgMHgyOSwgMHgyYSwgLyogZSAqLwotICAgIDB4MGIsIDB4MDgsIDB4MGQsIDB4MGUsIDB4MDcsIDB4MDQsIDB4MDEsIDB4MDIsIDB4MTMsIDB4MTAsIDB4MTUsIDB4MTYsIDB4MWYsIDB4MWMsIDB4MTksIDB4MWEsIC8qIGYgKi8KLX07Ci0KLS8qIEFycmF5SW5kZXgqezA5fSAqLwotc3RhdGljIGNvbnN0IFVJTlQ4IGFlc19tdWxfOVtdID0gewotICAvKiAgMCAgICAgMSAgICAgMiAgICAgMyAgICAgNCAgICAgNSAgICAgNiAgICAgNyAgICAgOCAgICAgOSAgICAgYSAgICAgYiAgICAgYyAgICAgZCAgICAgZSAgICAgZiAgICAqLwotICAgIDB4MDAsIDB4MDksIDB4MTIsIDB4MWIsIDB4MjQsIDB4MmQsIDB4MzYsIDB4M2YsIDB4NDgsIDB4NDEsIDB4NWEsIDB4NTMsIDB4NmMsIDB4NjUsIDB4N2UsIDB4NzcsIC8qIDAgKi8KLSAgICAweDkwLCAweDk5LCAweDgyLCAweDhiLCAweGI0LCAweGJkLCAweGE2LCAweGFmLCAweGQ4LCAweGQxLCAweGNhLCAweGMzLCAweGZjLCAweGY1LCAweGVlLCAweGU3LCAvKiAxICovCi0gICAgMHgzYiwgMHgzMiwgMHgyOSwgMHgyMCwgMHgxZiwgMHgxNiwgMHgwZCwgMHgwNCwgMHg3MywgMHg3YSwgMHg2MSwgMHg2OCwgMHg1NywgMHg1ZSwgMHg0NSwgMHg0YywgLyogMiAqLwotICAgIDB4YWIsIDB4YTIsIDB4YjksIDB4YjAsIDB4OGYsIDB4ODYsIDB4OWQsIDB4OTQsIDB4ZTMsIDB4ZWEsIDB4ZjEsIDB4ZjgsIDB4YzcsIDB4Y2UsIDB4ZDUsIDB4ZGMsIC8qIDMgKi8KLSAgICAweDc2LCAweDdmLCAweDY0LCAweDZkLCAweDUyLCAweDViLCAweDQwLCAweDQ5LCAweDNlLCAweDM3LCAweDJjLCAweDI1LCAweDFhLCAweDEzLCAweDA4LCAweDAxLCAvKiA0ICovCi0gICAgMHhlNiwgMHhlZiwgMHhmNCwgMHhmZCwgMHhjMiwgMHhjYiwgMHhkMCwgMHhkOSwgMHhhZSwgMHhhNywgMHhiYywgMHhiNSwgMHg4YSwgMHg4MywgMHg5OCwgMHg5MSwgLyogNSAqLwotICAgIDB4NGQsIDB4NDQsIDB4NWYsIDB4NTYsIDB4NjksIDB4NjAsIDB4N2IsIDB4NzIsIDB4MDUsIDB4MGMsIDB4MTcsIDB4MWUsIDB4MjEsIDB4MjgsIDB4MzMsIDB4M2EsIC8qIDYgKi8KLSAgICAweGRkLCAweGQ0LCAweGNmLCAweGM2LCAweGY5LCAweGYwLCAweGViLCAweGUyLCAweDk1LCAweDljLCAweDg3LCAweDhlLCAweGIxLCAweGI4LCAweGEzLCAweGFhLCAvKiA3ICovCi0gICAgMHhlYywgMHhlNSwgMHhmZSwgMHhmNywgMHhjOCwgMHhjMSwgMHhkYSwgMHhkMywgMHhhNCwgMHhhZCwgMHhiNiwgMHhiZiwgMHg4MCwgMHg4OSwgMHg5MiwgMHg5YiwgLyogOCAqLwotICAgIDB4N2MsIDB4NzUsIDB4NmUsIDB4NjcsIDB4NTgsIDB4NTEsIDB4NGEsIDB4NDMsIDB4MzQsIDB4M2QsIDB4MjYsIDB4MmYsIDB4MTAsIDB4MTksIDB4MDIsIDB4MGIsIC8qIDkgKi8KLSAgICAweGQ3LCAweGRlLCAweGM1LCAweGNjLCAweGYzLCAweGZhLCAweGUxLCAweGU4LCAweDlmLCAweDk2LCAweDhkLCAweDg0LCAweGJiLCAweGIyLCAweGE5LCAweGEwLCAvKiBhICovCi0gICAgMHg0NywgMHg0ZSwgMHg1NSwgMHg1YywgMHg2MywgMHg2YSwgMHg3MSwgMHg3OCwgMHgwZiwgMHgwNiwgMHgxZCwgMHgxNCwgMHgyYiwgMHgyMiwgMHgzOSwgMHgzMCwgLyogYiAqLwotICAgIDB4OWEsIDB4OTMsIDB4ODgsIDB4ODEsIDB4YmUsIDB4YjcsIDB4YWMsIDB4YTUsIDB4ZDIsIDB4ZGIsIDB4YzAsIDB4YzksIDB4ZjYsIDB4ZmYsIDB4ZTQsIDB4ZWQsIC8qIGMgKi8KLSAgICAweDBhLCAweDAzLCAweDE4LCAweDExLCAweDJlLCAweDI3LCAweDNjLCAweDM1LCAweDQyLCAweDRiLCAweDUwLCAweDU5LCAweDY2LCAweDZmLCAweDc0LCAweDdkLCAvKiBkICovCi0gICAgMHhhMSwgMHhhOCwgMHhiMywgMHhiYSwgMHg4NSwgMHg4YywgMHg5NywgMHg5ZSwgMHhlOSwgMHhlMCwgMHhmYiwgMHhmMiwgMHhjZCwgMHhjNCwgMHhkZiwgMHhkNiwgLyogZSAqLwotICAgIDB4MzEsIDB4MzgsIDB4MjMsIDB4MmEsIDB4MTUsIDB4MWMsIDB4MDcsIDB4MGUsIDB4NzksIDB4NzAsIDB4NmIsIDB4NjIsIDB4NWQsIDB4NTQsIDB4NGYsIDB4NDYsIC8qIGYgKi8KLX07Ci0KLS8qIEFycmF5SW5kZXgqezBifSAqLwotc3RhdGljIGNvbnN0IFVJTlQ4IGFlc19tdWxfYltdID0gewotICAvKiAgMCAgICAgMSAgICAgMiAgICAgMyAgICAgNCAgICAgNSAgICAgNiAgICAgNyAgICAgOCAgICAgOSAgICAgYSAgICAgYiAgICAgYyAgICAgZCAgICAgZSAgICAgZiAgICAqLwotICAgIDB4MDAsIDB4MGIsIDB4MTYsIDB4MWQsIDB4MmMsIDB4MjcsIDB4M2EsIDB4MzEsIDB4NTgsIDB4NTMsIDB4NGUsIDB4NDUsIDB4NzQsIDB4N2YsIDB4NjIsIDB4NjksIC8qIDAgKi8KLSAgICAweGIwLCAweGJiLCAweGE2LCAweGFkLCAweDljLCAweDk3LCAweDhhLCAweDgxLCAweGU4LCAweGUzLCAweGZlLCAweGY1LCAweGM0LCAweGNmLCAweGQyLCAweGQ5LCAvKiAxICovCi0gICAgMHg3YiwgMHg3MCwgMHg2ZCwgMHg2NiwgMHg1NywgMHg1YywgMHg0MSwgMHg0YSwgMHgyMywgMHgyOCwgMHgzNSwgMHgzZSwgMHgwZiwgMHgwNCwgMHgxOSwgMHgxMiwgLyogMiAqLwotICAgIDB4Y2IsIDB4YzAsIDB4ZGQsIDB4ZDYsIDB4ZTcsIDB4ZWMsIDB4ZjEsIDB4ZmEsIDB4OTMsIDB4OTgsIDB4ODUsIDB4OGUsIDB4YmYsIDB4YjQsIDB4YTksIDB4YTIsIC8qIDMgKi8KLSAgICAweGY2LCAweGZkLCAweGUwLCAweGViLCAweGRhLCAweGQxLCAweGNjLCAweGM3LCAweGFlLCAweGE1LCAweGI4LCAweGIzLCAweDgyLCAweDg5LCAweDk0LCAweDlmLCAvKiA0ICovCi0gICAgMHg0NiwgMHg0ZCwgMHg1MCwgMHg1YiwgMHg2YSwgMHg2MSwgMHg3YywgMHg3NywgMHgxZSwgMHgxNSwgMHgwOCwgMHgwMywgMHgzMiwgMHgzOSwgMHgyNCwgMHgyZiwgLyogNSAqLwotICAgIDB4OGQsIDB4ODYsIDB4OWIsIDB4OTAsIDB4YTEsIDB4YWEsIDB4YjcsIDB4YmMsIDB4ZDUsIDB4ZGUsIDB4YzMsIDB4YzgsIDB4ZjksIDB4ZjIsIDB4ZWYsIDB4ZTQsIC8qIDYgKi8KLSAgICAweDNkLCAweDM2LCAweDJiLCAweDIwLCAweDExLCAweDFhLCAweDA3LCAweDBjLCAweDY1LCAweDZlLCAweDczLCAweDc4LCAweDQ5LCAweDQyLCAweDVmLCAweDU0LCAvKiA3ICovCi0gICAgMHhmNywgMHhmYywgMHhlMSwgMHhlYSwgMHhkYiwgMHhkMCwgMHhjZCwgMHhjNiwgMHhhZiwgMHhhNCwgMHhiOSwgMHhiMiwgMHg4MywgMHg4OCwgMHg5NSwgMHg5ZSwgLyogOCAqLwotICAgIDB4NDcsIDB4NGMsIDB4NTEsIDB4NWEsIDB4NmIsIDB4NjAsIDB4N2QsIDB4NzYsIDB4MWYsIDB4MTQsIDB4MDksIDB4MDIsIDB4MzMsIDB4MzgsIDB4MjUsIDB4MmUsIC8qIDkgKi8KLSAgICAweDhjLCAweDg3LCAweDlhLCAweDkxLCAweGEwLCAweGFiLCAweGI2LCAweGJkLCAweGQ0LCAweGRmLCAweGMyLCAweGM5LCAweGY4LCAweGYzLCAweGVlLCAweGU1LCAvKiBhICovCi0gICAgMHgzYywgMHgzNywgMHgyYSwgMHgyMSwgMHgxMCwgMHgxYiwgMHgwNiwgMHgwZCwgMHg2NCwgMHg2ZiwgMHg3MiwgMHg3OSwgMHg0OCwgMHg0MywgMHg1ZSwgMHg1NSwgLyogYiAqLwotICAgIDB4MDEsIDB4MGEsIDB4MTcsIDB4MWMsIDB4MmQsIDB4MjYsIDB4M2IsIDB4MzAsIDB4NTksIDB4NTIsIDB4NGYsIDB4NDQsIDB4NzUsIDB4N2UsIDB4NjMsIDB4NjgsIC8qIGMgKi8KLSAgICAweGIxLCAweGJhLCAweGE3LCAweGFjLCAweDlkLCAweDk2LCAweDhiLCAweDgwLCAweGU5LCAweGUyLCAweGZmLCAweGY0LCAweGM1LCAweGNlLCAweGQzLCAweGQ4LCAvKiBkICovCi0gICAgMHg3YSwgMHg3MSwgMHg2YywgMHg2NywgMHg1NiwgMHg1ZCwgMHg0MCwgMHg0YiwgMHgyMiwgMHgyOSwgMHgzNCwgMHgzZiwgMHgwZSwgMHgwNSwgMHgxOCwgMHgxMywgLyogZSAqLwotICAgIDB4Y2EsIDB4YzEsIDB4ZGMsIDB4ZDcsIDB4ZTYsIDB4ZWQsIDB4ZjAsIDB4ZmIsIDB4OTIsIDB4OTksIDB4ODQsIDB4OGYsIDB4YmUsIDB4YjUsIDB4YTgsIDB4YTMsIC8qIGYgKi8KLX07Ci0KLS8qIEFycmF5SW5kZXgqezBkfSAqLwotc3RhdGljIGNvbnN0IFVJTlQ4IGFlc19tdWxfZFtdID0gewotICAvKiAgMCAgICAgMSAgICAgMiAgICAgMyAgICAgNCAgICAgNSAgICAgNiAgICAgNyAgICAgOCAgICAgOSAgICAgYSAgICAgYiAgICAgYyAgICAgZCAgICAgZSAgICAgZiAgICAqLwotICAgIDB4MDAsIDB4MGQsIDB4MWEsIDB4MTcsIDB4MzQsIDB4MzksIDB4MmUsIDB4MjMsIDB4NjgsIDB4NjUsIDB4NzIsIDB4N2YsIDB4NWMsIDB4NTEsIDB4NDYsIDB4NGIsIC8qIDAgKi8KLSAgICAweGQwLCAweGRkLCAweGNhLCAweGM3LCAweGU0LCAweGU5LCAweGZlLCAweGYzLCAweGI4LCAweGI1LCAweGEyLCAweGFmLCAweDhjLCAweDgxLCAweDk2LCAweDliLCAvKiAxICovCi0gICAgMHhiYiwgMHhiNiwgMHhhMSwgMHhhYywgMHg4ZiwgMHg4MiwgMHg5NSwgMHg5OCwgMHhkMywgMHhkZSwgMHhjOSwgMHhjNCwgMHhlNywgMHhlYSwgMHhmZCwgMHhmMCwgLyogMiAqLwotICAgIDB4NmIsIDB4NjYsIDB4NzEsIDB4N2MsIDB4NWYsIDB4NTIsIDB4NDUsIDB4NDgsIDB4MDMsIDB4MGUsIDB4MTksIDB4MTQsIDB4MzcsIDB4M2EsIDB4MmQsIDB4MjAsIC8qIDMgKi8KLSAgICAweDZkLCAweDYwLCAweDc3LCAweDdhLCAweDU5LCAweDU0LCAweDQzLCAweDRlLCAweDA1LCAweDA4LCAweDFmLCAweDEyLCAweDMxLCAweDNjLCAweDJiLCAweDI2LCAvKiA0ICovCi0gICAgMHhiZCwgMHhiMCwgMHhhNywgMHhhYSwgMHg4OSwgMHg4NCwgMHg5MywgMHg5ZSwgMHhkNSwgMHhkOCwgMHhjZiwgMHhjMiwgMHhlMSwgMHhlYywgMHhmYiwgMHhmNiwgLyogNSAqLwotICAgIDB4ZDYsIDB4ZGIsIDB4Y2MsIDB4YzEsIDB4ZTIsIDB4ZWYsIDB4ZjgsIDB4ZjUsIDB4YmUsIDB4YjMsIDB4YTQsIDB4YTksIDB4OGEsIDB4ODcsIDB4OTAsIDB4OWQsIC8qIDYgKi8KLSAgICAweDA2LCAweDBiLCAweDFjLCAweDExLCAweDMyLCAweDNmLCAweDI4LCAweDI1LCAweDZlLCAweDYzLCAweDc0LCAweDc5LCAweDVhLCAweDU3LCAweDQwLCAweDRkLCAvKiA3ICovCi0gICAgMHhkYSwgMHhkNywgMHhjMCwgMHhjZCwgMHhlZSwgMHhlMywgMHhmNCwgMHhmOSwgMHhiMiwgMHhiZiwgMHhhOCwgMHhhNSwgMHg4NiwgMHg4YiwgMHg5YywgMHg5MSwgLyogOCAqLwotICAgIDB4MGEsIDB4MDcsIDB4MTAsIDB4MWQsIDB4M2UsIDB4MzMsIDB4MjQsIDB4MjksIDB4NjIsIDB4NmYsIDB4NzgsIDB4NzUsIDB4NTYsIDB4NWIsIDB4NGMsIDB4NDEsIC8qIDkgKi8KLSAgICAweDYxLCAweDZjLCAweDdiLCAweDc2LCAweDU1LCAweDU4LCAweDRmLCAweDQyLCAweDA5LCAweDA0LCAweDEzLCAweDFlLCAweDNkLCAweDMwLCAweDI3LCAweDJhLCAvKiBhICovCi0gICAgMHhiMSwgMHhiYywgMHhhYiwgMHhhNiwgMHg4NSwgMHg4OCwgMHg5ZiwgMHg5MiwgMHhkOSwgMHhkNCwgMHhjMywgMHhjZSwgMHhlZCwgMHhlMCwgMHhmNywgMHhmYSwgLyogYiAqLwotICAgIDB4YjcsIDB4YmEsIDB4YWQsIDB4YTAsIDB4ODMsIDB4OGUsIDB4OTksIDB4OTQsIDB4ZGYsIDB4ZDIsIDB4YzUsIDB4YzgsIDB4ZWIsIDB4ZTYsIDB4ZjEsIDB4ZmMsIC8qIGMgKi8KLSAgICAweDY3LCAweDZhLCAweDdkLCAweDcwLCAweDUzLCAweDVlLCAweDQ5LCAweDQ0LCAweDBmLCAweDAyLCAweDE1LCAweDE4LCAweDNiLCAweDM2LCAweDIxLCAweDJjLCAvKiBkICovCi0gICAgMHgwYywgMHgwMSwgMHgxNiwgMHgxYiwgMHgzOCwgMHgzNSwgMHgyMiwgMHgyZiwgMHg2NCwgMHg2OSwgMHg3ZSwgMHg3MywgMHg1MCwgMHg1ZCwgMHg0YSwgMHg0NywgLyogZSAqLwotICAgIDB4ZGMsIDB4ZDEsIDB4YzYsIDB4Y2IsIDB4ZTgsIDB4ZTUsIDB4ZjIsIDB4ZmYsIDB4YjQsIDB4YjksIDB4YWUsIDB4YTMsIDB4ODAsIDB4OGQsIDB4OWEsIDB4OTcsIC8qIGYgKi8KLX07Ci0KLS8qIEFycmF5SW5kZXgqezBlfSAqLwotc3RhdGljIGNvbnN0IFVJTlQ4IGFlc19tdWxfZVtdID0gewotICAvKiAgMCAgICAgMSAgICAgMiAgICAgMyAgICAgNCAgICAgNSAgICAgNiAgICAgNyAgICAgOCAgICAgOSAgICAgYSAgICAgYiAgICAgYyAgICAgZCAgICAgZSAgICAgZiAgICAqLwotICAgIDB4MDAsIDB4MGUsIDB4MWMsIDB4MTIsIDB4MzgsIDB4MzYsIDB4MjQsIDB4MmEsIDB4NzAsIDB4N2UsIDB4NmMsIDB4NjIsIDB4NDgsIDB4NDYsIDB4NTQsIDB4NWEsIC8qIDAgKi8KLSAgICAweGUwLCAweGVlLCAweGZjLCAweGYyLCAweGQ4LCAweGQ2LCAweGM0LCAweGNhLCAweDkwLCAweDllLCAweDhjLCAweDgyLCAweGE4LCAweGE2LCAweGI0LCAweGJhLCAvKiAxICovCi0gICAgMHhkYiwgMHhkNSwgMHhjNywgMHhjOSwgMHhlMywgMHhlZCwgMHhmZiwgMHhmMSwgMHhhYiwgMHhhNSwgMHhiNywgMHhiOSwgMHg5MywgMHg5ZCwgMHg4ZiwgMHg4MSwgLyogMiAqLwotICAgIDB4M2IsIDB4MzUsIDB4MjcsIDB4MjksIDB4MDMsIDB4MGQsIDB4MWYsIDB4MTEsIDB4NGIsIDB4NDUsIDB4NTcsIDB4NTksIDB4NzMsIDB4N2QsIDB4NmYsIDB4NjEsIC8qIDMgKi8KLSAgICAweGFkLCAweGEzLCAweGIxLCAweGJmLCAweDk1LCAweDliLCAweDg5LCAweDg3LCAweGRkLCAweGQzLCAweGMxLCAweGNmLCAweGU1LCAweGViLCAweGY5LCAweGY3LCAvKiA0ICovCi0gICAgMHg0ZCwgMHg0MywgMHg1MSwgMHg1ZiwgMHg3NSwgMHg3YiwgMHg2OSwgMHg2NywgMHgzZCwgMHgzMywgMHgyMSwgMHgyZiwgMHgwNSwgMHgwYiwgMHgxOSwgMHgxNywgLyogNSAqLwotICAgIDB4NzYsIDB4NzgsIDB4NmEsIDB4NjQsIDB4NGUsIDB4NDAsIDB4NTIsIDB4NWMsIDB4MDYsIDB4MDgsIDB4MWEsIDB4MTQsIDB4M2UsIDB4MzAsIDB4MjIsIDB4MmMsIC8qIDYgKi8KLSAgICAweDk2LCAweDk4LCAweDhhLCAweDg0LCAweGFlLCAweGEwLCAweGIyLCAweGJjLCAweGU2LCAweGU4LCAweGZhLCAweGY0LCAweGRlLCAweGQwLCAweGMyLCAweGNjLCAvKiA3ICovCi0gICAgMHg0MSwgMHg0ZiwgMHg1ZCwgMHg1MywgMHg3OSwgMHg3NywgMHg2NSwgMHg2YiwgMHgzMSwgMHgzZiwgMHgyZCwgMHgyMywgMHgwOSwgMHgwNywgMHgxNSwgMHgxYiwgLyogOCAqLwotICAgIDB4YTEsIDB4YWYsIDB4YmQsIDB4YjMsIDB4OTksIDB4OTcsIDB4ODUsIDB4OGIsIDB4ZDEsIDB4ZGYsIDB4Y2QsIDB4YzMsIDB4ZTksIDB4ZTcsIDB4ZjUsIDB4ZmIsIC8qIDkgKi8KLSAgICAweDlhLCAweDk0LCAweDg2LCAweDg4LCAweGEyLCAweGFjLCAweGJlLCAweGIwLCAweGVhLCAweGU0LCAweGY2LCAweGY4LCAweGQyLCAweGRjLCAweGNlLCAweGMwLCAvKiBhICovCi0gICAgMHg3YSwgMHg3NCwgMHg2NiwgMHg2OCwgMHg0MiwgMHg0YywgMHg1ZSwgMHg1MCwgMHgwYSwgMHgwNCwgMHgxNiwgMHgxOCwgMHgzMiwgMHgzYywgMHgyZSwgMHgyMCwgLyogYiAqLwotICAgIDB4ZWMsIDB4ZTIsIDB4ZjAsIDB4ZmUsIDB4ZDQsIDB4ZGEsIDB4YzgsIDB4YzYsIDB4OWMsIDB4OTIsIDB4ODAsIDB4OGUsIDB4YTQsIDB4YWEsIDB4YjgsIDB4YjYsIC8qIGMgKi8KLSAgICAweDBjLCAweDAyLCAweDEwLCAweDFlLCAweDM0LCAweDNhLCAweDI4LCAweDI2LCAweDdjLCAweDcyLCAweDYwLCAweDZlLCAweDQ0LCAweDRhLCAweDU4LCAweDU2LCAvKiBkICovCi0gICAgMHgzNywgMHgzOSwgMHgyYiwgMHgyNSwgMHgwZiwgMHgwMSwgMHgxMywgMHgxZCwgMHg0NywgMHg0OSwgMHg1YiwgMHg1NSwgMHg3ZiwgMHg3MSwgMHg2MywgMHg2ZCwgLyogZSAqLwotICAgIDB4ZDcsIDB4ZDksIDB4Y2IsIDB4YzUsIDB4ZWYsIDB4ZTEsIDB4ZjMsIDB4ZmQsIDB4YTcsIDB4YTksIDB4YmIsIDB4YjUsIDB4OWYsIDB4OTEsIDB4ODMsIDB4OGQsIC8qIGYgKi8KLX07Ci0KLQotLyogRm9yIEFFU19DTUFDICovCi0jZGVmaW5lIEFFU19NQUNfTEVOR1RIIDE2IC8qIDEyOC1iaXQgc3RyaW5nICovCi1zdGF0aWMgVUlOVDggQ29uc3RfWmVyb1sxNl0gPSB7Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Ci1zdGF0aWMgVUlOVDggQ29uc3RfUmJbMTZdID0gewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODd9OwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgQUVTIGtleSBleHBhbnNpb24gKGtleSBzY2hlZHVsZSkKLQotQXJndW1lbnRzOgotICAgIEtleSAgICAgICAgICAgICAgQ2lwaGVyIGtleSwgaXQgbWF5IGJlIDE2LCAyNCwgb3IgMzIgYnl0ZXMgKDEyOCwgMTkyLCBvciAyNTYgYml0cykKLSAgICBLZXlMZW5ndGggICAgICAgIFRoZSBsZW5ndGggb2YgY2lwaGVyIGtleSBpbiBieXRlcwotICAgIHBhZXNfY3R4ICAgICAgICAgUG9pbnRlciB0byBBRVNfQ1RYX1NUUlVDCi0KLVJldHVybiBWYWx1ZToKLSAgICBwYWVzX2N0eCAgICAgICAgIFJldHJ1biB0aGUgS2V5V29yZEV4cGFuc2lvbiBvZiBBRVNfQ1RYX1NUUlVDCi0KLU5vdGU6Ci0gICAgUHNldWRvIGNvZGUgZm9yIGtleSBleHBhbnNpb24KLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICBOayA9IChrZXkgbGVuZ3RoLzQpOwotCi0gICAgICAgd2hpbGUgKGkgPCBOaykKLSAgICAgICAgICAgS2V5V29yZEV4cGFuc2lvbltpXSA9IHdvcmQoa2V5WzQqaV0sIGtleVs0KmkgKyAxXSwga2V5WzQqaSArIDJdLCBrZXlbNCppICsgM10pOwotICAgICAgICAgICBpKys7Ci0gICAgICAgZW5kIHdoaWxlCi0KLSAgICAgICB3aGlsZSAoaSA8ICgoa2V5IGxlbmd0aC80ICsgNiArIDEpKjQpICkKLSAgICAgICAgICAgdGVtcCA9IEtleVdvcmRFeHBhbnNpb25baSAtIDFdOwotICAgICAgICAgICBpZiAoaSAlIE5rID09MCkKLSAgICAgICAgICAgICAgIHRlbXAgPSBTdWJXb3JkKFJvdFdvcmQodGVtcCkpIF4gUmNvbltpL05rXTsKLSAgICAgICAgICAgZWxzZSBpZiAoKE5rID4gNikgJiYgKGkgJSA0ID09IDQpKQotICAgICAgICAgICAgICAgdGVtcCA9IFN1YldvcmQodGVtcCk7Ci0gICAgICAgICAgIGVuZCBpZgotCi0gICAgICAgICAgIEtleVdvcmRFeHBhbnNpb25baV0gPSBLZXlXb3JkRXhwYW5zaW9uW2kgLSBOa11eIHRlbXA7Ci0gICAgICAgICAgIGkrKzsKLSAgICAgICBlbmQgd2hpbGUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQUVTX0tleUV4cGFuc2lvbiAoCi0gICAgSU4gVUlOVDggS2V5W10sCi0gICAgSU4gVUlOVCBLZXlMZW5ndGgsCi0gICAgSU5PVVQgQUVTX0NUWF9TVFJVQyAqcGFlc19jdHgpCi17Ci0gICAgVUlOVCBLZXlJbmRleCA9IDA7Ci0gICAgVUlOVCBOdW1iZXJPZldvcmRPZktleSwgTnVtYmVyT2ZXb3JkT2ZLZXlFeHBhbnNpb247Ci0gICAgVUlOVDggIFRlbXBXb3JkW0FFU19LRVlfUk9XU10sIFRlbXA7Ci0gICAgVUlOVDMyIFRlbXByY29uOwotCi0gICAgTnVtYmVyT2ZXb3JkT2ZLZXkgPSBLZXlMZW5ndGggPj4gMjsKLSAgICB3aGlsZSAoS2V5SW5kZXggPCBOdW1iZXJPZldvcmRPZktleSkKLSAgICB7Ci0gICAgICAgIHBhZXNfY3R4LT5LZXlXb3JkRXhwYW5zaW9uWzBdW0tleUluZGV4XSA9IEtleVs0KktleUluZGV4XTsKLSAgICAgICAgcGFlc19jdHgtPktleVdvcmRFeHBhbnNpb25bMV1bS2V5SW5kZXhdID0gS2V5WzQqS2V5SW5kZXggKyAxXTsKLSAgICAgICAgcGFlc19jdHgtPktleVdvcmRFeHBhbnNpb25bMl1bS2V5SW5kZXhdID0gS2V5WzQqS2V5SW5kZXggKyAyXTsKLSAgICAgICAgcGFlc19jdHgtPktleVdvcmRFeHBhbnNpb25bM11bS2V5SW5kZXhdID0gS2V5WzQqS2V5SW5kZXggKyAzXTsKLSAgICAgICAgS2V5SW5kZXgrKzsKLSAgICB9IC8qIEVuZCBvZiB3aGlsZSAqLwotCi0gICAgTnVtYmVyT2ZXb3JkT2ZLZXlFeHBhbnNpb24gPSAoKFVJTlQpIEFFU19LRVlfUk9XUykgKiAoKEtleUxlbmd0aCA+PiAyKSArIDYgKyAxKTsKLSAgICB3aGlsZSAoS2V5SW5kZXggPCBOdW1iZXJPZldvcmRPZktleUV4cGFuc2lvbikKLSAgICB7Ci0gICAgICAgIFRlbXBXb3JkWzBdID0gcGFlc19jdHgtPktleVdvcmRFeHBhbnNpb25bMF1bS2V5SW5kZXggLSAxXTsKLSAgICAgICAgVGVtcFdvcmRbMV0gPSBwYWVzX2N0eC0+S2V5V29yZEV4cGFuc2lvblsxXVtLZXlJbmRleCAtIDFdOwotICAgICAgICBUZW1wV29yZFsyXSA9IHBhZXNfY3R4LT5LZXlXb3JkRXhwYW5zaW9uWzJdW0tleUluZGV4IC0gMV07Ci0gICAgICAgIFRlbXBXb3JkWzNdID0gcGFlc19jdHgtPktleVdvcmRFeHBhbnNpb25bM11bS2V5SW5kZXggLSAxXTsKLSAgICAgICAgaWYgKChLZXlJbmRleCAlIE51bWJlck9mV29yZE9mS2V5KSA9PSAwKSB7Ci0gICAgICAgICAgICBUZW1wcmNvbiA9IGFlc19yY29uW0tleUluZGV4L051bWJlck9mV29yZE9mS2V5XTsKLSAgICAgICAgICAgIFRlbXAgPSBhZXNfc2JveF9lbmNbVGVtcFdvcmRbMV1dXigoVGVtcHJjb24gPj4gMjQpICYgMHhmZik7Ci0gICAgICAgICAgICBUZW1wV29yZFsxXSA9IGFlc19zYm94X2VuY1tUZW1wV29yZFsyXV1eKChUZW1wcmNvbiA+PiAxNikgJiAweGZmKTsKLSAgICAgICAgICAgIFRlbXBXb3JkWzJdID0gYWVzX3Nib3hfZW5jW1RlbXBXb3JkWzNdXV4oKFRlbXByY29uID4+ICA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgVGVtcFdvcmRbM10gPSBhZXNfc2JveF9lbmNbVGVtcFdvcmRbMF1dXigoVGVtcHJjb24gICAgICApICYgMHhmZik7Ci0gICAgICAgICAgICBUZW1wV29yZFswXSA9IFRlbXA7Ci0gICAgICAgIH0gZWxzZSBpZiAoKE51bWJlck9mV29yZE9mS2V5ID4gNikgJiYgKChLZXlJbmRleCAlIE51bWJlck9mV29yZE9mS2V5KSA9PSA0KSkgewotICAgICAgICAgICAgVGVtcCA9IGFlc19zYm94X2VuY1tUZW1wV29yZFswXV07Ci0gICAgICAgICAgICBUZW1wV29yZFsxXSA9IGFlc19zYm94X2VuY1tUZW1wV29yZFsxXV07Ci0gICAgICAgICAgICBUZW1wV29yZFsyXSA9IGFlc19zYm94X2VuY1tUZW1wV29yZFsyXV07Ci0gICAgICAgICAgICBUZW1wV29yZFszXSA9IGFlc19zYm94X2VuY1tUZW1wV29yZFszXV07Ci0gICAgICAgICAgICBUZW1wV29yZFswXSA9IFRlbXA7Ci0gICAgICAgIH0KLSAgICAgICAgcGFlc19jdHgtPktleVdvcmRFeHBhbnNpb25bMF1bS2V5SW5kZXhdID0gcGFlc19jdHgtPktleVdvcmRFeHBhbnNpb25bMF1bS2V5SW5kZXggLSBOdW1iZXJPZldvcmRPZktleV1eVGVtcFdvcmRbMF07Ci0gICAgICAgIHBhZXNfY3R4LT5LZXlXb3JkRXhwYW5zaW9uWzFdW0tleUluZGV4XSA9IHBhZXNfY3R4LT5LZXlXb3JkRXhwYW5zaW9uWzFdW0tleUluZGV4IC0gTnVtYmVyT2ZXb3JkT2ZLZXldXlRlbXBXb3JkWzFdOwotICAgICAgICBwYWVzX2N0eC0+S2V5V29yZEV4cGFuc2lvblsyXVtLZXlJbmRleF0gPSBwYWVzX2N0eC0+S2V5V29yZEV4cGFuc2lvblsyXVtLZXlJbmRleCAtIE51bWJlck9mV29yZE9mS2V5XV5UZW1wV29yZFsyXTsKLSAgICAgICAgcGFlc19jdHgtPktleVdvcmRFeHBhbnNpb25bM11bS2V5SW5kZXhdID0gcGFlc19jdHgtPktleVdvcmRFeHBhbnNpb25bM11bS2V5SW5kZXggLSBOdW1iZXJPZldvcmRPZktleV1eVGVtcFdvcmRbM107Ci0gICAgICAgIEtleUluZGV4Kys7Ci0gICAgfSAvKiBFbmQgb2Ygd2hpbGUgKi8KLX0gLyogRW5kIG9mIEFFU19LZXlFeHBhbnNpb24gKi8KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEFFUyBlbmNyeXB0aW9uCi0KLUFyZ3VtZW50czoKLSAgICBQbGFpbkJsb2NrICAgICAgIFRoZSBibG9jayBvZiBwbGFpbiB0ZXh0LCAxNiBieXRlcygxMjggYml0cykgZWFjaCBibG9jawotICAgIFBsYWluQmxvY2tTaXplICAgVGhlIGxlbmd0aCBvZiBibG9jayBvZiBwbGFpbiB0ZXh0IGluIGJ5dGVzCi0gICAgS2V5ICAgICAgICAgICAgICBDaXBoZXIga2V5LCBpdCBtYXkgYmUgMTYsIDI0LCBvciAzMiBieXRlcyAoMTI4LCAxOTIsIG9yIDI1NiBiaXRzKQotICAgIEtleUxlbmd0aCAgICAgICAgVGhlIGxlbmd0aCBvZiBjaXBoZXIga2V5IGluIGJ5dGVzCi0gICAgQ2lwaGVyQmxvY2tTaXplICBUaGUgbGVuZ3RoIG9mIGFsbG9jYXRlZCBjaXBoZXIgYmxvY2sgaW4gYnl0ZXMKLQotUmV0dXJuIFZhbHVlOgotICAgIENpcGhlckJsb2NrICAgICAgUmV0dXJuIGNpcGhlciB0ZXh0Ci0gICAgQ2lwaGVyQmxvY2tTaXplICBSZXR1cm4gdGhlIGxlbmd0aCBvZiByZWFsIHVzZWQgY2lwaGVyIGJsb2NrIGluIGJ5dGVzCi0KLU5vdGU6Ci0gICAgUmVmZXJlbmNlIHRvIEZJUFMtUFVCIDE5NwotICAgIDEuIENoZWNrIGlmIGJsb2NrIHNpemUgaXMgMTYgYnl0ZXMoMTI4IGJpdHMpIGFuZCBpZiBrZXkgbGVuZ3RoIGlzIDE2LCAyNCwgb3IgMzIgYnl0ZXMoMTI4LCAxOTIsIG9yIDI1NiBiaXRzKQotICAgIDIuIFRyYW5zZmVyIHRoZSBwbGFpbiBibG9jayB0byBzdGF0ZSBibG9jawotICAgIDMuIE1haW4gZW5jcnlwdGlvbiByb3VuZHMKLSAgICA0LiBUcmFuc2ZlciB0aGUgc3RhdGUgYmxvY2sgdG8gY2lwaGVyIGJsb2NrCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgTnVtYmVyT2ZSb3VuZCA9IChrZXkgbGVuZ3RoIC8gNCkgKyA2OwotICAgICAgIHN0YXRlIGJsb2NrID0gcGxhaW4gYmxvY2s7Ci0KLSAgICAgICBBZGRSb3VuZEtleShzdGF0ZSBibG9jaywga2V5KTsKLSAgICAgICBmb3Igcm91bmQgPSAxIHRvIE51bWJlck9mUm91bmQKLSAgICAgICAgICAgU3ViQnl0ZXMoc3RhdGUgYmxvY2spCi0gICAgICAgICAgIFNoaWZ0Um93cyhzdGF0ZSBibG9jaykKLSAgICAgICAgICAgTWl4Q29sdW1ucyhzdGF0ZSBibG9jaykKLSAgICAgICAgICAgQWRkUm91bmRLZXkoc3RhdGUgYmxvY2ssIGtleSk7Ci0gICAgICAgZW5kIGZvcgotCi0gICAgICAgU3ViQnl0ZXMoc3RhdGUgYmxvY2spCi0gICAgICAgU2hpZnRSb3dzKHN0YXRlIGJsb2NrKQotICAgICAgIEFkZFJvdW5kS2V5KHN0YXRlIGJsb2NrLCBrZXkpOwotCi0gICAgICAgY2lwaGVyIGJsb2NrID0gc3RhdGUgYmxvY2s7Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEFFU19FbmNyeXB0ICgKLSAgICBJTiBVSU5UOCBQbGFpbkJsb2NrW10sCi0gICAgSU4gVUlOVCBQbGFpbkJsb2NrU2l6ZSwKLSAgICBJTiBVSU5UOCBLZXlbXSwKLSAgICBJTiBVSU5UIEtleUxlbmd0aCwKLSAgICBPVVQgVUlOVDggQ2lwaGVyQmxvY2tbXSwKLSAgICBJTk9VVCBVSU5UICpDaXBoZXJCbG9ja1NpemUpCi17Ci0gICAgQUVTX0NUWF9TVFJVQyBhZXNfY3R4OwotICAgIFVJTlQgUm93SW5kZXgsIENvbHVtbkluZGV4OwotICAgIFVJTlQgUm91bmRJbmRleCwgTnVtYmVyT2ZSb3VuZCA9IDA7Ci0gICAgVUlOVDggVGVtcCwgUm93MCwgUm93MSwgUm93MiwgUm93MzsKLQotICAgIC8qCi0gICAgICogMS4gQ2hlY2sgaWYgYmxvY2sgc2l6ZSBpcyAxNiBieXRlcygxMjggYml0cykgYW5kIGlmIGtleSBsZW5ndGggaXMgMTYsIDI0LCBvciAzMiBieXRlcygxMjgsIDE5Miwgb3IgMjU2IGJpdHMpCi0gICAgICovCi0gICAgaWYgKFBsYWluQmxvY2tTaXplICE9IEFFU19CTE9DS19TSVpFUykgewotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFFU19FbmNyeXB0OiBwbGFpbiBibG9jayBzaXplIGlzICVkIGJ5dGVzLCBpdCBtdXN0IGJlICVkIGJ5dGVzKDEyOCBiaXRzKS5cbiIsCi0gICAgICAgICAgICBQbGFpbkJsb2NrU2l6ZSwgQUVTX0JMT0NLX1NJWkVTKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgIGlmICgoS2V5TGVuZ3RoICE9IEFFU19LRVkxMjhfTEVOR1RIKSAmJiAoS2V5TGVuZ3RoICE9IEFFU19LRVkxOTJfTEVOR1RIKSAmJiAoS2V5TGVuZ3RoICE9IEFFU19LRVkyNTZfTEVOR1RIKSkgewotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFFU19FbmNyeXB0OiBrZXkgbGVuZ3RoIGlzICVkIGJ5dGVzLCBpdCBtdXN0IGJlICVkLCAlZCwgb3IgJWQgYnl0ZXMoMTI4LCAxOTIsIG9yIDI1NiBiaXRzKS5cbiIsCi0gICAgICAgICAgICBLZXlMZW5ndGgsIEFFU19LRVkxMjhfTEVOR1RILCBBRVNfS0VZMTkyX0xFTkdUSCwgQUVTX0tFWTI1Nl9MRU5HVEgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgaWYgKCpDaXBoZXJCbG9ja1NpemUgPCBBRVNfQkxPQ0tfU0laRVMpIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBRVNfRW5jcnlwdDogY2lwaGVyIGJsb2NrIHNpemUgaXMgJWQgYnl0ZXMsIGl0IG11c3QgYmUgJWQgYnl0ZXMoMTI4IGJpdHMpLlxuIiwKLSAgICAgICAgICAgICpDaXBoZXJCbG9ja1NpemUsIEFFU19CTE9DS19TSVpFUykpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIC8qCi0gICAgICogMi4gVHJhbnNmZXIgdGhlIHBsYWluIGJsb2NrIHRvIHN0YXRlIGJsb2NrCi0gICAgICovCi0gICAgZm9yIChSb3dJbmRleCA9IDA7IFJvd0luZGV4IDwgQUVTX1NUQVRFX1JPV1M7Um93SW5kZXgrKykKLSAgICAgICAgZm9yIChDb2x1bW5JbmRleCA9IDA7IENvbHVtbkluZGV4IDwgQUVTX1NUQVRFX0NPTFVNTlM7Q29sdW1uSW5kZXgrKykKLSAgICAgICAgICAgIGFlc19jdHguU3RhdGVbUm93SW5kZXhdW0NvbHVtbkluZGV4XSA9IFBsYWluQmxvY2tbUm93SW5kZXggKyA0KkNvbHVtbkluZGV4XTsKLQotICAgIC8qCi0gICAgICogIDMuIE1haW4gZW5jcnlwdGlvbiByb3VuZHMKLSAgICAgKi8KLSAgICBBRVNfS2V5RXhwYW5zaW9uKEtleSwgS2V5TGVuZ3RoLCAmYWVzX2N0eCk7Ci0gICAgTnVtYmVyT2ZSb3VuZCA9IChLZXlMZW5ndGggPj4gMikgKyA2OwotCi0gICAgLyogQUVTX0FkZFJvdW5kS2V5ICovCi0gICAgUm91bmRJbmRleCA9IDA7Ci0gICAgZm9yIChSb3dJbmRleCA9IDA7IFJvd0luZGV4IDwgQUVTX1NUQVRFX1JPV1M7Um93SW5kZXgrKykKLSAgICAgICAgZm9yIChDb2x1bW5JbmRleCA9IDA7IENvbHVtbkluZGV4IDwgQUVTX1NUQVRFX0NPTFVNTlM7Q29sdW1uSW5kZXgrKykKLSAgICAgICAgICAgIGFlc19jdHguU3RhdGVbUm93SW5kZXhdW0NvbHVtbkluZGV4XSBePSBhZXNfY3R4LktleVdvcmRFeHBhbnNpb25bUm93SW5kZXhdWyhSb3VuZEluZGV4KigoVUlOVCkgQUVTX1NUQVRFX0NPTFVNTlMpKSArIENvbHVtbkluZGV4XTsKLQotICAgIGZvciAoUm91bmRJbmRleCA9IDE7IFJvdW5kSW5kZXggPCBOdW1iZXJPZlJvdW5kO1JvdW5kSW5kZXgrKykKLSAgICB7Ci0gICAgICAgIC8qIEFFU19TdWJCeXRlcyAqLwotICAgICAgICBmb3IgKFJvd0luZGV4ID0gMDsgUm93SW5kZXggPCBBRVNfU1RBVEVfUk9XUztSb3dJbmRleCsrKQotICAgICAgICAgICAgZm9yIChDb2x1bW5JbmRleCA9IDA7IENvbHVtbkluZGV4IDwgQUVTX1NUQVRFX0NPTFVNTlM7Q29sdW1uSW5kZXgrKykKLSAgICAgICAgICAgICAgICBhZXNfY3R4LlN0YXRlW1Jvd0luZGV4XVtDb2x1bW5JbmRleF0gPSBhZXNfc2JveF9lbmNbYWVzX2N0eC5TdGF0ZVtSb3dJbmRleF1bQ29sdW1uSW5kZXhdXTsKLQotICAgICAgICAvKiBBRVNfU2hpZnRSb3dzICovCi0gICAgICAgIFRlbXAgPSBhZXNfY3R4LlN0YXRlWzFdWzBdOwotICAgICAgICBhZXNfY3R4LlN0YXRlWzFdWzBdID0gYWVzX2N0eC5TdGF0ZVsxXVsxXTsKLSAgICAgICAgYWVzX2N0eC5TdGF0ZVsxXVsxXSA9IGFlc19jdHguU3RhdGVbMV1bMl07Ci0gICAgICAgIGFlc19jdHguU3RhdGVbMV1bMl0gPSBhZXNfY3R4LlN0YXRlWzFdWzNdOwotICAgICAgICBhZXNfY3R4LlN0YXRlWzFdWzNdID0gVGVtcDsKLSAgICAgICAgVGVtcCA9IGFlc19jdHguU3RhdGVbMl1bMF07Ci0gICAgICAgIGFlc19jdHguU3RhdGVbMl1bMF0gPSBhZXNfY3R4LlN0YXRlWzJdWzJdOwotICAgICAgICBhZXNfY3R4LlN0YXRlWzJdWzJdID0gVGVtcDsKLSAgICAgICAgVGVtcCA9IGFlc19jdHguU3RhdGVbMl1bMV07Ci0gICAgICAgIGFlc19jdHguU3RhdGVbMl1bMV0gPSBhZXNfY3R4LlN0YXRlWzJdWzNdOwotICAgICAgICBhZXNfY3R4LlN0YXRlWzJdWzNdID0gVGVtcDsKLSAgICAgICAgVGVtcCA9IGFlc19jdHguU3RhdGVbM11bM107Ci0gICAgICAgIGFlc19jdHguU3RhdGVbM11bM10gPSBhZXNfY3R4LlN0YXRlWzNdWzJdOwotICAgICAgICBhZXNfY3R4LlN0YXRlWzNdWzJdID0gYWVzX2N0eC5TdGF0ZVszXVsxXTsKLSAgICAgICAgYWVzX2N0eC5TdGF0ZVszXVsxXSA9IGFlc19jdHguU3RhdGVbM11bMF07Ci0gICAgICAgIGFlc19jdHguU3RhdGVbM11bMF0gPSBUZW1wOwotCi0gICAgICAgIC8qIEFFU19NaXhDb2x1bW5zICovCi0gICAgICAgIGZvciAoQ29sdW1uSW5kZXggPSAwOyBDb2x1bW5JbmRleCA8IEFFU19TVEFURV9DT0xVTU5TO0NvbHVtbkluZGV4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJvdzAgPSBhZXNfY3R4LlN0YXRlWzBdW0NvbHVtbkluZGV4XTsKLSAgICAgICAgICAgIFJvdzEgPSBhZXNfY3R4LlN0YXRlWzFdW0NvbHVtbkluZGV4XTsKLSAgICAgICAgICAgIFJvdzIgPSBhZXNfY3R4LlN0YXRlWzJdW0NvbHVtbkluZGV4XTsKLSAgICAgICAgICAgIFJvdzMgPSBhZXNfY3R4LlN0YXRlWzNdW0NvbHVtbkluZGV4XTsKLSAgICAgICAgICAgIGFlc19jdHguU3RhdGVbMF1bQ29sdW1uSW5kZXhdID0gYWVzX211bF8yW1JvdzBdXmFlc19tdWxfM1tSb3cxXV5Sb3cyXlJvdzM7Ci0gICAgICAgICAgICBhZXNfY3R4LlN0YXRlWzFdW0NvbHVtbkluZGV4XSA9IFJvdzBeYWVzX211bF8yW1JvdzFdXmFlc19tdWxfM1tSb3cyXV5Sb3czOwotICAgICAgICAgICAgYWVzX2N0eC5TdGF0ZVsyXVtDb2x1bW5JbmRleF0gPSBSb3cwXlJvdzFeYWVzX211bF8yW1JvdzJdXmFlc19tdWxfM1tSb3czXTsKLSAgICAgICAgICAgIGFlc19jdHguU3RhdGVbM11bQ29sdW1uSW5kZXhdID0gYWVzX211bF8zW1JvdzBdXlJvdzFeUm93Ml5hZXNfbXVsXzJbUm93M107Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBBRVNfQWRkUm91bmRLZXkgKi8KLSAgICAgICAgZm9yIChSb3dJbmRleCA9IDA7IFJvd0luZGV4IDwgQUVTX1NUQVRFX1JPV1M7Um93SW5kZXgrKykKLSAgICAgICAgICAgIGZvciAoQ29sdW1uSW5kZXggPSAwOyBDb2x1bW5JbmRleCA8IEFFU19TVEFURV9DT0xVTU5TO0NvbHVtbkluZGV4KyspCi0gICAgICAgICAgICAgICAgYWVzX2N0eC5TdGF0ZVtSb3dJbmRleF1bQ29sdW1uSW5kZXhdIF49IGFlc19jdHguS2V5V29yZEV4cGFuc2lvbltSb3dJbmRleF1bKFJvdW5kSW5kZXgqKChVSU5UKSBBRVNfU1RBVEVfQ09MVU1OUykpICsgQ29sdW1uSW5kZXhdOwotICAgIH0gLyogRW5kIG9mIGZvciAqLwotCi0gICAgLyogQUVTX1N1YkJ5dGVzICovCi0gICAgZm9yIChSb3dJbmRleCA9IDA7IFJvd0luZGV4IDwgQUVTX1NUQVRFX1JPV1M7Um93SW5kZXgrKykKLSAgICAgICAgZm9yIChDb2x1bW5JbmRleCA9IDA7IENvbHVtbkluZGV4IDwgQUVTX1NUQVRFX0NPTFVNTlM7Q29sdW1uSW5kZXgrKykKLSAgICAgICAgICAgIGFlc19jdHguU3RhdGVbUm93SW5kZXhdW0NvbHVtbkluZGV4XSA9IGFlc19zYm94X2VuY1thZXNfY3R4LlN0YXRlW1Jvd0luZGV4XVtDb2x1bW5JbmRleF1dOwotICAgIC8qIEFFU19TaGlmdFJvd3MgKi8KLSAgICBUZW1wID0gYWVzX2N0eC5TdGF0ZVsxXVswXTsKLSAgICBhZXNfY3R4LlN0YXRlWzFdWzBdID0gYWVzX2N0eC5TdGF0ZVsxXVsxXTsKLSAgICBhZXNfY3R4LlN0YXRlWzFdWzFdID0gYWVzX2N0eC5TdGF0ZVsxXVsyXTsKLSAgICBhZXNfY3R4LlN0YXRlWzFdWzJdID0gYWVzX2N0eC5TdGF0ZVsxXVszXTsKLSAgICBhZXNfY3R4LlN0YXRlWzFdWzNdID0gVGVtcDsKLSAgICBUZW1wID0gYWVzX2N0eC5TdGF0ZVsyXVswXTsKLSAgICBhZXNfY3R4LlN0YXRlWzJdWzBdID0gYWVzX2N0eC5TdGF0ZVsyXVsyXTsKLSAgICBhZXNfY3R4LlN0YXRlWzJdWzJdID0gVGVtcDsKLSAgICBUZW1wID0gYWVzX2N0eC5TdGF0ZVsyXVsxXTsKLSAgICBhZXNfY3R4LlN0YXRlWzJdWzFdID0gYWVzX2N0eC5TdGF0ZVsyXVszXTsKLSAgICBhZXNfY3R4LlN0YXRlWzJdWzNdID0gVGVtcDsKLSAgICBUZW1wID0gYWVzX2N0eC5TdGF0ZVszXVszXTsKLSAgICBhZXNfY3R4LlN0YXRlWzNdWzNdID0gYWVzX2N0eC5TdGF0ZVszXVsyXTsKLSAgICBhZXNfY3R4LlN0YXRlWzNdWzJdID0gYWVzX2N0eC5TdGF0ZVszXVsxXTsKLSAgICBhZXNfY3R4LlN0YXRlWzNdWzFdID0gYWVzX2N0eC5TdGF0ZVszXVswXTsKLSAgICBhZXNfY3R4LlN0YXRlWzNdWzBdID0gVGVtcDsKLSAgICAvKiBBRVNfQWRkUm91bmRLZXkgKi8KLSAgICBmb3IgKFJvd0luZGV4ID0gMDsgUm93SW5kZXggPCBBRVNfU1RBVEVfUk9XUztSb3dJbmRleCsrKQotICAgICAgICBmb3IgKENvbHVtbkluZGV4ID0gMDsgQ29sdW1uSW5kZXggPCBBRVNfU1RBVEVfQ09MVU1OUztDb2x1bW5JbmRleCsrKQotICAgICAgICAgICAgYWVzX2N0eC5TdGF0ZVtSb3dJbmRleF1bQ29sdW1uSW5kZXhdIF49IGFlc19jdHguS2V5V29yZEV4cGFuc2lvbltSb3dJbmRleF1bKFJvdW5kSW5kZXgqKChVSU5UKSBBRVNfU1RBVEVfQ09MVU1OUykpICsgQ29sdW1uSW5kZXhdOwotCi0gICAgLyoKLSAgICAgKiA0LiBUcmFuc2ZlciB0aGUgc3RhdGUgYmxvY2sgdG8gY2lwaGVyIGJsb2NrCi0gICAgICovCi0gICAgZm9yIChSb3dJbmRleCA9IDA7IFJvd0luZGV4IDwgQUVTX1NUQVRFX1JPV1M7Um93SW5kZXgrKykKLSAgICAgICAgZm9yIChDb2x1bW5JbmRleCA9IDA7IENvbHVtbkluZGV4IDwgQUVTX1NUQVRFX0NPTFVNTlM7Q29sdW1uSW5kZXgrKykKLSAgICAgICAgICAgIENpcGhlckJsb2NrW1Jvd0luZGV4ICsgNCpDb2x1bW5JbmRleF0gPSBhZXNfY3R4LlN0YXRlW1Jvd0luZGV4XVtDb2x1bW5JbmRleF07Ci0KLSAgICAqQ2lwaGVyQmxvY2tTaXplID0gKChVSU5UKSBBRVNfU1RBVEVfUk9XUykqKChVSU5UKSBBRVNfU1RBVEVfQ09MVU1OUyk7Ci19IC8qIEVuZCBvZiBBRVNfRW5jcnlwdCAqLwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgQUVTIGRlY3J5cHRpb24KLQotQXJndW1lbnRzOgotICAgIENpcGhlckJsb2NrICAgICAgVGhlIGJsb2NrIG9mIGNpcGhlciB0ZXh0LCAxNiBieXRlcygxMjggYml0cykgZWFjaCBibG9jawotICAgIENpcGhlckJsb2NrU2l6ZSAgVGhlIGxlbmd0aCBvZiBibG9jayBvZiBjaXBoZXIgdGV4dCBpbiBieXRlcwotICAgIEtleSAgICAgICAgICAgICAgQ2lwaGVyIGtleSwgaXQgbWF5IGJlIDE2LCAyNCwgb3IgMzIgYnl0ZXMgKDEyOCwgMTkyLCBvciAyNTYgYml0cykKLSAgICBLZXlMZW5ndGggICAgICAgIFRoZSBsZW5ndGggb2YgY2lwaGVyIGtleSBpbiBieXRlcwotICAgIFBsYWluQmxvY2tTaXplICAgVGhlIGxlbmd0aCBvZiBhbGxvY2F0ZWQgcGxhaW4gYmxvY2sgaW4gYnl0ZXMKLQotUmV0dXJuIFZhbHVlOgotICAgIFBsYWluQmxvY2sgICAgICAgUmV0dXJuIHBsYWluIHRleHQKLSAgICBQbGFpbkJsb2NrU2l6ZSAgUmV0dXJuIHRoZSBsZW5ndGggb2YgcmVhbCB1c2VkIHBsYWluIGJsb2NrIGluIGJ5dGVzCi0KLU5vdGU6Ci0gICAgUmVmZXJlbmNlIHRvIEZJUFMtUFVCIDE5NwotICAgIDEuIENoZWNrIGlmIGJsb2NrIHNpemUgaXMgMTYgYnl0ZXMoMTI4IGJpdHMpIGFuZCBpZiBrZXkgbGVuZ3RoIGlzIDE2LCAyNCwgb3IgMzIgYnl0ZXMoMTI4LCAxOTIsIG9yIDI1NiBiaXRzKQotICAgIDIuIFRyYW5zZmVyIHRoZSBjaXBoZXIgYmxvY2sgdG8gc3RhdGUgYmxvY2sKLSAgICAzLiBNYWluIGRlY3J5cHRpb24gcm91bmRzCi0gICAgNC4gVHJhbnNmZXIgdGhlIHN0YXRlIGJsb2NrIHRvIHBsYWluIGJsb2NrCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgTnVtYmVyT2ZSb3VuZCA9IChrZXkgbGVuZ3RoIC8gNCkgKyA2OwotICAgICAgIHN0YXRlIGJsb2NrID0gY2lwaGVyIGJsb2NrOwotCi0gICAgICAgQWRkUm91bmRLZXkoc3RhdGUgYmxvY2ssIGtleSk7Ci0gICAgICAgZm9yIHJvdW5kID0gTnVtYmVyT2ZSb3VuZCB0byAxCi0gICAgICAgICAgIEludlN1YkJ5dGVzKHN0YXRlIGJsb2NrKQotICAgICAgICAgICBJbnZTaGlmdFJvd3Moc3RhdGUgYmxvY2spCi0gICAgICAgICAgIEludk1peENvbHVtbnMoc3RhdGUgYmxvY2spCi0gICAgICAgICAgIEFkZFJvdW5kS2V5KHN0YXRlIGJsb2NrLCBrZXkpOwotICAgICAgIGVuZCBmb3IKLQotICAgICAgIEludlN1YkJ5dGVzKHN0YXRlIGJsb2NrKQotICAgICAgIEludlNoaWZ0Um93cyhzdGF0ZSBibG9jaykKLSAgICAgICBBZGRSb3VuZEtleShzdGF0ZSBibG9jaywga2V5KTsKLQotICAgICAgIHBsYWluIGJsb2NrID0gc3RhdGUgYmxvY2s7Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEFFU19EZWNyeXB0ICgKLSAgICBJTiBVSU5UOCBDaXBoZXJCbG9ja1tdLAotICAgIElOIFVJTlQgQ2lwaGVyQmxvY2tTaXplLAotICAgIElOIFVJTlQ4IEtleVtdLAotICAgIElOIFVJTlQgS2V5TGVuZ3RoLAotICAgIE9VVCBVSU5UOCBQbGFpbkJsb2NrW10sCi0gICAgSU5PVVQgVUlOVCAqUGxhaW5CbG9ja1NpemUpCi17Ci0gICAgQUVTX0NUWF9TVFJVQyBhZXNfY3R4OwotICAgIFVJTlQgUm93SW5kZXgsIENvbHVtbkluZGV4OwotICAgIFVJTlQgUm91bmRJbmRleCwgTnVtYmVyT2ZSb3VuZCA9IDA7Ci0gICAgVUlOVDggVGVtcCwgUm93MCwgUm93MSwgUm93MiwgUm93MzsKLQotICAgIC8qCi0gICAgICogMS4gQ2hlY2sgaWYgYmxvY2sgc2l6ZSBpcyAxNiBieXRlcygxMjggYml0cykgYW5kIGlmIGtleSBsZW5ndGggaXMgMTYsIDI0LCBvciAzMiBieXRlcygxMjgsIDE5Miwgb3IgMjU2IGJpdHMpCi0gICAgICovCi0gICAgaWYgKCpQbGFpbkJsb2NrU2l6ZSA8IEFFU19CTE9DS19TSVpFUykgewotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFFU19EZWNyeXB0OiBwbGFpbiBibG9jayBzaXplIGlzICVkIGJ5dGVzLCBpdCBtdXN0IGJlICVkIGJ5dGVzKDEyOCBiaXRzKS5cbiIsCi0gICAgICAgICAgICAqUGxhaW5CbG9ja1NpemUsIEFFU19CTE9DS19TSVpFUykpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICBpZiAoKEtleUxlbmd0aCAhPSBBRVNfS0VZMTI4X0xFTkdUSCkgJiYgKEtleUxlbmd0aCAhPSBBRVNfS0VZMTkyX0xFTkdUSCkgJiYgKEtleUxlbmd0aCAhPSBBRVNfS0VZMjU2X0xFTkdUSCkpIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBRVNfRGVjcnlwdDoga2V5IGxlbmd0aCBpcyAlZCBieXRlcywgaXQgbXVzdCBiZSAlZCwgJWQsIG9yICVkIGJ5dGVzKDEyOCwgMTkyLCBvciAyNTYgYml0cykuXG4iLAotICAgICAgICAgICAgS2V5TGVuZ3RoLCBBRVNfS0VZMTI4X0xFTkdUSCwgQUVTX0tFWTE5Ml9MRU5HVEgsIEFFU19LRVkyNTZfTEVOR1RIKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgIGlmIChDaXBoZXJCbG9ja1NpemUgIT0gQUVTX0JMT0NLX1NJWkVTKSB7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQUVTX0RlY3J5cHQ6IGNpcGhlciBibG9jayBzaXplIGlzICVkIGJ5dGVzLCBpdCBtdXN0IGJlICVkIGJ5dGVzKDEyOCBiaXRzKS5cbiIsCi0gICAgICAgICAgICBDaXBoZXJCbG9ja1NpemUsIEFFU19CTE9DS19TSVpFUykpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIC8qCi0gICAgICogMi4gVHJhbnNmZXIgdGhlIGNpcGhlciBibG9jayB0byBzdGF0ZSBibG9jawotICAgICAqLwotICAgIGZvciAoUm93SW5kZXggPSAwOyBSb3dJbmRleCA8IEFFU19TVEFURV9ST1dTO1Jvd0luZGV4KyspCi0gICAgICAgIGZvciAoQ29sdW1uSW5kZXggPSAwOyBDb2x1bW5JbmRleCA8IEFFU19TVEFURV9DT0xVTU5TO0NvbHVtbkluZGV4KyspCi0gICAgICAgICAgICBhZXNfY3R4LlN0YXRlW1Jvd0luZGV4XVtDb2x1bW5JbmRleF0gPSBDaXBoZXJCbG9ja1tSb3dJbmRleCArIDQqQ29sdW1uSW5kZXhdOwotCi0gICAgLyoKLSAgICAgKiAgMy4gTWFpbiBkZWNyeXB0aW9uIHJvdW5kcwotICAgICAqLwotICAgIEFFU19LZXlFeHBhbnNpb24oS2V5LCBLZXlMZW5ndGgsICZhZXNfY3R4KTsKLSAgICBOdW1iZXJPZlJvdW5kID0gKEtleUxlbmd0aCA+PiAyKSArIDY7Ci0KLSAgICAvKiBBRVNfQWRkUm91bmRLZXkgKi8KLSAgICBSb3VuZEluZGV4ID0gTnVtYmVyT2ZSb3VuZDsKLSAgICBmb3IgKFJvd0luZGV4ID0gMDsgUm93SW5kZXggPCBBRVNfU1RBVEVfUk9XUztSb3dJbmRleCsrKQotICAgICAgICBmb3IgKENvbHVtbkluZGV4ID0gMDsgQ29sdW1uSW5kZXggPCBBRVNfU1RBVEVfQ09MVU1OUztDb2x1bW5JbmRleCsrKQotICAgICAgICAgICAgYWVzX2N0eC5TdGF0ZVtSb3dJbmRleF1bQ29sdW1uSW5kZXhdIF49IGFlc19jdHguS2V5V29yZEV4cGFuc2lvbltSb3dJbmRleF1bKFJvdW5kSW5kZXgqKChVSU5UKSBBRVNfU1RBVEVfQ09MVU1OUykpICsgQ29sdW1uSW5kZXhdOwotCi0gICAgZm9yIChSb3VuZEluZGV4ID0gKE51bWJlck9mUm91bmQgLSAxKTsgUm91bmRJbmRleCA+IDAgO1JvdW5kSW5kZXgtLSkKLSAgICB7Ci0gICAgICAgIC8qIEFFU19JbnZTaGlmdFJvd3MgKi8KLSAgICAgICAgVGVtcCA9IGFlc19jdHguU3RhdGVbMV1bM107Ci0gICAgICAgIGFlc19jdHguU3RhdGVbMV1bM10gPSBhZXNfY3R4LlN0YXRlWzFdWzJdOwotICAgICAgICBhZXNfY3R4LlN0YXRlWzFdWzJdID0gYWVzX2N0eC5TdGF0ZVsxXVsxXTsKLSAgICAgICAgYWVzX2N0eC5TdGF0ZVsxXVsxXSA9IGFlc19jdHguU3RhdGVbMV1bMF07Ci0gICAgICAgIGFlc19jdHguU3RhdGVbMV1bMF0gPSBUZW1wOwotICAgICAgICBUZW1wID0gYWVzX2N0eC5TdGF0ZVsyXVswXTsKLSAgICAgICAgYWVzX2N0eC5TdGF0ZVsyXVswXSA9IGFlc19jdHguU3RhdGVbMl1bMl07Ci0gICAgICAgIGFlc19jdHguU3RhdGVbMl1bMl0gPSBUZW1wOwotICAgICAgICBUZW1wID0gYWVzX2N0eC5TdGF0ZVsyXVsxXTsKLSAgICAgICAgYWVzX2N0eC5TdGF0ZVsyXVsxXSA9IGFlc19jdHguU3RhdGVbMl1bM107Ci0gICAgICAgIGFlc19jdHguU3RhdGVbMl1bM10gPSBUZW1wOwotICAgICAgICBUZW1wID0gYWVzX2N0eC5TdGF0ZVszXVswXTsKLSAgICAgICAgYWVzX2N0eC5TdGF0ZVszXVswXSA9IGFlc19jdHguU3RhdGVbM11bMV07Ci0gICAgICAgIGFlc19jdHguU3RhdGVbM11bMV0gPSBhZXNfY3R4LlN0YXRlWzNdWzJdOwotICAgICAgICBhZXNfY3R4LlN0YXRlWzNdWzJdID0gYWVzX2N0eC5TdGF0ZVszXVszXTsKLSAgICAgICAgYWVzX2N0eC5TdGF0ZVszXVszXSA9IFRlbXA7Ci0KLSAgICAgICAgLyogQUVTX0ludlN1YkJ5dGVzICovCi0gICAgICAgIGZvciAoUm93SW5kZXggPSAwOyBSb3dJbmRleCA8IEFFU19TVEFURV9ST1dTO1Jvd0luZGV4KyspCi0gICAgICAgICAgICBmb3IgKENvbHVtbkluZGV4ID0gMDsgQ29sdW1uSW5kZXggPCBBRVNfU1RBVEVfQ09MVU1OUztDb2x1bW5JbmRleCsrKQotICAgICAgICAgICAgICAgIGFlc19jdHguU3RhdGVbUm93SW5kZXhdW0NvbHVtbkluZGV4XSA9IGFlc19zYm94X2RlY1thZXNfY3R4LlN0YXRlW1Jvd0luZGV4XVtDb2x1bW5JbmRleF1dOwotCi0gICAgICAgIC8qIEFFU19BZGRSb3VuZEtleSAqLwotICAgICAgICBmb3IgKFJvd0luZGV4ID0gMDsgUm93SW5kZXggPCBBRVNfU1RBVEVfUk9XUztSb3dJbmRleCsrKQotICAgICAgICAgICAgZm9yIChDb2x1bW5JbmRleCA9IDA7IENvbHVtbkluZGV4IDwgQUVTX1NUQVRFX0NPTFVNTlM7Q29sdW1uSW5kZXgrKykKLSAgICAgICAgICAgICAgICBhZXNfY3R4LlN0YXRlW1Jvd0luZGV4XVtDb2x1bW5JbmRleF0gXj0gYWVzX2N0eC5LZXlXb3JkRXhwYW5zaW9uW1Jvd0luZGV4XVsoUm91bmRJbmRleCooKFVJTlQpIEFFU19TVEFURV9DT0xVTU5TKSkgKyBDb2x1bW5JbmRleF07Ci0KLSAgICAgICAgLyogQUVTX0ludk1peENvbHVtbnMgKi8KLSAgICAgICAgZm9yIChDb2x1bW5JbmRleCA9IDA7IENvbHVtbkluZGV4IDwgQUVTX1NUQVRFX0NPTFVNTlM7Q29sdW1uSW5kZXgrKykKLSAgICAgICAgewotICAgICAgICAgICAgUm93MCA9IGFlc19jdHguU3RhdGVbMF1bQ29sdW1uSW5kZXhdOwotICAgICAgICAgICAgUm93MSA9IGFlc19jdHguU3RhdGVbMV1bQ29sdW1uSW5kZXhdOwotICAgICAgICAgICAgUm93MiA9IGFlc19jdHguU3RhdGVbMl1bQ29sdW1uSW5kZXhdOwotICAgICAgICAgICAgUm93MyA9IGFlc19jdHguU3RhdGVbM11bQ29sdW1uSW5kZXhdOwotICAgICAgICAgICAgYWVzX2N0eC5TdGF0ZVswXVtDb2x1bW5JbmRleF0gPSBhZXNfbXVsX2VbUm93MF1eYWVzX211bF9iW1JvdzFdXmFlc19tdWxfZFtSb3cyXV5hZXNfbXVsXzlbUm93M107Ci0gICAgICAgICAgICBhZXNfY3R4LlN0YXRlWzFdW0NvbHVtbkluZGV4XSA9IGFlc19tdWxfOVtSb3cwXV5hZXNfbXVsX2VbUm93MV1eYWVzX211bF9iW1JvdzJdXmFlc19tdWxfZFtSb3czXTsKLSAgICAgICAgICAgIGFlc19jdHguU3RhdGVbMl1bQ29sdW1uSW5kZXhdID0gYWVzX211bF9kW1JvdzBdXmFlc19tdWxfOVtSb3cxXV5hZXNfbXVsX2VbUm93Ml1eYWVzX211bF9iW1JvdzNdOwotICAgICAgICAgICAgYWVzX2N0eC5TdGF0ZVszXVtDb2x1bW5JbmRleF0gPSBhZXNfbXVsX2JbUm93MF1eYWVzX211bF9kW1JvdzFdXmFlc19tdWxfOVtSb3cyXV5hZXNfbXVsX2VbUm93M107Ci0gICAgICAgIH0KLSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLQotICAgIC8qIEFFU19JbnZTaGlmdFJvd3MgKi8KLSAgICBUZW1wID0gYWVzX2N0eC5TdGF0ZVsxXVszXTsKLSAgICBhZXNfY3R4LlN0YXRlWzFdWzNdID0gYWVzX2N0eC5TdGF0ZVsxXVsyXTsKLSAgICBhZXNfY3R4LlN0YXRlWzFdWzJdID0gYWVzX2N0eC5TdGF0ZVsxXVsxXTsKLSAgICBhZXNfY3R4LlN0YXRlWzFdWzFdID0gYWVzX2N0eC5TdGF0ZVsxXVswXTsKLSAgICBhZXNfY3R4LlN0YXRlWzFdWzBdID0gVGVtcDsKLSAgICBUZW1wID0gYWVzX2N0eC5TdGF0ZVsyXVswXTsKLSAgICBhZXNfY3R4LlN0YXRlWzJdWzBdID0gYWVzX2N0eC5TdGF0ZVsyXVsyXTsKLSAgICBhZXNfY3R4LlN0YXRlWzJdWzJdID0gVGVtcDsKLSAgICBUZW1wID0gYWVzX2N0eC5TdGF0ZVsyXVsxXTsKLSAgICBhZXNfY3R4LlN0YXRlWzJdWzFdID0gYWVzX2N0eC5TdGF0ZVsyXVszXTsKLSAgICBhZXNfY3R4LlN0YXRlWzJdWzNdID0gVGVtcDsKLSAgICBUZW1wID0gYWVzX2N0eC5TdGF0ZVszXVswXTsKLSAgICBhZXNfY3R4LlN0YXRlWzNdWzBdID0gYWVzX2N0eC5TdGF0ZVszXVsxXTsKLSAgICBhZXNfY3R4LlN0YXRlWzNdWzFdID0gYWVzX2N0eC5TdGF0ZVszXVsyXTsKLSAgICBhZXNfY3R4LlN0YXRlWzNdWzJdID0gYWVzX2N0eC5TdGF0ZVszXVszXTsKLSAgICBhZXNfY3R4LlN0YXRlWzNdWzNdID0gVGVtcDsKLSAgICAvKiBBRVNfSW52U3ViQnl0ZXMgKi8KLSAgICBmb3IgKFJvd0luZGV4ID0gMDsgUm93SW5kZXggPCBBRVNfU1RBVEVfUk9XUztSb3dJbmRleCsrKQotICAgICAgICBmb3IgKENvbHVtbkluZGV4ID0gMDsgQ29sdW1uSW5kZXggPCBBRVNfU1RBVEVfQ09MVU1OUztDb2x1bW5JbmRleCsrKQotICAgICAgICAgICAgYWVzX2N0eC5TdGF0ZVtSb3dJbmRleF1bQ29sdW1uSW5kZXhdID0gYWVzX3Nib3hfZGVjW2Flc19jdHguU3RhdGVbUm93SW5kZXhdW0NvbHVtbkluZGV4XV07Ci0gICAgLyogQUVTX0FkZFJvdW5kS2V5ICovCi0gICAgZm9yIChSb3dJbmRleCA9IDA7IFJvd0luZGV4IDwgQUVTX1NUQVRFX1JPV1M7Um93SW5kZXgrKykKLSAgICAgICAgZm9yIChDb2x1bW5JbmRleCA9IDA7IENvbHVtbkluZGV4IDwgQUVTX1NUQVRFX0NPTFVNTlM7Q29sdW1uSW5kZXgrKykKLSAgICAgICAgICAgIGFlc19jdHguU3RhdGVbUm93SW5kZXhdW0NvbHVtbkluZGV4XSBePSBhZXNfY3R4LktleVdvcmRFeHBhbnNpb25bUm93SW5kZXhdWyhSb3VuZEluZGV4KigoVUlOVCkgQUVTX1NUQVRFX0NPTFVNTlMpKSArIENvbHVtbkluZGV4XTsKLQotICAgIC8qCi0gICAgICogNC4gVHJhbnNmZXIgdGhlIHN0YXRlIGJsb2NrIHRvIHBsYWluIGJsb2NrCi0gICAgICovCi0gICAgZm9yIChSb3dJbmRleCA9IDA7IFJvd0luZGV4IDwgQUVTX1NUQVRFX1JPV1M7Um93SW5kZXgrKykKLSAgICAgICAgZm9yIChDb2x1bW5JbmRleCA9IDA7IENvbHVtbkluZGV4IDwgQUVTX1NUQVRFX0NPTFVNTlM7Q29sdW1uSW5kZXgrKykKLSAgICAgICAgICAgIFBsYWluQmxvY2tbUm93SW5kZXggKyA0KkNvbHVtbkluZGV4XSA9IGFlc19jdHguU3RhdGVbUm93SW5kZXhdW0NvbHVtbkluZGV4XTsKLQotICAgICpQbGFpbkJsb2NrU2l6ZSA9ICgoVUlOVCkgQUVTX1NUQVRFX1JPV1MpKigoVUlOVCkgQUVTX1NUQVRFX0NPTFVNTlMpOwotfSAvKiBFbmQgb2YgQUVTX0RlY3J5cHQgKi8KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEFFUy1DQkMgZW5jcnlwdGlvbgotCi1Bcmd1bWVudHM6Ci0gICAgUGxhaW5UZXh0ICAgICAgICBQbGFpbiB0ZXh0Ci0gICAgUGxhaW5UZXh0TGVuZ3RoICBUaGUgbGVuZ3RoIG9mIHBsYWluIHRleHQgaW4gYnl0ZXMKLSAgICBLZXkgICAgICAgICAgICAgIENpcGhlciBrZXksIGl0IG1heSBiZSAxNiwgMjQsIG9yIDMyIGJ5dGVzICgxMjgsIDE5Miwgb3IgMjU2IGJpdHMpCi0gICAgS2V5TGVuZ3RoICAgICAgICBUaGUgbGVuZ3RoIG9mIGNpcGhlciBrZXkgaW4gYnl0ZXMKLSAgICBJViAgICAgICAgICAgICAgIEluaXRpYWxpemF0aW9uIHZlY3RvciwgaXQgbWF5IGJlIDE2IGJ5dGVzICgxMjggYml0cykKLSAgICBJVkxlbmd0aCAgICAgICAgIFRoZSBsZW5ndGggb2YgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGluIGJ5dGVzCi0gICAgQ2lwaGVyVGV4dExlbmd0aCBUaGUgbGVuZ3RoIG9mIGFsbG9jYXRlZCBjaXBoZXIgdGV4dCBpbiBieXRlcwotCi1SZXR1cm4gVmFsdWU6Ci0gICAgQ2lwaGVyVGV4dCAgICAgICBSZXR1cm4gY2lwaGVyIHRleHQKLSAgICBDaXBoZXJUZXh0TGVuZ3RoIFJldHVybiB0aGUgbGVuZ3RoIG9mIHJlYWwgdXNlZCBjaXBoZXIgdGV4dCBpbiBieXRlcwotCi1Ob3RlOgotICAgIFJlZmVyZW5jZSB0byBSRkMgMzYwMiBhbmQgTklTVCA4MDAtMzhBCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEFFU19DQkNfRW5jcnlwdCAoCi0gICAgSU4gVUlOVDggUGxhaW5UZXh0W10sCi0gICAgSU4gVUlOVCBQbGFpblRleHRMZW5ndGgsCi0gICAgSU4gVUlOVDggS2V5W10sCi0gICAgSU4gVUlOVCBLZXlMZW5ndGgsCi0gICAgSU4gVUlOVDggSVZbXSwKLSAgICBJTiBVSU5UIElWTGVuZ3RoLAotICAgIE9VVCBVSU5UOCBDaXBoZXJUZXh0W10sCi0gICAgSU5PVVQgVUlOVCAqQ2lwaGVyVGV4dExlbmd0aCkKLXsKLSAgICBVSU5UIFBhZGRpbmdTaXplLCBQbGFpbkJsb2NrU3RhcnQsIENpcGhlckJsb2NrU3RhcnQsIENpcGhlckJsb2NrU2l6ZTsKLSAgICBVSU5UIEluZGV4OwotICAgIFVJTlQ4IEJsb2NrW0FFU19CTE9DS19TSVpFU107Ci0KLSAgICAvKgotICAgICAqIDEuIENoZWNrIHRoZSBpbnB1dCBwYXJhbWV0ZXJzCi0gICAgICogICAgLSBDaXBoZXJUZXh0TGVuZ3RoID4gKFBsYWluVGV4dExlbmd0aCArIFBhZGRpbmcgc2l6ZSksIFBhZGRpbmcgc2l6ZSA9IGJsb2NrIHNpemUgLSAoUGxhaW5UZXh0TGVuZ3RoICUgYmxvY2sgc2l6ZSkKLSAgICAgKiAgICAtIEtleSBsZW5ndGggbXVzdCBiZSAxNiwgMjQsIG9yIDMyIGJ5dGVzKDEyOCwgMTkyLCBvciAyNTYgYml0cykKLSAgICAgKiAgICAtIElWIGxlbmd0aCBtdXN0IGJlIDE2IGJ5dGVzKDEyOCBiaXRzKQotICAgICAqLwotICAgIFBhZGRpbmdTaXplID0gKChVSU5UKSBBRVNfQkxPQ0tfU0laRVMpIC0gKFBsYWluVGV4dExlbmd0aCAlICgoVUlOVClBRVNfQkxPQ0tfU0laRVMpKTsKLSAgICBpZiAoKkNpcGhlclRleHRMZW5ndGggPCAoUGxhaW5UZXh0TGVuZ3RoICsgUGFkZGluZ1NpemUpKSB7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQUVTX0NCQ19FbmNyeXB0OiBjaXBoZXIgdGV4dCBsZW5ndGggaXMgJWQgYnl0ZXMgPCAocGxhaW4gdGV4dCBsZW5ndGggJWQgYnl0ZXMgKyBwYWRkaW5nIHNpemUgJWQgYnl0ZXMpLlxuIiwKLSAgICAgICAgICAgICpDaXBoZXJUZXh0TGVuZ3RoLCBQbGFpblRleHRMZW5ndGgsIFBhZGRpbmdTaXplKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgIGlmICgoS2V5TGVuZ3RoICE9IEFFU19LRVkxMjhfTEVOR1RIKSAmJiAoS2V5TGVuZ3RoICE9IEFFU19LRVkxOTJfTEVOR1RIKSAmJiAoS2V5TGVuZ3RoICE9IEFFU19LRVkyNTZfTEVOR1RIKSkgewotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFFU19DQkNfRW5jcnlwdDoga2V5IGxlbmd0aCBpcyAlZCBieXRlcywgaXQgbXVzdCBiZSAlZCwgJWQsIG9yICVkIGJ5dGVzKDEyOCwgMTkyLCBvciAyNTYgYml0cykuXG4iLAotICAgICAgICAgICAgS2V5TGVuZ3RoLCBBRVNfS0VZMTI4X0xFTkdUSCwgQUVTX0tFWTE5Ml9MRU5HVEgsIEFFU19LRVkyNTZfTEVOR1RIKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgIGlmIChJVkxlbmd0aCAhPSBBRVNfQ0JDX0lWX0xFTkdUSCkgewotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFFU19DQkNfRW5jcnlwdDogSVYgbGVuZ3RoIGlzICVkIGJ5dGVzLCBpdCBtdXN0IGJlICVkIGJ5dGVzKDEyOGJpdHMpLlxuIiwKLSAgICAgICAgICAgIElWTGVuZ3RoLCBBRVNfQ0JDX0lWX0xFTkdUSCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotCi0gICAgLyoKLSAgICAgKiAyLiBNYWluIGFsZ29yaXRobQotICAgICAqICAgIC0gUGxhaW4gdGV4dCBkaXZpZGUgaW50byBzZXJ2ZXJhbCBibG9ja3MgKDE2IGJ5dGVzL2Jsb2NrKQotICAgICAqICAgIC0gSWYgcGxhaW4gdGV4dCBpcyBkaXZpZGVkIHdpdGggbm8gcmVtYWluZGVyIGJ5IGJsb2NrLCBhZGQgYSBuZXcgYmxvY2sgYW5kIHBhZGRpbmcgc2l6ZSA9IGJsb2NrKDE2IGJ5dGVzKQotICAgICAqICAgIC0gSWYgcGxhaW4gdGV4dCBpcyBub3QgZGl2aWRlZCB3aXRoIG5vIHJlbWFpbmRlciBieSBibG9jaywgcGFkZGluZyBzaXplID0gKGJsb2NrIC0gcmVtYWluZGVyIHBsYWluIHRleHQpCi0gICAgICogICAgLSBFeGVjdXRlIEFFU19FbmNyeXB0IHByb2NlZHVyZS4KLSAgICAgKgotICAgICAqICAgIC0gUGFkZGluZyBtZXRob2Q6IFRoZSByZW1haW5kZXIgYnl0ZXMgd2lsbCBiZSBmaWxsZWQgd2l0aCBwYWRkaW5nIHNpemUgKDEgYnl0ZSkKLSAgICAgKi8KLSAgICBQbGFpbkJsb2NrU3RhcnQgPSAwOwotICAgIENpcGhlckJsb2NrU3RhcnQgPSAwOwotICAgIHdoaWxlICgoUGxhaW5UZXh0TGVuZ3RoIC0gUGxhaW5CbG9ja1N0YXJ0KSA+PSBBRVNfQkxPQ0tfU0laRVMpCi0gICAgewotICAgICAgICBpZiAoQ2lwaGVyQmxvY2tTdGFydCA9PSAwKSB7Ci0gICAgICAgICAgICBmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBBRVNfQkxPQ0tfU0laRVM7IEluZGV4KyspCi0gICAgICAgICAgICAgICAgQmxvY2tbSW5kZXhdID0gUGxhaW5UZXh0W1BsYWluQmxvY2tTdGFydCArIEluZGV4XV5JVltJbmRleF07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBBRVNfQkxPQ0tfU0laRVM7IEluZGV4KyspCi0gICAgICAgICAgICAgICAgQmxvY2tbSW5kZXhdID0gUGxhaW5UZXh0W1BsYWluQmxvY2tTdGFydCArIEluZGV4XV5DaXBoZXJUZXh0W0NpcGhlckJsb2NrU3RhcnQgLSAoKFVJTlQpIEFFU19CTE9DS19TSVpFUykgKyBJbmRleF07Ci0gICAgICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICAgICAgQ2lwaGVyQmxvY2tTaXplID0gKkNpcGhlclRleHRMZW5ndGggLSBDaXBoZXJCbG9ja1N0YXJ0OwotICAgICAgICBBRVNfRW5jcnlwdChCbG9jaywgQUVTX0JMT0NLX1NJWkVTICwgS2V5LCBLZXlMZW5ndGgsIENpcGhlclRleHQgKyBDaXBoZXJCbG9ja1N0YXJ0LCAmQ2lwaGVyQmxvY2tTaXplKTsKLQotICAgICAgICBQbGFpbkJsb2NrU3RhcnQgKz0gKChVSU5UKSBBRVNfQkxPQ0tfU0laRVMpOwotICAgICAgICBDaXBoZXJCbG9ja1N0YXJ0ICs9IENpcGhlckJsb2NrU2l6ZTsKLSAgICB9IC8qIEVuZCBvZiB3aGlsZSAqLwotCi0gICAgTmRpc01vdmVNZW1vcnkoQmxvY2ssICgmUGxhaW5UZXh0WzBdICsgUGxhaW5CbG9ja1N0YXJ0KSwgKFBsYWluVGV4dExlbmd0aCAtIFBsYWluQmxvY2tTdGFydCkpOwotICAgIE5kaXNGaWxsTWVtb3J5KChCbG9jayArICgoKFVJTlQpIEFFU19CTE9DS19TSVpFUykgLVBhZGRpbmdTaXplKSksIFBhZGRpbmdTaXplLCAoVUlOVDgpIFBhZGRpbmdTaXplKTsKLSAgICBpZiAoQ2lwaGVyQmxvY2tTdGFydCA9PSAwKSB7Ci0gICAgICAgZm9yIChJbmRleCA9IDA7IEluZGV4IDwgQUVTX0JMT0NLX1NJWkVTOyBJbmRleCsrKQotICAgICAgICAgICBCbG9ja1tJbmRleF0gXj0gSVZbSW5kZXhdOwotICAgIH0gZWxzZSB7Ci0gICAgICAgZm9yIChJbmRleCA9IDA7IEluZGV4IDwgQUVTX0JMT0NLX1NJWkVTOyBJbmRleCsrKQotICAgICAgICAgICBCbG9ja1tJbmRleF0gXj0gQ2lwaGVyVGV4dFtDaXBoZXJCbG9ja1N0YXJ0IC0gKChVSU5UKSBBRVNfQkxPQ0tfU0laRVMpICsgSW5kZXhdOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgQ2lwaGVyQmxvY2tTaXplID0gKkNpcGhlclRleHRMZW5ndGggLSBDaXBoZXJCbG9ja1N0YXJ0OwotICAgIEFFU19FbmNyeXB0KEJsb2NrLCBBRVNfQkxPQ0tfU0laRVMgLCBLZXksIEtleUxlbmd0aCwgQ2lwaGVyVGV4dCArIENpcGhlckJsb2NrU3RhcnQsICZDaXBoZXJCbG9ja1NpemUpOwotICAgIENpcGhlckJsb2NrU3RhcnQgKz0gQ2lwaGVyQmxvY2tTaXplOwotICAgICpDaXBoZXJUZXh0TGVuZ3RoID0gQ2lwaGVyQmxvY2tTdGFydDsKLX0gLyogRW5kIG9mIEFFU19DQkNfRW5jcnlwdCAqLwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgQUVTLUNCQyBkZWNyeXB0aW9uCi0KLUFyZ3VtZW50czoKLSAgICBDaXBoZXJUZXh0ICAgICAgIENpcGhlciB0ZXh0Ci0gICAgQ2lwaGVyVGV4dExlbmd0aCBUaGUgbGVuZ3RoIG9mIGNpcGhlciB0ZXh0IGluIGJ5dGVzCi0gICAgS2V5ICAgICAgICAgICAgICBDaXBoZXIga2V5LCBpdCBtYXkgYmUgMTYsIDI0LCBvciAzMiBieXRlcyAoMTI4LCAxOTIsIG9yIDI1NiBiaXRzKQotICAgIEtleUxlbmd0aCAgICAgICAgVGhlIGxlbmd0aCBvZiBjaXBoZXIga2V5IGluIGJ5dGVzCi0gICAgSVYgICAgICAgICAgICAgICBJbml0aWFsaXphdGlvbiB2ZWN0b3IsIGl0IG1heSBiZSAxNiBieXRlcyAoMTI4IGJpdHMpCi0gICAgSVZMZW5ndGggICAgICAgICBUaGUgbGVuZ3RoIG9mIGluaXRpYWxpemF0aW9uIHZlY3RvciBpbiBieXRlcwotICAgIFBsYWluVGV4dExlbmd0aCAgVGhlIGxlbmd0aCBvZiBhbGxvY2F0ZWQgcGxhaW4gdGV4dCBpbiBieXRlcwotCi1SZXR1cm4gVmFsdWU6Ci0gICAgUGxhaW5UZXh0ICAgICAgICBSZXR1cm4gcGxhaW4gdGV4dAotICAgIFBsYWluVGV4dExlbmd0aCAgUmV0dXJuIHRoZSBsZW5ndGggb2YgcmVhbCB1c2VkIHBsYWluIHRleHQgaW4gYnl0ZXMKLQotTm90ZToKLSAgICBSZWZlcmVuY2UgdG8gUkZDIDM2MDIgYW5kIE5JU1QgODAwLTM4QQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBRVNfQ0JDX0RlY3J5cHQgKAotICAgIElOIFVJTlQ4IENpcGhlclRleHRbXSwKLSAgICBJTiBVSU5UIENpcGhlclRleHRMZW5ndGgsCi0gICAgSU4gVUlOVDggS2V5W10sCi0gICAgSU4gVUlOVCBLZXlMZW5ndGgsCi0gICAgSU4gVUlOVDggSVZbXSwKLSAgICBJTiBVSU5UIElWTGVuZ3RoLAotICAgIE9VVCBVSU5UOCBQbGFpblRleHRbXSwKLSAgICBJTk9VVCBVSU5UICpQbGFpblRleHRMZW5ndGgpCi17Ci0gICAgVUlOVCBQYWRkaW5nU2l6ZSwgUGxhaW5CbG9ja1N0YXJ0LCBDaXBoZXJCbG9ja1N0YXJ0LCBQbGFpbkJsb2NrU2l6ZTsKLSAgICBVSU5UIEluZGV4OwotCi0gICAgLyoKLSAgICAgKiAxLiBDaGVjayB0aGUgaW5wdXQgcGFyYW1ldGVycwotICAgICAqICAgIC0gQ2lwaGVyVGV4dExlbmd0aCBtdXN0IGJlIGRpdmlkZWQgd2l0aCBubyByZW1haW5kZXIgYnkgYmxvY2sKLSAgICAgKiAgICAtIEtleSBsZW5ndGggbXVzdCBiZSAxNiwgMjQsIG9yIDMyIGJ5dGVzKDEyOCwgMTkyLCBvciAyNTYgYml0cykKLSAgICAgKiAgICAtIElWIGxlbmd0aCBtdXN0IGJlIDE2IGJ5dGVzKDEyOCBiaXRzKQotICAgICAqLwotICAgIGlmICgoQ2lwaGVyVGV4dExlbmd0aCAlIEFFU19CTE9DS19TSVpFUykgIT0gMCkgewotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFFU19DQkNfRGVjcnlwdDogY2lwaGVyIHRleHQgbGVuZ3RoIGlzICVkIGJ5dGVzLCBpdCBjYW4ndCBiZSBkaXZpZGVkIHdpdGggbm8gcmVtYWluZGVyIGJ5IGJsb2NrIHNpemUoJWQpLlxuIiwKLSAgICAgICAgICAgIENpcGhlclRleHRMZW5ndGgsIEFFU19CTE9DS19TSVpFUykpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICBpZiAoKEtleUxlbmd0aCAhPSBBRVNfS0VZMTI4X0xFTkdUSCkgJiYgKEtleUxlbmd0aCAhPSBBRVNfS0VZMTkyX0xFTkdUSCkgJiYgKEtleUxlbmd0aCAhPSBBRVNfS0VZMjU2X0xFTkdUSCkpIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBRVNfQ0JDX0RlY3J5cHQ6IGtleSBsZW5ndGggaXMgJWQgYnl0ZXMsIGl0IG11c3QgYmUgJWQsICVkLCBvciAlZCBieXRlcygxMjgsIDE5Miwgb3IgMjU2IGJpdHMpLlxuIiwKLSAgICAgICAgICAgIEtleUxlbmd0aCwgQUVTX0tFWTEyOF9MRU5HVEgsIEFFU19LRVkxOTJfTEVOR1RILCBBRVNfS0VZMjU2X0xFTkdUSCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICBpZiAoSVZMZW5ndGggIT0gQUVTX0NCQ19JVl9MRU5HVEgpIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBRVNfQ0JDX0RlY3J5cHQ6IElWIGxlbmd0aCBpcyAlZCBieXRlcywgaXQgbXVzdCBiZSAlZCBieXRlcygxMjhiaXRzKS5cbiIsCi0gICAgICAgICAgICBJVkxlbmd0aCwgQUVTX0NCQ19JVl9MRU5HVEgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLQotICAgIC8qCi0gICAgICogMi4gTWFpbiBhbGdvcml0aG0KLSAgICAgKiAgICAtIEN5cGhlciB0ZXh0IGRpdmlkZSBpbnRvIHNlcnZlcmFsIGJsb2NrcyAoMTYgYnl0ZXMvYmxvY2spCi0gICAgICogICAgLSBFeGVjdXRlIEFFU19EZWNyeXB0IHByb2NlZHVyZS4KLSAgICAgKiAgICAtIFJlbW92ZSBwYWRkaW5nIGJ5dGVzLCBwYWRkaW5nIHNpemUgaXMgdGhlIGxhc3QgYnl0ZSBvZiBwbGFpbiB0ZXh0Ci0gICAgICovCi0gICAgQ2lwaGVyQmxvY2tTdGFydCA9IDA7Ci0gICAgUGxhaW5CbG9ja1N0YXJ0ID0gMDsKLSAgICB3aGlsZSAoKENpcGhlclRleHRMZW5ndGggLSBDaXBoZXJCbG9ja1N0YXJ0KSA+PSBBRVNfQkxPQ0tfU0laRVMpCi0gICAgewotICAgICAgICBQbGFpbkJsb2NrU2l6ZSA9ICpQbGFpblRleHRMZW5ndGggLSBQbGFpbkJsb2NrU3RhcnQ7Ci0gICAgICAgIEFFU19EZWNyeXB0KENpcGhlclRleHQgKyBDaXBoZXJCbG9ja1N0YXJ0LCBBRVNfQkxPQ0tfU0laRVMgLCBLZXksIEtleUxlbmd0aCwgUGxhaW5UZXh0ICsgUGxhaW5CbG9ja1N0YXJ0LCAmUGxhaW5CbG9ja1NpemUpOwotCi0gICAgICAgIGlmIChQbGFpbkJsb2NrU3RhcnQgPT0gMCkgewotICAgICAgICAgICAgZm9yIChJbmRleCA9IDA7IEluZGV4IDwgQUVTX0JMT0NLX1NJWkVTOyBJbmRleCsrKQotICAgICAgICAgICAgICAgIFBsYWluVGV4dFtQbGFpbkJsb2NrU3RhcnQgKyBJbmRleF0gXj0gSVZbSW5kZXhdOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChJbmRleCA9IDA7IEluZGV4IDwgQUVTX0JMT0NLX1NJWkVTOyBJbmRleCsrKQotICAgICAgICAgICAgICAgIFBsYWluVGV4dFtQbGFpbkJsb2NrU3RhcnQgKyBJbmRleF0gXj0gQ2lwaGVyVGV4dFtDaXBoZXJCbG9ja1N0YXJ0ICsgSW5kZXggLSAoKFVJTlQpIEFFU19CTE9DS19TSVpFUyldOwotICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgICAgIENpcGhlckJsb2NrU3RhcnQgKz0gQUVTX0JMT0NLX1NJWkVTOwotICAgICAgICBQbGFpbkJsb2NrU3RhcnQgKz0gUGxhaW5CbG9ja1NpemU7Ci0gICAgfSAvKiBFbmQgb2Ygd2hpbGUgKi8KLQotICAgIFBhZGRpbmdTaXplID0gKFVJTlQ4KSBQbGFpblRleHRbUGxhaW5CbG9ja1N0YXJ0IC0xXTsKLSAgICAqUGxhaW5UZXh0TGVuZ3RoID0gUGxhaW5CbG9ja1N0YXJ0IC0gUGFkZGluZ1NpemU7Ci0KLX0gLyogRW5kIG9mIEFFU19DQkNfRW5jcnlwdCAqLwotCi0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBBRVMtQ01BQyBnZW5lcmF0ZSBzdWJrZXkKLQotQXJndW1lbnRzOgotICAgIEtleSAgICAgICAgQ2lwaGVyIGtleSAxMjggYml0cwotICAgIEtleUxlbmd0aCAgVGhlIGxlbmd0aCBvZiBDaXBoZXIga2V5IGluIGJ5dGVzCi0KLVJldHVybiBWYWx1ZToKLSAgICBTdWJLZXkxICAgIFN1YktleSAxIDEyOCBiaXRzCi0gICAgU3ViS2V5MiAgICBTdWJLZXkgMiAxMjggYml0cwotCi1Ob3RlOgotICAgIFJlZmVyZW5jZSB0byBSRkMgNDQ5MwotCi0gICAgU3RlcCAxLiAgTCA6PSBBRVMtMTI4KEssIGNvbnN0X1plcm8pOwotICAgIFN0ZXAgMi4gIGlmIE1TQihMKSBpcyBlcXVhbCB0byAwCi0gICAgICAgICAgICAgICAgdGhlbiAgICBLMSA6PSBMIDw8IDE7Ci0gICAgICAgICAgICAgICAgZWxzZSAgICBLMSA6PSAoTCA8PCAxKSBYT1IgY29uc3RfUmI7Ci0gICAgU3RlcCAzLiAgaWYgTVNCKEsxKSBpcyBlcXVhbCB0byAwCi0gICAgICAgICAgICAgICAgdGhlbiAgICBLMiA6PSBLMSA8PCAxOwotICAgICAgICAgICAgICAgIGVsc2UgICAgSzIgOj0gKEsxIDw8IDEpIFhPUiBjb25zdF9SYjsKLSAgICBTdGVwIDQuICByZXR1cm4gSzEsIEsyOwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBRVNfQ01BQ19HZW5lcmF0ZVN1YktleSAoCi0gICAgSU4gVUlOVDggS2V5W10sCi0gICAgSU4gVUlOVCBLZXlMZW5ndGgsCi0gICAgT1VUIFVJTlQ4IFN1YktleTFbXSwKLSAgICBPVVQgVUlOVDggU3ViS2V5MltdKQotewotICAgIFVJTlQ4IE1TQl9MID0gMCwgTVNCX0sxID0gMCwgVG9wX0JpdCA9IDA7Ci0gICAgVUlOVCAgU3ViS2V5MV9MZW5ndGggPSAwOwotICAgIElOVCAgIEluZGV4ID0gMDsKLQotICAgIGlmIChLZXlMZW5ndGggIT0gQUVTX0tFWTEyOF9MRU5HVEgpIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBRVNfQ01BQ19HZW5lcmF0ZVN1YktleToga2V5IGxlbmd0aCBpcyAlZCBieXRlcywgaXQgbXVzdCBiZSAlZCBieXRlcygxMjggYml0cykuXG4iLAotICAgICAgICAgICAgS2V5TGVuZ3RoLCBBRVNfS0VZMTI4X0xFTkdUSCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIC8qIFN0ZXAgMTogTCA6PSBBRVMtMTI4KEssIGNvbnN0X1plcm8pOyAqLwotICAgIFN1YktleTFfTGVuZ3RoID0gMTY7Ci0gICAgQUVTX0VuY3J5cHQoQ29uc3RfWmVybywgc2l6ZW9mKENvbnN0X1plcm8pLCBLZXksIEtleUxlbmd0aCwgU3ViS2V5MSwgJlN1YktleTFfTGVuZ3RoKTsKLQotICAgIC8qCi0gICAgICogU3RlcCAyLiAgaWYgTVNCKEwpIGlzIGVxdWFsIHRvIDAKLSAgICAgKiAgICAgICAgICAgdGhlbiAgICBLMSA6PSBMIDw8IDE7Ci0gICAgICogICAgICAgICAgIGVsc2UgICAgSzEgOj0gKEwgPDwgMSkgWE9SIGNvbnN0X1JiOwotICAgICAqLwotICAgIE1TQl9MID0gU3ViS2V5MVswXSAmIDB4ODA7Ci0gICAgZm9yKEluZGV4ID0gMDsgSW5kZXggPCAxNTsgSW5kZXgrKykgewotICAgICAgICBUb3BfQml0ID0gKFN1YktleTFbSW5kZXggKyAxXSAmIDB4ODApPzE6MDsKLSAgICAgICAgU3ViS2V5MVtJbmRleF0gPDw9IDE7Ci0gICAgICAgIFN1YktleTFbSW5kZXhdIHw9IFRvcF9CaXQ7Ci0gICAgfQotICAgIFN1YktleTFbMTVdIDw8PSAxOwotICAgIGlmIChNU0JfTCA+IDApIHsKLSAgICAgICAgZm9yKEluZGV4ID0gMDsgSW5kZXggPCAxNjsgSW5kZXgrKykKLSAgICAgICAgICAgIFN1YktleTFbSW5kZXhdIF49IENvbnN0X1JiW0luZGV4XTsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgLyoKLSAgICAgKiBTdGVwIDMuICBpZiBNU0IoSzEpIGlzIGVxdWFsIHRvIDAKLSAgICAgKiAgICAgICAgICAgdGhlbiAgICBLMiA6PSBLMSA8PCAxOwotICAgICAqICAgICAgICAgICBlbHNlICAgIEsyIDo9IChLMSA8PCAxKSBYT1IgY29uc3RfUmI7Ci0gICAgICovCi0gICAgTVNCX0sxID0gU3ViS2V5MVswXSAmIDB4ODA7Ci0gICAgZm9yKEluZGV4ID0gMDsgSW5kZXggPCAxNTsgSW5kZXgrKykgewotICAgICAgICBUb3BfQml0ID0gKFN1YktleTFbSW5kZXggKyAxXSAmIDB4ODApPzE6MDsKLSAgICAgICAgU3ViS2V5MltJbmRleF0gPSBTdWJLZXkxW0luZGV4XSA8PCAxOwotICAgICAgICBTdWJLZXkyW0luZGV4XSB8PSBUb3BfQml0OwotICAgIH0KLSAgICBTdWJLZXkyWzE1XSA9IFN1YktleTFbMTVdIDw8IDE7Ci0gICAgaWYgKE1TQl9LMSA+IDApIHsKLSAgICAgICAgZm9yKEluZGV4ID0gMDsgSW5kZXggPCAxNjsgSW5kZXgrKykKLSAgICAgICAgICAgIFN1YktleTJbSW5kZXhdIF49IENvbnN0X1JiW0luZGV4XTsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotfSAvKiBFbmQgb2YgQUVTX0NNQUNfR2VuZXJhdGVTdWJLZXkgKi8KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEFFUy1DTUFDCi0KLUFyZ3VtZW50czoKLSAgICBQbGFpblRleHQgICAgICAgIFBsYWluIHRleHQKLSAgICBQbGFpblRleHRMZW5ndGggIFRoZSBsZW5ndGggb2YgcGxhaW4gdGV4dCBpbiBieXRlcwotICAgIEtleSAgICAgICAgICAgICAgQ2lwaGVyIGtleSwgaXQgbWF5IGJlIDE2LCAyNCwgb3IgMzIgYnl0ZXMgKDEyOCwgMTkyLCBvciAyNTYgYml0cykKLSAgICBLZXlMZW5ndGggICAgICAgIFRoZSBsZW5ndGggb2YgY2lwaGVyIGtleSBpbiBieXRlcwotICAgIE1BQ1RleHRMZW5ndGggICAgVGhlIGxlbmd0aCBvZiBhbGxvY2F0ZWQgbWVtb3J5IHNwYWNlcyBpbiBieXRlcwotCi1SZXR1cm4gVmFsdWU6Ci0gICAgTUFDVGV4dCAgICAgICBNZXNzYWdlIGF1dGhlbnRpY2F0aW9uIGNvZGUgKDEyOC1iaXQgc3RyaW5nKQotICAgIE1BQ1RleHRMZW5ndGggUmV0dXJuIHRoZSBsZW5ndGggb2YgTWVzc2FnZSBhdXRoZW50aWNhdGlvbiBjb2RlIGluIGJ5dGVzCi0KLU5vdGU6Ci0gICAgUmVmZXJlbmNlIHRvIFJGQyA0NDkzCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEFFU19DTUFDICgKLSAgICBJTiBVSU5UOCBQbGFpblRleHRbXSwKLSAgICBJTiBVSU5UIFBsYWluVGV4dExlbmd0aCwKLSAgICBJTiBVSU5UOCBLZXlbXSwKLSAgICBJTiBVSU5UIEtleUxlbmd0aCwKLSAgICBPVVQgVUlOVDggTUFDVGV4dFtdLAotICAgIElOT1VUIFVJTlQgKk1BQ1RleHRMZW5ndGgpCi17Ci0gICAgVUlOVCAgUGxhaW5CbG9ja1N0YXJ0OwotICAgIFVJTlQ4IFhbQUVTX0JMT0NLX1NJWkVTXSwgWVtBRVNfQkxPQ0tfU0laRVNdOwotICAgIFVJTlQ4IFN1YktleTFbMTZdOwotICAgIFVJTlQ4IFN1YktleTJbMTZdOwotICAgIElOVCBYX0xlbmd0aCwgSW5kZXg7Ci0KLSAgICBpZiAoKk1BQ1RleHRMZW5ndGggPCBBRVNfTUFDX0xFTkdUSCkgewotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFFU19DTUFDOiBNQUMgdGV4dCBsZW5ndGggaXMgbGVzcyB0aGFuICVkIGJ5dGVzKS5cbiIsCi0gICAgICAgICAgICBBRVNfTUFDX0xFTkdUSCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICBpZiAoS2V5TGVuZ3RoICE9IEFFU19LRVkxMjhfTEVOR1RIKSB7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQUVTX0NNQUM6IGtleSBsZW5ndGggaXMgJWQgYnl0ZXMsIGl0IG11c3QgYmUgJWQgYnl0ZXMoMTI4IGJpdHMpLlxuIiwKLSAgICAgICAgICAgIEtleUxlbmd0aCwgQUVTX0tFWTEyOF9MRU5HVEgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICAvKiBTdGVwIDEuICAoSzEsSzIpIDo9IEdlbmVyYXRlX1N1YmtleShLKTsgKi8KLSAgICBOZGlzWmVyb01lbW9yeShTdWJLZXkxLCAxNik7Ci0gICAgTmRpc1plcm9NZW1vcnkoU3ViS2V5MiwgMTYpOwotICAgIEFFU19DTUFDX0dlbmVyYXRlU3ViS2V5KEtleSwgS2V5TGVuZ3RoLCBTdWJLZXkxLCBTdWJLZXkyKTsKLQotICAgIC8qCi0gICAgICogMi4gTWFpbiBhbGdvcml0aG0KLSAgICAgKiAgICAtIFBsYWluIHRleHQgZGl2aWRlIGludG8gc2VydmVyYWwgYmxvY2tzICgxNiBieXRlcy9ibG9jaykKLSAgICAgKiAgICAtIElmIHBsYWluIHRleHQgaXMgbm90IGRpdmlkZWQgd2l0aCBubyByZW1haW5kZXIgYnkgYmxvY2ssIHBhZGRpbmcgc2l6ZSA9IChibG9jayAtIHJlbWFpbmRlciBwbGFpbiB0ZXh0KQotICAgICAqICAgIC0gRXhlY3V0ZSBBRVNfRW5jcnlwdCBwcm9jZWR1cmUuCi0gICAgICovCi0gICAgUGxhaW5CbG9ja1N0YXJ0ID0gMDsKLSAgICBOZGlzTW92ZU1lbW9yeShYLCBDb25zdF9aZXJvLCBBRVNfQkxPQ0tfU0laRVMpOwotICAgIHdoaWxlICgoUGxhaW5UZXh0TGVuZ3RoIC0gUGxhaW5CbG9ja1N0YXJ0KSA+IEFFU19CTE9DS19TSVpFUykKLSAgICB7Ci0gICAgICAgIGZvciAoSW5kZXggPSAwOyBJbmRleCA8IEFFU19CTE9DS19TSVpFUzsgSW5kZXgrKykKLSAgICAgICAgICAgICAgICBZW0luZGV4XSA9IFBsYWluVGV4dFtQbGFpbkJsb2NrU3RhcnQgKyBJbmRleF1eWFtJbmRleF07Ci0KLSAgICAgICAgWF9MZW5ndGggPSBzaXplb2YoWCk7Ci0gICAgICAgIEFFU19FbmNyeXB0KFksIHNpemVvZihZKSAsIEtleSwgS2V5TGVuZ3RoLCBYLCAmWF9MZW5ndGgpOwotICAgICAgICBQbGFpbkJsb2NrU3RhcnQgKz0gKChVSU5UKSBBRVNfQkxPQ0tfU0laRVMpOwotICAgIH0gLyogRW5kIG9mIHdoaWxlICovCi0gICAgaWYgKChQbGFpblRleHRMZW5ndGggLSBQbGFpbkJsb2NrU3RhcnQpID09IEFFU19CTE9DS19TSVpFUykgewotICAgICAgICBmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBBRVNfQkxPQ0tfU0laRVM7IEluZGV4KyspCi0gICAgICAgICAgICAgICAgWVtJbmRleF0gPSBQbGFpblRleHRbUGxhaW5CbG9ja1N0YXJ0ICsgSW5kZXhdXlhbSW5kZXhdXlN1YktleTFbSW5kZXhdOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIE5kaXNaZXJvTWVtb3J5KFksIEFFU19CTE9DS19TSVpFUyk7Ci0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KFksICZQbGFpblRleHRbUGxhaW5CbG9ja1N0YXJ0XSwgKFBsYWluVGV4dExlbmd0aCAtIFBsYWluQmxvY2tTdGFydCkpOwotICAgICAgICBZWyhQbGFpblRleHRMZW5ndGggLSBQbGFpbkJsb2NrU3RhcnQpXSA9IDB4ODA7Ci0gICAgICAgIGZvciAoSW5kZXggPSAwOyBJbmRleCA8IEFFU19CTE9DS19TSVpFUzsgSW5kZXgrKykKLSAgICAgICAgICAgICAgICBZW0luZGV4XSA9IFlbSW5kZXhdXlhbSW5kZXhdXlN1YktleTJbSW5kZXhdOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgQUVTX0VuY3J5cHQoWSwgc2l6ZW9mKFkpICwgS2V5LCBLZXlMZW5ndGgsIE1BQ1RleHQsIE1BQ1RleHRMZW5ndGgpOwotfSAvKiBFbmQgb2YgQUVTX0NNQUMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NyeXB0X2JpZ2ludGVnZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NyeXB0X2JpZ2ludGVnZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM0NmM1Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jcnlwdF9iaWdpbnRlZ2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTE5ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0JY21tX3Byb2ZpbGUuYwotCi0gICAgQWJzdHJhY3Q6Ci0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotI2luY2x1ZGUgImNyeXB0X2JpZ2ludGVnZXIuaCIKLQotI2lmZGVmIF9fS0VSTkVMX18KLSNkZWZpbmUgREVCVUdQUklOVChmbXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0VSUiBmbXQsICMjIGFyZ3MpCi0jZWxzZQotI2RlZmluZSBERUJVR1BSSU5UKGZtdCwgYXJncy4uLikgcHJpbnRmKGZtdCwgIyMgYXJncykKLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KLSNkZWZpbmUgVUlOVDMyX0hCSVRTKHZhbHVlKQkoKCh2YWx1ZSkgPj4gMHgxMCkgJiAweGZmZmYpCi0jZGVmaW5lIFVJTlQzMl9MQklUUyh2YWx1ZSkJKCh2YWx1ZSkgJiAweGZmZmYpCi0jZGVmaW5lIFVJTlQzMl9HRVRCWVRFKHZhbHVlLCBpbmRleCkJKCgodmFsdWUpID4+ICgoaW5kZXgpKjgpKSAmIDB4ZmYpCi0jZGVmaW5lIFVJTlQ2NF9IQklUUyh2YWx1ZSkJKCgodmFsdWUpID4+IDB4MjApICYgMHhmZmZmZmZmZikKLSNkZWZpbmUgVUlOVDY0X0xCSVRTKHZhbHVlKQkoKHZhbHVlKSAmIDB4ZmZmZmZmZmYpCi0KLXN0YXRpYyBVSU5UOCBXUFNfREhfUF9WQUxVRVsxOTJdID0KLXsKLSAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAotICAgIDB4QzksIDB4MEYsIDB4REEsIDB4QTIsIDB4MjEsIDB4NjgsIDB4QzIsIDB4MzQsCi0gICAgMHhDNCwgMHhDNiwgMHg2MiwgMHg4QiwgMHg4MCwgMHhEQywgMHgxQywgMHhEMSwKLSAgICAweDI5LCAweDAyLCAweDRFLCAweDA4LCAweDhBLCAweDY3LCAweENDLCAweDc0LAotICAgIDB4MDIsIDB4MEIsIDB4QkUsIDB4QTYsIDB4M0IsIDB4MTMsIDB4OUIsIDB4MjIsCi0gICAgMHg1MSwgMHg0QSwgMHgwOCwgMHg3OSwgMHg4RSwgMHgzNCwgMHgwNCwgMHhERCwKLSAgICAweEVGLCAweDk1LCAweDE5LCAweEIzLCAweENELCAweDNBLCAweDQzLCAweDFCLAotICAgIDB4MzAsIDB4MkIsIDB4MEEsIDB4NkQsIDB4RjIsIDB4NUYsIDB4MTQsIDB4MzcsCi0gICAgMHg0RiwgMHhFMSwgMHgzNSwgMHg2RCwgMHg2RCwgMHg1MSwgMHhDMiwgMHg0NSwKLSAgICAweEU0LCAweDg1LCAweEI1LCAweDc2LCAweDYyLCAweDVFLCAweDdFLCAweEM2LAotICAgIDB4RjQsIDB4NEMsIDB4NDIsIDB4RTksIDB4QTYsIDB4MzcsIDB4RUQsIDB4NkIsCi0gICAgMHgwQiwgMHhGRiwgMHg1QywgMHhCNiwgMHhGNCwgMHgwNiwgMHhCNywgMHhFRCwKLSAgICAweEVFLCAweDM4LCAweDZCLCAweEZCLCAweDVBLCAweDg5LCAweDlGLCAweEE1LAotICAgIDB4QUUsIDB4OUYsIDB4MjQsIDB4MTEsIDB4N0MsIDB4NEIsIDB4MUYsIDB4RTYsCi0gICAgMHg0OSwgMHgyOCwgMHg2NiwgMHg1MSwgMHhFQywgMHhFNCwgMHg1QiwgMHgzRCwKLSAgICAweEMyLCAweDAwLCAweDdDLCAweEI4LCAweEExLCAweDYzLCAweEJGLCAweDA1LAotICAgIDB4OTgsIDB4REEsIDB4NDgsIDB4MzYsIDB4MUMsIDB4NTUsIDB4RDMsIDB4OUEsCi0gICAgMHg2OSwgMHgxNiwgMHgzRiwgMHhBOCwgMHhGRCwgMHgyNCwgMHhDRiwgMHg1RiwKLSAgICAweDgzLCAweDY1LCAweDVELCAweDIzLCAweERDLCAweEEzLCAweEFELCAweDk2LAotICAgIDB4MUMsIDB4NjIsIDB4RjMsIDB4NTYsIDB4MjAsIDB4ODUsIDB4NTIsIDB4QkIsCi0gICAgMHg5RSwgMHhENSwgMHgyOSwgMHgwNywgMHg3MCwgMHg5NiwgMHg5NiwgMHg2RCwKLSAgICAweDY3LCAweDBDLCAweDM1LCAweDRFLCAweDRBLCAweEJDLCAweDk4LCAweDA0LAotICAgIDB4RjEsIDB4NzQsIDB4NkMsIDB4MDgsIDB4Q0EsIDB4MjMsIDB4NzMsIDB4MjcsCi0gICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKLX07Ci0KLXN0YXRpYyBVSU5UOCBXUFNfREhfUl9WQUxVRVsxOTNdID0KLXsKLSAgICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLAotfTsKLQotc3RhdGljIFVJTlQ4IFdQU19ESF9YX1ZBTFVFWzE4NF0gPQotewotICAgIDB4MzYsIDB4ZjAsIDB4MjUsIDB4NWQsIDB4ZGUsIDB4OTcsIDB4M2QsIDB4Y2IsCi0gICAgMHgzYiwgMHgzOSwgMHg5ZCwgMHg3NCwgMHg3ZiwgMHgyMywgMHhlMywgMHgyZSwKLSAgICAweGQ2LCAweGZkLCAweGIxLCAweGY3LCAweDc1LCAweDk4LCAweDMzLCAweDhiLAotICAgIDB4ZmQsIDB4ZjQsIDB4NDEsIDB4NTksIDB4YzQsIDB4ZWMsIDB4NjQsIDB4ZGQsCi0gICAgMHhhZSwgMHhiNSwgMHhmNywgMHg4NiwgMHg3MSwgMHhjYiwgMHhmYiwgMHgyMiwKLSAgICAweDEwLCAweDZhLCAweGU2LCAweDRjLCAweDMyLCAweGM1LCAweGJjLCAweGU0LAotICAgIDB4Y2YsIDB4ZDQsIDB4ZjUsIDB4OTIsIDB4MGQsIDB4YTAsIDB4ZWIsIDB4YzgsCi0gICAgMHhiMCwgMHgxZSwgMHhjYSwgMHg5MiwgMHg5MiwgMHhhZSwgMHgzZCwgMHhiYSwKLSAgICAweDFiLCAweDdhLCAweDRhLCAweDg5LCAweDlkLCAweGExLCAweDgxLCAweDM5LAotICAgIDB4MGIsIDB4YjMsIDB4YmQsIDB4MTYsIDB4NTksIDB4YzgsIDB4MTIsIDB4OTQsCi0gICAgMHhmNCwgMHgwMCwgMHhhMywgMHg0OSwgMHgwYiwgMHhmOSwgMHg0OCwgMHgxMiwKLSAgICAweDExLCAweGM3LCAweDk0LCAweDA0LCAweGE1LCAweDc2LCAweDYwLCAweDVhLAotICAgIDB4NTEsIDB4NjAsIDB4ZGIsIDB4ZWUsIDB4ODMsIDB4YjQsIDB4ZTAsIDB4MTksCi0gICAgMHhiNiwgMHhkNywgMHg5OSwgMHhhZSwgMHgxMywgMHgxYiwgMHhhNCwgMHhjMiwKLSAgICAweDNkLCAweGZmLCAweDgzLCAweDQ3LCAweDVlLCAweDljLCAweDQwLCAweGZhLAotICAgIDB4NjcsIDB4MjUsIDB4YjcsIDB4YzksIDB4ZTMsIDB4YWEsIDB4MmMsIDB4NjUsCi0gICAgMHg5NiwgMHhlOSwgMHhjMCwgMHg1NywgMHgwMiwgMHhkYiwgMHgzMCwgMHhhMCwKLSAgICAweDdjLCAweDlhLCAweGEyLCAweGRjLCAweDIzLCAweDVjLCAweDUyLCAweDY5LAotICAgIDB4ZTMsIDB4OWQsIDB4MGMsIDB4YTksIDB4ZGYsIDB4N2EsIDB4YWQsIDB4NDQsCi0gICAgMHg2MSwgMHgyYSwgMHhkNiwgMHhmOCwgMHg4ZiwgMHg2OSwgMHg2OSwgMHg5MiwKLSAgICAweDk4LCAweGYzLCAweGNhLCAweGIxLCAweGI1LCAweDQzLCAweDY3LCAweGZiLAotICAgIDB4MGUsIDB4OGIsIDB4OTMsIDB4ZjcsIDB4MzUsIDB4ZGMsIDB4OGMsIDB4ZDgsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKLX07Ci0KLXN0YXRpYyBVSU5UOCBXUFNfREhfUlJNb2RQX1ZBTFVFWzE5Ml0gPQotewotCTB4ZTMsIDB4YjMsIDB4M2MsIDB4NzIsIDB4NTksIDB4NTQsIDB4MWMsIDB4MDEsCi0JMHhlZSwgMHg5YywgMHg5YSwgMHgyMSwgMHg2YywgMHhjMSwgMHhlYiwgMHhkMiwKLQkweGFlLCAweDU5LCAweDQxLCAweDA0LCAweDc5LCAweDI5LCAweGExLCAweGM3LAotCTB4ZTksIDB4YzMsIDB4ZmEsIDB4MDIsIDB4Y2MsIDB4MjQsIDB4NTYsIDB4ZWYsCi0JMHgxMCwgMHgyNiwgMHgzMCwgMHhmYSwgMHg5YSwgMHgzNiwgMHhhNSwgMHgxZiwKLQkweDU3LCAweGI1LCAweDkzLCAweDQ4LCAweDY3LCAweDk4LCAweDQ0LCAweDYwLAotCTB4MGIsIDB4ZTQsIDB4OTYsIDB4NDcsIDB4YTgsIDB4N2MsIDB4N2IsIDB4MzcsCi0JMHhmOCwgMHgwNSwgMHg2NSwgMHg2NCwgMHg5NiwgMHg5YiwgMHg3ZiwgMHgwMiwKLQkweGRjLCAweDU0LCAweDFhLCAweDRlLCAweGQ0LCAweDA1LCAweDNmLCAweDU0LAotCTB4ZDYsIDB4MmEsIDB4MGUsIDB4ZWEsIDB4YjIsIDB4NzAsIDB4NTIsIDB4MWIsCi0JMHgyMiwgMHhjMiwgMHg5NiwgMHhlOSwgMHhkNCwgMHg2ZiwgMHhlYywgMHgyMywKLQkweDhlLCAweDFhLCAweGJkLCAweDc4LCAweDAyLCAweDIzLCAweGI3LCAweDZiLAotCTB4YjgsIDB4ZmUsIDB4NjEsIDB4MjEsIDB4MTksIDB4NmIsIDB4N2UsIDB4ODgsCi0JMHgxYywgMHg3MiwgMHg5YywgMHg3ZSwgMHgwNCwgMHhiOSwgMHhmNywgMHg5NiwKLQkweDA3LCAweGNkLCAweDBhLCAweDYyLCAweDhlLCAweDQzLCAweDQxLCAweDMwLAotCTB4MDQsIDB4YTUsIDB4NDEsIDB4ZmYsIDB4OTMsIDB4YWUsIDB4MWMsIDB4ZWIsCi0JMHhiMCwgMHgwNCwgMHhhNywgMHg1MCwgMHhkYiwgMHgxMCwgMHgyZCwgMHgzOSwKLQkweGI5LCAweDA1LCAweDJiLCAweGI0LCAweDdhLCAweDU4LCAweGYxLCAweDcwLAotCTB4N2UsIDB4OGMsIDB4ZDIsIDB4YWMsIDB4OTgsIDB4YjUsIDB4ZmIsIDB4NjIsCi0JMHg4ZiwgMHgyMywgMHgzMSwgMHhiMSwgMHgzYiwgMHgwMSwgMHhlMCwgMHgxOCwKLQkweGY0LCAweDY2LCAweGVlLCAweDVmLCAweGJjLCAweGQ0LCAweDlkLCAweDY4LAotCTB4ZDAsIDB4YWIsIDB4OTIsIDB4ZTEsIDB4ODMsIDB4OTcsIDB4ZjIsIDB4NDUsCi0JMHg4ZSwgMHgwZSwgMHgzZSwgMHgyMSwgMHg2NywgMHg0NywgMHg4YywgMHg3MywKLQkweGYxLCAweDE1LCAweGQyLCAweDdkLCAweDMyLCAweGM2LCAweDk1LCAweGUwLAotfTsKLQotc3RhdGljIFVJTlQ4IFZhbHVlXzBbMV0gPSB7MHgwMH07Ci1zdGF0aWMgVUlOVDggVmFsdWVfMVsxXSA9IHsweDAxfTsKLXN0YXRpYyBQQklHX0lOVEVHRVIgcEJJX1UgPSBOVUxMLCBwQklfUyA9IE5VTEwsIHBCSV9PID0gTlVMTDsKLXN0YXRpYyBVSU5UIEJpdHNfT2ZfUiA9IDA7Ci0KLQotVk9JRCBCaWdJbnRlZ2VyX1ByaW50ICgKLSAgICBJTiBQQklHX0lOVEVHRVIgcEJJKQotewotICAgIGludCBpID0gMCwgaiA9IDA7Ci0KLSAgICBpZiAoKHBCSSA9PSBOVUxMKSB8fCAocEJJLT5wSW50ZWdlckFycmF5ID09IE5VTEwpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoc3RybGVuKHBCSS0+TmFtZSkgIT0gMCkKLSAgICAgICAgREVCVUdQUklOVCgiTmFtZT0lc1xuIiwgcEJJLT5OYW1lKTsKLSAgICBERUJVR1BSSU5UKCJBbGxvY1NpemU9JWQsIEFycmF5TGVuZ3RoPSVkLCBJbnRlZ2VyTGVuZ3RoPSVkLCBTaWduZWQ9JWRcbiIsIHBCSS0+QWxsb2NTaXplLCBwQkktPkFycmF5TGVuZ3RoLCBwQkktPkludGVnZXJMZW5ndGgsIHBCSS0+U2lnbmVkKTsKLSAgICBmb3IgKGkgPSAocEJJLT5BcnJheUxlbmd0aCAtIDEpLCBqID0gMDtpID49MDtpLS0saisrKSB7Ci0gICAgICAgIERFQlVHUFJJTlQoIiUwOHgsICIsIHBCSS0+cEludGVnZXJBcnJheVtpXSk7Ci0gICAgICAgIGlmICgoaiU4KSA9PSA3KQotICAgICAgICAgICAgREVCVUdQUklOVCgiXG4iKTsKLSAgICB9IC8qIEVuZCBvZCBmb3IgKi8KLSAgICBERUJVR1BSSU5UKCJcblxuIik7Ci19IC8qIEVuZCBvZiBCaWdJbnRlZ2VyX1ByaW50ICovCi0KLQotVk9JRCBCaWdJbnRlZ2VyX0luaXQgKAotICAgIElOT1VUIFBCSUdfSU5URUdFUiAqcEJJKQotewotICAgIGlmICgqcEJJICE9IE5VTEwpCi0gICAgICAgIEJpZ0ludGVnZXJfRnJlZShwQkkpOwotCi0gICAgaWYgKCgqcEJJID0gKFBCSUdfSU5URUdFUikga21hbGxvYyhzaXplb2YoQklHX0lOVEVHRVIpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgewotICAgICAgICBERUJVR1BSSU5UKCJCaWdJbnRlZ2VyX0luaXQ6IGFsbG9jYXRlICVkIGJ5dGVzIG1lbW9yeSBmYWlsdXJlLlxuIiwgKHNpemVvZihCSUdfSU5URUdFUikpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICBOZGlzWmVyb01lbW9yeSgqcEJJLCBzaXplb2YoQklHX0lOVEVHRVIpKTsKLSAgICAoKnBCSSktPnBJbnRlZ2VyQXJyYXkgPSBOVUxMOwotICAgICgqcEJJKS0+U2lnbmVkID0gMTsKLX0gLyogRW5kIG9mIEJpZ0ludGVnZXJfSW5pdCAqLwotCi0KLVZPSUQgQmlnSW50ZWdlcl9GcmVlX0FsbG9jU2l6ZSAoCi0gICAgSU4gUEJJR19JTlRFR0VSICpwQkkpCi17Ci0gICAgaWYgKCgqcEJJICE9IE5VTEwpICYmICgoKnBCSSktPnBJbnRlZ2VyQXJyYXkgIT0gTlVMTCkpIHsKLSAgICAgICAga2ZyZWUoKCpwQkkpLT5wSW50ZWdlckFycmF5KTsKLSAgICAgICAgTmRpc1plcm9NZW1vcnkoKnBCSSwgc2l6ZW9mKEJJR19JTlRFR0VSKSk7Ci0gICAgICAgICgqcEJJKS0+cEludGVnZXJBcnJheSA9IE5VTEw7Ci0gICAgICAgICgqcEJJKS0+U2lnbmVkID0gMTsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotfSAvKiBFbmQgb2YgQmlnSW50ZWdlcl9GcmVlX0FsbG9jU2l6ZSAqLwotCi0KLVZPSUQgQmlnSW50ZWdlcl9GcmVlICgKLSAgICBJTiBQQklHX0lOVEVHRVIgKnBCSSkKLXsKLSAgICBpZiAoKnBCSSAhPSBOVUxMKSB7Ci0gICAgICAgIEJpZ0ludGVnZXJfRnJlZV9BbGxvY1NpemUocEJJKTsKLSAgICAgICAga2ZyZWUoKnBCSSk7Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgICpwQkkgPSBOVUxMOwotfSAvKiBFbmQgb2YgQmlnSW50ZWdlcl9GcmVlICovCi0KLQotVk9JRCBCaWdJbnRlZ2VyX0FsbG9jU2l6ZSAoCi0gICAgSU4gUEJJR19JTlRFR0VSICpwQkksCi0gICAgSU4gVUlOVCBMZW5ndGgpCi17Ci0gICAgVUlOVCBBcnJheUxlbmd0aCA9IDA7Ci0KLSAgICBpZiAoTGVuZ3RoID09IDApCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmICgqcEJJID09IE5VTEwpCi0gICAgICAgIEJpZ0ludGVnZXJfSW5pdChwQkkpOwotCi0gICAgLyogQ2FjdWxhdGUgYXJyYXkgc2l6ZSAqLwotICAgIEFycmF5TGVuZ3RoID0gTGVuZ3RoID4+IDB4MjsKLSAgICBpZiAoKExlbmd0aCAmIDB4MykgIT0gMCkKLSAgICAgICAgQXJyYXlMZW5ndGgrKzsKLQotICAgIGlmICgoKCpwQkkpLT5wSW50ZWdlckFycmF5ICE9IE5VTEwpICYmICgoKnBCSSktPkFsbG9jU2l6ZSA8IChzaXplb2YoVUlOVDMyKSpBcnJheUxlbmd0aCkpKQotICAgICAgICBCaWdJbnRlZ2VyX0ZyZWVfQWxsb2NTaXplKHBCSSk7Ci0KLSAgICBpZiAoKCpwQkkpLT5wSW50ZWdlckFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgaWYgKCgoKnBCSSktPnBJbnRlZ2VyQXJyYXkgPSAoVUlOVDMyICopIGttYWxsb2Moc2l6ZW9mKFVJTlQzMikqQXJyYXlMZW5ndGgsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBERUJVR1BSSU5UKCJCaWdJbnRlZ2VyX0FsbG9jU2l6ZTogYWxsb2NhdGUgJWQgYnl0ZXMgbWVtb3J5IGZhaWx1cmUuXG4iLCAoc2l6ZW9mKFVJTlQzMikqQXJyYXlMZW5ndGgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICAgICAgKCpwQkkpLT5BbGxvY1NpemUgPSBzaXplb2YoVUlOVDMyKSpBcnJheUxlbmd0aDsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgTmRpc1plcm9NZW1vcnkoKCpwQkkpLT5wSW50ZWdlckFycmF5LCAoKnBCSSktPkFsbG9jU2l6ZSk7Ci0gICAgKCpwQkkpLT5BcnJheUxlbmd0aCA9IEFycmF5TGVuZ3RoOwotICAgICgqcEJJKS0+SW50ZWdlckxlbmd0aCA9IExlbmd0aDsKLX0gLyogRW5kIG9mIEJpZ0ludGVnZXJfQWxsb2NTaXplICovCi0KLQotVk9JRCBCaWdJbnRlZ2VyX0NsZWFySGlnaEJpdHMgKAotICAgIElOIFBCSUdfSU5URUdFUiBwQkkpCi17Ci0gICAgSU5UIEJJQXJyYXlJbmRleCwgU2hpZnRJbmRleCA9IDA7Ci0gICAgVUlOVDggdmFsdWU7Ci0KLSAgICBpZiAoKHBCSSA9PSBOVUxMKSB8fCAocEJJLT5wSW50ZWdlckFycmF5ID09IE5VTEwpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBCSUFycmF5SW5kZXggPSBwQkktPkFycmF5TGVuZ3RoIC0gMTsKLSAgICB3aGlsZSAoKEJJQXJyYXlJbmRleCA+PSAwKSAmJiAocEJJLT5wSW50ZWdlckFycmF5W0JJQXJyYXlJbmRleF0gPT0gMCkpCi0JQklBcnJheUluZGV4LS07Ci0KLSAgICBpZiAoQklBcnJheUluZGV4ID49IDApIHsKLSAgICAgICAgdmFsdWUgPSAwOwotICAgICAgICBTaGlmdEluZGV4ID0gNDsKLSAgICAgICAgd2hpbGUgKHZhbHVlID09IDApIHsKLSAgICAgICAgICAgIFNoaWZ0SW5kZXgtLTsKLSAgICAgICAgICAgIHZhbHVlID0gVUlOVDMyX0dFVEJZVEUocEJJLT5wSW50ZWdlckFycmF5W0JJQXJyYXlJbmRleF0sIFNoaWZ0SW5kZXgpOwotCX0gLyogRW5kIG9mIHdoaWxlICovCi0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIGlmICgoQklBcnJheUluZGV4ID09IC0xKSAmJiAoU2hpZnRJbmRleCA9PSAtMSkpIHsKLSAgICAgICAgcEJJLT5JbnRlZ2VyTGVuZ3RoID0gMTsKLSAgICAgICAgcEJJLT5BcnJheUxlbmd0aCA9IDE7Ci0gICAgICAgIHBCSS0+U2lnbmVkID0gMTsKLSAgICB9IGVsc2UgewotICAgICAgICBwQkktPkludGVnZXJMZW5ndGggPSAoQklBcnJheUluZGV4KjQpICsgU2hpZnRJbmRleCArIDE7Ci0gICAgICAgIHBCSS0+QXJyYXlMZW5ndGggPSBCSUFycmF5SW5kZXggKyAxOwotICAgIH0gLyogRW5kIG9mIGlmICovCi19IC8qIEVuZCBvZiBCaWdJbnRlZ2VyX0NsZWFySGlnaEJpdHMgKi8KLQotCi1WT0lEIEJpZ0ludGVnZXJfQkkyQmluICgKLSAgICBJTiBQQklHX0lOVEVHRVIgcEJJLAotICAgIE9VVCBVSU5UOCAqcFZhbHVlLAotICAgIE9VVCBVSU5UICpMZW5ndGgpCi17Ci0gICAgSU5UICBWYWx1ZUluZGV4LCBCSUFycmF5SW5kZXgsIFNoaWZ0SW5kZXg7Ci0gICAgVUlOVDMyICBOdW1iZXI7Ci0KLSAgICBpZiAocEJJID09IE5VTEwpIHsKLSAgICAgICAgREVCVUdQUklOVCgiQmlnSW50ZWdlcl9CSTJCaW46IHBCSSBpcyBOVWxsXG4iKTsKLSAgICAgICAgKkxlbmd0aCA9IDA7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgaWYgKCpMZW5ndGggPCAoc2l6ZW9mKFVJTlQ4KSAqIHBCSS0+SW50ZWdlckxlbmd0aCkpIHsKLSAgICAgICAgREVCVUdQUklOVCgiQmlnSW50ZWdlcl9CSTJCaW46IGxlbmd0aCglZCkgaXMgbm90IGVub3VnaC5cbiIsICpMZW5ndGgpOwotICAgICAgICAqTGVuZ3RoID0gMDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICBpZiAocEJJLT5wSW50ZWdlckFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgKkxlbmd0aCA9IDA7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgQmlnSW50ZWdlcl9DbGVhckhpZ2hCaXRzKHBCSSk7Ci0gICAgaWYgKChTaGlmdEluZGV4ID0gcEJJLT5JbnRlZ2VyTGVuZ3RoICYgMHgzKSA9PSAwKQotICAgICAgIFNoaWZ0SW5kZXggPSA0OwotICAgIEJJQXJyYXlJbmRleCA9IHBCSS0+QXJyYXlMZW5ndGggLSAxOwotICAgIFZhbHVlSW5kZXggPSAwOwotCi0gICAgTnVtYmVyID0gcEJJLT5wSW50ZWdlckFycmF5W0JJQXJyYXlJbmRleF07Ci0gICAgd2hpbGUgKFZhbHVlSW5kZXggPCBwQkktPkludGVnZXJMZW5ndGgpCi0gICAgewotICAgICAgICBwVmFsdWVbVmFsdWVJbmRleCsrXSA9IChVSU5UOCkgVUlOVDMyX0dFVEJZVEUoTnVtYmVyLCBTaGlmdEluZGV4IC0gMSk7Ci0gICAgICAgIGlmICgoLS1TaGlmdEluZGV4KSA9PSAwKSB7Ci0gICAgICAgICAgICBTaGlmdEluZGV4ID0gNDsKLSAgICAgICAgICAgIEJJQXJyYXlJbmRleC0tOwotICAgICAgICAgICAgTnVtYmVyID0gcEJJLT5wSW50ZWdlckFycmF5W0JJQXJyYXlJbmRleF07Ci0gICAgICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgfSAvKiBFbmQgb2Ygd2hpbGUgKi8KLSAgICAqTGVuZ3RoID0gcEJJLT5JbnRlZ2VyTGVuZ3RoOwotfSAvKiBFbmQgb2YgQmlnSW50ZWdlcl9CSTJCaW4gKi8KLQotCi1WT0lEIEJpZ0ludGVnZXJfQmluMkJJICgKLSAgICBJTiBVSU5UOCAqcFZhbHVlLAotICAgIElOIFVJTlQgTGVuZ3RoLAotICAgIE9VVCBQQklHX0lOVEVHRVIgKnBCSSkKLXsKLSAgICBJTlQgIFZhbHVlSW5kZXgsIEJJQXJyYXlJbmRleCwgU2hpZnRJbmRleDsKLSAgICBVSU5UMzIgIE51bWJlcjsKLQotICAgIEJpZ0ludGVnZXJfQWxsb2NTaXplKHBCSSwgTGVuZ3RoKTsKLQotICAgIGlmICgoKnBCSSktPnBJbnRlZ2VyQXJyYXkgIT0gTlVMTCkgewotICAgICAgICBOdW1iZXIgPSAwOwotICAgICAgICBpZiAoKFNoaWZ0SW5kZXggPSBMZW5ndGggJiAweDMpID09IDApCi0gICAgICAgICAgICBTaGlmdEluZGV4ID0gNDsKLSAgICAgICAgQklBcnJheUluZGV4ID0gKCpwQkkpLT5BcnJheUxlbmd0aCAtIDE7Ci0gICAgICAgIFZhbHVlSW5kZXggPSAwOwotICAgICAgICB3aGlsZSAoVmFsdWVJbmRleCA8IExlbmd0aCkKLSAgICAgICAgewotICAgICAgICAgICAgTnVtYmVyID0gKE51bWJlciA8PCA4KSB8IChVSU5UOCkgcFZhbHVlW1ZhbHVlSW5kZXgrK107Ci0gICAgICAgICAgICBpZiAoKC0tU2hpZnRJbmRleCkgPT0gMCkgewotICAgICAgICAgICAgICAgICgqcEJJKS0+cEludGVnZXJBcnJheVtCSUFycmF5SW5kZXhdID0gTnVtYmVyOwotICAgICAgICAgICAgICAgIFNoaWZ0SW5kZXggPSA0OwotICAgICAgICAgICAgICAgIEJJQXJyYXlJbmRleC0tOwotICAgICAgICAgICAgICAgIE51bWJlciA9IDA7Ci0gICAgICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgICAgICB9IC8qIEVuZCBvZiB3aGlsZSAqLwotICAgIH0gLyogRW5kIG9mIGlmICovCi19IC8qIEVuZCBvZiBCaWdJbnRlZ2VyX0JpbjJCSSAqLwotCi0KLS8qIENhbGN1bGF0ZSB0aGUgYml0cyBvZiBCaWdJbnRlZ2VyLCB0aGUgaGlnaGVzdCBiaXQgaXMgMSAqLwotVk9JRCBCaWdJbnRlZ2VyX0JpdHNPZkJJICgKLSAgICBJTiBQQklHX0lOVEVHRVIgcEJJLAotICAgIE9VVCBVSU5UICpCaXRzX09mX1ApCi17Ci0gICAgVUlOVDMyIE51bWJlciwgSW5kZXg7Ci0KLSAgICBOdW1iZXIgPSBwQkktPnBJbnRlZ2VyQXJyYXlbcEJJLT5BcnJheUxlbmd0aCAtIDFdOwotICAgIEluZGV4ID0gMDsKLSAgICB3aGlsZSAoKCEoTnVtYmVyICYgMHg4MDAwMDAwMCkpICYmIChJbmRleCA8IDMyKSkgewotICAgICAgICBOdW1iZXIgPDw9IDE7Ci0gICAgICAgIEluZGV4Kys7Ci0gICAgfSAvKiBFbmQgb2Ygd2hpbGUgKi8KLSAgICAqQml0c19PZl9QID0gKHBCSS0+QXJyYXlMZW5ndGgqc2l6ZW9mKFVJTlQzMikpIC0gSW5kZXg7Ci19IC8qIEVuZCBvZiBCaWdJbnRlZ2VyX0JpdHNPZkJOICovCi0KLQotSU5UIEJpZ0ludGVnZXJfR2V0Qml0VmFsdWUgKAotICAgIElOIFBCSUdfSU5URUdFUiBwQkksCi0gICAgSU4gVUlOVCBJbmRleCkKLXsKLSAgICBVSU5UIEFycmF5ID0gMDsKLSAgICBVSU5UIFNoaWZ0ID0gMDsKLQotICAgIGlmIChJbmRleCA+IDApIHsKLSAgICAgICAgQXJyYXkgPSAoSW5kZXggLSAxKSA+PiAweDU7Ci0gICAgICAgIFNoaWZ0ID0gKEluZGV4IC0gMSkgJiAweDFGOwotICAgIH0KLSAgICBpZiAoQXJyYXkgPiBwQkktPkFycmF5TGVuZ3RoKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiAoKHBCSS0+cEludGVnZXJBcnJheVtBcnJheV0gPj4gU2hpZnQpICYgMHgxKTsKLX0gLyogRW5kIG9mIEJpZ0ludGVnZXJfR2V0Qml0VmFsdWUgKi8KLQotCi1VSU5UOCBCaWdJbnRlZ2VyX0dldEJ5dGVWYWx1ZSAoCi0gICAgSU4gUEJJR19JTlRFR0VSIHBCSSwKLSAgICBJTiBVSU5UIEluZGV4KQotewotICAgIFVJTlQgQXJyYXkgPSAwOwotICAgIFVJTlQgU2hpZnQgPSAwOwotCi0gICAgaWYgKEluZGV4ID4gMCkgewotICAgICAgICBBcnJheSA9IChJbmRleCAtIDEpID4+IDB4MjsKLSAgICAgICAgU2hpZnQgPSAoSW5kZXggLSAxKSAmIDB4MzsKLSAgICB9Ci0gICAgaWYgKChBcnJheSA+IHBCSS0+QXJyYXlMZW5ndGgpIHx8IChJbmRleCA+IHBCSS0+SW50ZWdlckxlbmd0aCkpCi0gICAgICAgIHJldHVybiAwOwotCi0KLSAgICByZXR1cm4gKFVJTlQ4KSBVSU5UMzJfR0VUQllURShwQkktPnBJbnRlZ2VyQXJyYXlbQXJyYXldLCBTaGlmdCAtIDEpOwotfSAvKiBFbmQgb2YgQmlnSW50ZWdlcl9HZXRCeXRlVmFsdWUgKi8KLQotCi1WT0lEIEJpZ0ludGVnZXJfQ29weSAoCi0gICAgSU4gUEJJR19JTlRFR0VSIHBCSV9Db3BpZWQsCi0gICAgT1VUIFBCSUdfSU5URUdFUiAqcEJJX1Jlc3VsdCkKLXsKLSAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZShwQklfUmVzdWx0LCBwQklfQ29waWVkLT5JbnRlZ2VyTGVuZ3RoKTsKLSAgICBOZGlzQ29weU1lbW9yeSgoKnBCSV9SZXN1bHQpLT5wSW50ZWdlckFycmF5LCBwQklfQ29waWVkLT5wSW50ZWdlckFycmF5LCAoc2l6ZW9mKFVJTlQzMikqKCpwQklfUmVzdWx0KS0+QXJyYXlMZW5ndGgpKTsKLSAgICAoKnBCSV9SZXN1bHQpLT5BcnJheUxlbmd0aCA9IHBCSV9Db3BpZWQtPkFycmF5TGVuZ3RoOwotICAgICgqcEJJX1Jlc3VsdCktPkludGVnZXJMZW5ndGggPSBwQklfQ29waWVkLT5JbnRlZ2VyTGVuZ3RoOwotICAgICgqcEJJX1Jlc3VsdCktPlNpZ25lZCA9IHBCSV9Db3BpZWQtPlNpZ25lZDsKLX0gLyogRW5kIG9mIEJpZ0ludGVnZXJfQ29weSAqLwotCi0KLUlOVCBCaWdJbnRlZ2VyX1Vuc2lnbmVkQ29tcGFyZSAoCi0gICAgSU4gUEJJR19JTlRFR0VSIHBGaXJzdE9wZXJhbmQsCi0gICAgSU4gUEJJR19JTlRFR0VSIHBTZWNvbmRPcGVyYW5kKQotewotICAgIElOVCBCSUFycmF5SW5kZXg7Ci0KLSAgICBpZiAocEZpcnN0T3BlcmFuZC0+SW50ZWdlckxlbmd0aCA+IHBTZWNvbmRPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoKQotICAgICAgICByZXR1cm4gMTsKLQotICAgIGlmIChwRmlyc3RPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoIDwgcFNlY29uZE9wZXJhbmQtPkludGVnZXJMZW5ndGgpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIGlmIChwRmlyc3RPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoID09IHBTZWNvbmRPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoKSB7Ci0gICAgICAgIGZvcihCSUFycmF5SW5kZXggPSAocEZpcnN0T3BlcmFuZC0+QXJyYXlMZW5ndGggLSAxKTtCSUFycmF5SW5kZXggPj0gMCA7IEJJQXJyYXlJbmRleC0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocEZpcnN0T3BlcmFuZC0+cEludGVnZXJBcnJheVtCSUFycmF5SW5kZXhdID4gcFNlY29uZE9wZXJhbmQtPnBJbnRlZ2VyQXJyYXlbQklBcnJheUluZGV4XSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHBGaXJzdE9wZXJhbmQtPnBJbnRlZ2VyQXJyYXlbQklBcnJheUluZGV4XSA8IHBTZWNvbmRPcGVyYW5kLT5wSW50ZWdlckFycmF5W0JJQXJyYXlJbmRleF0pCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgcmV0dXJuIDA7Ci19IC8qIEVuZCBvZiBCaWdJbnRlZ2VyX0NvbXBhcmUgKi8KLQotCi1WT0lEIEJpZ0ludGVnZXJfQWRkICgKLSAgICBJTiBQQklHX0lOVEVHRVIgcEZpcnN0T3BlcmFuZCwKLSAgICBJTiBQQklHX0lOVEVHRVIgcFNlY29uZE9wZXJhbmQsCi0gICAgT1VUIFBCSUdfSU5URUdFUiAqcEJJX1Jlc3VsdCkKLXsKLSAgICBJTlQgQ29tcGFyZVJlc3VsdDsKLSAgICBVSU5UMzIgQklBcnJheUluZGV4OwotICAgIFVJTlQ2NCBTdW0sIENhcnJ5OwotICAgIFBCSUdfSU5URUdFUiBwVGVtcEJJID0gTlVMTDsKLQotICAgIGlmICAoKHBGaXJzdE9wZXJhbmQgPT0gTlVMTCkgfHwgKHBGaXJzdE9wZXJhbmQtPnBJbnRlZ2VyQXJyYXkgPT0gTlVMTCkKLSAgICAgIHx8IChwU2Vjb25kT3BlcmFuZCA9PSBOVUxMKSB8fCAocFNlY29uZE9wZXJhbmQtPnBJbnRlZ2VyQXJyYXkgPT0gTlVMTCkpIHsKLSAgICAgICAgREVCVUdQUklOVCgiQmlnSW50ZWdlcl9BZGQ6IGZpcnN0IG9yIHNlY29uZCBvcGVyYW5kIGlzIE5VTEwuXG4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICBpZiAoKnBCSV9SZXN1bHQgPT0gTlVMTCkKLSAgICAgICAgQmlnSW50ZWdlcl9Jbml0KHBCSV9SZXN1bHQpOwotCi0gICAgQ29tcGFyZVJlc3VsdCA9IEJpZ0ludGVnZXJfVW5zaWduZWRDb21wYXJlKHBGaXJzdE9wZXJhbmQsIHBTZWNvbmRPcGVyYW5kKTsKLSAgICBpZiAoKENvbXBhcmVSZXN1bHQgPT0gMCkgJiAoKHBGaXJzdE9wZXJhbmQtPlNpZ25lZCAqIHBTZWNvbmRPcGVyYW5kLT5TaWduZWQpIDwgMCkpIHsKLSAgICAgICAgQmlnSW50ZWdlcl9BbGxvY1NpemUocEJJX1Jlc3VsdCwgMSk7Ci0gICAgICAgIHJldHVybiA7Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIC8qCi0gICAgICogIFNpbmdlZCB0YWJsZQotICAgICAqICBBICsgQiB8fCBBID4gQiB8fCBBIDwgQgotICAgICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgKyAgICsgfHwgICArICAgfHwgICArCi0gICAgICogICsgICAtIHx8ICAgKyAgIHx8ICAgLQotICAgICAqICAtICAgKyB8fCAgIC0gICB8fCAgICsKLSAgICAgKiAgLSAgIC0gfHwgICAtICAgfHwgICAtCi0gICAgICovCi0gICAgaWYgKChwRmlyc3RPcGVyYW5kLT5TaWduZWQgKiBwU2Vjb25kT3BlcmFuZC0+U2lnbmVkKSA+IDApIHsKLSAgICAgICAgaWYgKHBGaXJzdE9wZXJhbmQtPkludGVnZXJMZW5ndGggPiBwU2Vjb25kT3BlcmFuZC0+SW50ZWdlckxlbmd0aCkgewotICAgICAgICAgICAgICAgIEJpZ0ludGVnZXJfQWxsb2NTaXplKHBCSV9SZXN1bHQsIHBGaXJzdE9wZXJhbmQtPkludGVnZXJMZW5ndGggKyAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZShwQklfUmVzdWx0LCBwU2Vjb25kT3BlcmFuZC0+SW50ZWdlckxlbmd0aCArIDEpOwotICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgICAgIENhcnJ5ID0gMDsKLSAgICAgICAgZm9yIChCSUFycmF5SW5kZXg9MDsgQklBcnJheUluZGV4IDwgKCpwQklfUmVzdWx0KS0+QXJyYXlMZW5ndGg7IEJJQXJyYXlJbmRleCsrKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIFN1bSA9IDA7Ci0gICAgICAgICAgICBpZiAoQklBcnJheUluZGV4IDwgcEZpcnN0T3BlcmFuZC0+QXJyYXlMZW5ndGgpCi0gICAgICAgICAgICAgICAgU3VtICs9IChVSU5UNjQpIHBGaXJzdE9wZXJhbmQtPnBJbnRlZ2VyQXJyYXlbQklBcnJheUluZGV4XTsKLQotICAgICAgICAgICAgaWYgKEJJQXJyYXlJbmRleCA8IHBTZWNvbmRPcGVyYW5kLT5BcnJheUxlbmd0aCkKLSAgICAgICAgICAgICAgICBTdW0gKz0gKFVJTlQ2NCkgcFNlY29uZE9wZXJhbmQtPnBJbnRlZ2VyQXJyYXlbQklBcnJheUluZGV4XTsKLQotICAgICAgICAgICAgU3VtICs9IENhcnJ5OwotICAgICAgICAgICAgQ2FycnkgPSBTdW0gID4+IDMyOwotICAgICAgICAgICAgKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheVtCSUFycmF5SW5kZXhdID0gKFVJTlQzMikgKFN1bSAmIDB4ZmZmZmZmZmZVTCk7Ci0gICAgICAgIH0gLyogRW5kIG9mIGZvciAqLwotICAgICAgICAoKnBCSV9SZXN1bHQpLT5TaWduZWQgPSBwRmlyc3RPcGVyYW5kLT5TaWduZWQ7Ci0gICAgICAgIEJpZ0ludGVnZXJfQ2xlYXJIaWdoQml0cygqcEJJX1Jlc3VsdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgICgocEZpcnN0T3BlcmFuZC0+U2lnbmVkID09IDEpICYgKHBTZWNvbmRPcGVyYW5kLT5TaWduZWQgPT0gLTEpKSB7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyX0NvcHkocFNlY29uZE9wZXJhbmQsICZwVGVtcEJJKTsKLSAgICAgICAgICAgIHBUZW1wQkktPlNpZ25lZCA9IDE7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyX1N1YihwRmlyc3RPcGVyYW5kLCBwVGVtcEJJLCBwQklfUmVzdWx0KTsKLSAgICAgICAgfSBlbHNlIGlmICgocEZpcnN0T3BlcmFuZC0+U2lnbmVkID09IC0xKSAmIChwU2Vjb25kT3BlcmFuZC0+U2lnbmVkID09IDEpKSB7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyX0NvcHkocEZpcnN0T3BlcmFuZCwgJnBUZW1wQkkpOwotICAgICAgICAgICAgcFRlbXBCSS0+U2lnbmVkID0gMTsKLSAgICAgICAgICAgIEJpZ0ludGVnZXJfU3ViKHBTZWNvbmRPcGVyYW5kLCBwVGVtcEJJLCBwQklfUmVzdWx0KTsKLSAgICAgICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgQmlnSW50ZWdlcl9GcmVlKCZwVGVtcEJJKTsKLX0gLyogRW5kIG9mIEJpZ0ludGVnZXJfQWRkICovCi0KLQotVk9JRCBCaWdJbnRlZ2VyX1N1YiAoCi0gICAgSU4gUEJJR19JTlRFR0VSIHBGaXJzdE9wZXJhbmQsCi0gICAgSU4gUEJJR19JTlRFR0VSIHBTZWNvbmRPcGVyYW5kLAotICAgIE9VVCBQQklHX0lOVEVHRVIgKnBCSV9SZXN1bHQpCi17Ci0gICAgSU5UIENvbXBhcmVSZXN1bHQ7Ci0gICAgVUlOVDMyIEJJQXJyYXlJbmRleCwgQ2Fycnk7Ci0gICAgUEJJR19JTlRFR0VSIHBUZW1wQkkgPSBOVUxMLCBwVGVtcEJJMiA9IE5VTEw7Ci0KLSAgICBpZiAgKChwRmlyc3RPcGVyYW5kID09IE5VTEwpIHx8IChwRmlyc3RPcGVyYW5kLT5wSW50ZWdlckFycmF5ID09IE5VTEwpCi0gICAgICB8fCAocFNlY29uZE9wZXJhbmQgPT0gTlVMTCkgfHwgKHBTZWNvbmRPcGVyYW5kLT5wSW50ZWdlckFycmF5ID09IE5VTEwpKSB7Ci0gICAgICAgIERFQlVHUFJJTlQoIkJpZ0ludGVnZXJfU3ViOiBmaXJzdCBvciBzZWNvbmQgb3BlcmFuZCBpcyBOVUxMLlxuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgaWYgKCpwQklfUmVzdWx0ID09IE5VTEwpCi0gICAgICAgIEJpZ0ludGVnZXJfSW5pdChwQklfUmVzdWx0KTsKLQotICAgIENvbXBhcmVSZXN1bHQgPSBCaWdJbnRlZ2VyX1Vuc2lnbmVkQ29tcGFyZShwRmlyc3RPcGVyYW5kLCBwU2Vjb25kT3BlcmFuZCk7Ci0gICAgaWYgKChDb21wYXJlUmVzdWx0ID09IDApICYgKChwRmlyc3RPcGVyYW5kLT5TaWduZWQgKiBwU2Vjb25kT3BlcmFuZC0+U2lnbmVkKSA+IDApKSB7Ci0gICAgICAgIEJpZ0ludGVnZXJfQWxsb2NTaXplKHBCSV9SZXN1bHQsIDEpOwotICAgICAgICByZXR1cm4gOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICBCaWdJbnRlZ2VyX0luaXQoJnBUZW1wQkkpOwotICAgIEJpZ0ludGVnZXJfSW5pdCgmcFRlbXBCSTIpOwotCi0gICAgLyoKLSAgICAgKiAgU2luZ2VkIHRhYmxlCi0gICAgICogIEEgLSBCIHx8IEEgPiBCIHx8IEEgPCBCCi0gICAgICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqICArICAgKyB8fCAgICsgICB8fCAgIC0KLSAgICAgKiAgKyAgIC0gfHwgICArICAgfHwgICArCi0gICAgICogIC0gICArIHx8ICAgLSAgIHx8ICAgLQotICAgICAqICAtICAgLSB8fCAgIC0gICB8fCAgICsKLSAgICAgKi8KLSAgICBpZiAoKHBGaXJzdE9wZXJhbmQtPlNpZ25lZCAqIHBTZWNvbmRPcGVyYW5kLT5TaWduZWQpID4gMCkgewotICAgICAgICBpZiAoQ29tcGFyZVJlc3VsdCA9PSAxKSB7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyX0NvcHkocEZpcnN0T3BlcmFuZCwgJnBUZW1wQkkpOwotICAgICAgICAgICAgQmlnSW50ZWdlcl9Db3B5KHBTZWNvbmRPcGVyYW5kLCAmcFRlbXBCSTIpOwotICAgICAgICB9IGVsc2UgaWYgKENvbXBhcmVSZXN1bHQgPT0gLTEpIHsKLSAgICAgICAgICAgIEJpZ0ludGVnZXJfQ29weShwU2Vjb25kT3BlcmFuZCwgJnBUZW1wQkkpOwotICAgICAgICAgICAgQmlnSW50ZWdlcl9Db3B5KHBGaXJzdE9wZXJhbmQsICZwVGVtcEJJMik7Ci0gICAgICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICAgICAgQmlnSW50ZWdlcl9Db3B5KHBUZW1wQkksIHBCSV9SZXN1bHQpOwotICAgICAgICBDYXJyeSA9IDA7Ci0gICAgICAgIGZvciAoQklBcnJheUluZGV4PTA7IEJJQXJyYXlJbmRleCA8ICgqcEJJX1Jlc3VsdCktPkFycmF5TGVuZ3RoOyBCSUFycmF5SW5kZXgrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKEJJQXJyYXlJbmRleCA8IHBUZW1wQkkyLT5BcnJheUxlbmd0aCkgewotICAgICAgICAgICAgICAgIGlmICgoKnBCSV9SZXN1bHQpLT5wSW50ZWdlckFycmF5W0JJQXJyYXlJbmRleF0gPj0gKHBUZW1wQkkyLT5wSW50ZWdlckFycmF5W0JJQXJyYXlJbmRleF0gLSBDYXJyeSkpIHsKLSAgICAgICAgICAgICAgICAgICAgKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheVtCSUFycmF5SW5kZXhdID0gKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheVtCSUFycmF5SW5kZXhdIC0gcFRlbXBCSTItPnBJbnRlZ2VyQXJyYXlbQklBcnJheUluZGV4XSAtIENhcnJ5OwotICAgICAgICAgICAgICAgICAgICBDYXJyeSA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheVtCSUFycmF5SW5kZXhdID0gMHhmZmZmZmZmZlVMIC0gcFRlbXBCSTItPnBJbnRlZ2VyQXJyYXlbQklBcnJheUluZGV4XSAtIENhcnJ5ICsgKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheVtCSUFycmF5SW5kZXhdICsgMTsKLSAgICAgICAgICAgICAgICAgICAgQ2FycnkgPSAxOwotICAgICAgICAgICAgICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICgoKnBCSV9SZXN1bHQpLT5wSW50ZWdlckFycmF5W0JJQXJyYXlJbmRleF0gPj0gQ2FycnkpIHsKLSAgICAgICAgICAgICAgICAgICAgKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheVtCSUFycmF5SW5kZXhdIC09IENhcnJ5OwotICAgICAgICAgICAgICAgICAgICBDYXJyeSA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheVtCSUFycmF5SW5kZXhdID0gMHhmZmZmZmZmZlVMIC0gQ2Fycnk7Ci0gICAgICAgICAgICAgICAgICAgIENhcnJ5ID0gMTsKLSAgICAgICAgICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgICAgICAgICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICAgICAgfSAvKiBFbmQgb2YgZm9yICovCi0KLSAgICAgICAgaWYgICgoKHBGaXJzdE9wZXJhbmQtPlNpZ25lZCA9PSAxKSAmIChwU2Vjb25kT3BlcmFuZC0+U2lnbmVkID09IDEpICYgKENvbXBhcmVSZXN1bHQgPT0gLTEpKQotICAgICAgICAgIHx8ICgocEZpcnN0T3BlcmFuZC0+U2lnbmVkID09IC0xKSAmIChwU2Vjb25kT3BlcmFuZC0+U2lnbmVkID09IC0xKSAmIChDb21wYXJlUmVzdWx0ID09IDEpKSkKLSAgICAgICAgICAgICgqcEJJX1Jlc3VsdCktPlNpZ25lZCA9IC0xOwotCi0gICAgICAgIEJpZ0ludGVnZXJfQ2xlYXJIaWdoQml0cygqcEJJX1Jlc3VsdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgICgocEZpcnN0T3BlcmFuZC0+U2lnbmVkID09IDEpICYgKHBTZWNvbmRPcGVyYW5kLT5TaWduZWQgPT0gLTEpKSB7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyX0NvcHkocFNlY29uZE9wZXJhbmQsICZwVGVtcEJJKTsKLSAgICAgICAgICAgIHBUZW1wQkktPlNpZ25lZCA9IDE7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyX0FkZChwRmlyc3RPcGVyYW5kLCBwVGVtcEJJLCBwQklfUmVzdWx0KTsKLSAgICAgICAgfSBlbHNlIGlmICgocEZpcnN0T3BlcmFuZC0+U2lnbmVkID09IC0xKSAmIChwU2Vjb25kT3BlcmFuZC0+U2lnbmVkID09IDEpKSB7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyX0NvcHkocEZpcnN0T3BlcmFuZCwgJnBUZW1wQkkpOwotICAgICAgICAgICAgcFRlbXBCSS0+U2lnbmVkID0gMTsKLSAgICAgICAgICAgIEJpZ0ludGVnZXJfQWRkKHBUZW1wQkksIHBTZWNvbmRPcGVyYW5kLCBwQklfUmVzdWx0KTsKLSAgICAgICAgICAgICgqcEJJX1Jlc3VsdCktPlNpZ25lZCA9IC0xOwotICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICBCaWdJbnRlZ2VyX0ZyZWUoJnBUZW1wQkkpOwotICAgIEJpZ0ludGVnZXJfRnJlZSgmcFRlbXBCSTIpOwotfSAvKiBFbmQgb2YgQmlnSW50ZWdlcl9TdWIgKi8KLQotCi1WT0lEIEJpZ0ludGVnZXJfTXVsICgKLSAgICBJTiBQQklHX0lOVEVHRVIgcEZpcnN0T3BlcmFuZCwKLSAgICBJTiBQQklHX0lOVEVHRVIgcFNlY29uZE9wZXJhbmQsCi0gICAgT1VUIFBCSUdfSU5URUdFUiAqcEJJX1Jlc3VsdCkKLXsKLQotICAgIFVJTlQzMiBCSUZpcnN0SW5kZXgsIEJJU2Vjb25kSW5kZXg7Ci0gICAgVUlOVDY0IEZpcnN0VmFsdWUsIFNlY29uZFZhbHVlLCBTdW0sIENhcnJ5OwotCi0gICAgaWYgICgocEZpcnN0T3BlcmFuZCA9PSBOVUxMKSB8fCAocEZpcnN0T3BlcmFuZC0+cEludGVnZXJBcnJheSA9PSBOVUxMKQotICAgICAgfHwgKHBTZWNvbmRPcGVyYW5kID09IE5VTEwpIHx8IChwU2Vjb25kT3BlcmFuZC0+cEludGVnZXJBcnJheSA9PSBOVUxMKSkgewotICAgICAgICBERUJVR1BSSU5UKCJCaWdJbnRlZ2VyX011bDogZmlyc3Qgb3Igc2Vjb25kIG9wZXJhbmQgaXMgTlVMTC5cbiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIC8qIFRoZSBmaXJzdCBvciBzZWNvbmQgb3BlcmFuZCBpcyB6ZXJvICovCi0gICAgaWYgICgoKHBGaXJzdE9wZXJhbmQtPkludGVnZXJMZW5ndGggID09IDEpICYmIChwRmlyc3RPcGVyYW5kLT5wSW50ZWdlckFycmF5WzBdICA9PSAwKSkKLSAgICAgICB8fCgocFNlY29uZE9wZXJhbmQtPkludGVnZXJMZW5ndGggPT0gMSkgJiYgKHBTZWNvbmRPcGVyYW5kLT5wSW50ZWdlckFycmF5WzBdID09IDApKSkgewotICAgICAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZShwQklfUmVzdWx0LCAxKTsKLSAgICAgICAgZ290byBvdXRwdXQ7Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIC8qIFRoZSBmaXJzdCBvciBzZWNvbmQgb3BlcmFuZCBpcyBvbmUgKi8KLSAgICBpZiAgKChwRmlyc3RPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoICA9PSAxKSAmJiAocEZpcnN0T3BlcmFuZC0+cEludGVnZXJBcnJheVswXSAgPT0gMSkpIHsKLSAgICAgICAgQmlnSW50ZWdlcl9Db3B5KHBTZWNvbmRPcGVyYW5kLCBwQklfUmVzdWx0KTsKLSAgICAgICAgZ290byBvdXRwdXQ7Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICBpZiAgKChwU2Vjb25kT3BlcmFuZC0+SW50ZWdlckxlbmd0aCAgPT0gMSkgJiYgKHBTZWNvbmRPcGVyYW5kLT5wSW50ZWdlckFycmF5WzBdICA9PSAxKSkgewotICAgICAgICBCaWdJbnRlZ2VyX0NvcHkocEZpcnN0T3BlcmFuZCwgcEJJX1Jlc3VsdCk7Ci0gICAgICAgIGdvdG8gb3V0cHV0OwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZShwQklfUmVzdWx0LCBwRmlyc3RPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoICsgcFNlY29uZE9wZXJhbmQtPkludGVnZXJMZW5ndGgpOwotCi0gICAgZm9yIChCSUZpcnN0SW5kZXg9MDsgQklGaXJzdEluZGV4IDwgcEZpcnN0T3BlcmFuZC0+QXJyYXlMZW5ndGg7IEJJRmlyc3RJbmRleCsrKQotICAgIHsKLSAgICAgICAgQ2FycnkgPSAwOwotICAgICAgICBGaXJzdFZhbHVlID0gKFVJTlQ2NCkgcEZpcnN0T3BlcmFuZC0+cEludGVnZXJBcnJheVtCSUZpcnN0SW5kZXhdOwotICAgICAgICBpZiAoRmlyc3RWYWx1ZSA9PSAwKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoQklTZWNvbmRJbmRleD0wOyBCSVNlY29uZEluZGV4IDwgcFNlY29uZE9wZXJhbmQtPkFycmF5TGVuZ3RoOyBCSVNlY29uZEluZGV4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2Vjb25kVmFsdWUgPSAoKFVJTlQ2NCkgcFNlY29uZE9wZXJhbmQtPnBJbnRlZ2VyQXJyYXlbQklTZWNvbmRJbmRleF0pKkZpcnN0VmFsdWU7Ci0gICAgICAgICAgICAgICAgU3VtID0gKFVJTlQ2NCkgKCgqcEJJX1Jlc3VsdCktPnBJbnRlZ2VyQXJyYXlbQklGaXJzdEluZGV4ICsgQklTZWNvbmRJbmRleF0gKyBTZWNvbmRWYWx1ZSArIENhcnJ5KTsKLSAgICAgICAgICAgICAgICBDYXJyeSA9IFN1bSA+PiAzMjsKLSAgICAgICAgICAgICAgICAoKnBCSV9SZXN1bHQpLT5wSW50ZWdlckFycmF5W0JJRmlyc3RJbmRleCArIEJJU2Vjb25kSW5kZXhdID0gKFVJTlQzMikgKFN1bSAmIDB4ZmZmZmZmZmZVTCk7Ci0gICAgICAgICAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLSAgICAgICAgICAgIHdoaWxlIChDYXJyeSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgU3VtID0gKFVJTlQ2NCkgKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheVtCSUZpcnN0SW5kZXggKyBCSVNlY29uZEluZGV4XTsKLSAgICAgICAgICAgICAgICBTdW0gKz0gQ2Fycnk7Ci0KLSAgICAgICAgICAgICAgICBDYXJyeSA9IFN1bSA+PiAzMjsKLSAgICAgICAgICAgICAgICAoKnBCSV9SZXN1bHQpLT5wSW50ZWdlckFycmF5W0JJRmlyc3RJbmRleCArIEJJU2Vjb25kSW5kZXhdID0gKFVJTlQzMikgKFN1bSAmIDB4ZmZmZmZmZmZVTCk7Ci0gICAgICAgICAgICAgICAgQklTZWNvbmRJbmRleCsrOwotICAgICAgICAgICAgfSAvKiBFbmQgb2Ygd2hpbGUgKi8KLSAgICAgICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLQotb3V0cHV0OgotICAgICgqcEJJX1Jlc3VsdCktPlNpZ25lZCA9IHBGaXJzdE9wZXJhbmQtPlNpZ25lZCAqIHBTZWNvbmRPcGVyYW5kLT5TaWduZWQ7Ci0gICAgQmlnSW50ZWdlcl9DbGVhckhpZ2hCaXRzKCpwQklfUmVzdWx0KTsKLX0gLyogRW5kIG9mIEJpZ0ludGVnZXJfTXVsICovCi0KLQotVk9JRCBCaWdJbnRlZ2VyX1NxdWFyZSAoCi0gICAgSU4gUEJJR19JTlRFR0VSIHBCSSwKLSAgICBPVVQgUEJJR19JTlRFR0VSICpwQklfUmVzdWx0KQotewotICAgIElOVCBCSUZpcnN0SW5kZXgsIEJJU2Vjb25kSW5kZXg7Ci0JVUlOVDMyIEhCSVRTX1ZhbHVlLCBMQklUU19WYWx1ZSwgVGVtcDFfVmFsdWUsIFRlbXAyX1ZhbHVlLCBDYXJyeTMyOwotCVVJTlQzMiAqUG9pbnRfT2ZfUywgKlBvaW50X09mX1Jlc3VsdCwgKlBvaW50X09mX0JJOwotICAgIFVJTlQ2NCBSZXN1bHQ2NF8xLCBSZXN1bHQ2NF8yLCBDYXJyeTY0LCBUZW1wVmFsdWU2NDsKLQotICAgIGlmICgocEJJID09IE5VTEwpIHx8IChwQkktPnBJbnRlZ2VyQXJyYXkgPT0gTlVMTCkpIHsKLSAgICAgICAgREVCVUdQUklOVCgiXHRCaWdJbnRlZ2VyX1NxdWFyZTogdGhlIG9wZXJhbmQgaXMgTlVMTC5cbiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIC8qIFRoZSBvcGVyYW5kIGlzIHplcm8gKi8KLSAgICBpZiAgKChwQkktPkludGVnZXJMZW5ndGggID09IDEpICYmIChwQkktPnBJbnRlZ2VyQXJyYXlbMF0gID09ICAwKSkgewotICAgICAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZShwQklfUmVzdWx0LCAxKTsKLSAgICAgICAgZ290byBvdXRwdXQ7Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIEJpZ0ludGVnZXJfQWxsb2NTaXplKHBCSV9SZXN1bHQsIChwQkktPkludGVnZXJMZW5ndGgqMikgKyAyMCk7Ci0gICAgQmlnSW50ZWdlcl9BbGxvY1NpemUoJnBCSV9TLCAocEJJLT5JbnRlZ2VyTGVuZ3RoKjIpICsgMjApOwotICAgIEJpZ0ludGVnZXJfQWxsb2NTaXplKCZwQklfTywgKHBCSS0+SW50ZWdlckxlbmd0aCoyKSArIDIwKTsKLQotICAgIC8qCi0gICAgICogSW5wdXQ6IHBCSSA9IHthXzAsIGFfMSwgYV8yLCBhXzMsIC4uLiwgYV9ufQotICAgICAqIFN0ZXAxLiBjYWxjdWxhdGUgYV8wXjIsIGFfMV4yLCBhXzJeMiwgYV8zXjIgLi4uIGFfbl4yCi0gICAgICovCi0JUG9pbnRfT2ZfUyA9IHBCSV9TLT5wSW50ZWdlckFycmF5OwotICAgIGZvciAoQklGaXJzdEluZGV4PTA7IEJJRmlyc3RJbmRleCA8IHBCSS0+QXJyYXlMZW5ndGg7IEJJRmlyc3RJbmRleCsrKQotICAgIHsKLQlIQklUU19WYWx1ZSA9IFVJTlQzMl9IQklUUyhwQkktPnBJbnRlZ2VyQXJyYXlbQklGaXJzdEluZGV4XSk7Ci0JCUxCSVRTX1ZhbHVlID0gVUlOVDMyX0xCSVRTKHBCSS0+cEludGVnZXJBcnJheVtCSUZpcnN0SW5kZXhdKTsKLQkJVGVtcDFfVmFsdWUgPSBIQklUU19WYWx1ZSpMQklUU19WYWx1ZTsKLQkJVGVtcDJfVmFsdWUgPSAoVGVtcDFfVmFsdWUgJiAweDdmZmYpIDw8IDB4MTE7Ci0JCVBvaW50X09mX1NbMF0gPSAoTEJJVFNfVmFsdWUqTEJJVFNfVmFsdWUpICsgVGVtcDJfVmFsdWU7Ci0JCVBvaW50X09mX1NbMV0gPSAoSEJJVFNfVmFsdWUqSEJJVFNfVmFsdWUpICsgKChUZW1wMV9WYWx1ZSA+PiAweGYpICYgMHgxZmZmZik7Ci0JCWlmIChQb2ludF9PZl9TWzBdIDwgVGVtcDJfVmFsdWUpCi0JCQlQb2ludF9PZl9TWzFdICs9IDE7Ci0KLQkJUG9pbnRfT2ZfUyArPSAyOwotICAgIH0gLyogRW5kIG9mIGZvciAqLwotCi0gICAgLyoKLSAgICAgKiBTdGVwMi4gY2FsY3VsYXRlIGFfMCp7YV8xLCBhXzIsIGFfMywgYV80LCAuLi4sIGFfbn0KLSAgICAgKi8KLSAgICBQb2ludF9PZl9CSSA9IHBCSS0+cEludGVnZXJBcnJheTsKLSAgICBQb2ludF9PZl9SZXN1bHQgPSAoKnBCSV9SZXN1bHQpLT5wSW50ZWdlckFycmF5OwotICAgIFBvaW50X09mX1Jlc3VsdFswXSA9IDA7Ci0gICAgVGVtcFZhbHVlNjQgPSAoVUlOVDY0KSBQb2ludF9PZl9CSVswXTsKLSAgICBQb2ludF9PZl9SZXN1bHQrKzsKLSAgICBDYXJyeTY0ID0gMDsKLSAgICBmb3IgKEJJRmlyc3RJbmRleD0xOyBCSUZpcnN0SW5kZXggPCBwQkktPkFycmF5TGVuZ3RoOyBCSUZpcnN0SW5kZXgrKykKLSAgICB7Ci0gICAgICAgIFJlc3VsdDY0XzEgPSAgKFVJTlQ2NCkgUG9pbnRfT2ZfQklbQklGaXJzdEluZGV4XSpUZW1wVmFsdWU2NDsKLSAgICAgICAgUmVzdWx0NjRfMSArPSBDYXJyeTY0OwotICAgICAgICBDYXJyeTY0ID0gKFJlc3VsdDY0XzEgPj4gMzIpOwotICAgICAgICBQb2ludF9PZl9SZXN1bHRbMF0gPSAoVUlOVDMyKSAoUmVzdWx0NjRfMSAmIDB4ZmZmZmZmZmZVTCk7Ci0gICAgICAgIFBvaW50X09mX1Jlc3VsdCsrOwotICAgIH0gLyogRW5kIG9mIGZvciAqLwotICAgIGlmIChDYXJyeTY0ID4gMCkKLSAgICAgICAgUG9pbnRfT2ZfUmVzdWx0WzBdID0gKFVJTlQzMikgKENhcnJ5NjQgJiAweGZmZmZmZmZmVUwpOwotCi0gICAgLyoKLSAgICAgKiBTdGVwMy4gY2FsY3VsYXRlCi0gICAgICogICAgICAgICAgIGFfMSp7YV8yLCBhXzMsIGFfNCwgLi4uLCBhX259Ci0gICAgICogICAgICAgICAgIGFfMip7YV8zLCBhXzQsIGFfNSwgLi4uLCBhX259Ci0gICAgICogICAgICAgICAgIGFfMyp7YV80LCBhXzUsIGFfNiwgLi4uLCBhX259Ci0gICAgICogICAgICAgICAgIGFfNCp7YV81LCBhXzYsIGFfNywgLi4uLCBhX259Ci0gICAgICogICAgICAgICAgIC4uLgotICAgICAqICAgICAgICAgICBhX24tMSp7YV9ufQotICAgICAqLwotICAgIFBvaW50X09mX0JJID0gcEJJLT5wSW50ZWdlckFycmF5OwotICAgIGZvciAoQklGaXJzdEluZGV4PTE7IEJJRmlyc3RJbmRleCA8IChwQkktPkFycmF5TGVuZ3RoIC0gMSk7IEJJRmlyc3RJbmRleCsrKQotICAgIHsKLSAgICAgICAgUG9pbnRfT2ZfUmVzdWx0ID0gKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheTsKLSAgICAgICAgUG9pbnRfT2ZfUmVzdWx0ICs9IChCSUZpcnN0SW5kZXgqMikgKyAxOwotICAgICAgICBUZW1wVmFsdWU2NCA9IChVSU5UNjQpIFBvaW50X09mX0JJW0JJRmlyc3RJbmRleF07Ci0gICAgICAgIENhcnJ5NjQgPSAwOwotICAgICAgICBmb3IgKEJJU2Vjb25kSW5kZXg9KEJJRmlyc3RJbmRleCArIDEpOyBCSVNlY29uZEluZGV4IDwgcEJJLT5BcnJheUxlbmd0aDsgQklTZWNvbmRJbmRleCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXN1bHQ2NF8xID0gKChVSU5UNjQpIFBvaW50X09mX1Jlc3VsdFswXSkgKyBDYXJyeTY0OwotICAgICAgICAgICAgUmVzdWx0NjRfMiA9IChVSU5UNjQpIFBvaW50X09mX0JJW0JJU2Vjb25kSW5kZXhdKlRlbXBWYWx1ZTY0OwotICAgICAgICAgICAgQ2Fycnk2NCA9IChSZXN1bHQ2NF8xID4+IDMyKTsKLSAgICAgICAgICAgIFJlc3VsdDY0XzEgPSAoUmVzdWx0NjRfMSAmIDB4ZmZmZmZmZmZVTCk7Ci0gICAgICAgICAgICBSZXN1bHQ2NF8xID0gUmVzdWx0NjRfMSArIFJlc3VsdDY0XzI7Ci0gICAgICAgICAgICBDYXJyeTY0ICs9IChSZXN1bHQ2NF8xID4+IDMyKTsKLSAgICAgICAgICAgIFBvaW50X09mX1Jlc3VsdFswXSA9IChVSU5UMzIpIChSZXN1bHQ2NF8xICYgMHhmZmZmZmZmZlVMKTsKLSAgICAgICAgICAgIFBvaW50X09mX1Jlc3VsdCsrOwotICAgICAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLSAgICAgICAgaWYgKENhcnJ5NjQgPiAwKQotICAgICAgICAgICAgUG9pbnRfT2ZfUmVzdWx0WzBdICs9IChVSU5UMzIpIChDYXJyeTY0ICYgMHhmZmZmZmZmZlVMKTsKLSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLQotICAgIEJpZ0ludGVnZXJfQ2xlYXJIaWdoQml0cygqcEJJX1Jlc3VsdCk7Ci0gICAgQmlnSW50ZWdlcl9Db3B5KCpwQklfUmVzdWx0LCAmcEJJX08pOwotCi0gICAgQ2FycnkzMiA9IDA7Ci0JZm9yIChCSUZpcnN0SW5kZXg9MDsgQklGaXJzdEluZGV4IDwgcEJJX08tPkFycmF5TGVuZ3RoOyBCSUZpcnN0SW5kZXgrKykgewotICAgICAgICBwQklfTy0+cEludGVnZXJBcnJheVtCSUZpcnN0SW5kZXhdID0gKHBCSV9PLT5wSW50ZWdlckFycmF5W0JJRmlyc3RJbmRleF0gPDwgMSkgfCBDYXJyeTMyOwotICAgICAgICBpZiAocEJJX08tPnBJbnRlZ2VyQXJyYXlbQklGaXJzdEluZGV4XSA8ICgqcEJJX1Jlc3VsdCktPnBJbnRlZ2VyQXJyYXlbQklGaXJzdEluZGV4XSkKLSAgICAgICAgICAgIENhcnJ5MzIgPSAxOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBDYXJyeTMyID0gMDsKLSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLSAgICBwQklfTy0+cEludGVnZXJBcnJheVtCSUZpcnN0SW5kZXhdID0gQ2FycnkzMjsKLSAgICBwQklfTy0+SW50ZWdlckxlbmd0aCsrOwotICAgIHBCSV9PLT5BcnJheUxlbmd0aCsrOwotICAgIEJpZ0ludGVnZXJfQ2xlYXJIaWdoQml0cyhwQklfTyk7Ci0KLSAgICBCaWdJbnRlZ2VyX0FkZChwQklfTywgcEJJX1MsIHBCSV9SZXN1bHQpOwotb3V0cHV0OgotICAgICgqcEJJX1Jlc3VsdCktPlNpZ25lZCA9IDE7Ci0gICAgQmlnSW50ZWdlcl9DbGVhckhpZ2hCaXRzKCpwQklfUmVzdWx0KTsKLX0gLyogRW5kIG9mIEJpZ0ludGVnZXJfU3F1YXJlICovCi0KLQotVk9JRCBCaWdJbnRlZ2VyX0RpdiAoCi0gICAgSU4gUEJJR19JTlRFR0VSIHBGaXJzdE9wZXJhbmQsCi0gICAgSU4gUEJJR19JTlRFR0VSIHBTZWNvbmRPcGVyYW5kLAotICAgIE9VVCBQQklHX0lOVEVHRVIgKnBCSV9SZXN1bHQsCi0gICAgT1VUIFBCSUdfSU5URUdFUiAqcEJJX1JlbWFpbmRlcikKLXsKLSAgICBJTlQgQ29tcGFyZVJlc3VsdDsKLSAgICBJTlQgSW5kZXgsIE11bEluZGV4LCBDb21wdXRlU2l6ZTsKLSAgICBVSU5UMzIgTXVsU3RhcnQ7Ci0gICAgVUlOVCBBbGxvY0xlbmd0aCwgQXJyYXlJbmRleCwgU2hpZnRJbmRleDsKLSAgICBQQklHX0lOVEVHRVIgcFRlbXBCSSA9IE5VTEwsIHBUZW1wQkkyID0gTlVMTCwgcE11bEJJID0gTlVMTDsKLSAgICBVSU5UOCBTZWNvbmRIaWdoQnl0ZTsKLQotICAgIGlmICAoKHBGaXJzdE9wZXJhbmQgPT0gTlVMTCkgfHwgKHBGaXJzdE9wZXJhbmQtPnBJbnRlZ2VyQXJyYXkgPT0gTlVMTCkKLSAgICAgIHx8IChwU2Vjb25kT3BlcmFuZCA9PSBOVUxMKSB8fCAocFNlY29uZE9wZXJhbmQtPnBJbnRlZ2VyQXJyYXkgPT0gTlVMTCkpIHsKLSAgICAgICAgREVCVUdQUklOVCgiQmlnSW50ZWdlcl9EaXY6IGZpcnN0IG9yIHNlY29uZCBvcGVyYW5kIGlzIE5VTEwuXG4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICAvKiBUaGUgc2Vjb25kIG9wZXJhbmQgaXMgemVybyAqLwotICAgIGlmICgocFNlY29uZE9wZXJhbmQtPkludGVnZXJMZW5ndGggPT0gMSkgJiYgKHBTZWNvbmRPcGVyYW5kLT5wSW50ZWdlckFycmF5WzBdID09IDApKSB7Ci0gICAgICAgIERFQlVHUFJJTlQoIkJpZ0ludGVnZXJfRGl2OiBzZWNvbmQgb3BlcmFuZCBpcyB6ZXJvLlxuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgaWYgKCpwQklfUmVzdWx0ID09IE5VTEwpCi0gICAgICAgIEJpZ0ludGVnZXJfSW5pdChwQklfUmVzdWx0KTsKLSAgICBpZiAoKnBCSV9SZW1haW5kZXIgPT0gTlVMTCkKLSAgICAgICAgQmlnSW50ZWdlcl9Jbml0KHBCSV9SZW1haW5kZXIpOwotCi0gICAgLyogVGhlIHNlY29uZCBvcGVyYW5kIGlzIG9uZSAqLwotICAgIGlmICAoKHBTZWNvbmRPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoICA9PSAxKSAmJiAocFNlY29uZE9wZXJhbmQtPnBJbnRlZ2VyQXJyYXlbMF0gID09IDEpKSB7Ci0gICAgICAgIEJpZ0ludGVnZXJfQ29weShwRmlyc3RPcGVyYW5kLCBwQklfUmVzdWx0KTsKLSAgICAgICAgQmlnSW50ZWdlcl9CaW4yQkkoVmFsdWVfMCwgMSwgcEJJX1JlbWFpbmRlcik7Ci0gICAgICAgIGdvdG8gb3V0cHV0OwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICBDb21wYXJlUmVzdWx0ID0gQmlnSW50ZWdlcl9VbnNpZ25lZENvbXBhcmUocEZpcnN0T3BlcmFuZCwgcFNlY29uZE9wZXJhbmQpOwotICAgIGlmIChDb21wYXJlUmVzdWx0ID09IDApIHsKLSAgICAgICAgQmlnSW50ZWdlcl9CaW4yQkkoVmFsdWVfMSwgMSwgcEJJX1Jlc3VsdCk7Ci0gICAgICAgIEJpZ0ludGVnZXJfQmluMkJJKFZhbHVlXzAsIDEsIHBCSV9SZW1haW5kZXIpOwotICAgICAgICBnb3RvIG91dHB1dDsKLSAgICB9IGVsc2UgaWYgKENvbXBhcmVSZXN1bHQgPT0gLTEpIHsKLSAgICAgICAgQmlnSW50ZWdlcl9CaW4yQkkoVmFsdWVfMCwgMSwgcEJJX1Jlc3VsdCk7Ci0gICAgICAgIEJpZ0ludGVnZXJfQ29weShwRmlyc3RPcGVyYW5kLCBwQklfUmVtYWluZGVyKTsKLSAgICAgICAgZ290byBvdXRwdXQ7Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZShwQklfUmVzdWx0LCBwRmlyc3RPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoIC0gcFNlY29uZE9wZXJhbmQtPkludGVnZXJMZW5ndGggKyAxKTsKLSAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZShwQklfUmVtYWluZGVyLCBwU2Vjb25kT3BlcmFuZC0+SW50ZWdlckxlbmd0aCk7Ci0KLSAgICBBbGxvY0xlbmd0aCA9IChVSU5UKSAocEZpcnN0T3BlcmFuZC0+SW50ZWdlckxlbmd0aCA8PCAxKTsKLSAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZSgmcFRlbXBCSSwgQWxsb2NMZW5ndGgpOwotICAgIEJpZ0ludGVnZXJfQWxsb2NTaXplKCZwVGVtcEJJMiwgQWxsb2NMZW5ndGgpOwotICAgIEJpZ0ludGVnZXJfQWxsb2NTaXplKCZwTXVsQkksIEFsbG9jTGVuZ3RoKTsKLQotICAgIEJpZ0ludGVnZXJfQ29weShwRmlyc3RPcGVyYW5kLCBwQklfUmVtYWluZGVyKTsKLSAgICBTZWNvbmRIaWdoQnl0ZSA9IEJpZ0ludGVnZXJfR2V0Qnl0ZVZhbHVlKHBTZWNvbmRPcGVyYW5kLCBwU2Vjb25kT3BlcmFuZC0+SW50ZWdlckxlbmd0aCk7Ci0gICAgQ29tcHV0ZVNpemUgPSAoSU5UKSBwRmlyc3RPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoIC0gcFNlY29uZE9wZXJhbmQtPkludGVnZXJMZW5ndGggKyAxOwotICAgIGZvciAoSW5kZXggPSAoSU5UKSBDb21wdXRlU2l6ZTtJbmRleCA+PSAwO0luZGV4LS0pIHsKLSAgICAgICAgaWYgKEJpZ0ludGVnZXJfVW5zaWduZWRDb21wYXJlKCpwQklfUmVtYWluZGVyLCBwU2Vjb25kT3BlcmFuZCkgPT0gLTEpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAoKChwU2Vjb25kT3BlcmFuZC0+SW50ZWdlckxlbmd0aCArIEluZGV4KSAtICgqcEJJX1JlbWFpbmRlciktPkludGVnZXJMZW5ndGgpIDw9IDEpIHsKLSAgICAgICAgICAgIEJpZ0ludGVnZXJfQWxsb2NTaXplKCZwTXVsQkksIEluZGV4ICsgMSk7Ci0gICAgICAgICAgICBBcnJheUluZGV4ID0gMDsKLSAgICAgICAgICAgIGlmIChJbmRleCA+IDApCi0gICAgICAgICAgICAgICAgQXJyYXlJbmRleCA9IChVSU5UKSAoSW5kZXggLSAxKSA+PiAyIDsKLSAgICAgICAgICAgIFNoaWZ0SW5kZXggPSAoSW5kZXggJiAweDAzKTsKLSAgICAgICAgICAgIGlmIChTaGlmdEluZGV4ID09IDApCi0gICAgICAgICAgICAgICAgU2hpZnRJbmRleCA9IDQ7Ci0gICAgICAgICAgICBTaGlmdEluZGV4LS07Ci0gICAgICAgICAgICBNdWxTdGFydCA9IDA7Ci0gICAgICAgICAgICBNdWxTdGFydCA9IChCaWdJbnRlZ2VyX0dldEJ5dGVWYWx1ZSgoKnBCSV9SZW1haW5kZXIpLCBwRmlyc3RPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoICsgSW5kZXggLSBDb21wdXRlU2l6ZSArIDEpICYgMHhGRikgPDwgODsKLSAgICAgICAgICAgIE11bFN0YXJ0ID0gTXVsU3RhcnQgfCAoQmlnSW50ZWdlcl9HZXRCeXRlVmFsdWUoKCpwQklfUmVtYWluZGVyKSwgcEZpcnN0T3BlcmFuZC0+SW50ZWdlckxlbmd0aCArIEluZGV4IC0gQ29tcHV0ZVNpemUpICYgMHhGRik7Ci0gICAgICAgICAgICBpZiAoTXVsU3RhcnQgPCAoVUlOVDMyKSBTZWNvbmRIaWdoQnl0ZSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgTXVsU3RhcnQgPSBNdWxTdGFydCAvIChVSU5UMzIpIFNlY29uZEhpZ2hCeXRlOwotCi0gICAgICAgICAgICBpZiAoTXVsU3RhcnQgPiAweEZGKQotICAgICAgICAgICAgICAgIE11bFN0YXJ0ID0gMHgxMDA7Ci0KLSAgICAgICAgICAgIGZvciAoTXVsSW5kZXggPSAoSU5UKSBNdWxTdGFydDtNdWxJbmRleCA8PSAweDEwMTtNdWxJbmRleCsrKSB7IC8qIDB4RkZGRiAvIDB4RkYgPSAweDEwMSAqLwotICAgICAgICAgICAgICAgIGlmICgoTXVsSW5kZXggPiAweEZGKSAmJiAoU2hpZnRJbmRleCA9PSAzKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBNdWxCSS0+cEludGVnZXJBcnJheVtBcnJheUluZGV4ICsgMV0gPSAweDAxOwotICAgICAgICAgICAgICAgIHBNdWxCSS0+cEludGVnZXJBcnJheVtBcnJheUluZGV4XSA9ICgoVUlOVCkgTXVsSW5kZXggPDwgKDgqU2hpZnRJbmRleCkpOwotICAgICAgICAgICAgICAgIEJpZ0ludGVnZXJfTXVsKHBTZWNvbmRPcGVyYW5kLCBwTXVsQkkgLCAmcFRlbXBCSSk7Ci0gICAgICAgICAgICAgICAgQ29tcGFyZVJlc3VsdCA9IEJpZ0ludGVnZXJfVW5zaWduZWRDb21wYXJlKCpwQklfUmVtYWluZGVyLCBwVGVtcEJJKTsKLSAgICAgICAgICAgICAgICBpZiAoQ29tcGFyZVJlc3VsdCA8IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE11bEluZGV4ID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbXBhcmVSZXN1bHQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoTXVsSW5kZXggPT0gMHgxMDApICYmIChTaGlmdEluZGV4ID09IDMpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTXVsQkktPnBJbnRlZ2VyQXJyYXlbQXJyYXlJbmRleCArIDFdID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTXVsQkktPnBJbnRlZ2VyQXJyYXlbQXJyYXlJbmRleF0gPSAoKFVJTlQpIChNdWxJbmRleCAtIDEpIDw8ICg4KlNoaWZ0SW5kZXgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXJfTXVsKHBTZWNvbmRPcGVyYW5kLCBwTXVsQkksICZwVGVtcEJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXJfU3ViKCpwQklfUmVtYWluZGVyLCBwVGVtcEJJLCAmcFRlbXBCSTIpOwotICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlcl9Db3B5KHBUZW1wQkkyLCBwQklfUmVtYWluZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXJfQWRkKCpwQklfUmVzdWx0LCBwTXVsQkksICZwVGVtcEJJMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyX0NvcHkocFRlbXBCSTIsIHBCSV9SZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgICAgICAgICAgICAgaWYgKChNdWxJbmRleCA+PSAweDEwMCkgJiYgKFNoaWZ0SW5kZXggPT0gMykpCi0gICAgICAgICAgICAgICAgICAgcE11bEJJLT5wSW50ZWdlckFycmF5W0FycmF5SW5kZXgrK10gPSAwOwotICAgICAgICAgICAgICAgIHBNdWxCSS0+cEludGVnZXJBcnJheVtBcnJheUluZGV4XSA9IDA7Ci0gICAgICAgICAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLSAgICAgICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLQotICAgIEJpZ0ludGVnZXJfRnJlZSgmcFRlbXBCSSk7Ci0gICAgQmlnSW50ZWdlcl9GcmVlKCZwVGVtcEJJMik7Ci0gICAgQmlnSW50ZWdlcl9GcmVlKCZwTXVsQkkpOwotb3V0cHV0OgotICAgICgqcEJJX1Jlc3VsdCktPlNpZ25lZCA9IHBGaXJzdE9wZXJhbmQtPlNpZ25lZCAqIHBTZWNvbmRPcGVyYW5kLT5TaWduZWQ7Ci0gICAgKCpwQklfUmVtYWluZGVyKS0+U2lnbmVkID0gcEZpcnN0T3BlcmFuZC0+U2lnbmVkICogcFNlY29uZE9wZXJhbmQtPlNpZ25lZDsKLSAgICBCaWdJbnRlZ2VyX0NsZWFySGlnaEJpdHMoKnBCSV9SZXN1bHQpOwotICAgIEJpZ0ludGVnZXJfQ2xlYXJIaWdoQml0cygqcEJJX1JlbWFpbmRlcik7Ci19IC8qIEVuZCBvZiBCaWdJbnRlZ2VyX0RpdiAqLwotCi0KLVZPSUQgQmlnSW50ZWdlcl9Nb250Z29tZXJ5X1JlZHVjdGlvbiAoCi0gICAgSU4gUEJJR19JTlRFR0VSIHBCSV9BLAotICAgIElOIFBCSUdfSU5URUdFUiBwQklfUCwKLSAgICAgSU4gUEJJR19JTlRFR0VSIHBCSV9SLAotICAgIE9VVCBQQklHX0lOVEVHRVIgKnBCSV9SZXN1bHQpCi17Ci0gICAgVUlOVDMyICpQb2ludF9QLCAqUG9pbnRfUmVzdWx0OwotICAgIFVJTlQzMiBMb29wQ291bnQ7Ci0gICAgVUlOVDY0IFJlc3VsdDY0XzEsIFJlc3VsdDY0XzIsIENhcnJ5NjQsIFRlbXBWYWx1ZTY0OwotICAgIElOVCBGaXJzdExvb3AsIFNlY29uZExvb3A7Ci0KLSAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZShwQklfUmVzdWx0LCBwQklfQS0+SW50ZWdlckxlbmd0aCsgcEJJX1AtPkludGVnZXJMZW5ndGggKyAyMCk7Ci0gICAgQmlnSW50ZWdlcl9Db3B5KHBCSV9BLCBwQklfUmVzdWx0KTsKLQotICAgIFBvaW50X1AgPSBwQklfUC0+cEludGVnZXJBcnJheTsKLSAgICBQb2ludF9SZXN1bHQgPSAoKnBCSV9SZXN1bHQpLT5wSW50ZWdlckFycmF5OwotCi0gICAgTG9vcENvdW50ID0gQml0c19PZl9SID4+IDB4NTsKLSAgICBmb3IgKEZpcnN0TG9vcCA9IDA7Rmlyc3RMb29wIDwgTG9vcENvdW50O0ZpcnN0TG9vcCsrKSB7Ci0gICAgICAgIENhcnJ5NjQgPSAwOwotICAgICAgICBUZW1wVmFsdWU2NCA9IChVSU5UNjQpIFBvaW50X1Jlc3VsdFswXTsKLSAgICAgICAgZm9yIChTZWNvbmRMb29wID0gMDtTZWNvbmRMb29wIDwgcEJJX1AtPkFycmF5TGVuZ3RoO1NlY29uZExvb3ArKykgewotICAgICAgICAgICAgUmVzdWx0NjRfMSA9ICgoVUlOVDY0KSBQb2ludF9SZXN1bHRbU2Vjb25kTG9vcF0pICsgQ2Fycnk2NDsKLSAgICAgICAgICAgIFJlc3VsdDY0XzIgPSAoVUlOVDY0KSBQb2ludF9QW1NlY29uZExvb3BdKlRlbXBWYWx1ZTY0OwotICAgICAgICAgICAgQ2Fycnk2NCA9IChSZXN1bHQ2NF8xID4+IDMyKTsKLSAgICAgICAgICAgIFJlc3VsdDY0XzEgPSAoUmVzdWx0NjRfMSAmIDB4ZmZmZmZmZmZVTCk7Ci0gICAgICAgICAgICBSZXN1bHQ2NF8xID0gUmVzdWx0NjRfMSArIFJlc3VsdDY0XzI7Ci0gICAgICAgICAgICBDYXJyeTY0ICs9IChSZXN1bHQ2NF8xID4+IDMyKTsKLSAgICAgICAgICAgIFBvaW50X1Jlc3VsdFtTZWNvbmRMb29wXSA9IChVSU5UMzIpIChSZXN1bHQ2NF8xICYgMHhmZmZmZmZmZlVMKTsKLSAgICAgICAgfSAvKiBFbmQgb2YgZm9yICovCi0gICAgICAgIHdoaWxlIChDYXJyeTY0ICE9IDApIHsKLSAgICAgICAgICBSZXN1bHQ2NF8xID0gKChVSU5UNjQpIFBvaW50X1Jlc3VsdFtTZWNvbmRMb29wXSkgKyBDYXJyeTY0OwotICAgICAgICAgIENhcnJ5NjQgPSBSZXN1bHQ2NF8xID4+IDMyOwotICAgICAgICAgIFBvaW50X1Jlc3VsdFtTZWNvbmRMb29wXSA9IChVSU5UMzIpIChSZXN1bHQ2NF8xICYgMHhmZmZmZmZmZlVMKTsKLSAgICAgICAgICBTZWNvbmRMb29wKys7Ci0gICAgICAgIH0gLyogRW5kIG9mIHdoaWxlICovCi0gICAgICAgIFBvaW50X1Jlc3VsdCsrOwotICAgIH0gLyogRW5kIG9mIGZvciAqLwotCi0gICAgZm9yIChGaXJzdExvb3AgPSAwO0ZpcnN0TG9vcCA8PSBMb29wQ291bnQ7Rmlyc3RMb29wKyspIHsKLSAgICAgICAgKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheVtGaXJzdExvb3BdID0gKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheVtGaXJzdExvb3AgKyBMb29wQ291bnRdOwotICAgIH0gLyogRW5kIG9mIGZvciAqLwotICAgIGlmICgoKnBCSV9SZXN1bHQpLT5wSW50ZWdlckFycmF5W0xvb3BDb3VudF0gIT0gMCkKLSAgICAgICAgKCpwQklfUmVzdWx0KS0+QXJyYXlMZW5ndGggPSBMb29wQ291bnQgKyAxOwotICAgIGVsc2UKLSAgICAgICAgKCpwQklfUmVzdWx0KS0+QXJyYXlMZW5ndGggPSBMb29wQ291bnQ7Ci0KLSAgICAoKnBCSV9SZXN1bHQpLT5JbnRlZ2VyTGVuZ3RoID0gKCpwQklfUmVzdWx0KS0+QXJyYXlMZW5ndGgqNDsKLSAgICBCaWdJbnRlZ2VyX0NsZWFySGlnaEJpdHMoKnBCSV9SZXN1bHQpOwotCi0gICAgaWYgKEJpZ0ludGVnZXJfVW5zaWduZWRDb21wYXJlKCpwQklfUmVzdWx0LCBwQklfUCkgPj0gMCkgewotICAgICAgICBCaWdJbnRlZ2VyX1N1YigqcEJJX1Jlc3VsdCwgcEJJX1AsICZwQklfVSk7Ci0gICAgICAgIEJpZ0ludGVnZXJfQ29weShwQklfVSwgcEJJX1Jlc3VsdCk7Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICBCaWdJbnRlZ2VyX0NsZWFySGlnaEJpdHMoKnBCSV9SZXN1bHQpOwotfSAvKiBFbmQgb2YgQmlnSW50ZWdlcl9Nb250Z29tZXJ5X1JlZHVjdGlvbiAqLwotCi0KLVZPSUQgQmlnSW50ZWdlcl9Nb250Z29tZXJ5X0V4cE1vZCAoCi0gICAgSU4gUEJJR19JTlRFR0VSIHBCSV9HLAotICAgIElOIFBCSUdfSU5URUdFUiBwQklfRSwKLSAgICBJTiBQQklHX0lOVEVHRVIgcEJJX1AsCi0gICAgT1VUIFBCSUdfSU5URUdFUiAqcEJJX1Jlc3VsdCkKLXsKLSAgICBVSU5UIEJpdHNfT2ZfUDsKLSAgICBVSU5UMzIgSW5kZXgsIEluZGV4MiwgQWxsb2NMZW5ndGg7Ci0JVUlOVDMyIFNsaWRpbmdfVmFsdWUgLCBTbGlkaW5nX0hpZ2hWYWx1ZSwgU2xpZGluZ19Mb3dWYWx1ZTsKLSAgICBQQklHX0lOVEVHRVIgcEJJX1RlbXAxID0gTlVMTCwgcEJJX1RlbXAyID0gTlVMTDsKLSAgICBQQklHX0lOVEVHRVIgcEJJX1ggPSBOVUxMLCBwQklfUiA9IE5VTEwsIHBCSV9SUiA9IE5VTEwsIHBCSV8xID0gTlVMTDsKLSAgICBCSUdfSU5URUdFUiAqcEJJX0FbU0xJRElOR19XSU5ET1ddOwotICAgIFVJTlQ4ICpwUlZhbHVlID0gTlVMTDsKLQotICAgIEFsbG9jTGVuZ3RoID0gKHBCSV9HLT5JbnRlZ2VyTGVuZ3RoICsgcEJJX0UtPkludGVnZXJMZW5ndGggKyBwQklfUC0+SW50ZWdlckxlbmd0aCArIDMwMCk7Ci0gICAgQmlnSW50ZWdlcl9BbGxvY1NpemUoJnBCSV9UZW1wMSwgQWxsb2NMZW5ndGgpOwotICAgIEJpZ0ludGVnZXJfQWxsb2NTaXplKCZwQklfVGVtcDIsIEFsbG9jTGVuZ3RoKTsKLQotICAgIC8qIENhbGN1bGF0ZSB0aGUgYml0cyBvZiBQIGFuZCBFLCB0aGUgaGlnaGVzdCBiaXQgaXMgMSAqLwotICAgIEJpZ0ludGVnZXJfQml0c09mQkkocEJJX1AsICZCaXRzX09mX1ApOwotCi0gICAgaWYgKChwQklfRS0+SW50ZWdlckxlbmd0aCA9PSAxKSAmJiAocEJJX0UtPnBJbnRlZ2VyQXJyYXlbMF0gPT0gMSkpIHsKLSAgICAgICAgQmlnSW50ZWdlcl9EaXYocEJJX0csIHBCSV9QLCAmcEJJX1RlbXAxLCBwQklfUmVzdWx0KTsKLSAgICAgICAgZ290byBtZW1vcnlfZnJlZTsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgaWYgKChwQklfRS0+SW50ZWdlckxlbmd0aCA9PSAxKSAmJiAocEJJX0UtPnBJbnRlZ2VyQXJyYXlbMF0gPT0gMikpIHsKLSAgICAgICAgQmlnSW50ZWdlcl9NdWwocEJJX0csIHBCSV9HLCAmcEJJX1RlbXAxKTsKLSAgICAgICAgQmlnSW50ZWdlcl9EaXYocEJJX1RlbXAxLCBwQklfUCwgJnBCSV9UZW1wMiwgcEJJX1Jlc3VsdCk7Ci0gICAgICAgIGdvdG8gbWVtb3J5X2ZyZWU7Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIC8qCi0gICAgICogTWFpbiBhbGdvcml0aG0KLSAgICAgKi8KLSAgICBCaWdJbnRlZ2VyX0luaXQoJnBCSV9SKTsKLSAgICBCaWdJbnRlZ2VyX0luaXQoJnBCSV9SUik7Ci0gICAgQmlnSW50ZWdlcl9CaW4yQkkoVmFsdWVfMSwgMSwgJnBCSV8xKTsKLSAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZSgmcEJJX1gsIEFsbG9jTGVuZ3RoKTsKLSAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZSgmcEJJX1UsIEFsbG9jTGVuZ3RoKTsgLy8gZm9yIEJpZ0ludGVnZXJfTW9udGdvbWVyeV9SZWR1Y3Rpb24KLSAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZSgmcEJJX1MsIEFsbG9jTGVuZ3RoKTsgLy8gZm9yIEJpZ0ludGVnZXJfU3F1YXJlCi0gICAgQmlnSW50ZWdlcl9BbGxvY1NpemUoJnBCSV9PLCBBbGxvY0xlbmd0aCk7IC8vIGZvciBCaWdJbnRlZ2VyX1NxdWFyZQotCi0gICAgZm9yIChJbmRleCA9IDA7IEluZGV4IDwgU0xJRElOR19XSU5ET1c7IEluZGV4KyspIHsKLSAgICAgICAgcEJJX0FbSW5kZXhdID0gTlVMTDsKLQkJQmlnSW50ZWdlcl9BbGxvY1NpemUoJnBCSV9BW0luZGV4XSwgMTkzKTsKLSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLSAgICBCaWdJbnRlZ2VyX0JpbjJCSShXUFNfREhfUF9WQUxVRSwgMTkyLCAmcEJJX1RlbXAxKTsKLSAgICBpZiAoTmRpc0NtcE1lbW9yeShwQklfUC0+cEludGVnZXJBcnJheSwgcEJJX1RlbXAxLT5wSW50ZWdlckFycmF5LCBwQklfUC0+SW50ZWdlckxlbmd0aCkgPT0gMCkgewotICAgICAgICBCaWdJbnRlZ2VyX0JpbjJCSShXUFNfREhfWF9WQUxVRSwgMTg0LCAmcEJJX1gpOwotICAgICAgICBCaWdJbnRlZ2VyX0JpbjJCSShXUFNfREhfUl9WQUxVRSwgMTkzLCAmcEJJX1IpOwotICAgICAgICBCaWdJbnRlZ2VyX0JpbjJCSShXUFNfREhfUlJNb2RQX1ZBTFVFLCAxOTIsICZwQklfUlIpOwotICAgICAgICBCaXRzX09mX1IgPSAxNTM3OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICgoQml0c19PZl9QICUgOCkgPT0gMCkgewotICAgICAgICAgICAgQWxsb2NMZW5ndGggPSBwQklfUC0+SW50ZWdlckxlbmd0aCArIDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBbGxvY0xlbmd0aCA9IHBCSV9QLT5JbnRlZ2VyTGVuZ3RoOwotICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgICAgICBwUlZhbHVlID0gKFVJTlQ4ICopIGttYWxsb2Moc2l6ZW9mKFVJTlQ4KSpBbGxvY0xlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JaWYgKHBSVmFsdWUgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzKCk6QWxsb2MgbWVtb3J5IGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCWdvdG8gbWVtb3J5X2ZyZWU7Ci0JfQotICAgICAgICBOZGlzWmVyb01lbW9yeShwUlZhbHVlLCBzaXplb2YoVUlOVDgpKkFsbG9jTGVuZ3RoKTsKLSAgICAgICAgcFJWYWx1ZVswXSA9IChVSU5UOCkgKDEgPDwgKEJpdHNfT2ZfUCAmIDB4NykpOwotICAgICAgICBCaWdJbnRlZ2VyX0JpbjJCSShwUlZhbHVlLCBBbGxvY0xlbmd0aCAsICZwQklfUik7Ci0KLSAgICAgICAgQmlnSW50ZWdlcl9NdWwocEJJX1IsIHBCSV9SLCAmcEJJX1RlbXAxKTsKLSAgICAgICAgQmlnSW50ZWdlcl9EaXYocEJJX1RlbXAxLCBwQklfUCwgJnBCSV9BWzFdLCAmcEJJX1JSKTsKLQotICAgICAgICAvKiBYID0gMSpSIChtb2QgUCkgKi8KLSAgICAgICAgQmlnSW50ZWdlcl9EaXYocEJJX1IsIHBCSV9QLCAmcEJJX1RlbXAyLCAmcEJJX1gpOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICAvKiBBID0gRypSIChtb2QgUCkgPT4gQSA9IE1vbk1vZChHLCBSXjIgbW9kIFApICovCi0gICAgQmlnSW50ZWdlcl9NdWwocEJJX0csIHBCSV9SUiwgJnBCSV9UZW1wMSk7Ci0gICAgQmlnSW50ZWdlcl9Nb250Z29tZXJ5X1JlZHVjdGlvbihwQklfVGVtcDEsIHBCSV9QICwgcEJJX1IsICZwQklfQVsxXSk7Ci0gICAgZm9yIChJbmRleCA9IDI7IEluZGV4IDwgU0xJRElOR19XSU5ET1c7IEluZGV4KyspIHsKLSAgICAgICAgQmlnSW50ZWdlcl9NdWwocEJJX0FbSW5kZXggLSAxXSwgcEJJX0FbMV0sICZwQklfVGVtcDEpOwotCSAgICBCaWdJbnRlZ2VyX01vbnRnb21lcnlfUmVkdWN0aW9uKHBCSV9UZW1wMSwgcEJJX1AsIHBCSV9SLCAmcEJJX0FbSW5kZXhdKTsKLSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLQotICAgIGZvciAoSW5kZXggPSBwQklfRS0+SW50ZWdlckxlbmd0aCA7IEluZGV4ID4gMCA7IEluZGV4LS0pIHsKLSAgICAgICAgZm9yIChJbmRleDIgPSAwOyBJbmRleDIgPCA0IDsgSW5kZXgyKyspIHsKLSAgICAgICAgICAgIEJpZ0ludGVnZXJfU3F1YXJlKHBCSV9YLCAmcEJJX1RlbXAxKTsKLQkJCUJpZ0ludGVnZXJfTW9udGdvbWVyeV9SZWR1Y3Rpb24ocEJJX1RlbXAxLCBwQklfUCwgcEJJX1IsICZwQklfWCk7Ci0JICAgIH0gLyogRW5kIG9mIGZvciAqLwotCi0JCVNsaWRpbmdfVmFsdWUgPSBCaWdJbnRlZ2VyX0dldEJ5dGVWYWx1ZShwQklfRSwgSW5kZXgpOwotCQlTbGlkaW5nX0hpZ2hWYWx1ZSA9IChTbGlkaW5nX1ZhbHVlID4+IDQpOwotCQlpZiAoU2xpZGluZ19IaWdoVmFsdWUgIT0gMCkgewotICAgICAgICAgICAgQmlnSW50ZWdlcl9NdWwocEJJX0FbU2xpZGluZ19IaWdoVmFsdWVdLCBwQklfWCwgJnBCSV9UZW1wMSk7Ci0JCQlCaWdJbnRlZ2VyX01vbnRnb21lcnlfUmVkdWN0aW9uKHBCSV9UZW1wMSwgcEJJX1AsIHBCSV9SLCAmcEJJX1gpOwotCQl9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgICAgIGZvciAoSW5kZXgyID0gMDsgSW5kZXgyIDwgNCA7IEluZGV4MisrKSB7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyX1NxdWFyZShwQklfWCwgJnBCSV9UZW1wMSk7Ci0JCQlCaWdJbnRlZ2VyX01vbnRnb21lcnlfUmVkdWN0aW9uKHBCSV9UZW1wMSwgcEJJX1AsIHBCSV9SLCAmcEJJX1gpOwotCSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLQotCQlTbGlkaW5nX0xvd1ZhbHVlID0gU2xpZGluZ19WYWx1ZSAmIDB4MGY7Ci0JCWlmIChTbGlkaW5nX0xvd1ZhbHVlICE9IDApIHsKLSAgICAgICAgICAgIEJpZ0ludGVnZXJfTXVsKHBCSV9BW1NsaWRpbmdfTG93VmFsdWVdLCBwQklfWCwgJnBCSV9UZW1wMSk7Ci0JCQlCaWdJbnRlZ2VyX01vbnRnb21lcnlfUmVkdWN0aW9uKHBCSV9UZW1wMSwgcEJJX1AsIHBCSV9SLCAmcEJJX1gpOwotCQl9IC8qIEVuZCBvZiBpZiAqLwotICAgIH0gLyogRW5kIG9mIGZvciAqLwotICAgIEJpZ0ludGVnZXJfTW9udGdvbWVyeV9SZWR1Y3Rpb24ocEJJX1gsIHBCSV9QICwgcEJJX1IsIHBCSV9SZXN1bHQpOwotCi0gICAgQmlnSW50ZWdlcl9GcmVlKCZwQklfWCk7Ci0gICAgQmlnSW50ZWdlcl9GcmVlKCZwQklfUik7Ci0gICAgQmlnSW50ZWdlcl9GcmVlKCZwQklfUlIpOwotICAgIEJpZ0ludGVnZXJfRnJlZSgmcEJJXzEpOwotICAgIEJpZ0ludGVnZXJfRnJlZSgmcEJJX1UpOwotICAgIEJpZ0ludGVnZXJfRnJlZSgmcEJJX1MpOwotICAgIEJpZ0ludGVnZXJfRnJlZSgmcEJJX08pOwotICAgIGZvcihJbmRleCA9IDA7IEluZGV4IDwgU0xJRElOR19XSU5ET1c7IEluZGV4KyspCi0JCQlCaWdJbnRlZ2VyX0ZyZWUoJnBCSV9BW0luZGV4XSk7Ci0gICAgaWYgKHBSVmFsdWUgIT0gTlVMTCkKLSAgICAgICAga2ZyZWUocFJWYWx1ZSk7Ci0KLW1lbW9yeV9mcmVlOgotICAgIEJpZ0ludGVnZXJfRnJlZSgmcEJJX1RlbXAxKTsKLSAgICBCaWdJbnRlZ2VyX0ZyZWUoJnBCSV9UZW1wMik7Ci19IC8qIEVuZCBvZiBCaWdJbnRlZ2VyX01vbnRnb21lcnlfRXhwTW9kICovCi0KLS8qIEVuZCBvZiBjcnlwdF9iaWdpbnRlZ2VyLmMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NyeXB0X2RoLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jcnlwdF9kaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjY5ZjJhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NyeXB0X2RoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQljcnlwdF9kaC5jCi0KLQlBYnN0cmFjdDoKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JRWRkeSAgICAgICAgMjAwOS8wMS8xOSAgICAgIENyZWF0ZSBBRVMtMTI4LCBBRVMtMTkyLCBBRVMtMjU2LCBBRVMtQ0JDCi0qLwotCi0jaW5jbHVkZSAiY3J5cHRfZGguaCIKLSNpbmNsdWRlICJjcnlwdF9iaWdpbnRlZ2VyLmgiCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgRGlmZmllLUhlbGxtYW4gcHVibGljIGtleSBnZW5lcmF0aW9uCi0KLUFyZ3VtZW50czoKLSAgICBHVmFsdWUgICAgICAgICAgIEFycmF5IGluIFVJTlQ4Ci0gICAgR1ZhbHVlTGVuZ3RoICAgICBUaGUgbGVuZ3RoIG9mIEcgaW4gYnl0ZXMKLSAgICBQVmFsdWUgICAgICAgICAgIEFycmF5IGluIFVJTlQ4Ci0gICAgUFZhbHVlTGVuZ3RoICAgICBUaGUgbGVuZ3RoIG9mIFAgaW4gYnl0ZXMKLSAgICBQcml2YXRlS2V5ICAgICAgIFByaXZhdGUga2V5Ci0gICAgUHJpdmF0ZUtleUxlbmd0aCBUaGUgbGVuZ3RoIG9mIFByaXZhdGUga2V5IGluIGJ5dGVzCi0KLVJldHVybiBWYWx1ZToKLSAgICBQdWJsaWNLZXkgICAgICAgUHVibGljIGtleQotICAgIFB1YmxpY0tleUxlbmd0aCBUaGUgbGVuZ3RoIG9mIHB1YmxpYyBrZXkgaW4gYnl0ZXMKLQotTm90ZToKLSAgICBSZWZlcmVuY2UgdG8gUkZDMjYzMQotICAgIFB1YmxpY0tleSA9IEdeUHJpdmF0ZUtleSAobW9kIFApCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi12b2lkIERIX1B1YmxpY0tleV9HZW5lcmF0ZSAoCi0gICAgSU4gVUlOVDggR1ZhbHVlW10sCi0gICAgSU4gVUlOVCBHVmFsdWVMZW5ndGgsCi0gICAgSU4gVUlOVDggUFZhbHVlW10sCi0gICAgSU4gVUlOVCBQVmFsdWVMZW5ndGgsCi0gICAgSU4gVUlOVDggUHJpdmF0ZUtleVtdLAotICAgIElOIFVJTlQgUHJpdmF0ZUtleUxlbmd0aCwKLSAgICBPVVQgVUlOVDggUHVibGljS2V5W10sCi0gICAgSU5PVVQgVUlOVCAqUHVibGljS2V5TGVuZ3RoKQotewotICAgIFBCSUdfSU5URUdFUiBwQklfRyA9IE5VTEw7Ci0gICAgUEJJR19JTlRFR0VSIHBCSV9QID0gTlVMTDsKLSAgICBQQklHX0lOVEVHRVIgcEJJX1ByaXZhdGVLZXkgPSBOVUxMOwotICAgIFBCSUdfSU5URUdFUiBwQklfUHVibGljS2V5ID0gTlVMTDsKLQotICAgIC8qCi0gICAgICogMS4gQ2hlY2sgdGhlIGlucHV0IHBhcmFtZXRlcnMKLSAgICAgKiAgICAtIEdWYWx1ZUxlbmd0aCwgUFZhbHVlTGVuZ3RoIGFuZCBQcml2YXRlTGVuZ3RoIG11c3QgYmUgbGFyZ2UgdGhhbiB6ZXJvCi0gICAgICogICAgLSBQdWJsaWNLZXlMZW5ndGggbXVzdCBiZSBsYXJnZSBvciBlcXVhbCB0aGFuIFBWYWx1ZUxlbmd0aAotICAgICAqICAgIC0gUFZhbHVlIG11c3QgYmUgb2RkCi0gICAgICoKLSAgICAgKiAgICAtIFBWYWx1ZSBtdXN0IGJlIHByaW1lIG51bWJlciAobm8gaW1wbGVtZW50KQotICAgICAqICAgIC0gR1ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgYnV0IGxlc3MgdGhhbiB0aGUgUFZhbHVlIChubyBpbXBsZW1lbnQpCi0gICAgICovCi0gICAgaWYgKEdWYWx1ZUxlbmd0aCA9PSAwKSB7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiREhfUHVibGljS2V5X0dlbmVyYXRlOiBHIGxlbmd0aCBpcyAoJWQpXG4iLCBHVmFsdWVMZW5ndGgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgaWYgKFBWYWx1ZUxlbmd0aCA9PSAwKSB7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiREhfUHVibGljS2V5X0dlbmVyYXRlOiBQIGxlbmd0aCBpcyAoJWQpXG4iLCBQVmFsdWVMZW5ndGgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgaWYgKFByaXZhdGVLZXlMZW5ndGggPT0gMCkgewotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkRIX1B1YmxpY0tleV9HZW5lcmF0ZTogcHJpdmF0ZSBrZXkgbGVuZ3RoIGlzICglZClcbiIsIFByaXZhdGVLZXlMZW5ndGgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgaWYgKCpQdWJsaWNLZXlMZW5ndGggPCBQVmFsdWVMZW5ndGgpIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJESF9QdWJsaWNLZXlfR2VuZXJhdGU6IHB1YmxpYyBrZXkgbGVuZ3RoKCVkKSBtdXN0IGJlIGxhcmdlIG9yIGVxdWFsIHRoYW4gUCBsZW5ndGgoJWQpXG4iLAotICAgICAgICAgICAgKlB1YmxpY0tleUxlbmd0aCwgUFZhbHVlTGVuZ3RoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgIGlmICghKFBWYWx1ZVtQVmFsdWVMZW5ndGggLSAxXSAmIDB4MSkpIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJESF9QdWJsaWNLZXlfR2VuZXJhdGU6IFAgdmFsdWUgbXVzdCBiZSBvZGRcbiIpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICAvKgotICAgICAqIDIuIFRyYW5zZmVyIHBhcmFtZXRlcnMgdG8gQmlnSW50ZWdlciBzdHJ1Y3R1cmUKLSAgICAgKi8KLSAgICBCaWdJbnRlZ2VyX0luaXQoJnBCSV9HKTsKLSAgICBCaWdJbnRlZ2VyX0luaXQoJnBCSV9QKTsKLSAgICBCaWdJbnRlZ2VyX0luaXQoJnBCSV9Qcml2YXRlS2V5KTsKLSAgICBCaWdJbnRlZ2VyX0luaXQoJnBCSV9QdWJsaWNLZXkpOwotICAgIEJpZ0ludGVnZXJfQmluMkJJKEdWYWx1ZSwgR1ZhbHVlTGVuZ3RoLCAmcEJJX0cpOwotICAgIEJpZ0ludGVnZXJfQmluMkJJKFBWYWx1ZSwgUFZhbHVlTGVuZ3RoLCAmcEJJX1ApOwotICAgIEJpZ0ludGVnZXJfQmluMkJJKFByaXZhdGVLZXksIFByaXZhdGVLZXlMZW5ndGgsICZwQklfUHJpdmF0ZUtleSk7Ci0KLSAgICAvKgotICAgICAqIDMuIENhbGN1bGF0ZSBQdWJsaWNLZXkgPSBHXlByaXZhdGVLZXkgKG1vZCBQKQotICAgICAqICAgIC0gQmlnSW50ZWdlciBPcGVyYXRpb24KLSAgICAgKiAgICAtIE1vbnRnb21lcnkgcmVkdWN0aW9uCi0gICAgICovCi0gICAgQmlnSW50ZWdlcl9Nb250Z29tZXJ5X0V4cE1vZChwQklfRywgcEJJX1ByaXZhdGVLZXksIHBCSV9QLCAmcEJJX1B1YmxpY0tleSk7Ci0KLSAgICAvKgotICAgICAqIDQuIFRyYW5zZmVyIEJpZ0ludGVnZXIgc3RydWN0dXJlIHRvIGNoYXIgYXJyYXkKLSAgICAgKi8KLSAgICBCaWdJbnRlZ2VyX0JJMkJpbihwQklfUHVibGljS2V5LCBQdWJsaWNLZXksIFB1YmxpY0tleUxlbmd0aCk7Ci0KLSAgICBCaWdJbnRlZ2VyX0ZyZWUoJnBCSV9HKTsKLSAgICBCaWdJbnRlZ2VyX0ZyZWUoJnBCSV9QKTsKLSAgICBCaWdJbnRlZ2VyX0ZyZWUoJnBCSV9Qcml2YXRlS2V5KTsKLSAgICBCaWdJbnRlZ2VyX0ZyZWUoJnBCSV9QdWJsaWNLZXkpOwotfSAvKiBFbmQgb2YgREhfUHVibGljS2V5X0dlbmVyYXRlICovCi0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBEaWZmaWUtSGVsbG1hbiBzZWNyZXQga2V5IGdlbmVyYXRpb24KLQotQXJndW1lbnRzOgotICAgIFB1YmxpY0tleSAgICAgICAgUHVibGljIGtleQotICAgIFB1YmxpY0tleUxlbmd0aCAgVGhlIGxlbmd0aCBvZiBQdWJsaWMga2V5IGluIGJ5dGVzCi0gICAgUFZhbHVlICAgICAgICAgICBBcnJheSBpbiBVSU5UOAotICAgIFBWYWx1ZUxlbmd0aCAgICAgVGhlIGxlbmd0aCBvZiBQIGluIGJ5dGVzCi0gICAgUHJpdmF0ZUtleSAgICAgICBQcml2YXRlIGtleQotICAgIFByaXZhdGVLZXlMZW5ndGggVGhlIGxlbmd0aCBvZiBQcml2YXRlIGtleSBpbiBieXRlcwotCi1SZXR1cm4gVmFsdWU6Ci0gICAgU2VjcmV0S2V5ICAgICAgICBTZWNyZXQga2V5Ci0gICAgU2VjcmV0S2V5TGVuZ3RoICBUaGUgbGVuZ3RoIG9mIHNlY3JldCBrZXkgaW4gYnl0ZXMKLQotTm90ZToKLSAgICBSZWZlcmVuY2UgdG8gUkZDMjYzMQotICAgIFNlY3JldEtleSA9IFB1YmxpY0tleV5Qcml2YXRlS2V5IChtb2QgUCkKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXZvaWQgREhfU2VjcmV0S2V5X0dlbmVyYXRlICgKLSAgICBJTiBVSU5UOCBQdWJsaWNLZXlbXSwKLSAgICBJTiBVSU5UIFB1YmxpY0tleUxlbmd0aCwKLSAgICBJTiBVSU5UOCBQVmFsdWVbXSwKLSAgICBJTiBVSU5UIFBWYWx1ZUxlbmd0aCwKLSAgICBJTiBVSU5UOCBQcml2YXRlS2V5W10sCi0gICAgSU4gVUlOVCBQcml2YXRlS2V5TGVuZ3RoLAotICAgIE9VVCBVSU5UOCBTZWNyZXRLZXlbXSwKLSAgICBJTk9VVCBVSU5UICpTZWNyZXRLZXlMZW5ndGgpCi17Ci0gICAgUEJJR19JTlRFR0VSIHBCSV9QID0gTlVMTDsKLSAgICBQQklHX0lOVEVHRVIgcEJJX1NlY3JldEtleSA9IE5VTEw7Ci0gICAgUEJJR19JTlRFR0VSIHBCSV9Qcml2YXRlS2V5ID0gTlVMTDsKLSAgICBQQklHX0lOVEVHRVIgcEJJX1B1YmxpY0tleSA9IE5VTEw7Ci0KLSAgICAvKgotICAgICAqIDEuIENoZWNrIHRoZSBpbnB1dCBwYXJhbWV0ZXJzCi0gICAgICogICAgLSBQdWJsaWNLZXlMZW5ndGgsIFBWYWx1ZUxlbmd0aCBhbmQgUHJpdmF0ZUxlbmd0aCBtdXN0IGJlIGxhcmdlIHRoYW4gemVybwotICAgICAqICAgIC0gU2VjcmV0S2V5TGVuZ3RoIG11c3QgYmUgbGFyZ2Ugb3IgZXF1YWwgdGhhbiBQVmFsdWVMZW5ndGgKLSAgICAgKiAgICAtIFBWYWx1ZSBtdXN0IGJlIG9kZAotICAgICAqCi0gICAgICogICAgLSBQVmFsdWUgbXVzdCBiZSBwcmltZSBudW1iZXIgKG5vIGltcGxlbWVudCkKLSAgICAgKi8KLSAgICBpZiAoUHVibGljS2V5TGVuZ3RoID09IDApIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJESF9TZWNyZXRLZXlfR2VuZXJhdGU6IHB1YmxpYyBrZXkgbGVuZ3RoIGlzICglZClcbiIsIFB1YmxpY0tleUxlbmd0aCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICBpZiAoUFZhbHVlTGVuZ3RoID09IDApIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJESF9TZWNyZXRLZXlfR2VuZXJhdGU6IFAgbGVuZ3RoIGlzICglZClcbiIsIFBWYWx1ZUxlbmd0aCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICBpZiAoUHJpdmF0ZUtleUxlbmd0aCA9PSAwKSB7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiREhfU2VjcmV0S2V5X0dlbmVyYXRlOiBwcml2YXRlIGtleSBsZW5ndGggaXMgKCVkKVxuIiwgUHJpdmF0ZUtleUxlbmd0aCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICBpZiAoKlNlY3JldEtleUxlbmd0aCA8IFBWYWx1ZUxlbmd0aCkgewotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkRIX1NlY3JldEtleV9HZW5lcmF0ZTogc2VjcmV0IGtleSBsZW5ndGgoJWQpIG11c3QgYmUgbGFyZ2Ugb3IgZXF1YWwgdGhhbiBQIGxlbmd0aCglZClcbiIsCi0gICAgICAgICAgICAqU2VjcmV0S2V5TGVuZ3RoLCBQVmFsdWVMZW5ndGgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgaWYgKCEoUFZhbHVlW1BWYWx1ZUxlbmd0aCAtIDFdICYgMHgxKSkgewotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkRIX1NlY3JldEtleV9HZW5lcmF0ZTogUCB2YWx1ZSBtdXN0IGJlIG9kZFxuIikpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIC8qCi0gICAgICogMi4gVHJhbnNmZXIgcGFyYW1ldGVycyB0byBCaWdJbnRlZ2VyIHN0cnVjdHVyZQotICAgICAqLwotICAgIEJpZ0ludGVnZXJfSW5pdCgmcEJJX1ApOwotICAgIEJpZ0ludGVnZXJfSW5pdCgmcEJJX1ByaXZhdGVLZXkpOwotICAgIEJpZ0ludGVnZXJfSW5pdCgmcEJJX1B1YmxpY0tleSk7Ci0gICAgQmlnSW50ZWdlcl9Jbml0KCZwQklfU2VjcmV0S2V5KTsKLQotICAgIEJpZ0ludGVnZXJfQmluMkJJKFB1YmxpY0tleSwgUHVibGljS2V5TGVuZ3RoLCAmcEJJX1B1YmxpY0tleSk7Ci0gICAgQmlnSW50ZWdlcl9CaW4yQkkoUFZhbHVlLCBQVmFsdWVMZW5ndGgsICZwQklfUCk7Ci0gICAgQmlnSW50ZWdlcl9CaW4yQkkoUHJpdmF0ZUtleSwgUHJpdmF0ZUtleUxlbmd0aCwgJnBCSV9Qcml2YXRlS2V5KTsKLQotICAgIC8qCi0gICAgICogMy4gQ2FsY3VsYXRlIFNlY3JldEtleSA9IFB1YmxpY0tleV5Qcml2YXRlS2V5IChtb2QgUCkKLSAgICAgKiAgICAtIEJpZ0ludGVnZXIgT3BlcmF0aW9uCi0gICAgICogICAgLSBNb250Z29tZXJ5IHJlZHVjdGlvbgotICAgICAqLwotICAgIEJpZ0ludGVnZXJfTW9udGdvbWVyeV9FeHBNb2QocEJJX1B1YmxpY0tleSwgcEJJX1ByaXZhdGVLZXksIHBCSV9QLCAmcEJJX1NlY3JldEtleSk7Ci0KLSAgICAvKgotICAgICAqIDQuIFRyYW5zZmVyIEJpZ0ludGVnZXIgc3RydWN0dXJlIHRvIGNoYXIgYXJyYXkKLSAgICAgKi8KLSAgICBCaWdJbnRlZ2VyX0JJMkJpbihwQklfU2VjcmV0S2V5LCBTZWNyZXRLZXksIFNlY3JldEtleUxlbmd0aCk7Ci0KLSAgICBCaWdJbnRlZ2VyX0ZyZWUoJnBCSV9QKTsKLSAgICBCaWdJbnRlZ2VyX0ZyZWUoJnBCSV9Qcml2YXRlS2V5KTsKLSAgICBCaWdJbnRlZ2VyX0ZyZWUoJnBCSV9QdWJsaWNLZXkpOwotICAgIEJpZ0ludGVnZXJfRnJlZSgmcEJJX1NlY3JldEtleSk7Ci19IC8qIEVuZCBvZiBESF9TZWNyZXRLZXlfR2VuZXJhdGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NyeXB0X2htYWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NyeXB0X2htYWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI4NTQwOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jcnlwdF9obWFjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiLi4vY3J5cHRfaG1hYy5oIgotCi0KLSNpZmRlZiBITUFDX1NIQTFfU1VQUE9SVAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBITUFDIHVzaW5nIFNIQTEgaGFzaCBmdW5jdGlvbgotCi1Bcmd1bWVudHM6Ci0gICAga2V5ICAgICAgICAgICAgIFNlY3JldCBrZXkKLSAgICBrZXlfbGVuICAgICAgICAgVGhlIGxlbmd0aCBvZiB0aGUga2V5IGluIGJ5dGVzCi0gICAgbWVzc2FnZSAgICAgICAgIE1lc3NhZ2UgY29udGV4dAotICAgIG1lc3NhZ2VfbGVuICAgICBUaGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gYnl0ZXMKLSAgICBtYWNMZW4gICAgICAgICAgUmVxdWVzdCB0aGUgbGVuZ3RoIG9mIG1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZQotCi1SZXR1cm4gVmFsdWU6Ci0gICAgbWFjICAgICAgICAgICAgIE1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZQotCi1Ob3RlOgotICAgIE5vbmUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgSE1BQ19TSEExICgKLSAgICBJTiAgY29uc3QgVUlOVDggS2V5W10sCi0gICAgSU4gIFVJTlQgS2V5TGVuLAotICAgIElOICBjb25zdCBVSU5UOCBNZXNzYWdlW10sCi0gICAgSU4gIFVJTlQgTWVzc2FnZUxlbiwKLSAgICBPVVQgVUlOVDggTUFDW10sCi0gICAgSU4gIFVJTlQgTUFDTGVuKQotewotICAgIFNIQTFfQ1RYX1NUUlVDIHNoYV9jdHgxOwotICAgIFNIQTFfQ1RYX1NUUlVDIHNoYV9jdHgyOwotICAgIFVJTlQ4IEswW1NIQTFfQkxPQ0tfU0laRV07Ci0gICAgVUlOVDggRGlnZXN0W1NIQTFfRElHRVNUX1NJWkVdOwotICAgIFVJTlQgaW5kZXg7Ci0KLSAgICBOZGlzWmVyb01lbW9yeSgmc2hhX2N0eDEsIHNpemVvZihTSEExX0NUWF9TVFJVQykpOwotICAgIE5kaXNaZXJvTWVtb3J5KCZzaGFfY3R4Miwgc2l6ZW9mKFNIQTFfQ1RYX1NUUlVDKSk7Ci0gICAgLyoKLSAgICAgKiBJZiB0aGUgbGVuZ3RoIG9mIEsgPSBCKEJsb2NrIHNpemUpOiBLMCA9IEsuCi0gICAgICogSWYgdGhlIGxlbmd0aCBvZiBLID4gQjogaGFzaCBLIHRvIG9idGFpbiBhbiBMIGJ5dGUgc3RyaW5nLAotICAgICAqIHRoZW4gYXBwZW5kIChCLUwpIHplcm9zIHRvIGNyZWF0ZSBhIEItYnl0ZSBzdHJpbmcgSzAgKGkuZS4sIEswID0gSChLKSB8fCAwMC4uLjAwKS4KLSAgICAgKiBJZiB0aGUgbGVuZ3RoIG9mIEsgPCBCOiBhcHBlbmQgemVyb3MgdG8gdGhlIGVuZCBvZiBLIHRvIGNyZWF0ZSBhIEItYnl0ZSBzdHJpbmcgSzAKLSAgICAgKi8KLSAgICBOZGlzWmVyb01lbW9yeShLMCwgU0hBMV9CTE9DS19TSVpFKTsKLSAgICBpZiAoS2V5TGVuIDw9IFNIQTFfQkxPQ0tfU0laRSkKLSAgICAgICAgTmRpc01vdmVNZW1vcnkoSzAsIEtleSwgS2V5TGVuKTsKLSAgICBlbHNlCi0gICAgICAgIFJUX1NIQTEoS2V5LCBLZXlMZW4sIEswKTsKLSAgICAvKiBFbmQgb2YgaWYgKi8KLQotICAgIC8qIEV4Y2x1c2l2ZS1PciBLMCB3aXRoIGlwYWQgKi8KLSAgICAvKiBpcGFkOiBJbm5lciBwYWQ7IHRoZSBieXRlIHjvv73vv70zNu+/ve+/vSByZXBlYXRlZCBCIHRpbWVzLiAqLwotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNIQTFfQkxPQ0tfU0laRTsgaW5kZXgrKykKLSAgICAgICAgSzBbaW5kZXhdIF49IDB4MzY7Ci0gICAgICAgIC8qIEVuZCBvZiBmb3IgKi8KLQotICAgIFNIQTFfSW5pdCgmc2hhX2N0eDEpOwotICAgIC8qIEgoSzBeaXBhZCkgKi8KLSAgICBTSEExX0FwcGVuZCgmc2hhX2N0eDEsIEswLCBzaXplb2YoSzApKTsKLSAgICAvKiBIKChLMF5pcGFkKXx8dGV4dCkgKi8KLSAgICBTSEExX0FwcGVuZCgmc2hhX2N0eDEsIE1lc3NhZ2UsIE1lc3NhZ2VMZW4pOwotICAgIFNIQTFfRW5kKCZzaGFfY3R4MSwgRGlnZXN0KTsKLQotICAgIC8qIEV4Y2x1c2l2ZS1PciBLMCB3aXRoIG9wYWQgYW5kIHJlbW92ZSBpcGFkICovCi0gICAgLyogb3BhZDogT3V0ZXIgcGFkOyB0aGUgYnl0ZSB477+977+9NWPvv73vv70gcmVwZWF0ZWQgQiB0aW1lcy4gKi8KLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTSEExX0JMT0NLX1NJWkU7IGluZGV4KyspCi0gICAgICAgIEswW2luZGV4XSBePSAweDM2XjB4NWM7Ci0gICAgICAgIC8qIEVuZCBvZiBmb3IgKi8KLQotICAgIFNIQTFfSW5pdCgmc2hhX2N0eDIpOwotICAgIC8qIEgoSzBeb3BhZCkgKi8KLSAgICBTSEExX0FwcGVuZCgmc2hhX2N0eDIsIEswLCBzaXplb2YoSzApKTsKLSAgICAvKiBIKCAoSzBeb3BhZCkgfHwgSCgoSzBeaXBhZCl8fHRleHQpICkgKi8KLSAgICBTSEExX0FwcGVuZCgmc2hhX2N0eDIsIERpZ2VzdCwgU0hBMV9ESUdFU1RfU0laRSk7Ci0gICAgU0hBMV9FbmQoJnNoYV9jdHgyLCBEaWdlc3QpOwotCi0gICAgaWYgKE1BQ0xlbiA+IFNIQTFfRElHRVNUX1NJWkUpCi0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KE1BQywgRGlnZXN0LCBTSEExX0RJR0VTVF9TSVpFKTsKLSAgICBlbHNlCi0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KE1BQywgRGlnZXN0LCBNQUNMZW4pOwotfSAvKiBFbmQgb2YgSE1BQ19TSEExICovCi0jZW5kaWYgLyogSE1BQ19TSEExX1NVUFBPUlQgKi8KLQotCi0jaWZkZWYgSE1BQ19TSEEyNTZfU1VQUE9SVAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBITUFDIHVzaW5nIFNIQTI1NiBoYXNoIGZ1bmN0aW9uCi0KLUFyZ3VtZW50czoKLSAgICBrZXkgICAgICAgICAgICAgU2VjcmV0IGtleQotICAgIGtleV9sZW4gICAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBrZXkgaW4gYnl0ZXMKLSAgICBtZXNzYWdlICAgICAgICAgTWVzc2FnZSBjb250ZXh0Ci0gICAgbWVzc2FnZV9sZW4gICAgIFRoZSBsZW5ndGggb2YgbWVzc2FnZSBpbiBieXRlcwotICAgIG1hY0xlbiAgICAgICAgICBSZXF1ZXN0IHRoZSBsZW5ndGggb2YgbWVzc2FnZSBhdXRoZW50aWNhdGlvbiBjb2RlCi0KLVJldHVybiBWYWx1ZToKLSAgICBtYWMgICAgICAgICAgICAgTWVzc2FnZSBhdXRoZW50aWNhdGlvbiBjb2RlCi0KLU5vdGU6Ci0gICAgTm9uZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBITUFDX1NIQTI1NiAoCi0gICAgSU4gIGNvbnN0IFVJTlQ4IEtleVtdLAotICAgIElOICBVSU5UIEtleUxlbiwKLSAgICBJTiAgY29uc3QgVUlOVDggTWVzc2FnZVtdLAotICAgIElOICBVSU5UIE1lc3NhZ2VMZW4sCi0gICAgT1VUIFVJTlQ4IE1BQ1tdLAotICAgIElOICBVSU5UIE1BQ0xlbikKLXsKLSAgICBTSEEyNTZfQ1RYX1NUUlVDIHNoYV9jdHgxOwotICAgIFNIQTI1Nl9DVFhfU1RSVUMgc2hhX2N0eDI7Ci0gICAgVUlOVDggSzBbU0hBMjU2X0JMT0NLX1NJWkVdOwotICAgIFVJTlQ4IERpZ2VzdFtTSEEyNTZfRElHRVNUX1NJWkVdOwotICAgIFVJTlQgaW5kZXg7Ci0KLSAgICBOZGlzWmVyb01lbW9yeSgmc2hhX2N0eDEsIHNpemVvZihTSEEyNTZfQ1RYX1NUUlVDKSk7Ci0gICAgTmRpc1plcm9NZW1vcnkoJnNoYV9jdHgyLCBzaXplb2YoU0hBMjU2X0NUWF9TVFJVQykpOwotICAgIC8qCi0gICAgICogSWYgdGhlIGxlbmd0aCBvZiBLID0gQihCbG9jayBzaXplKTogSzAgPSBLLgotICAgICAqIElmIHRoZSBsZW5ndGggb2YgSyA+IEI6IGhhc2ggSyB0byBvYnRhaW4gYW4gTCBieXRlIHN0cmluZywKLSAgICAgKiB0aGVuIGFwcGVuZCAoQi1MKSB6ZXJvcyB0byBjcmVhdGUgYSBCLWJ5dGUgc3RyaW5nIEswIChpLmUuLCBLMCA9IEgoSykgfHwgMDAuLi4wMCkuCi0gICAgICogSWYgdGhlIGxlbmd0aCBvZiBLIDwgQjogYXBwZW5kIHplcm9zIHRvIHRoZSBlbmQgb2YgSyB0byBjcmVhdGUgYSBCLWJ5dGUgc3RyaW5nIEswCi0gICAgICovCi0gICAgTmRpc1plcm9NZW1vcnkoSzAsIFNIQTI1Nl9CTE9DS19TSVpFKTsKLSAgICBpZiAoS2V5TGVuIDw9IFNIQTI1Nl9CTE9DS19TSVpFKSB7Ci0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KEswLCBLZXksIEtleUxlbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgUlRfU0hBMjU2KEtleSwgS2V5TGVuLCBLMCk7Ci0gICAgfQotCi0gICAgLyogRXhjbHVzaXZlLU9yIEswIHdpdGggaXBhZCAqLwotICAgIC8qIGlwYWQ6IElubmVyIHBhZDsgdGhlIGJ5dGUgeO+/ve+/vTM277+977+9IHJlcGVhdGVkIEIgdGltZXMuICovCi0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU0hBMjU2X0JMT0NLX1NJWkU7IGluZGV4KyspCi0gICAgICAgIEswW2luZGV4XSBePSAweDM2OwotICAgICAgICAvKiBFbmQgb2YgZm9yICovCi0KLSAgICBTSEEyNTZfSW5pdCgmc2hhX2N0eDEpOwotICAgIC8qIEgoSzBeaXBhZCkgKi8KLSAgICBTSEEyNTZfQXBwZW5kKCZzaGFfY3R4MSwgSzAsIHNpemVvZihLMCkpOwotICAgIC8qIEgoKEswXmlwYWQpfHx0ZXh0KSAqLwotICAgIFNIQTI1Nl9BcHBlbmQoJnNoYV9jdHgxLCBNZXNzYWdlLCBNZXNzYWdlTGVuKTsKLSAgICBTSEEyNTZfRW5kKCZzaGFfY3R4MSwgRGlnZXN0KTsKLQotICAgIC8qIEV4Y2x1c2l2ZS1PciBLMCB3aXRoIG9wYWQgYW5kIHJlbW92ZSBpcGFkICovCi0gICAgLyogb3BhZDogT3V0ZXIgcGFkOyB0aGUgYnl0ZSB477+977+9NWPvv73vv70gcmVwZWF0ZWQgQiB0aW1lcy4gKi8KLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTSEEyNTZfQkxPQ0tfU0laRTsgaW5kZXgrKykKLSAgICAgICAgSzBbaW5kZXhdIF49IDB4MzZeMHg1YzsKLSAgICAgICAgLyogRW5kIG9mIGZvciAqLwotCi0gICAgU0hBMjU2X0luaXQoJnNoYV9jdHgyKTsKLSAgICAvKiBIKEswXm9wYWQpICovCi0gICAgU0hBMjU2X0FwcGVuZCgmc2hhX2N0eDIsIEswLCBzaXplb2YoSzApKTsKLSAgICAvKiBIKCAoSzBeb3BhZCkgfHwgSCgoSzBeaXBhZCl8fHRleHQpICkgKi8KLSAgICBTSEEyNTZfQXBwZW5kKCZzaGFfY3R4MiwgRGlnZXN0LCBTSEEyNTZfRElHRVNUX1NJWkUpOwotICAgIFNIQTI1Nl9FbmQoJnNoYV9jdHgyLCBEaWdlc3QpOwotCi0gICAgaWYgKE1BQ0xlbiA+IFNIQTI1Nl9ESUdFU1RfU0laRSkKLSAgICAgICAgTmRpc01vdmVNZW1vcnkoTUFDLCBEaWdlc3QsU0hBMjU2X0RJR0VTVF9TSVpFKTsKLSAgICBlbHNlCi0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KE1BQywgRGlnZXN0LCBNQUNMZW4pOwotCi19IC8qIEVuZCBvZiBITUFDX1NIQTI1NiAqLwotI2VuZGlmIC8qIEhNQUNfU0hBMjU2X1NVUFBPUlQgKi8KLQotCi0jaWZkZWYgSE1BQ19NRDVfU1VQUE9SVAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBITUFDIHVzaW5nIE1ENSBoYXNoIGZ1bmN0aW9uCi0KLUFyZ3VtZW50czoKLSAgICBrZXkgICAgICAgICAgICAgU2VjcmV0IGtleQotICAgIGtleV9sZW4gICAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBrZXkgaW4gYnl0ZXMKLSAgICBtZXNzYWdlICAgICAgICAgTWVzc2FnZSBjb250ZXh0Ci0gICAgbWVzc2FnZV9sZW4gICAgIFRoZSBsZW5ndGggb2YgbWVzc2FnZSBpbiBieXRlcwotICAgIG1hY0xlbiAgICAgICAgICBSZXF1ZXN0IHRoZSBsZW5ndGggb2YgbWVzc2FnZSBhdXRoZW50aWNhdGlvbiBjb2RlCi0KLVJldHVybiBWYWx1ZToKLSAgICBtYWMgICAgICAgICAgICAgTWVzc2FnZSBhdXRoZW50aWNhdGlvbiBjb2RlCi0KLU5vdGU6Ci0gICAgTm9uZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBITUFDX01ENSgKLSAgICBJTiAgY29uc3QgVUlOVDggS2V5W10sCi0gICAgSU4gIFVJTlQgS2V5TGVuLAotICAgIElOICBjb25zdCBVSU5UOCBNZXNzYWdlW10sCi0gICAgSU4gIFVJTlQgTWVzc2FnZUxlbiwKLSAgICBPVVQgVUlOVDggTUFDW10sCi0gICAgSU4gIFVJTlQgTUFDTGVuKQotewotICAgIE1ENV9DVFhfU1RSVUMgbWQ1X2N0eDE7Ci0gICAgTUQ1X0NUWF9TVFJVQyBtZDVfY3R4MjsKLSAgICBVSU5UOCBLMFtNRDVfQkxPQ0tfU0laRV07Ci0gICAgVUlOVDggRGlnZXN0W01ENV9ESUdFU1RfU0laRV07Ci0gICAgVUlOVCBpbmRleDsKLQotICAgIE5kaXNaZXJvTWVtb3J5KCZtZDVfY3R4MSwgc2l6ZW9mKE1ENV9DVFhfU1RSVUMpKTsKLSAgICBOZGlzWmVyb01lbW9yeSgmbWQ1X2N0eDIsIHNpemVvZihNRDVfQ1RYX1NUUlVDKSk7Ci0gICAgLyoKLSAgICAgKiBJZiB0aGUgbGVuZ3RoIG9mIEsgPSBCKEJsb2NrIHNpemUpOiBLMCA9IEsuCi0gICAgICogSWYgdGhlIGxlbmd0aCBvZiBLID4gQjogaGFzaCBLIHRvIG9idGFpbiBhbiBMIGJ5dGUgc3RyaW5nLAotICAgICAqIHRoZW4gYXBwZW5kIChCLUwpIHplcm9zIHRvIGNyZWF0ZSBhIEItYnl0ZSBzdHJpbmcgSzAgKGkuZS4sIEswID0gSChLKSB8fCAwMC4uLjAwKS4KLSAgICAgKiBJZiB0aGUgbGVuZ3RoIG9mIEsgPCBCOiBhcHBlbmQgemVyb3MgdG8gdGhlIGVuZCBvZiBLIHRvIGNyZWF0ZSBhIEItYnl0ZSBzdHJpbmcgSzAKLSAgICAgKi8KLSAgICBOZGlzWmVyb01lbW9yeShLMCwgTUQ1X0JMT0NLX1NJWkUpOwotICAgIGlmIChLZXlMZW4gPD0gTUQ1X0JMT0NLX1NJWkUpIHsKLSAgICAgICAgTmRpc01vdmVNZW1vcnkoSzAsIEtleSwgS2V5TGVuKTsKLSAgICB9IGVsc2UgewotICAgICAgICBSVF9NRDUoS2V5LCBLZXlMZW4sIEswKTsKLSAgICB9Ci0KLSAgICAvKiBFeGNsdXNpdmUtT3IgSzAgd2l0aCBpcGFkICovCi0gICAgLyogaXBhZDogSW5uZXIgcGFkOyB0aGUgYnl0ZSB477+977+9Mzbvv73vv70gcmVwZWF0ZWQgQiB0aW1lcy4gKi8KLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNRDVfQkxPQ0tfU0laRTsgaW5kZXgrKykKLSAgICAgICAgSzBbaW5kZXhdIF49IDB4MzY7Ci0gICAgICAgIC8qIEVuZCBvZiBmb3IgKi8KLQotICAgIE1ENV9Jbml0KCZtZDVfY3R4MSk7Ci0gICAgLyogSChLMF5pcGFkKSAqLwotICAgIE1ENV9BcHBlbmQoJm1kNV9jdHgxLCBLMCwgc2l6ZW9mKEswKSk7Ci0gICAgLyogSCgoSzBeaXBhZCl8fHRleHQpICovCi0gICAgTUQ1X0FwcGVuZCgmbWQ1X2N0eDEsIE1lc3NhZ2UsIE1lc3NhZ2VMZW4pOwotICAgIE1ENV9FbmQoJm1kNV9jdHgxLCBEaWdlc3QpOwotCi0gICAgLyogRXhjbHVzaXZlLU9yIEswIHdpdGggb3BhZCBhbmQgcmVtb3ZlIGlwYWQgKi8KLSAgICAvKiBvcGFkOiBPdXRlciBwYWQ7IHRoZSBieXRlIHjvv73vv701Y++/ve+/vSByZXBlYXRlZCBCIHRpbWVzLiAqLwotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1ENV9CTE9DS19TSVpFOyBpbmRleCsrKQotICAgICAgICBLMFtpbmRleF0gXj0gMHgzNl4weDVjOwotICAgICAgICAvKiBFbmQgb2YgZm9yICovCi0KLSAgICBNRDVfSW5pdCgmbWQ1X2N0eDIpOwotICAgIC8qIEgoSzBeb3BhZCkgKi8KLSAgICBNRDVfQXBwZW5kKCZtZDVfY3R4MiwgSzAsIHNpemVvZihLMCkpOwotICAgIC8qIEgoIChLMF5vcGFkKSB8fCBIKChLMF5pcGFkKXx8dGV4dCkgKSAqLwotICAgIE1ENV9BcHBlbmQoJm1kNV9jdHgyLCBEaWdlc3QsIE1ENV9ESUdFU1RfU0laRSk7Ci0gICAgTUQ1X0VuZCgmbWQ1X2N0eDIsIERpZ2VzdCk7Ci0KLSAgICBpZiAoTUFDTGVuID4gTUQ1X0RJR0VTVF9TSVpFKQotICAgICAgICBOZGlzTW92ZU1lbW9yeShNQUMsIERpZ2VzdCwgTUQ1X0RJR0VTVF9TSVpFKTsKLSAgICBlbHNlCi0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KE1BQywgRGlnZXN0LCBNQUNMZW4pOwotfSAvKiBFbmQgb2YgSE1BQ19TSEEyNTYgKi8KLSNlbmRpZiAvKiBITUFDX01ENV9TVVBQT1JUICovCi0KLS8qIEVuZCBvZiBjcnlwdF9obWFjLmMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NyeXB0X21kNS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY3J5cHRfbWQ1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOTMyNjUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY3J5cHRfbWQ1LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiLi4vY3J5cHRfbWQ1LmgiCi0KLQotI2lmZGVmIE1ENV9TVVBQT1JUCi0vKgotICogRiwgRywgSCBhbmQgSSBhcmUgYmFzaWMgTUQ1IGZ1bmN0aW9ucy4KLSAqLwotI2RlZmluZSBGKHgsIHksIHopICgoKHgpICYgKHkpKSB8ICgofngpICYgKHopKSkKLSNkZWZpbmUgRyh4LCB5LCB6KSAoKCh4KSAmICh6KSkgfCAoKHkpICYgKH56KSkpCi0jZGVmaW5lIEgoeCwgeSwgeikgKCh4KSBeICh5KSBeICh6KSkKLSNkZWZpbmUgSSh4LCB5LCB6KSAoKHkpIF4gKCh4KSB8ICh+eikpKQotCi0jZGVmaW5lIFJPVEwoeCxuLHcpICgoeCA8PCBuKSB8ICh4ID4+ICh3IC0gbikpKQotI2RlZmluZSBST1RMMzIoeCxuKSBST1RMKHgsbiwzMikgLyogMzIgYml0cyB3b3JkICovCi0KLSNkZWZpbmUgUk9VTkQxKGEsIGIsIGMsIGQsIHgsIHMsIGFjKSB7ICAgICAgICAgIFwKLSAgICAoYSkgKz0gRigoYiksKGMpLChkKSkgKyAoeCkgKyAoVUlOVDMyKShhYyk7IFwKLSAgICAoYSkgID0gUk9UTDMyKChhKSwocykpOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoYSkgKz0gKGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLSNkZWZpbmUgUk9VTkQyKGEsIGIsIGMsIGQsIHgsIHMsIGFjKSB7ICAgICAgICAgIFwKLSAgICAoYSkgKz0gRygoYiksKGMpLChkKSkgKyAoeCkgKyAoVUlOVDMyKShhYyk7IFwKLSAgICAoYSkgID0gUk9UTDMyKChhKSwocykpOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoYSkgKz0gKGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLSNkZWZpbmUgUk9VTkQzKGEsIGIsIGMsIGQsIHgsIHMsIGFjKSB7ICAgICAgICAgIFwKLSAgICAoYSkgKz0gSCgoYiksKGMpLChkKSkgKyAoeCkgKyAoVUlOVDMyKShhYyk7IFwKLSAgICAoYSkgID0gUk9UTDMyKChhKSwocykpOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoYSkgKz0gKGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLSNkZWZpbmUgUk9VTkQ0KGEsIGIsIGMsIGQsIHgsIHMsIGFjKSB7ICAgICAgICAgIFwKLSAgICAoYSkgKz0gSSgoYiksKGMpLChkKSkgKyAoeCkgKyAoVUlOVDMyKShhYyk7IFwKLSAgICAoYSkgID0gUk9UTDMyKChhKSwocykpOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoYSkgKz0gKGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLXN0YXRpYyBjb25zdCBVSU5UMzIgTUQ1X0RlZmF1bHRIYXNoVmFsdWVbNF0gPSB7Ci0gICAgMHg2NzQ1MjMwMVVMLCAweGVmY2RhYjg5VUwsIDB4OThiYWRjZmVVTCwgMHgxMDMyNTQ3NlVMCi19OwotI2VuZGlmIC8qIE1ENV9TVVBQT1JUICovCi0KLQotI2lmZGVmIE1ENV9TVVBQT1JUCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEluaXRpYWwgTWQ1X0NUWF9TVFJVQwotCi1Bcmd1bWVudHM6Ci0gICAgcE1ENV9DVFggICAgICAgIFBvaW50ZXIgdG8gTWQ1X0NUWF9TVFJVQwotCi1SZXR1cm4gVmFsdWU6Ci0gICAgTm9uZQotCi1Ob3RlOgotICAgIE5vbmUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgTUQ1X0luaXQgKAotICAgIElOICBNRDVfQ1RYX1NUUlVDICpwTUQ1X0NUWCkKLXsKLSAgICBOZGlzTW92ZU1lbW9yeShwTUQ1X0NUWC0+SGFzaFZhbHVlLCBNRDVfRGVmYXVsdEhhc2hWYWx1ZSwKLSAgICAgICAgc2l6ZW9mKE1ENV9EZWZhdWx0SGFzaFZhbHVlKSk7Ci0gICAgTmRpc1plcm9NZW1vcnkocE1ENV9DVFgtPkJsb2NrLCBNRDVfQkxPQ0tfU0laRSk7Ci0gICAgcE1ENV9DVFgtPkJsb2NrTGVuICAgPSAwOwotICAgIHBNRDVfQ1RYLT5NZXNzYWdlTGVuID0gMDsKLX0gLyogRW5kIG9mIE1ENV9Jbml0ICovCi0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBNRDUgY29tcHV0YXRpb24gZm9yIG9uZSBibG9jayAoNTEyIGJpdHMpCi0KLUFyZ3VtZW50czoKLSAgICBwTUQ1X0NUWCAgICAgICAgUG9pbnRlciB0byBNZDVfQ1RYX1NUUlVDCi0KLVJldHVybiBWYWx1ZToKLSAgICBOb25lCi0KLU5vdGU6Ci0gICAgVFtpXSA6PSBmbG9vcihhYnMoc2luKGkgKyAxKSkgKiAoMiBwb3cgMzIpKSwgaSBpcyBudW1iZXIgb2Ygcm91bmQKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgTUQ1X0hhc2ggKAotICAgIElOICBNRDVfQ1RYX1NUUlVDICpwTUQ1X0NUWCkKLXsKLSAgICBVSU5UMzIgWF9pOwotICAgIFVJTlQzMiBYWzE2XTsKLSAgICBVSU5UMzIgYSxiLGMsZDsKLQotICAgIC8qIFByZXBhcmUgdGhlIG1lc3NhZ2Ugc2NoZWR1bGUsIHtYX2l9ICovCi0gICAgTmRpc01vdmVNZW1vcnkoWCwgcE1ENV9DVFgtPkJsb2NrLCBNRDVfQkxPQ0tfU0laRSk7Ci0gICAgZm9yIChYX2kgPSAwOyBYX2kgPCAxNjsgWF9pKyspCi0gICAgICAgIFhbWF9pXSA9IGNwdTJsZTMyKFhbWF9pXSk7IC8qIEVuZGlhbiBTd2FwICovCi0gICAgICAgIC8qIEVuZCBvZiBmb3IgKi8KLQotICAgIC8qIE1ENSBoYXNoIGNvbXB1dGF0aW9uICovCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgd29ya2luZyB2YXJpYWJsZXMgKi8KLSAgICBhID0gcE1ENV9DVFgtPkhhc2hWYWx1ZVswXTsKLSAgICBiID0gcE1ENV9DVFgtPkhhc2hWYWx1ZVsxXTsKLSAgICBjID0gcE1ENV9DVFgtPkhhc2hWYWx1ZVsyXTsKLSAgICBkID0gcE1ENV9DVFgtPkhhc2hWYWx1ZVszXTsKLQotICAgIC8qCi0gICAgICogIFJvdW5kIDEKLSAgICAgKiAgTGV0IFthYmNkIGsgcyBpXSBkZW5vdGUgdGhlIG9wZXJhdGlvbgotICAgICAqICBhID0gYiArICgoYSArIEYoYixjLGQpICsgWFtrXSArIFRbaV0pIDw8PCBzKQotICAgICAqLwotICAgIFJPVU5EMShhLCBiLCBjLCBkLCBYWyAwXSwgIDcsIDB4ZDc2YWE0NzgpOyAvKiAxICovCi0gICAgUk9VTkQxKGQsIGEsIGIsIGMsIFhbIDFdLCAxMiwgMHhlOGM3Yjc1Nik7IC8qIDIgKi8KLSAgICBST1VORDEoYywgZCwgYSwgYiwgWFsgMl0sIDE3LCAweDI0MjA3MGRiKTsgLyogMyAqLwotICAgIFJPVU5EMShiLCBjLCBkLCBhLCBYWyAzXSwgMjIsIDB4YzFiZGNlZWUpOyAvKiA0ICovCi0gICAgUk9VTkQxKGEsIGIsIGMsIGQsIFhbIDRdLCAgNywgMHhmNTdjMGZhZik7IC8qIDUgKi8KLSAgICBST1VORDEoZCwgYSwgYiwgYywgWFsgNV0sIDEyLCAweDQ3ODdjNjJhKTsgLyogNiAqLwotICAgIFJPVU5EMShjLCBkLCBhLCBiLCBYWyA2XSwgMTcsIDB4YTgzMDQ2MTMpOyAvKiA3ICovCi0gICAgUk9VTkQxKGIsIGMsIGQsIGEsIFhbIDddLCAyMiwgMHhmZDQ2OTUwMSk7IC8qIDggKi8KLSAgICBST1VORDEoYSwgYiwgYywgZCwgWFsgOF0sICA3LCAweDY5ODA5OGQ4KTsgLyogOSAqLwotICAgIFJPVU5EMShkLCBhLCBiLCBjLCBYWyA5XSwgMTIsIDB4OGI0NGY3YWYpOyAvKiAxMCAqLwotICAgIFJPVU5EMShjLCBkLCBhLCBiLCBYWzEwXSwgMTcsIDB4ZmZmZjViYjEpOyAvKiAxMSAqLwotICAgIFJPVU5EMShiLCBjLCBkLCBhLCBYWzExXSwgMjIsIDB4ODk1Y2Q3YmUpOyAvKiAxMiAqLwotICAgIFJPVU5EMShhLCBiLCBjLCBkLCBYWzEyXSwgIDcsIDB4NmI5MDExMjIpOyAvKiAxMyAqLwotICAgIFJPVU5EMShkLCBhLCBiLCBjLCBYWzEzXSwgMTIsIDB4ZmQ5ODcxOTMpOyAvKiAxNCAqLwotICAgIFJPVU5EMShjLCBkLCBhLCBiLCBYWzE0XSwgMTcsIDB4YTY3OTQzOGUpOyAvKiAxNSAqLwotICAgIFJPVU5EMShiLCBjLCBkLCBhLCBYWzE1XSwgMjIsIDB4NDliNDA4MjEpOyAvKiAxNiAqLwotCi0gICAgLyoKLSAgICAgKiAgUm91bmQgMgotICAgICAqICBMZXQgW2FiY2QgayBzIGldIGRlbm90ZSB0aGUgb3BlcmF0aW9uCi0gICAgICogIGEgPSBiICsgKChhICsgRyhiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpCi0gICAgICovCi0gICAgUk9VTkQyKGEsIGIsIGMsIGQsIFhbIDFdLCAgNSwgMHhmNjFlMjU2Mik7IC8qIDE3ICovCi0gICAgUk9VTkQyKGQsIGEsIGIsIGMsIFhbIDZdLCAgOSwgMHhjMDQwYjM0MCk7IC8qIDE4ICovCi0gICAgUk9VTkQyKGMsIGQsIGEsIGIsIFhbMTFdLCAxNCwgMHgyNjVlNWE1MSk7IC8qIDE5ICovCi0gICAgUk9VTkQyKGIsIGMsIGQsIGEsIFhbIDBdLCAyMCwgMHhlOWI2YzdhYSk7IC8qIDIwICovCi0gICAgUk9VTkQyKGEsIGIsIGMsIGQsIFhbIDVdLCAgNSwgMHhkNjJmMTA1ZCk7IC8qIDIxICovCi0gICAgUk9VTkQyKGQsIGEsIGIsIGMsIFhbMTBdLCAgOSwgIDB4MjQ0MTQ1Myk7IC8qIDIyICovCi0gICAgUk9VTkQyKGMsIGQsIGEsIGIsIFhbMTVdLCAxNCwgMHhkOGExZTY4MSk7IC8qIDIzICovCi0gICAgUk9VTkQyKGIsIGMsIGQsIGEsIFhbIDRdLCAyMCwgMHhlN2QzZmJjOCk7IC8qIDI0ICovCi0gICAgUk9VTkQyKGEsIGIsIGMsIGQsIFhbIDldLCAgNSwgMHgyMWUxY2RlNik7IC8qIDI1ICovCi0gICAgUk9VTkQyKGQsIGEsIGIsIGMsIFhbMTRdLCAgOSwgMHhjMzM3MDdkNik7IC8qIDI2ICovCi0gICAgUk9VTkQyKGMsIGQsIGEsIGIsIFhbIDNdLCAxNCwgMHhmNGQ1MGQ4Nyk7IC8qIDI3ICovCi0gICAgUk9VTkQyKGIsIGMsIGQsIGEsIFhbIDhdLCAyMCwgMHg0NTVhMTRlZCk7IC8qIDI4ICovCi0gICAgUk9VTkQyKGEsIGIsIGMsIGQsIFhbMTNdLCAgNSwgMHhhOWUzZTkwNSk7IC8qIDI5ICovCi0gICAgUk9VTkQyKGQsIGEsIGIsIGMsIFhbIDJdLCAgOSwgMHhmY2VmYTNmOCk7IC8qIDMwICovCi0gICAgUk9VTkQyKGMsIGQsIGEsIGIsIFhbIDddLCAxNCwgMHg2NzZmMDJkOSk7IC8qIDMxICovCi0gICAgUk9VTkQyKGIsIGMsIGQsIGEsIFhbMTJdLCAyMCwgMHg4ZDJhNGM4YSk7IC8qIDMyICovCi0KLSAgICAvKgotICAgICAqICBSb3VuZCAzCi0gICAgICogIExldCBbYWJjZCBrIHMgdF0gZGVub3RlIHRoZSBvcGVyYXRpb24KLSAgICAgKiAgYSA9IGIgKyAoKGEgKyBIKGIsYyxkKSArIFhba10gKyBUW2ldKSA8PDwgcykKLSAgICAgKi8KLSAgICBST1VORDMoYSwgYiwgYywgZCwgWFsgNV0sICA0LCAweGZmZmEzOTQyKTsgLyogMzMgKi8KLSAgICBST1VORDMoZCwgYSwgYiwgYywgWFsgOF0sIDExLCAweDg3NzFmNjgxKTsgLyogMzQgKi8KLSAgICBST1VORDMoYywgZCwgYSwgYiwgWFsxMV0sIDE2LCAweDZkOWQ2MTIyKTsgLyogMzUgKi8KLSAgICBST1VORDMoYiwgYywgZCwgYSwgWFsxNF0sIDIzLCAweGZkZTUzODBjKTsgLyogMzYgKi8KLSAgICBST1VORDMoYSwgYiwgYywgZCwgWFsgMV0sICA0LCAweGE0YmVlYTQ0KTsgLyogMzcgKi8KLSAgICBST1VORDMoZCwgYSwgYiwgYywgWFsgNF0sIDExLCAweDRiZGVjZmE5KTsgLyogMzggKi8KLSAgICBST1VORDMoYywgZCwgYSwgYiwgWFsgN10sIDE2LCAweGY2YmI0YjYwKTsgLyogMzkgKi8KLSAgICBST1VORDMoYiwgYywgZCwgYSwgWFsxMF0sIDIzLCAweGJlYmZiYzcwKTsgLyogNDAgKi8KLSAgICBST1VORDMoYSwgYiwgYywgZCwgWFsxM10sICA0LCAweDI4OWI3ZWM2KTsgLyogNDEgKi8KLSAgICBST1VORDMoZCwgYSwgYiwgYywgWFsgMF0sIDExLCAweGVhYTEyN2ZhKTsgLyogNDIgKi8KLSAgICBST1VORDMoYywgZCwgYSwgYiwgWFsgM10sIDE2LCAweGQ0ZWYzMDg1KTsgLyogNDMgKi8KLSAgICBST1VORDMoYiwgYywgZCwgYSwgWFsgNl0sIDIzLCAgMHg0ODgxZDA1KTsgLyogNDQgKi8KLSAgICBST1VORDMoYSwgYiwgYywgZCwgWFsgOV0sICA0LCAweGQ5ZDRkMDM5KTsgLyogNDUgKi8KLSAgICBST1VORDMoZCwgYSwgYiwgYywgWFsxMl0sIDExLCAweGU2ZGI5OWU1KTsgLyogNDYgKi8KLSAgICBST1VORDMoYywgZCwgYSwgYiwgWFsxNV0sIDE2LCAweDFmYTI3Y2Y4KTsgLyogNDcgKi8KLSAgICBST1VORDMoYiwgYywgZCwgYSwgWFsgMl0sIDIzLCAweGM0YWM1NjY1KTsgLyogNDggKi8KLQotICAgIC8qCi0gICAgICogIFJvdW5kIDQKLSAgICAgKiAgTGV0IFthYmNkIGsgcyB0XSBkZW5vdGUgdGhlIG9wZXJhdGlvbgotICAgICAqICBhID0gYiArICgoYSArIEkoYixjLGQpICsgWFtrXSArIFRbaV0pIDw8PCBzKQotICAgICAqLwotICAgIFJPVU5ENChhLCBiLCBjLCBkLCBYWyAwXSwgIDYsIDB4ZjQyOTIyNDQpOyAvKiA0OSAqLwotICAgIFJPVU5ENChkLCBhLCBiLCBjLCBYWyA3XSwgMTAsIDB4NDMyYWZmOTcpOyAvKiA1MCAqLwotICAgIFJPVU5ENChjLCBkLCBhLCBiLCBYWzE0XSwgMTUsIDB4YWI5NDIzYTcpOyAvKiA1MSAqLwotICAgIFJPVU5ENChiLCBjLCBkLCBhLCBYWyA1XSwgMjEsIDB4ZmM5M2EwMzkpOyAvKiA1MiAqLwotICAgIFJPVU5ENChhLCBiLCBjLCBkLCBYWzEyXSwgIDYsIDB4NjU1YjU5YzMpOyAvKiA1MyAqLwotICAgIFJPVU5ENChkLCBhLCBiLCBjLCBYWyAzXSwgMTAsIDB4OGYwY2NjOTIpOyAvKiA1NCAqLwotICAgIFJPVU5ENChjLCBkLCBhLCBiLCBYWzEwXSwgMTUsIDB4ZmZlZmY0N2QpOyAvKiA1NSAqLwotICAgIFJPVU5ENChiLCBjLCBkLCBhLCBYWyAxXSwgMjEsIDB4ODU4NDVkZDEpOyAvKiA1NiAqLwotICAgIFJPVU5ENChhLCBiLCBjLCBkLCBYWyA4XSwgIDYsIDB4NmZhODdlNGYpOyAvKiA1NyAqLwotICAgIFJPVU5ENChkLCBhLCBiLCBjLCBYWzE1XSwgMTAsIDB4ZmUyY2U2ZTApOyAvKiA1OCAqLwotICAgIFJPVU5ENChjLCBkLCBhLCBiLCBYWyA2XSwgMTUsIDB4YTMwMTQzMTQpOyAvKiA1OSAqLwotICAgIFJPVU5ENChiLCBjLCBkLCBhLCBYWzEzXSwgMjEsIDB4NGUwODExYTEpOyAvKiA2MCAqLwotICAgIFJPVU5ENChhLCBiLCBjLCBkLCBYWyA0XSwgIDYsIDB4Zjc1MzdlODIpOyAvKiA2MSAqLwotICAgIFJPVU5ENChkLCBhLCBiLCBjLCBYWzExXSwgMTAsIDB4YmQzYWYyMzUpOyAvKiA2MiAqLwotICAgIFJPVU5ENChjLCBkLCBhLCBiLCBYWyAyXSwgMTUsIDB4MmFkN2QyYmIpOyAvKiA2MyAqLwotICAgIFJPVU5ENChiLCBjLCBkLCBhLCBYWyA5XSwgMjEsIDB4ZWI4NmQzOTEpOyAvKiA2NCAqLwotCi0gICAgLyogQ29tcHV0ZSB0aGUgaV50aCBpbnRlcm1lZGlhdGUgaGFzaCB2YWx1ZSBIXihpKSAqLwotICAgIHBNRDVfQ1RYLT5IYXNoVmFsdWVbMF0gKz0gYTsKLSAgICBwTUQ1X0NUWC0+SGFzaFZhbHVlWzFdICs9IGI7Ci0gICAgcE1ENV9DVFgtPkhhc2hWYWx1ZVsyXSArPSBjOwotICAgIHBNRDVfQ1RYLT5IYXNoVmFsdWVbM10gKz0gZDsKLQotICAgIE5kaXNaZXJvTWVtb3J5KHBNRDVfQ1RYLT5CbG9jaywgTUQ1X0JMT0NLX1NJWkUpOwotICAgIHBNRDVfQ1RYLT5CbG9ja0xlbiA9IDA7Ci19IC8qIEVuZCBvZiBNRDVfSGFzaCAqLwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgVGhlIG1lc3NhZ2UgaXMgYXBwZW5kZWQgdG8gYmxvY2suIElmIGJsb2NrIHNpemUgPiA2NCBieXRlcywgdGhlIE1ENV9IYXNoCi13aWxsIGJlIGNhbGxlZC4KLQotQXJndW1lbnRzOgotICAgIHBNRDVfQ1RYICAgICAgICBQb2ludGVyIHRvIE1ENV9DVFhfU1RSVUMKLSAgICBtZXNzYWdlICAgICAgICAgTWVzc2FnZSBjb250ZXh0Ci0gICAgbWVzc2FnZUxlbiAgICAgIFRoZSBsZW5ndGggb2YgbWVzc2FnZSBpbiBieXRlcwotCi1SZXR1cm4gVmFsdWU6Ci0gICAgTm9uZQotCi1Ob3RlOgotICAgIE5vbmUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgTUQ1X0FwcGVuZCAoCi0gICAgSU4gIE1ENV9DVFhfU1RSVUMgKnBNRDVfQ1RYLAotICAgIElOICBjb25zdCBVSU5UOCBNZXNzYWdlW10sCi0gICAgSU4gIFVJTlQgTWVzc2FnZUxlbikKLXsKLSAgICBVSU5UIGFwcGVuZExlbiA9IDA7Ci0gICAgVUlOVCBkaWZmTGVuID0gMDsKLQotICAgIHdoaWxlIChhcHBlbmRMZW4gIT0gTWVzc2FnZUxlbikgewotICAgICAgICBkaWZmTGVuID0gTWVzc2FnZUxlbiAtIGFwcGVuZExlbjsKLSAgICAgICAgaWYgKChwTUQ1X0NUWC0+QmxvY2tMZW4gKyBkaWZmTGVuKSA8IE1ENV9CTE9DS19TSVpFKSB7Ci0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwTUQ1X0NUWC0+QmxvY2sgKyBwTUQ1X0NUWC0+QmxvY2tMZW4sCi0gICAgICAgICAgICAgICAgTWVzc2FnZSArIGFwcGVuZExlbiwgZGlmZkxlbik7Ci0gICAgICAgICAgICBwTUQ1X0NUWC0+QmxvY2tMZW4gKz0gZGlmZkxlbjsKLSAgICAgICAgICAgIGFwcGVuZExlbiArPSBkaWZmTGVuOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocE1ENV9DVFgtPkJsb2NrICsgcE1ENV9DVFgtPkJsb2NrTGVuLAotICAgICAgICAgICAgICAgIE1lc3NhZ2UgKyBhcHBlbmRMZW4sIE1ENV9CTE9DS19TSVpFIC0gcE1ENV9DVFgtPkJsb2NrTGVuKTsKLSAgICAgICAgICAgIGFwcGVuZExlbiArPSAoTUQ1X0JMT0NLX1NJWkUgLSBwTUQ1X0NUWC0+QmxvY2tMZW4pOwotICAgICAgICAgICAgcE1ENV9DVFgtPkJsb2NrTGVuID0gTUQ1X0JMT0NLX1NJWkU7Ci0gICAgICAgICAgICBNRDVfSGFzaChwTUQ1X0NUWCk7Ci0gICAgICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgfSAvKiBFbmQgb2Ygd2hpbGUgKi8KLSAgICBwTUQ1X0NUWC0+TWVzc2FnZUxlbiArPSBNZXNzYWdlTGVuOwotfSAvKiBFbmQgb2YgTUQ1X0FwcGVuZCAqLwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgMS4gQXBwZW5kIGJpdCAxIHRvIGVuZCBvZiB0aGUgbWVzc2FnZQotICAgIDIuIEFwcGVuZCB0aGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gcmlnaHRtb3N0IDY0IGJpdHMKLSAgICAzLiBUcmFuc2Zvcm0gdGhlIEhhc2ggVmFsdWUgdG8gZGlnZXN0IG1lc3NhZ2UKLQotQXJndW1lbnRzOgotICAgIHBNRDVfQ1RYICAgICAgICBQb2ludGVyIHRvIE1ENV9DVFhfU1RSVUMKLQotUmV0dXJuIFZhbHVlOgotICAgIGRpZ2VzdE1lc3NhZ2UgICBEaWdlc3QgbWVzc2FnZQotCi1Ob3RlOgotICAgIE5vbmUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgTUQ1X0VuZCAoCi0gICAgSU4gIE1ENV9DVFhfU1RSVUMgKnBNRDVfQ1RYLAotICAgIE9VVCBVSU5UOCBEaWdlc3RNZXNzYWdlW10pCi17Ci0gICAgVUlOVCBpbmRleDsKLSAgICBVSU5UNjQgbWVzc2FnZV9sZW5ndGhfYml0czsKLQotICAgIC8qIGFwcGVuZCAxIGJpdHMgdG8gZW5kIG9mIHRoZSBtZXNzYWdlICovCi0gICAgTmRpc0ZpbGxNZW1vcnkocE1ENV9DVFgtPkJsb2NrICsgcE1ENV9DVFgtPkJsb2NrTGVuLCAxLCAweDgwKTsKLQotICAgIC8qIDU1ID0gNjQgLSA4IC0gMTogYXBwZW5kIDEgYml0KDEgYnl0ZSkgYW5kIG1lc3NhZ2UgbGVuZ3RoICg4IGJ5dGVzKSAqLwotICAgIGlmIChwTUQ1X0NUWC0+QmxvY2tMZW4gPiA1NSkKLSAgICAgICAgTUQ1X0hhc2gocE1ENV9DVFgpOwotICAgICAgICAvKiBFbmQgb2YgaWYgKi8KLQotICAgIC8qIEFwcGVuZCB0aGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gcmlnaHRtb3N0IDY0IGJpdHMgKi8KLSAgICBtZXNzYWdlX2xlbmd0aF9iaXRzID0gcE1ENV9DVFgtPk1lc3NhZ2VMZW4qODsKLSAgICBtZXNzYWdlX2xlbmd0aF9iaXRzID0gY3B1MmxlNjQobWVzc2FnZV9sZW5ndGhfYml0cyk7Ci0gICAgTmRpc01vdmVNZW1vcnkoJnBNRDVfQ1RYLT5CbG9ja1s1Nl0sICZtZXNzYWdlX2xlbmd0aF9iaXRzLCA4KTsKLSAgICBNRDVfSGFzaChwTUQ1X0NUWCk7Ci0KLSAgICAvKiBSZXR1cm4gbWVzc2FnZSBkaWdlc3QsIHRyYW5zZm9ybSB0aGUgVUlOVDMyIGhhc2ggdmFsdWUgdG8gYnl0ZXMgKi8KLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA0O2luZGV4KyspCi0gICAgICAgIHBNRDVfQ1RYLT5IYXNoVmFsdWVbaW5kZXhdID0gY3B1MmxlMzIocE1ENV9DVFgtPkhhc2hWYWx1ZVtpbmRleF0pOwotICAgICAgICAvKiBFbmQgb2YgZm9yICovCi0gICAgTmRpc01vdmVNZW1vcnkoRGlnZXN0TWVzc2FnZSwgcE1ENV9DVFgtPkhhc2hWYWx1ZSwgTUQ1X0RJR0VTVF9TSVpFKTsKLX0gLyogRW5kIG9mIE1ENV9FbmQgKi8KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIE1ENSBhbGdvcml0aG0KLQotQXJndW1lbnRzOgotICAgIG1lc3NhZ2UgICAgICAgICBNZXNzYWdlIGNvbnRleHQKLSAgICBtZXNzYWdlTGVuICAgICAgVGhlIGxlbmd0aCBvZiBtZXNzYWdlIGluIGJ5dGVzCi0KLVJldHVybiBWYWx1ZToKLSAgICBkaWdlc3RNZXNzYWdlICAgRGlnZXN0IG1lc3NhZ2UKLQotTm90ZToKLSAgICBOb25lCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUX01ENSAoCi0gICAgSU4gIGNvbnN0IFVJTlQ4IE1lc3NhZ2VbXSwKLSAgICBJTiAgVUlOVCBNZXNzYWdlTGVuLAotICAgIE9VVCBVSU5UOCBEaWdlc3RNZXNzYWdlW10pCi17Ci0gICAgTUQ1X0NUWF9TVFJVQyBtZDVfY3R4OwotCi0gICAgTmRpc1plcm9NZW1vcnkoJm1kNV9jdHgsIHNpemVvZihNRDVfQ1RYX1NUUlVDKSk7Ci0gICAgTUQ1X0luaXQoJm1kNV9jdHgpOwotICAgIE1ENV9BcHBlbmQoJm1kNV9jdHgsIE1lc3NhZ2UsIE1lc3NhZ2VMZW4pOwotICAgIE1ENV9FbmQoJm1kNV9jdHgsIERpZ2VzdE1lc3NhZ2UpOwotfSAvKiBFbmQgb2YgUlRfTUQ1ICovCi0KLSNlbmRpZiAvKiBNRDVfU1VQUE9SVCAqLwotCi0vKiBFbmQgb2YgY3J5cHRfbWQ1LmMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NyeXB0X3NoYTIuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NyeXB0X3NoYTIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0OTBkMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jcnlwdF9zaGEyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzYgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiLi4vY3J5cHRfc2hhMi5oIgotCi0KLS8qIEJhc2ljIG9wZXJhdGlvbnMgKi8KLSNkZWZpbmUgU0hSKHgsbikgKHggPj4gbikgLyogU0hSKHgpXm4sIHJpZ2h0IHNoaWZ0IG4gYml0cyAsIHggaXMgdy1iaXQgd29yZCwgMCA8PSBuIDw9IHcgKi8KLSNkZWZpbmUgUk9UUih4LG4sdykgKCh4ID4+IG4pIHwgKHggPDwgKHcgLSBuKSkpIC8qIFJPVFIoeClebiwgY2lyY3VsYXIgcmlnaHQgc2hpZnQgbiBiaXRzICwgeCBpcyB3LWJpdCB3b3JkLCAwIDw9IG4gPD0gdyAqLwotI2RlZmluZSBST1RMKHgsbix3KSAoKHggPDwgbikgfCAoeCA+PiAodyAtIG4pKSkgLyogUk9UTCh4KV5uLCBjaXJjdWxhciBsZWZ0IHNoaWZ0IG4gYml0cyAsIHggaXMgdy1iaXQgd29yZCwgMCA8PSBuIDw9IHcgKi8KLSNkZWZpbmUgUk9UUjMyKHgsbikgUk9UUih4LG4sMzIpIC8qIDMyIGJpdHMgd29yZCAqLwotI2RlZmluZSBST1RMMzIoeCxuKSBST1RMKHgsbiwzMikgLyogMzIgYml0cyB3b3JkICovCi0KLS8qIEJhc2ljIGZ1bmN0aW9ucyAqLwotI2RlZmluZSBDaCh4LHkseikgKCh4ICYgeSkgXiAoKH54KSAmIHopKQotI2RlZmluZSBNYWooeCx5LHopICgoeCAmIHkpIF4gKHggJiB6KSBeICh5ICYgeikpCi0jZGVmaW5lIFBhcml0eSh4LHkseikgKHggXiB5IF4geikKLQotI2lmZGVmIFNIQTFfU1VQUE9SVAotLyogU0hBMSBjb25zdGFudHMgKi8KLSNkZWZpbmUgU0hBMV9NQVNLIDB4MDAwMDAwMGYKLXN0YXRpYyBjb25zdCBVSU5UMzIgU0hBMV9LWzRdID0gewotICAgIDB4NWE4Mjc5OTlVTCwgMHg2ZWQ5ZWJhMVVMLCAweDhmMWJiY2RjVUwsIDB4Y2E2MmMxZDZVTAotfTsKLXN0YXRpYyBjb25zdCBVSU5UMzIgU0hBMV9EZWZhdWx0SGFzaFZhbHVlWzVdID0gewotICAgIDB4Njc0NTIzMDFVTCwgMHhlZmNkYWI4OVVMLCAweDk4YmFkY2ZlVUwsIDB4MTAzMjU0NzZVTCwgMHhjM2QyZTFmMFVMCi19OwotI2VuZGlmIC8qIFNIQTFfU1VQUE9SVCAqLwotCi0KLSNpZmRlZiBTSEEyNTZfU1VQUE9SVAotLyogU0hBMjU2IGZ1bmN0aW9ucyAqLwotI2RlZmluZSBac2lnbWFfMjU2XzAoeCkgKFJPVFIzMih4LDIpIF4gUk9UUjMyKHgsMTMpIF4gUk9UUjMyKHgsMjIpKQotI2RlZmluZSBac2lnbWFfMjU2XzEoeCkgKFJPVFIzMih4LDYpIF4gUk9UUjMyKHgsMTEpIF4gUk9UUjMyKHgsMjUpKQotI2RlZmluZSBTaWdtYV8yNTZfMCh4KSAgKFJPVFIzMih4LDcpIF4gUk9UUjMyKHgsMTgpIF4gU0hSKHgsMykpCi0jZGVmaW5lIFNpZ21hXzI1Nl8xKHgpICAoUk9UUjMyKHgsMTcpIF4gUk9UUjMyKHgsMTkpIF4gU0hSKHgsMTApKQotLyogU0hBMjU2IGNvbnN0YW50cyAqLwotc3RhdGljIGNvbnN0IFVJTlQzMiBTSEEyNTZfS1s2NF0gPSB7Ci0gICAgMHg0MjhhMmY5OFVMLCAweDcxMzc0NDkxVUwsIDB4YjVjMGZiY2ZVTCwgMHhlOWI1ZGJhNVVMLAotICAgIDB4Mzk1NmMyNWJVTCwgMHg1OWYxMTFmMVVMLCAweDkyM2Y4MmE0VUwsIDB4YWIxYzVlZDVVTCwKLSAgICAweGQ4MDdhYTk4VUwsIDB4MTI4MzViMDFVTCwgMHgyNDMxODViZVVMLCAweDU1MGM3ZGMzVUwsCi0gICAgMHg3MmJlNWQ3NFVMLCAweDgwZGViMWZlVUwsIDB4OWJkYzA2YTdVTCwgMHhjMTliZjE3NFVMLAotICAgIDB4ZTQ5YjY5YzFVTCwgMHhlZmJlNDc4NlVMLCAweDBmYzE5ZGM2VUwsIDB4MjQwY2ExY2NVTCwKLSAgICAweDJkZTkyYzZmVUwsIDB4NGE3NDg0YWFVTCwgMHg1Y2IwYTlkY1VMLCAweDc2Zjk4OGRhVUwsCi0gICAgMHg5ODNlNTE1MlVMLCAweGE4MzFjNjZkVUwsIDB4YjAwMzI3YzhVTCwgMHhiZjU5N2ZjN1VMLAotICAgIDB4YzZlMDBiZjNVTCwgMHhkNWE3OTE0N1VMLCAweDA2Y2E2MzUxVUwsIDB4MTQyOTI5NjdVTCwKLSAgICAweDI3YjcwYTg1VUwsIDB4MmUxYjIxMzhVTCwgMHg0ZDJjNmRmY1VMLCAweDUzMzgwZDEzVUwsCi0gICAgMHg2NTBhNzM1NFVMLCAweDc2NmEwYWJiVUwsIDB4ODFjMmM5MmVVTCwgMHg5MjcyMmM4NVVMLAotICAgIDB4YTJiZmU4YTFVTCwgMHhhODFhNjY0YlVMLCAweGMyNGI4YjcwVUwsIDB4Yzc2YzUxYTNVTCwKLSAgICAweGQxOTJlODE5VUwsIDB4ZDY5OTA2MjRVTCwgMHhmNDBlMzU4NVVMLCAweDEwNmFhMDcwVUwsCi0gICAgMHgxOWE0YzExNlVMLCAweDFlMzc2YzA4VUwsIDB4Mjc0ODc3NGNVTCwgMHgzNGIwYmNiNVVMLAotICAgIDB4MzkxYzBjYjNVTCwgMHg0ZWQ4YWE0YVVMLCAweDViOWNjYTRmVUwsIDB4NjgyZTZmZjNVTCwKLSAgICAweDc0OGY4MmVlVUwsIDB4NzhhNTYzNmZVTCwgMHg4NGM4NzgxNFVMLCAweDhjYzcwMjA4VUwsCi0gICAgMHg5MGJlZmZmYVVMLCAweGE0NTA2Y2ViVUwsIDB4YmVmOWEzZjdVTCwgMHhjNjcxNzhmMlVMCi19Owotc3RhdGljIGNvbnN0IFVJTlQzMiBTSEEyNTZfRGVmYXVsdEhhc2hWYWx1ZVs4XSA9IHsKLSAgICAweDZhMDllNjY3VUwsIDB4YmI2N2FlODVVTCwgMHgzYzZlZjM3MlVMLCAweGE1NGZmNTNhVUwsCi0gICAgMHg1MTBlNTI3ZlVMLCAweDliMDU2ODhjVUwsIDB4MWY4M2Q5YWJVTCwgMHg1YmUwY2QxOVVMCi19OwotI2VuZGlmIC8qIFNIQTI1Nl9TVVBQT1JUICovCi0KLQotI2lmZGVmIFNIQTFfU1VQUE9SVAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBJbml0aWFsIFNIQTFfQ1RYX1NUUlVDCi0KLUFyZ3VtZW50czoKLSAgICBwU0hBX0NUWCAgICAgICAgUG9pbnRlciB0byBTSEExX0NUWF9TVFJVQwotCi1SZXR1cm4gVmFsdWU6Ci0gICAgTm9uZQotCi1Ob3RlOgotICAgIE5vbmUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgU0hBMV9Jbml0ICgKLSAgICBJTiAgU0hBMV9DVFhfU1RSVUMgKnBTSEFfQ1RYKQotewotICAgIE5kaXNNb3ZlTWVtb3J5KHBTSEFfQ1RYLT5IYXNoVmFsdWUsIFNIQTFfRGVmYXVsdEhhc2hWYWx1ZSwKLSAgICAgICAgc2l6ZW9mKFNIQTFfRGVmYXVsdEhhc2hWYWx1ZSkpOwotICAgIE5kaXNaZXJvTWVtb3J5KHBTSEFfQ1RYLT5CbG9jaywgU0hBMV9CTE9DS19TSVpFKTsKLSAgICBwU0hBX0NUWC0+TWVzc2FnZUxlbiA9IDA7Ci0gICAgcFNIQV9DVFgtPkJsb2NrTGVuICAgPSAwOwotfSAvKiBFbmQgb2YgU0hBMV9Jbml0ICovCi0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBTSEExIGNvbXB1dGF0aW9uIGZvciBvbmUgYmxvY2sgKDUxMiBiaXRzKQotCi1Bcmd1bWVudHM6Ci0gICAgcFNIQV9DVFggICAgICAgIFBvaW50ZXIgdG8gU0hBMV9DVFhfU1RSVUMKLQotUmV0dXJuIFZhbHVlOgotICAgIE5vbmUKLQotTm90ZToKLSAgICBOb25lCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFNIQTFfSGFzaCAoCi0gICAgSU4gIFNIQTFfQ1RYX1NUUlVDICpwU0hBX0NUWCkKLXsKLSAgICBVSU5UMzIgV19pLHQsczsKLSAgICBVSU5UMzIgV1sxNl07Ci0gICAgVUlOVDMyIGEsYixjLGQsZSxULGZfdCA9IDA7Ci0KLSAgICAvKiBQcmVwYXJlIHRoZSBtZXNzYWdlIHNjaGVkdWxlLCB7V19pfSwgMCA8IHQgPCAxNSAqLwotICAgIE5kaXNNb3ZlTWVtb3J5KFcsIHBTSEFfQ1RYLT5CbG9jaywgU0hBMV9CTE9DS19TSVpFKTsKLSAgICBmb3IgKFdfaSA9IDA7IFdfaSA8IDE2OyBXX2krKykKLSAgICAgICAgV1tXX2ldID0gY3B1MmJlMzIoV1tXX2ldKTsgLyogRW5kaWFuIFN3YXAgKi8KLSAgICAgICAgLyogRW5kIG9mIGZvciAqLwotCi0gICAgLyogU0hBMjU2IGhhc2ggY29tcHV0YXRpb24gKi8KLSAgICAvKiBJbml0aWFsaXplIHRoZSB3b3JraW5nIHZhcmlhYmxlcyAqLwotICAgIGEgPSBwU0hBX0NUWC0+SGFzaFZhbHVlWzBdOwotICAgIGIgPSBwU0hBX0NUWC0+SGFzaFZhbHVlWzFdOwotICAgIGMgPSBwU0hBX0NUWC0+SGFzaFZhbHVlWzJdOwotICAgIGQgPSBwU0hBX0NUWC0+SGFzaFZhbHVlWzNdOwotICAgIGUgPSBwU0hBX0NUWC0+SGFzaFZhbHVlWzRdOwotCi0gICAgLyogODAgcm91bmRzICovCi0gICAgZm9yICh0ID0gMDt0IDwgODA7dCsrKSB7Ci0gICAgICAgIHMgPSB0ICYgU0hBMV9NQVNLOwotICAgICAgICBpZiAodCA+IDE1KSB7IC8qIFByZXBhcmUgdGhlIG1lc3NhZ2Ugc2NoZWR1bGUsIHtXX2l9LCAxNiA8IHQgPCA3OSAqLwotICAgICAgICAgICAgV1tzXSA9IChXWyhzKzEzKSAmIFNIQTFfTUFTS10pIF4gKFdbKHMrOCkgJiBTSEExX01BU0tdKSBeIChXWyhzKzIpICYgU0hBMV9NQVNLXSkgXiBXW3NdOwotICAgICAgICAgICAgV1tzXSA9IFJPVEwzMihXW3NdLDEpOwotICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgICAgICBzd2l0Y2ggKHQgLyAyMCkgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICBmX3QgPSBDaChiLGMsZCk7Ci0gICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICBmX3QgPSBQYXJpdHkoYixjLGQpOwotICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgZl90ID0gTWFqKGIsYyxkKTsKLSAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgIGZfdCA9IFBhcml0eShiLGMsZCk7Ci0gICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IC8qIEVuZCBvZiBzd2l0Y2ggKi8KLSAgICAgICAgVCA9IFJPVEwzMihhLDUpICsgZl90ICsgZSArIFNIQTFfS1t0IC8gMjBdICsgV1tzXTsKLSAgICAgICAgZSA9IGQ7Ci0gICAgICAgIGQgPSBjOwotICAgICAgICBjID0gUk9UTDMyKGIsMzApOwotICAgICAgICBiID0gYTsKLSAgICAgICAgYSA9IFQ7Ci0gICAgIH0gLyogRW5kIG9mIGZvciAqLwotCi0gICAgIC8qIENvbXB1dGUgdGhlIGledGggaW50ZXJtZWRpYXRlIGhhc2ggdmFsdWUgSF4oaSkgKi8KLSAgICAgcFNIQV9DVFgtPkhhc2hWYWx1ZVswXSArPSBhOwotICAgICBwU0hBX0NUWC0+SGFzaFZhbHVlWzFdICs9IGI7Ci0gICAgIHBTSEFfQ1RYLT5IYXNoVmFsdWVbMl0gKz0gYzsKLSAgICAgcFNIQV9DVFgtPkhhc2hWYWx1ZVszXSArPSBkOwotICAgICBwU0hBX0NUWC0+SGFzaFZhbHVlWzRdICs9IGU7Ci0KLSAgICBOZGlzWmVyb01lbW9yeShwU0hBX0NUWC0+QmxvY2ssIFNIQTFfQkxPQ0tfU0laRSk7Ci0gICAgcFNIQV9DVFgtPkJsb2NrTGVuID0gMDsKLX0gLyogRW5kIG9mIFNIQTFfSGFzaCAqLwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgVGhlIG1lc3NhZ2UgaXMgYXBwZW5kZWQgdG8gYmxvY2suIElmIGJsb2NrIHNpemUgPiA2NCBieXRlcywgdGhlIFNIQTFfSGFzaAotd2lsbCBiZSBjYWxsZWQuCi0KLUFyZ3VtZW50czoKLSAgICBwU0hBX0NUWCAgICAgICAgUG9pbnRlciB0byBTSEExX0NUWF9TVFJVQwotICAgIG1lc3NhZ2UgICAgICAgICBNZXNzYWdlIGNvbnRleHQKLSAgICBtZXNzYWdlTGVuICAgICAgVGhlIGxlbmd0aCBvZiBtZXNzYWdlIGluIGJ5dGVzCi0KLVJldHVybiBWYWx1ZToKLSAgICBOb25lCi0KLU5vdGU6Ci0gICAgTm9uZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBTSEExX0FwcGVuZCAoCi0gICAgSU4gIFNIQTFfQ1RYX1NUUlVDICpwU0hBX0NUWCwKLSAgICBJTiAgY29uc3QgVUlOVDggTWVzc2FnZVtdLAotICAgIElOICBVSU5UIE1lc3NhZ2VMZW4pCi17Ci0gICAgVUlOVCBhcHBlbmRMZW4gPSAwOwotICAgIFVJTlQgZGlmZkxlbiAgID0gMDsKLQotICAgIHdoaWxlIChhcHBlbmRMZW4gIT0gTWVzc2FnZUxlbikgewotICAgICAgICBkaWZmTGVuID0gTWVzc2FnZUxlbiAtIGFwcGVuZExlbjsKLSAgICAgICAgaWYgKChwU0hBX0NUWC0+QmxvY2tMZW4gKyBkaWZmTGVuKSA8ICBTSEExX0JMT0NLX1NJWkUpIHsKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBTSEFfQ1RYLT5CbG9jayArIHBTSEFfQ1RYLT5CbG9ja0xlbiwKLSAgICAgICAgICAgICAgICBNZXNzYWdlICsgYXBwZW5kTGVuLCBkaWZmTGVuKTsKLSAgICAgICAgICAgIHBTSEFfQ1RYLT5CbG9ja0xlbiArPSBkaWZmTGVuOwotICAgICAgICAgICAgYXBwZW5kTGVuICs9IGRpZmZMZW47Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwU0hBX0NUWC0+QmxvY2sgKyBwU0hBX0NUWC0+QmxvY2tMZW4sCi0gICAgICAgICAgICAgICAgTWVzc2FnZSArIGFwcGVuZExlbiwgU0hBMV9CTE9DS19TSVpFIC0gcFNIQV9DVFgtPkJsb2NrTGVuKTsKLSAgICAgICAgICAgIGFwcGVuZExlbiArPSAoU0hBMV9CTE9DS19TSVpFIC0gcFNIQV9DVFgtPkJsb2NrTGVuKTsKLSAgICAgICAgICAgIHBTSEFfQ1RYLT5CbG9ja0xlbiA9IFNIQTFfQkxPQ0tfU0laRTsKLSAgICAgICAgICAgIFNIQTFfSGFzaChwU0hBX0NUWCk7Ci0gICAgICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgfSAvKiBFbmQgb2Ygd2hpbGUgKi8KLSAgICBwU0hBX0NUWC0+TWVzc2FnZUxlbiArPSBNZXNzYWdlTGVuOwotfSAvKiBFbmQgb2YgU0hBMV9BcHBlbmQgKi8KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIDEuIEFwcGVuZCBiaXQgMSB0byBlbmQgb2YgdGhlIG1lc3NhZ2UKLSAgICAyLiBBcHBlbmQgdGhlIGxlbmd0aCBvZiBtZXNzYWdlIGluIHJpZ2h0bW9zdCA2NCBiaXRzCi0gICAgMy4gVHJhbnNmb3JtIHRoZSBIYXNoIFZhbHVlIHRvIGRpZ2VzdCBtZXNzYWdlCi0KLUFyZ3VtZW50czoKLSAgICBwU0hBX0NUWCAgICAgICAgUG9pbnRlciB0byBTSEExX0NUWF9TVFJVQwotCi1SZXR1cm4gVmFsdWU6Ci0gICAgZGlnZXN0TWVzc2FnZSAgIERpZ2VzdCBtZXNzYWdlCi0KLU5vdGU6Ci0gICAgTm9uZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBTSEExX0VuZCAoCi0gICAgSU4gIFNIQTFfQ1RYX1NUUlVDICpwU0hBX0NUWCwKLSAgICBPVVQgVUlOVDggRGlnZXN0TWVzc2FnZVtdKQotewotICAgIFVJTlQgaW5kZXg7Ci0gICAgVUlOVDY0IG1lc3NhZ2VfbGVuZ3RoX2JpdHM7Ci0KLSAgICAvKiBBcHBlbmQgYml0IDEgdG8gZW5kIG9mIHRoZSBtZXNzYWdlICovCi0gICAgTmRpc0ZpbGxNZW1vcnkocFNIQV9DVFgtPkJsb2NrICsgcFNIQV9DVFgtPkJsb2NrTGVuLCAxLCAweDgwKTsKLQotICAgIC8qIDU1ID0gNjQgLSA4IC0gMTogYXBwZW5kIDEgYml0KDEgYnl0ZSkgYW5kIG1lc3NhZ2UgbGVuZ3RoICg4IGJ5dGVzKSAqLwotICAgIGlmIChwU0hBX0NUWC0+QmxvY2tMZW4gPiA1NSkKLSAgICAgICAgU0hBMV9IYXNoKHBTSEFfQ1RYKTsKLSAgICAgICAgLyogRW5kIG9mIGlmICovCi0KLSAgICAvKiBBcHBlbmQgdGhlIGxlbmd0aCBvZiBtZXNzYWdlIGluIHJpZ2h0bW9zdCA2NCBiaXRzICovCi0gICAgbWVzc2FnZV9sZW5ndGhfYml0cyA9IHBTSEFfQ1RYLT5NZXNzYWdlTGVuKjg7Ci0gICAgbWVzc2FnZV9sZW5ndGhfYml0cyA9IGNwdTJiZTY0KG1lc3NhZ2VfbGVuZ3RoX2JpdHMpOwotICAgIE5kaXNNb3ZlTWVtb3J5KCZwU0hBX0NUWC0+QmxvY2tbNTZdLCAmbWVzc2FnZV9sZW5ndGhfYml0cywgOCk7Ci0gICAgU0hBMV9IYXNoKHBTSEFfQ1RYKTsKLQotICAgIC8qIFJldHVybiBtZXNzYWdlIGRpZ2VzdCwgdHJhbnNmb3JtIHRoZSBVSU5UMzIgaGFzaCB2YWx1ZSB0byBieXRlcyAqLwotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDU7aW5kZXgrKykKLSAgICAgICAgcFNIQV9DVFgtPkhhc2hWYWx1ZVtpbmRleF0gPSBjcHUyYmUzMihwU0hBX0NUWC0+SGFzaFZhbHVlW2luZGV4XSk7Ci0gICAgICAgIC8qIEVuZCBvZiBmb3IgKi8KLSAgICBOZGlzTW92ZU1lbW9yeShEaWdlc3RNZXNzYWdlLCBwU0hBX0NUWC0+SGFzaFZhbHVlLCBTSEExX0RJR0VTVF9TSVpFKTsKLX0gLyogRW5kIG9mIFNIQTFfRW5kICovCi0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBTSEExIGFsZ29yaXRobQotCi1Bcmd1bWVudHM6Ci0gICAgbWVzc2FnZSAgICAgICAgIE1lc3NhZ2UgY29udGV4dAotICAgIG1lc3NhZ2VMZW4gICAgICBUaGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gYnl0ZXMKLQotUmV0dXJuIFZhbHVlOgotICAgIGRpZ2VzdE1lc3NhZ2UgICBEaWdlc3QgbWVzc2FnZQotCi1Ob3RlOgotICAgIE5vbmUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRfU0hBMSAoCi0gICAgSU4gIGNvbnN0IFVJTlQ4IE1lc3NhZ2VbXSwKLSAgICBJTiAgVUlOVCBNZXNzYWdlTGVuLAotICAgIE9VVCBVSU5UOCBEaWdlc3RNZXNzYWdlW10pCi17Ci0KLSAgICBTSEExX0NUWF9TVFJVQyBzaGFfY3R4OwotCi0gICAgTmRpc1plcm9NZW1vcnkoJnNoYV9jdHgsIHNpemVvZihTSEExX0NUWF9TVFJVQykpOwotICAgIFNIQTFfSW5pdCgmc2hhX2N0eCk7Ci0gICAgU0hBMV9BcHBlbmQoJnNoYV9jdHgsIE1lc3NhZ2UsIE1lc3NhZ2VMZW4pOwotICAgIFNIQTFfRW5kKCZzaGFfY3R4LCBEaWdlc3RNZXNzYWdlKTsKLX0gLyogRW5kIG9mIFJUX1NIQTEgKi8KLSNlbmRpZiAvKiBTSEExX1NVUFBPUlQgKi8KLQotCi0jaWZkZWYgU0hBMjU2X1NVUFBPUlQKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgSW5pdGlhbCBTSEEyNTZfQ1RYX1NUUlVDCi0KLUFyZ3VtZW50czoKLSAgICBwU0hBX0NUWCAgICBQb2ludGVyIHRvIFNIQTI1Nl9DVFhfU1RSVUMKLQotUmV0dXJuIFZhbHVlOgotICAgIE5vbmUKLQotTm90ZToKLSAgICBOb25lCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFNIQTI1Nl9Jbml0ICgKLSAgICBJTiAgU0hBMjU2X0NUWF9TVFJVQyAqcFNIQV9DVFgpCi17Ci0gICAgTmRpc01vdmVNZW1vcnkocFNIQV9DVFgtPkhhc2hWYWx1ZSwgU0hBMjU2X0RlZmF1bHRIYXNoVmFsdWUsCi0gICAgICAgIHNpemVvZihTSEEyNTZfRGVmYXVsdEhhc2hWYWx1ZSkpOwotICAgIE5kaXNaZXJvTWVtb3J5KHBTSEFfQ1RYLT5CbG9jaywgU0hBMjU2X0JMT0NLX1NJWkUpOwotICAgIHBTSEFfQ1RYLT5NZXNzYWdlTGVuID0gMDsKLSAgICBwU0hBX0NUWC0+QmxvY2tMZW4gICA9IDA7Ci19IC8qIEVuZCBvZiBTSEEyNTZfSW5pdCAqLwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgU0hBMjU2IGNvbXB1dGF0aW9uIGZvciBvbmUgYmxvY2sgKDUxMiBiaXRzKQotCi1Bcmd1bWVudHM6Ci0gICAgcFNIQV9DVFggICAgUG9pbnRlciB0byBTSEEyNTZfQ1RYX1NUUlVDCi0KLVJldHVybiBWYWx1ZToKLSAgICBOb25lCi0KLU5vdGU6Ci0gICAgTm9uZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBTSEEyNTZfSGFzaCAoCi0gICAgSU4gIFNIQTI1Nl9DVFhfU1RSVUMgKnBTSEFfQ1RYKQotewotICAgIFVJTlQzMiBXX2ksdDsKLSAgICBVSU5UMzIgV1s2NF07Ci0gICAgVUlOVDMyIGEsYixjLGQsZSxmLGcsaCxUMSxUMjsKLQotICAgIC8qIFByZXBhcmUgdGhlIG1lc3NhZ2Ugc2NoZWR1bGUsIHtXX2l9LCAwIDwgdCA8IDE1ICovCi0gICAgTmRpc01vdmVNZW1vcnkoVywgcFNIQV9DVFgtPkJsb2NrLCBTSEEyNTZfQkxPQ0tfU0laRSk7Ci0gICAgZm9yIChXX2kgPSAwOyBXX2kgPCAxNjsgV19pKyspCi0gICAgICAgIFdbV19pXSA9IGNwdTJiZTMyKFdbV19pXSk7IC8qIEVuZGlhbiBTd2FwICovCi0gICAgICAgIC8qIEVuZCBvZiBmb3IgKi8KLQotICAgIC8qIFNIQTI1NiBoYXNoIGNvbXB1dGF0aW9uICovCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgd29ya2luZyB2YXJpYWJsZXMgKi8KLSAgICBhID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVswXTsKLSAgICBiID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVsxXTsKLSAgICBjID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVsyXTsKLSAgICBkID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVszXTsKLSAgICBlID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVs0XTsKLSAgICBmID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVs1XTsKLSAgICBnID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVs2XTsKLSAgICBoID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVs3XTsKLQotICAgIC8qIDY0IHJvdW5kcyAqLwotICAgIGZvciAodCA9IDA7dCA8IDY0O3QrKykgewotICAgICAgICBpZiAodCA+IDE1KSAvKiBQcmVwYXJlIHRoZSBtZXNzYWdlIHNjaGVkdWxlLCB7V19pfSwgMTYgPCB0IDwgNjMgKi8KLSAgICAgICAgICAgIFdbdF0gPSBTaWdtYV8yNTZfMShXW3QtMl0pICsgV1t0LTddICsgU2lnbWFfMjU2XzAoV1t0LTE1XSkgKyBXW3QtMTZdOwotICAgICAgICAgICAgLyogRW5kIG9mIGlmICovCi0gICAgICAgIFQxID0gaCArIFpzaWdtYV8yNTZfMShlKSArIENoKGUsZixnKSArIFNIQTI1Nl9LW3RdICsgV1t0XTsKLSAgICAgICAgVDIgPSBac2lnbWFfMjU2XzAoYSkgKyBNYWooYSxiLGMpOwotICAgICAgICBoID0gZzsKLSAgICAgICAgZyA9IGY7Ci0gICAgICAgIGYgPSBlOwotICAgICAgICBlID0gZCArIFQxOwotICAgICAgICBkID0gYzsKLSAgICAgICAgYyA9IGI7Ci0gICAgICAgIGIgPSBhOwotICAgICAgICBhID0gVDEgKyBUMjsKLSAgICAgfSAvKiBFbmQgb2YgZm9yICovCi0KLSAgICAgLyogQ29tcHV0ZSB0aGUgaV50aCBpbnRlcm1lZGlhdGUgaGFzaCB2YWx1ZSBIXihpKSAqLwotICAgICBwU0hBX0NUWC0+SGFzaFZhbHVlWzBdICs9IGE7Ci0gICAgIHBTSEFfQ1RYLT5IYXNoVmFsdWVbMV0gKz0gYjsKLSAgICAgcFNIQV9DVFgtPkhhc2hWYWx1ZVsyXSArPSBjOwotICAgICBwU0hBX0NUWC0+SGFzaFZhbHVlWzNdICs9IGQ7Ci0gICAgIHBTSEFfQ1RYLT5IYXNoVmFsdWVbNF0gKz0gZTsKLSAgICAgcFNIQV9DVFgtPkhhc2hWYWx1ZVs1XSArPSBmOwotICAgICBwU0hBX0NUWC0+SGFzaFZhbHVlWzZdICs9IGc7Ci0gICAgIHBTSEFfQ1RYLT5IYXNoVmFsdWVbN10gKz0gaDsKLQotICAgIE5kaXNaZXJvTWVtb3J5KHBTSEFfQ1RYLT5CbG9jaywgU0hBMjU2X0JMT0NLX1NJWkUpOwotICAgIHBTSEFfQ1RYLT5CbG9ja0xlbiA9IDA7Ci19IC8qIEVuZCBvZiBTSEEyNTZfSGFzaCAqLwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgVGhlIG1lc3NhZ2UgaXMgYXBwZW5kZWQgdG8gYmxvY2suIElmIGJsb2NrIHNpemUgPiA2NCBieXRlcywgdGhlIFNIQTI1Nl9IYXNoCi13aWxsIGJlIGNhbGxlZC4KLQotQXJndW1lbnRzOgotICAgIHBTSEFfQ1RYICAgIFBvaW50ZXIgdG8gU0hBMjU2X0NUWF9TVFJVQwotICAgIG1lc3NhZ2UgICAgIE1lc3NhZ2UgY29udGV4dAotICAgIG1lc3NhZ2VMZW4gIFRoZSBsZW5ndGggb2YgbWVzc2FnZSBpbiBieXRlcwotCi1SZXR1cm4gVmFsdWU6Ci0gICAgTm9uZQotCi1Ob3RlOgotICAgIE5vbmUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgU0hBMjU2X0FwcGVuZCAoCi0gICAgSU4gIFNIQTI1Nl9DVFhfU1RSVUMgKnBTSEFfQ1RYLAotICAgIElOICBjb25zdCBVSU5UOCBNZXNzYWdlW10sCi0gICAgSU4gIFVJTlQgTWVzc2FnZUxlbikKLXsKLSAgICBVSU5UIGFwcGVuZExlbiA9IDA7Ci0gICAgVUlOVCBkaWZmTGVuICAgPSAwOwotCi0gICAgd2hpbGUgKGFwcGVuZExlbiAhPSBNZXNzYWdlTGVuKSB7Ci0gICAgICAgIGRpZmZMZW4gPSBNZXNzYWdlTGVuIC0gYXBwZW5kTGVuOwotICAgICAgICBpZiAoKHBTSEFfQ1RYLT5CbG9ja0xlbiArIGRpZmZMZW4pIDwgIFNIQTI1Nl9CTE9DS19TSVpFKSB7Ci0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwU0hBX0NUWC0+QmxvY2sgKyBwU0hBX0NUWC0+QmxvY2tMZW4sCi0gICAgICAgICAgICAgICAgTWVzc2FnZSArIGFwcGVuZExlbiwgZGlmZkxlbik7Ci0gICAgICAgICAgICBwU0hBX0NUWC0+QmxvY2tMZW4gKz0gZGlmZkxlbjsKLSAgICAgICAgICAgIGFwcGVuZExlbiArPSBkaWZmTGVuOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFNIQV9DVFgtPkJsb2NrICsgcFNIQV9DVFgtPkJsb2NrTGVuLAotICAgICAgICAgICAgICAgIE1lc3NhZ2UgKyBhcHBlbmRMZW4sIFNIQTI1Nl9CTE9DS19TSVpFIC0gcFNIQV9DVFgtPkJsb2NrTGVuKTsKLSAgICAgICAgICAgIGFwcGVuZExlbiArPSAoU0hBMjU2X0JMT0NLX1NJWkUgLSBwU0hBX0NUWC0+QmxvY2tMZW4pOwotICAgICAgICAgICAgcFNIQV9DVFgtPkJsb2NrTGVuID0gU0hBMjU2X0JMT0NLX1NJWkU7Ci0gICAgICAgICAgICBTSEEyNTZfSGFzaChwU0hBX0NUWCk7Ci0gICAgICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgfSAvKiBFbmQgb2Ygd2hpbGUgKi8KLSAgICBwU0hBX0NUWC0+TWVzc2FnZUxlbiArPSBNZXNzYWdlTGVuOwotfSAvKiBFbmQgb2YgU0hBMjU2X0FwcGVuZCAqLwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgMS4gQXBwZW5kIGJpdCAxIHRvIGVuZCBvZiB0aGUgbWVzc2FnZQotICAgIDIuIEFwcGVuZCB0aGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gcmlnaHRtb3N0IDY0IGJpdHMKLSAgICAzLiBUcmFuc2Zvcm0gdGhlIEhhc2ggVmFsdWUgdG8gZGlnZXN0IG1lc3NhZ2UKLQotQXJndW1lbnRzOgotICAgIHBTSEFfQ1RYICAgICAgICBQb2ludGVyIHRvIFNIQTI1Nl9DVFhfU1RSVUMKLQotUmV0dXJuIFZhbHVlOgotICAgIGRpZ2VzdE1lc3NhZ2UgICBEaWdlc3QgbWVzc2FnZQotCi1Ob3RlOgotICAgIE5vbmUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgU0hBMjU2X0VuZCAoCi0gICAgSU4gIFNIQTI1Nl9DVFhfU1RSVUMgKnBTSEFfQ1RYLAotICAgIE9VVCBVSU5UOCBEaWdlc3RNZXNzYWdlW10pCi17Ci0gICAgVUlOVCBpbmRleDsKLSAgICBVSU5UNjQgbWVzc2FnZV9sZW5ndGhfYml0czsKLQotICAgIC8qIEFwcGVuZCBiaXQgMSB0byBlbmQgb2YgdGhlIG1lc3NhZ2UgKi8KLSAgICBOZGlzRmlsbE1lbW9yeShwU0hBX0NUWC0+QmxvY2sgKyBwU0hBX0NUWC0+QmxvY2tMZW4sIDEsIDB4ODApOwotCi0gICAgLyogNTUgPSA2NCAtIDggLSAxOiBhcHBlbmQgMSBiaXQoMSBieXRlKSBhbmQgbWVzc2FnZSBsZW5ndGggKDggYnl0ZXMpICovCi0gICAgaWYgKHBTSEFfQ1RYLT5CbG9ja0xlbiA+IDU1KQotICAgICAgICBTSEEyNTZfSGFzaChwU0hBX0NUWCk7Ci0gICAgICAgIC8qIEVuZCBvZiBpZiAqLwotCi0gICAgLyogQXBwZW5kIHRoZSBsZW5ndGggb2YgbWVzc2FnZSBpbiByaWdodG1vc3QgNjQgYml0cyAqLwotICAgIG1lc3NhZ2VfbGVuZ3RoX2JpdHMgPSBwU0hBX0NUWC0+TWVzc2FnZUxlbio4OwotICAgIG1lc3NhZ2VfbGVuZ3RoX2JpdHMgPSBjcHUyYmU2NChtZXNzYWdlX2xlbmd0aF9iaXRzKTsKLSAgICBOZGlzTW92ZU1lbW9yeSgmcFNIQV9DVFgtPkJsb2NrWzU2XSwgJm1lc3NhZ2VfbGVuZ3RoX2JpdHMsIDgpOwotICAgIFNIQTI1Nl9IYXNoKHBTSEFfQ1RYKTsKLQotICAgIC8qIFJldHVybiBtZXNzYWdlIGRpZ2VzdCwgdHJhbnNmb3JtIHRoZSBVSU5UMzIgaGFzaCB2YWx1ZSB0byBieXRlcyAqLwotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDg7aW5kZXgrKykKLSAgICAgICAgcFNIQV9DVFgtPkhhc2hWYWx1ZVtpbmRleF0gPSBjcHUyYmUzMihwU0hBX0NUWC0+SGFzaFZhbHVlW2luZGV4XSk7Ci0gICAgICAgIC8qIEVuZCBvZiBmb3IgKi8KLSAgICBOZGlzTW92ZU1lbW9yeShEaWdlc3RNZXNzYWdlLCBwU0hBX0NUWC0+SGFzaFZhbHVlLCBTSEEyNTZfRElHRVNUX1NJWkUpOwotfSAvKiBFbmQgb2YgU0hBMjU2X0VuZCAqLwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgU0hBMjU2IGFsZ29yaXRobQotCi1Bcmd1bWVudHM6Ci0gICAgbWVzc2FnZSAgICAgICAgIE1lc3NhZ2UgY29udGV4dAotICAgIG1lc3NhZ2VMZW4gICAgICBUaGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gYnl0ZXMKLQotUmV0dXJuIFZhbHVlOgotICAgIGRpZ2VzdE1lc3NhZ2UgICBEaWdlc3QgbWVzc2FnZQotCi1Ob3RlOgotICAgIE5vbmUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRfU0hBMjU2ICgKLSAgICBJTiAgY29uc3QgVUlOVDggTWVzc2FnZVtdLAotICAgIElOICBVSU5UIE1lc3NhZ2VMZW4sCi0gICAgT1VUIFVJTlQ4IERpZ2VzdE1lc3NhZ2VbXSkKLXsKLSAgICBTSEEyNTZfQ1RYX1NUUlVDIHNoYV9jdHg7Ci0KLSAgICBOZGlzWmVyb01lbW9yeSgmc2hhX2N0eCwgc2l6ZW9mKFNIQTI1Nl9DVFhfU1RSVUMpKTsKLSAgICBTSEEyNTZfSW5pdCgmc2hhX2N0eCk7Ci0gICAgU0hBMjU2X0FwcGVuZCgmc2hhX2N0eCwgTWVzc2FnZSwgTWVzc2FnZUxlbik7Ci0gICAgU0hBMjU2X0VuZCgmc2hhX2N0eCwgRGlnZXN0TWVzc2FnZSk7Ci19IC8qIEVuZCBvZiBSVF9TSEEyNTYgKi8KLSNlbmRpZiAvKiBTSEEyNTZfU1VQUE9SVCAqLwotCi0vKiBFbmQgb2YgY3J5cHRfc2hhMi5jICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9kZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2Rmcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTU3MDRhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2Rmcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDgxICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgYXBfZGZzLmMKLQotICAgIEFic3RyYWN0OgotICAgIFN1cHBvcnQgREZTIGZ1bmN0aW9uLgotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi10eXBlZGVmIHN0cnVjdCBfUkFEQVJfRFVSQVRJT05fVEFCTEUKLXsKLQlVTE9ORyBSRER1clJlZ2lvbjsKLQlVTE9ORyBSYWRhclNpZ25hbER1cmF0aW9uOwotCVVMT05HIFRvbGVyYW5jZTsKLX0gUkFEQVJfRFVSQVRJT05fVEFCTEUsICpQUkFEQVJfRFVSQVRJT05fVEFCTEU7Ci0KLQotCi1VQ0hBUiBSZElkbGVUaW1lVGFibGVbTUFYX1JEX1JFR0lPTl1bNF0gPQotewotCXs5LCAyNTAsIDI1MCwgMjUwfSwJCS8vIENFCi0jaWZkZWYgREZTX0ZDQ19CVzQwX0ZJWAotCXsxLCAyNTAsIDI1MCwgMjUwfSwJCS8vIEZDQwotI2Vsc2UKLQl7NCwgMjUwLCAyNTAsIDI1MH0sCQkvLyBGQ0MKLSNlbmRpZgotCXs0LCAyNTAsIDI1MCwgMjUwfSwJCS8vIEpBUAotCXsxNSwgMjUwLCAyNTAsIDI1MH0sCS8vIEpBUF9XNTMKLQl7NCwgMjUwLCAyNTAsIDI1MH0JCS8vIEpBUF9XNTYKLX07Ci0KLSNpZmRlZiBUT05FX1JBREFSX0RFVEVDVF9TVVBQT1JUCi1zdGF0aWMgdm9pZCBUb25lUmFkYXJQcm9ncmFtKFBSVE1QX0FEQVBURVIgcEFkKTsKLXN0YXRpYyB2b2lkIFRvbmVSYWRhckVuYWJsZShQUlRNUF9BREFQVEVSIHBBZCk7Ci0jZW5kaWYgLy8gVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVCAvLwotCi0jaWZkZWYgREZTX1NVUFBPUlQKLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlCYnAgUmFkYXIgZGV0ZWN0aW9uIHJvdXRpbmUKLQotCUFyZ3VtZW50czoKLQkJcEFkCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQmJwUmFkYXJEZXRlY3Rpb25TdGFydCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlVSU5UOCBSYWRhclBlcmlvZDsKLQotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMTQsIDB4MDIpOwotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjEsIDB4MjApOwotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjIsIDB4MDApOwotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjMsIDB4MDgvKjB4ODAqLyk7Ci0JUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIDEyNCwgMHgyOCk7Ci0JUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIDEyNSwgMHhmZik7Ci0KLSNpZmRlZiBNRVJHRV9BUkNIX1RFQU0KLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID09IEpBUCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID09IEpBUF9XNTMpIHx8IChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9PSBKQVBfVzU2KSkKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gSkFQOwotCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IEphcFJhZGFyVHlwZShwQWQpOwotCQlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gPT0gSkFQX1c1NikKLQkJewotCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKLQkJfQotCQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9PSBKQVBfVzUzKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDE1OwotCQl9Ci0jaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAotCQlwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IDE7Ci0jZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLwotCX0KLSNlbmRpZiAvLyBNRVJHRV9BUkNIX1RFQU0gLy8KLQotCVJhZGFyUGVyaW9kID0gKChVSU5UKVJkSWRsZVRpbWVUYWJsZVtwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbl1bMF0gKyAoVUlOVClwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSkgPCAyNTAgPwotCQkJKFJkSWRsZVRpbWVUYWJsZVtwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbl1bMF0gKyBwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSkgOiAyNTA7Ci0KLSNpZmRlZiBNRVJHRV9BUkNIX1RFQU0KLQotCi0jZWxzZSAvLyBPcmlnaW5hbCBSVDI4eHggc291cmNlIGNvZGUuCi0JUlRNUF9JT19XUklURTgocEFkLCAweDcwMjAsIDB4MWQpOwotCVJUTVBfSU9fV1JJVEU4KHBBZCwgMHg3MDIxLCAweDQwKTsKLSNlbmRpZiAvLyBNRVJHRV9BUkNIX1RFQU0gLy8KLQotCVJhZGFyRGV0ZWN0aW9uU3RhcnQocEFkLCAwLCBSYWRhclBlcmlvZCk7Ci0JcmV0dXJuOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQmJwIFJhZGFyIGRldGVjdGlvbiByb3V0aW5lCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEJicFJhZGFyRGV0ZWN0aW9uU3RvcCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlSVE1QX0lPX1dSSVRFOChwQWQsIDB4NzAyMCwgMHgxZCk7Ci0JUlRNUF9JT19XUklURTgocEFkLCAweDcwMjEsIDB4NjApOwotCi0JUmFkYXJEZXRlY3Rpb25TdG9wKHBBZCk7Ci0JcmV0dXJuOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUmFkYXIgZGV0ZWN0aW9uIHJvdXRpbmUKLQotCUFyZ3VtZW50czoKLQkJcEFkCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUmFkYXJEZXRlY3Rpb25TdGFydCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBCT09MRUFOIENUU1Byb3RlY3QsCi0JSU4gVUlOVDggQ1RTUGVyaW9kKQotewotCVVJTlQ4IERmc0FjdGl2ZVRpbWUgPSAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgJiAweDFmKTsKLQlVSU5UOCBDdHNQcm90ZWN0ID0gKENUU1Byb3RlY3QgPT0gMSkgPyAweDAyIDogMHgwMTsgLy8gQ1RTIHByb3RlY3QuCi0KLQlpZiAoQ1RTUHJvdGVjdCAhPSAwKQotCXsKLQkJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uKQotCQl7Ci0JCWNhc2UgRkNDOgotCQljYXNlIEpBUF9XNTY6Ci0JCQlDdHNQcm90ZWN0ID0gMHgwMzsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSkFQOgotCQkJewotCQkJCVVDSEFSIFJERHVyUmVnaW9uOwotCQkJCVJERHVyUmVnaW9uID0gSmFwUmFkYXJUeXBlKHBBZCk7Ci0JCQkJaWYgKFJERHVyUmVnaW9uID09IEpBUF9XNTYpCi0JCQkJCUN0c1Byb3RlY3QgPSAweDAzOwotCQkJCWVsc2UKLQkJCQkJQ3RzUHJvdGVjdCA9IDB4MDI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJY2FzZSBDRToKLQkJY2FzZSBKQVBfVzUzOgotCQlkZWZhdWx0OgotCQkJQ3RzUHJvdGVjdCA9IDB4MDI7Ci0JCQlicmVhazsKLQkJfQotCX0KLQllbHNlCi0JCUN0c1Byb3RlY3QgPSAweDAxOwotCi0KLQkvLyBzZW5kIHN0YXJ0LVJEIHdpdGggQ1RTIHByb3RlY3Rpb24gY29tbWFuZCB0byBNQ1UKLQkvLyBoaWdoYnl0ZSBbN10JCXJlc2VydmUKLQkvLyBoaWdoYnl0ZSBbNjo1XQkweDogc3RvcCBDYXJyaWVyL1JhZGFyIGRldGVjdGlvbgotCS8vIGhpZ2hieXRlIFsxMF06CVN0YXJ0IENhcnJpZXIvUmFkYXIgZGV0ZWN0aW9uIHdpdGhvdXQgQ1RTIHByb3RlY3Rpb24sIDExOiBTdGFydCBDYXJyaWVyL1JhZGFyIGRldGVjdGlvbiB3aXRoIENUUyBwcm90ZWN0aW9uCi0JLy8gaGlnaGJ5dGUgWzQ6MF0JUmFkYXIvY2FycmllciBkZXRlY3Rpb24gZHVyYXRpb24uIEluIDFtcy4KLQotCS8vIGxvd2J5dGUgWzc6MF0JUmFkYXIvY2FycmllciBkZXRlY3Rpb24gcGVyaW9kLCBpbiAxbXMuCi0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDYwLCAweGZmLCBDVFNQZXJpb2QsIERmc0FjdGl2ZVRpbWUgfCAoQ3RzUHJvdGVjdCA8PCA1KSk7Ci0JLy9Bc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NjMsIDB4ZmYsIDEwLCAwKTsKLQotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVJhZGFyIGRldGVjdGlvbiByb3V0aW5lCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCVRSVUUJRm91bmQgcmFkYXIgc2lnbmFsCi0JCUZBTFNFCU5vdCBmb3VuZCByYWRhciBzaWduYWwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUmFkYXJEZXRlY3Rpb25TdG9wKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUmFkYXJEZXRlY3Rpb25TdG9wLlxuIikpOwotCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg2MCwgMHhmZiwgMHgwMCwgMHgwMCk7CS8vIHNlbmQgc3RhcnQtUkQgd2l0aCBDVFMgcHJvdGVjdGlvbiBjb21tYW5kIHRvIE1DVQotCi0JcmV0dXJuOwotfQotI2VuZGlmIC8vIERGU19TVVBQT1JUIC8vCi0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVJhZGFyIGNoYW5uZWwgY2hlY2sgcm91dGluZQotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlUUlVFCW5lZWQgdG8gZG8gcmFkYXIgZGV0ZWN0Ci0JCUZBTFNFCW5lZWQgbm90IHRvIGRvIHJhZGFyIGRldGVjdAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTiBSYWRhckNoYW5uZWxDaGVjaygKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVQ0hBUgkJCUNoKQotewotCUlOVAkJaTsKLQlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOwotCi0JZm9yIChpPTA7IGk8cEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQotCXsKLQkJaWYgKENoID09IHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCkKLQkJewotCQkJcmVzdWx0ID0gcEFkLT5DaGFubmVsTGlzdFtpXS5EZnNSZXE7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLSNpZmRlZiBERlNfU1VQUE9SVAotCi1VTE9ORyBKYXBSYWRhclR5cGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JVUxPTkcJCWk7Ci0JY29uc3QgVUNIQVIJQ2hhbm5lbFsxNV09ezUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH07Ci0KLQlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gIT0gSkFQKQotCXsKLQkJcmV0dXJuIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uOwotCX0KLQotCWZvciAoaT0wOyBpPDE1OyBpKyspCi0JewotCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9PSBDaGFubmVsW2ldKQotCQl7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChpIDwgNCkKLQkJcmV0dXJuIEpBUF9XNTM7Ci0JZWxzZSBpZiAoaSA8IDE1KQotCQlyZXR1cm4gSkFQX1c1NjsKLQllbHNlCi0JCXJldHVybiBKQVA7IC8vIFc1MgotCi19Ci0KLVVMT05HIFJUTVBCYnBSZWFkUmFkYXJEdXJhdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVSU5UOCBieXRlVmFsdWUgPSAwOwotCVVMT05HIHJlc3VsdDsKLQotCUJCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjExNSwgJmJ5dGVWYWx1ZSk7Ci0KLQlyZXN1bHQgPSAwOwotCXN3aXRjaCAoYnl0ZVZhbHVlKQotCXsKLQljYXNlIDE6IC8vIHJhZGFyIHNpZ25hbCBkZXRlY3RlZCBieSBwdWxzZSBtb2RlLgotCWNhc2UgMjogLy8gcmFkYXIgc2lnbmFsIGRldGVjdGVkIGJ5IHdpZHRoIG1vZGUuCi0JCXJlc3VsdCA9IFJUTVBSZWFkUmFkYXJEdXJhdGlvbihwQWQpOwotCQlicmVhazsKLQotCWNhc2UgMDogLy8gTm8gcmFkYXIgc2lnbmFsLgotCWRlZmF1bHQ6Ci0KLQkJcmVzdWx0ID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotVUxPTkcgUlRNUFJlYWRSYWRhckR1cmF0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotCVVMT05HIHJlc3VsdCA9IDA7Ci0KLSNpZmRlZiBERlNfU1VQUE9SVAotCVVJTlQ4IGR1cmF0aW9uMSA9IDAsIGR1cmF0aW9uMiA9IDAsIGR1cmF0aW9uMyA9IDA7Ci0KLQotCUJCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjExNiwgJmR1cmF0aW9uMSk7Ci0JQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMTE3LCAmZHVyYXRpb24yKTsKLQlCQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxMTgsICZkdXJhdGlvbjMpOwotCXJlc3VsdCA9IChkdXJhdGlvbjEgPDwgMTYpICsgKGR1cmF0aW9uMiA8PCA4KSArIGR1cmF0aW9uMzsKLSNlbmRpZiAvLyBERlNfU1VQUE9SVCAvLwotCi0JcmV0dXJuIHJlc3VsdDsKLQotfQotCi1WT0lEIFJUTVBDbGVhblJhZGFyRHVyYXRpb24oCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JcmV0dXJuOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIFJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgICAgIFJhZGFyIHdhdmUgZGV0ZWN0aW9uLiBUaGUgQVBJIHNob3VsZCBiZSBpbnZva2UgZWFjaCBzZWNvbmQuCi0KLSAgICBBcmd1bWVudHM6Ci0gICAgICAgIHBBZCAgICAgICAgIC0gQWRhcHRlciBwb2ludGVyCi0KLSAgICBSZXR1cm4gVmFsdWU6Ci0gICAgICAgIE5vbmUKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQXBSYWRhckRldGVjdFBlcmlvZGljKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCUlOVAlpOwotCi0JcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuSW5TZXJ2aWNlTW9uaXRvckNvdW50Kys7Ci0KLQlmb3IgKGk9MDsgaTxwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspCi0JewotCi0JCWlmIChwQWQtPkNoYW5uZWxMaXN0W2ldLlJlbWFpbmluZ1RpbWVGb3JVc2UgPiAwKQotCQl7Ci0JCQlwQWQtPkNoYW5uZWxMaXN0W2ldLlJlbWFpbmluZ1RpbWVGb3JVc2UgLS07Ci0JCQlpZiAoKHBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kJTUpID09IDApCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFkYXJEZXRlY3RQZXJpb2RpYyAtIGNoPSVkLCBSZW1haW5pbmdUaW1lRm9yVXNlPSVkXG4iLCBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLy9yYWRhciBkZXRlY3QKLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKLQkJJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpCi0JCSYmIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpCi0JewotCQlSYWRhckRldGVjdFBlcmlvZGljKHBBZCk7Ci0JfQotCi0JcmV0dXJuOwotfQotCi0vLyBQZXJpb2RpYyBSYWRhciBkZXRlY3Rpb24sIHN3aXRjaCBjaGFubmVsIHdpbGwgb2NjdXIgaW4gUlRNUEhhbmRsZVRCVFRJbnRlcnJ1cHQoKQotLy8gQmVmb3JlIHN3aXRjaCBjaGFubmVsLCBkcml2ZXIgbmVlZHMgZG9pbmcgY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50LgotVk9JRCBSYWRhckRldGVjdFBlcmlvZGljKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotCi0JLy8gbmVlZCB0byBjaGVjayBjaGFubmVsIGF2YWlsYWJpbGl0eSwgYWZ0ZXIgc3dpdGNoIGNoYW5uZWwKLQlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlICE9IFJEX1NJTEVOQ0VfTU9ERSkKLQkJCXJldHVybjsKLQotCi0KLQkvLyBjaGFubmVsIGF2YWlsYWJpbGl0eSBjaGVjayB0aW1lIGlzIDYwc2VjLCB1c2UgNjUgZm9yIGFzc3VyYW5jZQotCWlmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRENvdW50KysgPiBwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DaE1vdmluZ1RpbWUpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOb3QgZm91bmQgcmFkYXIgc2lnbmFsLCBzdGFydCBzZW5kIGJlYWNvbiBhbmQgcmFkYXIgZGV0ZWN0aW9uIGluIHNlcnZpY2UgbW9uaXRvclxuXG4iKSk7Ci0JCUJicFJhZGFyRGV0ZWN0aW9uU3RvcChwQWQpOwotCi0KLQkJQXNpY0VuYWJsZUJzc1N5bmMocEFkKTsKLQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0gUkRfTk9STUFMX01PREU7Ci0KLQotCi0JCXJldHVybjsKLQl9Ci0KLQlyZXR1cm47Ci19Ci0jZW5kaWYgLy8gREZTX1NVUFBPUlQgLy8KLQotI2lmZGVmIERGU19TVVBQT1JUCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0JCWNoYW5nZSBjaGFubmVsIG1vdmluZyB0aW1lIGZvciBERlMgdGVzdGluZy4KLQotCUFyZ3VtZW50czoKLQkgICAgcEFkYXB0ZXIgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkgICAgd3JxICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50Ci0KLSAgICBSZXR1cm4gVmFsdWU6Ci0gICAgICAgIE5vbmUKLQotICAgIE5vdGU6Ci0gICAgICAgIFVzYWdlOgotICAgICAgICAgICAgICAgMS4pIGl3cHJpdiByYTAgc2V0IENoTW92VGltZT1bdmFsdWVdCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X0NoTW92aW5nVGltZV9Qcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBTVFJJTkcgYXJnKQotewotCVVJTlQ4IFZhbHVlOwotCi0JVmFsdWUgPSAoVUlOVDgpIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DaE1vdmluZ1RpbWUgPSBWYWx1ZTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjogJWRcbiIsIF9fRlVOQ1RJT05fXywKLQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ2hNb3ZpbmdUaW1lKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UIFNldF9Mb25nUHVsc2VSYWRhclRoX1Byb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFNUUklORyBhcmcpCi17Ci0JVUlOVDggVmFsdWU7Ci0KLQlWYWx1ZSA9IChVSU5UOCkgc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA+IDEwID8gMTAgOiBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuTG9uZ1B1bHNlUmFkYXJUaCA9IFZhbHVlOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OiAlZFxuIiwgX19GVU5DVElPTl9fLAotCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5Mb25nUHVsc2VSYWRhclRoKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLSNlbmRpZiAvLyBERlNfU1VQUE9SVCAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vZWVfZWZ1c2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2VlX2VmdXNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MWUzMDUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vZWVfZWZ1c2UuYworKysgL2Rldi9udWxsCkBAIC0xLDE1NDggKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQllZV9lZnVzZS5jCi0KLQlBYnN0cmFjdDoKLQlNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0JLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotI2RlZmluZSBFRlVTRV9VU0FHRV9NQVBfU1RBUlQJMHgyZDAKLSNkZWZpbmUgRUZVU0VfVVNBR0VfTUFQX0VORAkJMHgyZmMKLSNkZWZpbmUgRUZVU0VfVVNBR0VfTUFQX1NJWkUJNDUKLQotCi0KLSNkZWZpbmUgRUZVU0VfRUVQUk9NX0RFRlVMVF9GSUxFCSJSVDMweHhFRVBST00uYmluIgotI2RlZmluZSBNQVhfRUVQUk9NX0JJTl9GSUxFX1NJWkUJMTAyNAotCi0KLQotI2RlZmluZSBFRlVTRV9UQUcJCQkJMHgyZmUKLQotCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfRUZVU0VfQ1RSTF9TVFJVQyB7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyICAgICAgICAgICAgU0VMX0VGVVNFOjE7Ci0JCVVJTlQzMiAgICAgICAgICAgIEVGU1JPTV9LSUNLOjE7Ci0JCVVJTlQzMiAgICAgICAgICAgIFJFU0VSVkVEOjQ7Ci0JCVVJTlQzMiAgICAgICAgICAgIEVGU1JPTV9BSU46MTA7Ci0JCVVJTlQzMiAgICAgICAgICAgIEVGU1JPTV9MRE9fT05fVElNRToyOwotCQlVSU5UMzIgICAgICAgICAgICBFRlNST01fTERPX09GRl9USU1FOjY7Ci0JCVVJTlQzMiAgICAgICAgICAgIEVGU1JPTV9NT0RFOjI7Ci0JCVVJTlQzMiAgICAgICAgICAgIEVGU1JPTV9BT1VUOjY7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlFRlVTRV9DVFJMX1NUUlVDLCAqUEVGVVNFX0NUUkxfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfRUZVU0VfQ1RSTF9TVFJVQyB7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyICAgICAgICAgICAgRUZTUk9NX0FPVVQ6NjsKLQkJVUlOVDMyICAgICAgICAgICAgRUZTUk9NX01PREU6MjsKLQkJVUlOVDMyICAgICAgICAgICAgRUZTUk9NX0xET19PRkZfVElNRTo2OwotCQlVSU5UMzIgICAgICAgICAgICBFRlNST01fTERPX09OX1RJTUU6MjsKLQkJVUlOVDMyICAgICAgICAgICAgRUZTUk9NX0FJTjoxMDsKLQkJVUlOVDMyICAgICAgICAgICAgUkVTRVJWRUQ6NDsKLQkJVUlOVDMyICAgICAgICAgICAgRUZTUk9NX0tJQ0s6MTsKLQkJVUlOVDMyICAgICAgICAgICAgU0VMX0VGVVNFOjE7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlFRlVTRV9DVFJMX1NUUlVDLCAqUEVGVVNFX0NUUkxfU1RSVUM7Ci0jZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLwotCi1zdGF0aWMgVUNIQVIgZUZ1c2VSZWFkUmVnaXN0ZXJzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVCBPZmZzZXQsCi0JSU4JVVNIT1JUIExlbmd0aCwKLQlPVVQJVVNIT1JUKiBwRGF0YSk7Ci0KLXN0YXRpYyBWT0lEIGVGdXNlUmVhZFBoeXNpY2FsKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVU0hPUlQgbHBJbkJ1ZmZlciwKLQlJTglVTE9ORyBuSW5CdWZmZXJTaXplLAotCU9VVAlQVVNIT1JUIGxwT3V0QnVmZmVyLAotCUlOCVVMT05HIG5PdXRCdWZmZXJTaXplKTsKLQotc3RhdGljIFZPSUQgZUZ1c2VQaHlzaWNhbFdyaXRlUmVnaXN0ZXJzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVCBPZmZzZXQsCi0JSU4JVVNIT1JUIExlbmd0aCwKLQlPVVQJVVNIT1JUKiBwRGF0YSk7Ci0KLXN0YXRpYyBOVFNUQVRVUyBlRnVzZVdyaXRlUmVnaXN0ZXJzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVCBPZmZzZXQsCi0JSU4JVVNIT1JUIExlbmd0aCwKLQlJTglVU0hPUlQqIHBEYXRhKTsKLQotc3RhdGljIFZPSUQgZUZ1c2VXcml0ZVBoeXNpY2FsKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCVBVU0hPUlQgbHBJbkJ1ZmZlciwKLQlVTE9ORyBuSW5CdWZmZXJTaXplLAotCVBVQ0hBUiBscE91dEJ1ZmZlciwKLQlVTE9ORyBuT3V0QnVmZmVyU2l6ZSk7Ci0KLQotc3RhdGljIE5UU1RBVFVTIGVGdXNlV3JpdGVSZWdpc3RlcnNGcm9tQmluKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVCBPZmZzZXQsCi0JSU4JVVNIT1JUIExlbmd0aCwKLQlJTglVU0hPUlQqIHBEYXRhKTsKLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JTm90ZToKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVUNIQVIgZUZ1c2VSZWFkUmVnaXN0ZXJzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVCBPZmZzZXQsCi0JSU4JVVNIT1JUIExlbmd0aCwKLQlPVVQJVVNIT1JUKiBwRGF0YSkKLXsKLQlFRlVTRV9DVFJMX1NUUlVDCQllRnVzZUN0cmxTdHJ1YzsKLQlpbnQJaTsKLQlVU0hPUlQJZWZ1c2VEYXRhT2Zmc2V0OwotCVVJTlQzMglkYXRhOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAmZUZ1c2VDdHJsU3RydWMud29yZCk7Ci0KLQkvL1N0ZXAwLiBXcml0ZSAxMC1iaXQgb2YgYWRkcmVzcyB0byBFRlNST01fQUlOICgweDU4MCwgYml0MjU6Yml0MTYpLiBUaGUgYWRkcmVzcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25tZW50LgotCS8vVXNlIHRoZSBlZXByb20gbG9naWNhbCBhZGRyZXNzIGFuZCBjb3ZlcnQgdG8gYWRkcmVzcyB0byBibG9jayBudW1iZXIKLQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fQUlOID0gT2Zmc2V0ICYgMHhmZmYwOwotCi0JLy9TdGVwMS4gV3JpdGUgRUZTUk9NX01PREUgKDB4NTgwLCBiaXQ3OmJpdDYpIHRvIDAuCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX01PREUgPSAwOwotCi0JLy9TdGVwMi4gV3JpdGUgRUZTUk9NX0tJQ0sgKDB4NTgwLCBiaXQzMCkgdG8gMSB0byBraWNrLW9mZiBwaHlzaWNhbCByZWFkIHByb2NlZHVyZS4KLQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fS0lDSyA9IDE7Ci0KLQlOZGlzTW92ZU1lbW9yeSgmZGF0YSwgJmVGdXNlQ3RybFN0cnVjLCA0KTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRlVTRV9DVFJMLCBkYXRhKTsKLQotCS8vU3RlcDMuIFBvbGxpbmcgRUZTUk9NX0tJQ0soMHg1ODAsIGJpdDMwKSB1bnRpbCBpdCBiZWNvbWUgMCBhZ2Fpbi4KLQlpID0gMDsKLQl3aGlsZShpIDwgNTAwKQotCXsKLQkJLy9ydG1wLkh3TWVtb3J5UmVhZER3b3JkKEVGVVNFX0NUUkwsIChEV09SRCAqKSAmZUZ1c2VDdHJsU3RydWMsIDQpOwotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVGVVNFX0NUUkwsICZlRnVzZUN0cmxTdHJ1Yy53b3JkKTsKLQkJaWYoZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPT0gMCkKLQkJewotCQkJYnJlYWs7Ci0JCX0KLQkJUlRNUHVzZWNEZWxheSgyKTsKLQkJaSsrOwotCX0KLQotCS8vaWYgRUZTUk9NX0FPVVQgaXMgbm90IGZvdW5kIGluIHBoeXNpY2FsIGFkZHJlc3MsIHdyaXRlIDB4ZmZmZgotCWlmIChlRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fQU9VVCA9PSAweDNmKQotCXsKLQkJZm9yKGk9MDsgaTxMZW5ndGgvMjsgaSsrKQotCQkJKihwRGF0YSsyKmkpID0gMHhmZmZmOwotCX0KLQllbHNlCi0JewotCQkvL1N0ZXA0LiBSZWFkIDE2LWJ5dGUgb2YgZGF0YSBmcm9tIEVGVVNFX0RBVEEwLTMgKDB4NTkwLTB4NTlDKQotCQllZnVzZURhdGFPZmZzZXQgPSAgRUZVU0VfREFUQTMgLSAoT2Zmc2V0ICYgMHhDKTsKLQkJLy9kYXRhIGhvbGQgNCBieXRlcyBkYXRhLgotCQkvL0luIFJUTVBfSU9fUkVBRDMyIHdpbGwgYXV0b21hdGljYWxseSBleGVjdXRlIDMyLWJ5dGVzIHN3YXBwaW5nCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgZWZ1c2VEYXRhT2Zmc2V0LCAmZGF0YSk7Ci0JCS8vRGVjaWRlIHRoZSB1cHBlciAyIGJ5dGVzIG9yIHRoZSBib3R0b20gMiBieXRlcy4KLQkJLy8gTGl0dGxlLWVuZGlhbgkJUwl8CVMJQmlnLWVuZGlhbgotCQkvLyBhZGRyCTMJMgkxCTAJfAkwCTEJMgkzCi0JCS8vIE9yaS1WCUQJQwlCCUEJfAlBCUIJQwlECi0JCS8vQWZ0ZXIgc3dhcHBpbmcKLQkJLy8JCUQJQwlCCUEJfAlECUMJQglBCi0JCS8vUmV0dXJuIDItYnl0ZXMKLQkJLy9UaGUgcmV0dXJuIGJ5dGUgc3RhdHJzIGZyb20gUy4gVGhlcmVmb3JlLCB0aGUgbGl0dGxlLWVuZGlhbiB3aWxsIHJldHVybiBCQSwgdGhlIEJpZy1lbmRpYW4gd2lsbCByZXR1cm4gREMuCi0JCS8vRm9yIHJldHVybmluZyB0aGUgYm90dG9tIDIgYnl0ZXMsIHRoZSBCaWctZW5kaWFuIHNob3VsZCBzaGlmdCByaWdodCAyLWJ5dGVzLgotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQkJZGF0YSA9IGRhdGEgPDwgKDgqKChPZmZzZXQgJiAweDMpXjB4MikpOwotI2Vsc2UKLQkJZGF0YSA9IGRhdGEgPj4gKDgqKE9mZnNldCAmIDB4MykpOwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLQotCQlOZGlzTW92ZU1lbW9yeShwRGF0YSwgJmRhdGEsIExlbmd0aCk7Ci0JfQotCi0JcmV0dXJuIChVQ0hBUikgZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0FPVVQ7Ci0KLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCU5vdGU6Ci0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgZUZ1c2VQaHlzaWNhbFJlYWRSZWdpc3RlcnMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUIE9mZnNldCwKLQlJTglVU0hPUlQgTGVuZ3RoLAotCU9VVAlVU0hPUlQqIHBEYXRhKQotewotCUVGVVNFX0NUUkxfU1RSVUMJCWVGdXNlQ3RybFN0cnVjOwotCWludAlpOwotCVVTSE9SVAllZnVzZURhdGFPZmZzZXQ7Ci0JVUlOVDMyCWRhdGE7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIEVGVVNFX0NUUkwsICZlRnVzZUN0cmxTdHJ1Yy53b3JkKTsKLQotCS8vU3RlcDAuIFdyaXRlIDEwLWJpdCBvZiBhZGRyZXNzIHRvIEVGU1JPTV9BSU4gKDB4NTgwLCBiaXQyNTpiaXQxNikuIFRoZSBhZGRyZXNzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbm1lbnQuCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0FJTiA9IE9mZnNldCAmIDB4ZmZmMDsKLQotCS8vU3RlcDEuIFdyaXRlIEVGU1JPTV9NT0RFICgweDU4MCwgYml0NzpiaXQ2KSB0byAxLgotCS8vUmVhZCBpbiBwaHlzaWNhbCB2aWV3Ci0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX01PREUgPSAxOwotCi0JLy9TdGVwMi4gV3JpdGUgRUZTUk9NX0tJQ0sgKDB4NTgwLCBiaXQzMCkgdG8gMSB0byBraWNrLW9mZiBwaHlzaWNhbCByZWFkIHByb2NlZHVyZS4KLQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fS0lDSyA9IDE7Ci0KLQlOZGlzTW92ZU1lbW9yeSgmZGF0YSwgJmVGdXNlQ3RybFN0cnVjLCA0KTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRlVTRV9DVFJMLCBkYXRhKTsKLQotCS8vU3RlcDMuIFBvbGxpbmcgRUZTUk9NX0tJQ0soMHg1ODAsIGJpdDMwKSB1bnRpbCBpdCBiZWNvbWUgMCBhZ2Fpbi4KLQlpID0gMDsKLQl3aGlsZShpIDwgNTAwKQotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAmZUZ1c2VDdHJsU3RydWMud29yZCk7Ci0JCWlmKGVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9LSUNLID09IDApCi0JCQlicmVhazsKLQkJUlRNUHVzZWNEZWxheSgyKTsKLQkJaSsrOwotCX0KLQotCS8vU3RlcDQuIFJlYWQgMTYtYnl0ZSBvZiBkYXRhIGZyb20gRUZVU0VfREFUQTAtMyAoMHg1OUMtMHg1OTApCi0JLy9CZWNhdXNlIHRoZSBzaXplIG9mIGVhY2ggRUZVU0VfREFUQSBpcyA0IEJ5dGVzLCB0aGUgc2l6ZSBvZiBhZGRyZXNzIG9mIGVhY2ggaXMgMiBiaXRzLgotCS8vVGhlIHByZXZpb3VzIDIgYml0cyBpcyB0aGUgRUZVU0VfREFUQSBudW1iZXIsIHRoZSBsYXN0IDIgYml0cyBpcyB1c2VkIHRvIGRlY2lkZSB3aGljaCBieXRlcwotCS8vRGVjaWRlIHdoaWNoIEVGVVNFX0RBVEEgdG8gcmVhZAotCS8vNTkwOkYgRSBEIEMKLQkvLzU5NDpCIEEgOSA4Ci0JLy81OTg6NyA2IDUgNAotCS8vNTlDOjMgMiAxIDAKLQllZnVzZURhdGFPZmZzZXQgPSAgRUZVU0VfREFUQTMgLSAoT2Zmc2V0ICYgMHhDKSAgOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBlZnVzZURhdGFPZmZzZXQsICZkYXRhKTsKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQkJZGF0YSA9IGRhdGEgPDwgKDgqKChPZmZzZXQgJiAweDMpXjB4MikpOwotI2Vsc2UKLQlkYXRhID0gZGF0YSA+PiAoOCooT2Zmc2V0ICYgMHgzKSk7Ci0jZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLwotCi0JTmRpc01vdmVNZW1vcnkocERhdGEsICZkYXRhLCBMZW5ndGgpOwotCi19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0KLQlBcmd1bWVudHM6Ci0KLQlSZXR1cm4gVmFsdWU6Ci0KLQlOb3RlOgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgVk9JRCBlRnVzZVJlYWRQaHlzaWNhbCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVVNIT1JUIGxwSW5CdWZmZXIsCi0JSU4JVUxPTkcgbkluQnVmZmVyU2l6ZSwKLQlPVVQJUFVTSE9SVCBscE91dEJ1ZmZlciwKLQlJTglVTE9ORyBuT3V0QnVmZmVyU2l6ZQotKQotewotCVVTSE9SVCogcEluQnVmID0gKFVTSE9SVCopbHBJbkJ1ZmZlcjsKLQlVU0hPUlQqIHBPdXRCdWYgPSAoVVNIT1JUKilscE91dEJ1ZmZlcjsKLQotCVVTSE9SVCBPZmZzZXQgPSBwSW5CdWZbMF07CQkJCQkvL2FkZHIKLQlVU0hPUlQgTGVuZ3RoID0gcEluQnVmWzFdOwkJCQkJLy9sZW5ndGgKLQlpbnQJCWk7Ci0KLQlmb3IoaT0wOyBpPExlbmd0aDsgaSs9MikKLQl7Ci0JCWVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKHBBZCxPZmZzZXQraSwgMiwgJnBPdXRCdWZbaS8yXSk7Ci0JfQotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JTm90ZToKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTlRTVEFUVVMgZUZ1c2VSZWFkKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVAkJCU9mZnNldCwKLQlPVVQJUFVDSEFSCQkJcERhdGEsCi0JSU4JVVNIT1JUCQkJTGVuZ3RoKQotewotCVVTSE9SVCogcE91dEJ1ZiA9IChVU0hPUlQqKXBEYXRhOwotCU5UU1RBVFVTIFN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwotCVVDSEFSCUVGU1JPTV9BT1VUOwotCWludAlpOwotCi0JZm9yKGk9MDsgaTxMZW5ndGg7IGkrPTIpCi0JewotCQlFRlNST01fQU9VVCA9IGVGdXNlUmVhZFJlZ2lzdGVycyhwQWQsIE9mZnNldCtpLCAyLCAmcE91dEJ1ZltpLzJdKTsKLQl9Ci0JcmV0dXJuIFN0YXR1czsKLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCU5vdGU6Ci0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyBWT0lEIGVGdXNlUGh5c2ljYWxXcml0ZVJlZ2lzdGVycygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQgT2Zmc2V0LAotCUlOCVVTSE9SVCBMZW5ndGgsCi0JT1VUCVVTSE9SVCogcERhdGEpCi17Ci0JRUZVU0VfQ1RSTF9TVFJVQwkJZUZ1c2VDdHJsU3RydWM7Ci0JaW50CWk7Ci0JVVNIT1JUCWVmdXNlRGF0YU9mZnNldDsKLQlVSU5UMzIJZGF0YSwgZUZ1c2VEYXRhQnVmZmVyWzRdOwotCi0JLy9TdGVwMC4gV3JpdGUgMTYtYnl0ZSBvZiBkYXRhIHRvIEVGVVNFX0RBVEEwLTMgKDB4NTkwLTB4NTlDKSwgd2hlcmUgRUZVU0VfREFUQTAgaXMgdGhlIExTQiBEVywgRUZVU0VfREFUQTMgaXMgdGhlIE1TQiBEVy4KLQotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy9yZWFkIGN1cnJlbnQgdmFsdWVzIG9mIDE2LWJ5dGUgYmxvY2sKLQlSVE1QX0lPX1JFQUQzMihwQWQsIEVGVVNFX0NUUkwsICAmZUZ1c2VDdHJsU3RydWMud29yZCk7Ci0KLQkvL1N0ZXAwLiBXcml0ZSAxMC1iaXQgb2YgYWRkcmVzcyB0byBFRlNST01fQUlOICgweDU4MCwgYml0MjU6Yml0MTYpLiBUaGUgYWRkcmVzcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25tZW50LgotCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9BSU4gPSBPZmZzZXQgJiAweGZmZjA7Ci0KLQkvL1N0ZXAxLiBXcml0ZSBFRlNST01fTU9ERSAoMHg1ODAsIGJpdDc6Yml0NikgdG8gMS4KLQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fTU9ERSA9IDE7Ci0KLQkvL1N0ZXAyLiBXcml0ZSBFRlNST01fS0lDSyAoMHg1ODAsIGJpdDMwKSB0byAxIHRvIGtpY2stb2ZmIHBoeXNpY2FsIHJlYWQgcHJvY2VkdXJlLgotCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9LSUNLID0gMTsKLQotCU5kaXNNb3ZlTWVtb3J5KCZkYXRhLCAmZUZ1c2VDdHJsU3RydWMsIDQpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVGVVNFX0NUUkwsIGRhdGEpOwotCi0JLy9TdGVwMy4gUG9sbGluZyBFRlNST01fS0lDSygweDU4MCwgYml0MzApIHVudGlsIGl0IGJlY29tZSAwIGFnYWluLgotCWkgPSAwOwotCXdoaWxlKGkgPCA1MDApCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVGVVNFX0NUUkwsICZlRnVzZUN0cmxTdHJ1Yy53b3JkKTsKLQotCQlpZihlRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fS0lDSyA9PSAwKQotCQkJYnJlYWs7Ci0JCVJUTVB1c2VjRGVsYXkoMik7Ci0JCWkrKzsKLQl9Ci0KLQkvL1N0ZXA0LiBSZWFkIDE2LWJ5dGUgb2YgZGF0YSBmcm9tIEVGVVNFX0RBVEEwLTMgKDB4NTlDLTB4NTkwKQotCWVmdXNlRGF0YU9mZnNldCA9ICBFRlVTRV9EQVRBMzsKLQlmb3IoaT0wOyBpPCA0OyBpKyspCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIGVmdXNlRGF0YU9mZnNldCwgKFBVSU5UMzIpICZlRnVzZURhdGFCdWZmZXJbaV0pOwotCQllZnVzZURhdGFPZmZzZXQgLT0gIDQ7Ci0JfQotCi0JLy9VcGRhdGUgdGhlIHZhbHVlLCB0aGUgb2Zmc2V0IGlzIG11bHRpcGxlIG9mIDIsIGxlbmd0aCBpcyAyCi0JZWZ1c2VEYXRhT2Zmc2V0ID0gKE9mZnNldCAmIDB4YykgPj4gMjsKLQlkYXRhID0gcERhdGFbMF0gJiAweGZmZmY7Ci0JLy9UaGUgb2Zmc2V0IHNob3VsZCBiZSAweCoqKjEwIG9yIDB4KioqMDAKLQlpZigoT2Zmc2V0ICUgNCkgIT0gMCkKLQl7Ci0JCWVGdXNlRGF0YUJ1ZmZlcltlZnVzZURhdGFPZmZzZXRdID0gKGVGdXNlRGF0YUJ1ZmZlcltlZnVzZURhdGFPZmZzZXRdICYgMHhmZmZmKSB8IChkYXRhIDw8IDE2KTsKLQl9Ci0JZWxzZQotCXsKLQkJZUZ1c2VEYXRhQnVmZmVyW2VmdXNlRGF0YU9mZnNldF0gPSAoZUZ1c2VEYXRhQnVmZmVyW2VmdXNlRGF0YU9mZnNldF0gJiAweGZmZmYwMDAwKSB8IGRhdGE7Ci0JfQotCi0JZWZ1c2VEYXRhT2Zmc2V0ID0gIEVGVVNFX0RBVEEzOwotCWZvcihpPTA7IGk8IDQ7IGkrKykKLQl7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIGVmdXNlRGF0YU9mZnNldCwgZUZ1c2VEYXRhQnVmZmVyW2ldKTsKLQkJZWZ1c2VEYXRhT2Zmc2V0IC09IDQ7Ci0JfQotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQkvL1N0ZXAxLiBXcml0ZSAxMC1iaXQgb2YgYWRkcmVzcyB0byBFRlNST01fQUlOICgweDU4MCwgYml0MjU6Yml0MTYpLiBUaGUgYWRkcmVzcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25tZW50LgotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAmZUZ1c2VDdHJsU3RydWMud29yZCk7Ci0KLQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fQUlOID0gT2Zmc2V0ICYgMHhmZmYwOwotCi0JLy9TdGVwMi4gV3JpdGUgRUZTUk9NX01PREUgKDB4NTgwLCBiaXQ3OmJpdDYpIHRvIDMuCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX01PREUgPSAzOwotCi0JLy9TdGVwMy4gV3JpdGUgRUZTUk9NX0tJQ0sgKDB4NTgwLCBiaXQzMCkgdG8gMSB0byBraWNrLW9mZiBwaHlzaWNhbCB3cml0ZSBwcm9jZWR1cmUuCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPSAxOwotCi0JTmRpc01vdmVNZW1vcnkoJmRhdGEsICZlRnVzZUN0cmxTdHJ1YywgNCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgRUZVU0VfQ1RSTCwgZGF0YSk7Ci0KLQkvL1N0ZXA0LiBQb2xsaW5nIEVGU1JPTV9LSUNLKDB4NTgwLCBiaXQzMCkgdW50aWwgaXQgYmVjb21lIDAgYWdhaW4uIEl077+977+9cyBkb25lLgotCWkgPSAwOwotCi0Jd2hpbGUoaSA8IDUwMCkKLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgRUZVU0VfQ1RSTCwgJmVGdXNlQ3RybFN0cnVjLndvcmQpOwotCi0JCWlmKGVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9LSUNLID09IDApCi0JCQlicmVhazsKLQotCQlSVE1QdXNlY0RlbGF5KDIpOwotCQlpKys7Ci0JfQotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JTm90ZToKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIE5UU1RBVFVTIGVGdXNlV3JpdGVSZWdpc3RlcnMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUIE9mZnNldCwKLQlJTglVU0hPUlQgTGVuZ3RoLAotCUlOCVVTSE9SVCogcERhdGEpCi17Ci0JVVNIT1JUCWksTG9vcD0wOwotCVVTSE9SVAllRnVzZURhdGE7Ci0JVVNIT1JUCUxvZ2ljYWxBZGRyZXNzLCBCbGtOdW0gPSAweGZmZmY7Ci0JVUNIQVIJRUZTUk9NX0FPVVQ7Ci0KLQlVU0hPUlQgYWRkcix0bXBhZGRyLCBJbkJ1ZlszXSwgdG1wT2Zmc2V0OwotCVVTSE9SVCBidWZmZXJbOF07Ci0JQk9PTEVBTgkJYldyaXRlU3VjY2VzcyA9IFRSVUU7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJlRnVzZVdyaXRlUmVnaXN0ZXJzIE9mZnNldD0leCwgcERhdGE9JXhcbiIsIE9mZnNldCwgKnBEYXRhKSk7Ci0KLQkvL1N0ZXAgMC4gZmluZCB0aGUgZW50cnkgaW4gdGhlIG1hcHBpbmcgdGFibGUKLQkvL1RoZSBhZGRyZXNzIG9mIEVFUFJPTSBpcyAyLWJ5dGVzIGFsaWdubWVudC4KLQkvL1RoZSBsYXN0IGJpdCBpcyB1c2VkIGZvciBhbGlnbm1lbnQsIHNvIGl0IG11c3QgYmUgMC4KLQl0bXBPZmZzZXQgPSBPZmZzZXQgJiAweGZmZmU7Ci0JRUZTUk9NX0FPVVQgPSBlRnVzZVJlYWRSZWdpc3RlcnMocEFkLCB0bXBPZmZzZXQsIDIsICZlRnVzZURhdGEpOwotCi0JaWYoIEVGU1JPTV9BT1VUID09IDB4M2YpCi0JewkvL2ZpbmQgYXZhaWxhYmxlIGxvZ2ljYWwgYWRkcmVzcyBwb2ludGVyCi0JCS8vdGhlIGxvZ2ljYWwgYWRkcmVzcyBkb2VzIG5vdCBleGlzdCwgZmluZCBhbiBlbXB0eSBvbmUKLQkJLy9mcm9tIHRoZSBmaXJzdCBhZGRyZXNzIG9mIGJsb2NrIDQ1PTE2KjQ1PTB4MmQwIHRvIHRoZSBsYXN0IGFkZHJlc3Mgb2YgYmxvY2sgNDcKLQkJLy89PT40OCoxNi0zKHJlc2VydmVkKT0yRkMKLQkJZm9yIChpPUVGVVNFX1VTQUdFX01BUF9TVEFSVDsgaTw9RUZVU0VfVVNBR0VfTUFQX0VORDsgaSs9MikKLQkJewotCQkJLy9SZXRyaXZlIHRoZSBsb2dpY2FsIGJsb2NrIG51Ym1lciBmb3JtIGVhY2ggbG9naWNhbCBhZGRyZXNzIHBvaW50ZXIKLQkJCS8vSXQgd2lsbCBhY2Nlc3MgdHdvIGxvZ2ljYWwgYWRkcmVzcyBwb2ludGVyIGVhY2ggdGltZS4KLQkJCWVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKHBBZCwgaSwgMiwgJkxvZ2ljYWxBZGRyZXNzKTsKLQkJCWlmKCAoTG9naWNhbEFkZHJlc3MgJiAweGZmKSA9PSAwKQotCQkJey8vTm90IHVzZWQgbG9naWNhbCBhZGRyZXNzIHBvaW50ZXIKLQkJCQlCbGtOdW0gPSBpLUVGVVNFX1VTQUdFX01BUF9TVEFSVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYoKCAoTG9naWNhbEFkZHJlc3MgPj4gOCkgJiAweGZmKSA9PSAwKQotCQkJey8vTm90IHVzZWQgbG9naWNhbCBhZGRyZXNzIHBvaW50ZXIKLQkJCQlpZiAoaSAhPSBFRlVTRV9VU0FHRV9NQVBfRU5EKQotCQkJCXsKLQkJCQkJQmxrTnVtID0gaS1FRlVTRV9VU0FHRV9NQVBfU1RBUlQrMTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJQmxrTnVtID0gRUZTUk9NX0FPVVQ7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZUZ1c2VXcml0ZVJlZ2lzdGVycyBCbGtOdW0gPSAlZCBcbiIsIEJsa051bSkpOwotCi0JaWYoQmxrTnVtID09IDB4ZmZmZikKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImVGdXNlV3JpdGVSZWdpc3RlcnM6IG91dCBvZiBmcmVlIEUtZnVzZSBzcGFjZSEhIVxuIikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JLy9TdGVwIDEuIFNhdmUgZGF0YSBvZiB0aGlzIGJsb2NrCXdoaWNoIGlzIHBvaW50ZWQgYnkgdGhlIGF2YWlibGUgbG9naWNhbCBhZGRyZXNzIHBvaW50ZXIKLQkvLyByZWFkIGFuZCBzYXZlIHRoZSBvcmlnaW5hbCBibG9jayBkYXRhCi0JZm9yKGkgPTA7IGk8ODsgaSsrKQotCXsKLQkJYWRkciA9IEJsa051bSAqIDB4MTAgOwotCi0JCUluQnVmWzBdID0gYWRkcisyKmk7Ci0JCUluQnVmWzFdID0gMjsKLQkJSW5CdWZbMl0gPSAweDA7Ci0KLQkJZUZ1c2VSZWFkUGh5c2ljYWwocEFkLCAmSW5CdWZbMF0sIDQsICZJbkJ1ZlsyXSwgMik7Ci0KLQkJYnVmZmVyW2ldID0gSW5CdWZbMl07Ci0JfQotCi0JLy9TdGVwIDIuIFVwZGF0ZSB0aGUgZGF0YSBpbiBidWZmZXIsIGFuZCB3cml0ZSB0aGUgZGF0YSB0byBFZnVzZQotCWJ1ZmZlclsgKE9mZnNldCA+PiAxKSAlIDhdID0gcERhdGFbMF07Ci0KLQlkbwotCXsJTG9vcCsrOwotCQkvL1N0ZXAgMy4gV3JpdGUgdGhlIGRhdGEgdG8gRWZ1c2UKLQkJaWYoIWJXcml0ZVN1Y2Nlc3MpCi0JCXsKLQkJCWZvcihpID0wOyBpPDg7IGkrKykKLQkJCXsKLQkJCQlhZGRyID0gQmxrTnVtICogMHgxMCA7Ci0KLQkJCQlJbkJ1ZlswXSA9IGFkZHIrMippOwotCQkJCUluQnVmWzFdID0gMjsKLQkJCQlJbkJ1ZlsyXSA9IGJ1ZmZlcltpXTsKLQotCQkJCWVGdXNlV3JpdGVQaHlzaWNhbChwQWQsICZJbkJ1ZlswXSwgNiwgTlVMTCwgMik7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkJYWRkciA9IEJsa051bSAqIDB4MTAgOwotCi0JCQkJSW5CdWZbMF0gPSBhZGRyKyhPZmZzZXQgJSAxNik7Ci0JCQkJSW5CdWZbMV0gPSAyOwotCQkJCUluQnVmWzJdID0gcERhdGFbMF07Ci0KLQkJCQllRnVzZVdyaXRlUGh5c2ljYWwocEFkLCAmSW5CdWZbMF0sIDYsIE5VTEwsIDIpOwotCQl9Ci0KLQkJLy9TdGVwIDQuIFdyaXRlIG1hcHBpbmcgdGFibGUKLQkJYWRkciA9IEVGVVNFX1VTQUdFX01BUF9TVEFSVCtCbGtOdW07Ci0KLQkJdG1wYWRkciA9IGFkZHI7Ci0KLQkJaWYoYWRkciAlIDIgIT0gMCkKLQkJCWFkZHIgPSBhZGRyIC0xOwotCQlJbkJ1ZlswXSA9IGFkZHI7Ci0JCUluQnVmWzFdID0gMjsKLQotCQkvL2NvbnZlcnQgdGhlIGFkZHJlc3MgZnJvbSAxMCB0byA4IGJpdCAoIGJpdDcsIDYgPSBwYXJpdHkgYW5kIGJpdDUgfiAwID0gYml0OX40KSwgYW5kIHdyaXRlIHRvIGxvZ2ljYWwgbWFwIGVudHJ5Ci0JCXRtcE9mZnNldCA9IE9mZnNldDsKLQkJdG1wT2Zmc2V0ID4+PSA0OwotCQl0bXBPZmZzZXQgfD0gKCh+KCh0bXBPZmZzZXQgJiAweDAxKSBeICggdG1wT2Zmc2V0ID4+IDEgJiAweDAxKSBeICAodG1wT2Zmc2V0ID4+IDIgJiAweDAxKSBeICAodG1wT2Zmc2V0ID4+IDMgJiAweDAxKSkpIDw8IDYpICYgMHg0MDsKLQkJdG1wT2Zmc2V0IHw9ICgofiggKHRtcE9mZnNldCA+PiAyICYgMHgwMSkgXiAodG1wT2Zmc2V0ID4+IDMgJiAweDAxKSBeICh0bXBPZmZzZXQgPj4gNCAmIDB4MDEpIF4gKCB0bXBPZmZzZXQgPj4gNSAmIDB4MDEpKSkgPDwgNykgJiAweDgwOwotCi0JCS8vIHdyaXRlIHRoZSBsb2dpY2FsIGFkZHJlc3MKLQkJaWYodG1wYWRkciUyICE9IDApCi0JCQlJbkJ1ZlsyXSA9IHRtcE9mZnNldDw8ODsKLQkJZWxzZQotCQkJSW5CdWZbMl0gPSB0bXBPZmZzZXQ7Ci0KLQkJZUZ1c2VXcml0ZVBoeXNpY2FsKHBBZCwmSW5CdWZbMF0sIDYsIE5VTEwsIDApOwotCi0JCS8vU3RlcCA1LiBDb21wYXJlIGRhdGEgaWYgbm90IHRoZSBzYW1lLCBpbnZhbGlkYXRlIHRoZSBtYXBwaW5nIGVudHJ5LCB0aGVuIHJlLXdyaXRlIHRoZSBkYXRhIHVudGlsIEUtZnVzZSBpcyBleGhhdXN0ZWQKLQkJYldyaXRlU3VjY2VzcyA9IFRSVUU7Ci0JCWZvcihpID0wOyBpPDg7IGkrKykKLQkJewotCQkJYWRkciA9IEJsa051bSAqIDB4MTAgOwotCi0JCQlJbkJ1ZlswXSA9IGFkZHIrMippOwotCQkJSW5CdWZbMV0gPSAyOwotCQkJSW5CdWZbMl0gPSAweDA7Ci0KLQkJCWVGdXNlUmVhZFBoeXNpY2FsKHBBZCwgJkluQnVmWzBdLCA0LCAmSW5CdWZbMl0sIDIpOwotCi0JCQlpZihidWZmZXJbaV0gIT0gSW5CdWZbMl0pCi0JCQl7Ci0JCQkJYldyaXRlU3VjY2VzcyA9IEZBTFNFOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJLy9TdGVwIDYuIGludmxpZGF0ZSBtYXBwaW5nIGVudHJ5IGFuZCBmaW5kIGEgZnJlZSBtYXBwaW5nIGVudHJ5IGlmIG5vdCBzdWNjZWVkCi0JCWlmICghYldyaXRlU3VjY2VzcykKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm90IGJXcml0ZVN1Y2Nlc3MgQmxrTnVtID0gJWRcbiIsIEJsa051bSkpOwotCi0JCQkvLyB0aGUgb2Zmc2V0IG9mIGN1cnJlbnQgbWFwcGluZyBlbnRyeQotCQkJYWRkciA9IEVGVVNFX1VTQUdFX01BUF9TVEFSVCtCbGtOdW07Ci0KLQkJCS8vZmluZCBhIG5ldyBtYXBwaW5nIGVudHJ5Ci0JCQlCbGtOdW0gPSAweGZmZmY7Ci0JCQlmb3IgKGk9RUZVU0VfVVNBR0VfTUFQX1NUQVJUOyBpPD1FRlVTRV9VU0FHRV9NQVBfRU5EOyBpKz0yKQotCQkJewotCQkJCWVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKHBBZCwgaSwgMiwgJkxvZ2ljYWxBZGRyZXNzKTsKLQkJCQlpZiggKExvZ2ljYWxBZGRyZXNzICYgMHhmZikgPT0gMCkKLQkJCQl7Ci0JCQkJCUJsa051bSA9IGktRUZVU0VfVVNBR0VfTUFQX1NUQVJUOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZWxzZSBpZigoIChMb2dpY2FsQWRkcmVzcyA+PiA4KSAmIDB4ZmYpID09IDApCi0JCQkJewotCQkJCQlpZiAoaSAhPSBFRlVTRV9VU0FHRV9NQVBfRU5EKQotCQkJCQl7Ci0JCQkJCQlCbGtOdW0gPSBpKzEtRUZVU0VfVVNBR0VfTUFQX1NUQVJUOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vdCBiV3JpdGVTdWNjZXNzIG5ldyBCbGtOdW0gPSAlZFxuIiwgQmxrTnVtKSk7Ci0JCQlpZihCbGtOdW0gPT0gMHhmZmZmKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImVGdXNlV3JpdGVSZWdpc3RlcnM6IG91dCBvZiBmcmVlIEUtZnVzZSBzcGFjZSEhIVxuIikpOwotCQkJCXJldHVybiBGQUxTRTsKLQkJCX0KLQotCQkJLy9pbnZhbGlkYXRlIHRoZSBvcmlnaW5hbCBtYXBwaW5nIGVudHJ5IGlmIG5ldyBlbnRyeSBpcyBub3QgZm91bmQKLQkJCXRtcGFkZHIgPSBhZGRyOwotCi0JCQlpZihhZGRyICUgMiAhPSAwKQotCQkJCWFkZHIgPSBhZGRyIC0xOwotCQkJSW5CdWZbMF0gPSBhZGRyOwotCQkJSW5CdWZbMV0gPSAyOwotCi0JCQllRnVzZVJlYWRQaHlzaWNhbChwQWQsICZJbkJ1ZlswXSwgNCwgJkluQnVmWzJdLCAyKTsKLQotCQkJLy8gd3JpdGUgdGhlIGxvZ2ljYWwgYWRkcmVzcwotCQkJaWYodG1wYWRkciUyICE9IDApCi0JCQl7Ci0JCQkJLy8gSW52YWxpZGF0ZSB0aGUgaGlnaCBieXRlCi0JCQkJZm9yIChpPTg7IGk8MTU7IGkrKykKLQkJCQl7Ci0JCQkJCWlmKCAoIChJbkJ1ZlsyXSA+PiBpKSAmIDB4MDEpID09IDApCi0JCQkJCXsKLQkJCQkJCUluQnVmWzJdIHw9ICgweDEgPDxpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vIGludmFsaWRhdGUgdGhlIGxvdyBieXRlCi0JCQkJZm9yIChpPTA7IGk8ODsgaSsrKQotCQkJCXsKLQkJCQkJaWYoICggKEluQnVmWzJdID4+IGkpICYgMHgwMSkgPT0gMCkKLQkJCQkJewotCQkJCQkJSW5CdWZbMl0gfD0gKDB4MSA8PGkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllRnVzZVdyaXRlUGh5c2ljYWwocEFkLCAmSW5CdWZbMF0sIDYsIE5VTEwsIDApOwotCQl9Ci0JfQotCXdoaWxlICghYldyaXRlU3VjY2VzcyYmTG9vcDwyKTsKLQlpZighYldyaXRlU3VjY2VzcykKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJFZnN1ZSBXcml0ZSBGYWlsZWQhIVxuIikpOwotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0KLQlBcmd1bWVudHM6Ci0KLQlSZXR1cm4gVmFsdWU6Ci0KLQlOb3RlOgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgVk9JRCBlRnVzZVdyaXRlUGh5c2ljYWwoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JUFVTSE9SVCBscEluQnVmZmVyLAotCVVMT05HIG5JbkJ1ZmZlclNpemUsCi0JUFVDSEFSIGxwT3V0QnVmZmVyLAotCVVMT05HIG5PdXRCdWZmZXJTaXplCi0pCi17Ci0JVVNIT1JUKiBwSW5CdWYgPSAoVVNIT1JUKilscEluQnVmZmVyOwotCWludAkJaTsKLQkvL1VTSE9SVCogcE91dEJ1ZiA9IChVU0hPUlQqKWlvQnVmZmVyOwotCVVTSE9SVCBPZmZzZXQgPSBwSW5CdWZbMF07CQkJCQkvLyBhZGRyCi0JVVNIT1JUIExlbmd0aCA9IHBJbkJ1ZlsxXTsJCQkJCS8vIGxlbmd0aAotCVVTSE9SVCogcFZhbHVlWCA9ICZwSW5CdWZbMl07CQkJCS8vIHZhbHVlIC4uLgotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZUZ1c2VXcml0ZVBoeXNpY2FsIE9mZnNldD0weCV4LCBsZW5ndGg9JWRcbiIsIE9mZnNldCwgTGVuZ3RoKSk7Ci0KLQl7Ci0JCS8vIExpdHRsZS1lbmRpYW4JCVMJfAlTCUJpZy1lbmRpYW4KLQkJLy8gYWRkcgkzCTIJMQkwCXwJMAkxCTIJMwotCQkvLyBPcmktVglECUMJQglBCXwJQQlCCUMJRAotCQkvLyBBZnRlciBzd2FwcGluZwotCQkvLwkJRAlDCUIJQQl8CUQJQwlCCUEKLQkJLy8gQm90aCB0aGUgbGl0dGxlIGFuZCBiaWctZW5kaWFuIHVzZSB0aGUgc2FtZSBzZXF1ZW5jZSB0byB3cml0ZSAgZGF0YS4KLQkJLy8gVGhlcmVmb3JlLCB3ZSBvbmx5IG5lZWQgc3dhcCBkYXRhIHdoZW4gcmVhZCB0aGUgZGF0YS4KLQkJZm9yIChpPTA7IGk8TGVuZ3RoOyBpKz0yKQotCQl7Ci0JCQllRnVzZVBoeXNpY2FsV3JpdGVSZWdpc3RlcnMocEFkLCBPZmZzZXQraSwgMiwgJnBWYWx1ZVhbaS8yXSk7Ci0JCX0KLQl9Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCU5vdGU6Ci0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5UU1RBVFVTIGVGdXNlV3JpdGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVTSE9SVAkJCWxlbmd0aCkKLXsKLQlpbnQgaTsKLQlVU0hPUlQqIHBWYWx1ZVggPSAoUFVTSE9SVCkgcERhdGE7CQkJCS8vdmFsdWUgLi4uCi0KLQkvLyBUaGUgaW5wdXQgdmFsdWU9MzA3MCB3aWxsIGJlIHN0b3JlZCBhcyBmb2xsb3dpbmcKLQkvLyBMaXR0bGUtZW5kaWFuCQlTCXwJUwlCaWctZW5kaWFuCi0JLy8gYWRkcgkJCTEJMAl8CTAJMQotCS8vIE9yaS1WCQkJMzAJNzAJfAkzMAk3MAotCS8vIEFmdGVyIHN3YXBwaW5nCi0JLy8JCQkJMzAJNzAJfAk3MAkzMAotCS8vIENhc3RpbmcKLQkvLwkJCQkzMDcwCXwJNzAzMCAoeCkKLQkvLyBUaGUgc3dhcHBpbmcgc2hvdWxkIGJlIHJlbW92ZWQgZm9yIGJpZy1lbmRpYW4KLQlmb3IoaT0wOyBpPGxlbmd0aDsgaSs9MikKLQl7Ci0JCWVGdXNlV3JpdGVSZWdpc3RlcnMocEFkLCBPZmZzZXQraSwgMiwgJnBWYWx1ZVhbaS8yXSk7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0KLQlBcmd1bWVudHM6Ci0KLQlSZXR1cm4gVmFsdWU6Ci0KLQlOb3RlOgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgc2V0X2VGdXNlR2V0RnJlZUJsb2NrQ291bnRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVTSE9SVCBpOwotCVVTSE9SVAlMb2dpY2FsQWRkcmVzczsKLQlVU0hPUlQgZWZ1c2VmcmVlbnVtPTA7Ci0JaWYoIXBBZC0+YlVzZUVmdXNlKQotCQlyZXR1cm4gRkFMU0U7Ci0JZm9yIChpID0gRUZVU0VfVVNBR0VfTUFQX1NUQVJUOyBpIDw9IEVGVVNFX1VTQUdFX01BUF9FTkQ7IGkrPTIpCi0JewotCQllRnVzZVBoeXNpY2FsUmVhZFJlZ2lzdGVycyhwQWQsIGksIDIsICZMb2dpY2FsQWRkcmVzcyk7Ci0JCWlmKCAoTG9naWNhbEFkZHJlc3MgJiAweGZmKSA9PSAwKQotCQl7Ci0JCQllZnVzZWZyZWVudW09IChVQ0hBUikgKEVGVVNFX1VTQUdFX01BUF9FTkQtaSsxKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWVsc2UgaWYoKCAoTG9naWNhbEFkZHJlc3MgPj4gOCkgJiAweGZmKSA9PSAwKQotCQl7Ci0JCQllZnVzZWZyZWVudW0gPSAoVUNIQVIpIChFRlVTRV9VU0FHRV9NQVBfRU5ELWkpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZihpID09IEVGVVNFX1VTQUdFX01BUF9FTkQpCi0JCQllZnVzZWZyZWVudW0gPSAwOwotCX0KLQlwcmludGsoImVmdXNlRnJlZU51bWJlciBpcyAlZFxuIixlZnVzZWZyZWVudW0pOwotCXJldHVybiBUUlVFOwotfQotCi0KLUlOVCBzZXRfZUZ1c2VkdW1wX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLVVTSE9SVCBJbkJ1ZlszXTsKLQlJTlQgaT0wOwotCWlmKCFwQWQtPmJVc2VFZnVzZSkKLQkJcmV0dXJuIEZBTFNFOwotCWZvcihpID0wOyBpPEVGVVNFX1VTQUdFX01BUF9FTkQvMjsgaSsrKQotCXsKLQkJSW5CdWZbMF0gPSAyKmk7Ci0JCUluQnVmWzFdID0gMjsKLQkJSW5CdWZbMl0gPSAweDA7Ci0KLQkJZUZ1c2VSZWFkUGh5c2ljYWwocEFkLCAmSW5CdWZbMF0sIDQsICZJbkJ1ZlsyXSwgMik7Ci0JCWlmKGklND09MCkKLQkJcHJpbnRrKCJcbkJsb2NrICV4OiIsaS84KTsKLQkJcHJpbnRrKCIlMDR4ICIsSW5CdWZbMl0pOwotCX0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi1JTlQJc2V0X2VGdXNlTG9hZEZyb21CaW5fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVBTVFJJTkcJCQkJCXNyYzsKLQlSVE1QX09TX0ZECQkJCXNyY2Y7Ci0JUlRNUF9PU19GU19JTkZPCQkJb3Nmc0luZm87Ci0JSU5UCQkJCQkJcmV0dmFsLCBtZW1TaXplOwotCVBTVFJJTkcJCQkJCWJ1ZmZlciwgbWVtUHRyOwotCUlOVAkJCQkJCWkgPSAwLGo9MCxrPTE7Ci0JVVNIT1JUCQkJCQkqUERBVEE7Ci0JVVNIT1JUCQkJCQlEQVRBOwotCi0JbWVtU2l6ZSA9IDEyOCArIE1BWF9FRVBST01fQklOX0ZJTEVfU0laRSArIHNpemVvZihVU0hPUlQpICogODsKLQltZW1QdHIgPSBrbWFsbG9jKG1lbVNpemUsIE1FTV9BTExPQ19GTEFHKTsKLQlpZiAobWVtUHRyID09IE5VTEwpCi0JCXJldHVybiBGQUxTRTsKLQotCU5kaXNaZXJvTWVtb3J5KG1lbVB0ciwgbWVtU2l6ZSk7Ci0Jc3JjID0gbWVtUHRyOyAvLyBrbWFsbG9jKDEyOCwgTUVNX0FMTE9DX0ZMQUcpOwotCWJ1ZmZlciA9IHNyYyArIDEyODsJCS8vIGttYWxsb2MoTUFYX0VFUFJPTV9CSU5fRklMRV9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7Ci0JUERBVEEgPSAoVVNIT1JUKikoYnVmZmVyICsgTUFYX0VFUFJPTV9CSU5fRklMRV9TSVpFKTsJLy8ga21hbGxvYyhzaXplb2YoVVNIT1JUKSo4LE1FTV9BTExPQ19GTEFHKTsKLQotCWlmKHN0cmxlbihhcmcpPjApCi0JCU5kaXNNb3ZlTWVtb3J5KHNyYywgYXJnLCBzdHJsZW4oYXJnKSk7Ci0JZWxzZQotCQlOZGlzTW92ZU1lbW9yeShzcmMsIEVGVVNFX0VFUFJPTV9ERUZVTFRfRklMRSwgc3RybGVuKEVGVVNFX0VFUFJPTV9ERUZVTFRfRklMRSkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZpbGVOYW1lPSVzXG4iLHNyYykpOwotCi0JUnRtcE9TRlNJbmZvQ2hhbmdlKCZvc2ZzSW5mbywgVFJVRSk7Ci0KLQlzcmNmID0gUnRtcE9TRmlsZU9wZW4oc3JjLCBPX1JET05MWSwgMCk7Ci0JaWYgKElTX0ZJTEVfT1BFTl9FUlIoc3JjZikpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gRXJyb3Igb3BlbmluZyBmaWxlICVzXG4iLCBzcmMpKTsKLQkJcmV0dmFsID0gRkFMU0U7Ci0JCWdvdG8gcmVjb3ZlckZTOwotCX0KLQllbHNlCi0JewotCQkvLyBUaGUgb2JqZWN0IG11c3QgaGF2ZSBhIHJlYWQgbWV0aG9kCi0JCXdoaWxlKFJ0bXBPU0ZpbGVSZWFkKHNyY2YsICZidWZmZXJbaV0sIDEpPT0xKQotCQl7Ci0JCWkrKzsKLQkJCWlmKGk+TUFYX0VFUFJPTV9CSU5fRklMRV9TSVpFKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIi0tPiBFcnJvciByZWFkaW5nIGZpbGUgJXMsIGZpbGUgc2l6ZSB0b28gbGFyZ2VbPiVkXVxuIiwgc3JjLCBNQVhfRUVQUk9NX0JJTl9GSUxFX1NJWkUpKTsKLQkJCQlyZXR2YWwgPSBGQUxTRTsKLQkJCQlnb3RvIGNsb3NlRmlsZTsKLQkJCX0KLQkJfQotCi0JCXJldHZhbCA9IFJ0bXBPU0ZpbGVDbG9zZShzcmNmKTsKLQkJaWYgKHJldHZhbCkKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBFcnJvciBjbG9zaW5nIGZpbGUgJXNcbiIsIHNyYykpOwotCX0KLQotCi0JUnRtcE9TRlNJbmZvQ2hhbmdlKCZvc2ZzSW5mbywgRkFMU0UpOwotCi0JZm9yKGo9MDtqPGk7aisrKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJTAyWCAiLGJ1ZmZlcltqXSYweGZmKSk7Ci0JCWlmKChqKzEpJTI9PTApCi0JCQlQREFUQVtqLzIlOF09KChidWZmZXJbal08PDgpJjB4ZmYwMCl8KGJ1ZmZlcltqLTFdJjB4ZmYpOwotCQlpZihqJTE2PT0wKQotCQl7Ci0JCQlrPWJ1ZmZlcltqXTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWsmPWJ1ZmZlcltqXTsKLQkJCWlmKChqKzEpJTE2PT0wKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiByZXN1bHQ9JTAyWCxibGs9JTAyeFxuIixrLGovMTYpKTsKLQkJCQlpZihrIT0weGZmKQotCQkJCQllRnVzZVdyaXRlUmVnaXN0ZXJzRnJvbUJpbihwQWQsKFVTSE9SVClqLTE1LCAxNiwgUERBVEEpOwotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWlmKGVGdXNlUmVhZFJlZ2lzdGVycyhwQWQsaiwgMiwoUFVTSE9SVCkmREFUQSkhPTB4M2YpCi0JCQkJCQllRnVzZVdyaXRlUmVnaXN0ZXJzRnJvbUJpbihwQWQsKFVTSE9SVClqLTE1LCAxNiwgUERBVEEpOwotCQkJCX0KLQkJCQkvKgotCQkJCWZvcihsPTA7bDw4O2wrKykKLQkJCQkJcHJpbnRrKCIlMDR4ICIsUERBVEFbbF0pOwotCQkJCXByaW50aygiXG4iKTsKLQkJCQkqLwotCQkJCU5kaXNaZXJvTWVtb3J5KFBEQVRBLDE2KTsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiBUUlVFOwotCi1jbG9zZUZpbGU6Ci0JaWYgKHNyY2YpCi0JCVJ0bXBPU0ZpbGVDbG9zZShzcmNmKTsKLQotcmVjb3ZlckZTOgotCVJ0bXBPU0ZTSW5mb0NoYW5nZSgmb3Nmc0luZm8sIEZBTFNFKTsKLQotCi0JaWYgKG1lbVB0cikKLQkJa2ZyZWUobWVtUHRyKTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLQotc3RhdGljIE5UU1RBVFVTIGVGdXNlV3JpdGVSZWdpc3RlcnNGcm9tQmluKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVCBPZmZzZXQsCi0JSU4JVVNIT1JUIExlbmd0aCwKLQlJTglVU0hPUlQqIHBEYXRhKQotewotCVVTSE9SVAlpOwotCVVTSE9SVAllRnVzZURhdGE7Ci0JVVNIT1JUCUxvZ2ljYWxBZGRyZXNzLCBCbGtOdW0gPSAweGZmZmY7Ci0JVUNIQVIJRUZTUk9NX0FPVVQsTG9vcD0wOwotCUVGVVNFX0NUUkxfU1RSVUMJCWVGdXNlQ3RybFN0cnVjOwotCVVTSE9SVAllZnVzZURhdGFPZmZzZXQ7Ci0JVUlOVDMyCWRhdGEsdGVtcGJ1ZmZlcjsKLQlVU0hPUlQgYWRkcix0bXBhZGRyLCBJbkJ1ZlszXSwgdG1wT2Zmc2V0OwotCVVJTlQzMiBidWZmZXJbNF07Ci0JQk9PTEVBTgkJYldyaXRlU3VjY2VzcyA9IFRSVUU7Ci0JQk9PTEVBTgkJYk5vdFdyaXRlPVRSVUU7Ci0JQk9PTEVBTgkJYkFsbG9jYXRlTmV3QmxrPVRSVUU7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJlRnVzZVdyaXRlUmVnaXN0ZXJzRnJvbUJpbiBPZmZzZXQ9JXgsIHBEYXRhPSUwNHg6JTA0eDolMDR4OiUwNHhcbiIsIE9mZnNldCwgKnBEYXRhLCoocERhdGErMSksKihwRGF0YSsyKSwqKHBEYXRhKzMpKSk7Ci0KLQlkbwotCXsKLQkvL1N0ZXAgMC4gZmluZCB0aGUgZW50cnkgaW4gdGhlIG1hcHBpbmcgdGFibGUKLQkvL1RoZSBhZGRyZXNzIG9mIEVFUFJPTSBpcyAyLWJ5dGVzIGFsaWdubWVudC4KLQkvL1RoZSBsYXN0IGJpdCBpcyB1c2VkIGZvciBhbGlnbm1lbnQsIHNvIGl0IG11c3QgYmUgMC4KLQlMb29wKys7Ci0JdG1wT2Zmc2V0ID0gT2Zmc2V0ICYgMHhmZmZlOwotCUVGU1JPTV9BT1VUID0gZUZ1c2VSZWFkUmVnaXN0ZXJzKHBBZCwgdG1wT2Zmc2V0LCAyLCAmZUZ1c2VEYXRhKTsKLQotCWlmKCBFRlNST01fQU9VVCA9PSAweDNmKQotCXsJLy9maW5kIGF2YWlsYWJsZSBsb2dpY2FsIGFkZHJlc3MgcG9pbnRlcgotCQkvL3RoZSBsb2dpY2FsIGFkZHJlc3MgZG9lcyBub3QgZXhpc3QsIGZpbmQgYW4gZW1wdHkgb25lCi0JCS8vZnJvbSB0aGUgZmlyc3QgYWRkcmVzcyBvZiBibG9jayA0NT0xNio0NT0weDJkMCB0byB0aGUgbGFzdCBhZGRyZXNzIG9mIGJsb2NrIDQ3Ci0JCS8vPT0+NDgqMTYtMyhyZXNlcnZlZCk9MkZDCi0JCWJBbGxvY2F0ZU5ld0Jsaz1UUlVFOwotCQlmb3IgKGk9RUZVU0VfVVNBR0VfTUFQX1NUQVJUOyBpPD1FRlVTRV9VU0FHRV9NQVBfRU5EOyBpKz0yKQotCQl7Ci0JCQkvL1JldHJpdmUgdGhlIGxvZ2ljYWwgYmxvY2sgbnVibWVyIGZvcm0gZWFjaCBsb2dpY2FsIGFkZHJlc3MgcG9pbnRlcgotCQkJLy9JdCB3aWxsIGFjY2VzcyB0d28gbG9naWNhbCBhZGRyZXNzIHBvaW50ZXIgZWFjaCB0aW1lLgotCQkJZUZ1c2VQaHlzaWNhbFJlYWRSZWdpc3RlcnMocEFkLCBpLCAyLCAmTG9naWNhbEFkZHJlc3MpOwotCQkJaWYoIChMb2dpY2FsQWRkcmVzcyAmIDB4ZmYpID09IDApCi0JCQl7Ly9Ob3QgdXNlZCBsb2dpY2FsIGFkZHJlc3MgcG9pbnRlcgotCQkJCUJsa051bSA9IGktRUZVU0VfVVNBR0VfTUFQX1NUQVJUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZigoIChMb2dpY2FsQWRkcmVzcyA+PiA4KSAmIDB4ZmYpID09IDApCi0JCQl7Ly9Ob3QgdXNlZCBsb2dpY2FsIGFkZHJlc3MgcG9pbnRlcgotCQkJCWlmIChpICE9IEVGVVNFX1VTQUdFX01BUF9FTkQpCi0JCQkJewotCQkJCQlCbGtOdW0gPSBpLUVGVVNFX1VTQUdFX01BUF9TVEFSVCsxOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JewotCQliQWxsb2NhdGVOZXdCbGs9RkFMU0U7Ci0JCUJsa051bSA9IEVGU1JPTV9BT1VUOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImVGdXNlV3JpdGVSZWdpc3RlcnMgQmxrTnVtID0gJWQgXG4iLCBCbGtOdW0pKTsKLQotCWlmKEJsa051bSA9PSAweGZmZmYpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJlRnVzZVdyaXRlUmVnaXN0ZXJzOiBvdXQgb2YgZnJlZSBFLWZ1c2Ugc3BhY2UhISFcbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQkvL1N0ZXAgMS4xLjAKLQkvL0lmIHRoZSBibG9jayBpcyBub3QgZXhpc3RpbmcgaW4gbWFwcGluZyB0YWJsZSwgY3JlYXRlIG9uZQotCS8vYW5kIHdyaXRlIGRvd24gdGhlIDE2LWJ5dGVzIGRhdGEgdG8gdGhlIG5ldyBibG9jawotCWlmKGJBbGxvY2F0ZU5ld0JsaykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFsbG9jYXRlIE5ldyBCbGtcbiIpKTsKLQkJZWZ1c2VEYXRhT2Zmc2V0ID0gIEVGVVNFX0RBVEEzOwotCQlmb3IoaT0wOyBpPCA0OyBpKyspCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFsbG9jYXRlIE5ldyBCbGssIERhdGElZD0lMDR4JTA0eFxuIiwzLWkscERhdGFbMippKzFdLHBEYXRhWzIqaV0pKTsKLQkJCXRlbXBidWZmZXI9KChwRGF0YVsyKmkrMV08PDE2KSYweGZmZmYwMDAwKXxwRGF0YVsyKmldOwotCi0KLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIGVmdXNlRGF0YU9mZnNldCx0ZW1wYnVmZmVyKTsKLQkJCWVmdXNlRGF0YU9mZnNldCAtPSA0OwotCi0JCX0KLQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCQkvL1N0ZXAxLjEuMS4gV3JpdGUgMTAtYml0IG9mIGFkZHJlc3MgdG8gRUZTUk9NX0FJTiAoMHg1ODAsIGJpdDI1OmJpdDE2KS4gVGhlIGFkZHJlc3MgbXVzdCBiZSAxNi1ieXRlIGFsaWdubWVudC4KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAmZUZ1c2VDdHJsU3RydWMud29yZCk7Ci0JCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9BSU4gPSBCbGtOdW0qIDB4MTAgOwotCi0JCS8vU3RlcDEuMS4yLiBXcml0ZSBFRlNST01fTU9ERSAoMHg1ODAsIGJpdDc6Yml0NikgdG8gMy4KLQkJZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX01PREUgPSAzOwotCi0JCS8vU3RlcDEuMS4zLiBXcml0ZSBFRlNST01fS0lDSyAoMHg1ODAsIGJpdDMwKSB0byAxIHRvIGtpY2stb2ZmIHBoeXNpY2FsIHdyaXRlIHByb2NlZHVyZS4KLQkJZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPSAxOwotCi0JCU5kaXNNb3ZlTWVtb3J5KCZkYXRhLCAmZUZ1c2VDdHJsU3RydWMsIDQpOwotCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVGVVNFX0NUUkwsIGRhdGEpOwotCi0JCS8vU3RlcDEuMS40LiBQb2xsaW5nIEVGU1JPTV9LSUNLKDB4NTgwLCBiaXQzMCkgdW50aWwgaXQgYmVjb21lIDAgYWdhaW4uIEl077+977+9cyBkb25lLgotCQlpID0gMDsKLQkJd2hpbGUoaSA8IDEwMCkKLQkJewotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAoUFVJTlQzMikgJmVGdXNlQ3RybFN0cnVjKTsKLQotCQkJaWYoZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPT0gMCkKLQkJCQlicmVhazsKLQotCQkJUlRNUHVzZWNEZWxheSgyKTsKLQkJCWkrKzsKLQkJfQotCi0JfQotCWVsc2UKLQl7CS8vU3RlcDEuMi4KLQkJLy9JZiB0aGUgc2FtZSBsb2dpY2FsIG51bWJlciBpcyBleGlzdGluZywgY2hlY2sgaWYgdGhlIHdyaXR0aW5nIGRhdGEgYW5kIHRoZSBkYXRhCi0JCS8vc2F2aW5nIGluIHRoaXMgYmxvY2sgYXJlIHRoZSBzYW1lLgotCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkvL3JlYWQgY3VycmVudCB2YWx1ZXMgb2YgMTYtYnl0ZSBibG9jawotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVGVVNFX0NUUkwsICZlRnVzZUN0cmxTdHJ1Yy53b3JkKTsKLQotCQkvL1N0ZXAxLjIuMC4gV3JpdGUgMTAtYml0IG9mIGFkZHJlc3MgdG8gRUZTUk9NX0FJTiAoMHg1ODAsIGJpdDI1OmJpdDE2KS4gVGhlIGFkZHJlc3MgbXVzdCBiZSAxNi1ieXRlIGFsaWdubWVudC4KLQkJZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0FJTiA9IE9mZnNldCAmIDB4ZmZmMDsKLQotCQkvL1N0ZXAxLjIuMS4gV3JpdGUgRUZTUk9NX01PREUgKDB4NTgwLCBiaXQ3OmJpdDYpIHRvIDEuCi0JCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9NT0RFID0gMDsKLQotCQkvL1N0ZXAxLjIuMi4gV3JpdGUgRUZTUk9NX0tJQ0sgKDB4NTgwLCBiaXQzMCkgdG8gMSB0byBraWNrLW9mZiBwaHlzaWNhbCByZWFkIHByb2NlZHVyZS4KLQkJZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPSAxOwotCi0JCU5kaXNNb3ZlTWVtb3J5KCZkYXRhLCAmZUZ1c2VDdHJsU3RydWMsIDQpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRlVTRV9DVFJMLCBkYXRhKTsKLQotCQkvL1N0ZXAxLjIuMy4gUG9sbGluZyBFRlNST01fS0lDSygweDU4MCwgYml0MzApIHVudGlsIGl0IGJlY29tZSAwIGFnYWluLgotCQlpID0gMDsKLQkJd2hpbGUoaSA8IDUwMCkKLQkJewotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAoUFVJTlQzMikgJmVGdXNlQ3RybFN0cnVjKTsKLQotCQkJaWYoZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPT0gMCkKLQkJCQlicmVhazsKLQkJCVJUTVB1c2VjRGVsYXkoMik7Ci0JCQlpKys7Ci0JCX0KLQotCQkvL1N0ZXAxLjIuNC4gUmVhZCAxNi1ieXRlIG9mIGRhdGEgZnJvbSBFRlVTRV9EQVRBMC0zICgweDU5Qy0weDU5MCkKLQkJZWZ1c2VEYXRhT2Zmc2V0ID0gIEVGVVNFX0RBVEEzOwotCQlmb3IoaT0wOyBpPCA0OyBpKyspCi0JCXsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgZWZ1c2VEYXRhT2Zmc2V0LCAoUFVJTlQzMikgJmJ1ZmZlcltpXSk7Ci0JCQllZnVzZURhdGFPZmZzZXQgLT0gIDQ7Ci0JCX0KLQkJLy9TdGVwMS4yLjUuIENoZWNrIGlmIHRoZSBkYXRhIG9mIGVmdXNlIGFuZCB0aGUgd3JpdGluZyBkYXRhIGFyZSB0aGUgc2FtZS4KLQkJZm9yKGkgPTA7IGk8NDsgaSsrKQotCQl7Ci0JCQl0ZW1wYnVmZmVyPSgocERhdGFbMippKzFdPDwxNikmMHhmZmZmMDAwMCl8cERhdGFbMippXTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImJ1ZmZlclslZF09JXgscERhdGFbJWRdPSV4LHBEYXRhWyVkXT0leCx0ZW1wYnVmZmVyPSV4XG4iLGksYnVmZmVyW2ldLDIqaSxwRGF0YVsyKmldLDIqaSsxLHBEYXRhWzIqaSsxXSx0ZW1wYnVmZmVyKSk7Ci0KLQkJCWlmKCgoYnVmZmVyW2ldJjB4ZmZmZjAwMDApPT0ocERhdGFbMippKzFdPDwxNikpJiYoKGJ1ZmZlcltpXSYweGZmZmYpPT1wRGF0YVsyKmldKSkKLQkJCQliTm90V3JpdGUmPVRSVUU7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJYk5vdFdyaXRlJj1GQUxTRTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZighYk5vdFdyaXRlKQotCQl7Ci0JCXByaW50aygiVGhlIGRhdGEgaXMgbm90IHRoZSBzYW1lXG4iKTsKLQotCQkJZm9yKGkgPTA7IGk8ODsgaSsrKQotCQkJewotCQkJCWFkZHIgPSBCbGtOdW0gKiAweDEwIDsKLQotCQkJCUluQnVmWzBdID0gYWRkcisyKmk7Ci0JCQkJSW5CdWZbMV0gPSAyOwotCQkJCUluQnVmWzJdID0gcERhdGFbaV07Ci0KLQkJCQllRnVzZVdyaXRlUGh5c2ljYWwocEFkLCAmSW5CdWZbMF0sIDYsIE5VTEwsIDIpOwotCQkJfQotCi0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIFRSVUU7Ci0JICAgICB9Ci0KLQotCi0JCS8vU3RlcCAyLiBXcml0ZSBtYXBwaW5nIHRhYmxlCi0JCWFkZHIgPSBFRlVTRV9VU0FHRV9NQVBfU1RBUlQrQmxrTnVtOwotCi0JCXRtcGFkZHIgPSBhZGRyOwotCi0JCWlmKGFkZHIgJSAyICE9IDApCi0JCQlhZGRyID0gYWRkciAtMTsKLQkJSW5CdWZbMF0gPSBhZGRyOwotCQlJbkJ1ZlsxXSA9IDI7Ci0KLQkJLy9jb252ZXJ0IHRoZSBhZGRyZXNzIGZyb20gMTAgdG8gOCBiaXQgKCBiaXQ3LCA2ID0gcGFyaXR5IGFuZCBiaXQ1IH4gMCA9IGJpdDl+NCksIGFuZCB3cml0ZSB0byBsb2dpY2FsIG1hcCBlbnRyeQotCQl0bXBPZmZzZXQgPSBPZmZzZXQ7Ci0JCXRtcE9mZnNldCA+Pj0gNDsKLQkJdG1wT2Zmc2V0IHw9ICgofigodG1wT2Zmc2V0ICYgMHgwMSkgXiAoIHRtcE9mZnNldCA+PiAxICYgMHgwMSkgXiAgKHRtcE9mZnNldCA+PiAyICYgMHgwMSkgXiAgKHRtcE9mZnNldCA+PiAzICYgMHgwMSkpKSA8PCA2KSAmIDB4NDA7Ci0JCXRtcE9mZnNldCB8PSAoKH4oICh0bXBPZmZzZXQgPj4gMiAmIDB4MDEpIF4gKHRtcE9mZnNldCA+PiAzICYgMHgwMSkgXiAodG1wT2Zmc2V0ID4+IDQgJiAweDAxKSBeICggdG1wT2Zmc2V0ID4+IDUgJiAweDAxKSkpIDw8IDcpICYgMHg4MDsKLQotCQkvLyB3cml0ZSB0aGUgbG9naWNhbCBhZGRyZXNzCi0JCWlmKHRtcGFkZHIlMiAhPSAwKQotCQkJSW5CdWZbMl0gPSB0bXBPZmZzZXQ8PDg7Ci0JCWVsc2UKLQkJCUluQnVmWzJdID0gdG1wT2Zmc2V0OwotCi0JCWVGdXNlV3JpdGVQaHlzaWNhbChwQWQsJkluQnVmWzBdLCA2LCBOVUxMLCAwKTsKLQotCQkvL1N0ZXAgMy4gQ29tcGFyZSBkYXRhIGlmIG5vdCB0aGUgc2FtZSwgaW52YWxpZGF0ZSB0aGUgbWFwcGluZyBlbnRyeSwgdGhlbiByZS13cml0ZSB0aGUgZGF0YSB1bnRpbCBFLWZ1c2UgaXMgZXhoYXVzdGVkCi0JCWJXcml0ZVN1Y2Nlc3MgPSBUUlVFOwotCQlmb3IoaSA9MDsgaTw4OyBpKyspCi0JCXsKLQkJCWFkZHIgPSBCbGtOdW0gKiAweDEwIDsKLQotCQkJSW5CdWZbMF0gPSBhZGRyKzIqaTsKLQkJCUluQnVmWzFdID0gMjsKLQkJCUluQnVmWzJdID0gMHgwOwotCi0JCQllRnVzZVJlYWRQaHlzaWNhbChwQWQsICZJbkJ1ZlswXSwgNCwgJkluQnVmWzJdLCAyKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImFkZHI9JXgsIGJ1ZmZlcltpXT0leCxJbkJ1ZlsyXT0leFxuIixJbkJ1ZlswXSxwRGF0YVtpXSxJbkJ1ZlsyXSkpOwotCQkJaWYocERhdGFbaV0gIT0gSW5CdWZbMl0pCi0JCQl7Ci0JCQkJYldyaXRlU3VjY2VzcyA9IEZBTFNFOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJLy9TdGVwIDQuIGludmxpZGF0ZSBtYXBwaW5nIGVudHJ5IGFuZCBmaW5kIGEgZnJlZSBtYXBwaW5nIGVudHJ5IGlmIG5vdCBzdWNjZWVkCi0KLQkJaWYgKCFiV3JpdGVTdWNjZXNzJiZMb29wPDIpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImVGdXNlV3JpdGVSZWdpc3RlcnNGcm9tQmluOjpOb3QgYldyaXRlU3VjY2VzcyBCbGtOdW0gPSAlZFxuIiwgQmxrTnVtKSk7Ci0KLQkJCS8vIHRoZSBvZmZzZXQgb2YgY3VycmVudCBtYXBwaW5nIGVudHJ5Ci0JCQlhZGRyID0gRUZVU0VfVVNBR0VfTUFQX1NUQVJUK0Jsa051bTsKLQotCQkJLy9maW5kIGEgbmV3IG1hcHBpbmcgZW50cnkKLQkJCUJsa051bSA9IDB4ZmZmZjsKLQkJCWZvciAoaT1FRlVTRV9VU0FHRV9NQVBfU1RBUlQ7IGk8PUVGVVNFX1VTQUdFX01BUF9FTkQ7IGkrPTIpCi0JCQl7Ci0JCQkJZUZ1c2VQaHlzaWNhbFJlYWRSZWdpc3RlcnMocEFkLCBpLCAyLCAmTG9naWNhbEFkZHJlc3MpOwotCQkJCWlmKCAoTG9naWNhbEFkZHJlc3MgJiAweGZmKSA9PSAwKQotCQkJCXsKLQkJCQkJQmxrTnVtID0gaS1FRlVTRV9VU0FHRV9NQVBfU1RBUlQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQllbHNlIGlmKCggKExvZ2ljYWxBZGRyZXNzID4+IDgpICYgMHhmZikgPT0gMCkKLQkJCQl7Ci0JCQkJCWlmIChpICE9IEVGVVNFX1VTQUdFX01BUF9FTkQpCi0JCQkJCXsKLQkJCQkJCUJsa051bSA9IGkrMS1FRlVTRV9VU0FHRV9NQVBfU1RBUlQ7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZUZ1c2VXcml0ZVJlZ2lzdGVyc0Zyb21CaW46Ok5vdCBiV3JpdGVTdWNjZXNzIG5ldyBCbGtOdW0gPSAlZFxuIiwgQmxrTnVtKSk7Ci0JCQlpZihCbGtOdW0gPT0gMHhmZmZmKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImVGdXNlV3JpdGVSZWdpc3RlcnNGcm9tQmluOiBvdXQgb2YgZnJlZSBFLWZ1c2Ugc3BhY2UhISFcbiIpKTsKLQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQl9Ci0KLQkJCS8vaW52YWxpZGF0ZSB0aGUgb3JpZ2luYWwgbWFwcGluZyBlbnRyeSBpZiBuZXcgZW50cnkgaXMgbm90IGZvdW5kCi0JCQl0bXBhZGRyID0gYWRkcjsKLQotCQkJaWYoYWRkciAlIDIgIT0gMCkKLQkJCQlhZGRyID0gYWRkciAtMTsKLQkJCUluQnVmWzBdID0gYWRkcjsKLQkJCUluQnVmWzFdID0gMjsKLQotCQkJZUZ1c2VSZWFkUGh5c2ljYWwocEFkLCAmSW5CdWZbMF0sIDQsICZJbkJ1ZlsyXSwgMik7Ci0KLQkJCS8vIHdyaXRlIHRoZSBsb2dpY2FsIGFkZHJlc3MKLQkJCWlmKHRtcGFkZHIlMiAhPSAwKQotCQkJewotCQkJCS8vIEludmFsaWRhdGUgdGhlIGhpZ2ggYnl0ZQotCQkJCWZvciAoaT04OyBpPDE1OyBpKyspCi0JCQkJewotCQkJCQlpZiggKCAoSW5CdWZbMl0gPj4gaSkgJiAweDAxKSA9PSAwKQotCQkJCQl7Ci0JCQkJCQlJbkJ1ZlsyXSB8PSAoMHgxIDw8aSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyBpbnZhbGlkYXRlIHRoZSBsb3cgYnl0ZQotCQkJCWZvciAoaT0wOyBpPDg7IGkrKykKLQkJCQl7Ci0JCQkJCWlmKCAoIChJbkJ1ZlsyXSA+PiBpKSAmIDB4MDEpID09IDApCi0JCQkJCXsKLQkJCQkJCUluQnVmWzJdIHw9ICgweDEgPDxpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZUZ1c2VXcml0ZVBoeXNpY2FsKHBBZCwgJkluQnVmWzBdLCA2LCBOVUxMLCAwKTsKLQkJfQotCi0JfQotCXdoaWxlKCFiV3JpdGVTdWNjZXNzJiZMb29wPDIpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotaW50IHJ0bXBfZWVfZWZ1c2VfcmVhZDE2KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFVTSE9SVCBPZmZzZXQsCi0JT1VUIFVTSE9SVCAqcFZhbHVlKQotewotCWlmKHBBZC0+YkZyb2NlRUVQUk9NQnVmZmVyIHx8IHBBZC0+YkVFUFJPTUZpbGUpCi0JewotCSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgICgiUmVhZCBmcm9tIEVFUFJPTSBCdWZmZXJcbiIpKTsKLQkgICAgTmRpc01vdmVNZW1vcnkocFZhbHVlLCAmKHBBZC0+RUVQUk9NSW1hZ2VbT2Zmc2V0XSksIDIpOwotCX0KLQllbHNlCi0JICAgIGVGdXNlUmVhZFJlZ2lzdGVycyhwQWQsIE9mZnNldCwgMiwgcFZhbHVlKTsKLQlyZXR1cm4gKCpwVmFsdWUpOwotfQotCi0KLWludCBydG1wX2VlX2VmdXNlX3dyaXRlMTYoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gVVNIT1JUIE9mZnNldCwKLQlJTiBVU0hPUlQgZGF0YSkKLXsKLSAgICBpZihwQWQtPmJGcm9jZUVFUFJPTUJ1ZmZlcnx8cEFkLT5iRUVQUk9NRmlsZSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAgKCJXcml0ZSB0byBFRVBST00gQnVmZmVyXG4iKSk7Ci0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KCYocEFkLT5FRVBST01JbWFnZVtPZmZzZXRdKSwgJmRhdGEsIDIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIGVGdXNlV3JpdGVSZWdpc3RlcnMocEFkLCBPZmZzZXQsIDIsICZkYXRhKTsKLQlyZXR1cm4gMDsKLX0KLQotCi1pbnQgUnRtcEVmdXNlU3VwcG9ydENoZWNrKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKQotewotCVVTSE9SVCB2YWx1ZTsKLQotCWlmIChJU19SVDMweHgocEFkKSkKLQl7Ci0JCWVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKHBBZCwgRUZVU0VfVEFHLCAyLCAmdmFsdWUpOwotCQlwQWQtPkVGdXNlVGFnID0gKHZhbHVlICYgMHhmZik7Ci0JfQotCXJldHVybiAwOwotfQotCi1JTlQgc2V0X2VGdXNlQnVmZmVyTW9kZVdyaXRlQmFja19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUlOVCBFbmFibGU7Ci0KLQotCWlmKHN0cmxlbihhcmcpPjApCi0JewotCQlFbmFibGU9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxNik7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOwotCWlmKEVuYWJsZT09MSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInNldF9lRnVzZUJ1ZmZlck1vZGVfUHJvYzo6IENhbGwgV1JJVEVFRVBST01CVUYiKSk7Ci0JCWVGdXNlV3JpdGVFZWVwcHJvbUJ1ZihwQWQpOwotCX0KLQllbHNlCi0JCXJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJTG9hZCBFRVBST00gZnJvbSBiaW4gZmlsZSBmb3IgZUZ1c2UgbW9kZQotCi0JQXJndW1lbnRzOgotCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlORElTX1NUQVRVU19TVUNDRVNTICAgICAgICAgZmlybXdhcmUgaW1hZ2UgbG9hZCBvawotCQlORElTX1NUQVRVU19GQUlMVVJFICAgICAgICAgaW1hZ2Ugbm90IGZvdW5kCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIGVGdXNlTG9hZEVFUFJPTSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlQU1RSSU5HCQkJCQlzcmMgPSBOVUxMOwotCUlOVAkJCQkJCXJldHZhbDsKLQlSVE1QX09TX0ZECQkJCXNyY2Y7Ci0JUlRNUF9PU19GU19JTkZPCQkJb3NGU0luZm87Ci0KLQotCXNyYz1FRlVTRV9CVUZGRVJfUEFUSDsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGaWxlTmFtZT0lc1xuIixzcmMpKTsKLQotCi0JUnRtcE9TRlNJbmZvQ2hhbmdlKCZvc0ZTSW5mbywgVFJVRSk7Ci0KLQlpZiAoc3JjICYmICpzcmMpCi0JewotCQlzcmNmID0gUnRtcE9TRmlsZU9wZW4oc3JjLCBPX1JET05MWSwgMCk7Ci0JCWlmIChJU19GSUxFX09QRU5fRVJSKHNyY2YpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsIC1QVFJfRVJSKHNyY2YpLHNyYykpOwotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0JCWVsc2UKLQkJewotCi0JCQkJbWVtc2V0KHBBZC0+RUVQUk9NSW1hZ2UsIDB4MDAsIE1BWF9FRVBST01fQklOX0ZJTEVfU0laRSk7Ci0KLQotCQkJcmV0dmFsID1SdG1wT1NGaWxlUmVhZChzcmNmLCAoUFNUUklORylwQWQtPkVFUFJPTUltYWdlLCBNQVhfRUVQUk9NX0JJTl9GSUxFX1NJWkUpOwotCQkJaWYgKHJldHZhbCA+IDApCi0JCQkJCQkJewotCQkJCVJUTVBTZXRQcm9maWxlUGFyYW1ldGVycyhwQWQsIChQU1RSSU5HKXBBZC0+RUVQUk9NSW1hZ2UpOwotCQkJCXJldHZhbCA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUmVhZCBmaWxlIFwiJXNcIiBmYWlsZWQoZXJyQ29kZT0lZCkhXG4iLCBzcmMsIHJldHZhbCkpOwotCi0JCX0KLQotCi0JfQotCWVsc2UKLQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gRXJyb3Igc3JjICBvciBzcmNmIGlzIG51bGxcbiIpKTsKLQkJCQkJcmV0dXJuIEZBTFNFOwotCi0JCX0KLQotCXJldHZhbD1SdG1wT1NGaWxlQ2xvc2Uoc3JjZik7Ci0KLQlpZiAocmV0dmFsKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEVycm9yICVkIGNsb3NpbmcgJXNcbiIsIC1yZXR2YWwsIHNyYykpOwotCX0KLQotCi0JUnRtcE9TRlNJbmZvQ2hhbmdlKCZvc0ZTSW5mbywgRkFMU0UpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVCBlRnVzZVdyaXRlRWVlcHByb21CdWYoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0KLQlQU1RSSU5HCQkJCQlzcmMgPSBOVUxMOwotCUlOVAkJCQkJCXJldHZhbDsKLQlSVE1QX09TX0ZECQkJCXNyY2Y7Ci0JUlRNUF9PU19GU19JTkZPCQkJb3NGU0luZm87Ci0KLQotCXNyYz1FRlVTRV9CVUZGRVJfUEFUSDsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGaWxlTmFtZT0lc1xuIixzcmMpKTsKLQotCVJ0bXBPU0ZTSW5mb0NoYW5nZSgmb3NGU0luZm8sIFRSVUUpOwotCi0KLQotCWlmIChzcmMgJiYgKnNyYykKLQl7Ci0JCXNyY2YgPSBSdG1wT1NGaWxlT3BlbihzcmMsIE9fV1JPTkxZfE9fQ1JFQVQsIDApOwotCi0JCWlmIChJU19GSUxFX09QRU5fRVJSKHNyY2YpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsIC1QVFJfRVJSKHNyY2YpLHNyYykpOwotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0JCWVsc2UKLQkJewotLyoKLQkJCS8vIFRoZSBvYmplY3QgbXVzdCBoYXZlIGEgcmVhZCBtZXRob2QKLQkJCWlmIChzcmNmLT5mX29wICYmIHNyY2YtPmZfb3AtPndyaXRlKQotCQkJewotCQkJCS8vIFRoZSBvYmplY3QgbXVzdCBoYXZlIGEgcmVhZCBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY2YtPmZfb3AtPndyaXRlKHNyY2YsIHBBZC0+RUVQUk9NSW1hZ2UsIDEwMjQsICZzcmNmLT5mX3Bvcyk7Ci0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIi0tPiBFcnJvciEhIFN5c3RlbSBkb2VzdCBub3Qgc3VwcG9ydCByZWFkIGZ1bmN0aW9uXG4iKSk7Ci0JCQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQl9Ci0qLwotCi0JCQlSdG1wT1NGaWxlV3JpdGUoc3JjZiwgKFBTVFJJTkcpcEFkLT5FRVBST01JbWFnZSxNQVhfRUVQUk9NX0JJTl9GSUxFX1NJWkUpOwotCi0JCX0KLQotCi0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIi0tPiBFcnJvciBzcmMgIG9yIHNyY2YgaXMgbnVsbFxuIikpOwotCQlyZXR1cm4gRkFMU0U7Ci0KLQl9Ci0KLQlyZXR2YWw9UnRtcE9TRmlsZUNsb3NlKHNyY2YpOwotCi0JaWYgKHJldHZhbCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBFcnJvciAlZCBjbG9zaW5nICVzXG4iLCAtcmV0dmFsLCBzcmMpKTsKLQl9Ci0KLQlSdG1wT1NGU0luZm9DaGFuZ2UoJm9zRlNJbmZvLCBGQUxTRSk7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotVk9JRCBlRnVzZUdldEZyZWVCbG9ja0NvdW50KElOIFBSVE1QX0FEQVBURVIgcEFkLAotCVBVSU5UIEVmdXNlRnJlZUJsb2NrKQotewotCVVTSE9SVCBpOwotCVVTSE9SVAlMb2dpY2FsQWRkcmVzczsKLQlpZighcEFkLT5iVXNlRWZ1c2UpCi0JCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJlRnVzZUdldEZyZWVCbG9ja0NvdW50IE9ubHkgc3VwcG9ydHMgZWZ1c2UgTW9kZVxuIikpOwotCQlyZXR1cm4gOwotCQl9Ci0JZm9yIChpID0gRUZVU0VfVVNBR0VfTUFQX1NUQVJUOyBpIDw9IEVGVVNFX1VTQUdFX01BUF9FTkQ7IGkrPTIpCi0JewotCQllRnVzZVBoeXNpY2FsUmVhZFJlZ2lzdGVycyhwQWQsIGksIDIsICZMb2dpY2FsQWRkcmVzcyk7Ci0JCWlmKCAoTG9naWNhbEFkZHJlc3MgJiAweGZmKSA9PSAwKQotCQl7Ci0JCQkqRWZ1c2VGcmVlQmxvY2s9IChVQ0hBUikgKEVGVVNFX1VTQUdFX01BUF9FTkQtaSsxKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWVsc2UgaWYoKCAoTG9naWNhbEFkZHJlc3MgPj4gOCkgJiAweGZmKSA9PSAwKQotCQl7Ci0JCQkqRWZ1c2VGcmVlQmxvY2sgPSAoVUNIQVIpIChFRlVTRV9VU0FHRV9NQVBfRU5ELWkpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZihpID09IEVGVVNFX1VTQUdFX01BUF9FTkQpCi0JCQkqRWZ1c2VGcmVlQmxvY2sgPSAwOwotCX0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoImVGdXNlR2V0RnJlZUJsb2NrQ291bnQgaXMgMHgleFxuIiwqRWZ1c2VGcmVlQmxvY2spKTsKLX0KLQotSU5UIGVGdXNlX2luaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JVUlOVAlFZnVzZUZyZWVCbG9jaz0wOwotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk5WTSBpcyBFZnVzZSBhbmQgaXRzIHNpemUgPSV4WyV4LSV4XSBcbiIsRUZVU0VfVVNBR0VfTUFQX1NJWkUsRUZVU0VfVVNBR0VfTUFQX1NUQVJULEVGVVNFX1VTQUdFX01BUF9FTkQpKTsKLQllRnVzZUdldEZyZWVCbG9ja0NvdW50KHBBZCwgJkVmdXNlRnJlZUJsb2NrKTsKLQkvL0lmIHRoZSB1c2VkIGJsb2NrIG9mIGVmdXNlIGlzIGxlc3MgdGhhbiA1LiBXZSBhc3N1bWUgdGhlIGRlZmF1bHQgdmFsdWUKLQkvLyBvZiB0aGlzIGVmdXNlIGlzIGVtcHR5IGFuZCBjaGFuZ2UgdG8gdGhlIGJ1ZmZlciBtb2RlIGluIG9kcmRlciB0bwotCS8vYnJpbmcgdXAgaW50ZXJmYWNlcyBzdWNjZXNzZnVsbHkuCi0JaWYoRWZ1c2VGcmVlQmxvY2sgPiAoRUZVU0VfVVNBR0VfTUFQX0VORC01KSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk5WTSBpcyBFZnVzZSBhbmQgdGhlIGluZm9ybWF0aW9uIGlzIHRvbyBsZXNzIHRvIGJyaW5nIHVwIGludGVyZmFjZS4gRm9yY2UgdG8gdXNlIEVFUFJPTSBCdWZmZXIgTW9kZVxuIikpOwotCQlwQWQtPmJGcm9jZUVFUFJPTUJ1ZmZlciA9IFRSVUU7Ci0JCWVGdXNlTG9hZEVFUFJPTShwQWQpOwotCX0KLQllbHNlCi0JCXBBZC0+YkZyb2NlRUVQUk9NQnVmZmVyID0gRkFMU0U7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTlZNIGlzIEVmdXNlIGFuZCBmb3JjZSB0byB1c2UgRUVQUk9NIEJ1ZmZlciBNb2RlPSV4XG4iLHBBZC0+YkZyb2NlRUVQUk9NQnVmZmVyKSk7Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2VlX3Byb20uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2VlX3Byb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUxY2ZkZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9lZV9wcm9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQllZV9wcm9tLmMKLQotCUFic3RyYWN0OgotCU1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLQktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi0vLyBJUlFMID0gUEFTU0lWRV9MRVZFTAotc3RhdGljIGlubGluZSBWT0lEIFJhaXNlQ2xvY2soCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCi0gICAgSU4gIFVJTlQzMiAqeCkKLXsKLQkqeCA9ICp4IHwgRUVTSzsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCAqeCk7Ci0JUlRNUHVzZWNEZWxheSgxKTsJCQkJLy8gTWF4IGZyZXF1ZW5jeSA9IDFNSHogaW4gU3BlYy4gZGVmaW5pdGlvbgotfQotCi0vLyBJUlFMID0gUEFTU0lWRV9MRVZFTAotc3RhdGljIGlubGluZSBWT0lEIExvd2VyQ2xvY2soCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCi0gICAgSU4gIFVJTlQzMiAqeCkKLXsKLQkqeCA9ICp4ICYgfkVFU0s7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgKngpOwotCVJUTVB1c2VjRGVsYXkoMSk7Ci19Ci0KLS8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCi1zdGF0aWMgaW5saW5lIFVTSE9SVCBTaGlmdEluQml0cygKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVSU5UMzIJCXgsaTsKLQlVU0hPUlQgICAgICBkYXRhPTA7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKLQotCXggJj0gfiggRUVETyB8IEVFREkpOwotCi0JZm9yKGk9MDsgaTwxNjsgaSsrKQotCXsKLQkJZGF0YSA9IGRhdGEgPDwgMTsKLQkJUmFpc2VDbG9jayhwQWQsICZ4KTsKLQotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKLQkJTG93ZXJDbG9jayhwQWQsICZ4KTsgLy9wcmV2ZW50IHJlYWQgZmFpbGVkCi0KLQkJeCAmPSB+KEVFREkpOwotCQlpZih4ICYgRUVETykKLQkJICAgIGRhdGEgfD0gMTsKLQl9Ci0KLQlyZXR1cm4gZGF0YTsKLX0KLQotCi0vLyBJUlFMID0gUEFTU0lWRV9MRVZFTAotc3RhdGljIGlubGluZSBWT0lEIFNoaWZ0T3V0Qml0cygKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVU0hPUlQJCQlkYXRhLAotCUlOIFVTSE9SVAkJCWNvdW50KQotewotCVVJTlQzMiAgICAgICB4LG1hc2s7Ci0KLQltYXNrID0gMHgwMSA8PCAoY291bnQgLSAxKTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKLQotCXggJj0gfihFRURPIHwgRUVESSk7Ci0KLQlkbwotCXsKLQkgICAgeCAmPSB+RUVESTsKLQkgICAgaWYoZGF0YSAmIG1hc2spCQl4IHw9IEVFREk7Ci0KLQkgICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7Ci0KLQkgICAgUmFpc2VDbG9jayhwQWQsICZ4KTsKLQkgICAgTG93ZXJDbG9jayhwQWQsICZ4KTsKLQotCSAgICBtYXNrID0gbWFzayA+PiAxOwotCX0gd2hpbGUobWFzayk7Ci0KLQl4ICY9IH5FRURJOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOwotfQotCi0KLS8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCi1zdGF0aWMgaW5saW5lIFZPSUQgRUVwcm9tQ2xlYW51cCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVSU5UMzIgeDsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOwotCi0JeCAmPSB+KEVFQ1MgfCBFRURJKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKLQotCVJhaXNlQ2xvY2socEFkLCAmeCk7Ci0JTG93ZXJDbG9jayhwQWQsICZ4KTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIFZPSUQgRVdFTigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVSU5UMzIJeDsKLQotCS8vIHJlc2V0IGJpdHMgYW5kIHNldCBFRUNTCi0JUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7Ci0JeCAmPSB+KEVFREkgfCBFRURPIHwgRUVTSyk7Ci0JeCB8PSBFRUNTOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOwotCi0JLy8ga2ljayBhIHB1bHNlCi0JUmFpc2VDbG9jayhwQWQsICZ4KTsKLQlMb3dlckNsb2NrKHBBZCwgJngpOwotCi0JLy8gb3V0cHV0IHRoZSByZWFkX29wY29kZSBhbmQgc2l4IHB1bHNlIGluIHRoYXQgb3JkZXIKLQlTaGlmdE91dEJpdHMocEFkLCBFRVBST01fRVdFTl9PUENPREUsIDUpOwotCVNoaWZ0T3V0Qml0cyhwQWQsIDAsIDYpOwotCi0JRUVwcm9tQ2xlYW51cChwQWQpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgVk9JRCBFV0RTKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotCVVJTlQzMgl4OwotCi0JLy8gcmVzZXQgYml0cyBhbmQgc2V0IEVFQ1MKLQlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKLQl4ICY9IH4oRUVESSB8IEVFRE8gfCBFRVNLKTsKLQl4IHw9IEVFQ1M7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7Ci0KLQkvLyBraWNrIGEgcHVsc2UKLQlSYWlzZUNsb2NrKHBBZCwgJngpOwotCUxvd2VyQ2xvY2socEFkLCAmeCk7Ci0KLQkvLyBvdXRwdXQgdGhlIHJlYWRfb3Bjb2RlIGFuZCBzaXggcHVsc2UgaW4gdGhhdCBvcmRlcgotCVNoaWZ0T3V0Qml0cyhwQWQsIEVFUFJPTV9FV0RTX09QQ09ERSwgNSk7Ci0JU2hpZnRPdXRCaXRzKHBBZCwgMCwgNik7Ci0KLQlFRXByb21DbGVhbnVwKHBBZCk7Ci19Ci0KLQotLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLWludCBydG1wX2VlX3Byb21fcmVhZDE2KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVTSE9SVAkJCU9mZnNldCwKLQlPVVQgVVNIT1JUCQkJKnBWYWx1ZSkKLXsKLQlVSU5UMzIJCXg7Ci0JVVNIT1JUCQlkYXRhOwotCi0jaWZkZWYgUlQzMHh4Ci0jaWZkZWYgQU5UX0RJVkVSU0lUWV9TVVBQT1JUCi0JaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5BbnREaXZlcnNpdHkpCi0JewotCQlwQWQtPkVlcHJvbUFjY2VzcyA9IFRSVUU7Ci0JfQotI2VuZGlmIC8vIEFOVF9ESVZFUlNJVFlfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFJUMzB4eCAvLwotCi0JT2Zmc2V0IC89IDI7Ci0JLy8gcmVzZXQgYml0cyBhbmQgc2V0IEVFQ1MKLQlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKLQl4ICY9IH4oRUVESSB8IEVFRE8gfCBFRVNLKTsKLQl4IHw9IEVFQ1M7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7Ci0KLQkvLyBwYXRjaCBjYW4gbm90IGFjY2VzcyBlLUZ1c2UgaXNzdWUKLQlpZiAoIShJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkpCi0JewotCQkvLyBraWNrIGEgcHVsc2UKLQkJUmFpc2VDbG9jayhwQWQsICZ4KTsKLQkJTG93ZXJDbG9jayhwQWQsICZ4KTsKLQl9Ci0KLQkvLyBvdXRwdXQgdGhlIHJlYWRfb3Bjb2RlIGFuZCByZWdpc3RlciBudW1iZXIgaW4gdGhhdCBvcmRlcgotCVNoaWZ0T3V0Qml0cyhwQWQsIEVFUFJPTV9SRUFEX09QQ09ERSwgMyk7Ci0JU2hpZnRPdXRCaXRzKHBBZCwgT2Zmc2V0LCBwQWQtPkVFUFJPTUFkZHJlc3NOdW0pOwotCi0JLy8gTm93IHJlYWQgdGhlIGRhdGEgKDE2IGJpdHMpIGluIGZyb20gdGhlIHNlbGVjdGVkIEVFUFJPTSB3b3JkCi0JZGF0YSA9IFNoaWZ0SW5CaXRzKHBBZCk7Ci0KLQlFRXByb21DbGVhbnVwKHBBZCk7Ci0KLSNpZmRlZiBSVDMweHgKLSNpZmRlZiBBTlRfRElWRVJTSVRZX1NVUFBPUlQKLQkvLyBBbnRlbm5hIGFuZCBFRVBST00gYWNjZXNzIGFyZSBib3RoIHVzaW5nIEVFU0sgcGluLAotCS8vIFRoZXJlZm9yIHdlIHNob3VsZCBhdm9pZCBhY2Nlc3NpbmcgRUVTSyBhdCB0aGUgc2FtZSB0aW1lCi0JLy8gVGhlbiByZXN0b3JlIGFudGVubmEgYWZ0ZXIgRUVQUk9NIGFjY2VzcwotCWlmICgocEFkLT5OaWNDb25maWcyLmZpZWxkLkFudERpdmVyc2l0eSkvKiB8fCAocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjApKi8pCi0JewotCQlwQWQtPkVlcHJvbUFjY2VzcyA9IEZBTFNFOwotCQlBc2ljU2V0UnhBbnQocEFkLCBwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50KTsKLQl9Ci0jZW5kaWYgLy8gQU5UX0RJVkVSU0lUWV9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gUlQzMHh4IC8vCi0KLQkqcFZhbHVlID0gZGF0YTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLWludCBydG1wX2VlX3Byb21fd3JpdGUxNigKLSAgICBJTiAgUFJUTVBfQURBUFRFUglwQWQsCi0gICAgSU4gIFVTSE9SVCBPZmZzZXQsCi0gICAgSU4gIFVTSE9SVCBEYXRhKQotewotCVVJTlQzMiB4OwotCi0jaWZkZWYgUlQzMHh4Ci0jaWZkZWYgQU5UX0RJVkVSU0lUWV9TVVBQT1JUCi0JaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5BbnREaXZlcnNpdHkpCi0JewotCQlwQWQtPkVlcHJvbUFjY2VzcyA9IFRSVUU7Ci0JfQotI2VuZGlmIC8vIEFOVF9ESVZFUlNJVFlfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFJUMzB4eCAvLwotCi0JT2Zmc2V0IC89IDI7Ci0KLQlFV0VOKHBBZCk7Ci0KLQkvLyByZXNldCBiaXRzIGFuZCBzZXQgRUVDUwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOwotCXggJj0gfihFRURJIHwgRUVETyB8IEVFU0spOwotCXggfD0gRUVDUzsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKLQotCS8vIHBhdGNoIGNhbiBub3QgYWNjZXNzIGUtRnVzZSBpc3N1ZQotCWlmICghKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSkKLQl7Ci0JCS8vIGtpY2sgYSBwdWxzZQotCQlSYWlzZUNsb2NrKHBBZCwgJngpOwotCQlMb3dlckNsb2NrKHBBZCwgJngpOwotCX0KLQotCS8vIG91dHB1dCB0aGUgcmVhZF9vcGNvZGUgLHJlZ2lzdGVyIG51bWJlciBhbmQgZGF0YSBpbiB0aGF0IG9yZGVyCi0JU2hpZnRPdXRCaXRzKHBBZCwgRUVQUk9NX1dSSVRFX09QQ09ERSwgMyk7Ci0JU2hpZnRPdXRCaXRzKHBBZCwgT2Zmc2V0LCBwQWQtPkVFUFJPTUFkZHJlc3NOdW0pOwotCVNoaWZ0T3V0Qml0cyhwQWQsIERhdGEsIDE2KTsJCS8vIDE2LWJpdCBhY2Nlc3MKLQotCS8vIHJlYWQgRE8gc3RhdHVzCi0JUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7Ci0KLQlFRXByb21DbGVhbnVwKHBBZCk7Ci0KLQlSVE1QdXNlY0RlbGF5KDEwMDAwKTsJLy9kZWxheSBmb3IgdHdwKE1BWCk9MTBtcwotCi0JRVdEUyhwQWQpOwotCi0JRUVwcm9tQ2xlYW51cChwQWQpOwotCi0jaWZkZWYgUlQzMHh4Ci0jaWZkZWYgQU5UX0RJVkVSU0lUWV9TVVBQT1JUCi0JLy8gQW50ZW5uYSBhbmQgRUVQUk9NIGFjY2VzcyBhcmUgYm90aCB1c2luZyBFRVNLIHBpbiwKLQkvLyBUaGVyZWZvciB3ZSBzaG91bGQgYXZvaWQgYWNjZXNzaW5nIEVFU0sgYXQgdGhlIHNhbWUgdGltZQotCS8vIFRoZW4gcmVzdG9yZSBhbnRlbm5hIGFmdGVyIEVFUFJPTSBhY2Nlc3MKLQlpZiAoKHBBZC0+TmljQ29uZmlnMi5maWVsZC5BbnREaXZlcnNpdHkpIC8qfHwgKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIwKSovKQotCXsKLQkJcEFkLT5FZXByb21BY2Nlc3MgPSBGQUxTRTsKLQkJQXNpY1NldFJ4QW50KHBBZCwgcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudCk7Ci0JfQotI2VuZGlmIC8vIEFOVF9ESVZFUlNJVFlfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFJUMzB4eCAvLwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2VlcHJvbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vZWVwcm9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlODM3NDkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vZWVwcm9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCWVlcHJvbS5jCi0KLQlBYnN0cmFjdDoKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotSU5UIFJ0bXBDaGlwT3BzRWVwcm9tSG9vaygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBJTlQJCQlpbmZUeXBlKQotewotCVJUTVBfQ0hJUF9PUAkqcENoaXBPcHMgPSAmcEFkLT5jaGlwT3BzOwotI2lmZGVmIFJUMzB4eAotI2lmZGVmIFJUTVBfRUZVU0VfU1VQUE9SVAotCVVJTlQzMgkJCWVGdXNlQ3RybCwgTWFjQ3NyMDsKLQlpbnQgaW5kZXg7Ci0KLQlpbmRleCA9IDA7Ci0JZG8KLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX0NTUjAsICZNYWNDc3IwKTsKLQkJcEFkLT5NQUNWZXJzaW9uID0gTWFjQ3NyMDsKLQotCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAhPSAweDAwKSAmJiAocEFkLT5NQUNWZXJzaW9uICE9IDB4RkZGRkZGRkYpKQotCQkJYnJlYWs7Ci0KLQkJUlRNUHVzZWNEZWxheSgxMCk7Ci0JfSB3aGlsZSAoaW5kZXgrKyA8IDEwMCk7Ci0KLQlwQWQtPmJVc2VFZnVzZT1GQUxTRTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIEVGVVNFX0NUUkwsICZlRnVzZUN0cmwpOwotCXBBZC0+YlVzZUVmdXNlID0gKCAoZUZ1c2VDdHJsICYgMHg4MDAwMDAwMCkgPT0gMHg4MDAwMDAwMCkgPyAxIDogMDsKLQlpZihwQWQtPmJVc2VFZnVzZSkKLQl7Ci0JCXBDaGlwT3BzLT5lZWluaXQgPSBlRnVzZV9pbml0OwotCQlwQ2hpcE9wcy0+ZWVyZWFkID0gcnRtcF9lZV9lZnVzZV9yZWFkMTY7Ci0JCXBDaGlwT3BzLT5lZXdyaXRlID0gcnRtcF9lZV9lZnVzZV93cml0ZTE2OwotCQlyZXR1cm4gMCA7Ci0JfQotCWVsc2UKLQl7Ci0JCXBBZC0+YkZyb2NlRUVQUk9NQnVmZmVyID0gRkFMU0U7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5WTSBpcyBFRVBST01cbiIpKTsKLQl9Ci0jZW5kaWYgLy8gUlRNUF9FRlVTRV9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gUlQzMHh4IC8vCi0KLQlzd2l0Y2goaW5mVHlwZSkKLQl7Ci0jaWZkZWYgUlRNUF9QQ0lfU1VQUE9SVAotCQljYXNlIFJUTVBfREVWX0lORl9QQ0k6Ci0JCQlwQ2hpcE9wcy0+ZWVpbml0ID0gTlVMTDsKLQkJCXBDaGlwT3BzLT5lZXJlYWQgPSBydG1wX2VlX3Byb21fcmVhZDE2OwotCQkJcENoaXBPcHMtPmVld3JpdGUgPSBydG1wX2VlX3Byb21fd3JpdGUxNjsKLQkJCWJyZWFrOwotI2VuZGlmIC8vIFJUTVBfUENJX1NVUFBPUlQgLy8KLQotCi0JCWRlZmF1bHQ6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSdG1wQ2hpcE9wc0VlcHJvbUhvb2soKSBmYWlsZWQhXG4iKSk7Ci0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2lnbXBfc25vb3AuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2lnbXBfc25vb3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgwNjU4Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9pZ21wX3Nub29wLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzY1ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLQotI2lmZGVmIElHTVBfU05PT1BfU1VQUE9SVAotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0jaW5jbHVkZSAiLi4vaXB2Ni5oIgotI2luY2x1ZGUgIi4uL2lnbXBfc25vb3AuaCIKLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5pdEZyZWVFbnRyeUxpc3QoCi0JSU4gUE1VTFRJQ0FTVF9GSUxURVJfVEFCTEUgcE11bHRpY2FzdEZpbHRlclRhYmxlLAotCUlOIFBMSVNUX0hFQURFUiBwTGlzdCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBGUkVFX01FTUJFUl9QT09MX1NJWkU7IGkrKykKLQkJaW5zZXJ0VGFpbExpc3QocExpc3QsIChQTElTVF9FTlRSWSkmKHBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+ZnJlZU1lbWJlclBvb2xbaV0pKTsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIGlubGluZSBQTUVNQkVSX0VOVFJZIEFsbG9jYUdycE1lbWJlckVudHJ5KAotCUlOIFBNVUxUSUNBU1RfRklMVEVSX1RBQkxFIHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSkKLXsKLQlQTUVNQkVSX0VOVFJZIHBNZW1iZXJFbnRyeTsKLQotCVJUTVBfU0VNX0xPQ0soJnBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+RnJlZU1lbWJlclBvb2xUYWJMb2NrKTsKLQotCXBNZW1iZXJFbnRyeSA9IChQTUVNQkVSX0VOVFJZKXJlbW92ZUhlYWRMaXN0KCZwTXVsdGljYXN0RmlsdGVyVGFibGUtPmZyZWVFbnRyeUxpc3QpOwotCi0JUlRNUF9TRU1fVU5MT0NLKCZwTXVsdGljYXN0RmlsdGVyVGFibGUtPkZyZWVNZW1iZXJQb29sVGFiTG9jayk7Ci0KLQlyZXR1cm4gKFBNRU1CRVJfRU5UUlkpcE1lbWJlckVudHJ5OwotfQotCi1zdGF0aWMgaW5saW5lIFZPSUQgRnJlZUdycE1lbWJlckVudHJ5KAotCUlOIFBNVUxUSUNBU1RfRklMVEVSX1RBQkxFIHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwKLQlJTiBQTUVNQkVSX0VOVFJZIHBFbnRyeSkKLXsKLQlSVE1QX1NFTV9MT0NLKCZwTXVsdGljYXN0RmlsdGVyVGFibGUtPkZyZWVNZW1iZXJQb29sVGFiTG9jayk7Ci0KLQlpbnNlcnRUYWlsTGlzdCgmcE11bHRpY2FzdEZpbHRlclRhYmxlLT5mcmVlRW50cnlMaXN0LCAoUExJU1RfRU5UUlkpcEVudHJ5KTsKLQotCVJUTVBfU0VNX1VOTE9DSygmcE11bHRpY2FzdEZpbHRlclRhYmxlLT5GcmVlTWVtYmVyUG9vbFRhYkxvY2spOwotfQotCi1zdGF0aWMgVk9JRCBJR01QVGFibGVEaXNwbGF5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotc3RhdGljIEJPT0xFQU4gaXNJZ21wTWFjQWRkcigKLQlJTiBQVUNIQVIgcE1hY0FkZHIpOwotCi1zdGF0aWMgVk9JRCBJbnNlcnRJZ21wTWVtYmVyKAotCUlOIFBNVUxUSUNBU1RfRklMVEVSX1RBQkxFIHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwKLQlJTiBQTElTVF9IRUFERVIgcExpc3QsCi0JSU4gUFVDSEFSIHBNZW1iZXJBZGRyKTsKLQotc3RhdGljIFZPSUQgRGVsZXRlSWdtcE1lbWJlcigKLQlJTiBQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSBwTXVsdGljYXN0RmlsdGVyVGFibGUsCi0JSU4gUExJU1RfSEVBREVSIHBMaXN0LAotCUlOIFBVQ0hBUiBwTWVtYmVyQWRkcik7Ci0KLXN0YXRpYyBWT0lEIERlbGV0ZUlnbXBNZW1iZXJMaXN0KAotCUlOIFBNVUxUSUNBU1RfRklMVEVSX1RBQkxFIHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwKLQlJTiBQTElTVF9IRUFERVIgcExpc3QpOwotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgVGhpcyByb3V0aW5lIGluaXQgdGhlIGVudGlyZSBJR01QIHRhYmxlLgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgTXVsdGljYXN0RmlsdGVyVGFibGVJbml0KAotCUlOIFBNVUxUSUNBU1RfRklMVEVSX1RBQkxFICpwcE11bHRpY2FzdEZpbHRlclRhYmxlKQotewotCS8vIEluaXRpYWxpemUgTUFDIHRhYmxlIGFuZCBhbGxvY2F0ZSBzcGluIGxvY2sKLQkqcHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSA9IGttYWxsb2Moc2l6ZW9mKE1VTFRJQ0FTVF9GSUxURVJfVEFCTEUpLCBNRU1fQUxMT0NfRkxBRyk7Ci0JaWYgKCpwcE11bHRpY2FzdEZpbHRlclRhYmxlID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyB1bmFibGUgdG8gYWxsb2MgbWVtb3J5IGZvciBNdWx0aWNhc2UgZmlsdGVyIHRhYmxlLCBzaXplPSVkXG4iLAotCQkJX19GVU5DVElPTl9fLCBzaXplb2YoTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSkpKTsKLQkJcmV0dXJuOwotCX0KLQotCU5kaXNaZXJvTWVtb3J5KCpwcE11bHRpY2FzdEZpbHRlclRhYmxlLCBzaXplb2YoTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSkpOwotCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCYoKCpwcE11bHRpY2FzdEZpbHRlclRhYmxlKS0+TXVsdGljYXN0RmlsdGVyVGFiTG9jaykpOwotCi0JTmRpc0FsbG9jYXRlU3BpbkxvY2soJigoKnBwTXVsdGljYXN0RmlsdGVyVGFibGUpLT5GcmVlTWVtYmVyUG9vbFRhYkxvY2spKTsKLQlpbml0TGlzdCgmKCgqcHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSktPmZyZWVFbnRyeUxpc3QpKTsKLQlpbml0RnJlZUVudHJ5TGlzdCgqcHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwgJigoKnBwTXVsdGljYXN0RmlsdGVyVGFibGUpLT5mcmVlRW50cnlMaXN0KSk7Ci0JcmV0dXJuOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFRoaXMgcm91dGluZSByZXNldCB0aGUgZW50aXJlIElHTVAgdGFibGUuCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNdWx0aUNhc3RGaWx0ZXJUYWJsZVJlc2V0KAotCUlOIFBNVUxUSUNBU1RfRklMVEVSX1RBQkxFICpwcE11bHRpY2FzdEZpbHRlclRhYmxlKQotewotCWlmKCpwcE11bHRpY2FzdEZpbHRlclRhYmxlID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyBNdWx0aWNhc2UgZmlsdGVyIHRhYmxlIGlzIG5vdCByZWFkeS5cbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm47Ci0JfQotCi0JTmRpc0ZyZWVTcGluTG9jaygmKCgqcHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSktPkZyZWVNZW1iZXJQb29sVGFiTG9jaykpOwotCU5kaXNGcmVlU3BpbkxvY2soJigoKnBwTXVsdGljYXN0RmlsdGVyVGFibGUpLT5NdWx0aWNhc3RGaWx0ZXJUYWJMb2NrKSk7Ci0Ja2ZyZWUoKnBwTXVsdGljYXN0RmlsdGVyVGFibGUpOwotCSpwcE11bHRpY2FzdEZpbHRlclRhYmxlID0gTlVMTDsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBEaXNwbGF5IGFsbCBlbnRyeXMgaW4gSUdNUCB0YWJsZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLXN0YXRpYyBWT0lEIElHTVBUYWJsZURpc3BsYXkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JaW50IGk7Ci0JTVVMVElDQVNUX0ZJTFRFUl9UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTDsKLQlQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSBwTXVsdGljYXN0RmlsdGVyVGFibGUgPSBwQWQtPnBNdWx0aWNhc3RGaWx0ZXJUYWJsZTsKLQotCWlmIChwTXVsdGljYXN0RmlsdGVyVGFibGUgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIlcyBNdWx0aWNhc2UgZmlsdGVyIHRhYmxlIGlzIG5vdCByZWFkeS5cbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gaWYgRlVMTCwgcmV0dXJuCi0JaWYgKHBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+U2l6ZSA9PSAwKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiVGFibGUgZW1wdHkuXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyBhbGxvY2F0ZSBvbmUgTUFDIGVudHJ5Ci0JUlRNUF9TRU1fTE9DSygmcE11bHRpY2FzdEZpbHRlclRhYmxlLT5NdWx0aWNhc3RGaWx0ZXJUYWJMb2NrKTsKLQotCWZvciAoaSA9IDA7IGk8IE1BWF9MRU5fT0ZfTVVMVElDQVNUX0ZJTFRFUl9UQUJMRTsgaSsrKQotCXsKLQkJLy8gcGljayB1cCB0aGUgZmlyc3QgYXZhaWxhYmxlIHZhY2FuY3kKLQkJaWYgKHBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+Q29udGVudFtpXS5WYWxpZCA9PSBUUlVFKQotCQl7Ci0JCQlQTUVNQkVSX0VOVFJZIHBNZW1iZXJFbnRyeSA9IE5VTEw7Ci0JCQlwRW50cnkgPSAmcE11bHRpY2FzdEZpbHRlclRhYmxlLT5Db250ZW50W2ldOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiSUYoJXMpIGVudHJ5ICMlZCwgdHlwZT0lcywgR3JwSWQ9KCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4KSBtZW1iZXJDbnQ9JWRcbiIsCi0JCQkJUlRNUF9PU19ORVRERVZfR0VUX0RFVk5BTUUocEVudHJ5LT5uZXRfZGV2KSwgaSwgKHBFbnRyeS0+dHlwZT09MCA/ICJzdGF0aWMiOiJkeW5hbWljIiksCi0JCQkJUFJJTlRfTUFDKHBFbnRyeS0+QWRkciksIElnbXBNZW1iZXJDbnQoJnBFbnRyeS0+TWVtYmVyTGlzdCkpKTsKLQotCQkJcE1lbWJlckVudHJ5ID0gKFBNRU1CRVJfRU5UUlkpcEVudHJ5LT5NZW1iZXJMaXN0LnBIZWFkOwotCQkJd2hpbGUgKHBNZW1iZXJFbnRyeSkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgibWVtYmVyIG1hYz0oJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngpXG4iLAotCQkJCQkJCQkJCVBSSU5UX01BQyhwTWVtYmVyRW50cnktPkFkZHIpKSk7Ci0KLQkJCQlwTWVtYmVyRW50cnkgPSBwTWVtYmVyRW50cnktPnBOZXh0OwotCQkJfQotCQl9Ci0JfQotCi0JUlRNUF9TRU1fVU5MT0NLKCZwTXVsdGljYXN0RmlsdGVyVGFibGUtPk11bHRpY2FzdEZpbHRlclRhYkxvY2spOwotCi0JcmV0dXJuOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIEFkZCBhbmQgbmV3IGVudHJ5IGludG8gTUFDIHRhYmxlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotQk9PTEVBTiBNdWx0aWNhc3RGaWx0ZXJUYWJsZUluc2VydEVudHJ5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwR3JwSWQsCi0JSU4gUFVDSEFSIHBNZW1iZXJBZGRyLAotCUlOIFBORVRfREVWIGRldiwKLQlJTiBNdWx0aWNhc3RGaWx0ZXJFbnRyeVR5cGUgdHlwZSkKLXsKLQlVQ0hBUiBIYXNoSWR4OwotCWludCBpOwotCU1VTFRJQ0FTVF9GSUxURVJfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEwsICpwQ3VyckVudHJ5LCAqcFByZXZFbnRyeTsKLQlQTUVNQkVSX0VOVFJZIHBNZW1iZXJFbnRyeTsKLQlQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSBwTXVsdGljYXN0RmlsdGVyVGFibGUgPSBwQWQtPnBNdWx0aWNhc3RGaWx0ZXJUYWJsZTsKLQotCWlmIChwTXVsdGljYXN0RmlsdGVyVGFibGUgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIE11bHRpY2FzZSBmaWx0ZXIgdGFibGUgaXMgbm90IHJlYWR5LlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQkvLyBpZiBGVUxMLCByZXR1cm4KLQlpZiAocE11bHRpY2FzdEZpbHRlclRhYmxlLT5TaXplID49IE1BWF9MRU5fT0ZfTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIE11bHRpY2FzZSBmaWx0ZXIgdGFibGUgZnVsbC4gbWF4LWVudHJpZXMgPSAlZFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgTUFYX0xFTl9PRl9NVUxUSUNBU1RfRklMVEVSX1RBQkxFKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQkvLyBjaGVjayB0aGUgcnVsZSBpcyBpbiB0YWJsZSBhbHJlYWR5IG9yIG5vdC4KLQlpZiAoKHBFbnRyeSA9IE11bHRpY2FzdEZpbHRlclRhYmxlTG9va3VwKHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwgcEdycElkLCBkZXYpKSkKLQl7Ci0JCS8vIGRvZXNuJ3QgaW5kaWNhdGUgbWVtYmVyIG1hYyBhZGRyZXNzLgotCQlpZihwTWVtYmVyQWRkciA9PSBOVUxMKQotCQl7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCX0KLQotCQlwTWVtYmVyRW50cnkgPSAoUE1FTUJFUl9FTlRSWSlwRW50cnktPk1lbWJlckxpc3QucEhlYWQ7Ci0KLQkJd2hpbGUgKHBNZW1iZXJFbnRyeSkKLQkJewotCQkJaWYgKE1BQ19BRERSX0VRVUFMKHBNZW1iZXJBZGRyLCBwTWVtYmVyRW50cnktPkFkZHIpKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBhbHJlYWR5IGluIE1lbWJlcnMgbGlzdC5cbiIsIF9fRlVOQ1RJT05fXykpOwotCQkJCXJldHVybiBGQUxTRTsKLQkJCX0KLQotCQkJcE1lbWJlckVudHJ5ID0gcE1lbWJlckVudHJ5LT5wTmV4dDsKLQkJfQotCX0KLQotCVJUTVBfU0VNX0xPQ0soJnBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+TXVsdGljYXN0RmlsdGVyVGFiTG9jayk7Ci0JZG8KLQl7Ci0JCVVMT05HIE5vdzsKLQkJLy8gdGhlIG11bHRpY2FzdCBlbnRyeSBhbHJlYWR5IGV4aXN0IGJ1dCBkb2Vzbid0IGluY2x1ZGUgdGhlIG1lbWJlciB5ZXQuCi0JCWlmIChwRW50cnkgIT0gTlVMTCAmJiBwTWVtYmVyQWRkciAhPSBOVUxMKQotCQl7Ci0JCQlJbnNlcnRJZ21wTWVtYmVyKHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwgJnBFbnRyeS0+TWVtYmVyTGlzdCwgcE1lbWJlckFkZHIpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvLyBhbGxvY2F0ZSBvbmUgTUFDIGVudHJ5Ci0JCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX01VTFRJQ0FTVF9GSUxURVJfVEFCTEU7IGkrKykKLQkJewotCQkJLy8gcGljayB1cCB0aGUgZmlyc3QgYXZhaWxhYmxlIHZhY2FuY3kKLQkJCXBFbnRyeSA9ICZwTXVsdGljYXN0RmlsdGVyVGFibGUtPkNvbnRlbnRbaV07Ci0JCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwotCQkJaWYgKChwRW50cnktPlZhbGlkID09IFRSVUUpICYmIChwRW50cnktPnR5cGUgPT0gTUNBVF9GSUxURVJfRFlOQU1JQykKLQkJCQkmJiAoKE5vdyAtIHBFbnRyeS0+bGFzdFRpbWUpID4gSUdNUE1BQ19UQl9FTlRSWV9BR0VPVVRfVElNRSkpCi0JCQl7Ci0JCQkJUE1VTFRJQ0FTVF9GSUxURVJfVEFCTEVfRU5UUlkgcEhhc2hFbnRyeTsKLQotCQkJCUhhc2hJZHggPSBNVUxUSUNBU1RfQUREUl9IQVNIX0lOREVYKHBFbnRyeS0+QWRkcik7Ci0JCQkJcEhhc2hFbnRyeSA9IHBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+SGFzaFtIYXNoSWR4XTsKLQotCQkJCWlmICgocEVudHJ5LT5uZXRfZGV2ID09IHBIYXNoRW50cnktPm5ldF9kZXYpCi0JCQkJCSYmIE1BQ19BRERSX0VRVUFMKHBFbnRyeS0+QWRkciwgcEhhc2hFbnRyeS0+QWRkcikpCi0JCQkJewotCQkJCQlwTXVsdGljYXN0RmlsdGVyVGFibGUtPkhhc2hbSGFzaElkeF0gPSBwSGFzaEVudHJ5LT5wTmV4dDsKLQkJCQkJcE11bHRpY2FzdEZpbHRlclRhYmxlLT5TaXplIC0tOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNQ2FzdEZpbHRlclRhYmxlRGVsZXRlRW50cnkgMSAtIFRvdGFsPSAlZFxuIiwgcE11bHRpY2FzdEZpbHRlclRhYmxlLT5TaXplKSk7Ci0JCQkJfSBlbHNlCi0JCQkJewotCQkJCQl3aGlsZSAocEhhc2hFbnRyeS0+cE5leHQpCi0JCQkJCXsKLQkJCQkJCXBQcmV2RW50cnkgPSBwSGFzaEVudHJ5OwotCQkJCQkJcEhhc2hFbnRyeSA9IHBIYXNoRW50cnktPnBOZXh0OwotCQkJCQkJaWYgKChwRW50cnktPm5ldF9kZXYgPT0gcEhhc2hFbnRyeS0+bmV0X2RldikKLQkJCQkJCQkmJiBNQUNfQUREUl9FUVVBTChwRW50cnktPkFkZHIsIHBIYXNoRW50cnktPkFkZHIpKQotCQkJCQkJewotCQkJCQkJCXBQcmV2RW50cnktPnBOZXh0ID0gcEhhc2hFbnRyeS0+cE5leHQ7Ci0JCQkJCQkJcE11bHRpY2FzdEZpbHRlclRhYmxlLT5TaXplIC0tOwotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1DYXN0RmlsdGVyVGFibGVEZWxldGVFbnRyeSAyIC0gVG90YWw9ICVkXG4iLCBwTXVsdGljYXN0RmlsdGVyVGFibGUtPlNpemUpKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlwRW50cnktPlZhbGlkID0gRkFMU0U7Ci0JCQkJRGVsZXRlSWdtcE1lbWJlckxpc3QocE11bHRpY2FzdEZpbHRlclRhYmxlLCAmcEVudHJ5LT5NZW1iZXJMaXN0KTsKLQkJCX0KLQotCQkJaWYgKHBFbnRyeS0+VmFsaWQgPT0gRkFMU0UpCi0JCQl7Ci0JCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoTVVMVElDQVNUX0ZJTFRFUl9UQUJMRV9FTlRSWSkpOwotCQkJCXBFbnRyeS0+VmFsaWQgPSBUUlVFOwotCi0JCQkJQ09QWV9NQUNfQUREUihwRW50cnktPkFkZHIsIHBHcnBJZCk7Ci0JCQkJcEVudHJ5LT5uZXRfZGV2ID0gZGV2OwotCQkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7Ci0JCQkJcEVudHJ5LT5sYXN0VGltZSA9IE5vdzsKLQkJCQlwRW50cnktPnR5cGUgPSB0eXBlOwotCQkJCWluaXRMaXN0KCZwRW50cnktPk1lbWJlckxpc3QpOwotCQkJCWlmIChwTWVtYmVyQWRkciAhPSBOVUxMKQotCQkJCQlJbnNlcnRJZ21wTWVtYmVyKHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwgJnBFbnRyeS0+TWVtYmVyTGlzdCwgcE1lbWJlckFkZHIpOwotCi0JCQkJcE11bHRpY2FzdEZpbHRlclRhYmxlLT5TaXplICsrOwotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTXVsdGljYXN0RmlsdGVyVGFibGVJbnNlcnRFbnRyeSAtSUYoJXMpIGFsbG9jYXRlIGVudHJ5ICMlZCwgVG90YWw9ICVkXG4iLCBSVE1QX09TX05FVERFVl9HRVRfREVWTkFNRShkZXYpLCBpLCBwTXVsdGljYXN0RmlsdGVyVGFibGUtPlNpemUpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCS8vIGFkZCB0aGlzIE1BQyBlbnRyeSBpbnRvIEhBU0ggdGFibGUKLQkJaWYgKHBFbnRyeSkKLQkJewotCQkJSGFzaElkeCA9IE1VTFRJQ0FTVF9BRERSX0hBU0hfSU5ERVgocEdycElkKTsKLQkJCWlmIChwTXVsdGljYXN0RmlsdGVyVGFibGUtPkhhc2hbSGFzaElkeF0gPT0gTlVMTCkKLQkJCXsKLQkJCQlwTXVsdGljYXN0RmlsdGVyVGFibGUtPkhhc2hbSGFzaElkeF0gPSBwRW50cnk7Ci0JCQl9IGVsc2UKLQkJCXsKLQkJCQlwQ3VyckVudHJ5ID0gcE11bHRpY2FzdEZpbHRlclRhYmxlLT5IYXNoW0hhc2hJZHhdOwotCQkJCXdoaWxlIChwQ3VyckVudHJ5LT5wTmV4dCAhPSBOVUxMKQotCQkJCQlwQ3VyckVudHJ5ID0gcEN1cnJFbnRyeS0+cE5leHQ7Ci0JCQkJcEN1cnJFbnRyeS0+cE5leHQgPSBwRW50cnk7Ci0JCQl9Ci0JCX0KLQl9d2hpbGUoRkFMU0UpOwotCi0JUlRNUF9TRU1fVU5MT0NLKCZwTXVsdGljYXN0RmlsdGVyVGFibGUtPk11bHRpY2FzdEZpbHRlclRhYkxvY2spOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgRGVsZXRlIGEgc3BlY2lmaWVkIGNsaWVudCBmcm9tIE1BQyB0YWJsZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLUJPT0xFQU4gTXVsdGljYXN0RmlsdGVyVGFibGVEZWxldGVFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcEdycElkLAotCUlOIFBVQ0hBUiBwTWVtYmVyQWRkciwKLQlJTiBQTkVUX0RFViBkZXYpCi17Ci0JVVNIT1JUIEhhc2hJZHg7Ci0JTVVMVElDQVNUX0ZJTFRFUl9UQUJMRV9FTlRSWSAqcEVudHJ5LCAqcFByZXZFbnRyeTsKLQlQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSBwTXVsdGljYXN0RmlsdGVyVGFibGUgPSBwQWQtPnBNdWx0aWNhc3RGaWx0ZXJUYWJsZTsKLQlVU0hPUlQgQWlkID0gTUNBU1RfV0NJRDsKLQlTU1QJU3N0ID0gU1NUX0FTU09DOwotCVVDSEFSIFBzTW9kZSA9IFBXUl9BQ1RJVkUsIFJhdGU7Ci0KLQlpZiAocE11bHRpY2FzdEZpbHRlclRhYmxlID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyBNdWx0aWNhc2UgZmlsdGVyIHRhYmxlIGlzIG5vdCByZWFkeS5cbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JUlRNUF9TRU1fTE9DSygmcE11bHRpY2FzdEZpbHRlclRhYmxlLT5NdWx0aWNhc3RGaWx0ZXJUYWJMb2NrKTsKLQotCWRvCi0JewotCQlIYXNoSWR4ID0gTVVMVElDQVNUX0FERFJfSEFTSF9JTkRFWChwR3JwSWQpOwotCQlwUHJldkVudHJ5ID0gcEVudHJ5ID0gcE11bHRpY2FzdEZpbHRlclRhYmxlLT5IYXNoW0hhc2hJZHhdOwotCi0JCXdoaWxlIChwRW50cnkgJiYgcEVudHJ5LT5WYWxpZCkKLQkJewotCQkJaWYgKChwRW50cnktPm5ldF9kZXYgPT0gIGRldikKLQkJCQkmJiBNQUNfQUREUl9FUVVBTChwRW50cnktPkFkZHIsIHBHcnBJZCkpCi0JCQkJYnJlYWs7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcFByZXZFbnRyeSA9IHBFbnRyeTsKLQkJCQlwRW50cnkgPSBwRW50cnktPnBOZXh0OwotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgdGhlIHJ1bGUgaXMgaW4gdGFibGUgYWxyZWFkeSBvciBub3QuCi0JCWlmIChwRW50cnkgJiYgKHBNZW1iZXJBZGRyICE9IE5VTEwpKQotCQl7Ci0JCQlpZihBUFNzUHNJbnF1aXJ5KHBBZCwgcE1lbWJlckFkZHIsICZTc3QsICZBaWQsICZQc01vZGUsICZSYXRlKSkKLQkJCQlEZWxldGVJZ21wTWVtYmVyKHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwgJnBFbnRyeS0+TWVtYmVyTGlzdCwgcE1lbWJlckFkZHIpOwotCQkJaWYgKElnbXBNZW1iZXJDbnQoJnBFbnRyeS0+TWVtYmVyTGlzdCkgPiAwKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHBFbnRyeSkKLQkJewotCQkJaWYgKHBFbnRyeSA9PSBwTXVsdGljYXN0RmlsdGVyVGFibGUtPkhhc2hbSGFzaElkeF0pCi0JCQl7Ci0JCQkJcE11bHRpY2FzdEZpbHRlclRhYmxlLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKLQkJCQlEZWxldGVJZ21wTWVtYmVyTGlzdChwTXVsdGljYXN0RmlsdGVyVGFibGUsICZwRW50cnktPk1lbWJlckxpc3QpOwotCQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKE1VTFRJQ0FTVF9GSUxURVJfVEFCTEVfRU5UUlkpKTsKLQkJCQlwTXVsdGljYXN0RmlsdGVyVGFibGUtPlNpemUgLS07Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTUNhc3RGaWx0ZXJUYWJsZURlbGV0ZUVudHJ5IDEgLSBUb3RhbD0gJWRcbiIsIHBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+U2l6ZSkpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXBQcmV2RW50cnktPnBOZXh0ID0gcEVudHJ5LT5wTmV4dDsKLQkJCQlEZWxldGVJZ21wTWVtYmVyTGlzdChwTXVsdGljYXN0RmlsdGVyVGFibGUsICZwRW50cnktPk1lbWJlckxpc3QpOwotCQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKE1VTFRJQ0FTVF9GSUxURVJfVEFCTEVfRU5UUlkpKTsKLQkJCQlwTXVsdGljYXN0RmlsdGVyVGFibGUtPlNpemUgLS07Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTUNhc3RGaWx0ZXJUYWJsZURlbGV0ZUVudHJ5IDIgLSBUb3RhbD0gJWRcbiIsIHBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+U2l6ZSkpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHRoZSBHcm91cCBkb2Vzbid0IGV4aXN0LlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCX0KLQl9IHdoaWxlKEZBTFNFKTsKLQotCVJUTVBfU0VNX1VOTE9DSygmcE11bHRpY2FzdEZpbHRlclRhYmxlLT5NdWx0aWNhc3RGaWx0ZXJUYWJMb2NrKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIExvb2sgdXAgdGhlIE1BQyBhZGRyZXNzIGluIHRoZSBJR01QIHRhYmxlLiBSZXR1cm4gTlVMTCBpZiBub3QgZm91bmQuCi0gICAgUmV0dXJuOgotICAgICAgICBwRW50cnkgLSBwb2ludGVyIHRvIHRoZSBNQUMgZW50cnk7IE5VTEwgaXMgbm90IGZvdW5kCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1QTVVMVElDQVNUX0ZJTFRFUl9UQUJMRV9FTlRSWSBNdWx0aWNhc3RGaWx0ZXJUYWJsZUxvb2t1cCgKLQlJTiBQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSBwTXVsdGljYXN0RmlsdGVyVGFibGUsCi0JSU4gUFVDSEFSIHBBZGRyLAotCUlOIFBORVRfREVWIGRldikKLXsKLQlVTE9ORyBIYXNoSWR4LCBOb3c7Ci0JUE1VTFRJQ0FTVF9GSUxURVJfVEFCTEVfRU5UUlkgcEVudHJ5ID0gTlVMTCwgcFByZXYgPSBOVUxMOwotCi0JaWYgKHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgTXVsdGljYXNlIGZpbHRlciB0YWJsZSBpcyBub3QgcmVhZHkuXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JUlRNUF9TRU1fTE9DSygmcE11bHRpY2FzdEZpbHRlclRhYmxlLT5NdWx0aWNhc3RGaWx0ZXJUYWJMb2NrKTsKLQotCUhhc2hJZHggPSBNVUxUSUNBU1RfQUREUl9IQVNIX0lOREVYKHBBZGRyKTsKLQlwRW50cnkgPSBwUHJldiA9IHBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+SGFzaFtIYXNoSWR4XTsKLQotCXdoaWxlIChwRW50cnkgJiYgcEVudHJ5LT5WYWxpZCkKLQl7Ci0JCWlmICgocEVudHJ5LT5uZXRfZGV2ID09ICBkZXYpCi0JCQkmJiBNQUNfQUREUl9FUVVBTChwRW50cnktPkFkZHIsIHBBZGRyKSkKLQkJewotCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKLQkJCXBFbnRyeS0+bGFzdFRpbWUgPSBOb3c7Ci0JCQlicmVhazsKLQkJfQotCQllbHNlCi0JCXsKLQkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7Ci0JCQlpZiAoKHBFbnRyeS0+VmFsaWQgPT0gVFJVRSkgJiYgKHBFbnRyeS0+dHlwZSA9PSBNQ0FUX0ZJTFRFUl9EWU5BTUlDKQotCQkJCSYmIFJUTVBfVElNRV9BRlRFUihOb3csIHBFbnRyeS0+bGFzdFRpbWUrSUdNUE1BQ19UQl9FTlRSWV9BR0VPVVRfVElNRSkpCi0JCQl7Ci0JCQkJLy8gUmVtb3ZlIHRoZSBhZ2VkIGVudHJ5Ci0JCQkJaWYgKHBFbnRyeSA9PSBwTXVsdGljYXN0RmlsdGVyVGFibGUtPkhhc2hbSGFzaElkeF0pCi0JCQkJewotCQkJCQlwTXVsdGljYXN0RmlsdGVyVGFibGUtPkhhc2hbSGFzaElkeF0gPSBwRW50cnktPnBOZXh0OwotCQkJCQlwUHJldiA9IHBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+SGFzaFtIYXNoSWR4XTsKLQkJCQkJRGVsZXRlSWdtcE1lbWJlckxpc3QocE11bHRpY2FzdEZpbHRlclRhYmxlLCAmcEVudHJ5LT5NZW1iZXJMaXN0KTsKLQkJCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoTVVMVElDQVNUX0ZJTFRFUl9UQUJMRV9FTlRSWSkpOwotCQkJCQlwTXVsdGljYXN0RmlsdGVyVGFibGUtPlNpemUgLS07Ci0JCQkJCXBFbnRyeSA9IHBQcmV2OwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNQ2FzdEZpbHRlclRhYmxlRGVsZXRlRW50cnkgMiAtIFRvdGFsPSAlZFxuIiwgcE11bHRpY2FzdEZpbHRlclRhYmxlLT5TaXplKSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXBQcmV2LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7Ci0JCQkJCURlbGV0ZUlnbXBNZW1iZXJMaXN0KHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwgJnBFbnRyeS0+TWVtYmVyTGlzdCk7Ci0JCQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKE1VTFRJQ0FTVF9GSUxURVJfVEFCTEVfRU5UUlkpKTsKLQkJCQkJcE11bHRpY2FzdEZpbHRlclRhYmxlLT5TaXplIC0tOwotCQkJCQlwRW50cnkgPSAocFByZXYgPT0gTlVMTCA/IE5VTEw6IHBQcmV2LT5wTmV4dCk7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1DYXN0RmlsdGVyVGFibGVEZWxldGVFbnRyeSAyIC0gVG90YWw9ICVkXG4iLCBwTXVsdGljYXN0RmlsdGVyVGFibGUtPlNpemUpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcFByZXYgPSBwRW50cnk7Ci0JCQkJcEVudHJ5ID0gcEVudHJ5LT5wTmV4dDsKLQkJCX0KLQkJfQotCX0KLQotCVJUTVBfU0VNX1VOTE9DSygmcE11bHRpY2FzdEZpbHRlclRhYmxlLT5NdWx0aWNhc3RGaWx0ZXJUYWJMb2NrKTsKLQotCXJldHVybiBwRW50cnk7Ci19Ci0KLVZPSUQgSUdNUFNub29waW5nKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwRHN0TWFjQWRkciwKLQlJTiBQVUNIQVIgcFNyY01hY0FkZHIsCi0JSU4gUFVDSEFSIHBJcEhlYWRlciwKLQlJTiBQTkVUX0RFViBwRGV2KQotewotCUlOVCBpOwotCUlOVCBJcEhlYWRlckxlbjsKLQlVQ0hBUiBHcm91cFR5cGU7Ci0JVUlOVDE2IG51bU9mR3JvdXA7Ci0JVUNIQVIgSWdtcFZlclR5cGU7Ci0JUFVDSEFSIHBJZ21wSGVhZGVyOwotCVBVQ0hBUiBwR3JvdXA7Ci0JVUNIQVIgQXV4RGF0YUxlbjsKLQlVSU5UMTYgbnVtT2ZTb3VyY2VzOwotCVBVQ0hBUiBwR3JvdXBJcEFkZHI7Ci0JVUNIQVIgR3JvdXBNYWNBZGRyWzZdOwotCVBVQ0hBUiBwR3JvdXBNYWNBZGRyID0gKFBVQ0hBUikmR3JvdXBNYWNBZGRyOwotCi0JaWYoaXNJZ21wUGt0KHBEc3RNYWNBZGRyLCBwSXBIZWFkZXIpKQotCXsKLQkJSXBIZWFkZXJMZW4gPSAoKihwSXBIZWFkZXIgKyAyKSAmIDB4MGYpICogNDsKLQkJcElnbXBIZWFkZXIgPSBwSXBIZWFkZXIgKyAyICsgSXBIZWFkZXJMZW47Ci0JCUlnbXBWZXJUeXBlID0gKFVDSEFSKSgqKHBJZ21wSGVhZGVyKSk7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUdNUCB0eXBlPSUweFxuIiwgSWdtcFZlclR5cGUpKTsKLQotCQlzd2l0Y2goSWdtcFZlclR5cGUpCi0JCXsKLQkJY2FzZSBJR01QX1YxX01FTUJFUlNISVBfUkVQT1JUOiAvLyBJR01QIHZlcnNpb24gMSBtZW1iZXJzaGlwIHJlcG9ydC4KLQkJY2FzZSBJR01QX1YyX01FTUJFUlNISVBfUkVQT1JUOiAvLyBJR01QIHZlcnNpb24gMiBtZW1iZXJzaGlwIHJlcG9ydC4KLQkJCXBHcm91cElwQWRkciA9IChQVUNIQVIpKHBJZ21wSGVhZGVyICsgNCk7Ci0JCQkJQ29udmVydE11bHRpY2FzdElQMk1BQyhwR3JvdXBJcEFkZHIsIChQVUNIQVIgKikmcEdyb3VwTWFjQWRkciwgRVRIX1BfSVApOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUdNUCBHcm91cD0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCQlHcm91cE1hY0FkZHJbMF0sIEdyb3VwTWFjQWRkclsxXSwgR3JvdXBNYWNBZGRyWzJdLCBHcm91cE1hY0FkZHJbM10sIEdyb3VwTWFjQWRkcls0XSwgR3JvdXBNYWNBZGRyWzVdKSk7Ci0JCQlNdWx0aWNhc3RGaWx0ZXJUYWJsZUluc2VydEVudHJ5KHBBZCwgR3JvdXBNYWNBZGRyLCBwU3JjTWFjQWRkciwgcERldiwgTUNBVF9GSUxURVJfRFlOQU1JQyk7Ci0JCQlicmVhazsKLQotCQljYXNlIElHTVBfTEVBVkVfR1JPVVA6IC8vIElHTVAgdmVyc2lvbiAxIGFuZCB2ZXJzaW9uIDIgbGVhdmUgZ3JvdXAuCi0JCQlwR3JvdXBJcEFkZHIgPSAoUFVDSEFSKShwSWdtcEhlYWRlciArIDQpOwotCQkJCUNvbnZlcnRNdWx0aWNhc3RJUDJNQUMocEdyb3VwSXBBZGRyLCAoUFVDSEFSICopJnBHcm91cE1hY0FkZHIsIEVUSF9QX0lQKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklHTVAgR3JvdXA9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCQkJR3JvdXBNYWNBZGRyWzBdLCBHcm91cE1hY0FkZHJbMV0sIEdyb3VwTWFjQWRkclsyXSwgR3JvdXBNYWNBZGRyWzNdLCBHcm91cE1hY0FkZHJbNF0sIEdyb3VwTWFjQWRkcls1XSkpOwotCQkJTXVsdGljYXN0RmlsdGVyVGFibGVEZWxldGVFbnRyeShwQWQsIEdyb3VwTWFjQWRkciwgcFNyY01hY0FkZHIsIHBEZXYpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJR01QX1YzX01FTUJFUlNISVBfUkVQT1JUOiAvLyBJR01QIHZlcnNpb24gMyBtZW1iZXJzaGlwIHJlcG9ydC4KLQkJCW51bU9mR3JvdXAgPSBudG9ocygqKChVSU5UMTYgKikocElnbXBIZWFkZXIgKyA2KSkpOwotCQkJcEdyb3VwID0gKFBVQ0hBUikocElnbXBIZWFkZXIgKyA4KTsKLQkJCWZvciAoaT0wOyBpIDwgbnVtT2ZHcm91cDsgaSsrKQotCQkJewotCQkJCUdyb3VwVHlwZSA9IChVQ0hBUikoKnBHcm91cCk7Ci0JCQkJQXV4RGF0YUxlbiA9IChVQ0hBUikoKihwR3JvdXAgKyAxKSk7Ci0JCQkJbnVtT2ZTb3VyY2VzID0gbnRvaHMoKigoVUlOVDE2ICopKHBHcm91cCArIDIpKSk7Ci0JCQkJcEdyb3VwSXBBZGRyID0gKFBVQ0hBUikocEdyb3VwICsgNCk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUdNUHYzIFR5cGU9JWQsIEFETD0lZCwgbnVtT2ZTb3VyY2U9JWRcbiIsIEdyb3VwVHlwZSwgQXV4RGF0YUxlbiwgbnVtT2ZTb3VyY2VzKSk7Ci0JCQkJCUNvbnZlcnRNdWx0aWNhc3RJUDJNQUMocEdyb3VwSXBBZGRyLCAoUFVDSEFSICopJnBHcm91cE1hY0FkZHIsIEVUSF9QX0lQKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJR01QIEdyb3VwPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQkJCQlHcm91cE1hY0FkZHJbMF0sIEdyb3VwTWFjQWRkclsxXSwgR3JvdXBNYWNBZGRyWzJdLCBHcm91cE1hY0FkZHJbM10sIEdyb3VwTWFjQWRkcls0XSwgR3JvdXBNYWNBZGRyWzVdKSk7Ci0KLQkJCQlkbwotCQkJCXsKLQkJCQkJaWYoKEdyb3VwVHlwZSA9PSBNT0RFX0lTX0VYQ0xVREUpIHx8IChHcm91cFR5cGUgPT0gQ0hBTkdFX1RPX0VYQ0xVREVfTU9ERSkgfHwgKEdyb3VwVHlwZSA9PSBBTExPV19ORVdfU09VUkNFUykpCi0JCQkJCXsKLQkJCQkJCU11bHRpY2FzdEZpbHRlclRhYmxlSW5zZXJ0RW50cnkocEFkLCBHcm91cE1hY0FkZHIsIHBTcmNNYWNBZGRyLCBwRGV2LCBNQ0FUX0ZJTFRFUl9EWU5BTUlDKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0KLQkJCQkJaWYoKEdyb3VwVHlwZSA9PSBNT0RFX0lTX0lOQ0xVREUpIHx8IChHcm91cFR5cGUgPT0gQkxPQ0tfT0xEX1NPVVJDRVMpKQotCQkJCQl7Ci0JCQkJCQlNdWx0aWNhc3RGaWx0ZXJUYWJsZURlbGV0ZUVudHJ5KHBBZCwgR3JvdXBNYWNBZGRyLCBwU3JjTWFjQWRkciwgcERldik7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCi0JCQkJCWlmKChHcm91cFR5cGUgPT0gQ0hBTkdFX1RPX0lOQ0xVREVfTU9ERSkpCi0JCQkJCXsKLQkJCQkJCWlmKG51bU9mU291cmNlcyA9PSAwKQotCQkJCQkJCU11bHRpY2FzdEZpbHRlclRhYmxlRGVsZXRlRW50cnkocEFkLCBHcm91cE1hY0FkZHIsIHBTcmNNYWNBZGRyLCBwRGV2KTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlNdWx0aWNhc3RGaWx0ZXJUYWJsZUluc2VydEVudHJ5KHBBZCwgR3JvdXBNYWNBZGRyLCBwU3JjTWFjQWRkciwgcERldiwgTUNBVF9GSUxURVJfRFlOQU1JQyk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0gd2hpbGUoRkFMU0UpOwotCQkJCXBHcm91cCArPSAoOCArIChudW1PZlNvdXJjZXMgKiA0KSArIEF1eERhdGFMZW4pOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInVua25vdyBJR01QIFR5cGU9JWRcbiIsIElnbXBWZXJUeXBlKSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybjsKLX0KLQotCi1zdGF0aWMgQk9PTEVBTiBpc0lnbXBNYWNBZGRyKAotCUlOIFBVQ0hBUiBwTWFjQWRkcikKLXsKLQlpZigocE1hY0FkZHJbMF0gPT0gMHgwMSkKLQkJJiYgKHBNYWNBZGRyWzFdID09IDB4MDApCi0JCSYmIChwTWFjQWRkclsyXSA9PSAweDVlKSkKLQkJcmV0dXJuIFRSVUU7Ci0JcmV0dXJuIEZBTFNFOwotfQotCi1CT09MRUFOIGlzSWdtcFBrdCgKLQlJTiBQVUNIQVIgcERzdE1hY0FkZHIsCi0JSU4gUFVDSEFSIHBJcEhlYWRlcikKLXsKLQlVSU5UMTYgSXBQcm90b2NvbCA9IG50b2hzKCooKFVJTlQxNiAqKShwSXBIZWFkZXIpKSk7Ci0JVUNIQVIgSWdtcFByb3RvY29sOwotCi0JaWYoIWlzSWdtcE1hY0FkZHIocERzdE1hY0FkZHIpKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlpZihJcFByb3RvY29sID09IEVUSF9QX0lQKQotCXsKLQkJSWdtcFByb3RvY29sID0gKFVDSEFSKSoocElwSGVhZGVyICsgMTEpOwotCQlpZihJZ21wUHJvdG9jb2wgPT0gSUdNUF9QUk9UT0NPTF9ERVNDUklQVE9SKQotCQkJCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKLX0KLQotc3RhdGljIFZPSUQgSW5zZXJ0SWdtcE1lbWJlcigKLQlJTiBQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSBwTXVsdGljYXN0RmlsdGVyVGFibGUsCi0JSU4gUExJU1RfSEVBREVSIHBMaXN0LAotCUlOIFBVQ0hBUiBwTWVtYmVyQWRkcikKLXsKLQlQTUVNQkVSX0VOVFJZIHBNZW1iZXJFbnRyeTsKLQotCWlmKHBMaXN0ID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogbWVtYmVydCBsaXN0IGRvZXNuJ3QgZXhpc3QuXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwTWVtYmVyQWRkciA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IGludmFsaWQgbWVtYmVyLlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZigocE1lbWJlckVudHJ5ID0gKFBNRU1CRVJfRU5UUlkpQWxsb2NhR3JwTWVtYmVyRW50cnkocE11bHRpY2FzdEZpbHRlclRhYmxlKSkgIT0gTlVMTCkKLQl7Ci0JCU5kaXNaZXJvTWVtb3J5KHBNZW1iZXJFbnRyeSwgc2l6ZW9mKE1FTUJFUl9FTlRSWSkpOwotCQlDT1BZX01BQ19BRERSKHBNZW1iZXJFbnRyeS0+QWRkciwgcE1lbWJlckFkZHIpOwotCQlpbnNlcnRUYWlsTGlzdChwTGlzdCwgKFBMSVNUX0VOVFJZKXBNZW1iZXJFbnRyeSk7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgTWVtYmVyIE1hYz0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwgX19GVU5DVElPTl9fLAotCQkJcE1lbWJlckVudHJ5LT5BZGRyWzBdLCBwTWVtYmVyRW50cnktPkFkZHJbMV0sIHBNZW1iZXJFbnRyeS0+QWRkclsyXSwKLQkJCXBNZW1iZXJFbnRyeS0+QWRkclszXSwgcE1lbWJlckVudHJ5LT5BZGRyWzRdLCBwTWVtYmVyRW50cnktPkFkZHJbNV0pKTsKLQl9Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgVk9JRCBEZWxldGVJZ21wTWVtYmVyKAotCUlOIFBNVUxUSUNBU1RfRklMVEVSX1RBQkxFIHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwKLQlJTiBQTElTVF9IRUFERVIgcExpc3QsCi0JSU4gUFVDSEFSIHBNZW1iZXJBZGRyKQotewotCVBNRU1CRVJfRU5UUlkgcEN1ckVudHJ5OwotCi0JaWYoKHBMaXN0ID09IE5VTEwpIHx8IChwTGlzdC0+cEhlYWQgPT0gTlVMTCkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogbWVtYmVydCBsaXN0IGRvZXNuJ3QgZXhpc3QuXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwTWVtYmVyQWRkciA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IGludmFsaWQgbWVtYmVyLlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwQ3VyRW50cnkgPSAoUE1FTUJFUl9FTlRSWSlwTGlzdC0+cEhlYWQ7Ci0Jd2hpbGUgKHBDdXJFbnRyeSkKLQl7Ci0JCWlmKE1BQ19BRERSX0VRVUFMKHBNZW1iZXJBZGRyLCBwQ3VyRW50cnktPkFkZHIpKQotCQl7Ci0JCQlkZWxFbnRyeUxpc3QocExpc3QsIChQTElTVF9FTlRSWSlwQ3VyRW50cnkpOwotCQkJRnJlZUdycE1lbWJlckVudHJ5KHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwgcEN1ckVudHJ5KTsKLQkJCWJyZWFrOwotCQl9Ci0JCXBDdXJFbnRyeSA9IHBDdXJFbnRyeS0+cE5leHQ7Ci0JfQotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgVk9JRCBEZWxldGVJZ21wTWVtYmVyTGlzdCgKLQlJTiBQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSBwTXVsdGljYXN0RmlsdGVyVGFibGUsCi0JSU4gUExJU1RfSEVBREVSIHBMaXN0KQotewotCVBNRU1CRVJfRU5UUlkgcEN1ckVudHJ5LCBwUHJ2RW50cnk7Ci0KLQlpZigocExpc3QgPT0gTlVMTCkgfHwgKHBMaXN0LT5wSGVhZCA9PSBOVUxMKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBtZW1iZXJ0IGxpc3QgZG9lc24ndCBleGlzdC5cbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm47Ci0JfQotCi0JcFBydkVudHJ5ID0gcEN1ckVudHJ5ID0gKFBNRU1CRVJfRU5UUlkpcExpc3QtPnBIZWFkOwotCXdoaWxlIChwQ3VyRW50cnkpCi0JewotCQlkZWxFbnRyeUxpc3QocExpc3QsIChQTElTVF9FTlRSWSlwQ3VyRW50cnkpOwotCQlwUHJ2RW50cnkgPSBwQ3VyRW50cnk7Ci0JCXBDdXJFbnRyeSA9IHBDdXJFbnRyeS0+cE5leHQ7Ci0JCUZyZWVHcnBNZW1iZXJFbnRyeShwTXVsdGljYXN0RmlsdGVyVGFibGUsIHBQcnZFbnRyeSk7Ci0JfQotCi0JaW5pdExpc3QocExpc3QpOwotCXJldHVybjsKLX0KLQotCi1VQ0hBUiBJZ21wTWVtYmVyQ250KAotCUlOIFBMSVNUX0hFQURFUiBwTGlzdCkKLXsKLQlpZihwTGlzdCA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IG1lbWJlcnQgbGlzdCBkb2Vzbid0IGV4aXN0LlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiBnZXRMaXN0U2l6ZShwTGlzdCk7Ci19Ci0KLVZPSUQgSWdtcEdyb3VwRGVsTWVtYmVycygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcE1lbWJlckFkZHIsCi0JSU4gUE5FVF9ERVYgcERldikKLXsKLQlJTlQgaTsKLQlNVUxUSUNBU1RfRklMVEVSX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMOwotCVBNVUxUSUNBU1RfRklMVEVSX1RBQkxFIHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSA9IHBBZC0+cE11bHRpY2FzdEZpbHRlclRhYmxlOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfTVVMVElDQVNUX0ZJTFRFUl9UQUJMRTsgaSsrKQotCXsKLQkJLy8gcGljayB1cCB0aGUgZmlyc3QgYXZhaWxhYmxlIHZhY2FuY3kKLQkJcEVudHJ5ID0gJnBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+Q29udGVudFtpXTsKLQkJaWYgKHBFbnRyeS0+VmFsaWQgPT0gVFJVRSkKLQkJewotCQkJaWYocE1lbWJlckFkZHIgIT0gTlVMTCkKLQkJCXsKLQkJCQlSVE1QX1NFTV9MT0NLKCZwTXVsdGljYXN0RmlsdGVyVGFibGUtPk11bHRpY2FzdEZpbHRlclRhYkxvY2spOwotCQkJCURlbGV0ZUlnbXBNZW1iZXIocE11bHRpY2FzdEZpbHRlclRhYmxlLCAmcEVudHJ5LT5NZW1iZXJMaXN0LCBwTWVtYmVyQWRkcik7Ci0JCQkJUlRNUF9TRU1fVU5MT0NLKCZwTXVsdGljYXN0RmlsdGVyVGFibGUtPk11bHRpY2FzdEZpbHRlclRhYkxvY2spOwotCQkJfQotCi0JCQlpZigocEVudHJ5LT50eXBlID09IE1DQVRfRklMVEVSX0RZTkFNSUMpCi0JCQkJJiYgKElnbXBNZW1iZXJDbnQoJnBFbnRyeS0+TWVtYmVyTGlzdCkgPT0gMCkpCi0JCQkJTXVsdGljYXN0RmlsdGVyVGFibGVEZWxldGVFbnRyeShwQWQsIHBFbnRyeS0+QWRkciwgcE1lbWJlckFkZHIsIHBEZXYpOwotCQl9Ci0JfQotfQotCi1JTlQgU2V0X0lnbXBTbl9FbmFibGVfUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQU1RSSU5HIGFyZykKLXsKLQlVSU5UIEVuYWJsZTsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0JVUNIQVIgaWZJbmRleDsKLQlQTkVUX0RFViBwRGV2OwotCi0JcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQlpZkluZGV4ID0gcE9iai0+aW9jdGxfaWY7Ci0KLQlwRGV2ID0gKGlmSW5kZXggPT0gTUFJTl9NQlNTSUQpID8gKHBBZC0+bmV0X2RldikgOiAocEFkLT5BcENmZy5NQlNTSURbaWZJbmRleF0uTVNTSUREZXYpOwotCUVuYWJsZSA9IChVSU5UKSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JcEFkLT5BcENmZy5NQlNTSURbaWZJbmRleF0uSWdtcFNub29wRW5hYmxlID0gKEJPT0xFQU4pKEVuYWJsZSA9PSAwID8gMCA6IDEpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooJXMpICVzXG4iLCBfX0ZVTkNUSU9OX18sIFJUTVBfT1NfTkVUREVWX0dFVF9ERVZOQU1FKHBEZXYpLCBFbmFibGUgPT0gVFJVRSA/ICJFbmFibGUgSUdNUCBTbm9vcGluZyI6IkRpc2FibGUgSUdNUCBTbm9vcGluZyIpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQgU2V0X0lnbXBTbl9BZGRFbnRyeV9Qcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBTVFJJTkcgYXJnKQotewotCUlOVCBpOwotCUJPT0xFQU4gYkdyb3VwSWQgPSAxOwotCVBTVFJJTkcgdmFsdWU7Ci0JUFNUUklORyB0aGlzQ2hhcjsKLQlVQ0hBUiBJcEFkZHJbNF07Ci0JVUNIQVIgQWRkcltFVEhfTEVOR1RIX09GX0FERFJFU1NdOwotCVVDSEFSIEdyb3VwSWRbRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKLQlQVUNIQVIgKnBBZGRyID0gKFBVQ0hBUiAqKSZBZGRyOwotCVBORVRfREVWIHBEZXY7Ci0JUE9TX0NPT0tJRSBwT2JqOwotCVVDSEFSIGlmSW5kZXg7Ci0KLQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCWlmSW5kZXggPSBwT2JqLT5pb2N0bF9pZjsKLQotCXBEZXYgPSAoaWZJbmRleCA9PSBNQUlOX01CU1NJRCkgPyAocEFkLT5uZXRfZGV2KSA6IChwQWQtPkFwQ2ZnLk1CU1NJRFtpZkluZGV4XS5NU1NJRERldik7Ci0KLQl3aGlsZSAoKHRoaXNDaGFyID0gc3Ryc2VwKChjaGFyICoqKSZhcmcsICItIikpICE9IE5VTEwpCi0JewotCQkvLyByZWZ1c2UgdGhlIE1lbWJlciBpZiBpdCdzIG5vdCBhIE1BQyBhZGRyZXNzLgotCQlpZigoYkdyb3VwSWQgPT0gMCkgJiYgKHN0cmxlbih0aGlzQ2hhcikgIT0gMTcpKQotCQkJY29udGludWU7Ci0KLQkJaWYoc3RybGVuKHRoaXNDaGFyKSA9PSAxNykgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3Ci0JCXsKLQkJCWZvciAoaT0wLCB2YWx1ZSA9IHJzdHJ0b2sodGhpc0NoYXIsIjoiKTsgdmFsdWU7IHZhbHVlID0gcnN0cnRvayhOVUxMLCI6IikpCi0JCQl7Ci0JCQkJaWYoKHN0cmxlbih2YWx1ZSkgIT0gMikgfHwgKCFpc3hkaWdpdCgqdmFsdWUpKSB8fCAoIWlzeGRpZ2l0KCoodmFsdWUrMSkpKSApCi0JCQkJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZAotCi0JCQkJQXRvSCh2YWx1ZSwgJkFkZHJbaSsrXSwgMSk7Ci0JCQl9Ci0KLQkJCWlmKGkgIT0gNikKLQkJCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQKLQkJfQotCQllbHNlCi0JCXsKLQkJCWZvciAoaT0wLCB2YWx1ZSA9IHJzdHJ0b2sodGhpc0NoYXIsIi4iKTsgdmFsdWU7IHZhbHVlID0gcnN0cnRvayhOVUxMLCIuIikpCi0JCQl7Ci0JCQkJaWYoKHN0cmxlbih2YWx1ZSkgPiAwKSAmJiAoc3RybGVuKHZhbHVlKSA8PSAzKSkKLQkJCQl7Ci0JCQkJCWludCBpaTsKLQkJCQkJZm9yKGlpPTA7IGlpPHN0cmxlbih2YWx1ZSk7IGlpKyspCi0JCQkJCQlpZiAoIWlzeGRpZ2l0KCoodmFsdWUgKyBpaSkpKQotCQkJCQkJCXJldHVybiBGQUxTRTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQKLQotCQkJCUlwQWRkcltpXSA9IChVQ0hBUilzaW1wbGVfc3RydG9sKHZhbHVlLCBOVUxMLCAxMCk7Ci0JCQkJaSsrOwotCQkJfQotCi0JCQlpZihpICE9IDQpCi0JCQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCi0KLQkJCUNvbnZlcnRNdWx0aWNhc3RJUDJNQUMoSXBBZGRyLCAoUFVDSEFSICopJnBBZGRyLCBFVEhfUF9JUCk7Ci0JCX0KLQotCQlpZihiR3JvdXBJZCA9PSAxKQotCQkJQ09QWV9NQUNfQUREUihHcm91cElkLCBBZGRyKTsKLQotCQkvLyBHcm91cC1JZCBtdXN0IGJlIGEgTUNBU1QgYWRkcmVzcy4KLQkJaWYoKGJHcm91cElkID09IDEpICYmIElTX01VTFRJQ0FTVF9NQUNfQUREUihBZGRyKSkKLQkJCU11bHRpY2FzdEZpbHRlclRhYmxlSW5zZXJ0RW50cnkocEFkLCBHcm91cElkLCBOVUxMLCBwRGV2LCBNQ0FUX0ZJTFRFUl9TVEFUSUMpOwotCQkvLyBHcm91cC1NZW1iZXIgbXVzdCBiZSBhIFVDQVNUIGFkZHJlc3MuCi0JCWVsc2UgaWYgKChiR3JvdXBJZCA9PSAwKSAmJiAhSVNfTVVMVElDQVNUX01BQ19BRERSKEFkZHIpKQotCQkJTXVsdGljYXN0RmlsdGVyVGFibGVJbnNlcnRFbnRyeShwQWQsIEdyb3VwSWQsIEFkZHIsIHBEZXYsIE1DQVRfRklMVEVSX1NUQVRJQyk7Ci0JCWVsc2UKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgKCUyWDolMlg6JTJYOiUyWDolMlg6JTJYKSBpcyBub3QgYSBhY2NlcHRhYmxlIGFkZHJlc3MuXG4iLAotCQkJCV9fRlVOQ1RJT05fXywgQWRkclswXSwgQWRkclsxXSwgQWRkclsyXSwgQWRkclszXSwgQWRkcls0XSwgQWRkcls1XSkpOwotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0KLQkJYkdyb3VwSWQgPSAwOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAoJTJYOiUyWDolMlg6JTJYOiUyWDolMlgpXG4iLAotCQkJX19GVU5DVElPTl9fLCBBZGRyWzBdLCBBZGRyWzFdLCBBZGRyWzJdLCBBZGRyWzNdLCBBZGRyWzRdLCBBZGRyWzVdKSk7Ci0KLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UIFNldF9JZ21wU25fRGVsRW50cnlfUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQU1RSSU5HIGFyZykKLXsKLQlJTlQgaSwgbWVtYmVyQ250ID0gMDsKLQlCT09MRUFOIGJHcm91cElkID0gMTsKLQlQU1RSSU5HIHZhbHVlOwotCVBTVFJJTkcgdGhpc0NoYXI7Ci0JVUNIQVIgSXBBZGRyWzRdOwotCVVDSEFSIEFkZHJbRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKLQlVQ0hBUiBHcm91cElkW0VUSF9MRU5HVEhfT0ZfQUREUkVTU107Ci0JUFVDSEFSICpwQWRkciA9IChQVUNIQVIgKikmQWRkcjsKLQlQTkVUX0RFViBwRGV2OwotCVBPU19DT09LSUUgcE9iajsKLQlVQ0hBUiBpZkluZGV4OwotCi0JcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQlpZkluZGV4ID0gcE9iai0+aW9jdGxfaWY7Ci0KLQlwRGV2ID0gKGlmSW5kZXggPT0gTUFJTl9NQlNTSUQpID8gKHBBZC0+bmV0X2RldikgOiAocEFkLT5BcENmZy5NQlNTSURbaWZJbmRleF0uTVNTSUREZXYpOwotCi0Jd2hpbGUgKCh0aGlzQ2hhciA9IHN0cnNlcCgoY2hhciAqKikmYXJnLCAiLSIpKSAhPSBOVUxMKQotCXsKLQkJLy8gcmVmdXNlIHRoZSBNZW1iZXIgaWYgaXQncyBub3QgYSBNQUMgYWRkcmVzcy4KLQkJaWYoKGJHcm91cElkID09IDApICYmIChzdHJsZW4odGhpc0NoYXIpICE9IDE3KSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmKHN0cmxlbih0aGlzQ2hhcikgPT0gMTcpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNwotCQl7Ci0JCQlmb3IgKGk9MCwgdmFsdWUgPSByc3RydG9rKHRoaXNDaGFyLCI6Iik7IHZhbHVlOyB2YWx1ZSA9IHJzdHJ0b2soTlVMTCwiOiIpKQotCQkJewotCQkJCWlmKChzdHJsZW4odmFsdWUpICE9IDIpIHx8ICghaXN4ZGlnaXQoKnZhbHVlKSkgfHwgKCFpc3hkaWdpdCgqKHZhbHVlKzEpKSkgKQotCQkJCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQKLQotCQkJCUF0b0godmFsdWUsICZBZGRyW2krK10sIDEpOwotCQkJfQotCi0JCQlpZihpICE9IDYpCi0JCQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCi0JCX0KLQkJZWxzZQotCQl7Ci0JCQlmb3IgKGk9MCwgdmFsdWUgPSByc3RydG9rKHRoaXNDaGFyLCIuIik7IHZhbHVlOyB2YWx1ZSA9IHJzdHJ0b2soTlVMTCwiLiIpKQotCQkJewotCQkJCWlmKChzdHJsZW4odmFsdWUpID4gMCkgJiYgKHN0cmxlbih2YWx1ZSkgPD0gMykpCi0JCQkJewotCQkJCQlpbnQgaWk7Ci0JCQkJCWZvcihpaT0wOyBpaTxzdHJsZW4odmFsdWUpOyBpaSsrKQotCQkJCQkJaWYgKCFpc3hkaWdpdCgqKHZhbHVlICsgaWkpKSkKLQkJCQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCi0KLQkJCQlJcEFkZHJbaV0gPSAoVUNIQVIpc2ltcGxlX3N0cnRvbCh2YWx1ZSwgTlVMTCwgMTApOwotCQkJCWkrKzsKLQkJCX0KLQotCQkJaWYoaSAhPSA0KQotCQkJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZAotCi0JCQlDb252ZXJ0TXVsdGljYXN0SVAyTUFDKElwQWRkciwgKFBVQ0hBUiAqKSZwQWRkciwgRVRIX1BfSVApOwotCQl9Ci0KLQkJaWYoYkdyb3VwSWQgPT0gMSkKLQkJCUNPUFlfTUFDX0FERFIoR3JvdXBJZCwgQWRkcik7Ci0JCWVsc2UKLQkJCW1lbWJlckNudCsrOwotCi0JCWlmIChtZW1iZXJDbnQgPiAwICkKLQkJCU11bHRpY2FzdEZpbHRlclRhYmxlRGVsZXRlRW50cnkocEFkLCAoUFVDSEFSKUdyb3VwSWQsIEFkZHIsIHBEZXYpOwotCi0JCWJHcm91cElkID0gMDsKLQl9Ci0KLQlpZihtZW1iZXJDbnQgPT0gMCkKLQkJTXVsdGljYXN0RmlsdGVyVGFibGVEZWxldGVFbnRyeShwQWQsIChQVUNIQVIpR3JvdXBJZCwgTlVMTCwgcERldik7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAoJTJYOiUyWDolMlg6JTJYOiUyWDolMlgpXG4iLAotCQlfX0ZVTkNUSU9OX18sIEFkZHJbMF0sIEFkZHJbMV0sIEFkZHJbMl0sIEFkZHJbM10sIEFkZHJbNF0sIEFkZHJbNV0pKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQgU2V0X0lnbXBTbl9UYWJEaXNwbGF5X1Byb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFNUUklORyBhcmcpCi17Ci0JSUdNUFRhYmxlRGlzcGxheShwQWQpOwotCXJldHVybiBUUlVFOwotfQotCi12b2lkIHJ0bXBfcmVhZF9pZ21wX3Nub29wX2Zyb21fZmlsZSgKLQlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCi0JUFNUUklORyB0bXBidWYsCi0JUFNUUklORyBidWZmZXIpCi17Ci0JUFNUUklORwkJbWFjcHRyOwotCUlOVAkJCWk9MDsKLQotCS8vSWdtcFNuRW5hYmxlCi0JaWYoUlRNUEdldEtleVBhcmFtZXRlcigiSWdtcFNuRW5hYmxlIiwgdG1wYnVmLCAxMjgsIGJ1ZmZlciwgVFJVRSkpCi0JewotCQlmb3IgKGkgPSAwLCBtYWNwdHIgPSByc3RydG9rKHRtcGJ1ZiwiOyIpOyAobWFjcHRyICYmIGkgPCBwQWQtPkFwQ2ZnLkJzc2lkTnVtKTsgbWFjcHRyID0gcnN0cnRvayhOVUxMLCI7IiksIGkrKykKLQkJewotCQkJaWYgKChzdHJuY21wKG1hY3B0ciwgIjAiLCAxKSA9PSAwKSkKLQkJCQlwQWQtPkFwQ2ZnLk1CU1NJRFtpXS5JZ21wU25vb3BFbmFibGUgPSBGQUxTRTsKLQkJCWVsc2UgaWYgKChzdHJuY21wKG1hY3B0ciwgIjEiLCAxKSA9PSAwKSkKLQkJCQlwQWQtPkFwQ2ZnLk1CU1NJRFtpXS5JZ21wU25vb3BFbmFibGUgPSBUUlVFOwotCSAgICAgICAgZWxzZQotCQkJCXBBZC0+QXBDZmcuTUJTU0lEW2ldLklnbXBTbm9vcEVuYWJsZSA9IEZBTFNFOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNQlNTSURbJWRdLkVuYWJsZT0lZFxuIiwgaSwgcEFkLT5BcENmZy5NQlNTSURbaV0uSWdtcFNub29wRW5hYmxlKSk7Ci0JICAgIH0KLQl9Ci19Ci0KLU5ESVNfU1RBVFVTIElnbXBQa3RJbmZvUXVlcnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBTcmNCdWZWQSwKLQlJTiBQTkRJU19QQUNLRVQgcFBhY2tldCwKLQlJTiBVQ0hBUiBhcGlkeCwKLQlPVVQgQk9PTEVBTiAqcEluSWdtcEdyb3VwLAotCU9VVCBQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRV9FTlRSWSAqcHBHcm91cEVudHJ5KQotewotCWlmKElTX01VTFRJQ0FTVF9NQUNfQUREUihwU3JjQnVmVkEpKQotCXsKLQkJQk9PTEVBTiBJZ21wTWxkUGt0ID0gRkFMU0U7Ci0JCVBVQ0hBUiBwSXBIZWFkZXIgPSBwU3JjQnVmVkEgKyAxMjsKLQotCQlpZihudG9ocygqKChVSU5UMTYgKikocElwSGVhZGVyKSkpID09IEVUSF9QX0lQVjYpCi0JCQlJZ21wTWxkUGt0ID0gaXNNbGRQa3QocFNyY0J1ZlZBLCBwSXBIZWFkZXIsIE5VTEwsIE5VTEwpOwotCQllbHNlCi0JCQlJZ21wTWxkUGt0ID0gaXNJZ21wUGt0KHBTcmNCdWZWQSwgcElwSGVhZGVyKTsKLQotCQlpZiAoSWdtcE1sZFBrdCkKLQkJewotCQkJKnBwR3JvdXBFbnRyeSA9IE5VTEw7Ci0JCX0KLQkJZWxzZSBpZiAoKCpwcEdyb3VwRW50cnkgPSBNdWx0aWNhc3RGaWx0ZXJUYWJsZUxvb2t1cChwQWQtPnBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwgcFNyY0J1ZlZBLAotCQkJCQkJCQkJcEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLk1TU0lERGV2KSkgPT0gTlVMTCkKLQkJewotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JCX0KLQkJKnBJbklnbXBHcm91cCA9IFRSVUU7Ci0JfQotCWVsc2UgaWYgKElTX0JST0FEQ0FTVF9NQUNfQUREUihwU3JjQnVmVkEpKQotCXsKLQkJUFVDSEFSIHBEc3RJcEFkZHIgPSBwU3JjQnVmVkEgKyAzMDsgLy8gcG9pbnQgdG8gRGVzdGluYXRpb24gb2YgSXAgYWRkcmVzcyBvZiBJUCBoZWFkZXIuCi0JCVVDSEFSIEdyb3VwTWFjQWRkcls2XTsKLQkJUFVDSEFSIHBHcm91cE1hY0FkZHIgPSAoUFVDSEFSKSZHcm91cE1hY0FkZHI7Ci0KLQkJQ29udmVydE11bHRpY2FzdElQMk1BQyhwRHN0SXBBZGRyLCAoUFVDSEFSICopJnBHcm91cE1hY0FkZHIsIEVUSF9QX0lQKTsKLQkJaWYgKCgqcHBHcm91cEVudHJ5ID0gTXVsdGljYXN0RmlsdGVyVGFibGVMb29rdXAocEFkLT5wTXVsdGljYXN0RmlsdGVyVGFibGUsIHBHcm91cE1hY0FkZHIsCi0JCQkJCQkJCXBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5NU1NJRERldikpICE9IE5VTEwpCi0JCXsKLQkJCSpwSW5JZ21wR3JvdXAgPSBUUlVFOwotCQl9Ci0JfQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi1ORElTX1NUQVRVUyBJZ21wUGt0Q2xvbmUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUE5ESVNfUEFDS0VUIHBQYWNrZXQsCi0JSU4gVUNIQVIgUXVlSWR4LAotCUlOIFBNVUxUSUNBU1RfRklMVEVSX1RBQkxFX0VOVFJZIHBHcm91cEVudHJ5KQotewotCVBORElTX1BBQ0tFVCBwU2tiQ2xvbmUgPSBOVUxMOwotCVBNRU1CRVJfRU5UUlkgcE1lbWJlckVudHJ5ID0gKFBNRU1CRVJfRU5UUlkpcEdyb3VwRW50cnktPk1lbWJlckxpc3QucEhlYWQ7Ci0JTUFDX1RBQkxFX0VOVFJZICpwTWFjRW50cnkgPSBOVUxMOwotCVVTSE9SVCBBaWQ7Ci0JU1NUCVNzdCA9IFNTVF9BU1NPQzsKLQlVQ0hBUiBQc01vZGUgPSBQV1JfQUNUSVZFOwotCVVDSEFSIFJhdGU7Ci0JdW5zaWduZWQgbG9uZyBJcnFGbGFnczsKLQotCS8vIGNoZWNrIGFsbCBtZW1iZXJzIG9mIHRoZSBJR01QIGdyb3VwLgotCXdoaWxlKHBNZW1iZXJFbnRyeSAhPSBOVUxMKQotCXsKLQkJcE1hY0VudHJ5ID0gQVBTc1BzSW5xdWlyeShwQWQsIHBNZW1iZXJFbnRyeS0+QWRkciwgJlNzdCwgJkFpZCwgJlBzTW9kZSwgJlJhdGUpOwotCi0JCWlmIChwTWFjRW50cnkgJiYgKFNzdCA9PSBTU1RfQVNTT0MpICYmIChQc01vZGUgIT0gUFdSX1NBVkUpKQotCQl7Ci0JCXBTa2JDbG9uZSA9IHNrYl9jbG9uZShSVFBLVF9UT19PU1BLVChwUGFja2V0KSwgTUVNX0FMTE9DX0ZMQUcpOwotCQlpZihwU2tiQ2xvbmUpCi0JCXsKLQkJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwU2tiQ2xvbmUsIChVQ0hBUilBaWQpOwotCQkJCS8vIFBrdCB0eXBlIG11c3Qgc2V0IHRvIFBLVFNSQ19ORElTLgotCQkJCS8vIEl0IGNhdXNlIG9mIHRoZSBkZWFzb24gdGhhdCBBUEhhcmRUcmFuc21pdCgpCi0JCQkJLy8gZG9lc24ndCBoYW5kbGUgUEtUU1JDX0RSSVZFUiBwa3QgdHlwZSBpbiB2ZXJzaW9uIDEuMy4wLjAuCi0JCQkJUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShwU2tiQ2xvbmUsIFBLVFNSQ19ORElTKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwTWVtYmVyRW50cnkgPSBwTWVtYmVyRW50cnktPnBOZXh0OwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvLyBpbnNlcnQgdGhlIHBrdCB0byBUeFN3UXVldWUuCi0JCQlpZiAocEFkLT5UeFN3UXVldWVbUXVlSWR4XS5OdW1iZXIgPj0gTUFYX1BBQ0tFVFNfSU5fUVVFVUUpCi0JCQl7Ci0jaWZkZWYgQkxPQ0tfTkVUX0lGCi0JCQkJU3RvcE5ldElmUXVldWUocEFkLCBRdWVJZHgsIHBTa2JDbG9uZSk7Ci0jZW5kaWYgLy8gQkxPQ0tfTkVUX0lGIC8vCi0JCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBTa2JDbG9uZSwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwotCQkJCUluc2VydFRhaWxRdWV1ZUFjKHBBZCwgcE1hY0VudHJ5LCAmcEFkLT5UeFN3UXVldWVbUXVlSWR4XSwgUEFDS0VUX1RPX1FVRVVFX0VOVFJZKHBTa2JDbG9uZSkpOwotCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwotCQkJfQotCQl9Ci0JCXBNZW1iZXJFbnRyeSA9IHBNZW1iZXJFbnRyeS0+cE5leHQ7Ci0JfQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgaW5saW5lIEJPT0xFQU4gaXNNbGRNYWNBZGRyKAotCUlOIFBVQ0hBUiBwTWFjQWRkcikKLXsKLQlyZXR1cm4gKChwTWFjQWRkclswXSA9PSAweDMzKSAmJiAocE1hY0FkZHJbMV0gPT0gMHgzMykpID8gVFJVRSA6IEZBTFNFOwotfQotCi1zdGF0aWMgaW5saW5lIEJPT0xFQU4gSXNTdXBwb3J0ZWRNbGRNc2coCi0JSU4gVUlOVDggTXNnVHlwZSkKLXsKLQlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOwotCXN3aXRjaChNc2dUeXBlKQotCXsKLQkJY2FzZSBNTERfVjFfTElTVEVORVJfUkVQT1JUOgotCQljYXNlIE1MRF9WMV9MSVNURU5FUl9ET05FOgotCQljYXNlIE1MRF9WMl9MSVNURVJORVJfUkVQT1JUOgotCQkJcmVzdWx0ID0gVFJVRTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmVzdWx0ID0gRkFMU0U7Ci0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi1CT09MRUFOIGlzTWxkUGt0KAotCUlOIFBVQ0hBUiBwRHN0TWFjQWRkciwKLQlJTiBQVUNIQVIgcElwSGVhZGVyLAotCU9VVCBVSU5UOCAqcFByb3RvVHlwZSwKLQlPVVQgUFVDSEFSICpwTWxkSGVhZGVyKQotewotCUJPT0xFQU4gcmVzdWx0ID0gRkFMU0U7Ci0JVUlOVDE2IElwUHJvdG9jb2wgPSBudG9ocygqKChVSU5UMTYgKikocElwSGVhZGVyKSkpOwotCi0JaWYoIWlzTWxkTWFjQWRkcihwRHN0TWFjQWRkcikpCi0JCXJldHVybiBGQUxTRTsKLQotCWlmKElwUHJvdG9jb2wgIT0gRVRIX1BfSVBWNikKLQkJcmV0dXJuIEZBTFNFOwotCi0JLy8gc2tpcCBwcm90b2NvbCAoMiBCeXRlcykuCi0JcElwSGVhZGVyICs9IDI7Ci0JZG8KLQl7Ci0JCVBSVF9JUFY2X0hEUiBwSXB2NkhkciA9IChQUlRfSVBWNl9IRFIpKHBJcEhlYWRlcik7Ci0JCVVJTlQ4IG5leHRQcm90b2NvbCA9IHBJcHY2SGRyLT5uZXh0SGRyOwotCQlVSU5UMzIgb2Zmc2V0ID0gSVBWNl9IRFJfTEVOOwotCi0JCXdoaWxlKG5leHRQcm90b2NvbCAhPSBJUFY2X05FWFRfSEVBREVSX0lDTVBWNikKLQkJewotCQkJaWYoSVB2NkV4dEhkckhhbmRsZSgoUlRfSVBWNl9FWFRfSERSICopKHBJcEhlYWRlciArIG9mZnNldCksICZuZXh0UHJvdG9jb2wsICZvZmZzZXQpID09IEZBTFNFKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYobmV4dFByb3RvY29sID09IElQVjZfTkVYVF9IRUFERVJfSUNNUFY2KQotCQl7Ci0JCQlQUlRfSUNNUFY2X0hEUiBwSUNNUHY2SGRyID0gKFBSVF9JQ01QVjZfSERSKShwSXBIZWFkZXIgKyBvZmZzZXQpOwotCQkJaWYgKElzU3VwcG9ydGVkTWxkTXNnKHBJQ01QdjZIZHItPnR5cGUpID09IFRSVUUpCi0JCQl7Ci0JCQkJaWYgKHBQcm90b1R5cGUgIT0gTlVMTCkKLQkJCQkJKnBQcm90b1R5cGUgPSBwSUNNUHY2SGRyLT50eXBlOwotCQkJCWlmIChwTWxkSGVhZGVyICE9IE5VTEwpCi0JCQkJCSpwTWxkSGVhZGVyID0gKFBVQ0hBUilwSUNNUHY2SGRyOwotCQkJCXJlc3VsdCA9IFRSVUU7Ci0JCQl9Ci0JCX0KLQl9d2hpbGUoRkFMU0UpOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogIE1MRCB2MSBtZXNzYWdlcyBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgotCTAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKLQkwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKLQkrLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotCXwgICAgIFR5cGUgICAgICB8ICAgICBDb2RlICAgICAgfCAgICAgICAgICBDaGVja3N1bSAgICAgICAgICAgICB8Ci0JKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLQl8ICAgICBNYXhpbXVtIFJlc3BvbnNlIERlbGF5ICAgIHwgICAgICAgICAgUmVzZXJ2ZWQgICAgICAgICAgICAgfAotCSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0JfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLQkrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKwotCXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0JKyAgICAgICAgICAgICAgICAgICAgICAgTXVsdGljYXN0IEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICsKLQl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotCSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArCi0JfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLQkrLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotKi8KLQotLyoJVmVyc2lvbiAzIE1lbWJlcnNoaXAgUmVwb3J0IE1lc3NhZ2UKLQkwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCi0JMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCi0JKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLQl8ICBUeXBlID0gMTQzICAgfCAgICBSZXNlcnZlZCAgIHwgICAgICAgICAgIENoZWNrc3VtICAgICAgICAgICAgfAotCSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0JfCAgICAgICAgICAgUmVzZXJ2ZWQgICAgICAgICAgICB8ICBOdW1iZXIgb2YgR3JvdXAgUmVjb3JkcyAoTSkgIHwKLQkrLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotCXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0JLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KLQkuICAgICAgICAgICAgICAgTXVsdGljYXN0IEFkZHJlc3MgUmVjb3JkIFsxXSAgICAgICAgICAgICAgICAgICAgLgotCS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCi0JfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLQkrLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotCXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0JLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KLQkuICAgICAgICAgICAgICAgTXVsdGljYXN0IEFkZHJlc3MgUmVjb3JkIFsyXSAgICAgICAgICAgICAgICAgICAgLgotCS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCi0JfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLQkrLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotCXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0JLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KLQl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotCSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0JfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLQkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgotCS4gICAgICAgICAgICAgICBNdWx0aWNhc3QgQWRkcmVzcyBSZWNvcmQgW01dICAgICAgICAgICAgICAgICAgICAuCi0JLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KLQl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotCSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0KLQotCXdoZXJlIGVhY2ggR3JvdXAgUmVjb3JkIGhhcyB0aGUgZm9sbG93aW5nIGludGVybmFsIGZvcm1hdDoKLQkrLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotCXwgIFJlY29yZCBUeXBlICB8ICBBdXggRGF0YSBMZW4gfCAgICAgTnVtYmVyIG9mIFNvdXJjZXMgKE4pICAgICB8Ci0JKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICBNdWx0aWNhc3QgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgKgotICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotCSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgU291cmNlIEFkZHJlc3MgWzFdICAgICAgICAgICAgICAgICAgICAgICoKLSAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICArLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKwotICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICogICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZSBBZGRyZXNzIFsyXSAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgKy0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSsKLSAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgotICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCi0gICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KLSAgICArLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKwotICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICogICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZSBBZGRyZXNzIFtOXSAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCi0gICAgLiAgICAgICAgICAgICAgICAgICAgICAgICBBdXhpbGlhcnkgRGF0YSAgICAgICAgICAgICAgICAgICAgICAgIC4KLSAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgotICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSovCi0KLVZPSUQgTUxEU25vb3BpbmcoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBEc3RNYWNBZGRyLAotCUlOIFBVQ0hBUiBwU3JjTWFjQWRkciwKLQlJTiBQVUNIQVIgcElwSGVhZGVyLAotCUlOIFBORVRfREVWIHBEZXYpCi17Ci0JSU5UIGk7Ci0JVUNIQVIgR3JvdXBUeXBlOwotCVVJTlQxNiBudW1PZkdyb3VwOwotCVBVQ0hBUiBwR3JvdXA7Ci0JVUNIQVIgQXV4RGF0YUxlbjsKLQlVSU5UMTYgbnVtT2ZTb3VyY2VzOwotCVBVQ0hBUiBwR3JvdXBJcEFkZHI7Ci0JVUNIQVIgR3JvdXBNYWNBZGRyWzZdOwotCVBVQ0hBUiBwR3JvdXBNYWNBZGRyID0gKFBVQ0hBUikmR3JvdXBNYWNBZGRyOwotCi0JVUlOVDggTWxkVHlwZTsKLQlQVUNIQVIgcE1sZEhlYWRlcjsKLQotCWlmKGlzTWxkUGt0KHBEc3RNYWNBZGRyLCBwSXBIZWFkZXIsICZNbGRUeXBlLCAmcE1sZEhlYWRlcikgPT0gVFJVRSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1MRCB0eXBlPSUweFxuIiwgTWxkVHlwZSkpOwotCi0JCXN3aXRjaChNbGRUeXBlKQotCQl7Ci0JCQljYXNlIE1MRF9WMV9MSVNURU5FUl9SRVBPUlQ6Ci0JCQkJLy8gc2tpcCBUeXBlKDEgQnl0ZSksIGNvZGUoMSBCeXRlKSwgY2hlY2tzdW0oMiBCeXRlcyksIE1heGltdW0gUnNwIERlbGF5KDIgQnl0ZXMpLCBSZXNlcnZlKDIgQnl0ZXMpLgotCQkJCXBHcm91cElwQWRkciA9IChQVUNIQVIpKHBNbGRIZWFkZXIgKyA4KTsKLQkJCQlDb252ZXJ0TXVsdGljYXN0SVAyTUFDKHBHcm91cElwQWRkciwgKFBVQ0hBUiAqKSZwR3JvdXBNYWNBZGRyLCBFVEhfUF9JUFY2KTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJHcm91cCBJZD0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCQkJCUdyb3VwTWFjQWRkclswXSwgR3JvdXBNYWNBZGRyWzFdLCBHcm91cE1hY0FkZHJbMl0sIEdyb3VwTWFjQWRkclszXSwgR3JvdXBNYWNBZGRyWzRdLCBHcm91cE1hY0FkZHJbNV0pKTsKLQkJCQlNdWx0aWNhc3RGaWx0ZXJUYWJsZUluc2VydEVudHJ5KHBBZCwgR3JvdXBNYWNBZGRyLCBwU3JjTWFjQWRkciwgcERldiwgTUNBVF9GSUxURVJfRFlOQU1JQyk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgTUxEX1YxX0xJU1RFTkVSX0RPTkU6Ci0JCQkJLy8gc2tpcCBUeXBlKDEgQnl0ZSksIGNvZGUoMSBCeXRlKSwgY2hlY2tzdW0oMiBCeXRlcyksIE1heGltdW0gUnNwIERlbGF5KDIgQnl0ZXMpLCBSZXNlcnZlKDIgQnl0ZXMpLgotCQkJCXBHcm91cElwQWRkciA9IChQVUNIQVIpKHBNbGRIZWFkZXIgKyA4KTsKLQkJCQlDb252ZXJ0TXVsdGljYXN0SVAyTUFDKHBHcm91cElwQWRkciwgKFBVQ0hBUiAqKSZwR3JvdXBNYWNBZGRyLCBFVEhfUF9JUFY2KTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJHcm91cCBJZD0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCQkJCUdyb3VwTWFjQWRkclswXSwgR3JvdXBNYWNBZGRyWzFdLCBHcm91cE1hY0FkZHJbMl0sIEdyb3VwTWFjQWRkclszXSwgR3JvdXBNYWNBZGRyWzRdLCBHcm91cE1hY0FkZHJbNV0pKTsKLQkJCQlNdWx0aWNhc3RGaWx0ZXJUYWJsZURlbGV0ZUVudHJ5KHBBZCwgR3JvdXBNYWNBZGRyLCBwU3JjTWFjQWRkciwgcERldik7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgTUxEX1YyX0xJU1RFUk5FUl9SRVBPUlQ6IC8vIElHTVAgdmVyc2lvbiAzIG1lbWJlcnNoaXAgcmVwb3J0LgotCQkJCW51bU9mR3JvdXAgPSBudG9ocygqKChVSU5UMTYgKikocE1sZEhlYWRlciArIDYpKSk7Ci0JCQkJcEdyb3VwID0gKFBVQ0hBUikocE1sZEhlYWRlciArIDgpOwotCQkJCWZvciAoaT0wOyBpIDwgbnVtT2ZHcm91cDsgaSsrKQotCQkJCXsKLQkJCQkJR3JvdXBUeXBlID0gKFVDSEFSKSgqcEdyb3VwKTsKLQkJCQkJQXV4RGF0YUxlbiA9IChVQ0hBUikoKihwR3JvdXAgKyAxKSk7Ci0JCQkJCW51bU9mU291cmNlcyA9IG50b2hzKCooKFVJTlQxNiAqKShwR3JvdXAgKyAyKSkpOwotCQkJCQlwR3JvdXBJcEFkZHIgPSAoUFVDSEFSKShwR3JvdXAgKyA0KTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTUxEdjIgVHlwZT0lZCwgQURMPSVkLCBudW1PZlNvdXJjZT0lZFxuIiwgR3JvdXBUeXBlLCBBdXhEYXRhTGVuLCBudW1PZlNvdXJjZXMpKTsKLQkJCQkJQ29udmVydE11bHRpY2FzdElQMk1BQyhwR3JvdXBJcEFkZHIsIChQVUNIQVIgKikmcEdyb3VwTWFjQWRkciwgRVRIX1BfSVBWNik7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1MRCBHcm91cD0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCQkJCQlHcm91cE1hY0FkZHJbMF0sIEdyb3VwTWFjQWRkclsxXSwgR3JvdXBNYWNBZGRyWzJdLCBHcm91cE1hY0FkZHJbM10sIEdyb3VwTWFjQWRkcls0XSwgR3JvdXBNYWNBZGRyWzVdKSk7Ci0KLQkJCQkJZG8KLQkJCQkJewotCQkJCQkJaWYoKEdyb3VwVHlwZSA9PSBNT0RFX0lTX0VYQ0xVREUpIHx8IChHcm91cFR5cGUgPT0gQ0hBTkdFX1RPX0VYQ0xVREVfTU9ERSkgfHwgKEdyb3VwVHlwZSA9PSBBTExPV19ORVdfU09VUkNFUykpCi0JCQkJCQl7Ci0JCQkJCQkJTXVsdGljYXN0RmlsdGVyVGFibGVJbnNlcnRFbnRyeShwQWQsIEdyb3VwTWFjQWRkciwgcFNyY01hY0FkZHIsIHBEZXYsIE1DQVRfRklMVEVSX0RZTkFNSUMpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCi0JCQkJCQlpZigoR3JvdXBUeXBlID09IE1PREVfSVNfSU5DTFVERSkgfHwgKEdyb3VwVHlwZSA9PSBCTE9DS19PTERfU09VUkNFUykpCi0JCQkJCQl7Ci0JCQkJCQkJTXVsdGljYXN0RmlsdGVyVGFibGVEZWxldGVFbnRyeShwQWQsIEdyb3VwTWFjQWRkciwgcFNyY01hY0FkZHIsIHBEZXYpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCi0JCQkJCQlpZigoR3JvdXBUeXBlID09IENIQU5HRV9UT19JTkNMVURFX01PREUpKQotCQkJCQkJewotCQkJCQkJCWlmKG51bU9mU291cmNlcyA9PSAwKQotCQkJCQkJCQlNdWx0aWNhc3RGaWx0ZXJUYWJsZURlbGV0ZUVudHJ5KHBBZCwgR3JvdXBNYWNBZGRyLCBwU3JjTWFjQWRkciwgcERldik7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlNdWx0aWNhc3RGaWx0ZXJUYWJsZUluc2VydEVudHJ5KHBBZCwgR3JvdXBNYWNBZGRyLCBwU3JjTWFjQWRkciwgcERldiwgTUNBVF9GSUxURVJfRFlOQU1JQyk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0gd2hpbGUoRkFMU0UpOwotCQkJCQkvLyBza2lwIDQgQnl0ZXMgKFJlY29yZCBUeXBlLCBBdXggRGF0YSBMZW4sIE51bWJlciBvZiBTb3VyY2VzKSArIGEgSVB2NiBhZGRyZXNzLgotCQkJCQlwR3JvdXAgKz0gKDQgKyBJUFY2X0FERFJfTEVOICsgKG51bU9mU291cmNlcyAqIDE2KSArIEF1eERhdGFMZW4pOwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ1bmtub3cgTUxEIFR5cGU9JWRcbiIsIE1sZFR5cGUpKTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybjsKLX0KLQotCi0jZW5kaWYgLy8gSUdNUF9TTk9PUF9TVVBQT1JUIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9tbG1lLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9tbG1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MTNjMDQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vbWxtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjU1MCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCW1sbWUuYwotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUpvaG4gQ2hhbmcJMjAwNC0wOC0yNQkJTW9kaWZ5IGZyb20gUlQyNTAwIGNvZGUgYmFzZQotCUpvaG4gQ2hhbmcJMjAwNC0wOS0wNgkJbW9kaWZpZWQgZm9yIFJUMjYwMAotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi1VQ0hBUglDSVNDT19PVUlbXSA9IHsweDAwLCAweDQwLCAweDk2fTsKLQotVUNIQVIJV1BBX09VSVtdID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDF9OwotVUNIQVIJUlNOX09VSVtdID0gezB4MDAsIDB4MGYsIDB4YWN9OwotVUNIQVIJV0FQSV9PVUlbXSA9IHsweDAwLCAweDE0LCAweDcyfTsKLVVDSEFSICAgV01FX0lORk9fRUxFTVtdICA9IHsweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAwLCAweDAxfTsKLVVDSEFSICAgV01FX1BBUk1fRUxFTVtdID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDEsIDB4MDF9OwotVUNIQVIJQ2N4MlFvc0luZm9bXSA9IHsweDAwLCAweDQwLCAweDk2LCAweDA0fTsKLVVDSEFSICAgUkFMSU5LX09VSVtdICA9IHsweDAwLCAweDBjLCAweDQzfTsKLVVDSEFSICAgQlJPQURDT01fT1VJW10gID0gezB4MDAsIDB4OTAsIDB4NGN9OwotVUNIQVIgICBXUFNfT1VJW10gPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwNH07Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi1VQ0hBUglQUkVfTl9IVF9PVUlbXQk9IHsweDAwLCAweDkwLCAweDRjfTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlW10gPSB7Ci0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgxMSwgMHgwMCwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MDAsICAwLCA0MCwgMTAxLAotICAgIDB4MDEsIDB4MDAsICAxLCA0MCwgNTAsCi0gICAgMHgwMiwgMHgwMCwgIDIsIDM1LCA0NSwKLSAgICAweDAzLCAweDAwLCAgMywgMjAsIDQ1LAotICAgIDB4MDQsIDB4MjEsICAwLCAzMCwgNTAsCi0gICAgMHgwNSwgMHgyMSwgIDEsIDIwLCA1MCwKLSAgICAweDA2LCAweDIxLCAgMiwgMjAsIDUwLAotICAgIDB4MDcsIDB4MjEsICAzLCAxNSwgNTAsCi0gICAgMHgwOCwgMHgyMSwgIDQsIDE1LCAzMCwKLSAgICAweDA5LCAweDIxLCAgNSwgMTAsIDI1LAotICAgIDB4MGEsIDB4MjEsICA2LCAgOCwgMjUsCi0gICAgMHgwYiwgMHgyMSwgIDcsICA4LCAyNSwKLSAgICAweDBjLCAweDIwLCAxMiwgIDE1LCAzMCwKLSAgICAweDBkLCAweDIwLCAxMywgIDgsIDIwLAotICAgIDB4MGUsIDB4MjAsIDE0LCAgOCwgMjAsCi0gICAgMHgwZiwgMHgyMCwgMTUsICA4LCAyNSwKLSAgICAweDEwLCAweDIyLCAxNSwgIDgsIDI1LAotICAgIDB4MTEsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxMiwgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDEzLCAweDAwLCAgMCwgIDAsICAwLAotICAgIDB4MTQsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxNSwgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDE2LCAweDAwLCAgMCwgIDAsICAwLAotICAgIDB4MTcsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxOCwgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDE5LCAweDAwLCAgMCwgIDAsICAwLAotICAgIDB4MWEsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxYiwgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDFjLCAweDAwLCAgMCwgIDAsICAwLAotICAgIDB4MWQsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxZSwgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDFmLCAweDAwLCAgMCwgIDAsICAwLAotfTsKLQotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCW10gPSB7Ci0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwNCwgMHgwMywgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MDAsICAwLCA0MCwgMTAxLAotICAgIDB4MDEsIDB4MDAsICAxLCA0MCwgNTAsCi0gICAgMHgwMiwgMHgwMCwgIDIsIDM1LCA0NSwKLSAgICAweDAzLCAweDAwLCAgMywgMjAsIDQ1LAotfTsKLQotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR1tdID0gewotLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQotICAgIDB4MGEsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KLSAgICAweDAwLCAweDAwLCAgMCwgNDAsIDEwMSwKLSAgICAweDAxLCAweDAwLCAgMSwgNDAsIDUwLAotICAgIDB4MDIsIDB4MDAsICAyLCAzNSwgNDUsCi0gICAgMHgwMywgMHgwMCwgIDMsIDIwLCA0NSwKLSAgICAweDA0LCAweDEwLCAgMiwgMjAsIDM1LAotICAgIDB4MDUsIDB4MTAsICAzLCAxNiwgMzUsCi0gICAgMHgwNiwgMHgxMCwgIDQsIDEwLCAyNSwKLSAgICAweDA3LCAweDEwLCAgNSwgMTYsIDI1LAotICAgIDB4MDgsIDB4MTAsICA2LCAxMCwgMjUsCi0gICAgMHgwOSwgMHgxMCwgIDcsIDEwLCAxMywKLX07Ci0KLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExR1tdID0gewotLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQotICAgIDB4MDgsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KLSAgICAweDAwLCAweDEwLCAgMCwgMjAsIDEwMSwKLSAgICAweDAxLCAweDEwLCAgMSwgMjAsIDM1LAotICAgIDB4MDIsIDB4MTAsICAyLCAyMCwgMzUsCi0gICAgMHgwMywgMHgxMCwgIDMsIDE2LCAzNSwKLSAgICAweDA0LCAweDEwLCAgNCwgMTAsIDI1LAotICAgIDB4MDUsIDB4MTAsICA1LCAxNiwgMjUsCi0gICAgMHgwNiwgMHgxMCwgIDYsIDEwLCAyNSwKLSAgICAweDA3LCAweDEwLCAgNywgMTAsIDEzLAotfTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFOMVNbXSA9IHsKLS8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKLSAgICAweDBjLCAweDBhLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCi0gICAgMHgwMCwgMHgwMCwgIDAsIDQwLCAxMDEsCi0gICAgMHgwMSwgMHgwMCwgIDEsIDQwLCA1MCwKLSAgICAweDAyLCAweDAwLCAgMiwgMjUsIDQ1LAotICAgIDB4MDMsIDB4MjEsICAwLCAyMCwgMzUsCi0gICAgMHgwNCwgMHgyMSwgIDEsIDIwLCAzNSwKLSAgICAweDA1LCAweDIxLCAgMiwgMjAsIDM1LAotICAgIDB4MDYsIDB4MjEsICAzLCAxNSwgMzUsCi0gICAgMHgwNywgMHgyMSwgIDQsIDE1LCAzMCwKLSAgICAweDA4LCAweDIxLCAgNSwgMTAsIDI1LAotICAgIDB4MDksIDB4MjEsICA2LCAgOCwgMTQsCi0gICAgMHgwYSwgMHgyMSwgIDcsICA4LCAxNCwKLSAgICAweDBiLCAweDIzLCAgNywgIDgsIDE0LAotfTsKLQotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFOMlNbXSA9IHsKLS8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKLSAgICAweDBlLCAweDBjLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCi0gICAgMHgwMCwgMHgwMCwgIDAsIDQwLCAxMDEsCi0gICAgMHgwMSwgMHgwMCwgIDEsIDQwLCA1MCwKLSAgICAweDAyLCAweDAwLCAgMiwgMjUsIDQ1LAotICAgIDB4MDMsIDB4MjEsICAwLCAyMCwgMzUsCi0gICAgMHgwNCwgMHgyMSwgIDEsIDIwLCAzNSwKLSAgICAweDA1LCAweDIxLCAgMiwgMjAsIDM1LAotICAgIDB4MDYsIDB4MjEsICAzLCAxNSwgMzUsCi0gICAgMHgwNywgMHgyMSwgIDQsIDE1LCAzMCwKLSAgICAweDA4LCAweDIwLCAxMSwgMTUsIDMwLAotICAgIDB4MDksIDB4MjAsIDEyLCAxNSwgMzAsCi0gICAgMHgwYSwgMHgyMCwgMTMsICA4LCAyMCwKLSAgICAweDBiLCAweDIwLCAxNCwgIDgsIDIwLAotICAgIDB4MGMsIDB4MjAsIDE1LCAgOCwgMjUsCi0gICAgMHgwZCwgMHgyMiwgMTUsICA4LCAxNSwKLX07Ci0KLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExTjNTW10gPSB7Ci0vLyBJdGVtIE5vLglNb2RlCUN1cnItTUNTCVRyYWluVXAJVHJhaW5Eb3duCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwYiwgMHgwMCwgIDAsICAwLCAgMCwJLy8gMHgwYSwgMHgwMCwgIDAsICAwLCAgMCwgICAgICAvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MjEsICAwLCAzMCwgMTAxLAotICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCi0gICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKLSAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAotICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCi0gICAgMHgwNSwgMHgyMCwgMTEsIDE1LCAzMCwJLy8gUmVxdWlyZWQgYnkgU3lzdGVtLUFsYW4gQCAyMDA4MDgxMgotICAgIDB4MDYsIDB4MjAsIDEyLCAxNSwgMzAsCS8vIDB4MDUsIDB4MjAsIDEyLCAxNSwgMzAsCi0gICAgMHgwNywgMHgyMCwgMTMsICA4LCAyMCwJLy8gMHgwNiwgMHgyMCwgMTMsICA4LCAyMCwKLSAgICAweDA4LCAweDIwLCAxNCwgIDgsIDIwLAkvLyAweDA3LCAweDIwLCAxNCwgIDgsIDIwLAotICAgIDB4MDksIDB4MjAsIDE1LCAgOCwgMjUsCS8vIDB4MDgsIDB4MjAsIDE1LCAgOCwgMjUsCi0gICAgMHgwYSwgMHgyMiwgMTUsICA4LCAyNSwJLy8gMHgwOSwgMHgyMiwgMTUsICA4LCAyNSwKLX07Ci0KLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbXSA9IHsKLS8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKLSAgICAweDBiLCAweDA5LCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCi0gICAgMHgwMCwgMHgyMSwgIDAsIDMwLCAxMDEsCi0gICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKLSAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAotICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCi0gICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKLSAgICAweDA1LCAweDIxLCAgNSwgMTUsIDMwLAotICAgIDB4MDYsIDB4MjAsIDEyLCAgMTUsIDMwLAotICAgIDB4MDcsIDB4MjAsIDEzLCAgOCwgMjAsCi0gICAgMHgwOCwgMHgyMCwgMTQsICA4LCAyMCwKLSAgICAweDA5LCAweDIwLCAxNSwgIDgsIDI1LAotICAgIDB4MGEsIDB4MjIsIDE1LCAgOCwgMjUsCi19OwotCi1VQ0hBUiBSYXRlU3dpdGNoVGFibGUxMU4zU0ZvckFCYW5kW10gPSB7IC8vIDMqMwotLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQotICAgIDB4MGIsIDB4MDksICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KLSAgICAweDAwLCAweDIxLCAgMCwgMzAsIDEwMSwKLSAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAotICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCi0gICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKLSAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAotICAgIDB4MDUsIDB4MjEsICA1LCAxNSwgMzAsCi0gICAgMHgwNiwgMHgyMCwgMTIsICAxNSwgMzAsCi0gICAgMHgwNywgMHgyMCwgMTMsICA4LCAyMCwKLSAgICAweDA4LCAweDIwLCAxNCwgIDgsIDIwLAotICAgIDB4MDksIDB4MjAsIDE1LCAgOCwgMjUsCi0gICAgMHgwYSwgMHgyMiwgMTUsICA4LCAyNSwKLX07Ci0KLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExQkdOMVNbXSA9IHsKLS8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKLSAgICAweDBjLCAweDBhLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCi0gICAgMHgwMCwgMHgwMCwgIDAsIDQwLCAxMDEsCi0gICAgMHgwMSwgMHgwMCwgIDEsIDQwLCA1MCwKLSAgICAweDAyLCAweDAwLCAgMiwgMjUsIDQ1LAotICAgIDB4MDMsIDB4MjEsICAwLCAyMCwgMzUsCi0gICAgMHgwNCwgMHgyMSwgIDEsIDIwLCAzNSwKLSAgICAweDA1LCAweDIxLCAgMiwgMjAsIDM1LAotICAgIDB4MDYsIDB4MjEsICAzLCAxNSwgMzUsCi0gICAgMHgwNywgMHgyMSwgIDQsIDE1LCAzMCwKLSAgICAweDA4LCAweDIxLCAgNSwgMTAsIDI1LAotICAgIDB4MDksIDB4MjEsICA2LCAgOCwgMTQsCi0gICAgMHgwYSwgMHgyMSwgIDcsICA4LCAxNCwKLSAgICAweDBiLCAweDIzLCAgNywgIDgsIDE0LAotfTsKLQotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU1tdID0gewotLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQotICAgIDB4MGUsIDB4MGMsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KLSAgICAweDAwLCAweDAwLCAgMCwgNDAsIDEwMSwKLSAgICAweDAxLCAweDAwLCAgMSwgNDAsIDUwLAotICAgIDB4MDIsIDB4MDAsICAyLCAyNSwgNDUsCi0gICAgMHgwMywgMHgyMSwgIDAsIDIwLCAzNSwKLSAgICAweDA0LCAweDIxLCAgMSwgMjAsIDM1LAotICAgIDB4MDUsIDB4MjEsICAyLCAyMCwgMzUsCi0gICAgMHgwNiwgMHgyMSwgIDMsIDE1LCAzNSwKLSAgICAweDA3LCAweDIxLCAgNCwgMTUsIDMwLAotICAgIDB4MDgsIDB4MjAsIDExLCAxNSwgMzAsCi0gICAgMHgwOSwgMHgyMCwgMTIsIDE1LCAzMCwKLSAgICAweDBhLCAweDIwLCAxMywgIDgsIDIwLAotICAgIDB4MGIsIDB4MjAsIDE0LCAgOCwgMjAsCi0gICAgMHgwYywgMHgyMCwgMTUsICA4LCAyNSwKLSAgICAweDBkLCAweDIyLCAxNSwgIDgsIDE1LAotfTsKLQotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04zU1tdID0geyAvLyAzKjMKLS8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKLSAgICAweDBhLCAweDAwLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCi0gICAgMHgwMCwgMHgyMSwgIDAsIDMwLDEwMSwJLy81MAotICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCi0gICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKLSAgICAweDAzLCAweDIxLCAgMywgMjAsIDUwLAotICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgNTAsCi0gICAgMHgwNSwgMHgyMCwgMjAsIDE1LCAzMCwKLSAgICAweDA2LCAweDIwLCAyMSwgIDgsIDIwLAotICAgIDB4MDcsIDB4MjAsIDIyLCAgOCwgMjAsCi0gICAgMHgwOCwgMHgyMCwgMjMsICA4LCAyNSwKLSAgICAweDA5LCAweDIyLCAyMywgIDgsIDI1LAotfTsKLQotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kW10gPSB7Ci0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwYiwgMHgwOSwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MjEsICAwLCAzMCwxMDEsCS8vNTAKLSAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAotICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCi0gICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKLSAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAotICAgIDB4MDUsIDB4MjEsICA1LCAxNSwgMzAsCi0gICAgMHgwNiwgMHgyMCwgMTIsIDE1LCAzMCwKLSAgICAweDA3LCAweDIwLCAxMywgIDgsIDIwLAotICAgIDB4MDgsIDB4MjAsIDE0LCAgOCwgMjAsCi0gICAgMHgwOSwgMHgyMCwgMTUsICA4LCAyNSwKLSAgICAweDBhLCAweDIyLCAxNSwgIDgsIDI1LAotfTsKLQotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04zU0ZvckFCYW5kW10gPSB7IC8vIDMqMwotLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQotICAgIDB4MGMsIDB4MDksICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KLSAgICAweDAwLCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCi0gICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKLSAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAotICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCi0gICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKLSAgICAweDA1LCAweDIxLCAgNSwgMTUsIDMwLAotICAgIDB4MDYsIDB4MjEsIDEyLCAxNSwgMzAsCi0gICAgMHgwNywgMHgyMCwgMjAsIDE1LCAzMCwKLSAgICAweDA4LCAweDIwLCAyMSwgIDgsIDIwLAotICAgIDB4MDksIDB4MjAsIDIyLCAgOCwgMjAsCi0gICAgMHgwYSwgMHgyMCwgMjMsICA4LCAyNSwKLSAgICAweDBiLCAweDIyLCAyMywgIDgsIDI1LAotfTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCi1leHRlcm4gVUNIQVIJIE9mZG1SYXRlVG9SeHdpTUNTW107Ci0vLyBzaW5jZSBSVDYxIGhhcyBiZXR0ZXIgUlggc2Vuc2liaWxpdHksIHdlIGhhdmUgdG8gbGltaXQgVFggQUNLIHJhdGUgbm90IHRvIGV4Y2VlZCBvdXIgbm9ybWFsIGRhdGEgVFggcmF0ZS4KLS8vIG90aGVyd2lzZSB0aGUgV0xBTiBwZWVyIG1heSBub3QgYmUgYWJsZSB0byByZWNlaXZlIHRoZSBBQ0sgdGh1cyBkb3duZ3JhZGUgaXRzIGRhdGEgVFggcmF0ZQotVUxPTkcgQmFzaWNSYXRlTWFza1sxMl0JCQkJPSB7MHhmZmZmZjAwMSAvKiAxLU1icHMgKi8sIDB4ZmZmZmYwMDMgLyogMiBNYnBzICovLCAweGZmZmZmMDA3IC8qIDUuNSAqLywgMHhmZmZmZjAwZiAvKiAxMSAqLywKLQkJCQkJCQkJCSAgMHhmZmZmZjAxZiAvKiA2ICovCSAsIDB4ZmZmZmYwM2YgLyogOSAqLwkgICwgMHhmZmZmZjA3ZiAvKiAxMiAqLyAsIDB4ZmZmZmYwZmYgLyogMTggKi8sCi0JCQkJCQkJCQkgIDB4ZmZmZmYxZmYgLyogMjQgKi8JICwgMHhmZmZmZjNmZiAvKiAzNiAqLwkgICwgMHhmZmZmZjdmZiAvKiA0OCAqLyAsIDB4ZmZmZmZmZmYgLyogNTQgKi99OwotCi1VQ0hBUiBCUk9BRENBU1RfQUREUltNQUNfQUREUl9MRU5dID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwotVUNIQVIgWkVST19NQUNfQUREUltNQUNfQUREUl9MRU5dICA9IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKLQotLy8gZS5nLiBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW1JBVEVfMzZdIiBtZWFucyBpZiB0aGUgY3VycmVudCBSU1NJIGlzIGdyZWF0ZXIgdGhhbgotLy8JCXRoaXMgdmFsdWUsIHRoZW4gaXQncyBxdWFyYW50ZWVkIGNhcGFibGUgb2Ygb3BlcmF0aW5nIGluIDM2IG1icHMgVFggcmF0ZSBpbgotLy8JCWNsZWFuIGVudmlyb25tZW50LgotLy8JCQkJCQkJCSAgVHhSYXRlOiAxICAgMiAgIDUuNQkxMQkgNgkgIDkgICAgMTIJMTgJIDI0ICAgMzYgICA0OAk1NAkgNzIgIDEwMAotQ0hBUiBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW10gPXsgIC05MiwgLTkxLCAtOTAsIC04NywgLTg4LCAtODYsIC04NSwgLTgzLCAtODEsIC03OCwgLTcyLCAtNzEsIC00MCwgLTQwIH07Ci0KLVVDSEFSICBSYXRlSWRUb01icHNbXQkgPSB7IDEsIDIsIDUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0LCA3MiwgMTAwfTsKLVVTSE9SVCBSYXRlSWRUbzUwMEticHNbXSA9IHsgMiwgNCwgMTEsIDIyLCAxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4LCAxNDQsIDIwMH07Ci0KLVVDSEFSICBTc2lkSWUJID0gSUVfU1NJRDsKLVVDSEFSICBTdXBSYXRlSWUgPSBJRV9TVVBQX1JBVEVTOwotVUNIQVIgIEV4dFJhdGVJZSA9IElFX0VYVF9TVVBQX1JBVEVTOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotVUNIQVIgIEh0Q2FwSWUgPSBJRV9IVF9DQVA7Ci1VQ0hBUiAgQWRkSHRJbmZvSWUgPSBJRV9BRERfSFQ7Ci1VQ0hBUiAgTmV3RXh0Q2hhbkllID0gSUVfU0VDT05EQVJZX0NIX09GRlNFVDsKLSNpZmRlZiBET1QxMU5fRFJBRlQzCi1VQ0hBUiAgRXh0SHRDYXBJZSA9IElFX0VYVF9DQVBBQklMSVRZOwotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLVVDSEFSICBFcnBJZQkgPSBJRV9FUlA7Ci1VQ0hBUiAgRHNJZQkgPSBJRV9EU19QQVJNOwotVUNIQVIgIFRpbUllCSA9IElFX1RJTTsKLVVDSEFSICBXcGFJZQkgPSBJRV9XUEE7Ci1VQ0hBUiAgV3BhMkllCSA9IElFX1dQQTI7Ci1VQ0hBUiAgSWJzc0llCSA9IElFX0lCU1NfUEFSTTsKLVVDSEFSICBDY3gySWUJID0gSUVfQ0NYX1YyOwotVUNIQVIgIFdhcGlJZQkgPSBJRV9XQVBJOwotCi1leHRlcm4gVUNIQVIJV1BBX09VSVtdOwotCi1VQ0hBUglTRVNfT1VJW10gPSB7MHgwMCwgMHg5MCwgMHg0Y307Ci0KLVVDSEFSCVplcm9Tc2lkWzMyXSA9IHsweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9OwotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJaW5pdGlhbGl6ZSB0aGUgTUxNRSB0YXNrIGFuZCBpdHMgZGF0YSBzdHJ1Y3R1cmUgKHF1ZXVlLCBzcGlubG9jaywKLQkJdGltZXIsIHN0YXRlIG1hY2hpbmVzKS4KLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQlSZXR1cm46Ci0JCWFsd2F5cyByZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUwotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTX1NUQVRVUyBNbG1lSW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlORElTX1NUQVRVUyBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE1MTUUgSW5pdGlhbGl6ZVxuIikpOwotCi0JZG8KLQl7Ci0JCVN0YXR1cyA9IE1sbWVRdWV1ZUluaXQoJnBBZC0+TWxtZS5RdWV1ZSk7Ci0JCWlmKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQkJYnJlYWs7Ci0KLQkJcEFkLT5NbG1lLmJSdW5uaW5nID0gRkFMU0U7Ci0JCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKLQotCQkJLy8gaW5pdCBTVEEgc3RhdGUgbWFjaGluZXMKLQkJCUFzc29jU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLCBwQWQtPk1sbWUuQXNzb2NGdW5jKTsKLQkJCUF1dGhTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5BdXRoTWFjaGluZSwgcEFkLT5NbG1lLkF1dGhGdW5jKTsKLQkJCUF1dGhSc3BTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5BdXRoUnNwTWFjaGluZSwgcEFkLT5NbG1lLkF1dGhSc3BGdW5jKTsKLQkJCVN5bmNTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5TeW5jTWFjaGluZSwgcEFkLT5NbG1lLlN5bmNGdW5jKTsKLQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQkJRGxzU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuRGxzTWFjaGluZSwgcEFkLT5NbG1lLkRsc0Z1bmMpOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCi0KLQotCQkJLy8gU2luY2Ugd2UgYXJlIHVzaW5nIHN3aXRjaC9jYXNlIHRvIGltcGxlbWVudCBpdCwgdGhlIGluaXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIGFib3ZlCi0JCQkvLyBzdGF0ZSBtYWNoaW5lIGluaXQKLQkJCU1sbWVDbnRsSW5pdChwQWQsICZwQWQtPk1sbWUuQ250bE1hY2hpbmUsIE5VTEwpOwotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCQlXcGFTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5XcGFNYWNoaW5lLCBwQWQtPk1sbWUuV3BhRnVuYyk7Ci0KLQotCQlBY3Rpb25TdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5BY3RNYWNoaW5lLCBwQWQtPk1sbWUuQWN0RnVuYyk7Ci0KLQkJLy8gSW5pdCBtbG1lIHBlcmlvZGljIHRpbWVyCi0JCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lLlBlcmlvZGljVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihNbG1lUGVyaW9kaWNFeGVjKSwgcEFkLCBUUlVFKTsKLQotCQkvLyBTZXQgbWxtZSBwZXJpb2RpYyB0aW1lcgotCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5QZXJpb2RpY1RpbWVyLCBNTE1FX1RBU0tfRVhFQ19JTlRWKTsKLQotCQkvLyBzb2Z0d2FyZS1iYXNlZCBSWCBBbnRlbm5hIGRpdmVyc2l0eQotCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZS5SeEFudEV2YWxUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEFzaWNSeEFudEV2YWxUaW1lb3V0KSwgcEFkLCBGQUxTRSk7Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0jaWZkZWYgUlRNUF9QQ0lfU1VQUE9SVAotCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKQotCQkJewotCQkJICAgIC8vIG9ubHkgUENJZSBjYXJkcyBuZWVkIHRoZXNlIHR3byB0aW1lcnMKLQkJCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFBzUG9sbFdha2VFeGVjKSwgcEFkLCBGQUxTRSk7Ci0JCQkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oUmFkaW9PbkV4ZWMpLCBwQWQsIEZBTFNFKTsKLQkJCX0KLSNlbmRpZiAvLyBSVE1QX1BDSV9TVVBQT1JUIC8vCi0KLQkJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lLkxpbmtEb3duVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihMaW5rRG93bkV4ZWMpLCBwQWQsIEZBTFNFKTsKLQotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQl9IHdoaWxlIChGQUxTRSk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTUxNRSBJbml0aWFsaXplXG4iKSk7Ci0KLQlyZXR1cm4gU3RhdHVzOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCW1haW4gbG9vcCBvZiB0aGUgTUxNRQotCVByZToKLQkJTWxtZSBoYXMgdG8gYmUgaW5pdGlhbGl6ZWQsIGFuZCB0aGVyZSBhcmUgc29tZXRoaW5nIGluc2lkZSB0aGUgcXVldWUKLQlOb3RlOgotCQlUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgZnJvbSBNUFNldEluZm9ybWF0aW9uIGFuZCBNUFJlY2VpdmU7Ci0JCVRoaXMgdGFzayBndWFyYW50ZWUgb25seSBvbmUgTWxtZUhhbmRsZXIgd2lsbCBydW4uCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgTWxtZUhhbmRsZXIoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JTUxNRV9RVUVVRV9FTEVNCQkgICAqRWxlbSA9IE5VTEw7Ci0jaWZkZWYgQVBDTElfU1VQUE9SVAotCVNIT1JUIGFwY2xpSWZJbmRleDsKLSNlbmRpZiAvLyBBUENMSV9TVVBQT1JUIC8vCi0KLQkvLyBPbmx5IGFjY2VwdCBNTE1FIGFuZCBGcmFtZSBmcm9tIHBlZXIgc2lkZSwgbm8gb3RoZXIgKGNvbnRyb2wvZGF0YSkgZnJhbWUgc2hvdWxkCi0JLy8gZ2V0IGludG8gdGhpcyBzdGF0ZSBtYWNoaW5lCi0KLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOwotCWlmKHBBZC0+TWxtZS5iUnVubmluZykKLQl7Ci0JCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7Ci0JCXJldHVybjsKLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5NbG1lLmJSdW5uaW5nID0gVFJVRTsKLQl9Ci0JTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKLQotCXdoaWxlICghTWxtZVF1ZXVlRW1wdHkoJnBBZC0+TWxtZS5RdWV1ZSkpCi0JewotCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX01MTUVfUkVTRVRfSU5fUFJPR1JFU1MpIHx8Ci0JCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykgfHwKLQkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRGV2aWNlIEhhbHRlZCBvciBSZW1vdmVkIG9yIE1sbWVSZXN0LCBleGl0IE1sbWVIYW5kbGVyISAocXVldWUgbnVtID0gJWxkKVxuIiwgcEFkLT5NbG1lLlF1ZXVlLk51bSkpOwotCQkJYnJlYWs7Ci0JCX0KLQotI2lmZGVmIFJBTElOS19BVEUKLQkJaWYoQVRFX09OKHBBZCkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93IGluIE1sbWVIYW5kbGVyXG4iKSk7Ci0JCQlicmVhazsKLQkJfQotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotCQkvL0Zyb20gbWVzc2FnZSB0eXBlLCBkZXRlcm1pbmUgd2hpY2ggc3RhdGUgbWFjaGluZSBJIHNob3VsZCBkcml2ZQotCQlpZiAoTWxtZURlcXVldWUoJnBBZC0+TWxtZS5RdWV1ZSwgJkVsZW0pKQotCQl7Ci0KLQkJCS8vIGlmIGRlcXVldWUgc3VjY2VzcwotCQkJc3dpdGNoIChFbGVtLT5NYWNoaW5lKQotCQkJewotCQkJCS8vIFNUQSBzdGF0ZSBtYWNoaW5lcwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkJCWNhc2UgQVNTT0NfU1RBVEVfTUFDSElORToKLQkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLCBFbGVtKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBBVVRIX1NUQVRFX01BQ0hJTkU6Ci0JCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkF1dGhNYWNoaW5lLCBFbGVtKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBBVVRIX1JTUF9TVEFURV9NQUNISU5FOgotCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5BdXRoUnNwTWFjaGluZSwgRWxlbSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1lOQ19TVEFURV9NQUNISU5FOgotCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5TeW5jTWFjaGluZSwgRWxlbSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkU6Ci0JCQkJCU1sbWVDbnRsTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkNudGxNYWNoaW5lLCBFbGVtKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBXUEFfUFNLX1NUQVRFX01BQ0hJTkU6Ci0JCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLldwYVBza01hY2hpbmUsIEVsZW0pOwotCQkJCQlicmVhazsKLQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQkJCWNhc2UgRExTX1NUQVRFX01BQ0hJTkU6Ci0JCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkRsc01hY2hpbmUsIEVsZW0pOwotCQkJCQlicmVhazsKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JCQkJY2FzZSBBQ1RJT05fU1RBVEVfTUFDSElORToKLQkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuQWN0TWFjaGluZSwgRWxlbSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBXUEFfU1RBVEVfTUFDSElORToKLQkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuV3BhTWFjaGluZSwgRWxlbSk7Ci0JCQkJCWJyZWFrOwotCi0KLQkJCQlkZWZhdWx0OgotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJFUlJPUjogSWxsZWdhbCBtYWNoaW5lICVsZCBpbiBNbG1lSGFuZGxlcigpXG4iLCBFbGVtLT5NYWNoaW5lKSk7Ci0JCQkJCWJyZWFrOwotCQkJfSAvLyBlbmQgb2Ygc3dpdGNoCi0KLQkJCS8vIGZyZWUgTUxNRSBlbGVtZW50Ci0JCQlFbGVtLT5PY2N1cGllZCA9IEZBTFNFOwotCQkJRWxlbS0+TXNnTGVuID0gMDsKLQotCQl9Ci0JCWVsc2UgewotCQkJREJHUFJJTlRfRVJSKCgiTWxtZUhhbmRsZXI6IE1sbWVRdWV1ZSBlbXB0eVxuIikpOwotCQl9Ci0JfQotCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKLQlwQWQtPk1sbWUuYlJ1bm5pbmcgPSBGQUxTRTsKLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCURlc3RydWN0b3Igb2YgTUxNRSAoRGVzdHJveSBxdWV1ZSwgc3RhdGUgbWFjaGluZSwgc3BpbiBsb2NrIGFuZCB0aW1lcikKLQlQYXJhbWV0ZXJzOgotCQlBZGFwdGVyIC0gTklDIEFkYXB0ZXIgcG9pbnRlcgotCVBvc3Q6Ci0JCVRoZSBNTE1FIHRhc2sgd2lsbCBubyBsb25nZXIgd29yayBwcm9wZXJseQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgTWxtZUhhbHQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JQk9PTEVBTgkJICBDYW5jZWxsZWQ7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gTWxtZUhhbHRcbiIpKTsKLQotCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCXsKLQkJLy8gZGlzYWJsZSBCRUFDT04gZ2VuZXJhdGlvbiBhbmQgb3RoZXIgQkVBQ09OIHJlbGF0ZWQgaGFyZHdhcmUgdGltZXJzCi0JCUFzaWNEaXNhYmxlU3luYyhwQWQpOwotCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQlVQ0hBUgkJaTsKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQkJLy8gQ2FuY2VsIHBlbmRpbmcgdGltZXJzCi0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsCQkmQ2FuY2VsbGVkKTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLAkJJkNhbmNlbGxlZCk7Ci0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsCSZDYW5jZWxsZWQpOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsCQkmQ2FuY2VsbGVkKTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsCQkmQ2FuY2VsbGVkKTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLAkJJkNhbmNlbGxlZCk7Ci0KLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCSAgICBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkKLQkJCSYmKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSkKLQkgICAgewotCQkgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCQkmQ2FuY2VsbGVkKTsKLQkJICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwJCSZDYW5jZWxsZWQpOwotCQl9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKLQkJewotCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJkNhbmNlbGxlZCk7Ci0JCX0KLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuTGlua0Rvd25UaW1lciwJCSZDYW5jZWxsZWQpOwotCi0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwJCSZDYW5jZWxsZWQpOwotCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlJ4QW50RXZhbFRpbWVyLAkJJkNhbmNlbGxlZCk7Ci0KLQotCi0JaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JewotCQlSVE1QX0NISVBfT1AgKnBDaGlwT3BzID0gJnBBZC0+Y2hpcE9wczsKLQotCQkvLyBTZXQgTEVECi0JCVJUTVBTZXRMRUQocEFkLCBMRURfSEFMVCk7Ci0JCVJUTVBTZXRTaWduYWxMRUQocEFkLCAtMTAwKTsJLy8gRm9yY2Ugc2lnbmFsIHN0cmVuZ3RoIExlZCB0byBiZSB0dXJuZWQgb2ZmLCBmaXJtd2FyZSBpcyBub3QgZG9uZSBpdC4KLQotCQlpZiAocENoaXBPcHMtPkFzaWNIYWx0QWN0aW9uKQotCQkJcENoaXBPcHMtPkFzaWNIYWx0QWN0aW9uKHBBZCk7Ci0JfQotCi0JUlRNUHVzZWNEZWxheSg1MDAwKTsgICAgLy8gIDUgbXNlYyB0byBndXJhbnRlZSBBbnQgRGl2ZXJzaXR5IHRpbWVyIGNhbmNlbGVkCi0KLQlNbG1lUXVldWVEZXN0cm95KCZwQWQtPk1sbWUuUXVldWUpOwotCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gTWxtZUhhbHRcbiIpKTsKLX0KLQotVk9JRCBNbG1lUmVzZXRSYWxpbmtDb3VudGVycygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCkKLXsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNSeE9rRGF0YUNudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0RhdGFDbnQ7Ci0JLy8gY2xlYXIgYWxsIE9uZVNlY3h4eCBjb3VudGVycy4KLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0JlYWNvblNlbnRDbnQgPSAwOwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRmFsc2VDQ0FDbnQgPSAwOwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhGY3NFcnJDbnQgPSAwOwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0NudCA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudCA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ID0gMDsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ID0gMDsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4T2tEYXRhQ250ID0gMDsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1JlY2VpdmVkQnl0ZUNvdW50ID0gMDsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1RyYW5zbWl0dGVkQnl0ZUNvdW50ID0gMDsKLQotCS8vIFRPRE86IGZvciBkZWJ1ZyBvbmx5LiB0byBiZSByZW1vdmVkCi0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUUlEX0FDX0JFXSA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUUlEX0FDX0JLXSA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUUlEX0FDX1ZJXSA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUUlEX0FDX1ZPXSA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNEbWFEb25lQ291bnRbUUlEX0FDX0JFXSA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNEbWFEb25lQ291bnRbUUlEX0FDX0JLXSA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNEbWFEb25lQ291bnRbUUlEX0FDX1ZJXSA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNEbWFEb25lQ291bnRbUUlEX0FDX1ZPXSA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeENvdW50ID0gMDsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4QWdncmVnYXRpb25Db3VudCA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEFnZ3JlZ2F0aW9uQ291bnQgPSAwOwotCi0JcmV0dXJuOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyByb3V0aW5lIGlzIGV4ZWN1dGVkIHBlcmlvZGljYWxseSB0byAtCi0JCTEuIERlY2lkZSBpZiBpdCdzIGEgcmlnaHQgdGltZSB0byB0dXJuIG9uIFB3ck1nbXQgYml0IG9mIGFsbAotCQkgICBvdXRnb2lpbmcgZnJhbWVzCi0JCTIuIENhbGN1bGF0ZSBDaGFubmVsUXVhbGl0eSBiYXNlZCBvbiBzdGF0aXN0aWNzIG9mIHRoZSBsYXN0Ci0JCSAgIHBlcmlvZCwgc28gdGhhdCBUWCByYXRlIHdvbid0IHRvZ2dsaW5nIHZlcnkgZnJlcXVlbnRseSBiZXR3ZWVuIGEKLQkJICAgc3VjY2Vzc2Z1bCBUWCBhbmQgYSBmYWlsZWQgVFguCi0JCTMuIElmIHRoZSBjYWxjdWxhdGVkIENoYW5uZWxRdWFsaXR5IGluZGljYXRlZCBjdXJyZW50IGNvbm5lY3Rpb24gbm90Ci0JCSAgIGhlYWx0aHksIHRoZW4gYSBST0FNaW5nIGF0dGVtcHQgaXMgdHJpZWQgaGVyZS4KLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotI2RlZmluZSBBREhPQ19CRUFDT05fTE9TVF9USU1FCQkoOCpPU19IWikgIC8vIDggc2VjCi1WT0lEIE1sbWVQZXJpb2RpY0V4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQotewotCVVMT05HCQkJVHhUb3RhbENudDsKLQlQUlRNUF9BREFQVEVSCXBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7Ci0JU0hPUlQJcmVhbGF2Z3Jzc2k7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkgICAgLy8gSWYgSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBlbmFibGVkLCB3ZSBoYXZlIHRvIGNoZWNrIEdQSU8gcGluMiBldmVyeSAyIHNlY29uZC4KLQkJLy8gTW92ZSBjb2RlIHRvIGhlcmUsIGJlY2F1c2UgZm9sbG93aW5nIGNvZGUgd2lsbCByZXR1cm4gd2hlbiByYWRpbyBpcyBvZmYKLQkJaWYgKChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCAlIChNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSAqIDIpID09IDApICYmIChwQWQtPlN0YUNmZy5iSGFyZHdhcmVSYWRpbyA9PSBUUlVFKSAmJgotCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpICYmCi0JCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkKLQkJCS8qJiYocEFkLT5iUENJY2xrT2ZmID09IEZBTFNFKSovKQotCQl7Ci0JCQlVSU5UMzIJCQkJZGF0YSA9IDA7Ci0KLQkJCS8vIFJlYWQgR1BJTyBwaW4yIGFzIEhhcmR3YXJlIGNvbnRyb2xsZWQgcmFkaW8gc3RhdGUKLSNpZm5kZWYgUlQzMDkwCi0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIEdQSU9fQ1RSTF9DRkcsICZkYXRhKTsKLSNlbmRpZiAvLyBSVDMwOTAgLy8KLS8vS0goUENJRSBQUyk6QWRkZWQgYmFzZWQgb24gSmFuZTwtLQotI2lmZGVmIFJUMzA5MAotLy8gUmVhZCBHUElPIHBpbjIgYXMgSGFyZHdhcmUgY29udHJvbGxlZCByYWRpbyBzdGF0ZQotLy8gV2UgbmVlZCB0byBSZWFkIEdQSU8gaWYgSFcgc2FpZCBzbyBubyBtYXRlciB3aGF0IGFkdmFuY2UgcG93ZXIgc2F2aW5nCi1pZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIChJRExFX09OKHBBZCkpCi0JJiYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRikpCi0JJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVQU2luSWRsZSA9PSBUUlVFKSkKLQl7Ci0JLy8gV2FudCB0byBtYWtlIHN1cmUgZGV2aWNlIGdvZXMgdG8gTDAgc3RhdGUgYmVmb3JlIHJlYWRpbmcgcmVnaXN0ZXIuCi0JUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsIDApOwotCVJUTVBfSU9fRk9SQ0VfUkVBRDMyKHBBZCwgR1BJT19DVFJMX0NGRywgJmRhdGEpOwotCVJUTVBQQ0llTGlua0N0cmxTZXR0aW5nKHBBZCwgMyk7Ci0JfQotZWxzZQotCVJUTVBfSU9fRk9SQ0VfUkVBRDMyKHBBZCwgR1BJT19DVFJMX0NGRywgJmRhdGEpOwotI2VuZGlmIC8vIFJUMzA5MCAvLwotLy9LSChQQ0lFIFBTKTpBZGRlZCBiYXNlZCBvbiBKYW5lLS0+Ci0KLQkJCWlmIChkYXRhICYgMHgwNCkKLQkJCXsKLQkJCQlwQWQtPlN0YUNmZy5iSHdSYWRpbyA9IFRSVUU7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcEFkLT5TdGFDZmcuYkh3UmFkaW8gPSBGQUxTRTsKLQkJCX0KLQkJCWlmIChwQWQtPlN0YUNmZy5iUmFkaW8gIT0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKSkKLQkJCXsKLQkJCQlwQWQtPlN0YUNmZy5iUmFkaW8gPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pOwotCQkJCWlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkKLQkJCQl7Ci0JCQkJCU1sbWVSYWRpb09uKHBBZCk7Ci0JCQkJCS8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgotCQkJCQlwQWQtPkV4dHJhSW5mbyA9IEVYVFJBX0lORk9fQ0xFQVI7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCU1sbWVSYWRpb09mZihwQWQpOwotCQkJCQkvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KLQkJCQkJcEFkLT5FeHRyYUluZm8gPSBIV19SQURJT19PRkY7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8Ci0JCQkJCQkJCWZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkpKQotCQlyZXR1cm47Ci0KLQlSVE1QX01MTUVfUFJFX1NBTklUWV9DSEVDSyhwQWQpOwotCi0jaWZkZWYgUkFMSU5LX0FURQotCS8qIERvIG5vdCBzaG93IFJTU0kgdW50aWwgIk5vcm1hbCAxIHNlY29uZCBNbG1lIFBlcmlvZGljRXhlYyIuICovCi0JaWYgKEFURV9PTihwQWQpKQotCXsKLQkJaWYgKHBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kICUgTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgIT0gKE1MTUVfVEFTS19FWEVDX01VTFRJUExFIC0gMSkpCi0JewotCQkJcEFkLT5NbG1lLlBlcmlvZGljUm91bmQgKys7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCS8vIERvIG5vdGhpbmcgaWYgbW9uaXRvciBtb2RlIGlzIG9uCi0JCWlmIChNT05JVE9SX09OKHBBZCkpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kICYgMHgxKQotCQl7Ci0JCQkvLyBUaGlzIGlzIHRoZSBmaXggZm9yIHdpZmkgMTFuIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIHRlc3QgY2FzZS4gIGZvciAyODYwRAotCQkJaWYgKCgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA9PSAweDAxMDEpICYmCi0JCQkJKFNUQV9UR05fV0lGSV9PTihwQWQpKSAmJgotCQkJCShwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJUb2dnbGUgPT0gRkFMU0UpKQotCi0JCQkJewotCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWE9QX0NUUkxfQ0ZHLCAweDI0QmYpOwotCQkJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJUb2dnbGUgPSBUUlVFOwotCQkJCX0KLQkJCQllbHNlIGlmICgoU1RBX1RHTl9XSUZJX09OKHBBZCkpICYmCi0JCQkJCQkoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPT0gMHgwMTAxKSkKLQkJCQl7Ci0JCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYT1BfQ1RSTF9DRkcsIDB4MjQzZik7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlRvZ2dsZSA9IEZBTFNFOwotCQkJCX0KLQkJfQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCXBBZC0+YlVwZGF0ZUJjbkNudERvbmUgPSBGQUxTRTsKLQotLy8JUkVDQkFUaW1lclRpbWVvdXQoU3lzdGVtU3BlY2lmaWMxLEZ1bmN0aW9uQ29udGV4dCxTeXN0ZW1TcGVjaWZpYzIsU3lzdGVtU3BlY2lmaWMzKTsKLQlwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCArKzsKLQotCi0JLy8gZXhlY3V0ZSBldmVyeSA1MDBtcwotCWlmICgocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJSA1ID09IDApICYmIFJUTVBBdXRvUmF0ZVN3aXRjaENoZWNrKHBBZCkvKihPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpKSovKQotCXsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJLy8gcGVyZm9ybSBkeW5hbWljIHR4IHJhdGUgc3dpdGNoaW5nIGJhc2VkIG9uIHBhc3QgVFggaGlzdG9yeQotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0JCQlpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKQotCQkJCQkpCi0JCQkJJiYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKSkKLQkJCQlNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZyhwQWQpOwotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JfQotCi0JLy8gTm9ybWFsIDEgc2Vjb25kIE1sbWUgUGVyaW9kaWNFeGVjLgotCWlmIChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCAlTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgPT0gMCkKLQl7Ci0gICAgICAgICAgICAgICAgcEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgKys7Ci0KLSNpZmRlZiBSQUxJTktfQVRFCi0JaWYgKEFURV9PTihwQWQpKQotCXsKLQkJCS8qIHJlcXVlc3QgZnJvbSBCYXJvbiA6IG1vdmUgdGhpcyByb3V0aW5lIGZyb20gbGF0ZXIgdG8gaGVyZSAqLwotCQkJLyogZm9yIHNob3dpbmcgUnggZXJyb3IgY291bnQgaW4gQVRFIFJYRlJBTUUgKi8KLSAgICAgICAgICAgIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzKHBBZCk7Ci0JCQlpZiAocEFkLT5hdGUuYlJ4RkVSID09IDEpCi0JCQl7Ci0JCQkJcEFkLT5hdGUuUnhUb3RhbENudCArPSBwQWQtPmF0ZS5SeENudFBlclNlYzsKLQkJCSAgICBhdGVfcHJpbnQoS0VSTl9FTUVSRyAiTWxtZVBlcmlvZGljRXhlYzogUnggcGFja2V0IGNudCA9ICVkLyVkXG4iLCBwQWQtPmF0ZS5SeENudFBlclNlYywgcEFkLT5hdGUuUnhUb3RhbENudCk7Ci0JCQkJcEFkLT5hdGUuUnhDbnRQZXJTZWMgPSAwOwotCi0JCQkJaWYgKHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9PSAwKQotCQkJCQlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiTWxtZVBlcmlvZGljRXhlYzogUnggQXZnUnNzaTA9JWQsIEF2Z1Jzc2kxPSVkLCBBdmdSc3NpMj0lZFxuXG4iLAotCQkJCQkJcEFkLT5hdGUuQXZnUnNzaTAsIHBBZC0+YXRlLkF2Z1Jzc2kxLCBwQWQtPmF0ZS5BdmdSc3NpMik7Ci0JCQkJZWxzZQotCQkJCQlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiTWxtZVBlcmlvZGljRXhlYzogUnggQXZnUnNzaT0lZFxuXG4iLCBwQWQtPmF0ZS5BdmdSc3NpMCk7Ci0JCQl9Ci0JCQlNbG1lUmVzZXRSYWxpbmtDb3VudGVycyhwQWQpOwotCi0KLQotCQkJcmV0dXJuOwotCX0KLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLQotCi0JCS8vT1JJQkFUaW1lclRpbWVvdXQocEFkKTsKLQotCQkvLyBNZWRpYSBzdGF0dXMgY2hhbmdlZCwgcmVwb3J0IHRvIE5ESVMKLQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9NRURJQV9TVEFURV9DSEFOR0UpKQotCQl7Ci0JCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX01FRElBX1NUQVRFX0NIQU5HRSk7Ci0JCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQotCQkJewotCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0JCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOwotCQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7Ci0JCQl9Ci0JCX0KLQotCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZwQWQtPk1sbWUuTm93MzIpOwotCi0JCS8vIGFkZCB0aGUgbW9zdCB1cC10by1kYXRlIGgvdyByYXcgY291bnRlcnMgaW50byBzb2Z0d2FyZSB2YXJpYWJsZSwgc28gdGhhdAotCQkvLyB0aGUgZHluYW1pYyB0dW5pbmcgbWVjaGFuaXNtIGJlbG93IGFyZSBiYXNlZCBvbiBtb3N0IHVwLXRvLWRhdGUgaW5mb3JtYXRpb24KLQkJTklDVXBkYXRlUmF3Q291bnRlcnMocEFkKTsKLQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCS8vIE5lZWQgc3RhdGlzdGljcyBhZnRlciByZWFkIGNvdW50ZXIuIFNvIHB1dCBhZnRlciBOSUNVcGRhdGVSYXdDb3VudGVycwotCQlPUklCQVRpbWVyVGltZW91dChwQWQpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JCS8vIGlmIE1HTVQgUklORyBpcyBmdWxsIG1vcmUgdGhhbiB0d2ljZSB3aXRoaW4gMSBzZWNvbmQsIHdlIGNvbnNpZGVyIHRoZXJlJ3MKLQkJLy8gYSBoYXJkd2FyZSBwcm9ibGVtIHN0dWNraW5nIHRoZSBUWCBwYXRoLiBJbiB0aGlzIGNhc2UsIHRyeSBhIGhhcmR3YXJlIHJlc2V0Ci0JCS8vIHRvIHJlY292ZXIgdGhlIHN5c3RlbQotCS8vCWlmIChwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50ID49IDIpCi0JLy8JCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBUkRXQVJFX0VSUk9SKTsKLQkvLwllbHNlCi0JLy8JCXBBZC0+UmFsaW5rQ291bnRlcnMuTWdtdFJpbmdGdWxsQ291bnQgPSAwOwotCi0JCS8vIFRoZSB0aW1lIHBlcmlvZCBmb3IgY2hlY2tpbmcgYW50ZW5uYSBpcyBhY2NvcmRpbmcgdG8gdHJhZmZpYwotI2lmZGVmIEFOVF9ESVZFUlNJVFlfU1VQUE9SVAotCQlpZiAoKHBBZC0+TmljQ29uZmlnMi5maWVsZC5BbnREaXZlcnNpdHkpICYmCi0JCQkocEFkLT5Db21tb25DZmcuYlJ4QW50RGl2ZXJzaXR5ID09IEFOVF9ESVZFUlNJVFlfRU5BQkxFKSAmJgotCQkJKCFwQWQtPkVlcHJvbUFjY2VzcykpCi0JCQlBc2ljQW50ZW5uYVNlbGVjdChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKTsKLQkJZWxzZSBpZihwQWQtPkNvbW1vbkNmZy5iUnhBbnREaXZlcnNpdHkgPT0gQU5UX0ZJWF9BTlQxIHx8IHBBZC0+Q29tbW9uQ2ZnLmJSeEFudERpdmVyc2l0eSA9PSBBTlRfRklYX0FOVDIpCi0JCXsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCXJlYWxhdmdyc3NpID0gKHBBZC0+UnhBbnQuUGFpcjFBdmdSc3NpW3BBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnRdID4+IDMpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBbnQtcmVhbHJzc2kwKCVkKSwgTGFzdHJzc2kwKCVkKSwgRXZhbHVhdGVTdGFibGVDbnQ9JWRcbiIsIHJlYWxhdmdyc3NpLCBwQWQtPlJ4QW50LlBhaXIxTGFzdEF2Z1Jzc2ksIHBBZC0+UnhBbnQuRXZhbHVhdGVTdGFibGVDbnQpKTsKLQkJfQotCQllbHNlCi0jZW5kaWYgLy8gQU5UX0RJVkVSU0lUWV9TVVBQT1JUIC8vCi0JCXsKLQkJCWlmIChwQWQtPk1sbWUuYkVuYWJsZUF1dG9BbnRlbm5hQ2hlY2spCi0JCQl7Ci0JCQkJVHhUb3RhbENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArCi0JCQkJCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKLQkJCQkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7Ci0KLQkJCQkvLyBkeW5hbWljIGFkanVzdCBhbnRlbm5hIGV2YWx1YXRpb24gcGVyaW9kIGFjY29yZGluZyB0byB0aGUgdHJhZmZpYwotCQkJCWlmIChUeFRvdGFsQ250ID4gNTApCi0JCQkJewotCQkJCQlpZiAocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSAxMCA9PSAwKQotCQkJCQl7Ci0JCQkJCQlBc2ljRXZhbHVhdGVSeEFudChwQWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDMgPT0gMCkKLQkJCQkJewotCQkJCQkJQXNpY0V2YWx1YXRlUnhBbnQocEFkKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQlTVEFNbG1lUGVyaW9kaWNFeGVjKHBBZCk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkJTWxtZVJlc2V0UmFsaW5rQ291bnRlcnMocEFkKTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCQlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSAmJiAocEFkLT5iUENJY2xrT2ZmID09IEZBTFNFKSkKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQkJCXsKLQkJCS8vIFdoZW4gQWRob2MgYmVhY29uIGlzIGVuYWJsZWQgYW5kIFJUUy9DVFMgaXMgZW5hYmxlZCwgdGhlcmUgaXMgYSBjaGFuY2UgdGhhdCBoYXJkd2FyZSBNQUMgRlNNIHdpbGwgcnVuIGludG8gYSBkZWFkbG9jawotCQkJLy8gYW5kIHNlbmRpbmcgQ1RTLXRvLXNlbGYgb3ZlciBhbmQgb3Zlci4KLQkJCS8vIFNvZnR3YXJlIFBhdGNoIFNvbHV0aW9uOgotCQkJLy8gMS4gUG9sbGluZyBkZWJ1ZyBzdGF0ZSByZWdpc3RlciAweDEwRjQgZXZlcnkgb25lIHNlY29uZC4KLQkJCS8vIDIuIElmIGluIDB4MTBGNCB0aGUgKChiaXQyOT09MSkgJiYgKGJpdDc9PTEpKSBPUiAoKGJpdDI5PT0xKSAmJiAoYml0NT09MSkpLCBpdCBtZWFucyB0aGUgZGVhZGxvY2sgaGFzIG9jY3VycmVkLgotCQkJLy8gMy4gSWYgdGhlIGRlYWRsb2NrIG9jY3VycmVkLCByZXNldCBNQUMvQkJQIGJ5IHNldHRpbmcgMHgxMDA0IHRvIDB4MDAwMSBmb3IgYSB3aGlsZSB0aGVuIHNldHRpbmcgaXQgYmFjayB0byAweDAwMEMgYWdhaW4uCi0KLQkJCVVJTlQzMglNYWNSZWcgPSAwOwotCi0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIDB4MTBGNCwgJk1hY1JlZyk7Ci0JCQlpZiAoKChNYWNSZWcgJiAweDIwMDAwMDAwKSAmJiAoTWFjUmVnICYgMHg4MCkpIHx8ICgoTWFjUmVnICYgMHgyMDAwMDAwMCkgJiYgKE1hY1JlZyAmIDB4MjApKSkKLQkJCXsKLQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MSk7Ci0JCQkJUlRNUHVzZWNEZWxheSgxKTsKLQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4Qyk7Ci0KLQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCgiV2FybmluZywgTUFDIHNwZWNpZmljIGNvbmRpdGlvbiBvY2N1cnMgXG4iKSk7Ci0JCQl9Ci0JCX0KLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7Ci0JfQotCi0KLQlwQWQtPmJVcGRhdGVCY25DbnREb25lID0gRkFMU0U7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCVZhbGlkYXRlIFNTSUQgZm9yIGNvbm5lY3Rpb24gdHJ5IGFuZCByZXNjYW4gcHVycG9zZQotCVZhbGlkIFNTSUQgd2lsbCBoYXZlIHZpc2libGUgY2hhcnMgb25seS4KLQlUaGUgdmFsaWQgbGVuZ3RoIGlzIGZyb20gMCB0byAzMi4KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIE1sbWVWYWxpZGF0ZVNTSUQoCi0JSU4gUFVDSEFSCXBTc2lkLAotCUlOIFVDSEFSCVNzaWRMZW4pCi17Ci0JaW50CWluZGV4OwotCi0JaWYgKFNzaWRMZW4gPiBNQVhfTEVOX09GX1NTSUQpCi0JCXJldHVybiAoRkFMU0UpOwotCi0JLy8gQ2hlY2sgZWFjaCBjaGFyYWN0ZXIgdmFsdWUKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTc2lkTGVuOyBpbmRleCsrKQotCXsKLQkJaWYgKHBTc2lkW2luZGV4XSA8IDB4MjApCi0JCQlyZXR1cm4gKEZBTFNFKTsKLQl9Ci0KLQkvLyBBbGwgY2hlY2tlZAotCXJldHVybiAoVFJVRSk7Ci19Ci0KLVZPSUQgTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKAotCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCi0JSU4gUFVDSEFSCQkJCSpwcFRhYmxlLAotCUlOIFBVQ0hBUgkJCQlwVGFibGVTaXplLAotCUlOIFBVQ0hBUgkJCQlwSW5pdFR4UmF0ZUlkeCkKLXsKLQlkbwotCXsKLQkJLy8gZGVjaWRlIHRoZSByYXRlIHRhYmxlIGZvciB0dW5pbmcKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZVRhYmxlU2l6ZSA+IDApCi0JCXsKLQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlOwotCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGVbMF07Ci0JCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGVbMV07Ci0KLQkJCWJyZWFrOwotCQl9Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiBBREhPQ19PTihwQWQpKQotCQl7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkgJiYKLQkJCQkocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmCi0JCQkJKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMHgwMCkgfHwgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkpKQotCQkJey8vIDExTiAxUyBBZGhvYwotCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVM7Ci0JCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4xU1swXTsKLQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4xU1sxXTsKLQotCQkJfQotCQkJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkgJiYKLQkJCQkJKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJgotCQkJCQkocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4ZmYpICYmCi0JCQkJCShwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKQotCQkJey8vIDExTiAyUyBBZGhvYwotCQkJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCi0JCQkJewotCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTOwotCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTWzBdOwotCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU1sxXTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kOwotCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMF07Ci0JCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMV07Ci0JCQkJfQotCi0JCQl9Ci0JCQllbHNlCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkJaWYgKChwRW50cnktPlJhdGVMZW4gPT0gNCkKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCQkJJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAwKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDApCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkJCSkKLQkJCXsKLQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQjsKLQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQlswXTsKLQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJbMV07Ci0KLQkJCX0KLQkJCWVsc2UgaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKLQkJCXsKLQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkc7Ci0JCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHWzBdOwotCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdbMV07Ci0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExRzsKLQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExR1swXTsKLQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUdbMV07Ci0KLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJLy9pZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gKyBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID09IDEyKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMHhmZikgJiYKLQkJLy8JKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAweDAwKSB8fCAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKSkpCi0JCWlmICgoKHBFbnRyeS0+UmF0ZUxlbiA9PSAxMikgfHwgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmCi0JCQkoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweDAwKSB8fCAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkpKQotCQl7Ly8gMTFCR04gMVMgQVAKLQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04xUzsKLQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04xU1swXTsKLQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMVNbMV07Ci0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJLy9lbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiArIHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPT0gMTIpICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAweGZmKSAmJgotCQkvLwkocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMHhmZikgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCi0JCWlmICgoKHBFbnRyeS0+UmF0ZUxlbiA9PSAxMikgfHwgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmCi0JCQkocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAyKSkKLQkJey8vIDExQkdOIDJTIEFQCi0JCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQotCQkJewotCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yUzsKLQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNbMF07Ci0JCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yU1sxXTsKLQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kOwotCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kWzBdOwotCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZFsxXTsKLQotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQotCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAweGZmKSAmJiAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDB4MDApIHx8IChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpKSkKLQkJaWYgKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMHhmZikgJiYgKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMHgwMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpKSkKLQkJey8vIDExTiAxUyBBUAotCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4xUzsKLQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMF07Ci0JCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4xU1sxXTsKLQotCQkJYnJlYWs7Ci0JCX0KLQotCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAweGZmKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMHhmZikgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCi0JCWlmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMHhmZikgJiYgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDIpKQotCQl7Ly8gMTFOIDJTIEFQCi0JCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQotCQkJewotCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yUzsKLQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMF07Ci0JCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU1sxXTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmQ7Ci0JCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzBdOwotCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMV07Ci0JCQl9Ci0KLQkJCWJyZWFrOwotCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCS8vZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gPT0gNCkgJiYgKHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPT0gMCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAwKSkKLQkJaWYgKChwRW50cnktPlJhdGVMZW4gPT0gNCB8fCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlPT1QSFlfMTFCKQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkvL0l2ZXJzb24gbWFyayBmb3IgQWRob2MgYiBtb2RlLHN0YSB3aWxsIHVzZSByYXRlIDU0ICBNYnBzIHdoZW4gY29ubmVjdCB3aXRoIHN0YSBiL2cvbiBtb2RlCi0JCS8qICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKSovCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkpCi0JCXsvLyBCIG9ubHkgQVAKLQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCOwotCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJbMF07Ci0JCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJbMV07Ci0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJLy9lbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiArIHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPiA4KSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDApKQotCQlpZiAoKHBFbnRyeS0+UmF0ZUxlbiA+IDgpCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCSkKLQkJey8vIEIvRyAgbWl4ZWQgQVAKLQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCRzsKLQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCR1swXTsKLQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdbMV07Ci0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJLy9lbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiArIHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPT0gOCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAwKSkKLQkJaWYgKChwRW50cnktPlJhdGVMZW4gPT0gOCkKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCSYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJKQotCQl7Ly8gRyBvbmx5IEFQCi0JCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExRzsKLQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFHWzBdOwotCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFHWzFdOwotCi0JCQlicmVhazsKLQkJfQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCS8vZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAwKSkKLQkJCWlmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkpCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQl7CS8vIExlZ2FjeSBtb2RlCi0JCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA8PSBSQVRFXzExKQotCQkJCXsKLQkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUI7Ci0JCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzBdOwotCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJbMV07Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPiBSQVRFXzExKSAmJiAocEFkLT5Db21tb25DZmcuTWluVHhSYXRlID4gUkFURV8xMSkpCi0JCQkJewotCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExRzsKLQkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUdbMF07Ci0JCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExR1sxXTsKLQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkc7Ci0JCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCR1swXTsKLQkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCR1sxXTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQotCQkJewotCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAxKQotCQkJCXsKLQkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4xUzsKLQkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4xU1swXTsKLQkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMV07Ci0JCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIkRSUzogdW5rb3duIG1vZGUsZGVmYXVsdCB1c2UgMTFOIDFTIEFQIFxuIikpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTOwotCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTWzBdOwotCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU1sxXTsKLQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiRFJTOiB1bmtvd24gbW9kZSxkZWZhdWx0IHVzZSAxMU4gMlMgQVAgXG4iKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAxKQotCQkJCXsKLQkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4xUzsKLQkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4xU1swXTsKLQkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMV07Ci0JCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIkRSUzogdW5rb3duIG1vZGUsZGVmYXVsdCB1c2UgMTFOIDFTIEFQIFxuIikpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmQ7Ci0JCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFswXTsKLQkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFsxXTsKLQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiRFJTOiB1bmtvd24gbW9kZSxkZWZhdWx0IHVzZSAxMU4gMlMgQVAgXG4iKSk7Ci0JCQkJfQotCQkJfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiRFJTOiB1bmtvd24gbW9kZSAoU3VwUmF0ZUxlbj0lZCwgRXh0UmF0ZUxlbj0lZCwgTUNTU2V0WzBdPTB4JXgsIE1DU1NldFsxXT0weCV4KVxuIiwKLQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLCBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuLCBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSwgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0pKTsKLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCX0gd2hpbGUoRkFMU0UpOwotfQotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLVZPSUQgU1RBTWxtZVBlcmlvZGljRXhlYygKLQlQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlVTE9ORwkJCSAgICBUeFRvdGFsQ250OwotCWludAlpOwotCi0KLQotCi0JLyoKLQkJV2UgcmV0dXJuIGhlcmUgaW4gQVRFIG1vZGUsIGJlY2F1c2UgdGhlIHN0YXRpc3RpY3MKLQkJdGhhdCBBVEUgbmVlZCBhcmUgbm90IGNvbGxlY3RlZCB2aWEgdGhpcyByb3V0aW5lLgotCSovCi0jaWZkZWYgUkFMSU5LX0FURQotCWlmIChBVEVfT04ocEFkKSkKLQlyZXR1cm47Ci0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0jaWZkZWYgUkFMSU5LX0FURQotCS8vIEl0IGlzIHN1cHBvc2VkIHRoYXQgd2Ugd2lsbCBuZXZlciByZWFjaCBoZXJlIGluIEFURSBtb2RlLgotCUFTU0VSVCghKEFURV9PTihwQWQpKSk7Ci0JaWYgKEFURV9PTihwQWQpKQotCQlyZXR1cm47Ci0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0jaWZkZWYgUENJRV9QU19TVVBQT1JUCi0vLyBkb24ndCBwZXJmb3JtIGlkbGUtcG93ZXItc2F2ZSBtZWNoYW5pc20gd2l0aGluIDMgbWluIGFmdGVyIGRyaXZlciBpbml0aWFsaXphdGlvbi4KLS8vIFRoaXMgY2FuIG1ha2UgcmVib290ZXIgdGVzdCBtb3JlIHJvYnVzdAotaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKQotCXsKLQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIChJRExFX09OKHBBZCkpCi0JCSYmIChwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID09IFNZTkNfSURMRSkKLQkJJiYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKQotCQkmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRikpKQotCQl7Ci0JCWlmIChJU19SVDMwOTAocEFkKXx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKQotCQkJewotCQkJaWYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKQotCQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6JWRcbiIsX19GVU5DVElPTl9fLF9fTElORV9fKSk7Ci0KLQkJCQlSVDI4eHhQY2lBc2ljUmFkaW9PZmYocEFkLCBHVUlfSURMRV9QT1dFUl9TQVZFLCAwKTsKLQkJCQl9Ci0JCQllbHNlCi0JCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjolZFxuIixfX0ZVTkNUSU9OX18sX19MSU5FX18pKTsKLQkJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIFBvd2VyU2FmZUNJRCwgMHhmZiwgMHgyKTsKLQkJCQkvLyBXYWl0IGNvbW1hbmQgc3VjY2VzcwotCQkJCUFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJTYWZlQ0lEKTsKLQkJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRik7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUFNNIC0gcnQzMHh4IElzc3VlIFNsZWVwIGNvbW1hbmQpXG4iKSk7Ci0JCQkJfQotCQkJfQotCQllbHNlIGlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCA+IDE4MCkKLQkJCXsKLQkJCWlmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkKLQkJCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OiVkXG4iLF9fRlVOQ1RJT05fXyxfX0xJTkVfXykpOwotCQkJCVJUMjh4eFBjaUFzaWNSYWRpb09mZihwQWQsIEdVSV9JRExFX1BPV0VSX1NBVkUsIDApOwotCQkJCX0KLQkJCWVsc2UKLQkJCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OiVkXG4iLF9fRlVOQ1RJT05fXyxfX0xJTkVfXykpOwotCQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMCwgUG93ZXJTYWZlQ0lELCAweGZmLCAweDAyKTsKLQkJCQkvLyBXYWl0IGNvbW1hbmQgc3VjY2VzcwotCQkJCUFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJTYWZlQ0lEKTsKLQkJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRik7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUFNNIC0gIHJ0Mjh4eCBJc3N1ZSBTbGVlcCBjb21tYW5kKVxuIikpOwotCQkJCX0KLQkJCX0KLQkJfQotCWVsc2UKLQkJewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQU1sbWVQZXJpb2RpY0V4ZWMgTU1DSEsgLSBDb21tb25DZmcuU3NpZFslZF09JWMlYyVjJWMuLi4gTWxtZUF1eC5Tc2lkWyVkXT0lYyVjJWMlYy4uLlxuIiwKLQkJCXBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sIHBBZC0+Q29tbW9uQ2ZnLlNzaWRbMF0sIHBBZC0+Q29tbW9uQ2ZnLlNzaWRbMV0sIHBBZC0+Q29tbW9uQ2ZnLlNzaWRbMl0sIHBBZC0+Q29tbW9uQ2ZnLlNzaWRbM10sCi0JCQlwQWQtPk1sbWVBdXguU3NpZExlbiwgcEFkLT5NbG1lQXV4LlNzaWRbMF0sIHBBZC0+TWxtZUF1eC5Tc2lkWzFdLCBwQWQtPk1sbWVBdXguU3NpZFsyXSwgcEFkLT5NbG1lQXV4LlNzaWRbM10pKTsKLQkJfQotCX0KLSNlbmRpZiAvLyBQQ0lFX1BTX1NVUFBPUlQgLy8KLQotCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0gICAgewotCS8vIFdQQSBNSUMgZXJyb3Igc2hvdWxkIGJsb2NrIGFzc29jaWF0aW9uIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMKLQkJaWYgKHBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jICYmCi0JCQlSVE1QX1RJTUVfQUZURVIocEFkLT5NbG1lLk5vdzMyLCBwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lICsgKDYwKk9TX0haKSkpCi0JCXBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID0gRkFMU0U7Ci0gICAgfQotCi0gICAgaWYgKChwQWQtPlByZU1lZGlhU3RhdGUgIT0gcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUpICYmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkpCi0JewotCQlpZiAocEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPT0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQpCi0JCXsKLQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NUQV9MSU5LVVBfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLQkJfQotCQlwQWQtPlByZU1lZGlhU3RhdGUgPSBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZTsKLQl9Ci0KLQotCi0KLQlpZiAocEFkLT5Db21tb25DZmcuUFNQWGxpbmsgJiYgQURIT0NfT04ocEFkKSkKLQl7Ci0JfQotCWVsc2UKLQl7Ci0JQXNpY1N0YUJicFR1bmluZyhwQWQpOwotCX0KLQotCVR4VG90YWxDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKwotCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArCi0JCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50OwotCi0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQl7Ci0JCS8vIHVwZGF0ZSBjaGFubmVsIHF1YWxpdHkgZm9yIFJvYW1pbmcgYW5kIFVJIExpbmtRdWFsaXR5IGRpc3BsYXkKLQkJTWxtZUNhbGN1bGF0ZUNoYW5uZWxRdWFsaXR5KHBBZCwgTlVMTCwgcEFkLT5NbG1lLk5vdzMyKTsKLQl9Ci0KLQkvLyBtdXN0IGJlIEFGVEVSIE1sbWVEeW5hbWljVHhSYXRlU3dpdGNoaW5nKCkgYmVjYXVzZSBpdCBuZWVkcyB0byBrbm93IGlmCi0JLy8gUmFkaW8gaXMgY3VycmVudGx5IGluIG5vaXN5IGVudmlyb25tZW50Ci0JaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQotCUFzaWNBZGp1c3RUeFBvd2VyKHBBZCk7Ci0KLQlpZiAoSU5GUkFfT04ocEFkKSkKLQl7Ci0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCS8vIENoZWNrIERMUyB0aW1lIG91dCwgdGhlbiB0ZWFyIGRvd24gdGhvc2Ugc2Vzc2lvbgotCQlSVE1QQ2hlY2tETFNUaW1lT3V0KHBBZCk7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLQkJLy8gSXMgUFNNIGJpdCBjb25zaXN0ZW50IHdpdGggdXNlciBwb3dlciBtYW5hZ2VtZW50IHBvbGljeT8KLQkJLy8gVGhpcyBpcyB0aGUgb25seSBwbGFjZSB0aGF0IHdpbGwgc2V0IFBTTSBiaXQgT04uCi0JCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLQkJTWxtZUNoZWNrUHNtQ2hhbmdlKHBBZCwgcEFkLT5NbG1lLk5vdzMyKTsKLQotCQlwQWQtPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNUb3RhbFR4Q291bnQgPSBUeFRvdGFsQ250OwotCi0JCWlmICgoUlRNUF9USU1FX0FGVEVSKHBBZC0+TWxtZS5Ob3czMiwgcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSArICgxKk9TX0haKSkpICYmCi0JCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpICYmCi0JCQkoKChUeFRvdGFsQ250ICsgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rQ250KSA8IDYwMCkpKQotCQl7Ci0JCQlSVE1QU2V0QUdDSW5pdFZhbHVlKHBBZCwgQldfMjApOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBObyBCRUFDT04uIHJlc3RvcmUgUjY2IHRvIHRoZSBsb3cgYm91bmQoJWQpIFxuIiwgKDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKSkpKTsKLQkJfQotCi0gICAgICAgIC8vaWYgKChwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgPT0gMCkgJiYKLSAgICAgICAgLy8gICAgKHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgPT0gMCkpCi0gICAgICAgIHsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkKLQkJewotCQkgICAgLy8gV2hlbiBBUFNEIGlzIGVuYWJsZWQsIHRoZSBwZXJpb2QgY2hhbmdlcyBhcyAyMCBzZWMKLQkJCWlmICgocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSAyMCkgPT0gOCkKLQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgVFJVRSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCSAgICAvLyBTZW5kIG91dCBhIE5VTEwgZnJhbWUgZXZlcnkgMTAgc2VjIHRvIGluZm9ybSBBUCB0aGF0IFNUQSBpcyBzdGlsbCBhbGl2ZSAoQXZvaWQgYmVpbmcgYWdlIG91dCkKLQkJCWlmICgocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSAxMCkgPT0gOCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkKLQkJCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkLCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsIFRSVUUpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0JCQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgRkFMU0UpOwotICAgICAgICAgICAgICAgIH0KLQkJfQotICAgICAgICB9Ci0KLQkJaWYgKENRSV9JU19ERUFEKHBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSkpCi0JCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIE5vIEJFQUNPTi4gRGVhZCBDUUkuIEF1dG8gUmVjb3ZlcnkgYXR0ZW1wdCAjJWxkXG4iLCBwQWQtPlJhbGlua0NvdW50ZXJzLkJhZENRSUF1dG9SZWNvdmVyeUNvdW50KSk7Ci0KLQkJCS8vIExvc3QgQVAsIHNlbmQgZGlzY29ubmVjdCAmIGxpbmsgZG93biBldmVudAotCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7Ci0KLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0jaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0JCS8vc2VuZCBkaXNhc3NvY2lhdGUgZXZlbnQgdG8gd3BhX3N1cHBsaWNhbnQKLQkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkgewotCQkJUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQocEFkLCBJV0VWQ1VTVE9NLCBSVF9ESVNBU1NPQ19FVkVOVF9GTEFHLCBOVUxMLCBOVUxMLCAwKTsKLQkJfQotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0jaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQkJUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQocEFkLCBTSU9DR0lXQVAsIC0xLCBOVUxMLCBOVUxMLCAwKTsKLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0JCQkvLyBSVE1QUGF0Y2hNYWNCYnBCdWcocEFkKTsKLQkJCU1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQocEFkKTsKLQkJfQotCQllbHNlIGlmIChDUUlfSVNfQkFEKHBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSkpCi0JCXsKLQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuQmFkQ1FJQXV0b1JlY292ZXJ5Q291bnQgKys7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIEJhZCBDUUkuIEF1dG8gUmVjb3ZlcnkgYXR0ZW1wdCAjJWxkXG4iLCBwQWQtPlJhbGlua0NvdW50ZXJzLkJhZENRSUF1dG9SZWNvdmVyeUNvdW50KSk7Ci0JCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7Ci0JCX0KLQotCQlpZiAocEFkLT5TdGFDZmcuYkF1dG9Sb2FtaW5nKQotCQl7Ci0JCQlCT09MRUFOCXJ2ID0gRkFMU0U7Ci0JCQlDSEFSCWRCbVRvUm9hbSA9IHBBZC0+U3RhQ2ZnLmRCbVRvUm9hbTsKLQkJCUNIQVIJTWF4UnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwKLQkJCQkJCQkJCQkgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLAotCQkJCQkJCQkJCSAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsCi0JCQkJCQkJCQkJICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMik7Ci0KLQkJCS8vIFNjYW5uaW5nLCBpZ25vcmUgUm9hbWluZwotCQkJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpICYmCi0JCQkJKHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPT0gU1lOQ19JRExFKSAmJgotCQkJCShNYXhSc3NpIDw9IGRCbVRvUm9hbSkpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUnNzaT0lZCwgZEJtVG9Sb2FtPSVkXG4iLCBNYXhSc3NpLCAoQ0hBUilkQm1Ub1JvYW0pKTsKLQotCi0JCQkJLy8gQWRkIGF1dG8gc2VhbWxlc3Mgcm9hbWluZwotCQkJCWlmIChydiA9PSBGQUxTRSkKLQkJCQkJcnYgPSBNbG1lQ2hlY2tGb3JGYXN0Um9hbWluZyhwQWQpOwotCi0JCQkJaWYgKHJ2ID09IEZBTFNFKQotCQkJCXsKLQkJCQkJaWYgKChwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgKyAxMCAqIE9TX0haKSA8IHBBZC0+TWxtZS5Ob3czMikKLQkJCQkJewotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBSb2FtaW5nLCBObyBlbGlnYWJsZSBlbnRyeSwgdHJ5IG5ldyBzY2FuIVxuIikpOwotCQkJCQkJcEFkLT5TdGFDZmcuU2NhbkNudCA9IDI7Ci0JCQkJCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBwQWQtPk1sbWUuTm93MzI7Ci0JCQkJCQlNbG1lQXV0b1NjYW4ocEFkKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQllbHNlIGlmIChBREhPQ19PTihwQWQpKQotCXsKLQotCQkvLyBJZiBhbGwgcGVlcnMgbGVhdmUsIGFuZCB0aGlzIFNUQSBiZWNvbWVzIHRoZSBsYXN0IG9uZSBpbiB0aGlzIElCU1MsIHRoZW4gY2hhbmdlIE1lZGlhU3RhdGUKLQkJLy8gdG8gRElTQ09OTkVDVEVELiBCdXQgc3RpbGwgaG9sZGluZyB0aGlzIElCU1MgKGkuZS4gc2VuZGluZyBCRUFDT04pIHNvIHRoYXQgb3RoZXIgU1RBcyBjYW4KLQkJLy8gam9pbiBsYXRlci4KLQkJaWYgKFJUTVBfVElNRV9BRlRFUihwQWQtPk1sbWUuTm93MzIsIHBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgKyBBREhPQ19CRUFDT05fTE9TVF9USU1FKSAmJgotCQkJT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQotCQl7Ci0JCQlNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgICAgIFN0YXJ0UmVxOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIGV4Y2Vzc2l2ZSBCRUFDT04gbG9zdCwgbGFzdCBTVEEgaW4gdGhpcyBJQlNTLCBNZWRpYVN0YXRlPURpc2Nvbm5lY3RlZFxuIikpOwotCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7Ci0KLQkJCVN0YXJ0UGFybUZpbGwocEFkLCAmU3RhcnRSZXEsIChDSEFSICopcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TVEFSVF9SRVEsIHNpemVvZihNTE1FX1NUQVJUX1JFUV9TVFJVQ1QpLCAmU3RhcnRSZXEpOwotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9TVEFSVDsKLQkJfQotCi0JCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQotCQl7Ci0JCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOwotCi0JCQlpZiAocEVudHJ5LT5WYWxpZEFzQ0xJID09IEZBTFNFKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoUlRNUF9USU1FX0FGVEVSKHBBZC0+TWxtZS5Ob3czMiwgcEVudHJ5LT5MYXN0QmVhY29uUnhUaW1lICsgQURIT0NfQkVBQ09OX0xPU1RfVElNRSkpCi0JCQkJTWFjVGFibGVEZWxldGVFbnRyeShwQWQsIHBFbnRyeS0+QWlkLCBwRW50cnktPkFkZHIpOwotCQl9Ci0JfQotCWVsc2UgLy8gbm8gSU5GUkEgbm9yIEFESE9DIGNvbm5lY3Rpb24KLQl7Ci0KLQkJaWYgKHBBZC0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgJiYKLQkJCVJUTVBfVElNRV9CRUZPUkUocEFkLT5NbG1lLk5vdzMyLCBwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgKyAoMzAgKiBPU19IWikpKQotCQkJZ290byBTS0lQX0FVVE9fU0NBTl9DT05OOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwQWQtPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7Ci0KLQkJaWYgKChwQWQtPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9PSBUUlVFKQotCQkJJiYgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1NUQVJUX1VQKQotCQkJJiYgKE1sbWVWYWxpZGF0ZVNTSUQocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pID09IFRSVUUpKQotCQl7Ci0JCQlpZiAoKHBBZC0+U2NhblRhYi5Cc3NOcj09MCkgJiYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKSkKLQkJCXsKLQkJCQlNTE1FX1NDQU5fUkVRX1NUUlVDVAkgICBTY2FuUmVxOwotCi0JCQkJaWYgKFJUTVBfVElNRV9BRlRFUihwQWQtPk1sbWUuTm93MzIsIHBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSArICgxMCAqIE9TX0haKSkpCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTVEFNbG1lUGVyaW9kaWNFeGVjKCk6Q05UTCAtIFNjYW5UYWIuQnNzTnI9PTAsIHN0YXJ0IGEgbmV3IEFDVElWRSBzY2FuIFNTSURbJXNdXG4iLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQpKTsKLQkJCQkJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIChQU1RSSU5HKSBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiwgQlNTX0FOWSwgU0NBTl9BQ1RJVkUpOwotCQkJCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKLQkJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOwotCQkJCQkvLyBSZXNldCBNaXNzZWQgc2NhbiBudW1iZXIKLQkJCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gcEFkLT5NbG1lLk5vdzMyOwotCQkJCX0KLQkJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykJLy8gUXVpdCB0aGUgZm9yZXZlciBzY2FuIHdoZW4gaW4gYSB2ZXJ5IGNsZWFuIHJvb20KLQkJCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOwotCQkJfQotCQkJZWxzZSBpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpCi0JCQl7Ci0JCQkJaWYgKChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDcpID09IDApCi0JCQkJCXsKLQkJCQkJCU1sbWVBdXRvU2NhbihwQWQpOwotCQkJCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gcEFkLT5NbG1lLk5vdzMyOwotCQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLSNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vIFJvZ2VyIHN5bmMgQ2FycmllcgotCQkJCQlpZiAocEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPT0gVFJVRSkKLQkJCQkJewotCQkJCQkJaWYgKChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDUpID09IDEpCi0JCQkJCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLSNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCi0JCQkJCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi1TS0lQX0FVVE9fU0NBTl9DT05OOgotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0gICAgaWYgKChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlRYQkFiaXRtYXAgIT0wKSAmJiAocEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbiA9PSBGQUxTRSkpCi0JewotCQlwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uID0gVFJVRTsKLQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBIVF9GT1JDRVJUU0NUUywgIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIEZBTFNFKTsKLQl9Ci0JZWxzZSBpZiAoKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uVFhCQWJpdG1hcCA9PTApICYmIChwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uID09IFRSVUUpKQotCXsKLQkJcEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbiA9IEZBTFNFOwotCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsICBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBGQUxTRSk7Ci0JfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSNpZmRlZiBET1QxMU5fRFJBRlQzCi0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0NBTl8yMDQwKSkKLQkJVHJpRXZlbnRDb3VudGVyTWFpbnRlbmFuY2UocEFkKTsKLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlyZXR1cm47Ci19Ci0KLS8vIExpbmsgZG93biByZXBvcnQKLVZPSUQgTGlua0Rvd25FeGVjKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKLXsKLQlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7Ci0KLQlpZiAocEFkICE9IE5VTEwpCi0JewotCQlNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgICBEaXNhc3NvY1JlcTsKLQotCQlpZiAoKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkgJiYKLQkJCShJTkZSQV9PTihwQWQpKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTGlua0Rvd25FeGVjKCk6IGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAuLi5cbiIpKTsKLQkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOwotCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsCi0JCQkJCQlzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKLQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfRElTQVNTT0M7Ci0KLQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7Ci0JCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOwotCQkgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKLQkJfQotCX0KLX0KLQotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIE1sbWVBdXRvU2NhbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQkvLyBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdAotCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gRHJpdmVyIGF1dG8gc2NhblxuIikpOwotCQlNbG1lRW5xdWV1ZShwQWQsCi0JCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAotCQkJCQlPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwKLQkJCQkJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuLAotCQkJCQlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQpOwotCQlSVE1QX01MTUVfSEFORExFUihwQWQpOwotCX0KLX0KLQotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIE1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JaWYgKHBBZC0+U3RhQ2ZnLmJBdXRvQ29ubmVjdEJ5QnNzaWQpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEcml2ZXIgYXV0byByZWNvbm5lY3QgdG8gbGFzdCBPSURfODAyXzExX0JTU0lEIHNldHRpbmcgLSAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKLQkJCQkJCQkJCXBBZC0+TWxtZUF1eC5Cc3NpZFswXSwKLQkJCQkJCQkJCXBBZC0+TWxtZUF1eC5Cc3NpZFsxXSwKLQkJCQkJCQkJCXBBZC0+TWxtZUF1eC5Cc3NpZFsyXSwKLQkJCQkJCQkJCXBBZC0+TWxtZUF1eC5Cc3NpZFszXSwKLQkJCQkJCQkJCXBBZC0+TWxtZUF1eC5Cc3NpZFs0XSwKLQkJCQkJCQkJCXBBZC0+TWxtZUF1eC5Cc3NpZFs1XSkpOwotCi0JCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKLQkJTWxtZUVucXVldWUocEFkLAotCQkJIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAotCQkJIE9JRF84MDJfMTFfQlNTSUQsCi0JCQkgTUFDX0FERFJfTEVOLAotCQkJIHBBZC0+TWxtZUF1eC5Cc3NpZCk7Ci0KLQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKLQotCQlSVE1QX01MTUVfSEFORExFUihwQWQpOwotCX0KLQkvLyBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdAotCWVsc2UgaWYgKChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkgJiYKLQkJKE1sbWVWYWxpZGF0ZVNTSUQocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pID09IFRSVUUpKQotCXsKLQkJTkRJU184MDJfMTFfU1NJRCBPaWRTc2lkOwotCQlPaWRTc2lkLlNzaWRMZW5ndGggPSBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW47Ci0JCU5kaXNNb3ZlTWVtb3J5KE9pZFNzaWQuU3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRyaXZlciBhdXRvIHJlY29ubmVjdCB0byBsYXN0IE9JRF84MDJfMTFfU1NJRCBzZXR0aW5nIC0gJXMsIGxlbiAtICVkXG4iLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbikpOwotCQlNbG1lRW5xdWV1ZShwQWQsCi0JCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAotCQkJCQlPSURfODAyXzExX1NTSUQsCi0JCQkJCXNpemVvZihORElTXzgwMl8xMV9TU0lEKSwKLQkJCQkJJk9pZFNzaWQpOwotCQlSVE1QX01MTUVfSEFORExFUihwQWQpOwotCX0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVRoaXMgcm91dGluZSBjaGVja3MgaWYgdGhlcmUncmUgb3RoZXIgQVBzIG91dCB0aGVyZSBjYXBhYmxlIGZvcgotCQlyb2FtaW5nLiBDYWxsZXIgc2hvdWxkIGNhbGwgdGhpcyByb3V0aW5lIG9ubHkgd2hlbiBMaW5rIHVwIGluIElORlJBIG1vZGUKLQkJYW5kIGNoYW5uZWwgcXVhbGl0eSBpcyBiZWxvdyBDUUlfR09PRF9USFJFU0hPTEQuCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU91dHB1dDoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIE1sbWVDaGVja0ZvclJvYW1pbmcoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUxPTkcJTm93MzIpCi17Ci0JVVNIT1JUCSAgIGk7Ci0JQlNTX1RBQkxFICAqcFJvYW1UYWIgPSAmcEFkLT5NbG1lQXV4LlJvYW1UYWI7Ci0JQlNTX0VOVFJZICAqcEJzczsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBNbG1lQ2hlY2tGb3JSb2FtaW5nXG4iKSk7Ci0JLy8gcHV0IGFsbCByb2FtaW5nIGNhbmRpZGF0ZXMgaW50byBSb2FtVGFiLCBhbmQgc29ydCBpbiBSU1NJIG9yZGVyCi0JQnNzVGFibGVJbml0KHBSb2FtVGFiKTsKLQlmb3IgKGkgPSAwOyBpIDwgcEFkLT5TY2FuVGFiLkJzc05yOyBpKyspCi0JewotCQlwQnNzID0gJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXTsKLQotCQlpZiAoKHBCc3MtPkxhc3RCZWFjb25SeFRpbWUgKyBwQWQtPlN0YUNmZy5CZWFjb25Mb3N0VGltZSkgPCBOb3czMikKLQkJCWNvbnRpbnVlOwkgLy8gQVAgZGlzYXBwZWFyCi0JCWlmIChwQnNzLT5Sc3NpIDw9IFJTU0lfVEhSRVNIT0xEX0ZPUl9ST0FNSU5HKQotCQkJY29udGludWU7CSAvLyBSU1NJIHRvbyB3ZWFrLiBmb3JnZXQgaXQuCi0JCWlmIChNQUNfQUREUl9FUVVBTChwQnNzLT5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpKQotCQkJY29udGludWU7CSAvLyBza2lwIGN1cnJlbnQgQVAKLQkJaWYgKHBCc3MtPlJzc2kgPCAocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAgKyBSU1NJX0RFTFRBKSkKLQkJCWNvbnRpbnVlOwkgLy8gb25seSBBUCB3aXRoIHN0cm9uZ2VyIFJTU0kgaXMgZWxpZ2libGUgZm9yIHJvYW1pbmcKLQotCQkvLyBBUCBwYXNzaW5nIGFsbCBhYm92ZSBydWxlcyBpcyBwdXQgaW50byByb2FtaW5nIGNhbmRpZGF0ZSB0YWJsZQotCQlOZGlzTW92ZU1lbW9yeSgmcFJvYW1UYWItPkJzc0VudHJ5W3BSb2FtVGFiLT5Cc3NOcl0sIHBCc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKLQkJcFJvYW1UYWItPkJzc05yICs9IDE7Ci0JfQotCi0JaWYgKHBSb2FtVGFiLT5Cc3NOciA+IDApCi0JewotCQkvLyBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdAotCQlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpCi0JCXsKLQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuUG9vckNRSVJvYW1pbmdDb3VudCArKzsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gUm9hbWluZyBhdHRlbXB0ICMlbGRcbiIsIHBBZC0+UmFsaW5rQ291bnRlcnMuUG9vckNRSVJvYW1pbmdDb3VudCkpOwotCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfUk9BTUlOR19SRVEsIDAsIE5VTEwpOwotCQkJUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKLQkJfQotCX0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gTWxtZUNoZWNrRm9yUm9hbWluZygjIG9mIGNhbmRpZGF0ZT0gJWQpXG4iLHBSb2FtVGFiLT5Cc3NOcikpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVRoaXMgcm91dGluZSBjaGVja3MgaWYgdGhlcmUncmUgb3RoZXIgQVBzIG91dCB0aGVyZSBjYXBhYmxlIGZvcgotCQlyb2FtaW5nLiBDYWxsZXIgc2hvdWxkIGNhbGwgdGhpcyByb3V0aW5lIG9ubHkgd2hlbiBsaW5rIHVwIGluIElORlJBIG1vZGUKLQkJYW5kIGNoYW5uZWwgcXVhbGl0eSBpcyBiZWxvdyBDUUlfR09PRF9USFJFU0hPTEQuCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU91dHB1dDoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCVVTSE9SVAkJaTsKLQlCU1NfVEFCTEUJKnBSb2FtVGFiID0gJnBBZC0+TWxtZUF1eC5Sb2FtVGFiOwotCUJTU19FTlRSWQkqcEJzczsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBNbG1lQ2hlY2tGb3JGYXN0Um9hbWluZ1xuIikpOwotCS8vIHB1dCBhbGwgcm9hbWluZyBjYW5kaWRhdGVzIGludG8gUm9hbVRhYiwgYW5kIHNvcnQgaW4gUlNTSSBvcmRlcgotCUJzc1RhYmxlSW5pdChwUm9hbVRhYik7Ci0JZm9yIChpID0gMDsgaSA8IHBBZC0+U2NhblRhYi5Cc3NOcjsgaSsrKQotCXsKLQkJcEJzcyA9ICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV07Ci0KLSAgICAgICAgaWYgKChwQnNzLT5Sc3NpIDw9IC01MCkgJiYgKHBCc3MtPkNoYW5uZWwgPT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpCi0JCQljb250aW51ZTsJIC8vIFJTU0kgdG9vIHdlYWsuIGZvcmdldCBpdC4KLQkJaWYgKE1BQ19BRERSX0VRVUFMKHBCc3MtPkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCkpCi0JCQljb250aW51ZTsJIC8vIHNraXAgY3VycmVudCBBUAotCQlpZiAoIVNTSURfRVFVQUwocEJzcy0+U3NpZCwgcEJzcy0+U3NpZExlbiwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbikpCi0JCQljb250aW51ZTsJIC8vIHNraXAgZGlmZmVyZW50IFNTSUQKLSAgICAgICAgaWYgKHBCc3MtPlJzc2kgPCAoUlRNUE1heFJzc2kocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKSArIFJTU0lfREVMVEEpKQotCQkJY29udGludWU7CSAvLyBza2lwIEFQIHdpdGhvdXQgYmV0dGVyIFJTU0kKLQotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJMYXN0UnNzaTAgPSAlZCwgcEJzcy0+UnNzaSA9ICVkXG4iLCBSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpLCBwQnNzLT5Sc3NpKSk7Ci0JCS8vIEFQIHBhc3NpbmcgYWxsIGFib3ZlIHJ1bGVzIGlzIHB1dCBpbnRvIHJvYW1pbmcgY2FuZGlkYXRlIHRhYmxlCi0JCU5kaXNNb3ZlTWVtb3J5KCZwUm9hbVRhYi0+QnNzRW50cnlbcFJvYW1UYWItPkJzc05yXSwgcEJzcywgc2l6ZW9mKEJTU19FTlRSWSkpOwotCQlwUm9hbVRhYi0+QnNzTnIgKz0gMTsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gTWxtZUNoZWNrRm9yRmFzdFJvYW1pbmcgKEJzc05yPSVkKVxuIiwgcFJvYW1UYWItPkJzc05yKSk7Ci0JaWYgKHBSb2FtVGFiLT5Cc3NOciA+IDApCi0JewotCQkvLyBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdAotCQlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpCi0JCXsKLQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuUG9vckNRSVJvYW1pbmdDb3VudCArKzsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gUm9hbWluZyBhdHRlbXB0ICMlbGRcbiIsIHBBZC0+UmFsaW5rQ291bnRlcnMuUG9vckNRSVJvYW1pbmdDb3VudCkpOwotCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfUk9BTUlOR19SRVEsIDAsIE5VTEwpOwotCQkJUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKLQkJCXJldHVybiBUUlVFOwotCQl9Ci0JfQotCi0JcmV0dXJuIEZBTFNFOwotfQotCi1WT0lEIE1sbWVTZXRUeFJhdGUoCi0JSU4gUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOIFBNQUNfVEFCTEVfRU5UUlkJCXBFbnRyeSwKLQlJTiBQUlRNUF9UWF9SQVRFX1NXSVRDSAlwVHhSYXRlKQotewotCVVDSEFSCU1heE1vZGUgPSBNT0RFX09GRE07Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlNYXhNb2RlID0gTU9ERV9IVEdSRUVORklFTEQ7Ci0KLQlpZiAocFR4UmF0ZS0+U1RCQyAmJiAocEFkLT5TdGFDZmcuTWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMpICYmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKQotCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfVVNFOwotCWVsc2UKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7Ci0KLQlpZiAocFR4UmF0ZS0+Q3Vyck1DUyA8IE1DU19BVVRPKQotCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTID0gcFR4UmF0ZS0+Q3Vyck1DUzsKLQotCWlmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTID4gNykKLQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7Ci0KLQlpZiAoQURIT0NfT04ocEFkKSkKLQl7Ci0JCS8vIElmIHBlZXIgYWRob2MgaXMgYi1vbmx5IG1vZGUsIHdlIGNhbid0IHNlbmQgMTFnIHJhdGUuCi0JCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOwotCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDCT0gU1RCQ19OT05FOwotCi0JCS8vCi0JCS8vIEZvciBBZGhvYyBNT0RFX0NDSywgZHJpdmVyIHdpbGwgdXNlIEFkaG9jQk9ubHlKb2luZWQgZmxhZyB0byByb2xsIGJhY2sgdG8gQiBvbmx5IGlmIG5lY2Vzc2FyeQotCQkvLwotCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFCT0gcFR4UmF0ZS0+TW9kZTsKLQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJOwotCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKLQotCQkvLyBQYXRjaCBzcGVlZCBlcnJvciBpbiBzdGF0dXMgcGFnZQotCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREU7Ci0JfQotCWVsc2UKLSAgICB7Ci0JCWlmIChwVHhSYXRlLT5Nb2RlIDw9IE1heE1vZGUpCi0JCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gcFR4UmF0ZS0+TW9kZTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotICAgICAgICBpZiAocFR4UmF0ZS0+U2hvcnRHSSAmJiAocEFkLT5TdGFDZmcuTWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kpKQotCQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV80MDA7Ci0JCWVsc2UKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCS8vIFJlZXhhbSBlYWNoIGJhbmR3aWR0aCdzIFNHSSBzdXBwb3J0LgotCQlpZiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPT0gR0lfNDAwKQotCQl7Ci0JCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLkJXID09IEJXXzIwKSAmJiAoIUNMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRSkpKQotCQkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOwotCQkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5CVyA9PSBCV180MCkgJiYgKCFDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUpKSkKLQkJCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKLQkJfQotCi0gICAgICAgIC8vIFR1cm4gUlRTL0NUUyByYXRlIHRvIDZNYnBzLgotCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAwKSAmJiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyAhPSAwKSkKLQkJewotCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7Ci0JCQlpZiAocEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbikKLQkJCXsKLQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIEhUX0ZPUkNFUlRTQ1RTLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgQUxMTl9TRVRQUk9URUNULCBUUlVFLCAoQk9PTEVBTilwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50KTsKLQkJCX0KLQkJfQotCQllbHNlIGlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID09IDgpICYmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTICE9IDgpKQotCQl7Ci0JCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKLQkJCWlmIChwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uKQotCQkJewotCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfRk9SQ0VSVFNDVFMsIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgIT0gMCkgJiYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gMCkpCi0JCXsKLQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfUlRTQ1RTXzZNLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOwotCi0JCX0KLQkJZWxzZSBpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyAhPSA4KSAmJiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9PSA4KSkKLQkJewotCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBIVF9SVFNDVFNfNk0sIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7Ci0JCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkM7Ci0JCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKLQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7Ci0JCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERTsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSAgICAgICAgaWYgKChwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9PSBNT0RFX0hUR1JFRU5GSUVMRCkgJiYKLSAgICAgICAgICAgIHBBZC0+V0lGSXRlc3RiZWQuYkdyZWVuRmllbGQpCi0gICAgICAgICAgICBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0gICAgfQotCi0gICAgcEFkLT5MYXN0VHhSYXRlID0gKFVTSE9SVCkocEVudHJ5LT5IVFBoeU1vZGUud29yZCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyByb3V0aW5lIGNhbGN1bGF0ZXMgdGhlIGFjdW11bGF0ZWQgVHhQRVIgb2YgZWF4aCBUeFJhdGUuIEFuZAotCQlhY2NvcmRpbmcgdG8gdGhlIGNhbGN1bGF0aW9uIHJlc3VsdCwgY2hhbmdlIENvbW1vbkNmZy5UeFJhdGUgd2hpY2gKLQkJaXMgdGhlIHN0YWJsZSBUWCBSYXRlIHdlIGV4cGVjdCB0aGUgUmFkaW8gc2l0dWF0aW9uIGNvdWxkIHN1c3RhaW5lZC4KLQotCQlDb21tb25DZmcuVHhSYXRlIHdpbGwgY2hhbmdlIGR5bmFtaWNhbGx5IHdpdGhpbiB7UkFURV8xL1JBVEVfNiwgTWF4VHhSYXRlfQotCU91dHB1dDoKLQkJQ29tbW9uQ2ZnLlR4UmF0ZSAtCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5PVEU6Ci0JCWNhbGwgdGhpcyByb3V0aW5lIGV2ZXJ5IHNlY29uZAotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JVUNIQVIJCQkJCVVwUmF0ZUlkeCA9IDAsIERvd25SYXRlSWR4ID0gMCwgQ3VyclJhdGVJZHg7Ci0JVUxPTkcJCQkJCWksIEFjY3VUeFRvdGFsQ250ID0gMCwgVHhUb3RhbENudDsKLQlVTE9ORwkJCQkJVHhFcnJvclJhdGlvID0gMDsKLQlCT09MRUFOCQkJCQliVHhSYXRlQ2hhbmdlZCA9IEZBTFNFLCBiVXBncmFkZVF1YWxpdHkgPSBGQUxTRTsKLQlQUlRNUF9UWF9SQVRFX1NXSVRDSAlwQ3VyclR4UmF0ZSwgcE5leHRUeFJhdGUgPSBOVUxMOwotCVBVQ0hBUgkJCQkJcFRhYmxlOwotCVVDSEFSCQkJCQlUYWJsZVNpemUgPSAwOwotCVVDSEFSCQkJCQlJbml0VHhSYXRlSWR4ID0gMCwgVHJhaW5VcCwgVHJhaW5Eb3duOwotCUNIQVIJCQkJCVJzc2ksIFJzc2lPZmZzZXQgPSAwOwotCVRYX1NUQV9DTlQxX1NUUlVDCQlTdGFUeDE7Ci0JVFhfU1RBX0NOVDBfU1RSVUMJCVR4U3RhQ250MDsKLQlVTE9ORwkJCQkJVHhSZXRyYW5zbWl0ID0gMCwgVHhTdWNjZXNzID0gMCwgVHhGYWlsQ291bnQgPSAwOwotCU1BQ19UQUJMRV9FTlRSWQkJCSpwRW50cnk7Ci0JUlNTSV9TQU1QTEUJCQkJKnBSc3NpID0gJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGU7Ci0KLSNpZmRlZiBSQUxJTktfQVRFCi0JaWYgKEFURV9PTihwQWQpKQotCXsKLQkJcmV0dXJuOwotCX0KLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLQkvLwotCS8vIHdhbGsgdGhyb3VnaCBNQUMgdGFibGUsIHNlZSBpZiBuZWVkIHRvIGNoYW5nZSBBUCdzIFRYIHJhdGUgdG93YXJkIGVhY2ggZW50cnkKLQkvLwotCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQotCXsKLQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07Ci0KLQkvLyBjaGVjayBpZiB0aGlzIGVudHJ5IG5lZWQgdG8gc3dpdGNoIHJhdGUgYXV0b21hdGljYWxseQotCQlpZiAoUlRNUENoZWNrRW50cnlFbmFibGVBdXRvUmF0ZVN3aXRjaChwQWQsIHBFbnRyeSkgPT0gRkFMU0UpCi0JCQljb250aW51ZTsKLQotCQlpZiAoKHBBZC0+TWFjVGFiLlNpemUgPT0gMSkgfHwgKHBFbnRyeS0+VmFsaWRBc0RscykpCi0JCXsKLQkJCVJzc2kgPSBSVE1QTWF4UnNzaShwQWQsCi0JCQkJCQkJICAgcFJzc2ktPkF2Z1Jzc2kwLAotCQkJCQkJCSAgIHBSc3NpLT5BdmdSc3NpMSwKLQkJCQkJCQkgICBwUnNzaS0+QXZnUnNzaTIpOwotCi0JCQkvLyBVcGRhdGUgc3RhdGlzdGljIGNvdW50ZXIKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDAsICZUeFN0YUNudDAud29yZCk7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQxLCAmU3RhVHgxLndvcmQpOwotCQkJcEFkLT5iVXBkYXRlQmNuQ250RG9uZSA9IFRSVUU7Ci0JCQlUeFJldHJhbnNtaXQgPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OwotCQkJVHhTdWNjZXNzID0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKLQkJCVR4RmFpbENvdW50ID0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OwotCQkJVHhUb3RhbENudCA9IFR4UmV0cmFuc21pdCArIFR4U3VjY2VzcyArIFR4RmFpbENvdW50OwotCi0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICs9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKLQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OwotCQkJcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LnUuTG93UGFydCArPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOwotCQkJcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKLQkJCXBBZC0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LnUuTG93UGFydCArPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7Ci0KLQkJCS8vIGlmIG5vIHRyYWZmaWMgaW4gdGhlIHBhc3QgMS1zZWMgcGVyaW9kLCBkb24ndCBjaGFuZ2UgVFggcmF0ZSwKLQkJCS8vIGJ1dCBjbGVhciBhbGwgYmFkIGhpc3RvcnkuIGJlY2F1c2UgdGhlIGJhZCBoaXN0b3J5IG1heSBhZmZlY3QgdGhlIG5leHQKLQkJCS8vIENoYXJpb3QgdGhyb3VnaHB1dCB0ZXN0Ci0JCQlBY2N1VHhUb3RhbENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArCi0JCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArCi0JCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKLQotCQkJaWYgKFR4VG90YWxDbnQpCi0JCQkJVHhFcnJvclJhdGlvID0gKChUeFJldHJhbnNtaXQgKyBUeEZhaWxDb3VudCkgKiAxMDApIC8gVHhUb3RhbENudDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChJTkZSQV9PTihwQWQpICYmIChpID09IDEpKQotCQkJCVJzc2kgPSBSVE1QTWF4UnNzaShwQWQsCi0JCQkJCQkJCSAgIHBSc3NpLT5BdmdSc3NpMCwKLQkJCQkJCQkJICAgcFJzc2ktPkF2Z1Jzc2kxLAotCQkJCQkJCQkgICBwUnNzaS0+QXZnUnNzaTIpOwotCQkJZWxzZQotCQkJCVJzc2kgPSBSVE1QTWF4UnNzaShwQWQsCi0JCQkJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMCwKLQkJCQkJCQkJICAgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kxLAotCQkJCQkJCQkgICBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTIpOwotCi0JCQlUeFRvdGFsQ250ID0gcEVudHJ5LT5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKLQkJCQkgcEVudHJ5LT5PbmVTZWNUeFJldHJ5T2tDb3VudCArCi0JCQkJIHBFbnRyeS0+T25lU2VjVHhGYWlsQ291bnQ7Ci0KLQkJCWlmIChUeFRvdGFsQ250KQotCQkJCVR4RXJyb3JSYXRpbyA9ICgocEVudHJ5LT5PbmVTZWNUeFJldHJ5T2tDb3VudCArIHBFbnRyeS0+T25lU2VjVHhGYWlsQ291bnQpICogMTAwKSAvIFR4VG90YWxDbnQ7Ci0JCX0KLQotCQlpZiAoVHhUb3RhbENudCkKLQkJewotCQkJLyoKLQkJCQlUaHJlZSBBZEhvYyBjb25uZWN0aW9ucyBjYW4gbm90IHdvcmsgbm9ybWFsbHkgaWYgb25lIEFkSG9jIGNvbm5lY3Rpb24gaXMgZGlzYXBwZWFyZWQgZnJvbSBhIGhlYXZ5IHRyYWZmaWMgZW52aXJvbm1lbnQgZ2VuZXJhdGVkIGJ5IHBpbmcgdG9vbAotCQkJCVdlIGZvcmNlIHRvIHNldCBMb25nUnR5TGltaXQgYW5kIFNob3J0UnR5TGltaXQgdG8gMCB0byBzdG9wIHJldHJhbnNtaXR0aW5nIHBhY2tldCwgYWZ0ZXIgYSB3aGlsZSwgcmVzb3Jpbmcgb3JpZ2luYWwgc2V0dGluZ3MKLQkJCSovCi0JCQlpZiAoVHhFcnJvclJhdGlvID09IDEwMCkKLQkJCXsKLQkJCQlUWF9SVFlfQ0ZHX1NUUlVDCVR4UnR5Q2ZnLFR4UnR5Q2ZndG1wOwotCQkJCVVMT05HCUluZGV4OwotCQkJCVVMT05HCU1BQ1ZhbHVlOwotCi0JCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9SVFlfQ0ZHLCAmVHhSdHlDZmcud29yZCk7Ci0JCQkJVHhSdHlDZmd0bXAud29yZCA9IFR4UnR5Q2ZnLndvcmQ7Ci0JCQkJVHhSdHlDZmcuZmllbGQuTG9uZ1J0eUxpbWl0ID0gMHgwOwotCQkJCVR4UnR5Q2ZnLmZpZWxkLlNob3J0UnR5TGltaXQgPSAweDA7Ci0JCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUlRZX0NGRywgVHhSdHlDZmcud29yZCk7Ci0KLQkJCQlSVE1QdXNlY0RlbGF5KDEpOwotCi0JCQkJSW5kZXggPSAwOwotCQkJCU1BQ1ZhbHVlID0gMDsKLQkJCQlkbwotCQkJCXsKLQkJCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWFJYUV9QQ05ULCAmTUFDVmFsdWUpOwotCQkJCQlpZiAoKE1BQ1ZhbHVlICYgMHhmZmZmZmYpID09IDApCi0JCQkJCQlicmVhazsKLQkJCQkJSW5kZXgrKzsKLQkJCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQkJCQl9d2hpbGUoKEluZGV4IDwgMzMwKSYmKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpKTsKLQotCQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfUlRZX0NGRywgJlR4UnR5Q2ZnLndvcmQpOwotCQkJCVR4UnR5Q2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCA9IFR4UnR5Q2ZndG1wLmZpZWxkLkxvbmdSdHlMaW1pdDsKLQkJCQlUeFJ0eUNmZy5maWVsZC5TaG9ydFJ0eUxpbWl0ID0gVHhSdHlDZmd0bXAuZmllbGQuU2hvcnRSdHlMaW1pdDsKLQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9SVFlfQ0ZHLCBUeFJ0eUNmZy53b3JkKTsKLQkJCX0KLQkJfQotCi0JCUN1cnJSYXRlSWR4ID0gcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXg7Ci0KLQkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLCAmSW5pdFR4UmF0ZUlkeCk7Ci0KLQkJaWYgKEN1cnJSYXRlSWR4ID49IFRhYmxlU2l6ZSkKLQkJewotCQkJQ3VyclJhdGVJZHggPSBUYWJsZVNpemUgLSAxOwotCQl9Ci0KLQkJLy8gV2hlbiBzd2l0Y2ggZnJvbSBGaXhlZCByYXRlIC0+IGF1dG8gcmF0ZSwgdGhlIFJFQUwgVFggcmF0ZSBtaWdodCBiZSBkaWZmZXJlbnQgZnJvbSBwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleC4KLQkJLy8gU28gbmVlZCB0byBzeW5jIGhlcmUuCi0JCXBDdXJyVHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhDdXJyUmF0ZUlkeCsxKSo1XTsKLQkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgIT0gcEN1cnJUeFJhdGUtPkN1cnJNQ1MpCi0JCQkvLyYmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBUUlVFKQotCQkJKQotCQl7Ci0KLQkJCS8vIE5lZWQgdG8gc3luYyBSZWFsIFR4IHJhdGUgYW5kIG91ciByZWNvcmQuCi0JCQkvLyBUaGVuIHJldHVybiBmb3IgbmV4dCBEUlMuCi0JCQlwQ3VyclR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsoSW5pdFR4UmF0ZUlkeCsxKSo1XTsKLQkJCXBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID0gSW5pdFR4UmF0ZUlkeDsKLQkJCU1sbWVTZXRUeFJhdGUocEFkLCBwRW50cnksIHBDdXJyVHhSYXRlKTsKLQotCQkJLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCi0JCQlSRVNFVF9PTkVfU0VDX1RYX0NOVChwRW50cnkpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvLyBkZWNpZGUgdGhlIG5leHQgdXBncmFkZSByYXRlIGFuZCBkb3duZ3JhZGUgcmF0ZSwgaWYgYW55Ci0JCWlmICgoQ3VyclJhdGVJZHggPiAwKSAmJiAoQ3VyclJhdGVJZHggPCAoVGFibGVTaXplIC0gMSkpKQotCQl7Ci0JCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeCArIDE7Ci0JCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4IC0xOwotCQl9Ci0JCWVsc2UgaWYgKEN1cnJSYXRlSWR4ID09IDApCi0JCXsKLQkJCVVwUmF0ZUlkeCA9IEN1cnJSYXRlSWR4ICsgMTsKLQkJCURvd25SYXRlSWR4ID0gQ3VyclJhdGVJZHg7Ci0JCX0KLQkJZWxzZSBpZiAoQ3VyclJhdGVJZHggPT0gKFRhYmxlU2l6ZSAtIDEpKQotCQl7Ci0JCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeDsKLQkJCURvd25SYXRlSWR4ID0gQ3VyclJhdGVJZHggLSAxOwotCQl9Ci0KLQkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKEN1cnJSYXRlSWR4KzEpKjVdOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWlmICgoUnNzaSA+IC02NSkgJiYgKHBDdXJyVHhSYXRlLT5Nb2RlID49IE1PREVfSFRNSVgpKQotCQl7Ci0JCQlUcmFpblVwCQk9IChwQ3VyclR4UmF0ZS0+VHJhaW5VcCArIChwQ3VyclR4UmF0ZS0+VHJhaW5VcCA+PiAxKSk7Ci0JCQlUcmFpbkRvd24JPSAocEN1cnJUeFJhdGUtPlRyYWluRG93biArIChwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duID4+IDEpKTsKLQkJfQotCQllbHNlCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCXsKLQkJCVRyYWluVXAJCT0gcEN1cnJUeFJhdGUtPlRyYWluVXA7Ci0JCQlUcmFpbkRvd24JPSBwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duOwotCQl9Ci0KLQkJLy9wQWQtPkRyc0NvdW50ZXJzLkxhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uID0gcEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOwotCi0JCS8vCi0JCS8vIEtlZXAgdGhlIGxhc3QgdGltZSBUeFJhdGVDaGFuZ2VBY3Rpb24gc3RhdHVzLgotCQkvLwotCQlwRW50cnktPkxhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uID0gcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOwotCi0KLQotCQkvLwotCQkvLyBDQVNFIDEuIHdoZW4gVFggc2FtcGxlcyBhcmUgZmV3ZXIgdGhhbiAxNSwgdGhlbiBkZWNpZGUgVFggcmF0ZSBzb2xlbHkgb24gUlNTSQotCQkvLyAgICAgICAgIChjcml0ZXJpYSBjb3BpZWQgZnJvbSBSVDI1MDAgZm9yIE5ldG9waWEgY2FzZSkKLQkJLy8KLQkJaWYgKFR4VG90YWxDbnQgPD0gMTUpCi0JCXsKLQkJCUNIQVIJaWR4ID0gMDsKLQkJCVVDSEFSCVR4UmF0ZUlkeDsKLQkJCVVDSEFSCU1DUzAgPSAwLCBNQ1MxID0gMCwgTUNTMiA9IDAsIE1DUzMgPSAwLCBNQ1M0ID0gMCwgIE1DUzUgPTAsIE1DUzYgPSAwLCBNQ1M3ID0gMDsKLQkgICAgICAgIFVDSEFSCU1DUzEyID0gMCwgTUNTMTMgPSAwLCBNQ1MxNCA9IDAsIE1DUzE1ID0gMDsKLQkJCVVDSEFSCU1DUzIwID0gMCwgTUNTMjEgPSAwLCBNQ1MyMiA9IDAsIE1DUzIzID0gMDsgLy8gMyozCi0KLQkJCS8vIGNoZWNrIHRoZSBleGlzdGVuY2UgYW5kIGluZGV4IG9mIGVhY2ggbmVlZGVkIE1DUwotCQkJd2hpbGUgKGlkeCA8IHBUYWJsZVswXSkKLQkJCXsKLQkJCQlwQ3VyclR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsoaWR4KzEpKjVdOwotCi0JCQkJaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18wKQotCQkJCXsKLQkJCQkJTUNTMCA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzEpCi0JCQkJewotCQkJCQlNQ1MxID0gaWR4OwotCQkJCX0KLQkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMikKLQkJCQl7Ci0JCQkJCU1DUzIgPSBpZHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18zKQotCQkJCXsKLQkJCQkJTUNTMyA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzQpCi0JCQkJewotCQkJCQlNQ1M0ID0gaWR4OwotCQkJCX0KLQkgICAgICAgICAgICBlbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfNSkKLQkgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgIE1DUzUgPSBpZHg7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU182KQotCSAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgTUNTNiA9IGlkeDsKLQkgICAgICAgICAgICB9Ci0JCQkJLy9lbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfNykKLQkJCQllbHNlIGlmICgocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzcpICYmIChwQ3VyclR4UmF0ZS0+U2hvcnRHSSA9PSBHSV84MDApKQkvLyBwcmV2ZW50IHRoZSBoaWdoZXN0IE1DUyB1c2luZyBzaG9ydCBHSSB3aGVuIDFUIGFuZCBsb3cgdGhyb3VnaHB1dAotCQkJCXsKLQkJCQkJTUNTNyA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzEyKQotCQkJCXsKLQkJCQkJTUNTMTIgPSBpZHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xMykKLQkJCQl7Ci0JCQkJCU1DUzEzID0gaWR4OwotCQkJCX0KLQkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTQpCi0JCQkJewotCQkJCQlNQ1MxNCA9IGlkeDsKLQkJCQl9Ci0JCQkJLy9lbHNlIGlmICgocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzE1KS8qICYmIChwQ3VyclR4UmF0ZS0+U2hvcnRHSSA9PSBHSV84MDApKi8pCS8vd2UgaG9wZSB0byB1c2UgU2hvcnRHSSBhcyBpbml0aWFsIHJhdGUKLQkJCQllbHNlIGlmICgocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzE1KSAmJiAocEN1cnJUeFJhdGUtPlNob3J0R0kgPT0gR0lfODAwKSkJLy93ZSBob3BlIHRvIHVzZSBTaG9ydEdJIGFzIGluaXRpYWwgcmF0ZSwgaG93ZXZlciBBdGhlcm9zJ3MgY2hpcCBoYXMgYnVncyB3aGVuIHNob3J0IEdJCi0JCQkJewotCQkJCQlNQ1MxNSA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIwKSAvLyAzKjMKLQkJCQl7Ci0JCQkJCU1DUzIwID0gaWR4OwotCQkJCX0KLQkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMjEpCi0JCQkJewotCQkJCQlNQ1MyMSA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIyKQotCQkJCXsKLQkJCQkJTUNTMjIgPSBpZHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yMykKLQkJCQl7Ci0JCQkJCU1DUzIzID0gaWR4OwotCQkJCX0KLQkJCQlpZHggKys7Ci0JCQl9Ci0KLQkJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCi0JCQl7Ci0JCQkJaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckcpCi0JCQkJewotCQkJCQlSc3NpT2Zmc2V0ID0gMjsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJUnNzaU9mZnNldCA9IDU7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JBKQotCQkJCXsKLQkJCQkJUnNzaU9mZnNldCA9IDU7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCVJzc2lPZmZzZXQgPSA4OwotCQkJCX0KLQkJCX0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCS8qaWYgKE1DUzE1KSovCi0JCQlpZiAoKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjNTKSB8fAotCQkJCShwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFOM1MpIHx8Ci0JCQkJKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUpKQotCQkJey8vIE4gbW9kZSB3aXRoIDMgc3RyZWFtIC8vIDMqMwotCQkJCWlmIChNQ1MyMyAmJiAoUnNzaSA+PSAtNzApKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MyMzsKLQkJCQllbHNlIGlmIChNQ1MyMiAmJiAoUnNzaSA+PSAtNzIpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MyMjsKLQkJICAgIGVsc2UgaWYgKE1DUzIxICYmIChSc3NpID49IC03NikpCi0JCQkJCVR4UmF0ZUlkeCA9IE1DUzIxOwotCQkJCWVsc2UgaWYgKE1DUzIwICYmIChSc3NpID49IC03OCkpCi0JCQkJCVR4UmF0ZUlkeCA9IE1DUzIwOwotCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+PSAtODIpKQotCQkJCVR4UmF0ZUlkeCA9IE1DUzQ7Ci0JCQllbHNlIGlmIChNQ1MzICYmIChSc3NpID49IC04NCkpCi0JCQkJVHhSYXRlSWR4ID0gTUNTMzsKLQkJCWVsc2UgaWYgKE1DUzIgJiYgKFJzc2kgPj0gLTg2KSkKLQkJCQlUeFJhdGVJZHggPSBNQ1MyOwotCQkJZWxzZSBpZiAoTUNTMSAmJiAoUnNzaSA+PSAtODgpKQotCQkJCVR4UmF0ZUlkeCA9IE1DUzE7Ci0JCQllbHNlCi0JCQkJVHhSYXRlSWR4ID0gTUNTMDsKLQkJfQotLy8JCWVsc2UgaWYgKChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yUykgfHwgKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmQpIHx8KHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4yUykgfHwocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmQpIHx8IChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlKSkKLQkJZWxzZSBpZiAoKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTKSB8fCAocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZCkgfHwocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjJTKSB8fChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZCkpIC8vIDMqMwotCQkJey8vIE4gbW9kZSB3aXRoIDIgc3RyZWFtCi0JCQkJaWYgKE1DUzE1ICYmIChSc3NpID49ICgtNzArUnNzaU9mZnNldCkpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MxNTsKLQkJCQllbHNlIGlmIChNQ1MxNCAmJiAoUnNzaSA+PSAoLTcyK1Jzc2lPZmZzZXQpKSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTMTQ7Ci0JCQkJZWxzZSBpZiAoTUNTMTMgJiYgKFJzc2kgPj0gKC03NitSc3NpT2Zmc2V0KSkpCi0JCQkJCVR4UmF0ZUlkeCA9IE1DUzEzOwotCQkJCWVsc2UgaWYgKE1DUzEyICYmIChSc3NpID49ICgtNzgrUnNzaU9mZnNldCkpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MxMjsKLQkJCQllbHNlIGlmIChNQ1M0ICYmIChSc3NpID49ICgtODIrUnNzaU9mZnNldCkpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1M0OwotCQkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPj0gKC04NCtSc3NpT2Zmc2V0KSkpCi0JCQkJCVR4UmF0ZUlkeCA9IE1DUzM7Ci0JCQkJZWxzZSBpZiAoTUNTMiAmJiAoUnNzaSA+PSAoLTg2K1Jzc2lPZmZzZXQpKSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTMjsKLQkJCQllbHNlIGlmIChNQ1MxICYmIChSc3NpID49ICgtODgrUnNzaU9mZnNldCkpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MxOwotCQkJCWVsc2UKLQkJCQkJVHhSYXRlSWR4ID0gTUNTMDsKLQkJCX0KLQkJCWVsc2UgaWYgKChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04xUykgfHwgKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4xUykpCi0JCQl7Ly8gTiBtb2RlIHdpdGggMSBzdHJlYW0KLQkJCQlpZiAoTUNTNyAmJiAoUnNzaSA+ICgtNzIrUnNzaU9mZnNldCkpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1M3OwotCQkJCWVsc2UgaWYgKE1DUzYgJiYgKFJzc2kgPiAoLTc0K1Jzc2lPZmZzZXQpKSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTNjsKLQkJCQllbHNlIGlmIChNQ1M1ICYmIChSc3NpID4gKC03NytSc3NpT2Zmc2V0KSkpCi0JCQkJCVR4UmF0ZUlkeCA9IE1DUzU7Ci0JCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+ICgtNzkrUnNzaU9mZnNldCkpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1M0OwotCQkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPiAoLTgxK1Jzc2lPZmZzZXQpKSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTMzsKLQkJCQllbHNlIGlmIChNQ1MyICYmIChSc3NpID4gKC04MytSc3NpT2Zmc2V0KSkpCi0JCQkJCVR4UmF0ZUlkeCA9IE1DUzI7Ci0JCQkJZWxzZSBpZiAoTUNTMSAmJiAoUnNzaSA+ICgtODYrUnNzaU9mZnNldCkpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MxOwotCQkJCWVsc2UKLQkJCQkJVHhSYXRlSWR4ID0gTUNTMDsKLQkJCX0KLQkJCWVsc2UKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCXsvLyBMZWdhY3kgbW9kZQotCQkJCWlmIChNQ1M3ICYmIChSc3NpID4gLTcwKSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTNzsKLQkJCQllbHNlIGlmIChNQ1M2ICYmIChSc3NpID4gLTc0KSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTNjsKLQkJCQllbHNlIGlmIChNQ1M1ICYmIChSc3NpID4gLTc4KSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTNTsKLQkJCQllbHNlIGlmIChNQ1M0ICYmIChSc3NpID4gLTgyKSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTNDsKLQkJCQllbHNlIGlmIChNQ1M0ID09IDApCS8vIGZvciBCLW9ubHkgbW9kZQotCQkJCQlUeFJhdGVJZHggPSBNQ1MzOwotCQkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPiAtODUpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MzOwotCQkJCWVsc2UgaWYgKE1DUzIgJiYgKFJzc2kgPiAtODcpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MyOwotCQkJCWVsc2UgaWYgKE1DUzEgJiYgKFJzc2kgPiAtOTApKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MxOwotCQkJCWVsc2UKLQkJCQkJVHhSYXRlSWR4ID0gTUNTMDsKLQkJCX0KLQotCS8vCQlpZiAoVHhSYXRlSWR4ICE9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4KQotCQkJewotCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID0gVHhSYXRlSWR4OwotCQkJCXBOZXh0VHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhwRW50cnktPkN1cnJUeFJhdGVJbmRleCsxKSo1XTsKLQkJCQlNbG1lU2V0VHhSYXRlKHBBZCwgcEVudHJ5LCBwTmV4dFR4UmF0ZSk7Ci0JCQl9Ci0KLQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+VHhRdWFsaXR5LCBzaXplb2YoVVNIT1JUKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKLQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+UEVSLCBzaXplb2YoVUNIQVIpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOwotCQkJcEVudHJ5LT5mTGFzdFNlY0FjY29yZGluZ1JTU0kgPSBUUlVFOwotCQkJLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCi0JCQlSRVNFVF9PTkVfU0VDX1RYX0NOVChwRW50cnkpOwotCi0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChwRW50cnktPmZMYXN0U2VjQWNjb3JkaW5nUlNTSSA9PSBUUlVFKQotCQl7Ci0JCQlwRW50cnktPmZMYXN0U2VjQWNjb3JkaW5nUlNTSSA9IEZBTFNFOwotCQkJcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID0gMDsKLQkJCS8vIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycwotCQkJUkVTRVRfT05FX1NFQ19UWF9DTlQocEVudHJ5KTsKLQotCQkJY29udGludWU7Ci0JCX0KLQotCQlkbwotCQl7Ci0JCQlCT09MRUFOCWJUcmFpblVwRG93biA9IEZBTFNFOwotCi0JCQlwRW50cnktPkN1cnJUeFJhdGVTdGFibGVUaW1lICsrOwotCi0JCQkvLyBkb3duZ3JhZGUgVFggcXVhbGl0eSBpZiBQRVIgPj0gUmF0ZS1Eb3duIHRocmVzaG9sZAotCQkJaWYgKFR4RXJyb3JSYXRpbyA+PSBUcmFpbkRvd24pCi0JCQl7Ci0JCQkJYlRyYWluVXBEb3duID0gVFJVRTsKLQkJCQlwRW50cnktPlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKLQkJCX0KLQkJCS8vIHVwZ3JhZGUgVFggcXVhbGl0eSBpZiBQRVIgPD0gUmF0ZS1VcCB0aHJlc2hvbGQKLQkJCWVsc2UgaWYgKFR4RXJyb3JSYXRpbyA8PSBUcmFpblVwKQotCQkJewotCQkJCWJUcmFpblVwRG93biA9IFRSVUU7Ci0JCQkJYlVwZ3JhZGVRdWFsaXR5ID0gVFJVRTsKLQkJCQlpZiAocEVudHJ5LT5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdKQotCQkJCQlwRW50cnktPlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gLS07ICAvLyBxdWFsaXR5IHZlcnkgZ29vZCBpbiBDdXJyUmF0ZQotCi0JCQkJaWYgKHBFbnRyeS0+VHhSYXRlVXBQZW5hbHR5KQotCQkJCQlwRW50cnktPlR4UmF0ZVVwUGVuYWx0eSAtLTsKLQkJCQllbHNlIGlmIChwRW50cnktPlR4UXVhbGl0eVtVcFJhdGVJZHhdKQotCQkJCQlwRW50cnktPlR4UXVhbGl0eVtVcFJhdGVJZHhdIC0tOyAgICAvLyBtYXkgaW1wcm92ZSBuZXh0IFVQIHJhdGUncyBxdWFsaXR5Ci0JCQl9Ci0KLQkJCXBFbnRyeS0+UEVSW0N1cnJSYXRlSWR4XSA9IChVQ0hBUilUeEVycm9yUmF0aW87Ci0KLQkJCWlmIChiVHJhaW5VcERvd24pCi0JCQl7Ci0JCQkJLy8gcGVyZm9ybSBEUlMgLSBjb25zaWRlciBUeFJhdGUgRG93biBmaXJzdCwgdGhlbiByYXRlIHVwLgotCQkJCWlmICgoQ3VyclJhdGVJZHggIT0gRG93blJhdGVJZHgpICYmIChwRW50cnktPlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPj0gRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQpKQotCQkJCXsKLQkJCQkJcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggPSBEb3duUmF0ZUlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKEN1cnJSYXRlSWR4ICE9IFVwUmF0ZUlkeCkgJiYgKHBFbnRyeS0+VHhRdWFsaXR5W1VwUmF0ZUlkeF0gPD0gMCkpCi0JCQkJewotCQkJCQlwRW50cnktPkN1cnJUeFJhdGVJbmRleCA9IFVwUmF0ZUlkeDsKLQkJCQl9Ci0JCQl9Ci0JCX0gd2hpbGUgKEZBTFNFKTsKLQotCQkvLyBpZiByYXRlLXVwIGhhcHBlbiwgY2xlYXIgYWxsIGJhZCBoaXN0b3J5IG9mIGFsbCBUWCByYXRlcwotCQlpZiAocEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggPiBDdXJyUmF0ZUlkeCkKLQkJewotCQkJcEVudHJ5LT5DdXJyVHhSYXRlU3RhYmxlVGltZSA9IDA7Ci0JCQlwRW50cnktPlR4UmF0ZVVwUGVuYWx0eSA9IDA7Ci0JCQlwRW50cnktPkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPSAxOyAvLyByYXRlIFVQCi0JCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlR4UXVhbGl0eSwgc2l6ZW9mKFVTSE9SVCkgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7Ci0JCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlBFUiwgc2l6ZW9mKFVDSEFSKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKLQotCQkJLy8KLQkJCS8vIEZvciBUeFJhdGUgZmFzdCB0cmFpbiB1cAotCQkJLy8KLQkJCWlmICghcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nKQotCQkJewotCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsIDEwMCk7Ci0KLQkJCQlwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcgPSBUUlVFOwotCQkJfQotCQkJYlR4UmF0ZUNoYW5nZWQgPSBUUlVFOwotCQl9Ci0JCS8vIGlmIHJhdGUtZG93biBoYXBwZW4sIG9ubHkgY2xlYXIgRG93blJhdGUncyBiYWQgaGlzdG9yeQotCQllbHNlIGlmIChwRW50cnktPkN1cnJUeFJhdGVJbmRleCA8IEN1cnJSYXRlSWR4KQotCQl7Ci0JCQlwRW50cnktPkN1cnJUeFJhdGVTdGFibGVUaW1lID0gMDsKLQkJCXBFbnRyeS0+VHhSYXRlVXBQZW5hbHR5ID0gMDsgICAgICAgICAgIC8vIG5vIHBlbmFsdHkKLQkJCXBFbnRyeS0+TGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9IDI7IC8vIHJhdGUgRE9XTgotCQkJcEVudHJ5LT5UeFF1YWxpdHlbcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXhdID0gMDsKLQkJCXBFbnRyeS0+UEVSW3BFbnRyeS0+Q3VyclR4UmF0ZUluZGV4XSA9IDA7Ci0KLQkJCS8vCi0JCQkvLyBGb3IgVHhSYXRlIGZhc3QgdHJhaW4gZG93bgotCQkJLy8KLQkJCWlmICghcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nKQotCQkJewotCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsIDEwMCk7Ci0KLQkJCQlwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcgPSBUUlVFOwotCQkJfQotCQkJYlR4UmF0ZUNoYW5nZWQgPSBUUlVFOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID0gMDsgLy8gcmF0ZSBubyBjaGFuZ2UKLQkJCWJUeFJhdGVDaGFuZ2VkID0gRkFMU0U7Ci0JCX0KLQotCQlwRW50cnktPkxhc3RUeE9rQ291bnQgPSBUeFN1Y2Nlc3M7Ci0KLQkJewotCQkJVUNIQVIgdG1wVHhSYXRlOwotCi0JCQkvLyB0byBmaXggdGNwIGFjayBpc3N1ZQotCQkJaWYgKCFiVHhSYXRlQ2hhbmdlZCAmJiAocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSZWNlaXZlZEJ5dGVDb3VudCA+IChwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1RyYW5zbWl0dGVkQnl0ZUNvdW50ICogNSkpKQotCQkJewotCQkJCXRtcFR4UmF0ZSA9IERvd25SYXRlSWR4OwotCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkRSUzogUngoJWQpIGlzIDUgdGltZXMgbGFyZ2VyIHRoYW4gVHgoJWQpLCB1c2UgbG93IHJhdGUgKGN1cnI9JWQsIHRtcD0lZClcbiIsCi0JCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUmVjZWl2ZWRCeXRlQ291bnQsIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHJhbnNtaXR0ZWRCeXRlQ291bnQsIHBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4LCB0bXBUeFJhdGUpKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQl0bXBUeFJhdGUgPSBwRW50cnktPkN1cnJUeFJhdGVJbmRleDsKLQkJCX0KLQotCQkJcE5leHRUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKHRtcFR4UmF0ZSsxKSo1XTsKLQkJCWlmIChiVHhSYXRlQ2hhbmdlZCAmJiBwTmV4dFR4UmF0ZSkKLQkJCXsKLQkJCQlNbG1lU2V0VHhSYXRlKHBBZCwgcEVudHJ5LCBwTmV4dFR4UmF0ZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCi0JCVJFU0VUX09ORV9TRUNfVFhfQ05UKHBFbnRyeSk7Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVN0YXRpb24gc2lkZSwgQXV0byBUeFJhdGUgZmFzdGVyIHRyYWluIHVwIHRpbWVyIGNhbGwgYmFjayBmdW5jdGlvbi4KLQotCUFyZ3VtZW50czoKLQkJU3lzdGVtU3BlY2lmaWMxCQkJLSBOb3QgdXNlZC4KLQkJRnVuY3Rpb25Db250ZXh0CQkJLSBQb2ludGVyIHRvIG91ciBBZGFwdGVyIGNvbnRleHQuCi0JCVN5c3RlbVNwZWNpZmljMgkJCS0gTm90IHVzZWQuCi0JCVN5c3RlbVNwZWNpZmljMwkJCS0gTm90IHVzZWQuCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCi17Ci0JUFJUTVBfQURBUFRFUgkJCXBBZCA9IChQUlRNUF9BREFQVEVSKUZ1bmN0aW9uQ29udGV4dDsKLQlVQ0hBUgkJCQkJVXBSYXRlSWR4ID0gMCwgRG93blJhdGVJZHggPSAwLCBDdXJyUmF0ZUlkeCA9IDA7Ci0JVUxPTkcJCQkJCVR4VG90YWxDbnQ7Ci0JVUxPTkcJCQkJCVR4RXJyb3JSYXRpbyA9IDA7Ci0JQk9PTEVBTgkJCQkJYlR4UmF0ZUNoYW5nZWQ7IC8vLCBiVXBncmFkZVF1YWxpdHkgPSBGQUxTRTsKLQlQUlRNUF9UWF9SQVRFX1NXSVRDSAlwQ3VyclR4UmF0ZSwgcE5leHRUeFJhdGUgPSBOVUxMOwotCVBVQ0hBUgkJCQkJcFRhYmxlOwotCVVDSEFSCQkJCQlUYWJsZVNpemUgPSAwOwotCVVDSEFSCQkJCQlJbml0VHhSYXRlSWR4ID0gMCwgVHJhaW5VcCwgVHJhaW5Eb3duOwotCVRYX1NUQV9DTlQxX1NUUlVDCQlTdGFUeDE7Ci0JVFhfU1RBX0NOVDBfU1RSVUMJCVR4U3RhQ250MDsKLQlDSEFSCQkJCQlSc3NpLCByYXRpbzsKLQlVTE9ORwkJCQkJVHhSZXRyYW5zbWl0ID0gMCwgVHhTdWNjZXNzID0gMCwgVHhGYWlsQ291bnQgPSAwOwotCU1BQ19UQUJMRV9FTlRSWQkJCSpwRW50cnk7Ci0JVUxPTkcJCQkJCWk7Ci0KLQlwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcgPSBGQUxTRTsKLQotICAgIC8vCi0gICAgLy8gd2FsayB0aHJvdWdoIE1BQyB0YWJsZSwgc2VlIGlmIG5lZWQgdG8gY2hhbmdlIEFQJ3MgVFggcmF0ZSB0b3dhcmQgZWFjaCBlbnRyeQotICAgIC8vCi0JZm9yIChpID0gMTsgaSA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCi0JewotCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKLQotCQkvLyBjaGVjayBpZiB0aGlzIGVudHJ5IG5lZWQgdG8gc3dpdGNoIHJhdGUgYXV0b21hdGljYWxseQotCQlpZiAoUlRNUENoZWNrRW50cnlFbmFibGVBdXRvUmF0ZVN3aXRjaChwQWQsIHBFbnRyeSkgPT0gRkFMU0UpCi0JCQljb250aW51ZTsKLQotCQlpZiAoSU5GUkFfT04ocEFkKSAmJiAoaSA9PSAxKSkKLQkJCVJzc2kgPSBSVE1QTWF4UnNzaShwQWQsCi0JCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCwKLQkJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxLAotCQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTIpOwotCQllbHNlCi0JCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLAotCQkJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMCwKLQkJCQkJCQkgICBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTEsCi0JCQkJCQkJICAgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKLQotCUN1cnJSYXRlSWR4ID0gcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXg7Ci0KLQkJCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsIHBFbnRyeSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJkluaXRUeFJhdGVJZHgpOwotCi0JLy8gZGVjaWRlIHRoZSBuZXh0IHVwZ3JhZGUgcmF0ZSBhbmQgZG93bmdyYWRlIHJhdGUsIGlmIGFueQotCWlmICgoQ3VyclJhdGVJZHggPiAwKSAmJiAoQ3VyclJhdGVJZHggPCAoVGFibGVTaXplIC0gMSkpKQotCXsKLQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHggKyAxOwotCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4IC0xOwotCX0KLQllbHNlIGlmIChDdXJyUmF0ZUlkeCA9PSAwKQotCXsKLQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHggKyAxOwotCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4OwotCX0KLQllbHNlIGlmIChDdXJyUmF0ZUlkeCA9PSAoVGFibGVTaXplIC0gMSkpCi0JewotCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeDsKLQkJRG93blJhdGVJZHggPSBDdXJyUmF0ZUlkeCAtIDE7Ci0JfQotCi0JcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKEN1cnJSYXRlSWR4KzEpKjVdOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JaWYgKChSc3NpID4gLTY1KSAmJiAocEN1cnJUeFJhdGUtPk1vZGUgPj0gTU9ERV9IVE1JWCkpCi0JewotCQlUcmFpblVwCQk9IChwQ3VyclR4UmF0ZS0+VHJhaW5VcCArIChwQ3VyclR4UmF0ZS0+VHJhaW5VcCA+PiAxKSk7Ci0JCVRyYWluRG93bgk9IChwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duICsgKHBDdXJyVHhSYXRlLT5UcmFpbkRvd24gPj4gMSkpOwotCX0KLQllbHNlCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JewotCQlUcmFpblVwCQk9IHBDdXJyVHhSYXRlLT5UcmFpblVwOwotCQlUcmFpbkRvd24JPSBwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duOwotCX0KLQotCQlpZiAocEFkLT5NYWNUYWIuU2l6ZSA9PSAxKQotCQl7Ci0JLy8gVXBkYXRlIHN0YXRpc3RpYyBjb3VudGVyCi0JUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJlR4U3RhQ250MC53b3JkKTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQxLCAmU3RhVHgxLndvcmQpOwotCi0JVHhSZXRyYW5zbWl0ID0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKLQlUeFN1Y2Nlc3MgPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOwotCVR4RmFpbENvdW50ID0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OwotCVR4VG90YWxDbnQgPSBUeFJldHJhbnNtaXQgKyBUeFN1Y2Nlc3MgKyBUeEZhaWxDb3VudDsKLQotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKLQkJCXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKLQkJCXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7Ci0JCQlwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC51Lkxvd1BhcnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OwotCi0JaWYgKFR4VG90YWxDbnQpCi0JCVR4RXJyb3JSYXRpbyA9ICgoVHhSZXRyYW5zbWl0ICsgVHhGYWlsQ291bnQpICogMTAwKSAvIFR4VG90YWxDbnQ7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlUeFRvdGFsQ250ID0gcEVudHJ5LT5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKLQkJCQkgcEVudHJ5LT5PbmVTZWNUeFJldHJ5T2tDb3VudCArCi0JCQkJIHBFbnRyeS0+T25lU2VjVHhGYWlsQ291bnQ7Ci0KLQkJCWlmIChUeFRvdGFsQ250KQotCQkJCVR4RXJyb3JSYXRpbyA9ICgocEVudHJ5LT5PbmVTZWNUeFJldHJ5T2tDb3VudCArIHBFbnRyeS0+T25lU2VjVHhGYWlsQ291bnQpICogMTAwKSAvIFR4VG90YWxDbnQ7Ci0JCX0KLQotCi0JLy8KLQkvLyBDQVNFIDEuIHdoZW4gVFggc2FtcGxlcyBhcmUgZmV3ZXIgdGhhbiAxNSwgdGhlbiBkZWNpZGUgVFggcmF0ZSBzb2xlbHkgb24gUlNTSQotCS8vICAgICAgICAgKGNyaXRlcmlhIGNvcGllZCBmcm9tIFJUMjUwMCBmb3IgTmV0b3BpYSBjYXNlKQotCS8vCi0JaWYgKFR4VG90YWxDbnQgPD0gMTIpCi0JewotCQlOZGlzWmVyb01lbW9yeShwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eSwgc2l6ZW9mKFVTSE9SVCkgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7Ci0JCU5kaXNaZXJvTWVtb3J5KHBBZC0+RHJzQ291bnRlcnMuUEVSLCBzaXplb2YoVUNIQVIpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOwotCi0JCWlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID09IDEpICYmIChDdXJyUmF0ZUlkeCAhPSBEb3duUmF0ZUlkeCkpCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID0gRG93blJhdGVJZHg7Ci0JCQlwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKLQkJfQotCQllbHNlIGlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID09IDIpICYmIChDdXJyUmF0ZUlkeCAhPSBVcFJhdGVJZHgpKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA9IFVwUmF0ZUlkeDsKLQkJfQotCi0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIlF1aWNrRFJTOiBUeFRvdGFsQ250IDw9IDE1LCB0cmFpbiBiYWNrIHRvIG9yaWdpbmFsIHJhdGUgXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlkbwotCXsKLQkJVUxPTkcgT25lU2VjVHhOb1JldHJ5T0tSYXRpb25Db3VudDsKLQotCQlpZiAocEFkLT5EcnNDb3VudGVycy5MYXN0VGltZVR4UmF0ZUNoYW5nZUFjdGlvbiA9PSAwKQotCQkJcmF0aW8gPSA1OwotCQllbHNlCi0JCQlyYXRpbyA9IDQ7Ci0KLQkJLy8gZG93bmdyYWRlIFRYIHF1YWxpdHkgaWYgUEVSID49IFJhdGUtRG93biB0aHJlc2hvbGQKLQkJaWYgKFR4RXJyb3JSYXRpbyA+PSBUcmFpbkRvd24pCi0JCXsKLQkJCXBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA9IERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EOwotCQl9Ci0KLQkJcEFkLT5EcnNDb3VudGVycy5QRVJbQ3VyclJhdGVJZHhdID0gKFVDSEFSKVR4RXJyb3JSYXRpbzsKLQotCQlPbmVTZWNUeE5vUmV0cnlPS1JhdGlvbkNvdW50ID0gKFR4U3VjY2VzcyAqIHJhdGlvKTsKLQotCQkvLyBwZXJmb3JtIERSUyAtIGNvbnNpZGVyIFR4UmF0ZSBEb3duIGZpcnN0LCB0aGVuIHJhdGUgdXAuCi0JCWlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID09IDEpICYmIChDdXJyUmF0ZUlkeCAhPSBEb3duUmF0ZUlkeCkpCi0JCXsKLQkJCWlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0VHhPa0NvdW50ICsgMikgPj0gT25lU2VjVHhOb1JldHJ5T0tSYXRpb25Db3VudCkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPSBEb3duUmF0ZUlkeDsKLQkJCQlwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKLQotCQkJfQotCi0JCX0KLQkJZWxzZSBpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9PSAyKSAmJiAoQ3VyclJhdGVJZHggIT0gVXBSYXRlSWR4KSkKLQkJewotCQkJaWYgKChUeEVycm9yUmF0aW8gPj0gNTApIHx8IChUeEVycm9yUmF0aW8gPj0gVHJhaW5Eb3duKSkKLQkJCXsKLQotCQkJfQotCQkJZWxzZSBpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFR4T2tDb3VudCArIDIpID49IE9uZVNlY1R4Tm9SZXRyeU9LUmF0aW9uQ291bnQpCi0JCQl7Ci0JCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPSBVcFJhdGVJZHg7Ci0JCQl9Ci0JCX0KLQl9d2hpbGUgKEZBTFNFKTsKLQotCS8vIGlmIHJhdGUtdXAgaGFwcGVuLCBjbGVhciBhbGwgYmFkIGhpc3Rvcnkgb2YgYWxsIFRYIHJhdGVzCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID4gQ3VyclJhdGVJZHgpCi0JewotCQlwQWQtPkRyc0NvdW50ZXJzLlR4UmF0ZVVwUGVuYWx0eSA9IDA7Ci0JCU5kaXNaZXJvTWVtb3J5KHBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5LCBzaXplb2YoVVNIT1JUKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKLQkJTmRpc1plcm9NZW1vcnkocEFkLT5EcnNDb3VudGVycy5QRVIsIHNpemVvZihVQ0hBUikgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7Ci0JCQliVHhSYXRlQ2hhbmdlZCA9IFRSVUU7Ci0JfQotCS8vIGlmIHJhdGUtZG93biBoYXBwZW4sIG9ubHkgY2xlYXIgRG93blJhdGUncyBiYWQgaGlzdG9yeQotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4IDwgQ3VyclJhdGVJZHgpCi0JewotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJRdWlja0RSUzogLS1UWCByYXRlIGZyb20gJWQgdG8gJWQgXG4iLCBDdXJyUmF0ZUlkeCwgcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXgpKTsKLQotCQlwQWQtPkRyc0NvdW50ZXJzLlR4UmF0ZVVwUGVuYWx0eSA9IDA7ICAgICAgICAgICAvLyBubyBwZW5hbHR5Ci0JCXBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5W3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4XSA9IDA7Ci0JCXBBZC0+RHJzQ291bnRlcnMuUEVSW3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4XSA9IDA7Ci0JCQliVHhSYXRlQ2hhbmdlZCA9IFRSVUU7Ci0JfQotCWVsc2UKLQl7Ci0JCWJUeFJhdGVDaGFuZ2VkID0gRkFMU0U7Ci0JfQotCi0JcE5leHRUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4KzEpKjVdOwotCWlmIChiVHhSYXRlQ2hhbmdlZCAmJiBwTmV4dFR4UmF0ZSkKLQl7Ci0JCQlNbG1lU2V0VHhSYXRlKHBBZCwgcEVudHJ5LCBwTmV4dFR4UmF0ZSk7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyByb3V0aW5lIGlzIGV4ZWN1dGVkIHBlcmlvZGljYWxseSBpbnNpZGUgTWxtZVBlcmlvZGljRXhlYygpIGFmdGVyCi0JCWFzc29jaWF0aW9uIHdpdGggYW4gQVAuCi0JCUl0IGNoZWNrcyBpZiBTdGFDZmcuUHNtIGlzIGNvbnNpc3RlbnQgd2l0aCB1c2VyIHBvbGljeSAocmVjb3JkZWQgaW4KLQkJU3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUpLiBJZiBub3QsIGVuZm9yY2UgdXNlciBwb2xpY3kuIEhvd2V2ZXIsCi0JCXRoZXJlJ3JlIHNvbWUgY29uZGl0aW9ucyB0byBjb25zaWRlcjoKLQkJMS4gd2UgZG9uJ3Qgc3VwcG9ydCBwb3dlci1zYXZpbmcgaW4gQURIT0MgbW9kZSwgc28gUHNtPVBXUl9BQ1RJVkUgYWxsCi0JCSAgIHRoZSB0aW1lIHdoZW4gTWlic3M9PVRSVUUKLQkJMi4gV2hlbiBsaW5rIHVwIGluIElORlJBIG1vZGUsIFBzbSBzaG91bGQgbm90IGJlIHN3aXRjaCB0byBQV1JfU0FWRQotCQkgICBpZiBvdXRnb2luZyB0cmFmZmljIGF2YWlsYWJsZSBpbiBUeFJpbmcgb3IgTWdtdFJpbmcuCi0JT3V0cHV0OgotCQkxLiBjaGFuZ2UgcEFkLT5TdGFDZmcuUHNtIHRvIFBXUl9TQVZFIG9yIGxlYXZlIGl0IHVudG91Y2hlZAotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIE1sbWVDaGVja1BzbUNoYW5nZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVTE9ORwlOb3czMikKLXsKLQlVTE9ORwlQb3dlck1vZGU7Ci0KLQkvLyBjb25kaXRpb24gLQotCS8vIDEuIFBzbSBtYXliZSBPTiBvbmx5IGhhcHBlbiBpbiBJTkZSQVNUUlVDVFVSRSBtb2RlCi0JLy8gMi4gdXNlciB3YW50cyBlaXRoZXIgTUFYX1BTUCBvciBGQVNUX1BTUAotCS8vIDMuIGJ1dCBjdXJyZW50IHBzbSBpcyBub3QgaW4gUFdSX1NBVkUKLQkvLyA0LiBDTlRMIHN0YXRlIG1hY2hpbmUgaXMgbm90IGRvaW5nIFNDQU5uaW5nCi0JLy8gNS4gbm8gVFggU1VDQ0VTUyBldmVudCBmb3IgdGhlIHBhc3QgMS1zZWMgcGVyaW9kCi0JUG93ZXJNb2RlID0gcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZTsKLQotCWlmIChJTkZSQV9PTihwQWQpICYmCi0JCShQb3dlck1vZGUgIT0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTSkgJiYKLQkJKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfQUNUSVZFKSAmJgotLy8JCSghIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCi0JCShwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkmJgotCQlSVE1QX1RFU1RfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKQotCQkgLyomJgotCQkocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ID09IDApICYmCi0JCShwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ID09IDApKi8pCi0JewotCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZwQWQtPk1sbWUuTGFzdFNlbmROVUxMcHNtVGltZSk7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudFNpbmNlTGFzdE5VTEwgPSAwOwotCQlSVE1QX1NFVF9QU01fQklUKHBBZCwgUFdSX1NBVkUpOwotCQlpZiAoIShwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQVBTRENhcGFibGUpKQotCQl7Ci0JCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgRkFMU0UpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkLCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsIFRSVUUpOwotCQl9Ci0JfQotfQotCi0vLyBJUlFMID0gUEFTU0lWRV9MRVZFTAotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIE1sbWVTZXRQc21CaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIHBzbSkKLXsKLQlBVVRPX1JTUF9DRkdfU1RSVUMgY3NyNDsKLQotCXBBZC0+U3RhQ2ZnLlBzbSA9IHBzbTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIEFVVE9fUlNQX0NGRywgJmNzcjQud29yZCk7Ci0JY3NyNC5maWVsZC5BY2tDdHNQc21CaXQgPSAocHNtID09IFBXUl9TQVZFKT8gMTowOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fUlNQX0NGRywgY3NyNC53b3JkKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU2V0UHNtQml0ID0gJWRcbiIsIHBzbSkpOwotfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVRoaXMgcm91dGluZSBjYWxjdWxhdGVzIFR4UEVSLCBSeFBFUiBvZiB0aGUgcGFzdCBOLXNlYyBwZXJpb2QuIEFuZAotCQlhY2NvcmRpbmcgdG8gdGhlIGNhbGN1bGF0aW9uIHJlc3VsdCwgQ2hhbm5lbFF1YWxpdHkgaXMgY2FsY3VsYXRlZCBoZXJlCi0JCXRvIGRlY2lkZSBpZiBjdXJyZW50IEFQIGlzIHN0aWxsIGRvaW5nIHRoZSBqb2IuCi0KLQkJSWYgQ2hhbm5lbFF1YWxpdHkgaXMgbm90IGdvb2QsIGEgUk9BTWluZyBhdHRlbXB0IG1heSBiZSB0cmllZCBsYXRlci4KLQlPdXRwdXQ6Ci0JCVN0YUNmZy5DaGFubmVsUXVhbGl0eSAtIDAuLjEwMAotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOT1RFOiBUaGlzIHJvdXRpbmUgZGVjaWRlIGNoYW5ubGUgcXVhbGl0eSBiYXNlZCBvbiBSWCBDUkMgZXJyb3IgcmF0aW8uCi0JCUNhbGxlciBzaG91bGQgbWFrZSBzdXJlIGEgZnVuY3Rpb24gY2FsbCB0byBOSUNVcGRhdGVSYXdDb3VudGVycyhwQWQpCi0JCWlzIHBlcmZvcm1lZCByaWdodCBiZWZvcmUgdGhpcyByb3V0aW5lLCBzbyB0aGF0IHRoaXMgcm91dGluZSBjYW4gZGVjaWRlCi0JCWNoYW5uZWwgcXVhbGl0eSBiYXNlZCBvbiB0aGUgbW9zdCB1cC10by1kYXRlIGluZm9ybWF0aW9uCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNbG1lQ2FsY3VsYXRlQ2hhbm5lbFF1YWxpdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUE1BQ19UQUJMRV9FTlRSWSBwTWFjRW50cnksCi0JSU4gVUxPTkcgTm93MzIpCi17Ci0JVUxPTkcgVHhPa0NudCwgVHhDbnQsIFR4UEVSLCBUeFBSUjsKLQlVTE9ORyBSeENudCwgUnhQRVI7Ci0JVUNIQVIgTm9yUnNzaTsKLQlDSEFSICBNYXhSc3NpOwotCVJTU0lfU0FNUExFICpwUnNzaVNhbXBsZSA9IE5VTEw7Ci0JVUlOVDMyIE9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgPSAwOwotCVVJTlQzMiBPbmVTZWNUeFJldHJ5T2tDb3VudCA9IDA7Ci0JVUlOVDMyIE9uZVNlY1R4RmFpbENvdW50ID0gMDsKLQlVSU5UMzIgT25lU2VjUnhPa0NudCA9IDA7Ci0JVUlOVDMyIE9uZVNlY1J4RmNzRXJyQ250ID0gMDsKLQlVTE9ORyBDaGFubmVsUXVhbGl0eSA9IDA7ICAvLyAwLi4xMDAsIENoYW5uZWwgUXVhbGl0eSBJbmRpY2F0aW9uIGZvciBSb2FtaW5nCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JVUxPTkcgQmVhY29uTG9zdFRpbWUgPSBwQWQtPlN0YUNmZy5CZWFjb25Mb3N0VGltZTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8gUm9nZXIgc3luYyBDYXJyaWVyCi0JLy8gbG9uZ2VyIGJlYWNvbiBsb3N0IHRpbWUgd2hlbiBjYXJyaWVyIGRldGVjdGlvbiBlbmFibGVkCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID09IFRSVUUpCi0JewotCQlCZWFjb25Mb3N0VGltZSA9IHBBZC0+U3RhQ2ZnLkJlYWNvbkxvc3RUaW1lICsgKHBBZC0+U3RhQ2ZnLkJlYWNvbkxvc3RUaW1lLzIpOwotCX0KLSNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLQl7Ci0JCXBSc3NpU2FtcGxlID0gJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGU7Ci0JCU9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQ7Ci0JCU9uZVNlY1R4UmV0cnlPa0NvdW50ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudDsKLQkJT25lU2VjVHhGYWlsQ291bnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50OwotCQlPbmVTZWNSeE9rQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rQ250OwotCQlPbmVTZWNSeEZjc0VyckNudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhGY3NFcnJDbnQ7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JTWF4UnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgcFJzc2lTYW1wbGUtPkxhc3RSc3NpMCwKLQkJCQkJCQkJcFJzc2lTYW1wbGUtPkxhc3RSc3NpMSwKLQkJCQkJCQkJcFJzc2lTYW1wbGUtPkxhc3RSc3NpMik7Ci0KLQkvLwotCS8vIGNhbGN1bGF0ZSBUWCBwYWNrZXQgZXJyb3IgcmF0aW8gYW5kIFRYIHJldHJ5IHJhdGlvIC0gaWYgdG9vIGZldyBUWCBzYW1wbGVzLCBza2lwIFRYIHJlbGF0ZWQgc3RhdGlzdGljcwotCS8vCi0JVHhPa0NudCA9IE9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKyBPbmVTZWNUeFJldHJ5T2tDb3VudDsKLQlUeENudCA9IFR4T2tDbnQgKyBPbmVTZWNUeEZhaWxDb3VudDsKLQlpZiAoVHhDbnQgPCA1KQotCXsKLQkJVHhQRVIgPSAwOwotCQlUeFBSUiA9IDA7Ci0JfQotCWVsc2UKLQl7Ci0JCVR4UEVSID0gKE9uZVNlY1R4RmFpbENvdW50ICogMTAwKSAvIFR4Q250OwotCQlUeFBSUiA9ICgoVHhDbnQgLSBPbmVTZWNUeE5vUmV0cnlPa0NvdW50KSAqIDEwMCkgLyBUeENudDsKLQl9Ci0KLQkvLwotCS8vIGNhbGN1bGF0ZSBSWCBQRVIgLSBkb24ndCB0YWtlIFJ4UEVSIGludG8gY29uc2lkZXJhdGlvbiBpZiB0b28gZmV3IHNhbXBsZQotCS8vCi0JUnhDbnQgPSBPbmVTZWNSeE9rQ250ICsgT25lU2VjUnhGY3NFcnJDbnQ7Ci0JaWYgKFJ4Q250IDwgNSkKLQkJUnhQRVIgPSAwOwotCWVsc2UKLQkJUnhQRVIgPSAoT25lU2VjUnhGY3NFcnJDbnQgKiAxMDApIC8gUnhDbnQ7Ci0KLQkvLwotCS8vIGRlY2lkZSBDaGFubmVsUXVhbGl0eSBiYXNlZCBvbjogMSlsYXN0IEJFQUNPTiByZWNlaXZlZCB0aW1lLCAyKWxhc3QgUlNTSSwgMylUeFBFUiwgYW5kIDQpUnhQRVIKLQkvLwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYKLQkJSU5GUkFfT04ocEFkKSAmJgotCQkoT25lU2VjVHhOb1JldHJ5T2tDb3VudCA8IDIpICYmIC8vIG5vIGhlYXZ5IHRyYWZmaWMKLQkJKChwQWQtPlN0YUNmZy5MYXN0QmVhY29uUnhUaW1lICsgQmVhY29uTG9zdFRpbWUpIDwgTm93MzIpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkVBQ09OIGxvc3QgPiAlbGQgbXNlYyB3aXRoIFR4T2tDbnQ9JWxkIC0+IENRST0wXG4iLCBCZWFjb25Mb3N0VGltZSwgVHhPa0NudCkpOwotCQlDaGFubmVsUXVhbGl0eSA9IDA7Ci0JfQotCWVsc2UKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQl7Ci0JCS8vIE5vcm1hbGl6ZSBSc3NpCi0JCWlmIChNYXhSc3NpID4gLTQwKQotCQkJTm9yUnNzaSA9IDEwMDsKLQkJZWxzZSBpZiAoTWF4UnNzaSA8IC05MCkKLQkJCU5vclJzc2kgPSAwOwotCQllbHNlCi0JCQlOb3JSc3NpID0gKE1heFJzc2kgKyA5MCkgKiAyOwotCi0JCS8vIENoYW5uZWxRdWFsaXR5ID0gVzEqUlNTSSArIFcyKlR4UFJSICsgVzMqUnhQRVIJIChSU1NJIDAuLjEwMCksIChUeFBFUiAxMDAuLjApLCAoUnhQRVIgMTAwLi4wKQotCQlDaGFubmVsUXVhbGl0eSA9IChSU1NJX1dFSUdIVElORyAqIE5vclJzc2kgKwotCQkJCQkJCQkgICBUWF9XRUlHSFRJTkcgKiAoMTAwIC0gVHhQUlIpICsKLQkJCQkJCQkJICAgUlhfV0VJR0hUSU5HKiAoMTAwIC0gUnhQRVIpKSAvIDEwMDsKLQl9Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQotCQlwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkgPSAoQ2hhbm5lbFF1YWxpdHkgPiAxMDApID8gMTAwIDogQ2hhbm5lbFF1YWxpdHk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotfQotCi0KLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRCBNbG1lU2V0VHhQcmVhbWJsZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQgVHhQcmVhbWJsZSkKLXsKLQlBVVRPX1JTUF9DRkdfU1RSVUMgY3NyNDsKLQotCS8vCi0JLy8gQWx3YXlzIHVzZSBMb25nIHByZWFtYmxlIGJlZm9yZSB2ZXJpZmlhdGlvbiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzIHdlbGwuCi0JLy8gVG9kbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBpZiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzCi0JLy8KLQkvL1R4UHJlYW1ibGUgPSBSdDgwMl8xMVByZWFtYmxlTG9uZzsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgQVVUT19SU1BfQ0ZHLCAmY3NyNC53b3JkKTsKLQlpZiAoVHhQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlTG9uZykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTZXRUeFByZWFtYmxlICg9IExPTkcgUFJFQU1CTEUpXG4iKSk7Ci0JCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7Ci0JCWNzcjQuZmllbGQuQXV0b1Jlc3BvbmRlclByZWFtYmxlID0gMDsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gTk9URTogMU1icHMgc2hvdWxkIGFsd2F5cyB1c2UgbG9uZyBwcmVhbWJsZQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU2V0VHhQcmVhbWJsZSAoPSBTSE9SVCBQUkVBTUJMRSlcbiIpKTsKLQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7Ci0JCWNzcjQuZmllbGQuQXV0b1Jlc3BvbmRlclByZWFtYmxlID0gMTsKLQl9Ci0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1JTUF9DRkcsIGNzcjQud29yZCk7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgVXBkYXRlIGJhc2ljIHJhdGUgYml0bWFwCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotCi1WT0lEIFVwZGF0ZUJhc2ljUmF0ZUJpdG1hcCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyKQotewotICAgIElOVCAgaSwgajsKLSAgICAgICAgICAgICAgICAgIC8qIDEgIDIgIDUuNSwgMTEsICA2LCAgOSwgMTIsIDE4LCAyNCwgMzYsIDQ4LCAgNTQgKi8KLSAgICBVQ0hBUiByYXRlW10gPSB7IDIsIDQsICAxMSwgMjIsIDEyLCAxOCwgMjQsIDM2LCA0OCwgNzIsIDk2LCAxMDggfTsKLSAgICBVQ0hBUiAqc3VwX3AgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlN1cFJhdGU7Ci0gICAgVUNIQVIgKmV4dF9wID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5FeHRSYXRlOwotICAgIFVMT05HIGJpdG1hcCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQmFzaWNSYXRlQml0bWFwOwotCi0KLSAgICAvKiBpZiBBIG1vZGUsIGFsd2F5cyB1c2UgZml4IEJhc2ljUmF0ZUJpdE1hcCAqLwotICAgIC8vaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCA9PSBQSFlfMTFBKQotCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKLSAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXAgPSAweDE1MDsgLyogNiwgMTIsIDI0TSAqLwotICAgIC8qIEVuZCBvZiBpZiAqLwotCi0gICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuQmFzaWNSYXRlQml0bWFwID4gNDA5NSkKLSAgICB7Ci0gICAgICAgIC8qICgyIF4gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpIC0xICovCi0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgZm9yKGk9MDsgaTxNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaSsrKQotICAgIHsKLSAgICAgICAgc3VwX3BbaV0gJj0gMHg3ZjsKLSAgICAgICAgZXh0X3BbaV0gJj0gMHg3ZjsKLSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLQotICAgIGZvcihpPTA7IGk8TUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChiaXRtYXAgJiAoMSA8PCBpKSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKGo9MDsgajxNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzdXBfcFtqXSA9PSByYXRlW2ldKQotICAgICAgICAgICAgICAgICAgICBzdXBfcFtqXSB8PSAweDgwOwotICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBpZiAqLwotICAgICAgICAgICAgfSAvKiBFbmQgb2YgZm9yICovCi0KLSAgICAgICAgICAgIGZvcihqPTA7IGo8TUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZXh0X3Bbal0gPT0gcmF0ZVtpXSkKLSAgICAgICAgICAgICAgICAgICAgZXh0X3Bbal0gfD0gMHg4MDsKLSAgICAgICAgICAgICAgICAvKiBFbmQgb2YgaWYgKi8KLSAgICAgICAgICAgIH0gLyogRW5kIG9mIGZvciAqLwotICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgIH0gLyogRW5kIG9mIGZvciAqLwotfSAvKiBFbmQgb2YgVXBkYXRlQmFzaWNSYXRlQml0bWFwICovCi0KLS8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLS8vIGJMaW5rVXAgaXMgdG8gaWRlbnRpZnkgdGhlIGluaXRhbCBsaW5rIHNwZWVkLgotLy8gVFJVRSBpbmRpY2F0ZXMgdGhlIHJhdGUgdXBkYXRlIGF0IGxpbmt1cCwgd2Ugc2hvdWxkIG5vdCB0cnkgdG8gc2V0IHRoZSByYXRlIGF0IDU0TWJwcy4KLVZPSUQgTWxtZVVwZGF0ZVR4UmF0ZXMoCi0JSU4gUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCUJPT0xFQU4JCQkJYkxpbmtVcCwKLQlJTglVQ0hBUgkJCQlhcGlkeCkKLXsKLQlpbnQgaSwgbnVtOwotCVVDSEFSIFJhdGUgPSBSQVRFXzYsIE1heERlc2lyZSA9IFJBVEVfMSwgTWF4U3VwcG9ydCA9IFJBVEVfMTsKLQlVQ0hBUiBNaW5TdXBwb3J0ID0gUkFURV81NDsKLQlVTE9ORyBCYXNpY1JhdGVCaXRtYXAgPSAwOwotCVVDSEFSIEN1cnJCYXNpY1JhdGUgPSBSQVRFXzE7Ci0JVUNIQVIgKnBTdXBSYXRlLCBTdXBSYXRlTGVuLCAqcEV4dFJhdGUsIEV4dFJhdGVMZW47Ci0JUEhUVFJBTlNNSVRfU0VUVElORwkJcEh0UGh5ID0gTlVMTDsKLQlQSFRUUkFOU01JVF9TRVRUSU5HCQlwTWF4SHRQaHkgPSBOVUxMOwotCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBNaW5IdFBoeSA9IE5VTEw7Ci0JQk9PTEVBTgkJCQkJKmF1dG9fcmF0ZV9jdXJfcDsKLQlVQ0hBUgkJCQkJSHRNY3MgPSBNQ1NfQVVUTzsKLQotCS8vIGZpbmQgbWF4IGRlc2lyZWQgcmF0ZQotCVVwZGF0ZUJhc2ljUmF0ZUJpdG1hcChwQWQpOwotCi0JbnVtID0gMDsKLQlhdXRvX3JhdGVfY3VyX3AgPSBOVUxMOwotCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBpKyspCi0JewotCQlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbaV0gJiAweDdmKQotCQl7Ci0JCQljYXNlIDI6ICBSYXRlID0gUkFURV8xOyAgIG51bSsrOyAgIGJyZWFrOwotCQkJY2FzZSA0OiAgUmF0ZSA9IFJBVEVfMjsgICBudW0rKzsgICBicmVhazsKLQkJCWNhc2UgMTE6IFJhdGUgPSBSQVRFXzVfNTsgbnVtKys7ICAgYnJlYWs7Ci0JCQljYXNlIDIyOiBSYXRlID0gUkFURV8xMTsgIG51bSsrOyAgIGJyZWFrOwotCQkJY2FzZSAxMjogUmF0ZSA9IFJBVEVfNjsgICBudW0rKzsgICBicmVhazsKLQkJCWNhc2UgMTg6IFJhdGUgPSBSQVRFXzk7ICAgbnVtKys7ICAgYnJlYWs7Ci0JCQljYXNlIDI0OiBSYXRlID0gUkFURV8xMjsgIG51bSsrOyAgIGJyZWFrOwotCQkJY2FzZSAzNjogUmF0ZSA9IFJBVEVfMTg7ICBudW0rKzsgICBicmVhazsKLQkJCWNhc2UgNDg6IFJhdGUgPSBSQVRFXzI0OyAgbnVtKys7ICAgYnJlYWs7Ci0JCQljYXNlIDcyOiBSYXRlID0gUkFURV8zNjsgIG51bSsrOyAgIGJyZWFrOwotCQkJY2FzZSA5NjogUmF0ZSA9IFJBVEVfNDg7ICBudW0rKzsgICBicmVhazsKLQkJCWNhc2UgMTA4OiBSYXRlID0gUkFURV81NDsgbnVtKys7ICAgYnJlYWs7Ci0JCQkvL2RlZmF1bHQ6IFJhdGUgPSBSQVRFXzE7ICAgYnJlYWs7Ci0JCX0KLQkJaWYgKE1heERlc2lyZSA8IFJhdGUpICBNYXhEZXNpcmUgPSBSYXRlOwotCX0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJcEh0UGh5CQk9ICZwQWQtPlN0YUNmZy5IVFBoeU1vZGU7Ci0JCXBNYXhIdFBoeQk9ICZwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGU7Ci0JCXBNaW5IdFBoeQk9ICZwQWQtPlN0YUNmZy5NaW5IVFBoeU1vZGU7Ci0KLQkJYXV0b19yYXRlX2N1cl9wID0gJnBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoOwotCQlIdE1jcwkJPSBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUzsKLQotCQlpZiAoKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKSAmJgotCQkJKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikgJiYKLQkJKE1heERlc2lyZSA+IFJBVEVfMTEpKQotCQl7Ci0JCQlNYXhEZXNpcmUgPSBSQVRFXzExOwotCQl9Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JcEFkLT5Db21tb25DZmcuTWF4RGVzaXJlZFJhdGUgPSBNYXhEZXNpcmU7Ci0JcE1pbkh0UGh5LT53b3JkID0gMDsKLQlwTWF4SHRQaHktPndvcmQgPSAwOwotCXBIdFBoeS0+d29yZCA9IDA7Ci0KLQkvLyBBdXRvIHJhdGUgc3dpdGNoaW5nIGlzIGVuYWJsZWQgb25seSBpZiBtb3JlIHRoYW4gb25lIERFU0lSRUQgUkFURVMgYXJlCi0JLy8gc3BlY2lmaWVkOyBvdGhlcndpc2UgZGlzYWJsZWQKLQlpZiAobnVtIDw9IDEpCi0JewotCQkvL09QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpOwotCQkvL3BBZC0+Q29tbW9uQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoCT0gRkFMU0U7Ci0JCSphdXRvX3JhdGVfY3VyX3AgPSBGQUxTRTsKLQl9Ci0JZWxzZQotCXsKLQkJLy9PUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCk7Ci0JCS8vcEFkLT5Db21tb25DZmcuYkF1dG9UeFJhdGVTd2l0Y2gJPSBUUlVFOwotCQkqYXV0b19yYXRlX2N1cl9wID0gVFJVRTsKLQl9Ci0KLQlpZiAoSHRNY3MgIT0gTUNTX0FVVE8pCi0JewotCQkvL09QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpOwotCQkvL3BBZC0+Q29tbW9uQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoCT0gRkFMU0U7Ci0JCSphdXRvX3JhdGVfY3VyX3AgPSBGQUxTRTsKLQl9Ci0JZWxzZQotCXsKLQkJLy9PUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCk7Ci0JCS8vcEFkLT5Db21tb25DZmcuYkF1dG9UeFJhdGVTd2l0Y2gJPSBUUlVFOwotCQkqYXV0b19yYXRlX2N1cl9wID0gVFJVRTsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlpZiAoKEFESE9DX09OKHBBZCkgfHwgSU5GUkFfT04ocEFkKSkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQotCXsKLQkJcFN1cFJhdGUgPSAmcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZVswXTsKLQkJcEV4dFJhdGUgPSAmcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZVswXTsKLQkJU3VwUmF0ZUxlbiA9IHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW47Ci0JCUV4dFJhdGVMZW4gPSBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuOwotCX0KLQllbHNlCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JewotCQlwU3VwUmF0ZSA9ICZwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzBdOwotCQlwRXh0UmF0ZSA9ICZwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzBdOwotCQlTdXBSYXRlTGVuID0gcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbjsKLQkJRXh0UmF0ZUxlbiA9IHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW47Ci0JfQotCi0JLy8gZmluZCBtYXggc3VwcG9ydGVkIHJhdGUKLQlmb3IgKGk9MDsgaTxTdXBSYXRlTGVuOyBpKyspCi0JewotCQlzd2l0Y2ggKHBTdXBSYXRlW2ldICYgMHg3ZikKLQkJewotCQkJY2FzZSAyOiAgIFJhdGUgPSBSQVRFXzE7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDE7CSBicmVhazsKLQkJCWNhc2UgNDogICBSYXRlID0gUkFURV8yOwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDAyOwkgYnJlYWs7Ci0JCQljYXNlIDExOiAgUmF0ZSA9IFJBVEVfNV81OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDA0OwkgYnJlYWs7Ci0JCQljYXNlIDIyOiAgUmF0ZSA9IFJBVEVfMTE7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDg7CSBicmVhazsKLQkJCWNhc2UgMTI6ICBSYXRlID0gUkFURV82OwkvKmlmIChwU3VwUmF0ZVtpXSAmIDB4ODApKi8gIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMTA7ICBicmVhazsKLQkJCWNhc2UgMTg6ICBSYXRlID0gUkFURV85OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDIwOwkgYnJlYWs7Ci0JCQljYXNlIDI0OiAgUmF0ZSA9IFJBVEVfMTI7CS8qaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDA0MDsgIGJyZWFrOwotCQkJY2FzZSAzNjogIFJhdGUgPSBSQVRFXzE4OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDgwOwkgYnJlYWs7Ci0JCQljYXNlIDQ4OiAgUmF0ZSA9IFJBVEVfMjQ7CS8qaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDEwMDsgIGJyZWFrOwotCQkJY2FzZSA3MjogIFJhdGUgPSBSQVRFXzM2OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMjAwOwkgYnJlYWs7Ci0JCQljYXNlIDk2OiAgUmF0ZSA9IFJBVEVfNDg7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDA0MDA7CSBicmVhazsKLQkJCWNhc2UgMTA4OiBSYXRlID0gUkFURV81NDsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDgwMDsJIGJyZWFrOwotCQkJZGVmYXVsdDogIFJhdGUgPSBSQVRFXzE7CWJyZWFrOwotCQl9Ci0JCWlmIChNYXhTdXBwb3J0IDwgUmF0ZSkJTWF4U3VwcG9ydCA9IFJhdGU7Ci0KLQkJaWYgKE1pblN1cHBvcnQgPiBSYXRlKSBNaW5TdXBwb3J0ID0gUmF0ZTsKLQl9Ci0KLQlmb3IgKGk9MDsgaTxFeHRSYXRlTGVuOyBpKyspCi0JewotCQlzd2l0Y2ggKHBFeHRSYXRlW2ldICYgMHg3ZikKLQkJewotCQkJY2FzZSAyOiAgIFJhdGUgPSBSQVRFXzE7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDE7CSBicmVhazsKLQkJCWNhc2UgNDogICBSYXRlID0gUkFURV8yOwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDAyOwkgYnJlYWs7Ci0JCQljYXNlIDExOiAgUmF0ZSA9IFJBVEVfNV81OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDA0OwkgYnJlYWs7Ci0JCQljYXNlIDIyOiAgUmF0ZSA9IFJBVEVfMTE7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDg7CSBicmVhazsKLQkJCWNhc2UgMTI6ICBSYXRlID0gUkFURV82OwkvKmlmIChwRXh0UmF0ZVtpXSAmIDB4ODApKi8gIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMTA7ICBicmVhazsKLQkJCWNhc2UgMTg6ICBSYXRlID0gUkFURV85OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDIwOwkgYnJlYWs7Ci0JCQljYXNlIDI0OiAgUmF0ZSA9IFJBVEVfMTI7CS8qaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDA0MDsgIGJyZWFrOwotCQkJY2FzZSAzNjogIFJhdGUgPSBSQVRFXzE4OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDgwOwkgYnJlYWs7Ci0JCQljYXNlIDQ4OiAgUmF0ZSA9IFJBVEVfMjQ7CS8qaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDEwMDsgIGJyZWFrOwotCQkJY2FzZSA3MjogIFJhdGUgPSBSQVRFXzM2OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMjAwOwkgYnJlYWs7Ci0JCQljYXNlIDk2OiAgUmF0ZSA9IFJBVEVfNDg7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDA0MDA7CSBicmVhazsKLQkJCWNhc2UgMTA4OiBSYXRlID0gUkFURV81NDsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDgwMDsJIGJyZWFrOwotCQkJZGVmYXVsdDogIFJhdGUgPSBSQVRFXzE7CWJyZWFrOwotCQl9Ci0JCWlmIChNYXhTdXBwb3J0IDwgUmF0ZSkJTWF4U3VwcG9ydCA9IFJhdGU7Ci0KLQkJaWYgKE1pblN1cHBvcnQgPiBSYXRlKSBNaW5TdXBwb3J0ID0gUmF0ZTsKLQl9Ci0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBMRUdBQ1lfQkFTSUNfUkFURSwgQmFzaWNSYXRlQml0bWFwKTsKLQotCS8vIGJ1ZyBmaXgKLQkvLyBwQWQtPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXAgPSBCYXNpY1JhdGVCaXRtYXA7Ci0KLQkvLyBjYWxjdWxhdGUgdGhlIGV4cHRlY3RlZCBBQ0sgcmF0ZSBmb3IgZWFjaCBUWCByYXRlLiBUaGlzIGluZm8gaXMgdXNlZCB0byBjYWN1bGF0ZQotCS8vIHRoZSBEVVJBVElPTiBmaWVsZCBvZiBvdXRnb2luZyB1bmlpY2FzdCBEQVRBL01HTVQgZnJhbWUKLQlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaSsrKQotCXsKLQkJaWYgKEJhc2ljUmF0ZUJpdG1hcCAmICgweDAxIDw8IGkpKQotCQkJQ3VyckJhc2ljUmF0ZSA9IChVQ0hBUilpOwotCQlwQWQtPkNvbW1vbkNmZy5FeHBlY3RlZEFDS1JhdGVbaV0gPSBDdXJyQmFzaWNSYXRlOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiTWxtZVVwZGF0ZVR4UmF0ZXNbTWF4U3VwcG9ydCA9ICVkXSA9IE1heERlc2lyZSAlZCBNYnBzXG4iLCBSYXRlSWRUb01icHNbTWF4U3VwcG9ydF0sIFJhdGVJZFRvTWJwc1tNYXhEZXNpcmVdKSk7Ci0JLy8gbWF4IHR4IHJhdGUgPSBtaW4ge21heCBkZXNpcmUgcmF0ZSwgbWF4IHN1cHBvcnRlZCByYXRlfQotCWlmIChNYXhTdXBwb3J0IDwgTWF4RGVzaXJlKQotCQlwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPSBNYXhTdXBwb3J0OwotCWVsc2UKLQkJcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlID0gTWF4RGVzaXJlOwotCi0JcEFkLT5Db21tb25DZmcuTWluVHhSYXRlID0gTWluU3VwcG9ydDsKLQkvLyAyMDAzLTA3LTMxIGpvaG4gLSAyNTAwIGRvZXNuJ3QgaGF2ZSBnb29kIHNlbnNpdGl2aXR5IGF0IGhpZ2ggT0ZETSByYXRlcy4gdG8gaW5jcmVhc2UgdGhlIHN1Y2Nlc3MKLQkvLyByYXRpbyBvZiBpbml0aWFsIERIQ1AgcGFja2V0IGV4Y2hhbmdlLCBUWCByYXRlIHN0YXJ0cyBmcm9tIGEgbG93ZXIgcmF0ZSBkZXBlbmRpbmcKLQkvLyBvbiBhdmVyYWdlIFJTU0kKLQkvLwkgMS4gUlNTSSA+PSAtNzBkYiwgc3RhcnQgYXQgNTQgTWJwcyAoc2hvcnQgZGlzdGFuY2UpCi0JLy8JIDIuIC03MCA+IFJTU0kgPj0gLTc1LCBzdGFydCBhdCAyNCBNYnBzIChtaWQgZGlzdGFuY2UpCi0JLy8JIDMuIC03NSA+IFJTU0ksIHN0YXJ0IGF0IDExIE1icHMgKGxvbmcgZGlzdGFuY2UpCi0JLy9pZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKS8qICYmCi0JLy8JT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKi8pCi0JaWYgKCphdXRvX3JhdGVfY3VyX3ApCi0JewotCQlzaG9ydCBkYm0gPSAwOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJZGJtID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCWlmIChiTGlua1VwID09IFRSVUUpCi0JCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBSQVRFXzI0OwotCQllbHNlCi0JCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGU7Ci0KLQkJaWYgKGRibSA8IC03NSkKLQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA9IFJBVEVfMTE7Ci0JCWVsc2UgaWYgKGRibSA8IC03MCkKLQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA9IFJBVEVfMjQ7Ci0KLQkJLy8gc2hvdWxkIG5ldmVyIGV4Y2VlZCBNYXhUeFJhdGUgKGNvbnNpZGVyIDExQi1vbmx5IG1vZGUpCi0JCWlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPiBwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUpCi0JCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGU7Ci0KLQkJcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPSAwOwotCX0KLQllbHNlCi0JewotCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGU7Ci0JCXBIdFBoeS0+ZmllbGQuTUNTCT0gKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA+IDMpID8gKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSAtIDQpIDogcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlOwotCQlwSHRQaHktPmZpZWxkLk1PREUJPSAocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlID4gMykgPyBNT0RFX09GRE0gOiBNT0RFX0NDSzsKLQotCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5TVEJDCT0gcEh0UGh5LT5maWVsZC5TVEJDOwotCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJCT0gcEh0UGh5LT5maWVsZC5TaG9ydEdJOwotCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MJCT0gcEh0UGh5LT5maWVsZC5NQ1M7Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwSHRQaHktPmZpZWxkLk1PREU7Ci0JfQotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA8PSBSQVRFXzExKQotCXsKLQkJcE1heEh0UGh5LT5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCXBNYXhIdFBoeS0+ZmllbGQuTUNTID0gcEFkLT5Db21tb25DZmcuVHhSYXRlOwotCQlwTWluSHRQaHktPmZpZWxkLk1DUyA9IHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZTsKLQl9Ci0JZWxzZQotCXsKLQkJcE1heEh0UGh5LT5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQlwTWF4SHRQaHktPmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZV07Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPj0gUkFURV82ICYmIChwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPD0gUkFURV81NCkpCi0JCQl7cE1pbkh0UGh5LT5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGVdO30KLQkJZWxzZQotCQkJe3BNaW5IdFBoeS0+ZmllbGQuTUNTID0gcEFkLT5Db21tb25DZmcuTWluVHhSYXRlO30KLQl9Ci0KLQlwSHRQaHktPndvcmQgPSAocE1heEh0UGh5LT53b3JkKTsKLQlpZiAoYkxpbmtVcCAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCi0JewotCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZCA9IHBIdFBoeS0+d29yZDsKLQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWF4SFRQaHlNb2RlLndvcmQgPSBwTWF4SHRQaHktPndvcmQ7Ci0JCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1pbkhUUGh5TW9kZS53b3JkID0gcE1pbkh0UGh5LT53b3JkOwotCX0KLQllbHNlCi0JewotCQlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpCi0JCXsKLQkJCWNhc2UgUEhZXzExQkdfTUlYRUQ6Ci0JCQljYXNlIFBIWV8xMUI6Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQljYXNlIFBIWV8xMUJHTl9NSVhFRDoKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfMTsKLQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfQ0NLOwotCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBSQVRFXzE7Ci0KLS8vI2lmZGVmCVdJRklfVEVTVAotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzExOwotLy8jZWxzZQotLy8JCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfMTsKLS8vI2VuZGlmCi0JCQkJYnJlYWs7Ci0JCQljYXNlIFBIWV8xMUc6Ci0JCQljYXNlIFBIWV8xMUE6Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKLQkJCWNhc2UgUEhZXzExR05fTUlYRUQ6Ci0JCQljYXNlIFBIWV8xMU5fMl80RzoKLQkJCWNhc2UgUEhZXzExQU5fTUlYRUQ6Ci0JCQljYXNlIFBIWV8xMU5fNUc6Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzY7Ci0JCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfNjsKLQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQljYXNlIFBIWV8xMUFCR05fTUlYRUQ6Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpCi0JCQkJewotCQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfMTsKLQkJCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfMTsKLQkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKLQkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IFJBVEVfMTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzY7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzY7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6IC8vIGVycm9yCi0JCQkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzY7Ci0JCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKLQkJCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV8xOwotCQkJCWJyZWFrOwotCQl9Ci0JCS8vCi0JCS8vIEtlZXAgQmFzaWMgTWxtZSBSYXRlLgotCQkvLwotCQlwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZS53b3JkID0gcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LndvcmQ7Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9PSBNT0RFX09GRE0pCi0JCQlwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1tSQVRFXzI0XTsKLQkJZWxzZQotCQkJcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0gUkFURV8xOwotCQlwQWQtPkNvbW1vbkNmZy5CYXNpY01sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1sbWVVcGRhdGVUeFJhdGVzIChNYXhEZXNpcmU9JWQsIE1heFN1cHBvcnQ9JWQsIE1heFR4UmF0ZT0lZCwgTWluUmF0ZT0lZCwgUmF0ZSBTd2l0Y2hpbmcgPSVkKVxuIiwKLQkJCSBSYXRlSWRUb01icHNbTWF4RGVzaXJlXSwgUmF0ZUlkVG9NYnBzW01heFN1cHBvcnRdLCBSYXRlSWRUb01icHNbcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlXSwgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZV0sCi0JCQkgLypPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpKi8qYXV0b19yYXRlX2N1cl9wKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1sbWVVcGRhdGVUeFJhdGVzIChUeFJhdGU9JWQsIFJ0c1JhdGU9JWQsIEJhc2ljUmF0ZUJpdG1hcD0weCUwNGx4KVxuIiwKLQkJCSBSYXRlSWRUb01icHNbcEFkLT5Db21tb25DZmcuVHhSYXRlXSwgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGVdLCBCYXNpY1JhdGVCaXRtYXApKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lVXBkYXRlVHhSYXRlcyAoTWxtZVRyYW5zbWl0PTB4JXgsIE1pbkhUUGh5TW9kZT0leCwgTWF4SFRQaHlNb2RlPTB4JXgsIEhUUGh5TW9kZT0weCV4KVxuIiwKLQkJCSBwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQud29yZCwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NaW5IVFBoeU1vZGUud29yZCAscEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NYXhIVFBoeU1vZGUud29yZCAscEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZCApKTsKLX0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlUaGlzIGZ1bmN0aW9uIHVwZGF0ZSBIVCBSYXRlIHNldHRpbmcuCi0JCUlucHV0IFdjaWQgdmFsdWUgaXMgdmFsaWQgZm9yIDIgY2FzZSA6Ci0JCTEuIGl0J3MgdXNlZCBmb3IgU3RhdGlvbiBpbiBpbmZyYSBtb2RlIHRoYXQgY29weSBBUCByYXRlIHRvIE1hY3RhYmxlLgotCQkyLiBPUiBTdGF0aW9uCWluIGFkaG9jIG1vZGUgdG8gY29weSBwZWVyJ3MgSFQgcmF0ZSB0byBNYWN0YWJsZS4KLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNbG1lVXBkYXRlSHRUeFJhdGVzKAotCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglVQ0hBUgkJCQlhcGlkeCkKLXsKLQlVQ0hBUglTdGJjTWNzOyAvL2osIFN0YmNNY3MsIGJpdG1hc2s7Ci0JQ0hBUglpOyAvLyAzKjMKLQlSVF9IVF9DQVBBQklMSVRZCSpwUnRIdENhcCA9IE5VTEw7Ci0JUlRfSFRfUEhZX0lORk8JCSpwQWN0aXZlSHRQaHkgPSBOVUxMOwotCVVMT05HCQlCYXNpY01DUzsKLQlVQ0hBUiBqLCBiaXRtYXNrOwotCVBSVF9IVF9QSFlfSU5GTwkJCXBEZXNpcmVIdFBoeSA9IE5VTEw7Ci0JUEhUVFJBTlNNSVRfU0VUVElORwkJcEh0UGh5ID0gTlVMTDsKLQlQSFRUUkFOU01JVF9TRVRUSU5HCQlwTWF4SHRQaHkgPSBOVUxMOwotCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBNaW5IdFBoeSA9IE5VTEw7Ci0JQk9PTEVBTgkJCQkJKmF1dG9fcmF0ZV9jdXJfcDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiTWxtZVVwZGF0ZUh0VHhSYXRlcz09PT4gXG4iKSk7Ci0KLQlhdXRvX3JhdGVfY3VyX3AgPSBOVUxMOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCXBEZXNpcmVIdFBoeQk9ICZwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvOwotCQlwQWN0aXZlSHRQaHkJPSAmcEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mbzsKLQkJcEh0UGh5CQk9ICZwQWQtPlN0YUNmZy5IVFBoeU1vZGU7Ci0JCXBNYXhIdFBoeQk9ICZwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGU7Ci0JCXBNaW5IdFBoeQk9ICZwQWQtPlN0YUNmZy5NaW5IVFBoeU1vZGU7Ci0KLQkJYXV0b19yYXRlX2N1cl9wID0gJnBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCWlmICgoQURIT0NfT04ocEFkKSB8fCBJTkZSQV9PTihwQWQpKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCi0JewotCQlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpCi0JCQlyZXR1cm47Ci0KLQkJcFJ0SHRDYXAgPSAmcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHk7Ci0JCXBBY3RpdmVIdFBoeSA9ICZwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvOwotCQlTdGJjTWNzID0gKFVDSEFSKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMy5TdGJjTWNzOwotCQlCYXNpY01DUyA9cEFkLT5NbG1lQXV4LkFkZEh0SW5mby5NQ1NTZXRbMF0rKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uTUNTU2V0WzFdPDw4KSsoU3RiY01jczw8MTYpOwotCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpICYmIChwUnRIdENhcC0+UnhTVEJDKSAmJiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkKLQkJCXBNYXhIdFBoeS0+ZmllbGQuU1RCQyA9IFNUQkNfVVNFOwotCQllbHNlCi0JCQlwTWF4SHRQaHktPmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7Ci0JfQotCWVsc2UKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQl7Ci0JCWlmIChwRGVzaXJlSHRQaHktPmJIdEVuYWJsZSA9PSBGQUxTRSkKLQkJCXJldHVybjsKLQotCQlwUnRIdENhcCA9ICZwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHk7Ci0JCVN0YmNNY3MgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzMuU3RiY01jczsKLQkJQmFzaWNNQ1MgPSBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uTUNTU2V0WzBdKyhwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uTUNTU2V0WzFdPDw4KSsoU3RiY01jczw8MTYpOwotCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpICYmIChwUnRIdENhcC0+UnhTVEJDKSAmJiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkKLQkJCXBNYXhIdFBoeS0+ZmllbGQuU1RCQyA9IFNUQkNfVVNFOwotCQllbHNlCi0JCQlwTWF4SHRQaHktPmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7Ci0JfQotCi0JLy8gRGVjaWRlIE1BWCBodCByYXRlLgotCWlmICgocFJ0SHRDYXAtPkdGKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkdGKSkKLQkJcE1heEh0UGh5LT5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7Ci0JZWxzZQotCQlwTWF4SHRQaHktPmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOwotCi0gICAgaWYgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoKSAmJiAocFJ0SHRDYXAtPkNoYW5uZWxXaWR0aCkpCi0JCXBNYXhIdFBoeS0+ZmllbGQuQlcgPSBCV180MDsKLQllbHNlCi0JCXBNYXhIdFBoeS0+ZmllbGQuQlcgPSBCV18yMDsKLQotICAgIGlmIChwTWF4SHRQaHktPmZpZWxkLkJXID09IEJXXzIwKQotCQlwTWF4SHRQaHktPmZpZWxkLlNob3J0R0kgPSAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCAmIHBSdEh0Q2FwLT5TaG9ydEdJZm9yMjApOwotCWVsc2UKLQkJcE1heEh0UGh5LT5maWVsZC5TaG9ydEdJID0gKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDAgJiBwUnRIdENhcC0+U2hvcnRHSWZvcjQwKTsKLQotCWlmIChwRGVzaXJlSHRQaHktPk1DU1NldFs0XSAhPSAwKQotCXsKLQkJcE1heEh0UGh5LT5maWVsZC5NQ1MgPSAzMjsKLQl9Ci0KLQlmb3IgKGk9MjM7IGk+PTA7IGktLSkgLy8gMyozCi0JewotCQlqID0gaS84OwotCQliaXRtYXNrID0gKDE8PChpLShqKjgpKSk7Ci0KLQkJaWYgKChwQWN0aXZlSHRQaHktPk1DU1NldFtqXSAmIGJpdG1hc2spICYmIChwRGVzaXJlSHRQaHktPk1DU1NldFtqXSAmIGJpdG1hc2spKQotCQl7Ci0JCQlwTWF4SHRQaHktPmZpZWxkLk1DUyA9IGk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChpPT0wKQotCQkJYnJlYWs7Ci0JfQotCi0JLy8gQ29weSBNSU4gaHQgcmF0ZS4gIHJ0Mjg2MD8/PwotCXBNaW5IdFBoeS0+ZmllbGQuQlcgPSBCV18yMDsKLQlwTWluSHRQaHktPmZpZWxkLk1DUyA9IDA7Ci0JcE1pbkh0UGh5LT5maWVsZC5TVEJDID0gMDsKLQlwTWluSHRQaHktPmZpZWxkLlNob3J0R0kgPSAwOwotCS8vSWYgU1RBIGFzc2lnbnMgZml4ZWQgcmF0ZS4gdXBkYXRlIHRvIGZpeGVkIGhlcmUuCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JaWYgKCAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0WzBdICE9IDB4ZmYpKQotCXsKLQkJaWYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0WzRdICE9IDApCi0JCXsKLQkJCXBNYXhIdFBoeS0+ZmllbGQuTUNTID0gMzI7Ci0JCQlwTWluSHRQaHktPmZpZWxkLk1DUyA9IDMyOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJNbG1lVXBkYXRlSHRUeFJhdGVzPD09PSBVc2UgRml4ZWQgTUNTID0gJWRcbiIscE1pbkh0UGh5LT5maWVsZC5NQ1MpKTsKLQkJfQotCi0JCWZvciAoaT0yMzsgKENIQVIpaSA+PSAwOyBpLS0pIC8vIDMqMwotCQl7Ci0JCQlqID0gaS84OwotCQkJYml0bWFzayA9ICgxPDwoaS0oaio4KSkpOwotCQkJaWYgKCAocERlc2lyZUh0UGh5LT5NQ1NTZXRbal0gJiBiaXRtYXNrKSAmJiAocEFjdGl2ZUh0UGh5LT5NQ1NTZXRbal0gJiBiaXRtYXNrKSkKLQkJCXsKLQkJCQlwTWF4SHRQaHktPmZpZWxkLk1DUyA9IGk7Ci0JCQkJcE1pbkh0UGh5LT5maWVsZC5NQ1MgPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGk9PTApCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCS8vIERlY2lkZSBodCByYXRlCi0JcEh0UGh5LT5maWVsZC5TVEJDID0gcE1heEh0UGh5LT5maWVsZC5TVEJDOwotCXBIdFBoeS0+ZmllbGQuQlcgPSBwTWF4SHRQaHktPmZpZWxkLkJXOwotCXBIdFBoeS0+ZmllbGQuTU9ERSA9IHBNYXhIdFBoeS0+ZmllbGQuTU9ERTsKLQlwSHRQaHktPmZpZWxkLk1DUyA9IHBNYXhIdFBoeS0+ZmllbGQuTUNTOwotCXBIdFBoeS0+ZmllbGQuU2hvcnRHSSA9IHBNYXhIdFBoeS0+ZmllbGQuU2hvcnRHSTsKLQotCS8vIHVzZSBkZWZhdWx0IG5vdy4gcnQyODYwCi0JaWYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0WzBdICE9IDB4ZmYpCi0JCSphdXRvX3JhdGVfY3VyX3AgPSBGQUxTRTsKLQllbHNlCi0JCSphdXRvX3JhdGVfY3VyX3AgPSBUUlVFOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1sbWVVcGRhdGVIdFR4UmF0ZXM8LS0tLkFNc2R1U2l6ZSA9ICVkICBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUgKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJUWDogTUNTWzBdID0gJXggKGNob29zZSAlZCksIEJXID0gJWQsIFNob3J0R0kgPSAlZCwgTU9ERSA9ICVkLCAgXG4iLCBwQWN0aXZlSHRQaHktPk1DU1NldFswXSxwSHRQaHktPmZpZWxkLk1DUywKLQkJcEh0UGh5LT5maWVsZC5CVywgcEh0UGh5LT5maWVsZC5TaG9ydEdJLCBwSHRQaHktPmZpZWxkLk1PREUpKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1sbWVVcGRhdGVIdFR4UmF0ZXM8PT09IFxuIikpOwotfQotCi0KLVZPSUQgQkFUYWJsZUluaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gQkFfVEFCTEUgKlRhYikKLXsKLQlpbnQgaTsKLQotCVRhYi0+bnVtQXNPcmlnaW5hdG9yID0gMDsKLQlUYWItPm51bUFzUmVjaXBpZW50ID0gMDsKLQlUYWItPm51bURvbmVPcmlnaW5hdG9yID0gMDsKLQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRTsgaSsrKQotCXsKLQkJVGFiLT5CQVJlY0VudHJ5W2ldLlJFQ19CQV9TdGF0dXMgPSBSZWNpcGllbnRfTk9ORTsKLQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJihUYWItPkJBUmVjRW50cnlbaV0uUnhSZVJpbmdMb2NrKSk7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX0JBX09SSV9UQUJMRTsgaSsrKQotCXsKLQkJVGFiLT5CQU9yaUVudHJ5W2ldLk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX05PTkU7Ci0JfQotfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVZPSUQgTWxtZVJhZGlvT2ZmKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVJUTVBfTUxNRV9SQURJT19PRkYocEFkKTsKLX0KLQotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIE1sbWVSYWRpb09uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVJUTVBfTUxNRV9SQURJT19PTihwQWQpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBic3NfdGFibGUuYwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLS8qISBcYnJpZWYgaW5pdGlhbGl6ZSBCU1MgdGFibGUKLSAqCVxwYXJhbSBwX3RhYiBwb2ludGVyIHRvIHRoZSB0YWJsZQotICoJXHJldHVybiBub25lCi0gKglccHJlCi0gKglccG9zdAotCi0gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLSBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICovCi1WT0lEIEJzc1RhYmxlSW5pdCgKLQlJTiBCU1NfVEFCTEUgKlRhYikKLXsKLQlpbnQgaTsKLQotCVRhYi0+QnNzTnIgPSAwOwotICAgIFRhYi0+QnNzT3ZlcmxhcE5yID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9CU1NfVEFCTEU7IGkrKykKLQl7Ci0JCU5kaXNaZXJvTWVtb3J5KCZUYWItPkJzc0VudHJ5W2ldLCBzaXplb2YoQlNTX0VOVFJZKSk7Ci0JCVRhYi0+QnNzRW50cnlbaV0uUnNzaSA9IC0xMjc7CS8vIGluaXRpYWwgdGhlIHJzc2kgYXMgYSBtaW5pbXVtIHZhbHVlCi0JfQotfQotCi0KLS8qISBcYnJpZWYgc2VhcmNoIHRoZSBCU1MgdGFibGUgYnkgU1NJRAotICoJXHBhcmFtIHBfdGFiIHBvaW50ZXIgdG8gdGhlIGJzcyB0YWJsZQotICoJXHBhcmFtIHNzaWQgU1NJRCBzdHJpbmcKLSAqCVxyZXR1cm4gaW5kZXggb2YgdGhlIHRhYmxlLCBCU1NfTk9UX0ZPVU5EIGlmIG5vdCBpbiB0aGUgdGFibGUKLSAqCVxwcmUKLSAqCVxwb3N0Ci0gKglcbm90ZSBzZWFyY2ggYnkgc2VxdWVudGlhbCBzZWFyY2gKLQotIElSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gKi8KLVVMT05HIEJzc1RhYmxlU2VhcmNoKAotCUlOIEJTU19UQUJMRSAqVGFiLAotCUlOIFBVQ0hBUgkgcEJzc2lkLAotCUlOIFVDSEFSCSBDaGFubmVsKQotewotCVVDSEFSIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgVGFiLT5Cc3NOcjsgaSsrKQotCXsKLQkJLy8KLQkJLy8gU29tZSBBUCB0aGF0IHN1cHBvcnQgQS9CL0cgbW9kZSB0aGF0IG1heSB1c2VkIHRoZSBzYW1lIEJTU0lEIG9uIDExQSBhbmQgMTFCL0cuCi0JCS8vIFdlIHNob3VsZCBkaXN0aW5ndWlzaCB0aGlzIGNhc2UuCi0JCS8vCi0JCWlmICgoKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPD0gMTQpICYmIChDaGFubmVsIDw9IDE0KSkgfHwKLQkJCSAoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA+IDE0KSAmJiAoQ2hhbm5lbCA+IDE0KSkpICYmCi0JCQlNQUNfQUREUl9FUVVBTChUYWItPkJzc0VudHJ5W2ldLkJzc2lkLCBwQnNzaWQpKQotCQl7Ci0JCQlyZXR1cm4gaTsKLQkJfQotCX0KLQlyZXR1cm4gKFVMT05HKUJTU19OT1RfRk9VTkQ7Ci19Ci0KLVVMT05HIEJzc1NzaWRUYWJsZVNlYXJjaCgKLQlJTiBCU1NfVEFCTEUgKlRhYiwKLQlJTiBQVUNIQVIJIHBCc3NpZCwKLQlJTiBQVUNIQVIJIHBTc2lkLAotCUlOIFVDSEFSCSBTc2lkTGVuLAotCUlOIFVDSEFSCSBDaGFubmVsKQotewotCVVDSEFSIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgVGFiLT5Cc3NOcjsgaSsrKQotCXsKLQkJLy8KLQkJLy8gU29tZSBBUCB0aGF0IHN1cHBvcnQgQS9CL0cgbW9kZSB0aGF0IG1heSB1c2VkIHRoZSBzYW1lIEJTU0lEIG9uIDExQSBhbmQgMTFCL0cuCi0JCS8vIFdlIHNob3VsZCBkaXN0aW5ndWlzaCB0aGlzIGNhc2UuCi0JCS8vCi0JCWlmICgoKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPD0gMTQpICYmIChDaGFubmVsIDw9IDE0KSkgfHwKLQkJCSAoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA+IDE0KSAmJiAoQ2hhbm5lbCA+IDE0KSkpICYmCi0JCQlNQUNfQUREUl9FUVVBTChUYWItPkJzc0VudHJ5W2ldLkJzc2lkLCBwQnNzaWQpICYmCi0JCQlTU0lEX0VRVUFMKHBTc2lkLCBTc2lkTGVuLCBUYWItPkJzc0VudHJ5W2ldLlNzaWQsIFRhYi0+QnNzRW50cnlbaV0uU3NpZExlbikpCi0JCXsKLQkJCXJldHVybiBpOwotCQl9Ci0JfQotCXJldHVybiAoVUxPTkcpQlNTX05PVF9GT1VORDsKLX0KLQotVUxPTkcgQnNzVGFibGVTZWFyY2hXaXRoU1NJRCgKLQlJTiBCU1NfVEFCTEUgKlRhYiwKLQlJTiBQVUNIQVIJIEJzc2lkLAotCUlOIFBVQ0hBUgkgcFNzaWQsCi0JSU4gVUNIQVIJIFNzaWRMZW4sCi0JSU4gVUNIQVIJIENoYW5uZWwpCi17Ci0JVUNIQVIgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBUYWItPkJzc05yOyBpKyspCi0JewotCQlpZiAoKCgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsIDw9IDE0KSAmJiAoQ2hhbm5lbCA8PSAxNCkpIHx8Ci0JCQkoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA+IDE0KSAmJiAoQ2hhbm5lbCA+IDE0KSkpICYmCi0JCQlNQUNfQUREUl9FUVVBTCgmKFRhYi0+QnNzRW50cnlbaV0uQnNzaWQpLCBCc3NpZCkgJiYKLQkJCShTU0lEX0VRVUFMKHBTc2lkLCBTc2lkTGVuLCBUYWItPkJzc0VudHJ5W2ldLlNzaWQsIFRhYi0+QnNzRW50cnlbaV0uU3NpZExlbikgfHwKLQkJCShOZGlzRXF1YWxNZW1vcnkocFNzaWQsIFplcm9Tc2lkLCBTc2lkTGVuKSkgfHwKLQkJCShOZGlzRXF1YWxNZW1vcnkoVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkLCBaZXJvU3NpZCwgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkTGVuKSkpKQotCQl7Ci0JCQlyZXR1cm4gaTsKLQkJfQotCX0KLQlyZXR1cm4gKFVMT05HKUJTU19OT1RfRk9VTkQ7Ci19Ci0KLQotVUxPTkcgQnNzU3NpZFRhYmxlU2VhcmNoQnlTU0lEKAotCUlOIEJTU19UQUJMRSAqVGFiLAotCUlOIFBVQ0hBUgkgcFNzaWQsCi0JSU4gVUNIQVIJIFNzaWRMZW4pCi17Ci0JVUNIQVIgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBUYWItPkJzc05yOyBpKyspCi0JewotCQlpZiAoU1NJRF9FUVVBTChwU3NpZCwgU3NpZExlbiwgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkLCBUYWItPkJzc0VudHJ5W2ldLlNzaWRMZW4pKQotCQl7Ci0JCQlyZXR1cm4gaTsKLQkJfQotCX0KLQlyZXR1cm4gKFVMT05HKUJTU19OT1RfRk9VTkQ7Ci19Ci0KLQotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIEJzc1RhYmxlRGVsZXRlRW50cnkoCi0JSU4gT1VUCUJTU19UQUJMRSAqVGFiLAotCUlOCQlQVUNIQVIJICBwQnNzaWQsCi0JSU4JCVVDSEFSCSAgQ2hhbm5lbCkKLXsKLQlVQ0hBUiBpLCBqOwotCi0JZm9yIChpID0gMDsgaSA8IFRhYi0+QnNzTnI7IGkrKykKLQl7Ci0JCWlmICgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsID09IENoYW5uZWwpICYmCi0JCQkoTUFDX0FERFJfRVFVQUwoVGFiLT5Cc3NFbnRyeVtpXS5Cc3NpZCwgcEJzc2lkKSkpCi0JCXsKLQkJCWZvciAoaiA9IGk7IGogPCBUYWItPkJzc05yIC0gMTsgaisrKQotCQkJewotCQkJCU5kaXNNb3ZlTWVtb3J5KCYoVGFiLT5Cc3NFbnRyeVtqXSksICYoVGFiLT5Cc3NFbnRyeVtqICsgMV0pLCBzaXplb2YoQlNTX0VOVFJZKSk7Ci0JCQl9Ci0JCQlOZGlzWmVyb01lbW9yeSgmKFRhYi0+QnNzRW50cnlbVGFiLT5Cc3NOciAtIDFdKSwgc2l6ZW9mKEJTU19FTlRSWSkpOwotCQkJVGFiLT5Cc3NOciAtPSAxOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotfQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCURlbGV0ZSB0aGUgT3JpZ2luYXRvciBFbnRyeSBpbiBCQXRhYmxlLiBPciBkZWNyZWFzZSBudW1BcyBPcmlnaW5hdG9yIGJ5IDEgaWYgbmVlZGVkLgotCi0JQXJndW1lbnRzOgotCS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQkFUYWJsZURlbGV0ZU9SSUVudHJ5KAotCUlOIE9VVAlQUlRNUF9BREFQVEVSIHBBZCwKLQlJTgkJQkFfT1JJX0VOVFJZCSpwQkFPUklFbnRyeSkKLXsKLQotCWlmIChwQkFPUklFbnRyeS0+T1JJX0JBX1N0YXR1cyAhPSBPcmlnaW5hdG9yX05PTkUpCi0JewotCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7Ci0JCWlmIChwQkFPUklFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX0RvbmUpCi0JCXsKLQkJCXBBZC0+QkFUYWJsZS5udW1Bc09yaWdpbmF0b3IgLT0gMTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJBVGFibGVEZWxldGVPUklFbnRyeSBudW1Bc09yaWdpbmF0b3I9ICVsZFxuIiwgcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50KSk7Ci0JCQkvLyBFcmFzZSBCaXRtYXAgZmxhZy4KLQkJfQotCQlwQWQtPk1hY1RhYi5Db250ZW50W3BCQU9SSUVudHJ5LT5XY2lkXS5UWEJBYml0bWFwICY9ICh+KDE8PChwQkFPUklFbnRyeS0+VElEKSApKTsJLy8gSWYgU1RBIG1vZGUsICBlcmFzZSBmbGFnIGhlcmUKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtwQkFPUklFbnRyeS0+V2NpZF0uQkFPcmlXY2lkQXJyYXlbcEJBT1JJRW50cnktPlRJRF0gPSAwOwkvLyBJZiBTVEEgbW9kZSwgIGVyYXNlIGZsYWcgaGVyZQotCQlwQkFPUklFbnRyeS0+T1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfTk9ORTsKLQkJcEJBT1JJRW50cnktPlRva2VuID0gMTsKLQkJLy8gTm90IGNsZWFyIFNlcXVlbmNlIGhlcmUuCi0JCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKLQl9Ci19Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLS8qISBcYnJpZWYKLSAqCVxwYXJhbQotICoJXHJldHVybgotICoJXHByZQotICoJXHBvc3QKLQotIElSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gKi8KLVZPSUQgQnNzRW50cnlTZXQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUIEJTU19FTlRSWSAqcEJzcywKLQlJTiBQVUNIQVIgcEJzc2lkLAotCUlOIENIQVIgU3NpZFtdLAotCUlOIFVDSEFSIFNzaWRMZW4sCi0JSU4gVUNIQVIgQnNzVHlwZSwKLQlJTiBVU0hPUlQgQmVhY29uUGVyaW9kLAotCUlOIFBDRl9QQVJNIHBDZlBhcm0sCi0JSU4gVVNIT1JUIEF0aW1XaW4sCi0JSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAotCUlOIFVDSEFSIFN1cFJhdGVbXSwKLQlJTiBVQ0hBUiBTdXBSYXRlTGVuLAotCUlOIFVDSEFSIEV4dFJhdGVbXSwKLQlJTiBVQ0hBUiBFeHRSYXRlTGVuLAotCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCi0JSU4gQUREX0hUX0lORk9fSUUgKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotCUlOIFVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLAotCUlOIFVDSEFSCQkJQWRkSHRJbmZvTGVuLAotCUlOIFVDSEFSCQkJTmV3RXh0Q2hhbk9mZnNldCwKLQlJTiBVQ0hBUiBDaGFubmVsLAotCUlOIENIQVIgUnNzaSwKLQlJTiBMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcCwKLQlJTiBVQ0hBUiBDa2lwRmxhZywKLQlJTiBQRURDQV9QQVJNIHBFZGNhUGFybSwKLQlJTiBQUU9TX0NBUEFCSUxJVFlfUEFSTSBwUW9zQ2FwYWJpbGl0eSwKLQlJTiBQUUJTU19MT0FEX1BBUk0gcFFic3NMb2FkLAotCUlOIFVTSE9SVCBMZW5ndGhWSUUsCi0JSU4gUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKQotewotCUNPUFlfTUFDX0FERFIocEJzcy0+QnNzaWQsIHBCc3NpZCk7Ci0JLy8gRGVmYXVsdCBIaWRkZW4gU1NJRCB0byBiZSBUUlVFLCBpdCB3aWxsIGJlIHR1cm5lZCB0byBGQUxTRSBhZnRlciBjb3BpbmcgU1NJRAotCXBCc3MtPkhpZGRlbiA9IDE7Ci0JaWYgKFNzaWRMZW4gPiAwKQotCXsKLQkJLy8gRm9yIGhpZGRlbiBTU0lEIEFQLCBpdCBtaWdodCBzZW5kIGJlYWNvbiB3aXRoIFNTSUQgbGVuIGVxdWFsIHRvIDAKLQkJLy8gT3Igc2VuZCBiZWFjb24gL3Byb2JlIHJlc3BvbnNlIHdpdGggU1NJRCBsZW4gbWF0Y2hpbmcgcmVhbCBTU0lEIGxlbmd0aCwKLQkJLy8gYnV0IFNTSUQgaXMgYWxsIHplcm8uIHN1Y2ggYXMgIjAwLTAwLTAwLTAwIiB3aXRoIGxlbmd0aCA0LgotCQkvLyBXZSBoYXZlIHRvIHByZXZlbnQgdGhpcyBjYXNlIG92ZXJ3cml0ZSBjb3JyZWN0IHRhYmxlCi0JCWlmIChOZGlzRXF1YWxNZW1vcnkoU3NpZCwgWmVyb1NzaWQsIFNzaWRMZW4pID09IDApCi0JCXsKLQkJICAgIE5kaXNaZXJvTWVtb3J5KHBCc3MtPlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7Ci0JCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKLQkJCXBCc3MtPlNzaWRMZW4gPSBTc2lkTGVuOwotCQkJcEJzcy0+SGlkZGVuID0gMDsKLQkJfQotCX0KLQllbHNlCi0JCXBCc3MtPlNzaWRMZW4gPSAwOwotCXBCc3MtPkJzc1R5cGUgPSBCc3NUeXBlOwotCXBCc3MtPkJlYWNvblBlcmlvZCA9IEJlYWNvblBlcmlvZDsKLQlpZiAoQnNzVHlwZSA9PSBCU1NfSU5GUkEpCi0JewotCQlpZiAocENmUGFybS0+YlZhbGlkKQotCQl7Ci0JCQlwQnNzLT5DZnBDb3VudCA9IHBDZlBhcm0tPkNmcENvdW50OwotCQkJcEJzcy0+Q2ZwUGVyaW9kID0gcENmUGFybS0+Q2ZwUGVyaW9kOwotCQkJcEJzcy0+Q2ZwTWF4RHVyYXRpb24gPSBwQ2ZQYXJtLT5DZnBNYXhEdXJhdGlvbjsKLQkJCXBCc3MtPkNmcER1clJlbWFpbmluZyA9IHBDZlBhcm0tPkNmcER1clJlbWFpbmluZzsKLQkJfQotCX0KLQllbHNlCi0JewotCQlwQnNzLT5BdGltV2luID0gQXRpbVdpbjsKLQl9Ci0KLQlwQnNzLT5DYXBhYmlsaXR5SW5mbyA9IENhcGFiaWxpdHlJbmZvOwotCS8vIFRoZSBwcml2YWN5IGJpdCBpbmRpY2F0ZSBzZWN1cml0eSBpcyBPTiwgaXQgbWFpZ2h0IGJlIFdFUCwgVEtJUCBvciBBRVMKLQkvLyBDb21iaW5lIHdpdGggQXV0aE1vZGUsIHRoZXkgd2lsbCBkZWNpZGUgdGhlIGNvbm5lY3Rpb24gbWV0aG9kcy4KLQlwQnNzLT5Qcml2YWN5ID0gQ0FQX0lTX1BSSVZBQ1lfT04ocEJzcy0+Q2FwYWJpbGl0eUluZm8pOwotCUFTU0VSVChTdXBSYXRlTGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKLQlpZiAoU3VwUmF0ZUxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKLQkJTmRpc01vdmVNZW1vcnkocEJzcy0+U3VwUmF0ZSwgU3VwUmF0ZSwgU3VwUmF0ZUxlbik7Ci0JZWxzZQotCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5TdXBSYXRlLCBTdXBSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7Ci0JcEJzcy0+U3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47Ci0JQVNTRVJUKEV4dFJhdGVMZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOwotCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPkV4dFJhdGUsIEV4dFJhdGUsIEV4dFJhdGVMZW4pOwotCXBCc3MtPk5ld0V4dENoYW5PZmZzZXQgPSBOZXdFeHRDaGFuT2Zmc2V0OwotCXBCc3MtPkV4dFJhdGVMZW4gPSBFeHRSYXRlTGVuOwotCXBCc3MtPkNoYW5uZWwgPSBDaGFubmVsOwotCXBCc3MtPkNlbnRyYWxDaGFubmVsID0gQ2hhbm5lbDsKLQlwQnNzLT5Sc3NpID0gUnNzaTsKLQkvLyBVcGRhdGUgQ2tpcEZsYWcuIGlmIG5vdCBleGlzdHMsIHRoZSB2YWx1ZSBpcyAweDAKLQlwQnNzLT5Da2lwRmxhZyA9IENraXBGbGFnOwotCi0JLy8gTmV3IGZvciBtaWNyb3NvZnQgRml4ZWQgSUVzCi0JTmRpc01vdmVNZW1vcnkocEJzcy0+Rml4SUVzLlRpbWVzdGFtcCwgJlRpbWVTdGFtcCwgOCk7Ci0JcEJzcy0+Rml4SUVzLkJlYWNvbkludGVydmFsID0gQmVhY29uUGVyaW9kOwotCXBCc3MtPkZpeElFcy5DYXBhYmlsaXRpZXMgPSBDYXBhYmlsaXR5SW5mbzsKLQotCS8vIE5ldyBmb3IgbWljcm9zb2Z0IFZhcmlhYmxlIElFcwotCWlmIChMZW5ndGhWSUUgIT0gMCkKLQl7Ci0JCXBCc3MtPlZhcklFTGVuID0gTGVuZ3RoVklFOwotCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5WYXJJRXMsIHBWSUUsIHBCc3MtPlZhcklFTGVuKTsKLQl9Ci0JZWxzZQotCXsKLQkJcEJzcy0+VmFySUVMZW4gPSAwOwotCX0KLQotCXBCc3MtPkFkZEh0SW5mb0xlbiA9IDA7Ci0JcEJzcy0+SHRDYXBhYmlsaXR5TGVuID0gMDsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlpZiAoSHRDYXBhYmlsaXR5TGVuPiAwKQotCXsKLQkJcEJzcy0+SHRDYXBhYmlsaXR5TGVuID0gSHRDYXBhYmlsaXR5TGVuOwotCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+SHRDYXBhYmlsaXR5LCBwSHRDYXBhYmlsaXR5LCBIdENhcGFiaWxpdHlMZW4pOwotCQlpZiAoQWRkSHRJbmZvTGVuID4gMCkKLQkJewotCQkJcEJzcy0+QWRkSHRJbmZvTGVuID0gQWRkSHRJbmZvTGVuOwotCQkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPkFkZEh0SW5mbywgcEFkZEh0SW5mbywgQWRkSHRJbmZvTGVuKTsKLQotCQkJCWlmICgocEFkZEh0SW5mby0+Q29udHJvbENoYW4gPiAyKSYmIChwQWRkSHRJbmZvLT5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQkVMT1cpICYmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKLQkJCQl7Ci0JCQkJCXBCc3MtPkNlbnRyYWxDaGFubmVsID0gcEFkZEh0SW5mby0+Q29udHJvbENoYW4gLSAyOwotCQkJCX0KLQkJCQllbHNlIGlmICgocEFkZEh0SW5mby0+QWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0FCT1ZFKSAmJiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCi0JCQkJewotCQkJCQkJcEJzcy0+Q2VudHJhbENoYW5uZWwgPSBwQWRkSHRJbmZvLT5Db250cm9sQ2hhbiArIDI7Ci0JCQkJfQotCQl9Ci0JfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JQnNzQ2lwaGVyUGFyc2UocEJzcyk7Ci0KLQkvLyBuZXcgZm9yIFFPUwotCWlmIChwRWRjYVBhcm0pCi0JCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5FZGNhUGFybSwgcEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7Ci0JZWxzZQotCQlwQnNzLT5FZGNhUGFybS5iVmFsaWQgPSBGQUxTRTsKLQlpZiAocFFvc0NhcGFiaWxpdHkpCi0JCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5Rb3NDYXBhYmlsaXR5LCBwUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTsKLQllbHNlCi0JCXBCc3MtPlFvc0NhcGFiaWxpdHkuYlZhbGlkID0gRkFMU0U7Ci0JaWYgKHBRYnNzTG9hZCkKLQkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPlFic3NMb2FkLCBwUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpOwotCWVsc2UKLQkJcEJzcy0+UWJzc0xvYWQuYlZhbGlkID0gRkFMU0U7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJUEVJRF9TVFJVQ1QgICAgIHBFaWQ7Ci0JCVVTSE9SVCAgICAgICAgICBMZW5ndGggPSAwOwotCi0KLQkJTmRpc1plcm9NZW1vcnkoJnBCc3MtPldwYUlFLklFWzBdLCBNQVhfQ1VTVE9NX0xFTik7Ci0JCU5kaXNaZXJvTWVtb3J5KCZwQnNzLT5Sc25JRS5JRVswXSwgTUFYX0NVU1RPTV9MRU4pOwotI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKLQkJTmRpc1plcm9NZW1vcnkoJnBCc3MtPkNvdW50cnlTdHJpbmdbMF0sIDMpOwotCQlwQnNzLT5iSGFzQ291bnRyeUlFID0gRkFMU0U7Ci0jZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLwotCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwVklFOwotCQl3aGlsZSAoKExlbmd0aCArIDIgKyAoVVNIT1JUKXBFaWQtPkxlbikgPD0gTGVuZ3RoVklFKQotCQl7Ci0JCQlzd2l0Y2gocEVpZC0+RWlkKQotCQkJewotCQkJCWNhc2UgSUVfV1BBOgotCQkJCQlpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXUEFfT1VJLCA0KSkKLQkJCQkJewotCQkJCQkJaWYgKChwRWlkLT5MZW4gKyAyKSA+IE1BWF9DVVNUT01fTEVOKQotCQkJCQkJewotCQkJCQkJCXBCc3MtPldwYUlFLklFTGVuID0gMDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCXBCc3MtPldwYUlFLklFTGVuID0gcEVpZC0+TGVuICsgMjsKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPldwYUlFLklFLCBwRWlkLCBwQnNzLT5XcGFJRS5JRUxlbik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBJRV9SU046Ci0gICAgICAgICAgICAgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkKLQkJCQkJewotCQkJCQkJaWYgKChwRWlkLT5MZW4gKyAyKSA+IE1BWF9DVVNUT01fTEVOKQotICAgICAgICAgICAgICAgICAgICAgICAgewotCQkJCQkJCXBCc3MtPlJzbklFLklFTGVuID0gMDsKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQkJcEJzcy0+UnNuSUUuSUVMZW4gPSBwRWlkLT5MZW4gKyAyOwotCQkJCQkJTmRpc01vdmVNZW1vcnkocEJzcy0+UnNuSUUuSUUsIHBFaWQsIHBCc3MtPlJzbklFLklFTGVuKTsKLQkJCX0KLQkJCQlicmVhazsKLSNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCi0JCQkJY2FzZSBJRV9DT1VOVFJZOgotCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+Q291bnRyeVN0cmluZ1swXSwgcEVpZC0+T2N0ZXQsIDMpOwotCQkJCQlwQnNzLT5iSGFzQ291bnRyeUlFID0gVFJVRTsKLQkJCQkJYnJlYWs7Ci0jZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLwotICAgICAgICAgICAgfQotCQkJTGVuZ3RoID0gTGVuZ3RoICsgMiArIChVU0hPUlQpcEVpZC0+TGVuOyAgLy8gRWlkWzFdICsgTGVuWzFdKyBjb250ZW50W0xlbl0KLQkJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopcEVpZCArIDIgKyBwRWlkLT5MZW4pOwotCQl9Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotfQotCi0vKiEKLSAqCVxicmllZiBpbnNlcnQgYW4gZW50cnkgaW50byB0aGUgYnNzIHRhYmxlCi0gKglccGFyYW0gcF90YWIgVGhlIEJTUyB0YWJsZQotICoJXHBhcmFtIEJzc2lkIEJTU0lECi0gKglccGFyYW0gc3NpZCBTU0lECi0gKglccGFyYW0gc3NpZF9sZW4gTGVuZ3RoIG9mIFNTSUQKLSAqCVxwYXJhbSBic3NfdHlwZQotICoJXHBhcmFtIGJlYWNvbl9wZXJpb2QKLSAqCVxwYXJhbSB0aW1lc3RhbXAKLSAqCVxwYXJhbSBwX2NmCi0gKglccGFyYW0gYXRpbV93aW4KLSAqCVxwYXJhbSBjYXAKLSAqCVxwYXJhbSByYXRlcwotICoJXHBhcmFtIHJhdGVzX2xlbgotICoJXHBhcmFtIGNoYW5uZWxfaWR4Ci0gKglccmV0dXJuIG5vbmUKLSAqCVxwcmUKLSAqCVxwb3N0Ci0gKglcbm90ZSBJZiBTU0lEIGlzIGlkZW50aWNhbCwgdGhlIG9sZCBlbnRyeSB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBuZXcgb25lCi0KLSBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICovCi1VTE9ORyBCc3NUYWJsZVNldEVudHJ5KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVCBCU1NfVEFCTEUgKlRhYiwKLQlJTiBQVUNIQVIgcEJzc2lkLAotCUlOIENIQVIgU3NpZFtdLAotCUlOIFVDSEFSIFNzaWRMZW4sCi0JSU4gVUNIQVIgQnNzVHlwZSwKLQlJTiBVU0hPUlQgQmVhY29uUGVyaW9kLAotCUlOIENGX1BBUk0gKkNmUGFybSwKLQlJTiBVU0hPUlQgQXRpbVdpbiwKLQlJTiBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCi0JSU4gVUNIQVIgU3VwUmF0ZVtdLAotCUlOIFVDSEFSIFN1cFJhdGVMZW4sCi0JSU4gVUNIQVIgRXh0UmF0ZVtdLAotCUlOIFVDSEFSIEV4dFJhdGVMZW4sCi0JSU4gSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKLQlJTiBBRERfSFRfSU5GT19JRSAqcEFkZEh0SW5mbywJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCi0JSU4gVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sCi0JSU4gVUNIQVIJCQlBZGRIdEluZm9MZW4sCi0JSU4gVUNIQVIJCQlOZXdFeHRDaGFuT2Zmc2V0LAotCUlOIFVDSEFSIENoYW5uZWxObywKLQlJTiBDSEFSIFJzc2ksCi0JSU4gTEFSR0VfSU5URUdFUiBUaW1lU3RhbXAsCi0JSU4gVUNIQVIgQ2tpcEZsYWcsCi0JSU4gUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCi0JSU4gUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCi0JSU4gUFFCU1NfTE9BRF9QQVJNIHBRYnNzTG9hZCwKLQlJTiBVU0hPUlQgTGVuZ3RoVklFLAotCUlOIFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSkKLXsKLQlVTE9ORwlJZHg7Ci0KLQlJZHggPSBCc3NUYWJsZVNlYXJjaFdpdGhTU0lEKFRhYiwgcEJzc2lkLCAgKFVDSEFSICopU3NpZCwgU3NpZExlbiwgQ2hhbm5lbE5vKTsKLQlpZiAoSWR4ID09IEJTU19OT1RfRk9VTkQpCi0JewotCQlpZiAoVGFiLT5Cc3NOciA+PSBNQVhfTEVOX09GX0JTU19UQUJMRSkKLQkgICAgewotCQkJLy8KLQkJCS8vIEl0IG1heSBoYXBwZW4gd2hlbiBCU1MgVGFibGUgd2FzIGZ1bGwuCi0JCQkvLyBUaGUgZGVzaXJlZCBBUCB3aWxsIG5vdCBiZSBhZGRlZCBpbnRvIEJTUyBUYWJsZQotCQkJLy8gSW4gdGhpcyBjYXNlLCBpZiB3ZSBmb3VuZCB0aGUgZGVzaXJlZCBBUCB0aGVuIG92ZXJ3cml0ZSBCU1MgVGFibGUuCi0JCQkvLwotCQkJaWYoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJCXsKLQkJCQlpZiAoTUFDX0FERFJfRVFVQUwocEFkLT5NbG1lQXV4LkJzc2lkLCBwQnNzaWQpIHx8Ci0JCQkJCVNTSURfRVFVQUwocEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCBTc2lkLCBTc2lkTGVuKSkKLQkJCQl7Ci0JCQkJCUlkeCA9IFRhYi0+QnNzT3ZlcmxhcE5yOwotCQkJCQlCc3NFbnRyeVNldChwQWQsICZUYWItPkJzc0VudHJ5W0lkeF0sIHBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLCBDZlBhcm0sIEF0aW1XaW4sCi0JCQkJCQlDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbixwSHRDYXBhYmlsaXR5LCBwQWRkSHRJbmZvLEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLAotCQkJCQkJTmV3RXh0Q2hhbk9mZnNldCwgQ2hhbm5lbE5vLCBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLCBwRWRjYVBhcm0sIHBRb3NDYXBhYmlsaXR5LCBwUWJzc0xvYWQsIExlbmd0aFZJRSwgcFZJRSk7Ci0gICAgICAgICAgICAgICAgICAgIFRhYi0+QnNzT3ZlcmxhcE5yID0gKFRhYi0+QnNzT3ZlcmxhcE5yKyspICUgTUFYX0xFTl9PRl9CU1NfVEFCTEU7Ci0JCQkJfQotCQkJCXJldHVybiBJZHg7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQlyZXR1cm4gQlNTX05PVF9GT1VORDsKLQkJCX0KLQkJfQotCQlJZHggPSBUYWItPkJzc05yOwotCQlCc3NFbnRyeVNldChwQWQsICZUYWItPkJzc0VudHJ5W0lkeF0sIHBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLCBDZlBhcm0sIEF0aW1XaW4sCi0JCQkJCUNhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLHBIdENhcGFiaWxpdHksIHBBZGRIdEluZm8sSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sCi0JCQkJCU5ld0V4dENoYW5PZmZzZXQsIENoYW5uZWxObywgUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywgcEVkY2FQYXJtLCBwUW9zQ2FwYWJpbGl0eSwgcFFic3NMb2FkLCBMZW5ndGhWSUUsIHBWSUUpOwotCQlUYWItPkJzc05yKys7Ci0JfQotCWVsc2UKLQl7Ci0JCS8qIGF2b2lkICBIaWRkZW4gU1NJRCBmb3JtIGJlYWNvbiB0byBvdmVyd2lyaXRlIGNvcnJlY3QgU1NJRCBmcm9tIHByb2JlIHJlc3BvbnNlICovCi0JCWlmICgoU1NJRF9FUVVBTChTc2lkLCBTc2lkTGVuLCBUYWItPkJzc0VudHJ5W0lkeF0uU3NpZCwgVGFiLT5Cc3NFbnRyeVtJZHhdLlNzaWRMZW4pKSB8fAotCQkJKE5kaXNFcXVhbE1lbW9yeShUYWItPkJzc0VudHJ5W0lkeF0uU3NpZCwgWmVyb1NzaWQsIFRhYi0+QnNzRW50cnlbSWR4XS5Tc2lkTGVuKSkpCi0JCXsKLQkJCUJzc0VudHJ5U2V0KHBBZCwgJlRhYi0+QnNzRW50cnlbSWR4XSwgcEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsQ2ZQYXJtLCBBdGltV2luLAotCQkJCQkJQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4scEh0Q2FwYWJpbGl0eSwgcEFkZEh0SW5mbyxIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwKLQkJCQkJCU5ld0V4dENoYW5PZmZzZXQsIENoYW5uZWxObywgUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywgcEVkY2FQYXJtLCBwUW9zQ2FwYWJpbGl0eSwgcFFic3NMb2FkLCBMZW5ndGhWSUUsIHBWSUUpOwotCQl9Ci0JfQotCi0JcmV0dXJuIElkeDsKLX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIERPVDExX05fU1VQUE9SVAotI2lmZGVmIERPVDExTl9EUkFGVDMKLVZPSUQgIFRyaUV2ZW50SW5pdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVQ0hBUgkJaTsKLQotCWZvciAoaSA9IDA7aSA8IE1BWF9UUklHR0VSX0VWRU5UO2krKykKLQkJcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5iVmFsaWQgPSBGQUxTRTsKLQotCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFObyA9IDA7Ci0JcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QkNvdW50RG93biA9IDA7Ci19Ci0KLVVMT05HIFRyaUV2ZW50VGFibGVTZXRFbnRyeSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQgVFJJR0dFUl9FVkVOVF9UQUIgKlRhYiwKLQlJTiBQVUNIQVIgcEJzc2lkLAotCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCi0JSU4gVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sCi0JSU4gVUNIQVIJCQlSZWdDbGFzcywKLQlJTiBVQ0hBUiBDaGFubmVsTm8pCi17Ci0JLy8gRXZlbnQgQQotCWlmIChIdENhcGFiaWxpdHlMZW4gPT0gMCkKLQl7Ci0JCWlmIChUYWItPkV2ZW50QU5vIDwgTUFYX1RSSUdHRVJfRVZFTlQpCi0JCXsKLQkJCVJUTVBNb3ZlTWVtb3J5KFRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLkJTU0lELCBwQnNzaWQsIDYpOwotCQkJVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uYlZhbGlkID0gVFJVRTsKLQkJCVRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLkNoYW5uZWwgPSBDaGFubmVsTm87Ci0JCQlUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5DRENvdW50ZXIgPSBwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheTsKLQkJCWlmIChSZWdDbGFzcyAhPSAwKQotCQkJewotCQkJCS8vIEJlYWNvbiBoYXMgUmVndWxhdG9yeSBjbGFzcyBJRS4gU28gdXNlIGJlYWNvbidzCi0JCQkJVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uUmVnQ2xhc3MgPSBSZWdDbGFzczsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyBVc2UgU3RhdGlvbidzIFJlZ3VsYXRvcnkgY2xhc3MgaW5zdGVhZC4KLQkJCQlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuYkh0RW5hYmxlID09IFRSVUUpCi0JCQkJewotCQkJCQlpZiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPiBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQotCQkJCQl7Ci0JCQkJCQlUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5SZWdDbGFzcyA9IDMyOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsIDwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQkJCQkJCVRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLlJlZ0NsYXNzID0gMzM7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uUmVnQ2xhc3MgPSA/PzsKLQotCQkJfQotCi0JCQlUYWItPkV2ZW50QU5vICsrOwotCQl9Ci0JfQotCWVsc2UgaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5JbnRvbGVyYW50NDApCi0JewotCQlUYWItPkV2ZW50QkNvdW50RG93biA9IHBBZC0+Q29tbW9uQ2ZnLkRvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5OwotCX0KLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVRyaWdnZXIgRXZlbnQgdGFibGUgTWFpbnRhaW5lbmNlIGNhbGxlZCBvbmNlIGV2ZXJ5IHNlY29uZC4KLQotCUFyZ3VtZW50czoKLQkvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFRyaUV2ZW50Q291bnRlck1haW50ZW5hbmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCVVDSEFSCQlpOwotCUJPT0xFQU4JCQliTm90aWZ5ID0gRkFMU0U7Ci0JZm9yIChpID0gMDtpIDwgTUFYX1RSSUdHRVJfRVZFTlQ7aSsrKQotCXsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uYlZhbGlkICYmIChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLkNEQ291bnRlciA+IDApKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLkNEQ291bnRlci0tOwotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uQ0RDb3VudGVyID09IDApCi0JCQl7Ci0JCQkJcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5iVmFsaWQgPSBGQUxTRTsKLQkJCQlwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBTm8gLS07Ci0JCQkJLy8gTmVlZCB0byBzZW5kIDIwLzQwIENvZXhpc3RlbmNlIE5vdGlmeSBmcmFtZSBpZiBoYXMgc3RhdHVzIGNoYW5nZS4KLQkJCQliTm90aWZ5ID0gVFJVRTsKLQkJCX0KLQkJfQotCX0KLQlpZiAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QkNvdW50RG93biA+IDApCi0JewotCQlwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRCQ291bnREb3duLS07Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRCQ291bnREb3duID09IDApCi0JCQliTm90aWZ5ID0gVFJVRTsKLQl9Ci0KLQlpZiAoYk5vdGlmeSA9PSBUUlVFKQotCQlVcGRhdGUyMDQwQ29leGlzdEZyYW1lQW5kTm90aWZ5KHBBZCwgQlNTSURfV0NJRCwgVFJVRSk7Ci19Ci0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVZPSUQgQnNzVGFibGVTc2lkU29ydCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQgQlNTX1RBQkxFICpPdXRUYWIsCi0JSU4JQ0hBUiBTc2lkW10sCi0JSU4JVUNIQVIgU3NpZExlbikKLXsKLQlJTlQgaTsKLQlCc3NUYWJsZUluaXQoT3V0VGFiKTsKLQotCWZvciAoaSA9IDA7IGkgPCBwQWQtPlNjYW5UYWIuQnNzTnI7IGkrKykKLQl7Ci0JCUJTU19FTlRSWSAqcEluQnNzID0gJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXTsKLQkJQk9PTEVBTgliSXNIaWRkZW5BcEluY2x1ZGVkID0gRkFMU0U7Ci0KLQkJaWYgKCgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYKLSAgICAgICAgICAgIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+IDE0KSAmJgotICAgICAgICAgICAgIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEluQnNzLT5DaGFubmVsKSkKLSNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vIFJvZ2VyIHN5bmMgQ2FycmllcgotICAgICAgICAgICAgIHx8IChwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9PSBUUlVFKQotI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KLSAgICAgICAgICAgICkKLXsKLQkJCWlmIChwSW5Cc3MtPkhpZGRlbikKLQkJCQliSXNIaWRkZW5BcEluY2x1ZGVkID0gVFJVRTsKLX0KLQotCQlpZiAoKHBJbkJzcy0+QnNzVHlwZSA9PSBwQWQtPlN0YUNmZy5Cc3NUeXBlKSAmJgotCQkJKFNTSURfRVFVQUwoU3NpZCwgU3NpZExlbiwgcEluQnNzLT5Tc2lkLCBwSW5Cc3MtPlNzaWRMZW4pIHx8IGJJc0hpZGRlbkFwSW5jbHVkZWQpKQotCQl7Ci0JCQlCU1NfRU5UUlkgKnBPdXRCc3MgPSAmT3V0VGFiLT5Cc3NFbnRyeVtPdXRUYWItPkJzc05yXTsKLQotCi0jaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAotCQkJLy8gSWYgbm8gQ291bnRyeSBJRSBleGlzdHMgbm8gQ29ubmVjdGlvbiB3aWxsIGJlIGVzdGFibGlzaGVkIHdoZW4gSUVFRTgwMjExZENsaWVudE1vZGUgaXMgc3RyaWN0LgotCQkJaWYgKChwQWQtPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9PSBSdDgwMl8xMV9EX1N0cmljdCkgJiYKLQkJCQkocEluQnNzLT5iSGFzQ291bnRyeUlFID09IEZBTFNFKSkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9PSBSdDgwMl8xMV9EX1N0cmljdCwgYnV0IHRoaXMgQVAgZG9lc24ndCBoYXZlIGNvdW50cnkgSUUuXG4iKSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0jZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkvLyAyLjRHLzVHIE4gb25seSBtb2RlCi0JCQlpZiAoKHBJbkJzcy0+SHRDYXBhYmlsaXR5TGVuID09IDApICYmCi0JCQkJKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fMl80RykgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl81RykpKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBIGlzIGluIE4tb25seSBNb2RlLCB0aGlzIEFQIGRvbid0IGhhdmUgSHQgY2FwYWJpbGl0eSBpbiBCZWFjb24uXG4iKSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkJCS8vIE5ldyBmb3IgV1BBMgotCQkJLy8gQ2hlY2sgdGhlIEF1dGhtb2RlIGZpcnN0Ci0JCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotCQkJewotCQkJCS8vIENoZWNrIEF1dGhNb2RlIGFuZCBBdXRoTW9kZUF1eCBmb3IgbWF0Y2hpbmcsIGluIGNhc2UgQVAgc3VwcG9ydCBkdWFsLW1vZGUKLQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IHBJbkJzcy0+QXV0aE1vZGUpICYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBwSW5Cc3MtPkF1dGhNb2RlQXV4KSkKLQkJCQkJLy8gTm9uZSBtYXRjaGVkCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJLy8gQ2hlY2sgY2lwaGVyIHN1aXRlLCBBUCBtdXN0IGhhdmUgbW9yZSBzZWN1cmVkIGNpcGhlciB0aGFuIHN0YXRpb24gc2V0dGluZwotCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKLQkJCQl7Ci0JCQkJCS8vIElmIGl0J3Mgbm90IG1peGVkIG1vZGUsIHdlIHNob3VsZCBvbmx5IGxldCBCU1MgcGFzcyB3aXRoIHRoZSBzYW1lIGVuY3J5cHRpb24KLQkJCQkJaWYgKHBJbkJzcy0+V1BBLmJNaXhNb2RlID09IEZBTFNFKQotCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikKLQkJCQkJCQljb250aW51ZTsKLQotCQkJCQkvLyBjaGVjayBncm91cCBjaXBoZXIKLQkJCQkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPCBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikgJiYKLQkJCQkJCShwSW5Cc3MtPldQQS5Hcm91cENpcGhlciAhPSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQpICYmCi0JCQkJCQkocEluQnNzLT5XUEEuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCkpCi0JCQkJCQljb250aW51ZTsKLQotCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCi0JCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KLQkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAotCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgotCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyKSAmJgotCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyQXV4KSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQllbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQotCQkJCXsKLQkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgotCQkJCQlpZiAocEluQnNzLT5XUEEyLmJNaXhNb2RlID09IEZBTFNFKQotCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCi0JCQkJCQkJY29udGludWU7Ci0KLQkJCQkJLy8gY2hlY2sgZ3JvdXAgY2lwaGVyCi0JCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDwgcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpICYmCi0JCQkJCQkocEluQnNzLT5XUEEyLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCkgJiYKLQkJCQkJCShwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCkpCi0JCQkJCQljb250aW51ZTsKLQotCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCi0JCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KLQkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAotCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgotCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuUGFpckNpcGhlcikgJiYKLQkJCQkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXgpKQotCQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJLy8gQnNzIFR5cGUgbWF0Y2hlZCwgU1NJRCBtYXRjaGVkLgotCQkJLy8gV2Ugd2lsbCBjaGVjayB3ZXBzdGF0dXMgZm9yIHF1YWxpZmljYXRpb24gQnNzCi0JCQllbHNlIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XZXBTdGF0dXMpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTdGFDZmcuV2VwU3RhdHVzPSVkLCB3aGlsZSBwSW5Cc3MtPldlcFN0YXR1cz0lZFxuIiwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCBwSW5Cc3MtPldlcFN0YXR1cykpOwotCQkJCS8vCi0JCQkJLy8gRm9yIHRoZSBTRVN2MiBjYXNlLCB3ZSB3aWxsIG5vdCBxdWFsaWZ5IFdlcFN0YXR1cy4KLQkJCQkvLwotCQkJCWlmICghcEluQnNzLT5iU0VTKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gU2luY2UgdGhlIEFQIGlzIHVzaW5nIGhpZGRlbiBTU0lELCBhbmQgd2UgYXJlIHRyeWluZyB0byBjb25uZWN0IHRvIEFOWQotCQkJLy8gSXQgZGVmaW5pdGVseSB3aWxsIGZhaWwuIFNvLCBza2lwIGl0LgotCQkJLy8gQ0NYIGFsc28gcmVxdWlyZSBub3QgZXZlbiB0cnkgdG8gY29ubmVjdCBpdCEhCi0JCQlpZiAoU3NpZExlbiA9PSAwKQotCQkJCWNvbnRpbnVlOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkvLyBJZiBib3RoIHN0YXRpb24gYW5kIEFQIHVzZSA0ME1Ieiwgc3RpbGwgbmVlZCB0byBjaGVjayBpZiB0aGUgNDBNSFogYmFuZCdzIGxlZ2FsaXR5IGluIG15IGNvdW50cnkgcmVnaW9uCi0JCQkvLyBJZiB0aGlzIDQwTUh6IHdpZGViYW5kIGlzIG5vdCBhbGxvd2VkIGluIG15IGNvdW50cnkgbGlzdCwgdXNlIGJhbmR3aWR0aCAyME1IWiBpbnN0ZWFkLAotCQkJaWYgKChwSW5Cc3MtPkNlbnRyYWxDaGFubmVsICE9IHBJbkJzcy0+Q2hhbm5lbCkgJiYKLQkJCQkocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKSkKLQkJCXsKLQkJCQlpZiAoUlRNUENoZWNrQ2hhbm5lbChwQWQsIHBJbkJzcy0+Q2VudHJhbENoYW5uZWwsIHBJbkJzcy0+Q2hhbm5lbCkgPT0gRkFMU0UpCi0JCQkJewotCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPSBCV18yMDsKLQkJCQkJU2V0Q29tbW9uSFQocEFkKTsKLQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID0gQldfNDA7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID09IEJBTkRfV0lEVEhfMjApCi0JCQkJCXsKLQkJCQkJCVNldENvbW1vbkhUKHBBZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkJCS8vIGNvcHkgbWF0Y2hpbmcgQlNTIGZyb20gSW5UYWIgdG8gT3V0VGFiCi0JCQlOZGlzTW92ZU1lbW9yeShwT3V0QnNzLCBwSW5Cc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKLQotCQkJT3V0VGFiLT5Cc3NOcisrOwotCQl9Ci0JCWVsc2UgaWYgKChwSW5Cc3MtPkJzc1R5cGUgPT0gcEFkLT5TdGFDZmcuQnNzVHlwZSkgJiYgKFNzaWRMZW4gPT0gMCkpCi0JCXsKLQkJCUJTU19FTlRSWSAqcE91dEJzcyA9ICZPdXRUYWItPkJzc0VudHJ5W091dFRhYi0+QnNzTnJdOwotCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCS8vIDIuNEcvNUcgTiBvbmx5IG1vZGUKLQkJCWlmICgocEluQnNzLT5IdENhcGFiaWxpdHlMZW4gPT0gMCkgJiYKLQkJCQkoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl8yXzRHKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzVHKSkpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEEgaXMgaW4gTi1vbmx5IE1vZGUsIHRoaXMgQVAgZG9uJ3QgaGF2ZSBIdCBjYXBhYmlsaXR5IGluIEJlYWNvbi5cbiIpKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCQkJLy8gTmV3IGZvciBXUEEyCi0JCQkvLyBDaGVjayB0aGUgQXV0aG1vZGUgZmlyc3QKLQkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0JCQl7Ci0JCQkJLy8gQ2hlY2sgQXV0aE1vZGUgYW5kIEF1dGhNb2RlQXV4IGZvciBtYXRjaGluZywgaW4gY2FzZSBBUCBzdXBwb3J0IGR1YWwtbW9kZQotCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gcEluQnNzLT5BdXRoTW9kZSkgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IHBJbkJzcy0+QXV0aE1vZGVBdXgpKQotCQkJCQkvLyBOb25lIG1hdGNoZWQKLQkJCQkJY29udGludWU7Ci0KLQkJCQkvLyBDaGVjayBjaXBoZXIgc3VpdGUsIEFQIG11c3QgaGF2ZSBtb3JlIHNlY3VyZWQgY2lwaGVyIHRoYW4gc3RhdGlvbiBzZXR0aW5nCi0JCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQotCQkJCXsKLQkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgotCQkJCQlpZiAocEluQnNzLT5XUEEuYk1peE1vZGUgPT0gRkFMU0UpCi0JCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBLkdyb3VwQ2lwaGVyKQotCQkJCQkJCWNvbnRpbnVlOwotCi0JCQkJCS8vIGNoZWNrIGdyb3VwIGNpcGhlcgotCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDwgcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpCi0JCQkJCQljb250aW51ZTsKLQotCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCi0JCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KLQkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAotCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgotCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyKSAmJgotCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyQXV4KSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQllbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQotCQkJCXsKLQkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgotCQkJCQlpZiAocEluQnNzLT5XUEEyLmJNaXhNb2RlID09IEZBTFNFKQotCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCi0JCQkJCQkJY29udGludWU7Ci0KLQkJCQkJLy8gY2hlY2sgZ3JvdXAgY2lwaGVyCi0JCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPCBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCi0JCQkJCQljb250aW51ZTsKLQotCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCi0JCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KLQkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAotCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgotCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuUGFpckNpcGhlcikgJiYKLQkJCQkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXgpKQotCQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJLy8gQnNzIFR5cGUgbWF0Y2hlZCwgU1NJRCBtYXRjaGVkLgotCQkJLy8gV2Ugd2lsbCBjaGVjayB3ZXBzdGF0dXMgZm9yIHF1YWxpZmljYXRpb24gQnNzCi0JCQllbHNlIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XZXBTdGF0dXMpCi0JCQkJCWNvbnRpbnVlOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkvLyBJZiBib3RoIHN0YXRpb24gYW5kIEFQIHVzZSA0ME1Ieiwgc3RpbGwgbmVlZCB0byBjaGVjayBpZiB0aGUgNDBNSFogYmFuZCdzIGxlZ2FsaXR5IGluIG15IGNvdW50cnkgcmVnaW9uCi0JCQkvLyBJZiB0aGlzIDQwTUh6IHdpZGViYW5kIGlzIG5vdCBhbGxvd2VkIGluIG15IGNvdW50cnkgbGlzdCwgdXNlIGJhbmR3aWR0aCAyME1IWiBpbnN0ZWFkLAotCQkJaWYgKChwSW5Cc3MtPkNlbnRyYWxDaGFubmVsICE9IHBJbkJzcy0+Q2hhbm5lbCkgJiYKLQkJCQkocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKSkKLQkJCXsKLQkJCQlpZiAoUlRNUENoZWNrQ2hhbm5lbChwQWQsIHBJbkJzcy0+Q2VudHJhbENoYW5uZWwsIHBJbkJzcy0+Q2hhbm5lbCkgPT0gRkFMU0UpCi0JCQkJewotCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPSBCV18yMDsKLQkJCQkJU2V0Q29tbW9uSFQocEFkKTsKLQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID0gQldfNDA7Ci0JCQkJfQotCQkJfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JCQkvLyBjb3B5IG1hdGNoaW5nIEJTUyBmcm9tIEluVGFiIHRvIE91dFRhYgotCQkJTmRpc01vdmVNZW1vcnkocE91dEJzcywgcEluQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7Ci0KLQkJCU91dFRhYi0+QnNzTnIrKzsKLQkJfQotCi0JCWlmIChPdXRUYWItPkJzc05yID49IE1BWF9MRU5fT0ZfQlNTX1RBQkxFKQotCQkJYnJlYWs7Ci0JfQotCi0JQnNzVGFibGVTb3J0QnlSc3NpKE91dFRhYik7Ci19Ci0KLQotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIEJzc1RhYmxlU29ydEJ5UnNzaSgKLQlJTiBPVVQgQlNTX1RBQkxFICpPdXRUYWIpCi17Ci0JSU5UCSAgaSwgajsKLQlCU1NfRU5UUlkgVG1wQnNzOwotCi0JZm9yIChpID0gMDsgaSA8IE91dFRhYi0+QnNzTnIgLSAxOyBpKyspCi0JewotCQlmb3IgKGogPSBpKzE7IGogPCBPdXRUYWItPkJzc05yOyBqKyspCi0JCXsKLQkJCWlmIChPdXRUYWItPkJzc0VudHJ5W2pdLlJzc2kgPiBPdXRUYWItPkJzc0VudHJ5W2ldLlJzc2kpCi0JCQl7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJlRtcEJzcywgJk91dFRhYi0+QnNzRW50cnlbal0sIHNpemVvZihCU1NfRU5UUlkpKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmT3V0VGFiLT5Cc3NFbnRyeVtqXSwgJk91dFRhYi0+QnNzRW50cnlbaV0sIHNpemVvZihCU1NfRU5UUlkpKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmT3V0VGFiLT5Cc3NFbnRyeVtpXSwgJlRtcEJzcywgc2l6ZW9mKEJTU19FTlRSWSkpOwotCQkJfQotCQl9Ci0JfQotfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLVZPSUQgQnNzQ2lwaGVyUGFyc2UoCi0JSU4gT1VUCVBCU1NfRU5UUlkJcEJzcykKLXsKLQlQRUlEX1NUUlVDVAkJIHBFaWQ7Ci0JUFVDSEFSCQkJCXBUbXA7Ci0JUFJTTl9JRV9IRUFERVJfU1RSVUNUCQkJcFJzbkhlYWRlcjsKLQlQQ0lQSEVSX1NVSVRFX1NUUlVDVAkJCXBDaXBoZXI7Ci0JUEFLTV9TVUlURV9TVFJVQ1QJCQkJcEFLTTsKLQlVU0hPUlQJCQkJCQkJQ291bnQ7Ci0JSU5UCQkJCQkJCQlMZW5ndGg7Ci0JTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJVG1wQ2lwaGVyOwotCi0JLy8KLQkvLyBXZXBTdGF0dXMgd2lsbCBiZSByZXNldCBsYXRlciwgaWYgQVAgYW5ub3VuY2UgVEtJUCBvciBBRVMgb24gdGhlIGJlYWNvbiBmcmFtZS4KLQkvLwotCWlmIChwQnNzLT5Qcml2YWN5KQotCXsKLQkJcEJzcy0+V2VwU3RhdHVzCQk9IE5kaXM4MDJfMTFXRVBFbmFibGVkOwotCX0KLQllbHNlCi0JewotCQlwQnNzLT5XZXBTdGF0dXMJCT0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCX0KLQkvLyBTZXQgZGVmYXVsdCB0byBkaXNhYmxlICYgb3BlbiBhdXRoZW50aWNhdGlvbiBiZWZvcmUgcGFyc2luZyB2YXJpYWJsZSBJRQotCXBCc3MtPkF1dGhNb2RlCQk9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47Ci0JcEJzcy0+QXV0aE1vZGVBdXgJPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOwotCi0JLy8gSW5pdCBXUEEgc2V0dGluZwotCXBCc3MtPldQQS5QYWlyQ2lwaGVyCT0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCXBCc3MtPldQQS5Hcm91cENpcGhlcgk9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQlwQnNzLT5XUEEuUnNuQ2FwYWJpbGl0eSA9IDA7Ci0JcEJzcy0+V1BBLmJNaXhNb2RlCQk9IEZBTFNFOwotCi0JLy8gSW5pdCBXUEEyIHNldHRpbmcKLQlwQnNzLT5XUEEyLlBhaXJDaXBoZXIJID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCXBCc3MtPldQQTIuUGFpckNpcGhlckF1eCA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyCSA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQlwQnNzLT5XUEEyLlJzbkNhcGFiaWxpdHkgPSAwOwotCXBCc3MtPldQQTIuYk1peE1vZGUJID0gRkFMU0U7Ci0KLQotCUxlbmd0aCA9IChJTlQpIHBCc3MtPlZhcklFTGVuOwotCi0Jd2hpbGUgKExlbmd0aCA+IDApCi0JewotCQkvLyBQYXJzZSBjaXBoZXIgc3VpdGUgYmFzZSBvbiBXUEExICYgV1BBMiwgdGhleSBzaG91bGQgYmUgcGFyc2VkIGRpZmZlcmVudGx5Ci0JCXBUbXAgPSAoKFBVQ0hBUikgcEJzcy0+VmFySUVzKSArIHBCc3MtPlZhcklFTGVuIC0gTGVuZ3RoOwotCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwVG1wOwotCQlzd2l0Y2ggKHBFaWQtPkVpZCkKLQkJewotCQkJY2FzZSBJRV9XUEE6Ci0JCQkJaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgU0VTX09VSSwgMykgJiYgKHBFaWQtPkxlbiA9PSA3KSkKLQkJCQl7Ci0JCQkJCXBCc3MtPmJTRVMgPSBUUlVFOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXUEFfT1VJLCA0KSAhPSAxKQotCQkJCXsKLQkJCQkJLy8gaWYgdW5zdXBwb3J0ZWQgdmVuZG9yIHNwZWNpZmljIElFCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvLyBTa2lwIE9VSSwgdmVyc2lvbiwgYW5kIG11bHRpY2FzdCBzdWl0ZQotCQkJCS8vIFRoaXMgcGFydCBzaG91bGQgYmUgaW1wcm92ZWQgaW4gdGhlIGZ1dHVyZSB3aGVuIEFQIHN1cHBvcnRlZCBtdWx0aXBsZSBjaXBoZXIgc3VpdGUuCi0JCQkJLy8gRm9yIG5vdywgaXQncyBPSyBzaW5jZSBhbG1vc3QgYWxsIEFQcyBoYXZlIGZpeGVkIGNpcGhlciBzdWl0ZSBzdXBwb3J0ZWQuCi0JCQkJLy8gcFRtcCA9IChQVUNIQVIpIHBFaWQtPk9jdGV0OwotCQkJCXBUbXAgICArPSAxMTsKLQotCQkJCS8vIENpcGhlciBTdWl0ZSBTZWxlY3RvcnMgZnJvbSBTcGVjIFA4MDIuMTFpL0QzLjIgUDI2LgotCQkJCS8vCVZhbHVlCSAgIE1lYW5pbmcKLQkJCQkvLwkwCQkJTm9uZQotCQkJCS8vCTEJCQlXRVAtNDAKLQkJCQkvLwkyCQkJVGtpcAotCQkJCS8vCTMJCQlXUkFQCi0JCQkJLy8JNAkJCUFFUwotCQkJCS8vCTUJCQlXRVAtMTA0Ci0JCQkJLy8gUGFyc2UgZ3JvdXAgY2lwaGVyCi0JCQkJc3dpdGNoICgqcFRtcCkKLQkJCQl7Ci0JCQkJCWNhc2UgMToKLQkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDU6Ci0JCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgMjoKLQkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSA0OgotCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8vIG51bWJlciBvZiB1bmljYXN0IHN1aXRlCi0JCQkJcFRtcCAgICs9IDE7Ci0KLQkJCQkvLyBza2lwIGFsbCB1bmljYXN0IGNpcGhlciBzdWl0ZXMKLQkJCQkvL0NvdW50ID0gKihQVVNIT1JUKSBwVG1wOwotCQkJCUNvdW50ID0gKHBUbXBbMV08PDgpICsgcFRtcFswXTsKLQkJCQlwVG1wICAgKz0gc2l6ZW9mKFVTSE9SVCk7Ci0KLQkJCQkvLyBQYXJzaW5nIGFsbCB1bmljYXN0IGNpcGhlciBzdWl0ZQotCQkJCXdoaWxlIChDb3VudCA+IDApCi0JCQkJewotCQkJCQkvLyBTa2lwIE9VSQotCQkJCQlwVG1wICs9IDM7Ci0JCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQkJCQkJc3dpdGNoICgqcFRtcCkKLQkJCQkJewotCQkJCQkJY2FzZSAxOgotCQkJCQkJY2FzZSA1OiAvLyBBbHRob3VnaCBXRVAgaXMgbm90IGFsbG93ZWQgaW4gV1BBIHJlbGF0ZWQgYXV0aCBtb2RlLCB3ZSBwYXJzZSBpdCBhbnl3YXkKLQkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAyOgotCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDQ6Ci0JCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKFRtcENpcGhlciA+IHBCc3MtPldQQS5QYWlyQ2lwaGVyKQotCQkJCQl7Ci0JCQkJCQkvLyBNb3ZlIHRoZSBsb3dlciBjaXBoZXIgc3VpdGUgdG8gUGFpckNpcGhlckF1eAotCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBwQnNzLT5XUEEuUGFpckNpcGhlcjsKLQkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyCT0gVG1wQ2lwaGVyOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBUbXBDaXBoZXI7Ci0JCQkJCX0KLQkJCQkJcFRtcCsrOwotCQkJCQlDb3VudC0tOwotCQkJCX0KLQotCQkJCS8vIDQuIGdldCBBS00gc3VpdGUgY291bnRzCi0JCQkJLy9Db3VudAk9ICooUFVTSE9SVCkgcFRtcDsKLQkJCQlDb3VudCA9IChwVG1wWzFdPDw4KSArIHBUbXBbMF07Ci0JCQkJcFRtcCAgICs9IHNpemVvZihVU0hPUlQpOwotCQkJCXBUbXAgICArPSAzOwotCi0JCQkJc3dpdGNoICgqcFRtcCkKLQkJCQl7Ci0JCQkJCWNhc2UgMToKLQkJCQkJCS8vIFNldCBBUCBzdXBwb3J0IFdQQS1lbnRlcnByaXNlIG1vZGUKLQkJCQkJCWlmIChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQotCQkJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBOwotCQkJCQkJZWxzZQotCQkJCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgMjoKLQkJCQkJCS8vIFNldCBBUCBzdXBwb3J0IFdQQS1QU0sgbW9kZQotCQkJCQkJaWYgKHBCc3MtPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCi0JCQkJCQkJcEJzcy0+QXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlwVG1wICAgKz0gMTsKLQotCQkJCS8vIEZpeGVkIGZvciBXUEEtTm9uZQotCQkJCWlmIChwQnNzLT5Cc3NUeXBlID09IEJTU19BREhPQykKLQkJCQl7Ci0JCQkJCXBCc3MtPkF1dGhNb2RlCSAgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOwotCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7Ci0JCQkJCXBCc3MtPldlcFN0YXR1cyAgID0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOwotCQkJCQkvLyBQYXRjaGVkIGJ1Z3MgZm9yIG9sZCBkcml2ZXIKLQkJCQkJaWYgKHBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKLQkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCXBCc3MtPldlcFN0YXR1cyAgID0gcEJzcy0+V1BBLlBhaXJDaXBoZXI7Ci0KLQkJCQkvLyBDaGVjayB0aGUgUGFpciAmIEdyb3VwLCBpZiBkaWZmZXJlbnQsIHR1cm4gb24gbWl4ZWQgbW9kZSBmbGFnCi0JCQkJaWYgKHBCc3MtPldQQS5Hcm91cENpcGhlciAhPSBwQnNzLT5XUEEuUGFpckNpcGhlcikKLQkJCQkJcEJzcy0+V1BBLmJNaXhNb2RlID0gVFJVRTsKLQotCQkJCWJyZWFrOwotCi0JCQljYXNlIElFX1JTTjoKLQkJCQlwUnNuSGVhZGVyID0gKFBSU05fSUVfSEVBREVSX1NUUlVDVCkgcFRtcDsKLQotCQkJCS8vIDAuIFZlcnNpb24gbXVzdCBiZSAxCi0JCQkJaWYgKGxlMmNwdTE2KHBSc25IZWFkZXItPlZlcnNpb24pICE9IDEpCi0JCQkJCWJyZWFrOwotCQkJCXBUbXAgICArPSBzaXplb2YoUlNOX0lFX0hFQURFUl9TVFJVQ1QpOwotCi0JCQkJLy8gMS4gQ2hlY2sgZ3JvdXAgY2lwaGVyCi0JCQkJcENpcGhlciA9IChQQ0lQSEVSX1NVSVRFX1NUUlVDVCkgcFRtcDsKLQkJCQlpZiAoIVJUTVBFcXVhbE1lbW9yeShwVG1wLCBSU05fT1VJLCAzKSkKLQkJCQkJYnJlYWs7Ci0KLQkJCQkvLyBQYXJzZSBncm91cCBjaXBoZXIKLQkJCQlzd2l0Y2ggKHBDaXBoZXItPlR5cGUpCi0JCQkJewotCQkJCQljYXNlIDE6Ci0JCQkJCQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgNToKLQkJCQkJCXBCc3MtPldQQTIuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgMjoKLQkJCQkJCXBCc3MtPldQQTIuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgNDoKLQkJCQkJCXBCc3MtPldQQTIuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLy8gc2V0IHRvIGNvcnJlY3Qgb2Zmc2V0IGZvciBuZXh0IHBhcnNpbmcKLQkJCQlwVG1wICAgKz0gc2l6ZW9mKENJUEhFUl9TVUlURV9TVFJVQ1QpOwotCi0JCQkJLy8gMi4gR2V0IHBhaXJ3aXNlIGNpcGhlciBjb3VudHMKLQkJCQkvL0NvdW50ID0gKihQVVNIT1JUKSBwVG1wOwotCQkJCUNvdW50ID0gKHBUbXBbMV08PDgpICsgcFRtcFswXTsKLQkJCQlwVG1wICAgKz0gc2l6ZW9mKFVTSE9SVCk7Ci0KLQkJCQkvLyAzLiBHZXQgcGFpcndpc2UgY2lwaGVyCi0JCQkJLy8gUGFyc2luZyBhbGwgdW5pY2FzdCBjaXBoZXIgc3VpdGUKLQkJCQl3aGlsZSAoQ291bnQgPiAwKQotCQkJCXsKLQkJCQkJLy8gU2tpcCBPVUkKLQkJCQkJcENpcGhlciA9IChQQ0lQSEVSX1NVSVRFX1NUUlVDVCkgcFRtcDsKLQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCQkJCQlzd2l0Y2ggKHBDaXBoZXItPlR5cGUpCi0JCQkJCXsKLQkJCQkJCWNhc2UgMToKLQkJCQkJCWNhc2UgNTogLy8gQWx0aG91Z2ggV0VQIGlzIG5vdCBhbGxvd2VkIGluIFdQQSByZWxhdGVkIGF1dGggbW9kZSwgd2UgcGFyc2UgaXQgYW55d2F5Ci0JCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgMjoKLQkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSA0OgotCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlkZWZhdWx0OgotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWlmIChUbXBDaXBoZXIgPiBwQnNzLT5XUEEyLlBhaXJDaXBoZXIpCi0JCQkJCXsKLQkJCQkJCS8vIE1vdmUgdGhlIGxvd2VyIGNpcGhlciBzdWl0ZSB0byBQYWlyQ2lwaGVyQXV4Ci0JCQkJCQlwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXggPSBwQnNzLT5XUEEyLlBhaXJDaXBoZXI7Ci0JCQkJCQlwQnNzLT5XUEEyLlBhaXJDaXBoZXIJID0gVG1wQ2lwaGVyOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJcEJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4ID0gVG1wQ2lwaGVyOwotCQkJCQl9Ci0JCQkJCXBUbXAgKz0gc2l6ZW9mKENJUEhFUl9TVUlURV9TVFJVQ1QpOwotCQkJCQlDb3VudC0tOwotCQkJCX0KLQotCQkJCS8vIDQuIGdldCBBS00gc3VpdGUgY291bnRzCi0JCQkJLy9Db3VudAk9ICooUFVTSE9SVCkgcFRtcDsKLQkJCQlDb3VudCA9IChwVG1wWzFdPDw4KSArIHBUbXBbMF07Ci0JCQkJcFRtcCAgICs9IHNpemVvZihVU0hPUlQpOwotCi0JCQkJLy8gNS4gR2V0IEFLTSBjaXBoZXJzCi0JCQkJLy8gUGFyc2luZyBhbGwgQUtNIGNpcGhlcnMKLQkJCQl3aGlsZSAoQ291bnQgPiAwKQotCQkJCXsKLQkJCQkJcEFLTSA9IChQQUtNX1NVSVRFX1NUUlVDVCkgcFRtcDsKLQkJCQkJaWYgKCFSVE1QRXF1YWxNZW1vcnkocFRtcCwgUlNOX09VSSwgMykpCi0JCQkJCQlicmVhazsKLQotCQkJCQlzd2l0Y2ggKHBBS00tPlR5cGUpCi0JCQkJCXsKLQkJCQkJCWNhc2UgMToKLQkJCQkJCQkvLyBTZXQgQVAgc3VwcG9ydCBXUEEtZW50ZXJwcmlzZSBtb2RlCi0JCQkJCQkJaWYgKHBCc3MtPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCi0JCQkJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgMjoKLQkJCQkJCQkvLyBTZXQgQVAgc3VwcG9ydCBXUEEtUFNLIG1vZGUKLQkJCQkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKLQkJCQkJCQkJcEJzcy0+QXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKLQkJCQkJCQkJcEJzcy0+QXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVNYXg7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZU1heDsKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlwVG1wICAgKz0gKENvdW50ICogc2l6ZW9mKEFLTV9TVUlURV9TVFJVQ1QpKTsKLQkJCQkJQ291bnQtLTsKLQkJCQl9Ci0KLQkJCQkvLyBGaXhlZCBmb3IgV1BBLU5vbmUKLQkJCQlpZiAocEJzcy0+QnNzVHlwZSA9PSBCU1NfQURIT0MpCi0JCQkJewotCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7Ci0JCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKLQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXg7Ci0JCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlcgk9IHBCc3MtPldQQTIuR3JvdXBDaXBoZXI7Ci0JCQkJCXBCc3MtPldlcFN0YXR1cwkJCT0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOwotCQkJCQkvLyBQYXRjaGVkIGJ1Z3MgZm9yIG9sZCBkcml2ZXIKLQkJCQkJaWYgKHBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKLQkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOwotCQkJCX0KLQkJCQlwQnNzLT5XZXBTdGF0dXMgICA9IHBCc3MtPldQQTIuUGFpckNpcGhlcjsKLQotCQkJCS8vIDYuIEdldCBSU04gY2FwYWJpbGl0eQotCQkJCS8vcEJzcy0+V1BBMi5Sc25DYXBhYmlsaXR5ID0gKihQVVNIT1JUKSBwVG1wOwotCQkJCXBCc3MtPldQQTIuUnNuQ2FwYWJpbGl0eSA9IChwVG1wWzFdPDw4KSArIHBUbXBbMF07Ci0JCQkJcFRtcCArPSBzaXplb2YoVVNIT1JUKTsKLQotCQkJCS8vIENoZWNrIHRoZSBQYWlyICYgR3JvdXAsIGlmIGRpZmZlcmVudCwgdHVybiBvbiBtaXhlZCBtb2RlIGZsYWcKLQkJCQlpZiAocEJzcy0+V1BBMi5Hcm91cENpcGhlciAhPSBwQnNzLT5XUEEyLlBhaXJDaXBoZXIpCi0JCQkJCXBCc3MtPldQQTIuYk1peE1vZGUgPSBUUlVFOwotCi0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQl9Ci0JCUxlbmd0aCAtPSAocEVpZC0+TGVuICsgMik7Ci0JfQotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBtYWNfdGFibGUuYwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vKiEgXGJyaWVmIGdlbmVyYXRlcyBhIHJhbmRvbSBtYWMgYWRkcmVzcyB2YWx1ZSBmb3IgSUJTUyBCU1NJRAotICoJXHBhcmFtIEFkZHIgdGhlIGJzc2lkIGxvY2F0aW9uCi0gKglccmV0dXJuIG5vbmUKLSAqCVxwcmUKLSAqCVxwb3N0Ci0gKi8KLVZPSUQgTWFjQWRkclJhbmRvbUJzc2lkKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEFkZHIpCi17Ci0JSU5UIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFDX0FERFJfTEVOOyBpKyspCi0JewotCQlwQWRkcltpXSA9IFJhbmRvbUJ5dGUocEFkKTsKLQl9Ci0KLQlwQWRkclswXSA9IChwQWRkclswXSAmIDB4ZmUpIHwgMHgwMjsgIC8vIHRoZSBmaXJzdCAyIGJpdHMgbXVzdCBiZSAwMXh4eHh4eHh4Ci19Ci0KLS8qISBcYnJpZWYgaW5pdCB0aGUgbWFuYWdlbWVudCBtYWMgZnJhbWUgaGVhZGVyCi0gKglccGFyYW0gcF9oZHIgbWFjIGhlYWRlcgotICoJXHBhcmFtIHN1YnR5cGUgc3VidHlwZSBvZiB0aGUgZnJhbWUKLSAqCVxwYXJhbSBwX2RzIGRlc3RpbmF0aW9uIGFkZHJlc3MsIGRvbid0IGNhcmUgaWYgaXQgaXMgYSBicm9hZGNhc3QgYWRkcmVzcwotICoJXHJldHVybiBub25lCi0gKglccHJlIHRoZSBzdGF0aW9uIGhhcyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGluIHRoZSBwQWQtPlN0YUNmZwotICoJIC0gYnNzaWQKLSAqCSAtIHN0YXRpb24gYWRkcmVzcwotICoJXHBvc3QKLSAqCVxub3RlIHRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGZvbGxvd2luZyBmaWVsZAotCi0gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLSBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICovCi1WT0lEIE1ndE1hY0hlYWRlckluaXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gT1VUIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKLQlJTiBVQ0hBUiBTdWJUeXBlLAotCUlOIFVDSEFSIFRvRHMsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBQVUNIQVIgcEJzc2lkKQotewotCU5kaXNaZXJvTWVtb3J5KHBIZHI4MDIxMSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLQotCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX01HTVQ7Ci0JcEhkcjgwMjExLT5GQy5TdWJUeXBlID0gU3ViVHlwZTsKLS8vCWlmIChTdWJUeXBlID09IFNVQlRZUEVfQUNLKQkvLyBzYW1wbGUsIG5vIHVzZSwgaXQgd2lsbCBjb25mbGljdCB3aXRoIEFDVElPTiBmcmFtZSBzdWIgdHlwZQotLy8JCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX0NOVEw7Ci0JcEhkcjgwMjExLT5GQy5Ub0RzID0gVG9EczsKLQlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjEsIHBEQSk7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIHBCc3NpZCk7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIG1lbV9tZ210LmMKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUaGlzIHJvdXRpbmUgYnVpbGQgYW4gb3V0Z29pbmcgZnJhbWUsIGFuZCBmaWxsIGFsbCBpbmZvcm1hdGlvbiBzcGVjaWZpZWQKLSAqIGluIGFyZ3VtZW50IGxpc3QgdG8gdGhlIGZyYW1lIGJvZHkuIFRoZSBhY3R1YWwgZnJhbWUgc2l6ZSBpcyB0aGUgc3VtbWF0aW9uCi0gKiBvZiBhbGwgYXJndW1lbnRzLgotICogaW5wdXQgcGFyYW1zOgotICoJCUJ1ZmZlciAtIHBvaW50ZXIgdG8gYSBwcmUtYWxsb2NhdGVkIG1lbW9yeSBzZWdtZW50Ci0gKgkJYXJncyAtIGEgbGlzdCBvZiA8aW50IGFyZ19zaXplLCBhcmc+IHBhaXJzLgotICoJCU5PVEUgTk9URSBOT1RFISEhISB0aGUgbGFzdCBhcmd1bWVudCBtdXN0IGJlIE5VTEwsIG90aGVyd2lzZSB0aGlzCi0gKgkJCQkJCSAgIGZ1bmN0aW9uIHdpbGwgRkFJTCEhIQotICogcmV0dXJuOgotICoJCVNpemUgb2YgdGhlIGJ1ZmZlcgotICogdXNhZ2U6Ci0gKgkJTWFrZU91dGdvaW5nRnJhbWUoQnVmZmVyLCBvdXRwdXRfbGVuZ3RoLCAyLCAmZmMsIDIsICZkdXIsIDYsIHBfYWRkcjEsIDYscF9hZGRyMiwgRU5EX09GX0FSR1MpOwotCi0gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLSBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1VTE9ORyBNYWtlT3V0Z29pbmdGcmFtZSgKLQlPVVQgVUNIQVIgKkJ1ZmZlciwKLQlPVVQgVUxPTkcgKkZyYW1lTGVuLCAuLi4pCi17Ci0JVUNIQVIgICAqcDsKLQlpbnQJbGVuZzsKLQlVTE9ORwlUb3RMZW5nOwotCXZhX2xpc3QgQXJnczsKLQotCS8vIGNhbGN1bGF0ZXMgdGhlIHRvdGFsIGxlbmd0aAotCVRvdExlbmcgPSAwOwotCXZhX3N0YXJ0KEFyZ3MsIEZyYW1lTGVuKTsKLQlkbwotCXsKLQkJbGVuZyA9IHZhX2FyZyhBcmdzLCBpbnQpOwotCQlpZiAobGVuZyA9PSBFTkRfT0ZfQVJHUykKLQkJewotCQkJYnJlYWs7Ci0JCX0KLQkJcCA9IHZhX2FyZyhBcmdzLCBQVk9JRCk7Ci0JCU5kaXNNb3ZlTWVtb3J5KCZCdWZmZXJbVG90TGVuZ10sIHAsIGxlbmcpOwotCQlUb3RMZW5nID0gVG90TGVuZyArIGxlbmc7Ci0JfSB3aGlsZShUUlVFKTsKLQotCXZhX2VuZChBcmdzKTsgLyogY2xlYW4gdXAgKi8KLQkqRnJhbWVMZW4gPSBUb3RMZW5nOwotCXJldHVybiBUb3RMZW5nOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBtbG1lX3F1ZXVlLmMKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLyohIFxicmllZglJbml0aWFsaXplIFRoZSBNTE1FIFF1ZXVlLCB1c2VkIGJ5IE1MTUUgRnVuY3Rpb25zCi0gKglccGFyYW0JKlF1ZXVlCSAgIFRoZSBNTE1FIFF1ZXVlCi0gKglccmV0dXJuIEFsd2F5cwkgICBSZXR1cm4gTkRJU19TVEFURV9TVUNDRVNTIGluIHRoaXMgaW1wbGVtZW50YXRpb24KLSAqCVxwcmUKLSAqCVxwb3N0Ci0gKglcbm90ZQlCZWNhdXNlIHRoaXMgaXMgZG9uZSBvbmx5IG9uY2UgKGF0IHRoZSBpbml0IHN0YWdlKSwgbm8gbmVlZCB0byBiZSBsb2NrZWQKLQotIElSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLSAqLwotTkRJU19TVEFUVVMgTWxtZVF1ZXVlSW5pdCgKLQlJTiBNTE1FX1FVRVVFICpRdWV1ZSkKLXsKLQlJTlQgaTsKLQotCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZRdWV1ZS0+TG9jayk7Ci0KLQlRdWV1ZS0+TnVtCT0gMDsKLQlRdWV1ZS0+SGVhZCA9IDA7Ci0JUXVldWUtPlRhaWwgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRTsgaSsrKQotCXsKLQkJUXVldWUtPkVudHJ5W2ldLk9jY3VwaWVkID0gRkFMU0U7Ci0JCVF1ZXVlLT5FbnRyeVtpXS5Nc2dMZW4gPSAwOwotCQlOZGlzWmVyb01lbW9yeShRdWV1ZS0+RW50cnlbaV0uTXNnLCBNR01UX0RNQV9CVUZGRVJfU0laRSk7Ci0JfQotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLS8qISBcYnJpZWYJIEVucXVldWUgYSBtZXNzYWdlIGZvciBvdGhlciB0aHJlYWRzLCBpZiB0aGV5IHdhbnQgdG8gc2VuZCBtZXNzYWdlcyB0byBNTE1FIHRocmVhZAotICoJXHBhcmFtCSpRdWV1ZQkgIFRoZSBNTE1FIFF1ZXVlCi0gKglccGFyYW0JIE1hY2hpbmUgIFRoZSBTdGF0ZSBNYWNoaW5lIElkCi0gKglccGFyYW0JIE1zZ1R5cGUgIFRoZSBNZXNzYWdlIFR5cGUKLSAqCVxwYXJhbQkgTXNnTGVuICAgVGhlIE1lc3NhZ2UgbGVuZ3RoCi0gKglccGFyYW0JKk1zZwkgIFRoZSBtZXNzYWdlIHBvaW50ZXIKLSAqCVxyZXR1cm4gIFRSVUUgaWYgZW5xdWV1ZSBpcyBzdWNjZXNzZnVsLCBGQUxTRSBpZiB0aGUgcXVldWUgaXMgZnVsbAotICoJXHByZQotICoJXHBvc3QKLSAqCVxub3RlCSBUaGUgbWVzc2FnZSBoYXMgdG8gYmUgaW5pdGlhbGl6ZWQKLQotIElSUUwgPSBQQVNTSVZFX0xFVkVMCi0gSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAqLwotQk9PTEVBTiBNbG1lRW5xdWV1ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVTE9ORyBNYWNoaW5lLAotCUlOIFVMT05HIE1zZ1R5cGUsCi0JSU4gVUxPTkcgTXNnTGVuLAotCUlOIFZPSUQgKk1zZykKLXsKLQlJTlQgVGFpbDsKLQlNTE1FX1FVRVVFCSpRdWV1ZSA9IChNTE1FX1FVRVVFICopJnBBZC0+TWxtZS5RdWV1ZTsKLQotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JCXJldHVybiBGQUxTRTsKLQotCS8vIEZpcnN0IGNoZWNrIHRoZSBzaXplLCBpdCBNVVNUIG5vdCBleGNlZWQgdGhlIG1sbWUgcXVldWUgc2l6ZQotCWlmIChNc2dMZW4gPiBNR01UX0RNQV9CVUZGRVJfU0laRSkKLQl7Ci0JCURCR1BSSU5UX0VSUigoIk1sbWVFbnF1ZXVlOiBtc2cgdG9vIGxhcmdlLCBzaXplID0gJWxkIFxuIiwgTXNnTGVuKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlpZiAoTWxtZVF1ZXVlRnVsbChRdWV1ZSkpCi0JewotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7Ci0JVGFpbCA9IFF1ZXVlLT5UYWlsOwotCVF1ZXVlLT5UYWlsKys7Ci0JUXVldWUtPk51bSsrOwotCWlmIChRdWV1ZS0+VGFpbCA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUpCi0JewotCQlRdWV1ZS0+VGFpbCA9IDA7Ci0JfQotCi0JUXVldWUtPkVudHJ5W1RhaWxdLldjaWQgPSBSRVNFUlZFRF9XQ0lEOwotCVF1ZXVlLT5FbnRyeVtUYWlsXS5PY2N1cGllZCA9IFRSVUU7Ci0JUXVldWUtPkVudHJ5W1RhaWxdLk1hY2hpbmUgPSBNYWNoaW5lOwotCVF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2dUeXBlID0gTXNnVHlwZTsKLQlRdWV1ZS0+RW50cnlbVGFpbF0uTXNnTGVuICA9IE1zZ0xlbjsKLQotCWlmIChNc2cgIT0gTlVMTCkKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KFF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2csIE1zZywgTXNnTGVuKTsKLQl9Ci0KLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotLyohIFxicmllZgkgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHdoZW4gUmVjdiBnZXRzIGEgTUxNRSBtZXNzYWdlCi0gKglccGFyYW0JKlF1ZXVlCQkJIFRoZSBNTE1FIFF1ZXVlCi0gKglccGFyYW0JIFRpbWVTdGFtcEhpZ2gJIFRoZSB1cHBlciAzMiBiaXQgb2YgdGltZXN0YW1wCi0gKglccGFyYW0JIFRpbWVTdGFtcExvdwkgVGhlIGxvd2VyIDMyIGJpdCBvZiB0aW1lc3RhbXAKLSAqCVxwYXJhbQkgUnNzaQkJCSBUaGUgcmVjZWl2aW5nIFJTU0kgc3RyZW5ndGgKLSAqCVxwYXJhbQkgTXNnTGVuCQkJIFRoZSBsZW5ndGggb2YgdGhlIG1lc3NhZ2UKLSAqCVxwYXJhbQkqTXNnCQkJIFRoZSBtZXNzYWdlIHBvaW50ZXIKLSAqCVxyZXR1cm4gIFRSVUUgaWYgZXZlcnl0aGluZyBvaywgRkFMU0Ugb3RoZXJ3aXNlIChsaWtlIFF1ZXVlIEZ1bGwpCi0gKglccHJlCi0gKglccG9zdAotCi0gSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAqLwotQk9PTEVBTiBNbG1lRW5xdWV1ZUZvclJlY3YoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUxPTkcgV2NpZCwKLQlJTiBVTE9ORyBUaW1lU3RhbXBIaWdoLAotCUlOIFVMT05HIFRpbWVTdGFtcExvdywKLQlJTiBVQ0hBUiBSc3NpMCwKLQlJTiBVQ0hBUiBSc3NpMSwKLQlJTiBVQ0hBUiBSc3NpMiwKLQlJTiBVTE9ORyBNc2dMZW4sCi0JSU4gVk9JRCAqTXNnLAotCUlOIFVDSEFSIFNpZ25hbCkKLXsKLQlJTlQJCSBUYWlsLCBNYWNoaW5lOwotCVBGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOwotCUlOVAkJIE1zZ1R5cGU7Ci0JTUxNRV9RVUVVRQkqUXVldWUgPSAoTUxNRV9RVUVVRSAqKSZwQWQtPk1sbWUuUXVldWU7Ci0KLSNpZmRlZiBSQUxJTktfQVRFCi0JLyogTm90aGluZyB0byBkbyBpbiBBVEUgbW9kZSAqLwotCWlmKEFURV9PTihwQWQpKQotCQlyZXR1cm4gRkFMU0U7Ci0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQl7Ci0JCURCR1BSSU5UX0VSUigoIk1sbWVFbnF1ZXVlRm9yUmVjdjogZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTXG4iKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQkvLyBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUKLQlpZiAoTXNnTGVuID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpCi0JewotCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZUZvclJlY3Y6IGZyYW1lIHRvbyBsYXJnZSwgc2l6ZSA9ICVsZCBcbiIsIE1zZ0xlbikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JaWYgKE1sbWVRdWV1ZUZ1bGwoUXVldWUpKQotCXsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlpZiAoIU1zZ1R5cGVTdWJzdChwQWQsIHBGcmFtZSwgJk1hY2hpbmUsICZNc2dUeXBlKSkKLQkJewotCQkJREJHUFJJTlRfRVJSKCgiTWxtZUVucXVldWVGb3JSZWN2OiB1bi1yZWNvbmduaXplZCBtZ210LT5zdWJ0eXBlPSVkXG4iLHBGcmFtZS0+SGRyLkZDLlN1YlR5cGUpKTsKLQkJCXJldHVybiBGQUxTRTsKLQkJfQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCS8vIE9LLCB3ZSBnb3QgYWxsIHRoZSBpbmZvcm1hdGlvbnMsIGl0IGlzIHRpbWUgdG8gcHV0IHRoaW5ncyBpbnRvIHF1ZXVlCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7Ci0JVGFpbCA9IFF1ZXVlLT5UYWlsOwotCVF1ZXVlLT5UYWlsKys7Ci0JUXVldWUtPk51bSsrOwotCWlmIChRdWV1ZS0+VGFpbCA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUpCi0JewotCQlRdWV1ZS0+VGFpbCA9IDA7Ci0JfQotCVF1ZXVlLT5FbnRyeVtUYWlsXS5PY2N1cGllZCA9IFRSVUU7Ci0JUXVldWUtPkVudHJ5W1RhaWxdLk1hY2hpbmUgPSBNYWNoaW5lOwotCVF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2dUeXBlID0gTXNnVHlwZTsKLQlRdWV1ZS0+RW50cnlbVGFpbF0uTXNnTGVuICA9IE1zZ0xlbjsKLQlRdWV1ZS0+RW50cnlbVGFpbF0uVGltZVN0YW1wLnUuTG93UGFydCA9IFRpbWVTdGFtcExvdzsKLQlRdWV1ZS0+RW50cnlbVGFpbF0uVGltZVN0YW1wLnUuSGlnaFBhcnQgPSBUaW1lU3RhbXBIaWdoOwotCVF1ZXVlLT5FbnRyeVtUYWlsXS5Sc3NpMCA9IFJzc2kwOwotCVF1ZXVlLT5FbnRyeVtUYWlsXS5Sc3NpMSA9IFJzc2kxOwotCVF1ZXVlLT5FbnRyeVtUYWlsXS5Sc3NpMiA9IFJzc2kyOwotCVF1ZXVlLT5FbnRyeVtUYWlsXS5TaWduYWwgPSBTaWduYWw7Ci0JUXVldWUtPkVudHJ5W1RhaWxdLldjaWQgPSAoVUNIQVIpV2NpZDsKLQotCVF1ZXVlLT5FbnRyeVtUYWlsXS5DaGFubmVsID0gcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsOwotCi0JaWYgKE1zZyAhPSBOVUxMKQotCXsKLQkJTmRpc01vdmVNZW1vcnkoUXVldWUtPkVudHJ5W1RhaWxdLk1zZywgTXNnLCBNc2dMZW4pOwotCX0KLQotCU5kaXNSZWxlYXNlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOwotCi0JUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qISBcYnJpZWYJIERlcXVldWUgYSBtZXNzYWdlIGZyb20gdGhlIE1MTUUgUXVldWUKLSAqCVxwYXJhbQkqUXVldWUJICBUaGUgTUxNRSBRdWV1ZQotICoJXHBhcmFtCSpFbGVtCSAgVGhlIG1lc3NhZ2UgZGVxdWV1ZWQgZnJvbSBNTE1FIFF1ZXVlCi0gKglccmV0dXJuICBUUlVFIGlmIHRoZSBFbGVtIGNvbnRhaW5zIHNvbWV0aGluZywgRkFMU0Ugb3RoZXJ3aXNlCi0gKglccHJlCi0gKglccG9zdAotCi0gSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAqLwotQk9PTEVBTiBNbG1lRGVxdWV1ZSgKLQlJTiBNTE1FX1FVRVVFICpRdWV1ZSwKLQlPVVQgTUxNRV9RVUVVRV9FTEVNICoqRWxlbSkKLXsKLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKLQkqRWxlbSA9ICYoUXVldWUtPkVudHJ5W1F1ZXVlLT5IZWFkXSk7Ci0JUXVldWUtPk51bS0tOwotCVF1ZXVlLT5IZWFkKys7Ci0JaWYgKFF1ZXVlLT5IZWFkID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSkKLQl7Ci0JCVF1ZXVlLT5IZWFkID0gMDsKLQl9Ci0JTmRpc1JlbGVhc2VTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRAlNbG1lUmVzdGFydFN0YXRlTWFjaGluZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlNTE1FX1FVRVVFX0VMRU0JCSpFbGVtID0gTlVMTDsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlCT09MRUFOCQkJCUNhbmNlbGxlZDsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lIFxuIikpOwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKLQlpZihwQWQtPk1sbWUuYlJ1bm5pbmcpCi0JewotCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOwotCQlyZXR1cm47Ci0JfQotCWVsc2UKLQl7Ci0JCXBBZC0+TWxtZS5iUnVubmluZyA9IFRSVUU7Ci0JfQotCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7Ci0KLQkvLyBSZW1vdmUgYWxsIE1sbWUgcXVldWVzIGVsZW1lbnRzCi0Jd2hpbGUgKCFNbG1lUXVldWVFbXB0eSgmcEFkLT5NbG1lLlF1ZXVlKSkKLQl7Ci0JCS8vRnJvbSBtZXNzYWdlIHR5cGUsIGRldGVybWluZSB3aGljaCBzdGF0ZSBtYWNoaW5lIEkgc2hvdWxkIGRyaXZlCi0JCWlmIChNbG1lRGVxdWV1ZSgmcEFkLT5NbG1lLlF1ZXVlLCAmRWxlbSkpCi0JCXsKLQkJCS8vIGZyZWUgTUxNRSBlbGVtZW50Ci0JCQlFbGVtLT5PY2N1cGllZCA9IEZBTFNFOwotCQkJRWxlbS0+TXNnTGVuID0gMDsKLQotCQl9Ci0JCWVsc2UgewotCQkJREJHUFJJTlRfRVJSKCgiTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmU6IE1sbWVRdWV1ZSBlbXB0eVxuIikpOwotCQl9Ci0JfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCVVDSEFSIGk7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0JCS8vIENhbmNlbCBhbGwgdGltZXIgZXZlbnRzCi0JCS8vIEJlIGNhcmVmdWwgdG8gY2FuY2VsIG5ldyBhZGRlZCB0aW1lcgotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLAkgICZDYW5jZWxsZWQpOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsICAgJkNhbmNlbGxlZCk7Ci0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsICAmQ2FuY2VsbGVkKTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLAkgICAmQ2FuY2VsbGVkKTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsCSAgICZDYW5jZWxsZWQpOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsCSAgICZDYW5jZWxsZWQpOwotCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCi0JCXsKLQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZDYW5jZWxsZWQpOwotCQl9Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JLy8gQ2hhbmdlIGJhY2sgdG8gb3JpZ2luYWwgY2hhbm5lbCBpbiBjYXNlIG9mIGRvaW5nIHNjYW4KLQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKLQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQotCS8vIFJlc3VtZSBNU0RVIHdoaWNoIGlzIHR1cm5lZCBvZmYgZHVybmluZyBzY2FuCi0JUlRNUFJlc3VtZU1zZHVUcmFuc21pc3Npb24ocEFkKTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQkvLyBTZXQgYWxsIHN0YXRlIG1hY2hpbmVzIGJhY2sgSURMRQotCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICAgID0gQ05UTF9JRExFOwotCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSAgID0gQVNTT0NfSURMRTsKLQkJcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IEFVVEhfUkVRX0lETEU7Ci0JCXBBZC0+TWxtZS5BdXRoUnNwTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JTUF9JRExFOwotCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlICAgID0gU1lOQ19JRExFOwotCQlwQWQtPk1sbWUuQWN0TWFjaGluZS5DdXJyU3RhdGUgICAgPSBBQ1RfSURMRTsKLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJcEFkLT5NbG1lLkRsc01hY2hpbmUuQ3VyclN0YXRlICAgID0gRExTX0lETEU7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JLy8gUmVtb3ZlIHJ1bm5pbmcgc3RhdGUKLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOwotCXBBZC0+TWxtZS5iUnVubmluZyA9IEZBTFNFOwotCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi19Ci0KLS8qISBcYnJpZWYJdGVzdCBpZiB0aGUgTUxNRSBRdWV1ZSBpcyBlbXB0eQotICoJXHBhcmFtCSpRdWV1ZQkgIFRoZSBNTE1FIFF1ZXVlCi0gKglccmV0dXJuIFRSVUUgaWYgdGhlIFF1ZXVlIGlzIGVtcHR5LCBGQUxTRSBvdGhlcndpc2UKLSAqCVxwcmUKLSAqCVxwb3N0Ci0KLSBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICovCi1CT09MRUFOIE1sbWVRdWV1ZUVtcHR5KAotCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKQotewotCUJPT0xFQU4gQW5zOwotCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7Ci0JQW5zID0gKFF1ZXVlLT5OdW0gPT0gMCk7Ci0JTmRpc1JlbGVhc2VTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7Ci0KLQlyZXR1cm4gQW5zOwotfQotCi0vKiEgXGJyaWVmCSB0ZXN0IGlmIHRoZSBNTE1FIFF1ZXVlIGlzIGZ1bGwKLSAqCVxwYXJhbQkgKlF1ZXVlCQkgVGhlIE1MTUUgUXVldWUKLSAqCVxyZXR1cm4gIFRSVUUgaWYgdGhlIFF1ZXVlIGlzIGVtcHR5LCBGQUxTRSBvdGhlcndpc2UKLSAqCVxwcmUKLSAqCVxwb3N0Ci0KLSBJUlFMID0gUEFTU0lWRV9MRVZFTAotIElSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gKi8KLUJPT0xFQU4gTWxtZVF1ZXVlRnVsbCgKLQlJTiBNTE1FX1FVRVVFICpRdWV1ZSkKLXsKLQlCT09MRUFOIEFuczsKLQotCU5kaXNBY3F1aXJlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOwotCUFucyA9IChRdWV1ZS0+TnVtID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSB8fCBRdWV1ZS0+RW50cnlbUXVldWUtPlRhaWxdLk9jY3VwaWVkKTsKLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKLQotCXJldHVybiBBbnM7Ci19Ci0KLS8qISBcYnJpZWYJIFRoZSBkZXN0cnVjdG9yIG9mIE1MTUUgUXVldWUKLSAqCVxwYXJhbQotICoJXHJldHVybgotICoJXHByZQotICoJXHBvc3QKLSAqCVxub3RlCUNsZWFyIE1sbWUgUXVldWUsIFNldCBRdWV1ZS0+TnVtIHRvIFplcm8uCi0KLSBJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0gKi8KLVZPSUQgTWxtZVF1ZXVlRGVzdHJveSgKLQlJTiBNTE1FX1FVRVVFICpwUXVldWUpCi17Ci0JTmRpc0FjcXVpcmVTcGluTG9jaygmKHBRdWV1ZS0+TG9jaykpOwotCXBRdWV1ZS0+TnVtICA9IDA7Ci0JcFF1ZXVlLT5IZWFkID0gMDsKLQlwUXVldWUtPlRhaWwgPSAwOwotCU5kaXNSZWxlYXNlU3BpbkxvY2soJihwUXVldWUtPkxvY2spKTsKLQlOZGlzRnJlZVNwaW5Mb2NrKCYocFF1ZXVlLT5Mb2NrKSk7Ci19Ci0KLQotLyohIFxicmllZgkgVG8gc3Vic3RpdHV0ZSB0aGUgbWVzc2FnZSB0eXBlIGlmIHRoZSBtZXNzYWdlIGlzIGNvbWluZyBmcm9tIGV4dGVybmFsCi0gKglccGFyYW0JcEZyYW1lCQkgICBUaGUgZnJhbWUgcmVjZWl2ZWQKLSAqCVxwYXJhbQkqTWFjaGluZQkgICBUaGUgc3RhdGUgbWFjaGluZQotICoJXHBhcmFtCSpNc2dUeXBlCSAgIHRoZSBtZXNzYWdlIHR5cGUgZm9yIHRoZSBzdGF0ZSBtYWNoaW5lCi0gKglccmV0dXJuIFRSVUUgaWYgdGhlIHN1YnN0aXR1dGlvbiBpcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UKLSAqCVxwcmUKLSAqCVxwb3N0Ci0KLSBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICovCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1CT09MRUFOIE1zZ1R5cGVTdWJzdCgKLQlJTiBQUlRNUF9BREFQVEVSICBwQWQsCi0JSU4gUEZSQU1FXzgwMl8xMSBwRnJhbWUsCi0JT1VUIElOVCAqTWFjaGluZSwKLQlPVVQgSU5UICpNc2dUeXBlKQotewotCVVTSE9SVAlTZXEsIEFsZzsKLQlVQ0hBUglFQVBUeXBlOwotCVBVQ0hBUglwRGF0YTsKLQotCS8vIFBvaW50ZXIgdG8gc3RhcnQgb2YgZGF0YSBmcmFtZXMgaW5jbHVkaW5nIFNOQVAgaGVhZGVyCi0JcERhdGEgPSAoUFVDSEFSKSBwRnJhbWUgKyBMRU5HVEhfODAyXzExOwotCi0JLy8gVGhlIG9ubHkgZGF0YSB0eXBlIHdpbGwgcGFzcyB0byB0aGlzIGZ1bmN0aW9uIGlzIEVBUE9MIGZyYW1lCi0JaWYgKHBGcmFtZS0+SGRyLkZDLlR5cGUgPT0gQlRZUEVfREFUQSkKLQl7Ci0JCXsKLQkgICAgICAgICpNYWNoaW5lID0gV1BBX1NUQVRFX01BQ0hJTkU7Ci0JCQlFQVBUeXBlID0gKigoVUNIQVIqKXBGcmFtZSArIExFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSCArIDEpOwotCSAgICAgICAgcmV0dXJuIChXcGFNc2dUeXBlU3Vic3QoRUFQVHlwZSwgKElOVCAqKSBNc2dUeXBlKSk7Ci0JCX0KLQl9Ci0KLQlzd2l0Y2ggKHBGcmFtZS0+SGRyLkZDLlN1YlR5cGUpCi0JewotCQljYXNlIFNVQlRZUEVfQVNTT0NfUkVROgotCQkJKk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOwotCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BU1NPQ19SRVE7Ci0JCQlicmVhazsKLQkJY2FzZSBTVUJUWVBFX0FTU09DX1JTUDoKLQkJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKLQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQVNTT0NfUlNQOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1VCVFlQRV9SRUFTU09DX1JFUToKLQkJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKLQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfUkVBU1NPQ19SRVE7Ci0JCQlicmVhazsKLQkJY2FzZSBTVUJUWVBFX1JFQVNTT0NfUlNQOgotCQkJKk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOwotCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9SRUFTU09DX1JTUDsKLQkJCWJyZWFrOwotCQljYXNlIFNVQlRZUEVfUFJPQkVfUkVROgotCQkJKk1hY2hpbmUgPSBTWU5DX1NUQVRFX01BQ0hJTkU7Ci0JCQkqTXNnVHlwZSA9IE1UMl9QRUVSX1BST0JFX1JFUTsKLQkJCWJyZWFrOwotCQljYXNlIFNVQlRZUEVfUFJPQkVfUlNQOgotCQkJKk1hY2hpbmUgPSBTWU5DX1NUQVRFX01BQ0hJTkU7Ci0JCQkqTXNnVHlwZSA9IE1UMl9QRUVSX1BST0JFX1JTUDsKLQkJCWJyZWFrOwotCQljYXNlIFNVQlRZUEVfQkVBQ09OOgotCQkJKk1hY2hpbmUgPSBTWU5DX1NUQVRFX01BQ0hJTkU7Ci0JCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0JFQUNPTjsKLQkJCWJyZWFrOwotCQljYXNlIFNVQlRZUEVfQVRJTToKLQkJCSpNYWNoaW5lID0gU1lOQ19TVEFURV9NQUNISU5FOwotCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BVElNOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1VCVFlQRV9ESVNBU1NPQzoKLQkJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKLQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfRElTQVNTT0NfUkVROwotCQkJYnJlYWs7Ci0JCWNhc2UgU1VCVFlQRV9BVVRIOgotCQkJLy8gZ2V0IHRoZSBzZXF1ZW5jZSBudW1iZXIgZnJvbSBwYXlsb2FkIDI0IE1hYyBIZWFkZXIgKyAyIGJ5dGVzIGFsZ29yaXRobQotCQkJTmRpc01vdmVNZW1vcnkoJlNlcSwgJnBGcmFtZS0+T2N0ZXRbMl0sIHNpemVvZihVU0hPUlQpKTsKLQkJCU5kaXNNb3ZlTWVtb3J5KCZBbGcsICZwRnJhbWUtPk9jdGV0WzBdLCBzaXplb2YoVVNIT1JUKSk7Ci0JCQlpZiAoU2VxID09IDEgfHwgU2VxID09IDMpCi0JCQl7Ci0JCQkJKk1hY2hpbmUgPSBBVVRIX1JTUF9TVEFURV9NQUNISU5FOwotCQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQVVUSF9PREQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChTZXEgPT0gMiB8fCBTZXEgPT0gNCkKLQkJCXsKLQkJCQlpZiAoQWxnID09IEFVVEhfTU9ERV9PUEVOIHx8IEFsZyA9PSBBVVRIX01PREVfS0VZKQotCQkJCXsKLQkJCQkJKk1hY2hpbmUgPSBBVVRIX1NUQVRFX01BQ0hJTkU7Ci0JCQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQVVUSF9FVkVOOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBTVUJUWVBFX0RFQVVUSDoKLQkJCSpNYWNoaW5lID0gQVVUSF9SU1BfU1RBVEVfTUFDSElORTsKLQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfREVBVVRIOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1VCVFlQRV9BQ1RJT046Ci0JCQkqTWFjaGluZSA9IEFDVElPTl9TVEFURV9NQUNISU5FOwotCQkJLy8gIFNvbWV0aW1lcyBTdGEgd2lsbCByZXR1cm4gd2l0aCBjYXRlZ29yeSBieXRlcyB3aXRoIE1TQiA9IDEsIGlmIHRoZXkgcmVjZWl2ZSBjYXRvZ29yeSBvdXQgb2YgdGhlaXIgc3VwcG9ydAotCQkJaWYgKChwRnJhbWUtPk9jdGV0WzBdJjB4N0YpID4gTUFYX1BFRVJfQ0FURV9NU0cpCi0JCQl7Ci0JCQkJKk1zZ1R5cGUgPSBNVDJfQUNUX0lOVkFMSUQ7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJKk1zZ1R5cGUgPSAocEZyYW1lLT5PY3RldFswXSYweDdGKTsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIEZBTFNFOwotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIHN0YXRlX21hY2hpbmUuYwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vKiEgXGJyaWVmIEluaXRpYWxpemUgdGhlIHN0YXRlIG1hY2hpbmUuCi0gKglccGFyYW0gKlMJCQlwb2ludGVyIHRvIHRoZSBzdGF0ZSBtYWNoaW5lCi0gKglccGFyYW0JVHJhbnMJCVN0YXRlIG1hY2hpbmUgdHJhbnNpdGlvbiBmdW5jdGlvbgotICoJXHBhcmFtCVN0TnIJCW51bWJlciBvZiBzdGF0ZXMKLSAqCVxwYXJhbQlNc2dOcgkJbnVtYmVyIG9mIG1lc3NhZ2VzCi0gKglccGFyYW0JRGVmRnVuYwkJZGVmYXVsdCBmdW5jdGlvbiwgd2hlbiB0aGVyZSBpcyBpbnZhbGlkIHN0YXRlL21lc3NhZ2UgY29tYmluYXRpb24KLSAqCVxwYXJhbQlJbml0U3RhdGUJaW5pdGlhbCBzdGF0ZSBvZiB0aGUgc3RhdGUgbWFjaGluZQotICoJXHBhcmFtCUJhc2UJCVN0YXRlTWFjaGluZSBiYXNlLCBpbnRlcm5hbCB1c2Ugb25seQotICoJXHByZSBwX3NtIHNob3VsZCBiZSBhIGxlZ2FsIHBvaW50ZXIKLSAqCVxwb3N0Ci0KLSBJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0gKi8KLVZPSUQgU3RhdGVNYWNoaW5lSW5pdCgKLQlJTiBTVEFURV9NQUNISU5FICpTLAotCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdLAotCUlOIFVMT05HIFN0TnIsCi0JSU4gVUxPTkcgTXNnTnIsCi0JSU4gU1RBVEVfTUFDSElORV9GVU5DIERlZkZ1bmMsCi0JSU4gVUxPTkcgSW5pdFN0YXRlLAotCUlOIFVMT05HIEJhc2UpCi17Ci0JVUxPTkcgaSwgajsKLQotCS8vIHNldCBudW1iZXIgb2Ygc3RhdGVzIGFuZCBtZXNzYWdlcwotCVMtPk5yU3RhdGUgPSBTdE5yOwotCVMtPk5yTXNnICAgPSBNc2dOcjsKLQlTLT5CYXNlICAgID0gQmFzZTsKLQotCVMtPlRyYW5zRnVuYyAgPSBUcmFuczsKLQotCS8vIGluaXQgYWxsIHN0YXRlIHRyYW5zaXRpb24gdG8gZGVmYXVsdCBmdW5jdGlvbgotCWZvciAoaSA9IDA7IGkgPCBTdE5yOyBpKyspCi0JewotCQlmb3IgKGogPSAwOyBqIDwgTXNnTnI7IGorKykKLQkJewotCQkJUy0+VHJhbnNGdW5jW2kgKiBNc2dOciArIGpdID0gRGVmRnVuYzsKLQkJfQotCX0KLQotCS8vIHNldCB0aGUgc3RhcnRpbmcgc3RhdGUKLQlTLT5DdXJyU3RhdGUgPSBJbml0U3RhdGU7Ci19Ci0KLS8qISBcYnJpZWYgVGhpcyBmdW5jdGlvbiBmaWxscyBpbiB0aGUgZnVuY3Rpb24gcG9pbnRlciBpbnRvIHRoZSBjZWxsIGluIHRoZSBzdGF0ZSBtYWNoaW5lCi0gKglccGFyYW0gKlMJcG9pbnRlciB0byB0aGUgc3RhdGUgbWFjaGluZQotICoJXHBhcmFtIFN0CXN0YXRlCi0gKglccGFyYW0gTXNnCWluY29taW5nIG1lc3NhZ2UKLSAqCVxwYXJhbSBmCXRoZSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCB3aGVuIChzdGF0ZSwgbWVzc2FnZSkgY29tYmluYXRpb24gb2NjdXJzIGF0IHRoZSBzdGF0ZSBtYWNoaW5lCi0gKglccHJlICpTIHNob3VsZCBiZSBhIGxlZ2FsIHBvaW50ZXIgdG8gdGhlIHN0YXRlIG1hY2hpbmUsIHN0LCBtc2csIHNob3VsZCBiZSBhbGwgd2l0aGluIHRoZSByYW5nZSwgQmFzZSBzaG91bGQgYmUgc2V0IGluIHRoZSBpbml0aWFsIHN0YXRlCi0gKglccG9zdAotCi0gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotICovCi1WT0lEIFN0YXRlTWFjaGluZVNldEFjdGlvbigKLQlJTiBTVEFURV9NQUNISU5FICpTLAotCUlOIFVMT05HIFN0LAotCUlOIFVMT05HIE1zZywKLQlJTiBTVEFURV9NQUNISU5FX0ZVTkMgRnVuYykKLXsKLQlVTE9ORyBNc2dJZHg7Ci0KLQlNc2dJZHggPSBNc2cgLSBTLT5CYXNlOwotCi0JaWYgKFN0IDwgUy0+TnJTdGF0ZSAmJiBNc2dJZHggPCBTLT5Ock1zZykKLQl7Ci0JCS8vIGJvdW5kYXJ5IGNoZWNraW5nIGJlZm9yZSBzZXR0aW5nIHRoZSBhY3Rpb24KLQkJUy0+VHJhbnNGdW5jW1N0ICogUy0+TnJNc2cgKyBNc2dJZHhdID0gRnVuYzsKLQl9Ci19Ci0KLS8qISBcYnJpZWYJIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgc3RhdGUgdHJhbnNpdGlvbgotICoJXHBhcmFtCSAqQWRhcHRlciB0aGUgTklDIGFkYXB0ZXIgcG9pbnRlcgotICoJXHBhcmFtCSAqUwkgIHRoZSBzdGF0ZSBtYWNoaW5lCi0gKglccGFyYW0JICpFbGVtCSAgdGhlIG1lc3NhZ2UgdG8gYmUgZXhlY3V0ZWQKLSAqCVxyZXR1cm4gICBOb25lCi0KLSBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICovCi1WT0lEIFN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gU1RBVEVfTUFDSElORSAqUywKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JKCooUy0+VHJhbnNGdW5jW1MtPkN1cnJTdGF0ZSAqIFMtPk5yTXNnICsgRWxlbS0+TXNnVHlwZSAtIFMtPkJhc2VdKSkocEFkLCBFbGVtKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlUaGUgZHJvcCBmdW5jdGlvbiwgd2hlbiBtYWNoaW5lIGV4ZWN1dGVzIHRoaXMsIHRoZSBtZXNzYWdlIGlzIHNpbXBseQotCQlpZ25vcmVkLiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZywgdGhlIG1lc3NhZ2UgaXMgZnJlZWQgaW4KLQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbigpCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBEcm9wKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gbGZzci5jCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIExmc3JJbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVMT05HIFNlZWQpCi17Ci0JaWYgKFNlZWQgPT0gMCkKLQkJcEFkLT5NbG1lLlNoaWZ0UmVnID0gMTsKLQllbHNlCi0JCXBBZC0+TWxtZS5TaGlmdFJlZyA9IFNlZWQ7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1VQ0hBUiBSYW5kb21CeXRlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVVMT05HIGk7Ci0JVUNIQVIgUiwgUmVzdWx0OwotCi0JUiA9IDA7Ci0KLQlpZiAocEFkLT5NbG1lLlNoaWZ0UmVnID09IDApCi0JTmRpc0dldFN5c3RlbVVwVGltZSgoVUxPTkcgKikmcEFkLT5NbG1lLlNoaWZ0UmVnKTsKLQotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JewotCQlpZiAocEFkLT5NbG1lLlNoaWZ0UmVnICYgMHgwMDAwMDAwMSkKLQkJewotCQkJcEFkLT5NbG1lLlNoaWZ0UmVnID0gKChwQWQtPk1sbWUuU2hpZnRSZWcgXiBMRlNSX01BU0spID4+IDEpIHwgMHg4MDAwMDAwMDsKLQkJCVJlc3VsdCA9IDE7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPk1sbWUuU2hpZnRSZWcgPSBwQWQtPk1sbWUuU2hpZnRSZWcgPj4gMTsKLQkJCVJlc3VsdCA9IDA7Ci0JCX0KLQkJUiA9IChSIDw8IDEpIHwgUmVzdWx0OwotCX0KLQotCXJldHVybiBSOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlWZXJpZnkgdGhlIHN1cHBvcnQgcmF0ZSBmb3IgZGlmZmVyZW50IFBIWSB0eXBlCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBDaGVja1JhdGVzKAotCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBPVVQJVUNIQVIJCQlTdXBSYXRlW10sCi0JSU4gT1VUCVVDSEFSCQkJKlN1cFJhdGVMZW4pCi17Ci0JVUNIQVIJUmF0ZUlkeCwgaSwgajsKLQlVQ0hBUglOZXdSYXRlWzEyXSwgTmV3UmF0ZUxlbjsKLQotCU5ld1JhdGVMZW4gPSAwOwotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKLQkJUmF0ZUlkeCA9IDQ7Ci0JZWxzZQotCQlSYXRlSWR4ID0gMTI7Ci0KLQkvLyBDaGVjayBmb3Igc3VwcG9ydCByYXRlcyBleGNsdWRlIGJhc2ljIHJhdGUgYml0Ci0JZm9yIChpID0gMDsgaSA8ICpTdXBSYXRlTGVuOyBpKyspCi0JCWZvciAoaiA9IDA7IGogPCBSYXRlSWR4OyBqKyspCi0JCQlpZiAoKFN1cFJhdGVbaV0gJiAweDdmKSA9PSBSYXRlSWRUbzUwMEticHNbal0pCi0JCQkJTmV3UmF0ZVtOZXdSYXRlTGVuKytdID0gU3VwUmF0ZVtpXTsKLQotCSpTdXBSYXRlTGVuID0gTmV3UmF0ZUxlbjsKLQlOZGlzTW92ZU1lbW9yeShTdXBSYXRlLCBOZXdSYXRlLCBOZXdSYXRlTGVuKTsKLX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIERPVDExX05fU1VQUE9SVAotQk9PTEVBTiBSVE1QQ2hlY2tDaGFubmVsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSCQlDZW50cmFsQ2hhbm5lbCwKLQlJTiBVQ0hBUgkJQ2hhbm5lbCkKLXsKLQlVQ0hBUgkJazsKLQlVQ0hBUgkJVXBwZXJDaGFubmVsID0gMCwgTG93ZXJDaGFubmVsID0gMDsKLQlVQ0hBUgkJTm9FZmZlY3RDaGFubmVsaW5MaXN0ID0gMDsKLQotCS8vIEZpbmQgdXBwZXIgYW5kIGxvd2VyIGNoYW5uZWwgYWNjb3JkaW5nIHRvIDQwTUh6IGN1cnJlbnQgb3BlcmF0aW9uLgotCWlmIChDZW50cmFsQ2hhbm5lbCA8IENoYW5uZWwpCi0JewotCQlVcHBlckNoYW5uZWwgPSBDaGFubmVsOwotCQlpZiAoQ2VudHJhbENoYW5uZWwgPiAyKQotCQkJTG93ZXJDaGFubmVsID0gQ2VudHJhbENoYW5uZWwgLSAyOwotCQllbHNlCi0JCQlyZXR1cm4gRkFMU0U7Ci0JfQotCWVsc2UgaWYgKENlbnRyYWxDaGFubmVsID4gQ2hhbm5lbCkKLQl7Ci0JCVVwcGVyQ2hhbm5lbCA9IENlbnRyYWxDaGFubmVsICsgMjsKLQkJTG93ZXJDaGFubmVsID0gQ2hhbm5lbDsKLQl9Ci0KLQlmb3IgKGsgPSAwO2sgPCBwQWQtPkNoYW5uZWxMaXN0TnVtO2srKykKLQl7Ci0JCWlmIChwQWQtPkNoYW5uZWxMaXN0W2tdLkNoYW5uZWwgPT0gVXBwZXJDaGFubmVsKQotCQl7Ci0JCQlOb0VmZmVjdENoYW5uZWxpbkxpc3QgKys7Ci0JCX0KLQkJaWYgKHBBZC0+Q2hhbm5lbExpc3Rba10uQ2hhbm5lbCA9PSBMb3dlckNoYW5uZWwpCi0JCXsKLQkJCU5vRWZmZWN0Q2hhbm5lbGluTGlzdCArKzsKLQkJfQotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiVG90YWwgQ2hhbm5lbCBpbiBDaGFubmVsIExpc3QgPSBbJWRdXG4iLCBOb0VmZmVjdENoYW5uZWxpbkxpc3QpKTsKLQlpZiAoTm9FZmZlY3RDaGFubmVsaW5MaXN0ID09IDIpCi0JCXJldHVybiBUUlVFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJVmVyaWZ5IHRoZSBzdXBwb3J0IHJhdGUgZm9yIEhUIHBoeSB0eXBlCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCUZBTFNFIGlmIHBBZC0+Q29tbW9uQ2ZnLlN1cHBvcnRlZEh0UGh5IGRvZXNuJ3QgYWNjZXB0IHRoZSBwSHRDYXBhYmlsaXR5LiAgKEFQIE1vZGUpCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTgkJUlRNUENoZWNrSHQoCi0JSU4JUFJUTVBfQURBUFRFUgkJCXBBZCwKLQlJTglVQ0hBUgkJCQkJV2NpZCwKLQlJTglIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKLQlJTglBRERfSFRfSU5GT19JRQkJCSpwQWRkSHRJbmZvKQotewotCWlmIChXY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQkvLyBJZiB1c2UgQU1TRFUsIHNldCBmbGFnLgotCWlmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUpCi0JCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRCk7Ci0JLy8gU2F2ZSBQZWVyIENhcGFiaWxpdHkKLQlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3IyMCkKLQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRSk7Ci0JaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApCi0JCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUpOwotCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uVHhTVEJDKQotCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19UeFNUQkNfQ0FQQUJMRSk7Ci0JaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5SeFNUQkMpCi0JCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX1J4U1RCQ19DQVBBQkxFKTsKLQlpZiAocEFkLT5Db21tb25DZmcuYlJkZyAmJiBwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCkKLQl7Ci0JCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKTsKLQl9Ci0KLQlpZiAoV2NpZCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQotCXsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5NcGR1RGVuc2l0eSA9IHBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKLQl9Ci0KLQkvLyBXaWxsIGNoZWNrIENoYW5uZWxXaWR0aCBmb3IgTUNTU2V0WzRdIGJlbG93Ci0JcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0gPSAweDE7Ci0gICAgc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSkKLQl7Ci0JCWNhc2UgMToKLQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMHhmZjsKLQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMHgwMDsKLSAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzJdID0gMHgwMDsKLSAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzNdID0gMHgwMDsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDB4ZmY7Ci0JCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDB4ZmY7Ci0gICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSA9IDB4MDA7Ci0gICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFszXSA9IDB4MDA7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAweGZmOwotCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAweGZmOwotICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMl0gPSAweGZmOwotICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbM10gPSAweDAwOwotCQkJYnJlYWs7Ci0JfQotCi0JcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID0gcEFkZEh0SW5mby0+QWRkSHRJbmZvLlJlY29tV2lkdGggJiBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUENoZWNrSHQ6OiBIdENhcEluZm8uQ2hhbm5lbFdpZHRoPSVkLCBSZWNvbVdpZHRoPSVkLCBEZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoPSVkLCBCVzQwTUF2YWlsRm9yQS9HPSVkLyVkLCBQaHlNb2RlPSVkIFxuIiwKLQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoLCBwQWRkSHRJbmZvLT5BZGRIdEluZm8uUmVjb21XaWR0aCwgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCwKLQkJcEFkLT5OaWNDb25maWcyLmZpZWxkLkJXNDBNQXZhaWxGb3JBLCBwQWQtPk5pY0NvbmZpZzIuZmllbGQuQlc0ME1BdmFpbEZvckcsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpKTsKLQotCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkdGID0gIHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5HRiAmcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkdGOwotCi0JLy8gU2VuZCBBc3NvYyBSZXEgd2l0aCBteSBIVCBjYXBhYmlsaXR5LgotCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9ICBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplOwotCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9ICBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzOwotCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCA9ICAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCkgJiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3IyMCk7Ci0JcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwKSAmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjQwKTsKLQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5UeFNUQkMgPSAgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpJihwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uUnhTVEJDKTsKLQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMgPSAgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5SeFNUQkMpJihwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uVHhTVEJDKTsKLQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3IgPSBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWF4UkFtcGR1RmFjdG9yOwotICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKLQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlBsdXNIVEM7Ci0JcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5IVENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMgPSBwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUGx1c0hUQzsKLQlpZiAocEFkLT5Db21tb25DZmcuYlJkZykKLQl7Ci0JCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlJER1N1cHBvcnQgPSBwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUkRHU3VwcG9ydDsKLSAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9IDE7Ci0JfQotCi0gICAgaWYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV18yMCkKLSAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0gPSAweDA7ICAvLyBCVzIwIGNhbid0IHRyYW5zbWl0IE1DUzMyCi0KLQlDT1BZX0FQX0hUU0VUVElOR1NfRlJPTV9CRUFDT04ocEFkLCBwSHRDYXBhYmlsaXR5KTsKLQlyZXR1cm4gVFJVRTsKLX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVZlcmlmeSB0aGUgc3VwcG9ydCByYXRlIGZvciBkaWZmZXJlbnQgUEhZIHR5cGUKLQotCUFyZ3VtZW50czoKLQkJcEFkCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUFVwZGF0ZU1sbWVSYXRlKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotCVVDSEFSCU1pbmltdW1SYXRlOwotCVVDSEFSCVByb3Blck1sbWVSYXRlOyAvLz0gUkFURV81NDsKLQlVQ0hBUglpLCBqLCBSYXRlSWR4ID0gMTI7IC8vMSwgMiwgNS41LCAxMSwgNiwgOSwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA1NAotCUJPT0xFQU4JYk1hdGNoID0gRkFMU0U7Ci0KLQlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpCi0JewotCQljYXNlIFBIWV8xMUI6Ci0JCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMTE7Ci0JCQlNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKLQkJCWJyZWFrOwotCQljYXNlIFBIWV8xMUJHX01JWEVEOgotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQljYXNlIFBIWV8xMUFCR05fTUlYRUQ6Ci0JCWNhc2UgUEhZXzExQkdOX01JWEVEOgotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJaWYgKChwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiA9PSA0KSAmJgotCQkJCShwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiA9PSAwKSkKLQkJCQkvLyBCIG9ubHkgQVAKLQkJCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMTE7Ci0JCQllbHNlCi0JCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzI0OwotCi0JCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpCi0JCQlNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKLQkJCWVsc2UKLQkJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfNjsKLQkJCWJyZWFrOwotCQljYXNlIFBIWV8xMUE6Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWNhc2UgUEhZXzExTl8yXzRHOgkvLyBydDI4NjAgbmVlZCB0byBjaGVjayBtbG1lcmF0ZSBmb3IgODAyLjExbgotCQljYXNlIFBIWV8xMUdOX01JWEVEOgotCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKLQkJY2FzZSBQSFlfMTFBTl9NSVhFRDoKLQkJY2FzZSBQSFlfMTFOXzVHOgotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzI0OwotCQkJTWluaW11bVJhdGUgPSBSQVRFXzY7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6Ci0JCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMjQ7Ci0JCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpCi0JCQkgICBNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKLQkJCWVsc2UKLQkJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfNjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OiAvLyBlcnJvcgotCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzE7Ci0JCQlNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKLQkJCWJyZWFrOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbjsgaSsrKQotCXsKLQkJZm9yIChqID0gMDsgaiA8IFJhdGVJZHg7IGorKykKLQkJewotCQkJaWYgKChwQWQtPk1sbWVBdXguU3VwUmF0ZVtpXSAmIDB4N2YpID09IFJhdGVJZFRvNTAwS2Jwc1tqXSkKLQkJCXsKLQkJCQlpZiAoaiA9PSBQcm9wZXJNbG1lUmF0ZSkKLQkJCQl7Ci0JCQkJCWJNYXRjaCA9IFRSVUU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChiTWF0Y2gpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoYk1hdGNoID09IEZBTFNFKQotCXsKLQlmb3IgKGkgPSAwOyBpIDwgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW47IGkrKykKLQl7Ci0JCWZvciAoaiA9IDA7IGogPCBSYXRlSWR4OyBqKyspCi0JCXsKLQkJCWlmICgocEFkLT5NbG1lQXV4LkV4dFJhdGVbaV0gJiAweDdmKSA9PSBSYXRlSWRUbzUwMEticHNbal0pCi0JCQl7Ci0JCQkJCWlmIChqID09IFByb3Blck1sbWVSYXRlKQotCQkJCQl7Ci0JCQkJCQliTWF0Y2ggPSBUUlVFOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCX0KLQkJfQotCi0JCQlpZiAoYk1hdGNoKQotCQkJYnJlYWs7Ci0JfQotCX0KLQotCWlmIChiTWF0Y2ggPT0gRkFMU0UpCi0JewotCQlQcm9wZXJNbG1lUmF0ZSA9IE1pbmltdW1SYXRlOwotCX0KLQotCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gTWluaW11bVJhdGU7Ci0JcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFByb3Blck1sbWVSYXRlOwotCWlmIChwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA+PSBSQVRFXzYpCi0JewotCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07Ci0JfQotCWVsc2UKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBVcGRhdGVNbG1lUmF0ZSA9PT4gICBNbG1lVHJhbnNtaXQgPSAweCV4ICBcbiIgLCBwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQud29yZCkpOwotfQotCi1DSEFSIFJUTVBNYXhSc3NpKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIENIQVIJCQkJUnNzaTAsCi0JSU4gQ0hBUgkJCQlSc3NpMSwKLQlJTiBDSEFSCQkJCVJzc2kyKQotewotCUNIQVIJbGFyZ2VyID0gLTEyNzsKLQotCWlmICgocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKSAmJiAoUnNzaTAgIT0gMCkpCi0JewotCQlsYXJnZXIgPSBSc3NpMDsKLQl9Ci0KLQlpZiAoKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMikgJiYgKFJzc2kxICE9IDApKQotCXsKLQkJbGFyZ2VyID0gbWF4KFJzc2kwLCBSc3NpMSk7Ci0JfQotCi0JaWYgKChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpICYmIChSc3NpMiAhPSAwKSkKLQl7Ci0JCWxhcmdlciA9IG1heChsYXJnZXIsIFJzc2kyKTsKLQl9Ci0KLQlpZiAobGFyZ2VyID09IC0xMjcpCi0JCWxhcmdlciA9IDA7Ci0KLQlyZXR1cm4gbGFyZ2VyOwotfQotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICAgICAgUGVyaW9kaWMgZXZhbHVhdGUgYW50ZW5uYSBsaW5rIHN0YXR1cwotCi0gICAgQXJndW1lbnRzOgotICAgICAgICBwQWQgICAgICAgICAtIEFkYXB0ZXIgcG9pbnRlcgotCi0gICAgUmV0dXJuIFZhbHVlOgotICAgICAgICBOb25lCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEFzaWNFdmFsdWF0ZVJ4QW50KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCVVDSEFSCUJCUFIzID0gMDsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2lmZGVmIFJBTElOS19BVEUKLQlpZiAoQVRFX09OKHBBZCkpCi0JCXJldHVybjsKLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTCXwKLQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MJfAotCQkJCQkJCWZSVE1QX0FEQVBURVJfUkFESU9fT0ZGCQkJfAotCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVAkJfAotCQkJCQkJCWZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpIHx8Ci0JCQkJCQkJT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKQotI2lmZGVmIFJUMzA5MAotCQkJCQkJCXx8IChwQWQtPmJQQ0ljbGtPZmYgPT0gVFJVRSkKLSNlbmRpZiAvLyBSVDMwOTAgLy8KLSNpZmRlZiBBTlRfRElWRVJTSVRZX1NVUFBPUlQKLQkJCQkJCQl8fCAocEFkLT5FZXByb21BY2Nlc3MpCi0jZW5kaWYgLy8gQU5UX0RJVkVSU0lUWV9TVVBQT1JUIC8vCi0JCQkJCQkJKQotCQlyZXR1cm47Ci0KLSNpZmRlZiBBTlRfRElWRVJTSVRZX1NVUFBPUlQKLQlpZiAoKHBBZC0+TmljQ29uZmlnMi5maWVsZC5BbnREaXZlcnNpdHkpICYmIChwQWQtPkNvbW1vbkNmZy5iUnhBbnREaXZlcnNpdHkgPT0gQU5UX0RJVkVSU0lUWV9FTkFCTEUpKQotCXsKLQkJLy8gdHdvIGFudGVubmEgc2VsZWN0aW9uIG1lY2hhbmlzbS0gb25lIGlzIGFudGVubmEgZGl2ZXJzaXR5LCB0aGUgb3RoZXIgaXMgZmFpbGVkIGFudGVubmEgcmVtb3ZlCi0JCS8vIG9uZSBpcyBhbnRlbm5hIGRpdmVyc2l0eTp0aGVyZSBpcyBvbmx5IG9uZSBhbnRlbm5hIGNhbiByeCBhbmQgdHgKLQkJLy8gdGhlIG90aGVyIGlzIGZhaWxlZCBhbnRlbm5hIHJlbW92ZTp0d28gcGh5c2ljYWwgYW50ZW5uYSBjYW4gcnggYW5kIHR4Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFudERpdiAtIGJlZm9yZSBldmFsdWF0ZSBQYWlyMS1BbnQgKCVkLCVkKVxuIiwKLQkJCQlwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50LCBwQWQtPlJ4QW50LlBhaXIxU2Vjb25kYXJ5UnhBbnQpKTsKLQotCQkJQXNpY1NldFJ4QW50KHBBZCwgcEFkLT5SeEFudC5QYWlyMVNlY29uZGFyeVJ4QW50KTsKLQotCQkJcEFkLT5SeEFudC5FdmFsdWF0ZVBlcmlvZCA9IDE7IC8vIDE6TWVhbnMgc3dpdGNoIHRvIFNlY29uZGFyeVJ4QW50LCAwOk1lYW5zIHN3aXRjaCB0byBQYWlyMVByaW1hcnlSeEFudAotCQkJcEFkLT5SeEFudC5GaXJzdFBrdEFycml2ZWRXaGVuRXZhbHVhdGUgPSBGQUxTRTsKLQkJCXBBZC0+UnhBbnQuUmN2UGt0TnVtV2hlbkV2YWx1YXRlID0gMDsKLQotCQkJLy8gYSBvbmUtc2hvdCB0aW1lciB0byBlbmQgdGhlIGV2YWx1dGlvbgotCQkJLy8gZHluYW1pYyBhZGp1c3QgYW50ZW5uYSBldmFsdWF0aW9uIHBlcmlvZCBhY2NvcmRpbmcgdG8gdGhlIHRyYWZmaWMKLQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCi0JCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUnhBbnRFdmFsVGltZXIsIDEwMCk7Ci0JCQllbHNlCi0JCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUnhBbnRFdmFsVGltZXIsIDMwMCk7Ci0JCX0KLQkJZWxzZQotI2VuZGlmIC8vIEFOVF9ESVZFUlNJVFlfU1VQUE9SVCAvLwotCXsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCi0JCQlpZiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKQotCQkJCXJldHVybjsKLQotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQUjMpOwotCQkJQkJQUjMgJj0gKH4weDE4KTsKLQkJCWlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMykKLQkJCXsKLQkJCQlCQlBSMyB8PSAoMHgxMCk7Ci0JCQl9Ci0JCQllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKLQkJCXsKLQkJCQlCQlBSMyB8PSAoMHg4KTsKLQkJCX0KLQkJCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQotCQkJewotCQkJCUJCUFIzIHw9ICgweDApOwotCQkJfQotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQkJQUjMpOwotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCXBBZC0+U3RhQ2ZnLkJCUFIzID0gQkJQUjM7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpCi0JCQkpCi0JCQl7Ci0JCQkJVUxPTkcJVHhUb3RhbENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArCi0JCQkJCQkJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKLQkJCQkJCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7Ci0KLQkJCQkvLyBkeW5hbWljIGFkanVzdCBhbnRlbm5hIGV2YWx1YXRpb24gcGVyaW9kIGFjY29yZGluZyB0byB0aGUgdHJhZmZpYwotCQkJCWlmIChUeFRvdGFsQ250ID4gNTApCi0JCQkJewotCQkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SeEFudEV2YWxUaW1lciwgMjApOwotCQkJCQlwQWQtPk1sbWUuYkxvd1Rocm91Z2hwdXQgPSBGQUxTRTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUnhBbnRFdmFsVGltZXIsIDMwMCk7Ci0JCQkJCXBBZC0+TWxtZS5iTG93VGhyb3VnaHB1dCA9IFRSVUU7Ci0JCQkJfQotCQkJfQotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JfQotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIFJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgICAgIEFmdGVyIGV2YWx1YXRpb24sIGNoZWNrIGFudGVubmEgbGluayBzdGF0dXMKLQotICAgIEFyZ3VtZW50czoKLSAgICAgICAgcEFkICAgICAgICAgLSBBZGFwdGVyIHBvaW50ZXIKLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgTm9uZQotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBc2ljUnhBbnRFdmFsVGltZW91dCgKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCi17Ci0JUlRNUF9BREFQVEVSCSpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OwotCUJPT0xFQU4JCQliU3dhcEFudCA9IEZBTFNFOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCVVDSEFSCQkJQkJQUjMgPSAwOwotCUNIQVIJCQlsYXJnZXIgPSAtMTI3LCByc3NpMCwgcnNzaTEsIHJzc2kyOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgUkFMSU5LX0FURQotCWlmIChBVEVfT04ocEFkKSkKLQkJcmV0dXJuOwotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MJfAotCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUwl8Ci0JCQkJCQkJZlJUTVBfQURBUFRFUl9SQURJT19PRkYJCQl8Ci0JCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSB8fAotCQkJCQkJCU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkKLSNpZmRlZiBSVDMwOTAKLQkJCQkJCQl8fCAocEFkLT5iUENJY2xrT2ZmID09IFRSVUUpCi0jZW5kaWYgLy8gUlQzMDkwIC8vCi0jaWZkZWYgQU5UX0RJVkVSU0lUWV9TVVBQT1JUCi0JCQkJCQkJfHwgKHBBZC0+RWVwcm9tQWNjZXNzKQotI2VuZGlmIC8vIEFOVF9ESVZFUlNJVFlfU1VQUE9SVCAvLwotCQkJCQkJCSkKLQkJcmV0dXJuOwotCi0jaWZkZWYgQU5UX0RJVkVSU0lUWV9TVVBQT1JUCi0JaWYgKChwQWQtPk5pY0NvbmZpZzIuZmllbGQuQW50RGl2ZXJzaXR5KSAmJiAocEFkLT5Db21tb25DZmcuYlJ4QW50RGl2ZXJzaXR5ID09IEFOVF9ESVZFUlNJVFlfRU5BQkxFKSkKLQl7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCWlmICgocEFkLT5SeEFudC5SY3ZQa3ROdW1XaGVuRXZhbHVhdGUgIT0gMCkgJiYgKHBBZC0+UnhBbnQuUGFpcjFBdmdSc3NpW3BBZC0+UnhBbnQuUGFpcjFTZWNvbmRhcnlSeEFudF0gPj0gcEFkLT5SeEFudC5QYWlyMUF2Z1Jzc2lbcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudF0pKQotCQkJCWJTd2FwQW50ID0gVFJVRTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJaWYgKGJTd2FwQW50ID09IFRSVUUpCi0JCQl7Ci0JCQkJVUNIQVIJCQl0ZW1wOwotCi0JCQkJLy8KLQkJCQkvLyBzZWxlY3QgUHJpbWFyeVJ4QW50UGFpcgotCQkJCS8vICAgIFJvbGUgY2hhbmdlLCBVc2VkIFBhaXIxU2Vjb25kYXJ5UnhBbnQgYXMgUHJpbWFyeVJ4QW50UGFpci4KLQkJCQkvLyAgICBTaW5jZSBQYWlyMVNlY29uZGFyeVJ4QW50IFF1YWxpdHkgZ29vZCB0aGFuIFBhaXIxUHJpbWFyeVJ4QW50Ci0JCQkJLy8KLQkJCQl0ZW1wID0gcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudDsKLQkJCQlwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50ID0gcEFkLT5SeEFudC5QYWlyMVNlY29uZGFyeVJ4QW50OwotCQkJCXBBZC0+UnhBbnQuUGFpcjFTZWNvbmRhcnlSeEFudCA9IHRlbXA7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCQlwQWQtPlJ4QW50LlBhaXIxTGFzdEF2Z1Jzc2kgPSAocEFkLT5SeEFudC5QYWlyMUF2Z1Jzc2lbcEFkLT5SeEFudC5QYWlyMVNlY29uZGFyeVJ4QW50XSA+PiAzKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLS8vCQkJCXBBZC0+UnhBbnQuRXZhbHVhdGVTdGFibGVDbnQgPSAwOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vIGlmIHRoZSBldmFsdWF0ZWQgYW50ZW5uYSBpcyBub3QgYmV0dGVyIHRoYW4gb3JpZ2luYWwsIHN3aXRjaCBiYWNrIHRvIG9yaWdpbmFsIGFudGVubmEKLQkJCQlBc2ljU2V0UnhBbnQocEFkLCBwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50KTsKLQkJCQlwQWQtPlJ4QW50LkV2YWx1YXRlU3RhYmxlQ250ICsrOwotCQkJfQotCi0JCQlwQWQtPlJ4QW50LkV2YWx1YXRlUGVyaW9kID0gMDsgLy8gMTpNZWFucyBzd2l0Y2ggdG8gU2Vjb25kYXJ5UnhBbnQsIDA6TWVhbnMgc3dpdGNoIHRvIFBhaXIxUHJpbWFyeVJ4QW50Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXNpY1J4QW50RXZhbEFjdGlvbjo6QWZ0ZXIgRXZhbChmaXggaW4gIyVkKSwgPCVkLCAlZD4sIFJjdlBrdE51bVdoZW5FdmFsdWF0ZT0lbGRcbiIsCi0JCQkJCXBBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQsIChwQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVswXSA+PiAzKSwgKHBBZC0+UnhBbnQuUGFpcjFBdmdSc3NpWzFdID4+IDMpLCBwQWQtPlJ4QW50LlJjdlBrdE51bVdoZW5FdmFsdWF0ZSkpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQl9Ci0JCWVsc2UKLSNlbmRpZiAvLyBBTlRfRElWRVJTSVRZX1NVUFBPUlQgLy8KLQl7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCWlmIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpCi0JCQkJcmV0dXJuOwotCi0KLQkJCS8vIGlmIHRoZSB0cmFmZmljIGlzIGxvdywgdXNlIGF2ZXJhZ2UgcnNzaSBhcyB0aGUgY3JpdGVyaWEKLQkJCWlmIChwQWQtPk1sbWUuYkxvd1Rocm91Z2hwdXQgPT0gVFJVRSkKLQkJCXsKLQkJCQlyc3NpMCA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwOwotCQkJCXJzc2kxID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTE7Ci0JCQkJcnNzaTIgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMjsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlyc3NpMCA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTA7Ci0JCQkJcnNzaTEgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxOwotCQkJCXJzc2kyID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMjsKLQkJCX0KLQotCQkJaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKQotCQkJewotCQkJCWxhcmdlciA9IG1heChyc3NpMCwgcnNzaTEpOwotCi0JCQkJaWYgKGxhcmdlciA+IChyc3NpMiArIDIwKSkKLQkJCQkJcEFkLT5NbG1lLlJlYWxSeFBhdGggPSAyOwotCQkJCWVsc2UKLQkJCQkJcEFkLT5NbG1lLlJlYWxSeFBhdGggPSAzOwotCQkJfQotCQkJZWxzZSBpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCi0JCQl7Ci0JCQkJaWYgKHJzc2kwID4gKHJzc2kxICsgMjApKQotCQkJCQlwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9IDE7Ci0JCQkJZWxzZQotCQkJCQlwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9IDI7Ci0JCQl9Ci0KLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJCUFIzKTsKLQkJCUJCUFIzICY9ICh+MHgxOCk7Ci0JCQlpZihwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9PSAzKQotCQkJewotCQkJCUJCUFIzIHw9ICgweDEwKTsKLQkJCX0KLQkJCWVsc2UgaWYocEFkLT5NbG1lLlJlYWxSeFBhdGggPT0gMikKLQkJCXsKLQkJCQlCQlBSMyB8PSAoMHg4KTsKLQkJCX0KLQkJCWVsc2UgaWYocEFkLT5NbG1lLlJlYWxSeFBhdGggPT0gMSkKLQkJCXsKLQkJCQlCQlBSMyB8PSAoMHgwKTsKLQkJCX0KLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJCUFIzKTsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJCXBBZC0+U3RhQ2ZnLkJCUFIzID0gQkJQUjM7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQl9Ci19Ci0KLQotVk9JRCBBUFNEUGVyaW9kaWNFeGVjKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKLXsKLQlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7Ci0KLQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJcmV0dXJuOwotCi0JcEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQrKzsKLQotLy8gRHJpdmVyIHNob3VsZCBub3Qgc2VuZCB0cmlnZ2VyIGZyYW1lLCBpdCBzaG91bGQgYmUgc2VuZCBieSBhcHBsaWNhdGlvbiBsYXllcgotLyoKLQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlCi0JCSYmIChwQWQtPkNvbW1vbkNmZy5iTmVlZFNlbmRUcmlnZ2VyRnJhbWUgfHwKLQkJKCgocEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQlMjApID09IDE5KSAmJiAoIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUgfHwgIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgfHwgIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgfHwgIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8pKSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNlbmRpbmcgdHJpZ2dlciBmcmFtZSBhbmQgZW50ZXIgc2VydmljZSBwZXJpb2Qgd2hlbiBzdXBwb3J0IEFQU0RcbiIpKTsKLQkJUlRNUFNlbmROdWxsRnJhbWUocEFkLCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsIFRSVUUpOwotCQlwQWQtPkNvbW1vbkNmZy5iTmVlZFNlbmRUcmlnZ2VyRnJhbWUgPSBGQUxTRTsKLQkJcEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQgPSAwOwotCQlwQWQtPkNvbW1vbkNmZy5iSW5TZXJ2aWNlUGVyaW9kID0gVFJVRTsKLQl9Ki8KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQvcmVzZXQgTUFDIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gYlBpZ2d5QmFjayBwYXJhbWV0ZXIKLQotICAgIEFyZ3VtZW50czoKLSAgICAgICAgcEFkICAgICAgICAgLSBBZGFwdGVyIHBvaW50ZXIKLSAgICAgICAgYlBpZ2d5QmFjayAgLSBFbmFibGUgLyBEaXNhYmxlIFBpZ2d5LUJhY2sKLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgTm9uZQotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QU2V0UGlnZ3lCYWNrKAotICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOIEJPT0xFQU4gICAgICAgICAgYlBpZ2d5QmFjaykKLXsKLQlUWF9MSU5LX0NGR19TVFJVQyAgVHhMaW5rQ2ZnOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBUWF9MSU5LX0NGRywgJlR4TGlua0NmZy53b3JkKTsKLQotCVR4TGlua0NmZy5maWVsZC5UeENGQWNrRW4gPSBiUGlnZ3lCYWNrOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0xJTktfQ0ZHLCBUeExpbmtDZmcud29yZCk7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICAgICAgY2hlY2sgaWYgdGhpcyBlbnRyeSBuZWVkIHRvIHN3aXRjaCByYXRlIGF1dG9tYXRpY2FsbHkKLQotICAgIEFyZ3VtZW50czoKLSAgICAgICAgcEFkCi0gICAgICAgIHBFbnRyeQotCi0gICAgUmV0dXJuIFZhbHVlOgotICAgICAgICBUVVJFCi0gICAgICAgIEZBTFNFCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1CT09MRUFOIFJUTVBDaGVja0VudHJ5RW5hYmxlQXV0b1JhdGVTd2l0Y2goCi0JSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnkpCi17Ci0JQk9PTEVBTgkJcmVzdWx0ID0gVFJVRTsKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCS8vIG9ubHkgYXNzb2NpYXRlZCBTVEEgY291bnRzCi0JCWlmIChwRW50cnkgJiYgKHBFbnRyeS0+VmFsaWRBc0NMSSkgJiYgKHBFbnRyeS0+U3N0ID09IFNTVF9BU1NPQykpCi0JCXsKLQkJcmVzdWx0ID0gcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2g7Ci0JfQotCQllbHNlCi0JCQlyZXN1bHQgPSBGQUxTRTsKLQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQlpZiAocEVudHJ5ICYmIChwRW50cnktPlZhbGlkQXNEbHMpKQotCQkJcmVzdWx0ID0gcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2g7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotQk9PTEVBTiBSVE1QQXV0b1JhdGVTd2l0Y2hDaGVjaygKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCkKLXsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlpZiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2gpCi0JCQlyZXR1cm4gVFJVRTsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JcmV0dXJuIEZBTFNFOwotfQotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICAgICAgY2hlY2sgaWYgdGhpcyBlbnRyeSBuZWVkIHRvIGZpeCB0eCBsZWdhY3kgcmF0ZQotCi0gICAgQXJndW1lbnRzOgotICAgICAgICBwQWQKLSAgICAgICAgcEVudHJ5Ci0KLSAgICBSZXR1cm4gVmFsdWU6Ci0gICAgICAgIFRVUkUKLSAgICAgICAgRkFMU0UKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVDSEFSIFJUTVBTdGFGaXhlZFR4TW9kZSgKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQlJTiBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSkKLXsKLQlVQ0hBUgl0eF9tb2RlID0gRklYRURfVFhNT0RFX0hUOwotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJdHhfbW9kZSA9IChVQ0hBUilwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCXJldHVybiB0eF9tb2RlOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIFJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgICAgIE92ZXJ3cml0ZSBIVCBUeCBNb2RlIGJ5IEZpeGVkIExlZ2VuY3kgVHggTW9kZSwgaWYgc3BlY2lmaWVkLgotCi0gICAgQXJndW1lbnRzOgotICAgICAgICBwQWQKLSAgICAgICAgcEVudHJ5Ci0KLSAgICBSZXR1cm4gVmFsdWU6Ci0gICAgICAgIFRVUkUKLSAgICAgICAgRkFMU0UKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygKLQkJVUNIQVIJCQkJZml4ZWRfdHhfbW9kZSwKLQkJUE1BQ19UQUJMRV9FTlRSWQlwRW50cnkpCi17Ci0JSFRUUkFOU01JVF9TRVRUSU5HIFRyYW5zbWl0U2V0dGluZzsKLQotCWlmIChmaXhlZF90eF9tb2RlID09IEZJWEVEX1RYTU9ERV9IVCkKLQkJcmV0dXJuOwotCi0JVHJhbnNtaXRTZXR0aW5nLndvcmQgPSAwOwotCi0JVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1PREUgPSBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFOwotCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1M7Ci0KLQlpZiAoZml4ZWRfdHhfbW9kZSA9PSBGSVhFRF9UWE1PREVfQ0NLKQotCXsKLQkJVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKLQkJLy8gQ0NLIG1vZGUgYWxsb3cgTUNTIDB+MwotCQlpZiAoVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA+IE1DU18zKQotCQkJVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18zOwotCX0KLQllbHNlCi0JewotCQlUcmFuc21pdFNldHRpbmcuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJLy8gT0ZETSBtb2RlIGFsbG93IE1DUyAwfjcKLQkJaWYgKFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPiBNQ1NfNykKLQkJCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNzsKLQl9Ci0KLQlpZiAocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBUcmFuc21pdFNldHRpbmcuZmllbGQuTU9ERSkKLQl7Ci0JCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBUcmFuc21pdFNldHRpbmcud29yZDsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZyA6IHdjaWQtJWQsIE1PREU9JXMsIE1DUz0lZCBcbiIsCi0JCQkJcEVudHJ5LT5BaWQsIEdldFBoeU1vZGUocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSksIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUykpOwotCX0KLX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlkeW5hbWljIHR1bmUgQkJQIFI2NiB0byBmaW5kIGEgYmFsYW5jZSBiZXR3ZWVuIHNlbnNpYmlsaXR5IGFuZAotCQlub2lzZSBpc29sYXRpb24KLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljU3RhQmJwVHVuaW5nKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVVDSEFSCU9yaWdSNjZWYWx1ZSA9IDAsIFI2NjsvLywgUjY2VXBwZXJCb3VuZCA9IDB4MzAsIFI2Nkxvd2VyQm91bmQgPSAweDMwOwotCUNIQVIJUnNzaTsKLQotCS8vIDI4NjBDIGRpZCBub3Qgc3VwcG9ydCBGYXNlIENDQSwgdGhlcmVmb3JlIGNhbid0IHR1bmUKLQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCi0JCXJldHVybjsKLQotCS8vCi0JLy8gd29yayBhcyBhIFNUQQotCS8vCi0JaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKSAgLy8gbm8gUjY2IHR1bmluZyB3aGVuIFNDQU5OSU5HCi0JCXJldHVybjsKLQotCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLQkJJiYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKQotCQkJKQotCQkmJiAhKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCSYmIChwQWQtPmJQQ0ljbGtPZmYgPT0gRkFMU0UpCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JCSkKLQl7Ci0JCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsICZPcmlnUjY2VmFsdWUpOwotCQlSNjYgPSBPcmlnUjY2VmFsdWU7Ci0KLQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPiAxKQotCQkJUnNzaSA9IChwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwICsgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSkgPj4gMTsKLQkJZWxzZQotCQkJUnNzaSA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTA7Ci0KLQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKLQkJewkvL0JHIGJhbmQKLSNpZmRlZiBSVDMweHgKLQkJCS8vIFJUMzA3MCBpcyBhIG5vIExOQSBzb2x1dGlvbiwgaXQgc2hvdWxkIGhhdmUgZGlmZmVyZW50IGNvbnRyb2wgcmVnYXJkaW5nIHRvIEFHQyBnYWluIGNvbnRyb2wKLQkJCS8vIE90aGVyd2lzZSwgaXQgd2lsbCBoYXZlIHNvbWUgdGhyb3VnaHB1dCBzaWRlIGVmZmVjdCB3aGVuIGxvdyBSU1NJCi0KLQkJCWlmIChJU19SVDMwNzAocEFkKXx8SVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpCi0JCQl7Ci0JCQkJaWYgKFJzc2kgPiBSU1NJX0ZPUl9NSURfTE9XX1NFTlNJQklMSVRZKQotCQkJCXsKLQkJCQkJUjY2ID0gMHgxQyArIDIqR0VUX0xOQV9HQUlOKHBBZCkgKyAweDIwOwotCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKLQkJCQkJewotCQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCVI2NiA9IDB4MUMgKyAyKkdFVF9MTkFfR0FJTihwQWQpOwotCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKLQkJCQkJewotCQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotI2VuZGlmIC8vIFJUMzB4eCAvLwotCQkJewotCQkJCWlmIChSc3NpID4gUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWSkKLQkJCQl7Ci0JCQkJCVI2NiA9ICgweDJFICsgR0VUX0xOQV9HQUlOKHBBZCkpICsgMHgxMDsKLQkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCi0JCQkJCXsKLQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCVI2NiA9IDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKTsKLQkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCi0JCQkJCXsKLQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewkvL0EgYmFuZAotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV18yMCkKLQkJCXsKLQkJCQlpZiAoUnNzaSA+IFJTU0lfRk9SX01JRF9MT1dfU0VOU0lCSUxJVFkpCi0JCQkJewotCQkJCQlSNjYgPSAweDMyICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzMgKyAweDEwOwotCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKLQkJCQkJewotCQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCVI2NiA9IDB4MzIgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMzsKLQkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCi0JCQkJCXsKLQkJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAoUnNzaSA+IFJTU0lfRk9SX01JRF9MT1dfU0VOU0lCSUxJVFkpCi0JCQkJewotCQkJCQlSNjYgPSAweDNBICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzMgKyAweDEwOwotCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKLQkJCQkJewotCQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCVI2NiA9IDB4M0EgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMzsKLQkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCi0JCQkJCXsKLQkJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0KLQl9Ci19Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLVZPSUQgUlRNUFNldEFHQ0luaXRWYWx1ZSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVQ0hBUgkJCUJhbmRXaWR0aCkKLXsKLQlVQ0hBUglSNjYgPSAweDMwOwotCi0JaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKLQl7CS8vIEJHIGJhbmQKLSNpZmRlZiBSVDMweHgKLQkJLyogR2FyeSB3YXMgdmVyaWZpZWQgQW1hem9uIEFQIGFuZCBmaW5kIHRoYXQgUlQzMDd4IGhhcyBCQlBfUjY2IGludmFsaWQgZGVmYXVsdCB2YWx1ZSAqLwotCi0JCWlmIChJU19SVDMwNzAocEFkKXx8SVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpCi0JCXsKLQkJCVI2NiA9IDB4MUMgKyAyKkdFVF9MTkFfR0FJTihwQWQpOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7Ci0JCX0KLQkJZWxzZQotI2VuZGlmIC8vIFJUMzB4eCAvLwotCQl7Ci0JCQlSNjYgPSAweDJFICsgR0VUX0xOQV9HQUlOKHBBZCk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKLQkJfQotCX0KLQllbHNlCi0JewkvL0EgYmFuZAotCQl7Ci0JCQlpZiAoQmFuZFdpZHRoID09IEJXXzIwKQotCQkJewotCQkJCVI2NiA9IChVQ0hBUikoMHgzMiArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zKTsKLQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKLQkJCX0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCWVsc2UKLQkJCXsKLQkJCQlSNjYgPSAoVUNIQVIpKDB4M0EgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMyk7Ci0JCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7Ci0JCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL21sbWVfZXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL21sbWVfZXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdmYjdmNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9tbG1lX2V4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQltbG1lX2V4LmMKLQotCUFic3RyYWN0OgotCU1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLQktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlGb25jaGkJCTIwMDctMDYtMjUJCUV4dGVuZCBvcmlnaW5hbCBtbG1lIEFQSXMgdG8gc3VwcG9ydCBtdWx0aS1lbnRyaWVzCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0jaW5jbHVkZSAiLi4vbWxtZV9leF9kZWYuaCIKLS8vI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIHN0YXRlX21hY2hpbmUKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLyohIFxicmllZiBJbml0aWFsaXplIHRoZSBzdGF0ZSBtYWNoaW5lLgotICogIFxwYXJhbSAqUyAgICAgICAgICAgcG9pbnRlciB0byB0aGUgc3RhdGUgbWFjaGluZQotICogIFxwYXJhbSAgVHJhbnMgICAgICAgU3RhdGUgbWFjaGluZSB0cmFuc2l0aW9uIGZ1bmN0aW9uCi0gKiAgXHBhcmFtICBTdE5yICAgICAgICBudW1iZXIgb2Ygc3RhdGVzCi0gKiAgXHBhcmFtICBNc2dOciAgICAgICBudW1iZXIgb2YgbWVzc2FnZXMKLSAqICBccGFyYW0gIERlZkZ1bmMgICAgIGRlZmF1bHQgZnVuY3Rpb24sIHdoZW4gdGhlcmUgaXMgaW52YWxpZCBzdGF0ZS9tZXNzYWdlIGNvbWJpbmF0aW9uCi0gKiAgXHBhcmFtICBJbml0U3RhdGUgICBpbml0aWFsIHN0YXRlIG9mIHRoZSBzdGF0ZSBtYWNoaW5lCi0gKiAgXHBhcmFtICBCYXNlICAgICAgICBTdGF0ZU1hY2hpbmUgYmFzZSwgaW50ZXJuYWwgdXNlIG9ubHkKLSAqICBccHJlIHBfc20gc2hvdWxkIGJlIGEgbGVnYWwgcG9pbnRlcgotICogIFxwb3N0Ci0gKi8KLVZPSUQgU3RhdGVNYWNoaW5lSW5pdEV4KAotCUlOIFNUQVRFX01BQ0hJTkVfRVggKlMsCi0JSU4gU1RBVEVfTUFDSElORV9GVU5DX0VYIFRyYW5zW10sCi0JSU4gVUxPTkcgU3ROciwKLQlJTiBVTE9ORyBNc2dOciwKLQlJTiBTVEFURV9NQUNISU5FX0ZVTkNfRVggRGVmRnVuYywKLQlJTiBVTE9ORyBJbml0U3RhdGUsCi0JSU4gVUxPTkcgQmFzZSkKLXsKLQlVTE9ORyBpLCBqOwotCi0JLy8gc2V0IG51bWJlciBvZiBzdGF0ZXMgYW5kIG1lc3NhZ2VzCi0JUy0+TnJTdGF0ZSA9IFN0TnI7Ci0JUy0+TnJNc2cgICA9IE1zZ05yOwotCVMtPkJhc2UgICAgPSBCYXNlOwotCi0JUy0+VHJhbnNGdW5jICA9IFRyYW5zOwotCi0JLy8gaW5pdCBhbGwgc3RhdGUgdHJhbnNpdGlvbiB0byBkZWZhdWx0IGZ1bmN0aW9uCi0JZm9yIChpID0gMDsgaSA8IFN0TnI7IGkrKykKLQl7Ci0JCWZvciAoaiA9IDA7IGogPCBNc2dOcjsgaisrKQotCQl7Ci0JCQlTLT5UcmFuc0Z1bmNbaSAqIE1zZ05yICsgal0gPSBEZWZGdW5jOwotCQl9Ci0JfQotCi0JLy8gc2V0IHRoZSBzdGFydGluZyBzdGF0ZQotCVMtPkN1cnJTdGF0ZSA9IEluaXRTdGF0ZTsKLQotCXJldHVybjsKLX0KLQotLyohIFxicmllZiBUaGlzIGZ1bmN0aW9uIGZpbGxzIGluIHRoZSBmdW5jdGlvbiBwb2ludGVyIGludG8gdGhlIGNlbGwgaW4gdGhlIHN0YXRlIG1hY2hpbmUKLSAqICBccGFyYW0gKlMgICBwb2ludGVyIHRvIHRoZSBzdGF0ZSBtYWNoaW5lCi0gKiAgXHBhcmFtIFN0ICAgc3RhdGUKLSAqICBccGFyYW0gTXNnICBpbmNvbWluZyBtZXNzYWdlCi0gKiAgXHBhcmFtIGYgICAgdGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gKHN0YXRlLCBtZXNzYWdlKSBjb21iaW5hdGlvbiBvY2N1cnMgYXQgdGhlIHN0YXRlIG1hY2hpbmUKLSAqICBccHJlICpTIHNob3VsZCBiZSBhIGxlZ2FsIHBvaW50ZXIgdG8gdGhlIHN0YXRlIG1hY2hpbmUsIHN0LCBtc2csIHNob3VsZCBiZSBhbGwgd2l0aGluIHRoZSByYW5nZSwgQmFzZSBzaG91bGQgYmUgc2V0IGluIHRoZSBpbml0aWFsIHN0YXRlCi0gKiAgXHBvc3QKLSAqLwotVk9JRCBTdGF0ZU1hY2hpbmVTZXRBY3Rpb25FeCgKLQlJTiBTVEFURV9NQUNISU5FX0VYICpTLAotCUlOIFVMT05HIFN0LAotCUlOIFVMT05HIE1zZywKLQlJTiBTVEFURV9NQUNISU5FX0ZVTkNfRVggRnVuYykKLXsKLQlVTE9ORyBNc2dJZHg7Ci0KLQlNc2dJZHggPSBNc2cgLSBTLT5CYXNlOwotCi0JaWYgKFN0IDwgUy0+TnJTdGF0ZSAmJiBNc2dJZHggPCBTLT5Ock1zZykKLQl7Ci0JCS8vIGJvdW5kYXJ5IGNoZWNraW5nIGJlZm9yZSBzZXR0aW5nIHRoZSBhY3Rpb24KLQkJUy0+VHJhbnNGdW5jW1N0ICogUy0+TnJNc2cgKyBNc2dJZHhdID0gRnVuYzsKLQl9Ci0KLQlyZXR1cm47Ci19Ci0KLS8qISBcYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHN0YXRlIHRyYW5zaXRpb24KLSAqICBccGFyYW0gICAqQWRhcHRlciB0aGUgTklDIGFkYXB0ZXIgcG9pbnRlcgotICogIFxwYXJhbSAgICpTICAgICAgIHRoZSBzdGF0ZSBtYWNoaW5lCi0gKiAgXHBhcmFtICAgKkVsZW0gICAgdGhlIG1lc3NhZ2UgdG8gYmUgZXhlY3V0ZWQKLSAqICBccmV0dXJuICAgTm9uZQotICovCi1WT0lEIFN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb25FeCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBTVEFURV9NQUNISU5FX0VYICpTLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSwKLQlVU0hPUlQgSWR4LAotCVBVTE9ORyBwQ3VyclN0YXRlKQotewotCWlmIChTLT5UcmFuc0Z1bmNbKCpwQ3VyclN0YXRlKSAqIFMtPk5yTXNnICsgRWxlbS0+TXNnVHlwZSAtIFMtPkJhc2VdKQotCQkoKihTLT5UcmFuc0Z1bmNbKCpwQ3VyclN0YXRlKSAqIFMtPk5yTXNnICsgRWxlbS0+TXNnVHlwZSAtIFMtPkJhc2VdKSkocEFkLCBFbGVtLCBwQ3VyclN0YXRlLCBJZHgpOwotCi0JcmV0dXJuOwotfQotCi0vKiEgXGJyaWVmICAgRW5xdWV1ZSBhIG1lc3NhZ2UgZm9yIG90aGVyIHRocmVhZHMsIGlmIHRoZXkgd2FudCB0byBzZW5kIG1lc3NhZ2VzIHRvIE1MTUUgdGhyZWFkCi0gKiAgXHBhcmFtICAqUXVldWUgICAgVGhlIE1MTUUgUXVldWUKLSAqICBccGFyYW0gICBNYWNoaW5lICBUaGUgU3RhdGUgTWFjaGluZSBJZAotICogIFxwYXJhbSAgIE1zZ1R5cGUgIFRoZSBNZXNzYWdlIFR5cGUKLSAqICBccGFyYW0gICBNc2dMZW4gICBUaGUgTWVzc2FnZSBsZW5ndGgKLSAqICBccGFyYW0gICpNc2cgICAgICBUaGUgbWVzc2FnZSBwb2ludGVyCi0gKiAgXHJldHVybiAgVFJVRSBpZiBlbnF1ZXVlIGlzIHN1Y2Nlc3NmdWwsIEZBTFNFIGlmIHRoZSBxdWV1ZSBpcyBmdWxsCi0gKiAgXHByZQotICogIFxwb3N0Ci0gKiAgXG5vdGUgICAgVGhlIG1lc3NhZ2UgaGFzIHRvIGJlIGluaXRpYWxpemVkCi0gKi8KLUJPT0xFQU4gTWxtZUVucXVldWVFeCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVTE9ORyBNYWNoaW5lLAotCUlOIFVMT05HIE1zZ1R5cGUsCi0JSU4gVUxPTkcgTXNnTGVuLAotCUlOIFZPSUQgKk1zZywKLQlJTiBVU0hPUlQgSWR4KQotewotCUlOVCBUYWlsOwotCU1MTUVfUVVFVUUgKlF1ZXVlID0gKE1MTUVfUVVFVUUgKikmcEFkLT5NbG1lLlF1ZXVlOwotCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkKLQkJcmV0dXJuIEZBTFNFOwotCi0KLQkvLyBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUKLQlpZiAoTXNnTGVuID4gTUFYX0xFTl9PRl9NTE1FX0JVRkZFUikKLQl7Ci0JCURCR1BSSU5UX0VSUigoIk1sbWVFbnF1ZXVlRXg6IG1zZyB0b28gbGFyZ2UsIHNpemUgPSAlbGQgXG4iLCBNc2dMZW4pKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCWlmIChNbG1lUXVldWVGdWxsKFF1ZXVlKSkKLQl7Ci0KLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCVJUTVBfU0VNX0xPQ0soJlF1ZXVlLT5Mb2NrKTsKLQlUYWlsID0gUXVldWUtPlRhaWw7Ci0JUXVldWUtPlRhaWwrKzsKLQlRdWV1ZS0+TnVtKys7Ci0JaWYgKFF1ZXVlLT5UYWlsID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSkKLQl7Ci0JCVF1ZXVlLT5UYWlsID0gMDsKLQl9Ci0JUXVldWUtPkVudHJ5W1RhaWxdLk9jY3VwaWVkID0gVFJVRTsKLQlRdWV1ZS0+RW50cnlbVGFpbF0uTWFjaGluZSA9IE1hY2hpbmU7Ci0JUXVldWUtPkVudHJ5W1RhaWxdLk1zZ1R5cGUgPSBNc2dUeXBlOwotCVF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2dMZW4gPSBNc2dMZW47Ci0JUXVldWUtPkVudHJ5W1RhaWxdLklkeCA9IElkeDsKLQlpZiAoTXNnICE9IE5VTEwpCi0JCU5kaXNNb3ZlTWVtb3J5KFF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2csIE1zZywgTXNnTGVuKTsKLQotCVJUTVBfU0VNX1VOTE9DSygmUXVldWUtPkxvY2spOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgVGhlIGRyb3AgZnVuY3Rpb24sIHdoZW4gbWFjaGluZSBleGVjdXRlcyB0aGlzLCB0aGUgbWVzc2FnZSBpcyBzaW1wbHkKLSAgICAgICAgaWdub3JlZC4gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcsIHRoZSBtZXNzYWdlIGlzIGZyZWVkIGluCi0gICAgICAgIFN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24oKQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgRHJvcEV4KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSwKLQlQVUxPTkcgcEN1cnJTdGF0ZSwKLQlVU0hPUlQgSWR4KQotewotCXJldHVybjsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL25ldGlmX2Jsb2NrLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9uZXRpZl9ibG9jay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTcyOTU3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL25ldGlmX2Jsb2NrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNpZmRlZiBCTE9DS19ORVRfSUYKLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotI2luY2x1ZGUgIi4uL25ldGlmX2Jsb2NrLmgiCi0KLQotc3RhdGljIE5FVElGX0VOVFJZIGZyZWVOZXRJZkVudHJ5UG9vbFtGUkVFX05FVElGX1BPT0xfU0laRV07Ci1zdGF0aWMgTElTVF9IRUFERVIgZnJlZU5ldElmRW50cnlMaXN0OwotCi12b2lkIGluaXRibG9ja1F1ZXVlVGFiKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCWludCBpOwotCi0JaW5pdExpc3QoJmZyZWVOZXRJZkVudHJ5TGlzdCk7Ci0JZm9yIChpID0gMDsgaSA8IEZSRUVfTkVUSUZfUE9PTF9TSVpFOyBpKyspCi0JCWluc2VydFRhaWxMaXN0KCZmcmVlTmV0SWZFbnRyeUxpc3QsIChQTElTVF9FTlRSWSkmZnJlZU5ldElmRW50cnlQb29sW2ldKTsKLQotCWZvciAoaT0wOyBpIDwgTlVNX09GX1RYX1JJTkc7IGkrKykKLQkJaW5pdExpc3QoJnBBZC0+YmxvY2tRdWV1ZVRhYltpXS5OZXRJZkxpc3QpOwotCi0JcmV0dXJuOwotfQotCi1CT09MRUFOIGJsb2NrTmV0SWYoCi0JSU4gUEJMT0NLX1FVRVVFX0VOVFJZIHBCbG9ja1F1ZXVlRW50cnksCi0JSU4gUE5FVF9ERVYgcE5ldERldikKLXsKLQlQTkVUSUZfRU5UUlkgcE5ldElmRW50cnkgPSBOVUxMOwotCi0JaWYgKChwTmV0SWZFbnRyeSA9IChQTkVUSUZfRU5UUlkpcmVtb3ZlSGVhZExpc3QoJmZyZWVOZXRJZkVudHJ5TGlzdCkpICE9IE5VTEwpCi0JewotCQlSVE1QX09TX05FVERFVl9TVE9QX1FVRVVFKHBOZXREZXYpOwotCQlwTmV0SWZFbnRyeS0+cE5ldERldiA9IHBOZXREZXY7Ci0JCWluc2VydFRhaWxMaXN0KCZwQmxvY2tRdWV1ZUVudHJ5LT5OZXRJZkxpc3QsIChQTElTVF9FTlRSWSlwTmV0SWZFbnRyeSk7Ci0KLQkJcEJsb2NrUXVldWVFbnRyeS0+U3dUeFF1ZXVlQmxvY2tGbGFnID0gVFJVRTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUF9PU19ORVRERVZfU1RPUF9RVUVVRSglcylcbiIsIFJUTVBfT1NfTkVUREVWX0dFVF9ERVZOQU1FKHBOZXREZXYpKSk7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLVZPSUQgcmVsZWFzZU5ldElmKAotCUlOIFBCTE9DS19RVUVVRV9FTlRSWSBwQmxvY2tRdWV1ZUVudHJ5KQotewotCVBORVRJRl9FTlRSWSBwTmV0SWZFbnRyeSA9IE5VTEw7Ci0JUExJU1RfSEVBREVSIHBOZXRJZkxpc3QgPSAmcEJsb2NrUXVldWVFbnRyeS0+TmV0SWZMaXN0OwotCi0Jd2hpbGUoKHBOZXRJZkVudHJ5ID0gKFBORVRJRl9FTlRSWSlyZW1vdmVIZWFkTGlzdChwTmV0SWZMaXN0KSkgIT0gIE5VTEwpCi0JewotCQlQTkVUX0RFViBwTmV0RGV2ID0gcE5ldElmRW50cnktPnBOZXREZXY7Ci0JCVJUTVBfT1NfTkVUREVWX1dBS0VfUVVFVUUocE5ldERldik7Ci0JCWluc2VydFRhaWxMaXN0KCZmcmVlTmV0SWZFbnRyeUxpc3QsIChQTElTVF9FTlRSWSlwTmV0SWZFbnRyeSk7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUF9PU19ORVRERVZfV0FLRV9RVUVVRSglcylcbiIsIFJUTVBfT1NfTkVUREVWX0dFVF9ERVZOQU1FKHBOZXREZXYpKSk7Ci0JfQotCXBCbG9ja1F1ZXVlRW50cnktPlN3VHhRdWV1ZUJsb2NrRmxhZyA9IEZBTFNFOwotCXJldHVybjsKLX0KLQotCi1WT0lEIFN0b3BOZXRJZlF1ZXVlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSIFF1ZUlkeCwKLQlJTiBQTkRJU19QQUNLRVQgcFBhY2tldCkKLXsKLQlQTkVUX0RFViBOZXREZXYgPSBOVUxMOwotCVVDSEFSIElmSWR4ID0gMDsKLQlCT09MRUFOIHZhbGlkID0gRkFMU0U7Ci0KLSNpZmRlZiBBUENMSV9TVVBQT1JUCi0JaWYgKFJUTVBfR0VUX1BBQ0tFVF9ORVRfREVWSUNFKHBQYWNrZXQpID49IE1JTl9ORVRfREVWSUNFX0ZPUl9BUENMSSkKLQl7Ci0JCUlmSWR4ID0gKFJUTVBfR0VUX1BBQ0tFVF9ORVRfREVWSUNFKHBQYWNrZXQpIC0gTUlOX05FVF9ERVZJQ0VfRk9SX0FQQ0xJKSAlIE1BWF9BUENMSV9OVU07Ci0JCU5ldERldiA9IHBBZC0+QXBDZmcuQXBDbGlUYWJbSWZJZHhdLmRldjsKLQl9Ci0JZWxzZQotI2VuZGlmIC8vIEFQQ0xJX1NVUFBPUlQgLy8KLSNpZmRlZiBXRFNfU1VQUE9SVAotCWlmIChSVE1QX0dFVF9QQUNLRVRfTkVUX0RFVklDRShwUGFja2V0KSA+PSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTKQotCXsKLQkJSWZJZHggPSAoUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0UocFBhY2tldCkgLSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTKSAlIE1BWF9XRFNfRU5UUlk7Ci0JCU5ldERldiA9IHBBZC0+V2RzVGFiLldkc0VudHJ5W0lmSWR4XS5kZXY7Ci0JfQotCWVsc2UKLSNlbmRpZiAvLyBXRFNfU1VQUE9SVCAvLwotCXsKLSNpZmRlZiBNQlNTX1NVUFBPUlQKLQkJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKLQkJewotCQkJSWZJZHggPSAoUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0UocFBhY2tldCkgLSBNSU5fTkVUX0RFVklDRV9GT1JfTUJTU0lEKSAlIE1BWF9NQlNTSURfTlVNOwotCQkJTmV0RGV2ID0gcEFkLT5BcENmZy5NQlNTSURbSWZJZHhdLk1TU0lERGV2OwotCQl9Ci0JCWVsc2UKLQkJewotCQkJSWZJZHggPSBNQUlOX01CU1NJRDsKLQkJCU5ldERldiA9IHBBZC0+bmV0X2RldjsKLQkJfQotI2Vsc2UKLQkJSWZJZHggPSBNQUlOX01CU1NJRDsKLQkJTmV0RGV2ID0gcEFkLT5uZXRfZGV2OwotI2VuZGlmCi0JfQotCi0JLy8gV01NIHN1cHBvcnQgNCBzb2Z0d2FyZSBxdWV1ZXMuCi0JLy8gT25lIHNvZnR3YXJlIHF1ZXVlIGZ1bGwgZG9lc24ndCBtZWFuIGRldmljZSBoYXZlIG5vIGNhcGJpbGl0eSB0byB0cmFuc21pdCBwYWNrZXQuCi0JLy8gU28gZGlzYWJsZSBibG9jayBOZXQtSWYgcXVldWUgZnVuY3Rpb24gd2hpbGUgV01NIGVuYWJsZS4KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl2YWxpZCA9IChwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9PSBUUlVFKSA/IEZBTFNFIDogVFJVRTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCWlmICh2YWxpZCkKLQkJYmxvY2tOZXRJZigmcEFkLT5ibG9ja1F1ZXVlVGFiW1F1ZUlkeF0sIE5ldERldik7Ci0JcmV0dXJuOwotfQotCi0jZW5kaWYgLy8gQkxPQ0tfTkVUX0lGIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9ydF9jaGFubmVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9ydF9jaGFubmVsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMjM5MWUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vcnRfY2hhbm5lbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI4NyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi1DSF9GUkVRX01BUCBDSF9IWl9JRF9NQVBbXT0KLQkJewotCQkJezEsIDI0MTJ9LAotCQkJezIsIDI0MTd9LAotCQkJezMsIDI0MjJ9LAotCQkJezQsIDI0Mjd9LAotCQkJezUsIDI0MzJ9LAotCQkJezYsIDI0Mzd9LAotCQkJezcsIDI0NDJ9LAotCQkJezgsIDI0NDd9LAotCQkJezksIDI0NTJ9LAotCQkJezEwLCAyNDU3fSwKLQkJCXsxMSwgMjQ2Mn0sCi0JCQl7MTIsIDI0Njd9LAotCQkJezEzLCAyNDcyfSwKLQkJCXsxNCwgMjQ4NH0sCi0KLQkJCS8qICBVTklJICovCi0JCQl7MzYsIDUxODB9LAotCQkJezQwLCA1MjAwfSwKLQkJCXs0NCwgNTIyMH0sCi0JCQl7NDgsIDUyNDB9LAotCQkJezUyLCA1MjYwfSwKLQkJCXs1NiwgNTI4MH0sCi0JCQl7NjAsIDUzMDB9LAotCQkJezY0LCA1MzIwfSwKLQkJCXsxNDksIDU3NDV9LAotCQkJezE1MywgNTc2NX0sCi0JCQl7MTU3LCA1Nzg1fSwKLQkJCXsxNjEsIDU4MDV9LAotCQkJezE2NSwgNTgyNX0sCi0JCQl7MTY3LCA1ODM1fSwKLQkJCXsxNjksIDU4NDV9LAotCQkJezE3MSwgNTg1NX0sCi0JCQl7MTczLCA1ODY1fSwKLQotCQkJLyogSGlwZXJMQU4yICovCi0JCQl7MTAwLCA1NTAwfSwKLQkJCXsxMDQsIDU1MjB9LAotCQkJezEwOCwgNTU0MH0sCi0JCQl7MTEyLCA1NTYwfSwKLQkJCXsxMTYsIDU1ODB9LAotCQkJezEyMCwgNTYwMH0sCi0JCQl7MTI0LCA1NjIwfSwKLQkJCXsxMjgsIDU2NDB9LAotCQkJezEzMiwgNTY2MH0sCi0JCQl7MTM2LCA1NjgwfSwKLQkJCXsxNDAsIDU3MDB9LAotCi0JCQkvKiBKYXBhbiBNTUFDICovCi0JCQl7MzQsIDUxNzB9LAotCQkJezM4LCA1MTkwfSwKLQkJCXs0MiwgNTIxMH0sCi0JCQl7NDYsIDUyMzB9LAotCi0JCQkvKiAgSmFwYW4gKi8KLQkJCXsxODQsIDQ5MjB9LAotCQkJezE4OCwgNDk0MH0sCi0JCQl7MTkyLCA0OTYwfSwKLQkJCXsxOTYsIDQ5ODB9LAotCi0JCQl7MjA4LCA1MDQwfSwJLyogSmFwYW4sIG1lYW5zIEowOCAqLwotCQkJezIxMiwgNTA2MH0sCS8qIEphcGFuLCBtZWFucyBKMTIgKi8KLQkJCXsyMTYsIDUwODB9LAkvKiBKYXBhbiwgbWVhbnMgSjE2ICovCi19OwotCi1JTlQJQ0hfSFpfSURfTUFQX05VTSA9IChzaXplb2YoQ0hfSFpfSURfTUFQKS9zaXplb2YoQ0hfRlJFUV9NQVApKTsKLQotQ0hfUkVHSU9OIENoUmVnaW9uW10gPQotewotCQl7CS8vIEFudGlndWEgYW5kIEJlcmJ1ZGEKLQkJCSJBRyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEFyZ2VudGluYQotCQkJIkFSIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEFydWJhCi0JCQkiQVciLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBBdXN0cmFsaWEKLQkJCSJBVSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEF1c3RyaWEKLQkJCSJBVCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMywgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9LAkJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEJhaGFtYXMKLQkJCSJCUyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEJhcmJhZG9zCi0JCQkiQkIiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBCZXJtdWRhCi0JCQkiQk0iLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBCcmF6aWwKLQkJCSJCUiIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDE0OSwgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBCZWxnaXVtCi0JCQkiQkUiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMTgsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAxOCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEJ1bGdhcmlhCi0JCQkiQkciLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQ2FuYWRhCi0JCQkiQ0EiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBDYXltYW4gSXNMYW5kcwotCQkJIktZIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQ2hpbGUKLQkJCSJDTCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCA1LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIENoaW5hCi0JCQkiQ04iLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMTQ5LCA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIENvbG9tYmlhCi0JCQkiQ08iLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMTcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAxNDksIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQ29zdGEgUmljYQotCQkJIkNSIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDE3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxNDksIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQ3lwcnVzCi0JCQkiQ1kiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyNCwgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfSwJCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBDemVjaF9SZXB1YmxpYwotCQkJIkNaIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjMsIElET1IsIFRSVUV9LAkJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBEZW5tYXJrCi0JCQkiREsiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyMywgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfSwJCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBEb21pbmljYW4gUmVwdWJsaWMKLQkJCSJETyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAwCi0JCQkJeyAxNDksIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gRXF1YWRvcgotCQkJIkVDIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAxMDAsIDExLCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEVsIFNhbHZhZG9yCi0JCQkiU1YiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCA0LCAgIDM2LCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEZpbmxhbmQKLQkJCSJGSSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gRnJhbmNlCi0JCQkiRlIiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gR2VybWFueQotCQkJIkRFIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBHcmVlY2UKLQkJCSJHUiIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gR3VhbQotCQkJIkdVIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCi0JCQkJeyAzNiwgIDQsICAgMTcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDE0OSwgIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gR3VhdGVtYWxhCi0JCQkiR1QiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgICAxNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gSGFpdGkKLQkJCSJIVCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgIDE3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCAgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBIb25kdXJhcwotCQkJIkhOIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAxNDksICA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEhvbmcgS29uZwotCQkJIkhLIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxNDksICA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEh1bmdhcnkKLQkJCSJIVSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBJY2VsYW5kCi0JCQkiSVMiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEluZGlhCi0JCQkiSU4iLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDE0OSwJNCwgIDI0LCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBJbmRvbmVzaWEKLQkJCSJJRCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMTQ5LAk0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIElyZWxhbmQKLQkJCSJJRSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgT0RPUiwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBJc3JhZWwKLQkJCSJJTCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgIDMsICAyMCwgSURPUiwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4zCi0JCQkJeyA0LAk2LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDR+OQotCQkJCXsgMTAsCTQsICAyMCwgSURPUiwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMTB+MTMKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEl0YWx5Ci0JCQkiSVQiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gSmFwYW4KLQkJCSJKUCIsCi0JCQlKQVAsCi0JCQl7Ci0JCQkJeyAxLCAgIDE0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTQKLQkJCQl7IDM2LAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBKb3JkYW4KLQkJCSJKTyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgSURPUiwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDE0OSwJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBMYXR2aWEKLQkJCSJMViIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBMaWVjaHRlbnN0ZWluCi0JCQkiTEkiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDUyLAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBMaXRodWFuaWEKLQkJCSJMVCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBMdXhlbWJ1cmcKLQkJCSJMVSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBNYWxheXNpYQotCQkJIk1ZIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMzYsCTQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLAk0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxNDksICA1LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIE1hbHRhCi0JCQkiTVQiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gTWFyb2NjbwotCQkJIk1BIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwJNCwgIDI0LCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gTWV4aWNvCi0JCQkiTVgiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LAk0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwJNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCAgNSwgIDMwLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBOZXRoZXJsYW5kcwotCQkJIk5MIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsCTQsICAyNCwgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIE5ldyBaZWFsYW5kCi0JCQkiTloiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LAk0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwJNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCAgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBOb3J3YXkKLQkJCSJOTyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsCTQsICAyNCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLAk0LCAgMjQsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBQZXJ1Ci0JCQkiUEUiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDE0OSwgIDQsICAyNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gUG9ydHVnYWwKLQkJCSJQVCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gUG9sYW5kCi0JCQkiUEwiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFJvbWFuaWEKLQkJCSJSTyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gUnVzc2lhCi0JCQkiUlUiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDE0OSwgIDQsICAyMCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gU2F1ZGkgQXJhYmlhCi0JCQkiU0EiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gU2VyYmlhX2FuZF9Nb250ZW5lZ3JvCi0JCQkiQ1MiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFNpbmdhcG9yZQotCQkJIlNHIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxNDksICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFNsb3Zha2lhCi0JCQkiU0siLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFNsb3ZlbmlhCi0JCQkiU0kiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gU291dGggQWZyaWNhCi0JCQkiWkEiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAxNDksICA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFNvdXRoIEtvcmVhCi0JCQkiS1IiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgIDgsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjEyOAotCQkJCXsgMTQ5LCAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBTcGFpbgotCQkJIkVTIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMTcsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBTd2VkZW4KLQkJCSJTRSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gU3dpdHplcmxhbmQKLQkJCSJDSCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFRhaXdhbgotCQkJIlRXIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCi0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBUdXJrZXkKLQkJCSJUUiIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQotCQkJCXsgMzYsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gVUsKLQkJCSJHQiIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQotCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gVWtyYWluZQotCQkJIlVBIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBVbml0ZWRfQXJhYl9FbWlyYXRlcwotCQkJIkFFIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBVbml0ZWRfU3RhdGVzCi0JCQkiVVMiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDExLCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKLQkJCQl7IDM2LCAgIDQsICAxNywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDUyLCAgIDQsICAyNCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDE0OSwgIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gVmVuZXp1ZWxhCi0JCQkiVkUiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKLQkJCQl7IDE0OSwgIDQsICAyNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gRGVmYXVsdAotCQkJIiIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTEsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQotCQkJCXsgMzYsICAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgNTIsICAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAxNDksICA1LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLX07Ci0KLQotc3RhdGljIFBDSF9SRUdJT04gR2V0Q2hSZWdpb24oCi0JSU4gUFVDSEFSIENudHJ5Q29kZSkKLXsKLQlJTlQgbG9vcCA9IDA7Ci0JUENIX1JFR0lPTiBwQ2hSZWdpb24gPSBOVUxMOwotCi0Jd2hpbGUgKHN0cmNtcCgoUFNUUklORykgQ2hSZWdpb25bbG9vcF0uQ291bnRSZWcsICIiKSAhPSAwKQotCXsKLQkJaWYgKHN0cm5jbXAoKFBTVFJJTkcpIENoUmVnaW9uW2xvb3BdLkNvdW50UmVnLCAoUFNUUklORykgQ250cnlDb2RlLCAyKSA9PSAwKQotCQl7Ci0JCQlwQ2hSZWdpb24gPSAmQ2hSZWdpb25bbG9vcF07Ci0JCQlicmVhazsKLQkJfQotCQlsb29wKys7Ci0JfQotCi0JaWYgKHBDaFJlZ2lvbiA9PSBOVUxMKQotCQlwQ2hSZWdpb24gPSAmQ2hSZWdpb25bbG9vcF07Ci0JcmV0dXJuIHBDaFJlZ2lvbjsKLX0KLQotc3RhdGljIFZPSUQgQ2hCYW5kQ2hlY2soCi0JSU4gVUNIQVIgUGh5TW9kZSwKLQlPVVQgUFVDSEFSIHBDaFR5cGUpCi17Ci0Jc3dpdGNoKFBoeU1vZGUpCi0JewotCQljYXNlIFBIWV8xMUE6Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWNhc2UgUEhZXzExQU5fTUlYRUQ6Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkqcENoVHlwZSA9IEJBTkRfNUc7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWNhc2UgUEhZXzExQUdOX01JWEVEOgotCQljYXNlIFBIWV8xMUFCR05fTUlYRUQ6Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkqcENoVHlwZSA9IEJBTkRfQk9USDsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQkqcENoVHlwZSA9IEJBTkRfMjRHOwotCQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgVUNIQVIgRmlsbENoTGlzdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQQ0hfREVTUCBwQ2hEZXNwLAotCUlOIFVDSEFSIE9mZnNldCwKLQlJTiBVQ0hBUiBpbmNyZW1lbnQpCi17Ci0JSU5UIGksIGosIGw7Ci0JVUNIQVIgY2hhbm5lbDsKLQotCWogPSBPZmZzZXQ7Ci0JZm9yIChpID0gMDsgaSA8IHBDaERlc3AtPk51bU9mQ2g7IGkrKykKLQl7Ci0JCWNoYW5uZWwgPSBwQ2hEZXNwLT5GaXJzdENoYW5uZWwgKyBpICogaW5jcmVtZW50OwotCQlmb3IgKGw9MDsgbDxNQVhfTlVNX09GX0NIQU5ORUxTOyBsKyspCi0JCXsKLQkJCWlmIChjaGFubmVsID09IHBBZC0+VHhQb3dlcltsXS5DaGFubmVsKQotCQkJewotCQkJCXBBZC0+Q2hhbm5lbExpc3Rbal0uUG93ZXIgPSBwQWQtPlR4UG93ZXJbbF0uUG93ZXI7Ci0JCQkJcEFkLT5DaGFubmVsTGlzdFtqXS5Qb3dlcjIgPSBwQWQtPlR4UG93ZXJbbF0uUG93ZXIyOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChsID09IE1BWF9OVU1fT0ZfQ0hBTk5FTFMpCi0JCQljb250aW51ZTsKLQotCQlwQWQtPkNoYW5uZWxMaXN0W2pdLkNoYW5uZWwgPSBwQ2hEZXNwLT5GaXJzdENoYW5uZWwgKyBpICogaW5jcmVtZW50OwotCQlwQWQtPkNoYW5uZWxMaXN0W2pdLk1heFR4UHdyID0gcENoRGVzcC0+TWF4VHhQd3I7Ci0JCXBBZC0+Q2hhbm5lbExpc3Rbal0uRGZzUmVxID0gcENoRGVzcC0+RGZzUmVxOwotCQlqKys7Ci0JfQotCXBBZC0+Q2hhbm5lbExpc3ROdW0gPSBqOwotCi0JcmV0dXJuIGo7Ci19Ci0KLQotc3RhdGljIGlubGluZSBWT0lEIENyZWF0ZUNoTGlzdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQQ0hfUkVHSU9OIHBDaFJlZ2lvbiwKLQlJTiBVQ0hBUiBHZW9ncmFwaHkpCi17Ci0JSU5UIGk7Ci0JVUNIQVIgb2Zmc2V0ID0gMDsKLQlQQ0hfREVTUCBwQ2hEZXNwOwotCVVDSEFSIENoVHlwZTsKLQlVQ0hBUiBpbmNyZW1lbnQ7Ci0KLQlpZiAocENoUmVnaW9uID09IE5VTEwpCi0JCXJldHVybjsKLQotCUNoQmFuZENoZWNrKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUsICZDaFR5cGUpOwotCi0JZm9yIChpPTA7IGk8MTA7IGkrKykKLQl7Ci0JCXBDaERlc3AgPSAmcENoUmVnaW9uLT5DaERlc3BbaV07Ci0JCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPT0gMCkKLQkJCWJyZWFrOwotCi0JCWlmIChDaFR5cGUgPT0gQkFORF81RykKLQkJewotCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA8PSAxNCkKLQkJCQljb250aW51ZTsKLQkJfQotCQllbHNlIGlmIChDaFR5cGUgPT0gQkFORF8yNEcpCi0JCXsKLQkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPiAxNCkKLQkJCQljb250aW51ZTsKLQkJfQotCi0JCWlmICgocENoRGVzcC0+R2VvZ3JhcGh5ID09IEJPVEgpCi0JCQl8fCAocENoRGVzcC0+R2VvZ3JhcGh5ID09IEdlb2dyYXBoeSkpCi0gICAgICAgIHsKLQkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPiAxNCkKLSAgICAgICAgICAgICAgICBpbmNyZW1lbnQgPSA0OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGluY3JlbWVudCA9IDE7Ci0JCQlvZmZzZXQgPSBGaWxsQ2hMaXN0KHBBZCwgcENoRGVzcCwgb2Zmc2V0LCBpbmNyZW1lbnQpOwotICAgICAgICB9Ci0JfQotfQotCi0KLVZPSUQgQnVpbGRDaGFubmVsTGlzdEV4KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVBDSF9SRUdJT04gcENoUmVnOwotCi0JcENoUmVnID0gR2V0Q2hSZWdpb24ocEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpOwotCUNyZWF0ZUNoTGlzdChwQWQsIHBDaFJlZywgcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5KTsKLX0KLQotCi1WT0lEIEJ1aWxkQmVhY29uQ2hMaXN0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEJ1ZiwKLQlPVVQJUFVMT05HIHBCdWZMZW4pCi17Ci0JSU5UIGk7Ci0JVUxPTkcgVG1wTGVuOwotCVBDSF9SRUdJT04gcENoUmVnaW9uOwotCVBDSF9ERVNQIHBDaERlc3A7Ci0JVUNIQVIgQ2hUeXBlOwotCi0JcENoUmVnaW9uID0gR2V0Q2hSZWdpb24ocEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpOwotCi0JaWYgKHBDaFJlZ2lvbiA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlDaEJhbmRDaGVjayhwQWQtPkNvbW1vbkNmZy5QaHlNb2RlLCAmQ2hUeXBlKTsKLQkqcEJ1ZkxlbiA9IDA7Ci0KLQlmb3IgKGk9MDsgaTwxMDsgaSsrKQotCXsKLQkJcENoRGVzcCA9ICZwQ2hSZWdpb24tPkNoRGVzcFtpXTsKLQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA9PSAwKQotCQkJYnJlYWs7Ci0KLQkJaWYgKENoVHlwZSA9PSBCQU5EXzVHKQotCQl7Ci0JCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsIDw9IDE0KQotCQkJCWNvbnRpbnVlOwotCQl9Ci0JCWVsc2UgaWYgKENoVHlwZSA9PSBCQU5EXzI0RykKLQkJewotCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA+IDE0KQotCQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKChwQ2hEZXNwLT5HZW9ncmFwaHkgPT0gQk9USCkKLQkJCXx8IChwQ2hEZXNwLT5HZW9ncmFwaHkgPT0gcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5KSkKLQkJewotCQkJTWFrZU91dGdvaW5nRnJhbWUocEJ1ZiArICpwQnVmTGVuLAkJJlRtcExlbiwKLQkJCQkJCQkJMSwJCQkmcENoRGVzcC0+Rmlyc3RDaGFubmVsLAotCQkJCQkJCQkxLAkJCSZwQ2hEZXNwLT5OdW1PZkNoLAotCQkJCQkJCQkxLAkJCSZwQ2hEZXNwLT5NYXhUeFB3ciwKLQkJCQkJCQkJRU5EX09GX0FSR1MpOwotCQkJKnBCdWZMZW4gKz0gVG1wTGVuOwotCQl9Ci0JfQotfQotCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLXN0YXRpYyBCT09MRUFOIElzVmFsaWRDaGFubmVsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSIGNoYW5uZWwpCi0KLXsKLQlJTlQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspCi0JewotCQlpZiAocEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsID09IGNoYW5uZWwpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoaSA9PSBwQWQtPkNoYW5uZWxMaXN0TnVtKQotCQlyZXR1cm4gRkFMU0U7Ci0JZWxzZQotCQlyZXR1cm4gVFJVRTsKLX0KLQotCi1zdGF0aWMgVUNIQVIgR2V0RXh0Q2goCi0JSU4gVUNIQVIgQ2hhbm5lbCwKLQlJTiBVQ0hBUiBEaXJlY3Rpb24pCi17Ci0JQ0hBUiBFeHRDaDsKLQotCWlmIChEaXJlY3Rpb24gPT0gRVhUQ0hBX0FCT1ZFKQotCQlFeHRDaCA9IENoYW5uZWwgKyA0OwotCWVsc2UKLQkJRXh0Q2ggPSAoQ2hhbm5lbCAtIDQpID4gMCA/IChDaGFubmVsIC0gNCkgOiAwOwotCi0JcmV0dXJuIEV4dENoOwotfQotCi0KLVZPSUQgTl9DaGFubmVsQ2hlY2soCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JLy9VQ0hBUiBDaGFubmVsTnVtID0gcEFkLT5DaGFubmVsTGlzdE51bTsKLQlVQ0hBUiBDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKLQotCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSAmJiAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9PSBCV180MCkpCi0JewotCQlpZiAoQ2hhbm5lbCA+IDE0KQotCQl7Ci0JCQlpZiAoKENoYW5uZWwgPT0gMzYpIHx8IChDaGFubmVsID09IDQ0KSB8fCAoQ2hhbm5lbCA9PSA1MikgfHwgKENoYW5uZWwgPT0gNjApIHx8IChDaGFubmVsID09IDEwMCkgfHwgKENoYW5uZWwgPT0gMTA4KSB8fAotCQkJICAgIChDaGFubmVsID09IDExNikgfHwgKENoYW5uZWwgPT0gMTI0KSB8fCAoQ2hhbm5lbCA9PSAxMzIpIHx8IChDaGFubmVsID09IDE0OSkgfHwgKENoYW5uZWwgPT0gMTU3KSkKLQkJCXsKLQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0FCT1ZFOwotCQkJfQotCQkJZWxzZSBpZiAoKENoYW5uZWwgPT0gNDApIHx8IChDaGFubmVsID09IDQ4KSB8fCAoQ2hhbm5lbCA9PSA1NikgfHwgKENoYW5uZWwgPT0gNjQpIHx8IChDaGFubmVsID09IDEwNCkgfHwgKENoYW5uZWwgPT0gMTEyKSB8fAotCQkJCQkoQ2hhbm5lbCA9PSAxMjApIHx8IChDaGFubmVsID09IDEyOCkgfHwgKENoYW5uZWwgPT0gMTM2KSB8fCAoQ2hhbm5lbCA9PSAxNTMpIHx8IChDaGFubmVsID09IDE2MSkpCi0JCQl7Ci0JCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9CRUxPVzsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfMjA7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlkbwotCQkJewotCQkJCVVDSEFSIEV4dENoOwotCQkJCVVDSEFSIERpciA9IHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEE7Ci0JCQkJRXh0Q2ggPSBHZXRFeHRDaChDaGFubmVsLCBEaXIpOwotCQkJCWlmIChJc1ZhbGlkQ2hhbm5lbChwQWQsIEV4dENoKSkKLQkJCQkJYnJlYWs7Ci0KLQkJCQlEaXIgPSAoRGlyID09IEVYVENIQV9BQk9WRSkgPyBFWFRDSEFfQkVMT1cgOiBFWFRDSEFfQUJPVkU7Ci0JCQkJRXh0Q2ggPSBHZXRFeHRDaChDaGFubmVsLCBEaXIpOwotCQkJCWlmIChJc1ZhbGlkQ2hhbm5lbChwQWQsIEV4dENoKSkKLQkJCQl7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBEaXI7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfMjA7Ci0JCQl9IHdoaWxlKEZBTFNFKTsKLQotCQkJaWYgKENoYW5uZWwgPT0gMTQpCi0JCQl7Ci0JCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOwotCQkJCS8vcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9OT05FOwkvLyBXZSBkaWRuJ3Qgc2V0IHRoZSBFeHRDaCBhcyBOT05FIGR1ZSB0byBpdCdsbCBzZXQgaW4gUlRNUFNldEhUKCkKLQkJCX0KLQkJfQotCX0KLQotCi19Ci0KLQotVk9JRCBOX1NldENlbkNoKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCWlmIChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDApCi0JewotCQlpZiAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9PSBFWFRDSEFfQUJPVkUpCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCArIDI7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9PSAxNCkKLQkJCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgLSAxOwotCQkJZWxzZQotCQkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCAtIDI7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwotCX0KLX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCi1VSU5UOCBHZXRDdW50cnlNYXhUeFB3cigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVSU5UOCBjaGFubmVsKQotewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspCi0JewotCQlpZiAocEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsID09IGNoYW5uZWwpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoaSA9PSBwQWQtPkNoYW5uZWxMaXN0TnVtKQotCQlyZXR1cm4gMHhmZjsKLQllbHNlCi0JCXJldHVybiBwQWQtPkNoYW5uZWxMaXN0W2ldLk1heFR4UHdyOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vcnRfcmYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL3J0X3JmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNjM4ZjcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vcnRfcmYuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXJ0X3JmLmMKLQotCUFic3RyYWN0OgotCVJhbGluayBXaXJlbGVzcyBkcml2ZXIgUkYgcmVsYXRlZCBmdW5jdGlvbnMKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0JLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotI2lmZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246IFdyaXRlIFJUMzB4eCBSRiByZWdpc3RlciB0aHJvdWdoIE1BQwotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JSVJRTCA9Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMgUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJcmVnSUQsCi0JSU4JVUNIQVIJCQl2YWx1ZSkKLXsKLQlSRl9DU1JfQ0ZHX1NUUlVDCXJmY3NyOwotCVVJTlQJCQkJaSA9IDA7Ci0KLQlkbwotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBSRl9DU1JfQ0ZHLCAmcmZjc3Iud29yZCk7Ci0KLQkJaWYgKCFyZmNzci5maWVsZC5SRl9DU1JfS0lDSykKLQkJCWJyZWFrOwotCQlpKys7Ci0JfQotCXdoaWxlICgoaSA8IFJFVFJZX0xJTUlUKSAmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpOwotCi0JaWYgKChpID09IFJFVFJZX0xJTUlUKSB8fCAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKLQl7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSZXRyeSBjb3VudCBleGhhdXN0ZWQgb3IgZGV2aWNlIHJlbW92ZWQhISFcbiIpKTsKLQkJcmV0dXJuIFNUQVRVU19VTlNVQ0NFU1NGVUw7Ci0JfQotCi0JcmZjc3IuZmllbGQuUkZfQ1NSX1dSID0gMTsKLQlyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9IDE7Ci0JcmZjc3IuZmllbGQuVEVTVENTUl9SRkFDQ19SRUdOVU0gPSByZWdJRDsKLQlyZmNzci5maWVsZC5SRl9DU1JfREFUQSA9IHZhbHVlOwotCi0JUlRNUF9JT19XUklURTMyKHBBZCwgUkZfQ1NSX0NGRywgcmZjc3Iud29yZCk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjogUmVhZCBSVDMweHggUkYgcmVnaXN0ZXIgdGhyb3VnaCBNQUMKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCUlSUUwgPQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5ESVNfU1RBVFVTIFJUMzB4eFJlYWRSRlJlZ2lzdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJcmVnSUQsCi0JSU4JUFVDSEFSCQkJcFZhbHVlKQotewotCVJGX0NTUl9DRkdfU1RSVUMJcmZjc3I7Ci0JVUlOVAkJCQlpPTAsIGs9MDsKLQotCWZvciAoaT0wOyBpPE1BWF9CVVNZX0NPVU5UOyBpKyspCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFJGX0NTUl9DRkcsICZyZmNzci53b3JkKTsKLQotCQlpZiAocmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0sgPT0gQlVTWSkKLQkJewotCQkJY29udGludWU7Ci0JCX0KLQkJcmZjc3Iud29yZCA9IDA7Ci0JCXJmY3NyLmZpZWxkLlJGX0NTUl9XUiA9IDA7Ci0JCXJmY3NyLmZpZWxkLlJGX0NTUl9LSUNLID0gMTsKLQkJcmZjc3IuZmllbGQuVEVTVENTUl9SRkFDQ19SRUdOVU0gPSByZWdJRDsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgUkZfQ1NSX0NGRywgcmZjc3Iud29yZCk7Ci0JCWZvciAoaz0wOyBrPE1BWF9CVVNZX0NPVU5UOyBrKyspCi0JCXsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgUkZfQ1NSX0NGRywgJnJmY3NyLndvcmQpOwotCi0JCQlpZiAocmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0sgPT0gSURMRSkKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoKHJmY3NyLmZpZWxkLlJGX0NTUl9LSUNLID09IElETEUpICYmCi0JCQkocmZjc3IuZmllbGQuVEVTVENTUl9SRkFDQ19SRUdOVU0gPT0gcmVnSUQpKQotCQl7Ci0JCQkqcFZhbHVlID0gKFVDSEFSKXJmY3NyLmZpZWxkLlJGX0NTUl9EQVRBOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKHJmY3NyLmZpZWxkLlJGX0NTUl9LSUNLID09IEJVU1kpCi0JewotCQlEQkdQUklOVF9FUlIoKCJSRiByZWFkIFIlZD0weCV4IGZhaWwsIGlbJWRdLCBrWyVkXVxuIiwgcmVnSUQsIHJmY3NyLndvcmQsaSxrKSk7Ci0JCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOwotCX0KLQotCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1WT0lEIE5JQ0luaXRSRlJlZ2lzdGVycygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCkKLXsKLQlpZiAocEFkLT5jaGlwT3BzLkFzaWNSZkluaXQpCi0JCXBBZC0+Y2hpcE9wcy5Bc2ljUmZJbml0KHBBZCk7Ci19Ci0KLQotVk9JRCBSdG1wQ2hpcE9wc1JGSG9vaygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCkKLXsKLQlSVE1QX0NISVBfT1AgKnBDaGlwT3BzID0gJnBBZC0+Y2hpcE9wczsKLQotCXBDaGlwT3BzLT5wUkZSZWdUYWJsZSA9IE5VTEw7Ci0JcENoaXBPcHMtPkFzaWNSZkluaXQgPSBOVUxMOwotCXBDaGlwT3BzLT5Bc2ljUmZUdXJuT24gPSBOVUxMOwotCXBDaGlwT3BzLT5Bc2ljUmZUdXJuT2ZmID0gTlVMTDsKLQlwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUgPSBOVUxMOwotCXBDaGlwT3BzLT5Bc2ljSGFsdEFjdGlvbiA9IE5VTEw7Ci0jaWZkZWYgUlQzM3h4Ci1pZiAoSVNfUlQzMzkwKHBBZCkgJiYgKHBBZC0+aW5mVHlwZSA9PSBSVE1QX0RFVl9JTkZfUENJKSkKLQkJewotCQkJcENoaXBPcHMtPnBSRlJlZ1RhYmxlID0gUkZSZWdUYWJsZU92ZXJSVDMzOTA7Ci0JCQlwQ2hpcE9wcy0+QXNpY0hhbHRBY3Rpb24gPSBSVDMzeHhIYWx0QWN0aW9uOwotCQkJcENoaXBPcHMtPkFzaWNSZlR1cm5PZmYgPSBSVDMzeHhMb2FkUkZTbGVlcE1vZGVTZXR1cDsKLQkJCXBDaGlwT3BzLT5Bc2ljUmZJbml0ID0gTklDSW5pdFJUMzM5MFJGUmVnaXN0ZXJzOwotCQkJcENoaXBPcHMtPkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlID0gUlQzM3h4UmV2ZXJzZVJGU2xlZXBNb2RlU2V0dXA7Ci0JCX0KLSNlbHNlIC8vIFJUMzN4eCAvLwotCS8qIFdlIGRlcGVuZHMgb24gUmZJQ1R5cGUgYW5kIE1BQ1ZlcnNpb24gdG8gYXNzaWduIHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbiBjYWxsYmFja3MuICovCi0KLSNpZmRlZiBSVDMweHgKLQlpZiAoSVNfUlQzMHh4KHBBZCkpCi0JewotCQlwQ2hpcE9wcy0+cFJGUmVnVGFibGUgPSBSVDMweHhfUkZSZWdUYWJsZTsKLQkJcENoaXBPcHMtPkFzaWNIYWx0QWN0aW9uID0gUlQzMHh4SGFsdEFjdGlvbjsKLSNpZmRlZiBSVDMwOTAKLQkJaWYgKElTX1JUMzA5MChwQWQpICYmIChwQWQtPmluZlR5cGUgPT0gUlRNUF9ERVZfSU5GX1BDSSkpCi0JCXsKLQkJCXBDaGlwT3BzLT5Bc2ljUmZUdXJuT2ZmID0gUlQzMHh4TG9hZFJGU2xlZXBNb2RlU2V0dXA7Ci0JCQlwQ2hpcE9wcy0+QXNpY1JmSW5pdCA9IE5JQ0luaXRSVDMwOTBSRlJlZ2lzdGVyczsKLQkJCXBDaGlwT3BzLT5Bc2ljUmV2ZXJzZVJmRnJvbVNsZWVwTW9kZSA9IFJUMzB4eFJldmVyc2VSRlNsZWVwTW9kZVNldHVwOwotCQl9Ci0jZW5kaWYgLy8gUlQzMDkwIC8vCi0JfQotI2VuZGlmIC8vIFJUMzB4eCAvLwotI2VuZGlmIC8vIFJUMzN4eCAvLwotfQotCi0jZW5kaWYgLy8gUlRNUF9SRl9SV19TVVBQT1JUIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9ydG1wX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL3J0bXBfaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGI5NWI3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL3J0bXBfaW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzg4MiArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXJ0bXBfaW5pdC5jCi0KLQlBYnN0cmFjdDoKLQlNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0JLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotVUNIQVIgICAgQklUOFtdID0gezB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODB9OwotY2hhciogICBDaXBoZXJOYW1lW10gPSB7Im5vbmUiLCJ3ZXA2NCIsIndlcDEyOCIsIlRLSVAiLCJBRVMiLCJDS0lQNjQiLCJDS0lQMTI4In07Ci0KLS8vCi0vLyBCQlAgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gc2V0Ci0vLwotUkVHX1BBSVIgICBCQlBSZWdUYWJsZVtdID0gewotCXtCQlBfUjY1LAkJMHgyQ30sCQkvLyBmaXggcnNzaSBpc3N1ZQotCXtCQlBfUjY2LAkJMHgzOH0sCS8vIEFsc28gc2V0IHRoaXMgZGVmYXVsdCB2YWx1ZSB0byBwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUgYXQgaW5pdGlhbAotCXtCQlBfUjY5LAkJMHgxMn0sCi0Je0JCUF9SNzAsCQkweGF9LAkvLyBCQlBfUjcwIHdpbGwgY2hhbmdlIHRvIDB4OCBpbiBBcFN0YXJ0VXAgYW5kIExpbmtVcCBmb3IgcnQyODYwQywgb3RoZXJ3aXNlIHZhbHVlIGlzIDB4YQotCXtCQlBfUjczLAkJMHgxMH0sCi0Je0JCUF9SODEsCQkweDM3fSwKLQl7QkJQX1I4MiwJCTB4NjJ9LAotCXtCQlBfUjgzLAkJMHg2QX0sCi0Je0JCUF9SODQsCQkweDk5fSwJLy8gMHgxOSBpcyBmb3IgcnQyODYwRSBhbmQgYWZ0ZXIuIFRoaXMgaXMgZm9yIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIElPVC4gMHg5OSBpcyBmb3IgcnQyODYwRCBhbmQgYmVmb3JlCi0Je0JCUF9SODYsCQkweDAwfSwJLy8gbWlkZGxlIHJhbmdlIGlzc3VlLCBSb3J5IEAyMDA4LTAxLTI4Ci0Je0JCUF9SOTEsCQkweDA0fSwJLy8gbWlkZGxlIHJhbmdlIGlzc3VlLCBSb3J5IEAyMDA4LTAxLTI4Ci0Je0JCUF9SOTIsCQkweDAwfSwJLy8gbWlkZGxlIHJhbmdlIGlzc3VlLCBSb3J5IEAyMDA4LTAxLTI4Ci0Je0JCUF9SMTAzLAkJMHgwMH0sCS8vIG5lYXIgcmFuZ2UgaGlnaC1wb3dlciBpc3N1ZSwgcmVxdWVzdGVkIGZyb20gR2FyeSBAMjAwOC0wNTI4Ci0Je0JCUF9SMTA1LAkJMHgwNX0sCS8vIDB4MDUgaXMgZm9yIHJ0Mjg2MEUgdG8gdHVybiBvbiBGRVEgY29udHJvbC4gSXQgaXMgc2FmZSBmb3IgcnQyODYwRCBhbmQgYmVmb3JlLCBiZWNhdXNlIEJpdCA3OjIgYXJlIHJlc2VydmVkIGluIHJ0Mjg2MEQgYW5kIGJlZm9yZS4KLQl7QkJQX1IxMDYsCQkweDM1fSwgIC8vIGZvciBTaG9ydEdJIHRocm91Z2hwdXQKLX07Ci0jZGVmaW5lCU5VTV9CQlBfUkVHX1BBUk1TCShzaXplb2YoQkJQUmVnVGFibGUpIC8gc2l6ZW9mKFJFR19QQUlSKSkKLQotCi0vLwotLy8gQVNJQyByZWdpc3RlciBpbml0aWFsaXphdGlvbiBzZXRzCi0vLwotCi1SVE1QX1JFR19QQUlSCU1BQ1JlZ1RhYmxlW10gPQl7Ci0jaWYgZGVmaW5lZChIV19CRUFDT05fT0ZGU0VUKSAmJiAoSFdfQkVBQ09OX09GRlNFVCA9PSAweDIwMCkKLQl7QkNOX09GRlNFVDAsCQkJMHhmOGYwZThlMH0sIC8qIDB4MzgwMChlMCksIDB4M0EwMChlOCksIDB4M0MwMChmMCksIDB4M0UwMChmOCksIDUxMkIgZm9yIGVhY2ggYmVhY29uICovCi0Je0JDTl9PRkZTRVQxLAkJCTB4NmY3N2QwYzh9LCAvKiAweDMyMDAoYzgpLCAweDM0MDAoZDApLCAweDFEQzAoNzcpLCAweDFCQzAoNmYpLCA1MTJCIGZvciBlYWNoIGJlYWNvbiAqLwotI2VsaWYgZGVmaW5lZChIV19CRUFDT05fT0ZGU0VUKSAmJiAoSFdfQkVBQ09OX09GRlNFVCA9PSAweDEwMCkKLQl7QkNOX09GRlNFVDAsCQkJMHhlY2U4ZTRlMH0sIC8qIDB4MzgwMCwgMHgzQTAwLCAweDNDMDAsIDB4M0UwMCwgNTEyQiBmb3IgZWFjaCBiZWFjb24gKi8KLQl7QkNOX09GRlNFVDEsCQkJMHhmY2Y4ZjRmMH0sIC8qIDB4MzgwMCwgMHgzQTAwLCAweDNDMDAsIDB4M0UwMCwgNTEyQiBmb3IgZWFjaCBiZWFjb24gKi8KLSNlbHNlCi0gICAgI2Vycm9yIFlvdSBtdXN0IHJlLWNhbGN1bGF0ZSBuZXcgdmFsdWUgZm9yIEJDTl9PRkZTRVQwICYgQkNOX09GRlNFVDEgaW4gTUFDUmVnVGFibGVbXSEhIQotI2VuZGlmIC8vIEhXX0JFQUNPTl9PRkZTRVQgLy8KLQotCXtMRUdBQ1lfQkFTSUNfUkFURSwJCTB4MDAwMDAxM2Z9LCAvLyAgQmFzaWMgcmF0ZSBzZXQgYml0bWFwCi0Je0hUX0JBU0lDX1JBVEUsCQkweDAwMDA4MDAzfSwgLy8gQmFzaWMgSFQgcmF0ZSBzZXQgLCAyME0sIE1DUz0zLCBNTS4gRm9ybWF0IGlzIHRoZSBzYW1lIGFzIGluIFRYV0kuCi0Je01BQ19TWVNfQ1RSTCwJCTB4MDB9LCAvLyAweDEwMDQsICwgZGVmYXVsdCBEaXNhYmxlIFJYCi0Je1JYX0ZJTFRSX0NGRywJCTB4MTdmOTd9LCAvLzB4MTQwMCAgLCBSWCBmaWx0ZXIgY29udHJvbCwKLQl7QktPRkZfU0xPVF9DRkcsCTB4MjA5fSwgLy8gZGVmYXVsdCBzZXQgc2hvcnQgc2xvdCB0aW1lLCBDQ19ERUxBWV9USU1FIHNob3VsZCBiZSAyCi0JLy97VFhfU1dfQ0ZHMCwJCTB4NDBhMDZ9LCAvLyBHYXJ5LDIwMDYtMDgtMjMKLQl7VFhfU1dfQ0ZHMCwJCTB4MH0sCQkvLyBHYXJ5LDIwMDgtMDUtMjEgZm9yIENXQyB0ZXN0Ci0Je1RYX1NXX0NGRzEsCQkweDgwNjA2fSwgLy8gR2FyeSwyMDA2LTA4LTIzCi0Je1RYX0xJTktfQ0ZHLAkJMHgxMDIwfSwJCS8vIEdhcnksMjAwNi0wOC0yMwotCS8ve1RYX1RJTUVPVVRfQ0ZHLAkweDAwMTgyMDkwfSwJLy8gQ0NLIGhhcyBzb21lIHByb2JsZW0uIFNvIGluY3JlYXNlIHRpbWllb3V0IHZhbHVlLiAyMDA2LTEwLTA5Ly8gTUFydmVrIFJUCi0Je1RYX1RJTUVPVVRfQ0ZHLAkweDAwMGEyMDkwfSwJLy8gQ0NLIGhhcyBzb21lIHByb2JsZW0uIFNvIGluY3JlYXNlIHRpbWllb3V0IHZhbHVlLiAyMDA2LTEwLTA5Ly8gTUFydmVrIFJUICwgTW9kaWZ5IGZvciAyODYwRSAsMjAwNy0wOC0wMQotCXtNQVhfTEVOX0NGRywJCU1BWF9BR0dSRUdBVElPTl9TSVpFIHwgMHgwMDAwMTAwMH0sCS8vIDB4MzAxOCwgTUFYIGZyYW1lIGxlbmd0aC4gTWF4IFBTRFUgPSAxNmtieXRlcy4KLQl7TEVEX0NGRywJCTB4N2YwMzFlNDZ9LCAvLyBHYXJ5LCAyMDA2LTA4LTIzCi0KLS8vI2lmZGVmIENPTkZJR19BUF9TVVBQT1JUCi0vLwl7V01NX0FJRlNOX0NGRywJCTB4MDAwMDExNzN9LAotLy8Je1dNTV9DV01JTl9DRkcsCQkweDAwMDAyMzQ0fSwKLS8vCXtXTU1fQ1dNQVhfQ0ZHLAkJMHgwMDAwMzRhNn0sCi0vLwl7V01NX1RYT1AwX0NGRywJCTB4MDAxMDAwMjB9LAotLy8Je1dNTV9UWE9QMV9DRkcsCQkweDAwMkYwMDM4fSwKLS8vI2VuZGlmIC8vIENPTkZJR19BUF9TVVBQT1JUIC8vCi0KLS8vI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotLy8Je1dNTV9BSUZTTl9DRkcsCQkweDAwMDAyMjczfSwKLS8vCXtXTU1fQ1dNSU5fQ0ZHLAkJMHgwMDAwMjM0NH0sCi0vLwl7V01NX0NXTUFYX0NGRywJCTB4MDAwMDM0YWF9LAotLy8jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0jaWZkZWYgSU5GX0FNQVpPTl9TRQotCXtQQkZfTUFYX1BDTlQsCQkJMHgxRjNGNkY2Rn0sCS8vaXZlcnNvbiBtb2RpZnkgZm9yIHVzYiBpc3N1ZSwgMjAwOC8wOS8xOQotCQkJCQkJCQkJCQkvLyA2RiArIDZGIDwgdG90YWwgcGFnZSBjb3VudCBGRQotCQkJCQkJCQkJCQkvLyBzbyB0aGF0IFJYIGRvZXNuJ3Qgb2NjdXB5IFRYJ3MgYnVmZmVyIHNwYWNlIHdoZW4gV01NIGNvbmdlc3Rpb24uCi0jZWxzZQotCXtQQkZfTUFYX1BDTlQsCQkJMHgxRjNGQkY5Rn0sCS8vMHgxRjNmN2Y5Zn0sCQkvL0phbiwgMjAwNi8wNC8yMAotI2VuZGlmIC8vIElORl9BTUFaT05fU0UgLy8KLQkvL3tUWF9SVFlfQ0ZHLAkJCTB4NmJiODA0MDh9LAkvLyBKYW4sIDIwMDYvMTEvMTYKLS8vIFdNTV9BQ01fU1VQUE9SVAotLy8Je1RYX1JUWV9DRkcsCQkJMHg2YmI4MDEwMX0sCS8vIHNhbXBsZQotCXtUWF9SVFlfQ0ZHLAkJCTB4NDdkMDFmMGZ9LAkvLyBKYW4sIDIwMDYvMTEvMTYsIFNldCBUeFdJLT5BQ0sgPTAgaW4gUHJvYmUgUnNwIE1vZGlmeSBmb3IgMjg2MEUgLDIwMDctMDgtMDMKLQotCXtBVVRPX1JTUF9DRkcsCQkJMHgwMDAwMDAxM30sCS8vIEluaXRpYWwgQXV0b19SZXNwb25kZXIsIGJlY2F1c2UgUUEgd2lsbCB0dXJuIG9mZiBBdXRvLVJlc3BvbmRlcgotCXtDQ0tfUFJPVF9DRkcsCQkJMHgwNTc0MDAwMyAvKjB4MDE3NDAwMDMqL30sCS8vIEluaXRpYWwgQXV0b19SZXNwb25kZXIsIGJlY2F1c2UgUUEgd2lsbCB0dXJuIG9mZiBBdXRvLVJlc3BvbmRlci4gQW5kIFJUUyB0aHJlc2hvbGQgaXMgZW5hYmxlZC4KLQl7T0ZETV9QUk9UX0NGRywJCQkweDA1NzQwMDAzIC8qMHgwMTc0MDAwMyovfSwJLy8gSW5pdGlhbCBBdXRvX1Jlc3BvbmRlciwgYmVjYXVzZSBRQSB3aWxsIHR1cm4gb2ZmIEF1dG8tUmVzcG9uZGVyLiBBbmQgUlRTIHRocmVzaG9sZCBpcyBlbmFibGVkLgotCXtHRjIwX1BST1RfQ0ZHLAkJCTB4MDE3NDQwMDR9LCAgICAvLyBzZXQgMTk6MTggLS0+IFNob3J0IE5BViBmb3IgTUlNTyBQUwotCXtHRjQwX1BST1RfQ0ZHLAkJCTB4MDNGNDQwODR9LAotCXtNTTIwX1BST1RfQ0ZHLAkJCTB4MDE3NDQwMDR9LAotI2lmZGVmIFJUTVBfTUFDX1BDSQotCXtNTTQwX1BST1RfQ0ZHLAkJCTB4MDNGNTQwODR9LAotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCXtUWE9QX0NUUkxfQ0ZHLAkJCTB4MDAwMDU4M2YsIC8qMHgwMDAwMjQzZiovIC8qMHgwMDAwMjRiZiovfSwJLy9FeHRlbnNpb24gY2hhbm5lbCBiYWNrb2ZmLgotCXtUWF9SVFNfQ0ZHLAkJCTB4MDAwOTJiMjB9LAotLy8jaWZkZWYgV0lGSV9URVNUCi0Je0VYUF9BQ0tfVElNRSwJCQkweDAwMjQwMGNhfSwJLy8gZGVmYXVsdCB2YWx1ZQotLy8jZWxzZQotLy8Je0VYUF9BQ0tfVElNRSwJCQkweDAwNTQwMGNhfSwJLy8gc3VnZ2VzdGVkIGJ5IEdyYXkgQCAyMDA3MDMyMyBmb3IgMTFuIGludGVsLXN0YSB0aHJvdWdocHV0Ci0vLyNlbmRpZiAvLyBlbmQgLSBXSUZJX1RFU1QgLy8KLS8vI2lmZGVmIENPTkZJR19BUF9TVVBQT1JUCi0vLwl7VEJUVF9TWU5DX0NGRywJCQkweDAwNDIyMDAwfSwJLy8gVEJUVF9BREpVU1QoNzowKSA9PSAwCi0vLwl7VEJUVF9TWU5DX0NGRywJCQkweDAwMDEyMDAwfSwJLy8gVEJUVF9BREpVU1QoNzowKSA9PSAwCi0vLyNlbmRpZiAvLyBDT05GSUdfQVBfU1VQUE9SVCAvLwotCXtUWE9QX0hMRFJfRVQsCQkJMHgwMDAwMDAwMn0sCi0KLQkvKiBKZXJyeSBjb21tZW50cyAyMDA4LzAxLzE2OiB3ZSB1c2UgU0lGUyA9IDEwdXMgaW4gQ0NLIGRlZmF1bHRseSwgYnV0IGl0IHNlZW1zIHRoYXQgMTB1cwotCQlpcyB0b28gc21hbGwgZm9yIElOVEVMIDIyMDBiZyBjYXJkLCBzbyBpbiBNQlNTIG1vZGUsIHRoZSBkZWx0YSB0aW1lIGJldHdlZW4gYmVhY29uMAotCQlhbmQgYmVhY29uMSBpcyBTSUZTICgxMHVzKSwgc28gaWYgSU5URUwgMjIwMGJnIGNhcmQgY29ubmVjdHMgdG8gQlNTMCwgdGhlIHBpbmcKLQkJd2lsbCBhbHdheXMgbG9zdC4gU28gd2UgY2hhbmdlIHRoZSBTSUZTIG9mIENDSyBmcm9tIDEwdXMgdG8gMTZ1cy4gKi8KLQl7WElGU19USU1FX0NGRywJCQkweDMzYTQxMDEwfSwKLQl7UFdSX1BJTl9DRkcsCQkJMHgwMDAwMDAwM30sCS8vIHBhdGNoIGZvciAyODgwLUUKLX07Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotUlRNUF9SRUdfUEFJUglTVEFNQUNSZWdUYWJsZVtdID0JewotCXtXTU1fQUlGU05fQ0ZHLAkJMHgwMDAwMjI3M30sCi0Je1dNTV9DV01JTl9DRkcsCTB4MDAwMDIzNDR9LAotCXtXTU1fQ1dNQVhfQ0ZHLAkweDAwMDAzNGFhfSwKLX07Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNkZWZpbmUJTlVNX01BQ19SRUdfUEFSTVMJCShzaXplb2YoTUFDUmVnVGFibGUpIC8gc2l6ZW9mKFJUTVBfUkVHX1BBSVIpKQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2RlZmluZQlOVU1fU1RBX01BQ19SRUdfUEFSTVMJKHNpemVvZihTVEFNQUNSZWdUYWJsZSkgLyBzaXplb2YoUlRNUF9SRUdfUEFJUikpCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUFsbG9jYXRlIFJUTVBfQURBUFRFUiBkYXRhIGJsb2NrIGFuZCBkbyBzb21lIGluaXRpYWxpemF0aW9uCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTkRJU19TVEFUVVNfU1VDQ0VTUwotCQlORElTX1NUQVRVU19GQUlMVVJFCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5ESVNfU1RBVFVTCVJUTVBBbGxvY0FkYXB0ZXJCbG9jaygKLQlJTiAgUFZPSUQJaGFuZGxlLAotCU9VVAlQUlRNUF9BREFQVEVSCSpwcEFkYXB0ZXIpCi17Ci0JUFJUTVBfQURBUFRFUglwQWQ7Ci0JTkRJU19TVEFUVVMJCVN0YXR1czsKLQlJTlQJCQlpbmRleDsKLQlVQ0hBUgkJCSpwQmVhY29uQnVmID0gTlVMTDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBSVE1QQWxsb2NBZGFwdGVyQmxvY2tcbiIpKTsKLQotCSpwcEFkYXB0ZXIgPSBOVUxMOwotCi0JZG8KLQl7Ci0JCS8vIEFsbG9jYXRlIFJUTVBfQURBUFRFUiBtZW1vcnkgYmxvY2sKLQkJcEJlYWNvbkJ1ZiA9IGttYWxsb2MoTUFYX0JFQUNPTl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7Ci0JCWlmIChwQmVhY29uQnVmID09IE5VTEwpCi0JCXsKLQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IC0gQmVhY29uQnVmIVxuIikpOwotCQkJYnJlYWs7Ci0JCX0KLQkJTmRpc1plcm9NZW1vcnkocEJlYWNvbkJ1ZiwgTUFYX0JFQUNPTl9TSVpFKTsKLQotCQlTdGF0dXMgPSBBZGFwdGVyQmxvY2tBbGxvY2F0ZU1lbW9yeShoYW5kbGUsIChQVk9JRCAqKSZwQWQpOwotCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCXsKLQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgLSBBREFQVEVSXG4iKSk7Ci0JCQlicmVhazsKLQkJfQotCQlwQWQtPkJlYWNvbkJ1ZiA9IHBCZWFjb25CdWY7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJcblxuPT09IHBBZCA9ICVwLCBzaXplID0gJWQgPT09XG5cbiIsIHBBZCwgKFVJTlQzMilzaXplb2YoUlRNUF9BREFQVEVSKSkpOwotCi0KLQkJLy8gSW5pdCBzcGluIGxvY2tzCi0JCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1nbXRSaW5nTG9jayk7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPlJ4UmluZ0xvY2spOwotI2lmZGVmIFJUMzA5MAotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1jdUNtZExvY2spOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFJUMzA5MCAvLwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JCWZvciAoaW5kZXggPTAgOyBpbmRleCA8IE5VTV9PRl9UWF9SSU5HOyBpbmRleCsrKQotCQl7Ci0JCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5UeFN3UXVldWVMb2NrW2luZGV4XSk7Ci0JCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5EZVF1ZXVlTG9ja1tpbmRleF0pOwotCQkJcEFkLT5EZVF1ZXVlUnVubmluZ1tpbmRleF0gPSBGQUxTRTsKLQkJfQotCi0JCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPmlycV9sb2NrKTsKLQotCi0JfSB3aGlsZSAoRkFMU0UpOwotCi0JaWYgKChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgJiYgKHBCZWFjb25CdWYpKQotCQlrZnJlZShwQmVhY29uQnVmKTsKLQotCSpwcEFkYXB0ZXIgPSBwQWQ7Ci0KLQlEQkdQUklOVF9TKFN0YXR1cywgKCI8LS0gUlRNUEFsbG9jQWRhcHRlckJsb2NrLCBTdGF0dXM9JXhcbiIsIFN0YXR1cykpOwotCXJldHVybiBTdGF0dXM7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVJlYWQgaW5pdGlhbCBUeCBwb3dlciBwZXIgTUNTIGFuZCBCVyBmcm9tIEVFUFJPTQotCi0JQXJndW1lbnRzOgotCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUFJlYWRUeFB3clBlclJhdGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JVUxPTkcJCWRhdGEsIEFkYXRhLCBHZGF0YTsKLQlVU0hPUlQJCWksIHZhbHVlLCB2YWx1ZTI7Ci0JSU5UCQkJQXB3cmRlbHRhLCBHcHdyZGVsdGE7Ci0JVUNIQVIJCXQxLHQyLHQzLHQ0OwotCUJPT0xFQU4JCWJBcHdyZGVsdGFNaW51cyA9IFRSVUUsIGJHcHdyZGVsdGFNaW51cyA9IFRSVUU7Ci0KLQkvLwotCS8vIEdldCBwb3dlciBkZWx0YSBmb3IgMjBNSHogYW5kIDQwTUh6LgotCS8vCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhwb3dlciBwZXIgUmF0ZVxuIikpOwotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfREVMVEEsIHZhbHVlMik7Ci0JQXB3cmRlbHRhID0gMDsKLQlHcHdyZGVsdGEgPSAwOwotCi0JaWYgKCh2YWx1ZTIgJiAweGZmKSAhPSAweGZmKQotCXsKLQkJaWYgKCh2YWx1ZTIgJiAweDgwKSkKLQkJCUdwd3JkZWx0YSA9ICh2YWx1ZTImMHhmKTsKLQotCQlpZiAoKHZhbHVlMiAmIDB4NDApKQotCQkJYkdwd3JkZWx0YU1pbnVzID0gRkFMU0U7Ci0JCWVsc2UKLQkJCWJHcHdyZGVsdGFNaW51cyA9IFRSVUU7Ci0JfQotCWlmICgodmFsdWUyICYgMHhmZjAwKSAhPSAweGZmMDApCi0JewotCQlpZiAoKHZhbHVlMiAmIDB4ODAwMCkpCi0JCQlBcHdyZGVsdGEgPSAoKHZhbHVlMiYweGYwMCk+PjgpOwotCi0JCWlmICgodmFsdWUyICYgMHg0MDAwKSkKLQkJCWJBcHdyZGVsdGFNaW51cyA9IEZBTFNFOwotCQllbHNlCi0JCQliQXB3cmRlbHRhTWludXMgPSBUUlVFOwotCX0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJHcHdyZGVsdGEgPSAleCwgQXB3cmRlbHRhID0gJXggLlxuIiwgR3B3cmRlbHRhLCBBcHdyZGVsdGEpKTsKLQotCS8vCi0JLy8gR2V0IFR4cG93ZXIgcGVyIE1DUyBmb3IgMjBNSHogaW4gMi40Ry4KLQkvLwotCWZvciAoaT0wOyBpPDU7IGkrKykKLQl7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzJfNEcgKyBpKjQsIHZhbHVlKTsKLQkJZGF0YSA9IHZhbHVlOwotCQlpZiAoYkFwd3JkZWx0YU1pbnVzID09IEZBTFNFKQotCQl7Ci0JCQl0MSA9ICh2YWx1ZSYweGYpKyhBcHdyZGVsdGEpOwotCQkJaWYgKHQxID4gMHhmKQotCQkJCXQxID0gMHhmOwotCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoQXB3cmRlbHRhKTsKLQkJCWlmICh0MiA+IDB4ZikKLQkJCQl0MiA9IDB4ZjsKLQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhBcHdyZGVsdGEpOwotCQkJaWYgKHQzID4gMHhmKQotCQkJCXQzID0gMHhmOwotCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoQXB3cmRlbHRhKTsKLQkJCWlmICh0NCA+IDB4ZikKLQkJCQl0NCA9IDB4ZjsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmICgodmFsdWUmMHhmKSA+IEFwd3JkZWx0YSkKLQkJCQl0MSA9ICh2YWx1ZSYweGYpLShBcHdyZGVsdGEpOwotCQkJZWxzZQotCQkJCXQxID0gMDsKLQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEFwd3JkZWx0YSkKLQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShBcHdyZGVsdGEpOwotCQkJZWxzZQotCQkJCXQyID0gMDsKLQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBBcHdyZGVsdGEpCi0JCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEFwd3JkZWx0YSk7Ci0JCQllbHNlCi0JCQkJdDMgPSAwOwotCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gQXB3cmRlbHRhKQotCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEFwd3JkZWx0YSk7Ci0JCQllbHNlCi0JCQkJdDQgPSAwOwotCQl9Ci0JCUFkYXRhID0gdDEgKyAodDI8PDQpICsgKHQzPDw4KSArICh0NDw8MTIpOwotCQlpZiAoYkdwd3JkZWx0YU1pbnVzID09IEZBTFNFKQotCQl7Ci0JCQl0MSA9ICh2YWx1ZSYweGYpKyhHcHdyZGVsdGEpOwotCQkJaWYgKHQxID4gMHhmKQotCQkJCXQxID0gMHhmOwotCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoR3B3cmRlbHRhKTsKLQkJCWlmICh0MiA+IDB4ZikKLQkJCQl0MiA9IDB4ZjsKLQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhHcHdyZGVsdGEpOwotCQkJaWYgKHQzID4gMHhmKQotCQkJCXQzID0gMHhmOwotCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoR3B3cmRlbHRhKTsKLQkJCWlmICh0NCA+IDB4ZikKLQkJCQl0NCA9IDB4ZjsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmICgodmFsdWUmMHhmKSA+IEdwd3JkZWx0YSkKLQkJCQl0MSA9ICh2YWx1ZSYweGYpLShHcHdyZGVsdGEpOwotCQkJZWxzZQotCQkJCXQxID0gMDsKLQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEdwd3JkZWx0YSkKLQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShHcHdyZGVsdGEpOwotCQkJZWxzZQotCQkJCXQyID0gMDsKLQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBHcHdyZGVsdGEpCi0JCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEdwd3JkZWx0YSk7Ci0JCQllbHNlCi0JCQkJdDMgPSAwOwotCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gR3B3cmRlbHRhKQotCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEdwd3JkZWx0YSk7Ci0JCQllbHNlCi0JCQkJdDQgPSAwOwotCQl9Ci0JCUdkYXRhID0gdDEgKyAodDI8PDQpICsgKHQzPDw4KSArICh0NDw8MTIpOwotCi0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzJfNEcgKyBpKjQgKyAyLCB2YWx1ZSk7Ci0JCWlmIChiQXB3cmRlbHRhTWludXMgPT0gRkFMU0UpCi0JCXsKLQkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7Ci0JCQlpZiAodDEgPiAweGYpCi0JCQkJdDEgPSAweGY7Ci0JCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOwotCQkJaWYgKHQyID4gMHhmKQotCQkJCXQyID0gMHhmOwotCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7Ci0JCQlpZiAodDMgPiAweGYpCi0JCQkJdDMgPSAweGY7Ci0JCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOwotCQkJaWYgKHQ0ID4gMHhmKQotCQkJCXQ0ID0gMHhmOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQotCQkJCXQxID0gKHZhbHVlJjB4ZiktKEFwd3JkZWx0YSk7Ci0JCQllbHNlCi0JCQkJdDEgPSAwOwotCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gQXB3cmRlbHRhKQotCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7Ci0JCQllbHNlCi0JCQkJdDIgPSAwOwotCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKLQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKLQkJCWVsc2UKLQkJCQl0MyA9IDA7Ci0JCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCi0JCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oQXB3cmRlbHRhKTsKLQkJCWVsc2UKLQkJCQl0NCA9IDA7Ci0JCX0KLQkJQWRhdGEgfD0gKCh0MTw8MTYpICsgKHQyPDwyMCkgKyAodDM8PDI0KSArICh0NDw8MjgpKTsKLQkJaWYgKGJHcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKLQkJewotCQkJdDEgPSAodmFsdWUmMHhmKSsoR3B3cmRlbHRhKTsKLQkJCWlmICh0MSA+IDB4ZikKLQkJCQl0MSA9IDB4ZjsKLQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEdwd3JkZWx0YSk7Ci0JCQlpZiAodDIgPiAweGYpCi0JCQkJdDIgPSAweGY7Ci0JCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoR3B3cmRlbHRhKTsKLQkJCWlmICh0MyA+IDB4ZikKLQkJCQl0MyA9IDB4ZjsKLQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEdwd3JkZWx0YSk7Ci0JCQlpZiAodDQgPiAweGYpCi0JCQkJdDQgPSAweGY7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAoKHZhbHVlJjB4ZikgPiBHcHdyZGVsdGEpCi0JCQkJdDEgPSAodmFsdWUmMHhmKS0oR3B3cmRlbHRhKTsKLQkJCWVsc2UKLQkJCQl0MSA9IDA7Ci0JCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBHcHdyZGVsdGEpCi0JCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oR3B3cmRlbHRhKTsKLQkJCWVsc2UKLQkJCQl0MiA9IDA7Ci0JCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gR3B3cmRlbHRhKQotCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShHcHdyZGVsdGEpOwotCQkJZWxzZQotCQkJCXQzID0gMDsKLQkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEdwd3JkZWx0YSkKLQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShHcHdyZGVsdGEpOwotCQkJZWxzZQotCQkJCXQ0ID0gMDsKLQkJfQotCQlHZGF0YSB8PSAoKHQxPDwxNikgKyAodDI8PDIwKSArICh0Mzw8MjQpICsgKHQ0PDwyOCkpOwotCQlkYXRhIHw9ICh2YWx1ZTw8MTYpOwotCi0JCS8qIEZvciAyME0vNDBNIFBvd2VyIERlbHRhIGlzc3VlICovCi0JCXBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSA9IGRhdGE7Ci0JCXBBZC0+VHgyME1Qd3JDZmdHQmFuZFtpXSA9IGRhdGE7Ci0JCXBBZC0+VHg0ME1Qd3JDZmdBQmFuZFtpXSA9IEFkYXRhOwotCQlwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbaV0gPSBHZGF0YTsKLQotCQlpZiAoZGF0YSAhPSAweGZmZmZmZmZmKQotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBkYXRhKTsKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIjIwTUh6IEJXLCAyLjRHIGJhbmQtJWx4LCAgQWRhdGEgPSAlbHgsICBHZGF0YSA9ICVseCBcbiIsIGRhdGEsIEFkYXRhLCBHZGF0YSkpOwotCX0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUmVhZCBpbml0aWFsIGNoYW5uZWwgcG93ZXIgcGFyYW1ldGVycyBmcm9tIEVFUFJPTQotCi0JQXJndW1lbnRzOgotCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUFJlYWRDaGFubmVsUHdyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCVVDSEFSCQkJCWksIGNob2Zmc2V0OwotCUVFUFJPTV9UWF9QV1JfU1RSVUMJICAgIFBvd2VyOwotCUVFUFJPTV9UWF9QV1JfU1RSVUMJICAgIFBvd2VyMjsKLQotCS8vIFJlYWQgVHggcG93ZXIgdmFsdWUgZm9yIGFsbCBjaGFubmVscwotCS8vIFZhbHVlIGZyb20gMSAtIDB4N2YuIERlZmF1bHQgdmFsdWUgaXMgMjQuCi0JLy8gUG93ZXIgdmFsdWUgOiAyLjRHIDB4MDAgKDApIH4gMHgxRiAoMzEpCi0JLy8gICAgICAgICAgICAgOiA1LjVHIDB4RjkgKC03KSB+IDB4MEYgKDE1KQotCi0JLy8gMC4gMTFiL2csIGNoMSAtIGNoIDE0Ci0JZm9yIChpID0gMDsgaSA8IDc7IGkrKykKLQl7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0dfVFhfUFdSX09GRlNFVCArIGkgKiAyLCBQb3dlci53b3JkKTsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fR19UWDJfUFdSX09GRlNFVCArIGkgKiAyLCBQb3dlcjIud29yZCk7Ci0JCXBBZC0+VHhQb3dlcltpICogMl0uQ2hhbm5lbCA9IGkgKiAyICsgMTsKLQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgMV0uQ2hhbm5lbCA9IGkgKiAyICsgMjsKLQotCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUwID4gMzEpIHx8IChQb3dlci5maWVsZC5CeXRlMCA8IDApKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JCWVsc2UKLQkJCXBBZC0+VHhQb3dlcltpICogMl0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMDsKLQotCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUxID4gMzEpIHx8IChQb3dlci5maWVsZC5CeXRlMSA8IDApKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgMV0uUG93ZXIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCQllbHNlCi0JCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyAxXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUxOwotCi0JCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUwID4gMzEpIHx8IChQb3dlcjIuZmllbGQuQnl0ZTAgPCAwKSkKLQkJCXBBZC0+VHhQb3dlcltpICogMl0uUG93ZXIyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQkJZWxzZQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTA7Ci0KLQkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTEgPiAzMSkgfHwgKFBvd2VyMi5maWVsZC5CeXRlMSA8IDApKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgMV0uUG93ZXIyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQkJZWxzZQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgMV0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUxOwotCX0KLQotCS8vIDEuIFUtTklJIGxvd2VyL21pZGRsZSBiYW5kOiAzNiwgMzgsIDQwOyA0NCwgNDYsIDQ4OyA1MiwgNTQsIDU2OyA2MCwgNjIsIDY0IChpbmNsdWRpbmcgY2VudHJhbCBmcmVxdWVuY3kgaW4gQlcgNDBNSHopCi0JLy8gMS4xIEZpbGwgdXAgY2hhbm5lbAotCWNob2Zmc2V0ID0gMTQ7Ci0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLQl7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbAk9IDM2ICsgaSAqIDggKyAwOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCi0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uQ2hhbm5lbAk9IDM2ICsgaSAqIDggKyAyOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCi0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uQ2hhbm5lbAk9IDM2ICsgaSAqIDggKyA0OwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCX0KLQotCS8vIDEuMiBGaWxsIHVwIHBvd2VyCi0JZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQl7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFhfUFdSX09GRlNFVCArIGkgKiAyLCBQb3dlci53b3JkKTsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWDJfUFdSX09GRlNFVCArIGkgKiAyLCBQb3dlcjIud29yZCk7Ci0KLQkJaWYgKChQb3dlci5maWVsZC5CeXRlMCA8IDE2KSAmJiAoUG93ZXIuZmllbGQuQnl0ZTAgPj0gLTcpKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUwOwotCi0JCWlmICgoUG93ZXIuZmllbGQuQnl0ZTEgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUxID49IC03KSkKLQkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMTsKLQotCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMCA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUwID49IC03KSkKLQkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUwOwotCi0JCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlcjIuZmllbGQuQnl0ZTEgPj0gLTcpKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTE7Ci0JfQotCi0JLy8gMi4gSGlwcGVyTEFOIDIgMTAwLCAxMDIgLDEwNDsgMTA4LCAxMTAsIDExMjsgMTE2LCAxMTgsIDEyMDsgMTI0LCAxMjYsIDEyODsgMTMyLCAxMzQsIDEzNjsgMTQwIChpbmNsdWRpbmcgY2VudHJhbCBmcmVxdWVuY3kgaW4gQlcgNDBNSHopCi0JLy8gMi4xIEZpbGwgdXAgY2hhbm5lbAotCWNob2Zmc2V0ID0gMTQgKyAxMjsKLQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQotCXsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5DaGFubmVsCT0gMTAwICsgaSAqIDggKyAwOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCi0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uQ2hhbm5lbAk9IDEwMCArIGkgKiA4ICsgMjsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLkNoYW5uZWwJPSAxMDAgKyBpICogOCArIDQ7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JfQotCXBBZC0+VHhQb3dlclszICogNSArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbAkJPSAxNDA7Ci0JcEFkLT5UeFBvd2VyWzMgKiA1ICsgY2hvZmZzZXQgKyAwXS5Qb3dlcgkJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCXBBZC0+VHhQb3dlclszICogNSArIGNob2Zmc2V0ICsgMF0uUG93ZXIyCQk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0KLQkvLyAyLjIgRmlsbCB1cCBwb3dlcgotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JewotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMiwgUG93ZXIud29yZCk7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMiwgUG93ZXIyLndvcmQpOwotCi0JCWlmICgoUG93ZXIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUwID49IC03KSkKLQkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMDsKLQotCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlci5maWVsZC5CeXRlMSA+PSAtNykpCi0JCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTE7Ci0KLQkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMCA+PSAtNykpCi0JCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMDsKLQotCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMSA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUxID49IC03KSkKLQkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUxOwotCX0KLQotCS8vIDMuIFUtTklJIHVwcGVyIGJhbmQ6IDE0OSwgMTUxLCAxNTM7IDE1NywgMTU5LCAxNjE7IDE2NSwgMTY3LCAxNjk7IDE3MSwgMTczIChpbmNsdWRpbmcgY2VudHJhbCBmcmVxdWVuY3kgaW4gQlcgNDBNSHopCi0JLy8gMy4xIEZpbGwgdXAgY2hhbm5lbAotCWNob2Zmc2V0ID0gMTQgKyAxMiArIDE2OwotCS8qZm9yIChpID0gMDsgaSA8IDI7IGkrKykqLwotCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCi0JewotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLkNoYW5uZWwJPSAxNDkgKyBpICogOCArIDA7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0KLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5DaGFubmVsCT0gMTQ5ICsgaSAqIDggKyAyOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCi0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uQ2hhbm5lbAk9IDE0OSArIGkgKiA4ICsgNDsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQl9Ci0JcEFkLT5UeFBvd2VyWzMgKiAzICsgY2hvZmZzZXQgKyAwXS5DaGFubmVsCQk9IDE3MTsKLQlwQWQtPlR4UG93ZXJbMyAqIDMgKyBjaG9mZnNldCArIDBdLlBvd2VyCQk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JcEFkLT5UeFBvd2VyWzMgKiAzICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIJCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQotCXBBZC0+VHhQb3dlclszICogMyArIGNob2Zmc2V0ICsgMV0uQ2hhbm5lbAkJPSAxNzM7Ci0JcEFkLT5UeFBvd2VyWzMgKiAzICsgY2hvZmZzZXQgKyAxXS5Qb3dlcgkJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCXBBZC0+VHhQb3dlclszICogMyArIGNob2Zmc2V0ICsgMV0uUG93ZXIyCQk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0KLQkvLyAzLjIgRmlsbCB1cCBwb3dlcgotCS8qZm9yIChpID0gMDsgaSA8IDQ7IGkrKykqLwotCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JewotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMiwgUG93ZXIud29yZCk7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMiwgUG93ZXIyLndvcmQpOwotCi0JCWlmICgoUG93ZXIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUwID49IC03KSkKLQkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMDsKLQotCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlci5maWVsZC5CeXRlMSA+PSAtNykpCi0JCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTE7Ci0KLQkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMCA+PSAtNykpCi0JCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMDsKLQotCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMSA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUxID49IC03KSkKLQkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUxOwotCX0KLQotCS8vIDQuIFByaW50IGFuZCBEZWJ1ZwotCS8qY2hvZmZzZXQgPSAxNCArIDEyICsgMTYgKyA3OyovCi0JY2hvZmZzZXQgPSAxNCArIDEyICsgMTYgKyAxMTsKLQotCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlSZWFkIHRoZSBmb2xsb3dpbmcgZnJvbSB0aGUgcmVnaXN0cnkKLQkJMS4gQWxsIHRoZSBwYXJhbWV0ZXJzCi0JCTIuIE5ldHdvcmtBZGRyZXMKLQotCUFyZ3VtZW50czoKLQkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJV3JhcHBlckNvbmZpZ3VyYXRpb25Db250ZXh0CUZvciB1c2UgYnkgTmRpc09wZW5Db25maWd1cmF0aW9uCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5ESVNfU1RBVFVTX1NVQ0NFU1MKLQkJTkRJU19TVEFUVVNfRkFJTFVSRQotCQlORElTX1NUQVRVU19SRVNPVVJDRVMKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMJTklDUmVhZFJlZ1BhcmFtZXRlcnMoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCU5ESVNfSEFORExFCQkJV3JhcHBlckNvbmZpZ3VyYXRpb25Db250ZXh0Ci0JKQotewotCU5ESVNfU1RBVFVTCQkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQlEQkdQUklOVF9TKFN0YXR1cywgKCI8LS0gTklDUmVhZFJlZ1BhcmFtZXRlcnMsIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7Ci0JcmV0dXJuIFN0YXR1czsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUmVhZCBpbml0aWFsIHBhcmFtZXRlcnMgZnJvbSBFRVBST00KLQotCUFyZ3VtZW50czoKLQkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECU5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCW1hY19hZGRyKQotewotCVVJTlQzMgkJCWRhdGEgPSAwOwotCVVTSE9SVAkJCWksIHZhbHVlLCB2YWx1ZTI7Ci0JVUNIQVIJCQlUbXBQaHk7Ci0JRUVQUk9NX1RYX1BXUl9TVFJVQwkgICAgUG93ZXI7Ci0JRUVQUk9NX1ZFUlNJT05fU1RSVUMgICAgVmVyc2lvbjsKLQlFRVBST01fQU5URU5OQV9TVFJVQwlBbnRlbm5hOwotCUVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQyAgICBOaWNDb25maWcyOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzXG4iKSk7Ci0KLQlpZiAocEFkLT5jaGlwT3BzLmVlaW5pdCkKLQkJcEFkLT5jaGlwT3BzLmVlaW5pdChwQWQpOwotI2lmZGVmIFJUTVBfRUZVU0VfU1VQUE9SVAotI2lmZGVmIFJUMzB4eAotCWlmKCFwQWQtPmJGcm9jZUVFUFJPTUJ1ZmZlciAmJiBwQWQtPmJFRVBST01GaWxlKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzOjooRWZ1c2UpTG9hZCAgdG8gRUVQUk9NIEJ1ZmZlciBNb2RlXG4iKSk7Ci0JCWVGdXNlTG9hZEVFUFJPTShwQWQpOwotCX0KLSNlbmRpZiAvLyBSVDMweHggLy8KLSNlbmRpZiAvLyBSVE1QX0VGVVNFX1NVUFBPUlQgLy8KLQotCS8vIEluaXQgRUVQUk9NIEFkZHJlc3MgTnVtYmVyLCBiZWZvcmUgYWNjZXNzIEVFUFJPTTsgaWYgOTNjNDYsIEVFUFJPTUFkZHJlc3NOdW09NiwgZWxzZSBpZiA5M2M2NiwgRUVQUk9NQWRkcmVzc051bT04Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmZGF0YSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEUyUFJPTV9DU1IgPSAweCV4XG4iLCBkYXRhKSk7Ci0KLQlpZigoZGF0YSAmIDB4MzApID09IDApCi0JCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDY7CQkvLyA5M0M0NgotCWVsc2UgaWYoKGRhdGEgJiAweDMwKSA9PSAweDEwKQotCQlwQWQtPkVFUFJPTUFkZHJlc3NOdW0gPSA4OyAgICAgLy8gOTNDNjYKLQllbHNlCi0JCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDg7ICAgICAvLyA5M0M4NgotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBFRVBST01BZGRyZXNzTnVtID0gJWRcbiIsIHBBZC0+RUVQUk9NQWRkcmVzc051bSApKTsKLQotCS8vIFJUMjg2MCBNQUMgbm8gbG9uZ2VyIGF1dG8gbG9hZCBNQUMgYWRkcmVzcyBmcm9tIEUyUFJPTS4gRHJpdmVyIGhhcyB0byBpbnRpYWxpemUKLQkvLyBNQUMgYWRkcmVzcyByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIEUyUFJPTSBzZXR0aW5nCi0JaWYgKG1hY19hZGRyID09IE5VTEwgfHwKLQkJc3RybGVuKChQU1RSSU5HKSBtYWNfYWRkcikgIT0gMTcgfHwKLQkJbWFjX2FkZHJbMl0gIT0gJzonICB8fCBtYWNfYWRkcls1XSAhPSAnOicgIHx8IG1hY19hZGRyWzhdICE9ICc6JyB8fAotCQltYWNfYWRkclsxMV0gIT0gJzonIHx8IG1hY19hZGRyWzE0XSAhPSAnOicpCi0JewotCQlVU0hPUlQgIEFkZHIwMSxBZGRyMjMsQWRkcjQ1IDsKLQotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDQsIEFkZHIwMSk7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgwNiwgQWRkcjIzKTsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDA4LCBBZGRyNDUpOwotCi0JCXBBZC0+UGVybWFuZW50QWRkcmVzc1swXSA9IChVQ0hBUikoQWRkcjAxICYgMHhmZik7Ci0JCXBBZC0+UGVybWFuZW50QWRkcmVzc1sxXSA9IChVQ0hBUikoQWRkcjAxID4+IDgpOwotCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMl0gPSAoVUNIQVIpKEFkZHIyMyAmIDB4ZmYpOwotCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbM10gPSAoVUNIQVIpKEFkZHIyMyA+PiA4KTsKLQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzRdID0gKFVDSEFSKShBZGRyNDUgJiAweGZmKTsKLQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzVdID0gKFVDSEFSKShBZGRyNDUgPj4gOCk7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW5pdGlhbGl6ZSBNQUMgQWRkcmVzcyBmcm9tIEUyUFJPTSBcbiIpKTsKLQl9Ci0JZWxzZQotCXsKLQkJSU5UCQlqOwotCQlQU1RSSU5HCW1hY3B0cjsKLQotCQltYWNwdHIgPSAoUFNUUklORykgbWFjX2FkZHI7Ci0KLQkJZm9yIChqPTA7IGo8TUFDX0FERFJfTEVOOyBqKyspCi0JCXsKLQkJCUF0b0gobWFjcHRyLCAmcEFkLT5QZXJtYW5lbnRBZGRyZXNzW2pdLCAxKTsKLQkJCW1hY3B0cj1tYWNwdHIrMzsKLQkJfQotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkluaXRpYWxpemUgTUFDIEFkZHJlc3MgZnJvbSBtb2R1bGUgcGFyYW1ldGVyIFxuIikpOwotCX0KLQotCi0JewotCQkvL21vcmUgY29udmVuaW5ldCB0byB0ZXN0IG1ic3NpZCwgc28gYXAncyBic3NpZCAmMHhmMQotCQlpZiAocEFkLT5QZXJtYW5lbnRBZGRyZXNzWzBdID09IDB4ZmYpCi0JCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0gPSBSYW5kb21CeXRlKHBBZCkmMHhmODsKLQotCQkvL2lmIChwQWQtPlBlcm1hbmVudEFkZHJlc3NbNV0gPT0gMHhmZikKLQkJLy8JcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzVdID0gUmFuZG9tQnl0ZShwQWQpJjB4Zjg7Ci0KLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiRTJQUk9NIE1BQzogPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzBdLCBwQWQtPlBlcm1hbmVudEFkZHJlc3NbMV0sCi0JCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMl0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1szXSwKLQkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1s0XSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzVdKSk7Ci0JCWlmIChwQWQtPmJMb2NhbEFkbWluTUFDID09IEZBTFNFKQotCQl7Ci0JCQlNQUNfRFcwX1NUUlVDIGNzcjI7Ci0JCQlNQUNfRFcxX1NUUlVDIGNzcjM7Ci0JCQlDT1BZX01BQ19BRERSKHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+UGVybWFuZW50QWRkcmVzcyk7Ci0JCQljc3IyLmZpZWxkLkJ5dGUwID0gcEFkLT5DdXJyZW50QWRkcmVzc1swXTsKLQkJCWNzcjIuZmllbGQuQnl0ZTEgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzFdOwotCQkJY3NyMi5maWVsZC5CeXRlMiA9IHBBZC0+Q3VycmVudEFkZHJlc3NbMl07Ci0JCQljc3IyLmZpZWxkLkJ5dGUzID0gcEFkLT5DdXJyZW50QWRkcmVzc1szXTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19BRERSX0RXMCwgY3NyMi53b3JkKTsKLQkJCWNzcjMud29yZCA9IDA7Ci0JCQljc3IzLmZpZWxkLkJ5dGU0ID0gcEFkLT5DdXJyZW50QWRkcmVzc1s0XTsKLQkJCWNzcjMuZmllbGQuQnl0ZTUgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzVdOwotCQkJY3NyMy5maWVsZC5VMk1lTWFzayA9IDB4ZmY7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQUREUl9EVzEsIGNzcjMud29yZCk7Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJFMlBST00gTUFDOiA9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCQkJCQkJUFJJTlRfTUFDKHBBZC0+UGVybWFuZW50QWRkcmVzcykpKTsKLQkJfQotCX0KLQotCS8vIGlmIG5vdCByZXR1cm4gZWFybHkuIGNhdXNlIGZhaWwgYXQgZW11bGF0aW9uLgotCS8vIEluaXQgdGhlIGNoYW5uZWwgbnVtYmVyIGZvciBUWCBjaGFubmVsIHBvd2VyCi0JUlRNUFJlYWRDaGFubmVsUHdyKHBBZCk7Ci0KLQkvLyBpZiBFMlBST00gdmVyc2lvbiBtaXNtYXRjaCB3aXRoIGRyaXZlcidzIGV4cGVjdGF0aW9uLCB0aGVuIHNraXAKLQkvLyBhbGwgc3Vic2VxdWVudCBFMlJQT00gcmV0aWV2YWwgYW5kIHNldCBhIHN5c3RlbSBlcnJvciBiaXQgdG8gbm90aWZ5IEdVSQotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1ZFUlNJT05fT0ZGU0VULCBWZXJzaW9uLndvcmQpOwotCXBBZC0+RWVwcm9tVmVyc2lvbiA9IFZlcnNpb24uZmllbGQuVmVyc2lvbiArIFZlcnNpb24uZmllbGQuRmFlUmVsZWFzZU51bWJlciAqIDI1NjsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJFMlBST006IFZlcnNpb24gPSAlZCwgRkFFIHJlbGVhc2UgIyVkXG4iLCBWZXJzaW9uLmZpZWxkLlZlcnNpb24sIFZlcnNpb24uZmllbGQuRmFlUmVsZWFzZU51bWJlcikpOwotCi0JaWYgKFZlcnNpb24uZmllbGQuVmVyc2lvbiA+IFZBTElEX0VFUFJPTV9WRVJTSU9OKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiRTJQUk9NOiBXUk9ORyBWRVJTSU9OIDB4JXgsIHNob3VsZCBiZSAlZFxuIixWZXJzaW9uLmZpZWxkLlZlcnNpb24sIFZBTElEX0VFUFJPTV9WRVJTSU9OKSk7Ci0JCS8qcEFkLT5TeXN0ZW1FcnJvckJpdG1hcCB8PSAweDAwMDAwMDAxOwotCi0JCS8vIGhhcmQtY29kZSBkZWZhdWx0IHZhbHVlIHdoZW4gbm8gcHJvcGVyIEUyUFJPTSBpbnN0YWxsZWQKLQkJcEFkLT5iQXV0b1R4QWdjQSA9IEZBTFNFOwotCQlwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7Ci0KLQkJLy8gRGVmYXVsdCB0aGUgY2hhbm5lbCBwb3dlcgotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9PRl9DSEFOTkVMUzsgaSsrKQotCQkJcEFkLT5UeFBvd2VyW2ldLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQotCQkvLyBEZWZhdWx0IHRoZSBjaGFubmVsIHBvd2VyCi0JCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX09GXzExSkNIQU5ORUxTOyBpKyspCi0JCQlwQWQtPlR4UG93ZXIxMUpbaV0uUG93ZXIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCi0JCWZvcihpID0gMDsgaSA8IE5VTV9FRVBST01fQkJQX1BBUk1TOyBpKyspCi0JCQlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSA9IDB4ZmZmZjsKLQkJcmV0dXJuOyAgKi8KLQl9Ci0KLQkvLyBSZWFkIEJCUCBkZWZhdWx0IHZhbHVlIGZyb20gRUVQUk9NIGFuZCBzdG9yZSB0byBhcnJheShFRVBST01EZWZhdWx0VmFsdWUpIGluIHBBZAotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX05JQzFfT0ZGU0VULCB2YWx1ZSk7Ci0JcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMF0gPSB2YWx1ZTsKLQotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX05JQzJfT0ZGU0VULCB2YWx1ZSk7Ci0JcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMV0gPSB2YWx1ZTsKLQotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgzOCwgdmFsdWUpOwkvLyBDb3VudHJ5IFJlZ2lvbgotCXBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzJdID0gdmFsdWU7Ci0KLQlmb3IoaSA9IDA7IGkgPCA4OyBpKyspCi0JewotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9CQlBfQkFTRV9PRkZTRVQgKyBpKjIsIHZhbHVlKTsKLQkJcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbaSszXSA9IHZhbHVlOwotCX0KLQotCS8vIFdlIGhhdmUgdG8gcGFyc2UgTklDIGNvbmZpZ3VyYXRpb24gMCBhdCBoZXJlLgotCS8vIElmIFRTU0kgZGlkIG5vdCBoYXZlIHByZWxvYWRlZCB2YWx1ZSwgaXQgc2hvdWxkIHJlc2V0IHRoZSBUeEF1dG9BZ2MgdG8gZmFsc2UKLQkvLyBUaGVyZWZvcmUsIHdlIGhhdmUgdG8gcmVhZCBUeEF1dG9BZ2MgY29udHJvbCBiZWZvcmVoYW5kLgotCS8vIFJlYWQgVHggQUdDIGNvbnRyb2wgYml0Ci0JQW50ZW5uYS53b3JkID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMF07Ci0JaWYgKEFudGVubmEud29yZCA9PSAweEZGRkYpCi0JewotI2lmZGVmIFJUMzB4eAotCQlpZihJU19SVDMwOTAocEFkKXx8IElTX1JUMzM5MChwQWQpKQotCQl7Ci0JCQlBbnRlbm5hLndvcmQgPSAwOwotCQkJQW50ZW5uYS5maWVsZC5SZkljVHlwZSA9IFJGSUNfMzAyMDsKLQkJCUFudGVubmEuZmllbGQuVHhQYXRoID0gMTsKLQkJCUFudGVubmEuZmllbGQuUnhQYXRoID0gMTsKLQkJfQotCQllbHNlCi0jZW5kaWYgLy8gUlQzMHh4IC8vCi0JCXsKLQotCQkJQW50ZW5uYS53b3JkID0gMDsKLQkJCUFudGVubmEuZmllbGQuUmZJY1R5cGUgPSBSRklDXzI4MjA7Ci0JCQlBbnRlbm5hLmZpZWxkLlR4UGF0aCA9IDE7Ci0JCQlBbnRlbm5hLmZpZWxkLlJ4UGF0aCA9IDI7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIkUyUFJPTSBlcnJvciwgaGFyZCBjb2RlIGFzIDB4JTA0eFxuIiwgQW50ZW5uYS53b3JkKSk7Ci0JCX0KLQl9Ci0KLQkvLyBDaG9vc2UgdGhlIGRlc2lyZWQgVHgmUnggc3RyZWFtLgotCWlmICgocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID4gQW50ZW5uYS5maWVsZC5UeFBhdGgpKQotCQlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IEFudGVubmEuZmllbGQuVHhQYXRoOwotCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9PSAwKSB8fCAocEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPiBBbnRlbm5hLmZpZWxkLlJ4UGF0aCkpCi0JewotCQlwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9IEFudGVubmEuZmllbGQuUnhQYXRoOwotCi0JCWlmICgocEFkLT5NQUNWZXJzaW9uIDwgUkFMSU5LXzI4ODNfVkVSU0lPTikgJiYKLQkJCShwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA+IDIpKQotCQl7Ci0JCQkvLyBvbmx5IDIgUnggc3RyZWFtcyBmb3IgUlQyODYwIHNlcmllcwotCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAyOwotCQl9Ci0JfQotCi0JLy8gMyozCi0JLy8gcmVhZCB2YWx1ZSBmcm9tIEVFUFJPTSBhbmQgc2V0IHRoZW0gdG8gQ1NSMTc0IH4gMTc3IGluIGNoYWluMCB+IGNoYWluMgotCS8vIHlldCBpbXBsZW1lbnQKLQlmb3IoaT0wOyBpPDM7IGkrKykKLQl7Ci0JfQotCi0JTmljQ29uZmlnMi53b3JkID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMV07Ci0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCWlmICgoTmljQ29uZmlnMi53b3JkICYgMHgwMGZmKSA9PSAweGZmKQotCQl7Ci0JCQlOaWNDb25maWcyLndvcmQgJj0gMHhmZjAwOwotCQl9Ci0KLQkJaWYgKChOaWNDb25maWcyLndvcmQgPj4gOCkgPT0gMHhmZikKLQkJewotCQkJTmljQ29uZmlnMi53b3JkICY9IDB4MDBmZjsKLQkJfQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCWlmIChOaWNDb25maWcyLmZpZWxkLkR5bmFtaWNUeEFnY0NvbnRyb2wgPT0gMSkKLQkJcEFkLT5iQXV0b1R4QWdjQSA9IHBBZC0+YkF1dG9UeEFnY0cgPSBUUlVFOwotCWVsc2UKLQkJcEFkLT5iQXV0b1R4QWdjQSA9IHBBZC0+YkF1dG9UeEFnY0cgPSBGQUxTRTsKLQotCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJOSUNSZWFkRUVQUk9NUGFyYW1ldGVyczogUnhQYXRoID0gJWQsIFR4UGF0aCA9ICVkXG4iLCBBbnRlbm5hLmZpZWxkLlJ4UGF0aCwgQW50ZW5uYS5maWVsZC5UeFBhdGgpKTsKLQotCS8vIFNhdmUgdGhlIGFudGVubmEgZm9yIGZ1dHVyZSB1c2UKLQlwQWQtPkFudGVubmEud29yZCA9IEFudGVubmEud29yZDsKLQotCS8vIFNldCB0aGUgUmZJQ1R5cGUgaGVyZSwgdGhlbiB3ZSBjYW4gaW5pdGlhbGl6ZSBSRklDIHJlbGF0ZWQgb3BlcmF0aW9uIGNhbGxiYWNrcwotCXBBZC0+TWxtZS5SZWFsUnhQYXRoID0gKFVDSEFSKSBBbnRlbm5hLmZpZWxkLlJ4UGF0aDsKLQlwQWQtPlJmSWNUeXBlID0gKFVDSEFSKSBBbnRlbm5hLmZpZWxkLlJmSWNUeXBlOwotCi0jaWZkZWYgUlRNUF9SRl9SV19TVVBQT1JUCi0JUnRtcENoaXBPcHNSRkhvb2socEFkKTsKLSNlbmRpZiAvLyBSVE1QX1JGX1JXX1NVUFBPUlQgLy8KLQotCS8vCi0JLy8gUmVzZXQgUGh5TW9kZSBpZiB3ZSBkb24ndCBzdXBwb3J0IDgwMi4xMWEKLQkvLyBPbmx5IFJGSUNfMjg1MCAmIFJGSUNfMjc1MCBzdXBwb3J0IDgwMi4xMWEKLQkvLwotCWlmICgoQW50ZW5uYS5maWVsZC5SZkljVHlwZSAhPSBSRklDXzI4NTApCi0JCSYmIChBbnRlbm5hLmZpZWxkLlJmSWNUeXBlICE9IFJGSUNfMjc1MCkKLQkJJiYgKEFudGVubmEuZmllbGQuUmZJY1R5cGUgIT0gUkZJQ18zMDUyKSkKLQl7Ci0JCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdfTUlYRUQpIHx8Ci0JCQkocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBKSkKLQkJCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSBQSFlfMTFCR19NSVhFRDsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRCkJfHwKLQkJCQkgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQU5fTUlYRUQpCXx8Ci0JCQkJIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFHTl9NSVhFRCkJfHwKLQkJCQkgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl81RykpCi0JCQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gUEhZXzExQkdOX01JWEVEOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCX0KLQotCS8vIFJlYWQgVFNTSSByZWZlcmVuY2UgYW5kIFRTU0kgYm91bmRhcnkgZm9yIHRlbXBlcmF0dXJlIGNvbXBlbnNhdGlvbi4gVGhpcyBpcyB1Z2x5Ci0JLy8gMC4gMTFiL2cKLQl7Ci0JCS8qIHRoZXNlIGFyZSB0ZW1wYXR1cmUgcmVmZXJlbmNlIHZhbHVlICgweDAwIH4gMHhGRSkKLQkJICAgZXg6IDB4MDAgMHgxNSAweDI1IDB4NDUgMHg4OCAweEEwIDB4QjUgMHhEMCAweEYwCi0JCSAgIFRzc2lQbHVzQm91bmRhcnlHIFs0XSBbM10gWzJdIFsxXSBbMF0gKHNtYWxsZXIpICsKLQkJICAgVHNzaU1pbnVzQm91bmRhcnlHWzBdIFsxXSBbMl0gWzNdIFs0XSAobGFyZ2VyKSAqLwotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4NkUsIFBvd2VyLndvcmQpOwotCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1s0XSA9IFBvd2VyLmZpZWxkLkJ5dGUwOwotCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1szXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOwotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4NzAsIFBvd2VyLndvcmQpOwotCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1syXSA9IFBvd2VyLmZpZWxkLkJ5dGUwOwotCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1sxXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOwotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4NzIsIFBvd2VyLndvcmQpOwotCQlwQWQtPlRzc2lSZWZHICAgPSBQb3dlci5maWVsZC5CeXRlMDsgLyogcmVmZXJlbmNlIHZhbHVlIFswXSAqLwotCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzFdID0gUG93ZXIuZmllbGQuQnl0ZTE7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHg3NCwgUG93ZXIud29yZCk7Ci0JCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMl0gPSBQb3dlci5maWVsZC5CeXRlMDsKLQkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1szXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOwotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4NzYsIFBvd2VyLndvcmQpOwotCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzRdID0gUG93ZXIuZmllbGQuQnl0ZTA7Ci0JCXBBZC0+VHhBZ2NTdGVwRyA9IFBvd2VyLmZpZWxkLkJ5dGUxOwotCQlwQWQtPlR4QWdjQ29tcGVuc2F0ZUcgPSAwOwotCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1swXSA9IHBBZC0+VHNzaVJlZkc7Ci0JCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMF0gID0gcEFkLT5Uc3NpUmVmRzsKLQotCQkvLyBEaXNhYmxlIFR4QWdjIGlmIHRoZSBiYXNlZCB2YWx1ZSBpcyBub3QgcmlnaHQKLQkJaWYgKHBBZC0+VHNzaVJlZkcgPT0gMHhmZikKLQkJCXBBZC0+YkF1dG9UeEFnY0cgPSBGQUxTRTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkUyUFJPTTogRyBUc3NpWy00IC4uICs0XSA9ICVkICVkICVkICVkIC0gJWQgLSVkICVkICVkICVkLCBzdGVwPSVkLCB0dW5pbmc9JWRcbiIsCi0JCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1s0XSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbM10sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzJdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1sxXSwKLQkJCXBBZC0+VHNzaVJlZkcsCi0JCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzFdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzJdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzNdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzRdLAotCQkJcEFkLT5UeEFnY1N0ZXBHLCBwQWQtPmJBdXRvVHhBZ2NHKSk7Ci0JfQotCS8vIDEuIDExYQotCXsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweEQ0LCBQb3dlci53b3JkKTsKLQkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbNF0gPSBQb3dlci5maWVsZC5CeXRlMDsKLQkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbM10gPSBQb3dlci5maWVsZC5CeXRlMTsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweEQ2LCBQb3dlci53b3JkKTsKLQkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMl0gPSBQb3dlci5maWVsZC5CeXRlMDsKLQkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMV0gPSBQb3dlci5maWVsZC5CeXRlMTsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweEQ4LCBQb3dlci53b3JkKTsKLQkJcEFkLT5Uc3NpUmVmQSAgID0gUG93ZXIuZmllbGQuQnl0ZTA7Ci0JCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMV0gPSBQb3dlci5maWVsZC5CeXRlMTsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweERBLCBQb3dlci53b3JkKTsKLQkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVsyXSA9IFBvd2VyLmZpZWxkLkJ5dGUwOwotCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzNdID0gUG93ZXIuZmllbGQuQnl0ZTE7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhEQywgUG93ZXIud29yZCk7Ci0JCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbNF0gPSBQb3dlci5maWVsZC5CeXRlMDsKLQkJcEFkLT5UeEFnY1N0ZXBBID0gUG93ZXIuZmllbGQuQnl0ZTE7Ci0JCXBBZC0+VHhBZ2NDb21wZW5zYXRlQSA9IDA7Ci0JCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzBdID0gcEFkLT5Uc3NpUmVmQTsKLQkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVswXSAgPSBwQWQtPlRzc2lSZWZBOwotCi0JCS8vIERpc2FibGUgVHhBZ2MgaWYgdGhlIGJhc2VkIHZhbHVlIGlzIG5vdCByaWdodAotCQlpZiAocEFkLT5Uc3NpUmVmQSA9PSAweGZmKQotCQkJcEFkLT5iQXV0b1R4QWdjQSA9IEZBTFNFOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRTJQUk9NOiBBIFRzc2lbLTQgLi4gKzRdID0gJWQgJWQgJWQgJWQgLSAlZCAtJWQgJWQgJWQgJWQsIHN0ZXA9JWQsIHR1bmluZz0lZFxuIiwKLQkJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzRdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVszXSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMl0sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzFdLAotCQkJcEFkLT5Uc3NpUmVmQSwKLQkJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMV0sIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMl0sIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbM10sIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbNF0sCi0JCQlwQWQtPlR4QWdjU3RlcEEsIHBBZC0+YkF1dG9UeEFnY0EpKTsKLQl9Ci0JcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSA9IDB4MDsKLQotCS8vIFJlYWQgZnJlcXVlbmN5IG9mZnNldCBzZXR0aW5nIGZvciBSRgotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0ZSRVFfT0ZGU0VULCB2YWx1ZSk7Ci0JaWYgKCh2YWx1ZSAmIDB4MDBGRikgIT0gMHgwMEZGKQotCQlwQWQtPlJmRnJlcU9mZnNldCA9IChVTE9ORykgKHZhbHVlICYgMHgwMEZGKTsKLQllbHNlCi0JCXBBZC0+UmZGcmVxT2Zmc2V0ID0gMDsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJFMlBST006IFJGIEZyZXFPZmZzZXQ9MHglbHggXG4iLCBwQWQtPlJmRnJlcU9mZnNldCkpOwotCi0JLy9Db3VudHJ5UmVnaW9uIGJ5dGUgb2Zmc2V0ICgzOGgpCi0JdmFsdWUgPSBwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsyXSA+PiA4OwkJLy8gMi40RyBiYW5kCi0JdmFsdWUyID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMl0gJiAweDAwRkY7CS8vIDVHIGJhbmQKLQotCWlmICgodmFsdWUgPD0gUkVHSU9OX01BWElNVU1fQkdfQkFORCkgJiYgKHZhbHVlMiA8PSBSRUdJT05fTUFYSU1VTV9BX0JBTkQpKQotCXsKLQkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiA9ICgoVUNIQVIpIHZhbHVlKSB8IDB4ODA7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCA9ICgoVUNIQVIpIHZhbHVlMikgfCAweDgwOwotCQlUbXBQaHkgPSBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlOwotCQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gMHhmZjsKLQkJUlRNUFNldFBoeU1vZGUocEFkLCBUbXBQaHkpOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQlTZXRDb21tb25IVChwQWQpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCX0KLQotCS8vCi0JLy8gR2V0IFJTU0kgT2Zmc2V0IG9uIEVFUFJPTSAweDlBaCAmIDB4OUNoLgotCS8vIFRoZSB2YWxpZCB2YWx1ZSBhcmUgKC0xMCB+IDEwKQotCS8vCi0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9CR19PRkZTRVQsIHZhbHVlKTsKLQlwQWQtPkJHUnNzaU9mZnNldDAgPSB2YWx1ZSAmIDB4MDBmZjsKLQlwQWQtPkJHUnNzaU9mZnNldDEgPSAodmFsdWUgPj4gOCk7Ci0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9CR19PRkZTRVQrMiwgdmFsdWUpOwotCXBBZC0+QkdSc3NpT2Zmc2V0MiA9IHZhbHVlICYgMHgwMGZmOwotCXBBZC0+QUxOQUdhaW4xID0gKHZhbHVlID4+IDgpOwotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0xOQV9PRkZTRVQsIHZhbHVlKTsKLQlwQWQtPkJMTkFHYWluID0gdmFsdWUgJiAweDAwZmY7Ci0JcEFkLT5BTE5BR2FpbjAgPSAodmFsdWUgPj4gOCk7Ci0KLQkvLyBWYWxpZGF0ZSAxMWIvZyBSU1NJXzAgb2Zmc2V0LgotCWlmICgocEFkLT5CR1Jzc2lPZmZzZXQwIDwgLTEwKSB8fCAocEFkLT5CR1Jzc2lPZmZzZXQwID4gMTApKQotCQlwQWQtPkJHUnNzaU9mZnNldDAgPSAwOwotCi0JLy8gVmFsaWRhdGUgMTFiL2cgUlNTSV8xIG9mZnNldC4KLQlpZiAoKHBBZC0+QkdSc3NpT2Zmc2V0MSA8IC0xMCkgfHwgKHBBZC0+QkdSc3NpT2Zmc2V0MSA+IDEwKSkKLQkJcEFkLT5CR1Jzc2lPZmZzZXQxID0gMDsKLQotCS8vIFZhbGlkYXRlIDExYi9nIFJTU0lfMiBvZmZzZXQuCi0JaWYgKChwQWQtPkJHUnNzaU9mZnNldDIgPCAtMTApIHx8IChwQWQtPkJHUnNzaU9mZnNldDIgPiAxMCkpCi0JCXBBZC0+QkdSc3NpT2Zmc2V0MiA9IDA7Ci0KLQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9SU1NJX0FfT0ZGU0VULCB2YWx1ZSk7Ci0JcEFkLT5BUnNzaU9mZnNldDAgPSB2YWx1ZSAmIDB4MDBmZjsKLQlwQWQtPkFSc3NpT2Zmc2V0MSA9ICh2YWx1ZSA+PiA4KTsKLQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIChFRVBST01fUlNTSV9BX09GRlNFVCsyKSwgdmFsdWUpOwotCXBBZC0+QVJzc2lPZmZzZXQyID0gdmFsdWUgJiAweDAwZmY7Ci0JcEFkLT5BTE5BR2FpbjIgPSAodmFsdWUgPj4gOCk7Ci0KLQlpZiAoKChVQ0hBUilwQWQtPkFMTkFHYWluMSA9PSAweEZGKSB8fCAocEFkLT5BTE5BR2FpbjEgPT0gMHgwMCkpCi0JCXBBZC0+QUxOQUdhaW4xID0gcEFkLT5BTE5BR2FpbjA7Ci0JaWYgKCgoVUNIQVIpcEFkLT5BTE5BR2FpbjIgPT0gMHhGRikgfHwgKHBBZC0+QUxOQUdhaW4yID09IDB4MDApKQotCQlwQWQtPkFMTkFHYWluMiA9IHBBZC0+QUxOQUdhaW4wOwotCi0JLy8gVmFsaWRhdGUgMTFhIFJTU0lfMCBvZmZzZXQuCi0JaWYgKChwQWQtPkFSc3NpT2Zmc2V0MCA8IC0xMCkgfHwgKHBBZC0+QVJzc2lPZmZzZXQwID4gMTApKQotCQlwQWQtPkFSc3NpT2Zmc2V0MCA9IDA7Ci0KLQkvLyBWYWxpZGF0ZSAxMWEgUlNTSV8xIG9mZnNldC4KLQlpZiAoKHBBZC0+QVJzc2lPZmZzZXQxIDwgLTEwKSB8fCAocEFkLT5BUnNzaU9mZnNldDEgPiAxMCkpCi0JCXBBZC0+QVJzc2lPZmZzZXQxID0gMDsKLQotCS8vVmFsaWRhdGUgMTFhIFJTU0lfMiBvZmZzZXQuCi0JaWYgKChwQWQtPkFSc3NpT2Zmc2V0MiA8IC0xMCkgfHwgKHBBZC0+QVJzc2lPZmZzZXQyID4gMTApKQotCQlwQWQtPkFSc3NpT2Zmc2V0MiA9IDA7Ci0KLSNpZmRlZiBSVDMweHgKLQkvLwotCS8vIEdldCBUWCBtaXhlciBnYWluIHNldHRpbmcKLQkvLyAweGZmIGFyZSBpbnZhbGlkIHZhbHVlCi0JLy8gTm90ZTogUlQzMHhYIGRlZmF1bHQgdmFsdWUgaXMgMHgwMCBhbmQgd2lsbCBwcm9ncmFtIHRvIFJGX1IxNyBvbmx5IHdoZW4gdGhpcyB2YWx1ZSBpcyBub3QgemVyby4KLQkvLyAgICAgICBSVDM1OVggZGVmYXVsdCB2YWx1ZSBpcyAweDAyCi0JLy8KLQlpZiAoSVNfUlQzMHh4KHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkpCi0JewotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWE1JWEVSX0dBSU5fMl80RywgdmFsdWUpOwotCQlwQWQtPlR4TWl4ZXJHYWluMjRHID0gMDsKLQkJdmFsdWUgJj0gMHgwMGZmOwotCQlpZiAodmFsdWUgIT0gMHhmZikKLQkJewotCQkJdmFsdWUgJj0gMHgwNzsKLQkJCXBBZC0+VHhNaXhlckdhaW4yNEcgPSAoVUNIQVIpdmFsdWU7Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCi0KLQkvLwotCS8vIEdldCBMRUQgU2V0dGluZy4KLQkvLwotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgzYSwgdmFsdWUpOwotCXBBZC0+TGVkQ250bC53b3JkID0gKHZhbHVlPj44KTsKLQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9MRUQxX09GRlNFVCwgdmFsdWUpOwotCXBBZC0+TGVkMSA9IHZhbHVlOwotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0xFRDJfT0ZGU0VULCB2YWx1ZSk7Ci0JcEFkLT5MZWQyID0gdmFsdWU7Ci0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTEVEM19PRkZTRVQsIHZhbHVlKTsKLQlwQWQtPkxlZDMgPSB2YWx1ZTsKLQotCVJUTVBSZWFkVHhQd3JQZXJSYXRlKHBBZCk7Ci0KLSNpZmRlZiBTSU5HTEVfU0tVCi0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fREVGSU5FX01BWF9UWFBXUiwgcEFkLT5Db21tb25DZmcuRGVmaW5lTWF4VHhQd3IpOwotI2VuZGlmIC8vIFNJTkdMRV9TS1UgLy8KLQotI2lmZGVmIFJUMzB4eAotI2lmZGVmIFJUTVBfRUZVU0VfU1VQUE9SVAotCVJ0bXBFZnVzZVN1cHBvcnRDaGVjayhwQWQpOwotI2VuZGlmIC8vIFJUTVBfRUZVU0VfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFJUMzB4eCAvLwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzXG4iKSk7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVNldCBkZWZhdWx0IHZhbHVlIGZyb20gRUVQUk9NCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlOSUNJbml0QXNpY0Zyb21FRVBST00oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JVUlOVDMyCQkJCQlkYXRhID0gMDsKLQlVQ0hBUglCQlBSMSA9IDA7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JVVNIT1JUCQkJCQlpOwotLy8JRUVQUk9NX0FOVEVOTkFfU1RSVUMJQW50ZW5uYTsKLQlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMgICAgTmljQ29uZmlnMjsKLQlVQ0hBUglCQlBSMyA9IDA7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDSW5pdEFzaWNGcm9tRUVQUk9NXG4iKSk7Ci0JZm9yKGkgPSAzOyBpIDwgTlVNX0VFUFJPTV9CQlBfUEFSTVM7IGkrKykKLQl7Ci0JCVVDSEFSIEJicFJlZ0lkeCwgQmJwVmFsdWU7Ci0KLQkJaWYgKChwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSAhPSAweEZGRkYpICYmIChwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSAhPSAwKSkKLQkJewotCQkJQmJwUmVnSWR4ID0gKFVDSEFSKShwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSA+PiA4KTsKLQkJCUJicFZhbHVlICA9IChVQ0hBUikocEFkLT5FRVBST01EZWZhdWx0VmFsdWVbaV0gJiAweGZmKTsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCYnBSZWdJZHgsIEJicFZhbHVlKTsKLQkJfQotCX0KLQotCi0JTmljQ29uZmlnMi53b3JkID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMV07Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlpZiAoKE5pY0NvbmZpZzIud29yZCAmIDB4MDBmZikgPT0gMHhmZikKLQkJewotCQkJTmljQ29uZmlnMi53b3JkICY9IDB4ZmYwMDsKLQkJfQotCi0JCWlmICgoTmljQ29uZmlnMi53b3JkID4+IDgpID09IDB4ZmYpCi0JCXsKLQkJCU5pY0NvbmZpZzIud29yZCAmPSAweDAwZmY7Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkvLyBTYXZlIHRoZSBhbnRlbm5hIGZvciBmdXR1cmUgdXNlCi0JcEFkLT5OaWNDb25maWcyLndvcmQgPSBOaWNDb25maWcyLndvcmQ7Ci0KLSNpZmRlZiBSVDMweHgKLQkvLyBzZXQgZGVmYXVsdCBhbnRlbm5hIGFzIG1haW4KLQlpZiAocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjApCi0JCUFzaWNTZXRSeEFudChwQWQsIHBBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQpOwotI2VuZGlmIC8vIFJUMzB4eCAvLwotCi0JLy8KLQkvLyBTZW5kIExFRCBTZXR0aW5nIHRvIE1DVS4KLQkvLwotCWlmIChwQWQtPkxlZENudGwud29yZCA9PSAweEZGKQotCXsKLQkJcEFkLT5MZWRDbnRsLndvcmQgPSAweDAxOwotCQlwQWQtPkxlZDEgPSAweDU1NTU7Ci0JCXBBZC0+TGVkMiA9IDB4MjIyMTsKLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQlwQWQtPkxlZDMgPSAweEE5Rjg7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JfQotCi0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUyLCAweGZmLCAoVUNIQVIpcEFkLT5MZWQxLCAoVUNIQVIpKHBBZC0+TGVkMSA+PiA4KSk7Ci0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUzLCAweGZmLCAoVUNIQVIpcEFkLT5MZWQyLCAoVUNIQVIpKHBBZC0+TGVkMiA+PiA4KSk7Ci0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDU0LCAweGZmLCAoVUNIQVIpcEFkLT5MZWQzLCAoVUNIQVIpKHBBZC0+TGVkMyA+PiA4KSk7Ci0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUxLCAweGZmLCAwLCBwQWQtPkxlZENudGwuZmllbGQuUG9sYXJpdHkpOwotCi0JcEFkLT5MZWRJbmRpY2F0b3JTdHJlbmd0aCA9IDB4RkY7Ci0JUlRNUFNldFNpZ25hbExFRChwQWQsIC0xMDApOwkvLyBGb3JjZSBzaWduYWwgc3RyZW5ndGggTGVkIHRvIGJlIHR1cm5lZCBvZmYsIGJlZm9yZSBsaW5rIHVwCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJLy8gUmVhZCBIYXJkd2FyZSBjb250cm9sbGVkIFJhZGlvIHN0YXRlIGVuYWJsZSBiaXQKLQkJaWYgKE5pY0NvbmZpZzIuZmllbGQuSGFyZHdhcmVSYWRpb0NvbnRyb2wgPT0gMSkKLQkJewotCQkJcEFkLT5TdGFDZmcuYkhhcmR3YXJlUmFkaW8gPSBUUlVFOwotCi0JCQkvLyBSZWFkIEdQSU8gcGluMiBhcyBIYXJkd2FyZSBjb250cm9sbGVkIHJhZGlvIHN0YXRlCi0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIEdQSU9fQ1RSTF9DRkcsICZkYXRhKTsKLQkJCWlmICgoZGF0YSAmIDB4MDQpID09IDApCi0JCQl7Ci0JCQkJcEFkLT5TdGFDZmcuYkh3UmFkaW8gPSBGQUxTRTsKLQkJCQlwQWQtPlN0YUNmZy5iUmFkaW8gPSBGQUxTRTsKLS8vCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBXUl9QSU5fQ0ZHLCAweDAwMDAxODE4KTsKLQkJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCXBBZC0+U3RhQ2ZnLmJIYXJkd2FyZVJhZGlvID0gRkFMU0U7Ci0KLQkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKLQkJewotCQkJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PRkYpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PTik7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0jaWZkZWYgUlQzMDkwCi0JCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIFBvd2VyUmFkaW9PZmZDSUQsIDB4ZmYsIDB4MDIpOwotCQkJQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlclJhZGlvT2ZmQ0lEKTsKLSNlbmRpZiAvLyBSVDMwOTAgLy8KLSNpZm5kZWYgUlQzMDkwCi0JCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIDB4ZmYsIDB4ZmYsIDB4MDIpOwotI2VuZGlmIC8vIFJUMzA5MCAvLwotCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMxLCBQb3dlcldha2VDSUQsIDB4MDAsIDB4MDApOwotCQkJLy8gMi0xLiB3YWl0IGNvbW1hbmQgb2suCi0JCQlBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyV2FrZUNJRCk7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JCX0KLQl9Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0jaWZkZWYgUlQzMHh4Ci0JCWlmIChJU19SVDMwOTAocEFkKXx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKQotCQl7Ci0JCQlSVE1QX0NISVBfT1AgKnBDaGlwT3BzID0gJnBBZC0+Y2hpcE9wczsKLQkJCWlmIChwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUpCi0JCQkJcENoaXBPcHMtPkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlKHBBZCk7Ci0JCX0KLQkJLy8gMzA5MCBNQ1UgV2FrZXVwIGNvbW1hbmQgbmVlZHMgbW9yZSB0aW1lIHRvIGJlIHN0YWJsZS4KLQkJLy8gQmVmb3JlIHN0YWJsZSwgZG9uJ3QgaXNzdWUgb3RoZXIgTUNVIGNvbW1hbmQgdG8gcHJldmVudCBmcm9tIGZpcm13YXJlIGVycm9yLgotCi0JCWlmICgoSVNfUlQzMDkwKHBBZCl8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkKLQkJCSYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID09IDMpCi0JCQkmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzOjolZCxyZWxlYXNlIE1jdSBMb2NrXG4iLF9fRlVOQ1RJT05fXyxfX0xJTkVfXykpOwotCQkJUlRNUF9TRU1fTE9DSygmcEFkLT5NY3VDbWRMb2NrKTsKLQkJCXBBZC0+YnJ0MzB4eEJhbk1jdUNtZCA9IEZBTFNFOwotCQkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1jdUNtZExvY2spOwotCQl9Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkvLyBUdXJuIG9mZiBwYXRjaGluZyBmb3IgY2FyZGJ1cyBjb250cm9sbGVyCi0JaWYgKE5pY0NvbmZpZzIuZmllbGQuQ2FyZGJ1c0FjY2VsZXJhdGlvbiA9PSAxKQotCXsKLS8vCQlwQWQtPmJUZXN0MSA9IFRSVUU7Ci0JfQotCi0JaWYgKE5pY0NvbmZpZzIuZmllbGQuRHluYW1pY1R4QWdjQ29udHJvbCA9PSAxKQotCQlwQWQtPmJBdXRvVHhBZ2NBID0gcEFkLT5iQXV0b1R4QWdjRyA9IFRSVUU7Ci0JZWxzZQotCQlwQWQtPmJBdXRvVHhBZ2NBID0gcEFkLT5iQXV0b1R4QWdjRyA9IEZBTFNFOwotCS8vCi0JLy8gU2luY2UgQkJQIGhhcyBiZWVuIHByb2dhbWVkLCB0byBtYWtlIHN1cmUgQkJQIHNldHRpbmcgd2lsbCBiZQotCS8vIHVwYXRlIGluc2lkZSBvZiBBc2ljQW50ZW5uYVNlbGVjdCwgc28gcmVzZXQgdG8gVU5LTk9XTl9CQU5EISEKLQkvLwotCXBBZC0+Q29tbW9uQ2ZnLkJhbmRTdGF0ZSA9IFVOS05PV05fQkFORDsKLQotCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJCUFIzKTsKLQlCQlBSMyAmPSAofjB4MTgpOwotCWlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMykKLQl7Ci0JCUJCUFIzIHw9ICgweDEwKTsKLQl9Ci0JZWxzZSBpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCi0JewotCQlCQlBSMyB8PSAoMHg4KTsKLQl9Ci0JZWxzZSBpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCi0JewotCQlCQlBSMyB8PSAoMHgwKTsKLQl9Ci0JUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQkJQUjMpOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCS8vIEhhbmRsZSB0aGUgZGlmZmVyZW5jZSB3aGVuIDFUCi0JCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJCUFIxKTsKLQkJaWYocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQotCQl7Ci0JCUJCUFIxICY9ICh+MHgxOCk7Ci0JCX0KLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgQkJQUjEpOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlVzZSBIdyBSYWRpbyBDb250cm9sIFBpbj0lZDsgaWYgdXNlZCBQaW49JWQ7XG4iLAotCQkJCQlwQWQtPkNvbW1vbkNmZy5iSGFyZHdhcmVSYWRpbywgcEFkLT5Db21tb25DZmcuYkhhcmR3YXJlUmFkaW8pKTsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4UGF0aCA9ICVkLCBSeFBhdGggPSAlZCwgUkZJQz0lZCwgUG9sYXIrTEVEIG1vZGU9JXhcbiIsCi0JCQkJcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwgcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCwKLQkJCQlwQWQtPlJmSWNUeXBlLCBwQWQtPkxlZENudGwud29yZCkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJbml0QXNpY0Zyb21FRVBST01cbiIpKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUluaXRpYWxpemUgTklDIGhhcmR3YXJlCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMJTklDSW5pdGlhbGl6ZUFkYXB0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gICBCT09MRUFOICAgIGJIYXJkUmVzZXQpCi17Ci0JTkRJU19TVEFUVVMgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JV1BETUFfR0xPX0NGR19TVFJVQwlHbG9DZmc7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JVUlOVDMyCQkJVmFsdWU7Ci0JREVMQVlfSU5UX0NGR19TVFJVQwlJbnRDZmc7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0vLwlJTlRfTUFTS19DU1JfU1RSVUMJCUludE1hc2s7Ci0JVUxPTkcJaSA9MCwgaj0wOwotCUFDX1RYT1BfQ1NSMF9TVFJVQwljc3IwOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ0luaXRpYWxpemVBZGFwdGVyXG4iKSk7Ci0KLQkvLyAzLiBTZXQgRE1BIGdsb2JhbCBjb25maWd1cmF0aW9uIGV4Y2VwdCBUWF9ETUFfRU4gYW5kIFJYX0RNQV9FTiBiaXRzOgotcmV0cnk6Ci0JaSA9IDA7Ci0JZG8KLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKLQkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApICAmJiAoR2xvQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKLQkJCWJyZWFrOwotCi0JCVJUTVB1c2VjRGVsYXkoMTAwMCk7Ci0JCWkrKzsKLQl9d2hpbGUgKCBpPDEwMCk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IERNQSBvZmZzZXQgMHgyMDggPSAweCV4XG4iLCBHbG9DZmcud29yZCkpOwotCUdsb0NmZy53b3JkICY9IDB4ZmYwOwotCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPTE7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOwotCi0JLy8gUmVjb3JkIEhXIEJlYWNvbiBvZmZzZXQKLQlwQWQtPkJlYWNvbk9mZnNldFswXSA9IEhXX0JFQUNPTl9CQVNFMDsKLQlwQWQtPkJlYWNvbk9mZnNldFsxXSA9IEhXX0JFQUNPTl9CQVNFMTsKLQlwQWQtPkJlYWNvbk9mZnNldFsyXSA9IEhXX0JFQUNPTl9CQVNFMjsKLQlwQWQtPkJlYWNvbk9mZnNldFszXSA9IEhXX0JFQUNPTl9CQVNFMzsKLQlwQWQtPkJlYWNvbk9mZnNldFs0XSA9IEhXX0JFQUNPTl9CQVNFNDsKLQlwQWQtPkJlYWNvbk9mZnNldFs1XSA9IEhXX0JFQUNPTl9CQVNFNTsKLQlwQWQtPkJlYWNvbk9mZnNldFs2XSA9IEhXX0JFQUNPTl9CQVNFNjsKLQlwQWQtPkJlYWNvbk9mZnNldFs3XSA9IEhXX0JFQUNPTl9CQVNFNzsKLQotCS8vCi0JLy8gd3JpdGUgYWxsIHNoYXJlZCBSaW5nJ3MgYmFzZSBhZGRyZXNzIGludG8gQVNJQwotCS8vCi0KLQkvLyBhc2ljIHNpbXVsYXRpb24gc2VxdWVuY2UgcHV0IHRoaXMgYWhlYWQgYmVmb3JlIGxvYWRpbmcgZmlybXdhcmUuCi0JLy8gcGJmIGhhcmR3YXJlIHJlc2V0Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfUlNUX0lEWCwgMHgxMDAzZik7CS8vIDB4MTAwMDAgZm9yIHJlc2V0IHJ4LCAweDNmIHJlc2V0cyBhbGwgNiB0eCByaW5ncy4KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIDB4ZTFmKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIDB4ZTAwKTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCS8vIEluaXRpYWx6ZSBBU0lDIGZvciBUWCAmIFJ4IG9wZXJhdGlvbgotCWlmIChOSUNJbml0aWFsaXplQXNpYyhwQWQgLCBiSGFyZFJlc2V0KSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJaWYgKGorKyA9PSAwKQotCQl7Ci0JCQlOSUNMb2FkRmlybXdhcmUocEFkKTsKLQkJCWdvdG8gcmV0cnk7Ci0JCX0KLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkvLyBXcml0ZSBBQ19CSyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIKLQlWYWx1ZSA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhSaW5nW1FJRF9BQ19CS10uQ2VsbFswXS5BbGxvY1BhKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQVNFX1BUUjEsIFZhbHVlKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVFhfQkFTRV9QVFIxIDogMHgleFxuIiwgVmFsdWUpKTsKLQotCS8vIFdyaXRlIEFDX0JFIGJhc2UgYWRkcmVzcyByZWdpc3RlcgotCVZhbHVlID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5DZWxsWzBdLkFsbG9jUGEpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBU0VfUFRSMCwgVmFsdWUpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBUWF9CQVNFX1BUUjAgOiAweCV4XG4iLCBWYWx1ZSkpOwotCi0JLy8gV3JpdGUgQUNfVkkgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyCi0JVmFsdWUgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPlR4UmluZ1tRSURfQUNfVkldLkNlbGxbMF0uQWxsb2NQYSk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFTRV9QVFIyLCBWYWx1ZSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFRYX0JBU0VfUFRSMiA6IDB4JXhcbiIsIFZhbHVlKSk7Ci0KLQkvLyBXcml0ZSBBQ19WTyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIKLQlWYWx1ZSA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhSaW5nW1FJRF9BQ19WT10uQ2VsbFswXS5BbGxvY1BhKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQVNFX1BUUjMsIFZhbHVlKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVFhfQkFTRV9QVFIzIDogMHgleFxuIiwgVmFsdWUpKTsKLQotCS8vIFdyaXRlIEhDQ0EgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyCi0JLyoKLQlWYWx1ZSA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhSaW5nW1FJRF9IQ0NBXS5DZWxsWzBdLkFsbG9jUGEpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBU0VfUFRSNCwgVmFsdWUpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBUWF9CQVNFX1BUUjQgOiAweCV4XG4iLCBWYWx1ZSkpOwotCSovCi0KLQkvLyBXcml0ZSBNR01UX0JBU0VfQ1NSIHJlZ2lzdGVyCi0JVmFsdWUgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPk1nbXRSaW5nLkNlbGxbMF0uQWxsb2NQYSk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFTRV9QVFI1LCBWYWx1ZSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFRYX0JBU0VfUFRSNSA6IDB4JXhcbiIsIFZhbHVlKSk7Ci0KLQkvLyBXcml0ZSBSWF9CQVNFX0NTUiByZWdpc3RlcgotCVZhbHVlID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5SeFJpbmcuQ2VsbFswXS5BbGxvY1BhKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9CQVNFX1BUUiwgVmFsdWUpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBSWF9CQVNFX1BUUiA6IDB4JXhcbiIsIFZhbHVlKSk7Ci0KLQkvLyBJbml0IFJYIFJpbmcgaW5kZXggcG9pbnRlcgotCXBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4ID0gMDsKLQlwQWQtPlJ4UmluZy5SeENwdUlkeCA9IFJYX1JJTkdfU0laRS0xOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0NSWF9JRFgsIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4KTsKLQotCS8vIEluaXQgVFggcmluZ3MgaW5kZXggcG9pbnRlcgotCXsKLQkJZm9yIChpPTA7IGk8TlVNX09GX1RYX1JJTkc7IGkrKykKLQkJewotCQkJcEFkLT5UeFJpbmdbaV0uVHhTd0ZyZWVJZHggPSAwOwotCQkJcEFkLT5UeFJpbmdbaV0uVHhDcHVJZHggPSAwOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgKFRYX0NUWF9JRFgwICsgaSAqIDB4MTApICwgIHBBZC0+VHhSaW5nW2ldLlR4Q3B1SWR4KTsKLQkJfQotCX0KLQotCS8vIGluaXQgTUdNVCByaW5nIGluZGV4IHBvaW50ZXIKLQlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID0gMDsKLQlwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4ID0gMDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NR01UQ1RYX0lEWCwgIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgpOwotCi0JLy8KLQkvLyBzZXQgZWFjaCBSaW5nJ3MgU0laRSAgaW50byBBU0lDLiBEZXNjcmlwdG9yIFNpemUgaXMgZml4ZWQgYnkgZGVzaWduLgotCS8vCi0KLQkvLyBXcml0ZSBUWF9SSU5HX0NTUjAgcmVnaXN0ZXIKLQlWYWx1ZSA9IFRYX1JJTkdfU0laRTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NQVhfQ05UMCwgVmFsdWUpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01BWF9DTlQxLCBWYWx1ZSk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTUFYX0NOVDIsIFZhbHVlKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NQVhfQ05UMywgVmFsdWUpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01BWF9DTlQ0LCBWYWx1ZSk7Ci0JVmFsdWUgPSBNR01UX1JJTkdfU0laRTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NR01UTUFYX0NOVCwgVmFsdWUpOwotCi0JLy8gV3JpdGUgUlhfUklOR19DU1IgcmVnaXN0ZXIKLQlWYWx1ZSA9IFJYX1JJTkdfU0laRTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9NQVhfQ05ULCBWYWx1ZSk7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotCS8vIFdNTSBwYXJhbWV0ZXIKLQljc3IwLndvcmQgPSAwOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9UWE9QMF9DRkcsIGNzcjAud29yZCk7Ci0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKLQl7Ci0JCWNzcjAuZmllbGQuQWMwVHhvcCA9IDE5MjsJLy8gQUNfVkk6IDE5MiozMnVzIH49IDZtcwotCQljc3IwLmZpZWxkLkFjMVR4b3AgPSA5NjsJLy8gQUNfVk86IDk2KjMydXMgIH49IDNtcwotCX0KLQllbHNlCi0JewotCQljc3IwLmZpZWxkLkFjMFR4b3AgPSA5NjsJLy8gQUNfVkk6IDk2KjMydXMgfj0gM21zCi0JCWNzcjAuZmllbGQuQWMxVHhvcCA9IDQ4OwkvLyBBQ19WTzogNDgqMzJ1cyB+PSAxLjVtcwotCX0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDFfQ0ZHLCBjc3IwLndvcmQpOwotCi0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkvLyAzLiBTZXQgRE1BIGdsb2JhbCBjb25maWd1cmF0aW9uIGV4Y2VwdCBUWF9ETUFfRU4gYW5kIFJYX0RNQV9FTiBiaXRzOgotCWkgPSAwOwotCWRvCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7Ci0JCWlmICgoR2xvQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKSAgJiYgKEdsb0NmZy5maWVsZC5SeERNQUJ1c3kgPT0gMCkpCi0JCQlicmVhazsKLQotCQlSVE1QdXNlY0RlbGF5KDEwMDApOwotCQlpKys7Ci0JfXdoaWxlICggaSA8IDEwMCk7Ci0KLQlHbG9DZmcud29yZCAmPSAweGZmMDsKLQlHbG9DZmcuZmllbGQuRW5UWFdyaXRlQmFja0RET05FID0xOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKLQotCUludENmZy53b3JkID0gMDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBERUxBWV9JTlRfQ0ZHLCBJbnRDZmcud29yZCk7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotCS8vIHJlc2V0IGFjdGlvbgotCS8vIExvYWQgZmlybXdhcmUKLQkvLyAgU3RhdHVzID0gTklDTG9hZEZpcm13YXJlKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSW5pdGlhbGl6ZUFkYXB0ZXJcbiIpKTsKLQlyZXR1cm4gU3RhdHVzOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJSW5pdGlhbGl6ZSBBU0lDCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMJTklDSW5pdGlhbGl6ZUFzaWMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gIEJPT0xFQU4JCWJIYXJkUmVzZXQpCi17Ci0JVUxPTkcJCQlJbmRleCA9IDA7Ci0JVUNIQVIJCQlSMCA9IDB4ZmY7Ci0JVUlOVDMyCQkJTWFjQ3NyMTIgPSAwLCBDb3VudGVyID0gMDsKLSNpZmRlZiBSVDMweHgKLQlVQ0hBUgkJCWJicHJlZz0wOwotCVVDSEFSCQkJUkZWYWx1ZT0wOwotI2VuZGlmIC8vIFJUMzB4eCAvLwotCVVTSE9SVAkJCUtleUlkeDsKLQlJTlQJCQkJaSxhcGlkeDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJbml0aWFsaXplQXNpY1xuIikpOwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JUlRNUF9JT19XUklURTMyKHBBZCwgUFdSX1BJTl9DRkcsIDB4Myk7CS8vIFRvIGZpeCBkcml2ZXIgZGlzYWJsZS9lbmFibGUgaGFuZyBpc3N1ZSB3aGVuIHJhZGlvIG9mZgotCWlmIChiSGFyZFJlc2V0ID09IFRSVUUpCi0JewotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4Myk7Ci0JfQotCWVsc2UKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDEpOwotCi0JUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDApOwotCS8vIEluaXRpYWxpemUgTUFDIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKLQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOVU1fTUFDX1JFR19QQVJNUzsgSW5kZXgrKykKLQl7Ci0jaWZkZWYgUlQzMHh4Ci0JCWlmICgoTUFDUmVnVGFibGVbSW5kZXhdLlJlZ2lzdGVyID09IFRYX1NXX0NGRzApICYmICggSVNfUlQzMDkwKHBBZCkgfHwgIElTX1JUMzM5MChwQWQpKSkKLQkJewotCQkJTUFDUmVnVGFibGVbSW5kZXhdLlZhbHVlID0gMHgwMDAwMDQwMDsKLQkJfQotI2VuZGlmIC8vIFJUMzB4eCAvLwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIsIE1BQ1JlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7Ci0JfQotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTlVNX1NUQV9NQUNfUkVHX1BBUk1TOyBJbmRleCsrKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBTVEFNQUNSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIsIFNUQU1BQ1JlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotI2lmZGVmIFJUMzB4eAotCS8vIEluaXRpYWxpemUgUlQzMDcwIHNlcmlhbCBNQUMgcmVnaXN0ZXJzIHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIFJUMjg3MCBzZXJpYWwKLQlpZiAoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCl8fElTX1JUMzM5MChwQWQpKQotCXsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfU1dfQ0ZHMSwgMCk7Ci0KLQkJLy8gUlQzMDcxIHZlcnNpb24gRSBoYXMgZml4ZWQgdGhpcyBpc3N1ZQotCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMTEpCi0JCXsKLQkJCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuREFDVGVzdEJpdCA9PSAxKQotCQkJewotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1NXX0NGRzIsIDB4MkMpOwkvLyBUbyBmaXggdGhyb3VnaHB1dCBkcm9wIGRyYXN0aWNhbGx5Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfU1dfQ0ZHMiwgMHgwRik7CS8vIFRvIGZpeCB0aHJvdWdocHV0IGRyb3AgZHJhc3RpY2FsbHkKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1NXX0NGRzIsIDB4MCk7Ci0JCX0KLQl9Ci0JZWxzZSBpZiAoSVNfUlQzMDcwKHBBZCkpCi0JewotCQlpZiAoKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjAxKSkKLQkJewotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfU1dfQ0ZHMSwgMCk7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9TV19DRkcyLCAweDJDKTsJLy8gVG8gZml4IHRocm91Z2hwdXQgZHJvcCBkcmFzdGljYWxseQotCQl9Ci0JCWVsc2UKLQkJewotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfU1dfQ0ZHMiwgMCk7Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCi0KLQkvLwotCS8vIEJlZm9yZSBwcm9ncmFtIEJCUCwgd2UgbmVlZCB0byB3YWl0IEJCUC9SRiBnZXQgd2FrZSB1cC4KLQkvLwotCUluZGV4ID0gMDsKLQlkbwotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1RBVFVTX0NGRywgJk1hY0NzcjEyKTsKLQotCQlpZiAoKE1hY0NzcjEyICYgMHgwMykgPT0gMCkJLy8gaWYgQkIuUkYgaXMgc3RhYmxlCi0JCQlicmVhazsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGVjayBNQUNfU1RBVFVTX0NGRyAgPSBCdXN5ID0gJXhcbiIsIE1hY0NzcjEyKSk7Ci0JCVJUTVB1c2VjRGVsYXkoMTAwMCk7Ci0JfSB3aGlsZSAoSW5kZXgrKyA8IDEwMCk7Ci0KLQkvLyBUaGUgY29tbWFuZHMgdG8gZmlybXdhcmUgc2hvdWxkIGJlIGFmdGVyIHRoZXNlIGNvbW1hbmRzLCB0aGVzZSBjb21tYW5kcyB3aWxsIGluaXQgZmlybXdhcmUKLQkvLyBQQ0kgYW5kIFVTQiBhcmUgbm90IHRoZSBzYW1lIGJlY2F1c2UgUENJIGRyaXZlciBuZWVkcyB0byB3YWl0IGZvciBQQ0kgYnVzIHJlYWR5Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX0JCUF9BR0VOVCwgMCk7CS8vIGluaXRpYWxpemUgQkJQIFIvVyBhY2Nlc3MgYWdlbnQKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsIDApOwotI2lmZGVmIFJUMzA5MAotCS8vMjAwOC8xMS8yODpLSCBhZGQgdG8gZml4IHRoZSBkZWFkIHJmIGZyZXF1ZW5jeSBvZmZzZXQgYnVnPC0tCi0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDcyLCAwLCAwLCAwKTsKLQkvLzIwMDgvMTEvMjg6S0ggYWRkIHRvIGZpeCB0aGUgZGVhZCByZiBmcmVxdWVuY3kgb2Zmc2V0IGJ1Zy0tPgotI2VuZGlmIC8vIFJUMzA5MCAvLwotCVJUTVB1c2VjRGVsYXkoMTAwMCk7Ci0KLQkvLyBSZWFkIEJCUCByZWdpc3RlciwgbWFrZSBzdXJlIEJCUCBpcyB1cCBhbmQgcnVubmluZyBiZWZvcmUgd3JpdGUgbmV3IGRhdGEKLQlJbmRleCA9IDA7Ci0JZG8KLQl7Ci0JCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMCwgJlIwKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkJQIHZlcnNpb24gPSAleFxuIiwgUjApKTsKLQl9IHdoaWxlICgoKytJbmRleCA8IDIwKSAmJiAoKFIwID09IDB4ZmYpIHx8IChSMCA9PSAweDAwKSkpOwotCS8vQVNTRVJUKEluZGV4IDwgMjApOyAvL3RoaXMgd2lsbCBjYXVzZSBCU09EIG9uIENoZWNrLWJ1aWxkIGRyaXZlcgotCi0JaWYgKChSMCA9PSAweGZmKSB8fCAoUjAgPT0gMHgwMCkpCi0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCi0JLy8gSW5pdGlhbGl6ZSBCQlAgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQotCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9CQlBfUkVHX1BBUk1TOyBJbmRleCsrKQotCXsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUFJlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgQkJQUmVnVGFibGVbSW5kZXhdLlZhbHVlKTsKLQl9Ci0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkvLyBUT0RPOiBzaGlhbmcsIGNoZWNrIE1BQ1ZlcnNpb24sIGN1cnJlbnRseSwgcmJ1cy1iYXNlZCBjaGlwIHVzZSB0aGlzLgotCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODcyMDIwMCkKLQl7Ci0JCS8vVUNIQVIgdmFsdWU7Ci0JCVVMT05HIHZhbHVlMjsKLQotCQkvL2Rpc2FibGUgTUxEIGJ5IEJydWNlIDIwMDgwNzA0Ci0JCS8vQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMTA1LCAmdmFsdWUpOwotCQkvL0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxMDUsIHZhbHVlIHwgNCk7Ci0KLQkJLy9NYXhpbXVtIFBTRFUgbGVuZ3RoIGZyb20gMTZLIHRvIDMySyBieXRlcwotCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BWF9MRU5fQ0ZHLCAmdmFsdWUyKTsKLQkJdmFsdWUyICY9IH4oMHgzPDwxMik7Ci0JCXZhbHVlMiB8PSAoMHgyPDwxMik7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BWF9MRU5fQ0ZHLCB2YWx1ZTIpOwotCX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCS8vIGZvciBydDI4NjBFIGFuZCBhZnRlciwgaW5pdCBCQlBfUjg0IHdpdGggMHgxOS4gVGhpcyBpcyBmb3IgZXh0ZW5zaW9uIGNoYW5uZWwgb3ZlcmxhcHBpbmcgSU9ULgotCS8vIFJUMzA5MCBzaG91bGQgbm90IHByb2dyYW0gQkJQIFI4NCB0byAweDE5LCBvdGhlcndpc2UgVFggd2lsbCBibG9jay4KLQkvLzMwNzAvNzEvNzIsMzA5MCwzMDkwQSggYXJlIGluY2x1ZGVkIGluIFJUMzB4eCksMzU3MiwzMzkwCi0JaWYgKCgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSAhPSAweDAxMDEpICYmICEoSVNfUlQzMHh4KHBBZCl8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkpCi0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg0LCAweDE5KTsKLQotI2lmZGVmIFJUMzB4eAotLy8gYWRkIGJ5IGpvaG5saSwgUkYgcG93ZXIgc2VxdWVuY2Ugc2V0dXAKLQlpZiAoSVNfUlQzMHh4KHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpCi0JewkvL3VwZGF0ZSBmb3IgUlQzMDcwLzcxLzcyLzkwLzkxLzkyLDM1NzIsMzM5MC4KLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzksIDB4MTMpOwotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MCwgMHgwNSk7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgxLCAweDMzKTsKLQl9Ci0KLQlpZiAoSVNfUlQzMDkwKHBBZCl8fElTX1JUMzM5MChwQWQpKQkvLyBSVDMwOXgsIFJUMzA3MS83MgotCXsKLQkJLy8gZW5hYmxlIERDIGZpbHRlcgotCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPj0gMHgwMjExKQotCQl7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxMDMsIDB4YzApOwotCQl9Ci0KLQkJLy8gaW1wcm92ZSBwb3dlciBjb25zdW1wdGlvbgotCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEzOCwgJmJicHJlZyk7Ci0JCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCi0JCXsKLQkJCS8vIHR1cm4gb2ZmIHR4IERBQ18xCi0JCQliYnByZWcgPSAoYmJwcmVnIHwgMHgyMCk7Ci0JCX0KLQotCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQotCQl7Ci0JCQkvLyB0dXJuIG9mZiB0eCBBRENfMQotCQkJYmJwcmVnICY9ICh+MHgyKTsKLQkJfQotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxMzgsIGJicHJlZyk7Ci0KLQkJLy8gaW1wcm92ZSBwb3dlciBjb25zdW1wdGlvbiBpbiBSVDMwNzEgVmVyLkUKLQkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpID49IDB4MDIxMSkKLQkJewotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzMSwgJmJicHJlZyk7Ci0JCQliYnByZWcgJj0gKH4weDMpOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMzEsIGJicHJlZyk7Ci0JCX0KLQl9Ci0JZWxzZSBpZiAoSVNfUlQzMDcwKHBBZCkpCi0JewotCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPj0gMHgwMjAxKQotCQl7Ci0JCQkvLyBlbmFibGUgREMgZmlsdGVyCi0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxMDMsIDB4YzApOwotCi0JCQkvLyBpbXByb3ZlIHBvd2VyIGNvbnN1bXB0aW9uIGluIFJUMzA3MCBWZXIuRgotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzMSwgJmJicHJlZyk7Ci0JCQliYnByZWcgJj0gKH4weDMpOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMzEsIGJicHJlZyk7Ci0JCX0KLQotCQkvLyBUWF9MTzFfZW4sIFJGIFIxNyByZWdpc3RlciBCaXQgMyB0byAwCi0JCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjE3LCAmUkZWYWx1ZSk7Ci0JCVJGVmFsdWUgJj0gKH4weDA4KTsKLQkJLy8gdG8gZml4IHJ4IGxvbmcgcmFuZ2UgaXNzdWUKLQkJaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckcgPT0gMCkKLQkJewotCQkJUkZWYWx1ZSB8PSAweDIwOwotCQl9Ci0JCS8vIHNldCBSRl9SMTdfYml0WzI6MF0gZXF1YWwgdG8gRUVQUk9NIHNldHRpbmcgYXQgMHg0OGgKLQkJaWYgKHBBZC0+VHhNaXhlckdhaW4yNEcgPj0gMSkKLQkJewotCQkJUkZWYWx1ZSAmPSAofjB4Nyk7ICAvLyBjbGVhbiBiaXQgWzI6MF0KLQkJCVJGVmFsdWUgfD0gcEFkLT5UeE1peGVyR2FpbjI0RzsKLQkJfQotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMTcsIFJGVmFsdWUpOwotCX0KLS8vIGVuZCBqb2hubGkKLSNlbmRpZiAvLyBSVDMweHggLy8KLQotCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKLQl7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCAweDE2KTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIDB4MTIpOwotCX0KLQotCWlmIChwQWQtPk1BQ1ZlcnNpb24gPj0gUkFMSU5LXzI4ODBFX1ZFUlNJT04gJiYgcEFkLT5NQUNWZXJzaW9uIDwgUkFMSU5LXzMwNzBfVkVSU0lPTikgLy8gMyozCi0JewotCQkvLyBlbmxhcmdlIE1BWF9MRU5fQ0ZHCi0JCVVJTlQzMiBjc3I7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFYX0xFTl9DRkcsICZjc3IpOwotCQljc3IgJj0gMHhGRkY7Ci0JCWNzciB8PSAweDIwMDA7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BWF9MRU5fQ0ZHLCBjc3IpOwotCX0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JLy8gQWRkIHJhZGlvIG9mZiBjb250cm9sCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCWlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gRkFMU0UpCi0JCXsKLS8vCQkJUlRNUF9JT19XUklURTMyKHBBZCwgUFdSX1BJTl9DRkcsIDB4MDAwMDE4MTgpOwotCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCBSYWRpbyBPZmZcbiIpKTsKLQkJfQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCS8vIENsZWFyIHJhdyBjb3VudGVycwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDAsICZDb3VudGVyKTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQxLCAmQ291bnRlcik7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMiwgJkNvdW50ZXIpOwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDAsICZDb3VudGVyKTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQxLCAmQ291bnRlcik7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMiwgJkNvdW50ZXIpOwotCi0JLy8gQVNJQyB3aWxsIGtlZXAgZ2FyYmFnZSB2YWx1ZSBhZnRlciBib290Ci0JLy8gQ2xlYXIgYWxsIHNoYXJlZCBrZXkgdGFibGUgd2hlbiBpbml0aWFsCi0JLy8gVGhpcyByb3V0aW5lIGNhbiBiZSBpZ25vcmVkIGluIHJhZGlvLU9OL09GRiBvcGVyYXRpb24uCi0JaWYgKGJIYXJkUmVzZXQpCi0JewotCQlmb3IgKEtleUlkeCA9IDA7IEtleUlkeCA8IDQ7IEtleUlkeCsrKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSArIDQqS2V5SWR4LCAwKTsKLQkJfQotCi0JCS8vIENsZWFyIGFsbCBwYWlyd2lzZSBrZXkgdGFibGUgd2hlbiBpbml0aWFsCi0JCWZvciAoS2V5SWR4ID0gMDsgS2V5SWR4IDwgMjU2OyBLZXlJZHgrKykKLQkJewotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoS2V5SWR4ICogSFdfV0NJRF9BVFRSSV9TSVpFKSwgMSk7Ci0JCX0KLQl9Ci0KLQkvLyBhc3NlcnQgSE9TVCByZWFkeSBiaXQKLS8vICBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMSwgMHgwKTsgLy8gMjAwNC0wOS0xNCBhc2tlZCBieSBNYXJrCi0vLyAgUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjEsIDB4NCk7Ci0KLQkvLyBJdCBpc24ndCBuZWNlc3NhcnkgdG8gY2xlYXIgdGhpcyBzcGFjZSB3aGVuIG5vdCBoYXJkIHJlc2V0LgotCWlmIChiSGFyZFJlc2V0ID09IFRSVUUpCi0JewotCQkvLyBjbGVhciBhbGwgb24tY2hpcCBCRUFDT04gZnJhbWUgc3BhY2UKLQkJZm9yIChhcGlkeCA9IDA7IGFwaWR4IDwgSFdfQkVBQ09OX01BWF9DT1VOVDsgYXBpZHgrKykKLQkJewotCQkJZm9yIChpID0gMDsgaSA8IEhXX0JFQUNPTl9PRkZTRVQ+PjI7IGkrPTQpCi0JCQkJUlRNUF9JT19XUklURTMyKHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYXBpZHhdICsgaSwgMHgwMCk7Ci0JCX0KLQl9Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQkvLyBmb3IgcnQyODYwRSBhbmQgYWZ0ZXIsIGluaXQgVFhPUF9DVFJMX0NGRyB3aXRoIDB4NTgzZi4gVGhpcyBpcyBmb3IgZXh0ZW5zaW9uIGNoYW5uZWwgb3ZlcmxhcHBpbmcgSU9ULgotCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiYweGZmZmYpICE9IDB4MDEwMSkKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYT1BfQ1RSTF9DRkcsIDB4NTgzZik7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgUlQzMHh4Ci0jaWZkZWYgTkVXX0ZXCi0JaWYgKElTX1JUMzA3MChwQWQpIHx8ICBJU19SVDM1NzIocEFkKXx8SVNfUlQzMzkwKHBBZCl8fElTX1JUMzA5MChwQWQpKQotCXsKLQkJLy8gc2VuZCAweDM2IG1jdSBjb21tYW5kIGFmdGVyIDB4NzIgZm9yIFJUM3h4eCB0byBmaXggUmFkaW8tT2ZmIGN1cnJlbnQgbGVha2FnZSBpc3N1ZQotCQlSVE1QdXNlY0RlbGF5KDIwMCk7Ci0JCWlmIChwQWQtPmJ1c2VFZnVzZSkKLQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzNiwgMHhmZiwgMHhmZiwgMCk7Ci0JCWVsc2UKLQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzNiwgMHhmZiwgMHhmZiwgMHgwNCk7Ci0JCVJUTVB1c2VjRGVsYXkoMTApOwotCX0KLSNlbmRpZiAvLyBORVdfRlcgLy8KLSNlbmRpZiAvLyBSVDMweHggLy8KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJbml0aWFsaXplQXNpY1xuIikpOwotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUmVzZXQgTklDIEFzaWNzCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQlOb3RlOgotCQlSZXNldCBOSUMgdG8gaW5pdGlhbCBzdGF0ZSBBUyBJUyBzeXN0ZW0gYm9vdCB1cCB0aW1lLgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlOSUNJc3N1ZVJlc2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCVVJTlQzMglWYWx1ZSA9IDA7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ0lzc3VlUmVzZXRcbiIpKTsKLQotCS8vIEFib3J0IFR4LCBwcmV2ZW50IEFTSUMgZnJvbSB3cml0aW5nIHRvIEhvc3QgbWVtb3J5Ci0JLy9SVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DTlRMX0NTUiwgMHgwMDFmMDAwMCk7Ci0KLQkvLyBEaXNhYmxlIFJ4LCByZWdpc3RlciB2YWx1ZSBzdXBwb3NlZCB3aWxsIHJlbWFpbiBhZnRlciByZXNldAotCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwotCVZhbHVlICY9ICgweGZmZmZmZmYzKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLQotCS8vIElzc3VlIHJlc2V0IGFuZCBjbGVhciBmcm9tIHJlc2V0IHN0YXRlCi0JUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDAzKTsgLy8gMjAwNC0wOS0xNyBjaGFuZ2UgZnJvbSAweDAxCi0JUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDAwKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJc3N1ZVJlc2V0XG4iKSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlDaGVjayBBU0lDIHJlZ2lzdGVycyBhbmQgZmluZCBhbnkgcmVhc29uIHRoZSBzeXN0ZW0gbWlnaHQgaGFuZwotCi0JQXJndW1lbnRzOgotCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4JTklDQ2hlY2tGb3JIYW5nKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCXJldHVybiAoRkFMU0UpOwotfQotCi1WT0lEIE5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlUWF9TVEFfRklGT19TVFJVQwlTdGFGaWZvOwotCU1BQ19UQUJMRV9FTlRSWQkJKnBFbnRyeTsKLQlVQ0hBUgkJCQlpID0gMDsKLQlVQ0hBUgkJCXBpZCA9IDAsIHdjaWQgPSAwOwotCUNIQVIJCQkJcmVUcnk7Ci0JVUNIQVIJCQkJc3VjY01DUzsKLQotI2lmZGVmIFJBTElOS19BVEUKLQkvKiBOb3RoaW5nIHRvIGRvIGluIEFURSBtb2RlICovCi0JaWYgKEFURV9PTihwQWQpKQotCQlyZXR1cm47Ci0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0JCWRvCi0JCXsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0ZJRk8sICZTdGFGaWZvLndvcmQpOwotCi0JCQlpZiAoU3RhRmlmby5maWVsZC5iVmFsaWQgPT0gMCkKLQkJCQlicmVhazsKLQotCQkJd2NpZCA9IChVQ0hBUilTdGFGaWZvLmZpZWxkLndjaWQ7Ci0KLQotCQkvKiBpZ25vcmUgTm9BQ0sgYW5kIE1HTVQgZnJhbWUgdXNlIDB4RkYgYXMgV0NJRCAqLwotCQkJaWYgKChTdGFGaWZvLmZpZWxkLlR4QWNrUmVxdWlyZWQgPT0gMCkgfHwgKHdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpKQotCQkJewotCQkJCWkrKzsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLyogUElEIHN0b3JlIFR4IE1DUyBSYXRlICovCi0JCQlwaWQgPSAoVUNIQVIpU3RhRmlmby5maWVsZC5QaWRUeXBlOwotCi0JCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFt3Y2lkXTsKLQotCQkJcEVudHJ5LT5EZWJ1Z0ZJRk9Db3VudCsrOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQlpZiAoU3RhRmlmby5maWVsZC5UeEJGKSAvLyAzKjMKLQkJCQlwRW50cnktPlR4QkZDb3VudCsrOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0jaWZkZWYgVUFQU0RfQVBfU1VQUE9SVAotCQkJVUFQU0RfU1BfQVVFX0hhbmRsZShwQWQsIHBFbnRyeSwgU3RhRmlmby5maWVsZC5UeFN1Y2Nlc3MpOwotI2VuZGlmIC8vIFVBUFNEX0FQX1NVUFBPUlQgLy8KLQotCQkJaWYgKCFTdGFGaWZvLmZpZWxkLlR4U3VjY2VzcykKLQkJCXsKLQkJCQlwRW50cnktPkZJRk9Db3VudCsrOwotCQkJCXBFbnRyeS0+T25lU2VjVHhGYWlsQ291bnQrKzsKLQotCQkJCWlmIChwRW50cnktPkZJRk9Db3VudCA+PSAxKQotCQkJCXsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIyIpKTsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCQkJcEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93biA9IDY0OwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JCQkJCWlmKHBFbnRyeS0+UHNNb2RlID09IFBXUl9BQ1RJVkUpCi0JCQkJCXsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCQkJCWludCB0aWQ7Ci0JCQkJCQlmb3IgKHRpZD0wOyB0aWQ8TlVNX09GX1RJRDsgdGlkKyspCi0JCQkJCQl7Ci0JCQkJCQkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBwRW50cnktPkFpZCwgIHRpZCwgRkFMU0UsIEZBTFNFKTsKLQkJCQkJCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCQkJCQkJLy8gVXBkYXRlIHRoZSBjb250aW51b3VzIHRyYW5zbWlzc2lvbiBjb3VudGVyIGV4Y2VwdCBQUyBtb2RlCi0JCQkJCQlwRW50cnktPkNvbnRpbnVlVHhGYWlsQ250Kys7Ci0KLSNpZmRlZiBXRFNfU1VQUE9SVAotCQkJCQkJLy8gZml4IFdEUyBKYW0gaXNzdWUKLQkJCQkJCWlmKChwRW50cnktPlZhbGlkQXNXRFMgPT0gVFJVRSkKLQkJCQkJCQkmJiAocEVudHJ5LT5Mb2NrRW50cnlUeCA9PSBGQUxTRSkKLQkJCQkJCQkmJiAocEVudHJ5LT5Db250aW51ZVR4RmFpbENudCA+PSBwQWQtPkFwQ2ZnLkVudHJ5TGlmZUNoZWNrKSkKLQkJCQkJCXsKLQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJFbnRyeSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBCbG9ja2VkISEgKEZhaWwgQ250ID0gJWQpXG4iLAotCQkJCQkJCQlwRW50cnktPkFkZHJbMF0scEVudHJ5LT5BZGRyWzFdLHBFbnRyeS0+QWRkclsyXSxwRW50cnktPkFkZHJbM10sCi0JCQkJCQkJCXBFbnRyeS0+QWRkcls0XSxwRW50cnktPkFkZHJbNV0scEVudHJ5LT5Db250aW51ZVR4RmFpbENudCApKTsKLQotCQkJCQkJCXBFbnRyeS0+TG9ja0VudHJ5VHggPSBUUlVFOwotCQkJCQkJfQotI2VuZGlmIC8vIFdEU19TVVBQT1JUIC8vCi0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQkvLyBDbGVhciB0aGUgRklGT0NvdW50IHdoZW4gc3RhIGluIFBvd2VyIFNhdmUgbW9kZS4gQmFzaWNhbGx5IHdlIGFzc3VtZQotCQkJCQkJLy8gICAgIHRoaXMgdHggZXJyb3IgaGFwcGVuZWQgZHVlIHRvIHN0YSBqdXN0IGdvIHRvIHNsZWVwLgotCQkJCQkJcEVudHJ5LT5GSUZPQ291bnQgPSAwOwotCQkJCQkJcEVudHJ5LT5Db250aW51ZVR4RmFpbENudCA9IDA7Ci0JCQkJCX0KLQkJCQkJLy9wRW50cnktPkZJRk9Db3VudCA9IDA7Ci0JCQkJfQotCQkJCS8vcEVudHJ5LT5iU2VuZEJBUiA9IFRSVUU7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkJaWYgKChwRW50cnktPlBzTW9kZSAhPSBQV1JfU0FWRSkgJiYgKHBFbnRyeS0+Tm9CQURhdGFDb3VudERvd24gPiAwKSkKLQkJCQl7Ci0JCQkJCXBFbnRyeS0+Tm9CQURhdGFDb3VudERvd24tLTsKLQkJCQkJaWYgKHBFbnRyeS0+Tm9CQURhdGFDb3VudERvd249PTApCi0JCQkJCXsKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkBcbiIpKTsKLQkJCQkJfQotCQkJCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCQlwRW50cnktPkZJRk9Db3VudCA9IDA7Ci0JCQkJcEVudHJ5LT5PbmVTZWNUeE5vUmV0cnlPa0NvdW50Kys7Ci0JCQkJLy8gdXBkYXRlIE5vRGF0YUlkbGVDb3VudCB3aGVuIHN1Y2Vzc2Z1bCBzZW5kIHBhY2tldCB0byBTVEEuCi0JCQkJcEVudHJ5LT5Ob0RhdGFJZGxlQ291bnQgPSAwOwotCQkJCXBFbnRyeS0+Q29udGludWVUeEZhaWxDbnQgPSAwOwotI2lmZGVmIFdEU19TVVBQT1JUCi0JCQkJcEVudHJ5LT5Mb2NrRW50cnlUeCA9IEZBTFNFOwotI2VuZGlmIC8vIFdEU19TVVBQT1JUIC8vCi0JCQl9Ci0KLQkJCXN1Y2NNQ1MgPSBTdGFGaWZvLmZpZWxkLlN1Y2Nlc3NSYXRlICYgMHg3RjsKLQotCQkJcmVUcnkgPSBwaWQgLSBzdWNjTUNTOwotCi0JCQlpZiAoU3RhRmlmby5maWVsZC5UeFN1Y2Nlc3MpCi0JCQl7Ci0JCQkJcEVudHJ5LT5UWE1DU0V4cGVjdGVkW3BpZF0rKzsKLQkJCQlpZiAocGlkID09IHN1Y2NNQ1MpCi0JCQkJewotCQkJCQlwRW50cnktPlRYTUNTU3VjY2Vzc2Z1bFtwaWRdKys7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXBFbnRyeS0+VFhNQ1NBdXRvRmFsbEJhY2tbcGlkXVtzdWNjTUNTXSsrOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwRW50cnktPlRYTUNTRmFpbGVkW3BpZF0rKzsKLQkJCX0KLQotCQkJaWYgKHJlVHJ5ID4gMCkKLQkJCXsKLQkJCQlpZiAoKHBpZCA+PSAxMikgJiYgc3VjY01DUyA8PTcpCi0JCQkJewotCQkJCQlyZVRyeSAtPSA0OwotCQkJCX0KLQkJCQlwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICs9IHJlVHJ5OwotCQkJfQotCi0JCQlpKys7Ci0JCQkvLyBBU0lDIHN0b3JlIDE2IHN0YWNrCi0JCX0gd2hpbGUgKCBpIDwgKFRYX1JJTkdfU0laRTw8MSkgKTsKLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUmVhZCBzdGF0aXN0aWNhbCBjb3VudGVycyBmcm9tIGhhcmR3YXJlIHJlZ2lzdGVycyBhbmQgcmVjb3JkIHRoZW0KLQkJaW4gc29mdHdhcmUgdmFyaWFibGVzIGZvciBsYXRlciBvbiBxdWVyeQotCi0JQXJndW1lbnRzOgotCQlwQWQJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVVJTlQzMglPbGRWYWx1ZTsvLywgVmFsdWUyOwotCS8vVUxPTkcJUGFnZVN1bSwgT25lU2VjVHJhbnNtaXRDb3VudDsKLQkvL1VMT05HCVR4RXJyb3JSYXRpbywgUmV0cnksIEZhaWw7Ci0JUlhfU1RBX0NOVDBfU1RSVUMJIFJ4U3RhQ250MDsKLQlSWF9TVEFfQ05UMV9TVFJVQyAgIFJ4U3RhQ250MTsKLQlSWF9TVEFfQ05UMl9TVFJVQyAgIFJ4U3RhQ250MjsKLQlUWF9TVEFfQ05UMF9TVFJVQwkgVHhTdGFDbnQwOwotCVRYX1NUQV9DTlQxX1NUUlVDCSBTdGFUeDE7Ci0JVFhfU1RBX0NOVDJfU1RSVUMJIFN0YVR4MjsKLQlUWF9BR0dfQ05UX1NUUlVDCVR4QWdnQ250OwotCVRYX0FHR19DTlQwX1NUUlVDCVR4QWdnQ250MDsKLQlUWF9BR0dfQ05UMV9TVFJVQwlUeEFnZ0NudDE7Ci0JVFhfQUdHX0NOVDJfU1RSVUMJVHhBZ2dDbnQyOwotCVRYX0FHR19DTlQzX1NUUlVDCVR4QWdnQ250MzsKLQlUWF9BR0dfQ05UNF9TVFJVQwlUeEFnZ0NudDQ7Ci0JVFhfQUdHX0NOVDVfU1RSVUMJVHhBZ2dDbnQ1OwotCVRYX0FHR19DTlQ2X1NUUlVDCVR4QWdnQ250NjsKLQlUWF9BR0dfQ05UN19TVFJVQwlUeEFnZ0NudDc7Ci0JQ09VTlRFUl9SQUxJTksJCSpwUmFsaW5rQ291bnRlcnM7Ci0KLQotCXBSYWxpbmtDb3VudGVycyA9ICZwQWQtPlJhbGlua0NvdW50ZXJzOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMCwgJlJ4U3RhQ250MC53b3JkKTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQyLCAmUnhTdGFDbnQyLndvcmQpOwotCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQxLCAmUnhTdGFDbnQxLndvcmQpOwotCSAgICAvLyBVcGRhdGUgUlggUExDUCBlcnJvciBjb3VudGVyCi0JICAgIHBBZC0+UHJpdmF0ZUluZm8uUGh5UnhFcnJDbnQgKz0gUnhTdGFDbnQxLmZpZWxkLlBsY3BFcnI7Ci0JCS8vIFVwZGF0ZSBGYWxzZSBDQ0EgY291bnRlcgotCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0ZhbHNlQ0NBQ250ICs9IFJ4U3RhQ250MS5maWVsZC5GYWxzZUNjYTsKLQl9Ci0KLQkvLyBVcGRhdGUgRkNTIGNvdW50ZXJzCi0JT2xkVmFsdWU9IHBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5Mb3dQYXJ0OwotCXBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5Mb3dQYXJ0ICs9IChSeFN0YUNudDAuZmllbGQuQ3JjRXJyKTsgLy8gPj4gNyk7Ci0JaWYgKHBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5Mb3dQYXJ0IDwgT2xkVmFsdWUpCi0JCXBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5IaWdoUGFydCsrOwotCi0JLy8gQWRkIEZDUyBlcnJvciBjb3VudCB0byBwcml2YXRlIGNvdW50ZXJzCi0JcFJhbGlua0NvdW50ZXJzLT5PbmVTZWNSeEZjc0VyckNudCArPSBSeFN0YUNudDAuZmllbGQuQ3JjRXJyOwotCU9sZFZhbHVlID0gcFJhbGlua0NvdW50ZXJzLT5SZWFsRmNzRXJyQ291bnQudS5Mb3dQYXJ0OwotCXBSYWxpbmtDb3VudGVycy0+UmVhbEZjc0VyckNvdW50LnUuTG93UGFydCArPSBSeFN0YUNudDAuZmllbGQuQ3JjRXJyOwotCWlmIChwUmFsaW5rQ291bnRlcnMtPlJlYWxGY3NFcnJDb3VudC51Lkxvd1BhcnQgPCBPbGRWYWx1ZSkKLQkJcFJhbGlua0NvdW50ZXJzLT5SZWFsRmNzRXJyQ291bnQudS5IaWdoUGFydCsrOwotCi0JLy8gVXBkYXRlIER1cGxpY2F0ZSBSY3YgY2hlY2sKLQlwUmFsaW5rQ291bnRlcnMtPkR1cGxpY2F0ZVJjdiArPSBSeFN0YUNudDIuZmllbGQuUnhEdXBsaUNvdW50OwotCXBBZC0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQudS5Mb3dQYXJ0ICs9IFJ4U3RhQ250Mi5maWVsZC5SeER1cGxpQ291bnQ7Ci0JLy8gVXBkYXRlIFJYIE92ZXJmbG93IGNvdW50ZXIKLQlwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyICs9IChSeFN0YUNudDIuZmllbGQuUnhGaWZvT3ZlcmZsb3dDb3VudCk7Ci0KLQkvL3BBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudCA9IDA7Ci0KLQotCS8vaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpIHx8Ci0JLy8JKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkgJiYgKHBBZC0+TWFjVGFiLlNpemUgIT0gMSkpKQotCWlmICghcEFkLT5iVXBkYXRlQmNuQ250RG9uZSkKLQl7Ci0JLy8gVXBkYXRlIEJFQUNPTiBzZW50IGNvdW50Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJlR4U3RhQ250MC53b3JkKTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQxLCAmU3RhVHgxLndvcmQpOwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDIsICZTdGFUeDIud29yZCk7Ci0JcFJhbGlua0NvdW50ZXJzLT5PbmVTZWNCZWFjb25TZW50Q250ICs9IFR4U3RhQ250MC5maWVsZC5UeEJlYWNvbkNvdW50OwotCXBSYWxpbmtDb3VudGVycy0+T25lU2VjVHhSZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKLQlwUmFsaW5rQ291bnRlcnMtPk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKLQlwUmFsaW5rQ291bnRlcnMtPk9uZVNlY1R4RmFpbENvdW50ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKLQlwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7Ci0JcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKLQlwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC51Lkxvd1BhcnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OwotCX0KLQotCi0JLy9pZiAocEFkLT5iU3RhRmlmb1Rlc3QgPT0gVFJVRSkKLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQUdHX0NOVCwgJlR4QWdnQ250LndvcmQpOwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQUdHX0NOVDAsICZUeEFnZ0NudDAud29yZCk7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UMSwgJlR4QWdnQ250MS53b3JkKTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQyLCAmVHhBZ2dDbnQyLndvcmQpOwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQUdHX0NOVDMsICZUeEFnZ0NudDMud29yZCk7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQUdHX0NOVDQsICZUeEFnZ0NudDQud29yZCk7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQUdHX0NOVDUsICZUeEFnZ0NudDUud29yZCk7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQUdHX0NOVDYsICZUeEFnZ0NudDYud29yZCk7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQUdHX0NOVDcsICZUeEFnZ0NudDcud29yZCk7Ci0JCXBSYWxpbmtDb3VudGVycy0+VHhBZ2dDb3VudCArPSBUeEFnZ0NudC5maWVsZC5BZ2dUeENvdW50OwotCQlwUmFsaW5rQ291bnRlcnMtPlR4Tm9uQWdnQ291bnQgKz0gVHhBZ2dDbnQuZmllbGQuTm9uQWdnVHhDb3VudDsKLQkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzFNUERVQ291bnQgKz0gVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUxQ291bnQ7Ci0JCXBSYWxpbmtDb3VudGVycy0+VHhBZ2cyTVBEVUNvdW50ICs9IFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMkNvdW50OwotCi0JCXBSYWxpbmtDb3VudGVycy0+VHhBZ2czTVBEVUNvdW50ICs9IFR4QWdnQ250MS5maWVsZC5BZ2dTaXplM0NvdW50OwotCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnNE1QRFVDb3VudCArPSBUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTRDb3VudDsKLQkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzVNUERVQ291bnQgKz0gVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU1Q291bnQ7Ci0JCXBSYWxpbmtDb3VudGVycy0+VHhBZ2c2TVBEVUNvdW50ICs9IFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNkNvdW50OwotCi0JCXBSYWxpbmtDb3VudGVycy0+VHhBZ2c3TVBEVUNvdW50ICs9IFR4QWdnQ250My5maWVsZC5BZ2dTaXplN0NvdW50OwotCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnOE1QRFVDb3VudCArPSBUeEFnZ0NudDMuZmllbGQuQWdnU2l6ZThDb3VudDsKLQkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzlNUERVQ291bnQgKz0gVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemU5Q291bnQ7Ci0JCXBSYWxpbmtDb3VudGVycy0+VHhBZ2cxME1QRFVDb3VudCArPSBUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTEwQ291bnQ7Ci0KLQkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzExTVBEVUNvdW50ICs9IFR4QWdnQ250NS5maWVsZC5BZ2dTaXplMTFDb3VudDsKLQkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzEyTVBEVUNvdW50ICs9IFR4QWdnQ250NS5maWVsZC5BZ2dTaXplMTJDb3VudDsKLQkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzEzTVBEVUNvdW50ICs9IFR4QWdnQ250Ni5maWVsZC5BZ2dTaXplMTNDb3VudDsKLQkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzE0TVBEVUNvdW50ICs9IFR4QWdnQ250Ni5maWVsZC5BZ2dTaXplMTRDb3VudDsKLQotCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnMTVNUERVQ291bnQgKz0gVHhBZ2dDbnQ3LmZpZWxkLkFnZ1NpemUxNUNvdW50OwotCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnMTZNUERVQ291bnQgKz0gVHhBZ2dDbnQ3LmZpZWxkLkFnZ1NpemUxNkNvdW50OwotCi0JCS8vIENhbGN1bGF0ZSB0aGUgdHJhbnNtaXR0ZWQgQS1NUERVIGNvdW50Ci0JCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSBUeEFnZ0NudDAuZmllbGQuQWdnU2l6ZTFDb3VudDsKLQkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDAuZmllbGQuQWdnU2l6ZTJDb3VudCAvIDIpOwotCi0JCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemUzQ291bnQgLyAzKTsKLQkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTRDb3VudCAvIDQpOwotCi0JCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU1Q291bnQgLyA1KTsKLQkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTZDb3VudCAvIDYpOwotCi0JCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQzLmZpZWxkLkFnZ1NpemU3Q291bnQgLyA3KTsKLQkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDMuZmllbGQuQWdnU2l6ZThDb3VudCAvIDgpOwotCi0JCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemU5Q291bnQgLyA5KTsKLQkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTEwQ291bnQgLyAxMCk7Ci0KLQkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTExQ291bnQgLyAxMSk7Ci0JCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMkNvdW50IC8gMTIpOwotCi0JCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxM0NvdW50IC8gMTMpOwotCQlwUmFsaW5rQ291bnRlcnMtPlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Ni5maWVsZC5BZ2dTaXplMTRDb3VudCAvIDE0KTsKLQotCQlwUmFsaW5rQ291bnRlcnMtPlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTVDb3VudCAvIDE1KTsKLQkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE2Q291bnQgLyAxNik7Ci0JfQotCi0jaWZkZWYgREJHX0RJQUdOT1NFCi0JewotCQlSdG1wRGlhZ1N0cnVjdAkqcERpYWc7Ci0JCVVDSEFSCQkJQXJyYXlDdXJJZHgsIGk7Ci0KLQkJcERpYWcgPSAmcEFkLT5EaWFnU3RydWN0OwotCQlBcnJheUN1cklkeCA9IHBEaWFnLT5BcnJheUN1cklkeDsKLQotCQlpZiAocERpYWctPmluaXRlZCA9PSAwKQotCQl7Ci0JCQlOZGlzWmVyb01lbW9yeShwRGlhZywgc2l6ZW9mKHN0cnVjdCBfUnRtcERpYWdTdHJjdXRfKSk7Ci0JCQlwRGlhZy0+QXJyYXlTdGFydElkeCA9IHBEaWFnLT5BcnJheUN1cklkeCA9IDA7Ci0JCQlwRGlhZy0+aW5pdGVkID0gMTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIFR4Ci0JCQlwRGlhZy0+VHhGYWlsQ250W0FycmF5Q3VySWR4XSA9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKLQkJCXBEaWFnLT5UeEFnZ0NudFtBcnJheUN1cklkeF0gPSBUeEFnZ0NudC5maWVsZC5BZ2dUeENvdW50OwotCQkJcERpYWctPlR4Tm9uQWdnQ250W0FycmF5Q3VySWR4XSA9IFR4QWdnQ250LmZpZWxkLk5vbkFnZ1R4Q291bnQ7Ci0JCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMF0gPSBUeEFnZ0NudDAuZmllbGQuQWdnU2l6ZTFDb3VudDsKLQkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxXSA9IFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMkNvdW50OwotCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzJdID0gVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemUzQ291bnQ7Ci0JCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bM10gPSBUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTRDb3VudDsKLQkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVs0XSA9IFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNUNvdW50OwotCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzVdID0gVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU2Q291bnQ7Ci0JCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bNl0gPSBUeEFnZ0NudDMuZmllbGQuQWdnU2l6ZTdDb3VudDsKLQkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVs3XSA9IFR4QWdnQ250My5maWVsZC5BZ2dTaXplOENvdW50OwotCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzhdID0gVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemU5Q291bnQ7Ci0JCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bOV0gPSBUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTEwQ291bnQ7Ci0JCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMTBdID0gVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMUNvdW50OwotCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzExXSA9IFR4QWdnQ250NS5maWVsZC5BZ2dTaXplMTJDb3VudDsKLQkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxMl0gPSBUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTEzQ291bnQ7Ci0JCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMTNdID0gVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxNENvdW50OwotCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzE0XSA9IFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTVDb3VudDsKLQkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxNV0gPSBUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE2Q291bnQ7Ci0KLQkJCXBEaWFnLT5SeENyY0VyckNudFtBcnJheUN1cklkeF0gPSBSeFN0YUNudDAuZmllbGQuQ3JjRXJyOwotCi0JCQlJTkNfUklOR19JTkRFWChwRGlhZy0+QXJyYXlDdXJJZHgsICBESUFHTk9TRV9USU1FKTsKLQkJCUFycmF5Q3VySWR4ID0gcERpYWctPkFycmF5Q3VySWR4OwotCQkJZm9yIChpID0wOyBpIDwgOTsgaSsrKQotCQkJewotCQkJCXBEaWFnLT5UeERlc2NDbnRbQXJyYXlDdXJJZHhdW2ldPSAwOwotCQkJCXBEaWFnLT5UeFNXUXVlQ250W0FycmF5Q3VySWR4XVtpXSA9MDsKLQkJCQlwRGlhZy0+VHhNY3NDbnRbQXJyYXlDdXJJZHhdW2ldID0gMDsKLQkJCQlwRGlhZy0+UnhNY3NDbnRbQXJyYXlDdXJJZHhdW2ldID0gMDsKLQkJCX0KLQkJCXBEaWFnLT5UeERhdGFDbnRbQXJyYXlDdXJJZHhdID0gMDsKLQkJCXBEaWFnLT5UeEZhaWxDbnRbQXJyYXlDdXJJZHhdID0gMDsKLQkJCXBEaWFnLT5SeERhdGFDbnRbQXJyYXlDdXJJZHhdID0gMDsKLQkJCXBEaWFnLT5SeENyY0VyckNudFtBcnJheUN1cklkeF0gID0gMDsKLS8vCQkJZm9yIChpID0gOTsgaSA8IDE2OyBpKyspCi0JCQlmb3IgKGkgPSA5OyBpIDwgMjQ7IGkrKykgLy8gMyozCi0JCQl7Ci0JCQkJcERpYWctPlR4RGVzY0NudFtBcnJheUN1cklkeF1baV0gPSAwOwotCQkJCXBEaWFnLT5UeE1jc0NudFtBcnJheUN1cklkeF1baV0gPSAwOwotCQkJCXBEaWFnLT5SeE1jc0NudFtBcnJheUN1cklkeF1baV0gPSAwOwotfQotCi0JCQlpZiAocERpYWctPkFycmF5Q3VySWR4ID09IHBEaWFnLT5BcnJheVN0YXJ0SWR4KQotCQkJCUlOQ19SSU5HX0lOREVYKHBEaWFnLT5BcnJheVN0YXJ0SWR4LCAgRElBR05PU0VfVElNRSk7Ci0JCX0KLQotCX0KLSNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KLQotCi19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVJlc2V0IE5JQyBmcm9tIGVycm9yCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQlOb3RlOgotCQlSZXNldCBOSUMgZnJvbSBlcnJvciBzdGF0ZQotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlOSUNSZXNldEZyb21FcnJvcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQkvLyBSZXNldCBCQlAgKGFjY29yZGluZyB0byBhbGV4LCByZXNldCBBU0lDIHdpbGwgZm9yY2UgcmVzZXQgQkJQCi0JLy8gVGhlcmVmb3JlLCBza2lwIHRoZSByZXNldCBCQlAKLQkvLyBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMSwgMHgyKTsKLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgxKTsKLQkvLyBSZW1vdmUgQVNJQyBmcm9tIHJlc2V0IHN0YXRlCi0JUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDApOwotCi0JTklDSW5pdGlhbGl6ZUFkYXB0ZXIocEFkLCBGQUxTRSk7Ci0JTklDSW5pdEFzaWNGcm9tRUVQUk9NKHBBZCk7Ci0KLQkvLyBTd2l0Y2ggdG8gY3VycmVudCBjaGFubmVsLCBzaW5jZSBkdXJpbmcgcmVzZXQgcHJvY2VzcywgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIHJlbWFpbnMgb24uCi0JQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOwotCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLX0KLQotCi1ORElTX1NUQVRVUyBOSUNMb2FkRmlybXdhcmUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JTkRJU19TVEFUVVMJIHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JaWYgKHBBZC0+Y2hpcE9wcy5sb2FkRmlybXdhcmUpCi0JCXN0YXR1cyA9IHBBZC0+Y2hpcE9wcy5sb2FkRmlybXdhcmUocEFkKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCWVyYXNlIDgwNTEgZmlybXdhcmUgaW1hZ2UgaW4gTUFDIEFTSUMKLQotCUFyZ3VtZW50czoKLQkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIE5JQ0VyYXNlRmlybXdhcmUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JaWYgKHBBZC0+Y2hpcE9wcy5lcmFzZUZpcm13YXJlKQotCQlwQWQtPmNoaXBPcHMuZXJhc2VGaXJtd2FyZShwQWQpOwotCi19LyogRW5kIG9mIE5JQ0VyYXNlRmlybXdhcmUgKi8KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJTG9hZCBUeCByYXRlIHN3aXRjaGluZyBwYXJhbWV0ZXJzCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5ESVNfU1RBVFVTX1NVQ0NFU1MgICAgICAgICBmaXJtd2FyZSBpbWFnZSBsb2FkIG9rCi0JCU5ESVNfU1RBVFVTX0ZBSUxVUkUgICAgICAgICBpbWFnZSBub3QgZm91bmQKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQlSYXRlIFRhYmxlIEZvcm1hdDoKLQkJMS4gKEIwOiBWYWxpZCBJdGVtIG51bWJlcikgKEIxOkluaXRpYWwgaXRlbSBmcm9tIHplcm8pCi0JCTIuIEl0ZW0gTnVtYmVyKERlYykgICAgICBNb2RlKEhleCkgICAgIEN1cnJlbnQgTUNTKERlYykgICAgVHJhaW5VcChEZWMpICAgIFRyYWluRG93bihEZWMpCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTX1NUQVRVUyBOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtcygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQ29tcGFyZSB0d28gbWVtb3J5IGJsb2NrCi0KLQlBcmd1bWVudHM6Ci0JCXBTcmMxCQlQb2ludGVyIHRvIGZpcnN0IG1lbW9yeSBhZGRyZXNzCi0JCXBTcmMyCQlQb2ludGVyIHRvIHNlY29uZCBtZW1vcnkgYWRkcmVzcwotCi0JUmV0dXJuIFZhbHVlOgotCQkwOgkJCW1lbW9yeSBpcyBlcXVhbAotCQkxOgkJCXBTcmMxIG1lbW9yeSBpcyBsYXJnZXIKLQkJMjoJCQlwU3JjMiBtZW1vcnkgaXMgbGFyZ2VyCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VTE9ORwlSVE1QQ29tcGFyZU1lbW9yeSgKLQlJTglQVk9JRAlwU3JjMSwKLQlJTglQVk9JRAlwU3JjMiwKLQlJTglVTE9ORwlMZW5ndGgpCi17Ci0JUFVDSEFSCXBNZW0xOwotCVBVQ0hBUglwTWVtMjsKLQlVTE9ORwlJbmRleCA9IDA7Ci0KLQlwTWVtMSA9IChQVUNIQVIpIHBTcmMxOwotCXBNZW0yID0gKFBVQ0hBUikgcFNyYzI7Ci0KLQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspCi0JewotCQlpZiAocE1lbTFbSW5kZXhdID4gcE1lbTJbSW5kZXhdKQotCQkJcmV0dXJuICgxKTsKLQkJZWxzZSBpZiAocE1lbTFbSW5kZXhdIDwgcE1lbTJbSW5kZXhdKQotCQkJcmV0dXJuICgyKTsKLQl9Ci0KLQkvLyBFcXVhbAotCXJldHVybiAoMCk7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVplcm8gb3V0IG1lbW9yeSBibG9jawotCi0JQXJndW1lbnRzOgotCQlwU3JjMQkJUG9pbnRlciB0byBtZW1vcnkgYWRkcmVzcwotCQlMZW5ndGgJCVNpemUKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBaZXJvTWVtb3J5KAotCUlOCVBWT0lECXBTcmMsCi0JSU4JVUxPTkcJTGVuZ3RoKQotewotCVBVQ0hBUglwTWVtOwotCVVMT05HCUluZGV4ID0gMDsKLQotCXBNZW0gPSAoUFVDSEFSKSBwU3JjOwotCi0JZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTGVuZ3RoOyBJbmRleCsrKQotCXsKLQkJcE1lbVtJbmRleF0gPSAweDAwOwotCX0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQ29weSBkYXRhIGZyb20gbWVtb3J5IGJsb2NrIDEgdG8gbWVtb3J5IGJsb2NrIDIKLQotCUFyZ3VtZW50czoKLQkJcERlc3QJCVBvaW50ZXIgdG8gZGVzdGluYXRpb24gbWVtb3J5IGFkZHJlc3MKLQkJcFNyYwkJUG9pbnRlciB0byBzb3VyY2UgbWVtb3J5IGFkZHJlc3MKLQkJTGVuZ3RoCQlDb3B5IHNpemUKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUTVBNb3ZlTWVtb3J5KAotCU9VVAlQVk9JRAlwRGVzdCwKLQlJTglQVk9JRAlwU3JjLAotCUlOCVVMT05HCUxlbmd0aCkKLXsKLQlQVUNIQVIJcE1lbTE7Ci0JUFVDSEFSCXBNZW0yOwotCVVJTlQJSW5kZXg7Ci0KLQlBU1NFUlQoKExlbmd0aD09MCkgfHwgKHBEZXN0ICYmIHBTcmMpKTsKLQotCXBNZW0xID0gKFBVQ0hBUikgcERlc3Q7Ci0JcE1lbTIgPSAoUFVDSEFSKSBwU3JjOwotCi0JZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTGVuZ3RoOyBJbmRleCsrKQotCXsKLQkJcE1lbTFbSW5kZXhdID0gcE1lbTJbSW5kZXhdOwotCX0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJSW5pdGlhbGl6ZSBwb3J0IGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlVc2VyQ2ZnSW5pdCgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCkKLXsKLS8vCUVEQ0FfUEFSTSBEZWZhdWx0RWRjYVBhcm07Ci0gICAgVUlOVCBrZXlfaW5kZXgsIGJzc19pbmRleDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBVc2VyQ2ZnSW5pdFxuIikpOwotCi0JLy8KLQkvLyAgcGFydCBJLiBpbnRpYWxpemUgY29tbW9uIGNvbmZpZ3VyYXRpb24KLQkvLwotCi0JZm9yKGtleV9pbmRleD0wOyBrZXlfaW5kZXg8U0hBUkVfS0VZX05VTTsga2V5X2luZGV4KyspCi0JewotCQlmb3IoYnNzX2luZGV4ID0gMDsgYnNzX2luZGV4IDwgTUFYX01CU1NJRF9OVU07IGJzc19pbmRleCsrKQotCQl7Ci0JCQlwQWQtPlNoYXJlZEtleVtic3NfaW5kZXhdW2tleV9pbmRleF0uS2V5TGVuID0gMDsKLQkJCXBBZC0+U2hhcmVkS2V5W2Jzc19pbmRleF1ba2V5X2luZGV4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQkJfQotCX0KLQotCXBBZC0+RWVwcm9tQWNjZXNzID0gRkFMU0U7Ci0KLQlwQWQtPkFudGVubmEud29yZCA9IDA7Ci0JcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7Ci0KLQlwQWQtPkxlZENudGwud29yZCA9IDA7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JcEFkLT5MZWRJbmRpY2F0b3JTdHJlbmd0aCA9IDA7Ci0JcEFkLT5STG5rQ3RybE9mZnNldCA9IDA7Ci0JcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCA9IDA7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTPVRSVUU7Ci0JcEFkLT5DaGVja0RtYUJ1c3lDb3VudCA9IDA7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQlwQWQtPmJBdXRvVHhBZ2NBID0gRkFMU0U7CQkJLy8gRGVmYXVsdCBpcyBPRkYKLQlwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7CQkJLy8gRGVmYXVsdCBpcyBPRkYKLQlwQWQtPlJmSWNUeXBlID0gUkZJQ18yODIwOwotCi0JLy8gSW5pdCB0aW1lciBmb3IgcmVzZXQgY29tcGxldGUgZXZlbnQKLQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IDE7Ci0JcEFkLT5iRm9yY2VQcmludFRYID0gRkFMU0U7Ci0JcEFkLT5iRm9yY2VQcmludFJYID0gRkFMU0U7Ci0JcEFkLT5iU3RhRmlmb1Rlc3QgPSBGQUxTRTsKLQlwQWQtPmJQcm90ZWN0aW9uVGVzdCA9IEZBTFNFOwotCS8qCi0JcEFkLT5iSENDQVRlc3QgPSBGQUxTRTsKLQlwQWQtPmJHZW5PbmVIQ0NBID0gRkFMU0U7Ci0JKi8KLQlwQWQtPkNvbW1vbkNmZy5Ec2lmcyA9IDEwOyAgICAgIC8vIGluIHVuaXRzIG9mIHVzZWMKLQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyID0gMTAwOyAvL21XCi0JcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSAweGZmZmZmZmZmOyAvLyBBVVRPCi0JcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQgPSAweGZmZmZmZmZmOyAvLyBBVVRPCi0JcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFJ0ODAyXzExUHJlYW1ibGVBdXRvOyAvLyB1c2UgTG9uZyBwcmVhbWJsZSBvbiBUWCBieSBkZWZhdXQKLQlwQWQtPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gRkFMU0U7Ci0JcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gMjM0NzsKLQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IDIzNDY7Ci0JcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMDsgICAgLy8gMDogQVVUTwotCXBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gVFJVRTsgLy8wOwotCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSAweGZmOyAgICAgLy8gdW5rbm93bgotCXBBZC0+Q29tbW9uQ2ZnLkJhbmRTdGF0ZSA9IFVOS05PV05fQkFORDsKLQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DU1BlcmlvZCA9IDEwOwotCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTQ291bnQgPSAwOwotCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9IFJEX05PUk1BTF9NT0RFOwotCi0KLQotI2lmZGVmIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQKLSNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCi0JcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5kZWx0YSA9IENBUlJJRVJfREVURUNUX0RFTFRBOwotCXBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuZGl2X2ZsYWcgPSBDQVJSSUVSX0RFVEVDVF9ESVZfRkxBRzsKLQlwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LmNyaXRlcmlhID0gQ0FSUklFUl9ERVRFQ1RfQ1JJVElSSUE7Ci0jaWZkZWYgUlQzMDkwCi0JaWYoSVNfUlQzMDkwQShwQWQpKQotCXBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QudGhyZXNob2xkID0gQ0FSUklFUl9ERVRFQ1RfVEhSRVNIT0xEXzMwOTBBOwotCWVsc2UKLSNlbmRpZiAvLyBSVDMwOTAgLy8KLQlwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LnRocmVzaG9sZCA9IENBUlJJRVJfREVURUNUX1RIUkVTSE9MRDsKLSNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVCAvLwotCi0JcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ2hNb3ZpbmdUaW1lID0gNjU7Ci0jaWZkZWYgTUVSR0VfQVJDSF9URUFNCi0JcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuTG9uZ1B1bHNlUmFkYXJUaCA9IDI7Ci0JcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQXZnUnNzaVJlcSA9IC03NTsKLSNlbHNlIC8vIG9yaWdpbmFsIHJ0Mjh4eCBzb3VyY2UgY29kZQotCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkxvbmdQdWxzZVJhZGFyVGggPSAzOwotI2VuZGlmIC8vIE1FUkdFX0FSQ0hfVEVBTSAvLwotCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSA9IEZBTFNFOwotCXBBZC0+Q29tbW9uQ2ZnLmJOZWVkU2VuZFRyaWdnZXJGcmFtZSA9IEZBTFNFOwotCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJUaW1lckNvdW50ID0gMDsKLQlwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlID0gRkFMU0U7Ci0JcEFkLT5Db21tb25DZmcuYkNvdW50cnlGbGFnID0gRkFMU0U7Ci0JcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSAwOwotCXBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID0gMDsKLQotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkJlYWNvblR4V0ksIHNpemVvZihwQWQtPkJlYWNvblR4V0kpKTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksIHNpemVvZihwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkpKTsKLQlwQWQtPkhUQ0VuYWJsZSA9IEZBTFNFOwotCXBBZC0+YkJyb2FkQ29tSFQgPSBGQUxTRTsKLQlwQWQtPkNvbW1vbkNmZy5iUmRnID0gRkFMU0U7Ci0KLSNpZmRlZiBET1QxMU5fRFJBRlQzCi0JcEFkLT5Db21tb25DZmcuRG90MTFPQnNzU2NhblBhc3NpdmVEd2VsbCA9IGRvdDExT0JTU1NjYW5QYXNzaXZlRHdlbGw7CS8vIFVuaXQgOiBUVS4gNX4xMDAwCi0JcEFkLT5Db21tb25DZmcuRG90MTFPQnNzU2NhbkFjdGl2ZUR3ZWxsID0gZG90MTFPQlNTU2NhbkFjdGl2ZUR3ZWxsOwkvLyBVbml0IDogVFUuIDEwfjEwMDAKLQlwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoVHJpZ2dlclNjYW5JbnQgPSBkb3QxMUJTU1dpZHRoVHJpZ2dlclNjYW5JbnRlcnZhbDsJLy8gVW5pdCA6IFNlY29uZAotCXBBZC0+Q29tbW9uQ2ZnLkRvdDExT0Jzc1NjYW5QYXNzaXZlVG90YWxQZXJDaGFubmVsID0gZG90MTFPQlNTU2NhblBhc3NpdmVUb3RhbFBlckNoYW5uZWw7CS8vIFVuaXQgOiBUVS4gMjAwfjEwMDAwCi0JcEFkLT5Db21tb25DZmcuRG90MTFPQnNzU2NhbkFjdGl2ZVRvdGFsUGVyQ2hhbm5lbCA9IGRvdDExT0JTU1NjYW5BY3RpdmVUb3RhbFBlckNoYW5uZWw7CS8vIFVuaXQgOiBUVS4gMjB+MTAwMDAKLQlwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheUZhY3RvciA9IGRvdDExQlNTV2lkdGhDaGFubmVsVHJhbnNhY3Rpb25EZWxheUZhY3RvcjsKLQlwQWQtPkNvbW1vbkNmZy5Eb3QxMU9Cc3NTY2FuQWN0aXZpdHlUaHJlID0gZG90MTFCU1NTY2FuQWN0aXZpdHlUaHJlc2hvbGQ7CS8vIFVuaXQgOiBwZXJjZW50YWdlCi0JcEFkLT5Db21tb25DZmcuRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXkgPSAocEFkLT5Db21tb25DZmcuRG90MTFCc3NXaWR0aFRyaWdnZXJTY2FuSW50ICogcEFkLT5Db21tb25DZmcuRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXlGYWN0b3IpOwotI2VuZGlmICAvLyBET1QxMU5fRFJBRlQzIC8vCi0KLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLCBzaXplb2YocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvKSk7Ci0JcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gTU1QU19FTkFCTEU7Ci0JcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gMDsKLQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gSU1NRURfQkE7Ci0JcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDY0OyAvLzMyOwotCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5UeEJBV2luTGltaXQgPSA2NDsgLy8zMjsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVXNlckNmZ0luaXQuIEJBQ2FwYWJpbGl0eSA9IDB4JXhcbiIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkKSk7Ci0KLQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gRkFMU0U7Ci0JQkFUYWJsZUluaXQocEFkLCAmcEFkLT5CQVRhYmxlKTsKLQotCXBBZC0+Q29tbW9uQ2ZnLmJFeHRDaGFubmVsU3dpdGNoQW5ub3VuY2VtZW50ID0gMTsKLQlwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0ID0gMTsKLQlwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlID0gVFJVRTsKLQkvLzIwMDgvMTEvMDU6S0ggYWRkIHRvIHN1cHBvcnQgQW50ZW5uYSBwb3dlci1zYXZpbmcgb2YgQVA8LS0KLQlwQWQtPkNvbW1vbkNmZy5iR3JlZW5BUEVuYWJsZT1GQUxTRTsKLQlwQWQtPkNvbW1vbkNmZy5iQmxvY2tBbnREaXZmb3JHcmVlbkFQPUZBTFNFOwotCS8vMjAwOC8xMS8wNTpLSCBhZGQgdG8gc3VwcG9ydCBBbnRlbm5hIHBvd2VyLXNhdmluZyBvZiBBUC0tPgotCXBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPSBGQUxTRTsKLQlwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPSBGQUxTRTsKLQotCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODcyMDIwMCkKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLlR4QkFTaXplID0gMTM7IC8vYnkgSmVycnkgcmVjb21tZW5kCi0JfWVsc2V7Ci0JCXBBZC0+Q29tbW9uQ2ZnLlR4QkFTaXplID0gNzsKLQl9Ci0KLQlwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkud29yZCA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKLQkvL3BBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKLQkvL3BBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOwotCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7Ci0JcEFkLT5Db21tb25DZmcuVHhSYXRlID0gUkFURV82OwotCi0JcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE1DU19SQVRFXzY7Ci0JcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLkJXID0gQldfMjA7Ci0JcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0KLQlwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPSAxMDA7ICAgICAvLyBpbiBtU2VjCi0KLQotCS8vCi0JLy8gcGFydCBJSS4gaW50aWFsaXplIFNUQSBzcGVjaWZpYyBjb25maWd1cmF0aW9uCi0JLy8KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJUlhfRklMVEVSX1NFVF9GTEFHKHBBZCwgZlJYX0ZJTFRFUl9BQ0NFUFRfRElSRUNUKTsKLQkJUlhfRklMVEVSX0NMRUFSX0ZMQUcocEFkLCBmUlhfRklMVEVSX0FDQ0VQVF9NVUxUSUNBU1QpOwotCQlSWF9GSUxURVJfU0VUX0ZMQUcocEFkLCBmUlhfRklMVEVSX0FDQ0VQVF9CUk9BRENBU1QpOwotCQlSWF9GSUxURVJfU0VUX0ZMQUcocEFkLCBmUlhfRklMVEVSX0FDQ0VQVF9BTExfTVVMVElDQVNUKTsKLQotCQlwQWQtPlN0YUNmZy5Qc20gPSBQV1JfQUNUSVZFOwotCi0JCXBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOwotCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKLQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOwotCQlwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyID0gRkFMU0U7Ci0JCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IDA7Ci0KLQkJLy8gODAyLjF4IHBvcnQgY29udHJvbAotCQlwQWQtPlN0YUNmZy5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUDsKLQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7Ci0JCXBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgPSAwOwotCQlwQWQtPlN0YUNmZy5NaWNFcnJDbnQgICAgICAgID0gMDsKLQkJcEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgICAgICA9IEZBTFNFOwotCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSAgICAgICAgID0gU1NfTk9UVVNFOwotCi0JCXBBZC0+Q29tbW9uQ2ZnLk5kaXNSYWRpb1N0YXRlT2ZmID0gRkFMU0U7CQkvLyBOZXcgdG8gc3VwcG9ydCBtaWNyb3NvZnQgZGlzYWJsZSByYWRpbyB3aXRoIE9JRCBjb21tYW5kCi0KLQkJcEFkLT5TdGFDZmcuUnNzaVRyaWdnZXIgPSAwOwotCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TdGFDZmcuUnNzaVNhbXBsZSwgc2l6ZW9mKFJTU0lfU0FNUExFKSk7Ci0JCXBBZC0+U3RhQ2ZnLlJzc2lUcmlnZ2VyTW9kZSA9IFJTU0lfVFJJR0dFUkVEX1VQT05fQkVMT1dfVEhSRVNIT0xEOwotCQlwQWQtPlN0YUNmZy5BdGltV2luID0gMDsKLQkJcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsvL2RlZmF1bHQgbGlzdGVuIGNvdW50OwotCQlwQWQtPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOyAgLy8gQlNTX0lORlJBIG9yIEJTU19BREhPQyBvciBCU1NfTU9OSVRPUgotCQlwQWQtPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7Ci0JCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOwotCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19XQUtFVVBfTk9XKTsKLQotCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7Ci0JCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87Ci0JfQotCi0jaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAotCXBBZC0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9Ob25lOwotI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KLSNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKLXBBZC0+YnJ0MzB4eEJhbk1jdUNtZCA9IEZBTFNFOwotcEFkLT5iMzA5MEVTcGVjaWFsQ2hpcCA9IEZBTFNFOwotLy9LSCBEZWJ1Zzp0aGUgZm9sbG93aW5nIG11c3QgYmUgcmVtb3ZlZAotcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZT0zOwotcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eEZvcmNlQVNQTVRlc3Q9MDsKLXBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhGb2xsb3dIb3N0QVNQTT0xOwotI2VuZGlmIC8vIFBDSUVfUFNfU1VQUE9SVCAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JLy8gZ2xvYmFsIHZhcmlhYmxlcyBtWFhYWCB1c2VkIGluIE1BQyBwcm90b2NvbCBzdGF0ZSBtYWNoaW5lcwotCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOwotCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FESE9DX09OKTsKLQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19JTkZSQV9PTik7Ci0KLQkvLyBQSFkgc3BlY2lmaWNhdGlvbgotCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSBQSFlfMTFCR19NSVhFRDsJCS8vIGRlZmF1bHQgUEhZIG1vZGUKLQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOyAgLy8gQ0NLIHVzZSBMT05HIHByZWFtYmxlCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJLy8gdXNlciBkZXNpcmVkIHBvd2VyIG1vZGUKLQkJcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07Ci0JCXBBZC0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKLQkJcEFkLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9IEZBTFNFOwotCi0JCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKSwgcEFkLCBGQUxTRSk7Ci0JCXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZyA9IEZBTFNFOwotCi0JCS8vIFBhdGNoIGZvciBOZHRlc3QKLQkJcEFkLT5TdGFDZmcuU2NhbkNudCA9IDA7Ci0KLQkJcEFkLT5TdGFDZmcuYkh3UmFkaW8gID0gVFJVRTsgLy8gRGVmYXVsdCBIYXJkd2FyZSBSYWRpbyBzdGF0dXMgaXMgT24KLQkJcEFkLT5TdGFDZmcuYlN3UmFkaW8gID0gVFJVRTsgLy8gRGVmYXVsdCBTb2Z0d2FyZSBSYWRpbyBzdGF0dXMgaXMgT24KLQkJcEFkLT5TdGFDZmcuYlJhZGlvICAgID0gVFJVRTsgLy8gYkh3UmFkaW8gJiYgYlN3UmFkaW8KLQkJcEFkLT5TdGFDZmcuYkhhcmR3YXJlUmFkaW8gPSBGQUxTRTsJCS8vIERlZmF1bHQgaXMgT0ZGCi0JCXBBZC0+U3RhQ2ZnLmJTaG93SGlkZGVuU1NJRCA9IEZBTFNFOwkJLy8gRGVmYXVsdCBubyBzaG93Ci0KLQkJLy8gTml0cm8gbW9kZSBjb250cm9sCi0JCXBBZC0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gVFJVRTsKLQotCQkvLyBTYXZlIHRoZSBpbml0IHRpbWUgYXMgbGFzdCBzY2FuIHRpbWUsIHRoZSBzeXN0ZW0gc2hvdWxkIGRvIHNjYW4gYWZ0ZXIgMiBzZWNvbmRzLgotCQkvLyBUaGlzIHBhdGNoIGlzIGZvciBkcml2ZXIgd2FrZSB1cCBmcm9tIHN0YW5kYnkgbW9kZSwgc3lzdGVtIHdpbGwgZG8gc2NhbiByaWdodCBhd2F5LgotCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUpOwotCQlpZiAocEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID4gMTAgKiBPU19IWikKLQkJCXBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSAtPSAoMTAgKiBPU19IWik7Ci0KLQkJTmRpc1plcm9NZW1vcnkocEFkLT5uaWNrbmFtZSwgSVdfRVNTSURfTUFYX1NJWkUrMSk7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCXNwcmludGYoKFBTVFJJTkcpIHBBZC0+bmlja25hbWUsICJSVDI4NjBTVEEiKTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPlN0YUNmZy5XcGFEaXNhc3NvY0FuZEJsb2NrQXNzb2NUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKSwgcEFkLCBGQUxTRSk7Ci0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCQlwQWQtPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKLQkJcEFkLT5TdGFDZmcuSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPSBGQUxTRTsKLQkJcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRTsKLQkJcEFkLT5TdGFDZmcuYlJTTl9JRV9Gcm9tV3BhU3VwcGxpY2FudCA9IEZBTFNFOwotI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0JCXBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0VOQUJMRTsKLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQotCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCA4KTsKLQotCi0JCXBBZC0+U3RhQ2ZnLmJBdXRvQ29ubmVjdEJ5QnNzaWQgPSBGQUxTRTsKLQkJcEFkLT5TdGFDZmcuQmVhY29uTG9zdFRpbWUgPSBCRUFDT05fTE9TVF9USU1FOwotCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5XcGFQYXNzUGhyYXNlLCA2NCk7Ci0JCXBBZC0+U3RhQ2ZnLldwYVBhc3NQaHJhc2VMZW4gPSAwOwotCQlwQWQtPlN0YUNmZy5iQXV0b1JvYW1pbmcgPSBGQUxTRTsKLQkJcEFkLT5TdGFDZmcuYkZvcmNlVHhCdXJzdCA9IEZBTFNFOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCS8vIERlZmF1bHQgZm9yIGV4dHJhIGluZm9ybWF0aW9uIGlzIG5vdCB2YWxpZAotCXBBZC0+RXh0cmFJbmZvID0gRVhUUkFfSU5GT19DTEVBUjsKLQotCS8vIERlZmF1bHQgQ29uZmlnIGNoYW5nZSBmbGFnCi0JcEFkLT5iQ29uZmlnQ2hhbmdlZCA9IEZBTFNFOwotCi0JLy8KLQkvLyBwYXJ0IElJSS4gQVAgY29uZmlndXJhdGlvbnMKLQkvLwotCi0KLQkvLwotCS8vIHBhcnQgSVYuIG90aGVycwotCS8vCi0JLy8gZHluYW1pYyBCQlAgUjY2OnNlbnNpYml0eSB0dW5pbmcgdG8gb3ZlcmNvbWUgYmFja2dyb3VuZCBub2lzZQotCXBBZC0+QmJwVHVuaW5nLmJFbmFibGUgICAgICAgICAgICAgICAgPSBUUlVFOwotCXBBZC0+QmJwVHVuaW5nLkZhbHNlQ2NhTG93ZXJUaHJlc2hvbGQgPSAxMDA7Ci0JcEFkLT5CYnBUdW5pbmcuRmFsc2VDY2FVcHBlclRocmVzaG9sZCA9IDUxMjsKLQlwQWQtPkJicFR1bmluZy5SNjZEZWx0YSAgICAgICAgICAgICAgID0gNDsKLQlwQWQtPk1sbWUuYkVuYWJsZUF1dG9BbnRlbm5hQ2hlY2sgPSBUUlVFOwotCi0JLy8KLQkvLyBBbHNvIGluaXRpYWwgUjY2Q3VycmVudFZhbHVlLCBSVFVTQlJlc3VtZU1zZHVUcmFuc21pc3Npb24gbWlnaHQgdXNlIHRoaXMgdmFsdWUuCi0JLy8gaWYgbm90IGluaXRpYWwgdGhpcyB2YWx1ZSwgdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSAwLgotCS8vCi0JcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlID0gMHgzODsKLQotCXBBZC0+QmJwOTQgPSBCQlBSOTRfREVGQVVMVDsKLQlwQWQtPkJicEZvckNDSyA9IEZBTFNFOwotCi0JLy8gRGVmYXVsdCBpcyBGQUxTRSBmb3IgdGVzdCBiaXQgMQotCS8vcEFkLT5iVGVzdDEgPSBGQUxTRTsKLQotCS8vIGluaXRpYWxpemUgTUFDIHRhYmxlIGFuZCBhbGxvY2F0ZSBzcGluIGxvY2sKLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NYWNUYWIsIHNpemVvZihNQUNfVEFCTEUpKTsKLQlJbml0aWFsaXplUXVldWVIZWFkZXIoJnBBZC0+TWFjVGFiLk1jYXN0UHNRdWV1ZSk7Ci0JTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0KLQkvL1JUTVBJbml0VGltZXIocEFkLCAmcEFkLT5SRUNCQVRpbWVyLCBSRUNCQVRpbWVyVGltZW91dCwgcEFkLCBUUlVFKTsKLQkvL1JUTVBTZXRUaW1lcigmcEFkLT5SRUNCQVRpbWVyLCBSRU9SREVSX0VYRUNfSU5UVik7Ci0KLSNpZmRlZiBSQUxJTktfQVRFCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+YXRlLCBzaXplb2YoQVRFX0lORk8pKTsKLQlwQWQtPmF0ZS5Nb2RlID0gQVRFX1NUT1A7Ci0JcEFkLT5hdGUuVHhDb3VudCA9IDIwMDsvKiB0byBleGNlZWQgVFhfUklOR19TSVpFIC4uLiAqLwotCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gMDsKLQlwQWQtPmF0ZS5SRkZyZXFPZmZzZXQgPSAwOwotCXBBZC0+YXRlLlR4TGVuZ3RoID0gMTAyNDsKLQlwQWQtPmF0ZS5UeFdJLlNob3J0R0kgPSAwOy8vIExPTkcgR0kgOiA4MDAgbnMKLQlwQWQtPmF0ZS5UeFdJLlBIWU1PREUgPSBNT0RFX0NDSzsKLQlwQWQtPmF0ZS5UeFdJLk1DUyA9IDM7Ci0JcEFkLT5hdGUuVHhXSS5CVyA9IEJXXzIwOwotCXBBZC0+YXRlLkNoYW5uZWwgPSAxOwotCXBBZC0+YXRlLlFJRCA9IFFJRF9BQ19CRTsKLQlwQWQtPmF0ZS5BZGRyMVswXSA9IDB4MDA7Ci0JcEFkLT5hdGUuQWRkcjFbMV0gPSAweDExOwotCXBBZC0+YXRlLkFkZHIxWzJdID0gMHgyMjsKLQlwQWQtPmF0ZS5BZGRyMVszXSA9IDB4QUE7Ci0JcEFkLT5hdGUuQWRkcjFbNF0gPSAweEJCOwotCXBBZC0+YXRlLkFkZHIxWzVdID0gMHhDQzsKLQlOZGlzTW92ZU1lbW9yeShwQWQtPmF0ZS5BZGRyMiwgcEFkLT5hdGUuQWRkcjEsIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyk7Ci0JTmRpc01vdmVNZW1vcnkocEFkLT5hdGUuQWRkcjMsIHBBZC0+YXRlLkFkZHIxLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOwotCXBBZC0+YXRlLmJSeEZFUiA9IDA7Ci0JcEFkLT5hdGUuYlFBVHhTdGFydCA9IEZBTFNFOwotCXBBZC0+YXRlLmJRQVJ4U3RhcnQgPSBGQUxTRTsKLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCXBBZC0+YXRlLmJGV0xvYWRpbmcgPSBGQUxTRTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi0jaWZkZWYgUkFMSU5LXzI4eHhfUUEKLQlwQWQtPmF0ZS5UeFN0YXR1cyA9IDA7Ci0JcEFkLT5hdGUuQXRlUGlkID0gVEhSRUFEX1BJRF9JTklUX1ZBTFVFOwotI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCi0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0KLQlwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3QgPSBGQUxTRTsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLSAgICBwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotUlRNUF9TRVRfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSNpZmRlZiBBTlRfRElWRVJTSVRZX1NVUFBPUlQKLQkJaWYgKCBwQWQtPkNvbW1vbkNmZy5iUnhBbnREaXZlcnNpdHkgPT0gQU5UX0ZJWF9BTlQyKQotCQl7Ci0JCQlwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50ID0gMTsKLQkJCXBBZC0+UnhBbnQuUGFpcjFTZWNvbmRhcnlSeEFudCA9IDA7Ci0JCX0KLQkJZWxzZSAvLyBEZWZhdWx0Ci0JCXsKLQkJCXBBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQgPSAwOwotCQkJcEFkLT5SeEFudC5QYWlyMVNlY29uZGFyeVJ4QW50ID0gMTsKLQkJfQotCQlwQWQtPlJ4QW50LkV2YWx1YXRlUGVyaW9kID0gMDsKLQkJcEFkLT5SeEFudC5SY3ZQa3ROdW1XaGVuRXZhbHVhdGUgPSAwOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlwQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVswXSA9IHBBZC0+UnhBbnQuUGFpcjFBdmdSc3NpWzFdID0gMDsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBBUF9BTlRFTk5BX0RJVkVSU0lUWV9TVVBQT1JUIC8vCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gVXNlckNmZ0luaXRcbiIpKTsKLX0KLQotLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLVVDSEFSIEJ0b0goU1RSSU5HIGNoKQotewotCWlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSByZXR1cm4gKGNoIC0gJzAnKTsgICAgICAgIC8vIEhhbmRsZSBudW1lcmFscwotCWlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKSByZXR1cm4gKGNoIC0gJ0EnICsgMHhBKTsgIC8vIEhhbmRsZSBjYXBpdG9sIGhleCBkaWdpdHMKLQlpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykgcmV0dXJuIChjaCAtICdhJyArIDB4QSk7ICAvLyBIYW5kbGUgc21hbGwgaGV4IGRpZ2l0cwotCXJldHVybigyNTUpOwotfQotCi0vLwotLy8gIEZVTkNUSU9OOiBBdG9IKGNoYXIgKiwgVUNIQVIgKiwgaW50KQotLy8KLS8vICBQVVJQT1NFOiAgQ29udmVydHMgYXNjaWkgc3RyaW5nIHRvIG5ldHdvcmsgb3JkZXIgaGV4Ci0vLwotLy8gIFBBUkFNRVRFUlM6Ci0vLyAgICBzcmMgICAgLSBwb2ludGVyIHRvIGlucHV0IGFzY2lpIHN0cmluZwotLy8gICAgZGVzdCAgIC0gcG9pbnRlciB0byBvdXRwdXQgaGV4Ci0vLyAgICBkZXN0bGVuIC0gc2l6ZSBvZiBkZXN0Ci0vLwotLy8gIENPTU1FTlRTOgotLy8KLS8vICAgIDIgYXNjaWkgYnl0ZXMgbWFrZSBhIGhleCBieXRlIHNvIG11c3QgcHV0IDFzdCBhc2NpaSBieXRlIG9mIHBhaXIKLS8vICAgIGludG8gdXBwZXIgbmliYmxlIGFuZCAybmQgYXNjaWkgYnl0ZSBvZiBwYWlyIGludG8gbG93ZXIgbmliYmxlLgotLy8KLS8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLXZvaWQgQXRvSChQU1RSSU5HIHNyYywgUFVDSEFSIGRlc3QsIGludCBkZXN0bGVuKQotewotCVBTVFJJTkcgc3JjcHRyOwotCVBVQ0hBUiBkZXN0VGVtcDsKLQotCXNyY3B0ciA9IHNyYzsKLQlkZXN0VGVtcCA9IChQVUNIQVIpIGRlc3Q7Ci0KLQl3aGlsZShkZXN0bGVuLS0pCi0JewotCQkqZGVzdFRlbXAgPSBCdG9IKCpzcmNwdHIrKykgPDwgNDsgICAgLy8gUHV0IDFzdCBhc2NpaSBieXRlIGluIHVwcGVyIG5pYmJsZS4KLQkJKmRlc3RUZW1wICs9IEJ0b0goKnNyY3B0cisrKTsgICAgICAvLyBBZGQgMm5kIGFzY2lpIGJ5dGUgdG8gYWJvdmUuCi0JCWRlc3RUZW1wKys7Ci0JfQotfQotCi0KLS8vKysrTWFyayBieSBzaGlhbmcsIG5vdCB1c2Ugbm93LCBuZWVkIHRvIHJlbW92ZSBhZnRlciBjb25maXJtCi0vLy0tLU1hcmsgYnkgc2hpYW5nLCBub3QgdXNlIG5vdywgbmVlZCB0byByZW1vdmUgYWZ0ZXIgY29uZmlybQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlJbml0IHRpbWVyIG9iamVjdHMKLQotCUFyZ3VtZW50czoKLQkJcEFkCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwVGltZXIJCQkJVGltZXIgc3RydWN0dXJlCi0JCXBUaW1lckZ1bmMJCQlGdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGltZXIgZXhwaXJlZAotCQlSZXBlYXQJCQkJVHVyZSBmb3IgcGVyaW9kIHRpbWVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBJbml0VGltZXIoCi0JSU4JUFJUTVBfQURBUFRFUgkJCXBBZCwKLQlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCi0JSU4JUFZPSUQJCQkJCXBUaW1lckZ1bmMsCi0JSU4JUFZPSUQJCQkJCXBEYXRhLAotCUlOCUJPT0xFQU4JCQkJCVJlcGVhdCkKLXsKLQkvLwotCS8vIFNldCBWYWxpZCB0byBUUlVFIGZvciBsYXRlciB1c2VkLgotCS8vIEl0IHdpbGwgY3Jhc2ggaWYgd2UgY2FuY2VsIGEgdGltZXIgb3Igc2V0IGEgdGltZXIKLQkvLyB0aGF0IHdlIGhhdmVuJ3QgaW5pdGlhbGl6ZSBiZWZvcmUuCi0JLy8KLQlwVGltZXItPlZhbGlkICAgICAgPSBUUlVFOwotCi0JcFRpbWVyLT5QZXJpb2RpY1R5cGUgPSBSZXBlYXQ7Ci0JcFRpbWVyLT5TdGF0ZSAgICAgID0gRkFMU0U7Ci0JcFRpbWVyLT5jb29raWUgPSAoVUxPTkcpIHBEYXRhOwotCi0jaWZkZWYgUlRNUF9USU1FUl9UQVNLX1NVUFBPUlQKLQlwVGltZXItPnBBZCA9IHBBZDsKLSNlbmRpZiAvLyBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVCAvLwotCi0JUlRNUF9PU19Jbml0X1RpbWVyKHBBZCwgJnBUaW1lci0+VGltZXJPYmosCXBUaW1lckZ1bmMsIChQVk9JRCkgcFRpbWVyKTsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJSW5pdCB0aW1lciBvYmplY3RzCi0KLQlBcmd1bWVudHM6Ci0JCXBUaW1lcgkJCQlUaW1lciBzdHJ1Y3R1cmUKLQkJVmFsdWUJCQkJVGltZXIgdmFsdWUgaW4gbWlsbGlzZWNvbmRzCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0JCVRvIHVzZSB0aGlzIHJvdXRpbmUsIG11c3QgY2FsbCBSVE1QSW5pdFRpbWVyIGJlZm9yZS4KLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUFNldFRpbWVyKAotCUlOCVBSQUxJTktfVElNRVJfU1RSVUNUCXBUaW1lciwKLQlJTglVTE9ORwkJCQkJVmFsdWUpCi17Ci0JaWYgKHBUaW1lci0+VmFsaWQpCi0JewotCQlwVGltZXItPlRpbWVyVmFsdWUgPSBWYWx1ZTsKLQkJcFRpbWVyLT5TdGF0ZSAgICAgID0gRkFMU0U7Ci0JCWlmIChwVGltZXItPlBlcmlvZGljVHlwZSA9PSBUUlVFKQotCQl7Ci0JCQlwVGltZXItPlJlcGVhdCA9IFRSVUU7Ci0JCQlSVE1QX1NldFBlcmlvZGljVGltZXIoJnBUaW1lci0+VGltZXJPYmosIFZhbHVlKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBUaW1lci0+UmVwZWF0ID0gRkFMU0U7Ci0JCQlSVE1QX09TX0FkZF9UaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgVmFsdWUpOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UX0VSUigoIlJUTVBTZXRUaW1lciBmYWlsZWQsIFRpbWVyIGhhc24ndCBiZWVuIGluaXRpYWxpemUhXG4iKSk7Ci0JfQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlJbml0IHRpbWVyIG9iamVjdHMKLQotCUFyZ3VtZW50czoKLQkJcFRpbWVyCQkJCVRpbWVyIHN0cnVjdHVyZQotCQlWYWx1ZQkJCQlUaW1lciB2YWx1ZSBpbiBtaWxsaXNlY29uZHMKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQkJVG8gdXNlIHRoaXMgcm91dGluZSwgbXVzdCBjYWxsIFJUTVBJbml0VGltZXIgYmVmb3JlLgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QTW9kVGltZXIoCi0JSU4JUFJBTElOS19USU1FUl9TVFJVQ1QJcFRpbWVyLAotCUlOCVVMT05HCQkJCQlWYWx1ZSkKLXsKLQlCT09MRUFOCUNhbmNlbDsKLQotCWlmIChwVGltZXItPlZhbGlkKQotCXsKLQkJcFRpbWVyLT5UaW1lclZhbHVlID0gVmFsdWU7Ci0JCXBUaW1lci0+U3RhdGUgICAgICA9IEZBTFNFOwotCQlpZiAocFRpbWVyLT5QZXJpb2RpY1R5cGUgPT0gVFJVRSkKLQkJewotCQkJUlRNUENhbmNlbFRpbWVyKHBUaW1lciwgJkNhbmNlbCk7Ci0JCQlSVE1QU2V0VGltZXIocFRpbWVyLCBWYWx1ZSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlSVE1QX09TX01vZF9UaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgVmFsdWUpOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UX0VSUigoIlJUTVBNb2RUaW1lciBmYWlsZWQsIFRpbWVyIGhhc24ndCBiZWVuIGluaXRpYWxpemUhXG4iKSk7Ci0JfQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlDYW5jZWwgdGltZXIgb2JqZWN0cwotCi0JQXJndW1lbnRzOgotCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQkJMS4pIFRvIHVzZSB0aGlzIHJvdXRpbmUsIG11c3QgY2FsbCBSVE1QSW5pdFRpbWVyIGJlZm9yZS4KLQkJMi4pIFJlc2V0IE5JQyB0byBpbml0aWFsIHN0YXRlIEFTIElTIHN5c3RlbSBib290IHVwIHRpbWUuCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBDYW5jZWxUaW1lcigKLQlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCi0JT1VUCUJPT0xFQU4JCQkJCSpwQ2FuY2VsbGVkKQotewotCWlmIChwVGltZXItPlZhbGlkKQotCXsKLQkJaWYgKHBUaW1lci0+U3RhdGUgPT0gRkFMU0UpCi0JCQlwVGltZXItPlJlcGVhdCA9IEZBTFNFOwotCi0JCVJUTVBfT1NfRGVsX1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBwQ2FuY2VsbGVkKTsKLQotCQlpZiAoKnBDYW5jZWxsZWQgPT0gVFJVRSkKLQkJCXBUaW1lci0+U3RhdGUgPSBUUlVFOwotCi0jaWZkZWYgUlRNUF9USU1FUl9UQVNLX1NVUFBPUlQKLQkJLy8gV2UgbmVlZCB0byBnby10aHJvdWdoIHRoZSBUaW1lclEgdG8gZmluZG91dCB0aGlzIHRpbWVyIGhhbmRsZXIgYW5kIHJlbW92ZSBpdCBpZgotCQkvLwkJaXQncyBzdGlsbCB3YWl0aW5nIGZvciBleGVjdXRpb24uCi0JCVJ0bXBUaW1lclFSZW1vdmUocFRpbWVyLT5wQWQsIHBUaW1lcik7Ci0jZW5kaWYgLy8gUlRNUF9USU1FUl9UQVNLX1NVUFBPUlQgLy8KLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlRfRVJSKCgiUlRNUENhbmNlbFRpbWVyIGZhaWxlZCwgVGltZXIgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZSFcbiIpKTsKLQl9Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVNldCBMRUQgU3RhdHVzCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJU3RhdHVzCQkJCQlMRUQgU3RhdHVzCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QU2V0TEVEKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVDSEFSCQkJU3RhdHVzKQotewotCS8vVUxPTkcJCQlkYXRhOwotCVVDSEFSCQkJSGlnaEJ5dGUgPSAwOwotCVVDSEFSCQkJTG93Qnl0ZTsKLQlCT09MRUFOCQkJYklnbm9yZWQgPSBGQUxTRTsKLQotI2lmZGVmIFJBTElOS19BVEUKLQkvKgotCQlJbiBBVEUgbW9kZSBvZiBSVDI4NjAgQVAvU1RBLCB3ZSBoYXZlIGVyYXNlZCA4MDUxIGZpcm13YXJlLgotCQlTbyBMRUQgbW9kZSBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gQVRFIGlzIHJ1bm5pbmcuCi0JKi8KLQlpZiAoIUlTX1JUMzU3MihwQWQpKQotCXsKLQkJaWYgKEFURV9PTihwQWQpKQotCQkJcmV0dXJuOwotCX0KLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLQlMb3dCeXRlID0gcEFkLT5MZWRDbnRsLmZpZWxkLkxlZE1vZGUmMHg3ZjsKLQlzd2l0Y2ggKFN0YXR1cykKLQl7Ci0JCWNhc2UgTEVEX0xJTktfRE9XTjoKLQkJCUhpZ2hCeXRlID0gMHgyMDsKLQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOwotCQkJcEFkLT5MZWRJbmRpY2F0b3JTdHJlbmd0aCA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSBMRURfTElOS19VUDoKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCi0JCQkJSGlnaEJ5dGUgPSAweGEwOwotCQkJZWxzZQotCQkJCUhpZ2hCeXRlID0gMHg2MDsKLQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTEVEX1JBRElPX09OOgotCQkJSGlnaEJ5dGUgPSAweDIwOwotCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBMRURfSEFMVDoKLQkJCUxvd0J5dGUgPSAwOyAvLyBEcml2ZXIgc2V0cyBNQUMgcmVnaXN0ZXIgYW5kIE1BQyBjb250cm9scyBMRUQKLQkJY2FzZSBMRURfUkFESU9fT0ZGOgotCQkJSGlnaEJ5dGUgPSAwOwotCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBMRURfV1BTOgotCQkJSGlnaEJ5dGUgPSAweDEwOwotCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBMRURfT05fU0lURV9TVVJWRVk6Ci0JCQlIaWdoQnl0ZSA9IDB4MDg7Ci0JCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKLQkJCWJyZWFrOwotCQljYXNlIExFRF9QT1dFUl9VUDoKLQkJCUhpZ2hCeXRlID0gMHgwNDsKLQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOwotCQkJYnJlYWs7Ci0jaWZkZWYgUkFMSU5LX0FURQotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQkJZGVmYXVsdDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUlRNUFNldExFRDo6VW5rbm93biBTdGF0dXMgJWRcbiIsIFN0YXR1cykpOwotCQkJYnJlYWs7Ci0JfQotCi0gICAgLy8KLQkvLyBLZWVwIExFRCBzdGF0dXMgZm9yIExFRCBTaXRlU3VydmV5IG1vZGUuCi0JLy8gQWZ0ZXIgU2l0ZVN1cnZleSwgd2Ugd2lsbCBzZXQgdGhlIExFRCBtb2RlIHRvIHByZXZpb3VzIHN0YXR1cy4KLQkvLwotCWlmICgoU3RhdHVzICE9IExFRF9PTl9TSVRFX1NVUlZFWSkgJiYgKFN0YXR1cyAhPSBMRURfUE9XRVJfVVApICYmIChiSWdub3JlZCA9PSBGQUxTRSkpCi0JCXBBZC0+TGVkU3RhdHVzID0gU3RhdHVzOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNldExFRDo6TW9kZT0lZCxIaWdoQnl0ZT0weCUwMngsTG93Qnl0ZT0weCUwMnhcbiIsIHBBZC0+TGVkQ250bC5maWVsZC5MZWRNb2RlLCBIaWdoQnl0ZSwgTG93Qnl0ZSkpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJU2V0IExFRCBTaWduYWwgU3RyZWd0aAotCi0JQXJndW1lbnRzOgotCQlwQWQJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCURibQkJCQkJCVNpZ25hbCBTdHJlZ3RoCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQlOb3RlOgotCQlDYW4gYmUgcnVuIG9uIGFueSBJUlFMIGxldmVsLgotCi0JCUFjY29yZGluZyB0byBNaWNyb3NvZnQgWmVybyBDb25maWcgV2lyZWxlc3MgU2lnbmFsIFN0cmVndGggZGVmaW5pdGlvbiBhcyBiZWxvd3MuCi0JCTw9IC05MCAgTm8gU2lnbmFsCi0JCTw9IC04MSAgVmVyeSBMb3cKLQkJPD0gLTcxICBMb3cKLQkJPD0gLTY3ICBHb29kCi0JCTw9IC01NyAgVmVyeSBHb29kCi0JCSA+IC01NyAgRXhjZWxsZW50Ci0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QU2V0U2lnbmFsTEVEKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIE5ESVNfODAyXzExX1JTU0kgRGJtKQotewotCVVDSEFSCQluTGVkID0gMDsKLQotCWlmIChwQWQtPkxlZENudGwuZmllbGQuTGVkTW9kZSA9PSBMRURfTU9ERV9TSUdOQUxfU1RSRUdUSCkKLQl7Ci0JCWlmIChEYm0gPD0gLTkwKQotCQkJbkxlZCA9IDA7Ci0JCWVsc2UgaWYgKERibSA8PSAtODEpCi0JCQluTGVkID0gMTsKLQkJZWxzZSBpZiAoRGJtIDw9IC03MSkKLQkJCW5MZWQgPSAzOwotCQllbHNlIGlmIChEYm0gPD0gLTY3KQotCQkJbkxlZCA9IDc7Ci0JCWVsc2UgaWYgKERibSA8PSAtNTcpCi0JCQluTGVkID0gMTU7Ci0JCWVsc2UKLQkJCW5MZWQgPSAzMTsKLQotCQkvLwotCQkvLyBVcGRhdGUgU2lnbmFsIFN0cmVndGggdG8gZmlybXdhcmUgaWYgY2hhbmdlZC4KLQkJLy8KLQkJaWYgKHBBZC0+TGVkSW5kaWNhdG9yU3RyZW5ndGggIT0gbkxlZCkKLQkJewotCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUxLCAweGZmLCBuTGVkLCBwQWQtPkxlZENudGwuZmllbGQuUG9sYXJpdHkpOwotCQkJcEFkLT5MZWRJbmRpY2F0b3JTdHJlbmd0aCA9IG5MZWQ7Ci0JCX0KLQl9Ci19Ci0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJRW5hYmxlIFJYCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA8PSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQkJQmVmb3JlIEVuYWJsZSBSWCwgbWFrZSBzdXJlIHlvdSBoYXZlIGVuYWJsZWQgSW50ZXJydXB0LgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUEVuYWJsZVJ4VHgoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpCi17Ci0vLwlXUERNQV9HTE9fQ0ZHX1NUUlVDCUdsb0NmZzsKLS8vCVVMT05HCWkgPSAwOwotCVVJTlQzMiByeF9maWx0ZXJfZmxhZzsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBSVE1QRW5hYmxlUnhUeFxuIikpOwotCi0JLy8gRW5hYmxlIFJ4IERNQS4KLQlSVDI4WFhETUFFbmFibGUocEFkKTsKLQotCS8vIGVuYWJsZSBSWCBvZiBNQUMgYmxvY2sKLQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKQotCXsKLQkJcnhfZmlsdGVyX2ZsYWcgPSBBUE5PUk1BTDsKLQotCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgcnhfZmlsdGVyX2ZsYWcpOyAgICAgLy8gZW5hYmxlIFJYIG9mIERNQSBibG9jawotCX0KLQllbHNlCi0JewotCQlpZiAocEFkLT5Db21tb25DZmcuUFNQWGxpbmspCi0JCQlyeF9maWx0ZXJfZmxhZyA9IFBTUFhMSU5LOwotCQllbHNlCi0JCQlyeF9maWx0ZXJfZmxhZyA9IFNUQU5PUk1BTDsgICAgIC8vIFN0YWlvbiBub3QgZHJvcCBjb250cm9sIGZyYW1lIHdpbGwgZmFpbCBXaUZpIENlcnRpZmljYXRpb24uCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgcnhfZmlsdGVyX2ZsYWcpOwotCX0KLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHhjKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gUlRNUEVuYWJsZVJ4VHhcbiIpKTsKLX0KLQotCi0vLysrK0FkZCBieSBzaGlhbmcsIG1vdmUgZnJvbSBvcy9saW51eC9ydF9tYWluX2Rldi5jCi12b2lkIENmZ0luaXRIb29rKFBSVE1QX0FEQVBURVIgcEFkKQotewotCXBBZC0+YkJyb2FkQ29tSFQgPSBUUlVFOwotfQotCi0KLWludCBydDI4eHhfaW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQU1RSSU5HIHBEZWZhdWx0TWFjLAotCUlOIFBTVFJJTkcgcEhvc3ROYW1lKQotewotCVVJTlQJCQkJCWluZGV4OwotCVVDSEFSCQkJCQlUbXBQaHk7Ci0JTkRJU19TVEFUVVMJCQkJU3RhdHVzOwotCVVJTlQzMgkJCQkJTWFjQ3NyMCA9IDA7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkvLyBJZiBkaXJ2ZXIgZG9lc24ndCB3YWtlIHVwIGZpcm13YXJlIGhlcmUsCi0JLy8gTklDTG9hZEZpcm13YXJlIHdpbGwgaGFuZyBmb3JldmVyIHdoZW4gaW50ZXJmYWNlIGlzIHVwIGFnYWluLgotCS8vIFJUMjg2MCBQQ0kKLQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSAmJgotCQlPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkKLQl7Ci0JCUFVVE9fV0FLRVVQX1NUUlVDIEF1dG9XYWtldXBDZmc7Ci0JCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKLQkJQXV0b1dha2V1cENmZy53b3JkID0gMDsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOwotCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKLQl9Ci0JfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLQkvLyByZXNldCBBZGFwdGVyIGZsYWdzCi0JUlRNUF9DTEVBUl9GTEFHUyhwQWQpOwotCi0JLy8gSW5pdCBCc3NUYWIgJiBDaGFubmVsSW5mbyB0YWJibGVzIGZvciBhdXRvIGNoYW5uZWwgc2VsZWN0LgotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JLy8gQWxsb2NhdGUgQkEgUmVvcmRlcmluZyBtZW1vcnkKLQliYV9yZW9yZGVyaW5nX3Jlc291cmNlX2luaXQocEFkLCBNQVhfUkVPUkRFUklOR19NUERVX05VTSk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkvLyBNYWtlIHN1cmUgTUFDIGdldHMgcmVhZHkuCi0JaW5kZXggPSAwOwotCWRvCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19DU1IwLCAmTWFjQ3NyMCk7Ci0JCXBBZC0+TUFDVmVyc2lvbiA9IE1hY0NzcjA7Ci0KLQkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gIT0gMHgwMCkgJiYgKHBBZC0+TUFDVmVyc2lvbiAhPSAweEZGRkZGRkZGKSkKLQkJCWJyZWFrOwotCi0JCVJUTVB1c2VjRGVsYXkoMTApOwotCX0gd2hpbGUgKGluZGV4KysgPCAxMDApOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1BQ19DU1IwICBbIFZlcjpSZXY9MHglMDh4XVxuIiwgcEFkLT5NQUNWZXJzaW9uKSk7Ci0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLSNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKLQkvKkl2ZXJzb24gcGF0Y2ggUENJRSBMMSBpc3N1ZSB0byBtYWtlIHN1cmUgdGhhdCBkcml2ZXIgY2FuIGJlIHJlYWQsd3JpdGUgLEJCUCBhbmQgUkYgcmVnaXN0ZXIgIGF0IHBjaWUgTC4xIGxldmVsICovCi0JaWYgKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkmJk9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKQotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBBVVhfQ1RSTCwgJk1hY0NzcjApOwotCQlNYWNDc3IwIHw9IDB4NDAyOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVhfQ1RSTCwgTWFjQ3NyMCk7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVWF9DVFJMID0gMHgleFxuIiwgTWFjQ3NyMCkpOwotCX0KLSNlbmRpZiAvLyBQQ0lFX1BTX1NVUFBPUlQgLy8KLQotCS8vIFRvIGZpeCBkcml2ZXIgZGlzYWJsZS9lbmFibGUgaGFuZyBpc3N1ZSB3aGVuIHJhZGlvIG9mZgotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBXUl9QSU5fQ0ZHLCAweDIpOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JLy8gRGlzYWJsZSBETUEKLQlSVDI4WFhETUFEaXNhYmxlKHBBZCk7Ci0KLQotCS8vIExvYWQgODA1MSBmaXJtd2FyZQotCVN0YXR1cyA9IE5JQ0xvYWRGaXJtd2FyZShwQWQpOwotCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UX0VSUigoIk5JQ0xvYWRGaXJtd2FyZSBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7Ci0JCWdvdG8gZXJyMTsKLQl9Ci0KLQlOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtcyhwQWQpOwotCi0JLy8gRGlzYWJsZSBpbnRlcnJ1cHRzIGhlcmUgd2hpY2ggaXMgYXMgc29vbiBhcyBwb3NzaWJsZQotCS8vIFRoaXMgc3RhdGVtZW50IHNob3VsZCBuZXZlciBiZSB0cnVlLiBXZSBtaWdodCBjb25zaWRlciB0byByZW1vdmUgaXQgbGF0ZXIKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpKQotCXsKLQkJUlRNUF9BU0lDX0lOVEVSUlVQVF9ESVNBQkxFKHBBZCk7Ci0JfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JU3RhdHVzID0gUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnkocEFkKTsKLQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVF9FUlIoKCJSVE1QQWxsb2NETUFNZW1vcnkgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cykpOwotCQlnb3RvIGVycjE7Ci0JfQotCi0JUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSk7Ci0KLQkvLyBpbml0aWFsaXplIE1MTUUKLQkvLwotCi0JU3RhdHVzID0gUnRtcE1nbXRUYXNrSW5pdChwQWQpOwotCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJZ290byBlcnIyOwotCi0JU3RhdHVzID0gTWxtZUluaXQocEFkKTsKLQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVF9FUlIoKCJNbG1lSW5pdCBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7Ci0JCWdvdG8gZXJyMjsKLQl9Ci0KLQkvLyBJbml0aWFsaXplIHBBZC0+U3RhQ2ZnLCBwQWQtPkFwQ2ZnLCBwQWQtPkNvbW1vbkNmZyB0byBtYW51ZmFjdHVyZSBkZWZhdWx0Ci0JLy8KLQlVc2VyQ2ZnSW5pdChwQWQpOwotCVN0YXR1cyA9IFJ0bXBOZXRUYXNrSW5pdChwQWQpOwotCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJZ290byBlcnIzOwotCi0vLwlDT1BZX01BQ19BRERSKHBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5Cc3NpZCwgbmV0aWYtPmh3YWRkcik7Ci0vLwlwQWQtPmJGb3JjZVByaW50VFggPSBUUlVFOwotCi0JQ2ZnSW5pdEhvb2socEFkKTsKLQotCi0jaWZkZWYgQkxPQ0tfTkVUX0lGCi0JaW5pdGJsb2NrUXVldWVUYWIocEFkKTsKLSNlbmRpZiAvLyBCTE9DS19ORVRfSUYgLy8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JTWVhc3VyZVJlcVRhYkluaXQocEFkKTsKLQlUcGNSZXFUYWJJbml0KHBBZCk7Ci0KLQkvLwotCS8vIEluaXQgdGhlIGhhcmR3YXJlLCB3ZSBuZWVkIHRvIGluaXQgYXNpYyBiZWZvcmUgcmVhZCByZWdpc3RyeSwgb3RoZXJ3aXNlIG1hYyByZWdpc3RlciB3aWxsIGJlIHJlc2V0Ci0JLy8KLQlTdGF0dXMgPSBOSUNJbml0aWFsaXplQWRhcHRlcihwQWQsIFRSVUUpOwotCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UX0VSUigoIk5JQ0luaXRpYWxpemVBZGFwdGVyIGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLCBTdGF0dXMpKTsKLQkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQlnb3RvIGVycjM7Ci0JfQotCi0JLy8gUmVhZCBwYXJhbWV0ZXJzIGZyb20gQ29uZmlnIEZpbGUKLQlTdGF0dXMgPSBSVE1QUmVhZFBhcmFtZXRlcnNIb29rKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiMS4gUGh5IE1vZGUgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSkpOwotCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UX0VSUigoIk5JQ1JlYWRSZWdQYXJhbWV0ZXJzIGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLFN0YXR1cykpOwotCQlnb3RvIGVycjQ7Ci0JfQotCi0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCS8vSW5pdCBCYSBDYXBhYmlsaXR5IHBhcmFtZXRlcnMuCi0vLwlSVDI4WFhfQkFfSU5JVChwQWQpOwotCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHk7Ci0JcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGU7Ci0JcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZSA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1U2l6ZTsKLQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGU7Ci0JLy8gVVBkYXRhIHRvIEhUIElFCi0JcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZTsKLQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1U2l6ZTsKLQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCS8vIGFmdGVyIHJlYWRpbmcgUmVnaXN0cnksIHdlIG5vdyBrbm93IGlmIGluIEFQIG1vZGUgb3IgU1RBIG1vZGUKLQotCS8vIExvYWQgODA1MSBmaXJtd2FyZTsgY3Jhc2ggd2hlbiBGVyBpbWFnZSBub3QgZXhpc3RlbnQKLQkvLyBTdGF0dXMgPSBOSUNMb2FkRmlybXdhcmUocEFkKTsKLQkvLyBpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JLy8gICAgYnJlYWs7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiMi4gUGh5IE1vZGUgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSkpOwotCi0JLy8gV2Ugc2hvdWxkIHJlYWQgRUVQUk9NIGZvciBhbGwgY2FzZXMuICBydDI4NjBiCi0JTklDUmVhZEVFUFJPTVBhcmFtZXRlcnMocEFkLCAoUFVDSEFSKXBEZWZhdWx0TWFjKTsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIzLiBQaHkgTW9kZSA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKSk7Ci0KLQlOSUNJbml0QXNpY0Zyb21FRVBST00ocEFkKTsgLy9ydDI4NjBiCi0KLQkvLyBTZXQgUEhZIHRvIGFwcHJvcHJpYXRlIG1vZGUKLQlUbXBQaHkgPSBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlOwotCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSAweGZmOwotCVJUTVBTZXRQaHlNb2RlKHBBZCwgVG1wUGh5KTsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlTZXRDb21tb25IVChwQWQpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JLy8gTm8gdmFsaWQgY2hhbm5lbHMuCi0JaWYgKHBBZC0+Q2hhbm5lbExpc3ROdW0gPT0gMCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIldyb25nIGNvbmZpZ3VyYXRpb24uIE5vIHZhbGlkIGNoYW5uZWwgZm91bmQuIENoZWNrIFwiQ29udHJ5Q29kZVwiIGFuZCBcIkNoYW5uZWxHZW9ncmFwaHlcIiBzZXR0aW5nLlxuIikpOwotCQlnb3RvIGVycjQ7Ci0JfQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIk1DUyBTZXQgPSAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0sCi0gICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0sIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMl0sCi0gICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbM10sIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0pKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotI2lmZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotCS8vSW5pdCBSVDMweHggUkZSZWdpc3RlcnMgYWZ0ZXIgcmVhZCBSRklDIHR5cGUgZnJvbSBFRVBST00KLQlOSUNJbml0UkZSZWdpc3RlcnMocEFkKTsKLSNlbmRpZiAvLyBSVE1QX1JGX1JXX1NVUFBPUlQgLy8KLQotCi0KLS8vCQlBUEluaXRpYWxpemUocEFkKTsKLQotI2lmZGVmIElLQU5PU19WWF8xWDAKLQlWUl9JS0FOT1NfRlBfSW5pdChwQWQtPkFwQ2ZnLkJzc2lkTnVtLCBwQWQtPlBlcm1hbmVudEFkZHJlc3MpOwotI2VuZGlmIC8vIElLQU5PU19WWF8xWDAgLy8KLQotCQkvLwotCS8vIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQotCS8vCi0JQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0KLQkvLyA4MDUxIGZpcm13YXJlIHJlcXVpcmUgdGhlIHNpZ25hbCBkdXJpbmcgYm9vdGluZyB0aW1lLgotCS8vMjAwOC8xMS8yODpLSCBtYXJrZWQgdGhlIGZvbGxvd2luZyBjb2RlcyB0byBwYXRjaCBGcmVxdWVuY3kgb2Zmc2V0IGJ1ZwotCS8vQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDcyLCAweEZGLCAweDAwLCAweDAwKTsKLQotCWlmIChwQWQgJiYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSkKLQl7Ci0JCS8vCi0JCS8vIFVuZG8gZXZlcnl0aGluZyBpZiBpdCBmYWlsZWQKLQkJLy8KLQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLQkJewotLy8JCQlOZGlzTURlcmVnaXN0ZXJJbnRlcnJ1cHQoJnBBZC0+SW50ZXJydXB0KTsKLQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSk7Ci0JCX0KLS8vCQlSVE1QRnJlZUFkYXB0ZXIocEFkKTsgLy8gd2Ugd2lsbCBmcmVlIGl0IGluIGRpc2Nvbm5lY3QoKQotCX0KLQllbHNlIGlmIChwQWQpCi0JewotCQkvLyBNaWNyb3NvZnQgSENUIHJlcXVpcmUgZHJpdmVyIHNlbmQgYSBkaXNjb25uZWN0IGV2ZW50IGFmdGVyIGRyaXZlciBpbml0aWFsaXphdGlvbi4KLQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKLS8vCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOwotCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9NRURJQV9TVEFURV9DSEFOR0UpOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQiFcbiIpKTsKLQotCi0JfS8vIGVuZCBvZiBlbHNlCi0KLQotCS8vIFNldCB1cCB0aGUgTWFjIGFkZHJlc3MKLQlSdG1wT1NOZXREZXZBZGRyU2V0KHBBZC0+bmV0X2RldiwgJnBBZC0+Q3VycmVudEFkZHJlc3NbMF0pOwotCi0JLy8gVmFyaW91cyBBUCBmdW5jdGlvbiBpbml0Ci0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50IGZvciBpbmZyb21pbmcgaW50ZXJmYWNlIHVwLgotCQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIElXRVZDVVNUT00sIFJUX0lOVEVSRkFDRV9VUCwgTlVMTCwgTlVMTCwgMCk7Ci0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCi0JREJHUFJJTlRfUyhTdGF0dXMsICgiPD09PT0gcnQyOHh4X2luaXQsIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLQotCi1lcnI0OgotZXJyMzoKLQlNbG1lSGFsdChwQWQpOwotZXJyMjoKLQlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KHBBZCk7Ci1lcnIxOgotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0Jb3NfZnJlZV9tZW0ocEFkLCBwQWQtPm1wZHVfYmxrX3Bvb2wubWVtKTsgLy8gZnJlZSBCQSBwb29sCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkvLyBzaGFsbCBub3Qgc2V0IHByaXYgdG8gTlVMTCBoZXJlIGJlY2F1c2UgdGhlIHByaXYgZGlkbid0IGJlZW4gZnJlZSB5ZXQuCi0JLy9uZXRfZGV2LT5wcml2ID0gMDsKLSNpZmRlZiBJTkZfQU1BWk9OX1NFCi1lcnIwOgotI2VuZGlmIC8vIElORl9BTUFaT05fU0UgLy8KLSNpZmRlZiBTVAotZXJyMDoKLSNlbmRpZiAvLyBTVCAvLwotCi0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiISEhIHJ0Mjh4eCBJbml0aWFsaXplZCBmYWlsICEhIVxuIikpOwotCXJldHVybiBGQUxTRTsKLX0KLS8vLS0tQWRkIGJ5IHNoaWFuZywgbW92ZSBmcm9tIG9zL2xpbnV4L3J0X21haW5fZGV2LmMKLQotCi1zdGF0aWMgSU5UIFJ0bXBDaGlwT3BzUmVnaXN0ZXIoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gSU5UCQkJaW5mVHlwZSkKLXsKLQlSVE1QX0NISVBfT1AJKnBDaGlwT3BzID0gJnBBZC0+Y2hpcE9wczsKLQlpbnQgc3RhdHVzOwotCi0JbWVtc2V0KHBDaGlwT3BzLCAwLCBzaXplb2YoUlRNUF9DSElQX09QKSk7Ci0KLQkvKiBzZXQgZWVwcm9tIHJlbGF0ZWQgaG9vayBmdW5jdGlvbnMgKi8KLQlzdGF0dXMgPSBSdG1wQ2hpcE9wc0VlcHJvbUhvb2socEFkLCBpbmZUeXBlKTsKLQotCS8qIHNldCBtY3UgcmVsYXRlZCBob29rIGZ1bmN0aW9ucyAqLwotCXN3aXRjaChpbmZUeXBlKQotCXsKLSNpZmRlZiBSVE1QX1BDSV9TVVBQT1JUCi0JCWNhc2UgUlRNUF9ERVZfSU5GX1BDSToKLQkJCXBDaGlwT3BzLT5sb2FkRmlybXdhcmUgPSBSdG1wQXNpY0xvYWRGaXJtd2FyZTsKLQkJCXBDaGlwT3BzLT5lcmFzZUZpcm13YXJlID0gUnRtcEFzaWNFcmFzZUZpcm13YXJlOwotCQkJcENoaXBPcHMtPnNlbmRDb21tYW5kVG9NY3UgPSBSdG1wQXNpY1NlbmRDb21tYW5kVG9NY3U7Ci0JCQlicmVhazsKLSNlbmRpZiAvLyBSVE1QX1BDSV9TVVBQT1JUIC8vCi0KLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotCi1JTlQgUnRtcFJhRGV2Q3RybEluaXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gUlRNUF9JTkZfVFlQRSBpbmZUeXBlKQotewotCS8vVk9JRAkqaGFuZGxlOwotCi0JLy8gQXNzaWduIHRoZSBpbnRlcmZhY2UgdHlwZS4gV2UgbmVlZCB1c2UgaXQgd2hlbiBkbyByZWdpc3Rlci9FRVBST00gYWNjZXNzLgotCXBBZC0+aW5mVHlwZSA9IGluZlR5cGU7Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCXBBZC0+T3BNb2RlID0gT1BNT0RFX1NUQTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTVEEgRHJpdmVyIHZlcnNpb24tJXNcbiIsIFNUQV9EUklWRVJfVkVSU0lPTikpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLQotCVJ0bXBDaGlwT3BzUmVnaXN0ZXIocEFkLCBpbmZUeXBlKTsKLQotI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAotewotCWV4dGVybiBCT09MRUFOIFJUTVBfQ2FyZEluZm9SZWFkKFBSVE1QX0FEQVBURVIgcEFkKTsKLQotCS8vIGZpbmQgaXRzIHByb2ZpbGUgcGF0aAotCXBBZC0+TUNfUm93SUQgPSAtMTsgLy8gdXNlIGRlZmF1bHQgcHJvZmlsZSBwYXRoCi0JUlRNUF9DYXJkSW5mb1JlYWQocEFkKTsKLQotCWlmIChwQWQtPk1DX1Jvd0lEID09IC0xKQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlzdHJjcHkocEFkLT5NQ19GaWxlTmFtZSwgU1RBX1BST0ZJTEVfUEFUSCk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNQz4gUk9XID0gJWQsIFBBVEggPSAlc1xuIiwgcEFkLT5NQ19Sb3dJRCwgcEFkLT5NQ19GaWxlTmFtZSkpOwotfQotI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotQk9PTEVBTiBSdG1wUmFEZXZDdHJsRXhpdChJTiBSVE1QX0FEQVBURVIgKnBBZCkKLXsKLSNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKLWV4dGVybiBVSU5UOCAgTUNfQ2FyZFVzZWRbTUFYX05VTV9PRl9NVUxUSVBMRV9DQVJEXTsKLQotCWlmICgocEFkLT5NQ19Sb3dJRCA+PSAwKSAmJiAocEFkLT5NQ19Sb3dJRCA8PSBNQVhfTlVNX09GX01VTFRJUExFX0NBUkQpKQotCQlNQ19DYXJkVXNlZFtwQWQtPk1DX1Jvd0lEXSA9IDA7IC8vIG5vdCBjbGVhciBNQUMgYWRkcmVzcwotI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLwotCi0KLQlSVE1QRnJlZUFkYXB0ZXIocEFkKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8vIG5vdCB5ZXQgc3VwcG9ydCBNQlNTCi1QTkVUX0RFViBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKLXsKLQlQTkVUX0RFViBkZXZfcCA9IE5VTEw7Ci0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCWRldl9wID0gcEFkLT5uZXRfZGV2OwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCUFTU0VSVChkZXZfcCk7Ci0JcmV0dXJuIGRldl9wOyAvKiByZXR1cm4gb25lIG9mIE1CU1MgKi8KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL3J0bXBfbWN1LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9ydG1wX21jdS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2Y3ODVhOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9ydG1wX21jdS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTYwICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JcnRtcF9tY3UuYwotCi0JQWJzdHJhY3Q6Ci0JTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCi0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotI2luY2x1ZGUgIi4uL2Zpcm13YXJlLmgiCi0KLS8vI2RlZmluZSBCSU5fSU5fRklMRSAvKiB1c2UgKi5iaW4gZmlybXdhcmUgKi8KLQotCi0vLyBOZXcgOGsgYnl0ZSBmaXJtd2FyZSBzaXplIGZvciBSVDMwNzEvUlQzMDcyCi0jZGVmaW5lIEZJUk1XQVJFSU1BR0VfTUFYX0xFTkdUSAkweDIwMDAKLSNkZWZpbmUgRklSTVdBUkVJTUFHRV9MRU5HVEgJCQkoc2l6ZW9mIChGaXJtd2FyZUltYWdlKSAvIHNpemVvZihVQ0hBUikpCi0jZGVmaW5lIEZJUk1XQVJFX01BSk9SX1ZFUlNJT04JCTAKLQotI2RlZmluZSBGSVJNV0FSRUlNQUdFVjFfTEVOR1RICQkweDEwMDAKLSNkZWZpbmUgRklSTVdBUkVJTUFHRVYyX0xFTkdUSAkJMHgxMDAwCi0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLSNkZWZpbmUgRklSTVdBUkVfTUlOT1JfVkVSU0lPTgkJMgotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi1jb25zdCB1bnNpZ25lZCBzaG9ydCBjY2l0dF8xNlRhYmxlW10gPSB7Ci0JMHgwMDAwLCAweDEwMjEsIDB4MjA0MiwgMHgzMDYzLCAweDQwODQsIDB4NTBBNSwgMHg2MEM2LCAweDcwRTcsCi0JMHg4MTA4LCAweDkxMjksIDB4QTE0QSwgMHhCMTZCLCAweEMxOEMsIDB4RDFBRCwgMHhFMUNFLCAweEYxRUYsCi0JMHgxMjMxLCAweDAyMTAsIDB4MzI3MywgMHgyMjUyLCAweDUyQjUsIDB4NDI5NCwgMHg3MkY3LCAweDYyRDYsCi0JMHg5MzM5LCAweDgzMTgsIDB4QjM3QiwgMHhBMzVBLCAweEQzQkQsIDB4QzM5QywgMHhGM0ZGLCAweEUzREUsCi0JMHgyNDYyLCAweDM0NDMsIDB4MDQyMCwgMHgxNDAxLCAweDY0RTYsIDB4NzRDNywgMHg0NEE0LCAweDU0ODUsCi0JMHhBNTZBLCAweEI1NEIsIDB4ODUyOCwgMHg5NTA5LCAweEU1RUUsIDB4RjVDRiwgMHhDNUFDLCAweEQ1OEQsCi0JMHgzNjUzLCAweDI2NzIsIDB4MTYxMSwgMHgwNjMwLCAweDc2RDcsIDB4NjZGNiwgMHg1Njk1LCAweDQ2QjQsCi0JMHhCNzVCLCAweEE3N0EsIDB4OTcxOSwgMHg4NzM4LCAweEY3REYsIDB4RTdGRSwgMHhENzlELCAweEM3QkMsCi0JMHg0OEM0LCAweDU4RTUsIDB4Njg4NiwgMHg3OEE3LCAweDA4NDAsIDB4MTg2MSwgMHgyODAyLCAweDM4MjMsCi0JMHhDOUNDLCAweEQ5RUQsIDB4RTk4RSwgMHhGOUFGLCAweDg5NDgsIDB4OTk2OSwgMHhBOTBBLCAweEI5MkIsCi0JMHg1QUY1LCAweDRBRDQsIDB4N0FCNywgMHg2QTk2LCAweDFBNzEsIDB4MEE1MCwgMHgzQTMzLCAweDJBMTIsCi0JMHhEQkZELCAweENCREMsIDB4RkJCRiwgMHhFQjlFLCAweDlCNzksIDB4OEI1OCwgMHhCQjNCLCAweEFCMUEsCi0JMHg2Q0E2LCAweDdDODcsIDB4NENFNCwgMHg1Q0M1LCAweDJDMjIsIDB4M0MwMywgMHgwQzYwLCAweDFDNDEsCi0JMHhFREFFLCAweEZEOEYsIDB4Q0RFQywgMHhERENELCAweEFEMkEsIDB4QkQwQiwgMHg4RDY4LCAweDlENDksCi0JMHg3RTk3LCAweDZFQjYsIDB4NUVENSwgMHg0RUY0LCAweDNFMTMsIDB4MkUzMiwgMHgxRTUxLCAweDBFNzAsCi0JMHhGRjlGLCAweEVGQkUsIDB4REZERCwgMHhDRkZDLCAweEJGMUIsIDB4QUYzQSwgMHg5RjU5LCAweDhGNzgsCi0JMHg5MTg4LCAweDgxQTksIDB4QjFDQSwgMHhBMUVCLCAweEQxMEMsIDB4QzEyRCwgMHhGMTRFLCAweEUxNkYsCi0JMHgxMDgwLCAweDAwQTEsIDB4MzBDMiwgMHgyMEUzLCAweDUwMDQsIDB4NDAyNSwgMHg3MDQ2LCAweDYwNjcsCi0JMHg4M0I5LCAweDkzOTgsIDB4QTNGQiwgMHhCM0RBLCAweEMzM0QsIDB4RDMxQywgMHhFMzdGLCAweEYzNUUsCi0JMHgwMkIxLCAweDEyOTAsIDB4MjJGMywgMHgzMkQyLCAweDQyMzUsIDB4NTIxNCwgMHg2Mjc3LCAweDcyNTYsCi0JMHhCNUVBLCAweEE1Q0IsIDB4OTVBOCwgMHg4NTg5LCAweEY1NkUsIDB4RTU0RiwgMHhENTJDLCAweEM1MEQsCi0JMHgzNEUyLCAweDI0QzMsIDB4MTRBMCwgMHgwNDgxLCAweDc0NjYsIDB4NjQ0NywgMHg1NDI0LCAweDQ0MDUsCi0JMHhBN0RCLCAweEI3RkEsIDB4ODc5OSwgMHg5N0I4LCAweEU3NUYsIDB4Rjc3RSwgMHhDNzFELCAweEQ3M0MsCi0JMHgyNkQzLCAweDM2RjIsIDB4MDY5MSwgMHgxNkIwLCAweDY2NTcsIDB4NzY3NiwgMHg0NjE1LCAweDU2MzQsCi0JMHhEOTRDLCAweEM5NkQsIDB4RjkwRSwgMHhFOTJGLCAweDk5QzgsIDB4ODlFOSwgMHhCOThBLCAweEE5QUIsCi0JMHg1ODQ0LCAweDQ4NjUsIDB4NzgwNiwgMHg2ODI3LCAweDE4QzAsIDB4MDhFMSwgMHgzODgyLCAweDI4QTMsCi0JMHhDQjdELCAweERCNUMsIDB4RUIzRiwgMHhGQjFFLCAweDhCRjksIDB4OUJEOCwgMHhBQkJCLCAweEJCOUEsCi0JMHg0QTc1LCAweDVBNTQsIDB4NkEzNywgMHg3QTE2LCAweDBBRjEsIDB4MUFEMCwgMHgyQUIzLCAweDNBOTIsCi0JMHhGRDJFLCAweEVEMEYsIDB4REQ2QywgMHhDRDRELCAweEJEQUEsIDB4QUQ4QiwgMHg5REU4LCAweDhEQzksCi0JMHg3QzI2LCAweDZDMDcsIDB4NUM2NCwgMHg0QzQ1LCAweDNDQTIsIDB4MkM4MywgMHgxQ0UwLCAweDBDQzEsCi0JMHhFRjFGLCAweEZGM0UsIDB4Q0Y1RCwgMHhERjdDLCAweEFGOUIsIDB4QkZCQSwgMHg4RkQ5LCAweDlGRjgsCi0JMHg2RTE3LCAweDdFMzYsIDB4NEU1NSwgMHg1RTc0LCAweDJFOTMsIDB4M0VCMiwgMHgwRUQxLCAweDFFRjAKLX07Ci0jZGVmaW5lIEJ5dGVDUkMxNih2LCBjcmMpIFwKLQkodW5zaWduZWQgc2hvcnQpKChjcmMgPDwgOCkgXiAgY2NpdHRfMTZUYWJsZVsoKGNyYyA+PiA4KSBeICh2KSkgJiAyNTVdKQotCi11bnNpZ25lZCBjaGFyIEJpdFJldmVyc2UodW5zaWduZWQgY2hhciB4KQotewotCWludCBpOwotCXVuc2lnbmVkIGNoYXIgVGVtcD0wOwotCWZvcihpPTA7IDsgaSsrKQotCXsKLQkJaWYoeCAmIDB4ODApCVRlbXAgfD0gMHg4MDsKLQkJaWYoaT09NykJCWJyZWFrOwotCQl4CTw8PSAxOwotCQlUZW1wID4+PSAxOwotCX0KLQlyZXR1cm4gVGVtcDsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJZXJhc2UgODA1MSBmaXJtd2FyZSBpbWFnZSBpbiBNQUMgQVNJQwotCi0JQXJndW1lbnRzOgotCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBSdG1wQXNpY0VyYXNlRmlybXdhcmUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JVUxPTkcgaTsKLQotCWZvcihpPTA7IGk8TUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkU7IGkrPTQpCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEZJUk1XQVJFX0lNQUdFX0JBU0UgKyBpLCAwKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJTG9hZCA4MDUxIGZpcm13YXJlIGZpbGUgaW50byBNQUMgQVNJQwotCi0JQXJndW1lbnRzOgotCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlORElTX1NUQVRVU19TVUNDRVNTICAgICAgICAgZmlybXdhcmUgaW1hZ2UgbG9hZCBvawotCQlORElTX1NUQVRVU19GQUlMVVJFICAgICAgICAgaW1hZ2Ugbm90IGZvdW5kCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMgUnRtcEFzaWNMb2FkRmlybXdhcmUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0jaWZkZWYgQklOX0lOX0ZJTEUKLSNkZWZpbmUgTklDTEZfREVGQVVMVF9VU0UoKQlcCi0JZmxnX2RlZmF1bHRfZmlybV91c2UgPSBUUlVFOyBcCi0JREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIiVzIC0gVXNlIGRlZmF1bHQgZmlybXdhcmUhXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQotCU5ESVNfU1RBVFVTCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCVBVQ0hBUgkJCXNyYzsKLQlSVE1QX09TX0ZECQlzcmNmOwotCUlOVAkJCQlyZXR2YWwsIGk7Ci0JUFVDSEFSCQkJcEZpcm13YXJlSW1hZ2U7Ci0JSU5UCQkJCUZpbGVMZW5ndGggPSAwOwotCVVJTlQzMgkJCU1hY1JlZzsKLQlVTE9ORwkJCUluZGV4OwotCVVMT05HCQkJZmlybTsKLQlCT09MRUFOCQkJZmxnX2RlZmF1bHRfZmlybV91c2UgPSBGQUxTRTsKLQlSVE1QX09TX0ZTX0lORk8Jb3NGU0luZm87Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+ICVzXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQotCS8qIGluaXQgKi8KLQlwRmlybXdhcmVJbWFnZSA9IE5VTEw7Ci0Jc3JjID0gUlRNUF9GSVJNV0FSRV9GSUxFX05BTUU7Ci0KLQlSdG1wT1NGU0luZm9DaGFuZ2UoJm9zRlNJbmZvLCBUUlVFKTsKLQotCXBBZC0+RmlybXdhcmVWZXJzaW9uID0gKEZJUk1XQVJFX01BSk9SX1ZFUlNJT04gPDwgOCkgKyBcCi0JCQkJCQkgICBGSVJNV0FSRV9NSU5PUl9WRVJTSU9OOwotCi0KLQkvKiBhbGxvY2F0ZSBmaXJtd2FyZSBidWZmZXIgKi8KLQlwRmlybXdhcmVJbWFnZSA9IGttYWxsb2MoTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKLQlpZiAocEZpcm13YXJlSW1hZ2UgPT0gTlVMTCkKLQl7Ci0JCS8qIGFsbG9jYXRlIGZhaWwsIHVzZSBkZWZhdWx0IGZpcm13YXJlIGFycmF5IGluIGZpcm13YXJlLmggKi8KLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgLSBBbGxvY2F0ZSBtZW1vcnkgZmFpbCFcbiIsIF9fRlVOQ1RJT05fXykpOwotCQlOSUNMRl9ERUZBVUxUX1VTRSgpOwotCX0KLQllbHNlCi0JewotCQkvKiBhbGxvY2F0ZSBvayEgemVybyB0aGUgZmlybXdhcmUgYnVmZmVyICovCi0JCW1lbXNldChwRmlybXdhcmVJbWFnZSwgMHgwMCwgTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUpOwotCX0gLyogRW5kIG9mIGlmICovCi0KLQotCS8qIGlmIG9rLCByZWFkIGZpcm13YXJlIGZpbGUgZnJvbSAqLmJpbiBmaWxlICovCi0JaWYgKGZsZ19kZWZhdWx0X2Zpcm1fdXNlID09IEZBTFNFKQotCXsKLQkJZG8KLQkJewotCQkJLyogb3BlbiB0aGUgYmluIGZpbGUgKi8KLQkJCXNyY2YgPSBSdG1wT1NGaWxlT3BlbihzcmMsIE9fUkRPTkxZLCAwKTsKLQotCQkJaWYgKElTX0ZJTEVfT1BFTl9FUlIoc3JjZikpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgLSBFcnJvciBvcGVuaW5nIGZpbGUgJXNcbiIsIF9fRlVOQ1RJT05fXywgc3JjKSk7Ci0JCQkJTklDTEZfREVGQVVMVF9VU0UoKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCi0JCQkvKiByZWFkIHRoZSBmaXJtd2FyZSBmcm9tIHRoZSBmaWxlICouYmluICovCi0JCQlGaWxlTGVuZ3RoID0gUnRtcE9TRmlsZVJlYWQoc3JjZiwgcEZpcm13YXJlSW1hZ2UsIE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFKTsKLQkJCWlmIChGaWxlTGVuZ3RoICE9IE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBlcnJvciBmaWxlIGxlbmd0aCAoPSVkKSBpbiBSVDI4NjBBUC5CSU5cbiIsCi0JCQkJCSAgIF9fRlVOQ1RJT05fXywgRmlsZUxlbmd0aCkpOwotCQkJCU5JQ0xGX0RFRkFVTFRfVVNFKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJUFVDSEFSIHB0ciA9IHBGaXJtd2FyZUltYWdlOwotCQkJCVVTSE9SVCBjcmMgPSAweGZmZmY7Ci0KLQotCQkJCS8qIGNhbGN1bGF0ZSBmaXJtd2FyZSBDUkMgKi8KLQkJCQlmb3IoaT0wOyBpPChNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0yKTsgaSsrLCBwdHIrKykKLQkJCQkJY3JjID0gQnl0ZUNSQzE2KEJpdFJldmVyc2UoKnB0ciksIGNyYyk7Ci0JCQkJLyogRW5kIG9mIGZvciAqLwotCi0JCQkJaWYgKChwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0yXSAhPSBcCi0JCQkJCQkJCShVQ0hBUilCaXRSZXZlcnNlKChVQ0hBUikoY3JjPj44KSkpIHx8Ci0JCQkJCShwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0xXSAhPSBcCi0JCQkJCQkJCShVQ0hBUilCaXRSZXZlcnNlKChVQ0hBUiljcmMpKSkKLQkJCQl7Ci0JCQkJCS8qIENSQyBmYWlsICovCi0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBDUkMgPSAweCUwMnggMHglMDJ4ICIKLQkJCQkJCSAgICJlcnJvciwgc2hvdWxkIGJlIDB4JTAyeCAweCUwMnhcbiIsCi0JCQkJCQkgICBfX0ZVTkNUSU9OX18sCi0JCQkJCQkgICBwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0yXSwKLQkJCQkJCSAgIHBGaXJtd2FyZUltYWdlW01BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTFdLAotCQkJCQkJICAgKFVDSEFSKShjcmM+PjgpLCAoVUNIQVIpKGNyYykpKTsKLQkJCQkJTklDTEZfREVGQVVMVF9VU0UoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCS8qIGZpcm13YXJlIGlzIG9rICovCi0JCQkJCXBBZC0+RmlybXdhcmVWZXJzaW9uID0gXAotCQkJCQkJKHBGaXJtd2FyZUltYWdlW01BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTRdIDw8IDgpICsKLQkJCQkJCXBGaXJtd2FyZUltYWdlW01BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTNdOwotCi0JCQkJCS8qIGNoZWNrIGlmIGZpcm13YXJlIHZlcnNpb24gb2YgdGhlIGZpbGUgaXMgdG9vIG9sZCAqLwotCQkJCQlpZiAoKHBBZC0+RmlybXdhcmVWZXJzaW9uKSA8IFwKLQkJCQkJCQkJCQkJKChGSVJNV0FSRV9NQUpPUl9WRVJTSU9OIDw8IDgpICsKLQkJCQkJCQkJCQkJIEZJUk1XQVJFX01JTk9SX1ZFUlNJT04pKQotCQkJCQl7Ci0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogZmlybXdhcmUgdmVyc2lvbiB0b28gb2xkIVxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCQkJCQlOSUNMRl9ERUZBVUxUX1VTRSgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0gLyogRW5kIG9mIGlmICovCi0JCQkJfSAvKiBFbmQgb2YgaWYgKi8KLQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAotCQkJCQkJICgiTklDTG9hZEZpcm13YXJlOiBDUkMgb2ssIHZlcj0lZC4lZFxuIiwKLQkJCQkJCSAgcEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtNF0sCi0JCQkJCQkgIHBGaXJtd2FyZUltYWdlW01BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTNdKSk7Ci0JCQl9IC8qIEVuZCBvZiBpZiAoRmlsZUxlbmd0aCA9PSBNQVhfRklSTVdBUkVfSU1BR0VfU0laRSkgKi8KLQkJCWJyZWFrOwotCQl9IHdoaWxlKFRSVUUpOwotCi0JCS8qIGNsb3NlIGZpcm13YXJlIGZpbGUgKi8KLQkJaWYgKElTX0ZJTEVfT1BFTl9FUlIoc3JjZikpCi0JCQk7Ci0JCWVsc2UKLQkJewotCQkJcmV0dmFsID0gUnRtcE9TRmlsZUNsb3NlKHNyY2YpOwotCQkJaWYgKHJldHZhbCkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gRXJyb3IgJWQgY2xvc2luZyAlc1xuIiwgLXJldHZhbCwgc3JjKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qIHdyaXRlIGZpcm13YXJlIHRvIEFTSUMgKi8KLQlpZiAoZmxnX2RlZmF1bHRfZmlybV91c2UgPT0gVFJVRSkKLQl7Ci0JCS8qIHVzZSBkZWZhdWx0IGZpbWV3YXJlLCBmcmVlIGFsbG9jYXRlZCBidWZmZXIgKi8KLQkJaWYgKHBGaXJtd2FyZUltYWdlICE9IE5VTEwpCi0JCQlrZnJlZShwRmlybXdhcmVJbWFnZSk7Ci0JCS8qIEVuZCBvZiBpZiAqLwotCi0JCS8qIHVzZSBkZWZhdWx0ICouYmluIGFycmF5ICovCi0JCXBGaXJtd2FyZUltYWdlID0gRmlybXdhcmVJbWFnZTsKLQkJRmlsZUxlbmd0aCA9IHNpemVvZihGaXJtd2FyZUltYWdlKTsKLQl9IC8qIEVuZCBvZiBpZiAqLwotCi0JLyogZW5hYmxlIEhvc3QgcHJvZ3JhbSByYW0gd3JpdGUgc2VsZWN0aW9uICovCi0JUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX1NZU19DVFJMLCAweDEwMDAwKTsKLQotCWZvcihpPTA7IGk8RmlsZUxlbmd0aDsgaSs9NCkKLQl7Ci0JCWZpcm0gPSBwRmlybXdhcmVJbWFnZVtpXSArCi0JCQkgICAocEZpcm13YXJlSW1hZ2VbaSszXSA8PCAyNCkgKwotCQkJICAgKHBGaXJtd2FyZUltYWdlW2krMl0gPDwgMTYpICsKLQkJCSAgIChwRmlybXdhcmVJbWFnZVtpKzFdIDw8IDgpOwotCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEZJUk1XQVJFX0lNQUdFX0JBU0UgKyBpLCBmaXJtKTsKLQl9IC8qIEVuZCBvZiBmb3IgKi8KLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHgwMDAwMCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX1NZU19DVFJMLCAweDAwMDAxKTsKLQotCS8qIGluaXRpYWxpemUgQkJQIFIvVyBhY2Nlc3MgYWdlbnQgKi8KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fQkJQX0FHRU5ULCAwKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsIDApOwotCi0JaWYgKGZsZ19kZWZhdWx0X2Zpcm1fdXNlID09IEZBTFNFKQotCXsKLQkJLyogdXNlIGZpbGUgZmlybXdhcmUsIGZyZWUgYWxsb2NhdGVkIGJ1ZmZlciAqLwotCQlpZiAocEZpcm13YXJlSW1hZ2UgIT0gTlVMTCkKLQkJCWtmcmVlKHBGaXJtd2FyZUltYWdlKTsKLQkJLyogRW5kIG9mIGlmICovCi0JfSAvKiBFbmQgb2YgaWYgKi8KLQotCVJ0bXBPU0ZTSW5mb0NoYW5nZSgmb3NGU0luZm8sIEZBTFNFKTsKLSNlbHNlCi0KLQlORElTX1NUQVRVUwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQlQVUNIQVIJCQlwRmlybXdhcmVJbWFnZTsKLQlVTE9ORwkJCUZpbGVMZW5ndGgsIEluZGV4OwotCS8vVUxPTkcJCQlmaXJtOwotCVVJTlQzMgkJCU1hY1JlZyA9IDA7Ci0JVUlOVDMyCQkJVmVyc2lvbiA9IChwQWQtPk1BQ1ZlcnNpb24gPj4gMTYpOwotCi0JcEZpcm13YXJlSW1hZ2UgPSBGaXJtd2FyZUltYWdlOwotCUZpbGVMZW5ndGggPSBzaXplb2YoRmlybXdhcmVJbWFnZSk7Ci0KLQkvLyBOZXcgOGsgYnl0ZSBmaXJtd2FyZSBzaXplIGZvciBSVDMwNzEvUlQzMDcyCi0JLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJVc2IgQ2hpcFxuIikpOwotCWlmIChGSVJNV0FSRUlNQUdFX0xFTkdUSCA9PSBGSVJNV0FSRUlNQUdFX01BWF9MRU5HVEgpCi0JLy9UaGUgZmlybXdhcmUgaW1hZ2UgY29uc2lzdHMgb2YgdHdvIHBhcnRzLiBPbmUgaXMgdGhlIG9yaWdpYW5sIGFuZCB0aGUgb3RoZXIgaXMgdGhlIG5ldy4KLQkvL1VzZSBTZWNvbmQgUGFydAotCXsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJaWYgKChWZXJzaW9uID09IDB4Mjg2MCkgfHwgSVNfUlQzMDkwKHBBZCl8fElTX1JUMzM5MChwQWQpKQotCQl7Ci0JCQlwRmlybXdhcmVJbWFnZSA9IEZpcm13YXJlSW1hZ2U7Ci0JCQlGaWxlTGVuZ3RoID0gRklSTVdBUkVJTUFHRV9MRU5HVEg7Ci0JCX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiS0g6IGJpbiBmaWxlIHNob3VsZCBiZSA4S0IuXG4iKSk7Ci0JCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0KLQlSVE1QX1dSSVRFX0ZJUk1XQVJFKHBBZCwgcEZpcm13YXJlSW1hZ2UsIEZpbGVMZW5ndGgpOwotCi0jZW5kaWYKLQotCS8qIGNoZWNrIGlmIE1DVSBpcyByZWFkeSAqLwotCUluZGV4ID0gMDsKLQlkbwotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBQQkZfU1lTX0NUUkwsICZNYWNSZWcpOwotCi0JCWlmIChNYWNSZWcgJiAweDgwKQotCQkJYnJlYWs7Ci0KLQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQl9IHdoaWxlIChJbmRleCsrIDwgMTAwMCk7Ci0KLSAgICBpZiAoSW5kZXggPj0gMTAwMCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk5JQ0xvYWRGaXJtd2FyZTogTUNVIGlzIG5vdCByZWFkeVxuXG5cbiIpKTsKLQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09ICVzIChzdGF0dXM9JWQpXG4iLCBfX0ZVTkNUSU9OX18sIFN0YXR1cykpOwotCi0gICAgcmV0dXJuIFN0YXR1czsKLX0KLQotCi1JTlQgUnRtcEFzaWNTZW5kQ29tbWFuZFRvTWN1KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSCQkgQ29tbWFuZCwKLQlJTiBVQ0hBUgkJIFRva2VuLAotCUlOIFVDSEFSCQkgQXJnMCwKLQlJTiBVQ0hBUgkJIEFyZzEpCi17Ci0JSE9TVF9DTURfQ1NSX1NUUlVDCUgyTUNtZDsKLQlIMk1fTUFJTEJPWF9TVFJVQwlIMk1NYWlsYm94OwotCVVMT05HCQkJCWkgPSAwOwotI2lmZGVmIFJUTVBfTUFDX1BDSQotI2lmZGVmIFJBTElOS19BVEUKLQlzdGF0aWMgVUlOVDMyIGogPSAwOwotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLSNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkvLyAzMDkwRiBwb3dlciBzb2x1dGlvbiAzIGhhcyBodyBsaW1pdGF0aW9uIHRoYXQgbmVlZHMgdG8gYmFuIGFsbCBtY3UgY29tbWFuZAotCS8vIHdoZW4gZmlybXdhcmUgaXMgaW4gcmFkaW8gc3RhdGUuICBGb3Igb3RoZXIgY2hpcCBkb2Vzbid0IGhhdmUgdGhpcyBsaW1pdGF0aW9uLgotCWlmICgoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKSkgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkKLQkJJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPT0gMykKLQkJJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSkKLQl7Ci0JCVJUTVBfU0VNX0xPQ0soJnBBZC0+TWN1Q21kTG9jayk7Ci0JCWlmICgocEFkLT5icnQzMHh4QmFuTWN1Q21kID09IFRSVUUpCi0JCQkmJiAoQ29tbWFuZCAhPSBXQUtFX01DVV9DTUQpICYmIChDb21tYW5kICE9IFJGT0ZGX01DVV9DTUQpKQotCQl7Ci0JCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWN1Q21kTG9jayk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgQmFuIE1jdSBDbWQgJXggaW4gc2xlZXAgbW9kZVxuIiwgIENvbW1hbmQpKTsKLQkJCXJldHVybiBGQUxTRTsKLQkJfQotCQllbHNlIGlmICgoQ29tbWFuZCA9PSBTTEVFUF9NQ1VfQ01EKQotCQkJfHwoQ29tbWFuZCA9PSBSRk9GRl9NQ1VfQ01EKSkKLQkJewotCQkJcEFkLT5icnQzMHh4QmFuTWN1Q21kID0gVFJVRTsKLQkJfQotCQllbHNlIGlmIChDb21tYW5kICE9IFdBS0VfTUNVX0NNRCkKLQkJewotCQkJcEFkLT5icnQzMHh4QmFuTWN1Q21kID0gRkFMU0U7Ci0JCX0KLQotCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWN1Q21kTG9jayk7Ci0KLQl9Ci0JaWYgKCgoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpICYmIElTX1ZFUlNJT05fQUZURVJfRihwQWQpKSAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKQotCQkmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQotCQkmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpCi0JCSYmIChDb21tYW5kID09IFdBS0VfTUNVX0NNRCkpCi0JewotCi0JCWRvCi0JCXsKLQkJCVJUTVBfSU9fRk9SQ0VfUkVBRDMyKHBBZCwgSDJNX01BSUxCT1hfQ1NSLCAmSDJNTWFpbGJveC53b3JkKTsKLQkJCWlmIChIMk1NYWlsYm94LmZpZWxkLk93bmVyID09IDApCi0JCQkJYnJlYWs7Ci0KLQkJCVJUTVB1c2VjRGVsYXkoMik7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19JTkZPLCAoIkFzaWNTZW5kQ29tbWFuVG9NY3U6Ok1haWwgYm94IGlzIGJ1c3lcbiIpKTsKLQkJfSB3aGlsZShpKysgPCAxMDApOwotCi0JCWlmIChpID49IDEwMCkKLQkJewotCQkJREJHUFJJTlRfRVJSKCgiSDJNX01BSUxCT1ggc3RpbGwgaG9sZCBieSBNQ1UuIGNvbW1hbmQgZmFpbFxuIikpOwotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0KLQkJSDJNTWFpbGJveC5maWVsZC5Pd25lcgkgID0gMTsJICAgLy8gcGFzcyBvd25lcnNoaXAgdG8gTUNVCi0JCUgyTU1haWxib3guZmllbGQuQ21kVG9rZW4gPSBUb2tlbjsKLQkJSDJNTWFpbGJveC5maWVsZC5IaWdoQnl0ZSA9IEFyZzE7Ci0JCUgyTU1haWxib3guZmllbGQuTG93Qnl0ZSAgPSBBcmcwOwotCQlSVE1QX0lPX0ZPUkNFX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsIEgyTU1haWxib3gud29yZCk7Ci0KLQkJSDJNQ21kLndvcmQJCQkgID0gMDsKLQkJSDJNQ21kLmZpZWxkLkhvc3RDb21tYW5kICA9IENvbW1hbmQ7Ci0JCVJUTVBfSU9fRk9SQ0VfV1JJVEUzMihwQWQsIEhPU1RfQ01EX0NTUiwgSDJNQ21kLndvcmQpOwotCi0KLQl9Ci0JZWxzZQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFBDSUVfUFNfU1VQUE9SVCAvLwotCXsKLQlkbwotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsICZIMk1NYWlsYm94LndvcmQpOwotCQlpZiAoSDJNTWFpbGJveC5maWVsZC5Pd25lciA9PSAwKQotCQkJYnJlYWs7Ci0KLQkJUlRNUHVzZWNEZWxheSgyKTsKLQl9IHdoaWxlKGkrKyA8IDEwMCk7Ci0KLQlpZiAoaSA+PSAxMDApCi0JewotI2lmZGVmIFJUTVBfTUFDX1BDSQotI2lmZGVmIFJBTElOS19BVEUKLQkJaWYgKHBBZC0+YXRlLmJGV0xvYWRpbmcgPT0gVFJVRSkKLQkJewotCQkJLyogcmVsb2FkaW5nIGZpcm13YXJlIHdoZW4gcmVjZWl2ZWQgaXdwcml2IGNtZCAiQVRFPUFURVNUT1AiICovCi0JCQlpZiAoaiA+IDApCi0JCQl7Ci0JCQkJaWYgKGogJSA2NCAhPSAwKQotCQkJCXsKLQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiIyIpKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiXG4iKSk7Ci0JCQkJfQotCQkJCSsrajsKLQkJCX0KLQkJCWVsc2UgaWYgKGogPT0gMCkKLQkJCXsKLQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJMb2FkaW5nIGZpcm13YXJlLiBQbGVhc2Ugd2FpdCBmb3IgYSBtb21lbnQuLi5cbiIpKTsKLQkJCQkrK2o7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQkJewotCQlEQkdQUklOVF9FUlIoKCJIMk1fTUFJTEJPWCBzdGlsbCBob2xkIGJ5IE1DVS4gY29tbWFuZCBmYWlsXG4iKSk7Ci0JCX0KLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotI2lmZGVmIFJBTElOS19BVEUKLQllbHNlIGlmIChwQWQtPmF0ZS5iRldMb2FkaW5nID09IFRSVUUpCi0JewotCQkvKiByZWxvYWRpbmcgb2YgZmlybXdhcmUgaXMgY29tcGxldGVkICovCi0JCXBBZC0+YXRlLmJGV0xvYWRpbmcgPSBGQUxTRTsKLQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiXG4iKSk7Ci0JCWogPSAwOwotCX0KLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQlIMk1NYWlsYm94LmZpZWxkLk93bmVyCSAgPSAxOwkgICAvLyBwYXNzIG93bmVyc2hpcCB0byBNQ1UKLQlIMk1NYWlsYm94LmZpZWxkLkNtZFRva2VuID0gVG9rZW47Ci0JSDJNTWFpbGJveC5maWVsZC5IaWdoQnl0ZSA9IEFyZzE7Ci0JSDJNTWFpbGJveC5maWVsZC5Mb3dCeXRlICA9IEFyZzA7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfQ1NSLCBIMk1NYWlsYm94LndvcmQpOwotCi0JSDJNQ21kLndvcmQJCQkgID0gMDsKLQlIMk1DbWQuZmllbGQuSG9zdENvbW1hbmQgID0gQ29tbWFuZDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIT1NUX0NNRF9DU1IsIEgyTUNtZC53b3JkKTsKLQotCWlmIChDb21tYW5kICE9IDB4ODApCi0JewotCX0KLX0KLSNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkvLyAzMDkwIE1DVSBXYWtldXAgY29tbWFuZCBuZWVkcyBtb3JlIHRpbWUgdG8gYmUgc3RhYmxlLgotCS8vIEJlZm9yZSBzdGFibGUsIGRvbid0IGlzc3VlIG90aGVyIE1DVSBjb21tYW5kIHRvIHByZXZlbnQgZnJvbSBmaXJtd2FyZSBlcnJvci4KLQlpZiAoKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkpICYmIElTX1ZFUlNJT05fQUZURVJfRihwQWQpCi0JCSYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID09IDMpCi0JCSYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkKLQkJJiYgKENvbW1hbmQgPT0gV0FLRV9NQ1VfQ01EKSkKLQl7Ci0JCVJUTVB1c2VjRGVsYXkoMjAwMCk7Ci0JCS8vUHV0IHRoaXMgaXMgYWZ0ZXIgUkYgcHJvZ3JhbW1pbmcuCi0JCS8vTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NY3VDbWRMb2NrKTsKLQkJLy9wQWQtPmJydDMweHhCYW5NY3VDbWQgPSBGQUxTRTsKLQkJLy9OZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1jdUNtZExvY2spOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBQQ0lFX1BTX1NVUFBPUlQgLy8KLQotCXJldHVybiBUUlVFOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vcnRtcF90aW1lci5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vcnRtcF90aW1lci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjUzZTg3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL3J0bXBfdGltZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIHJ0bXBfdGltZXIuYwotCi0gICAgQWJzdHJhY3Q6Ci0gICAgdGFzayBmb3IgdGltZXIgaGFuZGxpbmcKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIE5hbWUgICAgICAgICAgRGF0ZSAgICAgICAgICAgIE1vZGlmaWNhdGlvbiBsb2dzCi0gICAgU2hpYW5nIFR1CTA4LTI4LTIwMDggICBpbml0IHZlcnNpb24KLQotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLUJVSUxEX1RJTUVSX0ZVTkNUSU9OKE1sbWVQZXJpb2RpY0V4ZWMpOwotLy9CVUlMRF9USU1FUl9GVU5DVElPTihNbG1lUnNzaVJlcG9ydEV4ZWMpOwotQlVJTERfVElNRVJfRlVOQ1RJT04oQXNpY1J4QW50RXZhbFRpbWVvdXQpOwotQlVJTERfVElNRVJfRlVOQ1RJT04oQVBTRFBlcmlvZGljRXhlYyk7Ci1CVUlMRF9USU1FUl9GVU5DVElPTihBc2ljUmZUdW5pbmdFeGVjKTsKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1CVUlMRF9USU1FUl9GVU5DVElPTihCZWFjb25UaW1lb3V0KTsKLUJVSUxEX1RJTUVSX0ZVTkNUSU9OKFNjYW5UaW1lb3V0KTsKLUJVSUxEX1RJTUVSX0ZVTkNUSU9OKEF1dGhUaW1lb3V0KTsKLUJVSUxEX1RJTUVSX0ZVTkNUSU9OKEFzc29jVGltZW91dCk7Ci1CVUlMRF9USU1FUl9GVU5DVElPTihSZWFzc29jVGltZW91dCk7Ci1CVUlMRF9USU1FUl9GVU5DVElPTihEaXNhc3NvY1RpbWVvdXQpOwotQlVJTERfVElNRVJfRlVOQ1RJT04oTGlua0Rvd25FeGVjKTsKLUJVSUxEX1RJTUVSX0ZVTkNUSU9OKFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMpOwotQlVJTERfVElNRVJfRlVOQ1RJT04oV3BhRGlzYXNzb2NBcEFuZEJsb2NrQXNzb2MpOwotI2lmZGVmIFJUTVBfTUFDX1BDSQotQlVJTERfVElNRVJfRlVOQ1RJT04oUHNQb2xsV2FrZUV4ZWMpOwotQlVJTERfVElNRVJfRlVOQ1RJT04oUmFkaW9PbkV4ZWMpOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotQlVJTERfVElNRVJfRlVOQ1RJT04oRGxzVGltZW91dEFjdGlvbik7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLQotI2lmIGRlZmluZWQoQVBfTEVEKSB8fCBkZWZpbmVkKFNUQV9MRUQpCi1leHRlcm4gdm9pZCBMZWRDdHJsTWFpbigKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotQlVJTERfVElNRVJfRlVOQ1RJT04oTGVkQ3RybE1haW4pOwotI2VuZGlmCi0KLQotI2lmZGVmIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUCi1zdGF0aWMgdm9pZCBSdG1wVGltZXJRSGFuZGxlKFJUTVBfQURBUFRFUiAqcEFkKQotewotI2lmbmRlZiBLVEhSRUFEX1NVUFBPUlQKLQlpbnQgc3RhdHVzOwotI2VuZGlmCi0JUkFMSU5LX1RJTUVSX1NUUlVDVAkqcFRpbWVyOwotCVJUTVBfVElNRVJfVEFTS19FTlRSWQkqcEVudHJ5OwotCXVuc2lnbmVkIGxvbmcJaXJxRmxhZzsKLQlSVE1QX09TX1RBU0sgKnBUYXNrOwotCi0KLQlwVGFzayA9ICZwQWQtPnRpbWVyVGFzazsKLQl3aGlsZSghcFRhc2stPnRhc2tfa2lsbGVkKQotCXsKLQkJcFRpbWVyID0gTlVMTDsKLQotI2lmZGVmIEtUSFJFQURfU1VQUE9SVAotCQlSVE1QX1dBSVRfRVZFTlRfSU5URVJSVVBUSUJMRShwQWQsIHBUYXNrKTsKLSNlbHNlCi0JCVJUTVBfU0VNX0VWRU5UX1dBSVQoJihwVGFzay0+dGFza1NlbWEpLCBzdGF0dXMpOwotI2VuZGlmCi0KLQkJaWYgKHBBZC0+VGltZXJRLnN0YXR1cyA9PSBSVE1QX1RBU0tfU1RBVF9TVE9QRUQpCi0JCQlicmVhazsKLQotCQkvLyBldmVudCBoYXBwZW5lZC4KLQkJd2hpbGUocEFkLT5UaW1lclEucFFIZWFkKQotCQl7Ci0JCQlSVE1QX0lOVF9MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWcpOwotCQkJcEVudHJ5ID0gcEFkLT5UaW1lclEucFFIZWFkOwotCQkJaWYgKHBFbnRyeSkKLQkJCXsKLQkJCQlwVGltZXIgPSBwRW50cnktPnBSYVRpbWVyOwotCi0JCQkJLy8gdXBkYXRlIHBRSGVhZAotCQkJCXBBZC0+VGltZXJRLnBRSGVhZCA9IHBFbnRyeS0+cE5leHQ7Ci0JCQkJaWYgKHBFbnRyeSA9PSBwQWQtPlRpbWVyUS5wUVRhaWwpCi0JCQkJCXBBZC0+VGltZXJRLnBRVGFpbCA9IE5VTEw7Ci0KLQkJCQkvLyByZXR1cm4gdGhpcyBxdWV1ZSBlbnRyeSB0byB0aW1lclFGcmVlTGlzdC4KLQkJCQlwRW50cnktPnBOZXh0ID0gcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3Q7Ci0JCQkJcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3QgPSBwRW50cnk7Ci0JCQl9Ci0JCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZyk7Ci0KLQkJCWlmIChwVGltZXIpCi0JCQl7Ci0JCQkJaWYgKChwVGltZXItPmhhbmRsZSAhPSBOVUxMKSAmJiAoIXBBZC0+UE1fRmxnU3VzcGVuZCkpCi0JCQkJCXBUaW1lci0+aGFuZGxlKE5VTEwsIChQVk9JRCkgcFRpbWVyLT5jb29raWUsIE5VTEwsIHBUaW1lcik7Ci0JCQkJaWYgKChwVGltZXItPlJlcGVhdCkgJiYgKHBUaW1lci0+U3RhdGUgPT0gRkFMU0UpKQotCQkJCQlSVE1QX09TX0FkZF9UaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgcFRpbWVyLT5UaW1lclZhbHVlKTsKLQkJCX0KLQkJfQotCi0jaWZuZGVmIEtUSFJFQURfU1VQUE9SVAotCQlpZiAoc3RhdHVzICE9IDApCi0JCXsKLQkJCXBBZC0+VGltZXJRLnN0YXR1cyA9IFJUTVBfVEFTS19TVEFUX1NUT1BFRDsKLQkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOwotCQkJYnJlYWs7Ci0JCX0KLSNlbmRpZgotCX0KLX0KLQotCi1JTlQgUnRtcFRpbWVyUVRocmVhZCgKLQlJTiBPVVQgUFZPSUQgQ29udGV4dCkKLXsKLQlSVE1QX09TX1RBU0sJKnBUYXNrOwotCVBSVE1QX0FEQVBURVIJcEFkOwotCi0KLQlwVGFzayA9IChSVE1QX09TX1RBU0sgKilDb250ZXh0OwotCXBBZCA9IChQUlRNUF9BREFQVEVSKXBUYXNrLT5wcml2OwotCi0JUnRtcE9TVGFza0N1c3RvbWl6ZShwVGFzayk7Ci0KLQlSdG1wVGltZXJRSGFuZGxlKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoICI8LS0tJXNcbiIsX19GVU5DVElPTl9fKSk7Ci0jaWZuZGVmIEtUSFJFQURfU1VQUE9SVAotCXBUYXNrLT50YXNrUElEID0gVEhSRUFEX1BJRF9JTklUX1ZBTFVFOwotI2VuZGlmCi0JLyogbm90aWZ5IHRoZSBleGl0IHJvdXRpbmUgdGhhdCB3ZSdyZSBhY3R1YWxseSBleGl0aW5nIG5vdwotCSAqCi0JICogY29tcGxldGUoKS93YWl0X2Zvcl9jb21wbGV0aW9uKCkgaXMgc2ltaWxhciB0byB1cCgpL2Rvd24oKSwKLQkgKiBleGNlcHQgdGhhdCBjb21wbGV0ZSgpIGlzIHNhZmUgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHN0cnVjdHVyZQotCSAqIGlzIGdldHRpbmcgZGVsZXRlZCBpbiBhIHBhcmFsbGVsIG1vZGUgb2YgZXhlY3V0aW9uIChpLmUuIGp1c3QKLQkgKiBhZnRlciB0aGUgZG93bigpIC0tIHRoYXQncyBuZWNlc3NhcnkgZm9yIHRoZSB0aHJlYWQtc2h1dGRvd24KLQkgKiBjYXNlLgotCSAqCi0JICogY29tcGxldGVfYW5kX2V4aXQoKSBnb2VzIGV2ZW4gZnVydGhlciB0aGFuIHRoaXMgLS0gaXQgaXMgc2FmZSBpbgotCSAqIHRoZSBjYXNlIHRoYXQgdGhlIHRocmVhZCBvZiB0aGUgY2FsbGVyIGlzIGdvaW5nIGF3YXkgKG5vdCBqdXN0Ci0JICogdGhlIHN0cnVjdHVyZSkgLS0gdGhpcyBpcyBuZWNlc3NhcnkgZm9yIHRoZSBtb2R1bGUtcmVtb3ZlIGNhc2UuCi0JICogVGhpcyBpcyBpbXBvcnRhbnQgaW4gcHJlZW1wdGlvbiBrZXJuZWxzLCB3aGljaCB0cmFuc2ZlciB0aGUgZmxvdwotCSAqIG9mIGV4ZWN1dGlvbiBpbW1lZGlhdGVseSB1cG9uIGEgY29tcGxldGUoKS4KLQkgKi8KLQlSdG1wT1NUYXNrTm90aWZ5VG9FeGl0KHBUYXNrKTsKLQotCXJldHVybiAwOwotCi19Ci0KLQotUlRNUF9USU1FUl9UQVNLX0VOVFJZICpSdG1wVGltZXJRSW5zZXJ0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFJBTElOS19USU1FUl9TVFJVQ1QgKnBUaW1lcikKLXsKLQlSVE1QX1RJTUVSX1RBU0tfRU5UUlkgKnBRTm9kZSA9IE5VTEwsICpwUVRhaWw7Ci0JdW5zaWduZWQgbG9uZyBpcnFGbGFnczsKLQlSVE1QX09TX1RBU0sJKnBUYXNrID0gJnBBZC0+dGltZXJUYXNrOwotCi0JUlRNUF9JTlRfTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7Ci0JaWYgKHBBZC0+VGltZXJRLnN0YXR1cyAmIFJUTVBfVEFTS19DQU5fRE9fSU5TRVJUKQotCXsKLQkJaWYocEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3QpCi0JCXsKLQkJCXBRTm9kZSA9IHBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0OwotCQkJcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3QgPSBwUU5vZGUtPnBOZXh0OwotCi0JCQlwUU5vZGUtPnBSYVRpbWVyID0gcFRpbWVyOwotCQkJcFFOb2RlLT5wTmV4dCA9IE5VTEw7Ci0KLQkJCXBRVGFpbCA9IHBBZC0+VGltZXJRLnBRVGFpbDsKLQkJCWlmIChwQWQtPlRpbWVyUS5wUVRhaWwgIT0gTlVMTCkKLQkJCQlwUVRhaWwtPnBOZXh0ID0gcFFOb2RlOwotCQkJcEFkLT5UaW1lclEucFFUYWlsID0gcFFOb2RlOwotCQkJaWYgKHBBZC0+VGltZXJRLnBRSGVhZCA9PSBOVUxMKQotCQkJCXBBZC0+VGltZXJRLnBRSGVhZCA9IHBRTm9kZTsKLQkJfQotCX0KLQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOwotCi0JaWYgKHBRTm9kZSkKLQl7Ci0jaWZkZWYgS1RIUkVBRF9TVVBQT1JUCi0JCVdBS0VfVVAocFRhc2spOwotI2Vsc2UKLQkJUlRNUF9TRU1fRVZFTlRfVVAoJnBUYXNrLT50YXNrU2VtYSk7Ci0jZW5kaWYKLQl9Ci0KLQlyZXR1cm4gcFFOb2RlOwotfQotCi0KLUJPT0xFQU4gUnRtcFRpbWVyUVJlbW92ZSgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBSQUxJTktfVElNRVJfU1RSVUNUICpwVGltZXIpCi17Ci0JUlRNUF9USU1FUl9UQVNLX0VOVFJZICpwTm9kZSwgKnBQcmV2ID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGlycUZsYWdzOwotCi0JUlRNUF9JTlRfTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7Ci0JaWYgKHBBZC0+VGltZXJRLnN0YXR1cyA+PSBSVE1QX1RBU0tfU1RBVF9JTklURUQpCi0JewotCQlwTm9kZSA9IHBBZC0+VGltZXJRLnBRSGVhZDsKLQkJd2hpbGUgKHBOb2RlKQotCQl7Ci0JCQlpZiAocE5vZGUtPnBSYVRpbWVyID09IHBUaW1lcikKLQkJCQlicmVhazsKLQkJCXBQcmV2ID0gcE5vZGU7Ci0JCQlwTm9kZSA9IHBOb2RlLT5wTmV4dDsKLQkJfQotCi0JCS8vIE5vdyBtb3ZlIGl0IHRvIGZyZWVMaXN0IHF1ZXVlLgotCQlpZiAocE5vZGUpCi0JCXsKLQkJCWlmIChwTm9kZSA9PSBwQWQtPlRpbWVyUS5wUUhlYWQpCi0JCQkJcEFkLT5UaW1lclEucFFIZWFkID0gcE5vZGUtPnBOZXh0OwotCQkJaWYgKHBOb2RlID09IHBBZC0+VGltZXJRLnBRVGFpbCkKLQkJCQlwQWQtPlRpbWVyUS5wUVRhaWwgPSBwUHJldjsKLQkJCWlmIChwUHJldiAhPSBOVUxMKQotCQkJCXBQcmV2LT5wTmV4dCA9IHBOb2RlLT5wTmV4dDsKLQotCQkJLy8gcmV0dXJuIHRoaXMgcXVldWUgZW50cnkgdG8gdGltZXJRRnJlZUxpc3QuCi0JCQlwTm9kZS0+cE5leHQgPSBwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdDsKLQkJCXBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0ID0gcE5vZGU7Ci0JCX0KLQl9Ci0JUlRNUF9JTlRfVU5MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLXZvaWQgUnRtcFRpbWVyUUV4aXQoUlRNUF9BREFQVEVSICpwQWQpCi17Ci0JUlRNUF9USU1FUl9UQVNLX0VOVFJZICpwVGltZXJROwotCXVuc2lnbmVkIGxvbmcgaXJxRmxhZ3M7Ci0KLQlSVE1QX0lOVF9MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKLQl3aGlsZSAocEFkLT5UaW1lclEucFFIZWFkKQotCXsKLQkJcFRpbWVyUSA9IHBBZC0+VGltZXJRLnBRSGVhZDsKLQkJcEFkLT5UaW1lclEucFFIZWFkID0gcFRpbWVyUS0+cE5leHQ7Ci0JCS8vIHJlbW92ZSB0aGUgdGltZVEKLQl9Ci0JcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3QgPSBOVUxMOwotCW9zX2ZyZWVfbWVtKHBBZCwgcEFkLT5UaW1lclEucFRpbWVyUVBvbGwpOwotCXBBZC0+VGltZXJRLnBRVGFpbCA9IE5VTEw7Ci0JcEFkLT5UaW1lclEucFFIZWFkID0gTlVMTDsKLSNpZm5kZWYgS1RIUkVBRF9TVVBQT1JUCi0JcEFkLT5UaW1lclEuc3RhdHVzID0gUlRNUF9UQVNLX1NUQVRfU1RPUEVEOwotI2VuZGlmCi0JUlRNUF9JTlRfVU5MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKLQotfQotCi0KLXZvaWQgUnRtcFRpbWVyUUluaXQoUlRNUF9BREFQVEVSICpwQWQpCi17Ci0JaW50CWk7Ci0JUlRNUF9USU1FUl9UQVNLX0VOVFJZICpwUU5vZGUsICpwRW50cnk7Ci0JdW5zaWduZWQgbG9uZyBpcnFGbGFnczsKLQotCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPlRpbWVyUUxvY2spOwotCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+VGltZXJRLCBzaXplb2YocEFkLT5UaW1lclEpKTsKLQotCW9zX2FsbG9jX21lbShwQWQsICZwQWQtPlRpbWVyUS5wVGltZXJRUG9sbCwgc2l6ZW9mKFJUTVBfVElNRVJfVEFTS19FTlRSWSkgKiBUSU1FUl9RVUVVRV9TSVpFX01BWCk7Ci0JaWYgKHBBZC0+VGltZXJRLnBUaW1lclFQb2xsKQotCXsKLQkJcEVudHJ5ID0gTlVMTDsKLQkJcFFOb2RlID0gKFJUTVBfVElNRVJfVEFTS19FTlRSWSAqKXBBZC0+VGltZXJRLnBUaW1lclFQb2xsOwotCQlOZGlzWmVyb01lbW9yeShwQWQtPlRpbWVyUS5wVGltZXJRUG9sbCwgc2l6ZW9mKFJUTVBfVElNRVJfVEFTS19FTlRSWSkgKiBUSU1FUl9RVUVVRV9TSVpFX01BWCk7Ci0KLQkJUlRNUF9JTlRfTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7Ci0JCWZvciAoaSA9IDAgO2kgPFRJTUVSX1FVRVVFX1NJWkVfTUFYOyBpKyspCi0JCXsKLQkJCXBRTm9kZS0+cE5leHQgPSBwRW50cnk7Ci0JCQlwRW50cnkgPSBwUU5vZGU7Ci0JCQlwUU5vZGUrKzsKLQkJfQotCQlwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdCA9IHBFbnRyeTsKLQkJcEFkLT5UaW1lclEucFFIZWFkID0gTlVMTDsKLQkJcEFkLT5UaW1lclEucFFUYWlsID0gTlVMTDsKLQkJcEFkLT5UaW1lclEuc3RhdHVzID0gUlRNUF9UQVNLX1NUQVRfSU5JVEVEOwotCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOwotCX0KLX0KLSNlbmRpZiAvLyBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVCAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vc3BlY3RydW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL3NwZWN0cnVtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZDIxMjUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vc3BlY3RydW0uYworKysgL2Rldi9udWxsCkBAIC0xLDIyMjEgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLQlhY3Rpb24uYwotCi0gICAgQWJzdHJhY3Q6Ci0gICAgSGFuZGxlIGFzc29jaWF0aW9uIHJlbGF0ZWQgcmVxdWVzdHMgZWl0aGVyIGZyb20gV1NUQSBvciBmcm9tIGxvY2FsIE1MTUUKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlGb25jaGkgV3UgICAgMjAwOAkJICAgY3JlYXRlZCBmb3IgODAyLjExaAotICovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLSNpbmNsdWRlICIuLi9hY3Rpb24uaCIKLQotCi0vKiBUaGUgcmVndWxhdG9yeSBpbmZvcm1hdGlvbiBpbiB0aGUgVVNBIChVUykgKi8KLURPVDExX1JFR1VMQVRPUllfSU5GT1JNQVRJT04gVVNBUmVndWxhdG9yeUluZm9bXSA9Ci17Ci0vKiAgInJlZ3VsYXRvcnkgY2xhc3MiICAibnVtYmVyIG9mIGNoYW5uZWxzIiAgIk1heCBUeCBQd3IiICAiY2hhbm5lbCBsaXN0IiAqLwotICAgIHswLAkgICAgICAgICAgICAgICAgezAsICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICB7MH19fSwgLy8gSW52bGlkIGVudHJ5Ci0gICAgezEsICAgICAgICAgICAgICAgICB7NCwgICAgICAgICAgICAgICAgICAgMTYsICAgICAgICAgICB7MzYsIDQwLCA0NCwgNDh9fX0sCi0gICAgezIsICAgICAgICAgICAgICAgICB7NCwgICAgICAgICAgICAgICAgICAgMjMsICAgICAgICAgICB7NTIsIDU2LCA2MCwgNjR9fX0sCi0gICAgezMsICAgICAgICAgICAgICAgICB7NCwgICAgICAgICAgICAgICAgICAgMjksICAgICAgICAgICB7MTQ5LCAxNTMsIDE1NywgMTYxfX19LAotICAgIHs0LCAgICAgICAgICAgICAgICAgezExLCAgICAgICAgICAgICAgICAgIDIzLCAgICAgICAgICAgezEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwfX19LAotICAgIHs1LCAgICAgICAgICAgICAgICAgezUsICAgICAgICAgICAgICAgICAgIDMwLCAgICAgICAgICAgezE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fX19LAotICAgIHs2LCAgICAgICAgICAgICAgICAgezEwLCAgICAgICAgICAgICAgICAgIDE0LCAgICAgICAgICAgezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwfX19LAotICAgIHs3LCAgICAgICAgICAgICAgICAgezEwLCAgICAgICAgICAgICAgICAgIDI3LCAgICAgICAgICAgezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwfX19LAotICAgIHs4LCAgICAgICAgICAgICAgICAgezUsICAgICAgICAgICAgICAgICAgIDE3LCAgICAgICAgICAgezExLCAxMywgMTUsIDE3LCAxOX19fSwKLSAgICB7OSwgICAgICAgICAgICAgICAgIHs1LCAgICAgICAgICAgICAgICAgICAzMCwgICAgICAgICAgIHsxMSwgMTMsIDE1LCAxNywgMTl9fX0sCi0gICAgezEwLCAgICAgICAgICAgICAgICB7MiwgICAgICAgICAgICAgICAgICAgMjAsICAgICAgICAgICB7MjEsIDI1fX19LAotICAgIHsxMSwgICAgICAgICAgICAgICAgezIsICAgICAgICAgICAgICAgICAgIDMzLCAgICAgICAgICAgIHsyMSwgMjV9fX0sCi0gICAgezEyLCAgICAgICAgICAgICAgICB7MTEsICAgICAgICAgICAgICAgICAgMzAsICAgICAgICAgICAgezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMX19fQotfTsKLSNkZWZpbmUgVVNBX1JFR1VMQVRPUllfSU5GT19TSVpFIChzaXplb2YoVVNBUmVndWxhdG9yeUluZm8pIC8gc2l6ZW9mKERPVDExX1JFR1VMQVRPUllfSU5GT1JNQVRJT04pKQotCi0KLS8qIFRoZSByZWd1bGF0b3J5IGluZm9ybWF0aW9uIGluIEV1cm9wZSAqLwotRE9UMTFfUkVHVUxBVE9SWV9JTkZPUk1BVElPTiBFdXJvcGVSZWd1bGF0b3J5SW5mb1tdID0KLXsKLS8qICAicmVndWxhdG9yeSBjbGFzcyIgICJudW1iZXIgb2YgY2hhbm5lbHMiICAiTWF4IFR4IFB3ciIgICJjaGFubmVsIGxpc3QiICovCi0gICAgezAsICAgICAgICAgICAgICAgICB7MCwgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIHswfX19LCAvLyBJbnZhbGlkIGVudHJ5Ci0gICAgezEsICAgICAgICAgICAgICAgICB7NCwgICAgICAgICAgICAgICAgICAgMjAsICAgICAgICAgICB7MzYsIDQwLCA0NCwgNDh9fX0sCi0gICAgezIsICAgICAgICAgICAgICAgICB7NCwgICAgICAgICAgICAgICAgICAgMjAsICAgICAgICAgICB7NTIsIDU2LCA2MCwgNjR9fX0sCi0gICAgezMsICAgICAgICAgICAgICAgICB7MTEsICAgICAgICAgICAgICAgICAgMzAsICAgICAgICAgICB7MTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDB9fX0sCi0gICAgezQsICAgICAgICAgICAgICAgICB7MTMsICAgICAgICAgICAgICAgICAgMjAsICAgICAgICAgICB7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTN9fX0KLX07Ci0jZGVmaW5lIEVVX1JFR1VMQVRPUllfSU5GT19TSVpFIChzaXplb2YoRXVyb3BlUmVndWxhdG9yeUluZm8pIC8gc2l6ZW9mKERPVDExX1JFR1VMQVRPUllfSU5GT1JNQVRJT04pKQotCi0KLS8qIFRoZSByZWd1bGF0b3J5IGluZm9ybWF0aW9uIGluIEphcGFuICovCi1ET1QxMV9SRUdVTEFUT1JZX0lORk9STUFUSU9OIEphcGFuUmVndWxhdG9yeUluZm9bXSA9Ci17Ci0vKiAgInJlZ3VsYXRvcnkgY2xhc3MiICAibnVtYmVyIG9mIGNoYW5uZWxzIiAgIk1heCBUeCBQd3IiICAiY2hhbm5lbCBsaXN0IiAqLwotICAgIHswLCAgICAgICAgICAgICAgICAgezAsICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICB7MH19fSwgLy8gSW52YWxpZCBlbnRyeQotICAgIHsxLCAgICAgICAgICAgICAgICAgezQsICAgICAgICAgICAgICAgICAgIDIyLCAgICAgICAgICAgezM0LCAzOCwgNDIsIDQ2fX19LAotICAgIHsyLCAgICAgICAgICAgICAgICAgezMsICAgICAgICAgICAgICAgICAgIDI0LCAgICAgICAgICAgezgsIDEyLCAxNn19fSwKLSAgICB7MywgICAgICAgICAgICAgICAgIHszLCAgICAgICAgICAgICAgICAgICAyNCwgICAgICAgICAgIHs4LCAxMiwgMTZ9fX0sCi0gICAgezQsICAgICAgICAgICAgICAgICB7MywgICAgICAgICAgICAgICAgICAgMjQsICAgICAgICAgICB7OCwgMTIsIDE2fX19LAotICAgIHs1LCAgICAgICAgICAgICAgICAgezMsICAgICAgICAgICAgICAgICAgIDI0LCAgICAgICAgICAgezgsIDEyLCAxNn19fSwKLSAgICB7NiwgICAgICAgICAgICAgICAgIHszLCAgICAgICAgICAgICAgICAgICAyMiwgICAgICAgICAgIHs4LCAxMiwgMTZ9fX0sCi0gICAgezcsICAgICAgICAgICAgICAgICB7NCwgICAgICAgICAgICAgICAgICAgMjQsICAgICAgICAgICB7MTg0LCAxODgsIDE5MiwgMTk2fX19LAotICAgIHs4LCAgICAgICAgICAgICAgICAgezQsICAgICAgICAgICAgICAgICAgIDI0LCAgICAgICAgICAgezE4NCwgMTg4LCAxOTIsIDE5Nn19fSwKLSAgICB7OSwgICAgICAgICAgICAgICAgIHs0LCAgICAgICAgICAgICAgICAgICAyNCwgICAgICAgICAgIHsxODQsIDE4OCwgMTkyLCAxOTZ9fX0sCi0gICAgezEwLCAgICAgICAgICAgICAgICB7NCwgICAgICAgICAgICAgICAgICAgMjQsICAgICAgICAgICB7MTg0LCAxODgsIDE5MiwgMTk2fX19LAotICAgIHsxMSwgICAgICAgICAgICAgICAgezQsICAgICAgICAgICAgICAgICAgIDIyLCAgICAgICAgICAgezE4NCwgMTg4LCAxOTIsIDE5Nn19fSwKLSAgICB7MTIsICAgICAgICAgICAgICAgIHs0LCAgICAgICAgICAgICAgICAgICAyNCwgICAgICAgICAgIHs3LCA4LCA5LCAxMX19fSwKLSAgICB7MTMsICAgICAgICAgICAgICAgIHs0LCAgICAgICAgICAgICAgICAgICAyNCwgICAgICAgICAgIHs3LCA4LCA5LCAxMX19fSwKLSAgICB7MTQsICAgICAgICAgICAgICAgIHs0LCAgICAgICAgICAgICAgICAgICAyNCwgICAgICAgICAgIHs3LCA4LCA5LCAxMX19fSwKLSAgICB7MTUsICAgICAgICAgICAgICAgIHs0LCAgICAgICAgICAgICAgICAgICAyNCwgICAgICAgICAgIHs3LCA4LCA5LCAxMX19fSwKLSAgICB7MTYsICAgICAgICAgICAgICAgIHs2LCAgICAgICAgICAgICAgICAgICAyNCwgICAgICAgICAgIHsxODMsIDE4NCwgMTg1LCAxODcsIDE4OCwgMTg5fX19LAotICAgIHsxNywgICAgICAgICAgICAgICAgezYsICAgICAgICAgICAgICAgICAgIDI0LCAgICAgICAgICAgezE4MywgMTg0LCAxODUsIDE4NywgMTg4LCAxODl9fX0sCi0gICAgezE4LCAgICAgICAgICAgICAgICB7NiwgICAgICAgICAgICAgICAgICAgMjQsICAgICAgICAgICB7MTgzLCAxODQsIDE4NSwgMTg3LCAxODgsIDE4OX19fSwKLSAgICB7MTksICAgICAgICAgICAgICAgIHs2LCAgICAgICAgICAgICAgICAgICAyNCwgICAgICAgICAgIHsxODMsIDE4NCwgMTg1LCAxODcsIDE4OCwgMTg5fX19LAotICAgIHsyMCwgICAgICAgICAgICAgICAgezYsICAgICAgICAgICAgICAgICAgIDE3LCAgICAgICAgICAgezE4MywgMTg0LCAxODUsIDE4NywgMTg4LCAxODl9fX0sCi0gICAgezIxLCAgICAgICAgICAgICAgICB7NiwgICAgICAgICAgICAgICAgICAgMjQsICAgICAgICAgICB7NiwgNywgOCwgOSwgMTAsIDExfX19LAotICAgIHsyMiwgICAgICAgICAgICAgICAgezYsICAgICAgICAgICAgICAgICAgIDI0LCAgICAgICAgICAgezYsIDcsIDgsIDksIDEwLCAxMX19fSwKLSAgICB7MjMsICAgICAgICAgICAgICAgIHs2LCAgICAgICAgICAgICAgICAgICAyNCwgICAgICAgICAgIHs2LCA3LCA4LCA5LCAxMCwgMTF9fX0sCi0gICAgezI0LCAgICAgICAgICAgICAgICB7NiwgICAgICAgICAgICAgICAgICAgMjQsICAgICAgICAgICB7NiwgNywgOCwgOSwgMTAsIDExfX19LAotICAgIHsyNSwgICAgICAgICAgICAgICAgezgsICAgICAgICAgICAgICAgICAgIDI0LCAgICAgICAgICAgezE4MiwgMTgzLCAxODQsIDE4NSwgMTg2LCAxODcsIDE4OCwgMTg5fX19LAotICAgIHsyNiwgICAgICAgICAgICAgICAgezgsICAgICAgICAgICAgICAgICAgIDI0LCAgICAgICAgICAgezE4MiwgMTgzLCAxODQsIDE4NSwgMTg2LCAxODcsIDE4OCwgMTg5fX19LAotICAgIHsyNywgICAgICAgICAgICAgICAgezgsICAgICAgICAgICAgICAgICAgIDI0LCAgICAgICAgICAgezE4MiwgMTgzLCAxODQsIDE4NSwgMTg2LCAxODcsIDE4OCwgMTg5fX19LAotICAgIHsyOCwgICAgICAgICAgICAgICAgezgsICAgICAgICAgICAgICAgICAgIDI0LCAgICAgICAgICAgezE4MiwgMTgzLCAxODQsIDE4NSwgMTg2LCAxODcsIDE4OCwgMTg5fX19LAotICAgIHsyOSwgICAgICAgICAgICAgICAgezgsICAgICAgICAgICAgICAgICAgIDE3LCAgICAgICAgICAgezE4MiwgMTgzLCAxODQsIDE4NSwgMTg2LCAxODcsIDE4OCwgMTg5fX19LAotICAgIHszMCwgICAgICAgICAgICAgICAgezEzLCAgICAgICAgICAgICAgICAgIDIzLCAgICAgICAgICAgezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzfX19LAotICAgIHszMSwgICAgICAgICAgICAgICAgezEsICAgICAgICAgICAgICAgICAgIDIzLCAgICAgICAgICAgezE0fX19LAotICAgIHszMiwgICAgICAgICAgICAgICAgezQsICAgICAgICAgICAgICAgICAgIDIyLCAgICAgICAgICAgezUyLCA1NiwgNjAsIDY0fX19Ci19OwotI2RlZmluZSBKUF9SRUdVTEFUT1JZX0lORk9fU0laRSAoc2l6ZW9mKEphcGFuUmVndWxhdG9yeUluZm8pIC8gc2l6ZW9mKERPVDExX1JFR1VMQVRPUllfSU5GT1JNQVRJT04pKQotCi0KLUNIQVIgUlRNUF9HZXRUeFB3cigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBIVFRSQU5TTUlUX1NFVFRJTkcgSFRUeE1vZGUpCi17Ci10eXBlZGVmIHN0cnVjdCBfX1RYX1BXUl9DRkcKLXsKLQlVSU5UOCBNb2RlOwotCVVJTlQ4IE1DUzsKLQlVSU5UMTYgcmVxOwotCVVJTlQ4IHNoaWZ0OwotCVVJTlQzMiBCaXRNYXNrOwotfSBUWF9QV1JfQ0ZHOwotCi0JVUlOVDMyIFZhbHVlOwotCUlOVCBJZHg7Ci0JVUlOVDggUGh5TW9kZTsKLQlDSEFSIEN1clR4UHdyOwotCVVJTlQ4IFR4UHdyUmVmID0gMDsKLQlDSEFSIERhbHRhUHdyOwotCVVMT05HIFR4UHdyWzVdOwotCi0KLQlUWF9QV1JfQ0ZHIFR4UHdyQ2ZnW10gPSB7Ci0JCXtNT0RFX0NDSywgMCwgMCwgNCwgMHgwMDAwMDBmMH0sCi0JCXtNT0RFX0NDSywgMSwgMCwgMCwgMHgwMDAwMDAwZn0sCi0JCXtNT0RFX0NDSywgMiwgMCwgMTIsIDB4MDAwMGYwMDB9LAotCQl7TU9ERV9DQ0ssIDMsIDAsIDgsIDB4MDAwMDBmMDB9LAotCi0JCXtNT0RFX09GRE0sIDAsIDAsIDIwLCAweDAwZjAwMDAwfSwKLQkJe01PREVfT0ZETSwgMSwgMCwgMTYsIDB4MDAwZjAwMDB9LAotCQl7TU9ERV9PRkRNLCAyLCAwLCAyOCwgMHhmMDAwMDAwMH0sCi0JCXtNT0RFX09GRE0sIDMsIDAsIDI0LCAweDBmMDAwMDAwfSwKLQkJe01PREVfT0ZETSwgNCwgMSwgNCwgMHgwMDAwMDBmMH0sCi0JCXtNT0RFX09GRE0sIDUsIDEsIDAsIDB4MDAwMDAwMGZ9LAotCQl7TU9ERV9PRkRNLCA2LCAxLCAxMiwgMHgwMDAwZjAwMH0sCi0JCXtNT0RFX09GRE0sIDcsIDEsIDgsIDB4MDAwMDBmMDB9Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCSx7TU9ERV9IVE1JWCwgMCwgMSwgMjAsIDB4MDBmMDAwMDB9LAotCQl7TU9ERV9IVE1JWCwgMSwgMSwgMTYsIDB4MDAwZjAwMDB9LAotCQl7TU9ERV9IVE1JWCwgMiwgMSwgMjgsIDB4ZjAwMDAwMDB9LAotCQl7TU9ERV9IVE1JWCwgMywgMSwgMjQsIDB4MGYwMDAwMDB9LAotCQl7TU9ERV9IVE1JWCwgNCwgMiwgNCwgMHgwMDAwMDBmMH0sCi0JCXtNT0RFX0hUTUlYLCA1LCAyLCAwLCAweDAwMDAwMDBmfSwKLQkJe01PREVfSFRNSVgsIDYsIDIsIDEyLCAweDAwMDBmMDAwfSwKLQkJe01PREVfSFRNSVgsIDcsIDIsIDgsIDB4MDAwMDBmMDB9LAotCQl7TU9ERV9IVE1JWCwgOCwgMiwgMjAsIDB4MDBmMDAwMDB9LAotCQl7TU9ERV9IVE1JWCwgOSwgMiwgMTYsIDB4MDAwZjAwMDB9LAotCQl7TU9ERV9IVE1JWCwgMTAsIDIsIDI4LCAweGYwMDAwMDAwfSwKLQkJe01PREVfSFRNSVgsIDExLCAyLCAyNCwgMHgwZjAwMDAwMH0sCi0JCXtNT0RFX0hUTUlYLCAxMiwgMywgNCwgMHgwMDAwMDBmMH0sCi0JCXtNT0RFX0hUTUlYLCAxMywgMywgMCwgMHgwMDAwMDAwZn0sCi0JCXtNT0RFX0hUTUlYLCAxNCwgMywgMTIsIDB4MDAwMGYwMDB9LAotCQl7TU9ERV9IVE1JWCwgMTUsIDMsIDgsIDB4MDAwMDBmMDB9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JfTsKLSNkZWZpbmUgTUFYX1RYUFdSX1RBQl9TSVpFIChzaXplb2YoVHhQd3JDZmcpIC8gc2l6ZW9mKFRYX1BXUl9DRkcpKQotCi0jaWZkZWYgU0lOR0xFX1NLVQotCUN1clR4UHdyID0gcEFkLT5Db21tb25DZmcuRGVmaW5lTWF4VHhQd3I7Ci0jZWxzZQotCUN1clR4UHdyID0gMTk7Ci0jZW5kaWYKLQotCS8qIGNoZWNrIFR4IFBvd2VyIHNldHRpbmcgZnJvbSBVSS4gKi8KLQlpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA5MCkKLQkJOwotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gNjApICAvKiByZWR1Y2UgUHdyIGZvciAxIGRCLiAqLwotCQlDdXJUeFB3ciAtPSAxOwotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gMzApICAvKiByZWR1Y2UgUHdyIGZvciAzIGRCLiAqLwotCQlDdXJUeFB3ciAtPSAzOwotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gMTUpICAvKiByZWR1Y2UgUHdyIGZvciA2IGRCLiAqLwotCQlDdXJUeFB3ciAtPSA2OwotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gOSkgICAvKiByZWR1Y2UgUHdyIGZvciA5IGRCLiAqLwotCQlDdXJUeFB3ciAtPSA5OwotCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVkdWNlIFB3ciBmb3IgMTIgZEIuICovCi0JCUN1clR4UHdyIC09IDEyOwotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkKLQl7Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA+IDE0KQotCQl7Ci0JCQlUeFB3clswXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFswXTsKLQkJCVR4UHdyWzFdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzFdOwotCQkJVHhQd3JbMl0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMl07Ci0JCQlUeFB3clszXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFszXTsKLQkJCVR4UHdyWzRdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzRdOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJVHhQd3JbMF0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMF07Ci0JCQlUeFB3clsxXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFsxXTsKLQkJCVR4UHdyWzJdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzJdOwotCQkJVHhQd3JbM10gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbM107Ci0JCQlUeFB3cls0XSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFs0XTsKLQkJfQotCX0KLQllbHNlCi0JewotCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQotCQl7Ci0JCQlUeFB3clswXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFswXTsKLQkJCVR4UHdyWzFdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzFdOwotCQkJVHhQd3JbMl0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMl07Ci0JCQlUeFB3clszXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFszXTsKLQkJCVR4UHdyWzRdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzRdOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJVHhQd3JbMF0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMF07Ci0JCQlUeFB3clsxXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFsxXTsKLQkJCVR4UHdyWzJdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzJdOwotCQkJVHhQd3JbM10gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbM107Ci0JCQlUeFB3cls0XSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFs0XTsKLQkJfQotCX0KLQotCi0Jc3dpdGNoKEhUVHhNb2RlLmZpZWxkLk1PREUpCi0JewotCQljYXNlIE1PREVfQ0NLOgotCQljYXNlIE1PREVfT0ZETToKLQkJCVZhbHVlID0gVHhQd3JbMV07Ci0JCQlUeFB3clJlZiA9IChWYWx1ZSAmIDB4MDAwMDBmMDApID4+IDg7Ci0KLQkJCWJyZWFrOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWNhc2UgTU9ERV9IVE1JWDoKLQkJY2FzZSBNT0RFX0hUR1JFRU5GSUVMRDoKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAxKQotCQkJewotCQkJCVZhbHVlID0gVHhQd3JbMl07Ci0JCQkJVHhQd3JSZWYgPSAoVmFsdWUgJiAweDAwMDAwZjAwKSA+PiA4OwotCQkJfQotCQkJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMikKLQkJCXsKLQkJCQlWYWx1ZSA9IFR4UHdyWzNdOwotCQkJCVR4UHdyUmVmID0gKFZhbHVlICYgMHgwMDAwMGYwMCkgPj4gODsKLQkJCX0KLQkJCWJyZWFrOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCX0KLQotCVBoeU1vZGUgPQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJCShIVFR4TW9kZS5maWVsZC5NT0RFID09IE1PREVfSFRHUkVFTkZJRUxEKQotCQkJCT8gTU9ERV9IVE1JWCA6Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkJSFRUeE1vZGUuZmllbGQuTU9ERTsKLQotCWZvciAoSWR4ID0gMDsgSWR4IDwgTUFYX1RYUFdSX1RBQl9TSVpFOyBJZHgrKykKLQl7Ci0JCWlmICgoVHhQd3JDZmdbSWR4XS5Nb2RlID09IFBoeU1vZGUpCi0JCQkmJiAoVHhQd3JDZmdbSWR4XS5NQ1MgPT0gSFRUeE1vZGUuZmllbGQuTUNTKSkKLQkJewotCQkJVmFsdWUgPSBUeFB3cltUeFB3ckNmZ1tJZHhdLnJlcV07Ci0JCQlEYWx0YVB3ciA9IFR4UHdyUmVmIC0gKENIQVIpKChWYWx1ZSAmIFR4UHdyQ2ZnW0lkeF0uQml0TWFzaykKLQkJCQkJCQkJCQkJPj4gVHhQd3JDZmdbSWR4XS5zaGlmdCk7Ci0JCQlDdXJUeFB3ciAtPSBEYWx0YVB3cjsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIEN1clR4UHdyOwotfQotCi0KLVZPSUQgTWVhc3VyZVJlcVRhYkluaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKLQotCXBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiID0ga21hbGxvYyhzaXplb2YoTUVBU1VSRV9SRVFfVEFCKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiKQotCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYiwgc2l6ZW9mKE1FQVNVUkVfUkVRX1RBQikpOwotCWVsc2UKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgRmFpbCB0byBhbGxvYyBtZW1vcnkgZm9yIHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiLlxuIiwgX19GVU5DVElPTl9fKSk7Ci0KLQlyZXR1cm47Ci19Ci0KLVZPSUQgTWVhc3VyZVJlcVRhYkV4aXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOwotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiKQotCQlrZnJlZShwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYik7Ci0JcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIgPSBOVUxMOwotCi0JcmV0dXJuOwotfQotCi1QTUVBU1VSRV9SRVFfRU5UUlkgTWVhc3VyZVJlcUxvb2tVcCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQotewotCVVJTlQgSGFzaElkeDsKLQlQTUVBU1VSRV9SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYjsKLQlQTUVBU1VSRV9SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTDsKLQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7Ci0KLQlpZiAocFRhYiA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBNZWFzdXJlUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOwotCi0JSGFzaElkeCA9IE1RX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgoRGlhbG9nVG9rZW4pOwotCXBFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07Ci0KLQl3aGlsZSAocEVudHJ5KQotCXsKLQkJaWYgKHBFbnRyeS0+RGlhbG9nVG9rZW4gPT0gRGlhbG9nVG9rZW4pCi0JCQlicmVhazsKLQkJZWxzZQotCQl7Ci0JCQlwUHJldkVudHJ5ID0gcEVudHJ5OwotCQkJcEVudHJ5ID0gcEVudHJ5LT5wTmV4dDsKLQkJfQotCX0KLQotCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOwotCi0JcmV0dXJuIHBFbnRyeTsKLX0KLQotUE1FQVNVUkVfUkVRX0VOVFJZIE1lYXN1cmVSZXFJbnNlcnQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUlOVDgJCQlEaWFsb2dUb2tlbikKLXsKLQlJTlQgaTsKLQlVTE9ORyBIYXNoSWR4OwotCVBNRUFTVVJFX1JFUV9UQUIgcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiOwotCVBNRUFTVVJFX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMLCBwQ3VyckVudHJ5OwotCVVMT05HIE5vdzsKLQotCWlmKHBUYWIgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwTWVhc3VyZVJlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXBFbnRyeSA9IE1lYXN1cmVSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbik7Ci0JaWYgKHBFbnRyeSA9PSBOVUxMKQotCXsKLQkJUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOwotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFOyBpKyspCi0JCXsKLQkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7Ci0JCQlwRW50cnkgPSAmcFRhYi0+Q29udGVudFtpXTsKLQotCQkJaWYgKChwRW50cnktPlZhbGlkID09IFRSVUUpCi0JCQkJJiYgUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdywgKHVuc2lnbmVkIGxvbmcpKHBFbnRyeS0+bGFzdFRpbWUgKyBNUV9SRVFfQUdFX09VVCkpKQotCQkJewotCQkJCVBNRUFTVVJFX1JFUV9FTlRSWSBwUHJldkVudHJ5ID0gTlVMTDsKLQkJCQlVTE9ORyBIYXNoSWR4ID0gTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChwRW50cnktPkRpYWxvZ1Rva2VuKTsKLQkJCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByb2JlRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOwotCi0JCQkJLy8gdXBkYXRlIEhhc2ggbGlzdAotCQkJCWRvCi0JCQkJewotCQkJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KQotCQkJCQl7Ci0JCQkJCQlpZiAocFByZXZFbnRyeSA9PSBOVUxMKQotCQkJCQkJewotCQkJCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPSBwRW50cnktPnBOZXh0OwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCXBQcmV2RW50cnktPnBOZXh0ID0gcEVudHJ5LT5wTmV4dDsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0KLQkJCQkJcFByZXZFbnRyeSA9IHBQcm9iZUVudHJ5OwotCQkJCQlwUHJvYmVFbnRyeSA9IHBQcm9iZUVudHJ5LT5wTmV4dDsKLQkJCQl9IHdoaWxlIChwUHJvYmVFbnRyeSk7Ci0KLQkJCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNRUFTVVJFX1JFUV9FTlRSWSkpOwotCQkJCXBUYWItPlNpemUtLTsKLQotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAocEVudHJ5LT5WYWxpZCA9PSBGQUxTRSkKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmIChpIDwgTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFKQotCQl7Ci0JCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwotCQkJcEVudHJ5LT5sYXN0VGltZSA9IE5vdzsKLQkJCXBFbnRyeS0+VmFsaWQgPSBUUlVFOwotCQkJcEVudHJ5LT5EaWFsb2dUb2tlbiA9IERpYWxvZ1Rva2VuOwotCQkJcFRhYi0+U2l6ZSsrOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEVudHJ5ID0gTlVMTDsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwTWVhc3VyZVJlcVRhYiB0YWIgZnVsbC5cbiIsIF9fRlVOQ1RJT05fXykpOwotCQl9Ci0KLQkJLy8gYWRkIHRoaXMgTmVpZ2hib3IgZW50cnkgaW50byBIQVNIIHRhYmxlCi0JCWlmIChwRW50cnkpCi0JCXsKLQkJCUhhc2hJZHggPSBNUV9ESUFMT0dUT0tFTl9IQVNIX0lOREVYKERpYWxvZ1Rva2VuKTsKLQkJCWlmIChwVGFiLT5IYXNoW0hhc2hJZHhdID09IE5VTEwpCi0JCQl7Ci0JCQkJcFRhYi0+SGFzaFtIYXNoSWR4XSA9IHBFbnRyeTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwQ3VyckVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKLQkJCQl3aGlsZSAocEN1cnJFbnRyeS0+cE5leHQgIT0gTlVMTCkKLQkJCQkJcEN1cnJFbnRyeSA9IHBDdXJyRW50cnktPnBOZXh0OwotCQkJCXBDdXJyRW50cnktPnBOZXh0ID0gcEVudHJ5OwotCQkJfQotCQl9Ci0KLQkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7Ci0JfQotCi0JcmV0dXJuIHBFbnRyeTsKLX0KLQotVk9JRCBNZWFzdXJlUmVxRGVsZXRlKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCi17Ci0JUE1FQVNVUkVfUkVRX1RBQiBwVGFiID0gcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWI7Ci0JUE1FQVNVUkVfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7Ci0KLQlpZihwVGFiID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcE1lYXN1cmVSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gaWYgZW1wdHksIHJldHVybgotCWlmIChwVGFiLT5TaXplID09IDApCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJwTWVhc3VyZVJlcVRhYiBlbXB0eS5cbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCXBFbnRyeSA9IE1lYXN1cmVSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbik7Ci0JaWYgKHBFbnRyeSAhPSBOVUxMKQotCXsKLQkJUE1FQVNVUkVfUkVRX0VOVFJZIHBQcmV2RW50cnkgPSBOVUxMOwotCQlVTE9ORyBIYXNoSWR4ID0gTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChwRW50cnktPkRpYWxvZ1Rva2VuKTsKLQkJUE1FQVNVUkVfUkVRX0VOVFJZIHBQcm9iZUVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKLQotCQlSVE1QX1NFTV9MT0NLKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7Ci0JCS8vIHVwZGF0ZSBIYXNoIGxpc3QKLQkJZG8KLQkJewotCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKLQkJCXsKLQkJCQlpZiAocFByZXZFbnRyeSA9PSBOVUxMKQotCQkJCXsKLQkJCQkJcFRhYi0+SGFzaFtIYXNoSWR4XSA9IHBFbnRyeS0+cE5leHQ7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXBQcmV2RW50cnktPnBOZXh0ID0gcEVudHJ5LT5wTmV4dDsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCXBQcmV2RW50cnkgPSBwUHJvYmVFbnRyeTsKLQkJCXBQcm9iZUVudHJ5ID0gcFByb2JlRW50cnktPnBOZXh0OwotCQl9IHdoaWxlIChwUHJvYmVFbnRyeSk7Ci0KLQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoTUVBU1VSRV9SRVFfRU5UUlkpKTsKLQkJcFRhYi0+U2l6ZS0tOwotCi0JCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOwotCX0KLQotCXJldHVybjsKLX0KLQotVk9JRCBUcGNSZXFUYWJJbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkNvbW1vbkNmZy5UcGNSZXFUYWJMb2NrKTsKLQotCXBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIgPSBrbWFsbG9jKHNpemVvZihUUENfUkVRX1RBQiksIEdGUF9BVE9NSUMpOwotCWlmIChwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiKQotCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiLCBzaXplb2YoVFBDX1JFUV9UQUIpKTsKLQllbHNlCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIEZhaWwgdG8gYWxsb2MgbWVtb3J5IGZvciBwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiLlxuIiwgX19GVU5DVElPTl9fKSk7Ci0KLQlyZXR1cm47Ci19Ci0KLVZPSUQgVHBjUmVxVGFiRXhpdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPkNvbW1vbkNmZy5UcGNSZXFUYWJMb2NrKTsKLQotCWlmIChwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiKQotCQlrZnJlZShwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiKTsKLQlwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiID0gTlVMTDsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIFBUUENfUkVRX0VOVFJZIFRwY1JlcUxvb2tVcCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQotewotCVVJTlQgSGFzaElkeDsKLQlQVFBDX1JFUV9UQUIgcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWI7Ci0JUFRQQ19SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTDsKLQlQVFBDX1JFUV9FTlRSWSBwUHJldkVudHJ5ID0gTlVMTDsKLQotCWlmIChwVGFiID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcFRwY1JlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOwotCi0JSGFzaElkeCA9IFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKERpYWxvZ1Rva2VuKTsKLQlwRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOwotCi0Jd2hpbGUgKHBFbnRyeSkKLQl7Ci0JCWlmIChwRW50cnktPkRpYWxvZ1Rva2VuID09IERpYWxvZ1Rva2VuKQotCQkJYnJlYWs7Ci0JCWVsc2UKLQkJewotCQkJcFByZXZFbnRyeSA9IHBFbnRyeTsKLQkJCXBFbnRyeSA9IHBFbnRyeS0+cE5leHQ7Ci0JCX0KLQl9Ci0KLQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOwotCi0JcmV0dXJuIHBFbnRyeTsKLX0KLQotCi1zdGF0aWMgUFRQQ19SRVFfRU5UUlkgVHBjUmVxSW5zZXJ0KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCi17Ci0JSU5UIGk7Ci0JVUxPTkcgSGFzaElkeDsKLQlQVFBDX1JFUV9UQUIgcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWI7Ci0JUFRQQ19SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTCwgcEN1cnJFbnRyeTsKLQlVTE9ORyBOb3c7Ci0KLQlpZihwVGFiID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcFRwY1JlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXBFbnRyeSA9IFRwY1JlcUxvb2tVcChwQWQsIERpYWxvZ1Rva2VuKTsKLQlpZiAocEVudHJ5ID09IE5VTEwpCi0JewotCQlSVE1QX1NFTV9MT0NLKCZwQWQtPkNvbW1vbkNmZy5UcGNSZXFUYWJMb2NrKTsKLQkJZm9yIChpID0gMDsgaSA8IE1BWF9UUENfUkVRX1RBQl9TSVpFOyBpKyspCi0JCXsKLQkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7Ci0JCQlwRW50cnkgPSAmcFRhYi0+Q29udGVudFtpXTsKLQotCQkJaWYgKChwRW50cnktPlZhbGlkID09IFRSVUUpCi0JCQkJJiYgUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdywgKHVuc2lnbmVkIGxvbmcpKHBFbnRyeS0+bGFzdFRpbWUgKyBUUENfUkVRX0FHRV9PVVQpKSkKLQkJCXsKLQkJCQlQVFBDX1JFUV9FTlRSWSBwUHJldkVudHJ5ID0gTlVMTDsKLQkJCQlVTE9ORyBIYXNoSWR4ID0gVFBDX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgocEVudHJ5LT5EaWFsb2dUb2tlbik7Ci0JCQkJUFRQQ19SRVFfRU5UUlkgcFByb2JlRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOwotCi0JCQkJLy8gdXBkYXRlIEhhc2ggbGlzdAotCQkJCWRvCi0JCQkJewotCQkJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KQotCQkJCQl7Ci0JCQkJCQlpZiAocFByZXZFbnRyeSA9PSBOVUxMKQotCQkJCQkJewotCQkJCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPSBwRW50cnktPnBOZXh0OwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCXBQcmV2RW50cnktPnBOZXh0ID0gcEVudHJ5LT5wTmV4dDsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0KLQkJCQkJcFByZXZFbnRyeSA9IHBQcm9iZUVudHJ5OwotCQkJCQlwUHJvYmVFbnRyeSA9IHBQcm9iZUVudHJ5LT5wTmV4dDsKLQkJCQl9IHdoaWxlIChwUHJvYmVFbnRyeSk7Ci0KLQkJCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihUUENfUkVRX0VOVFJZKSk7Ci0JCQkJcFRhYi0+U2l6ZS0tOwotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChwRW50cnktPlZhbGlkID09IEZBTFNFKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGkgPCBNQVhfVFBDX1JFUV9UQUJfU0laRSkKLQkJewotCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKLQkJCXBFbnRyeS0+bGFzdFRpbWUgPSBOb3c7Ci0JCQlwRW50cnktPlZhbGlkID0gVFJVRTsKLQkJCXBFbnRyeS0+RGlhbG9nVG9rZW4gPSBEaWFsb2dUb2tlbjsKLQkJCXBUYWItPlNpemUrKzsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBFbnRyeSA9IE5VTEw7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcFRwY1JlcVRhYiB0YWIgZnVsbC5cbiIsIF9fRlVOQ1RJT05fXykpOwotCQl9Ci0KLQkJLy8gYWRkIHRoaXMgTmVpZ2hib3IgZW50cnkgaW50byBIQVNIIHRhYmxlCi0JCWlmIChwRW50cnkpCi0JCXsKLQkJCUhhc2hJZHggPSBUUENfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChEaWFsb2dUb2tlbik7Ci0JCQlpZiAocFRhYi0+SGFzaFtIYXNoSWR4XSA9PSBOVUxMKQotCQkJewotCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPSBwRW50cnk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcEN1cnJFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07Ci0JCQkJd2hpbGUgKHBDdXJyRW50cnktPnBOZXh0ICE9IE5VTEwpCi0JCQkJCXBDdXJyRW50cnkgPSBwQ3VyckVudHJ5LT5wTmV4dDsKLQkJCQlwQ3VyckVudHJ5LT5wTmV4dCA9IHBFbnRyeTsKLQkJCX0KLQkJfQotCi0JCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7Ci0JfQotCi0JcmV0dXJuIHBFbnRyeTsKLX0KLQotc3RhdGljIFZPSUQgVHBjUmVxRGVsZXRlKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCi17Ci0JUFRQQ19SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiOwotCVBUUENfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7Ci0KLQlpZihwVGFiID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcFRwY1JlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyBpZiBlbXB0eSwgcmV0dXJuCi0JaWYgKHBUYWItPlNpemUgPT0gMCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInBUcGNSZXFUYWIgZW1wdHkuXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwRW50cnkgPSBUcGNSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbik7Ci0JaWYgKHBFbnRyeSAhPSBOVUxMKQotCXsKLQkJUFRQQ19SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7Ci0JCVVMT05HIEhhc2hJZHggPSBUUENfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChwRW50cnktPkRpYWxvZ1Rva2VuKTsKLQkJUFRQQ19SRVFfRU5UUlkgcFByb2JlRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOwotCi0JCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOwotCQkvLyB1cGRhdGUgSGFzaCBsaXN0Ci0JCWRvCi0JCXsKLQkJCWlmIChwUHJvYmVFbnRyeSA9PSBwRW50cnkpCi0JCQl7Ci0JCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkKLQkJCQl7Ci0JCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPSBwRW50cnktPnBOZXh0OwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlwUHJldkVudHJ5ID0gcFByb2JlRW50cnk7Ci0JCQlwUHJvYmVFbnRyeSA9IHBQcm9iZUVudHJ5LT5wTmV4dDsKLQkJfSB3aGlsZSAocFByb2JlRW50cnkpOwotCi0JCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKFRQQ19SRVFfRU5UUlkpKTsKLQkJcFRhYi0+U2l6ZS0tOwotCi0JCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7Ci0JfQotCi0JcmV0dXJuOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUdldCBDdXJyZW50IFRpbWVTIHRhbXAuCi0KLQlQYXJhbWV0cnM6Ci0KLQlSZXR1cm4JOiBDdXJyZW50IFRpbWUgU3RhbXAuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotc3RhdGljIFVJTlQ2NCBHZXRDdXJyZW50VGltZVN0YW1wKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCS8vIGdldCBjdXJyZW50IHRpbWUgc3RhbXAuCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJR2V0IEN1cnJlbnQgVHJhbnNtaXQgUG93ZXIuCi0KLQlQYXJhbWV0cnM6Ci0KLQlSZXR1cm4JOiBDdXJyZW50IFRpbWUgU3RhbXAuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotc3RhdGljIFVJTlQ4IEdldEN1clR4UHdyKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVJTlQ4IFdjaWQpCi17Ci0JcmV0dXJuIDE2OyAvKiAxNiBkQm0gKi8KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlHZXQgQ3VycmVudCBUcmFuc21pdCBQb3dlci4KLQotCVBhcmFtZXRyczoKLQotCVJldHVybgk6IEN1cnJlbnQgVGltZSBTdGFtcC4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEluc2VydENoYW5uZWxSZXBJRSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbiwKLQlJTiBQU1RSSU5HIHBDb3VudHJ5LAotCUlOIFVJTlQ4IFJlZ3VsYXRvcnlDbGFzcykKLXsKLQlVTE9ORyBUZW1wTGVuOwotCVVJTlQ4IExlbjsKLQlVSU5UOCBJRUlkID0gSUVfQVBfQ0hBTk5FTF9SRVBPUlQ7Ci0JUFVDSEFSIHBDaExpc3RQdHIgPSBOVUxMOwotCi0JTGVuID0gMTsKLQlpZiAoc3RybmNtcChwQ291bnRyeSwgIlVTIiwgMikgPT0gMCkKLQl7Ci0JCWlmIChSZWd1bGF0b3J5Q2xhc3MgPj0gVVNBX1JFR1VMQVRPUllfSU5GT19TSVpFKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogVVNBIFVua25vdyBSZXF1bGF0b3J5IGNsYXNzICglZClcbiIsCi0JCQkJCQlfX0ZVTkNUSU9OX18sIFJlZ3VsYXRvcnlDbGFzcykpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGVuICs9IFVTQVJlZ3VsYXRvcnlJbmZvW1JlZ3VsYXRvcnlDbGFzc10uQ2hhbm5lbFNldC5OdW1iZXJPZkNoYW5uZWxzOwotCQlwQ2hMaXN0UHRyID0gVVNBUmVndWxhdG9yeUluZm9bUmVndWxhdG9yeUNsYXNzXS5DaGFubmVsU2V0LkNoYW5uZWxMaXN0OwotCX0KLQllbHNlIGlmIChzdHJuY21wKHBDb3VudHJ5LCAiSlAiLCAyKSA9PSAwKQotCXsKLQkJaWYgKFJlZ3VsYXRvcnlDbGFzcyA+PSBKUF9SRUdVTEFUT1JZX0lORk9fU0laRSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IEpQIFVua25vdyBSZXF1bGF0b3J5IGNsYXNzICglZClcbiIsCi0JCQkJCQlfX0ZVTkNUSU9OX18sIFJlZ3VsYXRvcnlDbGFzcykpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGVuICs9IEphcGFuUmVndWxhdG9yeUluZm9bUmVndWxhdG9yeUNsYXNzXS5DaGFubmVsU2V0Lk51bWJlck9mQ2hhbm5lbHM7Ci0JCXBDaExpc3RQdHIgPSBKYXBhblJlZ3VsYXRvcnlJbmZvW1JlZ3VsYXRvcnlDbGFzc10uQ2hhbm5lbFNldC5DaGFubmVsTGlzdDsKLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IFVua25vdyBDb3VudHJ5ICglcylcbiIsCi0JCQkJCV9fRlVOQ1RJT05fXywgcENvdW50cnkpKTsKLQkJcmV0dXJuOwotCX0KLQotCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJJlRlbXBMZW4sCi0JCQkJCTEsCQkJCSZJRUlkLAotCQkJCQkxLAkJCQkmTGVuLAotCQkJCQkxLAkJCQkmUmVndWxhdG9yeUNsYXNzLAotCQkJCQlMZW4gLTEsCQkJcENoTGlzdFB0ciwKLQkJCQkJRU5EX09GX0FSR1MpOwotCi0JKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOwotCi0JcmV0dXJuOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUluc2VydCBEaWFsb2cgVG9rZW4gaW50byBmcmFtZS4KLQotCVBhcmFtZXRyczoKLQkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCi0JCTIuIGZyYW1lIGxlbmd0aC4KLQkJMy4gRGlhbG9nIHRva2VuLgotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEluc2VydERpYWxvZ1Rva2VuKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAotCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAotCUlOIFVJTlQ4IERpYWxvZ1Rva2VuKQotewotCVVMT05HIFRlbXBMZW47Ci0JTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLAkmVGVtcExlbiwKLQkJCQkJMSwJCQkJJkRpYWxvZ1Rva2VuLAotCQkJCQlFTkRfT0ZfQVJHUyk7Ci0KLQkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47Ci0KLQlyZXR1cm47Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJSW5zZXJ0IFRQQyBSZXF1ZXN0IElFIGludG8gZnJhbWUuCi0KLQlQYXJhbWV0cnM6Ci0JCTEuIGZyYW1lIGJ1ZmZlciBwb2ludGVyLgotCQkyLiBmcmFtZSBsZW5ndGguCi0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLSBzdGF0aWMgVk9JRCBJbnNlcnRUcGNSZXFJRSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbikKLXsKLQlVTE9ORyBUZW1wTGVuOwotCVVMT05HIExlbiA9IDA7Ci0JVUlOVDggRWxlbWVudElEID0gSUVfVFBDX1JFUVVFU1Q7Ci0KLQlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCQkJCQkmVGVtcExlbiwKLQkJCQkJCTEsCQkJCQkJCSZFbGVtZW50SUQsCi0JCQkJCQkxLAkJCQkJCQkmTGVuLAotCQkJCQkJRU5EX09GX0FSR1MpOwotCi0JKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOwotCi0JcmV0dXJuOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUluc2VydCBUUEMgUmVwb3J0IElFIGludG8gZnJhbWUuCi0KLQlQYXJhbWV0cnM6Ci0JCTEuIGZyYW1lIGJ1ZmZlciBwb2ludGVyLgotCQkyLiBmcmFtZSBsZW5ndGguCi0JCTMuIFRyYW5zbWl0IFBvd2VyLgotCQk0LiBMaW5rIE1hcmdpbi4KLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBJbnNlcnRUcGNSZXBvcnRJRSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbiwKLQlJTiBVSU5UOCBUeFB3ciwKLQlJTiBVSU5UOCBMaW5rTWFyZ2luKQotewotCVVMT05HIFRlbXBMZW47Ci0JVUxPTkcgTGVuID0gc2l6ZW9mKFRQQ19SRVBPUlRfSU5GTyk7Ci0JVUlOVDggRWxlbWVudElEID0gSUVfVFBDX1JFUE9SVDsKLQlUUENfUkVQT1JUX0lORk8gVHBjUmVwb3J0SUU7Ci0KLQlUcGNSZXBvcnRJRS5UeFB3ciA9IFR4UHdyOwotCVRwY1JlcG9ydElFLkxpbmtNYXJnaW4gPSBMaW5rTWFyZ2luOwotCi0JTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLAkJCQkJJlRlbXBMZW4sCi0JCQkJCQkxLAkJCQkJCQkmRWxlbWVudElELAotCQkJCQkJMSwJCQkJCQkJJkxlbiwKLQkJCQkJCUxlbiwJCQkJCQkmVHBjUmVwb3J0SUUsCi0JCQkJCQlFTkRfT0ZfQVJHUyk7Ci0KLQkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47Ci0KLQotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlJbnNlcnQgQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IElFIGludG8gZnJhbWUuCi0KLQlQYXJhbWV0cnM6Ci0JCTEuIGZyYW1lIGJ1ZmZlciBwb2ludGVyLgotCQkyLiBmcmFtZSBsZW5ndGguCi0JCTMuIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBtb2RlLgotCQk0LiBuZXcgc2VsZWN0ZWQgY2hhbm5lbC4KLQkJNS4gY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IGNvdW50LgotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1zdGF0aWMgVk9JRCBJbnNlcnRDaFN3QW5uSUUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCi0JT1VUIFBVTE9ORyBwRnJhbWVMZW4sCi0JSU4gVUlOVDggQ2hTd01vZGUsCi0JSU4gVUlOVDggTmV3Q2hhbm5lbCwKLQlJTiBVSU5UOCBDaFN3Q250KQotewotCVVMT05HIFRlbXBMZW47Ci0JVUxPTkcgTGVuID0gc2l6ZW9mKENIX1NXX0FOTl9JTkZPKTsKLQlVSU5UOCBFbGVtZW50SUQgPSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQ7Ci0JQ0hfU1dfQU5OX0lORk8gQ2hTd0FubklFOwotCi0JQ2hTd0FubklFLkNoU3dNb2RlID0gQ2hTd01vZGU7Ci0JQ2hTd0FubklFLkNoYW5uZWwgPSBOZXdDaGFubmVsOwotCUNoU3dBbm5JRS5DaFN3Q250ID0gQ2hTd0NudDsKLQotCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJCQkJJlRlbXBMZW4sCi0JCQkJCQkxLAkJCQkJCSZFbGVtZW50SUQsCi0JCQkJCQkxLAkJCQkJCSZMZW4sCi0JCQkJCQlMZW4sCQkJCQkmQ2hTd0FubklFLAotCQkJCQkJRU5EX09GX0FSR1MpOwotCi0JKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOwotCi0KLQlyZXR1cm47Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJSW5zZXJ0IE1lYXN1cmUgUmVxdWVzdCBJRSBpbnRvIGZyYW1lLgotCi0JUGFyYW1ldHJzOgotCQkxLiBmcmFtZSBidWZmZXIgcG9pbnRlci4KLQkJMi4gZnJhbWUgbGVuZ3RoLgotCQkzLiBNZWFzdXJlIFRva2VuLgotCQk0LiBNZWFzdXJlIFJlcXVlc3QgTW9kZS4KLQkJNS4gTWVhc3VyZSBSZXF1ZXN0IFR5cGUuCi0JCTYuIE1lYXN1cmUgQ2hhbm5lbC4KLQkJNy4gTWVhc3VyZSBTdGFydCB0aW1lLgotCQk4LiBNZWFzdXJlIER1cmF0aW9uLgotCi0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLXN0YXRpYyBWT0lEIEluc2VydE1lYXN1cmVSZXFJRSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbiwKLQlJTiBVSU5UOCBMZW4sCi0JSU4gUE1FQVNVUkVfUkVRX0lORk8gcE1lYXN1cmVSZXFJRSkKLXsKLQlVTE9ORyBUZW1wTGVuOwotCVVJTlQ4IEVsZW1lbnRJRCA9IElFX01FQVNVUkVNRU5UX1JFUVVFU1Q7Ci0KLQlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCQkJCQkmVGVtcExlbiwKLQkJCQkJCTEsCQkJCQkJCSZFbGVtZW50SUQsCi0JCQkJCQkxLAkJCQkJCQkmTGVuLAotCQkJCQkJc2l6ZW9mKE1FQVNVUkVfUkVRX0lORk8pLAlwTWVhc3VyZVJlcUlFLAotCQkJCQkJRU5EX09GX0FSR1MpOwotCi0JKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOwotCi0JcmV0dXJuOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUluc2VydCBNZWFzdXJlIFJlcG9ydCBJRSBpbnRvIGZyYW1lLgotCi0JUGFyYW1ldHJzOgotCQkxLiBmcmFtZSBidWZmZXIgcG9pbnRlci4KLQkJMi4gZnJhbWUgbGVuZ3RoLgotCQkzLiBNZWFzdXJlIFRva2VuLgotCQk0LiBNZWFzdXJlIFJlcXVlc3QgTW9kZS4KLQkJNS4gTWVhc3VyZSBSZXF1ZXN0IFR5cGUuCi0JCTYuIExlbmd0aCBvZiBSZXBvcnQgSW5mb21hdGlvbgotCQk3LiBQb2ludGVyIG9mIFJlcG9ydCBJbmZvbWF0aW9uIEJ1ZmZlci4KLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotc3RhdGljIFZPSUQgSW5zZXJ0TWVhc3VyZVJlcG9ydElFKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAotCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAotCUlOIFBNRUFTVVJFX1JFUE9SVF9JTkZPIHBNZWFzdXJlUmVwb3J0SUUsCi0JSU4gVUlOVDggUmVwb3J0TG5mb0xlbiwKLQlJTiBQVUlOVDggcFJlcG9ydEluZm8pCi17Ci0JVUxPTkcgVGVtcExlbjsKLQlVTE9ORyBMZW47Ci0JVUlOVDggRWxlbWVudElEID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOwotCi0JTGVuID0gc2l6ZW9mKE1FQVNVUkVfUkVQT1JUX0lORk8pICsgUmVwb3J0TG5mb0xlbjsKLQotCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJCQkJCSZUZW1wTGVuLAotCQkJCQkJMSwJCQkJCQkJJkVsZW1lbnRJRCwKLQkJCQkJCTEsCQkJCQkJCSZMZW4sCi0JCQkJCQlMZW4sCQkJCQkJcE1lYXN1cmVSZXBvcnRJRSwKLQkJCQkJCUVORF9PRl9BUkdTKTsKLQotCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKLQotCWlmICgoUmVwb3J0TG5mb0xlbiA+IDApICYmIChwUmVwb3J0SW5mbyAhPSBOVUxMKSkKLQl7Ci0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiArICpwRnJhbWVMZW4sCQkmVGVtcExlbiwKLQkJCQkJCQlSZXBvcnRMbmZvTGVuLAkJCQlwUmVwb3J0SW5mbywKLQkJCQkJCQlFTkRfT0ZfQVJHUyk7Ci0KLQkJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOwotCX0KLQlyZXR1cm47Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJUHJlcGFyZSBNZWFzdXJlbWVudCByZXF1ZXN0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCi0JCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCi0KLQlQYXJhbWV0cnM6Ci0JCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCi0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgTWFrZU1lYXN1cmVtZW50UmVxRnJhbWUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JT1VUIFBVQ0hBUiBwT3V0QnVmZmVyLAotCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAotCUlOIFVJTlQ4IFRvdGFsTGVuLAotCUlOIFVJTlQ4IENhdGVnb3J5LAotCUlOIFVJTlQ4IEFjdGlvbiwKLQlJTiBVSU5UOCBNZWFzdXJlVG9rZW4sCi0JSU4gVUlOVDggTWVhc3VyZVJlcU1vZGUsCi0JSU4gVUlOVDggTWVhc3VyZVJlcVR5cGUsCi0JSU4gVUlOVDggTnVtT2ZSZXBldGl0aW9ucykKLXsKLQlVTE9ORyBUZW1wTGVuOwotCU1FQVNVUkVfUkVRX0lORk8gTWVhc3VyZVJlcUlFOwotCi0JSW5zZXJ0QWN0RmllbGQocEFkLCAocE91dEJ1ZmZlciArICpwRnJhbWVMZW4pLCBwRnJhbWVMZW4sIENhdGVnb3J5LCBBY3Rpb24pOwotCi0JLy8gZmlsbCBEaWFsb2cgVG9rZW4KLQlJbnNlcnREaWFsb2dUb2tlbihwQWQsIChwT3V0QnVmZmVyICsgKnBGcmFtZUxlbiksIHBGcmFtZUxlbiwgTWVhc3VyZVRva2VuKTsKLQotCS8qIGZpbGwgTnVtYmVyIG9mIHJlcGV0aXRpb25zLiAqLwotCWlmIChDYXRlZ29yeSA9PSBDQVRFR09SWV9STSkKLQl7Ci0JCU1ha2VPdXRnb2luZ0ZyYW1lKChwT3V0QnVmZmVyKypwRnJhbWVMZW4pLAkmVGVtcExlbiwKLQkJCQkJCTIsCQkJCQkJCSZOdW1PZlJlcGV0aXRpb25zLAotCQkJCQkJRU5EX09GX0FSR1MpOwotCi0JCSpwRnJhbWVMZW4gKz0gVGVtcExlbjsKLQl9Ci0KLQkvLyBwcmVwYXJlIE1lYXN1cmVtZW50IElFLgotCU5kaXNaZXJvTWVtb3J5KCZNZWFzdXJlUmVxSUUsIHNpemVvZihNRUFTVVJFX1JFUV9JTkZPKSk7Ci0JTWVhc3VyZVJlcUlFLlRva2VuID0gTWVhc3VyZVRva2VuOwotCU1lYXN1cmVSZXFJRS5SZXFNb2RlLndvcmQgPSBNZWFzdXJlUmVxTW9kZTsKLQlNZWFzdXJlUmVxSUUuUmVxVHlwZSA9IE1lYXN1cmVSZXFUeXBlOwotCUluc2VydE1lYXN1cmVSZXFJRShwQWQsIChwT3V0QnVmZmVyKypwRnJhbWVMZW4pLCBwRnJhbWVMZW4sCi0JCVRvdGFsTGVuLCAmTWVhc3VyZVJlcUlFKTsKLQotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlQcmVwYXJlIE1lYXN1cmVtZW50IHJlcG9ydCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bwotCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgotCi0JUGFyYW1ldHJzOgotCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEVucXVldWVNZWFzdXJlbWVudFJlcCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcERBLAotCUlOIFVJTlQ4IERpYWxvZ1Rva2VuLAotCUlOIFVJTlQ4IE1lYXN1cmVUb2tlbiwKLQlJTiBVSU5UOCBNZWFzdXJlUmVxTW9kZSwKLQlJTiBVSU5UOCBNZWFzdXJlUmVxVHlwZSwKLQlJTiBVSU5UOCBSZXBvcnRJbmZvTGVuLAotCUlOIFBVSU5UOCBwUmVwb3J0SW5mbykKLXsKLQlQVUNIQVIgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JTkRJU19TVEFUVVMgTlN0YXR1czsKLQlVTE9ORyBGcmFtZUxlbjsKLQlIRUFERVJfODAyXzExIEFjdEhkcjsKLQlNRUFTVVJFX1JFUE9SVF9JTkZPIE1lYXN1cmVSZXBJRTsKLQotCS8vIGJ1aWxkIGFjdGlvbiBmcmFtZSBoZWFkZXIuCi0JTWd0TWFjSGVhZGVySW5pdChwQWQsICZBY3RIZHIsIFNVQlRZUEVfQUNUSU9OLCAwLCBwREEsCi0JCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzKTsKLQotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm47Ci0JfQotCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChQQ0hBUikmQWN0SGRyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCUZyYW1lTGVuID0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOwotCi0JSW5zZXJ0QWN0RmllbGQocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBDQVRFR09SWV9TUEVDVFJVTSwgU1BFQ19NUlApOwotCi0JLy8gZmlsbCBEaWFsb2cgVG9rZW4KLQlJbnNlcnREaWFsb2dUb2tlbihwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIERpYWxvZ1Rva2VuKTsKLQotCS8vIHByZXBhcmUgTWVhc3VyZW1lbnQgSUUuCi0JTmRpc1plcm9NZW1vcnkoJk1lYXN1cmVSZXBJRSwgc2l6ZW9mKE1FQVNVUkVfUkVQT1JUX0lORk8pKTsKLQlNZWFzdXJlUmVwSUUuVG9rZW4gPSBNZWFzdXJlVG9rZW47Ci0JTWVhc3VyZVJlcElFLlJlcG9ydE1vZGUgPSBNZWFzdXJlUmVxTW9kZTsKLQlNZWFzdXJlUmVwSUUuUmVwb3J0VHlwZSA9IE1lYXN1cmVSZXFUeXBlOwotCUluc2VydE1lYXN1cmVSZXBvcnRJRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sICZNZWFzdXJlUmVwSUUsIFJlcG9ydEluZm9MZW4sIHBSZXBvcnRJbmZvKTsKLQotCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlQcmVwYXJlIFRQQyBSZXF1ZXN0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCi0JCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCi0KLQlQYXJhbWV0cnM6Ci0JCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCi0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgRW5xdWV1ZVRQQ1JlcSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcERBLAotCUlOIFVDSEFSIERpYWxvZ1Rva2VuKQotewotCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyBOU3RhdHVzOwotCVVMT05HIEZyYW1lTGVuOwotCi0JSEVBREVSXzgwMl8xMSBBY3RIZHI7Ci0KLQkvLyBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLgotCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQWN0SGRyLCBTVUJUWVBFX0FDVElPTiwgMCwgcERBLAotCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci0KLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJcmV0dXJuOwotCX0KLQlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoUENIQVIpJkFjdEhkciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLQlGcmFtZUxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKLQotCUluc2VydEFjdEZpZWxkKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ0FURUdPUllfU1BFQ1RSVU0sIFNQRUNfVFBDUlEpOwotCi0JLy8gZmlsbCBEaWFsb2cgVG9rZW4KLQlJbnNlcnREaWFsb2dUb2tlbihwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIERpYWxvZ1Rva2VuKTsKLQotCS8vIEluc2VydCBUUEMgUmVxdWVzdCBJRS4KLQlJbnNlcnRUcGNSZXFJRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4pOwotCi0JTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCi0JcmV0dXJuOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVByZXBhcmUgVFBDIFJlcG9ydCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bwotCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgotCi0JUGFyYW1ldHJzOgotCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEVucXVldWVUUENSZXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBVSU5UOCBEaWFsb2dUb2tlbiwKLQlJTiBVSU5UOCBUeFB3ciwKLQlJTiBVSU5UOCBMaW5rTWFyZ2luKQotewotCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyBOU3RhdHVzOwotCVVMT05HIEZyYW1lTGVuOwotCi0JSEVBREVSXzgwMl8xMSBBY3RIZHI7Ci0KLQkvLyBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLgotCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQWN0SGRyLCBTVUJUWVBFX0FDVElPTiwgMCwgcERBLAotCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci0KLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJcmV0dXJuOwotCX0KLQlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoUENIQVIpJkFjdEhkciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLQlGcmFtZUxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKLQotCUluc2VydEFjdEZpZWxkKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ0FURUdPUllfU1BFQ1RSVU0sIFNQRUNfVFBDUlApOwotCi0JLy8gZmlsbCBEaWFsb2cgVG9rZW4KLQlJbnNlcnREaWFsb2dUb2tlbihwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIERpYWxvZ1Rva2VuKTsKLQotCS8vIEluc2VydCBUUEMgUmVxdWVzdCBJRS4KLQlJbnNlcnRUcGNSZXBvcnRJRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIFR4UHdyLCBMaW5rTWFyZ2luKTsKLQotCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlQcmVwYXJlIENoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bwotCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgotCi0JUGFyYW1ldHJzOgotCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgotCQkyLiBDaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgbW9kZS4KLQkJMi4gYSBOZXcgc2VsZWN0ZWQgY2hhbm5lbC4KLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBFbnF1ZXVlQ2hTd0FubigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcERBLAotCUlOIFVJTlQ4IENoU3dNb2RlLAotCUlOIFVJTlQ4IE5ld0NoKQotewotCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyBOU3RhdHVzOwotCVVMT05HIEZyYW1lTGVuOwotCi0JSEVBREVSXzgwMl8xMSBBY3RIZHI7Ci0KLQkvLyBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLgotCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQWN0SGRyLCBTVUJUWVBFX0FDVElPTiwgMCwgcERBLAotCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci0KLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJcmV0dXJuOwotCX0KLQlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoUENIQVIpJkFjdEhkciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLQlGcmFtZUxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKLQotCUluc2VydEFjdEZpZWxkKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ0FURUdPUllfU1BFQ1RSVU0sIFNQRUNfQ0hBTk5FTF9TV0lUQ0gpOwotCi0JSW5zZXJ0Q2hTd0FubklFKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ2hTd01vZGUsIE5ld0NoLCAwKTsKLQotCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIEJPT0xFQU4gRGZzUmVxdWlyZW1lbnRDaGVjaygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVSU5UOCBDaGFubmVsKQotewotCUJPT0xFQU4gUmVzdWx0ID0gRkFMU0U7Ci0JSU5UIGk7Ci0KLQlkbwotCXsKLQkJLy8gY2hlY2sgREZTIHByb2NlZHVyZSBpcyBydW5uaW5nLgotCQkvLyBtYWtlIHN1cmUgREZTIHByb2NlZHVyZSB3b24ndCBzdGFydCB0d2ljZS4KLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkKLQkJewotCQkJUmVzdWx0ID0gRkFMU0U7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8vIGNoZWNrIHRoZSBuZXcgY2hhbm5lbCBjYXJyaWVkIGZyb20gQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtbmV0IGlzIHZhbGlkLgotCQlmb3IgKGk9MDsgaTxwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspCi0JCXsKLQkJCWlmICgoQ2hhbm5lbCA9PSBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwpCi0JCQkJJiYocEFkLT5DaGFubmVsTGlzdFtpXS5SZW1haW5pbmdUaW1lRm9yVXNlID09IDApKQotCQkJewotCQkJCS8vIGZvdW5kIHJhZGFyIHNpZ25hbCBpbiB0aGUgY2hhbm5lbC4gdGhlIGNoYW5uZWwgY2FuJ3QgdXNlIGF0IGxlYXN0IGZvciAzMCBtaW51dGVzLgotCQkJCXBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSA9IDE4MDA7Ly8zMCBtaW4gPSAxODAwIHNlYwotCQkJCVJlc3VsdCA9IFRSVUU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9IHdoaWxlKEZBTFNFKTsKLQotCXJldHVybiBSZXN1bHQ7Ci19Ci0KLVZPSUQgTm90aWZ5Q2hTd0FublRvUGVlckFQcygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcFJBLAotCUlOIFBVQ0hBUiBwVEEsCi0JSU4gVUlOVDggQ2hTd01vZGUsCi0JSU4gVUlOVDggQ2hhbm5lbCkKLXsKLSNpZmRlZiBXRFNfU1VQUE9SVAotCWlmICghKChwUkFbMF0gJiAweGZmKSA9PSAweGZmKSkgLy8gaXMgcFJBIGEgYnJvYWRjYXNlIGFkZHJlc3MuCi0JewotCQlJTlQgaTsKLQkJLy8gaW5mbyBuZWlnaGJvciBBUHMgdGhhdCBSYWRhciBzaWduYWwgZm91bmQgdGhyb2doIFdEUyBsaW5rLgotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1dEU19FTlRSWTsgaSsrKQotCQl7Ci0JCQlpZiAoVmFsaWRXZHNFbnRyeShwQWQsIGkpKQotCQkJewotCQkJCVBVQ0hBUiBwREEgPSBwQWQtPldkc1RhYi5XZHNFbnRyeVtpXS5QZWVyV2RzQWRkcjsKLQotCQkJCS8vIERBIGVxdWFsIHRvIFNBLiBoYXZlIG5vIG5lY2Vzc2FyeSBvcmlnbmFsIEFQIHdoaWNoIGZvdW5kIFJhZGFyIHNpZ25hbC4KLQkJCQlpZiAoTUFDX0FERFJfRVFVQUwocFRBLCBwREEpKQotCQkJCQljb250aW51ZTsKLQotCQkJCS8vIHNlbmQgQ2hhbm5lbCBTd2l0Y2ggQWN0aW9uIGZyYW1lIHRvIGluZm8gTmVpZ2hicm8gQVBzLgotCQkJCUVucXVldWVDaFN3QW5uKHBBZCwgcERBLCBDaFN3TW9kZSwgQ2hhbm5lbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gV0RTX1NVUFBPUlQgLy8KLX0KLQotc3RhdGljIFZPSUQgU3RhcnRERlNQcm9jZWR1cmUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgQ2hhbm5lbCwKLQlJTiBVSU5UOCBDaFN3TW9kZSkKLXsKLQkvLyBzdGFydCBERlMgcHJvY2VkdXJlCi0JcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IENoYW5uZWw7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JTl9DaGFubmVsQ2hlY2socEFkKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgPSBSRF9TV0lUQ0hJTkdfTU9ERTsKLQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DU0NvdW50ID0gMDsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgYWN0aW9uIGZyYW1lIHNhbml0eSBjaGVjay4KLQotCVBhcmFtZXRyczoKLQkJMS4gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCi0JCTIuIG1lc3NhZ2UgbGVuZ3RoLgotCQkzLiBDaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgaW5mb21hdGlvbiBidWZmZXIuCi0KLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotCi0vKgotICBDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgSUUuCi0gICstLS0tKy0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsKLSAgfCBJRCB8IExlbiB8Q2ggU3cgTW9kZSB8IE5ldyBDaCBOdW0gfCBDaCBTdyBDbnQgfAotICArLS0tLSstLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCi0gICAgMSAgICAxICAgICAgICAxICAgICAgICAgICAxICAgICAgICAgICAgMQotKi8KLXN0YXRpYyBCT09MRUFOIFBlZXJDaFN3QW5uU2FuaXR5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFZPSUQgKnBNc2csCi0JSU4gVUxPTkcgTXNnTGVuLAotCU9VVCBQQ0hfU1dfQU5OX0lORk8gcENoU3dBbm5JbmZvKQotewotCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOwotCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7Ci0JQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKLQlQRUlEX1NUUlVDVCBlaWRfcHRyOwotCi0JLy8gc2tpcCA4MDIuMTEgaGVhZGVyLgotCU1zZ0xlbiAtPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7Ci0KLQkvLyBza2lwIGNhdGVnb3J5IGFuZCBhY3Rpb24gY29kZS4KLQlwRnJhbWVQdHIgKz0gMjsKLQlNc2dMZW4gLT0gMjsKLQotCWlmIChwQ2hTd0FubkluZm8gPT0gTlVMTCkKLQkJcmV0dXJuIHJlc3VsdDsKLQotCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpcEZyYW1lUHRyOwotCXdoaWxlICgoKFVDSEFSKillaWRfcHRyICsgZWlkX3B0ci0+TGVuICsgMSkgPCAoKFBVQ0hBUilwRnJhbWVQdHIgKyBNc2dMZW4pKQotCXsKLQkJc3dpdGNoKGVpZF9wdHItPkVpZCkKLQkJewotCQkJY2FzZSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQ6Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBDaFN3QW5uSW5mby0+Q2hTd01vZGUsIGVpZF9wdHItPk9jdGV0LCAxKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcENoU3dBbm5JbmZvLT5DaGFubmVsLCBlaWRfcHRyLT5PY3RldCArIDEsIDEpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQ2hTd0FubkluZm8tPkNoU3dDbnQsIGVpZF9wdHItPk9jdGV0ICsgMiwgMSk7Ci0KLQkJCQlyZXN1bHQgPSBUUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQl9Ci0JCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOwotCX0KLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJTWVhc3VyZW1lbnQgcmVxdWVzdCBhY3Rpb24gZnJhbWUgc2FuaXR5IGNoZWNrLgotCi0JUGFyYW1ldHJzOgotCQkxLiBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKLQkJMi4gbWVzc2FnZSBsZW5ndGguCi0JCTMuIE1lYXN1cmVtZW50IHJlcXVlc3QgaW5mb21hdGlvbiBidWZmZXIuCi0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLXN0YXRpYyBCT09MRUFOIFBlZXJNZWFzdXJlUmVxU2FuaXR5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFZPSUQgKnBNc2csCi0JSU4gVUxPTkcgTXNnTGVuLAotCU9VVCBQVUlOVDggcERpYWxvZ1Rva2VuLAotCU9VVCBQTUVBU1VSRV9SRVFfSU5GTyBwTWVhc3VyZVJlcUluZm8sCi0JT1VUIFBNRUFTVVJFX1JFUSBwTWVhc3VyZVJlcSkKLXsKLQlQRlJBTUVfODAyXzExIEZyID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKLQlQVUNIQVIgcEZyYW1lUHRyID0gRnItPk9jdGV0OwotCUJPT0xFQU4gcmVzdWx0ID0gRkFMU0U7Ci0JUEVJRF9TVFJVQ1QgZWlkX3B0cjsKLQlQVUNIQVIgcHRyOwotCVVJTlQ2NCBNZWFzdXJlU3RhcnRUaW1lOwotCVVJTlQxNiBNZWFzdXJlRHVyYXRpb247Ci0KLQkvLyBza2lwIDgwMi4xMSBoZWFkZXIuCi0JTXNnTGVuIC09IHNpemVvZihIRUFERVJfODAyXzExKTsKLQotCS8vIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgotCXBGcmFtZVB0ciArPSAyOwotCU1zZ0xlbiAtPSAyOwotCi0JaWYgKHBNZWFzdXJlUmVxSW5mbyA9PSBOVUxMKQotCQlyZXR1cm4gcmVzdWx0OwotCi0JTmRpc01vdmVNZW1vcnkocERpYWxvZ1Rva2VuLCBwRnJhbWVQdHIsIDEpOwotCXBGcmFtZVB0ciArPSAxOwotCU1zZ0xlbiAtPSAxOwotCi0JZWlkX3B0ciA9IChQRUlEX1NUUlVDVClwRnJhbWVQdHI7Ci0Jd2hpbGUgKCgoVUNIQVIqKWVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8ICgoUFVDSEFSKXBGcmFtZVB0ciArIE1zZ0xlbikpCi0JewotCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQotCQl7Ci0JCQljYXNlIElFX01FQVNVUkVNRU5UX1JFUVVFU1Q6Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVxSW5mby0+VG9rZW4sIGVpZF9wdHItPk9jdGV0LCAxKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXFJbmZvLT5SZXFNb2RlLndvcmQsIGVpZF9wdHItPk9jdGV0ICsgMSwgMSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVxSW5mby0+UmVxVHlwZSwgZWlkX3B0ci0+T2N0ZXQgKyAyLCAxKTsKLQkJCQlwdHIgPSAoUFVDSEFSKShlaWRfcHRyLT5PY3RldCArIDMpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcS0+Q2hOdW0sIHB0ciwgMSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJk1lYXN1cmVTdGFydFRpbWUsIHB0ciArIDEsIDgpOwotCQkJCXBNZWFzdXJlUmVxLT5NZWFzdXJlU3RhcnRUaW1lID0gU1dBUDY0KE1lYXN1cmVTdGFydFRpbWUpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZNZWFzdXJlRHVyYXRpb24sIHB0ciArIDksIDIpOwotCQkJCXBNZWFzdXJlUmVxLT5NZWFzdXJlRHVyYXRpb24gPSBTV0FQMTYoTWVhc3VyZUR1cmF0aW9uKTsKLQotCQkJCXJlc3VsdCA9IFRSVUU7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7Ci0JfQotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlNZWFzdXJlbWVudCByZXBvcnQgYWN0aW9uIGZyYW1lIHNhbml0eSBjaGVjay4KLQotCVBhcmFtZXRyczoKLQkJMS4gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCi0JCTIuIG1lc3NhZ2UgbGVuZ3RoLgotCQkzLiBNZWFzdXJlbWVudCByZXBvcnQgaW5mb21hdGlvbiBidWZmZXIuCi0JCTQuIGJhc2ljIHJlcG9ydCBpbmZvbWF0aW9uIGJ1ZmZlci4KLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotCi0vKgotICBNZWFzdXJlbWVudCBSZXBvcnQgSUUuCi0gICstLS0tKy0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwotICB8IElEIHwgTGVuIHwgVG9rZW4gfCBSZXBvcnQgTW9kZSB8IE1lYXN1cmUgVHlwZSB8IE1lYXN1cmUgUmVwb3J0IHwKLSAgKy0tLS0rLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCi0gICAgMSAgICAgMSAgICAgIDEgICAgICAgICAgMSAgICAgICAgICAgICAxICAgICAgICAgICAgdmFyaWFibGUKLQotICBCYXNpYyBSZXBvcnQuCi0gICstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLSsKLSAgfCBDaCBOdW0gfCBTdGFydCBUaW1lIHwgRHVyYXRpb24gfCBNYXAgfAotICArLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0rCi0gICAgICAxICAgICAgICAgIDggICAgICAgICAgIDIgICAgICAgIDEKLQotICBNYXAgRmllbGQgQml0IEZvcm1hdC4KLSAgKy0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKLSAgfCBCc3MgfCBPRkRNIFByZWFtYmxlIHwgVW5pZGVudGlmaWVkIHNpZ25hbCB8IFJhZGFyIHwgVW5tZWFzdXJlZCB8IFJlc2VydmVkIHwKLSAgKy0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKLSAgICAgMCAgICAgICAgICAxICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgMyAgICAgICAgIDQgICAgICAgICAgNS03Ci0qLwotc3RhdGljIEJPT0xFQU4gUGVlck1lYXN1cmVSZXBvcnRTYW5pdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVk9JRCAqcE1zZywKLQlJTiBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVSU5UOCBwRGlhbG9nVG9rZW4sCi0JT1VUIFBNRUFTVVJFX1JFUE9SVF9JTkZPIHBNZWFzdXJlUmVwb3J0SW5mbywKLQlPVVQgUFVJTlQ4IHBSZXBvcnRCdWYpCi17Ci0JUEZSQU1FXzgwMl8xMSBGciA9IChQRlJBTUVfODAyXzExKXBNc2c7Ci0JUFVDSEFSIHBGcmFtZVB0ciA9IEZyLT5PY3RldDsKLQlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOwotCVBFSURfU1RSVUNUIGVpZF9wdHI7Ci0JUFVDSEFSIHB0cjsKLQotCS8vIHNraXAgODAyLjExIGhlYWRlci4KLQlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOwotCi0JLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCi0JcEZyYW1lUHRyICs9IDI7Ci0JTXNnTGVuIC09IDI7Ci0KLQlpZiAocE1lYXN1cmVSZXBvcnRJbmZvID09IE5VTEwpCi0JCXJldHVybiByZXN1bHQ7Ci0KLQlOZGlzTW92ZU1lbW9yeShwRGlhbG9nVG9rZW4sIHBGcmFtZVB0ciwgMSk7Ci0JcEZyYW1lUHRyICs9IDE7Ci0JTXNnTGVuIC09IDE7Ci0KLQllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKLQl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKLQl7Ci0JCXN3aXRjaChlaWRfcHRyLT5FaWQpCi0JCXsKLQkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfUkVQT1JUOgotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcG9ydEluZm8tPlRva2VuLCBlaWRfcHRyLT5PY3RldCwgMSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVwb3J0SW5mby0+UmVwb3J0TW9kZSwgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlLCBlaWRfcHRyLT5PY3RldCArIDIsIDEpOwotCQkJCWlmIChwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydFR5cGUgPT0gUk1fQkFTSUMpCi0JCQkJewotCQkJCQlQTUVBU1VSRV9CQVNJQ19SRVBPUlQgcFJlcG9ydCA9IChQTUVBU1VSRV9CQVNJQ19SRVBPUlQpcFJlcG9ydEJ1ZjsKLQkJCQkJcHRyID0gKFBVQ0hBUikoZWlkX3B0ci0+T2N0ZXQgKyAzKTsKLQkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPkNoTnVtLCBwdHIsIDEpOwotCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZVN0YXJ0VGltZSwgcHRyICsgMSwgOCk7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlRHVyYXRpb24sIHB0ciArIDksIDIpOwotCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWFwLCBwdHIgKyAxMSwgMSk7Ci0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAocE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlID09IFJNX0NDQSkKLQkJCQl7Ci0JCQkJCVBNRUFTVVJFX0NDQV9SRVBPUlQgcFJlcG9ydCA9IChQTUVBU1VSRV9DQ0FfUkVQT1JUKXBSZXBvcnRCdWY7Ci0JCQkJCXB0ciA9IChQVUNIQVIpKGVpZF9wdHItPk9jdGV0ICsgMyk7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5DaE51bSwgcHRyLCAxKTsKLQkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPk1lYXN1cmVTdGFydFRpbWUsIHB0ciArIDEsIDgpOwotCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZUR1cmF0aW9uLCBwdHIgKyA5LCAyKTsKLQkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPkNDQV9CdXN5X0ZyYWN0aW9uLCBwdHIgKyAxMSwgMSk7Ci0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAocE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlID09IFJNX1JQSV9ISVNUT0dSQU0pCi0JCQkJewotCQkJCQlQTUVBU1VSRV9SUElfUkVQT1JUIHBSZXBvcnQgPSAoUE1FQVNVUkVfUlBJX1JFUE9SVClwUmVwb3J0QnVmOwotCQkJCQlwdHIgPSAoUFVDSEFSKShlaWRfcHRyLT5PY3RldCArIDMpOwotCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+Q2hOdW0sIHB0ciwgMSk7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlU3RhcnRUaW1lLCBwdHIgKyAxLCA4KTsKLQkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPk1lYXN1cmVEdXJhdGlvbiwgcHRyICsgOSwgMik7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5SUElfRGVuc2l0eSwgcHRyICsgMTEsIDgpOwotCQkJCX0KLQkJCQlyZXN1bHQgPSBUUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQl9Ci0JCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOwotCX0KLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVFBDIFJlcXVlc3QgYWN0aW9uIGZyYW1lIHNhbml0eSBjaGVjay4KLQotCVBhcmFtZXRyczoKLQkJMS4gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCi0JCTIuIG1lc3NhZ2UgbGVuZ3RoLgotCQkzLiBEaWFsb2cgVG9rZW4uCi0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLXN0YXRpYyBCT09MRUFOIFBlZXJUcGNSZXFTYW5pdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVk9JRCAqcE1zZywKLQlJTiBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVSU5UOCBwRGlhbG9nVG9rZW4pCi17Ci0JUEZSQU1FXzgwMl8xMSBGciA9IChQRlJBTUVfODAyXzExKXBNc2c7Ci0JUFVDSEFSIHBGcmFtZVB0ciA9IEZyLT5PY3RldDsKLQlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOwotCVBFSURfU1RSVUNUIGVpZF9wdHI7Ci0KLQlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOwotCi0JLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCi0JcEZyYW1lUHRyICs9IDI7Ci0JTXNnTGVuIC09IDI7Ci0KLQlpZiAocERpYWxvZ1Rva2VuID09IE5VTEwpCi0JCXJldHVybiByZXN1bHQ7Ci0KLQlOZGlzTW92ZU1lbW9yeShwRGlhbG9nVG9rZW4sIHBGcmFtZVB0ciwgMSk7Ci0JcEZyYW1lUHRyICs9IDE7Ci0JTXNnTGVuIC09IDE7Ci0KLQllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKLQl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKLQl7Ci0JCXN3aXRjaChlaWRfcHRyLT5FaWQpCi0JCXsKLQkJCWNhc2UgSUVfVFBDX1JFUVVFU1Q6Ci0JCQkJcmVzdWx0ID0gVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJfQotCQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKWVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKLQl9Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVRQQyBSZXBvcnQgYWN0aW9uIGZyYW1lIHNhbml0eSBjaGVjay4KLQotCVBhcmFtZXRyczoKLQkJMS4gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCi0JCTIuIG1lc3NhZ2UgbGVuZ3RoLgotCQkzLiBEaWFsb2cgVG9rZW4uCi0JCTQuIFRQQyBSZXBvcnQgSUUuCi0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLXN0YXRpYyBCT09MRUFOIFBlZXJUcGNSZXBTYW5pdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVk9JRCAqcE1zZywKLQlJTiBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVSU5UOCBwRGlhbG9nVG9rZW4sCi0JT1VUIFBUUENfUkVQT1JUX0lORk8gcFRwY1JlcEluZm8pCi17Ci0JUEZSQU1FXzgwMl8xMSBGciA9IChQRlJBTUVfODAyXzExKXBNc2c7Ci0JUFVDSEFSIHBGcmFtZVB0ciA9IEZyLT5PY3RldDsKLQlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOwotCVBFSURfU1RSVUNUIGVpZF9wdHI7Ci0KLQlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOwotCi0JLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCi0JcEZyYW1lUHRyICs9IDI7Ci0JTXNnTGVuIC09IDI7Ci0KLQlpZiAocERpYWxvZ1Rva2VuID09IE5VTEwpCi0JCXJldHVybiByZXN1bHQ7Ci0KLQlOZGlzTW92ZU1lbW9yeShwRGlhbG9nVG9rZW4sIHBGcmFtZVB0ciwgMSk7Ci0JcEZyYW1lUHRyICs9IDE7Ci0JTXNnTGVuIC09IDE7Ci0KLQllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKLQl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKLQl7Ci0JCXN3aXRjaChlaWRfcHRyLT5FaWQpCi0JCXsKLQkJCWNhc2UgSUVfVFBDX1JFUE9SVDoKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcFRwY1JlcEluZm8tPlR4UHdyLCBlaWRfcHRyLT5PY3RldCwgMSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBUcGNSZXBJbmZvLT5MaW5rTWFyZ2luLCBlaWRfcHRyLT5PY3RldCArIDEsIDEpOwotCQkJCXJlc3VsdCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7Ci0JfQotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgYWN0aW9uIGZyYW1lIGhhbmRsZXIuCi0KLQlQYXJhbWV0cnM6Ci0JCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotc3RhdGljIFZPSUQgUGVlckNoU3dBbm5BY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCUNIX1NXX0FOTl9JTkZPIENoU3dBbm5JbmZvOwotCVBGUkFNRV84MDJfMTEgcEZyID0gKFBGUkFNRV84MDJfMTEpRWxlbS0+TXNnOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCVVDSEFSIGluZGV4ID0gMCwgQ2hhbm5lbCA9IDAsIE5ld0NoYW5uZWwgPSAwOwotCVVMT05HIEJzc2lkeCA9IDA7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlOZGlzWmVyb01lbW9yeSgmQ2hTd0FubkluZm8sIHNpemVvZihDSF9TV19BTk5fSU5GTykpOwotCWlmICghIFBlZXJDaFN3QW5uU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZDaFN3QW5uSW5mbykpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJbnZhbGlkIENoYW5uZWwgU3dpdGNoIEFjdGlvbiBGcmFtZS5cbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCi0JewotCQlCc3NpZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBwRnItPkhkci5BZGRyMywgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckNoU3dBbm5BY3Rpb24gLSBCc3NpZHggaXMgbm90IGZvdW5kXG4iKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJcbioqKipCc3NpZHggaXMgJWQsIENoYW5uZWwgPSAlZFxuIiwgaW5kZXgsIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLkNoYW5uZWwpKTsKLQkJaGV4X2R1bXAoIlNTSUQiLHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLkJzc2lkICw2KTsKLQotCQlDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKLQkJTmV3Q2hhbm5lbCA9IENoU3dBbm5JbmZvLkNoYW5uZWw7Ci0KLQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJiAoTmV3Q2hhbm5lbCAhPSAwKSAmJiAoQ2hhbm5lbCAhPSBOZXdDaGFubmVsKSkKLQkJewotCQkJLy8gU3dpdGNoaW5nIHRvIGNoYW5uZWwgMSBjYW4gcHJldmVudCBmcm9tIHJlc2Nhbm5pbmcgdGhlIGN1cnJlbnQgY2hhbm5lbCBpbW1lZGlhdGVseSAoYnkgYXV0byByZWNvbm5lY3Rpb24pLgotCQkJLy8gSW4gYWRkaXRpb24sIGNsZWFyIHRoZSBNTE1FIHF1ZXVlIGFuZCB0aGUgc2NhbiB0YWJsZSB0byBkaXNjYXJkIHRoZSBSWCBwYWNrZXRzIGFuZCBwcmV2aW91cyBzY2FubmluZyByZXN1bHRzLgotCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCAxLCBGQUxTRSk7Ci0JCQlBc2ljTG9ja0NoYW5uZWwocEFkLCAxKTsKLQkJICAgIExpbmtEb3duKHBBZCwgRkFMU0UpOwotCQkJTWxtZVF1ZXVlSW5pdCgmcEFkLT5NbG1lLlF1ZXVlKTsKLQkJCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKLQkJICAgIFJUTVB1c2VjRGVsYXkoMTAwMDAwMCk7CQkvLyB1c2UgZGVsYXkgdG8gcHJldmVudCBTVEEgZG8gcmVhc3NvYwotCi0JCQkvLyBjaGFubmVsIHNhbml0eSBjaGVjawotCQkJZm9yIChpbmRleCA9IDAgOyBpbmRleCA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGluZGV4KyspCi0JCQl7Ci0JCQkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLkNoYW5uZWwgPT0gTmV3Q2hhbm5lbCkKLQkJCQl7Ci0JCQkJCXBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLkNoYW5uZWwgPSBOZXdDaGFubmVsOwotCQkJCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gTmV3Q2hhbm5lbDsKLQkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCImJiYmJiYmJiYmJiYmJiYmUGVlckNoU3dBbm5BY3Rpb24gLSBTVEEgcmVjZWl2ZSBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgSUUgKE5ldyBDaGFubmVsID0lZClcbiIsIE5ld0NoYW5uZWwpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoaW5kZXggPj0gcEFkLT5DaGFubmVsTGlzdE51bSkKLQkJCXsKLQkJCQlEQkdQUklOVF9FUlIoKCImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJlBlZXJDaFN3QW5uQWN0aW9uKGNhbiBub3QgZmluZCBOZXcgQ2hhbm5lbD0lZCBpbiBDaGFubmVsTGlzdFslZF1cbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3ROdW0pKTsKLQkJCX0KLQkJfQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCXJldHVybjsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCU1lYXN1cmVtZW50IFJlcXVlc3QgYWN0aW9uIGZyYW1lIGhhbmRsZXIuCi0KLQlQYXJhbWV0cnM6Ci0JCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotc3RhdGljIFZPSUQgUGVlck1lYXN1cmVSZXFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVBGUkFNRV84MDJfMTEgcEZyID0gKFBGUkFNRV84MDJfMTEpRWxlbS0+TXNnOwotCVVJTlQ4IERpYWxvZ1Rva2VuOwotCU1FQVNVUkVfUkVRX0lORk8gTWVhc3VyZVJlcUluZm87Ci0JTUVBU1VSRV9SRVEJTWVhc3VyZVJlcTsKLQlNRUFTVVJFX1JFUE9SVF9NT0RFIFJlcG9ydE1vZGU7Ci0KLQlpZihQZWVyTWVhc3VyZVJlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmRGlhbG9nVG9rZW4sICZNZWFzdXJlUmVxSW5mbywgJk1lYXN1cmVSZXEpKQotCXsKLQkJUmVwb3J0TW9kZS53b3JkID0gMDsKLQkJUmVwb3J0TW9kZS5maWVsZC5JbmNhcGFibGUgPSAxOwotCQlFbnF1ZXVlTWVhc3VyZW1lbnRSZXAocEFkLCBwRnItPkhkci5BZGRyMiwgRGlhbG9nVG9rZW4sIE1lYXN1cmVSZXFJbmZvLlRva2VuLCBSZXBvcnRNb2RlLndvcmQsIE1lYXN1cmVSZXFJbmZvLlJlcVR5cGUsIDAsIE5VTEwpOwotCX0KLQotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlNZWFzdXJlbWVudCBSZXBvcnQgYWN0aW9uIGZyYW1lIGhhbmRsZXIuCi0KLQlQYXJhbWV0cnM6Ci0JCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotc3RhdGljIFZPSUQgUGVlck1lYXN1cmVSZXBvcnRBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCU1FQVNVUkVfUkVQT1JUX0lORk8gTWVhc3VyZVJlcG9ydEluZm87Ci0JUEZSQU1FXzgwMl8xMSBwRnIgPSAoUEZSQU1FXzgwMl8xMSlFbGVtLT5Nc2c7Ci0JVUlOVDggRGlhbG9nVG9rZW47Ci0JUFVJTlQ4IHBNZWFzdXJlUmVwb3J0SW5mbzsKLQotLy8JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIICE9IFRSVUUpCi0vLwkJcmV0dXJuOwotCi0JaWYgKChwTWVhc3VyZVJlcG9ydEluZm8gPSBrbWFsbG9jKHNpemVvZihNRUFTVVJFX1JQSV9SRVBPUlQpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIHVuYWJsZSB0byBhbGxvYyBtZW1vcnkgZm9yIG1lYXN1cmUgcmVwb3J0IGJ1ZmZlciAoc2l6ZT0lZCkuXG4iLCBfX0ZVTkNUSU9OX18sIHNpemVvZihNRUFTVVJFX1JQSV9SRVBPUlQpKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlOZGlzWmVyb01lbW9yeSgmTWVhc3VyZVJlcG9ydEluZm8sIHNpemVvZihNRUFTVVJFX1JFUE9SVF9JTkZPKSk7Ci0JTmRpc1plcm9NZW1vcnkocE1lYXN1cmVSZXBvcnRJbmZvLCBzaXplb2YoTUVBU1VSRV9SUElfUkVQT1JUKSk7Ci0JaWYgKFBlZXJNZWFzdXJlUmVwb3J0U2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZEaWFsb2dUb2tlbiwgJk1lYXN1cmVSZXBvcnRJbmZvLCBwTWVhc3VyZVJlcG9ydEluZm8pKQotCXsKLQkJZG8gewotCQkJUE1FQVNVUkVfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7Ci0KLQkJCS8vIE5vdCBhIGF1dG9ub21vdXMgbWVhc3VyZSByZXBvcnQuCi0JCQkvLyBjaGVjayB0aGUgZGlhbG9nIHRva2VuIGZpZWxkLiBkcm9wIGl0IGlmIHRoZSBkaWFsb2cgdG9rZW4gZG9lc24ndCBtYXRjaC4KLQkJCWlmICgoRGlhbG9nVG9rZW4gIT0gMCkKLQkJCQkmJiAoKHBFbnRyeSA9IE1lYXN1cmVSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbikpID09IE5VTEwpKQotCQkJCWJyZWFrOwotCi0JCQlpZiAocEVudHJ5ICE9IE5VTEwpCi0JCQkJTWVhc3VyZVJlcURlbGV0ZShwQWQsIHBFbnRyeS0+RGlhbG9nVG9rZW4pOwotCi0JCQlpZiAoTWVhc3VyZVJlcG9ydEluZm8uUmVwb3J0VHlwZSA9PSBSTV9CQVNJQykKLQkJCXsKLQkJCQlQTUVBU1VSRV9CQVNJQ19SRVBPUlQgcEJhc2ljUmVwb3J0ID0gKFBNRUFTVVJFX0JBU0lDX1JFUE9SVClwTWVhc3VyZVJlcG9ydEluZm87Ci0JCQkJaWYgKChwQmFzaWNSZXBvcnQtPk1hcC5maWVsZC5SYWRhcikKLQkJCQkJJiYgKERmc1JlcXVpcmVtZW50Q2hlY2socEFkLCBwQmFzaWNSZXBvcnQtPkNoTnVtKSA9PSBUUlVFKSkKLQkJCQl7Ci0JCQkJCU5vdGlmeUNoU3dBbm5Ub1BlZXJBUHMocEFkLCBwRnItPkhkci5BZGRyMSwgcEZyLT5IZHIuQWRkcjIsIDEsIHBCYXNpY1JlcG9ydC0+Q2hOdW0pOwotCQkJCQlTdGFydERGU1Byb2NlZHVyZShwQWQsIHBCYXNpY1JlcG9ydC0+Q2hOdW0sIDEpOwotCQkJCX0KLQkJCX0KLQkJfSB3aGlsZSAoRkFMU0UpOwotCX0KLQllbHNlCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkludmFsaWQgTWVhc3VyZW1lbnQgUmVwb3J0IEZyYW1lLlxuIikpOwotCi0Ja2ZyZWUocE1lYXN1cmVSZXBvcnRJbmZvKTsKLQotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlUUEMgUmVxdWVzdCBhY3Rpb24gZnJhbWUgaGFuZGxlci4KLQotCVBhcmFtZXRyczoKLQkJRWxtZSAtIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1zdGF0aWMgVk9JRCBQZWVyVHBjUmVxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlQRlJBTUVfODAyXzExIHBGciA9IChQRlJBTUVfODAyXzExKUVsZW0tPk1zZzsKLQlQVUNIQVIgcEZyYW1lUHRyID0gcEZyLT5PY3RldDsKLQlVSU5UOCBEaWFsb2dUb2tlbjsKLQlVSU5UOCBUeFB3ciA9IEdldEN1clR4UHdyKHBBZCwgRWxlbS0+V2NpZCk7Ci0JVUlOVDggTGlua01hcmdpbiA9IDA7Ci0JQ0hBUiBSZWFsUnNzaTsKLQotCS8vIGxpbmsgbWFyZ2luOiBSYXRpbyBvZiB0aGUgcmVjZWl2ZWQgc2lnbmFsIHBvd2VyIHRvIHRoZSBtaW5pbXVtIGRlc2lyZWQgYnkgdGhlIHN0YXRpb24gKFNUQSkuIFRoZQotCS8vCQkJCVNUQSBtYXkgaW5jb3Jwb3JhdGUgcmF0ZSBpbmZvcm1hdGlvbiBhbmQgY2hhbm5lbCBjb25kaXRpb25zLCBpbmNsdWRpbmcgaW50ZXJmZXJlbmNlLCBpbnRvIGl0cyBjb21wdXRhdGlvbgotCS8vCQkJCW9mIGxpbmsgbWFyZ2luLgotCi0JUmVhbFJzc2kgPSBSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMCwgUlNTSV8wKSwKLQkJCQkJCQkJQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kxLCBSU1NJXzEpLAotCQkJCQkJCQlDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTIsIFJTU0lfMikpOwotCi0JLy8gc2tpcCBDYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCi0JcEZyYW1lUHRyICs9IDI7Ci0KLQkvLyBEaWFsb2cgdG9rZW4uCi0JTmRpc01vdmVNZW1vcnkoJkRpYWxvZ1Rva2VuLCBwRnJhbWVQdHIsIDEpOwotCi0JTGlua01hcmdpbiA9IChSZWFsUnNzaSAvIE1JTl9SQ1ZfUFdSKTsKLQlpZiAoUGVlclRwY1JlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmRGlhbG9nVG9rZW4pKQotCQlFbnF1ZXVlVFBDUmVwKHBBZCwgcEZyLT5IZHIuQWRkcjIsIERpYWxvZ1Rva2VuLCBUeFB3ciwgTGlua01hcmdpbik7Ci0KLQlyZXR1cm47Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVFBDIFJlcG9ydCBhY3Rpb24gZnJhbWUgaGFuZGxlci4KLQotCVBhcmFtZXRyczoKLQkJRWxtZSAtIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1zdGF0aWMgVk9JRCBQZWVyVHBjUmVwQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVSU5UOCBEaWFsb2dUb2tlbjsKLQlUUENfUkVQT1JUX0lORk8gVHBjUmVwSW5mbzsKLQlQVFBDX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMOwotCi0JTmRpc1plcm9NZW1vcnkoJlRwY1JlcEluZm8sIHNpemVvZihUUENfUkVQT1JUX0lORk8pKTsKLQlpZiAoUGVlclRwY1JlcFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmRGlhbG9nVG9rZW4sICZUcGNSZXBJbmZvKSkKLQl7Ci0JCWlmICgocEVudHJ5ID0gVHBjUmVxTG9va1VwKHBBZCwgRGlhbG9nVG9rZW4pKSAhPSBOVUxMKQotCQl7Ci0JCQlUcGNSZXFEZWxldGUocEFkLCBwRW50cnktPkRpYWxvZ1Rva2VuKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOiBEaWFsb2dUb2tlbj0leCwgVHhQd3I9JWQsIExpbmtNYXJnaW49JWRcbiIsCi0JCQkJX19GVU5DVElPTl9fLCBEaWFsb2dUb2tlbiwgVHBjUmVwSW5mby5UeFB3ciwgVHBjUmVwSW5mby5MaW5rTWFyZ2luKSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm47Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJU3BlY3RydW4gYWN0aW9uIGZyYW1lcyBIYW5kbGVyIHN1Y2ggYXMgY2hhbm5lbCBzd2l0Y2ggYW5ub3VjZW1lbnQsCi0JCW1lYXN1cmVtZW50IHJlcG9ydCwgbWVhc3VyZW1lbnQgcmVxdWVzdCBhY3Rpb25zIGZyYW1lcy4KLQotCVBhcmFtZXRyczoKLQkJRWxtZSAtIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFBlZXJTcGVjdHJ1bUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0KLQlVQ0hBUglBY3Rpb24gPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsxXTsKLQotCWlmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCAhPSBUUlVFKQotCQlyZXR1cm47Ci0KLQlzd2l0Y2goQWN0aW9uKQotCXsKLQkJY2FzZSBTUEVDX01SUToKLQkJCS8vIGN1cnJlbnQgcnQyODYwIHVuYWJsZSBkbyBzdWNoIG1lYXN1cmUgc3BlY2lmaWVkIGluIE1lYXN1cmVtZW50IFJlcXVlc3QuCi0JCQkvLyByZWplY3QgYWxsIG1lYXN1cmVtZW50IHJlcXVlc3QuCi0JCQlQZWVyTWVhc3VyZVJlcUFjdGlvbihwQWQsIEVsZW0pOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTUEVDX01SUDoKLQkJCVBlZXJNZWFzdXJlUmVwb3J0QWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFNQRUNfVFBDUlE6Ci0JCQlQZWVyVHBjUmVxQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFNQRUNfVFBDUlA6Ci0JCQlQZWVyVHBjUmVwQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFNQRUNfQ0hBTk5FTF9TV0lUQ0g6Ci0KLSNpZmRlZiBET1QxMU5fRFJBRlQzCi0JCQl7Ci0JCQkJU0VDX0NIQV9PRkZTRVRfSUUJU2Vjb25kYXJ5OwotCQkJCUNIQV9TV0lUQ0hfQU5OT1VOQ0VfSUUJQ2hhbm5lbFN3aXRjaDsKLQotCQkJCS8vIDgwMi4xMWggb25seSBoYXMgQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IElFLgotCQkJCVJUTVBNb3ZlTWVtb3J5KCZDaGFubmVsU3dpdGNoLCAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErNF0sIHNpemVvZiAoQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRSkpOwotCi0JCQkJLy8gODAyLjExbiBEMy4wMyBhZGRzIHNlY29uZGFyeSBjaGFubmVsIG9mZnNldCBlbGVtZW50IGluIHRoZSBlbmQuCi0JCQkJaWYgKEVsZW0tPk1zZ0xlbiA9PSAgKExFTkdUSF84MDJfMTEgKyAyICsgc2l6ZW9mIChDSEFfU1dJVENIX0FOTk9VTkNFX0lFKSArIHNpemVvZiAoU0VDX0NIQV9PRkZTRVRfSUUpKSkKLQkJCQl7Ci0JCQkJCVJUTVBNb3ZlTWVtb3J5KCZTZWNvbmRhcnksICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSs5XSwgc2l6ZW9mIChTRUNfQ0hBX09GRlNFVF9JRSkpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlTZWNvbmRhcnkuU2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA9IDA7Ci0JCQkJfQotCi0JCQkJaWYgKChFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsyXSA9PSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQpICYmIChFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSszXSA9PSAzKSkKLQkJCQl7Ci0JCQkJCUNoYW5uZWxTd2l0Y2hBY3Rpb24ocEFkLCBFbGVtLT5XY2lkLCBDaGFubmVsU3dpdGNoLk5ld0NoYW5uZWwsIFNlY29uZGFyeS5TZWNvbmRhcnlDaGFubmVsT2Zmc2V0KTsKLQkJCQl9Ci0JCQl9Ci0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotCi0JCQlQZWVyQ2hTd0FubkFjdGlvbihwQWQsIEVsZW0pOwotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlQYXJhbWV0cnM6Ci0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLUlOVCBTZXRfTWVhc3VyZVJlcV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUlOVCBBaWQgPSAxOwotCVVJTlQgQXJnSWR4OwotCVBTVFJJTkcgdGhpc0NoYXI7Ci0KLQlNRUFTVVJFX1JFUV9NT0RFIE1lYXN1cmVSZXFNb2RlOwotCVVJTlQ4IE1lYXN1cmVSZXFUb2tlbiA9IFJhbmRvbUJ5dGUocEFkKTsKLQlVSU5UOCBNZWFzdXJlUmVxVHlwZSA9IFJNX0JBU0lDOwotCVVJTlQ4IE1lYXN1cmVDaCA9IDE7Ci0JVUlOVDY0IE1lYXN1cmVTdGFydFRpbWUgPSBHZXRDdXJyZW50VGltZVN0YW1wKHBBZCk7Ci0JTUVBU1VSRV9SRVEgTWVhc3VyZVJlcTsKLQlVSU5UOCBUb3RhbExlbjsKLQotCUhFQURFUl84MDJfMTEgQWN0SGRyOwotCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyBOU3RhdHVzOwotCVVMT05HIEZyYW1lTGVuOwotCi0JTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCWdvdG8gRU5EX09GX01FQVNVUkVfUkVROwotCX0KLQotCUFyZ0lkeCA9IDE7Ci0Jd2hpbGUgKCh0aGlzQ2hhciA9IHN0cnNlcCgoY2hhciAqKikmYXJnLCAiLSIpKSAhPSBOVUxMKQotCXsKLQkJc3dpdGNoKEFyZ0lkeCkKLQkJewotCQkJY2FzZSAxOgkvLyBBaWQuCi0JCQkJQWlkID0gKFVJTlQ4KSBzaW1wbGVfc3RydG9sKHRoaXNDaGFyLCAwLCAxNik7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgMjogLy8gTWVhc3VyZW1lbnQgUmVxdWVzdCBUeXBlLgotCQkJCU1lYXN1cmVSZXFUeXBlID0gc2ltcGxlX3N0cnRvbCh0aGlzQ2hhciwgMCwgMTYpOwotCQkJCWlmIChNZWFzdXJlUmVxVHlwZSA+IDMpCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogdW5rbm93IE1lYXN1cmVSZXFUeXBlKCVkKVxuIiwgX19GVU5DVElPTl9fLCBNZWFzdXJlUmVxVHlwZSkpOwotCQkJCQlnb3RvIEVORF9PRl9NRUFTVVJFX1JFUTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgMzogLy8gTWVhc3VyZW1lbnQgY2hhbm5lbC4KLQkJCQlNZWFzdXJlQ2ggPSAoVUlOVDgpIHNpbXBsZV9zdHJ0b2wodGhpc0NoYXIsIDAsIDE2KTsKLQkJCQlicmVhazsKLQkJfQotCQlBcmdJZHgrKzsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6QWlkID0gJWQsIE1lYXN1cmVSZXFUeXBlPSVkIE1lYXN1cmVDaD0lZFxuIiwgX19GVU5DVElPTl9fLCBBaWQsIE1lYXN1cmVSZXFUeXBlLCBNZWFzdXJlQ2gpKTsKLQlpZiAoIVZBTElEX1dDSUQoQWlkKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiB1bmtub3cgc3RhIG9mIEFpZCglZClcbiIsIF9fRlVOQ1RJT05fXywgQWlkKSk7Ci0JCWdvdG8gRU5EX09GX01FQVNVUkVfUkVROwotCX0KLQotCU1lYXN1cmVSZXFNb2RlLndvcmQgPSAwOwotCU1lYXN1cmVSZXFNb2RlLmZpZWxkLkVuYWJsZSA9IDE7Ci0KLQlNZWFzdXJlUmVxSW5zZXJ0KHBBZCwgTWVhc3VyZVJlcVRva2VuKTsKLQotCS8vIGJ1aWxkIGFjdGlvbiBmcmFtZSBoZWFkZXIuCi0JTWd0TWFjSGVhZGVySW5pdChwQWQsICZBY3RIZHIsIFNVQlRZUEVfQUNUSU9OLCAwLCBwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uQWRkciwKLQkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MpOwotCi0JTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7Ci0JRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7Ci0KLQlUb3RhbExlbiA9IHNpemVvZihNRUFTVVJFX1JFUV9JTkZPKSArIHNpemVvZihNRUFTVVJFX1JFUSk7Ci0KLQlNYWtlTWVhc3VyZW1lbnRSZXFGcmFtZShwQWQsIHBPdXRCdWZmZXIsICZGcmFtZUxlbiwKLQkJc2l6ZW9mKE1FQVNVUkVfUkVRX0lORk8pLCBDQVRFR09SWV9STSwgUk1fQkFTSUMsCi0JCU1lYXN1cmVSZXFUb2tlbiwgTWVhc3VyZVJlcU1vZGUud29yZCwKLQkJTWVhc3VyZVJlcVR5cGUsIDApOwotCi0JTWVhc3VyZVJlcS5DaE51bSA9IE1lYXN1cmVDaDsKLQlNZWFzdXJlUmVxLk1lYXN1cmVTdGFydFRpbWUgPSBjcHUybGU2NChNZWFzdXJlU3RhcnRUaW1lKTsKLQlNZWFzdXJlUmVxLk1lYXN1cmVEdXJhdGlvbiA9IGNwdTJsZTE2KDIwMDApOwotCi0JewotCQlVTE9ORyBUZW1wTGVuOwotCQlNYWtlT3V0Z29pbmdGcmFtZSgJcE91dEJ1ZmZlcitGcmFtZUxlbiwJJlRlbXBMZW4sCi0JCQkJCQkJc2l6ZW9mKE1FQVNVUkVfUkVRKSwJJk1lYXN1cmVSZXEsCi0JCQkJCQkJRU5EX09GX0FSR1MpOwotCQlGcmFtZUxlbiArPSBUZW1wTGVuOwotCX0KLQotCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCAoVUlOVClGcmFtZUxlbik7Ci0KLUVORF9PRl9NRUFTVVJFX1JFUToKLQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVCBTZXRfVHBjUmVxX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVSU5UIEFpZDsKLQotCVVJTlQ4IFRwY1JlcVRva2VuID0gUmFuZG9tQnl0ZShwQWQpOwotCi0JQWlkID0gKFVJTlQpIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxNik7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6QWlkID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgQWlkKSk7Ci0JaWYgKCFWQUxJRF9XQ0lEKEFpZCkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogdW5rbm93IHN0YSBvZiBBaWQoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIEFpZCkpOwotCQlyZXR1cm4gVFJVRTsKLQl9Ci0KLQlUcGNSZXFJbnNlcnQocEFkLCBUcGNSZXFUb2tlbik7Ci0KLQlFbnF1ZXVlVFBDUmVxKHBBZCwgcEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLkFkZHIsIFRwY1JlcVRva2VuKTsKLQotCXJldHVybiBUUlVFOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb25maWcubWsgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbmZpZy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM5MGM0MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbmZpZy5taworKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0jIFN1cHBvcnQgQVRFIGZ1bmN0aW9uCi1IQVNfQVRFPXkKLQotIyBTdXBwb3J0IDI4eHggUUEgQVRFIGZ1bmN0aW9uCi1IQVNfMjh4eF9RQT1uCi0KLQotSEFTX05JTlRFTkRPPW4KLQotIyBTdXBwb3J0IExMVEQgZnVuY3Rpb24KLUhBU19MTFREPW4KLQotIyBTdXBwb3J0IFdEUyBmdW5jdGlvbgotSEFTX1dEUz1uCi0KLSMgU3VwcG9ydCBBUC1DbGllbnQgZnVuY3Rpb24KLUhBU19BUENMST1uCi0KLSMgU3VwcG9ydCBXcGFfU3VwcGxpY2FudAotSEFTX1dQQV9TVVBQTElDQU5UPXkKLQotIyBTdXBwb3J0IE5hdGl2ZSBXcGFTdXBwbGljYW50IGZvciBOZXR3b3JrIE1hZ2FuZ2VyCi1IQVNfTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQ9eQotCi0jU3VwcG9ydCBOZXQgaW50ZXJmYWNlIGJsb2NrIHdoaWxlIFR4LVN3IHF1ZXVlIGZ1bGwKLUhBU19CTE9DS19ORVRfSUY9bgotCi0jU3VwcG9ydCBJR01QLVNub29waW5nIGZ1bmN0aW9uLgotSEFTX0lHTVBfU05PT1BfU1VQUE9SVD1uCi0KLSNTdXBwb3J0IERGUyBmdW5jdGlvbgotSEFTX0RGU19TVVBQT1JUPW4KLQotI1N1cHBvcnQgQ2Fycmllci1TZW5zZSBmdW5jdGlvbgotSEFTX0NTX1NVUFBPUlQ9bgotCi0jIFN1cHBvcnQgZm9yIFNUQSBFdGhlcm5ldCBDb252ZXJ0ZXIKLUhBU19FVEhfQ09OVkVSVF9TVVBQT1JUPW4KLQotIyBTdXBwb3J0IHVzZXIgc3BlY2lmaWMgdHJhbnNtaXQgcmF0ZSBvZiBNdWx0aWNhc3QgcGFja2V0LgotSEFTX01DQVNUX1JBVEVfU1BFQ0lGSUNfU1VQUE9SVD1uCi0KLSMgU3VwcG9ydCBmb3IgTXVsdGlwbGUgQ2FyZHMKLUhBU19NQ19TVVBQT1JUPW4KLQotI1N1cHBvcnQgZm9yIFBDSS1NU0kKLUhBU19NU0lfU1VQUE9SVD1uCi0KLQotI1N1cHBvcnQgZm9yIElFRUU4MDIuMTFlIERMUwotSEFTX1FPU19ETFNfU1VQUE9SVD1uCi0KLSNTdXBwb3J0IGZvciBFWFRfQ0hBTk5FTAotSEFTX0VYVF9CVUlMRF9DSEFOTkVMX0xJU1Q9bgotCi0jU3VwcG9ydCBmb3IgSURTCi1IQVNfSURTX1NVUFBPUlQ9bgotCi0KLSNTdXBwb3J0IGZvciBOZXQtU05NUAotSEFTX1NOTVBfU1VQUE9SVD1uCi0KLSNTdXBwb3J0IGZlYXR1cmVzIG9mIDgwMi4xMW4gRHJhZnQzCi1IQVNfRE9UMTFOX0RSQUZUM19TVVBQT1JUPW4KLQotI1N1cHBvcnQgZmVhdHVyZXMgb2YgU2luZ2xlIFNLVS4KLUhBU19TSU5HTEVfU0tVX1NVUFBPUlQ9bgotCi0jU3VwcG9ydCBmZWF0dXJlcyBvZiA4MDIuMTFuCi1IQVNfRE9UMTFfTl9TVVBQT1JUPXkKLQotCi0KLSNTdXBwb3J0IGZvciAyODYwLzI4ODAgY28tZXhpc3QKLUhBU19SVDI4ODBfUlQyODYwX0NPRVhJU1Q9bgotCi1IQVNfS1RIUkVBRF9TVVBQT1JUPW4KLQotCi0jU3VwcG9ydCBmb3IgQXV0byBjaGFubmVsIHNlbGVjdCBlbmhhbmNlCi1IQVNfQVVUT19DSF9TRUxFQ1RfRU5IQU5DRT1uCi0KLSNTdXBwb3J0IGJ5cGFzcyBicmlkZ2UKLUhBU19CR19GVF9TVVBQT1JUPW4KLQotI1N1cHBvcnQgQW50ZW5uYSBEaXZlcnNpdHkKLUhBU19BTlRFTk5BX0RJVkVSU0lUWV9TVVBQT1JUPXkKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotV0ZMQUdTIDo9IC1EQUdHUkVHQVRJT05fU1VQUE9SVCAtRFBJR0dZQkFDS19TVVBQT1JUIC1EV01NX1NVUFBPUlQgIC1ETElOVVggLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXRyaWdyYXBocyAtV3BvaW50ZXItc2lnbgotCi1pZmVxICgkKEhBU19LVEhSRUFEX1NVUFBPUlQpLHkpCi1XRkxBR1MgKz0gLURLVEhSRUFEX1NVUFBPUlQKLWVuZGlmCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIGNvbmZpZyBmb3IgU1RBIG1vZGUKLQotV0ZMQUdTICs9IC1EQ09ORklHX1NUQV9TVVBQT1JUIC1EREJHCi0KLWlmZXEgKCQoSEFTX1dQQV9TVVBQTElDQU5UKSx5KQotV0ZMQUdTICs9IC1EV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotaWZlcSAoJChIQVNfTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQpLHkpCi1XRkxBR1MgKz0gLUROQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotZW5kaWYKLWVuZGlmCi0KLQotaWZlcSAoJChIQVNfRVRIX0NPTlZFUlRfU1VQUE9SVCksIHkpCi1XRkxBR1MgKz0gLURFVEhfQ09OVkVSVF9TVVBQT1JUICAtRE1BVF9TVVBQT1JUCi1lbmRpZgotCi1pZmVxICgkKEhBU19BVEUpLHkpCi1XRkxBR1MgKz0gLURSQUxJTktfQVRFCi1pZmVxICgkKEhBU18yOHh4X1FBKSx5KQotV0ZMQUdTICs9IC1EUkFMSU5LXzI4eHhfUUEKLWVuZGlmCi1lbmRpZgotCi0KLWlmZXEgKCQoSEFTX1NOTVBfU1VQUE9SVCkseSkKLVdGTEFHUyArPSAtRFNOTVBfU1VQUE9SVAotZW5kaWYKLQotaWZlcSAoJChIQVNfUU9TX0RMU19TVVBQT1JUKSx5KQotV0ZMQUdTICs9IC1EUU9TX0RMU19TVVBQT1JUCi1lbmRpZgotCi1pZmVxICgkKEhBU19ET1QxMV9OX1NVUFBPUlQpLHkpCi1XRkxBR1MgKz0gLURET1QxMV9OX1NVUFBPUlQKLWVuZGlmCi0KLWlmZXEgKCQoSEFTX0NTX1NVUFBPUlQpLHkpCi1XRkxBR1MgKz0gLURDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCi1lbmRpZgotCi1pZmVxICgkKEhBU19BTlRFTk5BX0RJVkVSU0lUWV9TVVBQT1JUKSx5KQotV0ZMQUdTICs9IC1EQU5UX0RJVkVSU0lUWV9TVVBQT1JUCi1lbmRpZgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBDb21tb24gY29tcGlsZXIgZmxhZwotIwotCi0KLQotCi0KLWlmZXEgKCQoSEFTX0VYVF9CVUlMRF9DSEFOTkVMX0xJU1QpLHkpCi1XRkxBR1MgKz0gLURFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCi1lbmRpZgotCi1pZmVxICgkKEhBU19JRFNfU1VQUE9SVCkseSkKLVdGTEFHUyArPSAtRElEU19TVVBQT1JUCi1lbmRpZgotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ2hpcFNldCBzcGVjaWZpYyBkZWZpbml0aW9ucy4KLSMKLVdGTEFHUyArPS1EUlRNUF9NQUNfUENJIC1EUlQzMHh4IC1EUlQzMDkwICAtRFJUTVBfUENJX1NVUFBPUlQgLURSVE1QX1JGX1JXX1NVUFBPUlQgLURSVE1QX0VGVVNFX1NVUFBPUlQKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotCi1pZmVxICgkKEhBU19CTE9DS19ORVRfSUYpLHkpCi1XRkxBR1MgKz0gLURCTE9DS19ORVRfSUYKLWVuZGlmCi0KLWlmZXEgKCQoSEFTX0RGU19TVVBQT1JUKSx5KQotV0ZMQUdTICs9IC1EREZTX1NVUFBPUlQKLWVuZGlmCi0KLWlmZXEgKCQoSEFTX01DX1NVUFBPUlQpLHkpCi1XRkxBR1MgKz0gLURNVUxUSVBMRV9DQVJEX1NVUFBPUlQKLWVuZGlmCi0KLWlmZXEgKCQoSEFTX0xMVEQpLHkpCi1XRkxBR1MgKz0gLURMTFREX1NVUFBPUlQKLWVuZGlmCi0KLUVYVFJBX0NGTEFHUyA6PSAkKFdGTEFHUykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY3J5cHRfaG1hYy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jcnlwdF9obWFjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1N2NhNzMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jcnlwdF9obWFjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIGNyeXB0X2htYWMuaAotCi0gICAgQWJzdHJhY3Q6Ci0gICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEVkZHkgICAgICAgIDIwMDgvMTEvMjQgICAgICBDcmVhdGUgSE1BQy1TSEExLCBITUFDLVNIQTI1NgotKi8KLQotI2lmbmRlZiBfX0NSWVBUX0hNQUNfSF9fCi0jZGVmaW5lIF9fQ1JZUFRfSE1BQ19IX18KLQotI2lmZGVmIENSWVBUX1RFU1RQTEFOCi0jaW5jbHVkZSAiY3J5cHRfdGVzdHBsYW4uaCIKLSNlbHNlCi0jaW5jbHVkZSAicnRfY29uZmlnLmgiCi0jZW5kaWYgLyogQ1JZUFRfVEVTVFBMQU4gKi8KLQotI2lmZGVmIFNIQTFfU1VQUE9SVAotI2RlZmluZSBITUFDX1NIQTFfU1VQUE9SVAotVk9JRCBITUFDX1NIQTEgKAotICAgIElOICBjb25zdCBVSU5UOCBLZXlbXSwKLSAgICBJTiAgVUlOVCBLZXlMZW4sCi0gICAgSU4gIGNvbnN0IFVJTlQ4IE1lc3NhZ2VbXSwKLSAgICBJTiAgVUlOVCBNZXNzYWdlTGVuLAotICAgIE9VVCBVSU5UOCBNQUNbXSwKLSAgICBJTiAgVUlOVCBNQUNMZW4pOwotI2VuZGlmIC8qIFNIQTFfU1VQUE9SVCAqLwotCi0jaWZkZWYgU0hBMjU2X1NVUFBPUlQKLSNkZWZpbmUgSE1BQ19TSEEyNTZfU1VQUE9SVAotVk9JRCBITUFDX1NIQTI1NiAoCi0gICAgSU4gIGNvbnN0IFVJTlQ4IEtleVtdLAotICAgIElOICBVSU5UIEtleUxlbiwKLSAgICBJTiAgY29uc3QgVUlOVDggTWVzc2FnZVtdLAotICAgIElOICBVSU5UIE1lc3NhZ2VMZW4sCi0gICAgT1VUIFVJTlQ4IE1BQ1tdLAotICAgIElOICBVSU5UIE1BQ0xlbik7Ci0jZW5kaWYgLyogU0hBMjU2X1NVUFBPUlQgKi8KLQotI2lmZGVmIE1ENV9TVVBQT1JUCi0jZGVmaW5lIEhNQUNfTUQ1X1NVUFBPUlQKLVZPSUQgSE1BQ19NRDUgKAotICAgIElOICBjb25zdCBVSU5UOCBLZXlbXSwKLSAgICBJTiAgVUlOVCBLZXlMZW4sCi0gICAgSU4gIGNvbnN0IFVJTlQ4IE1lc3NhZ2VbXSwKLSAgICBJTiAgVUlOVCBNZXNzYWdlTGVuLAotICAgIE9VVCBVSU5UOCBNQUNbXSwKLSAgICBJTiAgVUlOVCBNQUNMZW4pOwotI2VuZGlmIC8qIE1ENV9TVVBQT1JUICovCi0KLSNlbmRpZiAvKiBfX0NSWVBUX0hNQUNfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NyeXB0X21kNS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jcnlwdF9tZDUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VlM2Y0Mi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NyeXB0X21kNS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBjcnlwdF9tZDUuaAotCi0gICAgQWJzdHJhY3Q6Ci0gICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEVkZHkgICAgICAgIDIwMDgvMTEvMjQgICAgICBDcmVhdGUgbWQ1Ci0qLwotCi0jaWZuZGVmIF9fQ1JZUFRfTUQ1X0hfXwotI2RlZmluZSBfX0NSWVBUX01ENV9IX18KLQotI2lmZGVmIENSWVBUX1RFU1RQTEFOCi0jaW5jbHVkZSAiY3J5cHRfdGVzdHBsYW4uaCIKLSNlbHNlCi0jaW5jbHVkZSAicnRfY29uZmlnLmgiCi0jZW5kaWYgLyogQ1JZUFRfVEVTVFBMQU4gKi8KLQotLyogQWxnb3JpdGhtIG9wdGlvbnMgKi8KLSNkZWZpbmUgTUQ1X1NVUFBPUlQKLQotI2lmZGVmIE1ENV9TVVBQT1JUCi0jZGVmaW5lIE1ENV9CTE9DS19TSVpFICAgIDY0IC8qIDUxMiBiaXRzID0gNjQgYnl0ZXMgKi8KLSNkZWZpbmUgTUQ1X0RJR0VTVF9TSVpFICAgMTYgLyogMTI4IGJpdHMgPSAxNiBieXRlcyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFVJTlQzMiBIYXNoVmFsdWVbNF07Ci0gICAgVUlOVDY0IE1lc3NhZ2VMZW47Ci0gICAgVUlOVDggIEJsb2NrW01ENV9CTE9DS19TSVpFXTsKLSAgICBVSU5UICAgQmxvY2tMZW47Ci19IE1ENV9DVFhfU1RSVUMsICpQTUQ1X0NUWF9TVFJVQzsKLQotVk9JRCBNRDVfSW5pdCAoCi0gICAgSU4gIE1ENV9DVFhfU1RSVUMgKnBNRDVfQ1RYKTsKLVZPSUQgTUQ1X0hhc2ggKAotICAgIElOICBNRDVfQ1RYX1NUUlVDICpwTUQ1X0NUWCk7Ci1WT0lEIE1ENV9BcHBlbmQgKAotICAgIElOICBNRDVfQ1RYX1NUUlVDICpwTUQ1X0NUWCwKLSAgICBJTiAgY29uc3QgVUlOVDggTWVzc2FnZVtdLAotICAgIElOICBVSU5UIE1lc3NhZ2VMZW4pOwotVk9JRCBNRDVfRW5kICgKLSAgICBJTiAgTUQ1X0NUWF9TVFJVQyAqcE1ENV9DVFgsCi0gICAgT1VUIFVJTlQ4IERpZ2VzdE1lc3NhZ2VbXSk7Ci1WT0lEIFJUX01ENSAoCi0gICAgSU4gIGNvbnN0IFVJTlQ4IE1lc3NhZ2VbXSwKLSAgICBJTiAgVUlOVCBNZXNzYWdlTGVuLAotICAgIE9VVCBVSU5UOCBEaWdlc3RNZXNzYWdlW10pOwotI2VuZGlmIC8qIE1ENV9TVVBQT1JUICovCi0KLSNlbmRpZiAvKiBfX0NSWVBUX01ENV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY3J5cHRfc2hhMi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jcnlwdF9zaGEyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YzA0MDMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jcnlwdF9zaGEyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBjcnlwdF9zaGEyLmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBFZGR5ICAgICAgICAyMDA4LzExLzI0ICAgICAgQ3JlYXRlIFNIQTEKLSAgICBFZGR5ICAgICAgICAyMDA4LzA3LzIzICAgICAgQ3JlYXRlIFNIQTI1NgotKi8KLQotI2lmbmRlZiBfX0NSWVBUX1NIQTJfSF9fCi0jZGVmaW5lIF9fQ1JZUFRfU0hBMl9IX18KLQotI2lmZGVmIENSWVBUX1RFU1RQTEFOCi0jaW5jbHVkZSAiY3J5cHRfdGVzdHBsYW4uaCIKLSNlbHNlCi0jaW5jbHVkZSAicnRfY29uZmlnLmgiCi0jZW5kaWYgLyogQ1JZUFRfVEVTVFBMQU4gKi8KLQotLyogQWxnb3JpdGhtIG9wdGlvbnMgKi8KLSNkZWZpbmUgU0hBMV9TVVBQT1JUCi0jZGVmaW5lIFNIQTI1Nl9TVVBQT1JUCi0KLSNpZmRlZiBTSEExX1NVUFBPUlQKLSNkZWZpbmUgU0hBMV9CTE9DS19TSVpFICAgIDY0IC8qIDUxMiBiaXRzID0gNjQgYnl0ZXMgKi8KLSNkZWZpbmUgU0hBMV9ESUdFU1RfU0laRSAgIDIwIC8qIDE2MCBiaXRzID0gMjAgYnl0ZXMgKi8KLXR5cGVkZWYgc3RydWN0IF9TSEExX0NUWF9TVFJVQyB7Ci0gICAgVUlOVDMyIEhhc2hWYWx1ZVs1XTsgIC8qIDUgPSAoU0hBMV9ESUdFU1RfU0laRSAvIDMyKSAqLwotICAgIFVJTlQ2NCBNZXNzYWdlTGVuOyAgICAvKiB0b3RhbCBzaXplICovCi0gICAgVUlOVDggIEJsb2NrW1NIQTFfQkxPQ0tfU0laRV07Ci0gICAgVUlOVCAgIEJsb2NrTGVuOwotfSBTSEExX0NUWF9TVFJVQywgKlBTSEExX0NUWF9TVFJVQzsKLQotVk9JRCBTSEExX0luaXQgKAotICAgIElOICBTSEExX0NUWF9TVFJVQyAqcFNIQV9DVFgpOwotVk9JRCBTSEExX0hhc2ggKAotICAgIElOICBTSEExX0NUWF9TVFJVQyAqcFNIQV9DVFgpOwotVk9JRCBTSEExX0FwcGVuZCAoCi0gICAgSU4gIFNIQTFfQ1RYX1NUUlVDICpwU0hBX0NUWCwKLSAgICBJTiAgY29uc3QgVUlOVDggTWVzc2FnZVtdLAotICAgIElOICBVSU5UIE1lc3NhZ2VMZW4pOwotVk9JRCBTSEExX0VuZCAoCi0gICAgSU4gIFNIQTFfQ1RYX1NUUlVDICpwU0hBX0NUWCwKLSAgICBPVVQgVUlOVDggRGlnZXN0TWVzc2FnZVtdKTsKLVZPSUQgUlRfU0hBMSAoCi0gICAgSU4gIGNvbnN0IFVJTlQ4IE1lc3NhZ2VbXSwKLSAgICBJTiAgVUlOVCBNZXNzYWdlTGVuLAotICAgIE9VVCBVSU5UOCBEaWdlc3RNZXNzYWdlW10pOwotI2VuZGlmIC8qIFNIQTFfU1VQUE9SVCAqLwotCi0jaWZkZWYgU0hBMjU2X1NVUFBPUlQKLSNkZWZpbmUgU0hBMjU2X0JMT0NLX1NJWkUgICA2NCAvKiA1MTIgYml0cyA9IDY0IGJ5dGVzICovCi0jZGVmaW5lIFNIQTI1Nl9ESUdFU1RfU0laRSAgMzIgLyogMjU2IGJpdHMgPSAzMiBieXRlcyAqLwotdHlwZWRlZiBzdHJ1Y3QgX1NIQTI1Nl9DVFhfU1RSVUMgewotICAgIFVJTlQzMiBIYXNoVmFsdWVbOF07ICAvKiA4ID0gKFNIQTI1Nl9ESUdFU1RfU0laRSAvIDMyKSAqLwotICAgIFVJTlQ2NCBNZXNzYWdlTGVuOyAgICAvKiB0b3RhbCBzaXplICovCi0gICAgVUlOVDggIEJsb2NrW1NIQTI1Nl9CTE9DS19TSVpFXTsKLSAgICBVSU5UICAgQmxvY2tMZW47Ci19IFNIQTI1Nl9DVFhfU1RSVUMsICpQU0hBMjU2X0NUWF9TVFJVQzsKLQotVk9JRCBTSEEyNTZfSW5pdCAoCi0gICAgSU4gIFNIQTI1Nl9DVFhfU1RSVUMgKnBTSEFfQ1RYKTsKLVZPSUQgU0hBMjU2X0hhc2ggKAotICAgIElOICBTSEEyNTZfQ1RYX1NUUlVDICpwU0hBX0NUWCk7Ci1WT0lEIFNIQTI1Nl9BcHBlbmQgKAotICAgIElOICBTSEEyNTZfQ1RYX1NUUlVDICpwU0hBX0NUWCwKLSAgICBJTiAgY29uc3QgVUlOVDggTWVzc2FnZVtdLAotICAgIElOICBVSU5UIE1lc3NhZ2VMZW4pOwotVk9JRCBTSEEyNTZfRW5kICgKLSAgICBJTiAgU0hBMjU2X0NUWF9TVFJVQyAqcFNIQV9DVFgsCi0gICAgT1VUIFVJTlQ4IERpZ2VzdE1lc3NhZ2VbXSk7Ci1WT0lEIFJUX1NIQTI1NiAoCi0gICAgSU4gIGNvbnN0IFVJTlQ4IE1lc3NhZ2VbXSwKLSAgICBJTiAgVUlOVCBNZXNzYWdlTGVuLAotICAgIE9VVCBVSU5UOCBEaWdlc3RNZXNzYWdlW10pOwotI2VuZGlmIC8qIFNIQTI1Nl9TVVBQT1JUICovCi0KLSNlbmRpZiAvKiBfX0NSWVBUX1NIQTJfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2Rmcy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9kZnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA2NDY4ZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2Rmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgZGZzLmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBGb25jaGkgICAgMDMtMTItMjAwNyAgICAgIGNyZWF0ZWQKLSovCi0KLSNkZWZpbmUgUkFEQVJfUFVMU0UgMQotI2RlZmluZSBSQURBUl9XSURUSCAyCi0KLSNkZWZpbmUgV0lEVEhfUkRfSURMRSAwCi0jZGVmaW5lIFdJRFRIX1JEX0NIRUNLIDEKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKglERlMgUmFkYXIgcmVsYXRlZCBkZWZpbml0aW9ucy4KLSAgKgotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vLyNkZWZpbmUgQ0FSUklFUl9ERVRFQ1RfVEFTS19OVU0JNgotLy8jZGVmaW5lIFJBREFSX0RFVEVDVF9UQVNLX05VTQk3Ci0KLS8vIE1jdVJhZGFyU3RhdGUgJiYgTWN1Q2FycmllclN0YXRlIGZvciAyODgwLVNXLU1DVQotI2RlZmluZSBGUkVFX0ZPUl9UWAkJCQkwCi0jZGVmaW5lIFdBSVRfQ1RTX0JFSU5HX1NFTlQJCTEKLSNkZWZpbmUgRE9fREVURUNUSU9OCQkJMgotCi0vLyBNY3VSYWRhckV2ZW50Ci0jZGVmaW5lIFJBREFSX0VWRU5UX0NUU19TRU5UCQkJMHgwMSAvLyBIb3N0IHNpZ25hbCBNQ1UgdGhhdCBDVFMgaGFzIGJlZW4gc2VudAotI2RlZmluZSBSQURBUl9FVkVOVF9DVFNfQ0FSUklFUl9TRU5UCTB4MDIgLy8gSG9zdCBzaWduYWwgTUNVIHRoYXQgQ1RTIGhhcyBiZWVuIHNlbnQgKENhcnJpZXIpCi0jZGVmaW5lIFJBREFSX0VWRU5UX1JBREFSX0RFVEVDVElORwkJMHgwNCAvLyBSYWRhciBkZXRlY3Rpb24gaXMgb24gZ29pbmcsIGNhcnJpZXIgZGV0ZWN0aW9uIGhvbGQgYmFjawotI2RlZmluZSBSQURBUl9FVkVOVF9DQVJSSUVSX0RFVEVDVElORwkweDA4IC8vIENhcnJpZXIgZGV0ZWN0aW9uIGlzIG9uIGdvaW5nLCByYWRhciBkZXRlY3Rpb24gaG9sZCBiYWNrCi0jZGVmaW5lIFJBREFSX0VWRU5UX1dJRFRIX1JBREFSCQkJMHgxMCAvLyBCQlAgPT0gMiByYWRhciBkZXRlY3RlZAotI2RlZmluZSBSQURBUl9FVkVOVF9DVFNfS0lDS0VECQkJMHgyMCAvLyBSYWRhciBkZXRlY3Rpb24gbmVlZCB0byBzZW50IGRvdWJsZSBDVFMsIGZpcnN0IENUUyBzZW50Ci0KLS8vIE1jdVJhZGFyQ21kCi0jZGVmaW5lIERFVEVDVElPTl9TVE9QCQkJMAotI2RlZmluZSBSQURBUl9ERVRFQ1RJT04JCQkxCi0jZGVmaW5lIENBUlJJRVJfREVURUNUSU9OCQkyCi0KLQotCi0jaWZkZWYgVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVAotSU5UIFNldF9DYXJyaWVyQ3JpdGVyaWFfUHJvYyhJTiBQUlRNUF9BREFQVEVSIHBBZCwgSU4gUFNUUklORyBhcmcpOwotaW50IFNldF9DYXJyaWVyUmVDaGVja19Qcm9jKElOIFBSVE1QX0FEQVBURVIgcEFkLCBJTiBQU1RSSU5HIGFyZyk7Ci1JTlQgU2V0X0NhcnJpZXJTdG9wQ2hlY2tfUHJvYyhJTiBQUlRNUF9BREFQVEVSIHBBZCwgSU4gUFNUUklORyBhcmcpOwotdm9pZCBOZXdDYXJyaWVyRGV0ZWN0aW9uU3RhcnQoUFJUTVBfQURBUFRFUiBwQWQpOwotdm9pZCBSVE1QSGFuZGxlUmFkYXJJbnRlcnJ1cHQoUFJUTVBfQURBUFRFUiAgcEFkKTsKLVZPSUQgQ1NBc2ljRGlzYWJsZVN5bmMoSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotI2VuZGlmIC8vIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQgLy8KLQotCi1WT0lEIEJicFJhZGFyRGV0ZWN0aW9uU3RhcnQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIEJicFJhZGFyRGV0ZWN0aW9uU3RvcCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgUmFkYXJEZXRlY3Rpb25TdGFydCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBCT09MRUFOIENUU19Qcm90ZWN0LAotCUlOIFVJTlQ4IENUU1BlcmlvZCk7Ci0KLVZPSUQgUmFkYXJEZXRlY3Rpb25TdG9wKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotVk9JRCBSYWRhckRldGVjdFBlcmlvZGljKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotCi1CT09MRUFOIFJhZGFyQ2hhbm5lbENoZWNrKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVDSEFSCQkJQ2gpOwotCi1VTE9ORyBKYXBSYWRhclR5cGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1VTE9ORyBSVE1QQmJwUmVhZFJhZGFyRHVyYXRpb24oCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwotCi1VTE9ORyBSVE1QUmVhZFJhZGFyRHVyYXRpb24oCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwotCi1WT0lEIFJUTVBDbGVhblJhZGFyRHVyYXRpb24oCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwotCi1WT0lEIFJUTVBQcmVwYXJlUkRDVFNGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwREEsCi0JSU4JVUxPTkcJCQlEdXJhdGlvbiwKLQlJTiAgVUNIQVIgICAgICAgICAgIFJUU1JhdGUsCi0JSU4gIFVMT05HICAgICAgICAgICBDVFNCYXNlQWRkciwKLQlJTiAgVUNIQVIJCQlGcmFtZUdhcCk7Ci0KLVZPSUQgUlRNUFByZXBhcmVSYWRhckRldGVjdFBhcmFtcygKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLQotSU5UIFNldF9DaE1vdmluZ1RpbWVfUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQU1RSSU5HIGFyZyk7Ci0KLUlOVCBTZXRfTG9uZ1B1bHNlUmFkYXJUaF9Qcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBTVFJJTkcgYXJnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvZWVwcm9tLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2VlcHJvbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTBlODA3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvZWVwcm9tLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIGVlcHJvbS5oCi0KLSAgICBBYnN0cmFjdDoKLSAgICBNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotI2lmbmRlZiBfX0VFUFJPTV9IX18KLSNkZWZpbmUgX19FRVBST01fSF9fCi0KLQotCi0jaWZkZWYgUlRNUF9QQ0lfU1VQUE9SVAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKglQdWJsaWMgZnVuY3Rpb24gZGVjbGFyYXRpb25zIGZvciBwcm9tLWJhc2VkIGNoaXBzZXQKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IHJ0bXBfZWVfcHJvbV9yZWFkMTYoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVVNIT1JUCQkJT2Zmc2V0LAotCU9VVCBVU0hPUlQJCQkqcFZhbHVlKTsKLQotaW50IHJ0bXBfZWVfcHJvbV93cml0ZTE2KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVTSE9SVAkJCU9mZnNldCwKLQlJTiBVU0hPUlQJCQl2YWx1ZSk7Ci0jZW5kaWYgLy8gUlRNUF9QQ0lfU1VQUE9SVCAvLwotCi0KLQotCi0KLSNpZmRlZiBSVDMweHgKLSNpZmRlZiBSVE1QX0VGVVNFX1NVUFBPUlQKLWludCBydG1wX2VlX2VmdXNlX3JlYWQxNigKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBVU0hPUlQgT2Zmc2V0LAotCU9VVCBVU0hPUlQgKnBWYWx1ZSk7Ci0KLWludCBydG1wX2VlX2VmdXNlX3dyaXRlMTYoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gVVNIT1JUIE9mZnNldCwKLQlJTiBVU0hPUlQgZGF0YSk7Ci0jZW5kaWYgLy8gUlRNUF9FRlVTRV9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gUlQzMHh4IC8vCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoJUHVibGljIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBmb3IgcHJvbSBvcGVyYXRpb24gY2FsbGJhY2sgZnVuY3Rpb25zIHNldHRpbmcKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSU5UIFJ0bXBDaGlwT3BzRWVwcm9tSG9vaygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBJTlQJCQlpbmZUeXBlKTsKLQotI2VuZGlmIC8vIF9fRUVQUk9NX0hfXyAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9maXJtd2FyZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9maXJtd2FyZS5oCmluZGV4IGYyODM2YTIuLjE3MDU2ZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvZmlybXdhcmUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2Zpcm13YXJlLmgKQEAgLTIsNyArMiw3IEBACiAvKiBBVVRPIEdFTiBQTEVBU0UgRE8gTk9UIE1PRElGWSBJVCAqLwogCiAKLVVDSEFSIEZpcm13YXJlSW1hZ2UgW10gPSB7Cit1OCBGaXJtd2FyZUltYWdlXzMwOTAgW10gPSB7CiAweDAyLCAweDAyLCAweGYzLCAweDAyLCAweDAyLCAweGExLCAweDIyLCAweDIyLCAweGZmLCAweGZmLCAweGZmLCAweDAyLCAweDAxLCAweDI3LCAweGZmLCAweGZmLAogMHhmZiwgMHhmZiwgMHhmZiwgMHgwMiwgMHgwMCwgMHgxZSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMiwgMHgwMCwgMHhkOCwgMHhjMCwgMHhlMCwKIDB4YzAsIDB4ZjAsIDB4YzAsIDB4ODMsIDB4YzAsIDB4ODIsIDB4YzAsIDB4ZDAsIDB4NzUsIDB4ZDAsIDB4MTgsIDB4YzIsIDB4YWYsIDB4MzAsIDB4NDUsIDB4MDMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2lnbXBfc25vb3AuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvaWdtcF9zbm9vcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2Y5NjkyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvaWdtcF9zbm9vcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgaWdtcF9zbm9vcC5oCi0KLSAgICBBYnN0cmFjdDoKLSAgICBNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0KLSNpZm5kZWYgX19SVE1QX0lHTVBfU05PT1BfSF9fCi0jZGVmaW5lIF9fUlRNUF9JR01QX1NOT09QX0hfXwotCi0jaW5jbHVkZSAibGlua19saXN0LmgiCi0KLSNkZWZpbmUgSUdNUF9QUk9UT0NPTF9ERVNDUklQVE9SCTB4MDIKLSNkZWZpbmUgSUdNUF9WMV9NRU1CRVJTSElQX1JFUE9SVAkweDEyCi0jZGVmaW5lIElHTVBfVjJfTUVNQkVSU0hJUF9SRVBPUlQJMHgxNgotI2RlZmluZSBJR01QX0xFQVZFX0dST1VQCQkJMHgxNwotI2RlZmluZSBJR01QX1YzX01FTUJFUlNISVBfUkVQT1JUCTB4MjIKLQotI2RlZmluZSBNTERfVjFfTElTVEVORVJfUkVQT1JUCQkxMzEKLSNkZWZpbmUgTUxEX1YxX0xJU1RFTkVSX0RPTkUJCTEzMgotI2RlZmluZSBNTERfVjJfTElTVEVSTkVSX1JFUE9SVAkJMTQzCi0KLSNkZWZpbmUgSUdNUE1BQ19UQl9FTlRSWV9BR0VPVVRfVElNRSAxMjAgKiBPU19IWgotCi0jZGVmaW5lIE1VTFRJQ0FTVF9BRERSX0hBU0hfSU5ERVgoQWRkcikgICAgICAoTUFDX0FERFJfSEFTSChBZGRyKSAlIChNQVhfTEVOX09GX01VTFRJQ0FTVF9GSUxURVJfSEFTSF9UQUJMRSkpCi0KLSNkZWZpbmUgSVNfTVVMVElDQVNUX01BQ19BRERSKEFkZHIpCQkJKCgoKEFkZHJbMF0pICYgMHgwMSkgPT0gMHgwMSkgJiYgKChBZGRyWzBdKSAhPSAweGZmKSkKLSNkZWZpbmUgSVNfQlJPQURDQVNUX01BQ19BRERSKEFkZHIpCQkJKCgoKEFkZHJbMF0pICYgMHhmZikgPT0gMHhmZikpCi0KLVZPSUQgTXVsdGljYXN0RmlsdGVyVGFibGVJbml0KAotCUlOIFBNVUxUSUNBU1RfRklMVEVSX1RBQkxFICpwcE11bHRpY2FzdEZpbHRlclRhYmxlKTsKLQotVk9JRCBNdWx0aUNhc3RGaWx0ZXJUYWJsZVJlc2V0KAotCUlOIFBNVUxUSUNBU1RfRklMVEVSX1RBQkxFICpwcE11bHRpY2FzdEZpbHRlclRhYmxlKTsKLQotQk9PTEVBTiBNdWx0aWNhc3RGaWx0ZXJUYWJsZUluc2VydEVudHJ5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwR3JwSWQsCi0JSU4gUFVDSEFSIHBNZW1iZXJBZGRyLAotCUlOIFBORVRfREVWIGRldiwKLQlJTiBNdWx0aWNhc3RGaWx0ZXJFbnRyeVR5cGUgdHlwZSk7Ci0KLUJPT0xFQU4gTXVsdGljYXN0RmlsdGVyVGFibGVEZWxldGVFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcEdycElkLAotCUlOIFBVQ0hBUiBwTWVtYmVyQWRkciwKLQlJTiBQTkVUX0RFViBkZXYpOwotCi1QTVVMVElDQVNUX0ZJTFRFUl9UQUJMRV9FTlRSWSBNdWx0aWNhc3RGaWx0ZXJUYWJsZUxvb2t1cCgKLQlJTiBQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSBwTXVsdGljYXN0RmlsdGVyVGFibGUsCi0JSU4gUFVDSEFSIHBBZGRyLAotCUlOIFBORVRfREVWIGRldik7Ci0KLUJPT0xFQU4gaXNJZ21wUGt0KAotCUlOIFBVQ0hBUiBwRHN0TWFjQWRkciwKLQlJTiBQVUNIQVIgcElwSGVhZGVyKTsKLQotVk9JRCBJR01QU25vb3BpbmcoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBEc3RNYWNBZGRyLAotCUlOIFBVQ0hBUiBwU3JjTWFjQWRkciwKLQlJTiBQVUNIQVIgcElwSGVhZGVyLAotCUlOIFBORVRfREVWIHBEZXYpOwotCi1CT09MRUFOIGlzTWxkUGt0KAotCUlOIFBVQ0hBUiBwRHN0TWFjQWRkciwKLQlJTiBQVUNIQVIgcElwSGVhZGVyLAotCU9VVCBVSU5UOCAqcFByb3RvVHlwZSwKLQlPVVQgUFVDSEFSICpwTWxkSGVhZGVyKTsKLQotVk9JRCBNTERTbm9vcGluZygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcERzdE1hY0FkZHIsCi0JSU4gUFVDSEFSIHBTcmNNYWNBZGRyLAotCUlOIFBVQ0hBUiBwSXBIZWFkZXIsCi0JSU4gUE5FVF9ERVYgcERldik7Ci0KLVVDSEFSIElnbXBNZW1iZXJDbnQoCi0JSU4gUExJU1RfSEVBREVSIHBMaXN0KTsKLQotVk9JRCBJZ21wR3JvdXBEZWxNZW1iZXJzKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwTWVtYmVyQWRkciwKLQlJTiBQTkVUX0RFViBwRGV2KTsKLQotSU5UIFNldF9JZ21wU25fRW5hYmxlX1Byb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFNUUklORyBhcmcpOwotCi1JTlQgU2V0X0lnbXBTbl9BZGRFbnRyeV9Qcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBTVFJJTkcgYXJnKTsKLQotSU5UIFNldF9JZ21wU25fRGVsRW50cnlfUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQU1RSSU5HIGFyZyk7Ci0KLUlOVCBTZXRfSWdtcFNuX1RhYkRpc3BsYXlfUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQU1RSSU5HIGFyZyk7Ci0KLXZvaWQgcnRtcF9yZWFkX2lnbXBfc25vb3BfZnJvbV9maWxlKAotCUlOICBQUlRNUF9BREFQVEVSIHBBZCwKLQlQU1RSSU5HIHRtcGJ1ZiwKLQlQU1RSSU5HIGJ1ZmZlcik7Ci0KLU5ESVNfU1RBVFVTIElnbXBQa3RJbmZvUXVlcnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBTcmNCdWZWQSwKLQlJTiBQTkRJU19QQUNLRVQgcFBhY2tldCwKLQlJTiBVQ0hBUiBhcGlkeCwKLQlPVVQgQk9PTEVBTiAqcEluSWdtcEdyb3VwLAotCU9VVCBQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRV9FTlRSWSAqcHBHcm91cEVudHJ5KTsKLQotTkRJU19TVEFUVVMgSWdtcFBrdENsb25lKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBORElTX1BBQ0tFVCBwUGFja2V0LAotCUlOIFVDSEFSIFF1ZUlkeCwKLQlJTiBQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRV9FTlRSWSBwR3JvdXBFbnRyeSk7Ci0KLSNlbmRpZiAvKiBfX1JUTVBfSUdNUF9TTk9PUF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvaXB2Ni5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9pcHY2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNGE1ZjIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9pcHY2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBpcHY2LmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSNpZm5kZWYgX19JUFY2X0hEUl9IXwotI2RlZmluZSBfX0lQVjZfSERSX0hfCi0KLSNkZWZpbmUgSVBWNl9BRERSX0xFTiAxNgotI2RlZmluZSBJUFY2X0hEUl9MRU4gIDQwCi0KLS8vIElQdjYgYWRkcmVzcyBkZWZpbml0aW9uCi0jZGVmaW5lIElQVjZfTElOS19MT0NBTF9BRERSX1BSRUZJWAkJMHhGRTgKLSNkZWZpbmUgSVBWNl9TSVRFX0xPQ0FMX0FERFJfUFJFRklYCQkweEZFQwotI2RlZmluZSBJUFY2X0xPQ0FMX0FERFJfUFJFRklYCQkJMHhGRTgKLSNkZWZpbmUgSVBWNl9NVUxUSUNBU1RfQUREUl9QUkVGSVgJCTB4RkYKLSNkZWZpbmUgSVBWNl9MT09QQkFDS19BRERSCQkJCTB4MQotI2RlZmluZSBJUFY2X1VOU1BFQ0lGSUVEX0FERFIJCQkweDAKLQotLy8gZGVmaW5lZCBhcyBzZXF1ZW5jZSBpbiBJUHY2IGhlYWRlcgotI2RlZmluZSBJUFY2X05FWFRfSEVBREVSX0hPUF9CWV9IT1AJCTB4MDAJLy8gMAotI2RlZmluZSBJUFY2X05FWFRfSEVBREVSX0RFU1RJTkFUSU9OCTB4M2MJLy8gNjAKLSNkZWZpbmUgSVBWNl9ORVhUX0hFQURFUl9ST1VUSU5HCQkweDJiCS8vIDQzCi0jZGVmaW5lIElQVjZfTkVYVF9IRUFERVJfRlJBR01FTlQJCTB4MmMJLy8gNDQKLSNkZWZpbmUgSVBWNl9ORVhUX0hFQURFUl9BVVRIRU5USUNBVElPTgkweDMzCS8vIDUxCi0jZGVmaW5lIElQVjZfTkVYVF9IRUFERVJfRU5DQVBTVUxBVElPTgkweDMyCS8vIDUwLCBSRkMtMjQwNgotI2RlZmluZSBJUFY2X05FWFRfSEVBREVSX05PTkUJCQkweDNiCS8vIDU5Ci0KLSNkZWZpbmUgSVBWNl9ORVhUX0hFQURFUl9UQ1AJCQkweDA2Ci0jZGVmaW5lIElQVjZfTkVYVF9IRUFERVJfVURQCQkJMHgxMQotI2RlZmluZSBJUFY2X05FWFRfSEVBREVSX0lDTVBWNgkJCTB4M2EKLQotLy8gSUNNUHY2IG1zZyB0eXBlIGRlZmluaXRpb24KLSNkZWZpbmUgSUNNUFY2X01TR19UWVBFX1JPVVRFUl9TT0xJQ0lUQVRJT04JCQkweDg1IC8vIDEzMwotI2RlZmluZSBST1VURVJfU09MSUNJVEFUSU9OX0ZJWEVEX0xFTgkJCQk4Ci0KLSNkZWZpbmUgSUNNUFY2X01TR19UWVBFX1JPVVRFUl9BRFZFUlRJU0VNRU5UCQkweDg2IC8vIDEzNAotI2RlZmluZSBST1VURVJfQURWRVJUSVNFTUVOVF9GSVhFRF9MRU4JCQkJMTYKLQotI2RlZmluZSBJQ01QVjZfTVNHX1RZUEVfTkVJR0hCT1JfU09MSUNJVEFUSU9OCQkweDg3IC8vIDEzNQotI2RlZmluZSBORUlHSEJPUl9TT0xJQ0lUQVRJT05fRklYRURfTEVOCQkJCTI0Ci0KLSNkZWZpbmUgSUNNUFY2X01TR19UWVBFX05FSUdIQk9SX0FEVkVSVElTRU1FTlQJCTB4ODggLy8gMTM2Ci0jZGVmaW5lIE5FSUdIQk9SX0FEVkVSVElTRU1FTlRfRklYRURfTEVOCQkJMjQKLQotI2RlZmluZSBJQ01QVjZfTVNHX1RZUEVfUkVESVJFQ1QJCQkJCTB4ODkgLy8gMTM3Ci0jZGVmaW5lIFJFRElSRUNUX0ZJWEVEX0xFTgkJCQkJCQk0MAotCi0vKiBJUHY2IEFkZHJlc3MgcmVsYXRlZCBzdHJ1Y3R1cmVzICovCi10eXBlZGVmIHN0cnVjdCBydF9pcHY2X2FkZHJfCi17Ci0JdW5pb24KLQl7Ci0JCVVDSEFSCWlwdjZBZGRyOFsxNl07Ci0JCVVTSE9SVAlpcHY2QWRkcjE2WzhdOwotCQlVSU5UMzIJaXB2NkFkZHIzMls0XTsKLQl9YWRkcjsKLSNkZWZpbmUgaXB2Nl9hZGRyCQkJYWRkci5pcHY2QWRkcjgKLSNkZWZpbmUgaXB2Nl9hZGRyMTYJCQlhZGRyLmlwdjZBZGRyMTYKLSNkZWZpbmUgaXB2Nl9hZGRyMzIJCQlhZGRyLmlwdjZBZGRyMzIKLX1SVF9JUFY2X0FERFIsICpQUlRfSVBWNl9BRERSOwotCi0KLSNkZWZpbmUgUFJJTlRfSVBWNl9BRERSKGlwdjZBZGRyKQlcCi0JT1NfTlRPSFMoKGlwdjZBZGRyKS5pcHY2X2FkZHIxNlswXSksIFwKLQlPU19OVE9IUygoaXB2NkFkZHIpLmlwdjZfYWRkcjE2WzFdKSwgXAotCU9TX05UT0hTKChpcHY2QWRkcikuaXB2Nl9hZGRyMTZbMl0pLCBcCi0JT1NfTlRPSFMoKGlwdjZBZGRyKS5pcHY2X2FkZHIxNlszXSksIFwKLQlPU19OVE9IUygoaXB2NkFkZHIpLmlwdjZfYWRkcjE2WzRdKSwgXAotCU9TX05UT0hTKChpcHY2QWRkcikuaXB2Nl9hZGRyMTZbNV0pLCBcCi0JT1NfTlRPSFMoKGlwdjZBZGRyKS5pcHY2X2FkZHIxNls2XSksIFwKLQlPU19OVE9IUygoaXB2NkFkZHIpLmlwdjZfYWRkcjE2WzddKQotCi0KLS8qFBRJUHY2IEhlYWRlciByZWxhdGVkIHN0cnVjdHVyZXMgKi8KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfcnRfaXB2Nl9oZHJfCi17Ci0JVUlOVDMyCQkJdmVyOjQsCi0JCQkJCXRyYWZmaWNDbGFzczo4LAotCQkJCWZsb3dMYWJlbDoyMDsKLQlVU0hPUlQJCQlwYXlsb2FkX2xlbjsKLQlVQ0hBUgkJCW5leHRIZHI7Ci0JVUNIQVIJCQlob3BMaW1pdDsKLQlSVF9JUFY2X0FERFIJc3JjQWRkcjsKLQlSVF9JUFY2X0FERFIJZHN0QWRkcjsKLX1SVF9JUFY2X0hEUiwgKlBSVF9JUFY2X0hEUjsKLQotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX3J0X2lwdjZfZXh0X2hkcl8KLXsKLQlVQ0hBUgluZXh0UHJvdG87IC8vIEluZGljYXRlIHRoZSBwcm90b2NvbCB0eXBlIG9mIG5leHQgZXh0ZW5zaW9uIGhlYWRlci4KLQlVQ0hBUglleHRIZHJMZW47IC8vIG9wdGlvbmFsIGZpZWxkIGZvciBtc2cgbGVuZ3RoIG9mIHRoaXMgZXh0ZW5zaW9uIGhlYWRlciB3aGljaCBkaWRuJ3QgaW5jbHVkZSB0aGUgZmlyc3QgIm5leHRQcm90byIgZmllbGQuCi0JVUNIQVIJb2N0ZXRzWzFdOyAvLyBob29rIHRvIGV4dGVuZCBoZWFkZXIgbWVzc2FnZSBib2R5LgotfVJUX0lQVjZfRVhUX0hEUiwgKlBSVF9JUFY2X0VYVF9IRFI7Ci0KLQotLyogSUNNUHY2IHJlbGF0ZWQgc3RydWN0dXJlcyAqLwotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ydF9pcHY2X2ljbXB2Nl9oZHJfCi17Ci0JVUNIQVIJdHlwZTsKLQlVQ0hBUgljb2RlOwotCVVTSE9SVAljaGtzdW07Ci0JVUNIQVIJb2N0ZXRzWzFdOyAvL2hvb2sgdG8gZXh0ZW5kIGhlYWRlciBtZXNzYWdlIGJvZHkuCi19UlRfSUNNUFY2X0hEUiwgKlBSVF9JQ01QVjZfSERSOwotCi0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfcnRfaWNtcDZfb3B0aW9uX2hkcl8KLXsKLQlVQ0hBUiB0eXBlOwotCVVDSEFSIGxlbjsKLQlVQ0hBUiBvY3RldFsxXTsKLX1SVF9JQ01QVjZfT1BUSU9OX0hEUiwgKlBSVF9JQ01QVjZfT1BUSU9OX0hEUjsKLQotdHlwZWRlZiBlbnVtewotLy8gRGVmaW5lZCBJQ01QdjYgT3B0aW9uIFR5cGVzLgotCVRZUEVfU1JDX0xMX0FERFIJPSAxLAotCVRZUEVfVEdUX0xMX0FERFIJPSAyLAotCVRZUEVfUFJFRklYX0lORk8JCQk9IDMsCi0JVFlQRV9SRURJUkVDVEVEX0hEUgkJCT0gNCwKLQlUWVBFX01UVQkJCQkJPSA1LAotfUlDTVBWNl9PUFRJT05TX1RZUEVfREVGOwotCi0KLXN0YXRpYyBpbmxpbmUgQk9PTEVBTiBJUHY2RXh0SGRySGFuZGxlKAotCVJUX0lQVjZfRVhUX0hEUgkJKnBFeHRIZHIsCi0JVUNIQVIJCQkJKnBQcm90bywKLQlVSU5UMzIJCQkJKnBPZmZzZXQpCi17Ci0JVUNIQVIgbmV4dFByb3RvID0gMHhmZjsKLQlVSU5UMzIgZXh0TGVuID0gMDsKLQlCT09MRUFOIHN0YXR1cyA9IFRSVUU7Ci0KLQkvL3ByaW50aygiJXMoKTogcGFyc2luZyB0aGUgRXh0ZW5zaW9uIEhlYWRlciB3aXRoIFByb3RvY29sKDB4JXgpOlxuIiwgX19GVU5DVElPTl9fLCAqcFByb3RvKTsKLQlzd2l0Y2ggKCpwUHJvdG8pCi0JewotCQljYXNlIElQVjZfTkVYVF9IRUFERVJfSE9QX0JZX0hPUDoKLQkJCS8vIElQdjZFeHRIb3BCeUhvcEhhbmRsZSgpOwotCQkJbmV4dFByb3RvID0gcEV4dEhkci0+bmV4dFByb3RvOwotCQkJZXh0TGVuID0gKHBFeHRIZHItPmV4dEhkckxlbiArIDEpICogODsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVBWNl9ORVhUX0hFQURFUl9ERVNUSU5BVElPTjoKLQkJCS8vIElQdjZFeHREZXN0SGFuZGxlKCk7Ci0JCQluZXh0UHJvdG8gPSBwRXh0SGRyLT5uZXh0UHJvdG87Ci0JCQlleHRMZW4gPSAocEV4dEhkci0+ZXh0SGRyTGVuICsgMSkgKiA4OwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJUFY2X05FWFRfSEVBREVSX1JPVVRJTkc6Ci0JCQkvLyBJUHY2RXh0Um91dGluZ0hhbmRsZSgpOwotCQkJbmV4dFByb3RvID0gcEV4dEhkci0+bmV4dFByb3RvOwotCQkJZXh0TGVuID0gKHBFeHRIZHItPmV4dEhkckxlbiArIDEpICogODsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVBWNl9ORVhUX0hFQURFUl9GUkFHTUVOVDoKLQkJCS8vIElQdjZFeHRGcmFnbWVudEhhbmRsZSgpOwotCQkJbmV4dFByb3RvID0gcEV4dEhkci0+bmV4dFByb3RvOwotCQkJZXh0TGVuID0gODsgLy8gVGhlIEZyYWdtZW50IGhlYWRlciBsZW5ndGggaXMgZml4ZWQgdG8gOCBieXRlcy4KLQkJCWJyZWFrOwotCi0JCWNhc2UgSVBWNl9ORVhUX0hFQURFUl9BVVRIRU5USUNBVElPTjoKLQkJLy8gICBJUFY2X05FWFRfSEVBREVSX0VOQ0FQU1VMQVRJT046Ci0JCQkvKgotCQkJCVRPRE86IE5vdCBzdXBwb3J0LiBGb3IgZW5jcnlwdGlvbiBpc3N1ZS4KLQkJCSovCi0JCQluZXh0UHJvdG8gPSAweEZGOwotCQkJc3RhdHVzID0gRkFMU0U7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJbmV4dFByb3RvID0gMHhGRjsKLQkJCXN0YXR1cyA9IEZBTFNFOwotCQkJYnJlYWs7Ci0JfQotCi0JKnBQcm90byA9IG5leHRQcm90bzsKLQkqcE9mZnNldCArPSBleHRMZW47Ci0JLy9wcmludGsoIiVzKCk6IG5leHRQcm90byA9IDB4JXghLCBvZmZzZXQ9MHgleCFcbiIsIF9fRlVOQ1RJT05fXywgbmV4dFByb3RvLCBvZmZzZXQpOwotCi0JcmV0dXJuIHN0YXR1czsKLQotfQotCi0jZW5kaWYgLy8gX19JUFY2X0hEUl9IXyAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9saW5rX2xpc3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvbGlua19saXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNWI2MTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9saW5rX2xpc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9fTElOS19MSVNUX0hfXwotI2RlZmluZSBfX0xJTktfTElTVF9IX18KLQotdHlwZWRlZiBzdHJ1Y3QgX0xJU1RfRU5UUlkKLXsKLQlzdHJ1Y3QgX0xJU1RfRU5UUlkgKnBOZXh0OwotfSBMSVNUX0VOVFJZLCAqUExJU1RfRU5UUlk7Ci0KLXR5cGVkZWYgc3RydWN0IF9MSVNUX0hFQURSCi17Ci0JUExJU1RfRU5UUlkgcEhlYWQ7Ci0JUExJU1RfRU5UUlkgcFRhaWw7Ci0JVUNIQVIgc2l6ZTsKLX0gTElTVF9IRUFERVIsICpQTElTVF9IRUFERVI7Ci0KLXN0YXRpYyBpbmxpbmUgVk9JRCBpbml0TGlzdCgKLQlJTiBQTElTVF9IRUFERVIgcExpc3QpCi17Ci0JcExpc3QtPnBIZWFkID0gcExpc3QtPnBUYWlsID0gTlVMTDsKLQlwTGlzdC0+c2l6ZSA9IDA7Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW5saW5lIFZPSUQgaW5zZXJ0VGFpbExpc3QoCi0JSU4gUExJU1RfSEVBREVSIHBMaXN0LAotCUlOIFBMSVNUX0VOVFJZIHBFbnRyeSkKLXsKLQlwRW50cnktPnBOZXh0ID0gTlVMTDsKLQlpZiAocExpc3QtPnBUYWlsKQotCQlwTGlzdC0+cFRhaWwtPnBOZXh0ID0gcEVudHJ5OwotCWVsc2UKLQkJcExpc3QtPnBIZWFkID0gcEVudHJ5OwotCXBMaXN0LT5wVGFpbCA9IHBFbnRyeTsKLQlwTGlzdC0+c2l6ZSsrOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW5saW5lIFBMSVNUX0VOVFJZIHJlbW92ZUhlYWRMaXN0KAotCUlOIFBMSVNUX0hFQURFUiBwTGlzdCkKLXsKLQlQTElTVF9FTlRSWSBwTmV4dDsKLQlQTElTVF9FTlRSWSBwRW50cnk7Ci0KLQlwRW50cnkgPSBwTGlzdC0+cEhlYWQ7Ci0JaWYgKHBMaXN0LT5wSGVhZCAhPSBOVUxMKQotCXsKLQkJcE5leHQgPSBwTGlzdC0+cEhlYWQtPnBOZXh0OwotCQlwTGlzdC0+cEhlYWQgPSBwTmV4dDsKLQkJaWYgKHBOZXh0ID09IE5VTEwpCi0JCQlwTGlzdC0+cFRhaWwgPSBOVUxMOwotCQlwTGlzdC0+c2l6ZS0tOwotCX0KLQlyZXR1cm4gcEVudHJ5OwotfQotCi1zdGF0aWMgaW5saW5lIGludCBnZXRMaXN0U2l6ZSgKLQlJTiBQTElTVF9IRUFERVIgcExpc3QpCi17Ci0JcmV0dXJuIHBMaXN0LT5zaXplOwotfQotCi1zdGF0aWMgaW5saW5lIFBMSVNUX0VOVFJZIGRlbEVudHJ5TGlzdCgKLQlJTiBQTElTVF9IRUFERVIgcExpc3QsCi0JSU4gUExJU1RfRU5UUlkgcEVudHJ5KQotewotCVBMSVNUX0VOVFJZIHBDdXJFbnRyeTsKLQlQTElTVF9FTlRSWSBwUHJ2RW50cnk7Ci0KLQlpZihwTGlzdC0+cEhlYWQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZihwRW50cnkgPT0gcExpc3QtPnBIZWFkKQotCXsKLQkJcEN1ckVudHJ5ID0gcExpc3QtPnBIZWFkOwotCQlwTGlzdC0+cEhlYWQgPSBwQ3VyRW50cnktPnBOZXh0OwotCi0JCWlmKHBMaXN0LT5wSGVhZCA9PSBOVUxMKQotCQkJcExpc3QtPnBUYWlsID0gTlVMTDsKLQotCQlwTGlzdC0+c2l6ZS0tOwotCQlyZXR1cm4gcEN1ckVudHJ5OwotCX0KLQotCXBQcnZFbnRyeSA9IHBMaXN0LT5wSGVhZDsKLQlwQ3VyRW50cnkgPSBwUHJ2RW50cnktPnBOZXh0OwotCXdoaWxlKHBDdXJFbnRyeSAhPSBOVUxMKQotCXsKLQkJaWYgKHBFbnRyeSA9PSBwQ3VyRW50cnkpCi0JCXsKLQkJCXBQcnZFbnRyeS0+cE5leHQgPSBwQ3VyRW50cnktPnBOZXh0OwotCi0JCQlpZihwRW50cnkgPT0gcExpc3QtPnBUYWlsKQotCQkJCXBMaXN0LT5wVGFpbCA9IHBQcnZFbnRyeTsKLQotCQkJcExpc3QtPnNpemUtLTsKLQkJCWJyZWFrOwotCQl9Ci0JCXBQcnZFbnRyeSA9IHBDdXJFbnRyeTsKLQkJcEN1ckVudHJ5ID0gcFBydkVudHJ5LT5wTmV4dDsKLQl9Ci0KLQlyZXR1cm4gcEN1ckVudHJ5OwotfQotCi0jZW5kaWYgLy8gX19fTElOS19MSVNUX0hfXyAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9tYWNfcGNpLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL21hY19wY2kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFkMDRkNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL21hY19wY2kuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1NCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgICAgICBtYWNfcGNpLmgKLQotICAgIEFic3RyYWN0OgotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLSNpZm5kZWYgX19NQUNfUENJX0hfXwotI2RlZmluZSBfX01BQ19QQ0lfSF9fCi0KLSNpbmNsdWRlICJydG1wX3R5cGUuaCIKLSNpbmNsdWRlICJydG1wX21hYy5oIgotI2luY2x1ZGUgInJ0bXBfcGh5LmgiCi0jaW5jbHVkZSAicnRtcF9pZmFjZS5oIgotI2luY2x1ZGUgInJ0bXBfZG90MTEuaCIKLQotCi0vLwotLy8gRGV2aWNlIElEICYgVmVuZG9yIElEIHJlbGF0ZWQgZGVmaW5pdGlvbnMsCi0vLyBOT1RFOiB5b3Ugc2hvdWxkIG5vdCBhZGQgdGhlIG5ldyBWZW5kb3JJRC9EZXZpY2VJRCBoZXJlIHVubGVzcyB5b3Ugbm90IHN1cmUgaXQgYmVsb25ncyB0byB3aGF0IGNoaXAuCi0vLwotI2RlZmluZSBOSUNfUENJX1ZFTkRPUl9JRAkJMHgxODE0Ci0jZGVmaW5lIFBDSUJVU19JTlRFTF9WRU5ET1IJMHg4MDg2Ci0KLSNpZiAhZGVmaW5lZChQQ0lfQ0FQX0lEX0VYUCkKLSNkZWZpbmUgUENJX0NBUF9JRF9FWFAJCQkgICAgMHgxMAotI2VuZGlmCi0jaWYgIWRlZmluZWQoUENJX0VYUF9MTktDVEwpCi0jZGVmaW5lIFBDSV9FWFBfTE5LQ1RMCQkJICAgIDB4MTAKLSNlbmRpZgotI2lmICFkZWZpbmVkKFBDSV9DTEFTU19CUklER0VfUENJKQotI2RlZmluZSBQQ0lfQ0xBU1NfQlJJREdFX1BDSQkJMHgwNjA0Ci0jZW5kaWYKLQotCi0KLQotCi0jZGVmaW5lIFRYSU5GT19TSVpFCQkJCQkJMAotI2RlZmluZSBSVE1QX1BLVF9UQUlMX1BBRERJTkcJCQkwCi0jZGVmaW5lIGZSVE1QX0FEQVBURVJfTkVFRF9TVE9QX1RYCTAKLQotI2RlZmluZSBBVVhfQ1RSTCAgICAgICAgICAgMHgxMGMKLQotLy8KLS8vIFRYIGRlc2NyaXB0b3IgZm9ybWF0LCBUeAlyaW5nLCBNZ210IFJpbmcKLS8vCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9UWERfU1RSVUMgewotCS8vIFdvcmQgMAotCVVJTlQzMgkJU0RQdHIwOwotCS8vIFdvcmQgMQotCVVJTlQzMgkJRE1BRE9ORToxOwotCVVJTlQzMgkJTGFzdFNlYzA6MTsKLQlVSU5UMzIJCVNETGVuMDoxNDsKLQlVSU5UMzIJCUJ1cnN0OjE7Ci0JVUlOVDMyCQlMYXN0U2VjMToxOwotCVVJTlQzMgkJU0RMZW4xOjE0OwotCS8vIFdvcmQgMgotCVVJTlQzMgkJU0RQdHIxOwotCS8vIFdvcmQgMwotCVVJTlQzMgkJSUNPOjE7Ci0JVUlOVDMyCQlVQ086MTsKLQlVSU5UMzIJCVRDTzoxOwotCVVJTlQzMgkJcnN2OjI7Ci0JVUlOVDMyCQlRU0VMOjI7CS8vIHNlbGVjdCBvbi1jaGlwIEZJRk8gSUQgZm9yIDJuZC1zdGFnZSBvdXRwdXQgc2NoZWR1bGVyLjA6TUdNVCwgMTpIQ0NBIDI6RURDQQotCVVJTlQzMgkJV0lWOjE7CS8vIFdpcmVsZXNzIEluZm8gVmFsaWQuIDEgaWYgRHJpdmVyIGFscmVhZHkgZmlsbCBXSSwgIG8gaWYgRE1BIG5lZWRzIHRvIGNvcHkgV0kgdG8gY29ycmVjdHBvc2l0aW9uCi0JVUlOVDMyCQlyc3YyOjI0OwotfQlUWERfU1RSVUMsICpQVFhEX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJc3RydWN0CVBBQ0tFRCBfVFhEX1NUUlVDIHsKLQkvLyBXb3JkCTAKLQlVSU5UMzIJCVNEUHRyMDsKLQkvLyBXb3JkCTEKLQlVSU5UMzIJCVNETGVuMToxNDsKLQlVSU5UMzIJCUxhc3RTZWMxOjE7Ci0JVUlOVDMyCQlCdXJzdDoxOwotCVVJTlQzMgkJU0RMZW4wOjE0OwotCVVJTlQzMgkJTGFzdFNlYzA6MTsKLQlVSU5UMzIJCURNQURPTkU6MTsKLQkvL1dvcmQyCi0JVUlOVDMyCQlTRFB0cjE7Ci0JLy9Xb3JkMwotCVVJTlQzMgkJcnN2MjoyNDsKLQlVSU5UMzIJCVdJVjoxOwkvLyBXaXJlbGVzcyBJbmZvIFZhbGlkLiAxIGlmIERyaXZlciBhbHJlYWR5IGZpbGwgV0ksICBvIGlmIERNQSBuZWVkcyB0byBjb3B5IFdJIHRvIGNvcnJlY3Rwb3NpdGlvbgotCVVJTlQzMgkJUVNFTDoyOwkvLyBzZWxlY3Qgb24tY2hpcCBGSUZPIElEIGZvciAybmQtc3RhZ2Ugb3V0cHV0IHNjaGVkdWxlci4wOk1HTVQsIDE6SENDQSAyOkVEQ0EKLQlVSU5UMzIJCXJzdjoyOwotCVVJTlQzMgkJVENPOjE7CS8vCi0JVUlOVDMyCQlVQ086MTsJLy8KLQlVSU5UMzIJCUlDTzoxOwkvLwotfQlUWERfU1RSVUMsICpQVFhEX1NUUlVDOwotI2VuZGlmCi0KLQotLy8KLS8vIFJ4IGRlc2NyaXB0b3IgZm9ybWF0LCBSeCBSaW5nCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJc3RydWN0CVBBQ0tFRCBfUlhEX1NUUlVDewotCS8vIFdvcmQgMAotCVVJTlQzMgkJU0RQMDsKLQkvLyBXb3JkIDEKLQlVSU5UMzIJCURET05FOjE7Ci0JVUlOVDMyCQlMUzA6MTsKLQlVSU5UMzIJCVNETDA6MTQ7Ci0JVUlOVDMyCQlSc3Y6MjsKLQlVSU5UMzIJCVNETDE6MTQ7Ci0JLy8gV29yZCAyCi0JVUlOVDMyCQlTRFAxOwotCS8vIFdvcmQgMwotCVVJTlQzMgkJUnN2MToxMzsKLQlVSU5UMzIJCVBsY3BSc3NpbDoxOy8vIFRvIGJlIG1vdmVkCi0JVUlOVDMyCQlQbGNwU2lnbmFsOjE7CQkvLyBUbyBiZSBtb3ZlZAotCVVJTlQzMgkJRGVjcnlwdGVkOjE7CS8vIHRoaXMgZnJhbWUgaXMgYmVpbmcgZGVjcnlwdGVkLgotCVVJTlQzMgkJQU1QRFU6MTsKLQlVSU5UMzIJCUwyUEFEOjE7Ci0JVUlOVDMyCQlSU1NJOjE7Ci0JVUlOVDMyCQlIVEM6MTsKLQlVSU5UMzIJCUFNU0RVOjE7CQkvLyByeCB3aXRoIDgwMi4zIGhlYWRlciwgbm90IDgwMi4xMSBoZWFkZXIuIG9ic29sZXRlLgotCVVJTlQzMgkJQ2lwaGVyRXJyOjI7ICAgICAgICAvLyAwOiBkZWNyeXB0aW9uIG9rYXksIDE6SUNWIGVycm9yLCAyOk1JQyBlcnJvciwgMzpLRVkgbm90IHZhbGlkCi0JVUlOVDMyCQlDcmM6MTsgICAgICAgICAgICAgIC8vIDE6IENSQyBlcnJvcgotCVVJTlQzMgkJTXlCc3M6MTsJLy8gMTogdGhpcyBmcmFtZSBiZWxvbmdzIHRvIHRoZSBzYW1lIEJTU0lECi0JVUlOVDMyCQlCY2FzdDoxOyAgICAgICAgICAgIC8vIDE6IHRoaXMgaXMgYSBicm9hZGNhc3QgZnJhbWUKLQlVSU5UMzIJCU1jYXN0OjE7ICAgICAgICAgICAgLy8gMTogdGhpcyBpcyBhIG11bHRpY2FzdCBmcmFtZQotCVVJTlQzMgkJVTJNOjE7ICAgICAgICAgICAgICAvLyAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUKLQlVSU5UMzIJCUZSQUc6MTsKLQlVSU5UMzIJCU5VTExEQVRBOjE7Ci0JVUlOVDMyCQlEQVRBOjE7Ci0JVUlOVDMyCQlCQToxOwotCi19CVJYRF9TVFJVQywgKlBSWERfU1RSVUMsIFJUMjhYWF9SWERfU1RSVUMsICpQUlQyOFhYX1JYRF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1JYRF9TVFJVQ3sKLQkvLyBXb3JkCTAKLQlVSU5UMzIJCVNEUDA7Ci0JLy8gV29yZAkxCi0JVUlOVDMyCQlTREwxOjE0OwotCVVJTlQzMgkJUnN2OjI7Ci0JVUlOVDMyCQlTREwwOjE0OwotCVVJTlQzMgkJTFMwOjE7Ci0JVUlOVDMyCQlERE9ORToxOwotCS8vIFdvcmQJMgotCVVJTlQzMgkJU0RQMTsKLQkvLyBXb3JkCTMKLQlVSU5UMzIJCUJBOjE7Ci0JVUlOVDMyCQlEQVRBOjE7Ci0JVUlOVDMyCQlOVUxMREFUQToxOwotCVVJTlQzMgkJRlJBRzoxOwotCVVJTlQzMgkJVTJNOjE7ICAgICAgICAgICAgICAvLyAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUKLQlVSU5UMzIJCU1jYXN0OjE7ICAgICAgICAgICAgLy8gMTogdGhpcyBpcyBhIG11bHRpY2FzdCBmcmFtZQotCVVJTlQzMgkJQmNhc3Q6MTsgICAgICAgICAgICAvLyAxOiB0aGlzIGlzIGEgYnJvYWRjYXN0IGZyYW1lCi0JVUlOVDMyCQlNeUJzczoxOwkvLyAxOiB0aGlzIGZyYW1lIGJlbG9uZ3MgdG8gdGhlIHNhbWUgQlNTSUQKLQlVSU5UMzIJCUNyYzoxOyAgICAgICAgICAgICAgLy8gMTogQ1JDIGVycm9yCi0JVUlOVDMyCQlDaXBoZXJFcnI6MjsgICAgICAgIC8vIDA6IGRlY3J5cHRpb24gb2theSwgMTpJQ1YgZXJyb3IsIDI6TUlDIGVycm9yLCAzOktFWSBub3QgdmFsaWQKLQlVSU5UMzIJCUFNU0RVOjE7CQkvLyByeCB3aXRoIDgwMi4zIGhlYWRlciwgbm90IDgwMi4xMSBoZWFkZXIuCi0JVUlOVDMyCQlIVEM6MTsKLQlVSU5UMzIJCVJTU0k6MTsKLQlVSU5UMzIJCUwyUEFEOjE7Ci0JVUlOVDMyCQlBTVBEVToxOwotCVVJTlQzMgkJRGVjcnlwdGVkOjE7CS8vIHRoaXMgZnJhbWUgaXMgYmVpbmcgZGVjcnlwdGVkLgotCVVJTlQzMgkJUGxjcFNpZ25hbDoxOwkJLy8gVG8gYmUgbW92ZWQKLQlVSU5UMzIJCVBsY3BSc3NpbDoxOy8vIFRvIGJlIG1vdmVkCi0JVUlOVDMyCQlSc3YxOjEzOwotfQlSWERfU1RSVUMsICpQUlhEX1NUUlVDLCBSVDI4WFhfUlhEX1NUUlVDLCAqUFJUMjhYWF9SWERfU1RSVUM7Ci0jZW5kaWYKLQotI2lmZGVmIEJJR19FTkRJQU4KLXR5cGVkZWYgdW5pb24gX1RYX0FUVEVOVUFUSU9OX0NUUkxfU1RSVUMKLXsKLQlzdHJ1Y3QKLQl7Ci0JCVVMT05HCVJlc2VydmUxOjIwOwotCQlVTE9ORwlQQ0lFX1BIWV9UWF9BVFRFTl9FTjoxOwotCQlVTE9ORwlQQ0lFX1BIWV9UWF9BVFRFTl9WQUxVRTozOwotCQlVTE9ORwlSZXNlcnZlMjo3OwotCQlVTE9ORwlSRl9JU09MQVRJT05fRU5BQkxFOjE7Ci0JfSBmaWVsZDsKLQotCVVMT05HCXdvcmQ7Ci19IFRYX0FUVEVOVUFUSU9OX0NUUkxfU1RSVUMsICpQVFhfQVRURU5VQVRJT05fQ1RSTF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmIHVuaW9uIF9UWF9BVFRFTlVBVElPTl9DVFJMX1NUUlVDIHsKLQlzdHJ1Y3QKLQl7Ci0JCVVMT05HCVJGX0lTT0xBVElPTl9FTkFCTEU6MTsKLQkJVUxPTkcJUmVzZXJ2ZTI6NzsKLQkJVUxPTkcJUENJRV9QSFlfVFhfQVRURU5fVkFMVUU6MzsKLQkJVUxPTkcJUENJRV9QSFlfVFhfQVRURU5fRU46MTsKLQkJVUxPTkcJUmVzZXJ2ZTE6MjA7Ci0JfSBmaWVsZDsKLQotCVVMT05HCXdvcmQ7Ci19IFRYX0FUVEVOVUFUSU9OX0NUUkxfU1RSVUMsICpQVFhfQVRURU5VQVRJT05fQ1RSTF9TVFJVQzsKLSNlbmRpZgotLyogLS0tLS0tLS0tLS0tLS0tLS0gRUVQUk9NIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLy8gODA1MSBmaXJtd2FyZSBpbWFnZSBmb3IgUlQyODYwIC0gYmFzZSBhZGRyZXNzID0gMHg0MDAwCi0jZGVmaW5lIEZJUk1XQVJFX0lNQUdFX0JBU0UgICAgIDB4MjAwMAotI2RlZmluZSBNQVhfRklSTVdBUkVfSU1BR0VfU0laRSAweDIwMDAgICAgLy8gOGtieXRlCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0gRnJpbXdhcmUgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLwotI2RlZmluZSBSVE1QX1dSSVRFX0ZJUk1XQVJFKF9wQWQsIF9wRndJbWFnZSwgX0Z3TGVuKQkJCVwKLQlkb3sJCQkJCQkJCVwKLQkJVUxPTkcJX2ksIF9maXJtOwkJCQkJXAotCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgUEJGX1NZU19DVFJMLCAweDEwMDAwKTsJCVwKLQkJCQkJCQkJCVwKLQkJZm9yKF9pPTA7IF9pPF9Gd0xlbjsgX2krPTQpCQkJCVwKLQkJewkJCQkJCQlcCi0JCQlfZmlybSA9IF9wRndJbWFnZVtfaV0gKwkJCQlcCi0JCQkgICAoX3BGd0ltYWdlW19pKzNdIDw8IDI0KSArCQkJXAotCQkJICAgKF9wRndJbWFnZVtfaSsyXSA8PCAxNikgKwkJCVwKLQkJCSAgIChfcEZ3SW1hZ2VbX2krMV0gPDwgOCk7CQkJXAotCQkJUlRNUF9JT19XUklURTMyKF9wQWQsIEZJUk1XQVJFX0lNQUdFX0JBU0UgKyBfaSwgX2Zpcm0pOwlcCi0JCX0JCQkJCQkJXAotCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgUEJGX1NZU19DVFJMLCAweDAwMDAwKTsJCVwKLQkJUlRNUF9JT19XUklURTMyKF9wQWQsIFBCRl9TWVNfQ1RSTCwgMHgwMDAwMSk7CQlcCi0JCQkJCQkJCQlcCi0JCS8qIGluaXRpYWxpemUgQkJQIFIvVyBhY2Nlc3MgYWdlbnQgKi8JCQlcCi0JCVJUTVBfSU9fV1JJVEUzMihfcEFkLCBIMk1fQkJQX0FHRU5ULCAwKTsJCVwKLQkJUlRNUF9JT19XUklURTMyKF9wQWQsIEgyTV9NQUlMQk9YX0NTUiwgMCk7CQlcCi0JfXdoaWxlKDApCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0gVFggUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLwotI2RlZmluZSBSVE1QX1NUQVJUX0RFUVVFVUUocEFkLCBRdWVJZHgsIGlycUZsYWdzKQkJZG97fXdoaWxlKDApCi0jZGVmaW5lIFJUTVBfU1RPUF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBpcnFGbGFncykJCWRve313aGlsZSgwKQotCi0KLSNkZWZpbmUgUlRNUF9IQVNfRU5PVUdIX0ZSRUVfREVTQyhwQWQsIHBUeEJsaywgZnJlZU51bSwgcFBhY2tldCkgXAotCQkoKGZyZWVOdW0pID49IChVTE9ORykocFR4QmxrLT5Ub3RhbEZyYWdOdW0gKyBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpICsgMykpIC8qIHJvdWdoIGVzdGltYXRlIHdlIHdpbGwgdXNlIDMgbW9yZSBkZXNjcmlwdG9yLiAqLwotI2RlZmluZSBSVE1QX1JFTEVBU0VfREVTQ19SRVNPVVJDRShwQWQsIFF1ZUlkeCkJXAotCQlkb3t9d2hpbGUoMCkKLQotI2RlZmluZSBORUVEX1FVRVVFX0JBQ0tfRk9SX0FHRyhwQWQsIFF1ZUlkeCwgZnJlZU51bSwgX1R4RnJhbWVUeXBlKSBcCi0JCSgoKGZyZWVOdW0gIT0gKFRYX1JJTkdfU0laRS0xKSkgJiYgKHBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0uTnVtYmVyID09IDApKSB8fCAoZnJlZU51bTwzKSkKLQkJLy8oKChmcmVlTnVtKSAhPSAoVFhfUklOR19TSVpFLTEpKSAmJiAocEFkLT5UeFN3UXVldWVbUXVlSWR4XS5OdW1iZXIgPT0gMSAvKjAqLykpCi0KLQotI2RlZmluZSBIQUxfS2lja091dE1nbXRUeChfcEFkLCBfUXVlSWR4LCBfcFBhY2tldCwgX3BTcmNCdWZWQSwgX1NyY0J1ZkxlbikJXAotCQkJUnRtcFBDSU1nbXRLaWNrT3V0KF9wQWQsIF9RdWVJZHgsIF9wUGFja2V0LCBfcFNyY0J1ZlZBLCBfU3JjQnVmTGVuKQotCi0jZGVmaW5lIEhBTF9Xcml0ZVN1YlR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGJJc0xhc3QsIHBGcmVlTnVtYmVyKQlcCi0JCS8qIFJ0bXBQQ0lfV3JpdGVTdWJUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBiSXNMYXN0LCBwRnJlZU51bWJlcikqLwotCi0jZGVmaW5lIEhBTF9Xcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssYklzTGFzdCwgcEZyZWVOdW1iZXIpCVwKLQkJCVJ0bXBQQ0lfV3JpdGVTaW5nbGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBiSXNMYXN0LCBwRnJlZU51bWJlcikKLQotI2RlZmluZSBIQUxfV3JpdGVGcmFnVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhZ051bSwgcEZyZWVOdW1iZXIpIFwKLQkJCVJ0bXBQQ0lfV3JpdGVGcmFnVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhZ051bSwgcEZyZWVOdW1iZXIpCi0KLSNkZWZpbmUgSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLGZyYW1lTnVtLCBwRnJlZU51bWJlcikJXAotCQkJUnRtcFBDSV9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhbWVOdW0sIHBGcmVlTnVtYmVyKQotCi0jZGVmaW5lIEhBTF9GaW5hbFdyaXRlVHhSZXNvdXJjZShfcEFkLCBfcFR4QmxrLCBfVG90YWxNUERVU2l6ZSwgX0ZpcnN0VHhJZHgpCVwKLQkJCVJ0bXBQQ0lfRmluYWxXcml0ZVR4UmVzb3VyY2UoX3BBZCwgX3BUeEJsaywgX1RvdGFsTVBEVVNpemUsIF9GaXJzdFR4SWR4KQotCi0jZGVmaW5lIEhBTF9MYXN0VHhJZHgoX3BBZCwgX1F1ZUlkeCxfTGFzdFR4SWR4KSBcCi0JCQkvKlJ0bXBQQ0lEYXRhTGFzdFR4SWR4KF9wQWQsIF9RdWVJZHgsX0xhc3RUeElkeCkqLwotCi0jZGVmaW5lIEhBTF9LaWNrT3V0VHgoX3BBZCwgX3BUeEJsaywgX1F1ZUlkeCkJXAotCQkJUlRNUF9JT19XUklURTMyKChfcEFkKSwgVFhfQ1RYX0lEWDArKChfUXVlSWR4KSoweDEwKSwgKF9wQWQpLT5UeFJpbmdbKF9RdWVJZHgpXS5UeENwdUlkeCkKLS8qCQkJUnRtcFBDSURhdGFLaWNrT3V0KF9wQWQsIF9wVHhCbGssIF9RdWVJZHgpKi8KLQotI2RlZmluZSBIQUxfS2lja091dE51bGxGcmFtZVR4KF9wQWQsIF9RdWVJZHgsIF9wTnVsbEZyYW1lLCBfZnJhbWVMZW4pCVwKLQkJCU1pbmlwb3J0TU1SZXF1ZXN0KF9wQWQsIF9RdWVJZHgsIF9wTnVsbEZyYW1lLCBfZnJhbWVMZW4pCi0KLSNkZWZpbmUgR0VUX1RYUklOR19GUkVFTk8oX3BBZCwgX1F1ZUlkeCkgXAotCShfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhTd0ZyZWVJZHggPiBfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhDcHVJZHgpCT8gXAotCQkJKF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeFN3RnJlZUlkeCAtIF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeENwdUlkeCAtIDEpIFwKLQkJCSA6CVwKLQkJCShfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhTd0ZyZWVJZHggKyBUWF9SSU5HX1NJWkUgLSBfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhDcHVJZHggLSAxKTsKLQotCi0jZGVmaW5lIEdFVF9NR01UUklOR19GUkVFTk8oX3BBZCkgXAotCShfcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA+IF9wQWQtPk1nbXRSaW5nLlR4Q3B1SWR4KQk/IFwKLQkJCShfcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCAtIF9wQWQtPk1nbXRSaW5nLlR4Q3B1SWR4IC0gMSkgXAotCQkJIDoJXAotCQkJKF9wQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ICsgTUdNVF9SSU5HX1NJWkUgLSBfcEFkLT5NZ210UmluZy5UeENwdUlkeCAtIDEpOwotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tIFJYIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLSBBU0lDIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8vIHJlc2V0IE1BQyBvZiBhIHN0YXRpb24gZW50cnkgdG8gMHgwMDAwMDAwMDAwMDAKLSNkZWZpbmUgUlRNUF9TVEFfRU5UUllfTUFDX1JFU0VUKHBBZCwgV2NpZCkJXAotCUFzaWNEZWxXY2lkVGFiKHBBZCwgV2NpZCk7Ci0KLS8vIGFkZCB0aGlzIGVudHJ5IGludG8gQVNJQyBSWCBXQ0lEIHNlYXJjaCB0YWJsZQotI2RlZmluZSBSVE1QX1NUQV9FTlRSWV9BREQocEFkLCBwRW50cnkpCQlcCi0JQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKHBBZCwgcEVudHJ5LT5BaWQsIHBFbnRyeS0+QWRkcik7Ci0KLS8vIGFkZCBieSBqb2hubGksIGZpeCAiaW5faW50ZXJydXB0IiBlcnJvciB3aGVuIGNhbGwgIk1hY1RhYmxlRGVsZXRlRW50cnkiIGluIFJ4IHRhc2tsZXQKLS8vIFNldCBNQUMgcmVnaXN0ZXIgdmFsdWUgYWNjb3JkaW5nIG9wZXJhdGlvbiBtb2RlCi0jZGVmaW5lIFJUTVBfVVBEQVRFX1BST1RFQ1QocEFkKQlcCi0JQXNpY1VwZGF0ZVByb3RlY3QocEFkLCAwLCAoQUxMTl9TRVRQUk9URUNUKSwgVFJVRSwgMCk7Ci0vLyBlbmQgam9obmxpCi0KLS8vIHJlbW92ZSBQYWlyLXdpc2Uga2V5IG1hdGVyaWFsIGZyb20gQVNJQwotI2RlZmluZSBSVE1QX1NUQV9FTlRSWV9LRVlfREVMKHBBZCwgQnNzSWR4LCBXY2lkKQlcCi0JQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkLCBCc3NJZHgsIChVQ0hBUilXY2lkKTsKLQotLy8gYWRkIENsaWVudCBzZWN1cml0eSBpbmZvcm1hdGlvbiBpbnRvIEFTSUMgV0NJRCB0YWJsZSBhbmQgSVZFSVYgdGFibGUKLSNkZWZpbmUgUlRNUF9TVEFfU0VDVVJJVFlfSU5GT19BREQocEFkLCBhcGlkeCwgS2V5SUQsIHBFbnRyeSkJCVwKLQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgYXBpZHgsIEtleUlELAkJCVwKLQkJCQkJCQlwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLkNpcGhlckFsZywgcEVudHJ5KTsKLQotI2RlZmluZSBSVE1QX1NFQ1VSSVRZX0tFWV9BREQocEFkLCBhcGlkeCwgS2V5SUQsIHBFbnRyeSkJCVwKLQl7CS8qIHVwZGF0ZSBwYWlyd2lzZSBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlICovCVwKLQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgYXBpZHgsIEtleUlELAkJCQkJXAotCQkJCQkJICBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLkNpcGhlckFsZywJCVwKLQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5LZXksCQkJCVwKLQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5UeE1pYywJCQlcCi0JCQkJCQkgIHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJRF0uUnhNaWMpOwkJCVwKLQkJLyogdXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlICovCQkJXAotCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgYXBpZHgsIEtleUlELAkJCQkJXAotCQkJCQkJICBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLkNpcGhlckFsZywJCVwKLQkJCQkJCSAgcEVudHJ5KTsgfQotCi0KLS8vIEluc2VydCB0aGUgQkEgYml0bWFwIHRvIEFTSUMgZm9yIHRoZSBXY2lkIGVudHJ5Ci0jZGVmaW5lIFJUTVBfQUREX0JBX1NFU1NJT05fVE9fQVNJQyhfcEFkLCBfQWlkLCBfVElEKQlcCi0JCWRvewkJCQkJXAotCQkJVUlOVDMyCV9WYWx1ZSA9IDAsIF9PZmZzZXQ7CQkJCQlcCi0JCQlfT2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIChfQWlkKSAqIEhXX1dDSURfRU5UUllfU0laRSArIDQ7CVwKLQkJCVJUTVBfSU9fUkVBRDMyKChfcEFkKSwgX09mZnNldCwgJl9WYWx1ZSk7XAotCQkJX1ZhbHVlIHw9ICgweDEwMDAwPDwoX1RJRCkpOwlcCi0JCQlSVE1QX0lPX1dSSVRFMzIoKF9wQWQpLCBfT2Zmc2V0LCBfVmFsdWUpO1wKLQkJfXdoaWxlKDApCi0KLQotLy8gUmVtb3ZlIHRoZSBCQSBiaXRtYXAgZnJvbSBBU0lDIGZvciB0aGUgV2NpZCBlbnRyeQotLy8JCWJpdG1hcCBmaWVsZCBzdGFydHMgYXQgMHgxMDAwMCBpbiBBU0lDIFdDSUQgdGFibGUKLSNkZWZpbmUgUlRNUF9ERUxfQkFfU0VTU0lPTl9GUk9NX0FTSUMoX3BBZCwgX1djaWQsIF9USUQpCQkJCVwKLQkJZG97CQkJCQkJCQlcCi0JCQlVSU5UMzIJX1ZhbHVlID0gMCwgX09mZnNldDsJCQkJXAotCQkJX09mZnNldCA9IE1BQ19XQ0lEX0JBU0UgKyAoX1djaWQpICogSFdfV0NJRF9FTlRSWV9TSVpFICsgNDsJXAotCQkJUlRNUF9JT19SRUFEMzIoKF9wQWQpLCBfT2Zmc2V0LCAmX1ZhbHVlKTsJCQlcCi0JCQlfVmFsdWUgJj0gKH4oMHgxMDAwMCA8PCAoX1RJRCkpKTsJCQkJXAotCQkJUlRNUF9JT19XUklURTMyKChfcEFkKSwgX09mZnNldCwgX1ZhbHVlKTsJCQlcCi0JCX13aGlsZSgwKQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tIEludGVyZmFjZSBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8vCi0vLyBFbmFibGUgJiBEaXNhYmxlIE5JQyBpbnRlcnJ1cHQgdmlhIHdyaXRpbmcgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIKLS8vIFNpbmNlIGl0IHVzZSBBREFQVEVSIHN0cnVjdHVyZSwgaXQgaGF2ZSB0byBiZSBwdXQgYWZ0ZXIgc3RydWN0dXJlIGRlZmluaXRpb24uCi0vLwotI2RlZmluZSBSVE1QX0FTSUNfSU5URVJSVVBUX0RJU0FCTEUoX3BBZCkJCVwKLQlkb3sJCQlcCi0JCVJUTVBfSU9fV1JJVEUzMigoX3BBZCksIElOVF9NQVNLX0NTUiwgMHgwKTsgICAgIC8qIDA6IGRpc2FibGUgKi8JXAotCQlSVE1QX0NMRUFSX0ZMQUcoKF9wQWQpLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpOwkJXAotCX13aGlsZSgwKQotCi0jZGVmaW5lIFJUTVBfQVNJQ19JTlRFUlJVUFRfRU5BQkxFKF9wQWQpXAotCWRvewkJCQlcCi0JCVJUTVBfSU9fV1JJVEUzMigoX3BBZCksIElOVF9NQVNLX0NTUiwgKF9wQWQpLT5pbnRfZW5hYmxlX3JlZyAvKkRFTEFZSU5UTUFTSyovKTsgICAgIC8qIDE6ZW5hYmxlICovCVwKLQkJUlRNUF9TRVRfRkxBRygoX3BBZCksIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSk7CVwKLQl9d2hpbGUoMCkKLQotCi0jZGVmaW5lIFJUTVBfSVJRX0lOSVQocEFkKQlcCi0JewlwQWQtPmludF9lbmFibGVfcmVnID0gKChERUxBWUlOVE1BU0spIHwJCVwKLQkJCQkJKFJ4SU5UfFR4RGF0YUludHxUeE1nbXRJbnQpKSAmIH4oMHgwMyk7CVwKLQkJcEFkLT5pbnRfZGlzYWJsZV9tYXNrID0gMDsJCQkJCQlcCi0JCXBBZC0+aW50X3BlbmRpbmcgPSAwOyB9Ci0KLSNkZWZpbmUgUlRNUF9JUlFfRU5BQkxFKHBBZCkJCQkJCVwKLQl7CS8qIGNsZWFyIGdhcmJhZ2UgaW50cyAqLwkJCVwKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX1NPVVJDRV9DU1IsIDB4ZmZmZmZmZmYpO1wKLQkJUlRNUF9BU0lDX0lOVEVSUlVQVF9FTkFCTEUocEFkKTsgfQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tIE1MTUUgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLwotI2RlZmluZSBSVE1QX01MTUVfSEFORExFUihwQWQpCQkJTWxtZUhhbmRsZXIocEFkKQotCi0jZGVmaW5lIFJUTVBfTUxNRV9QUkVfU0FOSVRZX0NIRUNLKHBBZCkKLQotI2RlZmluZSBSVE1QX01MTUVfU1RBX1FVSUNLX1JTUF9XQUtFX1VQKHBBZCkJXAotCQlSVE1QU2V0VGltZXIoJnBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyLCAxMDApOwotCi0jZGVmaW5lIFJUTVBfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZCkJXAotCQlNbG1lUmVzdGFydFN0YXRlTWFjaGluZShwQWQpCi0KLSNkZWZpbmUgUlRNUF9IQU5ETEVfQ09VTlRFUl9NRUFTVVJFKF9wQWQsIF9wRW50cnkpXAotCQlIYW5kbGVDb3VudGVyTWVhc3VyZShfcEFkLCBfcEVudHJ5KQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLSBQb3dlciBTYXZlIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSNkZWZpbmUgUlRNUF9QU19QT0xMX0VOUVVFVUUocEFkKQkJCQlFbnF1ZXVlUHNQb2xsKHBBZCkKLQotCi0vLyBGb3IgUlRNUFBDSWVQb3dlckxpbmtDdHJsUmVzdG9yZSAoKSBmdW5jdGlvbgotI2RlZmluZSBSRVNUT1JFX0hBTFQJCTEKLSNkZWZpbmUgUkVTVE9SRV9XQUtFVVAJCTIKLSNkZWZpbmUgUkVTVE9SRV9DTE9TRSAgICAgICAgICAgMwotCi0jZGVmaW5lIFBvd2VyU2FmZUNJRAkJMQotI2RlZmluZSBQb3dlclJhZGlvT2ZmQ0lECTIKLSNkZWZpbmUgUG93ZXJXYWtlQ0lECQkzCi0jZGVmaW5lIENJRDBNQVNLCQkweDAwMDAwMGZmCi0jZGVmaW5lIENJRDFNQVNLCQkweDAwMDBmZjAwCi0jZGVmaW5lIENJRDJNQVNLCQkweDAwZmYwMDAwCi0jZGVmaW5lIENJRDNNQVNLCQkweGZmMDAwMDAwCi0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2RlZmluZSBSVE1QX1NUQV9GT1JDRV9XQUtFVVAocEFkLCBiRnJvbVR4KSBcCi0gICAgUlQyOHh4UGNpU3RhQXNpY0ZvcmNlV2FrZXVwKHBBZCwgYkZyb21UeCk7Ci0KLSNkZWZpbmUgUlRNUF9TVEFfU0xFRVBfVEhFTl9BVVRPX1dBS0VVUChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApIFwKLSAgICBSVDI4eHhQY2lTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApOwotCi0jZGVmaW5lIFJUTVBfU0VUX1BTTV9CSVQoX3BBZCwgX3ZhbCkgXAotCU1sbWVTZXRQc21CaXQoX3BBZCwgX3ZhbCk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNkZWZpbmUgUlRNUF9NTE1FX1JBRElPX09OKHBBZCkgXAotICAgIFJUMjh4eFBjaU1sbWVSYWRpb09uKHBBZCk7Ci0KLSNkZWZpbmUgUlRNUF9NTE1FX1JBRElPX09GRihwQWQpIFwKLSAgICBSVDI4eHhQY2lNbG1lUmFkaW9PRkYocEFkKTsKLQotI2VuZGlmIC8vX19NQUNfUENJX0hfXyAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9tbG1lLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL21sbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzNjc0My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL21sbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNjAgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBtbG1lLmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlKb2huIENoYW5nCTIwMDMtMDgtMjgJCUNyZWF0ZWQKLQlKb2huIENoYW5nICAyMDA0LTA5LTA2ICAgICAgbW9kaWZpZWQgZm9yIFJUMjYwMAotKi8KLSNpZm5kZWYgX19NTE1FX0hfXwotI2RlZmluZSBfX01MTUVfSF9fCi0KLSNpbmNsdWRlICJydG1wX2RvdDExLmgiCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0vLyBtYXhpbXVtIHN1cHBvcnRlZCBjYXBhYmlsaXR5IGluZm9ybWF0aW9uIC0KLS8vIEVTUywgSUJTUywgUHJpdmFjeSwgU2hvcnQgUHJlYW1ibGUsIFNwZWN0cnVtIG1nbXQsIFNob3J0IFNsb3QKLSNkZWZpbmUgU1VQUE9SVEVEX0NBUEFCSUxJVFlfSU5GTyAgIDB4MDUzMwotCi0jZGVmaW5lIEVORF9PRl9BUkdTICAgICAgICAgICAgICAgICAtMQotI2RlZmluZSBMRlNSX01BU0sgICAgICAgICAgICAgICAgICAgMHg4MDAwMDA1NwotI2RlZmluZSBNTE1FX1RBU0tfRVhFQ19JTlRWICAgICAgICAgMTAwLyoyMDAqLyAgICAgICAvLwotI2RlZmluZSBMRUFEX1RJTUUgICAgICAgICAgICAgICAgICAgNQotI2RlZmluZSBNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSAgICAgICAxMCAgLyo1Ki8gICAgICAgLy8gTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgKiBNTE1FX1RBU0tfRVhFQ19JTlRWID0gMSBzZWMKLSNkZWZpbmUgUkVPUkRFUl9FWEVDX0lOVFYJCTEwMCAgICAgICAvLyAwLjEgc2VjCi0vLyNkZWZpbmUgVEJUVF9QUkVMT0FEX1RJTUUgICAgICAgICAzODQgICAgICAgIC8vIHVzZWMuIExvbWdQcmVhbWJsZSArIDI0LWJ5dGUgYXQgMU1icHMKLQotLy8gVGhlIGRlZmluaXRpb24gb2YgUmFkYXIgZGV0ZWN0aW9uIGR1cmF0aW9uIHJlZ2lvbgotI2RlZmluZSBDRQkJMAotI2RlZmluZSBGQ0MJCTEKLSNkZWZpbmUgSkFQCQkyCi0jZGVmaW5lIEpBUF9XNTMJMwotI2RlZmluZSBKQVBfVzU2CTQKLSNkZWZpbmUgTUFYX1JEX1JFR0lPTiA1Ci0KLSNkZWZpbmUgQkVBQ09OX0xPU1RfVElNRSAgICAgICAgICAgIDQgKiBPU19IWiAgICAvLyAyMDQ4IG1zZWMgPSAyIHNlYwotCi0jZGVmaW5lIERMU19USU1FT1VUICAgICAgICAgICAgICAgICAxMjAwICAgICAgLy8gdW5pdDogbXNlYwotI2RlZmluZSBBVVRIX1RJTUVPVVQgICAgICAgICAgICAgICAgMzAwICAgICAgIC8vIHVuaXQ6IG1zZWMKLSNkZWZpbmUgQVNTT0NfVElNRU9VVCAgICAgICAgICAgICAgIDMwMCAgICAgICAvLyB1bml0OiBtc2VjCi0jZGVmaW5lIEpPSU5fVElNRU9VVCAgICAgICAgICAgICAgICAyMDAwICAgICAgICAvLyB1bml0OiBtc2VjCi0jZGVmaW5lIFNIT1JUX0NIQU5ORUxfVElNRSAgICAgICAgICA5MCAgICAgICAgLy8gdW5pdDogbXNlYwotI2RlZmluZSBNSU5fQ0hBTk5FTF9USU1FICAgICAgICAgICAgMTEwICAgICAgICAvLyB1bml0OiBtc2VjLCBmb3IgZHVhbCBiYW5kIHNjYW4KLSNkZWZpbmUgTUFYX0NIQU5ORUxfVElNRSAgICAgICAgICAgIDE0MCAgICAgICAvLyB1bml0OiBtc2VjLCBmb3Igc2luZ2xlIGJhbmQgc2NhbgotI2RlZmluZQlGQVNUX0FDVElWRV9TQ0FOX1RJTUUJICAgIDMwCQkgIC8vIEFjdGl2ZSBzY2FuIHdhaXRpbmcgZm9yIHByb2JlIHJlc3BvbnNlIHRpbWUKLSNkZWZpbmUgQ1dfTUlOX0lOX0JJVFMgICAgICAgICAgICAgIDQgICAgICAgICAvLyBhY3R1YWwgQ3dNaW4gPSAyXkNXX01JTl9JTl9CSVRTIC0gMQotI2RlZmluZSBMSU5LX0RPV05fVElNRU9VVCAgICAgICAgICAgMjAwMDAgICAgICAvLyB1bml0OiBtc2VjCi0jZGVmaW5lIEFVVE9fV0FLRVVQX1RJTUVPVVQJCQk3MAkJCS8vdW5pdDogbXNlYwotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNkZWZpbmUgQ1dfTUFYX0lOX0JJVFMgICAgICAgICAgICAgIDEwICAgICAgICAvLyBhY3R1YWwgQ3dNYXggPSAyXkNXX01BWF9JTl9CSVRTIC0gMQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKLWV4dGVybiBVSU5UMzIgQ1dfTUFYX0lOX0JJVFM7Ci0jZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KLQotLy8gTm90ZTogUlNTSV9UT19EQk1fT0ZGU0VUIGhhcyBiZWVuIGNoYW5nZWQgdG8gdmFyaWFibGUgZm9yIG5ldyBSRiAoMjAwNC0wNzIwKS4KLS8vIFNIb3VsZCBub3QgcmVmZXIgdG8gdGhpcyBjb25zdGFudCBhbnltb3JlCi0vLyNkZWZpbmUgUlNTSV9UT19EQk1fT0ZGU0VUICAgICAgICAgIDEyMCAvLyBmb3IgUlQyNTMwIFJTU0ktMTE1ID0gZEJtCi0jZGVmaW5lIFJTU0lfRk9SX01JRF9UWF9QT1dFUiAgICAgICAtNTUgIC8vIC01NSBkYiBpcyBjb25zaWRlcmVkIG1pZC1kaXN0YW5jZQotI2RlZmluZSBSU1NJX0ZPUl9MT1dfVFhfUE9XRVIgICAgICAgLTQ1ICAvLyAtNDUgZGIgaXMgY29uc2lkZXJlZCB2ZXJ5IHNob3J0IGRpc3RhbmNlIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsaWdpYmxlIHRvIHVzZSBhIGxvd2VyIFRYIHBvd2VyCi0jZGVmaW5lIFJTU0lfRk9SX0xPV0VTVF9UWF9QT1dFUiAgICAtMzAKLS8vI2RlZmluZSBNSURfVFhfUE9XRVJfREVMVEEgICAgICAgICAgMCAgIC8vIDAgZGIgZnJvbSBmdWxsIFRYIHBvd2VyIHVwb24gbWlkLWRpc3RhbmNlIHRvIEFQCi0jZGVmaW5lIExPV19UWF9QT1dFUl9ERUxUQSAgICAgICAgICA2ICAgIC8vIC0zIGRiIGZyb20gZnVsbCBUWCBwb3dlciB1cG9uIHZlcnkgc2hvcnQgZGlzdGFuY2UuIDEgZ3JhZGUgaXMgMC41IGRiCi0jZGVmaW5lIExPV0VTVF9UWF9QT1dFUl9ERUxUQSAgICAgICAxNiAgIC8vIC04IGRiIGZyb20gZnVsbCBUWCBwb3dlciB1cG9uIHNob3J0ZXN0IGRpc3RhbmNlLiAxIGdyYWRlIGlzIDAuNSBkYgotCi0jZGVmaW5lIFJTU0lfVFJJR0dFUkVEX1VQT05fQkVMT1dfVEhSRVNIT0xEICAgICAwCi0jZGVmaW5lIFJTU0lfVFJJR0dFUkVEX1VQT05fRVhDQ0VFRF9USFJFU0hPTEQgICAxCi0jZGVmaW5lIFJTU0lfVEhSRVNIT0xEX0ZPUl9ST0FNSU5HICAgICAgICAgICAgICAyNQotI2RlZmluZSBSU1NJX0RFTFRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQotCi0vLyBDaGFubmVsIFF1YWxpdHkgSW5kaWNhdGlvbgotI2RlZmluZSBDUUlfSVNfR09PRChjcWkpICAgICAgICAgICAgKChjcWkpID49IDUwKQotLy8jZGVmaW5lIENRSV9JU19GQUlSKGNxaSkgICAgICAgICAgKCgoY3FpKSA+PSAyMCkgJiYgKChjcWkpIDwgNTApKQotI2RlZmluZSBDUUlfSVNfUE9PUihjcWkpICAgICAgICAgICAgKGNxaSA8IDUwKSAgLy8oKChjcWkpID49IDUpICYmICgoY3FpKSA8IDIwKSkKLSNkZWZpbmUgQ1FJX0lTX0JBRChjcWkpICAgICAgICAgICAgIChjcWkgPCA1KQotI2RlZmluZSBDUUlfSVNfREVBRChjcWkpICAgICAgICAgICAgKGNxaSA9PSAwKQotCi0vLyB3ZWlnaHRpbmcgZmFjdG9yIHRvIGNhbGN1bGF0ZSBDaGFubmVsIHF1YWxpdHksIHRvdGFsIHNob3VsZCBiZSAxMDAlCi0jZGVmaW5lIFJTU0lfV0VJR0hUSU5HICAgICAgICAgICAgICAgICAgIDUwCi0jZGVmaW5lIFRYX1dFSUdIVElORyAgICAgICAgICAgICAgICAgICAgIDMwCi0jZGVmaW5lIFJYX1dFSUdIVElORyAgICAgICAgICAgICAgICAgICAgIDIwCi0KLS8vI2RlZmluZSBQRUVSX0tFWV9OT1RfVVNFRCAgICAgICAgICAgICAgICAwCi0vLyNkZWZpbmUgUEVFUl9LRVlfNjRfQklUICAgICAgICAgICAgICAgICAgNjQKLS8vI2RlZmluZSBQRUVSX0tFWV8xMjhfQklUICAgICAgICAgICAgICAgICAxMjgKLQotLy8jZGVmaW5lIFBFRVJfS0VZXzY0QklUX0xFTiAgICAgICAgICAgICAgIDgKLS8vI2RlZmluZSBQRUVSX0tFWV8xMjhCSVRfTEVOICAgICAgICAgICAgICAxNgotCi0jZGVmaW5lIEJTU19OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZGVmaW5lIE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSAgICAgICAgICAgIDQwIC8vMTAKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2RlZmluZSBTQ0FOX1BBU1NJVkUgICAgICAgICAgICAgICAgICAgICAxOAkJLy8gc2NhbiB3aXRoIG5vIHByb2JlIHJlcXVlc3QsIG9ubHkgd2FpdCBiZWFjb24gYW5kIHByb2JlIHJlc3BvbnNlCi0jZGVmaW5lIFNDQU5fQUNUSVZFICAgICAgICAgICAgICAgICAgICAgIDE5CQkvLyBzY2FuIHdpdGggcHJvYmUgcmVxdWVzdCwgYW5kIHdhaXQgYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZQotI2RlZmluZQlTQ0FOX0NJU0NPX1BBU1NJVkUJCQkJIDIwCQkvLyBTaW5nbGUgY2hhbm5lbCBwYXNzaXZlIHNjYW4KLSNkZWZpbmUJU0NBTl9DSVNDT19BQ1RJVkUJCQkJIDIxCQkvLyBTaW5nbGUgY2hhbm5lbCBhY3RpdmUgc2NhbgotI2RlZmluZQlTQ0FOX0NJU0NPX05PSVNFCQkJCSAyMgkJLy8gU2luZ2xlIGNoYW5uZWwgcGFzc2l2ZSBzY2FuIGZvciBub2lzZSBoaXN0b2dyYW0gY29sbGVjdGlvbgotI2RlZmluZQlTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRAkJCSAyMwkJLy8gU2luZ2xlIGNoYW5uZWwgcGFzc2l2ZSBzY2FuIGZvciBjaGFubmVsIGxvYWQgY29sbGVjdGlvbgotI2RlZmluZSBGQVNUX1NDQU5fQUNUSVZFICAgICAgICAgICAgICAgICAyNAkJLy8gc2NhbiB3aXRoIHByb2JlIHJlcXVlc3QsIGFuZCB3YWl0IGJlYWNvbiBhbmQgcHJvYmUgcmVzcG9uc2UKLQotI2lmZGVmIERPVDExTl9EUkFGVDMKLSNkZWZpbmUgU0NBTl8yMDQwX0JTU19DT0VYSVNUICAgICAgICAgICAgICAgICAgMjYKLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0KLS8vI2RlZmluZSBCU1NfVEFCTEVfRU1QVFkoeCkgICAgICAgICAgICAgKCh4KS5Cc3NOciA9PSAwKQotI2RlZmluZSBNQUNfQUREUl9JU19HUk9VUChBZGRyKSAgICAgICAoKChBZGRyWzBdKSAmIDB4MDEpKQotI2RlZmluZSBNQUNfQUREUl9IQVNIKEFkZHIpICAgICAgICAgICAgKEFkZHJbMF0gXiBBZGRyWzFdIF4gQWRkclsyXSBeIEFkZHJbM10gXiBBZGRyWzRdIF4gQWRkcls1XSkKLSNkZWZpbmUgTUFDX0FERFJfSEFTSF9JTkRFWChBZGRyKSAgICAgIChNQUNfQUREUl9IQVNIKEFkZHIpICUgSEFTSF9UQUJMRV9TSVpFKQotI2RlZmluZSBUSURfTUFDX0hBU0goQWRkcixUSUQpICAgICAgICAgICAgKFRJRF5BZGRyWzBdIF4gQWRkclsxXSBeIEFkZHJbMl0gXiBBZGRyWzNdIF4gQWRkcls0XSBeIEFkZHJbNV0pCi0jZGVmaW5lIFRJRF9NQUNfSEFTSF9JTkRFWChBZGRyLFRJRCkgICAgICAoVElEX01BQ19IQVNIKEFkZHIsVElEKSAlIEhBU0hfVEFCTEVfU0laRSkKLQotLy8gTEVEIENvbnRyb2wKLS8vIGFzc29pYXRpb24gT04uIG9uZSBMRUQgT04uIGFub3RoZXIgYmxpbmtpbmcgd2hlbiBUWCwgT0ZGIHdoZW4gaWRsZQotLy8gbm8gYXNzb2NpYXRpb24sIGJvdGggTEVEIG9mZgotI2RlZmluZSBBU0lDX0xFRF9BQ1RfT04ocEFkKSAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjE0LCAweDAwMDMxZTQ2KQotI2RlZmluZSBBU0lDX0xFRF9BQ1RfT0ZGKHBBZCkgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjE0LCAweDAwMDAxZTQ2KQotCi0vLyBiaXQgZGVmaW5pdGlvbiBvZiB0aGUgMi1ieXRlIHBCRUFDT04tPkNhcGFiaWxpdHkgZmllbGQKLSNkZWZpbmUgQ0FQX0lTX0VTU19PTih4KSAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAwMDEpICE9IDApCi0jZGVmaW5lIENBUF9JU19JQlNTX09OKHgpICAgICAgICAgICAgICAgICgoKHgpICYgMHgwMDAyKSAhPSAwKQotI2RlZmluZSBDQVBfSVNfQ0ZfUE9MTEFCTEVfT04oeCkgICAgICAgICAoKCh4KSAmIDB4MDAwNCkgIT0gMCkKLSNkZWZpbmUgQ0FQX0lTX0NGX1BPTExfUkVRX09OKHgpICAgICAgICAgKCgoeCkgJiAweDAwMDgpICE9IDApCi0jZGVmaW5lIENBUF9JU19QUklWQUNZX09OKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwMDEwKSAhPSAwKQotI2RlZmluZSBDQVBfSVNfU0hPUlRfUFJFQU1CTEVfT04oeCkgICAgICAoKCh4KSAmIDB4MDAyMCkgIT0gMCkKLSNkZWZpbmUgQ0FQX0lTX1BCQ0NfT04oeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAwNDApICE9IDApCi0jZGVmaW5lIENBUF9JU19BR0lMSVRZX09OKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwMDgwKSAhPSAwKQotI2RlZmluZSBDQVBfSVNfU1BFQ1RSVU1fTUdNVCh4KSAgICAgICAgICAoKCh4KSAmIDB4MDEwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKLSNkZWZpbmUgQ0FQX0lTX1FPUyh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAyMDApICE9IDApICAvLyA4MDIuMTFlIGQ5Ci0jZGVmaW5lIENBUF9JU19TSE9SVF9TTE9UKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwNDAwKSAhPSAwKQotI2RlZmluZSBDQVBfSVNfQVBTRCh4KSAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MDgwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKLSNkZWZpbmUgQ0FQX0lTX0lNTUVEX0JBKHgpICAgICAgICAgICAgICAgKCgoeCkgJiAweDEwMDApICE9IDApICAvLyA4MDIuMTFlIGQ5Ci0jZGVmaW5lIENBUF9JU19EU1NTX09GRE0oeCkgICAgICAgICAgICAgICgoKHgpICYgMHgyMDAwKSAhPSAwKQotI2RlZmluZSBDQVBfSVNfREVMQVlfQkEoeCkgICAgICAgICAgICAgICAoKCh4KSAmIDB4NDAwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKLQotI2RlZmluZSBDQVBfR0VORVJBVEUoZXNzLGlic3MscHJpdixzX3ByZSxzX3Nsb3Qsc3BlY3RydW0pICAoKChlc3MpID8gMHgwMDAxIDogMHgwMDAwKSB8ICgoaWJzcykgPyAweDAwMDIgOiAweDAwMDApIHwgKChwcml2KSA/IDB4MDAxMCA6IDB4MDAwMCkgfCAoKHNfcHJlKSA/IDB4MDAyMCA6IDB4MDAwMCkgfCAoKHNfc2xvdCkgPyAweDA0MDAgOiAweDAwMDApIHwgKChzcGVjdHJ1bSkgPyAweDAxMDAgOiAweDAwMDApKQotCi0vLyNkZWZpbmUgU1RBX1FPU19DQVBBQklMSVRZICAgICAgICAgICAgICAgMCAvLyAxLWJ5dGUuIHNlZSA4MDIuMTFlIGQ5LjAgZm9yIGJpdCBkZWZpbml0aW9uCi0KLSNkZWZpbmUgRVJQX0lTX05PTl9FUlBfUFJFU0VOVCh4KSAgICAgICAgKCgoeCkgJiAweDAxKSAhPSAwKSAgICAvLyA4MDIuMTFnCi0jZGVmaW5lIEVSUF9JU19VU0VfUFJPVEVDVElPTih4KSAgICAgICAgICgoKHgpICYgMHgwMikgIT0gMCkgICAgLy8gODAyLjExZwotI2RlZmluZSBFUlBfSVNfVVNFX0JBUktFUl9QUkVBTUJMRSh4KSAgICAoKCh4KSAmIDB4MDQpICE9IDApICAgIC8vIDgwMi4xMWcKLQotI2RlZmluZSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORCAgICAgICA4Ly8gMyAgLy8ganVzdCB0ZXN0IGJ5IGdhcnkKLSNkZWZpbmUgRFJTX1BFTkFMVFkgICAgICAgICAgICAgICAgICAgICAgOAotCi0jZGVmaW5lIEJBX05PVFVTRQkyCi0vL0JBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZQotI2RlZmluZSBJTU1FRF9CQQkxCi0jZGVmaW5lIERFTEFZX0JBCTAKLQotLy8gQkEgSW5pdGlhdG9yIHN1YmZpZWxkIGluIERFTEJBIGZyYW1lCi0jZGVmaW5lIE9SSUdJTkFUT1IJMQotI2RlZmluZSBSRUNJUElFTlQJMAotCi0vLyBBRERCQSBTdGF0dXMgQ29kZQotI2RlZmluZSBBRERCQV9SRVNVTFRDT0RFX1NVQ0NFU1MJCQkJCTAKLSNkZWZpbmUgQUREQkFfUkVTVUxUQ09ERV9SRUZVU0VECQkJCQkzNwotI2RlZmluZSBBRERCQV9SRVNVTFRDT0RFX0lOVkFMSURfUEFSQU1FVEVSUwkJCTM4Ci0KLS8vIERFTEJBIFJlYXNvbiBDb2RlCi0jZGVmaW5lIERFTEJBX1JFQVNPTkNPREVfUVNUQV9MRUFWSU5HCQkJCTM2Ci0jZGVmaW5lIERFTEJBX1JFQVNPTkNPREVfRU5EX0JBCQkJCQkJMzcKLSNkZWZpbmUgREVMQkFfUkVBU09OQ09ERV9VTktOT1dOX0JBCQkJCQkzOAotI2RlZmluZSBERUxCQV9SRUFTT05DT0RFX1RJTUVPVVQJCQkJCTM5Ci0KLS8vIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycwotI2RlZmluZSBSRVNFVF9PTkVfU0VDX1RYX0NOVChfX3BFbnRyeSkgXAotaWYgKCgoX19wRW50cnkpKSAhPSBOVUxMKSBcCi17IFwKLQkoX19wRW50cnkpLT5PbmVTZWNUeFJldHJ5T2tDb3VudCA9IDA7IFwKLQkoX19wRW50cnkpLT5PbmVTZWNUeEZhaWxDb3VudCA9IDA7IFwKLQkoX19wRW50cnkpLT5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ID0gMDsgXAotfQotCi0vLwotLy8gODAyLjExIGZyYW1lIGZvcm1hdHMKLS8vCi0vLyAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlVU0hPUlQJTFNJR1R4b3BQcm9TdXA6MTsKLQlVU0hPUlQJRm9ydHlfTWh6X0ludG9sZXJhbnQ6MTsKLQlVU0hPUlQJUFNNUDoxOwotCVVTSE9SVAlDQ0ttb2RlaW40MDoxOwotCVVTSE9SVAlBTXNkdVNpemU6MTsKLQlVU0hPUlQJRGVsYXllZEJBOjE7CS8vcnQyODYwYyBub3Qgc3VwcG9ydAotCVVTSE9SVAlSeFNUQkM6MjsKLQlVU0hPUlQJVHhTVEJDOjE7Ci0JVVNIT1JUCVNob3J0R0lmb3I0MDoxOwkvL2ZvcjQwTUh6Ci0JVVNIT1JUCVNob3J0R0lmb3IyMDoxOwotCVVTSE9SVAlHRjoxOwkvL2dyZWVuIGZpZWxkCi0JVVNIT1JUCU1pbW9QczoyOy8vbW9taSBwb3dlciBzYWZlCi0JVVNIT1JUCUNoYW5uZWxXaWR0aDoxOwotCVVTSE9SVAlBZHZDb2Rpbmc6MTsKLSNlbHNlCi0JVVNIT1JUCUFkdkNvZGluZzoxOwotCVVTSE9SVAlDaGFubmVsV2lkdGg6MTsKLQlVU0hPUlQJTWltb1BzOjI7Ly9tb21pIHBvd2VyIHNhZmUKLQlVU0hPUlQJR0Y6MTsJLy9ncmVlbiBmaWVsZAotCVVTSE9SVAlTaG9ydEdJZm9yMjA6MTsKLQlVU0hPUlQJU2hvcnRHSWZvcjQwOjE7CS8vZm9yNDBNSHoKLQlVU0hPUlQJVHhTVEJDOjE7Ci0JVVNIT1JUCVJ4U1RCQzoyOwotCVVTSE9SVAlEZWxheWVkQkE6MTsJLy9ydDI4NjBjIG5vdCBzdXBwb3J0Ci0JVVNIT1JUCUFNc2R1U2l6ZToxOwkvLyBvbmx5IHN1cHBvcnQgYXMgemVybwotCVVTSE9SVAlDQ0ttb2RlaW40MDoxOwotCVVTSE9SVAlQU01QOjE7Ci0JVVNIT1JUCUZvcnR5X01oel9JbnRvbGVyYW50OjE7Ci0JVVNIT1JUCUxTSUdUeG9wUHJvU3VwOjE7Ci0jZW5kaWYJLyogIVJUX0JJR19FTkRJQU4gKi8KLX0gSFRfQ0FQX0lORk8sICpQSFRfQ0FQX0lORk87Ci0KLS8vICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCVVDSEFSCXJzdjozOy8vbW9taSBwb3dlciBzYWZlCi0JVUNIQVIJTXBkdURlbnNpdHk6MzsKLQlVQ0hBUglNYXhSQW1wZHVGYWN0b3I6MjsKLSNlbHNlCi0JVUNIQVIJTWF4UkFtcGR1RmFjdG9yOjI7Ci0JVUNIQVIJTXBkdURlbnNpdHk6MzsKLQlVQ0hBUglyc3Y6MzsvL21vbWkgcG93ZXIgc2FmZQotI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCi19IEhUX0NBUF9QQVJNLCAqUEhUX0NBUF9QQVJNOwotCi0vLyAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotCVVDSEFSCU1DU1NldFsxMF07Ci0JVUNIQVIJU3VwUmF0ZVsyXTsgIC8vIHVuaXQgOiAxTWJwcwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlVQ0hBUglyc3Y6MzsKLQlVQ0hBUglNcGR1RGVuc2l0eToxOwotCVVDSEFSCVR4U3RyZWFtOjI7Ci0JVUNIQVIJVHhSeE5vdEVxdWFsOjE7Ci0JVUNIQVIJVHhNQ1NTZXREZWZpbmVkOjE7Ci0jZWxzZQotCVVDSEFSCVR4TUNTU2V0RGVmaW5lZDoxOwotCVVDSEFSCVR4UnhOb3RFcXVhbDoxOwotCVVDSEFSCVR4U3RyZWFtOjI7Ci0JVUNIQVIJTXBkdURlbnNpdHk6MTsKLQlVQ0hBUglyc3Y6MzsKLSNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCi0JVUNIQVIJcnN2M1szXTsKLX0gSFRfTUNTX1NFVCwgKlBIVF9NQ1NfU0VUOwotCi0vLyAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlVU0hPUlQJcnN2Mjo0OwotCVVTSE9SVAlSREdTdXBwb3J0OjE7CS8vcmV2ZXJzZSBEaXJlY3Rpb24gR3JhbnQgIHN1cHBvcnQKLQlVU0hPUlQJUGx1c0hUQzoxOwkvLytIVEMgY29udHJvbCBmaWVsZCBzdXBwb3J0Ci0JVVNIT1JUCU1DU0ZlZWRiYWNrOjI7CS8vMDpubyBNQ1MgZmVlZGJhY2ssIDI6dW5zb2xpY2l0ZWQgTUNTIGZlZWRiYWNrLCAzOkZ1bGwgTUNTIGZlZWRiYWNrLCAgMTpyc3YuCi0JVVNIT1JUCXJzdjo1Oy8vbW9taSBwb3dlciBzYWZlCi0JVVNIT1JUCVRyYW5UaW1lOjI7Ci0JVVNIT1JUCVBjbzoxOwotI2Vsc2UKLQlVU0hPUlQJUGNvOjE7Ci0JVVNIT1JUCVRyYW5UaW1lOjI7Ci0JVVNIT1JUCXJzdjo1Oy8vbW9taSBwb3dlciBzYWZlCi0JVVNIT1JUCU1DU0ZlZWRiYWNrOjI7CS8vMDpubyBNQ1MgZmVlZGJhY2ssIDI6dW5zb2xpY2l0ZWQgTUNTIGZlZWRiYWNrLCAzOkZ1bGwgTUNTIGZlZWRiYWNrLCAgMTpyc3YuCi0JVVNIT1JUCVBsdXNIVEM6MTsJLy8rSFRDIGNvbnRyb2wgZmllbGQgc3VwcG9ydAotCVVTSE9SVAlSREdTdXBwb3J0OjE7CS8vcmV2ZXJzZSBEaXJlY3Rpb24gR3JhbnQgIHN1cHBvcnQKLQlVU0hPUlQJcnN2Mjo0OwotI2VuZGlmIC8qIFJUX0JJR19FTkRJQU4gKi8KLX0gRVhUX0hUX0NBUF9JTkZPLCAqUEVYVF9IVF9DQVBfSU5GTzsKLQotLy8gIEhUIEJlYW1mb3JtaW5nIGZpZWxkIGluIEhUIENhcCBJRSAuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0hUX0JGX0NBUHsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JVUxPTkcJcnN2OjM7Ci0JVUxPTkcJQ2hhbkVzdGltYXRpb246MjsKLQlVTE9ORwlDU0lSb3dCRlN1cDoyOwotCVVMT05HCUNvbVN0ZWVyQkZBbnRTdXA6MjsKLQlVTE9ORwlOb0NvbVN0ZWVyQkZBbnRTdXA6MjsKLQlVTE9ORwlDU0lCRkFudFN1cDoyOwotCVVMT05HCU1pbkdyb3VwaW5nOjI7Ci0JVUxPTkcJRXhwQ29tQkY6MjsKLQlVTE9ORwlFeHBOb0NvbUJGOjI7Ci0JVUxPTkcJRXhwQ1NJRmJrOjI7Ci0JVUxPTkcJRXhwQ29tU3RlZXJDYXBhYmxlOjE7Ci0JVUxPTkcJRXhwTm9Db21TdGVlckNhcGFibGU6MTsKLQlVTE9ORwlFeHBDU0lDYXBhYmxlOjE7Ci0JVUxPTkcJQ2FsaWJyYXRpb246MjsKLQlVTE9ORwlJbXBUeEJGQ2FwYWJsZToxOwotCVVMT05HCVR4TkRQQ2FwYWJsZToxOwotCVVMT05HCVJ4TkRQQ2FwYWJsZToxOwotCVVMT05HCVR4U291bmRDYXBhYmxlOjE7Ci0JVUxPTkcJUnhTb3VuZENhcGFibGU6MTsKLQlVTE9ORwlUeEJGUmVjQ2FwYWJsZToxOwotI2Vsc2UKLQlVTE9ORwlUeEJGUmVjQ2FwYWJsZToxOwotCVVMT05HCVJ4U291bmRDYXBhYmxlOjE7Ci0JVUxPTkcJVHhTb3VuZENhcGFibGU6MTsKLQlVTE9ORwlSeE5EUENhcGFibGU6MTsKLQlVTE9ORwlUeE5EUENhcGFibGU6MTsKLQlVTE9ORwlJbXBUeEJGQ2FwYWJsZToxOwotCVVMT05HCUNhbGlicmF0aW9uOjI7Ci0JVUxPTkcJRXhwQ1NJQ2FwYWJsZToxOwotCVVMT05HCUV4cE5vQ29tU3RlZXJDYXBhYmxlOjE7Ci0JVUxPTkcJRXhwQ29tU3RlZXJDYXBhYmxlOjE7Ci0JVUxPTkcJRXhwQ1NJRmJrOjI7Ci0JVUxPTkcJRXhwTm9Db21CRjoyOwotCVVMT05HCUV4cENvbUJGOjI7Ci0JVUxPTkcJTWluR3JvdXBpbmc6MjsKLQlVTE9ORwlDU0lCRkFudFN1cDoyOwotCVVMT05HCU5vQ29tU3RlZXJCRkFudFN1cDoyOwotCVVMT05HCUNvbVN0ZWVyQkZBbnRTdXA6MjsKLQlVTE9ORwlDU0lSb3dCRlN1cDoyOwotCVVMT05HCUNoYW5Fc3RpbWF0aW9uOjI7Ci0JVUxPTkcJcnN2OjM7Ci0jZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLwotfSBIVF9CRl9DQVAsICpQSFRfQkZfQ0FQOwotCi0vLyAgSFQgYW50ZW5uYSBzZWxlY3Rpb24gZmllbGQgaW4gSFQgQ2FwIElFIC4KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfSFRfQVNfQ0FQewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlVQ0hBUglyc3Y6MTsKLQlVQ0hBUglUeFNvdW5kUFBEVToxOwotCVVDSEFSCVJ4QVNlbDoxOwotCVVDSEFSCUFudEluZEZiazoxOwotCVVDSEFSCUV4cENTSUZiazoxOwotCVVDSEFSCUFudEluZEZia1R4QVNFTDoxOwotCVVDSEFSCUV4cENTSUZia1R4QVNFTDoxOwotCVVDSEFSCUFudFNlbGVjdDoxOwotI2Vsc2UKLQlVQ0hBUglBbnRTZWxlY3Q6MTsKLQlVQ0hBUglFeHBDU0lGYmtUeEFTRUw6MTsKLQlVQ0hBUglBbnRJbmRGYmtUeEFTRUw6MTsKLQlVQ0hBUglFeHBDU0lGYms6MTsKLQlVQ0hBUglBbnRJbmRGYms6MTsKLQlVQ0hBUglSeEFTZWw6MTsKLQlVQ0hBUglUeFNvdW5kUFBEVToxOwotCVVDSEFSCXJzdjoxOwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLX0gSFRfQVNfQ0FQLCAqUEhUX0FTX0NBUDsKLQotLy8gRHJhZnQgMS4wIHNldCBJRSBsZW5ndGggMjYsIGJ1dCBpcyBleHRlbnNpYmxlLi4KLSNkZWZpbmUgU0laRV9IVF9DQVBfSUUJCTI2Ci0vLyBUaGUgc3RydWN0dXJlIGZvciBIVCBDYXBhYmlsaXR5IElFLgotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9IVF9DQVBBQklMSVRZX0lFewotCUhUX0NBUF9JTkZPCQlIdENhcEluZm87Ci0JSFRfQ0FQX1BBUk0JCUh0Q2FwUGFybTsKLS8vCUhUX01DU19TRVQJCUh0TUNTU2V0OwotCVVDSEFSCQkJTUNTU2V0WzE2XTsKLQlFWFRfSFRfQ0FQX0lORk8JRXh0SHRDYXBJbmZvOwotCUhUX0JGX0NBUAkJVHhCRkNhcDsJLy8gYmVhbWZvcm1pbmcgY2FwLiBydDI4NjBjIG5vdCBzdXBwb3J0IGJlYW1mb3JtaW5nLgotCUhUX0FTX0NBUAkJQVNDYXA7CS8vYW50ZW5uYSBzZWxlY3Rpb24uCi19IEhUX0NBUEFCSUxJVFlfSUUsICpQSFRfQ0FQQUJJTElUWV9JRTsKLQotCi0vLyA4MDIuMTFuIGRyYWZ0MyByZWxhdGVkIHN0cnVjdHVyZSBkZWZpbml0aW9ucy4KLS8vIDcuMy4yLjYwCi0jZGVmaW5lIGRvdDExT0JTU1NjYW5QYXNzaXZlRHdlbGwJCQkJCQkJMjAJLy8gaW4gVFUuIG1pbiBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBTVEEgY29udGlub3VzbHkgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhbiBhY3RpdmUgT0JTUyBzY2FuLgotI2RlZmluZSBkb3QxMU9CU1NTY2FuQWN0aXZlRHdlbGwJCQkJCQkJMTAJLy8gaW4gVFUubWluIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBjb250aW5vdXNseSBzY2FucyBlYWNoIGNoYW5uZWwgd2hlbiBwZXJmb3JtaW5nIGFuIHBhc3NpdmUgT0JTUyBzY2FuLgotI2RlZmluZSBkb3QxMUJTU1dpZHRoVHJpZ2dlclNjYW5JbnRlcnZhbAkJCQkJMzAwICAvLyBpbiBzZWMuIG1heCBpbnRlcnZhbCBiZXR3ZWVuIHNjYW4gb3BlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQgdG8gZGV0ZWN0IEJTUyBjaGFubmVsIHdpZHRoIHRyaWdnZXIgZXZlbnRzLgotI2RlZmluZSBkb3QxMU9CU1NTY2FuUGFzc2l2ZVRvdGFsUGVyQ2hhbm5lbAkJCQkJMjAwCS8vIGluIFRVLiBtaW4gdG90YWwgYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYSBwYXNzaXZlIE9CU1Mgc2Nhbi4KLSNkZWZpbmUgZG90MTFPQlNTU2NhbkFjdGl2ZVRvdGFsUGVyQ2hhbm5lbAkJCQkJMjAJLy9pbiBUVS4gbWluIHRvdGFsIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBzY2FucyBlYWNoIGNoYW5uZWwgd2hlbiBwZXJmb3JtaW5nIGEgYWN0aXZlIE9CU1Mgc2NhbgotI2RlZmluZSBkb3QxMUJTU1dpZHRoQ2hhbm5lbFRyYW5zYWN0aW9uRGVsYXlGYWN0b3IJCQk1CS8vIG1pbiByYXRpbyBiZXR3ZWVuIHRoZSBkZWxheSB0aW1lIGluIHBlcmZvcm1pbmcgYSBzd2l0Y2ggZnJvbSAyME1IeiBCU1MgdG8gMjAvNDAgQlNTIG9wZXJhdGlvbiBhbmQgdGhlIG1heGltdW0KLQkJCQkJCQkJCQkJCQkJCQkvLwlpbnRlcnZhbCBiZXR3ZWVuIG92ZXJsYXBwaW5nIEJTUyBzY2FuIG9wZXJhdGlvbnMuCi0jZGVmaW5lIGRvdDExQlNTU2NhbkFjdGl2aXR5VGhyZXNob2xkCQkJCQkJMjUJLy8gaW4gJSUsIG1heCB0b3RhbCB0aW1lIHRoYXQgYSBTVEEgbWF5IGJlIGFjdGl2ZSBvbiB0aGUgbWVkaXVtIGR1cmluZyBhIHBlcmlvZCBvZgotCQkJCQkJCQkJCQkJCQkJCS8vCShkb3QxMUJTU1dpZHRoQ2hhbm5lbFRyYW5zYWN0aW9uRGVsYXlGYWN0b3IgKiBkb3QxMUJTU1dpZHRoVHJpZ2dlclNjYW5JbnRlcnZhbCkgc2Vjb25kcyB3aXRob3V0Ci0JCQkJCQkJCQkJCQkJCQkJLy8JYmVpbmcgb2JsaWdhdGVkIHRvIHBlcmZvcm0gT0JTUyBTY2FuIG9wZXJhdGlvbnMuIGRlZmF1bHQgaXMgMjUoPT0gMC4yNSUpCi0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfT1ZFUkxBUF9CU1NfU0NBTl9JRXsKLQlVU0hPUlQJCVNjYW5QYXNzaXZlRHdlbGw7Ci0JVVNIT1JUCQlTY2FuQWN0aXZlRHdlbGw7Ci0JVVNIT1JUCQlUcmlnZ2VyU2NhbkludDsJCQkJLy8gVHJpZ2dlciBzY2FuIGludGVydmFsCi0JVVNIT1JUCQlQYXNzaXZlVGFsUGVyQ2hhbm5lbDsJCS8vIHBhc3NpdmUgdG90YWwgcGVyIGNoYW5uZWwKLQlVU0hPUlQJCUFjdGl2ZVRhbFBlckNoYW5uZWw7CQkvLyBhY3RpdmUgdG90YWwgcGVyIGNoYW5uZWwKLQlVU0hPUlQJCURlbGF5RmFjdG9yOwkJCQkvLyBCU1Mgd2lkdGggY2hhbm5lbCB0cmFuc2l0aW9uIGRlbGF5IGZhY3RvcgotCVVTSE9SVAkJU2NhbkFjdFRocmU7CQkJCS8vIFNjYW4gQWN0aXZpdHkgdGhyZXNob2xkCi19T1ZFUkxBUF9CU1NfU0NBTl9JRSwgKlBPVkVSTEFQX0JTU19TQ0FOX0lFOwotCi0KLS8vICA3LjMuMi41Ni4gMjAvNDAgQ29leGlzdGVuY2UgZWxlbWVudCB1c2VkIGluICBFbGVtZW50IElEID0gNzIgPSBJRV8yMDQwX0JTU19DT0VYSVNUCi10eXBlZGVmIHVuaW9uIFBBQ0tFRCBfQlNTXzIwNDBfQ09FWElTVF9JRXsKLSBzdHJ1Y3QgUEFDS0VEIHsKLSAjaWZkZWYgUlRfQklHX0VORElBTgotCVVDSEFSCXJzdjo1OwotCVVDSEFSCUJTUzIwV2lkdGhSZXE6MTsKLQlVQ0hBUglJbnRvbGVyYW50NDA6MTsKLQlVQ0hBUglJbmZvUmVxOjE7Ci0gI2Vsc2UKLQlVQ0hBUglJbmZvUmVxOjE7Ci0JVUNIQVIJSW50b2xlcmFudDQwOjE7CQkJLy8gSW50ZXItQlNTLiBzZXQgMSB3aGVuIHByb2hpYml0cyBhIHJlY2VpdmluZyBCU1MgZnJvbSBvcGVyYXRpbmcgYXMgYSAyMC80MCBNaHogQlNTLgotCVVDSEFSCUJTUzIwV2lkdGhSZXE6MTsJCS8vIEludHJhLUJTUyBzZXQgMSB3aGVuIHByb2hpYml0cyBhIHJlY2VpdmluZyBBUCBmcm9tIG9wZXJhdGluZyBpdHMgQlNTIGFzIGEgMjAvNDBNSHogQlNTLgotCVVDSEFSCXJzdjo1OwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLSAgICB9IGZpZWxkOwotIFVDSEFSICAgd29yZDsKLX0gQlNTXzIwNDBfQ09FWElTVF9JRSwgKlBCU1NfMjA0MF9DT0VYSVNUX0lFOwotCi0KLXR5cGVkZWYgc3RydWN0ICBfVFJJR0dFUl9FVkVOVEF7Ci0JQk9PTEVBTgkJCWJWYWxpZDsKLQlVQ0hBUglCU1NJRFs2XTsKLQlVQ0hBUglSZWdDbGFzczsJLy8gUmVndWxhdG9yeSBDbGFzcwotCVVTSE9SVAlDaGFubmVsOwotCVVMT05HCUNEQ291bnRlcjsgICAvLyBNYWludGFpbiBhIHNlcGVyYXRlIGNvdW50IGRvd24gY291bnRlciBmb3IgZWFjaCBFdmVudCBBLgotfSBUUklHR0VSX0VWRU5UQSwgKlBUUklHR0VSX0VWRU5UQTsKLQotLy8gMjAvNDAgdHJpZ2dlciBldmVudCB0YWJsZQotLy8gSWYgb25lIEV2ZW50IEEgZGVsZXRlIG9yIGNyZWF0ZWQsIG9yIGlmIEV2ZW50IEIgaXMgZGV0ZWN0ZWQgb3Igbm90IGRldGVjdGVkLCBTVEEgc2hvdWxkIHNlbmQgMjA0MEJTU0NvZXhpc3RlbmNlIHRvIEFQLgotI2RlZmluZSBNQVhfVFJJR0dFUl9FVkVOVAkJNjQKLXR5cGVkZWYgc3RydWN0ICBfVFJJR0dFUl9FVkVOVF9UQUJ7Ci0JVUNIQVIJRXZlbnRBTm87Ci0JVFJJR0dFUl9FVkVOVEEJRXZlbnRBW01BWF9UUklHR0VSX0VWRU5UXTsKLQlVTE9ORwkJCUV2ZW50QkNvdW50RG93bjsJLy8gQ291bnQgZG93biBjb3VudGVyIGZvciBFdmVudCBCLgotfSBUUklHR0VSX0VWRU5UX1RBQiwgKlBUUklHR0VSX0VWRU5UX1RBQjsKLQotLy8gNy4zLjI3IDIwLzQwIEJzcyBDb2V4aXN0ZW5jZSBNZ210IGNhcGFiaWxpdHkgdXNlZCBpbiBleHRlbmRlZCBjYXBhYmlsaXRpZXMgaW5mb3JtYXRpb24gSUUoIElEID0gMTI3ID0gSUVfRVhUX0NBUEFCSUxJVFkpLgotLy8JVGhpcyBpcyB0aGUgZmlyc3Qgb2N0ZXQgYW5kIHdhcyBkZWZpbmVkIGluIDgwMi4xMW4gRDMuMDMgYW5kIDgwMi4xMXlEOS4wCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0VYVF9DQVBfSU5GT19FTEVNRU5UewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlVQ0hBUglyc3YyOjU7Ci0JVUNIQVIJRXh0ZW5kQ2hhbm5lbFN3aXRjaDoxOwotCVVDSEFSCXJzdjoxOwotCVVDSEFSCUJzc0NvZXhpc3RNZ210U3VwcG9ydDoxOwotI2Vsc2UKLQlVQ0hBUglCc3NDb2V4aXN0TWdtdFN1cHBvcnQ6MTsKLQlVQ0hBUglyc3Y6MTsKLQlVQ0hBUglFeHRlbmRDaGFubmVsU3dpdGNoOjE7Ci0JVUNIQVIJcnN2Mjo1OwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLX1FWFRfQ0FQX0lORk9fRUxFTUVOVCwgKlBFWFRfQ0FQX0lORk9fRUxFTUVOVDsKLQotCi0vLyA4MDIuMTFuIDcuMy4yLjYxCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0JTU18yMDQwX0NPRVhJU1RfRUxFTUVOVHsKLQlVQ0hBUgkJCQkJRWxlbWVudElEOwkJLy8gSUQgPSBJRV8yMDQwX0JTU19DT0VYSVNUID0gNzIKLQlVQ0hBUgkJCQkJTGVuOwotCUJTU18yMDQwX0NPRVhJU1RfSUUJCUJzc0NvZXhpc3RJZTsKLX1CU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQsICpQQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UOwotCi0KLS8vODAyLjExbiA3LjMuMi41OQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9CU1NfMjA0MF9JTlRPTEVSQU5UX0NIX1JFUE9SVHsKLQlVQ0hBUgkJCQlFbGVtZW50SUQ7CQkvLyBJRCA9IElFXzIwNDBfQlNTX0lOVE9MRVJBTlRfUkVQT1JUID0gNzMKLQlVQ0hBUgkJCQlMZW47Ci0JVUNIQVIJCQkJUmVndWxhdG9yeUNsYXNzOwotCVVDSEFSCQkJCUNoTGlzdFswXTsKLX1CU1NfMjA0MF9JTlRPTEVSQU5UX0NIX1JFUE9SVCwgKlBCU1NfMjA0MF9JTlRPTEVSQU5UX0NIX1JFUE9SVDsKLQotCi0vLyBUaGUgc3RydWN0dXJlIGZvciBjaGFubmVsIHN3aXRjaCBhbm5vdWNlbWVudCBJRS4gVGhpcyBpcyBpbiA4MDIuMTFuIEQzLjAzCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0NIQV9TV0lUQ0hfQU5OT1VOQ0VfSUV7Ci0JVUNIQVIJCQlTd2l0Y2hNb2RlOwkvL2NoYW5uZWwgc3dpdGNoIG1vZGUKLQlVQ0hBUgkJCU5ld0NoYW5uZWw7CS8vCi0JVUNIQVIJCQlTd2l0Y2hDb3VudDsJLy8KLX0gQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRSwgKlBDSEFfU1dJVENIX0FOTk9VTkNFX0lFOwotCi0KLS8vIFRoZSBzdHJ1Y3R1cmUgZm9yIGNoYW5uZWwgc3dpdGNoIGFubm91Y2VtZW50IElFLiBUaGlzIGlzIGluIDgwMi4xMW4gRDMuMDMKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfU0VDX0NIQV9PRkZTRVRfSUV7Ci0JVUNIQVIJCQlTZWNvbmRhcnlDaGFubmVsT2Zmc2V0OwkgLy8gMTogU2Vjb25kYXJ5IGFib3ZlLCAzOiBTZWNvbmRhcnkgYmVsb3csIDA6IG5vIFNlY29uZGFyeQotfSBTRUNfQ0hBX09GRlNFVF9JRSwgKlBTRUNfQ0hBX09GRlNFVF9JRTsKLQotCi0vLyBUaGlzIHN0cnVjdHVyZSBpcyBleHRyYWN0ZWQgZnJvbSBzdHJ1Y3QgUlRfSFRfQ0FQQUJJTElUWQotdHlwZWRlZiBzdHJ1Y3QgewotCUJPT0xFQU4JCQliSHRFbmFibGU7CSAvLyBJZiB3ZSBzaG91bGQgdXNlIGh0IHJhdGUuCi0JQk9PTEVBTgkJCWJQcmVOSHQ7CSAvLyBJZiB3ZSBzaG91bGQgdXNlIGh0IHJhdGUuCi0JLy9TdWJzdHJhY3QgZnJvbSBIVCBDYXBhYmlsaXR5IElFCi0JVUNIQVIJCQlNQ1NTZXRbMTZdOwotfSBSVF9IVF9QSFlfSU5GTywgKlBSVF9IVF9QSFlfSU5GTzsKLQotLy9UaGlzIHN0cnVjdHVyZSBzdWJzdHJhY3RzIHJhbGluayBzdXBwb3J0cyBmcm9tIGFsbCA4MDIuMTFuLXJlbGF0ZWQgZmVhdHVyZXMuCi0vL0ZlYXR1cmVzIG5vdCBsaXN0ZWQgaGVyZSBidXQgY29udGFpbmVkIGluIDgwMi4xMW4gc3BlYyBhcmUgbm90IHN1cHBvcnRlZCBpbiBydDI4NjAuCi10eXBlZGVmIHN0cnVjdCB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCVVTSE9SVAlyc3Y6NTsKLQlVU0hPUlQJQW1zZHVTaXplOjE7CS8vIE1heCByZWNlaXZpbmcgQS1NU0RVIHNpemUKLQlVU0hPUlQJQW1zZHVFbmFibGU6MTsJLy8gRW5hYmxlIHRvIHRyYW5zbWl0IEEtTVNEVS4gU3VnZ2VzdCBkaXNhYmxlLiBXZSBzaG91bGQgdXNlIEEtTVBEVSB0byBnYWluIGJlc3QgYmVuaWZpdCBvZiA4MDIuMTFuCi0JVVNIT1JUCVJ4U1RCQzoyOwkvLyAyIGJpdHMKLQlVU0hPUlQJVHhTVEJDOjE7Ci0JVVNIT1JUCVNob3J0R0lmb3I0MDoxOwkvL2ZvcjQwTUh6Ci0JVVNIT1JUCVNob3J0R0lmb3IyMDoxOwotCVVTSE9SVAlHRjoxOwkvL2dyZWVuIGZpZWxkCi0JVVNIT1JUCU1pbW9QczoyOy8vbWltbyBwb3dlciBzYWZlIE1NUFNfCi0JVVNIT1JUCUNoYW5uZWxXaWR0aDoxOwotI2Vsc2UKLQlVU0hPUlQJQ2hhbm5lbFdpZHRoOjE7Ci0JVVNIT1JUCU1pbW9QczoyOy8vbWltbyBwb3dlciBzYWZlIE1NUFNfCi0JVVNIT1JUCUdGOjE7CS8vZ3JlZW4gZmllbGQKLQlVU0hPUlQJU2hvcnRHSWZvcjIwOjE7Ci0JVVNIT1JUCVNob3J0R0lmb3I0MDoxOwkvL2ZvcjQwTUh6Ci0JVVNIT1JUCVR4U1RCQzoxOwotCVVTSE9SVAlSeFNUQkM6MjsJLy8gMiBiaXRzCi0JVVNIT1JUCUFtc2R1RW5hYmxlOjE7CS8vIEVuYWJsZSB0byB0cmFuc21pdCBBLU1TRFUuIFN1Z2dlc3QgZGlzYWJsZS4gV2Ugc2hvdWxkIHVzZSBBLU1QRFUgdG8gZ2FpbiBiZXN0IGJlbmlmaXQgb2YgODAyLjExbgotCVVTSE9SVAlBbXNkdVNpemU6MTsJLy8gTWF4IHJlY2VpdmluZyBBLU1TRFUgc2l6ZQotCVVTSE9SVAlyc3Y6NTsKLSNlbmRpZgotCi0JLy9TdWJzdHJhY3QgZnJvbSBBZGRpb250IEhUIElORk8gSUUKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JVUNIQVIJUmVjb21XaWR0aDoxOwotCVVDSEFSCUV4dENoYW5PZmZzZXQ6MjsJLy8gUGxlYXNlIG5vdCB0aGUgZGlmZmVyZW5jZSB3aXRoIGZvbGxvd2luZwlVQ0hBUglOZXdFeHRDaGFubmVsT2Zmc2V0OyBmcm9tIDgwMi4xMW4KLQlVQ0hBUglNcGR1RGVuc2l0eTozOwotCVVDSEFSCU1heFJBbXBkdUZhY3RvcjoyOwotI2Vsc2UKLQlVQ0hBUglNYXhSQW1wZHVGYWN0b3I6MjsKLQlVQ0hBUglNcGR1RGVuc2l0eTozOwotCVVDSEFSCUV4dENoYW5PZmZzZXQ6MjsJLy8gUGxlYXNlIG5vdCB0aGUgZGlmZmVyZW5jZSB3aXRoIGZvbGxvd2luZwlVQ0hBUglOZXdFeHRDaGFubmVsT2Zmc2V0OyBmcm9tIDgwMi4xMW4KLQlVQ0hBUglSZWNvbVdpZHRoOjE7Ci0jZW5kaWYKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlVU0hPUlQJcnN2MjoxMTsKLQlVU0hPUlQJT0JTU19Ob25IVEV4aXN0OjE7Ci0JVVNIT1JUCXJzdjM6MTsKLQlVU0hPUlQJTm9uR2ZQcmVzZW50OjE7Ci0JVVNIT1JUCU9wZXJhaW9uTW9kZToyOwotI2Vsc2UKLQlVU0hPUlQJT3BlcmFpb25Nb2RlOjI7Ci0JVVNIT1JUCU5vbkdmUHJlc2VudDoxOwotCVVTSE9SVAlyc3YzOjE7Ci0JVVNIT1JUCU9CU1NfTm9uSFRFeGlzdDoxOwotCVVTSE9SVAlyc3YyOjExOwotI2VuZGlmCi0KLQkvLyBOZXcgRXh0ZW5zaW9uIENoYW5uZWwgT2Zmc2V0IElFCi0JVUNIQVIJTmV3RXh0Q2hhbm5lbE9mZnNldDsKLQkvLyBFeHRlbnNpb24gQ2FwYWJpbGl0eSBJRSA9IDEyNwotCVVDSEFSCUJTU0NvZXhpc3QyMDQwOwotfSBSVF9IVF9DQVBBQklMSVRZLCAqUFJUX0hUX0NBUEFCSUxJVFk7Ci0KLS8vICAgZmllbGQgaW4gQWRkdGlvbmFsIEhUIEluZm9ybWF0aW9uIElFIC4KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCVVDSEFSCVNlckludGVyR3JhbnU6MzsKLQlVQ0hBUglTX1BTTVBTdXA6MTsKLQlVQ0hBUglSaWZzTW9kZToxOwotCVVDSEFSCVJlY29tV2lkdGg6MTsKLQlVQ0hBUglFeHRDaGFuT2Zmc2V0OjI7Ci0jZWxzZQotCVVDSEFSCUV4dENoYW5PZmZzZXQ6MjsKLQlVQ0hBUglSZWNvbVdpZHRoOjE7Ci0JVUNIQVIJUmlmc01vZGU6MTsKLQlVQ0hBUglTX1BTTVBTdXA6MTsJIC8vSW5kaWNhdGUgc3VwcG9ydCBmb3Igc2NoZWR1bGVkIFBTTVAKLQlVQ0hBUglTZXJJbnRlckdyYW51OjM7CSAvL3NlcnZpY2UgaW50ZXJ2YWwgZ3JhbnVsYXJpdHkKLSNlbmRpZgotfSBBRERfSFRJTkZPLCAqUEFERF9IVElORk87Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRHsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JVVNIT1JUCXJzdjI6MTE7Ci0JVVNIT1JUCU9CU1NfTm9uSFRFeGlzdDoxOwotCVVTSE9SVAlyc3Y6MTsKLQlVU0hPUlQJTm9uR2ZQcmVzZW50OjE7Ci0JVVNIT1JUCU9wZXJhaW9uTW9kZToyOwotI2Vsc2UKLQlVU0hPUlQJT3BlcmFpb25Nb2RlOjI7Ci0JVVNIT1JUCU5vbkdmUHJlc2VudDoxOwotCVVTSE9SVAlyc3Y6MTsKLQlVU0hPUlQJT0JTU19Ob25IVEV4aXN0OjE7Ci0JVVNIT1JUCXJzdjI6MTE7Ci0jZW5kaWYKLX0gQUREX0hUSU5GTzIsICpQQUREX0hUSU5GTzI7Ci0KLQotLy8gVE9ETzogTmVlZCBzeW5jIHdpdGggc3BlYyBhYm91dCB0aGUgZGVmaW5pdGlvbiBvZiBTdGJjTWNzLiBJbiBEcmFmdCAzLjAzLCBpdCdzIHJlc2VydmVkLgotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlVU0hPUlQJcnN2OjQ7Ci0JVVNIT1JUCVBjb1BoYXNlOjE7Ci0JVVNIT1JUCVBjb0FjdGl2ZToxOwotCVVTSE9SVAlMc2lnVHhvcFByb3Q6MTsKLQlVU0hPUlQJU1RCQ0JlYWNvbjoxOwotCVVTSE9SVAlEdWFsQ1RTUHJvdGVjdDoxOwotCVVTSE9SVAlEdWFsQmVhY29uOjE7Ci0JVVNIT1JUCVN0YmNNY3M6NjsKLSNlbHNlCi0JVVNIT1JUCVN0YmNNY3M6NjsKLQlVU0hPUlQJRHVhbEJlYWNvbjoxOwotCVVTSE9SVAlEdWFsQ1RTUHJvdGVjdDoxOwotCVVTSE9SVAlTVEJDQmVhY29uOjE7Ci0JVVNIT1JUCUxzaWdUeG9wUHJvdDoxOwkvLyBMLVNJRyBUWE9QIHByb3RlY3Rpb24gZnVsbCBzdXBwb3J0Ci0JVVNIT1JUCVBjb0FjdGl2ZToxOwotCVVTSE9SVAlQY29QaGFzZToxOwotCVVTSE9SVAlyc3Y6NDsKLSNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCi19IEFERF9IVElORk8zLCAqUEFERF9IVElORk8zOwotCi0jZGVmaW5lIFNJWkVfQUREX0hUX0lORk9fSUUJCTIyCi10eXBlZGVmIHN0cnVjdCAgUEFDS0VEewotCVVDSEFSCQkJCUNvbnRyb2xDaGFuOwotCUFERF9IVElORk8JCQlBZGRIdEluZm87Ci0JQUREX0hUSU5GTzIJCQlBZGRIdEluZm8yOwotCUFERF9IVElORk8zCQkJQWRkSHRJbmZvMzsKLQlVQ0hBUgkJCQlNQ1NTZXRbMTZdOwkJLy8gQmFzaWMgTUNTIHNldAotfSBBRERfSFRfSU5GT19JRSwgKlBBRERfSFRfSU5GT19JRTsKLQotdHlwZWRlZiBzdHJ1Y3QgIFBBQ0tFRHsKLQlVQ0hBUgkJCQlOZXdFeHRDaGFuT2Zmc2V0OwotfSBORVdfRVhUX0NIQU5fSUUsICpQTkVXX0VYVF9DSEFOX0lFOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FXzgwMl8xMSB7Ci0gICAgSEVBREVSXzgwMl8xMSAgIEhkcjsKLSAgICBVQ0hBUiAgICAgICAgICAgIE9jdGV0WzFdOwotfSAgIEZSQU1FXzgwMl8xMSwgKlBGUkFNRV84MDJfMTE7Ci0KLS8vIFFvU051bGwgZW1iZWRkaW5nIG9mIG1hbmFnZW1lbnQgYWN0aW9uLiBXaGVuIEhUIENvbnRyb2wgTUEgZmllbGQgc2V0IHRvIDEuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01BX0JPRFkgewotICAgIFVDSEFSICAgICAgICAgICAgQ2F0ZWdvcnk7Ci0gICAgVUNIQVIgICAgICAgICAgICBBY3Rpb247Ci0gICAgVUNIQVIgICAgICAgICAgICBPY3RldFsxXTsKLX0gICBNQV9CT0RZLCAqUE1BX0JPRFk7Ci0KLXR5cGVkZWYJc3RydWN0CVBBQ0tFRCBfSEVBREVSXzgwMl8zCXsKLSAgICBVQ0hBUiAgICAgICAgICAgREFBZGRyMVtNQUNfQUREUl9MRU5dOwotICAgIFVDSEFSICAgICAgICAgICBTQUFkZHIyW01BQ19BRERSX0xFTl07Ci0gICAgVUNIQVIgICAgICAgICAgIE9jdGV0WzJdOwotfQlIRUFERVJfODAyXzMsICpQSEVBREVSXzgwMl8zOwotLy8vL0Jsb2NrIEFDSyByZWxhdGVkIGZvcm1hdAotLy8gMi1ieXRlIEJBIFBhcmFtZXRlciAgZmllbGQgIGluCURFTEJBIGZyYW1lcyB0byB0ZXJtaW5hdGUgYW4gYWxyZWFkeSBzZXQgdXAgYkEKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRHsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0gICAgVVNIT1JUICAgICAgVElEOjQ7CS8vIHZhbHVlIG9mIFRDIG9zIFRTCi0gICAgVVNIT1JUICAgICAgSW5pdGlhdG9yOjE7CS8vIDE6IG9yaWdpbmF0b3IgICAgMDpyZWNpcGllbnQKLSAgICBVU0hPUlQgICAgICBSc3Y6MTE7CS8vIGFsd2F5cyBzZXQgdG8gMAotI2Vsc2UKLSAgICBVU0hPUlQgICAgICBSc3Y6MTE7CS8vIGFsd2F5cyBzZXQgdG8gMAotICAgIFVTSE9SVCAgICAgIEluaXRpYXRvcjoxOwkvLyAxOiBvcmlnaW5hdG9yICAgIDA6cmVjaXBpZW50Ci0gICAgVVNIT1JUICAgICAgVElEOjQ7CS8vIHZhbHVlIG9mIFRDIG9zIFRTCi0jZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KLX0gREVMQkFfUEFSTSwgKlBERUxCQV9QQVJNOwotCi0vLyAyLWJ5dGUgQkEgUGFyYW1ldGVyIFNldCBmaWVsZCAgaW4gQUREQkEgZnJhbWVzIHRvIHNpZ25hbCBwYXJtIGZvciBzZXR0aW5nIHVwIGEgQkEKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotICAgIFVTSE9SVCAgICAgIEJ1ZlNpemU6MTA7CS8vIG51bWJlciBvZiBidWZmZSBvZiBzaXplIDIzMDQgb2N0ZXRzcgotICAgIFVTSE9SVCAgICAgIFRJRDo0OwkvLyB2YWx1ZSBvZiBUQyBvcyBUUwotICAgIFVTSE9SVCAgICAgIEJBUG9saWN5OjE7CS8vIDE6IGltbWVkaWF0ZWx5IEJBICAgIDA6ZGVsYXllZCBCQQotICAgIFVTSE9SVCAgICAgIEFNU0RVU3VwcG9ydGVkOjE7CS8vIDA6IG5vdCBwZXJtaXR0ZWQJCTE6IHBlcm1pdHRlZAotI2Vsc2UKLSAgICBVU0hPUlQgICAgICBBTVNEVVN1cHBvcnRlZDoxOwkvLyAwOiBub3QgcGVybWl0dGVkCQkxOiBwZXJtaXR0ZWQKLSAgICBVU0hPUlQgICAgICBCQVBvbGljeToxOwkvLyAxOiBpbW1lZGlhdGVseSBCQSAgICAwOmRlbGF5ZWQgQkEKLSAgICBVU0hPUlQgICAgICBUSUQ6NDsJLy8gdmFsdWUgb2YgVEMgb3MgVFMKLSAgICBVU0hPUlQgICAgICBCdWZTaXplOjEwOwkvLyBudW1iZXIgb2YgYnVmZmUgb2Ygc2l6ZSAyMzA0IG9jdGV0c3IKLSNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLwotfSBCQV9QQVJNLCAqUEJBX1BBUk07Ci0KLS8vIDItYnl0ZSBCQSBTdGFydGluZyBTZXEgQ09OVFJPTCBmaWVsZAotdHlwZWRlZiB1bmlvbiBQQUNLRUQgewotICAgIHN0cnVjdCBQQUNLRUQgewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSAgICBVU0hPUlQgICAgICBTdGFydFNlcToxMjsgICAvLyBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIDFzdCBNU0RVIGZvciB3aGljaCB0aGlzIEJBUiBpcyBzZW50Ci0JVVNIT1JUICAgICAgRnJhZ051bTo0OwkvLyBhbHdheXMgc2V0IHRvIDAKLSNlbHNlCi0gICAgVVNIT1JUICAgICAgRnJhZ051bTo0OwkvLyBhbHdheXMgc2V0IHRvIDAKLQlVU0hPUlQgICAgICBTdGFydFNlcToxMjsgICAvLyBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIDFzdCBNU0RVIGZvciB3aGljaCB0aGlzIEJBUiBpcyBzZW50Ci0jZW5kaWYgLyogUlRfQklHX0VORElBTiAqLwotICAgIH0gICBmaWVsZDsKLSAgICBVU0hPUlQgICAgICAgICAgIHdvcmQ7Ci19IEJBU0VRX0NPTlRST0wsICpQQkFTRVFfQ09OVFJPTDsKLQotLy9CQUNvbnRyb2wgYW5kIEJBUkNvbnRyb2wgYXJlIHRoZSBzYW1lCi0vLyAyLWJ5dGUgQkEgQ09OVFJPTCBmaWVsZCBpbiBCQSBmcmFtZQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0gICAgVVNIT1JUICAgICAgVElEOjQ7Ci0gICAgVVNIT1JUICAgICAgUnN2Ojk7Ci0gICAgVVNIT1JUICAgICAgQ29tcHJlc3NlZDoxOwotICAgIFVTSE9SVCAgICAgIE1USUQ6MTsJCS8vRVdDIFYxLjI0Ci0gICAgVVNIT1JUICAgICAgQUNLUG9saWN5OjE7IC8vIG9ubHkgcmVsYXRlZCB0byBOLURlbGF5ZWQgQkEuIEJ1dCBub3Qgc3VwcG9ydCBpbiBSVDI4NjBiLiAwOk5vcm1hbEFDSyAgMTpObyBBQ0sKLSNlbHNlCi0gICAgVVNIT1JUICAgICAgQUNLUG9saWN5OjE7IC8vIG9ubHkgcmVsYXRlZCB0byBOLURlbGF5ZWQgQkEuIEJ1dCBub3Qgc3VwcG9ydCBpbiBSVDI4NjBiLiAwOk5vcm1hbEFDSyAgMTpObyBBQ0sKLSAgICBVU0hPUlQgICAgICBNVElEOjE7CQkvL0VXQyBWMS4yNAotICAgIFVTSE9SVCAgICAgIENvbXByZXNzZWQ6MTsKLSAgICBVU0hPUlQgICAgICBSc3Y6OTsKLSAgICBVU0hPUlQgICAgICBUSUQ6NDsKLSNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLwotfSBCQV9DT05UUk9MLCAqUEJBX0NPTlRST0w7Ci0KLS8vIDItYnl0ZSBCQVIgQ09OVFJPTCBmaWVsZCBpbiBCQVIgZnJhbWUKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotICAgIFVTSE9SVCAgICAgIFRJRDo0OwotICAgIFVTSE9SVCAgICAgIFJzdjE6OTsKLSAgICBVU0hPUlQgICAgICBDb21wcmVzc2VkOjE7Ci0gICAgVVNIT1JUICAgICAgTVRJRDoxOwkJLy9pZiB0aGlzIGJpdDEsIHVzZSAgRlJBTUVfTVRCQV9SRVEsICBpZiAwLCB1c2UgRlJBTUVfQkFfUkVRCi0gICAgVVNIT1JUICAgICAgQUNLUG9saWN5OjE7Ci0jZWxzZQotICAgIFVTSE9SVCAgICAgIEFDS1BvbGljeToxOyAvLyAwOm5vcm1hbCBhY2ssICAxOm5vIGFjay4KLSAgICBVU0hPUlQgICAgICBNVElEOjE7CQkvL2lmIHRoaXMgYml0MSwgdXNlICBGUkFNRV9NVEJBX1JFUSwgIGlmIDAsIHVzZSBGUkFNRV9CQV9SRVEKLSAgICBVU0hPUlQgICAgICBDb21wcmVzc2VkOjE7Ci0gICAgVVNIT1JUICAgICAgUnN2MTo5OwotICAgIFVTSE9SVCAgICAgIFRJRDo0OwotI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCi19IEJBUl9DT05UUk9MLCAqUEJBUl9DT05UUk9MOwotCi0vLyBCQVJDb250cm9sIGluIE1UQkFSIGZyYW1lCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSAgICBVU0hPUlQgICAgICBOdW1USUQ6NDsKLSAgICBVU0hPUlQgICAgICBSc3YxOjk7Ci0gICAgVVNIT1JUICAgICAgQ29tcHJlc3NlZDoxOwotICAgIFVTSE9SVCAgICAgIE1USUQ6MTsKLSAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsKLSNlbHNlCi0gICAgVVNIT1JUICAgICAgQUNLUG9saWN5OjE7Ci0gICAgVVNIT1JUICAgICAgTVRJRDoxOwotICAgIFVTSE9SVCAgICAgIENvbXByZXNzZWQ6MTsKLSAgICBVU0hPUlQgICAgICBSc3YxOjk7Ci0gICAgVVNIT1JUICAgICAgTnVtVElEOjQ7Ci0jZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KLX0gTVRCQVJfQ09OVFJPTCwgKlBNVEJBUl9DT05UUk9MOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSAgICBVU0hPUlQgICAgICBUSUQ6NDsKLSAgICBVU0hPUlQgICAgICBSc3YxOjEyOwotI2Vsc2UKLSAgICBVU0hPUlQgICAgICBSc3YxOjEyOwotICAgIFVTSE9SVCAgICAgIFRJRDo0OwotI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCi19IFBFUl9USURfSU5GTywgKlBQRVJfVElEX0lORk87Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlQRVJfVElEX0lORk8gICAgICBQZXJUSUQ7Ci0JQkFTRVFfQ09OVFJPTAkgQkFTdGFydGluZ1NlcTsKLX0gRUFDSF9USUQsICpQRUFDSF9USUQ7Ci0KLQotLy8gQkFSRVEgQU5EIE1UQkFSRVEgaGF2ZSB0aGUgc2FtZSBzdWJ0eXBlIEJBUiwgODAyLjExbiBCQVIgdXNlIGNvbXByZXNzZWQgYml0bWFwLgotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9CQV9SRVEgewotCUZSQU1FX0NPTlRST0wgICBGQzsKLQlVU0hPUlQgICAgICAgICAgRHVyYXRpb247Ci0JVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07Ci0JVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07Ci0JQkFSX0NPTlRST0wgIEJBUkNvbnRyb2w7Ci0JQkFTRVFfQ09OVFJPTAkgQkFTdGFydGluZ1NlcTsKLX0gICBGUkFNRV9CQV9SRVEsICpQRlJBTUVfQkFfUkVROwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX01UQkFfUkVRIHsKLQlGUkFNRV9DT05UUk9MICAgRkM7Ci0JVVNIT1JUICAgICAgICAgIER1cmF0aW9uOwotCVVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotCU1UQkFSX0NPTlRST0wgIE1UQkFSQ29udHJvbDsKLQlQRVJfVElEX0lORk8JUGVyVElESW5mbzsKLQlCQVNFUV9DT05UUk9MCSBCQVN0YXJ0aW5nU2VxOwotfSAgIEZSQU1FX01UQkFfUkVRLCAqUEZSQU1FX01UQkFfUkVROwotCi0vLyBDb21wcmVzc2VkIGZvcm1hdCBpcyBtYW5kYW50b3J5IGluIEhUIFNUQQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9NVEJBIHsKLQlGUkFNRV9DT05UUk9MICAgRkM7Ci0JVVNIT1JUICAgICAgICAgIER1cmF0aW9uOwotCVVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotCUJBX0NPTlRST0wgIEJBQ29udHJvbDsKLQlCQVNFUV9DT05UUk9MCSBCQVN0YXJ0aW5nU2VxOwotCVVDSEFSCQlCaXRNYXBbOF07Ci19ICAgRlJBTUVfTVRCQSwgKlBGUkFNRV9NVEJBOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX1BTTVBfQUNUSU9OIHsKLQlIRUFERVJfODAyXzExICAgSGRyOwotCVVDSEFSCUNhdGVnb3J5OwotCVVDSEFSCUFjdGlvbjsKLQlVQ0hBUglQc21wOwkvLyA3LjMuMS4yNQotfSAgIEZSQU1FX1BTTVBfQUNUSU9OLCAqUEZSQU1FX1BTTVBfQUNUSU9OOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0FDVElPTl9IRFIgewotCUhFQURFUl84MDJfMTEgICBIZHI7Ci0JVUNIQVIJQ2F0ZWdvcnk7Ci0JVUNIQVIJQWN0aW9uOwotfSAgIEZSQU1FX0FDVElPTl9IRFIsICpQRlJBTUVfQUNUSU9OX0hEUjsKLQotLy9BY3Rpb24gRnJhbWUKLS8vQWN0aW9uIEZyYW1lICBDYXRlZ29yeTpTcGVjdHJ1bSwgIEFjdGlvbjpDaGFubmVsIFN3aXRjaC4gNy4zLjIuMjAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQ0hBTl9TV0lUQ0hfQU5OT1VOQ0UgewotCVVDSEFSCQkJCQlFbGVtZW50SUQ7CS8vIElEID0gSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UID0gMzcKLQlVQ0hBUgkJCQkJTGVuOwotCUNIQV9TV0lUQ0hfQU5OT1VOQ0VfSUUJQ1NBbm5vdW5jZUllOwotfSAgIENIQU5fU1dJVENIX0FOTk9VTkNFLCAqUENIQU5fU1dJVENIX0FOTk9VTkNFOwotCi0KLS8vODAyLjExbiA6IDcuMy4yLjIwYQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9TRUNPTkRfQ0hBTl9PRkZTRVQgewotCVVDSEFSCQkJCUVsZW1lbnRJRDsJCS8vIElEID0gSUVfU0VDT05EQVJZX0NIX09GRlNFVCA9IDYyCi0JVUNIQVIJCQkJTGVuOwotCVNFQ19DSEFfT0ZGU0VUX0lFCVNlY0NoT2Zmc2V0SWU7Ci19ICAgU0VDT05EX0NIQU5fT0ZGU0VULCAqUFNFQ09ORF9DSEFOX09GRlNFVDsKLQotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX1NQRVRSVU1fQ1MgewotCUhFQURFUl84MDJfMTEgICBIZHI7Ci0JVUNIQVIJQ2F0ZWdvcnk7Ci0JVUNIQVIJQWN0aW9uOwotCUNIQU5fU1dJVENIX0FOTk9VTkNFCUNTQW5ub3VuY2U7Ci0JU0VDT05EX0NIQU5fT0ZGU0VUCQlTZWNvbmRDaGFubmVsOwotfSAgIEZSQU1FX1NQRVRSVU1fQ1MsICpQRlJBTUVfU1BFVFJVTV9DUzsKLQotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0FEREJBX1JFUSB7Ci0JSEVBREVSXzgwMl8xMSAgIEhkcjsKLQlVQ0hBUglDYXRlZ29yeTsKLQlVQ0hBUglBY3Rpb247Ci0JVUNIQVIJVG9rZW47CS8vIDEKLQlCQV9QQVJNCQlCYVBhcm07CSAgICAgIC8vICAyIC0gMTAKLQlVU0hPUlQJCVRpbWVPdXRWYWx1ZTsJLy8gMCAtIDAKLQlCQVNFUV9DT05UUk9MCUJhU3RhcnRTZXE7IC8vIDAtMAotfSAgIEZSQU1FX0FEREJBX1JFUSwgKlBGUkFNRV9BRERCQV9SRVE7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfQUREQkFfUlNQIHsKLQlIRUFERVJfODAyXzExICAgSGRyOwotCVVDSEFSCUNhdGVnb3J5OwotCVVDSEFSCUFjdGlvbjsKLQlVQ0hBUglUb2tlbjsKLQlVU0hPUlQJU3RhdHVzQ29kZTsKLQlCQV9QQVJNCQlCYVBhcm07IC8vMCAtIDIKLQlVU0hPUlQJCVRpbWVPdXRWYWx1ZTsKLX0gICBGUkFNRV9BRERCQV9SU1AsICpQRlJBTUVfQUREQkFfUlNQOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0RFTEJBX1JFUSB7Ci0JSEVBREVSXzgwMl8xMSAgIEhkcjsKLQlVQ0hBUglDYXRlZ29yeTsKLQlVQ0hBUglBY3Rpb247Ci0JREVMQkFfUEFSTQkJRGVsYmFQYXJtOwotCVVTSE9SVAlSZWFzb25Db2RlOwotfSAgIEZSQU1FX0RFTEJBX1JFUSwgKlBGUkFNRV9ERUxCQV9SRVE7Ci0KLQotLy83LjIuMS43Ci10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0JBUiB7Ci0JRlJBTUVfQ09OVFJPTCAgIEZDOwotCVVTSE9SVCAgICAgICAgICBEdXJhdGlvbjsKLQlVQ0hBUiAgICAgICAgICAgQWRkcjFbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlCQVJfQ09OVFJPTAkJQmFyQ29udHJvbDsKLQlCQVNFUV9DT05UUk9MCVN0YXJ0aW5nU2VxOwotfSAgIEZSQU1FX0JBUiwgKlBGUkFNRV9CQVI7Ci0KLS8vNy4yLjEuNwotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9CQSB7Ci0JRlJBTUVfQ09OVFJPTCAgIEZDOwotCVVTSE9SVCAgICAgICAgICBEdXJhdGlvbjsKLQlVQ0hBUiAgICAgICAgICAgQWRkcjFbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlCQVJfQ09OVFJPTAkJQmFyQ29udHJvbDsKLQlCQVNFUV9DT05UUk9MCVN0YXJ0aW5nU2VxOwotCVVDSEFSCQliaXRtYXNrWzhdOwotfSAgIEZSQU1FX0JBLCAqUEZSQU1FX0JBOwotCi0KLS8vIFJhZGlvIE1lYXN1ZW1lbnQgUmVxdWVzdCBGcmFtZSBGb3JtYXQKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfUk1fUkVRX0FDVElPTiB7Ci0JSEVBREVSXzgwMl8xMSAgIEhkcjsKLQlVQ0hBUglDYXRlZ29yeTsKLQlVQ0hBUglBY3Rpb247Ci0JVUNIQVIJVG9rZW47Ci0JVVNIT1JUCVJlcGV0aXRpb247Ci0JVUNIQVIgICBkYXRhWzBdOwotfSAgIEZSQU1FX1JNX1JFUV9BQ1RJT04sICpQRlJBTUVfUk1fUkVRX0FDVElPTjsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKLQlVQ0hBUgkJSUQ7Ci0JVUNIQVIJCUxlbmd0aDsKLQlVQ0hBUgkJQ2hhbm5lbFN3aXRjaE1vZGU7Ci0JVUNIQVIJCU5ld1JlZ0NsYXNzOwotCVVDSEFSCQlOZXdDaGFubmVsTnVtOwotCVVDSEFSCQlDaGFubmVsU3dpdGNoQ291bnQ7Ci19IEhUX0VYVF9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlRfSUUsICpQSFRfRVhUX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVF9JRTsKLQotCi0vLwotLy8gX0xpbWl0IG11c3QgYmUgdGhlIDIqKm4gLSAxCi0vLyBfU0VRMSAsIF9TRVEyIG11c3QgYmUgd2l0aGluIDAgfiBfTGltaXQKLS8vCi0jZGVmaW5lIFNFUV9TVEVQT05FKF9TRVExLCBfU0VRMiwgX0xpbWl0KQkoKF9TRVExID09ICgoX1NFUTIrMSkgJiBfTGltaXQpKSkKLSNkZWZpbmUgU0VRX1NNQUxMRVIoX1NFUTEsIF9TRVEyLCBfTGltaXQpCSgoKF9TRVExLV9TRVEyKSAmICgoX0xpbWl0KzEpPj4xKSkpCi0jZGVmaW5lIFNFUV9MQVJHRVIoX1NFUTEsIF9TRVEyLCBfTGltaXQpCSgoX1NFUTEgIT0gX1NFUTIpICYmICEoKChfU0VRMS1fU0VRMikgJiAoKF9MaW1pdCsxKT4+MSkpKSkKLSNkZWZpbmUgU0VRX1dJVEhJTl9XSU4oX1NFUTEsIF9TRVEyLCBfV0lOLCBfTGltaXQpIChTRVFfTEFSR0VSKF9TRVExLCBfU0VRMiwgX0xpbWl0KSAmJiAgXAotCQkJCQkJCQkJCQkJU0VRX1NNQUxMRVIoX1NFUTEsICgoX1NFUTIrX1dJTisxKSZfTGltaXQpLCBfTGltaXQpKQotCi0vLwotLy8gQ29udGVudGlvbi1mcmVlIHBhcmFtZXRlciAod2l0aG91dCBJRCBhbmQgTGVuZ3RoKQotLy8KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0gICAgQk9PTEVBTiAgICAgYlZhbGlkOyAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCi0gICAgVUNIQVIgICAgICAgQ2ZwQ291bnQ7Ci0gICAgVUNIQVIgICAgICAgQ2ZwUGVyaW9kOwotICAgIFVTSE9SVCAgICAgIENmcE1heER1cmF0aW9uOwotICAgIFVTSE9SVCAgICAgIENmcER1clJlbWFpbmluZzsKLX0gQ0ZfUEFSTSwgKlBDRl9QQVJNOwotCi10eXBlZGVmCXN0cnVjdAlfQ0lQSEVSX1NVSVRFCXsKLQlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlQYWlyQ2lwaGVyOwkJLy8gVW5pY2FzdCBjaXBoZXIgMSwgdGhpcyBvbmUgaGFzIG1vcmUgc2VjdXJlZCBjaXBoZXIgc3VpdGUKLQlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlQYWlyQ2lwaGVyQXV4OwkvLyBVbmljYXN0IGNpcGhlciAyIGlmIEFQIGFubm91bmNlIHR3byB1bmljYXN0IGNpcGhlciBzdWl0ZQotCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCUdyb3VwQ2lwaGVyOwkvLyBHcm91cCBjaXBoZXIKLQlVU0hPUlQJCQkJCQkJUnNuQ2FwYWJpbGl0eTsJLy8gUlNOIGNhcGFiaWxpdHkgZnJvbSBiZWFjb24KLQlCT09MRUFOCQkJCQkJCWJNaXhNb2RlOwkJLy8gSW5kaWNhdGUgUGFpciAmIEdyb3VwIGNpcGhlciBtaWdodCBiZSBkaWZmZXJlbnQKLX0JQ0lQSEVSX1NVSVRFLCAqUENJUEhFUl9TVUlURTsKLQotLy8gRURDQSBjb25maWd1cmF0aW9uIGZyb20gQVAncyBCRUFDT04vUHJvYmVSc3AKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBCT09MRUFOICAgICBiVmFsaWQ7ICAgICAgICAgLy8gMTogdmFyaWFibGUgY29udGFpbnMgdmFsaWQgdmFsdWUKLSAgICBCT09MRUFOICAgICBiQWRkOyAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCi0gICAgQk9PTEVBTiAgICAgYlFBY2s7Ci0gICAgQk9PTEVBTiAgICAgYlF1ZXVlUmVxdWVzdDsKLSAgICBCT09MRUFOICAgICBiVHhvcFJlcXVlc3Q7Ci0gICAgQk9PTEVBTiAgICAgYkFQU0RDYXBhYmxlOwotLy8gIEJPT0xFQU4gICAgIGJNb3JlRGF0YUFjazsKLSAgICBVQ0hBUiAgICAgICBFZGNhVXBkYXRlQ291bnQ7Ci0gICAgVUNIQVIgICAgICAgQWlmc25bNF07ICAgICAgIC8vIDA6QUNfQkssIDE6QUNfQkUsIDI6QUNfVkksIDM6QUNfVk8KLSAgICBVQ0hBUiAgICAgICBDd21pbls0XTsKLSAgICBVQ0hBUiAgICAgICBDd21heFs0XTsKLSAgICBVU0hPUlQgICAgICBUeG9wWzRdOyAgICAgIC8vIGluIHVuaXQgb2YgMzItdXMKLSAgICBCT09MRUFOICAgICBiQUNNWzRdOyAgICAgIC8vIDE6IEFkbWlzc2lvbiBDb250cm9sIG9mIEFDX0JLIGlzIG1hbmRhdHRvcnkKLX0gRURDQV9QQVJNLCAqUEVEQ0FfUEFSTTsKLQotLy8gUUJTUyBMT0FEIGluZm9ybWF0aW9uIGZyb20gUUFQJ3MgQkVBQ09OL1Byb2JlUnNwCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgQk9PTEVBTiAgICAgYlZhbGlkOyAgICAgICAgICAgICAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCi0gICAgVVNIT1JUICAgICAgU3RhTnVtOwotICAgIFVDSEFSICAgICAgIENoYW5uZWxVdGlsaXphdGlvbjsKLSAgICBVU0hPUlQgICAgICBSZW1haW5pbmdBZG1pc3Npb25Db250cm9sOyAgLy8gaW4gdW5pdCBvZiAzMi11cwotfSBRQlNTX0xPQURfUEFSTSwgKlBRQlNTX0xPQURfUEFSTTsKLQotLy8gUUJTUyBJbmZvIGZpZWxkIGluIFFTVEEncyBhc3NvYyByZXEKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCVVDSEFSCQlSc3YyOjE7Ci0JVUNIQVIJCU1heFNQTGVuZ3RoOjI7Ci0JVUNIQVIJCVJzdjE6MTsKLQlVQ0hBUgkJVUFQU0RfQUNfQkU6MTsKLQlVQ0hBUgkJVUFQU0RfQUNfQks6MTsKLQlVQ0hBUgkJVUFQU0RfQUNfVkk6MTsKLQlVQ0hBUgkJVUFQU0RfQUNfVk86MTsKLSNlbHNlCi0gICAgVUNIQVIJCVVBUFNEX0FDX1ZPOjE7Ci0JVUNIQVIJCVVBUFNEX0FDX1ZJOjE7Ci0JVUNIQVIJCVVBUFNEX0FDX0JLOjE7Ci0JVUNIQVIJCVVBUFNEX0FDX0JFOjE7Ci0JVUNIQVIJCVJzdjE6MTsKLQlVQ0hBUgkJTWF4U1BMZW5ndGg6MjsKLQlVQ0hBUgkJUnN2MjoxOwotI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCi19IFFCU1NfU1RBX0lORk9fUEFSTSwgKlBRQlNTX1NUQV9JTkZPX1BBUk07Ci0KLS8vIFFCU1MgSW5mbyBmaWVsZCBpbiBRQVAncyBCZWFjb24vUHJvYmVSc3AKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCVVDSEFSCQlVQVBTRDoxOwotCVVDSEFSCQlSc3Y6MzsKLSAgICBVQ0hBUgkJUGFyYW1TZXRDb3VudDo0OwotI2Vsc2UKLSAgICBVQ0hBUgkJUGFyYW1TZXRDb3VudDo0OwotCVVDSEFSCQlSc3Y6MzsKLQlVQ0hBUgkJVUFQU0Q6MTsKLSNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLwotfSBRQlNTX0FQX0lORk9fUEFSTSwgKlBRQlNTX0FQX0lORk9fUEFSTTsKLQotLy8gUU9TIENhcGFiaWxpdHkgcmVwb3J0ZWQgaW4gUUFQJ3MgQkVBQ09OL1Byb2JlUnNwCi0vLyBRT1MgQ2FwYWJpbGl0eSBzZW50IG91dCBpbiBRU1RBJ3MgQXNzb2NpYXRlUmVxL1JlQXNzb2NpYXRlUmVxCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgQk9PTEVBTiAgICAgYlZhbGlkOyAgICAgICAgICAgICAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCi0gICAgQk9PTEVBTiAgICAgYlFBY2s7Ci0gICAgQk9PTEVBTiAgICAgYlF1ZXVlUmVxdWVzdDsKLSAgICBCT09MRUFOICAgICBiVHhvcFJlcXVlc3Q7Ci0vLyAgQk9PTEVBTiAgICAgYk1vcmVEYXRhQWNrOwotICAgIFVDSEFSICAgICAgIEVkY2FVcGRhdGVDb3VudDsKLX0gUU9TX0NBUEFCSUxJVFlfUEFSTSwgKlBRT1NfQ0FQQUJJTElUWV9QQVJNOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgVUNIQVIgICAgICAgSUVMZW47Ci0gICAgVUNIQVIgICAgICAgSUVbTUFYX0NVU1RPTV9MRU5dOwotfSBXUEFfSUVfOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBVQ0hBUiAgIEJzc2lkW01BQ19BRERSX0xFTl07Ci0gICAgVUNIQVIgICBDaGFubmVsOwotCVVDSEFSICAgQ2VudHJhbENoYW5uZWw7CS8vU3RvcmUgdGhlIHdpZGUtYmFuZCBjZW50cmFsIGNoYW5uZWwgZm9yIDQwTUh6LiAgLnVzZWQgaW4gNDBNSHogQVAuIE9yIHRoaXMgaXMgdGhlIHNhbWUgYXMgQ2hhbm5lbC4KLSAgICBVQ0hBUiAgIEJzc1R5cGU7Ci0gICAgVVNIT1JUICBBdGltV2luOwotICAgIFVTSE9SVCAgQmVhY29uUGVyaW9kOwotCi0gICAgVUNIQVIgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLSAgICBVQ0hBUiAgIFN1cFJhdGVMZW47Ci0gICAgVUNIQVIgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLSAgICBVQ0hBUiAgIEV4dFJhdGVMZW47Ci0JSFRfQ0FQQUJJTElUWV9JRSBIdENhcGFiaWxpdHk7Ci0JVUNIQVIJCQlIdENhcGFiaWxpdHlMZW47Ci0JQUREX0hUX0lORk9fSUUgQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLQlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKLQlVQ0hBUgkJCU5ld0V4dENoYW5PZmZzZXQ7Ci0JQ0hBUiAgICBSc3NpOwotICAgIFVDSEFSICAgUHJpdmFjeTsJCQkvLyBJbmRpY2F0ZSBzZWN1cml0eSBmdW5jdGlvbiBPTi9PRkYuIERvbid0IG1lc3MgdXAgd2l0aCBhdXRoIG1vZGUuCi0JVUNIQVIJSGlkZGVuOwotCi0gICAgVVNIT1JUICBEdGltUGVyaW9kOwotICAgIFVTSE9SVCAgQ2FwYWJpbGl0eUluZm87Ci0KLSAgICBVU0hPUlQgIENmcENvdW50OwotICAgIFVTSE9SVCAgQ2ZwUGVyaW9kOwotICAgIFVTSE9SVCAgQ2ZwTWF4RHVyYXRpb247Ci0gICAgVVNIT1JUICBDZnBEdXJSZW1haW5pbmc7Ci0gICAgVUNIQVIgICBTc2lkTGVuOwotICAgIENIQVIgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOwotCi0gICAgVUxPTkcgICBMYXN0QmVhY29uUnhUaW1lOyAvLyBPUydzIHRpbWVzdGFtcAotCi0JQk9PTEVBTgliU0VTOwotCi0JLy8gTmV3IGZvciBXUEEyCi0JQ0lQSEVSX1NVSVRFCQkJCQlXUEE7CQkJLy8gQVAgYW5ub3VuY2VkIFdQQSBjaXBoZXIgc3VpdGUKLQlDSVBIRVJfU1VJVEUJCQkJCVdQQTI7CQkJLy8gQVAgYW5ub3VuY2VkIFdQQTIgY2lwaGVyIHN1aXRlCi0KLQkvLyBOZXcgZm9yIG1pY3Jvc29mdCBXUEEgc3VwcG9ydAotCU5ESVNfODAyXzExX0ZJWEVEX0lFcwlGaXhJRXM7Ci0JTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERQlBdXRoTW9kZUF1eDsJLy8gQWRkaXRpb24gbW9kZSBmb3IgV1BBMiAvIFdQQSBjYXBhYmxlIEFQCi0JTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERQlBdXRoTW9kZTsKLQlORElTXzgwMl8xMV9XRVBfU1RBVFVTCVdlcFN0YXR1czsJCQkJLy8gVW5pY2FzdCBFbmNyeXB0aW9uIEFsZ29yaXRobSBleHRyYWN0IGZyb20gVkFSX0lFCi0JVVNIT1JUCQkJCQlWYXJJRUxlbjsJCQkJLy8gTGVuZ3RoIG9mIG5leHQgVklFIGluY2x1ZGUgRUlEICYgTGVuZ3RoCi0JVUNIQVIJCQkJCVZhcklFc1tNQVhfVklFX0xFTl07Ci0KLQkvLyBDQ1ggQ2tpcCBpbmZvcm1hdGlvbgotICAgIFVDSEFSICAgQ2tpcEZsYWc7Ci0KLQkvLyBDQ1ggMiBUU0YKLQlVQ0hBUglQVFNGWzRdOwkJLy8gUGFyZW50IFRTRgotCVVDSEFSCVRUU0ZbOF07CQkvLyBUYXJnZXQgVFNGCi0KLSAgICAvLyA4MDIuMTFlIGQ5LCBhbmQgV01NCi0JRURDQV9QQVJNICAgICAgICAgICBFZGNhUGFybTsKLQlRT1NfQ0FQQUJJTElUWV9QQVJNIFFvc0NhcGFiaWxpdHk7Ci0JUUJTU19MT0FEX1BBUk0gICAgICBRYnNzTG9hZDsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSAgICBXUEFfSUVfICAgICBXcGFJRTsKLSAgICBXUEFfSUVfICAgICBSc25JRTsKLSNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCi0JVUNIQVIJCUNvdW50cnlTdHJpbmdbM107Ci0JQk9PTEVBTgkJYkhhc0NvdW50cnlJRTsKLSNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLX0gQlNTX0VOVFJZLCAqUEJTU19FTlRSWTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFVDSEFSICAgICAgICAgICBCc3NOcjsKLSAgICBVQ0hBUiAgICAgICAgICAgQnNzT3ZlcmxhcE5yOwotICAgIEJTU19FTlRSWSAgICAgICBCc3NFbnRyeVtNQVhfTEVOX09GX0JTU19UQUJMRV07Ci19IEJTU19UQUJMRSwgKlBCU1NfVEFCTEU7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfUVVFVUVfRUxFTSB7Ci0gICAgVUxPTkcgICAgICAgICAgICAgTWFjaGluZTsKLSAgICBVTE9ORyAgICAgICAgICAgICBNc2dUeXBlOwotICAgIFVMT05HICAgICAgICAgICAgIE1zZ0xlbjsKLSAgICBVQ0hBUiAgICAgICAgICAgICBNc2dbTUdNVF9ETUFfQlVGRkVSX1NJWkVdOwotICAgIExBUkdFX0lOVEVHRVIgICAgIFRpbWVTdGFtcDsKLSAgICBVQ0hBUiAgICAgICAgICAgICBSc3NpMDsKLSAgICBVQ0hBUiAgICAgICAgICAgICBSc3NpMTsKLSAgICBVQ0hBUiAgICAgICAgICAgICBSc3NpMjsKLSAgICBVQ0hBUiAgICAgICAgICAgICBTaWduYWw7Ci0gICAgVUNIQVIgICAgICAgICAgICAgQ2hhbm5lbDsKLSAgICBVQ0hBUiAgICAgICAgICAgICBXY2lkOwotICAgIEJPT0xFQU4gICAgICAgICAgIE9jY3VwaWVkOwotI2lmZGVmIE1MTUVfRVgKLQlVU0hPUlQgICAgICAgICAgICBJZHg7Ci0jZW5kaWYgLy8gTUxNRV9FWCAvLwotfSBNTE1FX1FVRVVFX0VMRU0sICpQTUxNRV9RVUVVRV9FTEVNOwotCi10eXBlZGVmIHN0cnVjdCBfTUxNRV9RVUVVRSB7Ci0gICAgVUxPTkcgICAgICAgICAgICAgTnVtOwotICAgIFVMT05HICAgICAgICAgICAgIEhlYWQ7Ci0gICAgVUxPTkcgICAgICAgICAgICAgVGFpbDsKLSAgICBORElTX1NQSU5fTE9DSyAgIExvY2s7Ci0gICAgTUxNRV9RVUVVRV9FTEVNICBFbnRyeVtNQVhfTEVOX09GX01MTUVfUVVFVUVdOwotfSBNTE1FX1FVRVVFLCAqUE1MTUVfUVVFVUU7Ci0KLXR5cGVkZWYgVk9JRCAoKlNUQVRFX01BQ0hJTkVfRlVOQykoVk9JRCAqQWRhcHRvciwgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotdHlwZWRlZiBzdHJ1Y3QgX1NUQVRFX01BQ0hJTkUgewotICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZTsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yU3RhdGU7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBOck1zZzsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJTdGF0ZTsKLSAgICBTVEFURV9NQUNISU5FX0ZVTkMgICAgICAgICAgICAgKlRyYW5zRnVuYzsKLX0gU1RBVEVfTUFDSElORSwgKlBTVEFURV9NQUNISU5FOwotCi0KLS8vIE1MTUUgQVVYIGRhdGEgc3RydWN0dXJlIHRoYXQgaG9sZCB0ZW1wb3JhcmxpeSBzZXR0aW5ncyBkdXJpbmcgYSBjb25uZWN0aW9uIGF0dGVtcHQuCi0vLyBPbmNlIHRoaXMgYXR0ZW1wIHN1Y2NlZWRzLCBhbGwgc2V0dGluZ3Mgd2lsbCBiZSBjb3B5IHRvIHBBZC0+U3RhQWN0aXZlLgotLy8gQSBjb25uZWN0aW9uIGF0dGVtcHQgKHVzZXIgc2V0IE9JRCwgcm9hbWluZywgQ0NYIGZhc3Qgcm9hbWluZywuLikgY29uc2lzdHMgb2YKLS8vIHNldmVyYWwgc3RlcHMgKEpPSU4sIEFVVEgsIEFTU09DIG9yIFJFQVNTT0MpIGFuZCBtYXkgZmFpbCBhdCBhbnkgc3RlcC4gV2UgcHVycG9zZWx5Ci0vLyBzZXBhcmF0ZSB0aGlzIHVuZGVyLXRyaWFsIHNldHRpbmdzIGF3YXkgZnJvbSBwQWQtPlN0YUFjdGl2ZSBzbyB0aGF0IG9uY2UKLS8vIHRoaXMgbmV3IGF0dGVtcHQgZmFpbGVkLCBkcml2ZXIgY2FuIGF1dG8tcmVjb3ZlciBiYWNrIHRvIHRoZSBhY3RpdmUgc2V0dGluZ3MuCi10eXBlZGVmIHN0cnVjdCBfTUxNRV9BVVggewotICAgIFVDSEFSICAgICAgICAgICAgICAgQnNzVHlwZTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIFNzaWRMZW47Ci0gICAgVUNIQVIgICAgICAgICAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dOwotCVVDSEFSCQkJCUF1dG9SZWNvbm5lY3RTc2lkW01BWF9MRU5fT0ZfU1NJRF07Ci0JVUNIQVIJCQkJQXV0b1JlY29ubmVjdFNzaWRMZW47Ci0gICAgVVNIT1JUICAgICAgICAgICAgICBBbGc7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICBTY2FuVHlwZTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIENoYW5uZWw7Ci0JVUNIQVIgICAgICAgICAgICAgICBDZW50cmFsQ2hhbm5lbDsKLSAgICBVU0hPUlQgICAgICAgICAgICAgIEFpZDsKLSAgICBVU0hPUlQgICAgICAgICAgICAgIENhcGFiaWxpdHlJbmZvOwotICAgIFVTSE9SVCAgICAgICAgICAgICAgQmVhY29uUGVyaW9kOwotICAgIFVTSE9SVCAgICAgICAgICAgICAgQ2ZwTWF4RHVyYXRpb247Ci0gICAgVVNIT1JUICAgICAgICAgICAgICBDZnBQZXJpb2Q7Ci0gICAgVVNIT1JUICAgICAgICAgICAgICBBdGltV2luOwotCi0JLy8gQ29weSBzdXBwb3J0ZWQgcmF0ZSBmcm9tIGRlc2lyZWQgQVAncyBiZWFjb24uIFdlIGFyZSB0cnlpbmcgdG8gbWF0Y2gKLQkvLyBBUCdzIHN1cHBvcnRlZCBhbmQgZXh0ZW5kZWQgcmF0ZSBzZXR0aW5ncy4KLQlVQ0hBUgkJICAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUgkJICAgICAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUgkJICAgICAgICBTdXBSYXRlTGVuOwotCVVDSEFSCQkgICAgICAgIEV4dFJhdGVMZW47Ci0JSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OwotCVVDSEFSCQkJCUh0Q2FwYWJpbGl0eUxlbjsKLQlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLQlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQ7Ci0JLy9SVF9IVF9DQVBBQklMSVRZCVN1cHBvcnRlZEh0UGh5OwotCi0gICAgLy8gbmV3IGZvciBRT1MKLSAgICBRT1NfQ0FQQUJJTElUWV9QQVJNIEFQUW9zQ2FwYWJpbGl0eTsgICAgLy8gUU9TIGNhcGFiaWxpdHkgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAotICAgIEVEQ0FfUEFSTSAgICAgICAgICAgQVBFZGNhUGFybTsgICAgICAgICAvLyBFRENBIHBhcmFtZXRlcnMgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAotICAgIFFCU1NfTE9BRF9QQVJNICAgICAgQVBRYnNzTG9hZDsgICAgICAgICAvLyBRQlNTIGxvYWQgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAotCi0gICAgLy8gbmV3IHRvIGtlZXAgUmFsaW5rIHNwZWNpZmljIGZlYXR1cmUKLSAgICBVTE9ORyAgICAgICAgICAgICAgIEFQUmFsaW5rSWU7Ci0KLSAgICBCU1NfVEFCTEUgICAgICAgICAgIFNzaWRCc3NUYWI7ICAgICAvLyBBUCBsaXN0IGZvciB0aGUgc2FtZSBTU0lECi0gICAgQlNTX1RBQkxFICAgICAgICAgICBSb2FtVGFiOyAgICAgICAgLy8gQVAgbGlzdCBlbGlnaWJsZSBmb3Igcm9hbWluZwotICAgIFVMT05HICAgICAgICAgICAgICAgQnNzSWR4OwotICAgIFVMT05HICAgICAgICAgICAgICAgUm9hbUlkeDsKLQotCUJPT0xFQU4JCQkJQ3VyclJlcUlzRnJvbU5kaXM7Ci0KLSAgICBSQUxJTktfVElNRVJfU1RSVUNUIEJlYWNvblRpbWVyLCBTY2FuVGltZXI7Ci0gICAgUkFMSU5LX1RJTUVSX1NUUlVDVCBBdXRoVGltZXI7Ci0gICAgUkFMSU5LX1RJTUVSX1NUUlVDVCBBc3NvY1RpbWVyLCBSZWFzc29jVGltZXIsIERpc2Fzc29jVGltZXI7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLX0gTUxNRV9BVVgsICpQTUxNRV9BVVg7Ci0KLXR5cGVkZWYgc3RydWN0IF9NTE1FX0FEREJBX1JFUV9TVFJVQ1R7Ci0JVUNIQVIgICBXY2lkOwkvLwotCVVDSEFSICAgcEFkZHJbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgIEJhQnVmU2l6ZTsKLQlVU0hPUlQJVGltZU91dFZhbHVlOwotCVVDSEFSICAgVElEOwotCVVDSEFSICAgVG9rZW47Ci0JVVNIT1JUCUJhU3RhcnRTZXE7Ci19IE1MTUVfQUREQkFfUkVRX1NUUlVDVCwgKlBNTE1FX0FEREJBX1JFUV9TVFJVQ1Q7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfREVMQkFfUkVRX1NUUlVDVHsKLQlVQ0hBUiAgIFdjaWQ7CS8vCi0JVUNIQVIgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgIFRJRDsKLQlVQ0hBUglJbml0aWF0b3I7Ci19IE1MTUVfREVMQkFfUkVRX1NUUlVDVCwgKlBNTE1FX0RFTEJBX1JFUV9TVFJVQ1Q7Ci0KLS8vIGFzc29jIHN0cnVjdCBpcyBlcXVhbCB0byByZWFzc29jCi10eXBlZGVmIHN0cnVjdCBfTUxNRV9BU1NPQ19SRVFfU1RSVUNUewotICAgIFVDSEFSICAgICBBZGRyW01BQ19BRERSX0xFTl07Ci0gICAgVVNIT1JUICAgIENhcGFiaWxpdHlJbmZvOwotICAgIFVTSE9SVCAgICBMaXN0ZW5JbnR2OwotICAgIFVMT05HICAgICBUaW1lb3V0OwotfSBNTE1FX0FTU09DX1JFUV9TVFJVQ1QsICpQTUxNRV9BU1NPQ19SRVFfU1RSVUNULCBNTE1FX1JFQVNTT0NfUkVRX1NUUlVDVCwgKlBNTE1FX1JFQVNTT0NfUkVRX1NUUlVDVDsKLQotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfRElTQVNTT0NfUkVRX1NUUlVDVHsKLSAgICBVQ0hBUiAgICAgQWRkcltNQUNfQUREUl9MRU5dOwotICAgIFVTSE9SVCAgICBSZWFzb247Ci19IE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCwgKlBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1Q7Ci0KLXR5cGVkZWYgc3RydWN0IF9NTE1FX0FVVEhfUkVRX1NUUlVDVCB7Ci0gICAgVUNIQVIgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKLSAgICBVU0hPUlQgICAgICAgQWxnOwotICAgIFVMT05HICAgICAgICBUaW1lb3V0OwotfSBNTE1FX0FVVEhfUkVRX1NUUlVDVCwgKlBNTE1FX0FVVEhfUkVRX1NUUlVDVDsKLQotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfREVBVVRIX1JFUV9TVFJVQ1QgewotICAgIFVDSEFSICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07Ci0gICAgVVNIT1JUICAgICAgIFJlYXNvbjsKLX0gTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCwgKlBNTE1FX0RFQVVUSF9SRVFfU1RSVUNUOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgVUxPTkcgICAgICBCc3NJZHg7Ci19IE1MTUVfSk9JTl9SRVFfU1RSVUNUOwotCi10eXBlZGVmIHN0cnVjdCBfTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgewotICAgIFVDSEFSICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXTsKLSAgICBVQ0hBUiAgICAgIEJzc1R5cGU7Ci0gICAgVUNIQVIgICAgICBTY2FuVHlwZTsKLSAgICBVQ0hBUiAgICAgIFNzaWRMZW47Ci0gICAgQ0hBUiAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07Ci19IE1MTUVfU0NBTl9SRVFfU1RSVUNULCAqUE1MTUVfU0NBTl9SRVFfU1RSVUNUOwotCi10eXBlZGVmIHN0cnVjdCBfTUxNRV9TVEFSVF9SRVFfU1RSVUNUIHsKLSAgICBDSEFSICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07Ci0gICAgVUNIQVIgICAgICAgU3NpZExlbjsKLX0gTUxNRV9TVEFSVF9SRVFfU1RSVUNULCAqUE1MTUVfU1RBUlRfUkVRX1NUUlVDVDsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotLy8gc3RydWN0dXJlIGZvciBETFMKLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfRExTIHsKLQlVU0hPUlQJCQkJCQlUaW1lT3V0OwkJLy8gVXNlIHRvIHRpbWUgb3V0IHdoaWxlIHNsaWVuY2UsIHVuaXQ6IHNlY29uZCAsIHNldCBieSBVSQotCVVTSE9SVAkJCQkJCUNvdW50RG93blRpbWVyOwkvLyBVc2UgdG8gdGltZSBvdXQgd2hpbGUgc2xpZW5jZSx1bml0OiBzZWNvbmQgLCB1c2VkIGJ5IGRyaXZlciBvbmx5Ci0JTkRJU184MDJfMTFfTUFDX0FERFJFU1MJCU1hY0FkZHI7CQkvLyBzZXQgYnkgVUkKLQlVQ0hBUgkJCQkJCVN0YXR1czsJCQkvLyAwOiBub25lICwgMTogd2FpdCBTVEFrZXksIDI6IGZpbmlzaCBETFMgc2V0dXAgLCBzZXQgYnkgZHJpdmVyIG9ubHkKLQlCT09MRUFOCQkJCQkJVmFsaWQ7CQkJLy8gMTogdmFsaWQgLCAwOiBpbnZhbGlkICwgc2V0IGJ5IFVJLCB1c2UgdG8gc2V0dXAgb3IgdGVhciBkb3duIERMUyBsaW5rCi0JUkFMSU5LX1RJTUVSX1NUUlVDVAkJCVRpbWVyOwkJCS8vIFVzZSB0byB0aW1lIG91dCB3aGlsZSBoYW5kc2hha2UKLQlVU0hPUlQJCQkJCQlTZXF1ZW5jZTsKLQlVU0hPUlQJCQkJCQlNYWNUYWJNYXRjaFdDSUQ7CS8vIEFTSUMKLQlCT09MRUFOCQkJCQkJYkhUQ2FwOwotCVBWT0lECQkJCQkJcEFkOwotfSBSVF84MDJfMTFfRExTLCAqUFJUXzgwMl8xMV9ETFM7Ci0KLXR5cGVkZWYgc3RydWN0IF9NTE1FX0RMU19SRVFfU1RSVUNUIHsKLSAgICBQUlRfODAyXzExX0RMUwlwRExTOwotICAgIFVTSE9SVAkJCVJlYXNvbjsKLX0gTUxNRV9ETFNfUkVRX1NUUlVDVCwgKlBNTE1FX0RMU19SRVFfU1RSVUNUOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotICAgIFVDSEFSICAgRWlkOwotICAgIFVDSEFSICAgTGVuOwotICAgIFVDSEFSICAgT2N0ZXRbMV07Ci19IEVJRF9TVFJVQ1QsKlBFSURfU1RSVUNULCBCRUFDT05fRUlEX1NUUlVDVCwgKlBCRUFDT05fRUlEX1NUUlVDVDsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SVE1QX1RYX1JBVEVfU1dJVENICi17Ci0JVUNIQVIgICBJdGVtTm87Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCVVDSEFSCVJzdjI6MjsKLQlVQ0hBUglNb2RlOjI7Ci0JVUNIQVIJUnN2MToxOwotCVVDSEFSCUJXOjE7Ci0JVUNIQVIJU2hvcnRHSToxOwotCVVDSEFSCVNUQkM6MTsKLSNlbHNlCi0JVUNIQVIJU1RCQzoxOwotCVVDSEFSCVNob3J0R0k6MTsKLQlVQ0hBUglCVzoxOwotCVVDSEFSCVJzdjE6MTsKLQlVQ0hBUglNb2RlOjI7Ci0JVUNIQVIJUnN2MjoyOwotI2VuZGlmCi0JVUNIQVIgICBDdXJyTUNTOwotCVVDSEFSICAgVHJhaW5VcDsKLQlVQ0hBUiAgIFRyYWluRG93bjsKLX0gUlJUTVBfVFhfUkFURV9TV0lUQ0gsICpQUlRNUF9UWF9SQVRFX1NXSVRDSDsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gQVAgbWxtZS5oID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSNkZWZpbmUgVEJUVF9QUkVMT0FEX1RJTUUgICAgICAgMzg0ICAgICAgICAvLyB1c2VjLiBMb21nUHJlYW1ibGUgKyAyNC1ieXRlIGF0IDFNYnBzCi0jZGVmaW5lIERFRkFVTFRfRFRJTV9QRVJJT0QgICAgIDEKLQotLy8gd2VpZ2h0aW5nIGZhY3RvciB0byBjYWxjdWxhdGUgQ2hhbm5lbCBxdWFsaXR5LCB0b3RhbCBzaG91bGQgYmUgMTAwJQotLy8jZGVmaW5lIFJTU0lfV0VJR0hUSU5HICAgICAgICAgICAgICAgICAgIDAKLS8vI2RlZmluZSBUWF9XRUlHSFRJTkcgICAgICAgICAgICAgICAgICAgICA0MAotLy8jZGVmaW5lIFJYX1dFSUdIVElORyAgICAgICAgICAgICAgICAgICAgIDYwCi0KLSNkZWZpbmUgTUFDX1RBQkxFX0FHRU9VVF9USU1FCQkJMzAwCQkJLy8gdW5pdDogc2VjCi0jZGVmaW5lIE1BQ19UQUJMRV9BU1NPQ19USU1FT1VUCQkJNQkJCS8vIHVuaXQ6IHNlYwotI2RlZmluZSBNQUNfVEFCTEVfRlVMTChUYWIpCQkJCSgoVGFiKS5zaXplID09IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQotCi0vLyBBUCBzaGFsbCBkcm9wIHRoZSBzdGEgaWYgY29udGluZSBUeCBmYWlsIGNvdW50IHJlYWNoIGl0LgotI2RlZmluZSBNQUNfRU5UUllfTElGRV9DSEVDS19DTlQJCTIwCQkJLy8gcGFja2V0IGNudC4KLQotLy8gVmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+U3N0Ci10eXBlZGVmIGVudW0gX1NzdCB7Ci0gICAgU1NUX05PVF9BVVRILCAgIC8vIDA6IGVxdWl2YWxlbnQgdG8gSUVFRSA4MDIuMTEvMTk5OSBzdGF0ZSAxCi0gICAgU1NUX0FVVEgsICAgICAgIC8vIDE6IGVxdWl2YWxlbnQgdG8gSUVFRSA4MDIuMTEvMTk5OSBzdGF0ZSAyCi0gICAgU1NUX0FTU09DICAgICAgIC8vIDI6IGVxdWl2YWxlbnQgdG8gSUVFRSA4MDIuMTEvMTk5OSBzdGF0ZSAzCi19IFNTVDsKLQotLy8gdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+QXV0aFN0YXRlCi10eXBlZGVmIGVudW0gX0F1dGhTdGF0ZSB7Ci0gICAgQVNfTk9UX0FVVEgsCi0gICAgQVNfQVVUSF9PUEVOLCAgICAgICAvLyBTVEEgaGFzIGJlZW4gYXV0aGVudGljYXRlZCB1c2luZyBPUEVOIFNZU1RFTQotICAgIEFTX0FVVEhfS0VZLCAgICAgICAgLy8gU1RBIGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQgdXNpbmcgU0hBUkVEIEtFWQotICAgIEFTX0FVVEhFTlRJQ0FUSU5HICAgLy8gU1RBIGlzIHdhaXRpbmcgZm9yIEFVVEggc2VxIzMgdXNpbmcgU0hBUkVEIEtFWQotfSBBVVRIX1NUQVRFOwotCi0vL2Zvci13cGEgdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+V3BhU3RhdGUgIDgwMi4xaSBEMyAgIHAuMTE0Ci10eXBlZGVmIGVudW0gX0FwV3BhU3RhdGUgewotICAgIEFTX05PVFVTRSwgICAgICAgICAgICAgIC8vIDAKLSAgICBBU19ESVNDT05ORUNULCAgICAgICAgICAvLyAxCi0gICAgQVNfRElTQ09OTkVDVEVELCAgICAgICAgLy8gMgotICAgIEFTX0lOSVRJQUxJWkUsICAgICAgICAgIC8vIDMKLSAgICBBU19BVVRIRU5USUNBVElPTiwgICAgICAvLyA0Ci0gICAgQVNfQVVUSEVOVElDQVRJT04yLCAgICAgLy8gNQotICAgIEFTX0lOSVRQTUssICAgICAgICAgICAgIC8vIDYKLSAgICBBU19JTklUUFNLLCAgICAgICAgICAgICAvLyA3Ci0gICAgQVNfUFRLU1RBUlQsICAgICAgICAgICAgLy8gOAotICAgIEFTX1BUS0lOSVRfTkVHT1RJQVRJTkcsIC8vIDkKLSAgICBBU19QVEtJTklURE9ORSwgICAgICAgICAvLyAxMAotICAgIEFTX1VQREFURUtFWVMsICAgICAgICAgIC8vIDExCi0gICAgQVNfSU5URUdSSVRZX0ZBSUxVUkUsICAgLy8gMTIKLSAgICBBU19LRVlVUERBVEUsICAgICAgICAgICAvLyAxMwotfSBBUF9XUEFfU1RBVEU7Ci0KLS8vIGZvci13cGEgdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+V3BhU3RhdGUgIDgwMi4xaSBEMyAgIHAuMTE0Ci10eXBlZGVmIGVudW0gX0dUS1N0YXRlIHsKLSAgICBSRUtFWV9ORUdPVElBVElORywKLSAgICBSRUtFWV9FU1RBQkxJU0hFRCwKLSAgICBLRVlFUlJPUiwKLX0gR1RLX1NUQVRFOwotCi0vLyAgZm9yLXdwYSAgdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+V3BhU3RhdGUgIDgwMi4xaSBEMyAgIHAuMTE0Ci10eXBlZGVmIGVudW0gX1dwYUdUS1N0YXRlIHsKLSAgICBTRVRLRVlTLAotICAgIFNFVEtFWVNfRE9ORSwKLX0gV1BBX0dUS19TVEFURTsKLS8vID09PT09PT09PT09PT09PT09PT09PT0gZW5kIG9mIEFQIG1sbWUuaCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotI2VuZGlmCS8vIE1MTUVfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL21sbWVfZXguaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvbWxtZV9leC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2U5NGRjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvbWxtZV9leC5oCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBtbG1lX2V4LmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlGb25jaGkJCTIwMDctMDYtMjUJCUV4dGVuZCBvcmlnaW5hbCBtbG1lIEFQSXMgdG8gc3VwcG9ydCBtdWx0aS1lbnRyaWVzCi0qLwotI2lmbmRlZiBfX01MTUVfRVhfSF9fCi0jZGVmaW5lIF9fTUxNRV9FWF9IX18KLQotI2luY2x1ZGUgIm1sbWVfZXhfZGVmLmgiCi0KLQotVk9JRCBTdGF0ZU1hY2hpbmVJbml0RXgoCi0JSU4gU1RBVEVfTUFDSElORV9FWCAqUywKLQlJTiBTVEFURV9NQUNISU5FX0ZVTkNfRVggVHJhbnNbXSwKLQlJTiBVTE9ORyBTdE5yLAotCUlOIFVMT05HIE1zZ05yLAotCUlOIFNUQVRFX01BQ0hJTkVfRlVOQ19FWCBEZWZGdW5jLAotCUlOIFVMT05HIEluaXRTdGF0ZSwKLQlJTiBVTE9ORyBCYXNlKTsKLQotVk9JRCBTdGF0ZU1hY2hpbmVTZXRBY3Rpb25FeCgKLQlJTiBTVEFURV9NQUNISU5FX0VYICpTLAotCUlOIFVMT05HIFN0LAotCUlOIFVMT05HIE1zZywKLQlJTiBTVEFURV9NQUNISU5FX0ZVTkNfRVggRnVuYyk7Ci0KLUJPT0xFQU4gaXNWYWxpZEFwQ2xpSWYoCi0JU0hPUlQgSWR4KTsKLQotVk9JRCBTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uRXgoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gU1RBVEVfTUFDSElORV9FWCAqUywKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0sCi0JVVNIT1JUIElkeCwKLQlQVUxPTkcgcEN1cnJTdGF0ZSk7Ci0KLUJPT0xFQU4gTWxtZUVucXVldWVFeCgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVTE9ORyBNYWNoaW5lLAotCUlOIFVMT05HIE1zZ1R5cGUsCi0JSU4gVUxPTkcgTXNnTGVuLAotCUlOIFZPSUQgKk1zZywKLQlJTiBVU0hPUlQgSWR4KTsKLQotVk9JRCBEcm9wRXgoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtLAotCVBVTE9ORyBwQ3VyclN0YXRlLAotCVVTSE9SVCBJZHgpOwotCi0jZW5kaWYgLyogX19NTE1FX0VYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9tbG1lX2V4X2RlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9tbG1lX2V4X2RlZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2Q2MGI0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvbWxtZV9leF9kZWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgbWxtZV9leF9kZWYuaAotCi0gICAgQWJzdHJhY3Q6Ci0gICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUZvbmNoaQkJMjAwNy0wNi0yNQkJRXh0ZW5kIG9yaWdpbmFsIG1sbWUgQVBJcyB0byBzdXBwb3J0IG11bHRpLWVudHJpZXMKLSovCi0jaWZuZGVmIF9fTUxNRV9FWF9ERUZfSF9fCi0jZGVmaW5lIF9fTUxNRV9FWF9ERUZfSF9fCi0KLQotdHlwZWRlZiBWT0lEICgqU1RBVEVfTUFDSElORV9GVU5DX0VYKShWT0lEICpBZGFwdG9yLCBNTE1FX1FVRVVFX0VMRU0gKkVsZW0sIFBVTE9ORyBwQ3VyclN0YXRlLCBVU0hPUlQgSWR4KTsKLQotdHlwZWRlZiBzdHJ1Y3QgX1NUQV9TVEFURV9NQUNISU5FX0VYCi17Ci0JVUxPTkcJCQkJCUJhc2U7Ci0JVUxPTkcJCQkJCU5yU3RhdGU7Ci0JVUxPTkcJCQkJCU5yTXNnOwotCVVMT05HCQkJCQlDdXJyU3RhdGU7Ci0JU1RBVEVfTUFDSElORV9GVU5DX0VYCSpUcmFuc0Z1bmM7Ci19IFNUQVRFX01BQ0hJTkVfRVgsICpQU1RBX1NUQVRFX01BQ0hJTkVfRVg7Ci0KLSNlbmRpZiAvLyBfX01MTUVfRVhfREVGX0hfXyAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9uZXRpZl9ibG9jay5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9uZXRpZl9ibG9jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTc1Mzg5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvbmV0aWZfYmxvY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX19ORVRfSUZfQkxPQ0tfSF9fCi0jZGVmaW5lIF9fTkVUX0lGX0JMT0NLX0hfXwotCi0jaW5jbHVkZSAibGlua19saXN0LmgiCi0jaW5jbHVkZSAicnRtcC5oIgotCi0jZGVmaW5lIEZSRUVfTkVUSUZfUE9PTF9TSVpFIDMyCi0KLXR5cGVkZWYgc3RydWN0IF9ORVRJRl9FTlRSWQotewotCXN0cnVjdCBfTkVUSUZfRU5UUlkgKnBOZXh0OwotCVBORVRfREVWIHBOZXREZXY7Ci19IE5FVElGX0VOVFJZLCAqUE5FVElGX0VOVFJZOwotCi12b2lkIGluaXRibG9ja1F1ZXVlVGFiKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotQk9PTEVBTiBibG9ja05ldElmKAotCUlOIFBCTE9DS19RVUVVRV9FTlRSWSBwQmxvY2tRdWV1ZUVudHJ5LAotCUlOIFBORVRfREVWIHBOZXREZXYpOwotCi1WT0lEIHJlbGVhc2VOZXRJZigKLQlJTiBQQkxPQ0tfUVVFVUVfRU5UUlkgcEJsb2NrUXVldWVFbnRyeSk7Ci0KLVZPSUQgU3RvcE5ldElmUXVldWUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgUXVlSWR4LAotCUlOIFBORElTX1BBQ0tFVCBwUGFja2V0KTsKLSNlbmRpZiAvLyBfX05FVF9JRl9CTE9DS19IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvb2lkLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL29pZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWE0MzQwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvb2lkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQ0ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0Jb2lkLmgKLQotCUFic3RyYWN0OgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCQlXaGVuCQkJV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKLSovCi0jaWZuZGVmIF9PSURfSF8KLSNkZWZpbmUgX09JRF9IXwotCi0vLyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgotCi0jaWZuZGVmIFRSVUUKLSNkZWZpbmUgVFJVRQkJCQkxCi0jZW5kaWYKLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UJCQkJMAotI2VuZGlmCi0vLwotLy8gSUVFRSA4MDIuMTEgU3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMKLS8vCi0jZGVmaW5lIE1BWF9UWF9QT1dFUl9MRVZFTCAgICAgICAgICAgICAgMTAwICAgLyogbVcgKi8KLSNkZWZpbmUgTUFYX1JTU0lfVFJJR0dFUiAgICAgICAgICAgICAgICAtMTAgICAgLyogZEJtICovCi0jZGVmaW5lIE1JTl9SU1NJX1RSSUdHRVIgICAgICAgICAgICAgICAgLTIwMCAgIC8qIGRCbSAqLwotI2RlZmluZSBNQVhfRlJBR19USFJFU0hPTEQgICAgICAgICAgICAgIDIzNDYgIC8qIGJ5dGUgY291bnQgKi8KLSNkZWZpbmUgTUlOX0ZSQUdfVEhSRVNIT0xEICAgICAgICAgICAgICAyNTYgICAvKiBieXRlIGNvdW50ICovCi0jZGVmaW5lIE1BWF9SVFNfVEhSRVNIT0xEICAgICAgICAgICAgICAgMjM0NyAgLyogYnl0ZSBjb3VudCAqLwotCi0vLyBuZXcgdHlwZXMgZm9yIE1lZGlhIFNwZWNpZmljIEluZGljYXRpb25zCi0vLyBFeHRlbnNpb24gY2hhbm5lbCBvZmZzZXQKLSNkZWZpbmUgRVhUQ0hBX05PTkUJCQkwCi0jZGVmaW5lIEVYVENIQV9BQk9WRQkJMHgxCi0jZGVmaW5lIEVYVENIQV9CRUxPVwkJMHgzCi0KLS8vIEJXCi0jZGVmaW5lIEJBTkRfV0lEVEhfMjAJCTAKLSNkZWZpbmUgQkFORF9XSURUSF80MAkJMQotI2RlZmluZSBCQU5EX1dJRFRIX0JPVEgJCTIKLSNkZWZpbmUgQkFORF9XSURUSF8xMAkJMwkvLyA4MDIuMTFqIGhhcyAxME1Iei4gVGhpcyBkZWZpbml0aW9uIGlzIGZvciBpbnRlcm5hbCB1c2FnZS4gZG9lc24ndCBmaWxsIGluIHRoZSBJRSBvciBvdGhlciBmaWVsZC4KLS8vIFNIT1JUR0kKLSNkZWZpbmUgR0FQX0lOVEVSVkFMXzQwMAkxCS8vIG9ubHkgc3VwcG9ydCBpbiBIVCBtb2RlCi0jZGVmaW5lIEdBUF9JTlRFUlZBTF84MDAJMAotI2RlZmluZSBHQVBfSU5URVJWQUxfQk9USAkyCi0KLSNkZWZpbmUgTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQJCQkxCi0jZGVmaW5lIE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkCQkwCi0KLSNkZWZpbmUgTkRJU184MDJfMTFfTEVOR1RIX1NTSUQgICAgICAgICAzMgotI2RlZmluZSBORElTXzgwMl8xMV9MRU5HVEhfUkFURVMgICAgICAgIDgKLSNkZWZpbmUgTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYICAgICAxNgotI2RlZmluZSBNQUNfQUREUl9MRU5HVEggICAgICAgICAgICAgICAgIDYKLS8vI2RlZmluZSBNQVhfTlVNX09GX0NIUwkJCQkJNDkgLy8gMTQgY2hhbm5lbHMgQDIuNEcgKyAgMTJAVU5JSSArIDQgQE1NQUMgKyAxMSBASGlwZXJMQU4yICsgNyBASmFwYW4gKyAxIGFzIE5VTEwgdGVybWluYXRpb25jCi0jZGVmaW5lIE1BWF9OVU1fT0ZfQ0hTCQkJCTU0ICAgICAgLy8gMTQgY2hhbm5lbHMgQDIuNEcgKyAgMTJAVU5JSShsb3dlci9taWRkbGUpICsgMTZASGlwZXJMQU4yICsgMTFAVU5JSSh1cHBlcikgKyAwIEBKYXBhbiArIDEgYXMgTlVMTCB0ZXJtaW5hdGlvbgotI2RlZmluZSBNQVhfTlVNQkVSX09GX0VWRU5UCQkJCTEwICAvLyBlbnRyeSAjIGluIEVWRU5UIHRhYmxlCi0jZGVmaW5lIE1BWF9OVU1CRVJfT0ZfTUFDCQkJCTMyIC8vIGlmIE1BWF9NQlNTSURfTlVNIGlzIDgsIHRoaXMgdmFsdWUgY2FuJ3QgYmUgbGFyZ2VyIHRoYW4gMjExCi0jZGVmaW5lIE1BWF9OVU1CRVJfT0ZfQUNMCQkJCTY0Ci0jZGVmaW5lIE1BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFUwkJMTIgICAgLy8gMSwgMiwgNS41LCAxMSwgNiwgOSwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA1NAotI2RlZmluZSBNQVhfTlVNQkVSX09GX0RMU19FTlRSWQkJCTQKLQotCi0jZGVmaW5lIFJUX1FVRVJZX1NJR05BTF9DT05URVhUCQkJCTB4MDQwMgotI2RlZmluZSBSVF9TRVRfSUFQUF9QSUQJCQkJMHgwNDA0Ci0jZGVmaW5lIFJUX1NFVF9BUERfUElECQkJCQkJMHgwNDA1Ci0jZGVmaW5lIFJUX1NFVF9ERUxfTUFDX0VOVFJZCQkJCTB4MDQwNgotI2RlZmluZSBSVF9RVUVSWV9FVkVOVF9UQUJMRQkJCTB4MDQwNwotLy8KLS8vIElFRUUgODAyLjExIE9JRHMKLS8vCi0jZGVmaW5lCU9JRF9HRVRfU0VUX1RPR0dMRQkJCTB4ODAwMAotI2RlZmluZQlPSURfR0VUX1NFVF9GUk9NX1VJCQkJMHg0MDAwCi0KLSNkZWZpbmUJT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVTX1NVUFBPUlRFRAkJCTB4MDEwMwotI2RlZmluZQlPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0UJCQkJMHgwMTA0Ci0jZGVmaW5lCU9JRF84MDJfMTFfUlNTSV9UUklHR0VSCQkJCQkJMHgwMTA3Ci0jZGVmaW5lCVJUX09JRF84MDJfMTFfUlNTSQkJCQkJCQkweDAxMDggLy9ydDI4NjAJb25seSAsIGthdGh5Ci0jZGVmaW5lCVJUX09JRF84MDJfMTFfUlNTSV8xCQkJCQkJMHgwMTA5IC8vcnQyODYwCW9ubHkgLCBrYXRoeQotI2RlZmluZQlSVF9PSURfODAyXzExX1JTU0lfMgkJCQkJCTB4MDEwQSAvL3J0Mjg2MAlvbmx5ICwga2F0aHkKLSNkZWZpbmUJT0lEXzgwMl8xMV9OVU1CRVJfT0ZfQU5URU5OQVMJCQkJMHgwMTBCCi0jZGVmaW5lCU9JRF84MDJfMTFfUlhfQU5URU5OQV9TRUxFQ1RFRAkJCQkweDAxMEMKLSNkZWZpbmUJT0lEXzgwMl8xMV9UWF9BTlRFTk5BX1NFTEVDVEVECQkJCTB4MDEwRAotI2RlZmluZQlPSURfODAyXzExX1NVUFBPUlRFRF9SQVRFUwkJCQkJMHgwMTBFCi0jZGVmaW5lCU9JRF84MDJfMTFfQUREX1dFUAkJCQkJCQkweDAxMTIKLSNkZWZpbmUJT0lEXzgwMl8xMV9SRU1PVkVfV0VQCQkJCQkJMHgwMTEzCi0jZGVmaW5lCU9JRF84MDJfMTFfRElTQVNTT0NJQVRFCQkJCQkJMHgwMTE0Ci0jZGVmaW5lCU9JRF84MDJfMTFfUFJJVkFDWV9GSUxURVIJCQkJCTB4MDExOAotI2RlZmluZQlPSURfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OCQkJMHgwMTFFCi0jZGVmaW5lCU9JRF84MDJfMTFfVEVTVAkJCQkJCQkJMHgwMTFGCi0KLQotI2RlZmluZQlSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OCQkJCTB4MDUwNwotI2RlZmluZQlPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTgkJCQkJMHgwNTA4Ci0jZGVmaW5lCU9JRF84MDJfMTFfU1NJRAkJCQkJCQkJMHgwNTA5Ci0jZGVmaW5lCU9JRF84MDJfMTFfQlNTSUQJCQkJCQkJMHgwNTBBCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfUkFESU8JCQkJCQkJMHgwNTBCCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfUEhZX01PREUJCQkJCQkweDA1MEMKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHCQkJCQkweDA1MEQKLSNkZWZpbmUJT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTCQkJCQkweDA1MEUKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9QUkVBTUJMRQkJCQkJCTB4MDUwRgotI2RlZmluZQlPSURfODAyXzExX1dFUF9TVEFUVVMJCQkJCQkweDA1MTAKLSNkZWZpbmUJT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFCQkJCTB4MDUxMQotI2RlZmluZQlPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUJCQkJMHgwNTEyCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfUkVTRVRfQ09VTlRFUlMJCQkJMHgwNTEzCi0jZGVmaW5lCU9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRAkJCQkJMHgwNTE0Ci0jZGVmaW5lCU9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQJCQkweDA1MTUKLSNkZWZpbmUJT0lEXzgwMl8xMV9QT1dFUl9NT0RFCQkJCQkJMHgwNTE2Ci0jZGVmaW5lCU9JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUwJCQkJCTB4MDUxNwotI2RlZmluZQlSVF9PSURfODAyXzExX0FERF9XUEEJCQkJCQkweDA1MTgKLSNkZWZpbmUJT0lEXzgwMl8xMV9SRU1PVkVfS0VZCQkJCQkJMHgwNTE5Ci0jZGVmaW5lCU9JRF84MDJfMTFfQUREX0tFWQkJCQkJCQkweDA1MjAKLSNkZWZpbmUJT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OCQkJCQkweDA1MjEKLSNkZWZpbmUJT0lEXzgwMl8xMV9UWF9QQUNLRVRfQlVSU1QJCQkJCTB4MDUyMgotI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX05PSVNFX0xFVkVMCQkJCTB4MDUyMwotI2RlZmluZQlSVF9PSURfODAyXzExX0VYVFJBX0lORk8JCQkJCTB4MDUyNAotI2lmZGVmCURCRwotI2RlZmluZQlSVF9PSURfODAyXzExX0hBUkRXQVJFX1JFR0lTVEVSCQkJCTB4MDUyNQotI2VuZGlmCi0jZGVmaW5lIE9JRF84MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgICAgICAgICAgICBPSURfODAyXzExX1dFUF9TVEFUVVMKLSNkZWZpbmUgT0lEXzgwMl8xMV9ERUFVVEhFTlRJQ0FUSU9OICAgICAgICAgICAgICAgICAweDA1MjYKLSNkZWZpbmUgT0lEXzgwMl8xMV9EUk9QX1VORU5DUllQVEVEICAgICAgICAgICAgICAgICAweDA1MjcKLSNkZWZpbmUgT0lEXzgwMl8xMV9NSUNfRkFJTFVSRV9SRVBPUlRfRlJBTUUgICAgICAgICAweDA1MjgKLSNkZWZpbmUgT0lEXzgwMl8xMV9FQVBfTUVUSE9ECQkJCQkJMHgwNTI5Ci0KLS8vIEZvciA4MDIuMXggZGFlbWluIHVzaW5nIHRvIHJlcXVpcmUgY3VycmVudCBkcml2ZXIgY29uZmlndXJhdGlvbgotI2RlZmluZSBPSURfODAyXzExX1JBRElVU19RVUVSWV9TRVRUSU5HCQkJCTB4MDU0MAotCi0jZGVmaW5lCVJUX09JRF9ERVZJQ0VfTkFNRQkJCQkJCQkweDA2MDcKLSNkZWZpbmUJUlRfT0lEX1ZFUlNJT05fSU5GTwkJCQkJCQkweDA2MDgKLSNkZWZpbmUJT0lEXzgwMl8xMV9CU1NJRF9MSVNUCQkJCQkJMHgwNjA5Ci0jZGVmaW5lCU9JRF84MDJfM19DVVJSRU5UX0FERFJFU1MJCQkJCTB4MDYwQQotI2RlZmluZQlPSURfR0VOX01FRElBX0NPTk5FQ1RfU1RBVFVTCQkJCTB4MDYwQgotI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0xJTktfU1RBVFVTCQkJCTB4MDYwQwotI2RlZmluZQlPSURfODAyXzExX1JTU0kJCQkJCQkJCTB4MDYwRAotI2RlZmluZQlPSURfODAyXzExX1NUQVRJU1RJQ1MJCQkJCQkweDA2MEUKLSNkZWZpbmUJT0lEX0dFTl9SQ1ZfT0sJCQkJCQkJCTB4MDYwRgotI2RlZmluZQlPSURfR0VOX1JDVl9OT19CVUZGRVIJCQkJCQkweDA2MTAKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9FRVBST01fVkVSU0lPTgkJCTB4MDYxMQotI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0ZJUk1XQVJFX1ZFUlNJT04JCTB4MDYxMgotI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfUlhfUkFURQkJCTB4MDYxMwotI2RlZmluZQlSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzEJCQkJMHgwNjE0Ci0jZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfUElEVklECQkJCQkweDA2MTUKLS8vZm9yIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSNkZWZpbmUgT0lEX1NFVF9DT1VOVEVSTUVBU1VSRVMgICAgICAgICAgICAgICAgICAgICAweDA2MTYKLSNkZWZpbmUgT0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYICAgICAgICAgICAgICAgICAgICAweDA2MTcKLSNkZWZpbmUgT0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYX1JFUVVJUkVfS0VZICAgICAgICAweDA2MTgKLSNkZWZpbmUgT0lEXzgwMl8xMV9QTUtJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjAKLSNkZWZpbmUgUlRfT0lEX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgICAgICAgICAgICAgICAweDA2MjEKLSNkZWZpbmUgUlRfT0lEX1dFX1ZFUlNJT05fQ09NUElMRUQgICAgICAgICAgICAgICAgICAweDA2MjIKLSNkZWZpbmUgUlRfT0lEX05FV19EUklWRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjMKLQotI2RlZmluZQlSVF9PSURfODAyXzExX1NOUl8wCQkJCQkJCTB4MDYzMAotI2RlZmluZQlSVF9PSURfODAyXzExX1NOUl8xCQkJCQkJCTB4MDYzMQotI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfVFhfUkFURQkJCTB4MDYzMgotI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0hUX1BIWU1PREUJCQkJMHgwNjMzCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfU0VUX0hUX1BIWU1PREUJCQkJMHgwNjM0Ci0jZGVmaW5lCU9JRF84MDJfMTFfUkVMT0FEX0RFRkFVTFRTCQkJCQkweDA2MzUKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1NFVFRJTkcJCQkweDA2MzYKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9TRVRUSU5HCQkJCTB4MDYzNwotI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfUFNNCQkJCTB4MDYzOAotI2RlZmluZQlSVF9PSURfODAyXzExX1NFVF9BUFNEX1BTTQkJCQkJMHgwNjM5Ci0jZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfRExTCQkJCQkJMHgwNjNBCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfU0VUX0RMUwkJCQkJCTB4MDYzQgotI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0RMU19QQVJBTQkJCQkweDA2M0MKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNCQkJCQkweDA2M0QKLSNkZWZpbmUgUlRfT0lEXzgwMl8xMV9RVUVSWV9XTU0JCQkJMHgwNjNFCi0jZGVmaW5lIFJUX09JRF84MDJfMTFfU0VUX1dNTQkJCQkJCTB4MDYzRgotI2RlZmluZSBSVF9PSURfODAyXzExX1FVRVJZX0lNTUVfQkFfQ0FQCQkJCTB4MDY0MAotI2RlZmluZSBSVF9PSURfODAyXzExX1NFVF9JTU1FX0JBX0NBUAkJCQkweDA2NDEKLSNkZWZpbmUgUlRfT0lEXzgwMl8xMV9RVUVSWV9CQVRBQkxFCQkJCQkweDA2NDIKLSNkZWZpbmUgUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQQkJCQkJMHgwNjQzCi0jZGVmaW5lIFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBCQkJCQkweDA2NDQKLSNkZWZpbmUgUlRfT0lEX0RSSVZFUl9ERVZJQ0VfTkFNRSAgICAgICAgICAgICAgICAgICAweDA2NDUKLSNkZWZpbmUgUlRfT0lEXzgwMl8xMV9RVUVSWV9EQVRfSFRfUEhZTU9ERSAgICAgICAgICAweDA2NDYKLSNkZWZpbmUgUlRfT0lEX1FVRVJZX01VTFRJUExFX0NBUkRfU1VQUE9SVCAgICAgICAgICAweDA2NDcKLSNkZWZpbmUgT0lEXzgwMl8xMV9TRVRfUFNQWExJTktfTU9ERQkJCQkweDA2NDgKLS8qKysrIGFkZCBieSB3b29keSArKysqLwotI2RlZmluZSBPSURfODAyXzExX1NFVF9QQVNTUEhSQVNFCQkJCTB4MDY0OQotLy8gUmFsaW5rIGRlZmluZWQgT0lEcwotLy8gRGVubmlzIExlZSBtb3ZlIHRvIHBsYXRmb3JtIHNwZWNpZmljCi0KLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9CU1NJRAkJCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9CU1NJRCkKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TU0lECQkJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1NTSUQpCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUpCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfQUREX1dFUAkJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0FERF9XRVApCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfQUREX0tFWQkJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0FERF9LRVkpCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfUkVNT1ZFX1dFUAkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUkVNT1ZFX1dFUCkKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SRU1PVkVfS0VZCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9SRU1PVkVfS0VZKQotI2RlZmluZQlSVF9PSURfODAyXzExX0RJU0FTU09DSUFURQkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfRElTQVNTT0NJQVRFKQotI2RlZmluZQlSVF9PSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFKQotI2RlZmluZQlSVF9PSURfODAyXzExX1BSSVZBQ1lfRklMVEVSCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1BSSVZBQ1lfRklMVEVSKQotI2RlZmluZQlSVF9PSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTgkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4pCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfV0VQX1NUQVRVUwkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfV0VQX1NUQVRVUykKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SRUxPQURfREVGQVVMVFMJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUkVMT0FEX0RFRkFVTFRTKQotI2RlZmluZQlSVF9PSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0UJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFKQotI2RlZmluZQlSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1RYX1BPV0VSX0xFVkVMKQotI2RlZmluZQlSVF9PSURfODAyXzExX1JTU0lfVFJJR0dFUgkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUlNTSV9UUklHR0VSKQotI2RlZmluZQlSVF9PSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEKQotI2RlZmluZQlSVF9PSURfODAyXzExX1JUU19USFJFU0hPTEQJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1JUU19USFJFU0hPTEQpCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfUlhfQU5URU5OQV9TRUxFQ1RFRAkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1JYX0FOVEVOTkFfU0VMRUNURUQpCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfVFhfQU5URU5OQV9TRUxFQ1RFRAkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1RYX0FOVEVOTkFfU0VMRUNURUQpCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfU1VQUE9SVEVEX1JBVEVTCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1NVUFBPUlRFRF9SQVRFUykKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTKQotI2RlZmluZQlSVF9PSURfODAyXzExX0NPTkZJR1VSQVRJT04JCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0NPTkZJR1VSQVRJT04pCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfUE9XRVJfTU9ERQkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUE9XRVJfTU9ERSkKLSNkZWZpbmUgUlRfT0lEXzgwMl8xMV9TRVRfUFNQWExJTktfTU9ERQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9TRVRfUFNQWExJTktfTU9ERSkKLSNkZWZpbmUgUlRfT0lEXzgwMl8xMV9FQVBfTUVUSE9ECQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwgT0lEXzgwMl8xMV9FQVBfTUVUSE9EKQotI2RlZmluZSBSVF9PSURfODAyXzExX1NFVF9QQVNTUEhSQVNFCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfCBPSURfODAyXzExX1NFVF9QQVNTUEhSQVNFKQotCi0KLQotdHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9TVEFUVVNfVFlQRQotewotICAgIE5kaXM4MDJfMTFTdGF0dXNUeXBlX0F1dGhlbnRpY2F0aW9uLAotICAgIE5kaXM4MDJfMTFTdGF0dXNUeXBlX01lZGlhU3RyZWFtTW9kZSwKLSAgICBOZGlzODAyXzExU3RhdHVzVHlwZV9QTUtJRF9DYW5kaWRhdGVMaXN0LAotICAgIE5kaXM4MDJfMTFTdGF0dXNUeXBlTWF4ICAgIC8vIG5vdCBhIHJlYWwgdHlwZSwgZGVmaW5lZCBhcyBhbiB1cHBlciBib3VuZAotfSBORElTXzgwMl8xMV9TVEFUVVNfVFlQRSwgKlBORElTXzgwMl8xMV9TVEFUVVNfVFlQRTsKLQotdHlwZWRlZiBVQ0hBUiAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTWzZdOwotCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfU1RBVFVTX0lORElDQVRJT04KLXsKLSAgICBORElTXzgwMl8xMV9TVEFUVVNfVFlQRSBTdGF0dXNUeXBlOwotfSBORElTXzgwMl8xMV9TVEFUVVNfSU5ESUNBVElPTiwgKlBORElTXzgwMl8xMV9TVEFUVVNfSU5ESUNBVElPTjsKLQotLy8gbWFzayBmb3IgYXV0aGVudGljYXRpb24vaW50ZWdyaXR5IGZpZWxkcwotI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfQVVUSF9GSUVMRFMgICAgICAgIDB4MGYKLQotI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfUkVBVVRIICAgICAgICAgICAgIDB4MDEKLSNkZWZpbmUgTkRJU184MDJfMTFfQVVUSF9SRVFVRVNUX0tFWVVQREFURSAgICAgICAgICAweDAyCi0jZGVmaW5lIE5ESVNfODAyXzExX0FVVEhfUkVRVUVTVF9QQUlSV0lTRV9FUlJPUiAgICAgMHgwNgotI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfR1JPVVBfRVJST1IgICAgICAgIDB4MEUKLQotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1QKLXsKLSAgICBVTE9ORyBMZW5ndGg7ICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHN0cnVjdHVyZQotICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJzc2lkOwotICAgIFVMT05HIEZsYWdzOwotfSBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9SRVFVRVNULCAqUE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1Q7Ci0KLS8vQWRkZWQgbmV3IHR5cGVzIGZvciBQTUtJRCBDYW5kaWRhdGUgbGlzdHMuCi10eXBlZGVmIHN0cnVjdCBfUE1LSURfQ0FORElEQVRFIHsKLSAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKLSAgICBVTE9ORyBGbGFnczsKLX0gUE1LSURfQ0FORElEQVRFLCAqUFBNS0lEX0NBTkRJREFURTsKLQotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1BNS0lEX0NBTkRJREFURV9MSVNUCi17Ci0gICAgVUxPTkcgVmVyc2lvbjsgICAgICAgLy8gVmVyc2lvbiBvZiB0aGUgc3RydWN0dXJlCi0gICAgVUxPTkcgTnVtQ2FuZGlkYXRlczsgLy8gTm8uIG9mIHBta2lkIGNhbmRpZGF0ZXMKLSAgICBQTUtJRF9DQU5ESURBVEUgQ2FuZGlkYXRlTGlzdFsxXTsKLX0gTkRJU184MDJfMTFfUE1LSURfQ0FORElEQVRFX0xJU1QsICpQTkRJU184MDJfMTFfUE1LSURfQ0FORElEQVRFX0xJU1Q7Ci0KLS8vRmxhZ3MgZm9yIFBNS0lEIENhbmRpZGF0ZSBsaXN0IHN0cnVjdHVyZQotI2RlZmluZSBORElTXzgwMl8xMV9QTUtJRF9DQU5ESURBVEVfUFJFQVVUSF9FTkFCTEVECTB4MDEKLQotLy8gQWRkZWQgbmV3IHR5cGVzIGZvciBPRkRNIDVHIGFuZCAyLjRHCi10eXBlZGVmIGVudW0gX05ESVNfODAyXzExX05FVFdPUktfVFlQRQotewotICAgTmRpczgwMl8xMUZILAotICAgTmRpczgwMl8xMURTLAotICAgIE5kaXM4MDJfMTFPRkRNNSwKLSAgICBOZGlzODAyXzExT0ZETTI0LAotCU5kaXM4MDJfMTFBdXRvbW9kZSwKLSAgICBOZGlzODAyXzExT0ZETTVfTiwKLSAgICBOZGlzODAyXzExT0ZETTI0X04sCi0gICAgTmRpczgwMl8xMU5ldHdvcmtUeXBlTWF4ICAgIC8vIG5vdCBhIHJlYWwgdHlwZSwgZGVmaW5lZCBhcyBhbiB1cHBlciBib3VuZAotfSBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUsICpQTkRJU184MDJfMTFfTkVUV09SS19UWVBFOwotCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfTkVUV09SS19UWVBFX0xJU1QKLXsKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXJPZkl0ZW1zOyAgLy8gaW4gbGlzdCBiZWxvdywgYXQgbGVhc3QgMQotICAgTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgIE5ldHdvcmtUeXBlIFsxXTsKLX0gTkRJU184MDJfMTFfTkVUV09SS19UWVBFX0xJU1QsICpQTkRJU184MDJfMTFfTkVUV09SS19UWVBFX0xJU1Q7Ci0KLXR5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfUE9XRVJfTU9ERQotewotICAgIE5kaXM4MDJfMTFQb3dlck1vZGVDQU0sCi0gICAgTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1AsCi0gICAgTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQLAotICAgIE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQLAotICAgIE5kaXM4MDJfMTFQb3dlck1vZGVNYXggICAgICAvLyBub3QgYSByZWFsIG1vZGUsIGRlZmluZWQgYXMgYW4gdXBwZXIgYm91bmQKLX0gTkRJU184MDJfMTFfUE9XRVJfTU9ERSwgKlBORElTXzgwMl8xMV9QT1dFUl9NT0RFOwotCi10eXBlZGVmIFVMT05HICAgTkRJU184MDJfMTFfVFhfUE9XRVJfTEVWRUw7IC8vIGluIG1pbGxpd2F0dHMKLQotLy8KLS8vIFJlY2VpdmVkIFNpZ25hbCBTdHJlbmd0aCBJbmRpY2F0aW9uCi0vLwotdHlwZWRlZiBMT05HICAgIE5ESVNfODAyXzExX1JTU0k7ICAgICAgICAgICAvLyBpbiBkQm0KLQotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0NPTkZJR1VSQVRJT05fRkgKLXsKLSAgIFVMT05HICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHN0cnVjdHVyZQotICAgVUxPTkcgICAgICAgICAgIEhvcFBhdHRlcm47ICAgICAgICAvLyBBcyBkZWZpbmVkIGJ5IDgwMi4xMSwgTVNCIHNldAotICAgVUxPTkcgICAgICAgICAgIEhvcFNldDsgICAgICAgICAgICAvLyB0byBvbmUgaWYgbm9uLTgwMi4xMQotICAgVUxPTkcgICAgICAgICAgIER3ZWxsVGltZTsgICAgICAgICAvLyB1bml0cyBhcmUgS3VzZWMKLX0gTkRJU184MDJfMTFfQ09ORklHVVJBVElPTl9GSCwgKlBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OX0ZIOwotCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQ09ORklHVVJBVElPTgotewotICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiBzdHJ1Y3R1cmUKLSAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVhY29uUGVyaW9kOyAgICAgICAvLyB1bml0cyBhcmUgS3VzZWMKLSAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRJTVdpbmRvdzsgICAgICAgICAvLyB1bml0cyBhcmUgS3VzZWMKLSAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNDb25maWc7ICAgICAgICAgICAvLyBGcmVxdWVuY3ksIHVuaXRzIGFyZSBrSHoKLSAgIE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT05fRkggICAgRkhDb25maWc7Ci19IE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04sICpQTkRJU184MDJfMTFfQ09ORklHVVJBVElPTjsKLQotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1NUQVRJU1RJQ1MKLXsKLSAgIFVMT05HICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiBzdHJ1Y3R1cmUKLSAgIExBUkdFX0lOVEVHRVIgICBUcmFuc21pdHRlZEZyYWdtZW50Q291bnQ7Ci0gICBMQVJHRV9JTlRFR0VSICAgTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIEZhaWxlZENvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIFJldHJ5Q291bnQ7Ci0gICBMQVJHRV9JTlRFR0VSICAgTXVsdGlwbGVSZXRyeUNvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIFJUU1N1Y2Nlc3NDb3VudDsKLSAgIExBUkdFX0lOVEVHRVIgICBSVFNGYWlsdXJlQ291bnQ7Ci0gICBMQVJHRV9JTlRFR0VSICAgQUNLRmFpbHVyZUNvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIEZyYW1lRHVwbGljYXRlQ291bnQ7Ci0gICBMQVJHRV9JTlRFR0VSICAgUmVjZWl2ZWRGcmFnbWVudENvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIE11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudDsKLSAgIExBUkdFX0lOVEVHRVIgICBGQ1NFcnJvckNvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIFRLSVBMb2NhbE1JQ0ZhaWx1cmVzOwotICAgTEFSR0VfSU5URUdFUiAgIFRLSVBSZW1vdGVNSUNFcnJvcnM7Ci0gICBMQVJHRV9JTlRFR0VSICAgVEtJUElDVkVycm9yczsKLSAgIExBUkdFX0lOVEVHRVIgICBUS0lQQ291bnRlck1lYXN1cmVzSW52b2tlZDsKLSAgIExBUkdFX0lOVEVHRVIgICBUS0lQUmVwbGF5czsKLSAgIExBUkdFX0lOVEVHRVIgICBDQ01QRm9ybWF0RXJyb3JzOwotICAgTEFSR0VfSU5URUdFUiAgIENDTVBSZXBsYXlzOwotICAgTEFSR0VfSU5URUdFUiAgIENDTVBEZWNyeXB0RXJyb3JzOwotICAgTEFSR0VfSU5URUdFUiAgIEZvdXJXYXlIYW5kc2hha2VGYWlsdXJlczsKLX0gTkRJU184MDJfMTFfU1RBVElTVElDUywgKlBORElTXzgwMl8xMV9TVEFUSVNUSUNTOwotCi10eXBlZGVmICBVTE9ORyAgTkRJU184MDJfMTFfS0VZX0lOREVYOwotdHlwZWRlZiBVTE9OR0xPTkcgICBORElTXzgwMl8xMV9LRVlfUlNDOwotCi0jZGVmaW5lIE1BWF9SQURJVVNfU1JWX05VTQkJCTIJICAvLyA4MDIuMXggZmFpbG92ZXIgbnVtYmVyCi0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUkFESVVTX1NSVl9JTkZPIHsKLQlVSU5UMzIJCQlyYWRpdXNfaXA7Ci0JVUlOVDMyCQkJcmFkaXVzX3BvcnQ7Ci0JVUNIQVIJCQlyYWRpdXNfa2V5WzY0XTsKLQlVQ0hBUgkJCXJhZGl1c19rZXlfbGVuOwotfSBSQURJVVNfU1JWX0lORk8sICpQUkFESVVTX1NSVl9JTkZPOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JBRElVU19LRVlfSU5GTwotewotCVVDSEFSCQkJcmFkaXVzX3Nydl9udW07Ci0JUkFESVVTX1NSVl9JTkZPCXJhZGl1c19zcnZfaW5mb1tNQVhfUkFESVVTX1NSVl9OVU1dOwotCVVDSEFSCQkJaWVlZTgwMjF4V0VQOwkJIC8vIGR5bmFtaWMgV0VQCi0gICAgVUNIQVIgICAgICAgICAgIGtleV9pbmRleDsKLSAgICBVQ0hBUiAgICAgICAgICAga2V5X2xlbmd0aDsgICAgICAgICAgLy8gbGVuZ3RoIG9mIGtleSBpbiBieXRlcwotICAgIFVDSEFSICAgICAgICAgICBrZXlfbWF0ZXJpYWxbMTNdOwotfSBSQURJVVNfS0VZX0lORk8sICpQUkFESVVTX0tFWV9JTkZPOwotCi0vLyBJdCdzIHVzZWQgYnkgODAyLjF4IGRhZW1vbiB0byByZXF1aXJlIHJlbGF0aXZlIGNvbmZpZ3VyYXRpb24KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUkFESVVTX0NPTkYKLXsKLSAgICBVSU5UMzIgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgICAvLyBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUKLSAgICBVQ0hBUgkJCW1ic3NfbnVtOwkJCS8vIGluZGljYXRlIG11bHRpcGxlIEJTUyBudW1iZXIKLQlVSU5UMzIJCQlvd25faXBfYWRkcjsKLQlVSU5UMzIJCQlyZXRyeV9pbnRlcnZhbDsKLQlVSU5UMzIJCQlzZXNzaW9uX3RpbWVvdXRfaW50ZXJ2YWw7Ci0JVUNIQVIJCQlFQVBpZm5hbWVbOF1bSUZOQU1TSVpdOwotCVVDSEFSCQkJRUFQaWZuYW1lX2xlbls4XTsKLQlVQ0hBUgkJCVByZUF1dGhpZm5hbWVbOF1bSUZOQU1TSVpdOwotCVVDSEFSCQkJUHJlQXV0aGlmbmFtZV9sZW5bOF07Ci0JUkFESVVTX0tFWV9JTkZPCVJhZGl1c0luZm9bOF07Ci19IFJBRElVU19DT05GLCAqUFJBRElVU19DT05GOwotCi0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotLy8gS2V5IG1hcHBpbmcga2V5cyByZXF1aXJlIGEgQlNTSUQKLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9LRVkKLXsKLSAgICBVSU5UICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQotICAgIFVJTlQgICAgICAgICAgIEtleUluZGV4OwotICAgIFVJTlQgICAgICAgICAgIEtleUxlbmd0aDsgICAgICAgICAgLy8gbGVuZ3RoIG9mIGtleSBpbiBieXRlcwotICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJTU0lEOwotICAgIE5ESVNfODAyXzExX0tFWV9SU0MgS2V5UlNDOwotICAgIFVDSEFSICAgICAgICAgICBLZXlNYXRlcmlhbFsxXTsgICAgIC8vIHZhcmlhYmxlIGxlbmd0aCBkZXBlbmRpbmcgb24gYWJvdmUgZmllbGQKLX0gTkRJU184MDJfMTFfS0VZLCAqUE5ESVNfODAyXzExX0tFWTsKLQotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1BBU1NQSFJBU0UKLXsKLSAgICBVSU5UICAgICAgICAgICBLZXlMZW5ndGg7ICAgICAgICAgIC8vIGxlbmd0aCBvZiBrZXkgaW4gYnl0ZXMKLSAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKLSAgICBVQ0hBUiAgICAgICAgICAgS2V5TWF0ZXJpYWxbMV07ICAgICAvLyB2YXJpYWJsZSBsZW5ndGggZGVwZW5kaW5nIG9uIGFib3ZlIGZpZWxkCi19IE5ESVNfODAyXzExX1BBU1NQSFJBU0UsICpQTkRJU184MDJfMTFfUEFTU1BIUkFTRTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1JFTU9WRV9LRVkKLXsKLSAgICBVSU5UICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQotICAgIFVJTlQgICAgICAgICAgIEtleUluZGV4OwotICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJTU0lEOwotfSBORElTXzgwMl8xMV9SRU1PVkVfS0VZLCAqUE5ESVNfODAyXzExX1JFTU9WRV9LRVk7Ci0KLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9XRVAKLXsKLSAgIFVJTlQgICAgIExlbmd0aDsgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQotICAgVUlOVCAgICAgS2V5SW5kZXg7ICAgICAgICAgICAvLyAwIGlzIHRoZSBwZXItY2xpZW50IGtleSwgMS1OIGFyZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnbG9iYWwga2V5cwotICAgVUlOVCAgICAgS2V5TGVuZ3RoOyAgICAgLy8gbGVuZ3RoIG9mIGtleSBpbiBieXRlcwotICAgVUNIQVIgICAgIEtleU1hdGVyaWFsWzFdOy8vIHZhcmlhYmxlIGxlbmd0aCBkZXBlbmRpbmcgb24gYWJvdmUgZmllbGQKLX0gTkRJU184MDJfMTFfV0VQLCAqUE5ESVNfODAyXzExX1dFUDsKLQotCi10eXBlZGVmIGVudW0gX05ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUKLXsKLSAgIE5kaXM4MDJfMTFJQlNTLAotICAgTmRpczgwMl8xMUluZnJhc3RydWN0dXJlLAotICAgTmRpczgwMl8xMUF1dG9Vbmtub3duLAotICAgTmRpczgwMl8xMU1vbml0b3IsCi0gICBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmVNYXggICAgIC8vIE5vdCBhIHJlYWwgdmFsdWUsIGRlZmluZWQgYXMgdXBwZXIgYm91bmQKLX0gTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSwgKlBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFOwotCi0vLyBBZGQgbmV3IGF1dGhlbnRpY2F0aW9uIG1vZGVzCi10eXBlZGVmIGVudW0gX05ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUKLXsKLSAgIE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4sCi0gICBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQsCi0gICBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoLAotICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQSwKLSAgICBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0ssCi0gICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSwKLSAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIsCi0gICBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLLAotCU5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyLAotCU5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLLAotICAgTmRpczgwMl8xMUF1dGhNb2RlTWF4ICAgICAgICAgICAvLyBOb3QgYSByZWFsIG1vZGUsIGRlZmluZWQgYXMgdXBwZXIgYm91bmQKLX0gTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSwgKlBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFOwotCi10eXBlZGVmIFVDSEFSICAgTkRJU184MDJfMTFfUkFURVNbTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTXTsgICAgICAgIC8vIFNldCBvZiA4IGRhdGEgcmF0ZXMKLXR5cGVkZWYgVUNIQVIgICBORElTXzgwMl8xMV9SQVRFU19FWFtORElTXzgwMl8xMV9MRU5HVEhfUkFURVNfRVhdOyAgLy8gU2V0IG9mIDE2IGRhdGEgcmF0ZXMKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTXzgwMl8xMV9TU0lECi17Ci0gICAgVUlOVCAgIFNzaWRMZW5ndGg7ICAgICAgICAgLy8gbGVuZ3RoIG9mIFNTSUQgZmllbGQgYmVsb3csIGluIGJ5dGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNhbiBiZSB6ZXJvLgotICAgIFVDSEFSICAgU3NpZFtORElTXzgwMl8xMV9MRU5HVEhfU1NJRF07ICAgICAgICAgICAvLyBTU0lEIGluZm9ybWF0aW9uIGZpZWxkCi19IE5ESVNfODAyXzExX1NTSUQsICpQTkRJU184MDJfMTFfU1NJRDsKLQotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX05ESVNfV0xBTl9CU1NJRAotewotICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoOyAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlCi0gICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyAgICAgICAgICAgICBNYWNBZGRyZXNzOyAvLyBCU1NJRAotICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWRbMl07Ci0gICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkOyAgICAgICAvLyBTU0lECi0gICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcml2YWN5OyAgICAvLyBXRVAgZW5jcnlwdGlvbiByZXF1aXJlbWVudAotICAgTkRJU184MDJfMTFfUlNTSSAgICAgICAgICAgICAgICAgICAgUnNzaTsgICAgICAgLy8gcmVjZWl2ZSBzaWduYWwgc3RyZW5ndGggaW4gZEJtCi0gICBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgICAgICAgICAgICBOZXR3b3JrVHlwZUluVXNlOwotICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAgICAgICAgICAgQ29uZmlndXJhdGlvbjsKLSAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEluZnJhc3RydWN0dXJlTW9kZTsKLSAgIE5ESVNfODAyXzExX1JBVEVTICAgICAgICAgICAgICAgICAgIFN1cHBvcnRlZFJhdGVzOwotfSBORElTX1dMQU5fQlNTSUQsICpQTkRJU19XTEFOX0JTU0lEOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX05ESVNfODAyXzExX0JTU0lEX0xJU1QKLXsKLSAgIFVJTlQgICAgICAgICAgIE51bWJlck9mSXRlbXM7ICAgICAgLy8gaW4gbGlzdCBiZWxvdywgYXQgbGVhc3QgMQotICAgTkRJU19XTEFOX0JTU0lEIEJzc2lkWzFdOwotfSBORElTXzgwMl8xMV9CU1NJRF9MSVNULCAqUE5ESVNfODAyXzExX0JTU0lEX0xJU1Q7Ci0KLS8vIEFkZGVkIENhcGFiaWxpdGllcywgSUVMZW5ndGggYW5kIElFcyBmb3IgZWFjaCBCU1NJRAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTX1dMQU5fQlNTSURfRVgKLXsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQotICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTICAgICAgICAgICAgIE1hY0FkZHJlc3M7ICAgICAgICAgLy8gQlNTSUQKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZFsyXTsKLSAgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkOyAgICAgICAgICAgICAgIC8vIFNTSUQKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcml2YWN5OyAgICAgICAgICAgIC8vIFdFUCBlbmNyeXB0aW9uIHJlcXVpcmVtZW50Ci0gICAgTkRJU184MDJfMTFfUlNTSSAgICAgICAgICAgICAgICAgICAgUnNzaTsgICAgICAgICAgICAgICAvLyByZWNlaXZlIHNpZ25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RyZW5ndGggaW4gZEJtCi0gICAgTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgICAgICAgICAgTmV0d29ya1R5cGVJblVzZTsKLSAgICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICAgICAgICAgICBDb25maWd1cmF0aW9uOwotICAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEluZnJhc3RydWN0dXJlTW9kZTsKLSAgICBORElTXzgwMl8xMV9SQVRFU19FWCAgICAgICAgICAgICAgICBTdXBwb3J0ZWRSYXRlczsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUxlbmd0aDsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRXNbMV07Ci19IE5ESVNfV0xBTl9CU1NJRF9FWCwgKlBORElTX1dMQU5fQlNTSURfRVg7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTkRJU184MDJfMTFfQlNTSURfTElTVF9FWAotewotICAgIFVJTlQgICAgICAgICAgICAgICAgICAgTnVtYmVyT2ZJdGVtczsgICAgICAvLyBpbiBsaXN0IGJlbG93LCBhdCBsZWFzdCAxCi0gICAgTkRJU19XTEFOX0JTU0lEX0VYICAgICAgQnNzaWRbMV07Ci19IE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVgsICpQTkRJU184MDJfMTFfQlNTSURfTElTVF9FWDsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTXzgwMl8xMV9GSVhFRF9JRXMKLXsKLSAgICBVQ0hBUiBUaW1lc3RhbXBbOF07Ci0gICAgVVNIT1JUIEJlYWNvbkludGVydmFsOwotICAgIFVTSE9SVCBDYXBhYmlsaXRpZXM7Ci19IE5ESVNfODAyXzExX0ZJWEVEX0lFcywgKlBORElTXzgwMl8xMV9GSVhFRF9JRXM7Ci0KLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMKLXsKLSAgICBVQ0hBUiBFbGVtZW50SUQ7Ci0gICAgVUNIQVIgTGVuZ3RoOyAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gZGF0YSBmaWVsZAotICAgIFVDSEFSIGRhdGFbMV07Ci19IE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcywgKlBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXM7Ci0KLXR5cGVkZWYgIFVMT05HICAgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQ7Ci0KLXR5cGVkZWYgIFVMT05HICAgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRDsKLQotdHlwZWRlZiAgVUxPTkcgICBORElTXzgwMl8xMV9BTlRFTk5BOwotCi10eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSCi17Ci0gICBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbCwKLSAgIE5kaXM4MDJfMTFQcml2RmlsdGVyODAyMXhXRVAKLX0gTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVIsICpQTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVI7Ci0KLS8vIEFkZGVkIG5ldyBlbmNyeXB0aW9uIHR5cGVzCi0vLyBBbHNvIGFsaWFzZWQgdHlwZWRlZiB0byBuZXcgbmFtZQotdHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9XRVBfU1RBVFVTCi17Ci0gICBOZGlzODAyXzExV0VQRW5hYmxlZCwKLSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkID0gTmRpczgwMl8xMVdFUEVuYWJsZWQsCi0gICBOZGlzODAyXzExV0VQRGlzYWJsZWQsCi0gICAgTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCwKLSAgIE5kaXM4MDJfMTFXRVBLZXlBYnNlbnQsCi0gICAgTmRpczgwMl8xMUVuY3J5cHRpb24xS2V5QWJzZW50ID0gTmRpczgwMl8xMVdFUEtleUFic2VudCwKLSAgIE5kaXM4MDJfMTFXRVBOb3RTdXBwb3J0ZWQsCi0gICAgTmRpczgwMl8xMUVuY3J5cHRpb25Ob3RTdXBwb3J0ZWQgPSBOZGlzODAyXzExV0VQTm90U3VwcG9ydGVkLAotICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQsCi0gICAgTmRpczgwMl8xMUVuY3J5cHRpb24yS2V5QWJzZW50LAotICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQsCi0gICAgTmRpczgwMl8xMUVuY3J5cHRpb24zS2V5QWJzZW50LAotICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQsCS8vIFRLSVAgb3IgQUVTIG1peAotICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEtleUFic2VudCwKLSAgICBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQsCi0JTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCwKLX0gTkRJU184MDJfMTFfV0VQX1NUQVRVUywgKlBORElTXzgwMl8xMV9XRVBfU1RBVFVTLAotICBORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUywgKlBORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUzsKLQotdHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9SRUxPQURfREVGQVVMVFMKLXsKLSAgIE5kaXM4MDJfMTFSZWxvYWRXRVBLZXlzCi19IE5ESVNfODAyXzExX1JFTE9BRF9ERUZBVUxUUywgKlBORElTXzgwMl8xMV9SRUxPQURfREVGQVVMVFM7Ci0KLSNkZWZpbmUgTkRJU184MDJfMTFfQUlfUkVRRklfQ0FQQUJJTElUSUVTICAgICAgMQotI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVFGSV9MSVNURU5JTlRFUlZBTCAgICAyCi0jZGVmaW5lIE5ESVNfODAyXzExX0FJX1JFUUZJX0NVUlJFTlRBUEFERFJFU1MgIDQKLQotI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVNGSV9DQVBBQklMSVRJRVMgICAgICAxCi0jZGVmaW5lIE5ESVNfODAyXzExX0FJX1JFU0ZJX1NUQVRVU0NPREUgICAgICAgIDIKLSNkZWZpbmUgTkRJU184MDJfMTFfQUlfUkVTRklfQVNTT0NJQVRJT05JRCAgICAgNAotCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQUlfUkVRRkkKLXsKLSAgICBVU0hPUlQgQ2FwYWJpbGl0aWVzOwotICAgIFVTSE9SVCBMaXN0ZW5JbnRlcnZhbDsKLSAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyAgQ3VycmVudEFQQWRkcmVzczsKLX0gTkRJU184MDJfMTFfQUlfUkVRRkksICpQTkRJU184MDJfMTFfQUlfUkVRRkk7Ci0KLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9BSV9SRVNGSQotewotICAgIFVTSE9SVCBDYXBhYmlsaXRpZXM7Ci0gICAgVVNIT1JUIFN0YXR1c0NvZGU7Ci0gICAgVVNIT1JUIEFzc29jaWF0aW9uSWQ7Ci19IE5ESVNfODAyXzExX0FJX1JFU0ZJLCAqUE5ESVNfODAyXzExX0FJX1JFU0ZJOwotCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04KLXsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBMZW5ndGg7Ci0gICAgVVNIT1JUICAgICAgICAgICAgICAgICAgQXZhaWxhYmxlUmVxdWVzdEZpeGVkSUVzOwotICAgIE5ESVNfODAyXzExX0FJX1JFUUZJICAgIFJlcXVlc3RGaXhlZElFczsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBSZXF1ZXN0SUVMZW5ndGg7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgT2Zmc2V0UmVxdWVzdElFczsKLSAgICBVU0hPUlQgICAgICAgICAgICAgICAgICBBdmFpbGFibGVSZXNwb25zZUZpeGVkSUVzOwotICAgIE5ESVNfODAyXzExX0FJX1JFU0ZJICAgIFJlc3BvbnNlRml4ZWRJRXM7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgUmVzcG9uc2VJRUxlbmd0aDsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBPZmZzZXRSZXNwb25zZUlFczsKLX0gTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04sICpQTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT047Ci0KLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FVkVOVAotewotICAgIE5ESVNfODAyXzExX1NUQVRVU19JTkRJQ0FUSU9OICAgICAgIFN0YXR1czsKLSAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9SRVFVRVNUICBSZXF1ZXN0WzFdOwotfSBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FVkVOVCwgKlBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FVkVOVDsKLQotLyoKLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9URVNUCi17Ci0gICAgVUxPTkcgTGVuZ3RoOwotICAgIFVMT05HIFR5cGU7Ci0gICAgdW5pb24KLSAgICB7Ci0gICAgICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VWRU5UIEF1dGhlbnRpY2F0aW9uRXZlbnQ7Ci0gICAgICAgIE5ESVNfODAyXzExX1JTU0kgUnNzaVRyaWdnZXI7Ci0gICAgfTsKLX0gTkRJU184MDJfMTFfVEVTVCwgKlBORElTXzgwMl8xMV9URVNUOwotICovCi0KLS8vIDgwMi4xMSBNZWRpYSBzdHJlYW0gY29uc3RyYWludHMsIGFzc29jaWF0ZWQgd2l0aCBPSURfODAyXzExX01FRElBX1NUUkVBTV9NT0RFCi10eXBlZGVmIGVudW0gX05ESVNfODAyXzExX01FRElBX1NUUkVBTV9NT0RFCi17Ci0gICAgTmRpczgwMl8xMU1lZGlhU3RyZWFtT2ZmLAotICAgIE5kaXM4MDJfMTFNZWRpYVN0cmVhbU9uLAotfSBORElTXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERSwgKlBORElTXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERTsKLQotLy8gUE1LSUQgU3RydWN0dXJlcwotdHlwZWRlZiBVQ0hBUiAgIE5ESVNfODAyXzExX1BNS0lEX1ZBTFVFWzE2XTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotdHlwZWRlZiBzdHJ1Y3QgX0JTU0lEX0lORk8KLXsKLSAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKLSAgICBORElTXzgwMl8xMV9QTUtJRF9WQUxVRSBQTUtJRDsKLX0gQlNTSURfSU5GTywgKlBCU1NJRF9JTkZPOwotCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfUE1LSUQKLXsKLSAgICBVSU5UICAgIExlbmd0aDsKLSAgICBVSU5UICAgIEJTU0lESW5mb0NvdW50OwotICAgIEJTU0lEX0lORk8gQlNTSURJbmZvWzFdOwotfSBORElTXzgwMl8xMV9QTUtJRCwgKlBORElTXzgwMl8xMV9QTUtJRDsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRU5DUllQVElPTgotewotICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgQXV0aE1vZGVTdXBwb3J0ZWQ7Ci0gICAgTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgRW5jcnlwdFN0YXR1c1N1cHBvcnRlZDsKLX0gTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRU5DUllQVElPTiwgKlBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FTkNSWVBUSU9OOwotCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQ0FQQUJJTElUWQotewotICAgICBVTE9ORyBMZW5ndGg7Ci0gICAgIFVMT05HIFZlcnNpb247Ci0gICAgIFVMT05HIE5vT2ZQTUtJRHM7Ci0gICAgIFVMT05HIE5vT2ZBdXRoRW5jcnlwdFBhaXJzU3VwcG9ydGVkOwotICAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FTkNSWVBUSU9OIEF1dGhlbnRpY2F0aW9uRW5jcnlwdGlvblN1cHBvcnRlZFsxXTsKLX0gTkRJU184MDJfMTFfQ0FQQUJJTElUWSwgKlBORElTXzgwMl8xMV9DQVBBQklMSVRZOwotCi0jaWZkZWYgTElOVVgKLSNpZiBXSVJFTEVTU19FWFQgPD0gMTEKLSNpZm5kZWYgU0lPQ0RFVlBSSVZBVEUKLSNkZWZpbmUgU0lPQ0RFVlBSSVZBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCRTAKLSNlbmRpZgotI2RlZmluZSBTSU9DSVdGSVJTVFBSSVYJCQkJCQkJCVNJT0NERVZQUklWQVRFCi0jZW5kaWYKLSNlbmRpZiAvLyBMSU5VWCAvLwotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNkZWZpbmUgUlRfUFJJVl9JT0NUTAkJCQkJCQkoU0lPQ0lXRklSU1RQUklWICsgMHgwMSkgLy8gU3luYy4gd2l0aCBBUCBmb3Igd3NjIHVwbnAgZGFlbW9uCi0jZGVmaW5lIFJUUFJJVl9JT0NUTF9TRVQJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MDIpCi0KLSNpZmRlZiBEQkcKLSNkZWZpbmUgUlRQUklWX0lPQ1RMX0JCUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwMykKLSNkZWZpbmUgUlRQUklWX0lPQ1RMX01BQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwNSkKLQotI2lmZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotLy8gVE9ETzogc2hpYW5nLCBOZWVkIHRvIHJlYXNzaWduIHRoZSBvaWQgbnVtYmVyLiBBcmNoVGVhbSB1c2UgKFNJT0NJV0ZJUlNUUFJJViArIDB4MTkpIGZvciB0aGlzIG9pZAotI2RlZmluZSBSVFBSSVZfSU9DVExfUkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTSU9DSVdGSVJTVFBSSVYgKyAweDEzKSAgLy8gZWRpdCBieSBqb2hubGksIGZpeCByZWFkIHJmIHJlZ2lzdGVyIHByb2JsZW0KLSNlbmRpZiAvLyBSVE1QX1JGX1JXX1NVUFBPUlQgLy8KLQotI2RlZmluZSBSVFBSSVZfSU9DVExfRTJQICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTSU9DSVdGSVJTVFBSSVYgKyAweDA3KQotI2VuZGlmIC8vIERCRyAvLwotCi0jaWZkZWYgUkFMSU5LX0FURQotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0jZGVmaW5lIFJUUFJJVl9JT0NUTF9BVEUJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MDgpCi0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLSNkZWZpbmUgUlRQUklWX0lPQ1RMX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwOSkKLSNkZWZpbmUgUlRQUklWX0lPQ1RMX0FERF9QTUtJRF9DQUNIRSAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwQSkKLSNkZWZpbmUgUlRQUklWX0lPQ1RMX1JBRElVU19EQVRBICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwQykKLSNkZWZpbmUgUlRQUklWX0lPQ1RMX0dTSVRFU1VSVkVZCQkJCQkoU0lPQ0lXRklSU1RQUklWICsgMHgwRCkKLSNkZWZpbmUgUlRfUFJJVl9JT0NUTF9FWFQJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MEUpIC8vIFN5bmMuIHdpdGggUlQ2MSAoZm9yIHdwYV9zdXBwbGljYW50KQotI2RlZmluZSBSVFBSSVZfSU9DVExfR0VUX01BQ19UQUJMRQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MEYpCi0KLSNkZWZpbmUgUlRQUklWX0lPQ1RMX1NIT1cJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MTEpCi1lbnVtIHsKLQlTSE9XX0NPTk5fU1RBVFVTID0gNCwKLQlTSE9XX0RSVklFUl9WRVJJT04gPSA1LAotCVNIT1dfQkFfSU5GTyA9IDYsCi0JU0hPV19ERVNDX0lORk8gPSA3LAotCVJBSU9fT0ZGID0gMTAsCi0JUkFJT19PTiA9IDExLAotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCVNIT1dfRExTX0VOVFJZX0lORk8gPSAxOSwKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQlTSE9XX0NGR19WQUxVRSA9IDIwLAotCVNIT1dfQURIT0NfRU5UUllfSU5GTyA9IDIxLAotfTsKLQotCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCi0jaWZkZWYgU05NUF9TVVBQT1JUCi0vL1NOTVAgaWVlZSA4MDJkb3QxMSwga2F0aHkgLCAyMDA4XzAyMjAKLS8vIGRvdDExcmVzKDMpCi0jZGVmaW5lIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVST1VJCQkJMHgwNzAwCi0jZGVmaW5lIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVSTkFNRQkJCTB4MDcwMQotI2RlZmluZSBSVF9PSURfODAyXzExX1JFU09VUkNFVFlQRUlETkFNRQkJMHgwNzAyCi0KLS8vIGRvdDExc210KDEpCi0jZGVmaW5lIFJUX09JRF84MDJfMTFfUFJJVkFDWU9QVElPTklNUExFTUVOVEVECTB4MDcwMwotI2RlZmluZSBSVF9PSURfODAyXzExX1BPV0VSTUFOQUdFTUVOVE1PREUJCTB4MDcwNAotI2RlZmluZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRQkJCTB4MDcwNSAvLyByZWFkICwgd3JpdGUKLSNkZWZpbmUgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQJCQkJMHgwNzA2Ci0jZGVmaW5lIFJUX09JRF84MDJfMTFfV0VQS0VZTUFQUElOR0xFTkdUSAkJMHgwNzA3Ci0jZGVmaW5lIE9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUCQkJCTB4MDcwOAotI2RlZmluZSBPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUCQkJCTB4MDcwOQotI2RlZmluZSBSVF9PSURfODAyXzExX1BST0RVQ1RJRAkJCQkJMHgwNzEwCi0jZGVmaW5lIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVJRAkJCQkweDA3MTEKLQotLy8gLy9kb3QxMVBoeSg0KQotI2RlZmluZSBPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMCQkJCTB4MDcxMgotCi0vL2RvdDExbWFjCi0jZGVmaW5lIFJUX09JRF84MDJfMTFfTUFDX0FERFJFU1MJCQkJMHgwNzEzCi0jZW5kaWYgLy8gU05NUF9TVVBQT1JUIC8vCi0KLSNkZWZpbmUgT0lEXzgwMl8xMV9CVUlMRF9DSEFOTkVMX0VYCQkJCTB4MDcxNAotI2RlZmluZSBPSURfODAyXzExX0dFVF9DSF9MSVNUCQkJCQkweDA3MTUKLSNkZWZpbmUgT0lEXzgwMl8xMV9HRVRfQ09VTlRSWV9DT0RFCQkJCTB4MDcxNgotI2RlZmluZSBPSURfODAyXzExX0dFVF9DSEFOTkVMX0dFT0dSQVBIWQkJMHgwNzE3Ci0KLS8vI2RlZmluZSBSVF9PSURfODAyXzExX1NUQVRJU1RJQ1MgICAgICAgICAgICAgIChPSURfR0VUX1NFVF9UT0dHTEUgfCBPSURfODAyXzExX1NUQVRJU1RJQ1MpCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNkZWZpbmUgUlRfT0lEX1dTQ19TRVRfUEFTU1BIUkFTRSAgICAgICAgICAgICAgICAgICAweDA3NDAgLy8gcGFzc3BocmFzZSBmb3Igd3BhKDIpLXBzawotI2RlZmluZSBSVF9PSURfV1NDX0RSSVZFUl9BVVRPX0NPTk5FQ1QgICAgICAgICAgICAgIDB4MDc0MQotI2RlZmluZSBSVF9PSURfV1NDX1FVRVJZX0RFRkFVTFRfUFJPRklMRSAgICAgICAgICAgIDB4MDc0MgotI2RlZmluZSBSVF9PSURfV1NDX1NFVF9DT05OX0JZX1BST0ZJTEVfSU5ERVggICAgICAgIDB4MDc0MwotI2RlZmluZSBSVF9PSURfV1NDX1NFVF9BQ1RJT04gICAgICAgICAgICAgICAgICAgICAgIDB4MDc0NAotI2RlZmluZSBSVF9PSURfV1NDX1NFVF9TU0lEICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDc0NQotI2RlZmluZSBSVF9PSURfV1NDX1NFVF9QSU5fQ09ERSAgICAgICAgICAgICAgICAgICAgIDB4MDc0NgotI2RlZmluZSBSVF9PSURfV1NDX1NFVF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDc0NyAvLyBQSU4gb3IgUEJDCi0jZGVmaW5lIFJUX09JRF9XU0NfU0VUX0NPTkZfTU9ERSAgICAgICAgICAgICAgICAgICAgMHgwNzQ4IC8vIEVucm9sbGVlIG9yIFJlZ2lzdHJhcgotI2RlZmluZSBSVF9PSURfV1NDX1NFVF9QUk9GSUxFICAgICAgICAgICAgICAgICAgICAgIDB4MDc0OQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotI2RlZmluZQlSVF9PSURfV1NDX0NPTkZJR19TVEFUVVMJCQkJCTB4MDc0RgotI2RlZmluZSBSVF9PSURfODAyXzExX1dTQ19RVUVSWV9QUk9GSUxFCQkJCTB4MDc1MAotLy8gZm9yIGNvbnNpc3RlbmN5IHdpdGggUlQ2MQotI2RlZmluZSBSVF9PSURfV1NDX1FVRVJZX1NUQVRVUwkJCQkJCTB4MDc1MQotI2RlZmluZSBSVF9PSURfV1NDX1BJTl9DT0RFCQkJCQkJCTB4MDc1MgotI2RlZmluZSBSVF9PSURfV1NDX1VVSUQJCQkJCQkJCTB4MDc1MwotI2RlZmluZSBSVF9PSURfV1NDX1NFVF9TRUxFQ1RFRF9SRUdJU1RSQVIJCQkweDA3NTQKLSNkZWZpbmUgUlRfT0lEX1dTQ19FQVBNU0cJCQkJCQkJMHgwNzU1Ci0jZGVmaW5lIFJUX09JRF9XU0NfTUFOVUZBQ1RVUkVSCQkJCQkJMHgwNzU2Ci0jZGVmaW5lIFJUX09JRF9XU0NfTU9ERUxfTkFNRQkJCQkJCTB4MDc1NwotI2RlZmluZSBSVF9PSURfV1NDX01PREVMX05PCQkJCQkJCTB4MDc1OAotI2RlZmluZSBSVF9PSURfV1NDX1NFUklBTF9OTwkJCQkJCTB4MDc1OQotI2RlZmluZSBSVF9PSURfV1NDX01BQ19BRERSRVNTCQkJCQkJMHgwNzYwCi0KLSNpZmRlZiBMTFREX1NVUFBPUlQKLS8vIGZvciBjb25zaXN0ZW5jeSB3aXRoIFJUNjEKLSNkZWZpbmUgUlRfT0lEX0dFVF9QSFlfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAweDc2MQotI2VuZGlmIC8vIExMVERfU1VQUE9SVCAvLwotCi0jaWZkZWYgTklOVEVORE9fQVAKLS8vI2RlZmluZSBSVF9PSURfTklOVEVORE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQwMTA3NzAKLSNkZWZpbmUgUlRfT0lEXzgwMl8xMV9OSU5URU5ET19HRVRfVEFCTEUJCQkweDA3NzEgLy8oKFJUX09JRF9OSU5URU5ETyArIDB4MDEpICYgMHhmZmZmKQotI2RlZmluZSBSVF9PSURfODAyXzExX05JTlRFTkRPX1NFVF9UQUJMRQkJCTB4MDc3MiAvLygoUlRfT0lEX05JTlRFTkRPICsgMHgwMikgJiAweGZmZmYpCi0jZGVmaW5lIFJUX09JRF84MDJfMTFfTklOVEVORE9fQ0FQQUJMRQkJCQkweDA3NzMgLy8oKFJUX09JRF9OSU5URU5ETyArIDB4MDMpICYgMHhmZmZmKQotI2VuZGlmIC8vIE5JTlRFTkRPX0FQIC8vCi0KLQotLy8gTmV3IGZvciBNZWV0aW5nSG91c2UgQXBpIHN1cHBvcnQKLSNkZWZpbmUgT0lEX01IXzgwMl8xWF9TVVBQT1JURUQgICAgICAgICAgICAgICAweEZGRURDMTAwCi0KLS8vIE1JTU8gVHggcGFyYW1ldGVyLCBTaG9ydEdJLCBNQ1MsIFNUQkMsIGV0Yy4gIHRoZXNlIGFyZSBmaWVsZHMgaW4gVFhXSS4gRG9uJ3QgY2hhbmdlIHRoaXMgZGVmaW5pdGlvbiEhIQotdHlwZWRlZiB1bmlvbiAgX0hUVFJBTlNNSVRfU0VUVElORyB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCXN0cnVjdAl7Ci0JVVNIT1JUCQlNT0RFOjI7CS8vIFVzZSBkZWZpbml0aW9uIE1PREVfeHh4LgotLy8JVVNIT1JUCQlyc3Y6MzsKLQlVU0hPUlQJCVR4QkY6MTsKLQlVU0hPUlQJCXJzdjoyOwotCVVTSE9SVAkJU1RCQzoyOwkvL1NQQUNFCi0JVVNIT1JUCQlTaG9ydEdJOjE7Ci0JVVNIT1JUCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegotCVVTSE9SVAkJTUNTOjc7ICAgICAgICAgICAgICAgICAvLyBNQ1MKLQl9CWZpZWxkOwotI2Vsc2UKLQlzdHJ1Y3QJewotCVVTSE9SVAkJTUNTOjc7ICAgICAgICAgICAgICAgICAvLyBNQ1MKLQlVU0hPUlQJCUJXOjE7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6Ci0JVVNIT1JUCQlTaG9ydEdJOjE7Ci0JVVNIT1JUCQlTVEJDOjI7CS8vU1BBQ0UKLS8vCVVTSE9SVAkJcnN2OjM7Ci0JVVNIT1JUCQlyc3Y6MjsKLQlVU0hPUlQJCVR4QkY6MTsKLQlVU0hPUlQJCU1PREU6MjsJLy8gVXNlIGRlZmluaXRpb24gTU9ERV94eHguCi0JfQlmaWVsZDsKLSNlbmRpZgotCVVTSE9SVAkJd29yZDsKLSB9IEhUVFJBTlNNSVRfU0VUVElORywgKlBIVFRSQU5TTUlUX1NFVFRJTkc7Ci0KLXR5cGVkZWYgZW51bSBfUlRfODAyXzExX1BSRUFNQkxFIHsKLSAgICBSdDgwMl8xMVByZWFtYmxlTG9uZywKLSAgICBSdDgwMl8xMVByZWFtYmxlU2hvcnQsCi0gICAgUnQ4MDJfMTFQcmVhbWJsZUF1dG8KLX0gUlRfODAyXzExX1BSRUFNQkxFLCAqUFJUXzgwMl8xMV9QUkVBTUJMRTsKLQotdHlwZWRlZiBlbnVtIF9SVF84MDJfMTFfUEhZX01PREUgewotCVBIWV8xMUJHX01JWEVEID0gMCwKLQlQSFlfMTFCLAotCVBIWV8xMUEsCi0JUEhZXzExQUJHX01JWEVELAotCVBIWV8xMUcsCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JUEhZXzExQUJHTl9NSVhFRCwJLy8gYm90aCBiYW5kICAgNQotCVBIWV8xMU5fMl80RywJCS8vIDExbi1vbmx5IHdpdGggMi40RyBiYW5kCTYKLQlQSFlfMTFHTl9NSVhFRCwJLy8gMi40RyBiYW5kICAgICAgNwotCVBIWV8xMUFOX01JWEVELAkvLyA1RyAgYmFuZCAgICAgICA4Ci0JUEhZXzExQkdOX01JWEVELAkvLyBpZiBjaGVjayA4MDIuMTFiLiAgICAgIDkKLQlQSFlfMTFBR05fTUlYRUQsCS8vIGlmIGNoZWNrIDgwMi4xMWIuICAgICAgMTAKLQlQSFlfMTFOXzVHLAkJCS8vIDExbi1vbmx5IHdpdGggNUcgYmFuZAkJMTEKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLX0gUlRfODAyXzExX1BIWV9NT0RFOwotCi0KLS8vIHB1dCBhbGwgcHJvcHJpZXRlcnkgZm9yLXF1ZXJ5IG9iamVjdHMgaGVyZSB0byByZWR1Y2UgIyBvZiBRdWVyeV9PSUQKLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfTElOS19TVEFUVVMgewotICAgIFVMT05HICAgQ3VyclR4UmF0ZTsgICAgICAgICAvLyBpbiB1bml0cyBvZiAwLjVNYnBzCi0gICAgVUxPTkcgICBDaGFubmVsUXVhbGl0eTsgICAgIC8vIDAuLjEwMCAlCi0gICAgVUxPTkcgICBUeEJ5dGVDb3VudDsgICAgICAgIC8vIGJvdGggb2sgYW5kIGZhaWwKLSAgICBVTE9ORyAgIFJ4Qnl0ZUNvdW50OyAgICAgICAgLy8gYm90aCBvayBhbmQgZmFpbAotICAgIFVMT05HCUNlbnRyYWxDaGFubmVsOwkJLy8gNDBNSHogY2VudHJhbCBjaGFubmVsIG51bWJlcgotfSBSVF84MDJfMTFfTElOS19TVEFUVVMsICpQUlRfODAyXzExX0xJTktfU1RBVFVTOwotCi10eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0VWRU5UX0xPRyB7Ci0gICAgTEFSR0VfSU5URUdFUiAgIFN5c3RlbVRpbWU7ICAvLyB0aW1lc3RhbW1wIHZpYSBOZGlzR2V0Q3VycmVudFN5c3RlbVRpbWUoKQotICAgIFVDSEFSICAgICAgICAgICBBZGRyW01BQ19BRERSX0xFTkdUSF07Ci0gICAgVVNIT1JUICAgICAgICAgIEV2ZW50OyAgICAgICAvLyBFVkVOVF94eHgKLX0gUlRfODAyXzExX0VWRU5UX0xPRywgKlBSVF84MDJfMTFfRVZFTlRfTE9HOwotCi10eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0VWRU5UX1RBQkxFIHsKLSAgICBVTE9ORyAgICAgICBOdW07Ci0gICAgVUxPTkcgICAgICAgUnN2OyAgICAgLy8gdG8gYWxpZ24gTG9nW10gYXQgTEFSR0VfSU5FR0VSIGJvdW5kYXJ5Ci0gICAgUlRfODAyXzExX0VWRU5UX0xPRyAgIExvZ1tNQVhfTlVNQkVSX09GX0VWRU5UXTsKLX0gUlRfODAyXzExX0VWRU5UX1RBQkxFLCBQUlRfODAyXzExX0VWRU5UX1RBQkxFOwotCi0vLyBNSU1PIFR4IHBhcmFtZXRlciwgU2hvcnRHSSwgTUNTLCBTVEJDLCBldGMuICB0aGVzZSBhcmUgZmllbGRzIGluIFRYV0kuIERvbid0IGNoYW5nZSB0aGlzIGRlZmluaXRpb24hISEKLXR5cGVkZWYgdW5pb24gIF9NQUNIVFRSQU5TTUlUX1NFVFRJTkcgewotCXN0cnVjdAl7Ci0JVVNIT1JUCQlNQ1M6NzsgICAgICAgICAgICAgICAgIC8vIE1DUwotCVVTSE9SVAkJQlc6MTsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKLQlVU0hPUlQJCVNob3J0R0k6MTsKLQlVU0hPUlQJCVNUQkM6MjsJLy9TUEFDRQotCVVTSE9SVAkJcnN2OjM7Ci0JVVNIT1JUCQlNT0RFOjI7CS8vIFVzZSBkZWZpbml0aW9uIE1PREVfeHh4LgotCX0JZmllbGQ7Ci0JVVNIT1JUCQl3b3JkOwotIH0gTUFDSFRUUkFOU01JVF9TRVRUSU5HLCAqUE1BQ0hUVFJBTlNNSVRfU0VUVElORzsKLQotdHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9NQUNfRU5UUlkgewotICAgIFVDSEFSICAgICAgIEFkZHJbTUFDX0FERFJfTEVOR1RIXTsKLSAgICBVQ0hBUiAgICAgICBBaWQ7Ci0gICAgVUNIQVIgICAgICAgUHNtOyAgICAgLy8gMDpQV1JfQUNUSVZFLCAxOlBXUl9TQVZFCi0gICAgVUNIQVIJCU1pbW9QczsgIC8vIDA6TU1QU19TVEFUSUMsIDE6TU1QU19EWU5BTUlDLCAzOk1NUFNfRW5hYmxlZAotICAgIENIQVIJCUF2Z1Jzc2kwOwotCUNIQVIJCUF2Z1Jzc2kxOwotCUNIQVIJCUF2Z1Jzc2kyOwotCVVJTlQzMgkJQ29ubmVjdGVkVGltZTsKLSAgICBNQUNIVFRSQU5TTUlUX1NFVFRJTkcJVHhSYXRlOwotfSBSVF84MDJfMTFfTUFDX0VOVFJZLCAqUFJUXzgwMl8xMV9NQUNfRU5UUlk7Ci0KLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfTUFDX1RBQkxFIHsKLSAgICBVTE9ORyAgICAgICBOdW07Ci0gICAgUlRfODAyXzExX01BQ19FTlRSWSBFbnRyeVtNQVhfTlVNQkVSX09GX01BQ107Ci19IFJUXzgwMl8xMV9NQUNfVEFCTEUsICpQUlRfODAyXzExX01BQ19UQUJMRTsKLQotLy8gc3RydWN0dXJlIGZvciBxdWVyeS9zZXQgaGFyZHdhcmUgcmVnaXN0ZXIgLSBNQUMsIEJCUCwgUkYgcmVnaXN0ZXIKLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfSEFSRFdBUkVfUkVHSVNURVIgewotICAgIFVMT05HICAgSGFyZHdhcmVUeXBlOyAgICAgICAvLyAwOk1BQywgMTpCQlAsIDI6UkYgcmVnaXN0ZXIsIDM6RUVQUk9NCi0gICAgVUxPTkcgICBPZmZzZXQ7ICAgICAgICAgICAgIC8vIFEvUyByZWdpc3RlciBvZmZzZXQgYWRkcgotICAgIFVMT05HICAgRGF0YTsgICAgICAgICAgICAgICAvLyBSL1cgZGF0YSBidWZmZXIKLX0gUlRfODAyXzExX0hBUkRXQVJFX1JFR0lTVEVSLCAqUFJUXzgwMl8xMV9IQVJEV0FSRV9SRUdJU1RFUjsKLQotdHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9BUF9DT05GSUcgewotICAgIFVMT05HICAgRW5hYmxlVHhCdXJzdDsgICAgICAvLyAwLWRpc2FibGUsIDEtZW5hYmxlCi0gICAgVUxPTkcgICBFbmFibGVUdXJib1JhdGU7ICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUgNzIvMTAwbWJwcyB0dXJibyByYXRlCi0gICAgVUxPTkcgICBJc29sYXRlSW50ZXJTdGFUcmFmZmljOyAgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZSBpc29sYXRpb24KLSAgICBVTE9ORyAgIEhpZGVTc2lkOyAgICAgICAgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZSBoaWRpbmcKLSAgICBVTE9ORyAgIFVzZUJHUHJvdGVjdGlvbjsgICAgLy8gMC1BVVRPLCAxLWFsd2F5cyBPTiwgMi1hbHdheXMgT0ZGCi0gICAgVUxPTkcgICBVc2VTaG9ydFNsb3RUaW1lOyAgIC8vIDAtbm8gdXNlLCAxLXVzZSA5LXVzIHNob3J0IHNsb3QgdGltZQotICAgIFVMT05HICAgUnN2MTsgICAgICAgICAgICAgICAvLyBtdXN0IGJlIDAKLSAgICBVTE9ORyAgIFN5c3RlbUVycm9yQml0bWFwOyAgLy8gaWdub3JlIHVwb24gU0VULCByZXR1cm4gc3lzdGVtIGVycm9yIHVwb24gUVVFUlkKLX0gUlRfODAyXzExX0FQX0NPTkZJRywgKlBSVF84MDJfMTFfQVBfQ09ORklHOwotCi0vLyBzdHJ1Y3R1cmUgdG8gcXVlcnkvc2V0IFNUQV9DT05GSUcKLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfU1RBX0NPTkZJRyB7Ci0gICAgVUxPTkcgICBFbmFibGVUeEJ1cnN0OyAgICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUKLSAgICBVTE9ORyAgIEVuYWJsZVR1cmJvUmF0ZTsgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZSA3Mi8xMDBtYnBzIHR1cmJvIHJhdGUKLSAgICBVTE9ORyAgIFVzZUJHUHJvdGVjdGlvbjsgICAgLy8gMC1BVVRPLCAxLWFsd2F5cyBPTiwgMi1hbHdheXMgT0ZGCi0gICAgVUxPTkcgICBVc2VTaG9ydFNsb3RUaW1lOyAgIC8vIDAtbm8gdXNlLCAxLXVzZSA5LXVzIHNob3J0IHNsb3QgdGltZSB3aGVuIGFwcGxpY2FibGUKLSAgICBVTE9ORyAgIEFkaG9jTW9kZTsJCQkvLyAwLTExYiByYXRlcyBvbmx5IChXSUZJIHNwZWMpLCAxIC0gYi9nIG1peGVkLCAyIC0gZyBvbmx5Ci0gICAgVUxPTkcgICBId1JhZGlvU3RhdHVzOyAgICAgIC8vIDAtT0ZGLCAxLU9OLCBkZWZhdWx0IGlzIDEsIFJlYWQtT25seQotICAgIFVMT05HICAgUnN2MTsgICAgICAgICAgICAgICAvLyBtdXN0IGJlIDAKLSAgICBVTE9ORyAgIFN5c3RlbUVycm9yQml0bWFwOyAgLy8gaWdub3JlIHVwb24gU0VULCByZXR1cm4gc3lzdGVtIGVycm9yIHVwb24gUVVFUlkKLX0gUlRfODAyXzExX1NUQV9DT05GSUcsICpQUlRfODAyXzExX1NUQV9DT05GSUc7Ci0KLS8vCi0vLyAgRm9yIE9JRCBRdWVyeSBvciBTZXQgYWJvdXQgQkEgc3RydWN0dXJlCi0vLwotdHlwZWRlZglzdHJ1Y3QJX09JRF9CQUNBUF9TVFJVQwl7Ci0JCVVDSEFSCQlSeEJBV2luTGltaXQ7Ci0JCVVDSEFSCQlUeEJBV2luTGltaXQ7Ci0JCVVDSEFSCQlQb2xpY3k7CS8vIDA6IERFTEFZX0JBIDE6SU1NRURfQkEgICgvL0JBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZSkgICAyOkJBLW5vdCB1c2UuIG90aGVyIHZhbHVlIGludmFsaWQKLQkJVUNIQVIJCU1wZHVEZW5zaXR5OwkvLyAwOiBERUxBWV9CQSAxOklNTUVEX0JBICAoLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUpICAgMjpCQS1ub3QgdXNlLiBvdGhlciB2YWx1ZSBpbnZhbGlkCi0JCVVDSEFSCQlBbXNkdUVuYWJsZTsJLy9FbmFibGUgQU1TRFUgdHJhbnNtaXNzdGlvbgotCQlVQ0hBUgkJQW1zZHVTaXplOwkvLyAwOjM4MzksIDE6NzkzNSBieXRlcy4gVUlOVCAgTVNEVVNpemVUb0J5dGVzW10JPSB7IDM4MzksIDc5MzV9OwotCQlVQ0hBUgkJTU1QU21vZGU7CS8vIE1JTU8gcG93ZXIgc2F2ZSBtb3JlLCAwOnN0YXRpYywgMTpkeW5hbWljLCAyOnJzdiwgMzptaW1vIGVuYWJsZQotCQlCT09MRUFOCQlBdXRvQkE7CS8vIEF1dG8gQkEgd2lsbCBhdXRvbWF0aWNhbGx5Ci19IE9JRF9CQUNBUF9TVFJVQywgKlBPSURfQkFDQVBfU1RSVUM7Ci0KLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfQUNMX0VOVFJZIHsKLSAgICBVQ0hBUiAgIEFkZHJbTUFDX0FERFJfTEVOR1RIXTsKLSAgICBVU0hPUlQgIFJzdjsKLX0gUlRfODAyXzExX0FDTF9FTlRSWSwgKlBSVF84MDJfMTFfQUNMX0VOVFJZOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JUXzgwMl8xMV9BQ0wgewotICAgIFVMT05HICAgUG9saWN5OyAgICAgICAgICAgICAvLyAwLWRpc2FibGUsIDEtcG9zaXRpdmUgbGlzdCwgMi1uZWdhdGl2ZSBsaXN0Ci0gICAgVUxPTkcgICBOdW07Ci0gICAgUlRfODAyXzExX0FDTF9FTlRSWSBFbnRyeVtNQVhfTlVNQkVSX09GX0FDTF07Ci19IFJUXzgwMl8xMV9BQ0wsICpQUlRfODAyXzExX0FDTDsKLQotdHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9XRFMgewotICAgIFVMT05HCQkJCQkJTnVtOwotICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTCQlFbnRyeVsyNC8qTUFYX05VTV9PRl9XRFNfTElOSyovXTsKLQlVTE9ORwkJCQkJCUtleUxlbmd0aDsKLQlVQ0hBUgkJCQkJCUtleU1hdGVyaWFsWzMyXTsKLX0gUlRfODAyXzExX1dEUywgKlBSVF84MDJfMTFfV0RTOwotCi10eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX1RYX1JBVEVTXyB7Ci0gICAgVUNIQVIgICAgICAgU3VwUmF0ZUxlbjsKLSAgICBVQ0hBUiAgICAgICBTdXBSYXRlW01BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFU107Ci0gICAgVUNIQVIgICAgICAgRXh0UmF0ZUxlbjsKLSAgICBVQ0hBUiAgICAgICBFeHRSYXRlW01BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFU107Ci19IFJUXzgwMl8xMV9UWF9SQVRFUywgKlBSVF84MDJfMTFfVFhfUkFURVM7Ci0KLQotLy8gRGVmaW5pdGlvbiBvZiBleHRyYSBpbmZvcm1hdGlvbiBjb2RlCi0jZGVmaW5lCUdFTkVSQUxfTElOS19VUAkJCTB4MAkJCS8vIExpbmsgaXMgVXAKLSNkZWZpbmUJR0VORVJBTF9MSU5LX0RPV04JCTB4MQkJCS8vIExpbmsgaXMgRG93bgotI2RlZmluZQlIV19SQURJT19PRkYJCQkweDIJCQkvLyBIYXJkd2FyZSByYWRpbyBvZmYKLSNkZWZpbmUJU1dfUkFESU9fT0ZGCQkJMHgzCQkJLy8gU29mdHdhcmUgcmFkaW8gb2ZmCi0jZGVmaW5lCUFVVEhfRkFJTAkJCQkweDQJCQkvLyBPcGVuIGF1dGhlbnRpY2F0aW9uIGZhaWwKLSNkZWZpbmUJQVVUSF9GQUlMX0tFWVMJCQkweDUJCQkvLyBTaGFyZWQgYXV0aGVudGljYXRpb24gZmFpbAotI2RlZmluZQlBU1NPQ19GQUlMCQkJCTB4NgkJCS8vIEFzc29jaWF0aW9uIGZhaWxlZAotI2RlZmluZQlFQVBfTUlDX0ZBSUxVUkUJCQkweDcJCQkvLyBEZWF1dGhlbmNhdGlvbiBiZWNhdXNlIE1JQyBmYWlsdXJlCi0jZGVmaW5lCUVBUF80V0FZX1RJTUVPVVQJCTB4OAkJCS8vIERlYXV0aGVuY2F0aW9uIG9uIDQtd2F5IGhhbmRzaGFrZSB0aW1lb3V0Ci0jZGVmaW5lCUVBUF9HUk9VUF9LRVlfVElNRU9VVAkweDkJCQkvLyBEZWF1dGhlbmNhdGlvbiBvbiBncm91cCBrZXkgaGFuZHNoYWtlIHRpbWVvdXQKLSNkZWZpbmUJRUFQX1NVQ0NFU1MJCQkJMHhhCQkJLy8gRUFQIHN1Y2NlZWQKLSNkZWZpbmUJREVURUNUX1JBREFSX1NJR05BTAkJMHhiICAgICAgICAgLy8gUmFkYXIgc2lnbmFsIG9jY3VyIGluIGN1cnJlbnQgY2hhbm5lbAotI2RlZmluZSBFWFRSQV9JTkZPX01BWAkJCTB4YgkJCS8vIEluZGljYXRlIExhc3QgT0lECi0KLSNkZWZpbmUgRVhUUkFfSU5GT19DTEVBUgkJMHhmZmZmZmZmZgotCi0vLyBUaGlzIGlzIE9JRCBzZXR0aW5nIHN0cnVjdHVyZS4gU28gb25seSBHRiBvciBNTSBhcyBNb2RlLiBUaGlzIGlzIHZhbGlkIHdoZW4gb3VyIHdpcmVsc3MgbW9kZSBoYXMgODAyLjExbiBpbiB1c2UuCi10eXBlZGVmIHN0cnVjdCB7Ci0JUlRfODAyXzExX1BIWV9NT0RFCQlQaHlNb2RlOwkvLwotCVVDSEFSCQlUcmFuc21pdE5vOwotCVVDSEFSCQlIdE1vZGU7CQkvL0hUTU9ERV9HRiBvciBIVE1PREVfTU0KLQlVQ0hBUgkJRXh0T2Zmc2V0OwkvL2V4dGVuc2lvbiBjaGFubmVsIGFib3ZlIG9yIGJlbG93Ci0JVUNIQVIJCU1DUzsKLQlVQ0hBUgkJQlc7Ci0JVUNIQVIJCVNUQkM7Ci0JVUNIQVIJCVNIT1JUR0k7Ci0JVUNIQVIJCXJzdjsKLX0gT0lEX1NFVF9IVF9QSFlNT0RFLCAqUE9JRF9TRVRfSFRfUEhZTU9ERTsKLQotI2lmZGVmIE5JTlRFTkRPX0FQCi0jZGVmaW5lIE5JTlRFTkRPX01BWF9FTlRSWSAxNgotI2RlZmluZSBOSU5URU5ET19TU0lEX05BTUVfTE4gOAotI2RlZmluZSBOSU5URU5ET19TU0lEX05BTUUgIk5XQ1VTQkFQIgotI2RlZmluZSBOSU5URU5ET19QUk9CRV9SRVFfRkxBR19NQVNLIDB4MDMKLSNkZWZpbmUgTklOVEVORE9fUFJPQkVfUkVRX09OIDB4MDEKLSNkZWZpbmUgTklOVEVORE9fUFJPQkVfUkVRX1NJR05BTCAweDAyCi0jZGVmaW5lIE5JTlRFTkRPX1BST0JFX1JTUF9PTiAweDAxCi0jZGVmaW5lIE5JTlRFTkRPX1NTSURfTklDS05BTUVfTE4gMjAKLQotI2RlZmluZSBOSU5URU5ET19XRVBLRVlfTE4gMTMKLQotdHlwZWRlZiBzdHJ1Y3QgX05JTlRFTkRPX1NTSUQKLXsKLQlVQ0hBUglOSU5URU5ET0ZpeENoYXJbTklOVEVORE9fU1NJRF9OQU1FX0xOXTsKLQlVQ0hBUgl6ZXJvMTsKLQlVQ0hBUglyZWdpc3RlOwotCVVDSEFSCUlEOwotCVVDSEFSCXplcm8yOwotCVVDSEFSCU5JQ0tuYW1lW05JTlRFTkRPX1NTSURfTklDS05BTUVfTE5dOwotfSBSVF9OSU5URU5ET19TU0lELCAqUFJUX05JTlRFTkRPX1NTSUQ7Ci0KLXR5cGVkZWYgc3RydWN0IF9OSU5URU5ET19FTlRSWQotewotCVVDSEFSCU5JQ0tuYW1lW05JTlRFTkRPX1NTSURfTklDS05BTUVfTE5dOwotICAgIFVDSEFSICAgRFNfQWRkcltFVEhfTEVOR1RIX09GX0FERFJFU1NdOwotCVVDSEFSCXJlZ2lzdGU7Ci0JVUNIQVIJVXNlclNwYWNlQWNrOwotfSBSVF9OSU5URU5ET19FTlRSWSwgKlBSVF9OSU5URU5ET19FTlRSWTsKLQotLy9SVFBSSVZfSU9DVExfTklOVEVORE9fR0VUX1RBQkxFCi0vL1JUUFJJVl9JT0NUTF9OSU5URU5ET19TRVRfVEFCTEUKLXR5cGVkZWYgc3RydWN0IF9OSU5URU5ET19UQUJMRQotewotCVVJTlQJCQkJbnVtYmVyOwotCVJUX05JTlRFTkRPX0VOVFJZCWVudHJ5W05JTlRFTkRPX01BWF9FTlRSWV07Ci19IFJUX05JTlRFTkRPX1RBQkxFLCAqUFJUX05JTlRFTkRPX1RBQkxFOwotCi0vL1JUUFJJVl9JT0NUTF9OSU5URU5ET19TRUVEX1dFUEtFWQotdHlwZWRlZiBzdHJ1Y3QgX05JTlRFTkRPX1NFRURfV0VQS0VZCi17Ci0JVUNIQVIJc2VlZFtOSU5URU5ET19TU0lEX05JQ0tOQU1FX0xOXTsKLQlVQ0hBUgl3ZXBrZXlbMTZdOy8vdXNlIDEzIGZvciAxMDQgYml0cyB3ZXAga2V5Ci19IFJUX05JTlRFTkRPX1NFRURfV0VQS0VZLCAqUFJUX05JTlRFTkRPX1NFRURfV0VQS0VZOwotI2VuZGlmIC8vIE5JTlRFTkRPX0FQIC8vCi0KLSNpZmRlZiBMTFREX1NVUFBPUlQKLXR5cGVkZWYgc3RydWN0IF9SVF9MTFREX0FTU09JQ0FUSU9OX0VOVFJZIHsKLSAgICBVQ0hBUiAgICAgICAgICAgQWRkcltFVEhfTEVOR1RIX09GX0FERFJFU1NdOwotICAgIHVuc2lnbmVkIHNob3J0ICBNT1I7ICAgICAgICAvLyBtYXhpbXVtIG9wZXJhdGlvbmFsIHJhdGUKLSAgICBVQ0hBUiAgICAgICAgICAgcGh5TW9kZTsKLX0gUlRfTExURF9BU1NPSUNBVElPTl9FTlRSWSwgKlBSVF9MTFREX0FTU09JQ0FUSU9OX0VOVFJZOwotCi10eXBlZGVmIHN0cnVjdCBfUlRfTExURF9BU1NPSUNBVElPTl9UQUJMRSB7Ci0gICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIE51bTsKLSAgICBSVF9MTFREX0FTU09JQ0FUSU9OX0VOVFJZICAgRW50cnlbTUFYX05VTUJFUl9PRl9NQUNdOwotfSBSVF9MTFREX0FTU09JQ0FUSU9OX1RBQkxFLCAqUFJUX0xMVERfQVNTT0lDQVRJT05fVEFCTEU7Ci0jZW5kaWYgLy8gTExURF9TVVBQT1JUIC8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLS8vcnQyODYwLCBrYXRoeSAyMDA3LTAxMTgKLS8vIHN0cnVjdHVyZSBmb3IgRExTCi10eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0RMU19VSSB7Ci0JVVNIT1JUCQkJCQkJVGltZU91dDsJCS8vIHVuaXQ6IHNlY29uZCAsIHNldCBieSBVSQotCVVTSE9SVAkJCQkJCUNvdW50RG93blRpbWVyOwkvLyB1bml0OiBzZWNvbmQgLCB1c2VkIGJ5IGRyaXZlciBvbmx5Ci0JTkRJU184MDJfMTFfTUFDX0FERFJFU1MJCU1hY0FkZHI7CQkvLyBzZXQgYnkgVUkKLQlVQ0hBUgkJCQkJCVN0YXR1czsJCQkvLyAwOiBub25lICwgMTogd2FpdCBTVEFrZXksIDI6IGZpbmlzaCBETFMgc2V0dXAgLCBzZXQgYnkgZHJpdmVyIG9ubHkKLQlCT09MRUFOCQkJCQkJVmFsaWQ7CQkJLy8gMTogdmFsaWQgLCAwOiBpbnZhbGlkICwgc2V0IGJ5IFVJLCB1c2UgdG8gc2V0dXAgb3IgdGVhciBkb3duIERMUyBsaW5rCi19IFJUXzgwMl8xMV9ETFNfVUksICpQUlRfODAyXzExX0RMU19VSTsKLQotdHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9ETFNfSU5GTyB7Ci0JUlRfODAyXzExX0RMU19VSQlFbnRyeVtNQVhfTlVNQkVSX09GX0RMU19FTlRSWV07Ci0JVUNIQVIJCQkJbnVtOwotfSBSVF84MDJfMTFfRExTX0lORk8sICpQUlRfODAyXzExX0RMU19JTkZPOwotCi10eXBlZGVmIGVudW0gX1JUXzgwMl8xMV9ETFNfTU9ERSB7Ci0gICAgRExTX05PTkUsCi0gICAgRExTX1dBSVRfS0VZLAotICAgIERMU19GSU5JU0gKLX0gUlRfODAyXzExX0RMU19NT0RFOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotI2RlZmluZQlSVF9BU1NPQ19FVkVOVF9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMQotI2RlZmluZQlSVF9ESVNBU1NPQ19FVkVOVF9GTEFHICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMgotI2RlZmluZQlSVF9SRVFJRV9FVkVOVF9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMwotI2RlZmluZQlSVF9SRVNQSUVfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwNAotI2RlZmluZQlSVF9BU1NPQ0lORk9fRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgIDB4MDEwNQotI2RlZmluZSBSVF9QTUtJRENBTkRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwNgotI2RlZmluZSBSVF9JTlRFUkZBQ0VfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwNwotI2RlZmluZSBSVF9JTlRFUkZBQ0VfVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwOAotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLQotCi0jZGVmaW5lIE1BWF9DVVNUT01fTEVOIDEyOAotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi10eXBlZGVmIGVudW0gX1JUXzgwMl8xMV9EX0NMSUVOVF9NT0RFCi17Ci0gICBSdDgwMl8xMV9EX05vbmUsCi0gICBSdDgwMl8xMV9EX0ZsZXhpYmxlLAotICAgUnQ4MDJfMTFfRF9TdHJpY3QsCi19IFJUXzgwMl8xMV9EX0NMSUVOVF9NT0RFLCAqUFJUXzgwMl8xMV9EX0NMSUVOVF9NT0RFOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi10eXBlZGVmIHN0cnVjdCBfUlRfQ0hBTk5FTF9MSVNUX0lORk8KLXsKLQlVQ0hBUiBDaGFubmVsTGlzdFtNQVhfTlVNX09GX0NIU107ICAgLy8gbGlzdCBhbGwgc3VwcG9ydGVkIGNoYW5uZWxzIGZvciBzaXRlIHN1cnZleQotCVVDSEFSIENoYW5uZWxMaXN0TnVtOyAvLyBudW1iZXIgb2YgY2hhbm5lbCBpbiBDaGFubmVsTGlzdFtdCi19IFJUX0NIQU5ORUxfTElTVF9JTkZPLCAqUFJUX0NIQU5ORUxfTElTVF9JTkZPOwotCi0vLyBXU0MgY29uZmlndXJlZCBjcmVkZW50aWFsCi10eXBlZGVmCXN0cnVjdAlfV1NDX0NSRURFTlRJQUwKLXsKLQlORElTXzgwMl8xMV9TU0lECVNTSUQ7CQkJCS8vIG1hbmRhdG9yeQotCVVTSE9SVAkJCQlBdXRoVHlwZTsJCQkvLyBtYW5kYXRvcnksIDE6IG9wZW4sIDI6IHdwYS1wc2ssIDQ6IHNoYXJlZCwgODp3cGEsIDB4MTA6IHdwYTIsIDB4MjA6IHdwYTItcHNrCi0JVVNIT1JUCQkJCUVuY3JUeXBlOwkJCS8vIG1hbmRhdG9yeSwgMTogbm9uZSwgMjogd2VwLCA0OiB0a2lwLCA4OiBhZXMKLQlVQ0hBUgkJCQlLZXlbNjRdOwkJCS8vIG1hbmRhdG9yeSwgTWF4aW11bSA2NCBieXRlCi0JVVNIT1JUCQkJCUtleUxlbmd0aDsKLQlVQ0hBUgkJCQlNYWNBZGRyWzZdOwkJCS8vIG1hbmRhdG9yeSwgQVAgTUFDIGFkZHJlc3MKLQlVQ0hBUgkJCQlLZXlJbmRleDsJCQkvLyBvcHRpb25hbCwgZGVmYXVsdCBpcyAxCi0JVUNIQVIJCQkJUnN2ZFszXTsJCQkvLyBNYWtlIGFsaWdubWVudAotfQlXU0NfQ1JFREVOVElBTCwgKlBXU0NfQ1JFREVOVElBTDsKLQotLy8gV1NDIGNvbmZpZ3VyZWQgcHJvZmlsZXMKLXR5cGVkZWYJc3RydWN0CV9XU0NfUFJPRklMRQotewotCVVJTlQJCQlQcm9maWxlQ250OwotCVVJTlQJCQlBcHBseVByb2ZpbGVJZHg7ICAvLyBhZGQgYnkgam9obmxpLCBmaXggV1BTIHRlc3QgcGxhbiA1LjEuMQotCVdTQ19DUkVERU5USUFMCVByb2ZpbGVbOF07CQkJCS8vIFN1cHBvcnQgdXAgdG8gOCBwcm9maWxlcwotfQlXU0NfUFJPRklMRSwgKlBXU0NfUFJPRklMRTsKLQotCi0KLSNlbmRpZiAvLyBfT0lEX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3BjaV9tYWluX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9wY2lfbWFpbl9kZXYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQxMDE1Ni4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3BjaV9tYWluX2Rldi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE5NSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXBjaV9tYWluX2Rldi5jCi0KLQlBYnN0cmFjdDoKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCi0qLwotCi0KLSNpbmNsdWRlICJydF9jb25maWcuaCIKLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLQotLy8gRm9sbG93aW5nIGluZm9ybWF0aW9uIHdpbGwgYmUgc2hvdyB3aGVuIHlvdSBydW4gJ21vZGluZm8nCi0vLyAqKiogSWYgeW91IGhhdmUgYSBzb2x1dGlvbiBmb3IgdGhlIGJ1ZyBpbiBjdXJyZW50IHZlcnNpb24gb2YgZHJpdmVyLCBwbGVhc2UgbWFpbCB0byBtZS4KLS8vIE90aGVyd2lzZSBwb3N0IHRvIGZvcnVtIGluIHJhbGlua3RlY2gncyB3ZWIgc2l0ZSh3d3cucmFsaW5rdGVjaC5jb20pIGFuZCBsZXQgYWxsIHVzZXJzIGhlbHAgeW91LiAqKioKLU1PRFVMRV9BVVRIT1IoIkpldHQgQ2hlbiA8amV0dF9jaGVuQHJhbGlua3RlY2guY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJSVDMwOTAgV2lyZWxlc3MgTGFuIExpbnV4IERyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0vLwotLy8gRnVuY3Rpb24gZGVjbGFyYXRpb25zCi0vLwotZXh0ZXJuIGludCBydDI4eHhfY2xvc2UoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOwotZXh0ZXJuIGludCBydDI4eHhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7Ci0KLXN0YXRpYyBWT0lEIF9fZGV2ZXhpdCBydDI4NjBfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldik7Ci1zdGF0aWMgSU5UIF9fZGV2aW5pdCBydDI4NjBfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICAqZW50KTsKLXN0YXRpYyB2b2lkIF9fZXhpdCBydDI4NjBfY2xlYW51cF9tb2R1bGUodm9pZCk7Ci1zdGF0aWMgaW50IF9faW5pdCBydDI4NjBfaW5pdF9tb2R1bGUodm9pZCk7Ci0KLQotIHN0YXRpYyBWT0lEIFJUTVBJbml0UENJZURldmljZSgKLSAgICBJTiAgc3RydWN0IHBjaV9kZXYgICAqcGNpX2RldiwKLSAgICBJTiBQUlRNUF9BREFQVEVSICAgICBwQWQpOwotCi0KLSNpZmRlZiBDT05GSUdfUE0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDEwKQotI2RlZmluZSBwbV9tZXNzYWdlX3QgdTMyCi0jZW5kaWYKLQotc3RhdGljIGludCBydDI4NjBfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKLXN0YXRpYyBpbnQgcnQyODYwX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldik7Ci0jZW5kaWYKLSNlbmRpZiAvLyBDT05GSUdfUE0gLy8KLQotLy8KLS8vIFJhbGluayBQQ0kgZGV2aWNlIHRhYmxlLCBpbmNsdWRlIGFsbCBzdXBwb3J0ZWQgY2hpcHNldHMKLS8vCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcnQyODYwX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0KLXsKLSNpZmRlZiBSVDMwOTAKLQl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMzA5MF9QQ0llX0RFVklDRV9JRCl9LAotCXtQQ0lfREVWSUNFKE5JQ19QQ0lfVkVORE9SX0lELCBOSUMzMDkxX1BDSWVfREVWSUNFX0lEKX0sCi0Je1BDSV9ERVZJQ0UoTklDX1BDSV9WRU5ET1JfSUQsIE5JQzMwOTJfUENJZV9ERVZJQ0VfSUQpfSwKLQl7UENJX0RFVklDRSgweDE0NjIsIDB4ODkxQSl9LAotI2VuZGlmIC8vIFJUMzA5MCAvLwotI2lmZGVmIFJUMzM5MAotCXtQQ0lfREVWSUNFKE5JQ19QQ0lfVkVORE9SX0lELCBOSUMzMzkwX1BDSWVfREVWSUNFX0lEKX0sCi0Je1BDSV9ERVZJQ0UoTklDX1BDSV9WRU5ET1JfSUQsIE5JQzMzOTFfUENJZV9ERVZJQ0VfSUQpfSwKLQl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMzM5Ml9QQ0llX0RFVklDRV9JRCl9LAotI2VuZGlmIC8vIFJUMzM5MCAvLwotICAgIHswLH0JCS8vIHRlcm1pbmF0ZSBsaXN0Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcnQyODYwX3BjaV90YmwpOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIE1PRFVMRV9WRVJTSU9OCi1NT0RVTEVfVkVSU0lPTihTVEFfRFJJVkVSX1ZFUlNJT04pOwotI2VuZGlmCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotLy8KLS8vIE91ciBQQ0kgZHJpdmVyIHN0cnVjdHVyZQotLy8KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBydDI4NjBfZHJpdmVyID0KLXsKLSAgICBuYW1lOiAgICAgICAicnQzMDkwIiwKLSAgICBpZF90YWJsZTogICBydDI4NjBfcGNpX3RibCwKLSAgICBwcm9iZTogICAgICBydDI4NjBfcHJvYmUsCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IDB4MjA0MTIKLSAgICByZW1vdmU6ICAgICBfX2RldmV4aXRfcChydDI4NjBfcmVtb3ZlX29uZSksCi0jZWxzZQotICAgIHJlbW92ZTogICAgIF9fZGV2ZXhpdChydDI4NjBfcmVtb3ZlX29uZSksCi0jZW5kaWYKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKLSNpZmRlZiBDT05GSUdfUE0KLQlzdXNwZW5kOglydDI4NjBfc3VzcGVuZCwKLQlyZXN1bWU6CQlydDI4NjBfcmVzdW1lLAotI2VuZGlmCi0jZW5kaWYKLX07Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqCVBDSSBkZXZpY2UgaW5pdGlhbGl6YXRpb24gcmVsYXRlZCBwcm9jZWR1cmVzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotI2lmZGVmIENPTkZJR19QTQotCi1WT0lEIFJUMjg2MFJlamVjdFBlbmRpbmdQYWNrZXRzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCS8vIGNsZWFyIFBTIHBhY2tldHMKLQkvLyBjbGVhciBUeFN3IHBhY2tldHMKLX0KLQotc3RhdGljIGludCBydDI4NjBfc3VzcGVuZCgKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKLQlwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUilOVUxMOwotCUlOVDMyIHJldHZhbCA9IDA7Ci0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODYwX3N1c3BlbmQoKVxuIikpOwotCi0JaWYgKG5ldF9kZXYgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIm5ldF9kZXYgPT0gTlVMTCFcbiIpKTsKLQl9Ci0JZWxzZQotCXsKLQkJcEFkID0gKFBSVE1QX0FEQVBURVIpUlRNUF9PU19ORVRERVZfR0VUX1BSSVYobmV0X2Rldik7Ci0KLQkJLyogd2UgY2FuIG5vdCB1c2UgSUZGX1VQIGJlY2F1c2UgcmEwIGRvd24gYnV0IHJhMSB1cCAqLwotCQkvKiBhbmQgMSBzdXNwZW5kL3Jlc3VtZSBmdW5jdGlvbiBmb3IgMSBtb2R1bGUsIG5vdCBmb3IgZWFjaCBpbnRlcmZhY2UgKi8KLQkJLyogc28gTGludXggd2lsbCBjYWxsIHN1c3BlbmQvcmVzdW1lIGZ1bmN0aW9uIG9uY2UgKi8KLQkJaWYgKFZJUlRVQUxfSUZfTlVNKHBBZCkgPiAwKQotCQl7Ci0JCQkvLyBhdm9pZCB1c2VycyBkbyBzdXNwZW5kIGFmdGVyIGludGVyZmFjZSBpcyBkb3duCi0KLQkJCS8vIHN0b3AgaW50ZXJmYWNlCi0JCQluZXRpZl9jYXJyaWVyX29mZihuZXRfZGV2KTsKLQkJCW5ldGlmX3N0b3BfcXVldWUobmV0X2Rldik7Ci0KLQkJCS8vIG1hcmsgZGV2aWNlIGFzIHJlbW92ZWQgZnJvbSBzeXN0ZW0gYW5kIHRoZXJlZm9yZSBubyBsb25nZXIgYXZhaWxhYmxlCi0JCQluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldF9kZXYpOwotCi0JCQkvLyBtYXJrIGhhbHQgZmxhZwotCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7Ci0JCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOwotCi0JCQkvLyB0YWtlIGRvd24gdGhlIGRldmljZQotCQkJcnQyOHh4X2Nsb3NlKChQTkVUX0RFViluZXRfZGV2KTsKLQotCQkJUlRfTU9EX0RFQ19VU0VfQ09VTlQoKTsKLQkJfQotCX0KLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTApCi0JLy8gcmVmZXJlbmNlIHRvIGh0dHA6Ly92b3ZvMjAwMC5jb20vdHlwZS1sYWIvbGludXgva2VybmVsLWFwaS9saW51eC1rZXJuZWwtYXBpLmh0bWwKLQkvLyBlbmFibGUgZGV2aWNlIHRvIGdlbmVyYXRlIFBNRSMgd2hlbiBzdXNwZW5kZWQKLQkvLyBwY2lfY2hvb3NlX3N0YXRlKCk6IENob29zZSB0aGUgcG93ZXIgc3RhdGUgb2YgYSBQQ0kgZGV2aWNlIHRvIGJlIHN1c3BlbmRlZAotCXJldHZhbCA9IHBjaV9lbmFibGVfd2FrZShwY2lfZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBjaV9kZXYsIHN0YXRlKSwgMSk7Ci0JLy8gc2F2ZSB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2Ugb2YgYSBkZXZpY2UgYmVmb3JlIHN1c3BlbmRpbmcKLQlwY2lfc2F2ZV9zdGF0ZShwY2lfZGV2KTsKLQkvLyBkaXNhYmxlIFBDSSBkZXZpY2UgYWZ0ZXIgdXNlCi0JcGNpX2Rpc2FibGVfZGV2aWNlKHBjaV9kZXYpOwotCi0JcmV0dmFsID0gcGNpX3NldF9wb3dlcl9zdGF0ZShwY2lfZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBjaV9kZXYsIHN0YXRlKSk7Ci0jZW5kaWYKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODYwX3N1c3BlbmQoKVxuIikpOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBpbnQgcnQyODYwX3Jlc3VtZSgKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKU5VTEw7Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDEwKQotCUlOVDMyIHJldHZhbDsKLQotCi0JLy8gc2V0IHRoZSBwb3dlciBzdGF0ZSBvZiBhIFBDSSBkZXZpY2UKLQkvLyBQQ0kgaGFzIDQgcG93ZXIgc3RhdGVzLCBETyAobm9ybWFsKSB+IEQzKGxlc3MgcG93ZXIpCi0JLy8gaW4gaW5jbHVkZS9saW51eC9wY2kuaCwgeW91IGNhbiBmaW5kIHRoYXQKLQkvLyAjZGVmaW5lIFBDSV9EMCAgICAgICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDApCi0JLy8gI2RlZmluZSBQQ0lfRDEgICAgICAgICAgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAxKQotCS8vICNkZWZpbmUgUENJX0QyICAgICAgICAgICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgMikKLQkvLyAjZGVmaW5lIFBDSV9EM2hvdCAgICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDMpCi0JLy8gI2RlZmluZSBQQ0lfRDNjb2xkICAgICAgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSA0KQotCS8vICNkZWZpbmUgUENJX1VOS05PV04gICAgICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgNSkKLQkvLyAjZGVmaW5lIFBDSV9QT1dFUl9FUlJPUiAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIC0xKQotCXJldHZhbCA9IHBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgUENJX0QwKTsKLQotCS8vIHJlc3RvcmUgdGhlIHNhdmVkIHN0YXRlIG9mIGEgUENJIGRldmljZQotCXBjaV9yZXN0b3JlX3N0YXRlKHBjaV9kZXYpOwotCi0JLy8gaW5pdGlhbGl6ZSBkZXZpY2UgYmVmb3JlIGl0J3MgdXNlZCBieSBhIGRyaXZlcgotCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KSkKLQl7Ci0JCXByaW50aygicGNpIGVuYWJsZSBmYWlsIVxuIik7Ci0JCXJldHVybiAwOwotCX0KLSNlbmRpZgotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4NjBfcmVzdW1lKClcbiIpKTsKLQotCWlmIChuZXRfZGV2ID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJuZXRfZGV2ID09IE5VTEwhXG4iKSk7Ci0JfQotCWVsc2UKLQkJcEFkID0gKFBSVE1QX0FEQVBURVIpUlRNUF9PU19ORVRERVZfR0VUX1BSSVYobmV0X2Rldik7Ci0KLQlpZiAocEFkICE9IE5VTEwpCi0JewotCQkvKiB3ZSBjYW4gbm90IHVzZSBJRkZfVVAgYmVjYXVzZSByYTAgZG93biBidXQgcmExIHVwICovCi0JCS8qIGFuZCAxIHN1c3BlbmQvcmVzdW1lIGZ1bmN0aW9uIGZvciAxIG1vZHVsZSwgbm90IGZvciBlYWNoIGludGVyZmFjZSAqLwotCQkvKiBzbyBMaW51eCB3aWxsIGNhbGwgc3VzcGVuZC9yZXN1bWUgZnVuY3Rpb24gb25jZSAqLwotCQlpZiAoVklSVFVBTF9JRl9OVU0ocEFkKSA+IDApCi0JCXsKLQkJCS8vIG1hcmsgZGV2aWNlIGFzIGF0dGFjaGVkIGZyb20gc3lzdGVtIGFuZCByZXN0YXJ0IGlmIG5lZWRlZAotCQkJbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRfZGV2KTsKLQotCQkJaWYgKHJ0Mjh4eF9vcGVuKChQTkVUX0RFViluZXRfZGV2KSAhPSAwKQotCQkJewotCQkJCS8vIG9wZW4gZmFpbAotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODYwX3Jlc3VtZSgpXG4iKSk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0KLQkJCS8vIGluY3JlYXNlIE1PRFVMRSB1c2UgY291bnQKLQkJCVJUX01PRF9JTkNfVVNFX0NPVU5UKCk7Ci0KLQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7Ci0JCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7Ci0KLQkJCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldF9kZXYpOwotCQkJbmV0aWZfY2Fycmllcl9vbihuZXRfZGV2KTsKLQkJCW5ldGlmX3dha2VfcXVldWUobmV0X2Rldik7Ci0JCX0KLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IHJ0Mjg2MF9yZXN1bWUoKVxuIikpOwotCXJldHVybiAwOwotfQotI2VuZGlmIC8vIENPTkZJR19QTSAvLwotI2VuZGlmCi0KLQotc3RhdGljIElOVCBfX2luaXQgcnQyODYwX2luaXRfbW9kdWxlKFZPSUQpCi17Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZydDI4NjBfZHJpdmVyKTsKLSNlbHNlCi0gICAgcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmcnQyODYwX2RyaXZlcik7Ci0jZW5kaWYKLX0KLQotCi0vLwotLy8gRHJpdmVyIG1vZHVsZSB1bmxvYWQgZnVuY3Rpb24KLS8vCi1zdGF0aWMgVk9JRCBfX2V4aXQgcnQyODYwX2NsZWFudXBfbW9kdWxlKFZPSUQpCi17Ci0gICAgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZydDI4NjBfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQocnQyODYwX2luaXRfbW9kdWxlKTsKLW1vZHVsZV9leGl0KHJ0Mjg2MF9jbGVhbnVwX21vZHVsZSk7Ci0KLQotLy8KLS8vIFBDSSBkZXZpY2UgcHJvYmUgJiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgotLy8KLXN0YXRpYyBJTlQgX19kZXZpbml0ICAgcnQyODYwX3Byb2JlKAotICAgIElOICBzdHJ1Y3QgcGNpX2RldiAgICAgICAgICAgICAgKnBjaV9kZXYsCi0gICAgSU4gIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICAqcGNpX2lkKQotewotCVBSVE1QX0FEQVBURVIJCXBBZCA9IChQUlRNUF9BREFQVEVSKU5VTEw7Ci0Jc3RydWN0ICBuZXRfZGV2aWNlCQkqbmV0X2RldjsKLQlQVk9JRAkJCQloYW5kbGU7Ci0JUFNUUklORwkJCQlwcmludF9uYW1lOwotCVVMT05HCQkJCWNzcl9hZGRyOwotCUlOVCBydiA9IDA7Ci0JUlRNUF9PU19ORVRERVZfT1BfSE9PSwluZXREZXZIb29rOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4NjBfcHJvYmVcbiIpKTsKLQotLy9QQ0lEZXZJbml0PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCS8vIHdha2UgdXAgYW5kIGVuYWJsZSBkZXZpY2UKLQlpZiAoKHJ2ID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpX2RldikpIT0gMCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVuYWJsZSBQQ0kgZGV2aWNlIGZhaWxlZCwgZXJybm89JWQhXG4iLCBydikpOwotCQlyZXR1cm4gcnY7Ci0JfQotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCXByaW50X25hbWUgPSBwY2lfZGV2ID8gcGNpX25hbWUocGNpX2RldikgOiAicnQzMDkwIjsKLSNlbHNlCi0JcHJpbnRfbmFtZSA9IHBjaV9kZXYgPyBwY2lfZGV2LT5zbG90X25hbWUgOiAicnQzMDkwIjsKLSNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KLQotCWlmICgocnYgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBjaV9kZXYsIHByaW50X25hbWUpKSAhPSAwKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUmVxdWVzdCBQQ0kgcmVzb3VyY2UgZmFpbGVkLCBlcnJubz0lZCFcbiIsIHJ2KSk7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KLQkvLyBtYXAgcGh5c2ljYWwgYWRkcmVzcyB0byB2aXJ0dWFsIGFkZHJlc3MgZm9yIGFjY2Vzc2luZyByZWdpc3RlcgotCWNzcl9hZGRyID0gKHVuc2lnbmVkIGxvbmcpIGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApLCBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDApKTsKLQlpZiAoIWNzcl9hZGRyKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiaW9yZW1hcCBmYWlsZWQgZm9yIGRldmljZSAlcywgcmVnaW9uIDB4JWxYIEAgMHglbFhcbiIsCi0JCQkJCXByaW50X25hbWUsIChVTE9ORylwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDApLCAoVUxPTkcpcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApKSk7Ci0JCWdvdG8gZXJyX291dF9mcmVlX3JlczsKLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6IGF0IDB4JWx4LCBWQSAweCVseCwgSVJRICVkLiBcbiIsICBwcmludF9uYW1lLAotCQkJCQkoVUxPTkcpcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApLCAoVUxPTkcpY3NyX2FkZHIsIHBjaV9kZXYtPmlycSkpOwotCX0KLQotCS8vIFNldCBETUEgbWFzdGVyCi0JcGNpX3NldF9tYXN0ZXIocGNpX2Rldik7Ci0KLQotLy9SdG1wRGV2SW5pdD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkvLyBBbGxvY2F0ZSBSVE1QX0FEQVBURVIgYWRhcHRlciBzdHJ1Y3R1cmUKLQloYW5kbGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgb3NfY29va2llKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGhhbmRsZSA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMoKTogQWxsb2NhdGUgbWVtb3J5IGZvciBvcyBoYW5kbGUgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCWdvdG8gZXJyX291dF9pb3VubWFwOwotCX0KLQotCSgoUE9TX0NPT0tJRSloYW5kbGUpLT5wY2lfZGV2ID0gcGNpX2RldjsKLQotCXJ2ID0gUlRNUEFsbG9jQWRhcHRlckJsb2NrKGhhbmRsZSwgJnBBZCk7CS8vc2hpYW5nOiB3ZSBtYXkgbmVlZCB0aGUgcGNpX2RldiBmb3IgYWxsb2NhdGUgc3RydWN0dXJlIG9mICJSVE1QX0FEQVBURVIiCi0JaWYgKHJ2ICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCWdvdG8gZXJyX291dF9pb3VubWFwOwotCS8vIEhlcmUgYXJlIHRoZSBSVE1QX0FEQVBURVIgc3RydWN0dXJlIHdpdGggcGNpLWJ1cyBzcGVjaWZpYyBwYXJhbWV0ZXJzLgotCXBBZC0+Q1NSQmFzZUFkZHJlc3MgPSAoUFVDSEFSKWNzcl9hZGRyOwotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInBBZC0+Q1NSQmFzZUFkZHJlc3MgPTB4JWx4LCBjc3JfYWRkcj0weCVseCFcbiIsIChVTE9ORylwQWQtPkNTUkJhc2VBZGRyZXNzLCBjc3JfYWRkcikpOwotCVJ0bXBSYURldkN0cmxJbml0KHBBZCwgUlRNUF9ERVZfSU5GX1BDSSk7Ci0KLQotLy9OZXREZXZJbml0PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCW5ldF9kZXYgPSBSdG1wUGh5TmV0RGV2SW5pdChwQWQsICZuZXREZXZIb29rKTsKLQlpZiAobmV0X2RldiA9PSBOVUxMKQotCQlnb3RvIGVycl9vdXRfZnJlZV9yYWRldjsKLQotCS8vIEhlcmUgYXJlIHRoZSBuZXRfZGV2aWNlIHN0cnVjdHVyZSB3aXRoIHBjaS1idXMgc3BlY2lmaWMgcGFyYW1ldGVycy4KLQluZXRfZGV2LT5pcnEgPSBwY2lfZGV2LT5pcnE7CQkvLyBJbnRlcnJ1cHQgSVJRIG51bWJlcgotCW5ldF9kZXYtPmJhc2VfYWRkciA9IGNzcl9hZGRyOwkJLy8gU2F2ZSBDU1IgdmlydHVhbCBhZGRyZXNzIGFuZCBpcnEgdG8gZGV2aWNlIHN0cnVjdHVyZQotCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBuZXRfZGV2KTsJLy8gU2V0IGRyaXZlciBkYXRhCi0KLSNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotLyogZm9yIHN1cHBvcnRpbmcgTmV0d29yayBNYW5hZ2VyICovCi0JLyogU2V0IHRoZSBzeXNmcyBwaHlzaWNhbCBkZXZpY2UgcmVmZXJlbmNlIGZvciB0aGUgbmV0d29yayBsb2dpY2FsIGRldmljZQotCSAgKiBpZiBzZXQgcHJpb3IgdG8gcmVnaXN0cmF0aW9uIHdpbGwgY2F1c2UgYSBzeW1saW5rIGR1cmluZyBpbml0aWFsaXphdGlvbi4KLQkgKi8KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKSkKLQlTRVRfTkVUREVWX0RFVihuZXRfZGV2LCAmKHBjaV9kZXYtPmRldikpOwotI2VuZGlmCi0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQotCi0vL0FsbCBkb25lLCBpdCdzIHRpbWUgdG8gcmVnaXN0ZXIgdGhlIG5ldCBkZXZpY2UgdG8gbGludXgga2VybmVsLgotCS8vIFJlZ2lzdGVyIHRoaXMgZGV2aWNlCi0JcnYgPSBSdG1wT1NOZXREZXZBdHRhY2gobmV0X2RldiwgJm5ldERldkhvb2spOwotCWlmIChydikKLQkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JcEFkLT5TdGFDZmcuT3JpRGV2VHlwZSA9IG5ldF9kZXYtPnR5cGU7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi1SVE1QSW5pdFBDSWVEZXZpY2UocGNpX2RldiwgcEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODYwX3Byb2JlXG4iKSk7Ci0KLQlyZXR1cm4gMDsgLy8gcHJvYmUgb2sKLQotCi0JLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVSUk9SIEhBTkRMRSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWVycl9vdXRfZnJlZV9uZXRkZXY6Ci0JUnRtcE9TTmV0RGV2RnJlZShuZXRfZGV2KTsKLQotZXJyX291dF9mcmVlX3JhZGV2OgotCS8qIGZyZWUgUlRNUF9BREFQVEVSIHN0cmN1dHVyZSBhbmQgb3NfY29va2llKi8KLQlSVE1QRnJlZUFkYXB0ZXIocEFkKTsKLQotZXJyX291dF9pb3VubWFwOgotCWlvdW5tYXAoKHZvaWQgKikoY3NyX2FkZHIpKTsKLQlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApLCBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDApKTsKLQotZXJyX291dF9mcmVlX3JlczoKLQlwY2lfcmVsZWFzZV9yZWdpb25zKHBjaV9kZXYpOwotCi1lcnJfb3V0OgotCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2KTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIjw9PT0gcnQyODYwX3Byb2JlIGZhaWxlZCB3aXRoIHJ2ID0gJWQhXG4iLCBydikpOwotCi0JcmV0dXJuIC1FTk9ERVY7IC8qIHByb2JlIGZhaWwgKi8KLX0KLQotCi1zdGF0aWMgVk9JRCBfX2RldmV4aXQgcnQyODYwX3JlbW92ZV9vbmUoCi0gICAgSU4gIHN0cnVjdCBwY2lfZGV2ICAqcGNpX2RldikKLXsKLQlQTkVUX0RFVgluZXRfZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOwotCVJUTVBfQURBUFRFUgkqcEFkID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYobmV0X2Rldik7Ci0JVUxPTkcJCQljc3JfYWRkciA9IG5ldF9kZXYtPmJhc2VfYWRkcjsgLy8gcEFkLT5DU1JCYXNlQWRkcmVzczsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODYwX3JlbW92ZV9vbmVcbiIpKTsKLQotCWlmIChwQWQgIT0gTlVMTCkKLQl7Ci0JCS8vIFVucmVnaXN0ZXIvRnJlZSBhbGwgYWxsb2NhdGVkIG5ldF9kZXZpY2UuCi0JCVJ0bXBQaHlOZXREZXZFeGl0KHBBZCwgbmV0X2Rldik7Ci0KLQkJLy8gVW5tYXAgQ1NSIGJhc2UgYWRkcmVzcwotCQlpb3VubWFwKChjaGFyICopKGNzcl9hZGRyKSk7Ci0KLQkJLy8gcmVsZWFzZSBtZW1vcnkgcmVnaW9uCi0JCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCksIHBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwgMCkpOwotCi0JCS8vIEZyZWUgUlRNUF9BREFQVEVSIHJlbGF0ZWQgc3RydWN0dXJlcy4KLQkJUnRtcFJhRGV2Q3RybEV4aXQocEFkKTsKLQotCX0KLQllbHNlCi0JewotCQkvLyBVbnJlZ2lzdGVyIG5ldHdvcmsgZGV2aWNlCi0JCVJ0bXBPU05ldERldkRldGFjaChuZXRfZGV2KTsKLQotCQkvLyBVbm1hcCBDU1IgYmFzZSBhZGRyZXNzCi0JCWlvdW5tYXAoKGNoYXIgKikobmV0X2Rldi0+YmFzZV9hZGRyKSk7Ci0KLQkJLy8gcmVsZWFzZSBtZW1vcnkgcmVnaW9uCi0JCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCksIHBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwgMCkpOwotCX0KLQotCS8vIEZyZWUgdGhlIHJvb3QgbmV0X2RldmljZQotCVJ0bXBPU05ldERldkZyZWUobmV0X2Rldik7Ci0KLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIENoZWNrIHRoZSBjaGlwc2V0IHZlbmRvci9wcm9kdWN0IElELgotCi1Bcmd1bWVudHM6Ci0gICAgX2Rldl9wCQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQotCi1SZXR1cm4gVmFsdWU6Ci0gICAgVFJVRQkJCQlDaGVjayBvawotCUZBTFNFCQkJCUNoZWNrIGZhaWwKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4gUlQyOFhYQ2hpcHNldENoZWNrKAotCUlOIHZvaWQgKl9kZXZfcCkKLXsKLQkvKiBhbHdheXMgVFJVRSAqLwotCXJldHVybiBUUlVFOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqCVBDSWUgZGV2aWNlIGluaXRpYWxpemF0aW9uIHJlbGF0ZWQgcHJvY2VkdXJlcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIHN0YXRpYyBWT0lEIFJUTVBJbml0UENJZURldmljZSgKLSAgICBJTiAgc3RydWN0IHBjaV9kZXYgICAqcGNpX2RldiwKLSAgICBJTiBQUlRNUF9BREFQVEVSICAgICBwQWQpCi17Ci0JVVNIT1JUICBkZXZpY2VfaWQ7Ci0JUE9TX0NPT0tJRSBwT2JqOwotCi0JcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQlwY2lfcmVhZF9jb25maWdfd29yZChwY2lfZGV2LCBQQ0lfREVWSUNFX0lELCAmZGV2aWNlX2lkKTsKLQlkZXZpY2VfaWQgPSBsZTJjcHUxNihkZXZpY2VfaWQpOwotCXBPYmotPkRldmljZUlEID0gZGV2aWNlX2lkOwotCWlmICgKLSNpZmRlZiBSVDMwOTAKLQkJKGRldmljZV9pZCA9PSBOSUMzMDkwX1BDSWVfREVWSUNFX0lEKSB8fAotCQkoZGV2aWNlX2lkID09IE5JQzMwOTFfUENJZV9ERVZJQ0VfSUQpIHx8Ci0JCShkZXZpY2VfaWQgPT0gTklDMzA5Ml9QQ0llX0RFVklDRV9JRCkgfHwKLSNlbmRpZiAvLyBSVDMwOTAgLy8KLQkJIDApCi0JewotCQlVSU5UMzIgTWFjQ3NyMCA9IDAsIEluZGV4PSAwOwotCQlkbwotCQl7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19DU1IwLCAmTWFjQ3NyMCk7Ci0KLQkJCWlmICgoTWFjQ3NyMCAhPSAweDAwKSAmJiAoTWFjQ3NyMCAhPSAweEZGRkZGRkZGKSkKLQkJCQlicmVhazsKLQotCQkJUlRNUHVzZWNEZWxheSgxMCk7Ci0JCX0gd2hpbGUgKEluZGV4KysgPCAxMDApOwotCi0JCS8vIFN1cHBvcnQgYWR2YW5jZWQgcG93ZXIgc2F2ZSBhZnRlciAyODkyLzI3OTAuCi0JCS8vIE1BQyB2ZXJzaW9uIGF0IG9mZnNldCAweDEwMDAgaXMgMHgyODcyWFhYWC8weDI4NzBYWFhYKFBDSWUsIFVTQiwgU0RJTykuCi0JCWlmICgoTWFjQ3NyMCYweGZmZmYwMDAwKSAhPSAweDI4NjAwMDAwKQotCQl7Ci0JCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpOwotCQl9Ci0JfQotfQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1WT0lEIFJUTVBJbml0UENJZUxpbmtDdHJsVmFsdWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0gICAgSU5UICAgICBwb3M7Ci0gICAgVVNIT1JUCXJlZzE2LCBkYXRhMiwgUENJZVBvd2VyU2F2ZUxldmVsLCBDb25maWd1cmF0aW9uOwotCVVJTlQzMiBNYWNWYWx1ZTsKLSAgICBCT09MRUFOCWJGaW5kSW50ZWwgPSBGQUxTRTsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0KLQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0JaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkKLQkJcmV0dXJuOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMuPT09PlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JLy8gSW5pdCBFRVBST00sIGFuZCBzYXZlIHNldHRpbmdzCi0JaWYgKCEoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpKQotCXsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDIyLCBQQ0llUG93ZXJTYXZlTGV2ZWwpOwotCQlwQWQtPlBDSWVQb3dlclNhdmVMZXZlbCA9IFBDSWVQb3dlclNhdmVMZXZlbCAmIDB4ZmY7Ci0JCXBBZC0+TG5rQ3RybEJpdE1hc2sgPSAwOwotCQlpZiAoKFBDSWVQb3dlclNhdmVMZXZlbCYweGZmKSA9PSAweGZmKQotCQl7Ci0JCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBQQ0llUG93ZXJTYXZlTGV2ZWwgPSAweCV4LlxuIiwgUENJZVBvd2VyU2F2ZUxldmVsKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQllbHNlCi0JewotCQlQQ0llUG93ZXJTYXZlTGV2ZWwgJj0gMHgzOwotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MjQsIGRhdGEyKTsKLQotCQlpZiggISgoKGRhdGEyJjB4ZmYwMCkgPT0gMHg5MjAwKSAmJiAoKGRhdGEyJjB4ODApICE9MCkpICkKLQkJewotCQkJaWYgKFBDSWVQb3dlclNhdmVMZXZlbCA+IDEgKQotCQkJCVBDSWVQb3dlclNhdmVMZXZlbCA9IDE7Ci0JCX0KLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBXcml0ZSAweDgzID0gMHgleC5cbiIsIFBDSWVQb3dlclNhdmVMZXZlbCkpOwotCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4ODMsIDB4ZmYsIChVQ0hBUilQQ0llUG93ZXJTYXZlTGV2ZWwsIDB4MDApOwotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MjIsIFBDSWVQb3dlclNhdmVMZXZlbCk7Ci0JCVBDSWVQb3dlclNhdmVMZXZlbCAmPSAweGZmOwotCQlQQ0llUG93ZXJTYXZlTGV2ZWwgPSBQQ0llUG93ZXJTYXZlTGV2ZWwgPj4gNjsKLQkJc3dpdGNoKFBDSWVQb3dlclNhdmVMZXZlbCkKLQkJewotCQkJCWNhc2UgMDoJLy8gT25seSBzdXBwb3J0IEwwCi0JCQkJCXBBZC0+TG5rQ3RybEJpdE1hc2sgPSAwOwotCQkJCWJyZWFrOwotCQkJCWNhc2UgMToJLy8gT25seSBlbmFibGUgTDBzCi0JCQkJCXBBZC0+TG5rQ3RybEJpdE1hc2sgPSAxOwotCQkJCWJyZWFrOwotCQkJCWNhc2UgMjoJLy8gZW5hYmxlIEwxLCBMMHMKLQkJCQkJcEFkLT5MbmtDdHJsQml0TWFzayA9IDM7Ci0JCQkJYnJlYWs7Ci0JCQkJY2FzZSAzOgkvLyBzeW5jIHdpdGggaG9zdCBjbGsgYW5kIGVuYWJsZSBMMSwgTDBzCi0JCQkJcEFkLT5MbmtDdHJsQml0TWFzayA9IDB4MTAzOwotCQkJCWJyZWFrOwotCQl9Ci0JCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MjQsIGRhdGEyKTsKLQkJCWlmICgoUENJZVBvd2VyU2F2ZUxldmVsJjB4ZmYpICE9IDB4ZmYpCi0JCQl7Ci0JCQkJUENJZVBvd2VyU2F2ZUxldmVsICY9IDB4MzsKLQotCQkJCWlmKCAhKCgoZGF0YTImMHhmZjAwKSA9PSAweDkyMDApICYmICgoZGF0YTImMHg4MCkgIT0wKSkgKQotCQkJCXsKLQkJCQkJaWYgKFBDSWVQb3dlclNhdmVMZXZlbCA+IDEgKQotCQkJCQkJUENJZVBvd2VyU2F2ZUxldmVsID0gMTsKLQkJCQl9Ci0KLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBydDI4eHggV3JpdGUgMHg4MyBDb21tYW5kID0gMHgleC5cbiIsIFBDSWVQb3dlclNhdmVMZXZlbCkpOwotCQkJCQkgICAgICAgcHJpbnRrKCJcblxuXG4lczolZFxuIixfX0ZVTkNUSU9OX18sX19MSU5FX18pOwotCi0JCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDgzLCAweGZmLCAoVUNIQVIpUENJZVBvd2VyU2F2ZUxldmVsLCAweDAwKTsKLQkJCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gTG5rQ3RybEJpdE1hc2sgPSAweCV4LlxuIiwgcEFkLT5MbmtDdHJsQml0TWFzaykpOwotCX0KLQl9Ci0JZWxzZSBpZiAoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpCi0JewotCQlVQ0hBUglMaW5rQ3RybFNldHRpbmcgPSAwOwotCi0JCS8vIENoZWNrIDMwOTBFIHNwZWNpYWwgc2V0dGluZyBjaGlwLgotCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDI0LCBkYXRhMik7Ci0JCWlmICgoZGF0YTIgPT0gMHg5MjgwKSAmJiAoKHBBZC0+TUFDVmVyc2lvbiYweGZmZmYpID09IDB4MDIxMSkpCi0JCXsKLQkJCXBBZC0+YjMwOTBFU3BlY2lhbENoaXAgPSBUUlVFOwotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiU3BlY2lhbCAzMDkwRSBjaGlwIFxuIikpOwotCQl9Ci0KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBBVVhfQ1RSTCwgJk1hY1ZhbHVlKTsKLQkJLy9lbmFibGUgV0FLRV9QQ0lFIGZ1bmN0aW9uLCB3aGljaCBmb3JjZXMgdG8gZW5hYmxlIFBDSUUgY2xvY2sgd2hlbiBtcHUgaW50ZXJydXB0IGFzc2VydGluZy4KLQkJLy9Gb3JjZSBQQ0lFIDEyNU1IeiBDTEsgdG8gdG9nZ2xlCi0JCU1hY1ZhbHVlIHw9IDB4NDAyOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVhfQ1RSTCwgTWFjVmFsdWUpOwotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCIgQVVYX0NUUkwgPSAweCUzMnhcbiIsIE1hY1ZhbHVlKSk7Ci0KLQotCi0JCS8vIGZvciBSVDMweHggRiBhbmQgYWZ0ZXIsIFBDSWUgaW5mdGVyZmFjZSwgYW5kIGZvciBwb3dlciBzb2x1dGlvbiAzCi0JCWlmICgoSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkpCi0JCQkmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA+PSAyKQotCQkJJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPD0gMykpCi0JCXsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgQVVYX0NUUkwsICZNYWNWYWx1ZSk7Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCIgUmVhZCBBVVhfQ1RSTCA9IDB4JXhcbiIsIE1hY1ZhbHVlKSk7Ci0JCQkvLyB0dXJuIG9uIGJpdCAxMi4KLQkJCS8vZW5hYmxlIDMyS0h6IGNsb2NrIG1vZGUgZm9yIHBvd2VyIHNhdmluZwotCQkJTWFjVmFsdWUgfD0gMHgxMDAwOwotCQkJaWYgKE1hY1ZhbHVlICE9IDB4ZmZmZmZmZmYpCi0JCQl7Ci0JCQkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVYX0NUUkwsIE1hY1ZhbHVlKTsKLQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCIgV3JpdGUgQVVYX0NUUkwgPSAweCV4XG4iLCBNYWNWYWx1ZSkpOwotCQkJCS8vIDEuIGlmIHVzZSBQQ0llUG93ZXJTZXR0aW5nIGlzIDIgb3IgMywgbmVlZCB0byBwcm9ncmFtIE9TQ19DVFJMIHRvIDB4M2ZmMTEuCi0JCQkJTWFjVmFsdWUgPSAweDNmZjExOwotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE9TQ19DVFJMLCBNYWNWYWx1ZSk7Ci0JCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiIE9TQ19DVFJMID0gMHgleFxuIiwgTWFjVmFsdWUpKTsKLQkJCQkvLyAyLiBXcml0ZSBQQ0kgcmVnaXN0ZXIgQ2xrIHJlZiBiaXQKLQkJCQlSVE1QcnQzeFNldFBDSWVQb3dlckxpbmtDdHJsKHBBZCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gRXJyb3IgcmVhZCBBdXhfQ3RybCB2YWx1ZS4gIEZvcmNlIHRvIHVzZSBzb2x1dGlvbiAxCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCIgRXJyb3IgVmFsdWUgaW4gQVVYX0NUUkwgPSAweCV4XG4iLCBNYWNWYWx1ZSkpOwotCQkJCXBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPSAxOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiIEZvcmNlIHRvIHVzZSBwb3dlciBzb2x1dGlvbjEgXG4iKSk7Ci0JCQl9Ci0JCX0KLQkJLy8gMS4gcmVhZCBzZXR0aW5nIGZyb20gaW5mIGZpbGUuCi0KLQkJUENJZVBvd2VyU2F2ZUxldmVsID0gKFVTSE9SVClwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlOwotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI9PT09PiBydDMweHggUmVhZCBQb3dlckxldmVsTW9kZSA9ICAweCV4LlxuIiwgUENJZVBvd2VyU2F2ZUxldmVsKSk7Ci0JCS8vIDIuIENoZWNrIEVuYWJsZU5ld1BTLgotCQlpZiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IEZBTFNFKQotCQkJUENJZVBvd2VyU2F2ZUxldmVsID0gMTsKLQotCQlpZiAoSVNfVkVSU0lPTl9CRUZPUkVfRihwQWQpICYmIChwQWQtPmIzMDkwRVNwZWNpYWxDaGlwID09IEZBTFNFKSkKLQkJewotCQkJLy8gQ2hpcCBWZXJzaW9uIEUgb25seSBhbGxvdyAxLCBTbyBmb3JjZSBzZXQgMS4KLQkJCVBDSWVQb3dlclNhdmVMZXZlbCAmPSAweDE7Ci0JCQlwQWQtPlBDSWVQb3dlclNhdmVMZXZlbCA9IChVU0hPUlQpUENJZVBvd2VyU2F2ZUxldmVsOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gcnQzMHh4IEUgV3JpdGUgMHg4MyBDb21tYW5kID0gMHgleC5cbiIsIFBDSWVQb3dlclNhdmVMZXZlbCkpOwotCi0JCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4ODMsIDB4ZmYsIChVQ0hBUilQQ0llUG93ZXJTYXZlTGV2ZWwsIDB4MDApOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gQ2hpcCBWZXJzaW9uIEYgYW5kIGFmdGVyIG9ubHkgYWxsb3cgMSBvciAyIG9yIDMuIFRoaXMgbWlnaHQgYmUgbW9kaWZpZWQgYWZ0ZXIgbmV3IGNoaXAgdmVyc2lvbiBjb21lIG91dC4KLQkJCWlmICghKChQQ0llUG93ZXJTYXZlTGV2ZWwgPT0gMSkgfHwgKFBDSWVQb3dlclNhdmVMZXZlbCA9PSAzKSkpCi0JCQkJUENJZVBvd2VyU2F2ZUxldmVsID0gMTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIj09PT0+IHJ0MzB4eCBGIFdyaXRlIDB4ODMgQ29tbWFuZCA9IDB4JXguXG4iLCBQQ0llUG93ZXJTYXZlTGV2ZWwpKTsKLQkJCXBBZC0+UENJZVBvd2VyU2F2ZUxldmVsID0gKFVTSE9SVClQQ0llUG93ZXJTYXZlTGV2ZWw7Ci0JCQkvLyBmb3IgMzA5MEYgLCB3ZSBuZWVkIHRvIGFkZCBoaWdoLWJ5dGUgYXJnIGZvciAweDgzIGNvbW1hbmQgdG8gaW5kaWNhdGUgdGhlIGxpbmsgY29udHJvbCBzZXR0aW5nIGluCi0JCQkvLyBQQ0kgQ29uZmlndXJhdGlvbiBTcGFjZS4gQmVjYXVzZSBmaXJtd2FyZSBjYW4ndCByZWFkIFBDSSBDb25maWd1cmF0aW9uIFNwYWNlCi0JCQlpZiAoKHBBZC0+UnQzeHhSYWxpbmtMaW5rQ3RybCAmIDB4MikgJiYgKHBBZC0+UnQzeHhIb3N0TGlua0N0cmwgJiAweDIpKQotCQkJewotCQkJCUxpbmtDdHJsU2V0dGluZyA9IDE7Ci0JCQl9Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBydDMweHhGIExpbmtDdHJsU2V0dGluZyA9IDB4JXguXG4iLCBMaW5rQ3RybFNldHRpbmcpKTsKLQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg4MywgMHhmZiwgKFVDSEFSKVBDSWVQb3dlclNhdmVMZXZlbCwgTGlua0N0cmxTZXR0aW5nKTsKLQkJfQotCi0JfQotCi0gICAgLy8gRmluZCBSYWxpbmsgUENJZSBEZXZpY2UncyBFeHByZXNzIENhcGFiaWxpdHkgT2Zmc2V0Ci0JcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwT2JqLT5wY2lfZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7Ci0KLSAgICBpZiAocG9zICE9IDApCi0gICAgewotICAgICAgICAvLyBSYWxpbmsgUENJZSBEZXZpY2UncyBMaW5rIENvbnRyb2wgUmVnaXN0ZXIgT2Zmc2V0Ci0gICAgICAgIHBBZC0+Ukxua0N0cmxPZmZzZXQgPSBwb3MgKyBQQ0lfRVhQX0xOS0NUTDsKLQlwY2lfcmVhZF9jb25maWdfd29yZChwT2JqLT5wY2lfZGV2LCBwQWQtPlJMbmtDdHJsT2Zmc2V0LCAmcmVnMTYpOwotICAgICAgICBDb25maWd1cmF0aW9uID0gbGUyY3B1MTYocmVnMTYpOwotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWFkIChSYWxpbmsgUENJZSBMaW5rIENvbnRyb2wgUmVnaXN0ZXIpIG9mZnNldCAweCV4ID0gMHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Ukxua0N0cmxPZmZzZXQsIENvbmZpZ3VyYXRpb24pKTsKLSAgICAgICAgcEFkLT5STG5rQ3RybENvbmZpZ3VyYXRpb24gPSAoQ29uZmlndXJhdGlvbiAmIDB4MTAzKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7Ci0gICAgICAgIENvbmZpZ3VyYXRpb24gfD0gKDB4MCk7Ci0KLSAgICAgICAgUlRNUEZpbmRIb3N0UENJRGV2KHBBZCk7Ci0gICAgICAgIGlmIChwT2JqLT5wYXJlbnRfcGNpX2RldikKLSAgICAgICAgewotCQlVU0hPUlQgIHZlbmRvcl9pZDsKLQotCQlwY2lfcmVhZF9jb25maWdfd29yZChwT2JqLT5wYXJlbnRfcGNpX2RldiwgUENJX1ZFTkRPUl9JRCwgJnZlbmRvcl9pZCk7Ci0JCXZlbmRvcl9pZCA9IGxlMmNwdTE2KHZlbmRvcl9pZCk7Ci0JCWlmICh2ZW5kb3JfaWQgPT0gUENJQlVTX0lOVEVMX1ZFTkRPUikKLSAgICAgICAgICAgICAgICAgewotCQkJYkZpbmRJbnRlbCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSVE1QX1NFVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19UT0dHTEVfTDEpOwotICAgICAgICAgICAgICAgICB9Ci0JCS8qCi0JCWVsc2UgaWYgKCh2ZW5kb3JfaWQgPT0gUENJQlVTX0FNRF9WRU5ET1IxKQotCQkJCQkmJiAoRGV2aWNlSUQgPT0gMHg5NjAwMDAwMCkpCi0JCQkJewotCQkJCQkvL1ZlcmlmaWVkIDI3OTIgQXNwaXJlIDg1MzAgQU1EIE5CIChTMy9TNC9DQm9vdC9XQm9vdC9DaGFyaW90KSBieSBjdXN0b21lciBhbmQgb3Vyc2VsdmVzLgotCQkJCQkvLyBTbyB1c2UgTDEgVG9nZ2xlIG1ldGhvZCBpbiB0aGlzIE5CLgotCQkJYkZpbmRJbnRlbCA9IFRSVUU7Ci0JCQkJCVJUTVBfU0VUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX1RPR0dMRV9MMSk7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBTTSA6IEFzcGlyZSA4NTMwIEFNRCBOQi4gVXNlIEwxIFRvZ2dsZS4gXG4iKSk7Ci0JCQkJfQotCQkqLwotCQkvLyBGaW5kIFBDSS10by1QQ0kgQnJpZGdlIEV4cHJlc3MgQ2FwYWJpbGl0eSBPZmZzZXQKLQkJcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwT2JqLT5wYXJlbnRfcGNpX2RldiwgUENJX0NBUF9JRF9FWFApOwotCi0JCWlmIChwb3MgIT0gMCkKLQkJewotCQkJQk9PTEVBTgkJYkNoYW5nZSA9IEZBTFNFOwotCQkJLy8gUENJLXRvLVBDSSBCcmlkZ2UgTGluayBDb250cm9sIFJlZ2lzdGVyIE9mZnNldAotCQkJcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCA9IHBvcyArIFBDSV9FWFBfTE5LQ1RMOwotCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQocE9iai0+cGFyZW50X3BjaV9kZXYsIHBBZC0+SG9zdExua0N0cmxPZmZzZXQsICZyZWcxNik7Ci0JCQlDb25maWd1cmF0aW9uID0gbGUyY3B1MTYocmVnMTYpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVhZCAoSG9zdCBQQ0ktdG8tUENJIEJyaWRnZSBMaW5rIENvbnRyb2wgUmVnaXN0ZXIpIG9mZnNldCAweCV4ID0gMHgleFxuIiwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKSk7Ci0JCQlwQWQtPkhvc3RMbmtDdHJsQ29uZmlndXJhdGlvbiA9IChDb25maWd1cmF0aW9uICYgMHgxMDMpOwotCQkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7Ci0JCQlDb25maWd1cmF0aW9uIHw9ICgweDApOwotCi0JCQlzd2l0Y2ggKHBPYmotPkRldmljZUlEKQotCQkJewotI2lmZGVmIFJUMzA5MAotCQkJCWNhc2UgTklDMzA5MF9QQ0llX0RFVklDRV9JRDoKLQkJCQljYXNlIE5JQzMwOTFfUENJZV9ERVZJQ0VfSUQ6Ci0JCQkJY2FzZSBOSUMzMDkyX1BDSWVfREVWSUNFX0lEOgotCQkJCQlpZiAoYkZpbmRJbnRlbCA9PSBGQUxTRSkKLQkJCQkJCWJDaGFuZ2UgPSBUUlVFOwotCQkJCQlicmVhazsKLSNlbmRpZiAvLyBSVDMwOTAgLy8KLQkJCQlkZWZhdWx0OgotCQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKGJDaGFuZ2UpCi0JCQl7Ci0JCQkJcmVnMTYgPSBjcHUybGUxNihDb25maWd1cmF0aW9uKTsKLQkJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocE9iai0+cGFyZW50X3BjaV9kZXYsIHBBZC0+SG9zdExua0N0cmxPZmZzZXQsIHJlZzE2KTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcml0ZSAoSG9zdCBQQ0ktdG8tUENJIEJyaWRnZSBMaW5rIENvbnRyb2wgUmVnaXN0ZXIpIG9mZnNldCAweCV4ID0gMHgleFxuIiwKLQkJCQkJCXBBZC0+SG9zdExua0N0cmxPZmZzZXQsIENvbmZpZ3VyYXRpb24pKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCXBBZC0+SG9zdExua0N0cmxPZmZzZXQgPSAwOwotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IGNhbm5vdCBmaW5kIFBDSS10by1QQ0kgQnJpZGdlIFBDSSBFeHByZXNzIENhcGFiaWxpdHkhXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBBZC0+Ukxua0N0cmxPZmZzZXQgPSAwOwotICAgICAgICBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0ID0gMDsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IGNhbm5vdCBmaW5kIFJhbGluayBQQ0llIERldmljZSdzIFBDSSBFeHByZXNzIENhcGFiaWxpdHkhXG4iLCBfX0ZVTkNUSU9OX18pKTsKLSAgICB9Ci0KLSAgICBpZiAoYkZpbmRJbnRlbCA9PSBGQUxTRSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRvZXNuJ3QgZmluZCBJbnRlbCBQQ0kgaG9zdCBjb250cm9sbGVyLiBcbiIpKTsKLQkJLy8gRG9lc24ndCBzd2l0Y2ggTDAsIEwxLCBTbyBzZXQgUENJZVBvd2VyU2F2ZUxldmVsIHRvIDB4ZmYKLQkJcEFkLT5QQ0llUG93ZXJTYXZlTGV2ZWwgPSAweGZmOwotCQlpZiAoKHBBZC0+Ukxua0N0cmxPZmZzZXQgIT0gMCkKLSNpZmRlZiBSVDMwOTAKLQkJCSYmICgocE9iai0+RGV2aWNlSUQgPT0gTklDMzA5MF9QQ0llX0RFVklDRV9JRCkKLQkJCQl8fChwT2JqLT5EZXZpY2VJRCA9PSBOSUMzMDkxX1BDSWVfREVWSUNFX0lEKQotCQkJCXx8KHBPYmotPkRldmljZUlEID09IE5JQzMwOTJfUENJZV9ERVZJQ0VfSUQpKQotI2VuZGlmIC8vIFJUMzA5MCAvLwotCQkpCi0JCXsKLQkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBPYmotPnBjaV9kZXYsIHBBZC0+Ukxua0N0cmxPZmZzZXQsICZyZWcxNik7Ci0JCQlDb25maWd1cmF0aW9uID0gbGUyY3B1MTYocmVnMTYpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVhZCAoUmFsaW5rIDMweHggUENJZSBMaW5rIENvbnRyb2wgUmVnaXN0ZXIpIG9mZnNldCAweCV4ID0gMHgleFxuIiwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Ukxua0N0cmxPZmZzZXQsIENvbmZpZ3VyYXRpb24pKTsKLQkJCXBBZC0+Ukxua0N0cmxDb25maWd1cmF0aW9uID0gKENvbmZpZ3VyYXRpb24gJiAweDEwMyk7Ci0JCQlDb25maWd1cmF0aW9uICY9IDB4ZmVmYzsKLQkJCUNvbmZpZ3VyYXRpb24gfD0gKDB4MCk7Ci0JCQlyZWcxNiA9IGNwdTJsZTE2KENvbmZpZ3VyYXRpb24pOwotCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBPYmotPnBjaV9kZXYsIHBBZC0+Ukxua0N0cmxPZmZzZXQsIHJlZzE2KTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldyaXRlIChSYWxpbmsgUENJZSBMaW5rIENvbnRyb2wgUmVnaXN0ZXIpICBvZmZzZXQgMHgleCA9IDB4JXhcbiIsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICBwb3MgKyBQQ0lfRVhQX0xOS0NUTCwgQ29uZmlndXJhdGlvbikpOwotCQl9Ci0JfQotfQotCi1WT0lEIFJUTVBGaW5kSG9zdFBDSURldigKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLSAgICBVU0hPUlQgIHJlZzE2OwotICAgIFVDSEFSICAgcmVnODsKLQlVSU5UCURldkZuOwotICAgIFBQQ0lfREVWICAgIHBQY2lfZGV2OwotCVBPU19DT09LSUUJcE9iajsKLQotCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKQotCQlyZXR1cm47Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcy49PT0+XG4iLCBfX0ZVTkNUSU9OX18pKTsKLQotICAgIHBPYmotPnBhcmVudF9wY2lfZGV2ID0gTlVMTDsKLSAgICBpZiAocE9iai0+cGNpX2Rldi0+YnVzLT5wYXJlbnQpCi0gICAgewotICAgICAgICBmb3IgKERldkZuID0gMDsgRGV2Rm4gPCAyNTU7IERldkZuKyspCi0gICAgICAgIHsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCi0gICAgICAgICAgICBwUGNpX2RldiA9IHBjaV9nZXRfc2xvdChwT2JqLT5wY2lfZGV2LT5idXMtPnBhcmVudCwgRGV2Rm4pOwotI2Vsc2UKLSAgICAgICAgICAgIHBQY2lfZGV2ID0gcGNpX2ZpbmRfc2xvdChwT2JqLT5wY2lfZGV2LT5idXMtPnBhcmVudC0+bnVtYmVyLCBEZXZGbik7Ci0jZW5kaWYKLSAgICAgICAgICAgIGlmIChwUGNpX2RldikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwY2lfcmVhZF9jb25maWdfd29yZChwUGNpX2RldiwgUENJX0NMQVNTX0RFVklDRSwgJnJlZzE2KTsKLSAgICAgICAgICAgICAgICByZWcxNiA9IGxlMmNwdTE2KHJlZzE2KTsKLSAgICAgICAgICAgICAgICBwY2lfcmVhZF9jb25maWdfYnl0ZShwUGNpX2RldiwgUENJX0NCX0NBUkRfQlVTLCAmcmVnOCk7Ci0gICAgICAgICAgICAgICAgaWYgKChyZWcxNiA9PSBQQ0lfQ0xBU1NfQlJJREdFX1BDSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHJlZzggPT0gcE9iai0+cGNpX2Rldi0+YnVzLT5udW1iZXIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcE9iai0+cGFyZW50X3BjaV9kZXYgPSBwUGNpX2RldjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCQlMZXZlbCA9IFJFU1RPUkVfSEFMVCA6IFJlc3RvcmUgUENJIGhvc3QgYW5kIFJhbGluayBQQ0llIExpbmsgQ29udHJvbCBmaWVsZCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4KLQkJTGV2ZWwgPSBPdGhlciBWYWx1ZSA6IFJlc3RvcmUgZnJvbSBkb3QxMSBwb3dlciBzYXZlIG9yIHJhZGlvIG9mZiBzdGF0dXMuIEFuZCBmb3JjZSBQQ0kgaG9zdCBMaW5rIENvbnRyb2wgZmllbGRzIHRvIDB4MQotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICAgVUNIQVIJCUxldmVsKQotewotCVVTSE9SVCAgUENJZVBvd2VyU2F2ZUxldmVsLCByZWcxNjsKLQlVU0hPUlQJQ29uZmlndXJhdGlvbjsKLQlQT1NfQ09PS0lFCXBPYmo7Ci0KLQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0JaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkKLQkJcmV0dXJuOwotCi0JLy8gQ2hlY2sgUFNDb250cm9sIENvbmZpZ3VyYXRpb24KLQlpZiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IEZBTFNFKQotCQlyZXR1cm4gVFJVRTsKLQotCS8vMzA5MCB3aWxsIG5vdCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgY29kZXMuCi0JLy8gQ2hlY2sgaW50ZXJmYWNlIDogSWYgbm90IFBDSWUgaW50ZXJmYWNlLCByZXR1cm4uCi0KLSNpZmRlZiBSVDMwOTAKLQlpZiAoKHBPYmotPkRldmljZUlEID09IE5JQzMwOTBfUENJZV9ERVZJQ0VfSUQpCi0JCXx8KHBPYmotPkRldmljZUlEID09IE5JQzMwOTFfUENJZV9ERVZJQ0VfSUQpCi0JCXx8KHBPYmotPkRldmljZUlEID09IE5JQzMwOTJfUENJZV9ERVZJQ0VfSUQpKQotCQlyZXR1cm47Ci0jZW5kaWYgLy8gUlQzMDkwIC8vCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMuPT09PlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JUENJZVBvd2VyU2F2ZUxldmVsID0gcEFkLT5QQ0llUG93ZXJTYXZlTGV2ZWw7Ci0JaWYgKChQQ0llUG93ZXJTYXZlTGV2ZWwmMHhmZikgPT0gMHhmZikKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgicmV0dXJuICBcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwT2JqLT5wYXJlbnRfcGNpX2RldiAmJiAocEFkLT5Ib3N0TG5rQ3RybE9mZnNldCAhPSAwKSkKLSAgICB7Ci0gICAgICAgIFBDSV9SRUdfUkVBRF9XT1JEKHBPYmotPnBhcmVudF9wY2lfZGV2LCBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKTsKLSAgICAgICAgaWYgKChDb25maWd1cmF0aW9uICE9IDApICYmCi0gICAgICAgICAgICAoQ29uZmlndXJhdGlvbiAhPSAweEZGRkYpKQotICAgICAgICB7Ci0JCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOwotCQkvLyBJZiBjYWxsIGZyb20gaW50ZXJmYWNlIGRvd24sIHJlc3RvcmUgdG8gb3JnaW5pYWwgc2V0dGluZy4KLQkJaWYgKExldmVsID09IFJFU1RPUkVfQ0xPU0UpCi0JCXsKLQkJCUNvbmZpZ3VyYXRpb24gfD0gcEFkLT5Ib3N0TG5rQ3RybENvbmZpZ3VyYXRpb247Ci0JCX0KLQkJZWxzZQotCQkJQ29uZmlndXJhdGlvbiB8PSAweDA7Ci0gICAgICAgICAgICBQQ0lfUkVHX1dJUlRFX1dPUkQocE9iai0+cGFyZW50X3BjaV9kZXYsIHBBZC0+SG9zdExua0N0cmxPZmZzZXQsIENvbmZpZ3VyYXRpb24pOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZXN0b3JlIFBDSSBob3N0IDogb2Zmc2V0IDB4JXggPSAweCV4XG4iLCBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUmVzdG9yZSBQQ0kgaG9zdCA6IFBDSV9SRUdfUkVBRF9XT1JEIGZhaWxlZCAoQ29uZmlndXJhdGlvbiA9IDB4JXgpXG4iLCBDb25maWd1cmF0aW9uKSk7Ci0gICAgfQotCi0gICAgaWYgKHBPYmotPnBjaV9kZXYgJiYgKHBBZC0+Ukxua0N0cmxPZmZzZXQgIT0gMCkpCi0gICAgewotICAgICAgICBQQ0lfUkVHX1JFQURfV09SRChwT2JqLT5wY2lfZGV2LCBwQWQtPlJMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKTsKLSAgICAgICAgaWYgKChDb25maWd1cmF0aW9uICE9IDApICYmCi0gICAgICAgICAgICAoQ29uZmlndXJhdGlvbiAhPSAweEZGRkYpKQotICAgICAgICB7Ci0JCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOwotCQkJLy8gSWYgY2FsbCBmcm9tIGludGVyZmFjZSBkb3duLCByZXN0b3JlIHRvIG9yZ2luaWFsIHNldHRpbmcuCi0JCQlpZiAoTGV2ZWwgPT0gUkVTVE9SRV9DTE9TRSkKLQkJQ29uZmlndXJhdGlvbiB8PSBwQWQtPlJMbmtDdHJsQ29uZmlndXJhdGlvbjsKLQkJCWVsc2UKLQkJCQlDb25maWd1cmF0aW9uIHw9IDB4MDsKLSAgICAgICAgICAgIFBDSV9SRUdfV0lSVEVfV09SRChwT2JqLT5wY2lfZGV2LCBwQWQtPlJMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVzdG9yZSBSYWxpbmsgOiBvZmZzZXQgMHgleCA9IDB4JXhcbiIsIHBBZC0+Ukxua0N0cmxPZmZzZXQsIENvbmZpZ3VyYXRpb24pKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSZXN0b3JlIFJhbGluayA6IFBDSV9SRUdfUkVBRF9XT1JEIGZhaWxlZCAoQ29uZmlndXJhdGlvbiA9IDB4JXgpXG4iLCBDb25maWd1cmF0aW9uKSk7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcyA8PT09XG4iLCBfX0ZVTkNUSU9OX18pKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0KLQlBcmd1bWVudHM6Ci0JCU1heCA6IGxpbWl0IEhvc3QgUENJIGFuZCBSYWxpbmsgUENJZSBkZXZpY2UncyBMSU5LIENPTlRST0wgZmllbGQncyB2YWx1ZS4KLQkJQmVjYXVzZSBub3cgZnJlcXVlbnRseSBzZXQgb3VyIGRldmljZSB0byBtb2RlIDEgb3IgbW9kZSAzIHdpbGwgY2F1c2UgcHJvYmxlbS4KLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUFBDSWVMaW5rQ3RybFNldHRpbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQlNYXgpCi17Ci0JVVNIT1JUICBQQ0llUG93ZXJTYXZlTGV2ZWwsIHJlZzE2OwotCVVTSE9SVAlDb25maWd1cmF0aW9uOwotCVBPU19DT09LSUUJcE9iajsKLQotCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKQotCQlyZXR1cm47Ci0KLQkvLyBDaGVjayBQU0NvbnRyb2wgQ29uZmlndXJhdGlvbgotCWlmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gRkFMU0UpCi0JCXJldHVybiBUUlVFOwotCi0JLy8gQ2hlY2sgaW50ZXJmYWNlIDogSWYgbm90IFBDSWUgaW50ZXJmYWNlLCByZXR1cm4uCi0JLy9CbG9jayAzMDkwIHRvIGVudGVyIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24KLQotI2lmZGVmIFJUMzA5MAotCWlmICgocE9iai0+RGV2aWNlSUQgPT0gTklDMzA5MF9QQ0llX0RFVklDRV9JRCkKLQkJfHwocE9iai0+RGV2aWNlSUQgPT0gTklDMzA5MV9QQ0llX0RFVklDRV9JRCkKLQkJfHwocE9iai0+RGV2aWNlSUQgPT0gTklDMzA5Ml9QQ0llX0RFVklDRV9JRCkpCi0JCXJldHVybjsKLSNlbmRpZiAvLyBSVDMwOTAgLy8KLQlpZiAoIVJUTVBfVEVTVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19DQU5fR09fU0xFRVApKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfSU5GTywgKCJSVE1QUENJZVBvd2VyTGlua0N0cmwgcmV0dXJuIG9uIGZSVE1QX1BTX0NBTl9HT19TTEVFUCBmbGFnXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcz09PT5cbiIsIF9fRlVOQ1RJT05fXykpOwotCVBDSWVQb3dlclNhdmVMZXZlbCA9IHBBZC0+UENJZVBvd2VyU2F2ZUxldmVsOwotCWlmICgoUENJZVBvd2VyU2F2ZUxldmVsJjB4ZmYpID09IDB4ZmYpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInJldHVybiAgXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0JUENJZVBvd2VyU2F2ZUxldmVsID0gUENJZVBvd2VyU2F2ZUxldmVsPj42OwotCi0gICAgLy8gU2tpcCBub24tZXhpc3QgZGVpY2UgcmlnaHQgYXdheQotCWlmIChwT2JqLT5wYXJlbnRfcGNpX2RldiAmJiAocEFkLT5Ib3N0TG5rQ3RybE9mZnNldCAhPSAwKSkKLQl7Ci0gICAgICAgIFBDSV9SRUdfUkVBRF9XT1JEKHBPYmotPnBhcmVudF9wY2lfZGV2LCBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKTsKLQkJc3dpdGNoIChQQ0llUG93ZXJTYXZlTGV2ZWwpCi0JCXsKLQkJCWNhc2UgMDoKLQkJCQkvLyBTZXQgYjAgYW5kIGIxIG9mIExpbmtDb250cm9sIChib3RoIDI4OTIgYW5kIFBDSWUgYnJpZGdlKSB0byAwMAotCQkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCS8vIFNldCBiMCBhbmQgYjEgb2YgTGlua0NvbnRyb2wgKGJvdGggMjg5MiBhbmQgUENJZSBicmlkZ2UpIHRvIDAxCi0JCQkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7Ci0JCQkJQ29uZmlndXJhdGlvbiB8PSAweDE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJLy8gIFNldCBiMCBhbmQgYjEgb2YgTGlua0NvbnRyb2wgKGJvdGggMjg5MiBhbmQgUENJZSBicmlkZ2UpIHRvIDExCi0JCQkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7Ci0JCQkJQ29uZmlndXJhdGlvbiB8PSAweDM7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDM6Ci0JCQkJLy8gU2V0IGIwIGFuZCBiMSBvZiBMaW5rQ29udHJvbCAoYm90aCAyODkyIGFuZCBQQ0llIGJyaWRnZSkgdG8gMTEgYW5kIGJpdCA4IG9mIExpbmtDb250cm9sIG9mIDI4OTIgdG8gMQotCQkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOwotCQkJCUNvbmZpZ3VyYXRpb24gfD0gMHgxMDM7Ci0JCQkJYnJlYWs7Ci0JCX0KLSAgICAgICAgUENJX1JFR19XSVJURV9XT1JEKHBPYmotPnBhcmVudF9wY2lfZGV2LCBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3JpdGUgUENJIGhvc3Qgb2Zmc2V0IDB4JXggPSAweCV4XG4iLCBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKSk7Ci0JfQotCi0JaWYgKHBPYmotPnBjaV9kZXYgJiYgKHBBZC0+Ukxua0N0cmxPZmZzZXQgIT0gMCkpCi0JewotCQkvLyBmaXJzdCAyODkyIGNoaXAgbm90IGFsbG93IHRvIGZyZXF1ZW50bHkgc2V0IG1vZGUgMy4gd2lsbCBjYXVzZSBoYW5nIHByb2JsZW0uCi0JCWlmIChQQ0llUG93ZXJTYXZlTGV2ZWwgPiBNYXgpCi0JCQlQQ0llUG93ZXJTYXZlTGV2ZWwgPSBNYXg7Ci0KLSAgICAgICAgUENJX1JFR19SRUFEX1dPUkQocE9iai0+cGNpX2RldiwgcEFkLT5STG5rQ3RybE9mZnNldCwgQ29uZmlndXJhdGlvbik7Ci0JCXN3aXRjaCAoUENJZVBvd2VyU2F2ZUxldmVsKQotCQl7Ci0JCQljYXNlIDA6Ci0JCQkJLy8gTm8gUENJIHBvd2VyIHNhZmUKLQkJCQkvLyBTZXQgYjAgYW5kIGIxIG9mIExpbmtDb250cm9sIChib3RoIDI4OTIgYW5kIFBDSWUgYnJpZGdlKSB0byAwMCAuCi0JCQkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE6Ci0JCQkJLy8gIEwwCi0JCQkJLy8gU2V0IGIwIGFuZCBiMSBvZiBMaW5rQ29udHJvbCAoYm90aCAyODkyIGFuZCBQQ0llIGJyaWRnZSkgdG8gMDEgLgotCQkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOwotCQkJCUNvbmZpZ3VyYXRpb24gfD0gMHgxOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCS8vIEwwIGFuZCBMMQotCQkJCS8vICBTZXQgYjAgYW5kIGIxIG9mIExpbmtDb250cm9sIChib3RoIDI4OTIgYW5kIFBDSWUgYnJpZGdlKSB0byAxMQotCQkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOwotCQkJCUNvbmZpZ3VyYXRpb24gfD0gMHgzOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzOgotCQkJCS8vIEwwICwgTDEgYW5kIGNsb2NrIG1hbmFnZW1lbnQuCi0JCQkJLy8gU2V0IGIwIGFuZCBiMSBvZiBMaW5rQ29udHJvbCAoYm90aCAyODkyIGFuZCBQQ0llIGJyaWRnZSkgdG8gMTEgYW5kIGJpdCA4IG9mIExpbmtDb250cm9sIG9mIDI4OTIgdG8gMQotCQkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOwotCQkJCUNvbmZpZ3VyYXRpb24gfD0gMHgxMDM7Ci0JCSAgICAgICAgICAgICAgcEFkLT5iUENJY2xrT2ZmID0gVFJVRTsKLQkJCQlicmVhazsKLQkJfQotICAgICAgICBQQ0lfUkVHX1dJUlRFX1dPUkQocE9iai0+cGNpX2RldiwgcEFkLT5STG5rQ3RybE9mZnNldCwgQ29uZmlndXJhdGlvbik7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldyaXRlIFJhbGluayBkZXZpY2UgOiBvZmZzZXQgMHgleCA9IDB4JXhcbiIsIHBBZC0+Ukxua0N0cmxPZmZzZXQsIENvbmZpZ3VyYXRpb24pKTsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBQQ0llUG93ZXJMaW5rQ3RybCA8PT09PT09PT09PT09PT1cbiIpKTsKLX0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQkxLiBXcml0ZSBhIFBDSSByZWdpc3RlciBmb3IgcnQzMHh4IHBvd2VyIHNvbHV0aW9uIDMKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUHJ0M3hTZXRQQ0llUG93ZXJMaW5rQ3RybCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQotCVVMT05HCUhvc3RDb25maWd1cmF0aW9uOwotCVVMT05HCUNvbmZpZ3VyYXRpb247Ci0JVUxPTkcJVmVuZG9yOwotCVVMT05HCW9mZnNldDsKLQlQT1NfQ09PS0lFCXBPYmo7Ci0JSU5UICAgICBwb3M7Ci0JVVNIT1JUCXJlZzE2OwotCi0JcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX0lORk8sICgiUlRNUHJ0M3hTZXRQQ0llUG93ZXJMaW5rQ3RybC49PT0+ICV4XG4iLCBwQWQtPlN0YUNmZy5QU0NvbnRyb2wud29yZCkpOwotCi0JLy8gQ2hlY2sgUFNDb250cm9sIENvbmZpZ3VyYXRpb24KLQlpZiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IEZBTFNFKQotCQlyZXR1cm47Ci0JUlRNUEZpbmRIb3N0UENJRGV2KHBBZCk7Ci0gICAgICAgIGlmIChwT2JqLT5wYXJlbnRfcGNpX2RldikKLSAgICAgICAgewotCQlVU0hPUlQgIHZlbmRvcl9pZDsKLQkJLy8gRmluZCBQQ0ktdG8tUENJIEJyaWRnZSBFeHByZXNzIENhcGFiaWxpdHkgT2Zmc2V0Ci0JCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkocE9iai0+cGFyZW50X3BjaV9kZXYsIFBDSV9DQVBfSURfRVhQKTsKLQotCQlpZiAocG9zICE9IDApCi0JCXsKLQkJCXBBZC0+SG9zdExua0N0cmxPZmZzZXQgPSBwb3MgKyBQQ0lfRVhQX0xOS0NUTDsKLQkJfQotCS8vIElmIGNvbmZpZ3VyYXJlZCB0byB0dXJuIG9uIEwxLgotCUhvc3RDb25maWd1cmF0aW9uID0gMDsKLQkJaWYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhGb3JjZUFTUE1UZXN0ID09IDEpCi0JCXsKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkVudGVyLFBTTSA6IEZvcmNlIEFTUE0gXG4iKSk7Ci0KLQkJCS8vIFNraXAgbm9uLWV4aXN0IGRlaWNlIHJpZ2h0IGF3YXkKLQkJCWlmICgocEFkLT5Ib3N0TG5rQ3RybE9mZnNldCAhPSAwKSkKLQkJCXsKLQkJCSBQQ0lfUkVHX1JFQURfV09SRChwT2JqLT5wYXJlbnRfcGNpX2RldiwgcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCwgSG9zdENvbmZpZ3VyYXRpb24pOwotCQkJCS8vIFByZXBhcmUgQ29uZmlndXJhdGlvbiB0byB3cml0ZSB0byBIb3N0Ci0JCQkJSG9zdENvbmZpZ3VyYXRpb24gfD0gMHgzOwotCQkJCVBDSV9SRUdfV0lSVEVfV09SRChwT2JqLT5wYXJlbnRfcGNpX2RldiwgcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCwgSG9zdENvbmZpZ3VyYXRpb24pOwotCQkJCXBBZC0+UnQzeHhIb3N0TGlua0N0cmwgPSBIb3N0Q29uZmlndXJhdGlvbjsKLQkJCQkvLyBCZWNhdXNlIGluIHJ0MzB4eEZvcmNlQVNQTVRlc3QgTW9kZSwgRm9yY2UgdHVybiBvbiBMMHMsIEwxLgotCQkJCS8vIEZpeCBIb3N0Q29uZmlndXJhdGlvbiBiaXQwOjEgPSAweDMgZm9yIGxhdGVyIHVzZS4KLQkJCQlIb3N0Q29uZmlndXJhdGlvbiA9IDB4MzsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQU00gOiBGb3JjZSBBU1BNIDogSG9zdCBkZXZpY2UgTDEvTDBzIFZhbHVlID0gIDB4JXhcbiIsIEhvc3RDb25maWd1cmF0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eEZvbGxvd0hvc3RBU1BNID09IDEpCi0JCXsKLQotCQkJLy8gU2tpcCBub24tZXhpc3QgZGVpY2UgcmlnaHQgYXdheQotCQkJaWYgKChwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0ICE9IDApKQotCQkJewotCQkJIFBDSV9SRUdfUkVBRF9XT1JEKHBPYmotPnBhcmVudF9wY2lfZGV2LCBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LCBIb3N0Q29uZmlndXJhdGlvbik7Ci0JCQkJcEFkLT5SdDN4eEhvc3RMaW5rQ3RybCA9IEhvc3RDb25maWd1cmF0aW9uOwotCQkJCUhvc3RDb25maWd1cmF0aW9uICY9IDB4MzsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQU00gOiBGb2xsb3cgSG9zdCBBU1BNIDogSG9zdCBkZXZpY2UgTDEvTDBzIFZhbHVlID0gIDB4JXhcbiIsIEhvc3RDb25maWd1cmF0aW9uKSk7Ci0JCQl9Ci0JCX0KLSAgICAgICAgfQotCS8vIFByZXBhcmUgdG8gd3JpdGUgUmFsaW5rIHNldHRpbmcuCi0JLy8gRmluZCBSYWxpbmsgUENJZSBEZXZpY2UncyBFeHByZXNzIENhcGFiaWxpdHkgT2Zmc2V0Ci0JcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwT2JqLT5wY2lfZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7Ci0KLSAgICBpZiAocG9zICE9IDApCi0gICAgewotICAgICAgICAvLyBSYWxpbmsgUENJZSBEZXZpY2UncyBMaW5rIENvbnRyb2wgUmVnaXN0ZXIgT2Zmc2V0Ci0gICAgICAgcEFkLT5STG5rQ3RybE9mZnNldCA9IHBvcyArIFBDSV9FWFBfTE5LQ1RMOwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBPYmotPnBjaV9kZXYsIHBBZC0+Ukxua0N0cmxPZmZzZXQsICZyZWcxNik7Ci0gICAgICAgIENvbmZpZ3VyYXRpb24gPSBsZTJjcHUxNihyZWcxNik7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVhZCAoUmFsaW5rIFBDSWUgTGluayBDb250cm9sIFJlZ2lzdGVyKSBvZmZzZXQgMHgleCA9IDB4JXhcbiIsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlJMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKSk7Ci0JCUNvbmZpZ3VyYXRpb24gfD0gMHgxMDA7Ci0JCWlmICgocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eEZvbGxvd0hvc3RBU1BNID09IDEpCi0JCQl8fCAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eEZvcmNlQVNQTVRlc3QgPT0gMSkpCi0JCXsKLQkJCXN3aXRjaChIb3N0Q29uZmlndXJhdGlvbikKLQkJCXsKLQkJCQljYXNlIDA6Ci0JCQkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZmZmZmZjOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDE6Ci0JCQkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZmZmZmZjOwotCQkJCQlDb25maWd1cmF0aW9uIHw9IDB4MTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyOgotCQkJCQlDb25maWd1cmF0aW9uICY9IDB4ZmZmZmZmYzsKLQkJCQkJQ29uZmlndXJhdGlvbiB8PSAweDI7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzoKLQkJCQkJQ29uZmlndXJhdGlvbiB8PSAweDM7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJlZzE2ID0gY3B1MmxlMTYoQ29uZmlndXJhdGlvbik7Ci0JCXBjaV93cml0ZV9jb25maWdfd29yZChwT2JqLT5wY2lfZGV2LCBwQWQtPlJMbmtDdHJsT2Zmc2V0LCByZWcxNik7Ci0JCXBBZC0+UnQzeHhSYWxpbmtMaW5rQ3RybCA9IENvbmZpZ3VyYXRpb247Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBTTSA6V3JpdGUgUmFsaW5rIGRldmljZSBMMS9MMHMgVmFsdWUgPSAgMHgleFxuIiwgQ29uZmlndXJhdGlvbikpOwotCX0KLQlEQkdQUklOVChSVF9ERUJVR19JTkZPLCgiUFNNIDpSVE1QcnQzeFNldFBDSWVQb3dlckxpbmtDdHJsIDw9PT09PT09PT09PT09PVxuIikpOwotCi19Ci0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnQzMDkwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0MzA5MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzI1Y2IwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnQzMDkwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotCXJ0MzA5MC5oCi0KLSAgICBBYnN0cmFjdDoKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0jaWZuZGVmIF9fUlQzMDkwX0hfXwotI2RlZmluZSBfX1JUMzA5MF9IX18KLQotI2lmZGVmIFJUMzA5MAotCi0jaWZuZGVmIFJUTVBfUENJX1NVUFBPUlQKLSNlcnJvciAiRm9yIFJUMzA5MCwgeW91IHNob3VsZCBkZWZpbmUgdGhlIGNvbXBpbGUgZmxhZyAtRFJUTVBfUENJX1NVUFBPUlQiCi0jZW5kaWYKLQotI2lmbmRlZiBSVE1QX01BQ19QQ0kKLSNlcnJvciAiRm9yIFJUMzA5MCwgeW91IHNob3VsZCBkZWZpbmUgdGhlIGNvbXBpbGUgZmxhZyAtRFJUTVBfTUFDX1BDSSIKLSNlbmRpZgotCi0jaWZuZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotI2Vycm9yICJGb3IgUlQzMDkwLCB5b3Ugc2hvdWxkIGRlZmluZSB0aGUgY29tcGlsZSBmbGFnIC1EUlRNUF9SRl9SV19TVVBQT1JUIgotI2VuZGlmCi0KLSNpZm5kZWYgUlQzMHh4Ci0jZXJyb3IgIkZvciBSVDMwOTAsIHlvdSBzaG91bGQgZGVmaW5lIHRoZSBjb21waWxlIGZsYWcgLURSVDMweHgiCi0jZW5kaWYKLQotI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKLSNkZWZpbmUgVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVAotI2RlZmluZSBDQVJSSUVSX1NFTlNFX05FV19BTEdPCi0jZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLwotCi0jZGVmaW5lIFBDSUVfUFNfU1VQUE9SVAotCi0jaW5jbHVkZSAibWFjX3BjaS5oIgotI2luY2x1ZGUgInJ0MzB4eC5oIgotCi0vLwotLy8gRGV2aWNlIElEICYgVmVuZG9yIElELCB0aGVzZSB2YWx1ZXMgc2hvdWxkIG1hdGNoIEVFUFJPTSB2YWx1ZQotLy8KLSNkZWZpbmUgTklDMzA5MF9QQ0llX0RFVklDRV9JRCAgMHgzMDkwCQkvLyAxVC8xUiBtaW5pQ2FyZAotI2RlZmluZSBOSUMzMDkxX1BDSWVfREVWSUNFX0lEICAweDMwOTEJCS8vIDFULzJSIG1pbmlDYXJkCi0jZGVmaW5lIE5JQzMwOTJfUENJZV9ERVZJQ0VfSUQgIDB4MzA5MgkJLy8gMlQvMlIgbWluaUNhcmQKLQotI2VuZGlmIC8vIFJUMzA5MCAvLwotCi0jZW5kaWYgLy9fX1JUMzA5MF9IX18gLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnQzMHh4LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0MzB4eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDk3MWEwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnQzMHh4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotCXJ0MzB4eC5oCi0KLSAgICBBYnN0cmFjdDoKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0jaWZuZGVmIF9fUlQzMFhYX0hfXwotI2RlZmluZSBfX1JUMzBYWF9IX18KLQotI2lmZGVmIFJUMzB4eAotCi0KLWV4dGVybiBSRUdfUEFJUiBSVDMweHhfUkZSZWdUYWJsZVtdOwotZXh0ZXJuIFVDSEFSIE5VTV9SRl9SRUdfUEFSTVM7Ci0KLSNlbmRpZiAvLyBSVDMweHggLy8KLQotI2VuZGlmIC8vX19SVDMwWFhfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0MzM3MC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydDMzNzAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZhOTAwNi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0MzM3MC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBydDMzNzAuaAotCi0gICAgQWJzdHJhY3Q6Ci0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotI2lmbmRlZiBfX1JUMzM3MF9IX18KLSNkZWZpbmUgX19SVDMzNzBfSF9fCi0KLSNpZmRlZiBSVDMzNzAKLQotCi0jZXJyb3IgIkZvciBSVDMwNzAsIHlvdSBzaG91bGQgZGVmaW5lIHRoZSBjb21waWxlIGZsYWcgLURSVE1QX1VTQl9TVVBQT1JUIgotCi0jZXJyb3IgIkZvciBSVDMwNzAsIHlvdSBzaG91bGQgZGVmaW5lIHRoZSBjb21waWxlIGZsYWcgLURSVE1QX01BQ19VU0IiCi0KLSNpZm5kZWYgUlRNUF9SRl9SV19TVVBQT1JUCi0jZXJyb3IgIkZvciBSVDMwNzAsIHlvdSBzaG91bGQgZGVmaW5lIHRoZSBjb21waWxlIGZsYWcgLURSVE1QX1JGX1JXX1NVUFBPUlQiCi0jZW5kaWYKLQotI2lmbmRlZiBSVDMzeHgKLSNlcnJvciAiRm9yIFJUMzA3MCwgeW91IHNob3VsZCBkZWZpbmUgdGhlIGNvbXBpbGUgZmxhZyAtRFJUMzB4eCIKLSNlbmRpZgotCi0jaW5jbHVkZSAibWFjX3VzYi5oIgotI2luY2x1ZGUgInJ0MzN4eC5oIgotCi0vLwotLy8gRGV2aWNlIElEICYgVmVuZG9yIElELCB0aGVzZSB2YWx1ZXMgc2hvdWxkIG1hdGNoIEVFUFJPTSB2YWx1ZQotLy8KLQotI2VuZGlmIC8vIFJUMzM3MCAvLwotCi0jZW5kaWYgLy9fX1JUMzM3MF9IX18gLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnQzMzkwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0MzM5MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTJhYjNkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnQzMzkwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIHJ0MzM5MC5oCi0KLSAgICBBYnN0cmFjdDoKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0jaWZuZGVmIF9fUlQzMzkwX0hfXwotI2RlZmluZSBfX1JUMzM5MF9IX18KLQotI2lmZGVmIFJUMzM5MAotCi0jaWZuZGVmIFJUTVBfUENJX1NVUFBPUlQKLSNlcnJvciAiRm9yIFJUMzM5MCwgeW91IHNob3VsZCBkZWZpbmUgdGhlIGNvbXBpbGUgZmxhZyAtRFJUTVBfUENJX1NVUFBPUlQiCi0jZW5kaWYKLQotI2lmbmRlZiBSVE1QX01BQ19QQ0kKLSNlcnJvciAiRm9yIFJUMzM5MCwgeW91IHNob3VsZCBkZWZpbmUgdGhlIGNvbXBpbGUgZmxhZyAtRFJUTVBfTUFDX1BDSSIKLSNlbmRpZgotCi0jaWZuZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotI2Vycm9yICJGb3IgUlQzMzkwLCB5b3Ugc2hvdWxkIGRlZmluZSB0aGUgY29tcGlsZSBmbGFnIC1EUlRNUF9SRl9SV19TVVBQT1JUIgotI2VuZGlmCi0KLSNpZm5kZWYgUlQzMHh4Ci0jZXJyb3IgIkZvciBSVDMzOTAsIHlvdSBzaG91bGQgZGVmaW5lIHRoZSBjb21waWxlIGZsYWcgLURSVDMweHgiCi0jZW5kaWYKLQotI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKLSNkZWZpbmUgVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVAotI2RlZmluZSBDQVJSSUVSX1NFTlNFX05FV19BTEdPCi0jZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLwotCi0jZGVmaW5lIFBDSUVfUFNfU1VQUE9SVAotCi0jaW5jbHVkZSAibWFjX3BjaS5oIgotI2luY2x1ZGUgInJ0MzN4eC5oIgotCi0vLwotLy8gRGV2aWNlIElEICYgVmVuZG9yIElELCB0aGVzZSB2YWx1ZXMgc2hvdWxkIG1hdGNoIEVFUFJPTSB2YWx1ZQotLy8KLSNkZWZpbmUgTklDMzM5MF9QQ0llX0RFVklDRV9JRCAgMHgzMDkwCQkvLyAxVC8xUiBtaW5pQ2FyZAotI2RlZmluZSBOSUMzMzkxX1BDSWVfREVWSUNFX0lEICAweDMwOTEJCS8vIDFULzJSIG1pbmlDYXJkCi0jZGVmaW5lIE5JQzMzOTJfUENJZV9ERVZJQ0VfSUQgIDB4MzA5MgkJLy8gMlQvMlIgbWluaUNhcmQKLQotI2VuZGlmIC8vIFJUMzM5MCAvLwotCi0jZW5kaWYgLy9fX1JUMzM5MF9IX18gLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnQzM3h4LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0MzN4eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWI5Mzg4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnQzM3h4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIHJ0MzN4eC5oCi0KLSAgICBBYnN0cmFjdDoKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0jaWZuZGVmIF9fUlQzM1hYX0hfXwotI2RlZmluZSBfX1JUMzNYWF9IX18KLQotI2lmZGVmIFJUMzN4eAotCi0KLWV4dGVybiBSRUdfUEFJUiBSRlJlZ1RhYmxlT3ZlclJUMzM5MFtdOwotZXh0ZXJuIFVDSEFSIE5VTV9SRl9SRUdfUEFSTVNfT1ZFUl9SVDMzOTA7Ci0KLSNlbmRpZiAvLyBSVDMzeHggLy8KLQotI2VuZGlmIC8vX19SVDMzWFhfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X2F0ZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydF9hdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU5YWFlNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X2F0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjA4OSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSAicnRfY29uZmlnLmgiCi0KLSNpZmRlZiBSQUxJTktfQVRFCi0KLSNpZmRlZiBSVDMweHgKLSNkZWZpbmUgQVRFX0JCUF9SRUdfTlVNCTE2OAotVUNIQVIgcmVzdG9yZV9CQlBbQVRFX0JCUF9SRUdfTlVNXT17MH07Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCi0KLS8vIDgwMi4xMSBNQUMgSGVhZGVyLCBUeXBlOkRhdGEsIExlbmd0aDoyNGJ5dGVzCi1VQ0hBUiBUZW1wbGF0ZUZyYW1lWzI0XSA9IHsweDA4LDB4MDAsMHgwMCwweDAwLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAotCQkweDAwLDB4QUEsMHhCQiwweDEyLDB4MzQsMHg1NiwweDAwLDB4MTEsMHgyMiwweEFBLDB4QkIsMHhDQywweDAwLDB4MDB9OwotCi1leHRlcm4gUlRNUF9SRl9SRUdTIFJGMjg1MFJlZ1RhYmxlW107Ci1leHRlcm4gVUNIQVIgTlVNX09GXzI4NTBfQ0hOTDsKLQotZXh0ZXJuIEZSRVFVRU5DWV9JVEVNIEZyZXFJdGVtczMwMjBbXTsKLWV4dGVybiBVQ0hBUiBOVU1fT0ZfMzAyMF9DSE5MOwotCi0KLQotCi1zdGF0aWMgQ0hBUiBDQ0tSYXRlVGFibGVbXSA9IHswLCAxLCAyLCAzLCA4LCA5LCAxMCwgMTEsIC0xfTsgLyogQ0NLIE1vZGUuICovCi1zdGF0aWMgQ0hBUiBPRkRNUmF0ZVRhYmxlW10gPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgLTF9OyAvKiBPRkRNIE1vZGUuICovCi1zdGF0aWMgQ0hBUiBIVE1JWFJhdGVUYWJsZVtdID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIC0xfTsgLyogSFQgTWl4IE1vZGUuICovCi0KLXN0YXRpYyBJTlQgVHhEbWFCdXN5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotc3RhdGljIElOVCBSeERtYUJ1c3koCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1zdGF0aWMgVk9JRCBSdG1wRG1hRW5hYmxlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIElOVCBFbmFibGUpOwotCi1zdGF0aWMgVk9JRCBCYnBTb2Z0UmVzZXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1zdGF0aWMgVk9JRCBSdG1wUmZJb1dyaXRlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotc3RhdGljIElOVCBBVEVTZXRVcEZyYW1lKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVJTlQzMiBUeElkeCk7Ci0KLXN0YXRpYyBJTlQgQVRFVHhQd3JIYW5kbGVyKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIGNoYXIgaW5kZXgpOwotCi1zdGF0aWMgSU5UIEFURUNtZEhhbmRsZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLSNpZm5kZWYgUlQzMHh4Ci1zdGF0aWMgaW50IENoZWNrTUNTVmFsaWQoCi0JSU4gVUNIQVIgTW9kZSwKLQlJTiBVQ0hBUiBNY3MpOwotI2VuZGlmIC8vIFJUMzB4eCAvLwotCi0jaWZkZWYgUlQzMHh4Ci1zdGF0aWMgaW50IENoZWNrTUNTVmFsaWQoCi0JSU4gVUNIQVIgTW9kZSwKLQlJTiBVQ0hBUiBNY3MsCi0JSU4gQk9PTEVBTiBiUlQyMDcwKTsKLSNlbmRpZiAvLyBSVDMweHggLy8KLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotc3RhdGljIFZPSUQgQVRFV3JpdGVUeFdJKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBUWFdJX1NUUlVDCXBPdXRUeFdJLAotCUlOCUJPT0xFQU4JCQlGUkFHLAotCUlOCUJPT0xFQU4JCQlDRkFDSywKLQlJTglCT09MRUFOCQkJSW5zVGltZXN0YW1wLAotCUlOCUJPT0xFQU4JCQlBTVBEVSwKLQlJTglCT09MRUFOCQkJQWNrLAotCUlOCUJPT0xFQU4JCQlOU2VxLAkJLy8gSFcgbmV3IGEgc2VxdWVuY2UuCi0JSU4JVUNIQVIJCQlCQVNpemUsCi0JSU4JVUNIQVIJCQlXQ0lELAotCUlOCVVMT05HCQkJTGVuZ3RoLAotCUlOCVVDSEFSCQkJUElELAotCUlOCVVDSEFSCQkJVElELAotCUlOCVVDSEFSCQkJVHhSYXRlLAotCUlOCVVDSEFSCQkJVHhvcG1vZGUsCi0JSU4JQk9PTEVBTgkJCUNmQWNrLAotCUlOCUhUVFJBTlNNSVRfU0VUVElORwkqcFRyYW5zbWl0KTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi1zdGF0aWMgVk9JRCBTZXRKYXBhbkZpbHRlcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLQotI2lmZGVmIFJBTElOS18yOHh4X1FBCi1zdGF0aWMgaW5saW5lIElOVAlET19SQUNGR19DTURfQVRFX1NUQVJUKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NUT1AoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9SRl9XUklURV9BTEwoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9FMlBST01fUkVBRDE2KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfRTJQUk9NX1dSSVRFMTYoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9FMlBST01fUkVBRF9BTEwKLSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0UyUFJPTV9XUklURV9BTEwoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9JT19SRUFEKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfSU9fV1JJVEUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9JT19SRUFEX0JVTEsoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9CQlBfUkVBRDgoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9CQlBfV1JJVEU4KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQkJQX1JFQURfQUxMKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfR0VUX05PSVNFX0xFVkVMKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfR0VUX0NPVU5URVIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9DTEVBUl9DT1VOVEVSKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfVFhfU1RBUlQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9HRVRfVFhfU1RBVFVTKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfVFhfU1RPUCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX1JYX1NUQVJUKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfUlhfU1RPUCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX1JYX1NUT1AoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ0FSUklFUigKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DT05UKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NUQVJUX1RYX0ZSQU1FKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NFVF9CVygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIwKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjEoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VUX0ZSRVFfT0ZGU0VUKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX0dFVF9TVEFUSVNUSUNTKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1JFU0VUX0NPVU5URVIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VMX1RYX0FOVEVOTkEoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VMX1JYX0FOVEVOTkEoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VUX1BSRUFNQkxFKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NFVF9DSEFOTkVMKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NFVF9BRERSMSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TRVRfQUREUjIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VUX0FERFIzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NFVF9SQVRFKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9MRU4oCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0NPVU5UKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NUQVJUX1JYX0ZSQU1FKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX0UyUFJPTV9SRUFEX0JVTEsoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfRTJQUk9NX1dSSVRFX0JVTEsoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfSU9fV1JJVEVfQlVMSygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9CQlBfUkVBRF9CVUxLKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX0JCUF9XUklURV9CVUxLKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLQotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi1zdGF0aWMgSU5UIFR4RG1hQnVzeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlJTlQgcmVzdWx0OwotCVdQRE1BX0dMT19DRkdfU1RSVUMgR2xvQ2ZnOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOwkvLyBkaXNhYmxlIERNQQotCWlmIChHbG9DZmcuZmllbGQuVHhETUFCdXN5KQotCQlyZXN1bHQgPSAxOwotCWVsc2UKLQkJcmVzdWx0ID0gMDsKLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotc3RhdGljIElOVCBSeERtYUJ1c3koCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JSU5UIHJlc3VsdDsKLQlXUERNQV9HTE9fQ0ZHX1NUUlVDIEdsb0NmZzsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsJLy8gZGlzYWJsZSBETUEKLQlpZiAoR2xvQ2ZnLmZpZWxkLlJ4RE1BQnVzeSkKLQkJcmVzdWx0ID0gMTsKLQllbHNlCi0JCXJlc3VsdCA9IDA7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLXN0YXRpYyBWT0lEIFJ0bXBEbWFFbmFibGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gSU5UIEVuYWJsZSkKLXsKLQlCT09MRUFOIHZhbHVlOwotCVVMT05HIFdhaXRDbnQ7Ci0JV1BETUFfR0xPX0NGR19TVFJVQyBHbG9DZmc7Ci0KLQl2YWx1ZSA9IEVuYWJsZSA+IDAgPyAxIDogMDsKLQotCS8vIGNoZWNrIERNQSBpcyBpbiBidXN5IG1vZGUuCi0JV2FpdENudCA9IDA7Ci0KLQl3aGlsZSAoVHhEbWFCdXN5KHBBZCkgfHwgUnhEbWFCdXN5KHBBZCkpCi0JewotCQlSVE1QdXNlY0RlbGF5KDEwKTsKLQkJaWYgKFdhaXRDbnQrKyA+IDEwMCkKLQkJCWJyZWFrOwotCX0KLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsJLy8gZGlzYWJsZSBETUEKLQlHbG9DZmcuZmllbGQuRW5hYmxlVHhETUEgPSB2YWx1ZTsKLQlHbG9DZmcuZmllbGQuRW5hYmxlUnhETUEgPSB2YWx1ZTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7CS8vIGFib3J0IGFsbCBUWCByaW5ncwotCVJUTVB1c2VjRGVsYXkoNTAwMCk7Ci0KLQlyZXR1cm47Ci19Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotCi0KLXN0YXRpYyBWT0lEIEJicFNvZnRSZXNldCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlVQ0hBUiBCYnBEYXRhID0gMDsKLQotCS8vIFNvZnQgcmVzZXQsIHNldCBCQlAgUjIxIGJpdDA9MS0+MAotCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMSwgJkJicERhdGEpOwotCUJicERhdGEgfD0gMHgwMDAwMDAwMTsgLy9zZXQgYml0MD0xCi0JQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMSwgQmJwRGF0YSk7Ci0KLQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjEsICZCYnBEYXRhKTsKLQlCYnBEYXRhICY9IH4oMHgwMDAwMDAwMSk7IC8vc2V0IGJpdDA9MAotCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjEsIEJicERhdGEpOwotCi0JcmV0dXJuOwotfQotCi0KLXN0YXRpYyBWT0lEIFJ0bXBSZklvV3JpdGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JLy8gU2V0IFJGIHZhbHVlIDEncyBzZXQgUjNbYml0Ml0gPSBbMF0KLQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKLQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKLQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCAocEFkLT5MYXRjaFJmUmVncy5SMyAmICh+MHgwNCkpKTsKLQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKLQotCVJUTVB1c2VjRGVsYXkoMjAwKTsKLQotCS8vIFNldCBSRiB2YWx1ZSAyJ3Mgc2V0IFIzW2JpdDJdID0gWzFdCi0JUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMSk7Ci0JUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMik7Ci0JUlRNUF9SRl9JT19XUklURTMyKHBBZCwgKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgfCAweDA0KSk7Ci0JUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SNCk7Ci0KLQlSVE1QdXNlY0RlbGF5KDIwMCk7Ci0KLQkvLyBTZXQgUkYgdmFsdWUgMydzIHNldCBSM1tiaXQyXSA9IFswXQotCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOwotCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOwotCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIChwQWQtPkxhdGNoUmZSZWdzLlIzICYgKH4weDA0KSkpOwotCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOwotCi0JcmV0dXJuOwotfQotCi0KLSNpZmRlZiBSVDMweHgKLXN0YXRpYyBpbnQgQ2hlY2tNQ1NWYWxpZCgKLQlVQ0hBUiBNb2RlLAotCVVDSEFSIE1jcywKLQlCT09MRUFOIGJSVDIwNzApCi0jZW5kaWYgLy8gUlQzMHh4IC8vCi0jaWZuZGVmIFJUMzB4eAotc3RhdGljIGludCBDaGVja01DU1ZhbGlkKAotCUlOIFVDSEFSIE1vZGUsCi0JSU4gVUNIQVIgTWNzKQotI2VuZGlmIC8vIFJUMzB4eCAvLwotewotCUlOVCBpOwotCVBDSEFSIHBSYXRlVGFiOwotCi0Jc3dpdGNoIChNb2RlKQotCXsKLQkJY2FzZSAwOgotCQkJcFJhdGVUYWIgPSBDQ0tSYXRlVGFibGU7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJcFJhdGVUYWIgPSBPRkRNUmF0ZVRhYmxlOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJY2FzZSAzOgotI2lmZGVmIFJUMzB4eAotCQkJaWYgKGJSVDIwNzApCi0JCQkJcFJhdGVUYWIgPSBPRkRNUmF0ZVRhYmxlOwotCQkJZWxzZQotI2VuZGlmIC8vIFJUMzB4eCAvLwotCQkJcFJhdGVUYWIgPSBIVE1JWFJhdGVUYWJsZTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgidW5yZWNvZ25pemFibGUgVHggTW9kZSAlZFxuIiwgTW9kZSkpOwotCQkJcmV0dXJuIC0xOwotCQkJYnJlYWs7Ci0JfQotCi0JaSA9IDA7Ci0Jd2hpbGUgKHBSYXRlVGFiW2ldICE9IC0xKQotCXsKLQkJaWYgKHBSYXRlVGFiW2ldID09IE1jcykKLQkJCXJldHVybiAwOwotCQlpKys7Ci0JfQotCi0JcmV0dXJuIC0xOwotfQotCi0KLXN0YXRpYyBJTlQgQVRFVHhQd3JIYW5kbGVyKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIGNoYXIgaW5kZXgpCi17Ci0JVUxPTkcgUjsKLQlDSEFSIFR4UG93ZXI7Ci0JVUNIQVIgQmJwOTQgPSAwOwotCUJPT0xFQU4gYlBvd2VyUmVkdWNlID0gRkFMU0U7Ci0jaWZkZWYgUlRNUF9SRl9SV19TVVBQT1JUCi0JVUNIQVIgUkZWYWx1ZTsKLSNlbmRpZiAvLyBSVE1QX1JGX1JXX1NVUFBPUlQgLy8KLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotCWlmICgocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSB8fCAocEFkLT5hdGUuYlFBUnhTdGFydCA9PSBUUlVFKSkKLQl7Ci0JCS8qCi0JCQlXaGVuIFFBIGlzIHVzZWQgZm9yIFR4LCBwQWQtPmF0ZS5UeFBvd2VyMC8xIGFuZCByZWFsIHR4IHBvd2VyCi0JCQlhcmUgbm90IHN5bmNocm9uaXplZC4KLQkJKi8KLQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UKLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotCXsKLQkJVHhQb3dlciA9IGluZGV4ID09IDAgPyBwQWQtPmF0ZS5UeFBvd2VyMCA6IHBBZC0+YXRlLlR4UG93ZXIxOwotCi0JCWlmIChwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQotCQl7Ci0JCQlpZiAoVHhQb3dlciA+IDMxKQotCQkJewotCi0JCQkJLy8gUjMsIFI0IGNhbid0IGxhcmdlIHRoYW4gMzEgKDB4MjQpLCAzMSB+IDM2IHVzZWQgYnkgQkJQIDk0Ci0JCQkJUiA9IDMxOwotCQkJCWlmIChUeFBvd2VyIDw9IDM2KQotCQkJCQlCYnA5NCA9IEJCUFI5NF9ERUZBVUxUICsgKFVDSEFSKShUeFBvd2VyIC0gMzEpOwotCQkJfQotCQkJZWxzZSBpZiAoVHhQb3dlciA8IDApCi0JCQl7Ci0KLQkJCQkvLyBSMywgUjQgY2FuJ3QgbGVzcyB0aGFuIDAsIC0xIH4gLTYgdXNlZCBieSBCQlAgOTQKLQkJCQlSID0gMDsKLQkJCQlpZiAoVHhQb3dlciA+PSAtNikKLQkJCQkJQmJwOTQgPSBCQlBSOTRfREVGQVVMVCArIFR4UG93ZXI7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gMCB+IDMxCi0JCQkJUiA9IChVTE9ORykgVHhQb3dlcjsKLQkJCQlCYnA5NCA9IEJCUFI5NF9ERUZBVUxUOwotCQkJfQotCi0JCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAoVHhQb3dlcj0lZCwgUj0lbGQsIEJCUF9SOTQ9JWQpXG4iLCBfX0ZVTkNUSU9OX18sIFR4UG93ZXIsIFIsIEJicDk0KSk7Ci0JCX0KLQkJZWxzZSAvKiA1LjUgR0h6ICovCi0JCXsKLQkJCWlmIChUeFBvd2VyID4gMTUpCi0JCQl7Ci0KLQkJCQkvLyBSMywgUjQgY2FuJ3QgbGFyZ2UgdGhhbiAxNSAoMHgwRikKLQkJCQlSID0gMTU7Ci0JCQl9Ci0JCQllbHNlIGlmIChUeFBvd2VyIDwgMCkKLQkJCXsKLQotCQkJCS8vIFIzLCBSNCBjYW4ndCBsZXNzIHRoYW4gMAotCQkJCS8vIC0xIH4gLTcKLQkJCQlBU1NFUlQoKFR4UG93ZXIgPj0gLTcpKTsKLQkJCQlSID0gKFVMT05HKShUeFBvd2VyICsgNyk7Ci0JCQkJYlBvd2VyUmVkdWNlID0gVFJVRTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyAwIH4gMTUKLQkJCQlSID0gKFVMT05HKSBUeFBvd2VyOwotCQkJfQotCi0JCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAoVHhQb3dlcj0lZCwgUj0lbHUpXG4iLCBfX0ZVTkNUSU9OX18sIFR4UG93ZXIsIFIpKTsKLQkJfQotLy8yMDA4LzA5LzEwOktIIGFkZHMgdG8gc3VwcG9ydCAzMDcwIEFURSBUWCBQb3dlciB0dW5uaW5nIHJlYWwgdGltZTwtLQotI2lmZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotCQlpZiAoSVNfUlQzMHh4KHBBZCkpCi0JCXsKLQkJCS8vIFNldCBUeCBQb3dlcgotCQkJQVRFX1JGX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIFJGX1IxMiwgKFBVQ0hBUikmUkZWYWx1ZSk7Ci0JCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAweEUwKSB8IFR4UG93ZXI7Ci0JCQlBVEVfUkZfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIFJGX1IxMiwgKFVDSEFSKVJGVmFsdWUpOwotCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiMzA3MCBvciAyMDcwOiVzIChUeFBvd2VyPSVkLCBSRlZhbHVlPSV4KVxuIiwgX19GVU5DVElPTl9fLCBUeFBvd2VyLCBSRlZhbHVlKSk7Ci0JCX0KLQkJZWxzZQotI2VuZGlmIC8vIFJUTVBfUkZfUldfU1VQUE9SVCAvLwotCQl7Ci0JCWlmIChwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQotCQl7Ci0JCQlpZiAoaW5kZXggPT0gMCkKLQkJCXsKLQkJCQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjMpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgotCQkJCVIgPSBSIDw8IDk7Ci0JCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SMyAmIDB4ZmZmZmMxZmYpOwotCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSBSOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSNCkgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCi0JCQkJUiA9IFIgPDwgNjsKLQkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlI0ICYgMHhmZmZmZjgzZik7Ci0JCQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IFI7Ci0JCQl9Ci0JCX0KLQkJZWxzZSAvKiA1LjVHSHogKi8KLQkJewotCQkJaWYgKGJQb3dlclJlZHVjZSA9PSBGQUxTRSkKLQkJCXsKLQkJCQlpZiAoaW5kZXggPT0gMCkKLQkJCQl7Ci0JCQkJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSMykgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCi0JCQkJCVIgPSAoUiA8PCAxMCkgfCAoMSA8PCA5KTsKLQkJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SMyAmIDB4ZmZmZmMxZmYpOwotCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gUjsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFI0KSByZWdpc3RlciBiaXQgcG9zaXRpb24KLQkJCQkJUiA9IChSIDw8IDcpIHwgKDEgPDwgNik7Ci0JCQkJCVIgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjQgJiAweGZmZmZmODNmKTsKLQkJCQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IFI7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmIChpbmRleCA9PSAwKQotCQkJCXsKLQkJCQkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFIzKSByZWdpc3RlciBiaXQgcG9zaXRpb24KLQkJCQkJUiA9IChSIDw8IDEwKTsKLQkJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SMyAmIDB4ZmZmZmMxZmYpOwotCi0JCQkJCS8qIENsZWFyIGJpdCA5IG9mIFIzIHRvIHJlZHVjZSA3ZEIuICovCi0JCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSAoUiAmICh+KDEgPDwgOSkpKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFI0KSByZWdpc3RlciBiaXQgcG9zaXRpb24KLQkJCQkJUiA9IChSIDw8IDcpOwotCQkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlI0ICYgMHhmZmZmZjgzZik7Ci0KLQkJCQkJLyogQ2xlYXIgYml0IDYgb2YgUjQgdG8gcmVkdWNlIDdkQi4gKi8KLQkJCQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IChSICYgKH4oMSA8PCA2KSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlSdG1wUmZJb1dyaXRlKHBBZCk7Ci0JfQotLy8yMDA4LzA5LzEwOktIIGFkZHMgdG8gc3VwcG9ydCAzMDcwIEFURSBUWCBQb3dlciB0dW5uaW5nIHJlYWwgdGltZS0tPgotCi0JCXJldHVybiAwOwotCX0KLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IEFURSBvcGVyYXRpb24gbW9kZSB0bwotICAgICAgICAwLiBBVEVTVEFSVCAgPSBTdGFydCBBVEUgTW9kZQotICAgICAgICAxLiBBVEVTVE9QICAgPSBTdG9wIEFURSBNb2RlCi0gICAgICAgIDIuIFRYQ09OVCAgICA9IENvbnRpbnVvdXMgVHJhbnNtaXQKLSAgICAgICAgMy4gVFhDQVJSICAgID0gVHJhbnNtaXQgQ2FycmllcgotICAgICAgICA0LiBUWEZSQU1FICAgPSBUcmFuc21pdCBGcmFtZXMKLSAgICAgICAgNS4gUlhGUkFNRSAgID0gUmVjZWl2ZSBGcmFtZXMKLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotICAgICAgICA2LiBUWFNUT1AgICAgPSBTdG9wIEFueSBUeXBlIG9mIFRyYW5zbWl0aW9uCi0gICAgICAgIDcuIFJYU1RPUCAgICA9IFN0b3AgUmVjZWl2aW5nIEZyYW1lcwotI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLXN0YXRpYyBJTlQJQVRFQ21kSGFuZGxlcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVJTlQzMgkJCVZhbHVlID0gMDsKLQlVQ0hBUgkJCUJicERhdGE7Ci0JVUlOVDMyCQkJTWFjRGF0YSA9IDA7Ci0JUFRYRF9TVFJVQwkJcFR4RDsKLQlJTlQJCQkJaW5kZXg7Ci0JVUlOVAkJCWkgPSAwLCBhdGVtb2RlID0gMDsKLQlQUlhEX1NUUlVDCQlwUnhEOwotCVBSVE1QX1RYX1JJTkcJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tRSURfQUNfQkVdOwotCU5ESVNfU1RBVFVTCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotI2lmZGVmCVJUX0JJR19FTkRJQU4KLSAgICBQVFhEX1NUUlVDICAgICAgcERlc3RUeEQ7Ci0gICAgVFhEX1NUUlVDICAgICAgIFR4RDsKLSNlbmRpZgotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBBVEVDbWRIYW5kbGVyKClcbiIpKTsKLQotCUFURUFzaWNTd2l0Y2hDaGFubmVsKHBBZCk7Ci0KLQkvKiBlbXB0eSBmdW5jdGlvbiAqLwotCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+YXRlLkNoYW5uZWwpOwotCi0JUlRNUHVzZWNEZWxheSg1MDAwKTsKLQotCS8vIHJlYWQgTUFDX1NZU19DVFJMIGFuZCBiYWNrdXAgTUFDX1NZU19DVFJMIHZhbHVlLgotCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmTWFjRGF0YSk7Ci0KLQkvLyBEZWZhdWx0IHZhbHVlIGluIEJCUCBSMjIgaXMgMHgwLgotCUJicERhdGEgPSAwOwotCi0JLy8gY2xlYW4gYml0NCB0byBzdG9wIGNvbnRpbnVvdXMgVHggcHJvZHVjdGlvbiB0ZXN0LgotCU1hY0RhdGEgJj0gMHhGRkZGRkZFRjsKLQotCS8vIEVudGVyIEFURSBtb2RlIGFuZCBzZXQgVHgvUnggSWRsZQotCWlmICghc3RyY21wKGFyZywgIkFURVNUQVJUIikpCi0JewotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEU6IEFURVNUQVJUXG4iKSk7Ci0KLSNpZiBkZWZpbmVkKExJTlVYKSB8fCBkZWZpbmVkKFZYV09SS1MpCi0JCS8vIGNoZWNrIGlmIHdlIGhhdmUgcmVtb3ZlZCB0aGUgZmlybXdhcmUKLQkJaWYgKCEoQVRFX09OKHBBZCkpKQotCQl7Ci0JCQlOSUNFcmFzZUZpcm13YXJlKHBBZCk7Ci0JCX0KLSNlbmRpZiAvLyBkZWZpbmVkKExJTlVYKSB8fCBkZWZpbmVkKFZYV09SS1MpIC8vCi0KLQkJYXRlbW9kZSA9IHBBZC0+YXRlLk1vZGU7Ci0JCXBBZC0+YXRlLk1vZGUgPSBBVEVfU1RBUlQ7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7Ci0KLQkJaWYgKGF0ZW1vZGUgPT0gQVRFX1RYQ0FSUikKLQkJewotCQkJLy8gTm8gQ2FycmllciBUZXN0IHNldCBCQlAgUjIyIGJpdDc9MCwgYml0Nj0wLCBiaXRbNX4wXT0weDAKLQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOwotCQkJQmJwRGF0YSAmPSAweEZGRkZGRjAwOyAvLyBjbGVhciBiaXQ3LCBiaXQ2LCBiaXRbNX4wXQotCQkgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7Ci0JCX0KLQkJZWxzZSBpZiAoYXRlbW9kZSA9PSBBVEVfVFhDQVJSU1VQUCkKLQkJewotCQkJLy8gTm8gQ29udC4gVFggc2V0IEJCUCBSMjIgYml0Nz0wCi0JCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKLQkJCUJicERhdGEgJj0gfigxIDw8IDcpOyAvLyBzZXQgYml0Nz0wCi0JCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKLQotCQkJLy8gTm8gQ2FycmllciBTdXBwcmVzc2lvbiBzZXQgQkJQIFIyNCBiaXQwPTAKLQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyNCwgJkJicERhdGEpOwotCQkJQmJwRGF0YSAmPSAweEZGRkZGRkZFOyAvLyBjbGVhciBiaXQwCi0JCSAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI0LCBCYnBEYXRhKTsKLQkJfQotCi0JCS8qCi0JCQlXZSBzaG91bGQgZnJlZSBzb21lIHJlc291cmNlIHdoaWNoIHdhcyBhbGxvY2F0ZWQKLQkJCXdoZW4gQVRFX1RYRlJBTUUgLCBBVEVfU1RPUCwgYW5kIEFURV9UWENPTlQuCi0JCSovCi0JCWVsc2UgaWYgKChhdGVtb2RlICYgQVRFX1RYRlJBTUUpIHx8IChhdGVtb2RlID09IEFURV9TVE9QKSkKLQkJewotCQkJUFJUTVBfVFhfUklORyBwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1FJRF9BQ19CRV07Ci0KLQkJCWlmIChhdGVtb2RlID09IEFURV9UWENPTlQpCi0JCQl7Ci0JCQkJLy8gTm8gQ29udC4gVFggc2V0IEJCUCBSMjIgYml0Nz0wCi0JCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7Ci0JCQkJQmJwRGF0YSAmPSB+KDEgPDwgNyk7IC8vIHNldCBiaXQ3PTAKLQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKLQkJCX0KLQotCQkJLy8gQWJvcnQgVHgsIFJ4IERNQS4KLQkJCVJ0bXBEbWFFbmFibGUocEFkLCAwKTsKLQkJCWZvciAoaT0wOyBpPFRYX1JJTkdfU0laRTsgaSsrKQotCQkJewotCQkJCVBORElTX1BBQ0tFVCAgcFBhY2tldDsKLQotI2lmbmRlZiBSVF9CSUdfRU5ESUFOCi0JCQkgICAgcFR4RCA9IChQVFhEX1NUUlVDKXBBZC0+VHhSaW5nW1FJRF9BQ19CRV0uQ2VsbFtpXS5BbGxvY1ZhOwotI2Vsc2UKLQkJCXBEZXN0VHhEID0gKFBUWERfU1RSVUMpcEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5DZWxsW2ldLkFsbG9jVmE7Ci0JCQlUeEQgPSAqcERlc3RUeEQ7Ci0JCQlwVHhEID0gJlR4RDsKLQkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOwotI2VuZGlmCi0JCQkJcFR4RC0+RE1BRE9ORSA9IDA7Ci0JCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbaV0ucE5kaXNQYWNrZXQ7Ci0KLQkJCQlpZiAocFBhY2tldCkKLQkJCQl7Ci0JCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQkJCQl9Ci0KLQkJCQkvLyBBbHdheXMgYXNzaWduIHBOZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKLQkJCQlwVHhSaW5nLT5DZWxsW2ldLnBOZGlzUGFja2V0ID0gTlVMTDsKLQotCQkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldDsKLQotCQkJCWlmIChwUGFja2V0KQotCQkJCXsKLQkJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgcFR4RC0+U0RMZW4xLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCQkJCX0KLQotCQkJCS8vIEFsd2F5cyBhc3NpZ24gcE5leHROZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKLQkJCQlwVHhSaW5nLT5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCQkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOwotCQkJCVdyaXRlQmFja1RvRGVzY3JpcHRvcigoUFVDSEFSKXBEZXN0VHhELCAoUFVDSEFSKXBUeEQsIEZBTFNFLCBUWVBFX1RYRCk7Ci0jZW5kaWYKLQkJCX0KLQotCQkJLy8gU3RhcnQgVHgsIFJYIERNQQotCQkJUnRtcERtYUVuYWJsZShwQWQsIDEpOwotCQl9Ci0KLQkJLy8gcmVzZXQgUnggc3RhdGlzdGljcy4KLQkJcEFkLT5hdGUuTGFzdFNOUjAgPSAwOwotCQlwQWQtPmF0ZS5MYXN0U05SMSA9IDA7Ci0JCXBBZC0+YXRlLkxhc3RSc3NpMCA9IDA7Ci0JCXBBZC0+YXRlLkxhc3RSc3NpMSA9IDA7Ci0JCXBBZC0+YXRlLkxhc3RSc3NpMiA9IDA7Ci0JCXBBZC0+YXRlLkF2Z1Jzc2kwID0gMDsKLQkJcEFkLT5hdGUuQXZnUnNzaTEgPSAwOwotCQlwQWQtPmF0ZS5BdmdSc3NpMiA9IDA7Ci0JCXBBZC0+YXRlLkF2Z1Jzc2kwWDggPSAwOwotCQlwQWQtPmF0ZS5BdmdSc3NpMVg4ID0gMDsKLQkJcEFkLT5hdGUuQXZnUnNzaTJYOCA9IDA7Ci0JCXBBZC0+YXRlLk51bU9mQXZnUnNzaVNhbXBsZSA9IDA7Ci0KLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotCQkvLyBUeCBmcmFtZQotCQlwQWQtPmF0ZS5iUUFUeFN0YXJ0ID0gRkFMU0U7Ci0JCXBBZC0+YXRlLmJRQVJ4U3RhcnQgPSBGQUxTRTsKLQkJcEFkLT5hdGUuc2VxID0gMDsKLQotCQkvLyBjb3VudGVycwotCQlwQWQtPmF0ZS5VMk0gPSAwOwotCQlwQWQtPmF0ZS5PdGhlckRhdGEgPSAwOwotCQlwQWQtPmF0ZS5CZWFjb24gPSAwOwotCQlwQWQtPmF0ZS5PdGhlckNvdW50ID0gMDsKLQkJcEFkLT5hdGUuVHhBYzAgPSAwOwotCQlwQWQtPmF0ZS5UeEFjMSA9IDA7Ci0JCXBBZC0+YXRlLlR4QWMyID0gMDsKLQkJcEFkLT5hdGUuVHhBYzMgPSAwOwotCQkvKnBBZC0+YXRlLlR4SENDQSA9IDA7Ki8KLQkJcEFkLT5hdGUuVHhNZ210ID0gMDsKLQkJcEFkLT5hdGUuUlNTSTAgPSAwOwotCQlwQWQtPmF0ZS5SU1NJMSA9IDA7Ci0JCXBBZC0+YXRlLlJTU0kyID0gMDsKLQkJcEFkLT5hdGUuU05SMCA9IDA7Ci0JCXBBZC0+YXRlLlNOUjEgPSAwOwotCi0JCS8vIGNvbnRyb2wKLQkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSAwOwotCQkvLyBUeFN0YXR1cyA6IDAgLS0+IHRhc2sgaXMgaWRsZSwgMSAtLT4gdGFzayBpcyBydW5uaW5nCi0JCXBBZC0+YXRlLlR4U3RhdHVzID0gMDsKLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotCi0JCS8vIFNvZnQgcmVzZXQgQkJQLgotCQlCYnBTb2Z0UmVzZXQocEFkKTsKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCS8qIExpbmtEb3duKCkgaGFzICJBc2ljRGlzYWJsZVN5bmMoKTsiIGFuZCAiUlRNUF9CQlBfSU9fUi9XOF9CWV9SRUdfSUQoKTsiIGluc2lkZS4gKi8KLS8vICAgICAgTGlua0Rvd24ocEFkLCBGQUxTRSk7Ci0vLwkJQXNpY0VuYWJsZUJzc1N5bmMocEFkKTsKLQotI2lmIGRlZmluZWQoTElOVVgpIHx8IGRlZmluZWQoVlhXT1JLUykKLQkJUlRNUF9PU19ORVRERVZfU1RPUF9RVUVVRShwQWQtPm5ldF9kZXYpOwotI2VuZGlmIC8vIGRlZmluZWQoTElOVVgpIHx8IGRlZmluZWQoVlhXT1JLUykgLy8KLQotCQkvKgotCQkJSWYgd2Ugc2tpcCAiTGlua0Rvd24oKSIsIHdlIHNob3VsZCBkaXNhYmxlIHByb3RlY3Rpb24KLQkJCXRvIHByZXZlbnQgZnJvbSBzZW5kaW5nIG91dCBSVFMgb3IgQ1RTLXRvLXNlbGYuCi0JCSovCi0JCUFURURpc2FibGVBc2ljUHJvdGVjdChwQWQpOwotCQlSVE1QU3RhdGlvblN0b3AocEFkKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCQkvKiBEaXNhYmxlIFR4ICovCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwotCQlWYWx1ZSAmPSB+KDEgPDwgMik7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOwotCi0JCS8qIERpc2FibGUgUnggKi8KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7Ci0JCVZhbHVlICY9IH4oMSA8PCAzKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7Ci0JfQotCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiQVRFU1RPUCIpKQotCXsKLQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBBVEVTVE9QXG4iKSk7Ci0KLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7Ci0KLQkJLy8gcmVjb3ZlciB0aGUgTUFDX1NZU19DVFJMIHJlZ2lzdGVyIGJhY2sKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBNYWNEYXRhKTsKLQotCQkvLyBkaXNhYmxlIFR4LCBSeAotCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKLQkJVmFsdWUgJj0gKDB4ZmZmZmZmZjMpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLQotCQkvLyBhYm9ydCBUeCwgUlggRE1BCi0JCVJ0bXBEbWFFbmFibGUocEFkLCAwKTsKLQotI2lmZGVmIExJTlVYCi0JCXBBZC0+YXRlLmJGV0xvYWRpbmcgPSBUUlVFOwotCi0JCVN0YXR1cyA9IE5JQ0xvYWRGaXJtd2FyZShwQWQpOwotCi0JCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTklDTG9hZEZpcm13YXJlIGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLCBTdGF0dXMpKTsKLQkJCXJldHVybiBGQUxTRTsKLQkJfQotI2VuZGlmIC8vIExJTlVYIC8vCi0JCXBBZC0+YXRlLk1vZGUgPSBBVEVfU1RPUDsKLQotCQkvKgotCQkJRXZlbiB0aGUgZmlybXdhcmUgaGFzIGJlZW4gbG9hZGVkLAotCQkJd2Ugc3RpbGwgY291bGQgdXNlIEFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKCkuCi0JCQlCdXQgdGhpcyBpcyBub3Qgc3VnZ2VzdGVkLgotCQkqLwotCQlCYnBTb2Z0UmVzZXQocEFkKTsKLQotCQlSVE1QX0FTSUNfSU5URVJSVVBUX0RJU0FCTEUocEFkKTsKLQotCQlOSUNJbml0aWFsaXplQWRhcHRlcihwQWQsIFRSVUUpOwotCi0JCS8qCi0JCQlSZWluaXRpYWxpemUgUnggUmluZyBiZWZvcmUgUnggRE1BIGlzIGVuYWJsZWQuCi0JCQk+Pj5SeENvaGVyZW50PDw8IHdhcyBnb25lICEKLQkJKi8KLQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgUlhfUklOR19TSVpFOyBpbmRleCsrKQotCQl7Ci0JCQlwUnhEID0gKFBSWERfU1RSVUMpIHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkFsbG9jVmE7Ci0JCQlwUnhELT5ERE9ORSA9IDA7Ci0JCX0KLQotCQkvLyBXZSBzaG91bGQgcmVhZCBFRVBST00gZm9yIGFsbCBjYXNlcy4KLQkJTklDUmVhZEVFUFJPTVBhcmFtZXRlcnMocEFkLCBOVUxMKTsKLQkJTklDSW5pdEFzaWNGcm9tRUVQUk9NKHBBZCk7Ci0KLQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0KLQkJLyogZW1wdHkgZnVuY3Rpb24gKi8KLQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0KLQkJLyogY2xlYXIgZ2FyYmFnZSBpbnRlcnJ1cHRzICovCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCAweGZmZmZmZmZmKTsKLQkJLyogRW5hYmxlIEludGVycnVwdCAqLwotCQlSVE1QX0FTSUNfSU5URVJSVVBUX0VOQUJMRShwQWQpOwotCi0JCS8qIHJlc3RvcmUgUlhfRklMVFJfQ0ZHICovCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJLyogcmVzdG9yZSBSWF9GSUxUUl9DRkcgZHVlIHRvIHRoYXQgUUEgbWF5YmUgc2V0IGl0IHRvIDB4MyAqLwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkJLy8gRW5hYmxlIFR4Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwotCQlWYWx1ZSB8PSAoMSA8PCAyKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7Ci0KLQkJLy8gRW5hYmxlIFR4LCBSeCBETUEuCi0JCVJ0bXBEbWFFbmFibGUocEFkLCAxKTsKLQotCQkvLyBFbmFibGUgUngKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7Ci0JCVZhbHVlIHw9ICgxIDw8IDMpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCVJUTVBTdGF0aW9uU3RhcnQocEFkKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2lmIGRlZmluZWQoTElOVVgpIHx8IGRlZmluZWQoVlhXT1JLUykKLQkJUlRNUF9PU19ORVRERVZfU1RBUlRfUVVFVUUocEFkLT5uZXRfZGV2KTsKLSNlbmRpZiAvLyBkZWZpbmVkKExJTlVYKSB8fCBkZWZpbmVkKFZYV09SS1MpIC8vCi0JfQotCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiVFhDQVJSIikpCi0JewotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEU6IFRYQ0FSUlxuIikpOwotCQlwQWQtPmF0ZS5Nb2RlID0gQVRFX1RYQ0FSUjsKLQotCQkvLyBRQSBoYXMgZG9uZSB0aGUgZm9sbG93aW5nIHN0ZXBzIGlmIGl0IGlzIHVzZWQuCi0JCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IEZBTFNFKQotCQl7Ci0JCQkvLyBTb2Z0IHJlc2V0IEJCUC4KLQkJCUJicFNvZnRSZXNldChwQWQpOwotCi0JCQkvLyBDYXJyaWVyIFRlc3Qgc2V0IEJCUCBSMjIgYml0Nz0xLCBiaXQ2PTEsIGJpdFs1fjBdPTB4MDEKLQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOwotCQkJQmJwRGF0YSAmPSAweEZGRkZGRjAwOyAvL2NsZWFyIGJpdDcsIGJpdDYsIGJpdFs1fjBdCi0JCQlCYnBEYXRhIHw9IDB4MDAwMDAwQzE7IC8vc2V0IGJpdDc9MSwgYml0Nj0xLCBiaXRbNX4wXT0weDAxCi0JCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKLQotCQkJLy8gc2V0IE1BQ19TWVNfQ1RSTCgweDEwMDQpIENvbnRpbnVvdXMgVHggUHJvZHVjdGlvbiBUZXN0IChiaXQ0KSA9IDEKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwotCQkJVmFsdWUgPSBWYWx1ZSB8IDB4MDAwMDAwMTA7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLQkJfQotCX0KLQllbHNlIGlmICghc3RyY21wKGFyZywgIlRYQ09OVCIpKQotCXsKLQkJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKLQkJewotCQkJLyoKLQkJCQlzZXQgTUFDX1NZU19DVFJMKDB4MTAwNCkgYml0NChDb250aW51b3VzIFR4IFByb2R1Y3Rpb24gVGVzdCkKLQkJCQlhbmQgYml0MihNQUMgVFggZW5hYmxlKSBiYWNrIHRvIHplcm8uCi0JCQkqLwotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZNYWNEYXRhKTsKLQkJCU1hY0RhdGEgJj0gMHhGRkZGRkZFQjsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7Ci0KLQkJCS8vIHNldCBCQlAgUjIyIGJpdDc9MAotCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7Ci0JCQlCYnBEYXRhICY9IDB4RkZGRkZGN0Y7IC8vc2V0IGJpdDc9MAotCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7Ci0JCX0KLQotCQkvKgotCQkJZm9yIFR4Q29udCBtb2RlLgotCQkJU3RlcCAxOiBTZW5kIDUwIHBhY2tldHMgZmlyc3QgdGhlbiB3YWl0IGZvciBhIG1vbWVudC4KLQkJCVN0ZXAgMjogU2VuZCBtb3JlIDUwIHBhY2tldCB0aGVuIHN0YXJ0IGNvbnRpbnVlIG1vZGUuCi0JCSovCi0JCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogVFhDT05UXG4iKSk7Ci0KLQkJLy8gU3RlcCAxOiBzZW5kIDUwIHBhY2tldHMgZmlyc3QuCi0JCXBBZC0+YXRlLk1vZGUgPSBBVEVfVFhDT05UOwotCQlwQWQtPmF0ZS5UeENvdW50ID0gNTA7Ci0KLQkJLyogRG8gaXQgYWZ0ZXIgVHgvUnggRE1BIGlzIGFib3J0ZWQuICovCi0vLwkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSAwOwotCi0JCS8vIFNvZnQgcmVzZXQgQkJQLgotCQlCYnBTb2Z0UmVzZXQocEFkKTsKLQotCQkvLyBBYm9ydCBUeCwgUlggRE1BLgotCQlSdG1wRG1hRW5hYmxlKHBBZCwgMCk7Ci0KLQkJLy8gRml4IGNhbid0IHNtb290aCBraWNrCi0JCXsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDAgKyBRSURfQUNfQkUgKiAweDEwLCAgJnBUeFJpbmctPlR4RG1hSWR4KTsKLQkJCXBUeFJpbmctPlR4U3dGcmVlSWR4ID0gcFR4UmluZy0+VHhEbWFJZHg7Ci0JCQlwVHhSaW5nLT5UeENwdUlkeCA9IHBUeFJpbmctPlR4RG1hSWR4OwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ1RYX0lEWDAgKyBRSURfQUNfQkUgKiAweDEwLCBwVHhSaW5nLT5UeENwdUlkeCk7Ci0JCX0KLQotCQlwQWQtPmF0ZS5UeERvbmVDb3VudCA9IDA7Ci0KLQkJLyogT25seSBuZWVkZWQgaWYgd2UgaGF2ZSB0byBzZW5kIHNvbWUgbm9ybWFsIGZyYW1lcy4gKi8KLQkJU2V0SmFwYW5GaWx0ZXIocEFkKTsKLQotCQlmb3IgKGkgPSAwOyAoaSA8IFRYX1JJTkdfU0laRS0xKSAmJiAoaSA8IHBBZC0+YXRlLlR4Q291bnQpOyBpKyspCi0JCXsKLQkJCVBORElTX1BBQ0tFVCBwUGFja2V0OwotCQkJVUlOVDMyIFR4SWR4ID0gcFR4UmluZy0+VHhDcHVJZHg7Ci0KLSNpZm5kZWYgUlRfQklHX0VORElBTgotCQkJcFR4RCA9IChQVFhEX1NUUlVDKXBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7Ci0jZWxzZQotCQkJcERlc3RUeEQgPSAoUFRYRF9TVFJVQylwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOwotCQkJVHhEID0gKnBEZXN0VHhEOwotCQkJcFR4RCA9ICZUeEQ7Ci0JCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLSNlbmRpZgotCQkJLy8gQ2xlYW4gY3VycmVudCBjZWxsLgotCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0OwotCi0JCQlpZiAocFBhY2tldCkKLQkJCXsKLQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIwLCBwVHhELT5TRExlbjAsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQkJCX0KLQotCQkJLy8gQWx3YXlzIGFzc2lnbiBwTmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCi0JCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldCA9IE5VTEw7Ci0KLQkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQ7Ci0KLQkJCWlmIChwUGFja2V0KQotCQkJewotCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCQkJfQotCi0JCQkvLyBBbHdheXMgYXNzaWduIHBOZXh0TmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCi0JCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCi0jaWZkZWYgUlRfQklHX0VORElBTgotCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0JCQlXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOwotI2VuZGlmCi0KLQkJCWlmIChBVEVTZXRVcEZyYW1lKHBBZCwgVHhJZHgpICE9IDApCi0JCQkJYnJlYWs7Ci0KLQkJCUlOQ19SSU5HX0lOREVYKHBUeFJpbmctPlR4Q3B1SWR4LCBUWF9SSU5HX1NJWkUpOwotCQl9Ci0KLQkJLy8gU2V0dXAgZnJhbWUgZm9ybWF0LgotCQlBVEVTZXRVcEZyYW1lKHBBZCwgcFR4UmluZy0+VHhDcHVJZHgpOwotCi0JCS8vIFN0YXJ0IFR4LCBSWCBETUEuCi0JCVJ0bXBEbWFFbmFibGUocEFkLCAxKTsKLQotCQkvLyBFbmFibGUgVHgKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7Ci0JCVZhbHVlIHw9ICgxIDw8IDIpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLQotCQkvLyBEaXNhYmxlIFJ4Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwotCQlWYWx1ZSAmPSB+KDEgPDwgMyk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOwotCi0jaWZkZWYgUkFMSU5LXzI4eHhfUUEKLQkJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKLQkJewotCQkJcEFkLT5hdGUuVHhTdGF0dXMgPSAxOwotCQl9Ci0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLQotCQkvLyBraWNrIFR4LVJpbmcKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ1RYX0lEWDAgKyBRSURfQUNfQkUgKiBSSU5HUkVHX0RJRkYsIHBBZC0+VHhSaW5nW1FJRF9BQ19CRV0uVHhDcHVJZHgpOwotCi0JCVJUTVB1c2VjRGVsYXkoNTAwMCk7Ci0KLQotCQkvLyBTdGVwIDI6IHNlbmQgbW9yZSA1MCBwYWNrZXRzIHRoZW4gc3RhcnQgY29udGludWUgbW9kZS4KLQkJLy8gQWJvcnQgVHgsIFJYIERNQS4KLQkJUnRtcERtYUVuYWJsZShwQWQsIDApOwotCi0JCS8vIENvbnQuIFRYIHNldCBCQlAgUjIyIGJpdDc9MQotCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKLQkJQmJwRGF0YSB8PSAweDAwMDAwMDgwOyAvL3NldCBiaXQ3PTEKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7Ci0KLQkJcEFkLT5hdGUuVHhDb3VudCA9IDUwOwotCi0JCS8vIEZpeCBjYW4ndCBzbW9vdGgga2ljawotCQl7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwICsgUUlEX0FDX0JFICogMHgxMCwgICZwVHhSaW5nLT5UeERtYUlkeCk7Ci0JCQlwVHhSaW5nLT5UeFN3RnJlZUlkeCA9IHBUeFJpbmctPlR4RG1hSWR4OwotCQkJcFR4UmluZy0+VHhDcHVJZHggPSBwVHhSaW5nLT5UeERtYUlkeDsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0NUWF9JRFgwICsgUUlEX0FDX0JFICogMHgxMCwgcFR4UmluZy0+VHhDcHVJZHgpOwotCQl9Ci0KLQkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSAwOwotCi0JCVNldEphcGFuRmlsdGVyKHBBZCk7Ci0KLQkJZm9yIChpID0gMDsgKGkgPCBUWF9SSU5HX1NJWkUtMSkgJiYgKGkgPCBwQWQtPmF0ZS5UeENvdW50KTsgaSsrKQotCQl7Ci0JCQlQTkRJU19QQUNLRVQgcFBhY2tldDsKLQkJCVVJTlQzMiBUeElkeCA9IHBUeFJpbmctPlR4Q3B1SWR4OwotCi0jaWZuZGVmIFJUX0JJR19FTkRJQU4KLQkJCXBUeEQgPSAoUFRYRF9TVFJVQylwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOwotI2Vsc2UKLQkJCXBEZXN0VHhEID0gKFBUWERfU1RSVUMpcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKLQkJCVR4RCA9ICpwRGVzdFR4RDsKLQkJCXBUeEQgPSAmVHhEOwotCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0jZW5kaWYKLQkJCS8vIGNsZWFuIGN1cnJlbnQgY2VsbC4KLQkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldDsKLQotCQkJaWYgKHBQYWNrZXQpCi0JCQl7Ci0JCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMCwgcFR4RC0+U0RMZW4wLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCQl9Ci0KLQkJCS8vIEFsd2F5cyBhc3NpZ24gcE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgotCQkJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQgPSBOVUxMOwotCi0JCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0OwotCi0JCQlpZiAocFBhY2tldCkKLQkJCXsKLQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQkJCX0KLQotCQkJLy8gQWx3YXlzIGFzc2lnbiBwTmV4dE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgotCQkJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOwotCQkJV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKLSNlbmRpZgotCi0JCQlpZiAoQVRFU2V0VXBGcmFtZShwQWQsIFR4SWR4KSAhPSAwKQotCQkJCWJyZWFrOwotCi0JCQlJTkNfUklOR19JTkRFWChwVHhSaW5nLT5UeENwdUlkeCwgVFhfUklOR19TSVpFKTsKLQkJfQotCi0JCUFURVNldFVwRnJhbWUocEFkLCBwVHhSaW5nLT5UeENwdUlkeCk7Ci0KLQkJLy8gU3RhcnQgVHgsIFJYIERNQS4KLQkJUnRtcERtYUVuYWJsZShwQWQsIDEpOwotCi0JCS8vIEVuYWJsZSBUeAotCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKLQkJVmFsdWUgfD0gKDEgPDwgMik7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOwotCi0JCS8vIERpc2FibGUgUngKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7Ci0JCVZhbHVlICY9IH4oMSA8PCAzKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7Ci0KLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotCQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQotCQl7Ci0JCQlwQWQtPmF0ZS5UeFN0YXR1cyA9IDE7Ci0JCX0KLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotCi0JCS8vIGtpY2sgVHgtUmluZy4KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ1RYX0lEWDAgKyBRSURfQUNfQkUgKiBSSU5HUkVHX0RJRkYsIHBBZC0+VHhSaW5nW1FJRF9BQ19CRV0uVHhDcHVJZHgpOwotCi0JCVJUTVB1c2VjRGVsYXkoNTAwKTsKLQotCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJk1hY0RhdGEpOwotCQlNYWNEYXRhIHw9IDB4MDAwMDAwMTA7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7Ci0JfQotCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiVFhGUkFNRSIpKQotCXsKLQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBUWEZSQU1FKENvdW50PSVkKVxuIiwgcEFkLT5hdGUuVHhDb3VudCkpOwotCQlwQWQtPmF0ZS5Nb2RlIHw9IEFURV9UWEZSQU1FOwotCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKLQotCQkvLyBTb2Z0IHJlc2V0IEJCUC4KLQkJQmJwU29mdFJlc2V0KHBBZCk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7Ci0KLQkJLy8gQWJvcnQgVHgsIFJYIERNQS4KLQkJUnRtcERtYUVuYWJsZShwQWQsIDApOwotCi0JCS8vIEZpeCBjYW4ndCBzbW9vdGgga2ljawotCQl7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwICsgUUlEX0FDX0JFICogMHgxMCwgICZwVHhSaW5nLT5UeERtYUlkeCk7Ci0JCQlwVHhSaW5nLT5UeFN3RnJlZUlkeCA9IHBUeFJpbmctPlR4RG1hSWR4OwotCQkJcFR4UmluZy0+VHhDcHVJZHggPSBwVHhSaW5nLT5UeERtYUlkeDsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0NUWF9JRFgwICsgUUlEX0FDX0JFICogMHgxMCwgcFR4UmluZy0+VHhDcHVJZHgpOwotCQl9Ci0KLQkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSAwOwotCi0JCVNldEphcGFuRmlsdGVyKHBBZCk7Ci0KLQkJZm9yIChpID0gMDsgKGkgPCBUWF9SSU5HX1NJWkUtMSkgJiYgKGkgPCBwQWQtPmF0ZS5UeENvdW50KTsgaSsrKQotCQl7Ci0JCQlQTkRJU19QQUNLRVQgcFBhY2tldDsKLQkJCVVJTlQzMiBUeElkeCA9IHBUeFJpbmctPlR4Q3B1SWR4OwotCi0jaWZuZGVmIFJUX0JJR19FTkRJQU4KLQkJCXBUeEQgPSAoUFRYRF9TVFJVQylwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOwotI2Vsc2UKLQkJCXBEZXN0VHhEID0gKFBUWERfU1RSVUMpcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKLQkJCVR4RCA9ICpwRGVzdFR4RDsKLQkJCXBUeEQgPSAmVHhEOwotCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0jZW5kaWYKLQkJCS8vIENsZWFuIGN1cnJlbnQgY2VsbC4KLQkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldDsKLQotCQkJaWYgKHBQYWNrZXQpCi0JCQl7Ci0JCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMCwgcFR4RC0+U0RMZW4wLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCQl9Ci0KLQkJCS8vIEFsd2F5cyBhc3NpZ24gcE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgotCQkJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQgPSBOVUxMOwotCi0JCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0OwotCi0JCQlpZiAocFBhY2tldCkKLQkJCXsKLQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQkJCX0KLQotCQkJLy8gQWx3YXlzIGFzc2lnbiBwTmV4dE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgotCQkJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOwotCQkJV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKLSNlbmRpZgotCi0JCQlpZiAoQVRFU2V0VXBGcmFtZShwQWQsIFR4SWR4KSAhPSAwKQotCQkJCWJyZWFrOwotCi0JCQlJTkNfUklOR19JTkRFWChwVHhSaW5nLT5UeENwdUlkeCwgVFhfUklOR19TSVpFKTsKLQotCQl9Ci0KLQkJQVRFU2V0VXBGcmFtZShwQWQsIHBUeFJpbmctPlR4Q3B1SWR4KTsKLQotCQkvLyBTdGFydCBUeCwgUnggRE1BLgotCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7Ci0KLQkJLy8gRW5hYmxlIFR4Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwotCQlWYWx1ZSB8PSAoMSA8PCAyKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7Ci0KLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotCQkvLyBhZGQgdGhpcyBmb3IgTG9vcEJhY2sgbW9kZQotCQlpZiAocEFkLT5hdGUuYlFBUnhTdGFydCA9PSBGQUxTRSkKLQkJewotCQkJLy8gRGlzYWJsZSBSeAotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7Ci0JCQlWYWx1ZSAmPSB+KDEgPDwgMyk7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLQkJfQotCi0JCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCi0JCXsKLQkJCXBBZC0+YXRlLlR4U3RhdHVzID0gMTsKLQkJfQotI2Vsc2UKLQkJLy8gRGlzYWJsZSBSeAotCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKLQkJVmFsdWUgJj0gfigxIDw8IDMpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDAgKyBRSURfQUNfQkUgKiBSSU5HUkVHX0RJRkYsICZwQWQtPlR4UmluZ1tRSURfQUNfQkVdLlR4RG1hSWR4KTsKLQkJLy8ga2ljayBUeC1SaW5nLgotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFFJRF9BQ19CRSAqIFJJTkdSRUdfRElGRiwgcEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5UeENwdUlkeCk7Ci0KLQkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOwotCX0KLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiVFhTVE9QIikpCi0JewotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEU6IFRYU1RPUFxuIikpOwotCQlhdGVtb2RlID0gcEFkLT5hdGUuTW9kZTsKLQkJcEFkLT5hdGUuTW9kZSAmPSBBVEVfVFhTVE9QOwotCQlwQWQtPmF0ZS5iUUFUeFN0YXJ0ID0gRkFMU0U7Ci0vLwkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSBwQWQtPmF0ZS5UeENvdW50OwotCi0JCWlmIChhdGVtb2RlID09IEFURV9UWENBUlIpCi0JCXsKLQkJCS8vIE5vIENhcnJpZXIgVGVzdCBzZXQgQkJQIFIyMiBiaXQ3PTAsIGJpdDY9MCwgYml0WzV+MF09MHgwCi0JCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKLQkJCUJicERhdGEgJj0gMHhGRkZGRkYwMDsgLy9jbGVhciBiaXQ3LCBiaXQ2LCBiaXRbNX4wXQotCQkgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7Ci0JCX0KLQkJZWxzZSBpZiAoYXRlbW9kZSA9PSBBVEVfVFhDQVJSU1VQUCkKLQkJewotCQkJLy8gTm8gQ29udC4gVFggc2V0IEJCUCBSMjIgYml0Nz0wCi0JCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKLQkJCUJicERhdGEgJj0gfigxIDw8IDcpOyAvL3NldCBiaXQ3PTAKLQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOwotCi0JCQkvLyBObyBDYXJyaWVyIFN1cHByZXNzaW9uIHNldCBCQlAgUjI0IGJpdDA9MAotCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI0LCAmQmJwRGF0YSk7Ci0JCQlCYnBEYXRhICY9IDB4RkZGRkZGRkU7IC8vY2xlYXIgYml0MAotCQkgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNCwgQmJwRGF0YSk7Ci0JCX0KLQotCQkvKgotCQkJV2Ugc2hvdWxkIGZyZWUgc29tZSByZXNvdXJjZSB3aGljaCB3YXMgYWxsb2NhdGVkCi0JCQl3aGVuIEFURV9UWEZSQU1FLCBBVEVfU1RPUCwgYW5kIEFURV9UWENPTlQuCi0JCSovCi0JCWVsc2UgaWYgKChhdGVtb2RlICYgQVRFX1RYRlJBTUUpIHx8IChhdGVtb2RlID09IEFURV9TVE9QKSkKLQkJewotCQkJUFJUTVBfVFhfUklORyBwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1FJRF9BQ19CRV07Ci0KLQkJCWlmIChhdGVtb2RlID09IEFURV9UWENPTlQpCi0JCQl7Ci0JCQkJLy8gTm8gQ29udC4gVFggc2V0IEJCUCBSMjIgYml0Nz0wCi0JCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7Ci0JCQkJQmJwRGF0YSAmPSB+KDEgPDwgNyk7IC8vc2V0IGJpdDc9MAotCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOwotCQkJfQotCi0JCQkvLyBBYm9ydCBUeCwgUnggRE1BLgotCQkJUnRtcERtYUVuYWJsZShwQWQsIDApOwotCi0JCQlmb3IgKGk9MDsgaTxUWF9SSU5HX1NJWkU7IGkrKykKLQkJCXsKLQkJCQlQTkRJU19QQUNLRVQgIHBQYWNrZXQ7Ci0KLSNpZm5kZWYgUlRfQklHX0VORElBTgotCQkJICAgIHBUeEQgPSAoUFRYRF9TVFJVQylwQWQtPlR4UmluZ1tRSURfQUNfQkVdLkNlbGxbaV0uQWxsb2NWYTsKLSNlbHNlCi0JCQlwRGVzdFR4RCA9IChQVFhEX1NUUlVDKXBBZC0+VHhSaW5nW1FJRF9BQ19CRV0uQ2VsbFtpXS5BbGxvY1ZhOwotCQkJVHhEID0gKnBEZXN0VHhEOwotCQkJcFR4RCA9ICZUeEQ7Ci0JCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLSNlbmRpZgotCQkJCXBUeEQtPkRNQURPTkUgPSAwOwotCQkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW2ldLnBOZGlzUGFja2V0OwotCi0JCQkJaWYgKHBQYWNrZXQpCi0JCQkJewotCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIwLCBwVHhELT5TRExlbjAsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCQkJfQotCi0JCQkJLy8gQWx3YXlzIGFzc2lnbiBwTmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCi0JCQkJcFR4UmluZy0+Q2VsbFtpXS5wTmRpc1BhY2tldCA9IE5VTEw7Ci0KLQkJCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQ7Ci0KLQkJCQlpZiAocFBhY2tldCkKLQkJCQl7Ci0JCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQkJCQl9Ci0KLQkJCQkvLyBBbHdheXMgYXNzaWduIHBOZXh0TmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCi0JCQkJcFR4UmluZy0+Q2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQkJCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLQkJCQlXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOwotI2VuZGlmCi0JCQl9Ci0JCQkvLyBFbmFibGUgVHgsIFJ4IERNQQotCQkJUnRtcERtYUVuYWJsZShwQWQsIDEpOwotCi0JCX0KLQotCQkvLyBUeFN0YXR1cyA6IDAgLS0+IHRhc2sgaXMgaWRsZSwgMSAtLT4gdGFzayBpcyBydW5uaW5nCi0JCXBBZC0+YXRlLlR4U3RhdHVzID0gMDsKLQotCQkvLyBTb2Z0IHJlc2V0IEJCUC4KLQkJQmJwU29mdFJlc2V0KHBBZCk7Ci0KLQkJLy8gRGlzYWJsZSBUeAotCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKLQkJVmFsdWUgJj0gfigxIDw8IDIpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNtcChhcmcsICJSWFNUT1AiKSkKLQl7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogUlhTVE9QXG4iKSk7Ci0JCWF0ZW1vZGUgPSBwQWQtPmF0ZS5Nb2RlOwotCQlwQWQtPmF0ZS5Nb2RlICY9IEFURV9SWFNUT1A7Ci0JCXBBZC0+YXRlLmJRQVJ4U3RhcnQgPSBGQUxTRTsKLS8vCQlwQWQtPmF0ZS5UeERvbmVDb3VudCA9IHBBZC0+YXRlLlR4Q291bnQ7Ci0KLQkJaWYgKGF0ZW1vZGUgPT0gQVRFX1RYQ0FSUikKLQkJewotCQkJOwotCQl9Ci0JCWVsc2UgaWYgKGF0ZW1vZGUgPT0gQVRFX1RYQ0FSUlNVUFApCi0JCXsKLQkJCTsKLQkJfQotCi0JCS8qCi0JCQlXZSBzaG91bGQgZnJlZSBzb21lIHJlc291cmNlIHdoaWNoIHdhcyBhbGxvY2F0ZWQKLQkJCXdoZW4gQVRFX1RYRlJBTUUsIEFURV9TVE9QLCBhbmQgQVRFX1RYQ09OVC4KLQkJKi8KLQkJZWxzZSBpZiAoKGF0ZW1vZGUgJiBBVEVfVFhGUkFNRSkgfHwgKGF0ZW1vZGUgPT0gQVRFX1NUT1ApKQotCQl7Ci0JCQlpZiAoYXRlbW9kZSA9PSBBVEVfVFhDT05UKQotCQkJewotCQkJCTsKLQkJCX0KLQkJfQotCi0JCS8vIFNvZnQgcmVzZXQgQkJQLgotCQlCYnBTb2Z0UmVzZXQocEFkKTsKLQotCQkvLyBEaXNhYmxlIFJ4Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwotCQlWYWx1ZSAmPSB+KDEgPDwgMyk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOwotCX0KLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiUlhGUkFNRSIpKQotCXsKLQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBSWEZSQU1FXG4iKSk7Ci0KLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7Ci0KLQkJcEFkLT5hdGUuTW9kZSB8PSBBVEVfUlhGUkFNRTsKLQotCQkvLyBEaXNhYmxlIFR4IG9mIE1BQyBibG9jay4KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7Ci0JCVZhbHVlICY9IH4oMSA8PCAyKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7Ci0KLQkJLy8gRW5hYmxlIFJ4IG9mIE1BQyBibG9jay4KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7Ci0JCVZhbHVlIHw9ICgxIDw8IDMpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLQl9Ci0JZWxzZQotCXsKLQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBJbnZhbGlkIGFyZyFcbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQlSVE1QdXNlY0RlbGF5KDUwMDApOwotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBBVEVDbWRIYW5kbGVyKClcbiIpKTsKLQotCXJldHVybiBUUlVFOwotfQotLyo9PT09PT09PT09PT09PT09PT09PT09PUVuZCBvZiBSVE1QX01BQ19QQ0kgPT09PT09PT09PT09PT09PT09PT09PT0qLwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0KLQotCi1JTlQJU2V0X0FURV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JaWYgKEFURUNtZEhhbmRsZXIocEFkLCBhcmcpKQotCXsKLQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1Byb2MgU3VjY2Vzc1xuIikpOwotCi0KLQkJcmV0dXJuIFRSVUU7Ci0JfQotCWVsc2UKLQl7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9Qcm9jIEZhaWxlZFxuIikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgQVRFIEFERFIxPURBIGZvciBUeEZyYW1lKEFQICA6IFRvIERTID0gMCA7IEZyb20gRFMgPSAxKQotICAgICAgICBvcgotICAgICAgICBTZXQgQVRFIEFERFIzPURBIGZvciBUeEZyYW1lKFNUQSA6IFRvIERTID0gMSA7IEZyb20gRFMgPSAwKQotCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfQVRFX0RBX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlQU1RSSU5HCQkJCXZhbHVlOwotCUlOVAkJCQkJaTsKLQotCS8vIE1hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNwotCWlmIChzdHJsZW4oYXJnKSAhPSAxNykKLQkJcmV0dXJuIEZBTFNFOwotCi0gICAgZm9yIChpID0gMCwgdmFsdWUgPSByc3RydG9rKGFyZywgIjoiKTsgdmFsdWU7IHZhbHVlID0gcnN0cnRvayhOVUxMLCAiOiIpKQotCXsKLQkJLyogc2FuaXR5IGNoZWNrICovCi0JCWlmICgoc3RybGVuKHZhbHVlKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp2YWx1ZSkpIHx8ICghaXN4ZGlnaXQoKih2YWx1ZSsxKSkpKQotCQl7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlBdG9IKHZhbHVlLCAmcEFkLT5hdGUuQWRkcjNbaSsrXSwgMSk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JfQotCi0JLyogc2FuaXR5IGNoZWNrICovCi0JaWYgKGkgIT0gNikKLQl7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX0RBX1Byb2MgKERBID0gJTJYOiUyWDolMlg6JTJYOiUyWDolMlgpXG4iLCBwQWQtPmF0ZS5BZGRyM1swXSwKLQkJcEFkLT5hdGUuQWRkcjNbMV0sIHBBZC0+YXRlLkFkZHIzWzJdLCBwQWQtPmF0ZS5BZGRyM1szXSwgcEFkLT5hdGUuQWRkcjNbNF0sIHBBZC0+YXRlLkFkZHIzWzVdKSk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfREFfUHJvYyBTdWNjZXNzXG4iKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IEFURSBBRERSMz1TQSBmb3IgVHhGcmFtZShBUCAgOiBUbyBEUyA9IDAgOyBGcm9tIERTID0gMSkKLSAgICAgICAgb3IKLSAgICAgICAgU2V0IEFURSBBRERSMj1TQSBmb3IgVHhGcmFtZShTVEEgOiBUbyBEUyA9IDEgOyBGcm9tIERTID0gMCkKLQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X0FURV9TQV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JUFNUUklORwkJCQl2YWx1ZTsKLQlJTlQJCQkJCWk7Ci0KLQkvLyBNYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcKLQlpZiAoc3RybGVuKGFyZykgIT0gMTcpCi0JCXJldHVybiBGQUxTRTsKLQotICAgIGZvciAoaT0wLCB2YWx1ZSA9IHJzdHJ0b2soYXJnLCAiOiIpOyB2YWx1ZTsgdmFsdWUgPSByc3RydG9rKE5VTEwsICI6IikpCi0JewotCQkvKiBzYW5pdHkgY2hlY2sgKi8KLQkJaWYgKChzdHJsZW4odmFsdWUpICE9IDIpIHx8ICghaXN4ZGlnaXQoKnZhbHVlKSkgfHwgKCFpc3hkaWdpdCgqKHZhbHVlKzEpKSkpCi0JCXsKLQkJCXJldHVybiBGQUxTRTsKLQkJfQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUF0b0godmFsdWUsICZwQWQtPmF0ZS5BZGRyMltpKytdLCAxKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQl9Ci0KLQkvKiBzYW5pdHkgY2hlY2sgKi8KLQlpZiAoaSAhPSA2KQotCXsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfU0FfUHJvYyAoU0EgPSAlMlg6JTJYOiUyWDolMlg6JTJYOiUyWClcbiIsIHBBZC0+YXRlLkFkZHIyWzBdLAotCQlwQWQtPmF0ZS5BZGRyMlsxXSwgcEFkLT5hdGUuQWRkcjJbMl0sIHBBZC0+YXRlLkFkZHIyWzNdLCBwQWQtPmF0ZS5BZGRyMls0XSwgcEFkLT5hdGUuQWRkcjJbNV0pKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9TQV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgQVRFIEFERFIyPUJTU0lEIGZvciBUeEZyYW1lKEFQICA6IFRvIERTID0gMCA7IEZyb20gRFMgPSAxKQotICAgICAgICBvcgotICAgICAgICBTZXQgQVRFIEFERFIxPUJTU0lEIGZvciBUeEZyYW1lKFNUQSA6IFRvIERTID0gMSA7IEZyb20gRFMgPSAwKQotCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfQVRFX0JTU0lEX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlQU1RSSU5HCQkJCXZhbHVlOwotCUlOVAkJCQkJaTsKLQotCS8vIE1hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNwotCWlmIChzdHJsZW4oYXJnKSAhPSAxNykKLQkJcmV0dXJuIEZBTFNFOwotCi0gICAgZm9yIChpPTAsIHZhbHVlID0gcnN0cnRvayhhcmcsICI6Iik7IHZhbHVlOyB2YWx1ZSA9IHJzdHJ0b2soTlVMTCwgIjoiKSkKLQl7Ci0JCS8qIHNhbml0eSBjaGVjayAqLwotCQlpZiAoKHN0cmxlbih2YWx1ZSkgIT0gMikgfHwgKCFpc3hkaWdpdCgqdmFsdWUpKSB8fCAoIWlzeGRpZ2l0KCoodmFsdWUrMSkpKSkKLQkJewotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJQXRvSCh2YWx1ZSwgJnBBZC0+YXRlLkFkZHIxW2krK10sIDEpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCX0KLQotCS8qIHNhbml0eSBjaGVjayAqLwotCWlmKGkgIT0gNikKLQl7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX0JTU0lEX1Byb2MgKEJTU0lEID0gJTJYOiUyWDolMlg6JTJYOiUyWDolMlgpXG4iLAlwQWQtPmF0ZS5BZGRyMVswXSwKLQkJcEFkLT5hdGUuQWRkcjFbMV0sIHBBZC0+YXRlLkFkZHIxWzJdLCBwQWQtPmF0ZS5BZGRyMVszXSwgcEFkLT5hdGUuQWRkcjFbNF0sIHBBZC0+YXRlLkFkZHIxWzVdKSk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfQlNTSURfUHJvYyBTdWNjZXNzXG4iKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IEFURSBUeCBDaGFubmVsCi0KLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9BVEVfQ0hBTk5FTF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUNIQVIgY2hhbm5lbDsKLQotCWNoYW5uZWwgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JLy8gdG8gYWxsb3cgQSBiYW5kIGNoYW5uZWwgOiAoKGNoYW5uZWwgPCAxKSB8fCAoY2hhbm5lbCA+IDE0KSkKLQlpZiAoKGNoYW5uZWwgPCAxKSB8fCAoY2hhbm5lbCA+IDIxNikpCi0JewotCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX0NIQU5ORUxfUHJvYzo6T3V0IG9mIHJhbmdlLCBpdCBzaG91bGQgYmUgaW4gcmFuZ2Ugb2YgMX4xNC5cbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQlwQWQtPmF0ZS5DaGFubmVsID0gY2hhbm5lbDsKLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfQ0hBTk5FTF9Qcm9jIChBVEUgQ2hhbm5lbCA9ICVkKVxuIiwgcEFkLT5hdGUuQ2hhbm5lbCkpOwotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9DSEFOTkVMX1Byb2MgU3VjY2Vzc1xuIikpOwotCi0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IEFURSBUeCBQb3dlcjAKLQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X0FURV9UWF9QT1dFUjBfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCUNIQVIgVHhQb3dlcjsKLQotCVR4UG93ZXIgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCi0JewotCQlpZiAoKFR4UG93ZXIgPiAzMSkgfHwgKFR4UG93ZXIgPCAwKSkKLQkJewotCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9QT1dFUjBfUHJvYzo6T3V0IG9mIHJhbmdlIChWYWx1ZT0lZClcbiIsIFR4UG93ZXIpKTsKLQkJCXJldHVybiBGQUxTRTsKLQkJfQotCX0KLQllbHNlLyogNS41IEdIeiAqLwotCXsKLQkJaWYgKChUeFBvd2VyID4gMTUpIHx8IChUeFBvd2VyIDwgLTcpKQotCQl7Ci0JCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jOjpPdXQgb2YgcmFuZ2UgKFZhbHVlPSVkKVxuIiwgVHhQb3dlcikpOwotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0JfQotCi0JcEFkLT5hdGUuVHhQb3dlcjAgPSBUeFBvd2VyOwotCUFURVR4UHdySGFuZGxlcihwQWQsIDApOwotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9QT1dFUjBfUHJvYyBTdWNjZXNzXG4iKSk7Ci0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgQVRFIFR4IFBvd2VyMQotCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JQ0hBUiBUeFBvd2VyOwotCi0JVHhQb3dlciA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKLQl7Ci0JCWlmICgoVHhQb3dlciA+IDMxKSB8fCAoVHhQb3dlciA8IDApKQotCQl7Ci0JCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jOjpPdXQgb2YgcmFuZ2UgKFZhbHVlPSVkKVxuIiwgVHhQb3dlcikpOwotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWlmICgoVHhQb3dlciA+IDE1KSB8fCAoVHhQb3dlciA8IC03KSkKLQkJewotCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9QT1dFUjFfUHJvYzo6T3V0IG9mIHJhbmdlIChWYWx1ZT0lZClcbiIsIFR4UG93ZXIpKTsKLQkJCXJldHVybiBGQUxTRTsKLQkJfQotCX0KLQotCXBBZC0+YXRlLlR4UG93ZXIxID0gVHhQb3dlcjsKLQlBVEVUeFB3ckhhbmRsZXIocEFkLCAxKTsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfUE9XRVIxX1Byb2MgU3VjY2Vzc1xuIikpOwotCi0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IEFURSBUeCBBbnRlbm5hCi0KLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JQ0hBUiB2YWx1ZTsKLQotCXZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmICgodmFsdWUgPiAyKSB8fCAodmFsdWUgPCAwKSkKLQl7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jOjpPdXQgb2YgcmFuZ2UgKFZhbHVlPSVkKVxuIiwgdmFsdWUpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCXBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9IHZhbHVlOwotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9UWF9BbnRlbm5hX1Byb2MgKEFudGVubmEgPSAlZClcbiIsIHBBZC0+YXRlLlR4QW50ZW5uYVNlbCkpOwotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUmFsaW5rOiBTZXRfQVRFX1RYX0FudGVubmFfUHJvYyBTdWNjZXNzXG4iKSk7Ci0KLQkvLyBjYWxpYnJhdGlvbiBwb3dlciB1bmJhbGFuY2UgaXNzdWVzLCBtZXJnZWQgZnJvbSBBcmNoIFRlYW0KLQlBVEVBc2ljU3dpdGNoQ2hhbm5lbChwQWQpOwotCi0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IEFURSBSeCBBbnRlbm5hCi0KLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9BVEVfUlhfQW50ZW5uYV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JQ0hBUiB2YWx1ZTsKLQotCXZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmICgodmFsdWUgPiAzKSB8fCAodmFsdWUgPCAwKSkKLQl7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfUlhfQW50ZW5uYV9Qcm9jOjpPdXQgb2YgcmFuZ2UgKFZhbHVlPSVkKVxuIiwgdmFsdWUpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCXBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9IHZhbHVlOwotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9SWF9BbnRlbm5hX1Byb2MgKEFudGVubmEgPSAlZClcbiIsIHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCkpOwotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9SWF9BbnRlbm5hX1Byb2MgU3VjY2Vzc1xuIikpOwotCi0JLy8gY2FsaWJyYXRpb24gcG93ZXIgdW5iYWxhbmNlIGlzc3VlcywgbWVyZ2VkIGZyb20gQXJjaCBUZWFtCi0JQVRFQXNpY1N3aXRjaENoYW5uZWwocEFkKTsKLQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBBVEUgUkYgZnJlcXVlbmNlIG9mZnNldAotCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVDSEFSIFJGRnJlcU9mZnNldCA9IDA7Ci0JVUxPTkcgUjQgPSAwOwotCi0JUkZGcmVxT2Zmc2V0ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLSNpZm5kZWYgUlRNUF9SRl9SV19TVVBQT1JUCi0JaWYgKFJGRnJlcU9mZnNldCA+PSA2NCkKLSNlbmRpZiAvLyBSVE1QX1JGX1JXX1NVUFBPUlQgLy8KLQkvKiBSVDM1eHggQVRFIHdpbGwgcmV1c2UgdGhpcyBjb2RlIHNlZ21lbnQuICovCi0jaWZkZWYgUlRNUF9SRl9SV19TVVBQT1JUCi0vLzIwMDgvMDgvMDY6IEtIIG1vZGlmaWVkIHRoZSBsaW1pdCBvZiBvZmZzZXQgdmFsdWUgZnJvbSA2NSB0byA5NSgweDVGKQotCWlmIChSRkZyZXFPZmZzZXQgPj0gOTUpCi0jZW5kaWYgLy8gUlRNUF9SRl9SV19TVVBQT1JUIC8vCi0JewotCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvYzo6T3V0IG9mIHJhbmdlLCBpdCBzaG91bGQgYmUgaW4gcmFuZ2Ugb2YgMH42My5cbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCXBBZC0+YXRlLlJGRnJlcU9mZnNldCA9IFJGRnJlcU9mZnNldDsKLSNpZmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKLQlpZiAoSVNfUlQzMHh4KHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkpCi0JewotCQkvLyBTZXQgUkYgb2Zmc2V0Ci0JCVVDSEFSIFJGVmFsdWU7Ci0JCUFURV9SRl9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBSRl9SMjMsIChQVUNIQVIpJlJGVmFsdWUpOwotLy8yMDA4LzA4LzA2OiBLSCBtb2RpZmllZCAicEFkLT5SRkZyZXFPZmZzZXQiIHRvICJwQWQtPmF0ZS5SRkZyZXFPZmZzZXQiCi0JCVJGVmFsdWUgPSAoKFJGVmFsdWUgJiAweDgwKSB8IHBBZC0+YXRlLlJGRnJlcU9mZnNldCk7Ci0JCUFURV9SRl9JT19XUklURThfQllfUkVHX0lEKHBBZCwgUkZfUjIzLCAoVUNIQVIpUkZWYWx1ZSk7Ci0JfQotCWVsc2UKLSNlbmRpZiAvLyBSVE1QX1JGX1JXX1NVUFBPUlQgLy8KLQl7Ci0JCS8vIFJUMjh4eAotCQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCi0JCVI0ID0gcEFkLT5hdGUuUkZGcmVxT2Zmc2V0IDw8IDE1OwotCQlSNCB8PSAocEFkLT5MYXRjaFJmUmVncy5SNCAmICgofjB4MDAxZjgwMDApKSk7Ci0JCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSNDsKLQotCQlSdG1wUmZJb1dyaXRlKHBBZCk7Ci0JfQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jIChSRkZyZXFPZmZzZXQgPSAlZClcbiIsIHBBZC0+YXRlLlJGRnJlcU9mZnNldCkpOwotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9GUkVRT0ZGU0VUX1Byb2MgU3VjY2Vzc1xuIikpOwotCi0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IEFURSBSRiBCVwotCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfQVRFX1RYX0JXX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlJTlQgaTsKLQlVQ0hBUiB2YWx1ZSA9IDA7Ci0JVUNIQVIgQkJQQ3VycmVudEJXOwotCi0JQkJQQ3VycmVudEJXID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmICgoQkJQQ3VycmVudEJXID09IDApCi0jaWZkZWYgUlQzMHh4Ci0JCXx8IElTX1JUMjA3MChwQWQpCi0jZW5kaWYgLy8gUlQzMHh4IC8vCi0JCSkKLQl7Ci0JCXBBZC0+YXRlLlR4V0kuQlcgPSBCV18yMDsKLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5hdGUuVHhXSS5CVyA9IEJXXzQwOwotCX0KLQotCS8qIFJUMzV4eCBBVEUgd2lsbCByZXVzZSB0aGlzIGNvZGUgc2VnbWVudC4gKi8KLQkvLyBGaXggdGhlIGVycm9yIHNwZWN0cnVtIG9mIENDSy00ME1IWgotCS8vIFR1cm4gb24gQkJQIDIwTUh6IG1vZGUgYnkgcmVxdWVzdCBoZXJlLgotCWlmICgocEFkLT5hdGUuVHhXSS5QSFlNT0RFID09IE1PREVfQ0NLKSAmJiAocEFkLT5hdGUuVHhXSS5CVyA9PSBCV180MCkpCi0JewotCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX0JXX1Byb2MhISBXYXJuaW5nISEgQ0NLIG9ubHkgc3VwcG9ydHMgMjBNSFohIVxuQmFuZHdpZHRoIHN3aXRjaCB0byAyMFxuIikpOwotCQlwQWQtPmF0ZS5UeFdJLkJXID0gQldfMjA7Ci0JfQotCi0JaWYgKHBBZC0+YXRlLlR4V0kuQlcgPT0gQldfMjApCi0JewotCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKLQkJewotCQkJZm9yIChpPTA7IGk8NTsgaSsrKQotCQkJewotCQkJCWlmIChwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbaV0gIT0gMHhmZmZmZmZmZikKLQkJCQl7Ci0JCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgcEFkLT5UeDIwTVB3ckNmZ0dCYW5kW2ldKTsKLQkJCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlmb3IgKGk9MDsgaTw1OyBpKyspCi0JCQl7Ci0JCQkJaWYgKHBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSAhPSAweGZmZmZmZmZmKQotCQkJCXsKLQkJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbaV0pOwotCQkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIFNldCBCQlAgUjQgYml0WzQ6M109MDowCi0JCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmdmFsdWUpOwotCQl2YWx1ZSAmPSAofjB4MTgpOwotCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIHZhbHVlKTsKLQotCi0JCS8vIFNldCBCQlAgUjY2PTB4M0MKLQkJdmFsdWUgPSAweDNDOwotCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCB2YWx1ZSk7Ci0KLQkJLy8gU2V0IEJCUCBSNjg9MHgwQgotCQkvLyB0byBpbXByb3ZlIFJ4IHNlbnNpdGl2aXR5LgotCQl2YWx1ZSA9IDB4MEI7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjgsIHZhbHVlKTsKLQkJLy8gU2V0IEJCUCBSNjk9MHgxNgotCQl2YWx1ZSA9IDB4MTY7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIHZhbHVlKTsKLQkJLy8gU2V0IEJCUCBSNzA9MHgwOAotCQl2YWx1ZSA9IDB4MDg7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIHZhbHVlKTsKLQkJLy8gU2V0IEJCUCBSNzM9MHgxMQotCQl2YWx1ZSA9IDB4MTE7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIHZhbHVlKTsKLQotCSAgICAvKgotCQkJSWYgQ2hhbm5lbD0xNCwgQmFuZHdpZHRoPTIwTSBhbmQgTW9kZT1DQ0ssIFNldCBCQlAgUjQgYml0NT0xCi0JCQkodG8gc2V0IEphcGFuIGZpbHRlciBjb2VmZmljaWVudHMpLgotCQkJVGhpcyBzZWdtZW50IG9mIGNvZGUgd2lsbCBvbmx5IHdvcmtzIHdoZW4gQVRFVFhNT0RFIGFuZCBBVEVDSEFOTkVMCi0JCQl3ZXJlIHNldCB0byBNT0RFX0NDSyBhbmQgMTQgcmVzcGVjdGl2ZWx5IGJlZm9yZSBBVEVUWEJXIGlzIHNldCB0byAwLgotCSAgICAqLwotCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA9PSAxNCkKLQkJewotCQkJSU5UIFR4TW9kZSA9IHBBZC0+YXRlLlR4V0kuUEhZTU9ERTsKLQotCQkJaWYgKFR4TW9kZSA9PSBNT0RFX0NDSykKLQkJCXsKLQkJCQkvLyB3aGVuIENoYW5uZWw9PTE0ICYmIE1vZGU9PUNDSyAmJiBCYW5kV2lkdGg9PTIwTSwgQkJQIFI0IGJpdDU9MQotCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmdmFsdWUpOwotCQkJCXZhbHVlIHw9IDB4MjA7IC8vc2V0IGJpdDU9MQotCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgdmFsdWUpOwotCQkJfQotCQl9Ci0KLSNpZmRlZiBSVDMweHgKLQkJLy8gc2V0IEJXID0gMjAgTUh6Ci0JCWlmIChJU19SVDMweHgocEFkKSkKLQkJCUFURV9SRl9JT19XUklURThfQllfUkVHX0lEKHBBZCwgUkZfUjI0LCAoVUNIQVIpIHBBZC0+TWxtZS5DYWxpQlcyMFJmUjI0KTsKLQkJZWxzZQotI2VuZGlmIC8vIFJUMzB4eCAvLwotCQkvLyBzZXQgQlcgPSAyMCBNSHoKLQkJewotCQkJcEFkLT5MYXRjaFJmUmVncy5SNCAmPSB+MHgwMDIwMDAwMDsKLQkJCVJ0bXBSZklvV3JpdGUocEFkKTsKLQkJfQotCi0JfQotCS8vIElmIGJhbmR3aWR0aCA9IDQwTSwgc2V0IFJGIFJlZzQgYml0IDIxID0gMC4KLQllbHNlIGlmIChwQWQtPmF0ZS5UeFdJLkJXID09IEJXXzQwKQotCXsKLQkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCi0JCXsKLQkJCWZvciAoaT0wOyBpPDU7IGkrKykKLQkJCXsKLQkJCQlpZiAocEFkLT5UeDQwTVB3ckNmZ0dCYW5kW2ldICE9IDB4ZmZmZmZmZmYpCi0JCQkJewotCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QV1JfQ0ZHXzAgKyBpKjQsIHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFtpXSk7Ci0JCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJZm9yIChpPTA7IGk8NTsgaSsrKQotCQkJewotCQkJCWlmIChwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbaV0gIT0gMHhmZmZmZmZmZikKLQkJCQl7Ci0JCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgcEFkLT5UeDQwTVB3ckNmZ0FCYW5kW2ldKTsKLQkJCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKLQkJCQl9Ci0JCQl9Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQlpZiAoKHBBZC0+YXRlLlR4V0kuUEhZTU9ERSA+PSBNT0RFX0hUTUlYKSAmJiAocEFkLT5hdGUuVHhXSS5NQ1MgPT0gNykpCi0JCQl7Ci0JCQl2YWx1ZSA9IDB4Mjg7Ci0JCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY3LCB2YWx1ZSk7Ci0JCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCX0KLQotCQkvLyBTZXQgQkJQIFI0IGJpdFs0OjNdPTE6MAotCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJnZhbHVlKTsKLQkJdmFsdWUgJj0gKH4weDE4KTsKLQkJdmFsdWUgfD0gMHgxMDsKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCB2YWx1ZSk7Ci0KLQotCQkvLyBTZXQgQkJQIFI2Nj0weDNDCi0JCXZhbHVlID0gMHgzQzsKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgdmFsdWUpOwotCi0JCS8vIFNldCBCQlAgUjY4PTB4MEMKLQkJLy8gdG8gaW1wcm92ZSBSeCBzZW5zaXRpdml0eQotCQl2YWx1ZSA9IDB4MEM7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjgsIHZhbHVlKTsKLQkJLy8gU2V0IEJCUCBSNjk9MHgxQQotCQl2YWx1ZSA9IDB4MUE7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIHZhbHVlKTsKLQkJLy8gU2V0IEJCUCBSNzA9MHgwQQotCQl2YWx1ZSA9IDB4MEE7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIHZhbHVlKTsKLQkJLy8gU2V0IEJCUCBSNzM9MHgxNgotCQl2YWx1ZSA9IDB4MTY7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIHZhbHVlKTsKLQotCQkvLyBJZiBiYW5kd2lkdGggPSA0ME0sIHNldCBSRiBSZWc0IGJpdCAyMSA9IDEuCi0jaWZkZWYgUlQzMHh4Ci0JCS8vIHNldCBCVyA9IDQwIE1IegotCQlpZihJU19SVDMweHgocEFkKSkKLQkJCUFURV9SRl9JT19XUklURThfQllfUkVHX0lEKHBBZCwgUkZfUjI0LCAoVUNIQVIpIHBBZC0+TWxtZS5DYWxpQlc0MFJmUjI0KTsKLQkJZWxzZQotI2VuZGlmIC8vIFJUMzB4eCAvLwotCQkvLyBzZXQgQlcgPSA0MCBNSHoKLQkJewotCQlwQWQtPkxhdGNoUmZSZWdzLlI0IHw9IDB4MDAyMDAwMDA7Ci0JCVJ0bXBSZklvV3JpdGUocEFkKTsKLQkJfQotCX0KLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfQldfUHJvYyAoQkJQQ3VycmVudEJXID0gJWQpXG4iLCBwQWQtPmF0ZS5UeFdJLkJXKSk7Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX0JXX1Byb2MgU3VjY2Vzc1xuIikpOwotCi0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IEFURSBUeCBmcmFtZSBsZW5ndGgKLQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X0FURV9UWF9MRU5HVEhfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCXBBZC0+YXRlLlR4TGVuZ3RoID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmICgocEFkLT5hdGUuVHhMZW5ndGggPCAyNCkgfHwgKHBBZC0+YXRlLlR4TGVuZ3RoID4gKE1BWF9GUkFNRV9TSVpFIC0gMzQvKiA9PSAyMzEyICovKSkpCi0JewotCQlwQWQtPmF0ZS5UeExlbmd0aCA9IChNQVhfRlJBTUVfU0laRSAtIDM0LyogPT0gMjMxMiAqLyk7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfTEVOR1RIX1Byb2M6Ok91dCBvZiByYW5nZSwgaXQgc2hvdWxkIGJlIGluIHJhbmdlIG9mIDI0fiVkLlxuIiwgKE1BWF9GUkFNRV9TSVpFIC0gMzQvKiA9PSAyMzEyICovKSkpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9UWF9MRU5HVEhfUHJvYyAoVHhMZW5ndGggPSAlZClcbiIsIHBBZC0+YXRlLlR4TGVuZ3RoKSk7Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX0xFTkdUSF9Qcm9jIFN1Y2Nlc3NcbiIpKTsKLQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBBVEUgVHggZnJhbWUgY291bnQKLQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X0FURV9UWF9DT1VOVF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JcEFkLT5hdGUuVHhDb3VudCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX0NPVU5UX1Byb2MgKFR4Q291bnQgPSAlZClcbiIsIHBBZC0+YXRlLlR4Q291bnQpKTsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfQ09VTlRfUHJvYyBTdWNjZXNzXG4iKSk7Ci0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgQVRFIFR4IGZyYW1lIE1DUwotCi0gICAgICAgIFJldHVybjoKLQkJVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X0FURV9UWF9NQ1NfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVDSEFSIE1DUzsKLQlJTlQgcmVzdWx0OwotCi0JTUNTID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLSNpZm5kZWYgUlQzMHh4Ci0JcmVzdWx0ID0gQ2hlY2tNQ1NWYWxpZChwQWQtPmF0ZS5UeFdJLlBIWU1PREUsIE1DUyk7Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCi0KLQkvKiBSVDM1eHggQVRFIHdpbGwgcmV1c2UgdGhpcyBjb2RlIHNlZ21lbnQuICovCi0jaWZkZWYgUlQzMHh4Ci0JcmVzdWx0ID0gQ2hlY2tNQ1NWYWxpZChwQWQtPmF0ZS5UeFdJLlBIWU1PREUsIE1DUywgSVNfUlQyMDcwKHBBZCkpOwotI2VuZGlmIC8vIFJUMzB4eCAvLwotCi0KLQlpZiAocmVzdWx0ICE9IC0xKQotCXsKLQkJcEFkLT5hdGUuVHhXSS5NQ1MgPSAoVUNIQVIpTUNTOwotCX0KLQllbHNlCi0JewotCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX01DU19Qcm9jOjpPdXQgb2YgcmFuZ2UsIHJlZmVyIHRvIHJhdGUgdGFibGUuXG4iKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX01DU19Qcm9jIChNQ1MgPSAlZClcbiIsIHBBZC0+YXRlLlR4V0kuTUNTKSk7Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX01DU19Qcm9jIFN1Y2Nlc3NcbiIpKTsKLQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBBVEUgVHggZnJhbWUgTW9kZQotICAgICAgICAwOiBNT0RFX0NDSwotICAgICAgICAxOiBNT0RFX09GRE0KLSAgICAgICAgMjogTU9ERV9IVE1JWAotICAgICAgICAzOiBNT0RFX0hUR1JFRU5GSUVMRAotCi0gICAgICAgIFJldHVybjoKLQkJVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X0FURV9UWF9NT0RFX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVQ0hBUiBCYnBEYXRhID0gMDsKLQotCXBBZC0+YXRlLlR4V0kuUEhZTU9ERSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAocEFkLT5hdGUuVHhXSS5QSFlNT0RFID4gMykKLQl7Ci0JCXBBZC0+YXRlLlR4V0kuUEhZTU9ERSA9IDA7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfTU9ERV9Qcm9jOjpPdXQgb2YgcmFuZ2UuXG5JdCBzaG91bGQgYmUgaW4gcmFuZ2Ugb2YgMH4zXG4iKSk7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIjA6IENDSywgMTogT0ZETSwgMjogSFRfTUlYLCAzOiBIVF9HUkVFTl9GSUVMRC5cbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCS8vIFR1cm4gb24gQkJQIDIwTUh6IG1vZGUgYnkgcmVxdWVzdCBoZXJlLgotCWlmIChwQWQtPmF0ZS5UeFdJLlBIWU1PREUgPT0gTU9ERV9DQ0spCi0JewotCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJicERhdGEpOwotCQlCYnBEYXRhICY9ICh+MHgxOCk7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQmJwRGF0YSk7Ci0JCXBBZC0+YXRlLlR4V0kuQlcgPSBCV18yMDsKLQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9NT0RFX1Byb2M6OkNDSyBPbmx5IHN1cHBvcnQgMjBNSFouIFN3aXRjaCB0byAyME1IWi5cbiIpKTsKLQl9Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX01PREVfUHJvYyAoVHhNb2RlID0gJWQpXG4iLCBwQWQtPmF0ZS5UeFdJLlBIWU1PREUpKTsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfTU9ERV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKLQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBBVEUgVHggZnJhbWUgR0kKLQotICAgICAgICBSZXR1cm46Ci0JCVRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9BVEVfVFhfR0lfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCXBBZC0+YXRlLlR4V0kuU2hvcnRHSSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAocEFkLT5hdGUuVHhXSS5TaG9ydEdJID4gMSkKLQl7Ci0JCXBBZC0+YXRlLlR4V0kuU2hvcnRHSSA9IDA7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfR0lfUHJvYzo6T3V0IG9mIHJhbmdlXG4iKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX0dJX1Byb2MgKEdJID0gJWQpXG4iLCBwQWQtPmF0ZS5UeFdJLlNob3J0R0kpKTsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfR0lfUHJvYyBTdWNjZXNzXG4iKSk7Ci0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLUlOVAlTZXRfQVRFX1JYX0ZFUl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JcEFkLT5hdGUuYlJ4RkVSID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChwQWQtPmF0ZS5iUnhGRVIgPT0gMSkKLQl7Ci0JCXBBZC0+YXRlLlJ4Q250UGVyU2VjID0gMDsKLQkJcEFkLT5hdGUuUnhUb3RhbENudCA9IDA7Ci0JfQotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9SWF9GRVJfUHJvYyAoYlJ4RkVSID0gJWQpXG4iLCBwQWQtPmF0ZS5iUnhGRVIpKTsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfUlhfRkVSX1Byb2MgU3VjY2Vzc1xuIikpOwotCi0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi1JTlQgU2V0X0FURV9SZWFkX1JGX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLSNpZmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKLS8vMjAwOC8wNy8xMDpLSCBhZGQgdG8gc3VwcG9ydCBSVDMweHggQVRFPC0tCi0JaWYgKElTX1JUMzB4eChwQWQpIHx8IElTX1JUMzU3MihwQWQpKQotCXsKLQkJLyogbW9kaWZ5IGJ5IFdZIGZvciBSZWFkIFJGIFJlZy4gZXJyb3IgKi8KLQkJVUNIQVIgUkZWYWx1ZTsKLQkJSU5UIGluZGV4PTA7Ci0KLQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgMzI7IGluZGV4KyspCi0JCXsKLQkJCUFURV9SRl9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBpbmRleCwgKFBVQ0hBUikmUkZWYWx1ZSk7Ci0JCQlhdGVfcHJpbnQoIlIlZD0lZFxuIixpbmRleCxSRlZhbHVlKTsKLQkJfQotCX0KLQllbHNlCi0vLzIwMDgvMDcvMTA6S0ggYWRkIHRvIHN1cHBvcnQgUlQzMHh4IEFURS0tPgotI2VuZGlmIC8vIFJUTVBfUkZfUldfU1VQUE9SVCAvLwotCXsKLQkJYXRlX3ByaW50KEtFUk5fRU1FUkcgIlIxID0gJWx4XG4iLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKLQkJYXRlX3ByaW50KEtFUk5fRU1FUkcgIlIyID0gJWx4XG4iLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKLQkJYXRlX3ByaW50KEtFUk5fRU1FUkcgIlIzID0gJWx4XG4iLCBwQWQtPkxhdGNoUmZSZWdzLlIzKTsKLQkJYXRlX3ByaW50KEtFUk5fRU1FUkcgIlI0ID0gJWx4XG4iLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKLQl9Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotSU5UIFNldF9BVEVfV3JpdGVfUkYxX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVSU5UMzIgdmFsdWUgPSAoVUlOVDMyKSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTYpOwotCi0jaWZkZWYgUlRNUF9SRl9SV19TVVBQT1JUCi0vLzIwMDgvMDcvMTA6S0ggYWRkIHRvIHN1cHBvcnQgMzA3MCBBVEU8LS0KLQlpZiAoSVNfUlQzMHh4KHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkpCi0JewotCQlhdGVfcHJpbnQoIldhcm5pbmchISBSVDN4eHggRG9uJ3QgU3VwcG9ydCAhXG4iKTsKLQkJcmV0dXJuIEZBTFNFOwotCi0JfQotCWVsc2UKLS8vMjAwOC8wNy8xMDpLSCBhZGQgdG8gc3VwcG9ydCAzMDcwIEFURS0tPgotI2VuZGlmIC8vIFJUTVBfUkZfUldfU1VQUE9SVCAvLwotCXsKLQkJcEFkLT5MYXRjaFJmUmVncy5SMSA9IHZhbHVlOwotCQlSdG1wUmZJb1dyaXRlKHBBZCk7Ci0JfQotCXJldHVybiBUUlVFOwotfQotCi0KLUlOVCBTZXRfQVRFX1dyaXRlX1JGMl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUlOVDMyIHZhbHVlID0gKFVJTlQzMikgc2ltcGxlX3N0cnRvbChhcmcsIDAsIDE2KTsKLQotI2lmZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotLy8yMDA4LzA3LzEwOktIIGFkZCB0byBzdXBwb3J0IDMwNzAgQVRFPC0tCi0JaWYgKElTX1JUMzB4eChwQWQpIHx8IElTX1JUMzU3MihwQWQpKQotCXsKLQkJYXRlX3ByaW50KCJXYXJuaW5nISEgUlQzeHh4IERvbid0IFN1cHBvcnQgIVxuIik7Ci0JCXJldHVybiBGQUxTRTsKLQotCX0KLQllbHNlCi0vLzIwMDgvMDcvMTA6S0ggYWRkIHRvIHN1cHBvcnQgMzA3MCBBVEUtLT4KLSNlbmRpZiAvLyBSVE1QX1JGX1JXX1NVUFBPUlQgLy8KLQl7Ci0JCXBBZC0+TGF0Y2hSZlJlZ3MuUjIgPSB2YWx1ZTsKLQkJUnRtcFJmSW9Xcml0ZShwQWQpOwotCX0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi1JTlQgU2V0X0FURV9Xcml0ZV9SRjNfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVJTlQzMiB2YWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxNik7Ci0KLSNpZmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKLS8vMjAwOC8wNy8xMDpLSCBhZGQgdG8gc3VwcG9ydCAzMDcwIEFURTwtLQotCWlmIChJU19SVDMweHgocEFkKSB8fCBJU19SVDM1NzIocEFkKSkKLQl7Ci0JCWF0ZV9wcmludCgiV2FybmluZyEhIFJUM3h4eCBEb24ndCBTdXBwb3J0ICFcbiIpOwotCQlyZXR1cm4gRkFMU0U7Ci0KLQl9Ci0JZWxzZQotLy8yMDA4LzA3LzEwOktIIGFkZCB0byBzdXBwb3J0IDMwNzAgQVRFLS0+Ci0jZW5kaWYgLy8gUlRNUF9SRl9SV19TVVBQT1JUIC8vCi0JewotCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gdmFsdWU7Ci0JCVJ0bXBSZklvV3JpdGUocEFkKTsKLQl9Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotSU5UIFNldF9BVEVfV3JpdGVfUkY0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVSU5UMzIgdmFsdWUgPSAoVUlOVDMyKSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTYpOwotCi0jaWZkZWYgUlRNUF9SRl9SV19TVVBQT1JUCi0vLzIwMDgvMDcvMTA6S0ggYWRkIHRvIHN1cHBvcnQgMzA3MCBBVEU8LS0KLQlpZiAoSVNfUlQzMHh4KHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkpCi0JewotCQlhdGVfcHJpbnQoIldhcm5pbmchISBSVDN4eHggRG9uJ3QgU3VwcG9ydCAhXG4iKTsKLQkJcmV0dXJuIEZBTFNFOwotCi0JfQotCWVsc2UKLS8vMjAwOC8wNy8xMDpLSCBhZGQgdG8gc3VwcG9ydCAzMDcwIEFURS0tPgotI2VuZGlmIC8vIFJUTVBfUkZfUldfU1VQUE9SVCAvLwotCXsKLQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IHZhbHVlOwotCQlSdG1wUmZJb1dyaXRlKHBBZCk7Ci0JfQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBMb2FkIGFuZCBXcml0ZSBFRVBST00gZnJvbSBhIGJpbmFyeSBmaWxlIHByZXBhcmVkIGluIGFkdmFuY2UuCi0KLSAgICAgICAgUmV0dXJuOgotCQlUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLSNpZiBkZWZpbmVkKExJTlVYKSB8fCBkZWZpbmVkKFZYV09SS1MpCi1JTlQgU2V0X0FURV9Mb2FkX0UyUF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JQk9PTEVBTgkJCXJldCA9IEZBTFNFOwotCVBTVFJJTkcJCQlzcmMgPSBFRVBST01fQklOX0ZJTEVfTkFNRTsKLQlSVE1QX09TX0ZECQlzcmNmOwotCUlOVDMyCQkJcmV0dmFsOwotCVVTSE9SVAkJCVdyaXRlRUVQUk9NWyhFRVBST01fU0laRS8yKV07Ci0JSU5UCQkJCUZpbGVMZW5ndGggPSAwOwotCVVJTlQzMgkJCXZhbHVlID0gKFVJTlQzMikgc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlSVE1QX09TX0ZTX0lORk8Jb3NGU0luZm87Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI9PT0+ICVzICh2YWx1ZT0lZClcblxuIiwgX19GVU5DVElPTl9fLCB2YWx1ZSkpOwotCi0JaWYgKHZhbHVlID4gMCkKLQl7Ci0JCS8qIHplcm8gdGhlIGUycCBidWZmZXIgKi8KLQkJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUilXcml0ZUVFUFJPTSwgRUVQUk9NX1NJWkUpOwotCi0JCVJ0bXBPU0ZTSW5mb0NoYW5nZSgmb3NGU0luZm8sIFRSVUUpOwotCi0JCWRvCi0JCXsKLQkJCS8qIG9wZW4gdGhlIGJpbiBmaWxlICovCi0JCQlzcmNmID0gUnRtcE9TRmlsZU9wZW4oc3JjLCBPX1JET05MWSwgMCk7Ci0KLQkJCWlmIChJU19GSUxFX09QRU5fRVJSKHNyY2YpKQotCQkJewotCQkJCWF0ZV9wcmludCgiJXMgLSBFcnJvciBvcGVuaW5nIGZpbGUgJXNcbiIsIF9fRlVOQ1RJT05fXywgc3JjKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyogcmVhZCB0aGUgZmlybXdhcmUgZnJvbSB0aGUgZmlsZSAqLmJpbiAqLwotCQkJRmlsZUxlbmd0aCA9IFJ0bXBPU0ZpbGVSZWFkKHNyY2YsIChQU1RSSU5HKVdyaXRlRUVQUk9NLCBFRVBST01fU0laRSk7Ci0KLQkJCWlmIChGaWxlTGVuZ3RoICE9IEVFUFJPTV9TSVpFKQotCQkJewotCQkJCWF0ZV9wcmludCgiJXM6IGVycm9yIGZpbGUgbGVuZ3RoICg9JWQpIGluIGUycC5iaW5cbiIsCi0JCQkJCSAgIF9fRlVOQ1RJT05fXywgRmlsZUxlbmd0aCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLyogd3JpdGUgdGhlIGNvbnRlbnQgb2YgLmJpbiBmaWxlIHRvIEVFUFJPTSAqLwotCQkJCXJ0X2VlX3dyaXRlX2FsbChwQWQsIFdyaXRlRUVQUk9NKTsKLQkJCQlyZXQgPSBUUlVFOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0gd2hpbGUoVFJVRSk7Ci0KLQkJLyogY2xvc2UgZmlybXdhcmUgZmlsZSAqLwotCQlpZiAoSVNfRklMRV9PUEVOX0VSUihzcmNmKSkKLQkJewotCQkJCTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXJldHZhbCA9IFJ0bXBPU0ZpbGVDbG9zZShzcmNmKTsKLQotCQkJaWYgKHJldHZhbCkKLQkJCXsKLQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gRXJyb3IgJWQgY2xvc2luZyAlc1xuIiwgLXJldHZhbCwgc3JjKSk7Ci0KLQkJCX0KLQkJfQotCi0JCS8qIHJlc3RvcmUgKi8KLQkJUnRtcE9TRlNJbmZvQ2hhbmdlKCZvc0ZTSW5mbywgRkFMU0UpOwotCX0KLQotICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIjw9PT0gJXMgKHJldD0lZClcbiIsIF9fRlVOQ1RJT05fXywgcmV0KSk7Ci0KLSAgICByZXR1cm4gcmV0OwotCi19Ci0jZW5kaWYgLy8gZGVmaW5lZChMSU5VWCkgfHwgZGVmaW5lZChWWFdPUktTKSAvLwotCi0KLQotCi1JTlQgU2V0X0FURV9SZWFkX0UyUF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVVNIT1JUIGJ1ZmZlcltFRVBST01fU0laRS8yXTsKLQlVU0hPUlQgKnA7Ci0JaW50IGk7Ci0KLQlydF9lZV9yZWFkX2FsbChwQWQsIChVU0hPUlQgKilidWZmZXIpOwotCXAgPSBidWZmZXI7Ci0JZm9yIChpID0gMDsgaSA8IChFRVBST01fU0laRS8yKTsgaSsrKQotCXsKLQkJYXRlX3ByaW50KCIlNC40eCAiLCAqcCk7Ci0JCWlmICgoKGkrMSkgJSAxNikgPT0gMCkKLQkJCWF0ZV9wcmludCgiXG4iKTsKLQkJcCsrOwotCX0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0KLQotSU5UCVNldF9BVEVfU2hvd19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JYXRlX3ByaW50KCJNb2RlPSVkXG4iLCBwQWQtPmF0ZS5Nb2RlKTsKLQlhdGVfcHJpbnQoIlR4UG93ZXIwPSVkXG4iLCBwQWQtPmF0ZS5UeFBvd2VyMCk7Ci0JYXRlX3ByaW50KCJUeFBvd2VyMT0lZFxuIiwgcEFkLT5hdGUuVHhQb3dlcjEpOwotCWF0ZV9wcmludCgiVHhBbnRlbm5hU2VsPSVkXG4iLCBwQWQtPmF0ZS5UeEFudGVubmFTZWwpOwotCWF0ZV9wcmludCgiUnhBbnRlbm5hU2VsPSVkXG4iLCBwQWQtPmF0ZS5SeEFudGVubmFTZWwpOwotCWF0ZV9wcmludCgiQkJQQ3VycmVudEJXPSVkXG4iLCBwQWQtPmF0ZS5UeFdJLkJXKTsKLQlhdGVfcHJpbnQoIkdJPSVkXG4iLCBwQWQtPmF0ZS5UeFdJLlNob3J0R0kpOwotCWF0ZV9wcmludCgiTUNTPSVkXG4iLCBwQWQtPmF0ZS5UeFdJLk1DUyk7Ci0JYXRlX3ByaW50KCJUeE1vZGU9JWRcbiIsIHBBZC0+YXRlLlR4V0kuUEhZTU9ERSk7Ci0JYXRlX3ByaW50KCJBZGRyMT0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJcEFkLT5hdGUuQWRkcjFbMF0sIHBBZC0+YXRlLkFkZHIxWzFdLCBwQWQtPmF0ZS5BZGRyMVsyXSwgcEFkLT5hdGUuQWRkcjFbM10sIHBBZC0+YXRlLkFkZHIxWzRdLCBwQWQtPmF0ZS5BZGRyMVs1XSk7Ci0JYXRlX3ByaW50KCJBZGRyMj0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJcEFkLT5hdGUuQWRkcjJbMF0sIHBBZC0+YXRlLkFkZHIyWzFdLCBwQWQtPmF0ZS5BZGRyMlsyXSwgcEFkLT5hdGUuQWRkcjJbM10sIHBBZC0+YXRlLkFkZHIyWzRdLCBwQWQtPmF0ZS5BZGRyMls1XSk7Ci0JYXRlX3ByaW50KCJBZGRyMz0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJcEFkLT5hdGUuQWRkcjNbMF0sIHBBZC0+YXRlLkFkZHIzWzFdLCBwQWQtPmF0ZS5BZGRyM1syXSwgcEFkLT5hdGUuQWRkcjNbM10sIHBBZC0+YXRlLkFkZHIzWzRdLCBwQWQtPmF0ZS5BZGRyM1s1XSk7Ci0JYXRlX3ByaW50KCJDaGFubmVsPSVkXG4iLCBwQWQtPmF0ZS5DaGFubmVsKTsKLQlhdGVfcHJpbnQoIlR4TGVuZ3RoPSVkXG4iLCBwQWQtPmF0ZS5UeExlbmd0aCk7Ci0JYXRlX3ByaW50KCJUeENvdW50PSV1XG4iLCBwQWQtPmF0ZS5UeENvdW50KTsKLQlhdGVfcHJpbnQoIlJGRnJlcU9mZnNldD0lZFxuIiwgcEFkLT5hdGUuUkZGcmVxT2Zmc2V0KTsKLQlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiU2V0X0FURV9TaG93X1Byb2MgU3VjY2Vzc1xuIik7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotSU5UCVNldF9BVEVfSGVscF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JYXRlX3ByaW50KCJBVEU9QVRFU1RBUlQsIEFURVNUT1AsIFRYQ09OVCwgVFhDQVJSLCBUWEZSQU1FLCBSWEZSQU1FXG4iKTsKLQlhdGVfcHJpbnQoIkFURURBXG4iKTsKLQlhdGVfcHJpbnQoIkFURVNBXG4iKTsKLQlhdGVfcHJpbnQoIkFURUJTU0lEXG4iKTsKLQlhdGVfcHJpbnQoIkFURUNIQU5ORUwsIHJhbmdlOjB+MTQodW5sZXNzIEEgYmFuZCAhKVxuIik7Ci0JYXRlX3ByaW50KCJBVEVUWFBPVzAsIHNldCBwb3dlciBsZXZlbCBvZiBhbnRlbm5hIDEuXG4iKTsKLQlhdGVfcHJpbnQoIkFURVRYUE9XMSwgc2V0IHBvd2VyIGxldmVsIG9mIGFudGVubmEgMi5cbiIpOwotCWF0ZV9wcmludCgiQVRFVFhBTlQsIHNldCBUWCBhbnRlbm5hLiAwOmFsbCwgMTphbnRlbm5hIG9uZSwgMjphbnRlbm5hIHR3by5cbiIpOwotCWF0ZV9wcmludCgiQVRFUlhBTlQsIHNldCBSWCBhbnRlbm5hLjA6YWxsLCAxOmFudGVubmEgb25lLCAyOmFudGVubmEgdHdvLCAzOmFudGVubmEgdGhyZWUuXG4iKTsKLQlhdGVfcHJpbnQoIkFURVRYRlJFUU9GRlNFVCwgc2V0IGZyZXF1ZW5jeSBvZmZzZXQsIHJhbmdlIDB+NjNcbiIpOwotCWF0ZV9wcmludCgiQVRFVFhCVywgc2V0IEJhbmRXaWR0aCwgMDoyME1IeiwgMTo0ME1Iei5cbiIpOwotCWF0ZV9wcmludCgiQVRFVFhMRU4sIHNldCBGcmFtZSBsZW5ndGgsIHJhbmdlIDI0fiVkXG4iLCAoTUFYX0ZSQU1FX1NJWkUgLSAzNC8qID09IDIzMTIgKi8pKTsKLQlhdGVfcHJpbnQoIkFURVRYQ05ULCBzZXQgaG93IG1hbnkgZnJhbWUgZ29pbmcgdG8gdHJhbnNtaXQuXG4iKTsKLQlhdGVfcHJpbnQoIkFURVRYTUNTLCBzZXQgTUNTLCByZWZlcmVuY2UgdG8gcmF0ZSB0YWJsZS5cbiIpOwotCWF0ZV9wcmludCgiQVRFVFhNT0RFLCBzZXQgTW9kZSAwOkNDSywgMTpPRkRNLCAyOkhULU1peCwgMzpHcmVlbkZpZWxkLCByZWZlcmVuY2UgdG8gcmF0ZSB0YWJsZS5cbiIpOwotCWF0ZV9wcmludCgiQVRFVFhHSSwgc2V0IEdJIGludGVydmFsLCAwOkxvbmcsIDE6U2hvcnRcbiIpOwotCWF0ZV9wcmludCgiQVRFUlhGRVIsIDA6ZGlzYWJsZSBSeCBGcmFtZSBlcnJvciByYXRlLiAxOmVuYWJsZSBSeCBGcmFtZSBlcnJvciByYXRlLlxuIik7Ci0JYXRlX3ByaW50KCJBVEVSUkYsIHNob3cgYWxsIFJGIHJlZ2lzdGVycy5cbiIpOwotCWF0ZV9wcmludCgiQVRFV1JGMSwgc2V0IFJGMSByZWdpc3Rlci5cbiIpOwotCWF0ZV9wcmludCgiQVRFV1JGMiwgc2V0IFJGMiByZWdpc3Rlci5cbiIpOwotCWF0ZV9wcmludCgiQVRFV1JGMywgc2V0IFJGMyByZWdpc3Rlci5cbiIpOwotCWF0ZV9wcmludCgiQVRFV1JGNCwgc2V0IFJGNCByZWdpc3Rlci5cbiIpOwotCWF0ZV9wcmludCgiQVRFTERFMlAsIGxvYWQgRUVQUk9NIGZyb20gLmJpbiBmaWxlLlxuIik7Ci0JYXRlX3ByaW50KCJBVEVSRTJQLCBkaXNwbGF5IGFsbCBFRVBST00gY29udGVudC5cbiIpOwotCWF0ZV9wcmludCgiQVRFU0hPVywgZGlzcGxheSBhbGwgcGFyYW1ldGVycyBvZiBBVEUuXG4iKTsKLQlhdGVfcHJpbnQoIkFURUhFTFAsIG9ubGluZSBoZWxwLlxuIik7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0KLQlBc2ljU3dpdGNoQ2hhbm5lbCgpIGRlZGljYXRlZCBmb3IgQVRFLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQVRFQXNpY1N3aXRjaENoYW5uZWwoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JVUlOVDMyIFIyID0gMCwgUjMgPSBERUZBVUxUX1JGX1RYX1BPV0VSLCBSNCA9IDAsIFZhbHVlID0gMDsKLQlDSEFSIFR4UHdlciA9IDAsIFR4UHdlcjIgPSAwOwotCVVDSEFSIGluZGV4ID0gMCwgQmJwVmFsdWUgPSAwLCBSNjYgPSAweDMwOwotCVJUTVBfUkZfUkVHUyAqUkZSZWdUYWJsZTsKLQlVQ0hBUiBDaGFubmVsID0gMDsKLQotCVJGUmVnVGFibGUgPSBOVUxMOwotCi0jaWZkZWYgUkFMSU5LXzI4eHhfUUEKLQkvLyBmb3IgUUEgbW9kZSwgVFggcG93ZXIgdmFsdWVzIGFyZSBwYXNzZWQgZnJvbSBVSQotCWlmICgocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSB8fCAocEFkLT5hdGUuYlFBUnhTdGFydCA9PSBUUlVFKSkKLQl7Ci0JCWlmIChwQWQtPmF0ZS5DaGFubmVsICE9IHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCkKLQkJewotCQkJcEFkLT5hdGUuQ2hhbm5lbCA9IHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbDsKLQkJfQotCQlyZXR1cm47Ci0JfQotCWVsc2UKLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotCUNoYW5uZWwgPSBwQWQtPmF0ZS5DaGFubmVsOwotCi0JLy8gc2VsZWN0IGFudGVubmEgZm9yIFJUMzA5MAotCUFzaWNBbnRlbm5hU2VsZWN0KHBBZCwgQ2hhbm5lbCk7Ci0KLQkvLyBmaWxsIFR4IHBvd2VyIHZhbHVlCi0JVHhQd2VyID0gcEFkLT5hdGUuVHhQb3dlcjA7Ci0JVHhQd2VyMiA9IHBBZC0+YXRlLlR4UG93ZXIxOwotI2lmZGVmIFJUMzB4eAotLy8yMDA4LzA3LzEwOktIIGFkZCB0byBzdXBwb3J0IDMwNzAgQVRFPC0tCi0KLQkvKgotCQlUaGUgUkYgcHJvZ3JhbW1pbmcgc2VxdWVuY2UgaXMgZGlmZmVyZW5jZSBiZXR3ZWVuIDN4eHggYW5kIDJ4eHguCi0JCVRoZSAzMDcwIGlzIDFUMVIuIFRoZXJlZm9yZSwgd2UgZG9uJ3QgbmVlZCB0byBzZXQgdGhlIG51bWJlciBvZiBUeC9SeCBwYXRoCi0JCWFuZCB0aGUgb25seSBqb2IgaXMgdG8gc2V0IHRoZSBwYXJhbWV0ZXJzIG9mIGNoYW5uZWxzLgotCSovCi0JaWYgKElTX1JUMzB4eChwQWQpICYmICgocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjApIHx8Ci0JCQkocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjEpIHx8IChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMikgfHwKLQkJCShwQWQtPlJmSWNUeXBlID09IFJGSUNfMjAyMCkpKQotCXsKLQkJLyogbW9kaWZ5IGJ5IFdZIGZvciBSZWFkIFJGIFJlZy4gZXJyb3IgKi8KLQkJVUNIQVIgUkZWYWx1ZSA9IDA7Ci0KLQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX09GXzMwMjBfQ0hOTDsgaW5kZXgrKykKLQkJewotCQkJaWYgKENoYW5uZWwgPT0gRnJlcUl0ZW1zMzAyMFtpbmRleF0uQ2hhbm5lbCkKLQkJCXsKLQkJCQkvLyBQcm9ncmFtbWluZyBjaGFubmVsIHBhcmFtZXRlcnMuCi0JCQkJQVRFX1JGX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBSRl9SMDIsIEZyZXFJdGVtczMwMjBbaW5kZXhdLk4pOwotCQkJCUFURV9SRl9JT19XUklURThfQllfUkVHX0lEKHBBZCwgUkZfUjAzLCBGcmVxSXRlbXMzMDIwW2luZGV4XS5LKTsKLQotCQkJCUFURV9SRl9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBSRl9SMDYsIChQVUNIQVIpJlJGVmFsdWUpOwotCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmIDB4RkMpIHwgRnJlcUl0ZW1zMzAyMFtpbmRleF0uUjsKLQkJCQlBVEVfUkZfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIFJGX1IwNiwgKFVDSEFSKVJGVmFsdWUpOwotCi0JCQkJLy8gU2V0IFR4IFBvd2VyLgotCQkJCUFURV9SRl9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBSRl9SMTIsIChQVUNIQVIpJlJGVmFsdWUpOwotCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmIDB4RTApIHwgVHhQd2VyOwotCQkJCUFURV9SRl9JT19XUklURThfQllfUkVHX0lEKHBBZCwgUkZfUjEyLCAoVUNIQVIpUkZWYWx1ZSk7Ci0KLQkJCQkvLyBTZXQgUkYgb2Zmc2V0LgotCQkJCUFURV9SRl9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBSRl9SMjMsIChQVUNIQVIpJlJGVmFsdWUpOwotCQkJCS8vMjAwOC8wOC8wNjogS0ggbW9kaWZpZWQgInBBZC0+UkZGcmVxT2Zmc2V0IiB0byAicEFkLT5hdGUuUkZGcmVxT2Zmc2V0IgotCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmIDB4ODApIHwgcEFkLT5hdGUuUkZGcmVxT2Zmc2V0OwotCQkJCUFURV9SRl9JT19XUklURThfQllfUkVHX0lEKHBBZCwgUkZfUjIzLCAoVUNIQVIpUkZWYWx1ZSk7Ci0KLQkJCQkvLyBTZXQgQlcuCi0JCQkJaWYgKHBBZC0+YXRlLlR4V0kuQlcgPT0gQldfNDApCi0JCQkJewotCQkJCQlSRlZhbHVlID0gcEFkLT5NbG1lLkNhbGlCVzQwUmZSMjQ7Ci0vLwkJCQkJRElTQUJMRV8xMU5fQ0hFQ0socEFkKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJUkZWYWx1ZSA9IHBBZC0+TWxtZS5DYWxpQlcyMFJmUjI0OwotCQkJCX0KLQkJCQlBVEVfUkZfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIFJGX1IyNCwgKFVDSEFSKVJGVmFsdWUpOwotCi0JCQkJLy8gRW5hYmxlIFJGIHR1bmluZwotCQkJCUFURV9SRl9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBSRl9SMDcsIChQVUNIQVIpJlJGVmFsdWUpOwotCQkJCVJGVmFsdWUgPSBSRlZhbHVlIHwgMHgxOwotCQkJCUFURV9SRl9JT19XUklURThfQllfUkVHX0lEKHBBZCwgUkZfUjA3LCAoVUNIQVIpUkZWYWx1ZSk7Ci0KLQkJCQkvLyBsYXRjaCBjaGFubmVsIGZvciBmdXR1cmUgdXNhZ2UKLQkJCQlwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPSBDaGFubmVsOwotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTd2l0Y2hDaGFubmVsIyVkKFJGPSVkLCBQd3IwPSVkLCBQd3IxPSVkLCAlZFQpLCBOPTB4JTAyWCwgSz0weCUwMlgsIFI9MHglMDJYXG4iLAotCQkJQ2hhbm5lbCwKLQkJCXBBZC0+UmZJY1R5cGUsCi0JCQlUeFB3ZXIsCi0JCQlUeFB3ZXIyLAotCQkJcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwKLQkJCUZyZXFJdGVtczMwMjBbaW5kZXhdLk4sCi0JCQlGcmVxSXRlbXMzMDIwW2luZGV4XS5LLAotCQkJRnJlcUl0ZW1zMzAyMFtpbmRleF0uUikpOwotCX0KLQllbHNlCi0vLzIwMDgvMDcvMTA6S0ggYWRkIHRvIHN1cHBvcnQgMzA3MCBBVEUtLT4KLSNlbmRpZiAvLyBSVDMweHggLy8KLQl7Ci0JCS8qIFJUMjh4eCAqLwotCQlSRlJlZ1RhYmxlID0gUkYyODUwUmVnVGFibGU7Ci0KLQkJc3dpdGNoIChwQWQtPlJmSWNUeXBlKQotCQl7Ci0JCQkvKiBCdXQgb25seSAyODUwIGFuZCAyNzUwIHN1cHBvcnQgNS41R0h6IGJhbmQuLi4gKi8KLQkJCWNhc2UgUkZJQ18yODIwOgotCQkJY2FzZSBSRklDXzI4NTA6Ci0JCQljYXNlIFJGSUNfMjcyMDoKLQkJCWNhc2UgUkZJQ18yNzUwOgotCi0JCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX09GXzI4NTBfQ0hOTDsgaW5kZXgrKykKLQkJCQl7Ci0JCQkJCWlmIChDaGFubmVsID09IFJGUmVnVGFibGVbaW5kZXhdLkNoYW5uZWwpCi0JCQkJCXsKLQkJCQkJCVIyID0gUkZSZWdUYWJsZVtpbmRleF0uUjI7Ci0KLQkJCQkJCS8vIElmIFRYIHBhdGggaXMgMSwgYml0IDE0ID0gMTsKLQkJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCi0JCQkJCQl7Ci0JCQkJCQkJUjIgfD0gMHg0MDAwOwotCQkJCQkJfQotCi0JCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQotCQkJCQkJewotCQkJCQkJCXN3aXRjaCAocEFkLT5hdGUuUnhBbnRlbm5hU2VsKQotCQkJCQkJCXsKLQkJCQkJCQkJY2FzZSAxOgotCQkJCQkJCQkJUjIgfD0gMHgyMDA0MDsKLQkJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOwotCQkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNDsKLQkJCQkJCQkJCUJicFZhbHVlIHw9IDB4MDA7Ci0JCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQljYXNlIDI6Ci0JCQkJCQkJCQlSMiB8PSAweDEwMDQwOwotCQkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCYnBWYWx1ZSk7Ci0JCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OwotCQkJCQkJCQkJQmJwVmFsdWUgfD0gMHgwMTsKLQkJCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQmJwVmFsdWUpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJCQlSMiB8PSAweDQwOwotCQkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCYnBWYWx1ZSk7Ci0JCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OwotCQkJCQkJCQkJLyogT25seSBlbmFibGUgdHdvIEFudGVubmEgdG8gcmVjZWl2ZS4gKi8KLQkJCQkJCQkJCUJicFZhbHVlIHw9IDB4MDg7Ci0JCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKLQkJCQkJCXsKLQkJCQkJCQkvLyB3cml0ZSAxIHRvIG9mZiBSeFBhdGgKLQkJCQkJCQlSMiB8PSAweDIwMDQwOwotCQkJCQkJfQotCi0JCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKQotCQkJCQkJewotCQkJCQkJCWlmIChwQWQtPmF0ZS5UeEFudGVubmFTZWwgPT0gMSkKLQkJCQkJCQl7Ci0JCQkJCQkJCS8vIElmIFRYIEFudGVubmEgc2VsZWN0IGlzIDEgLCBiaXQgMTQgPSAxOyBEaXNhYmxlIEFudCAyCi0JCQkJCQkJCVIyIHw9IDB4NDAwMDsKLQkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZCYnBWYWx1ZSk7Ci0JCQkJCQkJCUJicFZhbHVlICY9IDB4RTc7CQkvLyAxMTEwMDExMUIKLQkJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCYnBWYWx1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYgKHBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9PSAyKQotCQkJCQkJCXsKLQkJCQkJCQkJLy8gSWYgVFggQW50ZW5uYSBzZWxlY3QgaXMgMiAsIGJpdCAxNSA9IDE7IERpc2FibGUgQW50IDEKLQkJCQkJCQkJUjIgfD0gMHg4MDAwOwotCQkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJicFZhbHVlKTsKLQkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNzsKLQkJCQkJCQkJQmJwVmFsdWUgfD0gMHgwODsKLQkJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCYnBWYWx1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UKLQkJCQkJCQl7Ci0JCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmQmJwVmFsdWUpOwotCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU3OwotCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDEwOwotCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIEJicFZhbHVlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKQotCQkJCQkJewotCQkJCQkJCXN3aXRjaCAocEFkLT5hdGUuUnhBbnRlbm5hU2VsKQotCQkJCQkJCXsKLQkJCQkJCQkJY2FzZSAxOgotCQkJCQkJCQkJUjIgfD0gMHgyMDA0MDsKLQkJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOwotCQkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNDsKLQkJCQkJCQkJCUJicFZhbHVlIHw9IDB4MDA7Ci0JCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQljYXNlIDI6Ci0JCQkJCQkJCQlSMiB8PSAweDEwMDQwOwotCQkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCYnBWYWx1ZSk7Ci0JCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OwotCQkJCQkJCQkJQmJwVmFsdWUgfD0gMHgwMTsKLQkJCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQmJwVmFsdWUpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCWNhc2UgMzoKLQkJCQkJCQkJCVIyIHw9IDB4MzAwMDA7Ci0JCQkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJicFZhbHVlKTsKLQkJCQkJCQkJCUJicFZhbHVlICY9IDB4RTQ7Ci0JCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDAyOwotCQkJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCYnBWYWx1ZSk7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOwotCQkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNDsKLQkJCQkJCQkJCUJicFZhbHVlIHw9IDB4MTA7Ci0JCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJaWYgKENoYW5uZWwgPiAxNCkKLQkJCQkJCXsKLQkJCQkJCQkvLyBpbml0aWFsaXplIFIzLCBSNAotCQkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmZmYzFmZik7Ci0JCQkJCQkJUjQgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjQgJiAofjB4MDAxZjg3YzApKSB8IChwQWQtPmF0ZS5SRkZyZXFPZmZzZXQgPDwgMTUpOwotCi0JCSAgICAgICAgICAgICAgICAgICAgLyoKLQkJCSAgICAgICAgICAgICAgICAgICAgQWNjb3JkaW5nIHRoZSBSb3J5J3Mgc3VnZ2VzdGlvbiB0byBzb2x2ZSB0aGUgbWlkZGxlIHJhbmdlIGlzc3VlLgotCi0JCQkJCQkJCTUuNUcgYmFuZCBwb3dlciByYW5nZSA6IDB4Rjl+MFgwRiwgVFgwIFJlZzMgYml0OS9UWDEgUmVnNCBiaXQ2PSIwIgotCQkJCQkJCQkJCQkJCQltZWFucyB0aGUgVFggcG93ZXIgcmVkdWNlIDdkQi4KLQkJCQkJCQkqLwotCQkJCQkJCS8vIFIzCi0JCQkJCQkJaWYgKChUeFB3ZXIgPj0gLTcpICYmIChUeFB3ZXIgPCAwKSkKLQkJCQkJCQl7Ci0JCQkJCQkJCVR4UHdlciA9ICg3K1R4UHdlcik7Ci0JCQkJCQkJCVR4UHdlciA9IChUeFB3ZXIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyKTsKLQkJCQkJCQkJUjMgfD0gKFR4UHdlciA8PCAxMCk7Ci0JCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURUFzaWNTd2l0Y2hDaGFubmVsOiBUeFB3ZXI9JWQgXG4iLCBUeFB3ZXIpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZQotCQkJCQkJCXsKLQkJCQkJCQkJVHhQd2VyID0gKFR4UHdlciA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIpOwotCQkJCQkJCQlSMyB8PSAoVHhQd2VyIDw8IDEwKSB8ICgxIDw8IDkpOwotCQkJCQkJCX0KLQotCQkJCQkJCS8vIFI0Ci0JCQkJCQkJaWYgKChUeFB3ZXIyID49IC03KSAmJiAoVHhQd2VyMiA8IDApKQotCQkJCQkJCXsKLQkJCQkJCQkJVHhQd2VyMiA9ICg3K1R4UHdlcjIpOwotCQkJCQkJCQlUeFB3ZXIyID0gKFR4UHdlcjIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyMik7Ci0JCQkJCQkJCVI0IHw9IChUeFB3ZXIyIDw8IDcpOwotCQkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEVBc2ljU3dpdGNoQ2hhbm5lbDogVHhQd2VyMj0lZCBcbiIsIFR4UHdlcjIpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZQotCQkJCQkJCXsKLQkJCQkJCQkJVHhQd2VyMiA9IChUeFB3ZXIyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcjIpOwotCQkJCQkJCQlSNCB8PSAoVHhQd2VyMiA8PCA3KSB8ICgxIDw8IDYpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQkvLyBTZXQgVFggcG93ZXIwLgotCQkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmZmYzFmZikgfCAoVHhQd2VyIDw8IDkpOwotCQkJCQkJCS8vIFNldCBmcmVxdWVuY3kgb2Zmc2V0IGFuZCBUWCBwb3dlcjEuCi0JCQkJCQkJUjQgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjQgJiAofjB4MDAxZjg3YzApKSB8IChwQWQtPmF0ZS5SRkZyZXFPZmZzZXQgPDwgMTUpIHwgKFR4UHdlcjIgPDw2KTsKLQkJCQkJCX0KLQotCQkJCQkJLy8gYmFzZWQgb24gQkJQIGN1cnJlbnQgbW9kZSBiZWZvcmUgY2hhbmdpbmcgUkYgY2hhbm5lbAotCQkJCQkJaWYgKHBBZC0+YXRlLlR4V0kuQlcgPT0gQldfNDApCi0JCQkJCQl7Ci0JCQkJCQkJUjQgfD0weDIwMDAwMDsKLQkJCQkJCX0KLQotCQkJCQkJLy8gVXBkYXRlIHZhcmlhYmxlcy4KLQkJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA9IENoYW5uZWw7Ci0JCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIxID0gUkZSZWdUYWJsZVtpbmRleF0uUjE7Ci0JCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIyID0gUjI7Ci0JCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gUjM7Ci0JCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlI0ID0gUjQ7Ci0KLQkJCQkJCVJ0bXBSZklvV3JpdGUocEFkKTsKLQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvLyBDaGFuZ2UgQkJQIHNldHRpbmcgZHVyaW5nIHN3aXRjaCBmcm9tIGEtPmcsIGctPmEKLQlpZiAoQ2hhbm5lbCA8PSAxNCkKLQl7Ci0JICAgIFVJTlQzMiBUeFBpbkNmZyA9IDB4MDAwNTBGMEE7Ly8gMjAwNy4xMC4wOSBieSBCcmlhbiA6IDB4MDAwNTA1MEEgPT0+IDB4MDAwNTBGMEEKLQotCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYyLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjMsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NCwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOwotCi0JCS8qIEZvciAxVC8yUiBjaGlwIG9ubHkuLi4gKi8KLQkgICAgaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckcpCi0JICAgIHsKLQkgICAgICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4NjIpOwotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgewotCSAgICAgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHg4NCk7Ci0JICAgIH0KLQotICAgICAgICAvLyBBY2NvcmRpbmcgdGhlIFJvcnkncyBzdWdnZXN0aW9uIHRvIHNvbHZlIHRoZSBtaWRkbGUgcmFuZ2UgaXNzdWUuCi0JCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I4NiwgJkJicFZhbHVlKTsvLyBtYXkgYmUgcmVtb3ZlZCBmb3IgUlQzNXh4ICsrCi0KLQkJQVNTRVJUKChCYnBWYWx1ZSA9PSAweDAwKSk7Ci0JCWlmICgoQmJwVmFsdWUgIT0gMHgwMCkpCi0JCXsKLQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODYsIDB4MDApOwotCQl9Ly8gbWF5IGJlIHJlbW92ZWQgZm9yIFJUMzV4eCAtLQotCi0JCS8vIDUuNSBHSHogYmFuZCBzZWxlY3Rpb24gUElOLCBiaXQxIGFuZCBiaXQyIGFyZSBjb21wbGVtZW50Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZWYWx1ZSk7Ci0JCVZhbHVlICY9ICh+MHg2KTsKLQkJVmFsdWUgfD0gKDB4MDQpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgVmFsdWUpOwotCi0gICAgICAgIC8vIFR1cm4gb2ZmIHVudXNlZCBQQSBvciBMTkEgd2hlbiBvbmx5IDFUIG9yIDFSLgotCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQotCQl7Ci0JCQlUeFBpbkNmZyAmPSAweEZGRkZGRkYzOwotCQl9Ci0JCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCi0JCXsKLQkJCVR4UGluQ2ZnICY9IDB4RkZGRkYzRkY7Ci0JCX0KLQotCQkvLyBjYWxpYnJhdGlvbiBwb3dlciB1bmJhbGFuY2UgaXNzdWVzCi0JCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpCi0JCXsKLQkJCWlmIChwQWQtPmF0ZS5UeEFudGVubmFTZWwgPT0gMSkKLQkJCXsKLQkJCQlUeFBpbkNmZyAmPSAweEZGRkZGRkY3OwotCQkJfQotCQkJZWxzZSBpZiAocEFkLT5hdGUuVHhBbnRlbm5hU2VsID09IDIpCi0JCQl7Ci0JCQkJVHhQaW5DZmcgJj0gMHhGRkZGRkZGRDsKLQkJCX0KLQkJfQotCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKLQl9Ci0JZWxzZQotCXsKLQkgICAgVUlOVDMyCVR4UGluQ2ZnID0gMHgwMDA1MEYwNTsvLyAyMDA3LjEwLjA5IGJ5IEJyaWFuIDogMHgwMDA1MDUwNSA9PT4gMHgwMDA1MEYwNQotCi0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjIsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MywgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOwotCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY0LCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4RjIpOwotCi0gICAgICAgIC8vIEFjY29yZGluZyB0aGUgUm9yeSdzIHN1Z2dlc3Rpb24gdG8gc29sdmUgdGhlIG1pZGRsZSByYW5nZSBpc3N1ZS4KLQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg2LCAmQmJwVmFsdWUpOy8vIG1heSBiZSByZW1vdmVkIGZvciBSVDM1eHggKysKLQotCQlBU1NFUlQoKEJicFZhbHVlID09IDB4MDApKTsKLQkJaWYgKChCYnBWYWx1ZSAhPSAweDAwKSkKLQkJewotCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4NiwgMHgwMCk7Ci0JCX0KLQotCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SOTEsICZCYnBWYWx1ZSk7Ci0JCUFTU0VSVCgoQmJwVmFsdWUgPT0gMHgwNCkpOwotCi0JCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I5MiwgJkJicFZhbHVlKTsKLQkJQVNTRVJUKChCYnBWYWx1ZSA9PSAweDAwKSk7Ly8gbWF5IGJlIHJlbW92ZWQgZm9yIFJUMzV4eCAtLQotCi0JCS8vIDUuNSBHSHogYmFuZCBzZWxlY3Rpb24gUElOLCBiaXQxIGFuZCBiaXQyIGFyZSBjb21wbGVtZW50Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZWYWx1ZSk7Ci0JCVZhbHVlICY9ICh+MHg2KTsKLQkJVmFsdWUgfD0gKDB4MDIpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgVmFsdWUpOwotCi0JCS8vIFR1cm4gb2ZmIHVudXNlZCBQQSBvciBMTkEgd2hlbiBvbmx5IDFUIG9yIDFSLgotCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQotCQl7Ci0JCQlUeFBpbkNmZyAmPSAweEZGRkZGRkYzOwotCQl9Ci0JCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCi0JCXsKLQkJCVR4UGluQ2ZnICY9IDB4RkZGRkYzRkY7Ci0JCX0KLQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QSU5fQ0ZHLCBUeFBpbkNmZyk7Ci0JfQotCi0KLSAgICAvLyBSNjYgc2hvdWxkIGJlIHNldCBhY2NvcmRpbmcgdG8gQ2hhbm5lbCBhbmQgdXNlIDIwTUh6IHdoZW4gc2Nhbm5pbmcKLQlpZiAoQ2hhbm5lbCA8PSAxNCkKLQl7Ci0JCS8vIEJHIGJhbmQKLQkJUjY2ID0gMHgyRSArIEdFVF9MTkFfR0FJTihwQWQpOwotCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOwotCX0KLQllbHNlCi0JewotCQkvLyA1LjUgR0h6IGJhbmQKLQkJaWYgKHBBZC0+YXRlLlR4V0kuQlcgPT0gQldfMjApCi0JCXsKLQkJCVI2NiA9IChVQ0hBUikoMHgzMiArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zKTsKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVI2NiA9IChVQ0hBUikoMHgzQSArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zKTsKLQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7Ci0JCX0KLQl9Ci0KLQkvKgotCQlPbiAxMUEsIFdlIHNob3VsZCBkZWxheSBhbmQgd2FpdCBSRi9CQlAgdG8gYmUgc3RhYmxlCi0JCWFuZCB0aGUgYXBwcm9wcmlhdGUgdGltZSBzaG91bGQgYmUgMTAwMCBtaWNybyBzZWNvbmRzLgotCi0JCTIwMDUvMDYvMDUgLSBPbiAxMUcsIFdlIGFsc28gbmVlZCB0aGlzIGRlbGF5IHRpbWUuIE90aGVyd2lzZSBpdCdzIGRpZmZpY3VsdCB0byBwYXNzIHRoZSBXSFFMLgotCSovCi0JUlRNUHVzZWNEZWxheSgxMDAwKTsKLQotI2lmbmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKLQlpZiAoQ2hhbm5lbCA+IDE0KQotCXsKLQkJLy8gV2hlbiA1LjVHSHogYmFuZCB0aGUgTFNCIG9mIFR4UHdyIHdpbGwgYmUgdXNlZCB0byByZWR1Y2VkIDdkQiBvciBub3QuCi0JCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaENoYW5uZWwjJWQoUkY9JWQsICVkVCkgdG8gLCBSMT0weCUwOGx4LCBSMj0weCUwOGx4LCBSMz0weCUwOGx4LCBSND0weCUwOGx4XG4iLAotCQkJCQkJCQkgIENoYW5uZWwsCi0JCQkJCQkJCSAgcEFkLT5SZkljVHlwZSwKLQkJCQkJCQkJICBwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoLAotCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjEsCi0JCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMiwKLQkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIzLAotCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpKTsKLQl9Ci0JZWxzZQotCXsKLQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3dpdGNoQ2hhbm5lbCMlZChSRj0lZCwgUHdyMD0ldSwgUHdyMT0ldSwgJWRUKSB0byAsIFIxPTB4JTA4bHgsIFIyPTB4JTA4bHgsIFIzPTB4JTA4bHgsIFI0PTB4JTA4bHhcbiIsCi0JCQkJCQkJCSAgQ2hhbm5lbCwKLQkJCQkJCQkJICBwQWQtPlJmSWNUeXBlLAotCQkJCQkJCQkgIChSMyAmIDB4MDAwMDNlMDApID4+IDksCi0JCQkJCQkJCSAgKFI0ICYgMHgwMDAwMDdjMCkgPj4gNiwKLQkJCQkJCQkJICBwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoLAotCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjEsCi0JCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMiwKLQkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIzLAotCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpKTsKLSAgICB9Ci0jZW5kaWYgLy8gUlRNUF9SRl9SV19TVVBQT1JUIC8vCi19Ci0KLQotCi0vKiBJbiBmYWN0LCBubyBvbmUgd2lsbCBjYWxsIHRoaXMgcm91dGluZSBzbyBmYXIgISAqLwotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJR2l2ZXMgQ0NLIFRYIHJhdGUgMiBtb3JlIGRCIFRYIHBvd2VyLgotCQlUaGlzIHJvdXRpbmUgd29ya3Mgb25seSBpbiBBVEUgbW9kZS4KLQotCQljYWxjdWxhdGUgZGVzaXJlZCBUeCBwb3dlciBpbiBSRiBSMy5UeDB+NSwJc2hvdWxkIGNvbnNpZGVyIC0KLQkJMC4gaWYgY3VycmVudCByYWRpbyBpcyBhIG5vaXN5IGVudmlyb25tZW50IChwQWQtPkRyc0NvdW50ZXJzLmZOb2lzeUVudmlyb25tZW50KQotCQkxLiBUeFBvd2VyUGVyY2VudGFnZQotCQkyLiBhdXRvIGNhbGlicmF0aW9uIGJhc2VkIG9uIFRTU0kgZmVlZGJhY2sKLQkJMy4gZXh0cmEgMiBkYiBmb3IgQ0NLCi0JCTQuIC0xMCBkYiB1cG9uIHZlcnktc2hvcnQgZGlzdGFuY2UgKEF2Z1JTU0kgPj0gLTQwZGIpIHRvIEFQCi0KLQlOT1RFOiBTaW5jZSB0aGlzIHJvdXRpbmUgcmVxdWlyZXMgdGhlIHZhbHVlIG9mIChwQWQtPkRyc0NvdW50ZXJzLmZOb2lzeUVudmlyb25tZW50KSwKLQkJaXQgc2hvdWxkIGJlIGNhbGxlZCBBRlRFUiBNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZygpCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQVRFQXNpY0FkanVzdFR4UG93ZXIoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JSU5UCQkJaSwgajsKLQlDSEFSCQlEZWx0YVB3ciA9IDA7Ci0JQk9PTEVBTgkJYkF1dG9UeEFnYyA9IEZBTFNFOwotCVVDSEFSCQlUc3NpUmVmLCAqcFRzc2lNaW51c0JvdW5kYXJ5LCAqcFRzc2lQbHVzQm91bmRhcnksIFR4QWdjU3RlcDsKLQlVQ0hBUgkJQmJwUjQ5ID0gMCwgaWR4OwotCVBDSEFSCQlwVHhBZ2NDb21wZW5zYXRlOwotCVVMT05HCQlUeFB3cls1XTsKLQlDSEFSCQlWYWx1ZTsKLQotCS8qIG5vIG9uZSBjYWxscyB0aGlzIHByb2NlZHVyZSBzbyBmYXIgKi8KLQlpZiAocEFkLT5hdGUuVHhXSS5CVyA9PSBCV180MCkKLQl7Ci0JCWlmIChwQWQtPmF0ZS5DaGFubmVsID4gMTQpCi0JCXsKLQkJCVR4UHdyWzBdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzBdOwotCQkJVHhQd3JbMV0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMV07Ci0JCQlUeFB3clsyXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFsyXTsKLQkJCVR4UHdyWzNdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzNdOwotCQkJVHhQd3JbNF0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbNF07Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlUeFB3clswXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFswXTsKLQkJCVR4UHdyWzFdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzFdOwotCQkJVHhQd3JbMl0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMl07Ci0JCQlUeFB3clszXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFszXTsKLQkJCVR4UHdyWzRdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzRdOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChwQWQtPmF0ZS5DaGFubmVsID4gMTQpCi0JCXsKLQkJCVR4UHdyWzBdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzBdOwotCQkJVHhQd3JbMV0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMV07Ci0JCQlUeFB3clsyXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFsyXTsKLQkJCVR4UHdyWzNdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzNdOwotCQkJVHhQd3JbNF0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbNF07Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlUeFB3clswXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFswXTsKLQkJCVR4UHdyWzFdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzFdOwotCQkJVHhQd3JbMl0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMl07Ci0JCQlUeFB3clszXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFszXTsKLQkJCVR4UHdyWzRdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzRdOwotCQl9Ci0JfQotCi0JLy8gVFggcG93ZXIgY29tcGVuc2F0aW9uIGZvciB0ZW1wZXJhdHVyZSB2YXJpYXRpb24gYmFzZWQgb24gVFNTSS4KLQkvLyBEbyBpdCBwZXIgNCBzZWNvbmRzLgotCWlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDQgPT0gMCkKLQl7Ci0JCWlmIChwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQotCQl7Ci0JCQkvKiBiZyBjaGFubmVsICovCi0JCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NHOwotCQkJVHNzaVJlZiAgICAgICAgICAgID0gcEFkLT5Uc3NpUmVmRzsKLQkJCXBUc3NpTWludXNCb3VuZGFyeSA9ICZwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1swXTsKLQkJCXBUc3NpUGx1c0JvdW5kYXJ5ICA9ICZwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzBdOwotCQkJVHhBZ2NTdGVwICAgICAgICAgID0gcEFkLT5UeEFnY1N0ZXBHOwotCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlRzsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8qIGEgY2hhbm5lbCAqLwotCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjQTsKLQkJCVRzc2lSZWYgICAgICAgICAgICA9IHBBZC0+VHNzaVJlZkE7Ci0JCQlwVHNzaU1pbnVzQm91bmRhcnkgPSAmcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMF07Ci0JCQlwVHNzaVBsdXNCb3VuZGFyeSAgPSAmcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVswXTsKLQkJCVR4QWdjU3RlcCAgICAgICAgICA9IHBBZC0+VHhBZ2NTdGVwQTsKLQkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUE7Ci0JCX0KLQotCQlpZiAoYkF1dG9UeEFnYykKLQkJewotCQkJLyogQmJwUjQ5IGlzIHVuc2lnbmVkIGNoYXIuICovCi0JCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNDksICZCYnBSNDkpOwotCi0JCQkvKiAocCkgVHNzaVBsdXNCb3VuZGFyeUdbMF0gPSAwID0gKG0pIFRzc2lNaW51c0JvdW5kYXJ5R1swXSAqLwotCQkJLyogY29tcGVuc2F0ZTogKzQgICAgICszICAgKzIgICArMSAgICAwICAgLTEgICAtMiAgIC0zICAgLTQgKiBzdGVwcyAqLwotCQkJLyogc3RlcCB2YWx1ZSBpcyBkZWZpbmVkIGluIHBBZC0+VHhBZ2NTdGVwRyBmb3IgdHggcG93ZXIgdmFsdWUgKi8KLQotCQkJLyogWzRdKzErWzRdICAgcDQgICAgIHAzICAgcDIgICBwMSAgIG8xICAgbTEgICBtMiAgIG0zICAgbTQgKi8KLQkJCS8qIGV4OiAgICAgICAgIDB4MDAgMHgxNSAweDI1IDB4NDUgMHg4OCAweEEwIDB4QjUgMHhEMCAweEYwCi0JCQkgICBhYm92ZSB2YWx1ZSBhcmUgZXhhbWluZWQgaW4gbWFzcyBmYWN0b3J5IHByb2R1Y3Rpb24gKi8KLQkJCS8qICAgICAgICAgICAgIFs0XSAgICBbM10gIFsyXSAgWzFdICBbMF0gIFsxXSAgWzJdICBbM10gIFs0XSAqLwotCi0JCQkvKiBwbHVzIGlzIDB4MTAgfiAweDQwLCBtaW51cyBpcyAweDYwIH4gMHg5MCAqLwotCQkJLyogaWYgdmFsdWUgaXMgYmV0d2VlbiBwMSB+IG8xIG9yIG8xIH4gczEsIG5vIG5lZWQgdG8gYWRqdXN0IHR4IHBvd2VyICovCi0JCQkvKiBpZiB2YWx1ZSBpcyAweDY1LCB0eCBwb3dlciB3aWxsIGJlIC09IFR4QWdjU3RlcCooMi0xKSAqLwotCi0JCQlpZiAoQmJwUjQ5ID4gcFRzc2lNaW51c0JvdW5kYXJ5WzFdKQotCQkJewotCQkJCS8vIFJlYWRpbmcgaXMgbGFyZ2VyIHRoYW4gdGhlIHJlZmVyZW5jZSB2YWx1ZS4KLQkJCQkvLyBDaGVjayBmb3IgaG93IGxhcmdlIHdlIG5lZWQgdG8gZGVjcmVhc2UgdGhlIFR4IHBvd2VyLgotCQkJCWZvciAoaWR4ID0gMTsgaWR4IDwgNTsgaWR4KyspCi0JCQkJewotCQkJCQkvLyBGb3VuZCB0aGUgcmFuZ2UuCi0JCQkJCWlmIChCYnBSNDkgPD0gcFRzc2lNaW51c0JvdW5kYXJ5W2lkeF0pCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQkvLyBUaGUgaW5kZXggaXMgdGhlIHN0ZXAgd2Ugc2hvdWxkIGRlY3JlYXNlLCBpZHggPSAwIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGVuc2F0ZS4KLS8vCQkJCWlmIChSMyA+IChVTE9ORykgKFR4QWdjU3RlcCAqIChpZHgtMSkpKQotCQkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IC0oVHhBZ2NTdGVwICogKGlkeC0xKSk7Ci0vLwkJCQllbHNlCi0vLwkJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSAtKChVQ0hBUilSMyk7Ci0KLQkJCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOwotCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tIFR4IFBvd2VyLCBCQlAgUjE9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9IC0lZFxuIiwKLQkJCQkJQmJwUjQ5LCBUc3NpUmVmLCBUeEFnY1N0ZXAsIGlkeC0xKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChCYnBSNDkgPCBwVHNzaVBsdXNCb3VuZGFyeVsxXSkKLQkJCXsKLQkJCQkvLyBSZWFkaW5nIGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVmZXJlbmNlIHZhbHVlLgotCQkJCS8vIENoZWNrIGZvciBob3cgbGFyZ2Ugd2UgbmVlZCB0byBpbmNyZWFzZSB0aGUgVHggcG93ZXIuCi0JCQkJZm9yIChpZHggPSAxOyBpZHggPCA1OyBpZHgrKykKLQkJCQl7Ci0JCQkJCS8vIEZvdW5kIHRoZSByYW5nZS4KLQkJCQkJaWYgKEJicFI0OSA+PSBwVHNzaVBsdXNCb3VuZGFyeVtpZHhdKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJLy8gVGhlIGluZGV4IGlzIHRoZSBzdGVwIHdlIHNob3VsZCBpbmNyZWFzZSwgaWR4ID0gMCBtZWFucyB0aGVyZSBpcyBub3RoaW5nIHRvIGNvbXBlbnNhdGUuCi0JCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSBUeEFnY1N0ZXAgKiAoaWR4LTEpOwotCQkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7Ci0JCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiKysgVHggUG93ZXIsIEJCUCBSMT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gKyVkXG4iLAotCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgaWR4LTEpKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IDA7Ci0JCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiICAgVHggUG93ZXIsIEJCUCBSMT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gKyVkXG4iLAotCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgMCkpOwotCQkJfQotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQotCQl7Ci0JCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NHOwotCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlRzsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0E7Ci0JCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVBOwotCQl9Ci0KLQkJaWYgKGJBdXRvVHhBZ2MpCi0JCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOwotCX0KLQotCS8qIENhbGN1bGF0ZSBkZWx0YSBwb3dlciBiYXNlZCBvbiB0aGUgcGVyY2VudGFnZSBzcGVjaWZpZWQgZnJvbSBVSS4gKi8KLQkvLyBFMlBST00gc2V0dGluZyBpcyBjYWxpYnJhdGVkIGZvciBtYXhpbXVtIFRYIHBvd2VyIChpLmUuIDEwMCUpCi0JLy8gV2UgbG93ZXIgVFggcG93ZXIgaGVyZSBhY2NvcmRpbmcgdG8gdGhlIHBlcmNlbnRhZ2Ugc3BlY2lmaWVkIGZyb20gVUkuCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID09IDB4ZmZmZmZmZmYpICAgICAgIC8vIEFVVE8gVFggUE9XRVIgY29udHJvbAotCQk7Ci0JZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA5MCkgIC8vIDkxIH4gMTAwJSAmIEFVVE8sIHRyZWF0IGFzIDEwMCUgaW4gdGVybXMgb2YgbVcKLQkJOwotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gNjApICAvLyA2MSB+IDkwJSwgdHJlYXQgYXMgNzUlIGluIHRlcm1zIG9mIG1XCi0JewotCQlEZWx0YVB3ciAtPSAxOwotCX0KLQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDMwKSAgLy8gMzEgfiA2MCUsIHRyZWF0IGFzIDUwJSBpbiB0ZXJtcyBvZiBtVwotCXsKLQkJRGVsdGFQd3IgLT0gMzsKLQl9Ci0JZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiAxNSkgIC8vIDE2IH4gMzAlLCB0cmVhdCBhcyAyNSUgaW4gdGVybXMgb2YgbVcKLQl7Ci0JCURlbHRhUHdyIC09IDY7Ci0JfQotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gOSkgICAvLyAxMCB+IDE1JSwgdHJlYXQgYXMgMTIuNSUgaW4gdGVybXMgb2YgbVcKLQl7Ci0JCURlbHRhUHdyIC09IDk7Ci0JfQotCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMCB+IDkgJSwgdHJlYXQgYXMgTUlOKH4zJSkgaW4gdGVybXMgb2YgbVcKLQl7Ci0JCURlbHRhUHdyIC09IDEyOwotCX0KLQotCS8qIFJlc2V0IGRpZmZlcmVudCBuZXcgdHggcG93ZXIgZm9yIGRpZmZlcmVudCBUWCByYXRlLiAqLwotCWZvciAoaT0wOyBpPDU7IGkrKykKLQl7Ci0JCWlmIChUeFB3cltpXSAhPSAweGZmZmZmZmZmKQotCQl7Ci0JCQlmb3IgKGo9MDsgajw4OyBqKyspCi0JCQl7Ci0JCQkJVmFsdWUgPSAoQ0hBUikoKFR4UHdyW2ldID4+IGoqNCkgJiAweDBGKTsgLyogMCB+IDE1ICovCi0KLQkJCQlpZiAoKFZhbHVlICsgRGVsdGFQd3IpIDwgMCkKLQkJCQl7Ci0JCQkJCVZhbHVlID0gMDsgLyogbWluICovCi0JCQkJfQotCQkJCWVsc2UgaWYgKChWYWx1ZSArIERlbHRhUHdyKSA+IDB4RikKLQkJCQl7Ci0JCQkJCVZhbHVlID0gMHhGOyAvKiBtYXggKi8KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJVmFsdWUgKz0gRGVsdGFQd3I7IC8qIHRlbXBlcmF0dXJlIGNvbXBlbnNhdGlvbiAqLwotCQkJCX0KLQotCQkJCS8qIGZpbGwgbmV3IHZhbHVlIHRvIENTUiBvZmZzZXQgKi8KLQkJCQlUeFB3cltpXSA9IChUeFB3cltpXSAmIH4oMHgwMDAwMDAwRiA8PCBqKjQpKSB8IChWYWx1ZSA8PCBqKjQpOwotCQkJfQotCi0JCQkvKiB3cml0ZSB0eCBwb3dlciB2YWx1ZSB0byBDU1IgKi8KLQkJCS8qIFRYX1BXUl9DRkdfMCAoOCB0eCByYXRlKSBmb3IJVFggcG93ZXIgZm9yIE9GRE0gMTJNLzE4TQotCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgT0ZETSA2TS85TQotCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgQ0NLNS41TS8xMU0KLQkJCQkJCQkJCQkJVFggcG93ZXIgZm9yIENDSzFNLzJNICovCi0JCQkvKiBUWF9QV1JfQ0ZHXzEgfiBUWF9QV1JfQ0ZHXzQgKi8KLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgVHhQd3JbaV0pOwotCi0KLQkJfQotCX0KLQotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlXcml0ZSBUeFdJIGZvciBBVEUgbW9kZS4KLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotI2lmZGVmIFJUTVBfTUFDX1BDSQotc3RhdGljIFZPSUQgQVRFV3JpdGVUeFdJKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBUWFdJX1NUUlVDCXBPdXRUeFdJLAotCUlOCUJPT0xFQU4JCQlGUkFHLAotCUlOCUJPT0xFQU4JCQlDRkFDSywKLQlJTglCT09MRUFOCQkJSW5zVGltZXN0YW1wLAotCUlOCUJPT0xFQU4JCQlBTVBEVSwKLQlJTglCT09MRUFOCQkJQWNrLAotCUlOCUJPT0xFQU4JCQlOU2VxLAkJLy8gSFcgbmV3IGEgc2VxdWVuY2UuCi0JSU4JVUNIQVIJCQlCQVNpemUsCi0JSU4JVUNIQVIJCQlXQ0lELAotCUlOCVVMT05HCQkJTGVuZ3RoLAotCUlOCVVDSEFSCQkJUElELAotCUlOCVVDSEFSCQkJVElELAotCUlOCVVDSEFSCQkJVHhSYXRlLAotCUlOCVVDSEFSCQkJVHhvcG1vZGUsCi0JSU4JQk9PTEVBTgkJCUNmQWNrLAotCUlOCUhUVFJBTlNNSVRfU0VUVElORwkqcFRyYW5zbWl0KQotewotCVRYV0lfU1RSVUMJCVR4V0k7Ci0JUFRYV0lfU1RSVUMJcFR4V0k7Ci0KLQkvLwotCS8vIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLgotCS8vIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcwotCS8vCi0JT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKLQlOZGlzWmVyb01lbW9yeSgmVHhXSSwgVFhXSV9TSVpFKTsKLQlwVHhXSSA9ICZUeFdJOwotCi0JcFR4V0ktPkZSQUc9IEZSQUc7Ci0KLQlwVHhXSS0+Q0ZBQ0sgPSBDRkFDSzsKLQlwVHhXSS0+VFM9IEluc1RpbWVzdGFtcDsKLQlwVHhXSS0+QU1QRFUgPSBBTVBEVTsKLQlwVHhXSS0+QUNLID0gQWNrOwotCXBUeFdJLT50eG9wPSBUeG9wbW9kZTsKLQotCXBUeFdJLT5OU0VRID0gTlNlcTsKLQotCS8vIEpvaG4gdHVuZSB0aGUgcGVyZm9ybWFjZSB3aXRoIEludGVsIENsaWVudCBpbiAyMCBNSHogcGVyZm9ybWFuY2UKLQlpZiAoIEJBU2l6ZSA+NyApCi0JCUJBU2l6ZSA9NzsKLQotCXBUeFdJLT5CQVdpblNpemUgPSBCQVNpemU7Ci0JcFR4V0ktPldpcmVsZXNzQ2xpSUQgPSBXQ0lEOwotCXBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPSBMZW5ndGg7Ci0JcFR4V0ktPlBhY2tldElkID0gUElEOwotCi0JLy8gSWYgQ0NLIG9yIE9GRE0sIEJXIG11c3QgYmUgMjAKLQlwVHhXSS0+QlcgPSAocFRyYW5zbWl0LT5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkgPyAoQldfMjApIDogKHBUcmFuc21pdC0+ZmllbGQuQlcpOwotCXBUeFdJLT5TaG9ydEdJID0gcFRyYW5zbWl0LT5maWVsZC5TaG9ydEdJOwotCXBUeFdJLT5TVEJDID0gcFRyYW5zbWl0LT5maWVsZC5TVEJDOwotCi0JcFR4V0ktPk1DUyA9IHBUcmFuc21pdC0+ZmllbGQuTUNTOwotCXBUeFdJLT5QSFlNT0RFID0gcFRyYW5zbWl0LT5maWVsZC5NT0RFOwotCXBUeFdJLT5DRkFDSyA9IENmQWNrOwotCXBUeFdJLT5NSU1PcHMgPSAwOwotCXBUeFdJLT5NcGR1RGVuc2l0eSA9IDA7Ci0KLQlwVHhXSS0+UGFja2V0SWQgPSBwVHhXSS0+TUNTOwotCU5kaXNNb3ZlTWVtb3J5KHBPdXRUeFdJLCAmVHhXSSwgc2l6ZW9mKFRYV0lfU1RSVUMpKTsKLQotICAgIHJldHVybjsKLX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJRGlzYWJsZSBwcm90ZWN0aW9uIGZvciBBVEUuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEFURURpc2FibGVBc2ljUHJvdGVjdCgKLQlJTgkJUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JUFJPVF9DRkdfU1RSVUMJUHJvdENmZywgUHJvdENmZzQ7Ci0JVUlOVDMyIFByb3RlY3RbNl07Ci0JVVNIT1JUCQkJb2Zmc2V0OwotCVVDSEFSCQkJaTsKLQlVSU5UMzIgTWFjUmVnID0gMDsKLQotCS8vIENvbmZpZyBBU0lDIFJUUyB0aHJlc2hvbGQgcmVnaXN0ZXIKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1JUU19DRkcsICZNYWNSZWcpOwotCU1hY1JlZyAmPSAweEZGMDAwMEZGOwotCU1hY1JlZyB8PSAocEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkIDw8IDgpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1JUU19DRkcsIE1hY1JlZyk7Ci0KLQkvLyBJbml0aWFsIGNvbW1vbiBwcm90ZWN0aW9uIHNldHRpbmdzCi0JUlRNUFplcm9NZW1vcnkoUHJvdGVjdCwgc2l6ZW9mKFByb3RlY3QpKTsKLQlQcm90Q2ZnNC53b3JkID0gMDsKLQlQcm90Q2ZnLndvcmQgPSAwOwotCVByb3RDZmcuZmllbGQuVHhvcEFsbG93R0Y0MCA9IDE7Ci0JUHJvdENmZy5maWVsZC5UeG9wQWxsb3dHRjIwID0gMTsKLQlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd01NNDAgPSAxOwotCVByb3RDZmcuZmllbGQuVHhvcEFsbG93TU0yMCA9IDE7Ci0JUHJvdENmZy5maWVsZC5UeG9wQWxsb3dPZmRtID0gMTsKLQlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0NjayA9IDE7Ci0JUHJvdENmZy5maWVsZC5SVFNUaEVuID0gMTsKLQlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOwotCi0JLy8gSGFuZGxlIGxlZ2FjeShCL0cpIHByb3RlY3Rpb24KLQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RSYXRlID0gcEFkLT5Db21tb25DZmcuUnRzUmF0ZTsKLQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gMDsKLQlQcm90ZWN0WzBdID0gUHJvdENmZy53b3JkOwotCVByb3RlY3RbMV0gPSBQcm90Q2ZnLndvcmQ7Ci0KLQkvLyBOTyBQUk9URUNUCi0JLy8gMS5BbGwgU1RBcyBpbiB0aGUgQlNTIGFyZSAyMC80MCBNSHogSFQKLQkvLyAyLiBpbiBhaSAyMC80ME1IeiBCU1MKLQkvLyAzLiBhbGwgU1RBcyBhcmUgMjBNSHogaW4gYSAyME1IeiBCU1MKLQkvLyBQdXJlIEhULiBubyBwcm90ZWN0aW9uLgotCi0JLy8gTU0yMF9QUk9UX0NGRwotCS8vCVJlc2VydmVkICgzMToyNykKLQkvLwlQUk9UX1RYT1AoMjU6MjApIC0tIDAxMDExMQotCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQotCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQotCS8vCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkKLQlQcm90ZWN0WzJdID0gMHgwMTc0NDAwNDsKLQotCS8vIE1NNDBfUFJPVF9DRkcKLQkvLwlSZXNlcnZlZCAoMzE6MjcpCi0JLy8JUFJPVF9UWE9QKDI1OjIwKSAtLSAxMTExMTEKLQkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKLQkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKLQkvLwlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDA4NCAoZHVwbGljYXRlIE9GRE0gMjRNKQotCVByb3RlY3RbM10gPSAweDAzZjQ0MDg0OwotCi0JLy8gQ0YyMF9QUk9UX0NGRwotCS8vCVJlc2VydmVkICgzMToyNykKLQkvLwlQUk9UX1RYT1AoMjU6MjApIC0tIDAxMDExMQotCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQotCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQotCS8vCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkKLQlQcm90ZWN0WzRdID0gMHgwMTc0NDAwNDsKLQotCS8vIENGNDBfUFJPVF9DRkcKLQkvLwlSZXNlcnZlZCAoMzE6MjcpCi0JLy8JUFJPVF9UWE9QKDI1OjIwKSAtLSAxMTExMTEKLQkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKLQkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKLQkvLwlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDA4NCAoZHVwbGljYXRlIE9GRE0gMjRNKQotCVByb3RlY3RbNV0gPSAweDAzZjQ0MDg0OwotCi0JcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IEZBTFNFOwotCi0Jb2Zmc2V0ID0gQ0NLX1BST1RfQ0ZHOwotCWZvciAoaSA9IDA7aSA8IDY7aSsrKQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQgKyBpKjQsIFByb3RlY3RbaV0pOwotCi19Ci0KLQotCi0KLS8qIFRoZXJlIGFyZSB0d28gd2F5cyB0byBjb252ZXJ0IFJzc2kgKi8KLS8qIHRoZSB3YXkgdXNlZCB3aXRoIEdFVF9MTkFfR0FJTigpICovCi1DSEFSIEFURUNvbnZlcnRUb1Jzc2koCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JQ0hBUglSc3NpLAotCUlOICBVQ0hBUiAgIFJzc2lOdW1iZXIpCi17Ci0JVUNIQVIJUnNzaU9mZnNldCwgTE5BR2FpbjsKLQotCS8vIFJzc2kgZXF1YWxzIHRvIHplcm8gc2hvdWxkIGJlIGFuIGludmFsaWQgdmFsdWUKLQlpZiAoUnNzaSA9PSAwKQotCQlyZXR1cm4gLTk5OwotCi0JTE5BR2FpbiA9IEdFVF9MTkFfR0FJTihwQWQpOwotCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkKLQl7Ci0JCWlmIChSc3NpTnVtYmVyID09IDApCi0JCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDA7Ci0JCWVsc2UgaWYgKFJzc2lOdW1iZXIgPT0gMSkKLQkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MTsKLQkJZWxzZQotCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQyOwotCX0KLQllbHNlCi0JewotCQlpZiAoUnNzaU51bWJlciA9PSAwKQotCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MDsKLQkJZWxzZSBpZiAoUnNzaU51bWJlciA9PSAxKQotCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MTsKLQkJZWxzZQotCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MjsKLQl9Ci0KLQlyZXR1cm4gKC0xMiAtIFJzc2lPZmZzZXQgLSBMTkFHYWluIC0gUnNzaSk7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJU2V0IEphcGFuIGZpbHRlciBjb2VmZmljaWVudHMgaWYgbmVlZGVkLgotCU5vdGU6Ci0JCVRoaXMgcm91dGluZSBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbgotCQllbnRlcmluZyBUWEZSQU1FIG1vZGUgb3IgVFhDT05UIG1vZGUuCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyBWT0lEIFNldEphcGFuRmlsdGVyKAotCUlOCQlQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVQ0hBUgkJCUJicERhdGEgPSAwOwotCi0JLy8KLQkvLyBJZiBDaGFubmVsPTE0IGFuZCBCYW5kd2lkdGg9MjBNIGFuZCBNb2RlPUNDSywgc2V0IEJCUCBSNCBiaXQ1PTEKLQkvLyAoSmFwYW4gVHggZmlsdGVyIGNvZWZmaWNpZW50cyl3aGVuIChUWEZSQU1FIG9yIFRYQ09OVCkuCi0JLy8KLQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJicERhdGEpOwotCi0gICAgaWYgKChwQWQtPmF0ZS5UeFdJLlBIWU1PREUgPT0gTU9ERV9DQ0spICYmIChwQWQtPmF0ZS5DaGFubmVsID09IDE0KSAmJiAocEFkLT5hdGUuVHhXSS5CVyA9PSBCV18yMCkpCi0gICAgewotICAgICAgICBCYnBEYXRhIHw9IDB4MjA7ICAgIC8vIHR1cm4gb24KLSAgICAgICAgQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0SmFwYW5GaWx0ZXIhISFcbiIpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQkJQmJwRGF0YSAmPSAweGRmOyAgICAvLyB0dXJuIG9mZgotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbGVhckphcGFuRmlsdGVyISEhXG4iKSk7Ci0gICAgfQotCi0JQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCYnBEYXRhKTsKLX0KLQotCi1WT0lEIEFURVNhbXBsZVJzc2koCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gUFJYV0lfU1RSVUMJCXBSeFdJKQotewotCS8qIFRoZXJlIGFyZSB0d28gd2F5cyB0byBjb2xsZWN0IFJTU0kuICovCi0vLwlwQWQtPkxhc3RSeFJhdGUgPSAoVVNIT1JUKSgocFJ4V0ktPk1DUykgKyAocFJ4V0ktPkJXIDw8NykgKyAocFJ4V0ktPlNob3J0R0kgPDw4KSsgKHBSeFdJLT5QSFlNT0RFIDw8MTQpKSA7Ci0JaWYgKHBSeFdJLT5SU1NJMCAhPSAwKQotCXsKLQkJcEFkLT5hdGUuTGFzdFJzc2kwCT0gQVRFQ29udmVydFRvUnNzaShwQWQsIChDSEFSKSBwUnhXSS0+UlNTSTAsIFJTU0lfMCk7Ci0JCXBBZC0+YXRlLkF2Z1Jzc2kwWDgJPSAocEFkLT5hdGUuQXZnUnNzaTBYOCAtIHBBZC0+YXRlLkF2Z1Jzc2kwKSArIHBBZC0+YXRlLkxhc3RSc3NpMDsKLQkJcEFkLT5hdGUuQXZnUnNzaTAJPSBwQWQtPmF0ZS5BdmdSc3NpMFg4ID4+IDM7Ci0JfQotCWlmIChwUnhXSS0+UlNTSTEgIT0gMCkKLQl7Ci0JCXBBZC0+YXRlLkxhc3RSc3NpMQk9IEFURUNvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUikgcFJ4V0ktPlJTU0kxLCBSU1NJXzEpOwotCQlwQWQtPmF0ZS5BdmdSc3NpMVg4CT0gKHBBZC0+YXRlLkF2Z1Jzc2kxWDggLSBwQWQtPmF0ZS5BdmdSc3NpMSkgKyBwQWQtPmF0ZS5MYXN0UnNzaTE7Ci0JCXBBZC0+YXRlLkF2Z1Jzc2kxCT0gcEFkLT5hdGUuQXZnUnNzaTFYOCA+PiAzOwotCX0KLQlpZiAocFJ4V0ktPlJTU0kyICE9IDApCi0JewotCQlwQWQtPmF0ZS5MYXN0UnNzaTIJPSBBVEVDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpIHBSeFdJLT5SU1NJMiwgUlNTSV8yKTsKLQkJcEFkLT5hdGUuQXZnUnNzaTJYOAk9IChwQWQtPmF0ZS5BdmdSc3NpMlg4IC0gcEFkLT5hdGUuQXZnUnNzaTIpICsgcEFkLT5hdGUuTGFzdFJzc2kyOwotCQlwQWQtPmF0ZS5BdmdSc3NpMgk9IHBBZC0+YXRlLkF2Z1Jzc2kyWDggPj4gMzsKLQl9Ci0KLQlwQWQtPmF0ZS5MYXN0U05SMCA9IChDSEFSKShwUnhXSS0+U05SMCk7Ly8gQ0hBUiA9PT4gVUNIQVIgPwotCXBBZC0+YXRlLkxhc3RTTlIxID0gKENIQVIpKHBSeFdJLT5TTlIxKTsvLyBDSEFSID09PiBVQ0hBUiA/Ci0KLQlwQWQtPmF0ZS5OdW1PZkF2Z1Jzc2lTYW1wbGUgKys7Ci19Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotVk9JRCBSVE1QU3RhdGlvblN0b3AoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCi17Ci0vLwlCT09MRUFOICAgICAgIENhbmNlbGxlZDsKLQotICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBSVE1QU3RhdGlvblN0b3BcbiIpKTsKLQotCS8vIEZvciByeCBzdGF0aXN0aWNzLCB3ZSBuZWVkIHRvIGtlZXAgdGhpcyB0aW1lciBydW5uaW5nLgotLy8JUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwgICAgICAmQ2FuY2VsbGVkKTsKLQotICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBSVE1QU3RhdGlvblN0b3BcbiIpKTsKLX0KLQotCi1WT0lEIFJUTVBTdGF0aW9uU3RhcnQoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCi17Ci0gICAgQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFJUTVBTdGF0aW9uU3RhcnRcbiIpKTsKLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7Ci0KLQkvKiBXZSBkaWQgbm90IGNhbmNlbCB0aGlzIHRpbWVyIHdoZW4gZW50ZXJpbmcgQVRFIG1vZGUuICovCi0vLwlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5QZXJpb2RpY1RpbWVyLCBNTE1FX1RBU0tfRVhFQ19JTlRWKTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBSVE1QU3RhdGlvblN0YXJ0XG4iKSk7Ci19Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVNldHVwIEZyYW1lIGZvcm1hdC4KLQlOT1RFOgotCQlUaGlzIHJvdXRpbmUgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBBVEUgbW9kZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotI2lmZGVmIFJUTVBfTUFDX1BDSQotc3RhdGljIElOVCBBVEVTZXRVcEZyYW1lKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVJTlQzMiBUeElkeCkKLXsKLQlVSU5UIGo7Ci0JUFRYRF9TVFJVQyBwVHhEOwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSAgICBQVFhEX1NUUlVDICAgICAgcERlc3RUeEQ7Ci0gICAgVFhEX1NUUlVDICAgICAgIFR4RDsKLSNlbmRpZgotCVBORElTX1BBQ0tFVCBwUGFja2V0OwotCVBVQ0hBUiBwRGVzdDsKLQlQVk9JRCBBbGxvY1ZhOwotCU5ESVNfUEhZU0lDQUxfQUREUkVTUyBBbGxvY1BhOwotCUhUVFJBTlNNSVRfU0VUVElORwlUeEhUUGh5TW9kZTsKLQotCVBSVE1QX1RYX1JJTkcgcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tRSURfQUNfQkVdOwotCVBUWFdJX1NUUlVDIHBUeFdJID0gKFBUWFdJX1NUUlVDKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NWYTsKLQlQVUNIQVIgcERNQUhlYWRlckJ1ZlZBID0gKFBVQ0hBUikgcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7Ci0KLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotCVBIRUFERVJfODAyXzExCXBIZWFkZXI4MDIxMTsKLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotCi0JaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKLQl7Ci0JCS8vIGFsd2F5cyB1c2UgUUlEX0FDX0JFIGFuZCBGSUZPX0VEQ0EKLQotCQkvLyBmaWxsIFR4V0kKLQkJVHhIVFBoeU1vZGUuZmllbGQuQlcgPSBwQWQtPmF0ZS5UeFdJLkJXOwotCQlUeEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gcEFkLT5hdGUuVHhXSS5TaG9ydEdJOwotCQlUeEhUUGh5TW9kZS5maWVsZC5TVEJDID0gMDsKLQkJVHhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEFkLT5hdGUuVHhXSS5NQ1M7Ci0JCVR4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBwQWQtPmF0ZS5UeFdJLlBIWU1PREU7Ci0KLQkJQVRFV3JpdGVUeFdJKHBBZCwgcFR4V0ksIHBBZC0+YXRlLlR4V0kuRlJBRywgcEFkLT5hdGUuVHhXSS5DRkFDSywKLQkJCXBBZC0+YXRlLlR4V0kuVFMsICBwQWQtPmF0ZS5UeFdJLkFNUERVLCBwQWQtPmF0ZS5UeFdJLkFDSywgcEFkLT5hdGUuVHhXSS5OU0VRLAotCQkJcEFkLT5hdGUuVHhXSS5CQVdpblNpemUsIDAsIHBBZC0+YXRlLlR4V0kuTVBEVXRvdGFsQnl0ZUNvdW50LCBwQWQtPmF0ZS5UeFdJLlBhY2tldElkLCAwLCAwLAotCQkJcEFkLT5hdGUuVHhXSS50eG9wLypJRlNfSFRUWE9QKi8sIHBBZC0+YXRlLlR4V0kuQ0ZBQ0svKkZBTFNFKi8sICZUeEhUUGh5TW9kZSk7Ci0JfQotCWVsc2UKLQl7Ci0JCVR4SFRQaHlNb2RlLmZpZWxkLkJXID0gcEFkLT5hdGUuVHhXSS5CVzsKLQkJVHhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IHBBZC0+YXRlLlR4V0kuU2hvcnRHSTsKLQkJVHhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IDA7Ci0JCVR4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+YXRlLlR4V0kuTUNTOwotCQlUeEhUUGh5TW9kZS5maWVsZC5NT0RFID0gcEFkLT5hdGUuVHhXSS5QSFlNT0RFOwotCQlBVEVXcml0ZVR4V0kocEFkLCBwVHhXSSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgIEZBTFNFLCBGQUxTRSwgRkFMU0UsCi0JCQk0LCAwLCBwQWQtPmF0ZS5UeExlbmd0aCwgMCwgMCwgMCwgSUZTX0hUVFhPUCwgRkFMU0UsICZUeEhUUGh5TW9kZSk7Ci0JfQotCi0JLy8gZmlsbCA4MDIuMTEgaGVhZGVyCi0jaWZkZWYgUkFMSU5LXzI4eHhfUUEKLQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQotCXsKLQkJTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBK1RYV0lfU0laRSwgcEFkLT5hdGUuSGVhZGVyLCBwQWQtPmF0ZS5ITGVuKTsKLQl9Ci0JZWxzZQotI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCi0JewotCQlOZGlzTW92ZU1lbW9yeShwRE1BSGVhZGVyQnVmVkErVFhXSV9TSVpFLCBUZW1wbGF0ZUZyYW1lLCBMRU5HVEhfODAyXzExKTsKLQkJTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBK1RYV0lfU0laRSs0LCBwQWQtPmF0ZS5BZGRyMSwgRVRIX0xFTkdUSF9PRl9BRERSRVNTKTsKLQkJTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBK1RYV0lfU0laRSsxMCwgcEFkLT5hdGUuQWRkcjIsIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyk7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQStUWFdJX1NJWkUrMTYsIHBBZC0+YXRlLkFkZHIzLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOwotCX0KLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoKChQVUNIQVIpcERNQUhlYWRlckJ1ZlZBKStUWFdJX1NJWkUpLCBESVJfUkVBRCwgRkFMU0UpOwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLQotCS8qIGFsbG9jIGJ1ZmZlciBmb3IgcGF5bG9hZCAqLwotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0JaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKLQl7Ci0JCXBQYWNrZXQgPSBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIocEFkLCBwQWQtPmF0ZS5ETGVuICsgMHgxMDAsIEZBTFNFLCAmQWxsb2NWYSwgJkFsbG9jUGEpOwotCX0KLQllbHNlCi0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLQl7Ci0JCXBQYWNrZXQgPSBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIocEFkLCBwQWQtPmF0ZS5UeExlbmd0aCwgRkFMU0UsICZBbGxvY1ZhLCAmQWxsb2NQYSk7Ci0JfQotCi0JaWYgKHBQYWNrZXQgPT0gTlVMTCkKLQl7Ci0JCXBBZC0+YXRlLlR4Q291bnQgPSAwOwotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyBmYWlsIHRvIGFsbG9jIHBhY2tldCBzcGFjZS5cbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZXh0TmRpc1BhY2tldCA9IHBQYWNrZXQ7Ci0KLQlwRGVzdCA9IChQVUNIQVIpIEFsbG9jVmE7Ci0KLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCi0JewotCQlSVFBLVF9UT19PU1BLVChwUGFja2V0KS0+bGVuID0gcEFkLT5hdGUuRExlbjsKLQl9Ci0JZWxzZQotI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCi0JewotCQlSVFBLVF9UT19PU1BLVChwUGFja2V0KS0+bGVuID0gcEFkLT5hdGUuVHhMZW5ndGggLSBMRU5HVEhfODAyXzExOwotCX0KLQotCS8vIHByZXBhcmUgZnJhbWUgcGF5bG9hZAotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0JaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKLQl7Ci0JCS8vIGNvcHkgcGF0dGVybgotCQlpZiAoKHBBZC0+YXRlLlBMZW4gIT0gMCkpCi0JCXsKLQkJCWludCBqOwotCi0JCQlmb3IgKGogPSAwOyBqIDwgcEFkLT5hdGUuRExlbjsgais9cEFkLT5hdGUuUExlbikKLQkJCXsKLQkJCQltZW1jcHkoUlRQS1RfVE9fT1NQS1QocFBhY2tldCktPmRhdGEgKyBqLCBwQWQtPmF0ZS5QYXR0ZXJuLCBwQWQtPmF0ZS5QTGVuKTsKLQkJCX0KLQkJfQotCX0KLQllbHNlCi0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLQl7Ci0JCWZvciAoaiA9IDA7IGogPCBSVFBLVF9UT19PU1BLVChwUGFja2V0KS0+bGVuOyBqKyspCi0JCXsKLQkJCXBEZXN0W2pdID0gMHhBNTsKLQkJfQotCX0KLQotCS8qIGJ1aWxkIFR4IERlc2NyaXB0b3IgKi8KLSNpZm5kZWYgUlRfQklHX0VORElBTgotCXBUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKLSNlbHNlCi0gICAgcERlc3RUeEQgID0gKFBUWERfU1RSVUMpcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKLSAgICBUeEQgPSAqcERlc3RUeEQ7Ci0gICAgcFR4RCA9ICZUeEQ7Ci0jZW5kaWYgLy8gIVJUX0JJR19FTkRJQU4gLy8KLQotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0JaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKLQl7Ci0JCS8vIHByZXBhcmUgVHhECi0JCU5kaXNaZXJvTWVtb3J5KHBUeEQsIFRYRF9TSVpFKTsKLQkJUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgRkFMU0UsIEZJRk9fRURDQSk7Ci0JCS8vIGJ1aWxkIFRYIERFU0MKLQkJcFR4RC0+U0RQdHIwID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOwotCQlwVHhELT5TRExlbjAgPSBUWFdJX1NJWkUgKyBwQWQtPmF0ZS5ITGVuOwotCQlwVHhELT5MYXN0U2VjMCA9IDA7Ci0JCXBUeEQtPlNEUHRyMSA9IEFsbG9jUGE7Ci0JCXBUeEQtPlNETGVuMSA9IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpLT5sZW47Ci0JCXBUeEQtPkxhc3RTZWMxID0gMTsKLQotCQlwRGVzdCA9IChQVUNIQVIpcFR4V0k7Ci0JCXBEZXN0ICs9IFRYV0lfU0laRTsKLQkJcEhlYWRlcjgwMjExID0gKFBIRUFERVJfODAyXzExKXBEZXN0OwotCi0JCS8vIG1vZGlmeSBzZXF1ZW5jZSBudW1iZXIuLi4KLQkJaWYgKHBBZC0+YXRlLlR4RG9uZUNvdW50ID09IDApCi0JCXsKLQkJCXBBZC0+YXRlLnNlcSA9IHBIZWFkZXI4MDIxMS0+U2VxdWVuY2U7Ci0JCX0KLQkJZWxzZQotCQkJcEhlYWRlcjgwMjExLT5TZXF1ZW5jZSA9ICsrcEFkLT5hdGUuc2VxOwotCX0KLQllbHNlCi0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLQl7Ci0JCU5kaXNaZXJvTWVtb3J5KHBUeEQsIFRYRF9TSVpFKTsKLQkJUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgRkFMU0UsIEZJRk9fRURDQSk7Ci0JCS8vIGJ1aWxkIFRYIERFU0MKLQkJcFR4RC0+U0RQdHIwID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cgKHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1BhKTsKLQkJcFR4RC0+U0RMZW4wID0gVFhXSV9TSVpFICsgTEVOR1RIXzgwMl8xMTsKLQkJcFR4RC0+TGFzdFNlYzAgPSAwOwotCQlwVHhELT5TRFB0cjEgPSBBbGxvY1BhOwotCQlwVHhELT5TRExlbjEgPSBSVFBLVF9UT19PU1BLVChwUGFja2V0KS0+bGVuOwotCQlwVHhELT5MYXN0U2VjMSA9IDE7Ci0JfQotCi0jaWZkZWYgUlRfQklHX0VORElBTgotCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeFdJLCBUWVBFX1RYV0kpOwotCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsICgoKFBVQ0hBUilwRE1BSGVhZGVyQnVmVkEpK1RYV0lfU0laRSksIERJUl9XUklURSwgRkFMU0UpOwotICAgIFJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOwotICAgIFdyaXRlQmFja1RvRGVzY3JpcHRvcigoUFVDSEFSKXBEZXN0VHhELCAoUFVDSEFSKXBUeEQsIEZBTFNFLCBUWVBFX1RYRCk7Ci0jZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLwotCi0JcmV0dXJuIDA7Ci19Ci0vKj09PT09PT09PT09PT09PT09PT09PT09RW5kIG9mIFJUTVBfTUFDX1BDSSA9PT09PT09PT09PT09PT09PT09PT09PSovCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotCi0KLVZPSUQgcnRfZWVfcmVhZF9hbGwoUFJUTVBfQURBUFRFUiBwQWQsIFVTSE9SVCAqRGF0YSkKLXsKLQlVU0hPUlQgaTsKLQlVU0hPUlQgdmFsdWU7Ci0KLQotCWZvciAoaSA9IDAgOyBpIDwgRUVQUk9NX1NJWkUvMiA7ICkKLQl7Ci0JCS8qICJ2YWx1ZSIgaXMgZXNwZWNpYWxseSBmb3Igc29tZSBjb21waWxlcnMuLi4gKi8KLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBpKjIsIHZhbHVlKTsKLQkJRGF0YVtpXSA9IHZhbHVlOwotCQlpKys7Ci0JfQotfQotCi0KLVZPSUQgcnRfZWVfd3JpdGVfYWxsKFBSVE1QX0FEQVBURVIgcEFkLCBVU0hPUlQgKkRhdGEpCi17Ci0JVVNIT1JUIGk7Ci0JVVNIT1JUIHZhbHVlOwotCi0KLQlmb3IgKGkgPSAwIDsgaSA8IEVFUFJPTV9TSVpFLzIgOyApCi0JewotCQkvKiAidmFsdWUiIGlzIGVzcGVjaWFsbHkgZm9yIHNvbWUgY29tcGlsZXJzLi4uICovCi0JCXZhbHVlID0gRGF0YVtpXTsKLQkJUlQyOHh4X0VFUFJPTV9XUklURTE2KHBBZCwgaSoyLCB2YWx1ZSk7Ci0JCWkrKzsKLQl9Ci19Ci0KLQotI2lmZGVmIFJBTElOS18yOHh4X1FBCi1WT0lEIEFURV9RQV9TdGF0aXN0aWNzKAotCUlOIFBSVE1QX0FEQVBURVIJCQlwQWQsCi0JSU4gUFJYV0lfU1RSVUMJCQkJcFJ4V0ksCi0JSU4gUFJUMjhYWF9SWERfU1RSVUMJCXBSeEQsCi0JSU4gUEhFQURFUl84MDJfMTEJCQlwSGVhZGVyKQotewotCS8vIHVwZGF0ZSBjb3VudGVyIGZpcnN0Ci0JaWYgKHBIZWFkZXIgIT0gTlVMTCkKLQl7Ci0JCWlmIChwSGVhZGVyLT5GQy5UeXBlID09IEJUWVBFX0RBVEEpCi0JCXsKLQkJCWlmIChwUnhELT5VMk0pCi0JCQkJcEFkLT5hdGUuVTJNKys7Ci0JCQllbHNlCi0JCQkJcEFkLT5hdGUuT3RoZXJEYXRhKys7Ci0JCX0KLQkJZWxzZSBpZiAocEhlYWRlci0+RkMuVHlwZSA9PSBCVFlQRV9NR01UKQotCQl7Ci0JCQlpZiAocEhlYWRlci0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX0JFQUNPTikKLQkJCQlwQWQtPmF0ZS5CZWFjb24rKzsKLQkJCWVsc2UKLQkJCQlwQWQtPmF0ZS5PdGhlckNvdW50Kys7Ci0JCX0KLQkJZWxzZSBpZiAocEhlYWRlci0+RkMuVHlwZSA9PSBCVFlQRV9DTlRMKQotCQl7Ci0JCQlwQWQtPmF0ZS5PdGhlckNvdW50Kys7Ci0JCX0KLQl9Ci0JcEFkLT5hdGUuUlNTSTAgPSBwUnhXSS0+UlNTSTA7Ci0JcEFkLT5hdGUuUlNTSTEgPSBwUnhXSS0+UlNTSTE7Ci0JcEFkLT5hdGUuUlNTSTIgPSBwUnhXSS0+UlNTSTI7Ci0JcEFkLT5hdGUuU05SMCA9IHBSeFdJLT5TTlIwOwotCXBBZC0+YXRlLlNOUjEgPSBwUnhXSS0+U05SMTsKLX0KLQotCi0vKiBjb21tYW5kIGlkIHdpdGggQ21kIFR5cGUgPT0gMHgwMDA4KGZvciAyOHh4KS8weDAwMDUoZm9yIGlOSUMpICovCi0jZGVmaW5lIFJBQ0ZHX0NNRF9SRl9XUklURV9BTEwJCTB4MDAwMAotI2RlZmluZSBSQUNGR19DTURfRTJQUk9NX1JFQUQxNgkJMHgwMDAxCi0jZGVmaW5lIFJBQ0ZHX0NNRF9FMlBST01fV1JJVEUxNgkweDAwMDIKLSNkZWZpbmUgUkFDRkdfQ01EX0UyUFJPTV9SRUFEX0FMTAkweDAwMDMKLSNkZWZpbmUgUkFDRkdfQ01EX0UyUFJPTV9XUklURV9BTEwJMHgwMDA0Ci0jZGVmaW5lIFJBQ0ZHX0NNRF9JT19SRUFECQkJMHgwMDA1Ci0jZGVmaW5lIFJBQ0ZHX0NNRF9JT19XUklURQkJCTB4MDAwNgotI2RlZmluZSBSQUNGR19DTURfSU9fUkVBRF9CVUxLCQkweDAwMDcKLSNkZWZpbmUgUkFDRkdfQ01EX0JCUF9SRUFEOAkJCTB4MDAwOAotI2RlZmluZSBSQUNGR19DTURfQkJQX1dSSVRFOAkJMHgwMDA5Ci0jZGVmaW5lIFJBQ0ZHX0NNRF9CQlBfUkVBRF9BTEwJCTB4MDAwYQotI2RlZmluZSBSQUNGR19DTURfR0VUX0NPVU5URVIJCTB4MDAwYgotI2RlZmluZSBSQUNGR19DTURfQ0xFQVJfQ09VTlRFUgkJMHgwMDBjCi0KLSNkZWZpbmUgUkFDRkdfQ01EX1JTVjEJCQkJMHgwMDBkCi0jZGVmaW5lIFJBQ0ZHX0NNRF9SU1YyCQkJCTB4MDAwZQotI2RlZmluZSBSQUNGR19DTURfUlNWMwkJCQkweDAwMGYKLQotI2RlZmluZSBSQUNGR19DTURfVFhfU1RBUlQJCQkweDAwMTAKLSNkZWZpbmUgUkFDRkdfQ01EX0dFVF9UWF9TVEFUVVMJCTB4MDAxMQotI2RlZmluZSBSQUNGR19DTURfVFhfU1RPUAkJCTB4MDAxMgotI2RlZmluZSBSQUNGR19DTURfUlhfU1RBUlQJCQkweDAwMTMKLSNkZWZpbmUgUkFDRkdfQ01EX1JYX1NUT1AJCQkweDAwMTQKLSNkZWZpbmUgUkFDRkdfQ01EX0dFVF9OT0lTRV9MRVZFTAkweDAwMTUKLQotI2RlZmluZSBSQUNGR19DTURfQVRFX1NUQVJUCQkJMHgwMDgwCi0jZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU1RPUAkJCTB4MDA4MQotCi0jZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ0FSUklFUgkJMHgwMTAwCi0jZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ09OVAkJCTB4MDEwMQotI2RlZmluZSBSQUNGR19DTURfQVRFX1NUQVJUX1RYX0ZSQU1FCQkweDAxMDIKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfQlcJICAgICAgICAgICAgMHgwMTAzCi0jZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMAkgICAgICAgIDB4MDEwNAotI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjEJCQkweDAxMDUKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfRlJFUV9PRkZTRVQJCTB4MDEwNgotI2RlZmluZSBSQUNGR19DTURfQVRFX0dFVF9TVEFUSVNUSUNTCQkweDAxMDcKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9SRVNFVF9DT1VOVEVSCQkJMHgwMTA4Ci0jZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VMX1RYX0FOVEVOTkEJCTB4MDEwOQotI2RlZmluZSBSQUNGR19DTURfQVRFX1NFTF9SWF9BTlRFTk5BCQkweDAxMGEKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfUFJFQU1CTEUJCQkweDAxMGIKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfQ0hBTk5FTAkJCTB4MDEwYwotI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9BRERSMQkJCQkweDAxMGQKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfQUREUjIJCQkJMHgwMTBlCi0jZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIzCQkJCTB4MDEwZgotI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9SQVRFCQkJCTB4MDExMAotI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9MRU4JCTB4MDExMQotI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9DT1VOVAkweDAxMTIKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9TVEFSVF9SWF9GUkFNRQkJMHgwMTEzCi0jZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfRTJQUk9NX1JFQURfQlVMSwkweDAxMTQKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9FMlBST01fV1JJVEVfQlVMSwkweDAxMTUKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9JT19XUklURV9CVUxLCQkweDAxMTYKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9CQlBfUkVBRF9CVUxLCQkweDAxMTcKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9CQlBfV1JJVEVfQlVMSwkweDAxMTgKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9SRl9SRUFEX0JVTEsJCTB4MDExOQotI2RlZmluZSBSQUNGR19DTURfQVRFX1JGX1dSSVRFX0JVTEsJCTB4MDExYQotCi0KLXN0YXRpYyBWT0lEIG1lbWNweV9leGwoUFJUTVBfQURBUFRFUiBwQWQsIFVDSEFSICpkc3QsIFVDSEFSICpzcmMsIFVMT05HIGxlbik7Ci1zdGF0aWMgVk9JRCBtZW1jcHlfZXhzKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVTE9ORyBsZW4pOwotc3RhdGljIFZPSUQgUlRNUF9JT19SRUFEX0JVTEsoUFJUTVBfQURBUFRFUiBwQWQsIFVDSEFSICpkc3QsIFVDSEFSICpzcmMsIFVJTlQzMiBsZW4pOwotCi0KLQotVk9JRCBSdG1wRG9BdGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSkKLXsKLQlVU0hPUlQgQ29tbWFuZF9JZDsKLQlJTlQJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmc7Ci0KLQotCWlmICgocFJhQ2ZnID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF0ZV9yYWNmZ2hkciksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQotCXsKLQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJcmV0dXJuOwotCX0KLQotCU5kaXNaZXJvTWVtb3J5KHBSYUNmZywgc2l6ZW9mKHN0cnVjdCBhdGVfcmFjZmdoZHIpKTsKLQotICAgIGlmIChjb3B5X2Zyb21fdXNlcigoUFVDSEFSKXBSYUNmZywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKSkKLQl7Ci0JCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCWtmcmVlKHBSYUNmZyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlDb21tYW5kX0lkID0gbnRvaHMocFJhQ2ZnLT5jb21tYW5kX2lkKTsKLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiXG4lczogQ29tbWFuZF9JZCA9IDB4JTA0eCAhXG4iLCBfX0ZVTkNUSU9OX18sIENvbW1hbmRfSWQpKTsKLQotCXN3aXRjaCAoQ29tbWFuZF9JZCkKLQl7Ci0JCS8qIFdlIHdpbGwgZ2V0IHRoaXMgY29tbWFuZCB3aGVuIFFBIHN0YXJ0cy4gKi8KLQkJY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfU1RBUlQocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQkvKiBXZSB3aWxsIGdldCB0aGlzIGNvbW1hbmQgZWl0aGVyIFFBIGlzIGNsb3NlZCBvciBhdGVkIGlzIGtpbGxlZCBieSB1c2VyLiAqLwotCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU1RPUDoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQVRFX1NUT1AocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9SRl9XUklURV9BTEw6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX1JGX1dSSVRFX0FMTChwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0UyUFJPTV9SRUFEMTY6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0UyUFJPTV9SRUFEMTYocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9FMlBST01fV1JJVEUxNjoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfRTJQUk9NX1dSSVRFMTYocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9FMlBST01fUkVBRF9BTEw6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0UyUFJPTV9SRUFEX0FMTChwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0UyUFJPTV9XUklURV9BTEw6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0UyUFJPTV9XUklURV9BTEwocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9JT19SRUFEOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9JT19SRUFEKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfSU9fV1JJVEU6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0lPX1dSSVRFKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfSU9fUkVBRF9CVUxLOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9JT19SRUFEX0JVTEsocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9CQlBfUkVBRDg6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0JCUF9SRUFEOChwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCQljYXNlIFJBQ0ZHX0NNRF9CQlBfV1JJVEU4OgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9CQlBfV1JJVEU4KHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfQkJQX1JFQURfQUxMOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9CQlBfUkVBRF9BTEwocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9BVEVfRTJQUk9NX1JFQURfQlVMSzoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQVRFX0UyUFJPTV9SRUFEX0JVTEsocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9BVEVfRTJQUk9NX1dSSVRFX0JVTEs6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0FURV9FMlBST01fV1JJVEVfQlVMSyhwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9JT19XUklURV9CVUxLOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfSU9fV1JJVEVfQlVMSyhwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9CQlBfUkVBRF9CVUxLOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfQkJQX1JFQURfQlVMSyhwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9CQlBfV1JJVEVfQlVMSzoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQVRFX0JCUF9XUklURV9CVUxLKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQotCQljYXNlIFJBQ0ZHX0NNRF9HRVRfTk9JU0VfTEVWRUw6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0dFVF9OT0lTRV9MRVZFTChwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0dFVF9DT1VOVEVSOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9HRVRfQ09VTlRFUihwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0NMRUFSX0NPVU5URVI6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0NMRUFSX0NPVU5URVIocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9UWF9TVEFSVDoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfVFhfU1RBUlQocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9HRVRfVFhfU1RBVFVTOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9HRVRfVFhfU1RBVFVTKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfVFhfU1RPUDoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfVFhfU1RPUChwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX1JYX1NUQVJUOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9SWF9TVEFSVChwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX1JYX1NUT1A6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX1JYX1NUT1AocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQkvKiBUaGUgZm9sbG93aW5nIGNhc2VzIGFyZSBmb3IgbmV3IEFURSBHVUkobm90IFFBKS4gKi8KLQkJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DQVJSSUVSOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ0FSUklFUihwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DT05UOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ09OVChwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9GUkFNRToKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQVRFX1NUQVJUX1RYX0ZSQU1FKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9CVzoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQVRFX1NFVF9CVyhwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIwOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMChwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIxOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMShwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfRlJFUV9PRkZTRVQ6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIxKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfQVRFX0dFVF9TVEFUSVNUSUNTOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfR0VUX1NUQVRJU1RJQ1MocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9BVEVfUkVTRVRfQ09VTlRFUjoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQVRFX1JFU0VUX0NPVU5URVIocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VMX1RYX0FOVEVOTkE6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0FURV9TRUxfVFhfQU5URU5OQShwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9TRUxfUlhfQU5URU5OQToKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQVRFX1NFTF9UWF9BTlRFTk5BKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9QUkVBTUJMRToKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQVRFX1NFVF9QUkVBTUJMRShwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQ0hBTk5FTDoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQVRFX1NFVF9DSEFOTkVMKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9BRERSMToKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQVRFX1NFVF9BRERSMShwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQUREUjI6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0FURV9TRVRfQUREUjIocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIzOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfU0VUX0FERFIzKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9SQVRFOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfU0VUX1JBVEUocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0xFTjoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9MRU4ocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0NPVU5UOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0NPVU5UKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUX1JYX0ZSQU1FOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfU1RBUlRfUlhfRlJBTUUocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCX0KLQotICAgIEFTU0VSVChwUmFDZmcgIT0gTlVMTCk7Ci0KLSAgICBpZiAocFJhQ2ZnICE9IE5VTEwpCi0JICAgIGtmcmVlKHBSYUNmZyk7Ci0KLQlyZXR1cm47Ci19Ci0KLQotVk9JRCBCdWJibGVTb3J0KElOVDMyIG4sIElOVDMyIGFbXSkKLXsKLQlJTlQzMiBrLCBqLCB0ZW1wOwotCi0JZm9yIChrID0gbi0xOyAgaz4wOyAgay0tKQotCXsKLQkJZm9yIChqID0gMDsgajxrOyBqKyspCi0JCXsKLQkJCWlmIChhW2pdID4gYVtqKzFdKQotCQkJewotCQkJCXRlbXAgPSBhW2pdOwotCQkJCWFbal09YVtqKzFdOwotCQkJCWFbaisxXT10ZW1wOwotCQkJfQotCQl9Ci0JfQotfQotCi0KLVZPSUQgQ2FsTm9pc2VMZXZlbChQUlRNUF9BREFQVEVSIHBBZCwgVUNIQVIgY2hhbm5lbCwgSU5UMzIgUlNTSVszXVsxMF0pCi17Ci0JSU5UMzIJCVJTU0kwLCBSU1NJMSwgUlNTSTI7Ci0JQ0hBUgkJUnNzaTBPZmZzZXQsIFJzc2kxT2Zmc2V0LCBSc3NpMk9mZnNldDsKLQlVQ0hBUgkJQmJwUjUwUnNzaTAgPSAwLCBCYnBSNTFSc3NpMSA9IDAsIEJicFI1MlJzc2kyID0gMDsKLQlVQ0hBUgkJT3JnX0JCUDY2dmFsdWUgPSAwLCBPcmdfQkJQNjl2YWx1ZSA9IDAsIE9yZ19CQlA3MHZhbHVlID0gMCwgZGF0YSA9IDA7Ci0JVVNIT1JUCQlMTkFfR2FpbiA9IDA7Ci0JSU5UMzIgICAgICAgaiA9IDA7Ci0JVUNIQVIJCU9yZ19DaGFubmVsID0gcEFkLT5hdGUuQ2hhbm5lbDsKLQlVU0hPUlQJICAgIEdhaW5WYWx1ZSA9IDAsIE9mZnNldFZhbHVlID0gMDsKLQotCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgJk9yZ19CQlA2NnZhbHVlKTsKLQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksICZPcmdfQkJQNjl2YWx1ZSk7Ci0JQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAmT3JnX0JCUDcwdmFsdWUpOwotCi0JLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JLy8gUmVhZCB0aGUgdmFsdWUgb2YgTE5BIGdhaW4gYW5kIFJzc2kgb2Zmc2V0Ci0JLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTE5BX09GRlNFVCwgR2FpblZhbHVlKTsKLQotCS8vIGZvciBOb2lzZSBMZXZlbAotCWlmIChjaGFubmVsIDw9IDE0KQotCXsKLQkJTE5BX0dhaW4gPSBHYWluVmFsdWUgJiAweDAwRkY7Ci0KLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9CR19PRkZTRVQsIE9mZnNldFZhbHVlKTsKLQkJUnNzaTBPZmZzZXQgPSBPZmZzZXRWYWx1ZSAmIDB4MDBGRjsKLQkJUnNzaTFPZmZzZXQgPSAoT2Zmc2V0VmFsdWUgJiAweEZGMDApID4+IDg7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgKEVFUFJPTV9SU1NJX0JHX09GRlNFVCArIDIpLyogMHg0OCAqLywgT2Zmc2V0VmFsdWUpOwotCQlSc3NpMk9mZnNldCA9IE9mZnNldFZhbHVlICYgMHgwMEZGOwotCX0KLQllbHNlCi0JewotCQlMTkFfR2FpbiA9IChHYWluVmFsdWUgJiAweEZGMDApID4+IDg7Ci0KLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9BX09GRlNFVCwgT2Zmc2V0VmFsdWUpOwotCQlSc3NpME9mZnNldCA9IE9mZnNldFZhbHVlICYgMHgwMEZGOwotCQlSc3NpMU9mZnNldCA9IChPZmZzZXRWYWx1ZSAmIDB4RkYwMCkgPj4gODsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAoRUVQUk9NX1JTU0lfQV9PRkZTRVQgKyAyKS8qIDB4NEMgKi8sIE9mZnNldFZhbHVlKTsKLQkJUnNzaTJPZmZzZXQgPSBPZmZzZXRWYWx1ZSAmIDB4MDBGRjsKLQl9Ci0JLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JewotCQlwQWQtPmF0ZS5DaGFubmVsID0gY2hhbm5lbDsKLQkJQVRFQXNpY1N3aXRjaENoYW5uZWwocEFkKTsKLQkJbWRlbGF5KDUpOwotCi0JCWRhdGEgPSAweDEwOwotCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBkYXRhKTsKLQkJZGF0YSA9IDB4NDA7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIGRhdGEpOwotCQlkYXRhID0gMHg0MDsKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgZGF0YSk7Ci0JCW1kZWxheSg1KTsKLQotCQkvLyBzdGFydCBSeAotCQlwQWQtPmF0ZS5iUUFSeFN0YXJ0ID0gVFJVRTsKLQkJU2V0X0FURV9Qcm9jKHBBZCwgIlJYRlJBTUUiKTsKLQotCQltZGVsYXkoNSk7Ci0KLQkJZm9yIChqID0gMDsgaiA8IDEwOyBqKyspCi0JCXsKLQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I1MCwgJkJicFI1MFJzc2kwKTsKLQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I1MSwgJkJicFI1MVJzc2kxKTsKLQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I1MiwgJkJicFI1MlJzc2kyKTsKLQotCQkJbWRlbGF5KDEwKTsKLQotCQkJLy8gY2FsY3VsYXRlIFJTU0kgMAotCQkJaWYgKEJicFI1MFJzc2kwID09IDApCi0JCQl7Ci0JCQkJUlNTSTAgPSAtMTAwOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCVJTU0kwID0gKElOVDMyKSgtMTIgLSBCYnBSNTBSc3NpMCAtIExOQV9HYWluIC0gUnNzaTBPZmZzZXQpOwotCQkJfQotCQkJUlNTSVswXVtqXSA9IFJTU0kwOwotCi0JCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMiApIC8vIDJSCi0JCQl7Ci0JCQkJLy8gY2FsY3VsYXRlIFJTU0kgMQotCQkJCWlmIChCYnBSNTFSc3NpMSA9PSAwKQotCQkJCXsKLQkJCQkJUlNTSTEgPSAtMTAwOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlSU1NJMSA9IChJTlQzMikoLTEyIC0gQmJwUjUxUnNzaTEgLSBMTkFfR2FpbiAtIFJzc2kxT2Zmc2V0KTsKLQkJCQl9Ci0JCQkJUlNTSVsxXVtqXSA9IFJTU0kxOwotCQkJfQotCi0JCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMyApIC8vIDNSCi0JCQl7Ci0JCQkJLy8gY2FsY3VsYXRlIFJTU0kgMgotCQkJCWlmIChCYnBSNTJSc3NpMiA9PSAwKQotCQkJCQlSU1NJMiA9IC0xMDA7Ci0JCQkJZWxzZQotCQkJCQlSU1NJMiA9IChJTlQzMikoLTEyIC0gQmJwUjUyUnNzaTIgLSBMTkFfR2FpbiAtIFJzc2kyT2Zmc2V0KTsKLQotCQkJCVJTU0lbMl1bal0gPSBSU1NJMjsKLQkJCX0KLQkJfQotCi0JCS8vIHN0b3AgUngKLQkJU2V0X0FURV9Qcm9jKHBBZCwgIlJYU1RPUCIpOwotCi0JCW1kZWxheSg1KTsKLQotCQlCdWJibGVTb3J0KDEwLCBSU1NJWzBdKTsJLy8gMVIKLQotCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMiApIC8vIDJSCi0JCXsKLQkJCUJ1YmJsZVNvcnQoMTAsIFJTU0lbMV0pOwotCQl9Ci0KLQkJaWYgKCBwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID49IDMgKSAvLyAzUgotCQl7Ci0JCQlCdWJibGVTb3J0KDEwLCBSU1NJWzJdKTsKLQkJfQotCX0KLQotCXBBZC0+YXRlLkNoYW5uZWwgPSBPcmdfQ2hhbm5lbDsKLQlBVEVBc2ljU3dpdGNoQ2hhbm5lbChwQWQpOwotCi0JLy8gcmVzdG9yZSBvcmlnaW5hbCB2YWx1ZQotICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIE9yZ19CQlA2NnZhbHVlKTsKLSAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCBPcmdfQkJQNjl2YWx1ZSk7Ci0gICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgT3JnX0JCUDcwdmFsdWUpOwotCi0JcmV0dXJuOwotfQotCi0KLUJPT0xFQU4gU3luY1R4UnhDb25maWcoUFJUTVBfQURBUFRFUiBwQWQsIFVTSE9SVCBvZmZzZXQsIFVDSEFSIHZhbHVlKQotewotCVVDSEFSIHRtcCA9IDAsIGJicF9kYXRhID0gMDsKLQotCWlmIChBVEVfT04ocEFkKSkKLQl7Ci0JCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgb2Zmc2V0LCAmYmJwX2RhdGEpOwotCX0KLQllbHNlCi0JewotCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBvZmZzZXQsICZiYnBfZGF0YSk7Ci0JfQotCi0JLyogY29uZmlybSBhZ2FpbiAqLwotCUFTU0VSVChiYnBfZGF0YSA9PSB2YWx1ZSk7Ci0KLQlzd2l0Y2ggKG9mZnNldCkKLQl7Ci0JCWNhc2UgQkJQX1IxOgotCQkJLyogTmVlZCB0byBzeW5jaHJvbml6ZSB0eCBjb25maWd1cmF0aW9uIHdpdGggbGVnYWN5IEFURS4gKi8KLQkJCXRtcCA9IChiYnBfZGF0YSAmICgoMSA8PCA0KSB8ICgxIDw8IDMpKS8qIDB4MTggKi8pID4+IDM7Ci0JCSAgICBzd2l0Y2ggKHRtcCkKLQkJICAgIHsKLQkJCQkvKiBUaGUgQkJQIFIxIGJpdFs0OjNdID0gMiA6OiBCb3RoIERBQ3Mgd2lsbCBiZSB1c2VkIGJ5IFFBLiAqLwotCQkgICAgICAgIGNhc2UgMjoKLQkJCQkJLyogQWxsICovCi0JCQkJCXBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9IDA7Ci0JCSAgICAgICAgICAgIGJyZWFrOwotCQkJCS8qIFRoZSBCQlAgUjEgYml0WzQ6M10gPSAwIDo6IERBQyAwIHdpbGwgYmUgdXNlZCBieSBRQS4gKi8KLQkJICAgICAgICBjYXNlIDA6Ci0JCQkJCS8qIEFudGVubmEgb25lICovCi0JCQkJCXBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9IDE7Ci0JCSAgICAgICAgICAgIGJyZWFrOwotCQkJCS8qIFRoZSBCQlAgUjEgYml0WzQ6M10gPSAxIDo6IERBQyAxIHdpbGwgYmUgdXNlZCBieSBRQS4gKi8KLQkJICAgICAgICBjYXNlIDE6Ci0JCQkJCS8qIEFudGVubmEgdHdvICovCi0JCQkJCXBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9IDI7Ci0JCSAgICAgICAgICAgIGJyZWFrOwotCQkgICAgICAgIGRlZmF1bHQ6Ci0JCSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIC0tIFN0aC4gd3JvbmchICA6IHJldHVybiBGQUxTRTsgXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCQkgICAgfQotCQkJYnJlYWs7LyogY2FzZSBCQlBfUjEgKi8KLQotCQljYXNlIEJCUF9SMzoKLQkJCS8qIE5lZWQgdG8gc3luY2hyb25pemUgcnggY29uZmlndXJhdGlvbiB3aXRoIGxlZ2FjeSBBVEUuICovCi0JCQl0bXAgPSAoYmJwX2RhdGEgJiAoKDEgPDwgMSkgfCAoMSA8PCAwKSkvKiAweDAzICovKTsKLQkJICAgIHN3aXRjaCh0bXApCi0JCSAgICB7Ci0JCQkJLyogVGhlIEJCUCBSMyBiaXRbMTowXSA9IDMgOjogQWxsIEFEQ3Mgd2lsbCBiZSB1c2VkIGJ5IFFBLiAqLwotCQkgICAgICAgIGNhc2UgMzoKLQkJCQkJLyogQWxsICovCi0JCQkJCXBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9IDA7Ci0JCSAgICAgICAgICAgIGJyZWFrOwotCQkJCS8qCi0JCQkJCVRoZSBCQlAgUjMgYml0WzE6MF0gPSAwIDo6IEFEQyAwIHdpbGwgYmUgdXNlZCBieSBRQSwKLQkJCQkJdW5sZXNzIHRoZSBCQlAgUjMgYml0WzQ6M10gPSAyCi0JCQkJKi8KLQkJICAgICAgICBjYXNlIDA6Ci0JCQkJCS8qIEFudGVubmEgb25lICovCi0JCQkJCXBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9IDE7Ci0JCQkJCXRtcCA9ICgoYmJwX2RhdGEgJiAoKDEgPDwgNCkgfCAoMSA8PCAzKSkvKiAweDAzICovKSA+PiAzKTsKLQkJCQkJaWYgKHRtcCA9PSAyKS8vIDNSCi0JCQkJCXsKLQkJCQkJCS8qIERlZmF1bHQgOiBBbGwgQURDcyB3aWxsIGJlIHVzZWQgYnkgUUEgKi8KLQkJCQkJCXBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9IDA7Ci0JCQkJCX0KLQkJICAgICAgICAgICAgYnJlYWs7Ci0JCQkJLyogVGhlIEJCUCBSMyBiaXRbMTowXSA9IDEgOjogQURDIDEgd2lsbCBiZSB1c2VkIGJ5IFFBLiAqLwotCQkgICAgICAgIGNhc2UgMToKLQkJCQkJLyogQW50ZW5uYSB0d28gKi8KLQkJCQkJcEFkLT5hdGUuUnhBbnRlbm5hU2VsID0gMjsKLQkJICAgICAgICAgICAgYnJlYWs7Ci0JCQkJLyogVGhlIEJCUCBSMyBiaXRbMTowXSA9IDIgOjogQURDIDIgd2lsbCBiZSB1c2VkIGJ5IFFBLiAqLwotCQkgICAgICAgIGNhc2UgMjoKLQkJCQkJLyogQW50ZW5uYSB0aHJlZSAqLwotCQkJCQlwQWQtPmF0ZS5SeEFudGVubmFTZWwgPSAzOwotCQkgICAgICAgICAgICBicmVhazsKLQkJICAgICAgICBkZWZhdWx0OgotCQkgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyAtLSBJbXBvc3NpYmxlISAgOiByZXR1cm4gRkFMU0U7IFxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQkJICAgIH0KLQkJCWJyZWFrOy8qIGNhc2UgQkJQX1IzICovCi0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIC0tIFN0aC4gd3JvbmchICA6IHJldHVybiBGQUxTRTsgXG4iLCBfX0ZVTkNUSU9OX18pKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQotCX0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi1zdGF0aWMgVk9JRCBtZW1jcHlfZXhsKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVTE9ORyBsZW4pCi17Ci0JVUxPTkcgaSwgVmFsdWUgPSAwOwotCVVMT05HICpwRHN0LCAqcFNyYzsKLQlVQ0hBUiAqcDg7Ci0KLQlwOCA9IHNyYzsKLQlwRHN0ID0gKFVMT05HICopIGRzdDsKLQlwU3JjID0gKFVMT05HICopIHNyYzsKLQotCWZvciAoaSA9IDAgOyBpIDwgKGxlbi80KTsgaSsrKQotCXsKLQkJLyogRm9yIGFsaWdubWVudCBpc3N1ZSwgd2UgbmVlZCBhIHZhcmlhYmxlICJWYWx1ZSIuICovCi0JCW1lbW1vdmUoJlZhbHVlLCBwU3JjLCA0KTsKLQkJVmFsdWUgPSBodG9ubChWYWx1ZSk7Ci0JCW1lbW1vdmUocERzdCwgJlZhbHVlLCA0KTsKLQkJcERzdCsrOwotCQlwU3JjKys7Ci0JfQotCWlmICgobGVuICUgNCkgIT0gMCkKLQl7Ci0JCS8qIHdpc2ggdGhhdCBpdCB3aWxsIG5ldmVyIHJlYWNoIGhlcmUgKi8KLQkJbWVtbW92ZSgmVmFsdWUsIHBTcmMsIChsZW4gJSA0KSk7Ci0JCVZhbHVlID0gaHRvbmwoVmFsdWUpOwotCQltZW1tb3ZlKHBEc3QsICZWYWx1ZSwgKGxlbiAlIDQpKTsKLQl9Ci19Ci0KLQotc3RhdGljIFZPSUQgbWVtY3B5X2V4cyhQUlRNUF9BREFQVEVSIHBBZCwgVUNIQVIgKmRzdCwgVUNIQVIgKnNyYywgVUxPTkcgbGVuKQotewotCVVMT05HIGk7Ci0JVUNIQVIgKnBEc3QsICpwU3JjOwotCi0JcERzdCA9IGRzdDsKLQlwU3JjID0gc3JjOwotCi0JZm9yIChpID0gMDsgaSA8IChsZW4vMik7IGkrKykKLQl7Ci0JCW1lbW1vdmUocERzdCwgcFNyYywgMik7Ci0JCSooKFVTSE9SVCAqKXBEc3QpID0gaHRvbnMoKigoVVNIT1JUICopcERzdCkpOwotCQlwRHN0Kz0yOwotCQlwU3JjKz0yOwotCX0KLQotCWlmICgobGVuICUgMikgIT0gMCkKLQl7Ci0JCW1lbW1vdmUocERzdCwgcFNyYywgMSk7Ci0JfQotfQotCi0KLXN0YXRpYyBWT0lEIFJUTVBfSU9fUkVBRF9CVUxLKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVSU5UMzIgbGVuKQotewotCVVJTlQzMiBpLCBWYWx1ZTsKLQlVSU5UMzIgKnBEc3QsICpwU3JjOwotCi0JcERzdCA9IChVSU5UMzIgKikgZHN0OwotCXBTcmMgPSAoVUlOVDMyICopIHNyYzsKLQotCWZvciAoaSA9IDAgOyBpIDwgKGxlbi80KTsgaSsrKQotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCAoVUxPTkcpcFNyYywgJlZhbHVlKTsKLQkJVmFsdWUgPSBodG9ubChWYWx1ZSk7Ci0JCW1lbW1vdmUocERzdCwgJlZhbHVlLCA0KTsKLQkJcERzdCsrOwotCQlwU3JjKys7Ci0JfQotCXJldHVybjsKLX0KLQotCi1JTlQgU2V0X1R4U3RvcF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTZXRfVHhTdG9wX1Byb2NcbiIpKTsKLQotCWlmIChTZXRfQVRFX1Byb2MocEFkLCAiVFhTVE9QIikpCi0JewotCQlyZXR1cm4gVFJVRTsKLQl9Ci0JZWxzZQotCXsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLX0KLQotCi1JTlQgU2V0X1J4U3RvcF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTZXRfUnhTdG9wX1Byb2NcbiIpKTsKLQotCWlmIChTZXRfQVRFX1Byb2MocEFkLCAiUlhTVE9QIikpCi0JewotCQlyZXR1cm4gVFJVRTsKLQl9Ci0JZWxzZQotCXsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLX0KLQotCi0jaWZkZWYgREJHCi1JTlQgU2V0X0VFUmVhZF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVVNIT1JUIGJ1ZmZlcltFRVBST01fU0laRS8yXTsKLQlVU0hPUlQgKnA7Ci0JSU5UIGk7Ci0KLQlydF9lZV9yZWFkX2FsbChwQWQsIChVU0hPUlQgKilidWZmZXIpOwotCXAgPSBidWZmZXI7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgKEVFUFJPTV9TSVpFLzIpOyBpKyspCi0JewotCQlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiJTQuNHggIiwgKnApOwotCQlpZiAoKChpKzEpICUgMTYpID09IDApCi0JCQlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiXG4iKTsKLQkJcCsrOwotCX0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLUlOVCBTZXRfRUVXcml0ZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVVNIT1JUIG9mZnNldCA9IDAsIHZhbHVlOwotCVBTVFJJTkcgcDIgPSBhcmc7Ci0KLQl3aGlsZSAoKCpwMiAhPSAnOicpICYmICgqcDIgIT0gJ1wwJykpCi0JewotCQlwMisrOwotCX0KLQotCWlmICgqcDIgPT0gJzonKQotCXsKLQkJQTJIZXgob2Zmc2V0LCBhcmcpOwotCQlBMkhleCh2YWx1ZSwgcDIgKyAxKTsKLQl9Ci0JZWxzZQotCXsKLQkJQTJIZXgodmFsdWUsIGFyZyk7Ci0JfQotCi0JaWYgKG9mZnNldCA+PSBFRVBST01fU0laRSkKLQl7Ci0JCWF0ZV9wcmludChLRVJOX0VNRVJHICJPZmZzZXQgY2FuIG5vdCBleGNlZWQgRUVQUk9NX1NJWkUoID09IDB4JTA0eClcbiIsIEVFUFJPTV9TSVpFKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCVJUMjh4eF9FRVBST01fV1JJVEUxNihwQWQsIG9mZnNldCwgdmFsdWUpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotSU5UIFNldF9CQlBSZWFkX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVQ0hBUiB2YWx1ZSA9IDAsIG9mZnNldDsKLQotCUEySGV4KG9mZnNldCwgYXJnKTsKLQotCWlmIChBVEVfT04ocEFkKSkKLQl7Ci0JCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgb2Zmc2V0LCAgJnZhbHVlKTsKLQl9Ci0JZWxzZQotCXsKLQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgb2Zmc2V0LCAgJnZhbHVlKTsKLQl9Ci0KLQlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiJXhcbiIsIHZhbHVlKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLUlOVCBTZXRfQkJQV3JpdGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVTSE9SVCBvZmZzZXQgPSAwOwotCVBTVFJJTkcgcDIgPSBhcmc7Ci0JVUNIQVIgdmFsdWU7Ci0KLQl3aGlsZSAoKCpwMiAhPSAnOicpICYmICgqcDIgIT0gJ1wwJykpCi0JewotCQlwMisrOwotCX0KLQotCWlmICgqcDIgPT0gJzonKQotCXsKLQkJQTJIZXgob2Zmc2V0LCBhcmcpOwotCQlBMkhleCh2YWx1ZSwgcDIgKyAxKTsKLQl9Ci0JZWxzZQotCXsKLQkJQTJIZXgodmFsdWUsIGFyZyk7Ci0JfQotCi0JaWYgKEFURV9PTihwQWQpKQotCXsKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgb2Zmc2V0LCAgdmFsdWUpOwotCX0KLQllbHNlCi0JewotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgb2Zmc2V0LCAgdmFsdWUpOwotCX0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLUlOVCBTZXRfUkZXcml0ZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JUFNUUklORyBwMiwgcDMsIHA0OwotCVVJTlQzMiBSMSwgUjIsIFIzLCBSNDsKLQotCXAyID0gYXJnOwotCi0Jd2hpbGUgKCgqcDIgIT0gJzonKSAmJiAoKnAyICE9ICdcMCcpKQotCXsKLQkJcDIrKzsKLQl9Ci0KLQlpZiAoKnAyICE9ICc6JykKLQkJcmV0dXJuIEZBTFNFOwotCi0JcDMgPSBwMiArIDE7Ci0KLQl3aGlsZSgoKnAzICE9ICc6JykgJiYgKCpwMyAhPSAnXDAnKSkKLQl7Ci0JCXAzKys7Ci0JfQotCi0JaWYgKCpwMyAhPSAnOicpCi0JCXJldHVybiBGQUxTRTsKLQotCXA0ID0gcDMgKyAxOwotCi0Jd2hpbGUgKCgqcDQgIT0gJzonKSAmJiAoKnA0ICE9ICdcMCcpKQotCXsKLQkJcDQrKzsKLQl9Ci0KLQlpZiAoKnA0ICE9ICc6JykKLQkJcmV0dXJuIEZBTFNFOwotCi0KLQlBMkhleChSMSwgYXJnKTsKLQlBMkhleChSMiwgcDIgKyAxKTsKLQlBMkhleChSMywgcDMgKyAxKTsKLQlBMkhleChSNCwgcDQgKyAxKTsKLQotCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIxKTsKLQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMik7Ci0JUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjMpOwotCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFI0KTsKLQotCXJldHVybiBUUlVFOwotfQotI2VuZGlmIC8vIERCRyAvLwotI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCi0KLQotCi0KLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotI2RlZmluZQlMRU5fT0ZfQVJHIDE2Ci0KLSNkZWZpbmUgUkVTUE9OU0VfVE9fR1VJKF9fcFJhQ2ZnLCBfX3B3cnEsIF9fTGVuZ3RoLCBfX1N0YXR1cykJCQkJCQkJCQlcCi0JKF9fcFJhQ2ZnKS0+bGVuZ3RoID0gaHRvbnMoKF9fTGVuZ3RoKSk7CQkJCQkJCQkJCQkJCQlcCi0JKF9fcFJhQ2ZnKS0+c3RhdHVzID0gaHRvbnMoKF9fU3RhdHVzKSk7CQkJCQkJCQkJCQkJCQlcCi0JKF9fcHdycSktPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoKF9fcFJhQ2ZnKS0+bWFnaWNfbm8pICsgc2l6ZW9mKChfX3BSYUNmZyktPmNvbW1hbmRfdHlwZSkJXAotCQkJCQkJCSsgc2l6ZW9mKChfX3BSYUNmZyktPmNvbW1hbmRfaWQpICsgc2l6ZW9mKChfX3BSYUNmZyktPmxlbmd0aCkJCVwKLQkJCQkJCQkrIHNpemVvZigoX19wUmFDZmcpLT5zZXF1ZW5jZSkgKyBudG9ocygoX19wUmFDZmcpLT5sZW5ndGgpOwkJCVwKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPnUuZGF0YS5sZW5ndGggPSAlZFxuIiwgKF9fcHdycSktPnUuZGF0YS5sZW5ndGgpKTsJCVwKLQlpZiAoY29weV90b191c2VyKChfX3B3cnEpLT51LmRhdGEucG9pbnRlciwgKFVDSEFSICopKF9fcFJhQ2ZnKSwgKF9fcHdycSktPnUuZGF0YS5sZW5ndGgpKQlcCi0JewkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluICVzXG4iLCBfX0ZVTkNUSU9OX18pKTsJCQkJXAotCQlyZXR1cm4gKC1FRkFVTFQpOwkJCQkJCQkJCQkJCQkJCQkJCVwKLQl9CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JZWxzZQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JewkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyBpcyBkb25lICFcbiIsIF9fRlVOQ1RJT05fXykpOwkJCQkJCQlcCi0JfQotCi1zdGF0aWMgaW5saW5lIElOVAlET19SQUNGR19DTURfQVRFX1NUQVJUKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU1RBUlRcbiIpKTsKLQotCS8qIFByZXBhcmUgZmVlZGJhY2sgYXMgc29vbiBhcyB3ZSBjYW4gdG8gYXZvaWQgUUEgdGltZW91dC4gKi8KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIkFURVNUQVJUIik7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NUT1AoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCUlOVDMyIHJldDsKLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TVE9QXG4iKSk7Ci0KLQkvKgotCQlEaXN0aW5ndWlzaCB0aGlzIGNvbW1hbmQgY2FtZSBmcm9tIFFBKHZpYSBhdGUgYWdlbnQpCi0JCW9yIGF0ZSBhZ2VudCBhY2NvcmRpbmcgdG8gdGhlIGV4aXN0ZW5jZSBvZiBwaWQgaW4gcGF5bG9hZC4KLQotCQlObyBuZWVkIHRvIHByZXBhcmUgZmVlZGJhY2sgaWYgdGhpcyBjbWQgY2FtZSBkaXJlY3RseSBmcm9tIGF0ZSBhZ2VudCwKLQkJbm90IGZyb20gUUEuCi0JKi8KLQlwUmFDZmctPmxlbmd0aCA9IG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKLQotCWlmIChwUmFDZmctPmxlbmd0aCA9PSBzaXplb2YocEFkYXB0ZXItPmF0ZS5BdGVQaWQpKQotCXsKLQkJLyoKLQkJCVRoaXMgY29tbWFuZCBjYW1lIGZyb20gUUEuCi0JCQlHZXQgdGhlIHBpZCBvZiBBVEUgYWdlbnQuCi0JCSovCi0JCW1lbWNweSgoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5BdGVQaWQsCi0JCQkJCQkoJnBSYUNmZy0+ZGF0YVswXSkgLSAyLyogPT0gc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSAqLywKLQkJCQkJCXNpemVvZihwQWRhcHRlci0+YXRlLkF0ZVBpZCkpOwotCi0JCS8qIFByZXBhcmUgZmVlZGJhY2sgYXMgc29vbiBhcyB3ZSBjYW4gdG8gYXZvaWQgUUEgdGltZW91dC4gKi8KLQkJUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCQkvKgotCQkJS2lsbCBBVEUgYWdlbnQgd2hlbiBsZWF2aW5nIEFURSBtb2RlLgotCi0JCQlXZSBtdXN0IGtpbGwgQVRFIGFnZW50IGZpcnN0IGJlZm9yZSBzZXR0aW5nIEFURVNUT1AsCi0JCQlvciBNaWNyb3NvZnQgd2lsbCByZXBvcnQgc3RoLiB3cm9uZy4KLQkJKi8KLQkJcmV0ID0gS0lMTF9USFJFQURfUElEKHBBZGFwdGVyLT5hdGUuQXRlUGlkLCBTSUdURVJNLCAxKTsKLQotCQlpZiAocmV0KQotCQl7Ci0JCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogdW5hYmxlIHRvIGtpbGwgYXRlIHRocmVhZFxuIiwgcEFkYXB0ZXItPm5ldF9kZXYtPm5hbWUpKTsKLQkJfQotCX0KLQotCi0JLyogQVAvU1RBIG1pZ2h0IGhhdmUgaW4gQVRFX1NUT1AgbW9kZSBkdWUgdG8gY21kIGZyb20gUUEuICovCi0JaWYgKEFURV9PTihwQWRhcHRlcikpCi0JewotCQkvKiBTb21lb25lIGhhcyBraWxsZWQgYXRlIGFnZW50IHdoaWxlIFFBIEdVSSBpcyBzdGlsbCBvcGVuLiAqLwotCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJBVEVTVE9QIik7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BUF9TVEFSVCBpcyBkb25lICFcbiIpKTsKLQl9Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfUkZfV1JJVEVfQUxMKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlVSU5UMzIgUjEsIFIyLCBSMywgUjQ7Ci0JVVNIT1JUIGNoYW5uZWw7Ci0KLQltZW1jcHkoJlIxLCBwUmFDZmctPmRhdGEtMiwgNCk7Ci0JbWVtY3B5KCZSMiwgcFJhQ2ZnLT5kYXRhKzIsIDQpOwotCW1lbWNweSgmUjMsIHBSYUNmZy0+ZGF0YSs2LCA0KTsKLQltZW1jcHkoJlI0LCBwUmFDZmctPmRhdGErMTAsIDQpOwotCW1lbWNweSgmY2hhbm5lbCwgcFJhQ2ZnLT5kYXRhKzE0LCAyKTsKLQotCXBBZGFwdGVyLT5MYXRjaFJmUmVncy5SMSA9IG50b2hsKFIxKTsKLQlwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjIgPSBudG9obChSMik7Ci0JcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlIzID0gbnRvaGwoUjMpOwotCXBBZGFwdGVyLT5MYXRjaFJmUmVncy5SNCA9IG50b2hsKFI0KTsKLQlwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA9IG50b2hzKGNoYW5uZWwpOwotCi0JUlRNUF9SRl9JT19XUklURTMyKHBBZGFwdGVyLCBwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjEpOwotCVJUTVBfUkZfSU9fV1JJVEUzMihwQWRhcHRlciwgcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlIyKTsKLQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkYXB0ZXIsIHBBZGFwdGVyLT5MYXRjaFJmUmVncy5SMyk7Ci0JUlRNUF9SRl9JT19XUklURTMyKHBBZGFwdGVyLCBwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjQpOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiAgTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfRTJQUk9NX1JFQUQxNigKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JVUlOVDE2CW9mZnNldD0wLCB2YWx1ZT0wOwotCVVTSE9SVCAgdG1wPTA7Ci0KLQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7Ci0KLQkvKiAidG1wIiBpcyBlc3BlY2lhbGx5IGZvciBzb21lIGNvbXBpbGVycy4uLiAqLwotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZGFwdGVyLCBvZmZzZXQsIHRtcCk7Ci0JdmFsdWUgPSB0bXA7Ci0JdmFsdWUgPSBodG9ucyh2YWx1ZSk7Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkVFUFJPTSBSZWFkIG9mZnNldCA9IDB4JTA0eCwgdmFsdWUgPSAweCUwNHhcbiIsIG9mZnNldCwgdmFsdWUpKTsKLQltZW1jcHkocFJhQ2ZnLT5kYXRhLCAmdmFsdWUsIDIpOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpKzIsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0UyUFJPTV9XUklURTE2KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlVU0hPUlQJb2Zmc2V0LCB2YWx1ZTsKLQotCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKLQltZW1jcHkoJnZhbHVlLCBwUmFDZmctPmRhdGEsIDIpOwotCXZhbHVlID0gbnRvaHModmFsdWUpOwotCVJUMjh4eF9FRVBST01fV1JJVEUxNihwQWRhcHRlciwgb2Zmc2V0LCB2YWx1ZSk7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0UyUFJPTV9SRUFEX0FMTCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JVVNIT1JUIGJ1ZmZlcltFRVBST01fU0laRS8yXTsKLQotCXJ0X2VlX3JlYWRfYWxsKHBBZGFwdGVyLChVU0hPUlQgKilidWZmZXIpOwotCW1lbWNweV9leHMocEFkYXB0ZXIsIHBSYUNmZy0+ZGF0YSwgKFVDSEFSICopYnVmZmVyLCBFRVBST01fU0laRSk7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cykrRUVQUk9NX1NJWkUsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0UyUFJPTV9XUklURV9BTEwoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCVVTSE9SVCBidWZmZXJbRUVQUk9NX1NJWkUvMl07Ci0KLQlOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilidWZmZXIsIEVFUFJPTV9TSVpFKTsKLQltZW1jcHlfZXhzKHBBZGFwdGVyLCAoVUNIQVIgKilidWZmZXIsIChVQ0hBUiAqKSZwUmFDZmctPnN0YXR1cywgRUVQUk9NX1NJWkUpOwotCXJ0X2VlX3dyaXRlX2FsbChwQWRhcHRlciwoVVNIT1JUICopYnVmZmVyKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfSU9fUkVBRCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JVUlOVDMyCW9mZnNldDsKLQlVSU5UMzIJdmFsdWU7Ci0KLQltZW1jcHkoJm9mZnNldCwgJnBSYUNmZy0+c3RhdHVzLCA0KTsKLQlvZmZzZXQgPSBudG9obChvZmZzZXQpOwotCi0JLyoKLQkJV2UgZG8gbm90IG5lZWQgdGhlIGJhc2UgYWRkcmVzcy4KLQkJU28ganVzdCBleHRyYWN0IHRoZSBvZmZzZXQgb3V0LgotCSovCi0Jb2Zmc2V0ICY9IDB4MDAwMEZGRkY7Ci0JUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIG9mZnNldCwgJnZhbHVlKTsKLQl2YWx1ZSA9IGh0b25sKHZhbHVlKTsKLQltZW1jcHkocFJhQ2ZnLT5kYXRhLCAmdmFsdWUsIDQpOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpKzQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0lPX1dSSVRFKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlVSU5UMzIJb2Zmc2V0LCB2YWx1ZTsKLQotCW1lbWNweSgmb2Zmc2V0LCBwUmFDZmctPmRhdGEtMiwgNCk7Ci0JbWVtY3B5KCZ2YWx1ZSwgcFJhQ2ZnLT5kYXRhKzIsIDQpOwotCi0Jb2Zmc2V0ID0gbnRvaGwob2Zmc2V0KTsKLQotCS8qCi0JCVdlIGRvIG5vdCBuZWVkIHRoZSBiYXNlIGFkZHJlc3MuCi0JCVNvIGp1c3QgZXh0cmFjdCB0aGUgb2Zmc2V0IG91dC4KLQkqLwotCW9mZnNldCAmPSAweDAwMDBGRkZGOwotCXZhbHVlID0gbnRvaGwodmFsdWUpOwotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0lPX1dSSVRFOiBvZmZzZXQgPSAleCwgdmFsdWUgPSAleFxuIiwgb2Zmc2V0LCB2YWx1ZSkpOwotCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgb2Zmc2V0LCB2YWx1ZSk7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0lPX1JFQURfQlVMSygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JVUlOVDMyCW9mZnNldDsKLQlVU0hPUlQJbGVuOwotCi0JbWVtY3B5KCZvZmZzZXQsICZwUmFDZmctPnN0YXR1cywgNCk7Ci0Jb2Zmc2V0ID0gbnRvaGwob2Zmc2V0KTsKLQotCS8qCi0JCVdlIGRvIG5vdCBuZWVkIHRoZSBiYXNlIGFkZHJlc3MuCi0JCVNvIGp1c3QgZXh0cmFjdCB0aGUgb2Zmc2V0IG91dC4KLQkqLwotCW9mZnNldCAmPSAweDAwMDBGRkZGOwotCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGErMiwgMik7Ci0JbGVuID0gbnRvaHMobGVuKTsKLQotCWlmIChsZW4gPiAzNzEpCi0JewotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoImxlbmd0aCByZXF1ZXN0ZWQgaXMgdG9vIGxhcmdlLCBtYWtlIGl0IHNtYWxsZXJcbiIpKTsKLQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKLQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygxKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JUlRNUF9JT19SRUFEX0JVTEsocEFkYXB0ZXIsIHBSYUNmZy0+ZGF0YSwgKFVDSEFSICopb2Zmc2V0LCBsZW4qNCk7Ly8gdW5pdCBpbiBmb3VyIGJ5dGVzCi0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cykrKGxlbio0KSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQkJQX1JFQUQ4KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlVU0hPUlQJb2Zmc2V0OwotCVVDSEFSCXZhbHVlOwotCi0JdmFsdWUgPSAwOwotCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKLQotCWlmIChBVEVfT04ocEFkYXB0ZXIpKQotCXsKLQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIG9mZnNldCwgJnZhbHVlKTsKLQl9Ci0JZWxzZQotCXsKLQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBvZmZzZXQsICZ2YWx1ZSk7Ci0JfQotCi0JcFJhQ2ZnLT5kYXRhWzBdID0gdmFsdWU7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cykrMSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQkJQX1dSSVRFOCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JVVNIT1JUCW9mZnNldDsKLQlVQ0hBUgl2YWx1ZTsKLQotCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKLQltZW1jcHkoJnZhbHVlLCBwUmFDZmctPmRhdGEsIDEpOwotCi0JaWYgKEFURV9PTihwQWRhcHRlcikpCi0JewotCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIG9mZnNldCwgdmFsdWUpOwotCX0KLQllbHNlCi0JewotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBvZmZzZXQsIHZhbHVlKTsKLQl9Ci0KLQlpZiAoKG9mZnNldCA9PSBCQlBfUjEpIHx8IChvZmZzZXQgPT0gQkJQX1IzKSkKLQl7Ci0JCVN5bmNUeFJ4Q29uZmlnKHBBZGFwdGVyLCBvZmZzZXQsIHZhbHVlKTsKLQl9Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0JCUF9SRUFEX0FMTCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JVVNIT1JUIGJicF9yZWdfaW5kZXg7Ci0KLQlmb3IgKGJicF9yZWdfaW5kZXggPSAwOyBiYnBfcmVnX2luZGV4IDwgTUFYX0JCUF9JRCsxOyBiYnBfcmVnX2luZGV4KyspCi0JewotCQlwUmFDZmctPmRhdGFbYmJwX3JlZ19pbmRleF0gPSAwOwotCi0JCWlmIChBVEVfT04ocEFkYXB0ZXIpKQotCQl7Ci0JCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwX3JlZ19pbmRleCwgJnBSYUNmZy0+ZGF0YVtiYnBfcmVnX2luZGV4XSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicF9yZWdfaW5kZXgsICZwUmFDZmctPmRhdGFbYmJwX3JlZ19pbmRleF0pOwotCQl9Ci0JfQotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpK01BWF9CQlBfSUQrMSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfR0VUX05PSVNFX0xFVkVMKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlVQ0hBUgljaGFubmVsOwotCUlOVDMyICAgYnVmZmVyWzNdWzEwXTsvKiAzIDogUnhQYXRoIDsgMTAgOiBuby4gb2YgcGVyIHJzc2kgc2FtcGxlcyAqLwotCi0JY2hhbm5lbCA9IChudG9ocyhwUmFDZmctPnN0YXR1cykgJiAweDAwRkYpOwotCUNhbE5vaXNlTGV2ZWwocEFkYXB0ZXIsIGNoYW5uZWwsIGJ1ZmZlcik7Ci0JbWVtY3B5X2V4bChwQWRhcHRlciwgKFVDSEFSICopcFJhQ2ZnLT5kYXRhLCAoVUNIQVIgKikmKGJ1ZmZlclswXVswXSksIChzaXplb2YoSU5UMzIpKjMqMTApKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSsoc2l6ZW9mKElOVDMyKSozKjEwKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfR0VUX0NPVU5URVIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlUyTSwgNCk7Ci0JbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuT3RoZXJEYXRhLCA0KTsKLQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzhdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5CZWFjb24sIDQpOwotCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMTJdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5PdGhlckNvdW50LCA0KTsKLQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzE2XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVHhBYzAsIDQpOwotCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMjBdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5UeEFjMSwgNCk7Ci0JbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsyNF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlR4QWMyLCA0KTsKLQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzI4XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVHhBYzMsIDQpOwotCS8qbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVszMl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlR4SENDQSwgNCk7Ki8KLQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzM2XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVHhNZ210LCA0KTsKLQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzQwXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuUlNTSTAsIDQpOwotCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNDRdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5SU1NJMSwgNCk7Ci0JbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0OF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlJTU0kyLCA0KTsKLQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzUyXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuU05SMCwgNCk7Ci0JbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs1Nl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlNOUjEsIDQpOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpKzYwLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9DTEVBUl9DT1VOVEVSKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlwQWRhcHRlci0+YXRlLlUyTSA9IDA7Ci0JcEFkYXB0ZXItPmF0ZS5PdGhlckRhdGEgPSAwOwotCXBBZGFwdGVyLT5hdGUuQmVhY29uID0gMDsKLQlwQWRhcHRlci0+YXRlLk90aGVyQ291bnQgPSAwOwotCXBBZGFwdGVyLT5hdGUuVHhBYzAgPSAwOwotCXBBZGFwdGVyLT5hdGUuVHhBYzEgPSAwOwotCXBBZGFwdGVyLT5hdGUuVHhBYzIgPSAwOwotCXBBZGFwdGVyLT5hdGUuVHhBYzMgPSAwOwotCS8qcEFkYXB0ZXItPmF0ZS5UeEhDQ0EgPSAwOyovCi0JcEFkYXB0ZXItPmF0ZS5UeE1nbXQgPSAwOwotCXBBZGFwdGVyLT5hdGUuVHhEb25lQ291bnQgPSAwOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9UWF9TVEFSVCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JVVNIT1JUICpwOwotCVVTSE9SVAllcnIgPSAxOwotCVVDSEFSICAgQmJwMjJWYWx1ZSA9IDAsIEJicDI0VmFsdWUgPSAwOwotCi0JaWYgKChwQWRhcHRlci0+YXRlLlR4U3RhdHVzICE9IDApICYmIChwQWRhcHRlci0+YXRlLk1vZGUgJiBBVEVfVFhGUkFNRSkpCi0JewotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkF0ZSBUeCBpcyBhbHJlYWR5IHJ1bm5pbmcsIHRvIHJ1biBuZXh0IFR4LCB5b3UgbXVzdCBzdG9wIGl0IGZpcnN0XG4iKSk7Ci0JCWVyciA9IDI7Ci0JCWdvdG8gVFhfU1RBUlRfRVJST1I7Ci0JfQotCWVsc2UgaWYgKChwQWRhcHRlci0+YXRlLlR4U3RhdHVzICE9IDApICYmICEocEFkYXB0ZXItPmF0ZS5Nb2RlICYgQVRFX1RYRlJBTUUpKQotCXsKLQkJaW50IGkgPSAwOwotCi0JCXdoaWxlICgoaSsrIDwgMTApICYmIChwQWRhcHRlci0+YXRlLlR4U3RhdHVzICE9IDApKQotCQl7Ci0JCQlSVE1QdXNlY0RlbGF5KDUwMDApOwotCQl9Ci0KLQkJLyogZm9yY2UgaXQgdG8gc3RvcCAqLwotCQlwQWRhcHRlci0+YXRlLlR4U3RhdHVzID0gMDsKLQkJcEFkYXB0ZXItPmF0ZS5UeERvbmVDb3VudCA9IDA7Ci0JCXBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9IEZBTFNFOwotCX0KLQotCS8qCi0JCUlmIHBSYUNmZy0+bGVuZ3RoID09IDAsIHRoaXMgIlJBQ0ZHX0NNRF9UWF9TVEFSVCIKLQkJaXMgZm9yIENhcnJpZXIgdGVzdCBvciBDYXJyaWVyIFN1cHByZXNzaW9uLgotCSovCi0JaWYgKG50b2hzKHBSYUNmZy0+bGVuZ3RoKSAhPSAwKQotCXsKLQkJLyogZ2V0IGZyYW1lIGluZm8gKi8KLQotCQlOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPmF0ZS5UeFdJLCBwUmFDZmctPmRhdGEgKyAyLCAxNik7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCQlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUikmcEFkYXB0ZXItPmF0ZS5UeFdJLCBUWVBFX1RYV0kpOwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLQotCQlOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPmF0ZS5UeENvdW50LCBwUmFDZmctPmRhdGEgKyAxOCwgNCk7Ci0JCXBBZGFwdGVyLT5hdGUuVHhDb3VudCA9IG50b2hsKHBBZGFwdGVyLT5hdGUuVHhDb3VudCk7Ci0KLQkJcCA9IChVU0hPUlQgKikoJnBSYUNmZy0+ZGF0YVsyMl0pOwotCi0JCS8qIGFsd2F5cyB1c2UgUUlEX0FDX0JFICovCi0JCXBBZGFwdGVyLT5hdGUuUUlEID0gMDsKLQotCQlwID0gKFVTSE9SVCAqKSgmcFJhQ2ZnLT5kYXRhWzI0XSk7Ci0JCXBBZGFwdGVyLT5hdGUuSExlbiA9IG50b2hzKCpwKTsKLQotCQlpZiAocEFkYXB0ZXItPmF0ZS5ITGVuID4gMzIpCi0JCXsKLQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgicEFkYXB0ZXItPmF0ZS5ITGVuID4gMzJcbiIpKTsKLQkJCWVyciA9IDM7Ci0JCQlnb3RvIFRYX1NUQVJUX0VSUk9SOwotCQl9Ci0KLQkJTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5hdGUuSGVhZGVyLCBwUmFDZmctPmRhdGEgKyAyNiwgcEFkYXB0ZXItPmF0ZS5ITGVuKTsKLQotCQlwQWRhcHRlci0+YXRlLlBMZW4gPSBudG9ocyhwUmFDZmctPmxlbmd0aCkgLSAocEFkYXB0ZXItPmF0ZS5ITGVuICsgMjgpOwotCi0JCWlmIChwQWRhcHRlci0+YXRlLlBMZW4gPiAzMikKLQkJewotCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJwQWRhcHRlci0+YXRlLlBMZW4gPiAzMlxuIikpOwotCQkJZXJyID0gNDsKLQkJCWdvdG8gVFhfU1RBUlRfRVJST1I7Ci0JCX0KLQotCQlOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPmF0ZS5QYXR0ZXJuLCBwUmFDZmctPmRhdGEgKyAyNiArIHBBZGFwdGVyLT5hdGUuSExlbiwgcEFkYXB0ZXItPmF0ZS5QTGVuKTsKLQkJcEFkYXB0ZXItPmF0ZS5ETGVuID0gcEFkYXB0ZXItPmF0ZS5UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudCAtIHBBZGFwdGVyLT5hdGUuSExlbjsKLQl9Ci0KLQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IyMiwgJkJicDIyVmFsdWUpOwotCi0Jc3dpdGNoIChCYnAyMlZhbHVlKQotCXsKLQkJY2FzZSBCQlAyMl9UWEZSQU1FOgotCQkJewotCQkJCWlmIChwQWRhcHRlci0+YXRlLlR4Q291bnQgPT0gMCkKLQkJCQl7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCQkJCXBBZGFwdGVyLT5hdGUuVHhDb3VudCA9IDB4RkZGRkZGRkY7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JCQkJfQotCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBUlQgVFhGUkFNRVxuIikpOwotCQkJCXBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9IFRSVUU7Ci0JCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhGUkFNRSIpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBCQlAyMl9UWENPTlRfT1JfQ0FSUlNVUFA6Ci0JCQl7Ci0JCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQlAyMl9UWENPTlRfT1JfQ0FSUlNVUFBcbiIpKTsKLQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IyNCwgJkJicDI0VmFsdWUpOwotCi0JCQkJc3dpdGNoIChCYnAyNFZhbHVlKQotCQkJCXsKLQkJCQkJY2FzZSBCQlAyNF9UWENPTlQ6Ci0JCQkJCQl7Ci0JCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEFSVCBUWENPTlRcbiIpKTsKLQkJCQkJCQlwQWRhcHRlci0+YXRlLmJRQVR4U3RhcnQgPSBUUlVFOwotCQkJCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlRYQ09OVCIpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0KLQkJCQkJY2FzZSBCQlAyNF9DQVJSU1VQUDoKLQkJCQkJCXsKLQkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQVJUIFRYQ0FSUlNVUFBcbiIpKTsKLQkJCQkJCQlwQWRhcHRlci0+YXRlLmJRQVR4U3RhcnQgPSBUUlVFOwotCQkJCQkJCXBBZGFwdGVyLT5hdGUuTW9kZSB8PSBBVEVfVFhDQVJSU1VQUDsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCi0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQl7Ci0JCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJVbmtub3duIFRYIHN1YnR5cGUgISIpKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQkJQMjJfVFhDQVJSOgotCQkJewotCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBUlQgVFhDQVJSXG4iKSk7Ci0JCQkJcEFkYXB0ZXItPmF0ZS5iUUFUeFN0YXJ0ID0gVFJVRTsKLQkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJUWENBUlIiKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQl7Ci0JCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJVbmtub3duIFN0YXJ0IFRYIHN1YnR5cGUgISIpKTsKLQkJCX0KLQkJCWJyZWFrOwotCX0KLQotCWlmIChwQWRhcHRlci0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKLQl7Ci0JCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotCX0KLQotVFhfU1RBUlRfRVJST1I6Ci0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBlcnIpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfR0VUX1RYX1NUQVRVUygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JVUlOVDMyIGNvdW50PTA7Ci0KLQljb3VudCA9IGh0b25sKHBBZGFwdGVyLT5hdGUuVHhEb25lQ291bnQpOwotCU5kaXNNb3ZlTWVtb3J5KHBSYUNmZy0+ZGF0YSwgJmNvdW50LCA0KTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSs0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9UWF9TVE9QKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9UWF9TVE9QXG4iKSk7Ci0KLQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJUWFNUT1AiKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfUlhfU1RBUlQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX1JYX1NUQVJUXG4iKSk7Ci0KLQlwQWRhcHRlci0+YXRlLmJRQVJ4U3RhcnQgPSBUUlVFOwotCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlJYRlJBTUUiKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfUlhfU1RPUCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfUlhfU1RPUFxuIikpOwotCi0JU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiUlhTVE9QIik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DQVJSSUVSKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ0FSUklFUlxuIikpOwotCi0JU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhDQVJSIik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DT05UKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ09OVFxuIikpOwotCi0JU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhDT05UIik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9GUkFNRSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NUQVJUX1RYX0ZSQU1FXG4iKSk7Ci0KLQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJUWEZSQU1FIik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TRVRfQlcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCVNIT1JUICAgIHZhbHVlID0gMDsKLQlTVFJJTkcgICAgc3RyW0xFTl9PRl9BUkddOwotCi0JTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfQldcbiIpKTsKLQotCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7Ci0JdmFsdWUgPSBudG9ocyh2YWx1ZSk7Ci0Jc3ByaW50ZigoY2hhciAqKXN0ciwgIiVkIiwgdmFsdWUpOwotCi0JU2V0X0FURV9UWF9CV19Qcm9jKHBBZGFwdGVyLCBzdHIpOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JU0hPUlQgICAgdmFsdWUgPSAwOwotCVNUUklORyAgICBzdHJbTEVOX09GX0FSR107Ci0KLQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOwotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjBcbiIpKTsKLQotCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7Ci0JdmFsdWUgPSBudG9ocyh2YWx1ZSk7Ci0Jc3ByaW50ZigoY2hhciAqKXN0ciwgIiVkIiwgdmFsdWUpOwotCVNldF9BVEVfVFhfUE9XRVIwX1Byb2MocEFkYXB0ZXIsIHN0cik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIxKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlTSE9SVCAgICB2YWx1ZSA9IDA7Ci0JU1RSSU5HICAgIHN0cltMRU5fT0ZfQVJHXTsKLQotCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMVxuIikpOwotCi0JbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKLQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKLQlzcHJpbnRmKChjaGFyICopc3RyLCAiJWQiLCB2YWx1ZSk7Ci0JU2V0X0FURV9UWF9QT1dFUjFfUHJvYyhwQWRhcHRlciwgc3RyKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NFVF9GUkVRX09GRlNFVCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JU0hPUlQgICAgdmFsdWUgPSAwOwotCVNUUklORyAgICBzdHJbTEVOX09GX0FSR107Ci0KLQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOwotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9GUkVRX09GRlNFVFxuIikpOwotCi0JbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKLQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKLQlzcHJpbnRmKChjaGFyICopc3RyLCAiJWQiLCB2YWx1ZSk7Ci0JU2V0X0FURV9UWF9GUkVRT0ZGU0VUX1Byb2MocEFkYXB0ZXIsIHN0cik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9HRVRfU1RBVElTVElDUygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX0dFVF9TVEFUSVNUSUNTXG4iKSk7Ci0KLQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzBdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5UeERvbmVDb3VudCwgNCk7Ci0JbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0XSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC51Lkxvd1BhcnQsIDQpOwotCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbOF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LnUuTG93UGFydCwgNCk7Ci0JbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsxMl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJUU1N1Y2Nlc3NDb3VudC51Lkxvd1BhcnQsIDQpOwotCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMTZdLCAoVUNIQVIgKikmcEFkYXB0ZXItPldsYW5Db3VudGVycy5SVFNGYWlsdXJlQ291bnQudS5Mb3dQYXJ0LCA0KTsKLQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzIwXSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0LCA0KTsKLQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzI0XSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC51Lkxvd1BhcnQsIDQpOwotCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMjhdLCAoVUNIQVIgKikmcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyLCA0KTsKLQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzMyXSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRnJhbWVEdXBsaWNhdGVDb3VudC51Lkxvd1BhcnQsIDQpOwotCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMzZdLCAoVUNIQVIgKikmcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLk9uZVNlY0ZhbHNlQ0NBQ250LCA0KTsKLQotCWlmIChwQWRhcHRlci0+YXRlLlJ4QW50ZW5uYVNlbCA9PSAwKQotCXsKLQkJSU5UMzIgUlNTSTAgPSAwOwotCQlJTlQzMiBSU1NJMSA9IDA7Ci0JCUlOVDMyIFJTU0kyID0gMDsKLQotCQlSU1NJMCA9IChJTlQzMikocEFkYXB0ZXItPmF0ZS5MYXN0UnNzaTAgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGEpOwotCQlSU1NJMSA9IChJTlQzMikocEFkYXB0ZXItPmF0ZS5MYXN0UnNzaTEgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGEpOwotCQlSU1NJMiA9IChJTlQzMikocEFkYXB0ZXItPmF0ZS5MYXN0UnNzaTIgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGEpOwotCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzQwXSwgKFVDSEFSICopJlJTU0kwLCA0KTsKLQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0NF0sIChVQ0hBUiAqKSZSU1NJMSwgNCk7Ci0JCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNDhdLCAoVUNIQVIgKikmUlNTSTIsIDQpOwotCQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cykrNTIsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCX0KLQllbHNlCi0JewotCQlJTlQzMiBSU1NJMCA9IDA7Ci0KLQkJUlNTSTAgPSAoSU5UMzIpKHBBZGFwdGVyLT5hdGUuTGFzdFJzc2kwIC0gcEFkYXB0ZXItPkJicFJzc2lUb0RibURlbHRhKTsKLQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0MF0sIChVQ0hBUiAqKSZSU1NJMCwgNCk7Ci0JCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSs0NCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JfQotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9SRVNFVF9DT1VOVEVSKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlTSE9SVCAgICB2YWx1ZSA9IDE7Ci0JU1RSSU5HICAgIHN0cltMRU5fT0ZfQVJHXTsKLQotCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfUkVTRVRfQ09VTlRFUlxuIikpOwotCi0Jc3ByaW50ZigoY2hhciAqKXN0ciwgIiVkIiwgdmFsdWUpOwotCVNldF9SZXNldFN0YXRDb3VudGVyX1Byb2MocEFkYXB0ZXIsIHN0cik7Ci0KLQlwQWRhcHRlci0+YXRlLlR4RG9uZUNvdW50ID0gMDsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NFTF9UWF9BTlRFTk5BKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlTSE9SVCAgICB2YWx1ZSA9IDA7Ci0JU1RSSU5HICAgIHN0cltMRU5fT0ZfQVJHXTsKLQotCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VMX1RYX0FOVEVOTkFcbiIpKTsKLQotCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7Ci0JdmFsdWUgPSBudG9ocyh2YWx1ZSk7Ci0Jc3ByaW50ZigoY2hhciAqKXN0ciwgIiVkIiwgdmFsdWUpOwotCVNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jKHBBZGFwdGVyLCBzdHIpOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VMX1JYX0FOVEVOTkEoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCVNIT1JUICAgIHZhbHVlID0gMDsKLQlTVFJJTkcgICAgc3RyW0xFTl9PRl9BUkddOwotCi0JTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRUxfUlhfQU5URU5OQVxuIikpOwotCi0JbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKLQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKLQlzcHJpbnRmKChjaGFyICopc3RyLCAiJWQiLCB2YWx1ZSk7Ci0JU2V0X0FURV9SWF9BbnRlbm5hX1Byb2MocEFkYXB0ZXIsIHN0cik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TRVRfUFJFQU1CTEUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCVNIT1JUICAgIHZhbHVlID0gMDsKLQlTVFJJTkcgICAgc3RyW0xFTl9PRl9BUkddOwotCi0JTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfUFJFQU1CTEVcbiIpKTsKLQotCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7Ci0JdmFsdWUgPSBudG9ocyh2YWx1ZSk7Ci0Jc3ByaW50ZigoY2hhciAqKXN0ciwgIiVkIiwgdmFsdWUpOwotCVNldF9BVEVfVFhfTU9ERV9Qcm9jKHBBZGFwdGVyLCBzdHIpOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VUX0NIQU5ORUwoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCVNIT1JUICAgIHZhbHVlID0gMDsKLQlTVFJJTkcgICAgc3RyW0xFTl9PRl9BUkddOwotCi0JTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfQ0hBTk5FTFxuIikpOwotCi0JbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKLQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKLQlzcHJpbnRmKChjaGFyICopc3RyLCAiJWQiLCB2YWx1ZSk7Ci0JU2V0X0FURV9DSEFOTkVMX1Byb2MocEFkYXB0ZXIsIHN0cik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TRVRfQUREUjEoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfQUREUjFcbiIpKTsKLQotCS8qCi0JCUFkZHIgaXMgYW4gYXJyYXkgb2YgVUNIQVIsCi0JCXNvIG5vIG5lZWQgdG8gcGVyZm9ybSBlbmRpYW4gc3dhcC4KLQkqLwotCW1lbWNweShwQWRhcHRlci0+YXRlLkFkZHIxLCAoUFVDSEFSKShwUmFDZmctPmRhdGEgLSAyKSwgTUFDX0FERFJfTEVOKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NFVF9BRERSMigKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9BRERSMlxuIikpOwotCi0JLyoKLQkJQWRkciBpcyBhbiBhcnJheSBvZiBVQ0hBUiwKLQkJc28gbm8gbmVlZCB0byBwZXJmb3JtIGVuZGlhbiBzd2FwLgotCSovCi0JbWVtY3B5KHBBZGFwdGVyLT5hdGUuQWRkcjIsIChQVUNIQVIpKHBSYUNmZy0+ZGF0YSAtIDIpLCBNQUNfQUREUl9MRU4pOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VUX0FERFIzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIzXG4iKSk7Ci0KLQkvKgotCQlBZGRyIGlzIGFuIGFycmF5IG9mIFVDSEFSLAotCQlzbyBubyBuZWVkIHRvIHBlcmZvcm0gZW5kaWFuIHN3YXAuCi0JKi8KLQltZW1jcHkocEFkYXB0ZXItPmF0ZS5BZGRyMywgKFBVQ0hBUikocFJhQ2ZnLT5kYXRhIC0gMiksIE1BQ19BRERSX0xFTik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TRVRfUkFURSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JU0hPUlQgICAgdmFsdWUgPSAwOwotCVNUUklORyAgICBzdHJbTEVOX09GX0FSR107Ci0KLQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOwotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9SQVRFXG4iKSk7Ci0KLQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOwotCXZhbHVlID0gbnRvaHModmFsdWUpOwotCXNwcmludGYoKGNoYXIgKilzdHIsICIlZCIsIHZhbHVlKTsKLQlTZXRfQVRFX1RYX01DU19Qcm9jKHBBZGFwdGVyLCBzdHIpOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0xFTigKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JU0hPUlQgICAgdmFsdWUgPSAwOwotCVNUUklORyAgICBzdHJbTEVOX09GX0FSR107Ci0KLQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOwotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9MRU5cbiIpKTsKLQotCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7Ci0JdmFsdWUgPSBudG9ocyh2YWx1ZSk7Ci0Jc3ByaW50ZigoY2hhciAqKXN0ciwgIiVkIiwgdmFsdWUpOwotCVNldF9BVEVfVFhfTEVOR1RIX1Byb2MocEFkYXB0ZXIsIHN0cik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TRVRfVFhfRlJBTUVfQ09VTlQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCVVTSE9SVCAgICB2YWx1ZSA9IDA7Ci0JU1RSSU5HICAgIHN0cltMRU5fT0ZfQVJHXTsKLQotCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0NPVU5UXG4iKSk7Ci0KLQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOwotCXZhbHVlID0gbnRvaHModmFsdWUpOwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JLyogVFhfRlJBTUVfQ09VTlQgPT0gMCBtZWFucyB0eCBpbmZpbml0ZWx5ICovCi0JaWYgKHZhbHVlID09IDApCi0JewotCQkvKiBVc2UgVHhDb3VudCA9IDB4RkZGRkZGRkYgdG8gYXBwcm94aW1hdGUgdGhlIGluZmluaXR5LiAqLwotCQlwQWRhcHRlci0+YXRlLlR4Q291bnQgPSAweEZGRkZGRkZGOwotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX0NPVU5UX1Byb2MgKFR4Q291bnQgPSAlZClcbiIsIHBBZGFwdGVyLT5hdGUuVHhDb3VudCkpOwotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfQ09VTlRfUHJvYyBTdWNjZXNzXG4iKSk7Ci0KLQotCX0KLQllbHNlCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JewotCQlzcHJpbnRmKChjaGFyICopc3RyLCAiJWQiLCB2YWx1ZSk7Ci0JCVNldF9BVEVfVFhfQ09VTlRfUHJvYyhwQWRhcHRlciwgc3RyKTsKLQl9Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TVEFSVF9SWF9GUkFNRSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfUlhfU1RBUlRcbiIpKTsKLQotCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlJYRlJBTUUiKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX0UyUFJPTV9SRUFEX0JVTEsoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCVVTSE9SVCBvZmZzZXQ7Ci0JVVNIT1JUIGxlbjsKLQlVU0hPUlQgYnVmZmVyW0VFUFJPTV9TSVpFLzJdOwotCi0Jb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOwotCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGEsIDIpOwotCWxlbiA9IG50b2hzKGxlbik7Ci0KLQlydF9lZV9yZWFkX2FsbChwQWRhcHRlciwgKFVTSE9SVCAqKWJ1ZmZlcik7Ci0KLQlpZiAob2Zmc2V0ICsgbGVuIDw9IEVFUFJPTV9TSVpFKQotCQltZW1jcHlfZXhzKHBBZGFwdGVyLCBwUmFDZmctPmRhdGEsIChVQ0hBUiAqKWJ1ZmZlcitvZmZzZXQsIGxlbik7Ci0JZWxzZQotCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJleGNlZWQgRUVQUk9NIHNpemVcbiIpKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKStsZW4sIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9FMlBST01fV1JJVEVfQlVMSygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JVVNIT1JUIG9mZnNldDsKLQlVU0hPUlQgbGVuOwotCVVTSE9SVCBidWZmZXJbRUVQUk9NX1NJWkUvMl07Ci0KLQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7Ci0JbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSwgMik7Ci0JbGVuID0gbnRvaHMobGVuKTsKLQotCXJ0X2VlX3JlYWRfYWxsKHBBZGFwdGVyLChVU0hPUlQgKilidWZmZXIpOwotCW1lbWNweV9leHMocEFkYXB0ZXIsIChVQ0hBUiAqKWJ1ZmZlciArIG9mZnNldCwgKFVDSEFSICopcFJhQ2ZnLT5kYXRhICsgMiwgbGVuKTsKLQlydF9lZV93cml0ZV9hbGwocEFkYXB0ZXIsKFVTSE9SVCAqKWJ1ZmZlcik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9JT19XUklURV9CVUxLKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlVSU5UMzIgb2Zmc2V0LCBpLCB2YWx1ZTsKLQlVU0hPUlQgbGVuOwotCi0JbWVtY3B5KCZvZmZzZXQsICZwUmFDZmctPnN0YXR1cywgNCk7Ci0Jb2Zmc2V0ID0gbnRvaGwob2Zmc2V0KTsKLQltZW1jcHkoJmxlbiwgcFJhQ2ZnLT5kYXRhKzIsIDIpOwotCWxlbiA9IG50b2hzKGxlbik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpCi0JewotCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAoVUNIQVIgKikmdmFsdWUsIHBSYUNmZy0+ZGF0YSs0K2ksIDQpOwotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIldyaXRlICV4ICV4XG4iLCBvZmZzZXQgKyBpLCB2YWx1ZSkpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsICgob2Zmc2V0K2kpICYgKDB4ZmZmZikpLCB2YWx1ZSk7Ci0JfQotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfQkJQX1JFQURfQlVMSygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JVVNIT1JUIG9mZnNldDsKLQlVU0hPUlQgbGVuOwotCVVTSE9SVCBqOwotCi0Jb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOwotCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGEsIDIpOwotCWxlbiA9IG50b2hzKGxlbik7Ci0KLQlmb3IgKGogPSBvZmZzZXQ7IGogPCAob2Zmc2V0K2xlbik7IGorKykKLQl7Ci0JCXBSYUNmZy0+ZGF0YVtqIC0gb2Zmc2V0XSA9IDA7Ci0KLQkJaWYgKHBBZGFwdGVyLT5hdGUuTW9kZSA9PSBBVEVfU1RPUCkKLQkJewotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBqLCAmcFJhQ2ZnLT5kYXRhW2ogLSBvZmZzZXRdKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBqLCAmcFJhQ2ZnLT5kYXRhW2ogLSBvZmZzZXRdKTsKLQkJfQotCX0KLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKStsZW4sIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9CQlBfV1JJVEVfQlVMSygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JVVNIT1JUIG9mZnNldDsKLQlVU0hPUlQgbGVuOwotCVVTSE9SVCBqOwotCVVDSEFSICp2YWx1ZTsKLQotCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKLQltZW1jcHkoJmxlbiwgcFJhQ2ZnLT5kYXRhLCAyKTsKLQlsZW4gPSBudG9ocyhsZW4pOwotCi0JZm9yIChqID0gb2Zmc2V0OyBqIDwgKG9mZnNldCtsZW4pOyBqKyspCi0JewotCQl2YWx1ZSA9IHBSYUNmZy0+ZGF0YSArIDIgKyAoaiAtIG9mZnNldCk7Ci0JCWlmIChwQWRhcHRlci0+YXRlLk1vZGUgPT0gQVRFX1NUT1ApCi0JCXsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGosICAqdmFsdWUpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBqLCAgKnZhbHVlKTsKLQkJfQotCX0KLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLSNlbmRpZgkvLyBSQUxJTktfQVRFIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X2F0ZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydF9hdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhkNTk2MS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X2F0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX19BVEVfSF9fCi0jZGVmaW5lIF9fQVRFX0hfXwotCi0KLSNpZmRlZiBMSU5VWAotI2RlZmluZSBhdGVfcHJpbnQgcHJpbnRrCi0jZGVmaW5lIEFURURCR1BSSU5UIERCR1BSSU5UCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0jZGVmaW5lIEVFUFJPTV9TSVpFCQkJCQkJCQkweDIwMAotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2RlZmluZSBFRVBST01fQklOX0ZJTEVfTkFNRSAgIi9ldGMvV2lyZWxlc3MvUlQyODYwU1RBL2UycC5iaW4iCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0jZW5kaWYgLy8gTElOVVggLy8KLQotCi0jZGVmaW5lIEFURV9PTihfcCkgICAgICAgICAgICAgICgoKF9wKS0+YXRlLk1vZGUpICE9IEFURV9TVE9QKQotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0jZGVmaW5lIEFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKF9BLCBfSSwgX3BWKSAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQkJQX0NTUl9DRkdfU1RSVUMgIEJicENzcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgICAgICAgICAgICAgaiwgazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoaj0wOyBqPE1BWF9CVVNZX0NPVU5UOyBqKyspICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgUlRNUF9JT19SRUFEMzIoX0EsIEJCUF9DU1JfQ0ZHLCAmQmJwQ3NyLndvcmQpOyAgICAgXAotICAgICAgICBpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci53b3JkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLmZSZWFkID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3IuZmllbGQuQkJQX1JXX01PREUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci5maWVsZC5CdXN5ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLlJlZ051bSA9IF9JOyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBSVE1QX0lPX1dSSVRFMzIoX0EsIEJCUF9DU1JfQ0ZHLCBCYnBDc3Iud29yZCk7ICAgICBcCi0gICAgICAgIGZvciAoaz0wOyBrPE1BWF9CVVNZX0NPVU5UOyBrKyspICAgICAgICAgICAgICAgIFwKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgUlRNUF9JT19SRUFEMzIoX0EsIEJCUF9DU1JfQ0ZHLCAmQmJwQ3NyLndvcmQpOyBcCi0gICAgICAgICAgICBpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gSURMRSkgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmICgoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gSURMRSkgJiYgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIChCYnBDc3IuZmllbGQuUmVnTnVtID09IF9JKSkgICAgICAgICAgICAgICAgXAotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAqKF9wVikgPSAoVUNIQVIpQmJwQ3NyLmZpZWxkLlZhbHVlOyAgICAgICAgIFwKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkJCUCByZWFkIFIlZCBmYWlsXG4iLCBfSSkpOyAgICAgIFwKLSAgICAgICAgKihfcFYpID0gKF9BKS0+QmJwV3JpdGVMYXRjaFtfSV07ICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKF9BLCBfSSwgX1YpICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBCQlBfQ1NSX0NGR19TVFJVQyAgQmJwQ3NyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCAgICAgICAgICAgICBCdXN5Q250OyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yIChCdXN5Q250PTA7IEJ1c3lDbnQ8TUFYX0JVU1lfQ09VTlQ7IEJ1c3lDbnQrKykgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBSVE1QX0lPX1JFQUQzMihfQSwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7ICAgICBcCi0gICAgICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3Iud29yZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci5maWVsZC5mUmVhZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLkJCUF9SV19NT0RFID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3IuZmllbGQuQnVzeSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci5maWVsZC5WYWx1ZSA9IF9WOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLlJlZ051bSA9IF9JOyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBSVE1QX0lPX1dSSVRFMzIoX0EsIEJCUF9DU1JfQ0ZHLCBCYnBDc3Iud29yZCk7ICAgICBcCi0gICAgICAgIChfQSktPkJicFdyaXRlTGF0Y2hbX0ldID0gX1Y7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKEJ1c3lDbnQgPT0gTUFYX0JVU1lfQ09VTlQpICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJCQlAgd3JpdGUgUiVkIGZhaWxcbiIsIF9JKSk7ICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi0jaWZkZWYgUlQzMHh4Ci0jZGVmaW5lIEFURV9SRl9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpICAgICBSVE1QX1JGX0lPX1JFQUQ4X0JZX1JFR19JRChfQSwgX0ksIF9wVikKLSNkZWZpbmUgQVRFX1JGX0lPX1dSSVRFOF9CWV9SRUdfSUQoX0EsIF9JLCBfVikgICAgIFJUTVBfUkZfSU9fV1JJVEU4X0JZX1JFR19JRChfQSwgX0ksIF9WKQotI2VuZGlmIC8vIFJUMzB4eCAvLwotCi0KLVZPSUQgcnRfZWVfcmVhZF9hbGwoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JT1VUIFVTSE9SVCAqRGF0YSk7Ci0KLVZPSUQgcnRfZWVfd3JpdGVfYWxsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVU0hPUlQgKkRhdGEpOwotCi1JTlQgU2V0X0FURV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0FURV9EQV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0FURV9TQV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0FURV9CU1NJRF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0FURV9DSEFOTkVMX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0FURV9UWF9QT1dFUjFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0FURV9SWF9BbnRlbm5hX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9BVEVfVFhfQldfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9BVEVfVFhfTEVOR1RIX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfQVRFX1RYX0NPVU5UX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfQVRFX1RYX01DU19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0FURV9UWF9NT0RFX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfQVRFX1RYX0dJX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLQotSU5UCVNldF9BVEVfUlhfRkVSX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBTZXRfQVRFX1JlYWRfUkZfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9BVEVfV3JpdGVfUkYxX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBTZXRfQVRFX1dyaXRlX1JGMl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQgU2V0X0FURV9Xcml0ZV9SRjNfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9BVEVfV3JpdGVfUkY0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBTZXRfQVRFX0xvYWRfRTJQX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBTZXRfQVRFX1JlYWRfRTJQX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLQotSU5UCVNldF9BVEVfU2hvd19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0FURV9IZWxwX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotVk9JRCBBVEVfUUFfU3RhdGlzdGljcygKLQlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gUFJYV0lfU1RSVUMJCQlwUnhXSSwKLQlJTiBQUlQyOFhYX1JYRF9TVFJVQyAgICBwMjh4eFJ4RCwKLQlJTiBQSEVBREVSXzgwMl8xMQkJcEhlYWRlcik7Ci0KLVZPSUQgUnRtcERvQXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEpOwotCi1WT0lEIEJ1YmJsZVNvcnQoCi0JSU4gIElOVDMyIG4sCi0JSU4gIElOVDMyIGFbXSk7Ci0KLVZPSUQgQ2FsTm9pc2VMZXZlbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotCUlOICBVQ0hBUiAgICAgICAgICAgY2hhbm5lbCwKLQlPVVQgSU5UMzIgICAgICAgICAgIGJ1ZmZlclszXVsxMF0pOwotCi1CT09MRUFOIFN5bmNUeFJ4Q29uZmlnKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4JVVNIT1JUCQkJb2Zmc2V0LAotCUlOCVVDSEFSCQkJdmFsdWUpOwotCi1JTlQgU2V0X1R4U3RvcF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQgU2V0X1J4U3RvcF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi0jaWZkZWYgREJHCi1JTlQgU2V0X0VFUmVhZF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQgU2V0X0VFV3JpdGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9CQlBSZWFkX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBTZXRfQkJQV3JpdGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9SRldyaXRlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0jZW5kaWYgLy8gREJHIC8vCi0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLQotCi1WT0lEIEFURUFzaWNTd2l0Y2hDaGFubmVsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBBVEVBc2ljQWRqdXN0VHhQb3dlcigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgQVRFRGlzYWJsZUFzaWNQcm90ZWN0KAotCUlOCQlQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLUNIQVIgQVRFQ29udmVydFRvUnNzaSgKLQlJTiBQUlRNUF9BREFQVEVSICBwQWQsCi0JSU4gQ0hBUgkJCQlSc3NpLAotCUlOIFVDSEFSICAgIFJzc2lOdW1iZXIpOwotCi1WT0lEIEFURVNhbXBsZVJzc2koCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gUFJYV0lfU1RSVUMJCXBSeFdJKTsKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1WT0lEIFJUTVBTdGF0aW9uU3RvcCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgUlRNUFN0YXRpb25TdGFydCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gX19BVEVfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X2NvbmZpZy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydF9jb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA1MTQyZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X2NvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JcnRfY29uZmlnLmgKLQotCUFic3RyYWN0OgotCUNlbnRyYWwgaGVhZGVyIGZpbGUgdG8gbWFpbnRhaW4gYWxsIGluY2x1ZGUgZmlsZXMgZm9yIGFsbCBORElTCi0JbWluaXBvcnQgZHJpdmVyIHJvdXRpbmVzLgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLQktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlQYXVsIExpbiAgICAwOC0wMS0yMDAyICAgIGNyZWF0ZWQKLQotKi8KLSNpZm5kZWYJX19SVF9DT05GSUdfSF9fCi0jZGVmaW5lCV9fUlRfQ09ORklHX0hfXwotCi0jaW5jbHVkZSAicnRtcF90eXBlLmgiCi0jaW5jbHVkZSAicnRtcF9vcy5oIgotCi0jaW5jbHVkZSAicnRtcF9kZWYuaCIKLSNpbmNsdWRlICJydG1wX2NoaXAuaCIKLSNpbmNsdWRlICJydG1wX3RpbWVyLmgiCi0KLSNpbmNsdWRlICJvaWQuaCIKLSNpbmNsdWRlICJtbG1lLmgiCi0jaW5jbHVkZSAid3BhLmgiCi0jaW5jbHVkZSAiY3J5cHRfbWQ1LmgiCi0jaW5jbHVkZSAiY3J5cHRfc2hhMi5oIgotI2luY2x1ZGUgImNyeXB0X2htYWMuaCIKLSNpbmNsdWRlICJydG1wLmgiCi0jaW5jbHVkZSAiYXAuaCIKLSNpbmNsdWRlICJkZnMuaCIKLSNpbmNsdWRlICJjaGxpc3QuaCIKLSNpbmNsdWRlICJzcGVjdHJ1bS5oIgotCi0jaWZkZWYgTUxNRV9FWAotI2luY2x1ZGUJIm1sbWVfZXhfZGVmLmgiCi0jaW5jbHVkZQkibWxtZV9leC5oIgotI2VuZGlmIC8vIE1MTUVfRVggLy8KLQotI2luY2x1ZGUgImVlcHJvbS5oIgotI2lmIGRlZmluZWQoUlRNUF9QQ0lfU1VQUE9SVCkgfHwgZGVmaW5lZChSVE1QX1VTQl9TVVBQT1JUKQotI2luY2x1ZGUgInJ0bXBfbWN1LmgiCi0jZW5kaWYKLQotCi0KLSN1bmRlZiBBUF9XU0NfSU5DTFVERUQKLSN1bmRlZiBTVEFfV1NDX0lOQ0xVREVECi0jdW5kZWYgV1NDX0lOQ0xVREVECi0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNpZmRlZiBCTE9DS19ORVRfSUYKLSNpbmNsdWRlICJuZXRpZl9ibG9jay5oIgotI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLwotCi0jaWZkZWYgSUdNUF9TTk9PUF9TVVBQT1JUCi0jaW5jbHVkZSAiaWdtcF9zbm9vcC5oIgotI2VuZGlmIC8vIElHTVBfU05PT1BfU1VQUE9SVCAvLwotCi0jaWZkZWYgUkFMSU5LX0FURQotI2luY2x1ZGUgInJ0X2F0ZS5oIgotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0jaWZuZGVmIFJBTElOS19BVEUKLSNlcnJvciAiRm9yIHN1cHBvcnRpbmcgUUEgR1VJLCBwbGVhc2Ugc2V0IEhBU19BVEU9eSBhbmQgSEFTXzI4eHhfUUE9eS4iCi0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCi0KLQotCi0KLSNpZiBkZWZpbmVkKEFQX1dTQ19JTkNMVURFRCkgfHwgZGVmaW5lZChTVEFfV1NDX0lOQ0xVREVEKQotI2RlZmluZSBXU0NfSU5DTFVERUQKLSNlbmRpZgotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotI2lmbmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0jZXJyb3IgIkJ1aWxkIGZvciBiZWluZyBjb250cm9sbGVkIGJ5IE5ldHdvcmtNYW5hZ2VyIG9yIHdleHQsIHBsZWFzZSBzZXQgSEFTX1dQQV9TVVBQTElDQU5UPXkgYW5kIEhBU19OQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVD15IgotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCi0jaWZkZWYgSUtBTk9TX1ZYXzFYMAotI2luY2x1ZGUgInZyX2lrYW5zLmgiCi0jZW5kaWYgLy8gSUtBTk9TX1ZYXzFYMCAvLwotCi0KLQotI2VuZGlmCS8vIF9fUlRfQ09ORklHX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydF9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydF9saW51eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yjk0YWE2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRfbGludXguYworKysgL2Rldi9udWxsCkBAIC0xLDE2MjQgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSAicnRfY29uZmlnLmgiCi0KLVVMT05HCVJURGVidWdMZXZlbCA9IFJUX0RFQlVHX0VSUk9SOwotCi0KLS8vIGZvciB3aXJlbGVzcyBzeXN0ZW0gZXZlbnQgbWVzc2FnZQotY2hhciBjb25zdCAqcFdpcmVsZXNzU3lzRXZlbnRUZXh0W0lXX1NZU19FVkVOVF9UWVBFX05VTV0gPSB7Ci0JLy8gc3lzdGVtIHN0YXR1cyBldmVudAotICAgICJoYWQgYXNzb2NpYXRlZCBzdWNjZXNzZnVsbHkiLAkJCQkJCQkvKiBJV19BU1NPQ19FVkVOVF9GTEFHICovCi0gICAgImhhZCBkaXNhc3NvY2lhdGVkIiwJCQkJCQkJCQkvKiBJV19ESVNBU1NPQ19FVkVOVF9GTEFHICovCi0gICAgImhhZCBkZWF1dGhlbnRpY2F0ZWQiLAkJCQkJCQkJCS8qIElXX0RFQVVUSF9FVkVOVF9GTEFHICovCi0gICAgImhhZCBiZWVuIGFnZWQtb3V0IGFuZCBkaXNhc3NvY2lhdGVkIiwJCQkJCS8qIElXX0FHRU9VVF9FVkVOVF9GTEFHICovCi0gICAgIm9jY3VycmVkIENvdW50ZXJNZWFzdXJlcyBhdHRhY2siLAkJCQkJCS8qIElXX0NPVU5URVJfTUVBU1VSRVNfRVZFTlRfRkxBRyAqLwotICAgICJvY2N1cnJlZCByZXBsYXkgY291bnRlciBkaWZmZXJlbnQgaW4gS2V5IEhhbmRzaGFraW5nIiwJLyogSVdfUkVQTEFZX0NPVU5URVJfRElGRl9FVkVOVF9GTEFHICovCi0gICAgIm9jY3VycmVkIFJTTklFIGRpZmZlcmVudCBpbiBLZXkgSGFuZHNoYWtpbmciLAkJCS8qIElXX1JTTklFX0RJRkZfRVZFTlRfRkxBRyAqLwotICAgICJvY2N1cnJlZCBNSUMgZGlmZmVyZW50IGluIEtleSBIYW5kc2hha2luZyIsCQkJLyogSVdfTUlDX0RJRkZfRVZFTlRfRkxBRyAqLwotICAgICJvY2N1cnJlZCBJQ1YgZXJyb3IgaW4gUlgiLAkJCQkJCQkJLyogSVdfSUNWX0VSUk9SX0VWRU5UX0ZMQUcgKi8KLSAgICAib2NjdXJyZWQgTUlDIGVycm9yIGluIFJYIiwJCQkJCQkJCS8qIElXX01JQ19FUlJPUl9FVkVOVF9GTEFHICovCi0JIkdyb3VwIEtleSBIYW5kc2hha2luZyB0aW1lb3V0IiwJCQkJCQkvKiBJV19HUk9VUF9IU19USU1FT1VUX0VWRU5UX0ZMQUcgKi8KLQkiUGFpcndpc2UgS2V5IEhhbmRzaGFraW5nIHRpbWVvdXQiLAkJCQkJCS8qIElXX1BBSVJXSVNFX0hTX1RJTUVPVVRfRVZFTlRfRkxBRyAqLwotCSJSU04gSUUgc2FuaXR5IGNoZWNrIGZhaWx1cmUiLAkJCQkJCQkvKiBJV19SU05JRV9TQU5JVFlfRkFJTF9FVkVOVF9GTEFHICovCi0JInNldCBrZXkgZG9uZSBpbiBXUEEvV1BBUFNLIiwJCQkJCQkJLyogSVdfU0VUX0tFWV9ET05FX1dQQTFfRVZFTlRfRkxBRyAqLwotCSJzZXQga2V5IGRvbmUgaW4gV1BBMi9XUEEyUFNLIiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogSVdfU0VUX0tFWV9ET05FX1dQQTJfRVZFTlRfRkxBRyAqLwotCSJjb25uZWN0cyB3aXRoIG91ciB3aXJlbGVzcyBjbGllbnQiLCAgICAgICAgICAgICAgICAgICAgLyogSVdfU1RBX0xJTktVUF9FVkVOVF9GTEFHICovCi0JImRpc2Nvbm5lY3RzIHdpdGggb3VyIHdpcmVsZXNzIGNsaWVudCIsICAgICAgICAgICAgICAgICAvKiBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRyAqLwotCSJzY2FuIGNvbXBsZXRlZCIJCQkJCQkJCQkJLyogSVdfU0NBTl9DT01QTEVURURfRVZFTlRfRkxBRyAqLwotCSJzY2FuIHRlcm1pbmF0ZSEhIEJ1c3khISBFbnF1ZXVlIGZhaWwhISIJCQkJLyogSVdfU0NBTl9FTlFVRVVFX0ZBSUxfRVZFTlRfRkxBRyAqLwotCX07Ci0KLS8vIGZvciB3aXJlbGVzcyBJRFNfc3Bvb2ZfYXR0YWNrIGV2ZW50IG1lc3NhZ2UKLWNoYXIgY29uc3QgKnBXaXJlbGVzc1Nwb29mRXZlbnRUZXh0W0lXX1NQT09GX0VWRU5UX1RZUEVfTlVNXSA9IHsKLSAgICAiZGV0ZWN0ZWQgY29uZmxpY3QgU1NJRCIsCQkJCQkJCQkvKiBJV19DT05GTElDVF9TU0lEX0VWRU5UX0ZMQUcgKi8KLSAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBhc3NvY2lhdGlvbiByZXNwb25zZSIsCQkJCS8qIElXX1NQT09GX0FTU09DX1JFU1BfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCBzcG9vZmVkIHJlYXNzb2NpYXRpb24gcmVzcG9uc2VzIiwJCQkJLyogSVdfU1BPT0ZfUkVBU1NPQ19SRVNQX0VWRU5UX0ZMQUcgKi8KLSAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBwcm9iZSByZXNwb25zZSIsCQkJCQkJLyogSVdfU1BPT0ZfUFJPQkVfUkVTUF9FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIHNwb29mZWQgYmVhY29uIiwJCQkJCQkJCS8qIElXX1NQT09GX0JFQUNPTl9FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIHNwb29mZWQgZGlzYXNzb2NpYXRpb24iLAkJCQkJCS8qIElXX1NQT09GX0RJU0FTU09DX0VWRU5UX0ZMQUcgKi8KLSAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBhdXRoZW50aWNhdGlvbiIsCQkJCQkJLyogSVdfU1BPT0ZfQVVUSF9FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIHNwb29mZWQgZGVhdXRoZW50aWNhdGlvbiIsCQkJCQkvKiBJV19TUE9PRl9ERUFVVEhfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCBzcG9vZmVkIHVua25vd24gbWFuYWdlbWVudCBmcmFtZSIsCQkJLyogSVdfU1BPT0ZfVU5LTk9XTl9NR01UX0VWRU5UX0ZMQUcgKi8KLQkiZGV0ZWN0ZWQgcmVwbGF5IGF0dGFjayIJCQkJCQkJCS8qIElXX1JFUExBWV9BVFRBQ0tfRVZFTlRfRkxBRyAqLwotCX07Ci0KLS8vIGZvciB3aXJlbGVzcyBJRFNfZmxvb2RpbmdfYXR0YWNrIGV2ZW50IG1lc3NhZ2UKLWNoYXIgY29uc3QgKnBXaXJlbGVzc0Zsb29kRXZlbnRUZXh0W0lXX0ZMT09EX0VWRU5UX1RZUEVfTlVNXSA9IHsKLQkiZGV0ZWN0ZWQgYXV0aGVudGljYXRpb24gZmxvb2RpbmciLAkJCQkJCS8qIElXX0ZMT09EX0FVVEhfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCBhc3NvY2lhdGlvbiByZXF1ZXN0IGZsb29kaW5nIiwJCQkJLyogSVdfRkxPT0RfQVNTT0NfUkVRX0VWRU5UX0ZMQUcgKi8KLSAgICAiZGV0ZWN0ZWQgcmVhc3NvY2lhdGlvbiByZXF1ZXN0IGZsb29kaW5nIiwJCQkJLyogSVdfRkxPT0RfUkVBU1NPQ19SRVFfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCBwcm9iZSByZXF1ZXN0IGZsb29kaW5nIiwJCQkJCQkvKiBJV19GTE9PRF9QUk9CRV9SRVFfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCBkaXNhc3NvY2lhdGlvbiBmbG9vZGluZyIsCQkJCQkJLyogSVdfRkxPT0RfRElTQVNTT0NfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCBkZWF1dGhlbnRpY2F0aW9uIGZsb29kaW5nIiwJCQkJCS8qIElXX0ZMT09EX0RFQVVUSF9FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIDgwMi4xeCBlYXAtcmVxdWVzdCBmbG9vZGluZyIJCQkJCS8qIElXX0ZMT09EX0VBUF9SRVFfRVZFTlRfRkxBRyAqLwotCX07Ci0KLQotLyogdGltZW91dCAtLSBtcyAqLwotVk9JRCBSVE1QX1NldFBlcmlvZGljVGltZXIoCi0JSU4JTkRJU19NSU5JUE9SVF9USU1FUiAqcFRpbWVyLAotCUlOCXVuc2lnbmVkIGxvbmcgdGltZW91dCkKLXsKLQl0aW1lb3V0ID0gKCh0aW1lb3V0Kk9TX0haKSAvIDEwMDApOwotCXBUaW1lci0+ZXhwaXJlcyA9IGppZmZpZXMgKyB0aW1lb3V0OwotCWFkZF90aW1lcihwVGltZXIpOwotfQotCi0vKiBjb252ZXJ0IE5kaXNNSW5pdGlhbGl6ZVRpbWVyIC0tPiBSVE1QX09TX0luaXRfVGltZXIgKi8KLVZPSUQgUlRNUF9PU19Jbml0X1RpbWVyKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIgKnBUaW1lciwKLQlJTglUSU1FUl9GVU5DVElPTiBmdW5jdGlvbiwKLQlJTglQVk9JRCBkYXRhKQotewotCWluaXRfdGltZXIocFRpbWVyKTsKLSAgICBwVGltZXItPmRhdGEgPSAodW5zaWduZWQgbG9uZylkYXRhOwotICAgIHBUaW1lci0+ZnVuY3Rpb24gPSBmdW5jdGlvbjsKLX0KLQotCi1WT0lEIFJUTVBfT1NfQWRkX1RpbWVyKAotCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJCSpwVGltZXIsCi0JSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KQotewotCWlmICh0aW1lcl9wZW5kaW5nKHBUaW1lcikpCi0JCXJldHVybjsKLQotCXRpbWVvdXQgPSAoKHRpbWVvdXQqT1NfSFopIC8gMTAwMCk7Ci0JcFRpbWVyLT5leHBpcmVzID0gamlmZmllcyArIHRpbWVvdXQ7Ci0JYWRkX3RpbWVyKHBUaW1lcik7Ci19Ci0KLVZPSUQgUlRNUF9PU19Nb2RfVGltZXIoCi0JSU4JTkRJU19NSU5JUE9SVF9USU1FUgkJKnBUaW1lciwKLQlJTgl1bnNpZ25lZCBsb25nIHRpbWVvdXQpCi17Ci0JdGltZW91dCA9ICgodGltZW91dCpPU19IWikgLyAxMDAwKTsKLQltb2RfdGltZXIocFRpbWVyLCBqaWZmaWVzICsgdGltZW91dCk7Ci19Ci0KLVZPSUQgUlRNUF9PU19EZWxfVGltZXIoCi0JSU4JTkRJU19NSU5JUE9SVF9USU1FUgkJKnBUaW1lciwKLQlPVVQJQk9PTEVBTgkJCQkJKnBDYW5jZWxsZWQpCi17Ci0JaWYgKHRpbWVyX3BlbmRpbmcocFRpbWVyKSkKLQl7Ci0JCSpwQ2FuY2VsbGVkID0gZGVsX3RpbWVyX3N5bmMocFRpbWVyKTsKLQl9Ci0JZWxzZQotCXsKLQkJKnBDYW5jZWxsZWQgPSBUUlVFOwotCX0KLQotfQotCi1WT0lEIFJUTVBfT1NfUmVsZWFzZV9QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JUFFVRVVFX0VOVFJZICBwRW50cnkpCi17Ci0JLy9SVE1QRnJlZU5kaXNQYWNrZXQocEFkLCAoc3RydWN0IHNrX2J1ZmYgKilwRW50cnkpOwotfQotCi0vLyBVbmlmeSBhbGwgZGVsYXkgcm91dGluZSBieSB1c2luZyB1ZGVsYXkKLVZPSUQgUlRNUHVzZWNEZWxheSgKLQlJTglVTE9ORwl1c2VjKQotewotCVVMT05HCWk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgKHVzZWMgLyA1MCk7IGkrKykKLQkJdWRlbGF5KDUwKTsKLQotCWlmICh1c2VjICUgNTApCi0JCXVkZWxheSh1c2VjICUgNTApOwotfQotCi12b2lkIFJUTVBfR2V0Q3VycmVudFN5c3RlbVRpbWUoTEFSR0VfSU5URUdFUiAqdGltZSkKLXsKLQl0aW1lLT51Lkxvd1BhcnQgPSBqaWZmaWVzOwotfQotCi0vLyBwQWQgTVVTVCBhbGxvdyB0byBiZSBOVUxMCi1ORElTX1NUQVRVUyBvc19hbGxvY19tZW0oCi0JSU4JUlRNUF9BREFQVEVSICpwQWQsCi0JT1VUCVVDSEFSICoqbWVtLAotCUlOCVVMT05HICBzaXplKQotewotCSptZW0gPSAoUFVDSEFSKSBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOwotCWlmICgqbWVtKQotCQlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCWVsc2UKLQkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKLX0KLQotLy8gcEFkIE1VU1QgYWxsb3cgdG8gYmUgTlVMTAotTkRJU19TVEFUVVMgb3NfZnJlZV9tZW0oCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JUFZPSUQgbWVtKQotewotCi0JQVNTRVJUKG1lbSk7Ci0Ja2ZyZWUobWVtKTsKLQlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotfQotCi0KLQotCi1QTkRJU19QQUNLRVQgUnRtcE9TTmV0UGt0QWxsb2MoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gaW50IHNpemUpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQkvKiBBZGQgMiBtb3JlIGJ5dGVzIGZvciBpcCBoZWFkZXIgYWxpZ25tZW50Ki8KLQlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemUrMik7Ci0KLQlyZXR1cm4gKChQTkRJU19QQUNLRVQpc2tiKTsKLX0KLQotCi1QTkRJU19QQUNLRVQgUlRNUF9BbGxvY2F0ZUZyYWdQYWNrZXRCdWZmZXIoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoKQotewotCXN0cnVjdCBza19idWZmICpwa3Q7Ci0KLQlwa3QgPSBkZXZfYWxsb2Nfc2tiKExlbmd0aCk7Ci0KLQlpZiAocGt0ID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjYW4ndCBhbGxvY2F0ZSBmcmFnIHJ4ICVsZCBzaXplIHBhY2tldFxuIixMZW5ndGgpKTsKLQl9Ci0KLQlpZiAocGt0KQotCXsKLQkJUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShPU1BLVF9UT19SVFBLVChwa3QpLCBQS1RTUkNfTkRJUyk7Ci0JfQotCi0JcmV0dXJuIChQTkRJU19QQUNLRVQpIHBrdDsKLX0KLQotCi1QTkRJU19QQUNLRVQgUlRNUF9BbGxvY2F0ZVR4UGFja2V0QnVmZmVyKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzKQotewotCXN0cnVjdCBza19idWZmICpwa3Q7Ci0KLQlwa3QgPSBkZXZfYWxsb2Nfc2tiKExlbmd0aCk7Ci0KLQlpZiAocGt0ID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjYW4ndCBhbGxvY2F0ZSB0eCAlbGQgc2l6ZSBwYWNrZXRcbiIsTGVuZ3RoKSk7Ci0JfQotCi0JaWYgKHBrdCkKLQl7Ci0JCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocGt0KSwgUEtUU1JDX05ESVMpOwotCQkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpIHBrdC0+ZGF0YTsKLQl9Ci0JZWxzZQotCXsKLQkJKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKSBOVUxMOwotCX0KLQotCXJldHVybiAoUE5ESVNfUEFDS0VUKSBwa3Q7Ci19Ci0KLQotVk9JRCBidWlsZF90eF9wYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCi0JSU4JUFVDSEFSCXBGcmFtZSwKLQlJTglVTE9ORwlGcmFtZUxlbikKLXsKLQotCXN0cnVjdCBza19idWZmCSpwVHhQa3Q7Ci0KLQlBU1NFUlQocFBhY2tldCk7Ci0JcFR4UGt0ID0gUlRQS1RfVE9fT1NQS1QocFBhY2tldCk7Ci0KLQlOZGlzTW92ZU1lbW9yeShza2JfcHV0KHBUeFBrdCwgRnJhbWVMZW4pLCBwRnJhbWUsIEZyYW1lTGVuKTsKLX0KLQotVk9JRAlSVE1QRnJlZUFkYXB0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JUE9TX0NPT0tJRSBvc19jb29raWU7Ci0JaW50IGluZGV4OwotCi0Jb3NfY29va2llPShQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOwotCi0JaWYgKHBBZC0+QmVhY29uQnVmKQotCQlrZnJlZShwQWQtPkJlYWNvbkJ1Zik7Ci0KLQotCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+TWdtdFJpbmdMb2NrKTsKLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+UnhSaW5nTG9jayk7Ci0jaWZkZWYgUlQzMDkwCi1OZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPk1jdUNtZExvY2spOwotI2VuZGlmIC8vIFJUMzA5MCAvLwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JZm9yIChpbmRleCA9MCA7IGluZGV4IDwgTlVNX09GX1RYX1JJTkc7IGluZGV4KyspCi0JewotCQlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPlR4U3dRdWV1ZUxvY2tbaW5kZXhdKTsKLQkJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5EZVF1ZXVlTG9ja1tpbmRleF0pOwotCQlwQWQtPkRlUXVldWVSdW5uaW5nW2luZGV4XSA9IEZBTFNFOwotCX0KLQotCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+aXJxX2xvY2spOwotCi0KLQl2ZnJlZShwQWQpOyAvLyBwY2lfZnJlZV9jb25zaXN0ZW50KG9zX2Nvb2tpZS0+cGNpX2RldixzaXplb2YoUlRNUF9BREFQVEVSKSxwQWQsb3NfY29va2llLT5wQWRfcGEpOwotCWlmIChvc19jb29raWUpCi0JCWtmcmVlKG9zX2Nvb2tpZSk7Ci19Ci0KLUJPT0xFQU4gT1NfTmVlZF9DbG9uZV9QYWNrZXQodm9pZCkKLXsKLQlyZXR1cm4gKEZBTFNFKTsKLX0KLQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQljbG9uZSBhbiBpbnB1dCBORElTIFBBQ0tFVCB0byBhbm90aGVyIG9uZS4gVGhlIG5ldyBpbnRlcm5hbGx5IGNyZWF0ZWQgTkRJUyBQQUNLRVQKLQkJbXVzdCBoYXZlIG9ubHkgb25lIE5ESVMgQlVGRkVSCi0JCXJldHVybiAtIGJ5dGUgY29waWVkLiAwIG1lYW5zIGNhbid0IGNyZWF0ZSBORElTIFBBQ0tFVAotCQlOT1RFOiBpbnRlcm5hbGx5IGNyZWF0ZWQgTkRJU19QQUNLRVQgc2hvdWxkIGJlIGRlc3Ryb3llZCBieSBSVE1QRnJlZU5kaXNQYWNrZXQKLQotCUFyZ3VtZW50czoKLQkJcEFkCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcEluc0FNU0RVSGRyCUVXQyBBLU1TRFUgZm9ybWF0IGhhcyBleHRyYSAxNC1ieXRlcyBoZWFkZXIuIGlmIFRSVUUsIGluc2VydCB0aGlzIDE0LWJ5dGUgaGRyIGluIGZyb250IG9mIE1TRFUuCi0JCSpwU3JjVG90YWxMZW4JCQlyZXR1cm4gdG90YWwgcGFja2V0IGxlbmd0aC4gVGhpcyBsZW5naHQgaXMgY2FsY3VsYXRlZCB3aXRoIDgwMi4zIGZvcm1hdCBwYWNrZXQuCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5ESVNfU1RBVFVTX1NVQ0NFU1MKLQkJTkRJU19TVEFUVVNfRkFJTFVSRQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5ESVNfU1RBVFVTIFJUTVBDbG9uZU5kaXNQYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JQk9PTEVBTgkJCXBJbnNBTVNEVUhkciwKLQlJTglQTkRJU19QQUNLRVQJcEluUGFja2V0LAotCU9VVCBQTkRJU19QQUNLRVQgICAqcHBPdXRQYWNrZXQpCi17Ci0KLQlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OwotCi0JQVNTRVJUKHBJblBhY2tldCk7Ci0JQVNTRVJUKHBwT3V0UGFja2V0KTsKLQotCS8vIDEuIEFsbG9jYXRlIGEgcGFja2V0Ci0JcGt0ID0gZGV2X2FsbG9jX3NrYigyMDQ4KTsKLQotCWlmIChwa3QgPT0gTlVMTCkKLQl7Ci0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQotCXNrYl9wdXQocGt0LCBHRVRfT1NfUEtUX0xFTihwSW5QYWNrZXQpKTsKLQlOZGlzTW92ZU1lbW9yeShwa3QtPmRhdGEsIEdFVF9PU19QS1RfREFUQVBUUihwSW5QYWNrZXQpLCBHRVRfT1NfUEtUX0xFTihwSW5QYWNrZXQpKTsKLQkqcHBPdXRQYWNrZXQgPSBPU1BLVF9UT19SVFBLVChwa3QpOwotCi0KLQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKE9TUEtUX1RPX1JUUEtUKHBrdCksIFBLVFNSQ19ORElTKTsKLQotCXByaW50aygiIyMjQ2xvbmUjIyNcbiIpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotLy8gdGhlIGFsbG9jYXRlZCBORElTIFBBQ0tFVCBtdXN0IGJlIGZyZWVkIHZpYSBSVE1QRnJlZU5kaXNQYWNrZXQoKQotTkRJU19TVEFUVVMgUlRNUEFsbG9jYXRlTmRpc1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQgUE5ESVNfUEFDS0VUICAgKnBwUGFja2V0LAotCUlOCVBVQ0hBUgkJCXBIZWFkZXIsCi0JSU4JVUlOVAkJCUhlYWRlckxlbiwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVSU5UCQkJRGF0YUxlbikKLXsKLQlQTkRJU19QQUNLRVQJcFBhY2tldDsKLQlBU1NFUlQocERhdGEpOwotCUFTU0VSVChEYXRhTGVuKTsKLQotCS8vIDEuIEFsbG9jYXRlIGEgcGFja2V0Ci0JcFBhY2tldCA9IChQTkRJU19QQUNLRVQgKikgZGV2X2FsbG9jX3NrYihIZWFkZXJMZW4gKyBEYXRhTGVuICsgUlRNUF9QS1RfVEFJTF9QQURESU5HKTsKLQlpZiAocFBhY2tldCA9PSBOVUxMKQotCXsKLQkJKnBwUGFja2V0ID0gTlVMTDsKLSNpZmRlZiBERUJVRwotCQlwcmludGsoIlJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQgRmFpbFxuXG4iKTsKLSNlbmRpZgotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQkvLyAyLiBjbG9uZSB0aGUgZnJhbWUgY29udGVudAotCWlmIChIZWFkZXJMZW4gPiAwKQotCQlOZGlzTW92ZU1lbW9yeShHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCksIHBIZWFkZXIsIEhlYWRlckxlbik7Ci0JaWYgKERhdGFMZW4gPiAwKQotCQlOZGlzTW92ZU1lbW9yeShHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCkgKyBIZWFkZXJMZW4sIHBEYXRhLCBEYXRhTGVuKTsKLQotCS8vIDMuIHVwZGF0ZSBsZW5ndGggb2YgcGFja2V0Ci0Jc2tiX3B1dChHRVRfT1NfUEtUX1RZUEUocFBhY2tldCksIEhlYWRlckxlbitEYXRhTGVuKTsKLQotCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UocFBhY2tldCwgUEtUU1JDX05ESVMpOwotLy8JcHJpbnRrKCIlcyA6IHBQYWNrZXQgPSAlcCwgbGVuID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgcFBhY2tldCwgR0VUX09TX1BLVF9MRU4ocFBhY2tldCkpOwotCSpwcFBhY2tldCA9IHBQYWNrZXQ7Ci0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLS8qCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICBEZXNjcmlwdGlvbjoKLQlUaGlzIHJvdXRpbmUgZnJlZXMgYSBtaW5pcG9ydCBpbnRlcm5hbGx5IGFsbG9jYXRlZCBORElTX1BBQ0tFVCBhbmQgaXRzCi0JY29ycmVzcG9uZGluZyBORElTX0JVRkZFUiBhbmQgYWxsb2NhdGVkIG1lbW9yeS4KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QRnJlZU5kaXNQYWNrZXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUE5ESVNfUEFDS0VUICBwUGFja2V0KQotewotCWRldl9rZnJlZV9za2JfYW55KFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpKTsKLX0KLQotCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLS8vIE5PVEU6IHdlIGRvIGhhdmUgYW4gYXNzdW1wdGlvbiBoZXJlLCB0aGF0IEJ5dGUwIGFuZCBCeXRlMSBhbHdheXMgcmVhc2lkIGF0IHRoZSBzYW1lCi0vLwkJCSBzY2F0dGVyIGdhdGhlciBidWZmZXIKLU5ESVNfU1RBVFVTIFNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIoCi0JSU4JUE5ESVNfQlVGRkVSCXBGaXJzdEJ1ZmZlciwKLQlJTglVQ0hBUgkJCURlc2lyZWRPZmZzZXQsCi0JT1VUIFBVQ0hBUgkJCXBCeXRlMCwKLQlPVVQgUFVDSEFSCQkJcEJ5dGUxKQotewotICAgICpwQnl0ZTAgPSAqKFBVQ0hBUikocEZpcnN0QnVmZmVyICsgRGVzaXJlZE9mZnNldCk7Ci0gICAgKnBCeXRlMSA9ICooUFVDSEFSKShwRmlyc3RCdWZmZXIgKyBEZXNpcmVkT2Zmc2V0ICsgMSk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi12b2lkIFJUTVBfUXVlcnlQYWNrZXRJbmZvKAotCUlOICBQTkRJU19QQUNLRVQgcFBhY2tldCwKLQlPVVQgUEFDS0VUX0lORk8gICpwUGFja2V0SW5mbywKLQlPVVQgUFVDSEFSCQkgKnBTcmNCdWZWQSwKLQlPVVQJVUlOVAkJICpwU3JjQnVmTGVuKQotewotCXBQYWNrZXRJbmZvLT5CdWZmZXJDb3VudCA9IDE7Ci0JcFBhY2tldEluZm8tPnBGaXJzdEJ1ZmZlciA9IChQTkRJU19CVUZGRVIpR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOwotCXBQYWNrZXRJbmZvLT5QaHlzaWNhbEJ1ZmZlckNvdW50ID0gMTsKLQlwUGFja2V0SW5mby0+VG90YWxQYWNrZXRMZW5ndGggPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKLQotCSpwU3JjQnVmVkEgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7Ci0JKnBTcmNCdWZMZW4gPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKLX0KLQotdm9pZCBSVE1QX1F1ZXJ5TmV4dFBhY2tldEluZm8oCi0JSU4gIFBORElTX1BBQ0tFVCAqcHBQYWNrZXQsCi0JT1VUIFBBQ0tFVF9JTkZPICAqcFBhY2tldEluZm8sCi0JT1VUIFBVQ0hBUgkJICpwU3JjQnVmVkEsCi0JT1VUCVVJTlQJCSAqcFNyY0J1ZkxlbikKLXsKLQlQTkRJU19QQUNLRVQgcFBhY2tldCA9IE5VTEw7Ci0KLQlpZiAoKnBwUGFja2V0KQotCQlwUGFja2V0ID0gR0VUX09TX1BLVF9ORVhUKCpwcFBhY2tldCk7Ci0KLQlpZiAocFBhY2tldCkKLQl7Ci0JCXBQYWNrZXRJbmZvLT5CdWZmZXJDb3VudCA9IDE7Ci0JCXBQYWNrZXRJbmZvLT5wRmlyc3RCdWZmZXIgPSAoUE5ESVNfQlVGRkVSKUdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKLQkJcFBhY2tldEluZm8tPlBoeXNpY2FsQnVmZmVyQ291bnQgPSAxOwotCQlwUGFja2V0SW5mby0+VG90YWxQYWNrZXRMZW5ndGggPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKLQotCQkqcFNyY0J1ZlZBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOwotCQkqcFNyY0J1ZkxlbiA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOwotCQkqcHBQYWNrZXQgPSBHRVRfT1NfUEtUX05FWFQocFBhY2tldCk7Ci0JfQotCWVsc2UKLQl7Ci0JCXBQYWNrZXRJbmZvLT5CdWZmZXJDb3VudCA9IDA7Ci0JCXBQYWNrZXRJbmZvLT5wRmlyc3RCdWZmZXIgPSBOVUxMOwotCQlwUGFja2V0SW5mby0+UGh5c2ljYWxCdWZmZXJDb3VudCA9IDA7Ci0JCXBQYWNrZXRJbmZvLT5Ub3RhbFBhY2tldExlbmd0aCA9IDA7Ci0KLQkJKnBTcmNCdWZWQSA9IE5VTEw7Ci0JCSpwU3JjQnVmTGVuID0gMDsKLQkJKnBwUGFja2V0ID0gTlVMTDsKLQl9Ci19Ci0KLQotUE5ESVNfUEFDS0VUIER1cGxpY2F0ZVBhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQotewotCXN0cnVjdCBza19idWZmCSpza2I7Ci0JUE5ESVNfUEFDS0VUCXBSZXRQYWNrZXQgPSBOVUxMOwotCVVTSE9SVAkJCURhdGFTaXplOwotCVVDSEFSCQkJKnBEYXRhOwotCi0JRGF0YVNpemUgPSAoVVNIT1JUKSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKLQlwRGF0YSA9IChQVUNIQVIpIEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKLQotCi0Jc2tiID0gc2tiX2Nsb25lKFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpLCBNRU1fQUxMT0NfRkxBRyk7Ci0JaWYgKHNrYikKLQl7Ci0JCXNrYi0+ZGV2ID0gZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgRnJvbVdoaWNoQlNTSUQpOwotCQlwUmV0UGFja2V0ID0gT1NQS1RfVE9fUlRQS1Qoc2tiKTsKLQl9Ci0KLQotCXJldHVybiBwUmV0UGFja2V0OwotCi19Ci0KLVBORElTX1BBQ0tFVCBkdXBsaWNhdGVfcGt0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKLSAgICBJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVTE9ORwkJCURhdGFTaXplLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCi17Ci0Jc3RydWN0IHNrX2J1ZmYJKnNrYjsKLQlQTkRJU19QQUNLRVQJcFBhY2tldCA9IE5VTEw7Ci0KLQotCWlmICgoc2tiID0gX19kZXZfYWxsb2Nfc2tiKEhkckxlbiArIERhdGFTaXplICsgMiwgTUVNX0FMTE9DX0ZMQUcpKSAhPSBOVUxMKQotCXsKLQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKLQkJTmRpc01vdmVNZW1vcnkoc2tiX3RhaWxfcG9pbnRlcihza2IpLCBwSGVhZGVyODAyXzMsIEhkckxlbik7Ci0JCXNrYl9wdXQoc2tiLCBIZHJMZW4pOwotCQlOZGlzTW92ZU1lbW9yeShza2JfdGFpbF9wb2ludGVyKHNrYiksIHBEYXRhLCBEYXRhU2l6ZSk7Ci0JCXNrYl9wdXQoc2tiLCBEYXRhU2l6ZSk7Ci0JCXNrYi0+ZGV2ID0gZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgRnJvbVdoaWNoQlNTSUQpOwotCQlwUGFja2V0ID0gT1NQS1RfVE9fUlRQS1Qoc2tiKTsKLQl9Ci0KLQlyZXR1cm4gcFBhY2tldDsKLX0KLQotCi0jZGVmaW5lIFRLSVBfVFhfTUlDX1NJWkUJCTgKLVBORElTX1BBQ0tFVCBkdXBsaWNhdGVfcGt0X3dpdGhfVEtJUF9NSUMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCi17Ci0Jc3RydWN0IHNrX2J1ZmYJKnNrYiwgKm5ld3NrYjsKLQotCi0Jc2tiID0gUlRQS1RfVE9fT1NQS1QocFBhY2tldCk7Ci0JaWYgKHNrYl90YWlscm9vbShza2IpIDwgVEtJUF9UWF9NSUNfU0laRSkKLQl7Ci0JCS8vIGFsbG9jIGEgbmV3IHNrYiBhbmQgY29weSB0aGUgcGFja2V0Ci0JCW5ld3NrYiA9IHNrYl9jb3B5X2V4cGFuZChza2IsIHNrYl9oZWFkcm9vbShza2IpLCBUS0lQX1RYX01JQ19TSVpFLCBHRlBfQVRPTUlDKTsKLQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQkJaWYgKG5ld3NrYiA9PSBOVUxMKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFeHRlbmQgVHguTUlDIGZvciBwYWNrZXQgZmFpbGVkISwgZHJvcHBpbmcgcGFja2V0IVxuIikpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJc2tiID0gbmV3c2tiOwotCX0KLQotCXJldHVybiBPU1BLVF9UT19SVFBLVChza2IpOwotCi0KLX0KLQotCi0KLQotUE5ESVNfUEFDS0VUIENsb25lUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVMT05HCQkJRGF0YVNpemUpCi17Ci0Jc3RydWN0IHNrX2J1ZmYJKnBSeFBrdDsKLQlzdHJ1Y3Qgc2tfYnVmZgkqcENsb25lZFBrdDsKLQotCUFTU0VSVChwUGFja2V0KTsKLQlwUnhQa3QgPSBSVFBLVF9UT19PU1BLVChwUGFja2V0KTsKLQotCS8vIGNsb25lIHRoZSBwYWNrZXQKLQlwQ2xvbmVkUGt0ID0gc2tiX2Nsb25lKHBSeFBrdCwgTUVNX0FMTE9DX0ZMQUcpOwotCi0JaWYgKHBDbG9uZWRQa3QpCi0JewotCS8vIHNldCB0aGUgY29ycmVjdCBkYXRhcHRyIGFuZCBkYXRhIGxlbgotCXBDbG9uZWRQa3QtPmRldiA9IHBSeFBrdC0+ZGV2OwotCXBDbG9uZWRQa3QtPmRhdGEgPSBwRGF0YTsKLQlwQ2xvbmVkUGt0LT5sZW4gPSBEYXRhU2l6ZTsKLQlwQ2xvbmVkUGt0LT50YWlsID0gcENsb25lZFBrdC0+ZGF0YSArIHBDbG9uZWRQa3QtPmxlbjsKLQkJQVNTRVJUKERhdGFTaXplIDwgMTUzMCk7Ci0JfQotCXJldHVybiBwQ2xvbmVkUGt0OwotfQotCi0vLwotLy8gY2hhbmdlIE9TIHBhY2tldCBEYXRhUHRyIGFuZCBEYXRhTGVuCi0vLwotdm9pZCAgdXBkYXRlX29zX3BhY2tldF9pbmZvKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCi17Ci0Jc3RydWN0IHNrX2J1ZmYJKnBPU1BrdDsKLQotCUFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7Ci0JcE9TUGt0ID0gUlRQS1RfVE9fT1NQS1QocFJ4QmxrLT5wUnhQYWNrZXQpOwotCi0JcE9TUGt0LT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBGcm9tV2hpY2hCU1NJRCk7Ci0JcE9TUGt0LT5kYXRhID0gcFJ4QmxrLT5wRGF0YTsKLQlwT1NQa3QtPmxlbiA9IHBSeEJsay0+RGF0YVNpemU7Ci0JcE9TUGt0LT50YWlsID0gcE9TUGt0LT5kYXRhICsgcE9TUGt0LT5sZW47Ci19Ci0KLQotdm9pZCB3bGFuXzgwMl8xMV90b184MDJfM19wYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCi0JSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCi17Ci0Jc3RydWN0IHNrX2J1ZmYJKnBPU1BrdDsKLQotCUFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7Ci0JQVNTRVJUKHBIZWFkZXI4MDJfMyk7Ci0KLQlwT1NQa3QgPSBSVFBLVF9UT19PU1BLVChwUnhCbGstPnBSeFBhY2tldCk7Ci0KLQlwT1NQa3QtPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEZyb21XaGljaEJTU0lEKTsKLQlwT1NQa3QtPmRhdGEgPSBwUnhCbGstPnBEYXRhOwotCXBPU1BrdC0+bGVuID0gcFJ4QmxrLT5EYXRhU2l6ZTsKLQlwT1NQa3QtPnRhaWwgPSBwT1NQa3QtPmRhdGEgKyBwT1NQa3QtPmxlbjsKLQotCS8vCi0JLy8gY29weSA4MDIuMyBoZWFkZXIKLQkvLwotCS8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQlOZGlzTW92ZU1lbW9yeShza2JfcHVzaChwT1NQa3QsIExFTkdUSF84MDJfMyksIHBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQl9Ci0KLQotCi12b2lkIGFubm91bmNlXzgwMl8zX3BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKLXsKLQotCXN0cnVjdCBza19idWZmCSpwUnhQa3Q7Ci0jaWZkZWYgSU5GX0FNQVpPTl9QUEEKLSAgICAgICAgaW50ICAgICAgICAgICAgIHJldCA9IDA7Ci0gICAgICAgIHVuc2lnbmVkIGludCBwcGFfZmxhZ3MgPSAwOyAvKiByZXNlcnZlZCBmb3Igbm93ICovCi0jZW5kaWYgLy8gSU5GX0FNQVpPTl9QUEEgLy8KLQotCUFTU0VSVChwUGFja2V0KTsKLQotCXBSeFBrdCA9IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSAgICAvKiBQdXNoIHVwIHRoZSBwcm90b2NvbCBzdGFjayAqLwotI2lmZGVmIElLQU5PU19WWF8xWDAKLQlJS0FOT1NfRGF0YUZyYW1lUngocEFkLCBwUnhQa3QtPmRldiwgcFJ4UGt0LCBwUnhQa3QtPmxlbik7Ci0jZWxzZQotI2lmZGVmIElORl9BTUFaT05fU0UKLSNpZmRlZiBCR19GVF9TVVBQT1JUCi0gICAgICAgICAgICBCR19GVFBIX1BhY2tldEZyb21BcEhhbmRsZShwUnhQa3QpOwotICAgICAgICAgICAgcmV0dXJuOwotI2VuZGlmIC8vIEJHX0ZUX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBJTkZfQU1BWk9OX1NFIC8vCi0JcFJ4UGt0LT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHBSeFBrdCwgcFJ4UGt0LT5kZXYpOwotCi0jaWZkZWYgSU5GX0FNQVpPTl9QUEEKLQlpZiAocHBhX2hvb2tfZGlyZWN0cGF0aF9zZW5kX2ZuICYmIHBBZC0+UFBBRW5hYmxlPT1UUlVFICkKLQl7Ci0JCW1lbXNldChwUnhQa3QtPmhlYWQsMCxwUnhQa3QtPmRhdGEtcFJ4UGt0LT5oZWFkLTE0KTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicHBhX2hvb2tfZGlyZWN0cGF0aF9zZW5kX2ZuIHJ4IDpyZXQ6JWQgaGVhZHJvb206JWQgZGV2OiVzIHBrdGxlbjolZDw9PT1cbiIscmV0LHNrYl9oZWFkcm9vbShwUnhQa3QpCi0JCQkscFJ4UGt0LT5kZXYtPm5hbWUscFJ4UGt0LT5sZW4pKTsKLQkJaGV4X2R1bXAoInJ4IHBhY2tldCIsIHBSeFBrdC0+ZGF0YSwgMzIpOwotCQlyZXQgPSBwcGFfaG9va19kaXJlY3RwYXRoX3NlbmRfZm4ocEFkLT5nX2lmX2lkLCBwUnhQa3QsIHBSeFBrdC0+bGVuLCBwcGFfZmxhZ3MpOwotCQlwUnhQa3Q9TlVMTDsKLQkJcmV0dXJuOwotCi0JfQotI2VuZGlmIC8vIElORl9BTUFaT05fUFBBIC8vCi0KLS8vI2lmZGVmIENPTkZJR181VlRfRU5IQU5DRQotLy8JKihpbnQqKShwUnhQa3QtPmNiKSA9IEJSSURHRV9UQUc7Ci0vLyNlbmRpZgotCi0JewotCQluZXRpZl9yeChwUnhQa3QpOwotCX0KLQotI2VuZGlmIC8vIElLQU5PU19WWF8xWDAgLy8KLX0KLQotCi1QUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUCi1ydF9nZXRfc2dfbGlzdF9mcm9tX3BhY2tldChQTkRJU19QQUNLRVQgcFBhY2tldCwgUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUICpzZykKLXsKLQlzZy0+TnVtYmVyT2ZFbGVtZW50cyA9IDE7Ci0Jc2ctPkVsZW1lbnRzWzBdLkFkZHJlc3MgPSAgR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOwotCXNnLT5FbGVtZW50c1swXS5MZW5ndGggPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKLQlyZXR1cm4gKHNnKTsKLX0KLQotdm9pZCBoZXhfZHVtcChjaGFyICpzdHIsIHVuc2lnbmVkIGNoYXIgKnBTcmNCdWZWQSwgdW5zaWduZWQgaW50IFNyY0J1ZkxlbikKLXsKLQl1bnNpZ25lZCBjaGFyICpwdDsKLQlpbnQgeDsKLQotCWlmIChSVERlYnVnTGV2ZWwgPCBSVF9ERUJVR19UUkFDRSkKLQkJcmV0dXJuOwotCi0JcHQgPSBwU3JjQnVmVkE7Ci0JcHJpbnRrKCIlczogJXAsIGxlbiA9ICVkXG4iLHN0ciwgIHBTcmNCdWZWQSwgU3JjQnVmTGVuKTsKLQlmb3IgKHg9MDsgeDxTcmNCdWZMZW47IHgrKykKLQl7Ci0JCWlmICh4ICUgMTYgPT0gMCkKLQkJCXByaW50aygiMHglMDR4IDogIiwgeCk7Ci0JCXByaW50aygiJTAyeCAiLCAoKHVuc2lnbmVkIGNoYXIpcHRbeF0pKTsKLQkJaWYgKHglMTYgPT0gMTUpIHByaW50aygiXG4iKTsKLQl9Ci0JcHJpbnRrKCJcbiIpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJU2VuZCBsb2cgbWVzc2FnZSB0aHJvdWdoIHdpcmVsZXNzIGV2ZW50Ci0KLQkJU3VwcG9ydCBzdGFuZGFyZCBpd19ldmVudCB3aXRoIElXRVZDVVNUT00uIEl0IGlzIHVzZWQgYmVsb3cuCi0KLQkJaXdyZXFfZGF0YS5kYXRhLmZsYWdzIGlzIHVzZWQgdG8gc3RvcmUgZXZlbnRfZmxhZyB0aGF0IGlzIGRlZmluZWQgYnkgdXNlci4KLQkJaXdyZXFfZGF0YS5kYXRhLmxlbmd0aCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBldmVudCBsb2cuCi0KLQkJVGhlIGZvcm1hdCBvZiB0aGUgZXZlbnQgbG9nIGlzIGNvbXBvc2VkIG9mIHRoZSBlbnRyeSdzIE1BQyBhZGRyZXNzIGFuZAotCQl0aGUgZGVzaXJlZCBsb2cgbWVzc2FnZSAocmVmZXIgdG8gcFdpcmVsZXNzRXZlbnRUZXh0KS4KLQotCQkJZXg6IDExOjIyOjMzOjQ0OjU1OjY2IGhhcyBhc3NvY2lhdGVkIHN1Y2Nlc3NmdWxseQotCi0JCXAucy4gVGhlIHJlcXVpcmVtZW50IG9mIFdpcmVsZXNzIEV4dGVuc2lvbiBpcyB2MTUgb3IgbmV3ZXIuCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUTVBTZW5kV2lyZWxlc3NFdmVudCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQJCQlFdmVudF9mbGFnLAotCUlOCVBVQ0hBUgkJCXBBZGRyLAotCUlOCVVDSEFSCQkJQnNzSWR4LAotCUlOCUNIQVIJCQlSc3NpKQotewotI2lmIFdJUkVMRVNTX0VYVCA+PSAxNQotCi0JLy91bmlvbgkJaXdyZXFfZGF0YSAgICAgIHdycXU7Ci0JUFNUUklORwlwQnVmID0gTlVMTCwgcEJ1ZlB0ciA9IE5VTEw7Ci0JVVNIT1JUCWV2ZW50LCB0eXBlLCBCdWZMZW47Ci0JVUNIQVIJZXZlbnRfdGFibGVfbGVuID0gMDsKLQotCXR5cGUgPSBFdmVudF9mbGFnICYgMHhGRjAwOwotCWV2ZW50ID0gRXZlbnRfZmxhZyAmIDB4MDBGRjsKLQotCXN3aXRjaCAodHlwZSkKLQl7Ci0JCWNhc2UgSVdfU1lTX0VWRU5UX0ZMQUdfU1RBUlQ6Ci0JCQlldmVudF90YWJsZV9sZW4gPSBJV19TWVNfRVZFTlRfVFlQRV9OVU07Ci0JCQlicmVhazsKLQotCQljYXNlIElXX1NQT09GX0VWRU5UX0ZMQUdfU1RBUlQ6Ci0JCQlldmVudF90YWJsZV9sZW4gPSBJV19TUE9PRl9FVkVOVF9UWVBFX05VTTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVdfRkxPT0RfRVZFTlRfRkxBR19TVEFSVDoKLQkJCWV2ZW50X3RhYmxlX2xlbiA9IElXX0ZMT09EX0VWRU5UX1RZUEVfTlVNOwotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGV2ZW50X3RhYmxlX2xlbiA9PSAwKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBUaGUgdHlwZSglMHgwMngpIGlzIG5vdCB2YWxpZC5cbiIsIF9fRlVOQ1RJT05fXywgdHlwZSkpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGV2ZW50ID49IGV2ZW50X3RhYmxlX2xlbikKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogVGhlIGV2ZW50KCUweDAyeCkgaXMgbm90IHZhbGlkLlxuIiwgX19GVU5DVElPTl9fLCBldmVudCkpOwotCQlyZXR1cm47Ci0JfQotCi0JLy9BbGxvY2F0ZSBtZW1vcnkgYW5kIGNvcHkgdGhlIG1zZy4KLQlpZigocEJ1ZiA9IGttYWxsb2MoSVdfQ1VTVE9NX01BWF9MRU4sIEdGUF9BVE9NSUMpKSAhPSBOVUxMKQotCXsKLQkJLy9QcmVwYXJlIHRoZSBwYXlsb2FkCi0JCW1lbXNldChwQnVmLCAwLCBJV19DVVNUT01fTUFYX0xFTik7Ci0KLQkJcEJ1ZlB0ciA9IHBCdWY7Ci0KLQkJaWYgKHBBZGRyKQotCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIoUlQyODYwKSBTVEEoJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngpICIsIFBSSU5UX01BQyhwQWRkcikpOwotCQllbHNlIGlmIChCc3NJZHggPCBNQVhfTUJTU0lEX05VTSkKLQkJCXBCdWZQdHIgKz0gc3ByaW50ZihwQnVmUHRyLCAiKFJUMjg2MCkgQlNTKHJhJWQpICIsIEJzc0lkeCk7Ci0JCWVsc2UKLQkJCXBCdWZQdHIgKz0gc3ByaW50ZihwQnVmUHRyLCAiKFJUMjg2MCkgIik7Ci0KLQkJaWYgKHR5cGUgPT0gSVdfU1lTX0VWRU5UX0ZMQUdfU1RBUlQpCi0JCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIiVzIiwgcFdpcmVsZXNzU3lzRXZlbnRUZXh0W2V2ZW50XSk7Ci0JCWVsc2UgaWYgKHR5cGUgPT0gSVdfU1BPT0ZfRVZFTlRfRkxBR19TVEFSVCkKLQkJCXBCdWZQdHIgKz0gc3ByaW50ZihwQnVmUHRyLCAiJXMgKFJTU0k9JWQpIiwgcFdpcmVsZXNzU3Bvb2ZFdmVudFRleHRbZXZlbnRdLCBSc3NpKTsKLQkJZWxzZSBpZiAodHlwZSA9PSBJV19GTE9PRF9FVkVOVF9GTEFHX1NUQVJUKQotCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIlcyIsIHBXaXJlbGVzc0Zsb29kRXZlbnRUZXh0W2V2ZW50XSk7Ci0JCWVsc2UKLQkJCXBCdWZQdHIgKz0gc3ByaW50ZihwQnVmUHRyLCAiJXMiLCAidW5rbm93biBldmVudCIpOwotCi0JCXBCdWZQdHJbcEJ1ZlB0ciAtIHBCdWZdID0gJ1wwJzsKLQkJQnVmTGVuID0gcEJ1ZlB0ciAtIHBCdWY7Ci0KLQkJUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQocEFkLCBJV0VWQ1VTVE9NLCBFdmVudF9mbGFnLCBOVUxMLCAoUFVDSEFSKXBCdWYsIEJ1Zkxlbik7Ci0JCS8vREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgOiAlc1xuIiwgX19GVU5DVElPTl9fLCBwQnVmKSk7Ci0KLQkJa2ZyZWUocEJ1Zik7Ci0JfQotCWVsc2UKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHdpcmVsZXNzIGV2ZW50LlxuIiwgX19GVU5DVElPTl9fKSk7Ci0jZWxzZQotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogVGhlIFdpcmVsZXNzIEV4dGVuc2lvbiBNVVNUIGJlIHYxNSBvciBuZXdlci5cbiIsIF9fRlVOQ1RJT05fXykpOwotI2VuZGlmICAvKiBXSVJFTEVTU19FWFQgPj0gMTUgKi8KLX0KLQotCi0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotdm9pZCBzZW5kX21vbml0b3JfcGFja2V0cygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrKQotewotICAgIHN0cnVjdCBza19idWZmCSpwT1NQa3Q7Ci0gICAgd2xhbl9uZ19wcmlzbTJfaGVhZGVyICpwaDsKLSAgICBpbnQgcmF0ZV9pbmRleCA9IDA7Ci0gICAgVVNIT1JUIGhlYWRlcl9sZW4gPSAwOwotICAgIFVDSEFSIHRlbXBfaGVhZGVyWzQwXSA9IHswfTsKLQotICAgIHVfaW50MzJfdCByYWxpbmtyYXRlWzI1Nl0gPSB7Miw0LDExLDIyLCAxMiwxOCwyNCwzNiw0OCw3Miw5NiwgIDEwOCwgICAxMDksIDExMCwgMTExLCAxMTIsIDEzLCAyNiwgMzksIDUyLDc4LDEwNCwgMTE3LCAxMzAsIDI2LCA1MiwgNzgsMTA0LCAxNTYsIDIwOCwgMjM0LCAyNjAsIDI3LCA1NCw4MSwxMDgsMTYyLCAyMTYsIDI0MywgMjcwLCAvLyBMYXN0IDM4Ci0JNTQsIDEwOCwgMTYyLCAyMTYsIDMyNCwgNDMyLCA0ODYsIDU0MCwgIDE0LCAyOSwgNDMsIDU3LCA4NywgMTE1LCAxMzAsIDE0NCwgMjksIDU5LDg3LDExNSwgMTczLCAyMzAsMjYwLCAyODgsIDMwLCA2MCw5MCwxMjAsMTgwLDI0MCwyNzAsMzAwLDYwLDEyMCwxODAsMjQwLDM2MCw0ODAsNTQwLDYwMCwgMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwKLQkxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCw0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSw2Miw2Myw2NCw2NSw2Niw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw3NSw3Niw3Nyw3OCw3OSw4MH07Ci0KLQotICAgIEFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7Ci0gICAgaWYgKHBSeEJsay0+RGF0YVNpemUgPCAxMCkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogU2l6ZSBpcyB0b28gc21hbGwhICglZClcbiIsIF9fRlVOQ1RJT05fXywgcFJ4QmxrLT5EYXRhU2l6ZSkpOwotCQlnb3RvIGVycl9mcmVlX3NrX2J1ZmY7Ci0gICAgfQotCi0gICAgaWYgKHBSeEJsay0+RGF0YVNpemUgKyBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSA+IFJYX0JVRkZFUl9BR0dSRVNJWkUpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFNpemUgaXMgdG9vIGxhcmdlISAoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIHBSeEJsay0+RGF0YVNpemUgKyBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSkpOwotCQlnb3RvIGVycl9mcmVlX3NrX2J1ZmY7Ci0gICAgfQotCi0gICAgcE9TUGt0ID0gUlRQS1RfVE9fT1NQS1QocFJ4QmxrLT5wUnhQYWNrZXQpOwotCXBPU1BrdC0+ZGV2ID0gZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgQlNTMCk7Ci0gICAgaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuVHlwZSA9PSBCVFlQRV9EQVRBKQotICAgIHsKLSAgICAgICAgcFJ4QmxrLT5EYXRhU2l6ZSAtPSBMRU5HVEhfODAyXzExOwotICAgICAgICBpZiAoKHBSeEJsay0+cEhlYWRlci0+RkMuVG9EcyA9PSAxKSAmJgotICAgICAgICAgICAgKHBSeEJsay0+cEhlYWRlci0+RkMuRnJEcyA9PSAxKSkKLSAgICAgICAgICAgIGhlYWRlcl9sZW4gPSBMRU5HVEhfODAyXzExX1dJVEhfQUREUjQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGhlYWRlcl9sZW4gPSBMRU5HVEhfODAyXzExOwotCi0gICAgICAgIC8vIFFPUwotCWlmIChwUnhCbGstPnBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA4KQotCXsKLQkgICAgaGVhZGVyX2xlbiArPSAyOwotCQkvLyBEYXRhIHNraXAgUU9TIGNvbnRvcmwgZmllbGQKLQkJcFJ4QmxrLT5EYXRhU2l6ZSAtPTI7Ci0JfQotCi0JLy8gT3JkZXIgYml0OiBBLVJhbGluayBvciBIVEMrCi0JaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuT3JkZXIpCi0JewotCSAgICBoZWFkZXJfbGVuICs9IDQ7Ci0JCQkvLyBEYXRhIHNraXAgSFRDIGNvbnRvcmwgZmllbGQKLQkJCXBSeEJsay0+RGF0YVNpemUgLT0gNDsKLQl9Ci0KLSAgICAgICAgLy8gQ29weSBIZWFkZXIKLSAgICAgICAgaWYgKGhlYWRlcl9sZW4gPD0gNDApCi0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSh0ZW1wX2hlYWRlciwgcFJ4QmxrLT5wRGF0YSwgaGVhZGVyX2xlbik7Ci0KLSAgICAgICAgLy8gc2tpcCBIVyBwYWRkaW5nCi0JaWYgKHBSeEJsay0+UnhELkwyUEFEKQotCSAgICBwUnhCbGstPnBEYXRhICs9IChoZWFkZXJfbGVuICsgMik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBSeEJsay0+cERhdGEgKz0gaGVhZGVyX2xlbjsKLSAgICB9IC8vZW5kIGlmCi0KLQotCWlmIChwUnhCbGstPkRhdGFTaXplIDwgcE9TUGt0LT5sZW4pIHsKLSAgICAgICAgc2tiX3RyaW0ocE9TUGt0LHBSeEJsay0+RGF0YVNpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNrYl9wdXQocE9TUGt0LChwUnhCbGstPkRhdGFTaXplIC0gcE9TUGt0LT5sZW4pKTsKLSAgICB9IC8vZW5kIGlmCi0KLSAgICBpZiAoKHBSeEJsay0+cERhdGEgLSBwT1NQa3QtPmRhdGEpID4gMCkgewotCSAgICBza2JfcHV0KHBPU1BrdCwocFJ4QmxrLT5wRGF0YSAtIHBPU1BrdC0+ZGF0YSkpOwotCSAgICBza2JfcHVsbChwT1NQa3QsKHBSeEJsay0+cERhdGEgLSBwT1NQa3QtPmRhdGEpKTsKLSAgICB9IC8vZW5kIGlmCi0KLSAgICBpZiAoc2tiX2hlYWRyb29tKHBPU1BrdCkgPCAoc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikrIGhlYWRlcl9sZW4pKSB7Ci0gICAgICAgIGlmIChwc2tiX2V4cGFuZF9oZWFkKHBPU1BrdCwgKHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpICsgaGVhZGVyX2xlbiksIDAsIEdGUF9BVE9NSUMpKSB7Ci0JICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFJlYWxsb2NhdGUgaGVhZGVyIHNpemUgb2Ygc2tfYnVmZiBmYWlsIVxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCQlnb3RvIGVycl9mcmVlX3NrX2J1ZmY7Ci0JICAgIH0gLy9lbmQgaWYKLSAgICB9IC8vZW5kIGlmCi0KLSAgICBpZiAoaGVhZGVyX2xlbiA+IDApCi0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KHNrYl9wdXNoKHBPU1BrdCwgaGVhZGVyX2xlbiksIHRlbXBfaGVhZGVyLCBoZWFkZXJfbGVuKTsKLQotICAgIHBoID0gKHdsYW5fbmdfcHJpc20yX2hlYWRlciAqKSBza2JfcHVzaChwT1NQa3QsIHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpKTsKLQlOZGlzWmVyb01lbW9yeShwaCwgc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikpOwotCi0gICAgcGgtPm1zZ2NvZGUJCSAgICA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm07Ci0JcGgtPm1zZ2xlbgkJICAgID0gc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcik7Ci0Jc3RyY3B5KChQU1RSSU5HKSBwaC0+ZGV2bmFtZSwgKFBTVFJJTkcpIHBBZC0+bmV0X2Rldi0+bmFtZSk7Ci0KLSAgICBwaC0+aG9zdHRpbWUuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9ob3N0dGltZTsKLQlwaC0+aG9zdHRpbWUuc3RhdHVzID0gMDsKLQlwaC0+aG9zdHRpbWUubGVuID0gNDsKLQlwaC0+aG9zdHRpbWUuZGF0YSA9IGppZmZpZXM7Ci0KLQlwaC0+bWFjdGltZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX21hY3RpbWU7Ci0JcGgtPm1hY3RpbWUuc3RhdHVzID0gMDsKLQlwaC0+bWFjdGltZS5sZW4gPSAwOwotCXBoLT5tYWN0aW1lLmRhdGEgPSAwOwotCi0gICAgcGgtPmlzdHguZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9pc3R4OwotCXBoLT5pc3R4LnN0YXR1cyA9IDA7Ci0JcGgtPmlzdHgubGVuID0gMDsKLQlwaC0+aXN0eC5kYXRhID0gMDsKLQotICAgIHBoLT5jaGFubmVsLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fY2hhbm5lbDsKLQlwaC0+Y2hhbm5lbC5zdGF0dXMgPSAwOwotCXBoLT5jaGFubmVsLmxlbiA9IDQ7Ci0KLSAgICBwaC0+Y2hhbm5lbC5kYXRhID0gKHVfaW50MzJfdClwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwotCi0gICAgcGgtPnJzc2kuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yc3NpOwotCXBoLT5yc3NpLnN0YXR1cyA9IDA7Ci0JcGgtPnJzc2kubGVuID0gNDsKLSAgICBwaC0+cnNzaS5kYXRhID0gKHVfaW50MzJfdClSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBwUnhCbGstPnBSeFdJLT5SU1NJMCwgUlNTSV8wKSwgQ29udmVydFRvUnNzaShwQWQsIHBSeEJsay0+cFJ4V0ktPlJTU0kxLCBSU1NJXzEpLCBDb252ZXJ0VG9Sc3NpKHBBZCwgcFJ4QmxrLT5wUnhXSS0+UlNTSTIsIFJTU0lfMikpOzsKLQotCXBoLT5zaWduYWwuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zaWduYWw7Ci0JcGgtPnNpZ25hbC5zdGF0dXMgPSAwOwotCXBoLT5zaWduYWwubGVuID0gNDsKLQlwaC0+c2lnbmFsLmRhdGEgPSAwOyAvL3Jzc2kgKyBub2lzZTsKLQotCXBoLT5ub2lzZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX25vaXNlOwotCXBoLT5ub2lzZS5zdGF0dXMgPSAwOwotCXBoLT5ub2lzZS5sZW4gPSA0OwotCXBoLT5ub2lzZS5kYXRhID0gMDsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotICAgIGlmIChwUnhCbGstPnBSeFdJLT5QSFlNT0RFID49IE1PREVfSFRNSVgpCi0gICAgewotCXJhdGVfaW5kZXggPSAxNiArICgoVUNIQVIpcFJ4QmxrLT5wUnhXSS0+QlcgKjE2KSArICgoVUNIQVIpcFJ4QmxrLT5wUnhXSS0+U2hvcnRHSSAqMzIpICsgKChVQ0hBUilwUnhCbGstPnBSeFdJLT5NQ1MpOwotICAgIH0KLSAgICBlbHNlCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JaWYgKHBSeEJsay0+cFJ4V0ktPlBIWU1PREUgPT0gTU9ERV9PRkRNKQotCXJhdGVfaW5kZXggPSAoVUNIQVIpKHBSeEJsay0+cFJ4V0ktPk1DUykgKyA0OwotICAgIGVsc2UKLQlyYXRlX2luZGV4ID0gKFVDSEFSKShwUnhCbGstPnBSeFdJLT5NQ1MpOwotICAgIGlmIChyYXRlX2luZGV4IDwgMCkKLSAgICAgICAgcmF0ZV9pbmRleCA9IDA7Ci0gICAgaWYgKHJhdGVfaW5kZXggPiAyNTUpCi0gICAgICAgIHJhdGVfaW5kZXggPSAyNTU7Ci0KLQlwaC0+cmF0ZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3JhdGU7Ci0JcGgtPnJhdGUuc3RhdHVzID0gMDsKLQlwaC0+cmF0ZS5sZW4gPSA0OwotICAgIHBoLT5yYXRlLmRhdGEgPSByYWxpbmtyYXRlW3JhdGVfaW5kZXhdOwotCi0JcGgtPmZybWxlbi5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2ZybWxlbjsKLSAgICBwaC0+ZnJtbGVuLnN0YXR1cyA9IDA7Ci0JcGgtPmZybWxlbi5sZW4gPSA0OwotCXBoLT5mcm1sZW4uZGF0YQk9ICh1X2ludDMyX3QpcFJ4QmxrLT5EYXRhU2l6ZTsKLQotCi0gICAgcE9TUGt0LT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7Ci0gICAgcE9TUGt0LT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHBPU1BrdCwgcE9TUGt0LT5kZXYpOwotICAgIHBPU1BrdC0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKLSAgICBuZXRpZl9yeChwT1NQa3QpOwotCi0gICAgcmV0dXJuOwotCi1lcnJfZnJlZV9za19idWZmOgotCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JcmV0dXJuOwotCi19Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JRmlsZSBvcGVuL2Nsb3NlIHJlbGF0ZWQgZnVuY3Rpb25zLgotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVJUTVBfT1NfRkQgUnRtcE9TRmlsZU9wZW4oY2hhciAqcFBhdGgsICBpbnQgZmxhZywgaW50IG1vZGUpCi17Ci0Jc3RydWN0IGZpbGUJKmZpbGVQdHI7Ci0KLQlmaWxlUHRyID0gZmlscF9vcGVuKHBQYXRoLCBmbGFnLCAwKTsKLQlpZiAoSVNfRVJSKGZpbGVQdHIpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMoKTogRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsIF9fRlVOQ1RJT05fXywgLVBUUl9FUlIoZmlsZVB0ciksIHBQYXRoKSk7Ci0JfQotCi0JcmV0dXJuIChSVE1QX09TX0ZEKWZpbGVQdHI7Ci19Ci0KLWludCBSdG1wT1NGaWxlQ2xvc2UoUlRNUF9PU19GRCBvc2ZkKQotewotCWZpbHBfY2xvc2Uob3NmZCwgTlVMTCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotdm9pZCBSdG1wT1NGaWxlU2VlayhSVE1QX09TX0ZEIG9zZmQsIGludCBvZmZzZXQpCi17Ci0Jb3NmZC0+Zl9wb3MgPSBvZmZzZXQ7Ci19Ci0KLQotaW50IFJ0bXBPU0ZpbGVSZWFkKFJUTVBfT1NfRkQgb3NmZCwgY2hhciAqcERhdGFQdHIsIGludCByZWFkTGVuKQotewotCS8vIFRoZSBvYmplY3QgbXVzdCBoYXZlIGEgcmVhZCBtZXRob2QKLQlpZiAob3NmZC0+Zl9vcCAmJiBvc2ZkLT5mX29wLT5yZWFkKQotCXsKLQkJcmV0dXJuIG9zZmQtPmZfb3AtPnJlYWQob3NmZCwgIHBEYXRhUHRyLCByZWFkTGVuLCAmb3NmZC0+Zl9wb3MpOwotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJubyBmaWxlIHJlYWQgbWV0aG9kXG4iKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci19Ci0KLQotaW50IFJ0bXBPU0ZpbGVXcml0ZShSVE1QX09TX0ZEIG9zZmQsIGNoYXIgKnBEYXRhUHRyLCBpbnQgd3JpdGVMZW4pCi17Ci0JcmV0dXJuIG9zZmQtPmZfb3AtPndyaXRlKG9zZmQsIHBEYXRhUHRyLCAoc2l6ZV90KXdyaXRlTGVuLCAmb3NmZC0+Zl9wb3MpOwotfQotCi0KLXZvaWQgUnRtcE9TRlNJbmZvQ2hhbmdlKFJUTVBfT1NfRlNfSU5GTyAqcE9TRlNJbmZvLCBCT09MRUFOIGJTZXQpCi17Ci0JaWYgKGJTZXQpCi0JewotCQkvLyBTYXZlIHVpZCBhbmQgZ2lkIHVzZWQgZm9yIGZpbGVzeXN0ZW0gYWNjZXNzLgotCQkvLyBTZXQgdXNlciBhbmQgZ3JvdXAgdG8gMCAocm9vdCkKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjkpCi0JCXBPU0ZTSW5mby0+ZnN1aWQ9IGN1cnJlbnQtPmZzdWlkOwotCQlwT1NGU0luZm8tPmZzZ2lkID0gY3VycmVudC0+ZnNnaWQ7Ci0JCWN1cnJlbnQtPmZzdWlkID0gY3VycmVudC0+ZnNnaWQgPSAwOwotI2Vsc2UKLQkJcE9TRlNJbmZvLT5mc3VpZCA9IGN1cnJlbnRfZnN1aWQoKTsKLQkJcE9TRlNJbmZvLT5mc2dpZCA9IGN1cnJlbnRfZnNnaWQoKTsKLSNlbmRpZgotCQlwT1NGU0luZm8tPmZzID0gZ2V0X2ZzKCk7Ci0JCXNldF9mcyhLRVJORUxfRFMpOwotCX0KLQllbHNlCi0JewotCQlzZXRfZnMocE9TRlNJbmZvLT5mcyk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI5KQotCQljdXJyZW50LT5mc3VpZCA9IHBPU0ZTSW5mby0+ZnN1aWQ7Ci0JCWN1cnJlbnQtPmZzZ2lkID0gcE9TRlNJbmZvLT5mc2dpZDsKLSNlbmRpZgotCX0KLX0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlUYXNrIGNyZWF0ZS9tYW5hZ2VtZW50L2tpbGwgcmVsYXRlZCBmdW5jdGlvbnMuCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTkRJU19TVEFUVVMgUnRtcE9TVGFza0tpbGwoCi0JSU4gUlRNUF9PU19UQVNLICpwVGFzaykKLXsKLQlSVE1QX0FEQVBURVIgKnBBZDsKLQlpbnQgcmV0ID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQotCXBBZCA9IChSVE1QX0FEQVBURVIgKilwVGFzay0+cHJpdjsKLQotI2lmZGVmIEtUSFJFQURfU1VQUE9SVAotCWlmIChwVGFzay0+a3RocmVhZF90YXNrKQotCXsKLQkJa3RocmVhZF9zdG9wKHBUYXNrLT5rdGhyZWFkX3Rhc2spOwotCQlyZXQgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCX0KLSNlbHNlCi0JQ0hFQ0tfUElEX0xFR0FMSVRZKHBUYXNrLT50YXNrUElEKQotCXsKLQkJcHJpbnRrKCJUZXJtaW5hdGUgdGhlIHRhc2soJXMpIHdpdGggcGlkKCVkKSFcbiIsIHBUYXNrLT50YXNrTmFtZSwgR0VUX1BJRF9OVU1CRVIocFRhc2stPnRhc2tQSUQpKTsKLQkJbWIoKTsKLQkJcFRhc2stPnRhc2tfa2lsbGVkID0gMTsKLQkJbWIoKTsKLQkJcmV0ID0gS0lMTF9USFJFQURfUElEKHBUYXNrLT50YXNrUElELCBTSUdURVJNLCAxKTsKLQkJaWYgKHJldCkKLQkJewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAia2lsbCB0YXNrKCVzKSB3aXRoIHBpZCglZCkgZmFpbGVkKHJldFZhbD0lZCkhXG4iLAotCQkJCXBUYXNrLT50YXNrTmFtZSwgR0VUX1BJRF9OVU1CRVIocFRhc2stPnRhc2tQSUQpLCByZXQpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJd2FpdF9mb3JfY29tcGxldGlvbigmcFRhc2stPnRhc2tDb21wbGV0ZSk7Ci0JCQlwVGFzay0+dGFza1BJRCA9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKLQkJCXBUYXNrLT50YXNrX2tpbGxlZCA9IDA7Ci0JCQlyZXQgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCQl9Ci0JfQotI2VuZGlmCi0KLQlyZXR1cm4gcmV0OwotCi19Ci0KLQotSU5UIFJ0bXBPU1Rhc2tOb3RpZnlUb0V4aXQoCi0JSU4gUlRNUF9PU19UQVNLICpwVGFzaykKLXsKLQotI2lmbmRlZiBLVEhSRUFEX1NVUFBPUlQKLQljb21wbGV0ZV9hbmRfZXhpdCgmcFRhc2stPnRhc2tDb21wbGV0ZSwgMCk7Ci0jZW5kaWYKLQotCXJldHVybiAwOwotfQotCi0KLXZvaWQgUnRtcE9TVGFza0N1c3RvbWl6ZSgKLQlJTiBSVE1QX09TX1RBU0sgKnBUYXNrKQotewotCi0jaWZuZGVmIEtUSFJFQURfU1VQUE9SVAotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCWRhZW1vbml6ZSgoUFNUUklORykmcFRhc2stPnRhc2tOYW1lWzBdLyoiJXMiLHBBZC0+bmV0X2Rldi0+bmFtZSovKTsKLQotCWFsbG93X3NpZ25hbChTSUdURVJNKTsKLQlhbGxvd19zaWduYWwoU0lHS0lMTCk7Ci0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7Ci0jZWxzZQotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlkYWVtb25pemUoKTsKLQlyZXBhcmVudF90b19pbml0KCk7Ci0Jc3RyY3B5KGN1cnJlbnQtPmNvbW0sICZwVGFzay0+dGFza05hbWVbMF0pOwotCi0Jc2lnaW5pdHNldGludigmY3VycmVudC0+YmxvY2tlZCwgc2lnbWFzayhTSUdURVJNKSB8IHNpZ21hc2soU0lHS0lMTCkpOwotCi0JLyogQWxsb3cgaW50ZXJjZXB0aW9uIG9mIFNJR0tJTEwgb25seQotCSAqIERvbid0IGFsbG93IG90aGVyIHNpZ25hbHMgdG8gaW50ZXJydXB0IHRoZSB0cmFuc21pc3Npb24gKi8KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDQsMjIpCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmN1cnJlbnQtPnNpZ21hc2tfbG9jaywgZmxhZ3MpOwotCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7Ci0JcmVjYWxjX3NpZ3BlbmRpbmcoY3VycmVudCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+c2lnbWFza19sb2NrLCBmbGFncyk7Ci0jZW5kaWYKLSNlbmRpZgotCi0gICAgLyogc2lnbmFsIHRoYXQgd2UndmUgc3RhcnRlZCB0aGUgdGhyZWFkICovCi0JY29tcGxldGUoJnBUYXNrLT50YXNrQ29tcGxldGUpOwotCi0jZW5kaWYKLX0KLQotCi1ORElTX1NUQVRVUyBSdG1wT1NUYXNrQXR0YWNoKAotCUlOIFJUTVBfT1NfVEFTSyAqcFRhc2ssCi0JSU4gaW50ICgqZm4pKHZvaWQgKiksCi0JSU4gdm9pZCAqYXJnKQotewotCU5ESVNfU1RBVFVTIHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JcGlkX3QgcGlkX251bWJlciA9IC0xOwotCi0jaWZkZWYgS1RIUkVBRF9TVVBQT1JUCi0JcFRhc2stPnRhc2tfa2lsbGVkID0gMDsKLQlwVGFzay0+a3RocmVhZF90YXNrID0gTlVMTDsKLQlwVGFzay0+a3RocmVhZF90YXNrID0ga3RocmVhZF9ydW4oZm4sIGFyZywgcFRhc2stPnRhc2tOYW1lKTsKLQlpZiAoSVNfRVJSKHBUYXNrLT5rdGhyZWFkX3Rhc2spKQotCQlzdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwotI2Vsc2UKLQlwaWRfbnVtYmVyID0ga2VybmVsX3RocmVhZChmbiwgYXJnLCBSVE1QX09TX01HTVRfVEFTS19GTEFHUyk7Ci0JaWYgKHBpZF9udW1iZXIgPCAwKQotCXsKLQkJREJHUFJJTlQgKFJUX0RFQlVHX0VSUk9SLCAoIkF0dGFjaCB0YXNrKCVzKSBmYWlsZWQhXG4iLCBwVGFzay0+dGFza05hbWUpKTsKLQkJc3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0JZWxzZQotCXsKLQkJcFRhc2stPnRhc2tQSUQgPSBHRVRfUElEKHBpZF9udW1iZXIpOwotCi0JCS8vIFdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gc3RhcnQKLQkJd2FpdF9mb3JfY29tcGxldGlvbigmcFRhc2stPnRhc2tDb21wbGV0ZSk7Ci0JCXN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JfQotI2VuZGlmCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotCi1ORElTX1NUQVRVUyBSdG1wT1NUYXNrSW5pdCgKLQlJTiBSVE1QX09TX1RBU0sgKnBUYXNrLAotCUlOIFBTVFJJTkcJCXBUYXNrTmFtZSwKLQlJTiBWT0lECQkJKnBQcml2KQotewotCWludCBsZW47Ci0KLQlBU1NFUlQocFRhc2spOwotCi0jaWZuZGVmIEtUSFJFQURfU1VQUE9SVAotCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpKHBUYXNrKSwgc2l6ZW9mKFJUTVBfT1NfVEFTSykpOwotI2VuZGlmCi0KLQlsZW4gPSBzdHJsZW4ocFRhc2tOYW1lKTsKLQlsZW4gPSBsZW4gPiAoUlRNUF9PU19UQVNLX05BTUVfTEVOIC0xKSA/IChSVE1QX09TX1RBU0tfTkFNRV9MRU4tMSkgOiBsZW47Ci0JTmRpc01vdmVNZW1vcnkoJnBUYXNrLT50YXNrTmFtZVswXSwgcFRhc2tOYW1lLCBsZW4pOwotCXBUYXNrLT5wcml2ID0gcFByaXY7Ci0KLSNpZm5kZWYgS1RIUkVBRF9TVVBQT1JUCi0JUlRNUF9TRU1fRVZFTlRfSU5JVF9MT0NLRUQoJihwVGFzay0+dGFza1NlbWEpKTsKLQlwVGFzay0+dGFza1BJRCA9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKLQotCWluaXRfY29tcGxldGlvbiAoJnBUYXNrLT50YXNrQ29tcGxldGUpOwotI2VuZGlmCi0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi12b2lkIFJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQl7Ci0JCWlmIChwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9PSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZCkKLQkJewotCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU1RBX0xJTktVUF9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU1RBX0xJTktET1dOX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7Ci0JCX0KLQl9Ci19Ci0KLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSAweDIwNDAyCS8vIFJlZCBIYXQgNy4xCi0vL3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfbmV0ZGV2KGludCBzaXplb2ZfcHJpdiwgY29uc3QgY2hhciAqbWFzaywgdm9pZCAoKnNldHVwKShzdHJ1Y3QgbmV0X2RldmljZSAqKSkgLy9zYW1wbGUKLXN0cnVjdCBuZXRfZGV2aWNlICphbGxvY19uZXRkZXYoCi0JaW50IHNpemVvZl9wcml2LAotCWNvbnN0IGNoYXIgKm1hc2ssCi0Jdm9pZCAoKnNldHVwKShzdHJ1Y3QgbmV0X2RldmljZSAqKSkKLXsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OwotICAgIElOVAkJCQkJYWxsb2Nfc2l6ZTsKLQotCi0gICAgLyogZW5zdXJlIDMyLWJ5dGUgYWxpZ25tZW50IG9mIHRoZSBwcml2YXRlIGFyZWEgKi8KLSAgICBhbGxvY19zaXplID0gc2l6ZW9mICgqZGV2KSArIHNpemVvZl9wcml2ICsgMzE7Ci0KLSAgICBkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikga21hbGxvYyhhbGxvY19zaXplLCBHRlBfS0VSTkVMKTsKLSAgICBpZiAoZGV2ID09IE5VTEwpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKLQkJCQkoImFsbG9jX25ldGRldjogVW5hYmxlIHRvIGFsbG9jYXRlIGRldmljZSBtZW1vcnkuXG4iKSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIG1lbXNldChkZXYsIDAsIGFsbG9jX3NpemUpOwotCi0gICAgaWYgKHNpemVvZl9wcml2KQotICAgICAgICBkZXYtPnByaXYgPSAodm9pZCAqKSAoKChsb25nKShkZXYgKyAxKSArIDMxKSAmIH4zMSk7Ci0KLSAgICBzZXR1cChkZXYpOwotICAgIHN0cmNweShkZXYtPm5hbWUsIG1hc2spOwotCi0gICAgcmV0dXJuIGRldjsKLX0KLSNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KLQotCi1pbnQgUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gVUlOVDMyCQlldmVudFR5cGUsCi0JSU4gSU5UCQkJZmxhZ3MsCi0JSU4gUFVDSEFSCQlwU3JjTWFjLAotCUlOIFBVQ0hBUgkJcERhdGEsCi0JSU4gVUlOVDMyCQlkYXRhTGVuKQotewotCXVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKLQotICAgICAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKLQotCWlmIChmbGFncz4tMSkKLQkgICAgICAgd3JxdS5kYXRhLmZsYWdzID0gZmxhZ3M7Ci0KLQlpZiAocFNyY01hYykKLQkJbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwU3JjTWFjLCBNQUNfQUREUl9MRU4pOwotCi0JaWYgKChwRGF0YSE9IE5VTEwpICYmIChkYXRhTGVuID4gMCkpCi0JCXdycXUuZGF0YS5sZW5ndGggPSBkYXRhTGVuOwotCi0gICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIGV2ZW50VHlwZSwgJndycXUsIChjaGFyICopcERhdGEpOwotCXJldHVybiAwOwotfQotCi0KLWludCBSdG1wT1NOZXREZXZBZGRyU2V0KAotCUlOIFBORVRfREVWIHBOZXREZXYsCi0JSU4gUFVDSEFSCXBNYWNBZGRyKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2OwotCVJUTVBfQURBUFRFUiAqcEFkOwotCi0JbmV0X2RldiA9IHBOZXREZXY7Ci0JLy9wQWQgPSAoUlRNUF9BREFQVEVSICopbmV0X2Rldi0+cHJpdjsKLQlwQWQ9UlRNUF9PU19ORVRERVZfR0VUX1BSSVYocE5ldERldik7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkvLyB3b3JrLWFyb3VuZCBmb3IgdGhlIFN1U0UgZHVlIHRvIGl0IGhhcyBpdCdzIG93biBpbnRlcmZhY2UgbmFtZSBtYW5hZ2VtZW50IHN5c3RlbS4KLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuZGV2X25hbWUsIDE2KTsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuZGV2X25hbWUsIG5ldF9kZXYtPm5hbWUsIHN0cmxlbihuZXRfZGV2LT5uYW1lKSk7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JTmRpc01vdmVNZW1vcnkobmV0X2Rldi0+ZGV2X2FkZHIsIHBNYWNBZGRyLCA2KTsKLQotCXJldHVybiAwOwotfQotCi0KLQotLyoKLSAgKglBc3NpZ24gdGhlIG5ldHdvcmsgZGV2IG5hbWUgZm9yIGNyZWF0ZWQgUmFsaW5rIFdpRmkgaW50ZXJmYWNlLgotICAqLwotc3RhdGljIGludCBSdG1wT1NOZXREZXZSZXF1ZXN0TmFtZSgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBQTkVUX0RFViBkZXYsCi0JSU4gUFNUUklORyBwUHJlZml4U3RyLAotCUlOIElOVAlkZXZJZHgpCi17Ci0JUE5FVF9ERVYJCWV4aXN0TmV0RGV2OwotCVNUUklORwkJc3VmZml4TmFtZVtJRk5BTVNJWl07Ci0JU1RSSU5HCQlkZXNpcmVkTmFtZVtJRk5BTVNJWl07Ci0JaW50CWlmTmFtZUlkeCwgcHJlZml4TGVuLCBzbG90TmFtZUxlbjsKLQlpbnQgU3RhdHVzOwotCi0KLQlwcmVmaXhMZW4gPSBzdHJsZW4ocFByZWZpeFN0cik7Ci0JQVNTRVJUKChwcmVmaXhMZW4gPCBJRk5BTVNJWikpOwotCi0JZm9yIChpZk5hbWVJZHggPSBkZXZJZHg7IGlmTmFtZUlkeCA8IDMyOyBpZk5hbWVJZHgrKykKLQl7Ci0JCW1lbXNldChzdWZmaXhOYW1lLCAwLCBJRk5BTVNJWik7Ci0JCW1lbXNldChkZXNpcmVkTmFtZSwgMCwgSUZOQU1TSVopOwotCQlzdHJuY3B5KCZkZXNpcmVkTmFtZVswXSwgcFByZWZpeFN0ciwgcHJlZml4TGVuKTsKLQotI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAotCQlpZiAocEFkLT5NQ19Sb3dJRCA+PSAwKQotCQkJc3ByaW50ZihzdWZmaXhOYW1lLCAiJTAyZF8lZCIsIHBBZC0+TUNfUm93SUQsIGlmTmFtZUlkeCk7Ci0JCWVsc2UKLSNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KLQkJc3ByaW50ZihzdWZmaXhOYW1lLCAiJWQiLCBpZk5hbWVJZHgpOwotCi0JCXNsb3ROYW1lTGVuID0gc3RybGVuKHN1ZmZpeE5hbWUpOwotCQlBU1NFUlQoKChzbG90TmFtZUxlbiArIHByZWZpeExlbikgPCBJRk5BTVNJWikpOwotCQlzdHJjYXQoZGVzaXJlZE5hbWUsIHN1ZmZpeE5hbWUpOwotCi0JCWV4aXN0TmV0RGV2ID0gUnRtcE9TTmV0RGV2R2V0QnlOYW1lKGRldiwgJmRlc2lyZWROYW1lWzBdKTsKLQkJaWYgKGV4aXN0TmV0RGV2ID09IE5VTEwpCi0JCQlicmVhazsKLQkJZWxzZQotCQkJUnRtcE9TTmV0RGV2aWNlUmVmUHV0KGV4aXN0TmV0RGV2KTsKLQl9Ci0KLQlpZihpZk5hbWVJZHggPCAzMikKLQl7Ci0JCXN0cmNweSgmZGV2LT5uYW1lWzBdLCAmZGVzaXJlZE5hbWVbMF0pOwotCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKLQkJCQkJKCJDYW5ub3QgcmVxdWVzdCBEZXZOYW1lIHdpdGggcHJlaWZ4KCVzKSBhbmQgaW4gcmFuZ2UoMH4zMikgYXMgc3VmZml4IGZyb20gT1MhXG4iLCBwUHJlZml4U3RyKSk7Ci0JCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0JcmV0dXJuIFN0YXR1czsKLX0KLQotCi12b2lkIFJ0bXBPU05ldERldkNsb3NlKAotCUlOIFBORVRfREVWIHBOZXREZXYpCi17Ci0JZGV2X2Nsb3NlKHBOZXREZXYpOwotfQotCi0KLXZvaWQgUnRtcE9TTmV0RGV2RnJlZShQTkVUX0RFViBwTmV0RGV2KQotewotCUFTU0VSVChwTmV0RGV2KTsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKLQlmcmVlX25ldGRldihwTmV0RGV2KTsKLSNlbHNlCi0Ja2ZyZWUocE5ldERldik7Ci0jZW5kaWYKLX0KLQotCi1JTlQgUnRtcE9TTmV0RGV2QWxsb2MoCi0JSU4gUE5FVF9ERVYgKm5ld19kZXZfcCwKLQlJTiBVSU5UMzIJcHJpdkRhdGFTaXplKQotewotCS8vIGFzc2lnbiBpdCBhcyBudWxsIGZpcnN0LgotCSpuZXdfZGV2X3AgPSBOVUxMOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWxsb2NhdGUgYSBuZXQgZGV2aWNlIHdpdGggcHJpdmF0ZSBkYXRhIHNpemU9JWQhXG4iLCBwcml2RGF0YVNpemUpKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gMHgyMDQwMiAvLyBSZWQgSGF0IDcuMQotCSpuZXdfZGV2X3AgPSBhbGxvY19uZXRkZXYocHJpdkRhdGFTaXplLCAiZXRoJWQiLCBldGhlcl9zZXR1cCk7Ci0jZWxzZQotCSpuZXdfZGV2X3AgPSBhbGxvY19ldGhlcmRldihwcml2RGF0YVNpemUpOwotI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLwotCi0JaWYgKCpuZXdfZGV2X3ApCi0JCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotCWVsc2UKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci19Ci0KLQotUE5FVF9ERVYgUnRtcE9TTmV0RGV2R2V0QnlOYW1lKFBORVRfREVWIHBOZXREZXYsIFBTVFJJTkcgcERldk5hbWUpCi17Ci0JUE5FVF9ERVYJcFRhcmdldE5ldERldiA9IE5VTEw7Ci0KLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjQpCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNikKLQlwVGFyZ2V0TmV0RGV2ID0gZGV2X2dldF9ieV9uYW1lKGRldl9uZXQocE5ldERldiksIHBEZXZOYW1lKTsKLSNlbHNlCi0JQVNTRVJUKHBOZXREZXYpOwotCXBUYXJnZXROZXREZXYgPSBkZXZfZ2V0X2J5X25hbWUocE5ldERldi0+bmRfbmV0LCBwRGV2TmFtZSk7Ci0jZW5kaWYKLSNlbHNlCi0JcFRhcmdldE5ldERldiA9IGRldl9nZXRfYnlfbmFtZShwRGV2TmFtZSk7Ci0jZW5kaWYgLy8gS0VSTkVMX1ZFUlNJT04oMiw2LDI0KSAvLwotCi0jZWxzZQotCWludAlkZXZOYW1lTGVuOwotCi0JZGV2TmFtZUxlbiA9IHN0cmxlbihwRGV2TmFtZSk7Ci0JQVNTRVJUKChkZXZOYW1lTGVuIDw9IElGTkFNU0laKSk7Ci0KLQlmb3IocFRhcmdldE5ldERldj1kZXZfYmFzZTsgcFRhcmdldE5ldERldiE9TlVMTDsgcFRhcmdldE5ldERldj1wVGFyZ2V0TmV0RGV2LT5uZXh0KQotCXsKLQkJaWYgKHN0cm5jbXAocFRhcmdldE5ldERldi0+bmFtZSwgcERldk5hbWUsIGRldk5hbWVMZW4pID09IDApCi0JCQlicmVhazsKLQl9Ci0jZW5kaWYgLy8gS0VSTkVMX1ZFUlNJT04oMiw1LDApIC8vCi0KLQlyZXR1cm4gcFRhcmdldE5ldERldjsKLX0KLQotCi12b2lkIFJ0bXBPU05ldERldmljZVJlZlB1dChQTkVUX0RFViBwTmV0RGV2KQotewotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKLQkvKgotCQlldmVyeSB0aW1lIGRldl9nZXRfYnlfbmFtZSBpcyBjYWxsZWQsIGFuZCBpdCBoYXMgcmV0dXJuZWQgYSB2YWxpZCBzdHJ1Y3QKLQkJbmV0X2RldmljZSosIGRldl9wdXQgc2hvdWxkIGJlIGNhbGxlZCBhZnRlcndhcmRzLCBiZWNhdXNlIG90aGVyd2lzZSB0aGUKLQkJbWFjaGluZSBoYW5ncyB3aGVuIHRoZSBkZXZpY2UgaXMgdW5yZWdpc3RlcmVkIChzaW5jZSBkZXYtPnJlZmNudCA+IDEpLgotCSovCi0JaWYocE5ldERldikKLQkJZGV2X3B1dChwTmV0RGV2KTsKLSNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KLX0KLQotCi1JTlQgUnRtcE9TTmV0RGV2RGVzdG9yeSgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBQTkVUX0RFVgkJcE5ldERldikKLXsKLQotCS8vIFRPRE86IE5lZWQgdG8gZml4IHRoaXMKLQlwcmludGsoIldBUk5JTkc6IFRoaXMgZnVuY3Rpb24oJXMpIG5vdCBpbXBsZW1lbnQgeWV0ISEhXG4iLCBfX0ZVTkNUSU9OX18pOwotCXJldHVybiAwOwotfQotCi0KLXZvaWQgUnRtcE9TTmV0RGV2RGV0YWNoKFBORVRfREVWIHBOZXREZXYpCi17Ci0JdW5yZWdpc3Rlcl9uZXRkZXYocE5ldERldik7Ci19Ci0KLQotaW50IFJ0bXBPU05ldERldkF0dGFjaCgKLQlJTiBQTkVUX0RFViBwTmV0RGV2LAotCUlOIFJUTVBfT1NfTkVUREVWX09QX0hPT0sgKnBEZXZPcEhvb2spCi17Ci0JaW50IHJldCwgcnRubF9sb2NrZWQgPSBGQUxTRTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJ0bXBPU05ldERldkF0dGFjaCgpLS0tPlxuIikpOwotCS8vIElmIHdlIG5lZWQgaG9vayBzb21lIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHRoZSBuZXQgZGV2aWNlIHN0cnVjdHJ1ZSwgbm93IGRvIGl0LgotCWlmIChwRGV2T3BIb29rKQotCXsKLQkJUFJUTVBfQURBUFRFUiBwQWQgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihwTmV0RGV2KTsKLQotCQlwTmV0RGV2LT5uZXRkZXZfb3BzID0gcERldk9wSG9vay0+bmV0ZGV2X29wczsKLQotCQkvKiBPUyBzcGVjaWZpYyBmbGFncywgaGVyZSB3ZSB1c2VkIHRvIGluZGljYXRlIGlmIHdlIGFyZSB2aXJ0dWFsIGludGVyZmFjZSAqLwotCQlwTmV0RGV2LT5wcml2X2ZsYWdzID0gcERldk9wSG9vay0+cHJpdl9mbGFnczsKLQotI2lmIChXSVJFTEVTU19FWFQgPCAyMSkgJiYgKFdJUkVMRVNTX0VYVCA+PSAxMikKLQkJcE5ldERldi0+Z2V0X3dpcmVsZXNzX3N0YXRzID0gcnQyOHh4X2dldF93aXJlbGVzc19zdGF0czsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jaWYgV0lSRUxFU1NfRVhUID49IDEyCi0JCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQotCQl7Ci0JCQlwTmV0RGV2LT53aXJlbGVzc19oYW5kbGVycyA9ICZydDI4eHhfaXdfaGFuZGxlcl9kZWY7Ci0JCX0KLSNlbmRpZiAvL1dJUkVMRVNTX0VYVCA+PSAxMgotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKLSNpZiBXSVJFTEVTU19FWFQgPj0gMTIKLQkJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKLQkJewotCQkJcE5ldERldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAmcnQyOHh4X2FwX2l3X2hhbmRsZXJfZGVmOwotCQl9Ci0jZW5kaWYgLy9XSVJFTEVTU19FWFQgPj0gMTIKLSNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLwotCi0JCS8vIGNvcHkgdGhlIG5ldCBkZXZpY2UgbWFjIGFkZHJlc3MgdG8gdGhlIG5ldF9kZXZpY2Ugc3RydWN0dXJlLgotCQlOZGlzTW92ZU1lbW9yeShwTmV0RGV2LT5kZXZfYWRkciwgJnBEZXZPcEhvb2stPmRldkFkZHJbMF0sIE1BQ19BRERSX0xFTik7Ci0KLQkJcnRubF9sb2NrZWQgPSBwRGV2T3BIb29rLT5uZWVkUHJvdGN0ZWQ7Ci0JfQotCi0JaWYgKHJ0bmxfbG9ja2VkKQotCQlyZXQgPSByZWdpc3Rlcl9uZXRkZXZpY2UocE5ldERldik7Ci0JZWxzZQotCQlyZXQgPSByZWdpc3Rlcl9uZXRkZXYocE5ldERldik7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0tUnRtcE9TTmV0RGV2QXR0YWNoKCksIHJldD0lZFxuIiwgcmV0KSk7Ci0JaWYgKHJldCA9PSAwKQotCQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQllbHNlCi0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotfQotCi0KLVBORVRfREVWIFJ0bXBPU05ldERldkNyZWF0ZSgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBJTlQJCQlkZXZUeXBlLAotCUlOIElOVAkJCWRldk51bSwKLQlJTiBJTlQJCQlwcml2TWVtU2l6ZSwKLQlJTiBQU1RSSU5HCQlwTmFtZVByZWZpeCkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldiA9IE5VTEw7Ci0JaW50IHN0YXR1czsKLQotCi0JLyogYWxsb2NhdGUgYSBuZXcgbmV0d29yayBkZXZpY2UgKi8KLQlzdGF0dXMgPSBSdG1wT1NOZXREZXZBbGxvYygmcE5ldERldiwgMCAvKnByaXZNZW1TaXplKi8pOwotCWlmIChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCS8qIGFsbG9jYXRpb24gZmFpbCwgZXhpdCAqLwotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBbGxvY2F0ZSBuZXR3b3JrIGRldmljZSBmYWlsICglcykuLi5cbiIsIHBOYW1lUHJlZml4KSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCi0JLyogZmluZCBhIGF2YWlsYWJsZSBpbnRlcmZhY2UgbmFtZSwgbWF4IDMyIGludGVyZmFjZXMgKi8KLQlzdGF0dXMgPSBSdG1wT1NOZXREZXZSZXF1ZXN0TmFtZShwQWQsIHBOZXREZXYsIHBOYW1lUHJlZml4LCBkZXZOdW0pOwotCWlmIChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCS8qIGVycm9yISBubyBhbnkgYXZhaWxhYmxlIHJhIG5hbWUgY2FuIGJlIHVzZWQhICovCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFzc2lnbiBpbnRlcmZhY2UgbmFtZSAoJXMgd2l0aCBzdWZmaXggMH4zMikgZmFpbGVkLi4uXG4iLCBwTmFtZVByZWZpeCkpOwotCQlSdG1wT1NOZXREZXZGcmVlKHBOZXREZXYpOwotCi0JCXJldHVybiBOVUxMOwotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgbmFtZSBvZiB0aGUgbmV3ICVzIGludGVyZmFjZSBpcyAlcy4uLlxuIiwgcE5hbWVQcmVmaXgsIHBOZXREZXYtPm5hbWUpKTsKLQl9Ci0KLQlyZXR1cm4gcE5ldERldjsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRfbGludXguaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRfbGludXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk3MGU3OC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X2xpbnV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDM0ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0JcnRfbGludXguaAotCi0gICAgQWJzdHJhY3Q6Ci0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaWZuZGVmIF9fUlRfTElOVVhfSF9fCi0jZGVmaW5lIF9fUlRfTElOVVhfSF9fCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KLSNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgotI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+Ci0jaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KLQotI2lmZGVmIElORl9BTUFaT05fUFBBCi0jaW5jbHVkZSA8YXNtL2FtYXpvbl9zZS9pZnhfcHBhX2ludGVyZmFjZS5oPgotI2luY2x1ZGUgPGFzbS9hbWF6b25fc2UvaWZ4X3BwYV9ob29rLmg+Ci0jZW5kaWYgLy8gSU5GX0FNQVpPTl9QUEEgLy8KLQotLy8gbG9hZCBmaXJtd2FyZQotI2RlZmluZSBfX0tFUk5FTF9TWVNDQUxMU19fCi0jaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CS8vIGZvciBnZXRfdW5hbGlnbmVkKCkKLQotI2lmZGVmIEtUSFJFQURfU1VQUE9SVAotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNlbmRpZiAvLyBLVEhSRUFEX1NVUFBPUlQgLy8KLQotI3VuZGVmIEFQX1dTQ19JTkNMVURFRAotI3VuZGVmIFNUQV9XU0NfSU5DTFVERUQKLSN1bmRlZiBXU0NfSU5DTFVERUQKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotI2lmZGVmIEtUSFJFQURfU1VQUE9SVAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiw0KQotI2Vycm9yICJUaGlzIGtlcm5lIHZlcnNpb24gZG9lc24ndCBzdXBwb3J0IGt0aHJlYWQhISIKLSNlbmRpZgotI2VuZGlmIC8vIEtUSFJFQURfU1VQUE9SVCAvLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCVByb2ZpbGUgcmVsYXRlZCBzZWN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLSNkZWZpbmUgU1RBX1BST0ZJTEVfUEFUSAkJCSIvZXRjL1dpcmVsZXNzL1JUMjg2MFNUQS9SVDI4NjBTVEEuZGF0IgotI2RlZmluZSBTVEFfRFJJVkVSX1ZFUlNJT04JCQkiMi4xLjAuMCIKLSNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKLSNkZWZpbmUgQ0FSRF9JTkZPX1BBVEgJCQkiL2V0Yy9XaXJlbGVzcy9SVDI4NjBTVEEvUlQyODYwU1RBQ2FyZC5kYXQiCi0jZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotCi1leHRlcm4JY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHJ0Mjh4eF9pd19oYW5kbGVyX2RlZjsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCi1leHRlcm4JY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHJ0Mjh4eF9hcF9pd19oYW5kbGVyX2RlZjsKLSNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCUNvbXBpbGVyIHJlbGF0ZWQgZGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSN1bmRlZiBfX2lubGluZQotI2RlZmluZSBfX2lubGluZQkJc3RhdGljIGlubGluZQotI2RlZmluZSBJTgotI2RlZmluZSBPVVQKLSNkZWZpbmUgSU5PVVQKLSNkZWZpbmUgTkRJU19TVEFUVVMJCUlOVAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJT1MgU3BlY2lmaWMgZGVmaW5pdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBzdHJ1Y3QgcGNpX2RldgkJKiBQUENJX0RFVjsKLXR5cGVkZWYgc3RydWN0IG5ldF9kZXZpY2UJKiBQTkVUX0RFVjsKLXR5cGVkZWYgdm9pZAkJCQkqIFBORElTX1BBQ0tFVDsKLXR5cGVkZWYgY2hhcgkJCQlORElTX1BBQ0tFVDsKLXR5cGVkZWYgUE5ESVNfUEFDS0VUCQkqIFBQTkRJU19QQUNLRVQ7Ci10eXBlZGVmCWRtYV9hZGRyX3QJCQlORElTX1BIWVNJQ0FMX0FERFJFU1M7Ci10eXBlZGVmCWRtYV9hZGRyX3QJCQkqIFBORElTX1BIWVNJQ0FMX0FERFJFU1M7Ci10eXBlZGVmIHZvaWQJCQkJKiBORElTX0hBTkRMRTsKLXR5cGVkZWYgY2hhcgkJCQkqIFBORElTX0JVRkZFUjsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpCi10eXBlZGVmCXN0cnVjdCBwaWQgKglSVE1QX09TX1BJRDsKLSNlbHNlCi10eXBlZGVmIHBpZF90CQkJCVJUTVBfT1NfUElEOwotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IHNlbWFwaG9yZQlSVE1QX09TX1NFTTsKLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotI2lmbmRlZiBQQ0lfREVWSUNFCi0jZGVmaW5lIFBDSV9ERVZJQ0UodmVuZCxkZXYpIFwKLQkudmVuZG9yID0gKHZlbmQpLCAuZGV2aWNlID0gKGRldiksIFwKLQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwgLnN1YmRldmljZSA9IFBDSV9BTllfSUQKLSNlbmRpZiAvLyBQQ0lfREVWSUNFIC8vCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0jZGVmaW5lIFJUX01PRF9JTkNfVVNFX0NPVU5UKCkgXAotCWlmICghdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpKSBcCi0JeyBcCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBjYW5ub3QgcmVzZXJ2ZSBtb2R1bGVcbiIsIF9fRlVOQ1RJT05fXykpOyBcCi0JCXJldHVybiAtMTsgXAotCX0KLQotI2RlZmluZSBSVF9NT0RfREVDX1VTRV9DT1VOVCgpIG1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwotI2Vsc2UKLSNkZWZpbmUgUlRfTU9EX0lOQ19VU0VfQ09VTlQoKQlNT0RfSU5DX1VTRV9DT1VOVDsKLSNkZWZpbmUgUlRfTU9EX0RFQ19VU0VfQ09VTlQoKSBNT0RfREVDX1VTRV9DT1VOVDsKLSNlbmRpZgotCi0jZGVmaW5lIFJUTVBfSU5DX1JFRihfQSkJCTAKLSNkZWZpbmUgUlRNUF9ERUNfUkVGKF9BKQkJMAotI2RlZmluZSBSVE1QX0dFVF9SRUYoX0EpCQkwCi0KLQotI2lmIFdJUkVMRVNTX0VYVCA+PSAxMgotLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIHF1ZXJ5IC9wcm9jCi1zdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cygKLSAgICBJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7Ci0jZW5kaWYKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCU5ldHdvcmsgcmVsYXRlZCBjb25zdGFudCBkZWZpbml0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBJRk5BTVNJWgotI2RlZmluZSBJRk5BTVNJWiAxNgotI2VuZGlmCi0KLSNkZWZpbmUgRVRIX0xFTkdUSF9PRl9BRERSRVNTCTYKLQotI2RlZmluZSBORElTX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgMHgwMAotI2RlZmluZSBORElTX1NUQVRVU19GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBORElTX1NUQVRVU19JTlZBTElEX0RBVEEJCQkJMHgwMgotI2RlZmluZSBORElTX1NUQVRVU19SRVNPVVJDRVMgICAgICAgICAgICAgICAgICAgMHgwMwotCi0jZGVmaW5lIE5ESVNfU0VUX1BBQ0tFVF9TVEFUVVMoX3AsIF9zdGF0dXMpCQkJZG97fSB3aGlsZSgwKQotI2RlZmluZSBOZGlzV3JpdGVFcnJvckxvZ0VudHJ5KF9hLCBfYiwgX2MsIF9kKQkJZG97fSB3aGlsZSgwKQotCi0vKiBzdGF0aXN0aWNzIGNvdW50ZXIgKi8KLSNkZWZpbmUgU1RBVFNfSU5DX1JYX1BBQ0tFVFMoX3BBZCwgX2RldikKLSNkZWZpbmUgU1RBVFNfSU5DX1RYX1BBQ0tFVFMoX3BBZCwgX2RldikKLQotI2RlZmluZSBTVEFUU19JTkNfUlhfQllURVNTKF9wQWQsIF9kZXYsIGxlbikKLSNkZWZpbmUgU1RBVFNfSU5DX1RYX0JZVEVTUyhfcEFkLCBfZGV2LCBsZW4pCi0KLSNkZWZpbmUgU1RBVFNfSU5DX1JYX0VSUk9SUyhfcEFkLCBfZGV2KQotI2RlZmluZSBTVEFUU19JTkNfVFhfRVJST1JTKF9wQWQsIF9kZXYpCi0KLSNkZWZpbmUgU1RBVFNfSU5DX1JYX0RST1BQRUQoX3BBZCwgX2RldikKLSNkZWZpbmUgU1RBVFNfSU5DX1RYX0RST1BQRUQoX3BBZCwgX2RldikKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCVJhbGluayBTcGVjaWZpYyBuZXR3b3JrIHJlbGF0ZWQgY29uc3RhbnQgZGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX0FJRAkJCTB4MDAJCS8vMHgwMH4weDNmCi0jZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9NQlNTSUQJCTB4MDAJCS8vMHgwMCwweDEwLDB4MjAsMHgzMAotI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTCQkJMHgxMAkJLy8weDQwLDB4NTAsMHg2MCwweDcwCi0jZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9BUENMSQkJMHgyMAotI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfTUVTSAkJCTB4MzAKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX0RMUwkJCTB4NDAKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSNkZWZpbmUgTkVUX0RFVklDRV9SRUFMX0lEWF9NQVNLCQkweDBmCQkvLyBmb3IgZWFjaCBvcGVyYXRpb24gbW9kZSwgd2UgbWF4aW11bSBzdXBwb3J0IDE1IGVudGl0aWVzLgotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNkZWZpbmUgTkRJU19QQUNLRVRfVFlQRV9ESVJFQ1RFRAkJMAotI2RlZmluZSBORElTX1BBQ0tFVF9UWVBFX01VTFRJQ0FTVAkJMQotI2RlZmluZSBORElTX1BBQ0tFVF9UWVBFX0JST0FEQ0FTVAkJMgotI2RlZmluZSBORElTX1BBQ0tFVF9UWVBFX0FMTF9NVUxUSUNBU1QJMwotI2RlZmluZSBORElTX1BBQ0tFVF9UWVBFX1BST01JU0NVT1VTCTQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCU9TIHNpZ25hbGluZyByZWxhdGVkIGNvbnN0YW50IGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKglPUyBmaWxlIG9wZXJhdGlvbiByZWxhdGVkIGRhdGEgc3RydWN0dXJlIGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdCBmaWxlKiBSVE1QX09TX0ZEOwotCi10eXBlZGVmIHN0cnVjdCBfUlRNUF9PU19GU19JTkZPXwotewotCWludAkJCQlmc3VpZDsKLQlpbnQJCQkJZnNnaWQ7Ci0JbW1fc2VnbWVudF90CWZzOwotfVJUTVBfT1NfRlNfSU5GTzsKLQotI2RlZmluZSBJU19GSUxFX09QRU5fRVJSKF9mZCkJSVNfRVJSKChfZmQpKQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJT1Mgc2VtYXBob3JlIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmUgYW5kIGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3Qgb3NfbG9jayAgewotCXNwaW5sb2NrX3QJCWxvY2s7Ci0JdW5zaWduZWQgbG9uZwlmbGFnczsKLX07Ci0KLXR5cGVkZWYgc3BpbmxvY2tfdAkJCU5ESVNfU1BJTl9MT0NLOwotCi0vLwotLy8gIHNwaW5fbG9jayBlbmhhbmNlZCBmb3IgTmVzdGVkIHNwaW4gbG9jawotLy8KLSNkZWZpbmUgTmRpc0FsbG9jYXRlU3BpbkxvY2soX19sb2NrKSAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc3Bpbl9sb2NrX2luaXQoKHNwaW5sb2NrX3QgKikoX19sb2NrKSk7ICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIE5kaXNGcmVlU3BpbkxvY2sobG9jaykgICAgICAgICAgXAotCWRve313aGlsZSgwKQotCi0KLSNkZWZpbmUgUlRNUF9TRU1fTE9DSyhfX2xvY2spCQkJCQlcCi17CQkJCQkJCQkJCQkJXAotCXNwaW5fbG9ja19iaCgoc3BpbmxvY2tfdCAqKShfX2xvY2spKTsJCVwKLX0KLQotI2RlZmluZSBSVE1QX1NFTV9VTkxPQ0soX19sb2NrKQkJCQkJXAotewkJCQkJCQkJCQkJCVwKLQlzcGluX3VubG9ja19iaCgoc3BpbmxvY2tfdCAqKShfX2xvY2spKTsJCVwKLX0KLQotCi0vLyBzYW1wbGUsIHVzZSBzZW1hcGhvcmUgbG9jayB0byByZXBsYWNlIElSUSBsb2NrLCAyMDA3LzExLzE1Ci0jZGVmaW5lIFJUTVBfSVJRX0xPQ0soX19sb2NrLCBfX2lycWZsYWdzKQkJCVwKLXsJCQkJCQkJCQkJCQkJXAotCV9faXJxZmxhZ3MgPSAwOwkJCQkJCQkJCVwKLQlzcGluX2xvY2tfYmgoKHNwaW5sb2NrX3QgKikoX19sb2NrKSk7CQkJXAotCXBBZC0+aXJxX2Rpc2FibGVkIHw9IDE7IFwKLX0KLQotI2RlZmluZSBSVE1QX0lSUV9VTkxPQ0soX19sb2NrLCBfX2lycWZsYWcpCQkJXAotewkJCQkJCQkJCQkJCQlcCi0JcEFkLT5pcnFfZGlzYWJsZWQgJj0gMDsJCQkJCQkJXAotCXNwaW5fdW5sb2NrX2JoKChzcGlubG9ja190ICopKF9fbG9jaykpOwkJCVwKLX0KLQotI2RlZmluZSBSVE1QX0lOVF9MT0NLKF9fbG9jaywgX19pcnFmbGFncykJCQlcCi17CQkJCQkJCQkJCQkJCVwKLQlzcGluX2xvY2tfaXJxc2F2ZSgoc3BpbmxvY2tfdCAqKV9fbG9jaywgX19pcnFmbGFncyk7CVwKLX0KLQotI2RlZmluZSBSVE1QX0lOVF9VTkxPQ0soX19sb2NrLCBfX2lycWZsYWcpCQkJXAotewkJCQkJCQkJCQkJCQlcCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgoc3BpbmxvY2tfdCAqKShfX2xvY2spLCAoKHVuc2lnbmVkIGxvbmcpX19pcnFmbGFnKSk7CVwKLX0KLQotI2RlZmluZSBOZGlzQWNxdWlyZVNwaW5Mb2NrCQlSVE1QX1NFTV9MT0NLCi0jZGVmaW5lIE5kaXNSZWxlYXNlU3BpbkxvY2sJCVJUTVBfU0VNX1VOTE9DSwotCi0jaWZuZGVmIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0Ci0jZGVmaW5lIF9fd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQod3EsIGNvbmRpdGlvbiwgcmV0KSBcCi1kbyB7IFwKLSAgICAgICAgd2FpdF9xdWV1ZV90IF9fd2FpdDsgXAotICAgICAgICBpbml0X3dhaXRxdWV1ZV9lbnRyeSgmX193YWl0LCBjdXJyZW50KTsgXAotICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmd3EsICZfX3dhaXQpOyBcCi0gICAgICAgIGZvciAoOzspIHsgXAotICAgICAgICAgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7IFwKLSAgICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgXAotICAgICAgICAgICAgICAgIGlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsgXAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gc2NoZWR1bGVfdGltZW91dChyZXQpOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJldCkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgXAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IFwKLSAgICAgICAgICAgICAgICB9IFwKLSAgICAgICAgICAgICAgICByZXQgPSAtRVJFU1RBUlRTWVM7IFwKLSAgICAgICAgICAgICAgICBicmVhazsgXAotICAgICAgICB9IFwKLSAgICAgICAgY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7IFwKLSAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJndxLCAmX193YWl0KTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh3cSwgY29uZGl0aW9uLCB0aW1lb3V0KSBcCi0oeyBcCi0gICAgICAgIGxvbmcgX19yZXQgPSB0aW1lb3V0OyBcCi0gICAgICAgIGlmICghKGNvbmRpdGlvbikpIFwKLSAgICAgICAgICAgICAgICBfX3dhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHdxLCBjb25kaXRpb24sIF9fcmV0KTsgXAotICAgICAgICBfX3JldDsgXAotfSkKLSNlbmRpZgotCi0jZGVmaW5lIFJUTVBfU0VNX0VWRU5UX0lOSVRfTE9DS0VEKF9wU2VtYSkJc2VtYV9pbml0KChfcFNlbWEpLCAwKQotI2RlZmluZSBSVE1QX1NFTV9FVkVOVF9JTklUKF9wU2VtYSkJCQlzZW1hX2luaXQoKF9wU2VtYSksIDEpCi0jZGVmaW5lIFJUTVBfU0VNX0VWRU5UX1dBSVQoX3BTZW1hLCBfc3RhdHVzKQkoKF9zdGF0dXMpID0gZG93bl9pbnRlcnJ1cHRpYmxlKChfcFNlbWEpKSkKLSNkZWZpbmUgUlRNUF9TRU1fRVZFTlRfVVAoX3BTZW1hKQkJCXVwKF9wU2VtYSkKLQotI2lmZGVmIEtUSFJFQURfU1VQUE9SVAotI2RlZmluZSBSVE1QX1dBSVRfRVZFTlRfSU5URVJSVVBUSUJMRShfcEFkLCBfcFRhc2spIFwKLXsgXAotCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoX3BUYXNrLT5rdGhyZWFkX3EsIFwKLQkJCQkJCQkJIF9wVGFzay0+a3RocmVhZF9ydW5uaW5nIHx8IGt0aHJlYWRfc2hvdWxkX3N0b3AoKSk7IFwKLQkJX3BUYXNrLT5rdGhyZWFkX3J1bm5pbmcgPSBGQUxTRTsgXAotCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKSBcCi0JCXsgXAotCQkJUlRNUF9TRVRfRkxBRyhfcEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOyBcCi0JCQlicmVhazsgXAotCQl9IFwKLX0KLSNlbmRpZgotCi0jaWZkZWYgS1RIUkVBRF9TVVBQT1JUCi0jZGVmaW5lIFdBS0VfVVAoX3BUYXNrKSBcCi0JZG97IFwKLQkJaWYgKChfcFRhc2spLT5rdGhyZWFkX3Rhc2spIFwKLSAgICAgICAgeyBcCi0JCQkoX3BUYXNrKS0+a3RocmVhZF9ydW5uaW5nID0gVFJVRTsgXAotCSAgICAgICAgd2FrZV91cCgmKF9wVGFzayktPmt0aHJlYWRfcSk7IFwKLQkJfSBcCi0JfXdoaWxlKDApCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKglPUyBNZW1vcnkgQWNjZXNzIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmUgYW5kIGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIE1FTV9BTExPQ19GTEFHICAgICAgKEdGUF9BVE9NSUMpIC8vKEdGUF9ETUEgfCBHRlBfQVRPTUlDKQotCi0jZGVmaW5lIE5kaXNNb3ZlTWVtb3J5KERlc3RpbmF0aW9uLCBTb3VyY2UsIExlbmd0aCkgbWVtbW92ZShEZXN0aW5hdGlvbiwgU291cmNlLCBMZW5ndGgpCi0jZGVmaW5lIE5kaXNDb3B5TWVtb3J5KERlc3RpbmF0aW9uLCBTb3VyY2UsIExlbmd0aCkgbWVtY3B5KERlc3RpbmF0aW9uLCBTb3VyY2UsIExlbmd0aCkKLSNkZWZpbmUgTmRpc1plcm9NZW1vcnkoRGVzdGluYXRpb24sIExlbmd0aCkgICAgICAgICBtZW1zZXQoRGVzdGluYXRpb24sIDAsIExlbmd0aCkKLSNkZWZpbmUgTmRpc0ZpbGxNZW1vcnkoRGVzdGluYXRpb24sIExlbmd0aCwgRmlsbCkgICBtZW1zZXQoRGVzdGluYXRpb24sIEZpbGwsIExlbmd0aCkKLSNkZWZpbmUgTmRpc0NtcE1lbW9yeShEZXN0aW5hdGlvbiwgU291cmNlLCBMZW5ndGgpICBtZW1jbXAoRGVzdGluYXRpb24sIFNvdXJjZSwgTGVuZ3RoKQotI2RlZmluZSBOZGlzRXF1YWxNZW1vcnkoU291cmNlMSwgU291cmNlMiwgTGVuZ3RoKSAgICghbWVtY21wKFNvdXJjZTEsIFNvdXJjZTIsIExlbmd0aCkpCi0jZGVmaW5lIFJUTVBFcXVhbE1lbW9yeShTb3VyY2UxLCBTb3VyY2UyLCBMZW5ndGgpCSghbWVtY21wKFNvdXJjZTEsIFNvdXJjZTIsIExlbmd0aCkpCi0KLSNkZWZpbmUgTWxtZUFsbG9jYXRlTWVtb3J5KF9wQWQsIF9wcFZBKQkJb3NfYWxsb2NfbWVtKF9wQWQsIF9wcFZBLCBNR01UX0RNQV9CVUZGRVJfU0laRSkKLSNkZWZpbmUgTWxtZUZyZWVNZW1vcnkoX3BBZCwgX3BWQSkJCQlvc19mcmVlX21lbShfcEFkLCBfcFZBKQotCi0jZGVmaW5lIENPUFlfTUFDX0FERFIoQWRkcjEsIEFkZHIyKSAgICAgICAgICAgICBtZW1jcHkoKEFkZHIxKSwgKEFkZHIyKSwgTUFDX0FERFJfTEVOKQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJT1MgdGFzayByZWxhdGVkIGRhdGEgc3RydWN0dXJlIGFuZCBkZWZpbml0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBSVE1QX09TX01HTVRfVEFTS19GTEFHUwlDTE9ORV9WTQotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykKLXR5cGVkZWYJc3RydWN0IHBpZCAqCVRIUkVBRF9QSUQ7Ci0jZGVmaW5lCVRIUkVBRF9QSURfSU5JVF9WQUxVRQlOVUxMCi0jZGVmaW5lCUdFVF9QSUQoX3YpCWZpbmRfZ2V0X3BpZCgoX3YpKQotI2RlZmluZQlHRVRfUElEX05VTUJFUihfdikJcGlkX25yKChfdikpCi0jZGVmaW5lIENIRUNLX1BJRF9MRUdBTElUWShfcGlkKQlpZiAocGlkX25yKChfcGlkKSkgPj0gMCkKLSNkZWZpbmUgS0lMTF9USFJFQURfUElEKF9BLCBfQiwgX0MpCWtpbGxfcGlkKChfQSksIChfQiksIChfQykpCi0jZWxzZQotdHlwZWRlZglwaWRfdAlUSFJFQURfUElEOwotI2RlZmluZQlUSFJFQURfUElEX0lOSVRfVkFMVUUJLTEKLSNkZWZpbmUJR0VUX1BJRChfdikJKF92KQotI2RlZmluZQlHRVRfUElEX05VTUJFUihfdikJKF92KQotI2RlZmluZSBDSEVDS19QSURfTEVHQUxJVFkoX3BpZCkJaWYgKChfcGlkKSA+PSAwKQotI2RlZmluZSBLSUxMX1RIUkVBRF9QSUQoX0EsIF9CLCBfQykJa2lsbF9wcm9jKChfQSksIChfQiksIChfQykpCi0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgIFJUTVBfTkVUX1RBU0tfU1RSVUNUOwotdHlwZWRlZiBzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgICpQUlRNUF9ORVRfVEFTS19TVFJVQ1Q7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUaW1lciByZWxhdGVkIGRlZmluaXRpb25zIGFuZCBkYXRhIHN0cnVjdHVyZXMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgT1NfSFoJCQlIWgotCi10eXBlZGVmIHN0cnVjdCB0aW1lcl9saXN0CU5ESVNfTUlOSVBPUlRfVElNRVI7Ci10eXBlZGVmIHN0cnVjdCB0aW1lcl9saXN0CVJUTVBfT1NfVElNRVI7Ci10eXBlZGVmIHZvaWQgKCpUSU1FUl9GVU5DVElPTikodW5zaWduZWQgbG9uZyk7Ci0KLQotI2RlZmluZSBPU19XQUlUKF90aW1lKSBcCi17CWludCBfaTsgXAotCWxvbmcgX2xvb3AgPSAoKF90aW1lKS8oMTAwMC9PU19IWikpID4gMCA/ICgoX3RpbWUpLygxMDAwL09TX0haKSkgOiAxO1wKLQl3YWl0X3F1ZXVlX2hlYWRfdCBfd2FpdDsgXAotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJl93YWl0KTsgXAotCWZvciAoX2k9MDsgX2k8KF9sb29wKTsgX2krKykgXAotCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChfd2FpdCwgMCwgT05FX1RJQ0spOyB9Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0jZGVmaW5lIFJUTVBfVElNRV9BRlRFUihhLGIpCQlcCi0JKHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZylhKSAmJiBcCi0JIHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZyliKSAmJiBcCi0JICgobG9uZykoYikgLSAobG9uZykoYSkgPCAwKSkKLQotI2RlZmluZSBSVE1QX1RJTUVfQUZURVJfRVEoYSxiKQlcCi0JKHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZylhKSAmJiBcCi0JIHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZyliKSAmJiBcCi0JICgobG9uZykoYSkgLSAobG9uZykoYikgPj0gMCkpCi0jZGVmaW5lIFJUTVBfVElNRV9CRUZPUkUoYSxiKQlSVE1QX1RJTUVfQUZURVJfRVEoYixhKQotI2Vsc2UKLSNkZWZpbmUgdHlwZWNoZWNrKHR5cGUseCkgXAotKHsgICAgICB0eXBlIF9fZHVtbXk7IFwKLSAgICAgICAgdHlwZW9mKHgpIF9fZHVtbXkyOyBcCi0gICAgICAgICh2b2lkKSgmX19kdW1teSA9PSAmX19kdW1teTIpOyBcCi0gICAgICAgIDE7IFwKLX0pCi0jZGVmaW5lIFJUTVBfVElNRV9BRlRFUl9FUShhLGIpCVwKLQkodHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWEpICYmIFwKLQkgdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWIpICYmIFwKLQkgKChsb25nKShhKSAtIChsb25nKShiKSA+PSAwKSkKLSNkZWZpbmUgUlRNUF9USU1FX0JFRk9SRShhLGIpCVJUTVBfVElNRV9BRlRFUl9FUShiLGEpCi0jZGVmaW5lIFJUTVBfVElNRV9BRlRFUihhLGIpIHRpbWVfYWZ0ZXIoYSwgYikKLSNlbmRpZgotCi0jZGVmaW5lIE9ORV9USUNLIDEKLQotc3RhdGljIGlubGluZSB2b2lkIE5kaXNHZXRTeXN0ZW1VcFRpbWUoVUxPTkcgKnRpbWUpCi17Ci0JKnRpbWUgPSBqaWZmaWVzOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJT1Mgc3BlY2lmaWMgY29va2llIGRhdGEgc3RydWN0dXJlIGJpbmRpbmcgdG8gUlRNUF9BREFQVEVSCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBvc19jb29raWUgewotI2lmZGVmIFJUTVBfTUFDX1BDSQotCXN0cnVjdCBwY2lfZGV2CQkJKnBjaV9kZXY7Ci0Jc3RydWN0IHBjaV9kZXYJCQkqcGFyZW50X3BjaV9kZXY7Ci0JVVNIT1JUICAgICAgICAgICAgICAgICAgRGV2aWNlSUQ7Ci0JZG1hX2FkZHJfdAkJCQlwQWRfcGE7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotCVJUTVBfTkVUX1RBU0tfU1RSVUNUIHJ4X2RvbmVfdGFzazsKLQlSVE1QX05FVF9UQVNLX1NUUlVDVCBtZ210X2RtYV9kb25lX3Rhc2s7Ci0JUlRNUF9ORVRfVEFTS19TVFJVQ1QgYWMwX2RtYV9kb25lX3Rhc2s7Ci0JUlRNUF9ORVRfVEFTS19TVFJVQ1QgYWMxX2RtYV9kb25lX3Rhc2s7Ci0JUlRNUF9ORVRfVEFTS19TVFJVQ1QgYWMyX2RtYV9kb25lX3Rhc2s7Ci0JUlRNUF9ORVRfVEFTS19TVFJVQ1QgYWMzX2RtYV9kb25lX3Rhc2s7Ci0JLypSVE1QX05FVF9UQVNLX1NUUlVDVCBoY2NhX2RtYV9kb25lX3Rhc2s7Ki8KLQlSVE1QX05FVF9UQVNLX1NUUlVDVCB0YnR0X3Rhc2s7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JUlRNUF9ORVRfVEFTS19TVFJVQ1QgZmlmb19zdGF0aXN0aWNfZnVsbF90YXNrOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0KLQotCXVuc2lnbmVkIGxvbmcJCQlhcGRfcGlkOyAvLzgwMi4xeCBkYWVtb24gcGlkCi0JSU5UCQkJCQkJaW9jdGxfaWZfdHlwZTsKLQlJTlQJCQkJCWlvY3RsX2lmOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3Qgb3NfY29va2llCSogUE9TX0NPT0tJRTsKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJT1MgZGVidWdnaW5nIGFuZCBwcmludGluZyByZWxhdGVkIGRlZmluaXRpb25zIGFuZCBkYXRhIHN0cnVjdHVyZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBQUklOVF9NQUMoYWRkcikJXAotCWFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0KLQotI2lmZGVmIERCRwotZXh0ZXJuIFVMT05HCQlSVERlYnVnTGV2ZWw7Ci0KLSNkZWZpbmUgREJHUFJJTlRfUkFXKExldmVsLCBGbXQpICAgIFwKLWRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChMZXZlbCA8PSBSVERlYnVnTGV2ZWwpICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwcmludGsgRm10OyAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX13aGlsZSgwKQotCi0jZGVmaW5lIERCR1BSSU5UKExldmVsLCBGbXQpICAgIERCR1BSSU5UX1JBVyhMZXZlbCwgRm10KQotCi0KLSNkZWZpbmUgREJHUFJJTlRfRVJSKEZtdCkgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwcmludGsoIkVSUk9SISEhICIpOyAgICAgICAgICBcCi0gICAgcHJpbnRrIEZtdDsgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgREJHUFJJTlRfUyhTdGF0dXMsIEZtdCkJCVwKLXsJCQkJCQkJCQlcCi0JcHJpbnRrIEZtdDsJCQkJCVwKLX0KLSNlbHNlCi0jZGVmaW5lIERCR1BSSU5UKExldmVsLCBGbXQpCi0jZGVmaW5lIERCR1BSSU5UX1JBVyhMZXZlbCwgRm10KQotI2RlZmluZSBEQkdQUklOVF9TKFN0YXR1cywgRm10KQotI2RlZmluZSBEQkdQUklOVF9FUlIoRm10KQotI2VuZGlmCi0KLSN1bmRlZiAgQVNTRVJUCi0jZGVmaW5lIEFTU0VSVCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghKHgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyBfX0ZJTEVfXyAiOiVkIGFzc2VydCAiICN4ICJmYWlsZWRcbiIsIF9fTElORV9fKTsgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLXZvaWQgaGV4X2R1bXAoY2hhciAqc3RyLCB1bnNpZ25lZCBjaGFyICpwU3JjQnVmVkEsIHVuc2lnbmVkIGludCBTcmNCdWZMZW4pOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlUaGUgZm9sbG93aW5nIGNvZGUgYXJlIG5vdCByZXZpc2VkLCB0ZW1wb3JhcnkgcHV0IGl0IGhlcmUuCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIERldmljZSBETUEgQWNjZXNzIHJlbGF0ZWQgZGVmaW5pdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIFJUTVBfTUFDX1BDSQotZG1hX2FkZHJfdCBsaW51eF9wY2lfbWFwX3NpbmdsZSh2b2lkICpoYW5kbGUsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsIGludCBzZF9pZHgsIGludCBkaXJlY3Rpb24pOwotdm9pZCBsaW51eF9wY2lfdW5tYXBfc2luZ2xlKHZvaWQgKmhhbmRsZSwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pOwotCi0jZGVmaW5lIFBDSV9NQVBfU0lOR0xFKF9oYW5kbGUsIF9wdHIsIF9zaXplLCBfc2RfaWR4LCBfZGlyKSBcCi0JbGludXhfcGNpX21hcF9zaW5nbGUoX2hhbmRsZSwgX3B0ciwgX3NpemUsIF9zZF9pZHgsIF9kaXIpCi0KLSNkZWZpbmUgUENJX1VOTUFQX1NJTkdMRShfaGFuZGxlLCBfcHRyLCBfc2l6ZSwgX2RpcikgXAotCWxpbnV4X3BjaV91bm1hcF9zaW5nbGUoX2hhbmRsZSwgX3B0ciwgX3NpemUsIF9kaXIpCi0KLSNkZWZpbmUgUENJX0FMTE9DX0NPTlNJU1RFTlQoX3BjaV9kZXYsIF9zaXplLCBfcHRyKSBcCi0JcGNpX2FsbG9jX2NvbnNpc3RlbnQoX3BjaV9kZXYsIF9zaXplLCBfcHRyKQotCi0jZGVmaW5lIFBDSV9GUkVFX0NPTlNJU1RFTlQoX3BjaV9kZXYsIF9zaXplLCBfdmlydHVhbF9hZGRyLCBfcGh5c2ljYWxfYWRkcikgXAotCXBjaV9mcmVlX2NvbnNpc3RlbnQoX3BjaV9kZXYsIF9zaXplLCBfdmlydHVhbF9hZGRyLCBfcGh5c2ljYWxfYWRkcikKLQotI2RlZmluZSBERVZfQUxMT0NfU0tCKF9sZW5ndGgpIFwKLQlkZXZfYWxsb2Nfc2tiKF9sZW5ndGgpCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotCi0vKgotICogVUxPTkcKLSAqIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KAotICogICBJTiBORElTX1BIWVNJQ0FMX0FERFJFU1MgIFBoeXNpY2FsQWRkcmVzcyk7Ci0gKi8KLSNkZWZpbmUgUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3coUGh5c2ljYWxBZGRyZXNzKQkJKFBoeXNpY2FsQWRkcmVzcykKLQotLyoKLSAqIFVMT05HCi0gKiBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2goCi0gKiAgIElOIE5ESVNfUEhZU0lDQUxfQUREUkVTUyAgUGh5c2ljYWxBZGRyZXNzKTsKLSAqLwotI2RlZmluZSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2goUGh5c2ljYWxBZGRyZXNzKQkJKDApCi0KLS8qCi0gKiBWT0lECi0gKiBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdygKLSAqICAgSU4gTkRJU19QSFlTSUNBTF9BRERSRVNTICBQaHlzaWNhbEFkZHJlc3MsCi0gKiAgIElOIFVMT05HICBWYWx1ZSk7Ci0gKi8KLSNkZWZpbmUgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3coUGh5c2ljYWxBZGRyZXNzLCBWYWx1ZSkJXAotCQkJUGh5c2ljYWxBZGRyZXNzID0gVmFsdWU7Ci0KLS8qCi0gKiBWT0lECi0gKiBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2goCi0gKiAgIElOIE5ESVNfUEhZU0lDQUxfQUREUkVTUyAgUGh5c2ljYWxBZGRyZXNzLAotICogICBJTiBVTE9ORyAgVmFsdWUpOwotICovCi0jZGVmaW5lIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChQaHlzaWNhbEFkZHJlc3MsIFZhbHVlKQotCi0jZGVmaW5lIE5kaXNNSW5kaWNhdGVTdGF0dXMoX3csIF94LCBfeSwgX3opCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIERldmljZSBSZWdpc3RlciBJL08gQWNjZXNzIHJlbGF0ZWQgZGVmaW5pdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIFJUTVBfTUFDX1BDSQotI2lmIGRlZmluZWQoSU5GX1RXSU5QQVNTKSB8fCBkZWZpbmVkKElORl9EQU5VQkUpIHx8IGRlZmluZWQoSUtBTk9TX1ZYXzFYMCkKLS8vUGF0Y2ggZm9yIEFTSUMgdHVyc3QgcmVhZC93cml0ZSBidWcsIG5lZWRzIHRvIHJlbW92ZSBhZnRlciBtZXRlbCBmaXgKLSNkZWZpbmUgUlRNUF9JT19SRUFEMzIoX0EsIF9SLCBfcFYpCQkJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQkJXAotICAgIGlmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSgqX3BWID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpKTsJCVwKLQkoKl9wViA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpKTsJCQlcCi0JKCpfcFYgPSBTV0FQMzIoKigoVUlOVDMyICopKF9wVikpKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIFJUTVBfSU9fUkVBRDgoX0EsIF9SLCBfcFYpCQkJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQkJXAotCSgqX3BWID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpKTsJCVwKLQkoKl9wViA9IHJlYWRiKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpKTsJCQlcCi19Ci0KLSNkZWZpbmUgUlRNUF9JT19XUklURTMyKF9BLCBfUiwgX1YpCQkJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQkJXAotICAgIGlmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCVVJTlQzMglfVmFsOwkJCQkJCQkJCQkJCQlcCi0JX1ZhbCA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKTsJCVwKLQlfVmFsID0gU1dBUDMyKF9WKTsJCQkJCQkJCQkJCQlcCi0Jd3JpdGVsKF9WYWwsICh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpOwkJCVwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBSVE1QX0lPX1dSSVRFOChfQSwgX1IsIF9WKQkJCQkJCQkJCVwKLXsJCQkJCQkJCQkJCQkJCQkJCVwKLQlVSU5UCVZhbDsJCQkJCQkJCQkJCQkJXAotCVZhbCA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKTsJCVwKLQl3cml0ZWIoKF9WKSwgKFBVQ0hBUikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSk7CQkJXAotfQotCi0jZGVmaW5lIFJUTVBfSU9fV1JJVEUxNihfQSwgX1IsIF9WKQkJCQkJCQkJCVwKLXsJCQkJCQkJCQkJCQkJCQkJCVwKLQlVSU5UCVZhbDsJCQkJCQkJCQkJCQkJXAotCVZhbCA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKTsJCVwKLQl3cml0ZXcoU1dBUDE2KChfVikpLCAoUFVTSE9SVCkoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSk7CVwKLX0KLSNlbHNlCi0vL1BhdGNoIGZvciBBU0lDIHR1cnN0IHJlYWQvd3JpdGUgYnVnLCBuZWVkcyB0byByZW1vdmUgYWZ0ZXIgbWV0ZWwgZml4Ci0jZGVmaW5lIFJUTVBfSU9fUkVBRDMyKF9BLCBfUiwgX3BWKQkJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQlcCi0gICAgaWYgKChfQSktPmJQQ0ljbGtPZmYgPT0gRkFMU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkoKl9wViA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKSk7CQlcCi0JCSgqX3BWID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSkpOwkJCVwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVsc2UJCQkJCQkJCQkJCQkJCQlcCi0JCSpfcFYgPSAwOwkJCQkJCQkJCQkJCQlcCi19Ci0KLSNkZWZpbmUgUlRNUF9JT19GT1JDRV9SRUFEMzIoX0EsIF9SLCBfcFYpCQkJCQkJCVwKLXsJCQkJCQkJCQkJCQkJCQkJCVwKLQkoKl9wViA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKSk7CQlcCi0JKCpfcFYgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKSk7CQkJXAotfQotCi0jZGVmaW5lIFJUTVBfSU9fUkVBRDgoX0EsIF9SLCBfcFYpCQkJCQkJCQlcCi17CQkJCQkJCQkJCQkJCQkJCVwKLQkoKl9wViA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKSk7CQkJXAotCSgqX3BWID0gcmVhZGIoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSkpOwkJCQlcCi19Ci0KLSNkZWZpbmUgUlRNUF9JT19XUklURTMyKF9BLCBfUiwgX1YpCQkJCQkJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQkJCQkJXAotICAgIGlmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlVSU5UCVZhbDsJCQkJCQkJCQkJCQkJCQkJXAotCVZhbCA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKTsJCQlcCi0Jd3JpdGVsKChfViksICh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpOwkJCQkJCQkJXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgUlRNUF9JT19GT1JDRV9XUklURTMyKF9BLCBfUiwgX1YpCQkJCQkJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCVVJTlQJVmFsOwkJCQkJCQkJCQkJCQkJCQlcCi0JVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpOwkJCVwKLQl3cml0ZWwoX1YsICh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpOwkJCQkJCQkJXAotfQotCi0KLQotI2lmIGRlZmluZWQoQlJDTV82MzU4KSB8fCBkZWZpbmVkKFJBTElOS18yODgwKSB8fCBkZWZpbmVkKFJBTElOS18zMDUyKQotI2RlZmluZSBSVE1QX0lPX1dSSVRFOChfQSwgX1IsIF9WKSAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgIFwKLQlVTE9ORyBWYWw7ICAgICAgICAgICAgICAgIFwKLQlVQ0hBUiBfaTsgICAgICAgICAgICAgICAgXAotCV9pID0gKChfUikgJiAweDMpOyAgICAgICAgICAgICBcCi0JVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoKF9SKSAtIF9pKSkpOyAgIFwKLQlWYWwgPSBWYWwgJiAofigweDAwMDAwMGZmIDw8ICgoX2kpKjgpKSk7ICAgICAgICAgXAotCVZhbCA9IFZhbCB8ICgoVUxPTkcpKF9WKSA8PCAoKF9pKSo4KSk7ICAgICAgICAgXAotCXdyaXRlbCgoVmFsKSwgKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoKF9SKSAtIF9pKSkpOyAgICBcCi19Ci0jZWxzZQotI2RlZmluZSBSVE1QX0lPX1dSSVRFOChfQSwgX1IsIF9WKQkJCQkJCQlcCi17CQkJCQkJCQkJCQkJCQkJXAotCVVJTlQJVmFsOwkJCQkJCQkJCQkJCVwKLQlWYWwgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSk7CVwKLQl3cml0ZWIoKF9WKSwgKFBVQ0hBUikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSk7CQlcCi19Ci0jZW5kaWYgLy8gI2lmIGRlZmluZWQoQlJDTV82MzU4KSB8fCBkZWZpbmVkKFJBTElOS18yODgwKSAvLwotCi0jZGVmaW5lIFJUTVBfSU9fV1JJVEUxNihfQSwgX1IsIF9WKQkJCQkJCQlcCi17CQkJCQkJCQkJCQkJCQkJXAotCVVJTlQJVmFsOwkJCQkJCQkJCQkJXAotCVZhbCA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKTsJXAotCXdyaXRldygoX1YpLCAoUFVTSE9SVCkoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSk7CVwKLX0KLSNlbmRpZiAvLyAjaWYgZGVmaW5lZChJTkZfVFdJTlBBU1MpIHx8IGRlZmluZWQoSU5GX0RBTlVCRSkgfHwgZGVmaW5lZChJS0FOT1NfVlhfMVgwKSAvLwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKglOZXR3b3JrIFJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmUgYW5kIG1hcmNvIGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFBLVFNSQ19ORElTICAgICAgICAgICAgIDB4N2YKLSNkZWZpbmUgUEtUU1JDX0RSSVZFUiAgICAgICAgICAgMHgwZgotCi0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjkpCi0jZGVmaW5lIFJUTVBfT1NfTkVUREVWX1NFVF9QUklWKF9wTmV0RGV2LCBfcFByaXYpCSgoX3BOZXREZXYpLT5wcml2ID0gKF9wUHJpdikpCi0jZGVmaW5lIFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKF9wTmV0RGV2KQkJKChfcE5ldERldiktPnByaXYpCi0jZWxzZQotI2RlZmluZSBSVE1QX09TX05FVERFVl9TRVRfUFJJVihfcE5ldERldiwgX3BQcml2KQkoKF9wTmV0RGV2KS0+bWxfcHJpdiA9IChfcFByaXYpKQotI2RlZmluZSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihfcE5ldERldikJCSgoX3BOZXREZXYpLT5tbF9wcml2KQotI2VuZGlmCi0jZGVmaW5lIFJUTVBfT1NfTkVUREVWX0dFVF9ERVZOQU1FKF9wTmV0RGV2KQkoKF9wTmV0RGV2KS0+bmFtZSkKLSNkZWZpbmUgUlRNUF9PU19ORVRERVZfR0VUX1BIWUFERFIoX1BORVRERVYpCSgoX1BORVRERVYpLT5kZXZfYWRkcikKLQotI2RlZmluZSBSVE1QX09TX05FVERFVl9TVEFSVF9RVUVVRShfcE5ldERldikJbmV0aWZfc3RhcnRfcXVldWUoKF9wTmV0RGV2KSkKLSNkZWZpbmUgUlRNUF9PU19ORVRERVZfU1RPUF9RVUVVRShfcE5ldERldikJbmV0aWZfc3RvcF9xdWV1ZSgoX3BOZXREZXYpKQotI2RlZmluZSBSVE1QX09TX05FVERFVl9XQUtFX1FVRVVFKF9wTmV0RGV2KQluZXRpZl93YWtlX3F1ZXVlKChfcE5ldERldikpCi0jZGVmaW5lIFJUTVBfT1NfTkVUREVWX0NBUlJJRVJfT0ZGKF9wTmV0RGV2KQluZXRpZl9jYXJyaWVyX29mZigoX3BOZXREZXYpKQotCi0jZGVmaW5lIFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwRW50cnkpIFwKLQkoUE5ESVNfUEFDS0VUKShwRW50cnkpCi0KLSNkZWZpbmUgUEFDS0VUX1RPX1FVRVVFX0VOVFJZKHBQYWNrZXQpIFwKLQkoUFFVRVVFX0VOVFJZKShwUGFja2V0KQotCi0jaWZkZWYgQ09ORklHXzVWVF9FTkhBTkNFCi0jZGVmaW5lIEJSSURHRV9UQUcgMHgzNTU2NDI1MiAgICAvLyBkZXBlbmRzIG9uIDVWVCBkZWZpbmUgaW4gYnJfaW5wdXQuYwotI2VuZGlmCi0KLSNkZWZpbmUgR0VUX1NHX0xJU1RfRlJPTV9QQUNLRVQoX3AsIF9zYykJXAotICAgIHJ0X2dldF9zZ19saXN0X2Zyb21fcGFja2V0KF9wLCBfc2MpCi0KLSNkZWZpbmUgUkVMRUFTRV9ORElTX1BBQ0tFVChfcEFkLCBfcFBhY2tldCwgX1N0YXR1cykgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgUlRNUEZyZWVOZGlzUGFja2V0KF9wQWQsIF9wUGFja2V0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotLyoKLSAqIHBhY2tldCBoZWxwZXIKLSAqCS0gY29udmVydCBpbnRlcm5hbCBydCBwYWNrZXQgdG8gb3MgcGFja2V0IG9yCi0gKiAgICAgICAgICAgICBvcyBwYWNrZXQgdG8gcnQgcGFja2V0Ci0gKi8KLSNkZWZpbmUgUlRQS1RfVE9fT1NQS1QoX3ApCQkoKHN0cnVjdCBza19idWZmICopKF9wKSkKLSNkZWZpbmUgT1NQS1RfVE9fUlRQS1QoX3ApCQkoKFBORElTX1BBQ0tFVCkoX3ApKQotCi0jZGVmaW5lIEdFVF9PU19QS1RfREFUQVBUUihfcGt0KSBcCi0JCShSVFBLVF9UT19PU1BLVChfcGt0KS0+ZGF0YSkKLSNkZWZpbmUgU0VUX09TX1BLVF9EQVRBUFRSKF9wa3QsIF9kYXRhUHRyKQlcCi0JCShSVFBLVF9UT19PU1BLVChfcGt0KS0+ZGF0YSkgPSAoX2RhdGFQdHIpCi0KLSNkZWZpbmUgR0VUX09TX1BLVF9MRU4oX3BrdCkgXAotCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmxlbikKLSNkZWZpbmUgU0VUX09TX1BLVF9MRU4oX3BrdCwgX2xlbikJXAotCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmxlbikgPSAoX2xlbikKLQotI2RlZmluZSBHRVRfT1NfUEtUX0RBVEFUQUlMKF9wa3QpIFwKLQkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT50YWlsKQotI2RlZmluZSBTRVRfT1NfUEtUX0RBVEFUQUlMKF9wa3QsIF9zdGFydCwgX2xlbikJXAotCQkoKFJUUEtUX1RPX09TUEtUKF9wa3QpKS0+dGFpbCkgPSAoUFVDSEFSKSgoX3N0YXJ0KSArIChfbGVuKSkKLQotI2RlZmluZSBHRVRfT1NfUEtUX0hFQUQoX3BrdCkgXAotCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmhlYWQpCi0KLSNkZWZpbmUgR0VUX09TX1BLVF9FTkQoX3BrdCkgXAotCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmVuZCkKLQotI2RlZmluZSBHRVRfT1NfUEtUX05FVERFVihfcGt0KSBcCi0JCShSVFBLVF9UT19PU1BLVChfcGt0KS0+ZGV2KQotI2RlZmluZSBTRVRfT1NfUEtUX05FVERFVihfcGt0LCBfcE5ldERldikJXAotCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmRldikgPSAoX3BOZXREZXYpCi0KLSNkZWZpbmUgR0VUX09TX1BLVF9UWVBFKF9wa3QpIFwKLQkJKFJUUEtUX1RPX09TUEtUKF9wa3QpKQotCi0jZGVmaW5lIEdFVF9PU19QS1RfTkVYVChfcGt0KSBcCi0JCShSVFBLVF9UT19PU1BLVChfcGt0KS0+bmV4dCkKLQotCi0jZGVmaW5lIE9TX1BLVF9DTE9ORUQoX3BrdCkJCXNrYl9jbG9uZWQoUlRQS1RfVE9fT1NQS1QoX3BrdCkpCi0KLSNkZWZpbmUgT1NfTlRPSFMoX1ZhbCkgXAotCQkobnRvaHMoX1ZhbCkpCi0jZGVmaW5lIE9TX0hUT05TKF9WYWwpIFwKLQkJKGh0b25zKF9WYWwpKQotI2RlZmluZSBPU19OVE9ITChfVmFsKSBcCi0JCShudG9obChfVmFsKSkKLSNkZWZpbmUgT1NfSFRPTkwoX1ZhbCkgXAotCQkoaHRvbmwoX1ZhbCkpCi0KLSNkZWZpbmUgQ0JfT0ZGICAxMAotCi0vLyBVc2VyIFByaW9yaXR5Ci0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9VUChfcCwgX3ByaW8pCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzBdID0gX3ByaW8pCi0jZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9VUChfcCkJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRiswXSkKLQotLy8gRnJhZ21lbnQgIwotI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfRlJBR01FTlRTKF9wLCBfbnVtKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzFdID0gX251bSkKLSNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhfcCkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMV0pCi0KLS8vIDB4MCB+MHg3ZjogVFggdG8gQVAncyBvd24gQlNTIHdoaWNoIGhhcyB0aGUgc3BlY2lmaWVkIEFJRC4gaWYgQUlEPjEyNywgc2V0IGJpdCA3IGluIFJUTVBfU0VUX1BBQ0tFVF9FTUFDVEFCIHRvby4KLS8vKHRoaXMgdmFsdWUgYWxzbyBhcyBNQUMob24tY2hpcCBXQ0lEKSB0YWJsZSBpbmRleCkKLS8vIDB4ODB+MHhmZjogVFggdG8gYSBXRFMgbGluay4gYjB+NjogV0RTIGluZGV4Ci0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9XQ0lEKF9wLCBfd2RzaWR4KQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzJdID0gX3dkc2lkeCkKLSNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1dDSUQoX3ApCQkJKChVQ0hBUikoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMl0pKQotCi0vLyAweGZmOiBQS1RTUkNfTkRJUywgb3RoZXJzOiBsb2NhbCBUWCBidWZmZXIgaW5kZXguIFRoaXMgdmFsdWUgYWZmZWN0cyBob3cgdG8gYSBwYWNrZXQKLSNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShfcCwgX3BrdHNyYykJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRiszXSA9IF9wa3RzcmMpCi0jZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9TT1VSQ0UoX3ApCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzNdKQotCi0vLyBSVFMvQ1RTLXRvLXNlbGYgcHJvdGVjdGlvbiBtZXRob2QKLSNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1JUUyhfcCwgX251bSkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNF0gPSBfbnVtKQotI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfUlRTKF9wKQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNF0pCi0vLyBzZWUgUlRNUF9TKEcpRVRfUEFDS0VUX0VNQUNUQUIKLQotLy8gVFggcmF0ZSBpbmRleAotI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfVFhSQVRFKF9wLCBfcmF0ZSkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis1XSA9IF9yYXRlKQotI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfVFhSQVRFKF9wKQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNV0pCi0KLS8vIEZyb20gd2hpY2ggSW50ZXJmYWNlCi0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9JRihfcCwgX2lmZHgpCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNl0gPSBfaWZkeCkKLSNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0lGKF9wKQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNl0pCi0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9ORVRfREVWSUNFX01CU1NJRChfcCwgX2JzcykJCVJUTVBfU0VUX1BBQ0tFVF9JRigoX3ApLCAoX2JzcykpCi0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9ORVRfREVWSUNFX1dEUyhfcCwgX2JzcykJCVJUTVBfU0VUX1BBQ0tFVF9JRigoX3ApLCAoKF9ic3MpICsgTUlOX05FVF9ERVZJQ0VfRk9SX1dEUykpCi0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9ORVRfREVWSUNFX0FQQ0xJKF9wLCBfaWR4KQlSVE1QX1NFVF9QQUNLRVRfSUYoKF9wKSwgKChfaWR4KSArIE1JTl9ORVRfREVWSUNFX0ZPUl9BUENMSSkpCi0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9ORVRfREVWSUNFX01FU0goX3AsIF9pZHgpCVJUTVBfU0VUX1BBQ0tFVF9JRigoX3ApLCAoKF9pZHgpICsgTUlOX05FVF9ERVZJQ0VfRk9SX01FU0gpKQotI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfTkVUX0RFVklDRV9NQlNTSUQoX3ApCQkJUlRNUF9HRVRfUEFDS0VUX0lGKChfcCkpCi0jZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9ORVRfREVWSUNFKF9wKQkJCQkJUlRNUF9HRVRfUEFDS0VUX0lGKChfcCkpCi0KLSNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX01PUkVEQVRBKF9wLCBfbW9yZWJpdCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis3XSA9IF9tb3JlYml0KQotI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfTU9SRURBVEEoX3ApCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis3XSkKLQotCi0KLQotCi0vLwotLy8JU2VwY2lmaWMgUGFrY2V0IFR5cGUgZGVmaW5pdGlvbgotLy8KLSNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfQ0JfT0ZGU0VUCTExCi0KLSNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfREhDUAkJMHgwMQotI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19FQVBPTAkJMHgwMgotI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19JUFY0CQkweDA0Ci0jZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX1dBSQkJMHgwOAotI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19WTEFOCQkweDEwCi0jZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX0xMQ1NOQVAJMHgyMAotCi0vL1NwZWNpZmljCi0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9TUEVDSUZJQyhfcCwgX2ZsZykJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gPSBfZmxnKQotCi0vL0RIQ1AKLSNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0RIQ1AoX3AsIF9mbGcpCQkJCQkJCQkJCQkJCQlcCi0JCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgfD0gKFJUTVBfUEFDS0VUX1NQRUNJRklDX0RIQ1ApOwkJXAotCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfREhDUCk7CVwKLQkJCX13aGlsZSgwKQotI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfREhDUChfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19ESENQKQotCi0vL0VBUE9MCi0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9FQVBPTChfcCwgX2ZsZykJCQkJCQkJCQkJCQkJCVwKLQkJCWRvewkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJCWlmIChfZmxnKQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSB8PSAoUlRNUF9QQUNLRVRfU1BFQ0lGSUNfRUFQT0wpOwkJXAotCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfRUFQT0wpOwlcCi0JCQl9d2hpbGUoMCkKLSNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0VBUE9MKF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSAmIFJUTVBfUEFDS0VUX1NQRUNJRklDX0VBUE9MKQotCi0vL1dBSQotI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfV0FJKF9wLCBfZmxnKQkJCQkJCQkJCQkJCQkJXAotCQkJZG97CQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQkJaWYgKF9mbGcpCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pIHw9IChSVE1QX1BBQ0tFVF9TUEVDSUZJQ19XQUkpOwkJXAotCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfV0FJKTsJXAotCQkJfXdoaWxlKDApCi0jZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9XQUkoX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfV0FJKQotCi0jZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9MT1dSQVRFKF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSAmIChSVE1QX1BBQ0tFVF9TUEVDSUZJQ19FQVBPTCB8IFJUTVBfUEFDS0VUX1NQRUNJRklDX0RIQ1AgfCBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19XQUkpKQotCi0vL1ZMQU4KLSNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1ZMQU4oX3AsIF9mbGcpCQkJCQkJCQkJCQkJCQlcCi0JCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgfD0gKFJUTVBfUEFDS0VUX1NQRUNJRklDX1ZMQU4pOwkJXAotCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfVkxBTik7CVwKLQkJCX13aGlsZSgwKQotI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfVkxBTihfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19WTEFOKQotCi0vL0xMQy9TTkFQCi0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9MTENTTkFQKF9wLCBfZmxnKQkJCQkJCQkJCQkJCQlcCi0JCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgfD0gKFJUTVBfUEFDS0VUX1NQRUNJRklDX0xMQ1NOQVApOwkJXAotCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfTExDU05BUCk7CQlcCi0JCQl9d2hpbGUoMCkKLQotI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfTExDU05BUChfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19MTENTTkFQKQotCi0vLyBJUAotI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfSVBWNChfcCwgX2ZsZykJCQkJCQkJCQkJCQkJCVwKLQkJCWRvewkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJCWlmIChfZmxnKQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSB8PSAoUlRNUF9QQUNLRVRfU1BFQ0lGSUNfSVBWNCk7CQlcCi0JCQkJZWxzZQkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgJj0gKCFSVE1QX1BBQ0tFVF9TUEVDSUZJQ19JUFY0KTsJXAotCQkJfXdoaWxlKDApCi0KLSNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0lQVjQoX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfSVBWNCkKLQotCi0vLyBJZiB0aGlzIGZsYWcgaXMgc2V0LCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGlzIEVBUG9MIGZyYW1lIE1VU1QgYmUgY2xlYXIuCi0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9DTEVBUl9FQVBfRlJBTUUoX3AsIF9mbGcpICAgKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzEyXSA9IF9mbGcpCi0jZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9DTEVBUl9FQVBfRlJBTUUoX3ApICAgICAgICAgKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzEyXSkKLQotCi0KLS8qIHVzZSBiaXQzIG9mIGNiW0NCX09GRisxNl0gKi8KLQotI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfNVZUKF9wLCBfZmxnKSAgIChSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisyMl0gPSBfZmxnKQotI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfNVZUKF9wKSAgICAgICAgIChSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisyMl0pCi0KLSNpZmRlZiBJTkZfQU1BWk9OX1NFCi0vKiBbQ0JfT0ZGKzI4XSwgMUIsIEl2ZXJzb24gcGF0Y2ggZm9yIFdNTSBBNS1UMDcgLFdpcmVsZXNzU3RhVG9XaXJlbGVzc1N0YSBkbyBub3QgYnVsayBvdXQgYWdncmVnYXRlICovCi0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9OT0JVTEtPVVQoX3AsIF9tb3JlYml0KQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisyOF0gPSBfbW9yZWJpdCkKLSNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX05PQlVMS09VVChfcCkJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisyOF0pCi0jZW5kaWYgLy8gSU5GX0FNQVpPTl9TRSAvLwotLyogTWF4IHNrYi0+Y2IgPSA0OEIgPSBbQ0JfT0ZGKzM4XSAqLwotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKglPdGhlciBmdW5jdGlvbiBwcm90b3R5cGVzIGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFJUTVBfR2V0Q3VycmVudFN5c3RlbVRpbWUoTEFSR0VfSU5URUdFUiAqdGltZSk7Ci1pbnQgcnQyOHh4X3BhY2tldF94bWl0KHN0cnVjdCBza19idWZmICpza2IpOwotCi0KLXZvaWQgRmxhc2hXcml0ZShVQ0hBUiAqIHAsIFVMT05HIGEsIFVMT05HIGIpOwotdm9pZCBGbGFzaFJlYWQoVUNIQVIgKiBwLCBVTE9ORyBhLCBVTE9ORyBiKTsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSAweDIwNDAyCS8vIFJlZCBIYXQgNy4xCi1zdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfbmV0ZGV2KGludCBzaXplb2ZfcHJpdiwgY29uc3QgY2hhciAqbWFzaywgdm9pZCAoKnNldHVwKShzdHJ1Y3QgbmV0X2RldmljZSAqKSk7Ci0jZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCi0KLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotLyogZnVuY3Rpb24gZGVjbGFyYXRpb25zICovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotI2RlZmluZSBJUlFfSEFORExFX1RZUEUgIGlycXJldHVybl90Ci0jZWxzZQotI2RlZmluZSBJUlFfSEFORExFX1RZUEUgIHZvaWQKLSNlbmRpZgotCi1JUlFfSEFORExFX1RZUEUKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwxOSkpCi1ydDI4NjBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSk7Ci0jZWxzZQotcnQyODYwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLSNlbmRpZgotCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLUlOVCBydDI4eHhfaW9jdGwoCi0JSU4JUE5FVF9ERVYJCW5ldF9kZXYsCi0JSU4JT1VUCXN0cnVjdCBpZnJlcQkqcnEsCi0JSU4JSU5UCQkJY21kKTsKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1JTlQgcnQyOHh4X3N0YV9pb2N0bCgKLQlJTglQTkVUX0RFVgkJbmV0X2RldiwKLQlJTglPVVQJc3RydWN0IGlmcmVxCSpycSwKLQlJTglJTlQJCQljbWQpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi1leHRlcm4gaW50IHJhX210ZF93cml0ZShpbnQgbnVtLCBsb2ZmX3QgdG8sIHNpemVfdCBsZW4sIGNvbnN0IHVfY2hhciAqYnVmKTsKLWV4dGVybiBpbnQgcmFfbXRkX3JlYWQoaW50IG51bSwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIHVfY2hhciAqYnVmKTsKLQotI2VuZGlmIC8vIF9fUlRfTElOVVhfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X21haW5fZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X21haW5fZGV2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMDdhNWYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydF9tYWluX2Rldi5jCisrKyAvZGV2L251bGwKQEAgLTEsODk3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgcnRfbWFpbl9kZXYuYwotCi0gICAgQWJzdHJhY3Q6Ci0gICAgQ3JlYXRlIGFuZCByZWdpc3RlciBuZXR3b3JrIGludGVyZmFjZS4KLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotI2luY2x1ZGUgInJ0X2NvbmZpZy5oIgotCi0KLSNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAotVUlOVDMyIENXX01BWF9JTl9CSVRTOwotI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIFByaXZhdGUgVmFyaWFibGVzIFVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotUFNUUklORyBtYWMgPSAiIjsJCSAgIC8vIGRlZmF1bHQgMDA6MDA6MDA6MDA6MDA6MDAKLVBTVFJJTkcgaG9zdG5hbWUgPSAiIjsJCSAgIC8vIGRlZmF1bHQgQ01QQwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSBLRVJORUxfVkVSU0lPTigyLDYsMTIpCi1NT0RVTEVfUEFSTSAobWFjLCAicyIpOwotI2Vsc2UKLW1vZHVsZV9wYXJhbSAobWFjLCBjaGFycCwgMCk7Ci0jZW5kaWYKLU1PRFVMRV9QQVJNX0RFU0MgKG1hYywgInJ0Mjh4eDogd2lyZWxlc3MgbWFjIGFkZHIiKTsKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBQcm90b3R5cGVzIG9mIEZ1bmN0aW9ucyBVc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8vIHB1YmxpYyBmdW5jdGlvbiBwcm90b3R5cGUKLWludCBydDI4eHhfY2xvc2UoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOwotaW50IHJ0Mjh4eF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKLQotLy8gcHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGUKLXN0YXRpYyBJTlQgcnQyOHh4X3NlbmRfcGFja2V0cyhJTiBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3AsIElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKLQotCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKlJUMjh4eF9nZXRfZXRoZXJfc3RhdHMoCi0gICAgSU4gIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBDbG9zZSByYXh4IGludGVyZmFjZS4KLQotQXJndW1lbnRzOgotCSpuZXRfZGV2CQkJdGhlIHJheHggaW50ZXJmYWNlIHBvaW50ZXIKLQotUmV0dXJuIFZhbHVlOgotICAgIDAJCQkJCU9wZW4gT0sKLQlvdGhlcndpc2UJCQlPcGVuIEZhaWwKLQotTm90ZToKLQkxLiBpZiBvcGVuIGZhaWwsIGtlcm5lbCB3aWxsIG5vdCBjYWxsIHRoZSBjbG9zZSBmdW5jdGlvbi4KLQkyLiBGcmVlIG1lbW9yeSBmb3IKLQkJKDEpIE1sbWUgTWVtb3J5IEhhbmRsZXI6CQlNbG1lSGFsdCgpCi0JCSgyKSBUWCAmIFJYOgkJCQkJUlRNUEZyZWVUeFJ4UmluZ01lbW9yeSgpCi0JCSgzKSBCQSBSZW9yZGVyaW5nOgkJCQliYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoKQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotaW50IE1haW5WaXJ0dWFsSUZfY2xvc2UoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCi17Ci0gICAgUlRNUF9BREFQVEVSICpwQWQgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihuZXRfZGV2KTsKLQotCS8vIFNhbml0eSBjaGVjayBmb3IgcEFkCi0JaWYgKHBBZCA9PSBOVUxMKQotCQlyZXR1cm4gMDsgLy8gY2xvc2Ugb2sKLQotCW5ldGlmX2NhcnJpZXJfb2ZmKHBBZC0+bmV0X2Rldik7Ci0JbmV0aWZfc3RvcF9xdWV1ZShwQWQtPm5ldF9kZXYpOwotCi0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCUJPT0xFQU4JCQlDYW5jZWxsZWQ7Ci0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCS8vIHNlbmQgRExTLVRFQVJfRE9XTiBtZXNzYWdlLAotCQlpZiAocEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCi0JCXsKLQkJCVVDSEFSIGk7Ci0KLQkJCS8vIHRlYXIgZG93biBsb2NhbCBkbHMgdGFibGUgZW50cnkKLQkJCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKLQkJCXsKLQkJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKLQkJCQl7Ci0JCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOwotCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKLQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHRlYXIgZG93biBwZWVyIGRscyB0YWJsZSBlbnRyeQotCQkJZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKLQkJCXsKLQkJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKLQkJCQl7Ci0JCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOwotCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKLQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKLQkJCQl9Ci0JCQl9Ci0JCQlSVE1QX01MTUVfSEFORExFUihwQWQpOwotCQl9Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLQkJaWYgKElORlJBX09OKHBBZCkgJiYKLQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKLQkJewotCQkJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUCURpc1JlcTsKLQkJCU1MTUVfUVVFVUVfRUxFTSAqTXNnRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOwotCi0JCQlpZiAoTXNnRWxlbSkKLQkJCXsKLQkJCUNPUFlfTUFDX0FERFIoRGlzUmVxLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJCURpc1JlcS5SZWFzb24gPSAgUkVBU09OX0RFQVVUSF9TVEFfTEVBVklORzsKLQotCQkJTXNnRWxlbS0+TWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7Ci0JCQlNc2dFbGVtLT5Nc2dUeXBlID0gTVQyX01MTUVfRElTQVNTT0NfUkVROwotCQkJTXNnRWxlbS0+TXNnTGVuID0gc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCk7Ci0JCQlOZGlzTW92ZU1lbW9yeShNc2dFbGVtLT5Nc2csICZEaXNSZXEsIHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpKTsKLQotCQkJLy8gUHJldmVudCB0byBjb25uZWN0IEFQIGFnYWluIGluIFNUQU1sbWVQZXJpb2RpY0V4ZWMKLQkJCXBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7Ci0JCQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7Ci0KLQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0RJU0FTU09DOwotCQkJTWxtZURpc2Fzc29jUmVxQWN0aW9uKHBBZCwgTXNnRWxlbSk7Ci0JCQlrZnJlZShNc2dFbGVtKTsKLQkJCX0KLQotCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQkJfQotCi0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsICZDYW5jZWxsZWQpOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLldwYURpc2Fzc29jQW5kQmxvY2tBc3NvY1RpbWVyLCAmQ2FuY2VsbGVkKTsKLQotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQkJLy8gc2VuZCB3aXJlbGVzcyBldmVudCB0byB3cGFfc3VwcGxpY2FudCBmb3IgaW5mcm9taW5nIGludGVyZmFjZSBkb3duLgotCQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIElXRVZDVVNUT00sIFJUX0lOVEVSRkFDRV9ET1dOLCBOVUxMLCBOVUxMLCAwKTsKLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQotCi0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JVklSVFVBTF9JRl9ET1dOKHBBZCk7Ci0KLQlSVF9NT0RfREVDX1VTRV9DT1VOVCgpOwotCi0JcmV0dXJuIDA7IC8vIGNsb3NlIG9rCi19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgT3BlbiByYXh4IGludGVyZmFjZS4KLQotQXJndW1lbnRzOgotCSpuZXRfZGV2CQkJdGhlIHJheHggaW50ZXJmYWNlIHBvaW50ZXIKLQotUmV0dXJuIFZhbHVlOgotICAgIDAJCQkJCU9wZW4gT0sKLQlvdGhlcndpc2UJCQlPcGVuIEZhaWwKLQotTm90ZToKLQkxLiBpZiBvcGVuIGZhaWwsIGtlcm5lbCB3aWxsIG5vdCBjYWxsIHRoZSBjbG9zZSBmdW5jdGlvbi4KLQkyLiBGcmVlIG1lbW9yeSBmb3IKLQkJKDEpIE1sbWUgTWVtb3J5IEhhbmRsZXI6CQlNbG1lSGFsdCgpCi0JCSgyKSBUWCAmIFJYOgkJCQkJUlRNUEZyZWVUeFJ4UmluZ01lbW9yeSgpCi0JCSgzKSBCQSBSZW9yZGVyaW5nOgkJCQliYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoKQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotaW50IE1haW5WaXJ0dWFsSUZfb3BlbihJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKLXsKLSAgICBSVE1QX0FEQVBURVIgKnBBZCA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKG5ldF9kZXYpOwotCi0JLy8gU2FuaXR5IGNoZWNrIGZvciBwQWQKLQlpZiAocEFkID09IE5VTEwpCi0JCXJldHVybiAwOyAvLyBjbG9zZSBvawotCi0JaWYgKFZJUlRVQUxfSUZfVVAocEFkKSAhPSAwKQotCQlyZXR1cm4gLTE7Ci0KLQkvLyBpbmNyZWFzZSBNT0RVTEUgdXNlIGNvdW50Ci0JUlRfTU9EX0lOQ19VU0VfQ09VTlQoKTsKLQotCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldF9kZXYpOwotCW5ldGlmX2NhcnJpZXJfb24obmV0X2Rldik7Ci0JbmV0aWZfd2FrZV9xdWV1ZShuZXRfZGV2KTsKLQotCXJldHVybiAwOwotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIENsb3NlIHJheHggaW50ZXJmYWNlLgotCi1Bcmd1bWVudHM6Ci0JKm5ldF9kZXYJCQl0aGUgcmF4eCBpbnRlcmZhY2UgcG9pbnRlcgotCi1SZXR1cm4gVmFsdWU6Ci0gICAgMAkJCQkJT3BlbiBPSwotCW90aGVyd2lzZQkJCU9wZW4gRmFpbAotCi1Ob3RlOgotCTEuIGlmIG9wZW4gZmFpbCwga2VybmVsIHdpbGwgbm90IGNhbGwgdGhlIGNsb3NlIGZ1bmN0aW9uLgotCTIuIEZyZWUgbWVtb3J5IGZvcgotCQkoMSkgTWxtZSBNZW1vcnkgSGFuZGxlcjoJCU1sbWVIYWx0KCkKLQkJKDIpIFRYICYgUlg6CQkJCQlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KCkKLQkJKDMpIEJBIFJlb3JkZXJpbmc6CQkJCWJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfcmVsZWFzZSgpCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1pbnQgcnQyOHh4X2Nsb3NlKElOIFBORVRfREVWIGRldikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqIG5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXY7Ci0gICAgUlRNUF9BREFQVEVSCSpwQWQgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihuZXRfZGV2KTsKLQlCT09MRUFOCQkJQ2FuY2VsbGVkOwotCVVJTlQzMgkJCWkgPSAwOwotCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IHJ0Mjh4eF9jbG9zZVxuIikpOwotCi0JQ2FuY2VsbGVkID0gRkFMU0U7Ci0JLy8gU2FuaXR5IGNoZWNrIGZvciBwQWQKLQlpZiAocEFkID09IE5VTEwpCi0JCXJldHVybiAwOyAvLyBjbG9zZSBvawotCi0KLQotI2lmZGVmIFdEU19TVVBQT1JUCi0JV2RzRG93bihwQWQpOwotI2VuZGlmIC8vIFdEU19TVVBQT1JUIC8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsIFJFU1RPUkVfQ0xPU0UpOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JCS8vIElmIGRpcnZlciBkb2Vzbid0IHdha2UgdXAgZmlybXdhcmUgaGVyZSwKLQkJLy8gTklDTG9hZEZpcm13YXJlIHdpbGwgaGFuZyBmb3JldmVyIHdoZW4gaW50ZXJmYWNlIGlzIHVwIGFnYWluLgotCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLSAgICAgICAgewotCQkgICAgQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7Ci0gICAgICAgIH0KLQotCi0JCU1sbWVSYWRpb09mZihwQWQpOwotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQlwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKLQotCWZvciAoaSA9IDAgOyBpIDwgTlVNX09GX1RYX1JJTkc7IGkrKykKLQl7Ci0JCXdoaWxlIChwQWQtPkRlUXVldWVSdW5uaW5nW2ldID09IFRSVUUpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldhaXRpbmcgZm9yIFR4UXVldWVbJWRdIGRvbmUuLi4uLi4uLi4uXG4iLCBpKSk7Ci0JCQlSVE1QdXNlY0RlbGF5KDEwMDApOwotCQl9Ci0JfQotCi0KLQotCS8vIFN0b3AgTWxtZSBzdGF0ZSBtYWNoaW5lCi0JTWxtZUhhbHQocEFkKTsKLQotCS8vIENsb3NlIG5ldCB0YXNrbGV0cwotCVJ0bXBOZXRUYXNrRXhpdChwQWQpOwotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJTWFjVGFibGVSZXNldChwQWQpOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0JTWVhc3VyZVJlcVRhYkV4aXQocEFkKTsKLQlUcGNSZXFUYWJFeGl0KHBBZCk7Ci0KLQotCS8vIENsb3NlIGtlcm5lbCB0aHJlYWRzCi0JUnRtcE1nbXRUYXNrRXhpdChwQWQpOwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JewotCQkJQk9PTEVBTiBicmM7Ci0JCQkvLwlVTE9ORwkJCVZhbHVlOwotCi0JCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpKQotCQkJewotCQkJCVJUTVBfQVNJQ19JTlRFUlJVUFRfRElTQUJMRShwQWQpOwotCQkJfQotCi0JCQkvLyBSZWNlaXZlIHBhY2tldHMgdG8gY2xlYXIgRE1BIGluZGV4IGFmdGVyIGRpc2FibGUgaW50ZXJydXB0LgotCQkJLy9SVE1QSGFuZGxlUnhEb25lSW50ZXJydXB0KHBBZCk7Ci0JCQkvLyBwdXQgdG8gcmFkaW8gb2ZmIHRvIHNhdmUgcG93ZXIgd2hlbiBkcml2ZXIgdW5sb2FkLiAgQWZ0ZXIgcmFkaW9vZmYsIGNhbid0IHdyaXRlIC9yZWFkIHJlZ2lzdGVyLiAgU28gbmVlZCB0byBmaW5pc2ggYWxsCi0JCQkvLyByZWdpc3RlciBhY2Nlc3MgYmVmb3JlIFJhZGlvIG9mZi4KLQotCi0JCQlicmM9UlQyOHh4UGNpQXNpY1JhZGlvT2ZmKHBBZCwgUlRNUF9IQUxULCAwKTsKLQotLy9JbiAgc29sdXRpb24gMyBvZiAzMDkwRiwgdGhlIGJQQ0ljbGtPZmYgd2lsbCBiZSBzZXQgdG8gVFJVRSBhZnRlciBjYWxsaW5nIFJUMjh4eFBjaUFzaWNSYWRpb09mZgotCQkJcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7Ci0KLQkJCWlmIChicmM9PUZBTFNFKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiJXMgY2FsbCBSVDI4eHhQY2lBc2ljUmFkaW9PZmYgZmFpbCAhIVxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCQl9Ci0JfQotCi0KLS8qCi0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfQUNUSVZFKSkKLQl7Ci0JCVJUTVBfQVNJQ19JTlRFUlJVUFRfRElTQUJMRShwQWQpOwotCX0KLQotCS8vIERpc2FibGUgUngsIHJlZ2lzdGVyIHZhbHVlIHN1cHBvc2VkIHdpbGwgcmVtYWluIGFmdGVyIHJlc2V0Ci0JTklDSXNzdWVSZXNldChwQWQpOwotKi8KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCS8vIEZyZWUgSVJRCi0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLQl7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCS8vIERlcmVnaXN0ZXIgaW50ZXJydXB0IGZ1bmN0aW9uCi0JCVJUTVBfSVJRX1JFTEVBU0UobmV0X2RldikKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKTsKLQl9Ci0KLQkvLyBGcmVlIFJpbmcgb3IgVVNCIGJ1ZmZlcnMKLQlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KHBBZCk7Ci0KLQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JLy8gRnJlZSBCQSByZW9yZGVyIHJlc291cmNlCi0JYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKHBBZCk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApOwotCi0vKisrK01vZGlmeSBieSB3b29keSB0byBzb2x2ZSB0aGUgYnVsayBmYWlsKysrKi8KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IHJ0Mjh4eF9jbG9zZVxuIikpOwotCXJldHVybiAwOyAvLyBjbG9zZSBvawotfSAvKiBFbmQgb2YgcnQyOHh4X2Nsb3NlICovCi0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBPcGVuIHJheHggaW50ZXJmYWNlLgotCi1Bcmd1bWVudHM6Ci0JKm5ldF9kZXYJCQl0aGUgcmF4eCBpbnRlcmZhY2UgcG9pbnRlcgotCi1SZXR1cm4gVmFsdWU6Ci0gICAgMAkJCQkJT3BlbiBPSwotCW90aGVyd2lzZQkJCU9wZW4gRmFpbAotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotaW50IHJ0Mjh4eF9vcGVuKElOIFBORVRfREVWIGRldikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqIG5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXY7Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihuZXRfZGV2KTsKLQlpbnQgcmV0dmFsID0gMDsKLQkvL1BPU19DT09LSUUgcE9iajsKLQotCi0JLy8gU2FuaXR5IGNoZWNrIGZvciBwQWQKLQlpZiAocEFkID09IE5VTEwpCi0JewotCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOwotCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KLQkJcmV0dXJuIC0xOwotCX0KLQotI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCi0JaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKLQl7Ci0JCUNXX01BWF9JTl9CSVRTID0gNjsKLQl9Ci0JZWxzZSBpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLQl7Ci0JCUNXX01BWF9JTl9CSVRTID0gMTA7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCi0KLSNpZiBXSVJFTEVTU19FWFQgPj0gMTIKLQlpZiAobmV0X2Rldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKLQl7Ci0jaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKLQkJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKLQkJCW5ldF9kZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSAmcnQyOHh4X2FwX2l3X2hhbmRsZXJfZGVmOwotI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQotCQkJbmV0X2Rldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopICZydDI4eHhfaXdfaGFuZGxlcl9kZWY7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JfQotI2VuZGlmIC8vIFdJUkVMRVNTX0VYVCA+PSAxMiAvLwotCi0JLy8gUmVxdWVzdCBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGZvciBQQ0kgZGV2aWNlCi0JLy8gcmVnaXN0ZXIgdGhlIGludGVycnVwdCByb3V0aW5lIHdpdGggdGhlIG9zCi0JUlRNUF9JUlFfUkVRVUVTVChuZXRfZGV2KTsKLQotCS8vIEluaXQgSVJRIHBhcmFtZXRlcnMgc3RvcmVkIGluIHBBZAotCVJUTVBfSVJRX0lOSVQocEFkKTsKLQotCS8vIENoaXAgJiBvdGhlciBpbml0Ci0JaWYgKHJ0Mjh4eF9pbml0KHBBZCwgbWFjLCBob3N0bmFtZSkgPT0gRkFMU0UpCi0JCWdvdG8gZXJyOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkvLyBFbmFibGUgSW50ZXJydXB0Ci0JUlRNUF9JUlFfRU5BQkxFKHBBZCk7Ci0KLQkvLyBOb3cgRW5hYmxlIFJ4VHgKLQlSVE1QRW5hYmxlUnhUeChwQWQpOwotCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1NUQVJUX1VQKTsKLQotCXsKLQlVSU5UMzIgcmVnID0gMDsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIDB4MTMwMCwgJnJlZyk7ICAvLyBjbGVhciBnYXJiYWdlIGludGVycnVwdHMKLQlwcmludGsoIjB4MTMwMCA9ICUwOHhcbiIsIHJlZyk7Ci0JfQotCi0JewotLy8JdTMyIHJlZzsKLS8vCVVJTlQ4ICBieXRlOwotLy8JdTE2IHRtcDsKLQotLy8JUlRNUF9JT19SRUFEMzIocEFkLCBYSUZTX1RJTUVfQ0ZHLCAmcmVnKTsKLQotLy8JdG1wID0gMHgwODA1OwotLy8JcmVnICA9IChyZWcgJiAweGZmZmYwMDAwKSB8IHRtcDsKLS8vCVJUTVBfSU9fV1JJVEUzMihwQWQsIFhJRlNfVElNRV9DRkcsIHJlZyk7Ci0KLQl9Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIFJUTVBfTUFDX1BDSQotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0gICAgICAgIFJUTVBJbml0UENJZUxpbmtDdHJsVmFsdWUocEFkKTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCXJldHVybiAocmV0dmFsKTsKLQotZXJyOgotLy8rKytBZGQgYnkgc2hpYW5nLCBtb3ZlIGZyb20gcnQyOHh4X2luaXQoKSB0byBoZXJlLgotCVJUTVBfSVJRX1JFTEVBU0UobmV0X2Rldik7Ci0vLy0tLUFkZCBieSBzaGlhbmcsIG1vdmUgZnJvbSBydDI4eHhfaW5pdCgpIHRvIGhlcmUuCi0JcmV0dXJuICgtMSk7Ci19IC8qIEVuZCBvZiBydDI4eHhfb3BlbiAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHJ0MzA5MF9uZXRkZXZfb3BzID0gewotCS5uZG9fb3BlbgkJPSBNYWluVmlydHVhbElGX29wZW4sCi0JLm5kb19zdG9wCQk9IE1haW5WaXJ0dWFsSUZfY2xvc2UsCi0JLm5kb19kb19pb2N0bAkJPSBydDI4eHhfaW9jdGwsCi0JLm5kb19nZXRfc3RhdHMJCT0gUlQyOHh4X2dldF9ldGhlcl9zdGF0cywKLQkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGV0aF9tYWNfYWRkciwKLQkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCi0jaWZkZWYgSUtBTk9TX1ZYXzFYMAotCS5uZG9fc3RhcnRfeG1pdAkJPSBJS0FOT1NfRGF0YUZyYW1lc1R4LAotI2Vsc2UKLQkubmRvX3N0YXJ0X3htaXQJCT0gcnQyOHh4X3NlbmRfcGFja2V0cywKLSNlbmRpZgotfTsKLQotUE5FVF9ERVYgUnRtcFBoeU5ldERldkluaXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gUlRNUF9PU19ORVRERVZfT1BfSE9PSyAqcE5ldERldkhvb2spCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UJKm5ldF9kZXYgPSBOVUxMOwotLy8JTkRJU19TVEFUVVMJCVN0YXR1czsKLQotCW5ldF9kZXYgPSBSdG1wT1NOZXREZXZDcmVhdGUocEFkLCBJTlRfTUFJTiwgMCwgc2l6ZW9mKFBSVE1QX0FEQVBURVIpLCBJTkZfTUFJTl9ERVZfTkFNRSk7Ci0JaWYgKG5ldF9kZXYgPT0gTlVMTCkKLQl7Ci0JCXByaW50aygiUnRtcFBoeU5ldERldkluaXQoKTogY3JlYXRpb24gZmFpbGVkIGZvciBtYWluIHBoeXNpY2FsIG5ldCBkZXZpY2UhXG4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JTmRpc1plcm9NZW1vcnkoKHVuc2lnbmVkIGNoYXIgKilwTmV0RGV2SG9vaywgc2l6ZW9mKFJUTVBfT1NfTkVUREVWX09QX0hPT0spKTsKLQlwTmV0RGV2SG9vay0+bmV0ZGV2X29wcyA9ICZydDMwOTBfbmV0ZGV2X29wczsKLQlwTmV0RGV2SG9vay0+cHJpdl9mbGFncyA9IElOVF9NQUlOOwotCXBOZXREZXZIb29rLT5uZWVkUHJvdGN0ZWQgPSBGQUxTRTsKLQotCVJUTVBfT1NfTkVUREVWX1NFVF9QUklWKG5ldF9kZXYsIHBBZCk7Ci0JLy9uZXRfZGV2LT5wcml2ID0gKFBWT0lEKXBBZDsKLQlwQWQtPm5ldF9kZXYgPSBuZXRfZGV2OwotCi0KLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKLQlTRVRfTU9EVUxFX09XTkVSKG5ldF9kZXYpOwotI2VuZGlmCi0KLQluZXRpZl9zdG9wX3F1ZXVlKG5ldF9kZXYpOwotCi0JcmV0dXJuIG5ldF9kZXY7Ci0KLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIFRoZSBlbnRyeSBwb2ludCBmb3IgTGludXgga2VybmVsIHNlbnQgcGFja2V0IHRvIG91ciBkcml2ZXIuCi0KLUFyZ3VtZW50czoKLSAgICBza19idWZmICpza2IJCXRoZSBwb2ludGVyIHJlZmVyIHRvIGEgc2tfYnVmZmVyLgotCi1SZXR1cm4gVmFsdWU6Ci0gICAgMAotCi1Ob3RlOgotCVRoaXMgZnVuY3Rpb24gaXMgdGhlIGVudHJ5IHBvaW50IG9mIFR4IFBhdGggZm9yIE9zIGRlbGl2ZXJ5IHBhY2tldCB0bwotCW91ciBkcml2ZXIuIFlvdSBvbmx5IGNhbiBwdXQgT1MtZGVwZW5lZCAmIFNUQS9BUCBjb21tb24gaGFuZGxlIHByb2NlZHVyZXMKLQlpbiBoZXJlLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotaW50IHJ0Mjh4eF9wYWNrZXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gc2tiLT5kZXY7Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihuZXRfZGV2KTsKLQlpbnQgc3RhdHVzID0gMDsKLQlQTkRJU19QQUNLRVQgcFBhY2tldCA9IChQTkRJU19QQUNLRVQpIHNrYjsKLQotCS8qIFJUMjg3MFNUQSBkb2VzIHRoaXMgaW4gUlRNUFNlbmRQYWNrZXRzKCkgKi8KLSNpZmRlZiBSQUxJTktfQVRFCi0JaWYgKEFURV9PTihwQWQpKQotCXsKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1JFU09VUkNFUyk7Ci0JCXJldHVybiAwOwotCX0KLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJLy8gRHJvcCBzZW5kIHJlcXVlc3Qgc2luY2Ugd2UgYXJlIGluIG1vbml0b3IgbW9kZQotCQlpZiAoTU9OSVRPUl9PTihwQWQpKQotCQl7Ci0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSAgICAgICAgLy8gRWFwb2xTdGFydCBzaXplIGlzIDE4Ci0JaWYgKHNrYi0+bGVuIDwgMTQpCi0JewotCQkvL3ByaW50aygiYmFkIHBhY2tldCBzaXplOiAlZFxuIiwgcGt0LT5sZW4pOwotCQloZXhfZHVtcCgiYmFkIHBhY2tldCIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQotCi0JUlRNUF9TRVRfUEFDS0VUXzVWVChwUGFja2V0LCAwKTsKLS8vCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgcGt0LT5kYXRhLCBwa3QtPmxlbik7Ci0jaWZkZWYgQ09ORklHXzVWVF9FTkhBTkNFCi0gICAgaWYgKCooaW50Kikoc2tiLT5jYikgPT0gQlJJREdFX1RBRykgewotCQlSVE1QX1NFVF9QQUNLRVRfNVZUKHBQYWNrZXQsIDEpOwotICAgIH0KLSNlbmRpZgotCi0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCi0JCVNUQVNlbmRQYWNrZXRzKChORElTX0hBTkRMRSlwQWQsIChQUE5ESVNfUEFDS0VUKSAmcFBhY2tldCwgMSk7Ci0JfQotCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlzdGF0dXMgPSAwOwotZG9uZToKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBTZW5kIGEgcGFja2V0IHRvIFdMQU4uCi0KLUFyZ3VtZW50czoKLSAgICBza2JfcCAgICAgICAgICAgcG9pbnRzIHRvIG91ciBhZGFwdGVyCi0gICAgZGV2X3AgICAgICAgICAgIHdoaWNoIFdMQU4gbmV0d29yayBpbnRlcmZhY2UKLQotUmV0dXJuIFZhbHVlOgotICAgIDA6IHRyYW5zbWl0IHN1Y2Nlc3NmdWxseQotICAgIG90aGVyd2lzZTogdHJhbnNtaXQgZmFpbAotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIGludCBydDI4eHhfc2VuZF9wYWNrZXRzKAotCUlOIHN0cnVjdCBza19idWZmCQkqc2tiX3AsCi0JSU4gc3RydWN0IG5ldF9kZXZpY2UJKm5ldF9kZXYpCi17Ci0JUlRNUF9BREFQVEVSICpwQWQgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihuZXRfZGV2KTsKLQotCWlmICghKG5ldF9kZXYtPmZsYWdzICYgSUZGX1VQKSkKLQl7Ci0JCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCAoUE5ESVNfUEFDS0VUKXNrYl9wLCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikmc2tiX3AtPmNiW0NCX09GRl0sIDE1KTsKLQlSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9NQlNTSUQoc2tiX3AsIE1BSU5fTUJTU0lEKTsKLQotCXJldHVybiBydDI4eHhfcGFja2V0X3htaXQoc2tiX3ApOwotfQotCi0KLSNpZiBXSVJFTEVTU19FWFQgPj0gMTIKLS8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiBxdWVyeSAvcHJvYwotc3RydWN0IGl3X3N0YXRpc3RpY3MgKnJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMoCi0gICAgSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCi17Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihuZXRfZGV2KTsKLQotCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzIC0tLT5cbiIpKTsKLQotCXBBZC0+aXdfc3RhdHMuc3RhdHVzID0gMDsgLy8gU3RhdHVzIC0gZGV2aWNlIGRlcGVuZGVudCBmb3Igbm93Ci0KLQkvLyBsaW5rIHF1YWxpdHkKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLQlwQWQtPml3X3N0YXRzLnF1YWwucXVhbCA9ICgocEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ICogMTIpLzEwICsgMTApOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JaWYocEFkLT5pd19zdGF0cy5xdWFsLnF1YWwgPiAxMDApCi0JCXBBZC0+aXdfc3RhdHMucXVhbC5xdWFsID0gMTAwOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCi0JewotCQlwQWQtPml3X3N0YXRzLnF1YWwubGV2ZWwgPQotCQkJUlRNUE1heFJzc2kocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwKLQkJCQkJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwKLQkJCQkJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMik7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JcEFkLT5pd19zdGF0cy5xdWFsLm5vaXNlID0gcEFkLT5CYnBXcml0ZUxhdGNoWzY2XTsgLy8gbm9pc2UgbGV2ZWwgKGRCbSkKLQotCXBBZC0+aXdfc3RhdHMucXVhbC5ub2lzZSArPSAyNTYgLSAxNDM7Ci0JcEFkLT5pd19zdGF0cy5xdWFsLnVwZGF0ZWQgPSAxOyAgICAgLy8gRmxhZ3MgdG8ga25vdyBpZiB1cGRhdGVkCi0jaWZkZWYgSVdfUVVBTF9EQk0KLQlwQWQtPml3X3N0YXRzLnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX0RCTTsJLy8gTGV2ZWwgKyBOb2lzZSBhcmUgZEJtCi0jZW5kaWYgLy8gSVdfUVVBTF9EQk0gLy8KLQotCXBBZC0+aXdfc3RhdHMuZGlzY2FyZC5ud2lkID0gMDsgICAgIC8vIFJ4IDogV3JvbmcgbndpZC9lc3NpZAotCXBBZC0+aXdfc3RhdHMubWlzcy5iZWFjb24gPSAwOyAgICAgIC8vIE1pc3NlZCBiZWFjb25zL3N1cGVyZnJhbWUKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS0gcnQyOHh4X2dldF93aXJlbGVzc19zdGF0c1xuIikpOwotCXJldHVybiAmcEFkLT5pd19zdGF0czsKLX0KLSNlbmRpZiAvLyBXSVJFTEVTU19FWFQgLy8KLQotCi12b2lkIHRidHRfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0vLyNkZWZpbmUgTUFYX1RYX0lOX1RCVFQJCSgxNikKLQotfQotCi1JTlQgcnQyOHh4X2lvY3RsKAotCUlOCVBORVRfREVWCW5ldF9kZXYsCi0JSU4JT1VUCXN0cnVjdCBpZnJlcQkqcnEsCi0JSU4JSU5UCQkJCQljbWQpCi17Ci0JUlRNUF9BREFQVEVSCSpwQWQgPSBOVUxMOwotCUlOVAkJCQlyZXQgPSAwOwotCi0JcEFkID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYobmV0X2Rldik7Ci0JaWYgKHBBZCA9PSBOVUxMKQotCXsKLQkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKLQkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCi0JCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJcmV0ID0gcnQyOHh4X3N0YV9pb2N0bChuZXRfZGV2LCBycSwgY21kKTsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlyZXR1cm4gcmV0OwotfQotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgotICAgICAgICByZXR1cm4gZXRoZXJuZXQgc3RhdGlzdGljcyBjb3VudGVyCi0KLSAgICBBcmd1bWVudHM6Ci0gICAgICAgIG5ldF9kZXYgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG5ldF9kZXZpY2UKLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgbmV0X2RldmljZV9zdGF0cyoKLQotICAgIE5vdGU6Ci0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKlJUMjh4eF9nZXRfZXRoZXJfc3RhdHMoCi0gICAgSU4gIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQotewotICAgIFJUTVBfQURBUFRFUiAqcEFkID0gTlVMTDsKLQotCWlmIChuZXRfZGV2KQotCQlwQWQgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihuZXRfZGV2KTsKLQotCWlmIChwQWQpCi0JewotCi0JCXBBZC0+c3RhdHMucnhfcGFja2V0cyA9IHBBZC0+V2xhbkNvdW50ZXJzLlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydDsKLQkJcEFkLT5zdGF0cy50eF9wYWNrZXRzID0gcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OwotCi0JCXBBZC0+c3RhdHMucnhfYnl0ZXMgPSBwQWQtPlJhbGlua0NvdW50ZXJzLlJlY2VpdmVkQnl0ZUNvdW50OwotCQlwQWQtPnN0YXRzLnR4X2J5dGVzID0gcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudDsKLQotCQlwQWQtPnN0YXRzLnJ4X2Vycm9ycyA9IHBBZC0+Q291bnRlcnM4MDIzLlJ4RXJyb3JzOwotCQlwQWQtPnN0YXRzLnR4X2Vycm9ycyA9IHBBZC0+Q291bnRlcnM4MDIzLlR4RXJyb3JzOwotCi0JCXBBZC0+c3RhdHMucnhfZHJvcHBlZCA9IDA7Ci0JCXBBZC0+c3RhdHMudHhfZHJvcHBlZCA9IDA7Ci0KLQkgICAgcEFkLT5zdGF0cy5tdWx0aWNhc3QgPSBwQWQtPldsYW5Db3VudGVycy5NdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQuUXVhZFBhcnQ7ICAgLy8gbXVsdGljYXN0IHBhY2tldHMgcmVjZWl2ZWQKLQkgICAgcEFkLT5zdGF0cy5jb2xsaXNpb25zID0gcEFkLT5Db3VudGVyczgwMjMuT25lQ29sbGlzaW9uICsgcEFkLT5Db3VudGVyczgwMjMuTW9yZUNvbGxpc2lvbnM7ICAvLyBDb2xsaXNpb24gcGFja2V0cwotCi0JICAgIHBBZC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycyA9IDA7Ci0JICAgIHBBZC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMgPSBwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyOyAgICAgICAgICAgICAgICAgICAvLyByZWNlaXZlciByaW5nIGJ1ZmYgb3ZlcmZsb3cKLQkgICAgcEFkLT5zdGF0cy5yeF9jcmNfZXJyb3JzID0gMDsvL3BBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQ7ICAgICAvLyByZWN2ZWQgcGt0IHdpdGggY3JjIGVycm9yCi0JICAgIHBBZC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzID0gcEFkLT5Db3VudGVyczgwMjMuUmN2QWxpZ25tZW50RXJyb3JzOyAgICAgICAgICAvLyByZWN2J2QgZnJhbWUgYWxpZ25tZW50IGVycm9yCi0JICAgIHBBZC0+c3RhdHMucnhfZmlmb19lcnJvcnMgPSBwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyOyAgICAgICAgICAgICAgICAgICAvLyByZWN2J3IgZmlmbyBvdmVycnVuCi0JICAgIHBBZC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNlaXZlciBtaXNzZWQgcGFja2V0Ci0KLQkgICAgLy8gZGV0YWlsZWQgdHhfZXJyb3JzCi0JICAgIHBBZC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMgPSAwOwotCSAgICBwQWQtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzID0gMDsKLQkgICAgcEFkLT5zdGF0cy50eF9maWZvX2Vycm9ycyA9IDA7Ci0JICAgIHBBZC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycyA9IDA7Ci0JICAgIHBBZC0+c3RhdHMudHhfd2luZG93X2Vycm9ycyA9IDA7Ci0KLQkgICAgLy8gZm9yIGNzbGlwIGV0YwotCSAgICBwQWQtPnN0YXRzLnJ4X2NvbXByZXNzZWQgPSAwOwotCSAgICBwQWQtPnN0YXRzLnR4X2NvbXByZXNzZWQgPSAwOwotCi0JCXJldHVybiAmcEFkLT5zdGF0czsKLQl9Ci0JZWxzZQotCXJldHVybiBOVUxMOwotfQotCi0KLUJPT0xFQU4gUnRtcFBoeU5ldERldkV4aXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gUE5FVF9ERVYgbmV0X2RldikKLXsKLQotCi0KLSNpZmRlZiBJTkZfQU1BWk9OX1BQQQotCWlmIChwcGFfaG9va19kaXJlY3RwYXRoX3JlZ2lzdGVyX2Rldl9mbiAmJiBwQWQtPlBQQUVuYWJsZT09VFJVRSkKLQl7Ci0JCVVJTlQgc3RhdHVzOwotCQlzdGF0dXM9cHBhX2hvb2tfZGlyZWN0cGF0aF9yZWdpc3Rlcl9kZXZfZm4oJnBBZC0+Z19pZl9pZCwgcEFkLT5uZXRfZGV2LCBOVUxMLCBQUEFfRl9ESVJFQ1RQQVRIX0RFUkVHSVNURVIpOwotCQlwcmludGsoInVucmVnaXN0ZXIgUFBBOmdfaWZfaWQ9JWQgc3RhdHVzPSVkXG4iLHBBZC0+Z19pZl9pZCxzdGF0dXMpOwotCX0KLQlrZnJlZShwQWQtPnBEaXJlY3RwYXRoQ2IpOwotI2VuZGlmIC8vIElORl9BTUFaT05fUFBBIC8vCi0KLQkvLyBVbnJlZ2lzdGVyIG5ldHdvcmsgZGV2aWNlCi0JaWYgKG5ldF9kZXYgIT0gTlVMTCkKLQl7Ci0JCXByaW50aygiUnRtcE9TTmV0RGV2RGV0YWNoKCk6IFJ0bXBPU05ldERldmljZURldGFjaCgpLCBkZXYtPm5hbWU9JXMhXG4iLCBuZXRfZGV2LT5uYW1lKTsKLQkJUnRtcE9TTmV0RGV2RGV0YWNoKG5ldF9kZXYpOwotCX0KLQotCXJldHVybiBUUlVFOwotCi19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFkYXB0ZXIgY29udHJvbCBibG9jay4KLQotQXJndW1lbnRzOgotICAgIHBBZAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi1SZXR1cm4gVmFsdWU6Ci0JTkRJU19TVEFUVVNfU1VDQ0VTUwotCU5ESVNfU1RBVFVTX0ZBSUxVUkUKLQlORElTX1NUQVRVU19SRVNPVVJDRVMKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5ESVNfU1RBVFVTIEFkYXB0ZXJCbG9ja0FsbG9jYXRlTWVtb3J5KAotCUlOIFBWT0lECWhhbmRsZSwKLQlPVVQJUFZPSUQJKnBwQWQpCi17Ci0KLQkqcHBBZCA9IChQVk9JRCl2bWFsbG9jKHNpemVvZihSVE1QX0FEQVBURVIpKTsgLy9wY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBzaXplb2YoUlRNUF9BREFQVEVSKSwgcGh5X2FkZHIpOwotCi0JaWYgKCpwcEFkKQotCXsKLQkJTmRpc1plcm9NZW1vcnkoKnBwQWQsIHNpemVvZihSVE1QX0FEQVBURVIpKTsKLQkJKChQUlRNUF9BREFQVEVSKSpwcEFkKS0+T1NfQ29va2llID0gaGFuZGxlOwotCQlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCX0gZWxzZSB7Ci0JCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydF9wY2lfcmJ1cy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydF9wY2lfcmJ1cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTkxMzE5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRfcGNpX3JidXMuYworKysgL2Rldi9udWxsCkBAIC0xLDk4OSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIHJ0X3BjaV9yYnVzLmMKLQotICAgIEFic3RyYWN0OgotICAgIENyZWF0ZSBhbmQgcmVnaXN0ZXIgbmV0d29yayBpbnRlcmZhY2UuCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSNpbmNsdWRlICJydF9jb25maWcuaCIKLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLQotCi1JUlFfSEFORExFX1RZUEUKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwxOSkpCi1ydDI4NjBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSk7Ci0jZWxzZQotcnQyODYwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLSNlbmRpZgotCi0KLXN0YXRpYyB2b2lkIHJ4X2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgbWdtdF9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgdm9pZCBhYzBfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgYWMxX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyB2b2lkIGFjMl9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgdm9pZCBhYzNfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotLypzdGF0aWMgdm9pZCBoY2NhX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsqLwotc3RhdGljIHZvaWQgZmlmb19zdGF0aXN0aWNfZnVsbF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBTeW1ib2wgJiBNYWNybyBEZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIFJUMjg2MF9JTlRfUlhfRExZCQkJCSgxPDwwKQkJLy8gYml0IDAKLSNkZWZpbmUgUlQyODYwX0lOVF9UWF9ETFkJCQkJKDE8PDEpCQkvLyBiaXQgMQotI2RlZmluZSBSVDI4NjBfSU5UX1JYX0RPTkUJCQkJKDE8PDIpCQkvLyBiaXQgMgotI2RlZmluZSBSVDI4NjBfSU5UX0FDMF9ETUFfRE9ORQkJCSgxPDwzKQkJLy8gYml0IDMKLSNkZWZpbmUgUlQyODYwX0lOVF9BQzFfRE1BX0RPTkUJCQkoMTw8NCkJCS8vIGJpdCA0Ci0jZGVmaW5lIFJUMjg2MF9JTlRfQUMyX0RNQV9ET05FCQkJKDE8PDUpCQkvLyBiaXQgNQotI2RlZmluZSBSVDI4NjBfSU5UX0FDM19ETUFfRE9ORQkJCSgxPDw2KQkJLy8gYml0IDYKLSNkZWZpbmUgUlQyODYwX0lOVF9IQ0NBX0RNQV9ET05FCQkoMTw8NykJCS8vIGJpdCA3Ci0jZGVmaW5lIFJUMjg2MF9JTlRfTUdNVF9ET05FCQkJKDE8PDgpCQkvLyBiaXQgOAotI2lmZGVmIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQKLSNkZWZpbmUgUlQyODYwX0lOVF9UT05FX1JBREFSCQkJKDE8PDIwKQkJLy8gYml0IDIwCi0jZW5kaWYgLy8gVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVCAvLwotCi0jZGVmaW5lIElOVF9SWAkJCVJUMjg2MF9JTlRfUlhfRE9ORQotCi0jZGVmaW5lIElOVF9BQzBfRExZCQkoUlQyODYwX0lOVF9BQzBfRE1BX0RPTkUpIC8vfCBSVDI4NjBfSU5UX1RYX0RMWSkKLSNkZWZpbmUgSU5UX0FDMV9ETFkJCShSVDI4NjBfSU5UX0FDMV9ETUFfRE9ORSkgLy98IFJUMjg2MF9JTlRfVFhfRExZKQotI2RlZmluZSBJTlRfQUMyX0RMWQkJKFJUMjg2MF9JTlRfQUMyX0RNQV9ET05FKSAvL3wgUlQyODYwX0lOVF9UWF9ETFkpCi0jZGVmaW5lIElOVF9BQzNfRExZCQkoUlQyODYwX0lOVF9BQzNfRE1BX0RPTkUpIC8vfCBSVDI4NjBfSU5UX1RYX0RMWSkKLSNkZWZpbmUgSU5UX0hDQ0FfRExZCShSVDI4NjBfSU5UX0hDQ0FfRE1BX0RPTkUpIC8vfCBSVDI4NjBfSU5UX1RYX0RMWSkKLSNkZWZpbmUgSU5UX01HTVRfRExZCVJUMjg2MF9JTlRfTUdNVF9ET05FCi0jaWZkZWYgVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVAotI2RlZmluZSBJTlRfVE9ORV9SQURBUgkoUlQyODYwX0lOVF9UT05FX1JBREFSKQotI2VuZGlmIC8vIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQgLy8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKglJbnRlcmZhY2UtZGVwZW5kZWQgbWVtb3J5IGFsbG9jYXRpb24vRnJlZSByZWxhdGVkIHByb2NlZHVyZXMuCi0gICoJCU1haW5seSBmb3IgSGFyZHdhcmUgVHhEZXNjL1J4RGVzYy9NZ210RGVzYywgRE1BIE1lbW9yeSBmb3IgVHhEYXRhL1J4RGF0YSwgZXRjLiwKLSAgKgotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vIEZ1bmN0aW9uIGZvciBUeERlc2MgTWVtb3J5IGFsbG9jYXRpb24uCi12b2lkIFJUTVBfQWxsb2NhdGVUeERlc2NNZW1vcnkoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUlOVAlJbmRleCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JQk9PTEVBTglDYWNoZWQsCi0JT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKLQlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpCi17Ci0JUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7Ci0KLQkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpcGNpX2FsbG9jX2NvbnNpc3RlbnQocE9iai0+cGNpX2RldixzaXplb2YoY2hhcikqTGVuZ3RoLCBQaHlzaWNhbEFkZHJlc3MpOwotCi19Ci0KLQotLy8gRnVuY3Rpb24gZm9yIE1nbXREZXNjIE1lbW9yeSBhbGxvY2F0aW9uLgotdm9pZCBSVE1QX0FsbG9jYXRlTWdtdERlc2NNZW1vcnkoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCi0JT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQotewotCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOwotCi0JKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKXBjaV9hbGxvY19jb25zaXN0ZW50KHBPYmotPnBjaV9kZXYsc2l6ZW9mKGNoYXIpKkxlbmd0aCwgUGh5c2ljYWxBZGRyZXNzKTsKLQotfQotCi0KLS8vIEZ1bmN0aW9uIGZvciBSeERlc2MgTWVtb3J5IGFsbG9jYXRpb24uCi12b2lkIFJUTVBfQWxsb2NhdGVSeERlc2NNZW1vcnkoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCi0JT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQotewotCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOwotCi0JKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKXBjaV9hbGxvY19jb25zaXN0ZW50KHBPYmotPnBjaV9kZXYsc2l6ZW9mKGNoYXIpKkxlbmd0aCwgUGh5c2ljYWxBZGRyZXNzKTsKLQotfQotCi0KLS8vIEZ1bmN0aW9uIGZvciBmcmVlIGFsbG9jYXRlZCBEZXNjIE1lbW9yeS4KLXZvaWQgUlRNUF9GcmVlRGVzY01lbW9yeSgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JUFZPSUQJVmlydHVhbEFkZHJlc3MsCi0JSU4JTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcykKLXsKLQlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKLQotCXBjaV9mcmVlX2NvbnNpc3RlbnQocE9iai0+cGNpX2RldiwgTGVuZ3RoLCBWaXJ0dWFsQWRkcmVzcywgUGh5c2ljYWxBZGRyZXNzKTsKLX0KLQotCi0vLyBGdW5jdGlvbiBmb3IgVHhEYXRhIERNQSBNZW1vcnkgYWxsb2NhdGlvbi4KLXZvaWQgUlRNUF9BbGxvY2F0ZUZpcnN0VHhCdWZmZXIoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUlOVAlJbmRleCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JQk9PTEVBTglDYWNoZWQsCi0JT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKLQlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpCi17Ci0JUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7Ci0KLQkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpcGNpX2FsbG9jX2NvbnNpc3RlbnQocE9iai0+cGNpX2RldixzaXplb2YoY2hhcikqTGVuZ3RoLCBQaHlzaWNhbEFkZHJlc3MpOwotfQotCi0KLXZvaWQgUlRNUF9GcmVlRmlyc3RUeEJ1ZmZlcigKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JQk9PTEVBTglDYWNoZWQsCi0JSU4JUFZPSUQJVmlydHVhbEFkZHJlc3MsCi0JSU4JTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcykKLXsKLQlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKLQotCXBjaV9mcmVlX2NvbnNpc3RlbnQocE9iai0+cGNpX2RldiwgTGVuZ3RoLCBWaXJ0dWFsQWRkcmVzcywgUGh5c2ljYWxBZGRyZXNzKTsKLX0KLQotCi0vKgotICogRlVOQ1RJT046IEFsbG9jYXRlIGEgY29tbW9uIGJ1ZmZlciBmb3IgRE1BCi0gKiBBUkdVTUVOVFM6Ci0gKiAgICAgQWRhcHRlckhhbmRsZTogIEFkYXB0ZXJIYW5kbGUKLSAqICAgICBMZW5ndGg6ICBOdW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUKLSAqICAgICBDYWNoZWQ6ICBXaGV0aGVyIG9yIG5vdCB0aGUgbWVtb3J5IGNhbiBiZSBjYWNoZWQKLSAqICAgICBWaXJ0dWFsQWRkcmVzczogIFBvaW50ZXIgdG8gbWVtb3J5IGlzIHJldHVybmVkIGhlcmUKLSAqICAgICBQaHlzaWNhbEFkZHJlc3M6ICBQaHlzaWNhbCBhZGRyZXNzIGNvcnJlc3BvbmRpbmcgdG8gdmlydHVhbCBhZGRyZXNzCi0gKi8KLXZvaWQgUlRNUF9BbGxvY2F0ZVNoYXJlZE1lbW9yeSgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JQk9PTEVBTglDYWNoZWQsCi0JT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKLQlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpCi17Ci0JUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7Ci0KLQkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpcGNpX2FsbG9jX2NvbnNpc3RlbnQocE9iai0+cGNpX2RldixzaXplb2YoY2hhcikqTGVuZ3RoLCBQaHlzaWNhbEFkZHJlc3MpOwotfQotCi0KLS8qCi0gKiBGVU5DVElPTjogQWxsb2NhdGUgYSBwYWNrZXQgYnVmZmVyIGZvciBETUEKLSAqIEFSR1VNRU5UUzoKLSAqICAgICBBZGFwdGVySGFuZGxlOiAgQWRhcHRlckhhbmRsZQotICogICAgIExlbmd0aDogIE51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZQotICogICAgIENhY2hlZDogIFdoZXRoZXIgb3Igbm90IHRoZSBtZW1vcnkgY2FuIGJlIGNhY2hlZAotICogICAgIFZpcnR1YWxBZGRyZXNzOiAgUG9pbnRlciB0byBtZW1vcnkgaXMgcmV0dXJuZWQgaGVyZQotICogICAgIFBoeXNpY2FsQWRkcmVzczogIFBoeXNpY2FsIGFkZHJlc3MgY29ycmVzcG9uZGluZyB0byB2aXJ0dWFsIGFkZHJlc3MKLSAqIE5vdGVzOgotICogICAgIENhY2hlZCBpcyBpZ25vcmVkOiBhbHdheXMgY2FjaGVkIG1lbW9yeQotICovCi1QTkRJU19QQUNLRVQgUlRNUF9BbGxvY2F0ZVJ4UGFja2V0QnVmZmVyKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAotCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcykKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OwotCi0JcGt0ID0gZGV2X2FsbG9jX3NrYihMZW5ndGgpOwotCi0JaWYgKHBrdCA9PSBOVUxMKSB7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNhbid0IGFsbG9jYXRlIHJ4ICVsZCBzaXplIHBhY2tldFxuIixMZW5ndGgpKTsKLQl9Ci0KLQlpZiAocGt0KSB7Ci0JCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocGt0KSwgUEtUU1JDX05ESVMpOwotCQkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpIHBrdC0+ZGF0YTsKLS8vI2lmZGVmIENPTkZJR181VlRfRU5IQU5DRQotLy8JCSpQaHlzaWNhbEFkZHJlc3MgPSBQQ0lfTUFQX1NJTkdMRShwQWQsICpWaXJ0dWFsQWRkcmVzcywgMTYwMCwgUENJX0RNQV9GUk9NREVWSUNFKTsKLS8vI2Vsc2UKLQkJKlBoeXNpY2FsQWRkcmVzcyA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgKlZpcnR1YWxBZGRyZXNzLCBMZW5ndGgsICAtMSwgUENJX0RNQV9GUk9NREVWSUNFKTsKLS8vI2VuZGlmCi0JfSBlbHNlIHsKLQkJKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKSBOVUxMOwotCQkqUGh5c2ljYWxBZGRyZXNzID0gKE5ESVNfUEhZU0lDQUxfQUREUkVTUykgTlVMTDsKLQl9Ci0KLQlyZXR1cm4gKFBORElTX1BBQ0tFVCkgcGt0OwotfQotCi0KLVZPSUQgSW52YWxpZF9SZW1haW5pbmdfUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCSBVTE9ORyBWaXJ0dWFsQWRkcmVzcykKLXsKLQlORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzOwotCi0JUGh5c2ljYWxBZGRyZXNzID0gUENJX01BUF9TSU5HTEUocEFkLCAodm9pZCAqKShWaXJ0dWFsQWRkcmVzcysxNjAwKSwgUlhfQlVGRkVSX05PUk1TSVpFLTE2MDAsIC0xLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotfQotCi0KLWludCBSdG1wT1NJUlFSZXF1ZXN0KElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQotewotCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpKFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKG5ldF9kZXYpKTsKLQlpbnQgcmV0dmFsID0gMDsKLQotCUFTU0VSVChwQWQpOwotCi0JaWYgKHBBZC0+aW5mVHlwZSAhPSBSVE1QX0RFVl9JTkZfUkJVUykKLQl7Ci0JCVBPU19DT09LSUUgX3BPYmogPSAoUE9TX0NPT0tJRSkocEFkLT5PU19Db29raWUpOwotCQlSVE1QX01TSV9FTkFCTEUocEFkKTsKLQkJcmV0dmFsID0gcmVxdWVzdF9pcnEoX3BPYmotPnBjaV9kZXYtPmlycSwgIHJ0Mjg2MF9pbnRlcnJ1cHQsIFNBX1NISVJRLCAobmV0X2RldiktPm5hbWUsIChuZXRfZGV2KSk7Ci0JCWlmIChyZXR2YWwgIT0gMCkKLQkJCXByaW50aygiUlQyODYwOiByZXF1ZXN0X2lycSAgRVJST1IoJWQpXG4iLCByZXR2YWwpOwotCX0KLQllbHNlCi0JewotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjIpCi0JCWlmICgocmV0dmFsID0gcmVxdWVzdF9pcnEobmV0X2Rldi0+aXJxLCBydDI4NjBfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwgbmV0X2Rldi0+bmFtZSAsbmV0X2RldikpKQotI2Vsc2UKLQkJaWYgKChyZXR2YWwgPSByZXF1ZXN0X2lycShuZXRfZGV2LT5pcnEscnQyODYwX2ludGVycnVwdCwgU0FfSU5URVJSVVBULCBuZXRfZGV2LT5uYW1lICxuZXRfZGV2KSkpCi0jZW5kaWYKLQkJewotCQkJcHJpbnRrKCJSVDI4NjA6IHJlcXVlc3RfaXJxICBFUlJPUiglZClcbiIsIHJldHZhbCk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmV0dmFsOwotCi19Ci0KLQotaW50IFJ0bXBPU0lSUVJlbGVhc2UoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCi17Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUikoUlRNUF9PU19ORVRERVZfR0VUX1BSSVYobmV0X2RldikpOwotCi0JQVNTRVJUKHBBZCk7Ci0JaWYgKHBBZC0+aW5mVHlwZSAhPSBSVE1QX0RFVl9JTkZfUkJVUykKLQl7Ci0JCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKShwQWQtPk9TX0Nvb2tpZSk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCQlzeW5jaHJvbml6ZV9pcnEocE9iai0+cGNpX2Rldi0+aXJxKTsKLSNlbmRpZgotCQlmcmVlX2lycShwT2JqLT5wY2lfZGV2LT5pcnEsIChuZXRfZGV2KSk7Ci0JCVJUTVBfTVNJX0RJU0FCTEUocEFkKTsKLQl9Ci0JZWxzZQotCXsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0JCXN5bmNocm9uaXplX2lycShuZXRfZGV2LT5pcnEpOwotI2VuZGlmCi0JCWZyZWVfaXJxKG5ldF9kZXYtPmlycSwgKG5ldF9kZXYpKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1ORElTX1NUQVRVUyBSdG1wTmV0VGFza0luaXQoSU4gUlRNUF9BREFQVEVSICpwQWQpCi17Ci0JUE9TX0NPT0tJRSBwT2JqOwotCi0JcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCXRhc2tsZXRfaW5pdCgmcE9iai0+cnhfZG9uZV90YXNrLCByeF9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7Ci0JdGFza2xldF9pbml0KCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2ssIG1nbXRfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrLCBhYzBfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrLCBhYzFfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrLCBhYzJfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrLCBhYzNfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQkvKnRhc2tsZXRfaW5pdCgmcE9iai0+aGNjYV9kbWFfZG9uZV90YXNrLCBoY2NhX2RtYV9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7Ki8KLQl0YXNrbGV0X2luaXQoJnBPYmotPnRidHRfdGFzaywgdGJ0dF90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOwotCXRhc2tsZXRfaW5pdCgmcE9iai0+Zmlmb19zdGF0aXN0aWNfZnVsbF90YXNrLCBmaWZvX3N0YXRpc3RpY19mdWxsX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi12b2lkIFJ0bXBOZXRUYXNrRXhpdChJTiBSVE1QX0FEQVBURVIgKnBBZCkKLXsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0KLQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0JdGFza2xldF9raWxsKCZwT2JqLT5yeF9kb25lX3Rhc2spOwotCXRhc2tsZXRfa2lsbCgmcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrKTsKLQl0YXNrbGV0X2tpbGwoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrKTsKLQl0YXNrbGV0X2tpbGwoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrKTsKLQl0YXNrbGV0X2tpbGwoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrKTsKLQl0YXNrbGV0X2tpbGwoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrKTsKLQkvKnRhc2tsZXRfa2lsbCgmcE9iai0+aGNjYV9kbWFfZG9uZV90YXNrKTsqLwotCXRhc2tsZXRfa2lsbCgmcE9iai0+dGJ0dF90YXNrKTsKLQl0YXNrbGV0X2tpbGwoJnBPYmotPmZpZm9fc3RhdGlzdGljX2Z1bGxfdGFzayk7Ci19Ci0KLQotTkRJU19TVEFUVVMgUnRtcE1nbXRUYXNrSW5pdChJTiBSVE1QX0FEQVBURVIgKnBBZCkKLXsKLQotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBDbG9zZSBrZXJuZWwgdGhyZWFkcy4KLQotQXJndW1lbnRzOgotCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgotCi1SZXR1cm4gVmFsdWU6Ci0gICAgTk9ORQotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSdG1wTWdtdFRhc2tFeGl0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKQotewotCi0KLQlyZXR1cm47Ci19Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIHJ0Mjg2MF9pbnRfZW5hYmxlKFBSVE1QX0FEQVBURVIgcEFkLCB1bnNpZ25lZCBpbnQgbW9kZSkKLXsKLQl1MzIgcmVnVmFsdWU7Ci0KLQlwQWQtPmludF9kaXNhYmxlX21hc2sgJj0gfihtb2RlKTsKLQlyZWdWYWx1ZSA9IHBBZC0+aW50X2VuYWJsZV9yZWcgJiB+KHBBZC0+aW50X2Rpc2FibGVfbWFzayk7Ci0JLy9pZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0JewotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfTUFTS19DU1IsIHJlZ1ZhbHVlKTsgICAgIC8vIDE6ZW5hYmxlCi0JfQotCS8vZWxzZQotCS8vCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImZPUF9TVEFUVVNfRE9aRSAhXG4iKSk7Ci0KLQlpZiAocmVnVmFsdWUgIT0gMCkKLQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSk7Ci19Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIHJ0Mjg2MF9pbnRfZGlzYWJsZShQUlRNUF9BREFQVEVSIHBBZCwgdW5zaWduZWQgaW50IG1vZGUpCi17Ci0JdTMyIHJlZ1ZhbHVlOwotCi0JcEFkLT5pbnRfZGlzYWJsZV9tYXNrIHw9IG1vZGU7Ci0JcmVnVmFsdWUgPQlwQWQtPmludF9lbmFibGVfcmVnICYgfihwQWQtPmludF9kaXNhYmxlX21hc2spOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9NQVNLX0NTUiwgcmVnVmFsdWUpOyAgICAgLy8gMDogZGlzYWJsZQotCi0JaWYgKHJlZ1ZhbHVlID09IDApCi0JewotCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpOwotCX0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKgl0YXNrbGV0IHJlbGF0ZWQgcHJvY2VkdXJlcy4KLSAgKgotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIG1nbXRfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOwotICAgIElOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0KLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCQlyZXR1cm47Ci0KLSAgICBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0vLwlwcmludGsoIm1nbXRfZG1hX2RvbmVfcHJvY2Vzc1xuIik7Ci0JSW50U291cmNlLndvcmQgPSAwOwotCUludFNvdXJjZS5maWVsZC5NZ210RG1hRG9uZSA9IDE7Ci0JcEFkLT5pbnRfcGVuZGluZyAmPSB+SU5UX01HTVRfRExZOwotCi0JUlRNUEhhbmRsZU1nbXRSaW5nRG1hRG9uZUludGVycnVwdChwQWQpOwotCi0JLy8gaWYgeW91IHVzZSBSVE1QX1NFTV9MT0NLLCBzb21ldGltZXMga2VybmVsIHdpbGwgaGFuZyB1cCwgbm8gYW55Ci0JLy8gYnVnIHJlcG9ydCBvdXRwdXQKLQlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JLyoKLQkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCi0JICovCi0JaWYgKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfTUdNVF9ETFkpCi0JewotCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2spOwotCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KLQlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9NR01UX0RMWSk7Ci0JUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci19Ci0KLQotc3RhdGljIHZvaWQgcnhfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7Ci0JQk9PTEVBTgliUmVzY2hlZHVsZSA9IDA7Ci0JUE9TX0NPT0tJRSBwT2JqOwotCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQkJcmV0dXJuOwotCi0jaWZkZWYgVUFQU0RfQVBfU1VQUE9SVAotCVVBUFNEX1RJTUlOR19SRUNPUkQocEFkLCBVQVBTRF9USU1JTkdfUkVDT1JEX1RBU0tMRVQpOwotI2VuZGlmIC8vIFVBUFNEX0FQX1NVUFBPUlQgLy8KLQotICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQlwQWQtPmludF9wZW5kaW5nICY9IH4oSU5UX1JYKTsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQliUmVzY2hlZHVsZSA9IFNUQVJ4RG9uZUludGVycnVwdEhhbmRsZShwQWQsIDApOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgVUFQU0RfQVBfU1VQUE9SVAotCVVBUFNEX1RJTUlOR19SRUNPUkRfU1RPUCgpOwotI2VuZGlmIC8vIFVBUFNEX0FQX1NVUFBPUlQgLy8KLQotCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkvKgotCSAqIGRvdWJsZSBjaGVjayB0byBhdm9pZCByb3R0aW5nIHBhY2tldAotCSAqLwotCWlmIChwQWQtPmludF9wZW5kaW5nICYgSU5UX1JYIHx8IGJSZXNjaGVkdWxlKQotCXsKLQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+cnhfZG9uZV90YXNrKTsKLQkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBlbmFibGUgUnhJTlQgYWdhaW4gKi8KLQlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9SWCk7Ci0JUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0KLX0KLQotCi12b2lkIGZpZm9fc3RhdGlzdGljX2Z1bGxfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOwotCVBPU19DT09LSUUgcE9iajsKLQotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JCXJldHVybjsKLQotICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQlwQWQtPmludF9wZW5kaW5nICY9IH4oRmlmb1N0YUZ1bGxJbnQpOwotCU5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycyhwQWQpOwotCi0JUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCS8qCi0JICogZG91YmxlIGNoZWNrIHRvIGF2b2lkIHJvdHRpbmcgcGFja2V0Ci0JICovCi0JaWYgKHBBZC0+aW50X3BlbmRpbmcgJiBGaWZvU3RhRnVsbEludCkKLQl7Ci0JCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmZpZm9fc3RhdGlzdGljX2Z1bGxfdGFzayk7Ci0JCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogZW5hYmxlIFJ4SU5UIGFnYWluICovCi0KLQlydDI4NjBfaW50X2VuYWJsZShwQWQsIEZpZm9TdGFGdWxsSW50KTsKLQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQotfQotCi0KLQotCi1zdGF0aWMgdm9pZCBhYzNfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOwotICAgIElOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0JQk9PTEVBTiBiUmVzY2hlZHVsZSA9IDA7Ci0KLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCQlyZXR1cm47Ci0KLSAgICBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0vLwlwcmludGsoImFjMF9kbWFfZG9uZV9wcm9jZXNzXG4iKTsKLQlJbnRTb3VyY2Uud29yZCA9IDA7Ci0JSW50U291cmNlLmZpZWxkLkFjM0RtYURvbmUgPSAxOwotCXBBZC0+aW50X3BlbmRpbmcgJj0gfklOVF9BQzNfRExZOwotCi0JYlJlc2NoZWR1bGUgPSBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7Ci0KLQlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JLyoKLQkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCi0JICovCi0JaWYgKChwQWQtPmludF9wZW5kaW5nICYgSU5UX0FDM19ETFkpIHx8IGJSZXNjaGVkdWxlKQotCXsKLQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2spOwotCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KLQlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9BQzNfRExZKTsKLQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBhYzJfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOwotICAgIElOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0JQk9PTEVBTiBiUmVzY2hlZHVsZSA9IDA7Ci0KLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCQlyZXR1cm47Ci0KLSAgICBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0JSW50U291cmNlLndvcmQgPSAwOwotCUludFNvdXJjZS5maWVsZC5BYzJEbWFEb25lID0gMTsKLQlwQWQtPmludF9wZW5kaW5nICY9IH5JTlRfQUMyX0RMWTsKLQotCWJSZXNjaGVkdWxlID0gUlRNUEhhbmRsZVR4UmluZ0RtYURvbmVJbnRlcnJ1cHQocEFkLCBJbnRTb3VyY2UpOwotCi0JUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCi0JLyoKLQkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCi0JICovCi0JaWYgKChwQWQtPmludF9wZW5kaW5nICYgSU5UX0FDMl9ETFkpIHx8IGJSZXNjaGVkdWxlKQotCXsKLQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2spOwotCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KLQlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9BQzJfRExZKTsKLQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBhYzFfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOwotICAgIElOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0JQk9PTEVBTiBiUmVzY2hlZHVsZSA9IDA7Ci0KLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCQlyZXR1cm47Ci0KLSAgICBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0vLwlwcmludGsoImFjMF9kbWFfZG9uZV9wcm9jZXNzXG4iKTsKLQlJbnRTb3VyY2Uud29yZCA9IDA7Ci0JSW50U291cmNlLmZpZWxkLkFjMURtYURvbmUgPSAxOwotCXBBZC0+aW50X3BlbmRpbmcgJj0gfklOVF9BQzFfRExZOwotCi0JYlJlc2NoZWR1bGUgPSBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7Ci0KLQlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JLyoKLQkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCi0JICovCi0JaWYgKChwQWQtPmludF9wZW5kaW5nICYgSU5UX0FDMV9ETFkpIHx8IGJSZXNjaGVkdWxlKQotCXsKLQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2spOwotCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KLQlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9BQzFfRExZKTsKLQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBhYzBfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOwotCUlOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0JQk9PTEVBTiBiUmVzY2hlZHVsZSA9IDA7Ci0KLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCQlyZXR1cm47Ci0KLQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0vLwlwcmludGsoImFjMF9kbWFfZG9uZV9wcm9jZXNzXG4iKTsKLQlJbnRTb3VyY2Uud29yZCA9IDA7Ci0JSW50U291cmNlLmZpZWxkLkFjMERtYURvbmUgPSAxOwotCXBBZC0+aW50X3BlbmRpbmcgJj0gfklOVF9BQzBfRExZOwotCi0vLwlSVE1QSGFuZGxlTWdtdFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCk7Ci0JYlJlc2NoZWR1bGUgPSBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7Ci0KLQlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JLyoKLQkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCi0JICovCi0JaWYgKChwQWQtPmludF9wZW5kaW5nICYgSU5UX0FDMF9ETFkpIHx8IGJSZXNjaGVkdWxlKQotCXsKLQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMwX2RtYV9kb25lX3Rhc2spOwotCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KLQlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9BQzBfRExZKTsKLQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLX0KLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICoJaW50ZXJydXB0IGhhbmRsZXIgcmVsYXRlZCBwcm9jZWR1cmVzLgotICAqCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IHByaW50X2ludF9jb3VudDsKLQotSVJRX0hBTkRMRV9UWVBFCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTkpKQotcnQyODYwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCi0jZWxzZQotcnQyODYwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotI2VuZGlmCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2luc3RhbmNlOwotCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKG5ldF9kZXYpOwotCUlOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0KLQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0KLQkvKiBOb3RlIDAzMzEyMDA4OiB3ZSBjYW4gbm90IHJldHVybiBoZXJlIGJlZm9yZQotCQlSVE1QX0lPX1JFQUQzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCAmSW50U291cmNlLndvcmQpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfU09VUkNFX0NTUiwgSW50U291cmNlLndvcmQpOwotCQlPciBrZXJuZWwgd2lsbCBwYW5pYyBhZnRlciBpZmNvbmZpZyByYTAgZG93biBzb21ldGltZXMgKi8KLQotCi0JLy8KLQkvLyBJbml0YWwgdGhlIEludGVycnVwdCBzb3VyY2UuCi0JLy8KLQlJbnRTb3VyY2Uud29yZCA9IDB4MDAwMDAwMDBMOwotLy8JTWN1SW50U291cmNlLndvcmQgPSAweDAwMDAwMDAwTDsKLQotCS8vCi0JLy8gR2V0IHRoZSBpbnRlcnJ1cHQgc291cmNlcyAmIHNhdmVkIHRvIGxvY2FsIHZhcmlhYmxlCi0JLy8KLQkvL1JUTVBfSU9fUkVBRDMyKHBBZCwgd2hlcmUsICZNY3VJbnRTb3VyY2Uud29yZCk7Ci0JLy9SVE1QX0lPX1dSSVRFMzIocEFkLCAsIE1jdUludFNvdXJjZS53b3JkKTsKLQotCS8vCi0JLy8gRmxhZyBmT1BfU1RBVFVTX0RPWkUgT24sIG1lYW5zIEFTSUMgcHV0IHRvIHNsZWVwLCBlbGFzZSBtZWFucyBBU0lDSyBXYWtlVXAKLQkvLyBBbmQgYXQgdGhlIHNhbWUgdGltZSwgY2xvY2sgbWF5YmUgdHVybmVkIG9mZiB0aGF0IHNheSB0aGVyZSBpcyBubyBETUEgc2VydmljZS4KLQkvLyB3aGVuIEFTSUMgZ2V0IHRvIHNsZWVwLgotCS8vIFRvIHByZXZlbnQgc3lzdGVtIGhhbmcgb24gcG93ZXIgc2F2aW5nLgotCS8vIFdlIG5lZWQgdG8gY2hlY2sgaXQgYmVmb3JlIGhhbmRsZSB0aGUgSU5UX1NPVVJDRV9DU1IsIEFTSUMgbXVzdCBiZSB3YWtlIHVwLgotCS8vCi0JLy8gUlQyNjYxID0+IHdoZW4gQVNJQyBpcyBzbGVlcGluZywgTUFDIHJlZ2lzdGVyIGNhbm5vdCBiZSByZWFkIGFuZCB3cml0dGVuLgotCS8vIFJUMjg2MCA9PiB3aGVuIEFTSUMgaXMgc2xlZXBpbmcsIE1BQyByZWdpc3RlciBjYW4gYmUgcmVhZCBhbmQgd3JpdHRlbi4KLS8vCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgSU5UX1NPVVJDRV9DU1IsICZJbnRTb3VyY2Uud29yZCk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCBJbnRTb3VyY2Uud29yZCk7IC8vIHdyaXRlIDEgdG8gY2xlYXIKLQl9Ci0vLwllbHNlCi0vLwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPj4+Zk9QX1NUQVRVU19ET1pFPDw8XG4iKSk7Ci0KLS8vCVJUTVBfSU9fUkVBRDMyKHBBZCwgSU5UX1NPVVJDRV9DU1IsICZJc3JBZnRlckNsZWFyKTsKLS8vCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUNVX0lOVF9TT1VSQ0VfQ1NSLCAmTWN1SXNyQWZ0ZXJDbGVhcik7Ci0vLwlEQkdQUklOVChSVF9ERUJVR19JTkZPLCAoIj09PT0+IFJUTVBIYW5kbGVJbnRlcnJ1cHQoSVNSPSUwOHgsTWN1IElTUj0lMDh4LCBBZnRlciBjbGVhciBJU1I9JTA4eCwgTUNVIElTUj0lMDh4KVxuIiwKLS8vCQkJSW50U291cmNlLndvcmQsIE1jdUludFNvdXJjZS53b3JkLCBJc3JBZnRlckNsZWFyLCBNY3VJc3JBZnRlckNsZWFyKSk7Ci0KLQkvLyBEbyBub3RoaW5nIGlmIFJlc2V0IGluIHByb2dyZXNzCi0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpKQotCXsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0gICAgICAgIHJldHVybiAgSVJRX0hBTkRMRUQ7Ci0jZWxzZQotICAgICAgICByZXR1cm47Ci0jZW5kaWYKLQl9Ci0KLQkvLwotCS8vIEhhbmRsZSBpbnRlcnJ1cHQsIHdhbGsgdGhyb3VnaCBhbGwgYml0cwotCS8vIFNob3VsZCBzdGFydCBmcm9tIGhpZ2hlc3QgcHJpb3JpdHkgaW50ZXJydXB0Ci0JLy8gVGhlIHByaW9yaXR5IGNhbiBiZSBhZGp1c3QgYnkgYWx0ZXJpbmcgcHJvY2Vzc2luZyBpZiBzdGF0ZW1lbnQKLQkvLwotCi0jaWZkZWYgREJHCi0KLSNlbmRpZgotCi0KLQlwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKLQotCS8vIElmIHJlcXVpcmVkIHNwaW5sb2NrLCBlYWNoIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgaGFzIHRvIGFjcXVpcmUKLQkvLyBhbmQgcmVsZWFzZSBpdHNlbGYuCi0JLy8KLQotCS8vIERvIG5vdGhpbmcgaWYgTklDIGRvZXNuJ3QgZXhpc3QKLQlpZiAoSW50U291cmNlLndvcmQgPT0gMHhmZmZmZmZmZikKLQl7Ci0JCVJUTVBfU0VUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotICAgICAgICByZXR1cm4gIElSUV9IQU5ETEVEOwotI2Vsc2UKLSAgICAgICAgcmV0dXJuOwotI2VuZGlmCi0JfQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgVHhDb2hlcmVudCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIj4+PlR4Q29oZXJlbnQ8PDxcbiIpKTsKLQkJUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQocEFkKTsKLQl9Ci0KLQlpZiAoSW50U291cmNlLndvcmQgJiBSeENvaGVyZW50KQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPj4+UnhDb2hlcmVudDw8PFxuIikpOwotCQlSVE1QSGFuZGxlUnhDb2hlcmVudEludGVycnVwdChwQWQpOwotCX0KLQotCWlmIChJbnRTb3VyY2Uud29yZCAmIEZpZm9TdGFGdWxsSW50KQotCXsKLQkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBGaWZvU3RhRnVsbEludCkgPT0gMCkKLQkJewotCQkJLyogbWFzayBGaWZvU3RhRnVsbEludCAqLwotCQkJcnQyODYwX2ludF9kaXNhYmxlKHBBZCwgRmlmb1N0YUZ1bGxJbnQpOwotCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+Zmlmb19zdGF0aXN0aWNfZnVsbF90YXNrKTsKLQkJfQotCQlwQWQtPmludF9wZW5kaW5nIHw9IEZpZm9TdGFGdWxsSW50OwotCX0KLQotCWlmIChJbnRTb3VyY2Uud29yZCAmIElOVF9NR01UX0RMWSkKLQl7Ci0JCWlmICgocEFkLT5pbnRfZGlzYWJsZV9tYXNrICYgSU5UX01HTVRfRExZKSA9PTAgKQotCQl7Ci0JCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfTUdNVF9ETFkpOwotCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrKTsKLQkJfQotCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9NR01UX0RMWSA7Ci0JfQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgSU5UX1JYKQotCXsKLQkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfUlgpID09IDApCi0JCXsKLQotCQkJLyogbWFzayBSeElOVCAqLwotCQkJcnQyODYwX2ludF9kaXNhYmxlKHBBZCwgSU5UX1JYKTsKLQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPnJ4X2RvbmVfdGFzayk7Ci0JCX0KLQkJcEFkLT5pbnRfcGVuZGluZyB8PSBJTlRfUlg7Ci0JfQotCi0KLQlpZiAoSW50U291cmNlLndvcmQgJiBJTlRfQUMzX0RMWSkKLQl7Ci0KLQkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfQUMzX0RMWSkgPT0gMCkKLQkJewotCQkJLyogbWFzayBUeERhdGFJbnQgKi8KLQkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9BQzNfRExZKTsKLQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrKTsKLQkJfQotCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9BQzNfRExZOwotCX0KLQotCWlmIChJbnRTb3VyY2Uud29yZCAmIElOVF9BQzJfRExZKQotCXsKLQotCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIElOVF9BQzJfRExZKSA9PSAwKQotCQl7Ci0JCQkvKiBtYXNrIFR4RGF0YUludCAqLwotCQkJcnQyODYwX2ludF9kaXNhYmxlKHBBZCwgSU5UX0FDMl9ETFkpOwotCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2spOwotCQl9Ci0JCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX0FDMl9ETFk7Ci0JfQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgSU5UX0FDMV9ETFkpCi0JewotCi0JCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX0FDMV9ETFk7Ci0KLQkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfQUMxX0RMWSkgPT0gMCkKLQkJewotCQkJLyogbWFzayBUeERhdGFJbnQgKi8KLQkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9BQzFfRExZKTsKLQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrKTsKLQkJfQotCi0JfQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgSU5UX0FDMF9ETFkpCi0JewotCi0vKgotCQlpZiAoSW50U291cmNlLndvcmQgJiAweDIpIHsKLQkJCXUzMiByZWc7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIERFTEFZX0lOVF9DRkcsICZyZWcpOwotCQkJcHJpbnRrKCJJbnRTb3VyY2Uud29yZCA9ICUwOHgsIERFTEFZX1JFRyA9ICUwOHhcbiIsIEludFNvdXJjZS53b3JkLCByZWcpOwotCQl9Ci0qLwotCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9BQzBfRExZOwotCi0JCWlmICgocEFkLT5pbnRfZGlzYWJsZV9tYXNrICYgSU5UX0FDMF9ETFkpID09IDApCi0JCXsKLQkJCS8qIG1hc2sgVHhEYXRhSW50ICovCi0JCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfQUMwX0RMWSk7Ci0JCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzayk7Ci0JCX0KLQotCX0KLQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgUHJlVEJUVEludCkKLQl7Ci0JCVJUTVBIYW5kbGVQcmVUQlRUSW50ZXJydXB0KHBBZCk7Ci0JfQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgVEJUVEludCkKLQl7Ci0JCVJUTVBIYW5kbGVUQlRUSW50ZXJydXB0KHBBZCk7Ci0JfQotCi0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCWlmIChJbnRTb3VyY2Uud29yZCAmIEF1dG9XYWtldXBJbnQpCi0JCQlSVE1QSGFuZGxlVHdha2V1cEludGVycnVwdChwQWQpOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKLQlyZXR1cm4gIElSUV9IQU5ETEVEOwotI2VuZGlmCi0KLX0KLQotLyoKLSAqIGludmFpbGQgb3Igd3JpdGViYWNrIGNhY2hlCi0gKiBhbmQgY29udmVydCB2aXJ0dWFsIGFkZHJlc3MgdG8gcGh5c2ljYWwgYWRkcmVzcwotICovCi1kbWFfYWRkcl90IGxpbnV4X3BjaV9tYXBfc2luZ2xlKHZvaWQgKmhhbmRsZSwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwgaW50IHNkX2lkeCwgaW50IGRpcmVjdGlvbikKLXsKLQlQUlRNUF9BREFQVEVSIHBBZDsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0KLQkvKgotCQktLS0tLS0gUG9ydGluZyBJbmZvcm1hdGlvbiAtLS0tLS0KLQkJPiBGb3IgVHggQWxsb2M6Ci0JCQltZ210IHBhY2tldHMgPT4gc2RfaWR4ID0gMAotCQkJU3dJZHg6IHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgKLQkJCXBUeEQgOiBwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLkFsbG9jVmE7Ci0KLQkJCWRhdGEgcGFja2V0cyA9PiBzZF9pZHggPSAxCi0JCQlUeElkeCA6IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5UeENwdUlkeAotCQkJUXVlSWR4OiBwVHhCbGstPlF1ZUlkeAotCQkJcFR4RCAgOiBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uQ2VsbFtUeElkeF0uQWxsb2NWYTsKLQotCQk+IEZvciBSeCBBbGxvYzoKLQkJCXNkX2lkeCA9IC0xCi0JKi8KLQotCXBBZCA9IChQUlRNUF9BREFQVEVSKWhhbmRsZTsKLQlwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7Ci0KLQlpZiAoc2RfaWR4ID09IDEpCi0JewotCQlQVFhfQkxLCQlwVHhCbGs7Ci0JCXBUeEJsayA9IChQVFhfQkxLKXB0cjsKLQkJcmV0dXJuIHBjaV9tYXBfc2luZ2xlKHBPYmotPnBjaV9kZXYsIHBUeEJsay0+cFNyY0J1ZkRhdGEsIHBUeEJsay0+U3JjQnVmTGVuLCBkaXJlY3Rpb24pOwotCX0KLQllbHNlCi0JewotCQlyZXR1cm4gcGNpX21hcF9zaW5nbGUocE9iai0+cGNpX2RldiwgcHRyLCBzaXplLCBkaXJlY3Rpb24pOwotCX0KLQotfQotCi12b2lkIGxpbnV4X3BjaV91bm1hcF9zaW5nbGUodm9pZCAqaGFuZGxlLCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbikKLXsKLQlQUlRNUF9BREFQVEVSIHBBZDsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0KLQlwQWQ9KFBSVE1QX0FEQVBURVIpaGFuZGxlOwotCXBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKLQotCXBjaV91bm1hcF9zaW5nbGUocE9iai0+cGNpX2RldiwgZG1hX2FkZHIsIHNpemUsIGRpcmVjdGlvbik7Ci0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRfcHJvZmlsZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydF9wcm9maWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YTA1OTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydF9wcm9maWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLQlydF9wcm9maWxlLmMKLQotICAgIEFic3RyYWN0OgotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLSNpbmNsdWRlICJydF9jb25maWcuaCIKLQotCi1ORElTX1NUQVRVUwlSVE1QUmVhZFBhcmFtZXRlcnNIb29rKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkKQotewotCVBTVFJJTkcJCQkJCXNyYyA9IE5VTEw7Ci0JUlRNUF9PU19GRAkJCQlzcmNmOwotCVJUTVBfT1NfRlNfSU5GTwkJCW9zRlNJbmZvOwotCUlOVAkJCQkJCXJldHZhbCA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JUFNUUklORwkJCQkJYnVmZmVyOwotCi0JYnVmZmVyID0ga21hbGxvYyhNQVhfSU5JX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7Ci0JaWYoYnVmZmVyID09IE5VTEwpCi0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCW1lbXNldChidWZmZXIsIDB4MDAsIE1BWF9JTklfQlVGRkVSX1NJWkUpOwotCi0JewotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCXNyYyA9IFNUQV9QUk9GSUxFX1BBVEg7Ci0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKLQkJc3JjID0gKFBTVFJJTkcpcEFkLT5NQ19GaWxlTmFtZTsKLSNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KLQl9Ci0KLQlpZiAoc3JjICYmICpzcmMpCi0JewotCQlSdG1wT1NGU0luZm9DaGFuZ2UoJm9zRlNJbmZvLCBUUlVFKTsKLQkJc3JjZiA9IFJ0bXBPU0ZpbGVPcGVuKHNyYywgT19SRE9OTFksIDApOwotCQlpZiAoSVNfRklMRV9PUEVOX0VSUihzcmNmKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiT3BlbiBmaWxlIFwiJXNcIiBmYWlsZWQhXG4iLCBzcmMpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXJldHZhbCA9UnRtcE9TRmlsZVJlYWQoc3JjZiwgYnVmZmVyLCBNQVhfSU5JX0JVRkZFUl9TSVpFKTsKLQkJCWlmIChyZXR2YWwgPiAwKQotCQkJewotCQkJCVJUTVBTZXRQcm9maWxlUGFyYW1ldGVycyhwQWQsIGJ1ZmZlcik7Ci0JCQkJcmV0dmFsID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQkJCX0KLQkJCWVsc2UKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSZWFkIGZpbGUgXCIlc1wiIGZhaWxlZChlcnJDb2RlPSVkKSFcbiIsIHNyYywgcmV0dmFsKSk7Ci0KLQkJCXJldHZhbCA9IFJ0bXBPU0ZpbGVDbG9zZShzcmNmKTsKLQkJCWlmICggcmV0dmFsICE9IDApCi0JCQl7Ci0JCQkJcmV0dmFsID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJDbG9zZSBmaWxlIFwiJXNcIiBmYWlsZWQoZXJyQ29kZT0lZCkhXG4iLCBzcmMsIHJldHZhbCkpOwotCQkJfQotCQl9Ci0KLQkJUnRtcE9TRlNJbmZvQ2hhbmdlKCZvc0ZTSW5mbywgRkFMU0UpOwotCX0KLQotCWtmcmVlKGJ1ZmZlcik7Ci0KLQlyZXR1cm4gKHJldHZhbCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRtcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZjZkMGIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ODczICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgcnRtcC5oCi0KLSAgICBBYnN0cmFjdDoKLSAgICBNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgUGF1bCBMaW4gICAgMjAwMi0wOC0wMSAgICBjcmVhdGVkCi0gICAgSmFtZXMgVGFuICAgMjAwMi0wOS0wNiAgICBtb2RpZmllZCAoUmV2aXNlIE5UQ1JlZ1RhYmxlKQotICAgIEpvaG4gQ2hhbmcgIDIwMDQtMDktMDYgICAgbW9kaWZpZWQgZm9yIFJUMjYwMAotKi8KLSNpZm5kZWYgX19SVE1QX0hfXwotI2RlZmluZSBfX1JUTVBfSF9fCi0KLSNpbmNsdWRlICJsaW5rX2xpc3QuaCIKLSNpbmNsdWRlICJzcGVjdHJ1bV9kZWYuaCIKLQotI2luY2x1ZGUgInJ0bXBfZG90MTEuaCIKLQotI2lmZGVmIE1MTUVfRVgKLSNpbmNsdWRlICJtbG1lX2V4X2RlZi5oIgotI2VuZGlmIC8vIE1MTUVfRVggLy8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jdW5kZWYgQVBfV1NDX0lOQ0xVREVECi0jdW5kZWYgU1RBX1dTQ19JTkNMVURFRAotI3VuZGVmIFdTQ19JTkNMVURFRAotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2lmIGRlZmluZWQoQVBfV1NDX0lOQ0xVREVEKSB8fCBkZWZpbmVkKFNUQV9XU0NfSU5DTFVERUQpCi0jZGVmaW5lIFdTQ19JTkNMVURFRAotI2VuZGlmCi0KLQotCi0KLQotI2luY2x1ZGUgInJ0bXBfY2hpcC5oIgotCi0KLQotdHlwZWRlZiBzdHJ1Y3QgX1JUTVBfQURBUFRFUgkJUlRNUF9BREFQVEVSOwotdHlwZWRlZiBzdHJ1Y3QgX1JUTVBfQURBUFRFUgkJKlBSVE1QX0FEQVBURVI7Ci0KLXR5cGVkZWYgc3RydWN0IF9SVE1QX0NISVBfT1BfIFJUTVBfQ0hJUF9PUDsKLQotCi0vLyNkZWZpbmUgREJHCQkxCi0KLS8vI2RlZmluZSBEQkdfRElBR05PU0UJCTEKLQotCi0vLysrK0FkZCBieSBzaGlhbmcgZm9yIG1lcmdlIE1pbmlwb3J0TU1SZXF1ZXN0KCkgYW5kIE1pbmlwb3J0RGF0YU1NUmVxdWVzdCgpIGludG8gb25lIGZ1bmN0aW9uCi0jZGVmaW5lIE1BWF9EQVRBTU1fUkVUUlkJMwotI2RlZmluZSBNR01UX1VTRV9RVUVVRV9GTEFHCTB4ODAKLS8vLS0tQWRkIGJ5IHNoaWFuZyBmb3IgbWVyZ2UgTWluaXBvcnRNTVJlcXVlc3QoKSBhbmQgTWluaXBvcnREYXRhTU1SZXF1ZXN0KCkgaW50byBvbmUgZnVuY3Rpb24KLQotI2RlZmluZQlNQVhTRVEJCSgweEZGRikKLQotCi0jaWYgZGVmaW5lZChDT05GSUdfQVBfU1VQUE9SVCkgJiYgZGVmaW5lZChDT05GSUdfU1RBX1NVUFBPUlQpCi0jZGVmaW5lIElGX0RFVl9DT05GSUdfT1BNT0RFX09OX0FQKF9wQWQpCWlmKF9wQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApCi0jZGVmaW5lIElGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShfcEFkKQlpZihfcEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLSNlbHNlCi0jZGVmaW5lIElGX0RFVl9DT05GSUdfT1BNT0RFX09OX0FQKF9wQWQpCi0jZGVmaW5lIElGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShfcEFkKQotI2VuZGlmCi0KLWV4dGVybiAgdW5zaWduZWQgY2hhciAgIFNOQVBfQUlST05FVFtdOwotZXh0ZXJuICB1bnNpZ25lZCBjaGFyICAgQ0lTQ09fT1VJW107Ci1leHRlcm4gIFVDSEFSCUJhU2l6ZUFycmF5WzRdOwotCi1leHRlcm4gVUNIQVIgQlJPQURDQVNUX0FERFJbTUFDX0FERFJfTEVOXTsKLWV4dGVybiBVQ0hBUiBaRVJPX01BQ19BRERSW01BQ19BRERSX0xFTl07Ci1leHRlcm4gVUxPTkcgQklUMzJbMzJdOwotZXh0ZXJuIFVDSEFSIEJJVDhbOF07Ci1leHRlcm4gY2hhciogQ2lwaGVyTmFtZVtdOwotZXh0ZXJuIGNoYXIqIE1DU1RvTWJwc1tdOwotZXh0ZXJuIFVDSEFSCSBSeHdpTUNTVG9PZmRtUmF0ZVsxMl07Ci1leHRlcm4gVUNIQVIgU05BUF84MDJfMUhbNl07Ci1leHRlcm4gVUNIQVIgU05BUF9CUklER0VfVFVOTkVMWzZdOwotZXh0ZXJuIFVDSEFSIFNOQVBfQUlST05FVFs4XTsKLWV4dGVybiBVQ0hBUiBDS0lQX0xMQ19TTkFQWzhdOwotZXh0ZXJuIFVDSEFSIEVBUE9MX0xMQ19TTkFQWzhdOwotZXh0ZXJuIFVDSEFSIEVBUE9MWzJdOwotZXh0ZXJuIFVDSEFSIElQWFsyXTsKLWV4dGVybiBVQ0hBUiBBUFBMRV9UQUxLWzJdOwotZXh0ZXJuIFVDSEFSIFJhdGVJZFRvUGxjcFNpZ25hbFsxMl07IC8vIHNlZSBJRUVFODAyLjExYS0xOTk5IHAuMTQKLWV4dGVybiBVQ0hBUgkgT2ZkbVJhdGVUb1J4d2lNQ1NbXTsKLWV4dGVybiBVQ0hBUiBPZmRtU2lnbmFsVG9SYXRlSWRbMTZdIDsKLWV4dGVybiBVQ0hBUiBkZWZhdWx0X2N3bWluWzRdOwotZXh0ZXJuIFVDSEFSIGRlZmF1bHRfY3dtYXhbNF07Ci1leHRlcm4gVUNIQVIgZGVmYXVsdF9zdGFfYWlmc25bNF07Ci1leHRlcm4gVUNIQVIgTWFwVXNlclByaW9yaXR5VG9BY2Nlc3NDYXRlZ29yeVs4XTsKLQotZXh0ZXJuIFVTSE9SVCBSYXRlVXBQRVJbXTsKLWV4dGVybiBVU0hPUlQgUmF0ZURvd25QRVJbXTsKLWV4dGVybiBVQ0hBUiAgUGh5MTFCTmV4dFJhdGVEb3dud2FyZFtdOwotZXh0ZXJuIFVDSEFSICBQaHkxMUJOZXh0UmF0ZVVwd2FyZFtdOwotZXh0ZXJuIFVDSEFSICBQaHkxMUJHTmV4dFJhdGVEb3dud2FyZFtdOwotZXh0ZXJuIFVDSEFSICBQaHkxMUJHTmV4dFJhdGVVcHdhcmRbXTsKLWV4dGVybiBVQ0hBUiAgUGh5MTFBTmV4dFJhdGVEb3dud2FyZFtdOwotZXh0ZXJuIFVDSEFSICBQaHkxMUFOZXh0UmF0ZVVwd2FyZFtdOwotZXh0ZXJuIENIQVIgICBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW107Ci1leHRlcm4gVUNIQVIgIFJhdGVJZFRvTWJwc1tdOwotZXh0ZXJuIFVTSE9SVCBSYXRlSWRUbzUwMEticHNbXTsKLQotZXh0ZXJuIFVDSEFSICBDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwW107Ci1leHRlcm4gVUNIQVIgIENpcGhlclN1aXRlV3BhTm9uZVRraXBMZW47Ci0KLWV4dGVybiBVQ0hBUiAgQ2lwaGVyU3VpdGVXcGFOb25lQWVzW107Ci1leHRlcm4gVUNIQVIgIENpcGhlclN1aXRlV3BhTm9uZUFlc0xlbjsKLQotZXh0ZXJuIFVDSEFSICBTc2lkSWU7Ci1leHRlcm4gVUNIQVIgIFN1cFJhdGVJZTsKLWV4dGVybiBVQ0hBUiAgRXh0UmF0ZUllOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi1leHRlcm4gVUNIQVIgIEh0Q2FwSWU7Ci1leHRlcm4gVUNIQVIgIEFkZEh0SW5mb0llOwotZXh0ZXJuIFVDSEFSICBOZXdFeHRDaGFuSWU7Ci0jaWZkZWYgRE9UMTFOX0RSQUZUMwotZXh0ZXJuIFVDSEFSICBFeHRIdENhcEllOwotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotZXh0ZXJuIFVDSEFSICBFcnBJZTsKLWV4dGVybiBVQ0hBUiAgRHNJZTsKLWV4dGVybiBVQ0hBUiAgVGltSWU7Ci1leHRlcm4gVUNIQVIgIFdwYUllOwotZXh0ZXJuIFVDSEFSICBXcGEySWU7Ci1leHRlcm4gVUNIQVIgIElic3NJZTsKLWV4dGVybiBVQ0hBUiAgQ2N4MkllOwotZXh0ZXJuIFVDSEFSICBXYXBpSWU7Ci0KLWV4dGVybiBVQ0hBUiAgV1BBX09VSVtdOwotZXh0ZXJuIFVDSEFSICBSU05fT1VJW107Ci1leHRlcm4gVUNIQVIgIFdBUElfT1VJW107Ci1leHRlcm4gVUNIQVIgIFdNRV9JTkZPX0VMRU1bXTsKLWV4dGVybiBVQ0hBUiAgV01FX1BBUk1fRUxFTVtdOwotZXh0ZXJuIFVDSEFSICBDY3gyUW9zSW5mb1tdOwotZXh0ZXJuIFVDSEFSICBDY3gySWVJbmZvW107Ci1leHRlcm4gVUNIQVIgIFJBTElOS19PVUlbXTsKLWV4dGVybiBVQ0hBUiAgUG93ZXJDb25zdHJhaW50SUVbXTsKLQotCi1leHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZVtdOwotZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUJbXTsKLWV4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFHW107Ci1leHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExQkdbXTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUJHTjFTW107Ci1leHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNbXTsKLWV4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kW107Ci1leHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExTjFTW107Ci1leHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExTjJTW107Ci1leHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbXTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotZXh0ZXJuIFVDSEFSICBQUkVfTl9IVF9PVUlbXTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCi0jaWZkZWYgUkFMSU5LX0FURQotdHlwZWRlZglzdHJ1Y3QgX0FURV9JTkZPIHsKLQlVQ0hBUglNb2RlOwotCUNIQVIJVHhQb3dlcjA7Ci0JQ0hBUglUeFBvd2VyMTsKLQlDSEFSICAgIFR4QW50ZW5uYVNlbDsKLQlDSEFSICAgIFJ4QW50ZW5uYVNlbDsKLQlUWFdJX1NUUlVDICBUeFdJOwkgIC8vIFRYV0kKLQlVU0hPUlQJUUlEOwotCVVDSEFSCUFkZHIxW01BQ19BRERSX0xFTl07Ci0JVUNIQVIJQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUglBZGRyM1tNQUNfQUREUl9MRU5dOwotCVVDSEFSCUNoYW5uZWw7Ci0JVUlOVDMyCVR4TGVuZ3RoOwotCVVJTlQzMglUeENvdW50OwotCVVJTlQzMglUeERvbmVDb3VudDsgLy8gVHggRE1BIERvbmUKLQlVSU5UMzIJUkZGcmVxT2Zmc2V0OwotCUJPT0xFQU4JYlJ4RkVSOwkJLy8gU2hvdyBSeCBGcmFtZSBFcnJvciBSYXRlCi0JQk9PTEVBTgliUUFUeFN0YXJ0OyAvLyBIYXZlIGNvbXBpbGVkIFFBIGluIGFuZCB1c2UgaXQgdG8gQVRFIHR4LgotCUJPT0xFQU4JYlFBUnhTdGFydDsJLy8gSGF2ZSBjb21waWxlZCBRQSBpbiBhbmQgdXNlIGl0IHRvIEFURSByeC4KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlCT09MRUFOCWJGV0xvYWRpbmc7CS8vIFJlbG9hZCBmaXJtd2FyZSB3aGVuIEFURSBpcyBkb25lLgotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCVVJTlQzMglSeFRvdGFsQ250OwotCVVJTlQzMglSeENudFBlclNlYzsKLQotCUNIQVIJTGFzdFNOUjA7ICAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgU05SCi0JQ0hBUiAgICBMYXN0U05SMTsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBTTlIgZm9yIDJuZCAgYW50ZW5uYQotCUNIQVIgICAgTGFzdFJzc2kwOyAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgUlNTSQotCUNIQVIgICAgTGFzdFJzc2kxOyAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgUlNTSSBmb3IgMm5kICBhbnRlbm5hCi0JQ0hBUiAgICBMYXN0UnNzaTI7ICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJIGZvciAzcmQgIGFudGVubmEKLQlDSEFSICAgIEF2Z1Jzc2kwOyAgICAgICAgICAgICAvLyBsYXN0IDggZnJhbWVzJyBhdmVyYWdlIFJTU0kKLQlDSEFSICAgIEF2Z1Jzc2kxOyAgICAgICAgICAgICAvLyBsYXN0IDggZnJhbWVzJyBhdmVyYWdlIFJTU0kKLQlDSEFSICAgIEF2Z1Jzc2kyOyAgICAgICAgICAgICAvLyBsYXN0IDggZnJhbWVzJyBhdmVyYWdlIFJTU0kKLQlTSE9SVCAgIEF2Z1Jzc2kwWDg7ICAgICAgICAgICAvLyBzdW0gb2YgbGFzdCA4IGZyYW1lcycgUlNTSQotCVNIT1JUICAgQXZnUnNzaTFYODsgICAgICAgICAgIC8vIHN1bSBvZiBsYXN0IDggZnJhbWVzJyBSU1NJCi0JU0hPUlQgICBBdmdSc3NpMlg4OyAgICAgICAgICAgLy8gc3VtIG9mIGxhc3QgOCBmcmFtZXMnIFJTU0kKLQotCVVJTlQzMglOdW1PZkF2Z1Jzc2lTYW1wbGU7Ci0KLQotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0JLy8gVHggZnJhbWUKLQlVU0hPUlQJCUhMZW47IC8vIEhlYWRlciBMZW5ndGgKLQlVU0hPUlQJCVBMZW47IC8vIFBhdHRlcm4gTGVuZ3RoCi0JVUNIQVIJCUhlYWRlclszMl07IC8vIEhlYWRlciBidWZmZXIKLQlVQ0hBUgkJUGF0dGVyblszMl07IC8vIFBhdHRlcm4gYnVmZmVyCi0JVVNIT1JUCQlETGVuOyAvLyBEYXRhIExlbmd0aAotCVVTSE9SVAkJc2VxOwotCVVJTlQzMgkJQ0lEOwotCVJUTVBfT1NfUElECUF0ZVBpZDsKLQkvLyBjb3VudGVycwotCVVJTlQzMgkJVTJNOwotCVVJTlQzMgkJT3RoZXJEYXRhOwotCVVJTlQzMgkJQmVhY29uOwotCVVJTlQzMgkJT3RoZXJDb3VudDsKLQlVSU5UMzIJCVR4QWMwOwotCVVJTlQzMgkJVHhBYzE7Ci0JVUlOVDMyCQlUeEFjMjsKLQlVSU5UMzIJCVR4QWMzOwotCS8qVUlOVDMyCQlUeEhDQ0E7Ki8KLQlVSU5UMzIJCVR4TWdtdDsKLQlVSU5UMzIJCVJTU0kwOwotCVVJTlQzMgkJUlNTSTE7Ci0JVUlOVDMyCQlSU1NJMjsKLQlVSU5UMzIJCVNOUjA7Ci0JVUlOVDMyCQlTTlIxOwotCS8vIFR4U3RhdHVzIDogMCAtLT4gdGFzayBpcyBpZGxlLCAxIC0tPiB0YXNrIGlzIHJ1bm5pbmcKLQlVQ0hBUgkJVHhTdGF0dXM7Ci0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLX0JQVRFX0lORk8sICpQQVRFX0lORk87Ci0KLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotc3RydWN0IGF0ZV9yYWNmZ2hkciB7Ci0JVUlOVDMyCQltYWdpY19ubzsKLQlVU0hPUlQJCWNvbW1hbmRfdHlwZTsKLQlVU0hPUlQJCWNvbW1hbmRfaWQ7Ci0JVVNIT1JUCQlsZW5ndGg7Ci0JVVNIT1JUCQlzZXF1ZW5jZTsKLQlVU0hPUlQJCXN0YXR1czsKLQlVQ0hBUgkJZGF0YVsyMDQ2XTsKLX0gIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCi0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0KLXR5cGVkZWYgc3RydWN0CV9SU1NJX1NBTVBMRSB7Ci0JQ0hBUgkJCUxhc3RSc3NpMDsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJCi0JQ0hBUgkJCUxhc3RSc3NpMTsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJCi0JQ0hBUgkJCUxhc3RSc3NpMjsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJCi0JQ0hBUgkJCUF2Z1Jzc2kwOwotCUNIQVIJCQlBdmdSc3NpMTsKLQlDSEFSCQkJQXZnUnNzaTI7Ci0JU0hPUlQJCQlBdmdSc3NpMFg4OwotCVNIT1JUCQkJQXZnUnNzaTFYODsKLQlTSE9SVAkJCUF2Z1Jzc2kyWDg7Ci19IFJTU0lfU0FNUExFOwotCi0vLwotLy8gIFF1ZXVlIHN0cnVjdHVyZSBhbmQgbWFjcm9zCi0vLwotdHlwZWRlZiBzdHJ1Y3QgIF9RVUVVRV9FTlRSWSAgICB7Ci0Jc3RydWN0IF9RVUVVRV9FTlRSWSAgICAgKk5leHQ7Ci19ICAgUVVFVUVfRU5UUlksICpQUVVFVUVfRU5UUlk7Ci0KLS8vIFF1ZXVlIHN0cnVjdHVyZQotdHlwZWRlZiBzdHJ1Y3QgIF9RVUVVRV9IRUFERVIgICB7Ci0JUFFVRVVFX0VOVFJZICAgIEhlYWQ7Ci0JUFFVRVVFX0VOVFJZICAgIFRhaWw7Ci0JVUxPTkcgICAgICAgICAgIE51bWJlcjsKLX0gICBRVUVVRV9IRUFERVIsICpQUVVFVUVfSEVBREVSOwotCi0jZGVmaW5lIEluaXRpYWxpemVRdWV1ZUhlYWRlcihRdWV1ZUhlYWRlcikgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCShRdWV1ZUhlYWRlciktPkhlYWQgPSAoUXVldWVIZWFkZXIpLT5UYWlsID0gTlVMTDsgICBcCi0JKFF1ZXVlSGVhZGVyKS0+TnVtYmVyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBSZW1vdmVIZWFkUXVldWUoUXVldWVIZWFkZXIpICAgICAgICAgICAgICAgIFwKLShRdWV1ZUhlYWRlciktPkhlYWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCVBRVUVVRV9FTlRSWSBwTmV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlpZiAoKFF1ZXVlSGVhZGVyKS0+SGVhZCAhPSBOVUxMKQkJCQlcCi0JewkJCQkJCQkJCQkJCVwKLQkJcE5leHQgPSAoUXVldWVIZWFkZXIpLT5IZWFkLT5OZXh0OyAgICAgICAgICBcCi0JCShRdWV1ZUhlYWRlciktPkhlYWQtPk5leHQgPSBOVUxMOwkJXAotCQkoUXVldWVIZWFkZXIpLT5IZWFkID0gcE5leHQ7ICAgICAgICAgICAgICAgIFwKLQkJaWYgKHBOZXh0ID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkoUXVldWVIZWFkZXIpLT5UYWlsID0gTlVMTDsgICAgICAgICAgICAgXAotCQkoUXVldWVIZWFkZXIpLT5OdW1iZXItLTsgICAgICAgICAgICAgICAgICAgIFwKLQl9CQkJCQkJCQkJCQkJXAotfQotCi0jZGVmaW5lIEluc2VydEhlYWRRdWV1ZShRdWV1ZUhlYWRlciwgUXVldWVFbnRyeSkgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSgoUFFVRVVFX0VOVFJZKVF1ZXVlRW50cnkpLT5OZXh0ID0gKFF1ZXVlSGVhZGVyKS0+SGVhZDsgXAotCQkoUXVldWVIZWFkZXIpLT5IZWFkID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7ICAgICAgIFwKLQkJaWYgKChRdWV1ZUhlYWRlciktPlRhaWwgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkoUXVldWVIZWFkZXIpLT5UYWlsID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7ICAgXAotCQkoUXVldWVIZWFkZXIpLT5OdW1iZXIrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBJbnNlcnRUYWlsUXVldWUoUXVldWVIZWFkZXIsIFF1ZXVlRW50cnkpCQkJCVwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JKChQUVVFVUVfRU5UUlkpUXVldWVFbnRyeSktPk5leHQgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgXAotCWlmICgoUXVldWVIZWFkZXIpLT5UYWlsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJKFF1ZXVlSGVhZGVyKS0+VGFpbC0+TmV4dCA9IChQUVVFVUVfRU5UUlkpKFF1ZXVlRW50cnkpOyBcCi0JZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkoUXVldWVIZWFkZXIpLT5IZWFkID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7ICAgICAgIFwKLQkoUXVldWVIZWFkZXIpLT5UYWlsID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7ICAgICAgICAgICBcCi0JKFF1ZXVlSGVhZGVyKS0+TnVtYmVyKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIEluc2VydFRhaWxRdWV1ZUFjKHBBZCwgcEVudHJ5LCBRdWV1ZUhlYWRlciwgUXVldWVFbnRyeSkJCQlcCi17CQkJCQkJCQkJCQkJCQkJCQkJXAotCSgoUFFVRVVFX0VOVFJZKVF1ZXVlRW50cnkpLT5OZXh0ID0gTlVMTDsJCQkJCQkJXAotCWlmICgoUXVldWVIZWFkZXIpLT5UYWlsKQkJCQkJCQkJCQkJXAotCQkoUXVldWVIZWFkZXIpLT5UYWlsLT5OZXh0ID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7CQkJXAotCWVsc2UJCQkJCQkJCQkJCQkJCQkJXAotCQkoUXVldWVIZWFkZXIpLT5IZWFkID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7CQkJCVwKLQkoUXVldWVIZWFkZXIpLT5UYWlsID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7CQkJCQlcCi0JKFF1ZXVlSGVhZGVyKS0+TnVtYmVyKys7CQkJCQkJCQkJCQlcCi19Ci0KLQotCi0vLwotLy8gIE1hY3JvcyBmb3IgZmxhZyBhbmQgcmVmIGNvdW50IG9wZXJhdGlvbnMKLS8vCi0jZGVmaW5lIFJUTVBfU0VUX0ZMQUcoX00sIF9GKSAgICAgICAoKF9NKS0+RmxhZ3MgfD0gKF9GKSkKLSNkZWZpbmUgUlRNUF9DTEVBUl9GTEFHKF9NLCBfRikgICAgICgoX00pLT5GbGFncyAmPSB+KF9GKSkKLSNkZWZpbmUgUlRNUF9DTEVBUl9GTEFHUyhfTSkgICAgICAgICgoX00pLT5GbGFncyA9IDApCi0jZGVmaW5lIFJUTVBfVEVTVF9GTEFHKF9NLCBfRikgICAgICAoKChfTSktPkZsYWdzICYgKF9GKSkgIT0gMCkKLSNkZWZpbmUgUlRNUF9URVNUX0ZMQUdTKF9NLCBfRikgICAgICgoKF9NKS0+RmxhZ3MgJiAoX0YpKSA9PSAoX0YpKQotLy8gTWFjcm8gZm9yIHBvd2VyIHNhdmUgZmxhZy4KLSNkZWZpbmUgUlRNUF9TRVRfUFNGTEFHKF9NLCBfRikgICAgICAgKChfTSktPlBTRmxhZ3MgfD0gKF9GKSkKLSNkZWZpbmUgUlRNUF9DTEVBUl9QU0ZMQUcoX00sIF9GKSAgICAgKChfTSktPlBTRmxhZ3MgJj0gfihfRikpCi0jZGVmaW5lIFJUTVBfQ0xFQVJfUFNGTEFHUyhfTSkgICAgICAgICgoX00pLT5QU0ZsYWdzID0gMCkKLSNkZWZpbmUgUlRNUF9URVNUX1BTRkxBRyhfTSwgX0YpICAgICAgKCgoX00pLT5QU0ZsYWdzICYgKF9GKSkgIT0gMCkKLSNkZWZpbmUgUlRNUF9URVNUX1BTRkxBR1MoX00sIF9GKSAgICAgKCgoX00pLT5QU0ZsYWdzICYgKF9GKSkgPT0gKF9GKSkKLQotI2RlZmluZSBPUFNUQVRVU19TRVRfRkxBRyhfcEFkLCBfRikgICAgICgoX3BBZCktPkNvbW1vbkNmZy5PcFN0YXR1c0ZsYWdzIHw9IChfRikpCi0jZGVmaW5lIE9QU1RBVFVTX0NMRUFSX0ZMQUcoX3BBZCwgX0YpICAgKChfcEFkKS0+Q29tbW9uQ2ZnLk9wU3RhdHVzRmxhZ3MgJj0gfihfRikpCi0jZGVmaW5lIE9QU1RBVFVTX1RFU1RfRkxBRyhfcEFkLCBfRikgICAgKCgoX3BBZCktPkNvbW1vbkNmZy5PcFN0YXR1c0ZsYWdzICYgKF9GKSkgIT0gMCkKLQotI2RlZmluZSBDTElFTlRfU1RBVFVTX1NFVF9GTEFHKF9wRW50cnksX0YpICAgICAgKChfcEVudHJ5KS0+Q2xpZW50U3RhdHVzRmxhZ3MgfD0gKF9GKSkKLSNkZWZpbmUgQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKF9wRW50cnksX0YpICAgICgoX3BFbnRyeSktPkNsaWVudFN0YXR1c0ZsYWdzICY9IH4oX0YpKQotI2RlZmluZSBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhfcEVudHJ5LF9GKSAgICAgKCgoX3BFbnRyeSktPkNsaWVudFN0YXR1c0ZsYWdzICYgKF9GKSkgIT0gMCkKLQotI2RlZmluZSBSWF9GSUxURVJfU0VUX0ZMQUcoX3BBZCwgX0YpICAgICgoX3BBZCktPkNvbW1vbkNmZy5QYWNrZXRGaWx0ZXIgfD0gKF9GKSkKLSNkZWZpbmUgUlhfRklMVEVSX0NMRUFSX0ZMQUcoX3BBZCwgX0YpICAoKF9wQWQpLT5Db21tb25DZmcuUGFja2V0RmlsdGVyICY9IH4oX0YpKQotI2RlZmluZSBSWF9GSUxURVJfVEVTVF9GTEFHKF9wQWQsIF9GKSAgICgoKF9wQWQpLT5Db21tb25DZmcuUGFja2V0RmlsdGVyICYgKF9GKSkgIT0gMCkKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2RlZmluZSBTVEFfTk9fU0VDVVJJVFlfT04oX3ApICAgICAgICAgIChfcC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkKQotI2RlZmluZSBTVEFfV0VQX09OKF9wKSAgICAgICAgICAgICAgICAgIChfcC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKQotI2RlZmluZSBTVEFfVEtJUF9PTihfcCkgICAgICAgICAgICAgICAgIChfcC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQotI2RlZmluZSBTVEFfQUVTX09OKF9wKSAgICAgICAgICAgICAgICAgIChfcC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCi0jZGVmaW5lIFNUQV9UR05fV0lGSV9PTihfcCkgICAgICAgICAgICAgKF9wLT5TdGFDZmcuYlRHbldpZmlUZXN0ID09IFRSVUUpCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNkZWZpbmUgQ0tJUF9LUF9PTihfcCkJCQkJKCgoKF9wKS0+U3RhQ2ZnLkNraXBGbGFnKSAmIDB4MTApICYmICgoX3ApLT5TdGFDZmcuYkNraXBDbWljT24gPT0gVFJVRSkpCi0jZGVmaW5lIENLSVBfQ01JQ19PTihfcCkJCQkoKCgoX3ApLT5TdGFDZmcuQ2tpcEZsYWcpICYgMHgwOCkgJiYgKChfcCktPlN0YUNmZy5iQ2tpcENtaWNPbiA9PSBUUlVFKSkKLQotCi0jZGVmaW5lIElOQ19SSU5HX0lOREVYKF9pZHgsIF9SaW5nU2l6ZSkgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoX2lkeCkgPSAoX2lkeCsxKSAlIChfUmluZ1NpemUpOyAgICAgICBcCi19Ci0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotLy8gU3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk1DU1NldCBpcyBjb3BpZWQgZnJvbSBBUCBiZWFjb24uICBEb24ndCBuZWVkIHRvIHVwZGF0ZSBoZXJlLgotI2RlZmluZSBDT1BZX0hUU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKF9wQWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuQ2hhbm5lbFdpZHRoID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aDsgICAgICBcCi0JX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk1pbW9QcyA9IF9wQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHM7ICAgICAgXAotCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5HRiA9IF9wQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRjsgICAgICBcCi0JX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LlNob3J0R0lmb3IyMCA9IF9wQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjA7ICAgICAgXAotCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5TaG9ydEdJZm9yNDAgPSBfcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwOyAgICAgIFwKLQlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuVHhTVEJDID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlR4U1RCQzsgICAgICBcCi0JX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LlJ4U1RCQyA9IF9wQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkM7ICAgICAgXAotCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5FeHRDaGFuT2Zmc2V0ID0gX3BBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQ7ICAgICAgXAotCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5SZWNvbVdpZHRoID0gX3BBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGg7ICAgICAgXAotCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5PcGVyYWlvbk1vZGUgPSBfcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZTsgICAgICBcCi0JX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk5vbkdmUHJlc2VudCA9IF9wQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50OyAgICAgIFwKLQlOZGlzTW92ZU1lbW9yeSgoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUQ2FwYWJpbGl0eS5NQ1NTZXQsIChfcEFkKS0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0LCBzaXplb2YoVUNIQVIpICogMTYpO1wKLX0KLQotI2RlZmluZSBDT1BZX0FQX0hUU0VUVElOR1NfRlJPTV9CRUFDT04oX3BBZCwgX3BIdENhcGFiaWxpdHkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlfcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BTXNkdVNpemUgPSAoVUNIQVIpKF9wSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQU1zZHVTaXplKTsJXAotCV9wQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1tcHNNb2RlPSAoVUNIQVIpKF9wSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uTWltb1BzKTsJXAotCV9wQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1heFJBbXBkdUZhY3RvciA9IChVQ0hBUikoX3BIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3IpOwlcCi19Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLS8vCi0vLyBNQUNSTyBmb3IgMzItYml0IFBDSSByZWdpc3RlciByZWFkIC8gd3JpdGUKLS8vCi0vLyBVc2FnZSA6IFJUTVBfSU9fUkVBRDMyKAotLy8gICAgICAgICAgICAgIFBSVE1QX0FEQVBURVIgcEFkLAotLy8gICAgICAgICAgICAgIFVMT05HIFJlZ2lzdGVyX09mZnNldCwKLS8vICAgICAgICAgICAgICBQVUxPTkcgIHBWYWx1ZSkKLS8vCi0vLyAgICAgICAgIFJUTVBfSU9fV1JJVEUzMigKLS8vICAgICAgICAgICAgICBQUlRNUF9BREFQVEVSIHBBZCwKLS8vICAgICAgICAgICAgICBVTE9ORyBSZWdpc3Rlcl9PZmZzZXQsCi0vLyAgICAgICAgICAgICAgVUxPTkcgVmFsdWUpCi0vLwotCi0KLS8vCi0vLyBDb21tb24gZnJhZ21lbnQgbGlzdCBzdHJ1Y3R1cmUgLSAgSWRlbnRpY2FsIHRvIHRoZSBzY2F0dGVyIGdhdGhlciBmcmFnIGxpc3Qgc3RydWN0dXJlCi0vLwotLy8jZGVmaW5lIFJUTVBfU0NBVFRFUl9HQVRIRVJfRUxFTUVOVCAgICAgICAgIFNDQVRURVJfR0FUSEVSX0VMRU1FTlQKLS8vI2RlZmluZSBQUlRNUF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5UICAgICAgICBQU0NBVFRFUl9HQVRIRVJfRUxFTUVOVAotI2RlZmluZSBOSUNfTUFYX1BIWVNfQlVGX0NPVU5UICAgICAgICAgICAgICA4Ci0KLXR5cGVkZWYgc3RydWN0IF9SVE1QX1NDQVRURVJfR0FUSEVSX0VMRU1FTlQgewotICAgIFBWT0lECQlBZGRyZXNzOwotICAgIFVMT05HCQlMZW5ndGg7Ci0gICAgUFVMT05HCQlSZXNlcnZlZDsKLX0gUlRNUF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5ULCAqUFJUTVBfU0NBVFRFUl9HQVRIRVJfRUxFTUVOVDsKLQotCi10eXBlZGVmIHN0cnVjdCBfUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUIHsKLSAgICBVTE9ORyAgTnVtYmVyT2ZFbGVtZW50czsKLSAgICBQVUxPTkcgUmVzZXJ2ZWQ7Ci0gICAgUlRNUF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5UIEVsZW1lbnRzW05JQ19NQVhfUEhZU19CVUZfQ09VTlRdOwotfSBSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QsICpQUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUOwotCi0KLS8vCi0vLyAgU29tZSB1dGlsaXR5IG1hY3JvcwotLy8KLSNpZm5kZWYgbWluCi0jZGVmaW5lIG1pbihfYSwgX2IpICAgICAoKChfYSkgPCAoX2IpKSA/IChfYSkgOiAoX2IpKQotI2VuZGlmCi0KLSNpZm5kZWYgbWF4Ci0jZGVmaW5lIG1heChfYSwgX2IpICAgICAoKChfYSkgPiAoX2IpKSA/IChfYSkgOiAoX2IpKQotI2VuZGlmCi0KLSNkZWZpbmUgR0VUX0xOQV9HQUlOKF9wQWQpCSgoX3BBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkgPyAoX3BBZC0+QkxOQUdhaW4pIDogKChfcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDY0KSA/IChfcEFkLT5BTE5BR2FpbjApIDogKChfcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDEyOCkgPyAoX3BBZC0+QUxOQUdhaW4xKSA6IChfcEFkLT5BTE5BR2FpbjIpKSkpCi0KLSNkZWZpbmUgSU5DX0NPVU5URVI2NChWYWwpICAgICAgICAgIChWYWwuUXVhZFBhcnQrKykKLQotI2RlZmluZSBJTkZSQV9PTihfcCkgICAgICAgICAgICAgICAgKE9QU1RBVFVTX1RFU1RfRkxBRyhfcCwgZk9QX1NUQVRVU19JTkZSQV9PTikpCi0jZGVmaW5lIEFESE9DX09OKF9wKSAgICAgICAgICAgICAgICAoT1BTVEFUVVNfVEVTVF9GTEFHKF9wLCBmT1BfU1RBVFVTX0FESE9DX09OKSkKLSNkZWZpbmUgTU9OSVRPUl9PTihfcCkgICAgICAgICAgICAgICgoKF9wKS0+U3RhQ2ZnLkJzc1R5cGUpID09IEJTU19NT05JVE9SKQotI2RlZmluZSBJRExFX09OKF9wKSAgICAgICAgICAgICAgICAgKCFJTkZSQV9PTihfcCkgJiYgIUFESE9DX09OKF9wKSkKLQotLy8gQ2hlY2sgTEVBUCAmIENDS00gZmxhZ3MKLSNkZWZpbmUgTEVBUF9PTihfcCkgICAgICAgICAgICAgICAgICgoKF9wKS0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSkgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQotI2RlZmluZSBMRUFQX0NDS01fT04oX3ApICAgICAgICAgICAgKCgoKF9wKS0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSkgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKSAmJiAoKF9wKS0+U3RhQ2ZnLkxlYXBBdXRoSW5mby5DQ0tNID09IFRSVUUpKQotCi0vLyBpZiBvcmdpbmFsIEV0aGVybmV0IGZyYW1lIGNvbnRhaW5zIG5vIExMQy9TTkFQLCB0aGVuIGFuIGV4dHJhIExMQy9TTkFQIGVuY2FwIGlzIHJlcXVpcmVkCi0jZGVmaW5lIEVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfU1RBUlQoX3BCdWZWQSwgX3BFeHRyYUxsY1NuYXBFbmNhcCkJCVwKLXsJCQkJCQkJCQkJCQkJCQkJXAotCWlmICgoKCooX3BCdWZWQSArIDEyKSA8PCA4KSArICooX3BCdWZWQSArIDEzKSkgPiAxNTAwKQkJXAotCXsJCQkJCQkJCQkJCQkJCQlcCi0JCV9wRXh0cmFMbGNTbmFwRW5jYXAgPSBTTkFQXzgwMl8xSDsJCQkJCQlcCi0JCWlmIChOZGlzRXF1YWxNZW1vcnkoSVBYLCBfcEJ1ZlZBICsgMTIsIDIpIHx8CQkJXAotCQkJTmRpc0VxdWFsTWVtb3J5KEFQUExFX1RBTEssIF9wQnVmVkEgKyAxMiwgMikpCQlcCi0JCXsJCQkJCQkJCQkJCQkJCVwKLQkJCV9wRXh0cmFMbGNTbmFwRW5jYXAgPSBTTkFQX0JSSURHRV9UVU5ORUw7CQkJXAotCQl9CQkJCQkJCQkJCQkJCQlcCi0JfQkJCQkJCQkJCQkJCQkJCVwKLQllbHNlCQkJCQkJCQkJCQkJCQlcCi0JewkJCQkJCQkJCQkJCQkJCVwKLQkJX3BFeHRyYUxsY1NuYXBFbmNhcCA9IE5VTEw7CQkJCQkJCQlcCi0JfQkJCQkJCQkJCQkJCQkJCVwKLX0KLQotLy8gTmV3IERlZmluZSBmb3IgbmV3IFR4IFBhdGguCi0jZGVmaW5lIEVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfT0ZGU0VUKF9wQnVmVkEsIF9wRXh0cmFMbGNTbmFwRW5jYXApCVwKLXsJCQkJCQkJCQkJCQkJCQkJXAotCWlmICgoKCooX3BCdWZWQSkgPDwgOCkgKyAqKF9wQnVmVkEgKyAxKSkgPiAxNTAwKQkJCVwKLQl7CQkJCQkJCQkJCQkJCQkJXAotCQlfcEV4dHJhTGxjU25hcEVuY2FwID0gU05BUF84MDJfMUg7CQkJCQkJXAotCQlpZiAoTmRpc0VxdWFsTWVtb3J5KElQWCwgX3BCdWZWQSwgMikgfHwJCQkJCVwKLQkJCU5kaXNFcXVhbE1lbW9yeShBUFBMRV9UQUxLLCBfcEJ1ZlZBLCAyKSkJCQlcCi0JCXsJCQkJCQkJCQkJCQkJCVwKLQkJCV9wRXh0cmFMbGNTbmFwRW5jYXAgPSBTTkFQX0JSSURHRV9UVU5ORUw7CQkJXAotCQl9CQkJCQkJCQkJCQkJCQlcCi0JfQkJCQkJCQkJCQkJCQkJCVwKLQllbHNlCQkJCQkJCQkJCQkJCQlcCi0JewkJCQkJCQkJCQkJCQkJCVwKLQkJX3BFeHRyYUxsY1NuYXBFbmNhcCA9IE5VTEw7CQkJCQkJCQlcCi0JfQkJCQkJCQkJCQkJCQkJCVwKLX0KLQotCi0jZGVmaW5lIE1BS0VfODAyXzNfSEVBREVSKF9wLCBfcE1hYzEsIF9wTWFjMiwgX3BUeXBlKSAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTmRpc01vdmVNZW1vcnkoX3AsIF9wTWFjMSwgTUFDX0FERFJfTEVOKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTmRpc01vdmVNZW1vcnkoKF9wICsgTUFDX0FERFJfTEVOKSwgX3BNYWMyLCBNQUNfQUREUl9MRU4pOyAgICAgICAgICBcCi0gICAgTmRpc01vdmVNZW1vcnkoKF9wICsgTUFDX0FERFJfTEVOICogMiksIF9wVHlwZSwgTEVOR1RIXzgwMl8zX1RZUEUpOyBcCi19Ci0KLS8vIGlmIHBEYXRhIGhhcyBubyBMTEMvU05BUCAobmVpdGhlciBSRkMxMDQyIG5vciBCcmlkZ2UgdHVubmVsKSwga2VlcCBpdCB0aGF0IHdheS4KLS8vIGVsc2UgaWYgdGhlIHJlY2VpdmVkIGZyYW1lIGlzIExMQy9TTkFQLWVuY2FwZWQgSVBYIG9yIEFQUExFVEFMSywgcHJlc2VydmUgdGhlIExMQy9TTkFQIGZpZWxkCi0vLyBlbHNlIHJlbW92ZSB0aGUgTExDL1NOQVAgZmllbGQgZnJvbSB0aGUgcmVzdWx0IEV0aGVybmV0IGZyYW1lCi0vLyBQYXRjaCBmb3IgV0hRTCBvbmx5LCB3aGljaCBkaWQgbm90IHR1cm4gb24gTmV0YmlvcyBidXQgdXNlIElQWCB3aXRoaW4gaXRzIHBheWxvYWQKLS8vIE5vdGU6Ci0vLyAgICAgX3BEYXRhICYgX0RhdGFTaXplIG1heSBiZSBhbHRlcmVkIChyZW1vdmUgOC1ieXRlIExMQy9TTkFQKSBieSB0aGlzIE1BQ1JPCi0vLyAgICAgX3BSZW1vdmVkTExDU05BUDogcG9pbnRlciB0byByZW1vdmVkIExMQy9TTkFQOyBOVUxMIGlzIG5vdCByZW1vdmVkCi0jZGVmaW5lIENPTlZFUlRfVE9fODAyXzMoX3A4MDIzaGRyLCBfcERBLCBfcFNBLCBfcERhdGEsIF9EYXRhU2l6ZSwgX3BSZW1vdmVkTExDU05BUCkgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2hhciBMTENfTGVuWzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX3BSZW1vdmVkTExDU05BUCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKE5kaXNFcXVhbE1lbW9yeShTTkFQXzgwMl8xSCwgX3BEYXRhLCA2KSAgfHwgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIE5kaXNFcXVhbE1lbW9yeShTTkFQX0JSSURHRV9UVU5ORUwsIF9wRGF0YSwgNikpICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIFBVQ0hBUiBwUHJvdG8gPSBfcERhdGEgKyA2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmICgoTmRpc0VxdWFsTWVtb3J5KElQWCwgcFByb3RvLCAyKSB8fCBOZGlzRXF1YWxNZW1vcnkoQVBQTEVfVEFMSywgcFByb3RvLCAyKSkgJiYgIFwKLSAgICAgICAgICAgIE5kaXNFcXVhbE1lbW9yeShTTkFQXzgwMl8xSCwgX3BEYXRhLCA2KSkgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIExMQ19MZW5bMF0gPSAoVUNIQVIpKF9EYXRhU2l6ZSAvIDI1Nik7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIExMQ19MZW5bMV0gPSAoVUNIQVIpKF9EYXRhU2l6ZSAlIDI1Nik7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIE1BS0VfODAyXzNfSEVBREVSKF9wODAyM2hkciwgX3BEQSwgX3BTQSwgTExDX0xlbik7ICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIE1BS0VfODAyXzNfSEVBREVSKF9wODAyM2hkciwgX3BEQSwgX3BTQSwgcFByb3RvKTsgICAgICAgICAgIFwKLSAgICAgICAgICAgIF9wUmVtb3ZlZExMQ1NOQVAgPSBfcERhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIF9EYXRhU2l6ZSAtPSBMRU5HVEhfODAyXzFfSDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIF9wRGF0YSArPSBMRU5HVEhfODAyXzFfSDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgTExDX0xlblswXSA9IChVQ0hBUikoX0RhdGFTaXplIC8gMjU2KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgTExDX0xlblsxXSA9IChVQ0hBUikoX0RhdGFTaXplICUgMjU2KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgTUFLRV84MDJfM19IRUFERVIoX3A4MDIzaGRyLCBfcERBLCBfcFNBLCBMTENfTGVuKTsgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotCi0vLyBFbnF1ZXVlIHRoaXMgZnJhbWUgdG8gTUxNRSBlbmdpbmUKLS8vIFdlIG5lZWQgdG8gZW5xdWV1ZSB0aGUgd2hvbGUgZnJhbWUgYmVjYXVzZSBNTE1FIG5lZWQgdG8gcGFzcyBkYXRhIHR5cGUKLS8vIGluZm9ybWF0aW9uIGZyb20gODAyLjExIGhlYWRlcgotI2lmZGVmIFJUTVBfTUFDX1BDSQotI2RlZmluZSBSRVBPUlRfTUdNVF9GUkFNRV9UT19NTE1FKF9wQWQsIFdjaWQsIF9wRnJhbWUsIF9GcmFtZVNpemUsIF9Sc3NpMCwgX1Jzc2kxLCBfUnNzaTIsIF9QbGNwU2lnbmFsKSAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBVSU5UMzIgSGlnaDMyVFNGLCBMb3czMlRTRjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFJUTVBfSU9fUkVBRDMyKF9wQWQsIFRTRl9USU1FUl9EVzEsICZIaWdoMzJUU0YpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBSVE1QX0lPX1JFQUQzMihfcEFkLCBUU0ZfVElNRVJfRFcwLCAmTG93MzJUU0YpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWxtZUVucXVldWVGb3JSZWN2KF9wQWQsIFdjaWQsIEhpZ2gzMlRTRiwgTG93MzJUU0YsIChVQ0hBUilfUnNzaTAsIChVQ0hBUilfUnNzaTEsKFVDSEFSKV9Sc3NpMixfRnJhbWVTaXplLCBfcEZyYW1lLCAoVUNIQVIpX1BsY3BTaWduYWwpOyAgIFwKLX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotI2RlZmluZSBNQUNfQUREUl9FUVVBTChwQWRkcjEscEFkZHIyKSAgICAgICAgICAgUlRNUEVxdWFsTWVtb3J5KChQVk9JRCkocEFkZHIxKSwgKFBWT0lEKShwQWRkcjIpLCBNQUNfQUREUl9MRU4pCi0jZGVmaW5lIFNTSURfRVFVQUwoc3NpZDEsIGxlbjEsIHNzaWQyLCBsZW4yKSAgICAoKGxlbjE9PWxlbjIpICYmIChSVE1QRXF1YWxNZW1vcnkoc3NpZDEsIHNzaWQyLCBsZW4xKSkpCi0KLS8vCi0vLyBDaGVjayBpZiBpdCBpcyBKYXBhbiBXNTMoY2g1Miw1Niw2MCw2NCkgY2hhbm5lbC4KLS8vCi0jZGVmaW5lIEphcGFuQ2hhbm5lbENoZWNrKGNoYW5uZWwpICAoKGNoYW5uZWwgPT0gNTIpIHx8IChjaGFubmVsID09IDU2KSB8fCAoY2hhbm5lbCA9PSA2MCkgfHwgKGNoYW5uZWwgPT0gNjQpKQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZGVmaW5lIFNUQV9FWFRSQV9TRVRUSU5HKF9wQWQpCi0KLSNkZWZpbmUgU1RBX1BPUlRfU0VDVVJFRChfcEFkKSBcCi17IFwKLQlCT09MRUFOCUNhbmNlbGxlZDsgXAotCShfcEFkKS0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7IFwKLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCYoKF9wQWQpLT5NYWNUYWJMb2NrKSk7IFwKLQkoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBvcnRTZWN1cmVkID0gKF9wQWQpLT5TdGFDZmcuUG9ydFNlY3VyZWQ7IFwKLQkoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbDtcCi0JTmRpc1JlbGVhc2VTcGluTG9jaygmKF9wQWQpLT5NYWNUYWJMb2NrKTsgXAotCVJUTVBDYW5jZWxUaW1lcigmKChfcEFkKS0+TWxtZS5MaW5rRG93blRpbWVyKSwgJkNhbmNlbGxlZCk7XAotCVNUQV9FWFRSQV9TRVRUSU5HKF9wQWQpOyBcCi19Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCi0vLwotLy8gIERhdGEgYnVmZmVyIGZvciBETUEgb3BlcmF0aW9uLCB0aGUgYnVmZmVyIG11c3QgYmUgY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkKLS8vICBCb3RoIERNQSB0byAvIGZyb20gQ1BVIHVzZSB0aGUgc2FtZSBzdHJ1Y3R1cmUuCi0vLwotdHlwZWRlZiBzdHJ1Y3QgIF9SVE1QX0RNQUJVRgotewotCVVMT05HICAgICAgICAgICAgICAgICAgIEFsbG9jU2l6ZTsKLQlQVk9JRCAgICAgICAgICAgICAgICAgICBBbGxvY1ZhOyAgICAgICAgICAgIC8vIFR4QnVmIHZpcnR1YWwgYWRkcmVzcwotCU5ESVNfUEhZU0lDQUxfQUREUkVTUyAgIEFsbG9jUGE7ICAgICAgICAgICAgLy8gVHhCdWYgcGh5c2ljYWwgYWRkcmVzcwotfSBSVE1QX0RNQUJVRiwgKlBSVE1QX0RNQUJVRjsKLQotCi0vLwotLy8gQ29udHJvbCBibG9jayAoRGVzY3JpcHRvcikgZm9yIGFsbCByaW5nIGRlc2NyaXB0b3IgRE1BIG9wZXJhdGlvbiwgYnVmZmVyIG11c3QgYmUKLS8vIGNvbnRpZ3VvdXMgcGh5c2ljYWwgbWVtb3J5LiBORElTX1BBQ0tFVCBzdG9yZWQgdGhlIGJpbmRpbmcgUnggcGFja2V0IGRlc2NyaXB0b3IKLS8vIHdoaWNoIHdvbid0IGJlIHJlbGVhc2VkLCBkcml2ZXIgaGFzIHRvIHdhaXQgdW50aWwgdXBwZXIgbGF5ZXIgcmV0dXJuIHRoZSBwYWNrZXQKLS8vIGJlZm9yZSBnaXZlaW5nIHVwIHRoaXMgcnggcmluZyBkZXNjcmlwdG9yIHRvIEFTSUMuIE5ESVNfQlVGRkVSIGlzIGFzc29jYWl0ZWQgcGFpcgotLy8gdG8gZGVzY3JpYmUgdGhlIHBhY2tldCBidWZmZXIuIEZvciBUeCwgTkRJU19QQUNLRVQgc3RvcmVkIHRoZSB0eCBwYWNrZXQgZGVzY3JpcHRvcgotLy8gd2hpY2ggZHJpdmVyIHNob3VsZCBBQ0sgdXBwZXIgbGF5ZXIgd2hlbiB0aGUgdHggaXMgcGh5c2ljYWxseSBkb25lIG9yIGZhaWxlZC4KLS8vCi10eXBlZGVmIHN0cnVjdCBfUlRNUF9ETUFDQgotewotCVVMT05HICAgICAgICAgICAgICAgICAgIEFsbG9jU2l6ZTsgICAgICAgICAgLy8gQ29udHJvbCBibG9jayBzaXplCi0JUFZPSUQgICAgICAgICAgICAgICAgICAgQWxsb2NWYTsgICAgICAgICAgICAvLyBDb250cm9sIGJsb2NrIHZpcnR1YWwgYWRkcmVzcwotCU5ESVNfUEhZU0lDQUxfQUREUkVTUyAgIEFsbG9jUGE7ICAgICAgICAgICAgLy8gQ29udHJvbCBibG9jayBwaHlzaWNhbCBhZGRyZXNzCi0JUE5ESVNfUEFDS0VUIHBOZGlzUGFja2V0OwotCVBORElTX1BBQ0tFVCBwTmV4dE5kaXNQYWNrZXQ7Ci0KLQlSVE1QX0RNQUJVRiAgICAgICAgICAgICBEbWFCdWY7ICAgICAgICAgICAgIC8vIEFzc29jaWF0ZWQgRE1BIGJ1ZmZlciBzdHJ1Y3R1cmUKLX0gUlRNUF9ETUFDQiwgKlBSVE1QX0RNQUNCOwotCi0KLXR5cGVkZWYgc3RydWN0IF9SVE1QX1RYX1JJTkcKLXsKLQlSVE1QX0RNQUNCICBDZWxsW1RYX1JJTkdfU0laRV07Ci0JVUlOVDMyCQlUeENwdUlkeDsKLQlVSU5UMzIJCVR4RG1hSWR4OwotCVVJTlQzMgkJVHhTd0ZyZWVJZHg7CS8vIHNvZnR3YXJlIG5leHQgZnJlZSB0eCBpbmRleAotfSBSVE1QX1RYX1JJTkcsICpQUlRNUF9UWF9SSU5HOwotCi10eXBlZGVmIHN0cnVjdCBfUlRNUF9SWF9SSU5HCi17Ci0JUlRNUF9ETUFDQiAgQ2VsbFtSWF9SSU5HX1NJWkVdOwotCVVJTlQzMgkJUnhDcHVJZHg7Ci0JVUlOVDMyCQlSeERtYUlkeDsKLQlJTlQzMgkJUnhTd1JlYWRJZHg7CS8vIHNvZnR3YXJlIG5leHQgcmVhZCBpbmRleAotfSBSVE1QX1JYX1JJTkcsICpQUlRNUF9SWF9SSU5HOwotCi10eXBlZGVmIHN0cnVjdCBfUlRNUF9NR01UX1JJTkcKLXsKLQlSVE1QX0RNQUNCICBDZWxsW01HTVRfUklOR19TSVpFXTsKLQlVSU5UMzIJCVR4Q3B1SWR4OwotCVVJTlQzMgkJVHhEbWFJZHg7Ci0JVUlOVDMyCQlUeFN3RnJlZUlkeDsgLy8gc29mdHdhcmUgbmV4dCBmcmVlIHR4IGluZGV4Ci19IFJUTVBfTUdNVF9SSU5HLCAqUFJUTVBfTUdNVF9SSU5HOwotCi0KLS8vCi0vLyAgU3RhdGlzdGljIGNvdW50ZXIgc3RydWN0dXJlCi0vLwotdHlwZWRlZiBzdHJ1Y3QgX0NPVU5URVJfODAyXzMKLXsKLQkvLyBHZW5lcmFsIFN0YXRzCi0JVUxPTkcgICAgICAgR29vZFRyYW5zbWl0czsKLQlVTE9ORyAgICAgICBHb29kUmVjZWl2ZXM7Ci0JVUxPTkcgICAgICAgVHhFcnJvcnM7Ci0JVUxPTkcgICAgICAgUnhFcnJvcnM7Ci0JVUxPTkcgICAgICAgUnhOb0J1ZmZlcjsKLQotCS8vIEV0aGVybmV0IFN0YXRzCi0JVUxPTkcgICAgICAgUmN2QWxpZ25tZW50RXJyb3JzOwotCVVMT05HICAgICAgIE9uZUNvbGxpc2lvbjsKLQlVTE9ORyAgICAgICBNb3JlQ29sbGlzaW9uczsKLQotfSBDT1VOVEVSXzgwMl8zLCAqUENPVU5URVJfODAyXzM7Ci0KLXR5cGVkZWYgc3RydWN0IF9DT1VOVEVSXzgwMl8xMSB7Ci0JVUxPTkcgICAgICAgICAgIExlbmd0aDsKLQlMQVJHRV9JTlRFR0VSICAgTGFzdFRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50OwotCUxBUkdFX0lOVEVHRVIgICBNdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgIEZhaWxlZENvdW50OwotCUxBUkdFX0lOVEVHRVIgICBSZXRyeUNvdW50OwotCUxBUkdFX0lOVEVHRVIgICBNdWx0aXBsZVJldHJ5Q291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgIFJUU1N1Y2Nlc3NDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgUlRTRmFpbHVyZUNvdW50OwotCUxBUkdFX0lOVEVHRVIgICBBQ0tGYWlsdXJlQ291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgIEZyYW1lRHVwbGljYXRlQ291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgIFJlY2VpdmVkRnJhZ21lbnRDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50OwotCUxBUkdFX0lOVEVHRVIgICBGQ1NFcnJvckNvdW50OwotfSBDT1VOVEVSXzgwMl8xMSwgKlBDT1VOVEVSXzgwMl8xMTsKLQotdHlwZWRlZiBzdHJ1Y3QgX0NPVU5URVJfUkFMSU5LIHsKLQlVTE9ORyAgICAgICAgICAgVHJhbnNtaXR0ZWRCeXRlQ291bnQ7ICAgLy8gYm90aCBzdWNjZXNzZnVsIGFuZCBmYWlsdXJlLCB1c2VkIHRvIGNhbGN1bGF0ZSBUWCB0aHJvdWdocHV0Ci0JVUxPTkcgICAgICAgICAgIFJlY2VpdmVkQnl0ZUNvdW50OyAgICAgIC8vIGJvdGggQ1JDIG9rYXkgYW5kIENSQyBlcnJvciwgdXNlZCB0byBjYWxjdWxhdGUgUlggdGhyb3VnaHB1dAotCVVMT05HICAgICAgICAgICBCZWVuRGlzYXNzb2NpYXRlZENvdW50OwotCVVMT05HICAgICAgICAgICBCYWRDUUlBdXRvUmVjb3ZlcnlDb3VudDsKLQlVTE9ORyAgICAgICAgICAgUG9vckNRSVJvYW1pbmdDb3VudDsKLQlVTE9ORyAgICAgICAgICAgTWdtdFJpbmdGdWxsQ291bnQ7Ci0JVUxPTkcgICAgICAgICAgIFJ4Q291bnRTaW5jZUxhc3ROVUxMOwotCVVMT05HICAgICAgICAgICBSeENvdW50OwotCVVMT05HICAgICAgICAgICBSeFJpbmdFcnJDb3VudDsKLQlVTE9ORyAgICAgICAgICAgS2lja1R4Q291bnQ7Ci0JVUxPTkcgICAgICAgICAgIFR4UmluZ0VyckNvdW50OwotCUxBUkdFX0lOVEVHRVIgICBSZWFsRmNzRXJyQ291bnQ7Ci0JVUxPTkcgICAgICAgICAgIFBlbmRpbmdOZGlzUGFja2V0Q291bnQ7Ci0KLQlVTE9ORyAgICAgICAgICAgT25lU2VjT3NUeENvdW50W05VTV9PRl9UWF9SSU5HXTsKLQlVTE9ORyAgICAgICAgICAgT25lU2VjRG1hRG9uZUNvdW50W05VTV9PRl9UWF9SSU5HXTsKLQlVSU5UMzIgICAgICAgICAgT25lU2VjVHhEb25lQ291bnQ7Ci0JVUxPTkcgICAgICAgICAgIE9uZVNlY1J4Q291bnQ7Ci0JVUlOVDMyICAgICAgICAgIE9uZVNlY1R4QWdncmVnYXRpb25Db3VudDsKLQlVSU5UMzIgICAgICAgICAgT25lU2VjUnhBZ2dyZWdhdGlvbkNvdW50OwotCVVJTlQzMiAgICAgICAgICBPbmVTZWNSZWNlaXZlZEJ5dGVDb3VudDsKLQlVSU5UMzIJCQlPbmVTZWNGcmFtZUR1cGxpY2F0ZUNvdW50OwotCi0JVUlOVDMyICAgICAgICAgIE9uZVNlY1RyYW5zbWl0dGVkQnl0ZUNvdW50OyAgIC8vIGJvdGggc3VjY2Vzc2Z1bCBhbmQgZmFpbHVyZSwgdXNlZCB0byBjYWxjdWxhdGUgVFggdGhyb3VnaHB1dAotCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeE5vUmV0cnlPa0NvdW50OwotCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeFJldHJ5T2tDb3VudDsKLQlVSU5UMzIgICAgICAgICAgT25lU2VjVHhGYWlsQ291bnQ7Ci0JVUlOVDMyICAgICAgICAgIE9uZVNlY0ZhbHNlQ0NBQ250OyAgICAgIC8vIENDQSBlcnJvciBjb3VudCwgZm9yIGRlYnVnIHB1cnBvc2UsIG1pZ2h0IG1vdmUgdG8gZ2xvYmFsIGNvdW50ZXIKLQlVSU5UMzIgICAgICAgICAgT25lU2VjUnhPa0NudDsgICAgICAgICAgLy8gUlggd2l0aG91dCBlcnJvcgotCVVJTlQzMiAgICAgICAgICBPbmVTZWNSeE9rRGF0YUNudDsgICAgICAvLyB1bmljYXN0LXRvLW1lIERBVEEgZnJhbWUgY291bnQKLQlVSU5UMzIgICAgICAgICAgT25lU2VjUnhGY3NFcnJDbnQ7ICAgICAgLy8gQ1JDIGVycm9yCi0JVUlOVDMyICAgICAgICAgIE9uZVNlY0JlYWNvblNlbnRDbnQ7Ci0JVUlOVDMyICAgICAgICAgIExhc3RPbmVTZWNUb3RhbFR4Q291bnQ7IC8vIE9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKyBPbmVTZWNUeFJldHJ5T2tDb3VudCArIE9uZVNlY1R4RmFpbENvdW50Ci0JVUlOVDMyICAgICAgICAgIExhc3RPbmVTZWNSeE9rRGF0YUNudDsgIC8vIE9uZVNlY1J4T2tEYXRhQ250Ci0JVUxPTkcJCUR1cGxpY2F0ZVJjdjsKLQlVTE9ORwkJVHhBZ2dDb3VudDsKLQlVTE9ORwkJVHhOb25BZ2dDb3VudDsKLQlVTE9ORwkJVHhBZ2cxTVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzJNUERVQ291bnQ7Ci0JVUxPTkcJCVR4QWdnM01QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2c0TVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzVNUERVQ291bnQ7Ci0JVUxPTkcJCVR4QWdnNk1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2c3TVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzhNUERVQ291bnQ7Ci0JVUxPTkcJCVR4QWdnOU1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2cxME1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2cxMU1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2cxMk1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2cxM01QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2cxNE1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2cxNU1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2cxNk1QRFVDb3VudDsKLQotCUxBUkdFX0lOVEVHRVIgICAgICAgVHJhbnNtaXR0ZWRPY3RldHNJbkFNU0RVOwotCUxBUkdFX0lOVEVHRVIgICAgICAgVHJhbnNtaXR0ZWRBTVNEVUNvdW50OwotCUxBUkdFX0lOVEVHRVIgICAgICAgUmVjZWl2ZWRPY3Rlc0luQU1TRFVDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgICAgIFJlY2VpdmVkQU1TRFVDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgICAgIFRyYW5zbWl0dGVkQU1QRFVDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgICAgIFRyYW5zbWl0dGVkTVBEVXNJbkFNUERVQ291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgICAgICBUcmFuc21pdHRlZE9jdGV0c0luQU1QRFVDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgICAgIE1QRFVJblJlY2VpdmVkQU1QRFVDb3VudDsKLX0gQ09VTlRFUl9SQUxJTkssICpQQ09VTlRFUl9SQUxJTks7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgX0NPVU5URVJfRFJTIHsKLQkvLyB0byByZWNvcmQgdGhlIGVhY2ggVFggcmF0ZSdzIHF1YWxpdHkuIDAgaXMgYmVzdCwgdGhlIGJpZ2dlciB0aGUgd29yc2UuCi0JVVNIT1JUICAgICAgICAgIFR4UXVhbGl0eVtNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSF07Ci0JVUNIQVIgICAgICAgICAgIFBFUltNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSF07Ci0JVUNIQVIgICAgICAgICAgIFR4UmF0ZVVwUGVuYWx0eTsgICAgICAvLyBleHRyYSAjIG9mIHNlY29uZCBwZW5hbHR5IGR1ZSB0byBsYXN0IHVuc3RhYmxlIGNvbmRpdGlvbgotCVVMT05HICAgICAgICAgICBDdXJyVHhSYXRlU3RhYmxlVGltZTsgLy8gIyBvZiBzZWNvbmQgaW4gY3VycmVudCBUWCByYXRlCi0JQk9PTEVBTiAgICAgICAgIGZOb2lzeUVudmlyb25tZW50OwotCUJPT0xFQU4gICAgICAgICBmTGFzdFNlY0FjY29yZGluZ1JTU0k7Ci0JVUNIQVIgICAgICAgICAgIExhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb247IC8vIDA6IG5vIGNoYW5nZSwgMTpyYXRlIFVQLCAyOnJhdGUgZG93bgotCVVDSEFSCQkJTGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb247IC8vS2VlcCBsYXN0IHRpbWUgdmFsdWUgb2YgTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbgotCVVMT05HCQkJTGFzdFR4T2tDb3VudDsKLX0gQ09VTlRFUl9EUlMsICpQQ09VTlRFUl9EUlM7Ci0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKglzZWN1cml0eSBrZXkgcmVsYXRlZCBkYXRhIHN0cnVjdHVyZQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0IF9DSVBIRVJfS0VZIHsKLQlVQ0hBUiAgIEtleVsxNl07ICAgICAgICAgICAgLy8gcmlnaHQgbm93IHdlIGltcGxlbWVudCA0IGtleXMsIDEyOCBiaXRzIG1heAotCVVDSEFSICAgUnhNaWNbOF07CQkJLy8gbWFrZSBhbGlnbm1lbnQKLQlVQ0hBUiAgIFR4TWljWzhdOwotCVVDSEFSICAgVHhUc2NbNl07ICAgICAgICAgICAvLyA0OGJpdCBUU0MgdmFsdWUKLQlVQ0hBUiAgIFJ4VHNjWzZdOyAgICAgICAgICAgLy8gNDhiaXQgVFNDIHZhbHVlCi0JVUNIQVIgICBDaXBoZXJBbGc7ICAgICAgICAgIC8vIDAtbm9uZSwgMTpXRVA2NCwgMjpXRVAxMjgsIDM6VEtJUCwgNDpBRVMsIDU6Q0tJUDY0LCA2OkNLSVAxMjgKLQlVQ0hBUiAgIEtleUxlbjsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlVQ0hBUiAgIEJzc0lkWzZdOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotICAgICAgICAgICAgLy8gS2V5IGxlbmd0aCBmb3IgZWFjaCBrZXksIDA6IGVudHJ5IGlzIGludmFsaWQKLQlVQ0hBUiAgIFR5cGU7ICAgICAgICAgICAgICAgLy8gSW5kaWNhdGUgUGFpcndpc2UvR3JvdXAgd2hlbiByZXBvcnRpbmcgTUlDIGVycm9yCi19IENJUEhFUl9LRVksICpQQ0lQSEVSX0tFWTsKLQotCi0vLyBzdHJ1Y3R1cmUgdG8gZGVmaW5lIFdQQSBHcm91cCBLZXkgUmVrZXkgSW50ZXJ2YWwKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlRfODAyXzExX1dQQV9SRUtFWSB7Ci0JVUxPTkcgUmVLZXlNZXRob2Q7ICAgICAgICAgIC8vIG1lY2hhbmlzbSBmb3IgcmVrZXlpbmc6IDA6ZGlzYWJsZSwgMTogdGltZS1iYXNlZCwgMjogcGFja2V0LWJhc2VkCi0JVUxPTkcgUmVLZXlJbnRlcnZhbDsgICAgICAgIC8vIHRpbWUtYmFzZWQ6IHNlY29uZHMsIHBhY2tldC1iYXNlZDoga2lsby1wYWNrZXRzCi19IFJUX1dQQV9SRUtFWSwqUFJUX1dQQV9SRUtFWSwgUlRfODAyXzExX1dQQV9SRUtFWSwgKlBSVF84MDJfMTFfV1BBX1JFS0VZOwotCi0KLQotdHlwZWRlZiBzdHJ1Y3QgewotCVVDSEFSICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07Ci0JVUNIQVIgICAgICAgIEVycm9yQ29kZVsyXTsgIC8vMDAgMDEtSW52YWxpZCBhdXRoZW50aWNhdGlvbiB0eXBlCi0JCQkJCQkJLy8wMCAwMi1BdXRoZW50aWNhdGlvbiB0aW1lb3V0Ci0JCQkJCQkJLy8wMCAwMy1DaGFsbGVuZ2UgZnJvbSBBUCBmYWlsZWQKLQkJCQkJCQkvLzAwIDA0LUNoYWxsZW5nZSB0byBBUCBmYWlsZWQKLQlCT09MRUFOICAgICAgUmVwb3J0ZWQ7Ci19IFJPR1VFQVBfRU5UUlksICpQUk9HVUVBUF9FTlRSWTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCVVDSEFSICAgICAgICAgICAgICAgUm9ndWVBcE5yOwotCVJPR1VFQVBfRU5UUlkgICAgICAgUm9ndWVBcEVudHJ5W01BWF9MRU5fT0ZfQlNTX1RBQkxFXTsKLX0gUk9HVUVBUF9UQUJMRSwgKlBST0dVRUFQX1RBQkxFOwotCi0vLwotLy8gQ2lzY28gSUFQUCBmb3JtYXQKLS8vCi10eXBlZGVmIHN0cnVjdCAgX0NJU0NPX0lBUFBfQ09OVEVOVF8KLXsKLQlVU0hPUlQgICAgIExlbmd0aDsgICAgICAgIC8vSUFQUCBMZW5ndGgKLQlVQ0hBUiAgICAgIE1lc3NhZ2VUeXBlOyAgICAgIC8vSUFQUCB0eXBlCi0JVUNIQVIgICAgICBGdW5jdGlvbkNvZGU7ICAgICAvL0lBUFAgZnVuY3Rpb24gdHlwZQotCVVDSEFSICAgICAgRGVzdGluYWlvbk1BQ1tNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgICAgU291cmNlTUFDW01BQ19BRERSX0xFTl07Ci0JVVNIT1JUICAgICBUYWc7ICAgICAgICAgICAvL1RhZyhlbGVtZW50IElFKSAtIEFkamFjZW50IEFQIHJlcG9ydAotCVVTSE9SVCAgICAgVGFnTGVuZ3RoOyAgICAgLy9MZW5ndGggb2YgZWxlbWVudCBub3QgaW5jbHVkaW5nIDQgYnl0ZSBoZWFkZXIKLQlVQ0hBUiAgICAgIE9VSVs0XTsgICAgICAgICAgIC8vMHgwMCwgMHg0MCwgMHg5NiwgMHgwMAotCVVDSEFSICAgICAgUHJldmlvdXNBUFtNQUNfQUREUl9MRU5dOyAgICAgICAvL01BQyBBZGRyZXNzIG9mIGFjY2VzcyBwb2ludAotCVVTSE9SVCAgICAgQ2hhbm5lbDsKLQlVU0hPUlQgICAgIFNzaWRMZW47Ci0JVUNIQVIgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07Ci0JVVNIT1JUICAgICBTZWNvbmRzOyAgICAgICAgICAvL1NlY29uZHMgdGhhdCB0aGUgY2xpZW50IGhhcyBiZWVuIGRpc2Fzc29jaWF0ZWQuCi19IENJU0NPX0lBUFBfQ09OVEVOVCwgKlBDSVNDT19JQVBQX0NPTlRFTlQ7Ci0KLQotLyoKLSAgKglGcmFnbWVudCBGcmFtZSBzdHJ1Y3R1cmUKLSAgKi8KLXR5cGVkZWYgc3RydWN0ICBfRlJBR01FTlRfRlJBTUUgewotCVBORElTX1BBQ0tFVCAgICBwRnJhZ1BhY2tldDsKLQlVTE9ORyAgICAgICBSeFNpemU7Ci0JVVNIT1JUICAgICAgU2VxdWVuY2U7Ci0JVVNIT1JUICAgICAgTGFzdEZyYWc7Ci0JVUxPTkcgICAgICAgRmxhZ3M7ICAgICAgICAgIC8vIFNvbWUgZXh0cmEgZnJhbWUgaW5mb3JtYXRpb24uIGJpdCAwOiBMTEMgcHJlc2VudGVkCi19IEZSQUdNRU5UX0ZSQU1FLCAqUEZSQUdNRU5UX0ZSQU1FOwotCi0KLS8vCi0vLyBQYWNrZXQgaW5mb3JtYXRpb24gZm9yIE5kaXNRdWVyeVBhY2tldAotLy8KLXR5cGVkZWYgc3RydWN0ICBfUEFDS0VUX0lORk8gICAgewotCVVJTlQgICAgICAgICAgICBQaHlzaWNhbEJ1ZmZlckNvdW50OyAgICAvLyBQaHlzaWNhbCBicmVha3Mgb2YgYnVmZmVyIGRlc2NyaXBvciBjaGFpbmVkCi0JVUlOVCAgICAgICAgICAgIEJ1ZmZlckNvdW50IDsgICAgICAgICAgIC8vIE51bWJlciBvZiBCdWZmZXIgZGVzY3JpcHRvciBjaGFpbmVkCi0JVUlOVCAgICAgICAgICAgIFRvdGFsUGFja2V0TGVuZ3RoIDsgICAgIC8vIFNlbGYgZXhwbGFpbmVkCi0JUE5ESVNfQlVGRkVSICAgIHBGaXJzdEJ1ZmZlcjsgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gZmlyc3QgYnVmZmVyIGRlc2NyaXB0b3IKLX0gUEFDS0VUX0lORk8sICpQUEFDS0VUX0lORk87Ci0KLQotLy8KLS8vICBBcmNmb3VyIFN0cnVjdHVyZSBBZGRlZCBieSBQYXVsV3UKLS8vCi10eXBlZGVmIHN0cnVjdCAgX0FSQ0ZPVVIKLXsKLQlVSU5UICAgICAgICAgICAgWDsKLQlVSU5UICAgICAgICAgICAgWTsKLQlVQ0hBUiAgICAgICAgICAgU1RBVEVbMjU2XTsKLX0gQVJDRk9VUkNPTlRFWFQsICpQQVJDRk9VUkNPTlRFWFQ7Ci0KLQotLy8KLS8vIFRraXAgS2V5IHN0cnVjdHVyZSB3aGljaCBSQzQga2V5ICYgTUlDIGNhbGN1bGF0aW9uCi0vLwotdHlwZWRlZiBzdHJ1Y3QgIF9US0lQX0tFWV9JTkZPICB7Ci0JVUlOVCAgICAgICAgbkJ5dGVzSW5NOyAgLy8gIyBieXRlcyBpbiBNIGZvciBNSUNLRVkKLQlVTE9ORyAgICAgICBJVjE2OwotCVVMT05HICAgICAgIElWMzI7Ci0JVUxPTkcgICAgICAgSzA7ICAgICAgICAgLy8gZm9yIE1JQ0tFWSBMb3cKLQlVTE9ORyAgICAgICBLMTsgICAgICAgICAvLyBmb3IgTUlDS0VZIEhpZwotCVVMT05HICAgICAgIEw7ICAgICAgICAgIC8vIEN1cnJlbnQgc3RhdGUgZm9yIE1JQ0tFWQotCVVMT05HICAgICAgIFI7ICAgICAgICAgIC8vIEN1cnJlbnQgc3RhdGUgZm9yIE1JQ0tFWQotCVVMT05HICAgICAgIE07ICAgICAgICAgIC8vIE1lc3NhZ2UgYWNjdW11bGF0b3IgZm9yIE1JQ0tFWQotCVVDSEFSICAgICAgIFJDNEtFWVsxNl07Ci0JVUNIQVIgICAgICAgTUlDWzhdOwotfSBUS0lQX0tFWV9JTkZPLCAqUFRLSVBfS0VZX0lORk87Ci0KLQotLy8KLS8vIFByaXZhdGUgLyBNaXNjIGRhdGEsIGNvdW50ZXJzIGZvciBkcml2ZXIgaW50ZXJuYWwgdXNlCi0vLwotdHlwZWRlZiBzdHJ1Y3QgIF9fUFJJVkFURV9TVFJVQyB7Ci0JVUlOVCAgICAgICBTeXN0ZW1SZXNldENudDsgICAgICAgICAvLyBTeXN0ZW0gcmVzZXQgY291bnRlcgotCVVJTlQgICAgICAgVHhSaW5nRnVsbENudDsgICAgICAgICAgLy8gVHggcmluZyBmdWxsIG9jY3VycmFuY2UgbnVtYmVyCi0JVUlOVCAgICAgICBQaHlSeEVyckNudDsgICAgICAgICAgICAvLyBQSFkgUnggZXJyb3IgY291bnQsIGZvciBkZWJ1ZyBwdXJwb3NlLCBtaWdodCBtb3ZlIHRvIGdsb2JhbCBjb3VudGVyCi0JLy8gVmFyaWFibGVzIGZvciBXRVAgZW5jcnlwdGlvbiAvIGRlY3J5cHRpb24gaW4gcnRtcF93ZXAuYwotCVVJTlQgICAgICAgRkNTQ1JDMzI7Ci0JQVJDRk9VUkNPTlRFWFQgIFdFUENPTlRFWFQ7Ci0JLy8gVGtpcCBzdHVmZgotCVRLSVBfS0VZX0lORk8gICBUeDsKLQlUS0lQX0tFWV9JTkZPICAgUng7Ci19IFBSSVZBVEVfU1RSVUMsICpQUFJJVkFURV9TVFJVQzsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoJQ2hhbm5lbCBhbmQgQkJQIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmVzCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy8gc3RydWN0dXJlIHRvIHR1bmUgQkJQIFI2NiAoQkJQIFRVTklORykKLXR5cGVkZWYgc3RydWN0IF9CQlBfUjY2X1RVTklORyB7Ci0JQk9PTEVBTiAgICAgYkVuYWJsZTsKLQlVU0hPUlQgICAgICBGYWxzZUNjYUxvd2VyVGhyZXNob2xkOyAgLy8gZGVmYXVsdCAxMDAKLQlVU0hPUlQgICAgICBGYWxzZUNjYVVwcGVyVGhyZXNob2xkOyAgLy8gZGVmYXVsdCA1MTIKLQlVQ0hBUiAgICAgICBSNjZEZWx0YTsKLQlVQ0hBUiAgICAgICBSNjZDdXJyZW50VmFsdWU7Ci0JQk9PTEVBTgkJUjY2TG93ZXJVcHBlclNlbGVjdDsgLy9CZWZvcmUgTGlua1VwLCBVc2VkIExvd2VyQm91bmQgb3IgVXBwZXJCb3VuZCBhcyBSNjYgdmFsdWUuCi19IEJCUF9SNjZfVFVOSU5HLCAqUEJCUF9SNjZfVFVOSU5HOwotCi0vLyBzdHJ1Y3R1cmUgdG8gc3RvcmUgY2hhbm5lbCBUWCBwb3dlcgotdHlwZWRlZiBzdHJ1Y3QgX0NIQU5ORUxfVFhfUE9XRVIgewotCVVTSE9SVCAgICAgUmVtYWluaW5nVGltZUZvclVzZTsJCS8vdW5pdDogc2VjCi0JVUNIQVIgICAgICBDaGFubmVsOwotI2lmZGVmIERPVDExTl9EUkFGVDMKLQlCT09MRUFOICAgICAgIGJFZmZlY3RlZENoYW5uZWw7CS8vIEZvciBCVyA0MCBvcGVyYXRpbmcgaW4gMi40R0h6ICwgdGhlICJlZmZlY3RlZCBjaGFubmVsIiBpcyB0aGUgY2hhbm5lbCB0aGF0IGlzIGNvdmVyZWQgaW4gNDBNaHouCi0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotCUNIQVIgICAgICAgUG93ZXI7Ci0JQ0hBUiAgICAgICBQb3dlcjI7Ci0JVUNIQVIgICAgICBNYXhUeFB3cjsKLQlVQ0hBUiAgICAgIERmc1JlcTsKLX0gQ0hBTk5FTF9UWF9QT1dFUiwgKlBDSEFOTkVMX1RYX1BPV0VSOwotCi0vLyBzdHJ1Y3R1cmUgdG8gc3RvcmUgODAyLjExaiBjaGFubmVsIFRYIHBvd2VyCi10eXBlZGVmIHN0cnVjdCBfQ0hBTk5FTF8xMUpfVFhfUE9XRVIgewotCVVDSEFSICAgICAgQ2hhbm5lbDsKLQlVQ0hBUiAgICAgIEJXOwkvLyBCV18xMCBvciBCV18yMAotCUNIQVIgICAgICAgUG93ZXI7Ci0JQ0hBUiAgICAgICBQb3dlcjI7Ci0JVVNIT1JUICAgICBSZW1haW5pbmdUaW1lRm9yVXNlOwkJLy91bml0OiBzZWMKLX0gQ0hBTk5FTF8xMUpfVFhfUE9XRVIsICpQQ0hBTk5FTF8xMUpfVFhfUE9XRVI7Ci0KLXR5cGVkZWYgc3RydWN0IF9TT0ZUX1JYX0FOVF9ESVZFUlNJVFlfU1RSVUNUIHsKLQlVQ0hBUiAgICAgRXZhbHVhdGVQZXJpb2Q7CQkgLy8gMDpub3QgZXZhbHV0ZSBzdGF0dXMsIDE6IGV2YWx1YXRlIHN0YXR1cywgMjogc3dpdGNoaW5nIHN0YXR1cwotCVVDSEFSICAgICBFdmFsdWF0ZVN0YWJsZUNudDsKLQlVQ0hBUiAgICAgUGFpcjFQcmltYXJ5UnhBbnQ7ICAgICAvLyAwOkFudC1FMSwgMTpBbnQtRTIKLQlVQ0hBUiAgICAgUGFpcjFTZWNvbmRhcnlSeEFudDsgICAvLyAwOkFudC1FMSwgMTpBbnQtRTIKLQlVQ0hBUiAgICAgUGFpcjJQcmltYXJ5UnhBbnQ7ICAgICAvLyAwOkFudC1FMywgMTpBbnQtRTQKLQlVQ0hBUiAgICAgUGFpcjJTZWNvbmRhcnlSeEFudDsgICAvLyAwOkFudC1FMywgMTpBbnQtRTQKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlTSE9SVCAgICAgUGFpcjFBdmdSc3NpWzJdOyAgICAgICAvLyBBdmdSc3NpWzBdOkUxLCBBdmdSc3NpWzFdOkUyCi0JU0hPUlQgICAgIFBhaXIyQXZnUnNzaVsyXTsgICAgICAgLy8gQXZnUnNzaVswXTpFMywgQXZnUnNzaVsxXTpFNAotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCVNIT1JUICAgICBQYWlyMUxhc3RBdmdSc3NpOyAgICAgIC8vCi0JU0hPUlQgICAgIFBhaXIyTGFzdEF2Z1Jzc2k7ICAgICAgLy8KLQlVTE9ORyAgICAgUmN2UGt0TnVtV2hlbkV2YWx1YXRlOwotCUJPT0xFQU4gICBGaXJzdFBrdEFycml2ZWRXaGVuRXZhbHVhdGU7Ci0JUkFMSU5LX1RJTUVSX1NUUlVDVCAgICBSeEFudERpdmVyc2l0eVRpbWVyOwotfSBTT0ZUX1JYX0FOVF9ESVZFUlNJVFksICpQU09GVF9SWF9BTlRfRElWRVJTSVRZOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKglzdHJ1Y3R1cmUgZm9yIHJhZGFyIGRldGVjdGlvbiBhbmQgY2hhbm5lbCBzd2l0Y2gKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdCBfUkFEQVJfREVURUNUX1NUUlVDVCB7Ci0gICAgLy9CT09MRUFOCQlJRUVFODAyMTFIOwkJCS8vIDA6IGRpc2FibGUsIDE6IGVuYWJsZSBJRUVFODAyLjExaAotCVVDSEFSCQlDU0NvdW50OwkJCS8vQ2hhbm5lbCBzd2l0Y2ggY291bnRlcgotCVVDSEFSCQlDU1BlcmlvZDsJCQkvL0NoYW5uZWwgc3dpdGNoIHBlcmlvZCAoYmVhY29uIGNvdW50KQotCVVDSEFSCQlSRENvdW50OwkJCS8vUmFkYXIgZGV0ZWN0aW9uIGNvdW50ZXIKLQlVQ0hBUgkJUkRNb2RlOwkJCQkvL1JhZGFyIERldGVjdGlvbiBtb2RlCi0JVUNIQVIJCVJERHVyUmVnaW9uOwkJLy9SYWRhciBkZXRlY3Rpb24gZHVyYXRpb24gcmVnaW9uCi0JVUNIQVIJCUJCUFIxNjsKLQlVQ0hBUgkJQkJQUjE3OwotCVVDSEFSCQlCQlBSMTg7Ci0JVUNIQVIJCUJCUFIyMTsKLQlVQ0hBUgkJQkJQUjIyOwotCVVDSEFSCQlCQlBSNjQ7Ci0JVUxPTkcJCUluU2VydmljZU1vbml0b3JDb3VudDsgLy8gdW5pdDogc2VjCi0JVUlOVDgJCURmc1Nlc3Npb25UaW1lOwotI2lmZGVmIERGU19GQ0NfQlc0MF9GSVgKLQlDSEFSCQlEZnNTZXNzaW9uRmNjT2ZmOwotI2VuZGlmCi0JQk9PTEVBTgkJYkZhc3REZnM7Ci0JVUlOVDgJCUNoTW92aW5nVGltZTsKLQlVSU5UOAkJTG9uZ1B1bHNlUmFkYXJUaDsKLSNpZmRlZiBNRVJHRV9BUkNIX1RFQU0KLQlDSEFSCQlBdmdSc3NpUmVxOwotCVVMT05HCQlEZnNMb3dlckxpbWl0OwotCVVMT05HCQlEZnNVcHBlckxpbWl0OwotCVVJTlQ4CQlGaXhEZnNMaW1pdDsKLQlVTE9ORwkJdXBwZXJsaW1pdDsKLQlVTE9ORwkJbG93ZXJsaW1pdDsKLSNlbmRpZiAvLyBNRVJHRV9BUkNIX1RFQU0gLy8KLX0gUkFEQVJfREVURUNUX1NUUlVDVCwgKlBSQURBUl9ERVRFQ1RfU1RSVUNUOwotCi0jaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAotdHlwZWRlZiBlbnVtIENEX1NUQVRFX24KLXsKLQlDRF9OT1JNQUwsCi0JQ0RfU0lMRU5DRSwKLQlDRF9NQVhfU1RBVEUKLX0gQ0RfU1RBVEU7Ci0KLSNpZmRlZiBUT05FX1JBREFSX0RFVEVDVF9TVVBQT1JUCi0jZGVmaW5lIENBUlJJRVJfREVURUNUX1JFQ0hFQ0tfVElNRQkJCTMKLQotCi0jaWZkZWYgQ0FSUklFUl9TRU5TRV9ORVdfQUxHTwotI2RlZmluZSBDQVJSSUVSX0RFVEVDVF9DUklUSVJJQQkJCQk0MDAKLSNkZWZpbmUgQ0FSUklFUl9ERVRFQ1RfU1RPUF9SQVRJTwkJCQkweDExCi0jZGVmaW5lCUNBUlJJRVJfREVURUNUX1NUT1BfUkFUSU9fT0xEXzMwOTAJCQkyCi0jZW5kaWYgLy8gQ0FSUklFUl9TRU5TRV9ORVdfQUxHTyAvLwotCi0KLSNkZWZpbmUgQ0FSUklFUl9ERVRFQ1RfU1RPUF9SRUNIRUNLX1RJTUUJCTQKLSNkZWZpbmUgQ0FSUklFUl9ERVRFQ1RfQ1JJVElSSUFfQQkJCQkyMzAKLSNkZWZpbmUgQ0FSUklFUl9ERVRFQ1RfREVMVEEJCQkJCTcKLSNkZWZpbmUgQ0FSUklFUl9ERVRFQ1RfRElWX0ZMQUcJCQkJMAotI2lmZGVmIFJUMzA5MAotI2RlZmluZSBDQVJSSUVSX0RFVEVDVF9USFJFU0hPTERfMzA5MEEJCQkweDFmZmZmZmZmCi0jZW5kaWYgLy8gUlQzMDkwIC8vCi0jaWZkZWYgUlQzMzkwCi0jZGVmaW5lIENBUlJJRVJfREVURUNUX1RIUkVTSE9MRAkJCTB4MGZmZmZmZmYKLSNlbmRpZiAvLyBSVDMzOTAgLy8KLSNpZm5kZWYgUlQzMzkwCi0jZGVmaW5lIENBUlJJRVJfREVURUNUX1RIUkVTSE9MRAkJCTB4MGZmZmZmZmYKLSNlbmRpZiAvLyBSVDMzOTAgLy8KLSNlbmRpZiAvLyBUT05FX1JBREFSX0RFVEVDVF9TVVBQT1JUIC8vCi0KLXR5cGVkZWYgc3RydWN0IENBUlJJRVJfREVURUNUSU9OX3MKLXsKLQlCT09MRUFOCQkJCQlFbmFibGU7Ci0JVUlOVDgJCQkJCUNEU2Vzc2lvblRpbWU7Ci0JVUlOVDgJCQkJCUNEUGVyaW9kOwotCUNEX1NUQVRFCQkJCUNEX1N0YXRlOwotI2lmZGVmIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQKLQlVSU5UOAkJCQkJZGVsdGE7Ci0JVUlOVDgJCQkJCWRpdl9mbGFnOwotCVVJTlQzMgkJCQkJdGhyZXNob2xkOwotCVVJTlQ4CQkJCQlyZWNoZWNrOwotCVVJTlQ4CQkJCQlyZWNoZWNrMTsKLQlVSU5UOAkJCQkJcmVjaGVjazI7Ci0JVUlOVDMyCQkJCQlUaW1lU3RhbXA7Ci0JVUlOVDMyCQkJCQljcml0ZXJpYTsKLQlVSU5UMzIJCQkJCUNhcnJpZXJEZWJ1ZzsKLQlVTE9ORwkJCQkJaWRsZV90aW1lOwotCVVMT05HCQkJCQlidXN5X3RpbWU7Ci0JVUxPTkcJCQkJCURlYnVnOwotI2VuZGlmIC8vIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQgLy8KLX1DQVJSSUVSX0RFVEVDVElPTl9TVFJVQ1QsICpQQ0FSUklFUl9ERVRFQ1RJT05fU1RSVUNUOwotI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KLQotCi0jaWZkZWYgTkVXX0RGUwotdHlwZWRlZiBzdHJ1Y3QgX05ld0RGU0RlYnVnCi17Ci0JVUNIQVIgY2hhbm5lbDsKLQlVTE9ORyB3YWl0X3RpbWU7Ci0JVUNIQVIgZGVsdGFfZGVsYXlfcmFuZ2U7Ci0JVUNIQVIgZGVsdGFfZGVsYXlfc3RlcDsKLQlVQ0hBUiBFTF9yYW5nZTsKLQlVQ0hBUiBFTF9zdGVwOwotCVVDSEFSIEVIX3JhbmdlOwotCVVDSEFSIEVIX3N0ZXA7Ci0JVUNIQVIgV0xfcmFuZ2U7Ci0JVUNIQVIgV0xfc3RlcDsKLQlVQ0hBUiBXSF9yYW5nZTsKLQlVQ0hBUiBXSF9zdGVwOwotCVVMT05HIFRfZXhwZWN0ZWQ7Ci0JVUxPTkcgVF9tYXJnaW47Ci0JVUNIQVIgc3RhcnQ7Ci0JVUxPTkcgY291bnQ7Ci0JVUxPTkcgaWR4OwotCi19TmV3REZTRGVidWcsICpwTmV3REZTRGVidWc7Ci0KLSNkZWZpbmUgTkVXX0RGU19GQ0NfNV9FTlRfTlVNCQk1Ci0jZGVmaW5lIE5FV19ERlNfREJHX1BPUlRfRU5UX05VTV9QT1dFUgk4Ci0jZGVmaW5lIE5FV19ERlNfREJHX1BPUlRfRU5UX05VTQkJKDEgPDwgTkVXX0RGU19EQkdfUE9SVF9FTlRfTlVNX1BPV0VSKSAgLy8gQ0UgRGVidWcgUG9ydCBlbnRyeSBudW1iZXIsIDI1NgotI2RlZmluZSBORVdfREZTX0RCR19QT1JUX01BU0sJMHhmZgotCi0vLyBNYXRjaGVkIFBlcmlvZCBkZWZpbml0aW9uCi0jZGVmaW5lIE5FV19ERlNfTVBFUklPRF9FTlRfTlVNX1BPV0VSCQk4Ci0jZGVmaW5lIE5FV19ERlNfTVBFUklPRF9FTlRfTlVNCQkoMSA8PCBORVdfREZTX01QRVJJT0RfRU5UX05VTV9QT1dFUikJIC8vIENFIFBlcmlvZCBUYWJsZSBlbnRyeSBudW1iZXIsIDUxMgotI2RlZmluZSBORVdfREZTX01BWF9DSEFOTkVMCTQKLQotdHlwZWRlZiBzdHJ1Y3QgX05ld0RGU0RlYnVnUG9ydHsKLQlVTE9ORyBjb3VudGVyOwotCVVMT05HIHRpbWVzdGFtcDsKLQlVU0hPUlQgd2lkdGg7Ci0JVVNIT1JUIHN0YXJ0X2lkeDsgLy8gc3RhcnQgaW5kZXggdG8gcGVyaW9kIHRhYmxlCi0JVVNIT1JUIGVuZF9pZHg7IC8vIGVuZCBpbmRleCB0byBwZXJpb2QgdGFibGUKLX1OZXdERlNEZWJ1Z1BvcnQsICpwTmV3REZTRGVidWdQb3J0OwotCi0vLyBNYXRjaGVkIFBlcmlvZCBUYWJsZQotdHlwZWRlZiBzdHJ1Y3QgX05ld0RGU01QZXJpb2R7Ci0JVVNIT1JUCWlkeDsKLQlVU0hPUlQgd2lkdGg7Ci0JVVNIT1JUCWlkeDI7Ci0JVVNIT1JUIHdpZHRoMjsKLQlVTE9ORyBwZXJpb2Q7Ci19TmV3REZTTVBlcmlvZCwgKnBOZXdERlNNUGVyaW9kOwotCi0jZW5kaWYgLy8gTkVXX0RGUyAvLwotCi0KLXR5cGVkZWYgZW51bSBfQUJHQkFORF9TVEFURV8gewotCVVOS05PV05fQkFORCwKLQlCR19CQU5ELAotCUFfQkFORCwKLX0gQUJHQkFORF9TVEFURTsKLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotLy8gUG93ZXIgc2F2ZSBtZXRob2QgY29udHJvbAotdHlwZWRlZgl1bmlvbglfUFNfQ09OVFJPTAl7Ci0Jc3RydWN0CXsKLQkJVUxPTkcJCUVuYWJsZVBTaW5JZGxlOjE7CQkJLy8gRW5hYmxlIHJhZGlvIG9mZiB3aGVuIG5vdCBjb25uZWN0IHRvIEFQLiByYWRpbyBvbiBvbmx5IHdoZW4gc2l0ZXN1cnZleSwKLQkJVUxPTkcJCUVuYWJsZU5ld1BTOjE7CQkvLyBFbmFibGUgbmV3ICBDaGlwIHBvd2VyIHNhdmUgZnVjbnRpb24gLiBOZXcgbWV0aG9kIGNhbiBvbmx5IGJlIGFwcGxpZWQgaW4gY2hpcCB2ZXJzaW9uIGFmdGVyIDI4NzIuIGFuZCBQQ0llLgotCQlVTE9ORwkJcnQzMHh4UG93ZXJNb2RlOjI7CQkJLy8gUG93ZXIgTGV2ZWwgTW9kZSBmb3IgcnQzMHh4IGNoaXAKLQkJVUxPTkcJCXJ0MzB4eEZvbGxvd0hvc3RBU1BNOjE7CQkJLy8gQ2FyZCBGb2xsb3dzIEhvc3QncyBzZXR0aW5nIGZvciBydDMweHggY2hpcC4KLQkJVUxPTkcJCXJ0MzB4eEZvcmNlQVNQTVRlc3Q6MTsJCQkvLyBGb3JjZSBlbmFibGUgTDEgZm9yIHJ0MzB4eCBjaGlwLiBUaGlzIGhhcyBoaWdoZXIgcHJpb3JpdHkgdGhhbiBydDMweHhGb2xsb3dIb3N0QVNQTSBNb2RlLgotCQlVTE9ORwkJcnN2OjI2OwkJCS8vIFJhZGlvIE1lYXN1cmVtZW50IEVuYWJsZQotCX0JZmllbGQ7Ci0JVUxPTkcJCQl3b3JkOwotfQlQU19DT05UUk9MLCAqUFBTX0NPTlRST0w7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoJc3RydWN0dXJlIGZvciBNTE1FIHN0YXRlIG1hY2hpbmUKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdCBfTUxNRV9TVFJVQ1QgewotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCS8vIFNUQSBzdGF0ZSBtYWNoaW5lcwotCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIENudGxNYWNoaW5lOwotCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIEFzc29jTWFjaGluZTsKLQlTVEFURV9NQUNISU5FICAgICAgICAgICBBdXRoTWFjaGluZTsKLQlTVEFURV9NQUNISU5FICAgICAgICAgICBBdXRoUnNwTWFjaGluZTsKLQlTVEFURV9NQUNISU5FICAgICAgICAgICBTeW5jTWFjaGluZTsKLQlTVEFURV9NQUNISU5FICAgICAgICAgICBXcGFQc2tNYWNoaW5lOwotCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIExlYXBNYWNoaW5lOwotCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIEFzc29jRnVuY1tBU1NPQ19GVU5DX1NJWkVdOwotCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIEF1dGhGdW5jW0FVVEhfRlVOQ19TSVpFXTsKLQlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBBdXRoUnNwRnVuY1tBVVRIX1JTUF9GVU5DX1NJWkVdOwotCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIFN5bmNGdW5jW1NZTkNfRlVOQ19TSVpFXTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBBY3RGdW5jW0FDVF9GVU5DX1NJWkVdOwotCS8vIEFjdGlvbgotCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIEFjdE1hY2hpbmU7Ci0KLQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCVNUQVRFX01BQ0hJTkUJCQlEbHNNYWNoaW5lOwotCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIERsc0Z1bmNbRExTX0ZVTkNfU0laRV07Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLQotCS8vIGNvbW1vbiBXUEEgc3RhdGUgbWFjaGluZQotCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIFdwYU1hY2hpbmU7Ci0JU1RBVEVfTUFDSElORV9GVU5DICAgICAgV3BhRnVuY1tXUEFfRlVOQ19TSVpFXTsKLQotCi0KLQlVTE9ORyAgICAgICAgICAgICAgICAgICBDaGFubmVsUXVhbGl0eTsgIC8vIDAuLjEwMCwgQ2hhbm5lbCBRdWFsaXR5IEluZGljYXRpb24gZm9yIFJvYW1pbmcKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBOb3czMjsgICAgICAgICAgIC8vIGxhdGNoIHRoZSB2YWx1ZSBvZiBOZGlzR2V0U3lzdGVtVXBUaW1lKCkKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBMYXN0U2VuZE5VTExwc21UaW1lOwotCi0JQk9PTEVBTiAgICAgICAgICAgICAgICAgYlJ1bm5pbmc7Ci0JTkRJU19TUElOX0xPQ0sgICAgICAgICAgVGFza0xvY2s7Ci0JTUxNRV9RVUVVRSAgICAgICAgICAgICAgUXVldWU7Ci0KLQlVSU5UICAgICAgICAgICAgICAgICAgICBTaGlmdFJlZzsKLQotCVJBTElOS19USU1FUl9TVFJVQ1QgICAgIFBlcmlvZGljVGltZXI7Ci0JUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgQVBTRFBlcmlvZGljVGltZXI7Ci0JUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgTGlua0Rvd25UaW1lcjsKLQlSQUxJTktfVElNRVJfU1RSVUNUICAgICBMaW5rVXBUaW1lcjsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICBiUHNQb2xsVGltZXJSdW5uaW5nOwotICAgIFJBTElOS19USU1FUl9TVFJVQ1QgICAgIFBzUG9sbFRpbWVyOwotCVJBTElOS19USU1FUl9TVFJVQ1QgICAgIFJhZGlvT25PZmZUaW1lcjsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQlVTE9ORyAgICAgICAgICAgICAgICAgICBQZXJpb2RpY1JvdW5kOwotCVVMT05HICAgICAgICAgICAgICAgICAgIE9uZVNlY1BlcmlvZGljUm91bmQ7Ci0KLQlVQ0hBUgkJCQkJUmVhbFJ4UGF0aDsKLQlCT09MRUFOCQkJCQliTG93VGhyb3VnaHB1dDsKLQlCT09MRUFOCQkJCQliRW5hYmxlQXV0b0FudGVubmFDaGVjazsKLQlSQUxJTktfVElNRVJfU1RSVUNUCQlSeEFudEV2YWxUaW1lcjsKLQotI2lmZGVmIFJUMzB4eAotCVVDSEFSIENhbGlCVzQwUmZSMjQ7Ci0JVUNIQVIgQ2FsaUJXMjBSZlIyNDsKLSNlbmRpZiAvLyBSVDMweHggLy8KLQotfSBNTE1FX1NUUlVDVCwgKlBNTE1FX1NUUlVDVDsKLQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoJODAyLjExIE4gcmVsYXRlZCBkYXRhIHN0cnVjdHVyZXMKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgcmVvcmRlcmluZ19tcGR1Ci17Ci0Jc3RydWN0IHJlb3JkZXJpbmdfbXBkdQkqbmV4dDsKLQlQTkRJU19QQUNLRVQJCQlwUGFja2V0OwkJLyogY292ZXJ0ZWQgdG8gODAyLjMgZnJhbWUgKi8KLQlpbnQJCQkJCQlTZXF1ZW5jZTsJCS8qIHNlcXVlbmNlIG51bWJlciBvZiBNUERVICovCi0JQk9PTEVBTgkJCQkJYkFNU0RVOwotfTsKLQotc3RydWN0IHJlb3JkZXJpbmdfbGlzdAotewotCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm5leHQ7Ci0JaW50CXFsZW47Ci19OwotCi1zdHJ1Y3QgcmVvcmRlcmluZ19tcGR1X3Bvb2wKLXsKLQlQVk9JRAkJCQkJbWVtOwotCU5ESVNfU1BJTl9MT0NLCQkJbG9jazsKLQlzdHJ1Y3QgcmVvcmRlcmluZ19saXN0CWZyZWVsaXN0OwotfTsKLQotdHlwZWRlZiBlbnVtIF9SRUNfQkxPQ0tBQ0tfU1RBVFVTCi17Ci0gICAgUmVjaXBpZW50X05PTkU9MCwKLQlSZWNpcGllbnRfVVNFRCwKLQlSZWNpcGllbnRfSGFuZGxlUmVzLAotICAgIFJlY2lwaWVudF9BY2NlcHQKLX0gUkVDX0JMT0NLQUNLX1NUQVRVUywgKlBSRUNfQkxPQ0tBQ0tfU1RBVFVTOwotCi10eXBlZGVmIGVudW0gX09SSV9CTE9DS0FDS19TVEFUVVMKLXsKLSAgICBPcmlnaW5hdG9yX05PTkU9MCwKLQlPcmlnaW5hdG9yX1VTRUQsCi0gICAgT3JpZ2luYXRvcl9XYWl0UmVzLAotICAgIE9yaWdpbmF0b3JfRG9uZQotfSBPUklfQkxPQ0tBQ0tfU1RBVFVTLCAqUE9SSV9CTE9DS0FDS19TVEFUVVM7Ci0KLXR5cGVkZWYgc3RydWN0IF9CQV9PUklfRU5UUll7Ci0JVUNIQVIgICBXY2lkOwotCVVDSEFSICAgVElEOwotCVVDSEFSICAgQkFXaW5TaXplOwotCVVDSEFSICAgVG9rZW47Ci0vLyBTZXF1ZW5jZSBpcyB0byBmaWxsIGV2ZXJ5IG91dGdvaW5nIFFvUyBEQVRBIGZyYW1lJ3Mgc2VxdWVuY2UgZmllbGQgaW4gODAyLjExIGhlYWRlci4KLQlVU0hPUlQJU2VxdWVuY2U7Ci0JVVNIT1JUCVRpbWVPdXRWYWx1ZTsKLQlPUklfQkxPQ0tBQ0tfU1RBVFVTICBPUklfQkFfU3RhdHVzOwotCVJBTElOS19USU1FUl9TVFJVQ1QgT1JJQkFUaW1lcjsKLQlQVk9JRAlwQWRhcHRlcjsKLX0gQkFfT1JJX0VOVFJZLCAqUEJBX09SSV9FTlRSWTsKLQotdHlwZWRlZiBzdHJ1Y3QgX0JBX1JFQ19FTlRSWSB7Ci0JVUNIQVIgICBXY2lkOwotCVVDSEFSICAgVElEOwotCVVDSEFSICAgQkFXaW5TaXplOwkvLyA3LjMuMS4xNC4gZWFjaCBidWZmZXIgaXMgY2FwYWJsZSBvZiBob2xkaW5nIGEgbWF4IEFNU0RVIG9yIE1TRFUuCi0JLy9VQ0hBUglOdW1PZlJ4UGt0OwotCS8vVUNIQVIgICAgQ3VyaW5kaWR4OyAvLyB0aGUgaGVhZCBpbiB0aGUgUlggcmVvcmRlcmluZyBidWZmZXIKLQlVU0hPUlQJCUxhc3RJbmRTZXE7Ci0vLwlVU0hPUlQJCUxhc3RJbmRTZXFBdFRpbWVyOwotCVVTSE9SVAkJVGltZU91dFZhbHVlOwotCVJBTElOS19USU1FUl9TVFJVQ1QgUkVDQkFUaW1lcjsKLQlVTE9ORwkJTGFzdEluZFNlcUF0VGltZXI7Ci0JVUxPTkcJCW5Ecm9wUGFja2V0OwotCVVMT05HCQlyY3ZTZXE7Ci0JUkVDX0JMT0NLQUNLX1NUQVRVUyAgUkVDX0JBX1N0YXR1czsKLS8vCVVDSEFSCVJ4QnVmSWR4VXNlZDsKLQkvLyBjb3JyZXNwb25kaW5nIHZpcnR1YWwgYWRkcmVzcyBmb3IgUlggcmVvcmRlcmluZyBwYWNrZXQgc3RvcmFnZS4KLQkvL1JUTVBfUkVPUkRFUkRNQUJVRiBNQVBfUlhCdWZbTUFYX1JYX1JFT1JERVJCVUZdOwotCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIFJ4UmVSaW5nTG9jazsgICAgICAgICAgICAgICAgIC8vIFJ4IFJpbmcgc3BpbmxvY2sKLS8vCXN0cnVjdCBfQkFfUkVDX0VOVFJZICpwTmV4dDsKLQlQVk9JRAlwQWRhcHRlcjsKLQlzdHJ1Y3QgcmVvcmRlcmluZ19saXN0CWxpc3Q7Ci19IEJBX1JFQ19FTlRSWSwgKlBCQV9SRUNfRU5UUlk7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgewotCVVMT05HCQludW1Bc1JlY2lwaWVudDsJCS8vIEkgYW0gcmVjaXBpZW50IG9mIG51bUFzUmVjaXBpZW50IGNsaWVudHMuIFRoZXNlIGNsaWVudCBhcmUgaW4gdGhlIEJBUmVjRW50cnlbXQotCVVMT05HCQludW1Bc09yaWdpbmF0b3I7CS8vIEkgYW0gb3JpZ2luYXRvciBvZgludW1Bc09yaWdpbmF0b3IgY2xpZW50cy4gVGhlc2UgY2xpZW50cyBhcmUgaW4gdGhlIEJBT3JpRW50cnlbXQotCVVMT05HCQludW1Eb25lT3JpZ2luYXRvcjsJLy8gY291bnQgRG9uZSBPcmlnaW5hdG9yIHNlc3Npb25zCi0JQkFfT1JJX0VOVFJZICAgICAgIEJBT3JpRW50cnlbTUFYX0xFTl9PRl9CQV9PUklfVEFCTEVdOwotCUJBX1JFQ19FTlRSWSAgICAgICBCQVJlY0VudHJ5W01BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFXTsKLX0gQkFfVEFCTEUsICpQQkFfVEFCTEU7Ci0KLS8vRm9yIFF1cmV5QkFUYWJsZU9JRCB1c2U7Ci10eXBlZGVmIHN0cnVjdCAgUEFDS0VEIF9PSURfQkFfUkVDX0VOVFJZewotCVVDSEFSICAgTUFDQWRkcltNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgQmFCaXRtYXA7ICAgLy8gaWYgKEJhQml0bWFwJigxPDxUSUQpKSwgdGhpcyBzZXNzaW9uIHdpdGh7TUFDQWRkciwgVElEfWV4aXN0cywgc28gcmVhZCBCdWZTaXplW1RJRF0gZm9yIEJ1ZmZlclNpemUKLQlVQ0hBUiAgIHJzdjsKLQlVQ0hBUiAgIEJ1ZlNpemVbOF07Ci0JUkVDX0JMT0NLQUNLX1NUQVRVUwlSRUNfQkFfU3RhdHVzWzhdOwotfSBPSURfQkFfUkVDX0VOVFJZLCAqUE9JRF9CQV9SRUNfRU5UUlk7Ci0KLS8vRm9yIFF1cmV5QkFUYWJsZU9JRCB1c2U7Ci10eXBlZGVmIHN0cnVjdCAgUEFDS0VEIF9PSURfQkFfT1JJX0VOVFJZewotCVVDSEFSICAgTUFDQWRkcltNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgQmFCaXRtYXA7ICAvLyBpZiAoQmFCaXRtYXAmKDE8PFRJRCkpLCB0aGlzIHNlc3Npb24gd2l0aHtNQUNBZGRyLCBUSUR9ZXhpc3RzLCBzbyByZWFkIEJ1ZlNpemVbVElEXSBmb3IgQnVmZmVyU2l6ZSwgcmVhZCBPUklfQkFfU3RhdHVzW1RJRF0gZm9yIHN0YXR1cwotCVVDSEFSICAgcnN2OwotCVVDSEFSICAgQnVmU2l6ZVs4XTsKLQlPUklfQkxPQ0tBQ0tfU1RBVFVTICBPUklfQkFfU3RhdHVzWzhdOwotfSBPSURfQkFfT1JJX0VOVFJZLCAqUE9JRF9CQV9PUklfRU5UUlk7Ci0KLXR5cGVkZWYgc3RydWN0IF9RVUVSWUJBX1RBQkxFewotCU9JRF9CQV9PUklfRU5UUlkgICAgICAgQkFPcmlFbnRyeVszMl07Ci0JT0lEX0JBX1JFQ19FTlRSWSAgICAgICBCQVJlY0VudHJ5WzMyXTsKLQlVQ0hBUiAgIE9yaU51bTsvLyBOdW1iZXIgb2YgYmVsb3cgQkFPcmlFbnRyeQotCVVDSEFSICAgUmVjTnVtOy8vIE51bWJlciBvZiBiZWxvdyBCQVJlY0VudHJ5Ci19IFFVRVJZQkFfVEFCTEUsICpQUVVFUllCQV9UQUJMRTsKLQotdHlwZWRlZgl1bmlvbglfQkFDQVBfU1RSVUMJewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlzdHJ1Y3QJewotCQlVSU5UMzIgICAgIDo0OwotCQlVSU5UMzIgICAgIGIyMDQwQ29leGlzdFNjYW5TdXA6MTsJCS8vQXMgU3RhLCBzdXBwb3J0IGRvIDIwNDAgY29leGlzdGVuY2Ugc2NhbiBmb3IgQVAuIEFzIEFwLCBzdXBwb3J0IG1vbml0b3IgdHJpZ2dlciBldmVudCB0byBjaGVjayBpZiBjYW4gdXNlIEJXIDQwTUh6LgotCQlVSU5UMzIgICAgIGJIdEFkaG9jOjE7CQkJLy8gYWRob2MgY2FuIHVzZSBodCByYXRlLgotCQlVSU5UMzIgICAgIE1NUFNtb2RlOjI7CS8vIE1JTU8gcG93ZXIgc2F2ZSBtb3JlLCAwOnN0YXRpYywgMTpkeW5hbWljLCAyOnJzdiwgMzptaW1vIGVuYWJsZQotCQlVSU5UMzIgICAgIEFtc2R1U2l6ZToxOwkvLyAwOjM4MzksIDE6NzkzNSBieXRlcy4gVUlOVCAgTVNEVVNpemVUb0J5dGVzW10JPSB7IDM4MzksIDc5MzV9OwotCQlVSU5UMzIgICAgIEFtc2R1RW5hYmxlOjE7CS8vRW5hYmxlIEFNU0RVIHRyYW5zbWlzc3Rpb24KLQkJVUlOVDMyCQlNcGR1RGVuc2l0eTozOwotCQlVSU5UMzIJCVBvbGljeToyOwkvLyAwOiBERUxBWV9CQSAxOklNTUVEX0JBICAoLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUpICAgMjpCQS1ub3QgdXNlCi0JCVVJTlQzMgkJQXV0b0JBOjE7CS8vIGF1dG9tYXRpY2FsbHkgQkEKLQkJVUlOVDMyCQlUeEJBV2luTGltaXQ6ODsKLQkJVUlOVDMyCQlSeEJBV2luTGltaXQ6ODsKLQl9CWZpZWxkOwotI2Vsc2UKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCVJ4QkFXaW5MaW1pdDo4OwotCQlVSU5UMzIJCVR4QkFXaW5MaW1pdDo4OwotCQlVSU5UMzIJCUF1dG9CQToxOwkvLyBhdXRvbWF0aWNhbGx5IEJBCi0JCVVJTlQzMgkJUG9saWN5OjI7CS8vIDA6IERFTEFZX0JBIDE6SU1NRURfQkEgICgvL0JBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZSkgICAyOkJBLW5vdCB1c2UKLQkJVUlOVDMyCQlNcGR1RGVuc2l0eTozOwotCQlVSU5UMzIJCUFtc2R1RW5hYmxlOjE7CS8vRW5hYmxlIEFNU0RVIHRyYW5zbWlzc3Rpb24KLQkJVUlOVDMyCQlBbXNkdVNpemU6MTsJLy8gMDozODM5LCAxOjc5MzUgYnl0ZXMuIFVJTlQgIE1TRFVTaXplVG9CeXRlc1tdCT0geyAzODM5LCA3OTM1fTsKLQkJVUlOVDMyCQlNTVBTbW9kZToyOwkvLyBNSU1PIHBvd2VyIHNhdmUgbW9yZSwgMDpzdGF0aWMsIDE6ZHluYW1pYywgMjpyc3YsIDM6bWltbyBlbmFibGUKLQkJVUlOVDMyCQliSHRBZGhvYzoxOwkJCS8vIGFkaG9jIGNhbiB1c2UgaHQgcmF0ZS4KLQkJVUlOVDMyCQliMjA0MENvZXhpc3RTY2FuU3VwOjE7CQkvL0FzIFN0YSwgc3VwcG9ydCBkbyAyMDQwIGNvZXhpc3RlbmNlIHNjYW4gZm9yIEFQLiBBcyBBcCwgc3VwcG9ydCBtb25pdG9yIHRyaWdnZXIgZXZlbnQgdG8gY2hlY2sgaWYgY2FuIHVzZSBCVyA0ME1Iei4KLQkJVUlOVDMyCQk6NDsKLQl9CWZpZWxkOwotI2VuZGlmCi0JVUlOVDMyCQkJd29yZDsKLX0gQkFDQVBfU1RSVUMsICpQQkFDQVBfU1RSVUM7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgewotCUJPT0xFQU4JCUlzUmVjaXBpZW50OwotCVVDSEFSICAgTUFDQWRkcltNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgVElEOwotCVVDSEFSICAgbk1TRFU7Ci0JVVNIT1JUICAgVGltZU91dDsKLQlCT09MRUFOIGJBbGxUaWQ7ICAvLyBJZiBUcnVlLCBkZWxldGUgYWxsIFRJRCBmb3IgQkEgc2Vzc2lvbnMgd2l0aCB0aGlzIE1BQ2FkZHIuCi19IE9JRF9BRERfQkFfRU5UUlksICpQT0lEX0FERF9CQV9FTlRSWTsKLQotCi0jaWZkZWYgRE9UMTFOX0RSQUZUMwotdHlwZWRlZiBlbnVtIF9CU1MyMDQwQ09FWElTVF9GTEFHewotCUJTU18yMDQwX0NPRVhJU1RfRElTQUJMRSA9IDAsCi0JQlNTXzIwNDBfQ09FWElTVF9USU1FUl9GSVJFRCAgPSAxLAotCUJTU18yMDQwX0NPRVhJU1RfSU5GT19TWU5DID0gMiwKLQlCU1NfMjA0MF9DT0VYSVNUX0lORk9fTk9USUZZID0gNCwKLX1CU1MyMDQwQ09FWElTVF9GTEFHOwotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLQotI2RlZmluZSBJU19IVF9TVEEoX3BNYWNFbnRyeSkJXAotCShfcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQotCi0jZGVmaW5lIElTX0hUX1JBVEUoX3BNYWNFbnRyeSkJXAotCShfcE1hY0VudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQotCi0jZGVmaW5lIFBFRVJfSVNfSFRfUkFURShfcE1hY0VudHJ5KQlcCi0JKF9wTWFjRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCi0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCi0vL1RoaXMgc3RydWN0dXJlIGlzIGZvciBhbGwgODAyLjExbiBjYXJkIEludGVyT3B0aWJpbGl0eVRlc3QgYWN0aW9uLiBSZXNldCBhbGwgTnVtIGV2ZXJ5IG4gc2Vjb25kLiAgKERldGFpbHMgc2VlIE1MTUVQZXJpb2RpYykKLXR5cGVkZWYJc3RydWN0CV9JT1RfU1RSVUMJewotCVVDSEFSCQkJVGhyZXNob2xkWzJdOwotCVVDSEFSCQkJUmVvcmRlclRpbWVPdXROdW1bTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEVdOwkvLyBjb21wYXJlIHdpdGggdGhyZXNob2xkWzBdCi0JVUNIQVIJCQlSZWZyZXNoTnVtW01BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFXTsJLy8gY29tcGFyZSB3aXRoIHRocmVzaG9sZFsxXQotCVVMT05HCQkJT25lU2VjSW5XaW5kb3dDb3VudDsKLQlVTE9ORwkJCU9uZVNlY0ZyYW1lRHVwbGljYXRlQ291bnQ7Ci0JVUxPTkcJCQlPbmVTZWNPdXRXaW5kb3dDb3VudDsKLQlVQ0hBUgkJCURlbE9yaUFjdDsKLQlVQ0hBUgkJCURlbFJlY0FjdDsKLQlVQ0hBUgkJCVJUU1Nob3J0UHJvdDsKLQlVQ0hBUgkJCVJUU0xvbmdQcm90OwotCUJPT0xFQU4JCQliUlRTTG9uZ1Byb3RPbjsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlCT09MRUFOCQkJYkxhc3RBdGhlcm9zOwotICAgIEJPT0xFQU4JCQliQ3VycmVudEF0aGVyb3M7Ci0gICAgQk9PTEVBTiAgICAgICAgIGJOb3dBdGhlcm9zQnVyc3RPbjsKLQlCT09MRUFOCQkJYk5leHREaXNhYmxlUnhCQTsKLSAgICBCT09MRUFOCQkJYlRvZ2dsZTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLX0gSU9UX1NUUlVDLCAqUElPVF9TVFJVQzsKLQotCi0vLyBUaGlzIGlzIHRoZSByZWdpc3RyeSBzZXR0aW5nIGZvciA4MDIuMTFuIHRyYW5zbWl0IHNldHRpbmcuICBVc2VkIGluIGFkdmFuY2VkIHBhZ2UuCi10eXBlZGVmIHVuaW9uIF9SRUdfVFJBTlNNSVRfU0VUVElORyB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotIHN0cnVjdCB7Ci0gICAgICAgICBVSU5UMzIgIHJzdjoxMzsKLQkJIFVJTlQzMiAgRVhUQ0hBOjI7Ci0JCSBVSU5UMzIgIEhUTU9ERToxOwotCQkgVUlOVDMyICBUUkFOU05POjI7Ci0JCSBVSU5UMzIgIFNUQkM6MTsgLy9TUEFDRQotCQkgVUlOVDMyICBTaG9ydEdJOjE7Ci0JCSBVSU5UMzIgIEJXOjE7IC8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6Ci0JCSBVSU5UMzIgIFR4QkY6MTsgLy8gMyozCi0JCSBVSU5UMzIgIHJzdjA6MTA7Ci0JCSAvL1VJTlQzMiAgTUNTOjc7ICAgICAgICAgICAgICAgICAvLyBNQ1MKLSAgICAgICAgIC8vVUlOVDMyICBQaHlNb2RlOjQ7Ci0gICAgfSBmaWVsZDsKLSNlbHNlCi0gc3RydWN0IHsKLSAgICAgICAgIC8vVUlOVDMyICBQaHlNb2RlOjQ7Ci0gICAgICAgICAvL1VJTlQzMiAgTUNTOjc7ICAgICAgICAgICAgICAgICAvLyBNQ1MKLQkJIFVJTlQzMiAgcnN2MDoxMDsKLQkJIFVJTlQzMiAgVHhCRjoxOwotICAgICAgICAgVUlOVDMyICBCVzoxOyAvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegotICAgICAgICAgVUlOVDMyICBTaG9ydEdJOjE7Ci0gICAgICAgICBVSU5UMzIgIFNUQkM6MTsgLy9TUEFDRQotICAgICAgICAgVUlOVDMyICBUUkFOU05POjI7Ci0gICAgICAgICBVSU5UMzIgIEhUTU9ERToxOwotICAgICAgICAgVUlOVDMyICBFWFRDSEE6MjsKLSAgICAgICAgIFVJTlQzMiAgcnN2OjEzOwotICAgIH0gZmllbGQ7Ci0jZW5kaWYKLSBVSU5UMzIgICB3b3JkOwotfSBSRUdfVFJBTlNNSVRfU0VUVElORywgKlBSRUdfVFJBTlNNSVRfU0VUVElORzsKLQotCi10eXBlZGVmIHVuaW9uICBfREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HIHsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0Jc3RydWN0CXsKLQkJCVVTSE9SVAkJcnN2OjM7Ci0JCQlVU0hPUlQJCUZpeGVkVHhNb2RlOjI7CQkJLy8gSWYgTUNTIGlzbid0IEFVVE8sIGZpeCByYXRlIGluIENDSywgT0ZETSBvciBIVCBtb2RlLgotCQkJVVNIT1JUCQlQaHlNb2RlOjQ7Ci0JCQlVU0hPUlQJCU1DUzo3OyAgICAgICAgICAgICAgICAgLy8gTUNTCi0JfQlmaWVsZDsKLSNlbHNlCi0Jc3RydWN0CXsKLQkJCVVTSE9SVAkJTUNTOjc7CQkJLy8gTUNTCi0JCQlVU0hPUlQJCVBoeU1vZGU6NDsKLQkJCVVTSE9SVAkJRml4ZWRUeE1vZGU6MjsJCQkvLyBJZiBNQ1MgaXNuJ3QgQVVUTywgZml4IHJhdGUgaW4gQ0NLLCBPRkRNIG9yIEhUIG1vZGUuCi0JCQlVU0hPUlQJCXJzdjozOwotCX0JZmllbGQ7Ci0jZW5kaWYKLQlVU0hPUlQJCXdvcmQ7Ci0gfSBERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcsICpQREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HOwotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoJTXVsdGlwbGUgU1NJRCByZWxhdGVkIGRhdGEgc3RydWN0dXJlcwotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgV0xBTl9NQVhfTlVNX09GX1RJTQkJCSgoTUFYX0xFTl9PRl9NQUNfVEFCTEUgPj4gMykgKyAxKSAvKiAvOCArIDEgKi8KLSNkZWZpbmUgV0xBTl9DVF9USU1fQkNNQ19PRkZTRVQJCTAgLyogdW5pdDogMzJCICovCi0KLS8qIGNsZWFyIGJjbWMgVElNIGJpdCAqLwotI2RlZmluZSBXTEFOX01SX1RJTV9CQ01DX0NMRUFSKGFwaWR4KSBcCi0JcEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLlRpbUJpdG1hcHNbV0xBTl9DVF9USU1fQkNNQ19PRkZTRVRdICY9IH5CSVQ4WzBdOwotCi0vKiBzZXQgYmNtYyBUSU0gYml0ICovCi0jZGVmaW5lIFdMQU5fTVJfVElNX0JDTUNfU0VUKGFwaWR4KSBcCi0JcEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLlRpbUJpdG1hcHNbV0xBTl9DVF9USU1fQkNNQ19PRkZTRVRdIHw9IEJJVDhbMF07Ci0KLS8qIGNsZWFyIGEgc3RhdGlvbiBQUyBUSU0gYml0ICovCi0jZGVmaW5lIFdMQU5fTVJfVElNX0JJVF9DTEVBUihhZF9wLCBhcGlkeCwgd2NpZCkgXAotCXsJVUNIQVIgdGltX29mZnNldCA9IHdjaWQgPj4gMzsgXAotCQlVQ0hBUiBiaXRfb2Zmc2V0ID0gd2NpZCAmIDB4NzsgXAotCQlhZF9wLT5BcENmZy5NQlNTSURbYXBpZHhdLlRpbUJpdG1hcHNbdGltX29mZnNldF0gJj0gKH5CSVQ4W2JpdF9vZmZzZXRdKTsgfQotCi0vKiBzZXQgYSBzdGF0aW9uIFBTIFRJTSBiaXQgKi8KLSNkZWZpbmUgV0xBTl9NUl9USU1fQklUX1NFVChhZF9wLCBhcGlkeCwgd2NpZCkgXAotCXsJVUNIQVIgdGltX29mZnNldCA9IHdjaWQgPj4gMzsgXAotCQlVQ0hBUiBiaXRfb2Zmc2V0ID0gd2NpZCAmIDB4NzsgXAotCQlhZF9wLT5BcENmZy5NQlNTSURbYXBpZHhdLlRpbUJpdG1hcHNbdGltX29mZnNldF0gfD0gQklUOFtiaXRfb2Zmc2V0XTsgfQotCi0KLS8vIGNvbmZpZ3VyYXRpb24gY29tbW9uIHRvIE9QTU9ERV9BUCBhcyB3ZWxsIGFzIE9QTU9ERV9TVEEKLXR5cGVkZWYgc3RydWN0IF9DT01NT05fQ09ORklHIHsKLQotCUJPT0xFQU4JCWJDb3VudHJ5RmxhZzsKLQlVQ0hBUgkJQ291bnRyeUNvZGVbM107Ci0JVUNIQVIJCUdlb2dyYXBoeTsKLQlVQ0hBUiAgICAgICBDb3VudHJ5UmVnaW9uOyAgICAgIC8vIEVudW0gb2YgY291bnRyeSByZWdpb24sIDA6RkNDLCAxOklDLCAyOkVUU0ksIDM6U1BBSU4sIDQ6RnJhbmNlLCA1Ok1LSywgNjpNS0sxLCA3OklzcmFlbAotCVVDSEFSICAgICAgIENvdW50cnlSZWdpb25Gb3JBQmFuZDsJLy8gRW51bSBvZiBjb3VudHJ5IHJlZ2lvbiBmb3IgQSBiYW5kCi0JVUNIQVIgICAgICAgUGh5TW9kZTsgICAgICAgICAgICAvLyBQSFlfMTFBLCBQSFlfMTFCLCBQSFlfMTFCR19NSVhFRCwgUEhZX0FCR19NSVhFRAotCVVDSEFSICAgICAgIERlc2lyZWRQaHlNb2RlOyAgICAgICAgICAgIC8vIFBIWV8xMUEsIFBIWV8xMUIsIFBIWV8xMUJHX01JWEVELCBQSFlfQUJHX01JWEVECi0JVVNIT1JUICAgICAgRHNpZnM7ICAgICAgICAgICAgICAvLyBpbiB1bml0cyBvZiB1c2VjCi0JVUxPTkcgICAgICAgUGFja2V0RmlsdGVyOyAgICAgICAvLyBQYWNrZXQgZmlsdGVyIGZvciByZWNlaXZpbmcKLQlVSU5UOAkJUmVndWxhdG9yeUNsYXNzW01BWF9OVU1fT0ZfUkVHVUxBVE9SWV9DTEFTU107Ci0KLQlDSEFSICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07IC8vIE5PVCBOVUxMLXRlcm1pbmF0ZWQKLQlVQ0hBUiAgICAgICBTc2lkTGVuOyAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgc3NpZCBsZW5ndGggaW4gdXNlZAotCVVDSEFSICAgICAgIExhc3RTc2lkTGVuOyAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgc3NpZCBsZW5ndGggaW4gdXNlZAotCUNIQVIgICAgICAgIExhc3RTc2lkW01BWF9MRU5fT0ZfU1NJRF07IC8vIE5PVCBOVUxMLXRlcm1pbmF0ZWQKLQlVQ0hBUgkJTGFzdEJzc2lkW01BQ19BRERSX0xFTl07Ci0KLQlVQ0hBUiAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dOwotCVVTSE9SVCAgICAgIEJlYWNvblBlcmlvZDsKLQlVQ0hBUiAgICAgICBDaGFubmVsOwotCVVDSEFSICAgICAgIENlbnRyYWxDaGFubmVsOwkvLyBDZW50cmFsIENoYW5uZWwgd2hlbiB1c2luZyA0ME1IeiBpcyBpbmRpY2F0aW5nLiBub3QgcmVhbCBjaGFubmVsLgotCi0JVUNIQVIgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ci0JVUNIQVIgICAgICAgU3VwUmF0ZUxlbjsKLQlVQ0hBUiAgICAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUiAgICAgICBFeHRSYXRlTGVuOwotCVVDSEFSICAgICAgIERlc2lyZVJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOyAgICAgIC8vIE9JRF84MDJfMTFfREVTSVJFRF9SQVRFUwotCVVDSEFSICAgICAgIE1heERlc2lyZWRSYXRlOwotCVVDSEFSICAgICAgIEV4cGVjdGVkQUNLUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ci0KLQlVTE9ORyAgICAgICBCYXNpY1JhdGVCaXRtYXA7ICAgICAgICAvLyBiYWNrdXAgYmFzaWMgcmF0ZWJpdG1hcAotCi0JQk9PTEVBTgkJYkFQU0RDYXBhYmxlOwotCUJPT0xFQU4JCWJJblNlcnZpY2VQZXJpb2Q7Ci0JQk9PTEVBTgkJYkFQU0RBQ19CRTsKLQlCT09MRUFOCQliQVBTREFDX0JLOwotCUJPT0xFQU4JCWJBUFNEQUNfVkk7Ci0JQk9PTEVBTgkJYkFQU0RBQ19WTzsKLQotCS8qIGJlY2F1c2UgVFNQRUMgY2FuIG1vZGlmeSB0aGUgQVBTRCBmbGFnLCB3ZSBuZWVkIHRvIGtlZXAgdGhlIEFQU0QgZmxhZwotCQlyZXF1ZXN0ZWQgaW4gYXNzb2NpYXRpb24gc3RhZ2UgZnJvbSB0aGUgc3RhdGlvbjsKLQkJd2UgbmVlZCB0byByZWNvdmVyIHRoZSBBUFNEIGZsYWcgYWZ0ZXIgdGhlIFRTUEVDIGlzIGRlbGV0ZWQuICovCi0JQk9PTEVBTgkJYkFDTUFQU0RCYWNrdXBbNF07IC8qIGZvciBkZWxpdmVyeS1lbmFibGVkICYgdHJpZ2dlci1lbmFibGVkIGJvdGggKi8KLQlCT09MRUFOCQliQUNNQVBTRFRyWzRdOyAvKiBubyB1c2UgKi8KLQotCUJPT0xFQU4JCWJOZWVkU2VuZFRyaWdnZXJGcmFtZTsKLQlCT09MRUFOCQliQVBTREZvcmNlUG93ZXJTYXZlOwkvLyBGb3JjZSBwb3dlciBzYXZlIG1vZGUsIHNob3VsZCBvbmx5IHVzZSBpbiBBUFNELVNUQVVUCi0JVUxPTkcJCVRyaWdnZXJUaW1lckNvdW50OwotCVVDSEFSCQlNYXhTUExlbmd0aDsKLQlVQ0hBUgkJQkJQQ3VycmVudEJXOwkvLyBCV18xMCwJQldfMjAsIEJXXzQwCi0JLy8gbW92ZSB0byBNVUxUSVNTSURfU1RSVUNUIGZvciBNQlNTCi0JLy9IVFRSQU5TTUlUX1NFVFRJTkcJSFRQaHlNb2RlLCBNYXhIVFBoeU1vZGUsIE1pbkhUUGh5TW9kZTsvLyBGb3IgdHJhbnNtaXQgcGh5IHNldHRpbmcgaW4gVFhXSS4KLQlSRUdfVFJBTlNNSVRfU0VUVElORyAgICAgICAgUmVnVHJhbnNtaXRTZXR0aW5nOyAvL3JlZ2lzdHJ5IHRyYW5zbWl0IHNldHRpbmcuIHRoaXMgaXMgZm9yIHJlYWRpbmcgcmVnaXN0cnkgc2V0dGluZyBvbmx5LiBub3QgdXNlZnVsLgotCS8vVUNIQVIgICAgICAgRml4ZWRUeE1vZGU7ICAgICAgICAgICAgICAvLyBGaXhlZCBUeCBNb2RlIChDQ0ssIE9GRE0pLCBmb3IgSFQgZml4ZWQgdHggbW9kZSAoR0YsIE1JWCkgLCByZWZlciB0byBSZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNb2RlCi0JVUNIQVIgICAgICAgVHhSYXRlOyAgICAgICAgICAgICAgICAgLy8gU2FtZSB2YWx1ZSB0byBmaWxsIGluIFRYRC4gVHhSYXRlIGlzIDYtYml0Ci0JVUNIQVIgICAgICAgTWF4VHhSYXRlOyAgICAgICAgICAgICAgLy8gUkFURV8xLCBSQVRFXzIsIFJBVEVfNV81LCBSQVRFXzExCi0JVUNIQVIgICAgICAgVHhSYXRlSW5kZXg7ICAgICAgICAgICAgLy8gVHggcmF0ZSBpbmRleCBpbiBSYXRlU3dpdGNoVGFibGUKLQlVQ0hBUiAgICAgICBUeFJhdGVUYWJsZVNpemU7ICAgICAgICAvLyBWYWxpZCBUeCByYXRlIHRhYmxlIHNpemUgaW4gUmF0ZVN3aXRjaFRhYmxlCi0JLy9CT09MRUFOCQliQXV0b1R4UmF0ZVN3aXRjaDsKLQlVQ0hBUiAgICAgICBNaW5UeFJhdGU7ICAgICAgICAgICAgICAvLyBSQVRFXzEsIFJBVEVfMiwgUkFURV81XzUsIFJBVEVfMTEKLQlVQ0hBUiAgICAgICBSdHNSYXRlOyAgICAgICAgICAgICAgICAvLyBSQVRFX3h4eAotCUhUVFJBTlNNSVRfU0VUVElORwlNbG1lVHJhbnNtaXQ7ICAgLy8gTUdNVCBmcmFtZSBQSFkgcmF0ZSBzZXR0aW5nIHdoZW4gb3BlcmF0aW4gYXQgSHQgcmF0ZS4KLQlVQ0hBUiAgICAgICBNbG1lUmF0ZTsgICAgICAgICAgICAgICAvLyBSQVRFX3h4eCwgdXNlZCB0byBzZW5kIE1MTUUgZnJhbWVzCi0JVUNIQVIgICAgICAgQmFzaWNNbG1lUmF0ZTsgICAgICAgICAgLy8gRGVmYXVsdCBSYXRlIGZvciBzZW5kaW5nIE1MTUUgZnJhbWVzCi0KLQlVU0hPUlQgICAgICBSdHNUaHJlc2hvbGQ7ICAgICAgICAgICAvLyBpbiB1bml0IG9mIEJZVEUKLQlVU0hPUlQgICAgICBGcmFnbWVudFRocmVzaG9sZDsgICAgICAvLyBpbiB1bml0IG9mIEJZVEUKLQotCVVDSEFSICAgICAgIFR4UG93ZXI7ICAgICAgICAgICAgICAgIC8vIGluIHVuaXQgb2YgbVcKLQlVTE9ORyAgICAgICBUeFBvd2VyUGVyY2VudGFnZTsgICAgICAvLyAwfjEwMCAlCi0JVUxPTkcgICAgICAgVHhQb3dlckRlZmF1bHQ7ICAgICAgICAgLy8ga2VlcCBmb3IgVHhQb3dlclBlcmNlbnRhZ2UKLQlVSU5UOAkJUHdyQ29uc3RyYWludDsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCUJBQ0FQX1NUUlVDICAgICAgICBCQUNhcGFiaWxpdHk7IC8vICAgTk8gVVNFID0gMFhGRiAgOyAgSU1NRURfQkEgPTEgIDsgIERFTEFZX0JBPTAKLQlCQUNBUF9TVFJVQyAgICAgICAgUkVHQkFDYXBhYmlsaXR5OyAvLyAgIE5PIFVTRSA9IDBYRkYgIDsgIElNTUVEX0JBID0xICA7ICBERUxBWV9CQT0wCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JSU9UX1NUUlVDCQlJT1Rlc3RQYXJtOwkvLyA4MDIuMTFuIEludGVyT3BiaWxpdHkgVGVzdCBQYXJhbWV0ZXI7Ci0JVUxPTkcgICAgICAgVHhQcmVhbWJsZTsgICAgICAgICAgICAgLy8gUnQ4MDJfMTFQcmVhbWJsZUxvbmcsIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCwgUnQ4MDJfMTFQcmVhbWJsZUF1dG8KLQlCT09MRUFOICAgICBiVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50OyAgICAgLy8gTWljcm9zb2Z0IHVzZSAwIGFzIGRpc2FibGUKLQlVTE9ORyAgICAgICBVc2VCR1Byb3RlY3Rpb247ICAgICAgICAvLyAwOiBhdXRvLCAxOiBhbHdheXMgdXNlLCAyOiBhbHdheXMgbm90IHVzZQotCUJPT0xFQU4gICAgIGJVc2VTaG9ydFNsb3RUaW1lOyAgICAgIC8vIDA6IGRpc2FibGUsIDEgLSB1c2Ugc2hvcnQgc2xvdCAoOXVzKQotCUJPT0xFQU4gICAgIGJFbmFibGVUeEJ1cnN0OyAgICAgICAgIC8vIDE6IGVuYmxlIFRYIFBBQ0tFVCBCVVJTVCAod2hlbiBCQSBpcyBlc3RhYmxpc2hlZCBvciBBUCBpcyBub3QgYSBsZWdhY3kgV01NIEFQKSwgMDogZGlzYWJsZSBUWCBQQUNLRVQgQlVSU1QKLQlCT09MRUFOICAgICBiQWdncmVnYXRpb25DYXBhYmxlOyAgICAgIC8vIDE6IGVuYWJsZSBUWCBhZ2dyZWdhdGlvbiB3aGVuIHRoZSBwZWVyIHN1cHBvcnRzIGl0Ci0JQk9PTEVBTiAgICAgYlBpZ2d5QmFja0NhcGFibGU7CQkvLyAxOiBlbmFibGUgVFggcGlnZ3ktYmFjayBhY2NvcmRpbmcgTUFDJ3MgdmVyc2lvbgotCUJPT0xFQU4gICAgIGJJRUVFODAyMTFIOwkJCS8vIDE6IGVuYWJsZSBJRUVFODAyLjExaCBzcGVjLgotCVVMT05HCQlEaXNhYmxlT0xCQ0RldGVjdDsJCS8vIDA6IGVuYWJsZSBPTEJDIGRldGVjdDsgMSBkaXNhYmxlIE9MQkMgZGV0ZWN0Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlCT09MRUFOCQkJCWJSZGc7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JQk9PTEVBTiAgICAgICAgICAgICBiV21tQ2FwYWJsZTsgICAgICAgIC8vIDA6ZGlzYWJsZSBXTU0sIDE6ZW5hYmxlIFdNTQotCVFPU19DQVBBQklMSVRZX1BBUk0gQVBRb3NDYXBhYmlsaXR5OyAgICAvLyBRT1MgY2FwYWJpbGl0eSBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCi0JRURDQV9QQVJNICAgICAgICAgICBBUEVkY2FQYXJtOyAgICAgICAgIC8vIEVEQ0EgcGFyYW1ldGVycyBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCi0JUUJTU19MT0FEX1BBUk0gICAgICBBUFFic3NMb2FkOyAgICAgICAgIC8vIFFCU1MgbG9hZCBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCi0JVUNIQVIgICAgICAgICAgICAgICBBY2tQb2xpY3lbNF07ICAgICAgIC8vIEFDSyBwb2xpY3kgb2YgdGhlIHNwZWNpZmllZCBBQy4gc2VlIEFDS194eHgKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlCT09MRUFOCQkJCWJETFNDYXBhYmxlOwkJLy8gMDpkaXNhYmxlIERMUywgMTplbmFibGUgRExTCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JLy8gYSBiaXRtYXAgb2YgQk9PTEVBTiBmbGFncy4gZWFjaCBiaXQgcmVwcmVzZW50IGFuIG9wZXJhdGlvbiBzdGF0dXMgb2YgYSBwYXJ0aWN1bGFyCi0JLy8gQk9PTEVBTiBjb250cm9sLCBlaXRoZXIgT04gb3IgT0ZGLiBUaGVzZSBmbGFncyBzaG91bGQgYWx3YXlzIGJlIGFjY2Vzc2VkIHZpYQotCS8vIE9QU1RBVFVTX1RFU1RfRkxBRygpLCBPUFNUQVRVU19TRVRfRkxBRygpLCBPUF9TVEFUVVNfQ0xFQVJfRkxBRygpIG1hY3Jvcy4KLQkvLyBzZWUgZk9QX1NUQVRVU194eHggaW4gUlRNUF9ERUYuQyBmb3IgZGV0YWlsIGJpdCBkZWZpbml0aW9uCi0JVUxPTkcgICAgICAgICAgICAgICBPcFN0YXR1c0ZsYWdzOwotCi0JQk9PTEVBTgkJCQlOZGlzUmFkaW9TdGF0ZU9mZjsgLy9Gb3IgSENUIDEyLjAsIHNldCB0aGlzIGZsYWcgdG8gVFJVRSBpbnN0ZWFkIG9mIGNhbGxlZCBNbG1lUmFkaW9PZmYuCi0JQUJHQkFORF9TVEFURQkJQmFuZFN0YXRlOwkJLy8gRm9yIHNldHRpbmcgQkJQIHVzZWQgb24gQi9HIG9yIEEgbW9kZS4KLSNpZmRlZiBBTlRfRElWRVJTSVRZX1NVUFBPUlQKLQlVQ0hBUgkJCQliUnhBbnREaXZlcnNpdHk7IC8vIDA6ZGlzYWJsZSwgMTplbmFibGUgU29mdHdhcmUgUnggQW50ZW5uYSBEaXZlcnNpdHkuCi0jZW5kaWYgLy8gQU5UX0RJVkVSU0lUWV9TVVBQT1JUIC8vCi0KLQkvLyBJRUVFODAyLjExSC0tREZTLgotCVJBREFSX0RFVEVDVF9TVFJVQ1QJUmFkYXJEZXRlY3Q7Ci0KLSNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCi0JQ0FSUklFUl9ERVRFQ1RJT05fU1RSVUNUCQlDYXJyaWVyRGV0ZWN0OwotI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCS8vIEhUCi0JVUNIQVIJCQlCQVNpemU7CQkvLyBVU2VyIGRlc2lyZWQgQkFXaW5kb3dTaXplLiBTaG91bGQgbm90IGV4Y2VlZCBvdXIgbWF4IGNhcGFiaWxpdHkKLQkvL1JUX0hUX0NBUEFCSUxJVFkJU3VwcG9ydGVkSHRQaHk7Ci0JUlRfSFRfQ0FQQUJJTElUWQlEZXNpcmVkSHRQaHk7Ci0JSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OwotCUFERF9IVF9JTkZPX0lFCQlBZGRIVEluZm87CS8vIFVzZWZ1bCBhcyBBUC4KLQkvL1RoaXMgSUUgaXMgdXNlZCB3aXRoIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBlbGVtZW50IHdoZW4gY2hhbmdpbmcgdG8gYSBuZXcgNDBNSHouCi0JLy9UaGlzIElFIGlzIGluY2x1ZGVkIGluIGNoYW5uZWwgc3dpdGNoIGFtbW91bmNlbWVudCBmcmFtZXMgNy40LjEuNSwgYmVhY29ucywgcHJvYmUgUnNwLgotCU5FV19FWFRfQ0hBTl9JRQlOZXdFeHRDaGFuT2Zmc2V0OwkvLzcuMy4yLjIwQSwgMSBpZiBleHRlbnNpb24gY2hhbm5lbCBpcyBhYm92ZSB0aGUgY29udHJvbCBjaGFubmVsLCAzIGlmIGJlbG93LCAwIGlmIG5vdCBwcmVzZW50Ci0KLSNpZmRlZiBET1QxMU5fRFJBRlQzCi0JVUNIQVIJCQkJCUJzczIwNDBDb2V4aXN0RmxhZzsJCS8vIGJpdCAwOiBiQnNzQ29leGlzdFRpbWVyUnVubmluZywgYml0IDE6IE5lZWRTeW5jQWRkSHRJbmZvLgotCVJBTElOS19USU1FUl9TVFJVQ1QJQnNzMjA0MENvZXhpc3RUaW1lcjsKLQotCS8vVGhpcyBJRSBpcyB1c2VkIGZvciAyMC80MCBCU1MgQ29leGlzdGVuY2UuCi0JQlNTXzIwNDBfQ09FWElTVF9JRQkJQlNTMjA0MENvZXhpc3RJbmZvOwotCS8vID09PT09PSAxMW4gRDMuMCA9PT09PT09PT09PT09PT09PT09PT09PT4KLQlVU0hPUlQJCQkJCURvdDExT0Jzc1NjYW5QYXNzaXZlRHdlbGw7CQkJCS8vIFVuaXQgOiBUVS4gNX4xMDAwCi0JVVNIT1JUCQkJCQlEb3QxMU9Cc3NTY2FuQWN0aXZlRHdlbGw7CQkJCS8vIFVuaXQgOiBUVS4gMTB+MTAwMAotCVVTSE9SVAkJCQkJRG90MTFCc3NXaWR0aFRyaWdnZXJTY2FuSW50OwkJCS8vIFVuaXQgOiBTZWNvbmQKLQlVU0hPUlQJCQkJCURvdDExT0Jzc1NjYW5QYXNzaXZlVG90YWxQZXJDaGFubmVsOwkvLyBVbml0IDogVFUuIDIwMH4xMDAwMAotCVVTSE9SVAkJCQkJRG90MTFPQnNzU2NhbkFjdGl2ZVRvdGFsUGVyQ2hhbm5lbDsJLy8gVW5pdCA6IFRVLiAyMH4xMDAwMAotCVVTSE9SVAkJCQkJRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXlGYWN0b3I7Ci0JVVNIT1JUCQkJCQlEb3QxMU9Cc3NTY2FuQWN0aXZpdHlUaHJlOwkJCQkvLyBVbml0IDogcGVyY2VudGFnZQotCi0JVUxPTkcJCQkJCURvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5OwkJCS8vIG11bHRpcGxlIG9mIChEb3QxMUJzc1dpZHRoVHJpZ2dlclNjYW5JbnQgKiBEb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheUZhY3RvcikKLQlVTE9ORwkJCQkJQ291bnREb3duQ3RyOwkvLyBDb3VudERvd24gQ291bnRlciBmcm9tIChEb3QxMUJzc1dpZHRoVHJpZ2dlclNjYW5JbnQgKiBEb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheUZhY3RvcikKLQotCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIFRyaWdnZXJFdmVudFRhYkxvY2s7Ci0JQlNTXzIwNDBfQ09FWElTVF9JRQkJTGFzdEJTU0NvZXhpc3QyMDQwOwotCUJTU18yMDQwX0NPRVhJU1RfSUUJCUJTU0NvZXhpc3QyMDQwOwotCVRSSUdHRVJfRVZFTlRfVEFCCQlUcmlnZ2VyRXZlbnRUYWI7Ci0JVUNIQVIJCQkJCUNoYW5uZWxMaXN0SWR4OwotCS8vIDw9PT09PT0gMTFuIEQzLjAgPT09PT09PT09PT09PT09PT09PT09PT0KLQlCT09MRUFOCQkJCQliT3ZlcmxhcFNjYW5uaW5nOwotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLQotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgIGJIVFByb3RlY3Q7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgYk1JTU9QU0VuYWJsZTsKLSAgICBCT09MRUFOCQkJCQliQkFEZWNsaW5lOwotLy8yMDA4LzExLzA1OiBLSCBhZGQgdG8gc3VwcG9ydCBBbnRlbm5hIHBvd2VyLXNhdmluZyBvZiBBUDwtLQotCUJPT0xFQU4JCQkJCWJHcmVlbkFQRW5hYmxlOwotCUJPT0xFQU4JCQkJCWJCbG9ja0FudERpdmZvckdyZWVuQVA7Ci0vLzIwMDgvMTEvMDU6IEtIIGFkZCB0byBzdXBwb3J0IEFudGVubmEgcG93ZXItc2F2aW5nIG9mIEFQLS0+Ci0JQk9PTEVBTgkJCQkJYkRpc2FibGVSZW9yZGVyaW5nOwotCUJPT0xFQU4JCQkJCWJGb3J0eV9NaHpfSW50b2xlcmFudDsKLQlCT09MRUFOCQkJCQliRXh0Q2hhbm5lbFN3aXRjaEFubm91bmNlbWVudDsKLQlCT09MRUFOCQkJCQliUmN2QlNTV2lkdGhUcmlnZ2VyRXZlbnRzOwotCVVMT05HCQkJCQlMYXN0UmN2QlNTV2lkdGhUcmlnZ2VyRXZlbnRzVGltZTsKLQotCVVDSEFSCQkJCQlUeEJBU2l6ZTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCS8vIEVuYWJsZSB3aXJlbGVzcyBldmVudAotCUJPT0xFQU4JCQkJYldpcmVsZXNzRXZlbnQ7Ci0JQk9PTEVBTgkJCQliV2lGaVRlc3Q7CQkJCS8vIEVuYWJsZSB0aGlzIHBhcmFtZXRlciBmb3IgV2lGaSB0ZXN0Ci0KLQkvLyBUeCAmIFJ4IFN0cmVhbSBudW1iZXIgc2VsZWN0aW9uCi0JVUNIQVIJCQkJVHhTdHJlYW07Ci0JVUNIQVIJCQkJUnhTdHJlYW07Ci0KLQkvLyB0cmFuc21pdCBwaHkgbW9kZSwgdHJhc21pdCByYXRlIGZvciBNdWx0aWNhc3QuCi0jaWZkZWYgTUNBU1RfUkFURV9TUEVDSUZJQwotCVVDSEFSCQkJCU1jYXN0VHJhbnNtaXRNY3M7Ci0JVUNIQVIJCQkJTWNhc3RUcmFuc21pdFBoeU1vZGU7Ci0jZW5kaWYgLy8gTUNBU1RfUkFURV9TUEVDSUZJQyAvLwotCi0JQk9PTEVBTgkJCWJIYXJkd2FyZVJhZGlvOyAgICAgLy8gSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBlbmFibGVkCi0KLQotCi0JTkRJU19TUElOX0xPQ0sJCQlNZWFzdXJlUmVxVGFiTG9jazsKLQlQTUVBU1VSRV9SRVFfVEFCCQlwTWVhc3VyZVJlcVRhYjsKLQotCU5ESVNfU1BJTl9MT0NLCQkJVHBjUmVxVGFiTG9jazsKLQlQVFBDX1JFUV9UQUIJCQlwVHBjUmVxVGFiOwotCi0JLy8gdHJhbnNtaXQgcGh5IG1vZGUsIHRyYXNtaXQgcmF0ZSBmb3IgTXVsdGljYXN0LgotI2lmZGVmIE1DQVNUX1JBVEVfU1BFQ0lGSUMKLQlIVFRSQU5TTUlUX1NFVFRJTkcJCU1DYXN0UGh5TW9kZTsKLSNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCi0KLSNpZmRlZiBTSU5HTEVfU0tVCi0JVUlOVDE2CQkJCQlEZWZpbmVNYXhUeFB3cjsKLSNlbmRpZiAvLyBTSU5HTEVfU0tVIC8vCi0KLQotCUJPT0xFQU4JCQkJUFNQWGxpbms7ICAvLyAwOiBEaXNhYmxlLiAxOiBFbmFibGUKLQotCi0jaWYgZGVmaW5lZChSVDMwNXgpfHxkZWZpbmVkKFJUMzB4eCkKLQkvLyByZXF1ZXN0IGJ5IEdhcnksIGZvciBIaWdoIFBvd2VyIGlzc3VlCi0JVUNIQVIJSGlnaFBvd2VyUGF0Y2hEaXNhYmxlZDsKLSNlbmRpZgotCi0JQk9PTEVBTgkJSFRfRGlzYWxsb3dUS0lQOwkJLyogUmVzdHJpY3QgdGhlIGVuY3J5cHRpb24gdHlwZSBpbiAxMW4gSFQgbW9kZSAqLwotfSBDT01NT05fQ09ORklHLCAqUENPTU1PTl9DT05GSUc7Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotLyogTW9kaWZpZWQgYnkgV3UgWGktS3VuIDQvMjEvMjAwNiAqLwotLy8gU1RBIGNvbmZpZ3VyYXRpb24gYW5kIHN0YXR1cwotdHlwZWRlZiBzdHJ1Y3QgX1NUQV9BRE1JTl9DT05GSUcgewotCS8vIEdST1VQIDEgLQotCS8vICAgVXNlciBjb25maWd1cmF0aW9uIGxvYWRlZCBmcm9tIFJlZ2lzdHJ5LCBFMlBST00gb3IgT0lEX3h4eC4gVGhlc2Ugc2V0dGluZ3MgZGVzY3JpYmUKLQkvLyAgIHRoZSB1c2VyIGludGVuZGVkIGNvbmZpZ3VyYXRpb24sIGJ1dCBub3QgbmVjZXNzYXJ5IGZ1bGx5IGVxdWFsIHRvIHRoZSBmaW5hbAotCS8vICAgc2V0dGluZ3MgaW4gQUNUSVZFIEJTUyBhZnRlciBuZWdvdGlhdGlvbi9jb21wcm9taXplIHdpdGggdGhlIEJTUyBob2xkZXIgKGVpdGhlcgotCS8vICAgQVAgb3IgSUJTUyBob2xkZXIpLgotCS8vICAgT25jZSBpbml0aWFsaXplZCwgdXNlciBjb25maWd1cmF0aW9uIGNhbiBvbmx5IGJlIGNoYW5nZWQgdmlhIE9JRF94eHgKLQlVQ0hBUiAgICAgICBCc3NUeXBlOyAgICAgICAgICAgICAgLy8gQlNTX0lORlJBIG9yIEJTU19BREhPQwotCVVTSE9SVCAgICAgIEF0aW1XaW47ICAgICAgICAgIC8vIHVzZWQgd2hlbiBzdGFydGluZyBhIG5ldyBJQlNTCi0KLQkvLyBHUk9VUCAyIC0KLQkvLyAgIFVzZXIgY29uZmlndXJhdGlvbiBsb2FkZWQgZnJvbSBSZWdpc3RyeSwgRTJQUk9NIG9yIE9JRF94eHguIFRoZXNlIHNldHRpbmdzIGRlc2NyaWJlCi0JLy8gICB0aGUgdXNlciBpbnRlbmRlZCBjb25maWd1cmF0aW9uLCBhbmQgc2hvdWxkIGJlIGFsd2F5cyBhcHBsaWVkIHRvIHRoZSBmaW5hbAotCS8vICAgc2V0dGluZ3MgaW4gQUNUSVZFIEJTUyB3aXRob3V0IGNvbXByb21pc2luZyB3aXRoIHRoZSBCU1MgaG9sZGVyLgotCS8vICAgT25jZSBpbml0aWFsaXplZCwgdXNlciBjb25maWd1cmF0aW9uIGNhbiBvbmx5IGJlIGNoYW5nZWQgdmlhIE9JRF94eHgKLQlVQ0hBUiAgICAgICBSc3NpVHJpZ2dlcjsKLQlVQ0hBUiAgICAgICBSc3NpVHJpZ2dlck1vZGU7ICAgICAgLy8gUlNTSV9UUklHR0VSRURfVVBPTl9CRUxPV19USFJFU0hPTEQgb3IgUlNTSV9UUklHR0VSRURfVVBPTl9FWENDRUVEX1RIUkVTSE9MRAotCVVTSE9SVCAgICAgIERlZmF1bHRMaXN0ZW5Db3VudDsgICAvLyBkZWZhdWx0IGxpc3RlbiBjb3VudDsKLQlVTE9ORyAgICAgICBXaW5kb3dzUG93ZXJNb2RlOyAgICAgICAgICAgLy8gUG93ZXIgbW9kZSBmb3IgQUMgcG93ZXIKLQlVTE9ORyAgICAgICBXaW5kb3dzQmF0dGVyeVBvd2VyTW9kZTsgICAgLy8gUG93ZXIgbW9kZSBmb3IgYmF0dGVyeSBpZiBleGlzdHMKLQlCT09MRUFOICAgICBiV2luZG93c0FDQ0FNRW5hYmxlOyAgICAgICAgLy8gRW5hYmxlIENBTSBwb3dlciBtb2RlIHdoZW4gQUMgb24KLQlCT09MRUFOICAgICBiQXV0b1JlY29ubmVjdDsgICAgICAgICAvLyBTZXQgdG8gVFJVRSB3aGVuIHNldHRpbmcgT0lEXzgwMl8xMV9TU0lEIHdpdGggbm8gbWF0Y2hpbmcgQlNTSUQKLQlVTE9ORyAgICAgICBXaW5kb3dzUG93ZXJQcm9maWxlOyAgICAvLyBXaW5kb3dzIHBvd2VyIHByb2ZpbGUsIGZvciBORElTNS4xIFBuUAotCi0JLy8gTUlCOmllZWU4MDJkb3QxMS5kb3QxMXNtdCgxKS5kb3QxMVN0YXRpb25Db25maWdUYWJsZSgxKQotCVVTSE9SVCAgICAgIFBzbTsgICAgICAgICAgICAgICAgICAvLyBwb3dlciBtYW5hZ2VtZW50IG1vZGUgICAoUFdSX0FDVElWRXxQV1JfU0FWRSkKLQlVU0hPUlQgICAgICBEaXNhc3NvY1JlYXNvbjsKLQlVQ0hBUiAgICAgICBEaXNhc3NvY1N0YVtNQUNfQUREUl9MRU5dOwotCVVTSE9SVCAgICAgIERlYXV0aFJlYXNvbjsKLQlVQ0hBUiAgICAgICBEZWF1dGhTdGFbTUFDX0FERFJfTEVOXTsKLQlVU0hPUlQgICAgICBBdXRoRmFpbFJlYXNvbjsKLQlVQ0hBUiAgICAgICBBdXRoRmFpbFN0YVtNQUNfQUREUl9MRU5dOwotCi0JTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVIgICAgICAgICAgUHJpdmFjeUZpbHRlcjsgIC8vIFByaXZhY3lGaWx0ZXIgZW51bSBmb3IgODAyLjFYCi0JTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGU7ICAgICAgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHRvIHdoYXRldmVyIG1pY3Jvc29mdCBkZWZpbmVkCi0JTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOwotCU5ESVNfODAyXzExX1dFUF9TVEFUVVMJCQkJT3JpZ1dlcFN0YXR1czsJLy8gT3JpZ2luYWwgd2VwIHN0YXR1cyBzZXQgZnJvbSBPSUQKLQotCS8vIEFkZCB0byBzdXBwb3J0IGRpZmZlcmVudCBjaXBoZXIgc3VpdGUgZm9yIFdQQTIvV1BBIG1vZGUKLQlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwkJR3JvdXBDaXBoZXI7CQkvLyBNdWx0aWNhc3QgY2lwaGVyIHN1aXRlCi0JTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJCVBhaXJDaXBoZXI7CQkJLy8gVW5pY2FzdCBjaXBoZXIgc3VpdGUKLQlCT09MRUFOCQkJCQkJCQliTWl4Q2lwaGVyOwkJCS8vIEluZGljYXRlIGN1cnJlbnQgUGFpciAmIEdyb3VwIHVzZSBkaWZmZXJlbnQgY2lwaGVyIHN1aXRlcwotCVVTSE9SVAkJCQkJCQkJUnNuQ2FwYWJpbGl0eTsKLQotCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIEdyb3VwS2V5V2VwU3RhdHVzOwotCi0JVUNIQVIJCVdwYVBhc3NQaHJhc2VbNjRdOwkJLy8gV1BBIFBTSyBwYXNzIHBocmFzZQotCVVJTlQJCVdwYVBhc3NQaHJhc2VMZW47CQkvLyB0aGUgbGVuZ3RoIG9mIFdQQSBQU0sgcGFzcyBwaHJhc2UKLQlVQ0hBUgkJUE1LWzMyXTsgICAgICAgICAgICAgICAgLy8gV1BBIFBTSyBtb2RlIFBNSwotCVVDSEFSICAgICAgIFBUS1s2NF07ICAgICAgICAgICAgICAgIC8vIFdQQSBQU0sgbW9kZSBQVEsKLQlVQ0hBUgkJR1RLWzMyXTsJCQkJLy8gR1RLIGZyb20gYXV0aGVudGljYXRvcgotCUJTU0lEX0lORk8JU2F2ZWRQTUtbUE1LSURfTk9dOwotCVVJTlQJCVNhdmVkUE1LTnVtOwkJCS8vIFNhdmVkIFBNS0lEIG51bWJlcgotCi0JVUNIQVIJCURlZmF1bHRLZXlJZDsKLQotCi0JLy8gV1BBIDgwMi4xeCBwb3J0IGNvbnRyb2wsIFdQQV84MDJfMVhfUE9SVF9TRUNVUkVELCBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQKLQlVQ0hBUiAgICAgICBQb3J0U2VjdXJlZDsKLQotCS8vIEZvciBXUEEgY291bnRlcm1lYXN1cmVzCi0JVUxPTkcgICAgICAgTGFzdE1pY0Vycm9yVGltZTsgICAvLyByZWNvcmQgbGFzdCBNSUMgZXJyb3IgdGltZQotCVVMT05HICAgICAgIE1pY0VyckNudDsgICAgICAgICAgLy8gU2hvdWxkIGJlIDAsIDEsIDIsIHRoZW4gcmVzZXQgdG8gemVybyAoYWZ0ZXIgZGlzYXNzb2ljaWF0aW9uKS4KLQlCT09MRUFOICAgICBiQmxvY2tBc3NvYzsgICAgICAgIC8vIEJsb2NrIGFzc29jaWF0ZSBhdHRlbXB0IGZvciA2MCBzZWNvbmRzIGFmdGVyIGNvdW50ZXIgbWVhc3VyZSBvY2N1cnJlZC4KLQkvLyBGb3IgV1BBLVBTSyBzdXBwbGljYW50IHN0YXRlCi0JV1BBX1NUQVRFICAgV3BhU3RhdGU7ICAgICAgICAgICAvLyBEZWZhdWx0IGlzIFNTX05PVFVTRSBhbmQgaGFuZGxlZCBieSBtaWNyb3NvZnQgODAyLjF4Ci0JVUNIQVIgICAgICAgUmVwbGF5Q291bnRlcls4XTsKLQlVQ0hBUiAgICAgICBBTm9uY2VbMzJdOyAgICAgICAgIC8vIEFOb25jZSBmb3IgV1BBLVBTSyBmcm9tIGF1cmhlbnRpY2F0b3IKLQlVQ0hBUiAgICAgICBTTm9uY2VbMzJdOyAgICAgICAgIC8vIFNOb25jZSBmb3IgV1BBLVBTSwotCi0JVUNIQVIgICAgICAgTGFzdFNOUjA7ICAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgQkVBQ09OJ3MgU05SCi0JVUNIQVIgICAgICAgTGFzdFNOUjE7ICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBCRUFDT04ncyBTTlIgZm9yIDJuZCAgYW50ZW5uYQotCVJTU0lfU0FNUExFIFJzc2lTYW1wbGU7Ci0JVUxPTkcgICAgICAgTnVtT2ZBdmdSc3NpU2FtcGxlOwotCi0JVUxPTkcgICAgICAgTGFzdEJlYWNvblJ4VGltZTsgICAgIC8vIE9TJ3MgdGltZXN0YW1wIG9mIHRoZSBsYXN0IEJFQUNPTiBSWCB0aW1lCi0JVUxPTkcgICAgICAgTGFzdDExYkJlYWNvblJ4VGltZTsgIC8vIE9TJ3MgdGltZXN0YW1wIG9mIHRoZSBsYXN0IDExQiBCRUFDT04gUlggdGltZQotCVVMT05HCQlMYXN0MTFnQmVhY29uUnhUaW1lOwkvLyBPUydzIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCAxMUcgQkVBQ09OIFJYIHRpbWUKLQlVTE9ORwkJTGFzdDIwTkJlYWNvblJ4VGltZTsJLy8gT1MncyB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgMjBNSHogTiBCRUFDT04gUlggdGltZQotCi0JVUxPTkcgICAgICAgTGFzdFNjYW5UaW1lOyAgICAgICAvLyBSZWNvcmQgbGFzdCBzY2FuIHRpbWUgZm9yIGlzc3VlIEJTU0lEX1NDQU5fTElTVAotCVVMT05HICAgICAgIFNjYW5DbnQ7ICAgICAgICAgICAgLy8gU2NhbiBjb3VudHMgc2luY2UgbW9zdCByZWNlbnQgU1NJRCwgQlNTSUQsIFNDQU4gT0lEIHJlcXVlc3QKLQlCT09MRUFOICAgICBiU3dSYWRpbzsgICAgICAgICAgIC8vIFNvZnR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gT24vT2ZmLCBUUlVFOiBPbgotCUJPT0xFQU4gICAgIGJId1JhZGlvOyAgICAgICAgICAgLy8gSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBPbi9PZmYsIFRSVUU6IE9uCi0JQk9PTEVBTiAgICAgYlJhZGlvOyAgICAgICAgICAgICAvLyBSYWRpbyBzdGF0ZSwgQW5kIG9mIFN3ICYgSHcgcmFkaW8gc3RhdGUKLQlCT09MRUFOICAgICBiSGFyZHdhcmVSYWRpbzsgICAgIC8vIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gZW5hYmxlZAotCUJPT0xFQU4gICAgIGJTaG93SGlkZGVuU1NJRDsgICAgLy8gU2hvdyBhbGwga25vd24gU1NJRCBpbiBTU0lEIGxpc3QgZ2V0IG9wZXJhdGlvbgotCi0JLy8gTmV3IGZvciBXUEEsIHdpbmRvd3Mgd2FudCB1cyB0byB0byBrZWVwIGFzc29jaWF0aW9uIGluZm9ybWF0aW9uIGFuZAotCS8vIEZpeGVkIElFcyBmcm9tIGxhc3QgYXNzb2NpYXRpb24gcmVzcG9uc2UKLQlORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTiAgICAgQXNzb2NJbmZvOwotCVVTSE9SVCAgICAgICBSZXFWYXJJRUxlbjsgICAgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIG5leHQgVklFIGluY2x1ZGUgRUlEICYgTGVuZ3RoCi0JVUNIQVIgICAgICAgUmVxVmFySUVzW01BWF9WSUVfTEVOXTsJCS8vIFRoZSBjb250ZW50IHNhdmVkIGhlcmUgc2hvdWxkIGJlIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgotCVVTSE9SVCAgICAgICBSZXNWYXJJRUxlbjsgICAgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIG5leHQgVklFIGluY2x1ZGUgRUlEICYgTGVuZ3RoCi0JVUNIQVIgICAgICAgUmVzVmFySUVzW01BWF9WSUVfTEVOXTsKLQotCVVDSEFSICAgICAgIFJTTklFX0xlbjsKLQlVQ0hBUiAgICAgICBSU05fSUVbTUFYX0xFTl9PRl9SU05JRV07CS8vIFRoZSBjb250ZW50IHNhdmVkIGhlcmUgc2hvdWxkIGJlIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgotCi0JVUxPTkcgICAgICAgICAgICAgICBDTEJ1c3lCeXRlczsgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgdG90YWwgYnl0ZXMgcmVjZWl2ZWQgZHVybmluZyBjaGFubmVsIGxvYWQgc2NhbiB0aW1lCi0JVVNIT1JUICAgICAgICAgICAgICBSUElEZW5zaXR5WzhdOyAgICAgICAgICAgICAgLy8gQXJyYXkgZm9yIFJQSSBkZW5zaXR5IGNvbGxlY3Rpb24KLQotCVVDSEFSICAgICAgICAgICAgICAgUk1SZXFDbnQ7ICAgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBtZWFzdXJlbWVudCByZXF1ZXN0IHNhdmVkLgotCVVDSEFSICAgICAgICAgICAgICAgQ3VycmVudFJNUmVxSWR4OyAgICAgICAgICAgIC8vIE51bWJlciBvZiBtZWFzdXJlbWVudCByZXF1ZXN0IHNhdmVkLgotCUJPT0xFQU4gICAgICAgICAgICAgUGFyYWxsZWxSZXE7ICAgICAgICAgICAgICAgIC8vIFBhcmFsbGVsIG1lYXN1cmVtZW50LCBvbmx5IG9uZSByZXF1ZXN0IHBlcmZvcm1lZCwKLQkJCQkJCQkJCQkJCQkvLyBJdCBtdXN0IGJlIHRoZSBzYW1lIGNoYW5uZWwgd2l0aCBtYXhpbXVtIGR1cmF0aW9uCi0JVVNIT1JUICAgICAgICAgICAgICBQYXJhbGxlbER1cmF0aW9uOyAgICAgICAgICAgLy8gTWF4aW11bSBkdXJhdGlvbiBmb3IgcGFyYWxsZWwgbWVhc3VyZW1lbnQKLQlVQ0hBUiAgICAgICAgICAgICAgIFBhcmFsbGVsQ2hhbm5lbDsgICAgICAgICAgICAvLyBPbmx5IG9uZSBjaGFubmVsIHdpdGggcGFyYWxsZWwgbWVhc3VyZW1lbnQKLQlVU0hPUlQgICAgICAgICAgICAgIElBUFBUb2tlbjsgICAgICAgICAgICAgICAgICAvLyBJQVBQIGRpYWxvZyB0b2tlbgotCS8vIEhhY2sgZm9yIGNoYW5uZWwgbG9hZCBhbmQgbm9pc2UgaGlzdG9ncmFtIHBhcmFtZXRlcnMKLQlVQ0hBUiAgICAgICAgICAgICAgIE5IRmFjdG9yOyAgICAgICAgICAgICAgICAgICAvLyBQYXJhbWV0ZXIgZm9yIE5vaXNlIGhpc3RvZ3JhbQotCVVDSEFSICAgICAgICAgICAgICAgQ0xGYWN0b3I7ICAgICAgICAgICAgICAgICAgIC8vIFBhcmFtZXRlciBmb3IgY2hhbm5lbCBsb2FkCi0KLQlSQUxJTktfVElNRVJfU1RSVUNUCVN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyOwotCUJPT0xFQU4JCQkJU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nOwotCi0JVUNIQVIJCQlEdGltQ291bnQ7ICAgICAgLy8gMC4uIER0aW1QZXJpb2QtMQotCVVDSEFSCQkJRHRpbVBlcmlvZDsgICAgIC8vIGRlZmF1bHQgPSAzCi0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQlSVF84MDJfMTFfRExTCQlETFNFbnRyeVtNQVhfTlVNX09GX0RMU19FTlRSWV07Ci0JVUNIQVIJCQkJRGxzUmVwbGF5Q291bnRlcls4XTsKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy8gVGhpcyBpcyBvbmx5IGZvciBXSFFMIHRlc3QuCi0JQk9PTEVBTgkJCQlXaHFsVGVzdDsKLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBSQUxJTktfVElNRVJfU1RSVUNUIFdwYURpc2Fzc29jQW5kQmxvY2tBc3NvY1RpbWVyOwotICAgIC8vIEZhc3QgUm9hbWluZwotCUJPT0xFQU4JCSAgICAgICAgYkF1dG9Sb2FtaW5nOyAgICAgICAvLyAwOmRpc2FibGUgYXV0byByb2FtaW5nIGJ5IFJTU0ksIDE6ZW5hYmxlIGF1dG8gcm9hbWluZyBieSBSU1NJCi0JQ0hBUgkJICAgICAgICBkQm1Ub1JvYW07ICAgICAgICAgIC8vIHRoZSBjb25kaXRpb24gdG8gcm9hbSB3aGVuIHJlY2VpdmluZyBSc3NpIGxlc3MgdGhhbiB0aGlzIHZhbHVlLiBJdCdzIG5lZ2F0aXZlIHZhbHVlLgotCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgIEJPT0xFQU4gICAgICAgICAgICAgSUVFRTgwMjFYOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgSUVFRTgwMjF4X3JlcXVpcmVkX2tleXM7Ci0gICAgQ0lQSEVSX0tFWQkgICAgICAgIERlc2lyZVNoYXJlZEtleVs0XTsJLy8gUmVjb3JkIHVzZXIgZGVzaXJlZCBXRVAga2V5cwotICAgIFVDSEFSICAgICAgICAgICAgICAgRGVzaXJlU2hhcmVkS2V5SWQ7Ci0KLSAgICAvLyAwOiBkcml2ZXIgaWdub3JlcyB3cGFfc3VwcGxpY2FudAotICAgIC8vIDE6IHdwYV9zdXBwbGljYW50IGluaXRpYXRlcyBzY2FubmluZyBhbmQgQVAgc2VsZWN0aW9uCi0gICAgLy8gMjogZHJpdmVyIHRha2VzIGNhcmUgb2Ygc2Nhbm5pbmcsIEFQIHNlbGVjdGlvbiwgYW5kIElFRUUgODAyLjExIGFzc29jaWF0aW9uIHBhcmFtZXRlcnMKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIFdwYVN1cHBsaWNhbnRVUDsKLQlVQ0hBUgkJCQlXcGFTdXBwbGljYW50U2NhbkNvdW50OwotCUJPT0xFQU4JCQkJYlJTTl9JRV9Gcm9tV3BhU3VwcGxpY2FudDsKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLSAgICBDSEFSICAgICAgICAgICAgICAgIGRldl9uYW1lWzE2XTsKLSAgICBVU0hPUlQgICAgICAgICAgICAgIE9yaURldlR5cGU7Ci0KLSAgICBCT09MRUFOICAgICAgICAgICAgIGJUR25XaWZpVGVzdDsKLQlCT09MRUFOCQkJICAgIGJTY2FuUmVxSXNGcm9tV2ViVUk7Ci0KLQlIVFRSQU5TTUlUX1NFVFRJTkcJCQkJSFRQaHlNb2RlLCBNYXhIVFBoeU1vZGUsIE1pbkhUUGh5TW9kZTsvLyBGb3IgdHJhbnNtaXQgcGh5IHNldHRpbmcgaW4gVFhXSS4KLQlERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcJRGVzaXJlZFRyYW5zbWl0U2V0dGluZzsKLQlSVF9IVF9QSFlfSU5GTwkJCQkJRGVzaXJlZEh0UGh5SW5mbzsKLQlCT09MRUFOCQkJCQkJCWJBdXRvVHhSYXRlU3dpdGNoOwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0gICAgVUNIQVIgICAgICAgQkJQUjM7Ci0JLy8gUFMgQ29udHJvbCBoYXMgMiBtZWFuaW5ncyBmb3IgYWR2YW5jZWQgcG93ZXIgc2F2ZSBmdW5jdGlvbi4KLQkvLyAxLiBFbmFibGVQU2luSWRsZSA6IFdoZW4gbm8gY29ubmVjdGlvbiwgYWx3YXlzIHJhZGlvIG9mZiBleGNlcHQgbmVlZCB0byBkbyBzaXRlIHN1cnZleS4KLQkvLyAyLiBFbmFibGVOZXdQUyAgOiB3aWxsIHNhdmUgbW9yZSBjdXJyZW50IGluIHNsZWVwIG9yIHJhZGlvIG9mZiBtb2RlLgotCVBTX0NPTlRST0wJCQkJUFNDb250cm9sOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0jaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAotCVVDSEFSCQkJCUlFRUU4MDIxMWRDbGllbnRNb2RlOwotCVVDSEFSCQkJCVN0YU9yaUNvdW50cnlDb2RlWzNdOwotCVVDSEFSCQkJCVN0YU9yaUdlb2dyYXBoeTsKLSNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCi0KLQotCi0JQk9PTEVBTgkJCQliQXV0b0Nvbm5lY3RCeUJzc2lkOwotCVVMT05HCQkJCUJlYWNvbkxvc3RUaW1lOwkvLyBzZWNvbmRzCi0JQk9PTEVBTgkJCWJGb3JjZVR4QnVyc3Q7ICAgICAgICAgIC8vIDE6IGZvcmNlIGVuYmxlIFRYIFBBQ0tFVCBCVVJTVCwgMDogZGlzYWJsZQotfSBTVEFfQURNSU5fQ09ORklHLCAqUFNUQV9BRE1JTl9DT05GSUc7Ci0KLS8vIFRoaXMgZGF0YSBzdHJ1Y3R1cmUga2VlcCB0aGUgY3VycmVudCBhY3RpdmUgQlNTL0lCU1MncyBjb25maWd1cmF0aW9uIHRoYXQgdGhpcyBTVEEKLS8vIGhhZCBhZ3JlZWQgdXBvbiBqb2luaW5nIHRoZSBuZXR3b3JrLiBXaGljaCBtZWFucyB0aGVzZSBwYXJhbWV0ZXJzIGFyZSB1c3VhbGx5IGRlY2lkZWQKLS8vIGJ5IHRoZSBCU1MvSUJTUyBjcmVhdG9yIGluc3RlYWQgb2YgdXNlciBjb25maWd1cmF0aW9uLiBEYXRhIGluIHRoaXMgZGF0YSBzdHJ1Y3R1cnJlCi0vLyBpcyB2YWxpZCBvbmx5IHdoZW4gZWl0aGVyIEFESE9DX09OKHBBZCkgb3IgSU5GUkFfT04ocEFkKSBpcyBUUlVFLgotLy8gTm9ybWFsbHksIGFmdGVyIFNDQU4gb3IgZmFpbGVkIHJvYW1pbmcgYXR0ZW1wdHMsIHdlIG5lZWQgdG8gcmVjb3ZlciBiYWNrIHRvCi0vLyB0aGUgY3VycmVudCBhY3RpdmUgc2V0dGluZ3MuCi10eXBlZGVmIHN0cnVjdCBfU1RBX0FDVElWRV9DT05GSUcgewotCVVTSE9SVCAgICAgIEFpZDsKLQlVU0hPUlQgICAgICBBdGltV2luOyAgICAgICAgICAgICAgICAvLyBpbiBrdXNlYzsgSUJTUyBwYXJhbWV0ZXIgc2V0IGVsZW1lbnQKLQlVU0hPUlQgICAgICBDYXBhYmlsaXR5SW5mbzsKLQlVU0hPUlQgICAgICBDZnBNYXhEdXJhdGlvbjsKLQlVU0hPUlQgICAgICBDZnBQZXJpb2Q7Ci0KLQkvLyBDb3B5IHN1cHBvcnRlZCByYXRlIGZyb20gZGVzaXJlZCBBUCdzIGJlYWNvbi4gV2UgYXJlIHRyeWluZyB0byBtYXRjaAotCS8vIEFQJ3Mgc3VwcG9ydGVkIGFuZCBleHRlbmRlZCByYXRlIHNldHRpbmdzLgotCVVDSEFSICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwotCVVDSEFSICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwotCVVDSEFSICAgICAgIFN1cFJhdGVMZW47Ci0JVUNIQVIgICAgICAgRXh0UmF0ZUxlbjsKLQkvLyBDb3B5IHN1cHBvcnRlZCBodCBmcm9tIGRlc2lyZWQgQVAncyBiZWFjb24uIFdlIGFyZSB0cnlpbmcgdG8gbWF0Y2gKLQlSVF9IVF9QSFlfSU5GTwkJU3VwcG9ydGVkUGh5SW5mbzsKLQlSVF9IVF9DQVBBQklMSVRZCVN1cHBvcnRlZEh0UGh5OwotfSBTVEFfQUNUSVZFX0NPTkZJRywgKlBTVEFfQUNUSVZFX0NPTkZJRzsKLQotCi0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0KLXR5cGVkZWYgc3RydWN0IF9NQUNfVEFCTEVfRU5UUlkgewotCS8vQ2hvb3NlIDEgZnJvbSBWYWxpZEFzV0RTIGFuZCBWYWxpZEFzQ0xJICB0byB2YWxpZGl6ZS4KLQlCT09MRUFOCQlWYWxpZEFzQ0xJOwkJLy8gU3RhIG1vZGUsIHNldCB0aGlzIFRSVUUgYWZ0ZXIgTGlua3VwLHRvby4KLQlCT09MRUFOCQlWYWxpZEFzV0RTOwkvLyBUaGlzIGlzIFdEUyBFbnRyeS4gb25seSBmb3IgQVAgbW9kZS4KLQlCT09MRUFOCQlWYWxpZEFzQXBDbGk7ICAgLy9UaGlzIGlzIGEgQVAtQ2xpZW50IGVudHJ5LCBvbmx5IGZvciBBUCBtb2RlIHdoaWNoIGVuYWJsZSBBUC1DbGllbnQgZnVuY3Rpb25zLgotCUJPT0xFQU4JCVZhbGlkQXNNZXNoOwotCUJPT0xFQU4JCVZhbGlkQXNEbHM7CS8vIFRoaXMgaXMgRExTIEVudHJ5LiBvbmx5IGZvciBTVEEgbW9kZS4KLQlCT09MRUFOCQlpc0NhY2hlZDsKLQlCT09MRUFOCQliSUFtQmFkQXRoZXJvczsJLy8gRmxhZyBpZiB0aGlzIGlzIEF0aGVyb3MgY2hpcCB0aGF0IGhhcyBJT1QgcHJvYmxlbS4gIFdlIG5lZWQgdG8gdHVybiBvbiBSVFMvQ1RTIHByb3RlY3Rpb24uCi0KLQlVQ0hBUgkJRW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmc7ICAvLyBFbnF1ZXVlIEVBUG9MLVN0YXJ0IGZvciB0cmlnZ2VyaW5nIEVBUCBTTQotCS8vamFuIGZvciB3cGEKLQkvLyByZWNvcmQgd2hpY2ggZW50cnkgcmV2b2tlIE1JQyBGYWlsdXJlICwgaWYgaXQgbGVhdmVzIHRoZSBCU1MgaXRzZWxmLCBBUCB3b24ndCB1cGRhdGUgYU1JQ0ZhaWxUaW1lIE1JQgotCVVDSEFSICAgICAgICAgICBDTVRpbWVyUnVubmluZzsKLQlVQ0hBUiAgICAgICAgICAgYXBpZHg7CQkJLy8gTUJTUyBudW1iZXIKLQlVQ0hBUiAgICAgICAgICAgUlNOSUVfTGVuOwotCVVDSEFSICAgICAgICAgICBSU05fSUVbTUFYX0xFTl9PRl9SU05JRV07Ci0JVUNIQVIgICAgICAgICAgIEFOb25jZVtMRU5fS0VZX0RFU0NfTk9OQ0VdOwotCVVDSEFSICAgICAgICAgICBTTm9uY2VbTEVOX0tFWV9ERVNDX05PTkNFXTsKLQlVQ0hBUiAgICAgICAgICAgUl9Db3VudGVyW0xFTl9LRVlfREVTQ19SRVBMQVldOwotCVVDSEFSICAgICAgICAgICBQVEtbNjRdOwotCVVDSEFSICAgICAgICAgICBSZVRyeUNvdW50ZXI7Ci0JUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgICAgICAgICAgICAgUmV0cnlUaW1lcjsKLQlSQUxJTktfVElNRVJfU1RSVUNUCQkJCQlFbnF1ZXVlU3RhcnRGb3JQU0tUaW1lcjsJLy8gQSB0aW1lciB3aGljaCBlbnF1ZXVlIEVBUG9MLVN0YXJ0IGZvciB0cmlnZ2VyaW5nIFBTSyBTTQotCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlOyAgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHRvIHdoYXRldmVyIG1pY3Jvc29mdCBkZWZpbmVkCi0JTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOwotCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIEdyb3VwS2V5V2VwU3RhdHVzOwotCUFQX1dQQV9TVEFURSAgICBXcGFTdGF0ZTsKLQlHVEtfU1RBVEUgICAgICAgR1RLU3RhdGU7Ci0JVVNIT1JUICAgICAgICAgIFBvcnRTZWN1cmVkOwotCU5ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSICBQcml2YWN5RmlsdGVyOyAgICAgIC8vIFByaXZhY3lGaWx0ZXIgZW51bSBmb3IgODAyLjFYCi0JQ0lQSEVSX0tFWSAgICAgIFBhaXJ3aXNlS2V5OwotCVBWT0lEICAgICAgICAgICBwQWQ7Ci0JSU5UCQkJCVBNS0lEX0NhY2hlSWR4OwotCVVDSEFSCQkJUE1LSURbTEVOX1BNS0lEXTsKLQotCi0JVUNIQVIgICAgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgICAgICAgICAgUHNNb2RlOwotCVNTVCAgICAgICAgICAgICBTc3Q7Ci0JQVVUSF9TVEFURSAgICAgIEF1dGhTdGF0ZTsgLy8gZm9yIFNIQVJFRCBLRVkgYXV0aGVudGljYXRpb24gc3RhdGUgbWFjaGluZSB1c2VkIG9ubHkKLQlCT09MRUFOCQkJSXNSZWFzc29jU3RhOwkvLyBJbmRpY2F0ZSB3aGV0aGVyIHRoaXMgaXMgYSByZWFzc29jaWF0aW9uIHByb2NlZHVyZQotCVVTSE9SVCAgICAgICAgICBBaWQ7Ci0JVVNIT1JUICAgICAgICAgIENhcGFiaWxpdHlJbmZvOwotCVVDSEFSICAgICAgICAgICBMYXN0UnNzaTsKLQlVTE9ORyAgICAgICAgICAgTm9EYXRhSWRsZUNvdW50OwotCVVJTlQxNgkJCVN0YXRpb25LZWVwQWxpdmVDb3VudDsgLy8gdW5pdDogc2Vjb25kCi0JVUxPTkcgICAgICAgICAgIFBzUUlkbGVDb3VudDsKLQlRVUVVRV9IRUFERVIgICAgUHNRdWV1ZTsKLQotCVVJTlQzMgkJCVN0YUNvbm5lY3RUaW1lOwkJLy8gdGhlIGxpdmUgdGltZSBvZiB0aGlzIHN0YXRpb24gc2luY2UgYXNzb2NpYXRlZCB3aXRoIEFQCi0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCUJPT0xFQU4JCQliU2VuZEJBUjsKLQlVU0hPUlQJCQlOb0JBRGF0YUNvdW50RG93bjsKLQotCVVJTlQzMgkJCUNhY2hlZEJ1ZlsxNl07CQkvLyBVSU5UICg0IGJ5dGVzKSBmb3IgYWxpZ25tZW50Ci0JVUlOVAkJCVR4QkZDb3VudDsgLy8gMyozCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JVUlOVAkJCUZJRk9Db3VudDsKLQlVSU5UCQkJRGVidWdGSUZPQ291bnQ7Ci0JVUlOVAkJCURlYnVnVHhDb3VudDsKLSAgICBCT09MRUFOCQkJYkRsc0luaXQ7Ci0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vL1dEUyBlbnRyeSBuZWVkcyB0aGVzZQotLy8gaWYgVmFsaWRBc1dEUz09VFJVRSwgTWF0Y2hXRFNUYWJJZHggaXMgdGhlIGluZGV4IGluIFdkc1RhYi5NYWNUYWIKLQlVSU5UCQkJTWF0Y2hXRFNUYWJJZHg7Ci0JVUNIQVIgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGU7Ci0JVUNIQVIgICAgICAgICAgIEN1cnJUeFJhdGU7Ci0JVUNIQVIgICAgICAgICAgIEN1cnJUeFJhdGVJbmRleDsKLQkvLyB0byByZWNvcmQgdGhlIGVhY2ggVFggcmF0ZSdzIHF1YWxpdHkuIDAgaXMgYmVzdCwgdGhlIGJpZ2dlciB0aGUgd29yc2UuCi0JVVNIT1JUICAgICAgICAgIFR4UXVhbGl0eVtNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSF07Ci0vLwlVU0hPUlQgICAgICAgICAgT25lU2VjVHhPa0NvdW50OwotCVVJTlQzMgkJCU9uZVNlY1R4Tm9SZXRyeU9rQ291bnQ7Ci0JVUlOVDMyICAgICAgICAgIE9uZVNlY1R4UmV0cnlPa0NvdW50OwotCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeEZhaWxDb3VudDsKLQlVSU5UMzIJCQlDb250aW51ZVR4RmFpbENudDsKLQlVSU5UMzIgICAgICAgICAgQ3VyclR4UmF0ZVN0YWJsZVRpbWU7IC8vICMgb2Ygc2Vjb25kIGluIGN1cnJlbnQgVFggcmF0ZQotCVVDSEFSICAgICAgICAgICBUeFJhdGVVcFBlbmFsdHk7ICAgICAgLy8gZXh0cmEgIyBvZiBzZWNvbmQgcGVuYWx0eSBkdWUgdG8gbGFzdCB1bnN0YWJsZSBjb25kaXRpb24KLSNpZmRlZiBXRFNfU1VQUE9SVAotCUJPT0xFQU4JCUxvY2tFbnRyeVR4OyAvLyBUUlVFID0gYmxvY2sgdG8gV0RTIEVudHJ5IHRyYWZmaWMsIEZBTFNFID0gbm90LgotCVVJTlQzMgkJVGltZVN0YW1wX3RvVHhSaW5nOwotI2VuZGlmIC8vIFdEU19TVVBQT1JUIC8vCi0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCVVJTlQJCQlNYXRjaERsc0VudHJ5SWR4OyAvLyBpbmRpY2F0ZSB0aGUgaW5kZXggaW4gcEFkLT5TdGFDZmcuRExTRW50cnkKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCUJPT0xFQU4gICAgICAgICBmTm9pc3lFbnZpcm9ubWVudDsKLQlCT09MRUFOCQkJZkxhc3RTZWNBY2NvcmRpbmdSU1NJOwotCVVDSEFSICAgICAgICAgICBMYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOyAvLyAwOiBubyBjaGFuZ2UsIDE6cmF0ZSBVUCwgMjpyYXRlIGRvd24KLQlDSEFSCQkJTGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb247IC8vS2VlcCBsYXN0IHRpbWUgdmFsdWUgb2YgTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbgotCVVMT05HCQkJTGFzdFR4T2tDb3VudDsKLQlVQ0hBUiAgICAgICAgICAgUEVSW01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKLQotCS8vIGEgYml0bWFwIG9mIEJPT0xFQU4gZmxhZ3MuIGVhY2ggYml0IHJlcHJlc2VudCBhbiBvcGVyYXRpb24gc3RhdHVzIG9mIGEgcGFydGljdWxhcgotCS8vIEJPT0xFQU4gY29udHJvbCwgZWl0aGVyIE9OIG9yIE9GRi4gVGhlc2UgZmxhZ3Mgc2hvdWxkIGFsd2F5cyBiZSBhY2Nlc3NlZCB2aWEKLQkvLyBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRygpLCBDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCksIENMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRygpIG1hY3Jvcy4KLQkvLyBzZWUgZk9QX1NUQVRVU194eHggaW4gUlRNUF9ERUYuQyBmb3IgZGV0YWlsIGJpdCBkZWZpbml0aW9uLiBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQKLQlVTE9ORyAgICAgICAgICAgQ2xpZW50U3RhdHVzRmxhZ3M7Ci0KLQlIVFRSQU5TTUlUX1NFVFRJTkcJSFRQaHlNb2RlLCBNYXhIVFBoeU1vZGUsIE1pbkhUUGh5TW9kZTsvLyBGb3IgdHJhbnNtaXQgcGh5IHNldHRpbmcgaW4gVFhXSS4KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCS8vIEhUIEVXQyBNSU1PLU4gdXNlZCBwYXJhbWV0ZXJzCi0JVVNIT1JUCQlSWEJBYml0bWFwOwkvLyBmaWxsIHRvIG9uLWNoaXAgIFJYV0lfQkFfQklUTUFTSyBpbiA4LjEuM1JYIGF0dHJpYnV0ZSBlbnRyeSBmb3JtYXQKLQlVU0hPUlQJCVRYQkFiaXRtYXA7CS8vIFRoaXMgYml0bWFwIGFzIG9yaWdpbmF0b3IsIG9ubHkga2VlcCBpbiBzb2Z0d2FyZSB1c2VkIHRvIG1hcmsgQU1QRFUgYml0IGluIFRYV0kKLQlVU0hPUlQJCVRYQXV0b0JBYml0bWFwOwotCVVTSE9SVAkJQkFEZWNsaW5lQml0bWFwOwotCVVTSE9SVAkJQkFSZWNXY2lkQXJyYXlbTlVNX09GX1RJRF07CS8vIFRoZSBtYXBwaW5nIHdjaWQgb2YgcmVjaXBpZW50IHNlc3Npb24uIGlmIFJYQkFiaXRtYXAgYml0IGlzIG1hc2tlZAotCVVTSE9SVAkJQkFPcmlXY2lkQXJyYXlbTlVNX09GX1RJRF07IC8vIFRoZSBtYXBwaW5nIHdjaWQgb2Ygb3JpZ2luYXRvciBzZXNzaW9uLiBpZiBUWEJBYml0bWFwIGJpdCBpcyBtYXNrZWQKLQlVU0hPUlQJCUJBT3JpU2VxdWVuY2VbTlVNX09GX1RJRF07IC8vIFRoZSBtYXBwaW5nIHdjaWQgb2Ygb3JpZ2luYXRvciBzZXNzaW9uLiBpZiBUWEJBYml0bWFwIGJpdCBpcyBtYXNrZWQKLQotCS8vIDgwMi4xMW4gZmVhdHVyZXMuCi0JVUNIQVIJCU1wZHVEZW5zaXR5OwotCVVDSEFSCQlNYXhSQW1wZHVGYWN0b3I7Ci0JVUNIQVIJCUFNc2R1U2l6ZTsKLQlVQ0hBUgkJTW1wc01vZGU7CS8vIE1JTU8gcG93ZXIgc2F2ZSBtb3JlLgotCi0JSFRfQ0FQQUJJTElUWV9JRQkJSFRDYXBhYmlsaXR5OwotCi0jaWZkZWYgRE9UMTFOX0RSQUZUMwotCVVDSEFSCQlCU1MyMDQwQ29leGlzdGVuY2VNZ210U3VwcG9ydDsKLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlCT09MRUFOCQliQXV0b1R4UmF0ZVN3aXRjaDsKLQotCVVDSEFSICAgICAgIFJhdGVMZW47Ci0Jc3RydWN0IF9NQUNfVEFCTEVfRU5UUlkgKnBOZXh0OwotICAgIFVTSE9SVCAgICAgIFR4U2VxW05VTV9PRl9USURdOwotCVVTSE9SVAkJTm9uUW9zRGF0YVNlcTsKLQotCVJTU0lfU0FNUExFCVJzc2lTYW1wbGU7Ci0KLQlVSU5UMzIJCQlUWE1DU0V4cGVjdGVkWzE2XTsKLQlVSU5UMzIJCQlUWE1DU1N1Y2Nlc3NmdWxbMTZdOwotCVVJTlQzMgkJCVRYTUNTRmFpbGVkWzE2XTsKLQlVSU5UMzIJCQlUWE1DU0F1dG9GYWxsQmFja1sxNl1bMTZdOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JVUxPTkcJCQlMYXN0QmVhY29uUnhUaW1lOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLQotCVVMT05HIEFzc29jRGVhZExpbmU7Ci0KLQotCi0JVUxPTkcgQ2hhbm5lbFF1YWxpdHk7ICAvLyAwLi4xMDAsIENoYW5uZWwgUXVhbGl0eSBJbmRpY2F0aW9uIGZvciBSb2FtaW5nCi0KLX0gTUFDX1RBQkxFX0VOVFJZLCAqUE1BQ19UQUJMRV9FTlRSWTsKLQotdHlwZWRlZiBzdHJ1Y3QgX01BQ19UQUJMRSB7Ci0JVVNIT1JUCQkJU2l6ZTsKLQlNQUNfVEFCTEVfRU5UUlkgKkhhc2hbSEFTSF9UQUJMRV9TSVpFXTsKLQlNQUNfVEFCTEVfRU5UUlkgQ29udGVudFtNQVhfTEVOX09GX01BQ19UQUJMRV07Ci0JUVVFVUVfSEVBREVSICAgIE1jYXN0UHNRdWV1ZTsKLQlVTE9ORyAgICAgICAgICAgUHNRSWRsZUNvdW50OwotCUJPT0xFQU4gICAgICAgICBmQW55U3RhdGlvbkluUHNtOwotCUJPT0xFQU4gICAgICAgICBmQW55U3RhdGlvbkJhZEF0aGVyb3M7CS8vIENoZWNrIGlmIGFueSBTdGF0aW9uIGlzIGF0aGVyb3MgODAyLjExbiBDaGlwLiAgV2UgbmVlZCB0byB1c2UgUlRTL0NUUyB3aXRoIEF0aGVyb3MgODAyLC4xMW4gY2hpcC4KLQlCT09MRUFOCQkJZkFueVR4T1BGb3JjZURpc2FibGU7CS8vIENoZWNrIGlmIGl0IGlzIG5lY2Vzc2FyeSB0byBkaXNhYmxlIEJFIFR4T1AKLQlCT09MRUFOCQkJZkFsbFN0YXRpb25Bc1JhbGluazsJLy8gQ2hlY2sgaWYgYWxsIHN0YXRpb25zIGFyZSByYWxpbmstY2hpcHNldAotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCUJPT0xFQU4gICAgICAgICBmQW55U3RhdGlvbklzTGVnYWN5OwkvLyBDaGVjayBpZiBJIHVzZSBsZWdhY3kgcmF0ZSB0byB0cmFuc21pdCB0byBteSBCU1MgU3RhdGlvbi8KLQlCT09MRUFOICAgICAgICAgZkFueVN0YXRpb25Ob25HRjsJCS8vIENoZWNrIGlmIGFueSBTdGF0aW9uIGNhbid0IHN1cHBvcnQgR0YuCi0JQk9PTEVBTiAgICAgICAgIGZBbnlTdGF0aW9uMjBPbmx5OwkJLy8gQ2hlY2sgaWYgYW55IFN0YXRpb24gY2FuJ3Qgc3VwcG9ydCBHRi4KLQlCT09MRUFOCQkJZkFueVN0YXRpb25NSU1PUFNEeW5hbWljOyAvLyBDaGVjayBpZiBhbnkgU3RhdGlvbiBpcyBNSU1PIER5bmFtaWMKLQlCT09MRUFOICAgICAgICAgZkFueUJBU2Vzc2lvbjsgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBCQSBzZXNzaW9uLiAgRm9yY2UgdHVybiBvbiBSVFMvQ1RTCi0vLzIwMDgvMTAvMjg6IEtIIGFkZCB0byBzdXBwb3J0IEFudGVubmEgcG93ZXItc2F2aW5nIG9mIEFQPC0tCi0vLzIwMDgvMTAvMjg6IEtIIGFkZCB0byBzdXBwb3J0IEFudGVubmEgcG93ZXItc2F2aW5nIG9mIEFQLS0+Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi19IE1BQ19UQUJMRSwgKlBNQUNfVEFCTEU7Ci0KLQotCi0KLSNpZmRlZiBCTE9DS19ORVRfSUYKLXR5cGVkZWYgc3RydWN0IF9CTE9DS19RVUVVRV9FTlRSWQotewotCUJPT0xFQU4gU3dUeFF1ZXVlQmxvY2tGbGFnOwotCUxJU1RfSEVBREVSIE5ldElmTGlzdDsKLX0gQkxPQ0tfUVVFVUVfRU5UUlksICpQQkxPQ0tfUVVFVUVfRU5UUlk7Ci0jZW5kaWYgLy8gQkxPQ0tfTkVUX0lGIC8vCi0KLQotc3RydWN0IHdpZmljb25mCi17Ci0JQk9PTEVBTgliU2hvcnRHSTsKLQlCT09MRUFOIGJHcmVlbkZpZWxkOwotfTsKLQotCi10eXBlZGVmIHN0cnVjdCBfUlRNUF9ERVZfSU5GT18KLXsKLQlVQ0hBUgkJCWNoaXBOYW1lWzE2XTsKLQlSVE1QX0lORl9UWVBFCWluZlR5cGU7Ci19UlRNUF9ERVZfSU5GTzsKLQotCi0jaWZkZWYgREJHX0RJQUdOT1NFCi0jZGVmaW5lIERJQUdOT1NFX1RJTUUJMTAgICAvLyAxMCBzZWMKLXR5cGVkZWYgc3RydWN0IF9SdG1wRGlhZ1N0cmN1dF8KLXsJLy8gRGlhZ25vc2lzIFJlbGF0ZWQgZWxlbWVudAotCXVuc2lnbmVkIGNoYXIJCWluaXRlZDsKLQl1bnNpZ25lZCBjaGFyCXFJZHg7Ci0JdW5zaWduZWQgY2hhcglBcnJheVN0YXJ0SWR4OwotCXVuc2lnbmVkIGNoYXIJCUFycmF5Q3VySWR4OwotCS8vIFR4IFJlbGF0ZWQgQ291bnQKLQlVU0hPUlQJCQlUeERhdGFDbnRbRElBR05PU0VfVElNRV07Ci0JVVNIT1JUCQkJVHhGYWlsQ250W0RJQUdOT1NFX1RJTUVdOwotLy8JVVNIT1JUCQkJVHhEZXNjQ250W0RJQUdOT1NFX1RJTUVdWzE2XTsJCS8vIFR4RGVzYyBxdWV1ZSBsZW5ndGggaW4gc2NhbGUgb2YgMH4xNCwgPj0xNQotCVVTSE9SVAkJCVR4RGVzY0NudFtESUFHTk9TRV9USU1FXVsyNF07IC8vIDMqMwkvLyBUeERlc2MgcXVldWUgbGVuZ3RoIGluIHNjYWxlIG9mIDB+MTQsID49MTUKLS8vCVVTSE9SVAkJCVR4TWNzQ250W0RJQUdOT1NFX1RJTUVdWzE2XTsJCQkvLyBUeERhdGUgTUNTIENvdW50IGluIHJhbmdlIGZyb20gMCB0byAxNSwgc3RlcCBpbiAxLgotCVVTSE9SVAkJCVR4TWNzQ250W0RJQUdOT1NFX1RJTUVdWzI0XTsgLy8gMyozCi0JVVNIT1JUCQkJVHhTV1F1ZUNudFtESUFHTk9TRV9USU1FXVs5XTsJCS8vIFR4U3dRdWV1ZSBsZW5ndGggaW4gc2NhbGUgb2YgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgPj04Ci0KLQlVU0hPUlQJCQlUeEFnZ0NudFtESUFHTk9TRV9USU1FXTsKLQlVU0hPUlQJCQlUeE5vbkFnZ0NudFtESUFHTk9TRV9USU1FXTsKLS8vCVVTSE9SVAkJCVR4QU1QRFVDbnRbRElBR05PU0VfVElNRV1bMTZdOwkJLy8gMTAgc2VjLCBUeERNQSBBUE1EVSBBZ2dyZWdhdGlvbiBjb3VudCBpbiByYW5nZSBmcm9tIDAgdG8gMTUsIGluIHNldHAgb2YgMS4KLQlVU0hPUlQJCQlUeEFNUERVQ250W0RJQUdOT1NFX1RJTUVdWzI0XTsgLy8gMyozIC8vIDEwIHNlYywgVHhETUEgQVBNRFUgQWdncmVnYXRpb24gY291bnQgaW4gcmFuZ2UgZnJvbSAwIHRvIDE1LCBpbiBzZXRwIG9mIDEuCi0JVVNIT1JUCQkJVHhSYWxpbmtDbnRbRElBR05PU0VfVElNRV07CQkJLy8gVHhSYWxpbmsgQWdncmVnYXRpb24gQ291bnQgaW4gMSBzZWMgc2NhbGUuCi0JVVNIT1JUCQkJVHhBTVNEVUNudFtESUFHTk9TRV9USU1FXTsJCQkvLyBUeEFNU1VEIEFnZ3JlZ2F0aW9uIENvdW50IGluIDEgc2VjIHNjYWxlLgotCi0JLy8gUnggUmVsYXRlZCBDb3VudAotCVVTSE9SVAkJCVJ4RGF0YUNudFtESUFHTk9TRV9USU1FXTsJCQkvLyBSeCBUb3RhbCBEYXRhIGNvdW50LgotCVVTSE9SVAkJCVJ4Q3JjRXJyQ250W0RJQUdOT1NFX1RJTUVdOwotLy8JVVNIT1JUCQkJUnhNY3NDbnRbRElBR05PU0VfVElNRV1bMTZdOwkJLy8gUnggTUNTIENvdW50IGluIHJhbmdlIGZyb20gMCB0byAxNSwgc3RlcCBpbiAxLgotCVVTSE9SVAkJCVJ4TWNzQ250W0RJQUdOT1NFX1RJTUVdWzI0XTsgLy8gMyozCi19UnRtcERpYWdTdHJ1Y3Q7Ci0jZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCi0KLQotc3RydWN0IF9SVE1QX0NISVBfT1BfCi17Ci0JLyogIENhbGlicmF0aW9uIGFjY2VzcyByZWxhdGVkIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLwotCWludCAoKmVlaW5pdCkoUlRNUF9BREFQVEVSICpwQWQpOwkJCQkJCQkJCQkvKiBpbnQgKCplZWluaXQpKFJUTVBfQURBUFRFUiAqcEFkKTsgKi8KLQlpbnQgKCplZXJlYWQpKFJUTVBfQURBUFRFUiAqcEFkLCBVU0hPUlQgb2Zmc2V0LCBQVVNIT1JUIHBWYWx1ZSk7CQkJCS8qIGludCAoKmVlcmVhZCkoUlRNUF9BREFQVEVSICpwQWQsIGludCBvZmZzZXQsIFBVU0hPUlQgcFZhbHVlKTsgKi8KLQlpbnQgKCplZXdyaXRlKShSVE1QX0FEQVBURVIgKnBBZCwgVVNIT1JUIG9mZnNldCwgVVNIT1JUIHZhbHVlKTs7CQkJCS8qIGludCAoKmVld3JpdGUpKFJUTVBfQURBUFRFUiAqcEFkLCBpbnQgb2Zmc2V0LCBVU0hPUlQgdmFsdWUpOyAqLwotCi0JLyogTUNVIHJlbGF0ZWQgY2FsbGJhY2sgZnVuY3Rpb25zICovCi0JaW50ICgqbG9hZEZpcm13YXJlKShSVE1QX0FEQVBURVIgKnBBZCk7CQkJCQkJCQkvKiBpbnQgKCpsb2FkRmlybXdhcmUpKFJUTVBfQURBUFRFUiAqcEFkKTsgKi8KLQlpbnQgKCplcmFzZUZpcm13YXJlKShSVE1QX0FEQVBURVIgKnBBZCk7CQkJCQkJCQkvKiBpbnQgKCplcmFzZUZpcm13YXJlKShSVE1QX0FEQVBURVIgKnBBZCk7ICovCi0JaW50ICgqc2VuZENvbW1hbmRUb01jdSkoUlRNUF9BREFQVEVSICpwQWQsIFVDSEFSIGNtZCwgVUNIQVIgdG9rZW4sIFVDSEFSIGFyZzAsIFVDSEFSIGFyZzEpOzsJLyogaW50ICgqc2VuZENvbW1hbmRUb01jdSkoUlRNUF9BREFQVEVSICpwQWQsIFVDSEFSIGNtZCwgVUNIQVIgdG9rZW4sIFVDSEFSIGFyZzAsIFVDSEFSIGFyZzEpOyAqLwotCi0JLyogUkYgYWNjZXNzIHJlbGF0ZWQgY2FsbGJhY2sgZnVuY3Rpb25zICovCi0JUkVHX1BBSVIgKnBSRlJlZ1RhYmxlOwotCXZvaWQgKCpBc2ljUmZJbml0KShSVE1QX0FEQVBURVIgKnBBZCk7Ci0Jdm9pZCAoKkFzaWNSZlR1cm5PbikoUlRNUF9BREFQVEVSICpwQWQpOwotCXZvaWQgKCpBc2ljUmZUdXJuT2ZmKShSVE1QX0FEQVBURVIgKnBBZCk7Ci0Jdm9pZCAoKkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlKShSVE1QX0FEQVBURVIgKnBBZCk7Ci0Jdm9pZCAoKkFzaWNIYWx0QWN0aW9uKShSVE1QX0FEQVBURVIgKnBBZCk7Ci19OwotCi0KLS8vCi0vLyAgVGhlIG1pbmlwb3J0IGFkYXB0ZXIgc3RydWN0dXJlCi0vLwotc3RydWN0IF9SVE1QX0FEQVBURVIKLXsKLQlQVk9JRAkJCQkJT1NfQ29va2llOwkvLyBzYXZlIHNwZWNpZmljIHN0cnVjdHVyZSByZWxhdGl2ZSB0byBPUwotCVBORVRfREVWCQkJCW5ldF9kZXY7Ci0JVUxPTkcJCQkJCVZpcnR1YWxJZkNudDsKLQotCVJUTVBfQ0hJUF9PUAkJCWNoaXBPcHM7Ci0JVVNIT1JUCQkJCQlUaGlzVGJ0dE51bVRvTmV4dFdha2VVcDsKLQotI2lmZGVmIElORl9BTUFaT05fUFBBCi0JVUlOVDMyICBnX2lmX2lkOwotCUJPT0xFQU4JUFBBRW5hYmxlOwotCVBQQV9ESVJFQ1RQQVRIX0NCICAgICAgICpwRGlyZWN0cGF0aENiOwotI2VuZGlmIC8vIElORl9BTUFaT05fUFBBIC8vCi0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgUENJIHJlbGF0ZWQgcGFyYW1ldGVycwkJCQkJCQkJCQkJCQkJCQkgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JUFVDSEFSICAgICAgICAgICAgICAgICAgQ1NSQmFzZUFkZHJlc3M7ICAgICAvLyBQQ0kgTU1JTyBCYXNlIEFkZHJlc3MsIGFsbCBhY2Nlc3Mgd2lsbCB1c2UKLQl1bnNpZ25lZCBpbnQJCQlpcnFfbnVtOwotCi0JVVNIT1JUCQkgICAgICAgICAgICBMbmtDdHJsQml0TWFzazsKLQlVU0hPUlQJCSAgICAgICAgICAgIFJMbmtDdHJsQ29uZmlndXJhdGlvbjsKLQlVU0hPUlQgICAgICAgICAgICAgICAgICBSTG5rQ3RybE9mZnNldDsKLQlVU0hPUlQJCSAgICAgICAgICAgIEhvc3RMbmtDdHJsQ29uZmlndXJhdGlvbjsKLQlVU0hPUlQgICAgICAgICAgICAgICAgICBIb3N0TG5rQ3RybE9mZnNldDsKLQlVU0hPUlQJCSAgICAgICAgICAgIFBDSWVQb3dlclNhdmVMZXZlbDsKLQlVTE9ORwkJCQlSdDN4eEhvc3RMaW5rQ3RybDsJLy8gVVNlZCBmb3IgMzA5MEYgY2hpcAotCVVMT05HCQkJCVJ0M3h4UmFsaW5rTGlua0N0cmw7CS8vIFVTZWQgZm9yIDMwOTBGIGNoaXAKLQlVU0hPUlQJCQkJRGV2aWNlSUQ7ICAgICAgICAgICAvLyBSZWFkIGZyb20gUENJIGNvbmZpZwotCVVMT05HCQkJCUFjY2Vzc0JCUEZhaWxDb3VudDsKLQlCT09MRUFOCQkJCQliUENJY2xrT2ZmOwkJCQkJCS8vIGZsYWcgdGhhdCBpbmRpY2F0ZSBpZiB0aGUgUElDRSBwb3dlciBzdGF0dXMgaW4gQ29uZmlndXJhdGlvbiBTUGFjZS4uCi0JQk9PTEVBTgkJCQkJYlBDSWNsa09mZkRpc2FibGVUeDsJCQkvLwotCi0JQk9PTEVBTgkJCQkJYnJ0MzB4eEJhbk1jdUNtZDsJLy93aGVuID0gMHhmZiBtZWFucyBhbGwgY29tbWFuZHMgYXJlIG9rIHRvIHNldCAuCi0JQk9PTEVBTgkJCQkJYjMwOTBFU3BlY2lhbENoaXA7CS8vMzA5MEUgc3BlY2lhbCBjaGlwIHRoYXQgd3JpdGUgRUVQUk9NIDB4MjQ9MHg5MjgwLgotCVVMT05HCQkJCQlDaGVja0RtYUJ1c3lDb3VudDsgIC8vIENoZWNrIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgQ291bnQuCi0KLQlVSU5UCQkJCQlpbnRfZW5hYmxlX3JlZzsKLQlVSU5UCQkJCQlpbnRfZGlzYWJsZV9tYXNrOwotCVVJTlQJCQkJCWludF9wZW5kaW5nOwotCi0KLQlSVE1QX0RNQUJVRiAgICAgICAgICAgICBUeEJ1ZlNwYWNlW05VTV9PRl9UWF9SSU5HXTsgLy8gU2hhcmVkIG1lbW9yeSBvZiBhbGwgMXN0IHByZS1hbGxvY2F0ZWQgVHhCdWYgYXNzb2NpYXRlZCB3aXRoIGVhY2ggVFhECi0JUlRNUF9ETUFCVUYgICAgICAgICAgICAgUnhEZXNjUmluZzsgICAgICAgICAgICAgICAgIC8vIFNoYXJlZCBtZW1vcnkgZm9yIFJYIGRlc2NyaXB0b3JzCi0JUlRNUF9ETUFCVUYgICAgICAgICAgICAgVHhEZXNjUmluZ1tOVU1fT0ZfVFhfUklOR107CS8vIFNoYXJlZCBtZW1vcnkgZm9yIFR4IGRlc2NyaXB0b3JzCi0JUlRNUF9UWF9SSU5HICAgICAgICAgICAgVHhSaW5nW05VTV9PRl9UWF9SSU5HXTsJCS8vIEFDMH40ICsgSENDQQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0KLQlORElTX1NQSU5fTE9DSwkJaXJxX2xvY2s7Ci0JVUNIQVIJCQkJaXJxX2Rpc2FibGVkOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgUkJVUyByZWxhdGVkIHBhcmFtZXRlcnMJCQkJCQkJCQkJCQkJCQkJICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgQm90aCBQQ0kvVVNCIHJlbGF0ZWQgcGFyYW1ldGVycwkJCQkJCQkJCQkJCQkJICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCS8vUlRNUF9ERVZfSU5GTwkJCWNoaXBJbmZvOwotCVJUTVBfSU5GX1RZUEUJCQlpbmZUeXBlOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgIERyaXZlciBNZ210IHJlbGF0ZWQgcGFyYW1ldGVycwkJCQkJCQkJCQkJCQkJICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCVJUTVBfT1NfVEFTSwkJCW1sbWVUYXNrOwotI2lmZGVmIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUCi0JLy8gSWYgeW91IHdhbnQgdXNlIHRpbWVyIHRhc2sgdG8gaGFuZGxlIHRoZSB0aW1lciByZWxhdGVkIGpvYnMsIGVuYWJsZSB0aGlzLgotCVJUTVBfVElNRVJfVEFTS19RVUVVRQlUaW1lclE7Ci0JTkRJU19TUElOX0xPQ0sJCQlUaW1lclFMb2NrOwotCVJUTVBfT1NfVEFTSwkJCXRpbWVyVGFzazsKLSNlbmRpZiAvLyBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVCAvLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgVHggcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCUJPT0xFQU4gICAgICAgICAgICAgICAgIERlUXVldWVSdW5uaW5nW05VTV9PRl9UWF9SSU5HXTsgIC8vIGZvciBlbnN1cmluZyBSVFVTQkRlUXVldWVQYWNrZXQgZ2V0IGNhbGwgb25jZQotCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIERlUXVldWVMb2NrW05VTV9PRl9UWF9SSU5HXTsKLQotCi0JLy8gcmVzb3VyY2UgZm9yIHNvZnR3YXJlIGJhY2tsb2cgcXVldWVzCi0JUVVFVUVfSEVBREVSICAgICAgICAgICAgVHhTd1F1ZXVlW05VTV9PRl9UWF9SSU5HXTsgIC8vIDQgQUMgKyAxIEhDQ0EKLQlORElTX1NQSU5fTE9DSyAgICAgICAgICBUeFN3UXVldWVMb2NrW05VTV9PRl9UWF9SSU5HXTsJLy8gVHhTd1F1ZXVlIHNwaW5sb2NrCi0KLQlSVE1QX0RNQUJVRiAgICAgICAgICAgICBNZ210RGVzY1Jpbmc7CQkJLy8gU2hhcmVkIG1lbW9yeSBmb3IgTUdNVCBkZXNjcmlwdG9ycwotCVJUTVBfTUdNVF9SSU5HICAgICAgICAgIE1nbXRSaW5nOwotCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIE1nbXRSaW5nTG9jazsJCQkvLyBQcmlvIFJpbmcgc3BpbmxvY2sKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgIFJ4IHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCVJUTVBfUlhfUklORyAgICAgICAgICAgIFJ4UmluZzsKLQlORElTX1NQSU5fTE9DSyAgICAgICAgICBSeFJpbmdMb2NrOyAgICAgICAgICAgICAgICAgLy8gUnggUmluZyBzcGlubG9jawotI2lmZGVmIFJUMzA5MAotCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIE1jdUNtZExvY2s7ICAgICAgICAgICAgICAvL01DVSBDb21tYW5kIFF1ZXVlIHNwaW5sb2NrCi0jZW5kaWYgLy8gUlQzMDkwIC8vCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgIEFTSUMgcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JVUlOVDMyCQkJTUFDVmVyc2lvbjsJCS8vIE1BQyB2ZXJzaW9uLiBSZWNvcmQgcnQyODYwQygweDI4NjAwMTAwKSBvciBydDI4NjBEICgweDI4NjAwMTAxKS4uCi0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBFMlBST00KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlVTE9ORwkJCQlFZXByb21WZXJzaW9uOyAgICAgICAgICAvLyBieXRlIDA6IHZlcnNpb24sIGJ5dGUgMTogcmV2aXNpb24sIGJ5dGUgMn4zOiB1bnVzZWQKLQlVTE9ORwkJCQlGaXJtd2FyZVZlcnNpb247ICAgICAgICAvLyBieXRlIDA6IE1pbm9yIHZlcnNpb24sIGJ5dGUgMTogTWFqb3IgdmVyc2lvbiwgb3RoZXJ3aXNlIHVudXNlZC4KLQlVU0hPUlQJCQkJRUVQUk9NRGVmYXVsdFZhbHVlW05VTV9FRVBST01fQkJQX1BBUk1TXTsKLQlVQ0hBUgkJCQlFRVBST01BZGRyZXNzTnVtOyAgICAgICAvLyA5M2M0Nj02ICA5M2M2Nj04Ci0JQk9PTEVBTgkJCQlFZXByb21BY2Nlc3M7Ci0JVUNIQVIJCQkJRUZ1c2VUYWc7Ci0KLQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIEJCUCBDb250cm9sCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWZkZWYgTUVSR0VfQVJDSF9URUFNCi0JVUNIQVIgICAgICAgICAgICAgICAgICAgQmJwV3JpdGVMYXRjaFsyNTZdOyAgICAgLy8gcmVjb3JkIGxhc3QgQkJQIHJlZ2lzdGVyIHZhbHVlIHdyaXR0ZW4gdmlhIEJCUF9JT19XUklURS9CQlBfSU9fV1JJVEVfVllfUkVHX0lECi0jZWxzZQotCVVDSEFSICAgICAgICAgICAgICAgICAgIEJicFdyaXRlTGF0Y2hbMTQwXTsgICAgIC8vIHJlY29yZCBsYXN0IEJCUCByZWdpc3RlciB2YWx1ZSB3cml0dGVuIHZpYSBCQlBfSU9fV1JJVEUvQkJQX0lPX1dSSVRFX1ZZX1JFR19JRAotI2VuZGlmIC8vIE1FUkdFX0FSQ0hfVEVBTSAvLwotCUNIQVIJCQkJCUJicFJzc2lUb0RibURlbHRhOwkJLy8gY2hhbmdlIGZyb20gVUNIQVIgdG8gQ0hBUiBmb3IgaGlnaCBwb3dlcgotCUJCUF9SNjZfVFVOSU5HICAgICAgICAgIEJicFR1bmluZzsKLQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBSRklDIGNvbnRyb2wKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JVUNIQVIgICAgICAgICAgICAgICAgICAgUmZJY1R5cGU7ICAgICAgIC8vIFJGSUNfeHh4Ci0JVUxPTkcgICAgICAgICAgICAgICAgICAgUmZGcmVxT2Zmc2V0OyAgIC8vIEZyZXF1ZW5jeSBvZmZzZXQgZm9yIGNoYW5uZWwgc3dpdGNoaW5nCi0JUlRNUF9SRl9SRUdTICAgICAgICAgICAgTGF0Y2hSZlJlZ3M7ICAgIC8vIGxhdGNoIHRoIGxhdGVzdCBSRiBwcm9ncmFtbWluZyB2YWx1ZSBzaW5jZSBSRiBJQyBkb2Vzbid0IHN1cHBvcnQgUkVBRAotCi0JRUVQUk9NX0FOVEVOTkFfU1RSVUMgICAgQW50ZW5uYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgQU50ZW5uYSBkZWZpbml0aW9uIGlzIGRpZmZlcmVudCBmb3IgYSAmIGcuIFdlIG5lZWQgdG8gc2F2ZSBpdCBmb3IgZnV0dXJlIHJlZmVyZW5jZS4KLQlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMgICAgTmljQ29uZmlnMjsKLQotCS8vIFRoaXMgc29mdCBSeCBBbnRlbm5hIERpdmVyc2l0eSBtZWNoYW5pc20gaXMgdXNlZCBvbmx5IHdoZW4gdXNlciBzZXQKLQkvLyBSWCBBbnRlbm5hID0gRElWRVJTSVRZIE9OCi0JU09GVF9SWF9BTlRfRElWRVJTSVRZICAgUnhBbnQ7Ci0KLQlVQ0hBUiAgICAgICAgICAgICAgICAgICBSRlByb2dTZXE7Ci0JQ0hBTk5FTF9UWF9QT1dFUiAgICAgICAgVHhQb3dlcltNQVhfTlVNX09GX0NIQU5ORUxTXTsgICAgICAgLy8gU3RvcmUgVHggcG93ZXIgdmFsdWUgZm9yIGFsbCBjaGFubmVscy4KLQlDSEFOTkVMX1RYX1BPV0VSICAgICAgICBDaGFubmVsTGlzdFtNQVhfTlVNX09GX0NIQU5ORUxTXTsgICAvLyBsaXN0IGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMgZm9yIHNpdGUgc3VydmV5Ci0JQ0hBTk5FTF8xMUpfVFhfUE9XRVIgICAgVHhQb3dlcjExSltNQVhfTlVNX09GXzExSkNIQU5ORUxTXTsgICAgICAgLy8gODAyLjExaiBjaGFubmVsIGFuZCBidwotCUNIQU5ORUxfMTFKX1RYX1BPV0VSICAgIENoYW5uZWxMaXN0MTFKW01BWF9OVU1fT0ZfMTFKQ0hBTk5FTFNdOyAgIC8vIGxpc3QgYWxsIHN1cHBvcnRlZCBjaGFubmVscyBmb3Igc2l0ZSBzdXJ2ZXkKLQotCVVDSEFSICAgICAgICAgICAgICAgICAgIENoYW5uZWxMaXN0TnVtOyAgICAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBjaGFubmVsIGluIENoYW5uZWxMaXN0W10KLQlVQ0hBUgkJCQkJQmJwOTQ7Ci0JQk9PTEVBTgkJCQkJQmJwRm9yQ0NLOwotCVVMT05HCQlUeDIwTVB3ckNmZ0FCYW5kWzVdOwotCVVMT05HCQlUeDIwTVB3ckNmZ0dCYW5kWzVdOwotCVVMT05HCQlUeDQwTVB3ckNmZ0FCYW5kWzVdOwotCVVMT05HCQlUeDQwTVB3ckNmZ0dCYW5kWzVdOwotCi0JQk9PTEVBTiAgICAgYkF1dG9UeEFnY0E7ICAgICAgICAgICAgICAgIC8vIEVuYWJsZSBkcml2ZXIgYXV0byBUeCBBZ2MgY29udHJvbAotCVVDSEFSCSAgICBUc3NpUmVmQTsJCQkJCS8vIFN0b3JlIFRzc2kgcmVmZXJlbmNlIHZhbHVlIGFzIDI1IHRlbXBlcmF0dXJlLgotCVVDSEFSCSAgICBUc3NpUGx1c0JvdW5kYXJ5QVs1XTsJCS8vIFRzc2kgYm91bmRhcnkgZm9yIGluY3JlYXNlIFR4IHBvd2VyIHRvIGNvbXBlbnNhdGUuCi0JVUNIQVIJICAgIFRzc2lNaW51c0JvdW5kYXJ5QVs1XTsJCS8vIFRzc2kgYm91bmRhcnkgZm9yIGRlY3JlYXNlIFR4IHBvd2VyIHRvIGNvbXBlbnNhdGUuCi0JVUNIQVIJICAgIFR4QWdjU3RlcEE7CQkJCQkvLyBTdG9yZSBUeCBUU1NJIGRlbHRhIGluY3JlbWVudCAvIGRlY3JlbWVudCB2YWx1ZQotCUNIQVIJCVR4QWdjQ29tcGVuc2F0ZUE7CQkJLy8gU3RvcmUgdGhlIGNvbXBlbnNhdGlvbiAoVHhBZ2NTdGVwICogKGlkeC0xKSkKLQotCUJPT0xFQU4gICAgIGJBdXRvVHhBZ2NHOyAgICAgICAgICAgICAgICAvLyBFbmFibGUgZHJpdmVyIGF1dG8gVHggQWdjIGNvbnRyb2wKLQlVQ0hBUgkgICAgVHNzaVJlZkc7CQkJCQkvLyBTdG9yZSBUc3NpIHJlZmVyZW5jZSB2YWx1ZSBhcyAyNSB0ZW1wZXJhdHVyZS4KLQlVQ0hBUgkgICAgVHNzaVBsdXNCb3VuZGFyeUdbNV07CQkvLyBUc3NpIGJvdW5kYXJ5IGZvciBpbmNyZWFzZSBUeCBwb3dlciB0byBjb21wZW5zYXRlLgotCVVDSEFSCSAgICBUc3NpTWludXNCb3VuZGFyeUdbNV07CQkvLyBUc3NpIGJvdW5kYXJ5IGZvciBkZWNyZWFzZSBUeCBwb3dlciB0byBjb21wZW5zYXRlLgotCVVDSEFSCSAgICBUeEFnY1N0ZXBHOwkJCQkJLy8gU3RvcmUgVHggVFNTSSBkZWx0YSBpbmNyZW1lbnQgLyBkZWNyZW1lbnQgdmFsdWUKLQlDSEFSCQlUeEFnY0NvbXBlbnNhdGVHOwkJCS8vIFN0b3JlIHRoZSBjb21wZW5zYXRpb24gKFR4QWdjU3RlcCAqIChpZHgtMSkpCi0KLQlDSEFSCQlCR1Jzc2lPZmZzZXQwOwkJCQkvLyBTdG9yZSBCL0cgUlNTSSMwIE9mZnNldCB2YWx1ZSBvbiBFRVBST00gMHg0NmgKLQlDSEFSCQlCR1Jzc2lPZmZzZXQxOwkJCQkvLyBTdG9yZSBCL0cgUlNTSSMxIE9mZnNldCB2YWx1ZQotCUNIQVIJCUJHUnNzaU9mZnNldDI7CQkJCS8vIFN0b3JlIEIvRyBSU1NJIzIgT2Zmc2V0IHZhbHVlCi0KLQlDSEFSCQlBUnNzaU9mZnNldDA7CQkJCS8vIFN0b3JlIEEgUlNTSSMwIE9mZnNldCB2YWx1ZSBvbiBFRVBST00gMHg0QWgKLQlDSEFSCQlBUnNzaU9mZnNldDE7CQkJCS8vIFN0b3JlIEEgUlNTSSMxIE9mZnNldCB2YWx1ZQotCUNIQVIJCUFSc3NpT2Zmc2V0MjsJCQkJLy8gU3RvcmUgQSBSU1NJIzIgT2Zmc2V0IHZhbHVlCi0KLQlDSEFSCQlCTE5BR2FpbjsJCQkJCS8vIFN0b3JlIEIvRyBleHRlcm5hbCBMTkEjMCB2YWx1ZSBvbiBFRVBST00gMHg0NGgKLQlDSEFSCQlBTE5BR2FpbjA7CQkJCQkvLyBTdG9yZSBBIGV4dGVybmFsIExOQSMwIHZhbHVlIGZvciBjaDM2fjY0Ci0JQ0hBUgkJQUxOQUdhaW4xOwkJCQkJLy8gU3RvcmUgQSBleHRlcm5hbCBMTkEjMSB2YWx1ZSBmb3IgY2gxMDB+MTI4Ci0JQ0hBUgkJQUxOQUdhaW4yOwkJCQkJLy8gU3RvcmUgQSBleHRlcm5hbCBMTkEjMiB2YWx1ZSBmb3IgY2gxMzJ+MTY1Ci0jaWZkZWYgUlQzMHh4Ci0JLy8gZm9yIDM1NzIKLQlVQ0hBUgkJQmJwMjU7Ci0JVUNIQVIJCUJicDI2OwotCi0JVUNIQVIJCVR4TWl4ZXJHYWluMjRHOwkJCQkvLyBUeCBtaXhlciBnYWluIHZhbHVlIGZyb20gRUVQUk9NIHRvIGltcHJvdmUgVHggRVZNIC8gVHggREFDLCAyLjRHCi0JVUNIQVIJCVR4TWl4ZXJHYWluNUc7Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIExFRCBjb250cm9sCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCU1DVV9MRURDU19TVFJVQwkJTGVkQ250bDsKLQlVU0hPUlQJCQkJTGVkMTsJLy8gcmVhZCBmcm9tIEVFUFJPTSAweDNjCi0JVVNIT1JUCQkJCUxlZDI7CS8vIEVFUFJPTSAweDNlCi0JVVNIT1JUCQkJCUxlZDM7CS8vIEVFUFJPTSAweDQwCi0JVUNIQVIJCQkJTGVkSW5kaWNhdG9yU3RyZW5ndGg7Ci0JVUNIQVIJCQkJUnNzaVNpbmdhbHN0cmVuZ3RoT2ZmZXQ7Ci0JQk9PTEVBTgkJCQliTGVkT25TY2FubmluZzsKLQlVQ0hBUgkJCQlMZWRTdGF0dXM7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgODAyLjExIHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkvLyBvdXRnb2luZyBCRUFDT04gZnJhbWUgYnVmZmVyIGFuZCBjb3JyZXNwb25kaW5nIFRYRAotCVRYV0lfU1RSVUMJCQlCZWFjb25UeFdJOwotCVBVQ0hBUgkJCQkJCUJlYWNvbkJ1ZjsKLQlVU0hPUlQJCQkJCQlCZWFjb25PZmZzZXRbSFdfQkVBQ09OX01BWF9DT1VOVF07Ci0KLQkvLyBwcmUtYnVpbGQgUFMtUE9MTCBhbmQgTlVMTCBmcmFtZSB1cG9uIGxpbmsgdXAuIGZvciBlZmZpY2llbmN5IHB1cnBvc2UuCi0JUFNQT0xMX0ZSQU1FCQkJUHNQb2xsRnJhbWU7Ci0JSEVBREVSXzgwMl8xMQkJCU51bGxGcmFtZTsKLQotCi0KLQotLy89PT09PT09PT1BUD09PT09PT09PT09Ci0KLQotLy89PT09PT09U1RBPT09PT09PT09PT0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIFNUQSBzcGVjaWZpYyBjb25maWd1cmF0aW9uICYgb3BlcmF0aW9uIHN0YXR1cwotCS8vIHVzZWQgb25seSB3aGVuIHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVNUQV9BRE1JTl9DT05GSUcgICAgICAgIFN0YUNmZzsJCS8vIHVzZXIgZGVzaXJlZCBzZXR0aW5ncwotCVNUQV9BQ1RJVkVfQ09ORklHICAgICAgIFN0YUFjdGl2ZTsJCS8vIHZhbGlkIG9ubHkgd2hlbiBBREhPQ19PTihwQWQpIHx8IElORlJBX09OKHBBZCkKLQlDSEFSICAgICAgICAgICAgICAgICAgICBuaWNrbmFtZVtJV19FU1NJRF9NQVhfU0laRSsxXTsgLy8gbmlja25hbWUsIG9ubHkgdXNlZCBpbiB0aGUgaXdjb25maWcgaS9mCi0JTkRJU19NRURJQV9TVEFURSAgICAgICAgUHJlTWVkaWFTdGF0ZTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotLy89PT09PT09Q29tbW9uPT09PT09PT09PT0KLQkvLyBPUCBtb2RlOiBlaXRoZXIgQVAgb3IgU1RBCi0JVUNIQVIgICAgICAgICAgICAgICAgICAgT3BNb2RlOyAgICAgICAgICAgICAgICAgICAgIC8vIE9QTU9ERV9TVEEsIE9QTU9ERV9BUAotCi0JTkRJU19NRURJQV9TVEFURSAgICAgICAgSW5kaWNhdGVNZWRpYVN0YXRlOwkJCS8vIEJhc2Ugb24gSW5kaWNhdGlvbiBzdGF0ZSwgZGVmYXVsdCBpcyBOZGlzTWVkaWFTdGF0ZURpc0Nvbm5lY3RlZAotCi0KLQkvKiBNQVQgcmVsYXRlZCBwYXJhbWV0ZXJzICovCi0KLQkvLyBjb25maWd1cmF0aW9uOiByZWFkIGZyb20gUmVnaXN0cnkgJiBFMlBST00KLQlCT09MRUFOICAgICAgICAgICAgICAgICBiTG9jYWxBZG1pbk1BQzsgICAgICAgICAgICAgLy8gVXNlIHVzZXIgY2hhbmdlZCBNQUMKLQlVQ0hBUiAgICAgICAgICAgICAgICAgICBQZXJtYW5lbnRBZGRyZXNzW01BQ19BRERSX0xFTl07ICAgIC8vIEZhY3RvcnkgZGVmYXVsdCBNQUMgYWRkcmVzcwotCVVDSEFSICAgICAgICAgICAgICAgICAgIEN1cnJlbnRBZGRyZXNzW01BQ19BRERSX0xFTl07ICAgICAgLy8gVXNlciBjaGFuZ2VkIE1BQyBhZGRyZXNzCi0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBjb21tb24gY29uZmlndXJhdGlvbiB0byBib3RoIE9QTU9ERV9TVEEgYW5kIE9QTU9ERV9BUAotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUNPTU1PTl9DT05GSUcgICAgICAgICAgIENvbW1vbkNmZzsKLQlNTE1FX1NUUlVDVCAgICAgICAgICAgICBNbG1lOwotCi0JLy8gQVAgbmVlZHMgdGhvc2UgdmFpYWJsZXMgZm9yIHNpdGUgc3VydmV5IGZlYXR1cmUuCi0JTUxNRV9BVVggICAgICAgICAgICAgICAgTWxtZUF1eDsgICAgICAgICAgIC8vIHRlbXBvcmFyeSBzZXR0aW5ncyB1c2VkIGR1cmluZyBNTE1FIHN0YXRlIG1hY2hpbmUKLQlCU1NfVEFCTEUgICAgICAgICAgICAgICBTY2FuVGFiOyAgICAgICAgICAgLy8gc3RvcmUgdGhlIGxhdGVzdCBTQ0FOIHJlc3VsdAotCi0JLy9BYm91dCBNYWNUYWIsIHRoZSBzdGEgZHJpdmVyIHdpbGwgdXNlICMwIGFuZCAjMSBmb3IgbXVsdGljYXN0IGFuZCBBUC4KLQlNQUNfVEFCTEUgICAgICAgICAgICAgICAgIE1hY1RhYjsgICAgIC8vIEFTSUMgb24tY2hpcCBXQ0lEIGVudHJ5IHRhYmxlLiAgQXQgVFgsIEFTSUMgYWx3YXlzIHVzZSBrZXkgYWNjb3JkaW5nIHRvIHRoaXMgb24tY2hpcCB0YWJsZS4KLQlORElTX1NQSU5fTE9DSyAgICAgICAgICBNYWNUYWJMb2NrOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JQkFfVEFCTEUJCQlCQVRhYmxlOwotCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIEJBVGFiTG9jazsKLQlSQUxJTktfVElNRVJfU1RSVUNUIFJFQ0JBVGltZXI7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkvLyBlbmNyeXB0aW9uL2RlY3J5cHRpb24gS0VZIHRhYmxlcwotCUNJUEhFUl9LRVkgICAgICAgICAgICAgIFNoYXJlZEtleVtNQVhfTUJTU0lEX05VTV1bNF07IC8vIFNUQSBhbHdheXMgdXNlIFNoYXJlZEtleVtCU1MwXVswLi4zXQotCi0JLy8gUlggcmUtYXNzZW1ibHkgYnVmZmVyIGZvciBmcmFnbWVudGF0aW9uCi0JRlJBR01FTlRfRlJBTUUgICAgICAgICAgRnJhZ0ZyYW1lOyAgICAgICAgICAgICAgICAgIC8vIEZyYW1lIHN0b3JhZ2UgZm9yIGZyYWdtZW50IGZyYW1lCi0KLQkvLyB2YXJpb3VzIENvdW50ZXJzCi0JQ09VTlRFUl84MDJfMyAgICAgICAgICAgQ291bnRlcnM4MDIzOyAgICAgICAgICAgICAgIC8vIDgwMi4zIGNvdW50ZXJzCi0JQ09VTlRFUl84MDJfMTEgICAgICAgICAgV2xhbkNvdW50ZXJzOyAgICAgICAgICAgICAgIC8vIDgwMi4xMSBNSUIgY291bnRlcnMKLQlDT1VOVEVSX1JBTElOSyAgICAgICAgICBSYWxpbmtDb3VudGVyczsgICAgICAgICAgICAgLy8gUmFsaW5rIHByb3ByaWV0eSBjb3VudGVycwotCUNPVU5URVJfRFJTICAgICAgICAgICAgIERyc0NvdW50ZXJzOyAgICAgICAgICAgICAgICAvLyBjb3VudGVycyBmb3IgRHluYW1pYyBUWCBSYXRlIFN3aXRjaGluZwotCVBSSVZBVEVfU1RSVUMgICAgICAgICAgIFByaXZhdGVJbmZvOyAgICAgICAgICAgICAgICAvLyBQcml2YXRlIGluZm9ybWF0aW9uICYgY291bnRlcnMKLQotCS8vIGZsYWdzLCBzZWUgZlJUTVBfQURBUFRFUl94eHggZmxhZ3MKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBGbGFnczsgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwcmVzZW50IGN1cnJlbnQgZGV2aWNlIHN0YXR1cwotCVVMT05HICAgICAgICAgICAgICAgICAgIFBTRmxhZ3M7ICAgICAgICAgICAgICAgICAgICAvLyBQb3dlciBTYXZlIG9wZXJhdGlvbiBmbGFnLgotCi0JLy8gY3VycmVudCBUWCBzZXF1ZW5jZSAjCi0JVVNIT1JUICAgICAgICAgICAgICAgICAgU2VxdWVuY2U7Ci0KLQkvLyBDb250cm9sIGRpc2Nvbm5lY3QgLyBjb25uZWN0IGV2ZW50IGdlbmVyYXRpb24KLQkvLysrK0RpZG4ndCB1c2VkIGFueW1vcmUKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBMaW5rRG93blRpbWU7Ci0JLy8tLS0KLQlVTE9ORyAgICAgICAgICAgICAgICAgICBMYXN0UnhSYXRlOwotCVVMT05HICAgICAgICAgICAgICAgICAgIExhc3RUeFJhdGU7Ci0JLy8rKytVc2VkIG9ubHkgZm9yIFN0YXRpb24KLQlCT09MRUFOICAgICAgICAgICAgICAgICBiQ29uZmlnQ2hhbmdlZDsgICAgICAgICAvLyBDb25maWcgQ2hhbmdlIGZsYWcgZm9yIHRoZSBzYW1lIFNTSUQgc2V0dGluZwotCS8vLS0tCi0KLQlVTE9ORyAgICAgICAgICAgICAgICAgICBFeHRyYUluZm87ICAgICAgICAgICAgICAvLyBFeHRyYSBpbmZvcm1hdGlvbiBmb3IgZGlzcGxheWluZyBzdGF0dXMKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBTeXN0ZW1FcnJvckJpdG1hcDsgICAgICAvLyBiMDogRTJQUk9NIHZlcnNpb24gZXJyb3IKLQotCS8vKysrRGlkbid0IHVzZWQgYW55bW9yZQotCVVMT05HICAgICAgICAgICAgICAgICAgIE1hY0ljVmVyc2lvbjsgICAgICAgICAgIC8vIE1BQy9CQlAgc2VyaWFsIGludGVyZmFjZSBpc3N1ZSBzb2x2ZWQgYWZ0ZXIgdmVyLkQKLQkvLy0tLQotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gU3lzdGVtIGV2ZW50IGxvZwotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVJUXzgwMl8xMV9FVkVOVF9UQUJMRSAgIEV2ZW50VGFiOwotCi0KLQlCT09MRUFOCQlIVENFbmFibGU7Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLyogICAgICBTdGF0aXN0aWMgcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCUJPT0xFQU4JCQkJCQliVXBkYXRlQmNuQ250RG9uZTsKLQlVTE9ORwkJCQkJCXdhdGNoRG9nTWFjRGVhZGxvY2s7CS8vIHByZXZlbnQgTUFDL0JCUCBpbnRvIGRlYWRsb2NrIGNvbmRpdGlvbgotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBERUJVRyBwYXJhbWVydHMKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy9VTE9ORwkJRGVidWdTZXR0aW5nWzRdOwotCUJPT0xFQU4JCWJCYW5BbGxCYVNldHVwOwotCUJPT0xFQU4JCWJQcm9taXNjdW91czsKLQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBydDI4NjBjIGVtdWxhdGlvbi11c2UgUGFyYW1ldGVycwotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvL1VMT05HCQlydHNhY2N1WzMwXTsKLQkvL1VMT05HCQljdHNhY2N1WzMwXTsKLQkvL1VMT05HCQljZmVuZGFjY3VbMzBdOwotCS8vVUxPTkcJCWJhY29udGVudFsxNl07Ci0JLy9VTE9ORwkJcnhpbnRbUlhfUklOR19TSVpFKzFdOwotCS8vVUNIQVIJCXJjdmJhWzYwXTsKLQlCT09MRUFOCQliTGlua0FkYXB0OwotCUJPT0xFQU4JCWJGb3JjZVByaW50VFg7Ci0JQk9PTEVBTgkJYkZvcmNlUHJpbnRSWDsKLQkvL0JPT0xFQU4JCWJEaXNhYmxlc2Nhbm5pbmc7CQkvL2RlZmluZWQgaW4gUlQyODcwIFVTQgotCUJPT0xFQU4JCWJTdGFGaWZvVGVzdDsKLQlCT09MRUFOCQliUHJvdGVjdGlvblRlc3Q7Ci0JLyoKLQlCT09MRUFOCQliSENDQVRlc3Q7Ci0JQk9PTEVBTgkJYkdlbk9uZUhDQ0E7Ci0JKi8KLQlCT09MRUFOCQliQnJvYWRDb21IVDsKLQkvLysrK0ZvbGxvd2luZyBhZGQgZnJvbSBSVDI4NzAgVVNCLgotCVVMT05HCQlCdWxrT3V0UmVxOwotCVVMT05HCQlCdWxrT3V0Q29tcGxldGU7Ci0JVUxPTkcJCUJ1bGtPdXRDb21wbGV0ZU90aGVyOwotCVVMT05HCQlCdWxrT3V0Q29tcGxldGVDYW5jZWw7CS8vIHNlZW1zIG5vdCB1c2Ugbm93PwotCVVMT05HCQlCdWxrSW5SZXE7Ci0JVUxPTkcJCUJ1bGtJbkNvbXBsZXRlOwotCVVMT05HCQlCdWxrSW5Db21wbGV0ZUZhaWw7Ci0JLy8tLS0KLQotICAgIHN0cnVjdCB3aWZpY29uZgkJCVdJRkl0ZXN0YmVkOwotCi0jaWZkZWYgUkFMSU5LX0FURQotCUFURV9JTkZPCQkJCWF0ZTsKLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1X3Bvb2wgbXBkdV9ibGtfcG9vbDsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCVVMT05HCQkJCQlPbmVTZWNvbmRub25CRXBhY2tldHM7CQkvLyByZWNvcmQgbm9uIEJFIHBhY2tldHMgcGVyIHNlY29uZAotCi0jaWZkZWYgTElOVVgKLSNpZiBXSVJFTEVTU19FWFQgPj0gMTIKLSAgICBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAgICBpd19zdGF0czsKLSNlbmRpZgotCi0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHM7Ci0jZW5kaWYgLy8gTElOVVggLy8KLQotI2lmZGVmIEJMT0NLX05FVF9JRgotCUJMT0NLX1FVRVVFX0VOVFJZCQlibG9ja1F1ZXVlVGFiW05VTV9PRl9UWF9SSU5HXTsKLSNlbmRpZiAvLyBCTE9DS19ORVRfSUYgLy8KLQotCi0KLSNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKLQlJTlQzMgkJCQkJTUNfUm93SUQ7Ci0JU1RSSU5HCQkJCQlNQ19GaWxlTmFtZVsyNTZdOwotI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLwotCi0JVUxPTkcJCQkJCVRidHRUaWNrQ291bnQ7Ci0jaWZkZWYgUENJX01TSV9TVVBQT1JUCi0JQk9PTEVBTgkJCQkJSGF2ZU1zaTsKLSNlbmRpZiAvLyBQQ0lfTVNJX1NVUFBPUlQgLy8KLQotCi0JVUNIQVIJCQkJCWlzX29uOwotCi0jZGVmaW5lIFRJTUVfQkFTRQkJCSgxMDAwMDAwL09TX0haKQotI2RlZmluZSBUSU1FX09ORV9TRUNPTkQJCSgxMDAwMDAwL1RJTUVfQkFTRSkKLQlVQ0hBUgkJCQkJZmxnX2JlX2FkanVzdDsKLQlVTE9ORwkJCQkJYmVfYWRqdXN0X2xhc3RfdGltZTsKLQotI2lmZGVmIE5JTlRFTkRPX0FQCi0JTklORE9fQ1RSTF9CTE9DSwkJbmluZG9fY3RybF9ibG9jazsKLSNlbmRpZiAvLyBOSU5URU5ET19BUCAvLwotCi0KLSNpZmRlZiBJS0FOT1NfVlhfMVgwCi0Jc3RydWN0IElLQU5PU19UWF9JTkZPCUlrYW5vc1R4SW5mbzsKLQlzdHJ1Y3QgSUtBTk9TX1RYX0lORk8JSWthbm9zUnhJbmZvW01BWF9NQlNTSURfTlVNICsgTUFYX1dEU19FTlRSWSArIE1BWF9BUENMSV9OVU0gKyBNQVhfTUVTSF9OVU1dOwotI2VuZGlmIC8vIElLQU5PU19WWF8xWDAgLy8KLQotCi0jaWZkZWYgREJHX0RJQUdOT1NFCi0JUnRtcERpYWdTdHJ1Y3QJRGlhZ1N0cnVjdDsKLSNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KLQotCi0JVUlOVDgJCQkJCUZsZ0N0c0VuYWJsZWQ7Ci0JVUlOVDgJCQkJCVBNX0ZsZ1N1c3BlbmQ7Ci0KLSNpZmRlZiBSVDMweHgKLSNpZmRlZiBSVE1QX0VGVVNFX1NVUFBPUlQKLQlCT09MRUFOCQliVXNlRWZ1c2U7Ci0JQk9PTEVBTgkJYkVFUFJPTUZpbGU7Ci0JQk9PTEVBTgkJYkZyb2NlRUVQUk9NQnVmZmVyOwotCVVDSEFSCQlFRVBST01JbWFnZVsxMDI0XTsKLSNlbmRpZiAvLyBSVE1QX0VGVVNFX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBSVDMweHggLy8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi19OwotCi0KLQotI2lmZGVmIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQKLSNkZWZpbmUgREVMQVlJTlRNQVNLCQkweDAwMTNmZmZiCi0jZGVmaW5lIElOVE1BU0sJCQkJMHgwMDEzZmZmYgotI2RlZmluZSBJbmRNYXNrCQkJCTB4MDAxM2ZmZmMKLSNkZWZpbmUgUmFkYXJJbnQJCQkweDAwMTAwMDAwCi0jZWxzZQotI2RlZmluZSBERUxBWUlOVE1BU0sJCTB4MDAwM2ZmZmIKLSNkZWZpbmUgSU5UTUFTSwkJCQkweDAwMDNmZmZiCi0jZGVmaW5lIEluZE1hc2sJCQkJMHgwMDAzZmZmYwotI2VuZGlmIC8vIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQgLy8KLQotI2RlZmluZSBSeElOVAkJCQkweDAwMDAwMDA1CS8vIERlbGF5ZWQgUnggb3IgaW5kaXZpIHJ4Ci0jZGVmaW5lIFR4RGF0YUludAkJCTB4MDAwMDAwZmEJLy8gRGVsYXllZCBUeCBvciBpbmRpdmkgdHgKLSNkZWZpbmUgVHhNZ210SW50CQkJMHgwMDAwMDEwMgkvLyBEZWxheWVkIFR4IG9yIGluZGl2aSB0eAotI2RlZmluZSBUeENvaGVyZW50CQkJMHgwMDAyMDAwMAkvLyB0eCBjb2hlcmVudAotI2RlZmluZSBSeENvaGVyZW50CQkJMHgwMDAxMDAwMAkvLyByeCBjb2hlcmVudAotI2RlZmluZSBNY3VDb21tYW5kCQkJMHgwMDAwMDIwMAkvLyBtY3UKLSNkZWZpbmUgUHJlVEJUVEludAkJCTB4MDAwMDEwMDAJLy8gUHJlLVRCVFQgaW50ZXJydXB0Ci0jZGVmaW5lIFRCVFRJbnQJCQkJMHgwMDAwMDgwMAkJLy8gVEJUVCBpbnRlcnJ1cHQKLSNkZWZpbmUgR1BUaW1lT3V0SW50CQkJMHgwMDAwODAwMAkJLy8gR1B0aW1lb3V0IGludGVycnVwdAotI2RlZmluZSBBdXRvV2FrZXVwSW50CQkweDAwMDA0MDAwCQkvLyBBdXRvV2FrZXVwSW50IGludGVycnVwdAotI2RlZmluZSBGaWZvU3RhRnVsbEludAkJCTB4MDAwMDIwMDAJLy8gIGZpZm8gc3RhdGlzdGljcyBmdWxsIGludGVycnVwdAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKglSeCBQYXRoIHNvZnR3YXJlIGNvbnRyb2wgYmxvY2sgcmVsYXRlZCBkYXRhIHN0cnVjdHVyZXMKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdCBfUlhfQkxLXwotewotLy8JUlhEX1NUUlVDCQlSeEQ7IC8vIHNhbXBsZQotCVJUMjhYWF9SWERfU1RSVUMJUnhEOwotCVBSWFdJX1NUUlVDCQkJcFJ4V0k7Ci0JUEhFQURFUl84MDJfMTEJCXBIZWFkZXI7Ci0JUE5ESVNfUEFDS0VUCQlwUnhQYWNrZXQ7Ci0JVUNIQVIJCQkJKnBEYXRhOwotCVVTSE9SVAkJCQlEYXRhU2l6ZTsKLQlVU0hPUlQJCQkJRmxhZ3M7Ci0JVUNIQVIJCQkJVXNlclByaW9yaXR5OwkvLyBmb3IgY2FsY3VsYXRlIFRLSVAgTUlDIHVzaW5nCi19IFJYX0JMSzsKLQotCi0jZGVmaW5lIFJYX0JMS19TRVRfRkxBRyhfcFJ4QmxrLCBfZmxhZykJCShfcFJ4QmxrLT5GbGFncyB8PSBfZmxhZykKLSNkZWZpbmUgUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBfZmxhZykJKF9wUnhCbGstPkZsYWdzICYgX2ZsYWcpCi0jZGVmaW5lIFJYX0JMS19DTEVBUl9GTEFHKF9wUnhCbGssIF9mbGFnKQkoX3BSeEJsay0+RmxhZ3MgJj0gfihfZmxhZykpCi0KLQotI2RlZmluZSBmUlhfV0RTCQkJMHgwMDAxCi0jZGVmaW5lIGZSWF9BTVNEVQkJMHgwMDAyCi0jZGVmaW5lIGZSWF9BUkFMSU5LCQkweDAwMDQKLSNkZWZpbmUgZlJYX0hUQwkJCTB4MDAwOAotI2RlZmluZSBmUlhfUEFECQkJMHgwMDEwCi0jZGVmaW5lIGZSWF9BTVBEVQkJMHgwMDIwCi0jZGVmaW5lIGZSWF9RT1MJCQkweDAwNDAKLSNkZWZpbmUgZlJYX0lORlJBCQkweDAwODAKLSNkZWZpbmUgZlJYX0VBUAkJCTB4MDEwMAotI2RlZmluZSBmUlhfTUVTSAkJMHgwMjAwCi0jZGVmaW5lIGZSWF9BUENMSQkJMHgwNDAwCi0jZGVmaW5lIGZSWF9ETFMJCQkweDA4MDAKLSNkZWZpbmUgZlJYX1dQSQkJCTB4MTAwMAotCi0jZGVmaW5lIExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQJMTQKLSNkZWZpbmUgTEVOR1RIX0FSQUxJTktfU1VCRlJBTUVIRUFECTE0Ci0jZGVmaW5lIExFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRAkgMgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKglUeCBQYXRoIHNvZnR3YXJlIGNvbnRyb2wgYmxvY2sgcmVsYXRlZCBkYXRhIHN0cnVjdHVyZXMKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFRYX1VOS09XTl9GUkFNRQkJMHgwMAotI2RlZmluZSBUWF9NQ0FTVF9GUkFNRQkJCTB4MDEKLSNkZWZpbmUgVFhfTEVHQUNZX0ZSQU1FCQkweDAyCi0jZGVmaW5lIFRYX0FNUERVX0ZSQU1FCQkweDA0Ci0jZGVmaW5lIFRYX0FNU0RVX0ZSQU1FCQkweDA4Ci0jZGVmaW5lIFRYX1JBTElOS19GUkFNRQkJMHgxMAotI2RlZmluZSBUWF9GUkFHX0ZSQU1FCQkJMHgyMAotCi0KLS8vCUN1cnJlbnRseSB0aGUgc2l6ZW9mKFRYX0JMSykgaXMgMTQ4IGJ5dGVzLgotdHlwZWRlZiBzdHJ1Y3QgX1RYX0JMS18KLXsKLQlVQ0hBUgkJCQlRdWVJZHg7Ci0JVUNIQVIJCQkJVHhGcmFtZVR5cGU7CQkJCS8vIEluZGljYXRlIHRoZSBUcmFuc21pc3Npb24gdHlwZSBvZiB0aGUgYWxsIGZyYW1lcyBpbiBvbmUgYmF0Y2gKLQlVQ0hBUgkJCQlUb3RhbEZyYW1lTnVtOwkJCQkvLyBUb3RhbCBmcmFtZSBudW1iZXIgd2FudCB0byBzZW5kLW91dCBpbiBvbmUgYmF0Y2gKLQlVU0hPUlQJCQkJVG90YWxGcmFnTnVtOwkJCQkvLyBUb3RhbCBmcmFtZSBmcmFnbWVudHMgcmVxdWlyZWQgaW4gb25lIGJhdGNoCi0JVVNIT1JUCQkJCVRvdGFsRnJhbWVMZW47CQkJCS8vIFRvdGFsIGxlbmd0aCBvZiBhbGwgZnJhbWVzIHdhbnQgdG8gc2VuZC1vdXQgaW4gb25lIGJhdGNoCi0KLQlRVUVVRV9IRUFERVIJCVR4UGFja2V0TGlzdDsKLQlNQUNfVEFCTEVfRU5UUlkJCSpwTWFjRW50cnk7CQkJCQkvLyBOVUxMOiBwYWNrZXQgd2l0aCA4MDIuMTEgUkEgZmllbGQgaXMgbXVsdGljYXN0L2Jyb2FkY2FzdCBhZGRyZXNzCi0JSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQ7Ci0KLQkvLyBGb2xsb3dpbmcgc3RydWN0dXJlIHVzZWQgZm9yIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBzcGVjaWZpYyBwYWNrZXQuCi0JUE5ESVNfUEFDS0VUCQlwUGFja2V0OwotCVBVQ0hBUgkJCQlwU3JjQnVmSGVhZGVyOwkJCQkvLyBSZWZlcmVuY2UgdG8gdGhlIGhlYWQgb2Ygc2tfYnVmZi0+ZGF0YQotCVBVQ0hBUgkJCQlwU3JjQnVmRGF0YTsJCQkJLy8gUmVmZXJlbmNlIHRvIHRoZSBza19idWZmLT5kYXRhLCB3aWxsIGNoYW5nZWQgZGVwZW5kcyBvbiBoYW5sZGluZyBwcm9ncmVzc3MKLQlVSU5UCQkJCVNyY0J1ZkxlbjsJCQkJCS8vIExlbmd0aCBvZiBwYWNrZXQgcGF5bG9hZCB3aGljaCBub3QgaW5jbHVkaW5nIExheWVyIDIgaGVhZGVyCi0JUFVDSEFSCQkJCXBFeHRyYUxsY1NuYXBFbmNhcDsJCQkvLyBOVUxMIG1lYW5zIG5vIGV4dHJhIExMQy9TTkFQIGlzIHJlcXVpcmVkCi0JVUNIQVIJCQkJSGVhZGVyQnVmWzk2XTsJCQkJLy8gVGVtcEJ1ZmZlciBmb3IgVFhfSU5GTyArIFRYX1dJICsgODAyLjExIEhlYWRlciArIHBhZGRpbmcgKyBBTVNEVSBTdWJIZWFkZXIgKyBMTEMvU05BUAotCVVDSEFSCQkJCU1wZHVIZWFkZXJMZW47CQkJCS8vIDgwMi4xMSBoZWFkZXIgbGVuZ3RoIE5PVCBpbmNsdWRpbmcgdGhlIHBhZGRpbmcKLQlVQ0hBUgkJCQlIZHJQYWRMZW47CQkJCQkvLyByZWNvcmRpbmcgSGVhZGVyIFBhZGRpbmcgTGVuZ3RoOwotCVVDSEFSCQkJCWFwaWR4OwkJCQkJCS8vIFRoZSBpbnRlcmZhY2UgYXNzb2NpYXRlZCB0byB0aGlzIHBhY2tldAotCVVDSEFSCQkJCVdjaWQ7CQkJCQkJLy8gVGhlIE1BQyBlbnRyeSBhc3NvY2lhdGVkIHRvIHRoaXMgcGFja2V0Ci0JVUNIQVIJCQkJVXNlclByaW9yaXR5OwkJCQkvLyBwcmlvcml0eSBjbGFzcyBvZiBwYWNrZXQKLQlVQ0hBUgkJCQlGcmFtZUdhcDsJCQkJCS8vIHdoYXQga2luZCBvZiBJRlMgdGhpcyBwYWNrZXQgdXNlCi0JVUNIQVIJCQkJTXBkdVJlcU51bTsJCQkJCS8vIG51bWJlciBvZiBmcmFnbWVudHMgb2YgdGhpcyBmcmFtZQotCVVDSEFSCQkJCVR4UmF0ZTsJCQkJCQkvLyBUT0RPOiBPYnNvbGV0ZWQ/IFNob3VsZCBjaGFuZ2UgdG8gTUNTPwotCVVDSEFSCQkJCUNpcGhlckFsZzsJCQkJCS8vIGNpcGhlciBhbG9ncml0aG0KLQlQQ0lQSEVSX0tFWQkJCXBLZXk7Ci0KLQotCi0JVVNIT1JUCQkJCUZsYWdzOwkJCQkJCS8vU2VlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBmb3IgZGV0YWlsLgotCi0JLy9ZT1UgU0hPVUxEIE5PVCBUT1VDSCBJVCEgRm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIHVzZWQgZm9yIGhhcmR3YXJlLWRlcGVuZGVkIGxheWVyLgotCVVMT05HCQkJCVByaXY7CQkJCQkJLy8gSGFyZHdhcmUgc3BlY2lmaWMgdmFsdWUgc2F2ZWQgaW4gaGVyZS4KLQotfSBUWF9CTEssICpQVFhfQkxLOwotCi0KLSNkZWZpbmUgZlRYX2JSdHNSZXF1aXJlZAkJCTB4MDAwMQkvLyBJbmRpY2F0ZSBpZiBuZWVkIHNlbmQgUlRTIGZyYW1lIGZvciBwcm90ZWN0aW9uLiBOb3QgdXNlZCBpbiBSVDI4NjAvUlQyODcwLgotI2RlZmluZSBmVFhfYkFja1JlcXVpcmVkCQkJMHgwMDAyCS8vIHRoZSBwYWNrZXQgbmVlZCBhY2sgcmVzcG9uc2UKLSNkZWZpbmUgZlRYX2JQaWdneUJhY2sJCQkweDAwMDQJLy8gTGVnYWN5IGRldmljZSB1c2UgUGlnZ2JhY2sgb3Igbm90Ci0jZGVmaW5lIGZUWF9iSFRSYXRlCQkJCTB4MDAwOAkvLyBhbGxvdyB0byB1c2UgSFQgcmF0ZQotI2RlZmluZSBmVFhfYkZvcmNlTm9uUW9TCQkweDAwMTAJLy8gZm9yY2UgdG8gdHJhbnNtaXQgZnJhbWUgd2l0aG91dCBXTU0tUW9TIGluIEhUIG1vZGUKLSNkZWZpbmUgZlRYX2JBbGxvd0ZyYWcJCQkweDAwMjAJLy8gYWxsb3cgdG8gZnJhZ21lbnQgdGhlIHBhY2tldCwgQS1NUERVLCBBLU1TRFUsIEEtUmFsaW5rIGlzIG5vdCBhbGxvd2VkIHRvIGZyYWdtZW50Ci0jZGVmaW5lIGZUWF9iTW9yZURhdGEJCQkweDAwNDAJLy8gdGhlcmUgYXJlIG1vcmUgZGF0YSBwYWNrZXRzIGluIFBvd2VyU2F2ZSBRdWV1ZQotI2RlZmluZSBmVFhfYldNTQkJCQkweDAwODAJLy8gUU9TIERhdGEKLSNkZWZpbmUgZlRYX2JDbGVhckVBUEZyYW1lCQkweDAxMDAKLQotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0KLQotI2RlZmluZSBUWF9CTEtfU0VUX0ZMQUcoX3BUeEJsaywgX2ZsYWcpCQkoX3BUeEJsay0+RmxhZ3MgfD0gX2ZsYWcpCi0jZGVmaW5lIFRYX0JMS19URVNUX0ZMQUcoX3BUeEJsaywgX2ZsYWcpCSgoKF9wVHhCbGstPkZsYWdzICYgX2ZsYWcpID09IF9mbGFnKSA/IDEgOiAwKQotI2RlZmluZSBUWF9CTEtfQ0xFQVJfRkxBRyhfcFR4QmxrLCBfZmxhZykJKF9wVHhCbGstPkZsYWdzICY9IH4oX2ZsYWcpKQotCi0KLQotCi0jaWZkZWYgUlRfQklHX0VORElBTgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCUVuZGlhbiBjb252ZXJzaW9uIHJlbGF0ZWQgZnVuY3Rpb25zCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUVuZGlhbiBjb252ZXJzaW9uIG9mIFR4L1J4IGRlc2NyaXB0b3IgLgotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwRGF0YQkJCVBvaW50ZXIgdG8gVHgvUnggZGVzY3JpcHRvcgotCQlEZXNjcmlwdG9yVHlwZQlEaXJlY3Rpb24gb2YgdGhlIGZyYW1lCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0JCUNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHJlYWQgb3IgdXBkYXRlIGRlc2NyaXB0b3IKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgaW5saW5lIFZPSUQJUlRNUFdJRW5kaWFuQ2hhbmdlKAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVMT05HCQkJRGVzY3JpcHRvclR5cGUpCi17Ci0JaW50IHNpemU7Ci0JaW50IGk7Ci0KLQlzaXplID0gKChEZXNjcmlwdG9yVHlwZSA9PSBUWVBFX1RYV0kpID8gVFhXSV9TSVpFIDogUlhXSV9TSVpFKTsKLQotCWlmKERlc2NyaXB0b3JUeXBlID09IFRZUEVfVFhXSSkKLQl7Ci0JCSooKFVJTlQzMiAqKShwRGF0YSkpID0gU1dBUDMyKCooKFVJTlQzMiAqKShwRGF0YSkpKTsJCS8vIEJ5dGUgMH4zCi0JCSooKFVJTlQzMiAqKShwRGF0YSArIDQpKSA9IFNXQVAzMigqKChVSU5UMzIgKikocERhdGErNCkpKTsJLy8gQnl0ZSA0fjcKLQl9Ci0JZWxzZQotCXsKLQkJZm9yKGk9MDsgaSA8IHNpemUvNCA7IGkrKykKLQkJCSooKChVSU5UMzIgKilwRGF0YSkgK2kpID0gU1dBUDMyKCooKChVSU5UMzIgKilwRGF0YSkraSkpOwotCX0KLX0KLQotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi1zdGF0aWMgaW5saW5lIFZPSUQJV3JpdGVCYWNrVG9EZXNjcmlwdG9yKAotCUlOICBQVUNIQVIJCQlEZXN0LAotCUlOCVBVQ0hBUgkJCVNyYywKLSAgICBJTiAgQk9PTEVBTgkJCURvRW5jcnlwdCwKLQlJTiAgVUxPTkcgICAgICAgICAgIERlc2NyaXB0b3JUeXBlKQotewotCVVJTlQzMiAqcDEsICpwMjsKLQotCXAxID0gKChVSU5UMzIgKilEZXN0KTsKLQlwMiA9ICgoVUlOVDMyICopU3JjKTsKLQotCSpwMSA9ICpwMjsKLQkqKHAxKzIpID0gKihwMisyKTsKLQkqKHAxKzMpID0gKihwMiszKTsKLQkqKHAxKzEpID0gKihwMisxKTsgLy8gV29yZCAxOyB0aGlzIG11c3QgYmUgd3JpdHRlbiBiYWNrIGxhc3QKLX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJRW5kaWFuIGNvbnZlcnNpb24gb2YgVHgvUnggZGVzY3JpcHRvciAuCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCXBEYXRhCQkJUG9pbnRlciB0byBUeC9SeCBkZXNjcmlwdG9yCi0JCURlc2NyaXB0b3JUeXBlCURpcmVjdGlvbiBvZiB0aGUgZnJhbWUKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQkJQ2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gcmVhZCBvciB1cGRhdGUgZGVzY3JpcHRvcgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLXN0YXRpYyBpbmxpbmUgVk9JRAlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVTE9ORwkJCURlc2NyaXB0b3JUeXBlKQotewotCSooKFVJTlQzMiAqKShwRGF0YSkpID0gU1dBUDMyKCooKFVJTlQzMiAqKShwRGF0YSkpKTsJCS8vIEJ5dGUgMH4zCi0JKigoVUlOVDMyICopKHBEYXRhICsgOCkpID0gU1dBUDMyKCooKFVJTlQzMiAqKShwRGF0YSs4KSkpOwkvLyBCeXRlIDh+MTEKLQkqKChVSU5UMzIgKikocERhdGEgKzEyKSkgPSBTV0FQMzIoKigoVUlOVDMyICopKHBEYXRhICsgMTIpKSk7CS8vIEJ5dGUgMTJ+MTUKLQkqKChVSU5UMzIgKikocERhdGEgKyA0KSkgPSBTV0FQMzIoKigoVUlOVDMyICopKHBEYXRhICsgNCkpKTsJCQkJLy8gQnl0ZSA0fjcsIHRoaXMgbXVzdCBiZSBzd2FwcGVkIGxhc3QKLX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUVuZGlhbiBjb252ZXJzaW9uIG9mIGFsbCBraW5kcyBvZiA4MDIuMTEgZnJhbWVzIC4KLQotCUFyZ3VtZW50czoKLQkJcEFkCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcERhdGEJCQlQb2ludGVyIHRvIHRoZSA4MDIuMTEgZnJhbWUgc3RydWN0dXJlCi0JCURpcgkJCURpcmVjdGlvbiBvZiB0aGUgZnJhbWUKLQkJRnJvbVJ4RG9uZUludAlDYWxsZXIgaXMgZnJvbSBSeERvbmUgaW50ZXJydXB0Ci0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0JCUNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHJlYWQgb3IgdXBkYXRlIGJ1ZmZlciBkYXRhCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIGlubGluZSBWT0lECVJUTVBGcmFtZUVuZGlhbkNoYW5nZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVTE9ORwkJCURpciwKLQlJTglCT09MRUFOCQkJRnJvbVJ4RG9uZUludCkKLXsKLQlQSEVBREVSXzgwMl8xMSBwRnJhbWU7Ci0JUFVDSEFSCXBNYWNIZHI7Ci0KLQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBGcmFtZSBDb250cm9sIGZpZWxkCi0JaWYoRGlyID09IERJUl9SRUFEKQotCXsKLQkJKihVU0hPUlQgKilwRGF0YSA9IFNXQVAxNigqKFVTSE9SVCAqKXBEYXRhKTsKLQl9Ci0KLQlwRnJhbWUgPSAoUEhFQURFUl84MDJfMTEpIHBEYXRhOwotCXBNYWNIZHIgPSAoUFVDSEFSKSBwRnJhbWU7Ci0KLQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBEdXJhdGlvbi9JRCBmaWVsZAotCSooVVNIT1JUICopKHBNYWNIZHIgKyAyKSA9IFNXQVAxNigqKFVTSE9SVCAqKShwTWFjSGRyICsgMikpOwotCi0JLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gU2VxdWVuY2UgQ29udHJvbCBmaWVsZAotCSooVVNIT1JUICopKHBNYWNIZHIgKyAyMikgPSBTV0FQMTYoKihVU0hPUlQgKikocE1hY0hkciArIDIyKSk7Ci0KLQlpZihwRnJhbWUtPkZDLlR5cGUgPT0gQlRZUEVfTUdNVCkKLQl7Ci0JCXN3aXRjaChwRnJhbWUtPkZDLlN1YlR5cGUpCi0JCXsKLQkJCWNhc2UgU1VCVFlQRV9BU1NPQ19SRVE6Ci0JCQljYXNlIFNVQlRZUEVfUkVBU1NPQ19SRVE6Ci0JCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gQ2FwYWJpbGl0eUluZm8gZmllbGQKLQkJCQlwTWFjSGRyICs9IHNpemVvZihIRUFERVJfODAyXzExKTsKLQkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKLQotCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIExpc3RlbiBJbnRlcnZhbCBmaWVsZAotCQkJCXBNYWNIZHIgKz0gMjsKLQkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVUJUWVBFX0FTU09DX1JTUDoKLQkJCWNhc2UgU1VCVFlQRV9SRUFTU09DX1JTUDoKLQkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBDYXBhYmlsaXR5SW5mbyBmaWVsZAotCQkJCXBNYWNIZHIgKz0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOwotCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOwotCi0JCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gU3RhdHVzIENvZGUgZmllbGQKLQkJCQlwTWFjSGRyICs9IDI7Ci0JCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7Ci0KLQkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBBSUQgZmllbGQKLQkJCQlwTWFjSGRyICs9IDI7Ci0JCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1VCVFlQRV9BVVRIOgotCQkJCS8vIElmIGZyb20gQVBIYW5kbGVSeERvbmVJbnRlcnJ1cHQgcm91dGluZSwgaXQgaXMgc3RpbGwgYSBlbmNyeXB0IGZvcm1hdC4KLQkJCQkvLyBUaGUgY29udmVydGlvbiBpcyBkZWxheWVkIHRvIFJUTVBIYW5kbGVEZWNyeXB0aW9uRG9uZUludGVycnVwdC4KLQkJCQlpZighRnJvbVJ4RG9uZUludCAmJiBwRnJhbWUtPkZDLldlcCA9PSAxKQotCQkJCQlicmVhazsKLQkJCQllbHNlCi0JCQkJewotCQkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBBdXRoIEFsZyBOby4gZmllbGQKLQkJCQkJcE1hY0hkciArPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7Ci0JCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOwotCi0JCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIEF1dGggU2VxIE5vLiBmaWVsZAotCQkJCQlwTWFjSGRyICs9IDI7Ci0JCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOwotCi0JCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIFN0YXR1cyBDb2RlIGZpZWxkCi0JCQkJCXBNYWNIZHIgKz0gMjsKLQkJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNVQlRZUEVfQkVBQ09OOgotCQkJY2FzZSBTVUJUWVBFX1BST0JFX1JTUDoKLQkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBCZWFjb25JbnRlcnZhbCBmaWVsZAotCQkJCXBNYWNIZHIgKz0gKHNpemVvZihIRUFERVJfODAyXzExKSArIFRJTUVTVEFNUF9MRU4pOwotCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOwotCi0JCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gQ2FwYWJpbGl0eUluZm8gZmllbGQKLQkJCQlwTWFjSGRyICs9IHNpemVvZihVU0hPUlQpOwotCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNVQlRZUEVfREVBVVRIOgotCQkJY2FzZSBTVUJUWVBFX0RJU0FTU09DOgotCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIFJlYXNvbiBjb2RlIGZpZWxkCi0JCQkJcE1hY0hkciArPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7Ci0JCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JZWxzZSBpZiggcEZyYW1lLT5GQy5UeXBlID09IEJUWVBFX0RBVEEgKQotCXsKLQl9Ci0JZWxzZSBpZihwRnJhbWUtPkZDLlR5cGUgPT0gQlRZUEVfQ05UTCkKLQl7Ci0JCXN3aXRjaChwRnJhbWUtPkZDLlN1YlR5cGUpCi0JCXsKLQkJCWNhc2UgU1VCVFlQRV9CTE9DS19BQ0tfUkVROgotCQkJCXsKLQkJCQkJUEZSQU1FX0JBX1JFUSBwQkFSZXEgPSAoUEZSQU1FX0JBX1JFUSlwRnJhbWU7Ci0JCQkJCSooVVNIT1JUICopKCZwQkFSZXEtPkJBUkNvbnRyb2wpID0gU1dBUDE2KCooVVNIT1JUICopKCZwQkFSZXEtPkJBUkNvbnRyb2wpKTsKLQkJCQkJcEJBUmVxLT5CQVN0YXJ0aW5nU2VxLndvcmQgPSBTV0FQMTYocEJBUmVxLT5CQVN0YXJ0aW5nU2VxLndvcmQpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgU1VCVFlQRV9CTE9DS19BQ0s6Ci0JCQkJLy8gRm9yIEJsb2NrIEFjayBwYWNrZXQsIHRoZSBIVF9DT05UUk9MIGZpZWxkIGlzIGluIHRoZSBzYW1lIG9mZnNldCB3aXRoIEFkZHIzCi0JCQkJKihVSU5UMzIgKikoJnBGcmFtZS0+QWRkcjNbMF0pID0gU1dBUDMyKCooVUlOVDMyICopKCZwRnJhbWUtPkFkZHIzWzBdKSk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1VCVFlQRV9BQ0s6Ci0JCQkJLy9Gb3IgQUNLIHBhY2tldCwgdGhlIEhUX0NPTlRST0wgZmllbGQgaXMgaW4gdGhlIHNhbWUgb2Zmc2V0IHdpdGggQWRkcjIKLQkJCQkqKFVJTlQzMiAqKSgmcEZyYW1lLT5BZGRyMlswXSk9CVNXQVAzMigqKFVJTlQzMiAqKSgmcEZyYW1lLT5BZGRyMlswXSkpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiSW52YWxpZCBGcmFtZSBUeXBlISEhXG4iKSk7Ci0JfQotCi0JLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gRnJhbWUgQ29udHJvbAotCWlmKERpciA9PSBESVJfV1JJVEUpCi0JewotCQkqKFVTSE9SVCAqKXBEYXRhID0gU1dBUDE2KCooVVNIT1JUICopcERhdGEpOwotCX0KLX0KLSNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCU90aGVyIHN0YXRpYyBpbmxpbmUgZnVuY3Rpb24gZGVmaW5pdGlvbnMKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW5saW5lIFZPSUQgQ29udmVydE11bHRpY2FzdElQMk1BQygKLQlJTiBQVUNIQVIgcElwQWRkciwKLQlJTiBQVUNIQVIgKnBwTWFjQWRkciwKLQlJTiBVSU5UMTYgUHJvdG9UeXBlKQotewotCWlmIChwSXBBZGRyID09IE5VTEwpCi0JCXJldHVybjsKLQotCWlmIChwcE1hY0FkZHIgPT0gTlVMTCB8fCAqcHBNYWNBZGRyID09IE5VTEwpCi0JCXJldHVybjsKLQotCXN3aXRjaCAoUHJvdG9UeXBlKQotCXsKLQkJY2FzZSBFVEhfUF9JUFY2OgotLy8JCQltZW1zZXQoKnBwTWFjQWRkciwgMCwgRVRIX0xFTkdUSF9PRl9BRERSRVNTKTsKLQkJCSooKnBwTWFjQWRkcikgPSAweDMzOwotCQkJKigqcHBNYWNBZGRyICsgMSkgPSAweDMzOwotCQkJKigqcHBNYWNBZGRyICsgMikgPSBwSXBBZGRyWzEyXTsKLQkJCSooKnBwTWFjQWRkciArIDMpID0gcElwQWRkclsxM107Ci0JCQkqKCpwcE1hY0FkZHIgKyA0KSA9IHBJcEFkZHJbMTRdOwotCQkJKigqcHBNYWNBZGRyICsgNSkgPSBwSXBBZGRyWzE1XTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgRVRIX1BfSVA6Ci0JCWRlZmF1bHQ6Ci0vLwkJCW1lbXNldCgqcHBNYWNBZGRyLCAwLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOwotCQkJKigqcHBNYWNBZGRyKSA9IDB4MDE7Ci0JCQkqKCpwcE1hY0FkZHIgKyAxKSA9IDB4MDA7Ci0JCQkqKCpwcE1hY0FkZHIgKyAyKSA9IDB4NWU7Ci0JCQkqKCpwcE1hY0FkZHIgKyAzKSA9IHBJcEFkZHJbMV0gJiAweDdmOwotCQkJKigqcHBNYWNBZGRyICsgNCkgPSBwSXBBZGRyWzJdOwotCQkJKigqcHBNYWNBZGRyICsgNSkgPSBwSXBBZGRyWzNdOwotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuOwotfQotCi0KLWNoYXIgKkdldFBoeU1vZGUoaW50IE1vZGUpOwotY2hhciogR2V0QlcoaW50IEJXKTsKLQotCi0KLUJPT0xFQU4gUlRNUENoZWNrRm9ySGFuZygKLQlJTiAgTkRJU19IQU5ETEUgTWluaXBvcnRBZGFwdGVyQ29udGV4dCk7Ci0KLVZPSUQgIFJUTVBIYWx0KAotCUlOICBORElTX0hBTkRMRSBNaW5pcG9ydEFkYXB0ZXJDb250ZXh0KTsKLQotLy8KLS8vICBQcml2YXRlIHJvdXRpbmVzIGluIHJ0bXBfaW5pdC5jCi0vLwotTkRJU19TVEFUVVMgUlRNUEFsbG9jQWRhcHRlckJsb2NrKAotCUlOIFBWT0lECQkJaGFuZGxlLAotCU9VVCBQUlRNUF9BREFQVEVSICAgKnBwQWRhcHRlcik7Ci0KLU5ESVNfU1RBVFVTIFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotTkRJU19TVEFUVVMgUlRNUEZpbmRBZGFwdGVyKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBORElTX0hBTkRMRSAgICAgV3JhcHBlckNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLQotTkRJU19TVEFUVVMJUlRNUFJlYWRQYXJhbWV0ZXJzSG9vaygKLQlJTglQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLU5ESVNfU1RBVFVTCVJUTVBTZXRQcm9maWxlUGFyYW1ldGVycygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBQU1RSSU5HCQlwQnVmZmVyKTsKLQotSU5UIFJUTVBHZXRLZXlQYXJhbWV0ZXIoCi0gICAgSU4gUFNUUklORyBrZXksCi0gICAgT1VUIFBTVFJJTkcgZGVzdCwKLSAgICBJTiBJTlQgZGVzdHNpemUsCi0gICAgSU4gUFNUUklORyBidWZmZXIsCi0gICAgSU4gQk9PTEVBTiBiVHJpbVNwYWNlKTsKLQotVk9JRCBSVE1QRnJlZUFkYXB0ZXIoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1ORElTX1NUQVRVUyBOSUNSZWFkUmVnUGFyYW1ldGVycygKLQlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCi0JSU4gIE5ESVNfSEFORExFICAgICAgICAgV3JhcHBlckNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLQotI2lmZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotVk9JRCBOSUNJbml0UkZSZWdpc3RlcnMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIFJ0bXBDaGlwT3BzUkZIb29rKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKLQotTkRJU19TVEFUVVMJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJcmVnSUQsCi0JSU4JVUNIQVIJCQl2YWx1ZSk7Ci0KLU5ESVNfU1RBVFVTCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJcmVnSUQsCi0JSU4JUFVDSEFSCQkJcFZhbHVlKTsKLSNlbmRpZiAvLyBSVE1QX1JGX1JXX1NVUFBPUlQgLy8KLQotVk9JRCBOSUNSZWFkRUVQUk9NUGFyYW1ldGVycygKLQlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCi0JSU4JUFVDSEFSCQkJCW1hY19hZGRyKTsKLQotVk9JRCBOSUNJbml0QXNpY0Zyb21FRVBST00oCi0JSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkKTsKLQotCi1ORElTX1NUQVRVUyBOSUNJbml0aWFsaXplQWRhcHRlcigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgIEJPT0xFQU4gICAgYkhhcmRSZXNldCk7Ci0KLU5ESVNfU1RBVFVTIE5JQ0luaXRpYWxpemVBc2ljKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBCT09MRUFOCQliSGFyZFJlc2V0KTsKLQotVk9JRCBOSUNJc3N1ZVJlc2V0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCBSVE1QUmluZ0NsZWFuVXAoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSICAgICAgICAgICBSaW5nVHlwZSk7Ci0KLVZPSUQgUnhUZXN0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotTkRJU19TVEFUVVMgRGJnU2VuZFBhY2tldCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOwotCi1WT0lEIFVzZXJDZmdJbml0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCBOSUNSZXNldEZyb21FcnJvcigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLU5ESVNfU1RBVFVTIE5JQ0xvYWRGaXJtd2FyZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgTklDRXJhc2VGaXJtd2FyZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLU5ESVNfU1RBVFVTIE5JQ0xvYWRSYXRlU3dpdGNoaW5nUGFyYW1zKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotQk9PTEVBTiBOSUNDaGVja0ZvckhhbmcoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIE5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgTklDVXBkYXRlUmF3Q291bnRlcnMoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIFJUTVBaZXJvTWVtb3J5KAotCUlOICBQVk9JRCAgIHBTcmMsCi0JSU4gIFVMT05HICAgTGVuZ3RoKTsKLQotVUxPTkcgUlRNUENvbXBhcmVNZW1vcnkoCi0JSU4gIFBWT0lEICAgcFNyYzEsCi0JSU4gIFBWT0lEICAgcFNyYzIsCi0JSU4gIFVMT05HICAgTGVuZ3RoKTsKLQotVk9JRCBSVE1QTW92ZU1lbW9yeSgKLQlPVVQgUFZPSUQgICBwRGVzdCwKLQlJTiAgUFZPSUQgICBwU3JjLAotCUlOICBVTE9ORyAgIExlbmd0aCk7Ci0KLVZPSUQgQXRvSCgKLQlQU1RSSU5HCXNyYywKLQlQVUNIQVIgZGVzdCwKLQlpbnQJCWRlc3RsZW4pOwotCi1VQ0hBUiBCdG9IKAotCWNoYXIgY2gpOwotCi1WT0lEIFJUTVBQYXRjaE1hY0JicEJ1ZygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgUlRNUFBhdGNoQ2FyZEJ1cygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyKTsKLQotVk9JRCBSVE1QUGF0Y2hSYWxpbmtDYXJkQnVzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4JVUxPTkcJCQlCdXMpOwotCi1VTE9ORyBSVE1QUmVhZENCQ29uZmlnKAotCUlOCVVMT05HCUJ1cywKLQlJTglVTE9ORwlTbG90LAotCUlOCVVMT05HCUZ1bmMsCi0JSU4JVUxPTkcJT2Zmc2V0KTsKLQotVk9JRCBSVE1QV3JpdGVDQkNvbmZpZygKLQlJTglVTE9ORwlCdXMsCi0JSU4JVUxPTkcJU2xvdCwKLQlJTglVTE9ORwlGdW5jLAotCUlOCVVMT05HCU9mZnNldCwKLQlJTglVTE9ORwlWYWx1ZSk7Ci0KLVZPSUQgUlRNUEluaXRUaW1lcigKLQlJTiAgUFJUTVBfQURBUFRFUiAgICAgICAgICAgcEFkLAotCUlOICBQUkFMSU5LX1RJTUVSX1NUUlVDVCAgICBwVGltZXIsCi0JSU4gIFBWT0lEICAgICAgICAgICAgICAgICAgIHBUaW1lckZ1bmMsCi0JSU4JUFZPSUQJCQkJCXBEYXRhLAotCUlOICBCT09MRUFOICAgICAgICAgICAgICAgICBSZXBlYXQpOwotCi1WT0lEIFJUTVBTZXRUaW1lcigKLQlJTiAgUFJBTElOS19USU1FUl9TVFJVQ1QgICAgcFRpbWVyLAotCUlOICBVTE9ORyAgICAgICAgICAgICAgICAgICBWYWx1ZSk7Ci0KLQotVk9JRCBSVE1QTW9kVGltZXIoCi0JSU4JUFJBTElOS19USU1FUl9TVFJVQ1QJcFRpbWVyLAotCUlOCVVMT05HCQkJCQlWYWx1ZSk7Ci0KLVZPSUQgUlRNUENhbmNlbFRpbWVyKAotCUlOICBQUkFMSU5LX1RJTUVSX1NUUlVDVCAgICBwVGltZXIsCi0JT1VUIEJPT0xFQU4gICAgICAgICAgICAgICAgICpwQ2FuY2VsbGVkKTsKLQotVk9JRCBSVE1QU2V0TEVEKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVDSEFSCQkJU3RhdHVzKTsKLQotVk9JRCBSVE1QU2V0U2lnbmFsTEVEKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIE5ESVNfODAyXzExX1JTU0kgRGJtKTsKLQotCi1WT0lEIFJUTVBFbmFibGVSeFR4KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotLy8KLS8vIHByb3RvdHlwZSBpbiBhY3Rpb24uYwotLy8KLVZPSUQgQWN0aW9uU3RhdGVNYWNoaW5lSW5pdCgKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKLSAgICBJTiAgU1RBVEVfTUFDSElORSAqUywKLSAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOwotCi1WT0lEIE1sbWVBRERCQUFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIE1sbWVERUxCQUFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIE1sbWVETFNBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBNbG1lSW52YWxpZEFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIE1sbWVRT1NBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotVk9JRCBQZWVyQWRkQkFSZXFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBQZWVyQWRkQkFSc3BBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBQZWVyRGVsQkFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBQZWVyQkFBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotVk9JRCBTZW5kUFNNUEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVQ0hBUgkJCVdjaWQsCi0JSU4gVUNIQVIJCQlQc21wKTsKLQotCi1WT0lEIFBlZXJSTUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIFBlZXJQdWJsaWNBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotVk9JRCBTdGFQdWJsaWNBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgQnNzMjA0MENvZXhpc3QpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLVZPSUQgUGVlckJTU1RyYW5BY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotVk9JRCBQZWVySFRBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotVk9JRCBQZWVyUU9TQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLVZPSUQgUGVlckRMU0FjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi1WT0lEIERsc1Bhcm1GaWxsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE9VVCBNTE1FX0RMU19SRVFfU1RSVUNUICpwRGxzUmVxLAotCUlOIFBSVF84MDJfMTFfRExTIHBEbHMsCi0JSU4gVVNIT1JUIHJlYXNvbik7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLVZPSUQgUkVDQkFUaW1lclRpbWVvdXQoCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotVk9JRCBPUklCQVRpbWVyVGltZW91dCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgU2VuZFJlZnJlc2hCQVIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnkpOwotCi0jaWZkZWYgRE9UMTFOX0RSQUZUMwotVk9JRCBTZW5kQlNTMjA0MENvZXhpc3RNZ210QWN0aW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCVdjaWQsCi0JSU4JVUNIQVIJYXBpZHgsCi0JSU4JVUNIQVIJSW5mb1JlcSk7Ci0KLVZPSUQgU2VuZE5vdGlmeUJXQWN0aW9uRnJhbWUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgIFdjaWQsCi0JSU4gVUNIQVIgYXBpZHgpOwotCi1CT09MRUFOIENoYW5uZWxTd2l0Y2hTYW5pdHlDaGVjaygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiAgICBVQ0hBUiAgV2NpZCwKLQlJTiAgICBVQ0hBUiAgTmV3Q2hhbm5lbCwKLQlJTiAgICBVQ0hBUiAgU2Vjb25kYXJ5KTsKLQotVk9JRCBDaGFubmVsU3dpdGNoQWN0aW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICAgIFVDSEFSICBXY2lkLAotCUlOICAgIFVDSEFSICBDaGFubmVsLAotCUlOICAgIFVDSEFSICBTZWNvbmRhcnkpOwotCi1VTE9ORyBCdWlsZEludG9sZXJhbnRDaGFubmVsUmVwKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICAgIFBVQ0hBUiAgcERlc3QpOwotCi1WT0lEIFVwZGF0ZTIwNDBDb2V4aXN0RnJhbWVBbmROb3RpZnkoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gICAgVUNIQVIgIFdjaWQsCi0JSU4JQk9PTEVBTgliQWRkSW50b2xlcmFudENoYSk7Ci0KLVZPSUQgU2VuZDIwNDBDb2V4aXN0QWN0aW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICAgIFVDSEFSICBXY2lkLAotCUlOCUJPT0xFQU4JYkFkZEludG9sZXJhbnRDaGEpOwotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotVk9JRCBBY3RIZWFkZXJJbml0KAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAotICAgIElOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCi0gICAgSU4gUFVDSEFSIEFkZHIxLAotICAgIElOIFBVQ0hBUiBBZGRyMiwKLSAgICBJTiBQVUNIQVIgQWRkcjMpOwotCi1WT0lEIEJhckhlYWRlckluaXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gT1VUIFBGUkFNRV9CQVIgcENudGxCYXIsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBQVUNIQVIgcFNBKTsKLQotVk9JRCBJbnNlcnRBY3RGaWVsZCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbiwKLQlJTiBVSU5UOCBDYXRlZ29yeSwKLQlJTiBVSU5UOCBBY3RDb2RlKTsKLQotQk9PTEVBTiBRb3NCQURhdGFQYXJzZSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBCT09MRUFOIGJBTVNEVSwKLQlJTiBQVUNIQVIgcDgwMjNIZWFkZXIsCi0JSU4gVUNIQVIJV0NJRCwKLQlJTiBVQ0hBUglUSUQsCi0JSU4gVVNIT1JUIFNlcXVlbmNlLAotCUlOIFVDSEFSIERhdGFPZmZzZXQsCi0JSU4gVVNIT1JUIERhdGFzaXplLAotCUlOIFVJTlQgICBDdXJSeEluZGV4KTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotQk9PTEVBTiBDbnRsRW5xdWV1ZUZvclJlY3YoCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUxPTkcgV2NpZCwKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0JSU4gUEZSQU1FX0JBX1JFUSBwTXNnKTsKLQotVk9JRCBCYUF1dG9NYW5Td2l0Y2goCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1WT0lEIEhUSU9UQ2hlY2soCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gICAgVUNIQVIgICAgIEJhdFJlY0lkeCk7Ci0KLS8vCi0vLyBQcml2YXRlIHJvdXRpbmVzIGluIHJ0bXBfZGF0YS5jCi0vLwotQk9PTEVBTiBSVE1QSGFuZGxlUnhEb25lSW50ZXJydXB0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCBSVE1QSGFuZGxlVHhEb25lSW50ZXJydXB0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotQk9PTEVBTiBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgSU5UX1NPVVJDRV9DU1JfU1RSVUMgVHhSaW5nQml0bWFwKTsKLQotVk9JRCBSVE1QSGFuZGxlTWdtdFJpbmdEbWFEb25lSW50ZXJydXB0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCBSVE1QSGFuZGxlVEJUVEludGVycnVwdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi12b2lkIFJUTVBIYW5kbGVUd2FrZXVwSW50ZXJydXB0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRAlSVE1QSGFuZGxlUnhDb2hlcmVudEludGVycnVwdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLQotQk9PTEVBTiBUeEZyYW1lSXNBZ2dyZWdhdGlibGUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwUHJldkFkZHIxLAotCUlOICBQVUNIQVIgICAgICAgICAgcDgwMjNoZHIpOwotCi1CT09MRUFOIFBlZXJJc0FnZ3JlT24oCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4gIFVMT05HICAgICAgICAgIFR4UmF0ZSwKLSAgICBJTiAgUE1BQ19UQUJMRV9FTlRSWSBwTWFjRW50cnkpOwotCi0KLU5ESVNfU1RBVFVTIFNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIoCi0JSU4gIFBORElTX0JVRkZFUiAgICBwRmlyc3RCdWZmZXIsCi0JSU4gIFVDSEFSICAgICAgICAgICBEZXNpcmVkT2Zmc2V0LAotCU9VVCBQVUNIQVIgICAgICAgICAgcEJ5dGUwLAotCU9VVCBQVUNIQVIgICAgICAgICAgcEJ5dGUxKTsKLQotTkRJU19TVEFUVVMgU1RBU2VuZFBhY2tldCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOwotCi1WT0lEIFNUQVNlbmRQYWNrZXRzKAotCUlOICBORElTX0hBTkRMRSAgICAgTWluaXBvcnRBZGFwdGVyQ29udGV4dCwKLQlJTiAgUFBORElTX1BBQ0tFVCAgIHBwUGFja2V0QXJyYXksCi0JSU4gIFVJTlQgICAgICAgICAgICBOdW1iZXJPZlBhY2tldHMpOwotCi1WT0lEIFJUTVBEZVF1ZXVlUGFja2V0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCUJPT0xFQU4JCQliSW50Q29udGV4dCwKLQlJTiAgVUNIQVIJCQlRdWVJZHgsCi0JSU4JVUNIQVIJCQlNYXhfVHhfUGFja2V0cyk7Ci0KLU5ESVNfU1RBVFVTCVJUTVBIYXJkVHJhbnNtaXQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gUE5ESVNfUEFDS0VUCQlwUGFja2V0LAotCUlOICBVQ0hBUgkJCVF1ZUlkeCwKLQlPVVQJUFVMT05HCQkJcEZyZWVUWERMZWZ0KTsKLQotTkRJU19TVEFUVVMJU1RBSGFyZFRyYW5zbWl0KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFRYX0JMSwkJCSpwVHhCbGssCi0JSU4gIFVDSEFSCQkJUXVlSWR4KTsKLQotVk9JRCBTVEFSeEVBUE9MRnJhbWVJbmRpY2F0ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotCi1ORElTX1NUQVRVUyBSVE1QRnJlZVRYRFJlcXVlc3QoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSICAgICAgICAgICBSaW5nVHlwZSwKLQlJTiAgVUNIQVIgICAgICAgICAgIE51bWJlclJlcXVpcmVkLAotCUlOCVBVQ0hBUiAgICAgICAgICBGcmVlTnVtYmVySXMpOwotCi1ORElTX1NUQVRVUyBNbG1lSGFyZFRyYW5zbWl0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUglRdWVJZHgsCi0JSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKLQotTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdE1nbXRSaW5nKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUglRdWVJZHgsCi0JSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdFR4UmluZygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUNIQVIJUXVlSWR4LAotCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7Ci0KLU5ESVNfU1RBVFVTIE1sbWVEYXRhSGFyZFRyYW5zbWl0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCVF1ZUlkeCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCk7Ci0KLVZPSUQgUlRNUFdyaXRlVHhEZXNjcmlwdG9yKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBUWERfU1RSVUMJCXBUeEQsCi0JSU4JQk9PTEVBTgkJCWJXSVYsCi0JSU4JVUNIQVIJCQlRU0VMKTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotVVNIT1JUICBSVE1QQ2FsY0R1cmF0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUiAgICAgICAgICAgUmF0ZSwKLQlJTiAgVUxPTkcgICAgICAgICAgIFNpemUpOwotCi1WT0lEIFJUTVBXcml0ZVR4V0koCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFRYV0lfU1RSVUMJCXBUeFdJLAotCUlOICBCT09MRUFOCQlGUkFHLAotCUlOICBCT09MRUFOCQlDRkFDSywKLQlJTiAgQk9PTEVBTgkJSW5zVGltZXN0YW1wLAotCUlOCUJPT0xFQU4JCQlBTVBEVSwKLQlJTglCT09MRUFOCQkJQWNrLAotCUlOCUJPT0xFQU4JCQlOU2VxLAkJLy8gSFcgbmV3IGEgc2VxdWVuY2UuCi0JSU4JVUNIQVIJCQlCQVNpemUsCi0JSU4JVUNIQVIJCQlXQ0lELAotCUlOCVVMT05HCQkJTGVuZ3RoLAotCUlOICBVQ0hBUgkJUElELAotCUlOCVVDSEFSCQkJVElELAotCUlOCVVDSEFSCQkJVHhSYXRlLAotCUlOCVVDSEFSCQkJVHhvcG1vZGUsCi0JSU4JQk9PTEVBTgkJCUNmQWNrLAotCUlOCUhUVFJBTlNNSVRfU0VUVElORwkqcFRyYW5zbWl0KTsKLQotCi1WT0lEIFJUTVBXcml0ZVR4V0lfRGF0YSgKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JT1VUIFBUWFdJX1NUUlVDCQlwVHhXSSwKLQlJTglUWF9CTEsJCQkJKnBUeEJsayk7Ci0KLQotVk9JRCBSVE1QV3JpdGVUeFdJX0NhY2hlKAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglPVVQgUFRYV0lfU1RSVUMJCXBUeFdJLAotCUlOCVRYX0JMSwkJCQkqcFR4QmxrKTsKLQotVk9JRCBSVE1QU3VzcGVuZE1zZHVUcmFuc21pc3Npb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIFJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotTkRJU19TVEFUVVMgTWluaXBvcnRNTVJlcXVlc3QoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4JVUNIQVIJCQlRdWVJZHgsCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4gIFVJTlQgICAgICAgICAgICBMZW5ndGgpOwotCi0vLysrK21hcmsgYnkgc2hpYW5nLCBub3cgdGhpcyBmdW5jdGlvbiBtZXJnZSB0byBNaW5pcG9ydE1NUmVxdWVzdCgpCi0vLy0tLW1hcmsgYnkgc2hpYW5nLCBub3cgdGhpcyBmdW5jdGlvbiBtZXJnZSB0byBNaW5pcG9ydE1NUmVxdWVzdCgpCi0KLVZPSUQgUlRNUFNlbmROdWxsRnJhbWUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSICAgICAgICAgICBUeFJhdGUsCi0JSU4JQk9PTEVBTgkJCWJRb3NOdWxsKTsKLQotVk9JRCBSVE1QU2VuZERpc2Fzc29jaWF0aW9uRnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOwotCi1WT0lEIFJUTVBTZW5kUlRTRnJhbWUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwREEsCi0JSU4JdW5zaWduZWQgaW50CU5leHRNcGR1U2l6ZSwKLQlJTiAgVUNIQVIgICAgICAgICAgIFR4UmF0ZSwKLQlJTiAgVUNIQVIgICAgICAgICAgIFJUU1JhdGUsCi0JSU4gIFVTSE9SVCAgICAgICAgICBBY2tEdXJhdGlvbiwKLQlJTiAgVUNIQVIgICAgICAgICAgIFF1ZUlkeCwKLQlJTiAgVUNIQVIJCQlGcmFtZUdhcCk7Ci0KLQotTkRJU19TVEFUVVMgUlRNUEFwcGx5UGFja2V0RmlsdGVyKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQUlQyOFhYX1JYRF9TVFJVQyAgICAgIHBSeEQsCi0JSU4gIFBIRUFERVJfODAyXzExICBwSGVhZGVyKTsKLQotUFFVRVVFX0hFQURFUiAgIFJUTVBDaGVja1R4U3dRdWV1ZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlPVVQgVUNIQVIgICAgICAgICAgICpRdWVJZHgpOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1WT0lEIFJUTVBSZXBvcnRNaWNFcnJvcigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUENJUEhFUl9LRVkgICAgIHBXcGFLZXkpOwotCi1WT0lECVdwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgICAgV3BhRGlzYXNzb2NBcEFuZEJsb2NrQXNzb2MoCi0gICAgSU4gIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLSAgICBJTiAgUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotICAgIElOICBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0gICAgSU4gIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Ci0KLVZPSUQgV3BhU3RhUGFpcndpc2VLZXlTZXR0aW5nKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKLQotVk9JRCBXcGFTdGFHcm91cEtleVNldHRpbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOwotCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLU5ESVNfU1RBVFVTIFJUTVBDbG9uZU5kaXNQYWNrZXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4JQk9PTEVBTiAgICBwSW5zQU1TRFVIZHIsCi0JSU4gIFBORElTX1BBQ0tFVCAgICBwSW5QYWNrZXQsCi0JT1VUIFBORElTX1BBQ0tFVCAgICpwcE91dFBhY2tldCk7Ci0KLU5ESVNfU1RBVFVTIFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBORElTX1BBQ0tFVCAgICAqcFBhY2tldCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBIZWFkZXIsCi0JSU4gIFVJTlQgICAgICAgICAgICBIZWFkZXJMZW4sCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKLQlJTiAgVUlOVCAgICAgICAgICAgIERhdGFMZW4pOwotCi1WT0lEIFJUTVBGcmVlTmRpc1BhY2tldCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOwotCi1CT09MRUFOIFJUTVBGcmVlVFhEVXBvblR4RG1hRG9uZSgKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQlJTiBVQ0hBUiAgICAgICAgICAgIFF1ZUlkeCk7Ci0KLUJPT0xFQU4gUlRNUENoZWNrREhDUEZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KTsKLQotCi1CT09MRUFOIFJUTVBDaGVja0V0aGVyVHlwZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCk7Ci0KLQotVk9JRCBSVE1QQ2NrQmJwVHVuaW5nKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVJTlQJCQlUeFJhdGUpOwotCi0vLwotLy8gUHJpdmF0ZSByb3V0aW5lcyBpbiBydG1wX3dlcC5jCi0vLwotVk9JRCBSVE1QSW5pdFdlcEVuZ2luZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBLZXksCi0JSU4gIFVDSEFSICAgICAgICAgICBLZXlJZCwKLQlJTiAgVUNIQVIgICAgICAgICAgIEtleUxlbiwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEZXN0KTsKLQotVk9JRCBSVE1QRW5jcnlwdERhdGEoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAotCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QsCi0JSU4gIFVJTlQgICAgICAgICAgICBMZW4pOwotCi1CT09MRUFOCVJUTVBEZWNyeXB0RGF0YSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCVBVQ0hBUgkJCXBTcmMsCi0JSU4JVUlOVAkJCUxlbiwKLQlJTglVSU5UCQkJaWR4KTsKLQotQk9PTEVBTglSVE1QU29mdERlY3J5cHRXRVAoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gUFVDSEFSCQkJcERhdGEsCi0JSU4gVUxPTkcJCQlEYXRhQnl0ZUNudCwKLQlJTiBQQ0lQSEVSX0tFWQkJcEdyb3VwS2V5KTsKLQotVk9JRCBSVE1QU2V0SUNWKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QpOwotCi1WT0lEIEFSQ0ZPVVJfSU5JVCgKLQlJTiAgUEFSQ0ZPVVJDT05URVhUIEN0eCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBLZXksCi0JSU4gIFVJTlQgICAgICAgICAgICBLZXlMZW4pOwotCi1VQ0hBUiAgIEFSQ0ZPVVJfQllURSgKLQlJTiAgUEFSQ0ZPVVJDT05URVhUICAgICBDdHgpOwotCi1WT0lEIEFSQ0ZPVVJfREVDUllQVCgKLQlJTiAgUEFSQ0ZPVVJDT05URVhUIEN0eCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEZXN0LAotCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKLQlJTiAgVUlOVCAgICAgICAgICAgIExlbik7Ci0KLVZPSUQgQVJDRk9VUl9FTkNSWVBUKAotCUlOICBQQVJDRk9VUkNPTlRFWFQgQ3R4LAotCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAotCUlOICBVSU5UICAgICAgICAgICAgTGVuKTsKLQotVk9JRCBXUEFBUkNGT1VSX0VOQ1JZUFQoCi0JSU4gIFBBUkNGT1VSQ09OVEVYVCBDdHgsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwRGVzdCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCi0JSU4gIFVJTlQgICAgICAgICAgICBMZW4pOwotCi1VSU5UIFJUTVBfQ0FMQ19GQ1MzMigKLQlJTiAgVUlOVCAgIEZjcywKLQlJTiAgUFVDSEFSICBDcCwKLQlJTiAgSU5UICAgICBMZW4pOwotCi0vLwotLy8gTUxNRSByb3V0aW5lcwotLy8KLQotLy8gQXNpYy9SRi9CQlAgcmVsYXRlZCBmdW5jdGlvbnMKLQotVk9JRCBBc2ljQWRqdXN0VHhQb3dlcigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQJQXNpY1VwZGF0ZVByb3RlY3QoCi0JSU4JCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCQlVU0hPUlQJCQlPcGVyYWlvbk1vZGUsCi0JSU4JCVVDSEFSCQkJU2V0TWFzaywKLQlJTgkJQk9PTEVBTgkJCWJEaXNhYmxlQkdQcm90ZWN0LAotCUlOCQlCT09MRUFOCQkJYk5vbkdGRXhpc3QpOwotCi1WT0lEIEFzaWNTd2l0Y2hDaGFubmVsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCVVDSEFSCQkJQ2hhbm5lbCwKLQlJTglCT09MRUFOCQkJYlNjYW4pOwotCi1WT0lEIEFzaWNMb2NrQ2hhbm5lbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiBDaGFubmVsKSA7Ci0KLVZPSUQgQXNpY0FudGVubmFTZWxlY3QoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSICAgICAgICAgICBDaGFubmVsKTsKLQotVk9JRCBBc2ljQW50ZW5uYVNldHRpbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JQUJHQkFORF9TVEFURQlCYW5kU3RhdGUpOwotCi1WT0lEIEFzaWNSZlR1bmluZ0V4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCi1WT0lEIEFzaWNSZXNldEJCUEFnZW50KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVVNIT1JUIFRidHROdW1Ub05leHRXYWtlVXApOwotCi1WT0lEIEFzaWNGb3JjZVNsZWVwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBBc2ljRm9yY2VXYWtldXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gQk9PTEVBTiAgICBiRnJvbVR4KTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotVk9JRCBBc2ljU2V0QnNzaWQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiBwQnNzaWQpOwotCi1WT0lEIEFzaWNTZXRNY2FzdFdDKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotCi1WT0lEIEFzaWNEZWxXY2lkVGFiKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSCVdjaWQpOwotCi1WT0lEIEFzaWNFbmFibGVSREcoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIEFzaWNEaXNhYmxlUkRHKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBBc2ljRGlzYWJsZVN5bmMoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIEFzaWNFbmFibGVCc3NTeW5jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCBBc2ljRW5hYmxlSWJzc1N5bmMoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIEFzaWNTZXRFZGNhUGFybSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQRURDQV9QQVJNICAgIHBFZGNhUGFybSk7Ci0KLVZPSUQgQXNpY1NldFNsb3RUaW1lKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIEJPT0xFQU4gYlVzZVNob3J0U2xvdFRpbWUpOwotCi0KLVZPSUQgQXNpY0FkZFNoYXJlZEtleUVudHJ5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSICAgICAgICAgQnNzSW5kZXgsCi0JSU4gVUNIQVIgICAgICAgICBLZXlJZHgsCi0JSU4gVUNIQVIgICAgICAgICBDaXBoZXJBbGcsCi0JSU4gUFVDSEFSICAgICAgICBwS2V5LAotCUlOIFBVQ0hBUiAgICAgICAgcFR4TWljLAotCUlOIFBVQ0hBUiAgICAgICAgcFJ4TWljKTsKLQotVk9JRCBBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgICAgICAgICBCc3NJbmRleCwKLQlJTiBVQ0hBUiAgICAgICAgIEtleUlkeCk7Ci0KLVZPSUQgQXNpY1VwZGF0ZVdDSURBdHRyaWJ1dGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUCQlXQ0lELAotCUlOIFVDSEFSCQlCc3NJbmRleCwKLQlJTiBVQ0hBUiAgICAgICAgQ2lwaGVyQWxnLAotCUlOIEJPT0xFQU4JCWJVc2VQYWlyZXdpc2VLZXlUYWJsZSk7Ci0KLVZPSUQgQXNpY1VwZGF0ZVdDSURJVkVJVigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQJCVdDSUQsCi0JSU4gVUxPTkcgICAgICAgIHVJViwKLQlJTiBVTE9ORyAgICAgICAgdUVJVik7Ci0KLVZPSUQgQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVAkJV0NJRCwKLQlJTiBQVUNIQVIgICAgICAgIHBBZGRyKTsKLQotVk9JRCBBc2ljQWRkS2V5RW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUCQlXQ0lELAotCUlOIFVDSEFSCQlCc3NJbmRleCwKLQlJTiBVQ0hBUgkJS2V5SWR4LAotCUlOIFBDSVBIRVJfS0VZCXBDaXBoZXJLZXksCi0JSU4gQk9PTEVBTgkJYlVzZVBhaXJld2lzZUtleVRhYmxlLAotCUlOIEJPT0xFQU4JCWJUeEtleSk7Ci0KLVZPSUQgQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSICAgICAgICBwQWRkciwKLQlJTiBVQ0hBUgkJV0NJRCwKLQlJTiBDSVBIRVJfS0VZCQkgKnBDaXBoZXJLZXkpOwotCi1WT0lEIEFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KAotCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKLQlJTiBVQ0hBUgkJIEJzc0lkeCwKLQlJTiBVQ0hBUgkJIFdjaWQpOwotCi1CT09MRUFOIEFzaWNTZW5kQ29tbWFuZFRvTWN1KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSICAgICAgICAgQ29tbWFuZCwKLQlJTiBVQ0hBUiAgICAgICAgIFRva2VuLAotCUlOIFVDSEFSICAgICAgICAgQXJnMCwKLQlJTiBVQ0hBUiAgICAgICAgIEFyZzEpOwotCi0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLUJPT0xFQU4gQXNpY0NoZWNrQ29tbWFuT2soCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIJCSBDb21tYW5kKTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotVk9JRCBNYWNBZGRyUmFuZG9tQnNzaWQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JT1VUIFBVQ0hBUiBwQWRkcik7Ci0KLVZPSUQgTWd0TWFjSGVhZGVySW5pdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgICAgcEFkLAotCUlOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCi0JSU4gVUNIQVIgU3ViVHlwZSwKLQlJTiBVQ0hBUiBUb0RzLAotCUlOIFBVQ0hBUiBwREEsCi0JSU4gUFVDSEFSIHBCc3NpZCk7Ci0KLVZPSUQgTWxtZVJhZGlvT2ZmKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBNbG1lUmFkaW9PbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLQotVk9JRCBCc3NUYWJsZUluaXQoCi0JSU4gQlNTX1RBQkxFICpUYWIpOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi1WT0lEIEJBVGFibGVJbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIEJBX1RBQkxFICpUYWIpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1VTE9ORyBCc3NUYWJsZVNlYXJjaCgKLQlJTiBCU1NfVEFCTEUgKlRhYiwKLQlJTiBQVUNIQVIgcEJzc2lkLAotCUlOIFVDSEFSIENoYW5uZWwpOwotCi1VTE9ORyBCc3NTc2lkVGFibGVTZWFyY2goCi0JSU4gQlNTX1RBQkxFICpUYWIsCi0JSU4gUFVDSEFSICAgIHBCc3NpZCwKLQlJTiBQVUNIQVIgICAgcFNzaWQsCi0JSU4gVUNIQVIgICAgIFNzaWRMZW4sCi0JSU4gVUNIQVIgICAgIENoYW5uZWwpOwotCi1VTE9ORyBCc3NUYWJsZVNlYXJjaFdpdGhTU0lEKAotCUlOIEJTU19UQUJMRSAqVGFiLAotCUlOIFBVQ0hBUiAgICBCc3NpZCwKLQlJTiBQVUNIQVIgICAgcFNzaWQsCi0JSU4gVUNIQVIgICAgIFNzaWRMZW4sCi0JSU4gVUNIQVIgICAgIENoYW5uZWwpOwotCi1VTE9ORyBCc3NTc2lkVGFibGVTZWFyY2hCeVNTSUQoCi0JSU4gQlNTX1RBQkxFICpUYWIsCi0JSU4gUFVDSEFSCSBwU3NpZCwKLQlJTiBVQ0hBUgkgU3NpZExlbik7Ci0KLVZPSUQgQnNzVGFibGVEZWxldGVFbnRyeSgKLQlJTiBPVVQgIFBCU1NfVEFCTEUgcFRhYiwKLQlJTiAgICAgIFBVQ0hBUiBwQnNzaWQsCi0JSU4gICAgICBVQ0hBUiBDaGFubmVsKTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotVk9JRCBCQVRhYmxlRGVsZXRlT1JJRW50cnkoCi0JSU4gT1VUCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCQlCQV9PUklfRU5UUlkJKnBCQU9SSUVudHJ5KTsKLQotVk9JRCBCQVRhYmxlRGVsZXRlUkVDRW50cnkoCi0JSU4gT1VUCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCQlCQV9SRUNfRU5UUlkJKnBCQVJFQ0VudHJ5KTsKLQotVk9JRCBCQVRhYmxlVGVhck9SSUVudHJ5KAotCUlOIE9VVAlQUlRNUF9BREFQVEVSIHBBZCwKLQlJTgkJVUNIQVIgVElELAotCUlOCQlVQ0hBUiBXY2lkLAotCUlOCQlCT09MRUFOIGJGb3JjZURlbGV0ZSwKLQlJTgkJQk9PTEVBTiBBTEwpOwotCi1WT0lEIEJBVGFibGVUZWFyUkVDRW50cnkoCi0JSU4gT1VUCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCQlVQ0hBUiBUSUQsCi0JSU4JCVVDSEFSIFdDSUQsCi0JSU4JCUJPT0xFQU4gQUxMKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotVk9JRCAgQnNzRW50cnlTZXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JT1VUIFBCU1NfRU5UUlkgcEJzcywKLQlJTiBQVUNIQVIgcEJzc2lkLAotCUlOIENIQVIgU3NpZFtdLAotCUlOIFVDSEFSIFNzaWRMZW4sCi0JSU4gVUNIQVIgQnNzVHlwZSwKLQlJTiBVU0hPUlQgQmVhY29uUGVyaW9kLAotCUlOIFBDRl9QQVJNIENmUGFybSwKLQlJTiBVU0hPUlQgQXRpbVdpbiwKLQlJTiBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCi0JSU4gVUNIQVIgU3VwUmF0ZVtdLAotCUlOIFVDSEFSIFN1cFJhdGVMZW4sCi0JSU4gVUNIQVIgRXh0UmF0ZVtdLAotCUlOIFVDSEFSIEV4dFJhdGVMZW4sCi0JSU4gSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKLQlJTiBBRERfSFRfSU5GT19JRSAqcEFkZEh0SW5mbywJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCi0JSU4gVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sCi0JSU4gVUNIQVIJCQlBZGRIdEluZm9MZW4sCi0JSU4gVUNIQVIJCQlOZXdFeHRDaGFuT2Zmc2V0LAotCUlOIFVDSEFSIENoYW5uZWwsCi0JSU4gQ0hBUiBSc3NpLAotCUlOIExBUkdFX0lOVEVHRVIgVGltZVN0YW1wLAotCUlOIFVDSEFSIENraXBGbGFnLAotCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAotCUlOIFBRT1NfQ0FQQUJJTElUWV9QQVJNIHBRb3NDYXBhYmlsaXR5LAotCUlOIFBRQlNTX0xPQURfUEFSTSBwUWJzc0xvYWQsCi0JSU4gVVNIT1JUIExlbmd0aFZJRSwKLQlJTiBQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzIHBWSUUpOwotCi1VTE9ORyAgQnNzVGFibGVTZXRFbnRyeSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlPVVQgUEJTU19UQUJMRSBwVGFiLAotCUlOIFBVQ0hBUiBwQnNzaWQsCi0JSU4gQ0hBUiBTc2lkW10sCi0JSU4gVUNIQVIgU3NpZExlbiwKLQlJTiBVQ0hBUiBCc3NUeXBlLAotCUlOIFVTSE9SVCBCZWFjb25QZXJpb2QsCi0JSU4gQ0ZfUEFSTSAqQ2ZQYXJtLAotCUlOIFVTSE9SVCBBdGltV2luLAotCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKLQlJTiBVQ0hBUiBTdXBSYXRlW10sCi0JSU4gVUNIQVIgU3VwUmF0ZUxlbiwKLQlJTiBVQ0hBUiBFeHRSYXRlW10sCi0JSU4gVUNIQVIgRXh0UmF0ZUxlbiwKLQlJTiBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAotCUlOIEFERF9IVF9JTkZPX0lFICpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLQlJTiBVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiwKLQlJTiBVQ0hBUgkJCUFkZEh0SW5mb0xlbiwKLQlJTiBVQ0hBUgkJCU5ld0V4dENoYW5PZmZzZXQsCi0JSU4gVUNIQVIgQ2hhbm5lbCwKLQlJTiBDSEFSIFJzc2ksCi0JSU4gTEFSR0VfSU5URUdFUiBUaW1lU3RhbXAsCi0JSU4gVUNIQVIgQ2tpcEZsYWcsCi0JSU4gUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCi0JSU4gUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCi0JSU4gUFFCU1NfTE9BRF9QQVJNIHBRYnNzTG9hZCwKLQlJTiBVU0hPUlQgTGVuZ3RoVklFLAotCUlOIFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSk7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLVZPSUQgQkFUYWJsZUluc2VydEVudHJ5KAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVTSE9SVCBBaWQsCi0gICAgSU4gVVNIT1JUCQlUaW1lT3V0VmFsdWUsCi0JSU4gVVNIT1JUCQlTdGFydGluZ1NlcSwKLSAgICBJTiBVQ0hBUiBUSUQsCi0JSU4gVUNIQVIgQkFXaW5TaXplLAotCUlOIFVDSEFSIE9yaWdpbmF0b3JTdGF0dXMsCi0gICAgSU4gQk9PTEVBTiBJc1JlY2lwaWVudCk7Ci0KLSNpZmRlZiBET1QxMU5fRFJBRlQzCi1WT0lEIEJzczIwNDBDb2V4aXN0VGltZU91dCgKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi0KLVZPSUQgIFRyaUV2ZW50SW5pdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVVMT05HIFRyaUV2ZW50VGFibGVTZXRFbnRyeSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQgVFJJR0dFUl9FVkVOVF9UQUIgKlRhYiwKLQlJTiBQVUNIQVIgcEJzc2lkLAotCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCi0JSU4gVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sCi0JSU4gVUNIQVIJCQlSZWdDbGFzcywKLQlJTiBVQ0hBUiBDaGFubmVsTm8pOwotCi1WT0lEIFRyaUV2ZW50Q291bnRlck1haW50ZW5hbmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLVZPSUQgQnNzVGFibGVTc2lkU29ydCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlPVVQgQlNTX1RBQkxFICpPdXRUYWIsCi0JSU4gIENIQVIgU3NpZFtdLAotCUlOICBVQ0hBUiBTc2lkTGVuKTsKLQotVk9JRCAgQnNzVGFibGVTb3J0QnlSc3NpKAotCUlOIE9VVCBCU1NfVEFCTEUgKk91dFRhYik7Ci0KLVZPSUQgQnNzQ2lwaGVyUGFyc2UoCi0JSU4gT1VUICBQQlNTX0VOVFJZICBwQnNzKTsKLQotTkRJU19TVEFUVVMgIE1sbWVRdWV1ZUluaXQoCi0JSU4gTUxNRV9RVUVVRSAqUXVldWUpOwotCi1WT0lEICBNbG1lUXVldWVEZXN0cm95KAotCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKTsKLQotQk9PTEVBTiBNbG1lRW5xdWV1ZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVTE9ORyBNYWNoaW5lLAotCUlOIFVMT05HIE1zZ1R5cGUsCi0JSU4gVUxPTkcgTXNnTGVuLAotCUlOIFZPSUQgKk1zZyk7Ci0KLUJPT0xFQU4gTWxtZUVucXVldWVGb3JSZWN2KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOIFVMT05HIFdjaWQsCi0JSU4gVUxPTkcgVGltZVN0YW1wSGlnaCwKLQlJTiBVTE9ORyBUaW1lU3RhbXBMb3csCi0JSU4gVUNIQVIgUnNzaTAsCi0JSU4gVUNIQVIgUnNzaTEsCi0JSU4gVUNIQVIgUnNzaTIsCi0JSU4gVUxPTkcgTXNnTGVuLAotCUlOIFBWT0lEIE1zZywKLQlJTiBVQ0hBUiBTaWduYWwpOwotCi0KLUJPT0xFQU4gTWxtZURlcXVldWUoCi0JSU4gTUxNRV9RVUVVRSAqUXVldWUsCi0JT1VUIE1MTUVfUVVFVUVfRUxFTSAqKkVsZW0pOwotCi1WT0lEICAgIE1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotQk9PTEVBTiAgTWxtZVF1ZXVlRW1wdHkoCi0JSU4gTUxNRV9RVUVVRSAqUXVldWUpOwotCi1CT09MRUFOICBNbG1lUXVldWVGdWxsKAotCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKTsKLQotQk9PTEVBTiAgTXNnVHlwZVN1YnN0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBGUkFNRV84MDJfMTEgcEZyYW1lLAotCU9VVCBJTlQgKk1hY2hpbmUsCi0JT1VUIElOVCAqTXNnVHlwZSk7Ci0KLVZPSUQgU3RhdGVNYWNoaW5lSW5pdCgKLQlJTiBTVEFURV9NQUNISU5FICpTbSwKLQlJTiBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSwKLQlJTiBVTE9ORyBTdE5yLAotCUlOIFVMT05HIE1zZ05yLAotCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBEZWZGdW5jLAotCUlOIFVMT05HIEluaXRTdGF0ZSwKLQlJTiBVTE9ORyBCYXNlKTsKLQotVk9JRCBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oCi0JSU4gU1RBVEVfTUFDSElORSAqUywKLQlJTiBVTE9ORyBTdCwKLQlVTE9ORyBNc2csCi0JSU4gU1RBVEVfTUFDSElORV9GVU5DIEYpOwotCi1WT0lEIFN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gU1RBVEVfTUFDSElORSAqUywKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIERyb3AoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBBc3NvY1N0YXRlTWFjaGluZUluaXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFNUQVRFX01BQ0hJTkUgKlNtLAotCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7Ci0KLVZPSUQgUmVhc3NvY1RpbWVvdXQoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotVk9JRCBBc3NvY1RpbWVvdXQoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotVk9JRCBEaXNhc3NvY1RpbWVvdXQoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1WT0lEIE1sbWVEaXNhc3NvY1JlcUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBNbG1lQXNzb2NSZXFBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgTWxtZVJlYXNzb2NSZXFBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgTWxtZURpc2Fzc29jUmVxQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIFBlZXJBc3NvY1JzcEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBQZWVyUmVhc3NvY1JzcEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBQZWVyRGlzYXNzb2NBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgRGlzYXNzb2NUaW1lb3V0QWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIEFzc29jVGltZW91dEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCAgUmVhc3NvY1RpbWVvdXRBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgIENsczNlcnJBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiBwQWRkcik7Ci0KLVZPSUQgIEludmFsaWRTdGF0ZVdoZW5Bc3NvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCAgSW52YWxpZFN0YXRlV2hlblJlYXNzb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSgKLQlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLQotVk9JRCAgQ29tcG9zZVBzUG9sbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgIENvbXBvc2VOdWxsRnJhbWUoCi0JSU4gIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCAgQXNzb2NQb3N0UHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSIHBBZGRyMiwKLQlJTiAgVVNIT1JUIENhcGFiaWxpdHlJbmZvLAotCUlOICBVU0hPUlQgQWlkLAotCUlOICBVQ0hBUiBTdXBSYXRlW10sCi0JSU4gIFVDSEFSIFN1cFJhdGVMZW4sCi0JSU4gIFVDSEFSIEV4dFJhdGVbXSwKLQlJTiAgVUNIQVIgRXh0UmF0ZUxlbiwKLQlJTiBQRURDQV9QQVJNIHBFZGNhUGFybSwKLQlJTiBIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKLQlJTiAgVUNIQVIgSHRDYXBhYmlsaXR5TGVuLAotCUlOIEFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbyk7Ci0KLVZPSUQgQXV0aFN0YXRlTWFjaGluZUluaXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gUFNUQVRFX01BQ0hJTkUgc20sCi0JT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKLQotVk9JRCBBdXRoVGltZW91dCgKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi1WT0lEIE1sbWVBdXRoUmVxQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIFBlZXJBdXRoUnNwQXRTZXEyQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIFBlZXJBdXRoUnNwQXRTZXE0QWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIEF1dGhUaW1lb3V0QWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIENsczJlcnJBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiBwQWRkcik7Ci0KLVZPSUQgTWxtZURlYXV0aFJlcUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBJbnZhbGlkU3RhdGVXaGVuQXV0aCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVk9JRCBBdXRoUnNwU3RhdGVNYWNoaW5lSW5pdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFNUQVRFX01BQ0hJTkUgU20sCi0JSU4gIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKLQotVk9JRCBQZWVyRGVhdXRoQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgUGVlckF1dGhTaW1wbGVSc3BHZW5BbmRTZW5kKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQSEVBREVSXzgwMl8xMSAgcEhkcjgwMjExLAotCUlOICBVU0hPUlQgQWxnLAotCUlOICBVU0hPUlQgU2VxLAotCUlOICBVU0hPUlQgUmVhc29uLAotCUlOICBVU0hPUlQgU3RhdHVzKTsKLQotLy8KLS8vIFByaXZhdGUgcm91dGluZXMgaW4gZGxzLmMKLS8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLXZvaWQgRGxzU3RhdGVNYWNoaW5lSW5pdCgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBTVEFURV9NQUNISU5FICpTbSwKLSAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOwotCi1WT0lEIE1sbWVEbHNSZXFBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBQZWVyRGxzUmVxQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIJcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTQkqRWxlbSk7Ci0KLVZPSUQgUGVlckRsc1JzcEFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSCXBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0JKkVsZW0pOwotCi1WT0lEIE1sbWVEbHNUZWFyRG93bkFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIFBlZXJEbHNUZWFyRG93bkFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSCXBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0JKkVsZW0pOwotCi1WT0lEIFJUTVBDaGVja0RMU1RpbWVPdXQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwotCi1CT09MRUFOIFJUTVBSY3ZGcmFtZURMU0NoZWNrKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFBIRUFERVJfODAyXzExCXBIZWFkZXIsCi0JSU4gVUxPTkcJCQlMZW4sCi0JSU4gUFJUMjhYWF9SWERfU1RSVUMJcFJ4RCk7Ci0KLUlOVAlSVE1QQ2hlY2tETFNGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEQSk7Ci0KLVZPSUQgUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcERBKTsKLQotTkRJU19TVEFUVVMgUlRNUFNlbmRTVEFLZXlSZXF1ZXN0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBEQSk7Ci0KLU5ESVNfU1RBVFVTIFJUTVBTZW5kU1RBS2V5SGFuZFNoYWtlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBEQSk7Ci0KLVZPSUQgRGxzVGltZW91dEFjdGlvbigKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi1CT09MRUFOIE1sbWVEbHNSZXFTYW5pdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFJUXzgwMl8xMV9ETFMgKnBETFMsCi0gICAgT1VUIFBVU0hPUlQgcFJlYXNvbik7Ci0KLUlOVCBTZXRfRGxzRW50cnlJbmZvX0Rpc3BsYXlfUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgYXJnKTsKLQotTUFDX1RBQkxFX0VOVFJZICpNYWNUYWJsZUluc2VydERsc0VudHJ5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIJcEFkZHIsCi0JSU4gIFVJTlQJRGxzRW50cnlJZHgpOwotCi1CT09MRUFOIE1hY1RhYmxlRGVsZXRlRGxzRW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIHdjaWQsCi0JSU4gUFVDSEFSIHBBZGRyKTsKLQotTUFDX1RBQkxFX0VOVFJZICpEbHNFbnRyeVRhYmxlTG9va3VwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUglwQWRkciwKLQlJTiBCT09MRUFOCWJSZXNldElkZWxDb3VudCk7Ci0KLU1BQ19UQUJMRV9FTlRSWSAqRGxzRW50cnlUYWJsZUxvb2t1cEJ5V2NpZCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUgl3Y2lkLAotCUlOIFBVQ0hBUglwQWRkciwKLQlJTiBCT09MRUFOCWJSZXNldElkZWxDb3VudCk7Ci0KLUlOVAlTZXRfRGxzQWRkRW50cnlfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9EbHNUZWFyRG93bkVudHJ5X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLUJPT0xFQU4gUGVlckRsc1JlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcERBLAotICAgIE9VVCBQVUNIQVIgcFNBLAotICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKLSAgICBPVVQgVVNIT1JUICpwRGxzVGltZW91dCwKLSAgICBPVVQgVUNIQVIgKnBSYXRlc0xlbiwKLSAgICBPVVQgVUNIQVIgUmF0ZXNbXSwKLSAgICBPVVQgVUNIQVIgKnBIdENhcGFiaWxpdHlMZW4sCi0gICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHkpOwotCi1CT09MRUFOIFBlZXJEbHNSc3BTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBEQSwKLSAgICBPVVQgUFVDSEFSIHBTQSwKLSAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCi0gICAgT1VUIFVTSE9SVCAqcFN0YXR1cywKLSAgICBPVVQgVUNIQVIgKnBSYXRlc0xlbiwKLSAgICBPVVQgVUNIQVIgUmF0ZXNbXSwKLSAgICBPVVQgVUNIQVIgKnBIdENhcGFiaWxpdHlMZW4sCi0gICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHkpOwotCi1CT09MRUFOIFBlZXJEbHNUZWFyRG93blNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcERBLAotICAgIE9VVCBQVUNIQVIgcFNBLAotICAgIE9VVCBVU0hPUlQgKnBSZWFzb24pOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVk9JRCBTeW5jU3RhdGVNYWNoaW5lSW5pdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgU1RBVEVfTUFDSElORSAqU20sCi0JT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKLQotVk9JRCBCZWFjb25UaW1lb3V0KAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Ci0KLVZPSUQgU2NhblRpbWVvdXQoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotVk9JRCBNbG1lU2NhblJlcUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBJbnZhbGlkU3RhdGVXaGVuU2NhbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBJbnZhbGlkU3RhdGVXaGVuSm9pbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBJbnZhbGlkU3RhdGVXaGVuU3RhcnQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgUGVlckJlYWNvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBFbnF1ZXVlUHJvYmVSZXF1ZXN0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotQk9PTEVBTiBTY2FuUnVubmluZygKLQkJSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1WT0lEIE1sbWVDbnRsSW5pdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgU1RBVEVfTUFDSElORSAqUywKLQlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOwotCi1WT0lEIE1sbWVDbnRsTWFjaGluZVBlcmZvcm1BY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFNUQVRFX01BQ0hJTkUgKlMsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgQ250bElkbGVQcm9jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIENudGxPaWRTY2FuUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgQ250bE9pZFNzaWRQcm9jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKiBFbGVtKTsKLQotVk9JRCBDbnRsT2lkUlRCc3NpZFByb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pOwotCi1WT0lEIENudGxNbG1lUm9hbWluZ1Byb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pOwotCi1WT0lEIENudGxXYWl0RGlzYXNzb2NQcm9jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIENudGxXYWl0Sm9pblByb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgQ250bFdhaXRSZWFzc29jUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBDbnRsV2FpdFN0YXJ0UHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBDbnRsV2FpdEF1dGhQcm9jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIENudGxXYWl0QXV0aFByb2MyKAotCUlOICBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBDbnRsV2FpdEFzc29jUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotVk9JRCBDbnRsT2lkRExTU2V0dXBQcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLVZPSUQgTGlua1VwKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUiBCc3NUeXBlKTsKLQotVk9JRCBMaW5rRG93bigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgQk9PTEVBTiAgICAgICAgIElzUmVxRnJvbUFQKTsKLQotVk9JRCBJdGVyYXRlT25Cc3NUYWIoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIEl0ZXJhdGVPbkJzc1RhYjIoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOzsKLQotVk9JRCBKb2luUGFybUZpbGwoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE9VVCBNTE1FX0pPSU5fUkVRX1NUUlVDVCAqSm9pblJlcSwKLQlJTiAgVUxPTkcgQnNzSWR4KTsKLQotVk9JRCBBc3NvY1Bhcm1GaWxsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOIE9VVCBNTE1FX0FTU09DX1JFUV9TVFJVQ1QgKkFzc29jUmVxLAotCUlOICBQVUNIQVIgcEFkZHIsCi0JSU4gIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKLQlJTiAgVUxPTkcgVGltZW91dCwKLQlJTiAgVVNIT1JUIExpc3RlbkludHYpOwotCi1WT0lEIFNjYW5QYXJtRmlsbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgT1VUIE1MTUVfU0NBTl9SRVFfU1RSVUNUICpTY2FuUmVxLAotCUlOICBTVFJJTkcgU3NpZFtdLAotCUlOICBVQ0hBUiBTc2lkTGVuLAotCUlOICBVQ0hBUiBCc3NUeXBlLAotCUlOICBVQ0hBUiBTY2FuVHlwZSk7Ci0KLVZPSUQgRGlzYXNzb2NQYXJtRmlsbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgT1VUIE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCAqRGlzYXNzb2NSZXEsCi0JSU4gIFBVQ0hBUiBwQWRkciwKLQlJTiAgVVNIT1JUIFJlYXNvbik7Ci0KLVZPSUQgU3RhcnRQYXJtRmlsbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgT1VUIE1MTUVfU1RBUlRfUkVRX1NUUlVDVCAqU3RhcnRSZXEsCi0JSU4gIENIQVIgU3NpZFtdLAotCUlOICBVQ0hBUiBTc2lkTGVuKTsKLQotVk9JRCBBdXRoUGFybUZpbGwoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE9VVCBNTE1FX0FVVEhfUkVRX1NUUlVDVCAqQXV0aFJlcSwKLQlJTiAgUFVDSEFSIHBBZGRyLAotCUlOICBVU0hPUlQgQWxnKTsKLQotVk9JRCBFbnF1ZXVlUHNQb2xsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCBFbnF1ZXVlQmVhY29uRnJhbWUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIE1sbWVKb2luUmVxQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIE1sbWVTY2FuUmVxQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIE1sbWVTdGFydFJlcUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBTY2FuVGltZW91dEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBCZWFjb25UaW1lb3V0QXRKb2luQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIFBlZXJCZWFjb25BdFNjYW5BY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgUGVlckJlYWNvbkF0Sm9pbkFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBQZWVyQmVhY29uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIFBlZXJQcm9iZVJlcUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgU2Nhbk5leHRDaGFubmVsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVUxPTkcgTWFrZUlic3NCZWFjb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIENDWEFkamFjZW50QVBSZXBvcnQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1CT09MRUFOIE1sbWVTY2FuUmVxU2FuaXR5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBWT0lEICpNc2csCi0JSU4gIFVMT05HIE1zZ0xlbiwKLQlPVVQgVUNIQVIgKkJzc1R5cGUsCi0JT1VUIENIQVIgc3NpZFtdLAotCU9VVCBVQ0hBUiAqU3NpZExlbiwKLQlPVVQgVUNIQVIgKlNjYW5UeXBlKTsKLQotQk9PTEVBTiBQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFZPSUQgKk1zZywKLQlJTiAgVUxPTkcgTXNnTGVuLAotCUlOICBVQ0hBUiBNc2dDaGFubmVsLAotCU9VVCBQVUNIQVIgcEFkZHIyLAotCU9VVCBQVUNIQVIgcEJzc2lkLAotCU9VVCBDSEFSIFNzaWRbXSwKLQlPVVQgVUNIQVIgKnBTc2lkTGVuLAotCU9VVCBVQ0hBUiAqcEJzc1R5cGUsCi0JT1VUIFVTSE9SVCAqcEJlYWNvblBlcmlvZCwKLQlPVVQgVUNIQVIgKnBDaGFubmVsLAotCU9VVCBVQ0hBUiAqcE5ld0NoYW5uZWwsCi0JT1VUIExBUkdFX0lOVEVHRVIgKnBUaW1lc3RhbXAsCi0JT1VUIENGX1BBUk0gKnBDZlBhcm0sCi0JT1VUIFVTSE9SVCAqcEF0aW1XaW4sCi0JT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAotCU9VVCBVQ0hBUiAqcEVycCwKLQlPVVQgVUNIQVIgKnBEdGltQ291bnQsCi0JT1VUIFVDSEFSICpwRHRpbVBlcmlvZCwKLQlPVVQgVUNIQVIgKnBCY2FzdEZsYWcsCi0JT1VUIFVDSEFSICpwTWVzc2FnZVRvTWUsCi0JT1VUIFVDSEFSIFN1cFJhdGVbXSwKLQlPVVQgVUNIQVIgKnBTdXBSYXRlTGVuLAotCU9VVCBVQ0hBUiBFeHRSYXRlW10sCi0JT1VUIFVDSEFSICpwRXh0UmF0ZUxlbiwKLQlPVVQJVUNIQVIgKnBDa2lwRmxhZywKLQlPVVQJVUNIQVIgKnBBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCi0JT1VUIFBFRENBX1BBUk0gICAgICAgcEVkY2FQYXJtLAotCU9VVCBQUUJTU19MT0FEX1BBUk0gIHBRYnNzTG9hZCwKLQlPVVQgUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCi0JT1VUIFVMT05HICpwUmFsaW5rSWUsCi0JT1VUIFVDSEFSCQkgKnBIdENhcGFiaWxpdHlMZW4sCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JT1VUIFVDSEFSCQkgKnBQcmVOSHRDYXBhYmlsaXR5TGVuLAotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCU9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAotCU9VVCBVQ0hBUgkJICpBZGRIdEluZm9MZW4sCi0JT1VUIEFERF9IVF9JTkZPX0lFICpBZGRIdEluZm8sCi0JT1VUIFVDSEFSICpOZXdFeHRDaGFubmVsLAotCU9VVCBVU0hPUlQgKkxlbmd0aFZJRSwKLQlPVVQgUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKTsKLQotQk9PTEVBTiBQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqcE1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVQ0hBUiBwQWRkcjIpOwotCi1CT09MRUFOIFBlZXJBZGRCQVJzcEFjdGlvblNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpwTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbik7Ci0KLUJPT0xFQU4gUGVlckRlbEJBQWN0aW9uU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFVDSEFSIFdjaWQsCi0gICAgSU4gVk9JRCAqcE1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4pOwotCi1CT09MRUFOIE1sbWVBc3NvY1JlcVNhbml0eSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVk9JRCAqTXNnLAotCUlOICBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVQ0hBUiBwQXBBZGRyLAotCU9VVCBVU0hPUlQgKkNhcGFiaWxpdHlJbmZvLAotCU9VVCBVTE9ORyAqVGltZW91dCwKLQlPVVQgVVNIT1JUICpMaXN0ZW5JbnR2KTsKLQotQk9PTEVBTiBNbG1lQXV0aFJlcVNhbml0eSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVk9JRCAqTXNnLAotCUlOICBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVQ0hBUiBwQWRkciwKLQlPVVQgVUxPTkcgKlRpbWVvdXQsCi0JT1VUIFVTSE9SVCAqQWxnKTsKLQotQk9PTEVBTiBNbG1lU3RhcnRSZXFTYW5pdHkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFZPSUQgKk1zZywKLQlJTiAgVUxPTkcgTXNnTGVuLAotCU9VVCBDSEFSIFNzaWRbXSwKLQlPVVQgVUNIQVIgKlNzaWRsZW4pOwotCi1CT09MRUFOIFBlZXJBdXRoU2FuaXR5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBWT0lEICpNc2csCi0JSU4gIFVMT05HIE1zZ0xlbiwKLQlPVVQgUFVDSEFSIHBBZGRyLAotCU9VVCBVU0hPUlQgKkFsZywKLQlPVVQgVVNIT1JUICpTZXEsCi0JT1VUIFVTSE9SVCAqU3RhdHVzLAotCU9VVCBDSEFSIENobGdUZXh0W10pOwotCi1CT09MRUFOIFBlZXJBc3NvY1JzcFNhbml0eSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiBWT0lEICpwTXNnLAotCUlOICBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVQ0hBUiBwQWRkcjIsCi0JT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAotCU9VVCBVU0hPUlQgKnBTdGF0dXMsCi0JT1VUIFVTSE9SVCAqcEFpZCwKLQlPVVQgVUNIQVIgU3VwUmF0ZVtdLAotCU9VVCBVQ0hBUiAqcFN1cFJhdGVMZW4sCi0JT1VUIFVDSEFSIEV4dFJhdGVbXSwKLQlPVVQgVUNIQVIgKnBFeHRSYXRlTGVuLAotICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKLSAgICBPVVQgQUREX0hUX0lORk9fSUUJCSpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLSAgICBPVVQgVUNIQVIJCQkqcEh0Q2FwYWJpbGl0eUxlbiwKLSAgICBPVVQgVUNIQVIJCQkqcEFkZEh0SW5mb0xlbiwKLSAgICBPVVQgVUNIQVIJCQkqcE5ld0V4dENoYW5uZWxPZmZzZXQsCi0JT1VUIFBFRENBX1BBUk0gcEVkY2FQYXJtLAotCU9VVCBVQ0hBUiAqcENraXBGbGFnKTsKLQotQk9PTEVBTiBQZWVyRGlzYXNzb2NTYW5pdHkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFZPSUQgKk1zZywKLQlJTiAgVUxPTkcgTXNnTGVuLAotCU9VVCBQVUNIQVIgcEFkZHIyLAotCU9VVCBVU0hPUlQgKlJlYXNvbik7Ci0KLUJPT0xFQU4gUGVlcldwYU1lc3NhZ2VTYW5pdHkoCi0gICAgSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotICAgIElOCVBFQVBPTF9QQUNLRVQJCXBNc2csCi0gICAgSU4JVUxPTkcJCQkJTXNnTGVuLAotICAgIElOCVVDSEFSCQkJCU1zZ1R5cGUsCi0gICAgSU4JTUFDX1RBQkxFX0VOVFJZCQkqcEVudHJ5KTsKLQotQk9PTEVBTiBQZWVyRGVhdXRoU2FuaXR5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBWT0lEICpNc2csCi0JSU4gIFVMT05HIE1zZ0xlbiwKLQlPVVQgUFVDSEFSIHBBZGRyMiwKLQlPVVQgVVNIT1JUICpSZWFzb24pOwotCi1CT09MRUFOIFBlZXJQcm9iZVJlcVNhbml0eSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVk9JRCAqTXNnLAotCUlOICBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVQ0hBUiBwQWRkcjIsCi0JT1VUIENIQVIgU3NpZFtdLAotCU9VVCBVQ0hBUiAqcFNzaWRMZW4pOwotCi1CT09MRUFOIEdldFRpbUJpdCgKLQlJTiAgQ0hBUiAqUHRyLAotCUlOICBVU0hPUlQgQWlkLAotCU9VVCBVQ0hBUiAqVGltTGVuLAotCU9VVCBVQ0hBUiAqQmNhc3RGbGFnLAotCU9VVCBVQ0hBUiAqRHRpbUNvdW50LAotCU9VVCBVQ0hBUiAqRHRpbVBlcmlvZCwKLQlPVVQgVUNIQVIgKk1lc3NhZ2VUb01lKTsKLQotVUNIQVIgQ2hhbm5lbFNhbml0eSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiBjaGFubmVsKTsKLQotTkRJU184MDJfMTFfTkVUV09SS19UWVBFIE5ldHdvcmtUeXBlSW5Vc2VTYW5pdHkoCi0JSU4gUEJTU19FTlRSWSBwQnNzKTsKLQotCi1CT09MRUFOIE1sbWVEZWxCQVJlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuKTsKLQotQk9PTEVBTiBNbG1lQWRkQkFSZXFTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBBZGRyMik7Ci0KLVVMT05HIE1ha2VPdXRnb2luZ0ZyYW1lKAotCU9VVCBVQ0hBUiAqQnVmZmVyLAotCU9VVCBVTE9ORyAqTGVuZ3RoLCAuLi4pOwotCi1WT0lEICBMZnNySW5pdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUxPTkcgU2VlZCk7Ci0KLVVDSEFSIFJhbmRvbUJ5dGUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIEFzaWNVcGRhdGVBdXRvRmFsbEJhY2tUYWJsZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwVHhSYXRlKTsKLQotVk9JRCAgTWxtZVBlcmlvZGljRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi1WT0lEIExpbmtEb3duRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi1WT0lEIExpbmtVcEV4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotVk9JRCBTVEFNbG1lUGVyaW9kaWNFeGVjKAotCVBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBNbG1lQXV0b1NjYW4oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIE1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1CT09MRUFOIE1sbWVWYWxpZGF0ZVNTSUQoCi0JSU4gUFVDSEFSIHBTc2lkLAotCUlOIFVDSEFSICBTc2lkTGVuKTsKLQotVk9JRCBNbG1lQ2hlY2tGb3JSb2FtaW5nKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVMT05HICAgIE5vdzMyKTsKLQotQk9PTEVBTiBNbG1lQ2hlY2tGb3JGYXN0Um9hbWluZygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIE1sbWVTZXRUeFJhdGUoCi0JSU4gUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOIFBNQUNfVEFCTEVfRU5UUlkJCXBFbnRyeSwKLQlJTiBQUlRNUF9UWF9SQVRFX1NXSVRDSAlwVHhSYXRlKTsKLQotVk9JRCBNbG1lU2VsZWN0VHhSYXRlVGFibGUoCi0JSU4gUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOIFBNQUNfVEFCTEVfRU5UUlkJCXBFbnRyeSwKLQlJTiBQVUNIQVIJCQkJKnBwVGFibGUsCi0JSU4gUFVDSEFSCQkJCXBUYWJsZVNpemUsCi0JSU4gUFVDSEFSCQkJCXBJbml0VHhSYXRlSWR4KTsKLQotVk9JRCBNbG1lQ2FsY3VsYXRlQ2hhbm5lbFF1YWxpdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUE1BQ19UQUJMRV9FTlRSWSBwTWFjRW50cnksCi0JSU4gVUxPTkcgTm93KTsKLQotVk9JRCBNbG1lQ2hlY2tQc21DaGFuZ2UoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUxPTkcgICAgTm93MzIpOwotCi1WT0lEIE1sbWVTZXRQc21CaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIHBzbSk7Ci0KLVZPSUQgTWxtZVNldFR4UHJlYW1ibGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIFR4UHJlYW1ibGUpOwotCi1WT0lEIFVwZGF0ZUJhc2ljUmF0ZUJpdG1hcCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgTWxtZVVwZGF0ZVR4UmF0ZXMoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JQk9PTEVBTgkJCWJMaW5rVXAsCi0JSU4JVUNIQVIJCQlhcGlkeCk7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLVZPSUQgTWxtZVVwZGF0ZUh0VHhSYXRlcygKLQlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JVUNIQVIJCQkJYXBpZHgpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1WT0lEICAgIFJUTVBDaGVja1JhdGVzKAotCUlOICAgICAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiBPVVQgIFVDSEFSICAgICAgICAgICBTdXBSYXRlW10sCi0JSU4gT1VUICBVQ0hBUiAgICAgICAgICAgKlN1cFJhdGVMZW4pOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1CT09MRUFOIFJUTVBDaGVja0NoYW5uZWwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIJCUNlbnRyYWxDaGFubmVsLAotCUlOIFVDSEFSCQlDaGFubmVsKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotQk9PTEVBTgkJUlRNUENoZWNrSHQoCi0JSU4JCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCQlVQ0hBUglXY2lkLAotCUlOIE9VVAlIVF9DQVBBQklMSVRZX0lFCQkJKnBIdENhcGFiaWxpdHksCi0JSU4gT1VUCUFERF9IVF9JTkZPX0lFCQkJKnBBZGRIdEluZm8pOwotCi1WT0lEIFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotVk9JRCBBc2ljQmJwVHVuaW5nMSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgQXNpY0JicFR1bmluZzIoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIFJUTVBVcGRhdGVNbG1lUmF0ZSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLUNIQVIgUlRNUE1heFJzc2koCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gQ0hBUgkJCQlSc3NpMCwKLQlJTiBDSEFSCQkJCVJzc2kxLAotCUlOIENIQVIJCQkJUnNzaTIpOwotCi0jaWZkZWYgUlQzMHh4Ci1WT0lEIEFzaWNTZXRSeEFudCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVQ0hBUgkJCUFudCk7Ci0KLVZPSUQgUlRNUEZpbHRlckNhbGlicmF0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotI2lmZGVmIFJUTVBfRUZVU0VfU1VQUE9SVAotLy8yMDA4LzA5LzExOktIIGFkZCB0byBzdXBwb3J0IGVmdXNlPC0tCi1JTlQgc2V0X2VGdXNlR2V0RnJlZUJsb2NrQ291bnRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIHNldF9lRnVzZWR1bXBfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIHNldF9lRnVzZUxvYWRGcm9tQmluX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLVZPSUQgZUZ1c2VQaHlzaWNhbFJlYWRSZWdpc3RlcnMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUIE9mZnNldCwKLQlJTglVU0hPUlQgTGVuZ3RoLAotCU9VVAlVU0hPUlQqIHBEYXRhKTsKLQotaW50IFJ0bXBFZnVzZVN1cHBvcnRDaGVjaygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCk7Ci0KLUlOVCBzZXRfZUZ1c2VCdWZmZXJNb2RlV3JpdGVCYWNrX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBlRnVzZUxvYWRFRVBST00oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1JTlQgZUZ1c2VXcml0ZUVlZXBwcm9tQnVmKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBlRnVzZUdldEZyZWVCbG9ja0NvdW50KElOIFBSVE1QX0FEQVBURVIgcEFkLAotCVBVSU5UIEVmdXNlRnJlZUJsb2NrKTsKLQotSU5UIGVGdXNlX2luaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1OVFNUQVRVUyBlRnVzZVJlYWQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCU9VVAlQVUNIQVIJCQlwRGF0YSwKLQlJTglVU0hPUlQJCQlMZW5ndGgpOwotCi1OVFNUQVRVUyBlRnVzZVdyaXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVAkJCU9mZnNldCwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVU0hPUlQJCQlsZW5ndGgpOwotLy8yMDA4LzA5LzExOktIIGFkZCB0byBzdXBwb3J0IGVmdXNlLS0+Ci0jZW5kaWYgLy8gUlRNUF9FRlVTRV9TVVBQT1JUIC8vCi0KLS8vIGFkZCBieSBqb2hubGksIFJGIHBvd2VyIHNlcXVlbmNlIHNldHVwCi1WT0lEIFJUMzB4eExvYWRSRk5vcm1hbE1vZGVTZXR1cCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgUlQzMHh4TG9hZFJGU2xlZXBNb2RlU2V0dXAoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwotCi1WT0lEIFJUMzB4eFJldmVyc2VSRlNsZWVwTW9kZVNldHVwKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLS8vIGVuZCBqb2hubGkKLQotCi0jaWZkZWYgUlQzMDkwCi1WT0lEIE5JQ0luaXRSVDMwOTBSRlJlZ2lzdGVycygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCk7Ci0jZW5kaWYgLy8gUlQzMDkwIC8vCi0KLVZPSUQgUlQzMHh4SGFsdEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgUlQzMHh4U2V0UnhBbnQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUNIQVIJCQlBbnQpOwotI2VuZGlmIC8vIFJUMzB4eCAvLwotI2lmZGVmIFJUMzN4eAotVk9JRCBSVDMzeHhMb2FkUkZOb3JtYWxNb2RlU2V0dXAoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwotCi1WT0lEIFJUMzN4eExvYWRSRlNsZWVwTW9kZVNldHVwKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotVk9JRCBSVDMzeHhSZXZlcnNlUkZTbGVlcE1vZGVTZXR1cCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLSNpZmRlZiBSVDMzNzAKLVZPSUQgTklDSW5pdFJUMzM3MFJGUmVnaXN0ZXJzKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKLSNlbmRpZiAvLyBSVDMwNzAgLy8KLQotI2lmZGVmIFJUMzM5MAotVk9JRCBOSUNJbml0UlQzMzkwUkZSZWdpc3RlcnMoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpOwotI2VuZGlmIC8vIFJUMzA5MCAvLwotCi1WT0lEIFJUMzN4eEhhbHRBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwotCi1WT0lEIFJUMzN4eFNldFJ4QW50KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVDSEFSCQkJQW50KTsKLQotI2VuZGlmIC8vIFJUMzN4eCAvLwotCi0KLQotVk9JRCBBc2ljRXZhbHVhdGVSeEFudCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgQXNpY1J4QW50RXZhbFRpbWVvdXQoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotVk9JRCBBUFNEUGVyaW9kaWNFeGVjKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Ci0KLUJPT0xFQU4gUlRNUENoZWNrRW50cnlFbmFibGVBdXRvUmF0ZVN3aXRjaCgKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQlJTiBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSk7Ci0KLVVDSEFSIFJUTVBTdGFGaXhlZFR4TW9kZSgKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQlJTiBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSk7Ci0KLVZPSUQgUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygKLQkJVUNIQVIJCQkJZml4ZWRfdHhfbW9kZSwKLQkJUE1BQ19UQUJMRV9FTlRSWQlwRW50cnkpOwotCi1CT09MRUFOIFJUTVBBdXRvUmF0ZVN3aXRjaENoZWNrKAotCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkKTsKLQotTkRJU19TVEFUVVMgTWxtZUluaXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIE1sbWVIYW5kbGVyKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCBNbG1lSGFsdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgTWxtZVJlc2V0UmFsaW5rQ291bnRlcnMoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIEJ1aWxkQ2hhbm5lbExpc3QoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1VQ0hBUiBGaXJzdENoYW5uZWwoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1VQ0hBUiBOZXh0Q2hhbm5lbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUNIQVIgY2hhbm5lbCk7Ci0KLVZPSUQgQ2hhbmdlVG9DZWxsUG93ZXJMaW1pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiAgICAgICAgIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCk7Ci0KLS8vCi0vLyBQcm90b3R5cGVzIG9mIGZ1bmN0aW9uIGRlZmluaXRpb24gaW4gcnRtcF90a2lwLmMKLS8vCi1WT0lEICAgIFJUTVBJbml0VGtpcEVuZ2luZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBUS2V5LAotCUlOICBVQ0hBUiAgICAgICAgICAgS2V5SWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwVEEsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwTUlDS2V5LAotCUlOICBQVUNIQVIgICAgICAgICAgcFRTQywKLQlPVVQgUFVMT05HICAgICAgICAgIHBJVjE2LAotCU9VVCBQVUxPTkcgICAgICAgICAgcElWMzIpOwotCi1WT0lEICAgIFJUTVBJbml0TUlDRW5naW5lKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcEtleSwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEQSwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBTQSwKLQlJTiAgVUNIQVIgICAgICAgICAgIFVzZXJQcmlvcml0eSwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBNSUNLZXkpOwotCi1CT09MRUFOIFJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEQSwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBTQSwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBNSUNLZXksCi0JSU4JVUNIQVIJCQlVc2VyUHJpb3JpdHksCi0JSU4gIFVJTlQgICAgICAgICAgICBMZW4pOwotCi1WT0lEICAgIFJUTVBDYWxjdWxhdGVNSUNWYWx1ZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwRW5jYXAsCi0JSU4gIFBDSVBIRVJfS0VZICAgICBwS2V5LAotCUlOCVVDSEFSCQkJYXBpZHgpOwotCi1CT09MRUFOIFJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlV2l0aExMQygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBMTEMsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAotCUlOICBQVUNIQVIgICAgICAgICAgcERBLAotCUlOICBQVUNIQVIgICAgICAgICAgcFNBLAotCUlOICBQVUNIQVIgICAgICAgICAgcE1JQ0tleSwKLQlJTiAgVUlOVCAgICAgICAgICAgIExlbik7Ci0KLVZPSUQgICAgUlRNUFRraXBBcHBlbmRCeXRlKAotCUlOICBQVEtJUF9LRVlfSU5GTyAgcFRraXAsCi0JSU4gIFVDSEFSICAgICAgICAgICB1Q2hhcik7Ci0KLVZPSUQgICAgUlRNUFRraXBBcHBlbmQoCi0JSU4gIFBUS0lQX0tFWV9JTkZPICBwVGtpcCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCi0JSU4gIFVJTlQgICAgICAgICAgICBuQnl0ZXMpOwotCi1WT0lEICAgIFJUTVBUa2lwR2V0TUlDKAotCUlOICBQVEtJUF9LRVlfSU5GTyAgcFRraXApOwotCi1CT09MRUFOIFJUTVBTb2Z0RGVjcnlwdFRLSVAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSCXBEYXRhLAotCUlOIFVMT05HCURhdGFCeXRlQ250LAotCUlOIFVDSEFSICAgIFVzZXJQcmlvcml0eSwKLQlJTiBQQ0lQSEVSX0tFWQlwV3BhS2V5KTsKLQotQk9PTEVBTiBSVE1QU29mdERlY3J5cHRBRVMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSCXBEYXRhLAotCUlOIFVMT05HCURhdGFCeXRlQ250LAotCUlOIFBDSVBIRVJfS0VZCXBXcGFLZXkpOwotCi0KLQotLy8KLS8vIFByb3RvdHlwZXMgb2YgZnVuY3Rpb24gZGVmaW5pdGlvbiBpbiBjbW1faW5mby5jCi0vLwotSU5UIFJUX0NmZ1NldENvdW50cnlSZWdpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZywKLQlJTiBJTlQJCQkJYmFuZCk7Ci0KLUlOVCBSVF9DZmdTZXRXaXJlbGVzc01vZGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBSVF9DZmdTZXRTaG9ydFNsb3QoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlSVF9DZmdTZXRXZXBLZXkoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWtleVN0cmluZywKLQlJTglDSVBIRVJfS0VZCQkqcFNoYXJlZEtleSwKLQlJTglJTlQJCQkJa2V5SWR4KTsKLQotSU5UIFJUX0NmZ1NldFdQQVBTS0tleSgKLQlJTiBSVE1QX0FEQVBURVIJKnBBZCwKLQlJTiBQU1RSSU5HCQlrZXlTdHJpbmcsCi0JSU4gVUNIQVIJCSpwSGFzaFN0ciwKLQlJTiBJTlQJCQloYXNoU3RyTGVuLAotCU9VVCBQVUNIQVIJCXBQTUtCdWYpOwotCi0KLQotLy8KLS8vIFByb3RvdHlwZXMgb2YgZnVuY3Rpb24gZGVmaW5pdGlvbiBpbiBjbW1faW5mby5jCi0vLwotTkRJU19TVEFUVVMgUlRNUFdQQVJlbW92ZUtleVByb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBWT0lEICAgICAgICAgICBwQnVmKTsKLQotVk9JRCAgICBSVE1QV1BBUmVtb3ZlQWxsS2V5cygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLUJPT0xFQU4gUlRNUENoZWNrU3RyUHJpbnRBYmxlKAotICAgIElOICBDSEFSICpwSW5QdXRTdHIsCi0gICAgSU4gIFVDSEFSIHN0ckxlbik7Ci0KLVZPSUQgICAgUlRNUFNldFBoeU1vZGUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVMT05HIHBoeW1vZGUpOwotCi1WT0lECVJUTVBVcGRhdGVIVElFKAotCUlOCVJUX0hUX0NBUEFCSUxJVFkJKnBSdEh0LAotCUlOCQlVQ0hBUgkJCQkqcE1jc1NldCwKLQlPVVQJCUhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCi0JT1VUCQlBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8pOwotCi1WT0lECVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlCc3NJZHgsCi0JSU4JVUNIQVIJCQlLZXlJZHgsCi0JSU4JVUNIQVIJCQlDaXBoZXJBbGcsCi0JSU4JTUFDX1RBQkxFX0VOVFJZICpwRW50cnkpOwotCi1QU1RSSU5HIEdldEVuY3J5cHRUeXBlKAotCUNIQVIgZW5jKTsKLQotUFNUUklORyBHZXRBdXRoTW9kZSgKLQlDSEFSIGF1dGgpOwotCi0KLVZPSUQgUlRNUEluZGljYXRlV1BBMlN0YXR1cygKLQlJTiAgUFJUTVBfQURBUFRFUiAgcEFkYXB0ZXIpOwotCi1WT0lECVJUTVBPUE1vZGVTd2l0Y2hpbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOwotCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLVZPSUQJUlRNUFNldEhUKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU9JRF9TRVRfSFRfUEhZTU9ERSAqcEhUUGh5TW9kZSk7Ci0KLVZPSUQJUlRNUFNldEluZGl2aWR1YWxIVCgKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JVUNIQVIJCQkJYXBpZHgpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1WT0lEIFJUTVBTZW5kV2lyZWxlc3NFdmVudCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQJCQlFdmVudF9mbGFnLAotCUlOCVBVQ0hBUgkJCXBBZGRyLAotCUlOICBVQ0hBUgkJCUJzc0lkeCwKLQlJTglDSEFSCQkJUnNzaSk7Ci0KLVZPSUQJTklDVXBkYXRlQ250bENvdW50ZXJzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBIRUFERVJfODAyXzExCXBIZWFkZXIsCi0JSU4gICAgVUNIQVIJCQlTdWJUeXBlLAotCUlOCVBSWFdJX1NUUlVDCXBSeFdJKTsKLQotVk9JRCAgICBEQkdQUklOVF9UWF9SSU5HKAotCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKLQlJTiBVQ0hBUiAgICAgICAgICBRdWVJZHgpOwotCi1WT0lEIERCR1BSSU5UX1JYX1JJTkcoCi0JSU4gUFJUTVBfQURBUFRFUiAgcEFkKTsKLQotQ0hBUiAgICBDb252ZXJ0VG9Sc3NpKAotCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKLQlJTiBDSEFSCQkJCVJzc2ksCi0JSU4gVUNIQVIgICAgUnNzaU51bWJlcik7Ci0KLQotI2lmZGVmIERPVDExTl9EUkFGVDMKLVZPSUQgQnVpbGRFZmZlY3RlZENoYW5uZWxMaXN0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0KLQotVk9JRCBBUEFzaWNFdmFsdWF0ZVJ4QW50KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotI2lmZGVmIEFOVF9ESVZFUlNJVFlfU1VQUE9SVAotVk9JRAlBUEFzaWNBbnRlbm5hQXZnKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCSAgICAgICAgICAgICAgQW50U2VsZWN0LAotCUlOCVNIT1JUCSAgICAgICAgICAgICAgKlJzc2lBdmcpOwotI2VuZGlmIC8vIEFOVF9ESVZFUlNJVFlfU1VQUE9SVCAvLwotCi1WT0lEIEFQQXNpY1J4QW50RXZhbFRpbWVvdXQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRnVuY3Rpb24gcHJvdG90eXBlIGluIGNtbV93cGEuYwotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotVk9JRAlSVE1QVG9XaXJlbGVzc1N0YSgKLSAgICBJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAotICAgIElOICBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSwKLSAgICBJTiAgUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAotICAgIElOICBVSU5UCQkJSGRyTGVuLAotICAgIElOICBQVUNIQVIJCQlwRGF0YSwKLSAgICBJTiAgVUlOVAkJCURhdGFMZW4sCi0gICAgSU4JQk9PTEVBTgkJCQliQ2xlYXJGcmFtZSk7Ci0KLVZPSUQgV3BhRGVyaXZlUFRLKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUiAgICpQTUssCi0JSU4gIFVDSEFSICAgKkFOb25jZSwKLQlJTiAgVUNIQVIgICAqQUEsCi0JSU4gIFVDSEFSICAgKlNOb25jZSwKLQlJTiAgVUNIQVIgICAqU0EsCi0JT1VUIFVDSEFSICAgKm91dHB1dCwKLQlJTiAgVUlOVCAgICBsZW4pOwotCi1WT0lEICAgIEdlblJhbmRvbSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTglVQ0hBUgkJCSptYWNBZGRyLAotCU9VVAlVQ0hBUgkJCSpyYW5kb20pOwotCi1CT09MRUFOIFJUTVBDaGVja1dQQWZyYW1lKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5LAotCUlOIFBVQ0hBUgkJCXBEYXRhLAotCUlOIFVMT05HCQkJRGF0YUJ5dGVDb3VudCwKLQlJTiBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKLQotVk9JRCBBRVNfR1RLX0tFWV9VTldSQVAoCi0JSU4gIFVDSEFSICAgKmtleSwKLQlPVVQgVUNIQVIgICAqcGxhaW50ZXh0LAotCUlOCVVJTlQzMgljX2xlbiwKLQlJTiAgVUNIQVIgICAqY2lwaGVydGV4dCk7Ci0KLUJPT0xFQU4gUlRNUFBhcnNlRWFwb2xLZXlEYXRhKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcEtleURhdGEsCi0JSU4gIFVDSEFSICAgICAgICAgICBLZXlEYXRhTGVuLAotCUlOCVVDSEFSCQkJR3JvdXBLZXlJbmRleCwKLQlJTglVQ0hBUgkJCU1zZ1R5cGUsCi0JSU4JQk9PTEVBTgkJCWJXUEEyLAotCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSk7Ci0KLVZPSUQJQ29uc3RydWN0RWFwb2xNc2coCi0JSU4JUE1BQ19UQUJMRV9FTlRSWQlwRW50cnksCi0gICAgSU4JVUNIQVIJCQkJR3JvdXBLZXlXZXBTdGF0dXMsCi0gICAgSU4JVUNIQVIJCQkJTXNnVHlwZSwKLSAgICBJTglVQ0hBUgkJCQlEZWZhdWx0S2V5SWR4LAotCUlOCVVDSEFSCQkJCSpLZXlOb25jZSwKLQlJTglVQ0hBUgkJCQkqVHhSU0MsCi0JSU4JVUNIQVIJCQkJKkdUSywKLQlJTglVQ0hBUgkJCQkqUlNOSUUsCi0JSU4JVUNIQVIJCQkJUlNOSUVfTGVuLAotICAgIE9VVCBQRUFQT0xfUEFDS0VUICAgICAgIHBNc2cpOwotCi1ORElTX1NUQVRVUwlSVE1QU29mdERlY3J5cHRCcm9hZENhc3REYXRhKAotCUlOCVBSVE1QX0FEQVBURVIJCQkJCXBBZCwKLQlJTglSWF9CTEsJCQkJCQkJKnBSeEJsaywKLQlJTiAgTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJR3JvdXBDaXBoZXIsCi0JSU4gIFBDSVBIRVJfS0VZCQkJCQkJcFNoYXJkX2tleSk7Ci0KLVZPSUQgUlRNUE1ha2VSU05JRSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUlOVCAgICAgICAgICAgIEF1dGhNb2RlLAotCUlOICBVSU5UICAgICAgICAgICAgV2VwU3RhdHVzLAotCUlOCVVDSEFSCQkJYXBpZHgpOwotCi0vLwotLy8gZnVuY3Rpb24gcHJvdG90eXBlIGluIGFwX3dwYS5jCi0vLwotVk9JRCBSVE1QR2V0VHhUc2NGcm9tQXNpYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTglVQ0hBUgkJCWFwaWR4LAotCU9VVAlQVUNIQVIJCQlwVHhUc2MpOwotCi1WT0lEIEFQSW5zdGFsbFBhaXJ3aXNlS2V5KAotCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSk7Ci0KLU1BQ19UQUJMRV9FTlRSWSAqUEFDSW5xdWlyeSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUxPTkcgICAgICAgICAgIFdjaWQpOwotCi1VSU5UCUFQVmFsaWRhdGVSU05JRSgKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQlJTiBQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSwKLQlJTiBQVUNIQVIJCQlwUnNuSWUsCi0JSU4gVUNIQVIJCQlyc25pZV9sZW4pOwotCi1WT0lEIEhhbmRsZUNvdW50ZXJNZWFzdXJlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSk7Ci0KLVZPSUQgV1BBU3RhcnQ0V2F5SFMoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5LAotCUlOCVVMT05HCQkJVGltZUludGVydmFsKTsKLQotVk9JRCBXUEFTdGFydDJXYXlHcm91cEhTKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSk7Ci0KLVZPSUQgUGVlclBhaXJNc2cxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIFBlZXJQYWlyTXNnMkFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBQZWVyUGFpck1zZzNBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgUGVlclBhaXJNc2c0QWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIFBlZXJHcm91cE1zZzFBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCUlOICBQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSwKLSAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7Ci0KLVZPSUQgUGVlckdyb3VwTXNnMkFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JSU4gIFBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5LAotCUlOICBWT0lEICAgICAgICAgICAgICpNc2csCi0JSU4gIFVJTlQgICAgICAgICAgICAgTXNnTGVuKTsKLQotVk9JRCBDTVRpbWVyRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi1WT0lEIFdQQVJldHJ5RXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi1WT0lEIEVucXVldWVTdGFydEZvclBTS0V4ZWMoCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotVk9JRCBSVE1QSGFuZGxlU1RBS2V5KAotICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkYXB0ZXIsCi0gICAgSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOwotCi1WT0lEIFBhaXJEaXNBc3NvY0FjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JSU4gIFBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5LAotCUlOICBVU0hPUlQgICAgICAgICAgIFJlYXNvbik7Ci0KLVZPSUQgTWxtZURlQXV0aEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JSU4gIFBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5LAotCUlOICBVU0hPUlQgICAgICAgICAgIFJlYXNvbik7Ci0KLVZPSUQgR1JFS0VZUGVyaW9kaWNFeGVjKAotCUlOICBQVk9JRCAgIFN5c3RlbVNwZWNpZmljMSwKLQlJTiAgUFZPSUQgICBGdW5jdGlvbkNvbnRleHQsCi0JSU4gIFBWT0lEICAgU3lzdGVtU3BlY2lmaWMyLAotCUlOICBQVk9JRCAgIFN5c3RlbVNwZWNpZmljMyk7Ci0KLVZPSUQgV3BhRGVyaXZlR1RLKAotCUlOICBVQ0hBUiAgICpQTUssCi0JSU4gIFVDSEFSICAgKkdOb25jZSwKLQlJTiAgVUNIQVIgICAqQUEsCi0JT1VUIFVDSEFSICAgKm91dHB1dCwKLQlJTiAgVUlOVCAgICBsZW4pOwotCi1WT0lEIEFFU19HVEtfS0VZX1dSQVAoCi0JSU4gVUNIQVIgKmtleSwKLQlJTiBVQ0hBUiAqcGxhaW50ZXh0LAotCUlOIFVJTlQzMiBwX2xlbiwKLQlPVVQgVUNIQVIgKmNpcGhlcnRleHQpOwotCi1WT0lEIEFFU18xMjhfQ01BQygKLQlJTglQVUNIQVIJa2V5LAotCUlOCVBVQ0hBUglpbnB1dCwKLQlJTglJTlQJCWxlbiwKLQlPVVQJUFVDSEFSCW1hYyk7Ci0KLVZPSUQgICAgV3BhU2VuZCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQVUNIQVIgICAgICAgICAgcFBhY2tldCwKLSAgICBJTiAgVUxPTkcgICAgICAgICAgIExlbik7Ci0KLVZPSUQgUlRNUEFkZFBNS0lEQ2FjaGUoCi0JSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglJTlQJCQkJCQlhcGlkeCwKLQlJTglQVUNIQVIJCQkJcEFkZHIsCi0JSU4JVUNIQVIJCQkJCSpQTUtJRCwKLQlJTglVQ0hBUgkJCQkJKlBNSyk7Ci0KLUlOVCBSVE1QU2VhcmNoUE1LSURDYWNoZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTglJTlQJCQkJYXBpZHgsCi0JSU4JUFVDSEFSCQlwQWRkcik7Ci0KLVZPSUQgUlRNUERlbGV0ZVBNS0lEQ2FjaGUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4JSU5UCQkJCWFwaWR4LAotCUlOICBJTlQJCQkJaWR4KTsKLQotVk9JRCBSVE1QTWFpbnRhaW5QTUtJRENhY2hlKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRAlSVE1QU2VuZFRyaWdnZXJGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVk9JRAkJCXBCdWZmZXIsCi0JSU4JVUxPTkcJCQlMZW5ndGgsCi0JSU4gIFVDSEFSICAgICAgICAgICBUeFJhdGUsCi0JSU4JQk9PTEVBTgkJCWJRb3NOdWxsKTsKLQotLy90eXBlZGVmIHZvaWQgKCpUSU1FUl9GVU5DVElPTikodW5zaWduZWQgbG9uZyk7Ci0KLQotLyogdGltZW91dCAtLSBtcyAqLwotVk9JRCBSVE1QX1NldFBlcmlvZGljVGltZXIoCi0JSU4JTkRJU19NSU5JUE9SVF9USU1FUiAqcFRpbWVyLAotCUlOCXVuc2lnbmVkIGxvbmcgdGltZW91dCk7Ci0KLVZPSUQgUlRNUF9PU19Jbml0X1RpbWVyKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIgKnBUaW1lciwKLQlJTglUSU1FUl9GVU5DVElPTiBmdW5jdGlvbiwKLQlJTglQVk9JRCBkYXRhKTsKLQotVk9JRCBSVE1QX09TX0FkZF9UaW1lcigKLQlJTglORElTX01JTklQT1JUX1RJTUVSCSpwVGltZXIsCi0JSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKLQotVk9JRCBSVE1QX09TX01vZF9UaW1lcigKLQlJTglORElTX01JTklQT1JUX1RJTUVSCSpwVGltZXIsCi0JSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKLQotCi1WT0lEIFJUTVBfT1NfRGVsX1RpbWVyKAotCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJKnBUaW1lciwKLQlPVVQJQk9PTEVBTgkJCQkgKnBDYW5jZWxsZWQpOwotCi0KLVZPSUQgUlRNUF9PU19SZWxlYXNlX1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglQUVVFVUVfRU5UUlkgIHBFbnRyeSk7Ci0KLVZPSUQgUlRNUHVzZWNEZWxheSgKLQlJTglVTE9ORwl1c2VjKTsKLQotTkRJU19TVEFUVVMgb3NfYWxsb2NfbWVtKAotCUlOCVJUTVBfQURBUFRFUiAqcEFkLAotCU9VVAlVQ0hBUiAqKm1lbSwKLQlJTglVTE9ORyAgc2l6ZSk7Ci0KLU5ESVNfU1RBVFVTIG9zX2ZyZWVfbWVtKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVBWT0lEIG1lbSk7Ci0KLQotdm9pZCBSVE1QX0FsbG9jYXRlU2hhcmVkTWVtb3J5KAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAotCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7Ci0KLVZPSUQgUlRNUEZyZWVUeFJ4UmluZ01lbW9yeSgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLU5ESVNfU1RBVFVTIEFkYXB0ZXJCbG9ja0FsbG9jYXRlTWVtb3J5KAotCUlOIFBWT0lECWhhbmRsZSwKLQlPVVQJUFZPSUQJKnBwQWQpOwotCi12b2lkIFJUTVBfQWxsb2NhdGVUeERlc2NNZW1vcnkoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUlOVAlJbmRleCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JQk9PTEVBTglDYWNoZWQsCi0JT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKLQlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOwotCi12b2lkIFJUTVBfQWxsb2NhdGVGaXJzdFR4QnVmZmVyKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVJTlQJSW5kZXgsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCi0JT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKLQotdm9pZCBSVE1QX0ZyZWVGaXJzdFR4QnVmZmVyKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlJTglQVk9JRAlWaXJ0dWFsQWRkcmVzcywKLQlJTglORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKLQotdm9pZCBSVE1QX0FsbG9jYXRlTWdtdERlc2NNZW1vcnkoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCi0JT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKLQotdm9pZCBSVE1QX0FsbG9jYXRlUnhEZXNjTWVtb3J5KAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAotCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7Ci0KLXZvaWQgUlRNUF9GcmVlRGVzY01lbW9yeSgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JUFZPSUQJVmlydHVhbEFkZHJlc3MsCi0JSU4JTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7Ci0KLVBORElTX1BBQ0tFVCBSdG1wT1NOZXRQa3RBbGxvYygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBpbnQgc2l6ZSk7Ci0KLVBORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCi0JT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKLQotUE5ESVNfUEFDS0VUIFJUTVBfQWxsb2NhdGVUeFBhY2tldEJ1ZmZlcigKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JQk9PTEVBTglDYWNoZWQsCi0JT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcyk7Ci0KLVBORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlRnJhZ1BhY2tldEJ1ZmZlcigKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORwlMZW5ndGgpOwotCi12b2lkIFJUTVBfUXVlcnlQYWNrZXRJbmZvKAotCUlOICBQTkRJU19QQUNLRVQgcFBhY2tldCwKLQlPVVQgUEFDS0VUX0lORk8gICpwUGFja2V0SW5mbywKLQlPVVQgUFVDSEFSCQkgKnBTcmNCdWZWQSwKLQlPVVQJVUlOVAkJICpwU3JjQnVmTGVuKTsKLQotdm9pZCBSVE1QX1F1ZXJ5TmV4dFBhY2tldEluZm8oCi0JSU4gIFBORElTX1BBQ0tFVCAqcHBQYWNrZXQsCi0JT1VUIFBBQ0tFVF9JTkZPICAqcFBhY2tldEluZm8sCi0JT1VUIFBVQ0hBUgkJICpwU3JjQnVmVkEsCi0JT1VUCVVJTlQJCSAqcFNyY0J1Zkxlbik7Ci0KLQotQk9PTEVBTiBSVE1QX0ZpbGxUeEJsa0luZm8oCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gVFhfQkxLICpwVHhCbGspOwotCi0KLVBSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QKLXJ0X2dldF9zZ19saXN0X2Zyb21fcGFja2V0KFBORElTX1BBQ0tFVCBwUGFja2V0LCBSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QgKnNnKTsKLQotCi0gdm9pZCBhbm5vdW5jZV84MDJfM19wYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpOwotCi0KLVVJTlQgQkFfUmVvcmRlcl9BTVNEVV9Bbm5ub3VuY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpOwotCi0KLVVJTlQgSGFuZGxlX0FNU0RVX1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVTE9ORwkJCURhdGFTaXplLAotCUlOICBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKLQotCi12b2lkIGNvbnZlcnRfODAyXzExX3RvXzgwMl8zX3BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKLQlJTglQVUNIQVIJCQlwODAyM2hkciwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVTE9ORwkJCURhdGFTaXplLAotCUlOICBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKLQotCi1QTkVUX0RFViBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLQotUE5ESVNfUEFDS0VUIGR1cGxpY2F0ZV9wa3QoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAotICAgIElOICBVSU5UICAgICAgICAgICAgSGRyTGVuLAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVMT05HCQkJRGF0YVNpemUsCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLQotUE5ESVNfUEFDS0VUIGR1cGxpY2F0ZV9wa3Rfd2l0aF9US0lQX01JQygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcE9sZFBrdCk7Ci0KLVBORElTX1BBQ0tFVCBkdXBsaWNhdGVfcGt0X3dpdGhfVkxBTigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCi0gICAgSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4JVUxPTkcJCQlEYXRhU2l6ZSwKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKLQotCi1VQ0hBUiBWTEFOXzgwMjNfSGVhZGVyX0NvcHkoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAotCUlOCVVJTlQgICAgICAgICAgICBIZHJMZW4sCi0JT1VUIFBVQ0hBUgkJCXBEYXRhLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi12b2lkIGJhX2ZsdXNoX3Jlb3JkZXJpbmdfdGltZW91dF9tcGR1cygKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBQQkFfUkVDX0VOVFJZCXBCQUVudHJ5LAotCUlOIFVMT05HCQkJTm93MzIpOwotCi0KLVZPSUQgQkFPcmlTZXNzaW9uU2V0VXAoCi0JCQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQkJCUlOIE1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAotCQkJSU4gVUNIQVIJCQlUSUQsCi0JCQlJTiBVU0hPUlQJCQlUaW1lT3V0LAotCQkJSU4gVUxPTkcJCQlEZWxheVRpbWUsCi0JCQlJTiBCT09MRUFOCQlpc0ZvcmNlZCk7Ci0KLVZPSUQgQkFTZXNzaW9uVGVhckRvd25BTEwoCi0JSU4gT1VUCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCQlVQ0hBUiBXY2lkKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotQk9PTEVBTiBPU19OZWVkX0Nsb25lX1BhY2tldCh2b2lkKTsKLQotCi1WT0lEIGJ1aWxkX3R4X3BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKLQlJTglQVUNIQVIJcEZyYW1lLAotCUlOCVVMT05HCUZyYW1lTGVuKTsKLQotCi1WT0lEIEJBT3JpU2Vzc2lvblRlYXJEb3duKAotCUlOIE9VVAlQUlRNUF9BREFQVEVSCXBBZCwKLQlJTgkJVUNIQVIJCQlXY2lkLAotCUlOCQlVQ0hBUgkJCVRJRCwKLQlJTgkJQk9PTEVBTgkJCWJQYXNzaXZlLAotCUlOCQlCT09MRUFOCQkJYkZvcmNlU2VuZCk7Ci0KLVZPSUQgQkFSZWNTZXNzaW9uVGVhckRvd24oCi0JSU4gT1VUCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCQlVQ0hBUgkJCVdjaWQsCi0JSU4JCVVDSEFSCQkJVElELAotCUlOCQlCT09MRUFOCQkJYlBhc3NpdmUpOwotCi1CT09MRUFOIGJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfaW5pdChQUlRNUF9BREFQVEVSIHBBZCwgaW50IG51bSk7Ci12b2lkIGJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfcmVsZWFzZShQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLQotCi0jaWZkZWYgTklOVEVORE9fQVAKLVZPSUQJSW5pdE5JTlRFTkRPX1RBQkxFKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVUNIQVIJQ2hlY2tOSU5URU5ET19UQUJMRSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlQQ0hBUiBwRFNfU3NpZCwKLQlVQ0hBUiBEU19Tc2lkTGVuLAotCVBVQ0hBUiBwRFNfQWRkcik7Ci0KLVVDSEFSCURlbE5JTlRFTkRPX0VOVFJZKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCVVDSEFSICogcERTX0FkZHIpOwotCi1WT0lECVJUTVBJb2N0bE5pbnRlbmRvQ2FwYWJsZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSk7Ci0KLVZPSUQJUlRNUElvY3RsTmludGVuZG9HZXRUYWJsZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSk7Ci0KLVZPSUQJUlRNUElvY3RsTmludGVuZG9TZXRUYWJsZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSk7Ci0KLSNlbmRpZiAvLyBOSU5URU5ET19BUCAvLwotCi1CT09MRUFOIHJ0c3RybWFjdG9oZXgoCi0JSU4gUFNUUklORyBzMSwKLQlJTiBQU1RSSU5HIHMyKTsKLQotQk9PTEVBTiBydHN0cmNhc2VjbXAoCi0JSU4gUFNUUklORyBzMSwKLQlJTiBQU1RSSU5HIHMyKTsKLQotUFNUUklORyBydHN0cnN0cnVuY2FzZWNtcCgKLQlJTiBQU1RSSU5HIHMxLAotCUlOIFBTVFJJTkcgczIpOwotCi1QU1RSSU5HIHJ0c3Ryc3RyKAotCUlOCWNvbnN0IFBTVFJJTkcgczEsCi0JSU4JY29uc3QgUFNUUklORyBzMik7Ci0KLVBTVFJJTkcgcnN0cnRvaygKLQlJTiBQU1RSSU5HIHMsCi0JSU4gY29uc3QgUFNUUklORyBjdCk7Ci0KLWludCBydGluZXRfYXRvbigKLQljb25zdCBQU1RSSU5HIGNwLAotCXVuc2lnbmVkIGludCAqYWRkcik7Ci0KLS8vLy8vLy8vLy8gY29tbW9uIGlvY3RsIGZ1bmN0aW9ucyAvLy8vLy8vLy8vCi1JTlQgU2V0X0RyaXZlclZlcnNpb25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9Db3VudHJ5UmVnaW9uX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBTZXRfV2lyZWxlc3NNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBTZXRfQ2hhbm5lbF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X1Nob3J0U2xvdF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X1R4UG93ZXJfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9CR1Byb3RlY3Rpb25fUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOICBQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9UeFByZWFtYmxlX1Byb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiAgUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBTZXRfUlRTVGhyZXNob2xkX1Byb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiAgUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBTZXRfRnJhZ1RocmVzaG9sZF9Qcm9jKAotCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gIFBTVFJJTkcJCQlhcmcpOwotCi1JTlQgU2V0X1R4QnVyc3RfUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOICBQU1RSSU5HCQkJYXJnKTsKLQotI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKLUlOVAlTZXRfUGt0QWdncmVnYXRlX1Byb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiAgUFNUUklORwkJCWFyZyk7Ci0jZW5kaWYgLy8gQUdHUkVHQVRJT05fU1VQUE9SVCAvLwotCi0jaWZkZWYgSU5GX0FNQVpPTl9QUEEKLUlOVAlTZXRfSU5GX0FNQVpPTl9TRV9QUEFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi0jZW5kaWYgLy8gSU5GX0FNQVpPTl9QUEEgLy8KLQotSU5UCVNldF9JRUVFODAyMTFIX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLSNpZmRlZiBEQkcKLUlOVAlTZXRfRGVidWdfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLSNlbmRpZgotCi1JTlQJU2hvd19EZXNjSW5mb19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X1Jlc2V0U3RhdENvdW50ZXJfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotSU5UCVNldF9CQVNldHVwX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfQkFEZWNsaW5lX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfQkFPcmlUZWFyRG93bl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0JBUmVjVGVhckRvd25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9IdEJ3X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRNY3NfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9IdEdpX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRPcE1vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9IdFN0YmNfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9IdEh0Y19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0h0RXh0Y2hhX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRNcGR1RGVuc2l0eV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0h0QmFXaW5TaXplX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRSZGdfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9IdExpbmtBZGFwdF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0h0QW1zZHVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9IdEF1dG9CYV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0h0UHJvdGVjdF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0h0TWltb1BzX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLQotSU5UCVNldF9Gb3JjZVNob3J0R0lfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9Gb3JjZUdGX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRDb21tb25IVCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLUlOVAlTZXRfU2VuZFBTTVBBY3Rpb25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9IdE1JTU9QU21vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotCi1JTlQJU2V0X0h0VHhCQVNpemVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9IdERpc2FsbG93VEtJUF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0vL0RscyAsCWthdGh5Ci1WT0lEIFJUTVBTZW5kRExTVGVhckRvd25GcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwREEpOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0vL0Jsb2NrIEFDSwotVk9JRCBRdWVyeUJBVEFCTEUoCi0JSU4gIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQUVVFUllCQV9UQUJMRSBwQkFUKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLUlOVAkgICAgV3BhQ2hlY2tFYXBDb2RlKAotCUlOICBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiAgUFVDSEFSCQkJCXBGcmFtZSwKLQlJTiAgVVNIT1JUCQkJCUZyYW1lTGVuLAotCUlOICBVU0hPUlQJCQkJT2ZmU2V0KTsKLQotVk9JRCAgICBXcGFTZW5kTWljRmFpbHVyZVRvV3BhU3VwcGxpY2FudCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCi0gICAgSU4gIEJPT0xFQU4gICAgICAgICAgICAgYlVuaWNhc3QpOwotCi1WT0lEICAgIFNlbmRBc3NvY0lFc1RvV3BhU3VwcGxpY2FudCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQpOwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQotI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi1pbnQgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MoCi0JSU4gIFJUTVBfQURBUFRFUiAqcEFkKTsKLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi1WT0lEIEhhbmRsZV9CU1NfV2lkdGhfVHJpZ2dlcl9FdmVudHMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi12b2lkIGJ1aWxkX2V4dF9jaGFubmVsX3N3aXRjaF9pZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBIVF9FWFRfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UX0lFICpwSUUpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0KLUJPT0xFQU4gQVBSeERvbmVJbnRlcnJ1cHRIYW5kbGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOwotCi1CT09MRUFOIFNUQVJ4RG9uZUludGVycnVwdEhhbmRsZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglCT09MRUFOCQkJYXJnYyk7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLS8vIEFNUERVIHBhY2tldCBpbmRpY2F0aW9uCi1WT0lEIEluZGljYXRlX0FNUERVX1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotCi0vLyBBTVNEVSBwYWNrZXQgaW5kaWNhdGlvbgotVk9JRCBJbmRpY2F0ZV9BTVNEVV9QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotLy8gTm9ybWFsIGxlZ2FjeSBSeCBwYWNrZXQgaW5kaWNhdGlvbgotVk9JRCBJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLVZPSUQgSW5kaWNhdGVfRUFQT0xfUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLXZvaWQgIHVwZGF0ZV9vc19wYWNrZXRfaW5mbygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotCi12b2lkIHdsYW5fODAyXzExX3RvXzgwMl8zX3BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKLQlJTiAgVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLVVJTlQgZGVhZ2dyZWdhdGVfQU1TRFVfYW5ub3VuY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JUE5ESVNfUEFDS0VUCQlwUGFja2V0LAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVMT05HCQkJRGF0YVNpemUpOwotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLS8vIHJlbW92ZSBMTEMgYW5kIGdldCA4MDJfMyBIZWFkZXIKLSNkZWZpbmUgIFJUTVBfODAyXzExX1JFTU9WRV9MTENfQU5EX0NPTlZFUlRfVE9fODAyXzMoX3BSeEJsaywgX3BIZWFkZXI4MDJfMykJXAotewkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCVBVQ0hBUiBfcFJlbW92ZWRMTENTTkFQID0gTlVMTCwgX3BEQSwgX3BTQTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBmUlhfTUVTSCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCV9wREEgPSBfcFJ4QmxrLT5wSGVhZGVyLT5BZGRyMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJX3BTQSA9IChQVUNIQVIpX3BSeEJsay0+cEhlYWRlciArIHNpemVvZihIRUFERVJfODAyXzExKTsgICAgICAgICAgICAgICAgXAotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBmUlhfSU5GUkEpKQkJCQlcCi0JCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCV9wREEgPSBfcFJ4QmxrLT5wSGVhZGVyLT5BZGRyMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBmUlhfRExTKSkJCQkJCQkJCQlcCi0JCQlfcFNBID0gX3BSeEJsay0+cEhlYWRlci0+QWRkcjI7CQkJCQkJCQkJCVwKLQkJZWxzZQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJX3BTQSA9IF9wUnhCbGstPnBIZWFkZXItPkFkZHIzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlfcERBID0gX3BSeEJsay0+cEhlYWRlci0+QWRkcjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCV9wU0EgPSBfcFJ4QmxrLT5wSGVhZGVyLT5BZGRyMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCUNPTlZFUlRfVE9fODAyXzMoX3BIZWFkZXI4MDJfMywgX3BEQSwgX3BTQSwgX3BSeEJsay0+cERhdGEsCQkJCVwKLQkJX3BSeEJsay0+RGF0YVNpemUsIF9wUmVtb3ZlZExMQ1NOQVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLUJPT0xFQU4gQVBGb3dhcmRXaXJlbGVzc1N0YVRvV2lyZWxlc3NTdGEoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCi0JSU4JVUxPTkcJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLVZPSUQgQW5ub3VuY2Vfb3JfRm9yd2FyZF84MDJfM19QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLVZPSUQgU3RhX0Fubm91bmNlX29yX0ZvcndhcmRfODAyXzNfUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNkZWZpbmUgQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQoX3BBZCwgX3BQYWNrZXQsIF9Gcm9tV2hpY2hCU1MpXAotCQkJU3RhX0Fubm91bmNlX29yX0ZvcndhcmRfODAyXzNfUGFja2V0KF9wQWQsIF9wUGFja2V0LCBfRnJvbVdoaWNoQlNTKTsKLQkJCS8vYW5ub3VuY2VfODAyXzNfcGFja2V0KF9wQWQsIF9wUGFja2V0KTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi1QTkRJU19QQUNLRVQgRHVwbGljYXRlUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotCi0KLVBORElTX1BBQ0tFVCBDbG9uZVBhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVTE9ORwkJCURhdGFTaXplKTsKLQotCi0vLyBOb3JtYWwsIEFNUERVIG9yIEFNU0RVCi1WT0lEIENtbVJ4bm9uUmFsaW5rRnJhbWVJbmRpY2F0ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotCi1WT0lEIENtbVJ4UmFsaW5rRnJhbWVJbmRpY2F0ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotCi1WT0lEIFVwZGF0ZV9Sc3NpX1NhbXBsZSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBSU1NJX1NBTVBMRQkJKnBSc3NpLAotCUlOIFBSWFdJX1NUUlVDCQlwUnhXSSk7Ci0KLVBORElTX1BBQ0tFVCBHZXRQYWNrZXRGcm9tUnhSaW5nKAotCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJCVBSVDI4WFhfUlhEX1NUUlVDCQlwU2F2ZVJ4RCwKLQlPVVQJCUJPT0xFQU4JCQkqcGJSZXNjaGVkdWxlLAotCUlOIE9VVAlVSU5UMzIJCQkqcFJ4UGVuZGluZyk7Ci0KLVBORElTX1BBQ0tFVCBSVE1QRGVGcmFnbWVudERhdGFGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrKTsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1WT0lEIFJUTVBJb2N0bEdldFNpdGVTdXJ2ZXkoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSk7Ci0KLQotCi0KLQotI2lmZGVmIFNOTVBfU1VQUE9SVAotLy9mb3Igc25tcCAsIGthdGh5Ci10eXBlZGVmIHN0cnVjdCBfRGVmYXVsdEtleUlkeFZhbHVlCi17Ci0JVUNIQVIJS2V5SWR4OwotCVVDSEFSCVZhbHVlWzE2XTsKLX0gRGVmYXVsdEtleUlkeFZhbHVlLCAqUERlZmF1bHRLZXlJZHhWYWx1ZTsKLSNlbmRpZgotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLWVudW0gewotCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm0JCT0gMHgwMDAwMDA0NCwKLQlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2hvc3R0aW1lCT0gMHgwMDAxMDA0NCwKLQlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX21hY3RpbWUJPSAweDAwMDIwMDQ0LAotCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fY2hhbm5lbAk9IDB4MDAwMzAwNDQsCi0JRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yc3NpCQk9IDB4MDAwNDAwNDQsCi0JRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zcQkJPSAweDAwMDUwMDQ0LAotCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fc2lnbmFsCT0gMHgwMDA2MDA0NCwKLQlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX25vaXNlCQk9IDB4MDAwNzAwNDQsCi0JRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yYXRlCQk9IDB4MDAwODAwNDQsCi0JRElEbXNnX2xueGluZF93bGFuc25pZmZybV9pc3R4CQk9IDB4MDAwOTAwNDQsCi0JRElEbXNnX2xueGluZF93bGFuc25pZmZybV9mcm1sZW4JPSAweDAwMEEwMDQ0Ci19OwotZW51bSB7Ci0JUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19ub192YWx1ZQk9IDB4MDAKLX07Ci1lbnVtIHsKLQlQODAyMTFFTlVNX3RydXRoX2ZhbHNlCQkJPSAweDAwLAotCVA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZQkJCT0gMHgwMQotfTsKLQotLyogRGVmaW5pdGlvbiBmcm9tIG1hZHdpZmkgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgVUlOVDMyIGRpZDsKLSAgICAgICAgVUlOVDE2IHN0YXR1czsKLSAgICAgICAgVUlOVDE2IGxlbjsKLSAgICAgICAgVUlOVDMyIGRhdGE7Ci19IHA4MDIxMWl0ZW1fdWludDMyX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgVUlOVDMyIG1zZ2NvZGU7Ci0gICAgICAgIFVJTlQzMiBtc2dsZW47Ci0jZGVmaW5lIFdMQU5fREVWTkFNRUxFTl9NQVggMTYKLSAgICAgICAgVUlOVDggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKLSAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBob3N0dGltZTsKLSAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBtYWN0aW1lOwotICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IGNoYW5uZWw7Ci0gICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgcnNzaTsKLSAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBzcTsKLSAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBzaWduYWw7Ci0gICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3Qgbm9pc2U7Ci0gICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgcmF0ZTsKLSAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBpc3R4OwotICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IGZybWxlbjsKLX0gd2xhbl9uZ19wcmlzbTJfaGVhZGVyOwotCi0vKiBUaGUgcmFkaW8gY2FwdHVyZSBoZWFkZXIgcHJlY2VkZXMgdGhlIDgwMi4xMSBoZWFkZXIuICovCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX2llZWU4MDIxMV9yYWRpb3RhcF9oZWFkZXIgewotICAgIFVJTlQ4CWl0X3ZlcnNpb247CS8qIFZlcnNpb24gMC4gT25seSBpbmNyZWFzZXMKLQkJCQkgKiBmb3IgZHJhc3RpYyBjaGFuZ2VzLAotCQkJCSAqIGludHJvZHVjdGlvbiBvZiBjb21wYXRpYmxlCi0JCQkJICogbmV3IGZpZWxkcyBkb2VzIG5vdCBjb3VudC4KLQkJCQkgKi8KLSAgICBVSU5UOAlpdF9wYWQ7Ci0gICAgVUlOVDE2ICAgICBpdF9sZW47ICAgICAgICAgLyogbGVuZ3RoIG9mIHRoZSB3aG9sZQotCQkJCSAqIGhlYWRlciBpbiBieXRlcywgaW5jbHVkaW5nCi0JCQkJICogaXRfdmVyc2lvbiwgaXRfcGFkLAotCQkJCSAqIGl0X2xlbiwgYW5kIGRhdGEgZmllbGRzLgotCQkJCSAqLwotICAgIFVJTlQzMiAgIGl0X3ByZXNlbnQ7CS8qIEEgYml0bWFwIHRlbGxpbmcgd2hpY2gKLQkJCQkJICogZmllbGRzIGFyZSBwcmVzZW50LiBTZXQgYml0IDMxCi0JCQkJCSAqICgweDgwMDAwMDAwKSB0byBleHRlbmQgdGhlCi0JCQkJCSAqIGJpdG1hcCBieSBhbm90aGVyIDMyIGJpdHMuCi0JCQkJCSAqIEFkZGl0aW9uYWwgZXh0ZW5zaW9ucyBhcmUgbWFkZQotCQkJCQkgKiBieSBzZXR0aW5nIGJpdCAzMS4KLQkJCQkJICovCi19aWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciA7Ci0KLWVudW0gaWVlZTgwMjExX3JhZGlvdGFwX3R5cGUgewotICAgIElFRUU4MDIxMV9SQURJT1RBUF9UU0ZUID0gMCwKLSAgICBJRUVFODAyMTFfUkFESU9UQVBfRkxBR1MgPSAxLAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9SQVRFID0gMiwKLSAgICBJRUVFODAyMTFfUkFESU9UQVBfQ0hBTk5FTCA9IDMsCi0gICAgSUVFRTgwMjExX1JBRElPVEFQX0ZIU1MgPSA0LAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQk1fQU5UU0lHTkFMID0gNSwKLSAgICBJRUVFODAyMTFfUkFESU9UQVBfREJNX0FOVE5PSVNFID0gNiwKLSAgICBJRUVFODAyMTFfUkFESU9UQVBfTE9DS19RVUFMSVRZID0gNywKLSAgICBJRUVFODAyMTFfUkFESU9UQVBfVFhfQVRURU5VQVRJT04gPSA4LAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQl9UWF9BVFRFTlVBVElPTiA9IDksCi0gICAgSUVFRTgwMjExX1JBRElPVEFQX0RCTV9UWF9QT1dFUiA9IDEwLAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9BTlRFTk5BID0gMTEsCi0gICAgSUVFRTgwMjExX1JBRElPVEFQX0RCX0FOVFNJR05BTCA9IDEyLAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQl9BTlROT0lTRSA9IDEzCi19OwotCi0jZGVmaW5lIFdMQU5fUkFESU9UQVBfUFJFU0VOVCAoCQkJXAotCSgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9UU0ZUKQl8CVwKLQkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfRkxBR1MpIHwJXAotCSgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9SQVRFKSAgfAlcCi0JIDApCi0KLXR5cGVkZWYgc3RydWN0IF93bGFuX3JhZGlvdGFwX2hlYWRlciB7Ci0JaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciB3dF9paGRyOwotCUlOVDY0IHd0X3RzZnQ7Ci0JVUlOVDggd3RfZmxhZ3M7Ci0JVUlOVDggd3RfcmF0ZTsKLX0gd2xhbl9yYWRpb3RhcF9oZWFkZXI7Ci0vKiBEZWZpbml0aW9uIGZyb20gbWFkd2lmaSAqLwotCi12b2lkIHNlbmRfbW9uaXRvcl9wYWNrZXRzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGspOwotCi0KLVZPSUQgICAgUlRNUFNldERlc2lyZWRSYXRlcygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBMT05HICAgICAgICAgICAgUmF0ZXMpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi1JTlQJU2V0X0ZpeGVkVHhNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLSNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAotSU5UCVNldF9PcE1vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLSNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLwotCi1JTlQgU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9TaG9ydFJldHJ5TGltaXRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1CT09MRUFOIFJUMjhYWENoaXBzZXRDaGVjaygKLQlJTiB2b2lkICpfZGV2X3ApOwotCi0KLVZPSUQgUlQyOFhYRE1BRGlzYWJsZSgKLQlJTiBSVE1QX0FEQVBURVIJCQkqcEFkKTsKLQotVk9JRCBSVDI4WFhETUFFbmFibGUoCi0JSU4gUlRNUF9BREFQVEVSCQkJKnBBZCk7Ci0KLVZPSUQgUlQyOHh4X1VwZGF0ZUJlYWNvblRvQXNpYygKLQlJTiBSVE1QX0FEQVBURVIgKiBwQWQsCi0JSU4gSU5UIGFwaWR4LAotCUlOIFVMT05HIEJlYWNvbkxlbiwKLQlJTiBVTE9ORyBVcGRhdGVQb3MpOwotCi1pbnQgcnQyOHh4X2luaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFNUUklORyBwRGVmYXVsdE1hYywKLQlJTiBQU1RSSU5HIHBIb3N0TmFtZSk7Ci0KLUJPT0xFQU4gUlQyOFhYU2VjdXJpdHlLZXlBZGQoCi0JSU4JCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTgkJVUxPTkcJCQkJYXBpZHgsCi0JSU4JCVVMT05HCQkJCUtleUlkeCwKLQlJTgkJTUFDX1RBQkxFX0VOVFJZCQkqcEVudHJ5KTsKLQotTkRJU19TVEFUVVMgUnRtcE5ldFRhc2tJbml0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKLQotVk9JRCBSdG1wTmV0VGFza0V4aXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1ORElTX1NUQVRVUyBSdG1wTWdtdFRhc2tJbml0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKLQotVk9JRCBSdG1wTWdtdFRhc2tFeGl0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKLQotdm9pZCB0YnR0X3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLQotCi1QTkVUX0RFViBSdG1wUGh5TmV0RGV2SW5pdCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBSVE1QX09TX05FVERFVl9PUF9IT09LICpwTmV0SG9vayk7Ci0KLUJPT0xFQU4gUnRtcFBoeU5ldERldkV4aXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gUE5FVF9ERVYgbmV0X2Rldik7Ci0KLUlOVCBSdG1wUmFEZXZDdHJsSW5pdCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBSVE1QX0lORl9UWVBFIGluZlR5cGUpOwotCi1CT09MRUFOIFJ0bXBSYURldkN0cmxFeGl0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKLQotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0vLwotLy8gRnVuY3Rpb24gUHJvdG90eXBlIGluIGNtbV9kYXRhX3BjaS5jCi0vLwotVVNIT1JUIFJ0bXBQQ0lfV3JpdGVUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JQk9PTEVBTgkJCWJJc0xhc3QsCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKLQotVVNIT1JUIFJ0bXBQQ0lfV3JpdGVTaW5nbGVUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JQk9PTEVBTgkJCWJJc0xhc3QsCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKLQotVVNIT1JUIFJ0bXBQQ0lfV3JpdGVNdWx0aVR4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVQ0hBUgkJCWZyYW1lTnVtLAotCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcik7Ci0KLVVTSE9SVAlSdG1wUENJX1dyaXRlRnJhZ1R4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVQ0hBUgkJCWZyYWdOdW0sCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKLQotVVNIT1JUIFJ0bXBQQ0lfV3JpdGVTdWJUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JQk9PTEVBTgkJCWJJc0xhc3QsCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKLQotVk9JRCBSdG1wUENJX0ZpbmFsV3JpdGVUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JVVNIT1JUCQkJdG90YWxNUERVU2l6ZSwKLQlJTglVU0hPUlQJCQlGaXJzdFR4SWR4KTsKLQotVk9JRCBSdG1wUENJRGF0YUxhc3RUeElkeCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCVF1ZUlkeCwKLQlJTglVU0hPUlQJCQlMYXN0VHhJZHgpOwotCi1WT0lEIFJ0bXBQQ0lEYXRhS2lja091dCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCVVDSEFSCQkJUXVlSWR4KTsKLQotCi1pbnQgUnRtcFBDSU1nbXRLaWNrT3V0KAotCUlOIFJUTVBfQURBUFRFUgkJKnBBZCwKLQlJTiBVQ0hBUgkJCVF1ZUlkeCwKLQlJTiBQTkRJU19QQUNLRVQJCXBQYWNrZXQsCi0JSU4gUFVDSEFSCQkJcFNyY0J1ZlZBLAotCUlOIFVJTlQJCQkJU3JjQnVmTGVuKTsKLQotCi1ORElTX1NUQVRVUyBSVE1QQ2hlY2tSeEVycm9yKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQSEVBREVSXzgwMl8xMSAgcEhlYWRlciwKLQlJTglQUlhXSV9TVFJVQwlwUnhXSSwKLQlJTiAgUFJUMjhYWF9SWERfU1RSVUMgICAgICBwUnhEKTsKLQotQk9PTEVBTiBSVDI4eHhQY2lBc2ljUmFkaW9PZmYoCi0JSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JSU4gVUNIQVIgICAgICAgICAgICBMZXZlbCwKLQlJTiBVU0hPUlQgICAgICAgICAgIFRidHROdW1Ub05leHRXYWtlVXApOwotCi1CT09MRUFOIFJUMjh4eFBjaUFzaWNSYWRpb09uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSICAgICBMZXZlbCk7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLVZPSUQgUlRNUEluaXRQQ0llTGlua0N0cmxWYWx1ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgUlRNUEZpbmRIb3N0UENJRGV2KAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkKTsKLQotVk9JRCBSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICAgVUNIQVIJCUxldmVsKTsKLQotVk9JRCBSVE1QUENJZUxpbmtDdHJsU2V0dGluZygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQJCU1heCk7Ci0KLVZPSUQgUlRNUHJ0M3hTZXRQQ0llUG93ZXJMaW5rQ3RybCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLQotVk9JRCBSVDI4eHhQY2lTdGFBc2ljRm9yY2VXYWtldXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gQk9PTEVBTiAgICAgICBiRnJvbVR4KTsKLQotVk9JRCBSVDI4eHhQY2lTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQgVGJ0dE51bVRvTmV4dFdha2VVcCk7Ci0KLVZPSUQgUHNQb2xsV2FrZUV4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotVk9JRCAgUmFkaW9PbkV4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotVk9JRCBSVDI4eHhQY2lNbG1lUmFkaW9PbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgUlQyOHh4UGNpTWxtZVJhZGlvT0ZGKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotVk9JRCBBc2ljVHVybk9mZlJGQ2xrKAotCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCUlOCVVDSEFSICAgICAgICAgICBDaGFubmVsKTsKLQotVk9JRCBBc2ljVHVybk9uUkZDbGsoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlDaGFubmVsKTsKLQotCi0KLSNpZmRlZiBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVAotSU5UIFJ0bXBUaW1lclFUaHJlYWQoCi0JSU4gT1VUIFBWT0lEIENvbnRleHQpOwotCi1SVE1QX1RJTUVSX1RBU0tfRU5UUlkgKlJ0bXBUaW1lclFJbnNlcnQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gUkFMSU5LX1RJTUVSX1NUUlVDVCAqcFRpbWVyKTsKLQotQk9PTEVBTiBSdG1wVGltZXJRUmVtb3ZlKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFJBTElOS19USU1FUl9TVFJVQ1QgKnBUaW1lcik7Ci0KLXZvaWQgUnRtcFRpbWVyUUV4aXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpOwotCi12b2lkIFJ0bXBUaW1lclFJbml0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKLSNlbmRpZiAvLyBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVCAvLwotCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1WT0lEIFFCU1NfTG9hZEluaXQoCi0JSU4JCVJUTVBfQURBUFRFUgkqcEFkKTsKLQotVUlOVDMyIFFCU1NfTG9hZEVsZW1lbnRBcHBlbmQoCi0JSU4JCVJUTVBfQURBUFRFUgkqcEFkLAotCU9VVAkJVUlOVDgJCQkqYnVmX3ApOwotCi1WT0lEIFFCU1NfTG9hZFVwZGF0ZSgKLQlJTgkJUlRNUF9BREFQVEVSCSpwQWQpOwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLUlOVCBSVE1QU2hvd0NmZ1ZhbHVlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlwTmFtZSwKLQlJTglQU1RSSU5HCQkJcEJ1Zik7Ci0KLVBTVFJJTkcgUlRNUEdldFJhbGlua0F1dGhNb2RlU3RyKAotICAgIElOICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFIGF1dGhNb2RlKTsKLQotUFNUUklORyBSVE1QR2V0UmFsaW5rRW5jcnlNb2RlU3RyKAotICAgIElOICBVU0hPUlQgZW5jcnlNb2RlKTsKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLVZPSUQgQXNpY1N0YUJicFR1bmluZygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLUJPT0xFQU4gU3RhQWRkTWFjVGFibGVFbnRyeSgKLQlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOICBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSwKLQlJTiAgVUNIQVIJCQkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcywKLQlJTiAgSFRfQ0FQQUJJTElUWV9JRQkqcEh0Q2FwYWJpbGl0eSwKLQlJTiAgVUNIQVIJCQkJSHRDYXBhYmlsaXR5TGVuLAotCUlOICBBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8sCi0JSU4gIFVDSEFSCQkJCUFkZEh0SW5mb0xlbiwKLQlJTiAgVVNIT1JUCQkJQ2FwYWJpbGl0eUluZm8pOwotCi0KLUJPT0xFQU4JQVVUSF9SZXFTZW5kKAotCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gIFBNTE1FX1FVRVVFX0VMRU0JcEVsZW0sCi0JSU4gIFBSQUxJTktfVElNRVJfU1RSVUNUIHBBdXRoVGltZXIsCi0JSU4gIFBTVFJJTkcJCQkJcFNNTmFtZSwKLQlJTiAgVVNIT1JUCQkJCVNlcU5vLAotCUlOICBQVUNIQVIJCQkJcE5ld0VsZW1lbnQsCi0JSU4gIFVMT05HCQkJCUVsZW1lbnRMZW4pOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi12b2lkIFJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKLQotVk9JRCBSZVN5bmNCZWFjb25UaW1lKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCBSVE1QU2V0QUdDSW5pdFZhbHVlKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVDSEFSCQkJQmFuZFdpZHRoKTsKLQotaW50IHJ0Mjh4eF9jbG9zZShJTiBQTkVUX0RFViBkZXYpOwotaW50IHJ0Mjh4eF9vcGVuKElOIFBORVRfREVWIGRldik7Ci0KLQotI2RlZmluZSBWSVJUVUFMX0lGX0lOQyhfX3BBZCkgKChfX3BBZCktPlZpcnR1YWxJZkNudCsrKQotI2RlZmluZSBWSVJUVUFMX0lGX0RFQyhfX3BBZCkgKChfX3BBZCktPlZpcnR1YWxJZkNudC0tKQotI2RlZmluZSBWSVJUVUFMX0lGX05VTShfX3BBZCkgKChfX3BBZCktPlZpcnR1YWxJZkNudCkKLQotCi0jaWZkZWYgTElOVVgKLV9faW5saW5lIElOVCBWSVJUVUFMX0lGX1VQKFBSVE1QX0FEQVBURVIgcEFkKQotewotCWlmIChWSVJUVUFMX0lGX05VTShwQWQpID09IDApCi0JewotCQlpZiAocnQyOHh4X29wZW4ocEFkLT5uZXRfZGV2KSAhPSAwKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydDI4eHhfb3BlbiByZXR1cm4gZmFpbCFcbiIpKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQllbHNlCi0JewotCX0KLQlWSVJUVUFMX0lGX0lOQyhwQWQpOwotCXJldHVybiAwOwotfQotCi1fX2lubGluZSBWT0lEIFZJUlRVQUxfSUZfRE9XTihQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlWSVJUVUFMX0lGX0RFQyhwQWQpOwotCWlmIChWSVJUVUFMX0lGX05VTShwQWQpID09IDApCi0JCXJ0Mjh4eF9jbG9zZShwQWQtPm5ldF9kZXYpOwotCXJldHVybjsKLX0KLSNlbmRpZiAvLyBMSU5VWCAvLwotCi0KLQotCi0vKgotCU9TIFJlbGF0ZWQgZnVuY2l0b24gcHJvdG90eXBlIGRlZmluaXRpb25zLgotCVRPRE86IE1heWJlIHdlIG5lZWQgdG8gbW92ZSB0aGVzZSBmdW5jdGlvbiBwcm90b3R5cGVzIHRvIG90aGVyIHByb3BlciBwbGFjZS4KLSovCi1pbnQgUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gVUlOVDMyCQlldmVudFR5cGUsCi0JSU4gSU5UCQkJZmxhZ3MsCi0JSU4gUFVDSEFSCQlwU3JjTWFjLAotCUlOIFBVQ0hBUgkJcERhdGEsCi0JSU4gVUlOVDMyCQlkYXRhTGVuKTsKLQotaW50IFJ0bXBPU05ldERldkFkZHJTZXQoCi0JSU4gUE5FVF9ERVYgcE5ldERldiwKLQlJTiBQVUNIQVIJcE1hY0FkZHIpOwotCi1pbnQgUnRtcE9TTmV0RGV2QXR0YWNoKAotCUlOIFBORVRfREVWIHBOZXREZXYsCi0JSU4gUlRNUF9PU19ORVRERVZfT1BfSE9PSyAqcERldk9wSG9vayk7Ci0KLXZvaWQgUnRtcE9TTmV0RGV2Q2xvc2UoCi0JSU4gUE5FVF9ERVYgcE5ldERldik7Ci0KLXZvaWQgUnRtcE9TTmV0RGV2RGV0YWNoKAotCUlOIFBORVRfREVWIHBOZXREZXYpOwotCi1JTlQgUnRtcE9TTmV0RGV2QWxsb2MoCi0JSU4gUE5FVF9ERVYgKnBOZXdOZXREZXYsCi0JSU4gVUlOVDMyCXByaXZEYXRhU2l6ZSk7Ci0KLXZvaWQgUnRtcE9TTmV0RGV2RnJlZSgKLQlJTiBQTkVUX0RFViBwTmV0RGV2KTsKLQotUE5FVF9ERVYgUnRtcE9TTmV0RGV2R2V0QnlOYW1lKAotCUlOIFBORVRfREVWIHBOZXREZXYsCi0JSU4gUFNUUklORwlwRGV2TmFtZSk7Ci0KLXZvaWQgUnRtcE9TTmV0RGV2aWNlUmVmUHV0KAotCUlOIFBORVRfREVWIHBOZXREZXYpOwotCi1QTkVUX0RFViBSdG1wT1NOZXREZXZDcmVhdGUoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gSU5UCQkJZGV2VHlwZSwKLQlJTiBJTlQJCQlkZXZOdW0sCi0JSU4gSU5UCQkJcHJpdk1lbVNpemUsCi0JSU4gUFNUUklORwkJcE5hbWVQcmVmaXgpOwotCi0vKgotCVRhc2sgb3BlcmF0aW9uIHJlbGF0ZWQgZnVuY3Rpb24gcHJvdG90eXBlcwotKi8KLXZvaWQgUnRtcE9TVGFza0N1c3RvbWl6ZSgKLQlJTiBSVE1QX09TX1RBU0sgKnBUYXNrKTsKLQotSU5UIFJ0bXBPU1Rhc2tOb3RpZnlUb0V4aXQoCi0JSU4gUlRNUF9PU19UQVNLICpwVGFzayk7Ci0KLU5ESVNfU1RBVFVTIFJ0bXBPU1Rhc2tLaWxsKAotCUlOIFJUTVBfT1NfVEFTSyAqcFRhc2spOwotCi1ORElTX1NUQVRVUyBSdG1wT1NUYXNrSW5pdCgKLQlJTiBSVE1QX09TX1RBU0sgKnBUYXNrLAotCVBTVFJJTkcJCQkgcFRhc2tOYW1lLAotCVZPSUQJCQkgKnBQcml2KTsKLQotTkRJU19TVEFUVVMgUnRtcE9TVGFza0F0dGFjaCgKLQlJTiBSVE1QX09TX1RBU0sgKnBUYXNrLAotCUlOIGludCAoKmZuKSh2b2lkICopLAotCUlOIHZvaWQgKmFyZyk7Ci0KLQotLyoKLQlGaWxlIG9wZXJhdGlvbiByZWxhdGVkIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSovCi1SVE1QX09TX0ZEIFJ0bXBPU0ZpbGVPcGVuKAotCUlOIGNoYXIgKnBQYXRoLAotCUlOIGludCBmbGFnLAotCUlOIGludCBtb2RlKTsKLQotaW50IFJ0bXBPU0ZpbGVDbG9zZSgKLQlJTiBSVE1QX09TX0ZEIG9zZmQpOwotCi12b2lkIFJ0bXBPU0ZpbGVTZWVrKAotCUlOIFJUTVBfT1NfRkQgb3NmZCwKLQlJTiBpbnQgb2Zmc2V0KTsKLQotaW50IFJ0bXBPU0ZpbGVSZWFkKAotCUlOIFJUTVBfT1NfRkQgb3NmZCwKLQlJTiBjaGFyICpwRGF0YVB0ciwKLQlJTiBpbnQgcmVhZExlbik7Ci0KLWludCBSdG1wT1NGaWxlV3JpdGUoCi0JSU4gUlRNUF9PU19GRCBvc2ZkLAotCUlOIGNoYXIgKnBEYXRhUHRyLAotCUlOIGludCB3cml0ZUxlbik7Ci0KLXZvaWQgUnRtcE9TRlNJbmZvQ2hhbmdlKAotCUlOIFJUTVBfT1NfRlNfSU5GTyAqcE9TRlNJbmZvLAotCUlOIEJPT0xFQU4gYlNldCk7Ci0KLQotI2VuZGlmICAvLyBfX1JUTVBfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfY2hpcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX2NoaXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBiNGJmMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfY2hpcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JcnRtcF9jaGlwLmgKLQotCUFic3RyYWN0OgotCVJhbGluayBXaXJlbGVzcyBDaGlwIHJlbGF0ZWQgZGVmaW5pdGlvbiAmIHN0cnVjdHVyZXMKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJICBXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSNpZm5kZWYJX19SVE1QX0NISVBfSF9fCi0jZGVmaW5lCV9fUlRNUF9DSElQX0hfXwotCi0jaW5jbHVkZSAicnRtcF90eXBlLmgiCi0KLSNpZmRlZiBSVDMwOTAKLSNpbmNsdWRlICJydDMwOTAuaCIKLSNlbmRpZiAvLyBSVDMwOTAgLy8KLQotI2lmZGVmIFJUMzM3MAotI2luY2x1ZGUgInJ0MzM3MC5oIgotI2VuZGlmIC8vIFJUMzM3MCAvLwotCi0jaWZkZWYgUlQzMzkwCi0jaW5jbHVkZSAicnQzMzkwLmgiCi0jZW5kaWYgLy8gUlQzMzkwIC8vCi0KLS8vIFdlIHdpbGwgaGF2ZSBhIGNvc3QgZG93biB2ZXJzaW9uIHdoaWNoIG1hYyB2ZXJzaW9uIGlzIDB4MzA5MHh4eHgKLS8vCi0vLyBSVDMwOTBBIGZhY3RzCi0vLwotLy8gYSkgMi40IEdIegotLy8gYikgUmVwbGFjZW1lbnQgZm9yIFJUMzA5MAotLy8gYykgSW50ZXJuYWwgTE5BCi0vLyBkKSBJbnRlcmZlcmVuY2Ugb3ZlciBjaGFubmVsICMxNAotLy8gZSkgTmV3IEJCUCBmZWF0dXJlcyAoZS5nLiwgU0lHIHJlLW1vZHVsYXRpb24pCi0vLwotI2RlZmluZSBJU19SVDMwOTBBKF9wQWQpCQkJCSgoKChfcEFkKS0+TUFDVmVyc2lvbiAmIDB4ZmZmZjAwMDApID09IDB4MzA5MDAwMDApKQotCi0vLyBXZSB3aWxsIGhhdmUgYSBjb3N0IGRvd24gdmVyc2lvbiB3aGljaCBtYWMgdmVyc2lvbiBpcyAweDMwOTB4eHh4Ci0jZGVmaW5lIElTX1JUMzA5MChfcEFkKQkJCQkoKCgoX3BBZCktPk1BQ1ZlcnNpb24gJiAweGZmZmYwMDAwKSA9PSAweDMwNzEwMDAwKSB8fCAoSVNfUlQzMDkwQShfcEFkKSkpCi0KLSNkZWZpbmUgSVNfUlQzMDcwKF9wQWQpCQkoKChfcEFkKS0+TUFDVmVyc2lvbiAmIDB4ZmZmZjAwMDApID09IDB4MzA3MDAwMDApCi0jZGVmaW5lIElTX1JUMzA3MShfcEFkKQkJKCgoX3BBZCktPk1BQ1ZlcnNpb24gJiAweGZmZmYwMDAwKSA9PSAweDMwNzEwMDAwKQotI2RlZmluZSBJU19SVDIwNzAoX3BBZCkJCSgoKF9wQWQpLT5SZkljVHlwZSA9PSBSRklDXzIwMjApIHx8ICgoX3BBZCktPkVGdXNlVGFnID09IDB4MjcpKQotCi0jZGVmaW5lIElTX1JUMzB4eChfcEFkKQkJKCgoX3BBZCktPk1BQ1ZlcnNpb24gJiAweGZmZjAwMDAwKSA9PSAweDMwNzAwMDAwfHxJU19SVDMwOTBBKF9wQWQpKQotLy8jZGVmaW5lIElTX1JUMzA1WChfcEFkKQkJKChfcEFkKS0+TUFDVmVyc2lvbiA9PSAweDI4NzIwMjAwKQotCi0vKiBSVDM1NzIsIDM1OTIsIDM1NjIsIDMwNjIgc2hhcmUgdGhlIHNhbWUgTUFDIHZlcnNpb24gKi8KLSNkZWZpbmUgSVNfUlQzNTcyKF9wQWQpCQkoKChfcEFkKS0+TUFDVmVyc2lvbiAmIDB4ZmZmZjAwMDApID09IDB4MzU3MjAwMDApCi0jZGVmaW5lIElTX1ZFUlNJT05fQkVGT1JFX0YoX3BBZCkJCQkoKChfcEFkKS0+TUFDVmVyc2lvbiYweGZmZmYpIDw9IDB4MDIxMSkKLS8vIEYgdmVyc2lvbiBpcyAweDAyMTIsIEUgdmVyc2lvbiBpcyAweDAyMTEuIDMwOXggY2FuIHNhdmUgbW9yZSBwb3dlciBhZnRlciBGIHZlcnNpb24uCi0jZGVmaW5lIElTX1ZFUlNJT05fQUZURVJfRihfcEFkKQkJCSgoKChfcEFkKS0+TUFDVmVyc2lvbiYweGZmZmYpID49IDB4MDIxMikgfHwgKCgoX3BBZCktPmIzMDkwRVNwZWNpYWxDaGlwID09IFRSVUUpKSkKLS8vCi0vLyBSVDMzOTAgZmFjdHMKLS8vCi0vLyBhKSBCYXNlIG9uIFJUMzA5MCAoUkYgSUM6IFJUMzAyMCkKLS8vIGIpIDIuNCBHSHoKLS8vIGMpIDF4MQotLy8gZCkgU2luZ2xlIGNoaXAKLS8vIGUpIEludGVybmFsIGNvbXBvbmVudHM6IFBBIGFuZCBMTkEKLS8vCi0vL1JUMzM5MCxSVDMzNzAKLSNkZWZpbmUgSVNfUlQzMzkwKF9wQWQpCQkJCSgoKF9wQWQpLT5NQUNWZXJzaW9uICYgMHhGRkZGMDAwMCkgPT0gMHgzMzkwMDAwMCkKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQQ0kgcmVnaXN0ZXJzIC0gYmFzZSBhZGRyZXNzIDB4MDAwMAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jZGVmaW5lIENISVBfUENJX0NGRwkJMHgwMDAwCi0jZGVmaW5lIENISVBfUENJX0VFQ1RSTAkJMHgwMDA0Ci0jZGVmaW5lIENISVBfUENJX01DVUNUUkwJMHgwMDA4Ci0KLSNkZWZpbmUgT1BUXzE0CQkJMHgxMTQKLQotI2RlZmluZSBSRVRSWV9MSU1JVAkJMTAKLQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQkJQICYgUkYJZGVmaW5pdGlvbgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jZGVmaW5lCUJVU1kJCSAgICAgICAgICAgICAgICAxCi0jZGVmaW5lCUlETEUJCSAgICAgICAgICAgICAgICAwCi0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFRVBST00gZGVmaW5pdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jZGVmaW5lIEVFRE8gICAgICAgICAgICAgICAgICAgICAgICAweDA4Ci0jZGVmaW5lIEVFREkgICAgICAgICAgICAgICAgICAgICAgICAweDA0Ci0jZGVmaW5lIEVFQ1MgICAgICAgICAgICAgICAgICAgICAgICAweDAyCi0jZGVmaW5lIEVFU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAxCi0jZGVmaW5lIEVFUkwgICAgICAgICAgICAgICAgICAgICAgICAweDgwCi0KLSNkZWZpbmUgRUVQUk9NX1dSSVRFX09QQ09ERSAgICAgICAgIDB4MDUKLSNkZWZpbmUgRUVQUk9NX1JFQURfT1BDT0RFICAgICAgICAgIDB4MDYKLSNkZWZpbmUgRUVQUk9NX0VXRFNfT1BDT0RFICAgICAgICAgIDB4MTAKLSNkZWZpbmUgRUVQUk9NX0VXRU5fT1BDT0RFICAgICAgICAgIDB4MTMKLQotI2RlZmluZSBOVU1fRUVQUk9NX0JCUF9QQVJNUwkJMTkJCQkvLyBJbmNsdWRlIE5JQyBDb25maWcgMCwgMSwgQ1IsIFRYIEFMQyBzdGVwLCBCQlBzCi0jZGVmaW5lIE5VTV9FRVBST01fVFhfR19QQVJNUwkJNwotI2RlZmluZSBFRVBST01fTklDMV9PRkZTRVQgICAgICAgICAgMHgzNAkJLy8gVGhlIGFkZHJlc3MgaXMgZnJvbSBOSUMgY29uZmlnIDAsIG5vdCBCQlAgcmVnaXN0ZXIgSUQKLSNkZWZpbmUgRUVQUk9NX05JQzJfT0ZGU0VUICAgICAgICAgIDB4MzYJCS8vIFRoZSBhZGRyZXNzIGlzIGZyb20gTklDIGNvbmZpZyAwLCBub3QgQkJQIHJlZ2lzdGVyIElECi0jZGVmaW5lIEVFUFJPTV9CQlBfQkFTRV9PRkZTRVQJCTB4ZjAJCS8vIFRoZSBhZGRyZXNzIGlzIGZyb20gTklDIGNvbmZpZyAwLCBub3QgQkJQIHJlZ2lzdGVyIElECi0jZGVmaW5lIEVFUFJPTV9HX1RYX1BXUl9PRkZTRVQJCTB4NTIKLSNkZWZpbmUgRUVQUk9NX0dfVFgyX1BXUl9PRkZTRVQJCTB4NjAKLSNkZWZpbmUgRUVQUk9NX0xFRDFfT0ZGU0VUCQkJMHgzYwotI2RlZmluZSBFRVBST01fTEVEMl9PRkZTRVQJCQkweDNlCi0jZGVmaW5lIEVFUFJPTV9MRUQzX09GRlNFVAkJCTB4NDAKLSNkZWZpbmUgRUVQUk9NX0xOQV9PRkZTRVQJCQkweDQ0Ci0jZGVmaW5lIEVFUFJPTV9SU1NJX0JHX09GRlNFVAkJMHg0NgotI2RlZmluZSBFRVBST01fVFhNSVhFUl9HQUlOXzJfNEcJMHg0OAotI2RlZmluZSBFRVBST01fUlNTSV9BX09GRlNFVAkJMHg0YQotI2RlZmluZSBFRVBST01fVFhNSVhFUl9HQUlOXzVHCQkweDRjCi0jZGVmaW5lIEVFUFJPTV9ERUZJTkVfTUFYX1RYUFdSCQkweDRlCi0jZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURV8yME1IWl8yXzRHCTB4ZGUJLy8gMjBNSFogMi40RyB0eCBwb3dlci4KLSNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzJfNEcJMHhlZQkvLyA0ME1IWiAyLjRHIHR4IHBvd2VyLgotI2RlZmluZSBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfNUcJCTB4ZmEJLy8gMjBNSFogNUcgdHggcG93ZXIuCi0jZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl81RwkJMHgxMGEJLy8gNDBNSFogNUcgdHggcG93ZXIuCi0jZGVmaW5lIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgICAgICAweDc4Ci0jZGVmaW5lIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICAgICAgMHhhNgotLy8jZGVmaW5lIEVFUFJPTV9KYXBhbl9UWF9QV1JfT0ZGU0VUICAgICAgMHg5MCAvLyA4MDIuMTFqCi0vLyNkZWZpbmUgRUVQUk9NX0phcGFuX1RYMl9QV1JfT0ZGU0VUICAgICAgMHhiZQotLy8jZGVmaW5lIEVFUFJPTV9UU1NJX1JFRl9PRkZTRVQJMHg1NAotLy8jZGVmaW5lIEVFUFJPTV9UU1NJX0RFTFRBX09GRlNFVAkweDI0Ci0vLyNkZWZpbmUgRUVQUk9NX0NDS19UWF9QV1JfT0ZGU0VUICAweDYyCi0vLyNkZWZpbmUgRUVQUk9NX0NBTElCUkFURV9PRkZTRVQJMHg3YwotI2RlZmluZSBFRVBST01fVkVSU0lPTl9PRkZTRVQgICAgICAgMHgwMgotI2RlZmluZSBFRVBST01fRlJFUV9PRkZTRVQJCQkweDNhCi0jZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURQkweGRlCS8vIDIwTUhaIHBvd2VyLgotI2RlZmluZSBFRVBST01fVFhQT1dFUl9ERUxUQQkJMHg1MAkvLyAyME1IWiBBTkQgNDAgTUhaIHVzZSBkaWZmZXJlbnQgcG93ZXIuIFRoaXMgaXMgZGVsdGEgaW4gNDBNSFouCi0jZGVmaW5lIFZBTElEX0VFUFJPTV9WRVJTSU9OICAgICAgICAxCi0KLQotLyoKLSAgKiAgIEVFUFJPTSBvcGVyYXRpb24gcmVsYXRlZCBtYXJjb3MKLSAgKi8KLSNkZWZpbmUgUlQyOHh4X0VFUFJPTV9SRUFEMTYoX3BBZCwgX29mZnNldCwgX3ZhbHVlKQkJCVwKLQkoX3BBZCktPmNoaXBPcHMuZWVyZWFkKChSVE1QX0FEQVBURVIgKikoX3BBZCksIChVU0hPUlQpKF9vZmZzZXQpLCAoUFVTSE9SVCkmKF92YWx1ZSkpCi0KLSNkZWZpbmUgUlQyOHh4X0VFUFJPTV9XUklURTE2KF9wQWQsIF9vZmZzZXQsIF92YWx1ZSkJCVwKLQkoX3BBZCktPmNoaXBPcHMuZWV3cml0ZSgoUlRNUF9BREFQVEVSICopKF9wQWQpLCAoVVNIT1JUKShfb2Zmc2V0KSwgKFVTSE9SVCkoX3ZhbHVlKSkKLQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICBFMlBST00gZGF0YSBsYXlvdXQKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8KLS8vIE1DVV9MRURDUzogTUNVIExFRCBDb250cm9sIFNldHRpbmcuCi0vLwotdHlwZWRlZiB1bmlvbiAgX01DVV9MRURDU19TVFJVQyB7Ci0Jc3RydWN0CXsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCVVDSEFSCQlQb2xhcml0eToxOwotCQlVQ0hBUgkJTGVkTW9kZTo3OwotI2Vsc2UKLQkJVUNIQVIJCUxlZE1vZGU6NzsKLQkJVUNIQVIJCVBvbGFyaXR5OjE7Ci0jZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLwotCX0gZmllbGQ7Ci0JVUNIQVIJCQkJd29yZDsKLX0gTUNVX0xFRENTX1NUUlVDLCAqUE1DVV9MRURDU19TVFJVQzsKLQotCi0vLwotLy8gRUVQUk9NIGFudGVubmEgc2VsZWN0IGZvcm1hdAotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9FRVBST01fQU5URU5OQV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVVNIT1JUICAgICAgUnN2OjQ7Ci0JCVVTSE9SVCAgICAgIFJmSWNUeXBlOjQ7ICAgICAgICAgICAgIC8vIHNlZSBFMlBST00gZG9jdW1lbnQKLQkJVVNIT1JUCQlUeFBhdGg6NDsJLy8gMTogMVQsIDI6IDJUCi0JCVVTSE9SVAkJUnhQYXRoOjQ7CS8vIDE6IDFSLCAyOiAyUiwgMzogM1IKLQl9CWZpZWxkOwotCVVTSE9SVAkJCXdvcmQ7Ci19CUVFUFJPTV9BTlRFTk5BX1NUUlVDLCAqUEVFUFJPTV9BTlRFTk5BX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX0VFUFJPTV9BTlRFTk5BX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVU0hPUlQJCVJ4UGF0aDo0OwkvLyAxOiAxUiwgMjogMlIsIDM6IDNSCi0JCVVTSE9SVAkJVHhQYXRoOjQ7CS8vIDE6IDFULCAyOiAyVAotCQlVU0hPUlQgICAgICBSZkljVHlwZTo0OyAgICAgICAgICAgICAvLyBzZWUgRTJQUk9NIGRvY3VtZW50Ci0JCVVTSE9SVCAgICAgIFJzdjo0OwotCX0JZmllbGQ7Ci0JVVNIT1JUCQkJd29yZDsKLX0JRUVQUk9NX0FOVEVOTkFfU1RSVUMsICpQRUVQUk9NX0FOVEVOTkFfU1RSVUM7Ci0jZW5kaWYKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24gX0VFUFJPTV9OSUNfQ0lORklHMl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVVNIT1JUCQlEQUNUZXN0Qml0OjE7CQkJLy8gY29udHJvbCBpZiBkcml2ZXIgc2hvdWxkIHBhdGNoIHRoZSBEQUMgaXNzdWUKLQkJVVNIT1JUCQlSc3YyOjM7CQkJCQkvLyBtdXN0IGJlIDAKLQkJVVNIT1JUCQlBbnREaXZlcnNpdHk6MTsJCQkvLyBBbnRlbm5hIGRpdmVyc2l0eQotCQlVU0hPUlQJCVJzdjE6MTsJCQkJCS8vIG11c3QgYmUgMAotCQlVU0hPUlQJCUJXNDBNQXZhaWxGb3JBOjE7CQkJLy8gMDplbmFibGUsIDE6ZGlzYWJsZQotCQlVU0hPUlQJCUJXNDBNQXZhaWxGb3JHOjE7CQkJLy8gMDplbmFibGUsIDE6ZGlzYWJsZQotCQlVU0hPUlQJCUVuYWJsZVdQU1BCQzoxOyAgICAgICAgICAgICAgICAgLy8gV1BTIFBCQyBDb250cm9sIGJpdAotCQlVU0hPUlQJCUJXNDBNU2lkZWJhbmRGb3JBOjE7Ci0JCVVTSE9SVAkJQlc0ME1TaWRlYmFuZEZvckc6MTsKLQkJVVNIT1JUCQlDYXJkYnVzQWNjZWxlcmF0aW9uOjE7CS8vICEhISBOT1RFOiAwIC0gZW5hYmxlLCAxIC0gZGlzYWJsZQotCQlVU0hPUlQJCUV4dGVybmFsTE5BRm9yQToxOwkJCS8vIGV4dGVybmFsIExOQSBlbmFibGUgZm9yIDVHCi0JCVVTSE9SVAkJRXh0ZXJuYWxMTkFGb3JHOjE7CQkJLy8gZXh0ZXJuYWwgTE5BIGVuYWJsZSBmb3IgMi40RwotCQlVU0hPUlQJCUR5bmFtaWNUeEFnY0NvbnRyb2w6MTsJCQkvLwotCQlVU0hPUlQJCUhhcmR3YXJlUmFkaW9Db250cm9sOjE7CS8vIFdoZXRoZXIgUkYgaXMgY29udHJvbGxlZCBieSBkcml2ZXIgb3IgSFcuIDE6ZW5hYmxlIGh3IGNvbnRyb2wsIDA6ZGlzYWJsZQotCX0JZmllbGQ7Ci0JVVNIT1JUCQkJd29yZDsKLX0JRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDLCAqUEVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uIF9FRVBST01fTklDX0NJTkZJRzJfU1RSVUMJewotCXN0cnVjdCB7Ci0JCVVTSE9SVAkJSGFyZHdhcmVSYWRpb0NvbnRyb2w6MTsJLy8gMTplbmFibGUsIDA6ZGlzYWJsZQotCQlVU0hPUlQJCUR5bmFtaWNUeEFnY0NvbnRyb2w6MTsJCQkvLwotCQlVU0hPUlQJCUV4dGVybmFsTE5BRm9yRzoxOwkJCQkvLwotCQlVU0hPUlQJCUV4dGVybmFsTE5BRm9yQToxOwkJCS8vIGV4dGVybmFsIExOQSBlbmFibGUgZm9yIDIuNEcKLQkJVVNIT1JUCQlDYXJkYnVzQWNjZWxlcmF0aW9uOjE7CS8vICEhISBOT1RFOiAwIC0gZW5hYmxlLCAxIC0gZGlzYWJsZQotCQlVU0hPUlQJCUJXNDBNU2lkZWJhbmRGb3JHOjE7Ci0JCVVTSE9SVAkJQlc0ME1TaWRlYmFuZEZvckE6MTsKLQkJVVNIT1JUCQlFbmFibGVXUFNQQkM6MTsgICAgICAgICAgICAgICAgIC8vIFdQUyBQQkMgQ29udHJvbCBiaXQKLQkJVVNIT1JUCQlCVzQwTUF2YWlsRm9yRzoxOwkJCS8vIDA6ZW5hYmxlLCAxOmRpc2FibGUKLQkJVVNIT1JUCQlCVzQwTUF2YWlsRm9yQToxOwkJCS8vIDA6ZW5hYmxlLCAxOmRpc2FibGUKLQkJVVNIT1JUCQlSc3YxOjE7CQkJCQkvLyBtdXN0IGJlIDAKLQkJVVNIT1JUCQlBbnREaXZlcnNpdHk6MTsJCQkvLyBBbnRlbm5hIGRpdmVyc2l0eQotCQlVU0hPUlQJCVJzdjI6MzsJCQkJCS8vIG11c3QgYmUgMAotCQlVU0hPUlQJCURBQ1Rlc3RCaXQ6MTsJCQkvLyBjb250cm9sIGlmIGRyaXZlciBzaG91bGQgcGF0Y2ggdGhlIERBQyBpc3N1ZQotCX0JZmllbGQ7Ci0JVVNIT1JUCQkJd29yZDsKLX0JRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDLCAqUEVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQzsKLSNlbmRpZgotCi0vLwotLy8gVFhfUFdSIFZhbHVlIHZhbGlkIHJhbmdlIDB4RkEoLTYpIH4gMHgyNCgzNikKLS8vCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfRUVQUk9NX1RYX1BXUl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJQ0hBUglCeXRlMTsJCQkJLy8gSGlnaCBCeXRlCi0JCUNIQVIJQnl0ZTA7CQkJCS8vIExvdyBCeXRlCi0JfQlmaWVsZDsKLQlVU0hPUlQJd29yZDsKLX0JRUVQUk9NX1RYX1BXUl9TVFJVQywgKlBFRVBST01fVFhfUFdSX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX0VFUFJPTV9UWF9QV1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JCUNIQVIJQnl0ZTA7CQkJCS8vIExvdyBCeXRlCi0JCUNIQVIJQnl0ZTE7CQkJCS8vIEhpZ2ggQnl0ZQotCX0JZmllbGQ7Ci0JVVNIT1JUCXdvcmQ7Ci19CUVFUFJPTV9UWF9QV1JfU1RSVUMsICpQRUVQUk9NX1RYX1BXUl9TVFJVQzsKLSNlbmRpZgotCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfRUVQUk9NX1ZFUlNJT05fU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVDSEFSCVZlcnNpb247CQkJLy8gSGlnaCBCeXRlCi0JCVVDSEFSCUZhZVJlbGVhc2VOdW1iZXI7CS8vIExvdyBCeXRlCi0JfQlmaWVsZDsKLQlVU0hPUlQJd29yZDsKLX0JRUVQUk9NX1ZFUlNJT05fU1RSVUMsICpQRUVQUk9NX1ZFUlNJT05fU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfRUVQUk9NX1ZFUlNJT05fU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVDSEFSCUZhZVJlbGVhc2VOdW1iZXI7CS8vIExvdyBCeXRlCi0JCVVDSEFSCVZlcnNpb247CQkJLy8gSGlnaCBCeXRlCi0JfQlmaWVsZDsKLQlVU0hPUlQJd29yZDsKLX0JRUVQUk9NX1ZFUlNJT05fU1RSVUMsICpQRUVQUk9NX1ZFUlNJT05fU1RSVUM7Ci0jZW5kaWYKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0VFUFJPTV9MRURfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVTSE9SVAlSc3ZkOjM7CQkJCS8vIFJlc2VydmVkCi0JCVVTSE9SVAlMZWRNb2RlOjU7CQkJLy8gTGVkIG1vZGUuCi0JCVVTSE9SVAlQb2xhcml0eUdQSU9fNDoxOwkvLyBQb2xhcml0eSBHUElPIzQgc2V0dGluZy4KLQkJVVNIT1JUCVBvbGFyaXR5R1BJT18zOjE7CS8vIFBvbGFyaXR5IEdQSU8jMyBzZXR0aW5nLgotCQlVU0hPUlQJUG9sYXJpdHlHUElPXzI6MTsJLy8gUG9sYXJpdHkgR1BJTyMyIHNldHRpbmcuCi0JCVVTSE9SVAlQb2xhcml0eUdQSU9fMToxOwkvLyBQb2xhcml0eSBHUElPIzEgc2V0dGluZy4KLQkJVVNIT1JUCVBvbGFyaXR5R1BJT18wOjE7CS8vIFBvbGFyaXR5IEdQSU8jMCBzZXR0aW5nLgotCQlVU0hPUlQJUG9sYXJpdHlBQ1Q6MTsJCS8vIFBvbGFyaXR5IEFDVCBzZXR0aW5nLgotCQlVU0hPUlQJUG9sYXJpdHlSRFlfQToxOwkJLy8gUG9sYXJpdHkgUkRZX0Egc2V0dGluZy4KLQkJVVNIT1JUCVBvbGFyaXR5UkRZX0c6MTsJCS8vIFBvbGFyaXR5IFJEWV9HIHNldHRpbmcuCi0JfQlmaWVsZDsKLQlVU0hPUlQJd29yZDsKLX0JRUVQUk9NX0xFRF9TVFJVQywgKlBFRVBST01fTEVEX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX0VFUFJPTV9MRURfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVTSE9SVAlQb2xhcml0eVJEWV9HOjE7CQkvLyBQb2xhcml0eSBSRFlfRyBzZXR0aW5nLgotCQlVU0hPUlQJUG9sYXJpdHlSRFlfQToxOwkJLy8gUG9sYXJpdHkgUkRZX0Egc2V0dGluZy4KLQkJVVNIT1JUCVBvbGFyaXR5QUNUOjE7CQkvLyBQb2xhcml0eSBBQ1Qgc2V0dGluZy4KLQkJVVNIT1JUCVBvbGFyaXR5R1BJT18wOjE7CS8vIFBvbGFyaXR5IEdQSU8jMCBzZXR0aW5nLgotCQlVU0hPUlQJUG9sYXJpdHlHUElPXzE6MTsJLy8gUG9sYXJpdHkgR1BJTyMxIHNldHRpbmcuCi0JCVVTSE9SVAlQb2xhcml0eUdQSU9fMjoxOwkvLyBQb2xhcml0eSBHUElPIzIgc2V0dGluZy4KLQkJVVNIT1JUCVBvbGFyaXR5R1BJT18zOjE7CS8vIFBvbGFyaXR5IEdQSU8jMyBzZXR0aW5nLgotCQlVU0hPUlQJUG9sYXJpdHlHUElPXzQ6MTsJLy8gUG9sYXJpdHkgR1BJTyM0IHNldHRpbmcuCi0JCVVTSE9SVAlMZWRNb2RlOjU7CQkJLy8gTGVkIG1vZGUuCi0JCVVTSE9SVAlSc3ZkOjM7CQkJCS8vIFJlc2VydmVkCi0JfQlmaWVsZDsKLQlVU0hPUlQJd29yZDsKLX0JRUVQUk9NX0xFRF9TVFJVQywgKlBFRVBST01fTEVEX1NUUlVDOwotI2VuZGlmCi0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9FRVBST01fVFhQT1dFUl9ERUxUQV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUNIQVIJVHhQb3dlckVuYWJsZToxOy8vIEVuYWJsZQotCQlVQ0hBUglUeXBlOjE7CQkJLy8gMTogcGx1cyB0aGUgZGVsdGEgdmFsdWUsIDA6IG1pbnVzIHRoZSBkZWx0YSB2YWx1ZQotCQlVQ0hBUglEZWx0YVZhbHVlOjY7CS8vIFR4IFBvd2VyIGRhbHRhIHZhbHVlIChNQVg9NCkKLQl9CWZpZWxkOwotCVVDSEFSCXZhbHVlOwotfQlFRVBST01fVFhQT1dFUl9ERUxUQV9TVFJVQywgKlBFRVBST01fVFhQT1dFUl9ERUxUQV9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9FRVBST01fVFhQT1dFUl9ERUxUQV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUNIQVIJRGVsdGFWYWx1ZTo2OwkvLyBUeCBQb3dlciBkYWx0YSB2YWx1ZSAoTUFYPTQpCi0JCVVDSEFSCVR5cGU6MTsJCQkvLyAxOiBwbHVzIHRoZSBkZWx0YSB2YWx1ZSwgMDogbWludXMgdGhlIGRlbHRhIHZhbHVlCi0JCVVDSEFSCVR4UG93ZXJFbmFibGU6MTsvLyBFbmFibGUKLQl9CWZpZWxkOwotCVVDSEFSCXZhbHVlOwotfQlFRVBST01fVFhQT1dFUl9ERUxUQV9TVFJVQywgKlBFRVBST01fVFhQT1dFUl9ERUxUQV9TVFJVQzsKLSNlbmRpZgotCi0jZW5kaWYJLy8gX19SVE1QX0NISVBfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfZGVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYjczOWQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX2RlZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY1MCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIHJ0bXBfZGVmLmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IHJlbGF0ZWQgZGVmaW5pdGlvbiBoZWFkZXIKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgUGF1bCBMaW4gICAgMDgtMDEtMjAwMiAgICBjcmVhdGVkCi0gICAgSm9obiBDaGFuZyAgMDgtMDUtMjAwMyAgICBhZGQgZGVmaW5pdGlvbiBmb3IgMTFnICYgb3RoZXIgZHJhZnRzCi0qLwotI2lmbmRlZiBfX1JUTVBfREVGX0hfXwotI2RlZmluZSBfX1JUTVBfREVGX0hfXwotCi0jaW5jbHVkZSAib2lkLmgiCi0KLSN1bmRlZiBBUF9XU0NfSU5DTFVERUQKLSN1bmRlZiBTVEFfV1NDX0lOQ0xVREVECi0jdW5kZWYgV1NDX0lOQ0xVREVECi0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWYgZGVmaW5lZChBUF9XU0NfSU5DTFVERUQpIHx8IGRlZmluZWQoU1RBX1dTQ19JTkNMVURFRCkKLSNkZWZpbmUgV1NDX0lOQ0xVREVECi0jZW5kaWYKLS8vCi0vLyAgRGVidWcgaW5mb3JtYXRpb24gdmVyYm9zaXR5OiBsb3dlciB2YWx1ZXMgaW5kaWNhdGUgaGlnaGVyIHVyZ2VuY3kKLS8vCi0jZGVmaW5lIFJUX0RFQlVHX09GRiAgICAgICAgMAotI2RlZmluZSBSVF9ERUJVR19FUlJPUiAgICAgIDEKLSNkZWZpbmUgUlRfREVCVUdfV0FSTiAgICAgICAyCi0jZGVmaW5lIFJUX0RFQlVHX1RSQUNFICAgICAgMwotI2RlZmluZSBSVF9ERUJVR19JTkZPICAgICAgIDQKLSNkZWZpbmUgUlRfREVCVUdfTE9VRCAgICAgICA1Ci0KLSNkZWZpbmUgTklDX1RBRyAgICAgICAgICAgICAoKFVMT05HKScwNjgyJykKLSNkZWZpbmUgTklDX0RCR19TVFJJTkcgICAgICAoIioqUlQyOHh4KioiKQotCi0jaWZkZWYgU05NUF9TVVBQT1JUCi0vLyBmb3Igc25tcAotLy8gdG8gZ2V0IG1hbnVmYWN0dXJlciBPVUksIGthdGh5LCAyMDA4XzAyMjAKLSNkZWZpbmUgTWFudWZhY3R1cmVyT1VJX0xFTgkJCTMKLSNkZWZpbmUgTWFudWZhY3R1cmVyTkFNRQkJCSgiUmFsaW5rIFRlY2hub2xvZ3kgQ29tcGFueS4iKQotI2RlZmluZQlSZXNvdXJjZVR5cGVJZE5hbWUJCQkoIlJhbGlua19JRCIpCi0jZW5kaWYKLQotCi0vLyNkZWZpbmUgUEFDS0VECi0KLSNkZWZpbmUgUkFMSU5LXzI4ODNfVkVSU0lPTgkJKChVSU5UMzIpMHgyODgzMDMwMCkKLSNkZWZpbmUgUkFMSU5LXzI4ODBFX1ZFUlNJT04JKChVSU5UMzIpMHgyODcyMDIwMCkKLSNkZWZpbmUgUkFMSU5LXzMwNzBfVkVSU0lPTgkJKChVSU5UMzIpMHgzMDcwMDIwMCkKLQotI2RlZmluZSBNQVhfUlhfUEtUX0xFTgkxNTIwCi0KLS8vCi0vLyBFbnRyeSBudW1iZXIgZm9yIGVhY2ggRE1BIGRlc2NyaXB0b3IgcmluZwotLy8KLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotI2RlZmluZSBUWF9SSU5HX1NJWkUgICAgICAgICAgICA2NCAvLzY0Ci0jZGVmaW5lIE1HTVRfUklOR19TSVpFICAgICAgICAgIDEyOAotI2RlZmluZSBSWF9SSU5HX1NJWkUgICAgICAgICAgICAxMjggLy82NAotI2RlZmluZSBNQVhfVFhfUFJPQ0VTUyAgICAgICAgICBUWF9SSU5HX1NJWkUgLy84Ci0jZGVmaW5lIE1BWF9ETUFfRE9ORV9QUk9DRVNTICAgIFRYX1JJTkdfU0laRQotI2RlZmluZSBNQVhfVFhfRE9ORV9QUk9DRVNTICAgICBUWF9SSU5HX1NJWkUgLy84Ci0jZGVmaW5lIExPQ0FMX1RYQlVGX1NJWkUgICAgICAgIDIKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotI2RlZmluZSBQQ0lfVklSVF9UT19QSFlTKF9fQWRkcikJKCgoVUlOVDMyKShfX0FkZHIpKSAmIDB4MEZGRkZGRkYpCi0KLQotI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAotLy8gTUM6IE11bHRwbGUgQ2FyZHMKLSNkZWZpbmUgTUFYX05VTV9PRl9NVUxUSVBMRV9DQVJECQkzMgotI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLwotCi0jZGVmaW5lIE1BWF9SWF9QUk9DRVNTICAgICAgICAgIDEyOCAvLzY0IC8vMzIKLSNkZWZpbmUgTlVNX09GX0xPQ0FMX1RYQlVGICAgICAgMgotI2RlZmluZSBUWERfU0laRSAgICAgICAgICAgICAgICAxNgotI2RlZmluZSBUWFdJX1NJWkUgICAgICAgICAgICAgICAxNgotI2RlZmluZSBSWERfU0laRQkJMTYKLSNkZWZpbmUgUlhXSV9TSVpFCQkxNgotLy8gVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyA4MDIuMTEgSGVhZGVyIFNpemUgKyBBTVNEVSBzdWIgZnJhbWUgaGVhZGVyCi0jZGVmaW5lIFRYX0RNQV8xU1RfQlVGRkVSX1NJWkUgIDk2ICAgIC8vIG9ubHkgdGhlIDFzdCBwaHlzaWNhbCBidWZmZXIgaXMgcHJlLWFsbG9jYXRlZAotI2RlZmluZSBNR01UX0RNQV9CVUZGRVJfU0laRSAgICAxNTM2IC8vMjA0OAotI2RlZmluZSBSWF9CVUZGRVJfQUdHUkVTSVpFICAgICAzODQwIC8vMzkwNCAvLzM5NjggLy80MDk2IC8vMjA0OCAvLzQwOTYKLSNkZWZpbmUgUlhfQlVGRkVSX05PUk1TSVpFICAgICAgMzg0MCAvLzM5MDQgLy8zOTY4IC8vNDA5NiAvLzIwNDggLy80MDk2Ci0jZGVmaW5lIFRYX0JVRkZFUl9OT1JNU0laRQkJUlhfQlVGRkVSX05PUk1TSVpFCi0jZGVmaW5lIE1BWF9GUkFNRV9TSVpFICAgICAgICAgIDIzNDYgICAgICAgICAgICAgICAgICAgIC8vIE1heGltdW0gODAyLjExIGZyYW1lIHNpemUKLSNkZWZpbmUgTUFYX0FHR1JFR0FUSU9OX1NJWkUgICAgMzg0MCAvLzM5MDQgLy8zOTY4IC8vNDA5NgotI2RlZmluZSBNQVhfTlVNX09GX1RVUExFX0NBQ0hFICAyCi0jZGVmaW5lIE1BWF9NQ0FTVF9MSVNUX1NJWkUgICAgIDMyCi0jZGVmaW5lIE1BWF9MRU5fT0ZfVkVORE9SX0RFU0MgIDY0Ci0vLyNkZWZpbmUgTUFYX1NJWkVfT0ZfTUNBU1RfUFNRICAgKE5VTV9PRl9MT0NBTF9UWEJVRiA+PiAyKSAvLyBBUCB3b24ndCBzcGVuZCBtb3JlIHRoYW4gMS80IG9mIHRvdGFsIGJ1ZmZlcnMgb24gTS9CQ0FTVCBQU1EKLSNkZWZpbmUgTUFYX1NJWkVfT0ZfTUNBU1RfUFNRICAgICAgICAgICAgICAgMzIKLQotI2RlZmluZSBNQVhfUlhfUFJPQ0VTU19DTlQJKFJYX1JJTkdfU0laRSkKLQotCi0vKgotCVdNTSBOb3RlOiBJZiBtZW1vcnkgb2YgeW91ciBzeXN0ZW0gaXMgbm90IG11Y2gsIHBsZWFzZSByZWR1Y2UgdGhlIGRlZmluaXRpb247Ci0Jb3Igd2hlbiB5b3UgZG8gV01NIHRlc3QsIHRoZSBxdWV1ZSBmb3IgbG93IHByaW9yaXR5IEFDIHdpbGwgYmUgZnVsbCwgaS5lLgotCVRYX1JJTkdfU0laRSArIE1BWF9QQUNLRVRTX0lOX1FVRVVFIHBhY2tldHMgZm9yIHRoZSBBQyB3aWxsIGJlIGJ1ZmZlcmVkIGluCi0JV0xBTiwgbWF5YmUgbm8gYW55IHBhY2tldCBidWZmZXIgY2FuIGJlIGdvdCBpbiBFdGhlcm5ldCBkcml2ZXIuCi0KLQlTb21ldGltZXMgbm8gcGFja2V0IGJ1ZmZlciBjYW4gYmUgZ290IGluIEV0aGVybmV0IGRyaXZlciwgdGhlIHN5c3RlbSB3aWxsCi0Jc2VuZCBmbG93IGNvbnRyb2wgcGFja2V0IHRvIHRoZSBzZW5kZXIgdG8gc2xvdyBkb3duIGl0cyBzZW5kaW5nIHJhdGUuCi0JU28gbm8gV01NIGNhbiBiZSBzYXcgaW4gdGhlIGFpci4KLSovCi0KLS8qCi0JTmVlZCB0byB1c2UgNjQgaW4gdnh3b3JrcyBmb3IgdGVzdCBjYXNlIFdNTSBBNS1UMDcKLQlUd28gZG5saW5rICgxME1icHMpIGZyb20gYSBXTU0gc3RhdGlvbiB0byBhIG5vbi1XTU0gc3RhdGlvbi4KLQlJZiB1c2UgMjU2LCBxdWV1ZSBpcyBub3QgZW5vdWdoLgotCUFuZCBpbiBydF9tYWluX2VuZC5jLCBjbENvbmZpZy5jbE51bSA9IFJYX1JJTkdfU0laRSAqIDM7IGlzIGNoYW5nZWQgdG8KLQljbENvbmZpZy5jbE51bSA9IFJYX1JJTkdfU0laRSAqIDQ7Ci0qLwotLy8gVE9ETzogRm9yIFZ4V29ya3MgdGhlIHNpemUgaXMgMjU2LiBTaGFsbCB3ZSBjYWhuZ2UgdGhlIHZhbHVlIGFzIDI1NiBmb3IgYWxsIE9TPz8/Pz8KLSNkZWZpbmUgTUFYX1BBQ0tFVFNfSU5fUVVFVUUJCQkJKDUxMikgLy8oNTEyKSAgICAvLyB0byBwYXNzIFdNTSBBNS1XUEFQU0sKLQotI2RlZmluZSBNQVhfUEFDS0VUU19JTl9NQ0FTVF9QU19RVUVVRQkJMzIKLSNkZWZpbmUgTUFYX1BBQ0tFVFNfSU5fUFNfUVVFVUUJCQkJMTI4CS8vMzIKLSNkZWZpbmUgV01NX05VTV9PRl9BQyAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogQUMwLCBBQzEsIEFDMiwgYW5kIEFDMyAqLwotCi0KLSNpZmRlZiBSVE1QX0VGVVNFX1NVUFBPUlQKLS8vMjAwOC8wOS8xMTpLSCBhZGQgdG8gc3VwcG9ydCBlZnVzZTwtLQotI2RlZmluZSBNQVhfRUVQUk9NX0JJTl9GSUxFX1NJWkUJCQkJMTAyNAotI2RlZmluZSBFRlVTRV9CVUZGRVJfUEFUSAkJCQkJCSIvdG1wL1JUMzB4eEVFUFJPTS5iaW4iCi0vLzIwMDgvMDkvMTE6S0ggYWRkIHRvIHN1cHBvcnQgZWZ1c2UtLT4KLSNlbmRpZiAvLyBSVE1QX0VGVVNFX1NVUFBPUlQgLy8KLQotLy8gUnhGaWx0ZXIKLSNkZWZpbmUgU1RBTk9STUFMCSAweDE3Zjk3Ci0jZGVmaW5lIEFQTk9STUFMCSAweDE1Zjk3Ci0jZGVmaW5lIFBTUFhMSU5LCSAweDE3ZjkzCi0vLwotLy8gIFJUTVBfQURBUFRFUiBmbGFncwotLy8KLSNkZWZpbmUgZlJUTVBfQURBUFRFUl9NQVBfUkVHSVNURVIgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIGZSVE1QX0FEQVBURVJfSEFSRFdBUkVfRVJST1IgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgZlJUTVBfQURBUFRFUl9TQ0FUVEVSX0dBVEhFUiAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBmUlRNUF9BREFQVEVSX1NFTkRfUEFDS0VUX0VSUk9SICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIGZSVE1QX0FEQVBURVJfTUxNRV9SRVNFVF9JTl9QUk9HUkVTUyAweDAwMDAwMDIwCi0jZGVmaW5lIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIGZSVE1QX0FEQVBURVJfVFhfUklOR19BTExPQ0FURUQgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MgICAgMHgwMDAwMDQwMAotI2RlZmluZSBmUlRNUF9BREFQVEVSX01JTU9SQVRFX0lOVVNFRCAgICAgICAweDAwMDAwODAwCi0jZGVmaW5lIGZSVE1QX0FEQVBURVJfUlhfUklOR19BTExPQ0FURUQgICAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfQUNUSVZFICAgICAgMHgwMDAwMjAwMAotI2RlZmluZSBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTICAweDAwMDA0MDAwCi0jZGVmaW5lCWZSVE1QX0FEQVBURVJfUkVBU1NPQ19JTl9QUk9HUkVTUwkweDAwMDA4MDAwCi0jZGVmaW5lCWZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfUEVORElORwkweDAwMDEwMDAwCi0jZGVmaW5lCWZSVE1QX0FEQVBURVJfUkFESU9fT0ZGCQkJCTB4MDAwMjAwMDAKLSNkZWZpbmUgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUCQkJMHgwMDA0MDAwMAotI2RlZmluZQlmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVAkJCTB4MDAwODAwMDAKLSNkZWZpbmUgZlJUTVBfQURBUFRFUl9SREdfQUNUSVZFCQkJMHgwMDEwMDAwMAotI2RlZmluZSBmUlRNUF9BREFQVEVSX0RZTkFNSUNfQkVfVFhPUF9BQ1RJVkUgMHgwMDIwMDAwMAotI2RlZmluZSBmUlRNUF9BREFQVEVSX1NDQU5fMjA0MAkJCQkweDA0MDAwMDAwCi0jZGVmaW5lCWZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQJCTB4MDgwMDAwMDAKLQotI2RlZmluZSBmUlRNUF9BREFQVEVSX1NUQVJUX1VQCQkJMHgxMDAwMDAwMAkvL0Rldml2ZSBhbHJlYWR5IGluaXRpYWxpemVkIGFuZCBlbmFibGVkIFR4L1J4LgotI2RlZmluZSBmUlRNUF9BREFQVEVSX01FRElBX1NUQVRFX0NIQU5HRSAgICAweDIwMDAwMDAwCi0jZGVmaW5lIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYgICAgICAgIDB4NDAwMDAwMDAKLQotLy8gTG9jayBiaXQgZm9yIGFjY2Vzc2luZyBkaWZmZXJlbnQgcmluZyBidWZmZXJzCi0vLyNkZWZpbmUgZlJUTVBfQURBUFRFUl9UWF9SSU5HX0JVU1kgICAgICAgIDB4ODAwMDAwMDAKLS8vI2RlZmluZSBmUlRNUF9BREFQVEVSX01HTVRfUklOR19CVVNZICAgICAgMHg0MDAwMDAwMAotLy8jZGVmaW5lIGZSVE1QX0FEQVBURVJfQVRJTV9SSU5HX0JVU1kgICAgICAweDIwMDAwMDAwCi0vLyNkZWZpbmUgZlJUTVBfQURBUFRFUl9SWF9SSU5HX0JVU1kgICAgICAgIDB4MTAwMDAwMDAKLQotLy8gTG9jayBiaXQgZm9yIGFjY2Vzc2luZyBkaWZmZXJlbnQgcXVldWUKLS8vI2RlZmluZSAgIGZSVE1QX0FEQVBURVJfVFhfUVVFVUVfQlVTWSAgICAgMHgwODAwMDAwMAotLy8jZGVmaW5lICAgZlJUTVBfQURBUFRFUl9NR01UX1FVRVVFX0JVU1kgICAweDA0MDAwMDAwCi0KLS8vCi0vLyAgU1RBIG9wZXJhdGlvbiBzdGF0dXMgZmxhZ3MKLS8vCi0jZGVmaW5lIGZPUF9TVEFUVVNfSU5GUkFfT04gICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgZk9QX1NUQVRVU19BREhPQ19PTiAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIGZPUF9TVEFUVVNfU0hPUlRfU0xPVF9JTlVTRUQgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQgICAgMHgwMDAwMDAxMAotI2RlZmluZSBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSAgICAgICAgICAgICAweDAwMDAwMDIwCi0vLyNkZWZpbmUgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEICAgMHgwMDAwMDA0MAotI2RlZmluZSBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCAgICAweDAwMDAwMDgwCi0jZGVmaW5lIGZPUF9TVEFUVVNfV01NX0lOVVNFRCAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQgICAgICAgMHgwMDAwMDIwMAotI2RlZmluZSBmT1BfU1RBVFVTX0RPWkUgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwICAvLyBkZWJ1ZyBwdXJwb3NlCi0jZGVmaW5lIGZPUF9TVEFUVVNfUElHR1lCQUNLX0lOVVNFRCAgICAgICAgIDB4MDAwMDA4MDAgIC8vIHBpZ2d5LWJhY2ssIGFuZCBhZ2dyZWdhdGlvbgotI2RlZmluZSBmT1BfU1RBVFVTX0FQU0RfSU5VU0VECQkJCTB4MDAwMDEwMDAKLSNkZWZpbmUgZk9QX1NUQVRVU19UWF9BTVNEVV9JTlVTRUQJCQkweDAwMDAyMDAwCi0jZGVmaW5lIGZPUF9TVEFUVVNfTUFYX1JFVFJZX0VOQUJMRUQJCTB4MDAwMDQwMDAKLSNkZWZpbmUgZk9QX1NUQVRVU19XQUtFVVBfTk9XICAgICAgICAgICAgICAgMHgwMDAwODAwMAotI2RlZmluZSBmT1BfU1RBVFVTX1BDSUVfREVWSUNFICAgICAgIDB4MDAwMjAwMDAKLQotLy8KLS8vICBSVE1QX0FEQVBURVIgUFNGbGFncyA6IHJlbGF0ZWQgdG8gYWR2YW5jZWQgcG93ZXIgc2F2ZS4KLS8vCi0vLyBJbmRpY2F0ZSB3aGV0aGVyIGRyaXZlciBjYW4gZ28gdG8gc2xlZXAgbW9kZSBmcm9tIG5vdy4gVGhpcyBmbGFnIGlzIHVzZWZ1bCBBRlRFUiBsaW5rIHVwCi0jZGVmaW5lIGZSVE1QX1BTX0NBTl9HT19TTEVFUCAgICAgICAgICAweDAwMDAwMDAxCi0vLyBJbmRpY2F0ZSB3aGV0aGVyIGRyaXZlciBoYXMgaXNzdWUgYSBMaW5rQ29udHJvbCBjb21tYW5kIHRvIFBDSWUgTDEKLSNkZWZpbmUgZlJUTVBfUFNfU0VUX1BDSV9DTEtfT0ZGX0NPTU1BTkQgICAgICAgICAgMHgwMDAwMDAwMgotLy8gSW5kaWNhdGUgZHJpdmVyIHNob3VsZCBkaXNhYmxlIGtpY2sgb2ZmIGhhcmR3YXJlIHRvIHNlbmQgcGFja2V0cyBmcm9tIG5vdy4KLSNkZWZpbmUgZlJUTVBfUFNfRElTQUJMRV9UWCAgICAgICAgIDB4MDAwMDAwMDQKLS8vIEluZGljYXRlIGRyaXZlciBzaG91bGQgSU1NRURJQVRFTFkgZm8gdG8gc2xlZXAgYWZ0ZXIgcmVjZWl2aW5nIEFQJ3MgYmVhY29uIGluIHdoaWNoICBkb2Vzbid0IGluZGljYXRlIHVuaWNhdGUgbm9yIG11bHRpY2FzdCBwYWNrZXRzIGZvciBtZQotLy8uIFRoaXMgZmxhZyBpcyB1c2VkIE9OTFkgaW4gUlRNUEhhbmRsZVJ4RG9uZUludGVycnVwdCByb3V0aW5lLgotI2RlZmluZSBmUlRNUF9QU19HT19UT19TTEVFUF9OT1cgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIGZSVE1QX1BTX1RPR0dMRV9MMQkJMHgwMDAwMDAxMAkvLyBVc2UgVG9nZ2xlIEwxIG1lY2hhbmlzbSBmb3IgcnQyOHh4IFBDSWUKLSNpZmRlZiBSVDMwOTAKLSNkZWZpbmUgV0FLRV9NQ1VfQ01ECQkJCTB4MzEKLSNkZWZpbmUgU0xFRVBfTUNVX0NNRAkJCQkJMHgzMAotI2RlZmluZSBSRk9GRl9NQ1VfQ01ECQkJCTB4MzUKLSNlbmRpZiAvLyBSVDMwOTAgLy8KLSNpZmRlZiBET1QxMU5fRFJBRlQzCi0jZGVmaW5lIGZPUF9TVEFUVVNfU0NBTl8yMDQwCQkJICAgIDB4MDAwNDAwMDAKLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0KLSNkZWZpbmUgQ0NLU0VUUFJPVEVDVAkJMHgxCi0jZGVmaW5lIE9GRE1TRVRQUk9URUNUCQkweDIKLSNkZWZpbmUgTU0yMFNFVFBST1RFQ1QJCTB4NAotI2RlZmluZSBNTTQwU0VUUFJPVEVDVAkJMHg4Ci0jZGVmaW5lIEdGMjBTRVRQUk9URUNUCQkweDEwCi0jZGVmaW5lIEdSNDBTRVRQUk9URUNUCQkweDIwCi0jZGVmaW5lIEFMTE5fU0VUUFJPVEVDVAkJKEdSNDBTRVRQUk9URUNUIHwgR0YyMFNFVFBST1RFQ1QgfCBNTTQwU0VUUFJPVEVDVCB8IE1NMjBTRVRQUk9URUNUKQotCi0vLwotLy8gIEFQJ3MgY2xpZW50IHRhYmxlIG9wZXJhdGlvbiBzdGF0dXMgZmxhZ3MKLS8vCi0jZGVmaW5lIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFICAgICAgICAgIDB4MDAwMDAwMDEgIC8vIENMSUVOVCBjYW4gcGFyc2UgUU9TIERBVEEgZnJhbWUKLSNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSAgMHgwMDAwMDAwMiAgLy8gQ0xJRU5UIGNhbiByZWNlaXZlIFJhbGluaydzIHByb3ByaWV0YXJ5IFRYIGFnZ3JlZ2F0aW9uIGZyYW1lCi0jZGVmaW5lIGZDTElFTlRfU1RBVFVTX1BJR0dZQkFDS19DQVBBQkxFICAgIDB4MDAwMDAwMDQgIC8vIENMSUVOVCBzdXBwb3J0IHBpZ2d5LWJhY2sKLSNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VECQkJMHgwMDAwMDAwOAotI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFCQkweDAwMDAwMDEwCi0jZGVmaW5lIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUJCTB4MDAwMDAwMjAKLSNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUJCTB4MDAwMDAwNDAKLSNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfUnhTVEJDX0NBUEFCTEUJCTB4MDAwMDAwODAKLSNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfSFRDX0NBUEFCTEUJCQkweDAwMDAwMTAwCi0jZGVmaW5lIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFCQkJMHgwMDAwMDIwMAotI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19NQ1NGRUVEQkFDS19DQVBBQkxFICAweDAwMDAwNDAwCi0jZGVmaW5lIGZDTElFTlRfU1RBVFVTX0FQU0RfQ0FQQUJMRSAgICAgICAgIDB4MDAwMDA4MDAgIC8qIFVBUFNEIFNUQVRJT04gKi8KLQotI2lmZGVmIERPVDExTl9EUkFGVDMKLSNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfQlNTQ09FWElTVF9DQVBBQkxFCTB4MDAwMDEwMDAKLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0KLSNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQJCTB4MDAxMDAwMDAKLS8vCi0vLyAgU1RBIGNvbmZpZ3VyYXRpb24gZmxhZ3MKLS8vCi0vLyNkZWZpbmUgZlNUQV9DRkdfRU5BQkxFX1RYX0JVUlNUICAgICAgICAgIDB4MDAwMDAwMDEKLQotLy8gODAyLjExbiBPcGVyYXRpbmcgTW9kZSBEZWZpbml0aW9uLiAwLTMgYWxzbyB1c2VkIGluIEFTSUNVUGRhdGVQcm90ZWN0IHN3aXRjaCBjYXNlCi0jZGVmaW5lIEhUX05PX1BST1RFQ1QJMAotI2RlZmluZSBIVF9MRUdBQ1lfUFJPVEVDVAkxCi0jZGVmaW5lIEhUXzQwX1BST1RFQ1QJMgotI2RlZmluZSBIVF8yMDQwX1BST1RFQ1QJMwotI2RlZmluZSBIVF9SVFNDVFNfNk0JNwotLy9mb2xsb3dpbmcgaXMgb3VyIG93biBkZWZpbml0aW9uIGluIG9yZGVyIHRvIHR1cm4gb24gb3VyIEFTSUMgcHJvdGVjdGlvbiByZWdpc3RlciBpbiBJTkZSQVNUUlVDVFVSRS4KLSNkZWZpbmUgSFRfQVRIRVJPUwk4CS8vIHJ0Mjg2MGMgaGFzIHByb2JsZW0gd2l0aCBhdGhlcm9zIGNoaXAuIHdlIG5lZWQgdG8gdHVybiBvbiBSVFMvQ1RTIC4KLSNkZWZpbmUgSFRfRk9SQ0VSVFNDVFMJOQkvLyBGb3JjZSB0dXJuIG9uIFJUUy9DVFMgZmlyc3QuIHRoZW4gZ28gdG8gZXZhbHVhdGUgaWYgdGhpcyBmb3JjZSBSVFMgaXMgbmVjZXNzYXJ5LgotCi0vLwotLy8gUlggUGFja2V0IEZpbHRlciBjb250cm9sIGZsYWdzLiBBcHBseSBvbiBwQWQtPlBhY2tldEZpbHRlcgotLy8KLSNkZWZpbmUgZlJYX0ZJTFRFUl9BQ0NFUFRfRElSRUNUICAgICAgICAgICAgTkRJU19QQUNLRVRfVFlQRV9ESVJFQ1RFRAotI2RlZmluZSBmUlhfRklMVEVSX0FDQ0VQVF9NVUxUSUNBU1QgICAgICAgICBORElTX1BBQ0tFVF9UWVBFX01VTFRJQ0FTVAotI2RlZmluZSBmUlhfRklMVEVSX0FDQ0VQVF9CUk9BRENBU1QgICAgICAgICBORElTX1BBQ0tFVF9UWVBFX0JST0FEQ0FTVAotI2RlZmluZSBmUlhfRklMVEVSX0FDQ0VQVF9BTExfTVVMVElDQVNUICAgICBORElTX1BBQ0tFVF9UWVBFX0FMTF9NVUxUSUNBU1QKLSNkZWZpbmUgZlJYX0ZJTFRFUl9BQ0NFUFRfUFJPTUlTQ1VPVVMgICAgICAgTkRJU19QQUNLRVRfVFlQRV9QUk9NSVNDVU9VUwotCi0vLwotLy8gRXJyb3IgY29kZSBzZWN0aW9uCi0vLwotLy8gTkRJU19FUlJPUl9DT0RFX0FEQVBURVJfTk9UX0ZPVU5ECi0jZGVmaW5lIEVSUkxPR19SRUFEX1BDSV9TTE9UX0ZBSUxFRCAgICAgMHgwMDAwMDEwMUwKLSNkZWZpbmUgRVJSTE9HX1dSSVRFX1BDSV9TTE9UX0ZBSUxFRCAgICAweDAwMDAwMTAyTAotI2RlZmluZSBFUlJMT0dfVkVORE9SX0RFVklDRV9OT01BVENIICAgIDB4MDAwMDAxMDNMCi0KLS8vIE5ESVNfRVJST1JfQ09ERV9BREFQVEVSX0RJU0FCTEVECi0jZGVmaW5lIEVSUkxPR19CVVNfTUFTVEVSX0RJU0FCTEVEICAgICAgMHgwMDAwMDIwMUwKLQotLy8gTkRJU19FUlJPUl9DT0RFX1VOU1VQUE9SVEVEX0NPTkZJR1VSQVRJT04KLSNkZWZpbmUgRVJSTE9HX0lOVkFMSURfU1BFRURfRFVQTEVYICAgICAweDAwMDAwMzAxTAotI2RlZmluZSBFUlJMT0dfU0VUX1NFQ09OREFSWV9GQUlMRUQgICAgIDB4MDAwMDAzMDJMCi0KLS8vIE5ESVNfRVJST1JfQ09ERV9PVVRfT0ZfUkVTT1VSQ0VTCi0jZGVmaW5lIEVSUkxPR19PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgMHgwMDAwMDQwMUwKLSNkZWZpbmUgRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZICAgICAweDAwMDAwNDAyTAotI2RlZmluZSBFUlJMT0dfT1VUX09GX01BUF9SRUdJU1RFUlMgICAgIDB4MDAwMDA0MDNMCi0jZGVmaW5lIEVSUkxPR19PVVRfT0ZfQlVGRkVSX1BPT0wgICAgICAgMHgwMDAwMDQwNEwKLSNkZWZpbmUgRVJSTE9HX09VVF9PRl9ORElTX0JVRkZFUiAgICAgICAweDAwMDAwNDA1TAotI2RlZmluZSBFUlJMT0dfT1VUX09GX1BBQ0tFVF9QT09MICAgICAgIDB4MDAwMDA0MDZMCi0jZGVmaW5lIEVSUkxPR19PVVRfT0ZfTkRJU19QQUNLRVQgICAgICAgMHgwMDAwMDQwN0wKLSNkZWZpbmUgRVJSTE9HX09VVF9PRl9MT09LQVNJREVfTUVNT1JZICAweDAwMDAwNDA4TAotCi0vLyBORElTX0VSUk9SX0NPREVfSEFSRFdBUkVfRkFJTFVSRQotI2RlZmluZSBFUlJMT0dfU0VMRlRFU1RfRkFJTEVEICAgICAgICAgIDB4MDAwMDA1MDFMCi0jZGVmaW5lIEVSUkxPR19JTklUSUFMSVpFX0FEQVBURVIgICAgICAgMHgwMDAwMDUwMkwKLSNkZWZpbmUgRVJSTE9HX1JFTU9WRV9NSU5JUE9SVCAgICAgICAgICAweDAwMDAwNTAzTAotCi0vLyBORElTX0VSUk9SX0NPREVfUkVTT1VSQ0VfQ09ORkxJQ1QKLSNkZWZpbmUgRVJSTE9HX01BUF9JT19TUEFDRSAgICAgICAgICAgICAweDAwMDAwNjAxTAotI2RlZmluZSBFUlJMT0dfUVVFUllfQURBUFRFUl9SRVNPVVJDRVMgIDB4MDAwMDA2MDJMCi0jZGVmaW5lIEVSUkxPR19OT19JT19SRVNPVVJDRSAgICAgICAgICAgMHgwMDAwMDYwM0wKLSNkZWZpbmUgRVJSTE9HX05PX0lOVEVSUlVQVF9SRVNPVVJDRSAgICAweDAwMDAwNjA0TAotI2RlZmluZSBFUlJMT0dfTk9fTUVNT1JZX1JFU09VUkNFICAgICAgIDB4MDAwMDA2MDVMCi0KLQotLy8gV0RTIGRlZmluaXRpb24KLSNkZWZpbmUJTUFYX1dEU19FTlRSWSAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgV0RTX1BBSVJXSVNFX0tFWV9PRkZTRVQgICAgIDYwICAgIC8vIFdEUyBsaW5rcyB1c2VzIHBhaXJ3aXNlIGtleSM2MCB+IDYzIGluIEFTSUMgcGFpcndpc2Uga2V5IHRhYmxlCi0KLSNkZWZpbmUJV0RTX0RJU0FCTEVfTU9ERSAgICAgICAgICAgIDAKLSNkZWZpbmUJV0RTX1JFU1RSSUNUX01PREUgICAgICAgICAgIDEKLSNkZWZpbmUJV0RTX0JSSURHRV9NT0RFICAgICAgICAgICAgIDIKLSNkZWZpbmUJV0RTX1JFUEVBVEVSX01PREUgICAgICAgICAgIDMKLSNkZWZpbmUJV0RTX0xBWllfTU9ERSAgICAgICAgICAgICAgIDQKLQotCi0jZGVmaW5lIE1BWF9NRVNIX05VTQkJCQkwCi0KLSNkZWZpbmUgTUFYX0FQQ0xJX05VTQkJCQkwCi0jaWZkZWYgQVBDTElfU1VQUE9SVAotI3VuZGVmCU1BWF9BUENMSV9OVU0KLSNkZWZpbmUgTUFYX0FQQ0xJX05VTQkJCQkxCi0jZW5kaWYgLy8gQVBDTElfU1VQUE9SVCAvLwotCi0jZGVmaW5lIE1BWF9NQlNTSURfTlVNCQkJCTEKLSNpZmRlZiBNQlNTX1NVUFBPUlQKLSN1bmRlZglNQVhfTUJTU0lEX05VTQotI2RlZmluZSBNQVhfTUJTU0lEX05VTQkJCQkoOCAtIE1BWF9NRVNIX05VTSAtIE1BWF9BUENMSV9OVU0pCi0jZW5kaWYgLy8gTUJTU19TVVBQT1JUIC8vCi0KLS8qIHNhbml0eSBjaGVjayBmb3IgYXBpZHggKi8KLSNkZWZpbmUgTUJTU19NUl9BUElEWF9TQU5JVFlfQ0hFQ0soYXBpZHgpIFwKLSAgICB7IGlmIChhcGlkeCA+IE1BWF9NQlNTSURfTlVNKSB7IFwKLSAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcz4gRXJyb3IhIGFwaWR4ID0gJWQgPiBNQVhfTUJTU0lEX05VTSFcbiIsIF9fRlVOQ1RJT05fXywgYXBpZHgpKTsgXAotCSAgYXBpZHggPSBNQUlOX01CU1NJRDsgfSB9Ci0KLSNkZWZpbmUgVkFMSURfV0NJRChfd2NpZCkJKChfd2NpZCkgPiAwICYmIChfd2NpZCkgPCBNQVhfTEVOX09GX01BQ19UQUJMRSApCi0KLSNkZWZpbmUgTUFJTl9NQlNTSUQgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgRklSU1RfTUJTU0lEICAgICAgICAgICAgICAgIDEKLQotCi0jZGVmaW5lIE1BWF9CRUFDT05fU0laRQkJCQk1MTIKLS8vIElmIHRoZSBNQVhfTUJTU0lEX05VTSBpcyBsYXJnZXIgdGhhbiA2LAotLy8gaXQgc2hhbGwgcmVzZXJ2ZSBzb21lIFdDSUQgc3BhY2Uod2NpZCAyMjJ+MjUzKSBmb3IgYmVhY29uIGZyYW1lcy4KLS8vIC0JdGhlc2Ugd2NpZCAyMzh+MjUzIGFyZSByZXNlcnZlZCBmb3IgYmVhY29uIzYocmE2KS4KLS8vIC0JdGhlc2Ugd2NpZCAyMjJ+MjM3IGFyZSByZXNlcnZlZCBmb3IgYmVhY29uIzcocmE3KS4KLSNpZiBkZWZpbmVkKE1BWF9NQlNTSURfTlVNKSAmJiAoTUFYX01CU1NJRF9OVU0gPT0gOCkKLSNkZWZpbmUgSFdfUkVTRVJWRURfV0NJRAkyMjIKLSNlbGlmIGRlZmluZWQoTUFYX01CU1NJRF9OVU0pICYmIChNQVhfTUJTU0lEX05VTSA9PSA3KQotI2RlZmluZSBIV19SRVNFUlZFRF9XQ0lECTIzOAotI2Vsc2UKLSNkZWZpbmUgSFdfUkVTRVJWRURfV0NJRAkyNTUKLSNlbmRpZgotCi0vLyBUaGVuIGRlZGljYXRlIHdjaWQgb2YgREZTIGFuZCBDYXJyaWVyLVNlbnNlLgotI2RlZmluZSBERlNfQ1RTX1dDSUQJCShIV19SRVNFUlZFRF9XQ0lEIC0gMSkKLSNkZWZpbmUgQ1NfQ1RTX1dDSUQJCShIV19SRVNFUlZFRF9XQ0lEIC0gMikKLSNkZWZpbmUgTEFTVF9TUEVDSUZJQ19XQ0lECShIV19SRVNFUlZFRF9XQ0lEIC0gMikKLQotLy8gSWYgTUFYX01CU1NJRF9OVU0gaXMgOCwgdGhlIG1heGltdW0gYXZhaWxhYmxlIHdjaWQgZm9yIHRoZSBhc3NvY2lhdGVkIFNUQSBpcyAyMTEuCi0vLyBJZiBNQVhfTUJTU0lEX05VTSBpcyA3LCB0aGUgbWF4aW11bSBhdmFpbGFibGUgd2NpZCBmb3IgdGhlIGFzc29jaWF0ZWQgU1RBIGlzIDIyOC4KLSNkZWZpbmUgTUFYX0FWQUlMQUJMRV9DTElFTlRfV0NJRAkoTEFTVF9TUEVDSUZJQ19XQ0lEIC0gTUFYX01CU1NJRF9OVU0gLSAxKQotCi0vLyBUWCBuZWVkIFdDSUQgdG8gZmluZCBDaXBoZXIgS2V5Ci0vLyB0aGVzZSB3Y2lkIDIxMiB+IDIxOSBhcmUgcmVzZXJ2ZWQgZm9yIGJjL21jIHBhY2tldHMgaWYgTUFYX01CU1NJRF9OVU0gaXMgOC4KLSNkZWZpbmUgR0VUX0dyb3VwS2V5X1dDSUQoX193Y2lkLCBfX2Jzc2lkeCkgXAotCXsJCQkJCQkJCQkJXAotCQlfX3djaWQgPSBMQVNUX1NQRUNJRklDX1dDSUQgLSAoTUFYX01CU1NJRF9OVU0pICsgX19ic3NpZHg7CVwKLQl9Ci0KLSNkZWZpbmUgSXNHcm91cEtleVdDSUQoX193Y2lkKSAoKChfX3djaWQpIDwgTEFTVF9TUEVDSUZJQ19XQ0lEKSAmJiAoKF9fd2NpZCkgPj0gKExBU1RfU1BFQ0lGSUNfV0NJRCAtIChNQVhfTUJTU0lEX05VTSkpKSkKLQotCi0vLyBkZWZpbml0aW9uIHRvIHN1cHBvcnQgbXVsdGlwbGUgQlNTSUQKLSNkZWZpbmUgQlNTMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEJTUzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBCU1MyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgQlNTMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIEJTUzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBCU1M1ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgQlNTNiAgICAgICAgICAgICAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIEJTUzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgNwotCi0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBMZW5ndGggZGVmaW5pdGlvbnMKLSNkZWZpbmUgUEVFUl9LRVlfTk8gICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIE1BQ19BRERSX0xFTiAgICAgICAgICAgICAgICAgICAgNgotI2RlZmluZSBUSU1FU1RBTVBfTEVOICAgICAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMgICAgICBNQVhfTEVOR1RIX09GX1NVUFBPUlRfUkFURVMgLy8gMSwgMiwgNS41LCAxMSwgNiwgOSwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA1NAotI2RlZmluZSBNQVhfTlVNX09GX1JFR1VMQVRPUllfQ0xBU1MJCTE2Ci0jZGVmaW5lIE1BWF9MRU5fT0ZfS0VZICAgICAgICAgICAgICAgICAgMzIgICAgICAvLyAzMiBvY3RldHMgPT0gMjU2IGJpdHMsIFJlZGVmaW5lIGZvciBXUEEKLSNkZWZpbmUgTUFYX05VTV9PRl9DSEFOTkVMUyAgICAgICAgICAgICBNQVhfTlVNX09GX0NIUyAgICAgIC8vIDE0IGNoYW5uZWxzIEAyLjRHICsgIDEyQFVOSUkgKyA0IEBNTUFDICsgMTEgQEhpcGVyTEFOMiArIDcgQEphcGFuICsgMSBhcyBOVUxMIHRlcm1pbmF0aW9uCi0jZGVmaW5lIE1BWF9OVU1fT0ZfMTFKQ0hBTk5FTFMgICAgICAgICAgICAgMjAgICAgICAvLyAxNCBjaGFubmVscyBAMi40RyArICAxMkBVTklJICsgNCBATU1BQyArIDExIEBIaXBlckxBTjIgKyA3IEBKYXBhbiArIDEgYXMgTlVMTCB0ZXJtaW5hdGlvbgotI2RlZmluZSBNQVhfTEVOX09GX1NTSUQgICAgICAgICAgICAgICAgIDMyCi0jZGVmaW5lIENJUEhFUl9URVhUX0xFTiAgICAgICAgICAgICAgICAgMTI4Ci0jZGVmaW5lIEhBU0hfVEFCTEVfU0laRSAgICAgICAgICAgICAgICAgMjU2Ci0jZGVmaW5lIE1BWF9WSUVfTEVOICAgICAgICAgICAgICAgICAgICAgMTAyNCAgIC8vIE5ldyBmb3IgV1BBIGNpcGhlciBzdWl0ZSB2YXJpYWJsZSBJRSBzaXplcy4KLSNkZWZpbmUgTUFYX1NVUFBPUlRfTUNTICAgICAgICAgICAgIDMyCi0jZGVmaW5lIE1BWF9OVU1fT0ZfQkJQX0xBVENIICAgICAgICAgICAgIDE0MAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIEFTSUMgV0NJRCBUYWJsZSBkZWZpbml0aW9uLgotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSNkZWZpbmUgQlNTSURfV0NJRAkJMQkvLyBpbiBpbmZyYSBtb2RlLCBhbHdheXMgcHV0IGJzc2lkIHdpdGggdGhpcyBXQ0lECi0jZGVmaW5lIE1DQVNUX1dDSUQJMHgwCi0jZGVmaW5lIEJTUzBNY2FzdF9XQ0lECTB4MAotI2RlZmluZSBCU1MxTWNhc3RfV0NJRAkweGY4Ci0jZGVmaW5lIEJTUzJNY2FzdF9XQ0lECTB4ZjkKLSNkZWZpbmUgQlNTM01jYXN0X1dDSUQJMHhmYQotI2RlZmluZSBCU1M0TWNhc3RfV0NJRAkweGZiCi0jZGVmaW5lIEJTUzVNY2FzdF9XQ0lECTB4ZmMKLSNkZWZpbmUgQlNTNk1jYXN0X1dDSUQJMHhmZAotI2RlZmluZSBCU1M3TWNhc3RfV0NJRAkweGZlCi0jZGVmaW5lIFJFU0VSVkVEX1dDSUQJCTB4ZmYKLQotI2RlZmluZSBNQVhfTlVNX09GX0FDTF9MSVNUCQkJCU1BWF9OVU1CRVJfT0ZfQUNMCi0KLSNkZWZpbmUgTUFYX0xFTl9PRl9NQUNfVEFCTEUgICAgICAgICAgICBNQVhfTlVNQkVSX09GX01BQyAvLyBpZiBNQVhfTUJTU0lEX05VTSBpcyA4LCB0aGlzIHZhbHVlIGNhbid0IGJlIGxhcmdlciB0aGFuIDIxMQotCi0jaWYgTUFYX0xFTl9PRl9NQUNfVEFCTEU+TUFYX0FWQUlMQUJMRV9DTElFTlRfV0NJRAotI2Vycm9yIE1BWF9MRU5fT0ZfTUFDX1RBQkxFIGNhbiBub3QgYmUgbGFyZ2VyIHRoYW4gTUFYX0FWQUlMQUJMRV9DTElFTlRfV0NJRCEhISEKLSNlbmRpZgotCi0jZGVmaW5lIE1BWF9OVU1fT0ZfV0RTX0xJTktfUEVSQlNTSUQJICAgICAgICAgICAgMwotI2RlZmluZSBNQVhfTlVNX09GX1dEU19MSU5LCSAgICAgICAgICAgIChNQVhfTlVNX09GX1dEU19MSU5LX1BFUkJTU0lEKk1BWF9NQlNTSURfTlVNKQotI2RlZmluZSBNQVhfTlVNX09GX0VWRU5UICAgICAgICAgICAgICAgIE1BWF9OVU1CRVJfT0ZfRVZFTlQKLSNkZWZpbmUgV0RTX0xJTktfU1RBUlRfV0NJRAkJCQkoTUFYX0xFTl9PRl9NQUNfVEFCTEUtMSkKLQotI2RlZmluZSBOVU1fT0ZfVElECQkJOAotI2RlZmluZSBNQVhfQUlEX0JBICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFICAgICAgICAgICgoTlVNX09GX1RJRCAqIE1BWF9MRU5fT0ZfTUFDX1RBQkxFKS8yKS8vICAgKE5VTV9PRl9USUQqTUFYX0FJRF9CQSArIDMyKQkgLy9CbG9jayBBQ0sgcmVjaXBpZW50Ci0jZGVmaW5lIE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFICAgICAgICAgICgoTlVNX09GX1RJRCAqIE1BWF9MRU5fT0ZfTUFDX1RBQkxFKS8yKS8vICAgKE5VTV9PRl9USUQqTUFYX0FJRF9CQSArIDMyKSAgIC8vIEJsb2NrIEFDSyBvcmlnaW5hdG9yCi0jZGVmaW5lIE1BWF9MRU5fT0ZfQlNTX1RBQkxFICAgICAgICAgICAgIDY0Ci0jZGVmaW5lIE1BWF9SRU9SREVSSU5HX01QRFVfTlVNCQkJIDUxMgotCi0vLyBrZXkgcmVsYXRlZCBkZWZpbml0aW9ucwotI2RlZmluZSBTSEFSRV9LRVlfTlVNICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgTUFYX0xFTl9PRl9TSEFSRV9LRVkgICAgICAgICAgICAxNiAgICAvLyBieXRlIGNvdW50Ci0jZGVmaW5lIE1BWF9MRU5fT0ZfUEVFUl9LRVkgICAgICAgICAgICAgMTYgICAgLy8gYnl0ZSBjb3VudAotI2RlZmluZSBQQUlSV0lTRV9LRVlfTlVNICAgICAgICAgICAgICAgIDY0ICAgIC8vIGluIE1BQyBBU0lDIHBhaXJ3aXNlIGtleSB0YWJsZQotI2RlZmluZSBHUk9VUF9LRVlfTlVNICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgUE1LX0xFTiAgICAgICAgICAgICAgICAgICAgICAgICAzMgotI2RlZmluZSBXRFNfUEFJUldJU0VfS0VZX09GRlNFVCAgICAgICAgIDYwICAgIC8vIFdEUyBsaW5rcyB1c2VzIHBhaXJ3aXNlIGtleSM2MCB+IDYzIGluIEFTSUMgcGFpcndpc2Uga2V5IHRhYmxlCi0jZGVmaW5lCVBNS0lEX05PICAgICAgICAgICAgICAgICAgICAgICAgNCAgICAgLy8gTnVtYmVyIG9mIFBNS0lEIHNhdmVkIHN1cHBvcnRlZAotI2RlZmluZSBNQVhfTEVOX09GX01MTUVfQlVGRkVSICAgICAgICAgIDIwNDgKLQotLy8gcG93ZXIgc3RhdHVzIHJlbGF0ZWQgZGVmaW5pdGlvbnMKLSNkZWZpbmUgUFdSX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFBXUl9TQVZFICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBQV1JfTU1QUyAgICAgICAgICAgICAgICAgICAgICAgIDIJCQkvL01JTU8gcG93ZXIgc2F2ZQotLy8jZGVmaW5lIFBXUl9VTktOT1dOICAgICAgICAgICAgICAgICAgIDIKLQotLy8gQXV0aCBhbmQgQXNzb2MgbW9kZSByZWxhdGVkIGRlZmluaXRpb25zCi0jZGVmaW5lIEFVVEhfTU9ERV9PUEVOICAgICAgICAgICAgICAgICAgMHgwMAotI2RlZmluZSBBVVRIX01PREVfS0VZICAgICAgICAgICAgICAgICAgIDB4MDEKLS8vI2RlZmluZSBBVVRIX01PREVfQVVUT19TV0lUQ0ggICAgICAgICAweDAzCi0vLyNkZWZpbmUgQVVUSF9NT0RFX0RFQVVUSCAgICAgICAgICAgICAgMHgwNAotLy8jZGVmaW5lIEFVVEhfTU9ERV9VUExBWUVSICAgICAgICAgICAgIDB4MDUgLy8gcmVzZXJ2ZWQgZm9yIDgwMi4xMWkgdXNlCi0KLS8vIEJTUyBUeXBlIGRlZmluaXRpb25zCi0jZGVmaW5lIEJTU19BREhPQyAgICAgICAgICAgICAgICAgICAgICAgMCAgLy8gPSBOZGlzODAyXzExSUJTUwotI2RlZmluZSBCU1NfSU5GUkEgICAgICAgICAgICAgICAgICAgICAgIDEgIC8vID0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlCi0jZGVmaW5lIEJTU19BTlkgICAgICAgICAgICAgICAgICAgICAgICAgMiAgLy8gPSBOZGlzODAyXzExQXV0b1Vua25vd24KLSNkZWZpbmUgQlNTX01PTklUT1IJCQkgICAgICAgICAgICAzICAvLyA9IE5kaXM4MDJfMTFNb25pdG9yCi0KLQotLy8gUmVhc29uIGNvZGUgZGVmaW5pdGlvbnMKLSNkZWZpbmUgUkVBU09OX1JFU0VSVkVEICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFJFQVNPTl9VTlNQRUNJRlkgICAgICAgICAgICAgICAgMQotI2RlZmluZSBSRUFTT05fTk9fTE9OR0VSX1ZBTElEICAgICAgICAgIDIKLSNkZWZpbmUgUkVBU09OX0RFQVVUSF9TVEFfTEVBVklORyAgICAgICAzCi0jZGVmaW5lIFJFQVNPTl9ESVNBU1NPQ19JTkFDVElWRSAgICAgICAgNAotI2RlZmluZSBSRUFTT05fRElTQVNTUENfQVBfVU5BQkxFICAgICAgIDUKLSNkZWZpbmUgUkVBU09OX0NMUzJFUlIgICAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIFJFQVNPTl9DTFMzRVJSICAgICAgICAgICAgICAgICAgNwotI2RlZmluZSBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcgICAgIDgKLSNkZWZpbmUgUkVBU09OX1NUQV9SRVFfQVNTT0NfTk9UX0FVVEggICA5Ci0jZGVmaW5lIFJFQVNPTl9JTlZBTElEX0lFICAgICAgICAgICAgICAgMTMKLSNkZWZpbmUgUkVBU09OX01JQ19GQUlMVVJFICAgICAgICAgICAgICAxNAotI2RlZmluZSBSRUFTT05fNF9XQVlfVElNRU9VVCAgICAgICAgICAgIDE1Ci0jZGVmaW5lIFJFQVNPTl9HUk9VUF9LRVlfSFNfVElNRU9VVCAgICAgMTYKLSNkZWZpbmUgUkVBU09OX0lFX0RJRkZFUkVOVCAgICAgICAgICAgICAxNwotI2RlZmluZSBSRUFTT05fTUNJUEhFUl9OT1RfVkFMSUQgICAgICAgIDE4Ci0jZGVmaW5lIFJFQVNPTl9VQ0lQSEVSX05PVF9WQUxJRCAgICAgICAgMTkKLSNkZWZpbmUgUkVBU09OX0FLTVBfTk9UX1ZBTElEICAgICAgICAgICAyMAotI2RlZmluZSBSRUFTT05fVU5TVVBQT1JUX1JTTkVfVkVSICAgICAgIDIxCi0jZGVmaW5lIFJFQVNPTl9JTlZBTElEX1JTTkVfQ0FQICAgICAgICAgMjIKLSNkZWZpbmUgUkVBU09OXzgwMjFYX0FVVEhfRkFJTCAgICAgICAgICAyMwotI2RlZmluZSBSRUFTT05fQ0lQSEVSX1NVSVRFX1JFSkVDVEVEICAgIDI0Ci0jZGVmaW5lIFJFQVNPTl9ERUNMSU5FRCAgICAgICAgICAgICAgICAgMzcKLQotI2RlZmluZSBSRUFTT05fUU9TX1VOU1BFQ0lGWSAgICAgICAgICAgICAgMzIKLSNkZWZpbmUgUkVBU09OX1FPU19MQUNLX0JBTkRXSURUSCAgICAgICAgIDMzCi0jZGVmaW5lIFJFQVNPTl9QT09SX0NIQU5ORUxfQ09ORElUSU9OICAgICAzNAotI2RlZmluZSBSRUFTT05fUU9TX09VVFNJREVfVFhPUF9MSU1JVElPTiAgMzUKLSNkZWZpbmUgUkVBU09OX1FPU19RU1RBX0xFQVZJTkdfUUJTUyAgICAgIDM2Ci0jZGVmaW5lIFJFQVNPTl9RT1NfVU5XQU5URURfTUVDSEFOSVNNICAgICAzNwotI2RlZmluZSBSRUFTT05fUU9TX01FQ0hfU0VUVVBfUkVRVUlSRUQgICAgMzgKLSNkZWZpbmUgUkVBU09OX1FPU19SRVFVRVNUX1RJTUVPVVQgICAgICAgIDM5Ci0jZGVmaW5lIFJFQVNPTl9RT1NfQ0lQSEVSX05PVF9TVVBQT1JUICAgICA0NQotCi0vLyBTdGF0dXMgY29kZSBkZWZpbml0aW9ucwotI2RlZmluZSBNTE1FX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTUxNRV9VTlNQRUNJRllfRkFJTCAgICAgICAgICAgICAxCi0jZGVmaW5lIE1MTUVfQ0FOTk9UX1NVUFBPUlRfQ0FQICAgICAgICAgMTAKLSNkZWZpbmUgTUxNRV9SRUFTU09DX0RFTllfQVNTT0NfRVhJU1QgICAxMQotI2RlZmluZSBNTE1FX0FTU09DX0RFTllfT1VUX1NDT1BFICAgICAgIDEyCi0jZGVmaW5lIE1MTUVfQUxHX05PVF9TVVBQT1JUICAgICAgICAgICAgMTMKLSNkZWZpbmUgTUxNRV9TRVFfTlJfT1VUX09GX1NFUVVFTkNFICAgICAxNAotI2RlZmluZSBNTE1FX1JFSl9DSEFMTEVOR0VfRkFJTFVSRSAgICAgIDE1Ci0jZGVmaW5lIE1MTUVfUkVKX1RJTUVPVVQgICAgICAgICAgICAgICAgICAxNgotI2RlZmluZSBNTE1FX0FTU09DX1JFSl9VTkFCTEVfSEFORExFX1NUQSAgMTcKLSNkZWZpbmUgTUxNRV9BU1NPQ19SRUpfREFUQV9SQVRFICAgICAgICAgIDE4Ci0KLSNkZWZpbmUgTUxNRV9BU1NPQ19SRUpfTk9fRVhUX1JBVEUgICAgICAgIDIyCi0jZGVmaW5lIE1MTUVfQVNTT0NfUkVKX05PX0VYVF9SQVRFX1BCQ0MgICAyMwotI2RlZmluZSBNTE1FX0FTU09DX1JFSl9OT19DQ0tfT0ZETSAgICAgICAgMjQKLQotI2RlZmluZSBNTE1FX1FPU19VTlNQRUNJRlkgICAgICAgICAgICAgICAgMzIKLSNkZWZpbmUgTUxNRV9SRVFVRVNUX0RFQ0xJTkVEICAgICAgICAgICAgIDM3Ci0jZGVmaW5lIE1MTUVfUkVRVUVTVF9XSVRIX0lOVkFMSURfUEFSQU0gICAzOAotI2RlZmluZSBNTE1FX0lOVkFMSURfR1JPVVBfQ0lQSEVSCSAgNDEKLSNkZWZpbmUgTUxNRV9JTlZBTElEX1BBSVJXSVNFX0NJUEhFUgkgIDQyCi0jZGVmaW5lIE1MTUVfSU5WQUxJRF9BS01QCQkJICA0MwotI2RlZmluZSBNTE1FX0RMU19OT1RfQUxMT1dfSU5fUUJTUyAgICAgICAgNDgKLSNkZWZpbmUgTUxNRV9ERVNUX1NUQV9OT1RfSU5fUUJTUyAgICAgICAgIDQ5Ci0jZGVmaW5lIE1MTUVfREVTVF9TVEFfSVNfTk9UX0FfUVNUQSAgICAgICA1MAotCi0jZGVmaW5lIE1MTUVfSU5WQUxJRF9GT1JNQVQgICAgICAgICAgICAgMHg1MQotI2RlZmluZSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0UgICAgICAgICAgIDB4NTIKLSNkZWZpbmUgTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVCAgICAgICAweDUzCi0jZGVmaW5lIE1MTUVfTUFDX1RBQkxFX0ZBSUwgICAgICAgICAgICAgMHg1NAotCi0vLyBJRSBjb2RlCi0jZGVmaW5lIElFX1NTSUQgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBJRV9TVVBQX1JBVEVTICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgSUVfRkhfUEFSTSAgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIElFX0RTX1BBUk0gICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBJRV9DRl9QQVJNICAgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgSUVfVElNICAgICAgICAgICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIElFX0lCU1NfUEFSTSAgICAgICAgICAgICAgICAgICAgNgotI2RlZmluZSBJRV9DT1VOVFJZICAgICAgICAgICAgICAgICAgICAgIDcgICAgIC8vIDgwMi4xMWQKLSNkZWZpbmUgSUVfODAyXzExRF9SRVFVRVNUICAgICAgICAgICAgICAxMCAgICAvLyA4MDIuMTFkCi0jZGVmaW5lIElFX1FCU1NfTE9BRCAgICAgICAgICAgICAgICAgICAgMTEgICAgLy8gODAyLjExZSBkOQotI2RlZmluZSBJRV9FRENBX1BBUkFNRVRFUiAgICAgICAgICAgICAgIDEyICAgIC8vIDgwMi4xMWUgZDkKLSNkZWZpbmUgSUVfVFNQRUMgICAgICAgICAgICAgICAgICAgICAgICAxMyAgICAvLyA4MDIuMTFlIGQ5Ci0jZGVmaW5lIElFX1RDTEFTICAgICAgICAgICAgICAgICAgICAgICAgMTQgICAgLy8gODAyLjExZSBkOQotI2RlZmluZSBJRV9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIDE1ICAgIC8vIDgwMi4xMWUgZDkKLSNkZWZpbmUgSUVfQ0hBTExFTkdFX1RFWFQgICAgICAgICAgICAgICAxNgotI2RlZmluZSBJRV9QT1dFUl9DT05TVFJBSU5UICAgICAgICAgICAgIDMyICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9QT1dFUl9DQVBBQklMSVRZICAgICAgICAgICAgIDMzICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9UUENfUkVRVUVTVCAgICAgICAgICAgICAgICAgIDM0ICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9UUENfUkVQT1JUICAgICAgICAgICAgICAgICAgIDM1ICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9TVVBQX0NIQU5ORUxTICAgICAgICAgICAgICAgIDM2ICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQgIDM3ICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9NRUFTVVJFTUVOVF9SRVFVRVNUICAgICAgICAgIDM4ICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9NRUFTVVJFTUVOVF9SRVBPUlQgICAgICAgICAgIDM5ICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9RVUlFVCAgICAgICAgICAgICAgICAgICAgICAgIDQwICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9JQlNTX0RGUyAgICAgICAgICAgICAgICAgICAgIDQxICAgIC8vIDgwMi4xMWggZDMuMwotI2RlZmluZSBJRV9FUlAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyICAgIC8vIDgwMi4xMWcKLSNkZWZpbmUgSUVfVFNfREVMQVkgICAgICAgICAgICAgICAgICAgICA0MyAgICAvLyA4MDIuMTFlIGQ5Ci0jZGVmaW5lIElFX1RDTEFTX1BST0NFU1NJTkcgICAgICAgICAgICAgNDQgICAgLy8gODAyLjExZSBkOQotI2RlZmluZSBJRV9RT1NfQ0FQQUJJTElUWSAgICAgICAgICAgICAgIDQ2ICAgIC8vIDgwMi4xMWUgZDYKLSNkZWZpbmUgSUVfSFRfQ0FQICAgICAgICAgICAgICAgICAgICAgICA0NSAgICAvLyA4MDIuMTFuIGQxLiBIVCBDQVBBQklMSVRZLiBFTEVNRU5UIElEIFRCRAotI2RlZmluZSBJRV9BUF9DSEFOTkVMX1JFUE9SVAkJCTUxICAgIC8vIDgwMi4xMWsgZDYKLSNkZWZpbmUgSUVfSFRfQ0FQMiAgICAgICAgICAgICAgICAgICAgICAgICA1MiAgICAvLyA4MDIuMTFuIGQxLiBIVCBDQVBBQklMSVRZLiBFTEVNRU5UIElEIFRCRAotI2RlZmluZSBJRV9SU04gICAgICAgICAgICAgICAgICAgICAgICAgIDQ4ICAgIC8vIDgwMi4xMWkgZDMuMAotI2RlZmluZSBJRV9XUEEyICAgICAgICAgICAgICAgICAgICAgICAgIDQ4ICAgIC8vIFdQQTIKLSNkZWZpbmUgSUVfRVhUX1NVUFBfUkFURVMgICAgICAgICAgICAgICA1MCAgICAvLyA4MDIuMTFnCi0jZGVmaW5lIElFX1NVUFBfUkVHX0NMQVNTICAgICAgICAgICAgICAgNTkgICAgLy8gODAyLjExeS4gU3VwcG9ydGVkIHJlZ3VsYXRvcnkgY2xhc3Nlcy4KLSNkZWZpbmUgSUVfRVhUX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVAk2MAkvLyA4MDIuMTFuCi0jZGVmaW5lIElFX0FERF9IVCAgICAgICAgICAgICAgICAgICAgICAgICA2MSAgICAvLyA4MDIuMTFuIGQxLiBBRERJVElPTkFMIEhUIENBUEFCSUxJVFkuIEVMRU1FTlQgSUQgVEJECi0jZGVmaW5lIElFX0FERF9IVDIgICAgICAgICAgICAgICAgICAgICAgICA1MyAgICAvLyA4MDIuMTFuIGQxLiBBRERJVElPTkFMIEhUIENBUEFCSUxJVFkuIEVMRU1FTlQgSUQgVEJECi0KLQotLy8gRm9yIDgwMi4xMW4gRDMuMDMKLS8vI2RlZmluZSBJRV9ORVdfRVhUX0NIQV9PRkZTRVQgICAgICAgICAgICAgNjIgICAgLy8gODAyLjExbiBkMS4gTmV3IGV4dGVuc2lvbiBjaGFubmVsIG9mZnNldCBlbGVtZXQKLSNkZWZpbmUgSUVfU0VDT05EQVJZX0NIX09GRlNFVAkJNjIJLy8gODAyLjExbiBEMy4wMwlTZWNvbmRhcnkgQ2hhbm5lbCBPZmZzZXQgZWxlbWVudAotI2RlZmluZSBJRV9XQVBJCQkJCQkJCTY4CQkvLyBXQVBJIGluZm9ybWF0aW9uIGVsZW1lbnQKLSNkZWZpbmUgSUVfMjA0MF9CU1NfQ09FWElTVCAgICAgICAgICAgICAgIDcyICAgIC8vIDgwMi4xMW4gRDMuMC4zCi0jZGVmaW5lIElFXzIwNDBfQlNTX0lOVE9MRVJBTlRfUkVQT1JUICAgICA3MyAgICAvLyA4MDIuMTFuIEQzLjAzCi0jZGVmaW5lIElFX09WRVJMQVBCU1NfU0NBTl9QQVJNICAgICAgICAgICA3NCAgICAvLyA4MDIuMTFuIEQzLjAzCi0jZGVmaW5lIElFX0VYVF9DQVBBQklMSVRZICAgICAgICAgICAgICAgIDEyNyAgIC8vIDgwMi4xMW4gRDMuMDMKLQotCi0jZGVmaW5lIElFX1dQQSAgICAgICAgICAgICAgICAgICAgICAgICAgMjIxICAgLy8gV1BBCi0jZGVmaW5lIElFX1ZFTkRPUl9TUEVDSUZJQyAgICAgICAgICAgICAgMjIxICAgLy8gV2lmaSBXTU0gKFdNRSkKLQotI2RlZmluZSBPVUlfQlJPQURDT01fSFQgICAgICAgICAgICAgIDUxICAgLy8KLSNkZWZpbmUgT1VJX0JST0FEQ09NX0hUQUREICAgICAgICAgICAgICA1MiAgIC8vCi0jZGVmaW5lIE9VSV9QUkVOX0hUX0NBUCAgICAgICAgICAgICAgNTEgICAvLwotI2RlZmluZSBPVUlfUFJFTl9BRERfSFQgICAgICAgICAgICAgIDUyICAgLy8KLQotLy8gQ0NYIGluZm9ybWF0aW9uCi0jZGVmaW5lIElFX0FJUk9ORVRfQ0tJUCAgICAgICAgICAgICAgICAgMTMzICAgLy8gQ0NYMS4wIElEIDg1SCBmb3IgQ0tJUAotI2RlZmluZSBJRV9BUF9UWF9QT1dFUiAgICAgICAgICAgICAgICAgIDE1MCAgIC8vIENDWCAyLjAgZm9yIEFQIHRyYW5zbWl0IHBvd2VyCi0jZGVmaW5lIElFX01FQVNVUkVNRU5UX0NBUEFCSUxJVFkgICAgICAgMjIxICAgLy8gQ0NYIDIuMAotI2RlZmluZSBJRV9DQ1hfVjIgICAgICAgICAgICAgICAgICAgICAgIDIyMQotI2RlZmluZSBJRV9BSVJPTkVUX0lQQUREUkVTUyAgICAgICAgICAgIDE0OSAgIC8vIENDWCBJRCA5NUggZm9yIElQIEFkZHJlc3MKLSNkZWZpbmUgSUVfQUlST05FVF9DQ0tNUkVBU1NPQyAgICAgICAgICAxNTYgICAvLyBDQ1ggSUQgOUNIIGZvciBDQ0tNIFJlYXNzb2NpYXRpb24gUmVxdWVzdCBlbGVtZW50Ci0jZGVmaW5lIENLSVBfTkVHT1RJQVRJT05fTEVOR1RIICAgICAgICAgMzAKLSNkZWZpbmUgQUlST05FVF9JUEFERFJFU1NfTEVOR1RIICAgICAgICAxMAotI2RlZmluZSBBSVJPTkVUX0NDS01SRUFTU09DX0xFTkdUSCAgICAgIDI0Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBNTE1FIHN0YXRlIG1hY2hpbmUgZGVmaW5pdGlvbgotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLy8gU1RBIE1MTUUgc3RhdGUgbWFoY2luZXMKLSNkZWZpbmUgQVNTT0NfU1RBVEVfTUFDSElORSAgICAgICAgICAgICAxCi0jZGVmaW5lIEFVVEhfU1RBVEVfTUFDSElORSAgICAgICAgICAgICAgMgotI2RlZmluZSBBVVRIX1JTUF9TVEFURV9NQUNISU5FICAgICAgICAgIDMKLSNkZWZpbmUgU1lOQ19TVEFURV9NQUNISU5FICAgICAgICAgICAgICA0Ci0jZGVmaW5lIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FICAgICAgICAgNQotI2RlZmluZSBXUEFfUFNLX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDYKLS8vI2RlZmluZSBMRUFQX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAgIDcKLSNkZWZpbmUgQUlST05FVF9TVEFURV9NQUNISU5FICAgICAgICAgICA4Ci0jZGVmaW5lIEFDVElPTl9TVEFURV9NQUNISU5FICAgICAgICAgICA5Ci0KLS8vIEFQIE1MTUUgc3RhdGUgbWFjaGluZXMKLSNkZWZpbmUgQVBfQVNTT0NfU1RBVEVfTUFDSElORSAgICAgICAgICAxMQotI2RlZmluZSBBUF9BVVRIX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDEyCi0jZGVmaW5lIEFQX1NZTkNfU1RBVEVfTUFDSElORSAgICAgICAgICAgMTQKLSNkZWZpbmUgQVBfQ05UTF9TVEFURV9NQUNISU5FICAgICAgICAgICAxNQotI2RlZmluZSBXU0NfU1RBVEVfTUFDSElORSAgICAgICAgICAgIDE3Ci0jZGVmaW5lIFdTQ19VUE5QX1NUQVRFX01BQ0hJTkUJCSAgICAxOAotCi0KLSNkZWZpbmUgV1BBX1NUQVRFX01BQ0hJTkUJCQkyMwotCi0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLSNkZWZpbmUgRExTX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAgICAyNgotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCi0vLwotLy8gU1RBJ3MgQ09OVFJPTC9DT05ORUNUIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCi0vLwotI2RlZmluZSBDTlRMX0lETEUgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQ05UTF9XQUlUX0RJU0FTU09DICAgICAgICAgICAgICAxCi0jZGVmaW5lIENOVExfV0FJVF9KT0lOICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBDTlRMX1dBSVRfUkVBU1NPQyAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgQ05UTF9XQUlUX1NUQVJUICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIENOVExfV0FJVF9BVVRIICAgICAgICAgICAgICAgICAgNQotI2RlZmluZSBDTlRMX1dBSVRfQVNTT0MgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgQ05UTF9XQUlUX0FVVEgyICAgICAgICAgICAgICAgICA3Ci0jZGVmaW5lIENOVExfV0FJVF9PSURfTElTVF9TQ0FOICAgICAgICAgOAotI2RlZmluZSBDTlRMX1dBSVRfT0lEX0RJU0FTU09DICAgICAgICAgIDkKLQotI2RlZmluZSBNVDJfQVNTT0NfQ09ORiAgICAgICAgICAgICAgICAgIDM0Ci0jZGVmaW5lIE1UMl9BVVRIX0NPTkYgICAgICAgICAgICAgICAgICAgMzUKLSNkZWZpbmUgTVQyX0RFQVVUSF9DT05GICAgICAgICAgICAgICAgICAzNgotI2RlZmluZSBNVDJfRElTQVNTT0NfQ09ORiAgICAgICAgICAgICAgIDM3Ci0jZGVmaW5lIE1UMl9SRUFTU09DX0NPTkYgICAgICAgICAgICAgICAgMzgKLSNkZWZpbmUgTVQyX1BXUl9NR01UX0NPTkYgICAgICAgICAgICAgICAzOQotI2RlZmluZSBNVDJfSk9JTl9DT05GICAgICAgICAgICAgICAgICAgIDQwCi0jZGVmaW5lIE1UMl9TQ0FOX0NPTkYgICAgICAgICAgICAgICAgICAgNDEKLSNkZWZpbmUgTVQyX1NUQVJUX0NPTkYgICAgICAgICAgICAgICAgICA0MgotI2RlZmluZSBNVDJfR0VUX0NPTkYgICAgICAgICAgICAgICAgICAgIDQzCi0jZGVmaW5lIE1UMl9TRVRfQ09ORiAgICAgICAgICAgICAgICAgICAgNDQKLSNkZWZpbmUgTVQyX1JFU0VUX0NPTkYgICAgICAgICAgICAgICAgICA0NQotI2RlZmluZSBNVDJfRlRfT1REX0NPTkYJCQkJCTQ2Ci0jZGVmaW5lIE1UMl9NTE1FX1JPQU1JTkdfUkVRICAgICAgICAgICAgNTIKLQotI2RlZmluZSBDTlRMX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAgIDEKLQotLy8KLS8vIFNUQSdzIEFTU09DIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCi0vLwotI2RlZmluZSBBU1NPQ19JRExFICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQVNTT0NfV0FJVF9SU1AgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFJFQVNTT0NfV0FJVF9SU1AgICAgICAgICAgICAgICAgMgotI2RlZmluZSBESVNBU1NPQ19XQUlUX1JTUCAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgTUFYX0FTU09DX1NUQVRFICAgICAgICAgICAgICAgICA0Ci0KLSNkZWZpbmUgQVNTT0NfTUFDSElORV9CQVNFICAgICAgICAgICAgICAwCi0jZGVmaW5lIE1UMl9NTE1FX0FTU09DX1JFUSAgICAgICAgICAgICAgMAotI2RlZmluZSBNVDJfTUxNRV9SRUFTU09DX1JFUSAgICAgICAgICAgIDEKLSNkZWZpbmUgTVQyX01MTUVfRElTQVNTT0NfUkVRICAgICAgICAgICAyCi0jZGVmaW5lIE1UMl9QRUVSX0RJU0FTU09DX1JFUSAgICAgICAgICAgMwotI2RlZmluZSBNVDJfUEVFUl9BU1NPQ19SRVEgICAgICAgICAgICAgIDQKLSNkZWZpbmUgTVQyX1BFRVJfQVNTT0NfUlNQICAgICAgICAgICAgICA1Ci0jZGVmaW5lIE1UMl9QRUVSX1JFQVNTT0NfUkVRICAgICAgICAgICAgNgotI2RlZmluZSBNVDJfUEVFUl9SRUFTU09DX1JTUCAgICAgICAgICAgIDcKLSNkZWZpbmUgTVQyX0RJU0FTU09DX1RJTUVPVVQgICAgICAgICAgICA4Ci0jZGVmaW5lIE1UMl9BU1NPQ19USU1FT1VUICAgICAgICAgICAgICAgOQotI2RlZmluZSBNVDJfUkVBU1NPQ19USU1FT1VUICAgICAgICAgICAgIDEwCi0jZGVmaW5lIE1BWF9BU1NPQ19NU0cgICAgICAgICAgICAgICAgICAgMTEKLQotI2RlZmluZSBBU1NPQ19GVU5DX1NJWkUgICAgICAgICAgICAgICAgIChNQVhfQVNTT0NfU1RBVEUgKiBNQVhfQVNTT0NfTVNHKQotCi0vLwotLy8gQUNUIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCi0vLwotI2RlZmluZSBBQ1RfSURMRSAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIE1BWF9BQ1RfU1RBVEUgICAgICAgICAgICAgICAgIDEKLQotI2RlZmluZSBBQ1RfTUFDSElORV9CQVNFICAgICAgICAgICAgICAwCi0KLS8vVGhvc2UgUEVFUl94eF9DQVRFIG51bWJlciBpcyBiYXNlZCBvbiByZWFsIENhdGVnYXJ5IHZhbHVlIGluIElFRUUgc3BlYy4gUGxlYXNlIGRvbidlcyBtb2RpZnkgaXQgYnkgeW91ciBzZWxmLgotLy9DYXRlZ29yeQotI2RlZmluZSBNVDJfUEVFUl9TUEVDVFJVTV9DQVRFICAgICAgICAgICAgICAwCi0jZGVmaW5lIE1UMl9QRUVSX1FPU19DQVRFICAgICAgICAgICAgICAxCi0jZGVmaW5lIE1UMl9QRUVSX0RMU19DQVRFICAgICAgICAgICAgIDIKLSNkZWZpbmUgTVQyX1BFRVJfQkFfQ0FURSAgICAgICAgICAgICAzCi0jZGVmaW5lIE1UMl9QRUVSX1BVQkxJQ19DQVRFICAgICAgICAgICAgIDQKLSNkZWZpbmUgTVQyX1BFRVJfUk1fQ0FURSAgICAgICAgICAgICA1Ci0vKiAiRlRfQ0FURUdPUllfQlNTX1RSQU5TSVRJT04gZXF1YWwgdG8gNiIgaXMgZGVmaW5lZCBmaWxlIG9mICJkb3QxMXJfZnQuaCIgKi8KLSNkZWZpbmUgTVQyX1BFRVJfSFRfQ0FURSAgICAgICAgICAgICA3CS8vCTcuNC43Ci0jZGVmaW5lIE1BWF9QRUVSX0NBVEVfTVNHICAgICAgICAgICAgICAgICAgIDcKLQotCi0jZGVmaW5lIE1UMl9NTE1FX0FERF9CQV9DQVRFICAgICAgICAgICAgIDgKLSNkZWZpbmUgTVQyX01MTUVfT1JJX0RFTEJBX0NBVEUgICAgICAgICAgICAgOQotI2RlZmluZSBNVDJfTUxNRV9SRUNfREVMQkFfQ0FURSAgICAgICAgICAgICAxMAotI2RlZmluZSBNVDJfTUxNRV9RT1NfQ0FURSAgICAgICAgICAgICAgMTEKLSNkZWZpbmUgTVQyX01MTUVfRExTX0NBVEUgICAgICAgICAgICAgMTIKLSNkZWZpbmUgTVQyX0FDVF9JTlZBTElEICAgICAgICAgICAgIDEzCi0KLSNkZWZpbmUgTUFYX0FDVF9NU0cgICAgICAgICAgICAgICAgICAgMTQKLQotCi0vL0NhdGVnb3J5IGZpZWxkCi0jZGVmaW5lIENBVEVHT1JZX1NQRUNUUlVNCQkwCi0jZGVmaW5lIENBVEVHT1JZX1FPUwkJCTEKLSNkZWZpbmUgQ0FURUdPUllfRExTCQkJMgotI2RlZmluZSBDQVRFR09SWV9CQQkJCTMKLSNkZWZpbmUgQ0FURUdPUllfUFVCTElDCQk0Ci0jZGVmaW5lIENBVEVHT1JZX1JNCQkJNQotI2RlZmluZSBDQVRFR09SWV9IVAkJCTcKLQotCi0vLyBETFMgQWN0aW9uIGZyYW1lIGRlZmluaXRpb24KLSNkZWZpbmUgQUNUSU9OX0RMU19SRVFVRVNUCQkJMAotI2RlZmluZSBBQ1RJT05fRExTX1JFU1BPTlNFCQkJMQotI2RlZmluZSBBQ1RJT05fRExTX1RFQVJET1dOCQkJMgotCi0vL1NwZWN0cnVtICBBY3Rpb24gZmllbGQgdmFsdWUgODAyLjExaCA3LjQuMQotI2RlZmluZSBTUEVDX01SUQkwCS8vIFJlcXVlc3QKLSNkZWZpbmUgU1BFQ19NUlAJMQkvL1JlcG9ydAotI2RlZmluZSBTUEVDX1RQQ1JRCTIKLSNkZWZpbmUgU1BFQ19UUENSUAkzCi0jZGVmaW5lIFNQRUNfQ0hBTk5FTF9TV0lUQ0gJNAotCi0KLS8vQkEgIEFjdGlvbiBmaWVsZCB2YWx1ZQotI2RlZmluZSBBRERCQV9SRVEJMAotI2RlZmluZSBBRERCQV9SRVNQCTEKLSNkZWZpbmUgREVMQkEgICAyCi0KLS8vUHVibGljJ3MgIEFjdGlvbiBmaWVsZCB2YWx1ZSBpbiBQdWJsaWMgQ2F0ZWdvcnkuICBTb21lIGluIDgwMi4xMXkgYW5kIHNvbWUgaW4gMTFuCi0jZGVmaW5lIEFDVElPTl9CU1NfMjA0MF9DT0VYSVNUCQkJCTAJLy8gMTFuCi0jZGVmaW5lIEFDVElPTl9EU0VfRU5BQkxFTUVOVAkJCQkJMQkvLyAxMXkgRDkuMAotI2RlZmluZSBBQ1RJT05fRFNFX0RFRU5BQkxFTUVOVAkJCQkyCS8vIDExeSBEOS4wCi0jZGVmaW5lIEFDVElPTl9EU0VfUkVHX0xPQ0FUSU9OX0FOTk9VTkNFCTMJLy8gMTF5IEQ5LjAKLSNkZWZpbmUgQUNUSU9OX0VYVF9DSF9TV0lUQ0hfQU5OT1VOQ0UJCTQJLy8gMTF5IEQ5LjAKLSNkZWZpbmUgQUNUSU9OX0RTRV9NRUFTVVJFTUVOVF9SRVEJCQk1CS8vIDExeSBEOS4wCi0jZGVmaW5lIEFDVElPTl9EU0VfTUVBU1VSRU1FTlRfUkVQT1JUCQk2CS8vIDExeSBEOS4wCi0jZGVmaW5lIEFDVElPTl9NRUFTVVJFTUVOVF9QSUxPVF9BQ1RJT04JCTcJLy8gMTF5IEQ5LjAKLSNkZWZpbmUgQUNUSU9OX0RTRV9QT1dFUl9DT05TVFJBSU5UCQkJOAkvLyAxMXkgRDkuMAotCi0KLS8vSFQgIEFjdGlvbiBmaWVsZCB2YWx1ZQotI2RlZmluZSBOT1RJRllfQldfQUNUSU9OCQkJCTAKLSNkZWZpbmUgU01QU19BQ1RJT04JCQkJCQkxCi0jZGVmaW5lIFBTTVBfQUNUSU9OCQkJCQkyCi0jZGVmaW5lIFNFVFBDT19BQ1RJT04JCQkJCTMKLSNkZWZpbmUgTUlNT19DSEFfTUVBU1VSRV9BQ1RJT04JCQk0Ci0jZGVmaW5lIE1JTU9fTl9CRUFDT05GT1JNCQkJCTUKLSNkZWZpbmUgTUlNT19CRUFDT05GT1JNCQkJCQk2Ci0jZGVmaW5lIEFOVEVOTkFfU0VMRUNUCQkJCQk3Ci0jZGVmaW5lIEhUX0lORk9fRVhDSEFOR0UJCQkJOAotCi0jZGVmaW5lIEFDVF9GVU5DX1NJWkUgICAgICAgICAgICAgICAgIChNQVhfQUNUX1NUQVRFICogTUFYX0FDVF9NU0cpCi0vLwotLy8gU1RBJ3MgQVVUSEVOVElDQVRJT04gc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldnZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCi0vLwotI2RlZmluZSBBVVRIX1JFUV9JRExFICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQVVUSF9XQUlUX1NFUTIgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEFVVEhfV0FJVF9TRVE0ICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBNQVhfQVVUSF9TVEFURSAgICAgICAgICAgICAgICAgIDMKLQotI2RlZmluZSBBVVRIX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTVQyX01MTUVfQVVUSF9SRVEgICAgICAgICAgICAgICAwCi0jZGVmaW5lIE1UMl9QRUVSX0FVVEhfRVZFTiAgICAgICAgICAgICAgMQotI2RlZmluZSBNVDJfQVVUSF9USU1FT1VUICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTUFYX0FVVEhfTVNHICAgICAgICAgICAgICAgICAgICAzCi0KLSNkZWZpbmUgQVVUSF9GVU5DX1NJWkUgICAgICAgICAgICAgICAgICAoTUFYX0FVVEhfU1RBVEUgKiBNQVhfQVVUSF9NU0cpCi0KLS8vCi0vLyBTVEEncyBBVVRIX1JTUCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIwotLy8KLSNkZWZpbmUgQVVUSF9SU1BfSURMRSAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEFVVEhfUlNQX1dBSVRfQ0hBTCAgICAgICAgICAgICAgMQotI2RlZmluZSBNQVhfQVVUSF9SU1BfU1RBVEUgICAgICAgICAgICAgIDIKLQotI2RlZmluZSBBVVRIX1JTUF9NQUNISU5FX0JBU0UgICAgICAgICAgIDAKLSNkZWZpbmUgTVQyX0FVVEhfQ0hBTExFTkdFX1RJTUVPVVQgICAgICAwCi0jZGVmaW5lIE1UMl9QRUVSX0FVVEhfT0REICAgICAgICAgICAgICAgMQotI2RlZmluZSBNVDJfUEVFUl9ERUFVVEggICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTUFYX0FVVEhfUlNQX01TRyAgICAgICAgICAgICAgICAzCi0KLSNkZWZpbmUgQVVUSF9SU1BfRlVOQ19TSVpFICAgICAgICAgICAgICAoTUFYX0FVVEhfUlNQX1NUQVRFICogTUFYX0FVVEhfUlNQX01TRykKLQotLy8KLS8vIFNUQSdzIFNZTkMgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCi0jZGVmaW5lIFNZTkNfSURMRSAgICAgICAgICAgICAgICAgICAgICAgMCAgLy8gbWVyZ2UgTk9fQlNTLElCU1NfSURMRSxJQlNTX0FDVElWRSBhbmQgQlNTIGluIHRvIDEgc3RhdGUKLSNkZWZpbmUgSk9JTl9XQUlUX0JFQUNPTiAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNDQU5fTElTVEVOICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBNQVhfU1lOQ19TVEFURSAgICAgICAgICAgICAgICAgIDMKLQotI2RlZmluZSBTWU5DX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTVQyX01MTUVfU0NBTl9SRVEgICAgICAgICAgICAgICAwCi0jZGVmaW5lIE1UMl9NTE1FX0pPSU5fUkVRICAgICAgICAgICAgICAgMQotI2RlZmluZSBNVDJfTUxNRV9TVEFSVF9SRVEgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTVQyX1BFRVJfQkVBQ09OICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIE1UMl9QRUVSX1BST0JFX1JTUCAgICAgICAgICAgICAgNAotI2RlZmluZSBNVDJfUEVFUl9BVElNICAgICAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgTVQyX1NDQU5fVElNRU9VVCAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIE1UMl9CRUFDT05fVElNRU9VVCAgICAgICAgICAgICAgNwotI2RlZmluZSBNVDJfQVRJTV9USU1FT1VUICAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgTVQyX1BFRVJfUFJPQkVfUkVRICAgICAgICAgICAgICA5Ci0jZGVmaW5lIE1BWF9TWU5DX01TRyAgICAgICAgICAgICAgICAgICAgMTAKLQotI2RlZmluZSBTWU5DX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAgIChNQVhfU1lOQ19TVEFURSAqIE1BWF9TWU5DX01TRykKLQotLy9NZXNzYWdlcyBmb3IgdGhlIERMUyBzdGF0ZSBtYWNoaW5lCi0jZGVmaW5lIERMU19JRExFCQkJCQkJMAotI2RlZmluZSBNQVhfRExTX1NUQVRFCQkJCQkxCi0KLSNkZWZpbmUgRExTX01BQ0hJTkVfQkFTRQkJCQkwCi0jZGVmaW5lIE1UMl9NTE1FX0RMU19SRVEJCQkgICAgMAotI2RlZmluZSBNVDJfUEVFUl9ETFNfUkVRCQkJICAgIDEKLSNkZWZpbmUgTVQyX1BFRVJfRExTX1JTUAkJCSAgICAyCi0jZGVmaW5lIE1UMl9NTE1FX0RMU19URUFSX0RPV04JCSAgICAzCi0jZGVmaW5lIE1UMl9QRUVSX0RMU19URUFSX0RPV04JCSAgICA0Ci0jZGVmaW5lIE1BWF9ETFNfTVNHCQkJCSAgICAgICAgNQotCi0jZGVmaW5lIERMU19GVU5DX1NJWkUJCQkJCShNQVhfRExTX1NUQVRFICogTUFYX0RMU19NU0cpCi0KLS8vCi0vLyBXU0MgU3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCi0KLS8vCi0vLyBBUCdzIENPTlRST0wvQ09OTkVDVCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIwotLy8KLSNkZWZpbmUgQVBfQ05UTF9GVU5DX1NJWkUgICAgICAgICAgICAgICAxCi0KLS8vCi0vLyBBUCdzIEFTU09DIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCi0vLwotI2RlZmluZSBBUF9BU1NPQ19JRExFICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQVBfTUFYX0FTU09DX1NUQVRFICAgICAgICAgICAgICAxCi0KLSNkZWZpbmUgQVBfQVNTT0NfTUFDSElORV9CQVNFICAgICAgICAgICAwCi0jZGVmaW5lIEFQTVQyX01MTUVfRElTQVNTT0NfUkVRICAgICAgICAgMAotI2RlZmluZSBBUE1UMl9QRUVSX0RJU0FTU09DX1JFUSAgICAgICAgIDEKLSNkZWZpbmUgQVBNVDJfUEVFUl9BU1NPQ19SRVEgICAgICAgICAgICAyCi0jZGVmaW5lIEFQTVQyX1BFRVJfUkVBU1NPQ19SRVEgICAgICAgICAgMwotI2RlZmluZSBBUE1UMl9DTFMzRVJSICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgQVBfTUFYX0FTU09DX01TRyAgICAgICAgICAgICAgICA1Ci0KLSNkZWZpbmUgQVBfQVNTT0NfRlVOQ19TSVpFICAgICAgICAgICAgICAoQVBfTUFYX0FTU09DX1NUQVRFICogQVBfTUFYX0FTU09DX01TRykKLQotLy8KLS8vIEFQJ3MgQVVUSEVOVElDQVRJT04gc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCi0jZGVmaW5lIEFQX0FVVEhfUkVRX0lETEUgICAgICAgICAgICAgICAgMAotI2RlZmluZSBBUF9NQVhfQVVUSF9TVEFURSAgICAgICAgICAgICAgIDEKLQotI2RlZmluZSBBUF9BVVRIX01BQ0hJTkVfQkFTRSAgICAgICAgICAgIDAKLSNkZWZpbmUgQVBNVDJfTUxNRV9ERUFVVEhfUkVRICAgICAgICAgICAwCi0jZGVmaW5lIEFQTVQyX0NMUzJFUlIgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBBUE1UMl9QRUVSX0RFQVVUSAkJCQkyCi0jZGVmaW5lIEFQTVQyX1BFRVJfQVVUSF9SRVEJCQkJMwotI2RlZmluZSBBUE1UMl9QRUVSX0FVVEhfQ09ORklSTQkJCTQKLSNkZWZpbmUgQVBfTUFYX0FVVEhfTVNHICAgICAgICAgICAgICAgICA1Ci0KLSNkZWZpbmUgQVBfQVVUSF9GVU5DX1NJWkUgICAgICAgICAgICAgICAoQVBfTUFYX0FVVEhfU1RBVEUgKiBBUF9NQVhfQVVUSF9NU0cpCi0KLS8vCi0vLyBBUCdzIFNZTkMgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCi0jZGVmaW5lIEFQX1NZTkNfSURMRSAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBBUF9TQ0FOX0xJU1RFTgkJCQkJMQotI2RlZmluZSBBUF9NQVhfU1lOQ19TVEFURSAgICAgICAgICAgICAgIDIKLQotI2RlZmluZSBBUF9TWU5DX01BQ0hJTkVfQkFTRSAgICAgICAgICAgIDAKLSNkZWZpbmUgQVBNVDJfUEVFUl9QUk9CRV9SRVEgICAgICAgICAgICAwCi0jZGVmaW5lIEFQTVQyX1BFRVJfQkVBQ09OICAgICAgICAgICAgICAgMQotI2RlZmluZSBBUE1UMl9NTE1FX1NDQU5fUkVRCQkJCTIKLSNkZWZpbmUgQVBNVDJfUEVFUl9QUk9CRV9SU1AJCQkzCi0jZGVmaW5lIEFQTVQyX1NDQU5fVElNRU9VVAkJCQk0Ci0jZGVmaW5lIEFQTVQyX01MTUVfU0NBTl9DTkNMCQkJNQotI2RlZmluZSBBUF9NQVhfU1lOQ19NU0cgICAgICAgICAgICAgICAgIDYKLQotI2RlZmluZSBBUF9TWU5DX0ZVTkNfU0laRSAgICAgICAgICAgICAgIChBUF9NQVhfU1lOQ19TVEFURSAqIEFQX01BWF9TWU5DX01TRykKLQotLy8KLS8vIENvbW1vbiBXUEEgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCi0jZGVmaW5lIFdQQV9QVEsgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBNQVhfV1BBX1BUS19TVEFURSAgICAgICAgICAgIDEKLQotI2RlZmluZSBXUEFfTUFDSElORV9CQVNFICAgICAgICAgICAgIDAKLSNkZWZpbmUgTVQyX0VBUFBhY2tldCAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIE1UMl9FQVBPTFN0YXJ0ICAgICAgICAgICAgICAgMQotI2RlZmluZSBNVDJfRUFQT0xMb2dvZmYgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTVQyX0VBUE9MS2V5ICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIE1UMl9FQVBPTEFTRkFsZXJ0ICAgICAgICAgICAgNAotI2RlZmluZSBNQVhfV1BBX01TRyAgICAgICAgICAgICAgICAgIDUKLQotI2RlZmluZSBXUEFfRlVOQ19TSVpFICAgICAgICAgICAgICAgIChNQVhfV1BBX1BUS19TVEFURSAqIE1BWF9XUEFfTVNHKQotCi0jaWZkZWYgQVBDTElfU1VQUE9SVAotLy9BcENsaSBhdXRoZW50aWNhdGlvbiBzdGF0ZSBtYWNoaW5lCi0jZGVmaW5lIEFQQ0xJX0FVVEhfUkVRX0lETEUgICAgICAgICAgICAgICAgMAotI2RlZmluZSBBUENMSV9BVVRIX1dBSVRfU0VRMiAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgQVBDTElfQVVUSF9XQUlUX1NFUTQgICAgICAgICAgICAgICAyCi0jZGVmaW5lIEFQQ0xJX01BWF9BVVRIX1NUQVRFICAgICAgICAgICAgICAgMwotCi0jZGVmaW5lIEFQQ0xJX0FVVEhfTUFDSElORV9CQVNFICAgICAgICAgICAgMAotI2RlZmluZSBBUENMSV9NVDJfTUxNRV9BVVRIX1JFUSAgICAgICAgICAgIDAKLSNkZWZpbmUgQVBDTElfTVQyX01MTUVfREVBVVRIX1JFUSAgICAgICAgICAxCi0jZGVmaW5lIEFQQ0xJX01UMl9QRUVSX0FVVEhfRVZFTiAgICAgICAgICAgMgotI2RlZmluZSBBUENMSV9NVDJfUEVFUl9ERUFVVEggICAgICAgICAgICAgIDMKLSNkZWZpbmUgQVBDTElfTVQyX0FVVEhfVElNRU9VVCAgICAgICAgICAgICA0Ci0jZGVmaW5lIEFQQ0xJX01BWF9BVVRIX01TRyAgICAgICAgICAgICAgICAgNQotCi0jZGVmaW5lIEFQQ0xJX0FVVEhfRlVOQ19TSVpFICAgICAgICAgICAgICAgKEFQQ0xJX01BWF9BVVRIX1NUQVRFICogQVBDTElfTUFYX0FVVEhfTVNHKQotCi0vL0FwQ2xpIGFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUKLSNkZWZpbmUgQVBDTElfQVNTT0NfSURMRSAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEFQQ0xJX0FTU09DX1dBSVRfUlNQICAgICAgICAgICAgICAgMQotI2RlZmluZSBBUENMSV9NQVhfQVNTT0NfU1RBVEUgICAgICAgICAgICAgIDIKLQotI2RlZmluZSBBUENMSV9BU1NPQ19NQUNISU5FX0JBU0UgICAgICAgICAgIDAKLSNkZWZpbmUgQVBDTElfTVQyX01MTUVfQVNTT0NfUkVRICAgICAgICAgICAwCi0jZGVmaW5lIEFQQ0xJX01UMl9NTE1FX0RJU0FTU09DX1JFUSAgICAgICAgMQotI2RlZmluZSBBUENMSV9NVDJfUEVFUl9ESVNBU1NPQ19SRVEgICAgICAgIDIKLSNkZWZpbmUgQVBDTElfTVQyX1BFRVJfQVNTT0NfUlNQICAgICAgICAgICAzCi0jZGVmaW5lIEFQQ0xJX01UMl9BU1NPQ19USU1FT1VUICAgICAgICAgICAgNAotI2RlZmluZSBBUENMSV9NQVhfQVNTT0NfTVNHICAgICAgICAgICAgICAgIDUKLQotI2RlZmluZSBBUENMSV9BU1NPQ19GVU5DX1NJWkUgICAgICAgICAgICAgIChBUENMSV9NQVhfQVNTT0NfU1RBVEUgKiBBUENMSV9NQVhfQVNTT0NfTVNHKQotCi0vL0FwQ2xpIHN5bmMgc3RhdGUgbWFjaGluZQotI2RlZmluZSBBUENMSV9TWU5DX0lETEUgICAgICAgICAgICAgICAgICAgMCAgLy8gbWVyZ2UgTk9fQlNTLElCU1NfSURMRSxJQlNTX0FDVElWRSBhbmQgQlNTIGluIHRvIDEgc3RhdGUKLSNkZWZpbmUgQVBDTElfSk9JTl9XQUlUX1BST0JFX1JTUCAgICAgICAgIDEKLSNkZWZpbmUgQVBDTElfTUFYX1NZTkNfU1RBVEUgICAgICAgICAgICAgIDIKLQotI2RlZmluZSBBUENMSV9TWU5DX01BQ0hJTkVfQkFTRSAgICAgICAgICAgMAotI2RlZmluZSBBUENMSV9NVDJfTUxNRV9QUk9CRV9SRVEgICAgICAgICAgMAotI2RlZmluZSBBUENMSV9NVDJfUEVFUl9QUk9CRV9SU1AgICAgICAgICAgMQotI2RlZmluZSBBUENMSV9NVDJfUFJPQkVfVElNRU9VVCAgICAgICAgICAgMgotI2RlZmluZSBBUENMSV9NQVhfU1lOQ19NU0cgICAgICAgICAgICAgICAgMwotCi0jZGVmaW5lIEFQQ0xJX1NZTkNfRlVOQ19TSVpFICAgICAgICAgICAgICAoQVBDTElfTUFYX1NZTkNfU1RBVEUgKiBBUENMSV9NQVhfU1lOQ19NU0cpCi0KLS8vQXBDbGkgY3RybCBzdGF0ZSBtYWNoaW5lCi0jZGVmaW5lIEFQQ0xJX0NUUkxfRElTQ09OTkVDVEVEICAgICAgICAgICAwICAvLyBtZXJnZSBOT19CU1MsSUJTU19JRExFLElCU1NfQUNUSVZFIGFuZCBCU1MgaW4gdG8gMSBzdGF0ZQotI2RlZmluZSBBUENMSV9DVFJMX1BST0JFICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBBUENMSV9DVFJMX0FVVEggICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBBUENMSV9DVFJMX0FVVEhfMiAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBBUENMSV9DVFJMX0FTU09DICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBBUENMSV9DVFJMX0RFQVNTT0MgICAgICAgICAgICAgICAgNQotI2RlZmluZSBBUENMSV9DVFJMX0NPTk5FQ1RFRCAgICAgICAgICAgICAgNgotI2RlZmluZSBBUENMSV9NQVhfQ1RSTF9TVEFURSAgICAgICAgICAgICAgNwotCi0jZGVmaW5lIEFQQ0xJX0NUUkxfTUFDSElORV9CQVNFICAgICAgICAgICAwCi0jZGVmaW5lIEFQQ0xJX0NUUkxfSk9JTl9SRVEgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEFQQ0xJX0NUUkxfUFJPQkVfUlNQICAgICAgICAgICAgICAxCi0jZGVmaW5lIEFQQ0xJX0NUUkxfQVVUSF9SU1AgICAgICAgICAgICAgICAyCi0jZGVmaW5lIEFQQ0xJX0NUUkxfRElTQ09OTkVDVF9SRVEgICAgICAgICAzCi0jZGVmaW5lIEFQQ0xJX0NUUkxfUEVFUl9ESVNDT05ORUNUX1JFUSAgICA0Ci0jZGVmaW5lIEFQQ0xJX0NUUkxfQVNTT0NfUlNQICAgICAgICAgICAgICA1Ci0jZGVmaW5lIEFQQ0xJX0NUUkxfREVBU1NPQ19SU1AgICAgICAgICAgICA2Ci0jZGVmaW5lIEFQQ0xJX0NUUkxfSk9JTl9SRVFfVElNRU9VVCAgICAgICA3Ci0jZGVmaW5lIEFQQ0xJX0NUUkxfQVVUSF9SRVFfVElNRU9VVCAgICAgICA4Ci0jZGVmaW5lIEFQQ0xJX0NUUkxfQVNTT0NfUkVRX1RJTUVPVVQgICAgICA5Ci0jZGVmaW5lIEFQQ0xJX01BWF9DVFJMX01TRyAgICAgICAgICAgICAgICAxMAotCi0jZGVmaW5lIEFQQ0xJX0NUUkxfRlVOQ19TSVpFICAgICAgICAgICAgICAoQVBDTElfTUFYX0NUUkxfU1RBVEUgKiBBUENMSV9NQVhfQ1RSTF9NU0cpCi0KLQotI2VuZGlmIC8vIEFQQ0xJX1NVUFBPUlQgLy8KLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vLyB2YWx1ZSBkb21haW4gb2YgODAyLjExIGhlYWRlciBGQy5UeXRlLCB3aGljaCBpcyBiMy4uYjIgb2YgdGhlIDFzdC1ieXRlIG9mIE1BQyBoZWFkZXIKLSNkZWZpbmUgQlRZUEVfTUdNVCAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQlRZUEVfQ05UTCAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgQlRZUEVfREFUQSAgICAgICAgICAgICAgICAgIDIKLQotLy8gdmFsdWUgZG9tYWluIG9mIDgwMi4xMSBNR01UIGZyYW1lJ3MgRkMuc3VidHlwZSwgd2hpY2ggaXMgYjcuLjQgb2YgdGhlIDFzdC1ieXRlIG9mIE1BQyBoZWFkZXIKLSNkZWZpbmUgU1VCVFlQRV9BU1NPQ19SRVEgICAgICAgICAgIDAKLSNkZWZpbmUgU1VCVFlQRV9BU1NPQ19SU1AgICAgICAgICAgIDEKLSNkZWZpbmUgU1VCVFlQRV9SRUFTU09DX1JFUSAgICAgICAgIDIKLSNkZWZpbmUgU1VCVFlQRV9SRUFTU09DX1JTUCAgICAgICAgIDMKLSNkZWZpbmUgU1VCVFlQRV9QUk9CRV9SRVEgICAgICAgICAgIDQKLSNkZWZpbmUgU1VCVFlQRV9QUk9CRV9SU1AgICAgICAgICAgIDUKLSNkZWZpbmUgU1VCVFlQRV9CRUFDT04gICAgICAgICAgICAgIDgKLSNkZWZpbmUgU1VCVFlQRV9BVElNICAgICAgICAgICAgICAgIDkKLSNkZWZpbmUgU1VCVFlQRV9ESVNBU1NPQyAgICAgICAgICAgIDEwCi0jZGVmaW5lIFNVQlRZUEVfQVVUSCAgICAgICAgICAgICAgICAxMQotI2RlZmluZSBTVUJUWVBFX0RFQVVUSCAgICAgICAgICAgICAgMTIKLSNkZWZpbmUgU1VCVFlQRV9BQ1RJT04gICAgICAgICAgICAgIDEzCi0jZGVmaW5lIFNVQlRZUEVfQUNUSU9OX05PX0FDSyAgICAgICAgICAgICAgMTQKLQotLy8gdmFsdWUgZG9tYWluIG9mIDgwMi4xMSBDTlRMIGZyYW1lJ3MgRkMuc3VidHlwZSwgd2hpY2ggaXMgYjcuLjQgb2YgdGhlIDFzdC1ieXRlIG9mIE1BQyBoZWFkZXIKLSNkZWZpbmUgU1VCVFlQRV9XUkFQUEVSCQk3Ci0jZGVmaW5lIFNVQlRZUEVfQkxPQ0tfQUNLX1JFUSAgICAgICA4Ci0jZGVmaW5lIFNVQlRZUEVfQkxPQ0tfQUNLICAgICAgICAgICA5Ci0jZGVmaW5lIFNVQlRZUEVfUFNfUE9MTCAgICAgICAgICAgICAxMAotI2RlZmluZSBTVUJUWVBFX1JUUyAgICAgICAgICAgICAgICAgMTEKLSNkZWZpbmUgU1VCVFlQRV9DVFMgICAgICAgICAgICAgICAgIDEyCi0jZGVmaW5lIFNVQlRZUEVfQUNLICAgICAgICAgICAgICAgICAxMwotI2RlZmluZSBTVUJUWVBFX0NGRU5EICAgICAgICAgICAgICAgMTQKLSNkZWZpbmUgU1VCVFlQRV9DRkVORF9DRkFDSyAgICAgICAgIDE1Ci0KLS8vIHZhbHVlIGRvbWFpbiBvZiA4MDIuMTEgREFUQSBmcmFtZSdzIEZDLnN1YnR5cGUsIHdoaWNoIGlzIGI3Li40IG9mIHRoZSAxc3QtYnl0ZSBvZiBNQUMgaGVhZGVyCi0jZGVmaW5lIFNVQlRZUEVfREFUQSAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFNVQlRZUEVfREFUQV9DRkFDSyAgICAgICAgICAxCi0jZGVmaW5lIFNVQlRZUEVfREFUQV9DRlBPTEwgICAgICAgICAyCi0jZGVmaW5lIFNVQlRZUEVfREFUQV9DRkFDS19DRlBPTEwgICAzCi0jZGVmaW5lIFNVQlRZUEVfTlVMTF9GVU5DICAgICAgICAgICA0Ci0jZGVmaW5lIFNVQlRZUEVfQ0ZBQ0sgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIFNVQlRZUEVfQ0ZQT0xMICAgICAgICAgICAgICA2Ci0jZGVmaW5lIFNVQlRZUEVfQ0ZBQ0tfQ0ZQT0xMICAgICAgICA3Ci0jZGVmaW5lIFNVQlRZUEVfUURBVEEgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIFNVQlRZUEVfUURBVEFfQ0ZBQ0sgICAgICAgICA5Ci0jZGVmaW5lIFNVQlRZUEVfUURBVEFfQ0ZQT0xMICAgICAgICAxMAotI2RlZmluZSBTVUJUWVBFX1FEQVRBX0NGQUNLX0NGUE9MTCAgMTEKLSNkZWZpbmUgU1VCVFlQRV9RT1NfTlVMTCAgICAgICAgICAgIDEyCi0jZGVmaW5lIFNVQlRZUEVfUU9TX0NGQUNLICAgICAgICAgICAxMwotI2RlZmluZSBTVUJUWVBFX1FPU19DRlBPTEwgICAgICAgICAgMTQKLSNkZWZpbmUgU1VCVFlQRV9RT1NfQ0ZBQ0tfQ0ZQT0xMICAgIDE1Ci0KLS8vIEFDSyBwb2xpY3kgb2YgUU9TIENvbnRyb2wgZmllbGQgYml0IDY6NQotI2RlZmluZSBOT1JNQUxfQUNLICAgICAgICAgICAgICAgICAgMHgwMCAgLy8gYjY6NSA9IDAwCi0jZGVmaW5lIE5PX0FDSyAgICAgICAgICAgICAgICAgICAgICAweDIwICAvLyBiNjo1ID0gMDEKLSNkZWZpbmUgTk9fRVhQTElDSVRfQUNLICAgICAgICAgICAgIDB4NDAgIC8vIGI2OjUgPSAxMAotI2RlZmluZSBCTE9DS19BQ0sgICAgICAgICAgICAgICAgICAgMHg2MCAgLy8gYjY6NSA9IDExCi0KLS8vCi0vLyBydG1wX2RhdGEuYyB1c2UgdGhlc2UgZGVmaW5pdGlvbgotLy8KLSNkZWZpbmUgTEVOR1RIXzgwMl8xMSAgICAgICAgICAgICAgIDI0Ci0jZGVmaW5lIExFTkdUSF84MDJfMTFfQU5EX0ggICAgICAgICAzMAotI2RlZmluZSBMRU5HVEhfODAyXzExX0NSQ19IICAgICAgICAgMzQKLSNkZWZpbmUgTEVOR1RIXzgwMl8xMV9DUkMgICAgICAgICAgIDI4Ci0jZGVmaW5lIExFTkdUSF84MDJfMTFfV0lUSF9BRERSNCAgICAzMAotI2RlZmluZSBMRU5HVEhfODAyXzMgICAgICAgICAgICAgICAgMTQKLSNkZWZpbmUgTEVOR1RIXzgwMl8zX1RZUEUgICAgICAgICAgIDIKLSNkZWZpbmUgTEVOR1RIXzgwMl8xX0ggICAgICAgICAgICAgIDgKLSNkZWZpbmUgTEVOR1RIX0VBUE9MX0ggICAgICAgICAgICAgIDQKLSNkZWZpbmUgTEVOR1RIX1dNTVFPU19ICQkJCTIKLSNkZWZpbmUgTEVOR1RIX0NSQyAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgTUFYX1NFUV9OVU1CRVIgICAgICAgICAgICAgIDB4MGZmZgotI2RlZmluZSBMRU5HVEhfODAyXzNfTk9fVFlQRQkJMTIKLSNkZWZpbmUgTEVOR1RIXzgwMl8xUQkJCQk0IC8qIFZMQU4gcmVsYXRlZCAqLwotCi0vLyBTVEFfQ1NSNC5maWVsZC5UeFJlc3VsdAotI2RlZmluZSBUWF9SRVNVTFRfU1VDQ0VTUyAgICAgICAgICAgMAotI2RlZmluZSBUWF9SRVNVTFRfWkVST19MRU5HVEggICAgICAgMQotI2RlZmluZSBUWF9SRVNVTFRfVU5ERVJfUlVOICAgICAgICAgMgotI2RlZmluZSBUWF9SRVNVTFRfT0hZX0VSUk9SICAgICAgICAgNAotI2RlZmluZSBUWF9SRVNVTFRfUkVUUllfRkFJTCAgICAgICAgNgotCi0vLyBBbGwgUEhZIHJhdGUgc3VtbWFyeSBpbiBUWEQKLS8vIFByZWFtYmxlIE1PREUgaW4gVHhECi0jZGVmaW5lIE1PREVfQ0NLCTAKLSNkZWZpbmUgTU9ERV9PRkRNICAgMQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotI2RlZmluZSBNT0RFX0hUTUlYCTIKLSNkZWZpbmUgTU9ERV9IVEdSRUVORklFTEQJMwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotLy8gTUNTIGZvciBDQ0suICBCVy5TR0kuU1RCQyBhcmUgcmVzZXJ2ZWQKLSNkZWZpbmUgTUNTX0xPTkdQX1JBVEVfMSAgICAgICAgICAgICAgICAgICAgICAwCSAvLyBsb25nIHByZWFtYmxlIENDSyAxTWJwcwotI2RlZmluZSBNQ1NfTE9OR1BfUkFURV8yICAgICAgICAgICAgICAgICAgICAgIDEJLy8gbG9uZyBwcmVhbWJsZSBDQ0sgMU1icHMKLSNkZWZpbmUgTUNTX0xPTkdQX1JBVEVfNV81ICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIE1DU19MT05HUF9SQVRFXzExICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBNQ1NfU0hPUlRQX1JBVEVfMSAgICAgICAgICAgICAgICAgICAgICA0CSAvLyBsb25nIHByZWFtYmxlIENDSyAxTWJwcy4gc2hvcnQgaXMgZm9yYmlkZGVuIGluIDFNYnBzCi0jZGVmaW5lIE1DU19TSE9SVFBfUkFURV8yICAgICAgICAgICAgICAgICAgICAgIDUJLy8gc2hvcnQgcHJlYW1ibGUgQ0NLIDJNYnBzCi0jZGVmaW5lIE1DU19TSE9SVFBfUkFURV81XzUgICAgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgTUNTX1NIT1JUUF9SQVRFXzExICAgICAgICAgICAgICAgICAgICAgNwotLy8gVG8gc2VuZCBkdXBsaWNhdGUgbGVnYWN5IE9GRE0uIHNldCBCVz1CV180MC4gIFNHSS5TVEJDIGFyZSByZXNlcnZlZAotI2RlZmluZSBNQ1NfUkFURV82ICAgICAgICAgICAgICAgICAgICAgIDAgICAvLyBsZWdhY3kgT0ZETQotI2RlZmluZSBNQ1NfUkFURV85ICAgICAgICAgICAgICAgICAgICAgIDEgICAvLyBPRkRNCi0jZGVmaW5lIE1DU19SQVRFXzEyICAgICAgICAgICAgICAgICAgICAgMiAgIC8vIE9GRE0KLSNkZWZpbmUgTUNTX1JBVEVfMTggICAgICAgICAgICAgICAgICAgICAzICAgLy8gT0ZETQotI2RlZmluZSBNQ1NfUkFURV8yNCAgICAgICAgICAgICAgICAgICAgIDQgIC8vIE9GRE0KLSNkZWZpbmUgTUNTX1JBVEVfMzYgICAgICAgICAgICAgICAgICAgICA1ICAgLy8gT0ZETQotI2RlZmluZSBNQ1NfUkFURV80OCAgICAgICAgICAgICAgICAgICAgIDYgIC8vIE9GRE0KLSNkZWZpbmUgTUNTX1JBVEVfNTQgICAgICAgICAgICAgICAgICAgICA3IC8vIE9GRE0KLS8vIEhUCi0jZGVmaW5lIE1DU18wCQkwCS8vIDFTCi0jZGVmaW5lIE1DU18xCQkxCi0jZGVmaW5lIE1DU18yCQkyCi0jZGVmaW5lIE1DU18zCQkzCi0jZGVmaW5lIE1DU180CQk0Ci0jZGVmaW5lIE1DU181CQk1Ci0jZGVmaW5lIE1DU182CQk2Ci0jZGVmaW5lIE1DU183CQk3Ci0jZGVmaW5lIE1DU184CQk4CS8vIDJTCi0jZGVmaW5lIE1DU185CQk5Ci0jZGVmaW5lIE1DU18xMAkJMTAKLSNkZWZpbmUgTUNTXzExCQkxMQotI2RlZmluZSBNQ1NfMTIJCTEyCi0jZGVmaW5lIE1DU18xMwkJMTMKLSNkZWZpbmUgTUNTXzE0CQkxNAotI2RlZmluZSBNQ1NfMTUJCTE1Ci0jZGVmaW5lIE1DU18xNgkJMTYJLy8gMyozCi0jZGVmaW5lIE1DU18xNwkJMTcKLSNkZWZpbmUgTUNTXzE4CQkxOAotI2RlZmluZSBNQ1NfMTkJCTE5Ci0jZGVmaW5lIE1DU18yMAkJMjAKLSNkZWZpbmUgTUNTXzIxCQkyMQotI2RlZmluZSBNQ1NfMjIJCTIyCi0jZGVmaW5lIE1DU18yMwkJMjMKLSNkZWZpbmUgTUNTXzMyCQkzMgotI2RlZmluZSBNQ1NfQVVUTwkJMzMKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotLy8gT0lEX0hUUEhZTU9ERQotLy8gTU9ERQotI2RlZmluZSBIVE1PREVfTU0JMAotI2RlZmluZSBIVE1PREVfR0YJMQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0vLyBGaXhlZCBUeCBNT0RFIC0gSFQsIENDSyBvciBPRkRNCi0jZGVmaW5lIEZJWEVEX1RYTU9ERV9IVAkJMAotI2RlZmluZSBGSVhFRF9UWE1PREVfQ0NLCTEKLSNkZWZpbmUgRklYRURfVFhNT0RFX09GRE0JMgotLy8gQlcKLSNkZWZpbmUgQldfMjAJCUJBTkRfV0lEVEhfMjAKLSNkZWZpbmUgQldfNDAJCUJBTkRfV0lEVEhfNDAKLSNkZWZpbmUgQldfQk9USAkJQkFORF9XSURUSF9CT1RICi0jZGVmaW5lIEJXXzEwCQlCQU5EX1dJRFRIXzEwCS8vIDgwMi4xMWogaGFzIDEwTUh6LiBUaGlzIGRlZmluaXRpb24gaXMgZm9yIGludGVybmFsIHVzYWdlLiBkb2Vzbid0IGZpbGwgaW4gdGhlIElFIG9yIG90aGVyIGZpZWxkLgotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0vLyBTSE9SVEdJCi0jZGVmaW5lIEdJXzQwMAkJR0FQX0lOVEVSVkFMXzQwMAkvLyBvbmx5IHN1cHBvcnQgaW4gSFQgbW9kZQotI2RlZmluZSBHSV9CT1RICQlHQVBfSU5URVJWQUxfQk9USAotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotI2RlZmluZSBHSV84MDAJCUdBUF9JTlRFUlZBTF84MDAKLS8vIFNUQkMKLSNkZWZpbmUgU1RCQ19OT05FCTAKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSNkZWZpbmUgU1RCQ19VU0UJMQkvLyBsaW1pdGVkIHVzZSBpbiBydDI4NjBiIHBoeQotI2RlZmluZSBSWFNUQkNfT05FCTEJLy8gcnggc3VwcG9ydCBvZiBvbmUgc3BhdGlhbCBzdHJlYW0KLSNkZWZpbmUgUlhTVEJDX1RXTwkyCS8vIHJ4IHN1cHBvcnQgb2YgMSBhbmQgMiBzcGF0aWFsIHN0cmVhbQotI2RlZmluZSBSWFNUQkNfVEhSCTMJLy8gcnggc3VwcG9ydCBvZiAxfjMgc3BhdGlhbCBzdHJlYW0KLS8vIE1DUyBGRUVEQkFDSwotI2RlZmluZSBNQ1NGQktfTk9ORQkwICAvLyBub3Qgc3VwcG9ydCBtY3MgZmVlZGJhY2sgLwotI2RlZmluZSBNQ1NGQktfUlNWCTEJLy8gcmVzZXJ2ZWQKLSNkZWZpbmUgTUNTRkJLX1VOU09MSUNJVAkyCS8vIG9ubHkgc3VwcG9ydCB1bnNvbGljdCBtY3MgZmVlZGJhY2sKLSNkZWZpbmUgTUNTRkJLX01SUQkzCS8vIHJlc3BvbnNlIHRvIGJvdGggTVJRIGFuZCB1bnNvbGljdCBtY3MgZmVlZGJhY2sKLQotLy8gTUlNTyBwb3dlciBzYWZlCi0jZGVmaW5lCU1NUFNfU1RBVElDCTAKLSNkZWZpbmUJTU1QU19EWU5BTUlDCQkxCi0jZGVmaW5lICAgTU1QU19SU1YJCTIKLSNkZWZpbmUgTU1QU19FTkFCTEUJCTMKLQotCi0vLyBBLU1TRFUgc2l6ZQotI2RlZmluZQlBTVNEVV8wCTAKLSNkZWZpbmUJQU1TRFVfMQkJMQotCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLS8vIE1DUyB1c2UgNyBiaXRzCi0jZGVmaW5lIFRYUkFURU1JTU8JCTB4ODAKLSNkZWZpbmUgVFhSQVRFTUNTCQkweDdGCi0jZGVmaW5lIFRYUkFURU9GRE0JCTB4N0YKLSNkZWZpbmUgUkFURV8xICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgUkFURV8yICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgUkFURV81XzUgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgUkFURV8xMSAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgUkFURV82ICAgICAgICAgICAgICAgICAgICAgIDQgICAvLyBPRkRNCi0jZGVmaW5lIFJBVEVfOSAgICAgICAgICAgICAgICAgICAgICA1ICAgLy8gT0ZETQotI2RlZmluZSBSQVRFXzEyICAgICAgICAgICAgICAgICAgICAgNiAgIC8vIE9GRE0KLSNkZWZpbmUgUkFURV8xOCAgICAgICAgICAgICAgICAgICAgIDcgICAvLyBPRkRNCi0jZGVmaW5lIFJBVEVfMjQgICAgICAgICAgICAgICAgICAgICA4ICAgLy8gT0ZETQotI2RlZmluZSBSQVRFXzM2ICAgICAgICAgICAgICAgICAgICAgOSAgIC8vIE9GRE0KLSNkZWZpbmUgUkFURV80OCAgICAgICAgICAgICAgICAgICAgIDEwICAvLyBPRkRNCi0jZGVmaW5lIFJBVEVfNTQgICAgICAgICAgICAgICAgICAgICAxMSAgLy8gT0ZETQotI2RlZmluZSBSQVRFX0ZJUlNUX09GRE1fUkFURSAgICAgICAgUkFURV82Ci0jZGVmaW5lIFJBVEVfTEFTVF9PRkRNX1JBVEUJCVJBVEVfNTQKLSNkZWZpbmUgUkFURV82XzUgICAgICAgICAgICAgICAgICAgIDEyICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV8xMyAgICAgICAgICAgICAgICAgICAgIDEzICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV8xOV81ICAgICAgICAgICAgICAgICAgIDE0ICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV8yNiAgICAgICAgICAgICAgICAgICAgIDE1ICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV8zOSAgICAgICAgICAgICAgICAgICAgIDE2ICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV81MiAgICAgICAgICAgICAgICAgICAgIDE3ICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV81OF81ICAgICAgICAgICAgICAgICAgIDE4ICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV82NSAgICAgICAgICAgICAgICAgICAgIDE5ICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV83OCAgICAgICAgICAgICAgICAgICAgIDIwICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV8xMDQgICAgICAgICAgICAgICAgICAgIDIxICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV8xMTcgICAgICAgICAgICAgICAgICAgIDIyICAvLyBIVCBtaXgKLSNkZWZpbmUgUkFURV8xMzAgICAgICAgICAgICAgICAgICAgIDIzICAvLyBIVCBtaXgKLS8vI2RlZmluZSBSQVRFX0FVVE9fU1dJVENIICAgICAgICAgICAgMjU1IC8vIGZvciBTdGFDZmcuRml4ZWRUeFJhdGUgb25seQotI2RlZmluZSBIVFJBVEVfMCAgICAgICAgICAgICAgICAgICAgICAxMgotI2RlZmluZSBSQVRFX0ZJUlNUX01NX1JBVEUgICAgICAgIEhUUkFURV8wCi0jZGVmaW5lIFJBVEVfRklSU1RfSFRfUkFURSAgICAgICAgSFRSQVRFXzAKLSNkZWZpbmUgUkFURV9MQVNUX0hUX1JBVEUgICAgICAgIEhUUkFURV8wCi0KLS8vIHBUeFdJLT50eG9wCi0jZGVmaW5lIElGU19IVFRYT1AgICAgICAgICAgICAgICAgIDAJLy8gVGhlIHR4b3Agd2lsbCBiZSBoYW5kbGVzIGJ5IEFTSUMuCi0jZGVmaW5lIElGU19QSUZTICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIElGU19TSUZTICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIElGU19CQUNLT0ZGICAgICAgICAgICAgICAgICAzCi0KLS8vIHBUeEQtPlJldHJ5TW9kZQotI2RlZmluZSBMT05HX1JFVFJZICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTSE9SVF9SRVRSWSAgICAgICAgICAgICAgICAgMAotCi0vLyBDb3VudHJ5IFJlZ2lvbiBkZWZpbml0aW9uCi0jZGVmaW5lIFJFR0lPTl9NSU5JTVVNX0JHX0JBTkQgICAgICAgICAgICAwCi0jZGVmaW5lIFJFR0lPTl8wX0JHX0JBTkQgICAgICAgICAgICAgICAgICAwICAgICAgIC8vIDEtMTEKLSNkZWZpbmUgUkVHSU9OXzFfQkdfQkFORCAgICAgICAgICAgICAgICAgIDEgICAgICAgLy8gMS0xMwotI2RlZmluZSBSRUdJT05fMl9CR19CQU5EICAgICAgICAgICAgICAgICAgMiAgICAgICAvLyAxMC0xMQotI2RlZmluZSBSRUdJT05fM19CR19CQU5EICAgICAgICAgICAgICAgICAgMyAgICAgICAvLyAxMC0xMwotI2RlZmluZSBSRUdJT05fNF9CR19CQU5EICAgICAgICAgICAgICAgICAgNCAgICAgICAvLyAxNAotI2RlZmluZSBSRUdJT05fNV9CR19CQU5EICAgICAgICAgICAgICAgICAgNSAgICAgICAvLyAxLTE0Ci0jZGVmaW5lIFJFR0lPTl82X0JHX0JBTkQgICAgICAgICAgICAgICAgICA2ICAgICAgIC8vIDMtOQotI2RlZmluZSBSRUdJT05fN19CR19CQU5EICAgICAgICAgICAgICAgICAgNyAgICAgICAvLyA1LTEzCi0jZGVmaW5lIFJFR0lPTl8zMV9CR19CQU5EICAgICAgICAgICAgICAgICAzMSAgICAgICAvLyA1LTEzCi0jZGVmaW5lIFJFR0lPTl9NQVhJTVVNX0JHX0JBTkQgICAgICAgICAgICA3Ci0KLSNkZWZpbmUgUkVHSU9OX01JTklNVU1fQV9CQU5EICAgICAgICAgICAgIDAKLSNkZWZpbmUgUkVHSU9OXzBfQV9CQU5EICAgICAgICAgICAgICAgICAgIDAgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQotI2RlZmluZSBSRUdJT05fMV9BX0JBTkQgICAgICAgICAgICAgICAgICAgMSAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwCi0jZGVmaW5lIFJFR0lPTl8yX0FfQkFORCAgICAgICAgICAgICAgICAgICAyICAgICAgIC8vIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NAotI2RlZmluZSBSRUdJT05fM19BX0JBTkQgICAgICAgICAgICAgICAgICAgMyAgICAgICAvLyA1MiwgNTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxCi0jZGVmaW5lIFJFR0lPTl80X0FfQkFORCAgICAgICAgICAgICAgICAgICA0ICAgICAgIC8vIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1Ci0jZGVmaW5lIFJFR0lPTl81X0FfQkFORCAgICAgICAgICAgICAgICAgICA1ICAgICAgIC8vIDE0OSwgMTUzLCAxNTcsIDE2MQotI2RlZmluZSBSRUdJT05fNl9BX0JBTkQgICAgICAgICAgICAgICAgICAgNiAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OAotI2RlZmluZSBSRUdJT05fN19BX0JBTkQgICAgICAgICAgICAgICAgICAgNyAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NSwgMTY5LCAxNzMKLSNkZWZpbmUgUkVHSU9OXzhfQV9CQU5EICAgICAgICAgICAgICAgICAgIDggICAgICAgLy8gNTIsIDU2LCA2MCwgNjQKLSNkZWZpbmUgUkVHSU9OXzlfQV9CQU5EICAgICAgICAgICAgICAgICAgIDkgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTMyLCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUKLSNkZWZpbmUgUkVHSU9OXzEwX0FfQkFORCAgICAgICAgICAgICAgICAgIDEwCSAgLy8gMzYsIDQwLCA0NCwgNDgsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1Ci0jZGVmaW5lIFJFR0lPTl8xMV9BX0JBTkQgICAgICAgICAgICAgICAgICAxMQkgIC8vIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTQ5LCAxNTMsIDE1NywgMTYxCi0jZGVmaW5lIFJFR0lPTl8xMl9BX0JBTkQgICAgICAgICAgICAgICAgICAxMiAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwCi0jZGVmaW5lIFJFR0lPTl8xM19BX0JBTkQgICAgICAgICAgICAgICAgICAxMyAgICAgICAvLyA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MQotI2RlZmluZSBSRUdJT05fMTRfQV9CQU5EICAgICAgICAgICAgICAgICAgMTQgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1Ci0jZGVmaW5lIFJFR0lPTl8xNV9BX0JBTkQgICAgICAgICAgICAgICAgICAxNSAgICAgICAvLyAxNDksIDE1MywgMTU3LCAxNjEsIDE2NSwgMTY5LCAxNzMKLSNkZWZpbmUgUkVHSU9OX01BWElNVU1fQV9CQU5EICAgICAgICAgICAgIDE1Ci0KLS8vIHBUeEQtPkNpcGhlckFsZwotI2RlZmluZSBDSVBIRVJfTk9ORSAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBDSVBIRVJfV0VQNjQgICAgICAgICAgICAgICAgMQotI2RlZmluZSBDSVBIRVJfV0VQMTI4ICAgICAgICAgICAgICAgMgotI2RlZmluZSBDSVBIRVJfVEtJUCAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBDSVBIRVJfQUVTICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBDSVBIRVJfQ0tJUDY0ICAgICAgICAgICAgICAgNQotI2RlZmluZSBDSVBIRVJfQ0tJUDEyOCAgICAgICAgICAgICAgNgotI2RlZmluZSBDSVBIRVJfVEtJUF9OT19NSUMgICAgICAgICAgNyAgICAgICAvLyBNSUMgYXBwZW5kZWQgYnkgZHJpdmVyOiBub3QgYSB2YWxpZCB2YWx1ZSBpbiBoYXJkd2FyZSBrZXkgdGFibGUKLSNkZWZpbmUgQ0lQSEVSX1NNUzQJCQkJCTgKLQotCi0vLyBMRUQgU3RhdHVzLgotI2RlZmluZSBMRURfTElOS19ET1dOICAgICAgICAgICAgICAgMAotI2RlZmluZSBMRURfTElOS19VUCAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBMRURfUkFESU9fT0ZGICAgICAgICAgICAgICAgMgotI2RlZmluZSBMRURfUkFESU9fT04gICAgICAgICAgICAgICAgMwotI2RlZmluZSBMRURfSEFMVCAgICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBMRURfV1BTICAgICAgICAgICAgICAgICAgICAgNQotI2RlZmluZSBMRURfT05fU0lURV9TVVJWRVkgICAgICAgICAgNgotI2RlZmluZSBMRURfUE9XRVJfVVAgICAgICAgICAgICAgICAgNwotCi0KLS8vIHZhbHVlIGRvbWFpbiBvZiBwQWQtPkxlZENudGwuTGVkTW9kZSBhbmQgRTJQUk9NCi0jZGVmaW5lIExFRF9NT0RFX0RFRkFVTFQgICAgICAgICAgICAwCi0jZGVmaW5lIExFRF9NT0RFX1RXT19MRUQJCQkxCi0vLyNkZWZpbmUgTEVEX01PREVfU0lHTkFMX1NUUkVHVEgJCTggIC8vIEVFUFJPTSBkZWZpbmUgPTgKLSNkZWZpbmUgTEVEX01PREVfU0lHTkFMX1NUUkVHVEgJCTB4NDAgLy8gRUVQUk9NIGRlZmluZSA9IDY0Ci0KLS8vIFJDNCBpbml0IHZhbHVlLCB1c2VkIGZybyBXRVAgJiBUS0lQCi0jZGVmaW5lIFBQUElOSVRGQ1MzMiAgICAgICAgICAgICAgICAweGZmZmZmZmZmICAgLyogSW5pdGlhbCBGQ1MgdmFsdWUgKi8KLQotLy8gdmFsdWUgZG9tYWluIG9mIHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkLiA4MDIuMVggY29udHJvbGxlZCBwb3J0IGRlZmluaXRpb24KLSNkZWZpbmUgV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQgICAgIDEKLSNkZWZpbmUgV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEIDIKLQotI2RlZmluZSBQQUlSV0lTRV9LRVkgICAgICAgICAgICAgICAgMQotI2RlZmluZSBHUk9VUF9LRVkgICAgICAgICAgICAgICAgICAgMgotCi0vL2RlZmluaXRpb24gb2YgRFJTCi0jZGVmaW5lIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENICTMyCi0KLQotLy8gcHJlLWFsbG9jYXRlZCBmcmVlIE5ESVMgUEFDS0VUL0JVRkZFUiBwb2xsIGZvciBpbnRlcm5hbCB1c2FnZQotI2RlZmluZSBNQVhfTlVNX09GX0ZSRUVfTkRJU19QQUNLRVQgMTI4Ci0KLS8vQmxvY2sgQUNLCi0jZGVmaW5lIE1BWF9UWF9SRU9SREVSQlVGICAgNjQKLSNkZWZpbmUgTUFYX1JYX1JFT1JERVJCVUYgICA2NAotI2RlZmluZSBERUZBVUxUX1RYX1RJTUVPVVQgICAzMAotI2RlZmluZSBERUZBVUxUX1JYX1RJTUVPVVQgICAzMAotCi0vLyBkZWZpbml0aW9uIG9mIFJlY2lwaWVudCBvciBPcmlnaW5hdG9yCi0jZGVmaW5lIElfUkVDSVBJRU5UICAgICAgICAgICAgICAgICAgVFJVRQotI2RlZmluZSBJX09SSUdJTkFUT1IgICAgICAgICAgICAgICAgICAgRkFMU0UKLQotI2RlZmluZSBERUZBVUxUX0JCUF9UWF9QT1dFUiAgICAgICAgMAotI2RlZmluZSBERUZBVUxUX1JGX1RYX1BPV0VSICAgICAgICAgNQotCi0jZGVmaW5lIE1BWF9JTklfQlVGRkVSX1NJWkUJCTQwOTYKLSNkZWZpbmUgTUFYX1BBUkFNX0JVRkZFUl9TSVpFCQkoMjA0OCkgLy8gZW5vdWdoIGZvciBBQ0wgKDE4KjY0KQotCQkJCQkJCQkJCQkvLzE4IDogdGhlIGxlbmd0aCBvZiBNYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAiMDE6MDI6MDM6MDQ6MDU6MDY7IikKLQkJCQkJCQkJCQkJLy82NCA6IE1BWF9OVU1fT0ZfQUNMX0xJU1QKLS8vIGRlZmluaXRpb24gb2YgcEFkLT5PcE1vZGUKLSNkZWZpbmUgT1BNT0RFX1NUQSAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgT1BNT0RFX0FQICAgICAgICAgICAgICAgICAgIDEKLS8vI2RlZmluZSBPUE1PREVfTDNfQlJHICAgICAgICAgICAgICAgMiAgICAgICAvLyBhcyBBUCBhbmQgU1RBIGF0IHRoZSBzYW1lIHRpbWUKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSNkZWZpbmUgRElSX1JFQUQgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgRElSX1dSSVRFICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgVFlQRV9UWEQgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgVFlQRV9SWEQgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgVFlQRV9UWElORk8JCQkJCTAKLSNkZWZpbmUgVFlQRV9SWElORk8JCQkJCTEKLSNkZWZpbmUgVFlQRV9UWFdJCQkJCQkwCi0jZGVmaW5lIFRZUEVfUlhXSQkJCQkJMQotI2VuZGlmCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT0gQVAgcnRtcF9kZWYuaCA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIHZhbHVlIGRvbWFpbiBmb3IgcEFkLT5FdmVudFRhYi5Mb2dbXS5FdmVudAotI2RlZmluZSBFVkVOVF9SRVNFVF9BQ0NFU1NfUE9JTlQgICAgMCAvLyBMb2cgPSAiaGg6bW06c3MgICBSZXN0YXJ0IEFjY2VzcyBQb2ludCIKLSNkZWZpbmUgRVZFTlRfQVNTT0NJQVRFRCAgICAgICAgICAgIDEgLy8gTG9nID0gImhoOm1tOnNzICAgU1RBIDAwOjAxOjAyOjAzOjA0OjA1IGFzc29jaWF0ZWQiCi0jZGVmaW5lIEVWRU5UX0RJU0FTU09DSUFURUQgICAgICAgICAyIC8vIExvZyA9ICJoaDptbTpzcyAgIFNUQSAwMDowMTowMjowMzowNDowNSBsZWZ0IHRoaXMgQlNTIgotI2RlZmluZSBFVkVOVF9BR0VEX09VVCAgICAgICAgICAgICAgMyAvLyBMb2cgPSAiaGg6bW06c3MgICBTVEEgMDA6MDE6MDI6MDM6MDQ6MDUgd2FzIGFnZWQtb3V0IGFuZCByZW1vdmVkIGZyb20gdGhpcyBCU1MiCi0jZGVmaW5lIEVWRU5UX0NPVU5URVJfTSAgICAgICAgICAgICA0Ci0jZGVmaW5lIEVWRU5UX0lOVkFMSURfUFNLICAgICAgICAgICA1Ci0jZGVmaW5lIEVWRU5UX01BWF9FVkVOVF9UWVBFICAgICAgICA2Ci0vLyA9PT09IGVuZCBvZiBBUCBydG1wX2RlZi5oID09PT09PT09PT09PQotCi0vLyBkZWZpbml0aW9uIFJTU0kgTnVtYmVyCi0jZGVmaW5lIFJTU0lfMAkJCQkJMAotI2RlZmluZSBSU1NJXzEJCQkJCTEKLSNkZWZpbmUgUlNTSV8yCQkJCQkyCi0KLS8vIGRlZmluaXRpb24gb2YgcmFkYXIgZGV0ZWN0aW9uCi0jZGVmaW5lIFJEX05PUk1BTF9NT0RFCQkJCTAJLy8gTm90IGZvdW5kIHJhZGFyIHNpZ25hbAotI2RlZmluZSBSRF9TV0lUQ0hJTkdfTU9ERQkJCTEJLy8gRm91bmQgcmFkYXIgc2lnbmFsLCBhbmQgZG9pbmcgY2hhbm5lbCBzd2l0Y2gKLSNkZWZpbmUgUkRfU0lMRU5DRV9NT0RFCQkJCTIJLy8gQWZ0ZXIgY2hhbm5lbCBzd2l0Y2gsIG5lZWQgdG8gYmUgc2lsZW5jZSBhIHdoaWxlIHRvIGVuc3VyZSByYWRhciBub3QgZm91bmQKLQotLy9Ecml2ZXIgZGVmaW5lZCBjaWQgZm9yIG1hcHBpbmcgc3RhdHVzIGFuZCBjb21tYW5kLgotI2RlZmluZSAgU0xFRVBDSUQJMHgxMQotI2RlZmluZSAgV0FLRUNJRAkweDIyCi0jZGVmaW5lICBRVUVSWVBPV0VSQ0lECTB4MzMKLSNkZWZpbmUgIE9XTkVSTUNVCTB4MQotI2RlZmluZSAgT1dORVJDUFUJMHgwCi0KLS8vIE1CU1NJRCBkZWZpbml0aW9uCi0jZGVmaW5lIEVOVFJZX05PVF9GT1VORCAgICAgICAgICAgICAweEZGCi0KLQotLyogQWZ0ZXIgTGludXggMi42LjksCi0gKiBWTEFOIG1vZHVsZSB1c2UgUHJpdmF0ZSAoZnJvbSB1c2VyKSBpbnRlcmZhY2UgZmxhZ3MgKG5ldGRldmljZS0+cHJpdl9mbGFncykuCi0gKiAjZGVmaW5lIElGRl84MDJfMVFfVkxBTiAweDEgICAgICAgICAtLSAgICA4MDIuMVEgVkxBTiBkZXZpY2UuICBpbiBpZi5oCi0gKiByZWYgdG8gaXBfc2Fib3RhZ2Vfb3V0KCkgWyBvdXQtPnByaXZfZmxhZ3MgJiBJRkZfODAyXzFRX1ZMQU4gXSBpbiBicl9uZXRmaWx0ZXIuYwotICoKLSAqIEZvciB0aGlzIHJlYXNvbiwgd2UgTVVTVCB1c2UgRVZFTiB2YWx1ZSBpbiBwcml2X2ZsYWdzCi0gKi8KLSNkZWZpbmUgSU5UX01BSU4JCQkweDAxMDAKLSNkZWZpbmUgSU5UX01CU1NJRAkJCTB4MDIwMAotI2RlZmluZSBJTlRfV0RTCQkJCTB4MDMwMAotI2RlZmluZSBJTlRfQVBDTEkJCQkweDA0MDAKLSNkZWZpbmUgSU5UX01FU0gJCQkweDA1MDAKLQotI2RlZmluZSBJTkZfTUFJTl9ERVZfTkFNRQkJIndsYW4iCi0jZGVmaW5lIElORl9NQlNTSURfREVWX05BTUUJCSJ3bGFuIgotI2RlZmluZSBJTkZfV0RTX0RFVl9OQU1FCQkid2RzIgotI2RlZmluZSBJTkZfQVBDTElfREVWX05BTUUJCSJhcGNsaSIKLSNkZWZpbmUgSU5GX01FU0hfREVWX05BTUUJCSJtZXNoIgotCi0vLyBVc2UgYml0bWFwIHRvIGFsbG93IGNvZXhpc3Qgb2YgQVRFX1RYRlJBTUUgYW5kIEFURV9SWEZSQU1FKGkuZS4sdG8gc3VwcG9ydCBMb29wQmFjayBtb2RlKS4KLSNpZmRlZiBSQUxJTktfQVRFCi0jZGVmaW5lCUFURV9TVEFSVCAgICAgICAgICAgICAgICAgICAweDAwICAgLy8gU3RhcnQgQVRFCi0jZGVmaW5lCUFURV9TVE9QICAgICAgICAgICAgICAgICAgICAweDgwICAgLy8gU3RvcCBBVEUKLSNkZWZpbmUJQVRFX1RYQ09OVCAgICAgICAgICAgICAgICAgIDB4MDUgICAvLyBDb250aW51b3VzIFRyYW5zbWl0Ci0jZGVmaW5lCUFURV9UWENBUlIgICAgICAgICAgICAgICAgICAweDA5ICAgLy8gVHJhbnNtaXQgQ2FycmllcgotI2RlZmluZQlBVEVfVFhDQVJSU1VQUCAgICAgICAgICAgICAgMHgxMSAgIC8vIFRyYW5zbWl0IENhcnJpZXIgU3VwcHJlc3Npb24KLSNkZWZpbmUJQVRFX1RYRlJBTUUgICAgICAgICAgICAgICAgIDB4MDEgICAvLyBUcmFuc21pdCBGcmFtZXMKLSNkZWZpbmUJQVRFX1JYRlJBTUUgICAgICAgICAgICAgICAgIDB4MDIgICAvLyBSZWNlaXZlIEZyYW1lcwotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0jZGVmaW5lIEFURV9UWFNUT1AgICAgICAgICAgICAgICAgICAweGUyICAgLy8gU3RvcCBUcmFuc21pdGlvbihpLmUuLCBUWENPTlQsIFRYQ0FSUiwgVFhDQVJSU1VQUCwgYW5kIFRYRlJBTUUpCi0jZGVmaW5lIEFURV9SWFNUT1AJCQkJCTB4ZmQgICAvLyBTdG9wIHJlY2VpdmluZyBGcmFtZXMKLSNkZWZpbmUJQkJQMjJfVFhGUkFNRQkJCQkweDAwICAgLy8gVHJhbnNtaXQgRnJhbWVzCi0jZGVmaW5lCUJCUDIyX1RYQ09OVF9PUl9DQVJSU1VQUCAgICAweDgwICAgLy8gQ29udGludW91cyBUcmFuc21pdCBvciBDYXJyaWVyIFN1cHByZXNzaW9uCi0jZGVmaW5lCUJCUDIyX1RYQ0FSUiAgICAgICAgICAgICAgICAweGMxICAgLy8gVHJhbnNtaXQgQ2FycmllcgotI2RlZmluZQlCQlAyNF9UWENPTlQgICAgICAgICAgICAgICAgMHgwMCAgIC8vIENvbnRpbnVvdXMgVHJhbnNtaXQKLSNkZWZpbmUJQkJQMjRfQ0FSUlNVUFAgICAgICAgICAgICAgIDB4MDEgICAvLyBDYXJyaWVyIFN1cHByZXNzaW9uCi0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLS8vIFdFUCBLZXkgVFlQRQotI2RlZmluZSBXRVBfSEVYQURFQ0lNQUxfVFlQRSAgICAwCi0jZGVmaW5lIFdFUF9BU0NJSV9UWVBFICAgICAgICAgIDEKLQotCi0KLS8vIFdJUkVMRVNTIEVWRU5UUyBkZWZpbml0aW9uCi0vKiBNYXggbnVtYmVyIG9mIGNoYXIgaW4gY3VzdG9tIGV2ZW50LCByZWZlciB0byB3aXJlbGVzc190b29scy4yOC93aXJlbGVzcy4yMC5oICovCi0jZGVmaW5lIElXX0NVU1RPTV9NQVhfTEVOCQkJCQkJCTI1NQkvKiBJbiBieXRlcyAqLwotCi0vLyBGb3Igc3lzdGVtIGV2ZW50IC0gc3RhcnQKLSNkZWZpbmUJSVdfU1lTX0VWRU5UX0ZMQUdfU1RBUlQgICAgICAgICAgICAgICAgICAgICAweDAyMDAKLSNkZWZpbmUJSVdfQVNTT0NfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKLSNkZWZpbmUJSVdfRElTQVNTT0NfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAweDAyMDEKLSNkZWZpbmUJSVdfREVBVVRIX0VWRU5UX0ZMQUcJCQkJMHgwMjAyCi0jZGVmaW5lCUlXX0FHRU9VVF9FVkVOVF9GTEFHCQkJCTB4MDIwMwotI2RlZmluZQlJV19DT1VOVEVSX01FQVNVUkVTX0VWRU5UX0ZMQUcgICAgICAgICAgICAgIDB4MDIwNAotI2RlZmluZQlJV19SRVBMQVlfQ09VTlRFUl9ESUZGX0VWRU5UX0ZMQUcgICAgICAgICAgIDB4MDIwNQotI2RlZmluZQlJV19SU05JRV9ESUZGX0VWRU5UX0ZMQUcJCQkJMHgwMjA2Ci0jZGVmaW5lCUlXX01JQ19ESUZGX0VWRU5UX0ZMQUcJCQkJCTB4MDIwNwotI2RlZmluZSBJV19JQ1ZfRVJST1JfRVZFTlRfRkxBRwkJCQkJCTB4MDIwOAotI2RlZmluZSBJV19NSUNfRVJST1JfRVZFTlRfRkxBRwkJCQkJCTB4MDIwOQotI2RlZmluZSBJV19HUk9VUF9IU19USU1FT1VUX0VWRU5UX0ZMQUcJCQkJMHgwMjBBCi0jZGVmaW5lCUlXX1BBSVJXSVNFX0hTX1RJTUVPVVRfRVZFTlRfRkxBRwkJCTB4MDIwQgotI2RlZmluZSBJV19SU05JRV9TQU5JVFlfRkFJTF9FVkVOVF9GTEFHCQkJCTB4MDIwQwotI2RlZmluZSBJV19TRVRfS0VZX0RPTkVfV1BBMV9FVkVOVF9GTEFHCQkJCTB4MDIwRAotI2RlZmluZSBJV19TRVRfS0VZX0RPTkVfV1BBMl9FVkVOVF9GTEFHCQkJCTB4MDIwRQotI2RlZmluZSBJV19TVEFfTElOS1VQX0VWRU5UX0ZMQUcJCQkJCTB4MDIwRgotI2RlZmluZSBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRwkJCQkJMHgwMjEwCi0jZGVmaW5lIElXX1NDQU5fQ09NUExFVEVEX0VWRU5UX0ZMQUcJCQkJMHgwMjExCi0jZGVmaW5lIElXX1NDQU5fRU5RVUVVRV9GQUlMX0VWRU5UX0ZMQUcJCQkJMHgwMjEyCi0vLyBpZiBhZGQgbmV3IHN5c3RlbSBldmVudCBmbGFnLCBwbGVhc2UgdXBhZHRlIHRoZSBJV19TWVNfRVZFTlRfRkxBR19FTkQKLSNkZWZpbmUJSVdfU1lTX0VWRU5UX0ZMQUdfRU5EICAgICAgICAgICAgICAgICAgICAgICAweDAyMTIKLSNkZWZpbmUJSVdfU1lTX0VWRU5UX1RZUEVfTlVNCQkJCQkJKElXX1NZU19FVkVOVF9GTEFHX0VORCAtIElXX1NZU19FVkVOVF9GTEFHX1NUQVJUICsgMSkKLS8vIEZvciBzeXN0ZW0gZXZlbnQgLSBlbmQKLQotLy8gRm9yIHNwb29mIGF0dGFjayBldmVudCAtIHN0YXJ0Ci0jZGVmaW5lCUlXX1NQT09GX0VWRU5UX0ZMQUdfU1RBUlQgICAgICAgICAgICAgICAgICAgMHgwMzAwCi0jZGVmaW5lIElXX0NPTkZMSUNUX1NTSURfRVZFTlRfRkxBRwkJCQkJMHgwMzAwCi0jZGVmaW5lIElXX1NQT09GX0FTU09DX1JFU1BfRVZFTlRfRkxBRwkJCQkweDAzMDEKLSNkZWZpbmUgSVdfU1BPT0ZfUkVBU1NPQ19SRVNQX0VWRU5UX0ZMQUcJCQkweDAzMDIKLSNkZWZpbmUgSVdfU1BPT0ZfUFJPQkVfUkVTUF9FVkVOVF9GTEFHCQkJCTB4MDMwMwotI2RlZmluZSBJV19TUE9PRl9CRUFDT05fRVZFTlRfRkxBRwkJCQkJMHgwMzA0Ci0jZGVmaW5lIElXX1NQT09GX0RJU0FTU09DX0VWRU5UX0ZMQUcJCQkJMHgwMzA1Ci0jZGVmaW5lIElXX1NQT09GX0FVVEhfRVZFTlRfRkxBRwkJCQkJMHgwMzA2Ci0jZGVmaW5lIElXX1NQT09GX0RFQVVUSF9FVkVOVF9GTEFHCQkJCQkweDAzMDcKLSNkZWZpbmUgSVdfU1BPT0ZfVU5LTk9XTl9NR01UX0VWRU5UX0ZMQUcJCQkweDAzMDgKLSNkZWZpbmUgSVdfUkVQTEFZX0FUVEFDS19FVkVOVF9GTEFHCQkJCQkweDAzMDkKLS8vIGlmIGFkZCBuZXcgc3Bvb2YgYXR0YWNrIGV2ZW50IGZsYWcsIHBsZWFzZSB1cGFkdGUgdGhlIElXX1NQT09GX0VWRU5UX0ZMQUdfRU5ECi0jZGVmaW5lCUlXX1NQT09GX0VWRU5UX0ZMQUdfRU5EICAgICAgICAgICAgICAgICAgICAgMHgwMzA5Ci0jZGVmaW5lCUlXX1NQT09GX0VWRU5UX1RZUEVfTlVNCQkJCQkJKElXX1NQT09GX0VWRU5UX0ZMQUdfRU5EIC0gSVdfU1BPT0ZfRVZFTlRfRkxBR19TVEFSVCArIDEpCi0vLyBGb3Igc3Bvb2YgYXR0YWNrIGV2ZW50IC0gZW5kCi0KLS8vIEZvciBmbG9vZGluZyBhdHRhY2sgZXZlbnQgLSBzdGFydAotI2RlZmluZQlJV19GTE9PRF9FVkVOVF9GTEFHX1NUQVJUICAgICAgICAgICAgICAgICAgIDB4MDQwMAotI2RlZmluZSBJV19GTE9PRF9BVVRIX0VWRU5UX0ZMQUcJCQkJCTB4MDQwMAotI2RlZmluZSBJV19GTE9PRF9BU1NPQ19SRVFfRVZFTlRfRkxBRwkJCQkweDA0MDEKLSNkZWZpbmUgSVdfRkxPT0RfUkVBU1NPQ19SRVFfRVZFTlRfRkxBRwkJCQkweDA0MDIKLSNkZWZpbmUgSVdfRkxPT0RfUFJPQkVfUkVRX0VWRU5UX0ZMQUcJCQkJMHgwNDAzCi0jZGVmaW5lIElXX0ZMT09EX0RJU0FTU09DX0VWRU5UX0ZMQUcJCQkJMHgwNDA0Ci0jZGVmaW5lIElXX0ZMT09EX0RFQVVUSF9FVkVOVF9GTEFHCQkJCQkweDA0MDUKLSNkZWZpbmUgSVdfRkxPT0RfRUFQX1JFUV9FVkVOVF9GTEFHCQkJCQkweDA0MDYKLS8vIGlmIGFkZCBuZXcgZmxvb2RpbmcgYXR0YWNrIGV2ZW50IGZsYWcsIHBsZWFzZSB1cGFkdGUgdGhlIElXX0ZMT09EX0VWRU5UX0ZMQUdfRU5ECi0jZGVmaW5lCUlXX0ZMT09EX0VWRU5UX0ZMQUdfRU5ECQkJCTB4MDQwNgotI2RlZmluZQlJV19GTE9PRF9FVkVOVF9UWVBFX05VTQkJCQkJCShJV19GTE9PRF9FVkVOVF9GTEFHX0VORCAtIElXX0ZMT09EX0VWRU5UX0ZMQUdfU1RBUlQgKyAxKQotLy8gRm9yIGZsb29kaW5nIGF0dGFjayAtIGVuZAotCi0vLyBFbmQgLSBXSVJFTEVTUyBFVkVOVFMgZGVmaW5pdGlvbgotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0vLyBkZWZpbml0aW9uIGZvciBETFMsIGthdGh5Ci0jZGVmaW5lCU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlkgICAxCi0jZGVmaW5lCU1BWF9OVU1fT0ZfRExTX0VOVFJZICAgICAgICBNQVhfTlVNQkVSX09GX0RMU19FTlRSWQotCi0vL0Jsb2NrIEFDSywga2F0aHkKLSNkZWZpbmUgTUFYX1RYX1JFT1JERVJCVUYJCTY0Ci0jZGVmaW5lIE1BWF9SWF9SRU9SREVSQlVGCQk2NAotI2RlZmluZSBERUZBVUxUX1RYX1RJTUVPVVQJCTMwCi0jZGVmaW5lIERFRkFVTFRfUlhfVElNRU9VVAkJMzAKLSNkZWZpbmUgTUFYX0JBUkVDSV9TRVNTSU9OCQk4Ci0KLSNpZm5kZWYgSVdfRVNTSURfTUFYX1NJWkUKLS8qIE1heGltdW0gc2l6ZSBvZiB0aGUgRVNTSUQgYW5kIHBBZC0+bmlja25hbWUgc3RyaW5ncyAqLwotI2RlZmluZSBJV19FU1NJRF9NQVhfU0laRQkJMzIKLSNlbmRpZgotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgTUNBU1RfUkFURV9TUEVDSUZJQwotI2RlZmluZSBNQ0FTVF9ESVNBQkxFCTAKLSNkZWZpbmUgTUNBU1RfQ0NLCQkxCi0jZGVmaW5lIE1DQVNUX09GRE0JCTIKLSNkZWZpbmUgTUNBU1RfSFRNSVgJCTMKLSNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCi0KLS8vIEZvciBBc2ljUmFkaW9PZmYvQXNpY1JhZGlvT24gZnVuY3Rpb24KLSNkZWZpbmUgRE9UMTFQT1dFUlNBVkUJCTAKLSNkZWZpbmUgR1VJUkFESU9fT0ZGCQkxCi0jZGVmaW5lIFJUTVBfSEFMVAkJICAgIDIKLSNkZWZpbmUgR1VJX0lETEVfUE9XRVJfU0FWRQkJMwotLy8gLS0KLQotCi0vLyBkZWZpbml0aW9uIGZvciBXcGFTdXBwb3J0IGZsYWcKLSNkZWZpbmUgV1BBX1NVUFBMSUNBTlRfRElTQUJMRQkJCQkwCi0jZGVmaW5lIFdQQV9TVVBQTElDQU5UX0VOQUJMRQkJCQkxCi0jZGVmaW5lCVdQQV9TVVBQTElDQU5UX0VOQUJMRV9XSVRIX1dFQl9VSQkyCi0KLS8vIGRlZmluaXRpb24gZm9yIEFudGVubmEgRGl2ZXJzaXR5IGZsYWcKLSNpZmRlZiBBTlRfRElWRVJTSVRZX1NVUFBPUlQKLWVudW0gQU5UX0RJVkVSU0lUWV9UWVBFIHsKLSAgICBBTlRfRElWRVJTSVRZX0RJU0FCTEUgPSAwLAotICAgIEFOVF9ESVZFUlNJVFlfRU5BQkxFID0gMSwKLSAgICBBTlRfRklYX0FOVDEgPSAyLAotICAgIEFOVF9GSVhfQU5UMiA9IDMKLX07Ci0jZW5kaWYgLy8gQU5UX0RJVkVSU0lUWV9TVVBQT1JUIC8vCi0KLS8vIEVuZGlhbiBieXRlIHN3YXBwaW5nIGNvZGVzCi0jZGVmaW5lIFNXQVAxNih4KSBcCi0gICAgKChVSU5UMTYpKCBcCi0gICAgKCgoVUlOVDE2KSh4KSAmIChVSU5UMTYpIDB4MDBmZlUpIDw8IDgpIHwgXAotICAgICgoKFVJTlQxNikoeCkgJiAoVUlOVDE2KSAweGZmMDBVKSA+PiA4KSApKQotCi0jZGVmaW5lIFNXQVAzMih4KSBcCi0gICAgKChVSU5UMzIpKCBcCi0gICAgKCgoVUlOVDMyKSh4KSAmIChVSU5UMzIpIDB4MDAwMDAwZmZVTCkgPDwgMjQpIHwgXAotICAgICgoKFVJTlQzMikoeCkgJiAoVUlOVDMyKSAweDAwMDBmZjAwVUwpIDw8ICA4KSB8IFwKLSAgICAoKChVSU5UMzIpKHgpICYgKFVJTlQzMikgMHgwMGZmMDAwMFVMKSA+PiAgOCkgfCBcCi0gICAgKCgoVUlOVDMyKSh4KSAmIChVSU5UMzIpIDB4ZmYwMDAwMDBVTCkgPj4gMjQpICkpCi0KLSNkZWZpbmUgU1dBUDY0KHgpIFwKLSAgICAoKFVJTlQ2NCkoIFwKLSAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwMDAwMDAwZmZVTEwpIDw8IDU2KSB8IFwKLSAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwMDAwMGZmMDBVTEwpIDw8IDQwKSB8IFwKLSAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwMDBmZjAwMDBVTEwpIDw8IDI0KSB8IFwKLSAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwZmYwMDAwMDBVTEwpIDw8ICA4KSB8IFwKLSAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMGZmMDAwMDAwMDBVTEwpID4+ICA4KSB8IFwKLSAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDBmZjAwMDAwMDAwMDBVTEwpID4+IDI0KSB8IFwKLSAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwZmYwMDAwMDAwMDAwMDBVTEwpID4+IDQwKSB8IFwKLSAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweGZmMDAwMDAwMDAwMDAwMDBVTEwpID4+IDU2KSApKQotCi0jaWZkZWYgUlRfQklHX0VORElBTgotCi0jZGVmaW5lIGNwdTJsZTY0KHgpIFNXQVA2NCgoeCkpCi0jZGVmaW5lIGxlMmNwdTY0KHgpIFNXQVA2NCgoeCkpCi0jZGVmaW5lIGNwdTJsZTMyKHgpIFNXQVAzMigoeCkpCi0jZGVmaW5lIGxlMmNwdTMyKHgpIFNXQVAzMigoeCkpCi0jZGVmaW5lIGNwdTJsZTE2KHgpIFNXQVAxNigoeCkpCi0jZGVmaW5lIGxlMmNwdTE2KHgpIFNXQVAxNigoeCkpCi0jZGVmaW5lIGNwdTJiZTY0KHgpICgoVUlOVDY0KSh4KSkKLSNkZWZpbmUgYmUyY3B1NjQoeCkgKChVSU5UNjQpKHgpKQotI2RlZmluZSBjcHUyYmUzMih4KSAoKFVJTlQzMikoeCkpCi0jZGVmaW5lIGJlMmNwdTMyKHgpICgoVUlOVDMyKSh4KSkKLSNkZWZpbmUgY3B1MmJlMTYoeCkgKChVSU5UMTYpKHgpKQotI2RlZmluZSBiZTJjcHUxNih4KSAoKFVJTlQxNikoeCkpCi0KLSNlbHNlICAgLy8gTGl0dGxlX0VuZGlhbgotCi0jZGVmaW5lIGNwdTJsZTY0KHgpICgoVUlOVDY0KSh4KSkKLSNkZWZpbmUgbGUyY3B1NjQoeCkgKChVSU5UNjQpKHgpKQotI2RlZmluZSBjcHUybGUzMih4KSAoKFVJTlQzMikoeCkpCi0jZGVmaW5lIGxlMmNwdTMyKHgpICgoVUlOVDMyKSh4KSkKLSNkZWZpbmUgY3B1MmxlMTYoeCkgKChVSU5UMTYpKHgpKQotI2RlZmluZSBsZTJjcHUxNih4KSAoKFVJTlQxNikoeCkpCi0jZGVmaW5lIGNwdTJiZTY0KHgpIFNXQVA2NCgoeCkpCi0jZGVmaW5lIGJlMmNwdTY0KHgpIFNXQVA2NCgoeCkpCi0jZGVmaW5lIGNwdTJiZTMyKHgpIFNXQVAzMigoeCkpCi0jZGVmaW5lIGJlMmNwdTMyKHgpIFNXQVAzMigoeCkpCi0jZGVmaW5lIGNwdTJiZTE2KHgpIFNXQVAxNigoeCkpCi0jZGVmaW5lIGJlMmNwdTE2KHgpIFNXQVAxNigoeCkpCi0KLSNlbmRpZiAgLy8gUlRfQklHX0VORElBTgotCi0jZGVmaW5lIEFCUyhfeCwgX3kpICgoX3gpID4gKF95KSkgPyAoKF94KSAtKF95KSkgOiAoKF95KSAtKF94KSkKLQotCi0jZGVmaW5lIEEyRGVjKF9YLCBfcCkJCQkJXAotewkJCQkJCQkJCVwKLQlVQ0hBUiAqcDsJCQkJCQlcCi0JX1ggPSAwOwkJCQkJCQlcCi0JcCA9IF9wOwkJCQkJCQlcCi0Jd2hpbGUgKCgoKnAgPj0gJzAnKSAmJiAoKnAgPD0gJzknKSkpCQlcCi0JewkJCQkJCQkJCQkJCVwKLQkJaWYgKCgqcCA+PSAnMCcpICYmICgqcCA8PSAnOScpKQkJXAotCQkJX1ggPSBfWCAqIDEwICsgKnAgLSA0ODsJCQkJCVwKLQkJcCsrOwkJCQkJCQkJCQlcCi0JfQkJCQkJCQkJCQkJCVwKLX0KLQotCi0jZGVmaW5lIEEySGV4KF9YLCBfcCkJCQkJXAotZG97CQkJCQkJCQkJXAotCWNoYXIgKl9fcDsJCQkJCQlcCi0JKF9YKSA9IDA7CQkJCQkJCVwKLQlfX3AgPSAoY2hhciAqKShfcCk7CQkJCQkJCVwKLQl3aGlsZSAoKCgqX19wID49ICdhJykgJiYgKCpfX3AgPD0gJ2YnKSkgfHwgKCgqX19wID49ICdBJykgJiYgKCpfX3AgPD0gJ0YnKSkgfHwgKCgqX19wID49ICcwJykgJiYgKCpfX3AgPD0gJzknKSkpCQlcCi0JewkJCQkJCQkJCQkJCVwKLQkJaWYgKCgqX19wID49ICdhJykgJiYgKCpfX3AgPD0gJ2YnKSkJCQkJXAotCQkJKF9YKSA9IChfWCkgKiAxNiArICpfX3AgLSA4NzsJCQkJCVwKLQkJZWxzZSBpZiAoKCpfX3AgPj0gJ0EnKSAmJiAoKl9fcCA8PSAnRicpKQkJXAotCQkJKF9YKSA9IChfWCkgKiAxNiArICpfX3AgLSA1NTsJCQkJCVwKLQkJZWxzZSBpZiAoKCpfX3AgPj0gJzAnKSAmJiAoKl9fcCA8PSAnOScpKQkJXAotCQkJKF9YKSA9IChfWCkgKiAxNiArICpfX3AgLSA0ODsJCQkJCVwKLQkJX19wKys7CQkJCQkJCQkJCVwKLQl9CQkJCQkJCQkJCQkJXAotfXdoaWxlKDApCi0KLSNlbmRpZiAgLy8gX19SVE1QX0RFRl9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRtcF9kb3QxMS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX2RvdDExLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2Mzc4MjUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX2RvdDExLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIF9fRE9UMTFfQkFTRV9IX18KLSNkZWZpbmUgX19ET1QxMV9CQVNFX0hfXwotCi0jaW5jbHVkZSAicnRtcF90eXBlLmgiCi0KLQotLy8gNC1ieXRlIEhUQyBmaWVsZC4gIG1heWJlIGluY2x1ZGVkIGluIGFueSBmcmFtZSBleGNlcHQgbm9uLVFPUyBkYXRhIGZyYW1lLiAgVGhlIE9yZGVyIGJpdCBtdXN0IHNldCAxLgotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0gICAgVUlOVDMyCQlSREc6MTsJLy9SREcgLyBNb3JlIFBQRFUKLSAgICBVSU5UMzIJCUFDQ29uc3RyYWludDoxOwkvL2ZlZWRiYWNrIHJlcXVlc3QKLSAgICBVSU5UMzIJCXJzdjo1OyAgLy9jYWxpYnJhdGlvbiBzZXF1ZW5jZQotICAgIFVJTlQzMgkJWkxGQW5ub3VjZToxOwkvLyBaTEYgYW5ub3VuY2VtZW50Ci0gICAgVUlOVDMyCQlDU0lTVEVFUklORzoyOwkvL0NTSS8gU1RFRVJJTkcKLSAgICBVSU5UMzIJCUZCS1JlcToyOwkvL2ZlZWRiYWNrIHJlcXVlc3QKLSAgICBVSU5UMzIJCUNhbFNlcToyOyAgLy9jYWxpYnJhdGlvbiBzZXF1ZW5jZQotICAgIFVJTlQzMgkJQ2FsUG9zOjI7CS8vIGNhbGlicmF0aW9uIHBvc2l0aW9uCi0gICAgVUlOVDMyCQlNRkJvckFTQzo3OwkvL0xpbmsgYWRhcHRhdGlvbiBmZWVkYmFjayBjb250YWluaW5nIHJlY29tbWVuZGVkIE1DUy4gMHg3ZiBmb3Igbm8gZmVlZGJhY2sgb3Igbm90IGF2YWlsYWJsZQotICAgIFVJTlQzMgkJTUZTOjM7CS8vU0VUIHRvIHRoZSByZWNlaXZlZCB2YWx1ZSBvZiBNUlMuIDB4MTExIGZvciB1bnNvbGljaXRlZCBNRkIuCi0gICAgVUlOVDMyCQlNUlNvckFTSTozOwkvLyBNUlEgU2VxdWVuY2UgaWRlbnRpZmllci4gdW5jaGFuZ2VkIGR1cmluZyBlbnRpcmUgcHJvY2VkdXJlLiAweDAwMC0weDExMC4KLSAgICBVSU5UMzIJCU1SUToxOwkvL01DUyBmZWVkYmFjay4gUmVxdWVzdCBmb3IgYSBNQ1MgZmVlZGJhY2sKLSAgICBVSU5UMzIJCVRSUToxOwkvL3NvdW5kaW5nIHJlcXVlc3QKLSAgICBVSU5UMzIJCU1BOjE7CS8vbWFuYWdlbWVudCBhY3Rpb24gcGF5bG9hZCBleGlzdCBpbiAoUW9TIE51bGwrSFRDKQotI2Vsc2UKLSAgICBVSU5UMzIJCU1BOjE7CS8vbWFuYWdlbWVudCBhY3Rpb24gcGF5bG9hZCBleGlzdCBpbiAoUW9TIE51bGwrSFRDKQotICAgIFVJTlQzMgkJVFJROjE7CS8vc291bmRpbmcgcmVxdWVzdAotICAgIFVJTlQzMgkJTVJROjE7CS8vTUNTIGZlZWRiYWNrLiBSZXF1ZXN0IGZvciBhIE1DUyBmZWVkYmFjawotICAgIFVJTlQzMgkJTVJTb3JBU0k6MzsJLy8gTVJRIFNlcXVlbmNlIGlkZW50aWZpZXIuIHVuY2hhbmdlZCBkdXJpbmcgZW50aXJlIHByb2NlZHVyZS4gMHgwMDAtMHgxMTAuCi0gICAgVUlOVDMyCQlNRlM6MzsJLy9TRVQgdG8gdGhlIHJlY2VpdmVkIHZhbHVlIG9mIE1SUy4gMHgxMTEgZm9yIHVuc29saWNpdGVkIE1GQi4KLSAgICBVSU5UMzIJCU1GQm9yQVNDOjc7CS8vTGluayBhZGFwdGF0aW9uIGZlZWRiYWNrIGNvbnRhaW5pbmcgcmVjb21tZW5kZWQgTUNTLiAweDdmIGZvciBubyBmZWVkYmFjayBvciBub3QgYXZhaWxhYmxlCi0gICAgVUlOVDMyCQlDYWxQb3M6MjsJLy8gY2FsaWJyYXRpb24gcG9zaXRpb24KLSAgICBVSU5UMzIJCUNhbFNlcToyOyAgLy9jYWxpYnJhdGlvbiBzZXF1ZW5jZQotICAgIFVJTlQzMgkJRkJLUmVxOjI7CS8vZmVlZGJhY2sgcmVxdWVzdAotICAgIFVJTlQzMgkJQ1NJU1RFRVJJTkc6MjsJLy9DU0kvIFNURUVSSU5HCi0gICAgVUlOVDMyCQlaTEZBbm5vdWNlOjE7CS8vIFpMRiBhbm5vdW5jZW1lbnQKLSAgICBVSU5UMzIJCXJzdjo1OyAgLy9jYWxpYnJhdGlvbiBzZXF1ZW5jZQotICAgIFVJTlQzMgkJQUNDb25zdHJhaW50OjE7CS8vZmVlZGJhY2sgcmVxdWVzdAotICAgIFVJTlQzMgkJUkRHOjE7CS8vUkRHIC8gTW9yZSBQUERVCi0jZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KLX0gSFRfQ09OVFJPTCwgKlBIVF9DT05UUk9MOwotCi0vLyAyLWJ5dGUgUU9TIENPTlRST0wgZmllbGQKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotICAgIFVTSE9SVCAgICAgIFR4b3BfUXVldWVTaXplOjg7Ci0gICAgVVNIT1JUICAgICAgQU1zZHVQcmVzZW50OjE7Ci0gICAgVVNIT1JUICAgICAgQWNrUG9saWN5OjI7ICAvLzA6IG5vcm1hbCBBQ0sgMTpObyBBQ0sgMjpzY2hlZHVsZWQgdW5kZXIgTVRCQS9QU01QICAzOiBCQQotICAgIFVTSE9SVCAgICAgIEVPU1A6MTsKLSAgICBVU0hPUlQgICAgICBUSUQ6NDsKLSNlbHNlCi0gICAgVVNIT1JUICAgICAgVElEOjQ7Ci0gICAgVVNIT1JUICAgICAgRU9TUDoxOwotICAgIFVTSE9SVCAgICAgIEFja1BvbGljeToyOyAgLy8wOiBub3JtYWwgQUNLIDE6Tm8gQUNLIDI6c2NoZWR1bGVkIHVuZGVyIE1UQkEvUFNNUCAgMzogQkEKLSAgICBVU0hPUlQgICAgICBBTXNkdVByZXNlbnQ6MTsKLSAgICBVU0hPUlQgICAgICBUeG9wX1F1ZXVlU2l6ZTo4OwotI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCi19IFFPU19DT05UUk9MLCAqUFFPU19DT05UUk9MOwotCi0KLS8vIDItYnl0ZSBGcmFtZSBjb250cm9sIGZpZWxkCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlVU0hPUlQJCU9yZGVyOjE7CQkJLy8gU3RyaWN0IG9yZGVyIGV4cGVjdGVkCi0JVVNIT1JUCQlXZXA6MTsJCQkJLy8gV2VwIGRhdGEKLQlVU0hPUlQJCU1vcmVEYXRhOjE7CQkJLy8gTW9yZSBkYXRhIGJpdAotCVVTSE9SVAkJUHdyTWdtdDoxOwkJCS8vIFBvd2VyIG1hbmFnZW1lbnQgYml0Ci0JVVNIT1JUCQlSZXRyeToxOwkJCS8vIFJldHJ5IHN0YXR1cyBiaXQKLQlVU0hPUlQJCU1vcmVGcmFnOjE7CQkJLy8gTW9yZSBmcmFnbWVudCBiaXQKLQlVU0hPUlQJCUZyRHM6MTsJCQkJLy8gRnJvbSBEUyBpbmRpY2F0aW9uCi0JVVNIT1JUCQlUb0RzOjE7CQkJCS8vIFRvIERTIGluZGljYXRpb24KLQlVU0hPUlQJCVN1YlR5cGU6NDsJCQkvLyBNU0RVIHN1YnR5cGUKLQlVU0hPUlQJCVR5cGU6MjsJCQkJLy8gTVNEVSB0eXBlCi0JVVNIT1JUCQlWZXI6MjsJCQkJLy8gUHJvdG9jb2wgdmVyc2lvbgotI2Vsc2UKLQlVU0hPUlQJCVZlcjoyOwkJCQkvLyBQcm90b2NvbCB2ZXJzaW9uCi0JVVNIT1JUCQlUeXBlOjI7CQkJCS8vIE1TRFUgdHlwZQotCVVTSE9SVAkJU3ViVHlwZTo0OwkJCS8vIE1TRFUgc3VidHlwZQotCVVTSE9SVAkJVG9EczoxOwkJCQkvLyBUbyBEUyBpbmRpY2F0aW9uCi0JVVNIT1JUCQlGckRzOjE7CQkJCS8vIEZyb20gRFMgaW5kaWNhdGlvbgotCVVTSE9SVAkJTW9yZUZyYWc6MTsJCQkvLyBNb3JlIGZyYWdtZW50IGJpdAotCVVTSE9SVAkJUmV0cnk6MTsJCQkvLyBSZXRyeSBzdGF0dXMgYml0Ci0JVVNIT1JUCQlQd3JNZ210OjE7CQkJLy8gUG93ZXIgbWFuYWdlbWVudCBiaXQKLQlVU0hPUlQJCU1vcmVEYXRhOjE7CQkJLy8gTW9yZSBkYXRhIGJpdAotCVVTSE9SVAkJV2VwOjE7CQkJCS8vIFdlcCBkYXRhCi0JVVNIT1JUCQlPcmRlcjoxOwkJCS8vIFN0cmljdCBvcmRlciBleHBlY3RlZAotI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCi19IEZSQU1FX0NPTlRST0wsICpQRlJBTUVfQ09OVFJPTDsKLQotdHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9IRUFERVJfODAyXzExCXsKLSAgICBGUkFNRV9DT05UUk9MICAgRkM7Ci0gICAgVVNIT1JUICAgICAgICAgIER1cmF0aW9uOwotICAgIFVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOwotICAgIFVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotCVVDSEFSCQkJQWRkcjNbTUFDX0FERFJfTEVOXTsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JVVNIT1JUCQkJU2VxdWVuY2U6MTI7Ci0JVVNIT1JUCQkJRnJhZzo0OwotI2Vsc2UKLQlVU0hPUlQJCQlGcmFnOjQ7Ci0JVVNIT1JUCQkJU2VxdWVuY2U6MTI7Ci0jZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KLQlVQ0hBUgkJCU9jdGV0WzBdOwotfQlIRUFERVJfODAyXzExLCAqUEhFQURFUl84MDJfMTE7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUFNQT0xMX0ZSQU1FIHsKLSAgICBGUkFNRV9DT05UUk9MICAgRkM7Ci0gICAgVVNIT1JUICAgICAgICAgIEFpZDsKLSAgICBVQ0hBUiAgICAgICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXTsKLSAgICBVQ0hBUiAgICAgICAgICAgVGFbTUFDX0FERFJfTEVOXTsKLX0gICBQU1BPTExfRlJBTUUsICpQUFNQT0xMX0ZSQU1FOwotCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1JUU19GUkFNRQl7Ci0gICAgRlJBTUVfQ09OVFJPTCAgIEZDOwotICAgIFVTSE9SVCAgICAgICAgICBEdXJhdGlvbjsKLSAgICBVQ0hBUiAgICAgICAgICAgQWRkcjFbTUFDX0FERFJfTEVOXTsKLSAgICBVQ0hBUiAgICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLX1SVFNfRlJBTUUsICpQUlRTX0ZSQU1FOwotCi0jZW5kaWYgLy8gX19ET1QxMV9CQVNFX0hfXyAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX2lmYWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfaWZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY4ZDA3OS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfaWZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0JcnRfaWZhY2UuaAotCi0gICAgQWJzdHJhY3Q6Ci0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotI2lmbmRlZiBfX1JUTVBfSUZBQ0VfSF9fCi0jZGVmaW5lIF9fUlRNUF9JRkFDRV9IX18KLQotI2lmZGVmIFJUTVBfUENJX1NVUFBPUlQKLSNpbmNsdWRlICJydG1wX3BjaS5oIgotI2VuZGlmIC8vIFJUTVBfUENJX1NVUFBPUlQgLy8KLQotCi10eXBlZGVmIHN0cnVjdCBfSU5GX1BDSV9DT05GSUdfCi17Ci0JdW5zaWduZWQgbG9uZwlDU1JCYXNlQWRkcmVzczsgICAgIC8vIFBDSSBNTUlPIEJhc2UgQWRkcmVzcywgYWxsIGFjY2VzcyB3aWxsIHVzZQotCXVuc2lnbmVkIGludAlpcnFfbnVtOwotfUlORl9QQ0lfQ09ORklHOwotCi0KLXR5cGVkZWYgc3RydWN0IF9JTkZfVVNCX0NPTkZJR18KLXsKLQlVSU5UOCAgICAgICAgICAgICAgICBCdWxrSW5FcEFkZHI7CQkvLyBidWxrLWluIGVuZHBvaW50IGFkZHJlc3MKLQlVSU5UOCAgICAgICAgICAgICAgICBCdWxrT3V0RXBBZGRyWzZdOwkvLyBidWxrLW91dCBlbmRwb2ludCBhZGRyZXNzCi19SU5GX1VTQl9DT05GSUc7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgX0lORl9SQlVTX0NPTkZJR18KLXsKLQl1bnNpZ25lZCBsb25nCQljc3JfYWRkcjsKLQl1bnNpZ25lZCBpbnQJCWlycTsKLX1JTkZfUkJVU19DT05GSUc7Ci0KLQotdHlwZWRlZiBlbnVtIF9SVE1QX0lORl9UWVBFXwotewotCVJUTVBfREVWX0lORl9VTktOT1dOID0gMCwKLQlSVE1QX0RFVl9JTkZfUENJID0gMSwKLQlSVE1QX0RFVl9JTkZfVVNCID0gMiwKLQlSVE1QX0RFVl9JTkZfUkJVUyA9IDQsCi19UlRNUF9JTkZfVFlQRTsKLQotCi10eXBlZGVmIHVuaW9uIF9SVE1QX0lORl9DT05GSUdfewotCXN0cnVjdCBfSU5GX1BDSV9DT05GSUdfCQkJcGNpQ29uZmlnOwotCXN0cnVjdCBfSU5GX1VTQl9DT05GSUdfCQkJdXNiQ29uZmlnOwotCXN0cnVjdCBfSU5GX1JCVVNfQ09ORklHXwkJcmJ1c0NvbmZpZzsKLX1SVE1QX0lORl9DT05GSUc7Ci0KLSNlbmRpZiAvLyBfX1JUTVBfSUZBQ0VfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfbWFjLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfbWFjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1N2IyOTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX21hYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMwNCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXJ0bXBfbWFjLmgKLQotCUFic3RyYWN0OgotCVJhbGluayBXaXJlbGVzcyBDaGlwIE1BQyByZWxhdGVkIGRlZmluaXRpb24gJiBzdHJ1Y3R1cmVzCi0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCSAgV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaWZuZGVmIF9fUlRNUF9NQUNfSF9fCi0jZGVmaW5lIF9fUlRNUF9NQUNfSF9fCi0KLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFRYIC8gUlggcmluZyBkZXNjcmlwdG9yIGZvcm1hdAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIHRoZSBmaXJzdCAyNC1ieXRlIGluIFRYRCBpcyBjYWxsZWQgVFhJTkZPIGFuZCB3aWxsIGJlIERNQWVkIHRvIE1BQyBibG9jayB0aHJvdWdoIFRYRklGTy4KLS8vIE1BQyBibG9jayB1c2UgdGhpcyBUWElORk8gdG8gY29udHJvbCB0aGUgdHJhbnNtaXNzaW9uIGJlaGF2aW9yIG9mIHRoaXMgZnJhbWUuCi0jZGVmaW5lIEZJRk9fTUdNVCAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBGSUZPX0hDQ0EgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgRklGT19FRENBICAgICAgICAgICAgICAgICAyCi0KLQotLy8KLS8vIFRYRCBXaXJlbGVzcyBJbmZvcm1hdGlvbiBmb3JtYXQgZm9yIFR4IHJpbmcgYW5kIE1nbXQgUmluZwotLy8KLS8vdHhvcCA6IGZvciB0eG9wIG1vZGUKLS8vIDA6dHhvcCBmb3IgdGhlIE1QRFUgZnJhbWUgd2lsbCBiZSBoYW5kbGVzIGJ5IEFTSUMgYnkgcmVnaXN0ZXIKLS8vIDEvMi8zOnRoZSBNUERVIGZyYW1lIGlzIHNlbmQgYWZ0ZXIgUElGUy9iYWNrb2ZmL1NJRlMKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1RYV0lfU1RSVUMgewotCS8vIFdvcmQgMAotCVVJTlQzMgkJUEhZTU9ERToyOwotCVVJTlQzMgkJVHhCRjoxOwkvLyAzKjMKLQlVSU5UMzIJCXJzdjI6MTsKLS8vCVVJTlQzMgkJcnN2MjoyOwotCVVJTlQzMgkJSWZzOjE7CS8vCi0JVUlOVDMyCQlTVEJDOjI7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6Ci0JVUlOVDMyCQlTaG9ydEdJOjE7Ci0JVUlOVDMyCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegotCVVJTlQzMgkJTUNTOjc7Ci0KLQlVSU5UMzIJCXJzdjo2OwotCVVJTlQzMgkJdHhvcDoyOwkvL3R4IGJhY2sgb2ZmIG1vZGUgMDpIVCBUWE9QIHJ1bGUgLCAxOlBJRlMgVFggLDI6QmFja29mZiwgMzpzaWZzIG9ubHkgd2hlbiBwcmV2aW91cyBmcmFtZSBleGNoYW5nZSBpcyBzdWNjZXNzZnVsLgotCVVJTlQzMgkJTXBkdURlbnNpdHk6MzsKLQlVSU5UMzIJCUFNUERVOjE7Ci0KLQlVSU5UMzIJCVRTOjE7Ci0JVUlOVDMyCQlDRkFDSzoxOwotCVVJTlQzMgkJTUlNT3BzOjE7CS8vIHRoZSByZW1vdGUgcGVlciBpcyBpbiBkeW5hbWljIE1JTU8tUFMgbW9kZQotCVVJTlQzMgkJRlJBRzoxOwkJLy8gMSB0byBpbmZvcm0gVEtJUCBlbmdpbmUgdGhpcyBpcyBhIGZyYWdtZW50LgotCS8vIFdvcmQgMQotCVVJTlQzMgkJUGFja2V0SWQ6NDsKLQlVSU5UMzIJCU1QRFV0b3RhbEJ5dGVDb3VudDoxMjsKLQlVSU5UMzIJCVdpcmVsZXNzQ2xpSUQ6ODsKLQlVSU5UMzIJCUJBV2luU2l6ZTo2OwotCVVJTlQzMgkJTlNFUToxOwotCVVJTlQzMgkJQUNLOjE7Ci0JLy8gV29yZCAyCi0JVUlOVDMyCQlJVjsKLQkvLyBXb3JkIDMKLQlVSU5UMzIJCUVJVjsKLX0JVFhXSV9TVFJVQywgKlBUWFdJX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJc3RydWN0CVBBQ0tFRCBfVFhXSV9TVFJVQyB7Ci0JLy8gV29yZAkwCi0JLy8gZXg6IDAwIDAzIDAwIDQwIG1lYW5zIHR4b3AgPSAzLCBQSFlNT0RFID0gMQotCVVJTlQzMgkJRlJBRzoxOwkJLy8gMSB0byBpbmZvcm0gVEtJUCBlbmdpbmUgdGhpcyBpcyBhIGZyYWdtZW50LgotCVVJTlQzMgkJTUlNT3BzOjE7CS8vIHRoZSByZW1vdGUgcGVlciBpcyBpbiBkeW5hbWljIE1JTU8tUFMgbW9kZQotCVVJTlQzMgkJQ0ZBQ0s6MTsKLQlVSU5UMzIJCVRTOjE7Ci0KLQlVSU5UMzIJCUFNUERVOjE7Ci0JVUlOVDMyCQlNcGR1RGVuc2l0eTozOwotCVVJTlQzMgkJdHhvcDoyOwkvL0ZPUiAiVEhJUyIgZnJhbWUuIDA6SFQgVFhPUCBydWxlICwgMTpQSUZTIFRYICwyOkJhY2tvZmYsIDM6c2lmcyBvbmx5IHdoZW4gcHJldmlvdXMgZnJhbWUgZXhjaGFuZ2UgaXMgc3VjY2Vzc2Z1bC4KLQlVSU5UMzIJCXJzdjo2OwotCi0JVUlOVDMyCQlNQ1M6NzsKLQlVSU5UMzIJCUJXOjE7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6Ci0JVUlOVDMyCQlTaG9ydEdJOjE7Ci0JVUlOVDMyCQlTVEJDOjI7CS8vIDE6IFNUQkMgc3VwcG9ydCBNQ1MgPTAtNywgICAyLDMgOiBSRVNFUlZFCi0JVUlOVDMyCQlJZnM6MTsJLy8KLS8vCVVJTlQzMgkJcnN2MjoyOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegotCVVJTlQzMgkJcnN2MjoxOwotCVVJTlQzMgkJVHhCRjoxOwkvLyAzKjMKLQlVSU5UMzIJCVBIWU1PREU6MjsKLQkvLyBXb3JkMQotCS8vIGV4OiAgMWMgZmYgMzggMDAgbWVhbnMgQUNLPTAsIEJBV2luU2l6ZT03LCBNUERVdG90YWxCeXRlQ291bnQgPSAweDM4Ci0JVUlOVDMyCQlBQ0s6MTsKLQlVSU5UMzIJCU5TRVE6MTsKLQlVSU5UMzIJCUJBV2luU2l6ZTo2OwotCVVJTlQzMgkJV2lyZWxlc3NDbGlJRDo4OwotCVVJTlQzMgkJTVBEVXRvdGFsQnl0ZUNvdW50OjEyOwotCVVJTlQzMgkJUGFja2V0SWQ6NDsKLQkvL1dvcmQyCi0JVUlOVDMyCQlJVjsKLQkvL1dvcmQzCi0JVUlOVDMyCQlFSVY7Ci19CVRYV0lfU1RSVUMsICpQVFhXSV9TVFJVQzsKLSNlbmRpZgotCi0KLS8vCi0vLyBSWFdJIHdpcmVsZXNzIGluZm9ybWF0aW9uIGZvcm1hdCwgaW4gUEJGLiBpbnZpc2libGUgaW4gZHJpdmVyLgotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1JYV0lfU1RSVUMgewotCS8vIFdvcmQgMAotCVVJTlQzMgkJVElEOjQ7Ci0JVUlOVDMyCQlNUERVdG90YWxCeXRlQ291bnQ6MTI7Ci0JVUlOVDMyCQlVREY6MzsKLQlVSU5UMzIJCUJTU0lEOjM7Ci0JVUlOVDMyCQlLZXlJbmRleDoyOwotCVVJTlQzMgkJV2lyZWxlc3NDbGlJRDo4OwotCS8vIFdvcmQgMQotCVVJTlQzMgkJUEhZTU9ERToyOyAgICAgICAgICAgICAgLy8gMTogdGhpcyBSWCBmcmFtZSBpcyB1bmljYXN0IHRvIG1lCi0JVUlOVDMyCQlyc3Y6MzsKLQlVSU5UMzIJCVNUQkM6MjsKLQlVSU5UMzIJCVNob3J0R0k6MTsKLQlVSU5UMzIJCUJXOjE7Ci0JVUlOVDMyCQlNQ1M6NzsKLQlVSU5UMzIJCVNFUVVFTkNFOjEyOwotCVVJTlQzMgkJRlJBRzo0OwotCS8vIFdvcmQgMgotCVVJTlQzMgkJcnN2MTo4OwotCVVJTlQzMgkJUlNTSTI6ODsKLQlVSU5UMzIJCVJTU0kxOjg7Ci0JVUlOVDMyCQlSU1NJMDo4OwotCS8vIFdvcmQgMwotCS8qVUlOVDMyCQlyc3YyOjE2OyovCi0JVUlOVDMyCQlyc3YyOjg7Ci0JVUlOVDMyCQlGT0ZGU0VUOjg7CS8vIFJUMzV4eAotCVVJTlQzMgkJU05SMTo4OwotCVVJTlQzMgkJU05SMDo4OwotfQlSWFdJX1NUUlVDLCAqUFJYV0lfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9SWFdJX1NUUlVDIHsKLQkvLyBXb3JkCTAKLQlVSU5UMzIJCVdpcmVsZXNzQ2xpSUQ6ODsKLQlVSU5UMzIJCUtleUluZGV4OjI7Ci0JVUlOVDMyCQlCU1NJRDozOwotCVVJTlQzMgkJVURGOjM7Ci0JVUlOVDMyCQlNUERVdG90YWxCeXRlQ291bnQ6MTI7Ci0JVUlOVDMyCQlUSUQ6NDsKLQkvLyBXb3JkCTEKLQlVSU5UMzIJCUZSQUc6NDsKLQlVSU5UMzIJCVNFUVVFTkNFOjEyOwotCVVJTlQzMgkJTUNTOjc7Ci0JVUlOVDMyCQlCVzoxOwotCVVJTlQzMgkJU2hvcnRHSToxOwotCVVJTlQzMgkJU1RCQzoyOwotCVVJTlQzMgkJcnN2OjM7Ci0JVUlOVDMyCQlQSFlNT0RFOjI7ICAgICAgICAgICAgICAvLyAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUKLQkvL1dvcmQyCi0JVUlOVDMyCQlSU1NJMDo4OwotCVVJTlQzMgkJUlNTSTE6ODsKLQlVSU5UMzIJCVJTU0kyOjg7Ci0JVUlOVDMyCQlyc3YxOjg7Ci0JLy9Xb3JkMwotCVVJTlQzMgkJU05SMDo4OwotCVVJTlQzMgkJU05SMTo4OwotCVVJTlQzMgkJRk9GRlNFVDo4OwkvLyBSVDM1eHgKLQlVSU5UMzIJCXJzdjI6ODsKLQkvKlVJTlQzMgkJcnN2MjoxNjsqLwotfQlSWFdJX1NUUlVDLCAqUFJYV0lfU1RSVUM7Ci0jZW5kaWYKLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFJlZ2lzdGVyIGZvcm1hdAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotLy8KLS8vIFNDSC9ETUEgcmVnaXN0ZXJzIC0gYmFzZSBhZGRyZXNzIDB4MDIwMAotLy8KLS8vIElOVF9TT1VSQ0VfQ1NSOiBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyLiBXcml0ZSBvbmUgdG8gY2xlYXIgY29ycmVzcG9uZGluZyBiaXQKLS8vCi0jZGVmaW5lIERNQV9DU1IwCQkweDIwMAotI2RlZmluZSBJTlRfU09VUkNFX0NTUgkJMHgyMDAKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9JTlRfU09VUkNFX0NTUl9TVFJVQwl7Ci0Jc3RydWN0CXsKLSNpZmRlZiBUT05FX1JBREFSX0RFVEVDVF9TVVBQT1JUCi0JCVVJTlQzMgkJCToxMTsKLQkJVUlOVDMyCQkJUmFkYXJJTlQ6MTsKLQkJVUlOVDMyCQlyc3Y6MjsKLSNlbHNlIC8vIG9yaWdpbmFsIHNvdXJjZSBjb2RlCi0JCVVJTlQzMgkJOjE0OwotI2VuZGlmIC8vIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQgLy8KLQkJVUlOVDMyCQlUeENvaGVyZW50OjE7Ci0JCVVJTlQzMgkJUnhDb2hlcmVudDoxOwotCQlVSU5UMzIJCUdQVGltZXI6MTsKLQkJVUlOVDMyCQlBdXRvV2FrZXVwOjE7Ly9iaXQxNAotCQlVSU5UMzIJCVRYRmlmb1N0YXR1c0ludDoxOy8vRklGTyBTdGF0aXN0aWNzIGlzIGZ1bGwsIHN3IHNob3VsZCByZWFkIDB4MTcxYwotCQlVSU5UMzIJCVByZVRCVFQ6MTsKLQkJVUlOVDMyCQlUQlRUSW50OjE7Ci0JCVVJTlQzMgkJUnhUeENvaGVyZW50OjE7Ci0JCVVJTlQzMgkJTUNVQ29tbWFuZElOVDoxOwotCQlVSU5UMzIJCU1nbXREbWFEb25lOjE7Ci0JCVVJTlQzMgkJSGNjYURtYURvbmU6MTsKLQkJVUlOVDMyCQlBYzNEbWFEb25lOjE7Ci0JCVVJTlQzMgkJQWMyRG1hRG9uZToxOwotCQlVSU5UMzIJCUFjMURtYURvbmU6MTsKLQkJVUlOVDMyCQlBYzBEbWFEb25lOjE7Ci0JCVVJTlQzMgkJUnhEb25lOjE7Ci0JCVVJTlQzMgkJVHhEZWxheUlOVDoxOwkvL2RlbGF5ZWQgaW50ZXJydXB0LCBub3QgaW50ZXJydXB0IHVudGlsIHNldmVyYWwgaW50IG9yIHRpbWUgbGltaXQgaGl0Ci0JCVVJTlQzMgkJUnhEZWxheUlOVDoxOyAvL2RlYWx5ZWQgaW50ZXJydXB0Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlJTlRfU09VUkNFX0NTUl9TVFJVQywgKlBJTlRfU09VUkNFX0NTUl9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9JTlRfU09VUkNFX0NTUl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSeERlbGF5SU5UOjE7Ci0JCVVJTlQzMgkJVHhEZWxheUlOVDoxOwotCQlVSU5UMzIJCVJ4RG9uZToxOwotCQlVSU5UMzIJCUFjMERtYURvbmU6MTsvLzQKLQkJVUlOVDMyCQlBYzFEbWFEb25lOjE7Ci0JCVVJTlQzMgkJQWMyRG1hRG9uZToxOwotCQlVSU5UMzIJCUFjM0RtYURvbmU6MTsKLQkJVUlOVDMyCQlIY2NhRG1hRG9uZToxOyAvLyBiaXQ3Ci0JCVVJTlQzMgkJTWdtdERtYURvbmU6MTsKLQkJVUlOVDMyCQlNQ1VDb21tYW5kSU5UOjE7Ly9iaXQgOQotCQlVSU5UMzIJCVJ4VHhDb2hlcmVudDoxOwotCQlVSU5UMzIJCVRCVFRJbnQ6MTsKLQkJVUlOVDMyCQlQcmVUQlRUOjE7Ci0JCVVJTlQzMgkJVFhGaWZvU3RhdHVzSW50OjE7Ly9GSUZPIFN0YXRpc3RpY3MgaXMgZnVsbCwgc3cgc2hvdWxkIHJlYWQgMHgxNzFjCi0JCVVJTlQzMgkJQXV0b1dha2V1cDoxOy8vYml0MTQKLQkJVUlOVDMyCQlHUFRpbWVyOjE7Ci0JCVVJTlQzMgkJUnhDb2hlcmVudDoxOy8vYml0MTYKLQkJVUlOVDMyCQlUeENvaGVyZW50OjE7Ci0jaWZkZWYgVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVAotCQlVSU5UMzIJCXJzdjoyOwotCQlVSU5UMzIJCQlSYWRhcklOVDoxOwotCQlVSU5UMzIJCQk6MTE7Ci0jZWxzZQotCQlVSU5UMzIJCToxNDsKLSNlbmRpZiAvLyBUT05FX1JBREFSX0RFVEVDVF9TVVBQT1JUIC8vCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfSBJTlRfU09VUkNFX0NTUl9TVFJVQywgKlBJTlRfU09VUkNFX0NTUl9TVFJVQzsKLSNlbmRpZgotCi0vLwotLy8gSU5UX01BU0tfQ1NSOiAgIEludGVycnVwdCBNQVNLIHJlZ2lzdGVyLiAgIDE6IHRoZSBpbnRlcnJ1cHQgaXMgbWFzayBPRkYKLS8vCi0jZGVmaW5lIElOVF9NQVNLX0NTUiAgICAgICAgMHgyMDQKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9JTlRfTUFTS19DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJVHhDb2hlcmVudDoxOwotCQlVSU5UMzIJCVJ4Q29oZXJlbnQ6MTsKLSNpZmRlZiBUT05FX1JBREFSX0RFVEVDVF9TVVBQT1JUCi0JCVVJTlQzMgkJCTo5OwotCQlVSU5UMzIJCQlSYWRhcklOVDoxOwotCQlVSU5UMzIJCXJzdjoxMDsKLSNlbHNlCi0JCVVJTlQzMgkJOjIwOwotI2VuZGlmIC8vIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQgLy8KLQkJVUlOVDMyCQlNQ1VDb21tYW5kSU5UOjE7Ci0JCVVJTlQzMgkJTWdtdERtYURvbmU6MTsKLQkJVUlOVDMyCQlIY2NhRG1hRG9uZToxOwotCQlVSU5UMzIJCUFjM0RtYURvbmU6MTsKLQkJVUlOVDMyCQlBYzJEbWFEb25lOjE7Ci0JCVVJTlQzMgkJQWMxRG1hRG9uZToxOwotCQlVSU5UMzIJCUFjMERtYURvbmU6MTsKLQkJVUlOVDMyCQlSeERvbmU6MTsKLQkJVUlOVDMyCQlUeERlbGF5OjE7Ci0JCVVJTlQzMgkJUlhEZWxheV9JTlRfTVNLOjE7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfUlOVF9NQVNLX0NTUl9TVFJVQywgKlBJTlRfTUFTS19DU1JfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfSU5UX01BU0tfQ1NSX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCVJYRGVsYXlfSU5UX01TSzoxOwotCQlVSU5UMzIJCVR4RGVsYXk6MTsKLQkJVUlOVDMyCQlSeERvbmU6MTsKLQkJVUlOVDMyCQlBYzBEbWFEb25lOjE7Ci0JCVVJTlQzMgkJQWMxRG1hRG9uZToxOwotCQlVSU5UMzIJCUFjMkRtYURvbmU6MTsKLQkJVUlOVDMyCQlBYzNEbWFEb25lOjE7Ci0JCVVJTlQzMgkJSGNjYURtYURvbmU6MTsKLQkJVUlOVDMyCQlNZ210RG1hRG9uZToxOwotCQlVSU5UMzIJCU1DVUNvbW1hbmRJTlQ6MTsKLSNpZmRlZiBUT05FX1JBREFSX0RFVEVDVF9TVVBQT1JUCi0JCVVJTlQzMgkJcnN2OjEwOwotCQlVSU5UMzIJCQlSYWRhcklOVDoxOwotCQlVSU5UMzIJCQk6OTsKLSNlbHNlCi0JCVVJTlQzMgkJOjIwOwotI2VuZGlmIC8vIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQgLy8KLQkJVUlOVDMyCQlSeENvaGVyZW50OjE7Ci0JCVVJTlQzMgkJVHhDb2hlcmVudDoxOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0gSU5UX01BU0tfQ1NSX1NUUlVDLCAqUElOVF9NQVNLX0NTUl9TVFJVQzsKLSNlbmRpZgotCi0jZGVmaW5lIFdQRE1BX0dMT19DRkcJMHgyMDgKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9XUERNQV9HTE9fQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCUhEUl9TRUdfTEVOOjE2OwotCQlVSU5UMzIJCVJYSGRyU2NhdGVyOjg7Ci0JCVVJTlQzMgkJQmlnRW5kaWFuOjE7Ci0JCVVJTlQzMgkJRW5UWFdyaXRlQmFja0RET05FOjE7Ci0JCVVJTlQzMgkJV1BETUFCdXJzdFNJWkU6MjsKLQkJVUlOVDMyCQlSeERNQUJ1c3k6MTsKLQkJVUlOVDMyCQlFbmFibGVSeERNQToxOwotCQlVSU5UMzIJCVR4RE1BQnVzeToxOwotCQlVSU5UMzIJCUVuYWJsZVR4RE1BOjE7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfVdQRE1BX0dMT19DRkdfU1RSVUMsICpQV1BETUFfR0xPX0NGR19TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9XUERNQV9HTE9fQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCUVuYWJsZVR4RE1BOjE7Ci0JCVVJTlQzMgkJVHhETUFCdXN5OjE7Ci0JCVVJTlQzMgkJRW5hYmxlUnhETUE6MTsKLQkJVUlOVDMyCQlSeERNQUJ1c3k6MTsKLQkJVUlOVDMyCQlXUERNQUJ1cnN0U0laRToyOwotCQlVSU5UMzIJCUVuVFhXcml0ZUJhY2tERE9ORToxOwotCQlVSU5UMzIJCUJpZ0VuZGlhbjoxOwotCQlVSU5UMzIJCVJYSGRyU2NhdGVyOjg7Ci0JCVVJTlQzMgkJSERSX1NFR19MRU46MTY7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfSBXUERNQV9HTE9fQ0ZHX1NUUlVDLCAqUFdQRE1BX0dMT19DRkdfU1RSVUM7Ci0jZW5kaWYKLQotI2RlZmluZSBXUERNQV9SU1RfSURYCTB4MjBjCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfV1BETUFfUlNUX0lEWF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQk6MTU7Ci0JCVVJTlQzMgkJUlNUX0RSWF9JRFgwOjE7Ci0JCVVJTlQzMgkJcnN2OjEwOwotCQlVSU5UMzIJCVJTVF9EVFhfSURYNToxOwotCQlVSU5UMzIJCVJTVF9EVFhfSURYNDoxOwotCQlVSU5UMzIJCVJTVF9EVFhfSURYMzoxOwotCQlVSU5UMzIJCVJTVF9EVFhfSURYMjoxOwotCQlVSU5UMzIJCVJTVF9EVFhfSURYMToxOwotCQlVSU5UMzIJCVJTVF9EVFhfSURYMDoxOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX1XUERNQV9SU1RfSURYX1NUUlVDLCAqUFdQRE1BX1JTVF9JRFhfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfV1BETUFfUlNUX0lEWF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSU1RfRFRYX0lEWDA6MTsKLQkJVUlOVDMyCQlSU1RfRFRYX0lEWDE6MTsKLQkJVUlOVDMyCQlSU1RfRFRYX0lEWDI6MTsKLQkJVUlOVDMyCQlSU1RfRFRYX0lEWDM6MTsKLQkJVUlOVDMyCQlSU1RfRFRYX0lEWDQ6MTsKLQkJVUlOVDMyCQlSU1RfRFRYX0lEWDU6MTsKLQkJVUlOVDMyCQlyc3Y6MTA7Ci0JCVVJTlQzMgkJUlNUX0RSWF9JRFgwOjE7Ci0JCVVJTlQzMgkJOjE1OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0gV1BETUFfUlNUX0lEWF9TVFJVQywgKlBXUERNQV9SU1RfSURYX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIERFTEFZX0lOVF9DRkcgIDB4MDIxMAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0RFTEFZX0lOVF9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJVFhETFlfSU5UX0VOOjE7Ci0JCVVJTlQzMgkJVFhNQVhfUElOVDo3OwotCQlVSU5UMzIJCVRYTUFYX1BUSU1FOjg7Ci0JCVVJTlQzMgkJUlhETFlfSU5UX0VOOjE7Ci0JCVVJTlQzMgkJUlhNQVhfUElOVDo3OwotCQlVSU5UMzIJCVJYTUFYX1BUSU1FOjg7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfURFTEFZX0lOVF9DRkdfU1RSVUMsICpQREVMQVlfSU5UX0NGR19TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9ERUxBWV9JTlRfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCVJYTUFYX1BUSU1FOjg7Ci0JCVVJTlQzMgkJUlhNQVhfUElOVDo3OwotCQlVSU5UMzIJCVJYRExZX0lOVF9FTjoxOwotCQlVSU5UMzIJCVRYTUFYX1BUSU1FOjg7Ci0JCVVJTlQzMgkJVFhNQVhfUElOVDo3OwotCQlVSU5UMzIJCVRYRExZX0lOVF9FTjoxOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0gREVMQVlfSU5UX0NGR19TVFJVQywgKlBERUxBWV9JTlRfQ0ZHX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIFdNTV9BSUZTTl9DRkcgICAweDAyMTQKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9BSUZTTl9DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgIFJzdjoxNjsKLQkgICAgVUlOVDMyICAgQWlmc24zOjQ7ICAgICAgIC8vIGZvciBBQ19WTwotCSAgICBVSU5UMzIgICBBaWZzbjI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCi0JICAgIFVJTlQzMiAgIEFpZnNuMTo0OyAgICAgICAvLyBmb3IgQUNfQksKLQkgICAgVUlOVDMyICAgQWlmc24wOjQ7ICAgICAgIC8vIGZvciBBQ19CRQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQUlGU05fQ1NSX1NUUlVDLCAqUEFJRlNOX0NTUl9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9BSUZTTl9DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgIEFpZnNuMDo0OyAgICAgICAvLyBmb3IgQUNfQkUKLQkgICAgVUlOVDMyICAgQWlmc24xOjQ7ICAgICAgIC8vIGZvciBBQ19CSwotCSAgICBVSU5UMzIgICBBaWZzbjI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCi0JICAgIFVJTlQzMiAgIEFpZnNuMzo0OyAgICAgICAvLyBmb3IgQUNfVk8KLQkgICAgVUlOVDMyICAgUnN2OjE2OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQUlGU05fQ1NSX1NUUlVDLCAqUEFJRlNOX0NTUl9TVFJVQzsKLSNlbmRpZgotLy8KLS8vIENXTUlOX0NTUjogQ1dtaW4gZm9yIGVhY2ggRURDQSBBQwotLy8KLSNkZWZpbmUgV01NX0NXTUlOX0NGRyAgIDB4MDIxOAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0NXTUlOX0NTUl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICAgUnN2OjE2OwotCSAgICBVSU5UMzIgICBDd21pbjM6NDsgICAgICAgLy8gZm9yIEFDX1ZPCi0JICAgIFVJTlQzMiAgIEN3bWluMjo0OyAgICAgICAvLyBmb3IgQUNfVkkKLQkgICAgVUlOVDMyICAgQ3dtaW4xOjQ7ICAgICAgIC8vIGZvciBBQ19CSwotCSAgICBVSU5UMzIgICBDd21pbjA6NDsgICAgICAgLy8gZm9yIEFDX0JFCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlDV01JTl9DU1JfU1RSVUMsICpQQ1dNSU5fQ1NSX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX0NXTUlOX0NTUl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICAgQ3dtaW4wOjQ7ICAgICAgIC8vIGZvciBBQ19CRQotCSAgICBVSU5UMzIgICBDd21pbjE6NDsgICAgICAgLy8gZm9yIEFDX0JLCi0JICAgIFVJTlQzMiAgIEN3bWluMjo0OyAgICAgICAvLyBmb3IgQUNfVkkKLQkgICAgVUlOVDMyICAgQ3dtaW4zOjQ7ICAgICAgIC8vIGZvciBBQ19WTwotCSAgICBVSU5UMzIgICBSc3Y6MTY7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlDV01JTl9DU1JfU1RSVUMsICpQQ1dNSU5fQ1NSX1NUUlVDOwotI2VuZGlmCi0KLS8vCi0vLyBDV01BWF9DU1I6IENXbWluIGZvciBlYWNoIEVEQ0EgQUMKLS8vCi0jZGVmaW5lIFdNTV9DV01BWF9DRkcgICAweDAyMWMKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9DV01BWF9DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgIFJzdjoxNjsKLQkgICAgVUlOVDMyICAgQ3dtYXgzOjQ7ICAgICAgIC8vIGZvciBBQ19WTwotCSAgICBVSU5UMzIgICBDd21heDI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCi0JICAgIFVJTlQzMiAgIEN3bWF4MTo0OyAgICAgICAvLyBmb3IgQUNfQksKLQkgICAgVUlOVDMyICAgQ3dtYXgwOjQ7ICAgICAgIC8vIGZvciBBQ19CRQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQ1dNQVhfQ1NSX1NUUlVDLCAqUENXTUFYX0NTUl9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9DV01BWF9DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgIEN3bWF4MDo0OyAgICAgICAvLyBmb3IgQUNfQkUKLQkgICAgVUlOVDMyICAgQ3dtYXgxOjQ7ICAgICAgIC8vIGZvciBBQ19CSwotCSAgICBVSU5UMzIgICBDd21heDI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCi0JICAgIFVJTlQzMiAgIEN3bWF4Mzo0OyAgICAgICAvLyBmb3IgQUNfVk8KLQkgICAgVUlOVDMyICAgUnN2OjE2OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQ1dNQVhfQ1NSX1NUUlVDLCAqUENXTUFYX0NTUl9TVFJVQzsKLSNlbmRpZgotCi0KLS8vCi0vLyBBQ19UWE9QX0NTUjA6IEFDX0JLL0FDX0JFIFRYT1AgcmVnaXN0ZXIKLS8vCi0jZGVmaW5lIFdNTV9UWE9QMF9DRkcgICAgMHgwMjIwCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfQUNfVFhPUF9DU1IwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFjMVR4b3A7ICAgICAgICAvLyBmb3IgQUNfQkUsIGluIHVuaXQgb2YgMzJ1cwotCSAgICBVU0hPUlQgIEFjMFR4b3A7ICAgICAgICAvLyBmb3IgQUNfQkssIGluIHVuaXQgb2YgMzJ1cwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQUNfVFhPUF9DU1IwX1NUUlVDLCAqUEFDX1RYT1BfQ1NSMF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9BQ19UWE9QX0NTUjBfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQWMwVHhvcDsgICAgICAgIC8vIGZvciBBQ19CSywgaW4gdW5pdCBvZiAzMnVzCi0JICAgIFVTSE9SVCAgQWMxVHhvcDsgICAgICAgIC8vIGZvciBBQ19CRSwgaW4gdW5pdCBvZiAzMnVzCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlBQ19UWE9QX0NTUjBfU1RSVUMsICpQQUNfVFhPUF9DU1IwX1NUUlVDOwotI2VuZGlmCi0KLS8vCi0vLyBBQ19UWE9QX0NTUjE6IEFDX1ZPL0FDX1ZJIFRYT1AgcmVnaXN0ZXIKLS8vCi0jZGVmaW5lIFdNTV9UWE9QMV9DRkcgICAgMHgwMjI0Ci0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfQUNfVFhPUF9DU1IxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFjM1R4b3A7ICAgICAgICAvLyBmb3IgQUNfVk8sIGluIHVuaXQgb2YgMzJ1cwotCSAgICBVU0hPUlQgIEFjMlR4b3A7ICAgICAgICAvLyBmb3IgQUNfVkksIGluIHVuaXQgb2YgMzJ1cwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQUNfVFhPUF9DU1IxX1NUUlVDLCAqUEFDX1RYT1BfQ1NSMV9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9BQ19UWE9QX0NTUjFfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQWMyVHhvcDsgICAgICAgIC8vIGZvciBBQ19WSSwgaW4gdW5pdCBvZiAzMnVzCi0JICAgIFVTSE9SVCAgQWMzVHhvcDsgICAgICAgIC8vIGZvciBBQ19WTywgaW4gdW5pdCBvZiAzMnVzCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlBQ19UWE9QX0NTUjFfU1RSVUMsICpQQUNfVFhPUF9DU1IxX1NUUlVDOwotI2VuZGlmCi0KLQotI2RlZmluZSBSSU5HUkVHX0RJRkYJCQkweDEwCi0jZGVmaW5lIEdQSU9fQ1RSTF9DRkcgICAgMHgwMjI4CS8vTUFDX0NTUjEzCi0jZGVmaW5lIE1DVV9DTURfQ0ZHICAgIDB4MDIyYwotI2RlZmluZSBUWF9CQVNFX1BUUjAgICAgIDB4MDIzMAkvL0FDX0JLIGJhc2UgYWRkcmVzcwotI2RlZmluZSBUWF9NQVhfQ05UMCAgICAgIDB4MDIzNAotI2RlZmluZSBUWF9DVFhfSURYMCAgICAgICAweDAyMzgKLSNkZWZpbmUgVFhfRFRYX0lEWDAgICAgICAweDAyM2MKLSNkZWZpbmUgVFhfQkFTRV9QVFIxICAgICAweDAyNDAJCS8vQUNfQkUgYmFzZSBhZGRyZXNzCi0jZGVmaW5lIFRYX01BWF9DTlQxICAgICAgMHgwMjQ0Ci0jZGVmaW5lIFRYX0NUWF9JRFgxICAgICAgIDB4MDI0OAotI2RlZmluZSBUWF9EVFhfSURYMSAgICAgIDB4MDI0YwotI2RlZmluZSBUWF9CQVNFX1BUUjIgICAgIDB4MDI1MAkJLy9BQ19WSSBiYXNlIGFkZHJlc3MKLSNkZWZpbmUgVFhfTUFYX0NOVDIgICAgICAweDAyNTQKLSNkZWZpbmUgVFhfQ1RYX0lEWDIgICAgICAgMHgwMjU4Ci0jZGVmaW5lIFRYX0RUWF9JRFgyICAgICAgMHgwMjVjCi0jZGVmaW5lIFRYX0JBU0VfUFRSMyAgICAgMHgwMjYwCQkvL0FDX1ZPIGJhc2UgYWRkcmVzcwotI2RlZmluZSBUWF9NQVhfQ05UMyAgICAgIDB4MDI2NAotI2RlZmluZSBUWF9DVFhfSURYMyAgICAgICAweDAyNjgKLSNkZWZpbmUgVFhfRFRYX0lEWDMgICAgICAweDAyNmMKLSNkZWZpbmUgVFhfQkFTRV9QVFI0ICAgICAweDAyNzAJCS8vSENDQSBiYXNlIGFkZHJlc3MKLSNkZWZpbmUgVFhfTUFYX0NOVDQgICAgICAweDAyNzQKLSNkZWZpbmUgVFhfQ1RYX0lEWDQgICAgICAgMHgwMjc4Ci0jZGVmaW5lIFRYX0RUWF9JRFg0ICAgICAgMHgwMjdjCi0jZGVmaW5lIFRYX0JBU0VfUFRSNSAgICAgMHgwMjgwCQkvL01HTVQgYmFzZSBhZGRyZXNzCi0jZGVmaW5lICBUWF9NQVhfQ05UNSAgICAgMHgwMjg0Ci0jZGVmaW5lIFRYX0NUWF9JRFg1ICAgICAgIDB4MDI4OAotI2RlZmluZSBUWF9EVFhfSURYNSAgICAgIDB4MDI4YwotI2RlZmluZSBUWF9NR01UTUFYX0NOVCAgICAgIFRYX01BWF9DTlQ1Ci0jZGVmaW5lIFRYX01HTVRDVFhfSURYICAgICAgIFRYX0NUWF9JRFg1Ci0jZGVmaW5lIFRYX01HTVREVFhfSURYICAgICAgVFhfRFRYX0lEWDUKLSNkZWZpbmUgUlhfQkFTRV9QVFIgICAgIDB4MDI5MAkvL1JYIGJhc2UgYWRkcmVzcwotI2RlZmluZSBSWF9NQVhfQ05UICAgICAgMHgwMjk0Ci0jZGVmaW5lIFJYX0NSWF9JRFggICAgICAgMHgwMjk4Ci0jZGVmaW5lIFJYX0RSWF9JRFggICAgICAweDAyOWMKLQotCi0jZGVmaW5lIFVTQl9ETUFfQ0ZHICAgICAgMHgwMmEwCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfVVNCX0RNQV9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgVHhCdXN5OjE7CQkvL1VTQiBETUEgVFggRlNNIGJ1c3kgLiBkZWJ1ZyBvbmx5Ci0JICAgIFVJTlQzMiAgUnhCdXN5OjE7ICAgICAgICAvL1VTQiBETUEgUlggRlNNIGJ1c3kgLiBkZWJ1ZyBvbmx5Ci0JICAgIFVJTlQzMiAgRXBvdXRWYWxpZDo2OyAgICAgICAgLy9PVVQgZW5kcG9pbnQgZGF0YSB2YWxpZC4gZGVidWcgb25seQotCSAgICBVSU5UMzIgIFR4QnVsa0VuOjE7ICAgICAgICAvL0VuYWJsZSBVU0IgRE1BIFR4Ci0JICAgIFVJTlQzMiAgUnhCdWxrRW46MTsgICAgICAgIC8vRW5hYmxlIFVTQiBETUEgUngKLQkgICAgVUlOVDMyICBSeEJ1bGtBZ2dFbjoxOyAgICAgICAgLy9FbmFibGUgUnggQnVsayBBZ2dyZWdhdGlvbgotCSAgICBVSU5UMzIgIFR4b3BIYWx0OjE7ICAgICAgICAvL0hhbHQgVFhPUCBjb3VudCBkb3duIHdoZW4gVFggYnVmZmVyIGlzIGZ1bGwuCi0JICAgIFVJTlQzMiAgVHhDbGVhcjoxOyAgICAgICAgLy9DbGVhciBVU0IgRE1BIFRYIHBhdGgKLQkgICAgVUlOVDMyICByc3Y6MjsKLQkgICAgVUlOVDMyICBwaHljbGVhcjoxOwkJCS8vcGh5IHdhdGNoIGRvZyBlbmFibGUuIHdyaXRlIDEKLQkgICAgVUlOVDMyICBSeEJ1bGtBZ2dMbXQ6ODsgICAgICAgIC8vUnggQnVsayBBZ2dyZWdhdGlvbiBMaW1pdCAgaW4gdW5pdCBvZiAxMDI0IGJ5dGVzCi0JICAgIFVJTlQzMiAgUnhCdWxrQWdnVE91dDo4OyAgICAgICAgLy9SeCBCdWxrIEFnZ3JlZ2F0aW9uIFRpbWVPdXQgIGluIHVuaXQgb2YgMzNucwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVVNCX0RNQV9DRkdfU1RSVUMsICpQVVNCX0RNQV9DRkdfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfVVNCX0RNQV9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgUnhCdWxrQWdnVE91dDo4OyAgICAgICAgLy9SeCBCdWxrIEFnZ3JlZ2F0aW9uIFRpbWVPdXQgIGluIHVuaXQgb2YgMzNucwotCSAgICBVSU5UMzIgIFJ4QnVsa0FnZ0xtdDo4OyAgICAgICAgLy9SeCBCdWxrIEFnZ3JlZ2F0aW9uIExpbWl0ICBpbiB1bml0IG9mIDI1NiBieXRlcwotCSAgICBVSU5UMzIgIHBoeWNsZWFyOjE7CQkJLy9waHkgd2F0Y2ggZG9nIGVuYWJsZS4gd3JpdGUgMQotCSAgICBVSU5UMzIgIHJzdjoyOwotCSAgICBVSU5UMzIgIFR4Q2xlYXI6MTsgICAgICAgIC8vQ2xlYXIgVVNCIERNQSBUWCBwYXRoCi0JICAgIFVJTlQzMiAgVHhvcEhhbHQ6MTsgICAgICAgIC8vSGFsdCBUWE9QIGNvdW50IGRvd24gd2hlbiBUWCBidWZmZXIgaXMgZnVsbC4KLQkgICAgVUlOVDMyICBSeEJ1bGtBZ2dFbjoxOyAgICAgICAgLy9FbmFibGUgUnggQnVsayBBZ2dyZWdhdGlvbgotCSAgICBVSU5UMzIgIFJ4QnVsa0VuOjE7ICAgICAgICAvL0VuYWJsZSBVU0IgRE1BIFJ4Ci0JICAgIFVJTlQzMiAgVHhCdWxrRW46MTsgICAgICAgIC8vRW5hYmxlIFVTQiBETUEgVHgKLQkgICAgVUlOVDMyICBFcG91dFZhbGlkOjY7ICAgICAgICAvL09VVCBlbmRwb2ludCBkYXRhIHZhbGlkCi0JICAgIFVJTlQzMiAgUnhCdXN5OjE7ICAgICAgICAvL1VTQiBETUEgUlggRlNNIGJ1c3kKLQkgICAgVUlOVDMyICBUeEJ1c3k6MTsJCS8vVVNCIERNQSBUWCBGU00gYnVzeQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVVNCX0RNQV9DRkdfU1RSVUMsICpQVVNCX0RNQV9DRkdfU1RSVUM7Ci0jZW5kaWYKLQotCi0vLwotLy8gIDMgIFBCRiAgcmVnaXN0ZXJzCi0vLwotLy8KLS8vIE1vc3QgYXJlIGZvciBkZWJ1Zy4gRHJpdmVyIGRvZXNuJ3QgdG91Y2ggUEJGIHJlZ2lzdGVyLgotI2RlZmluZSBQQkZfU1lTX0NUUkwJIDB4MDQwMAotI2RlZmluZSBQQkZfQ0ZHICAgICAgICAgICAgICAgICAweDA0MDgKLSNkZWZpbmUgUEJGX01BWF9QQ05UCSAweDA0MEMKLSNkZWZpbmUgUEJGX0NUUkwJCTB4MDQxMAotI2RlZmluZSBQQkZfSU5UX1NUQQkgMHgwNDE0Ci0jZGVmaW5lIFBCRl9JTlRfRU5BCSAweDA0MTgKLSNkZWZpbmUgVFhSWFFfUENOVAkgMHgwNDM4Ci0jZGVmaW5lIFBCRl9EQkcJCQkgMHgwNDNjCi0jZGVmaW5lIFBCRl9DQVBfQ1RSTCAgICAgMHgwNDQwCi0KLSNpZmRlZiBSVDMweHgKLSNpZmRlZiBSVE1QX0VGVVNFX1NVUFBPUlQKLS8vIGVGdXNlIHJlZ2lzdGVycwotI2RlZmluZSBFRlVTRV9DVFJMCQkJCTB4MDU4MAotI2RlZmluZSBFRlVTRV9EQVRBMAkJCQkweDA1OTAKLSNkZWZpbmUgRUZVU0VfREFUQTEJCQkJMHgwNTk0Ci0jZGVmaW5lIEVGVVNFX0RBVEEyCQkJCTB4MDU5OAotI2RlZmluZSBFRlVTRV9EQVRBMwkJCQkweDA1OWMKLSNlbmRpZiAvLyBSVE1QX0VGVVNFX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBSVDMweHggLy8KLQotI2RlZmluZSBPU0NfQ1RSTAkJMHg1YTQKLSNkZWZpbmUgUENJRV9QSFlfVFhfQVRURU5VQVRJT05fQ1RSTAkweDA1QzgKLSNkZWZpbmUgTERPX0NGRzAJCQkJMHgwNWQ0Ci0jZGVmaW5lIEdQSU9fU1dJVENICQkJCTB4MDVkYwotCi0KLS8vCi0vLyAgNCAgTUFDICByZWdpc3RlcnMKLS8vCi0vLwotLy8gIDQuMSBNQUMgU1lTVEVNICBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTAwMCkKLS8vCi0jZGVmaW5lIE1BQ19DU1IwICAgICAgICAgICAgMHgxMDAwCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfQVNJQ19WRVJfSURfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQVNJQ1ZlcjsgICAgICAgIC8vIHZlcnNpb24gOiAyODYwCi0JICAgIFVTSE9SVCAgQVNJQ1JldjsgICAgICAgIC8vIHJldmVyc2lvbiAgOiAwCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlBU0lDX1ZFUl9JRF9TVFJVQywgKlBBU0lDX1ZFUl9JRF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9BU0lDX1ZFUl9JRF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBBU0lDUmV2OyAgICAgICAgLy8gcmV2ZXJzaW9uICA6IDAKLQkgICAgVVNIT1JUICBBU0lDVmVyOyAgICAgICAgLy8gdmVyc2lvbiA6IDI4NjAKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUFTSUNfVkVSX0lEX1NUUlVDLCAqUEFTSUNfVkVSX0lEX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIE1BQ19TWVNfQ1RSTCAgICAgICAgICAgIDB4MTAwNAkJLy9NQUNfQ1NSMQotI2RlZmluZSBNQUNfQUREUl9EVzAJCQkJMHgxMDA4CQkvLyBNQUMgQUREUiBEVzAKLSNkZWZpbmUgTUFDX0FERFJfRFcxCQkJIDB4MTAwYwkJLy8gTUFDIEFERFIgRFcxCi0vLwotLy8gTUFDX0NTUjI6IFNUQSBNQUMgcmVnaXN0ZXIgMAotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9NQUNfRFcwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVQ0hBUgkJQnl0ZTM7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDMKLQkJVUNIQVIJCUJ5dGUyOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAyCi0JCVVDSEFSCQlCeXRlMTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMQotCQlVQ0hBUgkJQnl0ZTA7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDAKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CU1BQ19EVzBfU1RSVUMsICpQTUFDX0RXMF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9NQUNfRFcwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVQ0hBUgkJQnl0ZTA7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDAKLQkJVUNIQVIJCUJ5dGUxOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAxCi0JCVVDSEFSCQlCeXRlMjsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMgotCQlVQ0hBUgkJQnl0ZTM7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDMKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CU1BQ19EVzBfU1RSVUMsICpQTUFDX0RXMF9TVFJVQzsKLSNlbmRpZgotCi0vLwotLy8gTUFDX0NTUjM6IFNUQSBNQUMgcmVnaXN0ZXIgMQotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9NQUNfRFcxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVQ0hBUgkJUnN2ZDE7Ci0JCVVDSEFSCQlVMk1lTWFzazsKLQkJVUNIQVIJCUJ5dGU1OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA1Ci0JCVVDSEFSCQlCeXRlNDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNAotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JTUFDX0RXMV9TVFJVQywgKlBNQUNfRFcxX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX01BQ19EVzFfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVDSEFSCQlCeXRlNDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNAotCQlVQ0hBUgkJQnl0ZTU7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDUKLQkJVUNIQVIJCVUyTWVNYXNrOwotCQlVQ0hBUgkJUnN2ZDE7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlNQUNfRFcxX1NUUlVDLCAqUE1BQ19EVzFfU1RSVUM7Ci0jZW5kaWYKLQotI2RlZmluZSBNQUNfQlNTSURfRFcwCQkJCTB4MTAxMAkJLy8gTUFDIEJTU0lEIERXMAotI2RlZmluZSBNQUNfQlNTSURfRFcxCQkJCTB4MTAxNAkJLy8gTUFDIEJTU0lEIERXMQotCi0vLwotLy8gTUFDX0NTUjU6IEJTU0lEIHJlZ2lzdGVyIDEKLS8vCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfTUFDX0NTUjVfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVTSE9SVAkJUnN2ZDoxMTsKLQkJVVNIT1JUCQlNQnNzQmNuTnVtOjM7Ci0JCVVTSE9SVAkJQnNzSWRNb2RlOjI7IC8vIDA6IG9uZSBCU1NJRCwgMTA6IDQgQlNTSUQsICAwMTogMiBCU1NJRCAsIDExOiA4QlNTSUQKLQkJVUNIQVIJCUJ5dGU1OwkJIC8vIEJTU0lEIGJ5dGUgNQotCQlVQ0hBUgkJQnl0ZTQ7CQkgLy8gQlNTSUQgYnl0ZSA0Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlNQUNfQ1NSNV9TVFJVQywgKlBNQUNfQ1NSNV9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9NQUNfQ1NSNV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUNIQVIJCUJ5dGU0OwkJIC8vIEJTU0lEIGJ5dGUgNAotCQlVQ0hBUgkJQnl0ZTU7CQkgLy8gQlNTSUQgYnl0ZSA1Ci0JCVVTSE9SVAkJQnNzSWRNYXNrOjI7IC8vIDA6IG9uZSBCU1NJRCwgMTA6IDQgQlNTSUQsICAwMTogMiBCU1NJRCAsIDExOiA4QlNTSUQKLQkJVVNIT1JUCQlNQnNzQmNuTnVtOjM7Ci0JCVVTSE9SVAkJUnN2ZDoxMTsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CU1BQ19DU1I1X1NUUlVDLCAqUE1BQ19DU1I1X1NUUlVDOwotI2VuZGlmCi0KLSNkZWZpbmUgTUFYX0xFTl9DRkcgICAgICAgICAgICAgIDB4MTAxOAkJLy8gcnQyODYwYiBtYXggMTZrIGJ5dGVzLiBiaXQxMjoxMyBNYXhpbXVtIFBTRFUgbGVuZ3RoIChwb3dlciBmYWN0b3IpIDA6Ml4xMywgMToyXjE0LCAyOjJeMTUsIDM6Ml4xNgotI2RlZmluZSBCQlBfQ1NSX0NGRwkJCTB4MTAxYwkJLy8KLS8vCi0vLyBCQlBfQ1NSX0NGRzogQkJQIHNlcmlhbCBjb250cm9sIHJlZ2lzdGVyCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0JCUF9DU1JfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCToxMjsKLQkJVUlOVDMyCQlCQlBfUldfTU9ERToxOwkJLy8gMDogdXNlIHNlcmlhbCBtb2RlICAxOnBhcmFsbGVsCi0JCVVJTlQzMgkJQkJQX1BBUl9EVVI6MTsJCSAgICAvLyAwOiA0IE1BQyBjbG9jayBjeWNsZXMgIDE6IDggTUFDIGNsb2NrIGN5Y2xlcwotCQlVSU5UMzIJCUJ1c3k6MTsJCQkJLy8gMTogQVNJQyBpcyBidXN5IGV4ZWN1dGUgQkJQIHByb2dyYW1taW5nLgotCQlVSU5UMzIJCWZSZWFkOjE7CQkgICAgLy8gMDogV3JpdGUJQkJQLCAxOglSZWFkIEJCUAotCQlVSU5UMzIJCVJlZ051bTo4OwkJCS8vIFNlbGVjdGVkCUJCUAlyZWdpc3RlcgotCQlVSU5UMzIJCVZhbHVlOjg7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQkJQX0NTUl9DRkdfU1RSVUMsICpQQkJQX0NTUl9DRkdfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfQkJQX0NTUl9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJVmFsdWU6ODsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCi0JCVVJTlQzMgkJUmVnTnVtOjg7CQkJLy8gU2VsZWN0ZWQJQkJQCXJlZ2lzdGVyCi0JCVVJTlQzMgkJZlJlYWQ6MTsJCSAgICAvLyAwOiBXcml0ZQlCQlAsIDE6CVJlYWQgQkJQCi0JCVVJTlQzMgkJQnVzeToxOwkJCQkvLyAxOiBBU0lDIGlzIGJ1c3kgZXhlY3V0ZSBCQlAgcHJvZ3JhbW1pbmcuCi0JCVVJTlQzMgkJQkJQX1BBUl9EVVI6MTsJCSAgICAgLy8gMDogNCBNQUMgY2xvY2sgY3ljbGVzICAxOiA4IE1BQyBjbG9jayBjeWNsZXMKLQkJVUlOVDMyCQlCQlBfUldfTU9ERToxOwkJLy8gMDogdXNlIHNlcmlhbCBtb2RlICAxOnBhcmFsbGVsCi0JCVVJTlQzMgkJOjEyOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQkJQX0NTUl9DRkdfU1RSVUMsICpQQkJQX0NTUl9DRkdfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgUkZfQ1NSX0NGRzAJCQkweDEwMjAKLS8vCi0vLyBSRl9DU1JfQ0ZHOiBSRiBjb250cm9sIHJlZ2lzdGVyCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1JGX0NTUl9DRkcwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCUJ1c3k6MTsJCSAgICAvLyAwOiBpZGxlIDE6IDhidXN5Ci0JCVVJTlQzMgkJU2VsOjE7CQkJCS8vIDA6UkZfTEUwIGFjdGl2YXRlICAxOlJGX0xFMSBhY3RpdmF0ZQotCQlVSU5UMzIJCVN0YW5kYnlNb2RlOjE7CQkgICAgLy8gMDogaGlnaCB3aGVuIHN0YW5kIGJ5IDE6CWxvdyB3aGVuIHN0YW5kYnkKLQkJVUlOVDMyCQliaXR3aWR0aDo1OwkJCS8vIFNlbGVjdGVkCUJCUAlyZWdpc3RlcgotCQlVSU5UMzIJCVJlZ0lkQW5kQ29udGVudDoyNDsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlSRl9DU1JfQ0ZHMF9TVFJVQywgKlBSRl9DU1JfQ0ZHMF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAotCQlVSU5UMzIJCWJpdHdpZHRoOjU7CQkJLy8gU2VsZWN0ZWQJQkJQCXJlZ2lzdGVyCi0JCVVJTlQzMgkJU3RhbmRieU1vZGU6MTsJCSAgICAvLyAwOiBoaWdoIHdoZW4gc3RhbmQgYnkgMToJbG93IHdoZW4gc3RhbmRieQotCQlVSU5UMzIJCVNlbDoxOwkJCQkvLyAwOlJGX0xFMCBhY3RpdmF0ZSAgMTpSRl9MRTEgYWN0aXZhdGUKLQkJVUlOVDMyCQlCdXN5OjE7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUkZfQ1NSX0NGRzBfU1RSVUMsICpQUkZfQ1NSX0NGRzBfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgUkZfQ1NSX0NGRzEJCQkweDEwMjQKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlyc3Y6NzsJCSAgICAvLyAwOiBpZGxlIDE6IDhidXN5Ci0JCVVJTlQzMgkJUkZHYXA6NTsJCQkvLyBHYXAgYmV0d2VlbiBCQl9DT05UUk9MX1JGIGFuZCBSRl9MRS4gMDogMyBzeXN0ZW0gY2xvY2sgY3ljbGUgKDM3LjV1c2VjKSAxOiA1IHN5c3RlbSBjbG9jayBjeWNsZSAoNjIuNXVzZWMpCi0JCVVJTlQzMgkJUmVnSWRBbmRDb250ZW50OjI0OwkJCS8vIFJlZ2lzdGVyCXZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVJGX0NTUl9DRkcxX1NUUlVDLCAqUFJGX0NTUl9DRkcxX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1JGX0NTUl9DRkcxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCVJlZ0lkQW5kQ29udGVudDoyNDsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCi0JCVVJTlQzMgkJUkZHYXA6NTsJCQkvLyBHYXAgYmV0d2VlbiBCQl9DT05UUk9MX1JGIGFuZCBSRl9MRS4gMDogMyBzeXN0ZW0gY2xvY2sgY3ljbGUgKDM3LjV1c2VjKSAxOiA1IHN5c3RlbSBjbG9jayBjeWNsZSAoNjIuNXVzZWMpCi0JCVVJTlQzMgkJcnN2Ojc7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUkZfQ1NSX0NGRzFfU1RSVUMsICpQUkZfQ1NSX0NGRzFfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgUkZfQ1NSX0NGRzIJCQkweDEwMjgJCS8vCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGRzJfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJcnN2Ojg7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQotCQlVSU5UMzIJCVJlZ0lkQW5kQ29udGVudDoyNDsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlSRl9DU1JfQ0ZHMl9TVFJVQywgKlBSRl9DU1JfQ0ZHMl9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAotCQlVSU5UMzIJCXJzdjo4OwkJICAgIC8vIDA6IGlkbGUgMTogOGJ1c3kKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVJGX0NTUl9DRkcyX1NUUlVDLCAqUFJGX0NTUl9DRkcyX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIExFRF9DRkcJCQkJMHgxMDJjCQkvLyAgTUFDX0NTUjE0Ci0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfTEVEX0NGR19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQk6MTsKLQkJVUlOVDMyCQlMZWRQb2xhcjoxOwkJCS8vIExlZCBQb2xhcml0eS4gIDA6IGFjdGl2ZSBsb3cxOiBhY3RpdmUgaGlnaAotCQlVSU5UMzIJCVlMZWRNb2RlOjI7CQkJLy8geWVsbG93IExlZCBNb2RlCi0JCVVJTlQzMgkJR0xlZE1vZGU6MjsJCQkvLyBncmVlbiBMZWQgTW9kZQotCQlVSU5UMzIJCVJMZWRNb2RlOjI7CQkJLy8gcmVkIExlZCBNb2RlICAgIDA6IG9mZjE6IGJsaW5raW5nIHVwb24gVFgyOiBwZXJpb2RpYyBzbG93IGJsaW5raW5nMzogYWx3YXlzIG9uCi0JCVVJTlQzMgkJcnN2OjI7Ci0JCVVJTlQzMgkJU2xvd0JsaW5rUGVyaW9kOjY7CQkJLy8gc2xvdyBibGlua2luZyBwZXJpb2QuIHVuaXQ6MW1zCi0JCVVJTlQzMgkJT2ZmUGVyaW9kOjg7CQkJLy8gYmxpbmtpbmcgb2ZmIHBlcmlvZCB1bml0IDFtcwotCQlVSU5UMzIJCU9uUGVyaW9kOjg7CQkJLy8gYmxpbmtpbmcgb24gcGVyaW9kIHVuaXQgMW1zCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlMRURfQ0ZHX1NUUlVDLCAqUExFRF9DRkdfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfTEVEX0NGR19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlPblBlcmlvZDo4OwkJCS8vIGJsaW5raW5nIG9uIHBlcmlvZCB1bml0IDFtcwotCQlVSU5UMzIJCU9mZlBlcmlvZDo4OwkJCS8vIGJsaW5raW5nIG9mZiBwZXJpb2QgdW5pdCAxbXMKLQkJVUlOVDMyCQlTbG93QmxpbmtQZXJpb2Q6NjsJCQkvLyBzbG93IGJsaW5raW5nIHBlcmlvZC4gdW5pdDoxbXMKLQkJVUlOVDMyCQlyc3Y6MjsKLQkJVUlOVDMyCQlSTGVkTW9kZToyOwkJCS8vIHJlZCBMZWQgTW9kZSAgICAwOiBvZmYxOiBibGlua2luZyB1cG9uIFRYMjogcGVyaW9kaWMgc2xvdyBibGlua2luZzM6IGFsd2F5cyBvbgotCQlVSU5UMzIJCUdMZWRNb2RlOjI7CQkJLy8gZ3JlZW4gTGVkIE1vZGUKLQkJVUlOVDMyCQlZTGVkTW9kZToyOwkJCS8vIHllbGxvdyBMZWQgTW9kZQotCQlVSU5UMzIJCUxlZFBvbGFyOjE7CQkJLy8gTGVkIFBvbGFyaXR5LiAgMDogYWN0aXZlIGxvdzE6IGFjdGl2ZSBoaWdoCi0JCVVJTlQzMgkJOjE7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlMRURfQ0ZHX1NUUlVDLCAqUExFRF9DRkdfU1RSVUM7Ci0jZW5kaWYKLS8vCi0vLyAgNC4yIE1BQyBUSU1JTkcgIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChvZmZzZXQ6MHgxMTAwKQotLy8KLSNkZWZpbmUgWElGU19USU1FX0NGRyAgICAgICAgICAgICAweDExMDAJCSAvLyBNQUNfQ1NSOCAgTUFDX0NTUjkKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9JRlNfU0xPVF9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgcnN2OjI7Ci0JICAgIFVJTlQzMiAgQkJSeGVuZEVuYWJsZToxOyAgICAgICAgLy8gIHJlZmVyZW5jZSBSWEVORCBzaWduYWwgdG8gYmVnaW4gWElGUyBkZWZlcgotCSAgICBVSU5UMzIgIEVJRlM6OTsgICAgICAgIC8vICB1bml0IDF1cwotCSAgICBVSU5UMzIgIE9mZG1YaWZzVGltZTo0OyAgICAgICAgLy9PRkRNIFNJRlMuIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIE9GRE0gUlggd2hlbiBNQUMgZG9lc24ndCByZWZlcmVuY2UgQkJQIHNpZ25hbCBCQlJYRU5ECi0JICAgIFVJTlQzMiAgT2ZkbVNpZnNUaW1lOjg7ICAgICAgICAvLyAgdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgT0ZETSBSWC9UWAotCSAgICBVSU5UMzIgIENja21TaWZzVGltZTo4OyAgICAgICAgLy8gIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIENDSyBSWC9UWAotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JSUZTX1NMT1RfQ0ZHX1NUUlVDLCAqUElGU19TTE9UX0NGR19TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9JRlNfU0xPVF9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgQ2NrbVNpZnNUaW1lOjg7ICAgICAgICAvLyAgdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgQ0NLIFJYL1RYCi0JICAgIFVJTlQzMiAgT2ZkbVNpZnNUaW1lOjg7ICAgICAgICAvLyAgdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgT0ZETSBSWC9UWAotCSAgICBVSU5UMzIgIE9mZG1YaWZzVGltZTo0OyAgICAgICAgLy9PRkRNIFNJRlMuIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIE9GRE0gUlggd2hlbiBNQUMgZG9lc24ndCByZWZlcmVuY2UgQkJQIHNpZ25hbCBCQlJYRU5ECi0JICAgIFVJTlQzMiAgRUlGUzo5OyAgICAgICAgLy8gIHVuaXQgMXVzCi0JICAgIFVJTlQzMiAgQkJSeGVuZEVuYWJsZToxOyAgICAgICAgLy8gIHJlZmVyZW5jZSBSWEVORCBzaWduYWwgdG8gYmVnaW4gWElGUyBkZWZlcgotCSAgICBVSU5UMzIgIHJzdjoyOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JSUZTX1NMT1RfQ0ZHX1NUUlVDLCAqUElGU19TTE9UX0NGR19TVFJVQzsKLSNlbmRpZgotCi0jZGVmaW5lIEJLT0ZGX1NMT1RfQ0ZHICAgICAgICAgICAgIDB4MTEwNAkJIC8vICBtYWNfY3NyOSBsYXN0IDggYml0cwotI2RlZmluZSBOQVZfVElNRV9DRkcgICAgICAgICAgICAgMHgxMTA4CQkgLy8gTkFWICAoTUFDX0NTUjE1KQotI2RlZmluZSBDSF9USU1FX0NGRyAgICAgICAgICAgICAweDExMEMJCQkvLyBDb3VudCBhcyBjaGFubmVsIGJ1c3kKLSNkZWZpbmUgUEJGX0xJRkVfVElNRVIgICAgICAgICAgICAgMHgxMTEwCQkgLy9UWC9SWCBNUERVIHRpbWVzdGFtcCB0aW1lciAoZnJlZSBydW4pVW5pdDogMXVzCi0jZGVmaW5lIEJDTl9USU1FX0NGRyAgICAgICAgICAgICAweDExMTQJCSAvLyBUWFJYX0NTUjkKLQotI2RlZmluZSBCQ05fT0ZGU0VUMAkJCQkweDA0MkMKLSNkZWZpbmUgQkNOX09GRlNFVDEJCQkJMHgwNDMwCi0KLS8vCi0vLyBCQ05fVElNRV9DRkcgOiBTeW5jaHJvbml6YXRpb24gY29udHJvbCByZWdpc3RlcgotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9CQ05fVElNRV9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJVHhUaW1lc3RhbXBDb21wZW5zYXRlOjg7Ci0gICAgICAgIFVJTlQzMiAgICAgICA6MzsKLQkJVUlOVDMyCQliQmVhY29uR2VuOjE7CQkvLyBFbmFibGUgYmVhY29uIGdlbmVyYXRvcgotICAgICAgICBVSU5UMzIgICAgICAgYlRCVFRFbmFibGU6MTsKLQkJVUlOVDMyCQlUc2ZTeW5jTW9kZToyOwkJLy8gRW5hYmxlIFRTRiBzeW5jLCAwMDogZGlzYWJsZSwgMDE6IGluZnJhIG1vZGUsIDEwOiBhZC1ob2MgbW9kZQotCQlVSU5UMzIJCWJUc2ZUaWNraW5nOjE7CQkvLyBFbmFibGUgVFNGIGF1dG8gY291bnRpbmcKLQkJVUlOVDMyICAgICAgIEJlYWNvbkludGVydmFsOjE2OyAgLy8gaW4gdW5pdCBvZiAxLzE2IFRVCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlCQ05fVElNRV9DRkdfU1RSVUMsICpQQkNOX1RJTUVfQ0ZHX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX0JDTl9USU1FX0NGR19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyICAgICAgIEJlYWNvbkludGVydmFsOjE2OyAgLy8gaW4gdW5pdCBvZiAxLzE2IFRVCi0JCVVJTlQzMgkJYlRzZlRpY2tpbmc6MTsJCS8vIEVuYWJsZSBUU0YgYXV0byBjb3VudGluZwotCQlVSU5UMzIJCVRzZlN5bmNNb2RlOjI7CQkvLyBFbmFibGUgVFNGIHN5bmMsIDAwOiBkaXNhYmxlLCAwMTogaW5mcmEgbW9kZSwgMTA6IGFkLWhvYyBtb2RlCi0gICAgICAgIFVJTlQzMiAgICAgICBiVEJUVEVuYWJsZToxOwotCQlVSU5UMzIJCWJCZWFjb25HZW46MTsJCS8vIEVuYWJsZSBiZWFjb24gZ2VuZXJhdG9yCi0gICAgICAgIFVJTlQzMiAgICAgICA6MzsKLQkJVUlOVDMyCQlUeFRpbWVzdGFtcENvbXBlbnNhdGU6ODsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUJDTl9USU1FX0NGR19TVFJVQywgKlBCQ05fVElNRV9DRkdfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgVEJUVF9TWU5DX0NGRyAgICAgICAgICAgIDB4MTExOAkJCS8vIHR4cnhfY3NyMTAKLSNkZWZpbmUgVFNGX1RJTUVSX0RXMCAgICAgICAgICAgICAweDExMUMJCS8vIExvY2FsIFRTRiB0aW1lciBsc2IgMzIgYml0cy4gUmVhZC1vbmx5Ci0jZGVmaW5lIFRTRl9USU1FUl9EVzEgICAgICAgICAgICAgMHgxMTIwCQkvLyBtc2IgMzIgYml0cy4gUmVhZC1vbmx5LgotI2RlZmluZSBUQlRUX1RJTUVSCQkweDExMjQJCQkvLyBUSW1lciByZW1haW5zIHRpbGwgbmV4dCBUQlRULiBSZWFkLW9ubHkuICBUWFJYX0NTUjE0Ci0jZGVmaW5lIElOVF9USU1FUl9DRkcJCQkweDExMjgJCQkvLwotI2RlZmluZSBJTlRfVElNRVJfRU4JCQkweDExMmMJCQkvLyAgR1AtdGltZXIgYW5kIHByZS10YnR0IEludCBlbmFibGUKLSNkZWZpbmUgQ0hfSURMRV9TVEEJCQkweDExMzAJCQkvLyAgY2hhbm5lbCBpZGxlIHRpbWUKLSNkZWZpbmUgQ0hfQlVTWV9TVEEJCQkweDExMzQJCQkvLyAgY2hhbm5sZSBidXN5IHRpbWUKLS8vCi0vLyAgNC4yIE1BQyBQT1dFUiAgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDEyMDApCi0vLwotI2RlZmluZSBNQUNfU1RBVFVTX0NGRyAgICAgICAgICAgICAweDEyMDAJCSAvLyBvbGQgTUFDX0NTUjEyCi0jZGVmaW5lIFBXUl9QSU5fQ0ZHICAgICAgICAgICAgIDB4MTIwNAkJIC8vIG9sZCBNQUNfQ1NSMTIKLSNkZWZpbmUgQVVUT19XQUtFVVBfQ0ZHICAgICAgICAgICAgIDB4MTIwOAkJIC8vIG9sZCBNQUNfQ1NSMTAKLS8vCi0vLyBBVVRPX1dBS0VVUF9DRkc6IE1hbnVhbCBwb3dlciBjb250cm9sIC8gc3RhdHVzIHJlZ2lzdGVyCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0FVVE9fV0FLRVVQX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCToxNjsKLQkJVUlOVDMyCQlFbmFibGVBdXRvV2FrZXVwOjE7CS8vIDA6c2xlZXAsIDE6YXdha2UKLQkJVUlOVDMyICAgICAgIE51bW9mU2xlZXBpbmdUYnR0Ojc7ICAgICAgICAgIC8vIEZvcmNlV2FrZSBoYXMgaGlnaCBwcml2aWxlZ2UgdGhhbiBQdXRUb1NsZWVwIHdoZW4gYm90aCBzZXQKLQkJVUlOVDMyICAgICAgIEF1dG9MZWFkVGltZTo4OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQVVUT19XQUtFVVBfU1RSVUMsICpQQVVUT19XQUtFVVBfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfQVVUT19XQUtFVVBfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMiAgICAgICBBdXRvTGVhZFRpbWU6ODsKLQkJVUlOVDMyICAgICAgIE51bW9mU2xlZXBpbmdUYnR0Ojc7ICAgICAgICAgIC8vIEZvcmNlV2FrZSBoYXMgaGlnaCBwcml2aWxlZ2UgdGhhbiBQdXRUb1NsZWVwIHdoZW4gYm90aCBzZXQKLQkJVUlOVDMyCQlFbmFibGVBdXRvV2FrZXVwOjE7CS8vIDA6c2xlZXAsIDE6YXdha2UKLQkJVUlOVDMyCQk6MTY7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlBVVRPX1dBS0VVUF9TVFJVQywgKlBBVVRPX1dBS0VVUF9TVFJVQzsKLSNlbmRpZgotLy8KLS8vICA0LjMgTUFDIFRYICBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTMwMCkKLS8vCi0KLSNkZWZpbmUgRURDQV9BQzBfQ0ZHCTB4MTMwMAkJLy9BQ19UWE9QX0NTUjAgMHgzNDc0Ci0jZGVmaW5lIEVEQ0FfQUMxX0NGRwkweDEzMDQKLSNkZWZpbmUgRURDQV9BQzJfQ0ZHCTB4MTMwOAotI2RlZmluZSBFRENBX0FDM19DRkcJMHgxMzBjCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfRURDQV9BQ19DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgOjEyOyAgICAgICAgLy8KLQkgICAgVUlOVDMyICBDd21heDo0OyAgICAgICAgLy91bml0IHBvd2VyIG9mIDIKLQkgICAgVUlOVDMyICBDd21pbjo0OyAgICAgICAgLy8KLQkgICAgVUlOVDMyICBBaWZzbjo0OyAgICAgICAgLy8gIyBvZiBzbG90IHRpbWUKLQkgICAgVUlOVDMyICBBY1R4b3A6ODsgICAgICAgIC8vICBpbiB1bml0IG9mIDMydXMKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUVEQ0FfQUNfQ0ZHX1NUUlVDLCAqUEVEQ0FfQUNfQ0ZHX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX0VEQ0FfQUNfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgIEFjVHhvcDo4OyAgICAgICAgLy8gIGluIHVuaXQgb2YgMzJ1cwotCSAgICBVSU5UMzIgIEFpZnNuOjQ7ICAgICAgICAvLyAjIG9mIHNsb3QgdGltZQotCSAgICBVSU5UMzIgIEN3bWluOjQ7ICAgICAgICAvLwotCSAgICBVSU5UMzIgIEN3bWF4OjQ7ICAgICAgICAvL3VuaXQgcG93ZXIgb2YgMgotCSAgICBVSU5UMzIgIDoxMjsgICAgICAgLy8KLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUVEQ0FfQUNfQ0ZHX1NUUlVDLCAqUEVEQ0FfQUNfQ0ZHX1NUUlVDOwotI2VuZGlmCi0KLSNkZWZpbmUgRURDQV9USURfQUNfTUFQCTB4MTMxMAotI2RlZmluZSBUWF9QV1JfQ0ZHXzAJMHgxMzE0Ci0jZGVmaW5lIFRYX1BXUl9DRkdfMQkweDEzMTgKLSNkZWZpbmUgVFhfUFdSX0NGR18yCTB4MTMxQwotI2RlZmluZSBUWF9QV1JfQ0ZHXzMJMHgxMzIwCi0jZGVmaW5lIFRYX1BXUl9DRkdfNAkweDEzMjQKLSNkZWZpbmUgVFhfUElOX0NGRwkJMHgxMzI4Ci0jZGVmaW5lIFRYX0JBTkRfQ0ZHCTB4MTMyYwkJLy8gMHgxIHVzZSB1cHBlciAyME1Iei4gMCBqdXNlIGxvd2VyIDIwTUh6Ci0jZGVmaW5lIFRYX1NXX0NGRzAJCTB4MTMzMAotI2RlZmluZSBUWF9TV19DRkcxCQkweDEzMzQKLSNkZWZpbmUgVFhfU1dfQ0ZHMgkJMHgxMzM4Ci0jZGVmaW5lIFRYT1BfVEhSRVNfQ0ZHCQkweDEzM2MKLSNkZWZpbmUgVFhPUF9DVFJMX0NGRwkJMHgxMzQwCi0jZGVmaW5lIFRYX1JUU19DRkcJCTB4MTM0NAotCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfVFhfUlRTX0NGR19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICAgICAgIHJzdjo3OwotCSAgICBVSU5UMzIgICAgICAgUnRzRmJrRW46MTsgICAgLy8gZW5hYmxlIHJ0cyByYXRlIGZhbGxiYWNrCi0JICAgIFVJTlQzMiAgICAgICBSdHNUaHJlczoxNjsgICAgLy8gdW5pdDpieXRlCi0JICAgIFVJTlQzMiAgICAgICBBdXRvUnRzUmV0cnlMaW1pdDo4OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfUlRTX0NGR19TVFJVQywgKlBUWF9SVFNfQ0ZHX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1RYX1JUU19DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICBBdXRvUnRzUmV0cnlMaW1pdDo4OwotCSAgICBVSU5UMzIgICAgICAgUnRzVGhyZXM6MTY7ICAgIC8vIHVuaXQ6Ynl0ZQotCSAgICBVSU5UMzIgICAgICAgUnRzRmJrRW46MTsgICAgLy8gZW5hYmxlIHJ0cyByYXRlIGZhbGxiYWNrCi0JICAgIFVJTlQzMiAgICAgICByc3Y6NzsgICAgIC8vIDE6IEhUIG5vbi1TVEJDIGNvbnRyb2wgZnJhbWUgZW5hYmxlCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9SVFNfQ0ZHX1NUUlVDLCAqUFRYX1JUU19DRkdfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgVFhfVElNRU9VVF9DRkcJMHgxMzQ4Ci0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfVFhfVElNRU9VVF9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICByc3YyOjg7Ci0JICAgIFVJTlQzMiAgICAgICBUeG9wVGltZW91dDo4OwkvL1RYT1AgdGltZW91dCB2YWx1ZSBmb3IgVFhPUCB0cnVuY2F0aW9uLiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCAoU0xPVF9USU1FKSA+IChUWF9PUF9USU1FT1VUKSA+IChSWF9BQ0tfVElNRU9VVCkKLQkgICAgVUlOVDMyICAgICAgIFJ4QWNrVGltZW91dDo4OwkvLyB1bml0OnNsb3QuIFVzZWQgZm9yIFRYIHByZWNlZHVyZQotCSAgICBVSU5UMzIgICAgICAgTXBkdUxpZmVUaW1lOjQ7ICAgIC8vICBleHBpcmF0aW9uIHRpbWUgPSAyXig5K01QRFUgTElGRSBUSU1FKSAgdXMKLQkgICAgVUlOVDMyICAgICAgIHJzdjo0OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfVElNRU9VVF9DRkdfU1RSVUMsICpQVFhfVElNRU9VVF9DRkdfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfVFhfVElNRU9VVF9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICByc3Y6NDsKLQkgICAgVUlOVDMyICAgICAgIE1wZHVMaWZlVGltZTo0OyAgICAvLyAgZXhwaXJhdGlvbiB0aW1lID0gMl4oOStNUERVIExJRkUgVElNRSkgIHVzCi0JICAgIFVJTlQzMiAgICAgICBSeEFja1RpbWVvdXQ6ODsJLy8gdW5pdDpzbG90LiBVc2VkIGZvciBUWCBwcmVjZWR1cmUKLQkgICAgVUlOVDMyICAgICAgIFR4b3BUaW1lb3V0Ojg7CS8vVFhPUCB0aW1lb3V0IHZhbHVlIGZvciBUWE9QIHRydW5jYXRpb24uICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IChTTE9UX1RJTUUpID4gKFRYX09QX1RJTUVPVVQpID4gKFJYX0FDS19USU1FT1VUKQotCSAgICBVSU5UMzIgICAgICAgcnN2Mjo4OyAgICAgLy8gMTogSFQgbm9uLVNUQkMgY29udHJvbCBmcmFtZSBlbmFibGUKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX1RJTUVPVVRfQ0ZHX1NUUlVDLCAqUFRYX1RJTUVPVVRfQ0ZHX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIFRYX1JUWV9DRkcJMHgxMzRjCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbiBQQUNLRUQgX1RYX1JUWV9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICByc3Y6MTsKLQkgICAgVUlOVDMyICAgICAgIFR4YXV0b0ZCRW5hYmxlOjE7ICAgIC8vIFR4IHJldHJ5IFBIWSByYXRlIGF1dG8gZmFsbGJhY2sgZW5hYmxlCi0JICAgIFVJTlQzMiAgICAgICBBZ2dSdHlNb2RlOjE7CS8vIEFnZ3JlZ2F0ZSBNUERVIHJldHJ5IG1vZGUuICAwOmV4cGlyZWQgYnkgcmV0cnkgbGltaXQsIDE6IGV4cGlyZWQgYnkgbXBkdSBsaWZlIHRpbWVyCi0JICAgIFVJTlQzMiAgICAgICBOb25BZ2dSdHlNb2RlOjE7CS8vIE5vbi1BZ2dyZWdhdGUgTVBEVSByZXRyeSBtb2RlLiAgMDpleHBpcmVkIGJ5IHJldHJ5IGxpbWl0LCAxOiBleHBpcmVkIGJ5IG1wZHUgbGlmZSB0aW1lcgotCSAgICBVSU5UMzIgICAgICAgTG9uZ1J0eVRocmU6MTI7CS8vIExvbmcgcmV0cnkgdGhyZXNob29sZAotCSAgICBVSU5UMzIgICAgICAgTG9uZ1J0eUxpbWl0Ojg7CS8vbG9uZyByZXRyeSBsaW1pdAotCSAgICBVSU5UMzIgICAgICAgU2hvcnRSdHlMaW1pdDo4OwkvLyAgc2hvcnQgcmV0cnkgbGltaXQKLQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfUlRZX0NGR19TVFJVQywgKlBUWF9SVFlfQ0ZHX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24gUEFDS0VEIF9UWF9SVFlfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICAgICAgU2hvcnRSdHlMaW1pdDo4OwkvLyAgc2hvcnQgcmV0cnkgbGltaXQKLQkgICAgVUlOVDMyICAgICAgIExvbmdSdHlMaW1pdDo4OwkvL2xvbmcgcmV0cnkgbGltaXQKLQkgICAgVUlOVDMyICAgICAgIExvbmdSdHlUaHJlOjEyOwkvLyBMb25nIHJldHJ5IHRocmVzaG9vbGQKLQkgICAgVUlOVDMyICAgICAgIE5vbkFnZ1J0eU1vZGU6MTsJLy8gTm9uLUFnZ3JlZ2F0ZSBNUERVIHJldHJ5IG1vZGUuICAwOmV4cGlyZWQgYnkgcmV0cnkgbGltaXQsIDE6IGV4cGlyZWQgYnkgbXBkdSBsaWZlIHRpbWVyCi0JICAgIFVJTlQzMiAgICAgICBBZ2dSdHlNb2RlOjE7CS8vIEFnZ3JlZ2F0ZSBNUERVIHJldHJ5IG1vZGUuICAwOmV4cGlyZWQgYnkgcmV0cnkgbGltaXQsIDE6IGV4cGlyZWQgYnkgbXBkdSBsaWZlIHRpbWVyCi0JICAgIFVJTlQzMiAgICAgICBUeGF1dG9GQkVuYWJsZToxOyAgICAvLyBUeCByZXRyeSBQSFkgcmF0ZSBhdXRvIGZhbGxiYWNrIGVuYWJsZQotCSAgICBVSU5UMzIgICAgICAgcnN2OjE7ICAgICAvLyAxOiBIVCBub24tU1RCQyBjb250cm9sIGZyYW1lIGVuYWJsZQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfUlRZX0NGR19TVFJVQywgKlBUWF9SVFlfQ0ZHX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIFRYX0xJTktfQ0ZHCTB4MTM1MAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JUEFDS0VEIF9UWF9MSU5LX0NGR19TVFJVQwl7Ci0Jc3RydWN0IFBBQ0tFRCB7Ci0JICAgIFVJTlQzMiAgICAgICBSZW1vdE1GUzo4OwkvL3JlbW90ZSBNQ1MgZmVlZGJhY2sgc2VxdWVuY2UgbnVtYmVyCi0JICAgIFVJTlQzMiAgICAgICBSZW1vdE1GQjo4OyAgICAvLyAgcmVtb3RlIE1DUyBmZWVkYmFjawotCSAgICBVSU5UMzIgICAgICAgcnN2OjM7CS8vCi0JICAgIFVJTlQzMiAgICAgICBUeENGQWNrRW46MTsJLy8gICBQaWdneWJhY2sgQ0YtQUNLIGVuYWJsZQotCSAgICBVSU5UMzIgICAgICAgVHhSREdFbjoxOwkvLyBSREcgVFggZW5hYmxlCi0JICAgIFVJTlQzMiAgICAgICBUeE1SUUVuOjE7CS8vICBNQ1MgcmVxdWVzdCBUWCBlbmFibGUKLQkgICAgVUlOVDMyICAgICAgIFJlbW90ZVVNRlNFbmFibGU6MTsJLy8gIHJlbW90ZSB1bnNvbGljaXQgIE1GQiBlbmFibGUuICAwOiBub3QgYXBwbHkgcmVtb3RlIHJlbW90ZSB1bnNvbGljaXQgKE1GUz03KQotCSAgICBVSU5UMzIgICAgICAgTUZCRW5hYmxlOjE7CS8vICBUWCBhcHBseSByZW1vdGUgTUZCIDE6ZW5hYmxlCi0JICAgIFVJTlQzMiAgICAgICBSZW1vdGVNRkJMaWZlVGltZTo4OwkvL3JlbW90ZSBNRkIgbGlmZSB0aW1lLiB1bml0IDogMzJ1cwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfTElOS19DRkdfU1RSVUMsICpQVFhfTElOS19DRkdfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglQQUNLRUQgX1RYX0xJTktfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QgUEFDS0VEIHsKLQkgICAgVUlOVDMyICAgICAgIFJlbW90ZU1GQkxpZmVUaW1lOjg7CS8vcmVtb3RlIE1GQiBsaWZlIHRpbWUuIHVuaXQgOiAzMnVzCi0JICAgIFVJTlQzMiAgICAgICBNRkJFbmFibGU6MTsJLy8gIFRYIGFwcGx5IHJlbW90ZSBNRkIgMTplbmFibGUKLQkgICAgVUlOVDMyICAgICAgIFJlbW90ZVVNRlNFbmFibGU6MTsJLy8gIHJlbW90ZSB1bnNvbGljaXQgIE1GQiBlbmFibGUuICAwOiBub3QgYXBwbHkgcmVtb3RlIHJlbW90ZSB1bnNvbGljaXQgKE1GUz03KQotCSAgICBVSU5UMzIgICAgICAgVHhNUlFFbjoxOwkvLyAgTUNTIHJlcXVlc3QgVFggZW5hYmxlCi0JICAgIFVJTlQzMiAgICAgICBUeFJER0VuOjE7CS8vIFJERyBUWCBlbmFibGUKLQkgICAgVUlOVDMyICAgICAgIFR4Q0ZBY2tFbjoxOwkvLyAgIFBpZ2d5YmFjayBDRi1BQ0sgZW5hYmxlCi0JICAgIFVJTlQzMiAgICAgICByc3Y6MzsJLy8KLQkgICAgVUlOVDMyICAgICAgIFJlbW90TUZCOjg7ICAgIC8vICByZW1vdGUgTUNTIGZlZWRiYWNrCi0JICAgIFVJTlQzMiAgICAgICBSZW1vdE1GUzo4OwkvL3JlbW90ZSBNQ1MgZmVlZGJhY2sgc2VxdWVuY2UgbnVtYmVyCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9MSU5LX0NGR19TVFJVQywgKlBUWF9MSU5LX0NGR19TVFJVQzsKLSNlbmRpZgotI2RlZmluZSBIVF9GQktfQ0ZHMAkweDEzNTQKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uIFBBQ0tFRCBfSFRfRkJLX0NGRzBfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzdGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTNkZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1M1RkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzRGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTM0ZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MyRkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzFGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMEZCSzo0OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JSFRfRkJLX0NGRzBfU1RSVUMsICpQSFRfRkJLX0NGRzBfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbiBQQUNLRUQgX0hUX0ZCS19DRkcwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MwRkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzFGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMkZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MzRkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzRGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTNUZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1M2RkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzdGQks6NDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUhUX0ZCS19DRkcwX1NUUlVDLCAqUEhUX0ZCS19DRkcwX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIEhUX0ZCS19DRkcxCTB4MTM1OAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0hUX0ZCS19DRkcxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxNUZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxNEZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxM0ZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMkZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMUZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMEZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1M5RkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzhGQks6NDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUhUX0ZCS19DRkcxX1NUUlVDLCAqUEhUX0ZCS19DRkcxX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX0hUX0ZCS19DRkcxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICAgICAgSFRNQ1M4RkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzlGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMTBGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMTFGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMTJGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMTNGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMTRGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMTVGQks6NDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUhUX0ZCS19DRkcxX1NUUlVDLCAqUEhUX0ZCS19DRkcxX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIExHX0ZCS19DRkcwCTB4MTM1YwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0xHX0ZCS19DRkcwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzdGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDYKLQkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M2RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyA1Ci0JICAgIFVJTlQzMiAgICAgICBPRkRNTUNTNUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgNAotCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzRGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDMKLQkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MzRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAyCi0JICAgIFVJTlQzMiAgICAgICBPRkRNTUNTMkZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMQotCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzFGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDAKLQkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MwRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlMR19GQktfQ0ZHMF9TVFJVQywgKlBMR19GQktfQ0ZHMF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9MR19GQktfQ0ZHMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MwRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCi0JICAgIFVJTlQzMiAgICAgICBPRkRNTUNTMUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAotCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzJGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDEKLQkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MzRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAyCi0JICAgIFVJTlQzMiAgICAgICBPRkRNTUNTNEZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMwotCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzVGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDQKLQkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M2RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyA1Ci0JICAgIFVJTlQzMiAgICAgICBPRkRNTUNTN0ZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgNgotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JTEdfRkJLX0NGRzBfU1RSVUMsICpQTEdfRkJLX0NGRzBfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgTEdfRkJLX0NGRzEJCTB4MTM2MAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0xHX0ZCS19DRkcxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICAgICAgcnN2OjE2OwotCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTM0ZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMgotCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMkZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMQotCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAotCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMEZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JTEdfRkJLX0NGRzFfU1RSVUMsICpQTEdfRkJLX0NGRzFfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfTEdfRkJLX0NGRzFfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MwRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCi0JICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MxRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCi0JICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MyRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAxCi0JICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MzRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAyCi0JICAgIFVJTlQzMiAgICAgICByc3Y6MTY7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlMR19GQktfQ0ZHMV9TVFJVQywgKlBMR19GQktfQ0ZHMV9TVFJVQzsKLSNlbmRpZgotCi0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy89PT09PT09PT09PT09PT09IFByb3RlY3Rpb24gUGFyYW1hdGVyPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2RlZmluZSBDQ0tfUFJPVF9DRkcJMHgxMzY0CQkvL0NDSyBQcm90ZWN0aW9uCi0jZGVmaW5lIEFTSUNfU0hPUlROQVYJCTEKLSNkZWZpbmUgQVNJQ19MT05HTkFWCQkyCi0jZGVmaW5lIEFTSUNfUlRTCQkxCi0jZGVmaW5lIEFTSUNfQ1RTCQkyCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfUFJPVF9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICByc3Y6NTsKLQkgICAgVUlOVDMyICAgICAgIFJUU1RoRW46MTsJLy9SVFMgdGhyZXNob2xkIGVuYWJsZSBvbiBDQ0sgVFgKLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0dGNDA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0dGMjA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd01NNDA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd01NMjA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuIDA6ZGlzYWxsb3cuCi0JICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dPZmRtOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCi0JICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dDY2s6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFByb3RlY3ROYXY6MjsJLy9UWE9QIHByb3RlY3Rpb24gdHlwZSBmb3IgQ0NLIFRYLiAwOk5vbmUsIDE6U2hvcnROQVZwcm90ZWN0LCAgMjpMb25nTkFWUHJvdGVjdCwgMzpyc3YKLQkgICAgVUlOVDMyICAgICAgIFByb3RlY3RDdHJsOjI7CS8vUHJvdGVjdGlvbiBjb250cm9sIGZyYW1lIHR5cGUgZm9yIENDSyBUWC4gMTpSVFMvQ1RTLCAyOkNUUy10by1zZWxmLCAwOk5vbmUsIDM6cnN2Ci0JICAgIFVJTlQzMiAgICAgICBQcm90ZWN0UmF0ZToxNjsJLy9Qcm90ZWN0aW9uIGNvbnRyb2wgZnJhbWUgcmF0ZSBmb3IgQ0NLIFRYKFJUUy9DVFMvQ0ZFbmQpLgotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUFJPVF9DRkdfU1RSVUMsICpQUFJPVF9DRkdfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfUFJPVF9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICBQcm90ZWN0UmF0ZToxNjsJLy9Qcm90ZWN0aW9uIGNvbnRyb2wgZnJhbWUgcmF0ZSBmb3IgQ0NLIFRYKFJUUy9DVFMvQ0ZFbmQpLgotCSAgICBVSU5UMzIgICAgICAgUHJvdGVjdEN0cmw6MjsJLy9Qcm90ZWN0aW9uIGNvbnRyb2wgZnJhbWUgdHlwZSBmb3IgQ0NLIFRYLiAxOlJUUy9DVFMsIDI6Q1RTLXRvLXNlbGYsIDA6Tm9uZSwgMzpyc3YKLQkgICAgVUlOVDMyICAgICAgIFByb3RlY3ROYXY6MjsJLy9UWE9QIHByb3RlY3Rpb24gdHlwZSBmb3IgQ0NLIFRYLiAwOk5vbmUsIDE6U2hvcnROQVZwcm90ZWN0LCAgMjpMb25nTkFWUHJvdGVjdCwgMzpyc3YKLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0NjazoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgotCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93T2ZkbToxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgotCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93TU0yMDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4gMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd01NNDA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0dGMjA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0dGNDA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFJUU1RoRW46MTsJLy9SVFMgdGhyZXNob2xkIGVuYWJsZSBvbiBDQ0sgVFgKLQkgICAgVUlOVDMyICAgICAgIHJzdjo1OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUFJPVF9DRkdfU1RSVUMsICpQUFJPVF9DRkdfU1RSVUM7Ci0jZW5kaWYKLQotI2RlZmluZSBPRkRNX1BST1RfQ0ZHCTB4MTM2OAkJLy9PRkRNIFByb3RlY3Rpb24KLSNkZWZpbmUgTU0yMF9QUk9UX0NGRwkweDEzNkMJCS8vTU0yMCBQcm90ZWN0aW9uCi0jZGVmaW5lIE1NNDBfUFJPVF9DRkcJMHgxMzcwCQkvL01NNDAgUHJvdGVjdGlvbgotI2RlZmluZSBHRjIwX1BST1RfQ0ZHCTB4MTM3NAkJLy9HRjIwIFByb3RlY3Rpb24KLSNkZWZpbmUgR0Y0MF9QUk9UX0NGRwkweDEzNzgJCS8vR1I0MCBQcm90ZWN0aW9uCi0jZGVmaW5lIEVYUF9DVFNfVElNRQkweDEzN0MJCS8vCi0jZGVmaW5lIEVYUF9BQ0tfVElNRQkweDEzODAJCS8vCi0KLS8vCi0vLyAgNC40IE1BQyBSWCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTQwMCkKLS8vCi0jZGVmaW5lIFJYX0ZJTFRSX0NGRwkweDE0MDAJCQkvL1RYUlhfQ1NSMAotI2RlZmluZSBBVVRPX1JTUF9DRkcJMHgxNDA0CQkJLy9UWFJYX0NTUjQKLS8vCi0vLyBUWFJYX0NTUjQ6IEF1dG8tUmVzcG9uZGVyLwotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmIHVuaW9uIF9BVVRPX1JTUF9DRkdfU1RSVUMgewotIHN0cnVjdCB7Ci0gICAgIFVJTlQzMiAgICAgICAgOjI0OwotICAgICBVSU5UMzIgICAgICAgQWNrQ3RzUHNtQml0OjE7ICAgLy8gUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lCi0gICAgIFVJTlQzMiAgICAgICBEdWFsQ1RTRW46MTsgICAvLyBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUKLSAgICAgVUlOVDMyICAgICAgIHJzdjoxOyAgIC8vIFBvd2VyIGJpdCB2YWx1ZSBpbiBjb25ydHJvbCBmcmFtZQotICAgICBVSU5UMzIgICAgICAgQXV0b1Jlc3BvbmRlclByZWFtYmxlOjE7ICAgIC8vIDA6bG9uZywgMTpzaG9ydCBwcmVhbWJsZQotICAgICBVSU5UMzIgICAgICAgQ1RTNDBNUmVmOjE7ICAvLyBSZXNwb25zZSBDVFMgNDBNSHogZHVwbGljYXRlIG1vZGUKLSAgICAgVUlOVDMyICAgICAgIENUUzQwTU1vZGU6MTsgIC8vIFJlc3BvbnNlIENUUyA0ME1IeiBkdXBsaWNhdGUgbW9kZQotICAgICBVSU5UMzIgICAgICAgQkFDQWNrUG9saWN5RW5hYmxlOjE7ICAgIC8vIDA6bG9uZywgMTpzaG9ydCBwcmVhbWJsZQotICAgICBVSU5UMzIgICAgICAgQXV0b1Jlc3BvbmRlckVuYWJsZToxOwotIH0gZmllbGQ7Ci0gVUlOVDMyICAgd29yZDsKLX0gQVVUT19SU1BfQ0ZHX1NUUlVDLCAqUEFVVE9fUlNQX0NGR19TVFJVQzsKLSNlbHNlCi10eXBlZGVmIHVuaW9uIF9BVVRPX1JTUF9DRkdfU1RSVUMgewotIHN0cnVjdCB7Ci0gICAgIFVJTlQzMiAgICAgICBBdXRvUmVzcG9uZGVyRW5hYmxlOjE7Ci0gICAgIFVJTlQzMiAgICAgICBCQUNBY2tQb2xpY3lFbmFibGU6MTsgICAgLy8gMDpsb25nLCAxOnNob3J0IHByZWFtYmxlCi0gICAgIFVJTlQzMiAgICAgICBDVFM0ME1Nb2RlOjE7ICAvLyBSZXNwb25zZSBDVFMgNDBNSHogZHVwbGljYXRlIG1vZGUKLSAgICAgVUlOVDMyICAgICAgIENUUzQwTVJlZjoxOyAgLy8gUmVzcG9uc2UgQ1RTIDQwTUh6IGR1cGxpY2F0ZSBtb2RlCi0gICAgIFVJTlQzMiAgICAgICBBdXRvUmVzcG9uZGVyUHJlYW1ibGU6MTsgICAgLy8gMDpsb25nLCAxOnNob3J0IHByZWFtYmxlCi0gICAgIFVJTlQzMiAgICAgICByc3Y6MTsgICAvLyBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUKLSAgICAgVUlOVDMyICAgICAgIER1YWxDVFNFbjoxOyAgIC8vIFBvd2VyIGJpdCB2YWx1ZSBpbiBjb25ydHJvbCBmcmFtZQotICAgICBVSU5UMzIgICAgICAgQWNrQ3RzUHNtQml0OjE7ICAgLy8gUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lCi0gICAgIFVJTlQzMiAgICAgICAgOjI0OwotIH0gZmllbGQ7Ci0gVUlOVDMyICAgd29yZDsKLX0gQVVUT19SU1BfQ0ZHX1NUUlVDLCAqUEFVVE9fUlNQX0NGR19TVFJVQzsKLSNlbmRpZgotCi0jZGVmaW5lIExFR0FDWV9CQVNJQ19SQVRFCTB4MTQwOAkvLyAgVFhSWF9DU1I1ICAgICAgICAgICAweDMwNTQKLSNkZWZpbmUgSFRfQkFTSUNfUkFURQkJMHgxNDBjCi0jZGVmaW5lIEhUX0NUUkxfQ0ZHCQkweDE0MTAKLSNkZWZpbmUgU0lGU19DT1NUX0NGRwkJMHgxNDE0Ci0jZGVmaW5lIFJYX1BBUlNFUl9DRkcJCTB4MTQxOAkvL1NldCBOQVYgZm9yIGFsbCByZWNlaXZlZCBmcmFtZXMKLQotLy8KLS8vICA0LjUgTUFDIFNlY3VyaXR5IGNvbmZpZ3VyYXRpb24gKG9mZnNldDoweDE1MDApCi0vLwotI2RlZmluZSBUWF9TRUNfQ05UMAkJMHgxNTAwCQkvLwotI2RlZmluZSBSWF9TRUNfQ05UMAkJMHgxNTA0CQkvLwotI2RlZmluZSBDQ01QX0ZDX01VVEUJCTB4MTUwOAkJLy8KLS8vCi0vLyAgNC42IEhDQ0EvUFNNUCAob2Zmc2V0OjB4MTYwMCkKLS8vCi0jZGVmaW5lIFRYT1BfSExEUl9BRERSMAkJMHgxNjAwCi0jZGVmaW5lIFRYT1BfSExEUl9BRERSMQkJMHgxNjA0Ci0jZGVmaW5lIFRYT1BfSExEUl9FVAkJMHgxNjA4Ci0jZGVmaW5lIFFPU19DRlBPTExfUkFfRFcwCQkweDE2MGMKLSNkZWZpbmUgUU9TX0NGUE9MTF9BMV9EVzEJCTB4MTYxMAotI2RlZmluZSBRT1NfQ0ZQT0xMX1FDCQkweDE2MTQKLS8vCi0vLyAgNC43IE1BQyBTdGF0aXN0aXMgcmVnaXN0ZXJzIChvZmZzZXQ6MHgxNzAwKQotLy8KLSNkZWZpbmUgUlhfU1RBX0NOVDAJCTB4MTcwMAkJLy8KLSNkZWZpbmUgUlhfU1RBX0NOVDEJCTB4MTcwNAkJLy8KLSNkZWZpbmUgUlhfU1RBX0NOVDIJCTB4MTcwOAkJLy8KLQotLy8KLS8vIFJYX1NUQV9DTlQwX1NUUlVDOiBSWCBQTENQIGVycm9yIGNvdW50ICYgUlggQ1JDIGVycm9yIGNvdW50Ci0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIFBoeUVycjsKLQkgICAgVVNIT1JUICBDcmNFcnI7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlSWF9TVEFfQ05UMF9TVFJVQywgKlBSWF9TVEFfQ05UMF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBDcmNFcnI7Ci0JICAgIFVTSE9SVCAgUGh5RXJyOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUlhfU1RBX0NOVDBfU1RSVUMsICpQUlhfU1RBX0NOVDBfU1RSVUM7Ci0jZW5kaWYKLQotLy8KLS8vIFJYX1NUQV9DTlQxX1NUUlVDOiBSWCBGYWxzZSBDQ0EgY291bnQgJiBSWCBMT05HIGZyYW1lIGNvdW50Ci0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIFBsY3BFcnI7Ci0JICAgIFVTSE9SVCAgRmFsc2VDY2E7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlSWF9TVEFfQ05UMV9TVFJVQywgKlBSWF9TVEFfQ05UMV9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBGYWxzZUNjYTsKLQkgICAgVVNIT1JUICBQbGNwRXJyOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUlhfU1RBX0NOVDFfU1RSVUMsICpQUlhfU1RBX0NOVDFfU1RSVUM7Ci0jZW5kaWYKLQotLy8KLS8vIFJYX1NUQV9DTlQyX1NUUlVDOgotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBSeEZpZm9PdmVyZmxvd0NvdW50OwotCSAgICBVU0hPUlQgIFJ4RHVwbGlDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVJYX1NUQV9DTlQyX1NUUlVDLCAqUFJYX1NUQV9DTlQyX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQyX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIFJ4RHVwbGlDb3VudDsKLQkgICAgVVNIT1JUICBSeEZpZm9PdmVyZmxvd0NvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUlhfU1RBX0NOVDJfU1RSVUMsICpQUlhfU1RBX0NOVDJfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgVFhfU1RBX0NOVDAJCTB4MTcwQwkJLy8KLS8vCi0vLyBTVEFfQ1NSMzogVFggQmVhY29uIGNvdW50Ci0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1RYX1NUQV9DTlQwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIFR4QmVhY29uQ291bnQ7Ci0JICAgIFVTSE9SVCAgVHhGYWlsQ291bnQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9TVEFfQ05UMF9TVFJVQywgKlBUWF9TVEFfQ05UMF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9UWF9TVEFfQ05UMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBUeEZhaWxDb3VudDsKLQkgICAgVVNIT1JUICBUeEJlYWNvbkNvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfU1RBX0NOVDBfU1RSVUMsICpQVFhfU1RBX0NOVDBfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgVFhfU1RBX0NOVDEJCTB4MTcxMAkJLy8KLS8vCi0vLyBUWF9TVEFfQ05UMTogVFggdHggY291bnQKLS8vCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDFfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgVHhSZXRyYW5zbWl0OwotCSAgICBVU0hPUlQgIFR4U3VjY2VzczsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX1NUQV9DTlQxX1NUUlVDLCAqUFRYX1NUQV9DTlQxX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1RYX1NUQV9DTlQxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIFR4U3VjY2VzczsKLQkgICAgVVNIT1JUICBUeFJldHJhbnNtaXQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9TVEFfQ05UMV9TVFJVQywgKlBUWF9TVEFfQ05UMV9TVFJVQzsKLSNlbmRpZgotI2RlZmluZSBUWF9TVEFfQ05UMgkJMHgxNzE0CQkvLwotLy8KLS8vIFRYX1NUQV9DTlQyOiBUWCB0eCBjb3VudAotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9UWF9TVEFfQ05UMl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBUeFVuZGVyRmxvd0NvdW50OwotCSAgICBVU0hPUlQgIFR4WmVyb0xlbkNvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfU1RBX0NOVDJfU1RSVUMsICpQVFhfU1RBX0NOVDJfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDJfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgVHhaZXJvTGVuQ291bnQ7Ci0JICAgIFVTSE9SVCAgVHhVbmRlckZsb3dDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX1NUQV9DTlQyX1NUUlVDLCAqUFRYX1NUQV9DTlQyX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIFRYX1NUQV9GSUZPCQkweDE3MTgJCS8vCi0vLwotLy8gVFhfU1RBX0ZJRk9fU1RSVUM6IFRYIFJlc3VsdCBmb3Igc3BlY2lmaWMgUElEIHN0YXR1cyBmaWZvIHJlZ2lzdGVyCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24gUEFDS0VEIF9UWF9TVEFfRklGT19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSZXNlcnZlOjI7Ci0JCVVJTlQzMgkJVHhCRjoxOyAvLyAzKjMKLQkJVUlOVDMyCQlTdWNjZXNzUmF0ZToxMzsJLy9pbmNsdWRlIE1DUywgbW9kZSAsc2hvcnRHSSwgQlcgc2V0dGluZ1NhbWUgZm9ybWF0IGFzIFRYV0kgV29yZCAwIEJpdCAzMS0xNi4KLS8vCQlVSU5UMzIJCVN1Y2Nlc3NSYXRlOjE2OwkvL2luY2x1ZGUgTUNTLCBtb2RlICxzaG9ydEdJLCBCVyBzZXR0aW5nU2FtZSBmb3JtYXQgYXMgVFhXSSBXb3JkIDAgQml0IDMxLTE2LgotCQlVSU5UMzIJCXdjaWQ6ODsJCS8vd2lyZWxlc3MgY2xpZW50IGluZGV4Ci0JCVVJTlQzMgkJVHhBY2tSZXF1aXJlZDoxOyAgICAvLyBhY2sgcmVxdWlyZWQKLQkJVUlOVDMyCQlUeEFnZ3JlOjE7ICAgIC8vIFR4IGlzIGFnZ3JlZ2F0ZWQKLQkJVUlOVDMyCQlUeFN1Y2Nlc3M6MTsgICAvLyBUeCBzdWNjZXNzLiB3aGV0aGVyIHN1Y2Nlc3Mgb3Igbm90Ci0JCVVJTlQzMgkJUGlkVHlwZTo0OwotCQlVSU5UMzIJCWJWYWxpZDoxOyAgIC8vIDE6VGhpcyByZWdpc3RlciBjb250YWlucyBhIHZhbGlkIFRYIHJlc3VsdAotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfU1RBX0ZJRk9fU1RSVUMsICpQVFhfU1RBX0ZJRk9fU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbiBQQUNLRUQgX1RYX1NUQV9GSUZPX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCWJWYWxpZDoxOyAgIC8vIDE6VGhpcyByZWdpc3RlciBjb250YWlucyBhIHZhbGlkIFRYIHJlc3VsdAotCQlVSU5UMzIJCVBpZFR5cGU6NDsKLQkJVUlOVDMyCQlUeFN1Y2Nlc3M6MTsgICAvLyBUeCBObyByZXRyeSBzdWNjZXNzCi0JCVVJTlQzMgkJVHhBZ2dyZToxOyAgICAvLyBUeCBSZXRyeSBTdWNjZXNzCi0JCVVJTlQzMgkJVHhBY2tSZXF1aXJlZDoxOyAgICAvLyBUeCBmYWlsCi0JCVVJTlQzMgkJd2NpZDo4OwkJLy93aXJlbGVzcyBjbGllbnQgaW5kZXgKLS8vCQlVSU5UMzIJCVN1Y2Nlc3NSYXRlOjE2OwkvL2luY2x1ZGUgTUNTLCBtb2RlICxzaG9ydEdJLCBCVyBzZXR0aW5nU2FtZSBmb3JtYXQgYXMgVFhXSSBXb3JkIDAgQml0IDMxLTE2LgotCQlVSU5UMzIJCVN1Y2Nlc3NSYXRlOjEzOwkvL2luY2x1ZGUgTUNTLCBtb2RlICxzaG9ydEdJLCBCVyBzZXR0aW5nU2FtZSBmb3JtYXQgYXMgVFhXSSBXb3JkIDAgQml0IDMxLTE2LgotCQlVSU5UMzIJCVR4QkY6MTsKLQkJVUlOVDMyCQlSZXNlcnZlOjI7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9TVEFfRklGT19TVFJVQywgKlBUWF9TVEFfRklGT19TVFJVQzsKLSNlbmRpZgotLy8gRGVidWcgY291bnRlcgotI2RlZmluZSBUWF9BR0dfQ05UCTB4MTcxYwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlRfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQWdnVHhDb3VudDsKLQkgICAgVVNIT1JUICBOb25BZ2dUeENvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfQUdHX0NOVF9TVFJVQywgKlBUWF9BR0dfQ05UX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlRfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgTm9uQWdnVHhDb3VudDsKLQkgICAgVVNIT1JUICBBZ2dUeENvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfQUdHX0NOVF9TVFJVQywgKlBUWF9BR0dfQ05UX1NUUlVDOwotI2VuZGlmCi0vLyBEZWJ1ZyBjb3VudGVyCi0jZGVmaW5lIFRYX0FHR19DTlQwCTB4MTcyMAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemUyQ291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTFDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQwX1NUUlVDLCAqUFRYX0FHR19DTlQwX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemUxQ291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTJDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQwX1NUUlVDLCAqUFRYX0FHR19DTlQwX1NUUlVDOwotI2VuZGlmCi0vLyBEZWJ1ZyBjb3VudGVyCi0jZGVmaW5lIFRYX0FHR19DTlQxCTB4MTcyNAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemU0Q291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTNDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQxX1NUUlVDLCAqUFRYX0FHR19DTlQxX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemUzQ291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTRDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQxX1NUUlVDLCAqUFRYX0FHR19DTlQxX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIFRYX0FHR19DTlQyCTB4MTcyOAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQyX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemU2Q291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTVDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQyX1NUUlVDLCAqUFRYX0FHR19DTlQyX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQyX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemU1Q291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTZDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQyX1NUUlVDLCAqUFRYX0FHR19DTlQyX1NUUlVDOwotI2VuZGlmCi0vLyBEZWJ1ZyBjb3VudGVyCi0jZGVmaW5lIFRYX0FHR19DTlQzCTB4MTcyYwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQzX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemU4Q291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTdDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQzX1NUUlVDLCAqUFRYX0FHR19DTlQzX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQzX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemU3Q291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZThDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQzX1NUUlVDLCAqUFRYX0FHR19DTlQzX1NUUlVDOwotI2VuZGlmCi0vLyBEZWJ1ZyBjb3VudGVyCi0jZGVmaW5lIFRYX0FHR19DTlQ0CTB4MTczMAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ0X1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemUxMENvdW50OwotCSAgICBVU0hPUlQgIEFnZ1NpemU5Q291bnQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9BR0dfQ05UNF9TVFJVQywgKlBUWF9BR0dfQ05UNF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UNF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBBZ2dTaXplOUNvdW50OwotCSAgICBVU0hPUlQgIEFnZ1NpemUxMENvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfQUdHX0NOVDRfU1RSVUMsICpQVFhfQUdHX0NOVDRfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgVFhfQUdHX0NOVDUJMHgxNzM0Ci0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDVfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTEyQ291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTExQ291bnQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9BR0dfQ05UNV9TVFJVQywgKlBUWF9BR0dfQ05UNV9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UNV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBBZ2dTaXplMTFDb3VudDsKLQkgICAgVVNIT1JUICBBZ2dTaXplMTJDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQ1X1NUUlVDLCAqUFRYX0FHR19DTlQ1X1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIFRYX0FHR19DTlQ2CQkweDE3MzgKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UNl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBBZ2dTaXplMTRDb3VudDsKLQkgICAgVVNIT1JUICBBZ2dTaXplMTNDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQ2X1NUUlVDLCAqUFRYX0FHR19DTlQ2X1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ2X1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemUxM0NvdW50OwotCSAgICBVU0hPUlQgIEFnZ1NpemUxNENvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfQUdHX0NOVDZfU1RSVUMsICpQVFhfQUdHX0NOVDZfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgVFhfQUdHX0NOVDcJCTB4MTczYwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ3X1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemUxNkNvdW50OwotCSAgICBVU0hPUlQgIEFnZ1NpemUxNUNvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfQUdHX0NOVDdfU1RSVUMsICpQVFhfQUdHX0NOVDdfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTE1Q291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTE2Q291bnQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9BR0dfQ05UN19TVFJVQywgKlBUWF9BR0dfQ05UN19TVFJVQzsKLSNlbmRpZgotI2RlZmluZSBNUERVX0RFTlNJVFlfQ05UCQkweDE3NDAKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9NUERVX0RFTl9DTlRfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgUlhaZXJvRGVsQ291bnQ7CS8vUlggemVybyBsZW5ndGggZGVsaW1pdGVyIGNvdW50Ci0JICAgIFVTSE9SVCAgVFhaZXJvRGVsQ291bnQ7CS8vVFggemVybyBsZW5ndGggZGVsaW1pdGVyIGNvdW50Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlNUERVX0RFTl9DTlRfU1RSVUMsICpQTVBEVV9ERU5fQ05UX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX01QRFVfREVOX0NOVF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBUWFplcm9EZWxDb3VudDsJLy9UWCB6ZXJvIGxlbmd0aCBkZWxpbWl0ZXIgY291bnQKLQkgICAgVVNIT1JUICBSWFplcm9EZWxDb3VudDsJLy9SWCB6ZXJvIGxlbmd0aCBkZWxpbWl0ZXIgY291bnQKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CU1QRFVfREVOX0NOVF9TVFJVQywgKlBNUERVX0RFTl9DTlRfU1RSVUM7Ci0jZW5kaWYKLS8vCi0vLyBUWFJYIGNvbnRyb2wgcmVnaXN0ZXJzIC0gYmFzZSBhZGRyZXNzIDB4MzAwMAotLy8KLS8vIHJ0Mjg2MGIgIFVOS05PV04gcmVnIHVzZSBSL08gUmVnIEFkZHIgMHg3N2QwIGZpcnN0Li4KLSNkZWZpbmUgVFhSWF9DU1IxICAgICAgICAgICAweDc3ZDAKLQotLy8KLS8vIFNlY3VyaXR5IGtleSB0YWJsZSBtZW1vcnksIGJhc2UgYWRkcmVzcyA9IDB4MTAwMAotLy8KLSNkZWZpbmUgTUFDX1dDSURfQkFTRQkJMHgxODAwIC8vOC1ieXRlcyh1c2Ugb25seSA2LWJ5dGVzKSAqIDI1NiBlbnRyeSA9Ci0jZGVmaW5lIEhXX1dDSURfRU5UUllfU0laRSAgIDgKLSNkZWZpbmUgUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UgICAgIDB4NDAwMCAgICAgIC8vIDMyLWJ5dGUgKiAyNTYtZW50cnkgPSAgLWJ5dGUKLSNkZWZpbmUgSFdfS0VZX0VOVFJZX1NJWkUgICAgICAgICAgIDB4MjAKLSNkZWZpbmUgUEFJUldJU0VfSVZFSVZfVEFCTEVfQkFTRSAgICAgMHg2MDAwICAgICAgLy8gOC1ieXRlICogMjU2LWVudHJ5ID0gIC1ieXRlCi0jZGVmaW5lIE1BQ19JVkVJVl9UQUJMRV9CQVNFICAgICAweDYwMDAgICAgICAvLyA4LWJ5dGUgKiAyNTYtZW50cnkgPSAgLWJ5dGUKLSNkZWZpbmUgSFdfSVZFSVZfRU5UUllfU0laRSAgIDgKLSNkZWZpbmUgTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgICAgIDB4NjgwMCAgICAgIC8vIDQtYnl0ZSAqIDI1Ni1lbnRyeSA9ICAtYnl0ZQotI2RlZmluZSBIV19XQ0lEX0FUVFJJX1NJWkUgICA0Ci0jZGVmaW5lIFdDSURfUkVTRVJWRUQJCQkweDZiZmMKLSNkZWZpbmUgU0hBUkVEX0tFWV9UQUJMRV9CQVNFICAgICAgIDB4NmMwMCAgICAgIC8vIDMyLWJ5dGUgKiAxNi1lbnRyeSA9IDUxMi1ieXRlCi0jZGVmaW5lIFNIQVJFRF9LRVlfTU9ERV9CQVNFICAgICAgIDB4NzAwMCAgICAgIC8vIDMyLWJ5dGUgKiAxNi1lbnRyeSA9IDUxMi1ieXRlCi0jZGVmaW5lIEhXX1NIQVJFRF9LRVlfTU9ERV9TSVpFICAgNAotI2RlZmluZSBTSEFSRURLRVlUQUJMRQkJCTAKLSNkZWZpbmUgUEFJUldJU0VLRVlUQUJMRQkJCTEKLQotCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfU0hBUkVES0VZX01PREVfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkzQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkyQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkxQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkwQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkzQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkyQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkxQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkwQ2lwaGVyQWxnOjM7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlTSEFSRURLRVlfTU9ERV9TVFJVQywgKlBTSEFSRURLRVlfTU9ERV9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9TSEFSRURLRVlfTU9ERV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkwQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkxQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkyQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkzQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkwQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkxQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkyQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkzQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVNIQVJFREtFWV9NT0RFX1NUUlVDLCAqUFNIQVJFREtFWV9NT0RFX1NUUlVDOwotI2VuZGlmCi0vLyA2NC1lbnRyeSBmb3IgcGFpcndpc2Uga2V5IHRhYmxlCi10eXBlZGVmIHN0cnVjdCBfSFdfV0NJRF9FTlRSWSB7ICAvLyA4LWJ5dGUgcGVyIGVudHJ5Ci0gICAgVUNIQVIgICBBZGRyZXNzWzZdOwotICAgIFVDSEFSICAgUnN2WzJdOwotfSBIV19XQ0lEX0VOVFJZLCBQSFdfV0NJRF9FTlRSWTsKLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFdDSUQgIGZvcm1hdAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLzcuMQlXQ0lEICBFTlRSWSAgZm9ybWF0ICA6IDhieXRlcwotdHlwZWRlZglzdHJ1Y3QJX1dDSURfRU5UUllfU1RSVUMgewotCVVDSEFSCQlSWEJBQml0bWFwNzsgICAgLy8gYml0MCBmb3IgVElEOCwgYml0NyBmb3IgVElEIDE1Ci0JVUNIQVIJCVJYQkFCaXRtYXAwOyAgICAvLyBiaXQwIGZvciBUSUQwLCBiaXQ3IGZvciBUSUQgNwotCVVDSEFSCQlNQUNbNl07CS8vIDAgZm9yIHNoYXJlZCBrZXkgdGFibGUuICAxIGZvciBwYWlyd2lzZSBrZXkgdGFibGUKLX0JV0NJRF9FTlRSWV9TVFJVQywgKlBXQ0lEX0VOVFJZX1NUUlVDOwotCi0vLzguMS4xCVNFQ1VSSVRZICBLRVkgIGZvcm1hdCAgOiA4RFcKLS8vIDMyLWJ5dGUgcGVyIGVudHJ5LCB0b3RhbCAxNi1lbnRyeSBmb3Igc2hhcmVkIGtleSB0YWJsZSwgNjQtZW50cnkgZm9yIHBhaXJ3aXNlIGtleSB0YWJsZQotdHlwZWRlZiBzdHJ1Y3QgX0hXX0tFWV9FTlRSWSB7ICAgICAgICAgIC8vIDMyLWJ5dGUgcGVyIGVudHJ5Ci0gICAgVUNIQVIgICBLZXlbMTZdOwotICAgIFVDSEFSICAgVHhNaWNbOF07Ci0gICAgVUNIQVIgICBSeE1pY1s4XTsKLX0gSFdfS0VZX0VOVFJZLCAqUEhXX0tFWV9FTlRSWTsKLQotLy84LjEuMglJVi9FSVYgIGZvcm1hdCAgOiAyRFcKLQotLy84LjEuMwlSWCBhdHRyaWJ1dGUgZW50cnkgZm9ybWF0ICA6IDFEVwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJc3RydWN0CV9NQUNfQVRUUklCVVRFX1NUUlVDIHsKLQlVSU5UMzIJCXJzdjoyMjsKLQlVSU5UMzIJCVJYV0lVREY6MzsKLQlVSU5UMzIJCUJTU0lESWR4OjM7IC8vbXVsdGlwbGVCU1MgaW5kZXggZm9yIHRoZSBXQ0lECi0JVUlOVDMyCQlQYWlyS2V5TW9kZTozOwotCVVJTlQzMgkJS2V5VGFiOjE7CS8vIDAgZm9yIHNoYXJlZCBrZXkgdGFibGUuICAxIGZvciBwYWlyd2lzZSBrZXkgdGFibGUKLX0JTUFDX0FUVFJJQlVURV9TVFJVQywgKlBNQUNfQVRUUklCVVRFX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJc3RydWN0CV9NQUNfQVRUUklCVVRFX1NUUlVDIHsKLQlVSU5UMzIJCUtleVRhYjoxOwkvLyAwIGZvciBzaGFyZWQga2V5IHRhYmxlLiAgMSBmb3IgcGFpcndpc2Uga2V5IHRhYmxlCi0JVUlOVDMyCQlQYWlyS2V5TW9kZTozOwotCVVJTlQzMgkJQlNTSURJZHg6MzsgLy9tdWx0aXBsZUJTUyBpbmRleCBmb3IgdGhlIFdDSUQKLQlVSU5UMzIJCVJYV0lVREY6MzsKLQlVSU5UMzIJCXJzdjoyMjsKLX0JTUFDX0FUVFJJQlVURV9TVFJVQywgKlBNQUNfQVRUUklCVVRFX1NUUlVDOwotI2VuZGlmCi0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBIT1NULU1DVSBjb21tdW5pY2F0aW9uIGRhdGEgc3RydWN0dXJlCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLy8KLS8vIEgyTV9NQUlMQk9YX0NTUjogSG9zdC10by1NQ1UgTWFpbGJveAotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmIHVuaW9uICBfSDJNX01BSUxCT1hfU1RSVUMgewotICAgIHN0cnVjdCB7Ci0gICAgICAgIFVJTlQzMiAgICAgICBPd25lcjo4OwotICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW46ODsgICAgLy8gMHhmZiB0ZWxscyBNQ1Ugbm90IHRvIHJlcG9ydCBDbWREb25lSW50IGFmdGVyIGV4Y3V0aW5nIHRoZSBjb21tYW5kCi0gICAgICAgIFVJTlQzMiAgICAgICBIaWdoQnl0ZTo4OwotICAgICAgICBVSU5UMzIgICAgICAgTG93Qnl0ZTo4OwotICAgIH0gICBmaWVsZDsKLSAgICBVSU5UMzIgICAgICAgICAgIHdvcmQ7Ci19IEgyTV9NQUlMQk9YX1NUUlVDLCAqUEgyTV9NQUlMQk9YX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYgdW5pb24gIF9IMk1fTUFJTEJPWF9TVFJVQyB7Ci0gICAgc3RydWN0IHsKLSAgICAgICAgVUlOVDMyICAgICAgIExvd0J5dGU6ODsKLSAgICAgICAgVUlOVDMyICAgICAgIEhpZ2hCeXRlOjg7Ci0gICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjo4OwotICAgICAgICBVSU5UMzIgICAgICAgT3duZXI6ODsKLSAgICB9ICAgZmllbGQ7Ci0gICAgVUlOVDMyICAgICAgICAgICB3b3JkOwotfSBIMk1fTUFJTEJPWF9TVFJVQywgKlBIMk1fTUFJTEJPWF9TVFJVQzsKLSNlbmRpZgotCi0vLwotLy8gTTJIX0NNRF9ET05FX0NTUjogTUNVLXRvLUhvc3QgY29tbWFuZCBjb21wbGV0ZSBpbmRpY2F0aW9uCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYgdW5pb24gX00ySF9DTURfRE9ORV9TVFJVQyB7Ci0gICAgc3RydWN0ICB7Ci0gICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjM7Ci0gICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjI7Ci0gICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjE7Ci0gICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjA7Ci0gICAgfSBmaWVsZDsKLSAgICBVSU5UMzIgICAgICAgICAgIHdvcmQ7Ci19IE0ySF9DTURfRE9ORV9TVFJVQywgKlBNMkhfQ01EX0RPTkVfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZiB1bmlvbiBfTTJIX0NNRF9ET05FX1NUUlVDIHsKLSAgICBzdHJ1Y3QgIHsKLSAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMDsKLSAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMTsKLSAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMjsKLSAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMzsKLSAgICB9IGZpZWxkOwotICAgIFVJTlQzMiAgICAgICAgICAgd29yZDsKLX0gTTJIX0NNRF9ET05FX1NUUlVDLCAqUE0ySF9DTURfRE9ORV9TVFJVQzsKLSNlbmRpZgotCi0KLS8vTkFWX1RJTUVfQ0ZHIDpOQVYKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9OQVZfVElNRV9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVTSE9SVAkJcnN2OjY7Ci0JCVVTSE9SVAkJWmVyb1NpZnM6MTsgICAgICAgICAgICAgICAvLyBBcHBsaWVkIHplcm8gU0lGUyB0aW1lciBhZnRlciBPRkRNIFJYIDA6IGRpc2FibGUKLQkJVVNIT1JUCQlFaWZzOjk7ICAgICAgICAgICAgICAgLy8gaW4gdW5pdCBvZiAxLXVzCi0JCVVDSEFSICAgICAgIFNsb3RUaW1lOyAgICAvLyBpbiB1bml0IG9mIDEtdXMKLQkJVUNIQVIJCVNpZnM7ICAgICAgICAgICAgICAgLy8gaW4gdW5pdCBvZiAxLXVzCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlOQVZfVElNRV9DRkdfU1RSVUMsICpQTkFWX1RJTUVfQ0ZHX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX05BVl9USU1FX0NGR19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUNIQVIJCVNpZnM7ICAgICAgICAgICAgICAgLy8gaW4gdW5pdCBvZiAxLXVzCi0JCVVDSEFSICAgICAgIFNsb3RUaW1lOyAgICAvLyBpbiB1bml0IG9mIDEtdXMKLQkJVVNIT1JUCQlFaWZzOjk7ICAgICAgICAgICAgICAgLy8gaW4gdW5pdCBvZiAxLXVzCi0JCVVTSE9SVAkJWmVyb1NpZnM6MTsgICAgICAgICAgICAgICAvLyBBcHBsaWVkIHplcm8gU0lGUyB0aW1lciBhZnRlciBPRkRNIFJYIDA6IGRpc2FibGUKLQkJVVNIT1JUCQlyc3Y6NjsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CU5BVl9USU1FX0NGR19TVFJVQywgKlBOQVZfVElNRV9DRkdfU1RSVUM7Ci0jZW5kaWYKLQotCi0vLwotLy8gUlhfRklMVFJfQ0ZHOiAgL1JYIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKLS8vCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglSWF9GSUxUUl9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJOjE1OwotCQlVSU5UMzIgICAgICAgRHJvcFJzdkNudGxUeXBlOjE7Ci0KLQkJVUlOVDMyCQlEcm9wQkFSOjE7ICAgICAgIC8vCi0JCVVJTlQzMgkJRHJvcEJBOjE7CQkvLwotCQlVSU5UMzIJCURyb3BQc1BvbGw6MTsJCS8vIERyb3AgUHMtUG9sbAotCQlVSU5UMzIJCURyb3BSdHM6MTsJCS8vIERyb3AgUHMtUG9sbAotCi0JCVVJTlQzMgkJRHJvcEN0czoxOwkJLy8gRHJvcCBQcy1Qb2xsCi0JCVVJTlQzMgkJRHJvcEFjazoxOwkJLy8gRHJvcCBQcy1Qb2xsCi0JCVVJTlQzMgkJRHJvcENGRW5kOjE7CQkvLyBEcm9wIFBzLVBvbGwKLQkJVUlOVDMyCQlEcm9wQ0ZFbmRBY2s6MTsJCS8vIERyb3AgUHMtUG9sbAotCi0JCVVJTlQzMgkJRHJvcER1cGxpY2F0ZToxOwkJLy8gRHJvcCBkdXBsaWNhdGUgZnJhbWUKLQkJVUlOVDMyCQlEcm9wQmNhc3Q6MTsJCS8vIERyb3AgYnJvYWRjYXN0IGZyYW1lcwotCQlVSU5UMzIJCURyb3BNY2FzdDoxOwkJLy8gRHJvcCBtdWx0aWNhc3QgZnJhbWVzCi0JCVVJTlQzMgkJRHJvcFZlckVycjoxOwkgICAgLy8gRHJvcCB2ZXJzaW9uIGVycm9yIGZyYW1lCi0KLQkJVUlOVDMyCQlEcm9wTm90TXlCU1NJRDoxOwkJCS8vIERyb3AgZnJhbSBUb0RzIGJpdCBpcyB0cnVlCi0JCVVJTlQzMgkJRHJvcE5vdFRvTWU6MTsJCS8vIERyb3Agbm90IHRvIG1lIHVuaWNhc3QgZnJhbWUKLQkJVUlOVDMyCQlEcm9wUGh5RXJyOjE7CQkvLyBEcm9wIHBoeXNpY2FsIGVycm9yCi0JCVVJTlQzMgkJRHJvcENSQ0VycjoxOwkJLy8gRHJvcCBDUkMgZXJyb3IKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVJYX0ZJTFRSX0NGR19TVFJVQywgKlBSWF9GSUxUUl9DRkdfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfUlhfRklMVFJfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCURyb3BDUkNFcnI6MTsJCS8vIERyb3AgQ1JDIGVycm9yCi0JCVVJTlQzMgkJRHJvcFBoeUVycjoxOwkJLy8gRHJvcCBwaHlzaWNhbCBlcnJvcgotCQlVSU5UMzIJCURyb3BOb3RUb01lOjE7CQkvLyBEcm9wIG5vdCB0byBtZSB1bmljYXN0IGZyYW1lCi0JCVVJTlQzMgkJRHJvcE5vdE15QlNTSUQ6MTsJCQkvLyBEcm9wIGZyYW0gVG9EcyBiaXQgaXMgdHJ1ZQotCi0JCVVJTlQzMgkJRHJvcFZlckVycjoxOwkgICAgLy8gRHJvcCB2ZXJzaW9uIGVycm9yIGZyYW1lCi0JCVVJTlQzMgkJRHJvcE1jYXN0OjE7CQkvLyBEcm9wIG11bHRpY2FzdCBmcmFtZXMKLQkJVUlOVDMyCQlEcm9wQmNhc3Q6MTsJCS8vIERyb3AgYnJvYWRjYXN0IGZyYW1lcwotCQlVSU5UMzIJCURyb3BEdXBsaWNhdGU6MTsJCS8vIERyb3AgZHVwbGljYXRlIGZyYW1lCi0KLQkJVUlOVDMyCQlEcm9wQ0ZFbmRBY2s6MTsJCS8vIERyb3AgUHMtUG9sbAotCQlVSU5UMzIJCURyb3BDRkVuZDoxOwkJLy8gRHJvcCBQcy1Qb2xsCi0JCVVJTlQzMgkJRHJvcEFjazoxOwkJLy8gRHJvcCBQcy1Qb2xsCi0JCVVJTlQzMgkJRHJvcEN0czoxOwkJLy8gRHJvcCBQcy1Qb2xsCi0KLQkJVUlOVDMyCQlEcm9wUnRzOjE7CQkvLyBEcm9wIFBzLVBvbGwKLQkJVUlOVDMyCQlEcm9wUHNQb2xsOjE7CQkvLyBEcm9wIFBzLVBvbGwKLQkJVUlOVDMyCQlEcm9wQkE6MTsJCS8vCi0JCVVJTlQzMgkJRHJvcEJBUjoxOyAgICAgICAvLwotCi0JCVVJTlQzMgkJRHJvcFJzdkNudGxUeXBlOjE7Ci0JCVVJTlQzMgkJOjE1OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUlhfRklMVFJfQ0ZHX1NUUlVDLCAqUFJYX0ZJTFRSX0NGR19TVFJVQzsKLSNlbmRpZgotCi0KLQotCi0vLwotLy8gUEhZX0NTUjQ6IFJGIHNlcmlhbCBjb250cm9sIHJlZ2lzdGVyCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1BIWV9DU1I0X1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCUJ1c3k6MTsJCQkJLy8gMTogQVNJQyBpcyBidXN5IGV4ZWN1dGUgUkYgcHJvZ3JhbW1pbmcuCi0JCVVJTlQzMgkJUExMX0xEOjE7CQkJLy8gUkYgUExMX0xEIHN0YXR1cwotCQlVSU5UMzIJCUlGU2VsZWN0OjE7CQkJLy8gMTogc2VsZWN0IElGCXRvIHByb2dyYW0sCTA6IHNlbGVjdCBSRiB0bwlwcm9ncmFtCi0JCVVJTlQzMgkJTnVtYmVyT2ZCaXRzOjU7CQkvLyBOdW1iZXIgb2YgYml0cyB1c2VkIGluIFJGUmVnVmFsdWUgKEk6MjAsCVJGTUQ6MjIpCi0JCVVJTlQzMgkJUkZSZWdWYWx1ZToyNDsJCS8vIFJlZ2lzdGVyCXZhbHVlIChpbmNsdWRlIHJlZ2lzdGVyCWlkKQlzZXJpYWwgb3V0IHRvIFJGL0lGCWNoaXAuCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlQSFlfQ1NSNF9TVFJVQywgKlBQSFlfQ1NSNF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9QSFlfQ1NSNF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSRlJlZ1ZhbHVlOjI0OwkJLy8gUmVnaXN0ZXIJdmFsdWUgKGluY2x1ZGUgcmVnaXN0ZXIJaWQpCXNlcmlhbCBvdXQgdG8gUkYvSUYJY2hpcC4KLQkJVUlOVDMyCQlOdW1iZXJPZkJpdHM6NTsJCS8vIE51bWJlciBvZiBiaXRzIHVzZWQgaW4gUkZSZWdWYWx1ZSAoSToyMCwJUkZNRDoyMikKLQkJVUlOVDMyCQlJRlNlbGVjdDoxOwkJCS8vIDE6IHNlbGVjdCBJRgl0byBwcm9ncmFtLAkwOiBzZWxlY3QgUkYgdG8JcHJvZ3JhbQotCQlVSU5UMzIJCVBMTF9MRDoxOwkJCS8vIFJGIFBMTF9MRCBzdGF0dXMKLQkJVUlOVDMyCQlCdXN5OjE7CQkJCS8vIDE6IEFTSUMgaXMgYnVzeSBleGVjdXRlIFJGIHByb2dyYW1taW5nLgotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUEhZX0NTUjRfU1RSVUMsICpQUEhZX0NTUjRfU1RSVUM7Ci0jZW5kaWYKLQotCi0vLwotLy8gU0VDX0NTUjU6IHNoYXJlZCBrZXkgdGFibGUgc2VjdXJpdHkgbW9kZSByZWdpc3RlcgotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9TRUNfQ1NSNV9TVFJVQwl7Ci0Jc3RydWN0CXsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTNDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTJDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTFDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTBDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTNDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTJDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTFDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTBDaXBoZXJBbGc6MzsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVNFQ19DU1I1X1NUUlVDLCAqUFNFQ19DU1I1X1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1NFQ19DU1I1X1NUUlVDCXsKLQlzdHJ1Y3QJewotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTBDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTFDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTJDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTNDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTBDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTFDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTJDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTNDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JU0VDX0NTUjVfU1RSVUMsICpQU0VDX0NTUjVfU1RSVUM7Ci0jZW5kaWYKLQotCi0vLwotLy8gSE9TVF9DTURfQ1NSOiBGb3IgSE9TVCB0byBpbnRlcnJ1cHQgZW1iZWRkZWQgcHJvY2Vzc29yCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0hPU1RfQ01EX0NTUl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICAgUnN2OjI0OwotCSAgICBVSU5UMzIgICBIb3N0Q29tbWFuZDo4OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JSE9TVF9DTURfQ1NSX1NUUlVDLCAqUEhPU1RfQ01EX0NTUl9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9IT1NUX0NNRF9DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgIEhvc3RDb21tYW5kOjg7Ci0JICAgIFVJTlQzMiAgIFJzdjoyNDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUhPU1RfQ01EX0NTUl9TVFJVQywgKlBIT1NUX0NNRF9DU1JfU1RSVUM7Ci0jZW5kaWYKLQotCi0vLwotLy8gQUlGU05fQ1NSOiBBSUZTTiBmb3IgZWFjaCBFRENBIEFDCi0vLwotCi0KLQotLy8KLS8vIEUyUFJPTV9DU1I6IEVFUFJPTSBjb250cm9sIHJlZ2lzdGVyCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0UyUFJPTV9DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJUnN2ZDoyNTsKLQkJVUlOVDMyICAgICAgIExvYWRTdGF0dXM6MTsgICAvLyAxOmxvYWRpbmcsIDA6ZG9uZQotCQlVSU5UMzIJCVR5cGU6MTsJCQkvLyAxOiA5M0M0NiwgMDo5M0M2NgotCQlVSU5UMzIJCUVlcHJvbURPOjE7Ci0JCVVJTlQzMgkJRWVwcm9tREk6MTsKLQkJVUlOVDMyCQlFZXByb21DUzoxOwotCQlVSU5UMzIJCUVlcHJvbVNLOjE7Ci0JCVVJTlQzMgkJUmVsb2FkOjE7CQkvLyBSZWxvYWQgRUVQUk9NIGNvbnRlbnQsIHdyaXRlIG9uZSB0byByZWxvYWQsIHNlbGYtY2xlYXJlZC4KLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUUyUFJPTV9DU1JfU1RSVUMsICpQRTJQUk9NX0NTUl9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9FMlBST01fQ1NSX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCVJlbG9hZDoxOwkJLy8gUmVsb2FkIEVFUFJPTSBjb250ZW50LCB3cml0ZSBvbmUgdG8gcmVsb2FkLCBzZWxmLWNsZWFyZWQuCi0JCVVJTlQzMgkJRWVwcm9tU0s6MTsKLQkJVUlOVDMyCQlFZXByb21DUzoxOwotCQlVSU5UMzIJCUVlcHJvbURJOjE7Ci0JCVVJTlQzMgkJRWVwcm9tRE86MTsKLQkJVUlOVDMyCQlUeXBlOjE7CQkJLy8gMTogOTNDNDYsIDA6OTNDNjYKLQkJVUlOVDMyICAgICAgIExvYWRTdGF0dXM6MTsgICAvLyAxOmxvYWRpbmcsIDA6ZG9uZQotCQlVSU5UMzIJCVJzdmQ6MjU7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlFMlBST01fQ1NSX1NUUlVDLCAqUEUyUFJPTV9DU1JfU1RSVUM7Ci0jZW5kaWYKLQotLy8KLS8vIFFPU19DU1IwOiBUWE9QIGhvbGRlciBhZGRyZXNzMCByZWdpc3RlcgotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9RT1NfQ1NSMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUNIQVIJCUJ5dGUzOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAzCi0JCVVDSEFSCQlCeXRlMjsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMgotCQlVQ0hBUgkJQnl0ZTE7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDEKLQkJVUNIQVIJCUJ5dGUwOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAwCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlRT1NfQ1NSMF9TVFJVQywgKlBRT1NfQ1NSMF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9RT1NfQ1NSMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUNIQVIJCUJ5dGUwOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAwCi0JCVVDSEFSCQlCeXRlMTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMQotCQlVQ0hBUgkJQnl0ZTI7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDIKLQkJVUNIQVIJCUJ5dGUzOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAzCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlRT1NfQ1NSMF9TVFJVQywgKlBRT1NfQ1NSMF9TVFJVQzsKLSNlbmRpZgotCi0vLwotLy8gUU9TX0NTUjE6IFRYT1AgaG9sZGVyIGFkZHJlc3MxIHJlZ2lzdGVyCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1FPU19DU1IxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVQ0hBUgkJUnN2ZDE7Ci0JCVVDSEFSCQlSc3ZkMDsKLQkJVUNIQVIJCUJ5dGU1OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA1Ci0JCVVDSEFSCQlCeXRlNDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNAotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUU9TX0NTUjFfU1RSVUMsICpQUU9TX0NTUjFfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfUU9TX0NTUjFfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVDSEFSCQlCeXRlNDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNAotCQlVQ0hBUgkJQnl0ZTU7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDUKLQkJVUNIQVIJCVJzdmQwOwotCQlVQ0hBUgkJUnN2ZDE7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlRT1NfQ1NSMV9TVFJVQywgKlBRT1NfQ1NSMV9TVFJVQzsKLSNlbmRpZgotCi0jZGVmaW5lCVJGX0NTUl9DRkcJMHg1MDAKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UCVJzdmQxOjE0OwkJCQkvLyBSZXNlcnZlZAotCQlVSU5UCVJGX0NTUl9LSUNLOjE7CQkJLy8ga2ljayBSRiByZWdpc3RlciByZWFkL3dyaXRlCi0JCVVJTlQJUkZfQ1NSX1dSOjE7CQkJLy8gMDogcmVhZCAgMTogd3JpdGUKLQkJVUlOVAlSc3ZkMjozOwkJCQkvLyBSZXNlcnZlZAotCQlVSU5UCVRFU1RDU1JfUkZBQ0NfUkVHTlVNOjU7CS8vIFJGIHJlZ2lzdGVyIElECi0JCVVJTlQJUkZfQ1NSX0RBVEE6ODsJCQkvLyBEQVRBCi0JfQlmaWVsZDsKLQlVSU5UCXdvcmQ7Ci19CVJGX0NTUl9DRkdfU1RSVUMsICpQUkZfQ1NSX0NGR19TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UCVJGX0NTUl9EQVRBOjg7CQkJLy8gREFUQQotCQlVSU5UCVRFU1RDU1JfUkZBQ0NfUkVHTlVNOjU7CS8vIFJGIHJlZ2lzdGVyIElECi0JCVVJTlQJUnN2ZDI6MzsJCQkJLy8gUmVzZXJ2ZWQKLQkJVUlOVAlSRl9DU1JfV1I6MTsJCQkvLyAwOiByZWFkICAxOiB3cml0ZQotCQlVSU5UCVJGX0NTUl9LSUNLOjE7CQkJLy8ga2ljayBSRiByZWdpc3RlciByZWFkL3dyaXRlCi0JCVVJTlQJUnN2ZDE6MTQ7CQkJCS8vIFJlc2VydmVkCi0JfQlmaWVsZDsKLQlVSU5UCXdvcmQ7Ci19CVJGX0NTUl9DRkdfU1RSVUMsICpQUkZfQ1NSX0NGR19TVFJVQzsKLSNlbmRpZgotCi0KLS8vCi0vLyBPdGhlciBvbi1jaGlwIHNoYXJlZCBtZW1vcnkgc3BhY2UsIGJhc2UgPSAweDIwMDAKLS8vCi0KLS8vIENJUyBzcGFjZSAtIGJhc2UgYWRkcmVzcyA9IDB4MjAwMAotI2RlZmluZSBIV19DSVNfQkFTRSAgICAgICAgICAgICAweDIwMDAKLQotLy8gQ2Fycmllci1zZW5zZSBDVFMgZnJhbWUgYmFzZSBhZGRyZXNzLiBJdCdzIHdoZXJlIG1hYyBzdG9yZXMgY2Fycmllci1zZW5zZSBmcmFtZSBmb3IgY2Fycmllci1zZW5zZSBmdW5jdGlvbi4KLSNkZWZpbmUgSFdfQ1NfQ1RTX0JBU0UJCQkweDc3MDAKLS8vIERGUyBDVFMgZnJhbWUgYmFzZSBhZGRyZXNzLiBJdCdzIHdoZXJlIG1hYyBzdG9yZXMgQ1RTIGZyYW1lIGZvciBERlMuCi0jZGVmaW5lIEhXX0RGU19DVFNfQkFTRQkJCTB4Nzc4MAotI2RlZmluZSBIV19DVFNfRlJBTUVfU0laRQkJMHg4MAotCi0vLyAyMDA0LTExLTA4IGpvaG4gLSBzaW5jZSBOVUxMIGZyYW1lIHdvbid0IGJlIHRoYXQgbG9uZyAoMjU2IGJ5dGUpLiBXZSBzdGVhbCAxNiB0YWlsIGJ5dGVzCi0vLyB0byBzYXZlIGRlYnVnZ2luZyBzZXR0aW5ncwotI2RlZmluZSBIV19ERUJVR19TRVRUSU5HX0JBU0UgICAweDc3ZjAgIC8vIDB4NzdmMH4weDc3ZmYgdG90YWwgMTYgYnl0ZXMKLSNkZWZpbmUgSFdfREVCVUdfU0VUVElOR19CQVNFMiAgIDB4Nzc3MCAgLy8gMHg3N2YwfjB4NzdmZiB0b3RhbCAxNiBieXRlcwotCi0vLyBJbiBvcmRlciB0byBzdXBwb3J0IG1heGltdW0gOCBNQlNTIGFuZCBpdHMgbWF4aW11bSBsZW5ndGggaXMgNTEyIGZvciBlYWNoIGJlYWNvbgotLy8gVGhyZWUgc2VjdGlvbiBkaXNjb250aW51ZSBtZW1vcnkgc2VnbWVudHMgd2lsbCBiZSB1c2VkLgotLy8gMS4gVGhlIG9yaWdpbmFsIHJlZ2lvbiBmb3IgQkNOIDB+MwotLy8gMi4gRXh0cmFjdCBtZW1vcnkgZnJvbSBGQ0UgdGFibGUgZm9yIEJDTiA0fjUKLS8vIDMuIEV4dHJhY3QgbWVtb3J5IGZyb20gUGFpci13aXNlIGtleSB0YWJsZSBmb3IgQkNOIDZ+NwotLy8JICBJdCBvY2N1cGllZCB0aG9zZSBtZW1vcnkgb2Ygd2NpZCAyMzh+MjUzIGZvciBCQ04gNgotLy8JCQkJCQkgICAgICBhbmQgd2NpZCAyMjJ+MjM3IGZvciBCQ04gNwotI2RlZmluZSBIV19CRUFDT05fTUFYX1NJWkUgICAgICAweDEwMDAgLyogdW5pdDogYnl0ZSAqLwotI2RlZmluZSBIV19CRUFDT05fQkFTRTAgICAgICAgICAweDc4MDAKLSNkZWZpbmUgSFdfQkVBQ09OX0JBU0UxICAgICAgICAgMHg3QTAwCi0jZGVmaW5lIEhXX0JFQUNPTl9CQVNFMiAgICAgICAgIDB4N0MwMAotI2RlZmluZSBIV19CRUFDT05fQkFTRTMgICAgICAgICAweDdFMDAKLSNkZWZpbmUgSFdfQkVBQ09OX0JBU0U0ICAgICAgICAgMHg3MjAwCi0jZGVmaW5lIEhXX0JFQUNPTl9CQVNFNSAgICAgICAgIDB4NzQwMAotI2RlZmluZSBIV19CRUFDT05fQkFTRTYgICAgICAgICAweDVEQzAKLSNkZWZpbmUgSFdfQkVBQ09OX0JBU0U3ICAgICAgICAgMHg1QkMwCi0KLSNkZWZpbmUgSFdfQkVBQ09OX01BWF9DT1VOVCAgICAgOAotI2RlZmluZSBIV19CRUFDT05fT0ZGU0VUCQkweDAyMDAKLSNkZWZpbmUgSFdfQkVBQ09OX0NPTlRFTlRfTEVOCShIV19CRUFDT05fT0ZGU0VUIC0gVFhXSV9TSVpFKQotCi0vLyBIT1NULU1DVSBzaGFyZWQgbWVtb3J5IC0gYmFzZSBhZGRyZXNzID0gMHgyMTAwCi0jZGVmaW5lIEhPU1RfQ01EX0NTUgkJMHg0MDQKLSNkZWZpbmUgSDJNX01BSUxCT1hfQ1NSICAgICAgICAgMHg3MDEwCi0jZGVmaW5lIEgyTV9NQUlMQk9YX0NJRCAgICAgICAgIDB4NzAxNAotI2RlZmluZSBIMk1fTUFJTEJPWF9TVEFUVVMgICAgICAweDcwMWMKLSNkZWZpbmUgSDJNX0lOVF9TUkMgICAgICAgICAgICAgMHg3MDI0Ci0jZGVmaW5lIEgyTV9CQlBfQUdFTlQgICAgICAgICAgIDB4NzAyOAotI2RlZmluZSBNMkhfQ01EX0RPTkVfQ1NSICAgICAgICAweDAwMGMKLSNkZWZpbmUgTUNVX1RYT1BfQVJSQVlfQkFTRSAgICAgMHgwMDBjICAgLy8gVE9ETzogdG8gYmUgcHJvdmlkZWQgYnkgQWxiZXJ0Ci0jZGVmaW5lIE1DVV9UWE9QX0VOVFJZX1NJWkUgICAgIDMyICAgICAgIC8vIFRPRE86IHRvIGJlIHByb3ZpZGVkIGJ5IEFsYmVydAotI2RlZmluZSBNQVhfTlVNX09GX1RYT1BfRU5UUlkgICAxNiAgICAgICAvLyBUT0RPOiBtdXN0IGJlIHNhbWUgd2l0aCA4MDUxIGZpcm13YXJlCi0jZGVmaW5lIE1DVV9NQk9YX1ZFUlNJT04gICAgICAgIDB4MDEgICAgIC8vIFRPRE86IHRvIGJlIGNvbmZpcm1lZCBieSBBbGJlcnQKLSNkZWZpbmUgTUNVX01CT1hfVkVSU0lPTl9PRkZTRVQgNSAgICAgICAgLy8gVE9ETzogdG8gYmUgcHJvdmlkZWQgYnkgQWxiZXJ0Ci0KLS8vCi0vLyBIb3N0IERNQSByZWdpc3RlcnMgLSBiYXNlIGFkZHJlc3MgMHgyMDAgLiAgVFgwLTM9RURDQVFpZDAtMywgVFg0PUhDQ0EsIFRYNT1NR01ULAotLy8KLS8vCi0vLyAgRE1BIFJJTkcgREVTQ1JJUFRPUgotLy8KLSNkZWZpbmUgRTJQUk9NX0NTUiAgICAgICAgICAweDAwMDQKLSNkZWZpbmUgSU9fQ05UTF9DU1IgICAgICAgICAweDc3ZDAKLQotCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFR4IC8JUnggLyBNZ210IHJpbmcgZGVzY3JpcHRvciBkZWZpbml0aW9uCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIHRoZSBmb2xsb3dpbmcgUElEIHZhbHVlcyBhcmUgdXNlZCB0byBtYXJrIG91dGdvaW5nIGZyYW1lIHR5cGUgaW4gVFhELT5QSUQgc28gdGhhdAotLy8gcHJvcGVyIFRYIHN0YXRpc3RpY3MgY2FuIGJlIGNvbGxlY3RlZCBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzCi0vLyBiMy0yIG9mIFBJRCBmaWVsZCAtCi0jZGVmaW5lIFBJRF9NR01UCQkJMHgwNQotI2RlZmluZSBQSURfQkVBQ09OCQkJMHgwYwotI2RlZmluZSBQSURfREFUQV9OT1JNQUxVQ0FTVAkJMHgwMgotI2RlZmluZSBQSURfREFUQV9BTVBEVQkJMHgwNAotI2RlZmluZSBQSURfREFUQV9OT19BQ0sJCTB4MDgKLSNkZWZpbmUgUElEX0RBVEFfTk9UX05PUk1fQUNLCQkweDAzCi0vLyB2YWx1ZSBkb21haW4gb2YgcFR4RC0+SG9zdFFJZCAoNC1iaXQ6IDB+MTUpCi0jZGVmaW5lIFFJRF9BQ19CSyAgICAgICAgICAgICAgIDEgICAvLyBtZWV0IEFDSSBkZWZpbml0aW9uIGluIDgwMi4xMWUKLSNkZWZpbmUgUUlEX0FDX0JFICAgICAgICAgICAgICAgMCAgIC8vIG1lZXQgQUNJIGRlZmluaXRpb24gaW4gODAyLjExZQotI2RlZmluZSBRSURfQUNfVkkgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFFJRF9BQ19WTyAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgUUlEX0hDQ0EgICAgICAgICAgICAgICAgNAotLy8jZGVmaW5lIE5VTV9PRl9UWF9SSU5HICAgICAgICAgIDUKLSNkZWZpbmUgTlVNX09GX1RYX1JJTkcgICAgICAgICAgNAotI2RlZmluZSBRSURfTUdNVCAgICAgICAgICAgICAgICAxMwotI2RlZmluZSBRSURfUlggICAgICAgICAgICAgICAgICAxNAotI2RlZmluZSBRSURfT1RIRVIgICAgICAgICAgICAgICAxNQotCi0jZW5kaWYgLy8gX19SVE1QX01BQ19IX18gLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRtcF9tY3UuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRtcF9tY3UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFiMmZlZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfbWN1LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXJ0bXBfbWN1LmgKLQotCUFic3RyYWN0OgotCU1pbmlwb3J0IGhlYWRlciBmaWxlIGZvciBtY3UgcmVsYXRlZCBpbmZvcm1hdGlvbgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLQktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSNpZm5kZWYgX19SVE1QX01DVV9IX18KLSNkZWZpbmUgX19SVE1QX01DVV9IX18KLQotCi1JTlQgUnRtcEFzaWNFcmFzZUZpcm13YXJlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotTkRJU19TVEFUVVMgUnRtcEFzaWNMb2FkRmlybXdhcmUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1JTlQgUnRtcEFzaWNTZW5kQ29tbWFuZFRvTWN1KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSCQkgQ29tbWFuZCwKLQlJTiBVQ0hBUgkJIFRva2VuLAotCUlOIFVDSEFSCQkgQXJnMCwKLQlJTiBVQ0hBUgkJIEFyZzEpOwotCi0jZW5kaWYgLy8gX19SVE1QX01DVV9IX18gLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRtcF9vcy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX29zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDZiMmQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX29zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotCXJ0bXBfb3MuaAotCi0gICAgQWJzdHJhY3Q6Ci0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotCi0jaWZuZGVmIF9fUlRNUF9PU19IX18KLSNkZWZpbmUgX19SVE1QX09TX0hfXwotCi0jaWZkZWYgTElOVVgKLSNpbmNsdWRlICJydF9saW51eC5oIgotI2VuZGlmIC8vIExJTlVYIC8vCi0KLQotLyoKLQlUaGlzIGRhdGEgc3RydWN0dXJlIG1haW5seSBzdHJpcCBzb21lIGNhbGxiYWNrIGZ1bmN0aW9uIGRlZmluZWQgaW4KLQkic3RydWN0IG5ldF9kZXZpY2UiIGluIGtlcm5lbCBzb3VyY2UgImluY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgiLgotCi0JVGhlIGRlZmluaXRpb24gb2YgdGhpcyBkYXRhIHN0cnVjdHVyZSBtYXkgdmFyaW91cyBkZXBlbmRzIG9uIGRpZmZlcmVudAotCU9TLiBVc2UgaXQgY2FyZWZ1bGx5LgotKi8KLXR5cGVkZWYgc3RydWN0IF9SVE1QX09TX05FVERFVl9PUF9IT09LXwotewotCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqbmV0ZGV2X29wczsKLQl2b2lkCQkJKnByaXY7Ci0JaW50CQkJcHJpdl9mbGFnczsKLQl1bnNpZ25lZCBjaGFyIGRldkFkZHJbNl07Ci0JdW5zaWduZWQgY2hhcglkZXZOYW1lWzE2XTsKLQl1bnNpZ25lZCBjaGFyCW5lZWRQcm90Y3RlZDsKLX1SVE1QX09TX05FVERFVl9PUF9IT09LLCAqUFJUTVBfT1NfTkVUREVWX09QX0hPT0s7Ci0KLQotdHlwZWRlZiBlbnVtIF9SVE1QX1RBU0tfU1RBVFVTXwotewotCVJUTVBfVEFTS19TVEFUX1VOS05PV04gPSAwLAotCVJUTVBfVEFTS19TVEFUX0lOSVRFRCA9IDEsCi0JUlRNUF9UQVNLX1NUQVRfUlVOTklORyA9IDIsCi0JUlRNUF9UQVNLX1NUQVRfU1RPUEVEID0gNCwKLX1SVE1QX1RBU0tfU1RBVFVTOwotI2RlZmluZSBSVE1QX1RBU0tfQ0FOX0RPX0lOU0VSVAkJKFJUTVBfVEFTS19TVEFUX0lOSVRFRCB8UlRNUF9UQVNLX1NUQVRfUlVOTklORykKLQotI2RlZmluZSBSVE1QX09TX1RBU0tfTkFNRV9MRU4JMTYKLXR5cGVkZWYgc3RydWN0IF9SVE1QX09TX1RBU0tfCi17Ci0JY2hhcgkJCQkJdGFza05hbWVbUlRNUF9PU19UQVNLX05BTUVfTEVOXTsKLQl2b2lkCQkJCQkqcHJpdjsKLQkvL3Vuc2lnbmVkIGxvbmcJCXRhc2tGbGFnczsKLQlSVE1QX1RBU0tfU1RBVFVTCXRhc2tTdGF0dXM7Ci0jaWZuZGVmIEtUSFJFQURfU1VQUE9SVAotCVJUTVBfT1NfU0VNCQkJdGFza1NlbWE7Ci0JUlRNUF9PU19QSUQJCQl0YXNrUElEOwotCXN0cnVjdCBjb21wbGV0aW9uCQl0YXNrQ29tcGxldGU7Ci0jZW5kaWYKLQl1bnNpZ25lZCBjaGFyCQkJdGFza19raWxsZWQ7Ci0jaWZkZWYgS1RIUkVBRF9TVVBQT1JUCi0Jc3RydWN0IHRhc2tfc3RydWN0CSprdGhyZWFkX3Rhc2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QJCWt0aHJlYWRfcTsKLQlCT09MRUFOCQkJCQlrdGhyZWFkX3J1bm5pbmc7Ci0jZW5kaWYKLX1SVE1QX09TX1RBU0s7Ci0KLSNlbmRpZiAvLyBfX1JNVFBfT1NfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfcGNpLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfcGNpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZmVkMjkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX3BjaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaWZuZGVmIF9fUlRNUF9QQ0lfSF9fCi0jZGVmaW5lIF9fUlRNUF9QQ0lfSF9fCi0KLSNkZWZpbmUgUlQyOFhYX0hBTkRMRV9ERVZfQVNTSUdOKGhhbmRsZSwgZGV2X3ApCQkJCVwKLQkoKFBPU19DT09LSUUpaGFuZGxlKS0+cGNpX2RldiA9IGRldl9wOwotCi0KLSNpZmRlZiBMSU5VWAotLy8gc2V0IGRyaXZlciBkYXRhCi0jZGVmaW5lIFJUMjhYWF9EUlZEQVRBX1NFVChfYSkJCQlwY2lfc2V0X2RydmRhdGEoX2EsIG5ldF9kZXYpOwotCi0jZGVmaW5lIFJUMjhYWF9QVVRfREVWSUNFKGRldl9wKQotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKLSNkZWZpbmUgU0FfU0hJUlEgSVJRRl9TSEFSRUQKLSNlbmRpZgotCi0jaWZkZWYgUENJX01TSV9TVVBQT1JUCi0jZGVmaW5lIFJUTVBfTVNJX0VOQUJMRShfcEFkKSBcCi17CVBPU19DT09LSUUgX3BPYmogPSAoUE9TX0NPT0tJRSkoX3BBZC0+T1NfQ29va2llKTsgXAotCShfcEFkKS0+SGF2ZU1zaSA9CXBjaV9lbmFibGVfbXNpKF9wT2JqLT5wY2lfZGV2KSA9PSAwID8gVFJVRSA6IEZBTFNFOyB9Ci0KLSNkZWZpbmUgUlRNUF9NU0lfRElTQUJMRShfcEFkKSBcCi17CVBPU19DT09LSUUgX3BPYmogPSAoUE9TX0NPT0tJRSkoX3BBZC0+T1NfQ29va2llKTsgXAotCWlmIChfcEFkLT5IYXZlTXNpID09IFRSVUUpIFwKLQkJcGNpX2Rpc2FibGVfbXNpKF9wT2JqLT5wY2lfZGV2KTsgXAotCV9wQWQtPkhhdmVNc2kgPSBGQUxTRTsJfQotI2Vsc2UKLSNkZWZpbmUgUlRNUF9NU0lfRU5BQkxFKF9wQWQpCi0jZGVmaW5lIFJUTVBfTVNJX0RJU0FCTEUoX3BBZCkKLSNlbmRpZiAvLyBQQ0lfTVNJX1NVUFBPUlQgLy8KLQotCi0jZGVmaW5lIFJUTVBfUENJX0RFVl9VTk1BUCgpCQkJCQkJCQkJCVwKLXsJaWYgKG5ldF9kZXYtPmJhc2VfYWRkcikJewkJCQkJCQkJXAotCQlpb3VubWFwKCh2b2lkICopKG5ldF9kZXYtPmJhc2VfYWRkcikpOwkJCQlcCi0JCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2X3AsIDApLAlcCi0JCQkJCQkJcGNpX3Jlc291cmNlX2xlbihkZXZfcCwgMCkpOyB9CVwKLQlpZiAobmV0X2Rldi0+aXJxKSBwY2lfcmVsZWFzZV9yZWdpb25zKGRldl9wKTsgfQotCi0KLSNkZWZpbmUgUlRNUF9JUlFfUkVRVUVTVChuZXRfZGV2KQkJCQkJCQlcCi17CVBSVE1QX0FEQVBURVIgX3BBZCA9IChQUlRNUF9BREFQVEVSKShSVE1QX09TX05FVERFVl9HRVRfUFJJVihuZXRfZGV2KSk7CVwKLQlQT1NfQ09PS0lFIF9wT2JqID0gKFBPU19DT09LSUUpKF9wQWQtPk9TX0Nvb2tpZSk7CQlcCi0JUlRNUF9NU0lfRU5BQkxFKF9wQWQpOwkJCQkJCQkJCVwKLQlpZiAoKHJldHZhbCA9IHJlcXVlc3RfaXJxKF9wT2JqLT5wY2lfZGV2LT5pcnEsCQlcCi0JCQkJCQkJcnQyODYwX2ludGVycnVwdCwgU0FfU0hJUlEsCQlcCi0JCQkJCQkJKG5ldF9kZXYpLT5uYW1lLCAobmV0X2RldikpKSkgewlcCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInJlcXVlc3RfaXJxICBlcnJvciglZClcbiIsIHJldHZhbCkpOwlcCi0JcmV0dXJuIHJldHZhbDsgfSB9Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0jZGVmaW5lIFJUTVBfSVJRX1JFTEVBU0UobmV0X2RldikJCQkJCQkJCVwKLXsJUFJUTVBfQURBUFRFUiBfcEFkID0gKFBSVE1QX0FEQVBURVIpKFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKG5ldF9kZXYpKTsJCVwKLQlQT1NfQ09PS0lFIF9wT2JqID0gKFBPU19DT09LSUUpKF9wQWQtPk9TX0Nvb2tpZSk7CQkJXAotCXN5bmNocm9uaXplX2lycShfcE9iai0+cGNpX2Rldi0+aXJxKTsJCQkJCQlcCi0JZnJlZV9pcnEoX3BPYmotPnBjaV9kZXYtPmlycSwgKG5ldF9kZXYpKTsJCQkJCVwKLQlSVE1QX01TSV9ESVNBQkxFKF9wQWQpOyB9Ci0jZWxzZQotI2RlZmluZSBSVE1QX0lSUV9SRUxFQVNFKG5ldF9kZXYpCQkJCQkJCQlcCi17CVBSVE1QX0FEQVBURVIgX3BBZCA9IChQUlRNUF9BREFQVEVSKShSVE1QX09TX05FVERFVl9HRVRfUFJJVihuZXRfZGV2KSk7CQlcCi0JUE9TX0NPT0tJRSBfcE9iaiA9IChQT1NfQ09PS0lFKShfcEFkLT5PU19Db29raWUpOwkJCVwKLQlmcmVlX2lycShfcE9iai0+cGNpX2Rldi0+aXJxLCAobmV0X2RldikpOwkJCQkJXAotCVJUTVBfTVNJX0RJU0FCTEUoX3BBZCk7IH0KLSNlbmRpZgotCi0jZGVmaW5lIFBDSV9SRUdfUkVBRF9XT1JEKHBjaV9kZXYsIG9mZnNldCwgQ29uZmlndXJhdGlvbikgICBcCi0gICAgaWYgKHBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaV9kZXYsIG9mZnNldCwgJnJlZzE2KSA9PSAwKSAgICAgXAotICAgICAgICBDb25maWd1cmF0aW9uID0gbGUyY3B1MTYocmVnMTYpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIENvbmZpZ3VyYXRpb24gPSAwOwotCi0jZGVmaW5lIFBDSV9SRUdfV0lSVEVfV09SRChwY2lfZGV2LCBvZmZzZXQsIENvbmZpZ3VyYXRpb24pICBcCi0gICAgcmVnMTYgPSBjcHUybGUxNihDb25maWd1cmF0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaV9kZXYsIG9mZnNldCwgcmVnMTYpOyAgICAgICAgICBcCi0KLSNlbmRpZiAvLyBMSU5VWCAvLwotCi0KLQotCi0jZW5kaWYgLy8gX19SVE1QX1BDSV9IX18gLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRtcF9waHkuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRtcF9waHkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk4NDhjYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfcGh5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MzEgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQlydG1wX3BoeS5oCi0KLQlBYnN0cmFjdDoKLQlSYWxpbmsgV2lyZWxlc3MgQ2hpcCBQSFkoQkJQL1JGKSByZWxhdGVkIGRlZmluaXRpb24gJiBzdHJ1Y3R1cmVzCi0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCSAgV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaWZuZGVmIF9fUlRNUF9QSFlfSF9fCi0jZGVmaW5lIF9fUlRNUF9QSFlfSF9fCi0KLQotLyoKLQlSRiBzZWN0aW9ucwotKi8KLSNkZWZpbmUgUkZfUjAwCQkJMAotI2RlZmluZSBSRl9SMDEJCQkxCi0jZGVmaW5lIFJGX1IwMgkJCTIKLSNkZWZpbmUgUkZfUjAzCQkJMwotI2RlZmluZSBSRl9SMDQJCQk0Ci0jZGVmaW5lIFJGX1IwNQkJCTUKLSNkZWZpbmUgUkZfUjA2CQkJNgotI2RlZmluZSBSRl9SMDcJCQk3Ci0jZGVmaW5lIFJGX1IwOAkJCTgKLSNkZWZpbmUgUkZfUjA5CQkJOQotI2RlZmluZSBSRl9SMTAJCQkxMAotI2RlZmluZSBSRl9SMTEJCQkxMQotI2RlZmluZSBSRl9SMTIJCQkxMgotI2RlZmluZSBSRl9SMTMJCQkxMwotI2RlZmluZSBSRl9SMTQJCQkxNAotI2RlZmluZSBSRl9SMTUJCQkxNQotI2RlZmluZSBSRl9SMTYJCQkxNgotI2RlZmluZSBSRl9SMTcJCQkxNwotI2RlZmluZSBSRl9SMTgJCQkxOAotI2RlZmluZSBSRl9SMTkJCQkxOQotI2RlZmluZSBSRl9SMjAJCQkyMAotI2RlZmluZSBSRl9SMjEJCQkyMQotI2RlZmluZSBSRl9SMjIJCQkyMgotI2RlZmluZSBSRl9SMjMJCQkyMwotI2RlZmluZSBSRl9SMjQJCQkyNAotI2RlZmluZSBSRl9SMjUJCQkyNQotI2RlZmluZSBSRl9SMjYJCQkyNgotI2RlZmluZSBSRl9SMjcJCQkyNwotI2RlZmluZSBSRl9SMjgJCQkyOAotI2RlZmluZSBSRl9SMjkJCQkyOQotI2RlZmluZSBSRl9SMzAJCQkzMAotI2RlZmluZSBSRl9SMzEJCQkzMQotCi0KLS8vIHZhbHVlIGRvbWFpbiBvZiBwQWQtPlJmSWNUeXBlCi0jZGVmaW5lIFJGSUNfMjgyMCAgICAgICAgICAgICAgICAgICAxICAgICAgIC8vIDIuNEcgMlQzUgotI2RlZmluZSBSRklDXzI4NTAgICAgICAgICAgICAgICAgICAgMiAgICAgICAvLyAyLjRHLzVHIDJUM1IKLSNkZWZpbmUgUkZJQ18yNzIwICAgICAgICAgICAgICAgICAgIDMgICAgICAgLy8gMi40RyAxVDJSCi0jZGVmaW5lIFJGSUNfMjc1MCAgICAgICAgICAgICAgICAgICA0ICAgICAgIC8vIDIuNEcvNUcgMVQyUgotI2RlZmluZSBSRklDXzMwMjAgICAgICAgICAgICAgICAgICAgNSAgICAgICAvLyAyLjRHIDFUMVIKLSNkZWZpbmUgUkZJQ18yMDIwICAgICAgICAgICAgICAgICAgIDYgICAgICAgLy8gMi40RyBCL0cKLSNkZWZpbmUgUkZJQ18zMDIxICAgICAgICAgICAgICAgICAgIDcgICAgICAgLy8gMi40RyAxVDJSCi0jZGVmaW5lIFJGSUNfMzAyMiAgICAgICAgICAgICAgICAgICA4ICAgICAgIC8vIDIuNEcgMlQyUgotI2RlZmluZSBSRklDXzMwNTIgICAgICAgICAgICAgICAgICAgOSAgICAgICAvLyAyLjRHLzVHIDJUMlIKLQotLyoKLQlCQlAgc2VjdGlvbnMKLSovCi0jZGVmaW5lIEJCUF9SMAkJCTAgIC8vIHZlcnNpb24KLSNkZWZpbmUgQkJQX1IxCQkJMSAgLy8gVFNTSQotI2RlZmluZSBCQlBfUjIJCQkyICAvLyBUWCBjb25maWd1cmUKLSNkZWZpbmUgQkJQX1IzCQkJMwotI2RlZmluZSBCQlBfUjQJCQk0Ci0jZGVmaW5lIEJCUF9SNQkJCTUKLSNkZWZpbmUgQkJQX1I2CQkJNgotI2RlZmluZSBCQlBfUjE0CQkJMTQgLy8gUlggY29uZmlndXJlCi0jZGVmaW5lIEJCUF9SMTYJCQkxNgotI2RlZmluZSBCQlBfUjE3CQkJMTcgLy8gUlggc2Vuc2liaWxpdHkKLSNkZWZpbmUgQkJQX1IxOAkJCTE4Ci0jZGVmaW5lIEJCUF9SMjEJCQkyMQotI2RlZmluZSBCQlBfUjIyCQkJMjIKLSNkZWZpbmUgQkJQX1IyNAkJCTI0Ci0jZGVmaW5lIEJCUF9SMjUJCQkyNQotI2RlZmluZSBCQlBfUjI2CQkJMjYKLSNkZWZpbmUgQkJQX1IyNwkJCTI3Ci0jZGVmaW5lIEJCUF9SMzEJCQkzMQotI2RlZmluZSBCQlBfUjQ5CQkJNDkgLy9UU1NJCi0jZGVmaW5lIEJCUF9SNTAJCQk1MAotI2RlZmluZSBCQlBfUjUxCQkJNTEKLSNkZWZpbmUgQkJQX1I1MgkJCTUyCi0jZGVmaW5lIEJCUF9SNTUJCQk1NQotI2RlZmluZSBCQlBfUjYyCQkJNjIgLy8gUnggU1EwIFRocmVzaG9sZCBISUdICi0jZGVmaW5lIEJCUF9SNjMJCQk2MwotI2RlZmluZSBCQlBfUjY0CQkJNjQKLSNkZWZpbmUgQkJQX1I2NQkJCTY1Ci0jZGVmaW5lIEJCUF9SNjYJCQk2NgotI2RlZmluZSBCQlBfUjY3CQkJNjcKLSNkZWZpbmUgQkJQX1I2OAkJCTY4Ci0jZGVmaW5lIEJCUF9SNjkJCQk2OQotI2RlZmluZSBCQlBfUjcwCQkJNzAgLy8gUnggQUdDIFNRIENDSyBYY29yciB0aHJlc2hvbGQKLSNkZWZpbmUgQkJQX1I3MwkJCTczCi0jZGVmaW5lIEJCUF9SNzUJCQk3NQotI2RlZmluZSBCQlBfUjc3CQkJNzcKLSNkZWZpbmUgQkJQX1I3OAkJCTc4Ci0jZGVmaW5lIEJCUF9SNzkJCQk3OQotI2RlZmluZSBCQlBfUjgwCQkJODAKLSNkZWZpbmUgQkJQX1I4MQkJCTgxCi0jZGVmaW5lIEJCUF9SODIJCQk4MgotI2RlZmluZSBCQlBfUjgzCQkJODMKLSNkZWZpbmUgQkJQX1I4NAkJCTg0Ci0jZGVmaW5lIEJCUF9SODYJCQk4NgotI2RlZmluZSBCQlBfUjkxCQkJOTEKLSNkZWZpbmUgQkJQX1I5MgkJCTkyCi0jZGVmaW5lIEJCUF9SOTQJCQk5NCAvLyBUeCBHYWluIENvbnRyb2wKLSNkZWZpbmUgQkJQX1IxMDMJCTEwMwotI2RlZmluZSBCQlBfUjEwNQkJMTA1Ci0jZGVmaW5lIEJCUF9SMTA2CQkxMDYKLSNkZWZpbmUgQkJQX1IxMTMJCTExMwotI2RlZmluZSBCQlBfUjExNAkJMTE0Ci0jZGVmaW5lIEJCUF9SMTE1CQkxMTUKLSNkZWZpbmUgQkJQX1IxMTYJCTExNgotI2RlZmluZSBCQlBfUjExNwkJMTE3Ci0jZGVmaW5lIEJCUF9SMTE4CQkxMTgKLSNkZWZpbmUgQkJQX1IxMTkJCTExOQotI2RlZmluZSBCQlBfUjEyMAkJMTIwCi0jZGVmaW5lIEJCUF9SMTIxCQkxMjEKLSNkZWZpbmUgQkJQX1IxMjIJCTEyMgotI2RlZmluZSBCQlBfUjEyMwkJMTIzCi0jaWZkZWYgUlQzMHh4Ci0jZGVmaW5lIEJCUF9SMTM4CQkxMzggLy8gYWRkIGJ5IGpvaG5saSwgUkYgcG93ZXIgc2VxdWVuY2Ugc2V0dXAsIEFEQyBkeW5hbWljIG9uL29mZiBjb250cm9sCi0jZW5kaWYgLy8gUlQzMHh4IC8vCi0KLQotI2RlZmluZSBCQlBSOTRfREVGQVVMVAkweDA2IC8vIEFkZCAxIHZhbHVlIHdpbGwgZ2FpbiAxZGIKLQotCi0jaWZkZWYgTUVSR0VfQVJDSF9URUFNCi0JI2RlZmluZSBNQVhfQkJQX0lECTIwMAotCSNkZWZpbmUgTUFYX0JCUF9NU0dfU0laRQk0MDk2Ci0jZWxzZQotI2lmZGVmIFJUMzB4eAotCS8vIGVkaXQgYnkgam9obmxpLCBSRiBwb3dlciBzZXF1ZW5jZSBzZXR1cCwgYWRkIEJCUCBSMTM4IGZvciBBREMgZHluYW1pYyBvbi9vZmYgY29udHJvbAotCSNkZWZpbmUgTUFYX0JCUF9JRAkxMzgKLSNlbmRpZiAvLyBSVDMweHggLy8KLSNpZm5kZWYgUlQzMHh4Ci0JI2RlZmluZSBNQVhfQkJQX0lECTEzNgotI2VuZGlmIC8vIFJUMzB4eCAvLwotCSNkZWZpbmUgTUFYX0JCUF9NU0dfU0laRQkyMDQ4Ci0jZW5kaWYgLy8gTUVSR0VfQVJDSF9URUFNIC8vCi0KLQotLy8KLS8vIEJCUCAmIFJGIGFyZSB1c2luZyBpbmRpcmVjdCBhY2Nlc3MuIEJlZm9yZSB3cml0ZSBhbnkgdmFsdWUgaW50byBpdC4KLS8vIFdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIG5vIG91dHN0YW5kaW5nIGNvbW1hbmQgcGVuZGluZyB2aWEgY2hlY2tpbmcgYnVzeSBiaXQuCi0vLwotI2RlZmluZSBNQVhfQlVTWV9DT1VOVCAgMTAwICAgICAgICAgLy8gTnVtYmVyIG9mIHJldHJ5IGJlZm9yZSBmYWlsaW5nIGFjY2VzcyBCQlAgJiBSRiBpbmRpcmVjdCByZWdpc3RlcgotCi0vLyNkZWZpbmUgUEhZX1RSX1NXSVRDSF9USU1FICAgICAgICAgIDUgIC8vIHVzZWMKLQotLy8jZGVmaW5lIEJCUF9SMTdfTE9XX1NFTlNJQklMSVRZICAgICAweDUwCi0vLyNkZWZpbmUgQkJQX1IxN19NSURfU0VOU0lCSUxJVFkgICAgIDB4NDEKLS8vI2RlZmluZSBCQlBfUjE3X0RZTkFNSUNfVVBfQk9VTkQgICAgMHg0MAotCi0jZGVmaW5lIFJTU0lfRk9SX1ZFUllfTE9XX1NFTlNJQklMSVRZICAgLTM1Ci0jZGVmaW5lIFJTU0lfRk9SX0xPV19TRU5TSUJJTElUWQkJLTU4Ci0jZGVmaW5lIFJTU0lfRk9SX01JRF9MT1dfU0VOU0lCSUxJVFkJLTgwCi0jZGVmaW5lIFJTU0lfRk9SX01JRF9TRU5TSUJJTElUWQkJLTkwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCVJGIHJlZ2lzdGVyIFJlYWQvV3JpdGUgbWFyY28gZGVmaW5pdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIFJUTVBfTUFDX1BDSQotI2RlZmluZSBSVE1QX1JGX0lPX1dSSVRFMzIoX0EsIF9WKSAgICAgICAgICAgICAgICAgIFwKLXsJCQkJCQkJCQkJCVwKLQlpZiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkJICAgICAgICAgICAgICAgIFwKLQl7CQkJCQkJCQkJCQkJXAotCQlQSFlfQ1NSNF9TVFJVQyAgX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlVTE9ORyAgICAgICAgICAgX2J1c3lDbnQgPSAwOyAgICAgICAgICAgICAgICAgICAgXAotCQkJCQkJCQkJCQlcCi0JCWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCVJUTVBfSU9fUkVBRDMyKChfQSksIFJGX0NTUl9DRkcwLCAmX3ZhbHVlLndvcmQpOyAgXAotCQkJaWYgKF92YWx1ZS5maWVsZC5CdXN5ID09IElETEUpICAgICAgICAgICAgICAgXAotCQkJCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlfYnVzeUNudCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCX13aGlsZSAoX2J1c3lDbnQgPCBNQVhfQlVTWV9DT1VOVCk7CQkJXAotCQlpZihfYnVzeUNudCA8IE1BWF9CVVNZX0NPVU5UKSAgICAgICAgICAgICAgICAgICBcCi0JCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCVJUTVBfSU9fV1JJVEUzMigoX0EpLCBSRl9DU1JfQ0ZHMCwgKF9WKSk7ICAgICAgICAgIFwKLQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCX0JCQkJCQkJCVwKLX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi0KLSNpZmRlZiBSVDMweHgKLSNkZWZpbmUgUlRNUF9SRl9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpICAgIFJUMzB4eFJlYWRSRlJlZ2lzdGVyKF9BLCBfSSwgX3BWKQotI2RlZmluZSBSVE1QX1JGX0lPX1dSSVRFOF9CWV9SRUdfSUQoX0EsIF9JLCBfVikgICAgUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKF9BLCBfSSwgX1YpCi0jZW5kaWYgLy8gUlQzMHh4IC8vCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JQkJQIHJlZ2lzdGVyIFJlYWQvV3JpdGUgbWFyY28gZGVmaW5pdGlvbnMuCi0Jd2UgcmVhZC93cml0ZSB0aGUgYmJwIHZhbHVlIGJ5IHJlZ2lzdGVyJ3MgSUQuCi0JR2VuZXJhdGUgUEVSIHRvIHRlc3QgQkEKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLS8qCi0JYmFzaWMgbWFyY28gZm9yIEJCUCByZWFkIG9wZXJhdGlvbi4KLQlfcEFkOiB0aGUgZGF0YSBzdHJ1Y3R1cmUgcG9pbnRlciBvZiBSVE1QX0FEQVBURVIKLQlfYmJwSUQgOiB0aGUgYmJwIHJlZ2lzdGVyIElECi0JX3BWOiBkYXRhIHBvaW50ZXIgdXNlZCB0byBzYXZlIHRoZSB2YWx1ZSBvZiBxdWVyaWVkIGJicCByZWdpc3Rlci4KLQlfYlZpYU1DVTogaWYgd2UgbmVlZCBhY2Nlc3MgdGhlIGJicCB2aWEgdGhlIE1DVS4KLSovCi0jZGVmaW5lIFJUTVBfQkJQX0lPX1JFQUQ4KF9wQWQsIF9iYnBJRCwgX3BWLCBfYlZpYU1DVSkJCQlcCi0JZG97CQkJCQkJCQkJCQkJCQkJXAotCQlCQlBfQ1NSX0NGR19TVFJVQyAgQmJwQ3NyOwkJCQkJCQkJXAotCQlpbnQgICBfYnVzeUNudCwgX3NlY0NudCwgX3JlZ0lEOwkJCQkJCVwKLQkJCQkJCQkJCQkJCQkJCQlcCi0JCV9yZWdJRCA9ICgoX2JWaWFNQ1UpID09IFRSVUUgPyBIMk1fQkJQX0FHRU5UIDogQkJQX0NTUl9DRkcpOwlcCi0JCWZvciAoX2J1c3lDbnQ9MDsgX2J1c3lDbnQ8TUFYX0JVU1lfQ09VTlQ7IF9idXN5Q250KyspICAgICAgXAotCQl7CQkJCQkJCQkJCQkJCVwKLQkJCVJUTVBfSU9fUkVBRDMyKF9wQWQsIF9yZWdJRCwgJkJicENzci53b3JkKTsJCVwKLQkJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgIFwKLQkJCQljb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCUJicENzci53b3JkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCUJicENzci5maWVsZC5mUmVhZCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCUJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCUJicENzci5maWVsZC5CdXN5ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCUJicENzci5maWVsZC5SZWdOdW0gPSBfYmJwSUQ7ICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgX3JlZ0lELCBCYnBDc3Iud29yZCk7ICAgICBcCi0JCQlpZiAoKF9iVmlhTUNVKSA9PSBUUlVFKQkJCQkJCQlcCi0JCQl7CQkJCQkJCQkJCQkJCVwKLQkJCQlBc2ljU2VuZENvbW1hbmRUb01jdShfcEFkLCAweDgwLCAweGZmLCAweDAsIDB4MCk7IFwKLQkJCQlSVE1QdXNlY0RlbGF5KDEwMDApOwlcCi0JCQl9CQkJCQkJCVwKLQkJCWZvciAoX3NlY0NudD0wOyBfc2VjQ250PE1BWF9CVVNZX0NPVU5UOyBfc2VjQ250KyspICAgICAgIFwKLQkJCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCQlSVE1QX0lPX1JFQUQzMihfcEFkLCBfcmVnSUQsICZCYnBDc3Iud29yZCk7IFwKLQkJCQlpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gSURMRSkgICAgICAgICAgICAgIFwKLQkJCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCWlmICgoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gSURMRSkgJiYgICAgICAgICAgICAgIFwKLQkJCQkoQmJwQ3NyLmZpZWxkLlJlZ051bSA9PSBfYmJwSUQpKSAgICAgICAgICAgICAgICBcCi0JCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkJKihfcFYpID0gKFVDSEFSKUJicENzci5maWVsZC5WYWx1ZTsgICAgICAgICBcCi0JCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgICAgICBcCi0JCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlEQkdQUklOVF9FUlIoKCJCQlAodmlhTUNVPSVkKSByZWFkIFIlZCBmYWlsXG4iLCAoX2JWaWFNQ1UpLCBfYmJwSUQpKTsgICAgICBcCi0JCQkqKF9wVikgPSAoX3BBZCktPkJicFdyaXRlTGF0Y2hbX2JicElEXTsgICAgICAgICAgICAgICBcCi0JCQlpZiAoKF9iVmlhTUNVKSA9PSBUUlVFKQkJCQlcCi0JCQl7CQkJCQkJCQkJXAotCQkJCVJUTVBfSU9fUkVBRDMyKF9wQWQsIF9yZWdJRCwgJkJicENzci53b3JkKTsJCQkJXAotCQkJCUJicENzci5maWVsZC5CdXN5ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgX3JlZ0lELCBCYnBDc3Iud29yZCk7CQkJCVwKLQkJCX0JCQkJXAotCQl9CQkJCQkJCQkJCQkJCVwKLQl9d2hpbGUoMCkKLQotLyoKLQlUaGlzIG1hcmNvIHVzZWQgZm9yIHRoZSBCQlAgcmVhZCBvcGVyYXRpb24gd2hpY2ggZGlkbid0IG5lZWQgdmlhIE1DVS4KLSovCi0jZGVmaW5lIEJCUF9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpCQkJXAotCVJUTVBfQkJQX0lPX1JFQUQ4KChfQSksIChfSSksIChfcFYpLCBGQUxTRSkKLQotLyoKLQlUaGlzIG1hcmNvIHVzZWQgZm9yIHRoZSBCQlAgcmVhZCBvcGVyYXRpb24gd2hpY2ggbmVlZCB2aWEgTUNVLgotCUJ1dCBmb3Igc29tZSBjaGlwc2V0IHdoaWNoIGRpZG4ndCBoYXZlIG1jdSAoZS5nLiwgUkJVUyBiYXNlZCBjaGlwc2V0KSwgd2UKLQl3aWxsIHVzZSB0aGlzIGZ1bmN0aW9uIHRvbyBhbmQgZGlkbid0IGFjY2VzcyB0aGUgYmJwIHJlZ2lzdGVyIHZpYSB0aGUgTUNVLgotKi8KLSNpZm5kZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZGVmaW5lIFJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChfQSwgX0ksIF9wVikJCQlcCi0JZG97CQkJCQkJCQkJCQkJCQlcCi0JCWlmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKQkJCQkJCQlcCi0JCXsJCQkJCQkJCQkJCQkJXAotCQkJaWYgKChfQSktPmluZlR5cGUgPT0gUlRNUF9ERVZfSU5GX1JCVVMpCQkJXAotCQkJCVJUTVBfQkJQX0lPX1JFQUQ4KChfQSksIChfSSksIChfcFYpLCBGQUxTRSk7CVwKLQkJCWVsc2UJCQkJCQkJCQkJCQlcCi0JCQkJUlRNUF9CQlBfSU9fUkVBRDgoKF9BKSwgKF9JKSwgKF9wViksIFRSVUUpOwlcCi0JCX0JCQkJCQkJCQkJCQkJXAotCX13aGlsZSgwKQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotLy8gUmVhZCBCQlAgcmVnaXN0ZXIgYnkgcmVnaXN0ZXIncyBJRC4gR2VuZXJhdGUgUEVSIHRvIHRlc3QgQkEKLSNkZWZpbmUgUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKF9BLCBfSSwgX3BWKQkJCQkJCVwKLXsJCQkJCQkJCQkJCQkJCQkJCQlcCi0JQkJQX0NTUl9DRkdfU1RSVUMJQmJwQ3NyOwkJCQkJCQkJCQkJXAotCWludAkJCQkJaSwgazsJCQlcCi0JQk9PTEVBTgkJCQkJYnJjOwkJCVwKLQlCYnBDc3IuZmllbGQuQnVzeSA9IElETEU7CQkJXAotCWlmICgoSVNfUlQzMDkwKChfQSkpIHx8IElTX1JUMzU3MigoX0EpKSB8fCBJU19SVDMzOTAoKF9BKSkpICYmICgoX0EpLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQlcCi0JCSYmICgoX0EpLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpCVwKLQkJJiYgKChfQSktPmJQQ0ljbGtPZmYgPT0gRkFMU0UpCVwKLQkJJiYgKChfQSktPmJydDMweHhCYW5NY3VDbWQgPT0gRkFMU0UpKQlcCi0JewkJCQkJCQkJCQkJCQkJCQkJXAotCQlmb3IgKGk9MDsgaTxNQVhfQlVTWV9DT1VOVDsgaSsrKQkJCQkJCQkJCVwKLQkJewkJCQkJCQkJCQkJCQkJCQkJXAotCQkJUlRNUF9JT19SRUFEMzIoX0EsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CQkJCVwKLQkJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKQkJCQkJCQkJCVwKLQkJCXsJCQkJCQkJCQkJCQkJCQkJXAotCQkJCWNvbnRpbnVlOwkJCQkJCQkJCQkJCQlcCi0JCQl9CQkJCQkJCQkJCQkJCQkJCVwKLQkJCUJicENzci53b3JkID0gMDsJCQkJCQkJCQkJCQlcCi0JCQlCYnBDc3IuZmllbGQuZlJlYWQgPSAxOwkJCQkJCQkJCQkJXAotCQkJQmJwQ3NyLmZpZWxkLkJCUF9SV19NT0RFID0gMTsJCQkJCQkJCQlcCi0JCQlCYnBDc3IuZmllbGQuQnVzeSA9IDE7CQkJCQkJCQkJCQlcCi0JCQlCYnBDc3IuZmllbGQuUmVnTnVtID0gX0k7CQkJCQkJCQkJCVwKLQkJCVJUTVBfSU9fV1JJVEUzMihfQSwgSDJNX0JCUF9BR0VOVCwgQmJwQ3NyLndvcmQpOwkJCQlcCi0JCQlicmMgPSBBc2ljU2VuZENvbW1hbmRUb01jdShfQSwgMHg4MCwgMHhmZiwgMHgwLCAweDApOwkJCQkJXAotCQkJaWYgKGJyYyA9PSBUUlVFKQkJCQkJCQkJCQkJCQkJCQlcCi0JCQl7CQkJCQkJCQkJCQkJCQkJCVwKLQkJCQlmb3IgKGs9MDsgazxNQVhfQlVTWV9DT1VOVDsgaysrKQkJCQkJCQkJXAotCQkJCXsJCQkJCQkJCQkJCQkJCQkJXAotCQkJCQlSVE1QX0lPX1JFQUQzMihfQSwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsJCQlcCi0JCQkJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKQkJCQkJCQkJXAotCQkJCQkJYnJlYWs7CQkJCQkJCQkJCQkJCVwKLQkJCQl9CQkJCQkJCQkJCQkJCQkJCVwKLQkJCQlpZiAoKEJicENzci5maWVsZC5CdXN5ID09IElETEUpICYmCQkJCQkJCQlcCi0JCQkJCShCYnBDc3IuZmllbGQuUmVnTnVtID09IF9JKSkJCQkJCQkJCVwKLQkJCQl7CQkJCQkJCQkJCQkJCQkJCVwKLQkJCQkJKihfcFYpID0gKFVDSEFSKUJicENzci5maWVsZC5WYWx1ZTsJCQkJCQkJXAotCQkJCQlicmVhazsJCQkJCQkJCQkJCQkJCVwKLQkJCQl9CQkJCQkJCQkJCQkJCQkJCVwKLQkJCX0JCQkJCQkJCQkJCQkJCQkJXAotCQkJZWxzZQkJCQkJCQkJCQkJCQkJCQlcCi0JCQl7CQkJCQkJCQkJCQkJCQkJCVwKLQkJCQlCYnBDc3IuZmllbGQuQnVzeSA9IDA7CQkJCQkJCQkJCQlcCi0JCQkJUlRNUF9JT19XUklURTMyKF9BLCBIMk1fQkJQX0FHRU5ULCBCYnBDc3Iud29yZCk7CQkJCVwKLQkJCX0JCQkJCQkJCQkJCQkJCQkJXAotCQl9CQkJCQkJCQkJCQkJCQkJCQlcCi0JfQlcCi0JZWxzZSBpZiAoISgoSVNfUlQzMDkwKChfQSkpIHx8IElTX1JUMzU3MigoX0EpKSB8fCBJU19SVDMzOTAoKF9BKSkpICYmICgoX0EpLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQlcCi0JCSYmICgoX0EpLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpKQlcCi0JCSYmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKSkJXAotCXsJCQkJCQkJCQkJCQkJCQkJCVwKLQkJZm9yIChpPTA7IGk8TUFYX0JVU1lfQ09VTlQ7IGkrKykJCQkJCQkJCQlcCi0JCXsJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCVJUTVBfSU9fUkVBRDMyKF9BLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOwkJCQlcCi0JCQlpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkJCQkJCQkJCQlcCi0JCQl7CQkJCQkJCQkJCQkJCQkJCVwKLQkJCQljb250aW51ZTsJCQkJCQkJCQkJCQkJXAotCQkJfQkJCQkJCQkJCQkJCQkJCQlcCi0JCQlCYnBDc3Iud29yZCA9IDA7CQkJCQkJCQkJCQkJXAotCQkJQmJwQ3NyLmZpZWxkLmZSZWFkID0gMTsJCQkJCQkJCQkJCVwKLQkJCUJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7CQkJCQkJCQkJXAotCQkJQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOwkJCQkJCQkJCQkJXAotCQkJQmJwQ3NyLmZpZWxkLlJlZ051bSA9IF9JOwkJCQkJCQkJCQlcCi0JCQlSVE1QX0lPX1dSSVRFMzIoX0EsIEgyTV9CQlBfQUdFTlQsIEJicENzci53b3JkKTsJCQkJXAotCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UoX0EsIDB4ODAsIDB4ZmYsIDB4MCwgMHgwKTsJCQkJCVwKLQkJCWZvciAoaz0wOyBrPE1BWF9CVVNZX0NPVU5UOyBrKyspCQkJCQkJCQlcCi0JCQl7CQkJCQkJCQkJCQkJCQkJCVwKLQkJCQlSVE1QX0lPX1JFQUQzMihfQSwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsJCQlcCi0JCQkJaWYgKEJicENzci5maWVsZC5CdXN5ID09IElETEUpCQkJCQkJCQlcCi0JCQkJCWJyZWFrOwkJCQkJCQkJCQkJCQlcCi0JCQl9CQkJCQkJCQkJCQkJCQkJCVwKLQkJCWlmICgoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gSURMRSkgJiYJCQkJCQkJCVwKLQkJCQkoQmJwQ3NyLmZpZWxkLlJlZ051bSA9PSBfSSkpCQkJCQkJCQlcCi0JCQl7CQkJCQkJCQkJCQkJCQkJCVwKLQkJCQkqKF9wVikgPSAoVUNIQVIpQmJwQ3NyLmZpZWxkLlZhbHVlOwkJCQkJCQlcCi0JCQkJYnJlYWs7CQkJCQkJCQkJCQkJCQlcCi0JCQl9CQkJCQkJCQkJCQkJCQkJCVwKLQkJfQkJCQkJCQkJCQkJCQkJCQkJXAotCX0JCQkJCQkJCQkJCQkJCQkJCVwKLQllbHNlCQkJCQkJCQkJCVwKLQl7CQkJCQkJCQkJCQkJCQkJCQlcCi0JCURCR1BSSU5UX0VSUigoIiAsIGJydDMweHhCYW5NY3VDbWQgPSAlZCwgUmVhZCBCQlAgJWQgXG4iLCAoX0EpLT5icnQzMHh4QmFuTWN1Q21kLCAoX0kpKSk7CVwKLQkJKihfcFYpID0gKF9BKS0+QmJwV3JpdGVMYXRjaFtfSV07CQkJCQkJCQlcCi0JfQkJCQkJCQkJCQkJCQkJCQkJXAotCWlmICgoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkgfHwgKChfQSktPmJQQ0ljbGtPZmYgPT0gVFJVRSkpCQkJCQkJCQkJCVwKLQl7CQkJCQkJCQkJCQkJCQkJCQlcCi0JCURCR1BSSU5UX0VSUigoIkJCUCByZWFkIFIlZD0weCV4IGZhaWxcbiIsIF9JLCBCYnBDc3Iud29yZCkpOwlcCi0JCSooX3BWKSA9IChfQSktPkJicFdyaXRlTGF0Y2hbX0ldOwkJCQkJCQkJXAotCX0JCQkJCQkJCQkJCQkJCQkJCVwKLX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotLyoKLQliYXNpYyBtYXJjbyBmb3IgQkJQIHdyaXRlIG9wZXJhdGlvbi4KLQlfcEFkOiB0aGUgZGF0YSBzdHJ1Y3R1cmUgcG9pbnRlciBvZiBSVE1QX0FEQVBURVIKLQlfYmJwSUQgOiB0aGUgYmJwIHJlZ2lzdGVyIElECi0JX3BWOiBkYXRhIHVzZWQgdG8gc2F2ZSB0aGUgdmFsdWUgb2YgcXVlcmllZCBiYnAgcmVnaXN0ZXIuCi0JX2JWaWFNQ1U6IGlmIHdlIG5lZWQgYWNjZXNzIHRoZSBiYnAgdmlhIHRoZSBNQ1UuCi0qLwotI2RlZmluZSBSVE1QX0JCUF9JT19XUklURTgoX3BBZCwgX2JicElELCBfcFYsIF9iVmlhTUNVKQkJCVwKLQlkb3sJCQkJCQkJCQkJCQkJCQlcCi0JCUJCUF9DU1JfQ0ZHX1NUUlVDICBCYnBDc3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWludCAgICAgICAgICAgICBfYnVzeUNudCwgX3JlZ0lEOwkJCQkJCQlcCi0JCQkJCQkJCQkJCQkJCQkJXAotCQlfcmVnSUQgPSAoKF9iVmlhTUNVKSA9PSBUUlVFID8gSDJNX0JCUF9BR0VOVCA6IEJCUF9DU1JfQ0ZHKTsJXAotCQlmb3IgKF9idXN5Q250PTA7IF9idXN5Q250PE1BWF9CVVNZX0NPVU5UOyBfYnVzeUNudCsrKSAgXAotCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJUlRNUF9JT19SRUFEMzIoKF9wQWQpLCBCQlBfQ1NSX0NGRywgJkJicENzci53b3JkKTsgICAgIFwKLQkJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgIFwKLQkJCQljb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCUJicENzci53b3JkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCUJicENzci5maWVsZC5mUmVhZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCUJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCUJicENzci5maWVsZC5CdXN5ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCUJicENzci5maWVsZC5WYWx1ZSA9IF9wVjsgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlCYnBDc3IuZmllbGQuUmVnTnVtID0gX2JicElEOyAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJUlRNUF9JT19XUklURTMyKChfcEFkKSwgQkJQX0NTUl9DRkcsIEJicENzci53b3JkKTsgICAgIFwKLQkJCWlmICgoX2JWaWFNQ1UpID09IFRSVUUpCQkJCQkJCQkJXAotCQkJewkJCQkJCQkJCQkJCQkJXAotCQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KF9wQWQsIDB4ODAsIDB4ZmYsIDB4MCwgMHgwKTsJCVwKLQkJCQlpZiAoKF9wQWQpLT5PcE1vZGUgPT0gT1BNT0RFX0FQKQkJCQkJCVwKLQkJCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsJCQkJCQkJXAotCQkJfQkJCQkJCQkJCQkJCQkJXAotCQkJKF9wQWQpLT5CYnBXcml0ZUxhdGNoW19iYnBJRF0gPSBfcFY7CQkJCQlcCi0JCQlicmVhazsJCQkJCQkJCQkJCQkJXAotCQl9CQkJCQkJCQkJCQkJCQlcCi0JCWlmIChfYnVzeUNudCA9PSBNQVhfQlVTWV9DT1VOVCkJCQkJCQkJCVwKLQkJewkJCQkJCQkJCQkJCQkJXAotCQkJREJHUFJJTlRfRVJSKCgiQkJQIHdyaXRlIFIlZCBmYWlsXG4iLCBfYmJwSUQpKTsJCQkJXAotCQkJaWYoKF9iVmlhTUNVKSA9PSBUUlVFKQkJCQkJCQkJCVwKLQkJCXsJCQkJCQkJCQkJCQkJCVwKLQkJCQlSVE1QX0lPX1JFQUQzMihfcEFkLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOwlcCi0JCQkJQmJwQ3NyLmZpZWxkLkJ1c3kgPSAwOwkJCQkJCQkJCVwKLQkJCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgSDJNX0JCUF9BR0VOVCwgQmJwQ3NyLndvcmQpOwlcCi0JCQl9CQkJCQkJCQkJCQkJCQlcCi0JCX0JCQkJCQkJCQkJCQkJCVwKLQl9d2hpbGUoMCkKLQotCi0vKgotCVRoaXMgbWFyY28gdXNlZCBmb3IgdGhlIEJCUCB3cml0ZSBvcGVyYXRpb24gd2hpY2ggZGlkbid0IG5lZWQgdmlhIE1DVS4KLSovCi0jZGVmaW5lIEJCUF9JT19XUklURThfQllfUkVHX0lEKF9BLCBfSSwgX3BWKQkJCVwKLQlSVE1QX0JCUF9JT19XUklURTgoKF9BKSwgKF9JKSwgKF9wViksIEZBTFNFKQotCi0vKgotCVRoaXMgbWFyY28gdXNlZCBmb3IgdGhlIEJCUCB3cml0ZSBvcGVyYXRpb24gd2hpY2ggbmVlZCB2aWEgTUNVLgotCUJ1dCBmb3Igc29tZSBjaGlwc2V0IHdoaWNoIGRpZG4ndCBoYXZlIG1jdSAoZS5nLiwgUkJVUyBiYXNlZCBjaGlwc2V0KSwgd2UKLQl3aWxsIHVzZSB0aGlzIGZ1bmN0aW9uIHRvbyBhbmQgZGlkbid0IGFjY2VzcyB0aGUgYmJwIHJlZ2lzdGVyIHZpYSB0aGUgTUNVLgotKi8KLSNpZm5kZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZGVmaW5lIFJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpCQkJXAotCWRvewkJCQkJCQkJCQkJCQkJXAotCQlpZiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkJCQkJCQkJXAotCQl7CQkJCQkJCQkJCQkJCVwKLQkJCWlmICgoX0EpLT5pbmZUeXBlID09IFJUTVBfREVWX0lORl9SQlVTKQkJCVwKLQkJCQlSVE1QX0JCUF9JT19XUklURTgoKF9BKSwgKF9JKSwgKF9wViksIEZBTFNFKTsJXAotCQkJZWxzZQkJCQkJCQkJCQkJCVwKLQkJCQlSVE1QX0JCUF9JT19XUklURTgoKF9BKSwgKF9JKSwgKF9wViksIFRSVUUpOwlcCi0JCX0JCQkJCQkJCQkJCQkJXAotCX13aGlsZSgwKQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotLy8gV3JpdGUgQkJQIHJlZ2lzdGVyIGJ5IHJlZ2lzdGVyJ3MgSUQgJiB2YWx1ZQotI2RlZmluZSBSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKF9BLCBfSSwgX1YpCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQkJCVwKLQlCQlBfQ1NSX0NGR19TVFJVQwlCYnBDc3I7CQkJCQkJCQkJCQlcCi0JSU5UCQkJCQlCdXN5Q250ID0gMDsJCQkJCQkJCQkJXAotCUJPT0xFQU4JCQkJCWJyYzsJCQlcCi0JaWYgKF9JIDwgTUFYX05VTV9PRl9CQlBfTEFUQ0gpCQkJCQkJCQkJCVwKLQl7CQkJCQkJCQkJCQkJCQkJCQlcCi0JCWlmICgoSVNfUlQzMDkwKChfQSkpIHx8IElTX1JUMzU3MigoX0EpKSB8fCBJU19SVDMzOTAoKF9BKSkpICYmICgoX0EpLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQlcCi0JCQkmJiAoKF9BKS0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKQlcCi0JCQkmJiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkJXAotCQkJJiYgKChfQSktPmJydDMweHhCYW5NY3VDbWQgPT0gRkFMU0UpKQlcCi0JCXsJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCWlmIChfQS0+QWNjZXNzQkJQRmFpbENvdW50ID4gMjApCQkJCQkJCQkJXAotCQkJewkJCQkJCQkJCQkJCQkJCQkJXAotCQkJCUFzaWNSZXNldEJCUEFnZW50KF9BKTsJCQkJXAotCQkJCV9BLT5BY2Nlc3NCQlBGYWlsQ291bnQgPSAwOwkJCQkJCQkJCQkJXAotCQkJfQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJZm9yIChCdXN5Q250PTA7IEJ1c3lDbnQ8TUFYX0JVU1lfQ09VTlQ7IEJ1c3lDbnQrKykJCQkJCVwKLQkJCXsJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQlSVE1QX0lPX1JFQUQzMihfQSwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsJCQkJXAotCQkJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKQkJCQkJCQkJCVwKLQkJCQkJY29udGludWU7CQkJCQkJCQkJCQkJCVwKLQkJCQlCYnBDc3Iud29yZCA9IDA7CQkJCQkJCQkJCQkJXAotCQkJCUJicENzci5maWVsZC5mUmVhZCA9IDA7CQkJCQkJCQkJCQlcCi0JCQkJQmJwQ3NyLmZpZWxkLkJCUF9SV19NT0RFID0gMTsJCQkJCQkJCQlcCi0JCQkJQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOwkJCQkJCQkJCQkJXAotCQkJCUJicENzci5maWVsZC5WYWx1ZSA9IF9WOwkJCQkJCQkJCQlcCi0JCQkJQmJwQ3NyLmZpZWxkLlJlZ051bSA9IF9JOwkJCQkJCQkJCQlcCi0JCQkJUlRNUF9JT19XUklURTMyKF9BLCBIMk1fQkJQX0FHRU5ULCBCYnBDc3Iud29yZCk7CQkJCVwKLQkJCQlicmMgPSBBc2ljU2VuZENvbW1hbmRUb01jdShfQSwgMHg4MCwgMHhmZiwgMHgwLCAweDApOwkJCQkJXAotCQkJCWlmIChicmMgPT0gVFJVRSkJCQkJCQkJCQkJCQkJCQkJXAotCQkJCXsJCQkJCQkJCQkJCQkJCQkJXAotCQkJCQkoX0EpLT5CYnBXcml0ZUxhdGNoW19JXSA9IF9WOwkJCQkJCQkJCVwKLQkJCQl9CQkJCQkJCQkJCQkJCQkJCVwKLQkJCQllbHNlCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQl7CQkJCQkJCQkJCQkJCQkJCVwKLQkJCQkJQmJwQ3NyLmZpZWxkLkJ1c3kgPSAwOwkJCQkJCQkJCQkJXAotCQkJCQlSVE1QX0lPX1dSSVRFMzIoX0EsIEgyTV9CQlBfQUdFTlQsIEJicENzci53b3JkKTsJCQkJXAotCQkJCX0JCQkJCQkJCQkJCQkJCQkJXAotCQkJCWJyZWFrOwkJCQkJCQkJCQkJCQkJCVwKLQkJCX0JCQkJCQkJCQkJCQkJCQkJCVwKLQkJfQkJCQkJCQkJCQkJCQkJCQkJXAotCQllbHNlIGlmICghKChJU19SVDMwOTAoKF9BKSkgfHwgSVNfUlQzNTcyKChfQSkpIHx8IElTX1JUMzM5MCgoX0EpKSkgJiYgKChfQSktPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID09IDMpCVwKLQkJCSYmICgoX0EpLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpKQlcCi0JCQkmJiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkpCVwKLQkJewkJCQkJCQkJCQkJCQkJCQkJXAotCQkJaWYgKF9BLT5BY2Nlc3NCQlBGYWlsQ291bnQgPiAyMCkJCQkJCQkJCQlcCi0JCQl7CQkJCQkJCQkJCQkJCQkJCQlcCi0JCQkJQXNpY1Jlc2V0QkJQQWdlbnQoX0EpOwkJCQlcCi0JCQkJX0EtPkFjY2Vzc0JCUEZhaWxDb3VudCA9IDA7CQkJCQkJCQkJCQlcCi0JCQl9CQkJCQkJCQkJCQkJCQkJCQlcCi0JCQlmb3IgKEJ1c3lDbnQ9MDsgQnVzeUNudDxNQVhfQlVTWV9DT1VOVDsgQnVzeUNudCsrKQkJCQkJXAotCQkJewkJCQkJCQkJCQkJCQkJCQkJXAotCQkJCVJUTVBfSU9fUkVBRDMyKF9BLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOwkJCQlcCi0JCQkJaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpCQkJCQkJCQkJXAotCQkJCQljb250aW51ZTsJCQkJCQkJCQkJCQkJXAotCQkJCUJicENzci53b3JkID0gMDsJCQkJCQkJCQkJCQlcCi0JCQkJQmJwQ3NyLmZpZWxkLmZSZWFkID0gMDsJCQkJCQkJCQkJCVwKLQkJCQlCYnBDc3IuZmllbGQuQkJQX1JXX01PREUgPSAxOwkJCQkJCQkJCVwKLQkJCQlCYnBDc3IuZmllbGQuQnVzeSA9IDE7CQkJCQkJCQkJCQlcCi0JCQkJQmJwQ3NyLmZpZWxkLlZhbHVlID0gX1Y7CQkJCQkJCQkJCVwKLQkJCQlCYnBDc3IuZmllbGQuUmVnTnVtID0gX0k7CQkJCQkJCQkJCVwKLQkJCQlSVE1QX0lPX1dSSVRFMzIoX0EsIEgyTV9CQlBfQUdFTlQsIEJicENzci53b3JkKTsJCQkJXAotCQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KF9BLCAweDgwLCAweGZmLCAweDAsIDB4MCk7CQkJCQlcCi0JCQkJKF9BKS0+QmJwV3JpdGVMYXRjaFtfSV0gPSBfVjsJCQkJCQkJCQlcCi0JCQkJYnJlYWs7CQkJCQkJCQkJCQkJCQkJXAotCQkJfQkJCQkJCQkJCQkJCQkJCQkJXAotCQl9CQkJCQkJCQkJCQkJCQkJCQlcCi0JCWVsc2UJCQkJCQkJCQkJXAotCQl7CQkJCQkJCQkJCQkJCQkJCQlcCi0JCQlEQkdQUklOVF9FUlIoKCIgIGJydDMweHhCYW5NY3VDbWQgPSAlZC4gV3JpdGUgQkJQICVkIFxuIiwgIChfQSktPmJydDMweHhCYW5NY3VDbWQsIChfSSkpKTsJXAotCQl9CQkJCQkJCQkJCQkJCQkJCQlcCi0JCWlmICgoQnVzeUNudCA9PSBNQVhfQlVTWV9DT1VOVCkgfHwgKChfQSktPmJQQ0ljbGtPZmYgPT0gVFJVRSkpCQkJXAotCQl7CQkJCQkJCQkJCQkJCQkJCQlcCi0JCQlpZiAoQnVzeUNudCA9PSBNQVhfQlVTWV9DT1VOVCkJCQkJCVwKLQkJCQkoX0EpLT5BY2Nlc3NCQlBGYWlsQ291bnQrKzsJCQkJCVwKLQkJCURCR1BSSU5UX0VSUigoIkJCUCB3cml0ZSBSJWQ9MHgleCBmYWlsLiBCdXN5Q250PSAlZC5iUENJY2xrT2ZmID0gJWQuIFxuIiwgX0ksIEJicENzci53b3JkLCBCdXN5Q250LCAoX0EpLT5iUENJY2xrT2ZmICkpOwlcCi0JCX0JCQkJCQkJCQkJCQkJCQkJCVwKLQl9CQkJCQkJCQkJCQkJCQkJCQkJXAotCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCi0JewkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJREJHUFJJTlRfRVJSKCgiKioqKioqIEJCUF9Xcml0ZV9MYXRjaCBCdWZmZXIgZXhjZWVkcyBtYXggYm91bmRyeSAqKioqKiogXG4iKSk7CVwKLQl9CQkJCQkJCQkJCQkJCQkJCQkJXAotfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0KLQotI2lmZGVmIFJUMzB4eAotLy9OZWVkIHRvIGNvbGxlY3QgZWFjaCBhbnQncyByc3NpIGNvbmN1cnJlbnRseQotLy9yc3NpMSBpcyByZXBvcnQgdG8gcGFpcjIgQW50IGFuZCByc3MyIGlzIHJlcHJvdCB0byBwYWlyMSBBbnQgd2hlbiA0IEFudAotI2RlZmluZSBDT0xMRUNUX1JYX0FOVEVOTkFfQVZFUkFHRV9SU1NJKF9wQWQsIF9yc3NpMSwgX3Jzc2kyKQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCVNIT1JUCUF2Z1Jzc2k7CQkJCQkJCQkJCQkJCQkJXAotCVVDSEFSCVVzZWRBbnQ7CQkJCQkJCQkJCQkJCQkJXAotCWlmIChfcEFkLT5SeEFudC5FdmFsdWF0ZVBlcmlvZCA9PSAwKQkJCQkJCQkJCVwKLQl7CQkJCQkJCQkJCQkJCQkJCQkJXAotCQlVc2VkQW50ID0gX3BBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQ7CQkJCQkJCVwKLQkJQXZnUnNzaSA9IF9wQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVtVc2VkQW50XTsJCQkJCQlcCi0JCWlmIChBdmdSc3NpIDwgMCkJCQkJCQkJCQkJCQkJXAotCQkJQXZnUnNzaSA9IEF2Z1Jzc2kgLSAoQXZnUnNzaSA+PiAzKSArIF9yc3NpMTsJCQkJCVwKLQkJZWxzZQkJCQkJCQkJCQkJCQkJCQlcCi0JCQlBdmdSc3NpID0gX3Jzc2kxIDw8IDM7CQkJCQkJCQkJCQlcCi0JCV9wQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVtVc2VkQW50XSA9IEF2Z1Jzc2k7CQkJCQkJXAotCX0JCQkJCQkJCQkJCQkJCQkJCQlcCi0JZWxzZQkJCQkJCQkJCQkJCQkJCQkJXAotCXsJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCVVzZWRBbnQgPSBfcEFkLT5SeEFudC5QYWlyMVNlY29uZGFyeVJ4QW50OwkJCQkJCQlcCi0JCUF2Z1Jzc2kgPSBfcEFkLT5SeEFudC5QYWlyMUF2Z1Jzc2lbVXNlZEFudF07CQkJCQkJXAotCQlpZiAoKEF2Z1Jzc2kgPCAwKSAmJiAoX3BBZC0+UnhBbnQuRmlyc3RQa3RBcnJpdmVkV2hlbkV2YWx1YXRlKSkJCVwKLQkJCUF2Z1Jzc2kgPSBBdmdSc3NpIC0gKEF2Z1Jzc2kgPj4gMykgKyBfcnNzaTE7CQkJCQlcCi0JCWVsc2UJCQkJCQkJCQkJCQkJCQkJXAotCQl7CQkJCQkJCQkJCQkJCQkJCQlcCi0JCQlfcEFkLT5SeEFudC5GaXJzdFBrdEFycml2ZWRXaGVuRXZhbHVhdGUgPSBUUlVFOwkJCQkJXAotCQkJQXZnUnNzaSA9IF9yc3NpMSA8PCAzOwkJCQkJCQkJCQkJXAotCQl9CQkJCQkJCQkJCQkJCQkJCQlcCi0JCV9wQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVtVc2VkQW50XSA9IEF2Z1Jzc2k7CQkJCQkJXAotCQlfcEFkLT5SeEFudC5SY3ZQa3ROdW1XaGVuRXZhbHVhdGUrKzsJCQkJCQkJCVwKLQl9CQkJCQkJCQkJCQkJCQkJCQkJXAotfQotCi0jZGVmaW5lIFJUTVBfQVNJQ19NTVBTX0RJU0FCTEUoX3BBZCkJCQkJCQkJXAotCWRvewkJCQkJCQkJCQkJCQkJCVwKLQkJVUNIQVIgX2JicERhdGE7CQkJCQkJCQkJCQlcCi0JCVVJTlQzMiBfbWFjRGF0YTsJCQkJCQkJCQkJCVwKLQkJLyogZGlzYWJsZSBNTVBTIEJCUCBjb250cm9sIHJlZ2lzdGVyICovCQkJCQkJXAotCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQoX3BBZCwgQkJQX1IzLCAmX2JicERhdGEpOwlcCi0JCV9iYnBEYXRhICY9IH4oMHgwNCk7CS8qYml0IDIqLwkJCQkJCQkJXAotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKF9wQWQsIEJCUF9SMywgX2JicERhdGEpOwlcCi0JCQkJCQkJCQkJCQkJCQkJXAotCQkvKiBkaXNhYmxlIE1NUFMgTUFDIGNvbnRyb2wgcmVnaXN0ZXIgKi8JCQkJCQlcCi0JCVJUTVBfSU9fUkVBRDMyKF9wQWQsIDB4MTIxMCwgJl9tYWNEYXRhKTsJCQkJXAotCQlfbWFjRGF0YSAmPSB+KDB4MDkpOwkvKmJpdCAwLCAzKi8JCQkJCQkJXAotCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgMHgxMjEwLCBfbWFjRGF0YSk7CQkJCVwKLQl9d2hpbGUoMCkKLQotCi0jZGVmaW5lIFJUTVBfQVNJQ19NTVBTX0VOQUJMRShfcEFkKQkJCQkJCQlcCi0JZG97CQkJCQkJCQkJCQkJCQkJXAotCQlVQ0hBUiBfYmJwRGF0YTsJCQkJCQkJCQkJCVwKLQkJVUlOVDMyIF9tYWNEYXRhOwkJCQkJCQkJCQkJXAotCQkvKiBlbmFibGUgTU1QUyBCQlAgY29udHJvbCByZWdpc3RlciAqLwkJCQkJCVwKLQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKF9wQWQsIEJCUF9SMywgJl9iYnBEYXRhKTsJXAotCQlfYmJwRGF0YSB8PSAoMHgwNCk7CS8qYml0IDIqLwkJCQkJCQkJXAotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKF9wQWQsIEJCUF9SMywgX2JicERhdGEpOwlcCi0JCQkJCQkJCQkJCQkJCQkJXAotCQkvKiBlbmFibGUgTU1QUyBNQUMgY29udHJvbCByZWdpc3RlciAqLwkJCQkJCVwKLQkJUlRNUF9JT19SRUFEMzIoX3BBZCwgMHgxMjEwLCAmX21hY0RhdGEpOwkJCQlcCi0JCV9tYWNEYXRhIHw9ICgweDA5KTsJLypiaXQgMCwgMyovCQkJCQkJCVwKLQkJUlRNUF9JT19XUklURTMyKF9wQWQsIDB4MTIxMCwgX21hY0RhdGEpOwkJCQlcCi0JfXdoaWxlKDApCi0KLSNlbmRpZiAvLyBSVDMweHggLy8KLQotI2VuZGlmIC8vIF9fUlRNUF9QSFlfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfdGltZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRtcF90aW1lci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmFjMTI0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRtcF90aW1lci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0JcnRtcF90aW1lci5oCi0KLSAgICBBYnN0cmFjdDoKLQlSYWxpbmsgV2lyZWxlc3MgRHJpdmVyIHRpbWVyIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBkZWxjYXJhdGlvbnMKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvICAgICAgICAgICBXaGVuICAgICAgICAgICAgICAgIFdoYXQKLQktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCU5hbWUgICAgICAgICAgRGF0ZSAgICAgICAgICAgICAgICAgTW9kaWZpY2F0aW9uIGxvZ3MKLQlTaGlhbmcgVHUgICAgQXVnLTI4LTIwMDgJaW5pdCB2ZXJzaW9uCi0KLSovCi0KLSNpZm5kZWYgX19SVE1QX1RJTUVSX0hfXwotI2RlZmluZSAgX19SVE1QX1RJTUVSX0hfXwotCi0jaW5jbHVkZSAicnRtcF9vcy5oIgotCi0KLSNkZWZpbmUgREVDTEFSRV9USU1FUl9GVU5DVElPTihfZnVuYykJCQlcCi0Jdm9pZCBydG1wX3RpbWVyXyMjX2Z1bmModW5zaWduZWQgbG9uZyBkYXRhKQotCi0jZGVmaW5lIEdFVF9USU1FUl9GVU5DVElPTihfZnVuYykJCQkJXAotCXJ0bXBfdGltZXJfIyNfZnVuYwotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tIFRpbWVyIFJlbGF0ZWQgTUFSQ08gLS0tLS0tLS0tLS0tLS0tKi8KLS8vIEluIHNvbWUgb3Mgb3IgY2hpcHNldCwgd2UgaGF2ZSBhIGxvdCBvZiB0aW1lciBmdW5jdGlvbnMgYW5kIHdpbGwgcmVhZC93cml0ZSByZWdpc3RlciwKLS8vICAgaXQncyBub3QgYWxsb3dlZCBpbiBMaW51eCBVU0Igc3ViLXN5c3RlbSB0byBkbyBpdCAoIGJlY2F1c2Ugb2Ygc2xlZXAgaXNzdWUgd2hlbgotLy8gIHN1Ym1pdCB0byBjdHJsIHBpcGUpLiBTbyB3ZSBuZWVkIGEgd3JhcHBlciBmdW5jdGlvbiB0byB0YWtlIGNhcmUgaXQuCi0KLSNpZmRlZiBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVAotdHlwZWRlZiBWT0lEICgqUlRNUF9USU1FUl9UQVNLX0hBTkRMRSkoCi0JSU4gIFBWT0lEICAgU3lzdGVtU3BlY2lmaWMxLAotCUlOICBQVk9JRCAgIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiAgUFZPSUQgICBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gIFBWT0lEICAgU3lzdGVtU3BlY2lmaWMzKTsKLSNlbmRpZiAvLyBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVCAvLwotCi10eXBlZGVmIHN0cnVjdCAgX1JBTElOS19USU1FUl9TVFJVQ1QgICAgewotCVJUTVBfT1NfVElNRVIJCVRpbWVyT2JqOyAgICAgICAvLyBOZGlzIFRpbWVyIG9iamVjdAotCUJPT0xFQU4JCQkJVmFsaWQ7CQkJLy8gU2V0IHRvIFRydWUgd2hlbiBjYWxsIFJUTVBJbml0VGltZXIKLQlCT09MRUFOCQkJCVN0YXRlOyAgICAgICAgICAvLyBUcnVlIGlmIHRpbWVyIGNhbmNlbGxlZAotCUJPT0xFQU4JCQkJUGVyaW9kaWNUeXBlOwkvLyBUcnVlIGlmIHRpbWVyIGlzIHBlcmlvZGljIHRpbWVyCi0JQk9PTEVBTgkJCQlSZXBlYXQ7ICAgICAgICAgLy8gVHJ1ZSBpZiBwZXJpb2RpYyB0aW1lcgotCVVMT05HCQkJCVRpbWVyVmFsdWU7ICAgICAvLyBUaW1lciB2YWx1ZSBpbiBtaWxsaXNlY29uZHMKLQlVTE9ORwkJCQljb29raWU7CQkJLy8gb3Mgc3BlY2lmaWMgb2JqZWN0Ci0jaWZkZWYgUlRNUF9USU1FUl9UQVNLX1NVUFBPUlQKLQlSVE1QX1RJTUVSX1RBU0tfSEFORExFCWhhbmRsZTsKLQl2b2lkCQkJCQkqcEFkOwotI2VuZGlmIC8vIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUIC8vCi19UkFMSU5LX1RJTUVSX1NUUlVDVCwgKlBSQUxJTktfVElNRVJfU1RSVUNUOwotCi0KLSNpZmRlZiBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVAotdHlwZWRlZiBzdHJ1Y3QgX1JUTVBfVElNRVJfVEFTS19FTlRSWV8KLXsKLQlSQUxJTktfVElNRVJfU1RSVUNUCQkJKnBSYVRpbWVyOwotCXN0cnVjdCBfUlRNUF9USU1FUl9UQVNLX0VOVFJZXwkqcE5leHQ7Ci19UlRNUF9USU1FUl9UQVNLX0VOVFJZOwotCi0KLSNkZWZpbmUgVElNRVJfUVVFVUVfU0laRV9NQVgJMTI4Ci10eXBlZGVmIHN0cnVjdCBfUlRNUF9USU1FUl9UQVNLX1FVRVVFXwotewotCXVuc2lnbmVkIGludAkJCQlzdGF0dXM7Ci0JdW5zaWduZWQgY2hhcgkJCQkqcFRpbWVyUVBvbGw7Ci0JUlRNUF9USU1FUl9UQVNLX0VOVFJZCSpwUVBvbGxGcmVlTGlzdDsKLQlSVE1QX1RJTUVSX1RBU0tfRU5UUlkJKnBRSGVhZDsKLQlSVE1QX1RJTUVSX1RBU0tfRU5UUlkJKnBRVGFpbDsKLX1SVE1QX1RJTUVSX1RBU0tfUVVFVUU7Ci0KLSNkZWZpbmUgQlVJTERfVElNRVJfRlVOQ1RJT04oX2Z1bmMpCQkJCQkJCQkJCVwKLXZvaWQgcnRtcF90aW1lcl8jI19mdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSkJCQkJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JUFJBTElOS19USU1FUl9TVFJVQ1QJX3BUaW1lciA9IChQUkFMSU5LX1RJTUVSX1NUUlVDVClkYXRhOwkJCQlcCi0JUlRNUF9USU1FUl9UQVNLX0VOVFJZCSpfcFFOb2RlOwkJCQkJCQkJCQlcCi0JUlRNUF9BREFQVEVSCQkJKl9wQWQ7CQkJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQkJCQkJCQkJXAotCV9wVGltZXItPmhhbmRsZSA9IF9mdW5jOwkJCQkJCQkJCQkJCQlcCi0JX3BBZCA9IChSVE1QX0FEQVBURVIgKilfcFRpbWVyLT5wQWQ7CQkJCQkJCQkJCVwKLQlfcFFOb2RlID0gUnRtcFRpbWVyUUluc2VydChfcEFkLCBfcFRpbWVyKTsJCQkJCQkJCVwKLQlpZiAoKF9wUU5vZGUgPT0gTlVMTCkgJiYgKF9wQWQtPlRpbWVyUS5zdGF0dXMgJiBSVE1QX1RBU0tfQ0FOX0RPX0lOU0VSVCkpCVwKLQkJUlRNUF9PU19BZGRfVGltZXIoJl9wVGltZXItPlRpbWVyT2JqLCBPU19IWik7CQkJCQkJCVwKLX0KLSNlbHNlCi0jZGVmaW5lIEJVSUxEX1RJTUVSX0ZVTkNUSU9OKF9mdW5jKQkJCQkJCQkJCQlcCi12b2lkIHJ0bXBfdGltZXJfIyNfZnVuYyh1bnNpZ25lZCBsb25nIGRhdGEpCQkJCQkJCQkJCVwKLXsJCQkJCQkJCQkJCQkJCQkJCQkJXAotCVBSQUxJTktfVElNRVJfU1RSVUNUCXBUaW1lciA9IChQUkFMSU5LX1RJTUVSX1NUUlVDVCkgZGF0YTsJCQkJXAotCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQlfZnVuYyhOVUxMLCAoUFZPSUQpIHBUaW1lci0+Y29va2llLCBOVUxMLCBwVGltZXIpOwkJCQkJCQlcCi0JaWYgKHBUaW1lci0+UmVwZWF0KQkJCQkJCQkJCQkJCQkJXAotCQlSVE1QX09TX0FkZF9UaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgcFRpbWVyLT5UaW1lclZhbHVlKTsJCQlcCi19Ci0jZW5kaWYgLy8gUlRNUF9USU1FUl9UQVNLX1NVUFBPUlQgLy8KLQotCi1ERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKE1sbWVQZXJpb2RpY0V4ZWMpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihNbG1lUnNzaVJlcG9ydEV4ZWMpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihBc2ljUnhBbnRFdmFsVGltZW91dCk7Ci1ERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEFQU0RQZXJpb2RpY0V4ZWMpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihBc2ljUmZUdW5pbmdFeGVjKTsKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1ERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEJlYWNvblRpbWVvdXQpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihTY2FuVGltZW91dCk7Ci1ERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEF1dGhUaW1lb3V0KTsKLURFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQXNzb2NUaW1lb3V0KTsKLURFQ0xBUkVfVElNRVJfRlVOQ1RJT04oUmVhc3NvY1RpbWVvdXQpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihEaXNhc3NvY1RpbWVvdXQpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihMaW5rRG93bkV4ZWMpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKTsKLURFQ0xBUkVfVElNRVJfRlVOQ1RJT04oV3BhRGlzYXNzb2NBcEFuZEJsb2NrQXNzb2MpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihQc1BvbGxXYWtlRXhlYyk7Ci1ERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFJhZGlvT25FeGVjKTsKLQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotREVDTEFSRV9USU1FUl9GVU5DVElPTihEbHNUaW1lb3V0QWN0aW9uKTsKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQotCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCi0KLSNpZiBkZWZpbmVkKEFQX0xFRCkgfHwgZGVmaW5lZChTVEFfTEVEKQotREVDTEFSRV9USU1FUl9GVU5DVElPTihMZWRDdHJsTWFpbik7Ci0jZW5kaWYKLQotCi0KLSNlbmRpZiAvLyBfX1JUTVBfVElNRVJfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfdHlwZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX3R5cGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhiNTcxZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfdHlwZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgcnRtcF90eXBlLmgKLQotICAgIEFic3RyYWN0OgotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgTmFtZSAgICAgICAgRGF0ZSAgICAgICAgICAgIE1vZGlmaWNhdGlvbiBsb2dzCi0gICAgUGF1bCBMaW4gICAgMS0yLTIwMDQKLSovCi0KLSNpZm5kZWYgX19SVE1QX1RZUEVfSF9fCi0jZGVmaW5lIF9fUlRNUF9UWVBFX0hfXwotCi0KLSNkZWZpbmUgUEFDS0VEICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKLQotI2lmZGVmIExJTlVYCi0vLyBQdXQgcGxhdGZvcm0gZGVwZW5kZW50IGRlY2xhcmF0aW9uIGhlcmUKLS8vIEZvciBleGFtcGxlLCBsaW51eCB0eXBlIGRlZmluaXRpb24KLXR5cGVkZWYgdW5zaWduZWQgY2hhcgkJCVVJTlQ4OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJCVVJTlQxNjsKLXR5cGVkZWYgdW5zaWduZWQgaW50CQkJVUlOVDMyOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcJCVVJTlQ2NDsKLXR5cGVkZWYgaW50CQkJCQlJTlQzMjsKLXR5cGVkZWYgbG9uZyBsb25nCQkJCUlOVDY0OwotI2VuZGlmIC8vIExJTlVYIC8vCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAqCQlQVUlOVDg7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICoJCVBVSU5UMTY7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAqCQkJUFVJTlQzMjsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICoJUFVJTlQ2NDsKLXR5cGVkZWYgaW50CSoJCQkJUElOVDMyOwotdHlwZWRlZiBsb25nIGxvbmcgKgkJCVBJTlQ2NDsKLQotLy8gbW9kaWZpZWQgZm9yIGZpeGluZyBjb21waWxlIHdhcm5pbmcgb24gU2lnbWEgODYzNCBwbGF0Zm9ybQotdHlwZWRlZiBjaGFyCQkJCQlTVFJJTkc7Ci10eXBlZGVmIHNpZ25lZCBjaGFyCQkJQ0hBUjsKLQotdHlwZWRlZiBzaWduZWQgc2hvcnQJCQlTSE9SVDsKLXR5cGVkZWYgc2lnbmVkIGludAkJCQlJTlQ7Ci10eXBlZGVmIHNpZ25lZCBsb25nCQkJTE9ORzsKLXR5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZwkJTE9OR0xPTkc7Ci0KLQotI2lmZGVmIExJTlVYCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIJCQlVQ0hBUjsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQJCQlVU0hPUlQ7Ci10eXBlZGVmIHVuc2lnbmVkIGludAkJCVVJTlQ7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcJCQlVTE9ORzsKLSNlbmRpZiAvLyBMSU5VWCAvLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcJCVVMT05HTE9ORzsKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyCQkJQk9PTEVBTjsKLSNpZmRlZiBMSU5VWAotdHlwZWRlZiB2b2lkCQkJCQlWT0lEOwotI2VuZGlmIC8vIExJTlVYIC8vCi0KLXR5cGVkZWYgY2hhciAqCQkJCVBTVFJJTkc7Ci10eXBlZGVmIFZPSUQgKgkJCQlQVk9JRDsKLXR5cGVkZWYgQ0hBUiAqCQkJCVBDSEFSOwotdHlwZWRlZiBVQ0hBUiAqCQkJCQlQVUNIQVI7Ci10eXBlZGVmIFVTSE9SVCAqCQkJUFVTSE9SVDsKLXR5cGVkZWYgTE9ORyAqCQkJCVBMT05HOwotdHlwZWRlZiBVTE9ORyAqCQkJCVBVTE9ORzsKLXR5cGVkZWYgVUlOVCAqCQkJCVBVSU5UOwotCi10eXBlZGVmIHVuc2lnbmVkIGludAkJCU5ESVNfTUVESUFfU1RBVEU7Ci0KLXR5cGVkZWYgdW5pb24gX0xBUkdFX0lOVEVHRVIgewotICAgIHN0cnVjdCB7Ci0gICAgICAgIFVJTlQgTG93UGFydDsKLSAgICAgICAgSU5UMzIgSGlnaFBhcnQ7Ci0gICAgfSB1OwotICAgIElOVDY0IFF1YWRQYXJ0OwotfSBMQVJHRV9JTlRFR0VSOwotCi0KLS8vCi0vLyBSZWdpc3RlciBzZXQgcGFpciBmb3IgaW5pdGlhbHphdGlvbiByZWdpc3RlciBzZXQgZGVmaW5pdGlvbgotLy8KLXR5cGVkZWYgc3RydWN0ICBfUlRNUF9SRUdfUEFJUgotewotCVVMT05HICAgUmVnaXN0ZXI7Ci0JVUxPTkcgICBWYWx1ZTsKLX0gUlRNUF9SRUdfUEFJUiwgKlBSVE1QX1JFR19QQUlSOwotCi10eXBlZGVmIHN0cnVjdCAgX1JFR19QQUlSCi17Ci0JVUNIQVIgICBSZWdpc3RlcjsKLQlVQ0hBUiAgIFZhbHVlOwotfSBSRUdfUEFJUiwgKlBSRUdfUEFJUjsKLQotLy8KLS8vIFJlZ2lzdGVyIHNldCBwYWlyIGZvciBpbml0aWFsemF0aW9uIHJlZ2lzdGVyIHNldCBkZWZpbml0aW9uCi0vLwotdHlwZWRlZiBzdHJ1Y3QgIF9SVE1QX1JGX1JFR1MKLXsKLQlVQ0hBUiAgIENoYW5uZWw7Ci0JVUxPTkcgICBSMTsKLQlVTE9ORyAgIFIyOwotCVVMT05HICAgUjM7Ci0JVUxPTkcgICBSNDsKLX0gUlRNUF9SRl9SRUdTLCAqUFJUTVBfUkZfUkVHUzsKLQotdHlwZWRlZiBzdHJ1Y3QgX0ZSRVFVRU5DWV9JVEVNIHsKLQlVQ0hBUglDaGFubmVsOwotCVVDSEFSCU47Ci0JVUNIQVIJUjsKLQlVQ0hBUglLOwotfSBGUkVRVUVOQ1lfSVRFTSwgKlBGUkVRVUVOQ1lfSVRFTTsKLQotCi10eXBlZGVmIGludAkJCQlOVFNUQVRVUzsKLQotCi0jZGVmaW5lIFNUQVRVU19TVUNDRVNTCQkJCTB4MDAKLSNkZWZpbmUgU1RBVFVTX1VOU1VDQ0VTU0ZVTAkJMHgwMQotCi0jZW5kaWYgIC8vIF9fUlRNUF9UWVBFX0hfXyAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zcGVjdHJ1bS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zcGVjdHJ1bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTliYWU1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3BlY3RydW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9fU1BFQ1RSVU1fSF9fCi0jZGVmaW5lIF9fU1BFQ1RSVU1fSF9fCi0KLSNpbmNsdWRlICJydG1wX3R5cGUuaCIKLSNpbmNsdWRlICJzcGVjdHJ1bV9kZWYuaCIKLQotCi1DSEFSIFJUTVBfR2V0VHhQd3IoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gSFRUUkFOU01JVF9TRVRUSU5HIEhUVHhNb2RlKTsKLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlQcmVwYXJlIE1lYXN1cmVtZW50IHJlcXVlc3QgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KLQkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KLQotCVBhcmFtZXRyczoKLQkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNYWtlTWVhc3VyZW1lbnRSZXFGcmFtZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBPdXRCdWZmZXIsCi0JT1VUIFBVTE9ORyBwRnJhbWVMZW4sCi0JSU4gVUlOVDggVG90YWxMZW4sCi0JSU4gVUlOVDggQ2F0ZWdvcnksCi0JSU4gVUlOVDggQWN0aW9uLAotCUlOIFVJTlQ4IE1lYXN1cmVUb2tlbiwKLQlJTiBVSU5UOCBNZWFzdXJlUmVxTW9kZSwKLQlJTiBVSU5UOCBNZWFzdXJlUmVxVHlwZSwKLQlJTiBVSU5UOCBOdW1PZlJlcGV0aXRpb25zKTsKLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlQcmVwYXJlIE1lYXN1cmVtZW50IHJlcG9ydCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bwotCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgotCi0JUGFyYW1ldHJzOgotCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEVucXVldWVNZWFzdXJlbWVudFJlcCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcERBLAotCUlOIFVJTlQ4IERpYWxvZ1Rva2VuLAotCUlOIFVJTlQ4IE1lYXN1cmVUb2tlbiwKLQlJTiBVSU5UOCBNZWFzdXJlUmVxTW9kZSwKLQlJTiBVSU5UOCBNZWFzdXJlUmVxVHlwZSwKLQlJTiBVSU5UOCBSZXBvcnRJbmZvTGVuLAotCUlOIFBVSU5UOCBwUmVwb3J0SW5mbyk7Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJUHJlcGFyZSBUUEMgUmVxdWVzdCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bwotCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgotCi0JUGFyYW1ldHJzOgotCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEVucXVldWVUUENSZXEoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBVQ0hBUiBEaWFsb2dUb2tlbik7Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJUHJlcGFyZSBUUEMgUmVwb3J0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCi0JCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCi0KLQlQYXJhbWV0cnM6Ci0JCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCi0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgRW5xdWV1ZVRQQ1JlcCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcERBLAotCUlOIFVJTlQ4IERpYWxvZ1Rva2VuLAotCUlOIFVJTlQ4IFR4UHdyLAotCUlOIFVJTlQ4IExpbmtNYXJnaW4pOwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVByZXBhcmUgQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCi0JCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCi0KLQlQYXJhbWV0cnM6Ci0JCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCi0JCTIuIENoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBtb2RlLgotCQkyLiBhIE5ldyBzZWxlY3RlZCBjaGFubmVsLgotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEVucXVldWVDaFN3QW5uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwREEsCi0JSU4gVUlOVDggQ2hTd01vZGUsCi0JSU4gVUlOVDggTmV3Q2gpOwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVNwZWN0cnVuIGFjdGlvbiBmcmFtZXMgSGFuZGxlciBzdWNoIGFzIGNoYW5uZWwgc3dpdGNoIGFubm91Y2VtZW50LAotCQltZWFzdXJlbWVudCByZXBvcnQsIG1lYXN1cmVtZW50IHJlcXVlc3QgYWN0aW9ucyBmcmFtZXMuCi0KLQlQYXJhbWV0cnM6Ci0JCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBQZWVyU3BlY3RydW1BY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JUGFyYW1ldHJzOgotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1JTlQgU2V0X01lYXN1cmVSZXFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9UcGNSZXFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9Qd3JDb25zdHJhaW50KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi0KLVZPSUQgTWVhc3VyZVJlcVRhYkluaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIE1lYXN1cmVSZXFUYWJFeGl0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotUE1FQVNVUkVfUkVRX0VOVFJZIE1lYXN1cmVSZXFMb29rVXAoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUlOVDgJCQlEaWFsb2dUb2tlbik7Ci0KLVBNRUFTVVJFX1JFUV9FTlRSWSBNZWFzdXJlUmVxSW5zZXJ0KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pOwotCi1WT0lEIE1lYXN1cmVSZXFEZWxldGUoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUlOVDgJCQlEaWFsb2dUb2tlbik7Ci0KLVZPSUQgSW5zZXJ0Q2hhbm5lbFJlcElFKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAotCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAotCUlOIFBTVFJJTkcgcENvdW50cnksCi0JSU4gVUlOVDggUmVndWxhdG9yeUNsYXNzKTsKLQotVk9JRCBJbnNlcnRUcGNSZXBvcnRJRSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbiwKLQlJTiBVSU5UOCBUeFB3ciwKLQlJTiBVSU5UOCBMaW5rTWFyZ2luKTsKLQotVk9JRCBJbnNlcnREaWFsb2dUb2tlbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbiwKLQlJTiBVSU5UOCBEaWFsb2dUb2tlbik7Ci0KLVZPSUQgVHBjUmVxVGFiSW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgVHBjUmVxVGFiRXhpdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgTm90aWZ5Q2hTd0FublRvUGVlckFQcygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcFJBLAotCUlOIFBVQ0hBUiBwVEEsCi0JSU4gVUlOVDggQ2hTd01vZGUsCi0JSU4gVUlOVDggQ2hhbm5lbCk7Ci0KLVZPSUQgUmd1Q2xhc3NfQnVpbGRCY25DaExpc3QoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JT1VUIFBVQ0hBUiBwQnVmLAotCU9VVAlQVUxPTkcgcEJ1Zkxlbik7Ci0jZW5kaWYgLy8gX19TUEVDVFJVTV9IX18gLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3BlY3RydW1fZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3NwZWN0cnVtX2RlZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzg5YjA5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3BlY3RydW1fZGVmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLQlzcGVjdHJ1bV9kZWYuaAotCi0gICAgQWJzdHJhY3Q6Ci0gICAgSGFuZGxlIGFzc29jaWF0aW9uIHJlbGF0ZWQgcmVxdWVzdHMgZWl0aGVyIGZyb20gV1NUQSBvciBmcm9tIGxvY2FsIE1MTUUKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlGb25jaGkgV3UgICAgMjAwOAkJICAgY3JlYXRlZCBmb3IgODAyLjExaAotICovCi0KLSNpZm5kZWYgX19TUEVDVFJVTV9ERUZfSF9fCi0jZGVmaW5lIF9fU1BFQ1RSVU1fREVGX0hfXwotCi0KLSNkZWZpbmUgTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFCQkzMgotI2RlZmluZSBNQVhfSEFTSF9NRUFTVVJFX1JFUV9UQUJfU0laRQlNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkUKLQotI2RlZmluZSBNQVhfVFBDX1JFUV9UQUJfU0laRQkJCTMyCi0jZGVmaW5lIE1BWF9IQVNIX1RQQ19SRVFfVEFCX1NJWkUJCU1BWF9UUENfUkVRX1RBQl9TSVpFCi0KLSNkZWZpbmUgTUlOX1JDVl9QV1IJCQkJMTAwCQkvKiBOZWdhdGl2ZSB2YWx1ZSAoKGRCbSkgKi8KLQotI2RlZmluZSBUUENfUkVRX0FHRV9PVVQJCQk1MDAJCS8qIG1zICovCi0jZGVmaW5lIE1RX1JFUV9BR0VfT1VUCQkJNTAwCQkvKiBtcyAqLwotCi0jZGVmaW5lIFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKF9EaWFsb2dUb2tlbikJKChfRGlhbG9nVG9rZW4pICUgTUFYX0hBU0hfVFBDX1JFUV9UQUJfU0laRSkKLSNkZWZpbmUgTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChfRGlhbG9nVG9rZW4pCQkoKF9EaWFsb2dUb2tlbikgJSBNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkUpCi0KLXR5cGVkZWYgc3RydWN0IF9NRUFTVVJFX1JFUV9FTlRSWQotewotCXN0cnVjdCBfTUVBU1VSRV9SRVFfRU5UUlkgKnBOZXh0OwotCVVMT05HIGxhc3RUaW1lOwotCUJPT0xFQU4JVmFsaWQ7Ci0JVUlOVDggRGlhbG9nVG9rZW47Ci0JVUlOVDggTWVhc3VyZURpYWxvZ1Rva2VuWzNdOwkvLyAwOmJhc2ljIG1lYXN1cmUsIDE6IENDQSBtZWFzdXJlLCAyOiBSUElfSGlzdG9ncmFtIG1lYXN1cmUuCi19IE1FQVNVUkVfUkVRX0VOVFJZLCAqUE1FQVNVUkVfUkVRX0VOVFJZOwotCi10eXBlZGVmIHN0cnVjdCBfTUVBU1VSRV9SRVFfVEFCCi17Ci0JVUNIQVIgU2l6ZTsKLQlQTUVBU1VSRV9SRVFfRU5UUlkgSGFzaFtNQVhfSEFTSF9NRUFTVVJFX1JFUV9UQUJfU0laRV07Ci0JTUVBU1VSRV9SRVFfRU5UUlkgQ29udGVudFtNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkVdOwotfSBNRUFTVVJFX1JFUV9UQUIsICpQTUVBU1VSRV9SRVFfVEFCOwotCi10eXBlZGVmIHN0cnVjdCBfVFBDX1JFUV9FTlRSWQotewotCXN0cnVjdCBfVFBDX1JFUV9FTlRSWSAqcE5leHQ7Ci0JVUxPTkcgbGFzdFRpbWU7Ci0JQk9PTEVBTiBWYWxpZDsKLQlVSU5UOCBEaWFsb2dUb2tlbjsKLX0gVFBDX1JFUV9FTlRSWSwgKlBUUENfUkVRX0VOVFJZOwotCi10eXBlZGVmIHN0cnVjdCBfVFBDX1JFUV9UQUIKLXsKLQlVQ0hBUiBTaXplOwotCVBUUENfUkVRX0VOVFJZIEhhc2hbTUFYX0hBU0hfVFBDX1JFUV9UQUJfU0laRV07Ci0JVFBDX1JFUV9FTlRSWSBDb250ZW50W01BWF9UUENfUkVRX1RBQl9TSVpFXTsKLX0gVFBDX1JFUV9UQUIsICpQVFBDX1JFUV9UQUI7Ci0KLQotLyogVGhlIHJlZ3VsYXRvcnkgaW5mb3JtYXRpb24gKi8KLXR5cGVkZWYgc3RydWN0IF9ET1QxMV9DSEFOTkVMX1NFVAotewotCVVDSEFSIE51bWJlck9mQ2hhbm5lbHM7Ci0JVUlOVDggTWF4VHhQd3I7Ci0JVUNIQVIgQ2hhbm5lbExpc3RbMTZdOwotfSBET1QxMV9DSEFOTkVMX1NFVCwgKlBET1QxMV9DSEFOTkVMX1NFVDsKLQotdHlwZWRlZiBzdHJ1Y3QgX0RPVDExX1JFR1VMQVRPUllfSU5GT1JNQVRJT04KLXsKLQlVQ0hBUiBSZWd1bGF0b3J5Q2xhc3M7Ci0JRE9UMTFfQ0hBTk5FTF9TRVQgQ2hhbm5lbFNldDsKLX0gRE9UMTFfUkVHVUxBVE9SWV9JTkZPUk1BVElPTiwgKlBET1QxMV9SRUdVTEFUT1JZX0lORk9STUFUSU9OOwotCi0KLQotI2RlZmluZSBSTV9UUENfUkVRCQkJCTAKLSNkZWZpbmUgUk1fTUVBU1VSRV9SRVEJCQkxCi0KLSNkZWZpbmUgUk1fQkFTSUMJCQkJMAotI2RlZmluZSBSTV9DQ0EJCQkJCTEKLSNkZWZpbmUgUk1fUlBJX0hJU1RPR1JBTQkJMgotI2RlZmluZSBSTV9DSF9MT0FECQkJCTMKLSNkZWZpbmUgUk1fTk9JU0VfSElTVE9HUkFNCQk0Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9UUENfUkVQT1JUX0lORk8KLXsKLQlVSU5UOCBUeFB3cjsKLQlVSU5UOCBMaW5rTWFyZ2luOwotfSBUUENfUkVQT1JUX0lORk8sICpQVFBDX1JFUE9SVF9JTkZPOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0NIX1NXX0FOTl9JTkZPCi17Ci0JVUlOVDggQ2hTd01vZGU7Ci0JVUlOVDggQ2hhbm5lbDsKLQlVSU5UOCBDaFN3Q250OwotfSBDSF9TV19BTk5fSU5GTywgKlBDSF9TV19BTk5fSU5GTzsKLQotdHlwZWRlZiB1bmlvbiBQQUNLRUQgX01FQVNVUkVfUkVRX01PREUKLXsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0Jc3RydWN0IFBBQ0tFRAotCXsKLQotCQlVSU5UOCA6MzsKLQkJVUlOVDggRHVyYXRpb25NYW5kYXRvcnk6MTsKLQkJVUlOVDggUmVwb3J0OjE7Ci0JCVVJTlQ4IFJlcXVlc3Q6MTsKLQkJVUlOVDggRW5hYmxlOjE7Ci0JCVVJTlQ4IFBhcmFsbGVsOjE7Ci0JfSBmaWVsZDsKLSNlbHNlCi0Jc3RydWN0IFBBQ0tFRAotCXsKLQkJVUlOVDggUGFyYWxsZWw6MTsKLQkJVUlOVDggRW5hYmxlOjE7Ci0JCVVJTlQ4IFJlcXVlc3Q6MTsKLQkJVUlOVDggUmVwb3J0OjE7Ci0JCVVJTlQ4IER1cmF0aW9uTWFuZGF0b3J5OjE7Ci0JCVVJTlQ4IDozOwotCX0gZmllbGQ7Ci0jZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLwotCVVJTlQ4IHdvcmQ7Ci19IE1FQVNVUkVfUkVRX01PREUsICpQTUVBU1VSRV9SRVFfTU9ERTsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9NRUFTVVJFX1JFUQotewotCVVJTlQ4IENoTnVtOwotCVVJTlQ2NCBNZWFzdXJlU3RhcnRUaW1lOwotCVVJTlQxNiBNZWFzdXJlRHVyYXRpb247Ci19IE1FQVNVUkVfUkVRLCAqUE1FQVNVUkVfUkVROwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfUkVRX0lORk8KLXsKLQlVSU5UOCBUb2tlbjsKLQlNRUFTVVJFX1JFUV9NT0RFIFJlcU1vZGU7Ci0JVUlOVDggUmVxVHlwZTsKLQlVSU5UOCBPY3RbMF07Ci19IE1FQVNVUkVfUkVRX0lORk8sICpQTUVBU1VSRV9SRVFfSU5GTzsKLQotdHlwZWRlZiB1bmlvbiBQQUNLRUQgX01FQVNVUkVfQkFTSUNfUkVQT1JUX01BUAotewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlzdHJ1Y3QgUEFDS0VECi0JewotCQlVSU5UOCBSZXY6MzsKLQotCQlVSU5UOCBVbm1lYXN1cmU6MTsKLQkJVUlOVDggUmFkYXI6MTsKLQkJVUlOVDggVW5pZGVudGlmaWVkU2lnbmFsOjE7Ci0JCVVJTlQ4IE9mZG1QcmVhbWJsZToxOwotCQlVSU5UOCBCU1M6MTsKLQl9IGZpZWxkOwotI2Vsc2UKLQlzdHJ1Y3QgUEFDS0VECi0JewotCQlVSU5UOCBCU1M6MTsKLQotCQlVSU5UOCBPZmRtUHJlYW1ibGU6MTsKLQkJVUlOVDggVW5pZGVudGlmaWVkU2lnbmFsOjE7Ci0JCVVJTlQ4IFJhZGFyOjE7Ci0JCVVJTlQ4IFVubWVhc3VyZToxOwotCQlVSU5UOCBSZXY6MzsKLQl9IGZpZWxkOwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLQlVSU5UOCB3b3JkOwotfSBNRUFTVVJFX0JBU0lDX1JFUE9SVF9NQVAsICpQTUVBU1VSRV9CQVNJQ19SRVBPUlRfTUFQOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfQkFTSUNfUkVQT1JUCi17Ci0JVUlOVDggQ2hOdW07Ci0JVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7Ci0JVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKLQlNRUFTVVJFX0JBU0lDX1JFUE9SVF9NQVAgTWFwOwotfSBNRUFTVVJFX0JBU0lDX1JFUE9SVCwgKlBNRUFTVVJFX0JBU0lDX1JFUE9SVDsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9NRUFTVVJFX0NDQV9SRVBPUlQKLXsKLQlVSU5UOCBDaE51bTsKLQlVSU5UNjQgTWVhc3VyZVN0YXJ0VGltZTsKLQlVSU5UMTYgTWVhc3VyZUR1cmF0aW9uOwotCVVJTlQ4IENDQV9CdXN5X0ZyYWN0aW9uOwotfSBNRUFTVVJFX0NDQV9SRVBPUlQsICpQTUVBU1VSRV9DQ0FfUkVQT1JUOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfUlBJX1JFUE9SVAotewotCVVJTlQ4IENoTnVtOwotCVVJTlQ2NCBNZWFzdXJlU3RhcnRUaW1lOwotCVVJTlQxNiBNZWFzdXJlRHVyYXRpb247Ci0JVUlOVDggUlBJX0RlbnNpdHlbOF07Ci19IE1FQVNVUkVfUlBJX1JFUE9SVCwgKlBNRUFTVVJFX1JQSV9SRVBPUlQ7Ci0KLXR5cGVkZWYgdW5pb24gUEFDS0VEIF9NRUFTVVJFX1JFUE9SVF9NT0RFCi17Ci0Jc3RydWN0IFBBQ0tFRAotCXsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCVVJTlQ4IFJldjo1OwotCQlVSU5UOCBSZWZ1c2VkOjE7Ci0JCVVJTlQ4IEluY2FwYWJsZToxOwotCQlVSU5UOCBMYXRlOjE7Ci0jZWxzZQotCQlVSU5UOCBMYXRlOjE7Ci0JCVVJTlQ4IEluY2FwYWJsZToxOwotCQlVSU5UOCBSZWZ1c2VkOjE7Ci0JCVVJTlQ4IFJldjo1OwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLQl9IGZpZWxkOwotCVVJTlQ4IHdvcmQ7Ci19IE1FQVNVUkVfUkVQT1JUX01PREUsICpQTUVBU1VSRV9SRVBPUlRfTU9ERTsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9NRUFTVVJFX1JFUE9SVF9JTkZPCi17Ci0JVUlOVDggVG9rZW47Ci0JVUlOVDggUmVwb3J0TW9kZTsKLQlVSU5UOCBSZXBvcnRUeXBlOwotCVVJTlQ4IE9jdGVjdFswXTsKLX0gTUVBU1VSRV9SRVBPUlRfSU5GTywgKlBNRUFTVVJFX1JFUE9SVF9JTkZPOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1FVSUVUX0lORk8KLXsKLQlVSU5UOCBRdWlldENudDsKLQlVSU5UOCBRdWlldFBlcmlvZDsKLQlVSU5UMTYgUXVpZXREdXJhdGlvbjsKLQlVSU5UMTYgUXVpZXRPZmZzZXQ7Ci19IFFVSUVUX0lORk8sICpQUVVJRVRfSU5GTzsKLQotI2VuZGlmIC8vIF9fU1BFQ1RSVU1fREVGX0hfXyAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvYXNzb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhL2Fzc29jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMmVkMmIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvYXNzb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NzMgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQlhc3NvYy5jCi0KLQlBYnN0cmFjdDoKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JSm9obgkJMjAwNC05LTMJCXBvcnRpbmcgZnJvbSBSVDI1MDAKLSovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi1VQ0hBUglDaXBoZXJXcGFUZW1wbGF0ZVtdID0gewotCQkweGRkLAkJCQkJLy8gV1BBIElFCi0JCTB4MTYsCQkJCQkvLyBMZW5ndGgKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCi0JCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gTXVsdGljYXN0Ci0JCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0Ci0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIHVuaWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAotCQkweDAwLCAweDUwLCAweGYyLCAweDAxCS8vIGF1dGhlbnRpY2F0aW9uCi0JCX07Ci0KLVVDSEFSCUNpcGhlcldwYTJUZW1wbGF0ZVtdID0gewotCQkweDMwLAkJCQkJLy8gUlNOIElFCi0JCTB4MTQsCQkJCQkvLyBMZW5ndGgKLQkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgotCQkweDAwLCAweDBmLCAweGFjLCAweDAyLAkvLyBncm91cCBjaXBoZXIsIFRLSVAKLQkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIHBhaXJ3aXNlCi0JCTB4MDAsIDB4MGYsIDB4YWMsIDB4MDIsCS8vIHVuaWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAotCQkweDAwLCAweDBmLCAweGFjLCAweDAyLAkvLyBhdXRoZW50aWNhdGlvbgotCQkweDAwLCAweDAwLAkJCQkvLyBSU04gY2FwYWJpbGl0eQotCQl9OwotCi1VQ0hBUglDY3gySWVJbmZvW10gPSB7IDB4MDAsIDB4NDAsIDB4OTYsIDB4MDMsIDB4MDJ9OwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCWFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUgaW5pdCwgaW5jbHVkaW5nIHN0YXRlIHRyYW5zaXRpb24gYW5kIHRpbWVyIGluaXQKLQlQYXJhbWV0ZXJzOgotCQlTIC0gcG9pbnRlciB0byB0aGUgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXNzb2NTdGF0ZU1hY2hpbmVJbml0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICBTVEFURV9NQUNISU5FICpTLAotCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKLXsKLQlTdGF0ZU1hY2hpbmVJbml0KFMsIFRyYW5zLCBNQVhfQVNTT0NfU1RBVEUsIE1BWF9BU1NPQ19NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgQVNTT0NfSURMRSwgQVNTT0NfTUFDSElORV9CQVNFKTsKLQotCS8vIGZpcnN0IGNvbHVtbgotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19JRExFLCBNVDJfTUxNRV9BU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZUFzc29jUmVxQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX01MTUVfUkVBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZVJlYXNzb2NSZXFBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19JRExFLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZURpc2Fzc29jUmVxQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX1BFRVJfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEaXNhc3NvY0FjdGlvbik7Ci0KLQkvLyBzZWNvbmQgY29sdW1uCi0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9BU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkFzc29jKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5SZWFzc29jKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGlzYXNzb2NBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfQVNTT0NfUlNQLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJBc3NvY1JzcEFjdGlvbik7Ci0JLy8KLQkvLyBQYXRjaCAzQ29tIEFQIE1PZGU6M0NSV0U0NTRHNzIKLQkvLyBXZSBzZW5kIEFzc29jIHJlcXVlc3QgZnJhbWUgdG8gdGhpcyBBUCwgaXQgYWx3YXlzIHNlbmQgUmVhc3NvYyBSc3Agbm90IEFzc29jaWF0ZSBSc3AuCi0JLy8KLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX1JFQVNTT0NfUlNQLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJBc3NvY1JzcEFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfQVNTT0NfVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylBc3NvY1RpbWVvdXRBY3Rpb24pOwotCi0JLy8gdGhpcmQgY29sdW1uCi0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuQXNzb2MpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyk7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEaXNhc3NvY0FjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX1JFQVNTT0NfUlNQLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJSZWFzc29jUnNwQWN0aW9uKTsKLQkvLwotCS8vIFBhdGNoLCBBUCBkb2Vzbid0IHNlbmQgUmVhc3NvY2lhdGUgUnNwIGZyYW1lIHRvIFN0YXRpb24uCi0JLy8KLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfQVNTT0NfUlNQLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJSZWFzc29jUnNwQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX1JFQVNTT0NfVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylSZWFzc29jVGltZW91dEFjdGlvbik7Ci0KLQkvLyBmb3VydGggY29sdW1uCi0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9BU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkFzc29jKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5SZWFzc29jKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGlzYXNzb2NBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBESVNBU1NPQ19XQUlUX1JTUCwgTVQyX0RJU0FTU09DX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpRGlzYXNzb2NUaW1lb3V0QWN0aW9uKTsKLQotCS8vIGluaXRpYWxpemUgdGhlIHRpbWVyCi0JUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEFzc29jVGltZW91dCksIHBBZCwgRkFMU0UpOwotCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFJlYXNzb2NUaW1lb3V0KSwgcEFkLCBGQUxTRSk7Ci0JUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKERpc2Fzc29jVGltZW91dCksIHBBZCwgRkFMU0UpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUFzc29jaWF0aW9uIHRpbWVvdXQgcHJvY2VkdXJlLiBBZnRlciBhc3NvY2lhdGlvbiB0aW1lb3V0LCB0aGlzIGZ1bmN0aW9uCi0JCXdpbGwgYmUgY2FsbGVkIGFuZCBpdCB3aWxsIHB1dCBhIG1lc3NhZ2UgaW50byB0aGUgTUxNRSBxdWV1ZQotCVBhcmFtZXRlcnM6Ci0JCVN0YW5kYXJkIHRpbWVyIHBhcmFtZXRlcnMKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc3NvY1RpbWVvdXQoSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCQkJCSBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JCQkJIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQkJCQkgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQotewotCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKLQotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JCXJldHVybjsKLQotCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX1RJTUVPVVQsIDAsIE5VTEwpOwotCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJUmVhc3NvY2lhdGlvbiB0aW1lb3V0IHByb2NlZHVyZS4gQWZ0ZXIgcmVhc3NvY2lhdGlvbiB0aW1lb3V0LCB0aGlzCi0JCWZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFuZCBwdXQgYSBtZXNzYWdlIGludG8gdGhlIE1MTUUgcXVldWUKLQlQYXJhbWV0ZXJzOgotCQlTdGFuZGFyZCB0aW1lciBwYXJhbWV0ZXJzCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgUmVhc3NvY1RpbWVvdXQoSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCQkJCQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JCQkJCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQkJCQkJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQotewotCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKLQotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JCXJldHVybjsKLQotCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfVElNRU9VVCwgMCwgTlVMTCk7Ci0JUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlEaXNhc3NvY2lhdGlvbiB0aW1lb3V0IHByb2NlZHVyZS4gQWZ0ZXIgZGlzYXNzb2NpYXRpb24gdGltZW91dCwgdGhpcwotCQlmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhbmQgcHV0IGEgbWVzc2FnZSBpbnRvIHRoZSBNTE1FIHF1ZXVlCi0JUGFyYW1ldGVyczoKLQkJU3RhbmRhcmQgdGltZXIgcGFyYW1ldGVycwotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIERpc2Fzc29jVGltZW91dChJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JCQkJCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQkJCQkJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCQkJCQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCi17Ci0JUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OwotCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQkJcmV0dXJuOwotCi0JTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfRElTQVNTT0NfVElNRU9VVCwgMCwgTlVMTCk7Ci0JUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQltbG1lIGFzc29jIHJlcSBoYW5kbGluZyBwcm9jZWR1cmUKLQlQYXJhbWV0ZXJzOgotCQlBZGFwdGVyIC0gQWRhcHRlciBwb2ludGVyCi0JCUVsZW0gLSBNTE1FIFF1ZXVlIEVsZW1lbnQKLQlQcmU6Ci0JCXRoZSBzdGF0aW9uIGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQgYW5kIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIHRoZSBjb25maWcKLQkJCS0jIFNTSUQKLQkJCS0jIHN1cHBvcnRlZCByYXRlcyBhbmQgdGhlaXIgbGVuZ3RoCi0JCQktIyBsaXN0ZW4gaW50ZXJ2YWwgKEFkYXB0ZXItPlN0YUNmZy5kZWZhdWx0X2xpc3Rlbl9jb3VudCkKLQkJCS0jIFRyYW5zbWl0IHBvd2VyICAoQWRhcHRlci0+U3RhQ2ZnLnR4X3Bvd2VyKQotCVBvc3QgIDoKLQkJLSMgQW4gYXNzb2NpYXRpb24gcmVxdWVzdCBmcmFtZSBpcyBnZW5lcmF0ZWQgYW5kIHNlbnQgdG8gdGhlIGFpcgotCQktIyBBc3NvY2lhdGlvbiB0aW1lciBzdGFydHMKLQkJLSMgQXNzb2NpYXRpb24gc3RhdGUgLT4gQVNTT0NfV0FJVF9SU1AKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNbG1lQXNzb2NSZXFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVDSEFSCQkJQXBBZGRyWzZdOwotCUhFQURFUl84MDJfMTEJQXNzb2NIZHI7Ci0JVUNIQVIJCQlXbWVJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDB4MDcsIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDB9OwotCVVTSE9SVAkJCUxpc3RlbkludHY7Ci0JVUxPTkcJCQlUaW1lb3V0OwotCVVTSE9SVAkJCUNhcGFiaWxpdHlJbmZvOwotCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKLQlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUwkJTlN0YXR1czsKLQlVTE9ORwkJCUZyYW1lTGVuID0gMDsKLQlVTE9ORwkJCXRtcDsKLQlVU0hPUlQJCQlWYXJJZXNPZmZzZXQ7Ci0JVVNIT1JUCQkJU3RhdHVzOwotCi0JLy8gQmxvY2sgYWxsIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kCi0JaWYgKHBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID09IFRSVUUpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIEJsb2NrIEFzc29jIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kIVxuIikpOwotCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7Ci0JCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7Ci0JCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKLQl9Ci0JLy8gY2hlY2sgc2FuaXR5IGZpcnN0Ci0JZWxzZSBpZiAoTWxtZUFzc29jUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFwQWRkciwgJkNhcGFiaWxpdHlJbmZvLCAmVGltZW91dCwgJkxpc3RlbkludHYpKQotCXsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQkJQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIEFwQWRkcik7Ci0KLQkJLy8gR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKLQkJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBU1NPQyAtIE1sbWVBc3NvY1JlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7Ci0JCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7Ci0JCQlTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBBZGQgYnkgSmFtZXMgMDMvMDYvMjcKLQkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLkxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTik7Ci0JCS8vIEFzc29jaWF0aW9uIGRvbid0IG5lZWQgdG8gcmVwb3J0IE1BQyBhZGRyZXNzCi0JCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5BdmFpbGFibGVSZXF1ZXN0Rml4ZWRJRXMgPQotCQkJTkRJU184MDJfMTFfQUlfUkVRRklfQ0FQQUJJTElUSUVTIHwgTkRJU184MDJfMTFfQUlfUkVRRklfTElTVEVOSU5URVJWQUw7Ci0JCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5SZXF1ZXN0Rml4ZWRJRXMuQ2FwYWJpbGl0aWVzID0gQ2FwYWJpbGl0eUluZm87Ci0JCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5SZXF1ZXN0Rml4ZWRJRXMuTGlzdGVuSW50ZXJ2YWwgPSBMaXN0ZW5JbnR2OwotCQkvLyBPbmx5IHJlYXNzb2NpYXRlIG5lZWQgdGhpcwotCQkvL0NPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuQXNzb2NJbmZvLlJlcXVlc3RGaXhlZElFcy5DdXJyZW50QVBBZGRyZXNzLCBBcEFkZHIpOwotCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uT2Zmc2V0UmVxdWVzdElFcyA9IHNpemVvZihORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTik7Ci0KLSAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzLCBNQVhfVklFX0xFTik7Ci0JCS8vIEZpcnN0IGFkZCBTU0lECi0JCVZhckllc09mZnNldCA9IDA7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJlNzaWRJZSwgMSk7Ci0JCVZhckllc09mZnNldCArPSAxOwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsICZwQWQtPk1sbWVBdXguU3NpZExlbiwgMSk7Ci0JCVZhckllc09mZnNldCArPSAxOwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7Ci0JCVZhckllc09mZnNldCArPSBwQWQtPk1sbWVBdXguU3NpZExlbjsKLQotCQkvLyBTZWNvbmQgYWRkIFN1cHBvcnRlZCByYXRlcwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsICZTdXBSYXRlSWUsIDEpOwotCQlWYXJJZXNPZmZzZXQgKz0gMTsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sIDEpOwotCQlWYXJJZXNPZmZzZXQgKz0gMTsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCBwQWQtPk1sbWVBdXguU3VwUmF0ZSwgcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4pOwotCQlWYXJJZXNPZmZzZXQgKz0gcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW47Ci0JCS8vIEVuZCBBZGQgYnkgSmFtZXMKLQotICAgICAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkgJiYKLSAgICAgICAgICAgIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSBUUlVFKSkKLSAgICAgICAgICAgIENhcGFiaWxpdHlJbmZvIHw9IDB4MDEwMDsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFNlbmQgQVNTT0MgcmVxdWVzdC4uLlxuIikpOwotCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkFzc29jSGRyLCBTVUJUWVBFX0FTU09DX1JFUSwgMCwgQXBBZGRyLCBBcEFkZHIpOwotCi0JCS8vIEJ1aWxkIGJhc2ljIGZyYW1lIGZpcnN0Ci0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKLQkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLAkmQXNzb2NIZHIsCi0JCQkJCQkgIDIsCQkJCQkJJkNhcGFiaWxpdHlJbmZvLAotCQkJCQkJICAyLAkJCQkJCSZMaXN0ZW5JbnR2LAotCQkJCQkJICAxLAkJCQkJCSZTc2lkSWUsCi0JCQkJCQkgIDEsCQkJCQkJJnBBZC0+TWxtZUF1eC5Tc2lkTGVuLAotCQkJCQkJICBwQWQtPk1sbWVBdXguU3NpZExlbiwJCXBBZC0+TWxtZUF1eC5Tc2lkLAotCQkJCQkJICAxLAkJCQkJCSZTdXBSYXRlSWUsCi0JCQkJCQkgIDEsCQkJCQkJJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLAotCQkJCQkJICBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgIHBBZC0+TWxtZUF1eC5TdXBSYXRlLAotCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0KLQkJaWYgKHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuICE9IDApCi0JCXsKLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgJnRtcCwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVJZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAotCQkJCQkJCSAgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sICBwQWQtPk1sbWVBdXguRXh0UmF0ZSwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJCUZyYW1lTGVuICs9IHRtcDsKLQkJfQotCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJLy8gSFQKLQkJaWYgKChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID4gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCi0JCXsKLQkJCVVMT05HIFRtcExlbjsKLQkJCVVDSEFSIEh0TGVuOwotCQkJVUNIQVIgQlJPQURDT01bNF0gPSB7MHgwLCAweDkwLCAweDRjLCAweDMzfTsKLQkJCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJQcmVOSHQgPT0gVFJVRSkKLQkJCXsKLQkJCQlIdExlbiA9IFNJWkVfSFRfQ0FQX0lFICsgNDsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAotCQkJCQkJCSAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKLQkJCQkJCQkgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCi0JCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCQkgICAgICAgIEhUX0NBUEFCSUxJVFlfSUUgSHRDYXBhYmlsaXR5VG1wOwotI2VuZGlmCi0KLSNpZm5kZWYgUlRfQklHX0VORElBTgotCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLAotCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmSHRDYXBhYmlsaXR5VG1wLCAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbik7Ci0JCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pKTsKLQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykpOwotCi0JCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRDYXBJZSwKLQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwKLQkJCQkJCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwmSHRDYXBhYmlsaXR5VG1wLAotCQkJCQkJCQlFTkRfT0ZfQVJHUyk7Ci0jZW5kaWYKLQkJCX0KLQkJCUZyYW1lTGVuICs9IFRtcExlbjsKLQkJfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JCS8vIGFkZCBSYWxpbmsgcHJvcHJpZXRhcnkgSUUgdG8gaW5mb3JtIEFQIHRoaXMgU1RBIGlzIGdvaW5nIHRvIHVzZSBBR0dSRUdBVElPTiBvciBQSUdHWS1CQUNLK0FHR1JFR0FUSU9OCi0JCS8vIENhc2UgSTogKEFnZ3JlZ2F0aW9uICsgUGlnZ3ktQmFjaykKLQkJLy8gMS4gdXNlciBlbmFibGUgYWdncmVnYXRpb24sIEFORAotCQkvLyAyLiBNYWMgc3VwcG9ydCBwaWdneS1iYWNrCi0JCS8vIDMuIEFQIGFubm91Y2VzIGl0J3MgUElHR1ktQkFDSytBR0dSRUdBVElPTi1jYXBhYmxlIGluIEJFQUNPTgotCQkvLyBDYXNlIElJOiAoQWdncmVnYXRpb24pCi0JCS8vIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQKLQkJLy8gMi4gQVAgYW5ub3VjZXMgaXQncyBBR0dSRUdBVElPTi1jYXBhYmxlIGluIEJFQUNPTgotCQlpZiAocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkKLQkJewotCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSkgJiYgKChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDMpID09IDMpKQotCQkJewotCQkJCVVMT05HIFRtcExlbjsKLQkJCQlVQ0hBUiBSYWxpbmtJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDB9OwotCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sICAgICAgICAgICAmVG1wTGVuLAotCQkJCQkJCQkgIDksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWxpbmtJZSwKLQkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQkJRnJhbWVMZW4gKz0gVG1wTGVuOwotCQkJfQotCQkJZWxzZSBpZiAocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAxKQotCQkJewotCQkJCVVMT05HIFRtcExlbjsKLQkJCQlVQ0hBUiBSYWxpbmtJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDB9OwotCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sICAgICAgICAgICAmVG1wTGVuLAotCQkJCQkJCQkgIDksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWxpbmtJZSwKLQkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQkJRnJhbWVMZW4gKz0gVG1wTGVuOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJVUxPTkcgVG1wTGVuOwotCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDA2LCAweDAwLCAweDAwLCAweDAwfTsKLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sCQkgJlRtcExlbiwKLQkJCQkJCQkgIDksCQkJCQkJIFJhbGlua0llLAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJRnJhbWVMZW4gKz0gVG1wTGVuOwotCQl9Ci0KLQkJaWYgKHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLmJWYWxpZCkKLQkJewotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5iQVBTRENhcGFibGUpCi0JCQl7Ci0JCQkJUUJTU19TVEFfSU5GT19QQVJNIFFvc0luZm87Ci0KLQkJCQlOZGlzWmVyb01lbW9yeSgmUW9zSW5mbywgc2l6ZW9mKFFCU1NfU1RBX0lORk9fUEFSTSkpOwotCQkJCVFvc0luZm8uVUFQU0RfQUNfQkUgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFOwotCQkJCVFvc0luZm8uVUFQU0RfQUNfQksgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLOwotCQkJCVFvc0luZm8uVUFQU0RfQUNfVkkgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZJOwotCQkJCVFvc0luZm8uVUFQU0RfQUNfVk8gPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPOwotCQkJCVFvc0luZm8uTWF4U1BMZW5ndGggPSBwQWQtPkNvbW1vbkNmZy5NYXhTUExlbmd0aDsKLQkJCQlXbWVJZVs4XSB8PSAqKFBVQ0hBUikmUW9zSW5mbzsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLSAgICAgICAgICAgICAgICAvLyBUaGUgUGFyYW1ldGVyIFNldCBDb3VudCBpcyBzZXQgdG8g77+977+9MO+/ve+/vSBpbiB0aGUgYXNzb2NpYXRpb24gcmVxdWVzdCBmcmFtZXMKLSAgICAgICAgICAgICAgICAvLyBXbWVJZVs4XSB8PSAocEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0uRWRjYVVwZGF0ZUNvdW50ICYgMHgwZik7Ci0JCQl9Ci0KLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgJnRtcCwKLQkJCQkJCQkgIDksICAgICAgICAgICAgICAgICAgICAgICAgJldtZUllWzBdLAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJRnJhbWVMZW4gKz0gdG1wOwotCQl9Ci0KLQkJLy8KLQkJLy8gTGV0IFdQQSgjMjIxKSBFbGVtZW50IElEIG9uIHRoZSBlbmQgb2YgdGhpcyBhc3NvY2lhdGlvbiBmcmFtZS4KLQkJLy8gT3RoZXJ3aXNlIHNvbWUgQVAgd2lsbCBmYWlsIG9uIHBhcnNpbmcgRWxlbWVudCBJRCBhbmQgc2V0IHN0YXR1cyBmYWlsIG9uIEFzc29jIFJzcC4KLQkJLy8gRm9yIGV4YW1wbGU6IFB1dCBWZW5kb3IgU3BlY2lmaWMgSUUgb24gdGhlIGZyb250IG9mIFdQQSBJRS4KLQkJLy8gVGhpcyBoYXBwZW5zIG9uIEFQIChNb2RlbCBObzpMaW5rc3lzIFdSSzU0RykKLQkJLy8KLQkJaWYgKCgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAotICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spIHx8Ci0gICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAotICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCi0JCQkpCi0gICAgICAgICAgICApCi0JCXsKLQkJCVVDSEFSIFJTTkllID0gSUVfV1BBOwotCi0JCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spIHx8Ci0gICAgICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpKQotCQkJewotCQkJCVJTTkllID0gSUVfV1BBMjsKLQkJCX0KLQotI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0jaWZkZWYgU0lPQ1NJV0dFTklFCi0JCQlpZiAoKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpICYmCi0JCQkJKHBBZC0+U3RhQ2ZnLmJSU05fSUVfRnJvbVdwYVN1cHBsaWNhbnQgPT0gRkFMU0UpKQotI2VuZGlmIC8vIFNJT0NTSVdHRU5JRSAvLwotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0gICAgICAgICAgICBSVE1QTWFrZVJTTklFKHBBZCwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywgQlNTMCk7Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIGZvciBXUEEgUE1LIGNhY2hlIGxpc3QKLQkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQotCQkJewotCQkJICAgIElOVCAgICAgaWR4OwotICAgICAgICAgICAgICAgIEJPT0xFQU4gRm91bmRQTUsgPSBGQUxTRTsKLQkJCQkvLyBTZWFyY2ggY2hjaGVkIFBNS0lELCBhcHBlbmQgaXQgaWYgZXhpc3RlZAotCQkJCWZvciAoaWR4ID0gMDsgaWR4IDwgUE1LSURfTk87IGlkeCsrKQotCQkJCXsKLQkJCQkJaWYgKE5kaXNFcXVhbE1lbW9yeShBcEFkZHIsICZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHhdLkJTU0lELCA2KSkKLQkJCQkJewotCQkJCQkJRm91bmRQTUsgPSBUUlVFOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoRm91bmRQTUspCi0JCQkJewotCQkJCQkvLyBTZXQgUE1LIG51bWJlcgotCQkJCQkqKFBVU0hPUlQpICZwQWQtPlN0YUNmZy5SU05fSUVbcEFkLT5TdGFDZmcuUlNOSUVfTGVuXSA9IDE7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5SU05fSUVbcEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMl0sICZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHhdLlBNS0lELCAxNik7Ci0gICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArPSAxODsKLQkJCQl9Ci0JCQl9Ci0KLSNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotI2lmZGVmIFNJT0NTSVdHRU5JRQotCQkJaWYgKChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKSAmJgotCQkJCShwQWQtPlN0YUNmZy5iUlNOX0lFX0Zyb21XcGFTdXBwbGljYW50ID09IFRSVUUpKQotCQkJewotCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwJCSZ0bXAsCi0JCQkJCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4sCQkJcEFkLT5TdGFDZmcuUlNOX0lFLAotCQkJCQkJRU5EX09GX0FSR1MpOwotCQkJfQotCQkJZWxzZQotI2VuZGlmCi0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQkJCXsKLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwJCSZ0bXAsCi0JCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZSU05JZSwKLQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAotCQkJCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4sCQkJcEFkLT5TdGFDZmcuUlNOX0lFLAotCQkJCQlFTkRfT0ZfQVJHUyk7Ci0JCQl9Ci0KLQkJCUZyYW1lTGVuICs9IHRtcDsKLQotI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0jaWZkZWYgU0lPQ1NJV0dFTklFCi0JCQlpZiAoKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpIHx8Ci0JCQkJKHBBZC0+U3RhQ2ZnLmJSU05fSUVfRnJvbVdwYVN1cHBsaWNhbnQgPT0gRkFMU0UpKQotI2VuZGlmCi0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQkJCXsKLSAgICAgICAgICAgIC8vIEFwcGVuZCBWYXJpYWJsZSBJRQotICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmUlNOSWUsIDEpOwotICAgICAgICAgICAgVmFySWVzT2Zmc2V0ICs9IDE7Ci0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsICZwQWQtPlN0YUNmZy5SU05JRV9MZW4sIDEpOwotICAgICAgICAgICAgVmFySWVzT2Zmc2V0ICs9IDE7Ci0JCQl9Ci0JCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsIHBBZC0+U3RhQ2ZnLlJTTl9JRSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKLQkJCVZhckllc09mZnNldCArPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47Ci0KLQkJCS8vIFNldCBWYXJpYWJsZSBJRXMgTGVuZ3RoCi0JCQlwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiA9IFZhckllc09mZnNldDsKLQkJfQotCi0KLQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0KLQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwgVGltZW91dCk7Ci0JCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfV0FJVF9SU1A7Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVNTT0MgLSBNbG1lQXNzb2NSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbGVkLiBCVUchISEhISEgXG4iKSk7Ci0JCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKLQkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKLQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOwotCX0KLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCW1sbWUgcmVhc3NvYyByZXEgaGFuZGxpbmcgcHJvY2VkdXJlCi0JUGFyYW1ldGVyczoKLQkJRWxlbSAtCi0JUHJlOgotCQktIyBTU0lEICAoQWRhcHRlci0+U3RhQ2ZnLnNzaWRbXSkKLQkJLSMgQlNTSUQgKEFQIGFkZHJlc3MsIEFkYXB0ZXItPlN0YUNmZy5ic3NpZCkKLQkJLSMgU3VwcG9ydGVkIHJhdGVzIChBZGFwdGVyLT5TdGFDZmcuc3VwcG9ydGVkX3JhdGVzW10pCi0JCS0jIFN1cHBvcnRlZCByYXRlcyBsZW5ndGggKEFkYXB0ZXItPlN0YUNmZy5zdXBwb3J0ZWRfcmF0ZXNfbGVuKQotCQktIyBUeCBwb3dlciAoQWRhcHRlci0+U3RhQ2ZnLnR4X3Bvd2VyKQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIE1sbWVSZWFzc29jUmVxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVQ0hBUgkJCUFwQWRkcls2XTsKLQlIRUFERVJfODAyXzExCVJlYXNzb2NIZHI7Ci0JVUNIQVIJCQlXbWVJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDB4MDcsIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDB9OwotCVVTSE9SVAkJCUNhcGFiaWxpdHlJbmZvLCBMaXN0ZW5JbnR2OwotCVVMT05HCQkJVGltZW91dDsKLQlVTE9ORwkJCUZyYW1lTGVuID0gMDsKLQlCT09MRUFOCQkJVGltZXJDYW5jZWxsZWQ7Ci0JTkRJU19TVEFUVVMJCU5TdGF0dXM7Ci0JVUxPTkcJCQl0bXA7Ci0JUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7Ci0JVVNIT1JUCQkJU3RhdHVzOwotCi0JLy8gQmxvY2sgYWxsIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kCi0JaWYgKHBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID09IFRSVUUpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIEJsb2NrIFJlQXNzb2MgcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QhXG4iKSk7Ci0JCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKLQkJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKLQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7Ci0JfQotCS8vIHRoZSBwYXJhbWV0ZXJzIGFyZSB0aGUgc2FtZSBhcyB0aGUgYXNzb2NpYXRpb24KLQllbHNlIGlmKE1sbWVBc3NvY1JlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBcEFkZHIsICZDYXBhYmlsaXR5SW5mbywgJlRpbWVvdXQsICZMaXN0ZW5JbnR2KSkKLQl7Ci0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQotCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVNTT0MgLSBNbG1lUmVhc3NvY1JlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7Ci0JCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7Ci0JCQlTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUNPUFlfTUFDX0FERFIocEFkLT5NbG1lQXV4LkJzc2lkLCBBcEFkZHIpOwotCi0JCS8vIG1ha2UgZnJhbWUsIHVzZSBic3NpZCBhcyB0aGUgQVAgYWRkcmVzcz8/Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gU2VuZCBSRS1BU1NPQyByZXF1ZXN0Li4uXG4iKSk7Ci0JCU1ndE1hY0hlYWRlckluaXQocEFkLCAmUmVhc3NvY0hkciwgU1VCVFlQRV9SRUFTU09DX1JFUSwgMCwgQXBBZGRyLCBBcEFkZHIpOwotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAmUmVhc3NvY0hkciwKLQkJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAmQ2FwYWJpbGl0eUluZm8sCi0JCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgJkxpc3RlbkludHYsCi0JCQkJCQkgIE1BQ19BRERSX0xFTiwgICAgICAgICAgICAgQXBBZGRyLAotCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkSWUsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+TWxtZUF1eC5Tc2lkTGVuLAotCQkJCQkJICBwQWQtPk1sbWVBdXguU3NpZExlbiwgICAgIHBBZC0+TWxtZUF1eC5Tc2lkLAotCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCi0JCQkJCQkgIDEsCQkJCQkJJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLAotCQkJCQkJICBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgIHBBZC0+TWxtZUF1eC5TdXBSYXRlLAotCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0KLQkJaWYgKHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuICE9IDApCi0JCXsKLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICZ0bXAsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAotCQkJCQkJCSAgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCSAgICBwQWQtPk1sbWVBdXguRXh0UmF0ZSwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJCUZyYW1lTGVuICs9IHRtcDsKLQkJfQotCi0KLQkJaWYgKHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLmJWYWxpZCkKLQkJewotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5iQVBTRENhcGFibGUpCi0JCQl7Ci0JCQkJUUJTU19TVEFfSU5GT19QQVJNIFFvc0luZm87Ci0KLQkJCQlOZGlzWmVyb01lbW9yeSgmUW9zSW5mbywgc2l6ZW9mKFFCU1NfU1RBX0lORk9fUEFSTSkpOwotCQkJCVFvc0luZm8uVUFQU0RfQUNfQkUgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFOwotCQkJCVFvc0luZm8uVUFQU0RfQUNfQksgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLOwotCQkJCVFvc0luZm8uVUFQU0RfQUNfVkkgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZJOwotCQkJCVFvc0luZm8uVUFQU0RfQUNfVk8gPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPOwotCQkJCVFvc0luZm8uTWF4U1BMZW5ndGggPSBwQWQtPkNvbW1vbkNmZy5NYXhTUExlbmd0aDsKLQkJCQlXbWVJZVs4XSB8PSAqKFBVQ0hBUikmUW9zSW5mbzsKLQkJCX0KLQotCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAmdG1wLAotCQkJCQkJCSAgOSwgICAgICAgICAgICAgICAgICAgICAgICAmV21lSWVbMF0sCi0JCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQlGcmFtZUxlbiArPSB0bXA7Ci0JCX0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkvLyBIVAotCQlpZiAoKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPiAwKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKLQkJewotCQkJVUxPTkcgVG1wTGVuOwotCQkJVUNIQVIgSHRMZW47Ci0JCQlVQ0hBUiBCUk9BRENPTVs0XSA9IHsweDAsIDB4OTAsIDB4NGMsIDB4MzN9OwotCQkJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYlByZU5IdCA9PSBUUlVFKQotCQkJewotCQkJCUh0TGVuID0gU0laRV9IVF9DQVBfSUUgKyA0OwotCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZXcGFJZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCi0JCQkJCQkJICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJST0FEQ09NWzBdLAotCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRDYXBJZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwKLQkJCQkJCQkgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCi0JCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQl9Ci0JCQlGcmFtZUxlbiArPSBUbXBMZW47Ci0JCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCQkvLyBhZGQgUmFsaW5rIHByb3ByaWV0YXJ5IElFIHRvIGluZm9ybSBBUCB0aGlzIFNUQSBpcyBnb2luZyB0byB1c2UgQUdHUkVHQVRJT04gb3IgUElHR1ktQkFDSytBR0dSRUdBVElPTgotCQkvLyBDYXNlIEk6IChBZ2dyZWdhdGlvbiArIFBpZ2d5LUJhY2spCi0JCS8vIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQKLQkJLy8gMi4gTWFjIHN1cHBvcnQgcGlnZ3ktYmFjawotCQkvLyAzLiBBUCBhbm5vdWNlcyBpdCdzIFBJR0dZLUJBQ0srQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KLQkJLy8gQ2FzZSBJSTogKEFnZ3JlZ2F0aW9uKQotCQkvLyAxLiB1c2VyIGVuYWJsZSBhZ2dyZWdhdGlvbiwgQU5ECi0JCS8vIDIuIEFQIGFubm91Y2VzIGl0J3MgQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpCi0JCXsKLQkJCWlmICgocEFkLT5Db21tb25DZmcuYlBpZ2d5QmFja0NhcGFibGUpICYmICgocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAzKSA9PSAzKSkKLQkJCXsKLQkJCQlVTE9ORyBUbXBMZW47Ci0JCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCi0JCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKLQkJCX0KLQkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMSkKLQkJCXsKLQkJCQlVTE9ORyBUbXBMZW47Ci0JCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAxLCAweDAwLCAweDAwLCAweDAwfTsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCi0JCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCVVMT05HIFRtcExlbjsKLQkJCVVDSEFSIFJhbGlua0llWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMH07Ci0JCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLAkJICZUbXBMZW4sCi0JCQkJCQkJICA5LAkJCQkJCSBSYWxpbmtJZSwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJCUZyYW1lTGVuICs9IFRtcExlbjsKLQkJfQotCi0JCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCi0JCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgVGltZW91dCk7IC8qIGluIG1TZWMgKi8KLQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBSRUFTU09DX1dBSVRfUlNQOwotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFTU09DIC0gTWxtZVJlYXNzb2NSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbGVkLiBCVUchISEhIFxuIikpOwotCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7Ci0JCVN0YXR1cyA9IE1MTUVfSU5WQUxJRF9GT1JNQVQ7Ci0JCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOwotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlVcHBlciBsYXllciBpc3N1ZXMgZGlzYXNzb2MgcmVxdWVzdAotCVBhcmFtZXRlcnM6Ci0JCUVsZW0gLQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgTWxtZURpc2Fzc29jUmVxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlQTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUIHBEaXNhc3NvY1JlcTsKLQlIRUFERVJfODAyXzExICAgICAgICAgRGlzYXNzb2NIZHI7Ci0JUEhFQURFUl84MDJfMTEgICAgICAgIHBEaXNhc3NvY0hkcjsKLQlQVUNIQVIgICAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JVUxPTkcgICAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKLQlORElTX1NUQVRVUyAgICAgICAgICAgTlN0YXR1czsKLQlCT09MRUFOICAgICAgICAgICAgICAgVGltZXJDYW5jZWxsZWQ7Ci0JVUxPTkcgICAgICAgICAgICAgICAgIFRpbWVvdXQgPSA1MDA7Ci0JVVNIT1JUICAgICAgICAgICAgICAgIFN0YXR1czsKLQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCS8vIHNlbmQgRExTLVRFQVJfRE9XTiBtZXNzYWdlLAotCWlmIChwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKLQl7Ci0JCVVDSEFSIGk7Ci0KLQkJLy8gdGVhciBkb3duIGxvY2FsIGRscyB0YWJsZSBlbnRyeQotCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCi0JCXsKLQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQotCQkJewotCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOwotCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOwotCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7Ci0JCQl9Ci0JCX0KLQotCQkvLyB0ZWFyIGRvd24gcGVlciBkbHMgdGFibGUgZW50cnkKLQkJZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKLQkJewotCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCi0JCQl7Ci0JCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7Ci0JCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7Ci0JCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKLQkJCX0KLQkJfQotCX0KLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQotCS8vIHNraXAgc2FuaXR5IGNoZWNrCi0JcERpc2Fzc29jUmVxID0gKFBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpKEVsZW0tPk1zZyk7Ci0KLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIE1sbWVEaXNhc3NvY1JlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWRcbiIpKTsKLQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwotCQlTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7Ci0JCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ESVNBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKLQkJcmV0dXJuOwotCX0KLQotCi0KLQotCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsICZUaW1lckNhbmNlbGxlZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFNlbmQgRElTQVNTT0MgcmVxdWVzdFtCU1NJRDo6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggKFJlYXNvbj0lZClcbiIsCi0JCQkJcERpc2Fzc29jUmVxLT5BZGRyWzBdLCBwRGlzYXNzb2NSZXEtPkFkZHJbMV0sIHBEaXNhc3NvY1JlcS0+QWRkclsyXSwKLQkJCQlwRGlzYXNzb2NSZXEtPkFkZHJbM10sIHBEaXNhc3NvY1JlcS0+QWRkcls0XSwgcERpc2Fzc29jUmVxLT5BZGRyWzVdLCBwRGlzYXNzb2NSZXEtPlJlYXNvbikpOwotCU1ndE1hY0hlYWRlckluaXQocEFkLCAmRGlzYXNzb2NIZHIsIFNVQlRZUEVfRElTQVNTT0MsIDAsIHBEaXNhc3NvY1JlcS0+QWRkciwgcERpc2Fzc29jUmVxLT5BZGRyKTsJLy8gcGF0Y2ggcGVhcCB0dGxzIHN3aXRjaGluZyBpc3N1ZQotCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCi0JCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCZEaXNhc3NvY0hkciwKLQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgJnBEaXNhc3NvY1JlcS0+UmVhc29uLAotCQkJCQkgIEVORF9PRl9BUkdTKTsKLQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQotCS8vIFRvIHBhdGNoIEluc3RhbmNlIGFuZCBCdWZmYWxvKE4pIEFQCi0JLy8gRHJpdmVyIGhhcyB0byBzZW5kIGRlYXV0aCB0byBJbnN0YW5jZSBBUCwgYnV0IEJ1ZmZhbG8oTikgbmVlZHMgdG8gc2VuZCBkaXNhc3NvYyB0byByZXNldCBBdXRoZW50aWNhdG9yJ3Mgc3RhdGUgbWFjaGluZQotCS8vIFRoZXJlZm9yZSwgd2Ugc2VuZCBib3RoIG9mIHRoZW0uCi0JcERpc2Fzc29jSGRyID0gKFBIRUFERVJfODAyXzExKXBPdXRCdWZmZXI7Ci0JcERpc2Fzc29jSGRyLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9ERUFVVEg7Ci0JTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0KLQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCi0JcEFkLT5TdGFDZmcuRGlzYXNzb2NSZWFzb24gPSBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkc7Ci0JQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5EaXNhc3NvY1N0YSwgcERpc2Fzc29jUmVxLT5BZGRyKTsKLQotCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsIFRpbWVvdXQpOyAvKiBpbiBtU2VjICovCi0JcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBESVNBU1NPQ19XQUlUX1JTUDsKLQotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCi0JewotCQkvL3NlbmQgZGlzYXNzb2NpYXRlIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50Ci0JCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgSVdFVkNVU1RPTSwgUlRfRElTQVNTT0NfRVZFTlRfRkxBRywgTlVMTCwgTlVMTCwgMCk7Ci0JfQotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0jaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIFNJT0NHSVdBUCwgLTEsIE5VTEwsIE5VTEwsIDApOwotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlwZWVyIHNlbmRzIGFzc29jIHJzcCBiYWNrCi0JUGFyYW1ldGVyczoKLQkJRWxtZSAtIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFBlZXJBc3NvY1JzcEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVVNIT1JUICAgICAgICBDYXBhYmlsaXR5SW5mbywgU3RhdHVzLCBBaWQ7Ci0JVUNIQVIgICAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgU3VwUmF0ZUxlbjsKLQlVQ0hBUiAgICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlTGVuOwotCVVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOwotCVVDSEFSICAgICAgICAgQ2tpcEZsYWc7Ci0JRURDQV9QQVJNICAgICBFZGNhUGFybTsKLQlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7Ci0JQUREX0hUX0lORk9fSUUJCUFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCi0JVUNIQVIJCQlIdENhcGFiaWxpdHlMZW47Ci0JVUNIQVIJCQlBZGRIdEluZm9MZW47Ci0JVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKLQotCWlmIChQZWVyQXNzb2NSc3BTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZDYXBhYmlsaXR5SW5mbywgJlN0YXR1cywgJkFpZCwgU3VwUmF0ZSwgJlN1cFJhdGVMZW4sIEV4dFJhdGUsICZFeHRSYXRlTGVuLAotCQkmSHRDYXBhYmlsaXR5LCZBZGRIdEluZm8sICZIdENhcGFiaWxpdHlMZW4sJkFkZEh0SW5mb0xlbiwmTmV3RXh0Q2hhbm5lbE9mZnNldCwgJkVkY2FQYXJtLCAmQ2tpcEZsYWcpKQotCXsKLQkJLy8gVGhlIGZyYW1lIGlzIGZvciBtZSA/Ci0JCWlmKE1BQ19BRERSX0VRVUFMKEFkZHIyLCBwQWQtPk1sbWVBdXguQnNzaWQpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQXNzb2NSc3BBY3Rpb24oKTpBU1NPQyAtIHJlY2VpdmUgQVNTT0NfUlNQIHRvIG1lIChzdGF0dXM9JWQpXG4iLCBTdGF0dXMpKTsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBc3NvY1JzcEFjdGlvbigpOk1hY1RhYmxlIFslZF0uQU1zZHVTaXplID0gJWQuIENsaWVudFN0YXR1c0ZsYWdzID0gMHglbHggXG4iLEVsZW0tPldjaWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkNsaWVudFN0YXR1c0ZsYWdzKSk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwotCi0KLQkJCWlmKFN0YXR1cyA9PSBNTE1FX1NVQ0NFU1MpCi0JCQl7Ci0JCQkJVUNIQVIJCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gMDsKLQkJCQlVQ0hBUgkJCWlkeDsKLQotCQkJCS8vIHN1cHBvcnRlZCByYXRlcyBhcnJheSBtYXkgbm90IGJlIHNvcnRlZC4gc29ydCBpdCBhbmQgZmluZCB0aGUgbWF4aW11bSByYXRlCi0JCQkgICAgZm9yIChpZHg9MDsgaWR4PFN1cFJhdGVMZW47IGlkeCsrKQotCQkJICAgIHsKLQkJCSAgICAgICAgaWYgKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPCAoU3VwUmF0ZVtpZHhdICYgMHg3ZikpCi0JCQkgICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gU3VwUmF0ZVtpZHhdICYgMHg3ZjsKLQkJCSAgICB9Ci0KLQkJCQlmb3IgKGlkeD0wOyBpZHg8RXh0UmF0ZUxlbjsgaWR4KyspCi0JCQkgICAgewotCQkJICAgICAgICBpZiAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA8IChFeHRSYXRlW2lkeF0gJiAweDdmKSkKLQkJCSAgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSBFeHRSYXRlW2lkeF0gJiAweDdmOwotCQkJICAgIH0KLQkJCQkvLyBnbyB0byBwcm9jZWR1cmUgbGlzdGVkIG9uIHBhZ2UgMzc2Ci0JCQkJQXNzb2NQb3N0UHJvYyhwQWQsIEFkZHIyLCBDYXBhYmlsaXR5SW5mbywgQWlkLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLAotCQkJCQkmRWRjYVBhcm0sICZIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbiwgJkFkZEh0SW5mbyk7Ci0KLQkJCQlTdGFBZGRNYWNUYWJsZUVudHJ5KHBBZCwKLQkJCQkJCQkJCSZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLAotCQkJCQkJCQkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcywKLQkJCQkJCQkJCSZIdENhcGFiaWxpdHksCi0JCQkJCQkJCQlIdENhcGFiaWxpdHlMZW4sCi0JCQkJCQkJCQkmQWRkSHRJbmZvLAotCQkJCQkJCQkJQWRkSHRJbmZvTGVuLAotCQkJCQkJCQkJQ2FwYWJpbGl0eUluZm8pOwotCQkJfQotCQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwotCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gUGVlckFzc29jUnNwQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKLQl9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJcGVlciBzZW5kcyByZWFzc29jIHJzcAotCVBhcmFtZXRyczoKLQkJRWxlbSAtIE1MTUUgbWVzc2FnZSBjbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgUGVlclJlYXNzb2NSc3BBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVTSE9SVCAgICAgIENhcGFiaWxpdHlJbmZvOwotCVVTSE9SVCAgICAgIFN0YXR1czsKLQlVU0hPUlQgICAgICBBaWQ7Ci0JVUNIQVIgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIFN1cFJhdGVMZW47Ci0JVUNIQVIgICAgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIEV4dFJhdGVMZW47Ci0JVUNIQVIgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgICAgICBDa2lwRmxhZzsKLQlCT09MRUFOICAgICBUaW1lckNhbmNlbGxlZDsKLQlFRENBX1BBUk0gICBFZGNhUGFybTsKLQlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7Ci0JQUREX0hUX0lORk9fSUUJCUFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCi0JVUNIQVIJCQlIdENhcGFiaWxpdHlMZW47Ci0JVUNIQVIJCQlBZGRIdEluZm9MZW47Ci0JVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKLQotCWlmKFBlZXJBc3NvY1JzcFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJkNhcGFiaWxpdHlJbmZvLCAmU3RhdHVzLCAmQWlkLCBTdXBSYXRlLCAmU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgJkV4dFJhdGVMZW4sCi0JCQkJCQkJCSZIdENhcGFiaWxpdHksCSZBZGRIdEluZm8sICZIdENhcGFiaWxpdHlMZW4sICZBZGRIdEluZm9MZW4sJk5ld0V4dENoYW5uZWxPZmZzZXQsICZFZGNhUGFybSwgJkNraXBGbGFnKSkKLQl7Ci0JCWlmKE1BQ19BRERSX0VRVUFMKEFkZHIyLCBwQWQtPk1sbWVBdXguQnNzaWQpKSAvLyBUaGUgZnJhbWUgaXMgZm9yIG1lID8KLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSByZWNlaXZlIFJFQVNTT0NfUlNQIHRvIG1lIChzdGF0dXM9JWQpXG4iLCBTdGF0dXMpKTsKLQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQotCQkJaWYoU3RhdHVzID09IE1MTUVfU1VDQ0VTUykKLQkJCXsKLQkJCQkvLyBnbyB0byBwcm9jZWR1cmUgbGlzdGVkIG9uIHBhZ2UgMzc2Ci0JCQkJQXNzb2NQb3N0UHJvYyhwQWQsIEFkZHIyLCBDYXBhYmlsaXR5SW5mbywgQWlkLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLAotCQkJCQkgJkVkY2FQYXJtLCAmSHRDYXBhYmlsaXR5LCBIdENhcGFiaWxpdHlMZW4sICZBZGRIdEluZm8pOwotCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKLQkJCXsKLQkJCQlTZW5kQXNzb2NJRXNUb1dwYVN1cHBsaWNhbnQocEFkKTsKLQkJCQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIElXRVZDVVNUT00sIFJUX0FTU09DX0VWRU5UX0ZMQUcsIE5VTEwsIE5VTEwsIDApOwotCQkJfQotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0jaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHdleHRfbm90aWZ5X2V2ZW50X2Fzc29jKHBBZCk7Ci0gICAgICAgICAgICAgICAgICAgIFJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgU0lPQ0dJV0FQLCAtMSwgJnBBZC0+TWxtZUF1eC5Cc3NpZFswXSwgTlVMTCwgMCk7Ci0gICAgICAgICAgICAgICAgfQotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLQkJCX0KLQotCQkJLy8gQ2tpcEZsYWcgaXMgbm8gdXNlIGZvciByZWFzc29jaWF0ZQotCQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwotCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBQZWVyUmVhc3NvY1JzcEFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7Ci0JfQotCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJcHJvY2VkdXJlcyBvbiBJRUVFIDgwMi4xMS8xOTk5IHAuMzc2Ci0JUGFyYW1ldHJzOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzc29jUG9zdFByb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBBZGRyMiwKLQlJTiBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCi0JSU4gVVNIT1JUIEFpZCwKLQlJTiBVQ0hBUiBTdXBSYXRlW10sCi0JSU4gVUNIQVIgU3VwUmF0ZUxlbiwKLQlJTiBVQ0hBUiBFeHRSYXRlW10sCi0JSU4gVUNIQVIgRXh0UmF0ZUxlbiwKLQlJTiBQRURDQV9QQVJNIHBFZGNhUGFybSwKLQlJTiBIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKLQlJTiBVQ0hBUiBIdENhcGFiaWxpdHlMZW4sCi0JSU4gQUREX0hUX0lORk9fSUUJCSpwQWRkSHRJbmZvKQkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLXsKLQlVTE9ORyBJZHg7Ci0KLQlwQWQtPk1sbWVBdXguQnNzVHlwZSA9IEJTU19JTkZSQTsKLQlDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEFkZHIyKTsKLQlwQWQtPk1sbWVBdXguQWlkID0gQWlkOwotCXBBZC0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbyA9IENhcGFiaWxpdHlJbmZvICYgU1VQUE9SVEVEX0NBUEFCSUxJVFlfSU5GTzsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCS8vIFNvbWUgSFQgQVAgbWlnaHQgbG9zdCBXTU0gSUUuIFdlIGFkZCBXTU0gb3Vyc2VsdmVzLiBiZWFjdWFzZSBIVCByZXF1aXJlcyBRb1Mgb24uCi0JaWYgKChIdENhcGFiaWxpdHlMZW4gPiAwKSAmJiAocEVkY2FQYXJtLT5iVmFsaWQgPT0gRkFMU0UpKQotCXsKLQkJcEVkY2FQYXJtLT5iVmFsaWQgPSBUUlVFOwotCQlwRWRjYVBhcm0tPkFpZnNuWzBdID0gMzsKLQkJcEVkY2FQYXJtLT5BaWZzblsxXSA9IDc7Ci0JCXBFZGNhUGFybS0+QWlmc25bMl0gPSAyOwotCQlwRWRjYVBhcm0tPkFpZnNuWzNdID0gMjsKLQotCQlwRWRjYVBhcm0tPkN3bWluWzBdID0gNDsKLQkJcEVkY2FQYXJtLT5Dd21pblsxXSA9IDQ7Ci0JCXBFZGNhUGFybS0+Q3dtaW5bMl0gPSAzOwotCQlwRWRjYVBhcm0tPkN3bWluWzNdID0gMjsKLQotCQlwRWRjYVBhcm0tPkN3bWF4WzBdID0gMTA7Ci0JCXBFZGNhUGFybS0+Q3dtYXhbMV0gPSAxMDsKLQkJcEVkY2FQYXJtLT5Dd21heFsyXSA9IDQ7Ci0JCXBFZGNhUGFybS0+Q3dtYXhbM10gPSAzOwotCi0JCXBFZGNhUGFybS0+VHhvcFswXSAgPSAwOwotCQlwRWRjYVBhcm0tPlR4b3BbMV0gID0gMDsKLQkJcEVkY2FQYXJtLT5UeG9wWzJdICA9IDk2OwotCQlwRWRjYVBhcm0tPlR4b3BbM10gID0gNDg7Ci0KLQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sIHBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOwotCi0JLy8gZmlsdGVyIG91dCB1bi1zdXBwb3J0ZWQgcmF0ZXMKLQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47Ci0JTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlN1cFJhdGUsIFN1cFJhdGUsIFN1cFJhdGVMZW4pOwotCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LlN1cFJhdGUsICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbik7Ci0KLQkvLyBmaWx0ZXIgb3V0IHVuLXN1cHBvcnRlZCByYXRlcwotCXBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuID0gRXh0UmF0ZUxlbjsKLQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguRXh0UmF0ZSwgRXh0UmF0ZSwgRXh0UmF0ZUxlbik7Ci0JUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguRXh0UmF0ZSwgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCWlmIChIdENhcGFiaWxpdHlMZW4gPiAwKQotCXsKLQkJUlRNUENoZWNrSHQocEFkLCBCU1NJRF9XQ0lELCBwSHRDYXBhYmlsaXR5LCBwQWRkSHRJbmZvKTsKLQl9Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNzb2NQb3N0UHJvYz09PT4gIEFQLkFNc2R1U2l6ZSA9ICVkLiBDbGllbnRTdGF0dXNGbGFncyA9IDB4JWx4IFxuIiwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BTXNkdVNpemUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQ2xpZW50U3RhdHVzRmxhZ3MpKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+ICAgIChNbXBzPSVkLCBBbXNkdVNpemU9JWQsIClcbiIsCi0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTW1wc01vZGUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplKSk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkvLyBTZXQgTmV3IFdQQSBpbmZvcm1hdGlvbgotCUlkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIHBBZGRyMiwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOwotCWlmIChJZHggPT0gQlNTX05PVF9GT1VORCkKLQl7Ci0JCURCR1BSSU5UX0VSUigoIkFTU09DIC0gQ2FuJ3QgZmluZCBCU1MgYWZ0ZXIgcmVjZWl2aW5nIEFzc29jIHJlc3BvbnNlXG4iKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIEluaXQgdmFyaWFibGUKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPSAwOwotCQlOZGlzWmVyb01lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgTUFYX0xFTl9PRl9SU05JRSk7Ci0KLQkJLy8gU3RvcmUgYXBwcm9wcmlhdGUgUlNOX0lFIGZvciBXUEEgU00gbmVnb3RpYXRpb24gbGF0ZXIKLQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpICYmIChwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5WYXJJRUxlbiAhPSAwKSkKLQkJewotCQkJUFVDSEFSICAgICAgICAgICAgICBwVklFOwotCQkJVVNIT1JUICAgICAgICAgICAgICBsZW47Ci0JCQlQRUlEX1NUUlVDVCAgICAgICAgIHBFaWQ7Ci0KLQkJCXBWSUUgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5WYXJJRXM7Ci0JCQlsZW4JID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVmFySUVMZW47Ci0JCQkvL0tIIG5lZWQgdG8gY2hlY2sgYWdhaW4KLQkJCS8vIERvbid0IGFsbG93IHRvIGdvIHRvIHNsZWVwIG1vZGUgaWYgYXV0aG1vZGUgaXMgV1BBLXJlbGF0ZWQuCi0JCQkvL1RoaXMgY2FuIG1ha2UgQXV0aGVudGljYXRpb24gcHJvY2VzcyBtb3JlIHNtb290aGx5LgotCQkJUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19DQU5fR09fU0xFRVApOwotCi0JCQl3aGlsZSAobGVuID4gMCkKLQkJCXsKLQkJCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwVklFOwotCQkJCS8vIEZvciBXUEEvV1BBUFNLCi0JCQkJaWYgKChwRWlkLT5FaWQgPT0gSUVfV1BBKSAmJiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXUEFfT1VJLCA0KSkKLQkJCQkJJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSB8fCBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQotCQkJCXsKLQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBWSUUsIChwRWlkLT5MZW4gKyAyKSk7Ci0JCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuID0gKHBFaWQtPkxlbiArIDIpOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc3NvY1Bvc3RQcm9jPT09PiBTdG9yZSBSU05fSUUgZm9yIFdQQSBTTSBuZWdvdGlhdGlvbiBcbiIpKTsKLQkJCQl9Ci0JCQkJLy8gRm9yIFdQQTIvV1BBMlBTSwotCQkJCWVsc2UgaWYgKChwRWlkLT5FaWQgPT0gSUVfUlNOKSAmJiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0ICsgMiwgUlNOX09VSSwgMykpCi0JCQkJCSYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyIHx8IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQotCQkJCXsKLQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBWSUUsIChwRWlkLT5MZW4gKyAyKSk7Ci0JCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuID0gKHBFaWQtPkxlbiArIDIpOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc3NvY1Bvc3RQcm9jPT09PiBTdG9yZSBSU05fSUUgZm9yIFdQQTIgU00gbmVnb3RpYXRpb24gXG4iKSk7Ci0JCQkJfQotCi0JCQkJcFZJRSArPSAocEVpZC0+TGVuICsgMik7Ci0JCQkJbGVuICAtPSAocEVpZC0+TGVuICsgMik7Ci0JCQl9Ci0KLQotCQl9Ci0KLQkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuID09IDApCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+IG5vIFJTTl9JRSBcbiIpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWhleF9kdW1wKCJSU05fSUUiLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4pOwotCQl9Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCWxlZnQgcGFydCBvZiBJRUVFIDgwMi4xMS8xOTk5IHAuMzc0Ci0JUGFyYW1ldGVyczoKLQkJRWxlbSAtIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFBlZXJEaXNhc3NvY0FjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVUNIQVIgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotCVVTSE9SVCAgICAgICAgUmVhc29uOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBQZWVyRGlzYXNzb2NBY3Rpb24oKVxuIikpOwotCWlmKFBlZXJEaXNhc3NvY1Nhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJlJlYXNvbikpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFBlZXJEaXNhc3NvY0FjdGlvbigpIFJlYXNvbiA9ICVkXG4iLCBSZWFzb24pKTsKLQkJaWYgKElORlJBX09OKHBBZCkgJiYgTUFDX0FERFJfRVFVQUwocEFkLT5Db21tb25DZmcuQnNzaWQsIEFkZHIyKSkKLQkJewotCi0JCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JCQl7Ci0JCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfRElTQVNTT0NfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLQkJCX0KLQotCi0JCQlMaW5rRG93bihwQWQsIFRSVUUpOwotCQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwotCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQotCQkJewotCQkJCS8vc2VuZCBkaXNhc3NvY2lhdGUgZXZlbnQgdG8gd3BhX3N1cHBsaWNhbnQKLQkJCQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIElXRVZDVVNUT00sIFJUX0RJU0FTU09DX0VWRU5UX0ZMQUcsIE5VTEwsIE5VTEwsIDApOwotCQkJfQotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0jaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQkJCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgU0lPQ0dJV0FQLCAtMSwgTlVMTCwgTlVMTCwgMCk7Ci0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQkJfQotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFBlZXJEaXNhc3NvY0FjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7Ci0JfQotCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJd2hhdCB0aGUgc3RhdGUgbWFjaGluZSB3aWxsIGRvIGFmdGVyIGFzc29jIHRpbWVvdXQKLQlQYXJhbWV0ZXJzOgotCQlFbG1lIC0KLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc3NvY1RpbWVvdXRBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVTSE9SVCAgU3RhdHVzOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gQXNzb2NUaW1lb3V0QWN0aW9uXG4iKSk7Ci0JcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwotCVN0YXR1cyA9IE1MTUVfUkVKX1RJTUVPVVQ7Ci0JTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCXdoYXQgdGhlIHN0YXRlIG1hY2hpbmUgd2lsbCBkbyBhZnRlciByZWFzc29jIHRpbWVvdXQKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBSZWFzc29jVGltZW91dEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVVNIT1JUICBTdGF0dXM7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBSZWFzc29jVGltZW91dEFjdGlvblxuIikpOwotCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKLQlTdGF0dXMgPSBNTE1FX1JFSl9USU1FT1VUOwotCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCXdoYXQgdGhlIHN0YXRlIG1hY2hpbmUgd2lsbCBkbyBhZnRlciBkaXNhc3NvYyB0aW1lb3V0Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgRGlzYXNzb2NUaW1lb3V0QWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVU0hPUlQgIFN0YXR1czsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIERpc2Fzc29jVGltZW91dEFjdGlvblxuIikpOwotCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKLQlTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7Ci0JTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RJU0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOwotfQotCi1WT0lEIEludmFsaWRTdGF0ZVdoZW5Bc3NvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVVNIT1JUICBTdGF0dXM7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBJbnZhbGlkU3RhdGVXaGVuQXNzb2Moc3RhdGU9JWxkKSwgcmVzZXQgQVNTT0Mgc3RhdGUgbWFjaGluZVxuIiwKLQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUpKTsKLQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7Ci0JU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKLQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7Ci19Ci0KLVZPSUQgSW52YWxpZFN0YXRlV2hlblJlYXNzb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVTSE9SVCBTdGF0dXM7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyhzdGF0ZT0lbGQpLCByZXNldCBBU1NPQyBzdGF0ZSBtYWNoaW5lXG4iLAotCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSkpOwotCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKLQlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOwotCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOwotfQotCi1WT0lEIEludmFsaWRTdGF0ZVdoZW5EaXNhc3NvY2lhdGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVTSE9SVCBTdGF0dXM7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2Moc3RhdGU9JWxkKSwgcmVzZXQgQVNTT0Mgc3RhdGUgbWFjaGluZVxuIiwKLQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUpKTsKLQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7Ci0JU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKLQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfRElTQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJcmlnaHQgcGFydCBvZiBJRUVFIDgwMi4xMS8xOTk5IHBhZ2UgMzc0Ci0JTm90ZToKLQkJVGhpcyBldmVudCBzaG91bGQgbmV2ZXIgY2F1c2UgQVNTT0Mgc3RhdGUgbWFjaGluZSBwZXJmb3JtIHN0YXRlCi0JCXRyYW5zaXRpb24sIGFuZCBoYXMgbm8gcmVsYXRpb25zaGlwIHdpdGggQ05UTCBtYWNoaW5lLiBTbyB3ZSBzZXBhcmF0ZQotCQl0aGlzIHJvdXRpbmUgYXMgYSBzZXJ2aWNlIG91dHNpZGUgb2YgQVNTT0Mgc3RhdGUgdHJhbnNpdGlvbiB0YWJsZS4KLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBDbHMzZXJyQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIpCi17Ci0JSEVBREVSXzgwMl8xMSAgICAgICAgIERpc2Fzc29jSGRyOwotCVBIRUFERVJfODAyXzExICAgICAgICBwRGlzYXNzb2NIZHI7Ci0JUFVDSEFSICAgICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCVVMT05HICAgICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0JTkRJU19TVEFUVVMgICAgICAgICAgIE5TdGF0dXM7Ci0JVVNIT1JUICAgICAgICAgICAgICAgIFJlYXNvbiA9IFJFQVNPTl9DTFMzRVJSOwotCi0JTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQlyZXR1cm47Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIENsYXNzIDMgRXJyb3IsIFNlbmQgRElTQVNTT0MgZnJhbWVcbiIpKTsKLQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkRpc2Fzc29jSGRyLCBTVUJUWVBFX0RJU0FTU09DLCAwLCBwQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwkvLyBwYXRjaCBwZWFwIHR0bHMgc3dpdGNoaW5nIGlzc3VlCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKLQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksJkRpc2Fzc29jSGRyLAotCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAmUmVhc29uLAotCQkJCQkgIEVORF9PRl9BUkdTKTsKLQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQotCS8vIFRvIHBhdGNoIEluc3RhbmNlIGFuZCBCdWZmYWxvKE4pIEFQCi0JLy8gRHJpdmVyIGhhcyB0byBzZW5kIGRlYXV0aCB0byBJbnN0YW5jZSBBUCwgYnV0IEJ1ZmZhbG8oTikgbmVlZHMgdG8gc2VuZCBkaXNhc3NvYyB0byByZXNldCBBdXRoZW50aWNhdG9yJ3Mgc3RhdGUgbWFjaGluZQotCS8vIFRoZXJlZm9yZSwgd2Ugc2VuZCBib3RoIG9mIHRoZW0uCi0JcERpc2Fzc29jSGRyID0gKFBIRUFERVJfODAyXzExKXBPdXRCdWZmZXI7Ci0JcERpc2Fzc29jSGRyLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9ERUFVVEg7Ci0JTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0KLQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCi0JcEFkLT5TdGFDZmcuRGlzYXNzb2NSZWFzb24gPSBSRUFTT05fQ0xTM0VSUjsKLQlDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkRpc2Fzc29jU3RhLCBwQWRkcik7Ci19Ci0KLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0jaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi1WT0lEICAgIFNlbmRBc3NvY0lFc1RvV3BhU3VwcGxpY2FudCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JU1RSSU5HIGN1c3RvbVtJV19DVVNUT01fTUFYXSA9IHswfTsKLQotCWlmICgocEFkLT5TdGFDZmcuUmVxVmFySUVMZW4gKyAxNykgPD0gSVdfQ1VTVE9NX01BWCkKLQl7Ci0JCXNwcmludGYoY3VzdG9tLCAiQVNTT0NJTkZPX1JlcUlFcz0iKTsKLQkJTmRpc01vdmVNZW1vcnkoY3VzdG9tKzE3LCBwQWQtPlN0YUNmZy5SZXFWYXJJRXMsIHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuKTsKLQkJUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQocEFkLCBJV0VWQ1VTVE9NLCBSVF9SRVFJRV9FVkVOVF9GTEFHLCBOVUxMLCAoUFVDSEFSKWN1c3RvbSwgcEFkLT5TdGFDZmcuUmVxVmFySUVMZW4gKyAxNyk7Ci0KLQkJUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQocEFkLCBJV0VWQ1VTVE9NLCBSVF9BU1NPQ0lORk9fRVZFTlRfRkxBRywgTlVMTCwgTlVMTCwgMCk7Ci0JfQotCWVsc2UKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicEFkLT5TdGFDZmcuUmVxVmFySUVMZW4gKyAxNyA+IE1BWF9DVVNUT01fTEVOXG4iKSk7Ci0KLQlyZXR1cm47Ci19Ci0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLSNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotaW50IHdleHRfbm90aWZ5X2V2ZW50X2Fzc29jKAotCUlOICBSVE1QX0FEQVBURVIgKnBBZCkKLXsKLQljaGFyIGN1c3RvbVtJV19DVVNUT01fTUFYXSA9IHswfTsKLQotI2lmIFdJUkVMRVNTX0VYVCA+IDE3Ci0JaWYgKHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuIDw9IElXX0NVU1RPTV9NQVgpCi0JewotCQlOZGlzTW92ZU1lbW9yeShjdXN0b20sIHBBZC0+U3RhQ2ZnLlJlcVZhcklFcywgcEFkLT5TdGFDZmcuUmVxVmFySUVMZW4pOwotCQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIElXRVZBU1NPQ1JFUUlFLCAtMSwgTlVMTCwgY3VzdG9tLCBwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbik7Ci0JfQotCWVsc2UKLQkgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicEFkLT5TdGFDZmcuUmVxVmFySUVMZW4gPiBNQVhfQ1VTVE9NX0xFTlxuIikpOwotI2Vsc2UKLQlpbnQgbGVuOwotCi0JbGVuID0gKHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuKjIpICsgMTc7Ci0JaWYgKGxlbiA8PSBJV19DVVNUT01fTUFYKQotCXsKLQkJVUNIQVIgICBpZHg7Ci0JCXNwcmludGYoY3VzdG9tLCAiQVNTT0NJTkZPKFJlcUlFcz0iKTsKLQkJZm9yIChpZHg9MDsgaWR4PHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuOyBpZHgrKykKLQkJICAgICAgICBzcHJpbnRmKGN1c3RvbSwgIiVzJTAyeCIsIGN1c3RvbSwgcEFkLT5TdGFDZmcuUmVxVmFySUVzW2lkeF0pOwotCQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIElXRVZDVVNUT00sIC0xLCBOVUxMLCBjdXN0b20sIGxlbik7Ci0JfQotCWVsc2UKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgibGVuKCVkKSA+IE1BWF9DVVNUT01fTEVOXG4iLCBsZW4pKTsKLSNlbmRpZgotCi0JcmV0dXJuIDA7Ci0KLX0KLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0KLUJPT0xFQU4gU3RhQWRkTWFjVGFibGVFbnRyeSgKLQlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOICBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSwKLQlJTiAgVUNIQVIJCQkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcywKLQlJTiAgSFRfQ0FQQUJJTElUWV9JRQkqcEh0Q2FwYWJpbGl0eSwKLQlJTiAgVUNIQVIJCQkJSHRDYXBhYmlsaXR5TGVuLAotCUlOICBBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8sCi0JSU4gIFVDSEFSCQkJCUFkZEh0SW5mb0xlbiwKLQlJTiAgVVNIT1JUCQkJQ2FwYWJpbGl0eUluZm8pCi17Ci0JVUNIQVIgICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsKLQotCWlmIChBREhPQ19PTihwQWQpKQotCQlDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSk7Ci0KLQlzd2l0Y2ggKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMpCi0gICAgewotICAgICAgICBjYXNlIDEwODogTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNTQ7ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgOTY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV80ODsgICBicmVhazsKLSAgICAgICAgY2FzZSA3MjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzM2OyAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjQ7ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xODsgICBicmVhazsKLSAgICAgICAgY2FzZSAyNDogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzEyOyAgIGJyZWFrOwotICAgICAgICBjYXNlIDE4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfOTsgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV82OyAgICBicmVhazsKLSAgICAgICAgY2FzZSAyMjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOyAgIGJyZWFrOwotICAgICAgICBjYXNlIDExOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNV81OyAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yOyAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOiAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE7ICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUcpICYmIChNYXhTdXBwb3J0ZWRSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkvLyAxMW4gb25seQotCWlmICgoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl8yXzRHKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzVHKSkmJiAoSHRDYXBhYmlsaXR5TGVuID09IDApKQotCQlyZXR1cm4gRkFMU0U7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlpZiAoIXBFbnRyeSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKLQlpZiAocEVudHJ5KQotCXsKLQkJcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOwotCQlpZiAoKE1heFN1cHBvcnRlZFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkgfHwKLQkJCShwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpKQotCQl7Ci0JCQlwRW50cnktPlJhdGVMZW4gPSA0OwotCQkJaWYgKE1heFN1cHBvcnRlZFJhdGUgPj0gUkFURV9GSVJTVF9PRkRNX1JBVEUpCi0JCQkJTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7Ci0JCX0KLQkJZWxzZQotCQkJcEVudHJ5LT5SYXRlTGVuID0gMTI7Ci0KLQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZCA9IDA7Ci0JCXBFbnRyeS0+TWluSFRQaHlNb2RlLndvcmQgPSAwOwotCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gMDsKLQkJcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlID0gTWF4U3VwcG9ydGVkUmF0ZTsKLQkJaWYgKHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA8IFJBVEVfRklSU1RfT0ZETV9SQVRFKQotCQl7Ci0JCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7Ci0JCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7Ci0JCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKLQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOwotCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07Ci0JCX0KLQkJcEVudHJ5LT5DYXBhYmlsaXR5SW5mbyA9IENhcGFiaWxpdHlJbmZvOwotCQlDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19BR0dSRUdBVElPTl9DQVBBQkxFKTsKLQkJQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUElHR1lCQUNLX0NBUEFCTEUpOwotCX0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCU5kaXNaZXJvTWVtb3J5KCZwRW50cnktPkhUQ2FwYWJpbGl0eSwgc2l6ZW9mKHBFbnRyeS0+SFRDYXBhYmlsaXR5KSk7Ci0JLy8gSWYgdGhpcyBFbnRyeSBzdXBwb3J0cyA4MDIuMTFuLCB1cGdyYWRlIHRvIEhUIHJhdGUuCi0JaWYgKChIdENhcGFiaWxpdHlMZW4gIT0gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCi0JewotCQlVQ0hBUglqLCBiaXRtYXNrOyAvL2ssYml0bWFzazsKLQkJQ0hBUiAgICBpOwotCi0JCWlmIChBREhPQ19PTihwQWQpKQotCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKLQkJaWYgKChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uR0YpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YpKQotCQl7Ci0JCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKLQkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTm9uR0YgPSBUUlVFOwotCQkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID0gMTsKLQkJfQotCi0JCWlmICgocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkNoYW5uZWxXaWR0aCkgJiYKLQkJCShwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoKSAmJgotCQkJKChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkgfHwgKChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykgJiYgKHBBZGRIdEluZm8tPkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCkpKSkKLQkJewotCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlc9IEJXXzQwOwotCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9ICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCkmKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7Ci0JCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwKSYocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3IyMCkpOwotCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb24yME9ubHkgPSBUUlVFOwotCQl9Ci0KLQkJLy8gMyozCi0JCWlmIChwQWQtPk1BQ1ZlcnNpb24gPj0gUkFMSU5LXzI4ODNfVkVSU0lPTiAmJiBwQWQtPk1BQ1ZlcnNpb24gPCBSQUxJTktfMzA3MF9WRVJTSU9OKQotCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuVHhCRiA9IHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5UeEJGOwotCi0JCS8vIGZpbmQgbWF4IGZpeGVkIHJhdGUKLQkJZm9yIChpPTIzOyBpPj0wOyBpLS0pIC8vIDMqMwotCQl7Ci0JCQlqID0gaS84OwotCQkJYml0bWFzayA9ICgxPDwoaS0oaio4KSkpOwotCQkJaWYgKChwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvLk1DU1NldFtqXSAmIGJpdG1hc2spICYmIChwSHRDYXBhYmlsaXR5LT5NQ1NTZXRbal0gJiBiaXRtYXNrKSkKLQkJCXsKLQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGk9PTApCi0JCQkJYnJlYWs7Ci0JCX0KLQotCi0JCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAhPSBNQ1NfQVVUTykKLQkJewotCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID09IDMyKQotCQkJewotCQkJCS8vIEZpeCBNQ1MgYXMgSFQgRHVwbGljYXRlZCBNb2RlCi0JCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSAxOwotCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOwotCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAwOwotCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAwOwotCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IDMyOwotCQkJfQotCQkJZWxzZSBpZiAocEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID4gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUykKLQkJCXsKLQkJCQkvLyBTVEEgc3VwcG9ydHMgZml4ZWQgTUNTCi0JCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKLQkJCX0KLQkJfQotCi0JCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlJ4U1RCQyAmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSk7Ci0JCXBFbnRyeS0+TXBkdURlbnNpdHkgPSBwSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTXBkdURlbnNpdHk7Ci0JCXBFbnRyeS0+TWF4UkFtcGR1RmFjdG9yID0gcEh0Q2FwYWJpbGl0eS0+SHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvcjsKLQkJcEVudHJ5LT5NbXBzTW9kZSA9IChVQ0hBUilwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uTWltb1BzOwotCQlwRW50cnktPkFNc2R1U2l6ZSA9IChVQ0hBUilwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQU1zZHVTaXplOwotCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKLQotCQlpZiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlICYmIChwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID09IEZBTFNFKSkKLQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQpOwotCQlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3IyMCkKLQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFKTsKLQkJaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApCi0JCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRSk7Ci0JCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uVHhTVEJDKQotCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1R4U1RCQ19DQVBBQkxFKTsKLQkJaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5SeFNUQkMpCi0JCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUnhTVEJDX0NBUEFCTEUpOwotCQlpZiAocEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlBsdXNIVEMpCi0JCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfSFRDX0NBUEFCTEUpOwotCQlpZiAocEFkLT5Db21tb25DZmcuYlJkZyAmJiBwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCkKLQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7Ci0JCWlmIChwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uTUNTRmVlZGJhY2sgPT0gMHgwMykKLQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19NQ1NGRUVEQkFDS19DQVBBQkxFKTsKLQkJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+SFRDYXBhYmlsaXR5LCBwSHRDYXBhYmlsaXR5LCBIdENhcGFiaWxpdHlMZW4pOwotCX0KLQllbHNlCi0JewotCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbklzTGVnYWN5ID0gVFJVRTsKLQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKLQlwRW50cnktPkN1cnJUeFJhdGUgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7Ci0KLQkvLyBTZXQgYXNpYyBhdXRvIGZhbGwgYmFjawotCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBUUlVFKQotCXsKLQkJUFVDSEFSCQkJCQlwVGFibGU7Ci0JCVVDSEFSCQkJCQlUYWJsZVNpemUgPSAwOwotCi0JCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsIHBFbnRyeSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJnBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KTsKLQkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7Ci0JfQotCWVsc2UKLQl7Ci0JCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERTsKLQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKLQkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOwotCi0JCS8vIElmIHRoZSBsZWdhY3kgbW9kZSBpcyBzZXQsIG92ZXJ3cml0ZSB0aGUgdHJhbnNtaXQgc2V0dGluZyBvZiB0aGlzIGVudHJ5LgotCQlSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKChVQ0hBUilwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlLCBwRW50cnkpOwotCX0KLQotCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQlwRW50cnktPlNzdCA9IFNTVF9BU1NPQzsKLQlwRW50cnktPkF1dGhTdGF0ZSA9IEFTX0FVVEhfT1BFTjsKLQlwRW50cnktPkF1dGhNb2RlID0gcEFkLT5TdGFDZmcuQXV0aE1vZGU7Ci0JcEVudHJ5LT5XZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7Ci0KLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApCi0gICAgewotICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7Ci0KLSAgICAgICAgU2VuZEFzc29jSUVzVG9XcGFTdXBwbGljYW50KHBBZCk7Ci0gICAgICAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKLSAgICAgICAgd3JxdS5kYXRhLmZsYWdzID0gUlRfQVNTT0NfRVZFTlRfRkxBRzsKLSAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKLSAgICB9Ci0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLSNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgIHsKLSAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OwotICAgICAgICB3ZXh0X25vdGlmeV9ldmVudF9hc3NvYyhwQWQpOwotCi0gICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKLSAgICAgICAgbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7Ci0gICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKLQotICAgIH0KLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCXJldHVybiBUUlVFOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvYXV0aC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvYXV0aC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTdlMjk5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhL2F1dGguYworKysgL2Rldi9udWxsCkBAIC0xLDQ5MSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCWF1dGguYwotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUpvaG4JCTIwMDQtOS0zCQlwb3J0aW5nIGZyb20gUlQyNTAwCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBhdXRoZW50aWNhdGUgc3RhdGUgbWFjaGluZSBpbml0LCBpbmNsdWRpbmcgc3RhdGUgdHJhbnNpdGlvbiBhbmQgdGltZXIgaW5pdAotICAgIFBhcmFtZXRlcnM6Ci0gICAgICAgIFNtIC0gcG9pbnRlciB0byB0aGUgYXV0aCBzdGF0ZSBtYWNoaW5lCi0gICAgTm90ZToKLSAgICAgICAgVGhlIHN0YXRlIG1hY2hpbmUgbG9va3MgbGlrZSB0aGlzCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFVVEhfUkVRX0lETEUgICAgICAgICAgIEFVVEhfV0FJVF9TRVEyICAgICAgICAgICAgICAgICAgIEFVVEhfV0FJVF9TRVE0Ci0gICAgTVQyX01MTUVfQVVUSF9SRVEgICBtbG1lX2F1dGhfcmVxX2FjdGlvbiAgICBpbnZhbGlkX3N0YXRlX3doZW5fYXV0aCAgICAgICAgICBpbnZhbGlkX3N0YXRlX3doZW5fYXV0aAotICAgIE1UMl9QRUVSX0FVVEhfRVZFTiAgZHJvcCAgICAgICAgICAgICAgICAgICAgcGVlcl9hdXRoX2V2ZW5fYXRfc2VxMl9hY3Rpb24gICAgcGVlcl9hdXRoX2V2ZW5fYXRfc2VxNF9hY3Rpb24KLSAgICBNVDJfQVVUSF9USU1FT1VUICAgIERyb3AgICAgICAgICAgICAgICAgICAgIGF1dGhfdGltZW91dF9hY3Rpb24gICAgICAgICAgICAgIGF1dGhfdGltZW91dF9hY3Rpb24KLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi0KLXZvaWQgQXV0aFN0YXRlTWFjaGluZUluaXQoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gU1RBVEVfTUFDSElORSAqU20sCi0gICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQotewotICAgIFN0YXRlTWFjaGluZUluaXQoU20sIFRyYW5zLCBNQVhfQVVUSF9TVEFURSwgTUFYX0FVVEhfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIEFVVEhfUkVRX0lETEUsIEFVVEhfTUFDSElORV9CQVNFKTsKLQotICAgIC8vIHRoZSBmaXJzdCBjb2x1bW4KLSAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfUkVRX0lETEUsIE1UMl9NTE1FX0FVVEhfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVBdXRoUmVxQWN0aW9uKTsKLQotICAgIC8vIHRoZSBzZWNvbmQgY29sdW1uCi0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRMiwgTVQyX01MTUVfQVVUSF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkF1dGgpOwotICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTIsIE1UMl9QRUVSX0FVVEhfRVZFTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQXV0aFJzcEF0U2VxMkFjdGlvbik7Ci0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRMiwgTVQyX0FVVEhfVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylBdXRoVGltZW91dEFjdGlvbik7Ci0KLSAgICAvLyB0aGUgdGhpcmQgY29sdW1uCi0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRNCwgTVQyX01MTUVfQVVUSF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkF1dGgpOwotICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTQsIE1UMl9QRUVSX0FVVEhfRVZFTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQXV0aFJzcEF0U2VxNEFjdGlvbik7Ci0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRNCwgTVQyX0FVVEhfVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylBdXRoVGltZW91dEFjdGlvbik7Ci0KLQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihBdXRoVGltZW91dCksIHBBZCwgRkFMU0UpOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGF0IHRpbWVyIHRocmVhZCB3aGVuIGF1dGggdGltZXIgZXhwaXJlcwotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEF1dGhUaW1lb3V0KAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLSAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKLXsKLSAgICBSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFVVEggLSBBdXRoVGltZW91dFxuIikpOwotCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQkJcmV0dXJuOwotCi0JLy8gc2VuZCBhIGRlLWF1dGggdG8gcmVzZXQgQVAncyBzdGF0ZSBtYWNoaW5lIChQYXRjaCBBUC1EaXI2MzUpCi0JaWYgKHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPT0gQVVUSF9XQUlUX1NFUTIpCi0JCUNsczJlcnJBY3Rpb24ocEFkLCBwQWQtPk1sbWVBdXguQnNzaWQpOwotCi0KLSAgICBNbG1lRW5xdWV1ZShwQWQsIEFVVEhfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfVElNRU9VVCwgMCwgTlVMTCk7Ci0gICAgUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKLX0KLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgTWxtZUF1dGhSZXFBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCWlmIChBVVRIX1JlcVNlbmQocEFkLCBFbGVtLCAmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgIkFVVEgiLCAxLCBOVUxMLCAwKSkKLSAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfV0FJVF9TRVEyOwotICAgIGVsc2UKLSAgICB7Ci0JCVVTSE9SVCBTdGF0dXM7Ci0KLSAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgICAgIFN0YXR1cyA9IE1MTUVfSU5WQUxJRF9GT1JNQVQ7Ci0gICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOwotICAgIH0KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFBlZXJBdXRoUnNwQXRTZXEyQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLSAgICBVQ0hBUiAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07Ci0gICAgVVNIT1JUICAgICAgICBTZXEsIFN0YXR1cywgUmVtb3RlU3RhdHVzLCBBbGc7Ci0gICAgVUNIQVIgICAgICAgICBDaGxnVGV4dFtDSVBIRVJfVEVYVF9MRU5dOwotICAgIFVDSEFSICAgICAgICAgQ3lwZXJDaGxnVGV4dFtDSVBIRVJfVEVYVF9MRU4gKyA4ICsgOF07Ci0gICAgVUNIQVIgICAgICAgICBFbGVtZW50WzJdOwotICAgIEhFQURFUl84MDJfMTEgQXV0aEhkcjsKLSAgICBCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOwotICAgIFBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0gICAgTkRJU19TVEFUVVMgICBOU3RhdHVzOwotICAgIFVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOwotICAgIFVTSE9SVCAgICAgICAgU3RhdHVzMjsKLQotICAgIGlmIChQZWVyQXV0aFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJkFsZywgJlNlcSwgJlN0YXR1cywgKFBDSEFSKUNobGdUZXh0KSkKLSAgICB7Ci0gICAgICAgIGlmIChNQUNfQUREUl9FUVVBTChwQWQtPk1sbWVBdXguQnNzaWQsIEFkZHIyKSAmJiBTZXEgPT0gMikKLSAgICAgICAgewotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFJlY2VpdmUgQVVUSF9SU1Agc2VxIzIgdG8gbWUgKEFsZz0lZCwgU3RhdHVzPSVkKVxuIiwgQWxnLCBTdGF0dXMpKTsKLSAgICAgICAgICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQotICAgICAgICAgICAgaWYgKFN0YXR1cyA9PSBNTE1FX1NVQ0NFU1MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gQXV0aGVudGljYXRpb24gTW9kZSAiTEVBUCIgaGFzIGFsbG93IGZvciBDQ1ggMS5YCi0gICAgICAgICAgICAgICAgaWYgKHBBZC0+TWxtZUF1eC5BbGcgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOwotICAgICAgICAgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gMi4gc2hhcmVkIGtleSwgbmVlZCB0byBiZSBjaGFsbGVuZ2VkCi0gICAgICAgICAgICAgICAgICAgIFNlcSsrOwotICAgICAgICAgICAgICAgICAgICBSZW1vdGVTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7Ci0KLQkJCQkJLy8gR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLSAgICAgICAgICAgICAgICAgICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gUGVlckF1dGhSc3BBdFNlcTJBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbFxuIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMyID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOwotICAgICAgICAgICAgICAgICAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1czIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFNlbmQgQVVUSCByZXF1ZXN0IHNlcSMzLi4uXG4iKSk7Ci0gICAgICAgICAgICAgICAgICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmQXV0aEhkciwgU1VCVFlQRV9BVVRILCAwLCBBZGRyMiwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKLSAgICAgICAgICAgICAgICAgICAgQXV0aEhkci5GQy5XZXAgPSAxOwotICAgICAgICAgICAgICAgICAgICAvLyBFbmNyeXB0IGNoYWxsZW5nZSB0ZXh0ICYgYXV0aCBpbmZvcm1hdGlvbgotICAgICAgICAgICAgICAgICAgICBSVE1QSW5pdFdlcEVuZ2luZSgKLQkJCXBBZCwKLQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LAotCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAotCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4sCi0JCQlDeXBlckNobGdUZXh0KTsKLQotCQkJCQlBbGcgPSBjcHUybGUxNigqKFVTSE9SVCAqKSZBbGcpOwotCQkJCQlTZXEgPSBjcHUybGUxNigqKFVTSE9SVCAqKSZTZXEpOwotCQkJCQlSZW1vdGVTdGF0dXM9IGNwdTJsZTE2KCooVVNIT1JUICopJlJlbW90ZVN0YXR1cyk7Ci0KLQkJCQkJUlRNUEVuY3J5cHREYXRhKHBBZCwgKFBVQ0hBUikgJkFsZywgQ3lwZXJDaGxnVGV4dCArIDQsIDIpOwotCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCAoUFVDSEFSKSAmU2VxLCBDeXBlckNobGdUZXh0ICsgNiwgMik7Ci0JCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsIChQVUNIQVIpICZSZW1vdGVTdGF0dXMsIEN5cGVyQ2hsZ1RleHQgKyA4LCAyKTsKLQkJCQkJRWxlbWVudFswXSA9IDE2OwotCQkJCQlFbGVtZW50WzFdID0gMTI4OwotCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCBFbGVtZW50LCBDeXBlckNobGdUZXh0ICsgMTAsIDIpOwotCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCBDaGxnVGV4dCwgQ3lwZXJDaGxnVGV4dCArIDEyLCAxMjgpOwotCQkJCQlSVE1QU2V0SUNWKHBBZCwgQ3lwZXJDaGxnVGV4dCArIDE0MCk7Ci0gICAgICAgICAgICAgICAgICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICZBdXRoSGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSVBIRVJfVEVYVF9MRU4gKyAxNiwgICAgIEN5cGVyQ2hsZ1RleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKLSAgICAgICAgICAgICAgICAgICAgTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCi0gICAgICAgICAgICAgICAgICAgIFJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgQVVUSF9USU1FT1VUKTsKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfV0FJVF9TRVE0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoRmFpbFJlYXNvbiA9IFN0YXR1czsKLSAgICAgICAgICAgICAgICBDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkF1dGhGYWlsU3RhLCBBZGRyMik7Ci0gICAgICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgICAgICAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFBlZXJBdXRoU2FuaXR5KCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKLSAgICB9Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBQZWVyQXV0aFJzcEF0U2VxNEFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0gICAgVUNIQVIgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotICAgIFVTSE9SVCAgICAgICAgQWxnLCBTZXEsIFN0YXR1czsKLSAgICBDSEFSICAgICAgICAgIENobGdUZXh0W0NJUEhFUl9URVhUX0xFTl07Ci0gICAgQk9PTEVBTiAgICAgICBUaW1lckNhbmNlbGxlZDsKLQotICAgIGlmKFBlZXJBdXRoU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCAmQWxnLCAmU2VxLCAmU3RhdHVzLCBDaGxnVGV4dCkpCi0gICAgewotICAgICAgICBpZihNQUNfQUREUl9FUVVBTChwQWQtPk1sbWVBdXguQnNzaWQsIEFkZHIyKSAmJiBTZXEgPT0gNCkKLSAgICAgICAgewotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFJlY2VpdmUgQVVUSF9SU1Agc2VxIzQgdG8gbWVcbiIpKTsKLSAgICAgICAgICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQotICAgICAgICAgICAgaWYgKFN0YXR1cyAhPSBNTE1FX1NVQ0NFU1MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuQXV0aEZhaWxSZWFzb24gPSBTdGF0dXM7Ci0gICAgICAgICAgICAgICAgQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5BdXRoRmFpbFN0YSwgQWRkcjIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKLSAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBQZWVyQXV0aFJzcEF0U2VxNEFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7Ci0gICAgfQotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgTWxtZURlYXV0aFJlcUFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0gICAgTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCAqcEluZm87Ci0gICAgSEVBREVSXzgwMl8xMSBEZWF1dGhIZHI7Ci0gICAgUFVDSEFSICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLSAgICBORElTX1NUQVRVUyAgIE5TdGF0dXM7Ci0gICAgVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0gICAgVVNIT1JUICAgICAgICBTdGF0dXM7Ci0KLSAgICBwSW5mbyA9IChNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICopRWxlbS0+TXNnOwotCi0gICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLSAgICBpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIE1sbWVEZWF1dGhSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbFxuIikpOwotICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKLSAgICAgICAgU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOwotICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfREVBVVRIX0NPTkYsIDIsICZTdGF0dXMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gU2VuZCBERS1BVVRIIHJlcXVlc3QgKFJlYXNvbj0lZCkuLi5cbiIsIHBJbmZvLT5SZWFzb24pKTsKLSAgICBNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkRlYXV0aEhkciwgU1VCVFlQRV9ERUFVVEgsIDAsIHBJbmZvLT5BZGRyLCBwQWQtPk1sbWVBdXguQnNzaWQpOwotICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCZEZWF1dGhIZHIsCi0gICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICZwSW5mby0+UmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKLSAgICBNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCi0gICAgcEFkLT5TdGFDZmcuRGVhdXRoUmVhc29uID0gcEluZm8tPlJlYXNvbjsKLSAgICBDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkRlYXV0aFN0YSwgcEluZm8tPkFkZHIpOwotICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOwotICAgIFN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKLSAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfREVBVVRIX0NPTkYsIDIsICZTdGF0dXMpOwotCi0JLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBkZWF1dGhlbnRpY2F0aW9uCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQotCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19ERUFVVEhfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEF1dGhUaW1lb3V0QWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLSAgICBVU0hPUlQgU3RhdHVzOwotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBBdXRoVGltZW91dEFjdGlvblxuIikpOwotICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOwotICAgIFN0YXR1cyA9IE1MTUVfUkVKX1RJTUVPVVQ7Ci0gICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBJbnZhbGlkU3RhdGVXaGVuQXV0aCgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0gICAgVVNIT1JUIFN0YXR1czsKLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gSW52YWxpZFN0YXRlV2hlbkF1dGggKHN0YXRlPSVsZCksIHJlc2V0IEFVVEggc3RhdGUgbWFjaGluZVxuIiwgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSkpOwotICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOwotICAgIFN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7Ci0gICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU29tZSBTVEEvQVAKLSAgICBOb3RlOgotICAgICAgICBUaGlzIGFjdGlvbiBzaG91bGQgbmV2ZXIgdHJpZ2dlciBBVVRIIHN0YXRlIHRyYW5zaXRpb24sIHRoZXJlZm9yZSB3ZQotICAgICAgICBzZXBhcmF0ZSBpdCBmcm9tIEFVVEggc3RhdGUgbWFjaGluZSwgYW5kIG1ha2UgaXQgYXMgYSBzdGFuZGFsb25lIHNlcnZpY2UKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBDbHMyZXJyQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFBVQ0hBUiBwQWRkcikKLXsKLSAgICBIRUFERVJfODAyXzExIERlYXV0aEhkcjsKLSAgICBQVUNIQVIgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotICAgIE5ESVNfU1RBVFVTICAgTlN0YXR1czsKLSAgICBVTE9ORyAgICAgICAgIEZyYW1lTGVuID0gMDsKLSAgICBVU0hPUlQgICAgICAgIFJlYXNvbiA9IFJFQVNPTl9DTFMyRVJSOwotCi0gICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLSAgICBpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotICAgICAgICByZXR1cm47Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gQ2xhc3MgMiBlcnJvciwgU2VuZCBERUFVVEggZnJhbWUuLi5cbiIpKTsKLSAgICBNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkRlYXV0aEhkciwgU1VCVFlQRV9ERUFVVEgsIDAsIHBBZGRyLCBwQWQtPk1sbWVBdXguQnNzaWQpOwotICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCZEZWF1dGhIZHIsCi0gICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICZSZWFzb24sCi0gICAgICAgICAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOwotICAgIE1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0KLSAgICBwQWQtPlN0YUNmZy5EZWF1dGhSZWFzb24gPSBSZWFzb247Ci0gICAgQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5EZWF1dGhTdGEsIHBBZGRyKTsKLX0KLQotQk9PTEVBTglBVVRIX1JlcVNlbmQoCi0JSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiAgUE1MTUVfUVVFVUVfRUxFTQlwRWxlbSwKLQlJTiAgUFJBTElOS19USU1FUl9TVFJVQ1QgcEF1dGhUaW1lciwKLQlJTiAgUFNUUklORwkJCQlwU01OYW1lLAotCUlOICBVU0hPUlQJCQkJU2VxTm8sCi0JSU4gIFBVQ0hBUgkJCQlwTmV3RWxlbWVudCwKLQlJTiAgVUxPTkcJCQkJRWxlbWVudExlbikKLXsKLQlVU0hPUlQgICAgICAgICAgICAgQWxnLCBTZXEsIFN0YXR1czsKLQlVQ0hBUiAgICAgICAgICAgICAgQWRkcls2XTsKLSAgICBVTE9ORyAgICAgICAgICAgICAgVGltZW91dDsKLSAgICBIRUFERVJfODAyXzExICAgICAgQXV0aEhkcjsKLSAgICBCT09MRUFOICAgICAgICAgICAgVGltZXJDYW5jZWxsZWQ7Ci0gICAgTkRJU19TVEFUVVMgICAgICAgIE5TdGF0dXM7Ci0gICAgUFVDSEFSICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotICAgIFVMT05HICAgICAgICAgICAgICBGcmFtZUxlbiA9IDAsIHRtcCA9IDA7Ci0KLQkvLyBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QKLQlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkKLQl7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIC0gQmxvY2sgQXV0aCByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIsIHBTTU5hbWUpKTsKLSAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgICAgIFN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7Ci0gICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOwotCX0KLSAgICBlbHNlIGlmKE1sbWVBdXRoUmVxU2FuaXR5KHBBZCwgcEVsZW0tPk1zZywgcEVsZW0tPk1zZ0xlbiwgQWRkciwgJlRpbWVvdXQsICZBbGcpKQotICAgIHsKLQkvKiByZXNldCB0aW1lciAqLwotCQlSVE1QQ2FuY2VsVGltZXIocEF1dGhUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQotICAgICAgICBDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQWRkcik7Ci0gICAgICAgIHBBZC0+TWxtZUF1eC5BbGcgID0gQWxnOwotICAgICAgICBTZXEgPSBTZXFObzsKLSAgICAgICAgU3RhdHVzID0gTUxNRV9TVUNDRVNTOwotCi0gICAgICAgIE5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0gICAgICAgIGlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLSAgICAgICAgewotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgLSBNbG1lQXV0aFJlcUFjdGlvbihBbGc6JWQpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWRcbiIsIHBTTU5hbWUsIEFsZykpOwotICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgICAgICAgICBTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7Ci0gICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIC0gU2VuZCBBVVRIIHJlcXVlc3Qgc2VxIzEgKEFsZz0lZCkuLi5cbiIsIHBTTU5hbWUsIEFsZykpOwotICAgICAgICBNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkF1dGhIZHIsIFNVQlRZUEVfQVVUSCwgMCwgQWRkciwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKLSAgICAgICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCZBdXRoSGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgJkFsZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICZTZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAmU3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7Ci0KLQkJaWYgKHBOZXdFbGVtZW50ICYmIEVsZW1lbnRMZW4pCi0JCXsKLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sCSZ0bXAsCi0JCQkJCQkJICBFbGVtZW50TGVuLAkJCXBOZXdFbGVtZW50LAotCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJRnJhbWVMZW4gKz0gdG1wOwotCQl9Ci0KLSAgICAgICAgTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQotCQlSVE1QU2V0VGltZXIocEF1dGhUaW1lciwgVGltZW91dCk7Ci0JCXJldHVybiBUUlVFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBEQkdQUklOVF9FUlIoKCIlcyAtIE1sbWVBdXRoUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxlZFxuIiwgcFNNTmFtZSkpOwotCQlyZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0JcmV0dXJuIFRSVUU7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS9hdXRoX3JzcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvYXV0aF9yc3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3YmZlYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS9hdXRoX3JzcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JYXV0aF9yc3AuYwotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUpvaG4JCTIwMDQtMTAtMQkJY29weSBmcm9tIFJUMjU2MAotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgYXV0aGVudGljYXRpb24gc3RhdGUgbWFjaGluZSBpbml0IHByb2NlZHVyZQotICAgIFBhcmFtZXRlcnM6Ci0gICAgICAgIFNtIC0gdGhlIHN0YXRlIG1hY2hpbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEF1dGhSc3BTdGF0ZU1hY2hpbmVJbml0KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFBTVEFURV9NQUNISU5FIFNtLAotICAgIElOIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQotewotICAgIFN0YXRlTWFjaGluZUluaXQoU20sIFRyYW5zLCBNQVhfQVVUSF9SU1BfU1RBVEUsIE1BWF9BVVRIX1JTUF9NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgQVVUSF9SU1BfSURMRSwgQVVUSF9SU1BfTUFDSElORV9CQVNFKTsKLQotICAgIC8vIGNvbHVtbiAxCi0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1JTUF9JRExFLCBNVDJfUEVFUl9ERUFVVEgsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRlYXV0aEFjdGlvbik7Ci0KLSAgICAvLyBjb2x1bW4gMgotICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9SU1BfV0FJVF9DSEFMLCBNVDJfUEVFUl9ERUFVVEgsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRlYXV0aEFjdGlvbik7Ci0KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUGVlckF1dGhTaW1wbGVSc3BHZW5BbmRTZW5kKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKLSAgICBJTiBVU0hPUlQgQWxnLAotICAgIElOIFVTSE9SVCBTZXEsCi0gICAgSU4gVVNIT1JUIFJlYXNvbiwKLSAgICBJTiBVU0hPUlQgU3RhdHVzKQotewotICAgIEhFQURFUl84MDJfMTEgICAgIEF1dGhIZHI7Ci0gICAgVUxPTkcgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOwotICAgIFBVQ0hBUiAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotICAgIE5ESVNfU1RBVFVTICAgICAgIE5TdGF0dXM7Ci0KLSAgICBpZiAoUmVhc29uICE9IE1MTUVfU1VDQ0VTUykKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXIgQVVUSCBmYWlsLi4uXG4iKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLQkvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0gICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKLSAgICBpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotICAgICAgICByZXR1cm47Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIEFVVEggcmVzcG9uc2UgKHNlcSMyKS4uLlxuIikpOwotICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmQXV0aEhkciwgU1VCVFlQRV9BVVRILCAwLCBwSGRyODAyMTEtPkFkZHIyLCBwQWQtPk1sbWVBdXguQnNzaWQpOwotICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgJkF1dGhIZHIsCi0gICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAmQWxnLAotICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgJlNlcSwKLSAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICZSZWFzb24sCi0gICAgICAgICAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOwotICAgIE1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFBlZXJEZWF1dGhBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gUE1MTUVfUVVFVUVfRUxFTSBFbGVtKQotewotICAgIFVDSEFSICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07Ci0gICAgVVNIT1JUICAgICAgUmVhc29uOwotCi0gICAgaWYgKFBlZXJEZWF1dGhTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZSZWFzb24pKQotICAgIHsKLSAgICAgICAgaWYgKElORlJBX09OKHBBZCkKLQkJCSYmIE1BQ19BRERSX0VRVUFMKEFkZHIyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCkKLQkJCSkKLSAgICAgICAgewotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBVVRIX1JTUCAtIHJlY2VpdmUgREUtQVVUSCBmcm9tIG91ciBBUCAoUmVhc29uPSVkKVxuIiwgUmVhc29uKSk7Ci0KLQotI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0JCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgU0lPQ0dJV0FQLCAtMSwgTlVMTCwgTlVMTCwgMCk7Ci0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQotCi0JCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIGRlYXV0aGVudGljYXRpb24KLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19ERUFVVEhfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLQotICAgICAgICAgICAgTGlua0Rvd24ocEFkLCBUUlVFKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFVVEhfUlNQIC0gUGVlckRlYXV0aEFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvY29ubmVjdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvY29ubmVjdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWEzNWVlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhL2Nvbm5lY3QuYworKysgL2Rldi9udWxsCkBAIC0xLDI3NTkgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQljb25uZWN0LmMKLQotCUFic3RyYWN0OgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCQlXaGVuCQkJV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlKb2huCQkJMjAwNC0wOC0wOAkJCU1ham9yIG1vZGlmaWNhdGlvbiBmcm9tIFJUMjU2MAotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLVVDSEFSCUNpcGhlclN1aXRlV3BhTm9uZVRraXBbXSA9IHsKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCi0JCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gTXVsdGljYXN0Ci0JCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0Ci0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIHVuaWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAotCQkweDAwLCAweDUwLCAweGYyLCAweDAwCS8vIGF1dGhlbnRpY2F0aW9uCi0JCX07Ci1VQ0hBUglDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwTGVuID0gKHNpemVvZihDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwKSAvIHNpemVvZihVQ0hBUikpOwotCi1VQ0hBUglDaXBoZXJTdWl0ZVdwYU5vbmVBZXNbXSA9IHsKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCi0JCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCwJLy8gTXVsdGljYXN0Ci0JCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0Ci0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDQsCS8vIHVuaWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAotCQkweDAwLCAweDUwLCAweGYyLCAweDAwCS8vIGF1dGhlbnRpY2F0aW9uCi0JCX07Ci1VQ0hBUglDaXBoZXJTdWl0ZVdwYU5vbmVBZXNMZW4gPSAoc2l6ZW9mKENpcGhlclN1aXRlV3BhTm9uZUFlcykgLyBzaXplb2YoVUNIQVIpKTsKLQotLy8gVGhlIGZvbGxvd2luZyBNQUNSTyBpcyBjYWxsZWQgYWZ0ZXIgMS4gc3RhcnRpbmcgYW4gbmV3IElCU1MsIDIuIHN1Y2Nlc2Z1bGx5IEpPSU4gYW4gSUJTUywKLS8vIG9yIDMuIHN1Y2Nlc2Z1bGx5IEFTU09DSUFURSB0byBhIEJTUywgNC4gc3VjY2Vzc2Z1bGx5IFJFX0FTU09DSUFURSB0byBhIEJTUwotLy8gQWxsIHNldHRpbmdzIHN1Y2Nlc3NmdWx5IG5lZ290aWF0ZWQgZnVyaW5nIE1MTUUgc3RhdGUgbWFjaGluZXMgYmVjb21lIGZpbmFsIHNldHRpbmdzCi0vLyBhbmQgYXJlIGNvcGllZCB0byBwQWQtPlN0YUFjdGl2ZQotI2RlZmluZSBDT1BZX1NFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRyhfcEFkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JTmRpc1plcm9NZW1vcnkoKF9wQWQpLT5Db21tb25DZmcuU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsJCQkJCQkJXAotCShfcEFkKS0+Q29tbW9uQ2ZnLlNzaWRMZW4gPSAoX3BBZCktPk1sbWVBdXguU3NpZExlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlOZGlzTW92ZU1lbW9yeSgoX3BBZCktPkNvbW1vbkNmZy5Tc2lkLCAoX3BBZCktPk1sbWVBdXguU3NpZCwgKF9wQWQpLT5NbG1lQXV4LlNzaWRMZW4pOyBcCi0JQ09QWV9NQUNfQUREUigoX3BBZCktPkNvbW1vbkNmZy5Cc3NpZCwgKF9wQWQpLT5NbG1lQXV4LkJzc2lkKTsgICAgICAgICAgICAgICAgICAgICAgXAotCShfcEFkKS0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSAoX3BBZCktPk1sbWVBdXguQ2hhbm5lbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkoX3BBZCktPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IChfcEFkKS0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbDsgICAgICAgICAgICAgICAgICBcCi0JKF9wQWQpLT5TdGFBY3RpdmUuQWlkID0gKF9wQWQpLT5NbG1lQXV4LkFpZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCShfcEFkKS0+U3RhQWN0aXZlLkF0aW1XaW4gPSAoX3BBZCktPk1sbWVBdXguQXRpbVdpbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkoX3BBZCktPlN0YUFjdGl2ZS5DYXBhYmlsaXR5SW5mbyA9IChfcEFkKS0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbzsgICAgICAgICAgICAgICAgICBcCi0JKF9wQWQpLT5Db21tb25DZmcuQmVhY29uUGVyaW9kID0gKF9wQWQpLT5NbG1lQXV4LkJlYWNvblBlcmlvZDsgICAgICAgICAgICAgICAgICAgICAgXAotCShfcEFkKS0+U3RhQWN0aXZlLkNmcE1heER1cmF0aW9uID0gKF9wQWQpLT5NbG1lQXV4LkNmcE1heER1cmF0aW9uOyAgICAgICAgICAgICAgICAgIFwKLQkoX3BBZCktPlN0YUFjdGl2ZS5DZnBQZXJpb2QgPSAoX3BBZCktPk1sbWVBdXguQ2ZwUGVyaW9kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JKF9wQWQpLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiA9IChfcEFkKS0+TWxtZUF1eC5TdXBSYXRlTGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCU5kaXNNb3ZlTWVtb3J5KChfcEFkKS0+U3RhQWN0aXZlLlN1cFJhdGUsIChfcEFkKS0+TWxtZUF1eC5TdXBSYXRlLCAoX3BBZCktPk1sbWVBdXguU3VwUmF0ZUxlbik7XAotCShfcEFkKS0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPSAoX3BBZCktPk1sbWVBdXguRXh0UmF0ZUxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlOZGlzTW92ZU1lbW9yeSgoX3BBZCktPlN0YUFjdGl2ZS5FeHRSYXRlLCAoX3BBZCktPk1sbWVBdXguRXh0UmF0ZSwgKF9wQWQpLT5NbG1lQXV4LkV4dFJhdGVMZW4pO1wKLQlOZGlzTW92ZU1lbW9yeSgmKF9wQWQpLT5Db21tb25DZmcuQVBFZGNhUGFybSwgJihfcEFkKS0+TWxtZUF1eC5BUEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7XAotCU5kaXNNb3ZlTWVtb3J5KCYoX3BBZCktPkNvbW1vbkNmZy5BUFFvc0NhcGFiaWxpdHksICYoX3BBZCktPk1sbWVBdXguQVBRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpO1wKLQlOZGlzTW92ZU1lbW9yeSgmKF9wQWQpLT5Db21tb25DZmcuQVBRYnNzTG9hZCwgJihfcEFkKS0+TWxtZUF1eC5BUFFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTtcCi0JQ09QWV9NQUNfQUREUigoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIChfcEFkKS0+TWxtZUF1eC5Cc3NpZCk7ICAgICAgXAotCShfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWlkID0gKF9wQWQpLT5NbG1lQXV4LkFpZDsgICAgICAgICAgICAgICAgICAgICAgIFwKLQkoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IChfcEFkKS0+U3RhQ2ZnLlBhaXJDaXBoZXI7XAotCUNPUFlfTUFDX0FERFIoKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5Cc3NJZCwgKF9wQWQpLT5NbG1lQXV4LkJzc2lkKTtcCi0JKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SYXRlTGVuID0gKF9wQWQpLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiArIChfcEFkKS0+U3RhQWN0aXZlLkV4dFJhdGVMZW47XAotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIE1sbWVDbnRsSW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBTVEFURV9NQUNISU5FICpTLAotCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKLXsKLQkvLyBDb250cm9sIHN0YXRlIG1hY2hpbmUgZGlmZmVycyBmcm9tIG90aGVyIHN0YXRlIG1hY2hpbmVzLCB0aGUgaW50ZXJmYWNlCi0JLy8gZm9sbG93cyB0aGUgc3RhbmRhcmQgaW50ZXJmYWNlCi0JcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgTWxtZUNudGxNYWNoaW5lUGVyZm9ybUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBTVEFURV9NQUNISU5FICpTLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlzd2l0Y2gocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSkKLQl7Ci0JCWNhc2UgQ05UTF9JRExFOgotCQkJQ250bElkbGVQcm9jKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKLQkJY2FzZSBDTlRMX1dBSVRfRElTQVNTT0M6Ci0JCQlDbnRsV2FpdERpc2Fzc29jUHJvYyhwQWQsIEVsZW0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ05UTF9XQUlUX0pPSU46Ci0JCQlDbnRsV2FpdEpvaW5Qcm9jKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKLQotCQkvLyBDTlRMX1dBSVRfUkVBU1NPQyBpcyB0aGUgb25seSBzdGF0ZSBpbiBDTlRMIG1hY2hpbmUgdGhhdCBkb2VzCi0JCS8vIG5vdCB0cmlnZ2VyZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBieSAiUlRNUFNldEluZm9ybWF0aW9uKE9JRF94eHgpIi4KLQkJLy8gVGhlcmVmb3JlIG5vdCBwcm90ZWN0ZWQgYnkgTkRJUydzICJvbmx5IG9uZSBvdXRzdGFuZGluZyBPSUQgcmVxdWVzdCIKLQkJLy8gcnVsZS4gV2hpY2ggbWVhbnMgTkRJUyBtYXkgU0VUIE9JRCBpbiB0aGUgbWlkZGxlIG9mIFJPQU1pbmcgYXR0ZW1wdHMuCi0JCS8vIEN1cnJlbnQgYXBwcm9hY2ggaXMgdG8gYmxvY2sgbmV3IFNFVCByZXF1ZXN0IGF0IFJUTVBTZXRJbmZvcm1hdGlvbigpCi0JCS8vIHdoZW4gQ250bE1hY2hpbmUuQ3VyclN0YXRlIGlzIG5vdCBDTlRMX0lETEUKLQkJY2FzZSBDTlRMX1dBSVRfUkVBU1NPQzoKLQkJCUNudGxXYWl0UmVhc3NvY1Byb2MocEFkLCBFbGVtKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ05UTF9XQUlUX1NUQVJUOgotCQkJQ250bFdhaXRTdGFydFByb2MocEFkLCBFbGVtKTsKLQkJCWJyZWFrOwotCQljYXNlIENOVExfV0FJVF9BVVRIOgotCQkJQ250bFdhaXRBdXRoUHJvYyhwQWQsIEVsZW0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ05UTF9XQUlUX0FVVEgyOgotCQkJQ250bFdhaXRBdXRoUHJvYzIocEFkLCBFbGVtKTsKLQkJCWJyZWFrOwotCQljYXNlIENOVExfV0FJVF9BU1NPQzoKLQkJCUNudGxXYWl0QXNzb2NQcm9jKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKLQotCQljYXNlIENOVExfV0FJVF9PSURfTElTVF9TQ0FOOgotCQkJaWYoRWxlbS0+TXNnVHlwZSA9PSBNVDJfU0NBTl9DT05GKQotCQkJewotCQkJCS8vIFJlc3VtZSBUeFJpbmcgYWZ0ZXIgU0NBTklORyBjb21wbGV0ZS4gV2UgaG9wZSB0aGUgb3V0LW9mLXNlcnZpY2UgdGltZQotCQkJCS8vIHdvbid0IGJlIHRvbyBsb25nIHRvIGxldCB1cHBlciBsYXllciB0aW1lLW91dCB0aGUgd2FpdGluZyBmcmFtZXMKLQkJCQlSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbihwQWQpOwotCi0JCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKLQotICAgICAgICAgICAgICAgIC8vCi0JCQkJLy8gU2V0IExFRCBzdGF0dXMgdG8gcHJldmlvdXMgc3RhdHVzLgotCQkJCS8vCi0JCQkJaWYgKHBBZC0+YkxlZE9uU2Nhbm5pbmcpCi0JCQkJewotCQkJCQlwQWQtPmJMZWRPblNjYW5uaW5nID0gRkFMU0U7Ci0JCQkJCVJUTVBTZXRMRUQocEFkLCBwQWQtPkxlZFN0YXR1cyk7Ci0JCQkJfQotI2lmZGVmIERPVDExTl9EUkFGVDMKLQkJCQkvLyBBUCBzZW50IGEgMjA0MENvZXhpc3RlbmNlIG1nbXQgZnJhbWUsIHRoZW4gc3RhdGlvbiBwZXJmb3JtIGEgc2NhbiwgYW5kIHRoZW4gc2VuZCBiYWNrIHRoZSByZXNwb25lLgotCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC5maWVsZC5JbmZvUmVxID09IDEpCi0JCQkJewotCQkJCQlVcGRhdGUyMDQwQ29leGlzdEZyYW1lQW5kTm90aWZ5KHBBZCwgQlNTSURfV0NJRCwgVFJVRSk7Ci0JCQkJfQotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ05UTF9XQUlUX09JRF9ESVNBU1NPQzoKLQkJCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9ESVNBU1NPQ19DT05GKQotCQkJewotCQkJCUxpbmtEb3duKHBBZCwgRkFMU0UpOwotCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCURCR1BSSU5UX0VSUigoIiFFUlJPUiEgQ05UTCAtIElsbGVnYWwgbWVzc2FnZSB0eXBlKD0lbGQpIiwgRWxlbS0+TXNnVHlwZSkpOwotCQkJYnJlYWs7Ci0JfQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIENudGxJZGxlUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICAgRGlzYXNzb2NSZXE7Ci0KLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCi0JCXJldHVybjsKLQotCXN3aXRjaChFbGVtLT5Nc2dUeXBlKQotCXsKLQkJY2FzZSBPSURfODAyXzExX1NTSUQ6Ci0JCQlDbnRsT2lkU3NpZFByb2MocEFkLCBFbGVtKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgT0lEXzgwMl8xMV9CU1NJRDoKLQkJCUNudGxPaWRSVEJzc2lkUHJvYyhwQWQsRWxlbSk7Ci0JCQlicmVhazsKLQotCQljYXNlIE9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOOgotCQkJQ250bE9pZFNjYW5Qcm9jKHBBZCxFbGVtKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEU6Ci0JCQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HKTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLCBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKLQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0RJU0FTU09DOwotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFX1dJVEhfV0VCX1VJKQotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLSAgICAgICAgICAgIHsKLQkJCS8vIFNldCB0aGUgQXV0b1JlY29ubmVjdFNzaWQgdG8gcHJldmVudCBpdCByZWNvbm5lY3QgdG8gb2xkIFNTSUQKLQkJCS8vIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZSB1c2VyIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4KLQkJCXBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7Ci0JCQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7Ci0gICAgICAgICAgICB9Ci0JCQlicmVhazsKLQotCQljYXNlIE1UMl9NTE1FX1JPQU1JTkdfUkVROgotCQkJQ250bE1sbWVSb2FtaW5nUHJvYyhwQWQsIEVsZW0pOwotCQkJYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBPSURfODAyXzExX01JQ19GQUlMVVJFX1JFUE9SVF9GUkFNRToKLSAgICAgICAgICAgIFdwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZShwQWQsIEVsZW0pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU06Ci0JCQlDbnRsT2lkRExTU2V0dXBQcm9jKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQotCQlkZWZhdWx0OgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIElsbGVnYWwgbWVzc2FnZSBpbiBDbnRsSWRsZVByb2MoTXNnVHlwZT0lbGQpXG4iLEVsZW0tPk1zZ1R5cGUpKTsKLQkJCWJyZWFrOwotCX0KLX0KLQotVk9JRCBDbnRsT2lkU2NhblByb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCU1MTUVfU0NBTl9SRVFfU1RSVUNUICAgICAgIFNjYW5SZXE7Ci0JVUxPTkcgICAgICAgICAgICAgICAgICAgICAgQnNzSWR4ID0gQlNTX05PVF9GT1VORDsKLQlCU1NfRU5UUlkgICAgICAgICAgICAgICAgICBDdXJyQnNzOwotCi0jaWZkZWYgUkFMSU5LX0FURQotLyogRGlzYWJsZSBzY2FubmluZyB3aGVuIEFURSBpcyBydW5uaW5nLiAqLwotCWlmIChBVEVfT04ocEFkKSkKLQkJcmV0dXJuOwotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotCi0JLy8gcmVjb3JkIGN1cnJlbnQgQlNTIGlmIG5ldHdvcmsgaXMgY29ubmVjdGVkLgotCS8vIDIwMDMtMi0xMyBkbyBub3QgaW5jbHVkZSBjdXJyZW50IElCU1MgaWYgdGhpcyBpcyB0aGUgb25seSBTVEEgaW4gdGhpcyBJQlNTLgotCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCi0JewotCQlCc3NJZHggPSBCc3NTc2lkVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgcEFkLT5Db21tb25DZmcuQnNzaWQsIChQVUNIQVIpcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JCWlmIChCc3NJZHggIT0gQlNTX05PVF9GT1VORCkKLQkJewotCQkJTmRpc01vdmVNZW1vcnkoJkN1cnJCc3MsICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XSwgc2l6ZW9mKEJTU19FTlRSWSkpOwotCQl9Ci0JfQotCi0JLy8gY2xlYW4gdXAgcHJldmlvdXMgU0NBTiByZXN1bHQsIGFkZCBjdXJyZW50IEJTUyBiYWNrIHRvIHRhYmxlIGlmIGFueQotCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKLQlpZiAoQnNzSWR4ICE9IEJTU19OT1RfRk9VTkQpCi0JewotCQkvLyBEREsgTm90ZTogSWYgdGhlIE5JQyBpcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIEJTU0lEIGFuZCBTU0lECi0JCS8vICAgIHRoYXQgYXJlIG5vdCBjb250YWluZWQgaW4gdGhlIGxpc3Qgb2YgQlNTSURzIGdlbmVyYXRlZCBieSB0aGlzIHNjYW4sIHRoZQotCQkvLyAgICBCU1NJRCBkZXNjcmlwdGlvbiBvZiB0aGUgY3VycmVudGx5IGFzc29jaWF0ZWQgQlNTSUQgYW5kIFNTSUQgc2hvdWxkIGJlCi0JCS8vICAgIGFwcGVuZGVkIHRvIHRoZSBsaXN0IG9mIEJTU0lEcyBpbiB0aGUgTklDJ3MgZGF0YWJhc2UuCi0JCS8vIFRvIGVuc3VyZSB0aGlzLCB3ZSBhcHBlbmQgdGhpcyBCU1MgYXMgdGhlIGZpcnN0IGVudHJ5IGluIFNDQU4gcmVzdWx0Ci0JCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbMF0sICZDdXJyQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7Ci0JCXBBZC0+U2NhblRhYi5Cc3NOciA9IDE7Ci0JfQotCi0JU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIChQU1RSSU5HKSBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQlNTX0FOWSwgU0NBTl9BQ1RJVkUpOwotCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwKLQkJc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOwotCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlCZWZvcmUgY2FsbGluZyB0aGlzIHJvdXRpbmUsIHVzZXIgZGVzaXJlZCBTU0lEIHNob3VsZCBhbHJlYWR5IGJlZW4KLQkJcmVjb3JkZWQgaW4gQ29tbW9uQ2ZnLlNzaWRbXQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIENudGxPaWRTc2lkUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKiBFbGVtKQotewotCVBORElTXzgwMl8xMV9TU0lEICAgICAgICAgIHBPaWRTc2lkID0gKE5ESVNfODAyXzExX1NTSUQgKilFbGVtLT5Nc2c7Ci0JTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICAgRGlzYXNzb2NSZXE7Ci0JVUxPTkcJCQkJCSAgIE5vdzsKLQotCi0JLy8gU3RlcCAxLiByZWNvcmQgdGhlIGRlc2lyZWQgdXNlciBzZXR0aW5ncyB0byBNbG1lQXV4Ci0JTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7Ci0JTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIHBPaWRTc2lkLT5Tc2lkLCBwT2lkU3NpZC0+U3NpZExlbmd0aCk7Ci0JcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSAoVUNIQVIpcE9pZFNzaWQtPlNzaWRMZW5ndGg7Ci0JTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkJzc2lkLCBNQUNfQUREUl9MRU4pOwotCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gcEFkLT5TdGFDZmcuQnNzVHlwZTsKLQotCXBBZC0+U3RhQ2ZnLmJBdXRvQ29ubmVjdEJ5QnNzaWQgPSBGQUxTRTsKLQotCS8vCi0JLy8gVXBkYXRlIFJlY29ubmVjdCBTc2lkLCB0aGF0IHVzZXIgZGVzaXJlZCB0byBjb25uZWN0LgotCS8vCi0JTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBNQVhfTEVOX09GX1NTSUQpOwotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKLQlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4gPSBwQWQtPk1sbWVBdXguU3NpZExlbjsKLQotCS8vIHN0ZXAgMi4gZmluZCBhbGwgbWF0Y2hpbmcgQlNTIGluIHRoZSBsYXN0ZXN0IFNDQU4gcmVzdWx0IChpbkJzc1RhYikKLQkvLyAgICAmIGxvZyB0aGVtIGludG8gTWxtZUF1eC5Tc2lkQnNzVGFiIGZvciBsYXRlci1vbiBpdGVyYXRpb24uIFNvcnQgYnkgUlNTSSBvcmRlcgotCUJzc1RhYmxlU3NpZFNvcnQocEFkLCAmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIsIChQQ0hBUilwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtICVkIEJTUyBvZiAlZCBCU1MgbWF0Y2ggdGhlIGRlc2lyZSAoJWQpU1NJRCAtICVzXG4iLAotCQkJcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIsIHBBZC0+U2NhblRhYi5Cc3NOciwgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIHBBZC0+TWxtZUF1eC5Tc2lkKSk7Ci0JTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKLQotCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkgJiYKLQkJKHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4gPT0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbMF0uU3NpZExlbikgJiYKLQkJTmRpc0VxdWFsTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5WzBdLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pICYmCi0JCU1BQ19BRERSX0VRVUFMKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVswXS5Cc3NpZCkpCi0JewotCQkvLyBDYXNlIDEuIGFscmVhZHkgY29ubmVjdGVkIHdpdGggYW4gQVAgd2hvIGhhcyB0aGUgZGVzaXJlZCBTU0lECi0JCS8vICAgICAgICAgd2l0aCBoaWdoZXN0IFJTU0kKLQotCQkvLyBBZGQgY2hlY2tpbmcgTW9kZSAiTEVBUCIgZm9yIENDWCAxLjAKLQkJaWYgKCgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAotCQkJIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8Ci0JCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8Ci0JCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCi0JCQkgKSAmJgotCQkJKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCi0JCXsKLQkJCS8vIGNhc2UgMS4xIEZvciBXUEEsIFdQQS1QU0ssIGlmIHRoZSAxeCBwb3J0IGlzIG5vdCBzZWN1cmVkLCB3ZSBoYXZlIHRvIHJlZG8KLQkJCS8vICAgICAgICAgIGNvbm5lY3Rpb24gcHJvY2VzcwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAuLi5cbiIpKTsKLQkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOwotCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsCi0JCQkJCQlzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKLQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfRElTQVNTT0M7Ci0JCX0KLQkJZWxzZSBpZiAocEFkLT5iQ29uZmlnQ2hhbmdlZCA9PSBUUlVFKQotCQl7Ci0JCQkvLyBjYXNlIDEuMiBJbXBvcnRhbnQgQ29uZmlnIGhhcyBjaGFuZ2VkLCB3ZSBoYXZlIHRvIHJlY29ubmVjdCB0byB0aGUgc2FtZSBBUAotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAgQmVjYXVzZSBjb25maWcgY2hhbmdlZC4uLlxuIikpOwotCQkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKLQkJCQkJCXNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOwotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIGNhc2UgMS4zLiBhbHJlYWR5IGNvbm5lY3RlZCB0byB0aGUgU1NJRCB3aXRoIGhpZ2hlc3QgUlNTSS4KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBhbHJlYWR5IHdpdGggdGhpcyBCU1NJRC4gaWdub3JlIHRoaXMgU0VUX1NTSUQgcmVxdWVzdFxuIikpOwotCQkJLy8KLQkJCS8vIChIQ1QgMTIuMSkgMWNfd2xhbl9tZWRpYWV2ZW50cyByZXF1aXJlZAotCQkJLy8gbWVkaWEgY29ubmVjdCBldmVudHMgYXJlIGluZGljYXRlZCB3aGVuIGFzc29jaWF0aW5nIHdpdGggdGhlIHNhbWUgQVAKLQkJCS8vCi0JCQlpZiAoSU5GUkFfT04ocEFkKSkKLQkJCXsKLQkJCQkvLwotCQkJCS8vIFNpbmNlIE1lZGlhU3RhdGUgYWxyZWFkeSBpcyBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZAotCQkJCS8vIFdlIGp1c3QgaW5kaWNhdGUgdGhlIGNvbm5lY3QgZXZlbnQgYWdhaW4gdG8gbWVldCB0aGUgV0hRTCByZXF1aXJlZC4KLQkJCQkvLwotCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0JCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKLSAgICAgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gdG8gbGluayBpcyB1cAotCQkJfQotCi0JCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0JCQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIFNJT0NHSVdBUCwgLTEsICZwQWQtPk1sbWVBdXguQnNzaWRbMF0sIE5VTEwsIDApOwotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0JCX0KLQl9Ci0JZWxzZSBpZiAoSU5GUkFfT04ocEFkKSkKLQl7Ci0JCS8vCi0JCS8vIEZvciBSVDYxCi0JCS8vIFs4ODg4OF0gT0lEXzgwMl8xMV9TU0lEIHNob3VsZCBoYXZlIHJldHVybmVkIE5EVEVTVF9XRVBfQVAyKFJldHVybmVkOiApCi0JCS8vIFJUNjEgbWF5IGxvc3QgU1NJRCwgYW5kIG5vdCBjb25uZWN0IHRvIE5EVEVTVF9XRVBfQVAyIGFuZCB3aWxsIGNvbm5lY3QgdG8gTkRURVNUX1dFUF9BUDIgYnkgQXV0b3JlY29ubmVjdAotCQkvLyBCdXQgbWVkaWEgc3RhdHVzIGlzIGNvbm5lY3RlZCwgc28gdGhlIFNTSUQgbm90IHJlcG9ydCBjb3JyZWN0bHkuCi0JCS8vCi0JCWlmICghU1NJRF9FUVVBTChwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pKQotCQl7Ci0JCQkvLwotCQkJLy8gRGlmZmVyZW50IFNTSUQgbWVhbnMgbm90IFJvYW1pbmcgY2FzZSwgc28gd2UgbGV0IExpbmtEb3duKCkgdG8gSW5kaWNhdGUgYSBkaXNjb25uZWN0IGV2ZW50LgotCQkJLy8KLQkJCXBBZC0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IFRSVUU7Ci0JCX0KLQkJLy8gY2FzZSAyLiBhY3RpdmUgSU5GUkEgYXNzb2NpYXRpb24gZXhpc3RlbnQKLQkJLy8gICAgcm9hbWluZyBpcyBkb25lIHdpdGhpbiBtaW5pcG9ydCBkcml2ZXIsIG5vdGhpbmcgdG8gZG8gd2l0aCBjb25maWd1cmF0aW9uCi0JCS8vICAgIHV0aWxpdHkuIHNvIHVwb24gYSBuZXcgU0VUKE9JRF84MDJfMTFfU1NJRCkgaXMgcmVjZWl2ZWQsIHdlIGp1c3QKLQkJLy8gICAgZGlzYXNzb2NpYXRlIHdpdGggdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCwKLQkJLy8gICAgdGhlbiBwZXJmb3JtIGEgbmV3IGFzc29jaWF0aW9uIHdpdGggdGhpcyBuZXcgU1NJRCwgbm8gbWF0dGVyIHRoZQotCQkvLyAgICBuZXcvb2xkIFNTSUQgYXJlIHRoZSBzYW1lIG9yIG5vdC4KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAuLi5cbiIpKTsKLQkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7Ci0JCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLAotCQkJCQlzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKLQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKLQl9Ci0JZWxzZQotCXsKLQkJaWYgKEFESE9DX09OKHBBZCkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBkcm9wIGN1cnJlbnQgQURIT0NcbiIpKTsKLQkJCUxpbmtEb3duKHBBZCwgRkFMU0UpOwotCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKLQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7Ci0JCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOwotICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQyFcbiIpKTsKLQkJfQotCi0JCWlmICgocEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIgPT0gMCkgJiYKLQkJCShwQWQtPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9PSBUUlVFKSAmJgotCQkJKHBBZC0+TWxtZUF1eC5Cc3NUeXBlID09IEJTU19JTkZSQSkgJiYKLQkJCShNbG1lVmFsaWRhdGVTU0lEKHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbikgPT0gVFJVRSkKLQkJCSkKLQkJewotCQkJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgICAgICAgU2NhblJlcTsKLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIE5vIG1hdGNoaW5nIEJTUywgc3RhcnQgYSBuZXcgc2NhblxuIikpOwotCQkJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIChQU1RSSU5HKSBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIEJTU19BTlksIFNDQU5fQUNUSVZFKTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwgc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOwotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOwotCQkJLy8gUmVzZXQgTWlzc2VkIHNjYW4gbnVtYmVyCi0JCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBOb3c7Ci0JCX0KLQkJZWxzZQotCQl7Ci0KLQkJCXBBZC0+TWxtZUF1eC5Cc3NJZHggPSAwOwotCQkJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7Ci0JCX0KLQl9Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQ250bE9pZFJUQnNzaWRQcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pCi17Ci0JVUxPTkcgICAgICAgQnNzSWR4OwotCVBVQ0hBUiAgICAgIHBPaWRCc3NpZCA9IChQVUNIQVIpRWxlbS0+TXNnOwotCU1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCAgICBEaXNhc3NvY1JlcTsKLQlNTE1FX0pPSU5fUkVRX1NUUlVDVCAgICAgICAgSm9pblJlcTsKLQotI2lmZGVmIFJBTElOS19BVEUKLS8qIE5vIG5lZWQgdG8gcGVyZm9ybSB0aGlzIHJvdXRpbmUgd2hlbiBBVEUgaXMgcnVubmluZy4gKi8KLQlpZiAoQVRFX09OKHBBZCkpCi0JCXJldHVybjsKLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLQkvLyByZWNvcmQgdXNlciBkZXNpcmVkIHNldHRpbmdzCi0JQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIHBPaWRCc3NpZCk7Ci0JcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBwQWQtPlN0YUNmZy5Cc3NUeXBlOwotCi0JLy8gZmluZCB0aGUgZGVzaXJlZCBCU1MgaW4gdGhlIGxhdGVzdCBTQ0FOIHJlc3VsdCB0YWJsZQotCUJzc0lkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIHBPaWRCc3NpZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOwotCWlmIChCc3NJZHggPT0gQlNTX05PVF9GT1VORCkKLQl7Ci0JCU1MTUVfU0NBTl9SRVFfU1RSVUNUICAgICAgIFNjYW5SZXE7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEJTU0lEIG5vdCBmb3VuZC4gcmVwbHkgTkRJU19TVEFUVVNfTk9UX0FDQ0VQVEVEXG4iKSk7Ci0JCS8vcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQlNTSUQgbm90IGZvdW5kLiBzdGFydCBhIG5ldyBzY2FuXG4iKSk7Ci0JCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCAoUFNUUklORykgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCBCU1NfQU5ZLCBTQ0FOX0FDVElWRSk7Ci0JCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwgc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOwotCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47Ci0JCS8vIFJlc2V0IE1pc3NlZCBzY2FuIG51bWJlcgotCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8KLQkvLyBVcGRhdGUgUmVjb25uZWN0IFNzaWQsIHRoYXQgdXNlciBkZXNpcmVkIHRvIGNvbm5lY3QuCi0JLy8KLQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7Ci0JcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uU3NpZExlbjsKLQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLlNzaWQsIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLlNzaWRMZW4pOwotCi0JLy8gY29weSB0aGUgbWF0Y2hlZCBCU1MgZW50cnkgZnJvbSBTY2FuVGFiIHRvIE1sbWVBdXguU3NpZEJzc1RhYi4gV2h5PwotCS8vIEJlY2F1c2Ugd2UgbmVlZCB0aGlzIGVudHJ5IHRvIGJlY29tZSB0aGUgSk9JTiB0YXJnZXQgaW4gbGF0ZXIgb24gU1lOQyBzdGF0ZSBtYWNoaW5lCi0JcEFkLT5NbG1lQXV4LkJzc0lkeCA9IDA7Ci0JcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIgPSAxOwotCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVswXSwgJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLCBzaXplb2YoQlNTX0VOVFJZKSk7Ci0KLQkvLyBBZGQgU1NJRCBpbnRvIE1sbWVBdXggZm9yIHNpdGUgc3VyZXkgam9pbmluZyBoaWRkZW4gU1NJRAotCXBBZC0+TWxtZUF1eC5Tc2lkTGVuID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uU3NpZExlbjsKLQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOwotCi0JewotCQlpZiAoSU5GUkFfT04ocEFkKSkKLQkJewotCQkJLy8gZGlzYXNzb2MgZnJvbSBjdXJyZW50IEFQIGZpcnN0Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUCAuLi5cbiIpKTsKLQkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOwotCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsCi0JCQkJCQlzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKLQotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChBREhPQ19PTihwQWQpKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBkcm9wIGN1cnJlbnQgQURIT0NcbiIpKTsKLQkJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKLQkJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwotCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7Ci0JCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKLSAgICAgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQyFcbiIpKTsKLQkJCX0KLQotCQkJLy8gQ2hhbmdlIHRoZSB3ZXBzdGF0dXMgdG8gb3JpZ2luYWwgd2Vwc3RhdHVzCi0JCQlwQWQtPlN0YUNmZy5XZXBTdGF0dXMgICA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7Ci0JCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyICA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7Ci0JCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7Ci0KLQkJCS8vIENoZWNrIGNpcGhlciBzdWl0ZSwgQVAgbXVzdCBoYXZlIG1vcmUgc2VjdXJlZCBjaXBoZXIgdGhhbiBzdGF0aW9uIHNldHRpbmcKLQkJCS8vIFNldCB0aGUgUGFpcndpc2UgYW5kIEdyb3VwIGNpcGhlciB0byBtYXRjaCB0aGUgaW50ZW5kZWQgQVAgc2V0dGluZwotCQkJLy8gV2UgY2FuIG9ubHkgY29ubmVjdCB0byBBUCB3aXRoIGxlc3Mgc2VjdXJlZCBjaXBoZXIgc2V0dGluZwotCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQotCQkJewotCQkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLkdyb3VwQ2lwaGVyOwotCi0JCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlcikKLQkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyOwotCQkJCWVsc2UgaWYgKHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyQXV4ICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKLQkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyQXV4OwotCQkJCWVsc2UJLy8gVGhlcmUgaXMgbm8gUGFpckNpcGhlciBBdXgsIGRvd25ncmFkZSBvdXIgY2FwYWJpbGl0eSB0byBUS0lQCi0JCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOwotCQkJfQotCQkJZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKLQkJCXsKLQkJCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuR3JvdXBDaXBoZXI7Ci0KLQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlcikKLQkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlcjsKLQkJCQllbHNlIGlmIChwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXJBdXggIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQotCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyQXV4OwotCQkJCWVsc2UJLy8gVGhlcmUgaXMgbm8gUGFpckNpcGhlciBBdXgsIGRvd25ncmFkZSBvdXIgY2FwYWJpbGl0eSB0byBUS0lQCi0JCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOwotCi0JCQkJLy8gUlNOIGNhcGFiaWxpdHkKLQkJCQlwQWQtPlN0YUNmZy5Sc25DYXBhYmlsaXR5ID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5Sc25DYXBhYmlsaXR5OwotCQkJfQotCi0JCQkvLyBTZXQgTWl4IGNpcGhlciBmbGFnCi0JCQlwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyID0gKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIpID8gRkFMU0UgOiBUUlVFOwotCQkJLyppZiAocEFkLT5TdGFDZmcuYk1peENpcGhlciA9PSBUUlVFKQotCQkJewotCQkJCS8vIElmIG1peCBjaXBoZXIsIHJlLWJ1aWxkIFJTTklFCi0JCQkJUlRNUE1ha2VSU05JRShwQWQsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIDApOwotCQkJfSovCi0JCQkvLyBObyBhY3RpdmUgYXNzb2NpYXRpb24sIGpvaW4gdGhlIEJTUyBpbW1lZGlhdGVseQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGpvaW5pbmcgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggLi4uXG4iLAotCQkJCXBPaWRCc3NpZFswXSxwT2lkQnNzaWRbMV0scE9pZEJzc2lkWzJdLHBPaWRCc3NpZFszXSxwT2lkQnNzaWRbNF0scE9pZEJzc2lkWzVdKSk7Ci0KLQkJCUpvaW5QYXJtRmlsbChwQWQsICZKb2luUmVxLCBwQWQtPk1sbWVBdXguQnNzSWR4KTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9KT0lOX1JFUSwgc2l6ZW9mKE1MTUVfSk9JTl9SRVFfU1RSVUNUKSwgJkpvaW5SZXEpOwotCi0JCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0pPSU47Ci0JCX0KLQl9Ci19Ci0KLS8vIFJvYW1pbmcgaXMgdGhlIG9ubHkgZXh0ZXJuYWwgcmVxdWVzdCB0cmlnZ2VyaW5nIENOVEwgc3RhdGUgbWFjaGluZQotLy8gZGVzcGl0ZSBvZiBvdGhlciAiU0VUIE9JRCIgb3BlcmF0aW9uLiBBbGwgIlNFVCBPSUQiIHJlbGF0ZWQgb2VyYXRpb25zCi0vLyBoYXBwZW4gaW4gc2VxdWVuY2UsIGJlY2F1c2Ugbm8gb3RoZXIgU0VUIE9JRCB3aWxsIGJlIHNlbnQgdG8gdGhpcyBkZXZpY2UKLS8vIHVudGlsIHRoZSB0aGUgcHJldmlvdXMgU0VUIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSAoc3VjY2Vzc2Z1bCBvIGZhaWxlZCkuCi0vLyBTbywgaG93IGRvIHdlIHF1YXJhbnRlZSB0aGlzIFJPQU1JTkcgcmVxdWVzdCB3b24ndCBjb3JydXB0IG90aGVyICJTRVQgT0lEIj8KLS8vIG9yIGJlZW4gY29ycnVwdGVkIGJ5IG90aGVyICJTRVQgT0lEIj8KLS8vCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVZPSUQgQ250bE1sbWVSb2FtaW5nUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVUNIQVIgQkJQVmFsdWUgPSAwOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gUm9hbWluZyBpbiBNbG1lQXV4LlJvYW1UYWIuLi5cbiIpKTsKLQotCXsKLQkJLy9MZXQgQkJQIHJlZ2lzdGVyIGF0IDIwTUh6IHRvIGRvIChmYXN0KSByb2FtaW5nLgotCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7Ci0JCUJCUFZhbHVlICY9ICh+MHgxOCk7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKLQotCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIsICZwQWQtPk1sbWVBdXguUm9hbVRhYiwgc2l6ZW9mKHBBZC0+TWxtZUF1eC5Sb2FtVGFiKSk7Ci0JCXBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yID0gcEFkLT5NbG1lQXV4LlJvYW1UYWIuQnNzTnI7Ci0KLQkJQnNzVGFibGVTb3J0QnlSc3NpKCZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYik7Ci0JCXBBZC0+TWxtZUF1eC5Cc3NJZHggPSAwOwotCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKLQl9Ci19Ci0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIENudGxPaWRETFNTZXR1cFByb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVBSVF84MDJfMTFfRExTCQlwRExTID0gKFBSVF84MDJfMTFfRExTKUVsZW0tPk1zZzsKLQlNTE1FX0RMU19SRVFfU1RSVUNUCU1sbWVEbHNSZXE7Ci0JSU5UCQkJCQlpOwotCVVTSE9SVAkJCQlyZWFzb24gPSBSRUFTT05fVU5TUEVDSUZZOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gKE9JRCBzZXQgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggd2l0aCBWYWxpZD0lZCwgU3RhdHVzPSVkLCBUaW1lT3V0PSVkLCBDb3VudERvd25UaW1lcj0lZClcbiIsCi0JCXBETFMtPk1hY0FkZHJbMF0sIHBETFMtPk1hY0FkZHJbMV0sIHBETFMtPk1hY0FkZHJbMl0sIHBETFMtPk1hY0FkZHJbM10sIHBETFMtPk1hY0FkZHJbNF0sIHBETFMtPk1hY0FkZHJbNV0sCi0JCXBETFMtPlZhbGlkLCBwRExTLT5TdGF0dXMsIHBETFMtPlRpbWVPdXQsIHBETFMtPkNvdW50RG93blRpbWVyKSk7Ci0KLQlpZiAoIXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQotCQlyZXR1cm47Ci0KLQkvLyBETFMgd2lsbCBub3QgYmUgc3VwcG9ydGVkIHdoZW4gQWRob2MgbW9kZQotCWlmIChJTkZSQV9PTihwQWQpKQotCXsKLQkJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCi0JCXsKLQkJCWlmIChwRExTLT5WYWxpZCAmJiBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpICYmCi0JCQkJKHBETFMtPlRpbWVPdXQgPT0gcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCkgJiYgTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCi0JCQl7Ci0JCQkJLy8gMS4gU2FtZSBzZXR0aW5nLCBqdXN0IGRyb3AgaXQKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBzZXR0aW5nIHVuY2hhbmdlZFxuIikpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZiAoIXBETFMtPlZhbGlkICYmIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkgJiYKLQkJCQlNQUNfQUREUl9FUVVBTChwRExTLT5NYWNBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKLQkJCXsKLQkJCQkvLyAyLiBEaXNhYmxlIERMUyBsaW5rIGNhc2UsIGp1c3QgdGVhciBkb3duIERMUyBsaW5rCi0JCQkJcmVhc29uID0gUkVBU09OX1FPU19VTldBTlRFRF9NRUNIQU5JU007Ci0JCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKLQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKLQkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7Ci0JCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gc3RhcnQgdGVhciBkb3duIHByb2NlZHVyZVxuIikpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZiAoKGkgPCBNQVhfTlVNX09GX0RMU19FTlRSWSkgJiYgcERMUy0+VmFsaWQgJiYgIXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkKQotCQkJewotCQkJCS8vIDMuIEVuYWJsZSBjYXNlLCBzdGFydCBETFMgc2V0dXAgcHJvY2VkdXJlCi0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCBwRExTLCBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpOwotCi0JCQkJLy9VcGRhdGUgY291bnRkb3duIHRpbWVyCi0JCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPSBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0OwotCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKLQkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfUkVRLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBETFMgc2V0dXAgY2FzZVxuIikpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZiAoKGkgPCBNQVhfTlVNX09GX0RMU19FTlRSWSkgJiYgcERMUy0+VmFsaWQgJiYgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYKLQkJCQkocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpICYmICFNQUNfQUREUl9FUVVBTChwRExTLT5NYWNBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKLQkJCXsKLQkJCQkvLyA0LiB1cGRhdGUgbWFjIGNhc2UsIHRlYXIgZG93biBvbGQgRExTIGFuZCBzZXR1cCBuZXcgRExTCi0JCQkJcmVhc29uID0gUkVBU09OX1FPU19VTldBTlRFRF9NRUNIQU5JU007Ci0JCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKLQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKLQkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7Ci0JCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCBwRExTLCBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpOwotCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKLQkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfUkVRLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBETFMgdGVhciBkb3duIGFuZCByZXN0YXJ0IGNhc2VcbiIpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYgKHBETFMtPlZhbGlkICYmIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmCi0JCQkJTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQgIT0gcERMUy0+VGltZU91dCkpCi0JCQl7Ci0JCQkJLy8gNS4gdXBkYXRlIHRpbWVvdXQgY2FzZSwgc3RhcnQgRExTIHNldHVwIHByb2NlZHVyZSAobm8gdGVhciBkb3duKQotCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQJPSBwRExTLT5UaW1lT3V0OwotCQkJCS8vVXBkYXRlIGNvdW50ZG93biB0aW1lcgotCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyID0gcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dDsKLQkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7Ci0JCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1JFUSwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gRExTIHVwZGF0ZSB0aW1lb3V0IGNhc2VcbiIpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYgKHBETFMtPlZhbGlkICYmIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmCi0JCQkJKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyAhPSBETFNfRklOSVNIKSAmJiBNQUNfQUREUl9FUVVBTChwRExTLT5NYWNBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKLQkJCXsKLQkJCQkvLyA2LiByZS1zZXR1cCBjYXNlLCBzdGFydCBETFMgc2V0dXAgcHJvY2VkdXJlIChubyB0ZWFyIGRvd24pCi0JCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOwotCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19SRVEsIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ05UTCAtIERMUyByZXRyeSBzZXR1cCBwcm9jZWR1cmVcbiIpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCgiQ05UTCAtIERMUyBub3QgY2hhbmdlZCBpbiBlbnRyeSAtICVkIC0gVmFsaWQ9JWQsIFN0YXR1cz0lZCwgVGltZU91dD0lZFxuIiwKLQkJCQkJaSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cywgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCkpOwotCQkJfQotCQl9Ci0JfQotfQotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBDbnRsV2FpdERpc2Fzc29jUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JTUxNRV9TVEFSVF9SRVFfU1RSVUNUICAgICBTdGFydFJlcTsKLQotCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9ESVNBU1NPQ19DT05GKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIERpcy1hc3NvY2lhdGUgc3VjY2Vzc2Z1bFxuIikpOwotCi0JICAgIGlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQkJewotCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfRElTQVNTT0NfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLQkJfQotCi0JCUxpbmtEb3duKHBBZCwgRkFMU0UpOwotCi0JCS8vIGNhc2UgMS4gbm8gbWF0Y2hpbmcgQlNTLCBhbmQgdXNlciB3YW50cyBBREhPQywgc28gd2UganVzdCBzdGFydCBhIG5ldyBvbmUKLQkJaWYgKChwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOcj09MCkgJiYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIE5vIG1hdGNoaW5nIEJTUywgc3RhcnQgYSBuZXcgQURIT0MgKFNzaWQ9JXMpLi4uXG4iLHBBZC0+TWxtZUF1eC5Tc2lkKSk7Ci0JCQlTdGFydFBhcm1GaWxsKHBBZCwgJlN0YXJ0UmVxLCAoUENIQVIpcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TVEFSVF9SRVEsIHNpemVvZihNTE1FX1NUQVJUX1JFUV9TVFJVQ1QpLCAmU3RhcnRSZXEpOwotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9TVEFSVDsKLQkJfQotCQkvLyBjYXNlIDIuIHRyeSBlYWNoIG1hdGNoZWQgQlNTCi0JCWVsc2UKLQkJewotCQkJcEFkLT5NbG1lQXV4LkJzc0lkeCA9IDA7Ci0KLQkJCUl0ZXJhdGVPbkJzc1RhYihwQWQpOwotCQl9Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBDbnRsV2FpdEpvaW5Qcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgUmVhc29uOwotCU1MTUVfQVVUSF9SRVFfU1RSVUNUICAgICAgICBBdXRoUmVxOwotCi0JaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0pPSU5fQ09ORikKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOwotCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykKLQkJewotCQkJLy8gMS4gam9pbmVkIGFuIElCU1MsIHdlIGFyZSBwcmV0dHkgbXVjaCBkb25lIGhlcmUKLQkJCWlmIChwQWQtPk1sbWVBdXguQnNzVHlwZSA9PSBCU1NfQURIT0MpCi0JCQl7Ci0JCQkgICAgLy8KLQkJCQkvLyA1RyBiYW5kcyBydWxlcyBvZiBKYXBhbjoKLQkJCQkvLyBBZCBob2MgbXVzdCBiZSBkaXNhYmxlZCBpbiBXNTMoY2g1Miw1Niw2MCw2NCkgY2hhbm5lbHMuCi0JCQkJLy8KLQkJCQlpZiAoIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJgotICAgICAgICAgICAgICAgICAgICAgIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQkJCQkgICApCi0JCQkJewotCQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQ2hhbm5lbD0lZCwgSm9pbiBhZGhvYyBvbiBXNTMoNTIsNTYsNjAsNjQpIENoYW5uZWxzIGFyZSBub3QgYWNjZXB0ZWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCUxpbmtVcChwQWQsIEJTU19BREhPQyk7Ci0JCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gam9pbiB0aGUgSUJTUyA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IC4uLlxuIiwKLQkJCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZFswXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFsxXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFsyXSwKLQkJCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZFszXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFs0XSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFs1XSkpOwotCi0gICAgICAgICAgICAgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKLSAgICAgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsKLQkJCX0KLQkJCS8vIDIuIGpvaW5lZCBhIG5ldyBJTkZSQSBuZXR3b3JrLCBzdGFydCBmcm9tIGF1dGhlbnRpY2F0aW9uCi0JCQllbHNlCi0JCQl7Ci0JCQkJewotCQkJCQkvLyBlaXRoZXIgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkIG9yIE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gsIHRyeSBzaGFyZWQga2V5IGZpcnN0Ci0JCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKSB8fAotCQkJCQkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gpKQotCQkJCQl7Ci0JCQkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBBVVRIX01PREVfS0VZKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIEFVVEhfTU9ERV9PUEVOKTsKLQkJCQkJfQotCQkJCQlNbG1lRW5xdWV1ZShwQWQsIEFVVEhfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfQVVUSF9SRVEsCi0JCQkJCQkJc2l6ZW9mKE1MTUVfQVVUSF9SRVFfU1RSVUNUKSwgJkF1dGhSZXEpOwotCQkJCX0KLQotCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfQVVUSDsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIDMuIGZhaWxlZCwgdHJ5IG5leHQgQlNTCi0JCQlwQWQtPk1sbWVBdXguQnNzSWR4Kys7Ci0JCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKLQkJfQotCX0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBDbnRsV2FpdFN0YXJ0UHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVVNIT1JUICAgICAgUmVzdWx0OwotCi0JaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX1NUQVJUX0NPTkYpCi0JewotCQlOZGlzTW92ZU1lbW9yeSgmUmVzdWx0LCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKLQkJaWYgKFJlc3VsdCA9PSBNTE1FX1NVQ0NFU1MpCi0JCXsKLQkJICAgIC8vCi0JCQkvLyA1RyBiYW5kcyBydWxlcyBvZiBKYXBhbjoKLQkJCS8vIEFkIGhvYyBtdXN0IGJlIGRpc2FibGVkIGluIFc1MyhjaDUyLDU2LDYwLDY0KSBjaGFubmVscy4KLQkJCS8vCi0JCQlpZiAoIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJgotICAgICAgICAgICAgICAgICAgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQotCQkJICAgKQotCQkJewotCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIENoYW5uZWw9JWQsIFN0YXJ0IGFkaG9jIG9uIFc1Myg1Miw1Niw2MCw2NCkgQ2hhbm5lbHMgYXJlIG5vdCBhY2NlcHRlZFxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOwotCQkJCXJldHVybjsKLQkJCX0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSwgMTYpOwotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKLQkJCXsKLQkJCQlOX0NoYW5uZWxDaGVjayhwQWQpOwotCQkJCVNldENvbW1vbkhUKHBBZCk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sICZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOwotCQkJCVJUTVBDaGVja0h0KHBBZCwgQlNTSURfV0NJRCwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbyk7Ci0JCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBUUlVFOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0sIDE2KTsKLQkJCQlDT1BZX0hUU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKHBBZCk7Ci0KLQkJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoICA9PSBCV180MCkgJiYKLQkJCQkJKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQUJPVkUpKQotCQkJCXsKLQkJCQkJcEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCArIDI7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCAgPT0gQldfNDApICYmCi0JCQkJCQkgKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQkVMT1cpKQotCQkJCXsKLQkJCQkJcEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCAtIDI7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJewotCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gRkFMU0U7Ci0JCQl9Ci0JCQlMaW5rVXAocEFkLCBCU1NfQURIT0MpOwotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKLQkJCS8vIEJlZm9yZSBzZW5kIGJlYWNvbiwgZHJpdmVyIG5lZWQgZG8gcmFkYXIgZGV0ZWN0aW9uCi0JCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCApCi0JCQkJJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpCi0JCQkJJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSkKLQkJCXsKLQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgPSBSRF9TSUxFTkNFX01PREU7Ci0JCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRDb3VudCA9IDA7Ci0jaWZkZWYgREZTX1NVUFBPUlQKLQkJCQlCYnBSYWRhckRldGVjdGlvblN0YXJ0KHBBZCk7Ci0jZW5kaWYgLy8gREZTX1NVUFBPUlQgLy8KLQkJCX0KLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIHN0YXJ0IGEgbmV3IElCU1MgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAuLi5cbiIsCi0JCQkJcEFkLT5Db21tb25DZmcuQnNzaWRbMF0scEFkLT5Db21tb25DZmcuQnNzaWRbMV0scEFkLT5Db21tb25DZmcuQnNzaWRbMl0sCi0JCQkJcEFkLT5Db21tb25DZmcuQnNzaWRbM10scEFkLT5Db21tb25DZmcuQnNzaWRbNF0scEFkLT5Db21tb25DZmcuQnNzaWRbNV0pKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBTdGFydCBJQlNTIGZhaWwuIEJVRyEhISEhXG4iKSk7Ci0JCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotCQl9Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBDbnRsV2FpdEF1dGhQcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgIFJlYXNvbjsKLQlNTE1FX0FTU09DX1JFUV9TVFJVQ1QgICAgICAgIEFzc29jUmVxOwotCU1MTUVfQVVUSF9SRVFfU1RSVUNUICAgICAgICAgQXV0aFJlcTsKLQotCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9BVVRIX0NPTkYpCi0JewotCQlOZGlzTW92ZU1lbW9yeSgmUmVhc29uLCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKLQkJaWYgKFJlYXNvbiA9PSBNTE1FX1NVQ0NFU1MpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBVVRIIE9LXG4iKSk7Ci0JCQlBc3NvY1Bhcm1GaWxsKHBBZCwgJkFzc29jUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIHBBZC0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbywKLQkJCQkJCSAgQVNTT0NfVElNRU9VVCwgcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50KTsKLQotCQkJewotCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfQVNTT0NfUkVRLAotCQkJCQkJCXNpemVvZihNTE1FX0FTU09DX1JFUV9TVFJVQ1QpLCAmQXNzb2NSZXEpOwotCi0JCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9BU1NPQzsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIFRoaXMgZmFpbCBtYXkgYmVjYXVzZSBvZiB0aGUgQVAgYWxyZWFkeSBrZWVwIHVzIGluIGl0cyBNQUMgdGFibGUgd2l0aG91dAotCQkJLy8gYWdlaW5nLW91dC4gVGhlIHByZXZpb3VzIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHQgbXVzdCBoYXZlIGxldCBpdCByZW1vdmUgdXMuCi0JCQkvLyBzbyB0cnkgQXV0aGVudGljYXRpb24gYWdhaW4gbWF5IGhlbHAuIEZvciBELUxpbmsgRFdMLTkwMEFQKyBjb21wYXRpYmlsaXR5LgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggRkFJTCwgdHJ5IGFnYWluLi4uXG4iKSk7Ci0JCQl7Ci0JCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpIHx8Ci0JCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKSkKLQkJCQl7Ci0JCQkJCS8vIGVpdGhlciBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQgb3IgTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCwgdHJ5IHNoYXJlZCBrZXkgZmlyc3QKLQkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgQVVUSF9NT0RFX0tFWSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIEFVVEhfTU9ERV9PUEVOKTsKLQkJCQl9Ci0JCQkJTWxtZUVucXVldWUocEFkLCBBVVRIX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FVVEhfUkVRLAotCQkJCQkJCXNpemVvZihNTE1FX0FVVEhfUkVRX1NUUlVDVCksICZBdXRoUmVxKTsKLQotCQkJfQotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9BVVRIMjsKLQkJfQotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQ250bFdhaXRBdXRoUHJvYzIoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgUmVhc29uOwotCU1MTUVfQVNTT0NfUkVRX1NUUlVDVCAgICAgICAgQXNzb2NSZXE7Ci0JTUxNRV9BVVRIX1JFUV9TVFJVQ1QgICAgICAgICBBdXRoUmVxOwotCi0JaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0FVVEhfQ09ORikKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOwotCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggT0tcbiIpKTsKLQkJCUFzc29jUGFybUZpbGwocEFkLCAmQXNzb2NSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvLAotCQkJCQkJCSAgQVNTT0NfVElNRU9VVCwgcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50KTsKLQkJCXsKLQkJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FTU09DX1JFUSwKLQkJCQkJCQlzaXplb2YoTUxNRV9BU1NPQ19SRVFfU1RSVUNUKSwgJkFzc29jUmVxKTsKLQotCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfQVNTT0M7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gpICYmCi0JCQkJIChwQWQtPk1sbWVBdXguQWxnID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggRkFJTCwgdHJ5IE9QRU4gc3lzdGVtLi4uXG4iKSk7Ci0JCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTmRpczgwMl8xMUF1dGhNb2RlT3Blbik7Ci0JCQkJTWxtZUVucXVldWUocEFkLCBBVVRIX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FVVEhfUkVRLAotCQkJCQkJCXNpemVvZihNTE1FX0FVVEhfUkVRX1NUUlVDVCksICZBdXRoUmVxKTsKLQotCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfQVVUSDI7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gbm90IHN1Y2Nlc3MsIHRyeSBuZXh0IEJTUwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBVVRIIEZBSUwsIGdpdmUgdXA7IHRyeSBuZXh0IEJTU1xuIikpOwotCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7IC8vPz8/Pz8/PwotCQkJCXBBZC0+TWxtZUF1eC5Cc3NJZHgrKzsKLQkJCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQ250bFdhaXRBc3NvY1Byb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVTSE9SVCAgICAgIFJlYXNvbjsKLQotCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9BU1NPQ19DT05GKQotCXsKLQkJTmRpc01vdmVNZW1vcnkoJlJlYXNvbiwgRWxlbS0+TXNnLCBzaXplb2YoVVNIT1JUKSk7Ci0JCWlmIChSZWFzb24gPT0gTUxNRV9TVUNDRVNTKQotCQl7Ci0JCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JCQl7Ci0JCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfQVNTT0NfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLQkJCX0KLQotCQkJTGlua1VwKHBBZCwgQlNTX0lORlJBKTsKLQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQXNzb2NpYXRpb24gc3VjY2Vzc2Z1bCBvbiBCU1MgIyVsZFxuIixwQWQtPk1sbWVBdXguQnNzSWR4KSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyBub3Qgc3VjY2VzcywgdHJ5IG5leHQgQlNTCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQXNzb2NpYXRpb24gZmFpbHMgb24gQlNTICMlbGRcbiIscEFkLT5NbG1lQXV4LkJzc0lkeCkpOwotCQkJcEFkLT5NbG1lQXV4LkJzc0lkeCsrOwotCQkJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIENudGxXYWl0UmVhc3NvY1Byb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVTSE9SVCAgICAgIFJlc3VsdDsKLQotCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9SRUFTU09DX0NPTkYpCi0JewotCQlOZGlzTW92ZU1lbW9yeSgmUmVzdWx0LCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKLQkJaWYgKFJlc3VsdCA9PSBNTE1FX1NVQ0NFU1MpCi0JCXsKLQkJCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3IgYXNzb2NpYXRpb24KLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19BU1NPQ19FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOwotCi0JCQkvLwotCQkJLy8gTkRJUyByZXF1aXJlcyBhIG5ldyBMaW5rIFVQIGluZGljYXRpb24gYnV0IG5vIExpbmsgRG93biBmb3IgUkUtQVNTT0MKLQkJCS8vCi0JCQlMaW5rVXAocEFkLCBCU1NfSU5GUkEpOwotCi0JCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIFJlLWFzc29jaXRpb24gc3VjY2Vzc2Z1bCBvbiBCU1MgIyVsZFxuIiwgcEFkLT5NbG1lQXV4LlJvYW1JZHgpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIHJlYXNzb2MgZmFpbGVkLCB0cnkgdG8gcGljayBuZXh0IEJTUyBpbiB0aGUgQlNTIFRhYmxlCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gUmUtYXNzb2NpdGlvbiBmYWlscyBvbiBCU1MgIyVsZFxuIiwgcEFkLT5NbG1lQXV4LlJvYW1JZHgpKTsKLQkJCXsKLQkJCQlwQWQtPk1sbWVBdXguUm9hbUlkeCsrOwotCQkJCUl0ZXJhdGVPbkJzc1RhYjIocEFkKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotCi1WT0lECUFkaG9jVHVybk9uUW9zKAotCUlOICBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLSNkZWZpbmUgQUMwX0RFRl9UWE9QCQkwCi0jZGVmaW5lIEFDMV9ERUZfVFhPUAkJMAotI2RlZmluZSBBQzJfREVGX1RYT1AJCTk0Ci0jZGVmaW5lIEFDM19ERUZfVFhPUAkJNDcKLQotCS8vIFR1cm4gb24gUU9zIGlmIHVzZSBIVCByYXRlLgotCWlmIChwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJWYWxpZCA9PSBGQUxTRSkKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYlZhbGlkID0gVFJVRTsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblswXSA9IDM7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMV0gPSA3OwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzJdID0gMTsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblszXSA9IDE7Ci0KLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblswXSA9IDQ7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bMV0gPSA0OwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzJdID0gMzsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblszXSA9IDI7Ci0KLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFswXSA9IDEwOwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWF4WzFdID0gNjsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFsyXSA9IDQ7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbM10gPSAzOwotCi0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFswXSAgPSAwOwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMV0gID0gMDsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzJdICA9IEFDMl9ERUZfVFhPUDsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzNdICA9IEFDM19ERUZfVFhPUDsKLQl9Ci0JQXNpY1NldEVkY2FQYXJtKHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0pOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBMaW5rVXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgQnNzVHlwZSkKLXsKLQlVTE9ORwlOb3c7Ci0JVUlOVDMyCURhdGE7Ci0JQk9PTEVBTglDYW5jZWxsZWQ7Ci0JVUNIQVIJVmFsdWUgPSAwLCBpZHggPSAwLCBIYXNoSWR4ID0gMDsKLQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEwsICpwQ3VyckVudHJ5ID0gTlVMTDsKLQotCS8vIEluaXQgQ2hhbm5lbFF1YWxpdHkgdG8gcHJldmVudCBERUFEX0NRSSBhdCBpbml0aWFsIExpbmtVcAotCXBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSA9IDUwOwotCi0JcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JaWYgKHBFbnRyeSkKLQl7Ci0JCU1hY1RhYmxlRGVsZXRlRW50cnkocEFkLCBwRW50cnktPkFpZCwgcEVudHJ5LT5BZGRyKTsKLQkJcEVudHJ5ID0gTlVMTDsKLQl9Ci0KLQotCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOwotCi0JLy8KLQkvLyBBU1NPQyAtIERpc2Fzc29jVGltZW91dEFjdGlvbgotCS8vIENOVEwgLSBEaXMtYXNzb2NpYXRlIHN1Y2Nlc3NmdWwKLQkvLyAhISEgTElOSyBET1dOICEhIQotCS8vIFs4ODg4OF0gT0lEXzgwMl8xMV9TU0lEIHNob3VsZCBoYXZlIHJldHVybmVkIE5EVEVTVF9XRVBfQVAyKFJldHVybmVkOiApCi0JLy8KLQkvLyBUbyBwcmV2ZW50IERpc2Fzc29jVGltZW91dEFjdGlvbiB0byBjYWxsIExpbmsgZG93biBhZnRlciB3ZSBsaW5rIHVwLAotCS8vIGNhbmNlbCB0aGUgRGlzYXNzb2NUaW1lciBubyBtYXR0ZXIgd2hhdCBpdCBzdGFydCBvciBub3QuCi0JLy8KLQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAgJkNhbmNlbGxlZCk7Ci0KLQlDT1BZX1NFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRyhwQWQpOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JQ09QWV9IVFNFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRyhwQWQpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JLy8gQmVmb3JlIHBvd2VyIHNhdmUgYmVmb3JlIGxpbmsgdXAgZnVuY3Rpb24sIFdlIHdpbGwgZm9yY2UgdXNlIDFSLgotCS8vIFNvIGFmdGVyIGxpbmsgdXAsIGNoZWNrIFJ4IGFudGVubmEgIyBhZ2Fpbi4KLQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZWYWx1ZSk7Ci0JaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKQotCXsKLQkJVmFsdWUgfD0gKDB4MTApOwotCX0KLQllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKLQl7Ci0JCVZhbHVlIHw9ICgweDgpOwotCX0KLQllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKLQl7Ci0JCVZhbHVlIHw9ICgweDApOwotCX0KLQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBWYWx1ZSk7Ci0JcEFkLT5TdGFDZmcuQkJQUjMgPSBWYWx1ZTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCWlmIChCc3NUeXBlID09IEJTU19BREhPQykKLQl7Ci0JCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BREhPQ19PTik7Ci0JCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0lORlJBX09OKTsKLQotI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8gUm9nZXIgc3luYyBDYXJyaWVyCi0JCS8vIE5vIGNhcnJpZXIgZGV0ZWN0aW9uIHdoZW4gYWRob2MKLQkJLy8gQ2FycmllckRldGVjdGlvblN0b3AocEFkKTsKLQkJcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5DRF9TdGF0ZSA9IENEX05PUk1BTDsKLSNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKLQkJCUFkaG9jVHVybk9uUW9zKHBBZCk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhQWRob2MgTElOSyBVUCAhISEgXG4iICkpOwotCX0KLQllbHNlCi0JewotCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfSU5GUkFfT04pOwotCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BREhPQ19PTik7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhSW5mcmEgTElOSyBVUCAhISEgXG4iICkpOwotCX0KLQotCQkvLyAzKjMKLQkJLy8gcmVzZXQgVHggYmVhbWZvcm1pbmcgYml0Ci0JCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJlZhbHVlKTsKLQkJVmFsdWUgJj0gKH4weDAxKTsKLQkJVmFsdWUgfD0gcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlR4QkY7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIFZhbHVlKTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCS8vIENoYW5nZSB0byBBUCBjaGFubmVsCi0gICAgICAgIGlmICgocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPiBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSAmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKLQl7Ci0JCS8vIE11c3QgdXNpbmcgNDBNSHouCi0JCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOwotCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0JCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLQotCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZWYWx1ZSk7Ci0JCVZhbHVlICY9ICh+MHgxOCk7Ci0JCVZhbHVlIHw9IDB4MTA7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIFZhbHVlKTsKLQotCQkvLyAgUlggOiBjb250cm9sIGNoYW5uZWwgYXQgbG93ZXIKLQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmVmFsdWUpOwotCQlWYWx1ZSAmPSAofjB4MjApOwotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBWYWx1ZSk7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0gICAgICAgICAgICBwQWQtPlN0YUNmZy5CQlBSMyA9IFZhbHVlOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZEYXRhKTsKLQkJRGF0YSAmPSAweGZmZmZmZmZlOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgRGF0YSk7Ci0KLQkJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQotCQl7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxQSk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgMHgwQSk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgMHgxNik7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcnQyODYwQyAhISEgXG4iICkpOwotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhNDBNSHogTG93ZXIgTElOSyBVUCAhISEgQ29udHJvbCBDaGFubmVsIGF0IEJlbG93LiBDZW50cmFsID0gJWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCApKTsKLQl9Ci0JCWVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA8IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpICYmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQotCSAgICB7Ci0JCSAgICAvLyBNdXN0IHVzaW5nIDQwTUh6LgotCQkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7Ci0JCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0JCSAgICBBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0KLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJlZhbHVlKTsKLQkJVmFsdWUgJj0gKH4weDE4KTsKLQkJVmFsdWUgfD0gMHgxMDsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIFZhbHVlKTsKLQotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmRGF0YSk7Ci0JCURhdGEgfD0gMHgxOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgRGF0YSk7Ci0KLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJlZhbHVlKTsKLQkJICAgIFZhbHVlIHw9ICgweDIwKTsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIFZhbHVlKTsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLSAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkJCUFIzID0gVmFsdWU7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQkJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQotCQl7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxQSk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgMHgwQSk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgMHgxNik7Ci0JCQkgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcnQyODYwQyAhISEgXG4iICkpOwotCQl9Ci0KLQkJICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISA0ME1IeiBVcHBlciBMSU5LIFVQICEhISBDb250cm9sIENoYW5uZWwgYXQgVXBwZXJDZW50cmFsID0gJWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCApKTsKLQkgICAgfQotCSAgICBlbHNlCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JICAgIHsKLQkJICAgIHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOwotCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7Ci0JCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKLQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCi0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZWYWx1ZSk7Ci0JCQlWYWx1ZSAmPSAofjB4MTgpOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgVmFsdWUpOwotCi0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmRGF0YSk7Ci0JCQlEYXRhICY9IDB4ZmZmZmZmZmU7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgRGF0YSk7Ci0KLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJlZhbHVlKTsKLQkJCVZhbHVlICY9ICh+MHgyMCk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBWYWx1ZSk7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0gICAgICAgICAgICBwQWQtPlN0YUNmZy5CQlBSMyA9IFZhbHVlOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCi0JCQl7Ci0JCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIDB4MTYpOwotCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAweDA4KTsKLQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgMHgxMSk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcnQyODYwQyAhISEgXG4iICkpOwotCQkJfQotCi0JCSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgMjBNSHogTElOSyBVUCAhISEgXG4iICkpOwotCX0KLQotCVJUTVBTZXRBR0NJbml0VmFsdWUocEFkLCBwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcpOwotCS8vCi0JLy8gU2F2ZSBCQlBfUjY2IHZhbHVlLCBpdCB3aWxsIGJlIHVzZWQgaW4gUlRVU0JSZXN1bWVNc2R1VHJhbnNtaXNzaW9uCi0JLy8KLQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAmcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIFVQICEhISAoQnNzVHlwZT0lZCwgQUlEPSVkLCBzc2lkPSVzLCBDaGFubmVsPSVkLCBDZW50cmFsQ2hhbm5lbCA9ICVkKVxuIiwKLQkJQnNzVHlwZSwgcEFkLT5TdGFBY3RpdmUuQWlkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgVVAgISEhIChEZW5zaXR5ID0lZCwgKVxuIiwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NcGR1RGVuc2l0eSkpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JCUFzaWNTZXRCc3NpZChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQotCUFzaWNTZXRTbG90VGltZShwQWQsIFRSVUUpOwotCUFzaWNTZXRFZGNhUGFybShwQWQsICZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtKTsKLQotCi0JLy8gQ2FsbCB0aGlzIGZvciBSVFMgcHJvdGVjdGlvbmZvciBsZWdhY3kgcmF0ZSwgd2Ugd2lsbCBhbHdheXMgZW5hYmxlIFJUUyB0aHJlc2hvbGQsIGJ1dCBub3JtYWxseSBpdCB3aWxsIG5vdCBoaXQKLQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIDAsIChPRkRNU0VUUFJPVEVDVCB8IENDS1NFVFBST1RFQ1QpLCBUUlVFLCBGQUxTRSk7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IFRSVUUpKQotCXsKLQkJLy8gVXBkYXRlIEhUIHByb3RlY3Rpb25mb3IgYmFzZWQgb24gQVAncyBvcGVyYXRpbmcgbW9kZS4KLQlpZiAocEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9PSAxKQotCXsKLQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCAgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgVFJVRSk7Ci0JfQotCWVsc2UKLQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIEZBTFNFKTsKLQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5EcnNDb3VudGVycywgc2l6ZW9mKENPVU5URVJfRFJTKSk7Ci0KLQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwotCXBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgPSBOb3c7ICAgLy8gbGFzdCBSWCB0aW1lc3RhbXAKLQotCWlmICgocEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSAhPSBSdDgwMl8xMVByZWFtYmxlTG9uZykgJiYKLQkJQ0FQX0lTX1NIT1JUX1BSRUFNQkxFX09OKHBBZC0+U3RhQWN0aXZlLkNhcGFiaWxpdHlJbmZvKSkKLQl7Ci0JCU1sbWVTZXRUeFByZWFtYmxlKHBBZCwgUnQ4MDJfMTFQcmVhbWJsZVNob3J0KTsKLQl9Ci0KLQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpOwotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9PSBSRF9TSUxFTkNFX01PREUpCi0JewotI2lmZGVmIERGU19TVVBQT1JUCi0JCVJhZGFyRGV0ZWN0aW9uU3RvcChwQWQpOwotI2VuZGlmIC8vIERGU19TVVBQT1JUIC8vCi0JfQotCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9IFJEX05PUk1BTF9NT0RFOwotCi0JaWYgKEJzc1R5cGUgPT0gQlNTX0FESE9DKQotCXsKLQkJTWFrZUlic3NCZWFjb24ocEFkKTsKLQkJaWYgKChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCi0JCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKLQkJCSYmIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpCi0JCXsKLQkJCTsgLy9EbyBub3RoaW5nCi0JCX0KLQkJZWxzZQotCQl7Ci0JCQlBc2ljRW5hYmxlSWJzc1N5bmMocEFkKTsKLQkJfQotCi0JCS8vIEluIGFkIGhvYyBtb2RlLCB1c2UgTUFDIHRhYmxlIGZyb20gaW5kZXggMS4KLQkJLy8gcC5zIEFTSUMgdXNlIGFsbCAweGZmIGFzIHRlcm1pbmF0aW9uIG9mIFdDSUQgdGFibGUgc2VhcmNoLlRvIHByZXZlbnQgaXQncyAweGZmLWZmLWZmLWZmLWZmLWZmLCBXcml0ZSAwIGhlcmUuCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19XQ0lEX0JBU0UsIDB4MDApOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCAweDE4MDgsIDB4MDApOwotCi0JCS8vIElmIFdFUCBpcyBlbmFibGVkLCBhZGQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgaW50byBBc2ljCi0JCS8vIEZpbGwgaW4gU2hhcmVkIEtleSBUYWJsZShvZmZzZXQ6IDB4NmMwMCkgYW5kIFNoYXJlZCBLZXkgTW9kZShvZmZzZXQ6IDB4NzAwMCkKLQotCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKQotCQl7Ci0JCQlQVUNIQVIJS2V5OwotCQkJVUNIQVIJQ2lwaGVyQWxnOwotCi0JCQlmb3IgKGlkeD0wOyBpZHggPCBTSEFSRV9LRVlfTlVNOyBpZHgrKykKLQkJewotCQkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uQ2lwaGVyQWxnOwotCQkJS2V5ID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXk7Ci0KLQkJCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW4gPiAwKQotCQkJCXsKLQkJCQkJLy8gU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMKLQkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID09IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkKLQkJCQkJewotCQkJCQkJLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBncm91cCBrZXkgdGFibGUKLQkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgTlVMTCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQotCQkJfQotCQl9Ci0JCS8vIElmIFdQQU5vbmUgaXMgZW5hYmxlZCwgYWRkIGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIGludG8gQXNpYwotCQkvLyBGaWxsIGluIFNoYXJlZCBLZXkgVGFibGUob2Zmc2V0OiAweDZjMDApIGFuZCBTaGFyZWQgS2V5IE1vZGUob2Zmc2V0OiAweDcwMDApCi0JCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCi0JCXsKLQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IDA7CS8vIGFsd2F5cyBiZSB6ZXJvCi0KLSAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVswXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKLQkJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgcEFkLT5TdGFDZmcuUE1LLCBMRU5fVEtJUF9FSyk7Ci0KLSAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCi0gICAgICAgICAgICB7Ci0JCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBNS1sxNl0sIExFTl9US0lQX1JYTUlDSyk7Ci0JCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgJnBBZC0+U3RhQ2ZnLlBNS1sxNl0sIExFTl9US0lQX1RYTUlDSyk7Ci0gICAgICAgICAgICB9Ci0KLQkJCS8vIERlY2lkZSBpdHMgQ2hpcGVyQWxnCi0JCQlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQotCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOwotCQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7Ci0JCQllbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVW5rbm93IENpcGhlciAoPSVkKSwgc2V0IENpcGhlciB0byBBRVNcbiIsIHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIpKTsKLQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOwotICAgICAgICAgICAgfQotCi0JCQkvLyBTZXQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgdG8gQXNpYwotCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKLQkJCQkJCQkJICBCU1MwLAotCQkJCQkJCQkgIDAsCi0JCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAotCQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKLQkJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKLQkJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYyk7Ci0KLSAgICAgICAgICAgIC8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZ3JvdXAga2V5IHRhYmxlCi0JCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgMCwgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLCBOVUxMKTsKLQotCQl9Ci0KLQl9Ci0JZWxzZSAvLyBCU1NfSU5GUkEKLQl7Ci0JCS8vIENoZWNrIHRoZSBuZXcgU1NJRCB3aXRoIGxhc3QgU1NJRAotCQl3aGlsZSAoQ2FuY2VsbGVkID09IFRSVUUpCi0JCXsKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZExlbiA9PSBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKQotCQkJewotCQkJCWlmIChSVE1QQ29tcGFyZU1lbW9yeShwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuTGFzdFNzaWRMZW4pID09IDApCi0JCQkJewotCQkJCQkvLyBMaW5rIHRvIHRoZSBvbGQgb25lIG5vIGxpbmtkb3duIGlzIHJlcXVpcmVkLgotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBTZW5kIGxpbmsgZG93biBldmVudCBiZWZvcmUgc2V0IHRvIGxpbmsgdXAKLQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7Ci0JCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOwotICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQUEhXG4iKSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8vCi0JCS8vIE9uIFdQQSBtb2RlLCBSZW1vdmUgQWxsIEtleXMgaWYgbm90IGNvbm5lY3QgdG8gdGhlIGxhc3QgQlNTSUQKLQkJLy8gS2V5IHdpbGwgYmUgc2V0IGFmdGVyIDQtd2F5IGhhbmRzaGFrZS4KLQkJLy8KLQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLQkJewotCQkJVUxPTkcJCUlWOwotCi0JCQkvLyBSZW1vdmUgYWxsIFdQQSBrZXlzCi0JCQlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7Ci0JCQlSVE1QV1BBUmVtb3ZlQWxsS2V5cyhwQWQpOwotCQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7Ci0JCQlwQWQtPlN0YUNmZy5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUDsKLQotCQkJLy8gRml4ZWQgY29ubmVjdGlvbiBmYWlsZWQgd2l0aCBSYW5nZSBNYXhpbWl6ZXIgLSA1MTUgQVAgKE1hcnZlbGwgQ2hpcCkgd2hlbiBzZWN1cml0eSBpcyBXUEFQU0svVEtJUAotCQkJLy8gSWYgSVYgcmVsYXRlZCB2YWx1ZXMgYXJlIHRvbyBsYXJnZSBpbiBHcm91cE1zZzIsIEFQIHdvdWxkIGlnbm9yZSB0aGlzIG1lc3NhZ2UuCi0JCQlJViA9IDE7Ci0JCQlJViB8PSAocEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkIDw8IDMwKTsKLQkJCUFzaWNVcGRhdGVXQ0lESVZFSVYocEFkLCBCU1NJRF9XQ0lELCBJViwgMCk7Ci0JCQkvL1JUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsKLQkJfQotCi0JCS8vIE5PVEU6Ci0JCS8vIHRoZSBkZWNpc2lvbiBvZiB1c2luZyAic2hvcnQgc2xvdCB0aW1lIiBvciBub3QgbWF5IGNoYW5nZSBkeW5hbWljYWxseSBkdWUgdG8KLQkJLy8gbmV3IFNUQSBhc3NvY2lhdGlvbiB0byB0aGUgQVAuIHNvIHdlIGhhdmUgdG8gZGVjaWRlIHRoYXQgdXBvbiBwYXJzaW5nIEJFQUNPTiwgbm90IGhlcmUKLQotCQkvLyBOT1RFOgotCQkvLyB0aGUgZGVjaXNpb24gdG8gdXNlICJSVEMvQ1RTIiBvciAiQ1RTLXRvLXNlbGYiIHByb3RlY3Rpb24gb3Igbm90IG1heSBjaGFuZ2UgZHluYW1pY2FsbHkKLQkJLy8gZHVlIHRvIG5ldyBTVEEgYXNzb2NpYXRpb24gdG8gdGhlIEFQLiBzbyB3ZSBoYXZlIHRvIGRlY2lkZSB0aGF0IHVwb24gcGFyc2luZyBCRUFDT04sIG5vdCBoZXJlCi0KLQkJQ29tcG9zZVBzUG9sbChwQWQpOwotCQlDb21wb3NlTnVsbEZyYW1lKHBBZCk7Ci0KLQkJCUFzaWNFbmFibGVCc3NTeW5jKHBBZCk7Ci0KLQkJLy8gQWRkIEJTU0lEIHRvIFdDSUQgc2VhcmNoIHRhYmxlCi0JCUFzaWNVcGRhdGVSeFdDSURUYWJsZShwQWQsIEJTU0lEX1dDSUQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQotCQkvLyBJZiBXRVAgaXMgZW5hYmxlZCwgYWRkIHBhaWV3aXNlIGFuZCBzaGFyZWQga2V5Ci0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgICAgICBpZiAoKChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApJiYKLSAgICAgICAgICAgICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKSYmCi0gICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSkgfHwKLSAgICAgICAgICAgICgocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpJiYKLSAgICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkpKQotI2Vsc2UKLQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0JCXsKLQkJCVBVQ0hBUglLZXk7Ci0JCQlVQ0hBUglDaXBoZXJBbGc7Ci0KLQkJCWZvciAoaWR4PTA7IGlkeCA8IFNIQVJFX0tFWV9OVU07IGlkeCsrKQotCQl7Ci0JCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5DaXBoZXJBbGc7Ci0JCQlLZXkgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleTsKLQotCQkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA+IDApCi0JCQkJewotCQkJCQkvLyBTZXQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgdG8gQXNpYwotCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOwotCi0JCQkJCWlmIChpZHggPT0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKQotCQkJCQl7Ci0JCQkJCQkvLyBBc3NpZ24gZ3JvdXAga2V5IGluZm8KLQkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgTlVMTCk7Ci0KLQkJCQkJCXBFbnRyeS0+QWlkID0gQlNTSURfV0NJRDsKLQkJCQkJCS8vIEFzc2lnbiBwYWlyd2lzZSBrZXkgaW5mbwotCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBwRW50cnkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gb25seSBJTkZSQVNUUlVDVFVSRSBtb2RlIG5lZWQgdG8gaW5kaWNhdGUgY29ubmVjdGl2aXR5IGltbWVkaWF0ZWx5OyBBREhPQyBtb2RlCi0JCS8vIHNob3VsZCB3YWl0IHVudGlsIGF0IGxlYXN0IDIgYWN0aXZlIG5vZGVzIGluIHRoaXMgQlNTSUQuCi0JCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwotCi0gICAgICAgIC8vIEZvciBHVUkgKysKLQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotCQl7Ci0JCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwotCQkJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7Ci0JCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOwotCQl9Ci0JCWVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8Ci0JCQkJIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKLQkJewotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQkJCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0JCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuTGlua0Rvd25UaW1lciwgTElOS19ET1dOX1RJTUVPVVQpOwotCQl9Ci0gICAgICAgIC8vIC0tCi0KLQkJLy8gQWRkIEJTU0lEIGluIG15IE1BQyBUYWJsZS4KLSAgICAgICAgTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKLQkJLy8gYWRkIHRoaXMgTUFDIGVudHJ5IGludG8gSEFTSCB0YWJsZQotCQlpZiAocEVudHJ5KQotCQl7Ci0JCQlIYXNoSWR4ID0gTUFDX0FERFJfSEFTSF9JTkRFWChwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQlpZiAocEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9PSBOVUxMKQotCQkJewotCQkJCXBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPSBwRW50cnk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcEN1cnJFbnRyeSA9IHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF07Ci0JCQkJd2hpbGUgKHBDdXJyRW50cnktPnBOZXh0ICE9IE5VTEwpCi0JCQkJewotCQkJCQlwQ3VyckVudHJ5ID0gcEN1cnJFbnRyeS0+cE5leHQ7Ci0JCQkJfQotCQkJCXBDdXJyRW50cnktPnBOZXh0ID0gcEVudHJ5OwotCQkJfQotCQl9Ci0JCVJUTVBNb3ZlTWVtb3J5KHBFbnRyeS0+QWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIE1BQ19BRERSX0xFTik7Ci0JCXBFbnRyeS0+QWlkID0gQlNTSURfV0NJRDsKLQkJcEVudHJ5LT5wQWQgPSBwQWQ7Ci0JCXBFbnRyeS0+VmFsaWRBc0NMSSA9IFRSVUU7CS8vQWx0aG91Z2ggdGhpcyBpcyBic3NpZC4uc3RpbGwgc2V0IFZhbGlkQXNDbAotCQlwQWQtPk1hY1RhYi5TaXplID0gMTsJLy8gaW5mcmEgbW9kZSBhbHdheXMgc2V0IE1BQ3RhYiBzaXplID0xLgotCQlwRW50cnktPlNzdCA9IFNTVF9BU1NPQzsKLQkJcEVudHJ5LT5BdXRoU3RhdGUgPSBTU1RfQVNTT0M7Ci0JCXBFbnRyeS0+QXV0aE1vZGUgPSBwQWQtPlN0YUNmZy5BdXRoTW9kZTsKLQkJcEVudHJ5LT5XZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7Ci0JCWlmIChwRW50cnktPkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotCQl7Ci0JCQlwRW50cnktPldwYVN0YXRlID0gQVNfTk9UVVNFOwotCQkJcEVudHJ5LT5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGw7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwRW50cnktPldwYVN0YXRlID0gQVNfUFRLU1RBUlQ7Ci0JCQlwRW50cnktPlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlcjgwMjF4V0VQOwotCQl9Ci0JCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgVVAgISEhICBDbGllbnRTdGF0dXNGbGFncz0lbHgpXG4iLAotCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5DbGllbnRTdGF0dXNGbGFncykpOwotCi0KLQkJTWxtZVVwZGF0ZVR4UmF0ZXMocEFkLCBUUlVFLCBCU1MwKTsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJTWxtZVVwZGF0ZUh0VHhSYXRlcyhwQWQsIEJTUzApOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBVUCAhISAoU3RhQWN0aXZlLmJIdEVuYWJsZSA9JWQsIClcbiIsIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlKSk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQotCQlpZiAocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkKLQkJewotCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSkgJiYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMykgPT0gMykKLQkJCXsKLQotCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QSUdHWUJBQ0tfSU5VU0VEKTsKLQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsKLQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSk7Ci0JCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1BJR0dZQkFDS19DQVBBQkxFKTsKLQkJCQlSVE1QU2V0UGlnZ3lCYWNrKHBBZCwgVFJVRSk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHVybiBvbiBQaWdneS1CYWNrXG4iKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDEpCi0JCQl7Ci0JCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX0FHR1JFR0FUSU9OX0NBUEFCTEUpOwotCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICE9IDB4MCkKLQkJewotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJaWYgKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSkpCi0JCQl7Ci0JCQkJQXNpY0VuYWJsZVJERyhwQWQpOwotCQkJfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCk7Ci0JCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQpOwotCQkJQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCk7Ci0JCX0KLQl9Ci0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0NPTk5FQ1QgRXZlbnQgQiEuQkFDYXBhYmlsaXR5ID0gJXguIENsaWVudFN0YXR1c0ZsYWdzID0gJWx4XG4iLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkud29yZCwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5DbGllbnRTdGF0dXNGbGFncykpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JLy8gU2V0IExFRAotCVJUTVBTZXRMRUQocEFkLCBMRURfTElOS19VUCk7Ci0KLQlwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCA9IDA7Ci0JcEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgPSAwOwotCXBBZC0+YkNvbmZpZ0NoYW5nZWQgPSBGQUxTRTsgICAgICAgIC8vIFJlc2V0IGNvbmZpZyBmbGFnCi0JcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7ICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uIHRvIGxpbmsgaXMgdXAKLQotCS8vIFNldCBhc2ljIGF1dG8gZmFsbCBiYWNrCi0JewotCQlQVUNIQVIJCQkJCXBUYWJsZTsKLQkJVUNIQVIJCQkJCVRhYmxlU2l6ZSA9IDA7Ci0KLQkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sICZwVGFibGUsICZUYWJsZVNpemUsICZwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCk7Ci0JCUFzaWNVcGRhdGVBdXRvRmFsbEJhY2tUYWJsZShwQWQsIHBUYWJsZSk7Ci0JfQotCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKLSAgICBwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLndvcmQ7Ci0gICAgcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZCA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS53b3JkOwotCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBGQUxTRSkKLQl7Ci0JCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJaWYgKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAzMikKLQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7Ci0KLQkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPiBNQ1NfNykgfHwgKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAzMikpCi0JCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDID0gU1RCQ19OT05FOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkvLyBJZiB0aGUgbGVnYWN5IG1vZGUgaXMgc2V0LCBvdmVyd3JpdGUgdGhlIHRyYW5zbWl0IHNldHRpbmcgb2YgdGhpcyBlbnRyeS4KLQkJaWYgKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKQotCQkJUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygoVUNIQVIpcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSwgcEVudHJ5KTsKLQl9Ci0JZWxzZQotCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotCi0JLy8gIExldCBMaW5rIFN0YXR1cyBQYWdlIGRpc3BsYXkgZmlyc3QgaW5pdGlhbCByYXRlLgotCXBBZC0+TGFzdFR4UmF0ZSA9IChVU0hPUlQpKHBFbnRyeS0+SFRQaHlNb2RlLndvcmQpOwotCS8vIFNlbGVjdCBEQUMgYWNjb3JkaW5nIHRvIEhUIG9yIExlZ2FjeQotCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSAhPSAweDAwKQotCXsKLQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmVmFsdWUpOwotCQlWYWx1ZSAmPSAofjB4MTgpOwotCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKQotCQl7Ci0JCSAgICBWYWx1ZSB8PSAweDEwOwotCQl9Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIFZhbHVlKTsKLQl9Ci0JZWxzZQotCXsKLQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmVmFsdWUpOwotCQlWYWx1ZSAmPSAofjB4MTgpOwotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBWYWx1ZSk7Ci0JfQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKQotCXsKLQl9Ci0JZWxzZSBpZiAocEVudHJ5LT5NYXhSQW1wZHVGYWN0b3IgPT0gMCkKLQl7Ci0JICAgIC8vIElmIEhUIEFQIGRvZXNuJ3Qgc3VwcG9ydCBNYXhSQW1wZHVGYWN0b3IgPSAxLCB3ZSBuZWVkIHRvIHNldCBtYXggUFNEVSB0byAwLgotCSAgICAvLyBCZWNhdXNlIG91ciBJbml0IHZhbHVlIGlzIDEgYXQgTUFDUmVnVGFibGUuCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BWF9MRU5fQ0ZHLCAweDBmZmYpOwotCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCS8vIFBhdGNoIGZvciBNYXJ2ZWwgQVAgdG8gZ2FpbiBoaWdoIHRocm91Z2hwdXQKLQkvLyBOZWVkIHRvIHNldCBhcyBmb2xsb3dpbmcsCi0JLy8gMS4gU2V0IHR4b3AgaW4gcmVnaXN0ZXItRURDQV9BQzBfQ0ZHIGFzIDB4NjAKLQkvLyAyLiBTZXQgRW5UWFdyaXRlQmFja0RET05FIGluIHJlZ2lzdGVyLVdQRE1BX0dMT19DRkcgYXMgemVybwotCS8vIDMuIFBCRl9NQVhfUENOVCBhcyAweDFGM0ZCRjlGCi0JLy8gNC4ga2ljayBwZXIgdHdvIHBhY2tldHMgd2hlbiBkZXF1ZXVlCi0JLy8KLQkvLyBUeG9wIGNhbiBvbmx5IGJlIG1vZGlmaWVkIHdoZW4gUkRHIGlzIG9mZiwgV01NIGlzIGRpc2FibGUgYW5kIFR4QnVyc3QgaXMgZW5hYmxlCi0JLy8KLQkvLyBpZiAxLiBMZWdhY3kgQVAgV01NIG9uLCAgb3IgMi4gMTFuIEFQLCBBTVBEVSBkaXNhYmxlLiAgRm9yY2UgdHVybiBvZmYgYnVyc3Qgbm8gbWF0dGVyIHdoYXQgYkVuYWJsZVR4QnVyc3QgaXMuCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JaWYgKCEoKHBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID09IDEpJiYocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkpICYmCi0JCShwQWQtPlN0YUNmZy5iRm9yY2VUeEJ1cnN0ID09IEZBTFNFKSAmJgotCQkoKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBGQUxTRSkgJiYgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSkKLQkJfHwgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBUUlVFKSAmJiAocEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9PSBCQV9OT1RVU0UpKSkpCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOwotCQlEYXRhICAmPSAweEZGRkZGRjAwOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIERhdGEpOwotCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9NQVhfUENOVCwgMHgxRjNGN0Y5Rik7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4YnVyc3QgMVxuIikpOwotCX0KLQllbHNlCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KQotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBFRENBX0FDMF9DRkcsICZEYXRhKTsKLQkJRGF0YSAgJj0gMHhGRkZGRkYwMDsKLQkJRGF0YSAgfD0gMHg2MDsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBEYXRhKTsKLQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTm93QXRoZXJvc0J1cnN0T24gPSBUUlVFOwotCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9NQVhfUENOVCwgMHgxRjNGQkY5Rik7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4YnVyc3QgMlxuIikpOwotCX0KLQllbHNlCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOwotCQlEYXRhICAmPSAweEZGRkZGRjAwOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIERhdGEpOwotCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9NQVhfUENOVCwgMHgxRjNGN0Y5Rik7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4YnVyc3QgM1xuIikpOwotCX0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCS8vIFJlLWNoZWNrIHRvIHR1cm4gb24gVFggYnVyc3Qgb3Igbm90LgotCWlmICgocEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTGFzdEF0aGVyb3MgPT0gVFJVRSkgJiYgKChTVEFfV0VQX09OKHBBZCkpfHwoU1RBX1RLSVBfT04ocEFkKSkpKQotCXsKLQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTmV4dERpc2FibGVSeEJBID0gVFJVRTsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KQotCQl7Ci0JCSAgICBVSU5UMzIgTUFDVmFsdWUgPSAwOwotCQkJLy8gRm9yY2UgZGlzYWJsZSAgVFhPUCB2YWx1ZSBpbiB0aGlzIGNhc2UuIFRoZSBzYW1lIGFjdGlvbiBpbiBNTE1FVXBkYXRlUHJvdGVjdCB0b28uCi0JCQkvLyBJIGRpZG4ndCBjaGFuZ2UgUEJGX01BWF9QQ05UIHNldHRpbmcuCi0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJk1BQ1ZhbHVlKTsKLQkJCU1BQ1ZhbHVlICAmPSAweEZGRkZGRjAwOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBNQUNWYWx1ZSk7Ci0JCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOb3dBdGhlcm9zQnVyc3RPbiA9IEZBTFNFOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5leHREaXNhYmxlUnhCQSA9IEZBTFNFOwotCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYkxhc3RBdGhlcm9zID0gRkFMU0U7Ci0JQ09QWV9NQUNfQUREUihwQWQtPkNvbW1vbkNmZy5MYXN0QnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFwQWQtPmJOZXh0RGlzYWJsZVJ4QkE9ICVkIFxuIiwgcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTmV4dERpc2FibGVSeEJBKSk7Ci0JLy8gQlNTSUQgYWRkIGluIG9uZSBNQUMgZW50cnkgdG9vLiAgQmVjYXVzZSBpbiBUeCwgQVNJQyBuZWVkIHRvIGNoZWNrIENpcGhlciBhbmQgSVYvRUlWLCBCQWJpdG1hcAotCS8vIFB0aGVyIGluZm9ybWF0aW9uIGluIE1BQ1RhYi5Db250ZW50W0JTU0lEX1dDSURdIGlzIG5vdCBuZWNlc3NhcnkgZm9yIGRyaXZlci4KLQkvLyBOb3RlOiBBcyBTVEEsIFRoZSBNQUNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS4gUGFpcndpc2VLZXkgYW5kIFNoYXJlZCBLZXkgZm9yIEJTUzAgYXJlIHRoZSBzYW1lLgotCi0JaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA8PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0JewotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAmJgotCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkgJiYKLQkJCShwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gVFJVRSkpCi0JCQk7Ci0JCWVsc2UKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0JCXsKLQkJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7Ci0JCQlwQWQtPlN0YUNmZy5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGw7Ci0JCX0KLQl9Ci0KLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZDsKLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotCi0gICAgLy8KLQkvLyBQYXRjaCBBdGhlcm9zIEFQIFRYIHdpbGwgYnJlYWtkb3duIGlzc3VlLgotCS8vIEFQIE1vZGVsOiBETGluayBEV0wtODIwMEFQCi0JLy8KLQlpZiAoSU5GUkFfT04ocEFkKSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpICYmIFNUQV9US0lQX09OKHBBZCkpCi0JewotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9QQVJTRVJfQ0ZHLCAweDAxKTsKLQl9Ci0JZWxzZQotCXsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfUEFSU0VSX0NGRywgMHgwMCk7Ci0JfQotCi0JUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7Ci0JUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19HT19UT19TTEVFUF9OT1cpOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0jaWZkZWYgRE9UMTFOX0RSQUZUMwotCWlmICgocEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLmIyMDQwQ29leGlzdFNjYW5TdXApICYmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDExKSkKLQl7Ci0JCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TQ0FOXzIwNDApOwotCQlCdWlsZEVmZmVjdGVkQ2hhbm5lbExpc3QocEFkKTsKLQl9Ci0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlEaXNjb25uZWN0IGN1cnJlbnQgQlNTSUQKLQotCUFyZ3VtZW50czoKLQkJcEFkCQkJCS0gUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlJc1JlcUZyb21BUAkJLSBSZXF1ZXN0IGZyb20gQVAKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCQlXZSBuZWVkIG1vcmUgaW5mb3JtYXRpb24gdG8ga25vdyBpdCdzIHRoaXMgcmVxdXN0IGZyb20gQVAuCi0JCUlmIHllcyEgd2UgbmVlZCB0byBkbyBleHRyYSBoYW5kbGluZywgZm9yIGV4YW1wbGUsIHJlbW92ZSB0aGUgV1BBIGtleS4KLQkJT3RoZXJ3aXNlIG9uIDQtd2F5IGhhbmRzaGFraW5nIHdpbGwgZmFpZWQsIHNpbmNlIHRoZSBXUEEga2V5IGRpZG4ndCBiZQotCQlyZW1vdmUgd2hpbGUgYXV0byByZWNvbm5lY3QuCi0JCURpc2Nvbm5lY3QgcmVxdWVzdCBmcm9tIEFQLCBpdCBtZWFucyB3ZSB3aWxsIHN0YXJ0IGFmcmVzaCA0LXdheSBoYW5kc2hha2luZwotCQlvbiBXUEEgbW9kZS4KLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBMaW5rRG93bigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiAgQk9PTEVBTiAgICAgIElzUmVxRnJvbUFQKQotewotCVVDSEFSCQkJICAgIGksIEJ5dGVWYWx1ZSA9IDA7Ci0KLQlCT09MRUFOCQlDYW5jZWxsZWQ7Ci0KLQkvLyBEbyBub3RoaW5nIGlmIG1vbml0b3IgbW9kZSBpcyBvbgotCWlmIChNT05JVE9SX09OKHBBZCkpCi0JCXJldHVybjsKLQotI2lmZGVmIFJBTElOS19BVEUKLQkvLyBOb3RoaW5nIHRvIGRvIGluIEFURSBtb2RlLgotCWlmIChBVEVfT04ocEFkKSkKLQkJcmV0dXJuOwotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0dPX1RPX1NMRUVQX05PVyk7Ci0JLy9Db21tZW50IHRoZSBjb2RlcywgYmVhc3VlIHRoZSBsaW5lIDIyOTEgY2FsbCB0aGUgc2FtZSBmdW5jdGlvbi4KLQkvL1JUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAkJJkNhbmNlbGxlZCk7Ci0JLy8gTm90IGFsbG93IGdvIHRvIHNsZWVwIHdpdGhpbiBsaW5rZG93biBmdW5jdGlvbi4KLQlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7Ci0KLSAgICBpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JewotCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBET1dOICEhIVxuIikpOwotCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCk7Ci0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLSAgICBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpCi0gICAgewotCSAgICBCT09MRUFOIENhbmNlbGxlZDsKLSAgICAgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKLSAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCSZDYW5jZWxsZWQpOwotICAgIH0KLQotCXBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0gICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkKLXx8CVJUTVBfVEVTVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19TRVRfUENJX0NMS19PRkZfQ09NTUFORCkKLQkJfHwgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKSkKLSAgICB7Ci0gICAgICAgIEFVVE9fV0FLRVVQX1NUUlVDIEF1dG9XYWtldXBDZmc7Ci0JCUFzaWNGb3JjZVdha2V1cChwQWQsIFRSVUUpOwotICAgICAgICBBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOwotCSAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7Ci0gICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOwotICAgIH0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQlpZiAoQURIT0NfT04ocEFkKSkJCS8vIEFkaG9jIG1vZGUgbGluayBkb3duCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBET1dOIDEhISFcbiIpKTsKLQotCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BREhPQ19PTik7Ci0JCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwotCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKLQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKLSAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047Ci0JCQlCc3NUYWJsZURlbGV0ZUVudHJ5KCZwQWQtPlNjYW5UYWIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1hY1RhYi5TaXplPSVkICEhIVxuIiwgcEFkLT5NYWNUYWIuU2l6ZSkpOwotCX0KLQllbHNlCQkJCQkvLyBJbmZyYSBzdHJ1Y3R1cmUgbW9kZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgRE9XTiAyISEhXG4iKSk7Ci0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJLy8gRExTIHRlYXIgZG93biBmcmFtZSBtdXN0IGJlIHNlbnQgYmVmb3JlIGxpbmsgZG93bgotCQkvLyBzZW5kIERMUy1URUFSX0RPV04gbWVzc2FnZQotCQlpZiAocEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCi0JCXsKLQkJCS8vIHRlYXIgZG93biBsb2NhbCBkbHMgdGFibGUgZW50cnkKLQkJCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKLQkJCXsKLQkJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKLQkJCQl7Ci0JCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOwotCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHRlYXIgZG93biBwZWVyIGRscyB0YWJsZSBlbnRyeQotCQkJZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKLQkJCXsKLQkJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSAgRExTX0ZJTklTSCkpCi0JCQkJewotCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKLQkJCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfSU5GUkFfT04pOwotCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwotCi0JCS8vIFNhdmVkIGxhc3QgU1NJRCBmb3IgbGlua3VwIGNvbXBhcmlzb24KLQkJcEFkLT5Db21tb25DZmcuTGFzdFNzaWRMZW4gPSBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuOwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuTGFzdFNzaWRMZW4pOwotCQlDT1BZX01BQ19BRERSKHBBZC0+Q29tbW9uQ2ZnLkxhc3RCc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQlpZiAocEFkLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID09IFRSVUUpCi0JCXsKLQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7Ci0JCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOwotICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQSFcbiIpKTsKLQkJCXBBZC0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOwotCQl9Ci0JCWVsc2UKLQkJewotICAgICAgICAgICAgLy8KLQkJCS8vIElmIGRpc2Fzc29jaWF0aW9uIHJlcXVlc3QgaXMgZnJvbSBORElTLCB0aGVuIHdlIGRvbid0IG5lZWQgdG8gZGVsZXRlIEJTU0lEIGZyb20gZW50cnkuCi0JCQkvLyBPdGhlcndpc2UgbG9zdCBiZWFjb24gb3IgcmVjZWl2ZSBEZS1BdXRoZW50aWNhdGlvbiBmcm9tIEFQLAotCQkJLy8gdGhlbiB3ZSBzaG91bGQgZGVsZXRlIEJTU0lEIGZyb20gQnNzVGFibGUuCi0JCQkvLyBJZiB3ZSBkb24ndCBkZWxldGUgZnJvbSBlbnRyeSwgcm9hbWluZyB3aWxsIGZhaWwuCi0JCQkvLwotCQkJQnNzVGFibGVEZWxldGVFbnRyeSgmcEFkLT5TY2FuVGFiLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JCX0KLQotCQkvLyByZXN0b3JlIGJhY2sgdG8gLQotCQkvLyAgICAgIDEuIGxvbmcgc2xvdCAoMjAgdXMpIG9yIHNob3J0IHNsb3QgKDkgdXMpIHRpbWUKLQkJLy8gICAgICAyLiB0dXJuIG9uL29mZiBSVFMvQ1RTIGFuZC9vciBDVFMtdG8tc2VsZiBwcm90ZWN0aW9uCi0JCS8vICAgICAgMy4gc2hvcnQgcHJlYW1ibGUKLQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpOwotCi0jaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAotCQkvLyBDb3VudHJ5IElFIG9mIHRoZSBBUCB3aWxsIGJlIGV2YWx1YXRlZCBhbmQgd2lsbCBiZSB1c2VkLgotCQlpZiAocEFkLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgIT0gUnQ4MDJfMTFfRF9Ob25lKQotCQl7Ci0JCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGVbMF0sICZwQWQtPlN0YUNmZy5TdGFPcmlDb3VudHJ5Q29kZVswXSwgMik7Ci0JCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBwQWQtPlN0YUNmZy5TdGFPcmlHZW9ncmFwaHk7Ci0JCQlCdWlsZENoYW5uZWxMaXN0RXgocEFkKTsKLQkJfQotI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KLQotCX0KLQotCi0JZm9yIChpPTE7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKLQl7Ci0JCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgPT0gVFJVRSkKLQkJCU1hY1RhYmxlRGVsZXRlRW50cnkocEFkLCBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFpZCwgcEFkLT5NYWNUYWIuQ29udGVudFtpXS5BZGRyKTsKLQl9Ci0KLQlBc2ljU2V0U2xvdFRpbWUocEFkLCBUUlVFKTsgLy9GQUxTRSk7Ci0JQXNpY1NldEVkY2FQYXJtKHBBZCwgTlVMTCk7Ci0KLQkvLyBTZXQgTEVECi0JUlRNUFNldExFRChwQWQsIExFRF9MSU5LX0RPV04pOwotICAgIHBBZC0+TGVkSW5kaWNhdG9yU3RyZW5ndGggPSAweEYwOwotICAgIFJUTVBTZXRTaWduYWxMRUQocEFkLCAtMTAwKTsJLy8gRm9yY2Ugc2lnbmFsIHN0cmVuZ3RoIExlZCB0byBiZSB0dXJuZWQgb2ZmLCBmaXJtd2FyZSBpcyBub3QgZG9uZSBpdC4KLQotCQlBc2ljRGlzYWJsZVN5bmMocEFkKTsKLQotCXBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kID0gMDsKLQlwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCA9IDA7Ci0KLQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCi0JewotCS8vIFJlbW92ZSBTdGFDZmcgSW5mb3JtYXRpb24gYWZ0ZXIgbGluayBkb3duCi0JTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuQnNzaWQsIE1BQ19BRERSX0xFTik7Ci0JTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKLQkJcEFkLT5Db21tb25DZmcuU3NpZExlbiA9IDA7Ci0JfQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOwotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQWRkSHRJbmZvLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKLQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID0gMDsKLQlwQWQtPk1sbWVBdXguTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkvLyBSZXNldCBXUEEtUFNLIHN0YXRlLiBPbmx5IHJlc2V0IHdoZW4gc3VwcGxpY2FudCBlbmFibGVkCi0JaWYgKHBBZC0+U3RhQ2ZnLldwYVN0YXRlICE9IFNTX05PVFVTRSkKLQl7Ci0JCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfU1RBUlQ7Ci0JCS8vIENsZWFyIFJlcGxheSBjb3VudGVyCi0JCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIDgpOwotCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCWlmIChwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKLQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLkRsc1JlcGxheUNvdW50ZXIsIDgpOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCX0KLQotCS8vCi0JLy8gaWYgbGluayBkb3duIGNvbWUgZnJvbSBBUCwgd2UgbmVlZCB0byByZW1vdmUgYWxsIFdQQSBrZXlzIG9uIFdQQSBtb2RlLgotCS8vIG90aGVyd2lzZSB3aWxsIGNhdXNlIDQtd2F5IGhhbmRzaGFraW5nIGZhaWxlZCwgc2luY2UgdGhlIFdQQSBrZXkgbm90IGVtcHR5LgotCS8vCi0JaWYgKChJc1JlcUZyb21BUCkgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkpCi0JewotCQkvLyBSZW1vdmUgYWxsIFdQQSBrZXlzCi0JCVJUTVBXUEFSZW1vdmVBbGxLZXlzKHBBZCk7Ci0JfQotCi0JLy8gODAyLjF4IHBvcnQgY29udHJvbAotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQkvLyBQcmV2ZW50IGNsZWFyIFBvcnRTZWN1cmVkIGhlcmUgd2l0aCBzdGF0aWMgV0VQCi0JLy8gTmV0d29ya01hbmdlciBzZXQgc2VjdXJpdHkgcG9saWN5IGZpcnN0IHRoZW4gc2V0IFNTSUQgdG8gY29ubmVjdCBBUC4KLQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICYmCi0JCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpICYmCi0JCShwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gRkFMU0UpKQotCXsKLQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQl9Ci0JZWxzZQotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQl7Ci0JCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOwotCQlwQWQtPlN0YUNmZy5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUDsKLQl9Ci0KLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1hY1RhYiwgc2l6ZW9mKE1BQ19UQUJMRSkpOwotCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUG9ydFNlY3VyZWQgPSBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZDsKLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotCi0JcEFkLT5TdGFDZmcuTWljRXJyQ250ID0gMDsKLQotICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7Ci0JLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uIHRvIGxpbmsgaXMgdXAKLQlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOwotCi0gICAgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKLQotCi0JLy8gQ2xlYW4gYXNzb2NpYXRpb24gaW5mb3JtYXRpb24KLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TdGFDZmcuQXNzb2NJbmZvLCBzaXplb2YoTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04pKTsKLQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKTsKLQlwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiA9IDA7Ci0JcEFkLT5TdGFDZmcuUmVzVmFySUVMZW4gPSAwOwotCi0JLy8KLQkvLyBSZXNldCBSU1NJIHZhbHVlIGFmdGVyIGxpbmsgZG93bgotCS8vCi0JcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCA9IDA7Ci0JcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMFg4ID0gMDsKLQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxID0gMDsKLQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxWDggPSAwOwotCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTIgPSAwOwotCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTJYOCA9IDA7Ci0KLQkvLyBSZXN0b3JlIE1sbWVSYXRlCi0JcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5CYXNpY01sbWVSYXRlOwotCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBwQWQtPkNvbW1vbkNmZy5CYXNpY01sbWVSYXRlOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JLy8KLQkvLyBBZnRlciBMaW5rIGRvd24sIHJlc2V0IHBpZ2d5LWJhY2sgc2V0dGluZyBpbiBBU0lDLiBEaXNhYmxlIFJERy4KLQkvLwotCWlmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApCi0JewotCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKLQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQnl0ZVZhbHVlKTsKLQkJQnl0ZVZhbHVlICY9ICh+MHgxOCk7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJ5dGVWYWx1ZSk7Ci0JfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCS8vIFJlc2V0IERBQwotCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJ5dGVWYWx1ZSk7Ci0JQnl0ZVZhbHVlICY9ICh+MHgxOCk7Ci0JaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikKLQl7Ci0JQnl0ZVZhbHVlIHw9IDB4MTA7Ci0JfQotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIEJ5dGVWYWx1ZSk7Ci0KLQkJUlRNUFNldFBpZ2d5QmFjayhwQWQsRkFMU0UpOwotCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19QSUdHWUJBQ0tfSU5VU0VEKTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkID0gcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LndvcmQ7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkvLyBSZXN0b3JlIGFsbCBzZXR0aW5ncyBpbiB0aGUgZm9sbG93aW5nLgotCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgMCwgKEFMTE5fU0VUUFJPVEVDVHxDQ0tTRVRQUk9URUNUfE9GRE1TRVRQUk9URUNUKSwgVFJVRSwgRkFMU0UpOwotCUFzaWNEaXNhYmxlUkRHKHBBZCk7Ci0JcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iQ3VycmVudEF0aGVyb3MgPSBGQUxTRTsKLQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOb3dBdGhlcm9zQnVyc3RPbiA9IEZBTFNFOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0jaWZkZWYgRE9UMTFOX0RSQUZUMwotCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NDQU5fMjA0MCk7Ci0JcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAud29yZCA9IDA7Ci0JVHJpRXZlbnRJbml0KHBBZCk7Ci0JZm9yIChpID0gMDsgaSA8IChwQWQtPkNoYW5uZWxMaXN0TnVtIC0gMSk7IGkrKykKLQl7Ci0JCXBBZC0+Q2hhbm5lbExpc3RbaV0uYkVmZmVjdGVkQ2hhbm5lbCA9IEZBTFNFOwotCX0KLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQVhfTEVOX0NGRywgMHgxZmZmKTsKLQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKLS8vIEFsbG93IGdvIHRvIHNsZWVwIGFmdGVyIGxpbmtkb3duIHN0ZXBzLgotCVJUTVBfU0VUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7Ci0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApIHsKLQkJLy9zZW5kIGRpc2Fzc29jaWF0ZSBldmVudCB0byB3cGFfc3VwcGxpY2FudAotCQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIElXRVZDVVNUT00sIFJUX0RJU0FTU09DX0VWRU5UX0ZMQUcsIE5VTEwsIE5VTEwsIDApOwotCX0KLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQotI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0JUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQocEFkLCBTSU9DR0lXQVAsIC0xLCBOVUxMLCBOVUxMLCAwKTsKLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0jaWZkZWYgUlQzMHh4Ci0JaWYgKChJU19SVDMweHgocEFkKSB8fCBJU19SVDMwOTAocEFkKXx8SVNfUlQzMzkwKHBBZCkpCi0JCSYmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGg+MXx8cEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aD4xKSkKLQl7Ci0JCVJUTVBfQVNJQ19NTVBTX0RJU0FCTEUocEFkKTsKLQl9Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCi0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgSXRlcmF0ZU9uQnNzVGFiKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCU1MTUVfU1RBUlRfUkVRX1NUUlVDVCAgIFN0YXJ0UmVxOwotCU1MTUVfSk9JTl9SRVFfU1RSVUNUICAgIEpvaW5SZXE7Ci0JVUxPTkcgICAgICAgICAgICAgICAgICAgQnNzSWR4OwotCi0JLy8gQ2hhbmdlIHRoZSB3ZXBzdGF0dXMgdG8gb3JpZ2luYWwgd2Vwc3RhdHVzCi0JcEFkLT5TdGFDZmcuV2VwU3RhdHVzICAgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOwotCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKLQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7Ci0KLQlCc3NJZHggPSBwQWQtPk1sbWVBdXguQnNzSWR4OwotCWlmIChCc3NJZHggPCBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOcikKLQl7Ci0JCS8vIENoZWNrIGNpcGhlciBzdWl0ZSwgQVAgbXVzdCBoYXZlIG1vcmUgc2VjdXJlZCBjaXBoZXIgdGhhbiBzdGF0aW9uIHNldHRpbmcKLQkJLy8gU2V0IHRoZSBQYWlyd2lzZSBhbmQgR3JvdXAgY2lwaGVyIHRvIG1hdGNoIHRoZSBpbnRlbmRlZCBBUCBzZXR0aW5nCi0JCS8vIFdlIGNhbiBvbmx5IGNvbm5lY3QgdG8gQVAgd2l0aCBsZXNzIHNlY3VyZWQgY2lwaGVyIHNldHRpbmcKLQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQotCQl7Ci0JCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLkdyb3VwQ2lwaGVyOwotCi0JCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXIpCi0JCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXI7Ci0JCQllbHNlIGlmIChwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyQXV4ICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKLQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlckF1eDsKLQkJCWVsc2UJLy8gVGhlcmUgaXMgbm8gUGFpckNpcGhlciBBdXgsIGRvd25ncmFkZSBvdXIgY2FwYWJpbGl0eSB0byBUS0lQCi0JCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0JCX0KLQkJZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKLQkJewotCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuR3JvdXBDaXBoZXI7Ci0KLQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXIpCi0JCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyOwotCQkJZWxzZSBpZiAocEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXJBdXggIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQotCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlckF1eDsKLQkJCWVsc2UJLy8gVGhlcmUgaXMgbm8gUGFpckNpcGhlciBBdXgsIGRvd25ncmFkZSBvdXIgY2FwYWJpbGl0eSB0byBUS0lQCi0JCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0KLQkJCS8vIFJTTiBjYXBhYmlsaXR5Ci0JCQlwQWQtPlN0YUNmZy5Sc25DYXBhYmlsaXR5ID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlJzbkNhcGFiaWxpdHk7Ci0JCX0KLQotCQkvLyBTZXQgTWl4IGNpcGhlciBmbGFnCi0JCXBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgPSAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcikgPyBGQUxTRSA6IFRSVUU7Ci0JCS8qaWYgKHBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgPT0gVFJVRSkKLQkJewotCQkJLy8gSWYgbWl4IGNpcGhlciwgcmUtYnVpbGQgUlNOSUUKLQkJCVJUTVBNYWtlUlNOSUUocEFkLCBwQWQtPlN0YUNmZy5BdXRoTW9kZSwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCAwKTsKLQkJfSovCi0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGl0ZXJhdGUgQlNTICVsZCBvZiAlZFxuIiwgQnNzSWR4LCBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOcikpOwotCQlKb2luUGFybUZpbGwocEFkLCAmSm9pblJlcSwgQnNzSWR4KTsKLQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0pPSU5fUkVRLCBzaXplb2YoTUxNRV9KT0lOX1JFUV9TVFJVQ1QpLAotCQkJCQkmSm9pblJlcSk7Ci0JCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfSk9JTjsKLQl9Ci0JZWxzZSBpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQWxsIEJTUyBmYWlsOyBzdGFydCBhIG5ldyBBREhPQyAoU3NpZD0lcykuLi5cbiIscEFkLT5NbG1lQXV4LlNzaWQpKTsKLQkJU3RhcnRQYXJtRmlsbChwQWQsICZTdGFydFJlcSwgKFBDSEFSKXBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7Ci0JCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TVEFSVF9SRVEsIHNpemVvZihNTE1FX1NUQVJUX1JFUV9TVFJVQ1QpLCAmU3RhcnRSZXEpOwotCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX1NUQVJUOwotCX0KLQllbHNlIC8vIG5vIG1vcmUgQlNTCi0JewotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCXsKLQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwotCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQWxsIHJvYW1pbmcgZmFpbGVkLCByZXN0b3JlIHRvIGNoYW5uZWwgJWQsIFRvdGFsIEJTU1slMDJkXVxuIixwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPlNjYW5UYWIuQnNzTnIpKTsKLQkJfQotCi0JCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7Ci0JfQotfQotCi0vLyBmb3IgcmUtYXNzb2NpYXRpb24gb25seQotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIEl0ZXJhdGVPbkJzc1RhYjIoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JTUxNRV9SRUFTU09DX1JFUV9TVFJVQ1QgUmVhc3NvY1JlcTsKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBCc3NJZHg7Ci0JQlNTX0VOVFJZICAgICAgICAgICAgICAgKnBCc3M7Ci0KLQlCc3NJZHggPSBwQWQtPk1sbWVBdXguUm9hbUlkeDsKLQlwQnNzID0gJnBBZC0+TWxtZUF1eC5Sb2FtVGFiLkJzc0VudHJ5W0Jzc0lkeF07Ci0KLQlpZiAoQnNzSWR4IDwgcEFkLT5NbG1lQXV4LlJvYW1UYWIuQnNzTnIpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gaXRlcmF0ZSBCU1MgJWxkIG9mICVkXG4iLCBCc3NJZHgsIHBBZC0+TWxtZUF1eC5Sb2FtVGFiLkJzc05yKSk7Ci0KLQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQnNzLT5DaGFubmVsLCBGQUxTRSk7Ci0JCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBCc3MtPkNoYW5uZWwpOwotCi0JCS8vIHJlYXNzb2NpYXRlIG1lc3NhZ2UgaGFzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBhc3NvY2lhdGUgbWVzc2FnZQotCQlBc3NvY1Bhcm1GaWxsKHBBZCwgJlJlYXNzb2NSZXEsIHBCc3MtPkJzc2lkLCBwQnNzLT5DYXBhYmlsaXR5SW5mbywKLQkJCQkJICBBU1NPQ19USU1FT1VULCBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQpOwotCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLAotCQkJCQlzaXplb2YoTUxNRV9SRUFTU09DX1JFUV9TVFJVQ1QpLCAmUmVhc3NvY1JlcSk7Ci0KLQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9SRUFTU09DOwotCX0KLQllbHNlIC8vIG5vIG1vcmUgQlNTCi0JewotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCXsKLQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwotCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQWxsIHJvYW1pbmcgZmFpbGVkLCByZXN0b3JlIHRvIGNoYW5uZWwgJWQsIFRvdGFsIEJTU1slMDJkXVxuIixwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPlNjYW5UYWIuQnNzTnIpKTsKLQkJfQotCi0JCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBKb2luUGFybUZpbGwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gT1VUIE1MTUVfSk9JTl9SRVFfU1RSVUNUICpKb2luUmVxLAotCUlOIFVMT05HIEJzc0lkeCkKLXsKLQlKb2luUmVxLT5Cc3NJZHggPSBCc3NJZHg7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFNjYW5QYXJtRmlsbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBPVVQgTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgKlNjYW5SZXEsCi0JSU4gU1RSSU5HIFNzaWRbXSwKLQlJTiBVQ0hBUiBTc2lkTGVuLAotCUlOIFVDSEFSIEJzc1R5cGUsCi0JSU4gVUNIQVIgU2NhblR5cGUpCi17Ci0gICAgTmRpc1plcm9NZW1vcnkoU2NhblJlcS0+U3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKLQlTY2FuUmVxLT5Tc2lkTGVuID0gU3NpZExlbjsKLQlOZGlzTW92ZU1lbW9yeShTY2FuUmVxLT5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKLQlTY2FuUmVxLT5Cc3NUeXBlID0gQnNzVHlwZTsKLQlTY2FuUmVxLT5TY2FuVHlwZSA9IFNjYW5UeXBlOwotfQotCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBEbHNQYXJtRmlsbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBPVVQgTUxNRV9ETFNfUkVRX1NUUlVDVCAqcERsc1JlcSwKLQlJTiBQUlRfODAyXzExX0RMUyBwRGxzLAotCUlOIFVTSE9SVCByZWFzb24pCi17Ci0JcERsc1JlcS0+cERMUyA9IHBEbHM7Ci0JcERsc1JlcS0+UmVhc29uID0gcmVhc29uOwotfQotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBTdGFydFBhcm1GaWxsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE9VVCBNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgKlN0YXJ0UmVxLAotCUlOIENIQVIgU3NpZFtdLAotCUlOIFVDSEFSIFNzaWRMZW4pCi17Ci0JQVNTRVJUKFNzaWRMZW4gPD0gTUFYX0xFTl9PRl9TU0lEKTsKLQlOZGlzTW92ZU1lbW9yeShTdGFydFJlcS0+U3NpZCwgU3NpZCwgU3NpZExlbik7Ci0JU3RhcnRSZXEtPlNzaWRMZW4gPSBTc2lkTGVuOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBdXRoUGFybUZpbGwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gT1VUIE1MTUVfQVVUSF9SRVFfU1RSVUNUICpBdXRoUmVxLAotCUlOIFBVQ0hBUiBwQWRkciwKLQlJTiBVU0hPUlQgQWxnKQotewotCUNPUFlfTUFDX0FERFIoQXV0aFJlcS0+QWRkciwgcEFkZHIpOwotCUF1dGhSZXEtPkFsZyA9IEFsZzsKLQlBdXRoUmVxLT5UaW1lb3V0ID0gQVVUSF9USU1FT1VUOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLVZPSUQgQ29tcG9zZVBzUG9sbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5Qc1BvbGxGcmFtZSwgc2l6ZW9mKFBTUE9MTF9GUkFNRSkpOwotCXBBZC0+UHNQb2xsRnJhbWUuRkMuVHlwZSA9IEJUWVBFX0NOVEw7Ci0JcEFkLT5Qc1BvbGxGcmFtZS5GQy5TdWJUeXBlID0gU1VCVFlQRV9QU19QT0xMOwotCXBBZC0+UHNQb2xsRnJhbWUuQWlkID0gcEFkLT5TdGFBY3RpdmUuQWlkIHwgMHhDMDAwOwotCUNPUFlfTUFDX0FERFIocEFkLT5Qc1BvbGxGcmFtZS5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCUNPUFlfTUFDX0FERFIocEFkLT5Qc1BvbGxGcmFtZS5UYSwgcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci19Ci0KLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRCBDb21wb3NlTnVsbEZyYW1lKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk51bGxGcmFtZSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLQlwQWQtPk51bGxGcmFtZS5GQy5UeXBlID0gQlRZUEVfREFUQTsKLQlwQWQtPk51bGxGcmFtZS5GQy5TdWJUeXBlID0gU1VCVFlQRV9OVUxMX0ZVTkM7Ci0JcEFkLT5OdWxsRnJhbWUuRkMuVG9EcyA9IDE7Ci0JQ09QWV9NQUNfQUREUihwQWQtPk51bGxGcmFtZS5BZGRyMSwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCUNPUFlfTUFDX0FERFIocEFkLT5OdWxsRnJhbWUuQWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOwotCUNPUFlfTUFDX0FERFIocEFkLT5OdWxsRnJhbWUuQWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlQcmUtYnVpbGQgYSBCRUFDT04gZnJhbWUgaW4gdGhlIHNoYXJlZCBtZW1vcnkKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVMT05HIE1ha2VJYnNzQmVhY29uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVVDSEFSICAgICAgICAgRHNMZW4gPSAxLCBJYnNzTGVuID0gMjsKLQlVQ0hBUiAgICAgICAgIExvY2FsRXJwSWVbM10gPSB7SUVfRVJQLCAxLCAweDA0fTsKLQlIRUFERVJfODAyXzExIEJjbkhkcjsKLQlVU0hPUlQgICAgICAgIENhcGFiaWxpdHlJbmZvOwotCUxBUkdFX0lOVEVHRVIgRmFrZVRpbWVzdGFtcDsKLQlVTE9ORyAgICAgICAgIEZyYW1lTGVuID0gMDsKLQlQVFhXSV9TVFJVQwkgIHBUeFdJID0gJnBBZC0+QmVhY29uVHhXSTsKLQlVQ0hBUiAgICAgICAgICpwQmVhY29uRnJhbWUgPSBwQWQtPkJlYWNvbkJ1ZjsKLQlCT09MRUFOICAgICAgIFByaXZhY3k7Ci0JVUNIQVIgICAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUiAgICAgICAgIFN1cFJhdGVMZW4gPSAwOwotCVVDSEFSICAgICAgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ci0JVUNIQVIgICAgICAgICBFeHRSYXRlTGVuID0gMDsKLQlVQ0hBUiAgICAgICAgIFJTTkllID0gSUVfV1BBOwotCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpICYmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KSkKLQl7Ci0JCVN1cFJhdGVbMF0gPSAweDgyOyAvLyAxIG1icHMKLQkJU3VwUmF0ZVsxXSA9IDB4ODQ7IC8vIDIgbWJwcwotCQlTdXBSYXRlWzJdID0gMHg4YjsgLy8gNS41IG1icHMKLQkJU3VwUmF0ZVszXSA9IDB4OTY7IC8vIDExIG1icHMKLQkJU3VwUmF0ZUxlbiA9IDQ7Ci0JCUV4dFJhdGVMZW4gPSAwOwotCX0KLQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCi0JewotCQlTdXBSYXRlWzBdICA9IDB4OEM7ICAgIC8vIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJU3VwUmF0ZVsxXSAgPSAweDEyOyAgICAvLyA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCVN1cFJhdGVbMl0gID0gMHg5ODsgICAgLy8gMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJU3VwUmF0ZVszXSAgPSAweDI0OyAgICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQlTdXBSYXRlWzRdICA9IDB4YjA7ICAgIC8vIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCVN1cFJhdGVbNV0gID0gMHg0ODsgICAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJU3VwUmF0ZVs2XSAgPSAweDYwOyAgICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQlTdXBSYXRlWzddICA9IDB4NmM7ICAgIC8vIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCVN1cFJhdGVMZW4gID0gODsKLQkJRXh0UmF0ZUxlbiAgPSAwOwotCi0JCS8vCi0JCS8vIEFsc28gVXBkYXRlIE1sbWVSYXRlICYgUnRzUmF0ZSBmb3IgRyBvbmx5ICYgQSBvbmx5Ci0JCS8vCi0JCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV82OwotCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV82OwotCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07Ci0JfQotCWVsc2UKLQl7Ci0JCVN1cFJhdGVbMF0gPSAweDgyOyAvLyAxIG1icHMKLQkJU3VwUmF0ZVsxXSA9IDB4ODQ7IC8vIDIgbWJwcwotCQlTdXBSYXRlWzJdID0gMHg4YjsgLy8gNS41IG1icHMKLQkJU3VwUmF0ZVszXSA9IDB4OTY7IC8vIDExIG1icHMKLQkJU3VwUmF0ZUxlbiA9IDQ7Ci0KLQkJRXh0UmF0ZVswXSAgPSAweDBDOyAgICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLAotCQlFeHRSYXRlWzFdICA9IDB4MTI7ICAgIC8vIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJRXh0UmF0ZVsyXSAgPSAweDE4OyAgICAvLyAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywKLQkJRXh0UmF0ZVszXSAgPSAweDI0OyAgICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQlFeHRSYXRlWzRdICA9IDB4MzA7ICAgIC8vIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLAotCQlFeHRSYXRlWzVdICA9IDB4NDg7ICAgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCUV4dFJhdGVbNl0gID0gMHg2MDsgICAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJRXh0UmF0ZVs3XSAgPSAweDZjOyAgICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQlFeHRSYXRlTGVuICA9IDg7Ci0JfQotCi0JcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47Ci0JTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuU3VwUmF0ZSwgU3VwUmF0ZSwgU3VwUmF0ZUxlbik7Ci0JcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9IEV4dFJhdGVMZW47Ci0JTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuRXh0UmF0ZSwgRXh0UmF0ZSwgRXh0UmF0ZUxlbik7Ci0KLQkvLyBjb21wb3NlIElCU1MgYmVhY29uIGZyYW1lCi0JTWd0TWFjSGVhZGVySW5pdChwQWQsICZCY25IZHIsIFNVQlRZUEVfQkVBQ09OLCAwLCBCUk9BRENBU1RfQUREUiwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCVByaXZhY3kgPSAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpIHx8Ci0JCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKLQkJCSAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKTsKLQlDYXBhYmlsaXR5SW5mbyA9IENBUF9HRU5FUkFURSgwLCAxLCBQcml2YWN5LCAocEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlU2hvcnQpLCAwLCAwKTsKLQotCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZSwgICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgICAgICAgICZCY25IZHIsCi0JCQkJCSAgVElNRVNUQU1QX0xFTiwgICAgICAgICAgICAgICAgICAgJkZha2VUaW1lc3RhbXAsCi0JCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCwKLQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ2FwYWJpbGl0eUluZm8sCi0JCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKLQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuU3NpZExlbiwKLQkJCQkJICBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Tc2lkLAotCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCi0JCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVMZW4sCi0JCQkJCSAgU3VwUmF0ZUxlbiwgICAgICAgICAgICAgICAgICAgICAgU3VwUmF0ZSwKLQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRHNJZSwKLQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRHNMZW4sCi0JCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsCi0JCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklic3NJZSwKLQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSWJzc0xlbiwKLQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFBY3RpdmUuQXRpbVdpbiwKLQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0KLQkvLyBhZGQgRVJQX0lFIGFuZCBFWFRfUkFFIElFIG9mIGluIDgwMi4xMWcKLQlpZiAoRXh0UmF0ZUxlbikKLQl7Ci0JCVVMT05HCXRtcDsKLQotCQlNYWtlT3V0Z29pbmdGcmFtZShwQmVhY29uRnJhbWUgKyBGcmFtZUxlbiwgICAgICAgICAmdG1wLAotCQkJCQkJICAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbEVycEllLAotCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAotCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUxlbiwKLQkJCQkJCSAgRXh0UmF0ZUxlbiwgICAgICAgICAgICAgICAgICAgICAgRXh0UmF0ZSwKLQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQlGcmFtZUxlbiArPSB0bXA7Ci0JfQotCi0JLy8gSWYgYWRob2Mgc2VjcnVpdHkgaXMgc2V0IGZvciBXUEEtTm9uZSwgYXBwZW5kIHRoZSBjaXBoZXIgc3VpdGUgSUUKLQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKLQl7Ci0JCVVMT05HIHRtcDsKLSAgICAgICAgUlRNUE1ha2VSU05JRShwQWQsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIEJTUzApOwotCi0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZSArIEZyYW1lTGVuLAkJJnRtcCwKLQkJCQkJCSAgMSwJCQkJCSZSU05JZSwKLQkJCQkJCSAgMSwJCQkJCSZwQWQtPlN0YUNmZy5SU05JRV9MZW4sCi0JCQkJCQkgIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwJCXBBZC0+U3RhQ2ZnLlJTTl9JRSwKLQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQlGcmFtZUxlbiArPSB0bXA7Ci0JfQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQotCXsKLQkJVUxPTkcgVG1wTGVuOwotCQlVQ0hBUiBIdExlbiwgSHRMZW4xOwotCi0jaWZkZWYgUlRfQklHX0VORElBTgotCQlIVF9DQVBBQklMSVRZX0lFIEh0Q2FwYWJpbGl0eVRtcDsKLQkJQUREX0hUX0lORk9fSUUJYWRkSFRJbmZvVG1wOwotCQlVU0hPUlQJYjJsVG1wLCBiMmxUbXAyOwotI2VuZGlmCi0KLQkJLy8gYWRkIEhUIENhcGFiaWxpdHkgSUUKLQkJSHRMZW4gPSBzaXplb2YocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5KTsKLQkJSHRMZW4xID0gc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbyk7Ci0jaWZuZGVmIFJUX0JJR19FTkRJQU4KLQkJTWFrZU91dGdvaW5nRnJhbWUocEJlYWNvbkZyYW1lK0ZyYW1lTGVuLAkmVG1wTGVuLAotCQkJCQkJICAxLAkJCQkJCSZIdENhcEllLAotCQkJCQkJICAxLAkJCQkJCSZIdExlbiwKLQkJCQkJCSAgSHRMZW4sCQkJCQkmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LAotCQkJCQkJICAxLAkJCQkJCSZBZGRIdEluZm9JZSwKLQkJCQkJCSAgMSwJCQkJCQkmSHRMZW4xLAotCQkJCQkJICBIdExlbjEsCQkJCQkmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLAotCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0jZWxzZQotCQlOZGlzTW92ZU1lbW9yeSgmSHRDYXBhYmlsaXR5VG1wLCAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LCBIdExlbik7Ci0JCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykpOwotCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pKTsKLQotCQlOZGlzTW92ZU1lbW9yeSgmYWRkSFRJbmZvVG1wLCAmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLCBIdExlbjEpOwotCQkqKFVTSE9SVCAqKSgmYWRkSFRJbmZvVG1wLkFkZEh0SW5mbzIpID0gU1dBUDE2KCooVVNIT1JUICopKCZhZGRIVEluZm9UbXAuQWRkSHRJbmZvMikpOwotCQkqKFVTSE9SVCAqKSgmYWRkSFRJbmZvVG1wLkFkZEh0SW5mbzMpID0gU1dBUDE2KCooVVNIT1JUICopKCZhZGRIVEluZm9UbXAuQWRkSHRJbmZvMykpOwotCi0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZStGcmFtZUxlbiwJJlRtcExlbiwKLQkJCQkJCSAgMSwJCQkJCQkmSHRDYXBJZSwKLQkJCQkJCSAgMSwJCQkJCQkmSHRMZW4sCi0JCQkJCQkgIEh0TGVuLAkJCQkJJkh0Q2FwYWJpbGl0eVRtcCwKLQkJCQkJCSAgMSwJCQkJCQkmQWRkSHRJbmZvSWUsCi0JCQkJCQkgIDEsCQkJCQkJJkh0TGVuMSwKLQkJCQkJCSAgSHRMZW4xLAkJCQkJJmFkZEhUSW5mb1RtcCwKLQkJCQkJCSAgRU5EX09GX0FSR1MpOwotI2VuZGlmCi0JCUZyYW1lTGVuICs9IFRtcExlbjsKLQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkvL2JlYWNvbiB1c2UgcmVzZXJ2ZWQgV0NJRCAweGZmCi0gICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKLSAgICB7Ci0JUlRNUFdyaXRlVHhXSShwQWQsIHBUeFdJLCBGQUxTRSwgRkFMU0UsICBUUlVFLCBGQUxTRSwgRkFMU0UsIFRSVUUsIDAsIDB4ZmYsIEZyYW1lTGVuLAotCQlQSURfTUdNVCwgUElEX0JFQUNPTiwgUkFURV8xLCBJRlNfSFRUWE9QLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8vIFNldCB0byB1c2UgMU1icHMgZm9yIEFkaG9jIGJlYWNvbi4KLQkJSFRUUkFOU01JVF9TRVRUSU5HIFRyYW5zbWl0OwotICAgICAgICBUcmFuc21pdC53b3JkID0gMDsKLSAgICAgICAgUlRNUFdyaXRlVHhXSShwQWQsIHBUeFdJLCBGQUxTRSwgRkFMU0UsICBUUlVFLCBGQUxTRSwgRkFMU0UsIFRSVUUsIDAsIDB4ZmYsIEZyYW1lTGVuLAotCQlQSURfTUdNVCwgUElEX0JFQUNPTiwgUkFURV8xLCBJRlNfSFRUWE9QLCBGQUxTRSwgJlRyYW5zbWl0KTsKLSAgICB9Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgcEJlYWNvbkZyYW1lLCBESVJfV1JJVEUsIEZBTFNFKTsKLQlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhXSSwgVFlQRV9UWFdJKTsKLSNlbmRpZgotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFrZUlic3NCZWFjb24gKGxlbj0lbGQpLCBTdXBSYXRlTGVuPSVkLCBFeHRSYXRlTGVuPSVkLCBDaGFubmVsPSVkLCBQaHlNb2RlPSVkXG4iLAotCQkJCQlGcmFtZUxlbiwgU3VwUmF0ZUxlbiwgRXh0UmF0ZUxlbiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSkpOwotCXJldHVybiBGcmFtZUxlbjsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhL2Rscy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvZGxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNmUxNmYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvZGxzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjA3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgZGxzLmMKLQotICAgIEFic3RyYWN0OgotICAgIEhhbmRsZSBXTU0tRExTIHN0YXRlIG1hY2hpbmUKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgUm9yeSBDaGVuICAgMDItMTQtMjAwNgotCUFydmluIFRhaQkwNi0wMy0yMDA4CSAgTW9kaWZpZWQgZm9yIFJUMjh4eAotICovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIGRscyBzdGF0ZSBtYWNoaW5lIGluaXQsIGluY2x1ZGluZyBzdGF0ZSB0cmFuc2l0aW9uIGFuZCB0aW1lciBpbml0Ci0gICAgUGFyYW1ldGVyczoKLSAgICAgICAgU20gLSBwb2ludGVyIHRvIHRoZSBkbHMgc3RhdGUgbWFjaGluZQotICAgIE5vdGU6Ci0gICAgICAgIFRoZSBzdGF0ZSBtYWNoaW5lIGxvb2tzIGxpa2UgdGhpcwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRExTX0lETEUKLSAgICBNVDJfTUxNRV9ETFNfUkVRVUVTVCAgIE1sbWVEbHNSZXFBY3Rpb24KLSAgICBNVDJfUEVFUl9ETFNfUkVRVUVTVCAgIFBlZXJEbHNSZXFBY3Rpb24KLSAgICBNVDJfUEVFUl9ETFNfUkVTUE9OU0UgIFBlZXJEbHNSc3BBY3Rpb24KLSAgICBNVDJfTUxNRV9ETFNfVEVBUkRPV04gIE1sbWVUZWFyRG93bkFjdGlvbgotICAgIE1UMl9QRUVSX0RMU19URUFSRE9XTiAgUGVlclRlYXJEb3duQWN0aW9uCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotdm9pZCBEbHNTdGF0ZU1hY2hpbmVJbml0KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFNUQVRFX01BQ0hJTkUgKlNtLAotICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKLXsKLQlVQ0hBUglpOwotCi0gICAgU3RhdGVNYWNoaW5lSW5pdChTbSwgKFNUQVRFX01BQ0hJTkVfRlVOQyopVHJhbnMsIE1BWF9ETFNfU1RBVEUsIE1BWF9ETFNfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIERMU19JRExFLCBETFNfTUFDSElORV9CQVNFKTsKLQotICAgIC8vIHRoZSBmaXJzdCBjb2x1bW4KLSAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIERMU19JRExFLCBNVDJfTUxNRV9ETFNfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVEbHNSZXFBY3Rpb24pOwotICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgRExTX0lETEUsIE1UMl9QRUVSX0RMU19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRsc1JlcUFjdGlvbik7Ci0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBETFNfSURMRSwgTVQyX1BFRVJfRExTX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGxzUnNwQWN0aW9uKTsKLSAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIERMU19JRExFLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVEbHNUZWFyRG93bkFjdGlvbik7Ci0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBETFNfSURMRSwgTVQyX1BFRVJfRExTX1RFQVJfRE9XTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGxzVGVhckRvd25BY3Rpb24pOwotCi0JZm9yIChpPTA7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKLQl7Ci0JCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLnBBZCA9IHBBZDsKLQkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKERsc1RpbWVvdXRBY3Rpb24pLCBwQWQsIEZBTFNFKTsKLQl9Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNbG1lRGxzUmVxQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUwkJTlN0YXR1czsKLQlVTE9ORwkJCUZyYW1lTGVuID0gMDsKLQlIRUFERVJfODAyXzExCURsc1JlcUhkcjsKLQlQUlRfODAyXzExX0RMUwlwRExTID0gTlVMTDsKLQlVQ0hBUgkJCUNhdGVnb3J5ID0gQ0FURUdPUllfRExTOwotCVVDSEFSCQkJQWN0aW9uID0gQUNUSU9OX0RMU19SRVFVRVNUOwotCVVMT05HCQkJdG1wOwotCVVTSE9SVAkJCXJlYXNvbjsKLQlVTE9ORwkJCVRpbWVvdXQ7Ci0JQk9PTEVBTgkJCVRpbWVyQ2FuY2VsbGVkOwotCi0JaWYoIU1sbWVEbHNSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJnBETFMsICZyZWFzb24pKQotCQlyZXR1cm47Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIE1sbWVEbHNSZXFBY3Rpb24oKSBcbiIpKTsKLQotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gTWxtZURsc1JlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlBY3RIZWFkZXJJbml0KHBBZCwgJkRsc1JlcUhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQotCS8vIEJ1aWxkIGJhc2ljIGZyYW1lIGZpcnN0Ci0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAotCQkJCQlzaXplb2YoSEVBREVSXzgwMl8xMSksCQkmRGxzUmVxSGRyLAotCQkJCQkxLAkJCQkJCQkmQ2F0ZWdvcnksCi0JCQkJCTEsCQkJCQkJCSZBY3Rpb24sCi0JCQkJCTYsCQkJCQkJCSZwRExTLT5NYWNBZGRyLAotCQkJCQk2LAkJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAotCQkJCQkyLAkJCQkJCQkmcEFkLT5TdGFBY3RpdmUuQ2FwYWJpbGl0eUluZm8sCi0JCQkJCTIsCQkJCQkJCSZwRExTLT5UaW1lT3V0LAotCQkJCQkxLAkJCQkJCQkmU3VwUmF0ZUllLAotCQkJCQkxLAkJCQkJCQkmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCi0JCQkJCXBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLAlwQWQtPk1sbWVBdXguU3VwUmF0ZSwKLQkJCQkJRU5EX09GX0FSR1MpOwotCi0JaWYgKHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuICE9IDApCi0JewotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCi0JCQkJCQkgIDEsCQkJCQkJJkV4dFJhdGVJZSwKLQkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCi0JCQkJCQkgIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAlwQWQtPk1sbWVBdXguRXh0UmF0ZSwKLQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQlGcmFtZUxlbiArPSB0bXA7Ci0JfQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQotCXsKLQkJVUNIQVIgSHRMZW47Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCUhUX0NBUEFCSUxJVFlfSUUgSHRDYXBhYmlsaXR5VG1wOwotI2VuZGlmCi0KLQkJLy8gYWRkIEhUIENhcGFiaWxpdHkgSUUKLQkJSHRMZW4gPSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSk7Ci0jaWZuZGVmIFJUX0JJR19FTkRJQU4KLQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAkmdG1wLAotCQkJCQkJCTEsCQkJCQkJJkh0Q2FwSWUsCi0JCQkJCQkJMSwJCQkJCQkmSHRMZW4sCi0JCQkJCQkJSHRMZW4sCQkJCQkmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LAotCQkJCQkJCUVORF9PRl9BUkdTKTsKLSNlbHNlCi0JCU5kaXNNb3ZlTWVtb3J5KCZIdENhcGFiaWxpdHlUbXAsICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksIEh0TGVuKTsKLQkJCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pKTsKLQkJCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pKTsKLQotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCi0JCQkJCQkJMSwJCQkJCQkmSHRDYXBJZSwKLQkJCQkJCQkxLAkJCQkJCSZIdExlbiwKLQkJCQkJCQlIdExlbiwJCQkJCSZIdENhcGFiaWxpdHlUbXAsCi0JCQkJCQkJRU5EX09GX0FSR1MpOwotI2VuZGlmCi0JCUZyYW1lTGVuID0gRnJhbWVMZW4gKyB0bXA7Ci0JfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JUlRNUENhbmNlbFRpbWVyKCZwRExTLT5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQlUaW1lb3V0ID0gRExTX1RJTUVPVVQ7Ci0JUlRNUFNldFRpbWVyKCZwRExTLT5UaW1lciwgVGltZW91dCk7Ci0KLQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBQZWVyRGxzUmVxQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUwkJTlN0YXR1czsKLQlVTE9ORwkJCUZyYW1lTGVuID0gMDsKLQlVU0hPUlQJCQlTdGF0dXNDb2RlID0gTUxNRV9TVUNDRVNTOwotCUhFQURFUl84MDJfMTEJRGxzUnNwSGRyOwotCVVDSEFSCQkJQ2F0ZWdvcnkgPSBDQVRFR09SWV9ETFM7Ci0JVUNIQVIJCQlBY3Rpb24gPSBBQ1RJT05fRExTX1JFU1BPTlNFOwotCVVMT05HCQkJdG1wOwotCVVTSE9SVAkJCUNhcGFiaWxpdHlJbmZvOwotCVVDSEFSCQkJREFbTUFDX0FERFJfTEVOXSwgU0FbTUFDX0FERFJfTEVOXTsKLQlVU0hPUlQJCQlETFNUaW1lT3V0OwotCVNIT1JUCQkJaTsKLQlVTE9ORwkJCVRpbWVvdXQ7Ci0JQk9PTEVBTgkJCVRpbWVyQ2FuY2VsbGVkOwotCVBSVF84MDJfMTFfRExTCXBETFMgPSBOVUxMOwotCVVDSEFSCQkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IDA7Ci0gICAgVUNIQVIJCQlTdXBwb3J0ZWRSYXRlc0xlbjsKLSAgICBVQ0hBUgkJCVN1cHBvcnRlZFJhdGVzW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbjsKLQlIVF9DQVBBQklMSVRZX0lFCUh0Q2FwYWJpbGl0eTsKLQotCWlmICghUGVlckRsc1JlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBEQSwgU0EsICZDYXBhYmlsaXR5SW5mbywgJkRMU1RpbWVPdXQsCi0JCQkJCQkJJlN1cHBvcnRlZFJhdGVzTGVuLCAmU3VwcG9ydGVkUmF0ZXNbMF0sICZIdENhcGFiaWxpdHlMZW4sICZIdENhcGFiaWxpdHkpKQotCQlyZXR1cm47Ci0KLSAgICAvLyBzdXBwb3J0ZWQgcmF0ZXMgYXJyYXkgbWF5IG5vdCBiZSBzb3J0ZWQuIHNvcnQgaXQgYW5kIGZpbmQgdGhlIG1heGltdW0gcmF0ZQotICAgIGZvciAoaSA9IDA7IGkgPCBTdXBwb3J0ZWRSYXRlc0xlbjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPCAoU3VwcG9ydGVkUmF0ZXNbaV0gJiAweDdmKSkKLSAgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSBTdXBwb3J0ZWRSYXRlc1tpXSAmIDB4N2Y7Ci0gICAgfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzUmVxQWN0aW9uKCkgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwgU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOwotCi0JTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBQZWVyRGxzUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghSU5GUkFfT04ocEFkKSkKLQl7Ci0JCVN0YXR1c0NvZGUgPSBNTE1FX1JFUVVFU1RfREVDTElORUQ7Ci0JfQotCWVsc2UgaWYgKCFwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkKLQl7Ci0JCVN0YXR1c0NvZGUgPSBNTE1FX0RFU1RfU1RBX0lTX05PVF9BX1FTVEE7Ci0JfQotCWVsc2UgaWYgKCFwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKLQl7Ci0JCVN0YXR1c0NvZGUgPSBNTE1FX1JFUVVFU1RfREVDTElORUQ7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIGZpbmQgdGFibGUgdG8gdXBkYXRlIHBhcmFtZXRlcnMKLQkJZm9yIChpID0gKE1BWF9OVU1fT0ZfRExTX0VOVFJZLTEpOyBpID49IDA7IGktLSkKLQkJewotCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKFNBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKLQkJCXsKLQkJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfV0FJVF9LRVk7Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX0ZJTklTSDsKLQkJCQl9Ci0KLQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TZXF1ZW5jZSA9IDA7Ci0JCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCA9IERMU1RpbWVPdXQ7Ci0JCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPSBETFNUaW1lT3V0OwotCQkJCWlmIChIdENhcGFiaWxpdHlMZW4gIT0gMCkKLQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gVFJVRTsKLQkJCQllbHNlCi0JCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IEZBTFNFOwotCQkJCXBETFMgPSAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjYW4gbm90IGZpbmQgaW4gdGFibGUsIGNyZWF0ZSBhIG5ldyBvbmUKLQkJaWYgKGkgPCAwKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNSZXFBY3Rpb24oKSBjYW4gbm90IGZpbmQgc2FtZSBlbnRyeSBcbiIpKTsKLQkJCWZvciAoaT0oTUFYX05VTV9PRl9ETFNfRU5UUlkgLSAxKTsgaSA+PSBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpLS0pCi0JCQl7Ci0JCQkJaWYgKCFwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCkKLQkJCQl7Ci0JCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OwotCQkJCQlVQ0hBUiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsKLQotCQkJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotCQkJCQl7Ci0JCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfV0FJVF9LRVk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwotCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX0ZJTklTSDsKLQkJCQkJfQotCi0JCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlNlcXVlbmNlID0gMDsKLQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgPSBUUlVFOwotCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0ID0gRExTVGltZU91dDsKLQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPSBETFNUaW1lT3V0OwotCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyLCBTQSwgTUFDX0FERFJfTEVOKTsKLQkJCQkJaWYgKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKQotCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gVFJVRTsKLQkJCQkJZWxzZQotCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gRkFMU0U7Ci0JCQkJCXBETFMgPSAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV07Ci0JCQkJCXBFbnRyeSA9IE1hY1RhYmxlSW5zZXJ0RGxzRW50cnkocEFkLCBTQSwgaSk7Ci0KLQkJCQkJc3dpdGNoIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzKQotCQkJCQl7Ci0JCQkJCQljYXNlIDEwODogTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNTQ7ICAgYnJlYWs7Ci0JCQkJCQljYXNlIDk2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNDg7ICAgYnJlYWs7Ci0JCQkJCQljYXNlIDcyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMzY7ICAgYnJlYWs7Ci0JCQkJCQljYXNlIDQ4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjQ7ICAgYnJlYWs7Ci0JCQkJCQljYXNlIDM2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTg7ICAgYnJlYWs7Ci0JCQkJCQljYXNlIDI0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTI7ICAgYnJlYWs7Ci0JCQkJCQljYXNlIDE4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfOTsgICAgYnJlYWs7Ci0JCQkJCQljYXNlIDEyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNjsgICAgYnJlYWs7Ci0JCQkJCQljYXNlIDIyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7Ci0JCQkJCQljYXNlIDExOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNV81OyAgYnJlYWs7Ci0JCQkJCQljYXNlIDQ6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjsgICAgYnJlYWs7Ci0JCQkJCQljYXNlIDI6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTsgICAgYnJlYWs7Ci0JCQkJCQlkZWZhdWx0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7Ci0JCQkJCX0KLQotCQkJCQlwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPSBtaW4ocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlLCBNYXhTdXBwb3J0ZWRSYXRlKTsKLQotCQkJCQlpZiAocEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpCi0JCQkJCXsKLQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKLQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKLQkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKLQkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKLQkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKLQkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOwotCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07Ci0JCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKLQkJCQkJfQotCi0JCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7Ci0JCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCQkJcEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMDsKLQkJCQkJcEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMDsKLQotCQkJCQkvLyBJZiB0aGlzIEVudHJ5IHN1cHBvcnRzIDgwMi4xMW4sIHVwZ3JhZGUgdG8gSFQgcmF0ZS4KLQkJCQkJaWYgKChIdENhcGFiaWxpdHlMZW4gIT0gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCi0JCQkJCXsKLQkJCQkJCVVDSEFSCWosIGJpdG1hc2s7IC8vayxiaXRtYXNrOwotCQkJCQkJQ0hBUiAgICBpaTsKLQotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRExTIC0gUGVlckRsc1JlcUFjdGlvbigpIFJlY2VpdmUgUGVlciBIVCBDYXBhYmxlIFNUQSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQkJCQkJCQkJU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOwotCi0JCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uR0YpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YpKQotCQkJCQkJewotCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKLQkJCQkJCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbk5vbkdGID0gVFJVRTsKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSAxOwotCQkJCQkJfQotCi0JCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCkpCi0JCQkJCQl7Ci0JCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlc9IEJXXzQwOwotCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDApJihIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCkpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7Ci0JCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9ICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCkmKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwKSk7Ci0JCQkJCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb24yME9ubHkgPSBUUlVFOwotCQkJCQkJfQotCi0JCQkJCQkvLyBmaW5kIG1heCBmaXhlZCByYXRlCi0JCQkJCQlmb3IgKGlpPTE1OyBpaT49MDsgaWktLSkKLQkJCQkJCXsKLQkJCQkJCQlqID0gaWkvODsKLQkJCQkJCQliaXRtYXNrID0gKDE8PChpaS0oaio4KSkpOwotCQkJCQkJCWlmICggKHBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm8uTUNTU2V0W2pdJmJpdG1hc2spICYmIChIdENhcGFiaWxpdHkuTUNTU2V0W2pdJmJpdG1hc2spKQotCQkJCQkJCXsKLQkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gaWk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoaWk9PTApCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCi0KLQkJCQkJCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAhPSBNQ1NfQVVUTykKLQkJCQkJCXsKLQotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJAQEAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9ICVkXG4iLAotCQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTKSk7Ci0JCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID09IDMyKQotCQkJCQkJCXsKLQkJCQkJCQkJLy8gRml4IE1DUyBhcyBIVCBEdXBsaWNhdGVkIE1vZGUKLQkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSAxOwotCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKLQkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IDA7Ci0JCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAwOwotCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSAzMjsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZiAocEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID4gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUykKLQkJCQkJCQl7Ci0JCQkJCQkJCS8vIFNUQSBzdXBwb3J0cyBmaXhlZCBNQ1MKLQkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMgJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQykpOwotCQkJCQkJcEVudHJ5LT5NcGR1RGVuc2l0eSA9IEh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHk7Ci0JCQkJCQlwRW50cnktPk1heFJBbXBkdUZhY3RvciA9IEh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yOwotCQkJCQkJcEVudHJ5LT5NbXBzTW9kZSA9IChVQ0hBUilIdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QczsKLQkJCQkJCXBFbnRyeS0+QU1zZHVTaXplID0gKFVDSEFSKUh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplOwotCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7Ci0KLQkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCkKLQkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRSk7Ci0JCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApCi0JCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUpOwotCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDKQotCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19UeFNUQkNfQ0FQQUJMRSk7Ci0JCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMpCi0JCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1J4U1RCQ19DQVBBQkxFKTsKLQkJCQkJCWlmIChIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMpCi0JCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX0hUQ19DQVBBQkxFKTsKLQkJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnICYmIEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCkKLQkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpOwotCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uTUNTRmVlZGJhY2sgPT0gMHgwMykKLQkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfTUNTRkVFREJBQ0tfQ0FQQUJMRSk7Ci0KLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPkhUQ2FwYWJpbGl0eSwgJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKLQkJCQkJfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JCQkJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkOwotCQkJCQlwRW50cnktPkN1cnJUeFJhdGUgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7Ci0JCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSk7Ci0KLQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IFRSVUUpCi0JCQkJCXsKLQkJCQkJCVBVQ0hBUiBwVGFibGU7Ci0JCQkJCQlVQ0hBUiBUYWJsZVNpemUgPSAwOwotCi0JCQkJCQlNbG1lU2VsZWN0VHhSYXRlVGFibGUocEFkLCBwRW50cnksICZwVGFibGUsICZUYWJsZVNpemUsICZwRW50cnktPkN1cnJUeFJhdGVJbmRleCk7Ci0JCQkJCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERTsKLQkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUwk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7Ci0JCQkJCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7Ci0KLQkJCQkJCVJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoKFVDSEFSKXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUsIHBFbnRyeSk7Ci0JCQkJCX0KLQkJCQkJcEVudHJ5LT5SYXRlTGVuID0gU3VwcG9ydGVkUmF0ZXNMZW47Ci0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVN0YXR1c0NvZGUgPSBNTE1FX1NVQ0NFU1M7Ci0KLQkJLy8gY2FuIG5vdCBmaW5kIGluIHRhYmxlLCBjcmVhdGUgYSBuZXcgb25lCi0JCWlmIChpIDwgMCkKLQkJewotCQkJU3RhdHVzQ29kZSA9IE1MTUVfUU9TX1VOU1BFQ0lGWTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gUGVlckRsc1JlcUFjdGlvbigpIERMU0VudHJ5IHRhYmxlIGZ1bGwob25seSBjYW4gc3VwcG9ydCAlZCBETFMgc2Vzc2lvbikgXG4iLCBNQVhfTlVNX09GX0RMU19FTlRSWSAtIE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlkpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUGVlckRsc1JlcUFjdGlvbigpIHVzZSBlbnRyeSglZCkgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCQkJaSwgU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOwotCQl9Ci0JfQotCi0JQWN0SGVhZGVySW5pdChwQWQsICZEbHNSc3BIZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0KLQkvLyBCdWlsZCBiYXNpYyBmcmFtZSBmaXJzdAotCWlmIChTdGF0dXNDb2RlID09IE1MTUVfU1VDQ0VTUykKLQl7Ci0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKLQkJCQkJCXNpemVvZihIRUFERVJfODAyXzExKSwJCSZEbHNSc3BIZHIsCi0JCQkJCQkxLAkJCQkJCQkmQ2F0ZWdvcnksCi0JCQkJCQkxLAkJCQkJCQkmQWN0aW9uLAotCQkJCQkJMiwJCQkJCQkJJlN0YXR1c0NvZGUsCi0JCQkJCQk2LAkJCQkJCQlTQSwKLQkJCQkJCTYsCQkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MsCi0JCQkJCQkyLAkJCQkJCQkmcEFkLT5TdGFBY3RpdmUuQ2FwYWJpbGl0eUluZm8sCi0JCQkJCQkxLAkJCQkJCQkmU3VwUmF0ZUllLAotCQkJCQkJMSwJCQkJCQkJJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLAotCQkJCQkJcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCXBBZC0+TWxtZUF1eC5TdXBSYXRlLAotCQkJCQkJRU5EX09GX0FSR1MpOwotCi0JCWlmIChwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiAhPSAwKQotCQl7Ci0JCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCi0JCQkJCQkJICAxLAkJCQkJCSZFeHRSYXRlSWUsCi0JCQkJCQkJICAxLAkJCQkJCSZwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwKLQkJCQkJCQkgIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAlwQWQtPk1sbWVBdXguRXh0UmF0ZSwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJCUZyYW1lTGVuICs9IHRtcDsKLQkJfQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKLQkJewotCQkJVUNIQVIgSHRMZW47Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCQlIVF9DQVBBQklMSVRZX0lFIEh0Q2FwYWJpbGl0eVRtcDsKLSNlbmRpZgotCi0JCQkvLyBhZGQgSFQgQ2FwYWJpbGl0eSBJRQotCQkJSHRMZW4gPSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSk7Ci0jaWZuZGVmIFJUX0JJR19FTkRJQU4KLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwJJnRtcCwKLQkJCQkJCQkJMSwJCQkJCQkmSHRDYXBJZSwKLQkJCQkJCQkJMSwJCQkJCQkmSHRMZW4sCi0JCQkJCQkJCUh0TGVuLAkJCQkJJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkJRU5EX09GX0FSR1MpOwotI2Vsc2UKLQkJCU5kaXNNb3ZlTWVtb3J5KCZIdENhcGFiaWxpdHlUbXAsICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksIEh0TGVuKTsKLQkJCQkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSk7Ci0JCQkJCQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykpOwotCi0JCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCi0JCQkJCQkJCTEsCQkJCQkJJkh0Q2FwSWUsCi0JCQkJCQkJCTEsCQkJCQkJJkh0TGVuLAotCQkJCQkJCQlIdExlbiwJCQkJCSZIdENhcGFiaWxpdHlUbXAsCi0JCQkJCQkJCUVORF9PRl9BUkdTKTsKLSNlbmRpZgotCQkJRnJhbWVMZW4gPSBGcmFtZUxlbiArIHRtcDsKLQkJfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JCWlmIChwRExTICYmIChwRExTLT5TdGF0dXMgIT0gRExTX0ZJTklTSCkpCi0JCXsKLQkJCVJUTVBDYW5jZWxUaW1lcigmcERMUy0+VGltZXIsICZUaW1lckNhbmNlbGxlZCk7Ci0JCQlUaW1lb3V0ID0gRExTX1RJTUVPVVQ7Ci0JCQlSVE1QU2V0VGltZXIoJnBETFMtPlRpbWVyLCBUaW1lb3V0KTsKLQkJfQotCX0KLQllbHNlCi0JewotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCi0JCQkJCQlzaXplb2YoSEVBREVSXzgwMl8xMSksCQkmRGxzUnNwSGRyLAotCQkJCQkJMSwJCQkJCQkJJkNhdGVnb3J5LAotCQkJCQkJMSwJCQkJCQkJJkFjdGlvbiwKLQkJCQkJCTIsCQkJCQkJCSZTdGF0dXNDb2RlLAotCQkJCQkJNiwJCQkJCQkJU0EsCi0JCQkJCQk2LAkJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAotCQkJCQkJRU5EX09GX0FSR1MpOwotCX0KLQotCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFBlZXJEbHNSc3BBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVTSE9SVAkJQ2FwYWJpbGl0eUluZm87Ci0JVUNIQVIJCURBW01BQ19BRERSX0xFTl0sIFNBW01BQ19BRERSX0xFTl07Ci0JVVNIT1JUCQlTdGF0dXNDb2RlOwotCVNIT1JUCQlpOwotCUJPT0xFQU4JCVRpbWVyQ2FuY2VsbGVkOwotCVVDSEFSCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gMDsKLSAgICBVQ0hBUgkJU3VwcG9ydGVkUmF0ZXNMZW47Ci0gICAgVUNIQVIJCVN1cHBvcnRlZFJhdGVzW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUgkJSHRDYXBhYmlsaXR5TGVuOwotCUhUX0NBUEFCSUxJVFlfSUUJSHRDYXBhYmlsaXR5OwotCi0JaWYgKCFwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKLQkJcmV0dXJuOwotCi0JaWYgKCFJTkZSQV9PTihwQWQpKQotCQlyZXR1cm47Ci0KLQlpZiAoIVBlZXJEbHNSc3BTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgREEsIFNBLCAmQ2FwYWJpbGl0eUluZm8sICZTdGF0dXNDb2RlLAotCQkJCQkJCSZTdXBwb3J0ZWRSYXRlc0xlbiwgJlN1cHBvcnRlZFJhdGVzWzBdLCAmSHRDYXBhYmlsaXR5TGVuLCAmSHRDYXBhYmlsaXR5KSkKLQkJcmV0dXJuOwotCi0gICAgLy8gc3VwcG9ydGVkIHJhdGVzIGFycmF5IG1heSBub3QgYmUgc29ydGVkLiBzb3J0IGl0IGFuZCBmaW5kIHRoZSBtYXhpbXVtIHJhdGUKLSAgICBmb3IgKGk9MDsgaTxTdXBwb3J0ZWRSYXRlc0xlbjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPCAoU3VwcG9ydGVkUmF0ZXNbaV0gJiAweDdmKSkKLSAgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSBTdXBwb3J0ZWRSYXRlc1tpXSAmIDB4N2Y7Ci0gICAgfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uKCkgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCB3aXRoIFN0YXR1c0NvZGU9JWQsIENhcGFiaWxpdHlJbmZvPTB4JXhcbiIsCi0JCVNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0sIFN0YXR1c0NvZGUsIENhcGFiaWxpdHlJbmZvKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQotCXsKLQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKFNBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKLQkJewotCQkJaWYgKFN0YXR1c0NvZGUgPT0gTUxNRV9TVUNDRVNTKQotCQkJewotCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OwotCQkJCVVDSEFSIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOwotCi0JCQkJcEVudHJ5ID0gTWFjVGFibGVJbnNlcnREbHNFbnRyeShwQWQsIFNBLCBpKTsKLQotCQkJCXN3aXRjaCAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcykKLQkJCQl7Ci0JCQkJCWNhc2UgMTA4OiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81NDsgICBicmVhazsKLQkJCQkJY2FzZSA5NjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzQ4OyAgIGJyZWFrOwotCQkJCQljYXNlIDcyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMzY7ICAgYnJlYWs7Ci0JCQkJCWNhc2UgNDg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yNDsgICBicmVhazsKLQkJCQkJY2FzZSAzNjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE4OyAgIGJyZWFrOwotCQkJCQljYXNlIDI0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTI7ICAgYnJlYWs7Ci0JCQkJCWNhc2UgMTg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV85OyAgICBicmVhazsKLQkJCQkJY2FzZSAxMjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzY7ICAgIGJyZWFrOwotCQkJCQljYXNlIDIyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7Ci0JCQkJCWNhc2UgMTE6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81XzU7ICBicmVhazsKLQkJCQkJY2FzZSA0OiAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI7ICAgIGJyZWFrOwotCQkJCQljYXNlIDI6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTsgICAgYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKLQkJCQl9Ci0KLQkJCQlwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPSBtaW4ocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlLCBNYXhTdXBwb3J0ZWRSYXRlKTsKLQotCQkJCWlmIChwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkKLQkJCQl7Ci0JCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKLQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOwotCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKLQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOwotCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07Ci0JCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07Ci0JCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07Ci0JCQkJfQotCi0JCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKLQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkJcEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMDsKLQkJCQlwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAwOwotCi0JCQkJLy8gSWYgdGhpcyBFbnRyeSBzdXBwb3J0cyA4MDIuMTFuLCB1cGdyYWRlIHRvIEhUIHJhdGUuCi0JCQkJaWYgKChIdENhcGFiaWxpdHlMZW4gIT0gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCi0JCQkJewotCQkJCQlVQ0hBUglqLCBiaXRtYXNrOyAvL2ssYml0bWFzazsKLQkJCQkJQ0hBUiAgICBpaTsKLQotCQkJCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiRExTIC0gUGVlckRsc1JzcEFjdGlvbiBSZWNlaXZlIFBlZXIgSFQgQ2FwYWJsZSBTVEEgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCQkJCQkJU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOwotCi0JCQkJCWlmICgoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRikgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRikpCi0JCQkJCXsKLQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOwotCQkJCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb25Ob25HRiA9IFRSVUU7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSAxOwotCQkJCQl9Ci0KLQkJCQkJaWYgKChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgpKQotCQkJCQl7Ci0JCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVz0gQldfNDA7Ci0JCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwKSYoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7Ci0JCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwKSYoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApKTsKLQkJCQkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uMjBPbmx5ID0gVFJVRTsKLQkJCQkJfQotCi0JCQkJCS8vIGZpbmQgbWF4IGZpeGVkIHJhdGUKLQkJCQkJZm9yIChpaT0xNTsgaWk+PTA7IGlpLS0pCi0JCQkJCXsKLQkJCQkJCWogPSBpaS84OwotCQkJCQkJYml0bWFzayA9ICgxPDwoaWktKGoqOCkpKTsKLQkJCQkJCWlmICggKHBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm8uTUNTU2V0W2pdJmJpdG1hc2spICYmIChIdENhcGFiaWxpdHkuTUNTU2V0W2pdJmJpdG1hc2spKQotCQkJCQkJewotCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IGlpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJaWYgKGlpPT0wKQotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0KLQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICE9IE1DU19BVVRPKQotCQkJCQl7Ci0JCQkJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPT0gMzIpCi0JCQkJCQl7Ci0JCQkJCQkJLy8gRml4IE1DUyBhcyBIVCBEdXBsaWNhdGVkIE1vZGUKLQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IDE7Ci0JCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7Ci0JCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IDA7Ci0JCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IDA7Ci0JCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gMzI7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPiBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTKQotCQkJCQkJewotCQkJCQkJCS8vIFNUQSBzdXBwb3J0cyBmaXhlZCBNQ1MKLQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQyAmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSk7Ci0JCQkJCXBFbnRyeS0+TXBkdURlbnNpdHkgPSBIdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5OwotCQkJCQlwRW50cnktPk1heFJBbXBkdUZhY3RvciA9IEh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yOwotCQkJCQlwRW50cnktPk1tcHNNb2RlID0gKFVDSEFSKUh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzOwotCQkJCQlwRW50cnktPkFNc2R1U2l6ZSA9IChVQ0hBUilIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZTsKLQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7Ci0KLQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwKQotCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpOwotCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApCi0JCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRSk7Ci0JCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlR4U1RCQykKLQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19UeFNUQkNfQ0FQQUJMRSk7Ci0JCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQykKLQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRSk7Ci0JCQkJCWlmIChIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMpCi0JCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfSFRDX0NBUEFCTEUpOwotCQkJCQlpZiAocEFkLT5Db21tb25DZmcuYlJkZyAmJiBIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlJER1N1cHBvcnQpCi0JCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpOwotCQkJCQlpZiAoSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5NQ1NGZWVkYmFjayA9PSAweDAzKQotCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX01DU0ZFRURCQUNLX0NBUEFCTEUpOwotCi0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPkhUQ2FwYWJpbGl0eSwgJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKLQkJCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7Ci0JCQkJcEVudHJ5LT5DdXJyVHhSYXRlID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOwotCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSk7Ci0KLQkJCQlpZiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gVFJVRSkKLQkJCQl7Ci0JCQkJCVBVQ0hBUiBwVGFibGU7Ci0JCQkJCVVDSEFSIFRhYmxlU2l6ZSA9IDA7Ci0KLQkJCQkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLCAmcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXgpOwotCQkJCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFOwotCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOwotCQkJCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7Ci0KLQkJCQkJUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygoVUNIQVIpcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSwgcEVudHJ5KTsKLQkJCQl9Ci0JCQkJcEVudHJ5LT5SYXRlTGVuID0gU3VwcG9ydGVkUmF0ZXNMZW47Ci0KLQkJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotCQkJCXsKLQkJCQkJLy8gSWYgc3VwcG9ydCBXUEEgb3IgV1BBMiwgc3RhcnQgU1RBS2V5IGhhbmQgc2hha2UsCi0JCQkJCS8vIElmIGZhaWxlZCBoYW5kIHNoYWtlLCBqdXN0IHRlYXIgZG93biBwZWVyIERMUwotCQkJCQlpZiAoUlRNUFNlbmRTVEFLZXlSZXF1ZXN0KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCQkJewotCQkJCQkJTUxNRV9ETFNfUkVRX1NUUlVDVAlNbG1lRGxzUmVxOwotCQkJCQkJVVNIT1JUCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfQ0lQSEVSX05PVF9TVVBQT1JUOwotCi0JCQkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7Ci0JCQkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKLQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOwotCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbiBmYWlsZWQgd2hlbiBjYWxsIFJUTVBTZW5kU1RBS2V5UmVxdWVzdCBcbiIpKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19XQUlUX0tFWTsKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gd2FpdGluZyBmb3IgU1RBS2V5IGhhbmRzaGFrZSBwcm9jZWR1cmVcbiIpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwotCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfRklOSVNIOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24oKSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFN1Y2NlZWQgd2l0aCBXRVAgb3Igbm8gc2VjdXJpdHlcbiIsIFNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0pKTsKLQkJCQl9Ci0KLQkJCQkvL2luaXRpYWxpemUgc2VxIG5vIGZvciBETFMgZnJhbWVzLgotCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlNlcXVlbmNlID0gMDsKLQkJCQlpZiAoSHRDYXBhYmlsaXR5TGVuICE9IDApCi0JCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IFRSVUU7Ci0JCQkJZWxzZQotCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5iSFRDYXAgPSBGQUxTRTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyBETFMgc2V0dXAgcHJvY2VkdXJlIGZhaWxlZC4KLQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKLQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOwotCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uIGZhaWxlZCB3aXRoIFN0YXR1c0NvZGU9JWQgXG4iLCBTdGF0dXNDb2RlKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoaSA+PSBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uKCkgdXBkYXRlIHRpbWVvdXQgdmFsdWUgXG4iKSk7Ci0JCWZvciAoaT0oTUFYX05VTV9PRl9ETFNfRU5UUlktMSk7IGk+PU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGktLSkKLQkJewotCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKFNBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKLQkJCXsKLQkJCQlpZiAoU3RhdHVzQ29kZSA9PSBNTE1FX1NVQ0NFU1MpCi0JCQkJewotCQkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKLQkJCQkJVUNIQVIgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7Ci0KLQkJCQkJcEVudHJ5ID0gTWFjVGFibGVJbnNlcnREbHNFbnRyeShwQWQsIFNBLCBpKTsKLQotCQkJCQlzd2l0Y2ggKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMpCi0JCQkJCXsKLQkJCQkJCWNhc2UgMTA4OiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81NDsgICBicmVhazsKLQkJCQkJCWNhc2UgOTY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV80ODsgICBicmVhazsKLQkJCQkJCWNhc2UgNzI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8zNjsgICBicmVhazsKLQkJCQkJCWNhc2UgNDg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yNDsgICBicmVhazsKLQkJCQkJCWNhc2UgMzY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xODsgICBicmVhazsKLQkJCQkJCWNhc2UgMjQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMjsgICBicmVhazsKLQkJCQkJCWNhc2UgMTg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV85OyAgICBicmVhazsKLQkJCQkJCWNhc2UgMTI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV82OyAgICBicmVhazsKLQkJCQkJCWNhc2UgMjI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKLQkJCQkJCWNhc2UgMTE6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81XzU7ICBicmVhazsKLQkJCQkJCWNhc2UgNDogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yOyAgICBicmVhazsKLQkJCQkJCWNhc2UgMjogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xOyAgICBicmVhazsKLQkJCQkJCWRlZmF1bHQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKLQkJCQkJfQotCi0JCQkJCXBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA9IG1pbihwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUsIE1heFN1cHBvcnRlZFJhdGUpOwotCi0JCQkJCWlmIChwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkKLQkJCQkJewotCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOwotCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOwotCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOwotCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOwotCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOwotCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07Ci0JCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKLQkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOwotCQkJCQl9Ci0KLQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKLQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJCQlwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAwOwotCQkJCQlwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAwOwotCi0JCQkJCS8vIElmIHRoaXMgRW50cnkgc3VwcG9ydHMgODAyLjExbiwgdXBncmFkZSB0byBIVCByYXRlLgotCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKLQkJCQkJewotCQkJCQkJVUNIQVIJaiwgYml0bWFzazsgLy9rLGJpdG1hc2s7Ci0JCQkJCQlDSEFSICAgIGlpOwotCi0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uIFJlY2VpdmUgUGVlciBIVCBDYXBhYmxlIFNUQSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQkJCQkJCQkJU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOwotCi0JCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uR0YpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YpKQotCQkJCQkJewotCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKLQkJCQkJCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbk5vbkdGID0gVFJVRTsKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSAxOwotCQkJCQkJfQotCi0JCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCkpCi0JCQkJCQl7Ci0JCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlc9IEJXXzQwOwotCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDApJihIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCkpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7Ci0JCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9ICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCkmKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwKSk7Ci0JCQkJCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb24yME9ubHkgPSBUUlVFOwotCQkJCQkJfQotCi0JCQkJCQkvLyBmaW5kIG1heCBmaXhlZCByYXRlCi0JCQkJCQlmb3IgKGlpPTE1OyBpaT49MDsgaWktLSkKLQkJCQkJCXsKLQkJCQkJCQlqID0gaWkvODsKLQkJCQkJCQliaXRtYXNrID0gKDE8PChpaS0oaio4KSkpOwotCQkJCQkJCWlmICggKHBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm8uTUNTU2V0W2pdJmJpdG1hc2spICYmIChIdENhcGFiaWxpdHkuTUNTU2V0W2pdJmJpdG1hc2spKQotCQkJCQkJCXsKLQkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gaWk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoaWk9PTApCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCi0JCQkJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgIT0gTUNTX0FVVE8pCi0JCQkJCQl7Ci0JCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIkBAQCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gJWRcbiIsCi0JCQkJCQkJCQkJCQkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MpKTsKLQkJCQkJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPT0gMzIpCi0JCQkJCQkJewotCQkJCQkJCQkvLyBGaXggTUNTIGFzIEhUIER1cGxpY2F0ZWQgTW9kZQotCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IDE7Ci0JCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOwotCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TVEJDID0gMDsKLQkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IDA7Ci0JCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IDMyOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmIChwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPiBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTKQotCQkJCQkJCXsKLQkJCQkJCQkJLy8gU1RBIHN1cHBvcnRzIGZpeGVkIE1DUwotCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQyAmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSk7Ci0JCQkJCQlwRW50cnktPk1wZHVEZW5zaXR5ID0gSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKLQkJCQkJCXBFbnRyeS0+TWF4UkFtcGR1RmFjdG9yID0gSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3I7Ci0JCQkJCQlwRW50cnktPk1tcHNNb2RlID0gKFVDSEFSKUh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzOwotCQkJCQkJcEVudHJ5LT5BTXNkdVNpemUgPSAoVUNIQVIpSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemU7Ci0JCQkJCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKLQotCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwKQotCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFKTsKLQkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCkKLQkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRSk7Ci0JCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5UeFNUQkMpCi0JCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1R4U1RCQ19DQVBBQkxFKTsKLQkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQykKLQkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUnhTVEJDX0NBUEFCTEUpOwotCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQykKLQkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfSFRDX0NBUEFCTEUpOwotCQkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgJiYgSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0KQotCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7Ci0JCQkJCQlpZiAoSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5NQ1NGZWVkYmFjayA9PSAweDAzKQotCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19NQ1NGRUVEQkFDS19DQVBBQkxFKTsKLQotCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+SFRDYXBhYmlsaXR5LCAmSHRDYXBhYmlsaXR5LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOwotCQkJCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7Ci0JCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZSA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKLQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKLQotCQkJCQlpZiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gVFJVRSkKLQkJCQkJewotCQkJCQkJUFVDSEFSIHBUYWJsZTsKLQkJCQkJCVVDSEFSIFRhYmxlU2l6ZSA9IDA7Ci0KLQkJCQkJCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsIHBFbnRyeSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJnBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KTsKLQkJCQkJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFOwotCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKLQkJCQkJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKLQotCQkJCQkJUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygoVUNIQVIpcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSwgcEVudHJ5KTsKLQkJCQkJfQotCQkJCQlwRW50cnktPlJhdGVMZW4gPSBTdXBwb3J0ZWRSYXRlc0xlbjsKLQotCQkJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotCQkJCQl7Ci0JCQkJCQkvLyBJZiBzdXBwb3J0IFdQQSBvciBXUEEyLCBzdGFydCBTVEFLZXkgaGFuZCBzaGFrZSwKLQkJCQkJCS8vIElmIGZhaWxlZCBoYW5kIHNoYWtlLCBqdXN0IHRlYXIgZG93biBwZWVyIERMUwotCQkJCQkJaWYgKFJUTVBTZW5kU1RBS2V5UmVxdWVzdChwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCQkJCQl7Ci0JCQkJCQkJTUxNRV9ETFNfUkVRX1NUUlVDVAlNbG1lRGxzUmVxOwotCQkJCQkJCVVTSE9SVAkJCQlyZWFzb24gPSBSRUFTT05fUU9TX0NJUEhFUl9OT1RfU1VQUE9SVDsKLQotCQkJCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKLQkJCQkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKLQkJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKLQkJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOwotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbiBmYWlsZWQgd2hlbiBjYWxsIFJUTVBTZW5kU1RBS2V5UmVxdWVzdCBcbiIpKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfV0FJVF9LRVk7Ci0JCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSB3YWl0aW5nIGZvciBTVEFLZXkgaGFuZHNoYWtlIHByb2NlZHVyZVxuIikpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19GSU5JU0g7Ci0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24oKSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFN1Y2NlZWQgd2l0aCBXRVAgb3Igbm8gc2VjdXJpdHlcbiIsIFNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0pKTsKLQkJCQkJfQotCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TZXF1ZW5jZSA9IDA7Ci0JCQkJCWlmIChIdENhcGFiaWxpdHlMZW4gIT0gMCkKLQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IFRSVUU7Ci0JCQkJCWVsc2UKLQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IEZBTFNFOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkvLyBETFMgc2V0dXAgcHJvY2VkdXJlIGZhaWxlZC4KLQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7Ci0JCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7Ci0JCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbiBmYWlsZWQgd2l0aCBTdGF0dXNDb2RlPSVkIFxuIiwgU3RhdHVzQ29kZSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIE1sbWVEbHNUZWFyRG93bkFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7Ci0JTkRJU19TVEFUVVMJCU5TdGF0dXM7Ci0JVUxPTkcJCQlGcmFtZUxlbiA9IDA7Ci0JVUNIQVIJCQlDYXRlZ29yeSA9IENBVEVHT1JZX0RMUzsKLQlVQ0hBUgkJCUFjdGlvbiA9IEFDVElPTl9ETFNfVEVBUkRPV047Ci0JVVNIT1JUCQkJUmVhc29uQ29kZSA9IFJFQVNPTl9RT1NfVU5TUEVDSUZZOwotCUhFQURFUl84MDJfMTEJRGxzVGVhckRvd25IZHI7Ci0JUFJUXzgwMl8xMV9ETFMJcERMUzsKLQlCT09MRUFOCQkJVGltZXJDYW5jZWxsZWQ7Ci0JVUNIQVIJCQlpOwotCi0JaWYoIU1sbWVEbHNSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJnBETFMsICZSZWFzb25Db2RlKSkKLQkJcmV0dXJuOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBNbG1lRGxzVGVhckRvd25BY3Rpb24oKSB3aXRoIFJlYXNvbkNvZGU9JWQgXG4iLCBSZWFzb25Db2RlKSk7Ci0KLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkRMUyAtIE1sbWVEbHNUZWFyRG93bkFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlBY3RIZWFkZXJJbml0KHBBZCwgJkRsc1RlYXJEb3duSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCi0JLy8gQnVpbGQgYmFzaWMgZnJhbWUgZmlyc3QKLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCi0JCQkJCXNpemVvZihIRUFERVJfODAyXzExKSwJCSZEbHNUZWFyRG93bkhkciwKLQkJCQkJMSwJCQkJCQkJJkNhdGVnb3J5LAotCQkJCQkxLAkJCQkJCQkmQWN0aW9uLAotCQkJCQk2LAkJCQkJCQkmcERMUy0+TWFjQWRkciwKLQkJCQkJNiwJCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcywKLQkJCQkJMiwJCQkJCQkJJlJlYXNvbkNvZGUsCi0JCQkJCUVORF9PRl9BUkdTKTsKLQotCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQlSVE1QQ2FuY2VsVGltZXIoJnBETFMtPlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwotCi0JLy8gUmVtb3ZlIGtleSBpbiBsb2NhbCBkbHMgdGFibGUgZW50cnkKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQotCXsKLQkJaWYgKE1BQ19BRERSX0VRVUFMKHBETFMtPk1hY0FkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQotCQl7Ci0JCQlNYWNUYWJsZURlbGV0ZURsc0VudHJ5KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKLQkJfQotCX0KLQotCS8vIGNsZWFyIHBlZXIgZGxzIHRhYmxlIGVudHJ5Ci0JZm9yIChpID0gTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSA8IE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCi0JewotCQlpZiAoTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCi0JCXsKLQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOwotCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKLQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7Ci0JCQlNYWNUYWJsZURlbGV0ZURsc0VudHJ5KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKLQkJfQotCX0KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFBlZXJEbHNUZWFyRG93bkFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVUNIQVIJCQlEQVtNQUNfQUREUl9MRU5dLCBTQVtNQUNfQUREUl9MRU5dOwotCVVTSE9SVAkJCVJlYXNvbkNvZGU7Ci0JVUlOVAkJCWk7Ci0JQk9PTEVBTgkJCVRpbWVyQ2FuY2VsbGVkOwotCi0JaWYgKCFwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKLQkJcmV0dXJuOwotCi0JaWYgKCFJTkZSQV9PTihwQWQpKQotCQlyZXR1cm47Ci0KLQlpZiAoIVBlZXJEbHNUZWFyRG93blNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBEQSwgU0EsICZSZWFzb25Db2RlKSkKLQkJcmV0dXJuOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzVGVhckRvd25BY3Rpb24oKSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IHdpdGggUmVhc29uQ29kZT0lZFxuIiwgU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSwgUmVhc29uQ29kZSkpOwotCi0JLy8gY2xlYXIgbG9jYWwgZGxzIHRhYmxlIGVudHJ5Ci0JZm9yIChpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQotCXsKLQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKFNBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKLQkJewotCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7Ci0JCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOwotCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQkJCS8vQXNpY0RlbFdjaWRUYWIocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQpOwotCQkJLy9Bc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShwQWQsIEJTUzAsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCk7Ci0JCQlNYWNUYWJsZURlbGV0ZURsc0VudHJ5KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKLQkJfQotCX0KLQotCS8vIGNsZWFyIHBlZXIgZGxzIHRhYmxlIGVudHJ5Ci0JZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKLQl7Ci0JCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiBNQUNfQUREUl9FUVVBTChTQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCi0JCXsKLQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOwotCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKLQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7Ci0JCQkvL0FzaWNEZWxXY2lkVGFiKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lEKTsKLQkJCS8vQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkLCBCU1MwLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQpOwotCQkJTWFjVGFibGVEZWxldGVEbHNFbnRyeShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBSVE1QQ2hlY2tETFNUaW1lT3V0KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotCVVMT05HCQkJCWk7Ci0JTUxNRV9ETFNfUkVRX1NUUlVDVAlNbG1lRGxzUmVxOwotCVVTSE9SVAkJCQlyZWFzb24gPSBSRUFTT05fUU9TX1VOU1BFQ0lGWTsKLQotCWlmICghIHBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQotCQlyZXR1cm47Ci0KLQlpZiAoISBJTkZSQV9PTihwQWQpKQotCQlyZXR1cm47Ci0KLQkvLyBJZiB0aW1lb3V0IHZhbHVlIGlzIGVxdWFsZWQgdG8gemVybywgaXQgbWVhbnMgYWx3YXlzIG5vdCBiZSB0aW1lb3V0LgotCi0JLy8gdXBkYXRlIGxvY2FsIGRscyB0YWJsZSBlbnRyeQotCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKLQl7Ci0JCWlmICgocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQpICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkKLQkJCSYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0ICE9IDApKQotCQl7Ci0JCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciAtLTsKLQotCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyID09IDApCi0JCQl7Ci0JCQkJcmVhc29uID0gUkVBU09OX1FPU19SRVFVRVNUX1RJTUVPVVQ7Ci0JCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKLQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKLQkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7Ci0JCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyB1cGRhdGUgcGVlciBkbHMgdGFibGUgZW50cnkKLQlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQotCXsKLQkJaWYgKChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCkgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKQotCQkJJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQgIT0gMCkpCi0JCXsKLQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyIC0tOwotCi0JCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPT0gMCkKLQkJCXsKLQkJCQlyZWFzb24gPSBSRUFTT05fUU9TX1JFUVVFU1RfVElNRU9VVDsKLQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOwotCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOwotCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKLQkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIFJUTVBSY3ZGcmFtZURMU0NoZWNrKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFBIRUFERVJfODAyXzExCXBIZWFkZXIsCi0JSU4gVUxPTkcJCQlMZW4sCi0JSU4gUFJUMjhYWF9SWERfU1RSVUMJcFJ4RCkKLXsKLQlVTE9ORwkJCWk7Ci0JQk9PTEVBTgkJCWJGaW5kRW50cnkgPSBGQUxTRTsKLQlCT09MRUFOCQkJYlNUQUtleUZyYW1lID0gRkFMU0U7Ci0JUEVBUE9MX1BBQ0tFVAlwRWFwOwotCVBVQ0hBUgkJCXBQcm90bywgcEFkZHIgPSBOVUxMOwotCVBVQ0hBUgkJCXBTVEFLZXkgPSBOVUxMOwotCVVDSEFSCQkJWmVyb1JlcGxheVtMRU5fS0VZX0RFU0NfUkVQTEFZXTsKLQlVQ0hBUgkJCU1pY1sxNl0sIE9sZE1pY1sxNl07Ci0JVUNIQVIJCQlkaWdlc3RbODBdOwotCVVDSEFSCQkJRGxzUFRLWzgwXTsKLQlVQ0hBUgkJCXRlbXBbNjRdOwotCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKLQlDSVBIRVJfS0VZCQlQYWlyd2lzZUtleTsKLQotCi0JaWYgKCEgcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCi0JCXJldHVybiBiU1RBS2V5RnJhbWU7Ci0KLQlpZiAoISBJTkZSQV9PTihwQWQpKQotCQlyZXR1cm4gYlNUQUtleUZyYW1lOwotCi0JaWYgKExlbiA8IExFTkdUSF84MDJfMTEgKyA2ICsgMikgLyogTEVOR1RIXzgwMl8xMSArIExMQyArIEVBUE9MIHByb3RvY29sIHR5cGUgKi8KLQkJcmV0dXJuIGJTVEFLZXlGcmFtZTsKLQotCXBQcm90bwk9IChQVUNIQVIpcEhlYWRlciArIExFTkdUSF84MDJfMTE7Ci0KLQlpZiAoKHBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA4KSkKLQkJcFByb3RvCSs9IDI7CS8qIFFPUyBDb250cm9sIGZpZWxkICovCi0KLSAgICAgLyogU2tpcCA0LWJ5dGVzIGZvciBIVEMgKi8KLSAgICAgaWYgKHBIZWFkZXItPkZDLk9yZGVyICYmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpKSkKLSAgICAgewotICAgICAgICAgIHBQcm90byArPSA0OwotICAgICB9Ci0KLQkvKiBMMlBBRCBiaXQgb24gd2lsbCBwYWQgMiBieXRlcyBhdCBMTEMgKi8KLQlpZiAocFJ4RC0+TDJQQUQpCi0JewotCQlwUHJvdG8gKz0gMjsKLQl9Ci0KLQlwUHJvdG8JKz0gNjsJLyogMHhBQSAweEFBIDB4QUEgMHgwMCAweDAwIDB4MDAgKi8KLQotCWlmICgoIShwSGVhZGVyLT5GQy5TdWJUeXBlICYgMHgwOCkpICYmICghUlRNUEVxdWFsTWVtb3J5KEVBUE9MLCBwUHJvdG8sIDIpKSkKLQkJcmV0dXJuIGJTVEFLZXlGcmFtZTsKLQotCXBBZGRyCT0gcEhlYWRlci0+QWRkcjI7Ci0KLQlpZiAoUlRNUEVxdWFsTWVtb3J5KEVBUE9MLCBwUHJvdG8sIDIpICYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSAgTmRpczgwMl8xMUF1dGhNb2RlV1BBKSkKLQl7Ci0JCXBFYXAgPSAoUEVBUE9MX1BBQ0tFVCkgKHBQcm90byArIDIpOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gU25pZmYgTGVuPSVsZCwgRGF0YUxlbj0lZCwgS2V5TWljPSVkLCBJbnN0YWxsPSVkLCBLZXlBY2s9JWQsIFNlY3VyZT0lZCwgRUtEX0RMPSVkLCBFcnJvcj0lZCwgUmVxdWVzdD0lZFxuIiwgTGVuLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMRU5HVEhfODAyXzExICsgNiArIDIgKyAyICsgc2l6ZW9mKEVBUE9MX1BBQ0tFVCkgLSBNQVhfTEVOX09GX1JTTklFICsgMTYpLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFYXAtPktleURlc2MuS2V5SW5mby5LZXlNaWMsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLkluc3RhbGwsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLktleUFjaywKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWFwLT5LZXlEZXNjLktleUluZm8uU2VjdXJlLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFYXAtPktleURlc2MuS2V5SW5mby5FS0RfREwsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLkVycm9yLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFYXAtPktleURlc2MuS2V5SW5mby5SZXF1ZXN0KSk7Ci0KLQkJaWYgKChMZW4gPj0gKExFTkdUSF84MDJfMTEgKyA2ICsgMiArIDIgKyBzaXplb2YoRUFQT0xfUEFDS0VUKSAtIE1BWF9MRU5fT0ZfUlNOSUUgKyAxNikpICYmIHBFYXAtPktleURlc2MuS2V5SW5mby5LZXlNaWMKLQkJCSYmIHBFYXAtPktleURlc2MuS2V5SW5mby5JbnN0YWxsICYmIHBFYXAtPktleURlc2MuS2V5SW5mby5LZXlBY2sgJiYgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLlNlY3VyZQotCQkJJiYgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLkVLRF9ETCAmJiAhcEVhcC0+S2V5RGVzYy5LZXlJbmZvLkVycm9yICYmICFwRWFwLT5LZXlEZXNjLktleUluZm8uUmVxdWVzdCkKLQkJewotCQkJLy8gRmlyc3QgdmFsaWRhdGUgcmVwbGF5IGNvdW50ZXIsIG9ubHkgYWNjZXB0IG1lc3NhZ2Ugd2l0aCBsYXJnZXIgcmVwbGF5IGNvdW50ZXIKLQkJCS8vIExldCBlcXVhbCBwYXNzLCBzb21lIEFQIHN0YXJ0IHdpdGggYWxsIHplcm8gcmVwbGF5IGNvdW50ZXIKLQkJCU5kaXNaZXJvTWVtb3J5KFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpOwotCQkJaWYgKChSVE1QQ29tcGFyZU1lbW9yeShwRWFwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDEpICYmCi0JCQkJKFJUTVBDb21wYXJlTWVtb3J5KHBFYXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgWmVyb1JlcGxheSwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMCkpCi0JCQkJcmV0dXJuIGJTVEFLZXlGcmFtZTsKLQotCQkJLy9SVE1QTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBwRWFwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOwotCQkJUlRNUE1vdmVNZW1vcnkocEFkLT5TdGFDZmcuRGxzUmVwbGF5Q291bnRlciwgcEVhcC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gU25pZmYgcmVwbGF5IGNvdW50ZXIgKCUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeCkgTGVuPSVsZCwgS2V5RGF0YUxlbj0lZFxuIiwKLQkJCQlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzBdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzFdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzJdLAotCQkJCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbM10sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbNF0sCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbNV0sCi0JCQkJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls2XSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls3XSwgTGVuLCBwRWFwLT5LZXlEZXNjLktleURhdGFbMV0pKTsKLQotCQkJLy8gcHV0IHRoZXNlIGNvZGUgc2VnbWVudCB0byBnZXQgdGhlIHJlcGxheSBjb3VudGVyCi0JCQlpZiAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKQotCQkJCXJldHVybiBiU1RBS2V5RnJhbWU7Ci0KLQkJCS8vIENoZWNrIE1JQyB2YWx1ZQotCQkJLy8gU2F2ZSB0aGUgTUlDIGFuZCByZXBsYWNlIHdpdGggemVybwotCQkJLy8gdXNlIHByb3ByaWV0YXJ5IFBUSwotCQkJTmRpc1plcm9NZW1vcnkodGVtcCwgNjQpOwotCQkJTmRpc01vdmVNZW1vcnkodGVtcCwgIklFRUU4MDIuMTEgV0lSRUxFU1MgQUNDRVNTIFBPSU5UIiwgMzIpOwotCQkJV3BhRGVyaXZlUFRLKHBBZCwgdGVtcCwgdGVtcCwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHRlbXAsIHBBZC0+Q3VycmVudEFkZHJlc3MsIERsc1BUSywgTEVOX1BUSyk7Ci0KLQkJCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcEVhcC0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOwotCQkJTmRpc1plcm9NZW1vcnkocEVhcC0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOwotCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCQkJewotCQkJCS8vIEFFUwotCQkJCUhNQUNfU0hBMShEbHNQVEssIExFTl9FQVBfTUlDSywgKFBVQ0hBUikgcEVhcCwgcEVhcC0+Qm9keV9MZW5bMV0gKyA0LCBkaWdlc3QsIFNIQTFfRElHRVNUX1NJWkUpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KE1pYywJZGlnZXN0LAlMRU5fS0VZX0RFU0NfTUlDKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlITUFDX01ENShEbHNQVEssIExFTl9FQVBfTUlDSywgKFBVQ0hBUikgcEVhcCwgcEVhcC0+Qm9keV9MZW5bMV0gKyA0LCBNaWMsIE1ENV9ESUdFU1RfU0laRSk7Ci0JCQl9Ci0KLQkJCWlmICghTmRpc0VxdWFsTWVtb3J5KE9sZE1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKSkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNSUMgRGlmZmVyZW50IGluIE1zZzEgb2YgU1RBS2V5IGhhbmRzaGFrZSEgXG4iKSk7Ci0JCQkJcmV0dXJuIGJTVEFLZXlGcmFtZTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNSUMgVkFMSUQgaW4gTXNnMSBvZiBTVEFLZXkgaGFuZHNoYWtlISBcbiIpKTsKLQkJCWlmICgocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzBdID09IDB4REQpICYmIChwRWFwLT5LZXlEZXNjLktleURhdGFbMl0gPT0gMHgwMCkgJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVszXSA9PSAweDBDKQotCQkJCSYmIChwRWFwLT5LZXlEZXNjLktleURhdGFbNF0gPT0gMHg0MykgJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVs1XSA9PSAweDAyKSkKLQkJCXsKLQkJCQlwQWRkcgkJCT0gcEVhcC0+S2V5RGVzYy5LZXlEYXRhICsgODsJCS8vIFRwZSgxKSwgTGVuKDEpLCBPVUkoMyksIERhdGFUeXBlKDEpLCBSZXNlcnZlZCgyKQotCQkJCXBTVEFLZXkJCQk9IHBFYXAtPktleURlc2MuS2V5RGF0YSArIDE0OwkvLyBUcGUoMSksIExlbigxKSwgT1VJKDMpLCBEYXRhVHlwZSgxKSwgUmVzZXJ2ZWQoMiksIFNUQUtleV9NYWNfQWRkcig2KQotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBSZWNlaXZlIFNUQUtleSBNZXNzYWdlLTEgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBMZW49JWxkLCBLZXlEYXRhTGVuPSVkXG4iLAotCQkJCQlwQWRkclswXSwgcEFkZHJbMV0sIHBBZGRyWzJdLCBwQWRkclszXSwgcEFkZHJbNF0sIHBBZGRyWzVdLCBMZW4sIHBFYXAtPktleURlc2MuS2V5RGF0YVsxXSkpOwotCi0JCQkJYlNUQUtleUZyYW1lID0gVFJVRTsKLQkJCX0KLQotCQl9Ci0JCWVsc2UgaWYgKExlbiA+PSAoTEVOR1RIXzgwMl8xMSArIDYgKyAyICsgMiArIHNpemVvZihFQVBPTF9QQUNLRVQpIC0gTUFYX0xFTl9PRl9SU05JRSkpCi0JCXsKLQkJCVJUTVBNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkRsc1JlcGxheUNvdW50ZXIsIHBFYXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFNuaWZmIHJlcGxheSBjb3VudGVyIDIoJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4KSBMZW49JWxkLCBLZXlEYXRhTGVuPSVkXG4iLAotCQkJCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbMF0sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbMV0sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbMl0sCi0JCQkJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclszXSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls0XSwJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls1XSwKLQkJCQlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzZdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzddLCBMZW4sIHBFYXAtPktleURlc2MuS2V5RGF0YVsxXSkpOwotCQl9Ci0JfQotCi0JLy8gSWYgdGltZW91dCB2YWx1ZSBpcyBlcXVhbGVkIHRvIHplcm8sIGl0IG1lYW5zIGFsd2F5cyBub3QgYmUgdGltZW91dC4KLQkvLyB1cGRhdGUgbG9jYWwgZGxzIHRhYmxlIGVudHJ5Ci0JZm9yIChpPSAwOyBpIDwgTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQotCXsKLQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKHBBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKLQkJewotCQkJaWYgKGJTVEFLZXlGcmFtZSkKLQkJCXsKLQkJCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeTsKLQotCQkJCS8vIFNUQUtleSBmcmFtZSwgYWRkIHBhaXJ3aXNlIGtleSB0YWJsZQotCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19GSU5JU0g7Ci0JCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQotCQkJCVBhaXJ3aXNlS2V5LktleUxlbiA9IExFTl9US0lQX0VLOwotCQkJCU5kaXNNb3ZlTWVtb3J5KFBhaXJ3aXNlS2V5LktleSwgJnBTVEFLZXlbMF0sIExFTl9US0lQX0VLKTsKLQkJCQlOZGlzTW92ZU1lbW9yeShQYWlyd2lzZUtleS5UeE1pYywgJnBTVEFLZXlbMTZdLCBMRU5fVEtJUF9SWE1JQ0spOwotCQkJCU5kaXNNb3ZlTWVtb3J5KFBhaXJ3aXNlS2V5LlJ4TWljLCAmcFNUQUtleVsyNF0sIExFTl9US0lQX1RYTUlDSyk7Ci0KLQkJCQkvL1BhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnOwotCQkJCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCi0JCQkJCVBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9US0lQOwotCQkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQkJCQkJUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKLQotCQkJCXBFbnRyeSA9IERsc0VudHJ5VGFibGVMb29rdXAocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyLCBUUlVFKTsKLQkJCQkvL0FzaWNBZGRLZXlFbnRyeShwQWQsIChVU0hPUlQpKGkgKyAyKSwgQlNTMCwgMCwgJlBhaXJ3aXNlS2V5LCBUUlVFLCBUUlVFKTsJLy8gcmVzZXJ2ZSAwIGZvciBtdWx0aWNhc3QsIDEgZm9yIHVuaWNhc3QKLQkJCQkvL0FzaWNVcGRhdGVSeFdDSURUYWJsZShwQWQsIChVU0hPUlQpKGkgKyAyKSwgcEFkZHIpOwotCQkJCS8vIEFkZCBQYWlyLXdpc2Uga2V5IHRvIEFzaWMKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJCQlBc2ljQWRkUGFpcndpc2VLZXlFbnRyeShwQWQsCi0JCQkJCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkciwKLQkJCQkJCQkJCQkoVUNIQVIpcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELAotCQkJCQkJCQkJCSZQYWlyd2lzZUtleSk7Ci0KLQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKLQkJCQkJCQkJCQkgIEJTUzAsCi0JCQkJCQkJCQkJICAwLAotCQkJCQkJCQkJCSAgUGFpcndpc2VLZXkuQ2lwaGVyQWxnLAotCQkJCQkJCQkJCSAgcEVudHJ5KTsKLQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPlBhaXJ3aXNlS2V5LCAmUGFpcndpc2VLZXksIHNpemVvZihDSVBIRVJfS0VZKSk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBSZWNlaXZlIFNUQUtleSBNZXNzYWdlLTEgKFBlZXIgU1RBIE1BQyBBZGRyZXNzIFNUQUtleSkgXG4iKSk7Ci0KLQkJCQlSVE1QU2VuZFNUQUtleUhhbmRTaGFrZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOwotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBGaW5pc2ggU1RBS2V5IGhhbmRzaGFrZSBwcm9jZWR1cmUgKEluaXRpYXRvciBzaWRlKVxuIikpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vIERhdGEgZnJhbWUsIHVwZGF0ZSB0aW1lb3V0IHZhbHVlCi0JCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKQotCQkJCXsKLQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPSBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0OwotCQkJCQkvL0FzaWNVcGRhdGVSeFdDSURUYWJsZShwQWQsIChVU0hPUlQpKGkgKyAyKSwgcEFkZHIpOwotCQkJCX0KLQkJCX0KLQotCQkJYkZpbmRFbnRyeSA9IFRSVUU7Ci0JCX0KLQl9Ci0KLQkvLyB1cGRhdGUgcGVlciBkbHMgdGFibGUgZW50cnkKLQlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQotCXsKLQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKHBBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKLQkJewotCQkJaWYgKGJTVEFLZXlGcmFtZSkKLQkJCXsKLQkJCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9IE5VTEw7Ci0KLQkJCQkvLyBTVEFLZXkgZnJhbWUsIGFkZCBwYWlyd2lzZSBrZXkgdGFibGUsIGFuZCBzZW5kIFNUQWtleSBNc2ctMgotCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19GSU5JU0g7Ci0JCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQotCQkJCVBhaXJ3aXNlS2V5LktleUxlbiA9IExFTl9US0lQX0VLOwotCQkJCU5kaXNNb3ZlTWVtb3J5KFBhaXJ3aXNlS2V5LktleSwgJnBTVEFLZXlbMF0sIExFTl9US0lQX0VLKTsKLQkJCQlOZGlzTW92ZU1lbW9yeShQYWlyd2lzZUtleS5UeE1pYywgJnBTVEFLZXlbMTZdLCBMRU5fVEtJUF9SWE1JQ0spOwotCQkJCU5kaXNNb3ZlTWVtb3J5KFBhaXJ3aXNlS2V5LlJ4TWljLCAmcFNUQUtleVsyNF0sIExFTl9US0lQX1RYTUlDSyk7Ci0KLQkJCQkvL1BhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnOwotCQkJCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCi0JCQkJCVBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9US0lQOwotCQkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQkJCQkJUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKLQotCQkJCXBFbnRyeSA9IERsc0VudHJ5VGFibGVMb29rdXAocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyLCBUUlVFKTsKLQkJCQkvL0FzaWNBZGRLZXlFbnRyeShwQWQsIChVU0hPUlQpKGkgKyAyKSwgQlNTMCwgMCwgJlBhaXJ3aXNlS2V5LCBUUlVFLCBUUlVFKTsJLy8gcmVzZXJ2ZSAwIGZvciBtdWx0aWNhc3QsIDEgZm9yIHVuaWNhc3QKLQkJCQkvL0FzaWNVcGRhdGVSeFdDSURUYWJsZShwQWQsIChVU0hPUlQpKGkgKyAyKSwgcEFkZHIpOwotCQkJCS8vIEFkZCBQYWlyLXdpc2Uga2V5IHRvIEFzaWMKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnkocEFkLAotCQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIsCi0JCQkJCQkJCQkJKFVDSEFSKXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCwKLQkJCQkJCQkJCQkmUGFpcndpc2VLZXkpOwotCi0JCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCi0JCQkJCQkJCQkJICBCU1MwLAotCQkJCQkJCQkJCSAgMCwKLQkJCQkJCQkJCQkgIFBhaXJ3aXNlS2V5LkNpcGhlckFsZywKLQkJCQkJCQkJCQkgIHBFbnRyeSk7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JCQkJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+UGFpcndpc2VLZXksICZQYWlyd2lzZUtleSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFJlY2VpdmUgU1RBS2V5IE1lc3NhZ2UtMSAoSW5pdGlhdG9yIFNUQSBNQUMgQWRkcmVzcyBTVEFLZXkpXG4iKSk7Ci0KLQkJCQkvLyBJZiBzdXBwb3J0IFdQQSBvciBXUEEyLCBzdGFydCBTVEFLZXkgaGFuZCBzaGFrZSwKLQkJCQkvLyBJZiBmYWlsZWQgaGFuZCBzaGFrZSwganVzdCB0ZWFyIGRvd24gcGVlciBETFMKLQkJCQlpZiAoUlRNUFNlbmRTVEFLZXlIYW5kU2hha2UocEFkLCBwQWRkcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCQl7Ci0JCQkJCU1MTUVfRExTX1JFUV9TVFJVQ1QJTWxtZURsc1JlcTsKLQkJCQkJVVNIT1JUCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfQ0lQSEVSX05PVF9TVVBQT1JUOwotCi0JCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7Ci0JCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOwotCQkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7Ci0JCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIEZpbmlzaCBTVEFLZXkgaGFuZHNoYWtlIHByb2NlZHVyZSAoUGVlciBzaWRlKVxuIikpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyBEYXRhIGZyYW1lLCB1cGRhdGUgdGltZW91dCB2YWx1ZQotCQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkKLQkJCQl7Ci0JCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyID0gcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWJGaW5kRW50cnkgPSBUUlVFOwotCQl9Ci0JfQotCi0KLQlyZXR1cm4gYlNUQUtleUZyYW1lOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJQ2hlY2sgaWYgdGhlIGZyYW1lIGNhbiBiZSBzZW50IHRocm91Z2ggRExTIGRpcmVjdCBsaW5rIGludGVyZmFjZQotCi0JQXJndW1lbnRzOgotCQlwQWQJCVBvaW50ZXIJdG8gYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlETFMgZW50cnkgaW5kZXgKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJUlRNUENoZWNrRExTRnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwREEpCi17Ci0JSU5UIHJ2YWwgPSAtMTsKLQlJTlQJaTsKLQotCWlmICghcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCi0JCXJldHVybiBydmFsOwotCi0JaWYgKCFJTkZSQV9PTihwQWQpKQotCQlyZXR1cm4gcnZhbDsKLQotCWRvewotCQkvLyBjaGVjayBsb2NhbCBkbHMgdGFibGUgZW50cnkKLQkJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQotCQl7Ci0JCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSAmJgotCQkJCU1BQ19BRERSX0VRVUFMKHBEQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCi0JCQl7Ci0JCQkJcnZhbCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGVjayBwZWVyIGRscyB0YWJsZSBlbnRyeQotCQlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQotCQl7Ci0JCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSAmJgotCQkJCU1BQ19BRERSX0VRVUFMKHBEQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCi0JCQl7Ci0JCQkJcnZhbCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9IHdoaWxlIChGQUxTRSk7Ci0KLQlyZXR1cm4gcnZhbDsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFJUTVBTZW5kRExTVGVhckRvd25GcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEQSkKLXsKLQlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUwkJTlN0YXR1czsKLQlIRUFERVJfODAyXzExCURsc1RlYXJEb3duSGRyOwotCVVMT05HCQkJRnJhbWVMZW4gPSAwOwotCVVTSE9SVAkJCVJlYXNvbiA9IFJFQVNPTl9RT1NfUVNUQV9MRUFWSU5HX1FCU1M7Ci0JVUNIQVIJCQlDYXRlZ29yeSA9IENBVEVHT1JZX0RMUzsKLQlVQ0hBUgkJCUFjdGlvbiA9IEFDVElPTl9ETFNfVEVBUkRPV047Ci0JVUNIQVIJCQlpID0gMDsKLQotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpIHx8Ci0JCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkKLQkJcmV0dXJuOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBETFMgVGVhckRvd24gRnJhbWUgXG4iKSk7Ci0KLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkFTU09DIC0gUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCUFjdEhlYWRlckluaXQocEFkLCAmRGxzVGVhckRvd25IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAotCQkJCQlzaXplb2YoSEVBREVSXzgwMl8xMSksCQkmRGxzVGVhckRvd25IZHIsCi0JCQkJCTEsCQkJCQkJCSZDYXRlZ29yeSwKLQkJCQkJMSwJCQkJCQkJJkFjdGlvbiwKLQkJCQkJNiwJCQkJCQkJcERBLAotCQkJCQk2LAkJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAotCQkJCQkyLAkJCQkJCQkmUmVhc29uLAotCQkJCQlFTkRfT0ZfQVJHUyk7Ci0KLQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCi0JLy8gUmVtb3ZlIGtleSBpbiBsb2NhbCBkbHMgdGFibGUgZW50cnkKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQotCXsKLQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkKLQkJCSYmIE1BQ19BRERSX0VRVUFMKHBEQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCi0JCXsKLQkJCU1hY1RhYmxlRGVsZXRlRGxzRW50cnkocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOwotCQl9Ci0JfQotCi0JLy8gUmVtb3ZlIGtleSBpbiBwZWVyIGRscyB0YWJsZSBlbnRyeQotCWZvciAoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCi0JewotCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKQotCQkJJiYgTUFDX0FERFJfRVFVQUwocERBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKLQkJewotCQkJTWFjVGFibGVEZWxldGVEbHNFbnRyeShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7Ci0JCX0KLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIERMUyBUZWFyRG93biBGcmFtZSBhbmQgcmVtb3ZlIGtleSBpbiAoaT0lZCkgXG4iLCBpKSk7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotTkRJU19TVEFUVVMgUlRNUFNlbmRTVEFLZXlSZXF1ZXN0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBEQSkKLXsKLQlVQ0hBUgkJCQlIZWFkZXI4MDJfM1sxNF07Ci0JTkRJU19TVEFUVVMJCQlOU3RhdHVzOwotCVVMT05HCQkJCUZyYW1lTGVuID0gMDsKLQlFQVBPTF9QQUNLRVQJCVBhY2tldDsKLQlVQ0hBUgkJCQlNaWNbMTZdOwotCVVDSEFSCQkJCWRpZ2VzdFs4MF07Ci0JUFVDSEFSCQkJCXBPdXRCdWZmZXIgPSBOVUxMOwotCVBORElTX1BBQ0tFVAkJcE5kaXNQYWNrZXQ7Ci0JVUNIQVIJCQkJdGVtcFs2NF07Ci0JVUNIQVIJCQkJRGxzUFRLWzgwXTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUlRNUFNlbmRTVEFLZXlSZXF1ZXN0KCkgdG8gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsIHBEQVswXSwgcERBWzFdLCBwREFbMl0sIHBEQVszXSwgcERBWzRdLCBwREFbNV0pKTsKLQotCXBBZC0+U2VxdWVuY2UgKys7Ci0JTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7Ci0KLQkvLyBaZXJvIG1lc3NhZ2UgYm9keQotCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKLQlQYWNrZXQuUHJvVmVyID0gRUFQT0xfVkVSOwotCVBhY2tldC5Qcm9UeXBlICAgID0gRUFQT0xLZXk7Ci0JUGFja2V0LkJvZHlfTGVuWzFdICA9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFICsgNiArIE1BQ19BRERSX0xFTjsJCS8vIGRhdGEgZmllbGQgY29udGFpbiBLREUgYW5kUGVlciBNQUMgYWRkcmVzcwotCi0JLy8gU1RBS2V5IE1lc3NhZ2UgaXMgYXMgRUFQT0wtS2V5KDEsMSwwLDAsRy8wLDAsMCwgTUlDLCAwLFBlZXIgTUFDIEtERSkKLQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCi0gICAgewotICAgICAgICBQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMV9LRVlfREVTQzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKLSAgICB7Ci0gICAgICAgIFBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEEyX0tFWV9ERVNDOwotICAgIH0KLQotCS8vIEtleSBkZXNjcmlwdG9yIHZlcnNpb24KLQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPQotCQkoKChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpIHx8IChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkgPyAoREVTQ19UWVBFX0FFUykgOiAoREVTQ19UWVBFX1RLSVApKTsKLQotCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljCT0gMTsKLQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlNlY3VyZQk9IDE7Ci0JUGFja2V0LktleURlc2MuS2V5SW5mby5SZXF1ZXN0CT0gMTsKLQotCVBhY2tldC5LZXlEZXNjLktleURhdGFMZW5bMV0JPSAxMjsKLQotCS8vIHVzZSBvdXIgb3duIE9VSSB0byBkaXN0aW5ndWlzaCBwcm9wcmlldGFyeSB3aXRoIHN0YW5kYXJkLgotCVBhY2tldC5LZXlEZXNjLktleURhdGFbMF0JCT0gMHhERDsKLQlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzFdCQk9IDB4MEE7Ci0JUGFja2V0LktleURlc2MuS2V5RGF0YVsyXQkJPSAweDAwOwotCVBhY2tldC5LZXlEZXNjLktleURhdGFbM10JCT0gMHgwQzsKLQlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzRdCQk9IDB4NDM7Ci0JUGFja2V0LktleURlc2MuS2V5RGF0YVs1XQkJPSAweDAzOwotCU5kaXNNb3ZlTWVtb3J5KCZQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzZdLCBwREEsIE1BQ19BRERSX0xFTik7Ci0KLQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5EbHNSZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKLQotCS8vIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdHJhbnNtaXR0aW5nIG1lc3NhZ2UKLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwotCWlmIChOU3RhdHVzCSE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCXJldHVybiBOU3RhdHVzOwotCi0JLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCi0JLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAotCQkgICAgICAgICAgICAgIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCi0JCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOwotCi0JLy8gdXNlIHByb3ByaWV0YXJ5IFBUSwotCU5kaXNaZXJvTWVtb3J5KHRlbXAsIDY0KTsKLQlOZGlzTW92ZU1lbW9yeSh0ZW1wLCAiSUVFRTgwMi4xMSBXSVJFTEVTUyBBQ0NFU1MgUE9JTlQiLCAzMik7Ci0JV3BhRGVyaXZlUFRLKHBBZCwgdGVtcCwgdGVtcCwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHRlbXAsIHBBZC0+Q3VycmVudEFkZHJlc3MsIERsc1BUSywgTEVOX1BUSyk7Ci0KLQkvLyBjYWxjdWxhdGUgTUlDCi0JaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCXsKLQkJLy8gQUVTCi0JCU5kaXNaZXJvTWVtb3J5KGRpZ2VzdCwJc2l6ZW9mKGRpZ2VzdCkpOwotCQlITUFDX1NIQTEoRGxzUFRLLCBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBkaWdlc3QsIFNIQTFfRElHRVNUX1NJWkUpOwotCQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7Ci0JfQotCWVsc2UKLQl7Ci0JCU5kaXNaZXJvTWVtb3J5KE1pYywJc2l6ZW9mKE1pYykpOwotCQlITUFDX01ENShEbHNQVEssIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYywgTUQ1X0RJR0VTVF9TSVpFKTsKLQkJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOwotCX0KLQotCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCi0JICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhlYWRlcjgwMl8zKSwJSGVhZGVyODAyXzMsCi0JCSAgICAgICAgICAgICAgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwJJlBhY2tldCwKLQkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7Ci0KLQlOU3RhdHVzID0gUlRNUEFsbG9jYXRlTmRpc1BhY2tldChwQWQsICZwTmRpc1BhY2tldCwgTlVMTCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCWlmIChOU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwTmRpc1BhY2tldCwgQlNTSURfV0NJRCk7Ci0JCVNUQVNlbmRQYWNrZXQocEFkLCBwTmRpc1BhY2tldCk7Ci0JCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7Ci0JfQotCi0JTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTZW5kU1RBS2V5UmVxdWVzdC0gU2VuZCBTVEFLZXkgcmVxdWVzdCAoTlN0YXR1cz0leCwgRnJhbWVMZW49JWxkKVxuIiwgTlN0YXR1cywgRnJhbWVMZW4pKTsKLQotCXJldHVybiBOU3RhdHVzOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLU5ESVNfU1RBVFVTIFJUTVBTZW5kU1RBS2V5SGFuZFNoYWtlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBEQSkKLXsKLQlVQ0hBUgkJCQlIZWFkZXI4MDJfM1sxNF07Ci0JTkRJU19TVEFUVVMJCQlOU3RhdHVzOwotCVVMT05HCQkJCUZyYW1lTGVuID0gMDsKLQlFQVBPTF9QQUNLRVQJCVBhY2tldDsKLQlVQ0hBUgkJCQlNaWNbMTZdOwotCVVDSEFSCQkJCWRpZ2VzdFs4MF07Ci0JUFVDSEFSCQkJCXBPdXRCdWZmZXIgPSBOVUxMOwotCVBORElTX1BBQ0tFVAkJcE5kaXNQYWNrZXQ7Ci0JVUNIQVIJCQkJdGVtcFs2NF07Ci0JVUNIQVIJCQkJRGxzUFRLWzgwXTsJCQkvLyBEdWUgdG8gZGlydmVyIGNhbiBub3QgZ2V0IFBUSywgdXNlIHByb3ByaWV0YXJ5IFBUSwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBSVE1QU2VuZFNUQUtleUhhbmRTaGFrZSgpIHRvICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLCBwREFbMF0sIHBEQVsxXSwgcERBWzJdLCBwREFbM10sIHBEQVs0XSwgcERBWzVdKSk7Ci0KLQlwQWQtPlNlcXVlbmNlICsrOwotCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRUFQT0wpOwotCi0JLy8gWmVybyBtZXNzYWdlIGJvZHkKLQlOZGlzWmVyb01lbW9yeSgmUGFja2V0LCBzaXplb2YoUGFja2V0KSk7Ci0JUGFja2V0LlByb1ZlciA9IEVBUE9MX1ZFUjsKLQlQYWNrZXQuUHJvVHlwZSAgICA9IEVBUE9MS2V5OwotCVBhY2tldC5Cb2R5X0xlblsxXSAgPSBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRSArIDYgKyBNQUNfQUREUl9MRU47CQkvLyBkYXRhIGZpZWxkIGNvbnRhaW4gS0RFIGFuZCBQZWVyIE1BQyBhZGRyZXNzCi0KLQkvLyBTVEFLZXkgTWVzc2FnZSBpcyBhcyBFQVBPTC1LZXkoMSwxLDAsMCxHLzAsMCwwLCBNSUMsIDAsUGVlciBNQUMgS0RFKQotCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKLSAgICB7Ci0gICAgICAgIFBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEExX0tFWV9ERVNDOwotICAgIH0KLSAgICBlbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQotICAgIHsKLSAgICAgICAgUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTJfS0VZX0RFU0M7Ci0gICAgfQotCi0JLy8gS2V5IGRlc2NyaXB0b3IgdmVyc2lvbgotCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9Ci0JCSgoKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkgfHwgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKSA/IChERVNDX1RZUEVfQUVTKSA6IChERVNDX1RZUEVfVEtJUCkpOwotCi0JUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMJPSAxOwotCVBhY2tldC5LZXlEZXNjLktleUluZm8uU2VjdXJlCT0gMTsKLQotCVBhY2tldC5LZXlEZXNjLktleURhdGFMZW5bMV0JPSAxMjsKLQotCS8vIHVzZSBvdXIgb3duIE9VSSB0byBkaXN0aW5ndWlzaCBwcm9wcmlldGFyeSB3aXRoIHN0YW5kYXJkLgotCVBhY2tldC5LZXlEZXNjLktleURhdGFbMF0JCT0gMHhERDsKLQlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzFdCQk9IDB4MEE7Ci0JUGFja2V0LktleURlc2MuS2V5RGF0YVsyXQkJPSAweDAwOwotCVBhY2tldC5LZXlEZXNjLktleURhdGFbM10JCT0gMHgwQzsKLQlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzRdCQk9IDB4NDM7Ci0JUGFja2V0LktleURlc2MuS2V5RGF0YVs1XQkJPSAweDAzOwotCU5kaXNNb3ZlTWVtb3J5KCZQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzZdLCBwREEsIE1BQ19BRERSX0xFTik7Ci0KLQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5EbHNSZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKLQotCS8vIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdHJhbnNtaXR0aW5nIG1lc3NhZ2UKLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwotCWlmIChOU3RhdHVzCSE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCXJldHVybiBOU3RhdHVzOwotCi0JLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCi0JLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAotCQkgICAgICAgICAgICAgIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCi0JCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOwotCi0JLy8gdXNlIHByb3ByaWV0YXJ5IFBUSwotCU5kaXNaZXJvTWVtb3J5KHRlbXAsIDY0KTsKLQlOZGlzTW92ZU1lbW9yeSh0ZW1wLCAiSUVFRTgwMi4xMSBXSVJFTEVTUyBBQ0NFU1MgUE9JTlQiLCAzMik7Ci0JV3BhRGVyaXZlUFRLKHBBZCwgdGVtcCwgdGVtcCwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHRlbXAsIHBBZC0+Q3VycmVudEFkZHJlc3MsIERsc1BUSywgTEVOX1BUSyk7Ci0KLQkvLyBjYWxjdWxhdGUgTUlDCi0JaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCXsKLQkJLy8gQUVTCi0JCU5kaXNaZXJvTWVtb3J5KGRpZ2VzdCwJc2l6ZW9mKGRpZ2VzdCkpOwotCQlITUFDX1NIQTEoRGxzUFRLLCBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBkaWdlc3QsIFNIQTFfRElHRVNUX1NJWkUpOwotCQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7Ci0JfQotCWVsc2UKLQl7Ci0JCU5kaXNaZXJvTWVtb3J5KE1pYywJc2l6ZW9mKE1pYykpOwotCQlITUFDX01ENShEbHNQVEssIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYywgTUQ1X0RJR0VTVF9TSVpFKTsKLQkJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOwotCX0KLQotCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCi0JICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhlYWRlcjgwMl8zKSwJSGVhZGVyODAyXzMsCi0JCSAgICAgICAgICAgICAgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwJJlBhY2tldCwKLQkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7Ci0KLQlOU3RhdHVzID0gUlRNUEFsbG9jYXRlTmRpc1BhY2tldChwQWQsICZwTmRpc1BhY2tldCwgTlVMTCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCWlmIChOU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwTmRpc1BhY2tldCwgQlNTSURfV0NJRCk7Ci0JCVNUQVNlbmRQYWNrZXQocEFkLCBwTmRpc1BhY2tldCk7Ci0JCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7Ci0JfQotCi0JTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTZW5kU1RBS2V5SGFuZFNoYWtlLSBTZW5kIFNUQUtleSBNZXNzYWdlLTIgKE5TdGF0dXM9JXgsIEZyYW1lTGVuPSVsZClcbiIsIE5TdGF0dXMsIEZyYW1lTGVuKSk7Ci0KLQlyZXR1cm4gTlN0YXR1czsKLX0KLQotVk9JRCBEbHNUaW1lb3V0QWN0aW9uKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKLXsKLQlNTE1FX0RMU19SRVFfU1RSVUNUCQlNbG1lRGxzUmVxOwotCVVTSE9SVAkJCQkJcmVhc29uOwotCVBSVF84MDJfMTFfRExTCQkJcERMUyA9IChQUlRfODAyXzExX0RMUylGdW5jdGlvbkNvbnRleHQ7Ci0JUFJUTVBfQURBUFRFUgkJCXBBZCA9IHBETFMtPnBBZDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRsc1RpbWVvdXQgLSBUZWFyIGRvd24gRExTIGxpbmtzICglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeClcbiIsCi0JCXBETFMtPk1hY0FkZHJbMF0sIHBETFMtPk1hY0FkZHJbMV0sIHBETFMtPk1hY0FkZHJbMl0sIHBETFMtPk1hY0FkZHJbM10sIHBETFMtPk1hY0FkZHJbNF0sIHBETFMtPk1hY0FkZHJbNV0pKTsKLQotCWlmICgocERMUykgJiYgKHBETFMtPlZhbGlkKSkKLQl7Ci0JCXJlYXNvbgkJCT0gUkVBU09OX1FPU19SRVFVRVNUX1RJTUVPVVQ7Ci0JCXBETFMtPlZhbGlkCQk9IEZBTFNFOwotCQlwRExTLT5TdGF0dXMJPSBETFNfTk9ORTsKLQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgcERMUywgcmVhc29uKTsKLQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7Ci0JCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7Ci0JfQotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRGVzY3JpcHRpb24gOiBiZWNhdXNlIERMUyBhbmQgQ0xJIHNoYXJlIHRoZSBzYW1lIFdDSUQgdGFibGUgaW4gQVNJQy4KLU1lc2ggZW50cnkgYWxzbyBpbnNlcnQgdG8gcEFkLT5NYWNUYWIuY29udGVudFtdLiAgU3VjaCBpcyBtYXJrZWQgYXMgVmFsaWRBc0RscyA9IFRSVUUuCi1BbHNvIGZpbGxzIHRoZSBwYWlyd2lzZSBrZXkuCi1CZWNhdXNlIGZyb250IE1BWF9BSURfQkEgZW50cmllcyBoYXZlIGRpcmVjdCBtYXBwaW5nIHRvIEJBRW50cnksIHdoaWNoIGlzIG9ubHkgdXNlZCBhcyBDTEkuIFNvIHdlIGluc2VydCBEbHMKLWZyb20gaW5kZXggTUFYX0FJRF9CQS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1NQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlSW5zZXJ0RGxzRW50cnkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUglwQWRkciwKLQlJTiAgVUlOVAlEbHNFbnRyeUlkeCkKLXsKLQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9IE5VTEw7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBNYWNUYWJsZUluc2VydERsc0VudHJ5XG4iKSk7Ci0JLy8gaWYgRlVMTCwgcmV0dXJuCi0JaWYgKHBBZC0+TWFjVGFiLlNpemUgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCi0JCXJldHVybiBOVUxMOwotCi0JZG8KLQl7Ci0JCWlmKChwRW50cnkgPSBEbHNFbnRyeVRhYmxlTG9va3VwKHBBZCwgcEFkZHIsIFRSVUUpKSAhPSBOVUxMKQotCQkJYnJlYWs7Ci0KLQkJLy8gYWxsb2NhdGUgb25lIE1BQyBlbnRyeQotCQlwRW50cnkgPSBNYWNUYWJsZUluc2VydEVudHJ5KHBBZCwgcEFkZHIsIERsc0VudHJ5SWR4ICsgTUlOX05FVF9ERVZJQ0VfRk9SX0RMUywgVFJVRSk7Ci0JCWlmIChwRW50cnkpCi0JCXsKLQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W0Rsc0VudHJ5SWR4XS5NYWNUYWJNYXRjaFdDSUQgPSBwRW50cnktPkFpZDsKLQkJCXBFbnRyeS0+TWF0Y2hEbHNFbnRyeUlkeCA9IERsc0VudHJ5SWR4OwotCQkJcEVudHJ5LT5BdXRoTW9kZSA9IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlOwotCQkJcEVudHJ5LT5XZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7Ci0JCQlwRW50cnktPlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY1RhYmxlSW5zZXJ0RGxzRW50cnkgLSBhbGxvY2F0ZSBlbnRyeSAjJWQsIFRvdGFsPSAlZFxuIixwRW50cnktPkFpZCwgcEFkLT5NYWNUYWIuU2l6ZSkpOwotCi0JCQkvLyBJZiBsZWdhY3kgV0VQIGlzIHVzZWQsIHNldCBwYWlyLXdpc2UgY2lwaGVyQWxnIGludG8gV0NJRCBhdHRyaWJ1dGUgdGFibGUgZm9yIHRoaXMgZW50cnkKLQkJCWlmICgocEVudHJ5LT5WYWxpZEFzRGxzKSAmJiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKSkKLQkJCXsKLQkJCQlVQ0hBUiBLZXlJZHggPSAwOwotCQkJCVVDSEFSIENpcGhlckFsZyA9IDA7Ci0KLQkJCQlLZXlJZHgJPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7Ci0KLQkJCQlDaXBoZXJBbGcJPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZzsKLQotCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAotCQkJCQkJCQkJCQlCU1MwLAotCQkJCQkJCQkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCi0JCQkJCQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAotCQkJCQkJCQkJCQlwRW50cnkpOwotCQkJfQotCi0JCQlicmVhazsKLQkJfQotCX0gd2hpbGUoRkFMU0UpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PT0gTWFjVGFibGVJbnNlcnREbHNFbnRyeVxuIikpOwotCi0JcmV0dXJuIHBFbnRyeTsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCURlbGV0ZSBhbGwgTWVzaCBFbnRyeSBpbiBwQWQtPk1hY1RhYgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLUJPT0xFQU4gTWFjVGFibGVEZWxldGVEbHNFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQgd2NpZCwKLQlJTiBQVUNIQVIgcEFkZHIpCi17Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gTWFjVGFibGVEZWxldGVEbHNFbnRyeVxuIikpOwotCi0JaWYgKCFWQUxJRF9XQ0lEKHdjaWQpKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlNYWNUYWJsZURlbGV0ZUVudHJ5KHBBZCwgd2NpZCwgcEFkZHIpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PT0gTWFjVGFibGVEZWxldGVEbHNFbnRyeVxuIikpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLU1BQ19UQUJMRV9FTlRSWSAqRGxzRW50cnlUYWJsZUxvb2t1cCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIJcEFkZHIsCi0JSU4gQk9PTEVBTgliUmVzZXRJZGVsQ291bnQpCi17Ci0JVUxPTkcgSGFzaElkeDsKLQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEw7Ci0KLQlSVE1QX1NFTV9MT0NLKCZwQWQtPk1hY1RhYkxvY2spOwotCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZGRyKTsKLQlwRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOwotCi0Jd2hpbGUgKHBFbnRyeSkKLQl7Ci0JCWlmICgocEVudHJ5LT5WYWxpZEFzRGxzID09IFRSVUUpCi0JCQkmJiBNQUNfQUREUl9FUVVBTChwRW50cnktPkFkZHIsIHBBZGRyKSkKLQkJewotCQkJaWYoYlJlc2V0SWRlbENvdW50KQotCQkJCXBFbnRyeS0+Tm9EYXRhSWRsZUNvdW50ID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JCWVsc2UKLQkJCXBFbnRyeSA9IHBFbnRyeS0+cE5leHQ7Ci0JfQotCi0JUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1hY1RhYkxvY2spOwotCXJldHVybiBwRW50cnk7Ci19Ci0KLU1BQ19UQUJMRV9FTlRSWSAqRGxzRW50cnlUYWJsZUxvb2t1cEJ5V2NpZCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUgl3Y2lkLAotCUlOIFBVQ0hBUglwQWRkciwKLQlJTiBCT09MRUFOCWJSZXNldElkZWxDb3VudCkKLXsKLQlVTE9ORyBETHNJbmRleDsKLQlQTUFDX1RBQkxFX0VOVFJZIHBDdXJFbnRyeSA9IE5VTEw7Ci0JUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSBOVUxMOwotCi0JaWYgKCFWQUxJRF9XQ0lEKHdjaWQpKQotCQlyZXR1cm4gTlVMTDsKLQotCVJUTVBfU0VNX0xPQ0soJnBBZC0+TWFjVGFiTG9jayk7Ci0KLQlkbwotCXsKLQkJcEN1ckVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbd2NpZF07Ci0KLQkJRExzSW5kZXggPSAweGZmOwotCQlpZiAoKHBDdXJFbnRyeSkgJiYgKHBDdXJFbnRyeS0+VmFsaWRBc0Rscz09IFRSVUUpKQotCQl7Ci0JCQlETHNJbmRleCA9IHBDdXJFbnRyeS0+TWF0Y2hEbHNFbnRyeUlkeDsKLQkJfQotCi0JCWlmIChETHNJbmRleCA9PSAweGZmKQotCQkJYnJlYWs7Ci0KLQkJaWYgKE1BQ19BRERSX0VRVUFMKHBDdXJFbnRyeS0+QWRkciwgcEFkZHIpKQotCQl7Ci0JCQlpZihiUmVzZXRJZGVsQ291bnQpCi0JCQkJcEN1ckVudHJ5LT5Ob0RhdGFJZGxlQ291bnQgPSAwOwotCQkJcEVudHJ5ID0gcEN1ckVudHJ5OwotCQkJYnJlYWs7Ci0JCX0KLQl9IHdoaWxlKEZBTFNFKTsKLQotCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NYWNUYWJMb2NrKTsKLQotCXJldHVybiBwRW50cnk7Ci19Ci0KLUlOVCBTZXRfRGxzRW50cnlJbmZvX0Rpc3BsYXlfUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgYXJnKQotewotCUlOVCBpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlxuJS0xOXMlLThzXG4iLCAiTUFDIiwgIlRJTUVPVVRcbiIpKTsKLQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQotCXsKLQkJaWYgKChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCkgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKLQkJewotCQkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSURdOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggICIsCi0JCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkclswXSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkclsxXSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkclsyXSwKLQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyWzNdLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyWzRdLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyWzVdKSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiJS04ZFxuIiwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCkpOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiXG4iKSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiXG4lLTE5cyUtNHMlLTRzJS00cyUtNHMlLTdzJS03cyUtN3MiLCJNQUMiLCAiQUlEIiwgIkJTUyIsICJQU00iLCAiV01NIiwgIlJTU0kwIiwgIlJTU0kxIiwgIlJTU0kyIikpOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIiUtOHMlLTEwcyUtNnMlLTZzJS02cyUtNnMiLCAiTUlNT1BTIiwgIlBoTWQiLCAiQlciLCAiTUNTIiwgIlNHSSIsICJTVEJDIikpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlxuJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlggICIsCi0JCQkJcEVudHJ5LT5BZGRyWzBdLCBwRW50cnktPkFkZHJbMV0sIHBFbnRyeS0+QWRkclsyXSwKLQkJCQlwRW50cnktPkFkZHJbM10sIHBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdKSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiJS00ZCIsIChpbnQpcEVudHJ5LT5BaWQpKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIlLTRkIiwgKGludClwRW50cnktPmFwaWR4KSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiJS00ZCIsIChpbnQpcEVudHJ5LT5Qc01vZGUpKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIlLTRkIiwgKGludClDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSkpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIiUtN2QiLCBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTApKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIlLTdkIiwgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kxKSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiJS03ZCIsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMikpOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIiUtOGQiLCAoaW50KXBFbnRyeS0+TW1wc01vZGUpKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIlLTEwcyIsIEdldFBoeU1vZGUocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSkpKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIlLTZzIiwgR2V0QlcocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuQlcpKSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiJS02ZCIsIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUykpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIiUtNmQiLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJKSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiJS02ZCIsIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMpKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIlLTEwZCwgJWQsICVkJSVcbiIsIHBFbnRyeS0+RGVidWdGSUZPQ291bnQsIHBFbnRyeS0+RGVidWdUeENvdW50LAotCQkJCQkJKHBFbnRyeS0+RGVidWdUeENvdW50KSA/ICgocEVudHJ5LT5EZWJ1Z1R4Q291bnQtcEVudHJ5LT5EZWJ1Z0ZJRk9Db3VudCkqMTAwL3BFbnRyeS0+RGVidWdUeENvdW50KSA6IDApKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJcbiIpKTsKLQotCQl9Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfRGxzQWRkRW50cnlfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotICAgIFVDSEFSCW1hY1tNQUNfQUREUl9MRU5dOwotCVVTSE9SVAlUaW1lb3V0OwotCVBTVFJJTkcgdG9rZW47Ci0JU1RSSU5HIHNlcFZhbHVlW10gPSAiOiIsIERBU0ggPSAnLSc7Ci0JSU5UIGk7Ci0gICAgUlRfODAyXzExX0RMUwlEbHM7Ci0KLSAgICBpZihzdHJsZW4oYXJnKSA8IDE5KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcgcGx1cyB0aGUgIi0iIGFuZCB0aW1lb3V0IHZhbHVlIGluIGRlY2ltYWwgZm9ybWF0LgotCQlyZXR1cm4gRkFMU0U7Ci0KLQl0b2tlbiA9IHN0cmNocihhcmcsIERBU0gpOwotCWlmICgodG9rZW4gIT0gTlVMTCkgJiYgKHN0cmxlbih0b2tlbik+MSkpCi0JewotCQlUaW1lb3V0ID0gKFVTSE9SVCkgc2ltcGxlX3N0cnRvbCgodG9rZW4rMSksIDAsIDEwKTsKLQotCQkqdG9rZW4gPSAnXDAnOwotCQlmb3IgKGkgPSAwLCB0b2tlbiA9IHJzdHJ0b2soYXJnLCAmc2VwVmFsdWVbMF0pOyB0b2tlbjsgdG9rZW4gPSByc3RydG9rKE5VTEwsICZzZXBWYWx1ZVswXSksIGkrKykKLQkJewotCQkJaWYoKHN0cmxlbih0b2tlbikgIT0gMikgfHwgKCFpc3hkaWdpdCgqdG9rZW4pKSB8fCAoIWlzeGRpZ2l0KCoodG9rZW4rMSkpKSkKLQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQlBdG9IKHRva2VuLCAoJm1hY1tpXSksIDEpOwotCQl9Ci0JCWlmKGkgIT0gNikKLQkJCXJldHVybiBGQUxTRTsKLQotCSAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiXG4lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC0lZCIsIG1hY1swXSwgbWFjWzFdLAotCSAgICAgICAgICAgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdLCAoaW50KVRpbWVvdXQpKTsKLQotCQlOZGlzWmVyb01lbW9yeSgmRGxzLCBzaXplb2YoUlRfODAyXzExX0RMUykpOwotCQlEbHMuVGltZU91dCA9IFRpbWVvdXQ7Ci0JCUNPUFlfTUFDX0FERFIoRGxzLk1hY0FkZHIsIG1hYyk7Ci0JCURscy5WYWxpZCA9IDE7Ci0KLQkJTWxtZUVucXVldWUocEFkLAotCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKLQkJCQkJUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNLAotCQkJCQlzaXplb2YoUlRfODAyXzExX0RMUyksCi0JCQkJCSZEbHMpOwotCi0JCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKLQotfQotCi1JTlQJU2V0X0Rsc1RlYXJEb3duRW50cnlfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVDSEFSCQkJbWFjQWRkcltNQUNfQUREUl9MRU5dOwotCVBTVFJJTkcJCQl2YWx1ZTsKLQlJTlQJCQkJaTsKLQlSVF84MDJfMTFfRExTCURsczsKLQotCWlmKHN0cmxlbihhcmcpICE9IDE3KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcKLQkJcmV0dXJuIEZBTFNFOwotCi0JZm9yIChpPTAsIHZhbHVlID0gcnN0cnRvayhhcmcsIjoiKTsgdmFsdWU7IHZhbHVlID0gcnN0cnRvayhOVUxMLCI6IikpCi0JewotCQlpZigoc3RybGVuKHZhbHVlKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp2YWx1ZSkpIHx8ICghaXN4ZGlnaXQoKih2YWx1ZSsxKSkpICkKLQkJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZAotCi0JCUF0b0godmFsdWUsICZtYWNBZGRyW2krK10sIDIpOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwgbWFjQWRkclswXSwgbWFjQWRkclsxXSwKLQkgICAgICAgICAgIG1hY0FkZHJbMl0sIG1hY0FkZHJbM10sIG1hY0FkZHJbNF0sIG1hY0FkZHJbNV0pKTsKLQotCU5kaXNaZXJvTWVtb3J5KCZEbHMsIHNpemVvZihSVF84MDJfMTFfRExTKSk7Ci0JQ09QWV9NQUNfQUREUihEbHMuTWFjQWRkciwgbWFjQWRkcik7Ci0JRGxzLlZhbGlkID0gMDsKLQotCU1sbWVFbnF1ZXVlKHBBZCwKLQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKLQkJCQlSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0sCi0JCQkJc2l6ZW9mKFJUXzgwMl8xMV9ETFMpLAotCQkJCSZEbHMpOwotCi0JcmV0dXJuIFRSVUU7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS9ydG1wX2NraXBtaWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhL3J0bXBfY2tpcG1pYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjZkYmQ3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhL3J0bXBfY2tpcG1pYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTc5ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JcnRtcF9ja2lwbWljLmMKLQotCUFic3RyYWN0OgotCURhdGEgcGF0aCBzdWJyb3V0aW5lcwotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotI2luY2x1ZGUgIi4uL3J0bXBfY2tpcG1pYy5oIgotCi0KLSNkZWZpbmUgTUlDX0FDQ1VNKHYpICAgICAgICAgICAgcENvbnRleHQtPmFjY3VtICs9IChVTE9OR0xPTkcpdiAqIFJUTVBNaWNHZXRDb2VmZmljaWVudChwQ29udGV4dCkKLSNkZWZpbmUgR0IocCxpLHMpICAgICAgICAgICAgICAgKCAoKFVMT05HKSAqKChVQ0hBUiopKHApK2kpICkgPDwgKHMpICkKLSNkZWZpbmUgR0VUQklHMzIocCkgICAgICAgICAgICAgR0IocCwwLDI0KXxHQihwLDEsMTYpfEdCKHAsMiw4KXxHQihwLDMsMCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqIFNCT1ggVGFibGUgKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1VQ0hBUiBTYm94VGFibGVbMjU2XSA9Ci17Ci0gICAgMHg2MywgMHg3YywgMHg3NywgMHg3YiwgMHhmMiwgMHg2YiwgMHg2ZiwgMHhjNSwKLSAgICAweDMwLCAweDAxLCAweDY3LCAweDJiLCAweGZlLCAweGQ3LCAweGFiLCAweDc2LAotICAgIDB4Y2EsIDB4ODIsIDB4YzksIDB4N2QsIDB4ZmEsIDB4NTksIDB4NDcsIDB4ZjAsCi0gICAgMHhhZCwgMHhkNCwgMHhhMiwgMHhhZiwgMHg5YywgMHhhNCwgMHg3MiwgMHhjMCwKLSAgICAweGI3LCAweGZkLCAweDkzLCAweDI2LCAweDM2LCAweDNmLCAweGY3LCAweGNjLAotICAgIDB4MzQsIDB4YTUsIDB4ZTUsIDB4ZjEsIDB4NzEsIDB4ZDgsIDB4MzEsIDB4MTUsCi0gICAgMHgwNCwgMHhjNywgMHgyMywgMHhjMywgMHgxOCwgMHg5NiwgMHgwNSwgMHg5YSwKLSAgICAweDA3LCAweDEyLCAweDgwLCAweGUyLCAweGViLCAweDI3LCAweGIyLCAweDc1LAotICAgIDB4MDksIDB4ODMsIDB4MmMsIDB4MWEsIDB4MWIsIDB4NmUsIDB4NWEsIDB4YTAsCi0gICAgMHg1MiwgMHgzYiwgMHhkNiwgMHhiMywgMHgyOSwgMHhlMywgMHgyZiwgMHg4NCwKLSAgICAweDUzLCAweGQxLCAweDAwLCAweGVkLCAweDIwLCAweGZjLCAweGIxLCAweDViLAotICAgIDB4NmEsIDB4Y2IsIDB4YmUsIDB4MzksIDB4NGEsIDB4NGMsIDB4NTgsIDB4Y2YsCi0gICAgMHhkMCwgMHhlZiwgMHhhYSwgMHhmYiwgMHg0MywgMHg0ZCwgMHgzMywgMHg4NSwKLSAgICAweDQ1LCAweGY5LCAweDAyLCAweDdmLCAweDUwLCAweDNjLCAweDlmLCAweGE4LAotICAgIDB4NTEsIDB4YTMsIDB4NDAsIDB4OGYsIDB4OTIsIDB4OWQsIDB4MzgsIDB4ZjUsCi0gICAgMHhiYywgMHhiNiwgMHhkYSwgMHgyMSwgMHgxMCwgMHhmZiwgMHhmMywgMHhkMiwKLSAgICAweGNkLCAweDBjLCAweDEzLCAweGVjLCAweDVmLCAweDk3LCAweDQ0LCAweDE3LAotICAgIDB4YzQsIDB4YTcsIDB4N2UsIDB4M2QsIDB4NjQsIDB4NWQsIDB4MTksIDB4NzMsCi0gICAgMHg2MCwgMHg4MSwgMHg0ZiwgMHhkYywgMHgyMiwgMHgyYSwgMHg5MCwgMHg4OCwKLSAgICAweDQ2LCAweGVlLCAweGI4LCAweDE0LCAweGRlLCAweDVlLCAweDBiLCAweGRiLAotICAgIDB4ZTAsIDB4MzIsIDB4M2EsIDB4MGEsIDB4NDksIDB4MDYsIDB4MjQsIDB4NWMsCi0gICAgMHhjMiwgMHhkMywgMHhhYywgMHg2MiwgMHg5MSwgMHg5NSwgMHhlNCwgMHg3OSwKLSAgICAweGU3LCAweGM4LCAweDM3LCAweDZkLCAweDhkLCAweGQ1LCAweDRlLCAweGE5LAotICAgIDB4NmMsIDB4NTYsIDB4ZjQsIDB4ZWEsIDB4NjUsIDB4N2EsIDB4YWUsIDB4MDgsCi0gICAgMHhiYSwgMHg3OCwgMHgyNSwgMHgyZSwgMHgxYywgMHhhNiwgMHhiNCwgMHhjNiwKLSAgICAweGU4LCAweGRkLCAweDc0LCAweDFmLCAweDRiLCAweGJkLCAweDhiLCAweDhhLAotICAgIDB4NzAsIDB4M2UsIDB4YjUsIDB4NjYsIDB4NDgsIDB4MDMsIDB4ZjYsIDB4MGUsCi0gICAgMHg2MSwgMHgzNSwgMHg1NywgMHhiOSwgMHg4NiwgMHhjMSwgMHgxZCwgMHg5ZSwKLSAgICAweGUxLCAweGY4LCAweDk4LCAweDExLCAweDY5LCAweGQ5LCAweDhlLCAweDk0LAotICAgIDB4OWIsIDB4MWUsIDB4ODcsIDB4ZTksIDB4Y2UsIDB4NTUsIDB4MjgsIDB4ZGYsCi0gICAgMHg4YywgMHhhMSwgMHg4OSwgMHgwZCwgMHhiZiwgMHhlNiwgMHg0MiwgMHg2OCwKLSAgICAweDQxLCAweDk5LCAweDJkLCAweDBmLCAweGIwLCAweDU0LCAweGJiLCAweDE2Ci19OwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKj09PT09PT09PT09PT09PT09PT0gQ0tJUCBLRVkgUEVSTVVUQVRJT04gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8qIDItYnl0ZSBieSAyLWJ5dGUgc3Vic2V0IG9mIHRoZSBmdWxsIEFFUyB0YWJsZSAqLwotc3RhdGljIGNvbnN0IFVTSE9SVCBTYm94WzI1Nl0gPQotewotICAgIDB4QzZBNSwweEY4ODQsMHhFRTk5LDB4RjY4RCwweEZGMEQsMHhENkJELDB4REVCMSwweDkxNTQsCi0gICAgMHg2MDUwLDB4MDIwMywweENFQTksMHg1NjdELDB4RTcxOSwweEI1NjIsMHg0REU2LDB4RUM5QSwKLSAgICAweDhGNDUsMHgxRjlELDB4ODk0MCwweEZBODcsMHhFRjE1LDB4QjJFQiwweDhFQzksMHhGQjBCLAotICAgIDB4NDFFQywweEIzNjcsMHg1RkZELDB4NDVFQSwweDIzQkYsMHg1M0Y3LDB4RTQ5NiwweDlCNUIsCi0gICAgMHg3NUMyLDB4RTExQywweDNEQUUsMHg0QzZBLDB4NkM1QSwweDdFNDEsMHhGNTAyLDB4ODM0RiwKLSAgICAweDY4NUMsMHg1MUY0LDB4RDEzNCwweEY5MDgsMHhFMjkzLDB4QUI3MywweDYyNTMsMHgyQTNGLAotICAgIDB4MDgwQywweDk1NTIsMHg0NjY1LDB4OUQ1RSwweDMwMjgsMHgzN0ExLDB4MEEwRiwweDJGQjUsCi0gICAgMHgwRTA5LDB4MjQzNiwweDFCOUIsMHhERjNELDB4Q0QyNiwweDRFNjksMHg3RkNELDB4RUE5RiwKLSAgICAweDEyMUIsMHgxRDlFLDB4NTg3NCwweDM0MkUsMHgzNjJELDB4RENCMiwweEI0RUUsMHg1QkZCLAotICAgIDB4QTRGNiwweDc2NEQsMHhCNzYxLDB4N0RDRSwweDUyN0IsMHhERDNFLDB4NUU3MSwweDEzOTcsCi0gICAgMHhBNkY1LDB4Qjk2OCwweDAwMDAsMHhDMTJDLDB4NDA2MCwweEUzMUYsMHg3OUM4LDB4QjZFRCwKLSAgICAweEQ0QkUsMHg4RDQ2LDB4NjdEOSwweDcyNEIsMHg5NERFLDB4OThENCwweEIwRTgsMHg4NTRBLAotICAgIDB4QkI2QiwweEM1MkEsMHg0RkU1LDB4RUQxNiwweDg2QzUsMHg5QUQ3LDB4NjY1NSwweDExOTQsCi0gICAgMHg4QUNGLDB4RTkxMCwweDA0MDYsMHhGRTgxLDB4QTBGMCwweDc4NDQsMHgyNUJBLDB4NEJFMywKLSAgICAweEEyRjMsMHg1REZFLDB4ODBDMCwweDA1OEEsMHgzRkFELDB4MjFCQywweDcwNDgsMHhGMTA0LAotICAgIDB4NjNERiwweDc3QzEsMHhBRjc1LDB4NDI2MywweDIwMzAsMHhFNTFBLDB4RkQwRSwweEJGNkQsCi0gICAgMHg4MTRDLDB4MTgxNCwweDI2MzUsMHhDMzJGLDB4QkVFMSwweDM1QTIsMHg4OENDLDB4MkUzOSwKLSAgICAweDkzNTcsMHg1NUYyLDB4RkM4MiwweDdBNDcsMHhDOEFDLDB4QkFFNywweDMyMkIsMHhFNjk1LAotICAgIDB4QzBBMCwweDE5OTgsMHg5RUQxLDB4QTM3RiwweDQ0NjYsMHg1NDdFLDB4M0JBQiwweDBCODMsCi0gICAgMHg4Q0NBLDB4QzcyOSwweDZCRDMsMHgyODNDLDB4QTc3OSwweEJDRTIsMHgxNjFELDB4QUQ3NiwKLSAgICAweERCM0IsMHg2NDU2LDB4NzQ0RSwweDE0MUUsMHg5MkRCLDB4MEMwQSwweDQ4NkMsMHhCOEU0LAotICAgIDB4OUY1RCwweEJENkUsMHg0M0VGLDB4QzRBNiwweDM5QTgsMHgzMUE0LDB4RDMzNywweEYyOEIsCi0gICAgMHhENTMyLDB4OEI0MywweDZFNTksMHhEQUI3LDB4MDE4QywweEIxNjQsMHg5Q0QyLDB4NDlFMCwKLSAgICAweEQ4QjQsMHhBQ0ZBLDB4RjMwNywweENGMjUsMHhDQUFGLDB4RjQ4RSwweDQ3RTksMHgxMDE4LAotICAgIDB4NkZENSwweEYwODgsMHg0QTZGLDB4NUM3MiwweDM4MjQsMHg1N0YxLDB4NzNDNywweDk3NTEsCi0gICAgMHhDQjIzLDB4QTE3QywweEU4OUMsMHgzRTIxLDB4OTZERCwweDYxREMsMHgwRDg2LDB4MEY4NSwKLSAgICAweEUwOTAsMHg3QzQyLDB4NzFDNCwweENDQUEsMHg5MEQ4LDB4MDYwNSwweEY3MDEsMHgxQzEyLAotICAgIDB4QzJBMywweDZBNUYsMHhBRUY5LDB4NjlEMCwweDE3OTEsMHg5OTU4LDB4M0EyNywweDI3QjksCi0gICAgMHhEOTM4LDB4RUIxMywweDJCQjMsMHgyMjMzLDB4RDJCQiwweEE5NzAsMHgwNzg5LDB4MzNBNywKLSAgICAweDJEQjYsMHgzQzIyLDB4MTU5MiwweEM5MjAsMHg4NzQ5LDB4QUFGRiwweDUwNzgsMHhBNTdBLAotICAgIDB4MDM4RiwweDU5RjgsMHgwOTgwLDB4MUExNywweDY1REEsMHhENzMxLDB4ODRDNiwweEQwQjgsCi0gICAgMHg4MkMzLDB4MjlCMCwweDVBNzcsMHgxRTExLDB4N0JDQiwweEE4RkMsMHg2REQ2LDB4MkMzQQotICAgIH07Ci0KLSNkZWZpbmUgTG84KHYxNikgICAgICgodjE2KSAgICAgICAmIDB4RkYpCi0jZGVmaW5lIEhpOCh2MTYpICAgICgoKHYxNikgPj4gOCkgJiAweEZGKQotI2RlZmluZSB1MTZTd2FwKGkpICAoICgoKGkpID4+IDgpICYgMHhGRikgfCAoKChpKSA8PCA4KSAmIDB4RkYwMCkgKQotI2RlZmluZSBfU18oaSkgICAgICAoU2JveFtMbzgoaSldIF4gdTE2U3dhcChTYm94W0hpOChpKV0pKQotCi0jZGVmaW5lIHJvdExlZnRfMSh4KSAoKCgoeCkgPDwgMSkgfCAoKHgpID4+IDE1KSkgJiAweEZGRkYpCi1WT0lEIENLSVBfa2V5X3Blcm11dGUKLSAgICAoCi0gICAgIE9VVCBVQ0hBUiAgKlBLLCAgICAgICAgICAgLyogb3V0cHV0IHBlcm11dGVkIGtleSAqLwotICAgICBJTiBVQ0hBUiAqQ0ssICAgICAgICAgICAvKiBpbnB1dCBDS0lQIGtleSAqLwotICAgICBJTiBVQ0hBUiAgdG9Ec0Zyb21EcywgICAgLyogaW5wdXQgdG9Ecy9Gcm9tRHMgYml0cyAqLwotICAgICBJTiBVQ0hBUiAqcGl2ICAgICAgICAgICAvKiBpbnB1dCBwb2ludGVyIHRvIElWICovCi0gICAgICkKLXsKLSAgICBpbnQgaTsKLSAgICBVU0hPUlQgSFsyXSwgdG1wOyAgICAgICAgICAvKiBIPTMyLWJpdHMgb2YgcGVyLXBhY2tldCBoYXNoIHZhbHVlICovCi0gICAgVVNIT1JUIExbOF0sIFJbOF07ICAgICAgICAgLyogTD11MTYgYXJyYXkgb2YgQ0ssIFI9dTE2IGFycmF5IG9mIFBLICovCi0KLSAgICAvKiBidWlsZCBMIGZyb20gaW5wdXQga2V5ICovCi0gICAgbWVtc2V0KEwsIDAsIHNpemVvZihMKSk7Ci0gICAgZm9yIChpPTA7IGk8MTY7IGkrKykgewotICAgICAgICBMW2k+PjFdIHw9ICggKChVU0hPUlQpKENLW2ldKSkgPDwgKCBpICYgMSA/IDggOiAwKSApOwotICAgIH0KLQotICAgIEhbMF0gPSAoKChVU0hPUlQpcGl2WzBdKSA8PCA4KSArIHBpdlsxXTsKLSAgICBIWzFdID0gKCAoKFVTSE9SVCl0b0RzRnJvbURzKSA8PCA4KSB8IHBpdlsyXTsKLQotICAgIGZvciAoaT0wOyBpPDg7IGkrKykgewotICAgICAgICBIWzBdIF49IExbaV07ICAgICAgICAgICAvKiAxNi1iaXRzIG9mIGtleSBtYXRlcmlhbCAqLwotICAgICAgICB0bXAgICA9IF9TXyhIWzBdKTsgICAgICAvKiAxNngxNiBwZXJtdXRhdGlvbiAqLwotICAgICAgICBIWzBdICA9IHRtcCBeIEhbMV07ICAgICAvKiBzZXQgdXAgZm9yIG5leHQgcm91bmQgKi8KLSAgICAgICAgSFsxXSAgPSB0bXA7Ci0gICAgICAgIFJbaV0gID0gSFswXTsgICAgICAgICAgIC8qIHN0b3JlIGludG8ga2V5IGFycmF5ICAqLwotICAgIH0KLQotICAgIC8qIHN3ZWVwIGluIHRoZSBvdGhlciBkaXJlY3Rpb24gKi8KLSAgICB0bXA9TFswXTsKLSAgICBmb3IgKGk9NzsgaT4wOyBpLS0pIHsKLSAgICAgICAgUltpXSA9IHRtcCA9IHJvdExlZnRfMSh0bXApICsgUltpXTsKLSAgICB9Ci0KLSAgICAvKiBJViBvZiB0aGUgcGVybXV0ZWQga2V5IGlzIHVuY2hhbmdlZCAqLwotICAgIFBLWzBdID0gcGl2WzBdOwotICAgIFBLWzFdID0gcGl2WzFdOwotICAgIFBLWzJdID0gcGl2WzJdOwotCi0gICAgLyoga2V5IHBvcnRpb24gb2YgdGhlIHBlcm11dGVkIGtleSBpcyBjaGFuZ2VkICovCi0gICAgZm9yIChpPTM7IGk8MTY7IGkrKykgewotICAgICAgICBQS1tpXSA9IChVQ0hBUikgKFJbaT4+MV0gPj4gKGkgJiAxID8gOCA6IDApKTsKLSAgICB9Ci19Ci0KLS8qIHByZXBhcmUgZm9yIGNhbGN1bGF0aW9uIG9mIGEgbmV3IG1pYyAqLwotVk9JRCBSVE1QQ2tpcE1pY0luaXQoCi0gICAgSU4gIFBNSUNfQ09OVEVYVCAgICAgICAgcENvbnRleHQsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgQ0spCi17Ci0gICAgLyogcHJlcGFyZSBmb3IgbmV3IG1pYyBjYWxjdWxhdGlvbiAqLwotICAgIE5kaXNNb3ZlTWVtb3J5KHBDb250ZXh0LT5DSywgQ0ssIHNpemVvZihwQ29udGV4dC0+Q0spKTsKLSAgICBwQ29udGV4dC0+YWNjdW0gPSAwOwotICAgIHBDb250ZXh0LT5wb3NpdGlvbiA9IDA7Ci19Ci0KLS8qIGFkZCBzb21lIGJ5dGVzIHRvIHRoZSBtaWMgY2FsY3VsYXRpb24gKi8KLVZPSUQgUlRNUE1pY1VwZGF0ZSgKLSAgICBJTiAgUE1JQ19DT05URVhUICAgICAgICBwQ29udGV4dCwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBwT2N0ZXRzLAotICAgIElOICBJTlQgICAgICAgICAgICAgICAgIGxlbikKLXsKLSAgICBJTlQgICAgIGJ5dGVfcG9zaXRpb247Ci0gICAgVUxPTkcgICB2YWw7Ci0KLSAgICBieXRlX3Bvc2l0aW9uID0gKHBDb250ZXh0LT5wb3NpdGlvbiAmIDMpOwotICAgIHdoaWxlIChsZW4gPiAwKSB7Ci0gICAgICAgIC8qIGJ1aWxkIGEgMzItYml0IHdvcmQgZm9yIE1JQyBtdWx0aXBseSBhY2N1bXVsYXRlICovCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuOwotICAgICAgICAgICAgcENvbnRleHQtPnBhcnRbYnl0ZV9wb3NpdGlvbisrXSA9ICpwT2N0ZXRzKys7Ci0gICAgICAgICAgICBwQ29udGV4dC0+cG9zaXRpb24rKzsKLSAgICAgICAgICAgIGxlbi0tOwotICAgICAgICB9IHdoaWxlIChieXRlX3Bvc2l0aW9uIDwgNCk7Ci0gICAgICAgIC8qIGhhdmUgYSBmdWxsIDMyLWJpdCB3b3JkIHRvIHByb2Nlc3MgKi8KLSAgICAgICAgdmFsID0gR0VUQklHMzIoJnBDb250ZXh0LT5wYXJ0WzBdKTsKLSAgICAgICAgTUlDX0FDQ1VNKHZhbCk7Ci0gICAgICAgIGJ5dGVfcG9zaXRpb24gPSAwOwotICAgIH0KLX0KLQotVUxPTkcgUlRNUE1pY0dldENvZWZmaWNpZW50KAotICAgIElOICBQTUlDX0NPTlRFWFQgICAgICAgICBwQ29udGV4dCkKLXsKLSAgICBVQ0hBUiAgIGFlc19jb3VudGVyWzE2XTsKLSAgICBJTlQgICAgIGNvZWZmX3Bvc2l0aW9uOwotICAgIFVDSEFSICAgKnA7Ci0KLSAgICBjb2VmZl9wb3NpdGlvbiA9IChwQ29udGV4dC0+cG9zaXRpb24gLSAxKSA+PiAyOwotICAgIGlmICggKGNvZWZmX3Bvc2l0aW9uICYgMykgPT0gMCkgewotICAgICAgICAvKiBmZXRjaGluZyB0aGUgZmlyc3QgY29lZmZpY2llbnQgLS0gZ2V0IG5ldyAxNi1ieXRlIGFlcyBjb3VudGVyIG91dHB1dCAqLwotICAgICAgICB1MzIgY291bnRlciA9IChjb2VmZl9wb3NpdGlvbiA+PiAyKTsKLQotICAgICAgICAvKiBuZXcgY291bnRlciB2YWx1ZSAqLwotICAgICAgICBtZW1zZXQoJmFlc19jb3VudGVyWzBdLCAwLCBzaXplb2YoYWVzX2NvdW50ZXIpKTsKLSAgICAgICAgYWVzX2NvdW50ZXJbMTVdID0gKFVJTlQ4KShjb3VudGVyID4+IDApOwotICAgICAgICBhZXNfY291bnRlclsxNF0gPSAoVUlOVDgpKGNvdW50ZXIgPj4gOCk7Ci0gICAgICAgIGFlc19jb3VudGVyWzEzXSA9IChVSU5UOCkoY291bnRlciA+PiAxNik7Ci0gICAgICAgIGFlc19jb3VudGVyWzEyXSA9IChVSU5UOCkoY291bnRlciA+PiAyNCk7Ci0KLSAgICAgICAgUlRNUEFlc0VuY3J5cHQoJnBDb250ZXh0LT5DS1swXSwgJmFlc19jb3VudGVyWzBdLCBwQ29udGV4dC0+Y29lZmZpY2llbnQpOwotICAgIH0KLSAgICBwID0gJihwQ29udGV4dC0+Y29lZmZpY2llbnRbIChjb2VmZl9wb3NpdGlvbiAmIDMpIDw8IDIgXSk7Ci0gICAgcmV0dXJuIEdFVEJJRzMyKHApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIGFlczEyOGsxMjhkKCkgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUGVyZm9ybXMgYSAxMjggYml0IEFFUyBlbmNyeXB0IHdpdGggICovCi0vKiAxMjggYml0IGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotVk9JRCB4b3JfMTI4KAotICAgIElOICBQVUNIQVIgIGEsCi0gICAgSU4gIFBVQ0hBUiAgYiwKLSAgICBPVVQgUFVDSEFSICBvdXQpCi17Ci0gICAgSU5UIGk7Ci0KLSAgICBmb3IgKGk9MDtpPDE2OyBpKyspCi0gICAgewotICAgICAgICBvdXRbaV0gPSBhW2ldIF4gYltpXTsKLSAgICB9Ci19Ci0KLVVDSEFSIFJUTVBDa2lwU2JveCgKLSAgICBJTiAgVUNIQVIgICBhKQotewotICAgIHJldHVybiBTYm94VGFibGVbKGludClhXTsKLX0KLQotVk9JRCB4b3JfMzIoCi0gICAgSU4gIFBVQ0hBUiAgYSwKLSAgICBJTiAgUFVDSEFSICBiLAotICAgIE9VVCBQVUNIQVIgIG91dCkKLXsKLSAgICBJTlQgaTsKLQotICAgIGZvciAoaT0wO2k8NDsgaSsrKQotICAgIHsKLSAgICAgICAgb3V0W2ldID0gYVtpXSBeIGJbaV07Ci0gICAgfQotfQotCi1WT0lEIG5leHRfa2V5KAotICAgIElOICBQVUNIQVIgIGtleSwKLSAgICBJTiAgSU5UICAgICByb3VuZCkKLXsKLSAgICBVQ0hBUiAgICAgICByY29uOwotICAgIFVDSEFSICAgICAgIHNib3hfa2V5WzRdOwotICAgIFVDSEFSICAgICAgIHJjb25fdGFibGVbMTJdID0KLSAgICB7Ci0gICAgICAgIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsCi0gICAgICAgIDB4MWIsIDB4MzYsIDB4MzYsIDB4MzYKLSAgICB9OwotCi0gICAgc2JveF9rZXlbMF0gPSBSVE1QQ2tpcFNib3goa2V5WzEzXSk7Ci0gICAgc2JveF9rZXlbMV0gPSBSVE1QQ2tpcFNib3goa2V5WzE0XSk7Ci0gICAgc2JveF9rZXlbMl0gPSBSVE1QQ2tpcFNib3goa2V5WzE1XSk7Ci0gICAgc2JveF9rZXlbM10gPSBSVE1QQ2tpcFNib3goa2V5WzEyXSk7Ci0KLSAgICByY29uID0gcmNvbl90YWJsZVtyb3VuZF07Ci0KLSAgICB4b3JfMzIoJmtleVswXSwgc2JveF9rZXksICZrZXlbMF0pOwotICAgIGtleVswXSA9IGtleVswXSBeIHJjb247Ci0KLSAgICB4b3JfMzIoJmtleVs0XSwgJmtleVswXSwgJmtleVs0XSk7Ci0gICAgeG9yXzMyKCZrZXlbOF0sICZrZXlbNF0sICZrZXlbOF0pOwotICAgIHhvcl8zMigma2V5WzEyXSwgJmtleVs4XSwgJmtleVsxMl0pOwotfQotCi1WT0lEIGJ5dGVfc3ViKAotICAgIElOICBQVUNIQVIgIGluLAotICAgIE9VVCBQVUNIQVIgIG91dCkKLXsKLSAgICBJTlQgaTsKLQotICAgIGZvciAoaT0wOyBpPCAxNjsgaSsrKQotICAgIHsKLSAgICAgICAgb3V0W2ldID0gUlRNUENraXBTYm94KGluW2ldKTsKLSAgICB9Ci19Ci0KLVZPSUQgc2hpZnRfcm93KAotICAgIElOICBQVUNIQVIgIGluLAotICAgIE9VVCBQVUNIQVIgIG91dCkKLXsKLSAgICBvdXRbMF0gPSAgaW5bMF07Ci0gICAgb3V0WzFdID0gIGluWzVdOwotICAgIG91dFsyXSA9ICBpblsxMF07Ci0gICAgb3V0WzNdID0gIGluWzE1XTsKLSAgICBvdXRbNF0gPSAgaW5bNF07Ci0gICAgb3V0WzVdID0gIGluWzldOwotICAgIG91dFs2XSA9ICBpblsxNF07Ci0gICAgb3V0WzddID0gIGluWzNdOwotICAgIG91dFs4XSA9ICBpbls4XTsKLSAgICBvdXRbOV0gPSAgaW5bMTNdOwotICAgIG91dFsxMF0gPSBpblsyXTsKLSAgICBvdXRbMTFdID0gaW5bN107Ci0gICAgb3V0WzEyXSA9IGluWzEyXTsKLSAgICBvdXRbMTNdID0gaW5bMV07Ci0gICAgb3V0WzE0XSA9IGluWzZdOwotICAgIG91dFsxNV0gPSBpblsxMV07Ci19Ci0KLVZPSUQgbWl4X2NvbHVtbigKLSAgICBJTiAgUFVDSEFSICBpbiwKLSAgICBPVVQgUFVDSEFSICBvdXQpCi17Ci0gICAgSU5UICAgICAgICAgaTsKLSAgICBVQ0hBUiAgICAgICBhZGQxYls0XTsKLSAgICBVQ0hBUiAgICAgICBhZGQxYmY3WzRdOwotICAgIFVDSEFSICAgICAgIHJvdGxbNF07Ci0gICAgVUNIQVIgICAgICAgc3dhcF9oYWxmc1s0XTsKLSAgICBVQ0hBUiAgICAgICBhbmRmN1s0XTsKLSAgICBVQ0hBUiAgICAgICByb3RyWzRdOwotICAgIFVDSEFSICAgICAgIHRlbXBbNF07Ci0gICAgVUNIQVIgICAgICAgdGVtcGJbNF07Ci0KLSAgICBmb3IgKGk9MCA7IGk8NDsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKChpbltpXSAmIDB4ODApPT0gMHg4MCkKLSAgICAgICAgICAgIGFkZDFiW2ldID0gMHgxYjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYWRkMWJbaV0gPSAweDAwOwotICAgIH0KLQotICAgIHN3YXBfaGFsZnNbMF0gPSBpblsyXTsgICAgLyogU3dhcCBoYWxmcyAqLwotICAgIHN3YXBfaGFsZnNbMV0gPSBpblszXTsKLSAgICBzd2FwX2hhbGZzWzJdID0gaW5bMF07Ci0gICAgc3dhcF9oYWxmc1szXSA9IGluWzFdOwotCi0gICAgcm90bFswXSA9IGluWzNdOyAgICAgICAgLyogUm90YXRlIGxlZnQgOCBiaXRzICovCi0gICAgcm90bFsxXSA9IGluWzBdOwotICAgIHJvdGxbMl0gPSBpblsxXTsKLSAgICByb3RsWzNdID0gaW5bMl07Ci0KLSAgICBhbmRmN1swXSA9IGluWzBdICYgMHg3ZjsKLSAgICBhbmRmN1sxXSA9IGluWzFdICYgMHg3ZjsKLSAgICBhbmRmN1syXSA9IGluWzJdICYgMHg3ZjsKLSAgICBhbmRmN1szXSA9IGluWzNdICYgMHg3ZjsKLQotICAgIGZvciAoaSA9IDM7IGk+MDsgaS0tKSAgICAvKiBsb2dpY2FsIHNoaWZ0IGxlZnQgMSBiaXQgKi8KLSAgICB7Ci0gICAgICAgIGFuZGY3W2ldID0gYW5kZjdbaV0gPDwgMTsKLSAgICAgICAgaWYgKChhbmRmN1tpLTFdICYgMHg4MCkgPT0gMHg4MCkKLSAgICAgICAgewotICAgICAgICAgICAgYW5kZjdbaV0gPSAoYW5kZjdbaV0gfCAweDAxKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBhbmRmN1swXSA9IGFuZGY3WzBdIDw8IDE7Ci0gICAgYW5kZjdbMF0gPSBhbmRmN1swXSAmIDB4ZmU7Ci0KLSAgICB4b3JfMzIoYWRkMWIsIGFuZGY3LCBhZGQxYmY3KTsKLQotICAgIHhvcl8zMihpbiwgYWRkMWJmNywgcm90cik7Ci0KLSAgICB0ZW1wWzBdID0gcm90clswXTsgICAgICAgICAvKiBSb3RhdGUgcmlnaHQgOCBiaXRzICovCi0gICAgcm90clswXSA9IHJvdHJbMV07Ci0gICAgcm90clsxXSA9IHJvdHJbMl07Ci0gICAgcm90clsyXSA9IHJvdHJbM107Ci0gICAgcm90clszXSA9IHRlbXBbMF07Ci0KLSAgICB4b3JfMzIoYWRkMWJmNywgcm90ciwgdGVtcCk7Ci0gICAgeG9yXzMyKHN3YXBfaGFsZnMsIHJvdGwsdGVtcGIpOwotICAgIHhvcl8zMih0ZW1wLCB0ZW1wYiwgb3V0KTsKLX0KLQotVk9JRCBSVE1QQWVzRW5jcnlwdCgKLSAgICBJTiAgUFVDSEFSICBrZXksCi0gICAgSU4gIFBVQ0hBUiAgZGF0YSwKLSAgICBJTiAgUFVDSEFSICBjaXBoZXJ0ZXh0KQotewotICAgIElOVCAgICAgICAgICAgICByb3VuZDsKLSAgICBJTlQgICAgICAgICAgICAgaTsKLSAgICBVQ0hBUiAgICAgICAgICAgaW50ZXJtZWRpYXRlYVsxNl07Ci0gICAgVUNIQVIgICAgICAgICAgIGludGVybWVkaWF0ZWJbMTZdOwotICAgIFVDSEFSICAgICAgICAgICByb3VuZF9rZXlbMTZdOwotCi0gICAgZm9yKGk9MDsgaTwxNjsgaSsrKSByb3VuZF9rZXlbaV0gPSBrZXlbaV07Ci0KLSAgICBmb3IgKHJvdW5kID0gMDsgcm91bmQgPCAxMTsgcm91bmQrKykKLSAgICB7Ci0gICAgICAgIGlmIChyb3VuZCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICB4b3JfMTI4KHJvdW5kX2tleSwgZGF0YSwgY2lwaGVydGV4dCk7Ci0gICAgICAgICAgICBuZXh0X2tleShyb3VuZF9rZXksIHJvdW5kKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChyb3VuZCA9PSAxMCkKLSAgICAgICAgewotICAgICAgICAgICAgYnl0ZV9zdWIoY2lwaGVydGV4dCwgaW50ZXJtZWRpYXRlYSk7Ci0gICAgICAgICAgICBzaGlmdF9yb3coaW50ZXJtZWRpYXRlYSwgaW50ZXJtZWRpYXRlYik7Ci0gICAgICAgICAgICB4b3JfMTI4KGludGVybWVkaWF0ZWIsIHJvdW5kX2tleSwgY2lwaGVydGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAgICAvKiAxIC0gOSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBieXRlX3N1YihjaXBoZXJ0ZXh0LCBpbnRlcm1lZGlhdGVhKTsKLSAgICAgICAgICAgIHNoaWZ0X3JvdyhpbnRlcm1lZGlhdGVhLCBpbnRlcm1lZGlhdGViKTsKLSAgICAgICAgICAgIG1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbMF0sICZpbnRlcm1lZGlhdGVhWzBdKTsKLSAgICAgICAgICAgIG1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbNF0sICZpbnRlcm1lZGlhdGVhWzRdKTsKLSAgICAgICAgICAgIG1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbOF0sICZpbnRlcm1lZGlhdGVhWzhdKTsKLSAgICAgICAgICAgIG1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbMTJdLCAmaW50ZXJtZWRpYXRlYVsxMl0pOwotICAgICAgICAgICAgeG9yXzEyOChpbnRlcm1lZGlhdGVhLCByb3VuZF9rZXksIGNpcGhlcnRleHQpOwotICAgICAgICAgICAgbmV4dF9rZXkocm91bmRfa2V5LCByb3VuZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotLyogY2FsY3VsYXRlIHRoZSBtaWMgKi8KLVZPSUQgUlRNUE1pY0ZpbmFsKAotICAgIElOICBQTUlDX0NPTlRFWFQgICAgcENvbnRleHQsCi0gICAgT1VUIFVDSEFSICAgICAgICAgICBkaWdlc3RbNF0pCi17Ci0gICAgSU5UICAgICAgICAgICAgIGJ5dGVfcG9zaXRpb247Ci0gICAgVUxPTkcgICAgICAgICAgIHZhbDsKLSAgICBVTE9OR0xPTkcgICAgICAgc3VtLCB1dG1wOwotICAgIExPTkdMT05HICAgICAgICBzdG1wOwotCi0gICAgLyogZGVhbCB3aXRoIHBhcnRpYWwgMzItYml0IHdvcmQgbGVmdCBvdmVyIGZyb20gbGFzdCB1cGRhdGUgKi8KLSAgICBpZiAoIChieXRlX3Bvc2l0aW9uID0gKHBDb250ZXh0LT5wb3NpdGlvbiAmIDMpKSAhPSAwKSB7Ci0gICAgICAgIC8qIGhhdmUgYSBwYXJ0aWFsIHdvcmQgaW4gcGFydCB0byBkZWFsIHdpdGggLS0gemVybyB1bnVzZWQgYnl0ZXMgKi8KLSAgICAgICAgZG8gewotICAgICAgICAgICAgcENvbnRleHQtPnBhcnRbYnl0ZV9wb3NpdGlvbisrXSA9IDA7Ci0gICAgICAgICAgICBwQ29udGV4dC0+cG9zaXRpb24rKzsKLSAgICAgICAgfSB3aGlsZSAoYnl0ZV9wb3NpdGlvbiA8IDQpOwotICAgICAgICB2YWwgPSBHRVRCSUczMigmcENvbnRleHQtPnBhcnRbMF0pOwotICAgICAgICBNSUNfQUNDVU0odmFsKTsKLSAgICB9Ci0KLSAgICAvKiByZWR1Y2UgdGhlIGFjY3VtdWxhdGVkIHU2NCB0byBhIDMyLWJpdCBNSUMgKi8KLSAgICBzdW0gPSBwQ29udGV4dC0+YWNjdW07Ci0gICAgc3RtcCA9IChzdW0gICYgMHhmZmZmZmZmZkwpIC0gKChzdW0gPj4gMzIpICAqIDE1KTsKLSAgICB1dG1wID0gKHN0bXAgJiAweGZmZmZmZmZmTCkgLSAoKHN0bXAgPj4gMzIpICogMTUpOwotICAgIHN1bSA9IHV0bXAgJiAweGZmZmZmZmZmTDsKLSAgICBpZiAodXRtcCA+IDB4MTAwMDAwMDBmTCkKLSAgICAgICAgc3VtIC09IDE1OwotCi0gICAgdmFsID0gKFVMT05HKXN1bTsKLSAgICBkaWdlc3RbMF0gPSAoVUNIQVIpKCh2YWw+PjI0KSAmIDB4RkYpOwotICAgIGRpZ2VzdFsxXSA9IChVQ0hBUikgKCh2YWw+PjE2KSAmIDB4RkYpOwotICAgIGRpZ2VzdFsyXSA9IChVQ0hBUikgKCh2YWw+PjgpICYgMHhGRik7Ci0gICAgZGlnZXN0WzNdID0gKFVDSEFSKSgodmFsPj4wKSAmIDB4RkYpOwotfQotCi1WT0lEIFJUTVBDa2lwSW5zZXJ0Q01JQygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBPVVQgUFVDSEFSICAgICAgICAgIHBNSUMsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBwODAyMTFoZHIsCi0gICAgSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0LAotICAgIElOICBQQ0lQSEVSX0tFWSAgICAgcEtleSwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIG1pY19zbmFwKQotewotCVBBQ0tFVF9JTkZPCQlQYWNrZXRJbmZvOwotCVBVQ0hBUgkJCXBTcmNCdWZWQTsKLQlVTE9ORwkJCVNyY0J1ZkxlbjsKLSAgICBQVUNIQVIgICAgICAgICAgcERBLCBwU0EsIHBQcm90bzsKLSAgICBVQ0hBUiAgICAgICAgICAgYmlnZXRobGVuWzJdOwotCVVDSEFSCQkJY2tpcF9ja1sxNl07Ci0gICAgTUlDX0NPTlRFWFQgICAgIG1pY19jdHg7Ci0gICAgVVNIT1JUICAgICAgICAgIHBheWxvYWRsZW47Ci0JVUNIQVIJCQlpOwotCi0JaWYgKHBLZXkgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UX0VSUigoIlJUTVBDa2lwSW5zZXJ0Q01JQywgQmVmb3JlIHRvIGZvcm0gdGhlIENLSVAga2V5IChDSyksIHBLZXkgY2FuJ3QgYmUgTlVMTFxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0gICAgc3dpdGNoICgqKHA4MDIxMWhkcisxKSAmIDMpCi0gICAgewotICAgICAgICBjYXNlIDA6IC8qIEZyb21Ecz0wLCBUb0RzPTAgKi8KLSAgICAgICAgICAgIHBEQSA9IHA4MDIxMWhkcis0OwotICAgICAgICAgICAgcFNBID0gcDgwMjExaGRyKzEwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTogLyogRnJvbURzPTAsIFRvRHM9MSAqLwotICAgICAgICAgICAgcERBID0gcDgwMjExaGRyKzE2OwotICAgICAgICAgICAgcFNBID0gcDgwMjExaGRyKzEwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjogLyogRnJvbURzPTEsIFRvRHM9MCAqLwotICAgICAgICAgICAgcERBID0gcDgwMjExaGRyKzQ7Ci0gICAgICAgICAgICBwU0EgPSBwODAyMTFoZHIrMTY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOiAvKiBGcm9tRHM9MSwgVG9Ecz0xICovCi0gICAgICAgICAgICBwREEgPSBwODAyMTFoZHIrMTY7Ci0gICAgICAgICAgICBwU0EgPSBwODAyMTFoZHIrMjQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLQlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7Ci0KLSAgICBpZiAoU3JjQnVmTGVuIDwgTEVOR1RIXzgwMl8zKQotICAgICAgICByZXR1cm47Ci0KLSAgICBwUHJvdG8gPSBwU3JjQnVmVkEgKyAxMjsKLSAgICBwYXlsb2FkbGVuID0gUGFja2V0SW5mby5Ub3RhbFBhY2tldExlbmd0aCAtIExFTkdUSF84MDJfMyArIDE4OyAvLyBDS0lQX0xMQyg4KStDTUlDKDQpK1R4U0VRKDQpK1BST1RPKDIpPTE4Ci0KLSAgICBiaWdldGhsZW5bMF0gPSAodW5zaWduZWQgY2hhcikocGF5bG9hZGxlbiA+PiA4KTsKLSAgICBiaWdldGhsZW5bMV0gPSAodW5zaWduZWQgY2hhcilwYXlsb2FkbGVuOwotCi0JLy8KLQkvLyBFbmNyeXB0aW9uIEtleSBleHBhbnNpb24gdG8gZm9ybSB0aGUgQ0tJUCBLZXkgKENLSVBfQ0spLgotCS8vCi0JaWYgKHBLZXktPktleUxlbiA8IDE2KQotCXsKLQkJZm9yKGkgPSAwOyBpIDwgKDE2IC8gcEtleS0+S2V5TGVuKTsgaSsrKQotCQl7Ci0JCQlOZGlzTW92ZU1lbW9yeShja2lwX2NrICsgaSAqIHBLZXktPktleUxlbiwKLQkJCQkJCQlwS2V5LT5LZXksCi0JCQkJCQkJcEtleS0+S2V5TGVuKTsKLQkJfQotCQlOZGlzTW92ZU1lbW9yeShja2lwX2NrICsgaSAqIHBLZXktPktleUxlbiwKLQkJCQkJCXBLZXktPktleSwKLQkJCQkJCTE2IC0gKGkgKiBwS2V5LT5LZXlMZW4pKTsKLQl9Ci0JZWxzZQotCXsKLQkJTmRpc01vdmVNZW1vcnkoY2tpcF9jaywgcEtleS0+S2V5LCBwS2V5LT5LZXlMZW4pOwotCX0KLSAgICBSVE1QQ2tpcE1pY0luaXQoJm1pY19jdHgsIGNraXBfY2spOwotICAgIFJUTVBNaWNVcGRhdGUoJm1pY19jdHgsIHBEQSwgTUFDX0FERFJfTEVOKTsgICAgICAgICAgICAvLyBNSUMgPC0tIERBCi0gICAgUlRNUE1pY1VwZGF0ZSgmbWljX2N0eCwgcFNBLCBNQUNfQUREUl9MRU4pOyAgICAgICAgICAgIC8vIE1JQyA8LS0gU0EKLSAgICBSVE1QTWljVXBkYXRlKCZtaWNfY3R4LCBiaWdldGhsZW4sIDIpOyAgICAgICAgICAgICAgICAgLy8gTUlDIDwtLSBwYXlsb2FkIGxlbmd0aCBzdGFydGluZyBmcm9tIENLSVAgU05BUAotICAgIFJUTVBNaWNVcGRhdGUoJm1pY19jdHgsIG1pY19zbmFwLCA4KTsgICAgICAgICAgICAgICAgICAvLyBNSUMgPC0tIHNuYXAgaGVhZGVyCi0gICAgUlRNUE1pY1VwZGF0ZSgmbWljX2N0eCwgcEFkLT5TdGFDZmcuVHhTRVEsIDQpOyAgIC8vIE1JQyA8LS0gVHhTRVEKLSAgICBSVE1QTWljVXBkYXRlKCZtaWNfY3R4LCBwUHJvdG8sIDIpOyAgICAgICAgICAgICAgICAgICAgLy8gTUlDIDwtLSBQcm90b2NvbAotCi0gICAgcFNyY0J1ZlZBICs9IExFTkdUSF84MDJfMzsKLSAgICBTcmNCdWZMZW4gLT0gTEVOR1RIXzgwMl8zOwotCi0gICAgLy8gTWljIDwtLSBvcmlnaW5hbCBwYXlsb2FkLiBsb29wIHVudGlsIGFsbCBwYXlsb2FkIHByb2Nlc3NlZAotICAgIGRvCi0gICAgewotICAgICAgICBpZiAoU3JjQnVmTGVuID4gMCkKLSAgICAgICAgICAgIFJUTVBNaWNVcGRhdGUoJm1pY19jdHgsIHBTcmNCdWZWQSwgU3JjQnVmTGVuKTsKLQotCQlOZGlzR2V0TmV4dEJ1ZmZlcihQYWNrZXRJbmZvLnBGaXJzdEJ1ZmZlciwgJlBhY2tldEluZm8ucEZpcnN0QnVmZmVyKTsKLSAgICAgICAgaWYgKFBhY2tldEluZm8ucEZpcnN0QnVmZmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBORElTX1FVRVJZX0JVRkZFUihQYWNrZXRJbmZvLnBGaXJzdEJ1ZmZlciwgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfSB3aGlsZSAoVFJVRSk7Ci0KLSAgICBSVE1QTWljRmluYWwoJm1pY19jdHgsIHBNSUMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIE1JQwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvcnRtcF9kYXRhLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS9ydG1wX2RhdGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU5MTM2NC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS9ydG1wX2RhdGEuYworKysgL2Rldi9udWxsCkBAIC0xLDI2NjEgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQlydG1wX2RhdGEuYwotCi0JQWJzdHJhY3Q6Ci0JRGF0YSBwYXRoIHN1YnJvdXRpbmVzCi0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotVk9JRCBTVEFSeEVBUE9MRnJhbWVJbmRpY2F0ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCi17Ci0JUFJUMjhYWF9SWERfU1RSVUMJcFJ4RCA9ICYocFJ4QmxrLT5SeEQpOwotCVBSWFdJX1NUUlVDCQlwUnhXSSA9IHBSeEJsay0+cFJ4V0k7Ci0JVUNIQVIJCQkqcFRtcEJ1ZjsKLQotCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApCi0JewotCQkvLyBBbGwgRUFQb0wgZnJhbWVzIGhhdmUgdG8gcGFzcyB0byB1cHBlciBsYXllciAoZXguIFdQQV9TVVBQTElDQU5UIGRhZW1vbikKLQkJLy8gVEJEIDogcHJvY2VzcyBmcmFnbWVudGVkIEVBUG9sIGZyYW1lcwotCQl7Ci0JCQkvLyBJbiA4MDIuMXggbW9kZSwgaWYgdGhlIHJlY2VpdmVkIGZyYW1lIGlzIEVBUC1TVUNDRVNTIHBhY2tldCwgdHVybiBvbiB0aGUgUG9ydFNlY3VyZWQgdmFyaWFibGUKLQkJCWlmICggcEFkLT5TdGFDZmcuSUVFRTgwMjFYID09IFRSVUUgJiYKLQkJCQkgKEVBUF9DT0RFX1NVQ0NFU1MgPT0gV3BhQ2hlY2tFYXBDb2RlKHBBZCwgcFJ4QmxrLT5wRGF0YSwgcFJ4QmxrLT5EYXRhU2l6ZSwgTEVOR1RIXzgwMl8xX0gpKSkKLQkJCXsKLQkJCQlQVUNIQVIJS2V5OwotCQkJCVVDSEFSCUNpcGhlckFsZzsKLQkJCQlpbnQgICAgIGlkeCA9IDA7Ci0KLQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVAtU1VDQ0VTUyBQYWNrZXRcbiIpKTsKLQkJCQkvL3BBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7Ci0JCQkJU1RBX1BPUlRfU0VDVVJFRChwQWQpOwotCi0gICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxeF9yZXF1aXJlZF9rZXlzID09IEZBTFNFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWR4ID0gcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5SWQ7Ci0gICAgICAgICAgICAgICAgICAgIENpcGhlckFsZyA9IHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLkNpcGhlckFsZzsKLQkJCQkJS2V5ID0gcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5OwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXlMZW4gPiAwKQotCQkJCXsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07Ci0KLQkJCQkJCS8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCi0JCQkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKLQotCQkJCQkJLy8gQXNzaWduIGdyb3VwIGtleSBpbmZvCi0JCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgaWR4LCBDaXBoZXJBbGcsIE5VTEwpOwotCi0JCQkJCQkvLyBBc3NpZ24gcGFpcndpc2Uga2V5IGluZm8KLQkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgcEVudHJ5KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCQkJCQkJLy8gRm9yIFByZXZlbnRpbmcgU2hhcmRLZXkgVGFibGUgaXMgY2xlYXJlZCBieSByZW1vdmUga2V5IHByb2NlZHVyZS4KLQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA9IHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleUxlbjsKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5LAotCQkJCQkJCQkJICAgcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5LAotCQkJCQkJCQkJICAgcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5TGVuKTsKLQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JZWxzZQotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQl7Ci0JCS8vIFNwZWNpYWwgREFUQSBmcmFtZSB0aGF0IGhhcyB0byBwYXNzIHRvIE1MTUUKLQkJLy8JIDEuIENpc2NvIEFpcm9uZXQgZnJhbWVzIGZvciBDQ1gyLiBXZSBuZWVkIHBhc3MgaXQgdG8gTUxNRSBmb3Igc3BlY2lhbCBwcm9jZXNzCi0JCS8vCSAyLiBFQVBPTCBoYW5kc2hha2luZyBmcmFtZXMgd2hlbiBkcml2ZXIgc3VwcGxpY2FudCBlbmFibGVkLCBwYXNzIHRvIE1MTUUgZm9yIHNwZWNpYWwgcHJvY2VzcwotCQl7Ci0JCQlwVG1wQnVmID0gcFJ4QmxrLT5wRGF0YSAtIExFTkdUSF84MDJfMTE7Ci0JCQlOZGlzTW92ZU1lbW9yeShwVG1wQnVmLCBwUnhCbGstPnBIZWFkZXIsIExFTkdUSF84MDJfMTEpOwotCQkJUkVQT1JUX01HTVRfRlJBTUVfVE9fTUxNRShwQWQsIHBSeFdJLT5XaXJlbGVzc0NsaUlELCBwVG1wQnVmLCBwUnhCbGstPkRhdGFTaXplICsgTEVOR1RIXzgwMl8xMSwgcFJ4V0ktPlJTU0kwLCBwUnhXSS0+UlNTSTEsIHBSeFdJLT5SU1NJMiwgcFJ4RC0+UGxjcFNpZ25hbCk7Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiISEhIHJlcG9ydCBFQVBPTC9BSVJPTkVUIERBVEEgdG8gTUxNRSAobGVuPSVkKSAhISFcbiIsIHBSeEJsay0+RGF0YVNpemUpKTsKLQkJfQotCX0KLQotCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JcmV0dXJuOwotCi19Ci0KLVZPSUQgU1RBUnhEYXRhRnJhbWVBbm5vdW5jZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCi17Ci0KLQkvLyBub24tRUFQIGZyYW1lCi0JaWYgKCFSVE1QQ2hlY2tXUEFmcmFtZShwQWQsIHBFbnRyeSwgcFJ4QmxrLT5wRGF0YSwgcFJ4QmxrLT5EYXRhU2l6ZSwgRnJvbVdoaWNoQlNTSUQpKQotCXsKLQotCQl7Ci0JCQkvLyBkcm9wIGFsbCBub24tRUFQIERBVEEgZnJhbWUgYmVmb3JlCi0JCQkvLyB0aGlzIGNsaWVudCdzIFBvcnQtQWNjZXNzLUNvbnRyb2wgaXMgc2VjdXJlZAotCQkJaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuV2VwKQotCQkJewotCQkJCS8vIHVuc3VwcG9ydGVkIGNpcGhlciBzdWl0ZQotCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkKLQkJCQl7Ci0JCQkJCS8vIHJlbGVhc2UgcGFja2V0Ci0JCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gZW5jcnlwdGlvbiBpbi11c2UgYnV0IHJlY2VpdmUgYSBub24tRUFQT0wgY2xlYXIgdGV4dCBmcmFtZSwgZHJvcCBpdAotCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpICYmCi0JCQkJCShwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQotCQkJCXsKLQkJCQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCQlSWF9CTEtfQ0xFQVJfRkxBRyhwUnhCbGssIGZSWF9FQVApOwotCi0KLQkJaWYgKCFSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FSQUxJTkspKQotCQl7Ci0JCQkvLyBOb3JtYWwgbGVnYWN5LCBBTVBEVSBvciBBTVNEVQotCQkJQ21tUnhub25SYWxpbmtGcmFtZUluZGljYXRlKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0KLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIEFSQUxJTksKLQkJCUNtbVJ4UmFsaW5rRnJhbWVJbmRpY2F0ZShwQWQsIHBFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0JCX0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJUlhfQkxLX0NMRUFSX0ZMQUcocFJ4QmxrLCBmUlhfRExTKTsKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQl9Ci0JZWxzZQotCXsKLQkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0VBUCk7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWlmIChSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNUERVKSAmJiAocEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID09IDApKQotCQl7Ci0JCQlJbmRpY2F0ZV9BTVBEVV9QYWNrZXQocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKLQkJfQotCQllbHNlCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCXsKLQkJCS8vIERldGVybWluIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgRUFQIGZyYW1lCi0JCQkvLyAgdG8gV1BBIHN0YXRlIG1hY2hpbmUgb3IgdXBwZXIgbGF5ZXIKLQkJCVNUQVJ4RUFQT0xGcmFtZUluZGljYXRlKHBBZCwgcEVudHJ5LCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKLQkJfQotCX0KLX0KLQotCi0vLyBGb3IgVEtJUCBmcmFtZSwgY2FsY3VsYXRlIHRoZSBNSUMgdmFsdWUKLUJPT0xFQU4gU1RBQ2hlY2tUa2lwTUlDVmFsdWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCi0JSU4JUlhfQkxLCQkJKnBSeEJsaykKLXsKLQlQSEVBREVSXzgwMl8xMQlwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOwotCVVDSEFSCQkJKnBEYXRhID0gcFJ4QmxrLT5wRGF0YTsKLQlVU0hPUlQJCQlEYXRhU2l6ZSA9IHBSeEJsay0+RGF0YVNpemU7Ci0JVUNIQVIJCQlVc2VyUHJpb3JpdHkgPSBwUnhCbGstPlVzZXJQcmlvcml0eTsKLQlQQ0lQSEVSX0tFWQkJcFdwYUtleTsKLQlVQ0hBUgkJCSpwREEsICpwU0E7Ci0KLQlwV3BhS2V5ID0gJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BSeEJsay0+cFJ4V0ktPktleUluZGV4XTsKLQotCXBEQSA9IHBIZWFkZXItPkFkZHIxOwotCWlmIChSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0lORlJBKSkKLQl7Ci0JCXBTQSA9IHBIZWFkZXItPkFkZHIzOwotCX0KLQllbHNlCi0JewotCQlwU0EgPSBwSGVhZGVyLT5BZGRyMjsKLQl9Ci0KLQlpZiAoUlRNUFRraXBDb21wYXJlTUlDVmFsdWUocEFkLAotCQkJCQkJCQlwRGF0YSwKLQkJCQkJCQkJcERBLAotCQkJCQkJCQlwU0EsCi0JCQkJCQkJCXBXcGFLZXktPlJ4TWljLAotCQkJCQkJCQlVc2VyUHJpb3JpdHksCi0JCQkJCQkJCURhdGFTaXplKSA9PSBGQUxTRSkKLQl7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIlJ4IE1JQyBWYWx1ZSBlcnJvciAyXG4iKSk7Ci0KLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0JCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApCi0JCXsKLQkJCVdwYVNlbmRNaWNGYWlsdXJlVG9XcGFTdXBwbGljYW50KHBBZCwgKHBXcGFLZXktPlR5cGUgPT0gUEFJUldJU0VLRVkpID8gVFJVRSA6IEZBTFNFKTsKLQkJfQotCQllbHNlCi0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCQl7Ci0JCQlSVE1QUmVwb3J0TWljRXJyb3IocEFkLCBwV3BhS2V5KTsKLQkJfQotCi0JCS8vIHJlbGVhc2UgcGFja2V0Ci0JCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vLwotLy8gQWxsIFJ4IHJvdXRpbmVzIHVzZSBSWF9CTEsgc3RydWN0dXJlIHRvIGhhbmRlIHJ4IGV2ZW50cwotLy8gSXQgaXMgdmVyeSBpbXBvcnRhbnQgdG8gYnVpbGQgcFJ4QmxrIGF0dHJpYnV0ZXMKLS8vICAxLiBwSGVhZGVyIHBvaW50ZXIgdG8gODAyLjExIEhlYWRlcgotLy8gIDIuIHBEYXRhIHBvaW50ZXIgdG8gcGF5bG9hZCBpbmNsdWRpbmcgTExDIChqdXN0IHNraXAgSGVhZGVyKQotLy8gIDMuIHNldCBwYXlsb2FkIHNpemUgaW5jbHVkaW5nIExMQyB0byBEYXRhU2l6ZQotLy8gIDQuIHNldCBzb21lIGZsYWdzIHdpdGggUlhfQkxLX1NFVF9GTEFHKCkKLS8vCi1WT0lEIFNUQUhhbmRsZVJ4RGF0YUZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGspCi17Ci0JUFJUMjhYWF9SWERfU1RSVUMJCQkJcFJ4RCA9ICYocFJ4QmxrLT5SeEQpOwotCVBSWFdJX1NUUlVDCQkJCQkJcFJ4V0kgPSBwUnhCbGstPnBSeFdJOwotCVBIRUFERVJfODAyXzExCQkJCQlwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOwotCVBORElTX1BBQ0tFVAkJCQkJcFJ4UGFja2V0ID0gcFJ4QmxrLT5wUnhQYWNrZXQ7Ci0JQk9PTEVBTgkJCQkJCQliRnJhZ21lbnQgPSBGQUxTRTsKLQlNQUNfVEFCTEVfRU5UUlkJCQkJKnBFbnRyeSA9IE5VTEw7Ci0JVUNIQVIJCQkJCQkJRnJvbVdoaWNoQlNTSUQgPSBCU1MwOwotCVVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlclByaW9yaXR5ID0gMDsKLQotCXsKLQkJLy8gYmVmb3JlIExJTksgVVAsIGFsbCBEQVRBIGZyYW1lcyBhcmUgcmVqZWN0ZWQKLQkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCi0JCXsKLQkJCS8vIHJlbGVhc2UgcGFja2V0Ci0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCXJldHVybjsKLQkJfQotCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCS8vaWYgKChwSGVhZGVyLT5GQy5GckRzID09IDApICYmIChwSGVhZGVyLT5GQy5Ub0RzID09IDApKQotCQlpZiAoUlRNUFJjdkZyYW1lRExTQ2hlY2socEFkLCBwSGVhZGVyLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50LCBwUnhEKSkKLQkJewotCQkJcmV0dXJuOwotCQl9Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLQkJLy8gRHJvcCBub3QgbXkgQlNTIGZyYW1lcwotCQlpZiAocFJ4RC0+TXlCc3MgPT0gMCkKLQkJewotCQkJewotCQkJCS8vIHJlbGVhc2UgcGFja2V0Ci0JCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCsrOwotCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlICYmIChwSGVhZGVyLT5GQy5TdWJUeXBlICYgMHgwOCkpCi0JCXsKLQkJCVVDSEFSICpwRGF0YTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0lORk8sKCJiQVBTRENhcGFibGVcbiIpKTsKLQotCQkJLy8gUW9zIGJpdCA0Ci0JCQlwRGF0YSA9IChQVUNIQVIpcEhlYWRlciArIExFTkdUSF84MDJfMTE7Ci0JCQlpZiAoKCpwRGF0YSA+PiA0KSAmIDB4MDEpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfSU5GTywoIlJ4RG9uZS0gUmN2IEVPU1AgZnJhbWUsIGRyaXZlciBtYXkgZmFsbCBpbnRvIHNsZWVwXG4iKSk7Ci0JCQkJcEFkLT5Db21tb25DZmcuYkluU2VydmljZVBlcmlvZCA9IEZBTFNFOwotCi0JCQkJLy8gRm9yY2UgZHJpdmVyIHRvIGZhbGwgaW50byBzbGVlcCBtb2RlIHdoZW4gcmN2IEVPU1AgZnJhbWUKLQkJCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0JCQkJewotCQkJCQlVU0hPUlQgIFRidHROdW1Ub05leHRXYWtlVXA7Ci0JCQkJCVVTSE9SVCAgTmV4dER0aW0gPSBwQWQtPlN0YUNmZy5EdGltUGVyaW9kOwotCQkJCQlVTE9ORyAgIE5vdzsKLQotCQkJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwotCQkJCQlOZXh0RHRpbSAtPSAoVVNIT1JUKShOb3cgLSBwQWQtPlN0YUNmZy5MYXN0QmVhY29uUnhUaW1lKS9wQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2Q7Ci0KLQkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudDsKLQkJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKSAmJiAoVGJ0dE51bVRvTmV4dFdha2VVcCA+IE5leHREdGltKSkKLQkJCQkJCVRidHROdW1Ub05leHRXYWtlVXAgPSBOZXh0RHRpbTsKLQotCQkJCQlSVE1QX1NFVF9QU01fQklUKHBBZCwgUFdSX1NBVkUpOwotCQkJCQkvLyBpZiBXTU0tQVBTRCBpcyBmYWlsZWQsIHRyeSB0byBkaXNhYmxlIGZvbGxvd2luZyBsaW5lCi0JCQkJCUFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoKHBIZWFkZXItPkZDLk1vcmVEYXRhKSAmJiAocEFkLT5Db21tb25DZmcuYkluU2VydmljZVBlcmlvZCkpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTZW5kaW5nIGFub3RoZXIgdHJpZ2dlciBmcmFtZSB3aGVuIE1vcmUgRGF0YSBiaXQgaXMgc2V0IHRvIDFcbiIpKTsKLQkJCX0KLQkJfQotCi0JCS8vIERyb3AgTlVMTCwgQ0YtQUNLKG5vIGRhdGEpLCBDRi1QT0xMKG5vIGRhdGEpLCBhbmQgQ0YtQUNLK0NGLVBPTEwobm8gZGF0YSkgZGF0YSBmcmFtZQotCQlpZiAoKHBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA0KSkgLy8gYml0IDIgOiBubyBEQVRBCi0JCXsKLQkJCS8vIHJlbGVhc2UgcGFja2V0Ci0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCXJldHVybjsKLQkJfQotCi0JICAgIC8vIERyb3Agbm90IG15IEJTUyBmcmFtZSAod2UgY2FuIG5vdCBvbmx5IGNoZWNrIHRoZSBNeUJzcyBiaXQgaW4gUnhEKQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCSAgICBpZiAoIXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQotCSAgICB7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0JCWlmIChJTkZSQV9PTihwQWQpKQotCQl7Ci0JCQkvLyBJbmZyYXN0cnVjdHVyZSBtb2RlLCBjaGVjayBhZGRyZXNzIDIgZm9yIEJTU0lECi0JCQlpZiAoIVJUTVBFcXVhbE1lbW9yeSgmcEhlYWRlci0+QWRkcjIsICZwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgNikpCi0JCQl7Ci0JCQkJLy8gUmVjZWl2ZSBmcmFtZSBub3QgbXkgQlNTSUQKLQkgICAgICAgICAgICAvLyByZWxlYXNlIHBhY2tldAotCSAgICAgICAgICAgIFJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQllbHNlCS8vIEFkLUhvYyBtb2RlIG9yIE5vdCBhc3NvY2lhdGVkCi0JCXsKLQkJCS8vIEFkLUhvYyBtb2RlLCBjaGVjayBhZGRyZXNzIDMgZm9yIEJTU0lECi0JCQlpZiAoIVJUTVBFcXVhbE1lbW9yeSgmcEhlYWRlci0+QWRkcjMsICZwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgNikpCi0JCQl7Ci0JCQkJLy8gUmVjZWl2ZSBmcmFtZSBub3QgbXkgQlNTSUQKLQkgICAgICAgICAgICAvLyByZWxlYXNlIHBhY2tldAotCSAgICAgICAgICAgIFJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCSAgICB9Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLQkJLy8KLQkJLy8gZmluZCBwRW50cnkKLQkJLy8KLQkJaWYgKHBSeFdJLT5XaXJlbGVzc0NsaUlEIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpCi0JCXsKLQkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BSeFdJLT5XaXJlbGVzc0NsaUlEXTsKLQotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gMS4gcmVsZWFzZSBwYWNrZXQgaWYgaW5mcmEgbW9kZQotCQkJLy8gMi4gbmV3IGEgcEVudHJ5IGlmIGFkLWhvYyBtb2RlCi0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGluZnJhIG9yIGFkLWhvYwotCQlpZiAoSU5GUkFfT04ocEFkKSkKLQkJewotCQkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0lORlJBKTsKLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJCWlmICgocEhlYWRlci0+RkMuRnJEcyA9PSAwKSAmJiAocEhlYWRlci0+RkMuVG9EcyA9PSAwKSkKLQkJCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfRExTKTsKLQkJCWVsc2UKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQkJCUFTU0VSVChwUnhXSS0+V2lyZWxlc3NDbGlJRCA9PSBCU1NJRF9XQ0lEKTsKLQkJfQotCi0JCS8vIGNoZWNrIEF0aGVyb3MgQ2xpZW50Ci0JCWlmICgocEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9PSBGQUxTRSkgJiYgIChwUnhELT5BTVBEVSA9PSAxKSAmJiAocEhlYWRlci0+RkMuUmV0cnkgKSkKLQkJewotCQkJcEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9IFRSVUU7Ci0JCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJDdXJyZW50QXRoZXJvcyA9IFRSVUU7Ci0JCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJMYXN0QXRoZXJvcyA9IFRSVUU7Ci0JCQlpZiAoIVNUQV9BRVNfT04ocEFkKSkKLQkJCXsKLQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIDgsIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgRkFMU0UpOwotCQkJfQotCQl9Ci0JfQotCi0JcFJ4QmxrLT5wRGF0YSA9IChVQ0hBUiAqKXBIZWFkZXI7Ci0KLQkvLwotCS8vIHVwZGF0ZSBSeEJsay0+cERhdGEsIERhdGFTaXplCi0JLy8gODAyLjExIEhlYWRlciwgUU9TLCBIVEMsIEh3IFBhZGRpbmcKLQkvLwotCi0JLy8gMS4gc2tpcCA4MDIuMTEgSEVBREVSCi0JewotCQlwUnhCbGstPnBEYXRhICs9IExFTkdUSF84MDJfMTE7Ci0JCXBSeEJsay0+RGF0YVNpemUgLT0gTEVOR1RIXzgwMl8xMTsKLQl9Ci0KLQkvLyAyLiBRT1MKLQlpZiAocEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDgpCi0JewotCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfUU9TKTsKLQkJVXNlclByaW9yaXR5ID0gKihwUnhCbGstPnBEYXRhKSAmIDB4MGY7Ci0JCS8vIGJpdCA3IGluIFFvUyBDb250cm9sIGZpZWxkIHNpZ25hbHMgdGhlIEhUIEEtTVNEVSBmb3JtYXQKLQkJaWYgKCgqcFJ4QmxrLT5wRGF0YSkgJiAweDgwKQotCQl7Ci0JCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfQU1TRFUpOwotCQl9Ci0KLQkJLy8gc2tpcCBRT1MgY29udG9ybCBmaWVsZAotCQlwUnhCbGstPnBEYXRhICs9IDI7Ci0JCXBSeEJsay0+RGF0YVNpemUgLT0yOwotCX0KLQlwUnhCbGstPlVzZXJQcmlvcml0eSA9IFVzZXJQcmlvcml0eTsKLQotCS8qIGNoZWNrIGlmIG5lZWQgdG8gcmVzZW5kIFBTIFBvbGwgd2hlbiByZWNlaXZlZCBwYWNrZXQgd2l0aCBNb3JlRGF0YSA9IDEgKi8KLQlpZiAoKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkgJiYgKHBIZWFkZXItPkZDLk1vcmVEYXRhID09IDEpKQotCXsKLQkJaWYgKCgoKFVzZXJQcmlvcml0eSA9PSAwKSB8fCAoVXNlclByaW9yaXR5ID09IDMpKSAmJgotCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRSA9PSAwKSB8fAotCQkJKCgoVXNlclByaW9yaXR5ID09IDEpIHx8IChVc2VyUHJpb3JpdHkgPT0gMikpICYmCi0JCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLID09IDApIHx8Ci0JCQkoKChVc2VyUHJpb3JpdHkgPT0gNCkgfHwgKFVzZXJQcmlvcml0eSA9PSA1KSkgJiYKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgPT0gMCkgfHwKLQkJCSgoKFVzZXJQcmlvcml0eSA9PSA2KSB8fCAoVXNlclByaW9yaXR5ID09IDcpKSAmJgotCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTyA9PSAwKSkKLQkJewotCQkJLyogbm9uLVVBUFNEIGRlbGl2ZXJ5LWVuYWJsZWQgQUMgKi8KLQkJCVJUTVBfUFNfUE9MTF9FTlFVRVVFKHBBZCk7Ci0JCX0KLQl9Ci0KLQkvLyAzLiBPcmRlciBiaXQ6IEEtUmFsaW5rIG9yIEhUQysKLQlpZiAocEhlYWRlci0+RkMuT3JkZXIpCi0JewotI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKLQkJaWYgKChwUnhXSS0+UEhZTU9ERSA8PSBNT0RFX09GRE0pICYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCkpKQotCQl7Ci0JCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfQVJBTElOSyk7Ci0JCX0KLQkJZWxzZQotI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KLQkJewotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0hUQyk7Ci0JCQkvLyBza2lwIEhUQyBjb250b3JsIGZpZWxkCi0JCQlwUnhCbGstPnBEYXRhICs9IDQ7Ci0JCQlwUnhCbGstPkRhdGFTaXplIC09IDQ7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCX0KLQl9Ci0KLQkvLyA0LiBza2lwIEhXIHBhZGRpbmcKLQlpZiAocFJ4RC0+TDJQQUQpCi0JewotCQkvLyBqdXN0IG1vdmUgcERhdGEgcG9pbnRlcgotCQkvLyBiZWNhdXNlIERhdGFTaXplIGV4Y2x1ZGluZyBIVyBwYWRkaW5nCi0JCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9QQUQpOwotCQlwUnhCbGstPnBEYXRhICs9IDI7Ci0JfQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JaWYgKHBSeEQtPkJBKQotCXsKLQkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0FNUERVKTsKLQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQotCS8vCi0JLy8gQ2FzZSBJICBQcm9jZXNzIEJyb2FkY2FzdCAmIE11bHRpY2FzdCBkYXRhIGZyYW1lCi0JLy8KLQlpZiAocFJ4RC0+QmNhc3QgfHwgcFJ4RC0+TWNhc3QpCi0JewotCQlJTkNfQ09VTlRFUjY0KHBBZC0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudCk7Ci0KLQkJLy8gRHJvcCBNY2FzdC9CY2FzdCBmcmFtZSB3aXRoIGZyYWdtZW50IGJpdCBvbgotCQlpZiAocEhlYWRlci0+RkMuTW9yZUZyYWcpCi0JCXsKLQkJCS8vIHJlbGVhc2UgcGFja2V0Ci0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIEZpbHRlciBvdXQgQmNhc3QgZnJhbWUgd2hpY2ggQVAgcmVsYXllZCBmb3IgdXMKLQkJaWYgKHBIZWFkZXItPkZDLkZyRHMgJiYgTUFDX0FERFJfRVFVQUwocEhlYWRlci0+QWRkcjMsIHBBZC0+Q3VycmVudEFkZHJlc3MpKQotCQl7Ci0JCQkvLyByZWxlYXNlIHBhY2tldAotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0JCXJldHVybjsKLQl9Ci0JZWxzZSBpZiAocFJ4RC0+VTJNKQotCXsKLQkJcEFkLT5MYXN0UnhSYXRlID0gKFVTSE9SVCkoKHBSeFdJLT5NQ1MpICsgKHBSeFdJLT5CVyA8PDcpICsgKHBSeFdJLT5TaG9ydEdJIDw8OCkrIChwUnhXSS0+UEhZTU9ERSA8PDE0KSkgOwotCi0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLSAgICAgICAgaWYgKFJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfRExTKSkKLQkJewotCQkJTUFDX1RBQkxFX0VOVFJZICpwRGxzRW50cnkgPSBOVUxMOwotCi0JCQlwRGxzRW50cnkgPSBEbHNFbnRyeVRhYmxlTG9va3VwQnlXY2lkKHBBZCwgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsIHBIZWFkZXItPkFkZHIyLCBUUlVFKTsKLQkJCQkJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBpZihwRGxzRW50cnkpCi0JCQlVcGRhdGVfUnNzaV9TYW1wbGUocEFkLCAmcERsc0VudHJ5LT5Sc3NpU2FtcGxlLCBwUnhXSSk7Ci0JCX0KLQkJZWxzZQotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCQlpZiAoQURIT0NfT04ocEFkKSkKLQkJewotCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwSGVhZGVyLT5BZGRyMik7Ci0JCQlpZiAocEVudHJ5KQotCQkJCVVwZGF0ZV9Sc3NpX1NhbXBsZShwQWQsICZwRW50cnktPlJzc2lTYW1wbGUsIHBSeFdJKTsKLQkJfQotCi0KLQkJVXBkYXRlX1Jzc2lfU2FtcGxlKHBBZCwgJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUsIHBSeFdJKTsKLQotCQlwQWQtPlN0YUNmZy5MYXN0U05SMCA9IChVQ0hBUikocFJ4V0ktPlNOUjApOwotCQlwQWQtPlN0YUNmZy5MYXN0U05SMSA9IChVQ0hBUikocFJ4V0ktPlNOUjEpOwotCi0JCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0RhdGFDbnQrKzsKLQotCi0JaWYgKCEoKHBIZWFkZXItPkZyYWcgPT0gMCkgJiYgKHBIZWFkZXItPkZDLk1vcmVGcmFnID09IDApKSkKLQl7Ci0JCS8vIHJlLWFzc2VtYmxlIHRoZSBmcmFnbWVudGVkIHBhY2tldHMKLQkJLy8gcmV0dXJuIGNvbXBsZXRlIGZyYW1lIChwUnhQYWNrZXQpIG9yIE5VTEwKLQkJYkZyYWdtZW50ID0gVFJVRTsKLQkJcFJ4UGFja2V0ID0gUlRNUERlRnJhZ21lbnREYXRhRnJhbWUocEFkLCBwUnhCbGspOwotCX0KLQotCWlmIChwUnhQYWNrZXQpCi0JewotCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwUnhXSS0+V2lyZWxlc3NDbGlJRF07Ci0KLQkJLy8gcHJvY2VzcyBjb21wbGV0ZSBmcmFtZQotCQlpZiAoYkZyYWdtZW50ICYmIChwUnhELT5EZWNyeXB0ZWQpICYmIChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSkKLQkJewotCQkJLy8gTWludXMgTUlDIGxlbmd0aAotCQkJcFJ4QmxrLT5EYXRhU2l6ZSAtPSA4OwotCi0JCQkvLyBGb3IgVEtJUCBmcmFtZSwgY2FsY3VsYXRlIHRoZSBNSUMgdmFsdWUKLQkJCWlmIChTVEFDaGVja1RraXBNSUNWYWx1ZShwQWQsIHBFbnRyeSwgcFJ4QmxrKSA9PSBGQUxTRSkKLQkJCXsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlTVEFSeERhdGFGcmFtZUFubm91bmNlKHBBZCwgcEVudHJ5LCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKLQkJCXJldHVybjsKLQl9Ci0JZWxzZQotCXsKLQkJLy8ganVzdCByZXR1cm4KLQkJLy8gYmVjYXVzZSBSVE1QRGVGcmFnbWVudERhdGFGcmFtZSgpIHdpbGwgcmVsZWFzZSByeCBwYWNrZXQsCi0JCS8vIGlmIHBhY2tldCBpcyBmcmFnbWVudGVkCi0JCXJldHVybjsKLQl9Ci0JfQotCi0JQVNTRVJUKDApOwotCS8vIHJlbGVhc2UgcGFja2V0Ci0JUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci19Ci0KLVZPSUQgU1RBSGFuZGxlUnhNZ210RnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaykKLXsKLQlQUlQyOFhYX1JYRF9TVFJVQwlwUnhEID0gJihwUnhCbGstPlJ4RCk7Ci0JUFJYV0lfU1RSVUMJCXBSeFdJID0gcFJ4QmxrLT5wUnhXSTsKLQlQSEVBREVSXzgwMl8xMQlwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOwotCVBORElTX1BBQ0tFVAlwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKLQotCWRvCi0JewotCi0KLQkJLyogY2hlY2sgaWYgbmVlZCB0byByZXNlbmQgUFMgUG9sbCB3aGVuIHJlY2VpdmVkIHBhY2tldCB3aXRoIE1vcmVEYXRhID0gMSAqLwotCQlpZiAoKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkgJiYgKHBIZWFkZXItPkZDLk1vcmVEYXRhID09IDEpKQotCQl7Ci0JCQkvKiBmb3IgVUFQU0QsIGFsbCBtYW5hZ2VtZW50IGZyYW1lcyB3aWxsIGJlIFZPIHByaW9yaXR5ICovCi0JCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTyA9PSAwKQotCQkJewotCQkJCS8qIG5vbi1VQVBTRCBkZWxpdmVyeS1lbmFibGVkIEFDICovCi0JCQkJUlRNUF9QU19QT0xMX0VOUVVFVUUocEFkKTsKLQkJCX0KLQkJfQotCi0JCS8qIFRPRE86IGlmIE1vcmVEYXRhID09IDAsIHN0YXRpb24gY2FuIGdvIHRvIHNsZWVwICovCi0KLQotCQkvLyBXZSBzaG91bGQgY29sbGVjdCBSU1NJIG5vdCBvbmx5IFUyTSBkYXRhIGJ1dCBhbHNvIG15IGJlYWNvbgotCQlpZiAoKHBIZWFkZXItPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9CRUFDT04pICYmIChNQUNfQUREUl9FUVVBTCgmcEFkLT5Db21tb25DZmcuQnNzaWQsICZwSGVhZGVyLT5BZGRyMikpCi0JCQkmJiAocEFkLT5SeEFudC5FdmFsdWF0ZVBlcmlvZCA9PSAwKSkKLQkJewotCQkJVXBkYXRlX1Jzc2lfU2FtcGxlKHBBZCwgJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUsIHBSeFdJKTsKLQotCQkJcEFkLT5TdGFDZmcuTGFzdFNOUjAgPSAoVUNIQVIpKHBSeFdJLT5TTlIwKTsKLQkJCXBBZC0+U3RhQ2ZnLkxhc3RTTlIxID0gKFVDSEFSKShwUnhXSS0+U05SMSk7Ci0JCX0KLQotI2lmZGVmIFJUMzB4eAotI2lmZGVmIEFOVF9ESVZFUlNJVFlfU1VQUE9SVAotCQkvLyBjb2xsZWN0IHJzc2kgaW5mb3JtYXRpb24gZm9yIGFudGVubmEgZGl2ZXJzaXR5Ci0JCWlmICgocEFkLT5OaWNDb25maWcyLmZpZWxkLkFudERpdmVyc2l0eSkgJiYKLQkJCShwQWQtPkNvbW1vbkNmZy5iUnhBbnREaXZlcnNpdHkgIT0gQU5UX0RJVkVSU0lUWV9ESVNBQkxFKSkKLQkJewotCQkJaWYgKChwUnhELT5VMk0pIHx8ICgocEhlYWRlci0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX0JFQUNPTikgJiYgKE1BQ19BRERSX0VRVUFMKCZwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgJnBIZWFkZXItPkFkZHIyKSkpKQotCQkJewotCQkJCQlDT0xMRUNUX1JYX0FOVEVOTkFfQVZFUkFHRV9SU1NJKHBBZCwgQ29udmVydFRvUnNzaShwQWQsIChVQ0hBUilwUnhXSS0+UlNTSTAsIFJTU0lfMCksIDApOyAvL05vdGU6IFJTU0kyIG5vdCB1c2VkIG9uIFJUNzMKLQkJCQkJcEFkLT5TdGFDZmcuTnVtT2ZBdmdSc3NpU2FtcGxlICsrOwotCQkJfQotCQl9Ci0jZW5kaWYgLy8gQU5UX0RJVkVSU0lUWV9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gUlQzMHh4IC8vCi0KLQkJLy8gRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplCi0JCWlmIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpCi0JCXsKLQkJCURCR1BSSU5UX0VSUigoIlNUQUhhbmRsZVJ4TWdtdEZyYW1lOiBmcmFtZSB0b28gbGFyZ2UsIHNpemUgPSAlZCBcbiIsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQpKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJUkVQT1JUX01HTVRfRlJBTUVfVE9fTUxNRShwQWQsIHBSeFdJLT5XaXJlbGVzc0NsaUlELCBwSGVhZGVyLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50LAotCQkJCQkJCQkJcFJ4V0ktPlJTU0kwLCBwUnhXSS0+UlNTSTEsIHBSeFdJLT5SU1NJMiwgcFJ4RC0+UGxjcFNpZ25hbCk7Ci0JfSB3aGlsZSAoRkFMU0UpOwotCi0JUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci19Ci0KLVZPSUQgU1RBSGFuZGxlUnhDb250cm9sRnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaykKLXsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlQUlhXSV9TVFJVQwkJcFJ4V0kgPSBwUnhCbGstPnBSeFdJOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCVBIRUFERVJfODAyXzExCXBIZWFkZXIgPSBwUnhCbGstPnBIZWFkZXI7Ci0JUE5ESVNfUEFDS0VUCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OwotCi0Jc3dpdGNoIChwSGVhZGVyLT5GQy5TdWJUeXBlKQotCXsKLQkJY2FzZSBTVUJUWVBFX0JMT0NLX0FDS19SRVE6Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQl7Ci0JCQkJQ250bEVucXVldWVGb3JSZWN2KHBBZCwgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50KSwgKFBGUkFNRV9CQV9SRVEpcEhlYWRlcik7Ci0JCQl9Ci0JCQlicmVhazsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJY2FzZSBTVUJUWVBFX0JMT0NLX0FDSzoKLQkJY2FzZSBTVUJUWVBFX0FDSzoKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCX0KLQotCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlQcm9jZXNzIFJ4RG9uZSBpbnRlcnJ1cHQsIHJ1bm5pbmcgaW4gRFBDIGxldmVsCi0KLQlBcmd1bWVudHM6Ci0JCXBBZCBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQkJVGhpcyByb3V0aW5lIGhhcyB0byBtYWludGFpbiBSeCByaW5nIHJlYWQgcG9pbnRlci4KLQkJTmVlZCB0byBjb25zaWRlciBRT1MgREFUQSBmb3JtYXQgd2hlbiBjb252ZXJ0aW5nIHRvIDgwMi4zCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTiBTVEFSeERvbmVJbnRlcnJ1cHRIYW5kbGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JQk9PTEVBTgkJCWFyZ2MpCi17Ci0JTkRJU19TVEFUVVMJCQlTdGF0dXM7Ci0JVUlOVDMyCQkJUnhQcm9jZXNzZWQsIFJ4UGVuZGluZzsKLQlCT09MRUFOCQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKLQlSVDI4WFhfUlhEX1NUUlVDCSpwUnhEOwotCVVDSEFSCQkJKnBEYXRhOwotCVBSWFdJX1NUUlVDCQlwUnhXSTsKLQlQTkRJU19QQUNLRVQJcFJ4UGFja2V0OwotCVBIRUFERVJfODAyXzExCXBIZWFkZXI7Ci0JUlhfQkxLCQkJUnhDZWxsOwotCi0JUnhQcm9jZXNzZWQgPSBSeFBlbmRpbmcgPSAwOwotCi0JLy8gcHJvY2VzcyB3aG9sZSByeCByaW5nCi0Jd2hpbGUgKDEpCi0JewotCi0JCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGIHwKLQkJCQkJCQkJZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8Ci0JCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8Ci0JCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkgfHwKLQkJCSFSVE1QX1RFU1RfRkxBRyhwQWQsZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpCi0JCXsKLQkJCWJyZWFrOwotCQl9Ci0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJaWYgKFJ4UHJvY2Vzc2VkKysgPiBNQVhfUlhfUFJPQ0VTU19DTlQpCi0JCXsKLQkJCS8vIG5lZWQgdG8gcmVzY2hlZHVsZSByeCBoYW5kbGUKLQkJCWJSZXNjaGVkdWxlID0gVFJVRTsKLQkJCWJyZWFrOwotCQl9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQkJUnhQcm9jZXNzZWQgKys7IC8vIHRlc3QKLQotCQkvLyAxLiBhbGxvY2F0ZSBhIG5ldyBkYXRhIHBhY2tldCBpbnRvIHJ4IHJpbmcgdG8gcmVwbGFjZSByZWNlaXZlZCBwYWNrZXQKLQkJLy8gICAgdGhlbiBwcm9jZXNzaW5nIHRoZSByZWNlaXZlZCBwYWNrZXQKLQkJLy8gMi4gdGhlIGNhbGxlZSBtdXN0IHRha2UgY2hhcmdlIG9mIHJlbGVhc2Ugb2YgcGFja2V0Ci0JCS8vIDMuIEFzIGZhciBhcyBkcml2ZXIgaXMgY29uY2VybmVkICwKLQkJLy8gICAgdGhlIHJ4IHBhY2tldCBtdXN0Ci0JCS8vICAgICAgYS4gYmUgaW5kaWNhdGVkIHRvIHVwcGVyIGxheWVyIG9yCi0JCS8vICAgICAgYi4gYmUgcmVsZWFzZWQgaWYgaXQgaXMgZGlzY2FyZGVkCi0JCXBSeFBhY2tldCA9IEdldFBhY2tldEZyb21SeFJpbmcocEFkLCAmKFJ4Q2VsbC5SeEQpLCAmYlJlc2NoZWR1bGUsICZSeFBlbmRpbmcpOwotCQlpZiAocFJ4UGFja2V0ID09IE5VTEwpCi0JCXsKLQkJCS8vIG5vIG1vcmUgcGFja2V0IHRvIHByb2Nlc3MKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gZ2V0IHJ4IHJpbmcgZGVzY3JpcHRvcgotCQlwUnhEID0gJihSeENlbGwuUnhEKTsKLQkJLy8gZ2V0IHJ4IGRhdGEgYnVmZmVyCi0JCXBEYXRhCT0gR0VUX09TX1BLVF9EQVRBUFRSKHBSeFBhY2tldCk7Ci0JCXBSeFdJCT0gKFBSWFdJX1NUUlVDKSBwRGF0YTsKLQkJcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgKHBEYXRhK1JYV0lfU0laRSkgOwotCi0jaWZkZWYgUlRfQklHX0VORElBTgotCSAgICBSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBIZWFkZXIsIERJUl9SRUFELCBUUlVFKTsKLQkJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFJ4V0ksIFRZUEVfUlhXSSk7Ci0jZW5kaWYKLQotCQkvLyBidWlsZCBSeENlbGwKLQkJUnhDZWxsLnBSeFdJID0gcFJ4V0k7Ci0JCVJ4Q2VsbC5wSGVhZGVyID0gcEhlYWRlcjsKLQkJUnhDZWxsLnBSeFBhY2tldCA9IHBSeFBhY2tldDsKLQkJUnhDZWxsLnBEYXRhID0gKFVDSEFSICopIHBIZWFkZXI7Ci0JCVJ4Q2VsbC5EYXRhU2l6ZSA9IHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQ7Ci0JCVJ4Q2VsbC5GbGFncyA9IDA7Ci0KLQkJLy8gSW5jcmVhc2UgVG90YWwgcmVjZWl2ZSBieXRlIGNvdW50ZXIgYWZ0ZXIgcmVhbCBkYXRhIHJlY2VpdmVkIG5vIG1hdGVyIGFueSBlcnJvciBvciBub3QKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5SZWNlaXZlZEJ5dGVDb3VudCArPSAgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudDsKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSZWNlaXZlZEJ5dGVDb3VudCArPSAgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudDsKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50ICsrOwotCi0JCUlOQ19DT1VOVEVSNjQocEFkLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50KTsKLQotCQlpZiAocFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA8IDE0KQotCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQotICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWQpKQotCQl7Ci0gICAgICAgICAgICBzZW5kX21vbml0b3JfcGFja2V0cyhwQWQsICZSeENlbGwpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBTVEFSeERvbmVJbnRlcnJ1cHRIYW5kbGUoKSBpcyBjYWxsZWQgaW4gcnR1c2JfYnVsay5jICovCi0jaWZkZWYgUkFMSU5LX0FURQotCQlpZiAoQVRFX09OKHBBZCkpCi0JCXsKLQkJCXBBZC0+YXRlLlJ4Q250UGVyU2VjKys7Ci0JCQlBVEVTYW1wbGVSc3NpKHBBZCwgcFJ4V0kpOwotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0JCQlpZiAocEFkLT5hdGUuYlFBUnhTdGFydCA9PSBUUlVFKQotCQkJewotCQkJCS8qICgqcFJ4RCkgaGFzIGJlZW4gc3dhcHBlZCBpbiBHZXRQYWNrZXRGcm9tUnhSaW5nKCkgKi8KLQkJCQlBVEVfUUFfU3RhdGlzdGljcyhwQWQsIHBSeFdJLCBwUnhELAlwSGVhZGVyKTsKLQkJCX0KLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCQljb250aW51ZTsKLQkJfQotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotCQkvLyBDaGVjayBmb3IgYWxsIFJ4RCBlcnJvcnMKLQkJU3RhdHVzID0gUlRNUENoZWNrUnhFcnJvcihwQWQsIHBIZWFkZXIsIHBSeFdJLCBwUnhEKTsKLQotCQkvLyBIYW5kbGUgdGhlIHJlY2VpdmVkIGZyYW1lCi0JCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJc3dpdGNoIChwSGVhZGVyLT5GQy5UeXBlKQotCQkJewotCQkJCS8vIENBU0UgSSwgcmVjZWl2ZSBhIERBVEEgZnJhbWUKLQkJCQljYXNlIEJUWVBFX0RBVEE6Ci0JCQkJewotCQkJCQkvLyBwcm9jZXNzIERBVEEgZnJhbWUKLQkJCQkJU1RBSGFuZGxlUnhEYXRhRnJhbWUocEFkLCAmUnhDZWxsKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkJLy8gQ0FTRSBJSSwgcmVjZWl2ZSBhIE1HTVQgZnJhbWUKLQkJCQljYXNlIEJUWVBFX01HTVQ6Ci0JCQkJewotCQkJCQlTVEFIYW5kbGVSeE1nbXRGcmFtZShwQWQsICZSeENlbGwpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCQkvLyBDQVNFIElJSS4gcmVjZWl2ZSBhIENOVEwgZnJhbWUKLQkJCQljYXNlIEJUWVBFX0NOVEw6Ci0JCQkJewotCQkJCQlTVEFIYW5kbGVSeENvbnRyb2xGcmFtZShwQWQsICZSeENlbGwpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCQkvLyBkaXNjYXJkIG90aGVyIHR5cGUKLQkJCQlkZWZhdWx0OgotCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPkNvdW50ZXJzODAyMy5SeEVycm9ycysrOwotCQkJLy8gZGlzY2FyZCB0aGlzIGZyYW1lCi0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJfQotCX0KLQotCXJldHVybiBiUmVzY2hlZHVsZTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBIYW5kbGVUd2FrZXVwSW50ZXJydXB0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCUFzaWNGb3JjZVdha2V1cChwQWQsIEZBTFNFKTsKLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBFYXJseSBjaGVja2luZyBhbmQgT1MtZGVwZW5lZCBwYXJzaW5nIGZvciBUeCBwYWNrZXQgc2VuZCB0byBvdXIgU1RBIGRyaXZlci4KLQotQXJndW1lbnRzOgotICAgIE5ESVNfSEFORExFCQlNaW5pcG9ydEFkYXB0ZXJDb250ZXh0CVBvaW50ZXIgcmVmZXIgdG8gdGhlIGRldmljZSBoYW5kbGUsIGkuZS4sIHRoZSBwQWQuCi0JUFBORElTX1BBQ0tFVAlwcFBhY2tldEFycmF5CQkJVGhlIHBhY2tldCBhcnJheSBuZWVkIHRvIGRvIHRyYW5zbWlzc2lvbi4KLQlVSU5UCQkJTnVtYmVyT2ZQYWNrZXRzCQkJTnVtYmVyIG9mIHBhY2tldCBpbiBwYWNrZXQgYXJyYXkuCi0KLVJldHVybiBWYWx1ZToKLQlOT05FCi0KLU5vdGU6Ci0JVGhpcyBmdW5jdGlvbiBkbyBlYXJseSBjaGVja2luZyBhbmQgY2xhc3NpZmljYXRpb24gZm9yIHNlbmQtb3V0IHBhY2tldC4KLQlZb3Ugb25seSBjYW4gcHV0IE9TLWRlcGVuZWQgJiBTVEEgcmVsYXRlZCBjb2RlIGluIGhlcmUuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFNUQVNlbmRQYWNrZXRzKAotCUlOCU5ESVNfSEFORExFCQlNaW5pcG9ydEFkYXB0ZXJDb250ZXh0LAotCUlOCVBQTkRJU19QQUNLRVQJcHBQYWNrZXRBcnJheSwKLQlJTglVSU5UCQkJTnVtYmVyT2ZQYWNrZXRzKQotewotCVVJTlQJCQlJbmRleDsKLQlQUlRNUF9BREFQVEVSCXBBZCA9IChQUlRNUF9BREFQVEVSKSBNaW5pcG9ydEFkYXB0ZXJDb250ZXh0OwotCVBORElTX1BBQ0tFVAlwUGFja2V0OwotCUJPT0xFQU4JCQlhbGxvd1RvU2VuZCA9IEZBTFNFOwotCi0KLQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOdW1iZXJPZlBhY2tldHM7IEluZGV4KyspCi0JewotCQlwUGFja2V0ID0gcHBQYWNrZXRBcnJheVtJbmRleF07Ci0KLQkJZG8KLQkJewotCi0JCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAotCQkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSB8fAotCQkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQotCQkJewotCQkJCS8vIERyb3Agc2VuZCByZXF1ZXN0IHNpbmNlIGhhcmR3YXJlIGlzIGluIHJlc2V0IHN0YXRlCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZiAoIUlORlJBX09OKHBBZCkgJiYgIUFESE9DX09OKHBBZCkpCi0JCQl7Ci0JCQkJLy8gRHJvcCBzZW5kIHJlcXVlc3Qgc2luY2UgdGhlcmUgYXJlIG5vIHBoeXNpY2FsIGNvbm5lY3Rpb24geWV0Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vIFJlY29yZCB0aGF0IG9yaWduYWwgcGFja2V0IHNvdXJjZSBpcyBmcm9tIE5ESVMgbGF5ZXIsc28gdGhhdAotCQkJCS8vIGxhdGVyIG9uIGRyaXZlciBrbm93cyBob3cgdG8gcmVsZWFzZSB0aGlzIE5ESVMgUEFDS0VUCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7Ci0JCQkJUFVDSEFSIHBTcmNCdWZWQSA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKLQotCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcFNyY0J1ZlZBKTsKLQkJCQlpZiAocEVudHJ5ICYmIChwRW50cnktPlZhbGlkQXNEbHMgPT0gVFJVRSkpCi0JCQkJewotCQkJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCBwRW50cnktPkFpZCk7Ci0JCQkJfQotCQkJCWVsc2UKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQkJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCAwKTsgLy8gdGhpcyBmaWVsZCBpcyB1c2VsZXNzIHdoZW4gaW4gU1RBIG1vZGUKLQkJCQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKHBQYWNrZXQsIFBLVFNSQ19ORElTKTsKLQkJCQlORElTX1NFVF9QQUNLRVRfU1RBVFVTKHBQYWNrZXQsIE5ESVNfU1RBVFVTX1BFTkRJTkcpOwotCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuUGVuZGluZ05kaXNQYWNrZXRDb3VudCsrOwotCi0JCQkJYWxsb3dUb1NlbmQgPSBUUlVFOwotCQkJfQotCQl9IHdoaWxlKEZBTFNFKTsKLQotCQlpZiAoYWxsb3dUb1NlbmQgPT0gVFJVRSkKLQkJCVNUQVNlbmRQYWNrZXQocEFkLCBwUGFja2V0KTsKLQkJZWxzZQotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCX0KLQotCS8vIERlcXVldWUgb3V0Z29pbmcgZnJhbWVzIGZyb20gVHhTd1F1ZXVlW10gYW5kIHByb2Nlc3MgaXQKLQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOwotCi19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLQlUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBkbyBwYWNrZXQgcGFyc2luZyBhbmQgY2xhc3NpZmljYXRpb24gZm9yIFR4IHBhY2tldAotCXRvIFNUQSBkZXZpY2UsIGFuZCBpdCB3aWxsIGVuLXF1ZXVlIHBhY2tldHMgdG8gb3VyIFR4U3dRdWV1ZSBkZXBlbmRzIG9uIEFDCi0JY2xhc3MuCi0KLUFyZ3VtZW50czoKLQlwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQlwUGFja2V0CQlQb2ludGVyIHRvIHNlbmQgcGFja2V0Ci0KLVJldHVybiBWYWx1ZToKLQlORElTX1NUQVRVU19TVUNDRVNTCQkJSWYgc3VjY2VzIHRvIHF1ZXVlIHRoZSBwYWNrZXQgaW50byBUeFN3UXVldWUuCi0JTkRJU19TVEFUVVNfRkFJTFVSRQkJCUlmIGZhaWxlZCB0byBkbyBlbi1xdWV1ZS4KLQotTm90ZToKLQlZb3Ugb25seSBjYW4gcHV0IE9TLWluZGVwZW5lZCAmIFNUQSByZWxhdGVkIGNvZGUgaW4gaGVyZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5ESVNfU1RBVFVTIFNUQVNlbmRQYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCi17Ci0JUEFDS0VUX0lORk8JUGFja2V0SW5mbzsKLQlQVUNIQVIJCQlwU3JjQnVmVkE7Ci0JVUlOVAkJCVNyY0J1ZkxlbjsKLQlVSU5UCQkJQWxsb3dGcmFnU2l6ZTsKLQlVQ0hBUgkJCU51bWJlck9mRnJhZzsKLQlVQ0hBUgkJCVJUU1JlcXVpcmVkOwotCVVDSEFSCQkJUXVlSWR4LCBVc2VyUHJpb3JpdHk7Ci0JTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMOwotCXVuc2lnbmVkIGludAlJcnFGbGFnczsKLQlVQ0hBUgkJCUZsZ0lzSVAgPSAwOwotCVVDSEFSCQkJUmF0ZTsKLQotCS8vIFByZXBhcmUgcGFja2V0IGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgYnVmZmVyIGRlc2NyaXB0b3IKLQkvLyBjaGFpbmVkIHdpdGhpbiBhIHNpbmdsZSBORElTIHBhY2tldC4KLQlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7Ci0KLQlpZiAocFNyY0J1ZlZBID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlNUQVNlbmRQYWNrZXQgLS0+IHBTcmNCdWZWQSA9PSBOVUxMICEhIVNyY0J1Zkxlbj0leFxuIixTcmNCdWZMZW4pKTsKLQkJLy8gUmVzb3VyZWNlIGlzIGxvdywgc3lzdGVtIGRpZCBub3QgYWxsb2NhdGUgdmlydHVhbCBhZGRyZXNzCi0JCS8vIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFIGRpcmVjdGx5IHRvIHVwcGVyIGxheWVyCi0JCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0KLQlpZiAoU3JjQnVmTGVuIDwgMTQpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlNUQVNlbmRQYWNrZXQgLS0+IE5kaXMgUGFja2V0IGJ1ZmZlciBlcnJvciAhISFcbiIpKTsKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCX0KLQotCS8vIEluIEhUIHJhdGUgYWRob2MgbW9kZSwgQS1NUERVIGlzIG9mdGVuIHVzZWQuIFNvIG5lZWQgdG8gbG9va3VwIEJBIFRhYmxlIGFuZCBNQUMgRW50cnkuCi0JLy8gTm90ZSBtdWx0aWNhc3QgcGFja2V0cyBpbiBhZGhvYyBhbHNvIHVzZSBCU1NJRF9XQ0lEIGluZGV4LgotCXsKLQkJaWYoSU5GUkFfT04ocEFkKSkKLQkJewotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQkJVVNIT1JUCXRtcFdjaWQ7Ci0KLQkJCXRtcFdjaWQgPSBSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KTsKLQkJCWlmIChWQUxJRF9XQ0lEKHRtcFdjaWQpICYmCi0JCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbdG1wV2NpZF0uVmFsaWRBc0Rscz09IFRSVUUpKQotCQkJewotCQkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3RtcFdjaWRdOwotCQkJCVJhdGUgPSBwQWQtPk1hY1RhYi5Db250ZW50W3RtcFdjaWRdLkN1cnJUeFJhdGU7Ci0JCQl9Ci0JCQllbHNlCi0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0JCQl7Ci0JCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKLQkJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQsIEJTU0lEX1dDSUQpOwotCQkJUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZTsKLQkJfQotCQl9Ci0JCWVsc2UgaWYgKEFESE9DX09OKHBBZCkpCi0JCXsKLQkJCWlmICgqcFNyY0J1ZlZBICYgMHgwMSkKLQkJCXsKLQkJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCBNQ0FTVF9XQ0lEKTsKLQkJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBTcmNCdWZWQSk7Ci0JCQl9Ci0JCQlSYXRlID0gcEFkLT5Db21tb25DZmcuVHhSYXRlOwotCQl9Ci0JfQotCi0JaWYgKCFwRW50cnkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlNUQVNlbmRQYWNrZXQtPkNhbm5vdCBmaW5kIHBFbnRyeSglMng6JTJ4OiUyeDolMng6JTJ4OiUyeCkgaW4gTWFjVGFiIVxuIiwgUFJJTlRfTUFDKHBTcmNCdWZWQSkpKTsKLQkJLy8gUmVzb3VyZWNlIGlzIGxvdywgc3lzdGVtIGRpZCBub3QgYWxsb2NhdGUgdmlydHVhbCBhZGRyZXNzCi0JCS8vIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFIGRpcmVjdGx5IHRvIHVwcGVyIGxheWVyCi0JCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0JaWYgKEFESE9DX09OKHBBZCkKLQkJKQotCXsKLQkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocFBhY2tldCwgKFVDSEFSKXBFbnRyeS0+QWlkKTsKLQl9Ci0KLQkvLwotCS8vIENoZWNrIHRoZSBFdGhlcm5ldCBGcmFtZSB0eXBlIG9mIHRoaXMgcGFja2V0LCBhbmQgc2V0IHRoZSBSVE1QX1NFVF9QQUNLRVRfU1BFQ0lGSUMgZmxhZ3MuCi0JLy8JCUhlcmUgd2Ugc2V0IHRoZSBQQUNLRVRfU1BFQ0lGSUMgZmxhZ3MoTExDLCBWTEFOLCBESENQL0FSUCwgRUFQT0wpLgotCVJUTVBDaGVja0V0aGVyVHlwZShwQWQsIHBQYWNrZXQpOwotCi0KLQotCS8vCi0JLy8gV1BBIDgwMi4xeCBzZWN1cmVkIHBvcnQgY29udHJvbCAtIGRyb3AgYWxsIG5vbi04MDIuMXggZnJhbWUgYmVmb3JlIHBvcnQgc2VjdXJlZAotCS8vCi0JaWYgKCgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAotCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKLQkJIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAotCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCQkgIHx8IChwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gVFJVRSkKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0JCSAgKQotCQkgICYmICgocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSB8fCAocEFkLT5TdGFDZmcuTWljRXJyQ250ID49IDIpKQotCQkgICYmIChSVE1QX0dFVF9QQUNLRVRfRUFQT0wocFBhY2tldCk9PSBGQUxTRSkKLQkJICApCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQVNlbmRQYWNrZXQgLS0+IERyb3AgcGFja2V0IGJlZm9yZSBwb3J0IHNlY3VyZWQgISEhXG4iKSk7Ci0JCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQotCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCX0KLQotCi0JLy8gU1RFUCAxLiBEZWNpZGUgbnVtYmVyIG9mIGZyYWdtZW50cyByZXF1aXJlZCB0byBkZWxpdmVyIHRoaXMgTVNEVS4KLQkvLwkgICBUaGUgZXN0aW1hdGlvbiBoZXJlIGlzIG5vdCB2ZXJ5IGFjY3VyYXRlIGJlY2F1c2UgZGlmZmljdWx0IHRvCi0JLy8JICAgdGFrZSBlbmNyeXB0aW9uIG92ZXJoZWFkIGludG8gY29uc2lkZXJhdGlvbiBoZXJlLiBUaGUgcmVzdWx0Ci0JLy8JICAgIk51bWJlck9mRnJhZyIgaXMgdGhlbiBqdXN0IHVzZWQgdG8gcHJlLWNoZWNrIGlmIGVub3VnaCBmcmVlCi0JLy8JICAgVFhEIGFyZSBhdmFpbGFibGUgdG8gaG9sZCB0aGlzIE1TRFUuCi0KLQotCWlmICgqcFNyY0J1ZlZBICYgMHgwMSkJLy8gZnJhZ21lbnRhdGlvbiBub3QgYWxsb3dlZCBvbiBtdWx0aWNhc3QgJiBicm9hZGNhc3QKLQkJTnVtYmVyT2ZGcmFnID0gMTsKLQllbHNlIGlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCkpCi0JCU51bWJlck9mRnJhZyA9IDE7CS8vIEFnZ3JlZ2F0aW9uIG92ZXJ3aGVsbXMgZnJhZ21lbnRhdGlvbgotCWVsc2UgaWYgKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VEKSkKLQkJTnVtYmVyT2ZGcmFnID0gMTsJLy8gQWdncmVnYXRpb24gb3ZlcndoZWxtcyBmcmFnbWVudGF0aW9uCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID09IE1PREVfSFRNSVgpIHx8IChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9PSBNT0RFX0hUR1JFRU5GSUVMRCkpCi0JCU51bWJlck9mRnJhZyA9IDE7CS8vIE1JTU8gUkFURSBvdmVyd2hlbG1zIGZyYWdtZW50YXRpb24KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQllbHNlCi0JewotCQkvLyBUaGUgY2FsY3VsYXRlZCAiTnVtYmVyT2ZGcmFnIiBpcyBhIHJvdWdoIGVzdGltYXRpb24gYmVjYXVzZSBvZiB2YXJpb3VzCi0JCS8vIGVuY3J5cHRpb24vZW5jYXBzdWxhdGlvbiBvdmVyaGVhZCBub3QgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uLiBUaGlzIG51bWJlciBpcyBqdXN0Ci0JCS8vIHVzZWQgdG8gbWFrZSBzdXJlIGVub3VnaCBmcmVlIFRYRCBhcmUgYXZhaWxhYmxlIGJlZm9yZSBmcmFnbWVudGF0aW9uIHRha2VzIHBsYWNlLgotCQkvLyBJbiBjYXNlIHRoZSBhY3R1YWwgcmVxdWlyZWQgbnVtYmVyIG9mIGZyYWdtZW50cyBvZiBhbiBORElTIHBhY2tldAotCQkvLyBleGNjZWVkcyAiTnVtYmVyT2ZGcmFnImNhY3VsYXRlZCBoZXJlIGFuZCBub3QgZW5vdWdoIGZyZWUgVFhEIGF2YWlsYWJsZSwgdGhlCi0JCS8vIGxhc3QgZnJhZ21lbnQgKGkuZS4gbGFzdCBNUERVKSB3aWxsIGJlIGRyb3BwZWQgaW4gUlRNUEhhcmRUcmFuc21pdCgpIGR1ZSB0byBvdXQgb2YKLQkJLy8gcmVzb3VyY2UsIGFuZCB0aGUgTkRJUyBwYWNrZXQgd2lsbCBiZSBpbmRpY2F0ZWQgTkRJU19TVEFUVVNfRkFJTFVSRS4gVGhpcyBzaG91bGQKLQkJLy8gcmFyZWx5IGhhcHBlbiBhbmQgdGhlIHBlbmFsdHkgaXMganVzdCBsaWtlIGEgVFggUkVUUlkgZmFpbC4gQWZmb3JkYWJsZS4KLQotCQlBbGxvd0ZyYWdTaXplID0gKHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSAtIExFTkdUSF84MDJfMTEgLSBMRU5HVEhfQ1JDOwotCQlOdW1iZXJPZkZyYWcgPSAoKFBhY2tldEluZm8uVG90YWxQYWNrZXRMZW5ndGggLSBMRU5HVEhfODAyXzMgKyBMRU5HVEhfODAyXzFfSCkgLyBBbGxvd0ZyYWdTaXplKSArIDE7Ci0JCS8vIFRvIGdldCBhY2N1cmF0ZSBudW1iZXIgb2YgZnJhZ21lbnRhdGlvbiwgTWludXMgMSBpZiB0aGUgc2l6ZSBqdXN0IG1hdGNoIHRvIGFsbG93YWJsZSBmcmFnbWVudCBzaXplCi0JCWlmICgoKFBhY2tldEluZm8uVG90YWxQYWNrZXRMZW5ndGggLSBMRU5HVEhfODAyXzMgKyBMRU5HVEhfODAyXzFfSCkgJSBBbGxvd0ZyYWdTaXplKSA9PSAwKQotCQl7Ci0JCQlOdW1iZXJPZkZyYWctLTsKLQkJfQotCX0KLQotCS8vIFNhdmUgZnJhZ21lbnQgbnVtYmVyIHRvIE5kaXMgcGFja2V0IHJlc2VydmVkIGZpZWxkCi0JUlRNUF9TRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0LCBOdW1iZXJPZkZyYWcpOwotCi0KLQkvLyBTVEVQIDIuIENoZWNrIHRoZSByZXF1aXJlbWVudCBvZiBSVFM6Ci0JLy8JICAgSWYgbXVsdGlwbGUgZnJhZ21lbnQgcmVxdWlyZWQsIFJUUyBpcyByZXF1aXJlZCBvbmx5IGZvciB0aGUgZmlyc3QgZnJhZ21lbnQKLQkvLwkgICBpZiB0aGUgZnJhZ21lbnQgc2l6ZSBsYXJnZSB0aGFuIFJUUyB0aHJlc2hvbGQKLQkvLyAgICAgRm9yIFJUMjh4eCwgTGV0IEFTSUMgc2VuZCBSVFMvQ1RTCi0vLwlSVE1QX1NFVF9QQUNLRVRfUlRTKHBQYWNrZXQsIDApOwotCWlmIChOdW1iZXJPZkZyYWcgPiAxKQotCQlSVFNSZXF1aXJlZCA9IChwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA+IHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCkgPyAxIDogMDsKLQllbHNlCi0JCVJUU1JlcXVpcmVkID0gKFBhY2tldEluZm8uVG90YWxQYWNrZXRMZW5ndGggPiBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpID8gMSA6IDA7Ci0KLQkvLyBTYXZlIFJUUyByZXF1aXJlbWVudCB0byBOZGlzIHBhY2tldCByZXNlcnZlZCBmaWVsZAotCVJUTVBfU0VUX1BBQ0tFVF9SVFMocFBhY2tldCwgUlRTUmVxdWlyZWQpOwotCVJUTVBfU0VUX1BBQ0tFVF9UWFJBVEUocFBhY2tldCwgcEFkLT5Db21tb25DZmcuVHhSYXRlKTsKLQotCS8vCi0JLy8gU1RFUCAzLiBUcmFmZmljIGNsYXNzaWZpY2F0aW9uLiBvdXRjb21lID0gPFVzZXJQcmlvcml0eSwgUXVlSWR4PgotCS8vCi0JVXNlclByaW9yaXR5ID0gMDsKLQlRdWVJZHgJCSA9IFFJRF9BQ19CRTsKLQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSAmJgotCQlDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSkKLQl7Ci0JCVVTSE9SVCBQcm90b2NvbDsKLQkJVUNIQVIgIExsY1NuYXBMZW4gPSAwLCBCeXRlMCwgQnl0ZTE7Ci0JCWRvCi0JCXsKLQkJCS8vIGdldCBFdGhlcm5ldCBwcm90b2NvbCBmaWVsZAotCQkJUHJvdG9jb2wgPSAoVVNIT1JUKSgocFNyY0J1ZlZBWzEyXSA8PCA4KSArIHBTcmNCdWZWQVsxM10pOwotCQkJaWYgKFByb3RvY29sIDw9IDE1MDApCi0JCQl7Ci0JCQkJLy8gZ2V0IEV0aGVybmV0IHByb3RvY29sIGZpZWxkIGZyb20gTExDL1NOQVAKLQkJCQlpZiAoU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcihQYWNrZXRJbmZvLnBGaXJzdEJ1ZmZlciwgTEVOR1RIXzgwMl8zICsgNiwgJkJ5dGUwLCAmQnl0ZTEpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCQkJCWJyZWFrOwotCi0JCQkJUHJvdG9jb2wgPSAoVVNIT1JUKSgoQnl0ZTAgPDwgOCkgKyBCeXRlMSk7Ci0JCQkJTGxjU25hcExlbiA9IDg7Ci0JCQl9Ci0KLQkJCS8vIGFsd2F5cyBBQ19CRSBmb3Igbm9uLUlQIHBhY2tldAotCQkJaWYgKFByb3RvY29sICE9IDB4MDgwMCkKLQkJCQlicmVhazsKLQotCQkJLy8gZ2V0IElQIGhlYWRlcgotCQkJaWYgKFNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIoUGFja2V0SW5mby5wRmlyc3RCdWZmZXIsIExFTkdUSF84MDJfMyArIExsY1NuYXBMZW4sICZCeXRlMCwgJkJ5dGUxKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQkJCWJyZWFrOwotCi0JCQkvLyByZXR1cm4gQUNfQkUgaWYgcGFja2V0IGlzIG5vdCBJUHY0Ci0JCQlpZiAoKEJ5dGUwICYgMHhmMCkgIT0gMHg0MCkKLQkJCQlicmVhazsKLQotCQkJRmxnSXNJUCA9IDE7Ci0JCQlVc2VyUHJpb3JpdHkgPSAoQnl0ZTEgJiAweGUwKSA+PiA1OwotCQkJUXVlSWR4ID0gTWFwVXNlclByaW9yaXR5VG9BY2Nlc3NDYXRlZ29yeVtVc2VyUHJpb3JpdHldOwotCi0JCQkvLyBUT0RPOiBoYXZlIHRvIGNoZWNrIEFDTSBiaXQuIGFwcGx5IFRTUEVDIGlmIEFDTSBpcyBPTgotCQkJLy8gVE9ETzogZG93bmdyYWRlIFVQICYgUXVlSWR4IGJlZm9yZSBwYXNzaW5nIEFDTQotCQkJLyoKLQkJCQlVbmRlciBXTU0gQUNNIGNvbnRyb2wsIHdlIGRvbnQgbmVlZCB0byBjaGVjayB0aGUgYml0OwotCQkJCU9yIHdoZW4gYSBUU1BFQyBpcyBidWlsdCBmb3IgVk8gYnV0IHdlIHdpbGwgY2hhbmdlIHRvIGlzc3VlCi0JCQkJQkEgc2Vzc2lvbiBmb3IgQkUgaGVyZSwgc28gd2Ugd2lsbCBub3QgdXNlIEJBIHRvIHNlbmQgVk8gcGFja2V0cy4KLQkJCSovCi0JCQlpZiAocEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQUNNW1F1ZUlkeF0pCi0JCQl7Ci0JCQkJVXNlclByaW9yaXR5ID0gMDsKLQkJCQlRdWVJZHgJCSA9IFFJRF9BQ19CRTsKLQkJCX0KLQkJfSB3aGlsZSAoRkFMU0UpOwotCX0KLQotCVJUTVBfU0VUX1BBQ0tFVF9VUChwUGFja2V0LCBVc2VyUHJpb3JpdHkpOwotCi0KLQotCS8vIE1ha2Ugc3VyZSBTZW5kVHhXYWl0IHF1ZXVlIHJlc291cmNlIHdvbid0IGJlIHVzZWQgYnkgb3RoZXIgdGhyZWFkcwotCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLQlpZiAocEFkLT5UeFN3UXVldWVbUXVlSWR4XS5OdW1iZXIgPj0gTUFYX1BBQ0tFVFNfSU5fUVVFVUUpCi0JewotCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLSNpZmRlZiBCTE9DS19ORVRfSUYKLQkJU3RvcE5ldElmUXVldWUocEFkLCBRdWVJZHgsIHBQYWNrZXQpOwotI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLwotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0KLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCWVsc2UKLQl7Ci0JCUluc2VydFRhaWxRdWV1ZUFjKHBBZCwgcEVudHJ5LCAmcEFkLT5UeFN3UXVldWVbUXVlSWR4XSwgUEFDS0VUX1RPX1FVRVVFX0VOVFJZKHBQYWNrZXQpKTsKLQl9Ci0JUlRNUF9JUlFfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPT0gVFJVRSkmJgotICAgICAgICBJU19IVF9TVEEocEVudHJ5KSkKLQl7Ci0JICAgIC8vUE1BQ19UQUJMRV9FTlRSWSBwTWFjRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKLQkJaWYgKCgocEVudHJ5LT5UWEJBYml0bWFwICYgKDE8PFVzZXJQcmlvcml0eSkpID09IDApICYmCi0gICAgICAgICAgICAoKHBFbnRyeS0+QkFEZWNsaW5lQml0bWFwICYgKDE8PFVzZXJQcmlvcml0eSkpID09IDApICYmCi0gICAgICAgICAgICAocEVudHJ5LT5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkKLQkJCSAvLyBGb3IgSU9UIGNvbXBhdGliaWxpdHksIGlmCi0JCQkgLy8gMS4gSXQgaXMgUmFsaW5rIGNoaXAgb3IKLQkJCSAvLyAyLiBJdCBpcyBPUEVOIG9yIEFFUyBtb2RlLAotCQkJIC8vIHRoZW4gQkEgc2Vzc2lvbiBjYW4gYmUgYnVsaXQuCi0JCQkgJiYgKChwRW50cnktPlZhbGlkQXNDTEkgJiYgcEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgIT0gMHgwKSB8fAotCQkJCSAocEVudHJ5LT5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMVdFUEVuYWJsZWQgJiYgcEVudHJ5LT5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkpCi0JCQkpCi0JCXsKLQkJCUJBT3JpU2Vzc2lvblNldFVwKHBBZCwgcEVudHJ5LCBVc2VyUHJpb3JpdHksIDAsIDEwLCBGQUxTRSk7Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY09zVHhDb3VudFtRdWVJZHhdKys7IC8vIFRPRE86IGZvciBkZWJ1ZyBvbmx5LiB0byBiZSByZW1vdmVkCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVRoaXMgc3Vicm91dGluZSB3aWxsIHNjYW4gdGhyb3VnaCByZWxlYXRpdmUgcmluZyBkZXNjcmlwdG9yIHRvIGZpbmQKLQkJb3V0IGF2YWxpYWJsZSBmcmVlIHJpbmcgZGVzY3JpcHRvciBhbmQgY29tcGFyZSB3aXRoIHJlcXVlc3Qgc2l6ZS4KLQotCUFyZ3VtZW50czoKLQkJcEFkIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJUXVlSWR4CQlTZWxlY3RlZCBUWCBSaW5nCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5ESVNfU1RBVFVTX0ZBSUxVUkUJTm90IGVub3VnaCBmcmVlIGRlc2NyaXB0b3IKLQkJTkRJU19TVEFUVVNfU1VDQ0VTUwlFbm91Z2ggZnJlZSBkZXNjcmlwdG9yCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLU5ESVNfU1RBVFVTIFJUTVBGcmVlVFhEUmVxdWVzdCgKLQlJTgkJUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JCVVDSEFSCQkJUXVlSWR4LAotCUlOCQlVQ0hBUgkJCU51bWJlclJlcXVpcmVkLAotCUlOCQlQVUNIQVIJCQlGcmVlTnVtYmVySXMpCi17Ci0JVUxPTkcJCUZyZWVOdW1iZXIgPSAwOwotCU5ESVNfU1RBVFVTCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0KLQlzd2l0Y2ggKFF1ZUlkeCkKLQl7Ci0JCWNhc2UgUUlEX0FDX0JLOgotCQljYXNlIFFJRF9BQ19CRToKLQkJY2FzZSBRSURfQUNfVkk6Ci0JCWNhc2UgUUlEX0FDX1ZPOgotCQkvKmNhc2UgUUlEX0hDQ0E6Ki8KLQkJCWlmIChwQWQtPlR4UmluZ1tRdWVJZHhdLlR4U3dGcmVlSWR4ID4gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCkKLQkJCQlGcmVlTnVtYmVyID0gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeFN3RnJlZUlkeCAtIHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHggLSAxOwotCQkJZWxzZQotCQkJCUZyZWVOdW1iZXIgPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4U3dGcmVlSWR4ICsgVFhfUklOR19TSVpFIC0gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCAtIDE7Ci0KLQkJCWlmIChGcmVlTnVtYmVyID49IE51bWJlclJlcXVpcmVkKQotCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JCQlicmVhazsKLQotCQljYXNlIFFJRF9NR01UOgotCQkJaWYgKHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPiBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4KQotCQkJCUZyZWVOdW1iZXIgPSBwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4IC0gcEFkLT5NZ210UmluZy5UeENwdUlkeCAtIDE7Ci0JCQllbHNlCi0JCQkJRnJlZU51bWJlciA9IHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggKyBNR01UX1JJTkdfU0laRSAtIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHggLSAxOwotCi0JCQlpZiAoRnJlZU51bWJlciA+PSBOdW1iZXJSZXF1aXJlZCkKLQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiUlRNUEZyZWVUWERSZXF1ZXN0OjpJbnZhbGlkIFF1ZUlkeCg9JWQpXG4iLCBRdWVJZHgpKTsKLQkJCWJyZWFrOwotCX0KLQkqRnJlZU51bWJlcklzID0gKFVDSEFSKUZyZWVOdW1iZXI7Ci0KLQlyZXR1cm4gKFN0YXR1cyk7Ci19Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotCi1WT0lEIFJUTVBTZW5kRGlzYXNzb2NpYXRpb25GcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLX0KLQotVk9JRAlSVE1QU2VuZE51bGxGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCVR4UmF0ZSwKLQlJTglCT09MRUFOCQkJYlFvc051bGwpCi17Ci0JVUNIQVIJTnVsbEZyYW1lWzQ4XTsKLQlVTE9ORwlMZW5ndGg7Ci0JUEhFQURFUl84MDJfMTEJcEhlYWRlcl84MDJfMTE7Ci0KLQotI2lmZGVmIFJBTElOS19BVEUKLQlpZihBVEVfT04ocEFkKSkKLQl7Ci0JCXJldHVybjsKLQl9Ci0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0gICAgLy8gV1BBIDgwMi4xeCBzZWN1cmVkIHBvcnQgY29udHJvbAotICAgIGlmICgoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKLSAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8Ci0gICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKLSAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQkJCSAgfHwgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBUUlVFKQotI2VuZGlmCi0gICAgICAgICkgJiYKLSAgICAgICAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKLQl7Ci0JCXJldHVybjsKLQl9Ci0KLQlOZGlzWmVyb01lbW9yeShOdWxsRnJhbWUsIDQ4KTsKLQlMZW5ndGggPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7Ci0KLQlwSGVhZGVyXzgwMl8xMSA9IChQSEVBREVSXzgwMl8xMSkgTnVsbEZyYW1lOwotCi0JcEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPSBCVFlQRV9EQVRBOwotCXBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9OVUxMX0ZVTkM7Ci0JcEhlYWRlcl84MDJfMTEtPkZDLlRvRHMgPSAxOwotCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOwotCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0KLQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkKLQl7Ci0JCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7Ci0JfQotCWVsc2UKLQl7Ci0JCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkgPyAxOiAwOwotCX0KLQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSBwQWQtPkNvbW1vbkNmZy5Ec2lmcyArIFJUTVBDYWxjRHVyYXRpb24ocEFkLCBUeFJhdGUsIDE0KTsKLQotCXBBZC0+U2VxdWVuY2UrKzsKLQlwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwQWQtPlNlcXVlbmNlOwotCi0JLy8gUHJlcGFyZSBRb3NOdWxsIGZ1bmN0aW9uIGZyYW1lCi0JaWYgKGJRb3NOdWxsKQotCXsKLQkJcEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPSBTVUJUWVBFX1FPU19OVUxMOwotCi0JCS8vIGNvcHkgUU9TIGNvbnRyb2wgYnl0ZXMKLQkJTnVsbEZyYW1lW0xlbmd0aF0JPSAgMDsKLQkJTnVsbEZyYW1lW0xlbmd0aCsxXSA9ICAwOwotCQlMZW5ndGggKz0gMjsvLyBpZiBwYWQgd2l0aCAyIGJ5dGVzIGZvciBhbGlnbm1lbnQsIEFQU0Qgd2lsbCBmYWlsCi0JfQotCi0JSEFMX0tpY2tPdXROdWxsRnJhbWVUeChwQWQsIDAsIE51bGxGcmFtZSwgTGVuZ3RoKTsKLQotfQotCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVZPSUQJUlRNUFNlbmRSVFNGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwREEsCi0JSU4JdW5zaWduZWQgaW50CU5leHRNcGR1U2l6ZSwKLQlJTglVQ0hBUgkJCVR4UmF0ZSwKLQlJTglVQ0hBUgkJCVJUU1JhdGUsCi0JSU4JVVNIT1JUCQkJQWNrRHVyYXRpb24sCi0JSU4JVUNIQVIJCQlRdWVJZHgsCi0JSU4JVUNIQVIJCQlGcmFtZUdhcCkKLXsKLX0KLQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgRklORCBFTkNSWVBUIEtFWSBBTkQgREVDSURFIENJUEhFUiBBTEdPUklUSE0KLS8vCQlGaW5kIHRoZSBXUEEga2V5LCBlaXRoZXIgR3JvdXAgb3IgUGFpcndpc2UgS2V5Ci0vLwkJTEVBUCArIFRLSVAgYWxzbyB1c2UgV1BBIGtleS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBEZWNpZGUgV0VQIGJpdCBhbmQgY2lwaGVyIHN1aXRlIHRvIGJlIHVzZWQuIFNhbWUgY2lwaGVyIHN1aXRlIHNob3VsZCBiZSB1c2VkIGZvciB3aG9sZSBmcmFnbWVudCBidXJzdAotLy8gSW4gQ2lzY28gQ0NYIDIuMCBMZWFwIEF1dGhlbnRpY2F0aW9uCi0vLwkJICAgV2VwU3RhdHVzIGlzIE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQgYnV0IHRoZSBrZXkgd2lsbCB1c2UgUGFpcndpc2VLZXkKLS8vCQkgICBJbnN0ZWFkIG9mIHRoZSBTaGFyZWRLZXksIFNoYXJlZEtleSBMZW5ndGggbWF5IGJlIFplcm8uCi1WT0lEIFNUQUZpbmRDaXBoZXJBbGdvcml0aG0oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaykKLXsKLQlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlDaXBoZXI7CQkJCS8vIFRvIGluZGljYXRlIGNpcGhlciB1c2VkIGZvciB0aGlzIHBhY2tldAotCVVDSEFSCQkJCQkJCUNpcGhlckFsZyA9IENJUEhFUl9OT05FOwkJLy8gY2lwaGVyIGFsb2dyaXRobQotCVVDSEFSCQkJCQkJCUtleUlkeCA9IDB4ZmY7Ci0JUFVDSEFSCQkJCQkJCXBTcmNCdWZWQTsKLQlQQ0lQSEVSX0tFWQkJCQkJCXBLZXkgPSBOVUxMOwotCi0JcFNyY0J1ZlZBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBUeEJsay0+cFBhY2tldCk7Ci0KLQl7Ci0JICAgIC8vIFNlbGVjdCBDaXBoZXIKLQkgICAgaWYgKCgqcFNyY0J1ZlZBICYgMHgwMSkgJiYgKEFESE9DX09OKHBBZCkpKQotCSAgICAgICAgQ2lwaGVyID0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXI7IC8vIENpcGhlciBmb3IgTXVsdGljYXN0IG9yIEJyb2FkY2FzdAotCSAgICBlbHNlCi0JICAgICAgICBDaXBoZXIgPSBwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyOyAvLyBDaXBoZXIgZm9yIFVuaWNhc3QKLQotCQlpZiAoUlRNUF9HRVRfUEFDS0VUX0VBUE9MKHBUeEJsay0+cFBhY2tldCkpCi0JCXsKLQkJCUFTU0VSVChwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPD0gQ0lQSEVSX0NLSVAxMjgpOwotCi0JCQkvLyA0LXdheSBoYW5kc2hha2luZyBmcmFtZSBtdXN0IGJlIGNsZWFyCi0JCQlpZiAoIShUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JDbGVhckVBUEZyYW1lKSkgJiYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZykgJiYKLQkJCQkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuKSkKLQkJCXsKLQkJCQlDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGc7Ci0JCQkJS2V5SWR4ID0gMDsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkKLQkJewotCQkJCUtleUlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKLQkJfQotCQllbHNlIGlmICgoQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHx8Ci0JCQkJIChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpCi0JCXsKLQkJCWlmICgoKnBTcmNCdWZWQSAmIDB4MDEpICYmIChBREhPQ19PTihwQWQpKSkgLy8gbXVsdGljYXN0Ci0JCQkJS2V5SWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOwotCQkJZWxzZSBpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuKQotCQkJCUtleUlkeCA9IDA7Ci0JCQllbHNlCi0JCQkJS2V5SWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOwotCQl9Ci0KLQkJaWYgKEtleUlkeCA9PSAweGZmKQotCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0JCWVsc2UgaWYgKChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkgfHwgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID09IDApKQotCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCSAgICBlbHNlIGlmICggcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICYmCi0JICAgICAgICAgICAgIChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkgJiYKLQkgICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBUUlVFKSAmJgotCSAgICAgICAgICAgICAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKLQkgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9OT05FOwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQkJZWxzZQotCQl7Ci0JCQkvL0hlYWRlcl84MDJfMTEuRkMuV2VwID0gMTsKLQkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnOwotCQkJcEtleSA9ICZwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdOwotCQl9Ci0JfQotCi0JcFR4QmxrLT5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JcFR4QmxrLT5wS2V5ID0gcEtleTsKLX0KLQotCi1WT0lEIFNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBUWF9CTEsgICAgICAgICAgKnBUeEJsaykKLXsKLQotCUhFQURFUl84MDJfMTEJKnBIZWFkZXJfODAyXzExOwotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCUJPT0xFQU4JYkRMU0ZyYW1lID0gRkFMU0U7Ci0JSU5UCURsc0VudHJ5SW5kZXggPSAwOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCi0JLy8KLQkvLyBNQUtFIEEgQ09NTU9OIDgwMi4xMSBIRUFERVIKLQkvLwotCi0JLy8gbm9ybWFsIHdsYW4gaGVhZGVyIHNpemUgOiAyNCBvY3RldHMKLQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7Ci0KLQlwSGVhZGVyXzgwMl8xMSA9IChIRUFERVJfODAyXzExICopICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07Ci0KLQlOZGlzWmVyb01lbW9yeShwSGVhZGVyXzgwMl8xMSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLQotCXBIZWFkZXJfODAyXzExLT5GQy5GckRzID0gMDsKLQlwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9IEJUWVBFX0RBVEE7Ci0JcEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPSAoKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpID8gU1VCVFlQRV9RREFUQSA6IFNVQlRZUEVfREFUQSk7Ci0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQlpZiAoSU5GUkFfT04ocEFkKSkKLQl7Ci0JCS8vIENoZWNrIGlmIHRoZSBmcmFtZSBjYW4gYmUgc2VudCB0aHJvdWdoIERMUyBkaXJlY3QgbGluayBpbnRlcmZhY2UKLQkJLy8gSWYgcGFja2V0IGNhbiBiZSBzZW50IHRocm91Z2ggRExTLCB0aGVuIGZvcmNlIGFnZ3JlZ2F0aW9uIGRpc2FibGUuIChIYXJkIHRvIGRldGVybWluZSBwZWVyIFNUQSdzIGNhcGFiaWxpdHkpCi0JCURsc0VudHJ5SW5kZXggPSBSVE1QQ2hlY2tETFNGcmFtZShwQWQsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7Ci0JCWlmIChEbHNFbnRyeUluZGV4ID49IDApCi0JCQliRExTRnJhbWUgPSBUUlVFOwotCQllbHNlCi0JCQliRExTRnJhbWUgPSBGQUxTRTsKLQl9Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLSAgICBpZiAocFR4QmxrLT5wTWFjRW50cnkpCi0JewotCQlpZiAoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iRm9yY2VOb25Rb1MpKQotCQl7Ci0JCQlwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwVHhCbGstPnBNYWNFbnRyeS0+Tm9uUW9zRGF0YVNlcTsKLQkJCXBUeEJsay0+cE1hY0VudHJ5LT5Ob25Rb3NEYXRhU2VxID0gKHBUeEJsay0+cE1hY0VudHJ5LT5Ob25Rb3NEYXRhU2VxKzEpICYgTUFYU0VROwotCQl9Ci0JCWVsc2UKLQkJewotCQkJewotCSAgICBwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwVHhCbGstPnBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldOwotCSAgICBwVHhCbGstPnBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldID0gKHBUeEJsay0+cE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV0rMSkgJiBNQVhTRVE7Ci0JfQotCX0KLQl9Ci0JZWxzZQotCXsKLQkJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcEFkLT5TZXF1ZW5jZTsKLQkJcEFkLT5TZXF1ZW5jZSA9IChwQWQtPlNlcXVlbmNlKzEpICYgTUFYU0VROyAvLyBuZXh0IHNlcXVlbmNlCi0JfQotCi0JcEhlYWRlcl84MDJfMTEtPkZyYWcgPSAwOwotCi0JcEhlYWRlcl84MDJfMTEtPkZDLk1vcmVEYXRhID0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iTW9yZURhdGEpOwotCi0JewotCQlpZiAoSU5GUkFfT04ocEFkKSkKLQkJewotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQkJaWYgKGJETFNGcmFtZSkKLQkJCXsKLQkJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMSwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKLQkJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci0JCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJCQlwSGVhZGVyXzgwMl8xMS0+RkMuVG9EcyA9IDA7Ci0JCQl9Ci0JCQllbHNlCi0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0JCQl7Ci0JCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMSwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOwotCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjMsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7Ci0JCQlwSGVhZGVyXzgwMl8xMS0+RkMuVG9EcyA9IDE7Ci0JCX0KLQkJfQotCQllbHNlIGlmIChBREhPQ19PTihwQWQpKQotCQl7Ci0JCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMSwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKLQkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKLQkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQlwSGVhZGVyXzgwMl8xMS0+RkMuVG9EcyA9IDA7Ci0JCX0KLQl9Ci0KLQlpZiAocFR4QmxrLT5DaXBoZXJBbGcgIT0gQ0lQSEVSX05PTkUpCi0JCXBIZWFkZXJfODAyXzExLT5GQy5XZXAgPSAxOwotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBTVEVQIDIuIE1BS0UgQSBDT01NT04gODAyLjExIEhFQURFUiBTSEFSRUQgQlkgRU5USVJFIEZSQUdNRU5UIEJVUlNULiBGaWxsIHNlcXVlbmNlIGxhdGVyLgotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpCi0JcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKLQllbHNlCi0JcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKTsKLX0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotVk9JRCBTVEFCdWlsZENhY2hlODAyXzExSGVhZGVyKAotCUlOIFJUTVBfQURBUFRFUgkJKnBBZCwKLQlJTiBUWF9CTEsJCQkqcFR4QmxrLAotCUlOIFVDSEFSCQkJKnBIZWFkZXIpCi17Ci0JTUFDX1RBQkxFX0VOVFJZCSpwTWFjRW50cnk7Ci0JUEhFQURFUl84MDJfMTEJcEhlYWRlcjgwMjExOwotCi0JcEhlYWRlcjgwMjExID0gKFBIRUFERVJfODAyXzExKXBIZWFkZXI7Ci0JcE1hY0VudHJ5ID0gcFR4QmxrLT5wTWFjRW50cnk7Ci0KLQkvLwotCS8vIFVwZGF0ZSB0aGUgY2FjaGVkIDgwMi4xMSBIRUFERVIKLQkvLwotCi0JLy8gbm9ybWFsIHdsYW4gaGVhZGVyIHNpemUgOiAyNCBvY3RldHMKLQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7Ci0KLQkvLyBNb3JlIEJpdAotCXBIZWFkZXI4MDIxMS0+RkMuTW9yZURhdGEgPSBUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JNb3JlRGF0YSk7Ci0KLQkvLyBTZXF1ZW5jZQotCXBIZWFkZXI4MDIxMS0+U2VxdWVuY2UgPSBwTWFjRW50cnktPlR4U2VxW3BUeEJsay0+VXNlclByaW9yaXR5XTsKLSAgICBwTWFjRW50cnktPlR4U2VxW3BUeEJsay0+VXNlclByaW9yaXR5XSA9IChwTWFjRW50cnktPlR4U2VxW3BUeEJsay0+VXNlclByaW9yaXR5XSsxKSAmIE1BWFNFUTsKLQotCXsKLQkJLy8gQ2hlY2sgaWYgdGhlIGZyYW1lIGNhbiBiZSBzZW50IHRocm91Z2ggRExTIGRpcmVjdCBsaW5rIGludGVyZmFjZQotCQkvLyBJZiBwYWNrZXQgY2FuIGJlIHNlbnQgdGhyb3VnaCBETFMsIHRoZW4gZm9yY2UgYWdncmVnYXRpb24gZGlzYWJsZS4gKEhhcmQgdG8gZGV0ZXJtaW5lIHBlZXIgU1RBJ3MgY2FwYWJpbGl0eSkKLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJQk9PTEVBTgliRExTRnJhbWUgPSBGQUxTRTsKLQkJSU5UCURsc0VudHJ5SW5kZXggPSAwOwotCi0JCURsc0VudHJ5SW5kZXggPSBSVE1QQ2hlY2tETFNGcmFtZShwQWQsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7Ci0JCWlmIChEbHNFbnRyeUluZGV4ID49IDApCi0JCQliRExTRnJhbWUgPSBUUlVFOwotCQllbHNlCi0JCQliRExTRnJhbWUgPSBGQUxTRTsKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQotCQkvLyBUaGUgYWRkcjMgb2Ygbm9ybWFsIHBhY2tldCBzZW5kIGZyb20gRFMgaXMgRGVzdCBNYWMgYWRkcmVzcy4KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJaWYgKGJETFNGcmFtZSkKLQkJewotCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyODAyMTEtPkFkZHIxLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIpOwotCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyODAyMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQlwSGVhZGVyODAyMTEtPkZDLlRvRHMgPSAwOwotCQl9Ci0JCWVsc2UKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQkJaWYgKEFESE9DX09OKHBBZCkpCi0JCQlDT1BZX01BQ19BRERSKHBIZWFkZXI4MDIxMS0+QWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJZWxzZQotCQlDT1BZX01BQ19BRERSKHBIZWFkZXI4MDIxMS0+QWRkcjMsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7Ci0JfQotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBTVEVQIDIuIE1BS0UgQSBDT01NT04gODAyLjExIEhFQURFUiBTSEFSRUQgQlkgRU5USVJFIEZSQUdNRU5UIEJVUlNULiBGaWxsIHNlcXVlbmNlIGxhdGVyLgotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpCi0JcEhlYWRlcjgwMjExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7Ci0JZWxzZQotCXBIZWFkZXI4MDIxMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOwotfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1zdGF0aWMgaW5saW5lIFBVQ0hBUiBTVEFfQnVpbGRfQVJhbGlua19GcmFtZV9IZWFkZXIoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gVFhfQkxLCQkqcFR4QmxrKQotewotCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7Ci0JSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7Ci0JUE5ESVNfUEFDS0VUCXBOZXh0UGFja2V0OwotCVVJTlQzMgkJCW5leHRCdWZMZW47Ci0JUFFVRVVFX0VOVFJZCXBRRW50cnk7Ci0KLQlTVEFGaW5kQ2lwaGVyQWxnb3JpdGhtKHBBZCwgcFR4QmxrKTsKLQlTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcihwQWQsIHBUeEJsayk7Ci0KLQotCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOwotCXBIZWFkZXJfODAyXzExID0gKEhFQURFUl84MDJfMTEgKikgcEhlYWRlckJ1ZlB0cjsKLQotCS8vIHN0ZWFsICJvcmRlciIgYml0IHRvIG1hcmsgImFnZ3JlZ2F0aW9uIgotCXBIZWFkZXJfODAyXzExLT5GQy5PcmRlciA9IDE7Ci0KLQkvLyBza2lwIGNvbW1vbiBoZWFkZXIKLQlwSGVhZGVyQnVmUHRyICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKLQotCWlmIChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JXTU0pKQotCXsKLQkJLy8KLQkJLy8gYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMKLQkJLy8KLQkJKnBIZWFkZXJCdWZQdHIgPSAocFR4QmxrLT5Vc2VyUHJpb3JpdHkgJiAweDBGKTsKLQotCQkqKHBIZWFkZXJCdWZQdHIrMSkgPSAwOwotCQlwSGVhZGVyQnVmUHRyICs9MjsKLQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7Ci0JfQotCi0JLy8gcGFkZGluZyBhdCBmcm9udCBvZiBMTEMgaGVhZGVyLiBMTEMgaGVhZGVyIHNob3VsZCBhdCA0LWJ5dGVzIGFsaWdtZW50LgotCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKXBIZWFkZXJCdWZQdHI7Ci0JcEhlYWRlckJ1ZlB0ciA9IChQVUNIQVIpUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7Ci0JcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7Ci0KLQkvLyBGb3IgUkEgQWdncmVnYXRpb24sCi0JLy8gcHV0IHRoZSAybmQgTVNEVSBsZW5ndGgoZXh0cmEgMi1ieXRlIGZpZWxkKSBhZnRlciBRT1NfQ09OVFJPTCBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdAotCXBRRW50cnkgPSBwVHhCbGstPlR4UGFja2V0TGlzdC5IZWFkOwotCXBOZXh0UGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOwotCW5leHRCdWZMZW4gPSBHRVRfT1NfUEtUX0xFTihwTmV4dFBhY2tldCk7Ci0JaWYgKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBOZXh0UGFja2V0KSkKLQkJbmV4dEJ1ZkxlbiAtPSBMRU5HVEhfODAyXzFROwotCi0JKnBIZWFkZXJCdWZQdHIgPSAoVUNIQVIpbmV4dEJ1ZkxlbiAmIDB4ZmY7Ci0JKihwSGVhZGVyQnVmUHRyKzEpID0gKFVDSEFSKShuZXh0QnVmTGVuID4+IDgpOwotCi0JcEhlYWRlckJ1ZlB0ciArPSAyOwotCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSAyOwotCi0JcmV0dXJuIHBIZWFkZXJCdWZQdHI7Ci0KLX0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotc3RhdGljIGlubGluZSBQVUNIQVIgU1RBX0J1aWxkX0FNU0RVX0ZyYW1lX0hlYWRlcigKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBUWF9CTEsJCSpwVHhCbGspCi17Ci0JUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsvLywgcFNhdmVCdWZQdHI7Ci0JSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7Ci0KLQotCVNUQUZpbmRDaXBoZXJBbGdvcml0aG0ocEFkLCBwVHhCbGspOwotCVNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrKTsKLQotCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOwotCXBIZWFkZXJfODAyXzExID0gKEhFQURFUl84MDJfMTEgKikgcEhlYWRlckJ1ZlB0cjsKLQotCS8vIHNraXAgY29tbW9uIGhlYWRlcgotCXBIZWFkZXJCdWZQdHIgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOwotCi0JLy8KLQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcwotCS8vCi0JKnBIZWFkZXJCdWZQdHIgPSAocFR4QmxrLT5Vc2VyUHJpb3JpdHkgJiAweDBGKTsKLQotCS8vCi0JLy8gQS1NU0RVIHBhY2tldAotCS8vCi0JKnBIZWFkZXJCdWZQdHIgfD0gMHg4MDsKLQotCSoocEhlYWRlckJ1ZlB0cisxKSA9IDA7Ci0JcEhlYWRlckJ1ZlB0ciArPTI7Ci0JcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7Ci0KLQkvL3BTYXZlQnVmUHRyID0gcEhlYWRlckJ1ZlB0cjsKLQotCS8vCi0JLy8gcGFkZGluZyBhdCBmcm9udCBvZiBMTEMgaGVhZGVyCi0JLy8gTExDIGhlYWRlciBzaG91bGQgbG9jYXRlIGF0IDQtb2N0ZXRzIGFsaWdtZW50Ci0JLy8KLQkvLyBAQEAgTXBkdUhlYWRlckxlbiBleGNsdWRpbmcgcGFkZGluZyBAQEAKLQkvLwotCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKXBIZWFkZXJCdWZQdHI7Ci0JcEhlYWRlckJ1ZlB0ciA9IChQVUNIQVIpIFJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOwotCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOwotCi0JcmV0dXJuIHBIZWFkZXJCdWZQdHI7Ci0KLX0KLQotCi1WT0lEIFNUQV9BTVBEVV9GcmFtZV9UeCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrKQotewotCUhFQURFUl84MDJfMTEJKnBIZWFkZXJfODAyXzExOwotCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7Ci0JVVNIT1JUCQkJRnJlZU51bWJlcjsKLQlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeTsKLQlCT09MRUFOCQkJYlZMQU5Qa3Q7Ci0JUFFVRVVFX0VOVFJZCXBRRW50cnk7Ci0KLQlBU1NFUlQocFR4QmxrKTsKLQotCXdoaWxlKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpCi0JewotCQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7Ci0JCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKLQkJaWYgKCBSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCi0JCXsKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQliVkxBTlBrdCA9IChSVE1QX0dFVF9QQUNLRVRfVkxBTihwVHhCbGstPnBQYWNrZXQpID8gVFJVRSA6IEZBTFNFKTsKLQotCQlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKLQkJaWYgKHBNYWNFbnRyeS0+aXNDYWNoZWQpCi0JCXsKLQkJCS8vIE5PVEU6IFBsZWFzZSBtYWtlIHN1cmUgdGhlIHNpemUgb2YgcE1hY0VudHJ5LT5DYWNoZWRCdWZbXSBpcyBzbWFsbGVyIHRoYW4gcFR4QmxrLT5IZWFkZXJCdWZbXSEhISEKLQkJCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSwgKFBVQ0hBUikmcE1hY0VudHJ5LT5DYWNoZWRCdWZbMF0sIFRYV0lfU0laRSArIHNpemVvZihIRUFERVJfODAyXzExKSk7Ci0JCQlwSGVhZGVyQnVmUHRyID0gKFBVQ0hBUikoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXSk7Ci0JCQlTVEFCdWlsZENhY2hlODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrLCBwSGVhZGVyQnVmUHRyKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVNUQUZpbmRDaXBoZXJBbGdvcml0aG0ocEFkLCBwVHhCbGspOwotCQkJU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIocEFkLCBwVHhCbGspOwotCi0JCQlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKLQkJfQotCi0KLQkJcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKSBwSGVhZGVyQnVmUHRyOwotCi0JCS8vIHNraXAgY29tbW9uIGhlYWRlcgotCQlwSGVhZGVyQnVmUHRyICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKLQotCQkvLwotCQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcwotCQkvLwotCQkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOwotCQkqKHBIZWFkZXJCdWZQdHIrMSkgPSAwOwotCQlwSGVhZGVyQnVmUHRyICs9MjsKLQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7Ci0KLQkJLy8KLQkJLy8gYnVpbGQgSFRDKwotCQkvLyBIVEMgY29udHJvbCBmaWxlZCBmb2xsb3dpbmcgUW9TIGZpZWxkCi0JCS8vCi0JCWlmICgocEFkLT5Db21tb25DZmcuYlJkZyA9PSBUUlVFKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwVHhCbGstPnBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpKQotCQl7Ci0JCQlpZiAocE1hY0VudHJ5LT5pc0NhY2hlZCA9PSBGQUxTRSkKLQkJCXsKLQkJCQkvLyBtYXJrIEhUQyBiaXQKLQkJCQlwSGVhZGVyXzgwMl8xMS0+RkMuT3JkZXIgPSAxOwotCi0JCQkJTmRpc1plcm9NZW1vcnkocEhlYWRlckJ1ZlB0ciwgNCk7Ci0JCQkJKihwSGVhZGVyQnVmUHRyKzMpIHw9IDB4ODA7Ci0JCQl9Ci0JCQlwSGVhZGVyQnVmUHRyICs9IDQ7Ci0JCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gNDsKLQkJfQotCi0JCS8vcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gcEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGVhZGVyQnVmIC0gVFhXSV9TSVpFIC0gVFhJTkZPX1NJWkU7Ci0JCUFTU0VSVChwVHhCbGstPk1wZHVIZWFkZXJMZW4gPj0gMjQpOwotCi0JCS8vIHNraXAgODAyLjMgaGVhZGVyCi0JCXBUeEJsay0+cFNyY0J1ZkRhdGEgPSBwVHhCbGstPnBTcmNCdWZIZWFkZXIgKyBMRU5HVEhfODAyXzM7Ci0JCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7Ci0KLQkJLy8gc2tpcCB2bGFuIHRhZwotCQlpZiAoYlZMQU5Qa3QpCi0JCXsKLQkJCXBUeEJsay0+cFNyY0J1ZkRhdGEJKz0gTEVOR1RIXzgwMl8xUTsKLQkJCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7Ci0JCX0KLQotCQkvLwotCQkvLyBwYWRkaW5nIGF0IGZyb250IG9mIExMQyBoZWFkZXIKLQkJLy8gTExDIGhlYWRlciBzaG91bGQgbG9jYXRlIGF0IDQtb2N0ZXRzIGFsaWdtZW50Ci0JCS8vCi0JCS8vIEBAQCBNcGR1SGVhZGVyTGVuIGV4Y2x1ZGluZyBwYWRkaW5nIEBAQAotCQkvLwotCQlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORylwSGVhZGVyQnVmUHRyOwotCQlwSGVhZGVyQnVmUHRyID0gKFBVQ0hBUikgUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7Ci0JCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOwotCi0JCXsKLQotCQkJLy8KLQkJCS8vIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMKLQkJCS8vCi0JCQlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX09GRlNFVChwVHhCbGstPnBTcmNCdWZEYXRhLTIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKLQkJCWlmIChwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCkKLQkJCXsKLQkJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCwgNik7Ci0JCQkJcEhlYWRlckJ1ZlB0ciArPSA2OwotCQkJCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQotCQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgMik7Ci0JCQkJcEhlYWRlckJ1ZlB0ciArPSAyOwotCQkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfODAyXzFfSDsKLQkJCX0KLQotCQl9Ci0KLQkJaWYgKHBNYWNFbnRyeS0+aXNDYWNoZWQpCi0JCXsKLSAgICAgICAgICAgIFJUTVBXcml0ZVR4V0lfQ2FjaGUocEFkLCAoUFRYV0lfU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLCBwVHhCbGspOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKLQotCQkJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikoJnBNYWNFbnRyeS0+Q2FjaGVkQnVmWzBdKSwgc2l6ZW9mKHBNYWNFbnRyeS0+Q2FjaGVkQnVmKSk7Ci0JCQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSgmcE1hY0VudHJ5LT5DYWNoZWRCdWZbMF0pLCAoUFVDSEFSKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgKHBIZWFkZXJCdWZQdHIgLSAoUFVDSEFSKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSkpOwotCQkJcE1hY0VudHJ5LT5pc0NhY2hlZCA9IFRSVUU7Ci0JCX0KLQotCQkvLyBjYWxjdWxhdGUgVHJhbnNtaXR0ZWQgQU1QRFUgY291bnQgYW5kIEJ5dGVDb3VudAotCQl7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkTVBEVXNJbkFNUERVQ291bnQudS5Mb3dQYXJ0ICsrOwotCQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZE9jdGV0c0luQU1QRFVDb3VudC5RdWFkUGFydCArPSBwVHhCbGstPlNyY0J1ZkxlbjsKLQkJfQotCi0JCS8vRnJlZU51bWJlciA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKLQotCQlIQUxfV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBUUlVFLCAmRnJlZU51bWJlcik7Ci0KLQkJLy8KLQkJLy8gS2ljayBvdXQgVHgKLQkJLy8KLSAgICAgICAgICAgICAgICBpZiAoIVJUTVBfVEVTVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19ESVNBQkxFX1RYKSkKLQkJSEFMX0tpY2tPdXRUeChwQWQsIHBUeEJsaywgcFR4QmxrLT5RdWVJZHgpOwotCi0JCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOwotCX0KLQotfQotCi0KLVZPSUQgU1RBX0FNU0RVX0ZyYW1lX1R4KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGspCi17Ci0JUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKLQlVU0hPUlQJCQlGcmVlTnVtYmVyOwotCVVTSE9SVAkJCXN1YkZyYW1lUGF5bG9hZExlbiA9IDA7CS8vIEFNU0RVIFN1YmZyYW1lIGxlbmd0aCB3aXRob3V0IEFNU0RVLUhlYWRlciAvIFBhZGRpbmcuCi0JVVNIT1JUCQkJdG90YWxNUERVU2l6ZT0wOwotCVVDSEFSCQkJKnN1YkZyYW1lSGVhZGVyOwotCVVDSEFSCQkJcGFkZGluZyA9IDA7Ci0JVVNIT1JUCQkJRmlyc3RUeCA9IDAsIExhc3RUeElkeCA9IDA7Ci0JQk9PTEVBTgkJCWJWTEFOUGt0OwotCWludAkJCWZyYW1lTnVtID0gMDsKLQlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKLQotCi0JQVNTRVJUKHBUeEJsayk7Ci0KLQlBU1NFUlQoKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlciA+IDEpKTsKLQotCXdoaWxlKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpCi0JewotCQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7Ci0JCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKLQkJaWYgKFJUTVBfRmlsbFR4QmxrSW5mbyhwQWQsIHBUeEJsaykgIT0gVFJVRSkKLQkJewotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWJWTEFOUGt0ID0gKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBUeEJsay0+cFBhY2tldCkgPyBUUlVFIDogRkFMU0UpOwotCi0JCS8vIHNraXAgODAyLjMgaGVhZGVyCi0JCXBUeEJsay0+cFNyY0J1ZkRhdGEgPSBwVHhCbGstPnBTcmNCdWZIZWFkZXIgKyBMRU5HVEhfODAyXzM7Ci0JCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7Ci0KLQkJLy8gc2tpcCB2bGFuIHRhZwotCQlpZiAoYlZMQU5Qa3QpCi0JCXsKLQkJCXBUeEJsay0+cFNyY0J1ZkRhdGEJKz0gTEVOR1RIXzgwMl8xUTsKLQkJCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7Ci0JCX0KLQotCQlpZiAoZnJhbWVOdW0gPT0gMCkKLQkJewotCQkJcEhlYWRlckJ1ZlB0ciA9IFNUQV9CdWlsZF9BTVNEVV9GcmFtZV9IZWFkZXIocEFkLCBwVHhCbGspOwotCi0JCQkvLyBOT1RFOiBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGZpbmFsIGZyYW1lIHdhcyBoYW5kbGVkLgotCQkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbMF07Ci0JCQlwYWRkaW5nID0gUk9VTkRfVVAoTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArIHN1YkZyYW1lUGF5bG9hZExlbiwgNCkgLSAoTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArIHN1YkZyYW1lUGF5bG9hZExlbik7Ci0JCQlOZGlzWmVyb01lbW9yeShwSGVhZGVyQnVmUHRyLCBwYWRkaW5nICsgTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCk7Ci0JCQlwSGVhZGVyQnVmUHRyICs9IHBhZGRpbmc7Ci0JCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBwYWRkaW5nOwotCQl9Ci0KLQkJLy8KLQkJLy8gQS1NU0RVIHN1YmZyYW1lCi0JCS8vICAgREEoNikrU0EoNikrTGVuZ3RoKDIpICsgTExDL1NOQVAgRW5jYXAKLQkJLy8KLQkJc3ViRnJhbWVIZWFkZXIgPSBwSGVhZGVyQnVmUHRyOwotCQlzdWJGcmFtZVBheWxvYWRMZW4gPSBwVHhCbGstPlNyY0J1ZkxlbjsKLQotCQlOZGlzTW92ZU1lbW9yeShzdWJGcmFtZUhlYWRlciwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyLCAxMik7Ci0KLQotCQlwSGVhZGVyQnVmUHRyICs9IExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7Ci0JCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOwotCi0KLQkJLy8KLQkJLy8gSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cwotCQkvLwotCQlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX09GRlNFVChwVHhCbGstPnBTcmNCdWZEYXRhLTIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKLQotCQlzdWJGcmFtZVBheWxvYWRMZW4gPSBwVHhCbGstPlNyY0J1ZkxlbjsKLQotCQlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCi0JCXsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKLQkJCXBIZWFkZXJCdWZQdHIgKz0gNjsKLQkJCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQotCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmRGF0YS0yLCAyKTsKLQkJCXBIZWFkZXJCdWZQdHIgKz0gMjsKLQkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfODAyXzFfSDsKLQkJCXN1YkZyYW1lUGF5bG9hZExlbiArPSBMRU5HVEhfODAyXzFfSDsKLQkJfQotCi0JCS8vIHVwZGF0ZSBzdWJGcmFtZSBMZW5ndGggZmllbGQKLQkJc3ViRnJhbWVIZWFkZXJbMTJdID0gKHN1YkZyYW1lUGF5bG9hZExlbiAmIDB4RkYwMCkgPj4gODsKLQkJc3ViRnJhbWVIZWFkZXJbMTNdID0gc3ViRnJhbWVQYXlsb2FkTGVuICYgMHhGRjsKLQotCQl0b3RhbE1QRFVTaXplICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOwotCi0JCWlmIChmcmFtZU51bSA9PTApCi0JCQlGaXJzdFR4ID0gSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFtZU51bSwgJkZyZWVOdW1iZXIpOwotCQllbHNlCi0JCQlMYXN0VHhJZHggPSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYW1lTnVtLCAmRnJlZU51bWJlcik7Ci0KLQkJZnJhbWVOdW0rKzsKLQotCQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKLQotCQkvLyBjYWxjdWxhdGUgVHJhbnNtaXR0ZWQgQU1TRFUgQ291bnQgYW5kIEJ5dGVDb3VudAotCQl7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1TRFVDb3VudC51Lkxvd1BhcnQgKys7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkT2N0ZXRzSW5BTVNEVS5RdWFkUGFydCArPSB0b3RhbE1QRFVTaXplOwotCQl9Ci0KLQl9Ci0KLQlIQUxfRmluYWxXcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIHRvdGFsTVBEVVNpemUsIEZpcnN0VHgpOwotCUhBTF9MYXN0VHhJZHgocEFkLCBwVHhCbGstPlF1ZUlkeCwgTGFzdFR4SWR4KTsKLQotCS8vCi0JLy8gS2ljayBvdXQgVHgKLQkvLwotICAgICAgICBpZiAoIVJUTVBfVEVTVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19ESVNBQkxFX1RYKSkKLQlIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBwVHhCbGstPlF1ZUlkeCk7Ci19Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLVZPSUQgU1RBX0xlZ2FjeV9GcmFtZV9UeCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrKQotewotCUhFQURFUl84MDJfMTEJKnBIZWFkZXJfODAyXzExOwotCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7Ci0JVVNIT1JUCQkJRnJlZU51bWJlcjsKLQlCT09MRUFOCQkJYlZMQU5Qa3Q7Ci0JUFFVRVVFX0VOVFJZCXBRRW50cnk7Ci0KLQlBU1NFUlQocFR4QmxrKTsKLQotCi0JcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QpOwotCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKLQlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKQotCXsKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9NQ0FTVF9GUkFNRSkKLQl7Ci0JCUlOQ19DT1VOVEVSNjQocEFkLT5XbGFuQ291bnRlcnMuTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50KTsKLQl9Ci0KLQlpZiAoUlRNUF9HRVRfUEFDS0VUX1JUUyhwVHhCbGstPnBQYWNrZXQpKQotCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYlJ0c1JlcXVpcmVkKTsKLQllbHNlCi0JCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JSdHNSZXF1aXJlZCk7Ci0KLQliVkxBTlBrdCA9IChSVE1QX0dFVF9QQUNLRVRfVkxBTihwVHhCbGstPnBQYWNrZXQpID8gVFJVRSA6IEZBTFNFKTsKLQotCWlmIChwVHhCbGstPlR4UmF0ZSA8IHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZSkKLQkJcFR4QmxrLT5UeFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGU7Ci0KLQlTVEFGaW5kQ2lwaGVyQWxnb3JpdGhtKHBBZCwgcFR4QmxrKTsKLQlTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcihwQWQsIHBUeEJsayk7Ci0KLQotCS8vIHNraXAgODAyLjMgaGVhZGVyCi0JcFR4QmxrLT5wU3JjQnVmRGF0YSA9IHBUeEJsay0+cFNyY0J1ZkhlYWRlciArIExFTkdUSF84MDJfMzsKLQlwVHhCbGstPlNyY0J1ZkxlbiAgLT0gTEVOR1RIXzgwMl8zOwotCi0JLy8gc2tpcCB2bGFuIHRhZwotCWlmIChiVkxBTlBrdCkKLQl7Ci0JCXBUeEJsay0+cFNyY0J1ZkRhdGEJKz0gTEVOR1RIXzgwMl8xUTsKLQkJcFR4QmxrLT5TcmNCdWZMZW4JLT0gTEVOR1RIXzgwMl8xUTsKLQl9Ci0KLQlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKLQlwSGVhZGVyXzgwMl8xMSA9IChIRUFERVJfODAyXzExICopIHBIZWFkZXJCdWZQdHI7Ci0KLQkvLyBza2lwIGNvbW1vbiBoZWFkZXIKLQlwSGVhZGVyQnVmUHRyICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKLQotCWlmIChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JXTU0pKQotCXsKLQkJLy8KLQkJLy8gYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMKLQkJLy8KLQkJKihwSGVhZGVyQnVmUHRyKSA9ICgocFR4QmxrLT5Vc2VyUHJpb3JpdHkgJiAweDBGKSB8IChwQWQtPkNvbW1vbkNmZy5BY2tQb2xpY3lbcFR4QmxrLT5RdWVJZHhdPDw1KSk7Ci0JCSoocEhlYWRlckJ1ZlB0cisxKSA9IDA7Ci0JCXBIZWFkZXJCdWZQdHIgKz0yOwotCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKLQl9Ci0KLQkvLyBUaGUgcmVtYWluaW5nIGNvbnRlbnQgb2YgTVBEVSBoZWFkZXIgc2hvdWxkIGxvY2F0ZSBhdCA0LW9jdGV0cyBhbGlnbWVudAotCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKXBIZWFkZXJCdWZQdHI7Ci0JcEhlYWRlckJ1ZlB0ciA9IChQVUNIQVIpIFJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOwotCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOwotCi0JewotCi0JCS8vCi0JCS8vIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMKLQkJLy8KLQkJLy8KLQkJLy8gaWYgb3JpZ2luYWwgRXRoZXJuZXQgZnJhbWUgY29udGFpbnMgbm8gTExDL1NOQVAsCi0JCS8vIHRoZW4gYW4gZXh0cmEgTExDL1NOQVAgZW5jYXAgaXMgcmVxdWlyZWQKLQkJLy8KLQkJRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9TVEFSVChwVHhCbGstPnBTcmNCdWZIZWFkZXIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKLQkJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQotCQl7Ci0JCQlVQ0hBUiB2bGFuX3NpemU7Ci0KLQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKLQkJCXBIZWFkZXJCdWZQdHIgKz0gNjsKLQkJCS8vIHNraXAgdmxhbiB0YWcKLQkJCXZsYW5fc2l6ZSA9ICAoYlZMQU5Qa3QpID8gTEVOR1RIXzgwMl8xUSA6IDA7Ci0JCQkvLyBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikKLQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcisxMit2bGFuX3NpemUsIDIpOwotCQkJcEhlYWRlckJ1ZlB0ciArPSAyOwotCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IExFTkdUSF84MDJfMV9IOwotCQl9Ci0KLQl9Ci0KLQkvLwotCS8vIHByZXBhcmUgZm9yIFRYV0kKLQkvLyB1c2UgV2NpZCBhcyBLZXkgSW5kZXgKLQkvLwotCi0JUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKLQotCS8vRnJlZU51bWJlciA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKLQotCUhBTF9Xcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIFRSVUUsICZGcmVlTnVtYmVyKTsKLQotCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7Ci0KLQkvLwotCS8vIEtpY2sgb3V0IFR4Ci0JLy8KLQlpZiAoIVJUTVBfVEVTVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19ESVNBQkxFX1RYKSkKLQlIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBwVHhCbGstPlF1ZUlkeCk7Ci19Ci0KLQotVk9JRCBTVEFfQVJhbGlua19GcmFtZV9UeCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrKQotewotCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7Ci0JVVNIT1JUCQkJRnJlZU51bWJlcjsKLQlVU0hPUlQJCQl0b3RhbE1QRFVTaXplPTA7Ci0JVVNIT1JUCQkJRmlyc3RUeCwgTGFzdFR4SWR4OwotCWludAkJCWZyYW1lTnVtID0gMDsKLQlCT09MRUFOCQkJYlZMQU5Qa3Q7Ci0JUFFVRVVFX0VOVFJZCXBRRW50cnk7Ci0KLQotCUFTU0VSVChwVHhCbGspOwotCi0JQVNTRVJUKChwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXI9PSAyKSk7Ci0KLQotCUZpcnN0VHggPSBMYXN0VHhJZHggPSAwOyAgLy8gSXMgaXQgb2sgaW5pdCB0aGV5IGFzIDA/Ci0Jd2hpbGUocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCkKLQl7Ci0JCXBRRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0KTsKLQkJcFR4QmxrLT5wUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOwotCi0JCWlmIChSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCi0JCXsKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQliVkxBTlBrdCA9IChSVE1QX0dFVF9QQUNLRVRfVkxBTihwVHhCbGstPnBQYWNrZXQpID8gVFJVRSA6IEZBTFNFKTsKLQotCQkvLyBza2lwIDgwMi4zIGhlYWRlcgotCQlwVHhCbGstPnBTcmNCdWZEYXRhID0gcFR4QmxrLT5wU3JjQnVmSGVhZGVyICsgTEVOR1RIXzgwMl8zOwotCQlwVHhCbGstPlNyY0J1ZkxlbiAgLT0gTEVOR1RIXzgwMl8zOwotCi0JCS8vIHNraXAgdmxhbiB0YWcKLQkJaWYgKGJWTEFOUGt0KQotCQl7Ci0JCQlwVHhCbGstPnBTcmNCdWZEYXRhCSs9IExFTkdUSF84MDJfMVE7Ci0JCQlwVHhCbGstPlNyY0J1ZkxlbgktPSBMRU5HVEhfODAyXzFROwotCQl9Ci0KLQkJaWYgKGZyYW1lTnVtID09IDApCi0JCXsJLy8gRm9yIGZpcnN0IGZyYW1lLCB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgODAyLjExIGhlYWRlciArIHBhZGRpbmcob3B0aW9uYWwpICsgUkEtQUdHLUxFTiArIFNOQVAgSGVhZGVyCi0KLQkJCXBIZWFkZXJCdWZQdHIgPSBTVEFfQnVpbGRfQVJhbGlua19GcmFtZV9IZWFkZXIocEFkLCBwVHhCbGspOwotCi0JCQkvLyBJdCdzIG9rIHdyaXRlIHRoZSBUeFdJIGhlcmUsIGJlY2F1c2UgdGhlIFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudAotCQkJLy8Jd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGZpbmFsIGZyYW1lIHdhcyBoYW5kbGVkLgotCQkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKLQotCi0JCQkvLwotCQkJLy8gSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cwotCQkJLy8KLQkJCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfT0ZGU0VUKHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOwotCi0JCQlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCi0JCQl7Ci0JCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIDYpOwotCQkJCXBIZWFkZXJCdWZQdHIgKz0gNjsKLQkJCQkvLyBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikKLQkJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZEYXRhLTIsIDIpOwotCQkJCXBIZWFkZXJCdWZQdHIgKz0gMjsKLQkJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gTEVOR1RIXzgwMl8xX0g7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7CS8vIEZvciBzZWNvbmQgYWdncmVnYXRlZCBmcmFtZSwgd2UgbmVlZCBjcmVhdGUgdGhlIDgwMi4zIGhlYWRlciB0byBoZWFkZXJCdWYsIGJlY2F1c2UgUENJIHdpbGwgY29weSBpdCB0byBTRFB0cjAuCi0KLQkJCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbMF07Ci0JCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSAwOwotCi0JCQkvLyBBLVJhbGluayBzdWItc2VxdWVudCBmcmFtZSBoZWFkZXIgaXMgdGhlIHNhbWUgYXMgODAyLjMgaGVhZGVyLgotCQkJLy8gICBEQSg2KStTQSg2KStGcmFtZVR5cGUoMikKLQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkhlYWRlciwgMTIpOwotCQkJcEhlYWRlckJ1ZlB0ciArPSAxMjsKLQkJCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQotCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmRGF0YS0yLCAyKTsKLQkJCXBIZWFkZXJCdWZQdHIgKz0gMjsKLQkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiA9IExFTkdUSF9BUkFMSU5LX1NVQkZSQU1FSEVBRDsKLQkJfQotCi0JCXRvdGFsTVBEVVNpemUgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5TcmNCdWZMZW47Ci0KLQkJLy9GcmVlTnVtYmVyID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOwotCQlpZiAoZnJhbWVOdW0gPT0wKQotCQkJRmlyc3RUeCA9IEhBTF9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhbWVOdW0sICZGcmVlTnVtYmVyKTsKLQkJZWxzZQotCQkJTGFzdFR4SWR4ID0gSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFtZU51bSwgJkZyZWVOdW1iZXIpOwotCi0JCWZyYW1lTnVtKys7Ci0KLQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEFnZ3JlZ2F0aW9uQ291bnQrKzsKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7Ci0KLQl9Ci0KLQlIQUxfRmluYWxXcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIHRvdGFsTVBEVVNpemUsIEZpcnN0VHgpOwotCUhBTF9MYXN0VHhJZHgocEFkLCBwVHhCbGstPlF1ZUlkeCwgTGFzdFR4SWR4KTsKLQotCS8vCi0JLy8gS2ljayBvdXQgVHgKLQkvLwotCWlmICghUlRNUF9URVNUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0RJU0FCTEVfVFgpKQotCUhBTF9LaWNrT3V0VHgocEFkLCBwVHhCbGssIHBUeEJsay0+UXVlSWR4KTsKLQotfQotCi0KLVZPSUQgU1RBX0ZyYWdtZW50X0ZyYW1lX1R4KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFRYX0JMSwkJKnBUeEJsaykKLXsKLQlIRUFERVJfODAyXzExCSpwSGVhZGVyXzgwMl8xMTsKLQlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOwotCVVTSE9SVAkJCUZyZWVOdW1iZXI7Ci0JVUNIQVIJCQlmcmFnTnVtID0gMDsKLQlQQUNLRVRfSU5GTwkJUGFja2V0SW5mbzsKLQlVU0hPUlQJCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAwOwotCVVJTlQzMgkJCUZyZWVNcGR1U2l6ZSwgU3JjUmVtYWluaW5nQnl0ZXM7Ci0JVVNIT1JUCQkJQWNrRHVyYXRpb247Ci0JVUlOVAkJCU5leHRNcGR1U2l6ZTsKLQlCT09MRUFOCQkJYlZMQU5Qa3Q7Ci0JUFFVRVVFX0VOVFJZCXBRRW50cnk7Ci0JSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQ7Ci0KLQotCUFTU0VSVChwVHhCbGspOwotCi0JcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QpOwotCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKLQlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKQotCXsKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlBU1NFUlQoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iQWxsb3dGcmFnKSk7Ci0JYlZMQU5Qa3QgPSAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocFR4QmxrLT5wUGFja2V0KSA/IFRSVUUgOiBGQUxTRSk7Ci0KLQlTVEFGaW5kQ2lwaGVyQWxnb3JpdGhtKHBBZCwgcFR4QmxrKTsKLQlTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcihwQWQsIHBUeEJsayk7Ci0KLQlpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApCi0JewotCQlwVHhCbGstPnBQYWNrZXQgPSBkdXBsaWNhdGVfcGt0X3dpdGhfVEtJUF9NSUMocEFkLCBwVHhCbGstPnBQYWNrZXQpOwotCQlpZiAocFR4QmxrLT5wUGFja2V0ID09IE5VTEwpCi0JCQlyZXR1cm47Ci0JCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBUeEJsay0+cFBhY2tldCwgJlBhY2tldEluZm8sICZwVHhCbGstPnBTcmNCdWZIZWFkZXIsICZwVHhCbGstPlNyY0J1Zkxlbik7Ci0JfQotCi0JLy8gc2tpcCA4MDIuMyBoZWFkZXIKLQlwVHhCbGstPnBTcmNCdWZEYXRhID0gcFR4QmxrLT5wU3JjQnVmSGVhZGVyICsgTEVOR1RIXzgwMl8zOwotCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7Ci0KLQotCS8vIHNraXAgdmxhbiB0YWcKLQlpZiAoYlZMQU5Qa3QpCi0JewotCQlwVHhCbGstPnBTcmNCdWZEYXRhCSs9IExFTkdUSF84MDJfMVE7Ci0JCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7Ci0JfQotCi0JcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07Ci0JcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKXBIZWFkZXJCdWZQdHI7Ci0KLQotCS8vIHNraXAgY29tbW9uIGhlYWRlcgotCXBIZWFkZXJCdWZQdHIgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOwotCi0JaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpCi0JewotCQkvLwotCQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcwotCQkvLwotCQkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOwotCi0JCSoocEhlYWRlckJ1ZlB0cisxKSA9IDA7Ci0JCXBIZWFkZXJCdWZQdHIgKz0yOwotCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKLQl9Ci0KLQkvLwotCS8vIHBhZGRpbmcgYXQgZnJvbnQgb2YgTExDIGhlYWRlcgotCS8vIExMQyBoZWFkZXIgc2hvdWxkIGxvY2F0ZSBhdCA0LW9jdGV0cyBhbGlnbWVudAotCS8vCi0JcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpcEhlYWRlckJ1ZlB0cjsKLQlwSGVhZGVyQnVmUHRyID0gKFBVQ0hBUikgUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7Ci0JcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7Ci0KLQotCi0JLy8KLQkvLyBJbnNlcnQgTExDLVNOQVAgZW5jYXBzdWxhdGlvbiAtIDggb2N0ZXRzCi0JLy8KLQkvLwotCS8vIGlmIG9yaWdpbmFsIEV0aGVybmV0IGZyYW1lIGNvbnRhaW5zIG5vIExMQy9TTkFQLAotCS8vIHRoZW4gYW4gZXh0cmEgTExDL1NOQVAgZW5jYXAgaXMgcmVxdWlyZWQKLQkvLwotCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfU1RBUlQocFR4QmxrLT5wU3JjQnVmSGVhZGVyLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCk7Ci0JaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQotCXsKLQkJVUNIQVIgdmxhbl9zaXplOwotCi0JCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKLQkJcEhlYWRlckJ1ZlB0ciArPSA2OwotCQkvLyBza2lwIHZsYW4gdGFnCi0JCXZsYW5fc2l6ZSA9ICAoYlZMQU5Qa3QpID8gTEVOR1RIXzgwMl8xUSA6IDA7Ci0JCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQotCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIrMTIrdmxhbl9zaXplLCAyKTsKLQkJcEhlYWRlckJ1ZlB0ciArPSAyOwotCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gTEVOR1RIXzgwMl8xX0g7Ci0JfQotCi0KLQkvLyBJZiBUS0lQIGlzIHVzZWQgYW5kIGZyYWdtZW50YXRpb24gaXMgcmVxdWlyZWQuIERyaXZlciBoYXMgdG8KLQkvLwlhcHBlbmQgVEtJUCBNSUMgYXQgdGFpbCBvZiB0aGUgc2NhdHRlciBidWZmZXIKLQkvLwlNQUMgQVNJQyB3aWxsIG9ubHkgcGVyZm9ybSBJVi9FSVYvSUNWIGluc2VydGlvbiBidXQgbm8gVEtJUCBNSUMKLQlpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApCi0JewotCQlSVE1QQ2FsY3VsYXRlTUlDVmFsdWUocEFkLCBwVHhCbGstPnBQYWNrZXQsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCBwVHhCbGstPnBLZXksIDApOwotCi0JCS8vIE5PVEU6IERPTidUIHJlZmVyIHRoZSBza2ItPmxlbiBkaXJlY3RseSBhZnRlciBmb2xsb3dpbmcgY29weS4gQmVjYXN1ZSB0aGUgbGVuZ3RoIGlzIG5vdCBhZGp1c3QKLQkJLy8JCQl0byBjb3JyZWN0IGxlbmdodCwgcmVmZXIgdG8gcFR4QmxrLT5TcmNCdWZMZW4gZm9yIHRoZSBwYWNrZXQgbGVuZ3RoIGluIGZvbGxvd2luZyBwcm9ncmVzcy4KLQkJTmRpc01vdmVNZW1vcnkocFR4QmxrLT5wU3JjQnVmRGF0YSArIHBUeEJsay0+U3JjQnVmTGVuLCAmcEFkLT5Qcml2YXRlSW5mby5UeC5NSUNbMF0sIDgpOwotCQkvL3NrYl9wdXQoKFJUUEtUX1RPX09TUEtUKHBUeEJsay0+cFBhY2tldCkpLT50YWlsLCA4KTsKLQkJcFR4QmxrLT5TcmNCdWZMZW4gKz0gODsKLQkJcFR4QmxrLT5Ub3RhbEZyYW1lTGVuICs9IDg7Ci0JCXBUeEJsay0+Q2lwaGVyQWxnID0gQ0lQSEVSX1RLSVBfTk9fTUlDOwotCX0KLQotCS8vCi0JLy8gY2FsY3VhdGUgdGhlIG92ZXJoZWFkIGJ5dGVzIHRoYXQgZW5jcnlwdGlvbiBhbGdvcml0aG0gbWF5IGFkZC4gVGhpcwotCS8vIGFmZmVjdHMgdGhlIGNhbGN1bGF0ZSBvZiAiZHVyYXRpb24iIGZpZWxkCi0JLy8KLQlpZiAoKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkgfHwgKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9XRVAxMjgpKQotCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSA4OyAvL1dFUDogSVZbNF0gKyBJQ1ZbNF07Ci0JZWxzZSBpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVBfTk9fTUlDKQotCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAxMjsvL1RLSVA6IElWWzRdICsgRUlWWzRdICsgSUNWWzRdLCBNSUMgd2lsbCBiZSBhZGRlZCB0byBUb3RhbFBhY2tldExlbmd0aAotCWVsc2UgaWYgKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9US0lQKQotCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAyMDsvL1RLSVA6IElWWzRdICsgRUlWWzRdICsgSUNWWzRdICsgTUlDWzhdCi0JZWxzZSBpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX0FFUykKLQkJRW5jcnlwdGlvbk92ZXJoZWFkID0gMTY7CS8vIEFFUzogSVZbNF0gKyBFSVZbNF0gKyBNSUNbOF0KLQllbHNlCi0JCUVuY3J5cHRpb25PdmVyaGVhZCA9IDA7Ci0KLQlwVHJhbnNtaXQgPSBwVHhCbGstPnBUcmFuc21pdDsKLQkvLyBEZWNpZGUgdGhlIFRYIHJhdGUKLQlpZiAocFRyYW5zbWl0LT5maWVsZC5NT0RFID09IE1PREVfQ0NLKQotCQlwVHhCbGstPlR4UmF0ZSA9IHBUcmFuc21pdC0+ZmllbGQuTUNTOwotCWVsc2UgaWYgKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA9PSBNT0RFX09GRE0pCi0JCXBUeEJsay0+VHhSYXRlID0gcFRyYW5zbWl0LT5maWVsZC5NQ1MgKyBSQVRFX0ZJUlNUX09GRE1fUkFURTsKLQllbHNlCi0JCXBUeEJsay0+VHhSYXRlID0gUkFURV82XzU7Ci0KLQkvLyBkZWNpZGUgaG93IG11Y2ggdGltZSBhbiBBQ0svQ1RTIGZyYW1lIHdpbGwgY29uc3VtZSBpbiB0aGUgYWlyCi0JaWYgKHBUeEJsay0+VHhSYXRlIDw9IFJBVEVfTEFTVF9PRkRNX1JBVEUpCi0JCUFja0R1cmF0aW9uID0gUlRNUENhbGNEdXJhdGlvbihwQWQsIHBBZC0+Q29tbW9uQ2ZnLkV4cGVjdGVkQUNLUmF0ZVtwVHhCbGstPlR4UmF0ZV0sIDE0KTsKLQllbHNlCi0JCUFja0R1cmF0aW9uID0gUlRNUENhbGNEdXJhdGlvbihwQWQsIFJBVEVfNl81LCAxNCk7Ci0KLQkvLyBJbml0IHRoZSB0b3RhbCBwYXlsb2FkIGxlbmd0aCBvZiB0aGlzIGZyYW1lLgotCVNyY1JlbWFpbmluZ0J5dGVzID0gcFR4QmxrLT5TcmNCdWZMZW47Ci0KLQlwVHhCbGstPlRvdGFsRnJhZ051bSA9IDB4ZmY7Ci0KLQlkbyB7Ci0KLQkJRnJlZU1wZHVTaXplID0gcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgLSBMRU5HVEhfQ1JDOwotCi0JCUZyZWVNcGR1U2l6ZSAtPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47Ci0KLQkJaWYgKFNyY1JlbWFpbmluZ0J5dGVzIDw9IEZyZWVNcGR1U2l6ZSkKLQkJewkvLyB0aGlzIGlzIHRoZSBsYXN0IG9yIG9ubHkgZnJhZ21lbnQKLQotCQkJcFR4QmxrLT5TcmNCdWZMZW4gPSBTcmNSZW1haW5pbmdCeXRlczsKLQotCQkJcEhlYWRlcl84MDJfMTEtPkZDLk1vcmVGcmFnID0gMDsKLQkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IHBBZC0+Q29tbW9uQ2ZnLkRzaWZzICsgQWNrRHVyYXRpb247Ci0KLQkJCS8vIEluZGljYXRlIHRoZSBsb3dlciBsYXllciB0aGF0IHRoaXMncyB0aGUgbGFzdCBmcmFnbWVudC4KLQkJCXBUeEJsay0+VG90YWxGcmFnTnVtID0gZnJhZ051bTsKLQkJfQotCQllbHNlCi0JCXsJLy8gbW9yZSBmcmFnbWVudCBpcyByZXF1aXJlZAotCi0JCQlwVHhCbGstPlNyY0J1ZkxlbiA9IEZyZWVNcGR1U2l6ZTsKLQotCQkJTmV4dE1wZHVTaXplID0gbWluKCgoVUlOVClTcmNSZW1haW5pbmdCeXRlcyAtIHBUeEJsay0+U3JjQnVmTGVuKSwgKChVSU5UKXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSk7Ci0JCQlwSGVhZGVyXzgwMl8xMS0+RkMuTW9yZUZyYWcgPSAxOwotCQkJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gKDMgKiBwQWQtPkNvbW1vbkNmZy5Ec2lmcykgKyAoMiAqIEFja0R1cmF0aW9uKSArIFJUTVBDYWxjRHVyYXRpb24ocEFkLCBwVHhCbGstPlR4UmF0ZSwgTmV4dE1wZHVTaXplICsgRW5jcnlwdGlvbk92ZXJoZWFkKTsKLQkJfQotCi0JCWlmIChmcmFnTnVtID09IDApCi0JCQlwVHhCbGstPkZyYW1lR2FwID0gSUZTX0hUVFhPUDsKLQkJZWxzZQotCQkJcFR4QmxrLT5GcmFtZUdhcCA9IElGU19TSUZTOwotCi0JCVJUTVBXcml0ZVR4V0lfRGF0YShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7Ci0KLQkJSEFMX1dyaXRlRnJhZ1R4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYWdOdW0sICZGcmVlTnVtYmVyKTsKLQotCQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKLQotCQkvLyBVcGRhdGUgdGhlIGZyYW1lIG51bWJlciwgcmVtYWluaW5nIHNpemUgb2YgdGhlIE5ESVMgcGFja2V0IHBheWxvYWQuCi0KLQkJLy8gc3BhY2UgZm9yIDgwMi4xMSBoZWFkZXIuCi0JCWlmIChmcmFnTnVtID09IDAgJiYgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCi0JCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gLT0gTEVOR1RIXzgwMl8xX0g7Ci0KLQkJZnJhZ051bSsrOwotCQlTcmNSZW1haW5pbmdCeXRlcyAtPSBwVHhCbGstPlNyY0J1ZkxlbjsKLQkJcFR4QmxrLT5wU3JjQnVmRGF0YSArPSBwVHhCbGstPlNyY0J1ZkxlbjsKLQotCQlwSGVhZGVyXzgwMl8xMS0+RnJhZysrOwkgLy8gaW5jcmVhc2UgRnJhZyAjCi0KLQl9d2hpbGUoU3JjUmVtYWluaW5nQnl0ZXMgPiAwKTsKLQotCS8vCi0JLy8gS2ljayBvdXQgVHgKLQkvLwotCWlmICghUlRNUF9URVNUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0RJU0FCTEVfVFgpKQotCUhBTF9LaWNrT3V0VHgocEFkLCBwVHhCbGssIHBUeEJsay0+UXVlSWR4KTsKLX0KLQotCi0jZGVmaW5lIFJFTEVBU0VfRlJBTUVTX09GX1RYQkxLKF9wQWQsIF9wVHhCbGssIF9wUUVudHJ5LCBfU3RhdHVzKQkJCQkJCQkJCQlcCi0JCXdoaWxlKF9wVHhCbGstPlR4UGFja2V0TGlzdC5IZWFkKQkJCQkJCQkJCQkJCQkJXAotCQl7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCV9wUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZfcFR4QmxrLT5UeFBhY2tldExpc3QpOwkJCQkJCQkJCVwKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQoX3BBZCwgUVVFVUVfRU5UUllfVE9fUEFDS0VUKF9wUUVudHJ5KSwgX1N0YXR1cyk7CVwKLQkJfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlDb3B5IGZyYW1lIGZyb20gd2FpdGluZyBxdWV1ZSBpbnRvIHJlbGF0aXZlIHJpbmcgYnVmZmVyIGFuZCBzZXQKLQlhcHByb3ByaWF0ZSBBU0lDIHJlZ2lzdGVyIHRvIGtpY2sgaGFyZHdhcmUgZW5jcnlwdGlvbiBiZWZvcmUgcmVhbGx5Ci0Jc2VudCBvdXQgdG8gYWlyLgotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlQTkRJU19QQUNLRVQJUG9pbnRlciB0byBvdXRnb2luZyBOZGlzIGZyYW1lCi0JCU51bWJlck9mRnJhZwlOdW1iZXIgb2YgZnJhZ21lbnQgcmVxdWlyZWQKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMgU1RBSGFyZFRyYW5zbWl0KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFRYX0JMSwkJCSpwVHhCbGssCi0JSU4JVUNIQVIJCQlRdWVJZHgpCi17Ci0JTkRJU19QQUNLRVQJCSpwUGFja2V0OwotCVBRVUVVRV9FTlRSWQlwUUVudHJ5OwotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gU1RFUCAwLiBETyBTQU5JVFkgQ0hFQ0sgQU5EIFNPTUUgRUFSTFkgUFJFUEFSQVRJT04uCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8KLQlBU1NFUlQocFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyKTsKLQlpZiAocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgicFR4QmxrLT5Ub3RhbEZyYW1lTnVtID09ICVsZCFcbiIsIHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcikpOwotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpOwotCi0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBTVEVQIDEuIFdBS0UgVVAgUEhZCi0JLy8JCW91dGdvaW5nIGZyYW1lIGFsd2F5cyB3YWtldXAgUEhZIHRvIHByZXZlbnQgZnJhbWUgbG9zdCBhbmQKLQkvLwkJdHVybiBvZmYgUFNNIGJpdCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gbm90IHRvIGNoYW5nZSBQU00gYml0LCBqdXN0IHNlbmQgdGhpcyBmcmFtZSBvdXQ/Ci0JaWYgKChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0JewotCSAgICBEQkdQUklOVF9SQVcoUlRfREVCVUdfSU5GTywgKCJBc2ljRm9yY2VXYWtldXAgQXQgSGFyZFR4XG4iKSk7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCUFzaWNGb3JjZVdha2V1cChwQWQsIFRSVUUpOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCX0KLQotCS8vIEl0IHNob3VsZCBub3QgY2hhbmdlIFBTTSBiaXQsIHdoZW4gQVBTRCB0dXJuIG9uLgotCWlmICgoIShwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQVBTRENhcGFibGUpICYmIChwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlID09IEZBTFNFKSkKLQkJfHwgKFJUTVBfR0VUX1BBQ0tFVF9FQVBPTChwVHhCbGstPnBQYWNrZXQpKQotCQl8fCAoUlRNUF9HRVRfUEFDS0VUX1dBSShwVHhCbGstPnBQYWNrZXQpKSkKLQl7Ci0JCWlmICgocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSAmJgotICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQKSkKLQkJCVJUTVBfU0VUX1BTTV9CSVQocEFkLCBQV1JfQUNUSVZFKTsKLQl9Ci0KLQlzd2l0Y2ggKHBUeEJsay0+VHhGcmFtZVR5cGUpCi0JewotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQljYXNlIFRYX0FNUERVX0ZSQU1FOgotCQkJCVNUQV9BTVBEVV9GcmFtZV9UeChwQWQsIHBUeEJsayk7Ci0JCQlicmVhazsKLQkJY2FzZSBUWF9BTVNEVV9GUkFNRToKLQkJCQlTVEFfQU1TRFVfRnJhbWVfVHgocEFkLCBwVHhCbGspOwotCQkJYnJlYWs7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCWNhc2UgVFhfTEVHQUNZX0ZSQU1FOgotCQkJCVNUQV9MZWdhY3lfRnJhbWVfVHgocEFkLCBwVHhCbGspOwotCQkJYnJlYWs7Ci0JCWNhc2UgVFhfTUNBU1RfRlJBTUU6Ci0JCQkJU1RBX0xlZ2FjeV9GcmFtZV9UeChwQWQsIHBUeEJsayk7Ci0JCQlicmVhazsKLQkJY2FzZSBUWF9SQUxJTktfRlJBTUU6Ci0JCQkJU1RBX0FSYWxpbmtfRnJhbWVfVHgocEFkLCBwVHhCbGspOwotCQkJYnJlYWs7Ci0JCWNhc2UgVFhfRlJBR19GUkFNRToKLQkJCQlTVEFfRnJhZ21lbnRfRnJhbWVfVHgocEFkLCBwVHhCbGspOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQl7Ci0JCQkJLy8gSXQgc2hvdWxkIG5vdCBoYXBwZW5lZCEKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZW5kIGEgcGFjZWt0IHdhcyBub3QgY2xhc3NpZmllZCEhIEl0IHNob3VsZCBub3QgaGFwcGVuIVxuIikpOwotCQkJCXdoaWxlKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcikKLQkJCQl7Ci0JCQkJCXBRRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0KTsKLQkJCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKLQkJCQkJaWYgKHBQYWNrZXQpCi0JCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKLQotfQotCi1VTE9ORyAgSGFzaEJ5dGVzUG9seW5vbWlhbChVQ0hBUiAqdmFsdWUsIHVuc2lnbmVkIGludCBsZW4pCi17Ci0gICB1bnNpZ25lZCBjaGFyICp3b3JkID0gdmFsdWU7Ci0gICB1bnNpZ25lZCBpbnQgcmV0ID0gMDsKLSAgIHVuc2lnbmVkIGludCBpOwotCi0gICBmb3IoaT0wOyBpIDwgbGVuOyBpKyspCi0gICB7Ci0JICBpbnQgbW9kID0gaSAlIDMyOwotCSAgcmV0IF49KHVuc2lnbmVkIGludCkgKHdvcmRbaV0pIDw8IG1vZDsKLQkgIHJldCBePSh1bnNpZ25lZCBpbnQpICh3b3JkW2ldKSA+PiAoMzIgLSBtb2QpOwotICAgfQotICAgcmV0dXJuIHJldDsKLX0KLQotVk9JRCBTdGFfQW5ub3VuY2Vfb3JfRm9yd2FyZF84MDJfM19QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKLXsKLQlpZiAoVFJVRQotCQkpCi0JewotCQlhbm5vdW5jZV84MDJfM19wYWNrZXQocEFkLCBwUGFja2V0KTsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhL3Nhbml0eS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvc2FuaXR5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZGExNWIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvc2FuaXR5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODIgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQlzYW5pdHkuYwotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUpvaG4gQ2hhbmcgIDIwMDQtMDktMDEgICAgICBhZGQgV01NIHN1cHBvcnQKLSovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi1leHRlcm4gVUNIQVIJQ0lTQ09fT1VJW107Ci0KLWV4dGVybiBVQ0hBUglXUEFfT1VJW107Ci1leHRlcm4gVUNIQVIJUlNOX09VSVtdOwotZXh0ZXJuIFVDSEFSCVdNRV9JTkZPX0VMRU1bXTsKLWV4dGVybiBVQ0hBUglXTUVfUEFSTV9FTEVNW107Ci1leHRlcm4gVUNIQVIJQ2N4MlFvc0luZm9bXTsKLWV4dGVybiBVQ0hBUglSQUxJTktfT1VJW107Ci1leHRlcm4gVUNIQVIJQlJPQURDT01fT1VJW107Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjawotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLUJPT0xFQU4gTWxtZVN0YXJ0UmVxU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0gICAgT1VUIENIQVIgU3NpZFtdLAotICAgIE9VVCBVQ0hBUiAqcFNzaWRMZW4pCi17Ci0gICAgTUxNRV9TVEFSVF9SRVFfU1RSVUNUICpJbmZvOwotCi0gICAgSW5mbyA9IChNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgKikoTXNnKTsKLQotICAgIGlmIChJbmZvLT5Tc2lkTGVuID4gTUFYX0xFTl9PRl9TU0lEKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVN0YXJ0UmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBTU0lEIGxlbmd0aFxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgKnBTc2lkTGVuID0gSW5mby0+U3NpZExlbjsKLSAgICBOZGlzTW92ZU1lbW9yeShTc2lkLCBJbmZvLT5Tc2lkLCAqcFNzaWRMZW4pOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjawotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotCi0gICAgSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIFBlZXJBc3NvY1JzcFNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpwTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBBZGRyMiwKLSAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCi0gICAgT1VUIFVTSE9SVCAqcFN0YXR1cywKLSAgICBPVVQgVVNIT1JUICpwQWlkLAotICAgIE9VVCBVQ0hBUiBTdXBSYXRlW10sCi0gICAgT1VUIFVDSEFSICpwU3VwUmF0ZUxlbiwKLSAgICBPVVQgVUNIQVIgRXh0UmF0ZVtdLAotICAgIE9VVCBVQ0hBUiAqcEV4dFJhdGVMZW4sCi0gICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAotICAgIE9VVCBBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotICAgIE9VVCBVQ0hBUgkJCSpwSHRDYXBhYmlsaXR5TGVuLAotICAgIE9VVCBVQ0hBUgkJCSpwQWRkSHRJbmZvTGVuLAotICAgIE9VVCBVQ0hBUgkJCSpwTmV3RXh0Q2hhbm5lbE9mZnNldCwKLSAgICBPVVQgUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCi0gICAgT1VUIFVDSEFSICpwQ2tpcEZsYWcpCi17Ci0gICAgQ0hBUiAgICAgICAgICBJZVR5cGUsICpQdHI7Ci0gICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOwotICAgIFBFSURfU1RSVUNUICAgcEVpZDsKLSAgICBVTE9ORyAgICAgICAgIExlbmd0aCA9IDA7Ci0KLQkqcE5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOwotCSpwSHRDYXBhYmlsaXR5TGVuID0gMDsKLQkqcEFkZEh0SW5mb0xlbiA9IDA7Ci0gICAgQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKLSAgICBQdHIgPSAoUENIQVIpcEZyYW1lLT5PY3RldDsKLSAgICBMZW5ndGggKz0gTEVOR1RIXzgwMl8xMTsKLQotICAgIE5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgJnBGcmFtZS0+T2N0ZXRbMF0sIDIpOwotICAgIExlbmd0aCArPSAyOwotICAgIE5kaXNNb3ZlTWVtb3J5KHBTdGF0dXMsICAgICAgICAgJnBGcmFtZS0+T2N0ZXRbMl0sIDIpOwotICAgIExlbmd0aCArPSAyOwotICAgICpwQ2tpcEZsYWcgPSAwOwotICAgICpwRXh0UmF0ZUxlbiA9IDA7Ci0gICAgcEVkY2FQYXJtLT5iVmFsaWQgPSBGQUxTRTsKLQotICAgIGlmICgqcFN0YXR1cyAhPSBNTE1FX1NVQ0NFU1MpCi0gICAgICAgIHJldHVybiBUUlVFOwotCi0gICAgTmRpc01vdmVNZW1vcnkocEFpZCwgJnBGcmFtZS0+T2N0ZXRbNF0sIDIpOwotICAgIExlbmd0aCArPSAyOwotCi0gICAgLy8gQWlkIGFscmVhZHkgc3dhcGVkIGJ5dGUgb3JkZXIgaW4gUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKCkgZm9yIGJpZyBlbmRpYW4gcGxhdGZvcm0KLSAgICAqcEFpZCA9ICgqcEFpZCkgJiAweDNmZmY7IC8vIEFJRCBpcyBsb3cgMTQtYml0Ci0KLSAgICAvLyAtLSBnZXQgc3VwcG9ydGVkIHJhdGVzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIEllVHlwZSA9IHBGcmFtZS0+T2N0ZXRbNl07Ci0gICAgKnBTdXBSYXRlTGVuID0gcEZyYW1lLT5PY3RldFs3XTsKLSAgICBpZiAoKEllVHlwZSAhPSBJRV9TVVBQX1JBVEVTKSB8fCAoKnBTdXBSYXRlTGVuID4gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckFzc29jUnNwU2FuaXR5IGZhaWwgLSB3cm9uZyBTdXBwb3J0ZWRSYXRlcyBJRVxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgTmRpc01vdmVNZW1vcnkoU3VwUmF0ZSwgJnBGcmFtZS0+T2N0ZXRbOF0sICpwU3VwUmF0ZUxlbik7Ci0KLQotICAgIExlbmd0aCA9IExlbmd0aCArIDIgKyAqcFN1cFJhdGVMZW47Ci0KLSAgICAvLyBtYW55IEFQIGltcGxlbWVudCBwcm9wcmlldGFyeSBJRXMgaW4gbm9uLXN0YW5kYXJkIG9yZGVyLCB3ZSdkIGJldHRlcgotICAgIC8vIHRvbGVyYXRlIG1pcy1vcmRlcmVkIElFcyB0byBnZXQgYmVzdCBjb21wYXRpYmlsaXR5Ci0gICAgcEVpZCA9IChQRUlEX1NUUlVDVCkgJnBGcmFtZS0+T2N0ZXRbOCArICgqcFN1cFJhdGVMZW4pXTsKLQotICAgIC8vIGdldCB2YXJpYWJsZSBmaWVsZHMgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgd2hpbGUgKChMZW5ndGggKyAyICsgcEVpZC0+TGVuKSA8PSBNc2dMZW4pCi0gICAgewotICAgICAgICBzd2l0Y2ggKHBFaWQtPkVpZCkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBJRV9FWFRfU1VQUF9SQVRFUzoKLSAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoRXh0UmF0ZSwgcEVpZC0+T2N0ZXQsIHBFaWQtPkxlbik7Ci0gICAgICAgICAgICAgICAgICAgICpwRXh0UmF0ZUxlbiA9IHBFaWQtPkxlbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICBjYXNlIElFX0hUX0NBUDoKLSAgICAgICAgICAgIGNhc2UgSUVfSFRfQ0FQMjoKLQkJCWlmIChwRWlkLT5MZW4gPj0gU0laRV9IVF9DQVBfSUUpICAvL05vdGU6IGFsbG93IGV4dGVuc2lvbi4hIQotCQkJewotCQkJCU5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksIHBFaWQtPk9jdGV0LCBTSVpFX0hUX0NBUF9JRSk7Ci0KLQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pKTsKLQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pKTsKLQotCQkJCSpwSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQXNzb2NSc3BTYW5pdHkgLSB3cm9uZyBJRV9IVF9DQVAuIFxuIikpOwotCQkJfQotCi0JCWJyZWFrOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotICAgICAgICAgICAgY2FzZSBJRV9BRERfSFQ6Ci0gICAgICAgICAgICBjYXNlIElFX0FERF9IVDI6Ci0JCQlpZiAocEVpZC0+TGVuID49IHNpemVvZihBRERfSFRfSU5GT19JRSkpCi0JCQl7Ci0JCQkJLy8gVGhpcyBJRSBhbGxvd3MgZXh0ZW5zaW9uLCBidXQgd2UgY2FuIGlnbm9yZSBleHRyYSBieXRlcyBiZXlvbmQgb3VyIGtub3dsZWRnZSAsIHNvIG9ubHkKLQkJCQkvLyBjb3B5IGZpcnN0IHNpemVvZihBRERfSFRfSU5GT19JRSkKLQkJCQlOZGlzTW92ZU1lbW9yeShwQWRkSHRJbmZvLCBwRWlkLT5PY3RldCwgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7Ci0KLQkJCQkqKFVTSE9SVCAqKSgmcEFkZEh0SW5mby0+QWRkSHRJbmZvMikgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEFkZEh0SW5mby0+QWRkSHRJbmZvMikpOwotCQkJCSooVVNIT1JUICopKCZwQWRkSHRJbmZvLT5BZGRIdEluZm8zKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwQWRkSHRJbmZvLT5BZGRIdEluZm8zKSk7Ci0KLQkJCQkqcEFkZEh0SW5mb0xlbiA9IFNJWkVfQUREX0hUX0lORk9fSUU7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQXNzb2NSc3BTYW5pdHkgLSB3cm9uZyBJRV9BRERfSFQuIFxuIikpOwotCQkJfQotCi0JCWJyZWFrOwotICAgICAgICAgICAgY2FzZSBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VUOgotCQkJaWYgKHBFaWQtPkxlbiA9PSAxKQotCQkJewotCQkJCSpwTmV3RXh0Q2hhbm5lbE9mZnNldCA9IHBFaWQtPk9jdGV0WzBdOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckFzc29jUnNwU2FuaXR5IC0gd3JvbmcgSUVfU0VDT05EQVJZX0NIX09GRlNFVC4gXG4iKSk7Ci0JCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCWJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIElFX1ZFTkRPUl9TUEVDSUZJQzoKLSAgICAgICAgICAgICAgICAvLyBoYW5kbGUgV01FIFBBUkFNVEVSIEVMRU1FTlQKLSAgICAgICAgICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXTUVfUEFSTV9FTEVNLCA2KSAmJiAocEVpZC0+TGVuID09IDI0KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFBVQ0hBUiBwdHI7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHBhcnNpbmcgRURDQSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlZhbGlkICAgICAgICAgID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUUFjayAgICAgICAgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDEwOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJRdWV1ZVJlcXVlc3QgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4MjA7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlR4b3BSZXF1ZXN0ICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHg0MDsKLSAgICAgICAgICAgICAgICAgICAgLy9wRWRjYVBhcm0tPmJNb3JlRGF0YUFjayAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4ODA7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+RWRjYVVwZGF0ZUNvdW50ID0gcEVpZC0+T2N0ZXRbNl0gJiAweDBmOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBUFNEQ2FwYWJsZSAgICA9IChwRWlkLT5PY3RldFs2XSAmIDB4ODApID8gMSA6IDA7Ci0gICAgICAgICAgICAgICAgICAgIHB0ciA9IChQVUNIQVIpJnBFaWQtPk9jdGV0WzhdOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGFjaSA9ICgqcHRyICYgMHg2MCkgPj4gNTsgLy8gYjV+NiBpcyBBQyBJTkRFWAotICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW2FjaV0gID0gKCgoKnB0cikgJiAweDEwKSA9PSAweDEwKTsgICAvLyBiNSBpcyBBQ00KLSAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bYWNpXSA9ICgqcHRyKSAmIDB4MGY7ICAgICAgICAgICAgICAgLy8gYjB+MyBpcyBBSUZTTgotICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pblthY2ldID0gKihwdHIrMSkgJiAweDBmOyAgICAgICAgICAgICAvLyBiMH40IGlzIEN3bWluCi0gICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W2FjaV0gPSAqKHB0cisxKSA+PiA0OyAgICAgICAgICAgICAgIC8vIGI1fjggaXMgQ3dtYXgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFthY2ldICA9ICoocHRyKzIpICsgMjU2ICogKCoocHRyKzMpKTsgLy8gaW4gdW5pdCBvZiAzMi11cwotICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IDQ7IC8vIHBvaW50IHRvIG5leHQgQUMKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckFzc29jUnNwU2FuaXR5IC0gaWdub3JlIHVucmVjb2duaXplZCBFSUQgPSAlZFxuIiwgcEVpZC0+RWlkKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBMZW5ndGggPSBMZW5ndGggKyAyICsgcEVpZC0+TGVuOwotICAgICAgICBwRWlkID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKXBFaWQgKyAyICsgcEVpZC0+TGVuKTsKLSAgICB9Ci0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotQk9PTEVBTiBQZWVyUHJvYmVSZXFTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBBZGRyMiwKLSAgICBPVVQgQ0hBUiBTc2lkW10sCi0gICAgT1VUIFVDSEFSICpwU3NpZExlbikKLXsKLSAgICBVQ0hBUiAgICAgICAgIElkeDsKLSAgICBVQ0hBUgkgICAgICBSYXRlTGVuOwotICAgIENIQVIgICAgICAgICAgSWVUeXBlOwotICAgIFBGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOwotCi0gICAgQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKLQotICAgIGlmICgocEZyYW1lLT5PY3RldFswXSAhPSBJRV9TU0lEKSB8fCAocEZyYW1lLT5PY3RldFsxXSA+IE1BWF9MRU5fT0ZfU1NJRCkpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyUHJvYmVSZXFTYW5pdHkgZmFpbCAtIHdyb25nIFNTSUQgSUUoVHlwZT0lZCxMZW49JWQpXG4iLHBGcmFtZS0+T2N0ZXRbMF0scEZyYW1lLT5PY3RldFsxXSkpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgKnBTc2lkTGVuID0gcEZyYW1lLT5PY3RldFsxXTsKLSAgICBOZGlzTW92ZU1lbW9yeShTc2lkLCAmcEZyYW1lLT5PY3RldFsyXSwgKnBTc2lkTGVuKTsKLQotICAgIElkeCA9ICpwU3NpZExlbiArIDI7Ci0KLSAgICAvLyAtLSBnZXQgc3VwcG9ydGVkIHJhdGVzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIEllVHlwZSA9IHBGcmFtZS0+T2N0ZXRbSWR4XTsKLSAgICBSYXRlTGVuID0gcEZyYW1lLT5PY3RldFtJZHggKyAxXTsKLSAgICBpZiAoSWVUeXBlICE9IElFX1NVUFBfUkFURVMpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyUHJvYmVSZXFTYW5pdHkgZmFpbCAtIHdyb25nIFN1cHBvcnRSYXRlcyBJRShUeXBlPSVkLExlbj0lZClcbiIscEZyYW1lLT5PY3RldFtJZHhdLHBGcmFtZS0+T2N0ZXRbSWR4KzFdKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUcpICYmIChSYXRlTGVuIDwgOCkpCi0gICAgICAgICAgICByZXR1cm4gKEZBTFNFKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIEdldFRpbUJpdCgKLSAgICBJTiBDSEFSICpQdHIsCi0gICAgSU4gVVNIT1JUIEFpZCwKLSAgICBPVVQgVUNIQVIgKlRpbUxlbiwKLSAgICBPVVQgVUNIQVIgKkJjYXN0RmxhZywKLSAgICBPVVQgVUNIQVIgKkR0aW1Db3VudCwKLSAgICBPVVQgVUNIQVIgKkR0aW1QZXJpb2QsCi0gICAgT1VUIFVDSEFSICpNZXNzYWdlVG9NZSkKLXsKLSAgICBVQ0hBUiAgICAgICAgICBCaXRDbnRsLCBOMSwgTjIsIE15Qnl0ZSwgTXlCaXQ7Ci0gICAgQ0hBUiAgICAgICAgICAqSWR4UHRyOwotCi0gICAgSWR4UHRyID0gUHRyOwotCi0gICAgSWR4UHRyICsrOwotICAgICpUaW1MZW4gPSAqSWR4UHRyOwotCi0gICAgLy8gZ2V0IERUSU0gQ291bnQgZnJvbSBUSU0gZWxlbWVudAotICAgIElkeFB0ciArKzsKLSAgICAqRHRpbUNvdW50ID0gKklkeFB0cjsKLQotICAgIC8vIGdldCBEVElNIFBlcmlvZCBmcm9tIFRJTSBlbGVtZW50Ci0gICAgSWR4UHRyKys7Ci0gICAgKkR0aW1QZXJpb2QgPSAqSWR4UHRyOwotCi0gICAgLy8gZ2V0IEJpdG1hcCBDb250cm9sIGZyb20gVElNIGVsZW1lbnQKLSAgICBJZHhQdHIrKzsKLSAgICBCaXRDbnRsID0gKklkeFB0cjsKLQotICAgIGlmICgoKkR0aW1Db3VudCA9PSAwKSAmJiAoQml0Q250bCAmIDB4MDEpKQotICAgICAgICAqQmNhc3RGbGFnID0gVFJVRTsKLSAgICBlbHNlCi0gICAgICAgICpCY2FzdEZsYWcgPSBGQUxTRTsKLQotICAgIC8vIFBhcnNlIFBhcnRpYWwgVmlydHVhbCBCaXRtYXAgZnJvbSBUSU0gZWxlbWVudAotICAgIE4xID0gQml0Q250bCAmIDB4ZmU7ICAgIC8vIE4xIGlzIHRoZSBmaXJzdCBiaXRtYXAgYnl0ZSMKLSAgICBOMiA9ICpUaW1MZW4gLSA0ICsgTjE7ICAvLyBOMiBpcyB0aGUgbGFzdCBiaXRtYXAgYnl0ZSMKLQotICAgIGlmICgoQWlkIDwgKE4xIDw8IDMpKSB8fCAoQWlkID49ICgoTjIgKyAxKSA8PCAzKSkpCi0gICAgICAgICpNZXNzYWdlVG9NZSA9IEZBTFNFOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE15Qnl0ZSA9IChBaWQgPj4gMykgLSBOMTsgICAgICAgICAgICAgICAgICAgICAgIC8vIG15IGJ5dGUgcG9zaXRpb24gaW4gdGhlIGJpdG1hcCBieXRlLXN0cmVhbQotICAgICAgICBNeUJpdCA9IEFpZCAlIDE2IC0gKChNeUJ5dGUgJiAweDAxKT8gODowKTsKLQotICAgICAgICBJZHhQdHIgKz0gKE15Qnl0ZSArIDEpOwotCi0gICAgICAgIC8vaWYgKCpJZHhQdHIpCi0gICAgICAgIC8vICAgIERCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiVElNIGJpdG1hcCA9IDB4JTAyeFxuIiwgKklkeFB0cikpOwotCi0gICAgICAgIGlmICgqSWR4UHRyICYgKDB4MDEgPDwgTXlCaXQpKQotICAgICAgICAgICAgKk1lc3NhZ2VUb01lID0gVFJVRTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgKk1lc3NhZ2VUb01lID0gRkFMU0U7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS9zeW5jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS9zeW5jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MjBlMDMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvc3luYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg0MCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXN5bmMuYwotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUpvaG4gQ2hhbmcJMjAwNC0wOS0wMSAgICAgIG1vZGlmaWVkIGZvciBydDI1NjEvMjY2MQotCUphbiBMZWUJCTIwMDYtMDgtMDEgICAgICBtb2RpZmllZCBmb3IgcnQyODYwIGZvciA4MDIuMTFuCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotI2RlZmluZSBBREhPQ19FTlRSWV9CRUFDT05fTE9TVF9USU1FCSgyKk9TX0haKQkvLyAyIHNlYwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVRoZSBzeW5jIHN0YXRlIG1hY2hpbmUsCi0JUGFyYW1ldGVyczoKLQkJU20gLSBwb2ludGVyIHRvIHRoZSBzdGF0ZSBtYWNoaW5lCi0JTm90ZToKLQkJdGhlIHN0YXRlIG1hY2hpbmUgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFN5bmNTdGF0ZU1hY2hpbmVJbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFNUQVRFX01BQ0hJTkUgKlNtLAotCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKLXsKLQlTdGF0ZU1hY2hpbmVJbml0KFNtLCBUcmFucywgTUFYX1NZTkNfU1RBVEUsIE1BWF9TWU5DX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylEcm9wLCBTWU5DX0lETEUsIFNZTkNfTUFDSElORV9CQVNFKTsKLQotCS8vIGNvbHVtbiAxCi0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTWU5DX0lETEUsIE1UMl9NTE1FX1NDQU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVTY2FuUmVxQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX01MTUVfSk9JTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZUpvaW5SZXFBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfTUxNRV9TVEFSVF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZVN0YXJ0UmVxQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX1BFRVJfQkVBQ09OLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJCZWFjb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfUEVFUl9QUk9CRV9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclByb2JlUmVxQWN0aW9uKTsKLQotCS8vY29sdW1uIDIKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9NTE1FX1NDQU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5TY2FuKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9NTE1FX0pPSU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5Kb2luKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9NTE1FX1NUQVJUX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuU3RhcnQpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX1BFRVJfQkVBQ09OLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJCZWFjb25BdEpvaW5BY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX0JFQUNPTl9USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKUJlYWNvblRpbWVvdXRBdEpvaW5BY3Rpb24pOwotCi0JLy8gY29sdW1uIDMKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfTUxNRV9TQ0FOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuU2Nhbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX01MTUVfSk9JTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkpvaW4pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9NTE1FX1NUQVJUX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuU3RhcnQpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9QRUVSX0JFQUNPTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQmVhY29uQXRTY2FuQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfUEVFUl9QUk9CRV9SU1AsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckJlYWNvbkF0U2NhbkFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX1NDQU5fVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylTY2FuVGltZW91dEFjdGlvbik7Ci0KLQkvLyB0aW1lciBpbml0Ci0JUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihCZWFjb25UaW1lb3V0KSwgcEFkLCBGQUxTRSk7Ci0JUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oU2NhblRpbWVvdXQpLCBwQWQsIEZBTFNFKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlCZWFjb24gdGltZW91dCBoYW5kbGVyLCBleGVjdXRlZCBpbiB0aW1lciB0aHJlYWQKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBCZWFjb25UaW1lb3V0KAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKLXsKLQlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNZTkMgLSBCZWFjb25UaW1lb3V0XG4iKSk7Ci0KLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKQotCQlyZXR1cm47Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkKLQkJKQotCXsKLQkJVUNIQVIgICAgICAgIEJCUFZhbHVlID0gMDsKLQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOwotCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0JCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKLQkJQkJQVmFsdWUgJj0gKH4weDE4KTsKLQkJQkJQVmFsdWUgfD0gMHgxMDsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gRW5kIG9mIFNDQU4sIHJlc3RvcmUgdG8gNDBNSHogY2hhbm5lbCAlZCwgVG90YWwgQlNTWyUwMmRdXG4iLHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBwQWQtPlNjYW5UYWIuQnNzTnIpKTsKLQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX0JFQUNPTl9USU1FT1VULCAwLCBOVUxMKTsKLQlSVE1QX01MTUVfSEFORExFUihwQWQpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVNjYW4gdGltZW91dCBoYW5kbGVyLCBleGVjdXRlZCBpbiB0aW1lciB0aHJlYWQKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBTY2FuVGltZW91dCgKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCi17Ci0JUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OwotCi0KLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKQotCQlyZXR1cm47Ci0KLQlpZiAoTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9TQ0FOX1RJTUVPVVQsIDAsIE5VTEwpKQotCXsKLQlSVE1QX01MTUVfSEFORExFUihwQWQpOwotfQotCWVsc2UKLQl7Ci0JCS8vIFRvIHByZXZlbnQgU3luY01hY2hpbmUuQ3VyclN0YXRlIGlzIFNDQU5fTElTVEVOIGZvcmV2ZXIuCi0JCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gMDsKLQkJU2Nhbk5leHRDaGFubmVsKHBBZCk7Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQkJewotCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU0NBTl9FTlFVRVVFX0ZBSUxfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLQkJfQotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlNTE1FIFNDQU4gcmVxIHN0YXRlIG1hY2hpbmUgcHJvY2VkdXJlCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNbG1lU2NhblJlcUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVUNIQVIgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdLCBTc2lkTGVuLCBTY2FuVHlwZSwgQnNzVHlwZSwgQkJQVmFsdWUgPSAwOwotCUJPT0xFQU4gICAgICAgIFRpbWVyQ2FuY2VsbGVkOwotCVVMT05HCQkgICBOb3c7Ci0JVVNIT1JUICAgICAgICAgU3RhdHVzOwotCVBIRUFERVJfODAyXzExIHBIZHI4MDIxMTsKLQlQVUNIQVIgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyAgICBOU3RhdHVzOwotCi0JLy8gQ2hlY2sgdGhlIHRvdGFsIHNjYW4gdHJpZXMgZm9yIG9uZSBzaW5nbGUgT0lEIGNvbW1hbmQKLQkvLyBJZiB0aGlzIGlzIHRoZSBDQ1ggMi4wIENhc2UsIHNraXAgdGhhdCEKLQlpZiAoICFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIE1sbWVTY2FuUmVxQWN0aW9uIGJlZm9yZSBTdGFydHVwXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyBJbmNyZWFzZSB0aGUgc2NhbiByZXRyeSBjb3VudGVycy4KLQlwQWQtPlN0YUNmZy5TY2FuQ250Kys7Ci0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLSAgICBpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKSAmJgotICAgICAgICAoSURMRV9PTihwQWQpKSAmJgotCQkocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpICYmCi0JCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpKSkKLQl7Ci0JICAgICAgICBpZiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IEZBTFNFKQotCQl7Ci0JCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIFBvd2VyV2FrZUNJRCwgMHgwMCwgMHgwMik7Ci0JCQlBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyV2FrZUNJRCk7Ci0JCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBTTSAtIElzc3VlIFdha2UgdXAgY29tbWFuZCBcbiIpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJUlQyOHh4UGNpQXNpY1JhZGlvT24ocEFkLCBHVUlfSURMRV9QT1dFUl9TQVZFKTsKLQl9Ci0JfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JLy8gZmlyc3QgY2hlY2sgdGhlIHBhcmFtZXRlciBzYW5pdHkKLQlpZiAoTWxtZVNjYW5SZXFTYW5pdHkocEFkLAotCQkJCQkJICBFbGVtLT5Nc2csCi0JCQkJCQkgIEVsZW0tPk1zZ0xlbiwKLQkJCQkJCSAgJkJzc1R5cGUsCi0JCQkJCQkgIChQQ0hBUilTc2lkLAotCQkJCQkJICAmU3NpZExlbiwKLQkJCQkJCSAgJlNjYW5UeXBlKSkKLQl7Ci0KLQkJLy8gQ2hlY2sgZm9yIGNoYW5uZWwgbG9hZCBhbmQgbm9pc2UgaGlzdCByZXF1ZXN0Ci0JCS8vIFN1c3BlbmQgTVNEVSBvbmx5IGF0IHNjYW4gcmVxdWVzdCwgbm90IHRoZSBsYXN0IHR3byBtZW50aW9uZWQKLQkJLy8gU3VzcGVuZCBNU0RVIHRyYW5zbWlzc2lvbiBoZXJlCi0JCVJUTVBTdXNwZW5kTXNkdVRyYW5zbWlzc2lvbihwQWQpOwotCi0JCS8vCi0JCS8vIFRvIHByZXZlbnQgZGF0YSBsb3N0LgotCQkvLyBTZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9uIHRvIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCBiZWZvcmUgU0NBTiBwcm9ncmVzcy4KLQkJLy8gQW5kIHNob3VsZCBzZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9mZiB0byBBUCwgd2hlbiBzY2FuIHByb2dyZXNzIGRvbmUKLQkJLy8KLQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSAmJiAoSU5GUkFfT04ocEFkKSkpCi0JCXsKLQkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOwotCQkJaWYgKE5TdGF0dXMJPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCXsKLQkJCQlwSGRyODAyMTEgPSAoUEhFQURFUl84MDJfMTEpIHBPdXRCdWZmZXI7Ci0JCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsIHBIZHI4MDIxMSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQkJcEhkcjgwMjExLT5EdXJhdGlvbiA9IDA7Ci0JCQkJcEhkcjgwMjExLT5GQy5UeXBlID0gQlRZUEVfREFUQTsKLQkJCQlwSGRyODAyMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKLQotCQkJCS8vIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKLQkJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIHNpemVvZihIRUFERVJfODAyXzExKSk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNjYW5SZXFBY3Rpb24gLS0gU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKLQkJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7Ci0JCQl9Ci0JCX0KLQotCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwotCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBOb3c7Ci0JCS8vIHJlc2V0IGFsbCB0aGUgdGltZXJzCi0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsICZUaW1lckNhbmNlbGxlZCk7Ci0KLQkJLy8gcmVjb3JkIGRlc2lyZWQgQlNTIHBhcmFtZXRlcnMKLQkJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBCc3NUeXBlOwotCQlwQWQtPk1sbWVBdXguU2NhblR5cGUgPSBTY2FuVHlwZTsKLQkJcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBTc2lkTGVuOwotICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIFNzaWQsIFNzaWRMZW4pOwotCi0JCS8vIHN0YXJ0IGZyb20gdGhlIGZpcnN0IGNoYW5uZWwKLQkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSBGaXJzdENoYW5uZWwocEFkKTsKLQotCQkvLyBMZXQgQkJQIHJlZ2lzdGVyIGF0IDIwTUh6IHRvIGRvIHNjYW4KLQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOwotCQlCQlBWYWx1ZSAmPSAofjB4MTgpOwotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBCQlAgUjQgdG8gMjBNSHoubFxuIikpOwotCQlTY2FuTmV4dENoYW5uZWwocEFkKTsKLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlRfRVJSKCgiU1lOQyAtIE1sbWVTY2FuUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKLQkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKLQkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKLQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwgMiwgJlN0YXR1cyk7Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCU1MTUUgSk9JTiByZXEgc3RhdGUgbWFjaGluZSBwcm9jZWR1cmUKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIE1sbWVKb2luUmVxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVQ0hBUiAgICAgICAgQkJQVmFsdWUgPSAwOwotCUJTU19FTlRSWSAgICAqcEJzczsKLQlCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOwotCUhFQURFUl84MDJfMTEgSGRyODAyMTE7Ci0JTkRJU19TVEFUVVMgICBOU3RhdHVzOwotCVVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOwotCVBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JUFVDSEFSICAgICAgICBwU3VwUmF0ZSA9IE5VTEw7Ci0JVUNIQVIgICAgICAgICBTdXBSYXRlTGVuOwotCVBVQ0hBUiAgICAgICAgcEV4dFJhdGUgPSBOVUxMOwotCVVDSEFSICAgICAgICAgRXh0UmF0ZUxlbjsKLQlVQ0hBUiAgICAgICAgIEFTdXBSYXRlW10gPSB7MHg4QywgMHgxMiwgMHg5OCwgMHgyNCwgMHhiMCwgMHg0OCwgMHg2MCwgMHg2Q307Ci0JVUNIQVIgICAgICAgICBBU3VwUmF0ZUxlbiA9IHNpemVvZihBU3VwUmF0ZSkvc2l6ZW9mKFVDSEFSKTsKLQlNTE1FX0pPSU5fUkVRX1NUUlVDVCAqcEluZm8gPSAoTUxNRV9KT0lOX1JFUV9TVFJVQ1QgKikoRWxlbS0+TXNnKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBNbG1lSm9pblJlcUFjdGlvbihCU1MgIyVsZClcbiIsIHBJbmZvLT5Cc3NJZHgpKTsKLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotICAgIGlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpICYmCi0gICAgICAgIChJRExFX09OKHBBZCkpICYmCi0JCShwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkgJiYKLQkJKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRikpKQotCXsKLQkJUlQyOHh4UGNpQXNpY1JhZGlvT24ocEFkLCBHVUlfSURMRV9QT1dFUl9TQVZFKTsKLQl9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQkvLyByZXNldCBhbGwgdGhlIHRpbWVycwotCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQotCXBCc3MgPSAmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbcEluZm8tPkJzc0lkeF07Ci0KLQkvLyByZWNvcmQgdGhlIGRlc2lyZWQgU1NJRCAmIEJTU0lEIHdlJ3JlIHdhaXRpbmcgZm9yCi0JQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIHBCc3MtPkJzc2lkKTsKLQotCS8vIElmIEFQJ3MgU1NJRCBpcyBub3QgaGlkZGVuLCBpdCBpcyBPSyBmb3IgdXBkYXRpbmcgc3NpZCB0byBNbG1lQXV4IGFnYWluLgotCWlmIChwQnNzLT5IaWRkZW4gPT0gMCkKLQl7Ci0JCVJUTVBaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgcEJzcy0+U3NpZCwgcEJzcy0+U3NpZExlbik7Ci0JcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBwQnNzLT5Tc2lkTGVuOwotCX0KLQotCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gcEJzcy0+QnNzVHlwZTsKLQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IHBCc3MtPkNoYW5uZWw7Ci0JcEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsID0gcEJzcy0+Q2VudHJhbENoYW5uZWw7Ci0KLSNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCi0JLy8gQ291bnRyeSBJRSBvZiB0aGUgQVAgd2lsbCBiZSBldmFsdWF0ZWQgYW5kIHdpbGwgYmUgdXNlZC4KLQlpZiAoKHBBZC0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlICE9IFJ0ODAyXzExX0RfTm9uZSkgJiYKLQkJKHBCc3MtPmJIYXNDb3VudHJ5SUUgPT0gVFJVRSkpCi0JewotCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGVbMF0sICZwQnNzLT5Db3VudHJ5U3RyaW5nWzBdLCAyKTsKLQkJaWYgKHBCc3MtPkNvdW50cnlTdHJpbmdbMl0gPT0gJ0knKQotCQkJcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID0gSURPUjsKLQkJZWxzZSBpZiAocEJzcy0+Q291bnRyeVN0cmluZ1syXSA9PSAnTycpCi0JCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBPRE9SOwotCQllbHNlCi0JCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBCT1RIOwotCQlCdWlsZENoYW5uZWxMaXN0RXgocEFkKTsKLQl9Ci0jZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLwotCi0JLy8gTGV0IEJCUCByZWdpc3RlciBhdCAyME1IeiB0byBkbyBzY2FuCi0JUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOwotCUJCUFZhbHVlICY9ICh+MHgxOCk7Ci0JUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBCQlAgUjQgdG8gMjBNSHoubFxuIikpOwotCi0JLy8gc3dpdGNoIGNoYW5uZWwgYW5kIHdhaXRpbmcgZm9yIGJlYWNvbiB0aW1lcgotCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwsIEZBTFNFKTsKLQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7Ci0KLQotCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCBKT0lOX1RJTUVPVVQpOwotCi0gICAgZG8KLQl7Ci0JCWlmICgoKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmCi0gICAgICAgICAgICAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPiAxNCkgJiYKLSAgICAgICAgICAgICBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKSkKLSNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vIFJvZ2VyIHN5bmMgQ2FycmllcgotICAgICAgICAgICAgIHx8IChwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9PSBUUlVFKQotI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KLSAgICAgICAgICAgICkKLQkJewotCQkJLy8KLQkJCS8vIFdlIGNhbid0IHNlbmQgYW55IFByb2JlIHJlcXVlc3QgZnJhbWUgdG8gbWVldCA4MDIuMTFoLgotCQkJLy8KLQkJCWlmIChwQnNzLT5IaWRkZW4gPT0gMCkKLQkJCWJyZWFrOwotCQl9Ci0KLQkvLwotCS8vIHNlbmQgcHJvYmUgcmVxdWVzdAotCS8vCi0JTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKLQlpZiAoTlN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJaWYgKHBBZC0+TWxtZUF1eC5DaGFubmVsIDw9IDE0KQotCQl7Ci0JCQlwU3VwUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGU7Ci0JCQlTdXBSYXRlTGVuID0gcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbjsKLQkJCXBFeHRSYXRlID0gcEFkLT5Db21tb25DZmcuRXh0UmF0ZTsKLQkJCUV4dFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8KLQkJCS8vIE92ZXJ3cml0ZSBTdXBwb3J0IFJhdGUsIENDSyByYXRlIGFyZSBub3QgYWxsb3dlZAotCQkJLy8KLQkJCXBTdXBSYXRlID0gQVN1cFJhdGU7Ci0JCQlTdXBSYXRlTGVuID0gQVN1cFJhdGVMZW47Ci0JCQlFeHRSYXRlTGVuID0gMDsKLQkJfQotCi0JCWlmIChwQWQtPk1sbWVBdXguQnNzVHlwZSA9PSBCU1NfSU5GUkEpCi0JCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLCBTVUJUWVBFX1BST0JFX1JFUSwgMCwgcEFkLT5NbG1lQXV4LkJzc2lkLCBwQWQtPk1sbWVBdXguQnNzaWQpOwotCQllbHNlCi0JCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLCBTVUJUWVBFX1BST0JFX1JFUSwgMCwgQlJPQURDQVNUX0FERFIsIEJST0FEQ0FTVF9BRERSKTsKLQotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAmSGRyODAyMTEsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKLQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4LlNzaWRMZW4sCi0JCQkJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLAkgICAgcEFkLT5NbG1lQXV4LlNzaWQsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVJZSwKLQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUxlbiwKLQkJCQkJCSAgU3VwUmF0ZUxlbiwgICAgICAgICAgICAgICBwU3VwUmF0ZSwKLQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCi0JCWlmIChFeHRSYXRlTGVuKQotCQl7Ci0JCQlVTE9ORyBUbXA7Ci0JCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcCwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlTGVuLAotCQkJCQkJCSAgRXh0UmF0ZUxlbiwgICAgICAgICAgICAgICAgICAgICAgIHBFeHRSYXRlLAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJRnJhbWVMZW4gKz0gVG1wOwotCQl9Ci0KLQotCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQl9Ci0gICAgfSB3aGlsZSAoRkFMU0UpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIFN3aXRjaCB0byBjaCAlZCwgV2FpdCBCRUFDT04gZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJcEJzcy0+Q2hhbm5lbCwgcEJzcy0+QnNzaWRbMF0sIHBCc3MtPkJzc2lkWzFdLCBwQnNzLT5Cc3NpZFsyXSwgcEJzcy0+QnNzaWRbM10sIHBCc3MtPkJzc2lkWzRdLCBwQnNzLT5Cc3NpZFs1XSkpOwotCi0JcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IEpPSU5fV0FJVF9CRUFDT047Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJTUxNRSBTVEFSVCBSZXF1ZXN0IHN0YXRlIG1hY2hpbmUgcHJvY2VkdXJlLCBzdGFydGluZyBhbiBJQlNTCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNbG1lU3RhcnRSZXFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVDSEFSICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdLCBTc2lkTGVuOwotCUJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7Ci0KLQkvLyBOZXcgZm9yIFdQQSBzZWN1cml0eSBzdWl0ZXMKLQlVQ0hBUgkJCQkJCVZhcklFW01BWF9WSUVfTEVOXTsJLy8gVG90YWwgVklFIGxlbmd0aCA9IE1BWF9WSUVfTEVOIC0gLTUKLQlORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMJKnBWSUUgPSBOVUxMOwotCUxBUkdFX0lOVEVHRVIJCQkJVGltZVN0YW1wOwotCUJPT0xFQU4gUHJpdmFjeTsKLQlVU0hPUlQgU3RhdHVzOwotCi0JLy8gSW5pdCBWYXJpYWJsZSBJRSBzdHJ1Y3R1cmUKLQlwVklFID0gKFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMpIFZhcklFOwotCXBWSUUtPkxlbmd0aCA9IDA7Ci0JVGltZVN0YW1wLnUuTG93UGFydCAgPSAwOwotCVRpbWVTdGFtcC51LkhpZ2hQYXJ0ID0gMDsKLQotCWlmIChNbG1lU3RhcnRSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgKFBDSEFSKVNzaWQsICZTc2lkTGVuKSkKLQl7Ci0JCS8vIHJlc2V0IGFsbCB0aGUgdGltZXJzCi0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7Ci0KLQkJLy8KLQkJLy8gU3RhcnQgYSBuZXcgSUJTUy4gQWxsIElCU1MgcGFyYW1ldGVycyBhcmUgZGVjaWRlZCBub3cuLi4uCi0JCS8vCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTdGFydFJlcUFjdGlvbiAtIFN0YXJ0IGEgbmV3IElCU1MuIEFsbCBJQlNTIHBhcmFtZXRlcnMgYXJlIGRlY2lkZWQgbm93Li4uLiBcbiIpKTsKLQkJcEFkLT5NbG1lQXV4LkJzc1R5cGUgICAgICAgICAgID0gQlNTX0FESE9DOwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgU3NpZCwgU3NpZExlbik7Ci0JCXBBZC0+TWxtZUF1eC5Tc2lkTGVuICAgICAgICAgICA9IFNzaWRMZW47Ci0KLQkJLy8gZ2VuZXJhdGUgYSByYWRvbSBudW1iZXIgYXMgQlNTSUQKLQkJTWFjQWRkclJhbmRvbUJzc2lkKHBBZCwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVN0YXJ0UmVxQWN0aW9uIC0gZ2VuZXJhdGUgYSByYWRvbSBudW1iZXIgYXMgQlNTSUQgXG4iKSk7Ci0KLQkJUHJpdmFjeSA9IChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkgfHwKLQkJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKLQkJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCk7Ci0JCXBBZC0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbyAgICA9IENBUF9HRU5FUkFURSgwLDEsUHJpdmFjeSwgKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZVNob3J0KSwgMSwgMCk7Ci0JCXBBZC0+TWxtZUF1eC5CZWFjb25QZXJpb2QgICAgICA9IHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZDsKLQkJcEFkLT5NbG1lQXV4LkF0aW1XaW4gICAgICAgICAgID0gcEFkLT5TdGFDZmcuQXRpbVdpbjsKLQkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgICAgICAgICAgID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKLQotCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCAgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwotCQlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgICAgPSBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbDsKLQotCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbj0gcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbjsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlN1cFJhdGUsIHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKLQkJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguU3VwUmF0ZSwgJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuKTsKLQkJcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuOwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguRXh0UmF0ZSwgcEFkLT5Db21tb25DZmcuRXh0UmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOwotCQlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5FeHRSYXRlLCAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQotCQl7Ci0JCQlSVE1QVXBkYXRlSFRJRSgmcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LCAmcEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mby5NQ1NTZXRbMF0sICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCAmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbyk7Ci0JCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID0gc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpOwotCQkJLy8gTm90IHR1cm4gcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuYkh0RW5hYmxlID0gVFJVRSBoZXJlLgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuYkh0RW5hYmxlID0gVFJVRVxuIikpOwotCQl9Ci0JCWVsc2UKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJewotCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA9IDA7Ci0JCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IEZBTFNFOwotCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdLCAxNik7Ci0JCX0KLQkJLy8gdGVtcG9yYXJpbHkgbm90IHN1cHBvcnQgUU9TIGluIElCU1MKLQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7Ci0JCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRYnNzTG9hZCwgc2l6ZW9mKFFCU1NfTE9BRF9QQVJNKSk7Ci0JCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpOwotCi0JCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwsIEZBTFNFKTsKLQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBNbG1lU3RhcnRSZXFBY3Rpb24oY2g9ICVkLHN1cCByYXRlcz0gJWQsIGV4dCByYXRlcz0lZClcbiIsCi0JCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCwgcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKSk7Ci0KLQkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKLQkJU3RhdHVzID0gTUxNRV9TVUNDRVNTOwotCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU1RBUlRfQ09ORiwgMiwgJlN0YXR1cyk7Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UX0VSUigoIlNZTkMgLSBNbG1lU3RhcnRSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbC5cbiIpKTsKLQkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKLQkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKLQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NUQVJUX0NPTkYsIDIsICZTdGF0dXMpOwotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlwZWVyIHNlbmRzIGJlYWNvbiBiYWNrIHdoZW4gc2Nhbm5pbmcKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFBlZXJCZWFjb25BdFNjYW5BY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVDSEFSICAgICAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dLCBBZGRyMltNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF0sIEJzc1R5cGUsIENoYW5uZWwsIE5ld0NoYW5uZWwsCi0JCQkJCVNzaWRMZW4sIER0aW1Db3VudCwgRHRpbVBlcmlvZCwgQmNhc3RGbGFnLCBNZXNzYWdlVG9NZTsKLQlDRl9QQVJNICAgICAgICAgQ2ZQYXJtOwotCVVTSE9SVCAgICAgICAgICBCZWFjb25QZXJpb2QsIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvOwotCVBGUkFNRV84MDJfMTEgICBwRnJhbWU7Ci0JTEFSR0VfSU5URUdFUiAgIFRpbWVTdGFtcDsKLQlVQ0hBUiAgICAgICAgICAgRXJwOwotCVVDSEFSCQlTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ci0JVUNIQVIJCQlTdXBSYXRlTGVuLCBFeHRSYXRlTGVuOwotCVVTSE9SVAkJCUxlblZJRTsKLQlVQ0hBUgkJCUNraXBGbGFnOwotCVVDSEFSCQkJQWlyb25ldENlbGxQb3dlckxpbWl0OwotCUVEQ0FfUEFSTSAgICAgICBFZGNhUGFybTsKLQlRQlNTX0xPQURfUEFSTSAgUWJzc0xvYWQ7Ci0JUU9TX0NBUEFCSUxJVFlfUEFSTSBRb3NDYXBhYmlsaXR5OwotCVVMT05HCQkJCQkJUmFsaW5rSWU7Ci0JVUNIQVIJCQkJCQlWYXJJRVtNQVhfVklFX0xFTl07CQkvLyBUb3RhbCBWSUUgbGVuZ3RoID0gTUFYX1ZJRV9MRU4gLSAtNQotCU5ESVNfODAyXzExX1ZBUklBQkxFX0lFcwkqcFZJRSA9IE5VTEw7Ci0JSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OwotCUFERF9IVF9JTkZPX0lFCQlBZGRIdEluZm87CS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotCVVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuID0gMCwgUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IDA7Ci0JVUNIQVIJCQlBZGRIdEluZm9MZW47Ci0JVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKLQotCi0JLy8gTmRpc0ZpbGxNZW1vcnkoU3NpZCwgTUFYX0xFTl9PRl9TU0lELCAweDAwKTsKLQlwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSkgRWxlbS0+TXNnOwotCS8vIEluaXQgVmFyaWFibGUgSUUgc3RydWN0dXJlCi0JcFZJRSA9IChQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzKSBWYXJJRTsKLQlwVklFLT5MZW5ndGggPSAwOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotICAgIFJUTVBaZXJvTWVtb3J5KCZIdENhcGFiaWxpdHksIHNpemVvZihIdENhcGFiaWxpdHkpKTsKLQlSVE1QWmVyb01lbW9yeSgmQWRkSHRJbmZvLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCWlmIChQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkocEFkLAotCQkJCQkJCQlFbGVtLT5Nc2csCi0JCQkJCQkJCUVsZW0tPk1zZ0xlbiwKLQkJCQkJCQkJRWxlbS0+Q2hhbm5lbCwKLQkJCQkJCQkJQWRkcjIsCi0JCQkJCQkJCUJzc2lkLAotCQkJCQkJCQkoUENIQVIpU3NpZCwKLQkJCQkJCQkJJlNzaWRMZW4sCi0JCQkJCQkJCSZCc3NUeXBlLAotCQkJCQkJCQkmQmVhY29uUGVyaW9kLAotCQkJCQkJCQkmQ2hhbm5lbCwKLQkJCQkJCQkJJk5ld0NoYW5uZWwsCi0JCQkJCQkJCSZUaW1lU3RhbXAsCi0JCQkJCQkJCSZDZlBhcm0sCi0JCQkJCQkJCSZBdGltV2luLAotCQkJCQkJCQkmQ2FwYWJpbGl0eUluZm8sCi0JCQkJCQkJCSZFcnAsCi0JCQkJCQkJCSZEdGltQ291bnQsCi0JCQkJCQkJCSZEdGltUGVyaW9kLAotCQkJCQkJCQkmQmNhc3RGbGFnLAotCQkJCQkJCQkmTWVzc2FnZVRvTWUsCi0JCQkJCQkJCVN1cFJhdGUsCi0JCQkJCQkJCSZTdXBSYXRlTGVuLAotCQkJCQkJCQlFeHRSYXRlLAotCQkJCQkJCQkmRXh0UmF0ZUxlbiwKLQkJCQkJCQkJJkNraXBGbGFnLAotCQkJCQkJCQkmQWlyb25ldENlbGxQb3dlckxpbWl0LAotCQkJCQkJCQkmRWRjYVBhcm0sCi0JCQkJCQkJCSZRYnNzTG9hZCwKLQkJCQkJCQkJJlFvc0NhcGFiaWxpdHksCi0JCQkJCQkJCSZSYWxpbmtJZSwKLQkJCQkJCQkJJkh0Q2FwYWJpbGl0eUxlbiwKLQkJCQkJCQkJJlByZU5IdENhcGFiaWxpdHlMZW4sCi0JCQkJCQkJCSZIdENhcGFiaWxpdHksCi0JCQkJCQkJCSZBZGRIdEluZm9MZW4sCi0JCQkJCQkJCSZBZGRIdEluZm8sCi0JCQkJCQkJCSZOZXdFeHRDaGFubmVsT2Zmc2V0LAotCQkJCQkJCQkmTGVuVklFLAotCQkJCQkJCQlwVklFKSkKLQl7Ci0JCVVMT05HIElkeDsKLQkJQ0hBUiBSc3NpID0gMDsKLQotCQlJZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBCc3NpZCwgQ2hhbm5lbCk7Ci0JCWlmIChJZHggIT0gQlNTX05PVF9GT1VORCkKLQkJCVJzc2kgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5Sc3NpOwotCi0JCVJzc2kgPSBSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMCwgUlNTSV8wKSwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kxLCBSU1NJXzEpLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTIsIFJTU0lfMikpOwotCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJaWYgKChIdENhcGFiaWxpdHlMZW4gPiAwKSB8fCAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA+IDApKQotCQkJSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkJSWR4ID0gQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlNjYW5UYWIsIEJzc2lkLCAoUENIQVIpU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLAotCQkJCQkgICZDZlBhcm0sIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLCAgJkh0Q2FwYWJpbGl0eSwKLQkJCQkJICZBZGRIdEluZm8sIEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLCBOZXdFeHRDaGFubmVsT2Zmc2V0LCBDaGFubmVsLCBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLAotCQkJCQkgJkVkY2FQYXJtLCAmUW9zQ2FwYWJpbGl0eSwgJlFic3NMb2FkLCBMZW5WSUUsIHBWSUUpOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotI2lmZGVmIERPVDExTl9EUkFGVDMKLQkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbcEFkLT5Db21tb25DZmcuQ2hhbm5lbExpc3RJZHhdLmJFZmZlY3RlZENoYW5uZWwgPT0gVFJVRSkKLQkJewotCQkJVUNIQVIJCVJlZ0NsYXNzOwotCQkJUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5MihwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmUmVnQ2xhc3MpOwotCQkJVHJpRXZlbnRUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYiwgQnNzaWQsICZIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbiwgUmVnQ2xhc3MsIENoYW5uZWwpOwotCQl9Ci0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQlpZiAoSWR4ICE9IEJTU19OT1RfRk9VTkQpCi0JCXsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlBUU0YsICZFbGVtLT5Nc2dbMjRdLCA0KTsKLQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5UVFNGWzBdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7Ci0JCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVFRTRls0XSwgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOwotCQl9Ci0KLQl9Ci0JLy8gc2FuaXR5IGNoZWNrIGZhaWwsIGlnbm9yZWQKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlXaGVuIHdhaXRpbmcgam9pbmluZyB0aGUgKEkpQlNTLCBiZWFjb24gcmVjZWl2ZWQgZnJvbSBleHRlcm5hbAotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgUGVlckJlYWNvbkF0Sm9pbkFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVUNIQVIgICAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dLCBBZGRyMltNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdLCBTc2lkTGVuLCBCc3NUeXBlLCBDaGFubmVsLCBNZXNzYWdlVG9NZSwKLQkJCQkgIER0aW1Db3VudCwgRHRpbVBlcmlvZCwgQmNhc3RGbGFnLCBOZXdDaGFubmVsOwotCUxBUkdFX0lOVEVHRVIgVGltZVN0YW1wOwotCVVTSE9SVCAgICAgICAgQmVhY29uUGVyaW9kLCBBdGltV2luLCBDYXBhYmlsaXR5SW5mbzsKLQlDRl9QQVJNICAgICAgIENmOwotCUJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7Ci0JVUNIQVIgICAgICAgICBFcnA7Ci0JVUNIQVIgICAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ci0JVUNIQVIJCSAgU3VwUmF0ZUxlbiwgRXh0UmF0ZUxlbjsKLQlVQ0hBUiAgICAgICAgIENraXBGbGFnOwotCVVTSE9SVAkJICBMZW5WSUU7Ci0JVUNIQVIJCSAgQWlyb25ldENlbGxQb3dlckxpbWl0OwotCUVEQ0FfUEFSTSAgICAgICBFZGNhUGFybTsKLQlRQlNTX0xPQURfUEFSTSAgUWJzc0xvYWQ7Ci0JUU9TX0NBUEFCSUxJVFlfUEFSTSBRb3NDYXBhYmlsaXR5OwotCVVTSE9SVCAgICAgICAgU3RhdHVzOwotCVVDSEFSCQkJCQkJVmFySUVbTUFYX1ZJRV9MRU5dOwkJLy8gVG90YWwgVklFIGxlbmd0aCA9IE1BWF9WSUVfTEVOIC0gLTUKLQlORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMJKnBWSUUgPSBOVUxMOwotCVVMT05HICAgICAgICAgICBSYWxpbmtJZTsKLQlVTE9ORyAgICAgICAgIElkeDsKLQlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7Ci0JQUREX0hUX0lORk9fSUUJCUFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCi0JVUNIQVIJCQkJSHRDYXBhYmlsaXR5TGVuID0gMCwgUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IDA7Ci0JVUNIQVIJCQlBZGRIdEluZm9MZW47Ci0JVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlVQ0hBUgkJCUNlbnRyYWxDaGFubmVsOwotCUJPT0xFQU4JCQliQWxsb3dOcmF0ZSA9IEZBTFNFOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JLy8gSW5pdCBWYXJpYWJsZSBJRSBzdHJ1Y3R1cmUKLQlwVklFID0gKFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMpIFZhcklFOwotCXBWSUUtPkxlbmd0aCA9IDA7Ci0gICAgUlRNUFplcm9NZW1vcnkoJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEh0Q2FwYWJpbGl0eSkpOwotCVJUTVBaZXJvTWVtb3J5KCZBZGRIdEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOwotCi0KLQlpZiAoUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5KHBBZCwKLQkJCQkJCQkJRWxlbS0+TXNnLAotCQkJCQkJCQlFbGVtLT5Nc2dMZW4sCi0JCQkJCQkJCUVsZW0tPkNoYW5uZWwsCi0JCQkJCQkJCUFkZHIyLAotCQkJCQkJCQlCc3NpZCwKLQkJCQkJCQkJKFBDSEFSKVNzaWQsCi0JCQkJCQkJCSZTc2lkTGVuLAotCQkJCQkJCQkmQnNzVHlwZSwKLQkJCQkJCQkJJkJlYWNvblBlcmlvZCwKLQkJCQkJCQkJJkNoYW5uZWwsCi0JCQkJCQkJCSZOZXdDaGFubmVsLAotCQkJCQkJCQkmVGltZVN0YW1wLAotCQkJCQkJCQkmQ2YsCi0JCQkJCQkJCSZBdGltV2luLAotCQkJCQkJCQkmQ2FwYWJpbGl0eUluZm8sCi0JCQkJCQkJCSZFcnAsCi0JCQkJCQkJCSZEdGltQ291bnQsCi0JCQkJCQkJCSZEdGltUGVyaW9kLAotCQkJCQkJCQkmQmNhc3RGbGFnLAotCQkJCQkJCQkmTWVzc2FnZVRvTWUsCi0JCQkJCQkJCVN1cFJhdGUsCi0JCQkJCQkJCSZTdXBSYXRlTGVuLAotCQkJCQkJCQlFeHRSYXRlLAotCQkJCQkJCQkmRXh0UmF0ZUxlbiwKLQkJCQkJCQkJJkNraXBGbGFnLAotCQkJCQkJCQkmQWlyb25ldENlbGxQb3dlckxpbWl0LAotCQkJCQkJCQkmRWRjYVBhcm0sCi0JCQkJCQkJCSZRYnNzTG9hZCwKLQkJCQkJCQkJJlFvc0NhcGFiaWxpdHksCi0JCQkJCQkJCSZSYWxpbmtJZSwKLQkJCQkJCQkJJkh0Q2FwYWJpbGl0eUxlbiwKLQkJCQkJCQkJJlByZU5IdENhcGFiaWxpdHlMZW4sCi0JCQkJCQkJCSZIdENhcGFiaWxpdHksCi0JCQkJCQkJCSZBZGRIdEluZm9MZW4sCi0JCQkJCQkJCSZBZGRIdEluZm8sCi0JCQkJCQkJCSZOZXdFeHRDaGFubmVsT2Zmc2V0LAotCQkJCQkJCQkmTGVuVklFLAotCQkJCQkJCQlwVklFKSkKLQl7Ci0JCS8vIERpc3F1YWxpZnkgMTFiIG9ubHkgYWRob2Mgd2hlbiB3ZSBhcmUgaW4gMTFnIG9ubHkgYWRob2MgbW9kZQotCQlpZiAoKEJzc1R5cGUgPT0gQlNTX0FESE9DKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFHKSAmJiAoKFN1cFJhdGVMZW4rRXh0UmF0ZUxlbik8IDEyKSkKLQkJCXJldHVybjsKLQotCQkvLyBCRUFDT04gZnJvbSBkZXNpcmVkIEJTUy9JQlNTIGZvdW5kLiBXZSBzaG91bGQgYmUgYWJsZSB0byBkZWNpZGUgbW9zdAotCQkvLyBCU1MgcGFyYW1ldGVycyBoZXJlLgotCQkvLyBRLiBCdXQgd2hhdCBoYXBwZW4gaWYgdGhpcyBKT0lOIGRvZXNuJ3QgY29uY2x1ZGUgYSBzdWNjZXNzZnVsIEFTU09DSUFURUlPTj8KLQkJLy8gICAgRG8gd2UgbmVlZCB0byByZWNlb3ZlciBiYWNrIGFsbCBwYXJhbWV0ZXJzIGJlbG9uZ2luZyB0byBwcmV2aW91cyBCU1M/Ci0JCS8vIEEuIFNob3VsZCBiZSBub3QuIFRoZXJlJ3Mgbm8gYmFjay1kb29yIHJlY292ZXIgdG8gcHJldmlvdXMgQVAuIEl0IHN0aWxsIG5lZWQKLQkJLy8gICAgYSBuZXcgSk9JTi1BVVRILUFTU09DIHNlcXVlbmNlLgotCQlpZiAoTUFDX0FERFJfRVFVQUwocEFkLT5NbG1lQXV4LkJzc2lkLCBCc3NpZCkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSByZWNlaXZlIGRlc2lyZWQgQkVBQ09OIGF0IEpvaW5XYWl0QmVhY29uLi4uIENoYW5uZWwgPSAlZFxuIiwgQ2hhbm5lbCkpOwotCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7Ci0KLQkJCS8vIFVwZGF0ZSBSU1NJIHRvIHByZXZlbnQgTm8gc2lnbmFsIGRpc3BsYXkgd2hlbiBjYXJkcyBmaXJzdCBpbml0aWFsaXplZAotCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTAsIFJTU0lfMCk7Ci0JCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMQk9IENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMSwgUlNTSV8xKTsKLQkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyCT0gQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kyLCBSU1NJXzIpOwotCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMAk9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwOwotCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMFg4CT0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCA8PCAzOwotCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMQk9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxOwotCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMVg4CT0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSA8PCAzOwotCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMgk9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyOwotCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMlg4CT0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMiA8PCAzOwotCi0JCQkvLwotCQkJLy8gV2UgbmVlZCB0byBjaGVjayBpZiBTU0lEIG9ubHkgc2V0IHRvIGFueSwgdGhlbiB3ZSBjYW4gcmVjb3JkIHRoZSBjdXJyZW50IFNTSUQuCi0JCQkvLyBPdGhlcndpc2Ugd2lsbCBjYXVzZSBoaWRkZW4gU1NJRCBhc3NvY2lhdGlvbiBmYWlsZWQuCi0JCQkvLwotCQkJaWYgKHBBZC0+TWxtZUF1eC5Tc2lkTGVuID09IDApCi0JCQl7Ci0JCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIFNzaWQsIFNzaWRMZW4pOwotCQkJCXBBZC0+TWxtZUF1eC5Tc2lkTGVuID0gU3NpZExlbjsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlJZHggPSBCc3NTc2lkVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgQnNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbiwgQ2hhbm5lbCk7Ci0KLQkJCQlpZiAoSWR4ID09IEJTU19OT1RfRk9VTkQpCi0JCQkJewotCQkJCQlDSEFSIFJzc2kgPSAwOwotCQkJCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTAsIFJTU0lfMCksIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMSwgUlNTSV8xKSwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kyLCBSU1NJXzIpKTsKLQkJCQkJSWR4ID0gQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlNjYW5UYWIsIEJzc2lkLCAoQ0hBUiAqKSBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCi0JCQkJCQkJCQkJJkNmLCBBdGltV2luLCBDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbiwgICZIdENhcGFiaWxpdHksCi0JCQkJCQkJCQkJJkFkZEh0SW5mbywgSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sIE5ld0V4dENoYW5uZWxPZmZzZXQsIENoYW5uZWwsIFJzc2ksIFRpbWVTdGFtcCwgQ2tpcEZsYWcsCi0JCQkJCQkJCQkJJkVkY2FQYXJtLCAmUW9zQ2FwYWJpbGl0eSwgJlFic3NMb2FkLCBMZW5WSUUsIHBWSUUpOwotCQkJCQlpZiAoSWR4ICE9IEJTU19OT1RfRk9VTkQpCi0JCQkJCXsKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlBUU0YsICZFbGVtLT5Nc2dbMjRdLCA0KTsKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5UVFNGWzBdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7Ci0JCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVFRTRls0XSwgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOwotCQkJCQkJQ2FwYWJpbGl0eUluZm8gPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5DYXBhYmlsaXR5SW5mbzsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkvLwotCQkJCQkvLyBNdWx0aXBsZSBTU0lEIGNhc2UsIHVzZWQgY29ycmVjdCBDYXBhYmlsaXR5SW5mbwotCQkJCQkvLwotCQkJCQlDYXBhYmlsaXR5SW5mbyA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLkNhcGFiaWxpdHlJbmZvOwotCQkJCX0KLQkJCX0KLQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Cc3NpZCwgQnNzaWQsIE1BQ19BRERSX0xFTik7Ci0JCQlwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8gPSBDYXBhYmlsaXR5SW5mbyAmIFNVUFBPUlRFRF9DQVBBQklMSVRZX0lORk87Ci0JCQlwQWQtPk1sbWVBdXguQnNzVHlwZSA9IEJzc1R5cGU7Ci0JCQlwQWQtPk1sbWVBdXguQmVhY29uUGVyaW9kID0gQmVhY29uUGVyaW9kOwotCQkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSBDaGFubmVsOwotCQkJcEFkLT5NbG1lQXV4LkF0aW1XaW4gPSBBdGltV2luOwotCQkJcEFkLT5NbG1lQXV4LkNmcFBlcmlvZCA9IENmLkNmcFBlcmlvZDsKLQkJCXBBZC0+TWxtZUF1eC5DZnBNYXhEdXJhdGlvbiA9IENmLkNmcE1heER1cmF0aW9uOwotCQkJcEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgPSBSYWxpbmtJZTsKLQotCQkJLy8gQ29weSBBUCdzIHN1cHBvcnRlZCByYXRlIHRvIE1sbWVBdXggZm9yIGNyZWF0aW5nIGFzc29pY2F0aW9uIHJlcXVlc3QKLQkJCS8vIEFsc28gZmlsdGVyIG91dCBub3Qgc3VwcG9ydGVkIHJhdGUKLQkJCXBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuID0gU3VwUmF0ZUxlbjsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5TdXBSYXRlLCBTdXBSYXRlLCBTdXBSYXRlTGVuKTsKLQkJCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LlN1cFJhdGUsICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbik7Ci0JCQlwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiA9IEV4dFJhdGVMZW47Ci0JCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguRXh0UmF0ZSwgRXh0UmF0ZSwgRXh0UmF0ZUxlbik7Ci0JCQlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5FeHRSYXRlLCAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pOwotCi0gICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldCwgMTYpOwotCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCWlmICgoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBOZGlzODAyXzExV0VQRW5hYmxlZCkgJiYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSkKLQkJCQl8fCAocEFkLT5Db21tb25DZmcuSFRfRGlzYWxsb3dUS0lQID09IEZBTFNFKSkKLQkJCXsKLQkJCQliQWxsb3dOcmF0ZSA9IFRSVUU7Ci0JCQl9Ci0KLQkJCXBBZC0+TWxtZUF1eC5OZXdFeHRDaGFubmVsT2Zmc2V0ID0gTmV3RXh0Q2hhbm5lbE9mZnNldDsKLQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSBIdENhcGFiaWxpdHlMZW47Ci0KLQkJCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCBTSVpFX0hUX0NBUF9JRSk7Ci0JCQkvLyBmaWx0ZXIgb3V0IHVuLXN1cHBvcnRlZCBodCByYXRlcwotCQkJaWYgKCgoSHRDYXBhYmlsaXR5TGVuID4gMCkgfHwgKFByZU5IdENhcGFiaWxpdHlMZW4gPiAwKSkgJiYKLQkJCQkoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkgJiYgKGJBbGxvd05yYXRlKSkpCi0JCQl7Ci0JCQkJUlRNUE1vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sICZBZGRIdEluZm8sIFNJWkVfQUREX0hUX0lORk9fSUUpOwotCi0JCQkJLy8gU3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk1DU1NldCBzdG9yZXMgUGVlciBBUCdzIDExbiBSeCBjYXBhYmlsaXR5Ci0JCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXQsIEh0Q2FwYWJpbGl0eS5NQ1NTZXQsIDE2KTsKLQkJCQlwQWQtPk1sbWVBdXguTmV3RXh0Q2hhbm5lbE9mZnNldCA9IE5ld0V4dENoYW5uZWxPZmZzZXQ7Ci0JCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOwotCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gVFJVRTsKLQkJCQlpZiAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA+IDApCi0JCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYlByZU5IdCA9IFRSVUU7Ci0JCQkJUlRNUENoZWNrSHQocEFkLCBCU1NJRF9XQ0lELCAmSHRDYXBhYmlsaXR5LCAmQWRkSHRJbmZvKTsKLQkJCQkvLyBDb3B5IEFQIFBhcmFtZXRlciB0byBTdGFBY3RpdmUuICBUaGlzIGlzIGFsc28gaW4gTGlua1VwLgotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BdEpvaW5BY3Rpb24hIChNcGR1RGVuc2l0eT0lZCwgTWF4UkFtcGR1RmFjdG9yPSVkLCBCVz0lZClcbiIsCi0JCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk1wZHVEZW5zaXR5LCBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5NYXhSQW1wZHVGYWN0b3IsIEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoKSk7Ci0KLQkJCQlpZiAoQWRkSHRJbmZvTGVuID4gMCkKLQkJCQl7Ci0JCQkJCUNlbnRyYWxDaGFubmVsID0gQWRkSHRJbmZvLkNvbnRyb2xDaGFuOwotCQkJCQkvLyBDaGVjayBhZ2FpbiB0aGUgQmFuZHdpZHRoIGNhcGFiaWxpdHkgb2YgdGhpcyBBUC4KLQkJCQkJaWYgKChBZGRIdEluZm8uQ29udHJvbENoYW4gPiAyKSYmIChBZGRIdEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKSAmJiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQotCQkJCQl7Ci0JCQkJCQlDZW50cmFsQ2hhbm5lbCA9IEFkZEh0SW5mby5Db250cm9sQ2hhbiAtIDI7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoKEFkZEh0SW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQUJPVkUpICYmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCi0JCQkJCXsKLQkJCQkJCUNlbnRyYWxDaGFubmVsID0gQWRkSHRJbmZvLkNvbnRyb2xDaGFuICsgMjsKLQkJCQkJfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIEVycm9yIC4KLQkJCQkJaWYgKHBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCAhPSBDZW50cmFsQ2hhbm5lbCkKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlBlZXJCZWFjb25BdEpvaW5BY3Rpb24gSFQ9PT0+QmVhY29uIENlbnRyYWwgQ2hhbm5lbCA9ICVkLCBDb250cm9sIENoYW5uZWwgPSAlZC4gTWxtZWF1eCBDZW50cmFsQ2hhbm5lbCA9ICVkXG4iLCBDZW50cmFsQ2hhbm5lbCwgQWRkSHRJbmZvLkNvbnRyb2xDaGFuLCBwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwpKTsKLQotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQXRKb2luQWN0aW9uIEhUPT09PkNlbnRyYWwgQ2hhbm5lbCA9ICVkLCBDb250cm9sIENoYW5uZWwgPSAlZCwgIC5cbiIsIENlbnRyYWxDaGFubmVsLCBBZGRIdEluZm8uQ29udHJvbENoYW4pKTsKLQotCQkJCX0KLQotCQkJfQotCQkJZWxzZQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJewotCQkJCS8vIFRvIHByZXZlbnQgZXJyb3IsIGxldCBsZWdhY3kgQVAgbXVzdCBoYXZlIHNhbWUgQ2VudHJhbENoYW5uZWwgYW5kIENoYW5uZWwuCi0JCQkJaWYgKChIdENhcGFiaWxpdHlMZW4gPT0gMCkgJiYgKFByZU5IdENhcGFiaWxpdHlMZW4gPT0gMCkpCi0JCQkJCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+TWxtZUF1eC5DaGFubmVsOwotCi0JCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKLQkJCQlwQWQtPk1sbWVBdXguTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7Ci0JCQkJUlRNUFplcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksIFNJWkVfSFRfQ0FQX0lFKTsKLQkJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID0gMDsKLQkJCQlSVE1QWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywgU0laRV9BRERfSFRfSU5GT19JRSk7Ci0JCQl9Ci0KLQkJCVJUTVBVcGRhdGVNbG1lUmF0ZShwQWQpOwotCi0JCQkvLyBjb3B5IFFPUyByZWxhdGVkIGluZm9ybWF0aW9uCi0JCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJCSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJCSkKLQkJCXsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sICZFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRYnNzTG9hZCwgJlFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUW9zQ2FwYWJpbGl0eSwgJlFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7Ci0JCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTsKLQkJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTsKLQkJCX0KLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIGFmdGVyIEpPSU4sIFN1cFJhdGVMZW49JWQsIEV4dFJhdGVMZW49JWRcbiIsCi0JCQkJcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKSk7Ci0KLQkJCWlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgIT0gMHhGRikKLQkJCXsKLQkJCQkvL1dlIG5lZWQgdG8gY2hhbmdlIG91ciBUeFBvd2VyIGZvciBDQ1ggMi4wIEFQIENvbnRyb2wgb2YgQ2xpZW50IFRyYW5zbWl0IFBvd2VyCi0JCQkJQ2hhbmdlVG9DZWxsUG93ZXJMaW1pdChwQWQsIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCk7Ci0JCQl9Ci0JCQllbHNlICAvL1VzZWQgdGhlIGRlZmF1bHQgVFggUG93ZXIgUGVyY2VudGFnZS4KLQkJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OwotCi0JCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOwotCQkJU3RhdHVzID0gTUxNRV9TVUNDRVNTOwotCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0pPSU5fQ09ORiwgMiwgJlN0YXR1cyk7Ci0JCX0KLQkJLy8gbm90IHRvIG1lIEJFQUNPTiwgaWdub3JlZAotCX0KLQkvLyBzYW5pdHkgY2hlY2sgZmFpbCwgaWdub3JlIHRoaXMgZnJhbWUKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlyZWNlaXZlIEJFQUNPTiBmcm9tIHBlZXIKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBQZWVyQmVhY29uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVQ0hBUiAgICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl0sIEFkZHIyW01BQ19BRERSX0xFTl07Ci0JQ0hBUiAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07Ci0JQ0ZfUEFSTSAgICAgICBDZlBhcm07Ci0JVUNIQVIgICAgICAgICBTc2lkTGVuLCBNZXNzYWdlVG9NZT0wLCBCc3NUeXBlLCBDaGFubmVsLCBOZXdDaGFubmVsLCBpbmRleD0wOwotCVVDSEFSICAgICAgICAgRHRpbUNvdW50PTAsIER0aW1QZXJpb2Q9MCwgQmNhc3RGbGFnPTA7Ci0JVVNIT1JUICAgICAgICBDYXBhYmlsaXR5SW5mbywgQXRpbVdpbiwgQmVhY29uUGVyaW9kOwotCUxBUkdFX0lOVEVHRVIgVGltZVN0YW1wOwotCVVTSE9SVCAgICAgICAgVGJ0dE51bVRvTmV4dFdha2VVcDsKLQlVQ0hBUiAgICAgICAgIEVycDsKLQlVQ0hBUiAgICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUgkJICBTdXBSYXRlTGVuLCBFeHRSYXRlTGVuOwotCVVDSEFSCQkgIENraXBGbGFnOwotCVVTSE9SVCAgICAgICAgTGVuVklFOwotCVVDSEFSCQkgIEFpcm9uZXRDZWxsUG93ZXJMaW1pdDsKLQlFRENBX1BBUk0gICAgICAgRWRjYVBhcm07Ci0JUUJTU19MT0FEX1BBUk0gIFFic3NMb2FkOwotCVFPU19DQVBBQklMSVRZX1BBUk0gUW9zQ2FwYWJpbGl0eTsKLQlVTE9ORyAgICAgICAgICAgUmFsaW5rSWU7Ci0JLy8gTmV3IGZvciBXUEEgc2VjdXJpdHkgc3VpdGVzCi0JVUNIQVIJCQkJCQlWYXJJRVtNQVhfVklFX0xFTl07CQkvLyBUb3RhbCBWSUUgbGVuZ3RoID0gTUFYX1ZJRV9MRU4gLSAtNQotCU5ESVNfODAyXzExX1ZBUklBQkxFX0lFcwkqcFZJRSA9IE5VTEw7Ci0JSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OwotCUFERF9IVF9JTkZPX0lFCQlBZGRIdEluZm87CS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotCVVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLCBQcmVOSHRDYXBhYmlsaXR5TGVuOwotCVVDSEFSCQkJQWRkSHRJbmZvTGVuOwotCVVDSEFSCQkJTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7Ci0KLQotI2lmZGVmIFJBTElOS19BVEUKLSAgICBpZiAoQVRFX09OKHBBZCkpCi0gICAgewotCQlyZXR1cm47Ci0gICAgfQotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotCWlmICghKElORlJBX09OKHBBZCkgfHwgQURIT0NfT04ocEFkKQotCQkpKQotCQlyZXR1cm47Ci0KLQkvLyBJbml0IFZhcmlhYmxlIElFIHN0cnVjdHVyZQotCXBWSUUgPSAoUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcykgVmFySUU7Ci0JcFZJRS0+TGVuZ3RoID0gMDsKLSAgICBSVE1QWmVyb01lbW9yeSgmSHRDYXBhYmlsaXR5LCBzaXplb2YoSHRDYXBhYmlsaXR5KSk7Ci0JUlRNUFplcm9NZW1vcnkoJkFkZEh0SW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7Ci0KLQlpZiAoUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5KHBBZCwKLQkJCQkJCQkJRWxlbS0+TXNnLAotCQkJCQkJCQlFbGVtLT5Nc2dMZW4sCi0JCQkJCQkJCUVsZW0tPkNoYW5uZWwsCi0JCQkJCQkJCUFkZHIyLAotCQkJCQkJCQlCc3NpZCwKLQkJCQkJCQkJU3NpZCwKLQkJCQkJCQkJJlNzaWRMZW4sCi0JCQkJCQkJCSZCc3NUeXBlLAotCQkJCQkJCQkmQmVhY29uUGVyaW9kLAotCQkJCQkJCQkmQ2hhbm5lbCwKLQkJCQkJCQkJJk5ld0NoYW5uZWwsCi0JCQkJCQkJCSZUaW1lU3RhbXAsCi0JCQkJCQkJCSZDZlBhcm0sCi0JCQkJCQkJCSZBdGltV2luLAotCQkJCQkJCQkmQ2FwYWJpbGl0eUluZm8sCi0JCQkJCQkJCSZFcnAsCi0JCQkJCQkJCSZEdGltQ291bnQsCi0JCQkJCQkJCSZEdGltUGVyaW9kLAotCQkJCQkJCQkmQmNhc3RGbGFnLAotCQkJCQkJCQkmTWVzc2FnZVRvTWUsCi0JCQkJCQkJCVN1cFJhdGUsCi0JCQkJCQkJCSZTdXBSYXRlTGVuLAotCQkJCQkJCQlFeHRSYXRlLAotCQkJCQkJCQkmRXh0UmF0ZUxlbiwKLQkJCQkJCQkJJkNraXBGbGFnLAotCQkJCQkJCQkmQWlyb25ldENlbGxQb3dlckxpbWl0LAotCQkJCQkJCQkmRWRjYVBhcm0sCi0JCQkJCQkJCSZRYnNzTG9hZCwKLQkJCQkJCQkJJlFvc0NhcGFiaWxpdHksCi0JCQkJCQkJCSZSYWxpbmtJZSwKLQkJCQkJCQkJJkh0Q2FwYWJpbGl0eUxlbiwKLQkJCQkJCQkJJlByZU5IdENhcGFiaWxpdHlMZW4sCi0JCQkJCQkJCSZIdENhcGFiaWxpdHksCi0JCQkJCQkJCSZBZGRIdEluZm9MZW4sCi0JCQkJCQkJCSZBZGRIdEluZm8sCi0JCQkJCQkJCSZOZXdFeHRDaGFubmVsT2Zmc2V0LAotCQkJCQkJCQkmTGVuVklFLAotCQkJCQkJCQlwVklFKSkKLQl7Ci0JCUJPT0xFQU4gaXNfbXlfYnNzaWQsIGlzX215X3NzaWQ7Ci0JCVVMT05HICAgQnNzaWR4LCBOb3c7Ci0JCUJTU19FTlRSWSAqcEJzczsKLQkJQ0hBUgkJUmVhbFJzc2kgPSBSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMCwgUlNTSV8wKSwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kxLCBSU1NJXzEpLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTIsIFJTU0lfMikpOwotCi0JCWlzX215X2Jzc2lkID0gTUFDX0FERFJfRVFVQUwoQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKT8gVFJVRSA6IEZBTFNFOwotCQlpc19teV9zc2lkID0gU1NJRF9FUVVBTChTc2lkLCBTc2lkTGVuLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKT8gVFJVRTpGQUxTRTsKLQotCi0JCS8vIGlnbm9yZSBCRUFDT04gbm90IGZvciBteSBTU0lECi0JCWlmICgoISBpc19teV9zc2lkKSAmJiAoISBpc19teV9ic3NpZCkpCi0JCQlyZXR1cm47Ci0KLQkJLy8gSXQgbWVhbnMgU1RBIHdhaXRzIGRpc2Fzc29jIGNvbXBsZXRlbHkgZnJvbSB0aGlzIEFQLCBpZ25vcmVzIHRoaXMgYmVhY29uLgotCQlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX1dBSVRfRElTQVNTT0MpCi0JCQlyZXR1cm47Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJLy8gQ29weSBDb250cm9sIGNoYW5uZWwgZm9yIHRoaXMgQlNTSUQuCi0JCWlmIChBZGRIdEluZm9MZW4gIT0gMCkKLQkJCUNoYW5uZWwgPSBBZGRIdEluZm8uQ29udHJvbENoYW47Ci0KLQkJaWYgKChIdENhcGFiaWxpdHlMZW4gPiAwKSB8fCAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA+IDApKQotCQkJSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkJLy8KLQkJLy8gSG91c2VrZWVwaW5nICJTc2lkQnNzVGFiIiB0YWJsZSBmb3IgbGF0ZXItb24gUk9BTWluZyB1c2FnZS4KLQkJLy8KLQkJQnNzaWR4ID0gQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgQnNzaWQsIENoYW5uZWwpOwotCQlpZiAoQnNzaWR4ID09IEJTU19OT1RfRk9VTkQpCi0JCXsKLQkJCS8vIGRpc2NvdmVyIG5ldyBBUCBvZiB0aGlzIG5ldHdvcmssIGNyZWF0ZSBCU1MgZW50cnkKLQkJCUJzc2lkeCA9IEJzc1RhYmxlU2V0RW50cnkocEFkLCAmcEFkLT5TY2FuVGFiLCBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLAotCQkJCQkJICZDZlBhcm0sIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLAotCQkJCQkJJkh0Q2FwYWJpbGl0eSwgJkFkZEh0SW5mbyxIdENhcGFiaWxpdHlMZW4sQWRkSHRJbmZvTGVuLE5ld0V4dENoYW5uZWxPZmZzZXQsIENoYW5uZWwsCi0JCQkJCQlSZWFsUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywgJkVkY2FQYXJtLCAmUW9zQ2FwYWJpbGl0eSwKLQkJCQkJCSZRYnNzTG9hZCwgTGVuVklFLCBwVklFKTsKLQkJCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkgLy8gcmV0dXJuIGlmIEJTUyB0YWJsZSBmdWxsCi0JCQkJcmV0dXJuOwotCi0JCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5QVFNGLCAmRWxlbS0+TXNnWzI0XSwgNCk7Ci0JCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uVFRTRlswXSwgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOwotCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLlRUU0ZbNF0sICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKLQotCi0KLQkJfQotCi0JCWlmICgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYgKE5ld0NoYW5uZWwgIT0gMCkgJiYgKENoYW5uZWwgIT0gTmV3Q2hhbm5lbCkpCi0JCXsKLQkJCS8vIFN3aXRjaGluZyB0byBjaGFubmVsIDEgY2FuIHByZXZlbnQgZnJvbSByZXNjYW5uaW5nIHRoZSBjdXJyZW50IGNoYW5uZWwgaW1tZWRpYXRlbHkgKGJ5IGF1dG8gcmVjb25uZWN0aW9uKS4KLQkJCS8vIEluIGFkZGl0aW9uLCBjbGVhciB0aGUgTUxNRSBxdWV1ZSBhbmQgdGhlIHNjYW4gdGFibGUgdG8gZGlzY2FyZCB0aGUgUlggcGFja2V0cyBhbmQgcHJldmlvdXMgc2Nhbm5pbmcgcmVzdWx0cy4KLQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgMSwgRkFMU0UpOwotCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgMSk7Ci0JCSAgICBMaW5rRG93bihwQWQsIEZBTFNFKTsKLQkJCU1sbWVRdWV1ZUluaXQoJnBBZC0+TWxtZS5RdWV1ZSk7Ci0JCQlCc3NUYWJsZUluaXQoJnBBZC0+U2NhblRhYik7Ci0JCSAgICBSVE1QdXNlY0RlbGF5KDEwMDAwMDApOwkJLy8gdXNlIGRlbGF5IHRvIHByZXZlbnQgU1RBIGRvIHJlYXNzb2MKLQotCQkJLy8gY2hhbm5lbCBzYW5pdHkgY2hlY2sKLQkJCWZvciAoaW5kZXggPSAwIDsgaW5kZXggPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpbmRleCsrKQotCQkJewotCQkJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2luZGV4XS5DaGFubmVsID09IE5ld0NoYW5uZWwpCi0JCQkJewotCQkJCQlwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5DaGFubmVsID0gTmV3Q2hhbm5lbDsKLQkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IE5ld0NoYW5uZWw7Ci0JCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwotCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbiAtIFNUQSByZWNlaXZlIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBJRSAoTmV3IENoYW5uZWwgPSVkKVxuIiwgTmV3Q2hhbm5lbCkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChpbmRleCA+PSBwQWQtPkNoYW5uZWxMaXN0TnVtKQotCQkJewotCQkJCURCR1BSSU5UX0VSUigoIlBlZXJCZWFjb24oY2FuIG5vdCBmaW5kIE5ldyBDaGFubmVsPSVkIGluIENoYW5uZWxMaXN0WyVkXVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5DaGFubmVsTGlzdE51bSkpOwotCQkJfQotCQl9Ci0KLQkJLy8gaWYgdGhlIHNzaWQgbWF0Y2hlZCAmIGJzc2lkIHVubWF0Y2hlZCwgd2Ugc2hvdWxkIHNlbGVjdCB0aGUgYnNzaWQgd2l0aCBsYXJnZSB2YWx1ZS4KLQkJLy8gVGhpcyBtaWdodCBoYXBwZW5lZCB3aGVuIHR3byBTVEEgc3RhcnQgYXQgdGhlIHNhbWUgdGltZQotCQlpZiAoKCEgaXNfbXlfYnNzaWQpICYmIEFESE9DX09OKHBBZCkpCi0JCXsKLQkJCUlOVAlpOwotCi0JCQkvLyBBZGQgdGhlIHNhZmVndWFyZCBhZ2FpbnN0IHRoZSBtaXNtYXRjaCBvZiBhZGhvYyB3ZXAgc3RhdHVzCi0JCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLldlcFN0YXR1cykKLQkJCXsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIGNvbGxhcHNlIGludG8gdGhlIEFESE9DIG5ldHdvcmsgd2hpY2ggaGFzIGJpZ2dlciBCU1NJRCB2YWx1ZS4KLQkJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JCQl7Ci0JCQkJaWYgKEJzc2lkW2ldID4gcEFkLT5Db21tb25DZmcuQnNzaWRbaV0pCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gbWVyZ2UgdG8gdGhlIElCU1Mgd2l0aCBiaWdnZXIgQlNTSUQ9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCQkJCQlCc3NpZFswXSwgQnNzaWRbMV0sIEJzc2lkWzJdLCBCc3NpZFszXSwgQnNzaWRbNF0sIEJzc2lkWzVdKSk7Ci0JCQkJCUFzaWNEaXNhYmxlU3luYyhwQWQpOwotCQkJCQlDT1BZX01BQ19BRERSKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBCc3NpZCk7Ci0JCQkJCUFzaWNTZXRCc3NpZChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJCQkJTWFrZUlic3NCZWFjb24ocEFkKTsgICAgICAgIC8vIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZQotCQkJCQlBc2ljRW5hYmxlSWJzc1N5bmMocEFkKTsgICAgLy8gY29weSBCRUFDT04gZnJhbWUgdG8gb24tY2hpcCBtZW1vcnkKLQkJCQkJaXNfbXlfYnNzaWQgPSBUUlVFOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoQnNzaWRbaV0gPCBwQWQtPkNvbW1vbkNmZy5Cc3NpZFtpXSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCi0JCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7Ci0JCXBCc3MgPSAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF07Ci0JCXBCc3MtPlJzc2kgPSBSZWFsUnNzaTsgICAgICAgLy8gbGFzdGVzdCBSU1NJCi0JCXBCc3MtPkxhc3RCZWFjb25SeFRpbWUgPSBOb3c7ICAgLy8gbGFzdCBSWCB0aW1lc3RhbXAKLQotCQkvLwotCQkvLyBCRUFDT04gZnJvbSBteSBCU1NJRCAtIGVpdGhlciBJQlNTIG9yIElORlJBIG5ldHdvcmsKLQkJLy8KLQkJaWYgKGlzX215X2Jzc2lkKQotCQl7Ci0JCQlSWFdJX1NUUlVDCVJ4V0k7Ci0KLQkJCXBBZC0+U3RhQ2ZnLkR0aW1Db3VudCA9IER0aW1Db3VudDsKLQkJCXBBZC0+U3RhQ2ZnLkR0aW1QZXJpb2QgPSBEdGltUGVyaW9kOwotCQkJcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSA9IE5vdzsKLQotCi0JCQlSeFdJLlJTU0kwID0gRWxlbS0+UnNzaTA7Ci0JCQlSeFdJLlJTU0kxID0gRWxlbS0+UnNzaTE7Ci0JCQlSeFdJLlJTU0kyID0gRWxlbS0+UnNzaTI7Ci0KLQkJCVVwZGF0ZV9Sc3NpX1NhbXBsZShwQWQsICZwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLCAmUnhXSSk7Ci0JCQlpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0ICE9IDB4RkYpCi0JCQl7Ci0JCQkJLy8KLQkJCQkvLyBXZSBnZXQgdGhlIENpc2NvIChjY3gpICJUeFBvd2VyIExpbWl0IiByZXF1aXJlZAotCQkJCS8vIENoYW5nZWQgdG8gYXBwcm9wcmlhdGUgVHhQb3dlciBMaW1pdCBmb3IgQ2lzbyBDb21wYXRpYmxlIEV4dGVuc2lvbnMKLQkJCQkvLwotCQkJCUNoYW5nZVRvQ2VsbFBvd2VyTGltaXQocEFkLCBBaXJvbmV0Q2VsbFBvd2VyTGltaXQpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vCi0JCQkJLy8gQWlyb25ldENlbGxQb3dlckxpbWl0IGVxdWFsIHRvIDB4RkYgbWVhbnMgdGhlIENpc2NvIChjY3gpICJUeFBvd2VyIExpbWl0IiBub3QgZXhpc3QuCi0JCQkJLy8gVXNlZCB0aGUgZGVmYXVsdCBUWCBQb3dlciBQZXJjZW50YWdlLCB0aGF0IHNldCBmcm9tIFVJLgotCQkJCS8vCi0JCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdDsKLQkJCX0KLQotCQkJaWYgKEFESE9DX09OKHBBZCkgJiYgKENBUF9JU19JQlNTX09OKENhcGFiaWxpdHlJbmZvKSkpCi0JCQl7Ci0JCQkJVUNIQVIJCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gMDsKLQkJCQlVQ0hBUgkJCWlkeDsKLQkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKLQotCQkJCS8vIHN1cHBvcnRlZCByYXRlcyBhcnJheSBtYXkgbm90IGJlIHNvcnRlZC4gc29ydCBpdCBhbmQgZmluZCB0aGUgbWF4aW11bSByYXRlCi0JCQkgICAgZm9yIChpZHg9MDsgaWR4PFN1cFJhdGVMZW47IGlkeCsrKQotCQkJCXsKLQkJCSAgICAgICAgaWYgKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPCAoU3VwUmF0ZVtpZHhdICYgMHg3ZikpCi0JCQkgICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gU3VwUmF0ZVtpZHhdICYgMHg3ZjsKLQkJCQkJCX0KLQotCQkJCWZvciAoaWR4PTA7IGlkeDxFeHRSYXRlTGVuOyBpZHgrKykKLQkJCSAgICB7Ci0JCQkgICAgICAgIGlmIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzIDwgKEV4dFJhdGVbaWR4XSAmIDB4N2YpKQotCQkJICAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IEV4dFJhdGVbaWR4XSAmIDB4N2Y7Ci0JCQkJCX0KLQotCQkJCS8vIGxvb2sgdXAgdGhlIGV4aXN0aW5nIHRhYmxlCi0JCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBBZGRyMik7Ci0KLQkJCQkvLyBBZC1ob2MgbW9kZSBpcyB1c2luZyBNQUMgYWRkcmVzcyBhcyBCQSBzZXNzaW9uLiBTbyB3ZSBuZWVkIHRvIGNvbnRpbnVvdXNseSBmaW5kIG5ld2x5IGpvaW5lZCBhZGhvYyBzdGF0aW9uIGJ5IHJlY2VpdmluZyBiZWFjb24uCi0JCQkJLy8gVG8gcHJldmVudCBhbHdheXMgY2hlY2sgdGhpcywgd2UgdXNlIHdjaWQgPT0gUkVTRVJWRURfV0NJRCB0byByZWNvZ25pemUgaXQgYXMgbmV3bHkgam9pbmVkIGFkaG9jIHN0YXRpb24uCi0JCQkJaWYgKChBREhPQ19PTihwQWQpICYmIChFbGVtLT5XY2lkID09IFJFU0VSVkVEX1dDSUQpKSB8fAotCQkJCQkocEVudHJ5ICYmICgocEVudHJ5LT5MYXN0QmVhY29uUnhUaW1lICsgQURIT0NfRU5UUllfQkVBQ09OX0xPU1RfVElNRSkgPCBOb3cpKSkKLQkJCQkJCXsKLQkJCQkJaWYgKHBFbnRyeSA9PSBOVUxMKQotCQkJCQkJLy8gQW5vdGhlciBhZGhvYyBqb2luaW5nLCBhZGQgdG8gb3VyIE1BQyB0YWJsZS4KLQkJCQkJCXBFbnRyeSA9IE1hY1RhYmxlSW5zZXJ0RW50cnkocEFkLCBBZGRyMiwgQlNTMCwgRkFMU0UpOwotCi0JCQkJCWlmIChTdGFBZGRNYWNUYWJsZUVudHJ5KHBBZCwKLQkJCQkJCQkJCQkJcEVudHJ5LAotCQkJCQkJCQkJCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzLAotCQkJCQkJCQkJCQkmSHRDYXBhYmlsaXR5LAotCQkJCQkJCQkJCQlIdENhcGFiaWxpdHlMZW4sCi0JCQkJCQkJCQkJCSZBZGRIdEluZm8sCi0JCQkJCQkJCQkJCUFkZEh0SW5mb0xlbiwKLQkJCQkJCQkJCQkJQ2FwYWJpbGl0eUluZm8pID09IEZBTFNFKQotCQkJCQl7Ci0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBREhPQyAtIEFkZCBFbnRyeSBmYWlsZWQuXG4iKSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQlpZiAocEVudHJ5ICYmCi0JCQkJCQkoRWxlbS0+V2NpZCA9PSBSRVNFUlZFRF9XQ0lEKSkKLQkJCQl7Ci0JCQkJCQlpZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7Ci0JCQkJCQlSVE1QX1NUQV9TRUNVUklUWV9JTkZPX0FERChwQWQsIEJTUzAsIGlkeCwgcEVudHJ5KTsKLQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKHBFbnRyeSAmJiBwRW50cnktPlZhbGlkQXNDTEkpCi0JCQkJCXBFbnRyeS0+TGFzdEJlYWNvblJ4VGltZSA9IE5vdzsKLQotCQkJCS8vIEF0IGxlYXN0IGFub3RoZXIgcGVlciBpbiB0aGlzIElCU1MsIGRlY2xhcmUgTWVkaWFTdGF0ZSBhcyBDT05ORUNURUQKLQkJCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJCQl7Ci0JCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwotCi0JCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0JCQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7Ci0JICAgICAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOwotCQkJCQlBc2ljU2V0QnNzaWQocEFkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0KLQkJCQkJLy8gMjAwMy8wMy8xMiAtIGpvaG4KLQkJCQkJLy8gTWFrZSBzdXJlIHRoaXMgZW50cnkgaW4gIlNjYW5UYWIiIHRhYmxlLCB0aHVzIGNvbXBsaWVzIHRvIE1pY3Jvc29mdCdzIHBvbGljeSB0aGF0Ci0JCQkJCS8vICJzaXRlIHN1cnZleSIgcmVzdWx0IHNob3VsZCBhbHdheXMgaW5jbHVkZSB0aGUgY3VycmVudCBjb25uZWN0ZWQgbmV0d29yay4KLQkJCQkJLy8KLQkJCQkJQnNzaWR4ID0gQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgQnNzaWQsIENoYW5uZWwpOwotCQkJCQlpZiAoQnNzaWR4ID09IEJTU19OT1RfRk9VTkQpCi0JCQkJCXsKLQkJCQkJCUJzc2lkeCA9IEJzc1RhYmxlU2V0RW50cnkocEFkLCAmcEFkLT5TY2FuVGFiLCBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLAotCQkJCQkJCQkJJkNmUGFybSwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sICZIdENhcGFiaWxpdHksCi0JCQkJCQkJCQkmQWRkSHRJbmZvLCBIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwgTmV3RXh0Q2hhbm5lbE9mZnNldCwgQ2hhbm5lbCwgUmVhbFJzc2ksIFRpbWVTdGFtcCwgMCwKLQkJCQkJCQkJCSZFZGNhUGFybSwgJlFvc0NhcGFiaWxpdHksICZRYnNzTG9hZCwgTGVuVklFLCBwVklFKTsKLQkJCQkJfQotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBREhPQyAgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQuXG4iKSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoSU5GUkFfT04ocEFkKSkKLQkJCXsKLQkJCQlCT09MRUFOIGJVc2VTaG9ydFNsb3QsIGJVc2VCR1Byb3RlY3Rpb247Ci0KLQkJCQkvLyBkZWNpZGUgdG8gdXNlL2NoYW5nZSB0byAtCi0JCQkJLy8gICAgICAxLiBsb25nIHNsb3QgKDIwIHVzKSBvciBzaG9ydCBzbG90ICg5IHVzKSB0aW1lCi0JCQkJLy8gICAgICAyLiB0dXJuIG9uL29mZiBSVFMvQ1RTIGFuZC9vciBDVFMtdG8tc2VsZiBwcm90ZWN0aW9uCi0JCQkJLy8gICAgICAzLiBzaG9ydCBwcmVhbWJsZQotCi0JCQkJLy9iVXNlU2hvcnRTbG90ID0gcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgJiYgQ0FQX0lTX1NIT1JUX1NMT1QoQ2FwYWJpbGl0eUluZm8pOwotCQkJCWJVc2VTaG9ydFNsb3QgPSBDQVBfSVNfU0hPUlRfU0xPVChDYXBhYmlsaXR5SW5mbyk7Ci0JCQkJaWYgKGJVc2VTaG9ydFNsb3QgIT0gT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCkpCi0JCQkJCUFzaWNTZXRTbG90VGltZShwQWQsIGJVc2VTaG9ydFNsb3QpOwotCi0JCQkJYlVzZUJHUHJvdGVjdGlvbiA9IChwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPT0gMSkgfHwgICAgLy8gYWx3YXlzIHVzZQotCQkJCQkJCQkgICAoKHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9PSAwKSAmJiBFUlBfSVNfVVNFX1BST1RFQ1RJT04oRXJwKSk7Ci0KLQkJCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KSAvLyBhbHdheXMgbm8gQkcgcHJvdGVjdGlvbiBpbiBBLWJhbmQuIGZhbHNlbHkgaGFwcGVuZWQgd2hlbiBzd2l0Y2hpbmcgQS9HIGJhbmQgdG8gYSBkdWFsLWJhbmQgQVAKLQkJCQkJYlVzZUJHUHJvdGVjdGlvbiA9IEZBTFNFOwotCi0JCQkJaWYgKGJVc2VCR1Byb3RlY3Rpb24gIT0gT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCkpCi0JCQkJewotCQkJCQlpZiAoYlVzZUJHUHJvdGVjdGlvbikKLQkJCQkJewotCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKTsKLQkJCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgKE9GRE1TRVRQUk9URUNUfENDS1NFVFBST1RFQ1R8QUxMTl9TRVRQUk9URUNUKSxGQUxTRSwocEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9PSAxKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCk7Ci0JCQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsIChPRkRNU0VUUFJPVEVDVHxDQ0tTRVRQUk9URUNUfEFMTE5fU0VUUFJPVEVDVCksVFJVRSwocEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9PSAxKSk7Ci0JCQkJCX0KLQotCQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlNZTkMgLSBBUCBjaGFuZ2VkIEIvRyBwcm90ZWN0aW9uIHRvICVkXG4iLCBiVXNlQkdQcm90ZWN0aW9uKSk7Ci0JCQkJfQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkJLy8gY2hlY2sgSHQgcHJvdGVjdGlvbiBtb2RlLiBhbmQgYWRoZXJlIHRvIHRoZSBOb24tR0YgZGV2aWNlIGluZGljYXRpb24gYnkgQVAuCi0JCQkJaWYgKChBZGRIdEluZm9MZW4gIT0gMCkgJiYKLQkJCQkJKChBZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUgIT0gcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSkgfHwKLQkJCQkJKEFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCAhPSBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50KSkpCi0JCQkJewotCQkJCQlwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID0gQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50OwotCQkJCQlwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlID0gQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlOwotCQkJCQlpZiAocEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9PSAxKQotCQkJCXsKLQkJCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgVFJVRSk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBGQUxTRSk7Ci0KLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEFQIGNoYW5nZWQgTiBPcGVyYWlvbk1vZGUgdG8gJWRcbiIsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUpKTsKLQkJCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpICYmCi0JCQkJCUVSUF9JU19VU0VfQkFSS0VSX1BSRUFNQkxFKEVycCkpCi0JCQkJewotCQkJCQlNbG1lU2V0VHhQcmVhbWJsZShwQWQsIFJ0ODAyXzExUHJlYW1ibGVMb25nKTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEFQIGZvcmNlZCB0byB1c2UgTE9ORyBwcmVhbWJsZVxuIikpOwotCQkJCX0KLQotCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpICAgICYmCi0JCQkJCShFZGNhUGFybS5iVmFsaWQgPT0gVFJVRSkgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0JCQkJCShFZGNhUGFybS5FZGNhVXBkYXRlQ291bnQgIT0gcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5FZGNhVXBkYXRlQ291bnQpKQotCQkJCXsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEFQIGNoYW5nZSBFRENBIHBhcmFtZXRlcnMoZnJvbSAlZCB0byAlZClcbiIsCi0JCQkJCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCwKLQkJCQkJCUVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCkpOwotCQkJCQlBc2ljU2V0RWRjYVBhcm0ocEFkLCAmRWRjYVBhcm0pOwotCQkJCX0KLQotCQkJCS8vIGNvcHkgUU9TIHJlbGF0ZWQgaW5mb3JtYXRpb24KLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQVBRYnNzTG9hZCwgJlFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQVBRb3NDYXBhYmlsaXR5LCAmUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTsKLQkJCX0KLQotCQkJLy8gb25seSBJTkZSQVNUUlVDVFVSRSBtb2RlIHN1cHBvcnQgcG93ZXItc2F2aW5nIGZlYXR1cmUKLQkJCWlmICgoSU5GUkFfT04ocEFkKSAmJiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSkgfHwgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpKQotCQkJewotCQkJCVVDSEFSIEZyZWVOdW1iZXI7Ci0JCQkJLy8gIDEuIEFQIGhhcyBiYWNrbG9nZ2VkIHVuaWNhc3QtdG8tbWUgZnJhbWUsIHN0YXkgQVdBS0UsIHNlbmQgUFNQT0xMCi0JCQkJLy8gIDIuIEFQIGhhcyBiYWNrbG9nZ2VkIGJyb2FkY2FzdC9tdWx0aWNhc3QgZnJhbWUgYW5kIHdlIHdhbnQgdGhvc2UgZnJhbWVzLCBzdGF5IEFXQUtFCi0JCQkJLy8gIDMuIHdlIGhhdmUgb3V0Z29pbmcgZnJhbWVzIGluIFR4UmluZyBvciBNZ210UmluZywgYmV0dGVyIHN0YXkgQVdBS0UKLQkJCQkvLyAgNC4gUHNtIGNoYW5nZSB0byBQV1JfU0FWRSwgYnV0IEFQIG5vdCBiZWVuIGluZm9ybWVkIHlldCwgd2UgYmV0dGVyIHN0YXkgQVdBS0UKLQkJCQkvLyAgNS4gb3RoZXJ3aXNlLCBwdXQgUEhZIGJhY2sgdG8gc2xlZXAgdG8gc2F2ZSBiYXR0ZXJ5LgotCQkJCWlmIChNZXNzYWdlVG9NZSkKLQkJCQl7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkKLQkJCQkJewotCQkJCQkJLy8gUmVzdG9yZSB0byBjb3JyZWN0IEJCUCBSMyB2YWx1ZQotCQkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPiAxKQotCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgcEFkLT5TdGFDZmcuQkJQUjMpOwotCQkJCQkJLy8gVHVybiBjbGsgdG8gODBNaHouCi0JCQkJCX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSAmJgotCQkJCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRSAmJiBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLICYmIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgJiYgcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTykKLQkJCQkJewotCQkJCQkJcEFkLT5Db21tb25DZmcuYk5lZWRTZW5kVHJpZ2dlckZyYW1lID0gVFJVRTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQlSVE1QX1BTX1BPTExfRU5RVUVVRShwQWQpOwotCQkJCX0KLQkJCQllbHNlIGlmIChCY2FzdEZsYWcgJiYgKER0aW1Db3VudCA9PSAwKSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSkpCi0JCQkJewotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpCi0JCQkJCXsKLQkJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID4gMSkKLQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIHBBZC0+U3RhQ2ZnLkJCUFIzKTsKLQkJCQkJfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCQkJCX0KLQkJCQllbHNlIGlmICgocEFkLT5UeFN3UXVldWVbUUlEX0FDX0JLXS5OdW1iZXIgIT0gMCkJCQkJCQkJCQkJCQkJfHwKLQkJCQkJCShwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQkVdLk51bWJlciAhPSAwKQkJCQkJCQkJCQkJCQkJfHwKLQkJCQkJCShwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVkldLk51bWJlciAhPSAwKQkJCQkJCQkJCQkJCQkJfHwKLQkJCQkJCShwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dLk51bWJlciAhPSAwKQkJCQkJCQkJCQkJCQkJfHwKLQkJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QocEFkLCBRSURfQUNfQkssIFRYX1JJTkdfU0laRSAtIDEsICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQl8fAotCQkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgVFhfUklOR19TSVpFIC0gMSwgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCXx8Ci0JCQkJCQkoUlRNUEZyZWVUWERSZXF1ZXN0KHBBZCwgUUlEX0FDX1ZJLCBUWF9SSU5HX1NJWkUgLSAxLCAmRnJlZU51bWJlcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykJfHwKLQkJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QocEFkLCBRSURfQUNfVk8sIFRYX1JJTkdfU0laRSAtIDEsICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQl8fAotCQkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdChwQWQsIFFJRF9NR01ULCBNR01UX1JJTkdfU0laRSAtIDEsICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKSkKLQkJCQl7Ci0JCQkJCS8vIFRPRE86IGNvbnNpZGVyIHNjaGVkdWxlZCBIQ0NBLiBtaWdodCBub3QgYmUgcHJvcGVyIHRvIHVzZSB0cmFkaXRpb25hbCBEVElNLWJhc2VkIHBvd2VyLXNhdmluZyBzY2hlbWUKLQkJCQkJLy8gY2FuIHdlIGNoZWF0IGhlcmUgKGkuZS4ganVzdCBjaGVjayBNR01UICYgQUNfQkUpIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2U/Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkKLQkJCQkJewotCQkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPiAxKQotCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgcEFkLT5TdGFDZmcuQkJQUjMpOwotCQkJCQl9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWlmICgocEFkLT5Db21tb25DZmcuYkFDTUFQU0RUcltRSURfQUNfVk9dKSB8fAotCQkJCQkJKHBBZC0+Q29tbW9uQ2ZnLmJBQ01BUFNEVHJbUUlEX0FDX1ZJXSkgfHwKLQkJCQkJCShwQWQtPkNvbW1vbkNmZy5iQUNNQVBTRFRyW1FJRF9BQ19CS10pIHx8Ci0JCQkJCQkocEFkLT5Db21tb25DZmcuYkFDTUFQU0RUcltRSURfQUNfQkVdKSkKLQkJCQkJewotCQkJCQkJLyoKLQkJCQkJCQlXTU0gU3BlYyB2MS4wIDMuNi4yLjQsCi0JCQkJCQkJVGhlIFdNTSBTVEEgc2hhbGwgcmVtYWluIGF3YWtlIHVudGlsIGl0IHJlY2VpdmVzIGEKLQkJCQkJCQlRb1MgRGF0YSBvciBOdWxsIGZyYW1lIGFkZHJlc3NlZCB0byBpdCwgd2l0aCB0aGUKLQkJCQkJCQlFT1NQIHN1YmZpZWxkIGluIFFvUyBDb250cm9sIGZpZWxkIHNldCB0byAxLgotCi0JCQkJCQkJU28gd2UgY2FuIG5vdCBzbGVlcCBoZXJlIG9yIHdlIHdpbGwgc3VmZmVyIGEgY2FzZToKLQotCQkJCQkJCVBTIE1hbmFnZW1lbnQgRnJhbWUgLS0+Ci0JCQkJCQkJVHJpZ2dlciBmcmFtZSAtLT4KLQkJCQkJCQlCZWFjb24gKFRJTT0wKSAoQmVhY29uIGlzIGNsb3NlciB0byBUcmlnIGZyYW1lKSAtLT4KLQkJCQkJCQlTdGF0aW9uIGdvZXMgdG8gc2xlZXAgLS0+Ci0JCQkJCQkJQVAgZGVsaXZlcnkgcXVldWVkIFVBUFNEIHBhY2tldHMgLS0+Ci0JCQkJCQkJU3RhdGlvbiBjYW4gTk9UIHJlY2VpdmUgdGhlIHJlcGx5Ci0KLQkJCQkJCQlNYXliZSB3ZSBuZWVkIGEgdGltZW91dCB0aW1lciB0byBhdm9pZCB0aGF0IHdlIGRvCi0JCQkJCQkJTk9UIHJlY2VpdmUgdGhlIEVPU1AgZnJhbWUuCi0KLQkJCQkJCQlXZSBjYW4gbm90IHVzZSBNb3JlIERhdGEgdG8gY2hlY2sgaWYgU1AgaXMgZW5kZWQKLQkJCQkJCQlkdWUgdG8gTWF4U1BMZW5ndGguCi0JCQkJCQkqLwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJVVNIT1JUIE5leHREdGltID0gRHRpbUNvdW50OwotCi0KLQkJCQkJCWlmIChOZXh0RHRpbSA9PSAwKQotCQkJCQkJCU5leHREdGltID0gRHRpbVBlcmlvZDsKLQotCQkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudDsKLQkJCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSkgJiYgKFRidHROdW1Ub05leHRXYWtlVXAgPiBOZXh0RHRpbSkpCi0JCQkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IE5leHREdGltOwotCi0JCQkJCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0JCQkJCQl7Ci0JCQkJCQkJLy8gU2V0IGEgZmxhZyB0byBnbyB0byBzbGVlcCAuIFRoZW4gYWZ0ZXIgcGFyc2UgdGhpcyBSeERvbmVJbnRlcnJ1cHQsIHdpbGwgZ28gdG8gc2xlZXAgbW9kZS4KLQkJCQkJCQlwQWQtPlRoaXNUYnR0TnVtVG9OZXh0V2FrZVVwID0gVGJ0dE51bVRvTmV4dFdha2VVcDsKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKHBBZCwgcEFkLT5UaGlzVGJ0dE51bVRvTmV4dFdha2VVcCk7Ci0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBub3QgbXkgQlNTSUQsIGlnbm9yZSBpdAotCX0KLQkvLyBzYW5pdHkgY2hlY2sgZmFpbCwgaWdub3JlIHRoaXMgZnJhbWUKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlSZWNlaXZlIFBST0JFIFJFUSBmcm9tIHJlbW90ZSBwZWVyIHdoZW4gb3BlcmF0aW5nIGluIElCU1MgbW9kZQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgUGVlclByb2JlUmVxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVQ0hBUiAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07Ci0JQ0hBUiAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07Ci0JVUNIQVIgICAgICAgICBTc2lkTGVuOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCVVDSEFSCQkgIEh0TGVuLCBBZGRIdExlbiwgTmV3RXh0TGVuOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCUhFQURFUl84MDJfMTEgUHJvYmVSc3BIZHI7Ci0JTkRJU19TVEFUVVMgICBOU3RhdHVzOwotCVBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0JTEFSR0VfSU5URUdFUiBGYWtlVGltZXN0YW1wOwotCVVDSEFSICAgICAgICAgRHNMZW4gPSAxLCBJYnNzTGVuID0gMjsKLQlVQ0hBUiAgICAgICAgIExvY2FsRXJwSWVbM10gPSB7SUVfRVJQLCAxLCAwfTsKLQlCT09MRUFOICAgICAgIFByaXZhY3k7Ci0JVVNIT1JUICAgICAgICBDYXBhYmlsaXR5SW5mbzsKLQlVQ0hBUgkJICBSU05JZSA9IElFX1dQQTsKLQotCWlmICghIEFESE9DX09OKHBBZCkpCi0JCXJldHVybjsKLQotCWlmIChQZWVyUHJvYmVSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsIFNzaWQsICZTc2lkTGVuKSkKLQl7Ci0JCWlmICgoU3NpZExlbiA9PSAwKSB8fCBTU0lEX0VRVUFMKFNzaWQsIFNzaWRMZW4sIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pKQotCQl7Ci0JCQkvLyBhbGxvY2F0ZSBhbmQgc2VuZCBvdXQgUHJvYmVSc3AgZnJhbWUKLQkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQkJCXJldHVybjsKLQotCQkJLy9wQWQtPlN0YUNmZy5BdGltV2luID0gMDsgIC8vID8/Pz8/PwotCi0JCQlQcml2YWN5ID0gKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSB8fAotCQkJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKLQkJCQkJICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpOwotCQkJQ2FwYWJpbGl0eUluZm8gPSBDQVBfR0VORVJBVEUoMCwgMSwgUHJpdmFjeSwgKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZVNob3J0KSwgMCwgMCk7Ci0KLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgICAgICZQcm9iZVJzcEhkciwKLQkJCQkJCQkgIFRJTUVTVEFNUF9MRU4sICAgICAgICAgICAgICAgICZGYWtlVGltZXN0YW1wLAotCQkJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCwKLQkJCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDYXBhYmlsaXR5SW5mbywKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuU3NpZExlbiwKLQkJCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sCi0JCQkJCQkJICBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLCAgICBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRzSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRHNMZW4sCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJYnNzSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSWJzc0xlbiwKLQkJCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPlN0YUFjdGl2ZS5BdGltV2luLAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCi0JCQlpZiAocEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbikKLQkJCXsKLQkJCQlVTE9ORyB0bXA7Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgJnRtcCwKLQkJCQkJCQkJICAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbEVycEllLAotCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCi0JCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4sCi0JCQkJCQkJCSAgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiwgICAgJnBBZC0+U3RhQWN0aXZlLkV4dFJhdGUsCi0JCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJCUZyYW1lTGVuICs9IHRtcDsKLQkJCX0KLQotCQkJLy8gSWYgYWRob2Mgc2VjcnVpdHkgaXMgc2V0IGZvciBXUEEtTm9uZSwgYXBwZW5kIHRoZSBjaXBoZXIgc3VpdGUgSUUKLQkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotCQkJewotCQkJCVVMT05HIHRtcDsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCQkmdG1wLAotCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUlNOSWUsCi0JCQkJCQkJCQkxLAkJCQkmcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAotCQkJCQkJCQkJcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAkJcEFkLT5TdGFDZmcuUlNOX0lFLAotCQkJCQkJCQkJRU5EX09GX0FSR1MpOwotCQkJCUZyYW1lTGVuICs9IHRtcDsKLQkJCX0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCi0JCQl7Ci0JCQkJVUxPTkcgVG1wTGVuOwotCQkJCVVDSEFSCUJST0FEQ09NWzRdID0gezB4MCwgMHg5MCwgMHg0YywgMHgzM307Ci0JCQkJSHRMZW4gPSBzaXplb2YocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5KTsKLQkJCQlBZGRIdExlbiA9IHNpemVvZihwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pOwotCQkJCU5ld0V4dExlbiA9IDE7Ci0JCQkJLy9OZXcgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0IElFIGlzIGluY2x1ZGVkIGluIEJlYWNvbiwgUHJvYmUgUnNwIG9yIGNoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBGcmFtZQotCQkJCWlmIChwQWQtPmJCcm9hZENvbUhUID09IFRSVUUpCi0JCQkJewotCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJldwYUllLAotCQkJCQkJCQkgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQlJPQURDT01bMF0sCi0JCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXBMZW4sCi0JCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAotCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCi0JCQkJCQkJCSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSksICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCi0JCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBZGRIdEluZm9JZSwKLQkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFkZEh0TGVuLAotCQkJCQkJCQkgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSwgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywKLQkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk5ld0V4dENoYW5JZSwKLQkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk5ld0V4dExlbiwKLQkJCQkJCQkJIHNpemVvZihORVdfRVhUX0NIQU5fSUUpLCAgICAgICAgICAmcEFkLT5Db21tb25DZmcuTmV3RXh0Q2hhbk9mZnNldCwKLQkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQkJfQotCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKLQkJCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQkJfQotCX0KLX0KLQotVk9JRCBCZWFjb25UaW1lb3V0QXRKb2luQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVU0hPUlQgU3RhdHVzOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBCZWFjb25UaW1lb3V0QXRKb2luQWN0aW9uXG4iKSk7Ci0JcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKLQlTdGF0dXMgPSBNTE1FX1JFSl9USU1FT1VUOwotCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9KT0lOX0NPTkYsIDIsICZTdGF0dXMpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVNjYW4gdGltZW91dCBwcm9jZWR1cmUuIGJhc2ljYWxseSBhZGQgY2hhbm5lbCBpbmRleCBieSAxIGFuZCByZXNjYW4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFNjYW5UaW1lb3V0QWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IE5leHRDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOwotCi0JLy8gT25seSBvbmUgY2hhbm5lbCBzY2FubmVkIGZvciBDSVNDTyBiZWFjb24gcmVxdWVzdAotCWlmICgocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQUNUSVZFKSB8fAotCQkocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fUEFTU0lWRSkgfHwKLQkJKHBBZC0+TWxtZUF1eC5TY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX05PSVNFKSB8fAotCQkocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEKSkKLQkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSAwOwotCi0JLy8gdGhpcyByb3V0aW5lIHdpbGwgc3RvcCBpZiBwQWQtPk1sbWVBdXguQ2hhbm5lbCA9PSAwCi0JU2Nhbk5leHRDaGFubmVsKHBBZCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEludmFsaWRTdGF0ZVdoZW5TY2FuKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVU0hPUlQgU3RhdHVzOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFZTkMgLSBJbnZhbGlkU3RhdGVXaGVuU2NhbihzdGF0ZT0lbGQpLiBSZXNldCBTWU5DIG1hY2hpbmVcbiIsIHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUpKTsKLQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOwotCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7Ci0JTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwgMiwgJlN0YXR1cyk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEludmFsaWRTdGF0ZVdoZW5Kb2luKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVU0hPUlQgU3RhdHVzOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkludmFsaWRTdGF0ZVdoZW5Kb2luKHN0YXRlPSVsZCkuIFJlc2V0IFNZTkMgbWFjaGluZVxuIiwgcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSkpOwotCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7Ci0JU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKLQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfSk9JTl9DT05GLCAyLCAmU3RhdHVzKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgSW52YWxpZFN0YXRlV2hlblN0YXJ0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVU0hPUlQgU3RhdHVzOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkludmFsaWRTdGF0ZVdoZW5TdGFydChzdGF0ZT0lbGQpLiBSZXNldCBTWU5DIG1hY2hpbmVcbiIsIHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUpKTsKLQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOwotCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7Ci0JTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NUQVJUX0NPTkYsIDIsICZTdGF0dXMpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgRW5xdWV1ZVBzUG9sbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLSNpZmRlZiBSQUxJTktfQVRFCi0gICAgaWYgKEFURV9PTihwQWQpKQotICAgIHsKLQkJcmV0dXJuOwotICAgIH0KLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLQotCWlmIChwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQKQotCXBBZC0+UHNQb2xsRnJhbWUuRkMuUHdyTWdtdCA9IFBXUl9TQVZFOwotCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgKFBVQ0hBUikmcEFkLT5Qc1BvbGxGcmFtZSwgc2l6ZW9mKFBTUE9MTF9GUkFNRSkpOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEVucXVldWVQcm9iZVJlcXVlc3QoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JTkRJU19TVEFUVVMgICAgIE5TdGF0ZTsKLQlQVUNIQVIgICAgICAgICAgcE91dEJ1ZmZlcjsKLQlVTE9ORyAgICAgICAgICAgRnJhbWVMZW4gPSAwOwotCUhFQURFUl84MDJfMTEgICBIZHI4MDIxMTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImZvcmNlIG91dCBhIFByb2JlUmVxdWVzdCAuLi5cbiIpKTsKLQotCU5TdGF0ZSA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZiAoTlN0YXRlID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLCBTVUJUWVBFX1BST0JFX1JFUSwgMCwgQlJPQURDQVNUX0FERFIsIEJST0FEQ0FTVF9BRERSKTsKLQotCQkvLyB0aGlzIFByb2JlUmVxdWVzdCBleHBsaWNpdGx5IHNwZWNpZnkgU1NJRCB0byByZWR1Y2UgdW53YW50ZWQgUHJvYmVSZXNwb25zZQotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAgICAgICAmSGRyODAyMTEsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKLQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuU3NpZExlbiwKLQkJCQkJCSAgcEFkLT5Db21tb25DZmcuU3NpZExlbiwJCSAgcEFkLT5Db21tb25DZmcuU3NpZCwKLQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAotCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLAotCQkJCQkJICBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLCAgICAgIHBBZC0+U3RhQWN0aXZlLlN1cFJhdGUsCi0JCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0JfQotCi19Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSNpZmRlZiBET1QxMU5fRFJBRlQzCi1WT0lEIEJ1aWxkRWZmZWN0ZWRDaGFubmVsTGlzdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlVQ0hBUgkJRUNoYW5uZWxbMTFdOwotCVVDSEFSCQlpLCBqLCBrOwotCVVDSEFSCQlVcHBlckNoYW5uZWwgPSAwLCBMb3dlckNoYW5uZWwgPSAwOwotCi0JUlRNUFplcm9NZW1vcnkoRUNoYW5uZWwsIDExKTsKLQlpID0gMDsKLQkvLyBGaW5kIHVwcGVyIGNoYW5uZWwgYW5kIGxvd2VyIGNoYW5uZWwuCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsIDwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQl7Ci0JCVVwcGVyQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7Ci0JCUxvd2VyQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsOwotCX0KLQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA+IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCi0JewotCQlVcHBlckNoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbDsKLQkJTG93ZXJDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKLQl9Ci0JZWxzZQotCXsKLQkJcmV0dXJuOwotCX0KLQotCS8vIFJlY29yZCBjaGFubmVscyB0aGF0IGlzIGJlbG93IGxvd2VyIGNoYW5uZWwuLgotCWlmIChMb3dlckNoYW5uZWwgPiAxKQotCXsKLQkJRUNoYW5uZWxbMF0gPSBMb3dlckNoYW5uZWwgLSAxOwotCQlpID0gMTsKLQkJaWYgKExvd2VyQ2hhbm5lbCA+IDIpCi0JCXsKLQkJCUVDaGFubmVsWzFdID0gTG93ZXJDaGFubmVsIC0gMjsKLQkJCWkgPSAyOwotCQkJaWYgKExvd2VyQ2hhbm5lbCA+IDMpCi0JCQl7Ci0JCQkJRUNoYW5uZWxbMl0gPSBMb3dlckNoYW5uZWwgLSAzOwotCQkJCWkgPSAzOwotCQkJfQotCQl9Ci0JfQotCS8vIFJlY29yZCBjaGFubmVscyB0aGF0IGlzIGJldHdlZW4gIGxvd2VyIGNoYW5uZWwgYW5kIHVwcGVyIGNoYW5uZWwuCi0JZm9yIChrID0gTG93ZXJDaGFubmVsO2sgPCBVcHBlckNoYW5uZWw7aysrKQotCXsKLQkJRUNoYW5uZWxbaV0gPSBrOwotCQlpKys7Ci0JfQotCS8vIFJlY29yZCBjaGFubmVscyB0aGF0IGlzIGFib3ZlIHVwcGVyIGNoYW5uZWwuLgotCWlmIChMb3dlckNoYW5uZWwgPCAxMSkKLQl7Ci0JCUVDaGFubmVsW2ldID0gVXBwZXJDaGFubmVsICsgMTsKLQkJaSsrOwotCQlpZiAoTG93ZXJDaGFubmVsIDwgMTApCi0JCXsKLQkJCUVDaGFubmVsW2ldID0gTG93ZXJDaGFubmVsICsgMjsKLQkJCWkrKzsKLQkJCWlmIChMb3dlckNoYW5uZWwgPCA5KQotCQkJewotCQkJCUVDaGFubmVsW2ldID0gTG93ZXJDaGFubmVsICsgMzsKLQkJCQlpKys7Ci0JCQl9Ci0JCX0KLQl9Ci0JLy8KLQlmb3IgKGogPSAwO2ogPCBpO2orKykKLQl7Ci0JCWZvciAoayA9IDA7ayA8IHBBZC0+Q2hhbm5lbExpc3ROdW07aysrKQotCQl7Ci0JCQlpZiAocEFkLT5DaGFubmVsTGlzdFtrXS5DaGFubmVsID09IEVDaGFubmVsW2pdKQotCQkJewotCQkJCXBBZC0+Q2hhbm5lbExpc3Rba10uYkVmZmVjdGVkQ2hhbm5lbCA9IFRSVUU7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIgRWZmZWN0ZWRDaGFubmVsKCA9JWQpXG4iLCBFQ2hhbm5lbFtqXSkpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotfQotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotQk9PTEVBTiBTY2FuUnVubmluZygKLQkJSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JcmV0dXJuIChwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID09IFNDQU5fTElTVEVOKSA/IFRSVUUgOiBGQUxTRTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhL3dwYS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvd3BhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYmRiYTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvd3BhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTYgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQl3cGEuYwotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUphbglMZWUJCTAzLTA3LTIyCQlJbml0aWFsCi0JUGF1bCBMaW4JMDMtMTEtMjgJCU1vZGlmeSBmb3Igc3VwcGxpY2FudAotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLXZvaWQgaW5jX2J5dGVfYXJyYXkoVUNIQVIgKmNvdW50ZXIsIGludCBsZW4pOwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUHJvY2VzcyBNSUMgZXJyb3IgaW5kaWNhdGlvbiBhbmQgcmVjb3JkIE1JQyBlcnJvciB0aW1lci4KLQotCUFyZ3VtZW50czoKLQkJcEFkCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcFdwYUtleQkJCVBvaW50ZXIgdG8gdGhlIFdQQSBrZXkgc3RydWN0dXJlCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUFJlcG9ydE1pY0Vycm9yKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBDSVBIRVJfS0VZCXBXcGFLZXkpCi17Ci0JVUxPTkcJTm93OwotICAgIFVDSEFSICAgdW5pY2FzdEtleSA9IChwV3BhS2V5LT5UeXBlID09IFBBSVJXSVNFX0tFWSA/IDE6MCk7Ci0KLQkvLyBSZWNvcmQgTGFzdCBNSUMgZXJyb3IgdGltZSBhbmQgY291bnQKLQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwotCWlmIChwQWQtPlN0YUNmZy5NaWNFcnJDbnQgPT0gMCkKLQl7Ci0JCXBBZC0+U3RhQ2ZnLk1pY0VyckNudCsrOwotCQlwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lID0gTm93OwotICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCA4KTsKLQl9Ci0JZWxzZSBpZiAocEFkLT5TdGFDZmcuTWljRXJyQ250ID09IDEpCi0JewotCQlpZiAoKHBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgKyAoNjAgKiBPU19IWikpIDwgTm93KQotCQl7Ci0JCQkvLyBVcGRhdGUgTGFzdCBNSUMgZXJyb3IgdGltZSwgdGhpcyBkaWQgbm90IHZpb2xhdGUgdHdvIE1JQyBlcnJvcnMgd2l0aGluIDYwIHNlY29uZHMKLQkJCXBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgPSBOb3c7Ci0JCX0KLQkJZWxzZQotCQl7Ci0KLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19DT1VOVEVSX01FQVNVUkVTX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7Ci0KLQkJCXBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgPSBOb3c7Ci0JCQkvLyBWaW9sYXRlIE1JQyBlcnJvciBjb3VudHMsIE1JQyBjb3VudGVybWVhc3VyZXMga2lja3MgaW4KLQkJCXBBZC0+U3RhQ2ZnLk1pY0VyckNudCsrOwotCQkJLy8gV2Ugc2hhbGwgYmxvY2sgYWxsIHJlY2VwdGlvbgotCQkJLy8gV2Ugc2hhbGwgY2xlYW4gYWxsIFR4IHJpbmcgYW5kIGRpc2Fzc29pY2F0ZSBmcm9tIEFQIGFmdGVyIG5leHQgRUFQT0wgZnJhbWUKLQkJCS8vCi0JCQkvLyBObyBuZWNlc3NhcnkgdG8gY2xlYW4gYWxsIFR4IHJpbmcsIG9uIFJUTVBIYXJkVHJhbnNtaXQgd2lsbCBzdG9wIHNlbmRpbmcgbm9uLTgwMi4xWCBFQVBPTCBwYWNrZXRzCi0JCQkvLyBpZiBwQWQtPlN0YUNmZy5NaWNFcnJDbnQgZ3JlYXRlciB0aGFuIDIuCi0JCQkvLwotCQkJLy8gUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JLKTsKLQkJCS8vIFJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CRSk7Ci0JCQkvLyBSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVkkpOwotCQkJLy8gUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZPKTsKLQkJCS8vIFJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9IQ0NBKTsKLQkJfQotCX0KLQllbHNlCi0JewotCQkvLyBNSUMgZXJyb3IgY291bnQgPj0gMgotCQkvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuCi0JCTsKLQl9Ci0gICAgTWxtZUVucXVldWUocEFkLAotCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAotCQkJCU9JRF84MDJfMTFfTUlDX0ZBSUxVUkVfUkVQT1JUX0ZSQU1FLAotCQkJCTEsCi0JCQkJJnVuaWNhc3RLZXkpOwotCi0gICAgaWYgKHBBZC0+U3RhQ2ZnLk1pY0VyckNudCA9PSAyKQotICAgIHsKLSAgICAgICAgUlRNUFNldFRpbWVyKCZwQWQtPlN0YUNmZy5XcGFEaXNhc3NvY0FuZEJsb2NrQXNzb2NUaW1lciwgMTAwKTsKLSAgICB9Ci19Ci0KLQotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSNkZWZpbmUJTEVOR1RIX0VBUF9IICAgIDQKLS8vIElmIHRoZSByZWNlaXZlZCBmcmFtZSBpcyBFQVAtUGFja2V0ICxmaW5kIG91dCBpdHMgRUFQLUNvZGUgKFJlcXVlc3QoMHgwMSksIFJlc3BvbnNlKDB4MDIpLCBTdWNjZXNzKDB4MDMpLCBGYWlsdXJlKDB4MDQpKS4KLUlOVAkgICAgV3BhQ2hlY2tFYXBDb2RlKAotCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gIFBVQ0hBUgkJCQlwRnJhbWUsCi0JSU4gIFVTSE9SVAkJCQlGcmFtZUxlbiwKLQlJTiAgVVNIT1JUCQkJCU9mZlNldCkKLXsKLQotCVBVQ0hBUglwRGF0YTsKLQlJTlQJcmVzdWx0ID0gMDsKLQotCWlmKCBGcmFtZUxlbiA8IE9mZlNldCArIExFTkdUSF9FQVBPTF9IICsgTEVOR1RIX0VBUF9IICkKLQkJcmV0dXJuIHJlc3VsdDsKLQotCXBEYXRhID0gcEZyYW1lICsgT2ZmU2V0OyAvLyBza2lwIG9mZnNldCBieXRlcwotCi0JaWYoKihwRGF0YSsxKSA9PSBFQVBQYWNrZXQpCS8vIDgwMi4xeCBoZWFkZXIgLSBQYWNrZXQgVHlwZQotCXsKLQkJIHJlc3VsdCA9ICoocERhdGErNCk7CQkvLyBFQVAgaGVhZGVyIC0gQ29kZQotCX0KLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLVZPSUQgICAgV3BhU2VuZE1pY0ZhaWx1cmVUb1dwYVN1cHBsaWNhbnQoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOICBCT09MRUFOICAgICAgICAgIGJVbmljYXN0KQotewotCWNoYXIgY3VzdG9tW0lXX0NVU1RPTV9NQVhdID0gezB9OwotCi0Jc3ByaW50ZihjdXN0b20sICJNTE1FLU1JQ0hBRUxNSUNGQUlMVVJFLmluZGljYXRpb24iKTsKLQlpZihiVW5pY2FzdCkKLQkJc3ByaW50ZihjdXN0b20sICIlcyB1bmljYXN0IiwgY3VzdG9tKTsKLQotCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgSVdFVkNVU1RPTSwgLTEsIE5VTEwsIChQVUNIQVIpY3VzdG9tLCBzdHJsZW4oY3VzdG9tKSk7Ci0KLQlyZXR1cm47Ci19Ci0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi1WT0lECVdwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JUFVDSEFSICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKLQlVTE9ORyAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKLQlFQVBPTF9QQUNLRVQgICAgICAgIFBhY2tldDsKLQlVQ0hBUiAgICAgICAgICAgICAgIE1pY1sxNl07Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICBiVW5pY2FzdDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZSAtLS0tLT5cbiIpKTsKLQotICAgIGJVbmljYXN0ID0gKEVsZW0tPk1zZ1swXSA9PSAxID8gVFJVRTpGQUxTRSk7Ci0JcEFkLT5TZXF1ZW5jZSA9ICgocEFkLT5TZXF1ZW5jZSkgKyAxKSAmIChNQVhfU0VRX05VTUJFUik7Ci0KLQkvLyBpbml0IDgwMi4zIGhlYWRlciBhbmQgRmlsbCBQYWNrZXQKLQlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVBUE9MKTsKLQotCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKLQlQYWNrZXQuUHJvVmVyCT0gRUFQT0xfVkVSOwotCVBhY2tldC5Qcm9UeXBlCT0gRUFQT0xLZXk7Ci0KLQlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMV9LRVlfREVTQzsKLQotICAgIC8vIFJlcXVlc3QgZmllbGQgcHJlc2VudGVkCi0gICAgUGFja2V0LktleURlc2MuS2V5SW5mby5SZXF1ZXN0ID0gMTsKLQotCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQl7Ci0JCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IDI7Ci0JfQotCWVsc2UJICAvLyBUS0lQCi0JewotCQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSAxOwotCX0KLQotICAgIFBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IChiVW5pY2FzdCA/IFBBSVJXSVNFS0VZIDogR1JPVVBLRVkpOwotCi0JLy8gS2V5TWljIGZpZWxkIHByZXNlbnRlZAotCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljICA9IDE7Ci0KLSAgICAvLyBFcnJvciBmaWVsZCBwcmVzZW50ZWQKLQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLkVycm9yICA9IDE7Ci0KLQkvLyBVcGRhdGUgcGFja2V0IGxlbmd0aCBhZnRlciBkZWNpZGUgS2V5IGRhdGEgcGF5bG9hZAotCVNFVF9VSU5UMTZfVE9fQVJSQVJZKFBhY2tldC5Cb2R5X0xlbiwgTEVOX0VBUE9MX0tFWV9NU0cpCi0KLQkvLyBLZXkgUmVwbGF5IENvdW50Ci0JTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0gICAgaW5jX2J5dGVfYXJyYXkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgOCk7Ci0KLQkvLyBDb252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgotCSooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSk7Ci0KLQotCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKLQlpZihwT3V0QnVmZmVyID09IE5VTEwpCi0JewotCQlyZXR1cm47Ci0JfQotCi0JLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCi0JLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJICAgICAgICAgICAgICBDT05WX0FSUkFSWV9UT19VSU5UMTYoUGFja2V0LkJvZHlfTGVuKSArIDQsICAgJlBhY2tldCwKLQkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7Ci0KLQkvLyBQcmVwYXJlIGFuZCBGaWxsIE1JQyB2YWx1ZQotCU5kaXNaZXJvTWVtb3J5KE1pYywgc2l6ZW9mKE1pYykpOwotCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQl7CS8vIEFFUwotICAgICAgICBVQ0hBUiBkaWdlc3RbMjBdID0gezB9OwotCQlITUFDX1NIQTEocEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBkaWdlc3QsIFNIQTFfRElHRVNUX1NJWkUpOwotCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7Ci0JfQotCWVsc2UKLQl7CS8vIFRLSVAKLQkJSE1BQ19NRDUocEFkLT5TdGFDZmcuUFRLLCAgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwgTWljLCBNRDVfRElHRVNUX1NJWkUpOwotCX0KLQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7Ci0KLQkvLyBjb3B5IGZyYW1lIHRvIFR4IHJpbmcgYW5kIHNlbmQgTUlDIGZhaWx1cmUgcmVwb3J0IGZyYW1lIHRvIGF1dGhlbnRpY2F0b3IKLQlSVE1QVG9XaXJlbGVzc1N0YShwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLAotCQkJCQkgIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsCi0JCQkJCSAgKFBVQ0hBUikmUGFja2V0LAotCQkJCQkgIENPTlZfQVJSQVJZX1RPX1VJTlQxNihQYWNrZXQuQm9keV9MZW4pICsgNCwgRkFMU0UpOwotCi0JTWxtZUZyZWVNZW1vcnkocEFkLCAoUFVDSEFSKXBPdXRCdWZmZXIpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhTWljRmFpbHVyZVJlcG9ydEZyYW1lIDwtLS0tLVxuIikpOwotfQotCi0vKiogZnJvbSB3cGFfc3VwcGxpY2FudAotICogaW5jX2J5dGVfYXJyYXkgLSBJbmNyZW1lbnQgYXJiaXRyYXJ5IGxlbmd0aCBieXRlIGFycmF5IGJ5IG9uZQotICogQGNvdW50ZXI6IFBvaW50ZXIgdG8gYnl0ZSBhcnJheQotICogQGxlbjogTGVuZ3RoIG9mIHRoZSBjb3VudGVyIGluIGJ5dGVzCi0gKgotICogVGhpcyBmdW5jdGlvbiBpbmNyZW1lbnRzIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIGNvdW50ZXIgYnkgb25lIGFuZCBjb250aW51ZXMKLSAqIHJvbGxpbmcgb3ZlciB0byBtb3JlIHNpZ25pZmljYW50IGJ5dGVzIGlmIHRoZSBieXRlIHdhcyBpbmNyZW1lbnRlZCBmcm9tCi0gKiAweGZmIHRvIDB4MDAuCi0gKi8KLXZvaWQgaW5jX2J5dGVfYXJyYXkoVUNIQVIgKmNvdW50ZXIsIGludCBsZW4pCi17Ci0JaW50IHBvcyA9IGxlbiAtIDE7Ci0Jd2hpbGUgKHBvcyA+PSAwKSB7Ci0JCWNvdW50ZXJbcG9zXSsrOwotCQlpZiAoY291bnRlcltwb3NdICE9IDApCi0JCQlicmVhazsKLQkJcG9zLS07Ci0JfQotfQotCi1WT0lEIFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLSAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKLXsKLSAgICBSVE1QX0FEQVBURVIgICAgICAgICAgICAgICAgKnBBZCA9IChQUlRNUF9BREFQVEVSKUZ1bmN0aW9uQ29udGV4dDsKLSAgICBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgICAgRGlzYXNzb2NSZXE7Ci0KLQkvLyBkaXNhc3NvYyBmcm9tIGN1cnJlbnQgQVAgZmlyc3QKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QUmVwb3J0TWljRXJyb3IgLSBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQIGFmdGVyIHNlbmRpbmcgc2Vjb25kIGNvbnRpbnVvdXMgRUFQT0wgZnJhbWVcbiIpKTsKLQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgUkVBU09OX01JQ19GQUlMVVJFKTsKLQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwgc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCksICZEaXNhc3NvY1JlcSk7Ci0KLQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0RJU0FTU09DOwotCXBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID0gVFJVRTsKLX0KLQotVk9JRCBXcGFTdGFQYWlyd2lzZUtleVNldHRpbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JUENJUEhFUl9LRVkgcFNoYXJlZEtleTsKLQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeTsKLQotCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOwotCi0JLy8gUGFpcndpc2Uga2V5IHNoYWxsIHVzZSBrZXkjMAotCXBTaGFyZWRLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF07Ci0KLQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QVEssIHBFbnRyeS0+UFRLLCBMRU5fUFRLKTsKLQotCS8vIFByZXBhcmUgcGFpci13aXNlIGtleSBpbmZvcm1hdGlvbiBpbnRvIHNoYXJlZCBrZXkgdGFibGUKLQlOZGlzWmVyb01lbW9yeShwU2hhcmVkS2V5LCBzaXplb2YoQ0lQSEVSX0tFWSkpOwotCXBTaGFyZWRLZXktPktleUxlbiA9IExFTl9US0lQX0VLOwotICAgIE5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPktleSwgJnBBZC0+U3RhQ2ZnLlBUS1szMl0sIExFTl9US0lQX0VLKTsKLQlOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OF0sIExFTl9US0lQX1JYTUlDSyk7Ci0JTmRpc01vdmVNZW1vcnkocFNoYXJlZEtleS0+VHhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDgrTEVOX1RLSVBfUlhNSUNLXSwgTEVOX1RLSVBfVFhNSUNLKTsKLQotCS8vIERlY2lkZSBpdHMgQ2hpcGVyQWxnCi0JaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLQkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7Ci0JZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCQlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOwotCWVsc2UKLQkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0KLQkvLyBVcGRhdGUgdGhlc2UgcmVsYXRlZCBpbmZvcm1hdGlvbiB0byBNQUNfVEFCTEVfRU5UUlkKLQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LktleSwgJnBBZC0+U3RhQ2ZnLlBUS1szMl0sIExFTl9US0lQX0VLKTsKLQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlJ4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4XSwgTEVOX1RLSVBfUlhNSUNLKTsKLQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlR4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4K0xFTl9US0lQX1JYTUlDS10sIExFTl9US0lQX1RYTUlDSyk7Ci0JcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBwU2hhcmVkS2V5LT5DaXBoZXJBbGc7Ci0KLQkvLyBVcGRhdGUgcGFpcndpc2Uga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQotCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCi0JCQkJCQkgIEJTUzAsCi0JCQkJCQkgIDAsCi0JCQkJCQkgIHBTaGFyZWRLZXktPkNpcGhlckFsZywKLQkJCQkJCSAgcFNoYXJlZEtleS0+S2V5LAotCQkJCQkJICBwU2hhcmVkS2V5LT5UeE1pYywKLQkJCQkJCSAgcFNoYXJlZEtleS0+UnhNaWMpOwotCi0JLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCi0JUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCi0JCQkJCQkJICBCU1MwLAotCQkJCQkJCSAgMCwKLQkJCQkJCQkgIHBTaGFyZWRLZXktPkNpcGhlckFsZywKLQkJCQkJCQkgIHBFbnRyeSk7Ci0JU1RBX1BPUlRfU0VDVVJFRChwQWQpOwotCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA6IEFJRCglZCkgcG9ydCBzZWN1cmVkXG4iLCBfX0ZVTkNUSU9OX18sIHBFbnRyeS0+QWlkKSk7Ci0KLX0KLQotVk9JRCBXcGFTdGFHcm91cEtleVNldHRpbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JUENJUEhFUl9LRVkJCXBTaGFyZWRLZXk7Ci0KLQlwU2hhcmVkS2V5ID0gJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF07Ci0KLQkvLyBQcmVwYXJlIHBhaXItd2lzZSBrZXkgaW5mb3JtYXRpb24gaW50byBzaGFyZWQga2V5IHRhYmxlCi0JTmRpc1plcm9NZW1vcnkocFNoYXJlZEtleSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKLQlwU2hhcmVkS2V5LT5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKLQlOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5LZXksIHBBZC0+U3RhQ2ZnLkdUSywgTEVOX1RLSVBfRUspOwotCU5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPlJ4TWljLCAmcEFkLT5TdGFDZmcuR1RLWzE2XSwgTEVOX1RLSVBfUlhNSUNLKTsKLQlOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5UeE1pYywgJnBBZC0+U3RhQ2ZnLkdUS1syNF0sIExFTl9US0lQX1RYTUlDSyk7Ci0KLQkvLyBVcGRhdGUgU2hhcmVkIEtleSBDaXBoZXJBbGcKLQlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQlpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLQkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7Ci0JZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKLQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQpCi0JCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkKQotCQlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotCi0JLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKLQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAotCQkJCQkJICBCU1MwLAotCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCi0JCQkJCQkgIHBTaGFyZWRLZXktPkNpcGhlckFsZywKLQkJCQkJCSAgcFNoYXJlZEtleS0+S2V5LAotCQkJCQkJICBwU2hhcmVkS2V5LT5UeE1pYywKLQkJCQkJCSAgcFNoYXJlZEtleS0+UnhNaWMpOwotCi0JLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCi0JUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCi0JCQkJCQkJICBCU1MwLAotCQkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAotCQkJCQkJCSAgcFNoYXJlZEtleS0+Q2lwaGVyQWxnLAotCQkJCQkJCSAgTlVMTCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhX2lvY3RsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YV9pb2N0bC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGFiODRhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhX2lvY3RsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NTU3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgc3RhX2lvY3RsLmMKLQotICAgIEFic3RyYWN0OgotICAgIElPQ1RMIHJlbGF0ZWQgc3Vicm91dGluZXMKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgUm9yeSBDaGVuICAgMDEtMDMtMjAwMyAgICBjcmVhdGVkCi0JUm9yeSBDaGVuICAgMDItMTQtMjAwNSAgICBtb2RpZnkgdG8gc3VwcG9ydCBSVDYxCi0qLwotCi0jaW5jbHVkZQkicnRfY29uZmlnLmgiCi0KLSNpZmRlZiBEQkcKLWV4dGVybiBVTE9ORyAgICBSVERlYnVnTGV2ZWw7Ci0jZW5kaWYKLQotI2RlZmluZSBOUl9XRVBfS0VZUwkJCQk0Ci0jZGVmaW5lIFdFUF9TTUFMTF9LRVlfTEVOCQkJKDQwLzgpCi0jZGVmaW5lIFdFUF9MQVJHRV9LRVlfTEVOCQkJKDEwNC84KQotCi0jZGVmaW5lIEdST1VQX0tFWV9OTyAgICAgICAgICAgICAgICA0Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KQotI2RlZmluZSBJV0VfU1RSRUFNX0FERF9FVkVOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9ldmVudChfQSwgX0IsIF9DLCBfRCwgX0UpCi0jZGVmaW5lIElXRV9TVFJFQU1fQUREX1BPSU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX3BvaW50KF9BLCBfQiwgX0MsIF9ELCBfRSkKLSNkZWZpbmUgSVdFX1NUUkVBTV9BRERfVkFMVUUoX0EsIF9CLCBfQywgX0QsIF9FLCBfRikJaXdlX3N0cmVhbV9hZGRfdmFsdWUoX0EsIF9CLCBfQywgX0QsIF9FLCBfRikKLSNlbHNlCi0jZGVmaW5lIElXRV9TVFJFQU1fQUREX0VWRU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX2V2ZW50KF9CLCBfQywgX0QsIF9FKQotI2RlZmluZSBJV0VfU1RSRUFNX0FERF9QT0lOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9wb2ludChfQiwgX0MsIF9ELCBfRSkKLSNkZWZpbmUgSVdFX1NUUkVBTV9BRERfVkFMVUUoX0EsIF9CLCBfQywgX0QsIF9FLCBfRikJaXdlX3N0cmVhbV9hZGRfdmFsdWUoX0IsIF9DLCBfRCwgX0UsIF9GKQotI2VuZGlmCi0KLWV4dGVybiBVQ0hBUiAgICBDaXBoZXJXcGEyVGVtcGxhdGVbXTsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SVF9WRVJTSU9OX0lORk97Ci0gICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblc7Ci0gICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblg7Ci0gICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblk7Ci0gICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblo7Ci0gICAgVUlOVCAgICAgICAgRHJpdmVyQnVpbGRZZWFyOwotICAgIFVJTlQgICAgICAgIERyaXZlckJ1aWxkTW9udGg7Ci0gICAgVUlOVCAgICAgICAgRHJpdmVyQnVpbGREYXk7Ci19IFJUX1ZFUlNJT05fSU5GTywgKlBSVF9WRVJTSU9OX0lORk87Ci0KLXN0cnVjdCBpd19wcml2X2FyZ3MgcHJpdnRhYltdID0gewoteyBSVFBSSVZfSU9DVExfU0VULAotICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIDAsCi0gICJzZXQifSwKLQoteyBSVFBSSVZfSU9DVExfU0hPVywgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAotICAiIn0sCi0vKiAtLS0gc3ViLWlvY3RscyBkZWZpbml0aW9ucyAtLS0gKi8KLSAgICB7IFNIT1dfQ09OTl9TVEFUVVMsCi0JICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJjb25uU3RhdHVzIiB9LAotCXsgU0hPV19EUlZJRVJfVkVSSU9OLAotCSAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiZHJpdmVyVmVyIiB9LAotICAgIHsgU0hPV19CQV9JTkZPLAotCSAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiYmFpbmZvIiB9LAotCXsgU0hPV19ERVNDX0lORk8sCi0JICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJkZXNjaW5mbyIgfSwKLSAgICB7IFJBSU9fT0ZGLAotCSAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAicmFkaW9fb2ZmIiB9LAotCXsgUkFJT19PTiwKLQkgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgInJhZGlvX29uIiB9LAotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCXsgU0hPV19ETFNfRU5UUllfSU5GTywKLQkgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImRsc2VudHJ5aW5mbyIgfSwKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQl7IFNIT1dfQ0ZHX1ZBTFVFLAotCSAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAic2hvdyIgfSwKLQl7IFNIT1dfQURIT0NfRU5UUllfSU5GTywKLQkgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImFkaG9jRW50cnkiIH0sCi0vKiAtLS0gc3ViLWlvY3RscyByZWxhdGlvbnMgLS0tICovCi0KLSNpZmRlZiBEQkcKLXsgUlRQUklWX0lPQ1RMX0JCUCwKLSAgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKLSAgImJicCJ9LAoteyBSVFBSSVZfSU9DVExfTUFDLAotICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwKLSAgIm1hYyJ9LAotI2lmZGVmIFJUTVBfUkZfUldfU1VQUE9SVAoteyBSVFBSSVZfSU9DVExfUkYsCi0gIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssCi0gICJyZiJ9LAotI2VuZGlmIC8vIFJUTVBfUkZfUldfU1VQUE9SVCAvLwoteyBSVFBSSVZfSU9DVExfRTJQLAotICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwKLSAgImUycCJ9LAotI2VuZGlmICAvKiBEQkcgKi8KLQoteyBSVFBSSVZfSU9DVExfU1RBVElTVElDUywKLSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKLSAgInN0YXQifSwKLXsgUlRQUklWX0lPQ1RMX0dTSVRFU1VSVkVZLAotICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsCi0gICJnZXRfc2l0ZV9zdXJ2ZXkifSwKLQotCi19OwotCi1zdGF0aWMgX19zMzIgcmFsaW5rcmF0ZVtdID0KLQl7MiwgIDQsICAgMTEsICAyMiwgLy8gQ0NLCi0JMTIsIDE4LCAgIDI0LCAgMzYsIDQ4LCA3MiwgOTYsIDEwOCwgLy8gT0ZETQotCTEzLCAyNiwgICAzOSwgIDUyLCAgNzgsIDEwNCwgMTE3LCAxMzAsIDI2LCAgNTIsICA3OCwgMTA0LCAxNTYsIDIwOCwgMjM0LCAyNjAsIC8vIDIwTUh6LCA4MDBucyBHSSwgTUNTOiAwIH4gMTUKLQkzOSwgNzgsICAxMTcsIDE1NiwgMjM0LCAzMTIsIDM1MSwgMzkwLAkJCQkJCQkJCQkgIC8vIDIwTUh6LCA4MDBucyBHSSwgTUNTOiAxNiB+IDIzCi0JMjcsIDU0LCAgIDgxLCAxMDgsIDE2MiwgMjE2LCAyNDMsIDI3MCwgNTQsIDEwOCwgMTYyLCAyMTYsIDMyNCwgNDMyLCA0ODYsIDU0MCwgLy8gNDBNSHosIDgwMG5zIEdJLCBNQ1M6IDAgfiAxNQotCTgxLCAxNjIsIDI0MywgMzI0LCA0ODYsIDY0OCwgNzI5LCA4MTAsCQkJCQkJCQkJCSAgLy8gNDBNSHosIDgwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKLQkxNCwgMjksICAgNDMsICA1NywgIDg3LCAxMTUsIDEzMCwgMTQ0LCAyOSwgNTksICAgODcsIDExNSwgMTczLCAyMzAsIDI2MCwgMjg4LCAvLyAyME1IeiwgNDAwbnMgR0ksIE1DUzogMCB+IDE1Ci0JNDMsIDg3LCAgMTMwLCAxNzMsIDI2MCwgMzE3LCAzOTAsIDQzMywJCQkJCQkJCQkJICAvLyAyME1IeiwgNDAwbnMgR0ksIE1DUzogMTYgfiAyMwotCTMwLCA2MCwgICA5MCwgMTIwLCAxODAsIDI0MCwgMjcwLCAzMDAsIDYwLCAxMjAsIDE4MCwgMjQwLCAzNjAsIDQ4MCwgNTQwLCA2MDAsIC8vIDQwTUh6LCA0MDBucyBHSSwgTUNTOiAwIH4gMTUKLQk5MCwgMTgwLCAyNzAsIDM2MCwgNTQwLCA3MjAsIDgxMCwgOTAwfTsKLQotCi0KLUlOVCBTZXRfU1NJRF9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBTVFJJTkcgICAgICAgICAgYXJnKTsKLQotI2lmZGVmIFdNTV9TVVBQT1JUCi1JTlQJU2V0X1dtbUNhcGFibGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLSNlbmRpZgotCi1JTlQgU2V0X05ldHdvcmtUeXBlX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpOwotCi1JTlQgU2V0X0F1dGhNb2RlX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpOwotCi1JTlQgU2V0X0VuY3J5cFR5cGVfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQU1RSSU5HICAgICAgICAgIGFyZyk7Ci0KLUlOVCBTZXRfRGVmYXVsdEtleUlEX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpOwotCi1JTlQgU2V0X0tleTFfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQU1RSSU5HICAgICAgICAgIGFyZyk7Ci0KLUlOVCBTZXRfS2V5Ml9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBTVFJJTkcgICAgICAgICAgYXJnKTsKLQotSU5UIFNldF9LZXkzX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpOwotCi1JTlQgU2V0X0tleTRfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQU1RSSU5HICAgICAgICAgIGFyZyk7Ci0KLUlOVCBTZXRfV1BBUFNLX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpOwotCi0KLUlOVCBTZXRfUFNNb2RlX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpOwotCi0jaWZkZWYgUlQzMDkwCi1JTlQgU2V0X1BDSWVQU0xldmVsX1Byb2MoCi1JTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOwotI2VuZGlmIC8vIFJUMzA5MCAvLwotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLUlOVCBTZXRfV3BhX1N1cHBvcnQoCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0jaWZkZWYgREJHCi0KLVZPSUQgUlRNUElvY3RsTUFDKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEpOwotCi1WT0lEIFJUTVBJb2N0bEUyUFJPTSgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBzdHJ1Y3QgaXdyZXEgICAgKndycSk7Ci0jZW5kaWYgLy8gREJHIC8vCi0KLQotTkRJU19TVEFUVVMgUlRNUFdQQU5vbmVBZGRLZXlQcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOCVBWT0lECQkJcEJ1Zik7Ci0KLUlOVCBTZXRfRnJhZ1Rlc3RfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQU1RSSU5HICAgICAgICAgIGFyZyk7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLUlOVCBTZXRfVEduV2lmaVRlc3RfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1JTlQgU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9TaG9ydFJldHJ5TGltaXRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi0jaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAotSU5UIFNldF9JZWVlODAyMTFkQ2xpZW50TW9kZV9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBTVFJJTkcgICAgICAgICAgYXJnKTsKLSNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCi0KLSNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCi1JTlQgU2V0X0NhcnJpZXJEZXRlY3RfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpOwotI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KLQotSU5UCVNob3dfQWRob2NfTWFjVGFibGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJZXh0cmEpOwotCi0jaWZkZWYgUlRNUF9SRl9SV19TVVBQT1JUCi1WT0lEIFJUTVBJb2N0bFJGKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEpOwotI2VuZGlmIC8vIFJUTVBfUkZfUldfU1VQUE9SVCAvLwotCi0KLUlOVCBTZXRfQmVhY29uTG9zdFRpbWVfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFNUUklORyAgICAgICAgIGFyZyk7Ci0KLUlOVCBTZXRfQXV0b1JvYW1pbmdfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFNUUklORyAgICAgICAgIGFyZyk7Ci0KLUlOVCBTZXRfU2l0ZVN1cnZleV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQgU2V0X0ZvcmNlVHhCdXJzdF9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQU1RSSU5HICAgICAgICAgYXJnKTsKLQotI2lmZGVmIEFOVF9ESVZFUlNJVFlfU1VQUE9SVAotSU5UCVNldF9BbnRlbm5hX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLSNlbmRpZiAvLyBBTlRfRElWRVJTSVRZX1NVUFBPUlQgLy8KLQotc3RhdGljIHN0cnVjdCB7Ci0JUFNUUklORyBuYW1lOwotCUlOVCAoKnNldF9wcm9jKShQUlRNUF9BREFQVEVSIHBBZGFwdGVyLCBQU1RSSU5HIGFyZyk7Ci19ICpQUlRNUF9QUklWQVRFX1NFVF9QUk9DLCBSVE1QX1BSSVZBVEVfU1VQUE9SVF9QUk9DW10gPSB7Ci0JeyJEcml2ZXJWZXJzaW9uIiwJCQkJU2V0X0RyaXZlclZlcnNpb25fUHJvY30sCi0JeyJDb3VudHJ5UmVnaW9uIiwJCQkJU2V0X0NvdW50cnlSZWdpb25fUHJvY30sCi0JeyJDb3VudHJ5UmVnaW9uQUJhbmQiLAkJCVNldF9Db3VudHJ5UmVnaW9uQUJhbmRfUHJvY30sCi0JeyJTU0lEIiwJCQkJCQlTZXRfU1NJRF9Qcm9jfSwKLQl7IldpcmVsZXNzTW9kZSIsCQkJCVNldF9XaXJlbGVzc01vZGVfUHJvY30sCi0JeyJUeEJ1cnN0IiwJCQkJCVNldF9UeEJ1cnN0X1Byb2N9LAotCXsiVHhQcmVhbWJsZSIsCQkJCVNldF9UeFByZWFtYmxlX1Byb2N9LAotCXsiVHhQb3dlciIsCQkJCQlTZXRfVHhQb3dlcl9Qcm9jfSwKLQl7IkNoYW5uZWwiLAkJCQkJU2V0X0NoYW5uZWxfUHJvY30sCi0JeyJCR1Byb3RlY3Rpb24iLAkJCQlTZXRfQkdQcm90ZWN0aW9uX1Byb2N9LAotCXsiUlRTVGhyZXNob2xkIiwJCQkJU2V0X1JUU1RocmVzaG9sZF9Qcm9jfSwKLQl7IkZyYWdUaHJlc2hvbGQiLAkJCQlTZXRfRnJhZ1RocmVzaG9sZF9Qcm9jfSwKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQl7Ikh0QnciLAkJICAgICAgICAgICAgICAgIFNldF9IdEJ3X1Byb2N9LAotCXsiSHRNY3MiLAkJICAgICAgICAgICAgICAgIFNldF9IdE1jc19Qcm9jfSwKLQl7Ikh0R2kiLAkJICAgICAgICAgICAgICAgIFNldF9IdEdpX1Byb2N9LAotCXsiSHRPcE1vZGUiLAkJICAgICAgICAgICAgU2V0X0h0T3BNb2RlX1Byb2N9LAotCXsiSHRFeHRjaGEiLAkJICAgICAgICAgICAgU2V0X0h0RXh0Y2hhX1Byb2N9LAotCXsiSHRNcGR1RGVuc2l0eSIsCQkgICAgICAgIFNldF9IdE1wZHVEZW5zaXR5X1Byb2N9LAotCXsiSHRCYVdpblNpemUiLAkJCQlTZXRfSHRCYVdpblNpemVfUHJvY30sCi0JeyJIdFJkZyIsCQkJCQlTZXRfSHRSZGdfUHJvY30sCi0JeyJIdEFtc2R1IiwJCQkJCVNldF9IdEFtc2R1X1Byb2N9LAotCXsiSHRBdXRvQmEiLAkJCQlTZXRfSHRBdXRvQmFfUHJvY30sCi0JeyJIdEJhRGVjbGluZSIsCQkJCQlTZXRfQkFEZWNsaW5lX1Byb2N9LAotCXsiSHRQcm90ZWN0IiwJCQkJU2V0X0h0UHJvdGVjdF9Qcm9jfSwKLQl7Ikh0TWltb1BzIiwJCQkJU2V0X0h0TWltb1BzX1Byb2N9LAotCXsiSHREaXNhbGxvd1RLSVAiLAkJCQlTZXRfSHREaXNhbGxvd1RLSVBfUHJvY30sCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLSNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCi0JeyJQa3RBZ2dyZWdhdGUiLAkJCQlTZXRfUGt0QWdncmVnYXRlX1Byb2N9LAotI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KLQotI2lmZGVmIFdNTV9TVVBQT1JUCi0JeyJXbW1DYXBhYmxlIiwJCQkJCVNldF9XbW1DYXBhYmxlX1Byb2N9LAotI2VuZGlmCi0JeyJJRUVFODAyMTFIIiwJCQkJCVNldF9JRUVFODAyMTFIX1Byb2N9LAotICAgIHsiTmV0d29ya1R5cGUiLCAgICAgICAgICAgICAgICAgU2V0X05ldHdvcmtUeXBlX1Byb2N9LAotCXsiQXV0aE1vZGUiLAkJCQkJU2V0X0F1dGhNb2RlX1Byb2N9LAotCXsiRW5jcnlwVHlwZSIsCQkJCQlTZXRfRW5jcnlwVHlwZV9Qcm9jfSwKLQl7IkRlZmF1bHRLZXlJRCIsCQkJCVNldF9EZWZhdWx0S2V5SURfUHJvY30sCi0JeyJLZXkxIiwJCQkJCQlTZXRfS2V5MV9Qcm9jfSwKLQl7IktleTIiLAkJCQkJCVNldF9LZXkyX1Byb2N9LAotCXsiS2V5MyIsCQkJCQkJU2V0X0tleTNfUHJvY30sCi0JeyJLZXk0IiwJCQkJCQlTZXRfS2V5NF9Qcm9jfSwKLQl7IldQQVBTSyIsCQkJCQkJU2V0X1dQQVBTS19Qcm9jfSwKLQl7IlJlc2V0Q291bnRlciIsCQkJCVNldF9SZXNldFN0YXRDb3VudGVyX1Byb2N9LAotCXsiUFNNb2RlIiwgICAgICAgICAgICAgICAgICAgICAgU2V0X1BTTW9kZV9Qcm9jfSwKLSNpZmRlZiBEQkcKLQl7IkRlYnVnIiwJCQkJCQlTZXRfRGVidWdfUHJvY30sCi0jZW5kaWYgLy8gREJHIC8vCi0KLSNpZmRlZiBSQUxJTktfQVRFCi0JeyJBVEUiLAkJCQkJCQlTZXRfQVRFX1Byb2N9LAotCXsiQVRFREEiLAkJCQkJCVNldF9BVEVfREFfUHJvY30sCi0JeyJBVEVTQSIsCQkJCQkJU2V0X0FURV9TQV9Qcm9jfSwKLQl7IkFURUJTU0lEIiwJCQkJCVNldF9BVEVfQlNTSURfUHJvY30sCi0JeyJBVEVDSEFOTkVMIiwJCQkJCVNldF9BVEVfQ0hBTk5FTF9Qcm9jfSwKLQl7IkFURVRYUE9XMCIsCQkJCQlTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jfSwKLQl7IkFURVRYUE9XMSIsCQkJCQlTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jfSwKLQl7IkFURVRYQU5UIiwJCQkJCVNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jfSwKLQl7IkFURVJYQU5UIiwJCQkJCVNldF9BVEVfUlhfQW50ZW5uYV9Qcm9jfSwKLQl7IkFURVRYRlJFUU9GRlNFVCIsCQkJCVNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jfSwKLQl7IkFURVRYQlciLAkJCQkJCVNldF9BVEVfVFhfQldfUHJvY30sCi0JeyJBVEVUWExFTiIsCQkJCQlTZXRfQVRFX1RYX0xFTkdUSF9Qcm9jfSwKLQl7IkFURVRYQ05UIiwJCQkJCVNldF9BVEVfVFhfQ09VTlRfUHJvY30sCi0JeyJBVEVUWE1DUyIsCQkJCQlTZXRfQVRFX1RYX01DU19Qcm9jfSwKLQl7IkFURVRYTU9ERSIsCQkJCQlTZXRfQVRFX1RYX01PREVfUHJvY30sCi0JeyJBVEVUWEdJIiwJCQkJCQlTZXRfQVRFX1RYX0dJX1Byb2N9LAotCXsiQVRFUlhGRVIiLAkJCQkJU2V0X0FURV9SWF9GRVJfUHJvY30sCi0JeyJBVEVSUkYiLAkJCQkJCVNldF9BVEVfUmVhZF9SRl9Qcm9jfSwKLQl7IkFURVdSRjEiLAkJCQkJCVNldF9BVEVfV3JpdGVfUkYxX1Byb2N9LAotCXsiQVRFV1JGMiIsCQkJCQkJU2V0X0FURV9Xcml0ZV9SRjJfUHJvY30sCi0JeyJBVEVXUkYzIiwJCQkJCQlTZXRfQVRFX1dyaXRlX1JGM19Qcm9jfSwKLQl7IkFURVdSRjQiLAkJCQkJCVNldF9BVEVfV3JpdGVfUkY0X1Byb2N9LAotCXsiQVRFTERFMlAiLAkJCQkgICAgU2V0X0FURV9Mb2FkX0UyUF9Qcm9jfSwKLQl7IkFURVJFMlAiLAkJCQkJCVNldF9BVEVfUmVhZF9FMlBfUHJvY30sCi0JeyJBVEVTSE9XIiwJCQkJCQlTZXRfQVRFX1Nob3dfUHJvY30sCi0JeyJBVEVIRUxQIiwJCQkJCQlTZXRfQVRFX0hlbHBfUHJvY30sCi0KLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotCXsiVHhTdG9wIiwJCQkJCQlTZXRfVHhTdG9wX1Byb2N9LAotCXsiUnhTdG9wIiwJCQkJCQlTZXRfUnhTdG9wX1Byb2N9LAotI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCi0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgIHsiV3BhU3VwcG9ydCIsICAgICAgICAgICAgICAgICAgU2V0X1dwYV9TdXBwb3J0fSwKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLQotCi0KLQotCXsiRml4ZWRUeE1vZGUiLCAgICAgICAgICAgICAgICAgU2V0X0ZpeGVkVHhNb2RlX1Byb2N9LAotI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCi0JeyJPcE1vZGUiLAkJCQkJCVNldF9PcE1vZGVfUHJvY30sCi0jZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSAgICB7IlRHbldpZmlUZXN0IiwgICAgICAgICAgICAgICAgIFNldF9UR25XaWZpVGVzdF9Qcm9jfSwKLSAgICB7IkZvcmNlR0YiLAkJCQkJU2V0X0ZvcmNlR0ZfUHJvY30sCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JeyJEbHNBZGRFbnRyeSIsCQkJCQlTZXRfRGxzQWRkRW50cnlfUHJvY30sCi0JeyJEbHNUZWFyRG93bkVudHJ5IiwJCQlTZXRfRGxzVGVhckRvd25FbnRyeV9Qcm9jfSwKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQl7IkxvbmdSZXRyeSIsCQkJCVNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jfSwKLQl7IlNob3J0UmV0cnkiLAkJCQlTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2N9LAotI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKLQl7IjExZENsaWVudE1vZGUiLAkJCQlTZXRfSWVlZTgwMjExZENsaWVudE1vZGVfUHJvY30sCi0jZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLwotI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKLQl7IkNhcnJpZXJEZXRlY3QiLAkJCQlTZXRfQ2FycmllckRldGVjdF9Qcm9jfSwKLSNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCi0KLQotLy8yMDA4LzA5LzExOktIIGFkZCB0byBzdXBwb3J0IGVmdXNlPC0tCi0jaWZkZWYgUlQzMHh4Ci0jaWZkZWYgUlRNUF9FRlVTRV9TVVBQT1JUCi0JeyJlZnVzZUZyZWVOdW1iZXIiLAkJCQlzZXRfZUZ1c2VHZXRGcmVlQmxvY2tDb3VudF9Qcm9jfSwKLQl7ImVmdXNlRHVtcCIsCQkJCQlzZXRfZUZ1c2VkdW1wX1Byb2N9LAotCXsiZWZ1c2VMb2FkRnJvbUJpbiIsCQkJCXNldF9lRnVzZUxvYWRGcm9tQmluX1Byb2N9LAotCXsiZWZ1c2VCdWZmZXJNb2RlV3JpdGVCYWNrIiwJCXNldF9lRnVzZUJ1ZmZlck1vZGVXcml0ZUJhY2tfUHJvY30sCi0jZW5kaWYgLy8gUlRNUF9FRlVTRV9TVVBQT1JUIC8vCi0jaWZkZWYgQU5UX0RJVkVSU0lUWV9TVVBQT1JUCi0JeyJhbnQiLAkJCQkJU2V0X0FudGVubmFfUHJvY30sCi0jZW5kaWYgLy8gQU5UX0RJVkVSU0lUWV9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gUlQzMHh4IC8vCi0vLzIwMDgvMDkvMTE6S0ggYWRkIHRvIHN1cHBvcnQgZWZ1c2UtLT4KLQotCXsiQmVhY29uTG9zdFRpbWUiLAkJCQlTZXRfQmVhY29uTG9zdFRpbWVfUHJvY30sCi0JeyJBdXRvUm9hbWluZyIsCQkJCQlTZXRfQXV0b1JvYW1pbmdfUHJvY30sCi0JeyJTaXRlU3VydmV5IiwJCQkJCVNldF9TaXRlU3VydmV5X1Byb2N9LAotCXsiRm9yY2VUeEJ1cnN0IiwJCQkJU2V0X0ZvcmNlVHhCdXJzdF9Qcm9jfSwKLQotCXtOVUxMLH0KLX07Ci0KLQotVk9JRCBSVE1QQWRkS2V5KAotCUlOCVBSVE1QX0FEQVBURVIJICAgIHBBZCwKLQlJTglQTkRJU184MDJfMTFfS0VZICAgIHBLZXkpCi17Ci0JVUxPTkcJCQkJS2V5SWR4OwotCU1BQ19UQUJMRV9FTlRSWQkJKnBFbnRyeTsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBBZGRLZXkgLS0tLS0tPlxuIikpOwotCi0JaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLQl7Ci0JCWlmIChwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCi0JCXsKLQkJICAgIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywgMzIpOwotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywgcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgICAgICB9Ci0JCSAgICAvLyBVcGRhdGUgUFRLCi0JCSAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0sIHNpemVvZihDSVBIRVJfS0VZKSk7Ci0gICAgICAgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgcEtleS0+S2V5TWF0ZXJpYWwsIExFTl9US0lQX0VLKTsKLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0gICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOwotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLSAgICAgICAgICAgIHsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIERlY2lkZSBpdHMgQ2hpcGVyQWxnCi0JCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCi0JCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKLQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKLQkJZWxzZQotCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0KLSAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGVzZSByZWxhdGVkIGluZm9ybWF0aW9uIHRvIE1BQ19UQUJMRV9FTlRSWQotCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LCBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIExFTl9US0lQX0VLKTsKLQkJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5SeE1pYywgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsIExFTl9US0lQX1JYTUlDSyk7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuVHhNaWMsIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCBMRU5fVEtJUF9UWE1JQ0spOwotCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZzsKLQotCQkvLyBVcGRhdGUgcGFpcndpc2Uga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQotCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAotCQkJCQkJCSAgQlNTMCwKLQkJCQkJCQkgIDAsCi0JCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCi0JCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCi0JCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKLQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljKTsKLQotCQkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKLQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCi0JCQkJCQkJCSAgQlNTMCwKLQkJCQkJCQkJICAwLAotCQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKLQkJCQkJCQkJICBwRW50cnkpOwotCi0gICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAotCSAgICAgICAgICAgIC8vcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQotICAgICAgICAgICAgICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0gICAgICAgICAgICB9Ci0JCX0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBVcGRhdGUgR1RLCi0gICAgICAgICAgICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAocEtleS0+S2V5SW5kZXggJiAweEZGKTsKLSAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOwotICAgICAgICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBwS2V5LT5LZXlNYXRlcmlhbCwgTEVOX1RLSVBfRUspOwotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0gICAgICAgICAgICB7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVXBkYXRlIFNoYXJlZCBLZXkgQ2lwaGVyQWxnCi0JCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0JCWlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQotCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKLQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKLQotICAgICAgICAgICAgLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKLQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKLQkJCQkJCQkgIEJTUzAsCi0JCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCi0JCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKLQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LAotCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywKLQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMpOwotCi0JCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQotCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKLQkJCQkJCQkJICBCU1MwLAotCQkJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKLQkJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKLQkJCQkJCQkJICBOVUxMKTsKLQotICAgICAgICAgICAgLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKLQkgICAgICAgIC8vcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKLQotICAgICAgICAgICAgLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKLSAgICAgICAgICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0gICAgICAgIH0KLQl9Ci0JZWxzZQkvLyBkeW5hbWljIFdFUCBmcm9tIHdwYV9zdXBwbGljYW50Ci0JewotCQlVQ0hBUglDaXBoZXJBbGc7Ci0JUFVDSEFSCUtleTsKLQotCQlpZihwS2V5LT5LZXlMZW5ndGggPT0gMzIpCi0JCQlnb3RvIGVuZDsKLQotCQlLZXlJZHggPSBwS2V5LT5LZXlJbmRleCAmIDB4MGZmZmZmZmY7Ci0KLQkJaWYgKEtleUlkeCA8IDQpCi0JCXsKLQkJCS8vIGl0IGlzIGEgZGVmYXVsdCBzaGFyZWQga2V5LCBmb3IgUGFpcndpc2Uga2V5IHNldHRpbmcKLQkJCWlmIChwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCi0JCQl7Ci0JCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwS2V5LT5CU1NJRCk7Ci0KLQkJCQlpZiAocEVudHJ5KQotCQkJCXsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUEFkZEtleTogU2V0IFBhaXItd2lzZSBLZXlcbiIpKTsKLQotCQkJCQkvLyBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoCi0JCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuS2V5TGVuID0gKFVDSEFSKXBLZXktPktleUxlbmd0aDsKLQkJCQkJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKLQotCQkJCQkvLyBzZXQgQ2lwaGVyIHR5cGUKLQkJCQkJaWYgKHBLZXktPktleUxlbmd0aCA9PSA1KQotCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0JCQkJCWVsc2UKLQkJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLQotCQkJCQkvLyBBZGQgUGFpci13aXNlIGtleSB0byBBc2ljCi0JCQkJCUFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KAotCQkJCQkJcEFkLAotCQkJCQkJcEVudHJ5LT5BZGRyLAotCQkJCQkJKFVDSEFSKXBFbnRyeS0+QWlkLAotCQkJCSZwRW50cnktPlBhaXJ3aXNlS2V5KTsKLQotCQkJCQkvLyB1cGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGVudHJ5Ci0JCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkoCi0JCQkJCQlwQWQsCi0JCQkJCQlCU1MwLAotCQkJCQkJS2V5SWR4LCAvLyBUaGUgdmFsdWUgbWF5IGJlIG5vdCB6ZXJvCi0JCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZywKLQkJCQkJCXBFbnRyeSk7Ci0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0gICAgICAgICAgICB7Ci0JCQkJLy8gRGVmYXVsdCBrZXkgZm9yIHR4IChzaGFyZWQga2V5KQotCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgS2V5SWR4OwotCi0JCQkJLy8gc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aAotCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gKFVDSEFSKSBwS2V5LT5LZXlMZW5ndGg7Ci0JCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKLQotCQkJCS8vIFNldCBDaXBlciB0eXBlCi0JCQkJaWYgKHBLZXktPktleUxlbmd0aCA9PSA1KQotCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLQkJCQllbHNlCi0JCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLQotCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc7Ci0JCQlLZXkgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleTsKLQotCQkJCS8vIFNldCBHcm91cCBrZXkgbWF0ZXJpYWwgdG8gQXNpYwotCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIEtleSwgTlVMTCwgTlVMTCk7Ci0KLQkJCQkvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGdyb3VwIGtleSB0YWJsZQotCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgTlVMTCk7Ci0KLQkJCX0KLQkJfQotCX0KLWVuZDoKLQlyZXR1cm47Ci19Ci0KLWNoYXIgKiBydHN0cmNocihjb25zdCBjaGFyICogcywgaW50IGMpCi17Ci0gICAgZm9yKDsgKnMgIT0gKGNoYXIpIGM7ICsrcykKLSAgICAgICAgaWYgKCpzID09ICdcMCcpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gKGNoYXIgKikgczsKLX0KLQotLyoKLVRoaXMgaXMgcmVxdWlyZWQgZm9yIExpbkVYMjAwNC9rZXJuZWwyLjYuNyB0byBwcm92aWRlIGl3bGlzdCBzY2FubmluZyBmdW5jdGlvbgotKi8KLQotaW50Ci1ydF9pb2N0bF9naXduYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCSAgIGNoYXIgKm5hbWUsIGNoYXIgKmV4dHJhKQotewotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0gICAgc3RybmNweShuYW1lLCAiUlQyODYwIFdpcmVsZXNzIiwgSUZOQU1TSVopOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCXJldHVybiAwOwotfQotCi1pbnQgcnRfaW9jdGxfc2l3ZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCXN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQlpbnQJY2hhbiA9IC0xOwotCi0gICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLSAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0gICAgICAgIHJldHVybiAtRU5FVERPV047Ci0gICAgfQotCi0KLQlpZiAoZnJlcS0+ZSA+IDEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYoKGZyZXEtPmUgPT0gMCkgJiYgKGZyZXEtPm0gPD0gMTAwMCkpCi0JCWNoYW4gPSBmcmVxLT5tOwkvLyBTZXR0aW5nIGJ5IGNoYW5uZWwgbnVtYmVyCi0JZWxzZQotCQlNQVBfS0haX1RPX0NIQU5ORUxfSUQoIChmcmVxLT5tIC8xMDApICwgY2hhbik7IC8vIFNldHRpbmcgYnkgZnJlcXVlbmN5IC0gc2VhcmNoIHRoZSB0YWJsZSAsIGxpa2UgMi40MTJHLCAyLjQyMkcsCi0KLSAgICBpZiAoQ2hhbm5lbFNhbml0eShwQWRhcHRlciwgY2hhbikgPT0gVFJVRSkKLSAgICB7Ci0JcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsID0gY2hhbjsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI9PT5ydF9pb2N0bF9zaXdmcmVxOjpTSU9DU0lXRlJFUVtjbWQ9MHgleF0gKENoYW5uZWw9JWQpXG4iLCBTSU9DU0lXRlJFUSwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1pbnQgcnRfaW9jdGxfZ2l3ZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkgICBzdHJ1Y3QgaXdfZnJlcSAqZnJlcSwgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IE5VTEw7Ci0JVUNIQVIgY2g7Ci0JVUxPTkcJbSA9IDI0MTIwMDA7Ci0KLQlwQWRhcHRlciA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0JaWYgKHBBZGFwdGVyID09IE5VTEwpCi0JewotCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOwotCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KLQkJcmV0dXJuIC1FTkVURE9XTjsKLQl9Ci0KLQkJY2ggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWw7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIj09PnJ0X2lvY3RsX2dpd2ZyZXEgICVkXG4iLCBjaCkpOwotCi0JTUFQX0NIQU5ORUxfSURfVE9fS0haKGNoLCBtKTsKLQlmcmVxLT5tID0gbSAqIDEwMDsKLQlmcmVxLT5lID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotCi1pbnQgcnRfaW9jdGxfc2l3bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkgICBfX3UzMiAqbW9kZSwgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0KLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLSAgICB7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotCXJldHVybiAtRU5FVERPV047Ci0gICAgfQotCi0Jc3dpdGNoICgqbW9kZSkKLQl7Ci0JCWNhc2UgSVdfTU9ERV9BREhPQzoKLQkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiQWRob2MiKTsKLQkJCWJyZWFrOwotCQljYXNlIElXX01PREVfSU5GUkE6Ci0JCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIkluZnJhIik7Ci0JCQlicmVhazsKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw0LDIwKSkKLSAgICAgICAgY2FzZSBJV19NT0RFX01PTklUT1I6Ci0JCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIk1vbml0b3IiKTsKLQkJCWJyZWFrOwotI2VuZGlmCi0JCWRlZmF1bHQ6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+cnRfaW9jdGxfc2l3bW9kZTo6U0lPQ1NJV01PREUgKHVua25vd24gJWQpXG4iLCAqbW9kZSkpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLy8gUmVzZXQgUmFsaW5rIHN1cHBsaWNhbnQgdG8gbm90IHVzZSwgaXQgd2lsbCBiZSBzZXQgdG8gc3RhcnQgd2hlbiBVSSBzZXQgUE1LIGtleQotCXBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1pbnQgcnRfaW9jdGxfZ2l3bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkgICBfX3UzMiAqbW9kZSwgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0KLQlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKLQl7Ci0JCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7Ci0JCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLwotCQlyZXR1cm4gLUVORVRET1dOOwotCX0KLQotCWlmIChBREhPQ19PTihwQWRhcHRlcikpCi0JCSptb2RlID0gSVdfTU9ERV9BREhPQzsKLSAgICBlbHNlIGlmIChJTkZSQV9PTihwQWRhcHRlcikpCi0JCSptb2RlID0gSVdfTU9ERV9JTkZSQTsKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw0LDIwKSkKLSAgICBlbHNlIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKLSAgICB7Ci0gICAgICAgICptb2RlID0gSVdfTU9ERV9NT05JVE9SOwotICAgIH0KLSNlbmRpZgotICAgIGVsc2UKLSAgICAgICAgKm1vZGUgPSBJV19NT0RFX0FVVE87Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT5ydF9pb2N0bF9naXdtb2RlKG1vZGU9JWQpXG4iLCAqbW9kZSkpOwotCXJldHVybiAwOwotfQotCi1pbnQgcnRfaW9jdGxfc2l3c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkgICBjaGFyICpuYW1lLCBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQotCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0JaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotCQlyZXR1cm4gLUVORVRET1dOOwotCX0KLQotCXJldHVybiAwOwotfQotCi1pbnQgcnRfaW9jdGxfZ2l3c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkgICBjaGFyICpuYW1lLCBjaGFyICpleHRyYSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHJ0X2lvY3RsX2dpd3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCSAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0Jc3RydWN0IGl3X3JhbmdlICpyYW5nZSA9IChzdHJ1Y3QgaXdfcmFuZ2UgKikgZXh0cmE7Ci0JdTE2IHZhbDsKLQlpbnQgaTsKLQotCWlmIChwQWRhcHRlciA9PSBOVUxMKQotCXsKLQkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKLQkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCi0JCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PnJ0X2lvY3RsX2dpd3JhbmdlXG4iKSk7Ci0JZGF0YS0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSk7Ci0JbWVtc2V0KHJhbmdlLCAwLCBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSk7Ci0KLQlyYW5nZS0+dHhwb3dlcl9jYXBhID0gSVdfVFhQT1dfREJNOwotCi0JaWYgKElORlJBX09OKHBBZGFwdGVyKXx8QURIT0NfT04ocEFkYXB0ZXIpKQotCXsKLQkJcmFuZ2UtPm1pbl9wbXAgPSAxICogMTAyNDsKLQkJcmFuZ2UtPm1heF9wbXAgPSA2NTUzNSAqIDEwMjQ7Ci0JCXJhbmdlLT5taW5fcG10ID0gMSAqIDEwMjQ7Ci0JCXJhbmdlLT5tYXhfcG10ID0gMTAwMCAqIDEwMjQ7Ci0JCXJhbmdlLT5wbXBfZmxhZ3MgPSBJV19QT1dFUl9QRVJJT0Q7Ci0JCXJhbmdlLT5wbXRfZmxhZ3MgPSBJV19QT1dFUl9USU1FT1VUOwotCQlyYW5nZS0+cG1fY2FwYSA9IElXX1BPV0VSX1BFUklPRCB8IElXX1BPV0VSX1RJTUVPVVQgfAotCQkJSVdfUE9XRVJfVU5JQ0FTVF9SIHwgSVdfUE9XRVJfQUxMX1I7Ci0JfQotCi0JcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7Ci0JcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gMTQ7Ci0KLQlyYW5nZS0+cmV0cnlfY2FwYSA9IElXX1JFVFJZX0xJTUlUOwotCXJhbmdlLT5yZXRyeV9mbGFncyA9IElXX1JFVFJZX0xJTUlUOwotCXJhbmdlLT5taW5fcmV0cnkgPSAwOwotCXJhbmdlLT5tYXhfcmV0cnkgPSAyNTU7Ci0KLQlyYW5nZS0+bnVtX2NoYW5uZWxzID0gIHBBZGFwdGVyLT5DaGFubmVsTGlzdE51bTsKLQotCXZhbCA9IDA7Ci0JZm9yIChpID0gMTsgaSA8PSByYW5nZS0+bnVtX2NoYW5uZWxzOyBpKyspCi0JewotCQl1MzIgbSA9IDI0MTIwMDA7Ci0JCXJhbmdlLT5mcmVxW3ZhbF0uaSA9IHBBZGFwdGVyLT5DaGFubmVsTGlzdFtpLTFdLkNoYW5uZWw7Ci0JCU1BUF9DSEFOTkVMX0lEX1RPX0tIWihwQWRhcHRlci0+Q2hhbm5lbExpc3RbaS0xXS5DaGFubmVsLCBtKTsKLQkJcmFuZ2UtPmZyZXFbdmFsXS5tID0gbSAqIDEwMDsgLyogT1NfSFogKi8KLQotCQlyYW5nZS0+ZnJlcVt2YWxdLmUgPSAxOwotCQl2YWwrKzsKLQkJaWYgKHZhbCA9PSBJV19NQVhfRlJFUVVFTkNJRVMpCi0JCQlicmVhazsKLQl9Ci0JcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSB2YWw7Ci0KLQlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IDEwMDsgLyogd2hhdCBpcyBjb3JyZWN0IG1heD8gVGhpcyB3YXMgbm90Ci0JCQkJCSogZG9jdW1lbnRlZCBleGFjdGx5LiBBdCBsZWFzdAotCQkJCQkqIDY5IGhhcyBiZWVuIG9ic2VydmVkLiAqLwotCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDA7IC8qIGRCICovCi0JcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gMDsgLyogZEIgKi8KLQotCS8qIFdoYXQgd291bGQgYmUgc3VpdGFibGUgdmFsdWVzIGZvciAiYXZlcmFnZS90eXBpY2FsIiBxdWFsPyAqLwotCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gMjA7Ci0JcmFuZ2UtPmF2Z19xdWFsLmxldmVsID0gLTYwOwotCXJhbmdlLT5hdmdfcXVhbC5ub2lzZSA9IC05NTsKLQlyYW5nZS0+c2Vuc2l0aXZpdHkgPSAzOwotCi0JcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgPSBOUl9XRVBfS0VZUzsKLQlyYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMjsKLQlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVswXSA9IDU7Ci0JcmFuZ2UtPmVuY29kaW5nX3NpemVbMV0gPSAxMzsKLQotCXJhbmdlLT5taW5fcnRzID0gMDsKLQlyYW5nZS0+bWF4X3J0cyA9IDIzNDc7Ci0JcmFuZ2UtPm1pbl9mcmFnID0gMjU2OwotCXJhbmdlLT5tYXhfZnJhZyA9IDIzNDY7Ci0KLSNpZiBXSVJFTEVTU19FWFQgPiAxNwotCS8qIElXX0VOQ19DQVBBXyogYml0IGZpZWxkICovCi0JcmFuZ2UtPmVuY19jYXBhID0gSVdfRU5DX0NBUEFfV1BBIHwgSVdfRU5DX0NBUEFfV1BBMiB8Ci0JCQkJCUlXX0VOQ19DQVBBX0NJUEhFUl9US0lQIHwgSVdfRU5DX0NBUEFfQ0lQSEVSX0NDTVA7Ci0jZW5kaWYKLQotCXJldHVybiAwOwotfQotCi1pbnQgcnRfaW9jdGxfc2l3YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJICAgICAgc3RydWN0IHNvY2thZGRyICphcF9hZGRyLCBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLSAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCc3NpZDsKLQotCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0JaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotCXsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0JcmV0dXJuIC1FTkVURE9XTjsKLSAgICB9Ci0KLQlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKLSAgICB7Ci0gICAgICAgIFJUTVBfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOwotICAgIH0KLQotICAgIC8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZwotICAgIC8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCi0gICAgcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKLQkvLyBQcmV2ZW50IHRvIGNvbm5lY3QgQVAgYWdhaW4gaW4gU1RBTWxtZVBlcmlvZGljRXhlYwotCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKLQotICAgIG1lbXNldChCc3NpZCwgMCwgTUFDX0FERFJfTEVOKTsKLSAgICBtZW1jcHkoQnNzaWQsIGFwX2FkZHItPnNhX2RhdGEsIE1BQ19BRERSX0xFTik7Ci0gICAgTWxtZUVucXVldWUocEFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCi0gICAgICAgICAgICAgICAgT0lEXzgwMl8xMV9CU1NJRCwKLSAgICAgICAgICAgICAgICBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpLAotICAgICAgICAgICAgICAgIChWT0lEICopJkJzc2lkKTsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklPQ1RMOjpTSU9DU0lXQVAgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0gICAgICAgIEJzc2lkWzBdLCBCc3NpZFsxXSwgQnNzaWRbMl0sIEJzc2lkWzNdLCBCc3NpZFs0XSwgQnNzaWRbNV0pKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgcnRfaW9jdGxfZ2l3YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJICAgICAgc3RydWN0IHNvY2thZGRyICphcF9hZGRyLCBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQotCWlmIChwQWRhcHRlciA9PSBOVUxMKQotCXsKLQkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKLQkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCi0JCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0JaWYgKElORlJBX09OKHBBZGFwdGVyKSB8fCBBREhPQ19PTihwQWRhcHRlcikpCi0JewotCQlhcF9hZGRyLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0JCW1lbWNweShhcF9hZGRyLT5zYV9kYXRhLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5Cc3NpZCwgRVRIX0FMRU4pOwotCX0KLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0gICAgLy8gQWRkIGZvciBSVDI4NzAKLSAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQotICAgIHsKLSAgICAgICAgYXBfYWRkci0+c2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotICAgICAgICBtZW1jcHkoYXBfYWRkci0+c2FfZGF0YSwgJnBBZGFwdGVyLT5NbG1lQXV4LkJzc2lkLCBFVEhfQUxFTik7Ci0gICAgfQotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJT0NUTDo6U0lPQ0dJV0FQKD1FTVBUWSlcbiIpKTsKLQkJcmV0dXJuIC1FTk9UQ09OTjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFVuaXRzIGFyZSBpbiBkYiBhYm92ZSB0aGUgbm9pc2UgZmxvb3IuIFRoYXQgbWVhbnMgdGhlCi0gKiByc3NpIHZhbHVlcyByZXBvcnRlZCBpbiB0aGUgdHgvcnggZGVzY3JpcHRvcnMgaW4gdGhlCi0gKiBkcml2ZXIgYXJlIHRoZSBTTlIgZXhwcmVzc2VkIGluIGRiLgotICoKLSAqIElmIHlvdSBhc3N1bWUgdGhhdCB0aGUgbm9pc2UgZmxvb3IgaXMgLTk1LCB3aGljaCBpcyBhbgotICogZXhjZWxsZW50IGFzc3VtcHRpb24gOTkuNSAlIG9mIHRoZSB0aW1lLCB0aGVuIHlvdSBjYW4KLSAqIGRlcml2ZSB0aGUgYWJzb2x1dGUgc2lnbmFsIGxldmVsIChpLmUuIC05NSArIHJzc2kpLgotICogVGhlcmUgYXJlIHNvbWUgb3RoZXIgc2xpZ2h0IGZhY3RvcnMgdG8gdGFrZSBpbnRvIGFjY291bnQKLSAqIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSByc3NpIG1lYXN1cmVtZW50IGlzIGZyb20gMTFiLAotICogMTFnLCBvciAxMWEuICAgVGhlc2UgZGlmZmVyZW5jZXMgYXJlIGF0IG1vc3QgMmRiIGFuZAotICogY2FuIGJlIGRvY3VtZW50ZWQuCi0gKgotICogTkI6IHZhcmlvdXMgY2FsY3VsYXRpb25zIGFyZSBiYXNlZCBvbiB0aGUgb3Jpbm9jby93YXZlbGFuCi0gKiAgICAgZHJpdmVycyBmb3IgY29tcGF0aWJpbGl0eQotICovCi1zdGF0aWMgdm9pZCBzZXRfcXVhbGl0eShQUlRNUF9BREFQVEVSIHBBZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3F1YWxpdHkgKmlxLAotICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIGNoYXIgcnNzaSkKLXsKLQlfX3U4IENoYW5uZWxRdWFsaXR5OwotCi0JLy8gTm9ybWFsaXplIFJzc2kKLQlpZiAocnNzaSA+PSAtNTApCi0gICAgICAgIENoYW5uZWxRdWFsaXR5ID0gMTAwOwotCWVsc2UgaWYgKHJzc2kgPj0gLTgwKSAvLyBiZXR3ZWVuIC01MCB+IC04MGRibQotCQlDaGFubmVsUXVhbGl0eSA9IChfX3U4KSgyNCArICgocnNzaSArIDgwKSAqIDI2KS8xMCk7Ci0JZWxzZSBpZiAocnNzaSA+PSAtOTApICAgLy8gYmV0d2VlbiAtODAgfiAtOTBkYm0KLSAgICAgICAgQ2hhbm5lbFF1YWxpdHkgPSAoX191OCkoKHJzc2kgKyA5MCkgKiAyNikvMTA7Ci0JZWxzZQotCQlDaGFubmVsUXVhbGl0eSA9IDA7Ci0KLSAgICBpcS0+cXVhbCA9IChfX3U4KUNoYW5uZWxRdWFsaXR5OwotCi0gICAgaXEtPmxldmVsID0gKF9fdTgpKHJzc2kpOwotICAgIGlxLT5ub2lzZSA9IChwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0gPiBwQWRhcHRlci0+QmJwVHVuaW5nLkZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQpID8gKChfX3U4KXBBZGFwdGVyLT5CYnBUdW5pbmcuRmFsc2VDY2FVcHBlclRocmVzaG9sZCkgOiAoKF9fdTgpIHBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSk7CQkvLyBub2lzZSBsZXZlbCAoZEJtKQotICAgIGlxLT5ub2lzZSArPSAyNTYgLSAxNDM7Ci0gICAgaXEtPnVwZGF0ZWQgPSBwQWRhcHRlci0+aXdfc3RhdHMucXVhbC51cGRhdGVkOwotfQotCi1pbnQgcnRfaW9jdGxfaXdhcGxpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQotewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihkZXYpOwotCi0Jc3RydWN0IHNvY2thZGRyIGFkZHJbSVdfTUFYX0FQXTsKLQlzdHJ1Y3QgaXdfcXVhbGl0eSBxdWFsW0lXX01BWF9BUF07Ci0JaW50IGk7Ci0KLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLSAgICB7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotCQlkYXRhLT5sZW5ndGggPSAwOwotCQlyZXR1cm4gMDsKLSAgICAgICAgLy9yZXR1cm4gLUVORVRET1dOOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPElXX01BWF9BUCA7IGkrKykKLQl7Ci0JCWlmIChpID49ICBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcikKLQkJCWJyZWFrOwotCQlhZGRyW2ldLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLQkJCW1lbWNweShhZGRyW2ldLnNhX2RhdGEsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKLQkJc2V0X3F1YWxpdHkocEFkYXB0ZXIsICZxdWFsW2ldLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpKTsKLQl9Ci0JZGF0YS0+bGVuZ3RoID0gaTsKLQltZW1jcHkoZXh0cmEsICZhZGRyLCBpKnNpemVvZihhZGRyWzBdKSk7Ci0JZGF0YS0+ZmxhZ3MgPSAxOwkJLyogc2lnbmFsIHF1YWxpdHkgcHJlc2VudCAoc29ydCBvZikgKi8KLQltZW1jcHkoZXh0cmEgKyBpKnNpemVvZihhZGRyWzBdKSwgJnF1YWwsIGkqc2l6ZW9mKHF1YWxbaV0pKTsKLQotCXJldHVybiAwOwotfQotCi0jaWZkZWYgU0lPQ0dJV1NDQU4KLWludCBydF9pb2N0bF9zaXdzY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQotCVVMT05HCQkJCQkJCQlOb3c7Ci0JaW50IFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0KLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLQkJcmV0dXJuIC1FTkVURE9XTjsKLQl9Ci0KLQlpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgRHJpdmVyIGlzIGluIE1vbml0b3IgTW9kZSBub3cgISEhXG4iKSk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCi0JewotCQlwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRTY2FuQ291bnQrKzsKLQl9Ci0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0gICAgcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQotCQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQlkb3sKLQkJTm93ID0gamlmZmllczsKLQotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQkJaWYgKChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpICYmCi0JCQkocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50U2NhbkNvdW50ID4gMykpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBXcGFTdXBwbGljYW50U2NhbkNvdW50ID4gM1xuIikpOwotCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQkJCWJyZWFrOwotCQl9Ci0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0JCWlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpICYmCi0JCQkoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAotCQkJKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkgJiYKLQkJCShwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMaW5rIFVQLCBQb3J0IE5vdCBTZWN1cmVkISBpZ25vcmUgdGhpcyBzZXQ6Ok9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOXG4iKSk7Ci0JCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKLQkJewotCQkJUlRNUF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOwotCQl9Ci0KLQkJLy8gdGVsbCBDTlRMIHN0YXRlIG1hY2hpbmUgdG8gY2FsbCBOZGlzTVNldEluZm9ybWF0aW9uQ29tcGxldGUoKSBhZnRlciBjb21wbGV0aW5nCi0JCS8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCi0JCXBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7Ci0JCS8vIFJlc2V0IGFsbG93ZWQgc2NhbiByZXRyaWVzCi0JCXBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDA7Ci0JCXBBZGFwdGVyLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gTm93OwotCi0JCU1sbWVFbnF1ZXVlKHBBZGFwdGVyLAotCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCi0JCQlPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwKLQkJCTAsCi0JCQlOVUxMKTsKLQotCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCQlSVE1QX01MTUVfSEFORExFUihwQWRhcHRlcik7Ci0JfXdoaWxlKDApOwotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi1pbnQgcnRfaW9jdGxfZ2l3c2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCi17Ci0KLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQlpbnQgaT0wOwotCVBTVFJJTkcgY3VycmVudF9ldiA9IGV4dHJhLCBwcmV2aW91c19ldiA9IGV4dHJhOwotCVBTVFJJTkcgZW5kX2J1ZjsKLQlQU1RSSU5HIGN1cnJlbnRfdmFsOwotCVNUUklORyBjdXN0b21bTUFYX0NVU1RPTV9MRU5dID0gezB9OwotI2lmbmRlZiBJV0VWR0VOSUUKLQl1bnNpZ25lZCBjaGFyIGlkeDsKLSNlbmRpZiAvLyBJV0VWR0VOSUUgLy8KLQlzdHJ1Y3QgaXdfZXZlbnQgaXdlOwotCi0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKLSAgICB7Ci0JCS8qCi0JCSAqIFN0aWxsIHNjYW5uaW5nLCBpbmRpY2F0ZSB0aGUgY2FsbGVyIHNob3VsZCB0cnkgYWdhaW4uCi0JCSAqLwotCQlyZXR1cm4gLUVBR0FJTjsKLQl9Ci0KLQotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQlpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQotCXsKLQkJcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50U2NhbkNvdW50ID0gMDsKLQl9Ci0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0JaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yID09IDApCi0JewotCQlkYXRhLT5sZW5ndGggPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0KLSNpZiBXSVJFTEVTU19FWFQgPj0gMTcKLSAgICBpZiAoZGF0YS0+bGVuZ3RoID4gMCkKLSAgICAgICAgZW5kX2J1ZiA9IGV4dHJhICsgZGF0YS0+bGVuZ3RoOwotICAgIGVsc2UKLSAgICAgICAgZW5kX2J1ZiA9IGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQTsKLSNlbHNlCi0gICAgZW5kX2J1ZiA9IGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQTsKLSNlbmRpZgotCi0JZm9yIChpID0gMDsgaSA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yOyBpKyspCi0JewotCQlpZiAoY3VycmVudF9ldiA+PSBlbmRfYnVmKQotICAgICAgICB7Ci0jaWYgV0lSRUxFU1NfRVhUID49IDE3Ci0gICAgICAgICAgICByZXR1cm4gLUUyQklHOwotI2Vsc2UKLQkJCWJyZWFrOwotI2VuZGlmCi0gICAgICAgIH0KLQotCQkvL01BQyBhZGRyZXNzCi0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKLQkJaXdlLmNtZCA9IFNJT0NHSVdBUDsKLQkJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0JCQkJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkLCBFVEhfQUxFTik7Ci0KLSAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OwotCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldixlbmRfYnVmLCAmaXdlLCBJV19FVl9BRERSX0xFTik7Ci0gICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQotI2lmIFdJUkVMRVNTX0VYVCA+PSAxNwotICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKLSNlbHNlCi0JCQlicmVhazsKLSNlbmRpZgotCi0JCS8qCi0JCVByb3RvY29sOgotCQkJaXQgd2lsbCBzaG93IHNjYW5uZWQgQVAncyBXaXJlbGVzc01vZGUgLgotCQkJaXQgbWlnaHQgYmUKLQkJCQkJODAyLjExYQotCQkJCQk4MDIuMTFhL24KLQkJCQkJODAyLjExZy9uCi0JCQkJCTgwMi4xMWIvZy9uCi0JCQkJCTgwMi4xMWcKLQkJCQkJODAyLjExYi9nCi0JCSovCi0JCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7Ci0JCWl3ZS5jbWQgPSBTSU9DR0lXTkFNRTsKLQotCi0JewotCQlQQlNTX0VOVFJZIHBCc3NFbnRyeT0mcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV07Ci0JCUJPT0xFQU4gaXNHb25seT1GQUxTRTsKLQkJaW50IHJhdGVDbnQ9MDsKLQotCQlpZiAocEJzc0VudHJ5LT5DaGFubmVsPjE0KQotCQl7Ci0JCQlpZiAocEJzc0VudHJ5LT5IdENhcGFiaWxpdHlMZW4hPTApCi0JCQkJc3RyY3B5KGl3ZS51Lm5hbWUsIjgwMi4xMWEvbiIpOwotCQkJZWxzZQotCQkJCXN0cmNweShpd2UudS5uYW1lLCI4MDIuMTFhIik7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvKgotCQkJCWlmIG9uZSBvZiBub24gQiBtb2RlIHJhdGUgaXMgc2V0IHN1cHBvcnRlZCByYXRlIC4gaXQgbWVhbiBHIG9ubHkuCi0JCQkqLwotCQkJZm9yIChyYXRlQ250PTA7cmF0ZUNudDxwQnNzRW50cnktPlN1cFJhdGVMZW47cmF0ZUNudCsrKQotCQkJewotCQkJCS8qCi0JCQkJCTZNYnBzKDE0MCkgOU1icHMoMTQ2KSBhbmQgPj0xMk1icHMoMTUyKSBhcmUgc3VwcG9ydGVkIHJhdGUgLCBpdCBtZWFuIEcgb25seS4KLQkJCQkqLwotCQkJCWlmIChwQnNzRW50cnktPlN1cFJhdGVbcmF0ZUNudF09PTE0MCB8fCBwQnNzRW50cnktPlN1cFJhdGVbcmF0ZUNudF09PTE0NiB8fCBwQnNzRW50cnktPlN1cFJhdGVbcmF0ZUNudF0+PTE1MikKLQkJCQkJaXNHb25seT1UUlVFOwotCQkJfQotCi0JCQlmb3IgKHJhdGVDbnQ9MDtyYXRlQ250PHBCc3NFbnRyeS0+RXh0UmF0ZUxlbjtyYXRlQ250KyspCi0JCQl7Ci0JCQkJaWYgKHBCc3NFbnRyeS0+RXh0UmF0ZVtyYXRlQ250XT09MTQwIHx8IHBCc3NFbnRyeS0+RXh0UmF0ZVtyYXRlQ250XT09MTQ2IHx8IHBCc3NFbnRyeS0+RXh0UmF0ZVtyYXRlQ250XT49MTUyKQotCQkJCQlpc0dvbmx5PVRSVUU7Ci0JCQl9Ci0KLQotCQkJaWYgKHBCc3NFbnRyeS0+SHRDYXBhYmlsaXR5TGVuIT0wKQotCQkJewotCQkJCWlmIChpc0dvbmx5PT1UUlVFKQotCQkJCQlzdHJjcHkoaXdlLnUubmFtZSwiODAyLjExZy9uIik7Ci0JCQkJZWxzZQotCQkJCQlzdHJjcHkoaXdlLnUubmFtZSwiODAyLjExYi9nL24iKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAoaXNHb25seT09VFJVRSkKLQkJCQkJc3RyY3B5KGl3ZS51Lm5hbWUsIjgwMi4xMWciKTsKLQkJCQllbHNlCi0JCQkJewotCQkJCQlpZiAocEJzc0VudHJ5LT5TdXBSYXRlTGVuPT00ICYmIHBCc3NFbnRyeS0+RXh0UmF0ZUxlbj09MCkKLQkJCQkJCXN0cmNweShpd2UudS5uYW1lLCI4MDIuMTFiIik7Ci0JCQkJCWVsc2UKLQkJCQkJCXN0cmNweShpd2UudS5uYW1lLCI4MDIuMTFiL2ciKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkJcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OwotCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldixlbmRfYnVmLCAmaXdlLCBJV19FVl9BRERSX0xFTik7Ci0JCWlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQotI2lmIFdJUkVMRVNTX0VYVCA+PSAxNwotCQkJcmV0dXJuIC1FMkJJRzsKLSNlbHNlCi0JCQlicmVhazsKLSNlbmRpZgotCi0JCS8vRVNTSUQKLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwotCQlpd2UuY21kID0gU0lPQ0dJV0VTU0lEOwotCQlpd2UudS5kYXRhLmxlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW47Ci0JCWl3ZS51LmRhdGEuZmxhZ3MgPSAxOwotCi0gICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKLQkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsZW5kX2J1ZiwgJml3ZSwgKFBTVFJJTkcpIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWQpOwotICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKLSNpZiBXSVJFTEVTU19FWFQgPj0gMTcKLSAgICAgICAgICAgIHJldHVybiAtRTJCSUc7Ci0jZWxzZQotCQkJYnJlYWs7Ci0jZW5kaWYKLQotCQkvL05ldHdvcmsgVHlwZQotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7Ci0JCWl3ZS5jbWQgPSBTSU9DR0lXTU9ERTsKLQkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc1R5cGUgPT0gTmRpczgwMl8xMUlCU1MpCi0JCXsKLQkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0FESE9DOwotCQl9Ci0JCWVsc2UgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc1R5cGUgPT0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlKQotCQl7Ci0JCQlpd2UudS5tb2RlID0gSVdfTU9ERV9JTkZSQTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0FVVE87Ci0JCX0KLQkJaXdlLmxlbiA9IElXX0VWX1VJTlRfTEVOOwotCi0gICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKLQkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsICBJV19FVl9VSU5UX0xFTik7Ci0gICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQotI2lmIFdJUkVMRVNTX0VYVCA+PSAxNwotICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKLSNlbHNlCi0JCQlicmVhazsKLSNlbmRpZgotCi0JCS8vQ2hhbm5lbCBhbmQgRnJlcXVlbmN5Ci0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKLQkJaXdlLmNtZCA9IFNJT0NHSVdGUkVROwotCQlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpIHx8IEFESE9DX09OKHBBZGFwdGVyKSkKLQkJCWl3ZS51LmZyZXEubSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWw7Ci0JCWVsc2UKLQkJCWl3ZS51LmZyZXEubSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWw7Ci0JCWl3ZS51LmZyZXEuZSA9IDA7Ci0JCWl3ZS51LmZyZXEuaSA9IDA7Ci0KLQkJcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OwotCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldixlbmRfYnVmLCAmaXdlLCBJV19FVl9GUkVRX0xFTik7Ci0gICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQotI2lmIFdJUkVMRVNTX0VYVCA+PSAxNwotICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKLSNlbHNlCi0JCQlicmVhazsKLSNlbmRpZgotCi0gICAgICAgIC8vQWRkIHF1YWxpdHkgc3RhdGlzdGljcwotICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIG1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7Ci0JaXdlLmNtZCA9IElXRVZRVUFMOwotCWl3ZS51LnF1YWwubGV2ZWwgPSAwOwotCWl3ZS51LnF1YWwubm9pc2UgPSAwOwotCXNldF9xdWFsaXR5KHBBZGFwdGVyLCAmaXdlLnUucXVhbCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaSk7Ci0JY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIElXX0VWX1FVQUxfTEVOKTsKLQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKLSNpZiBXSVJFTEVTU19FWFQgPj0gMTcKLSAgICAgICAgICAgIHJldHVybiAtRTJCSUc7Ci0jZWxzZQotCQkJYnJlYWs7Ci0jZW5kaWYKLQotCQkvL0VuY3lwdGlvbiBrZXkKLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwotCQlpd2UuY21kID0gU0lPQ0dJV0VOQ09ERTsKLQkJaWYgKENBUF9JU19QUklWQUNZX09OIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DYXBhYmlsaXR5SW5mbyApKQotCQkJaXdlLnUuZGF0YS5mbGFncyA9SVdfRU5DT0RFX0VOQUJMRUQgfCBJV19FTkNPREVfTk9LRVk7Ci0JCWVsc2UKLQkJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7Ci0KLSAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OwotICAgICAgICBjdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwmaXdlLCAoY2hhciAqKXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bKGl3ZS51LmRhdGEuZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpLTFdLktleSk7Ci0gICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQotI2lmIFdJUkVMRVNTX0VYVCA+PSAxNwotICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKLSNlbHNlCi0JCQlicmVhazsKLSNlbmRpZgotCi0JCS8vQml0IFJhdGUKLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZUxlbikKLSAgICAgICAgewotICAgICAgICAgICAgVUNIQVIgdG1wUmF0ZSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVbcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZUxlbi0xXTsKLQkJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7Ci0JCQlpd2UuY21kID0gU0lPQ0dJV1JBVEU7Ci0JCWN1cnJlbnRfdmFsID0gY3VycmVudF9ldiArIElXX0VWX0xDUF9MRU47Ci0gICAgICAgICAgICBpZiAodG1wUmF0ZSA9PSAweDgyKQotICAgICAgICAgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgMSAqIDEwMDAwMDA7Ci0gICAgICAgICAgICBlbHNlIGlmICh0bXBSYXRlID09IDB4ODQpCi0gICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAyICogMTAwMDAwMDsKLSAgICAgICAgICAgIGVsc2UgaWYgKHRtcFJhdGUgPT0gMHg4QikKLSAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDUuNSAqIDEwMDAwMDA7Ci0gICAgICAgICAgICBlbHNlIGlmICh0bXBSYXRlID09IDB4OTYpCi0gICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAxMSAqIDEwMDAwMDA7Ci0gICAgICAgICAgICBlbHNlCi0JCSAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gICh0bXBSYXRlLzIpICogMTAwMDAwMDsKLQotCQkJaWYgKHRtcFJhdGUgPT0gMHg2YyAmJiBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5IdENhcGFiaWxpdHlMZW4gPiAwKQotCQkJewotCQkJCWludCByYXRlX2NvdW50ID0gc2l6ZW9mKHJhbGlua3JhdGUpL3NpemVvZihfX3MzMik7Ci0JCQkJSFRfQ0FQX0lORk8gY2FwSW5mbyA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkh0Q2FwYWJpbGl0eS5IdENhcEluZm87Ci0JCQkJaW50IHNob3J0R0kgPSBjYXBJbmZvLkNoYW5uZWxXaWR0aCA/IGNhcEluZm8uU2hvcnRHSWZvcjQwIDogY2FwSW5mby5TaG9ydEdJZm9yMjA7Ci0JCQkJaW50IG1heE1DUyA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPyAgMTUgOiA3OwotCQkJCWludCByYXRlX2luZGV4ID0gMTIgKyAoKFVDSEFSKWNhcEluZm8uQ2hhbm5lbFdpZHRoICogMjQpICsgKChVQ0hBUilzaG9ydEdJICo0OCkgKyAoKFVDSEFSKW1heE1DUyk7Ci0JCQkJaWYgKHJhdGVfaW5kZXggPCAwKQotCQkJCQlyYXRlX2luZGV4ID0gMDsKLQkJCQlpZiAocmF0ZV9pbmRleCA+IHJhdGVfY291bnQpCi0JCQkJCXJhdGVfaW5kZXggPSByYXRlX2NvdW50OwotCQkJCWl3ZS51LmJpdHJhdGUudmFsdWUJPSAgcmFsaW5rcmF0ZVtyYXRlX2luZGV4XSAqIDUwMDAwMDsKLQkJCX0KLQotCQkJaXdlLnUuYml0cmF0ZS5kaXNhYmxlZCA9IDA7Ci0JCQljdXJyZW50X3ZhbCA9IElXRV9TVFJFQU1fQUREX1ZBTFVFKGluZm8sIGN1cnJlbnRfZXYsCi0JCQkJY3VycmVudF92YWwsIGVuZF9idWYsICZpd2UsCi0JCQlJV19FVl9QQVJBTV9MRU4pOwotCi0JCWlmKChjdXJyZW50X3ZhbC1jdXJyZW50X2V2KT5JV19FVl9MQ1BfTEVOKQotCQljdXJyZW50X2V2ID0gY3VycmVudF92YWw7Ci0JCWVsc2UKLSNpZiBXSVJFTEVTU19FWFQgPj0gMTcKLSAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOwotI2Vsc2UKLQkJCSAgICBicmVhazsKLSNlbmRpZgotICAgICAgICB9Ci0KLSNpZmRlZiBJV0VWR0VOSUUKLSAgICAgICAgLy9XUEEgSUUKLQkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuID4gMCkKLSAgICAgICAgewotCQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKLQkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7Ci0JCQltZW1jcHkoY3VzdG9tLCAmKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFWzBdKSwKLQkJCQkJCSAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuKTsKLQkJCWl3ZS5jbWQgPSBJV0VWR0VOSUU7Ci0JCQlpd2UudS5kYXRhLmxlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuOwotCQkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGN1c3RvbSk7Ci0JCQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKLSNpZiBXSVJFTEVTU19FWFQgPj0gMTcKLSAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOwotI2Vsc2UKLQkJCSAgICBicmVhazsKLSNlbmRpZgotCQl9Ci0KLQkJLy9XUEEyIElFCi0gICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbiA+IDApCi0gICAgICAgIHsKLQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKLQkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7Ci0JCQltZW1jcHkoY3VzdG9tLCAmKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFWzBdKSwKLQkJCQkJCSAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuKTsKLQkJCWl3ZS5jbWQgPSBJV0VWR0VOSUU7Ci0JCQlpd2UudS5kYXRhLmxlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuOwotCQkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGN1c3RvbSk7Ci0JCQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKLSNpZiBXSVJFTEVTU19FWFQgPj0gMTcKLSAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOwotI2Vsc2UKLQkJCSAgICBicmVhazsKLSNlbmRpZgotICAgICAgICB9Ci0jZWxzZQotICAgICAgICAvL1dQQSBJRQotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbiA+IDApCi0gICAgICAgIHsKLQkJTmRpc1plcm9NZW1vcnkoJml3ZSwgc2l6ZW9mKGl3ZSkpOwotCQkJbWVtc2V0KCZjdXN0b21bMF0sIDAsIE1BWF9DVVNUT01fTEVOKTsKLQkJaXdlLmNtZCA9IElXRVZDVVNUT007Ci0gICAgICAgICAgICBpd2UudS5kYXRhLmxlbmd0aCA9IChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbiAqIDIpICsgNzsKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KGN1c3RvbSwgIndwYV9pZT0iLCA3KTsKLSAgICAgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW47IGlkeCsrKQotICAgICAgICAgICAgICAgIHNwcmludGYoY3VzdG9tLCAiJXMlMDJ4IiwgY3VzdG9tLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRVtpZHhdKTsKLSAgICAgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKLQkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsICBjdXN0b20pOwotICAgICAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCi0jaWYgV0lSRUxFU1NfRVhUID49IDE3Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKLSNlbHNlCi0JCQkgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICAgICAgfQotCi0gICAgICAgIC8vV1BBMiBJRQotICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4gPiAwKQotICAgICAgICB7Ci0JCU5kaXNaZXJvTWVtb3J5KCZpd2UsIHNpemVvZihpd2UpKTsKLQkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7Ci0JCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOwotICAgICAgICAgICAgaXdlLnUuZGF0YS5sZW5ndGggPSAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4gKiAyKSArIDc7Ci0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShjdXN0b20sICJyc25faWU9IiwgNyk7Ci0JCQlmb3IgKGlkeCA9IDA7IGlkeCA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuOyBpZHgrKykKLSAgICAgICAgICAgICAgICBzcHJpbnRmKGN1c3RvbSwgIiVzJTAyeCIsIGN1c3RvbSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVbaWR4XSk7Ci0gICAgICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7Ci0JCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCAgY3VzdG9tKTsKLSAgICAgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQotI2lmIFdJUkVMRVNTX0VYVCA+PSAxNwotICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7Ci0jZWxzZQotCQkJICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgIH0KLSNlbmRpZiAvLyBJV0VWR0VOSUUgLy8KLQl9Ci0KLQlkYXRhLT5sZW5ndGggPSBjdXJyZW50X2V2IC0gZXh0cmE7Ci0gICAgcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IgLCgiPT09PnJ0X2lvY3RsX2dpd3NjYW4uICVkKCVkKSBCU1MgcmV0dXJuZWQsIGRhdGEtPmxlbmd0aCA9ICVkXG4iLGkgLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOciwgZGF0YS0+bGVuZ3RoKSk7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotaW50IHJ0X2lvY3RsX3Npd2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmVzc2lkKQotewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihkZXYpOwotCi0JLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLSAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0gICAgewotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLQlyZXR1cm4gLUVORVRET1dOOwotICAgIH0KLQotCWlmIChkYXRhLT5mbGFncykKLQl7Ci0JCVBTVFJJTkcJcFNzaWRTdHJpbmcgPSBOVUxMOwotCi0JCS8vIEluY2x1ZGVzIG51bGwgY2hhcmFjdGVyLgotCQlpZiAoZGF0YS0+bGVuZ3RoID4gKElXX0VTU0lEX01BWF9TSVpFICsgMSkpCi0JCQlyZXR1cm4gLUUyQklHOwotCi0JCXBTc2lkU3RyaW5nID0ga21hbGxvYyhNQVhfTEVOX09GX1NTSUQrMSwgTUVNX0FMTE9DX0ZMQUcpOwotCQlpZiAocFNzaWRTdHJpbmcpCi0gICAgICAgIHsKLQkJCU5kaXNaZXJvTWVtb3J5KHBTc2lkU3RyaW5nLCBNQVhfTEVOX09GX1NTSUQrMSk7Ci0JCQlOZGlzTW92ZU1lbW9yeShwU3NpZFN0cmluZywgZXNzaWQsIGRhdGEtPmxlbmd0aCk7Ci0JCQlpZiAoU2V0X1NTSURfUHJvYyhwQWRhcHRlciwgcFNzaWRTdHJpbmcpID09IEZBTFNFKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JZWxzZQotICAgIHsKLQkJLy8gQU5ZIHNzaWQKLQkJaWYgKFNldF9TU0lEX1Byb2MocEFkYXB0ZXIsICIiKSA9PSBGQUxTRSkKLQkJCXJldHVybiAtRUlOVkFMOwotICAgIH0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHJ0X2lvY3RsX2dpd2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmVzc2lkKQotewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihkZXYpOwotCi0JaWYgKHBBZGFwdGVyID09IE5VTEwpCi0JewotCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOwotCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KLQkJcmV0dXJuIC1FTkVURE9XTjsKLQl9Ci0KLQlkYXRhLT5mbGFncyA9IDE7Ci0gICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQotICAgIHsKLSAgICAgICAgZGF0YS0+bGVuZ3RoICA9IDA7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIk1lZGlhU3RhdGUgaXMgY29ubmVjdGVkXG4iKSk7Ci0JCWRhdGEtPmxlbmd0aCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbjsKLQkJbWVtY3B5KGVzc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbik7Ci0JfQotCWVsc2UKLQl7Ly90aGUgQU5ZIHNzaWQgd2FzIHNwZWNpZmllZAotCQlkYXRhLT5sZW5ndGggID0gMDsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiTWVkaWFTdGF0ZSBpcyBub3QgY29ubmVjdGVkLCBlc3NcbiIpKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotfQotCi1pbnQgcnRfaW9jdGxfc2l3bmlja24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqbmlja25hbWUpCi17Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0KLSAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLSAgICAgICAgcmV0dXJuIC1FTkVURE9XTjsKLSAgICB9Ci0KLQlpZiAoZGF0YS0+bGVuZ3RoID4gSVdfRVNTSURfTUFYX1NJWkUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbWVtc2V0KHBBZGFwdGVyLT5uaWNrbmFtZSwgMCwgSVdfRVNTSURfTUFYX1NJWkUgKyAxKTsKLQltZW1jcHkocEFkYXB0ZXItPm5pY2tuYW1lLCBuaWNrbmFtZSwgZGF0YS0+bGVuZ3RoKTsKLQotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBydF9pb2N0bF9naXduaWNrbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpuaWNrbmFtZSkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQotCWlmIChwQWRhcHRlciA9PSBOVUxMKQotCXsKLQkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKLQkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCi0JCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0JaWYgKGRhdGEtPmxlbmd0aCA+IHN0cmxlbigoUFNUUklORykgcEFkYXB0ZXItPm5pY2tuYW1lKSArIDEpCi0JCWRhdGEtPmxlbmd0aCA9IHN0cmxlbigoUFNUUklORykgcEFkYXB0ZXItPm5pY2tuYW1lKSArIDE7Ci0JaWYgKGRhdGEtPmxlbmd0aCA+IDApIHsKLQkJbWVtY3B5KG5pY2tuYW1lLCBwQWRhcHRlci0+bmlja25hbWUsIGRhdGEtPmxlbmd0aC0xKTsKLQkJbmlja25hbWVbZGF0YS0+bGVuZ3RoLTFdID0gJ1wwJzsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBydF9pb2N0bF9zaXdydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCSAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJ0cywgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0JdTE2IHZhbDsKLQotICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0gICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotICAgICAgICByZXR1cm4gLUVORVRET1dOOwotICAgIH0KLQotCWlmIChydHMtPmRpc2FibGVkKQotCQl2YWwgPSBNQVhfUlRTX1RIUkVTSE9MRDsKLQllbHNlIGlmIChydHMtPnZhbHVlIDwgMCB8fCBydHMtPnZhbHVlID4gTUFYX1JUU19USFJFU0hPTEQpCi0JCXJldHVybiAtRUlOVkFMOwotCWVsc2UgaWYgKHJ0cy0+dmFsdWUgPT0gMCkKLQkgICAgdmFsID0gTUFYX1JUU19USFJFU0hPTEQ7Ci0JZWxzZQotCQl2YWwgPSBydHMtPnZhbHVlOwotCi0JaWYgKHZhbCAhPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCkKLQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSB2YWw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHJ0X2lvY3RsX2dpd3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJICAgICAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQotCWlmIChwQWRhcHRlciA9PSBOVUxMKQotCXsKLQkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKLQkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCi0JCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0JLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLQlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0JCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0JcnRzLT52YWx1ZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkOwotCXJ0cy0+ZGlzYWJsZWQgPSAocnRzLT52YWx1ZSA9PSBNQVhfUlRTX1RIUkVTSE9MRCk7Ci0JcnRzLT5maXhlZCA9IDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHJ0X2lvY3RsX3Npd2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWcsIGNoYXIgKmV4dHJhKQotewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihkZXYpOwotCXUxNiB2YWw7Ci0KLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLQkJcmV0dXJuIC1FTkVURE9XTjsKLQl9Ci0KLQlpZiAoZnJhZy0+ZGlzYWJsZWQpCi0JCXZhbCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKLQllbHNlIGlmIChmcmFnLT52YWx1ZSA+PSBNSU5fRlJBR19USFJFU0hPTEQgfHwgZnJhZy0+dmFsdWUgPD0gTUFYX0ZSQUdfVEhSRVNIT0xEKQotICAgICAgICB2YWwgPSBfX2NwdV90b19sZTE2KGZyYWctPnZhbHVlICYgfjB4MSk7IC8qIGV2ZW4gbnVtYmVycyBvbmx5ICovCi0JZWxzZSBpZiAoZnJhZy0+dmFsdWUgPT0gMCkKLQkgICAgdmFsID0gTUFYX0ZSQUdfVEhSRVNIT0xEOwotCWVsc2UKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gdmFsOwotCXJldHVybiAwOwotfQotCi1pbnQgcnRfaW9jdGxfZ2l3ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCXN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0KLQlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKLQl7Ci0JCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7Ci0JCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLwotCQlyZXR1cm4gLUVORVRET1dOOwotCX0KLQotCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0JaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotCQlyZXR1cm4gLUVORVRET1dOOwotCX0KLQotCWZyYWctPnZhbHVlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZDsKLQlmcmFnLT5kaXNhYmxlZCA9IChmcmFnLT52YWx1ZSA9PSBNQVhfRlJBR19USFJFU0hPTEQpOwotCWZyYWctPmZpeGVkID0gMTsKLQotCXJldHVybiAwOwotfQotCi0jZGVmaW5lIE1BWF9XRVBfS0VZX1NJWkUgMTMKLSNkZWZpbmUgTUlOX1dFUF9LRVlfU0laRSA1Ci1pbnQgcnRfaW9jdGxfc2l3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQotCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0JaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotCQlyZXR1cm4gLUVORVRET1dOOwotCX0KLQotCWlmICgoZXJxLT5sZW5ndGggPT0gMCkgJiYKLSAgICAgICAgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpKQotCXsKLQkJcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCQlwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7Ci0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOwotICAgICAgICBnb3RvIGRvbmU7Ci0JfQotCWVsc2UgaWYgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfUkVTVFJJQ1RFRCB8fCBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX09QRU4pCi0JewotCSAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQkJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7Ci0JCXBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOwotCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7Ci0JCXBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7Ci0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOwotCQlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKQotCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDsKLQllbHNlCi0JCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKLQl9Ci0KLSAgICBpZiAoZXJxLT5sZW5ndGggPiAwKQotCXsKLQkJaW50IGtleUlkeCA9IChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7Ci0JCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBrZXkgKi8KLQkJaWYgKGVycS0+bGVuZ3RoID4gTUFYX1dFUF9LRVlfU0laRSkKLQkJewotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJLyogQ2hlY2sga2V5IGluZGV4ICovCi0JCWlmICgoa2V5SWR4IDwgMCkgfHwgKGtleUlkeCA+PSBOUl9XRVBfS0VZUykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6V3Jvbmcga2V5SWR4PSVkISBVc2luZyBkZWZhdWx0IGtleSBpbnN0ZWFkICglZClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5SWR4LCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOwotCi0gICAgICAgICAgICAvL1VzaW5nIGRlZmF1bHQga2V5Ci0JCQlrZXlJZHggPSBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKLSAgICAgICAgfQotCQllbHNlCi0JCQlwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IGtleUlkeDsKLQotICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCAgMTYpOwotCi0JCWlmIChlcnEtPmxlbmd0aCA9PSBNQVhfV0VQX0tFWV9TSVpFKQotICAgICAgICB7Ci0JCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUFYX1dFUF9LRVlfU0laRTsKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotCQl9Ci0JCWVsc2UgaWYgKGVycS0+bGVuZ3RoID09IE1JTl9XRVBfS0VZX1NJWkUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBNSU5fV0VQX0tFWV9TSVpFOwotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLQkJfQotCQllbHNlCi0JCQkvKiBEaXNhYmxlIHRoZSBrZXkgKi8KLQkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSAwOwotCi0JCS8qIENoZWNrIGlmIHRoZSBrZXkgaXMgbm90IG1hcmtlZCBhcyBpbnZhbGlkICovCi0JCWlmKCEoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9OT0tFWSkpCi0JCXsKLQkJCS8qIENvcHkgdGhlIGtleSBpbiB0aGUgZHJpdmVyICovCi0JCQlOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCBleHRyYSwgZXJxLT5sZW5ndGgpOwotICAgICAgICB9Ci0JfQotICAgIGVsc2UKLQkJCXsKLQkJLyogRG8gd2Ugd2FudCB0byBqdXN0IHNldCB0aGUgdHJhbnNtaXQga2V5IGluZGV4ID8gKi8KLQkJaW50IGluZGV4ID0gKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKLQkJaWYgKChpbmRleCA+PSAwKSAmJiAoaW5kZXggPCA0KSkKLSAgICAgICAgewotCQkJcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBpbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZWxzZQotCQkJLyogRG9uJ3QgY29tcGxhaW4gaWYgb25seSBjaGFuZ2UgdGhlIG1vZGUgKi8KLQkJaWYgKCEoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9NT0RFKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KLQotZG9uZToKLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OmVycS0+ZmxhZ3M9JXhcbiIsZXJxLT5mbGFncykpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6QXV0aE1vZGU9JXhcbiIscEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6RGVmYXVsdEtleUlkPSV4LCBLZXlMZW4gPSAlZFxuIixwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCAsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbikpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6V2VwU3RhdHVzPSV4XG4iLHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludAotcnRfaW9jdGxfZ2l3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICprZXkpCi17Ci0JaW50IGtpZDsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQotCWlmIChwQWRhcHRlciA9PSBOVUxMKQotCXsKLQkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKLQkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCi0JCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0JLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLQlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0JcmV0dXJuIC1FTkVURE9XTjsKLQl9Ci0KLQlraWQgPSBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5ydF9pb2N0bF9naXdlbmNvZGUgJWRcbiIsIGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpKTsKLQotCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0JewotCQllcnEtPmxlbmd0aCA9IDA7Ci0JCWVycS0+ZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7Ci0JfQotCWVsc2UgaWYgKChraWQgPiAwKSAmJiAoa2lkIDw9NCkpCi0JewotCQkvLyBjb3B5IHdlcCBrZXkKLQkJZXJxLT5mbGFncyA9IGtpZCA7CQkJLyogTkI6IGJhc2UgMSAqLwotCQlpZiAoZXJxLT5sZW5ndGggPiBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tpZC0xXS5LZXlMZW4pCi0JCQllcnEtPmxlbmd0aCA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2lkLTFdLktleUxlbjsKLQkJbWVtY3B5KGtleSwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtraWQtMV0uS2V5LCBlcnEtPmxlbmd0aCk7Ci0JCS8vaWYgKChraWQgPT0gcEFkYXB0ZXItPlBvcnRDZmcuRGVmYXVsdEtleUlkKSkKLQkJLy9lcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOwkvKiBYWFggKi8KLQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQotCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsJCS8qIFhYWCAqLwotCQllbHNlCi0JCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOwkJLyogWFhYICovCi0KLQl9Ci0JZWxzZSBpZiAoa2lkID09IDApCi0JewotCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCi0JCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOwkJLyogWFhYICovCi0JCWVsc2UKLQkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CQkvKiBYWFggKi8KLQkJZXJxLT5sZW5ndGggPSBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW47Ci0JCW1lbWNweShrZXksIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwgZXJxLT5sZW5ndGgpOwotCQkvLyBjb3B5IGRlZmF1bHQga2V5IElECi0JCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKLQkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CQkvKiBYWFggKi8KLQkJZWxzZQotCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsJCS8qIFhYWCAqLwotCQllcnEtPmZsYWdzID0gcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgKyAxOwkJCS8qIE5COiBiYXNlIDEgKi8KLQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsJLyogWFhYICovCi0JfQotCi0JcmV0dXJuIDA7Ci0KLX0KLQotc3RhdGljIGludAotcnRfaW9jdGxfc2V0cGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSB2b2lkICp3LCBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyOwotCVBPU19DT09LSUUgcE9iajsKLQlQU1RSSU5HIHRoaXNfY2hhciA9IGV4dHJhOwotCVBTVFJJTkcgdmFsdWU7Ci0JaW50ICBTdGF0dXM9MDsKLQotCXBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKLQl7Ci0JCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7Ci0JCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLwotCQlyZXR1cm4gLUVORVRET1dOOwotCX0KLQotCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkYXB0ZXItPk9TX0Nvb2tpZTsKLQl7Ci0JCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKLSAgICAgICAgcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKLQl9Ci0KLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLQkJCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0JaWYgKCEqdGhpc19jaGFyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCi0JICAgICp2YWx1ZSsrID0gMDsKLQotCWlmICghdmFsdWUgJiYgKHN0cmNtcCh0aGlzX2NoYXIsICJTaXRlU3VydmV5IikgIT0gMCkpCi0JICAgIHJldHVybiAtRUlOVkFMOwotCWVsc2UKLQkJZ290byBTRVRfUFJPQzsKLQotCS8vIHJlamVjdCBzZXR0aW5nIG5vdGhpbmcgYmVzaWRlcyBBTlkgc3NpZChzc2lkTGVuPTApCi0gICAgaWYgKCEqdmFsdWUgJiYgKHN0cmNtcCh0aGlzX2NoYXIsICJTU0lEIikgIT0gMCkpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOwotCi1TRVRfUFJPQzoKLQlmb3IgKFBSVE1QX1BSSVZBVEVfU0VUX1BST0MgPSBSVE1QX1BSSVZBVEVfU1VQUE9SVF9QUk9DOyBQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5uYW1lOyBQUlRNUF9QUklWQVRFX1NFVF9QUk9DKyspCi0JewotCSAgICBpZiAoc3RyY21wKHRoaXNfY2hhciwgUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+bmFtZSkgPT0gMCkKLQkgICAgewotCSAgICAgICAgaWYoIVBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPnNldF9wcm9jKHBBZGFwdGVyLCB2YWx1ZSkpCi0JICAgICAgICB7CS8vRkFMU0U6U2V0IHByaXZhdGUgZmFpbGVkIHRoZW4gcmV0dXJuIEludmFsaWQgYXJndW1lbnQKLQkJCSAgICBTdGF0dXMgPSAtRUlOVkFMOwotCSAgICAgICAgfQotCQkgICAgYnJlYWs7CS8vRXhpdCBmb3IgbG9vcC4KLQkgICAgfQotCX0KLQotCWlmKFBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPm5hbWUgPT0gTlVMTCkKLQl7ICAvL05vdCBmb3VuZCBhcmd1bWVudAotCSAgICBTdGF0dXMgPSAtRUlOVkFMOwotCSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+cnRfaW9jdGxfc2V0cGFyYW06OiAoaXdwcml2KSBOb3QgU3VwcG9ydCBTZXQgQ29tbWFuZCBbJXM9JXNdXG4iLCB0aGlzX2NoYXIsIHZhbHVlKSk7Ci0JfQotCi0gICAgcmV0dXJuIFN0YXR1czsKLX0KLQotCi1zdGF0aWMgaW50Ci1ydF9wcml2YXRlX2dldF9zdGF0aXN0aWNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCXN0cnVjdCBpd19wb2ludCAqd3JxLCBjaGFyICpleHRyYSkKLXsKLQlJTlQJCQkJU3RhdHVzID0gMDsKLSAgICBQUlRNUF9BREFQVEVSICAgcEFkID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQotICAgIGlmIChleHRyYSA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgd3JxLT5sZW5ndGggPSAwOwotICAgICAgICByZXR1cm4gLUVJTzsKLSAgICB9Ci0KLSAgICBtZW1zZXQoZXh0cmEsIDB4MDAsIElXX1BSSVZfU0laRV9NQVNLKTsKLSAgICBzcHJpbnRmKGV4dHJhLCAiXG5cbiIpOwotCi0jaWZkZWYgUkFMSU5LX0FURQotCWlmIChBVEVfT04ocEFkKSkKLQl7Ci0JICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPmF0ZS5UeERvbmVDb3VudCk7Ci0JICAgIC8vc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyB3aXRob3V0IHJldHJ5ICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+YXRlLlR4RG9uZUNvdW50KTsKLQl9Ci0JZWxzZQotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQl7Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCk7Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyB3aXRob3V0IHJldHJ5ICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCAtIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0KTsKLQl9Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyBhZnRlciByZXRyeSAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQpOwotICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IGZhaWwgdG8gUmN2IEFDSyBhZnRlciByZXRyeSAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC5RdWFkUGFydCk7Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlRTIFN1Y2Nlc3MgUmN2IENUUyAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJUU1N1Y2Nlc3NDb3VudC5RdWFkUGFydCk7Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlRTIEZhaWwgUmN2IENUUyAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJUU0ZhaWx1cmVDb3VudC5RdWFkUGFydCk7Ci0KLSAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0KTsKLSAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCB3aXRoIENSQyAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC5RdWFkUGFydCk7Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUnggZHJvcCBkdWUgdG8gb3V0IG9mIHJlc291cmNlICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIpOwotICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IGR1cGxpY2F0ZSBmcmFtZSAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LlF1YWRQYXJ0KTsKLQotICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIkZhbHNlIENDQSAob25lIHNlY29uZCkgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0ZhbHNlQ0NBQ250KTsKLQotI2lmZGVmIFJBTElOS19BVEUKLQlpZiAoQVRFX09OKHBBZCkpCi0JewotCQlpZiAocEFkLT5hdGUuUnhBbnRlbm5hU2VsID09IDApCi0JCXsKLQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1BICAgICAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMCAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKLQkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQiAoaWYgYXZhaWxhYmxlKSAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPmF0ZS5MYXN0UnNzaTEgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7Ci0JCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUMgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG5cbiIsIChMT05HKShwQWQtPmF0ZS5MYXN0UnNzaTIgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPmF0ZS5MYXN0UnNzaTAgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7Ci0JCX0KLQl9Ci0JZWxzZQotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQl7Ci0Jc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1BICAgICAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOwotICAgICAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUIgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7Ci0gICAgICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQyAoaWYgYXZhaWxhYmxlKSAgICAgICAgICAgPSAlbGRcblxuIiwgKExPTkcpKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOwotCX0KLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiV3BhU3VwcGxpY2FudFVQICAgICAgICAgICAgICAgICA9ICVkXG5cbiIsIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCk7Ci0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0KLQotICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJwotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBydF9wcml2YXRlX2dldF9zdGF0aXN0aWNzLCB3cnEtPmxlbmd0aCA9ICVkXG4iLCB3cnEtPmxlbmd0aCkpOwotCi0gICAgcmV0dXJuIFN0YXR1czsKLX0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotdm9pZAlnZXRCYUluZm8oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCXBPdXRCdWYpCi17Ci0JSU5UIGksIGo7Ci0JQkFfT1JJX0VOVFJZICpwT3JpQkFFbnRyeTsKLQlCQV9SRUNfRU5UUlkgKnBSZWNCQUVudHJ5OwotCi0JZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKLQl7Ci0JCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07Ci0JCWlmICgoKHBFbnRyeS0+VmFsaWRBc0NMSSB8fCBwRW50cnktPlZhbGlkQXNBcENsaSkgJiYgKHBFbnRyeS0+U3N0ID09IFNTVF9BU1NPQykpCi0JCQl8fCAocEVudHJ5LT5WYWxpZEFzV0RTKSB8fCAocEVudHJ5LT5WYWxpZEFzTWVzaCkpCi0JCXsKLQkJCXNwcmludGYocE91dEJ1ZiwgIiVzXG4lMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCAoQWlkID0gJWQpIChBUCkgLVxuIiwKLSAgICAgICAgICAgICAgICBwT3V0QnVmLAotCQkJCXBFbnRyeS0+QWRkclswXSwgcEVudHJ5LT5BZGRyWzFdLCBwRW50cnktPkFkZHJbMl0sCi0JCQkJcEVudHJ5LT5BZGRyWzNdLCBwRW50cnktPkFkZHJbNF0sIHBFbnRyeS0+QWRkcls1XSwgcEVudHJ5LT5BaWQpOwotCi0JCQlzcHJpbnRmKHBPdXRCdWYsICIlc1tSZWNpcGllbnRdXG4iLCBwT3V0QnVmKTsKLQkJCWZvciAoaj0wOyBqIDwgTlVNX09GX1RJRDsgaisrKQotCQkJewotCQkJCWlmIChwRW50cnktPkJBUmVjV2NpZEFycmF5W2pdICE9IDApCi0JCQkJewotCQkJCQlwUmVjQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W3BFbnRyeS0+QkFSZWNXY2lkQXJyYXlbal1dOwotCQkJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1RJRD0lZCwgQkFXaW5TaXplPSVkLCBMYXN0SW5kU2VxPSVkLCBSZW9yZGVyaW5nUGt0cz0lZFxuIiwgcE91dEJ1ZiwgaiwgcFJlY0JBRW50cnktPkJBV2luU2l6ZSwgcFJlY0JBRW50cnktPkxhc3RJbmRTZXEsIHBSZWNCQUVudHJ5LT5saXN0LnFsZW4pOwotCQkJCX0KLQkJCX0KLQkJCXNwcmludGYocE91dEJ1ZiwgIiVzXG4iLCBwT3V0QnVmKTsKLQotCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNbT3JpZ2luYXRvcl1cbiIsIHBPdXRCdWYpOwotCQkJZm9yIChqPTA7IGogPCBOVU1fT0ZfVElEOyBqKyspCi0JCQl7Ci0JCQkJaWYgKHBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbal0gIT0gMCkKLQkJCQl7Ci0JCQkJCXBPcmlCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtqXV07Ci0JCQkJCXNwcmludGYocE91dEJ1ZiwgIiVzVElEPSVkLCBCQVdpblNpemU9JWQsIFN0YXJ0U2VxPSVkLCBDdXJUeFNlcT0lZFxuIiwgcE91dEJ1ZiwgaiwgcE9yaUJBRW50cnktPkJBV2luU2l6ZSwgcE9yaUJBRW50cnktPlNlcXVlbmNlLCBwRW50cnktPlR4U2VxW2pdKTsKLQkJCQl9Ci0JCQl9Ci0JCQlzcHJpbnRmKHBPdXRCdWYsICIlc1xuXG4iLCBwT3V0QnVmKTsKLQkJfQotICAgICAgICBpZiAoc3RybGVuKHBPdXRCdWYpID4gKElXX1BSSVZfU0laRV9NQVNLIC0gMzApKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCX0KLQotCXJldHVybjsKLX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotc3RhdGljIGludAotcnRfcHJpdmF0ZV9zaG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCXN0cnVjdCBpd19wb2ludCAqd3JxLCBQU1RSSU5HIGV4dHJhKQotewotCUlOVAkJCQlTdGF0dXMgPSAwOwotCVBSVE1QX0FEQVBURVIgICBwQWQ7Ci0JUE9TX0NPT0tJRQkJcE9iajsKLQl1MzIgICAgICAgICAgICAgc3ViY21kID0gd3JxLT5mbGFnczsKLQotCXBBZCA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0JaWYgKHBBZCA9PSBOVUxMKQotCXsKLQkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKLQkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCi0JCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0JcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQlpZiAoZXh0cmEgPT0gTlVMTCkKLQl7Ci0JCXdycS0+bGVuZ3RoID0gMDsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCW1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOwotCi0JewotCQlwT2JqLT5pb2N0bF9pZl90eXBlID0gSU5UX01BSU47Ci0JCXBPYmotPmlvY3RsX2lmID0gTUFJTl9NQlNTSUQ7Ci0JfQotCi0gICAgc3dpdGNoKHN1YmNtZCkKLSAgICB7Ci0KLSAgICAgICAgY2FzZSBTSE9XX0NPTk5fU1RBVFVTOgotICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkKSkKLSAgICAgICAgICAgIHsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSAgICAgICAgICAgICAgICBpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCi0gICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVykKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIk1vbml0b3IgTW9kZShDZW50cmFsQ2hhbm5lbCAlZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0gICAgICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJNb25pdG9yIE1vZGUoQ2hhbm5lbCAlZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9PSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZCkKLQkJewotCQkgICAgaWYgKElORlJBX09OKHBBZCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIkNvbm5lY3RlZChBUDogJXNbJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhdKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbNV0pOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiU3NpZD0lcyAsU3NpZGxlbiA9ICVkXG4iLHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pKTsKLQkJfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBREhPQ19PTihwQWQpKQotICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIkNvbm5lY3RlZFxuIik7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCSAgICBzcHJpbnRmKGV4dHJhLCAiRGlzY29ubmVjdGVkXG4iKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIkNvbm5TdGF0dXMgaXMgbm90IGNvbm5lY3RlZFxuIikpOwotCQl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNIT1dfRFJWSUVSX1ZFUklPTjoKLSAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJEcml2ZXIgdmVyc2lvbi0lcywgJXMgJXNcbiIsIFNUQV9EUklWRVJfVkVSU0lPTiwgX19EQVRFX18sIF9fVElNRV9fICk7Ci0gICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKLSAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotICAgICAgICBjYXNlIFNIT1dfQkFfSU5GTzoKLSAgICAgICAgICAgIGdldEJhSW5mbyhwQWQsIGV4dHJhKTsKLSAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJwotICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCWNhc2UgU0hPV19ERVNDX0lORk86Ci0JCQl7Ci0JCQkJU2hvd19EZXNjSW5mb19Qcm9jKHBBZCwgTlVMTCk7Ci0JCQkJd3JxLT5sZW5ndGggPSAwOyAvLyAxOiBzaXplIG9mICdcMCcKLQkJCX0KLQkJCWJyZWFrOwotICAgICAgICBjYXNlIFJBSU9fT0ZGOgotICAgICAgICAgICAgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQotCQkgICAgICAgIHsKLQkJICAgICAgICAgICAgUlRNUF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkKTsKLQkJICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOwotCQkgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvID0gRkFMU0U7Ci0gICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvICE9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlJhZGlvID0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKTsKLSAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTWxtZVJhZGlvT2ZmKHBBZCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgotCQkJCQlwQWQtPkV4dHJhSW5mbyA9IFNXX1JBRElPX09GRjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiUmFkaW8gT2ZmXG4iKTsKLSAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUkFJT19PTjoKLSAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvID0gVFJVRTsKLSAgICAgICAgICAgIC8vaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyAhPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJSYWRpbyA9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbyk7Ci0gICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTWxtZVJhZGlvT24ocEFkKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCi0JCQkJCXBBZC0+RXh0cmFJbmZvID0gRVhUUkFfSU5GT19DTEVBUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiUmFkaW8gT25cbiIpOwotICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCi0gICAgICAgICAgICBicmVhazsKLQotCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCWNhc2UgU0hPV19ETFNfRU5UUllfSU5GTzoKLQkJCXsKLQkJCQlTZXRfRGxzRW50cnlJbmZvX0Rpc3BsYXlfUHJvYyhwQWQsIE5VTEwpOwotCQkJCXdycS0+bGVuZ3RoID0gMDsgLy8gMTogc2l6ZSBvZiAnXDAnCi0JCQl9Ci0JCQlicmVhazsKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQotCQljYXNlIFNIT1dfQ0ZHX1ZBTFVFOgotCQkJewotCQkJCVN0YXR1cyA9IFJUTVBTaG93Q2ZnVmFsdWUocEFkLCAoUFNUUklORykgd3JxLT5wb2ludGVyLCBleHRyYSk7Ci0JCQkJaWYgKFN0YXR1cyA9PSAwKQotCQkJCQl3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFNIT1dfQURIT0NfRU5UUllfSU5GTzoKLQkJCVNob3dfQWRob2NfTWFjVGFibGVfUHJvYyhwQWQsIGV4dHJhKTsKLQkJCXdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJwotCQkJYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAtIHVua25vdyBzdWJjbWQgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBzdWJjbWQpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBTdGF0dXM7Ci19Ci0KLSNpZmRlZiBTSU9DU0lXTUxNRQotaW50IHJ0X2lvY3RsX3Npd21sbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAotCQkJICAgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiAgIHBBZCA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0Jc3RydWN0IGl3X21sbWUgKnBNbG1lID0gKHN0cnVjdCBpd19tbG1lICopd3JxdS0+ZGF0YS5wb2ludGVyOwotCU1MTUVfUVVFVUVfRUxFTQkJCQlNc2dFbGVtOwotCU1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVAlEaXNBc3NvY1JlcTsKLQlNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICAgICAgRGVBdXRoUmVxOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXNcbiIsIF9fRlVOQ1RJT05fXykpOwotCi0JaWYgKHBNbG1lID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3dpdGNoKHBNbG1lLT5jbWQpCi0JewotI2lmZGVmIElXX01MTUVfREVBVVRICi0JCWNhc2UgSVdfTUxNRV9ERUFVVEg6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIElXX01MTUVfREVBVVRIXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJCUNPUFlfTUFDX0FERFIoRGVBdXRoUmVxLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJCURlQXV0aFJlcS5SZWFzb24gPSBwTWxtZS0+cmVhc29uX2NvZGU7Ci0JCQlNc2dFbGVtLk1zZ0xlbiA9IHNpemVvZihNTE1FX0RFQVVUSF9SRVFfU1RSVUNUKTsKLQkJCU5kaXNNb3ZlTWVtb3J5KE1zZ0VsZW0uTXNnLCAmRGVBdXRoUmVxLCBzaXplb2YoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCkpOwotCQkJTWxtZURlYXV0aFJlcUFjdGlvbihwQWQsICZNc2dFbGVtKTsKLQkJCWlmIChJTkZSQV9PTihwQWQpKQotCQkJewotCQkJICAgIExpbmtEb3duKHBBZCwgRkFMU0UpOwotCQkJICAgIHBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKLQkJCX0KLQkJCWJyZWFrOwotI2VuZGlmIC8vIElXX01MTUVfREVBVVRIIC8vCi0jaWZkZWYgSVdfTUxNRV9ESVNBU1NPQwotCQljYXNlIElXX01MTUVfRElTQVNTT0M6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIElXX01MTUVfRElTQVNTT0NcbiIsIF9fRlVOQ1RJT05fXykpOwotCQkJQ09QWV9NQUNfQUREUihEaXNBc3NvY1JlcS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQlEaXNBc3NvY1JlcS5SZWFzb24gPSAgcE1sbWUtPnJlYXNvbl9jb2RlOwotCi0JCQlNc2dFbGVtLk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOwotCQkJTXNnRWxlbS5Nc2dUeXBlID0gTVQyX01MTUVfRElTQVNTT0NfUkVROwotCQkJTXNnRWxlbS5Nc2dMZW4gPSBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKTsKLQkJCU5kaXNNb3ZlTWVtb3J5KE1zZ0VsZW0uTXNnLCAmRGlzQXNzb2NSZXEsIHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpKTsKLQotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfRElTQVNTT0M7Ci0JCQlNbG1lRGlzYXNzb2NSZXFBY3Rpb24ocEFkLCAmTXNnRWxlbSk7Ci0JCQlicmVhazsKLSNlbmRpZiAvLyBJV19NTE1FX0RJU0FTU09DIC8vCi0JCWRlZmF1bHQ6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIFVua25vdyBDb21tYW5kXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybiAwOwotfQotI2VuZGlmIC8vIFNJT0NTSVdNTE1FIC8vCi0KLSNpZiBXSVJFTEVTU19FWFQgPiAxNwotaW50IHJ0X2lvY3RsX3Npd2F1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQlzdHJ1Y3QgaXdfcGFyYW0gKnBhcmFtID0gJndycXUtPnBhcmFtOwotCi0gICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLQlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0JcmV0dXJuIC1FTkVURE9XTjsKLQl9Ci0Jc3dpdGNoIChwYXJhbS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7Ci0JY2FzZSBJV19BVVRIX1dQQV9WRVJTSU9OOgotICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOwotCQkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQotCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQTIpCi0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7Ci0KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9WRVJTSU9OIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0JY2FzZSBJV19BVVRIX0NJUEhFUl9QQUlSV0lTRToKLSAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfTk9ORSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQNDAgfHwKLSAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVAxMDQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfVEtJUCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9DQ01QKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0JY2FzZSBJV19BVVRIX0NJUEhFUl9HUk9VUDoKLSAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfTk9ORSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDQwIHx8Ci0gICAgICAgICAgICAgICAgICAgICBwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQMTA0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9US0lQKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX0NDTVApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9DSVBIRVJfR1JPVVAgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7Ci0gICAgICAgICAgICBicmVhazsKLQljYXNlIElXX0FVVEhfS0VZX01HTVQ6Ci0gICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfS0VZX01HTVRfODAyXzFYKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7Ci0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7Ci0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLSAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgLy8gV0VQIDF4Ci0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gVFJVRTsKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0tFWV9NR01UIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0JY2FzZSBJV19BVVRIX1JYX1VORU5DUllQVEVEX0VBUE9MOgotICAgICAgICAgICAgYnJlYWs7Ci0JY2FzZSBJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRDoKLSAgICAgICAgICAgIC8qaWYgKHBhcmFtLT52YWx1ZSA9PSAwKQotCQkJewotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQkJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0gICAgICAgICAgICB9Ki8KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKLQkJYnJlYWs7Ci0JY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6Ci0gICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlICE9IDApCi0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKLQkJCWVsc2UKLQkJCXsKLSAgICAgICAgICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKLQkJCX0KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9WRVJTSU9OIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOwotCQlicmVhazsKLQljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6Ci0JCQlpZiAocGFyYW0tPnZhbHVlICYgSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSkKLSAgICAgICAgICAgIHsKLQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOwotCQkJfQotICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlICYgSVdfQVVUSF9BTEdfT1BFTl9TWVNURU0pCi0gICAgICAgICAgICB7Ci0JCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47Ci0JCQl9Ci0gICAgICAgICAgICBlbHNlCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF84MDIxMV9BVVRIX0FMRyAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKLQkJCWJyZWFrOwotCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX0VOQUJMRUQgLSBEcml2ZXIgc3VwcG9ydHMgV1BBIShwYXJhbS0+dmFsdWUgPSAlZClcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKLX0KLQotCXJldHVybiAwOwotfQotCi1pbnQgcnRfaW9jdGxfZ2l3YXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQlzdHJ1Y3QgaXdfcGFyYW0gKnBhcmFtID0gJndycXUtPnBhcmFtOwotCi0gICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLQlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0gICAgewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0JcmV0dXJuIC1FTkVURE9XTjsKLSAgICB9Ci0KLQlzd2l0Y2ggKHBhcmFtLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKLQljYXNlIElXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRDoKLSAgICAgICAgcGFyYW0tPnZhbHVlID0gKHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkgPyAwIDogMTsKLQkJYnJlYWs7Ci0KLQljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6Ci0gICAgICAgIHBhcmFtLT52YWx1ZSA9IChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkgPyBJV19BVVRIX0FMR19TSEFSRURfS0VZIDogSVdfQVVUSF9BTEdfT1BFTl9TWVNURU07Ci0JCWJyZWFrOwotCi0JY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgotCQlwYXJhbS0+dmFsdWUgPSAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpID8gMSA6IDA7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCX0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9naXdhdXRoOjpwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIHBhcmFtLT52YWx1ZSkpOwotCXJldHVybiAwOwotfQotCi12b2lkIGZuU2V0Q2lwaGVyS2V5KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIElOVCAgICAgICAgICAgICBrZXlJZHgsCi0gICAgSU4gIFVDSEFSICAgICAgICAgICBDaXBoZXJBbGcsCi0gICAgSU4gIEJPT0xFQU4gICAgICAgICBiR1RLLAotICAgIElOICBzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0KQotewotICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0sIHNpemVvZihDSVBIRVJfS0VZKSk7Ci0gICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IExFTl9US0lQX0VLOwotICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dC0+a2V5LCBMRU5fVEtJUF9FSyk7Ci0gICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlR4TWljLCBleHQtPmtleSArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOwotICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5SeE1pYywgZXh0LT5rZXkgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKLSAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCi0gICAgLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKLQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCi0JCQkJCQkgIEJTUzAsCi0JCQkJCQkgIGtleUlkeCwKLQkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywKLQkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwKLQkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlR4TWljLAotCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uUnhNaWMpOwotCi0gICAgaWYgKGJHVEspCi0gICAgICAgIC8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQotCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsCi0JCQkJCQkJICBCU1MwLAotCQkJCQkJCSAga2V5SWR4LAotCQkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywKLQkJCQkJCQkgIE5VTEwpOwotICAgIGVsc2UKLSAgICAgICAgLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCi0JUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwKLQkJCQkJCQkgIEJTUzAsCi0JCQkJCQkJICBrZXlJZHgsCi0JCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLAotCQkJCQkJCSAgJnBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSk7Ci19Ci0KLWludCBydF9pb2N0bF9zaXdlbmNvZGVleHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAotCQkJICAgY2hhciAqZXh0cmEpCi0JCQl7Ci0gICAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQlzdHJ1Y3QgaXdfcG9pbnQgKmVuY29kaW5nID0gJndycXUtPmVuY29kaW5nOwotCXN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQgPSAoc3RydWN0IGl3X2VuY29kZV9leHQgKilleHRyYTsKLSAgICBpbnQga2V5SWR4LCBhbGcgPSBleHQtPmFsZzsKLQotICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0JaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0gICAgaWYgKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkKLQl7Ci0gICAgICAgIGtleUlkeCA9IChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKLSAgICAgICAgLy8gc2V0IEJTU0lEIHdjaWQgZW50cnkgb2YgdGhlIFBhaXItd2lzZSBLZXkgdGFibGUgYXMgbm8tc2VjdXJpdHkgbW9kZQotCSAgICBBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShwQWRhcHRlciwgQlNTMCwgQlNTSURfV0NJRCk7Ci0gICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSAwOwotCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0JCUFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwgMCwgKFVDSEFSKWtleUlkeCk7Ci0gICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0sIHNpemVvZihDSVBIRVJfS0VZKSk7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpSZW1vdmUgYWxsIGtleXMhKGVuY29kaW5nLT5mbGFncyA9ICV4KVxuIiwgX19GVU5DVElPTl9fLCBlbmNvZGluZy0+ZmxhZ3MpKTsKLSAgICB9Ci0JCQkJCWVsc2UKLSAgICB7Ci0gICAgICAgIC8vIEdldCBLZXkgSW5kZXggYW5kIGNvbnZldCB0byBvdXIgb3duIGRlZmluZWQga2V5IGluZGV4Ci0Ja2V5SWR4ID0gKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOwotCWlmKChrZXlJZHggPCAwKSB8fCAoa2V5SWR4ID49IE5SX1dFUF9LRVlTKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLSAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IGtleUlkeDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpEZWZhdWx0S2V5SWQgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChhbGcpIHsKLQkJY2FzZSBJV19FTkNPREVfQUxHX05PTkU6Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfTk9ORVxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBJV19FTkNPREVfQUxHX1dFUDoKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19XRVAgLSBleHQtPmtleV9sZW4gPSAlZCwga2V5SWR4ID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgZXh0LT5rZXlfbGVuLCBrZXlJZHgpKTsKLQkJCWlmIChleHQtPmtleV9sZW4gPT0gTUFYX1dFUF9LRVlfU0laRSkKLSAgICAgICAgICAgICAgICB7Ci0JCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1BWF9XRVBfS0VZX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotCQkJCX0KLQkJCWVsc2UgaWYgKGV4dC0+a2V5X2xlbiA9PSBNSU5fV0VQX0tFWV9TSVpFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1JTl9XRVBfS0VZX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0JCQl9Ci0JCQllbHNlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotCi0gICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgIDE2KTsKLQkJCSAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCBleHQtPmtleSwgZXh0LT5rZXlfbGVuKTsKLQotCQkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCB8fAotCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQpCi0JCQkJewotCQkJCQkvLyBTZXQgR3JvdXAga2V5IG1hdGVyaWFsIHRvIEFzaWMKLQkJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBrZXlJZHgsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIE5VTEwsIE5VTEwpOwotCQkJCQkvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGdyb3VwIGtleSB0YWJsZQotCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBrZXlJZHgsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcsIE5VTEwpOwotCQkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKLQkJCQkJLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKLQkJCQkJcEFkYXB0ZXItPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwotCQkJCX0KLQkJCWJyZWFrOwotICAgICAgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX1RLSVA6Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfVEtJUCAtIGtleUlkeCA9ICVkLCBleHQtPmtleV9sZW4gPSAlZFxuIiwgX19GVU5DVElPTl9fLCBrZXlJZHgsIGV4dC0+a2V5X2xlbikpOwotICAgICAgICAgICAgICAgIGlmIChleHQtPmtleV9sZW4gPT0gMzIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9US0lQLCBGQUxTRSwgZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCQl9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9US0lQLCBUUlVFLCBleHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAotCQkgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOwotCQkgICAgICAgIFNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOwotCQkgICAgICAgIHBBZGFwdGVyLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX0NDTVA6Ci0gICAgICAgICAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQotCQl7Ci0gICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9BRVMsIEZBTFNFLCBleHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQotCQkJLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7Ci0JCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKLQkJCXBBZGFwdGVyLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX0dST1VQX0tFWSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9BRVMsIFRSVUUsIGV4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKLQkJICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQkJICAgICAgICBTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKLQkJICAgICAgICBwQWRhcHRlci0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50Ci1ydF9pb2N0bF9naXdlbmNvZGVleHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihkZXYpOwotCVBDSEFSIHBLZXkgPSBOVUxMOwotCXN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcgPSAmd3JxdS0+ZW5jb2Rpbmc7Ci0Jc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOwotCWludCBpZHgsIG1heF9rZXlfbGVuOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PiBydF9pb2N0bF9naXdlbmNvZGVleHRcbiIpKTsKLQotCW1heF9rZXlfbGVuID0gZW5jb2RpbmctPmxlbmd0aCAtIHNpemVvZigqZXh0KTsKLQlpZiAobWF4X2tleV9sZW4gPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlkeCA9IGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKLQlpZiAoaWR4KQotCXsKLQkJaWYgKGlkeCA8IDEgfHwgaWR4ID4gNCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZHgtLTsKLQotCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAotCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkKLQkJewotCQkJaWYgKGlkeCAhPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQpCi0JCQl7Ci0JCQkJZXh0LT5rZXlfbGVuID0gMDsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JCWlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKLQotCWVuY29kaW5nLT5mbGFncyA9IGlkeCArIDE7Ci0JbWVtc2V0KGV4dCwgMCwgc2l6ZW9mKCpleHQpKTsKLQotCWV4dC0+a2V5X2xlbiA9IDA7Ci0Jc3dpdGNoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykgewotCQljYXNlIE5kaXM4MDJfMTFXRVBEaXNhYmxlZDoKLQkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19OT05FOwotCQkJZW5jb2RpbmctPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKLQkJCWJyZWFrOwotCQljYXNlIE5kaXM4MDJfMTFXRVBFbmFibGVkOgotCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX1dFUDsKLQkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA+IG1heF9rZXlfbGVuKQotCQkJCXJldHVybiAtRTJCSUc7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJZXh0LT5rZXlfbGVuID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW47Ci0JCQkJcEtleSA9IChQQ0hBUikmKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5WzBdKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ6Ci0JCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDoKLQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLQkJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfVEtJUDsKLQkJCWVsc2UKLQkJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfQ0NNUDsKLQotCQkJaWYgKG1heF9rZXlfbGVuIDwgMzIpCi0JCQkJcmV0dXJuIC1FMkJJRzsKLQkJCWVsc2UKLQkJCXsKLQkJCQlleHQtPmtleV9sZW4gPSAzMjsKLQkJCQlwS2V5ID0gKFBDSEFSKSZwQWQtPlN0YUNmZy5QTUtbMF07Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChleHQtPmtleV9sZW4gJiYgcEtleSkKLQl7Ci0JCWVuY29kaW5nLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsKLQkJbWVtY3B5KGV4dC0+a2V5LCBwS2V5LCBleHQtPmtleV9sZW4pOwotCX0KLQotCXJldHVybiAwOwotfQotCi0jaWZkZWYgU0lPQ1NJV0dFTklFCi1pbnQgcnRfaW9jdGxfc2l3Z2VuaWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiAgIHBBZCA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT0+IHJ0X2lvY3RsX3Npd2dlbmllXG4iKSk7Ci0jaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQlwQWQtPlN0YUNmZy5iUlNOX0lFX0Zyb21XcGFTdXBwbGljYW50ID0gRkFMU0U7Ci0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPiBNQVhfTEVOX09GX1JTTklFIHx8Ci0JICAgICh3cnF1LT5kYXRhLmxlbmd0aCAmJiBleHRyYSA9PSBOVUxMKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAod3JxdS0+ZGF0YS5sZW5ndGgpCi0JewotCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4gPSB3cnF1LT5kYXRhLmxlbmd0aDsKLQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgZXh0cmEsIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7Ci0jaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQkJcEFkLT5TdGFDZmcuYlJTTl9JRV9Gcm9tV3BhU3VwcGxpY2FudCA9IFRSVUU7Ci0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5TdGFDZmcuUlNOSUVfTGVuID0gMDsKLQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgTUFYX0xFTl9PRl9SU05JRSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLy8gU0lPQ1NJV0dFTklFIC8vCi0KLWludCBydF9pb2N0bF9naXdnZW5pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiAgIHBBZCA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0KLQlpZiAoKHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9PSAwKSB8fAotCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpKQotCXsKLQkJd3JxdS0+ZGF0YS5sZW5ndGggPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0KLSNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotI2lmZGVmIFNJT0NTSVdHRU5JRQotCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQotCXsKLQlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pCi0JCXJldHVybiAtRTJCSUc7Ci0KLQl3cnF1LT5kYXRhLmxlbmd0aCA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKLQltZW1jcHkoZXh0cmEsICZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7Ci0JfQotCWVsc2UKLSNlbmRpZiAvLyBTSU9DU0lXR0VOSUUgLy8KLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCXsKLQkJVUNIQVIgUlNOSWUgPSBJRV9XUEE7Ci0KLQkJaWYgKHdycXUtPmRhdGEubGVuZ3RoIDwgKHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDIpKSAvLyBJRCwgTGVuCi0JCQlyZXR1cm4gLUUyQklHOwotCQl3cnF1LT5kYXRhLmxlbmd0aCA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDI7Ci0KLQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB8fAotICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpKQotCQkJUlNOSWUgPSBJRV9SU047Ci0KLQkJZXh0cmFbMF0gPSAoY2hhcilSU05JZTsKLQkJZXh0cmFbMV0gPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47Ci0JCW1lbWNweShleHRyYSsyLCAmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOwotCX0KLQotCXJldHVybiAwOwotfQotCi1pbnQgcnRfaW9jdGxfc2l3cG1rc2Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAotCQkJICAgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiAgIHBBZCA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0Jc3RydWN0IGl3X3Bta3NhICpwUG1rc2EgPSAoc3RydWN0IGl3X3Bta3NhICopd3JxdS0+ZGF0YS5wb2ludGVyOwotCUlOVAlDYWNoZWRJZHggPSAwLCBpZHggPSAwOwotCi0JaWYgKHBQbWtzYSA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PT4gcnRfaW9jdGxfc2l3cG1rc2FcbiIpKTsKLQlzd2l0Y2gocFBta3NhLT5jbWQpCi0JewotCQljYXNlIElXX1BNS1NBX0ZMVVNIOgotCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUssIHNpemVvZihCU1NJRF9JTkZPKSpQTUtJRF9OTyk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJydF9pb2N0bF9zaXdwbWtzYSAtIElXX1BNS1NBX0ZMVVNIXG4iKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBJV19QTUtTQV9SRU1PVkU6Ci0JCQlmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtOyBDYWNoZWRJZHgrKykKLQkJCXsKLQkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAotCQkgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocFBta3NhLT5ic3NpZC5zYV9kYXRhLCBwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pKQotCQkgICAgICAgIHsKLQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pOwotCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLlBNS0lELCAxNik7Ci0JCQkJCWZvciAoaWR4ID0gQ2FjaGVkSWR4OyBpZHggPCAocEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW0gLSAxKTsgaWR4KyspCi0JCQkJCXsKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHhdLkJTU0lEWzBdLCAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4KzFdLkJTU0lEWzBdLCBNQUNfQUREUl9MRU4pOwotCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeF0uUE1LSURbMF0sICZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHgrMV0uUE1LSURbMF0sIDE2KTsKLQkJCQkJfQotCQkJCQlwQWQtPlN0YUNmZy5TYXZlZFBNS051bS0tOwotCQkJICAgICAgICBicmVhazsKLQkJICAgICAgICB9Ci0JICAgICAgICB9Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfUkVNT1ZFXG4iKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBJV19QTUtTQV9BREQ6Ci0JCQlmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtOyBDYWNoZWRJZHgrKykKLQkJCXsKLQkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAotCQkgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocFBta3NhLT5ic3NpZC5zYV9kYXRhLCBwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pKQotCQkJICAgICAgICBicmVhazsKLQkgICAgICAgIH0KLQotCSAgICAgICAgLy8gRm91bmQsIHJlcGxhY2UgaXQKLQkgICAgICAgIGlmIChDYWNoZWRJZHggPCBQTUtJRF9OTykKLQkgICAgICAgIHsKLQkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIFBNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7Ci0JCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSURbMF0sIHBQbWtzYS0+YnNzaWQuc2FfZGF0YSwgTUFDX0FERFJfTEVOKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5QTUtJRFswXSwgcFBta3NhLT5wbWtpZCwgMTYpOwotCQkgICAgICAgIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtKys7Ci0JICAgICAgICB9Ci0JICAgICAgICAvLyBOb3QgZm91bmQsIHJlcGxhY2UgdGhlIGxhc3Qgb25lCi0JICAgICAgICBlbHNlCi0JICAgICAgICB7Ci0JCSAgICAgICAgLy8gUmFuZG9tbHkgcmVwbGFjZSBvbmUKLQkJICAgICAgICBDYWNoZWRJZHggPSAocFBta3NhLT5ic3NpZC5zYV9kYXRhWzVdICUgUE1LSURfTk8pOwotCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJVcGRhdGUgUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKLQkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRFswXSwgcFBta3NhLT5ic3NpZC5zYV9kYXRhLCBNQUNfQUREUl9MRU4pOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLlBNS0lEWzBdLCBwUG1rc2EtPnBta2lkLCAxNik7Ci0JICAgICAgICB9Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfQUREXG4iKSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gVW5rbm93IENvbW1hbmQhIVxuIikpOwotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLy8gI2lmIFdJUkVMRVNTX0VYVCA+IDE3Ci0KLSNpZmRlZiBEQkcKLXN0YXRpYyBpbnQKLXJ0X3ByaXZhdGVfaW9jdGxfYmJwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCXN0cnVjdCBpd19wb2ludCAqd3JxLCBjaGFyICpleHRyYSkKLQkJCXsKLQlQU1RSSU5HCQkJCXRoaXNfY2hhcjsKLQlQU1RSSU5HCQkJCXZhbHVlID0gTlVMTDsKLQlVQ0hBUgkJCQlyZWdCQlAgPSAwOwotLy8JQ0hBUgkJCQlhcmdbMjU1XT17MH07Ci0JVUlOVDMyCQkJCWJicElkOwotCVVJTlQzMgkJCQliYnBWYWx1ZTsKLQlCT09MRUFOCQkJCWJJc1ByaW50QWxsQkJQID0gRkFMU0U7Ci0JSU5UCQkJCQlTdGF0dXMgPSAwOwotICAgIFBSVE1QX0FEQVBURVIgICAgICAgcEFkYXB0ZXIgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihkZXYpOwotCi0KLQltZW1zZXQoZXh0cmEsIDB4MDAsIElXX1BSSVZfU0laRV9NQVNLKTsKLQotCWlmICh3cnEtPmxlbmd0aCA+IDEpIC8vTm8gcGFyYW1ldGVycy4KLQkJCQl7Ci0JCXNwcmludGYoZXh0cmEsICJcbiIpOwotCi0JCS8vUGFyc2luZyBSZWFkIG9yIFdyaXRlCi0JCXRoaXNfY2hhciA9IHdycS0+cG9pbnRlcjsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgidGhpc19jaGFyPSVzXG4iLCB0aGlzX2NoYXIpKTsKLQkJaWYgKCEqdGhpc19jaGFyKQotCQkJZ290byBuZXh0OwotCi0JCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCi0JCQkqdmFsdWUrKyA9IDA7Ci0KLQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKQotCQl7IC8vUmVhZAotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgidGhpc19jaGFyPSVzLCB2YWx1ZT0lc1xuIiwgdGhpc19jaGFyLCB2YWx1ZSkpOwotCQkJaWYgKHNzY2FuZih0aGlzX2NoYXIsICIlZCIsICYoYmJwSWQpKSA9PSAxKQotCQkJewotCQkJCWlmIChiYnBJZCA8PSBNQVhfQkJQX0lEKQotCQkJCXsKLSNpZmRlZiBSQUxJTktfQVRFCi0JCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQotCQkJCQl7Ci0JCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOwotCQkJCQl9Ci0JCQkJCWVsc2UKLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0JCQkJCXsKLQkJCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7Ci0JCQkJCX0KLQkJCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUiUwMmRbMHglMDJYXTolMDJYXG4iLCBiYnBJZCwgYmJwSWQsIHJlZ0JCUCk7Ci0gICAgICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJtc2c9JXNcbiIsIGV4dHJhKSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAotCQkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7Ci0JCQkJCWdvdG8gbmV4dDsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7IC8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKLQkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7Ci0JCQkJZ290byBuZXh0OwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJeyAvL1dyaXRlCi0JCQlpZiAoKHNzY2FuZih0aGlzX2NoYXIsICIlZCIsICYoYmJwSWQpKSA9PSAxKSAmJiAoc3NjYW5mKHZhbHVlLCAiJXgiLCAmKGJicFZhbHVlKSkgPT0gMSkpCi0JCQl7Ci0JCQkJaWYgKGJicElkIDw9IE1BWF9CQlBfSUQpCi0JCQkJewotI2lmZGVmIFJBTElOS19BVEUKLQkJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCi0JCQkJCXsKLQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsIGJicFZhbHVlKTsKLQkJCQkJCS8qIHJlYWQgaXQgYmFjayBmb3Igc2hvd2luZyAqLwotCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKLQkJCQkJfQotCQkJCQllbHNlCi0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCQkJCQl7Ci0JCQkJCSAgICBSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgYmJwVmFsdWUpOwotCQkJCQkvKiByZWFkIGl0IGJhY2sgZm9yIHNob3dpbmcgKi8KLQkJCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7Ci0JCQl9Ci0JCQkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlIlMDJkWzB4JTAyWF06JTAyWFxuIiwgYmJwSWQsIGJicElkLCByZWdCQlApOwotICAgICAgICAgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgibXNnPSVzXG4iLCBleHRyYSkpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJey8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKLQkJCQkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOwotCQkJCQlnb3RvIG5leHQ7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJeyAvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCi0JCQkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOwotCQkJCWdvdG8gbmV4dDsKLQkJCX0KLQkJfQotCQl9Ci0JZWxzZQotCQliSXNQcmludEFsbEJCUCA9IFRSVUU7Ci0KLW5leHQ6Ci0JaWYgKGJJc1ByaW50QWxsQkJQKQotCXsKLQkJbWVtc2V0KGV4dHJhLCAweDAwLCBJV19QUklWX1NJWkVfTUFTSyk7Ci0JCXNwcmludGYoZXh0cmEsICJcbiIpOwotCQlmb3IgKGJicElkID0gMDsgYmJwSWQgPD0gTUFYX0JCUF9JRDsgYmJwSWQrKykKLQkJewotCQkgICAgaWYgKHN0cmxlbihleHRyYSkgPj0gKElXX1BSSVZfU0laRV9NQVNLIC0gMjApKQotICAgICAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIFJBTElOS19BVEUKLQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQotCQkJewotCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7Ci0JCQl9Ci0JCQllbHNlCi0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7Ci0JCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSJTAyZFsweCUwMlhdOiUwMlggICAgIiwgYmJwSWQsIGJicElkLCByZWdCQlApOwotCQkJaWYgKGJicElkJTUgPT0gNCkKLQkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIiUwM2QgPSAlMDJYXG4iLCBiYnBJZCwgcmVnQkJQKTsgIC8vIGVkaXQgYnkgam9obmxpLCBjaGFuZ2UgZGlzcGxheSBmb3JtYXQKLQkJfQotCi0gICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJwotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPmxlbmd0aCA9ICVkXG4iLCB3cnEtPmxlbmd0aCkpOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PXJ0X3ByaXZhdGVfaW9jdGxfYmJwXG5cbiIpKTsKLQotICAgIHJldHVybiBTdGF0dXM7Ci19Ci0jZW5kaWYgLy8gREJHIC8vCi0KLWludCBydF9pb2N0bF9zaXdyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0gICAgUFJUTVBfQURBUFRFUiAgIHBBZCA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0gICAgVUlOVDMyICAgICAgICAgIHJhdGUgPSB3cnF1LT5iaXRyYXRlLnZhbHVlLCBmaXhlZCA9IHdycXUtPmJpdHJhdGUuZml4ZWQ7Ci0KLSAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9zaXdyYXRlOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0JcmV0dXJuIC1FTkVURE9XTjsKLQl9Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9zaXdyYXRlOjoocmF0ZSA9ICVkLCBmaXhlZCA9ICVkKVxuIiwgcmF0ZSwgZml4ZWQpKTsKLSAgICAvKiByYXRlID0gLTEgPT4gYXV0byByYXRlCi0gICAgICAgcmF0ZSA9IFgsIGZpeGVkID0gMSA9PiAoZml4ZWQgcmF0ZSBYKQotICAgICovCi0gICAgaWYgKHJhdGUgPT0gLTEpCi0gICAgewotICAgICAgICAvL0F1dG8gUmF0ZQotICAgICAgICBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOwotCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7Ci0JCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8PSBQSFlfMTFHKSB8fAotCQkgICAgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkKLSAgICAgICAgICAgIFJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCAtMSk7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSAgICAgICAgICAgIFNldENvbW1vbkhUKHBBZCk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChmaXhlZCkKLSAgICAgICAgewotCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOwotICAgICAgICAgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDw9IFBIWV8xMUcpIHx8Ci0gICAgICAgICAgICAgICAgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkKLSAgICAgICAgICAgICAgICBSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgcmF0ZSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSAgICAgICAgICAgICAgICBTZXRDb21tb25IVChwQWQpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfc2l3cmF0ZTo6KEh0TWNzPSVkKVxuIixwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUykpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVE9ETzogcmF0ZSA9IFgsIGZpeGVkID0gMCA9PiAocmF0ZXMgPD0gWCkKLSAgICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1pbnQgcnRfaW9jdGxfZ2l3cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0gICAgUFJUTVBfQURBUFRFUiAgIHBBZCA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0gICAgaW50IHJhdGVfaW5kZXggPSAwLCByYXRlX2NvdW50ID0gMDsKLSAgICBIVFRSQU5TTUlUX1NFVFRJTkcgaHRfc2V0dGluZzsKLS8qIFJlbW92ZSB0byBnbG9iYWwgdmFyaWFibGUKLSAgICBfX3MzMiByYWxpbmtyYXRlW10gPQotCXsyLCAgNCwgICAxMSwgIDIyLCAvLyBDQ0sKLQkxMiwgMTgsICAgMjQsICAzNiwgNDgsIDcyLCA5NiwgMTA4LCAvLyBPRkRNCi0JMTMsIDI2LCAgIDM5LCAgNTIsICA3OCwgMTA0LCAxMTcsIDEzMCwgMjYsICA1MiwgIDc4LCAxMDQsIDE1NiwgMjA4LCAyMzQsIDI2MCwgLy8gMjBNSHosIDgwMG5zIEdJLCBNQ1M6IDAgfiAxNQotCTM5LCA3OCwgIDExNywgMTU2LCAyMzQsIDMxMiwgMzUxLCAzOTAsCQkJCQkJCQkJCSAgLy8gMjBNSHosIDgwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKLQkyNywgNTQsICAgODEsIDEwOCwgMTYyLCAyMTYsIDI0MywgMjcwLCA1NCwgMTA4LCAxNjIsIDIxNiwgMzI0LCA0MzIsIDQ4NiwgNTQwLCAvLyA0ME1IeiwgODAwbnMgR0ksIE1DUzogMCB+IDE1Ci0JODEsIDE2MiwgMjQzLCAzMjQsIDQ4NiwgNjQ4LCA3MjksIDgxMCwJCQkJCQkJCQkJICAvLyA0ME1IeiwgODAwbnMgR0ksIE1DUzogMTYgfiAyMwotCTE0LCAyOSwgICA0MywgIDU3LCAgODcsIDExNSwgMTMwLCAxNDQsIDI5LCA1OSwgICA4NywgMTE1LCAxNzMsIDIzMCwgMjYwLCAyODgsIC8vIDIwTUh6LCA0MDBucyBHSSwgTUNTOiAwIH4gMTUKLQk0MywgODcsICAxMzAsIDE3MywgMjYwLCAzMTcsIDM5MCwgNDMzLAkJCQkJCQkJCQkgIC8vIDIwTUh6LCA0MDBucyBHSSwgTUNTOiAxNiB+IDIzCi0JMzAsIDYwLCAgIDkwLCAxMjAsIDE4MCwgMjQwLCAyNzAsIDMwMCwgNjAsIDEyMCwgMTgwLCAyNDAsIDM2MCwgNDgwLCA1NDAsIDYwMCwgLy8gNDBNSHosIDQwMG5zIEdJLCBNQ1M6IDAgfiAxNQotCTkwLCAxODAsIDI3MCwgMzYwLCA1NDAsIDcyMCwgODEwLCA5MDB9OwkJCQkJCQkJCQkgIC8vIDQwTUh6LCA0MDBucyBHSSwgTUNTOiAxNiB+IDIzCi0qLwotCi0gICAgcmF0ZV9jb3VudCA9IHNpemVvZihyYWxpbmtyYXRlKS9zaXplb2YoX19zMzIpOwotICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0JaWYoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLQlyZXR1cm4gLUVORVRET1dOOwotCX0KLQotICAgIGlmICgocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gRkFMU0UpICYmCi0gICAgICAgIChJTkZSQV9PTihwQWQpKSAmJgotICAgICAgICAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPD0gUEhZXzExRykgfHwgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkpCi0gICAgICAgIGh0X3NldHRpbmcud29yZCA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS53b3JkOwotICAgIGVsc2UKLSAgICAgICAgaHRfc2V0dGluZy53b3JkID0gcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZDsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotICAgIGlmIChodF9zZXR0aW5nLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKLSAgICB7Ci0vLwlyYXRlX2luZGV4ID0gMTIgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuQlcgKjE2KSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5TaG9ydEdJICozMikgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuTUNTKTsKLQlyYXRlX2luZGV4ID0gMTIgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuQlcgKjI0KSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5TaG9ydEdJICo0OCkgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuTUNTKTsKLSAgICB9Ci0gICAgZWxzZQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotICAgIGlmIChodF9zZXR0aW5nLmZpZWxkLk1PREUgPT0gTU9ERV9PRkRNKQotCXJhdGVfaW5kZXggPSAoVUNIQVIpKGh0X3NldHRpbmcuZmllbGQuTUNTKSArIDQ7Ci0gICAgZWxzZSBpZiAoaHRfc2V0dGluZy5maWVsZC5NT0RFID09IE1PREVfQ0NLKQotCXJhdGVfaW5kZXggPSAoVUNIQVIpKGh0X3NldHRpbmcuZmllbGQuTUNTKTsKLQotICAgIGlmIChyYXRlX2luZGV4IDwgMCkKLSAgICAgICAgcmF0ZV9pbmRleCA9IDA7Ci0KLSAgICBpZiAocmF0ZV9pbmRleCA+IHJhdGVfY291bnQpCi0gICAgICAgIHJhdGVfaW5kZXggPSByYXRlX2NvdW50OwotCi0gICAgd3JxdS0+Yml0cmF0ZS52YWx1ZSA9IHJhbGlua3JhdGVbcmF0ZV9pbmRleF0gKiA1MDAwMDA7Ci0gICAgd3JxdS0+Yml0cmF0ZS5kaXNhYmxlZCA9IDA7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgcnRfaGFuZGxlcltdID0KLXsKLQkoaXdfaGFuZGxlcikgTlVMTCwJCQkgICAgICAgICAgICAvKiBTSU9DU0lXQ09NTUlUICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd25hbWUsCQkJLyogU0lPQ0dJV05BTUUgICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJCSAgICAgICAgICAgIC8qIFNJT0NTSVdOV0lEICAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCQkgICAgICAgICAgICAvKiBTSU9DR0lXTldJRCAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2ZyZXEsCQkgICAgLyogU0lPQ1NJV0ZSRVEgICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdmcmVxLAkJICAgIC8qIFNJT0NHSVdGUkVRICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3bW9kZSwJCSAgICAvKiBTSU9DU0lXTU9ERSAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd21vZGUsCQkgICAgLyogU0lPQ0dJV01PREUgICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdTRU5TICAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXU0VOUyAgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8sCQkvKiBTSU9DU0lXUkFOR0UgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3JhbmdlLAkJICAgIC8qIFNJT0NHSVdSQU5HRSAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCAvKiBub3QgdXNlZCAqLywJCS8qIFNJT0NTSVdQUklWICAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCAvKiBrZXJuZWwgY29kZSAqLywgICAgLyogU0lPQ0dJV1BSSVYgICAqLwotCShpd19oYW5kbGVyKSBOVUxMIC8qIG5vdCB1c2VkICovLAkJLyogU0lPQ1NJV1NUQVRTICAqLwotCShpd19oYW5kbGVyKSBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzIC8qIGtlcm5lbCBjb2RlICovLCAgICAvKiBTSU9DR0lXU1RBVFMgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NQWSAgICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdTUFkgICAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DU0lXVEhSU1BZICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ0dJV1RIUlNQWSAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdhcCwgICAgICAgICAgICAvKiBTSU9DU0lXQVAgICAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2FwLAkJICAgIC8qIFNJT0NHSVdBUCAgICAgKi8KLSNpZmRlZiBTSU9DU0lXTUxNRQotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdtbG1lLAkgICAgICAgIC8qIFNJT0NTSVdNTE1FICAgKi8KLSNlbHNlCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ1NJV01MTUUgKi8KLSNlbmRpZiAvLyBTSU9DU0lXTUxNRSAvLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9pd2FwbGlzdCwJCSAgICAvKiBTSU9DR0lXQVBMSVNUICovCi0jaWZkZWYgU0lPQ0dJV1NDQU4KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3c2NhbiwJCSAgICAvKiBTSU9DU0lXU0NBTiAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3NjYW4sCQkgICAgLyogU0lPQ0dJV1NDQU4gICAqLwotI2Vsc2UKLQkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DU0lXU0NBTiAgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ0dJV1NDQU4gICAqLwotI2VuZGlmIC8qIFNJT0NHSVdTQ0FOICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2Vzc2lkLAkJICAgIC8qIFNJT0NTSVdFU1NJRCAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZXNzaWQsCQkgICAgLyogU0lPQ0dJV0VTU0lEICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXduaWNrbiwJCSAgICAvKiBTSU9DU0lXTklDS04gICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd25pY2tuLAkJICAgIC8qIFNJT0NHSVdOSUNLTiAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiAtLSBob2xlIC0tICAgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogLS0gaG9sZSAtLSAgICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdyYXRlLCAgICAgICAgICAvKiBTSU9DU0lXUkFURSAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3JhdGUsICAgICAgICAgIC8qIFNJT0NHSVdSQVRFICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3cnRzLAkJICAgIC8qIFNJT0NTSVdSVFMgICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cnRzLAkJICAgIC8qIFNJT0NHSVdSVFMgICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZnJhZywJCSAgICAvKiBTSU9DU0lXRlJBRyAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2ZyYWcsCQkgICAgLyogU0lPQ0dJV0ZSQUcgICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdUWFBPVyAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXVFhQT1cgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1JFVFJZICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdSRVRSWSAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZW5jb2RlLAkJLyogU0lPQ1NJV0VOQ09ERSAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdlbmNvZGUsCQkvKiBTSU9DR0lXRU5DT0RFICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1BPV0VSICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdQT1dFUiAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCQkJCQkvKiAtLSBob2xlIC0tICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkJCQkJLyogLS0gaG9sZSAtLSAqLwotI2lmIFdJUkVMRVNTX0VYVCA+IDE3Ci0gICAgKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2dlbmllLCAgICAgICAgIC8qIFNJT0NTSVdHRU5JRSAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3Z2VuaWUsICAgICAgICAgLyogU0lPQ0dJV0dFTklFICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdhdXRoLAkJICAgIC8qIFNJT0NTSVdBVVRIICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3YXV0aCwJCSAgICAvKiBTSU9DR0lXQVVUSCAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2VuY29kZWV4dCwJICAgIC8qIFNJT0NTSVdFTkNPREVFWFQgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZW5jb2RlZXh0LAkJLyogU0lPQ0dJV0VOQ09ERUVYVCAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdwbWtzYSwgICAgICAgICAvKiBTSU9DU0lXUE1LU0EgICovCi0jZW5kaWYKLX07Ci0KLXN0YXRpYyBjb25zdCBpd19oYW5kbGVyIHJ0X3ByaXZfaGFuZGxlcnNbXSA9IHsKLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAwICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwMSAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zZXRwYXJhbSwgLyogKyAweDAyICovCi0jaWZkZWYgREJHCi0JKGl3X2hhbmRsZXIpIHJ0X3ByaXZhdGVfaW9jdGxfYmJwLCAvKiArIDB4MDMgKi8KLSNlbHNlCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwMyAqLwotI2VuZGlmCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNCAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDUgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA2ICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNyAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDggKi8KLQkoaXdfaGFuZGxlcikgcnRfcHJpdmF0ZV9nZXRfc3RhdGlzdGljcywgLyogKyAweDA5ICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwQSAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEIgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBDICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwRCAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEUgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBGICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxMCAqLwotCShpd19oYW5kbGVyKSBydF9wcml2YXRlX3Nob3csIC8qICsgMHgxMSAqLwotICAgIChpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTIgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDEzICovCi0gICAgKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxNCAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTUgKi8KLSAgICAoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDE2ICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxNyAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTggKi8KLX07Ci0KLWNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiBydDI4eHhfaXdfaGFuZGxlcl9kZWYgPQotewotI2RlZmluZQlOKGEpCShzaXplb2YgKGEpIC8gc2l6ZW9mIChhWzBdKSkKLQkuc3RhbmRhcmQJPSAoaXdfaGFuZGxlciAqKSBydF9oYW5kbGVyLAotCS5udW1fc3RhbmRhcmQJPSBzaXplb2YocnRfaGFuZGxlcikgLyBzaXplb2YoaXdfaGFuZGxlciksCi0JLnByaXZhdGUJPSAoaXdfaGFuZGxlciAqKSBydF9wcml2X2hhbmRsZXJzLAotCS5udW1fcHJpdmF0ZQkJPSBOKHJ0X3ByaXZfaGFuZGxlcnMpLAotCS5wcml2YXRlX2FyZ3MJPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKSBwcml2dGFiLAotCS5udW1fcHJpdmF0ZV9hcmdzCT0gTihwcml2dGFiKSwKLSNpZiBJV19IQU5ETEVSX1ZFUlNJT04gPj0gNwotICAgIC5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzLAotI2VuZGlmCi19OwotCi1JTlQgUlRNUFNldEluZm9ybWF0aW9uKAotICAgIElOICBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiAgT1VUIHN0cnVjdCBpZnJlcSAgICAqcnEsCi0gICAgSU4gIElOVCAgICAgICAgICAgICAgICAgY21kKQotewotICAgIHN0cnVjdCBpd3JlcSAgICAgICAgICAgICAgICAgICAgICAgICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOwotICAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQ7Ci0gICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgICAgICAgICAgICAgQnNzaWQ7Ci0gICAgUlRfODAyXzExX1BIWV9NT0RFICAgICAgICAgICAgICAgICAgUGh5TW9kZTsKLSAgICBSVF84MDJfMTFfU1RBX0NPTkZJRyAgICAgICAgICAgICAgICBTdGFDb25maWc7Ci0gICAgTkRJU184MDJfMTFfUkFURVMgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXM7Ci0gICAgUlRfODAyXzExX1BSRUFNQkxFICAgICAgICAgICAgICAgICAgUHJlYW1ibGU7Ci0gICAgTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOwotICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlTWF4OwotICAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEJzc1R5cGU7Ci0gICAgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRCAgICAgICAgICAgUnRzVGhyZXNoOwotICAgIE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEIEZyYWdUaHJlc2g7Ci0gICAgTkRJU184MDJfMTFfUE9XRVJfTU9ERSAgICAgICAgICAgICAgUG93ZXJNb2RlOwotICAgIFBORElTXzgwMl8xMV9LRVkgICAgICAgICAgICAgICAgICAgIHBLZXkgPSBOVUxMOwotICAgIFBORElTXzgwMl8xMV9XRVAJCQkgICAgICAgIHBXZXBLZXkgPU5VTEw7Ci0gICAgUE5ESVNfODAyXzExX1JFTU9WRV9LRVkgICAgICAgICAgICAgcFJlbW92ZUtleSA9IE5VTEw7Ci0gICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAgICAgICAgICAgQ29uZmlnLCAqcENvbmZpZyA9IE5VTEw7Ci0gICAgTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgICAgICAgICAgTmV0VHlwZTsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3c7Ci0gICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5SWR4ID0gMDsKLSAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTLCBNYXhQaHlNb2RlID0gUEhZXzExRzsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3dlclRlbXA7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFkaW9TdGF0ZTsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7Ci0gICAgIFBORElTXzgwMl8xMV9QQVNTUEhSQVNFICAgICAgICAgICAgICAgICAgICBwcGFzc3BocmFzZSA9IE5VTEw7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JT0lEX1NFVF9IVF9QSFlNT0RFCQkJCQlIVF9QaHlNb2RlOwkvLzExbiAsa2F0aHkKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0gICAgUE5ESVNfODAyXzExX1BNS0lEICAgICAgICAgICAgICAgICAgcFBta0lkID0gTlVMTDsKLSAgICBCT09MRUFOCQkJCSAgICAgICAgICAgICAgICBJRUVFODAyMXhTdGF0ZSA9IEZBTFNFOwotICAgIEJPT0xFQU4JCQkJICAgICAgICAgICAgICAgIElFRUU4MDIxeF9yZXF1aXJlZF9rZXlzID0gRkFMU0U7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3BhX3N1cHBsaWNhbnRfZW5hYmxlID0gMDsKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLSNpZmRlZiBTTk1QX1NVUFBPUlQKLQlUWF9SVFlfQ0ZHX1NUUlVDCQkJdHhfcnR5X2NmZzsKLQlVTE9ORwkJCQkJCVNob3J0UmV0cnlMaW1pdCwgTG9uZ1JldHJ5TGltaXQ7Ci0JVUNIQVIJCQkJCQljdG1wOwotI2VuZGlmIC8vIFNOTVBfU1VQUE9SVCAvLwotCi0KLQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JTWF4UGh5TW9kZSA9IFBIWV8xMU5fNUc7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT5SVE1QU2V0SW5mb3JtYXRpb24oKSwJMHglMDh4XG4iLCBjbWQmMHg3RkZGKSk7Ci0Jc3dpdGNoKGNtZCAmIDB4N0ZGRikgewotCQljYXNlIFJUX09JRF84MDJfMTFfQ09VTlRSWV9SRUdJT046Ci0JCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoIDwgc2l6ZW9mKFVDSEFSKSkKLQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJLy8gT25seSBhdmFsaWFibGUgd2hlbiBFRVBST00gbm90IHByb2dyYW1taW5nCi0gICAgICAgICAgICBlbHNlIGlmICghKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gJiAweDgwKSAmJiAhKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCAmIDB4ODApKQotCQkJewotCQkJCVVMT05HICAgQ291bnRyeTsKLQkJCQlVQ0hBUglUbXBQaHk7Ci0KLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQ291bnRyeSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uID0gKFVDSEFSKShDb3VudHJ5ICYgMHgwMDAwMDBGRik7Ci0JCQkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kID0gKFVDSEFSKSgoQ291bnRyeSA+PiA4KSAmIDB4MDAwMDAwRkYpOwotICAgICAgICAgICAgICAgIFRtcFBoeSA9IHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGU7Ci0JCQkJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IDB4ZmY7Ci0JCQkJLy8gQnVpbGQgYWxsIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCBpbmZvcm1hdGlvbgotCQkJCVJUTVBTZXRQaHlNb2RlKHBBZCwgVG1wUGh5KTsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCQlTZXRDb21tb25IVChwQWQpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTiAoQTolZCAgQi9HOiVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kLAotCQkJCSAgICBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTjoKLSAgICAgICAgICAgIE5vdyA9IGppZmZpZXM7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLCBUeENudCA9ICVkIFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5MYXN0T25lU2VjVG90YWxUeENvdW50KSk7Ci0KLSAgICAgICAgICAgIGlmIChNT05JVE9SX09OKHBBZCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIERyaXZlciBpcyBpbiBNb25pdG9yIE1vZGUgbm93ICEhIVxuIikpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0JCQkvL0JlbnNvbiBhZGQgMjAwODA1MjcsIHdoZW4gcmFkaW8gb2ZmLCBzdGEgZG9uJ3QgbmVlZCB0byBzY2FuCi0JCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCi0JCQkJYnJlYWs7Ci0KLQkJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQotCQkJewotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBEcml2ZXIgaXMgc2Nhbm5pbmcgbm93ICEhIVxuIikpOwotCQkJCXBBZC0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOwotCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLQkJCWlmIChwQWQtPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNUb3RhbFR4Q291bnQgPiAxMDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExpbmsgVVAsIGlnbm9yZSB0aGlzIHNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU5cbiIpKTsKLQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCQkJCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgPSA5OTsJCS8vIFByZXZlbnQgYXV0byBzY2FuIHRyaWdnZXJlZCBieSB0aGlzIE9JRAotCQkJCWJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkgJiYKLQkJCQkoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKLQkJCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAotCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAotCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkgJiYKLSAgICAgICAgICAgICAgICAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTGluayBVUCwgUG9ydCBOb3QgU2VjdXJlZCEgaWdub3JlIHRoaXMgc2V0OjpPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTlxuIikpOwotCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JCQkJcEFkLT5TdGFDZmcuU2NhbkNudCA9IDk5OwkJLy8gUHJldmVudCBhdXRvIHNjYW4gdHJpZ2dlcmVkIGJ5IHRoaXMgT0lECi0JCQkJYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJUTVBfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZCk7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKLSAgICAgICAgICAgIC8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCi0gICAgICAgICAgICBwQWQtPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKLSAgICAgICAgICAgIC8vIFJlc2V0IGFsbG93ZWQgc2NhbiByZXRyaWVzCi0gICAgICAgICAgICBwQWQtPlN0YUNmZy5TY2FuQ250ID0gMDsKLSAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKLQotCQkJcEFkLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IFRSVUU7Ci0gICAgICAgICAgICBSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7Ci0gICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLAotICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotCi0gICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotICAgICAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IFRSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPSURfODAyXzExX1NTSUQ6Ci0gICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9TU0lEKSkKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotCQlQU1RSSU5HIHBTc2lkU3RyaW5nID0gTlVMTDsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmU3NpZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TU0lEIChMZW49JWQsU3NpZD0lcylcbiIsIFNzaWQuU3NpZExlbmd0aCwgU3NpZC5Tc2lkKSk7Ci0gICAgICAgICAgICAgICAgaWYgKFNzaWQuU3NpZExlbmd0aCA+IE1BWF9MRU5fT0ZfU1NJRCkKLSAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotCQkJaWYgKFNzaWQuU3NpZExlbmd0aCA9PSAwKQotCQkJCXsKLQkJCQlTZXRfU1NJRF9Qcm9jKHBBZCwgIiIpOwotCQkJCX0KLQkJCQkJZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0JCQkJcFNzaWRTdHJpbmcgPSAoUFNUUklORylrbWFsbG9jKE1BWF9MRU5fT0ZfU1NJRCsxLCBNRU1fQUxMT0NfRkxBRyk7Ci0JCQkJCQlpZiAocFNzaWRTdHJpbmcpCi0JCQkJCQl7Ci0JCQkJCQkJTmRpc1plcm9NZW1vcnkocFNzaWRTdHJpbmcsIE1BWF9MRU5fT0ZfU1NJRCsxKTsKLQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwU3NpZFN0cmluZywgU3NpZC5Tc2lkLCBTc2lkLlNzaWRMZW5ndGgpOwotCQkJCQkJCVNldF9TU0lEX1Byb2MocEFkLCBwU3NpZFN0cmluZyk7Ci0JCQkJCQkJa2ZyZWUocFNzaWRTdHJpbmcpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJCVN0YXR1cyA9IC1FTk9NRU07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQkJY2FzZSBPSURfODAyXzExX1NFVF9QQVNTUEhSQVNFOgotCSAgICBwcGFzc3BocmFzZT0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKLQotCSAgICBpZihwcGFzc3BocmFzZT09IE5VTEwpCi0gICAgICAgICAgICB7Ci0JCVN0YXR1cyA9IC1FTk9NRU07Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NFVF9QQVNTUEhSQVNFLCBGYWlsZWQhIVxuIikpOwotCQlicmVhazsKLSAgICAgICAgICAgIH0KLQkJCWVsc2UKLQkJewotCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwcGFzc3BocmFzZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQotCQkJCWlmIChTdGF0dXMpCi0JCXsKLQkJCVN0YXR1cyAgPSAtRUlOVkFMOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NFVF9QQVNTUEhSQVNFLCBGYWlsZWQgKGxlbmd0aCBtaXNtYXRjaCkhIVxuIikpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCQlpZihwcGFzc3BocmFzZS0+S2V5TGVuZ3RoIDwgOCB8fCBwcGFzc3BocmFzZS0+S2V5TGVuZ3RoID4gNjQpCi0JCQkJCXsKLQkJCQkJCVN0YXR1cyAgPSAtRUlOVkFMOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NFVF9QQVNTUEhSQVNFLCBGYWlsZWQgKGxlbiBsZXNzIHRoYW4gOCBvciBncmVhdGVyIHRoYW4gNjQpISFcbiIpKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCS8vIHNldCBrZXkgcGFzc3BocmFzZSBhbmQgbGVuZ3RoCi0JCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5XcGFQYXNzUGhyYXNlLCA2NCk7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLldwYVBhc3NQaHJhc2UsICZwcGFzc3BocmFzZS0+S2V5TWF0ZXJpYWwsIHBwYXNzcGhyYXNlLT5LZXlMZW5ndGgpOwotCQkJCQkJcEFkLT5TdGFDZmcuV3BhUGFzc1BocmFzZUxlbiA9IHBwYXNzcGhyYXNlLT5LZXlMZW5ndGg7Ci0JCQkJCQloZXhfZHVtcCgicEFkLT5TdGFDZmcuV3BhUGFzc1BocmFzZSIsIHBBZC0+U3RhQ2ZnLldwYVBhc3NQaHJhc2UsIDY0KTsKLQkJCQkJCXByaW50aygiV3BhUGFzc1BocmFzZT0lc1xuIixwQWQtPlN0YUNmZy5XcGFQYXNzUGhyYXNlKTsKLQkJCQkJfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQkJa2ZyZWUocHBhc3NwaHJhc2UpOwotCQkJYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBPSURfODAyXzExX0JTU0lEOgotICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpKQotICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZCc3NpZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgIC8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZwotICAgICAgICAgICAgICAgIC8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCi0gICAgICAgICAgICAgICAgcEFkLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7Ci0KLQkJCQkvLyBQcmV2ZW50IHRvIGNvbm5lY3QgQVAgYWdhaW4gaW4gU1RBTWxtZVBlcmlvZGljRXhlYwotCQkJCXBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZXNldCBhbGxvd2VkIHNjYW4gcmV0cmllcwotCQkJCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgPSAwOwotCi0gICAgICAgICAgICAgICAgaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUlRNUF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkKTsKLSAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT0lEXzgwMl8xMV9CU1NJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWT0lEICopJkJzc2lkKTsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotICAgICAgICAgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBUUlVFOwotCi0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0JTU0lEICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJzc2lkWzBdLCBCc3NpZFsxXSwgQnNzaWRbMl0sIEJzc2lkWzNdLCBCc3NpZFs0XSwgQnNzaWRbNV0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUkFESU86Ci0gICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihCT09MRUFOKSkKLSAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUmFkaW9TdGF0ZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfUkFESU8gKD0lZClcbiIsIFJhZGlvU3RhdGUpKTsKLSAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlN3UmFkaW8gIT0gUmFkaW9TdGF0ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvID0gUmFkaW9TdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyAhPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5iUmFkaW8gPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1sbWVSYWRpb09uKHBBZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCi0JCQkJCQkJcEFkLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotCQkJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQotCQkJCSAgICAgICAgICAgIHsKLQkJCQkgICAgICAgICAgICAgICAgaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQotCQkJCQkJICAgICAgICB7Ci0JCQkJCQkgICAgICAgICAgICBSVE1QX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWQpOwotCQkJCQkJICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOwotCQkJCQkJICAgICAgICB9Ci0JCQkJICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWxtZVJhZGlvT2ZmKHBBZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCi0JCQkJCQkJcEFkLT5FeHRyYUluZm8gPSBTV19SQURJT19PRkY7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1BIWV9NT0RFOgotICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoUlRfODAyXzExX1BIWV9NT0RFKSkKLSAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUGh5TW9kZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCQlpZiAoUGh5TW9kZSA8PSBNYXhQaHlNb2RlKQotCQkJCXsKLSAgICAgICAgICAgICAgICBSVE1QU2V0UGh5TW9kZShwQWQsIFBoeU1vZGUpOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJCVNldENvbW1vbkhUKHBBZCk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkJfQotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9QSFlfTU9ERSAoPSVkKVxuIiwgUGh5TW9kZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHOgotICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoUlRfODAyXzExX1NUQV9DT05GSUcpKQotICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotCQlVSU5UMzIJVmFsdWU7Ci0KLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmU3RhQ29uZmlnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gU3RhQ29uZmlnLkVuYWJsZVR4QnVyc3Q7Ci0gICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gU3RhQ29uZmlnLlVzZUJHUHJvdGVjdGlvbjsKLSAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IDE7IC8vIDIwMDMtMTAtMzAgYWx3YXlzIFNIT1JUIFNMT1QgY2FwYWJsZQotICAgICAgICAgICAgICAgIGlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSAhPSBTdGFDb25maWcuQWRob2NNb2RlKSAmJgotCQkJCQkoU3RhQ29uZmlnLkFkaG9jTW9kZSA8PSBNYXhQaHlNb2RlKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGR5bmFtaWMgY2hhbmdlIG9mICJVU0UgT0ZETSByYXRlIG9yIG5vdCIgaW4gQURIT0MgbW9kZQotICAgICAgICAgICAgICAgICAgICAvLyBpZiBzZXR0aW5nIGNoYW5nZWQsIG5lZWQgdG8gcmVzZXQgY3VycmVudCBUWCByYXRlIGFzIHdlbGwgYXMgQkVBQ09OIGZyYW1lIGZvcm1hdAotICAgICAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCi0gICAgICAgICAgICAgICAgICAgIHsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSBTdGFDb25maWcuQWRob2NNb2RlOwotCQkJUlRNUFNldFBoeU1vZGUocEFkLCBQaHlNb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1sbWVVcGRhdGVUeFJhdGVzKHBBZCwgRkFMU0UsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgTWFrZUlic3NCZWFjb24ocEFkKTsgICAgICAgICAgIC8vIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgQXNpY0VuYWJsZUlic3NTeW5jKHBBZCk7ICAgLy8gY29weSB0byBvbi1jaGlwIG1lbW9yeQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfU1RBX0NPTkZJRyAoQnVyc3Q9JWQsIFByb3RlY3Rpb249JWxkLFNob3J0U2xvdD0lZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUpKTsKLQotCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5QU1BYbGluaykKLQkJCQkJVmFsdWUgPSBQU1BYTElOSzsKLQkJCQllbHNlCi0JCQkJCVZhbHVlID0gU1RBTk9STUFMOwotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgVmFsdWUpOwotCQkJCVZhbHVlID0gMDsKLQkJCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKLQkJCQlWYWx1ZSAmPSAofjB4ODApOwotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTOgotICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfUkFURVMpKQotICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZhcnlSYXRlcywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZSwgJmFyeVJhdGVzLCBzaXplb2YoTkRJU184MDJfMTFfUkFURVMpKTsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfREVTSVJFRF9SQVRFUyAoJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4KVxuIiwKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSxwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdLAotICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzJdLHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10sCi0gICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNF0scEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs1XSwKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs2XSxwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICkpOwotICAgICAgICAgICAgICAgIC8vIENoYW5naW5nIERlc2lyZWRSYXRlIG1heSBhZmZlY3QgdGhlIE1BWCBUWCByYXRlIHdlIHVzZWQgdG8gVFggZnJhbWVzIG91dAotICAgICAgICAgICAgICAgIE1sbWVVcGRhdGVUeFJhdGVzKHBBZCwgRkFMU0UsIDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9QUkVBTUJMRToKLSAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFJUXzgwMl8xMV9QUkVBTUJMRSkpCi0gICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlByZWFtYmxlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmIChQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlU2hvcnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUHJlYW1ibGU7Ci0gICAgICAgICAgICAgICAgICAgIE1sbWVTZXRUeFByZWFtYmxlKHBBZCwgUnQ4MDJfMTFQcmVhbWJsZVNob3J0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoKFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVMb25nKSB8fCAoUHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZUF1dG8pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdXNlciB3YW50cyBBVVRPLCBpbml0aWFsaXplIHRvIExPTkcgaGVyZSwgdGhlbiBjaGFuZ2UgYWNjb3JkaW5nIHRvIEFQJ3MKLSAgICAgICAgICAgICAgICAgICAgLy8gY2FwYWJpbGl0eSB1cG9uIGFzc29jaWF0aW9uLgotICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUHJlYW1ibGU7Ci0gICAgICAgICAgICAgICAgICAgIE1sbWVTZXRUeFByZWFtYmxlKHBBZCwgUnQ4MDJfMTFQcmVhbWJsZUxvbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1BSRUFNQkxFICg9JWQpXG4iLCBQcmVhbWJsZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9XRVBfU1RBVFVTOgotICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfV0VQX1NUQVRVUykpCi0gICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJldlcFN0YXR1cywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAvLyBTaW5jZSBUS0lQLCBBRVMsIFdFUCBhcmUgYWxsIHN1cHBvcnRlZC4gSXQgc2hvdWxkIG5vdCBoYXZlIGFueSBpbnZhbGlkIHNldHRpbmcKLSAgICAgICAgICAgICAgICBpZiAoV2VwU3RhdHVzIDw9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0tleUFic2VudCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gV2VwU3RhdHVzKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25maWcgaGFzIGNoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBXZXBTdGF0dXM7Ci0gICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBXZXBTdGF0dXM7Ci0gICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBXZXBTdGF0dXM7Ci0JCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciAgID0gV2VwU3RhdHVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBfU1RBVFVTICg9JWQpXG4iLFdlcFN0YXR1cykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFOgotICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSkpCi0gICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkF1dGhNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmIChBdXRoTW9kZSA+IE5kaXM4MDJfMTFBdXRoTW9kZU1heCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IEF1dGhNb2RlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25maWcgaGFzIGNoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gQXV0aE1vZGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOwotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICg9JWQpIFxuIixwQWQtPlN0YUNmZy5BdXRoTW9kZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFOgotICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSkpCi0gICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkJzc1R5cGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0KLQkJCQlpZiAoQnNzVHlwZSA9PSBOZGlzODAyXzExSUJTUykKLQkJCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkLCAiQWRob2MiKTsKLQkJCQllbHNlIGlmIChCc3NUeXBlID09IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZSkKLQkJCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkLCAiSW5mcmEiKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChCc3NUeXBlID09IE5kaXM4MDJfMTFNb25pdG9yKQotCQkJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWQsICJNb25pdG9yIik7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7Ci0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFICh1bmtub3duKVxuIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCSBjYXNlIE9JRF84MDJfMTFfUkVNT1ZFX1dFUDoKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfV0VQXG4iKSk7Ci0gICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9LRVlfSU5ERVgpKQotICAgICAgICAgICAgewotCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0JCUtleUlkeCA9ICooTkRJU184MDJfMTFfS0VZX0lOREVYICopIHdycS0+dS5kYXRhLnBvaW50ZXI7Ci0KLQkJaWYgKEtleUlkeCAmIDB4ODAwMDAwMDApCi0JCXsKLQkJCS8vIFNob3VsZCBuZXZlciBzZXQgZGVmYXVsdCBiaXQgd2hlbiByZW1vdmUga2V5Ci0JCQlTdGF0dXMgPSAtRUlOVkFMOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJS2V5SWR4ID0gS2V5SWR4ICYgMHgwZmZmZmZmZjsKLQkJCWlmIChLZXlJZHggPj0gNCl7Ci0JCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gMDsKLQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0JCQkJCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkLCAwLCAoVUNIQVIpS2V5SWR4KTsKLQkJCX0KLQkJfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SRVNFVF9DT1VOVEVSUzoKLSAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPldsYW5Db3VudGVycywgc2l6ZW9mKENPVU5URVJfODAyXzExKSk7Ci0gICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5Db3VudGVyczgwMjMsIHNpemVvZihDT1VOVEVSXzgwMl8zKSk7Ci0gICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5SYWxpbmtDb3VudGVycywgc2l6ZW9mKENPVU5URVJfUkFMSU5LKSk7Ci0gICAgICAgICAgICBwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyICAgPSAwOwotCQkJcEFkLT5Db3VudGVyczgwMjMuR29vZFJlY2VpdmVzID0gMDsKLQkJCXBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIgICA9IDA7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfUkVTRVRfQ09VTlRFUlMgXG4iKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPSURfODAyXzExX1JUU19USFJFU0hPTEQ6Ci0gICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9SVFNfVEhSRVNIT0xEKSkKLSAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUnRzVGhyZXNoLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmIChSdHNUaHJlc2ggPiBNQVhfUlRTX1RIUkVTSE9MRCkKLSAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSAoVVNIT1JUKVJ0c1RocmVzaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xEICg9JWxkKVxuIixSdHNUaHJlc2gpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQ6Ci0gICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCkpCi0gICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkZyYWdUaHJlc2gsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IEZBTFNFOwotICAgICAgICAgICAgICAgIGlmIChGcmFnVGhyZXNoID4gTUFYX0ZSQUdfVEhSRVNIT0xEIHx8IEZyYWdUaHJlc2ggPCBNSU5fRlJBR19USFJFU0hPTEQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoRnJhZ1RocmVzaCA9PSAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gKFVTSE9SVClGcmFnVGhyZXNoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEICg9JWxkKSBcbiIsRnJhZ1RocmVzaCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9QT1dFUl9NT0RFOgotICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfUE9XRVJfTU9ERSkpCi0gICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUG93ZXJNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmIChQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTSkKLQkJCVNldF9QU01vZGVfUHJvYyhwQWQsICJDQU0iKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1ApCi0JCQlTZXRfUFNNb2RlX1Byb2MocEFkLCAiTWF4X1BTUCIpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKFBvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1ApCi0JCQkJCVNldF9QU01vZGVfUHJvYyhwQWQsICJGYXN0X1BTUCIpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKFBvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUCkKLQkJCQkJU2V0X1BTTW9kZV9Qcm9jKHBBZCwgIkxlZ2FjeV9QU1AiKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUE9XRVJfTU9ERSAoPSVkKVxuIixQb3dlck1vZGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzE6Ci0JCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICA8IHNpemVvZihVTE9ORykpCi0JCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCWVsc2UKLQkJCXsKLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUG93ZXJUZW1wLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJCWlmIChQb3dlclRlbXAgPiAxMDApCi0JCQkJCVBvd2VyVGVtcCA9IDB4ZmZmZmZmZmY7ICAvLyBBVVRPCi0JCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQgPSBQb3dlclRlbXA7IC8va2VlcCBjdXJyZW50IHNldHRpbmcuCi0JCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdDsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMSAoPSVsZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKSk7Ci0JCQl9Ci0JICAgICAgICBicmVhazsKLQkJY2FzZSBPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0U6Ci0JCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUpKQotCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJk5ldFR5cGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0KLQkJCQlpZiAoTmV0VHlwZSA9PSBOZGlzODAyXzExRFMpCi0JCQkJCVJUTVBTZXRQaHlNb2RlKHBBZCwgUEhZXzExQik7Ci0JCQkJZWxzZSBpZiAoTmV0VHlwZSA9PSBOZGlzODAyXzExT0ZETTI0KQotCQkJCQlSVE1QU2V0UGh5TW9kZShwQWQsIFBIWV8xMUJHX01JWEVEKTsKLQkJCQllbHNlIGlmIChOZXRUeXBlID09IE5kaXM4MDJfMTFPRkRNNSkKLQkJCQkJUlRNUFNldFBoeU1vZGUocEFkLCBQSFlfMTFBKTsKLQkJCQllbHNlCi0JCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQotCQkJCQlTZXRDb21tb25IVChwQWQpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFICg9JWQpXG4iLE5ldFR5cGUpKTsKLQkJICAgIH0KLQkJCWJyZWFrOwotICAgICAgICAvLyBGb3IgV1BBIFBTSyBQTUsga2V5Ci0gICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9BRERfV1BBOgotICAgICAgICAgICAgcEtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7Ci0gICAgICAgICAgICBpZihwS2V5ID09IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIGlmIChwS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBLCBGYWlsZWQhIVxuIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgotCQkJCSAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKLQkJCQkgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FT1BOT1RTVVBQOwotICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX1dQQSwgRmFpbGVkISEgW0F1dGhNb2RlICE9IFdQQVBTSy9XUEEyUFNLL1dQQU5PTkVdXG4iKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8Ci0JCQkJCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spIHx8Ci0JCQkJCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpICkgICAgIC8vIE9ubHkgZm9yIFdQQSBQU0sgbW9kZQotCQkJCXsKLSAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUE1LLCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFVzZSBSYUNvbmZpZyBhcyBQU0sgYWdlbnQuCi0gICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IFNUQSBzdXBwbGljYW50IHN0YXRlIG1hY2hpbmUKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCi0gICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1NUQVJUOwotCi0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBIChpZD0weCV4LCBMZW49JWQtYnl0ZSlcbiIsIHBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7Ci0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBIChpZD0weCV4LCBMZW49JWQtYnl0ZSlcbiIsIHBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBrZnJlZShwS2V5KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF84MDJfMTFfUkVNT1ZFX0tFWToKLSAgICAgICAgICAgIHBSZW1vdmVLZXkgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOwotICAgICAgICAgICAgaWYocFJlbW92ZUtleSA9PSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBSZW1vdmVLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBpZiAocFJlbW92ZUtleS0+TGVuZ3RoICE9IHdycS0+dS5kYXRhLmxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSwgRmFpbGVkISFcbiIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUlRNUFdQQVJlbW92ZUtleVByb2MocEFkLCBwUmVtb3ZlS2V5KTsKLSAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVksIFJlbW92ZSBXUEEgS2V5ISFcbiIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgS2V5SWR4ID0gcFJlbW92ZUtleS0+S2V5SW5kZXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKEtleUlkeCAmIDB4ODAwMDAwMDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBuZXZlciBzZXQgZGVmYXVsdCBiaXQgd2hlbiByZW1vdmUga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZLCBGYWlsZWQhIShTaG91bGQgbmV2ZXIgc2V0IGRlZmF1bHQgYml0IHdoZW4gcmVtb3ZlIGtleSlcbiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEtleUlkeCA9IEtleUlkeCAmIDB4MGZmZmZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoS2V5SWR4ID4gMykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSwgRmFpbGVkISEoS2V5SWRbJWRdIG91dCBvZiByYW5nZSlcbiIsIEtleUlkeCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWQsIDAsIChVQ0hBUilLZXlJZHgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZIChpZD0weCV4LCBMZW49JWQtYnl0ZSlcbiIsIHBSZW1vdmVLZXktPktleUluZGV4LCBwUmVtb3ZlS2V5LT5MZW5ndGgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGtmcmVlKHBSZW1vdmVLZXkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8vIE5ldyBmb3IgV1BBCi0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9BRERfS0VZOgotICAgICAgICAgICAgcEtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7Ci0gICAgICAgICAgICBpZihwS2V5ID09IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBpZiAocEtleS0+TGVuZ3RoICE9IHdycS0+dS5kYXRhLmxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX0tFWSwgRmFpbGVkISFcbiIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSVE1QQWRkS2V5KHBBZCwgcEtleSk7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9LRVkgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAga2ZyZWUocEtleSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPSURfODAyXzExX0NPTkZJR1VSQVRJT046Ci0gICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKSkKLSAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQ29uZmlnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIHBDb25maWcgPSAmQ29uZmlnOwotCi0gICAgICAgICAgICAgICAgaWYgKChwQ29uZmlnLT5CZWFjb25QZXJpb2QgPj0gMjApICYmIChwQ29uZmlnLT5CZWFjb25QZXJpb2QgPD00MDApKQotICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kID0gKFVTSE9SVCkgcENvbmZpZy0+QmVhY29uUGVyaW9kOwotCi0gICAgICAgICAgICAgICAgcEFkLT5TdGFBY3RpdmUuQXRpbVdpbiA9IChVU0hPUlQpIHBDb25maWctPkFUSU1XaW5kb3c7Ci0gICAgICAgICAgICAgICAgTUFQX0tIWl9UT19DSEFOTkVMX0lEKHBDb25maWctPkRTQ29uZmlnLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLSAgICAgICAgICAgICAgICAvLwotCQkJCS8vIFNhdmUgdGhlIGNoYW5uZWwgb24gTWxtZUF1eCBmb3IgQ250bE9pZFJUQnNzaWRQcm9jIHVzZWQuCi0JCQkJLy8KLQkJCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7Ci0KLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQ09ORklHVVJBVElPTiAoQmVhY25QZXJpb2Q9JWxkLEF0aW1XPSVsZCxDaD0lZClcbiIsCi0gICAgICAgICAgICAgICAgICAgIHBDb25maWctPkJlYWNvblBlcmlvZCwgcENvbmZpZy0+QVRJTVdpbmRvdywgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOwotICAgICAgICAgICAgICAgIC8vIENvbmZpZyBoYXMgY2hhbmdlZAotICAgICAgICAgICAgICAgIHBBZC0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfSFRfUEhZTU9ERToKLQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGgJIT0gc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSkpCi0JCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCWVsc2UKLQkJCXsKLQkJCSAgICBQT0lEX1NFVF9IVF9QSFlNT0RFCXBIVFBoeU1vZGUgPSAmSFRfUGh5TW9kZTsKLQotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZIVF9QaHlNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6cEhUUGh5TW9kZQkoUGh5TW9kZSA9ICVkLFRyYW5zbWl0Tm8gPSAlZCwgSHRNb2RlID0JJWQsCUV4dE9mZnNldCA9CSVkICwgTUNTID0gJWQsIEJXID0JJWQsCVNUQkMgPSAlZCwgU0hPUlRHSSA9ICVkKSBcbiIsCi0JCQkJcEhUUGh5TW9kZS0+UGh5TW9kZSwgcEhUUGh5TW9kZS0+VHJhbnNtaXRObyxwSFRQaHlNb2RlLT5IdE1vZGUscEhUUGh5TW9kZS0+RXh0T2Zmc2V0LAotCQkJCXBIVFBoeU1vZGUtPk1DUywgcEhUUGh5TW9kZS0+QlcsIHBIVFBoeU1vZGUtPlNUQkMsCXBIVFBoeU1vZGUtPlNIT1JUR0kpKTsKLQkJCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZQk+PSBQSFlfMTFBQkdOX01JWEVEKQotCQkJCQlSVE1QU2V0SFQocEFkLAlwSFRQaHlNb2RlKTsKLQkJCX0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfSFRfUEhZTU9ERShNQ1M9JWQsQlc9JWQsU0dJPSVkLFNUQkM9JWQpXG4iLAotCQkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MsIHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5CVywgcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0ksCi0JCQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkMpKTsKLQkJCWJyZWFrOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0FQU0RfU0VUVElORzoKLQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKLQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJZWxzZQotCQkJewotCQkJCVVMT05HIGFwc2QgOwotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZhcHNkLCB3cnEtPnUuZGF0YS5wb2ludGVyLAl3cnEtPnUuZGF0YS5sZW5ndGgpOwotCi0JCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkJfEIzMX5CNwl8CUI2fkI1CSB8CSBCNAkgfAkgQjMJIHwJQjIJIHwJQjEJIHwJICAgQjAJCXwKLQkJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCQl8IFJzdmQJfCBNYXggU1AgTGVuIHwgQUNfVk8gfCBBQ19WSSB8IEFDX0JLIHwgQUNfQkUgfCBBUFNECUNhcGFibGUJfAotCQkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JCQkJcEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlID0gKGFwc2QgJiAweDAwMDAwMDAxKSA/IFRSVUUgOglGQUxTRTsKLQkJCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFID0gKChhcHNkCSYgMHgwMDAwMDAwMikgPj4gMSkJPyBUUlVFIDogRkFMU0U7Ci0JCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CSyA9ICgoYXBzZAkmIDB4MDAwMDAwMDQpID4+IDIpCT8gVFJVRSA6IEZBTFNFOwotCQkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgPSAoKGFwc2QJJiAweDAwMDAwMDA4KSA+PiAzKQk/IFRSVUUgOiBGQUxTRTsKLQkJCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPID0gKChhcHNkCSYgMHgwMDAwMDAxMCkgPj4gNCkJPyBUUlVFIDogRkFMU0U7Ci0JCQkJcEFkLT5Db21tb25DZmcuTWF4U1BMZW5ndGgJPSAoVUNIQVIpKChhcHNkCSYgMHgwMDAwMDA2MCkgPj4gNSk7Ci0KLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0FQU0RfU0VUVElORyAoYXBzZD0weCVseCwgQVBTRENhcD0lZCwgW0JFLEJLLFZJLFZPXT1bJWQvJWQvJWQvJWRdLAlNYXhTUExlbj0lZClcbiIsIGFwc2QsIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSwKLQkJCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRSwJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CSywJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSSwJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTywJcEFkLT5Db21tb25DZmcuTWF4U1BMZW5ndGgpKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9QU006Ci0JCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoCSE9IHNpemVvZihVTE9ORykpCi0JCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyBEcml2ZXIgbmVlZHMJdG8gbm90aWZ5IEFQIHdoZW4gUFNNIGNoYW5nZXMKLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZQkhPSBwQWQtPlN0YUNmZy5Qc20pCi0JCQkJewotCQkJCQlSVE1QX1NFVF9QU01fQklUKHBBZCwJcEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSk7Ci0JCQkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwJcEFkLT5Db21tb25DZmcuVHhSYXRlLAlUUlVFKTsKLQkJCQl9Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9BUFNEX1BTTSAoYkFQU0RGb3JjZVBvd2VyU2F2ZTolZClcbiIsCXBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpKTsKLQkJCX0KLQkJCWJyZWFrOwotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0RMUzoKLQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKLQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJZWxzZQotCQkJewotCQkJCUJPT0xFQU4Jb2xkdmFsdWUgPSBwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZTsKLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQkJaWYgKG9sZHZhbHVlICYmCSFwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKLQkJCQl7Ci0JCQkJCWludAlpOwotCQkJCQkvLyB0ZWFyCWRvd24gbG9jYWwgZGxzIHRhYmxlIGVudHJ5Ci0JCQkJCWZvcgkoaT0wOyBpPE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKLQkJCQkJewotCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCi0JCQkJCQl7Ci0JCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7Ci0JCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKLQkJCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIHRlYXIJZG93biBwZWVyIGRscyB0YWJsZQllbnRyeQotCQkJCQlmb3IJKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQotCQkJCQl7Ci0JCQkJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKLQkJCQkJCXsKLQkJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKLQkJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOwotCQkJCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0RMUyAoPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNOgotCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aAkhPSBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpCi0JCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCWVsc2UKLQkJCXsKLQkJCQlSVF84MDJfMTFfRExTCURsczsKLQotCQkJCU5kaXNaZXJvTWVtb3J5KCZEbHMsIHNpemVvZihSVF84MDJfMTFfRExTKSk7Ci0JCQkJUlRNUE1vdmVNZW1vcnkoJkRscywgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKFJUXzgwMl8xMV9ETFNfVUkpKTsKLQkJCQlNbG1lRW5xdWV1ZShwQWQsCi0JCQkJCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCi0JCQkJCQkJUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNLAotCQkJCQkJCXNpemVvZihSVF84MDJfMTFfRExTKSwKLQkJCQkJCQkmRGxzKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNIFxuIikpOwotCQkJfQotCQkJYnJlYWs7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfV01NOgotCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aAkhPSBzaXplb2YoQk9PTEVBTikpCi0JCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCWVsc2UKLQkJCXsKLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9XTU0gKD0lZCkJXG4iLCBwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBPSURfODAyXzExX0RJU0FTU09DSUFURToKLQkJCS8vCi0JCQkvLyBTZXQgTmRpc1JhZGlvU3RhdGVPZmYgdG8JVFJVRSwgaW5zdGVhZCBvZiBjYWxsZWQJTWxtZVJhZGlvT2ZmLgotCQkJLy8gTGF0ZXIgb24sIE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVgtPk51bWJlck9mSXRlbXMgc2hvdWxkIGJlCTAKLQkJCS8vIHdoZW4JcXVlcnkgT0lEXzgwMl8xMV9CU1NJRF9MSVNULgotCQkJLy8KLQkJCS8vIFRSVUU6ICBOdW1iZXJPZkl0ZW1zCXdpbGwgc2V0IHRvCTAuCi0JCQkvLyBGQUxTRTogTnVtYmVyT2ZJdGVtcwlubyBjaGFuZ2UuCi0JCQkvLwotCQkJcEFkLT5Db21tb25DZmcuTmRpc1JhZGlvU3RhdGVPZmYgPQlUUlVFOwotCQkJLy8gU2V0IHRvIGltbWVkaWF0ZWx5IHNlbmQgdGhlIG1lZGlhIGRpc2Nvbm5lY3QJZXZlbnQKLQkJCXBBZC0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcwk9IFRSVUU7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfRElTQVNTT0NJQVRFCVxuIikpOwotCi0KLQkJCWlmIChJTkZSQV9PTihwQWQpKQotCQkJewotCQkJCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9CUNOVExfSURMRSkKLQkJCQl7Ci0JCQkJCVJUTVBfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZCk7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FCWJ1c3ksIHJlc2V0CU1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKLQkJCQl9Ci0KLQkJCQlNbG1lRW5xdWV1ZShwQWQsCi0JCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAotCQkJCQlPSURfODAyXzExX0RJU0FTU09DSUFURSwKLQkJCQkJMCwKLQkJCQkJTlVMTCk7Ci0KLQkJCQlTdGF0ZU1hY2hpbmVUb3VjaGVkCT0gVFJVRTsKLQkJCX0KLQkJCWJyZWFrOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfSU1NRV9CQV9DQVA6Ci0JCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoT0lEX0JBQ0FQX1NUUlVDKSkKLQkJCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCQllbHNlCi0JCQkJewotCQkJCQlPSURfQkFDQVBfU1RSVUMgT3JkZSA7Ci0JCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZPcmRlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJCQlpZiAoT3JkZS5Qb2xpY3kgPiBCQV9OT1RVU0UpCi0JCQkJCXsKLQkJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChPcmRlLlBvbGljeSA9PSBCQV9OT1RVU0UpCi0JCQkJCXsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBCQV9OT1RVU0U7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OwotCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSA9IE9yZGUuQW1zZHVFbmFibGU7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplPSBPcmRlLkFtc2R1U2l6ZTsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHM9IE9yZGUuTU1QU21vZGU7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBPcmRlLk1NUFNtb2RlOwotCQkJCQkJLy8gVVBkYXRhIHRvIEhUIElFCi0JCQkJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9IE9yZGUuTU1QU21vZGU7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9IE9yZGUuQW1zZHVTaXplOwotCQkJCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gT3JkZS5BdXRvQkE7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gSU1NRURfQkE7IC8vIHdlIG9ubHkgc3VwcG9ydCBpbW1lZGlhdGUgQkEuCi0JCQkJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OwotCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSA9IE9yZGUuQW1zZHVFbmFibGU7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplPSBPcmRlLkFtc2R1U2l6ZTsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMgPSBPcmRlLk1NUFNtb2RlOwotCQkJCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gT3JkZS5NTVBTbW9kZTsKLQotCQkJCQkJLy8gVVBkYXRhIHRvIEhUIElFCi0JCQkJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9IE9yZGUuTU1QU21vZGU7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9IE9yZGUuQW1zZHVTaXplOwotCQkJCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7Ci0KLQkJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID4gTUFYX1JYX1JFT1JERVJCVUYpCi0JCQkJCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IE1BWF9SWF9SRU9SREVSQlVGOwotCi0JCQkJCX0KLQotCQkJCQlwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkud29yZCA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OihPcmRlLkF1dG9CQSA9ICVkKSAoUG9saWN5PSVkKShSZUJBV2luTGltaXQ9JWQpKFR4QkFXaW5MaW1pdD0lZCkoQXV0b01vZGU9JWQpXG4iLE9yZGUuQXV0b0JBLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5LAotCQkJCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCxwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuVHhCQVdpbkxpbWl0LCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBKSk7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6KE1pbW9QcyA9ICVkKShBbXNkdUVuYWJsZSA9ICVkKSAoQW1zZHVTaXplPSVkKShNcGR1RGVuc2l0eT0lZClcbiIscEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcywgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlLAotCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZSwgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5KSk7Ci0JCQkJfQotCi0JCQkJYnJlYWs7Ci0JCWNhc2UgUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQToKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBTZXQgOjogUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQSBcbiIpKTsKLQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE9JRF9BRERfQkFfRU5UUlkpKQotCQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJZWxzZQotCQkJewotCQkJCVVDSEFSCQkgICAgICAgIGluZGV4OwotCQkJCU9JRF9BRERfQkFfRU5UUlkgICAgQkE7Ci0JCQkJTUFDX1RBQkxFX0VOVFJZICAgICAqcEVudHJ5OwotCi0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkJBLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJCWlmIChCQS5USUQgPiAxNSkKLQkJCQl7Ci0JCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCS8vQkFUYWJsZUluc2VydEVudHJ5Ci0JCQkJCS8vQXMgYWQtaG9jIG1vZGUsIEJBIHBhaXIgaXMgbm90IGxpbWl0ZWQgdG8gb25seSBCU1NJRC4gc28gYWRkIHZpYSBPSUQuCi0JCQkJCWluZGV4ID0gQkEuVElEOwotCQkJCQkvLyBpbiBhZCBob2MgbW9kZSwgd2hlbiBhZGRpbmcgQkEgcGFpciwgd2Ugc2hvdWxkIGluc2VydCB0aGlzIGVudHJ5IGludG8gTUFDRW50cnkgdG9vCi0JCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgQkEuTUFDQWRkcik7Ci0JCQkJCWlmICghcEVudHJ5KQotCQkJCQl7Ci0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVF9PSURfODAyXzExX0FERF9JTU1FX0JBLiBicmVhayBvbiBubyBjb25uZWN0aW9uLi0tLS06JXg6JXhcbiIsIEJBLk1BQ0FkZHJbNF0sIEJBLk1BQ0FkZHJbNV0pKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWlmIChCQS5Jc1JlY2lwaWVudCA9PSBGQUxTRSkKLQkJCQkJewotCQkJCQkgICAgaWYgKHBFbnRyeS0+YklBbUJhZEF0aGVyb3MgPT0gVFJVRSkKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gMHgxMDsKLQotCQkJCQkJQkFPcmlTZXNzaW9uU2V0VXAocEFkLCBwRW50cnksIGluZGV4LCAwLCAxMDAsIFRSVUUpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJLy9CQVRhYmxlSW5zZXJ0RW50cnkocEFkLCBwRW50cnktPkFpZCwgQkEuTUFDQWRkciwgMCwgMHhmZmZmLCBCQS5USUQsIEJBLm5NU0RVLCBCQS5Jc1JlY2lwaWVudCk7Ci0JCQkJCX0KLQotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX0lNTUVfQkEuIFJlYyA9ICVkLiBNYWMgPSAleDoleDoleDoleDoleDoleCAuIFxuIiwKLQkJCQkJCUJBLklzUmVjaXBpZW50LCBCQS5NQUNBZGRyWzBdLCBCQS5NQUNBZGRyWzFdLCBCQS5NQUNBZGRyWzJdLCBCQS5NQUNBZGRyWzJdCi0JCQkJCQksIEJBLk1BQ0FkZHJbNF0sIEJBLk1BQ0FkZHJbNV0pKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBIFxuIikpOwotCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoT0lEX0FERF9CQV9FTlRSWSkpCi0JCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJUE9JRF9BRERfQkFfRU5UUlkJcEJBOwotCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OwotCi0JCQkJcEJBID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKLQotCQkJCWlmIChwQkEgPT0gTlVMTCkKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBSVF9PSURfODAyXzExX1RFQVJfSU1NRV9CQSBrbWFsbG9jKCkgY2FuJ3QgYWxsb2NhdGUgZW5vdWdoIG1lbW9yeVxuIikpOwotCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwQkEsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBSVF9PSURfODAyXzExX1RFQVJfSU1NRV9CQShUSUQ9JWQsIGJBbGxUaWQ9JWQpXG4iLCBwQkEtPlRJRCwgcEJBLT5iQWxsVGlkKSk7Ci0KLQkJCQkJaWYgKCFwQkEtPmJBbGxUaWQgJiYgKHBCQS0+VElEID4gTlVNX09GX1RJRCkpCi0JCQkJCXsKLQkJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0KLQkJCQkJaWYgKHBCQS0+SXNSZWNpcGllbnQgPT0gRkFMU0UpCi0JCQkJCXsKLQkJCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcEJBLT5NQUNBZGRyKTsKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBwQkEtPklzUmVjaXBpZW50ID09IEZBTFNFXG4iKSk7Ci0JCQkJCQlpZiAocEVudHJ5KQotCQkJCQkJewotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBwQkEtPnBFbnRyeVxuIikpOwotCQkJCQkJCUJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZCwgcEVudHJ5LT5BaWQsIHBCQS0+VElELCBGQUxTRSwgVFJVRSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IE5vdCBmb3VuZCBwRW50cnkgXG4iKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBCQS0+TUFDQWRkcik7Ci0JCQkJCQlpZiAocEVudHJ5KQotCQkJCQkJewotCQkJCQkJCUJBUmVjU2Vzc2lvblRlYXJEb3duKCBwQWQsIChVQ0hBUilwRW50cnktPkFpZCwgcEJBLT5USUQsIFRSVUUpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBOb3QgZm91bmQgcEVudHJ5IFxuIikpOwotCQkJCQl9Ci0JCQkJCWtmcmVlKHBCQSk7Ci0JCQkJfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLSAgICAgICAgLy8gRm9yIFdQQV9TVVBQTElDQU5UIHRvIHNldCBzdGF0aWMgd2VwIGtleQotCWNhc2UgT0lEXzgwMl8xMV9BRERfV0VQOgotCSAgICBwV2VwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKLQotCSAgICBpZihwV2VwS2V5ID09IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgRmFpbGVkISFcbiIpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBXZXBLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBpZiAoU3RhdHVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfV0VQLCBGYWlsZWQgKGxlbmd0aCBtaXNtYXRjaCkhIVxuIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotCQkgICAgICAgIEtleUlkeCA9IHBXZXBLZXktPktleUluZGV4ICYgMHgwZmZmZmZmZjsKLSAgICAgICAgICAgICAgICAvLyBLZXlJZHggbXVzdCBiZSAwIH4gMwotICAgICAgICAgICAgICAgIGlmIChLZXlJZHggPiA0KQotCQkJewotICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAsIEZhaWxlZCAoS2V5SWR4IG11c3QgYmUgc21hbGxlciB0aGFuIDQpISFcbiIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVUNIQVIgQ2lwaGVyQWxnID0gMDsKLSAgICAgICAgICAgICAgICAgICAgUFVDSEFSIEtleTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5LCAxNik7Ci0gICAgICAgICAgICAgICAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gKFVDSEFSKSBwV2VwS2V5LT5LZXlMZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5LCAmcFdlcEtleS0+S2V5TWF0ZXJpYWwsIHBXZXBLZXktPktleUxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHBXZXBLZXktPktleUxlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAsIG9ubHkgc3VwcG9ydCBDSVBIRVJfV0VQNjQobGVuOjUpICYgQ0lQSEVSX1dFUDEyOChsZW46MTMpISFcbiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIERlZmF1bHQga2V5IGZvciB0eCAoc2hhcmVkIGtleSkKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBXZXBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKLSAgICAgICAgICAgICAgICAgICAgewotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtLZXlJZHhdLktleSwgMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W0tleUlkeF0uS2V5TGVuID0gKFVDSEFSKSBwV2VwS2V5LT5LZXlMZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbS2V5SWR4XS5LZXksICZwV2VwS2V5LT5LZXlNYXRlcmlhbCwgcFdlcEtleS0+S2V5TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleUlkID0gS2V5SWR4OwotICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W0tleUlkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgS2V5SWR4OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0JCQkJCWlmICgocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpICYmCi0JCQkJCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSkKLQkJCQkJewotCQkJCQkJS2V5ID0gcFdlcEtleS0+S2V5TWF0ZXJpYWw7Ci0KLQkJCQkJCS8vIFNldCBHcm91cCBrZXkgbWF0ZXJpYWwgdG8gQXNpYwotCQkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKLQotCQkJCQkJLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBncm91cCBrZXkgdGFibGUKLQkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgTlVMTCk7Ci0KLQkJCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKLQotCQkJCQkvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQotCQkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwotCQkJCQl9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKQotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgS2V5ID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCi0JCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocFdlcEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXNzaWduIGdyb3VwIGtleSBpbmZvCi0JCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIE5VTEwpOwotCQkJCQkJLy8gQXNzaWduIHBhaXJ3aXNlIGtleSBpbmZvCi0JCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIHBFbnRyeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAgKGlkPTB4JXgsIExlbj0lZC1ieXRlKSwgJXNcbiIsIHBXZXBLZXktPktleUluZGV4LCBwV2VwS2V5LT5LZXlMZW5ndGgsIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkgPyAiUG9ydCBTZWN1cmVkIjoiUG9ydCBOT1QgU2VjdXJlZCIpKTsKLQkJCQl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBrZnJlZShwV2VwS2V5KTsKLSAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQkgICAgY2FzZSBPSURfU0VUX0NPVU5URVJNRUFTVVJFUzoKLSAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKGludCkpCi0gICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGVuYWJsZWQgPSAwOwotICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZlbmFibGVkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmIChlbmFibGVkID09IDEpCi0gICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID0gVFJVRTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIC8vIFdQQSBNSUMgZXJyb3Igc2hvdWxkIGJsb2NrIGFzc29jaWF0aW9uIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF9TRVRfQ09VTlRFUk1FQVNVUkVTIGJCbG9ja0Fzc29jPSVzXG4iLCBwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA/ICJUUlVFIjoiRkFMU0UiKSk7Ci0gICAgICAgICAgICB9Ci0JICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVDoKLQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVDSEFSKSkKLSAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmd3BhX3N1cHBsaWNhbnRfZW5hYmxlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gd3BhX3N1cHBsaWNhbnRfZW5hYmxlOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAoPSVkKVxuIiwgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSk7Ci0JCQl9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPSURfODAyXzExX0RFQVVUSEVOVElDQVRJT046Ci0gICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihNTE1FX0RFQVVUSF9SRVFfU1RSVUNUKSkKLSAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICAgICAgKnBJbmZvOwotCQlNTE1FX1FVRVVFX0VMRU0gKk1zZ0VsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKLSAgICAgICAgICAgICAgICBpZiAoTXNnRWxlbSA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzKCk6YWxsb2MgbWVtb3J5IGZhaWxlZCFcbiIsIF9fRlVOQ1RJT05fXykpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcEluZm8gPSAoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCAqKSBNc2dFbGVtLT5Nc2c7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEluZm8sIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgTWxtZURlYXV0aFJlcUFjdGlvbihwQWQsIE1zZ0VsZW0pOwotCQkJCWtmcmVlKE1zZ0VsZW0pOwotCi0gICAgICAgICAgICAgICAgaWYgKElORlJBX09OKHBBZCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBMaW5rRG93bihwQWQsIEZBTFNFKTsKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfREVBVVRIRU5USUNBVElPTiAoUmVhc29uPSVkKVxuIiwgcEluZm8tPlJlYXNvbikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9EUk9QX1VORU5DUllQVEVEOgotICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoaW50KSkKLSAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgZW5hYmxlZCA9IDA7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmVuYWJsZWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOwotCQkJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0JCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5Qb3J0U2VjdXJlZCA9IHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkOwotCQkJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0RST1BfVU5FTkNSWVBURUQgKD0lZClcbiIsIGVuYWJsZWQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWDoKLSAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKEJPT0xFQU4pKQotICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJRUVFODAyMXhTdGF0ZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJICAgICAgICBwQWQtPlN0YUNmZy5JRUVFODAyMVggPSBJRUVFODAyMXhTdGF0ZTsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWCAoPSVkKVxuIiwgSUVFRTgwMjF4U3RhdGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWF9SRVFVSVJFX0tFWToKLQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKEJPT0xFQU4pKQotCQkJCSBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQkJcEFkLT5TdGFDZmcuSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPSBJRUVFODAyMXhfcmVxdWlyZWRfa2V5czsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWF9SRVFVSVJFX0tFWSAoJWQpXG4iLCBJRUVFODAyMXhfcmVxdWlyZWRfa2V5cykpOwotCQkJfQotCQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9QTUtJRDoKLQkgICAgICAgIHBQbWtJZCA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7Ci0KLQkgICAgICAgIGlmKHBQbWtJZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBQbWtJZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQotCSAgICAgICAgLy8gY2hlY2sgdGhlIFBNS0lEIGluZm9ybWF0aW9uCi0JICAgICAgICBpZiAocFBta0lkLT5CU1NJREluZm9Db3VudCA9PSAwKQotICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlNhdmVkUE1LLCBzaXplb2YoQlNTSURfSU5GTykqUE1LSURfTk8pOwotCSAgICAgICAgZWxzZQotCSAgICAgICAgewotCQkgICAgICAgIFBCU1NJRF9JTkZPCXBCc3NJZEluZm87Ci0JCSAgICAgICAgVUlOVAkJQnNzSWR4OwotCQkgICAgICAgIFVJTlQJCUNhY2hlZElkeDsKLQotCQkgICAgICAgIGZvciAoQnNzSWR4ID0gMDsgQnNzSWR4IDwgcFBta0lkLT5CU1NJREluZm9Db3VudDsgQnNzSWR4KyspCi0JCSAgICAgICAgewotCQkJICAgICAgICAvLyBwb2ludCB0byB0aGUgaW5kZXhlZCBCU1NJRF9JTkZPIHN0cnVjdHVyZQotCQkJICAgICAgICBwQnNzSWRJbmZvID0gKFBCU1NJRF9JTkZPKSAoKFBVQ0hBUikgcFBta0lkICsgMiAqIHNpemVvZihVSU5UKSArIEJzc0lkeCAqIHNpemVvZihCU1NJRF9JTkZPKSk7Ci0JCQkgICAgICAgIC8vIEZpbmQgdGhlIGVudHJ5IGluIHRoZSBzYXZlZCBkYXRhIGJhc2UuCi0JCQkgICAgICAgIGZvciAoQ2FjaGVkSWR4ID0gMDsgQ2FjaGVkSWR4IDwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW07IENhY2hlZElkeCsrKQotCQkJICAgICAgICB7Ci0JCQkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAotCQkJCSAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwQnNzSWRJbmZvLT5CU1NJRCwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRCwgc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSkpCi0JCQkJCSAgICAgICAgYnJlYWs7Ci0JCQkgICAgICAgIH0KLQotCQkJICAgICAgICAvLyBGb3VuZCwgcmVwbGFjZSBpdAotCQkJICAgICAgICBpZiAoQ2FjaGVkSWR4IDwgUE1LSURfTk8pCi0JCQkgICAgICAgIHsKLQkJCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJVcGRhdGUgT0lEXzgwMl8xMV9QTUtJRCwgaWR4ID0gJWRcbiIsIENhY2hlZElkeCkpOwotCQkJCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0sIHBCc3NJZEluZm8sIHNpemVvZihCU1NJRF9JTkZPKSk7Ci0JCQkJICAgICAgICBwQWQtPlN0YUNmZy5TYXZlZFBNS051bSsrOwotCQkJICAgICAgICB9Ci0JCQkgICAgICAgIC8vIE5vdCBmb3VuZCwgcmVwbGFjZSB0aGUgbGFzdCBvbmUKLQkJCSAgICAgICAgZWxzZQotCQkJICAgICAgICB7Ci0JCQkJICAgICAgICAvLyBSYW5kb21seSByZXBsYWNlIG9uZQotCQkJCSAgICAgICAgQ2FjaGVkSWR4ID0gKHBCc3NJZEluZm8tPkJTU0lEWzVdICUgUE1LSURfTk8pOwotCQkJCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlVwZGF0ZSBPSURfODAyXzExX1BNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7Ci0JCQkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XSwgcEJzc0lkSW5mbywgc2l6ZW9mKEJTU0lEX0lORk8pKTsKLQkJCSAgICAgICAgfQotCQkgICAgICAgIH0KLQkJCX0KLQkJCWlmKHBQbWtJZCkKLQkJCQlrZnJlZShwUG1rSWQpOwotCSAgICAgICAgYnJlYWs7Ci0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0KLQotI2lmZGVmIFNOTVBfU1VQUE9SVAotCQljYXNlIE9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUOgotCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUxPTkcpKQotCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlNob3J0UmV0cnlMaW1pdCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOwotCQkJCXR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdCA9IFNob3J0UmV0cnlMaW1pdDsKLQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQgKHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSZXRyeUxpbWl0PSVkLCBTaG9ydFJldHJ5TGltaXQ9JWxkKVxuIiwgdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0LCBTaG9ydFJldHJ5TGltaXQpKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgT0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVCBcbiIpKTsKLQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKLQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJZWxzZQotCQkJewotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZMb25nUmV0cnlMaW1pdCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOwotCQkJCXR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0ID0gTG9uZ1JldHJ5TGltaXQ7Ci0JCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUlRZX0NGRywgdHhfcnR5X2NmZy53b3JkKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQgKHR4X3J0eV9jZmcuZmllbGQuTG9uZ1JldHJ5TGltaXQ9ICVkLExvbmdSZXRyeUxpbWl0PSVsZClcbiIsIHR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0LCBMb25nUmV0cnlMaW1pdCkpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRToKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUVcbiIpKTsKLQkJCXBLZXkgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgR0ZQX0tFUk5FTCk7Ci0JCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJLy9wS2V5ID0gJldlcEtleTsKLQotCQkJaWYgKCBwS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQotCQkJewotCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRSwgRmFpbGVkISFcbiIpKTsKLQkJCX0KLQkJCUtleUlkeCA9IHBLZXktPktleUluZGV4ICYgMHgwZmZmZmZmZjsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgicEtleS0+S2V5SW5kZXggPSVkLCBwS2V5LT5LZXlMZW5ndGg9JWRcbiIsIHBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKLQotCQkJLy8gaXQgaXMgYSBzaGFyZWQga2V5Ci0JCQlpZiAoS2V5SWR4ID4gNCkKLQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJZWxzZQotCQkJewotCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuID0gKFVDSEFSKSBwS2V5LT5LZXlMZW5ndGg7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7Ci0JCQkJaWYgKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKLQkJCQl7Ci0JCQkJCS8vIERlZmF1bHQga2V5IGZvciB0eCAoc2hhcmVkIGtleSkKLQkJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSBLZXlJZHg7Ci0JCQkJfQotCQkJCS8vUmVzdGFydEFQSXNSZXF1aXJlZCA9IFRSVUU7Ci0JCQl9Ci0JCQlicmVhazsKLQotCi0JCWNhc2UgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQ6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfV0VQREVGQVVMVEtFWUlEIFxuIikpOwotCi0JCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVQ0hBUikpCi0JCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCWVsc2UKLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCi0JCQlicmVhazsKLQotCi0JCWNhc2UgT0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTCBcbiIpKTsKLQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVDSEFSKSkKLQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJZWxzZQotCQkJewotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZjdG1wLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJCXNwcmludGYoKFBTVFJJTkcpJmN0bXAsIiVkIiwgY3RtcCk7Ci0JCQkJU2V0X0NoYW5uZWxfUHJvYyhwQWQsIChQU1RSSU5HKSZjdG1wKTsKLQkJCX0KLQkJCWJyZWFrOwotI2VuZGlmCi0KLQotCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfUFNQWExJTktfTU9ERToKLQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKEJPT0xFQU4pKQotICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZwQWQtPkNvbW1vbkNmZy5QU1BYbGluaywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCQkvKmlmIChwQWQtPkNvbW1vbkNmZy5QU1BYbGluaykKLQkJCQkJUlhfRklMVEVSX1NFVF9GTEFHKHBBZCwgZlJYX0ZJTFRFUl9BQ0NFUFRfUFJPTUlTQ1VPVVMpKi8KLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfUFNQWExJTktfTU9ERSg9JWQpIFxuIiwgcEFkLT5Db21tb25DZmcuUFNQWGxpbmspKTsKLSAgICAgICAgICAgIH0KLQkJCWJyZWFrOwotCi0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6dW5rbm93biBJT0NUTCdzIHN1YmNtZCA9IDB4JTA4eFxuIiwgY21kKSk7Ci0gICAgICAgICAgICBTdGF0dXMgPSAtRU9QTk9UU1VQUDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotCi0gICAgcmV0dXJuIFN0YXR1czsKLX0KLQotSU5UIFJUTVBRdWVyeUluZm9ybWF0aW9uKAotICAgIElOICBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiAgT1VUIHN0cnVjdCBpZnJlcSAgICAqcnEsCi0gICAgSU4gIElOVCAgICAgICAgICAgICAgICAgY21kKQotewotICAgIHN0cnVjdCBpd3JlcSAgICAgICAgICAgICAgICAgICAgICAgICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOwotICAgIE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVggICAgICAgICAgICpwQnNzaWRMaXN0ID0gTlVMTDsKLSAgICBQTkRJU19XTEFOX0JTU0lEX0VYICAgICAgICAgICAgICAgICBwQnNzOwotICAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQ7Ci0gICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAgICAgICAgICAgKnBDb25maWd1cmF0aW9uID0gTlVMTDsKLSAgICBSVF84MDJfMTFfTElOS19TVEFUVVMgICAgICAgICAgICAgICAqcExpbmtTdGF0dXMgPSBOVUxMOwotICAgIFJUXzgwMl8xMV9TVEFfQ09ORklHICAgICAgICAgICAgICAgICpwU3RhQ29uZmlnID0gTlVMTDsKLSAgICBORElTXzgwMl8xMV9TVEFUSVNUSUNTICAgICAgICAgICAgICAqcFN0YXRpc3RpY3MgPSBOVUxMOwotICAgIE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQgICAgICAgICAgIFJ0c1RocmVzaDsKLSAgICBORElTXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCBGcmFnVGhyZXNoOwotICAgIE5ESVNfODAyXzExX1BPV0VSX01PREUgICAgICAgICAgICAgIFBvd2VyTW9kZTsKLSAgICBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFICBCc3NUeXBlOwotICAgIFJUXzgwMl8xMV9QUkVBTUJMRSAgICAgICAgICAgICAgICAgIFByZWFtVHlwZTsKLSAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZTsKLSAgICBORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7Ci0gICAgTkRJU19NRURJQV9TVEFURSAgICAgICAgICAgICAgICAgICAgTWVkaWFTdGF0ZTsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCc3NCdWZTaXplLCB1bEluZm89MCwgTmV0d29ya1R5cGVMaXN0WzRdLCBhcHNkID0gMDsKLSAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCc3NMZW4gPSAwOwotICAgIFBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWYgPSBOVUxMLCBwUHRyOwotICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0gICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VfdmVyc2lvbl9jb21waWxlZDsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBQYWRkaW5nID0gMDsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWRpb1N0YXRlOwotCVNUUklORwkJCQkJCQkJZHJpdmVyVmVyc2lvbls4XTsKLSAgICBPSURfU0VUX0hUX1BIWU1PREUJCQkgICAgICAgICpwSFRQaHlNb2RlID0gTlVMTDsKLQotCi0jaWZkZWYgU05NUF9TVVBQT1JUCi0JLy9mb3Igc25tcCwga2F0aHkKLQlEZWZhdWx0S2V5SWR4VmFsdWUJCQkqcEtleUlkeFZhbHVlOwotCUlOVAkJCQkJCQl2YWx1ZUxlbjsKLQlUWF9SVFlfQ0ZHX1NUUlVDCQkJdHhfcnR5X2NmZzsKLQlVTE9ORwkJCQkJCVNob3J0UmV0cnlMaW1pdCwgTG9uZ1JldHJ5TGltaXQ7Ci0JVUNIQVIJCQkJCQl0bXBbNjRdOwotI2VuZGlmIC8vU05NUAotCi0gICAgc3dpdGNoKGNtZCkKLSAgICB7Ci0gICAgICAgIGNhc2UgUlRfT0lEX0RFVklDRV9OQU1FOgotICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBBZC0+bmlja25hbWUpOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBBZC0+bmlja25hbWUsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSVF9PSURfVkVSU0lPTl9JTkZPOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9WRVJTSU9OX0lORk8gXG4iKSk7Ci0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSA4KnNpemVvZihDSEFSKTsKLQkJCXNwcmludGYoJmRyaXZlclZlcnNpb25bMF0sICIlcyIsIFNUQV9EUklWRVJfVkVSU0lPTik7Ci0JCQlkcml2ZXJWZXJzaW9uWzddID0gJ1wwJzsKLQkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmRyaXZlclZlcnNpb25bMF0sIHdycS0+dS5kYXRhLmxlbmd0aCkpCi0gICAgICAgICAgICB7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9CU1NJRF9MSVNUOgotICAgICAgICAgICAgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCi0gICAgICAgICAgICB7Ci0JCS8qCi0JCSAqIFN0aWxsIHNjYW5uaW5nLCBpbmRpY2F0ZSB0aGUgY2FsbGVyIHNob3VsZCB0cnkgYWdhaW4uCi0JCSAqLwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUIChTdGlsbCBzY2FubmluZylcbiIpKTsKLQkJCQlyZXR1cm4gLUVBR0FJTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JTU0lEX0xJU1QgKCVkIEJTUyByZXR1cm5lZClcbiIscEFkLT5TY2FuVGFiLkJzc05yKSk7Ci0JCQlwQWQtPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7Ci0gICAgICAgICAgICAvLyBDbGFjdWxhdGUgdG90YWwgYnVmZmVyIHNpemUgcmVxdWlyZWQKLSAgICAgICAgICAgIEJzc0J1ZlNpemUgPSBzaXplb2YoVUxPTkcpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEFkLT5TY2FuVGFiLkJzc05yOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gQWxpZ24gcG9pbnRlciB0byA0IGJ5dGVzIGJvdW5kYXJ5LgotICAgICAgICAgICAgICAgIC8vUGFkZGluZyA9IDQgLSAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gJiAweDAwMDMpOwotICAgICAgICAgICAgICAgIC8vaWYgKFBhZGRpbmcgPT0gNCkKLSAgICAgICAgICAgICAgICAvLyAgICBQYWRkaW5nID0gMDsKLSAgICAgICAgICAgICAgICBCc3NCdWZTaXplICs9IChzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSArIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbiArIFBhZGRpbmcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBGb3Igc2FmZXR5IGlzc3VlLCB3ZSBhZGQgMjU2IGJ5dGVzIGp1c3QgaW4gY2FzZQotICAgICAgICAgICAgQnNzQnVmU2l6ZSArPSAyNTY7Ci0gICAgICAgICAgICAvLyBBbGxvY2F0ZSB0aGUgc2FtZSBzaXplIGFzIHBhc3NlZCBmcm9tIGhpZ2hlciBsYXllcgotICAgICAgICAgICAgcEJ1ZiA9IGttYWxsb2MoQnNzQnVmU2l6ZSwgTUVNX0FMTE9DX0ZMQUcpOwotICAgICAgICAgICAgaWYocEJ1ZiA9PSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbml0IDgwMl8xMV9CU1NJRF9MSVNUX0VYIHN0cnVjdHVyZQotICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEJ1ZiwgQnNzQnVmU2l6ZSk7Ci0gICAgICAgICAgICBwQnNzaWRMaXN0ID0gKFBORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYKSBwQnVmOwotICAgICAgICAgICAgcEJzc2lkTGlzdC0+TnVtYmVyT2ZJdGVtcyA9IHBBZC0+U2NhblRhYi5Cc3NOcjsKLQotICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRvdGFsIGJ1ZmZlciBsZW5ndGgKLSAgICAgICAgICAgIEJzc0xlbiA9IDQ7IC8vIENvbnNpc3Qgb2YgTnVtYmVyT2ZJdGVtcwotICAgICAgICAgICAgLy8gUG9pbnQgdG8gc3RhcnQgb2YgTkRJU19XTEFOX0JTU0lEX0VYCi0gICAgICAgICAgICAvLyBwUHRyID0gcEJ1ZiArIHNpemVvZihVTE9ORyk7Ci0gICAgICAgICAgICBwUHRyID0gKFBVQ0hBUikgJnBCc3NpZExpc3QtPkJzc2lkWzBdOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBBZC0+U2NhblRhYi5Cc3NOcjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBCc3MgPSAoUE5ESVNfV0xBTl9CU1NJRF9FWCkgcFB0cjsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEJzcy0+TWFjQWRkcmVzcywgJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKLSAgICAgICAgICAgICAgICBpZiAoKHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5IaWRkZW4gPT0gMSkgJiYgKHBBZC0+U3RhQ2ZnLmJTaG93SGlkZGVuU1NJRCA9PSBGQUxTRSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLwotCQkJCQkvLyBXZSBtdXN0IHJldHVybiB0aGlzIFNTSUQgZHVyaW5nIDR3YXkgaGFuZHNoYWtpbmcsIG90aGVyd2lzZSBBZWdpcyB3aWxsIGZhaWxlZCB0byBwYXJzZSBXUEEgaW5mb21hdGlvbgotCQkJCQkvLyBhbmQgdGhlbiBmYWlsZWQgdG8gc2VuZCBFQVBPbCBmYXJhbWUuCi0JCQkJCS8vCi0JCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSAmJiAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgIT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpKQotCQkJCQl7Ci0JCQkJCQlwQnNzLT5Tc2lkLlNzaWRMZW5ndGggPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbjsKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPlNzaWQuU3NpZCwgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWQsIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQlwQnNzLT5Tc2lkLlNzaWRMZW5ndGggPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQnNzLT5Tc2lkLlNzaWRMZW5ndGggPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbjsKLSAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+U3NpZC5Tc2lkLCBwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZCwgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwQnNzLT5Qcml2YWN5ID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlByaXZhY3k7Ci0gICAgICAgICAgICAgICAgcEJzcy0+UnNzaSA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKLSAgICAgICAgICAgICAgICBwQnNzLT5OZXR3b3JrVHlwZUluVXNlID0gTmV0d29ya1R5cGVJblVzZVNhbml0eSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldKTsKLSAgICAgICAgICAgICAgICBwQnNzLT5Db25maWd1cmF0aW9uLkxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKTsKLSAgICAgICAgICAgICAgICBwQnNzLT5Db25maWd1cmF0aW9uLkJlYWNvblBlcmlvZCA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5CZWFjb25QZXJpb2Q7Ci0gICAgICAgICAgICAgICAgcEJzcy0+Q29uZmlndXJhdGlvbi5BVElNV2luZG93ID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkF0aW1XaW47Ci0KLSAgICAgICAgICAgICAgICBNQVBfQ0hBTk5FTF9JRF9UT19LSFoocEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWwsIHBCc3MtPkNvbmZpZ3VyYXRpb24uRFNDb25maWcpOwotCi0gICAgICAgICAgICAgICAgaWYgKHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NUeXBlID09IEJTU19JTkZSQSkKLSAgICAgICAgICAgICAgICAgICAgcEJzcy0+SW5mcmFzdHJ1Y3R1cmVNb2RlID0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcEJzcy0+SW5mcmFzdHJ1Y3R1cmVNb2RlID0gTmRpczgwMl8xMUlCU1M7Ci0KLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5TdXBwb3J0ZWRSYXRlcywgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGUsIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuKTsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5TdXBwb3J0ZWRSYXRlcyArIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5FeHRSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5FeHRSYXRlTGVuKTsKLQotICAgICAgICAgICAgICAgIGlmIChwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBCc3MtPklFTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcyk7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPklFcywgJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5GaXhJRXMsIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpKTsKLSAgICAgICAgICAgICAgICAgICAgcFB0ciA9IHBQdHIgKyBzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEJzcy0+SUVMZW5ndGggPSAoVUxPTkcpKHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpICsgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuKTsKLSAgICAgICAgICAgICAgICAgICAgcFB0ciA9IHBQdHIgKyBzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKTsKLSAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+SUVzLCAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkZpeElFcywgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykpOwotICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5JRXMgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSwgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFcywgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuKTsKLSAgICAgICAgICAgICAgICAgICAgcFB0ciArPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBCc3MtPkxlbmd0aCA9IChVTE9ORykoc2l6ZW9mKE5ESVNfV0xBTl9CU1NJRF9FWCkgLSAxICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykgKyBwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gKyBQYWRkaW5nKTsKLQotI2lmIFdJUkVMRVNTX0VYVCA8IDE3Ci0gICAgICAgICAgICAgICAgaWYgKChCc3NMZW4gKyBwQnNzLT5MZW5ndGgpIDwgd3JxLT51LmRhdGEubGVuZ3RoKQotICAgICAgICAgICAgICAgIEJzc0xlbiArPSBwQnNzLT5MZW5ndGg7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEJzc2lkTGlzdC0+TnVtYmVyT2ZJdGVtcyA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSNlbHNlCi0gICAgICAgICAgICAgICAgQnNzTGVuICs9IHBCc3MtPkxlbmd0aDsKLSNlbmRpZgotICAgICAgICAgICAgfQotCi0jaWYgV0lSRUxFU1NfRVhUIDwgMTcKLSAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IEJzc0xlbjsKLSNlbHNlCi0gICAgICAgICAgICBpZiAoQnNzTGVuID4gd3JxLT51LmRhdGEubGVuZ3RoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGtmcmVlKHBCc3NpZExpc3QpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gQnNzTGVuOwotI2VuZGlmCi0gICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEJzc2lkTGlzdCwgQnNzTGVuKTsKLSAgICAgICAgICAgIGtmcmVlKHBCc3NpZExpc3QpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8zX0NVUlJFTlRfQUREUkVTUzoKLSAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IE1BQ19BRERSX0xFTjsKLSAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkLT5DdXJyZW50QWRkcmVzcywgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF9HRU5fTUVESUFfQ09OTkVDVF9TVEFUVVM6Ci0gICAgICAgICAgICBpZiAocEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPT0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQpCi0gICAgICAgICAgICAgICAgTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIE1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKLQotICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE5ESVNfTUVESUFfU1RBVEUpOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZNZWRpYVN0YXRlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9CU1NJRDoKLSAgICAgICAgICAgIGlmIChJTkZSQV9PTihwQWQpIHx8IEFESE9DX09OKHBBZCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9CU1NJRCg9RU1QVFkpXG4iKSk7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT1RDT05OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TU0lEOgotCQkJTmRpc1plcm9NZW1vcnkoJlNzaWQsIHNpemVvZihORElTXzgwMl8xMV9TU0lEKSk7Ci0JCQlOZGlzWmVyb01lbW9yeShTc2lkLlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7Ci0gICAgICAgICAgICBTc2lkLlNzaWRMZW5ndGggPSBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuOwotCQkJbWVtY3B5KFNzaWQuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZCwJU3NpZC5Tc2lkTGVuZ3RoKTsKLSAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9TU0lEKTsKLSAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmU3NpZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NTSUQgKExlbj0lZCwgc3NpZD0lcylcbiIsIFNzaWQuU3NpZExlbmd0aCxTc2lkLlNzaWQpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfTElOS19TVEFUVVM6Ci0gICAgICAgICAgICBwTGlua1N0YXR1cyA9IChSVF84MDJfMTFfTElOS19TVEFUVVMgKikga21hbGxvYyhzaXplb2YoUlRfODAyXzExX0xJTktfU1RBVFVTKSwgTUVNX0FMTE9DX0ZMQUcpOwotICAgICAgICAgICAgaWYgKHBMaW5rU3RhdHVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBMaW5rU3RhdHVzLT5DdXJyVHhSYXRlID0gUmF0ZUlkVG81MDBLYnBzW3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZV07ICAgLy8gdW5pdCA6IDUwMCBrYnBzCi0gICAgICAgICAgICAgICAgcExpbmtTdGF0dXMtPkNoYW5uZWxRdWFsaXR5ID0gcEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5OwotICAgICAgICAgICAgICAgIHBMaW5rU3RhdHVzLT5SeEJ5dGVDb3VudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuUmVjZWl2ZWRCeXRlQ291bnQ7Ci0gICAgICAgICAgICAgICAgcExpbmtTdGF0dXMtPlR4Qnl0ZUNvdW50ID0gcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudDsKLQkJCXBMaW5rU3RhdHVzLT5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsOwotICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF84MDJfMTFfTElOS19TVEFUVVMpOwotICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwTGlua1N0YXR1cywgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBrZnJlZShwTGlua1N0YXR1cyk7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTElOS19TVEFUVVNcbiIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9MSU5LX1NUQVRVUyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OOgotICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24gPSAoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAqKSBrbWFsbG9jKHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKSwgTUVNX0FMTE9DX0ZMQUcpOwotICAgICAgICAgICAgaWYgKHBDb25maWd1cmF0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDb25maWd1cmF0aW9uLT5MZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTik7Ci0gICAgICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24tPkJlYWNvblBlcmlvZCA9IHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZDsKLSAgICAgICAgICAgICAgICBwQ29uZmlndXJhdGlvbi0+QVRJTVdpbmRvdyA9IHBBZC0+U3RhQWN0aXZlLkF0aW1XaW47Ci0gICAgICAgICAgICAgICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBDb25maWd1cmF0aW9uLT5EU0NvbmZpZyk7Ci0gICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pOwotICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwQ29uZmlndXJhdGlvbiwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OKEJlYWNvblBlcmlvZD0lbGQsQXRpbVc9JWxkLENoYW5uZWw9JWQpIFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlndXJhdGlvbi0+QmVhY29uUGVyaW9kLCBwQ29uZmlndXJhdGlvbi0+QVRJTVdpbmRvdywgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOwotCQkJCWtmcmVlKHBDb25maWd1cmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OKGttYWxsb2MgZmFpbGVkKVxuIikpOwotICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQkJY2FzZSBSVF9PSURfODAyXzExX1NOUl8wOgotCQkJaWYgKChwQWQtPlN0YUNmZy5MYXN0U05SMCA+IDApKQotCQkJewotCQkJCXVsSW5mbyA9ICgoMHhlYgktIHBBZC0+U3RhQ2ZnLkxhc3RTTlIwKSAqIDMpIC8JMTYgOwotCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOwotCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NOUl8wKDB4PSVseClcbiIsIHVsSW5mbykpOwotCQkJfQotICAgICAgICAgICAgZWxzZQotCQkJICAgIFN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJY2FzZSBSVF9PSURfODAyXzExX1NOUl8xOgotCQkJaWYgKChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoCT4gMSkgJiYKLSAgICAgICAgICAgICAgICAocEFkLT5TdGFDZmcuTGFzdFNOUjEgPiAwKSkKLQkJCXsKLQkJCQl1bEluZm8gPSAoKDB4ZWIJLSBwQWQtPlN0YUNmZy5MYXN0U05SMSkgKiAzKSAvCTE2IDsKLQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKLQkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NOUl8xKDB4PSVseClcbiIsdWxJbmZvKSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUXVlcnk6OlJUX09JRF84MDJfMTFfU05SXzEocEFkLT5TdGFDZmcuTGFzdFNOUjE9JWQpXG4iLHBBZC0+U3RhQ2ZnLkxhc3RTTlIxKSk7Ci0JCQlicmVhazsKLSAgICAgICAgY2FzZSBPSURfODAyXzExX1JTU0lfVFJJR0dFUjoKLSAgICAgICAgICAgIHVsSW5mbyA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKLSAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9SU1NJX1RSSUdHRVIoPSVsZClcbiIsIHVsSW5mbykpOwotICAgICAgICAgICAgYnJlYWs7Ci0JCWNhc2UgT0lEXzgwMl8xMV9SU1NJOgotICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUlNTSToKLQkJCXVsSW5mbyA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwOwotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7Ci0JCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCWJyZWFrOwotCQljYXNlIFJUX09JRF84MDJfMTFfUlNTSV8xOgotICAgICAgICAgICAgdWxJbmZvID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTE7Ci0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SU1NJXzI6Ci0gICAgICAgICAgICB1bEluZm8gPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMjsKLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlicmVhazsKLSAgICAgICAgY2FzZSBPSURfODAyXzExX1NUQVRJU1RJQ1M6Ci0gICAgICAgICAgICBwU3RhdGlzdGljcyA9IChORElTXzgwMl8xMV9TVEFUSVNUSUNTICopIGttYWxsb2Moc2l6ZW9mKE5ESVNfODAyXzExX1NUQVRJU1RJQ1MpLCBNRU1fQUxMT0NfRkxBRyk7Ci0gICAgICAgICAgICBpZiAocFN0YXRpc3RpY3MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfU1RBVElTVElDUyBcbiIpKTsKLSAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIG1vc3QgdXAtdG8tZGF0ZSBoL3cgcmF3IGNvdW50ZXJzIGludG8gc29mdHdhcmUgY291bnRlcnMKLQkJCSAgICBOSUNVcGRhdGVSYXdDb3VudGVycyhwQWQpOwotCi0gICAgICAgICAgICAgICAgLy8gU2FuaXR5IGNoZWNrIGZvciBjYWxjdWxhdGlvbiBvZiBzdWNlc3NmdWwgY291bnQKLSAgICAgICAgICAgICAgICBpZiAocEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0IDwgcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydCkKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0ID0gcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydDsKLQotICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgPSBwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQ7Ci0gICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPk11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudC5RdWFkUGFydCA9IHBBZC0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudC5RdWFkUGFydDsKLSAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RmFpbGVkQ291bnQuUXVhZFBhcnQgPSBwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC5RdWFkUGFydDsKLSAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+UmV0cnlDb3VudC5RdWFkUGFydCA9IHBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQ7Ci0gICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPk11bHRpcGxlUmV0cnlDb3VudC5RdWFkUGFydCA9IHBBZC0+V2xhbkNvdW50ZXJzLk11bHRpcGxlUmV0cnlDb3VudC5RdWFkUGFydDsKLSAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+UlRTU3VjY2Vzc0NvdW50LlF1YWRQYXJ0ID0gcEFkLT5XbGFuQ291bnRlcnMuUlRTU3VjY2Vzc0NvdW50LlF1YWRQYXJ0OwotICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5SVFNGYWlsdXJlQ291bnQuUXVhZFBhcnQgPSBwQWQtPldsYW5Db3VudGVycy5SVFNGYWlsdXJlQ291bnQuUXVhZFBhcnQ7Ci0gICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkFDS0ZhaWx1cmVDb3VudC5RdWFkUGFydCA9IHBBZC0+V2xhbkNvdW50ZXJzLkFDS0ZhaWx1cmVDb3VudC5RdWFkUGFydDsKLSAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RnJhbWVEdXBsaWNhdGVDb3VudC5RdWFkUGFydCA9IHBBZC0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQuUXVhZFBhcnQ7Ci0gICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCA9IHBBZC0+V2xhbkNvdW50ZXJzLlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydDsKLSAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+TXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50LlF1YWRQYXJ0ID0gcEFkLT5XbGFuQ291bnRlcnMuTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50LlF1YWRQYXJ0OwotI2lmZGVmIERCRwotICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GQ1NFcnJvckNvdW50ID0gcEFkLT5SYWxpbmtDb3VudGVycy5SZWFsRmNzRXJyQ291bnQ7Ci0jZWxzZQotICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GQ1NFcnJvckNvdW50LlF1YWRQYXJ0ID0gcEFkLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC5RdWFkUGFydDsKLSAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RnJhbWVEdXBsaWNhdGVDb3VudC51Lkxvd1BhcnQgPSBwQWQtPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LnUuTG93UGFydCAvIDEwMDsKLSNlbmRpZgotICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9TVEFUSVNUSUNTKTsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFN0YXRpc3RpY3MsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAga2ZyZWUocFN0YXRpc3RpY3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NUQVRJU1RJQ1Moa21hbGxvYyBmYWlsZWQpXG4iKSk7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF9HRU5fUkNWX09LOgotICAgICAgICAgICAgdWxJbmZvID0gcEFkLT5Db3VudGVyczgwMjMuR29vZFJlY2VpdmVzOwotICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7Ci0gICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF9HRU5fUkNWX05PX0JVRkZFUjoKLSAgICAgICAgICAgIHVsSW5mbyA9IHBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXI7Ci0gICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKLSAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9QSFlfTU9ERToKLSAgICAgICAgICAgIHVsSW5mbyA9IChVTE9ORylwQWQtPkNvbW1vbkNmZy5QaHlNb2RlOwotICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7Ci0gICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BIWV9NT0RFICg9JWxkKVxuIiwgdWxJbmZvKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1NUQV9DT05GSUc6Ci0gICAgICAgICAgICBwU3RhQ29uZmlnID0gKFJUXzgwMl8xMV9TVEFfQ09ORklHICopIGttYWxsb2Moc2l6ZW9mKFJUXzgwMl8xMV9TVEFfQ09ORklHKSwgTUVNX0FMTE9DX0ZMQUcpOwotICAgICAgICAgICAgaWYgKHBTdGFDb25maWcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJR1xuIikpOwotICAgICAgICAgICAgICAgIHBTdGFDb25maWctPkVuYWJsZVR4QnVyc3QgPSBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdDsKLSAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5FbmFibGVUdXJib1JhdGUgPSAwOwotICAgICAgICAgICAgICAgIHBTdGFDb25maWctPlVzZUJHUHJvdGVjdGlvbiA9IHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbjsKLSAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5Vc2VTaG9ydFNsb3RUaW1lID0gcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWU7Ci0gICAgICAgICAgICAgICAgLy9wU3RhQ29uZmlnLT5BZGhvY01vZGUgPSBwQWQtPlN0YUNmZy5BZGhvY01vZGU7Ci0gICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+SHdSYWRpb1N0YXR1cyA9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyA9PSBUUlVFKSA/IDEgOiAwOwotICAgICAgICAgICAgICAgIHBTdGFDb25maWctPlJzdjEgPSAwOwotICAgICAgICAgICAgICAgIHBTdGFDb25maWctPlN5c3RlbUVycm9yQml0bWFwID0gcEFkLT5TeXN0ZW1FcnJvckJpdG1hcDsKLSAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfODAyXzExX1NUQV9DT05GSUcpOwotICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwU3RhQ29uZmlnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGtmcmVlKHBTdGFDb25maWcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NUQV9DT05GSUcoa21hbGxvYyBmYWlsZWQpXG4iKSk7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRDoKLSAgICAgICAgICAgIFJ0c1RocmVzaCA9IHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZDsKLSAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSdHNUaHJlc2gpOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZSdHNUaHJlc2gsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xEKD0lbGQpXG4iLCBSdHNUaHJlc2gpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQ6Ci0gICAgICAgICAgICBGcmFnVGhyZXNoID0gcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQ7Ci0gICAgICAgICAgICBpZiAocEFkLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9PSBUUlVFKQotICAgICAgICAgICAgICAgIEZyYWdUaHJlc2ggPSAwOwotICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEZyYWdUaHJlc2gpOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZGcmFnVGhyZXNoLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQoPSVsZClcbiIsIEZyYWdUaHJlc2gpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF84MDJfMTFfUE9XRVJfTU9ERToKLSAgICAgICAgICAgIFBvd2VyTW9kZSA9IHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGU7Ci0gICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUG93ZXJNb2RlKTsKLSAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmUG93ZXJNb2RlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfUE9XRVJfTU9ERSg9JWQpXG4iLCBQb3dlck1vZGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUkFESU86Ci0gICAgICAgICAgICBSYWRpb1N0YXRlID0gKEJPT0xFQU4pIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvOwotICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJhZGlvU3RhdGUpOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZSYWRpb1N0YXRlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfUkFESU8gKD0lZClcbiIsIFJhZGlvU3RhdGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERToKLSAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKLSAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMUlCU1M7Ci0gICAgICAgICAgICBlbHNlIGlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKLSAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlOwotICAgICAgICAgICAgZWxzZSBpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfTU9OSVRPUikKLSAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMU1vbml0b3I7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgQnNzVHlwZSA9IE5kaXM4MDJfMTFBdXRvVW5rbm93bjsKLQotICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEJzc1R5cGUpOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZCc3NUeXBlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERSg9JWQpXG4iLCBCc3NUeXBlKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1BSRUFNQkxFOgotICAgICAgICAgICAgUHJlYW1UeXBlID0gcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZTsKLSAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihQcmVhbVR5cGUpOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZQcmVhbVR5cGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QUkVBTUJMRSg9JWQpXG4iLCBQcmVhbVR5cGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERToKLSAgICAgICAgICAgIEF1dGhNb2RlID0gcEFkLT5TdGFDZmcuQXV0aE1vZGU7Ci0gICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoQXV0aE1vZGUpOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZBdXRoTW9kZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUoPSVkKVxuIiwgQXV0aE1vZGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF84MDJfMTFfV0VQX1NUQVRVUzoKLSAgICAgICAgICAgIFdlcFN0YXR1cyA9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKLSAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihXZXBTdGF0dXMpOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZXZXBTdGF0dXMsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9XRVBfU1RBVFVTKD0lZClcbiIsIFdlcFN0YXR1cykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTDoKLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7Ci0JCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTCAleFxuIixwQWQtPkNvbW1vbkNmZy5UeFBvd2VyKSk7Ci0JCQlicmVhazsKLSAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzE6Ci0gICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzEgKD0lbGQpXG4iLCBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSkpOwotCQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVTX1NVUFBPUlRFRDoKLQkJCWlmICgocEFkLT5SZkljVHlwZQk9PSBSRklDXzI4NTApIHx8IChwQWQtPlJmSWNUeXBlID09CVJGSUNfMjc1MCkgfHwgKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDUyKSkKLQkJCXsKLQkJCQlOZXR3b3JrVHlwZUxpc3RbMF0gPSAzOyAgICAgICAgICAgICAgICAgLy8gTnVtYmVyT2ZJdGVtcyA9IDMKLQkJCQlOZXR3b3JrVHlwZUxpc3RbMV0gPSBOZGlzODAyXzExRFM7ICAgICAgLy8gTmV0d29ya1R5cGVbMV0gPSAxMWIKLQkJCQlOZXR3b3JrVHlwZUxpc3RbMl0gPSBOZGlzODAyXzExT0ZETTI0OyAgLy8gTmV0d29ya1R5cGVbMl0gPSAxMWcKLQkJCQlOZXR3b3JrVHlwZUxpc3RbM10gPSBOZGlzODAyXzExT0ZETTU7ICAgLy8gTmV0d29ya1R5cGVbM10gPSAxMWEKLSAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSAxNjsKLQkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk5ldHdvcmtUeXBlTGlzdFswXSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlOZXR3b3JrVHlwZUxpc3RbMF0gPSAyOyAgICAgICAgICAgICAgICAgLy8gTnVtYmVyT2ZJdGVtcyA9IDIKLQkJCQlOZXR3b3JrVHlwZUxpc3RbMV0gPSBOZGlzODAyXzExRFM7ICAgICAgLy8gTmV0d29ya1R5cGVbMV0gPSAxMWIKLQkJCQlOZXR3b3JrVHlwZUxpc3RbMl0gPSBOZGlzODAyXzExT0ZETTI0OyAgLy8gTmV0d29ya1R5cGVbMl0gPSAxMWcKLQkJCSAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSAxMjsKLQkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk5ldHdvcmtUeXBlTGlzdFswXSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCX0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX05FVFdPUktfVFlQRVNfU1VQUE9SVEVEXG4iKSk7Ci0JCQkJYnJlYWs7Ci0JICAgIGNhc2UgT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFOgotICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUEpCi0JCQkJdWxJbmZvID0gTmRpczgwMl8xMU9GRE01OwotCQkJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQkdfTUlYRUQpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUcpKQotCQkJCXVsSW5mbyA9IE5kaXM4MDJfMTFPRkRNMjQ7Ci0JCQllbHNlCi0JCQkJdWxJbmZvID0gTmRpczgwMl8xMURTOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlicmVhazsKLSAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfUlhfUkFURToKLSAgICAgICAgICAgIHVsSW5mbyA9IChVTE9ORylwQWQtPkxhc3RSeFJhdGU7Ci0gICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9SWF9SQVRFICg9JWxkKVxuIiwgdWxJbmZvKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfVFhfUkFURToKLQkJCS8vdWxJbmZvID0gKFVMT05HKXBBZC0+TGFzdFR4UmF0ZTsKLQkJCXVsSW5mbyA9IChVTE9ORylwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkOwotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7Ci0JCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfVFhfUkFURSAoPSVseClcbiIsIHVsSW5mbykpOwotCQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9FRVBST01fVkVSU0lPTjoKLSAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7Ci0gICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZC0+RWVwcm9tVmVyc2lvbiwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfRklSTVdBUkVfVkVSU0lPTjoKLSAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7Ci0gICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZC0+RmlybXdhcmVWZXJzaW9uLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJYnJlYWs7Ci0JICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9OT0lTRV9MRVZFTDoKLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7Ci0JCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZC0+QmJwV3JpdGVMYXRjaFs2Nl0sIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9OT0lTRV9MRVZFTCAoPSVkKVxuIiwgcEFkLT5CYnBXcml0ZUxhdGNoWzY2XSkpOwotCQkJYnJlYWs7Ci0JICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9FWFRSQV9JTkZPOgotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkLT5FeHRyYUluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9FWFRSQV9JTkZPICg9JWxkKVxuIiwgcEFkLT5FeHRyYUluZm8pKTsKLQkgICAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJUX09JRF9XRV9WRVJTSU9OX0NPTVBJTEVEOgotCSAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVJTlQpOwotCSAgICAgICAgd2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKLQkgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmd2VfdmVyc2lvbl9jb21waWxlZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkgICAgICAgIGJyZWFrOwotCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9TRVRUSU5HOgotCQkJYXBzZCA9IChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgfCAocEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRSA8PCAxKSB8IChwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLIDw8IDIpCi0JCQkJfCAocEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSSA8PCAzKQl8IChwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPIDw8IDQpCXwgKHBBZC0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoIDw8IDUpKTsKLQotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmYXBzZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfU0VUVElORyAoPTB4JWx4LEFQU0RDYXA9JWQsQUNfQkU9JWQsQUNfQks9JWQsQUNfVkk9JWQsQUNfVk89JWQsTUFYU1BMZW49JWQpXG4iLAotCQkJCWFwc2QscEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlLHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUscEFkLT5Db21tb25DZmcuYkFQU0RBQ19CSyxwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZJLHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8scEFkLT5Db21tb25DZmcuTWF4U1BMZW5ndGgpKTsKLQkJCWJyZWFrOwotCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9QU006Ci0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9QU00gKD0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpKTsKLQkJCWJyZWFrOwotCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfV01NOgotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEJPT0xFQU4pOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX1dNTSAoPSVkKVxuIiwJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpKTsKLQkJCWJyZWFrOwotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSAgICAgICAgY2FzZSBSVF9PSURfTkVXX0RSSVZFUjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBVQ0hBUiBlbmFibGVkID0gMTsKLQkgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7Ci0JICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmVuYWJsZWQsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9ORVdfRFJJVkVSICg9JWQpXG4iLCBlbmFibGVkKSk7Ci0gICAgICAgICAgICB9Ci0JICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVDoKLQkgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7Ci0JICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAoPSVkKVxuIiwgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSk7Ci0JICAgICAgICBicmVhazsKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLSAgICAgICAgY2FzZSBSVF9PSURfRFJJVkVSX0RFVklDRV9OQU1FOgotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9EUklWRVJfREVWSUNFX05BTUUgXG4iKSk7Ci0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAxNjsKLQkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEFkLT5TdGFDZmcuZGV2X25hbWUsIHdycS0+dS5kYXRhLmxlbmd0aCkpCi0JCQl7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCX0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfSFRfUEhZTU9ERToKLSAgICAgICAgICAgIHBIVFBoeU1vZGUgPSAoT0lEX1NFVF9IVF9QSFlNT0RFICopIGttYWxsb2Moc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSksIE1FTV9BTExPQ19GTEFHKTsKLSAgICAgICAgICAgIGlmIChwSFRQaHlNb2RlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBIVFBoeU1vZGUtPlBoeU1vZGUgPSBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlOwotCQkJcEhUUGh5TW9kZS0+SHRNb2RlID0gKFVDSEFSKXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREU7Ci0JCQlwSFRQaHlNb2RlLT5CVyA9IChVQ0hBUilwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5CVzsKLQkJCXBIVFBoeU1vZGUtPk1DUz0gKFVDSEFSKXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUzsKLQkJCXBIVFBoeU1vZGUtPlNIT1JUR0k9IChVQ0hBUilwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJOwotCQkJcEhUUGh5TW9kZS0+U1RCQz0gKFVDSEFSKXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLlNUQkM7Ci0KLQkJCXBIVFBoeU1vZGUtPkV4dE9mZnNldCA9ICgocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSA/IChFWFRDSEFfQkVMT1cpIDogKEVYVENIQV9BQk9WRSkpOwotICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpOwotICAgICAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEhUUGh5TW9kZSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKLQkJCXsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJfQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfSFRfUEhZTU9ERSAoUGh5TW9kZSA9ICVkLCBNQ1MgPSVkLCBCVyA9ICVkLCBTVEJDID0gJWQsIEV4dE9mZnNldD0lZClcbiIsCi0JCQkJcEhUUGh5TW9kZS0+SHRNb2RlLCBwSFRQaHlNb2RlLT5NQ1MsIHBIVFBoeU1vZGUtPkJXLCBwSFRQaHlNb2RlLT5TVEJDLCBwSFRQaHlNb2RlLT5FeHRPZmZzZXQpKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoLndvcmQgPSAleCApXG4iLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJRyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTjoKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OIFxuIikpOwotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7Ci0gICAgICAgICAgICB1bEluZm8gPSBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQ7Ci0gICAgICAgICAgICB1bEluZm8gPSAodWxJbmZvIDw8IDgpfChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKTsKLQkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKSkKLSAgICAgICAgICAgIHsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9EQVRfSFRfUEhZTU9ERToKLSAgICAgICAgICAgIHBIVFBoeU1vZGUgPSAoT0lEX1NFVF9IVF9QSFlNT0RFICopIGttYWxsb2Moc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSksIE1FTV9BTExPQ19GTEFHKTsKLSAgICAgICAgICAgIGlmIChwSFRQaHlNb2RlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBIVFBoeU1vZGUtPlBoeU1vZGUgPSBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlOwotCQkJcEhUUGh5TW9kZS0+SHRNb2RlID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREU7Ci0JCQlwSFRQaHlNb2RlLT5CVyA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlc7Ci0JCQlwSFRQaHlNb2RlLT5NQ1M9IChVQ0hBUilwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUzsKLQkJCXBIVFBoeU1vZGUtPlNIT1JUR0k9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSTsKLQkJCXBIVFBoeU1vZGUtPlNUQkM9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQzsKLQotICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpOwotICAgICAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEhUUGh5TW9kZSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKLQkJCXsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJfQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfSFRfUEhZTU9ERSAoUGh5TW9kZSA9ICVkLCBNQ1MgPSVkLCBCVyA9ICVkLCBTVEJDID0gJWQsIEV4dE9mZnNldD0lZClcbiIsCi0JCQkJcEhUUGh5TW9kZS0+SHRNb2RlLCBwSFRQaHlNb2RlLT5NQ1MsIHBIVFBoeU1vZGUtPkJXLCBwSFRQaHlNb2RlLT5TVEJDLCBwSFRQaHlNb2RlLT5FeHRPZmZzZXQpKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoLndvcmQgPSAleCApXG4iLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJRyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlRfT0lEX1FVRVJZX01VTFRJUExFX0NBUkRfU1VQUE9SVDoKLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7Ci0gICAgICAgICAgICBpID0gMDsKLSNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKLSAgICAgICAgICAgIGkgPSAxOwotI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLwotCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmaSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKLSAgICAgICAgICAgIHsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9RVUVSWV9NVUxUSVBMRV9DQVJEX1NVUFBPUlQoPSVkKSBcbiIsIGkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIFNOTVBfU1VQUE9SVAotCQljYXNlIFJUX09JRF84MDJfMTFfTUFDX0FERFJFU1M6Ci0gICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBNQUNfQUREUl9MRU47Ci0gICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZC0+Q3VycmVudEFkZHJlc3MsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVST1VJOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVST1VJIFxuIikpOwotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gTWFudWZhY3R1cmVyT1VJX0xFTjsKLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkLT5DdXJyZW50QWRkcmVzcywgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJOQU1FOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVSTkFNRSBcbiIpKTsKLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihNYW51ZmFjdHVyZXJOQU1FKTsKLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBNYW51ZmFjdHVyZXJOQU1FLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSVF9PSURfODAyXzExX1JFU09VUkNFVFlQRUlETkFNRToKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1JFU09VUkNFVFlQRUlETkFNRSBcbiIpKTsKLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihSZXNvdXJjZVR5cGVJZE5hbWUpOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIFJlc291cmNlVHlwZUlkTmFtZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9QUklWQUNZT1BUSU9OSU1QTEVNRU5URUQ6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QUklWQUNZT1BUSU9OSU1QTEVNRU5URUQgXG4iKSk7Ci0JCQl1bEluZm8gPSAxOyAvLyAxIGlzIHN1cHBvcnQgd2VwIGVsc2UgMiBpcyBub3Qgc3VwcG9ydC4KLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJUX09JRF84MDJfMTFfUE9XRVJNQU5BR0VNRU5UTU9ERToKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BPV0VSTUFOQUdFTUVOVE1PREUgXG4iKSk7Ci0JCQlpZiAocEFkLT5TdGFDZmcuUHNtID09IFBTTVBfQUNUSU9OKQotCQkJCXVsSW5mbyA9IDE7IC8vIDEgaXMgcG93ZXIgYWN0aXZlIGVsc2UgMiBpcyBwb3dlciBzYXZlLgotCQkJZWxzZQotCQkJCXVsSW5mbyA9IDI7Ci0KLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlicmVhazsKLQotCQljYXNlIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFIFxuIikpOwotCQkJLy9LZXlJZHhWYWx1ZS5LZXlJZHggPSBwQWQtPlBvcnRDZmcuTUJTU0lEW3BBZC0+SW9jdGxJRl0uRGVmYXVsdEtleUlkOwotCQkJcEtleUlkeFZhbHVlID0gd3JxLT51LmRhdGEucG9pbnRlcjsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiS2V5SWR4VmFsdWUuS2V5SWR4ID0gJWQsIFxuIixwS2V5SWR4VmFsdWUtPktleUlkeCkpOwotCQkJdmFsdWVMZW4gPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbjsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBLZXlJZHhWYWx1ZS0+VmFsdWUsCi0JCQkJCQkgICAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksCi0JCQkJCQkgICB2YWx1ZUxlbik7Ci0JCQlwS2V5SWR4VmFsdWUtPlZhbHVlW3ZhbHVlTGVuXT0nXDAnOwotCi0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoRGVmYXVsdEtleUlkeFZhbHVlKTsKLQotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBLZXlJZHhWYWx1ZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRGVmYXVsdEtleUlkID0gJWQsIHRvdGFsIGxlbiA9ICVkLCBzdHIgbGVuPSVkLCBLZXlWYWx1ZT0gJTAyeCAlMDJ4ICUwMnggJTAyeCBcbiIsCi0JCQkJCQkJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAotCQkJCQkJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCwKLQkJCQkJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiwKLQkJCQkJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlbMF0sCi0JCQkJCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5WzBdLAotCQkJCQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzJdLktleVswXSwKLQkJCQkJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVszXS5LZXlbMF0pKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQ6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQgXG4iKSk7Ci0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEZWZhdWx0S2V5SWQgPSVkIFxuIiwgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJUX09JRF84MDJfMTFfV0VQS0VZTUFQUElOR0xFTkdUSDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1dFUEtFWU1BUFBJTkdMRU5HVEggXG4iKSk7Ci0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsCi0JCQkJCQkJCQkmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4sCi0JCQkJCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBPSURfODAyXzExX1NIT1JUUkVUUllMSU1JVDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NIT1JUUkVUUllMSU1JVCBcbiIpKTsKLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOwotCQkJU2hvcnRSZXRyeUxpbWl0ID0gdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0OwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2hvcnRSZXRyeUxpbWl0ID0lbGQsICB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UmV0cnlMaW1pdD0lZFxuIiwgU2hvcnRSZXRyeUxpbWl0LCB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQpKTsKLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmU2hvcnRSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQgXG4iKSk7Ci0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOwotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKLQkJCUxvbmdSZXRyeUxpbWl0ID0gdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQ7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJMb25nUmV0cnlMaW1pdCA9JWxkLCAgdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQ9JWRcbiIsIExvbmdSZXRyeUxpbWl0LCB0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCkpOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZMb25nUmV0cnlMaW1pdCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9QUk9EVUNUSUQ6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QUk9EVUNUSUQgXG4iKSk7Ci0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJCXsKLQotCQkJCVVTSE9SVCAgZGV2aWNlX2lkOwotCQkJCWlmICgoKFBPU19DT09LSUUpcEFkLT5PU19Db29raWUpLT5wY2lfZGV2ICE9IE5VTEwpCi0JCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoKChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llKS0+cGNpX2RldiwgUENJX0RFVklDRV9JRCwgJmRldmljZV9pZCk7Ci0JCQkJZWxzZQotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgcGNpX2RldiA9IE5VTExcbiIpKTsKLQkJCQlzcHJpbnRmKChQU1RSSU5HKXRtcCwgIiUwNHggJTA0eFxuIiwgTklDX1BDSV9WRU5ET1JfSUQsIGRldmljZV9pZCk7Ci0JCQl9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oKFBTVFJJTkcpdG1wKTsKLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCB0bXAsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVJRDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX01BTlVGQUNUVVJFSUQgXG4iKSk7Ci0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oTWFudWZhY3R1cmVyTkFNRSk7Ci0JCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgTWFudWZhY3R1cmVyTkFNRSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgT0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMIFxuIikpOwotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInNpemVvZiBVQ0hBUj0lZCwgY2hhbm5lbD0lZCBcbiIsIHNpemVvZihVQ0hBUiksIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7Ci0JCQlicmVhazsKLSNlbmRpZiAvL1NOTVBfU1VQUE9SVAotCi0JCWNhc2UgT0lEXzgwMl8xMV9CVUlMRF9DSEFOTkVMX0VYOgotCQkJewotCQkJCVVDSEFSIHZhbHVlOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JVSUxEX0NIQU5ORUxfRVggXG4iKSk7Ci0JCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKLSNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3VwcG9ydCBFWFRfQlVJTERfQ0hBTk5FTF9MSVNULlxuIikpOwotCQkJCXZhbHVlID0gMTsKLSNlbHNlCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRG9lc24ndCBzdXBwb3J0IEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QuXG4iKSk7Ci0JCQkJdmFsdWUgPSAwOwotI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KLQkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnZhbHVlLCAxKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBPSURfODAyXzExX0dFVF9DSF9MSVNUOgotCQkJewotCQkJCVBSVF9DSEFOTkVMX0xJU1RfSU5GTyBwQ2hMaXN0QnVmOwotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfR0VUX0NIX0xJU1QgXG4iKSk7Ci0JCQkJaWYgKHBBZC0+Q2hhbm5lbExpc3ROdW0gPT0gMCkKLQkJCQl7Ci0JCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDA7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCXBDaExpc3RCdWYgPSAoUlRfQ0hBTk5FTF9MSVNUX0lORk8gKikga21hbGxvYyhzaXplb2YoUlRfQ0hBTk5FTF9MSVNUX0lORk8pLCBNRU1fQUxMT0NfRkxBRyk7Ci0JCQkJaWYgKHBDaExpc3RCdWYgPT0gTlVMTCkKLQkJCQl7Ci0JCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDA7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCXBDaExpc3RCdWYtPkNoYW5uZWxMaXN0TnVtID0gcEFkLT5DaGFubmVsTGlzdE51bTsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgcENoTGlzdEJ1Zi0+Q2hhbm5lbExpc3ROdW07IGkrKykKLQkJCQkJcENoTGlzdEJ1Zi0+Q2hhbm5lbExpc3RbaV0gPSBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWw7Ci0KLQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfQ0hBTk5FTF9MSVNUX0lORk8pOwotCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwQ2hMaXN0QnVmLCBzaXplb2YoUlRfQ0hBTk5FTF9MSVNUX0lORk8pKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOwotCi0JCQkJaWYgKHBDaExpc3RCdWYpCi0JCQkJCWtmcmVlKHBDaExpc3RCdWYpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBPSURfODAyXzExX0dFVF9DT1VOVFJZX0NPREU6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9HRVRfQ09VTlRSWV9DT0RFIFxuIikpOwotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMjsKLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUsIDIpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgT0lEXzgwMl8xMV9HRVRfQ0hBTk5FTF9HRU9HUkFQSFk6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9HRVRfQ0hBTk5FTF9HRU9HUkFQSFkgXG4iKSk7Ci0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAxOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHksIDEpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKLQkJCWJyZWFrOwotCi0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0RMUzoKLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihCT09MRUFOKTsKLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9ETFMoPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9ETFNfUEFSQU06Ci0JCQl7Ci0JCQkJUFJUXzgwMl8xMV9ETFNfSU5GTwlwRGxzSW5mbyA9IGttYWxsb2Moc2l6ZW9mKFJUXzgwMl8xMV9ETFNfSU5GTyksIEdGUF9BVE9NSUMpOwotCQkJCWlmIChwRGxzSW5mbyA9PSBOVUxMKQotCQkJCQlicmVhazsKLQotCQkJCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCi0JCQkJewotCQkJCQlSVE1QTW92ZU1lbW9yeSgmcERsc0luZm8tPkVudHJ5W2ldLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHNpemVvZihSVF84MDJfMTFfRExTX1VJKSk7Ci0JCQkJfQotCi0JCQkJcERsc0luZm8tPm51bSA9IE1BWF9OVU1fT0ZfRExTX0VOVFJZOwotCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF84MDJfMTFfRExTX0lORk8pOwotCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwRGxzSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9ETFNfUEFSQU1cbiIpKTsKLQotCQkJCWlmIChwRGxzSW5mbykKLQkJCQkJa2ZyZWUocERsc0luZm8pOwotCQkJfQotCQkJYnJlYWs7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLQkJY2FzZSBPSURfODAyXzExX1NFVF9QU1BYTElOS19NT0RFOgotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEJPT0xFQU4pOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWQtPkNvbW1vbkNmZy5QU1BYbGluaywgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NFVF9QU1BYTElOS19NT0RFKD0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBTUFhsaW5rKSk7Ci0JCQlicmVhazsKLQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6dW5rbm93biBJT0NUTCdzIHN1YmNtZCA9IDB4JTA4eFxuIiwgY21kKSk7Ci0gICAgICAgICAgICBTdGF0dXMgPSAtRU9QTk9UU1VQUDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOwotfQotCi1JTlQgcnQyOHh4X3N0YV9pb2N0bCgKLQlJTglzdHJ1Y3QgbmV0X2RldmljZQkqbmV0X2RldiwKLQlJTglPVVQJc3RydWN0IGlmcmVxCSpycSwKLQlJTglJTlQJCQkJCWNtZCkKLXsKLQlQT1NfQ09PS0lFCQkJcE9iajsKLQlSVE1QX0FEQVBURVIgICAgICAgICpwQWQgPSBOVUxMOwotCXN0cnVjdCBpd3JlcSAgICAgICAgKndycSA9IChzdHJ1Y3QgaXdyZXEgKikgcnE7Ci0JQk9PTEVBTgkJCQlTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7Ci0JSU5UCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCVVTSE9SVAkJCQlzdWJjbWQ7Ci0KLQotCXBBZCA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKG5ldF9kZXYpOwotCWlmIChwQWQgPT0gTlVMTCkKLQl7Ci0JCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7Ci0JCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLwotCQlyZXR1cm4gLUVORVRET1dOOwotCX0KLQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0gICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLSAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotICAgIHsKLSNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAotCSAgICBpZiAod3JxLT51LmRhdGEucG9pbnRlciA9PSBOVUxMKQotCSAgICB7Ci0JCSAgICByZXR1cm4gU3RhdHVzOwotCSAgICB9Ci0KLQkgICAgaWYgKHN0cnN0cih3cnEtPnUuZGF0YS5wb2ludGVyLCAiT3BNb2RlIikgPT0gTlVMTCkKLSNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLwotCQl7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0JCSAgICByZXR1cm4gLUVORVRET1dOOwotICAgICAgICB9Ci0gICAgfQotCi0JewkvLyBkZXRlcm1pbmUgdGhpcyBpb2N0bCBjb21tYW5kIGlzIGNvbW1pbmcgZnJvbSB3aGljaCBpbnRlcmZhY2UuCi0JCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKLQkJcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKLQl9Ci0KLQlzd2l0Y2goY21kKQotCXsKLSNpZmRlZiBSQUxJTktfQVRFCi0jaWZkZWYgUkFMSU5LXzI4eHhfUUEKLQkJY2FzZSBSVFBSSVZfSU9DVExfQVRFOgotCQkJewotCQkJCVJ0bXBEb0F0ZShwQWQsIHdycSk7Ci0JCQl9Ci0JCQlicmVhazsKLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLSAgICAgICAgY2FzZSBTSU9DR0lGSFdBRERSOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU9DVEw6OlNJT0NHSUZIV0FERFJcbiIpKTsKLQkJCW1lbWNweSh3cnEtPnUubmFtZSwgcEFkLT5DdXJyZW50QWRkcmVzcywgRVRIX0FMRU4pOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0lPQ0dJV05BTUU6Ci0gICAgICAgIHsKLQkJY2hhciAqbmFtZT0md3JxLT51Lm5hbWVbMF07Ci0JCXJ0X2lvY3RsX2dpd25hbWUobmV0X2RldiwgTlVMTCwgbmFtZSwgTlVMTCk7Ci0gICAgICAgICAgICBicmVhazsKLQkJfQotCQljYXNlIFNJT0NHSVdFU1NJRDogIC8vR2V0IEVTU0lECi0gICAgICAgIHsKLQkJc3RydWN0IGl3X3BvaW50ICplc3NpZD0md3JxLT51LmVzc2lkOwotCQlydF9pb2N0bF9naXdlc3NpZChuZXRfZGV2LCBOVUxMLCBlc3NpZCwgZXNzaWQtPnBvaW50ZXIpOwotICAgICAgICAgICAgYnJlYWs7Ci0JCX0KLQkJY2FzZSBTSU9DU0lXRVNTSUQ6ICAvL1NldCBFU1NJRAotCQl7Ci0JCXN0cnVjdCBpd19wb2ludAkqZXNzaWQ9JndycS0+dS5lc3NpZDsKLQkJcnRfaW9jdGxfc2l3ZXNzaWQobmV0X2RldiwgTlVMTCwgZXNzaWQsIGVzc2lkLT5wb2ludGVyKTsKLSAgICAgICAgICAgIGJyZWFrOwotCQl9Ci0JCWNhc2UgU0lPQ1NJV05XSUQ6ICAgLy8gc2V0IG5ldHdvcmsgaWQgKHRoZSBjZWxsKQotCQljYXNlIFNJT0NHSVdOV0lEOiAgIC8vIGdldCBuZXR3b3JrIGlkCi0JCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKLQkJCWJyZWFrOwotCQljYXNlIFNJT0NTSVdGUkVROiAgIC8vc2V0IGNoYW5uZWwvZnJlcXVlbmN5IChIeikKLQkJewotCQlzdHJ1Y3QgaXdfZnJlcSAqZnJlcT0md3JxLT51LmZyZXE7Ci0JCXJ0X2lvY3RsX3Npd2ZyZXEobmV0X2RldiwgTlVMTCwgZnJlcSwgTlVMTCk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFNJT0NHSVdGUkVROiAgIC8vIGdldCBjaGFubmVsL2ZyZXF1ZW5jeSAoSHopCi0JCXsKLQkJc3RydWN0IGl3X2ZyZXEgKmZyZXE9JndycS0+dS5mcmVxOwotCQlydF9pb2N0bF9naXdmcmVxKG5ldF9kZXYsIE5VTEwsIGZyZXEsIE5VTEwpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBTSU9DU0lXTklDS046IC8vc2V0IG5vZGUgbmFtZS9uaWNrbmFtZQotCQl7Ci0JCS8vc3RydWN0IGl3X3BvaW50ICpkYXRhPSZ3cnEtPnUuZGF0YTsKLQkJLy9ydF9pb2N0bF9zaXduaWNrbihuZXRfZGV2LCBOVUxMLCBkYXRhLCBOVUxMKTsKLQkJCWJyZWFrOwotCQkJfQotCQljYXNlIFNJT0NHSVdOSUNLTjogLy9nZXQgbm9kZSBuYW1lL25pY2tuYW1lCi0gICAgICAgIHsKLQkJCXN0cnVjdCBpd19wb2ludAkqZXJxID0gTlVMTDsKLQkJZXJxID0gJndycS0+dS5kYXRhOwotICAgICAgICAgICAgZXJxLT5sZW5ndGggPSBzdHJsZW4oKFBTVFJJTkcpIHBBZC0+bmlja25hbWUpOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKGVycS0+cG9pbnRlciwgcEFkLT5uaWNrbmFtZSwgZXJxLT5sZW5ndGgpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBTSU9DR0lXUkFURTogICAvL2dldCBkZWZhdWx0IGJpdCByYXRlIChicHMpCi0JCSAgICBydF9pb2N0bF9naXdyYXRlKG5ldF9kZXYsIE5VTEwsICZ3cnEtPnUsIE5VTEwpOwotICAgICAgICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU0lPQ1NJV1JBVEU6ICAvL3NldCBkZWZhdWx0IGJpdCByYXRlIChicHMpCi0JICAgICAgICBydF9pb2N0bF9zaXdyYXRlKG5ldF9kZXYsIE5VTEwsICZ3cnEtPnUsIE5VTEwpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU0lPQ0dJV1JUUzogIC8vIGdldCBSVFMvQ1RTIHRocmVzaG9sZCAoYnl0ZXMpCi0JCXsKLQkJc3RydWN0IGl3X3BhcmFtICpydHM9JndycS0+dS5ydHM7Ci0JCXJ0X2lvY3RsX2dpd3J0cyhuZXRfZGV2LCBOVUxMLCBydHMsIE5VTEwpOwotICAgICAgICAgICAgYnJlYWs7Ci0JCX0KLSAgICAgICAgY2FzZSBTSU9DU0lXUlRTOiAgLy9zZXQgUlRTL0NUUyB0aHJlc2hvbGQgKGJ5dGVzKQotCQl7Ci0JCXN0cnVjdCBpd19wYXJhbSAqcnRzPSZ3cnEtPnUucnRzOwotCQlydF9pb2N0bF9zaXdydHMobmV0X2RldiwgTlVMTCwgcnRzLCBOVUxMKTsKLSAgICAgICAgICAgIGJyZWFrOwotCQl9Ci0gICAgICAgIGNhc2UgU0lPQ0dJV0ZSQUc6ICAvL2dldCBmcmFnbWVudGF0aW9uIHRociAoYnl0ZXMpCi0JCXsKLQkJc3RydWN0IGl3X3BhcmFtICpmcmFnPSZ3cnEtPnUuZnJhZzsKLQkJcnRfaW9jdGxfZ2l3ZnJhZyhuZXRfZGV2LCBOVUxMLCBmcmFnLCBOVUxMKTsKLSAgICAgICAgICAgIGJyZWFrOwotCQl9Ci0gICAgICAgIGNhc2UgU0lPQ1NJV0ZSQUc6ICAvL3NldCBmcmFnbWVudGF0aW9uIHRociAoYnl0ZXMpCi0JCXsKLQkJc3RydWN0IGl3X3BhcmFtICpmcmFnPSZ3cnEtPnUuZnJhZzsKLQkJcnRfaW9jdGxfc2l3ZnJhZyhuZXRfZGV2LCBOVUxMLCBmcmFnLCBOVUxMKTsKLSAgICAgICAgICAgIGJyZWFrOwotCQl9Ci0gICAgICAgIGNhc2UgU0lPQ0dJV0VOQ09ERTogIC8vZ2V0IGVuY29kaW5nIHRva2VuICYgbW9kZQotCQl7Ci0JCXN0cnVjdCBpd19wb2ludCAqZXJxPSZ3cnEtPnUuZW5jb2Rpbmc7Ci0JCWlmKGVycSkKLQkJCXJ0X2lvY3RsX2dpd2VuY29kZShuZXRfZGV2LCBOVUxMLCBlcnEsIGVycS0+cG9pbnRlcik7Ci0gICAgICAgICAgICBicmVhazsKLQkJfQotICAgICAgICBjYXNlIFNJT0NTSVdFTkNPREU6ICAvL3NldCBlbmNvZGluZyB0b2tlbiAmIG1vZGUKLQkJewotCQlzdHJ1Y3QgaXdfcG9pbnQgKmVycT0md3JxLT51LmVuY29kaW5nOwotCQlpZihlcnEpCi0JCQlydF9pb2N0bF9zaXdlbmNvZGUobmV0X2RldiwgTlVMTCwgZXJxLCBlcnEtPnBvaW50ZXIpOwotICAgICAgICAgICAgYnJlYWs7Ci0JCX0KLQkJY2FzZSBTSU9DR0lXQVA6ICAgICAvL2dldCBhY2Nlc3MgcG9pbnQgTUFDIGFkZHJlc3NlcwotCQl7Ci0JCXN0cnVjdCBzb2NrYWRkciAqYXBfYWRkcj0md3JxLT51LmFwX2FkZHI7Ci0JCXJ0X2lvY3RsX2dpd2FwKG5ldF9kZXYsIE5VTEwsIGFwX2FkZHIsIGFwX2FkZHItPnNhX2RhdGEpOwotCQkJYnJlYWs7Ci0JCX0KLQkgICAgY2FzZSBTSU9DU0lXQVA6ICAvL3NldCBhY2Nlc3MgcG9pbnQgTUFDIGFkZHJlc3NlcwotCQl7Ci0JCXN0cnVjdCBzb2NrYWRkciAqYXBfYWRkcj0md3JxLT51LmFwX2FkZHI7Ci0JCXJ0X2lvY3RsX3Npd2FwKG5ldF9kZXYsIE5VTEwsIGFwX2FkZHIsIGFwX2FkZHItPnNhX2RhdGEpOwotICAgICAgICAgICAgYnJlYWs7Ci0JCX0KLQkJY2FzZSBTSU9DR0lXTU9ERTogICAvL2dldCBvcGVyYXRpb24gbW9kZQotCQl7Ci0JCV9fdTMyICptb2RlPSZ3cnEtPnUubW9kZTsKLQkJcnRfaW9jdGxfZ2l3bW9kZShuZXRfZGV2LCBOVUxMLCBtb2RlLCBOVUxMKTsKLSAgICAgICAgICAgIGJyZWFrOwotCQl9Ci0JCWNhc2UgU0lPQ1NJV01PREU6ICAgLy9zZXQgb3BlcmF0aW9uIG1vZGUKLQkJewotCQlfX3UzMiAqbW9kZT0md3JxLT51Lm1vZGU7Ci0JCXJ0X2lvY3RsX3Npd21vZGUobmV0X2RldiwgTlVMTCwgbW9kZSwgTlVMTCk7Ci0gICAgICAgICAgICBicmVhazsKLQkJfQotCQljYXNlIFNJT0NHSVdTRU5TOiAgIC8vZ2V0IHNlbnNpdGl2aXR5IChkQm0pCi0JCWNhc2UgU0lPQ1NJV1NFTlM6CS8vc2V0IHNlbnNpdGl2aXR5IChkQm0pCi0JCWNhc2UgU0lPQ0dJV1BPV0VSOiAgLy9nZXQgUG93ZXIgTWFuYWdlbWVudCBzZXR0aW5ncwotCQljYXNlIFNJT0NTSVdQT1dFUjogIC8vc2V0IFBvd2VyIE1hbmFnZW1lbnQgc2V0dGluZ3MKLQkJY2FzZSBTSU9DR0lXVFhQT1c6ICAvL2dldCB0cmFuc21pdCBwb3dlciAoZEJtKQotCQljYXNlIFNJT0NTSVdUWFBPVzogIC8vc2V0IHRyYW5zbWl0IHBvd2VyIChkQm0pCi0JCWNhc2UgU0lPQ0dJV1JBTkdFOgkvL0dldCByYW5nZSBvZiBwYXJhbWV0ZXJzCi0JCWNhc2UgU0lPQ0dJV1JFVFJZOgkvL2dldCByZXRyeSBsaW1pdHMgYW5kIGxpZmV0aW1lCi0JCWNhc2UgU0lPQ1NJV1JFVFJZOgkvL3NldCByZXRyeSBsaW1pdHMgYW5kIGxpZmV0aW1lCi0JCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKLQkJCWJyZWFrOwotCQljYXNlIFJUX1BSSVZfSU9DVEw6Ci0gICAgICAgIGNhc2UgUlRfUFJJVl9JT0NUTF9FWFQ6Ci0JCQlzdWJjbWQgPSB3cnEtPnUuZGF0YS5mbGFnczsKLQkJCWlmKCBzdWJjbWQgJiBPSURfR0VUX1NFVF9UT0dHTEUpCi0JCQkJU3RhdHVzID0gUlRNUFNldEluZm9ybWF0aW9uKHBBZCwgcnEsIHN1YmNtZCk7Ci0JCQllbHNlCi0JCQkJU3RhdHVzID0gUlRNUFF1ZXJ5SW5mb3JtYXRpb24ocEFkLCBycSwgc3ViY21kKTsKLQkJCWJyZWFrOwotCQljYXNlIFNJT0NHSVdQUklWOgotCQkJaWYgKHdycS0+dS5kYXRhLnBvaW50ZXIpCi0JCQl7Ci0JCQkJaWYgKCBhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YocHJpdnRhYikpICE9IFRSVUUpCi0JCQkJCWJyZWFrOwotCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwcml2dGFiKSAvIHNpemVvZihwcml2dGFiWzBdKTsKLQkJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHByaXZ0YWIsIHNpemVvZihwcml2dGFiKSkpCi0JCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBSVFBSSVZfSU9DVExfU0VUOgotCQkJaWYoYWNjZXNzX29rKFZFUklGWV9SRUFELCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpICE9IFRSVUUpCi0JCQkJCWJyZWFrOwotCQkJcnRfaW9jdGxfc2V0cGFyYW0obmV0X2RldiwgTlVMTCwgTlVMTCwgd3JxLT51LmRhdGEucG9pbnRlcik7Ci0JCQlicmVhazsKLQkJY2FzZSBSVFBSSVZfSU9DVExfR1NJVEVTVVJWRVk6Ci0JCQlSVE1QSW9jdGxHZXRTaXRlU3VydmV5KHBBZCwgd3JxKTsKLQkJICAgIGJyZWFrOwotI2lmZGVmIERCRwotCQljYXNlIFJUUFJJVl9JT0NUTF9NQUM6Ci0JCQlSVE1QSW9jdGxNQUMocEFkLCB3cnEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUlRQUklWX0lPQ1RMX0UyUDoKLQkJCVJUTVBJb2N0bEUyUFJPTShwQWQsIHdycSk7Ci0JCQlicmVhazsKLSNpZmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKLQkJY2FzZSBSVFBSSVZfSU9DVExfUkY6Ci0JCQlSVE1QSW9jdGxSRihwQWQsIHdycSk7Ci0JCQlicmVhazsKLSNlbmRpZiAvLyBSVE1QX1JGX1JXX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBEQkcgLy8KLQotICAgICAgICBjYXNlIFNJT0NFVEhUT09MOgotICAgICAgICAgICAgICAgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiSU9DVEw6OnVua25vd24gSU9DVEwncyBjbWQgPSAweCUwOHhcbiIsIGNtZCkpOwotCQkJU3RhdHVzID0gLUVPUE5PVFNVUFA7Ci0JCQlicmVhazsKLQl9Ci0KLSAgICBpZihTdGF0ZU1hY2hpbmVUb3VjaGVkKSAvLyBVcHBlciBsYXllciBzZW50IGEgTUxNRS1yZWxhdGVkIG9wZXJhdGlvbnMKLQlSVE1QX01MTUVfSEFORExFUihwQWQpOwotCi0JcmV0dXJuIFN0YXR1czsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgU1NJRAotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9TU0lEX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpCi17Ci0gICAgTkRJU184MDJfMTFfU1NJRCAgICAgICAgICAgICAgICAgICAgU3NpZCwgKnBTc2lkPU5VTEw7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IEZBTFNFOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBUUlVFOwotCi0gICAgaWYoIHN0cmxlbihhcmcpIDw9IE1BWF9MRU5fT0ZfU1NJRCkKLSAgICB7Ci0gICAgICAgIE5kaXNaZXJvTWVtb3J5KCZTc2lkLCBzaXplb2YoTkRJU184MDJfMTFfU1NJRCkpOwotICAgICAgICBpZiAoc3RybGVuKGFyZykgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoU3NpZC5Tc2lkLCBhcmcsIHN0cmxlbihhcmcpKTsKLSAgICAgICAgICAgIFNzaWQuU3NpZExlbmd0aCA9IHN0cmxlbihhcmcpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgICAvL0FOWSBzc2lkCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNzaWQuU3NpZExlbmd0aCA9IDA7Ci0JICAgIG1lbWNweShTc2lkLlNzaWQsICIiLCAwKTsKLQkJcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOwotCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKLQl9Ci0gICAgICAgIHBTc2lkID0gJlNzaWQ7Ci0KLSAgICAgICAgaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJUTVBfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKLSAgICAgICAgfQotCi0JCWlmICgocEFkYXB0ZXItPlN0YUNmZy5XcGFQYXNzUGhyYXNlTGVuID49IDgpICYmCi0JCQkocEFkYXB0ZXItPlN0YUNmZy5XcGFQYXNzUGhyYXNlTGVuIDw9IDY0KSkKLQkJewotCQkJU1RSSU5HIHBhc3NwaHJhc2Vfc3RyWzY1XSA9IHswfTsKLQkJCVVDSEFSIGtleU1hdGVyaWFsWzQwXTsKLQotCQkJUlRNUE1vdmVNZW1vcnkocGFzc3BocmFzZV9zdHIsIHBBZGFwdGVyLT5TdGFDZmcuV3BhUGFzc1BocmFzZSwgcEFkYXB0ZXItPlN0YUNmZy5XcGFQYXNzUGhyYXNlTGVuKTsKLQkJCVJUTVBaZXJvTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuUE1LLCAzMik7Ci0JCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFQYXNzUGhyYXNlTGVuID09IDY0KQotCQkJewotCQkJICAgIEF0b0goKFBTVFJJTkcpIHBBZGFwdGVyLT5TdGFDZmcuV3BhUGFzc1BocmFzZSwgcEFkYXB0ZXItPlN0YUNmZy5QTUssIDMyKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCSAgICBQYXNzd29yZEhhc2goKFBTVFJJTkcpIHBBZGFwdGVyLT5TdGFDZmcuV3BhUGFzc1BocmFzZSwgU3NpZC5Tc2lkLCBTc2lkLlNzaWRMZW5ndGgsIGtleU1hdGVyaWFsKTsKLQkJCSAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlBNSywga2V5TWF0ZXJpYWwsIDMyKTsKLQkJCX0KLQkJfQotCi0gICAgICAgIHBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gVFJVRTsKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7Ci0JCXBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7Ci0KLSAgICAgICAgTWxtZUVucXVldWUocEFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAotICAgICAgICAgICAgICAgICAgICBPSURfODAyXzExX1NTSUQsCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihORElTXzgwMl8xMV9TU0lEKSwKLSAgICAgICAgICAgICAgICAgICAgKFZPSUQgKilwU3NpZCk7Ci0KLSAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IFRSVUU7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9TU0lEX1Byb2M6OihMZW49JWQsU3NpZD0lcylcbiIsIFNzaWQuU3NpZExlbmd0aCwgU3NpZC5Tc2lkKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgc3VjY2VzcyA9IEZBTFNFOwotCi0gICAgaWYgKFN0YXRlTWFjaGluZVRvdWNoZWQpIC8vIFVwcGVyIGxheWVyIHNlbnQgYSBNTE1FLXJlbGF0ZWQgb3BlcmF0aW9ucwotCVJUTVBfTUxNRV9IQU5ETEVSKHBBZGFwdGVyKTsKLQotICAgIHJldHVybiBzdWNjZXNzOwotfQotCi0jaWZkZWYgV01NX1NVUFBPUlQKLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFdtbUNhcGFibGUgRW5hYmxlIG9yIERpc2FibGUKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfV21tQ2FwYWJsZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JQk9PTEVBTgliV21tQ2FwYWJsZTsKLQotCWJXbW1DYXBhYmxlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmICgoYldtbUNhcGFibGUgPT0gMSkKLQkJKQotCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9IFRSVUU7Ci0JZWxzZSBpZiAoYldtbUNhcGFibGUgPT0gMCkKLQkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPSBGQUxTRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dtbUNhcGFibGVfUHJvYzo6KGJXbW1DYXBhYmxlPSVkKVxuIiwKLQkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpKTsKLQotCXJldHVybiBUUlVFOwotfQotI2VuZGlmIC8vIFdNTV9TVVBQT1JUIC8vCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IE5ldHdvcmsgVHlwZShJbmZyYXN0cnVjdHVyZS9BZGhvYyBtb2RlKQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9OZXR3b3JrVHlwZV9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBTVFJJTkcgICAgICAgICAgYXJnKQotewotICAgIFVJTlQzMglWYWx1ZSA9IDA7Ci0KLSAgICBpZiAoc3RyY21wKGFyZywgIkFkaG9jIikgPT0gMCkKLQl7Ci0JCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgIT0gQlNTX0FESE9DKQotCQl7Ci0JCQkvLyBDb25maWcgaGFzIGNoYW5nZWQKLQkJCXBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7Ci0gICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7Ci0gICAgICAgICAgICAgICAgUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKLQkJCQlWYWx1ZSAmPSAofjB4ODApOwotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPSBUUlVFOwotICAgICAgICAgICAgICAgIExpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7Ci0gICAgICAgICAgICB9Ci0JCQlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKQotCQkJewotCQkJCS8vQk9PTEVBTiBDYW5jZWxsZWQ7Ci0JCQkJLy8gU2V0IHRoZSBBdXRvUmVjb25uZWN0U3NpZCB0byBwcmV2ZW50IGl0IHJlY29ubmVjdCB0byBvbGQgU1NJRAotCQkJCS8vIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZSB1c2VyIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4KLQkJCQlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7Ci0JCQkJTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKLQotCQkJCUxpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7Ci0KLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEJCIVxuIikpOwotCQkJfQotCQl9Ci0JCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19BREhPQzsKLSAgICAgICAgcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBwQWRhcHRlci0+U3RhQ2ZnLk9yaURldlR5cGU7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5TZXRfTmV0d29ya1R5cGVfUHJvYzo6KEFELUhPQylcbiIpKTsKLQl9Ci0gICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIkluZnJhIikgPT0gMCkKLQl7Ci0JCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgIT0gQlNTX0lORlJBKQotCQl7Ci0JCQkvLyBDb25maWcgaGFzIGNoYW5nZWQKLQkJCXBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7Ci0gICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7Ci0gICAgICAgICAgICAgICAgUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKLQkJCQlWYWx1ZSAmPSAofjB4ODApOwotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPSBUUlVFOwotICAgICAgICAgICAgICAgIExpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7Ci0gICAgICAgICAgICB9Ci0JCQlpZiAoQURIT0NfT04ocEFkYXB0ZXIpKQotCQkJewotCQkJCS8vIFNldCB0aGUgQXV0b1JlY29ubmVjdFNzaWQgdG8gcHJldmVudCBpdCByZWNvbm5lY3QgdG8gb2xkIFNTSUQKLQkJCQkvLyBTaW5jZSBjYWxsaW5nIHRoaXMgaW5kaWNhdGUgdXNlciBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuCi0JCQkJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOwotCQkJCU5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7Ci0KLQkJCQlMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOwotCQkJfQotCQl9Ci0JCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsKLSAgICAgICAgcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBwQWRhcHRlci0+U3RhQ2ZnLk9yaURldlR5cGU7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5TZXRfTmV0d29ya1R5cGVfUHJvYzo6KElORlJBKVxuIikpOwotCX0KLSAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiTW9uaXRvciIpID09IDApCi0gICAgewotCQkJVUNIQVIJYmJwVmFsdWUgPSAwOwotCQkJQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKLQkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfSU5GUkFfT04pOwotICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19BREhPQ19PTik7Ci0JCQlPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwotCQkJLy8gZGlzYWJsZSBhbGwgcGVyaW9kaWMgc3RhdGUgbWFjaGluZQotCQkJcEFkYXB0ZXItPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IEZBTFNFOwotCQkJLy8gcmVzZXQgYWxsIG1sbWUgc3RhdGUgbWFjaGluZQotCQkJUlRNUF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQgXG4iKSk7Ci0gICAgICAgICAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9PSAwKQotICAgICAgICAgICAgewotI2lmZGVmIERPVDExX05fU1VQUE9SVAotICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQU5fTUlYRUQpCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSAzNjsKLSAgICAgICAgICAgICAgICBlbHNlCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSA2OwotICAgICAgICAgICAgfQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIE5fQ2hhbm5lbENoZWNrKHBBZGFwdGVyKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCi0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDAgJiYKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPT0gRVhUQ0hBX0FCT1ZFKQotCQkJewotCQkJCS8vIDQwTUh6ICxjb250cm9sIGNoYW5uZWwgYXQgbG93ZXIKLQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgJmJicFZhbHVlKTsKLQkJCQliYnBWYWx1ZSAmPSAofjB4MTgpOwotCQkJCWJicFZhbHVlIHw9IDB4MTA7Ci0JCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCBiYnBWYWx1ZSk7Ci0JCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKLQkJCQkvLyAgUlggOiBjb250cm9sIGNoYW5uZWwgYXQgbG93ZXIKLQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgJmJicFZhbHVlKTsKLQkJCQliYnBWYWx1ZSAmPSAofjB4MjApOwotCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgYmJwVmFsdWUpOwotCi0JCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOwotCQkJCVZhbHVlICY9IDB4ZmZmZmZmZmU7Ci0JCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgVmFsdWUpOwotCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgKyAyOwotICAgICAgICAgICAgICAgIEFzaWNTd2l0Y2hDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0JCQkgICAgQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV180MCAsY29udHJvbF9jaGFubmVsKCVkKSwgQ2VudHJhbENoYW5uZWwoJWQpIFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOwotCQkJfQotCQkJZWxzZSBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQgJiYKLSAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwICYmCi0gICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPT0gRVhUQ0hBX0JFTE9XKQotCQkJewotCQkJCS8vIDQwTUh6ICxjb250cm9sIGNoYW5uZWwgYXQgdXBwZXIKLQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgJmJicFZhbHVlKTsKLQkJCQliYnBWYWx1ZSAmPSAofjB4MTgpOwotCQkJCWJicFZhbHVlIHw9IDB4MTA7Ci0JCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCBiYnBWYWx1ZSk7Ci0JCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKLQkJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsICZWYWx1ZSk7Ci0JCQkJVmFsdWUgfD0gMHgxOwotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsIFZhbHVlKTsKLQotCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCAmYmJwVmFsdWUpOwotCQkJCWJicFZhbHVlIHw9ICgweDIwKTsKLQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsIGJicFZhbHVlKTsKLQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKLSAgICAgICAgICAgICAgICBBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOwotCQkJICAgIEFzaWNMb2NrQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfNDAgLGNvbnRyb2xfY2hhbm5lbCglZCksIENlbnRyYWxDaGFubmVsKCVkKSBcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKLQkJCX0KLQkJCWVsc2UKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCXsKLQkJCQkvLyAyME1IegotCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCAmYmJwVmFsdWUpOwotCQkJCWJicFZhbHVlICY9ICh+MHgxOCk7Ci0JCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCBiYnBWYWx1ZSk7Ci0JCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKLSAgICAgICAgICAgICAgICBBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JCQkgICAgQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzIwLCBDaGFubmVsKCVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7Ci0JCQl9Ci0JCQkvLyBFbmFibGUgUnggd2l0aCBwcm9taXNjdW91cyByZWNlcHRpb24KLQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLCAweDMpOwotCQkJLy8gQVNJQyBzdXBwb3JzdHMgc25pZmZlciBmdW5jdGlvbiB3aXRoIHJlcGxhY2luZyBSU1NJIHdpdGggdGltZXN0YW1wLgotCQkJLy9SVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwotCQkJLy9WYWx1ZSB8PSAoMHg4MCk7Ci0JCQkvL1JUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7Ci0JCQkvLyBkaXNhYmxlIHN5bmMKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBCQ05fVElNRV9DRkcsICZjc3Iud29yZCk7Ci0JCQljc3IuZmllbGQuYkJlYWNvbkdlbiA9IDA7Ci0JCQljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAwOwotCQkJY3NyLmZpZWxkLlRzZlN5bmNNb2RlID0gMDsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgQkNOX1RJTUVfQ0ZHLCBjc3Iud29yZCk7Ci0KLQkJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19NT05JVE9SOwotICAgICAgICAgICAgcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBBUlBIUkRfSUVFRTgwMjExX1BSSVNNOyAvL0FSUEhSRF9JRUVFODAyMTE7IC8vIElFRUU4MDIxMQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooTU9OSVRPUilcbiIpKTsKLSAgICB9Ci0KLSAgICAvLyBSZXNldCBSYWxpbmsgc3VwcGxpY2FudCB0byBub3QgdXNlLCBpdCB3aWxsIGJlIHNldCB0byBzdGFydCB3aGVuIFVJIHNldCBQTUsga2V5Ci0gICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooTmV0d29ya1R5cGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUpKTsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBBdXRoZW50aWNhdGlvbiBtb2RlCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X0F1dGhNb2RlX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpCi17Ci0gICAgaWYgKChzdHJjbXAoYXJnLCAiV0VQQVVUTyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid2VwYXV0byIpID09IDApKQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaDsKLSAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIk9QRU4iKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIm9wZW4iKSA9PSAwKSkKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47Ci0gICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJTSEFSRUQiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgInNoYXJlZCIpID09IDApKQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOwotICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBUFNLIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGFwc2siKSA9PSAwKSkKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKLSAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQU5PTkUiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYW5vbmUiKSA9PSAwKSkKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7Ci0gICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEEyUFNLIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGEycHNrIikgPT0gMCkpCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOwotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQSIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3BhIikgPT0gMCkpCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7Ci0gICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEEyIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGEyIikgPT0gMCkpCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQXV0aE1vZGVfUHJvYzo6KEF1dGhNb2RlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSkpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IEVuY3J5cHRpb24gVHlwZQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9FbmNyeXBUeXBlX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpCi17Ci0gICAgaWYgKChzdHJjbXAoYXJnLCAiTk9ORSIpID09IDApIHx8IChzdHJjbXAoYXJnLCAibm9uZSIpID09IDApKQotICAgIHsKLSAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKLQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotICAgIH0KLSAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldFUCIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid2VwIikgPT0gMCkpCi0gICAgewotICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZwotCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOwotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKLQkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiVEtJUCIpID09IDApIHx8IChzdHJjbXAoYXJnLCAidGtpcCIpID09IDApKQotICAgIHsKLSAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZwotCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0JICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiQUVTIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJhZXMiKSA9PSAwKSkKLSAgICB7Ci0gICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKLQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0VuY3J5cFR5cGVfUHJvYzo6KEVuY3J5cFR5cGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cykpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IERlZmF1bHQgS2V5IElECi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X0RlZmF1bHRLZXlJRF9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBTVFJJTkcgICAgICAgICAgYXJnKQotewotICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUlkeDsKLQotICAgIEtleUlkeCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0gICAgaWYoKEtleUlkeCA+PSAxICkgJiYgKEtleUlkeCA8PSA0KSkKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIChLZXlJZHggLSAxICk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9EZWZhdWx0S2V5SURfUHJvYzo6KERlZmF1bHRLZXlJRD0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgV0VQIEtFWTEKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBTZXRfS2V5MV9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBTVFJJTkcgICAgICAgICAgYXJnKQotewotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7Ci0KLSAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCi0KLSAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKLQotICAgIHN3aXRjaCAoS2V5TGVuKQotICAgIHsKLSAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCi0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IEtleUxlbjsKLSAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgYXJnLCBLZXlMZW4pOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQotICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKLSAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgS2V5TGVuIC8gMik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW47Ci0gICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIGFyZywgS2V5TGVuKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQotICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKLSAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgS2V5TGVuIC8gMik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKLQotICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCi0gICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKLSAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKLSAgICB7Ci0gICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgV0VQIEtFWTIKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBTZXRfS2V5Ml9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBTVFJJTkcgICAgICAgICAgYXJnKQotewotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7Ci0KLSAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCi0KLSAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKLQotICAgIHN3aXRjaCAoS2V5TGVuKQotICAgIHsKLSAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCi0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbjsKLSAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgYXJnLCBLZXlMZW4pOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQotICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKLSAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgS2V5TGVuIC8gMik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW47Ci0gICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksIGFyZywgS2V5TGVuKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQotICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKLSAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgS2V5TGVuIC8gMik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0KLSAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQotICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLSAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0Ci0gICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCi0gICAgewotICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uQ2lwaGVyQWxnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBXRVAgS0VZMwotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9LZXkzX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpCi17Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKLQotICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLSAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKLQotICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOwotCi0gICAgc3dpdGNoIChLZXlMZW4pCi0gICAgewotICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuOwotICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBhcmcsIEtleUxlbik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1Bc2NpaSlcbiIsIGFyZykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCi0gICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbiAvIDIgOwotICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBLZXlMZW4gLyAyKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUhleClcbiIsIGFyZykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCi0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbjsKLSAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgYXJnLCBLZXlMZW4pOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUFzY2lpKVxuIiwgYXJnKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCi0gICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbiAvIDIgOwotICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBLZXlMZW4gLyAyKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1IZXgpXG4iLCBhcmcpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKLQotICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCi0gICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKLSAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKLSAgICB7Ci0gICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5DaXBoZXJBbGcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFdFUCBLRVk0Ci0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X0tleTRfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQU1RSSU5HICAgICAgICAgIGFyZykKLXsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OwotCi0gICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZwotCi0gICAgS2V5TGVuID0gc3RybGVuKGFyZyk7Ci0KLSAgICBzd2l0Y2ggKEtleUxlbikKLSAgICB7Ci0gICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlMZW4gPSBLZXlMZW47Ci0gICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIGFyZywgS2V5TGVuKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKLSAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuIC8gMiA7Ci0gICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIEtleUxlbiAvIDIpOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuOwotICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBhcmcsIEtleUxlbik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKLSAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuIC8gMiA7Ci0gICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIEtleUxlbiAvIDIpOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCi0gICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKLSAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAotICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgotICAgIHsKLSAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLkNpcGhlckFsZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBXUEEgUFNLIGtleQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9XUEFQU0tfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpCi17Ci0gICAgaW50IHN0YXR1czsKLQotICAgIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgotICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKLQkgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCi0JCSkKLSAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XUEFQU0tfUHJvYzo6KFdQQVBTSz0lcylcbiIsIGFyZykpOwotCi0Jc3RhdHVzID0gUlRfQ2ZnU2V0V1BBUFNLS2V5KHBBZCwgYXJnLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIHBBZC0+U3RhQ2ZnLlBNSyk7Ci0JaWYgKHN0YXR1cyA9PSBGQUxTRSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XUEFQU0tfUHJvYygpOiBTZXQga2V5IGZhaWxlZCFcbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5XcGFQYXNzUGhyYXNlLCA2NCk7Ci0gICAgTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuV3BhUGFzc1BocmFzZSwgYXJnLCBzdHJsZW4oYXJnKSk7Ci0gICAgcEFkLT5TdGFDZmcuV3BhUGFzc1BocmFzZUxlbiA9IChVSU5UKXN0cmxlbihhcmcpOwotCi0KLQotICAgIGlmKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DICYmCi0gICAgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKLSAgICB7Ci0gICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvLyBTdGFydCBTVEEgc3VwcGxpY2FudCBzdGF0ZSBtYWNoaW5lCi0gICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfU1RBUlQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFBvd2VyIFNhdmluZyBtb2RlCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X1BTTW9kZV9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBTVFJJTkcgICAgICAgICAgYXJnKQotewotICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKQotICAgIHsKLSAgICAgICAgaWYgKChzdHJjbXAoYXJnLCAiTWF4X1BTUCIpID09IDApIHx8Ci0JCQkoc3RyY21wKGFyZywgIm1heF9wc3AiKSA9PSAwKSB8fAotCQkJKHN0cmNtcChhcmcsICJNQVhfUFNQIikgPT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tQc21DaGFuZ2UoKQotICAgICAgICAgICAgLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCi0gICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOwotICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOwotICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gNTsKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiRmFzdF9QU1AiKSA9PSAwKSB8fAotCQkJCSAoc3RyY21wKGFyZywgImZhc3RfcHNwIikgPT0gMCkgfHwKLSAgICAgICAgICAgICAgICAgKHN0cmNtcChhcmcsICJGQVNUX1BTUCIpID09IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrUHNtQ2hhbmdlKCkKLSAgICAgICAgICAgIC8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgotICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKLSAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCi0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOwotICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUDsKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIkxlZ2FjeV9QU1AiKSA9PSAwKSB8fAotICAgICAgICAgICAgICAgICAoc3RyY21wKGFyZywgImxlZ2FjeV9wc3AiKSA9PSAwKSB8fAotICAgICAgICAgICAgICAgICAoc3RyY21wKGFyZywgIkxFR0FDWV9QU1AiKSA9PSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja1BzbUNoYW5nZSgpCi0gICAgICAgICAgICAvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KLSAgICAgICAgICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7Ci0gICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQOwotICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQOwotICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy9EZWZhdWx0IE5kaXM4MDJfMTFQb3dlck1vZGVDQU0KLSAgICAgICAgICAgIC8vIGNsZWFyIFBTTSBiaXQgaW1tZWRpYXRlbHkKLSAgICAgICAgICAgIFJUTVBfU0VUX1BTTV9CSVQocEFkYXB0ZXIsIFBXUl9BQ1RJVkUpOwotICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKLSAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCi0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOwotICAgICAgICB9Ci0KLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1BTTW9kZV9Qcm9jOjooUFNNb2RlPSVsZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0vL0FkZCB0byBzdXBvcnQgdGhlIGZ1bmN0aW9uIHdoaWNoIGNsb3VsZCBkeW5hbWljYWxsbHkgZW5hYmxlL2Rpc2FibGUgUENJZSBQb3dlciBTYXZpbmcKLQotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFdwYVN1cHBvcnQgZmxhZy4KLSAgICBWYWx1ZToKLSAgICAgICAgMDogRHJpdmVyIGlnbm9yZSB3cGFfc3VwcGxpY2FudC4KLSAgICAgICAgMTogd3BhX3N1cHBsaWNhbnQgaW5pdGlhdGVzIHNjYW5uaW5nIGFuZCBBUCBzZWxlY3Rpb24uCi0gICAgICAgIDI6IGRyaXZlciB0YWtlcyBjYXJlIG9mIHNjYW5uaW5nLCBBUCBzZWxlY3Rpb24sIGFuZCBJRUVFIDgwMi4xMSBhc3NvY2lhdGlvbiBwYXJhbWV0ZXJzLgotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9XcGFfU3VwcG9ydCgKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCi0gICAgaWYgKCBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDApCi0gICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEU7Ci0gICAgZWxzZSBpZiAoIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMSkKLSAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFOwotICAgIGVsc2UgaWYgKCBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDIpCi0gICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0VOQUJMRV9XSVRIX1dFQl9VSTsKLSAgICBlbHNlCi0gICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEU7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfV3BhX1N1cHBvcnQ6OihXcGFTdXBwbGljYW50VVA9JWQpXG4iLCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApKTsKLQotICAgIHJldHVybiBUUlVFOwotfQotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQotI2lmZGVmIERCRwotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBSZWFkIC8gV3JpdGUgTUFDCi0gICAgQXJndW1lbnRzOgotICAgICAgICBwQWRhcHRlciAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgotICAgICAgICB3cnEgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW9jdGwgYXJndW1lbnQKLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgTm9uZQotCi0gICAgTm90ZToKLSAgICAgICAgVXNhZ2U6Ci0gICAgICAgICAgICAgICAxLikgaXdwcml2IHJhMCBtYWMgMCAgICAgICAgPT0+IHJlYWQgTUFDIHdoZXJlIEFkZHI9MHgwCi0gICAgICAgICAgICAgICAyLikgaXdwcml2IHJhMCBtYWMgMD0xMiAgICAgPT0+IHdyaXRlIE1BQyB3aGVyZSBBZGRyPTB4MCwgdmFsdWU9MTIKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUElvY3RsTUFDKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEpCi17Ci0JUFNUUklORwkJCQl0aGlzX2NoYXI7Ci0JUFNUUklORwkJCQl2YWx1ZTsKLQlJTlQJCQkJCWogPSAwLCBrID0gMDsKLQlTVFJJTkcJCQkJbXNnWzEwMjRdOwotCVNUUklORwkJCQlhcmdbMjU1XTsKLQlVTE9ORwkJCQltYWNBZGRyID0gMDsKLQlVQ0hBUgkJCQl0ZW1wWzE2XTsKLQlTVFJJTkcJCQkJdGVtcDJbMTZdOwotCVVJTlQzMgkJCQltYWNWYWx1ZSA9IDA7Ci0JSU5UCQkJCQlTdGF0dXM7Ci0JQk9PTEVBTgkJCQliSXNQcmludEFsbE1BQyA9IEZBTFNFOwotCi0KLQltZW1zZXQobXNnLCAweDAwLCAxMDI0KTsKLQlpZiAod3JxLT51LmRhdGEubGVuZ3RoID4gMSkgLy9ObyBwYXJhbWV0ZXJzLgotCXsKLQkgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoYXJnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCAod3JxLT51LmRhdGEubGVuZ3RoID4gMjU1KSA/IDI1NSA6IHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCXNwcmludGYobXNnLCAiXG4iKTsKLQotCQkvL1BhcnNpbmcgUmVhZCBvciBXcml0ZQotCSAgICB0aGlzX2NoYXIgPSBhcmc7Ci0JCWlmICghKnRoaXNfY2hhcikKLQkJCWdvdG8gbmV4dDsKLQotCQlpZiAoKHZhbHVlID0gcnRzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQotCQkJKnZhbHVlKysgPSAwOwotCi0JCWlmICghdmFsdWUgfHwgISp2YWx1ZSkKLQkJeyAvL1JlYWQKLQkJCS8vIFNhbml0eSBjaGVjawotCQkJaWYoc3RybGVuKHRoaXNfY2hhcikgPiA0KQotCQkJCWdvdG8gbmV4dDsKLQotCQkJaiA9IHN0cmxlbih0aGlzX2NoYXIpOwotCQkJd2hpbGUoai0tID4gMCkKLQkJCXsKLQkJCQlpZih0aGlzX2NoYXJbal0gPiAnZicgfHwgdGhpc19jaGFyW2pdIDwgJzAnKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIE1hYyBBZGRyCi0JCQlrID0gaiA9IHN0cmxlbih0aGlzX2NoYXIpOwotCQkJd2hpbGUoai0tID4gMCkKLQkJCXsKLQkJCQl0aGlzX2NoYXJbNC1rK2pdID0gdGhpc19jaGFyW2pdOwotCQkJfQotCi0JCQl3aGlsZShrIDwgNCkKLQkJCQl0aGlzX2NoYXJbMy1rKytdPScwJzsKLQkJCXRoaXNfY2hhcls0XT0nXDAnOwotCi0JCQlpZihzdHJsZW4odGhpc19jaGFyKSA9PSA0KQotCQkJewotCQkJCUF0b0godGhpc19jaGFyLCB0ZW1wLCAyKTsKLQkJCQltYWNBZGRyID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKLQkJCQlpZiAobWFjQWRkciA8IDB4RkZGRikKLQkJCQl7Ci0JCQkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBtYWNBZGRyLCAmbWFjVmFsdWUpOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNBZGRyPSVseCwgTWFjVmFsdWU9JXhcbiIsIG1hY0FkZHIsIG1hY1ZhbHVlKSk7Ci0JCQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiWzB4JTA4bFhdOiUwOFggICIsIG1hY0FkZHIgLCBtYWNWYWx1ZSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIG1hYwotCQkJCQliSXNQcmludEFsbE1BQyA9IFRSVUU7Ci0JCQkJCWdvdG8gbmV4dDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7IC8vV3JpdGUKLQkJCW1lbWNweSgmdGVtcDIsIHZhbHVlLCBzdHJsZW4odmFsdWUpKTsKLQkJCXRlbXAyW3N0cmxlbih2YWx1ZSldID0gJ1wwJzsKLQotCQkJLy8gU2FuaXR5IGNoZWNrCi0JCQlpZigoc3RybGVuKHRoaXNfY2hhcikgPiA0KSB8fCBzdHJsZW4odGVtcDIpID4gOCkKLQkJCQlnb3RvIG5leHQ7Ci0KLQkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKLQkJCXdoaWxlKGotLSA+IDApCi0JCQl7Ci0JCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKLQkJCQkJcmV0dXJuOwotCQkJfQotCi0JCQlqID0gc3RybGVuKHRlbXAyKTsKLQkJCXdoaWxlKGotLSA+IDApCi0JCQl7Ci0JCQkJaWYodGVtcDJbal0gPiAnZicgfHwgdGVtcDJbal0gPCAnMCcpCi0JCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLy9NQUMgQWRkcgotCQkJayA9IGogPSBzdHJsZW4odGhpc19jaGFyKTsKLQkJCXdoaWxlKGotLSA+IDApCi0JCQl7Ci0JCQkJdGhpc19jaGFyWzQtaytqXSA9IHRoaXNfY2hhcltqXTsKLQkJCX0KLQotCQkJd2hpbGUoayA8IDQpCi0JCQkJdGhpc19jaGFyWzMtaysrXT0nMCc7Ci0JCQl0aGlzX2NoYXJbNF09J1wwJzsKLQotCQkJLy9NQUMgdmFsdWUKLQkJCWsgPSBqID0gc3RybGVuKHRlbXAyKTsKLQkJCXdoaWxlKGotLSA+IDApCi0JCQl7Ci0JCQkJdGVtcDJbOC1rK2pdID0gdGVtcDJbal07Ci0JCQl9Ci0KLQkJCXdoaWxlKGsgPCA4KQotCQkJCXRlbXAyWzctaysrXT0nMCc7Ci0JCQl0ZW1wMls4XT0nXDAnOwotCi0JCQl7Ci0JCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOwotCQkJCW1hY0FkZHIgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOwotCi0JCQkJQXRvSCh0ZW1wMiwgdGVtcCwgNCk7Ci0JCQkJbWFjVmFsdWUgPSAqdGVtcCoyNTYqMjU2KjI1NiArIHRlbXBbMV0qMjU2KjI1NiArIHRlbXBbMl0qMjU2ICsgdGVtcFszXTsKLQotCQkJCS8vIGRlYnVnIG1vZGUKLQkJCQlpZiAobWFjQWRkciA9PSAoSFdfREVCVUdfU0VUVElOR19CQVNFICsgNCkpCi0JCQkJewotCQkJCQkvLyAweDJiZjQ6IGJ5dGUwIG5vbi16ZXJvOiBlbmFibGUgUjE3IHR1bmluZywgMDogZGlzYWJsZSBSMTcgdHVuaW5nCi0gICAgICAgICAgICAgICAgICAgIGlmIChtYWNWYWx1ZSAmIDB4MDAwMDAwZmYpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5CYnBUdW5pbmcuYkVuYWJsZSA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInR1cm4gb24gUjE3IHR1bmluZ1xuIikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgUjY2OwotICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkJicFR1bmluZy5iRW5hYmxlID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSNjYgPSAweDI2ICsgR0VUX0xOQV9HQUlOKHBBZGFwdGVyKTsKLSNpZmRlZiBSQUxJTktfQVRFCi0JCQkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKLQkJCQkJCXsKLQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNjYsICgweDI2ICsgR0VUX0xOQV9HQUlOKHBBZGFwdGVyKSkpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotCQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNjYsICgweDI2ICsgR0VUX0xOQV9HQUlOKHBBZGFwdGVyKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJ0dXJuIG9mZiBSMTcgdHVuaW5nLCByZXN0b3JlIHRvIDB4JTAyeFxuIiwgUjY2KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY0FkZHI9JTAybHgsIE1hY1ZhbHVlPTB4JXhcbiIsIG1hY0FkZHIsIG1hY1ZhbHVlKSk7Ci0KLQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIG1hY0FkZHIsIG1hY1ZhbHVlKTsKLQkJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlsweCUwOGxYXTolMDhYICAiLCBtYWNBZGRyLCBtYWNWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZQotCQliSXNQcmludEFsbE1BQyA9IFRSVUU7Ci1uZXh0OgotCWlmIChiSXNQcmludEFsbE1BQykKLQl7Ci0JCXN0cnVjdCBmaWxlCQkqZmlsZV93OwotCQlQU1RSSU5HCQkJZmlsZU5hbWUgPSAiTWFjRHVtcC50eHQiOwotCQltbV9zZWdtZW50X3QJb3JpZ19mczsKLQotCQlvcmlnX2ZzID0gZ2V0X2ZzKCk7Ci0JCXNldF9mcyhLRVJORUxfRFMpOwotCi0JCS8vIG9wZW4gZmlsZQotCQlmaWxlX3cgPSBmaWxwX29wZW4oZmlsZU5hbWUsIE9fV1JPTkxZfE9fQ1JFQVQsIDApOwotCQlpZiAoSVNfRVJSKGZpbGVfdykpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPjIpICVzOiBFcnJvciAlbGQgb3BlbmluZyAlc1xuIiwgX19GVU5DVElPTl9fLCAtUFRSX0VSUihmaWxlX3cpLCBmaWxlTmFtZSkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKGZpbGVfdy0+Zl9vcCAmJiBmaWxlX3ctPmZfb3AtPndyaXRlKQotCQkJewotCQkJCWZpbGVfdy0+Zl9wb3MgPSAwOwotCQkJCW1hY0FkZHIgPSAweDEwMDA7Ci0KLQkJCQl3aGlsZSAobWFjQWRkciA8PSAweDE4MDApCi0JCQkJewotCQkJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgbWFjQWRkciwgJm1hY1ZhbHVlKTsKLQkJCQkJc3ByaW50Zihtc2csICIlMDhseCA9ICUwOFhcbiIsIG1hY0FkZHIsIG1hY1ZhbHVlKTsKLQotCQkJCQkvLyB3cml0ZSBkYXRhIHRvIGZpbGUKLQkJCQkJZmlsZV93LT5mX29wLT53cml0ZShmaWxlX3csIG1zZywgc3RybGVuKG1zZyksICZmaWxlX3ctPmZfcG9zKTsKLQotCQkJCQlwcmludGsoIiVzIiwgbXNnKTsKLQkJCQkJbWFjQWRkciArPSA0OwotCQkJCX0KLQkJCQlzcHJpbnRmKG1zZywgIlxuRHVtcCBhbGwgTUFDIHZhbHVlcyB0byAlc1xuIiwgZmlsZU5hbWUpOwotCQkJfQotCQkJZmlscF9jbG9zZShmaWxlX3csIE5VTEwpOwotCQl9Ci0JCXNldF9mcyhvcmlnX2ZzKTsKLQl9Ci0JaWYoc3RybGVuKG1zZykgPT0gMSkKLQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICI9PT0+RXJyb3IgY29tbWFuZCBmb3JtYXQhIik7Ci0KLQkvLyBDb3B5IHRoZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSB1c2VyIGJ1ZmZlcgotCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihtc2cpOwotCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBtc2csIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT1SVE1QSW9jdGxNQUNcblxuIikpOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFJlYWQgLyBXcml0ZSBFMlBST00KLSAgICBBcmd1bWVudHM6Ci0gICAgICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0gICAgICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAotCi0gICAgUmV0dXJuIFZhbHVlOgotICAgICAgICBOb25lCi0KLSAgICBOb3RlOgotICAgICAgICBVc2FnZToKLSAgICAgICAgICAgICAgIDEuKSBpd3ByaXYgcmEwIGUycCAwCQk9PT4gcmVhZCBFMlBST00gd2hlcmUgQWRkcj0weDAKLSAgICAgICAgICAgICAgIDIuKSBpd3ByaXYgcmEwIGUycCAwPTEyMzQgICAgPT0+IHdyaXRlIEUyUFJPTSB3aGVyZSBBZGRyPTB4MCwgdmFsdWU9MTIzNAotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QSW9jdGxFMlBST00oCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSkKLXsKLQlQU1RSSU5HCQkJCXRoaXNfY2hhcjsKLQlQU1RSSU5HCQkJCXZhbHVlOwotCUlOVAkJCQkJaiA9IDAsIGsgPSAwOwotCVNUUklORwkJCQltc2dbMTAyNF07Ci0JU1RSSU5HCQkJCWFyZ1syNTVdOwotCVVTSE9SVAkJCQllZXBBZGRyID0gMDsKLQlVQ0hBUgkJCQl0ZW1wWzE2XTsKLQlTVFJJTkcJCQkJdGVtcDJbMTZdOwotCVVTSE9SVAkJCQllZXBWYWx1ZTsKLQlpbnQJCQkJCVN0YXR1czsKLQlCT09MRUFOCQkJCWJJc1ByaW50QWxsRTJQID0gRkFMU0U7Ci0KLQotCW1lbXNldChtc2csIDB4MDAsIDEwMjQpOwotCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggPiAxKSAvL05vIHBhcmFtZXRlcnMuCi0JewotCSAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihhcmcsIHdycS0+dS5kYXRhLnBvaW50ZXIsICh3cnEtPnUuZGF0YS5sZW5ndGggPiAyNTUpID8gMjU1IDogd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJc3ByaW50Zihtc2csICJcbiIpOwotCi0JICAgIC8vUGFyc2luZyBSZWFkIG9yIFdyaXRlCi0JCXRoaXNfY2hhciA9IGFyZzsKLQotCi0JCWlmICghKnRoaXNfY2hhcikKLQkJCWdvdG8gbmV4dDsKLQotCQlpZiAoKHZhbHVlID0gcnRzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQotCQkJKnZhbHVlKysgPSAwOwotCi0JCWlmICghdmFsdWUgfHwgISp2YWx1ZSkKLQkJeyAvL1JlYWQKLQotCQkJLy8gU2FuaXR5IGNoZWNrCi0JCQlpZihzdHJsZW4odGhpc19jaGFyKSA+IDQpCi0JCQkJZ290byBuZXh0OwotCi0JCQlqID0gc3RybGVuKHRoaXNfY2hhcik7Ci0JCQl3aGlsZShqLS0gPiAwKQotCQkJewotCQkJCWlmKHRoaXNfY2hhcltqXSA+ICdmJyB8fCB0aGlzX2NoYXJbal0gPCAnMCcpCi0JCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLy8gRTJQUk9NIGFkZHIKLQkJCWsgPSBqID0gc3RybGVuKHRoaXNfY2hhcik7Ci0JCQl3aGlsZShqLS0gPiAwKQotCQkJewotCQkJCXRoaXNfY2hhcls0LWsral0gPSB0aGlzX2NoYXJbal07Ci0JCQl9Ci0KLQkJCXdoaWxlKGsgPCA0KQotCQkJCXRoaXNfY2hhclszLWsrK109JzAnOwotCQkJdGhpc19jaGFyWzRdPSdcMCc7Ci0KLQkJCWlmKHN0cmxlbih0aGlzX2NoYXIpID09IDQpCi0JCQl7Ci0JCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOwotCQkJCWVlcEFkZHIgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOwotCQkJCWlmIChlZXBBZGRyIDwgMHhGRkZGKQotCQkJCXsKLQkJCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkYXB0ZXIsIGVlcEFkZHIsIGVlcFZhbHVlKTsKLQkJCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJbMHglMDRYXToweCUwNFggICIsIGVlcEFkZHIgLCBlZXBWYWx1ZSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAotCQkJCQliSXNQcmludEFsbEUyUCA9IFRSVUU7Ci0JCQkJCWdvdG8gbmV4dDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7IC8vV3JpdGUKLQkJCW1lbWNweSgmdGVtcDIsIHZhbHVlLCBzdHJsZW4odmFsdWUpKTsKLQkJCXRlbXAyW3N0cmxlbih2YWx1ZSldID0gJ1wwJzsKLQotCQkJLy8gU2FuaXR5IGNoZWNrCi0JCQlpZigoc3RybGVuKHRoaXNfY2hhcikgPiA0KSB8fCBzdHJsZW4odGVtcDIpID4gOCkKLQkJCQlnb3RvIG5leHQ7Ci0KLQkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKLQkJCXdoaWxlKGotLSA+IDApCi0JCQl7Ci0JCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJaiA9IHN0cmxlbih0ZW1wMik7Ci0JCQl3aGlsZShqLS0gPiAwKQotCQkJewotCQkJCWlmKHRlbXAyW2pdID4gJ2YnIHx8IHRlbXAyW2pdIDwgJzAnKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vTUFDIEFkZHIKLQkJCWsgPSBqID0gc3RybGVuKHRoaXNfY2hhcik7Ci0JCQl3aGlsZShqLS0gPiAwKQotCQkJewotCQkJCXRoaXNfY2hhcls0LWsral0gPSB0aGlzX2NoYXJbal07Ci0JCQl9Ci0KLQkJCXdoaWxlKGsgPCA0KQotCQkJCXRoaXNfY2hhclszLWsrK109JzAnOwotCQkJdGhpc19jaGFyWzRdPSdcMCc7Ci0KLQkJCS8vTUFDIHZhbHVlCi0JCQlrID0gaiA9IHN0cmxlbih0ZW1wMik7Ci0JCQl3aGlsZShqLS0gPiAwKQotCQkJewotCQkJCXRlbXAyWzQtaytqXSA9IHRlbXAyW2pdOwotCQkJfQotCi0JCQl3aGlsZShrIDwgNCkKLQkJCQl0ZW1wMlszLWsrK109JzAnOwotCQkJdGVtcDJbNF09J1wwJzsKLQotCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOwotCQkJZWVwQWRkciA9ICp0ZW1wKjI1NiArIHRlbXBbMV07Ci0KLQkJCUF0b0godGVtcDIsIHRlbXAsIDIpOwotCQkJZWVwVmFsdWUgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOwotCi0JCQlSVDI4eHhfRUVQUk9NX1dSSVRFMTYocEFkYXB0ZXIsIGVlcEFkZHIsIGVlcFZhbHVlKTsKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiWzB4JTAyWF06JTAyWCAgIiwgZWVwQWRkciwgZWVwVmFsdWUpOwotCQl9Ci0JfQotCWVsc2UKLQkJYklzUHJpbnRBbGxFMlAgPSBUUlVFOwotbmV4dDoKLQlpZiAoYklzUHJpbnRBbGxFMlApCi0JewotCQlzdHJ1Y3QgZmlsZQkJKmZpbGVfdzsKLQkJUFNUUklORwkJCWZpbGVOYW1lID0gIkVFUFJPTUR1bXAudHh0IjsKLQkJbW1fc2VnbWVudF90CW9yaWdfZnM7Ci0KLQkJb3JpZ19mcyA9IGdldF9mcygpOwotCQlzZXRfZnMoS0VSTkVMX0RTKTsKLQotCQkvLyBvcGVuIGZpbGUKLQkJZmlsZV93ID0gZmlscF9vcGVuKGZpbGVOYW1lLCBPX1dST05MWXxPX0NSRUFULCAwKTsKLQkJaWYgKElTX0VSUihmaWxlX3cpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4yKSAlczogRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsIF9fRlVOQ1RJT05fXywgLVBUUl9FUlIoZmlsZV93KSwgZmlsZU5hbWUpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChmaWxlX3ctPmZfb3AgJiYgZmlsZV93LT5mX29wLT53cml0ZSkKLQkJCXsKLQkJCQlmaWxlX3ctPmZfcG9zID0gMDsKLQkJCQllZXBBZGRyID0gMHgwMDsKLQotCQkJCXdoaWxlIChlZXBBZGRyIDw9IDB4RkUpCi0JCQkJewotCQkJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWRhcHRlciwgZWVwQWRkciwgZWVwVmFsdWUpOwotCQkJCQlzcHJpbnRmKG1zZywgIiUwOHggPSAlMDR4XG4iLCBlZXBBZGRyICwgZWVwVmFsdWUpOwotCi0JCQkJCS8vIHdyaXRlIGRhdGEgdG8gZmlsZQotCQkJCQlmaWxlX3ctPmZfb3AtPndyaXRlKGZpbGVfdywgbXNnLCBzdHJsZW4obXNnKSwgJmZpbGVfdy0+Zl9wb3MpOwotCi0JCQkJCXByaW50aygiJXMiLCBtc2cpOwotCQkJCQllZXBBZGRyICs9IDI7Ci0JCQkJfQotCQkJCXNwcmludGYobXNnLCAiXG5EdW1wIGFsbCBFRVBST00gdmFsdWVzIHRvICVzXG4iLCBmaWxlTmFtZSk7Ci0JCQl9Ci0JCQlmaWxwX2Nsb3NlKGZpbGVfdywgTlVMTCk7Ci0JCX0KLQkJc2V0X2ZzKG9yaWdfZnMpOwotCX0KLQlpZihzdHJsZW4obXNnKSA9PSAxKQotCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIj09PT5FcnJvciBjb21tYW5kIGZvcm1hdCEiKTsKLQotCi0JLy8gQ29weSB0aGUgaW5mb3JtYXRpb24gaW50byB0aGUgdXNlciBidWZmZXIKLQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4obXNnKTsKLQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgbXNnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09UlRNUElvY3RsRTJQUk9NXG4iKSk7Ci19Ci0KLQotI2lmZGVmIFJUMzB4eAotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBSZWFkIC8gV3JpdGUgUkYgcmVnaXN0ZXIKLUFyZ3VtZW50czoKLSAgICBwQWRhcHRlciAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgotICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAotCi0gICAgUmV0dXJuIFZhbHVlOgotICAgICAgICBOb25lCi0KLSAgICBOb3RlOgotICAgICAgICBVc2FnZToKLSAgICAgICAgICAgICAgIDEuKSBpd3ByaXYgcmEwIHJmICAgICAgICAgICAgICAgID09PiByZWFkIGFsbCBSRiByZWdpc3RlcnMKLSAgICAgICAgICAgICAgIDIuKSBpd3ByaXYgcmEwIHJmIDEgICAgICAgICAgICAgID09PiByZWFkIFJGIHdoZXJlIFJlZ0lEPTEKLSAgICAgICAgICAgICAgIDMuKSBpd3ByaXYgcmEwIHJmIDE9MTAJCSAgICA9PT4gd3JpdGUgUkYgUjE9MHgxMAotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QSW9jdGxSRigKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxKQotewotCUNIQVIJCQkJKnRoaXNfY2hhcjsKLQlDSEFSCQkJCSp2YWx1ZTsKLQlVQ0hBUgkJCQlyZWdSRiA9IDA7Ci0JU1RSSU5HCQkJCW1zZ1syMDQ4XTsKLQlDSEFSCQkJCWFyZ1syNTVdOwotCUlOVAkJCQkJcmZJZDsKLQlMT05HCQkJCXJmVmFsdWU7Ci0JaW50CQkJCQlTdGF0dXM7Ci0JQk9PTEVBTgkJCQliSXNQcmludEFsbFJGID0gRkFMU0U7Ci0KLQotCW1lbXNldChtc2csIDB4MDAsIDIwNDgpOwotCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggPiAxKSAvL05vIHBhcmFtZXRlcnMuCi0JewotCSAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihhcmcsIHdycS0+dS5kYXRhLnBvaW50ZXIsICh3cnEtPnUuZGF0YS5sZW5ndGggPiAyNTUpID8gMjU1IDogd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJc3ByaW50Zihtc2csICJcbiIpOwotCi0JICAgIC8vUGFyc2luZyBSZWFkIG9yIFdyaXRlCi0JCXRoaXNfY2hhciA9IGFyZzsKLQkJaWYgKCEqdGhpc19jaGFyKQotCQkJZ290byBuZXh0OwotCi0JCWlmICgodmFsdWUgPSBzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQotCQkJKnZhbHVlKysgPSAwOwotCi0JCWlmICghdmFsdWUgfHwgISp2YWx1ZSkKLQkJeyAvL1JlYWQKLQkJCWlmIChzc2NhbmYoKFBTVFJJTkcpIHRoaXNfY2hhciwgIiVkIiwgJihyZklkKSkgPT0gMSkKLQkJCXsKLQkJCQlpZiAocmZJZCA8PSAzMSkKLQkJCQl7Ci0jaWZkZWYgUkFMSU5LX0FURQotCQkJCQkvKgotCQkJCQkJSW4gUlQyODYwIEFURSBtb2RlLCB3ZSBkbyBub3QgbG9hZCA4MDUxIGZpcm13YXJlLgotCSAgICAgICAgICAgICAgICAgICAgV2UgbXVzdCBhY2Nlc3MgUkYgZGlyZWN0bHkuCi0JCQkJCQlGb3IgUlQyODcwIEFURSBtb2RlLCBBVEVfUkZfSU9fV1JJVEU4KC9SRUFEOClfQllfUkVHX0lEIGFyZSByZWRlZmluZWQuCi0JCQkJCSovCi0JCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQotCQkJCQl7Ci0JCQkJCQlBVEVfUkZfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCByZklkLCAmcmVnUkYpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0JCQkJCS8vIGFjY29yZGluZyB0byBBbmR5LCBHYXJ5LCBEYXZpZCByZXF1aXJlLgotCQkJCQkvLyB0aGUgY29tbWFuZCByZiBzaGFsbCByZWFkIHJmIHJlZ2lzdGVyIGRpcmVjdGx5IGZvciBkdWJ1Zy4KLQkJCQkJLy8gQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOwotCQkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWRhcHRlciwgcmZJZCwgJnJlZ1JGKTsKLQotCQkJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlIlMDJkWzB4JTAyeF06JTAyWCAgIiwgcmZJZCwgcmZJZCwgcmVnUkYpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJey8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBSRgotCQkJCQliSXNQcmludEFsbFJGID0gVFJVRTsKLQkJCQkJZ290byBuZXh0OwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsgLy9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIFJGCi0JCQkJYklzUHJpbnRBbGxSRiA9IFRSVUU7Ci0JCQkJZ290byBuZXh0OwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJeyAvL1dyaXRlCi0JCQlpZiAoKHNzY2FuZigoUFNUUklORykgdGhpc19jaGFyLCAiJWQiLCAmKHJmSWQpKSA9PSAxKSAmJiAoc3NjYW5mKChQU1RSSU5HKSB2YWx1ZSwgIiVseCIsICYocmZWYWx1ZSkpID09IDEpKQotCQkJewotCQkJCWlmIChyZklkIDw9IDMxKQotCQkJCXsKLSNpZmRlZiBSQUxJTktfQVRFCi0JCQkJCQkvKgotCQkJCQkJCUluIFJUMjg2MCBBVEUgbW9kZSwgd2UgZG8gbm90IGxvYWQgODA1MSBmaXJtd2FyZS4KLQkJICAgICAgICAgICAgICAgICAgICBXZSBtdXN0IGFjY2VzcyBSRiBkaXJlY3RseS4KLQkJCQkJCQlGb3IgUlQyODcwIEFURSBtb2RlLCBBVEVfUkZfSU9fV1JJVEU4KC9SRUFEOClfQllfUkVHX0lEIGFyZSByZWRlZmluZWQuCi0JCQkJCQkqLwotCQkJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCi0JCQkJCQl7Ci0JCQkJCQkJQVRFX1JGX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgcmZJZCwgJnJlZ1JGKTsKLQkJCQkJCQlBVEVfUkZfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgKFVDSEFSKXJmSWQsKFVDSEFSKSByZlZhbHVlKTsKLQkJCQkJCQkvL1JlYWQgaXQgYmFjayBmb3Igc2hvd2luZwotCQkJCQkJCUFURV9SRl9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIHJmSWQsICZyZWdSRik7Ci0JCQkJCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJSJTAyZFsweCUwMlhdOiUwMlhcbiIsIHJmSWQsIHJmSWQsIHJlZ1JGKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0JCQkJCQl7Ci0JCQkJCQkJLy8gYWNjb3JkaW5nIHRvIEFuZHksIEdhcnksIERhdmlkIHJlcXVpcmUuCi0JCQkJCQkJLy8gdGhlIGNvbW1hbmQgUkYgc2hhbGwgcmVhZC93cml0ZSBSRiByZWdpc3RlciBkaXJlY3RseSBmb3IgZHVidWcuCi0JCQkJCQkJLy9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7Ci0JCQkJCQkJLy9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgKFVDSEFSKWJicElkLChVQ0hBUikgYmJwVmFsdWUpOwotCQkJCQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZGFwdGVyLCByZklkLCAmcmVnUkYpOwotCQkJCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWRhcHRlciwgKFVDSEFSKXJmSWQsKFVDSEFSKSByZlZhbHVlKTsKLQkJCQkJCQkvL1JlYWQgaXQgYmFjayBmb3Igc2hvd2luZwotCQkJCQkJCS8vQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOwotCQkJCQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZGFwdGVyLCByZklkLCAmcmVnUkYpOwotCQkJICAgICAgICAgICAgICAgIHNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiUiUwMmRbMHglMDJYXTolMDJYXG4iLCByZklkLCByZklkLCByZWdSRik7Ci0JCQkJICAgICAgICAgICAgICAgIH0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgUkYKLQkJCQkJYklzUHJpbnRBbGxSRiA9IFRSVUU7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJeyAvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgUkYKLQkJCQliSXNQcmludEFsbFJGID0gVFJVRTsKLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JCWJJc1ByaW50QWxsUkYgPSBUUlVFOwotbmV4dDoKLQlpZiAoYklzUHJpbnRBbGxSRikKLQl7Ci0JCW1lbXNldChtc2csIDB4MDAsIDIwNDgpOwotCQlzcHJpbnRmKG1zZywgIlxuIik7Ci0JCWZvciAocmZJZCA9IDA7IHJmSWQgPD0gMzE7IHJmSWQrKykKLQkJewotI2lmZGVmIFJBTElOS19BVEUKLQkJCS8qCi0JCQkJSW4gUlQyODYwIEFURSBtb2RlLCB3ZSBkbyBub3QgbG9hZCA4MDUxIGZpcm13YXJlLgotICAgICAgICAgICAgICAgIFdlIG11c3QgYWNjZXNzIFJGIGRpcmVjdGx5LgotCQkJCUZvciBSVDI4NzAgQVRFIG1vZGUsIEFURV9SRl9JT19XUklURTgoL1JFQUQ4KV9CWV9SRUdfSUQgYXJlIHJlZGVmaW5lZC4KLQkJCSovCi0JCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKLQkJCXsKLQkJCQlBVEVfUkZfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCByZklkLCAmcmVnUkYpOwotCQkJfQotCQkJZWxzZQotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotCQkJLy8gYWNjb3JkaW5nIHRvIEFuZHksIEdhcnksIERhdmlkIHJlcXVpcmUuCi0JCQkvLyB0aGUgY29tbWFuZCBSRiBzaGFsbCByZWFkL3dyaXRlIFJGIHJlZ2lzdGVyIGRpcmVjdGx5IGZvciBkdWJ1Zy4KLQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZGFwdGVyLCByZklkLCAmcmVnUkYpOwotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICIlMDNkID0gJTAyWFxuIiwgcmZJZCwgcmVnUkYpOwotCQl9Ci0JCS8vIENvcHkgdGhlIGluZm9ybWF0aW9uIGludG8gdGhlIHVzZXIgYnVmZmVyCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInN0cmxlbihtc2cpPSVkXG4iLCAoVUlOVDMyKXN0cmxlbihtc2cpKSk7Ci0JCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihtc2cpOwotCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIG1zZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6IGNvcHlfdG9fdXNlcigpIGZhaWxcbiIsIF9fRlVOQ1RJT05fXykpOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWlmKHN0cmxlbihtc2cpID09IDEpCi0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIj09PT5FcnJvciBjb21tYW5kIGZvcm1hdCEiKTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJjb3B5IHRvIHVzZXIgW21zZz0lc11cbiIsIG1zZykpOwotCQkvLyBDb3B5IHRoZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSB1c2VyIGJ1ZmZlcgotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJzdHJsZW4obXNnKSA9JWRcbiIsIChVSU5UMzIpc3RybGVuKG1zZykpKTsKLQotCQkvLyBDb3B5IHRoZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSB1c2VyIGJ1ZmZlcgotCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4obXNnKTsKLQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIG1zZywgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT1SVE1QSW9jdGxSRlxuXG4iKSk7Ci19Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCi0jZW5kaWYgLy8gREJHIC8vCi0KLQotCi0KLUlOVCBTZXRfVEduV2lmaVRlc3RfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpCi17Ci0gICAgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKLSAgICAgICAgcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0ID0gRkFMU0U7Ci0gICAgZWxzZQotICAgICAgICBwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QgPSBUUlVFOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X1RHbldpZmlUZXN0X1Byb2M6OihiVEduV2lmaVRlc3Q9JWQpXG4iLCBwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QpKTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKLUlOVCBTZXRfSWVlZTgwMjExZENsaWVudE1vZGVfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQU1RSSU5HICAgICAgICAgIGFyZykKLXsKLSAgICBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9Ob25lOwotICAgIGVsc2UgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMSkKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9IFJ0ODAyXzExX0RfRmxleGlibGU7Ci0gICAgZWxzZSBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAyKQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9TdHJpY3Q7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSWVlZTgwMmRNb2RlX1Byb2M6OihJRUVFRTAyMTFkTW9kZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUpKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLSNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCi0KLSNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCi1JTlQgU2V0X0NhcnJpZXJEZXRlY3RfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFNUUklORyAgICAgICAgIGFyZykKLXsKLSAgICBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQotICAgICAgICBwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IEZBTFNFOwotICAgIGVsc2UKLSAgICAgICAgcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSBUUlVFOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X0NhcnJpZXJEZXRlY3RfUHJvYzo6KENhcnJpZXJEZXRlY3QuRW5hYmxlPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUpKTsKLQlyZXR1cm4gVFJVRTsKLX0KLSNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCi0KLQotSU5UCVNob3dfQWRob2NfTWFjVGFibGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJZXh0cmEpCi17Ci0JSU5UIGk7Ci0KLQlzcHJpbnRmKGV4dHJhLCAiXG4iKTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCXNwcmludGYoZXh0cmEsICIlc0hUIE9wZXJhdGluZyBNb2RlIDogJWRcbiIsIGV4dHJhLCBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0Jc3ByaW50ZihleHRyYSwgIiVzXG4lLTE5cyUtNHMlLTRzJS03cyUtN3MlLTdzJS0xMHMlLTZzJS02cyUtNnMlLTZzXG4iLCBleHRyYSwKLQkJCSJNQUMiLCAiQUlEIiwgIkJTUyIsICJSU1NJMCIsICJSU1NJMSIsICJSU1NJMiIsICJQaE1kIiwgIkJXIiwgIk1DUyIsICJTR0kiLCAiU1RCQyIpOwotCi0JZm9yIChpPTE7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKLQl7Ci0JCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07Ci0KLQkJaWYgKHN0cmxlbihleHRyYSkgPiAoSVdfUFJJVl9TSVpFX01BU0sgLSAzMCkpCi0JCSAgICBicmVhazsKLQkJaWYgKChwRW50cnktPlZhbGlkQXNDTEkgfHwgcEVudHJ5LT5WYWxpZEFzQXBDbGkpICYmIChwRW50cnktPlNzdCA9PSBTU1RfQVNTT0MpKQotCQl7Ci0JCQlzcHJpbnRmKGV4dHJhLCAiJXMlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCAgIiwgZXh0cmEsCi0JCQkJcEVudHJ5LT5BZGRyWzBdLCBwRW50cnktPkFkZHJbMV0sIHBFbnRyeS0+QWRkclsyXSwKLQkJCQlwRW50cnktPkFkZHJbM10sIHBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdKTsKLQkJCXNwcmludGYoZXh0cmEsICIlcyUtNGQiLCBleHRyYSwgKGludClwRW50cnktPkFpZCk7Ci0JCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTRkIiwgZXh0cmEsIChpbnQpcEVudHJ5LT5hcGlkeCk7Ci0JCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTdkIiwgZXh0cmEsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMCk7Ci0JCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTdkIiwgZXh0cmEsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMSk7Ci0JCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTdkIiwgZXh0cmEsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMik7Ci0JCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTEwcyIsIGV4dHJhLCBHZXRQaHlNb2RlKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUpKTsKLQkJCXNwcmludGYoZXh0cmEsICIlcyUtNnMiLCBleHRyYSwgR2V0QlcocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuQlcpKTsKLQkJCXNwcmludGYoZXh0cmEsICIlcyUtNmQiLCBleHRyYSwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTKTsKLQkJCXNwcmludGYoZXh0cmEsICIlcyUtNmQiLCBleHRyYSwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSk7Ci0JCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTZkIiwgZXh0cmEsIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMpOwotCQkJc3ByaW50ZihleHRyYSwgIiVzJS0xMGQsICVkLCAlZCUlXG4iLCBleHRyYSwgcEVudHJ5LT5EZWJ1Z0ZJRk9Db3VudCwgcEVudHJ5LT5EZWJ1Z1R4Q291bnQsCi0JCQkJCQkocEVudHJ5LT5EZWJ1Z1R4Q291bnQpID8gKChwRW50cnktPkRlYnVnVHhDb3VudC1wRW50cnktPkRlYnVnRklGT0NvdW50KSoxMDAvcEVudHJ5LT5EZWJ1Z1R4Q291bnQpIDogMCk7Ci0JCQlzcHJpbnRmKGV4dHJhLCAiJXNcbiIsIGV4dHJhKTsKLQkJfQotCX0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLUlOVCBTZXRfQmVhY29uTG9zdFRpbWVfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFNUUklORyAgICAgICAgIGFyZykKLXsKLQlVTE9ORyBsdG1wID0gKFVMT05HKXNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoKGx0bXAgIT0gMCkgJiYgKGx0bXAgPD0gNjApKQotCQlwQWQtPlN0YUNmZy5CZWFjb25Mb3N0VGltZSA9IChsdG1wICogT1NfSFopOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X0JlYWNvbkxvc3RUaW1lX1Byb2M6OihCZWFjb25Mb3N0VGltZT0lbGQpXG4iLCBwQWQtPlN0YUNmZy5CZWFjb25Mb3N0VGltZSkpOwotCXJldHVybiBUUlVFOwotfQotCi1JTlQgU2V0X0F1dG9Sb2FtaW5nX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4gIFBTVFJJTkcgICAgICAgICBhcmcpCi17Ci0gICAgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKLSAgICAgICAgcEFkLT5TdGFDZmcuYkF1dG9Sb2FtaW5nID0gRkFMU0U7Ci0gICAgZWxzZQotICAgICAgICBwQWQtPlN0YUNmZy5iQXV0b1JvYW1pbmcgPSBUUlVFOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X0F1dG9Sb2FtaW5nX1Byb2M6OihiQXV0b1JvYW1pbmc9JWQpXG4iLCBwQWQtPlN0YUNmZy5iQXV0b1JvYW1pbmcpKTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIElzc3VlIGEgc2l0ZSBzdXJ2ZXkgY29tbWFuZCB0byBkcml2ZXIKLQlBcmd1bWVudHM6Ci0JICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAotCi0gICAgUmV0dXJuIFZhbHVlOgotICAgICAgICBOb25lCi0KLSAgICBOb3RlOgotICAgICAgICBVc2FnZToKLSAgICAgICAgICAgICAgIDEuKSBpd3ByaXYgcmEwIHNldCBzaXRlX3N1cnZleQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9TaXRlU3VydmV5X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlORElTXzgwMl8xMV9TU0lEIFNzaWQ7Ci0KLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotCQlyZXR1cm4gLUVORVRET1dOOwotCX0KLQotCWlmIChNT05JVE9SX09OKHBBZCkpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgRHJpdmVyIGlzIGluIE1vbml0b3IgTW9kZSBub3cgISEhXG4iKSk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotCVJUTVBaZXJvTWVtb3J5KCZTc2lkLCBzaXplb2YoTkRJU184MDJfMTFfU1NJRCkpOwotCVNzaWQuU3NpZExlbmd0aCA9IDA7Ci0JaWYgKChhcmcgIT0gTlVMTCkgJiYKLQkJKHN0cmxlbihhcmcpIDw9IE1BWF9MRU5fT0ZfU1NJRCkpCi0gICAgewotICAgICAgICBSVE1QTW92ZU1lbW9yeShTc2lkLlNzaWQsIGFyZywgc3RybGVuKGFyZykpOwotICAgICAgICBTc2lkLlNzaWRMZW5ndGggPSBzdHJsZW4oYXJnKTsKLQl9Ci0KLQlwQWQtPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKLQotCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKLQl7Ci0JCVJUTVBfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZCk7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKLQl9Ci0KLQkvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKLQkvLyB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLgotCXBBZC0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOwotCS8vIFJlc2V0IGFsbG93ZWQgc2NhbiByZXRyaWVzCi0JcEFkLT5TdGFDZmcuU2NhbkNudCA9IDA7Ci0JTmRpc0dldFN5c3RlbVVwVGltZSgmcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lKTsKLQotCU1sbWVFbnF1ZXVlKHBBZCwKLQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCi0JCU9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLAotCQlTc2lkLlNzaWRMZW5ndGgsCi0JCVNzaWQuU3NpZCk7Ci0KLQlSVE1QX01MTUVfSEFORExFUihwQWQpOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1NpdGVTdXJ2ZXlfUHJvY1xuIikpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVCBTZXRfRm9yY2VUeEJ1cnN0X1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4gIFBTVFJJTkcgICAgICAgICBhcmcpCi17Ci0gICAgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKLSAgICAgICAgcEFkLT5TdGFDZmcuYkZvcmNlVHhCdXJzdCA9IEZBTFNFOwotICAgIGVsc2UKLSAgICAgICAgcEFkLT5TdGFDZmcuYkZvcmNlVHhCdXJzdCA9IFRSVUU7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfRm9yY2VUeEJ1cnN0X1Byb2M6OihiRm9yY2VUeEJ1cnN0PSVkKVxuIiwgcEFkLT5TdGFDZmcuYkZvcmNlVHhCdXJzdCkpOwotCXJldHVybiBUUlVFOwotfQotCi0jaWZkZWYgQU5UX0RJVkVSU0lUWV9TVVBQT1JUCi1JTlQJU2V0X0FudGVubmFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0gICAgVUNIQVIgVXNlZEFudDsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gU2V0X0FudGVubmFfUHJvYyAqKioqKioqKioqKioqKioqKioqXG4iKSk7Ci0KLSAgICBpZihzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApIDw9IDMpCi0gICAgICAgIFVzZWRBbnQgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0gICAgcEFkLT5Db21tb25DZmcuYlJ4QW50RGl2ZXJzaXR5ID0gVXNlZEFudDsgLy8gQXV0byBzd2l0Y2gKLSAgICBpZiAoVXNlZEFudCA9PSBBTlRfRElWRVJTSVRZX0VOQUJMRSkKLSAgICB7Ci0gICAgICAgICAgICBwQWQtPlJ4QW50LkV2YWx1YXRlU3RhYmxlQ250ID0gMDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBTZXRfQW50ZW5uYV9Qcm9jKEF1dG8gU3dpdGNoIE1vZGUpLCAoJWQsJWQpXG4iLCBwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50LCBwQWQtPlJ4QW50LlBhaXIxU2Vjb25kYXJ5UnhBbnQpKTsKLSAgICB9Ci0gICAgLyogMjogRml4IGluIHRoZSBQSFkgQW50ZW5uYSBDT04xKi8KLSAgICBpZiAoVXNlZEFudCA9PSBBTlRfRklYX0FOVDEpCi0gICAgewotICAgICAgICAgICAgQXNpY1NldFJ4QW50KHBBZCwgMCk7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gU2V0X0FudGVubmFfUHJvYyhGaXggaW4gQW50IENPTjEpLCAoJWQsJWQpXG4iLCBwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50LCBwQWQtPlJ4QW50LlBhaXIxU2Vjb25kYXJ5UnhBbnQpKTsKLSAgICB9Ci0gICAgLyogMzogRml4IGluIHRoZSBQSFkgQW50ZW5uYSBDT04yKi8KLSAgICBpZiAoVXNlZEFudCA9PSBBTlRfRklYX0FOVDIpCi0gICAgewotICAgICAgICAgICAgQXNpY1NldFJ4QW50KHBBZCwgMSk7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gU2V0X0FudGVubmFfUHJvYyhGaXggaW4gQW50IENPTjIpLCAoJWQsJWQpXG4iLCBwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50LCBwQWQtPlJ4QW50LlBhaXIxU2Vjb25kYXJ5UnhBbnQpKTsKLSAgICB9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLSNlbmRpZiAvLyBBTlRfRElWRVJTSVRZX1NVUFBPUlQgLy8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3ZyX2lrYW5zLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3ZyX2lrYW5zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YmZmM2IuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC92cl9pa2Fucy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLQl2cl9pa2Fucy5oCi0KLSAgICBBYnN0cmFjdDoKLSAgICBIYW5kbGUgYXNzb2NpYXRpb24gcmVsYXRlZCByZXF1ZXN0cyBlaXRoZXIgZnJvbSBXU1RBIG9yIGZyb20gbG9jYWwgTUxNRQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIFNhbXBsZSBMaW4JMDEtMjgtMjAwOCAgICBDcmVhdGVkCi0gKi8KLQotI2lmbmRlZiBfX1ZSX0lLQU5TX0hfXwotI2RlZmluZSBfX1ZSX0lLQU5TX0hfXwotCi0jaWZuZGVmIE1PRFVMRV9JS0FOT1MKLSNkZWZpbmUgSUtBTk9TX0VYVEVSTglleHRlcm4KLSNlbHNlCi0jZGVmaW5lIElLQU5PU19FWFRFUk4KLSNlbmRpZiAvLyBNT0RVTEVfSUtBTk9TIC8vCi0KLSNpZmRlZiBJS0FOT1NfVlhfMVgwCi0JdHlwZWRlZiB2b2lkICgqSWthbm9zV2xhblR4Q2JGdW5jUCkodm9pZCAqLCB2b2lkICopOwotCi0Jc3RydWN0IElLQU5PU19UWF9JTkZPCi0JewotCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwotCQlJa2Fub3NXbGFuVHhDYkZ1bmNQICpmcDsKLQl9OwotI2VuZGlmIC8vIElLQU5PU19WWF8xWDAgLy8KLQotCi1JS0FOT1NfRVhURVJOIHZvaWQgVlJfSUtBTk9TX0ZQX0luaXQoVUlOVDggQnNzTnVtLCBVSU5UOCAqcEFwTWFjKTsKLQotSUtBTk9TX0VYVEVSTiBJTlQzMiBJS0FOT1NfRGF0YUZyYW1lc1R4KHN0cnVjdCBza19idWZmICpwU2tiLAotCQkJCQkJCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2KTsKLQotSUtBTk9TX0VYVEVSTiB2b2lkIElLQU5PU19EYXRhRnJhbWVSeChQUlRNUF9BREFQVEVSIHBBZCwKLQkJCQkJCQkJCQl2b2lkICpwUnhQYXJhbSwKLQkJCQkJCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqcFNrYiwKLQkJCQkJCQkJCQlVSU5UMzIgTGVuZ3RoKTsKLQotI2VuZGlmIC8vIF9fVlJfSUtBTlNfSF9fIC8vCi0KLS8qIEVuZCBvZiB2cl9pa2Fucy5oICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3dwYS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC93cGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJhYTI4Ny4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3dwYS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQ3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0Jd3BhLmgKLQotCUFic3RyYWN0OgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCQlXaGVuCQkJV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKLSovCi0KLSNpZm5kZWYJX19XUEFfSF9fCi0jZGVmaW5lCV9fV1BBX0hfXwotCi0vLyBFQVBPTCBLZXkgZGVzY3JpcHRlciBmcmFtZSBmb3JtYXQgcmVsYXRlZCBsZW5ndGgKLSNkZWZpbmUgTEVOX0tFWV9ERVNDX05PTkNFCQkJMzIKLSNkZWZpbmUgTEVOX0tFWV9ERVNDX0lWCQkJCTE2Ci0jZGVmaW5lIExFTl9LRVlfREVTQ19SU0MJCQk4Ci0jZGVmaW5lIExFTl9LRVlfREVTQ19JRAkJCQk4Ci0jZGVmaW5lIExFTl9LRVlfREVTQ19SRVBMQVkJCQk4Ci0jZGVmaW5lIExFTl9LRVlfREVTQ19NSUMJCQkxNgotCi0vLyBUaGUgbGVuZ3RoIGlzIHRoZSBFQVBvTC1LZXkgZnJhbWUgZXhjZXB0IGtleSBkYXRhIGZpZWxkLgotLy8gUGxlYXNlIHJlZmVyIHRvIDgwMi4xMWktMjAwNCAsRmlndXJlIDQzdSBpbiBwLjc4Ci0jZGVmaW5lIExFTl9FQVBPTF9LRVlfTVNHCQkJKHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFKQotCi0vLyBFQVAgQ29kZSBUeXBlLgotI2RlZmluZSBFQVBfQ09ERV9SRVFVRVNUCTEKLSNkZWZpbmUgRUFQX0NPREVfUkVTUE9OU0UJMgotI2RlZmluZSBFQVBfQ09ERV9TVUNDRVNTICAgIDMKLSNkZWZpbmUgRUFQX0NPREVfRkFJTFVSRSAgICA0Ci0KLS8vIEVBUE9MIGZyYW1lIFByb3RvY29sIFZlcnNpb24KLSNkZWZpbmUJRUFQT0xfVkVSCQkJCQkxCi0jZGVmaW5lCUVBUE9MX1ZFUjIJCQkJCTIKLQotLy8gRUFQT0wtS0VZIERlc2NyaXB0b3IgVHlwZQotI2RlZmluZQlXUEExX0tFWV9ERVNDCQkJCTB4ZmUKLSNkZWZpbmUgV1BBMl9LRVlfREVTQyAgICAgICAgICAgICAgIDB4MDIKLQotLy8gS2V5IERlc2NyaXB0b3IgVmVyc2lvbiBvZiBLZXkgSW5mb3JtYXRpb24KLSNkZWZpbmUJREVTQ19UWVBFX1RLSVAJCQkJMQotI2RlZmluZQlERVNDX1RZUEVfQUVTCQkJCTIKLQotI2RlZmluZSBMRU5fTVNHMV8yV0FZICAgICAgICAgICAgICAgMHg3ZgotI2RlZmluZSBNQVhfTEVOX09GX0VBUF9IUyAgICAgICAgICAgMjU2Ci0KLSNkZWZpbmUgTEVOX01BU1RFUl9LRVkJCQkJMzIKLQotLy8gRUFQT0wgRUssIE1LCi0jZGVmaW5lIExFTl9FQVBfRUsJCQkJCTE2Ci0jZGVmaW5lIExFTl9FQVBfTUlDSwkJCQkxNgotI2RlZmluZSBMRU5fRUFQX0tFWQkJCQkJKChMRU5fRUFQX0VLKSsoTEVOX0VBUF9NSUNLKSkKLS8vIFRLSVAga2V5IHJlbGF0ZWQKLSNkZWZpbmUgTEVOX1BNS0lECQkJCQkxNgotI2RlZmluZSBMRU5fVEtJUF9FSwkJCQkJMTYKLSNkZWZpbmUgTEVOX1RLSVBfUlhNSUNLCQkJCTgKLSNkZWZpbmUgTEVOX1RLSVBfVFhNSUNLCQkJCTgKLSNkZWZpbmUgTEVOX0FFU19FSwkJCQkJMTYKLSNkZWZpbmUgTEVOX0FFU19LRVkJCQkJCUxFTl9BRVNfRUsKLSNkZWZpbmUgTEVOX1RLSVBfS0VZCQkJCSgoTEVOX1RLSVBfRUspKyhMRU5fVEtJUF9SWE1JQ0spKyhMRU5fVEtJUF9UWE1JQ0spKQotI2RlZmluZSBUS0lQX0FQX1RYTUlDS19PRkZTRVQJCSgoTEVOX0VBUF9LRVkpKyhMRU5fVEtJUF9FSykpCi0jZGVmaW5lIFRLSVBfQVBfUlhNSUNLX09GRlNFVAkJKFRLSVBfQVBfVFhNSUNLX09GRlNFVCtMRU5fVEtJUF9UWE1JQ0spCi0jZGVmaW5lIFRLSVBfR1RLX0xFTkdUSAkJCQkoKExFTl9US0lQX0VLKSsoTEVOX1RLSVBfUlhNSUNLKSsoTEVOX1RLSVBfVFhNSUNLKSkKLSNkZWZpbmUgTEVOX1BUSwkJCQkJCSgoTEVOX0VBUF9LRVkpKyhMRU5fVEtJUF9LRVkpKQotI2RlZmluZSBNSU5fTEVOX09GX0dUSwkJCQk1Ci0jZGVmaW5lIExFTl9QTUsJCQkJCQkzMgotI2RlZmluZSBMRU5fUE1LX05BTUUJCQkJMTYKLSNkZWZpbmUgTEVOX05PTkNFCQkJCQkzMgotCi0vLyBSU04gSUUgTGVuZ3RoIGRlZmluaXRpb24KLSNkZWZpbmUgTUFYX0xFTl9PRl9SU05JRQkJMjU1Ci0jZGVmaW5lIE1JTl9MRU5fT0ZfUlNOSUUJCTgKLQotI2RlZmluZSBLRVlfTElGRVRJTUUJCQkJMzYwMAotCi0vL0VBUCBQYWNrZXQgVHlwZQotI2RlZmluZQlFQVBQYWNrZXQJCTAKLSNkZWZpbmUJRUFQT0xTdGFydAkJMQotI2RlZmluZQlFQVBPTExvZ29mZgkJMgotI2RlZmluZQlFQVBPTEtleQkJMwotI2RlZmluZQlFQVBPTEFTRkFsZXJ0CTQKLSNkZWZpbmUJRUFQVHR5cGVNYXgJCTUKLQotI2RlZmluZQlFQVBPTF9NU0dfSU5WQUxJRAkwCi0jZGVmaW5lCUVBUE9MX1BBSVJfTVNHXzEJMQotI2RlZmluZQlFQVBPTF9QQUlSX01TR18yCTIKLSNkZWZpbmUJRUFQT0xfUEFJUl9NU0dfMwkzCi0jZGVmaW5lCUVBUE9MX1BBSVJfTVNHXzQJNAotI2RlZmluZQlFQVBPTF9HUk9VUF9NU0dfMQk1Ci0jZGVmaW5lCUVBUE9MX0dST1VQX01TR18yCTYKLQotI2RlZmluZSBQQUlSV0lTRUtFWQkJCQkJMQotI2RlZmluZSBHUk9VUEtFWQkJCQkJMAotCi0vLyBSZXRyeSB0aW1lciBjb3VudGVyIGluaXRpYWwgdmFsdWUKLSNkZWZpbmUgUEVFUl9NU0cxX1JFVFJZX1RJTUVSX0NUUiAgICAgICAgICAgMAotI2RlZmluZSBQRUVSX01TRzNfUkVUUllfVElNRVJfQ1RSICAgICAgICAgICAxMAotI2RlZmluZSBHUk9VUF9NU0cxX1JFVFJZX1RJTUVSX0NUUiAgICAgICAgICAyMAotCi0vLyBXUEEgbWVjaGFuaXNtIHJldHJ5IHRpbWVyIGludGVydmFsCi0jZGVmaW5lIFBFRVJfTVNHMV9SRVRSWV9FWEVDX0lOVFYgICAgICAgICAgIDEwMDAJCQkvLyAxIHNlYwotI2RlZmluZSBQRUVSX01TRzNfUkVUUllfRVhFQ19JTlRWICAgICAgICAgICAzMDAwCQkJLy8gMyBzZWMKLSNkZWZpbmUgR1JPVVBfS0VZX1VQREFURV9FWEVDX0lOVFYgICAgICAgICAgMTAwMAkJCQkvLyAxIHNlYwotI2RlZmluZSBQRUVSX0dST1VQX0tFWV9VUERBVEVfSU5JVgkJCTIwMDAJCQkJLy8gMiBzZWMKLQotI2RlZmluZSBFTlFVRVVFX0VBUE9MX1NUQVJUX1RJTUVSCQkJMjAwCQkJCQkvLyAyMDAgbXMKLQotLy8gZ3JvdXAgcmVrZXkgaW50ZXJ2YWwKLSNkZWZpbmUgVElNRV9SRUtFWSAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBQS1RfUkVLRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIERJU0FCTEVfUkVLRVkgICAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTUFYX1JFS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgMgotCi0jZGVmaW5lIE1BWF9SRUtFWV9JTlRFUiAgICAgICAgICAgICAgICAgICAgIDB4M2ZmZmZmZgotCi0jZGVmaW5lIEdST1VQX1NVSVRFCQkJCQkwCi0jZGVmaW5lIFBBSVJXSVNFX1NVSVRFCQkJCTEKLSNkZWZpbmUgQUtNX1NVSVRFCQkJCQkyCi0jZGVmaW5lIFBNS0lEX0xJU1QJCQkJCTMKLQotCi0jZGVmaW5lIEVBUE9MX1NUQVJUX0RJU0FCTEUJCQkJCTAKLSNkZWZpbmUgRUFQT0xfU1RBUlRfUFNLCQkJCQkJMQotI2RlZmluZSBFQVBPTF9TVEFSVF8xWAkJCQkJCTIKLQotI2RlZmluZSBNSVhfQ0lQSEVSX1dQQV9US0lQX09OKHgpICAgICAgICgoKHgpICYgMHgwOCkgIT0gMCkKLSNkZWZpbmUgTUlYX0NJUEhFUl9XUEFfQUVTX09OKHgpICAgICAgICAoKCh4KSAmIDB4MDQpICE9IDApCi0jZGVmaW5lIE1JWF9DSVBIRVJfV1BBMl9US0lQX09OKHgpICAgICAgKCgoeCkgJiAweDAyKSAhPSAwKQotI2RlZmluZSBNSVhfQ0lQSEVSX1dQQTJfQUVTX09OKHgpICAgICAgICgoKHgpICYgMHgwMSkgIT0gMCkKLQotI2lmbmRlZiBST1VORF9VUAotI2RlZmluZSBST1VORF9VUChfX3gsIF9feSkgXAotCSgoKFVMT05HKSgoX194KSsoKF9feSktMSkpKSAmICgoVUxPTkcpfigoX195KS0xKSkpCi0jZW5kaWYKLQotI2RlZmluZQlTRVRfVUlOVDE2X1RPX0FSUkFSWShfViwgX0xFTikJCVwKLXsJCQkJCQkJCQkJCVwKLQlfVlswXSA9IChfTEVOICYgMHhGRjAwKSA+PiA4OwkJCVwKLQlfVlsxXSA9IChfTEVOICYgMHhGRik7CQkJCQlcCi19Ci0KLSNkZWZpbmUJSU5DX1VJTlQxNl9UT19BUlJBUlkoX1YsIF9MRU4pCQkJXAotewkJCQkJCQkJCQkJCVwKLQlVSU5UMTYJdmFyX2xlbjsJCQkJCQkJXAotCQkJCQkJCQkJCQkJXAotCXZhcl9sZW4gPSAoX1ZbMF08PDgpIHwgKF9WWzFdKTsJCQkJXAotCXZhcl9sZW4gKz0gX0xFTjsJCQkJCQkJXAotCQkJCQkJCQkJCQkJXAotCV9WWzBdID0gKHZhcl9sZW4gJiAweEZGMDApID4+IDg7CQkJXAotCV9WWzFdID0gKHZhcl9sZW4gJiAweEZGKTsJCQkJCVwKLX0KLQotI2RlZmluZQlDT05WX0FSUkFSWV9UT19VSU5UMTYoX1YpCSgoX1ZbMF08PDgpIHwgKF9WWzFdKSkKLQotCi0jZGVmaW5lCUFERF9PTkVfVG9fNjRCSVRfVkFSKF9WKQkJXAotewkJCQkJCQkJCQlcCi0JVUNIQVIJY250ID0gTEVOX0tFWV9ERVNDX1JFUExBWTsJXAotCWRvCQkJCQkJCQkJXAotCXsJCQkJCQkJCQlcCi0JCWNudC0tOwkJCQkJCQlcCi0JCV9WW2NudF0rKzsJCQkJCQlcCi0JCWlmIChjbnQgPT0gMCkJCQkJCVwKLQkJCWJyZWFrOwkJCQkJCVwKLQl9d2hpbGUgKF9WW2NudF0gPT0gMCk7CQkJCVwKLX0KLQotI2RlZmluZSBJU19XUEFfQ0FQQUJJTElUWShhKSAgICAgICAoKChhKSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpICYmICgoYSkgPD0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0spKQotCi0vLyBFQVBPTCBLZXkgSW5mb3JtYXRpb24gZGVmaW5pdGlvbiB3aXRoaW4gS2V5IGRlc2NyaXB0b3IgZm9ybWF0Ci10eXBlZGVmCXN0cnVjdCBQQUNLRUQgX0tFWV9JTkZPCi17Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCVVDSEFSCUtleUFjazoxOwotICAgIFVDSEFSCUluc3RhbGw6MTsKLSAgICBVQ0hBUglLZXlJbmRleDoyOwotICAgIFVDSEFSCUtleVR5cGU6MTsKLSAgICBVQ0hBUglLZXlEZXNjVmVyOjM7Ci0gICAgVUNIQVIJUnN2ZDozOwotICAgIFVDSEFSCUVLRF9ETDoxOwkJLy8gRUtEIGZvciBBUDsgREwgZm9yIFNUQQotICAgIFVDSEFSCVJlcXVlc3Q6MTsKLSAgICBVQ0hBUglFcnJvcjoxOwotICAgIFVDSEFSCVNlY3VyZToxOwotICAgIFVDSEFSCUtleU1pYzoxOwotI2Vsc2UKLQlVQ0hBUglLZXlNaWM6MTsKLQlVQ0hBUglTZWN1cmU6MTsKLQlVQ0hBUglFcnJvcjoxOwotCVVDSEFSCVJlcXVlc3Q6MTsKLQlVQ0hBUglFS0RfREw6MTsgICAgICAgLy8gRUtEIGZvciBBUDsgREwgZm9yIFNUQQotCVVDSEFSCVJzdmQ6MzsKLQlVQ0hBUglLZXlEZXNjVmVyOjM7Ci0JVUNIQVIJS2V5VHlwZToxOwotCVVDSEFSCUtleUluZGV4OjI7Ci0JVUNIQVIJSW5zdGFsbDoxOwotCVVDSEFSCUtleUFjazoxOwotI2VuZGlmCi19CUtFWV9JTkZPLCAqUEtFWV9JTkZPOwotCi0vLyBFQVBPTCBLZXkgZGVzY3JpcHRvciBmb3JtYXQKLXR5cGVkZWYJc3RydWN0IFBBQ0tFRCBfS0VZX0RFU0NSSVBURVIKLXsKLQlVQ0hBUgkJVHlwZTsKLQlLRVlfSU5GTwlLZXlJbmZvOwotCVVDSEFSCQlLZXlMZW5ndGhbMl07Ci0JVUNIQVIJCVJlcGxheUNvdW50ZXJbTEVOX0tFWV9ERVNDX1JFUExBWV07Ci0JVUNIQVIJCUtleU5vbmNlW0xFTl9LRVlfREVTQ19OT05DRV07Ci0JVUNIQVIJCUtleUl2W0xFTl9LRVlfREVTQ19JVl07Ci0JVUNIQVIJCUtleVJzY1tMRU5fS0VZX0RFU0NfUlNDXTsKLQlVQ0hBUgkJS2V5SWRbTEVOX0tFWV9ERVNDX0lEXTsKLQlVQ0hBUgkJS2V5TWljW0xFTl9LRVlfREVTQ19NSUNdOwotCVVDSEFSCQlLZXlEYXRhTGVuWzJdOwotCVVDSEFSCQlLZXlEYXRhW01BWF9MRU5fT0ZfUlNOSUVdOwotfQlLRVlfREVTQ1JJUFRFUiwgKlBLRVlfREVTQ1JJUFRFUjsKLQotdHlwZWRlZglzdHJ1Y3QgUEFDS0VEIF9FQVBPTF9QQUNLRVQKLXsKLQlVQ0hBUgkJCQlQcm9WZXI7Ci0JVUNIQVIJCQkJUHJvVHlwZTsKLQlVQ0hBUgkJCQlCb2R5X0xlblsyXTsKLQlLRVlfREVTQ1JJUFRFUgkJS2V5RGVzYzsKLX0JRUFQT0xfUEFDS0VULCAqUEVBUE9MX1BBQ0tFVDsKLQotLy84MDIuMTFpIEQxMCBwYWdlIDgzCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0dUS19FTkNBUAotewotI2lmbmRlZiBSVF9CSUdfRU5ESUFOCi0gICAgVUNIQVIgICAgICAgICAgICAgICBLaWQ6MjsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIHR4OjE7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICByc3Y6NTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIHJzdjE7Ci0jZWxzZQotICAgIFVDSEFSICAgICAgICAgICAgICAgcnN2OjU7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICB0eDoxOwotICAgIFVDSEFSICAgICAgICAgICAgICAgS2lkOjI7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICByc3YxOwotI2VuZGlmCi0gICAgVUNIQVIgICAgICAgICAgICAgICBHVEtbVEtJUF9HVEtfTEVOR1RIXTsKLX0gICBHVEtfRU5DQVAsICpQR1RLX0VOQ0FQOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0tERV9FTkNBUAotewotICAgIFVDSEFSICAgICAgICAgICAgICAgVHlwZTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIExlbjsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIE9VSVszXTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIERhdGFUeXBlOwotICAgIEdUS19FTkNBUCAgICAgIEdUS0VuY2FwOwotfSAgIEtERV9FTkNBUCwgKlBLREVfRU5DQVA7Ci0KLS8vIEZvciBXUEExCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JTTklFIHsKLSAgICBVQ0hBUiAgIG91aVs0XTsKLSAgICBVU0hPUlQgIHZlcnNpb247Ci0gICAgVUNIQVIgICBtY2FzdFs0XTsKLSAgICBVU0hPUlQgIHVjb3VudDsKLSAgICBzdHJ1Y3QgUEFDS0VEIHsKLSAgICAgICAgVUNIQVIgb3VpWzRdOwotICAgIH11Y2FzdFsxXTsKLX0gUlNOSUUsICpQUlNOSUU7Ci0KLS8vIEZvciBXUEEyCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JTTklFMiB7Ci0gICAgVVNIT1JUICB2ZXJzaW9uOwotICAgIFVDSEFSICAgbWNhc3RbNF07Ci0gICAgVVNIT1JUICB1Y291bnQ7Ci0gICAgc3RydWN0IFBBQ0tFRCB7Ci0gICAgICAgIFVDSEFSIG91aVs0XTsKLSAgICB9dWNhc3RbMV07Ci19IFJTTklFMiwgKlBSU05JRTI7Ci0KLS8vIEFLTSBTdWl0ZQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SU05JRV9BVVRIIHsKLSAgICBVU0hPUlQgYWNvdW50OwotICAgIHN0cnVjdCBQQUNLRUQgewotICAgICAgICBVQ0hBUiBvdWlbNF07Ci0gICAgfWF1dGhbMV07Ci19IFJTTklFX0FVVEgsKlBSU05JRV9BVVRIOwotCi10eXBlZGVmCXVuaW9uIFBBQ0tFRCBfUlNOX0NBUEFCSUxJVElFUwl7Ci0Jc3RydWN0CVBBQ0tFRCB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotICAgICAgICBVU0hPUlQJCVJzdmQ6MTA7Ci0gICAgICAgIFVTSE9SVAkJR1RLU0FfUl9Db3VudGVyOjI7Ci0gICAgICAgIFVTSE9SVAkJUFRLU0FfUl9Db3VudGVyOjI7Ci0gICAgICAgIFVTSE9SVAkJTm9fUGFpcndpc2U6MTsKLQkJVVNIT1JUCQlQcmVBdXRoOjE7Ci0jZWxzZQotICAgICAgICBVU0hPUlQJCVByZUF1dGg6MTsKLQkJVVNIT1JUCQlOb19QYWlyd2lzZToxOwotCQlVU0hPUlQJCVBUS1NBX1JfQ291bnRlcjoyOwotCQlVU0hPUlQJCUdUS1NBX1JfQ291bnRlcjoyOwotCQlVU0hPUlQJCVJzdmQ6MTA7Ci0jZW5kaWYKLQl9CWZpZWxkOwotCVVTSE9SVAkJCXdvcmQ7Ci19CVJTTl9DQVBBQklMSVRJRVMsICpQUlNOX0NBUEFCSUxJVElFUzsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9FQVBfSERSIHsKLSAgICBVQ0hBUiAgIFByb1ZlcjsKLSAgICBVQ0hBUiAgIFByb1R5cGU7Ci0gICAgVUNIQVIgICBCb2R5X0xlblsyXTsKLSAgICBVQ0hBUiAgIGNvZGU7Ci0gICAgVUNIQVIgICBpZGVudGlmaWVyOwotICAgIFVDSEFSICAgbGVuZ3RoWzJdOyAvLyBpbmNsdWRpbmcgY29kZSBhbmQgaWRlbnRpZmllciwgZm9sbG93ZWQgYnkgbGVuZ3RoLTIgb2N0ZXRzIG9mIGRhdGEKLX0gRUFQX0hEUiwgKlBFQVBfSERSOwotCi0vLyBGb3Igc3VwcGxpY2FudCBzdGF0ZSBtYWNoaW5lIHN0YXRlcy4gODAyLjExaSBEcmFmdCA0LjEsIHAuIDk3Ci0vLyBXZSBzaW1wbGlmaWVkIGl0Ci10eXBlZGVmCWVudW0JX1dwYVN0YXRlCi17Ci0JU1NfTk9UVVNFLAkJCQkvLyAwCi0JU1NfU1RBUlQsCQkJCS8vIDEKLQlTU19XQUlUX01TR18zLAkJCS8vIDIKLQlTU19XQUlUX0dST1VQLAkJCS8vIDMKLQlTU19GSU5JU0gsCQkJLy8gNAotCVNTX0tFWVVQREFURSwJCQkvLyA1Ci19CVdQQV9TVEFURTsKLQotLy8KLS8vCVRoZSBkZWZpbml0aW9uIG9mIHRoZSBjaXBoZXIgY29tYmluYXRpb24KLS8vCi0vLwkgYml0MwliaXQyICBiaXQxICAgYml0MAotLy8JKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCi0vLwl8CSAgV1BBCSB8CSAgIFdQQTIgICB8Ci0vLwkrLS0tLS0tKy0tLS0tKy0tLS0tLSstLS0tLSsKLS8vCXwgVEtJUCB8IEFFUyB8IFRLSVAgfCBBRVMgfAotLy8JfAkwICB8ICAxICB8ICAgMSAgfCAgMCAgfCAtPiAweDA2Ci0vLwl8CTAgIHwgIDEgIHwgICAxICB8ICAxICB8IC0+IDB4MDcKLS8vCXwJMSAgfCAgMCAgfCAgIDAgIHwgIDEgIHwgLT4gMHgwOQotLy8JfAkxICB8ICAwICB8ICAgMSAgfCAgMSAgfCAtPiAweDBCCi0vLwl8CTEgIHwgIDEgIHwgICAwICB8ICAxICB8IC0+IDB4MEQKLS8vCXwJMSAgfCAgMSAgfCAgIDEgIHwgIDAgIHwgLT4gMHgwRQotLy8JfAkxICB8ICAxICB8ICAgMSAgfCAgMSAgfAktPiAweDBGCi0vLwkrLS0tLS0tKy0tLS0tKy0tLS0tLSstLS0tLSsKLS8vCi10eXBlZGVmCWVudW0JX1dwYU1peFBhaXJDaXBoZXIKLXsKLQlNSVhfQ0lQSEVSX05PVFVTRQkJCT0gMHgwMCwKLQlXUEFfTk9ORV9XUEEyX1RLSVBBRVMJCT0gMHgwMywJCS8vIFdQQTItVEtJUEFFUwotCVdQQV9BRVNfV1BBMl9US0lQCQkJPSAweDA2LAotCVdQQV9BRVNfV1BBMl9US0lQQUVTCQk9IDB4MDcsCi0JV1BBX1RLSVBfV1BBMl9BRVMJCQk9IDB4MDksCi0JV1BBX1RLSVBfV1BBMl9US0lQQUVTCQk9IDB4MEIsCi0JV1BBX1RLSVBBRVNfV1BBMl9OT05FCQk9IDB4MEMsCQkvLyBXUEEtVEtJUEFFUwotCVdQQV9US0lQQUVTX1dQQTJfQUVTCQk9IDB4MEQsCi0JV1BBX1RLSVBBRVNfV1BBMl9US0lQCQk9IDB4MEUsCi0JV1BBX1RLSVBBRVNfV1BBMl9US0lQQUVTCT0gMHgwRiwKLX0JV1BBX01JWF9QQUlSX0NJUEhFUjsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SU05fSUVfSEVBREVSX1NUUlVDVAl7Ci0JVUNIQVIJCUVpZDsKLQlVQ0hBUgkJTGVuZ3RoOwotCVVTSE9SVAkJVmVyc2lvbjsJLy8gTGl0dGxlIGVuZGlhbiBmb3JtYXQKLX0JUlNOX0lFX0hFQURFUl9TVFJVQ1QsICpQUlNOX0lFX0hFQURFUl9TVFJVQ1Q7Ci0KLS8vIENpcGhlciBzdWl0ZSBzZWxlY3RvciB0eXBlcwotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9DSVBIRVJfU1VJVEVfU1RSVUNUCXsKLQlVQ0hBUgkJT3VpWzNdOwotCVVDSEFSCQlUeXBlOwotfQlDSVBIRVJfU1VJVEVfU1RSVUNULCAqUENJUEhFUl9TVUlURV9TVFJVQ1Q7Ci0KLS8vIEF1dGhlbnRpY2F0aW9uIGFuZCBLZXkgTWFuYWdlbWVudCBzdWl0ZSBzZWxlY3RvcgotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9BS01fU1VJVEVfU1RSVUNUCXsKLQlVQ0hBUgkJT3VpWzNdOwotCVVDSEFSCQlUeXBlOwotfQlBS01fU1VJVEVfU1RSVUNULCAqUEFLTV9TVUlURV9TVFJVQ1Q7Ci0KLS8vIFJTTiBjYXBhYmlsaXR5Ci10eXBlZGVmIHN0cnVjdAlQQUNLRUQgX1JTTl9DQVBBQklMSVRZCXsKLQlVU0hPUlQJCVJzdjoxMDsKLQlVU0hPUlQJCUdUS1NBUmVwbGF5Q250OjI7Ci0JVVNIT1JUCQlQVEtTQVJlcGxheUNudDoyOwotCVVTSE9SVAkJTm9QYWlyd2lzZToxOwotCVVTSE9SVAkJUHJlQXV0aDoxOwotfQlSU05fQ0FQQUJJTElUWSwgKlBSU05fQ0FQQUJJTElUWTsKLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlUaGUgcHJvdG90eXBlIGlzIGRlZmluZWQgaW4gY21tX3dwYS5jCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotQk9PTEVBTiBXcGFNc2dUeXBlU3Vic3QoCi0JSU4gIFVDSEFSICAgRUFQVHlwZSwKLQlPVVQgSU5UCQkqTXNnVHlwZSk7Ci0KLVZPSUQgICAgUFJGKAotCUlOICBVQ0hBUiAgICprZXksCi0JSU4gIElOVCAgICAga2V5X2xlbiwKLQlJTiAgVUNIQVIgICAqcHJlZml4LAotCUlOICBJTlQgICAgIHByZWZpeF9sZW4sCi0JSU4gIFVDSEFSICAgKmRhdGEsCi0JSU4gIElOVCAgICAgZGF0YV9sZW4sCi0JT1VUIFVDSEFSICAgKm91dHB1dCwKLQlJTiAgSU5UICAgICBsZW4pOwotCi1pbnQgUGFzc3dvcmRIYXNoKAotCWNoYXIgKnBhc3N3b3JkLAotCXVuc2lnbmVkIGNoYXIgKnNzaWQsCi0JaW50IHNzaWRsZW5ndGgsCi0JdW5zaWduZWQgY2hhciAqb3V0cHV0KTsKLQotUFVJTlQ4CUdldFN1aXRlRnJvbVJTTklFKAotCQlJTglQVUlOVDgJcnNuaWUsCi0JCUlOCVVJTlQJcnNuaWVfbGVuLAotCQlJTglVSU5UOAl0eXBlLAotCQlPVVQJVUlOVDgJKmNvdW50KTsKLQotVk9JRCBXcGFTaG93QWxsc3VpdGUoCi0JSU4JUFVJTlQ4CXJzbmllLAotCUlOCVVJTlQJcnNuaWVfbGVuKTsKLQotVk9JRCBSVE1QSW5zZXJ0UlNOSUUoCi0JSU4gUFVDSEFSIHBGcmFtZUJ1ZiwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbiwKLQlJTiBQVUlOVDggcnNuaWVfcHRyLAotCUlOIFVJTlQ4ICByc25pZV9sZW4sCi0JSU4gUFVJTlQ4IHBta2lkX3B0ciwKLQlJTiBVSU5UOCAgcG1raWRfbGVuKTsKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvS2NvbmZpZwppbmRleCAzMjExZGQzLi5lMjRhNmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9LY29uZmlnCkBAIC0xLDcgKzEsOCBAQAotY29uZmlnIFJUTDgxODdTRQorY29uZmlnIFI4MTg3U0UKIAl0cmlzdGF0ZSAiUmVhbFRlayBSVEw4MTg3U0UgV2lyZWxlc3MgTEFOIE5JQyBkcml2ZXIiCiAJZGVwZW5kcyBvbiBQQ0kgJiYgV0xBTgogCXNlbGVjdCBXSVJFTEVTU19FWFQKIAlzZWxlY3QgV0VYVF9QUklWCiAJZGVmYXVsdCBOCiAJLS0taGVscC0tLQorCSAgSWYgYnVpbHQgYXMgYSBtb2R1bGUsIGl0IHdpbGwgYmUgY2FsbGVkIHI4MTg3c2Uua28uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9NYWtlZmlsZQppbmRleCBhYzM1Y2ZmLi5iMzk1YWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvTWFrZWZpbGUKQEAgLTE2LDcgKzE2LDcgQEAKIAogI0VYVFJBX0NGTEFHUyArPSAtbWhhcmQtZmxvYXQgLURDT05GSUdfRk9SQ0VfSEFSRF9GTE9BVD15CiAKLXJ0bDgxODdzZS1vYmpzIDo9CQkJXAorcjgxODdzZS1vYmpzIDo9CQkJXAogCQlyODE4MF9jb3JlLm8JCVwKIAkJcjgxODBfOTNjeDYubwkJXAogCQlyODE4MF93eC5vCQlcCkBAIC0zNSw1ICszNSw1IEBACiAJCWllZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfY2NtcC5vCVwKIAkJaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAubwogCi1vYmotJChDT05GSUdfUlRMODE4N1NFKQkrPSBydGw4MTg3c2Uubworb2JqLSQoQ09ORklHX1I4MTg3U0UpCSs9IHI4MTg3c2UubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfcnguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCmluZGV4IDVlMmU3OWIxLi5mODgyZGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfcnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwpAQCAtMzcsNyArMzcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCmluZGV4IDMzNGU0YzcuLjFmZTE5YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwpAQCAtMTgzNyw3ICsxODM3LDcgQEAKIAogCQkJCQkgCSAgICAgICAgICAgIGlmICgoKGllZWUtPmN1cnJlbnRfbmV0d29yay53bW1faW5mb15pbmZvX2VsZW1lbnQtPmRhdGFbNl0pJiBcCiAJCQkJCQkJCQkJICAgIDB4MGYpfHwoIWllZWUtPmluaXRfd21tcGFyYW1fZmxhZykpIHsKLQkJCQkJCSAgIAkgICAgICAvL3JlZnJlc2ggcGFyYW1ldGUgZWxlbWVudCBmb3IgY3VycmVudCBuZXR3b3JrCisJCQkJCQkgICAJICAgICAgLy8gcmVmcmVzaCBwYXJhbWV0ZXIgZWxlbWVudCBmb3IgY3VycmVudCBuZXR3b3JrCiAJCQkJCQkJICAgICAgLy8gdXBkYXRlIHRoZSByZWdpc3RlciBwYXJhbWV0ZXIgZm9yIGhhcmR3YXJlCiAJCQkJCQkJICAgICAgaWVlZS0+aW5pdF93bW1wYXJhbV9mbGFnID0gMTsKIAkJCQkJCQkgICAgICBxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+d21tX3BhcmFtX3VwZGF0ZV93cSk7CkBAIC0xOTU4LDEwICsxOTU4LDEwIEBACiAgKiBjYXJlIG9mIHRoZSBpZWVlODAyLjExIGZyYWdtZW50YXRpb24uCiAgKiBTbyB0aGUgZHJpdmVyIHJlY2VpdmVzIGEgZnJhZ21lbnQgcGVyIHRpbWUgYW5kIG1pZ2h0CiAgKiBjYWxsIHRoZSBzdG9wIGZ1bmN0aW9uIHdoZW4gaXQgd2FudCB3aXRob3V0IHRha2UgY2FyZQotICogdG8gaGF2ZSBlbm91Z2h0IHJvb20gdG8gVFggYW4gZW50aXJlIHBhY2tldC4KKyAqIHRvIGhhdmUgZW5vdWdoIHJvb20gdG8gVFggYW4gZW50aXJlIHBhY2tldC4KICAqIFRoaXMgbWlnaHQgYmUgdXNlZnVsIGlmIGVhY2ggZnJhZ21lbnQgbmVlZCBpdCdzIG93bgogICogZGVzY3JpcHRvciwgdGh1cyBqdXN0IGtlZXAgYSB0b3RhbCBmcmVlIG1lbW9yeSA+IHRoYW4KLSAqIHRoZSBtYXggZnJhZ21lbnRhdGlvbiB0cmVzaG9sZCBpcyBub3QgZW5vdWdodC4uIElmIHRoZQorICogdGhlIG1heCBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCBpcyBub3QgZW5vdWdoLi4gSWYgdGhlCiAgKiBpZWVlODAyLjExIHN0YWNrIHBhc3NlZCBhIFRYQiBzdHJ1Y3QgdGhlbiB5b3UgbmVlZGVkCiAgKiB0byBrZWVwIE4gZnJlZSBkZXNjcmlwdG9ycyB3aGVyZQogICogTiA9IE1BWF9QQUNLRVRfU0laRSAvIE1JTl9GUkFHX1RSRVNIT0xECmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfdHguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCmluZGV4IGUyOTQ1ZGIuLmRkZTFmMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCkBAIC00Nyw3ICs0Nyw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfd3guYwppbmRleCBhMDhiOTdhLi42YWFkNDhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfd3guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfd3guYwpAQCAtMzAsNyArMzAsNiBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgva21vZC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwLmgKaW5kZXggMzVlZDYwYi4uY2U4Mjg4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODAuaApAQCAtNzcsMjEgKzc3LDYgQEAKIAlXSVJFTEVTU19NT0RFX0FVVE8gPSAweDA4LAogfSBXSVJFTEVTU19NT0RFOwogCi10eXBlZGVmIGVudW0gX1ZFUlNJT05fODE4NXsKLQkvLyBSVEw4MTg1Ci0JVkVSU0lPTl84MTg1X1VOS05PV04sCi0JVkVSU0lPTl84MTg1X0MsIC8vIEMtY3V0Ci0JVkVSU0lPTl84MTg1X0QsIC8vIEQtY3V0Ci0JLy8gUlRMODE4NUIKLQlWRVJTSU9OXzgxODVCX0IsIC8vIEItY3V0Ci0JVkVSU0lPTl84MTg1Ql9ELCAvLyBELWN1dAotCVZFUlNJT05fODE4NUJfRSwgLy8gRS1jdXQKLQkvL1JUTDgxODdTLVBDSUUKLQlWRVJTSU9OXzgxODdTX0IsIC8vIEItY3V0Ci0JVkVSU0lPTl84MTg3U19DLCAvLyBDLWN1dAotCVZFUlNJT05fODE4N1NfRCwgLy8gRC1jdXQKLQotfVZFUlNJT05fODE4NSwqUFZFUlNJT05fODE4NTsKIHR5cGVkZWYgc3RydWN0IAlDaG5sQWNjZXNzU2V0dGluZyB7CiAJdTE2IFNJRlNfVGltZXI7CiAJdTE2IERJRlNfVGltZXI7CkBAIC0zNDEsMTEgKzMyNiw4IEBACiAJaW50IGlycTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZTgwMjExOwogCi0gICAgICAgIHNob3J0IGNhcmRfODE4NTsgLyogTzogcnRsODE4MCwgMTpydGw4MTg1IFYgQi9DLCAyOnJ0bDgxODUgViBELCAzOnJ0bDgxODVCICovCi0Jc2hvcnQgY2FyZF84MTg1X0J2ZXJzaW9uOyAvKiBpZiBUQ1IgcmVwb3J0cyBjYXJkIFYgQi9DIHRoaXMgZGlzY3JpbWluYXRlcyAqLwogCXNob3J0IHBoeV92ZXI7IC8qIG1lYW5pbmdmdWwgZm9yIHJ0bDgyMjUgMTpBIDI6QiAzOkMgKi8KIAlzaG9ydCBlbmFibGVfZ3BpbzA7Ci0JZW51bSBjYXJkX3R5cGUge1BDSSxNSU5JUENJLENBUkRCVVMsVVNCLypydGw4MTg3Ki99Y2FyZF90eXBlOwogCXNob3J0IGh3X3BsY3BfbGVuOwogCXNob3J0IHBsY3BfcHJlYW1ibGVfbW9kZTsgLy8gMDphdXRvIDE6c2hvcnQgMjpsb25nCiAKQEAgLTU5OSw3ICs1ODEsNyBAQAogCXU4CQkJCQkJUlNTSTsKIAljaGFyCQkJCQlSeFBvd2VyOwogCSB1OCBJbml0aWFsR2FpbjsKLQkgLy9Gb3IgYWRqdXN0IERpZyBUaHJlc2hob2xkIGR1cmluZyBMZWdhY3kvTGVpc3VyZSBQb3dlciBTYXZlIE1vZGUKKwkgLy9Gb3IgYWRqdXN0IERpZyBUaHJlc2hvbGQgZHVyaW5nIExlZ2FjeS9MZWlzdXJlIFBvd2VyIFNhdmUgTW9kZQogCXUzMgkJCQlEb3plUGVyaW9kSW5QYXN0MlNlYzsKIAkgLy8gRG9uJ3QgYWNjZXNzIEJCL1JGIHVuZGVyIGRpc2FibGUgUExMIHNpdHVhdGlvbi4KIAl1OAkJCQkJSW5pdGlhbEdhaW5CYWNrVXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfY29yZS5jCmluZGV4IDUzZTY1NGQuLjU3YzYyYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfY29yZS5jCkBAIC04ODYsOCArODg2LDYgQEAKIAkJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9BTExNQUNfRlJBTUVfU0hJRlQpOwogCX1lbHNlewogCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX05JQ01BQ19GUkFNRV9TSElGVCk7Ci0JCWlmKHByaXYtPmNhcmRfODE4NSA9PSAwKQotCQkJcnhjb25mID0gcnhjb25mIHwgKDE8PFJYX0NIRUNLX0JTU0lEX1NISUZUKTsKIAl9CiAKIAlpZihwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKXsKQEAgLTkxMCw5ICs5MDgsNiBAQAogCiAJcnhjb25mID0gcnhjb25mICZ+IFJDUl9DU19NQVNLOwogCi0JaWYgKCFwcml2LT5jYXJkXzgxODUpCi0JCXJ4Y29uZiB8PSAocHJpdi0+cmNyX2NzZW5zZTw8UkNSX0NTX1NISUZUKTsKLQogCXdyaXRlX25pY19kd29yZChkZXYsIFJYX0NPTkYsIHJ4Y29uZik7CiAKIAlmaXhfcnhfZmlmbyhkZXYpOwpAQCAtOTY0LDI4ICs5NTksMTkgQEAKIAogCXR4Y29uZiA9IHJlYWRfbmljX2R3b3JkKGRldiwgVFhfQ09ORik7CiAKLQlpZiAocHJpdi0+Y2FyZF84MTg1KSB7Ci0JCWJ5dGUgPSByZWFkX25pY19ieXRlKGRldixDV19DT05GKTsKLQkJYnl0ZSAmPSB+KDE8PENXX0NPTkZfUEVSUEFDS0VUX0NXX1NISUZUKTsKLQkJYnl0ZSAmPSB+KDE8PENXX0NPTkZfUEVSUEFDS0VUX1JFVFJZX1NISUZUKTsKLQkJd3JpdGVfbmljX2J5dGUoZGV2LCBDV19DT05GLCBieXRlKTsKKwlieXRlID0gcmVhZF9uaWNfYnl0ZShkZXYsIENXX0NPTkYpOworCWJ5dGUgJj0gfigxPDxDV19DT05GX1BFUlBBQ0tFVF9DV19TSElGVCk7CisJYnl0ZSAmPSB+KDE8PENXX0NPTkZfUEVSUEFDS0VUX1JFVFJZX1NISUZUKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENXX0NPTkYsIGJ5dGUpOwogCi0JCXR4X2FnY19jdGwgPSByZWFkX25pY19ieXRlKGRldiwgVFhfQUdDX0NUTCk7Ci0JCXR4X2FnY19jdGwgJj0gfigxPDxUWF9BR0NfQ1RMX1BFUlBBQ0tFVF9HQUlOX1NISUZUKTsKLQkJdHhfYWdjX2N0bCAmPSB+KDE8PFRYX0FHQ19DVExfUEVSUEFDS0VUX0FOVFNFTF9TSElGVCk7Ci0JCXR4X2FnY19jdGwgfD0oMTw8VFhfQUdDX0NUTF9GRUVEQkFDS19BTlQpOwotCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFRYX0FHQ19DVEwsIHR4X2FnY19jdGwpOwotCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4ZWMsIDB4M2YpOyAvKiBEaXNhYmxlIGVhcmx5IFRYICovCi0JfQorCXR4X2FnY19jdGwgPSByZWFkX25pY19ieXRlKGRldiwgVFhfQUdDX0NUTCk7CisJdHhfYWdjX2N0bCAmPSB+KDE8PFRYX0FHQ19DVExfUEVSUEFDS0VUX0dBSU5fU0hJRlQpOworCXR4X2FnY19jdGwgJj0gfigxPDxUWF9BR0NfQ1RMX1BFUlBBQ0tFVF9BTlRTRUxfU0hJRlQpOworCXR4X2FnY19jdGwgfD0gKDE8PFRYX0FHQ19DVExfRkVFREJBQ0tfQU5UKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFRYX0FHQ19DVEwsIHR4X2FnY19jdGwpOworCXdyaXRlX25pY19ieXRlKGRldiwgMHhlYywgMHgzZik7IC8qIERpc2FibGUgZWFybHkgVFggKi8KIAotCWlmIChwcml2LT5jYXJkXzgxODUpCi0JCXR4Y29uZiA9IHR4Y29uZiAmfiAoMTw8VENSX1BST0JFX05PVElNRVNUQU1QX1NISUZUKTsKLQllbHNlIHsKLQkJaWYoaHdzZXFudW0pCi0JCQl0eGNvbmY9IHR4Y29uZiAmfiAoMTw8VFhfQ09ORl9IRUFERVJfQVVUT0lDUkVNRU5UX1NISUZUKTsKLQkJZWxzZQotCQkJdHhjb25mPSB0eGNvbmYgfCAoMTw8VFhfQ09ORl9IRUFERVJfQVVUT0lDUkVNRU5UX1NISUZUKTsKLQl9CisJdHhjb25mID0gdHhjb25mICYgfigxPDxUQ1JfUFJPQkVfTk9USU1FU1RBTVBfU0hJRlQpOwogCiAJdHhjb25mID0gdHhjb25mICZ+IFRYX0xPT1BCQUNLX01BU0s7CiAJdHhjb25mID0gdHhjb25mIHwgKFRYX0xPT1BCQUNLX05PTkUgPDxUWF9MT09QQkFDS19TSElGVCk7CkBAIC05OTUsMTMgKzk4MSwxMCBAQAogCXR4Y29uZiA9IHR4Y29uZiB8IChwcml2LT5yZXRyeV9ydHM8PFRYX1JUU1JFVFJZX1NISUZUKTsKIAl0eGNvbmYgPSB0eGNvbmYgJn4gKDE8PFRYX05PQ1JDX1NISUZUKTsKIAotCWlmIChwcml2LT5jYXJkXzgxODUpIHsKLQkJaWYgKHByaXYtPmh3X3BsY3BfbGVuKQotCQkJdHhjb25mID0gdHhjb25mICZ+IFRDUl9QTENQX0xFTjsKLQkJZWxzZQotCQkJdHhjb25mID0gdHhjb25mIHwgVENSX1BMQ1BfTEVOOwotCX0gZWxzZQotCQl0eGNvbmYgPSB0eGNvbmYgJn4gVENSX1NBVDsKKwlpZiAocHJpdi0+aHdfcGxjcF9sZW4pCisJCXR4Y29uZiA9IHR4Y29uZiAmIH5UQ1JfUExDUF9MRU47CisJZWxzZQorCQl0eGNvbmYgPSB0eGNvbmYgfCBUQ1JfUExDUF9MRU47CiAKIAl0eGNvbmYgPSB0eGNvbmYgJn4gVENSX01YRE1BX01BU0s7CiAJdHhjb25mID0gdHhjb25mIHwgKFRDUl9NWERNQV8yMDQ4PDxUQ1JfTVhETUFfU0hJRlQpOwpAQCAtMTcyMCw4ICsxNzAzLDYgQEAKIAkJZWxzZQogCQkJcXVhbGl0eSA9IDEyNyAtIHF1YWxpdHk7CiAJCXByaXYtPlNpZ25hbFF1YWxpdHkgPSBxdWFsaXR5OwotCQlpZighcHJpdi0+Y2FyZF84MTg1KQotCQkJcHJpbnRrKCJjaGVjayB5b3VyIGNhcmQgdHlwZVxuIik7CiAKIAkJc3RhdHMuc2lnbmFsID0gKHU4KXF1YWxpdHk7Ly9wcml2LT53c3RhdHMucXVhbC5sZXZlbCA9IHByaXYtPlNpZ25hbFN0cmVuZ3RoOwogCQlzdGF0cy5zaWduYWxzdHJlbmd0aCA9IFJYQUdDOwpAQCAtMTg0OCw3ICsxODI5LDcgQEAKIAkJCQkgICAgc2l6ZW9mKHU4KSwKIAkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKIAotZHJvcDogLy8gdGhpcyBpcyB1c2VkIHdoZW4gd2UgaGF2ZSBub3QgZW5vdWdodCBtZW0KK2Ryb3A6IC8vIHRoaXMgaXMgdXNlZCB3aGVuIHdlIGhhdmUgbm90IGVub3VnaCBtZW0KIAkJLyogcmVzdG9yZSB0aGUgZGVzY3JpcHRvciAqLwogCQkqKHByaXYtPnJ4cmluZ3RhaWwrMik9cHJpdi0+cnhidWZmZXItPmRtYTsKIAkJKihwcml2LT5yeHJpbmd0YWlsKT0qKHByaXYtPnJ4cmluZ3RhaWwpICZ+IDB4ZmZmOwpAQCAtMTkxOSw4ICsxOTAwLDggQEAKIAkvKgogCSogVGhpcyBmdW5jdGlvbiBkb2Vzbid0IHJlcXVpcmUgbG9jayBiZWNhdXNlIHdlIG1ha2UKIAkqIHN1cmUgaXQncyBjYWxsZWQgd2l0aCB0aGUgdHhfbG9jayBhbHJlYWR5IGFjcXVpcmVkLgotCSogdGhpcyBjb21lIGZyb20gdGhlIGtlcm5lbCdzIGhhcmRfeG1pdCBjYWxsYmFjayAodHJvdWdodAotCSogdGhlIGllZWUgc3RhY2ssIG9yIGZyb20gdGhlIHRyeV93YWtlX3F1ZXVlIChhZ2FpbiB0cm91Z2h0CisJKiB0aGlzIGNvbWUgZnJvbSB0aGUga2VybmVsJ3MgaGFyZF94bWl0IGNhbGxiYWNrICh0aHJvdWdoCisJKiB0aGUgaWVlZSBzdGFjaywgb3IgZnJvbSB0aGUgdHJ5X3dha2VfcXVldWUgKGFnYWluIHRocm91Z2gKIAkqIHRoZSBpZWVlIHN0YWNrLgogCSovCiAJcHJpb3JpdHkgPSBBQzJRKHNrYi0+cHJpb3JpdHkpOwpAQCAtMjIyMSwxMCArMjIwMiw4IEBACiAJCSoodGFpbCs2KSA9IDA7CiAJCSoodGFpbCs3KSA9IDA7CiAKLQkJaWYocHJpdi0+Y2FyZF84MTg1KXsKLQkJCS8vRklYTUU6IHRoaXMgc2hvdWxkIGJlIHRyaWdnZXJlZCBieSBIVyBlbmNyeXB0aW9uIHBhcmFtZXRlcnMuCi0JCQkqdGFpbCB8PSAoMTw8MTUpOyAvL25vIGVuY3J5cHQKLQkJfQorCQkvKkZJWE1FOiB0aGlzIHNob3VsZCBiZSB0cmlnZ2VyZWQgYnkgSFcgZW5jcnlwdGlvbiBwYXJhbWV0ZXJzLiovCisJCSp0YWlsIHw9ICgxPDwxNSk7IC8qIG5vIGVuY3J5cHQgKi8KIAogCQlpZihyZW1haW49PWxlbiAmJiAhZGVzY2ZyYWcpIHsKIAkJCW93bmJpdF9mbGFnID0gZmFsc2U7CS8vYWRkZWQgYnkgZGF2aWQgd29vLDIwMDcuMTIuMTQKQEAgLTIyNjYsNyArMjI0NSw3IEBACiAKIAkJLyogaHdfcGxjcF9sZW4gaXMgbm90IHVzZWQgZm9yIHJ0bDgxODAgY2hpcCAqLwogCQkvKiBGSVhNRSAqLwotCQlpZihwcml2LT5jYXJkXzgxODUgPT0gMCB8fCAhcHJpdi0+aHdfcGxjcF9sZW4peworCQlpZiAoIXByaXYtPmh3X3BsY3BfbGVuKSB7CiAJCQlkdXJhdGlvbiA9IHJ0bDgxODBfbGVuMmR1cmF0aW9uKGxlbiwgcmF0ZSwgJmV4dCk7CiAJCQkqKHRhaWwrMSkgPSAqKHRhaWwrMSkgfCAoKGR1cmF0aW9uICYgMHg3ZmZmKTw8MTYpOwogCQkJaWYoZXh0KSAqKHRhaWwrMSkgPSAqKHRhaWwrMSkgfCgxPDwzMSk7IC8vcGxjcCBsZW5ndGggZXh0ZW5zaW9uCkBAIC0yMzU1LDggKzIzMzQsNyBAQAogCiAJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9OT1JNQUwpOwogCi0JaWYocHJpdi0+Y2FyZF84MTg1KQotCQlydGw4MTgwX3NldF9jaGFuKGRldiwgcHJpdi0+Y2hhbik7CisJcnRsODE4MF9zZXRfY2hhbihkZXYsIHByaXYtPmNoYW4pOwogfQogCiB2b2lkIHJ0bDgxODBfcnFfdHhfYWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpewpAQCAtMjcwMiw4ICsyNjgwLDYgQEAKIAlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJdTE2IHdvcmQ7CiAJdTE2IHZlcnNpb247Ci0JdTggaHdfdmVyc2lvbjsKLQkvL3U4IGNvbmZpZzM7CiAJdTMyIHVzVmFsdWU7CiAJdTE2IHRtcHUxNjsKIAlpbnQgaSwgajsKQEAgLTI5MjgsNTAgKzI5MDQsMTMgQEAKIAogCXByaXYtPkluaXRpYWxHYWluID0gNjsKIAotCWh3X3ZlcnNpb24gPSggcmVhZF9uaWNfZHdvcmQoZGV2LCBUQ1IpICYgVENSX0hXVkVSSURfTUFTSyk+PlRDUl9IV1ZFUklEX1NISUZUOworCURNRVNHKCJNQUMgY29udHJvbGxlciBpcyBhIFJUTDgxODdTRSBiL2ciKTsKKwlwcml2LT5waHlfdmVyID0gMjsKIAotCXN3aXRjaCAoaHdfdmVyc2lvbil7Ci0JCWNhc2UgSFdfVkVSSURfUjgxODVCX0I6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcml2LT5jYXJkXzgxODUgPSBWRVJTSU9OXzgxODdTX0M7Ci0JCSAgICAgICAgRE1FU0coIk1BQyBjb250cm9sbGVyIGlzIGEgUlRMODE4N1NFIGIvZyIpOwotCQkJcHJpdi0+cGh5X3ZlciA9IDI7Ci0JCQlicmVhazsKLQkJY2FzZSBIV19WRVJJRF9SODE4NV9BQkM6Ci0JCQlETUVTRygiTUFDIGNvbnRyb2xsZXIgaXMgYSBSVEw4MTg1IGIvZyIpOwotCQkJcHJpdi0+Y2FyZF84MTg1ID0gMTsKLQkJCS8qIHlvdSBzaG91bGQgbm90IGZpbmQgYSBjYXJkIHdpdGggODIyNSBQSFkgdmVyIDwgQyovCi0JCQlwcml2LT5waHlfdmVyID0gMjsKLQkJCWJyZWFrOwotCQljYXNlIEhXX1ZFUklEX1I4MTg1X0Q6Ci0JCQlETUVTRygiTUFDIGNvbnRyb2xsZXIgaXMgYSBSVEw4MTg1IGIvZyAoVi4gRCkiKTsKLQkJCXByaXYtPmNhcmRfODE4NSA9IDI7Ci0JCQkvKiB5b3Ugc2hvdWxkIG5vdCBmaW5kIGEgY2FyZCB3aXRoIDgyMjUgUEhZIHZlciA8IEMqLwotCQkJcHJpdi0+cGh5X3ZlciA9IDI7Ci0JCQlicmVhazsKLQkJY2FzZSBIV19WRVJJRF9SODE4MF9BQkNEOgotCQkJRE1FU0coIk1BQyBjb250cm9sbGVyIGlzIGEgUlRMODE4MCIpOwotCQkJcHJpdi0+Y2FyZF84MTg1ID0gMDsKLQkJCWJyZWFrOwotCQljYXNlIEhXX1ZFUklEX1I4MTgwX0Y6Ci0JCQlETUVTRygiTUFDIGNvbnRyb2xsZXIgaXMgYSBSVEw4MTgwICh2LiBGKSIpOwotCQkJcHJpdi0+Y2FyZF84MTg1ID0gMDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJRE1FU0dXKCJNQUMgY2hpcCBub3QgcmVjb2duaXplZDogdmVyc2lvbiAleC4gQXNzdW1pbmcgUlRMODE4MCIsaHdfdmVyc2lvbik7Ci0JCQlwcml2LT5jYXJkXzgxODUgPSAwOwotCQkJYnJlYWs7Ci0JfQotCi0JaWYocHJpdi0+Y2FyZF84MTg1KXsKLQkJcHJpdi0+aWVlZTgwMjExLT5tb2R1bGF0aW9uIHw9IElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT047Ci0JCXByaXYtPmllZWU4MDIxMS0+c2hvcnRfc2xvdCA9IDE7Ci0JfQotCS8qIHlvdSBzaG91bGQgbm90IGZvdW5kIGFueSA4MTg1IFZlciBCIENhcmQgKi8KLQlwcml2LT5jYXJkXzgxODVfQnZlcnNpb24gPSAwOworCXByaXYtPmllZWU4MDIxMS0+bW9kdWxhdGlvbiB8PSBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OOworCXByaXYtPmllZWU4MDIxMS0+c2hvcnRfc2xvdCA9IDE7CiAKIAkvLyBqdXN0IGZvciBzeW5jIDg1Ci0JcHJpdi0+Y2FyZF90eXBlID0gUENJOwotICAgICAgICBETUVTRygiVGhpcyBpcyBhIFBDSSBOSUMiKTsKIAlwcml2LT5lbmFibGVfZ3BpbzAgPSAwOwogCiAJdXNWYWx1ZSA9IGVwcm9tX3JlYWQoZGV2LCBFRVBST01fU1dfUkVWRF9PRkZTRVQpOwpAQCAtMzAyNiwxMiArMjk2NSwxMCBAQAogCQlwcml2LT5jaHR4cHdyW2ldPXdvcmQgJiAweGZmOwogCQlwcml2LT5jaHR4cHdyW2krMV09KHdvcmQgJiAweGZmMDApPj44OwogCX0KLQlpZihwcml2LT5jYXJkXzgxODUpewotCQlmb3IoaT0xLGo9MDsgaTwxNDsgaSs9MixqKyspewotCQkJd29yZCA9IGVwcm9tX3JlYWQoZGV2LEVQUk9NX1RYUFdfT0ZETV9DSDFfMiArIGopOwotCQkJcHJpdi0+Y2h0eHB3cl9vZmRtW2ldPXdvcmQgJiAweGZmOwotCQkJcHJpdi0+Y2h0eHB3cl9vZmRtW2krMV09KHdvcmQgJiAweGZmMDApPj44OwotCQl9CisJZm9yIChpID0gMSwgaiA9IDA7IGkgPCAxNDsgaSArPSAyLCBqKyspIHsKKwkJd29yZCA9IGVwcm9tX3JlYWQoZGV2LCBFUFJPTV9UWFBXX09GRE1fQ0gxXzIgKyBqKTsKKwkJcHJpdi0+Y2h0eHB3cl9vZmRtW2ldID0gd29yZCAmIDB4ZmY7CisJCXByaXYtPmNodHhwd3Jfb2ZkbVtpKzFdID0gKHdvcmQgJiAweGZmMDApPj44OwogCX0KIAogCS8vM1JlYWQgY3J5c3RhbCBjYWxpYnRyYXRpb24gYW5kIHRoZXJtYWwgbWV0ZXIgaW5kaWNhdGlvbiBvbiA4N1NFLgpAQCAtMzA1NywzNyArMjk5NCwxMSBAQAogCiAJdmVyc2lvbiA9IGVwcm9tX3JlYWQoZGV2LEVQUk9NX1ZFUlNJT04pOwogCURNRVNHKCJFRVBST00gdmVyc2lvbiAleCIsdmVyc2lvbik7Ci0JaWYoICghcHJpdi0+Y2FyZF84MTg1KSAmJiB2ZXJzaW9uIDwgMHgwMTAxKXsKLQkJRE1FU0cgKCJFRVBST00gdmVyc2lvbiB0b28gb2xkLCBhc3N1bWluZyBkZWZhdWx0cyIpOwotCQlETUVTRyAoIklmIHlvdSBzZWUgdGhpcyBtZXNzYWdlICpwbGFzZSogc2VuZCB5b3VyIFwKLURNRVNHIG91dHB1dCB0byBhbmRyZWFtcmxAdGlzY2FsaS5pdCBUSEFOS1MiKTsKLQkJcHJpdi0+ZGlncGh5PTE7Ci0JCXByaXYtPmFudGI9MDsKLQkJcHJpdi0+ZGl2ZXJzaXR5PTE7Ci0JCXByaXYtPmNzX3RyZXNob2xkPTB4YzsKLQkJcHJpdi0+cmNyX2NzZW5zZT0xOwotCQlwcml2LT5yZl9jaGlwPVJGQ0hJUElEX1BISUxJUFM7Ci0JfWVsc2V7Ci0JCWlmKCFwcml2LT5jYXJkXzgxODUpewotCQkJdTggcmZwYXJhbSA9IGVwcm9tX3JlYWQoZGV2LFJGX1BBUkFNKTsKLQkJCURNRVNHKCJSZlBhcmFtOiAleCIscmZwYXJhbSk7CisJcHJpdi0+cmNyX2NzZW5zZSA9IDM7CiAKLQkJCXByaXYtPmRpZ3BoeSA9IHJmcGFyYW0gJiAoMTw8UkZfUEFSQU1fRElHUEhZX1NISUZUKSA/IDA6MTsKLQkJCXByaXYtPmFudGIgPSAgcmZwYXJhbSAmICgxPDxSRl9QQVJBTV9BTlRCREVGQVVMVF9TSElGVCkgPyAxOjA7CisJcHJpdi0+Y3NfdHJlc2hvbGQgPSAoZXByb21fcmVhZChkZXYsIEVORVJHWV9UUkVTSE9MRCkgJiAweGZmMDApID4+IDg7CiAKLQkJCXByaXYtPnJjcl9jc2Vuc2UgPSAocmZwYXJhbSAmIFJGX1BBUkFNX0NBUlJJRVJTRU5TRV9NQVNLKSA+PgotCQkJCQlSRl9QQVJBTV9DQVJSSUVSU0VOU0VfU0hJRlQ7Ci0KLQkJCXByaXYtPmRpdmVyc2l0eSA9Ci0JCQkJKHJlYWRfbmljX2J5dGUoZGV2LENPTkZJRzIpJigxPDxDT05GSUcyX0FOVEVOTkFfU0hJRlQpKSA/IDE6MDsKLQkJfWVsc2V7Ci0JCQlwcml2LT5yY3JfY3NlbnNlID0gMzsKLQkJfQotCi0JCXByaXYtPmNzX3RyZXNob2xkID0gKGVwcm9tX3JlYWQoZGV2LEVORVJHWV9UUkVTSE9MRCkmMHhmZjAwKSA+Pjg7Ci0KLQkJcHJpdi0+cmZfY2hpcCA9IDB4ZmYgJiBlcHJvbV9yZWFkKGRldixSRkNISVBJRCk7Ci0JfQorCXByaXYtPnJmX2NoaXAgPSAweGZmICYgZXByb21fcmVhZChkZXYsIFJGQ0hJUElEKTsKIAogCXByaXYtPnJmX2NoaXAgPSBSRl9aRUJSQTQ7CiAJcHJpdi0+cmZfc2xlZXAgPSBydGw4MjI1ejRfcmZfc2xlZXA7CkBAIC0zMDk5LDE5ICszMDEwLDYgQEAKIAlwcml2LT5yZl9zZXRfY2hhbiA9IHJ0bDgyMjV6Ml9yZl9zZXRfY2hhbjsKIAlwcml2LT5yZl9zZXRfc2VucyA9IE5VTEw7CiAKLQlpZighcHJpdi0+Y2FyZF84MTg1KXsKLQkJaWYocHJpdi0+YW50YikKLQkJCURNRVNHICgiQW50ZW5uYSBCIGlzIGRlZmF1bHQgYW50ZW5uYSIpOwotCQllbHNlCi0JCQlETUVTRyAoIkFudGVubmEgQSBpcyBkZWZhdWx0IGFudGVubmEiKTsKLQotCQlpZihwcml2LT5kaXZlcnNpdHkpCi0JCQlETUVTRyAoIkFudGVubmEgZGl2ZXJzaXR5IGlzIGVuYWJsZWQiKTsKLQkJZWxzZQotCQkJRE1FU0coIkFudGVubmEgZGl2ZXJzaXR5IGlzIGRpc2FibGVkIik7Ci0KLQkJRE1FU0coIkNhcnJpZXIgc2Vuc2UgJWQiLHByaXYtPnJjcl9jc2Vuc2UpOwotCX0KIAogCWlmICgwIT1hbGxvY19yeF9kZXNjX3JpbmcoZGV2LCBwcml2LT5yeGJ1ZmZlcnNpemUsIHByaXYtPnJ4cmluZ2NvdW50KSkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0zMTQ0LDE3ICszMDQyLDYgQEAKIAkJCQkgIFRYX0JFQUNPTl9SSU5HX0FERFIpKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlmKCFwcml2LT5jYXJkXzgxODUpewotCQlpZihyZWFkX25pY19ieXRlKGRldiwgQ09ORklHMCkgJiAoMTw8Q09ORklHMF9XRVA0MF9TSElGVCkpCi0JCQlETUVTRyAoIjQwLWJpdCBXRVAgaXMgc3VwcG9ydGVkIGluIGhhcmR3YXJlIik7Ci0JCWVsc2UKLQkJCURNRVNHICgiNDAtYml0IFdFUCBpcyBOT1Qgc3VwcG9ydGVkIGluIGhhcmR3YXJlIik7Ci0KLQkJaWYocmVhZF9uaWNfYnl0ZShkZXYsQ09ORklHMCkgJiAoMTw8Q09ORklHMF9XRVAxMDRfU0hJRlQpKQotCQkJRE1FU0cgKCIxMDQtYml0IFdFUCBpcyBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUiKTsKLQkJZWxzZQotCQkJRE1FU0cgKCIxMDQtYml0IFdFUCBpcyBOT1Qgc3VwcG9ydGVkIGluIGhhcmR3YXJlIik7Ci0JfQogI2lmICFkZWZpbmVkKFNBX1NISVJRKQogICAgICAgICBpZihyZXF1ZXN0X2lycShkZXYtPmlycSwgKHZvaWQgKilydGw4MTgwX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsIGRldi0+bmFtZSwgZGV2KSl7CiAjZWxzZQpAQCAtMzE3MiwxNyArMzA1OSw2IEBACiAKIHZvaWQgcnRsODE4MF9ub19od193ZXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0KLQlpZiAoIXByaXYtPmNhcmRfODE4NSkgewotCQl1OCBzZWN1cml0eTsKLQotCQlzZWN1cml0eSAgPSByZWFkX25pY19ieXRlKGRldiwgU0VDVVJJVFkpOwotCQlzZWN1cml0eSAmPX4oMTw8U0VDVVJJVFlfV0VQX1RYX0VOQUJMRV9TSElGVCk7Ci0JCXNlY3VyaXR5ICY9figxPDxTRUNVUklUWV9XRVBfUlhfRU5BQkxFX1NISUZUKTsKLQotCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFNFQ1VSSVRZLCBzZWN1cml0eSk7Ci0JfQogfQogCiB2b2lkIHJ0bDgxODBfc2V0X2h3X3dlcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMzM1NSw5ICszMjMxLDYgQEAKIHZvaWQgcnRsODE4MF9hZGFwdGVyX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAgICAgICAgIHN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQl1MzIgYW5hcGFyYW07Ci0JdTE2IHdvcmQ7Ci0JdTggY29uZmlnMzsKIAogCXJ0bDgxODBfcnR4X2Rpc2FibGUoZGV2KTsKIAlydGw4MTgwX3Jlc2V0KGRldik7CkBAIC0zMzcxLDEyICszMjQ0LDYgQEAKIAogCXJ0bDgxODBfYmVhY29uX3R4X2Rpc2FibGUoZGV2KTsKIAotCWlmKHByaXYtPmNhcmRfdHlwZSA9PSBDQVJEQlVTICl7Ci0JCWNvbmZpZzM9cmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzMpOwotCQl3cml0ZV9uaWNfYnl0ZShkZXYsQ09ORklHMyxjb25maWczIHwgQ09ORklHM19GdW5jUmVnRW4pOwotCQl3cml0ZV9uaWNfd29yZChkZXYsRkVNUiwgRkVNUl9JTlRSIHwgRkVNUl9XS1VQIHwgRkVNUl9HV0FLRSB8Ci0JCQlyZWFkX25pY193b3JkKGRldiwgRkVNUikpOwotCX0KIAlydGw4MTgwX3NldF9tb2RlKGRldiwgRVBST01fQ01EX0NPTkZJRyk7CiAJd3JpdGVfbmljX2R3b3JkKGRldiwgTUFDMCwgKCh1MzIqKWRldi0+ZGV2X2FkZHIpWzBdKTsKIAl3cml0ZV9uaWNfd29yZChkZXYsIE1BQzQsICgodTMyKilkZXYtPmRldl9hZGRyKVsxXSAmIDB4ZmZmZiApOwpAQCAtMzM4NCwxMiArMzI1MSw2IEBACiAKIAlydGw4MTgwX3VwZGF0ZV9tc3IoZGV2KTsKIAotCWlmKCFwcml2LT5jYXJkXzgxODUpewotCQlhbmFwYXJhbSAgPSBlcHJvbV9yZWFkKGRldixFUFJPTV9BTkFQQVJBTV9BRERSTFdPUkQpOwotCQlhbmFwYXJhbSB8PSBlcHJvbV9yZWFkKGRldixFUFJPTV9BTkFQQVJBTV9BRERSSFdPUkQpPDwxNjsKLQotCQlydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsYW5hcGFyYW0pOwotCX0KIAkvKiBUaGVzZSBtaWdodCBiZSB1bm5lY2Vzc2FyeSBzaW5jZSB3ZSBkbyBpbiByeF9lbmFibGUgLyB0eF9lbmFibGUgKi8KIAlmaXhfcnhfZmlmbyhkZXYpOwogCWZpeF90eF9maWZvKGRldik7CkBAIC0zMzk5LDYxICszMjYwLDM0IEBACiAJLyoKIAkgICBUaGUgZm9sbG93aW5nIGlzIHZlcnkgc3RyYW5nZS4gc2VlbXMgdG8gYmUgdGhhdCAxIG1lYW5zIHRlc3QgbW9kZSwKIAkgICBidXQgd2UgbmVlZCB0byBhY2tub2x3bGVkZ2VzIHRoZSBuaWMgd2hlbiBhIHBhY2tldCBpcyByZWFkeQotCSAgIGFsdG91Z2h0IHdlIHNldCBpdCB0byAwCisJICAgYWx0aG91Z2ggd2Ugc2V0IGl0IHRvIDAKIAkqLwogCiAJd3JpdGVfbmljX2J5dGUoZGV2LAogCQkgICAgICAgQ09ORklHMiwgcmVhZF9uaWNfYnl0ZShkZXYsQ09ORklHMikgJn5cCiAJCSAgICAgICAoMTw8Q09ORklHMl9ETUFfUE9MTElOR19NT0RFX1NISUZUKSk7CiAJLy9edGhlIG5pYyBpc24ndCBpbiB0ZXN0IG1vZGUKLQlpZihwcml2LT5jYXJkXzgxODUpCi0JCQl3cml0ZV9uaWNfYnl0ZShkZXYsCisJd3JpdGVfbmljX2J5dGUoZGV2LAogCQkgICAgICAgQ09ORklHMiwgcmVhZF9uaWNfYnl0ZShkZXYsQ09ORklHMil8KDE8PDQpKTsKIAogCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9OT1JNQUwpOwogCiAJd3JpdGVfbmljX2R3b3JkKGRldixJTlRfVElNRU9VVCwwKTsKIAotCWlmKCFwcml2LT5jYXJkXzgxODUpCi0JewotCQkvKgotCQlleHBlcmltZW50YWwgLSB0aGlzIG1pZ2h0IGJlIG5lZWRlZCB0byBjYWxpYnJhdGUgQUdDLAotCQlhbnl3YXkgaXQgc2hvdWxkbid0IGh1cnQKLQkJKi8KLQkJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUc1LAotCQkJcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzUpIHwgKDE8PEFHQ1JFU0VUX1NISUZUKSk7Ci0JCXJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUc1KTsKLQkJdWRlbGF5KDE1KTsKLQkJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUc1LAotCQkJcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzUpICZ+ICgxPDxBR0NSRVNFVF9TSElGVCkpOwotCX1lbHNlewotCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFdQQV9DT05GSUcsIDApOwotCQkvL3dyaXRlX25pY19ieXRlKGRldiwgVEVTVFIsIDB4ZCk7Ci0JfQorCXdyaXRlX25pY19ieXRlKGRldiwgV1BBX0NPTkZJRywgMCk7CiAKIAlydGw4MTgwX25vX2h3X3dlcChkZXYpOwogCi0JaWYocHJpdi0+Y2FyZF84MTg1KXsKLQkJcnRsODE4NV9zZXRfcmF0ZShkZXYpOwotCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFJBVEVfRkFMTEJBQ0ssIDB4ODEpOwotCX1lbHNlewotCQl3b3JkICA9IHJlYWRfbmljX3dvcmQoZGV2LCBCUlNSKTsKLQkJd29yZCAmPSB+QlJTUl9NQlI7Ci0JCXdvcmQgJj0gfkJSU1JfQlBMQ1A7Ci0JCXdvcmQgfD0gaWVlZXJhdGUycnRscmF0ZShwcml2LT5pZWVlODAyMTEtPmJhc2ljX3JhdGUpOwotCQl3b3JkIHw9IDB4MGY7Ci0JCXdyaXRlX25pY193b3JkKGRldiwgQlJTUiwgd29yZCk7Ci0JfQorCXJ0bDgxODVfc2V0X3JhdGUoZGV2KTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFJBVEVfRkFMTEJBQ0ssIDB4ODEpOwogCi0JaWYocHJpdi0+Y2FyZF84MTg1KXsKLQkJd3JpdGVfbmljX2J5dGUoZGV2LCBHUF9FTkFCTEUscmVhZF9uaWNfYnl0ZShkZXYsIEdQX0VOQUJMRSkgJiB+KDE8PDYpKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIEdQX0VOQUJMRSwgcmVhZF9uaWNfYnl0ZShkZXYsIEdQX0VOQUJMRSkgJiB+KDE8PDYpKTsKIAotCQkvL0ZJWE1FIGNmZyAzIENsa1J1biBlbmFibGUgLSBpc24ndCBpdCBSZWFkT25seSA/Ci0JCXJ0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfQ09ORklHKTsKLQkJd3JpdGVfbmljX2J5dGUoZGV2LENPTkZJRzMsIHJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUczKQotCQkJICAgICAgIHwgKDEgPDwgQ09ORklHM19DTEtSVU5fU0hJRlQpKTsKLQkJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9OT1JNQUwpOwotCX0KKwkvKkZJWE1FIGNmZyAzIENsa1J1biBlbmFibGUgLSBpc24ndCBpdCBSZWFkT25seSA/ICovCisJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9DT05GSUcpOworCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHMywgcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzMpCisJCSAgICAgICB8ICgxIDw8IENPTkZJRzNfQ0xLUlVOX1NISUZUKSk7CisJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9OT1JNQUwpOwogCiAJcHJpdi0+cmZfaW5pdChkZXYpOwogCkBAIC00MTQ0LDcgKzM5NzgsNyBAQAogCQl9CiAKIAkvKiB3ZSBjaGVjayBhbGwgdGhlIGRlc2NyaXB0b3JzIGJldHdlZW4gdGhlIGhlYWQgYW5kIHRoZSBuaWMsCi0JICogYnV0IG5vdCB0aGUgY3VycmVubHkgcG9pbnRlZCBieSB0aGUgbmljICh0aGUgbmV4dCB0byBiZSB0eGVkKQorCSAqIGJ1dCBub3QgdGhlIGN1cnJlbnRseSBwb2ludGVkIGJ5IHRoZSBuaWMgKHRoZSBuZXh0IHRvIGJlIHR4ZWQpCiAJICogYW5kIHRoZSBwcmV2aW91cyBvZiB0aGUgcG9pbnRlZCAobWlnaHQgYmUgaW4gcHJvY2VzcyA/PykKIAkqLwogCW9mZnMgPSAobmljIC0gbmljYmVnaW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9kbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9kbS5jCmluZGV4IGI2ZWVlZWMuLmNiY2E1OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfZG0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2RtLmMKQEAgLTM2LDcgKzM2LDcgQEAKIC8vCiAvLwlOb3RlOgogLy8JCVRoZSByZWFzb24gd2h5IHdlIHVkcGF0ZSBUeCBwb3dlciBsZXZlbCBoZXJlIGluc3RlYWQgb2YgRG9SeEhpZ2hQb3dlcigpCi0vLwkJaXMgdGhlIG51bWJlciBvZiBJTyB0byBjaGFuZ2UgVHggcG93ZXIgaXMgbXVjaCBtb3JlIHRoYW4gY2hhbmUgVFIgc3dpdGNoCisvLwkJaXMgdGhlIG51bWJlciBvZiBJTyB0byBjaGFuZ2UgVHggcG93ZXIgaXMgbXVjaCBtb3JlIHRoYW4gY2hhbm5lbCBUUiBzd2l0Y2gKIC8vCQlhbmQgdGhleSBhcmUgcmVsYXRlZCB0byBPRkRNIGFuZCBNQUMgcmVnaXN0ZXJzLgogLy8JCVNvLCB3ZSBkb24ndCB3YW50IHRvIHVwZGF0ZSBpdCBzbyBmcmVxdWVudGx5IGluIHBlci1SeCBwYWNrZXQgYmFzZS4KIC8vCkBAIC0xOTcsNyArMTk3LDYgQEAKIAl7IC8vIEFkdmlzZWQgZnJvbSBTRDMgRFoKIAkJcHJpdi0+SW5pdGlhbEdhaW4gPSA0OyAvLyBJbiA4N0IsIG03NGRCbSBtZWFucyBTdGF0ZSA0IChtODJkQm0pCiAJfQotCS8vaWYocEhhbERhdGEtPlZlcnNpb25JRCAhPSBWRVJTSU9OXzgxODdCX0IpCiAJeyAvLyBBZHZpc2VkIGZyb20gU0QzIERaCiAJCU9mZG1GQTEgPSAgMHgyMDsKIAl9CkBAIC0xMzI2LDcgKzEzMjUsNyBAQAogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCXByaW50aygiU2V0QW50ZW5uYTgxODU6IHVua293biBSRkNoaXBJRCglZClcbiIsIHByaXYtPnJmX2NoaXApOworCQkJcHJpbnRrKCJTZXRBbnRlbm5hODE4NTogdW5rbm93biBSRkNoaXBJRCglZClcbiIsIHByaXYtPnJmX2NoaXApOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CkBAIC0xMzQ2LDEzICsxMzQ1LDEzIEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJcHJpbnRrKCJTZXRBbnRlbm5hODE4NTogdW5rb3duIFJGQ2hpcElEKCVkKVxuIiwgcHJpdi0+cmZfY2hpcCk7CisJCQlwcmludGsoIlNldEFudGVubmE4MTg1OiB1bmtub3duIFJGQ2hpcElEKCVkKVxuIiwgcHJpdi0+cmZfY2hpcCk7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXByaW50aygiU2V0QW50ZW5uYTgxODU6IHVua293biB1MWJBbnRlbm5hSW5kZXgoJWQpXG4iLCB1MWJBbnRlbm5hSW5kZXgpOworCQlwcmludGsoIlNldEFudGVubmE4MTg1OiB1bmtub3duIHUxYkFudGVubmFJbmRleCglZClcbiIsIHUxYkFudGVubmFJbmRleCk7CiAJCWJyZWFrOwogCX0KIApAQCAtMTQ0OCw3ICsxNDQ3LDcgQEAKIAogCQlwcml2LT5iQWRTd2l0Y2hlZENoZWNraW5nID0gZmFsc2U7CiAKLQkJLy8gQWRqdXN0IFJ4IHNpZ25hbCBzdHJlbmd0aCB0aHJlYXNob2xkLgorCQkvLyBBZGp1c3QgUnggc2lnbmFsIHN0cmVuZ3RoIHRocmVzaG9sZC4KIAkJcHJpdi0+QWRSeFNzVGhyZXNob2xkID0gKHByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCArIHByaXYtPkFkUnhTc0JlZm9yZVN3aXRjaGVkKSAvIDI7CiAKIAkJcHJpdi0+QWRSeFNzVGhyZXNob2xkID0gKHByaXYtPkFkUnhTc1RocmVzaG9sZCA+IHByaXYtPkFkTWF4UnhTc1RocmVzaG9sZCkgPwpAQCAtMTU2Miw3ICsxNTYxLDcgQEAKIC8vCQkJCXByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCwgcHJpdi0+QWRSeFNzVGhyZXNob2xkKTsKIAogCQkJcHJpdi0+YkFkU3dpdGNoZWRDaGVja2luZyA9IGZhbHNlOwotCQkJLy8gSW5jcmVhc2UgUnggc2lnbmFsIHN0cmVuZ3RoIHRocmVhc2hvbGQgaWYgbmVjZXNzYXJ5LgorCQkJLy8gSW5jcmVhc2UgUnggc2lnbmFsIHN0cmVuZ3RoIHRocmVzaG9sZCBpZiBuZWNlc3NhcnkuCiAJCQlpZigJKHByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCA+IChwcml2LT5BZFJ4U3NUaHJlc2hvbGQgKyAxMCkpICYmIC8vIFNpZ25hbCBpcyBtdWNoIHN0cm9uZ2VyIHRoYW4gY3VycmVudCB0aHJlc2hvbGQKIAkJCQlwcml2LT5BZFJ4U3NUaHJlc2hvbGQgPD0gcHJpdi0+QWRNYXhSeFNzVGhyZXNob2xkKSAvLyBDdXJyZW50IHRocmVob2xkIGlzIG5vdCB5ZXQgcmVhY2ggdXBwZXIgbGltaXQuCiAJCQl7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjV6Mi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjI1ejIuYwppbmRleCBiNjQ4NzUxLi5hZmUxMGYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjV6Mi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODIyNXoyLmMKQEAgLTIzLDcgKzIzLDYgQEAKIAl1MTYgb3V0LCBzZWxlY3Q7CiAJdTggYml0OwogCXUzMiBiYW5nZGF0YSA9IChkYXRhIDw8IDQpIHwgKGFkciAmIDB4Zik7Ci0Jc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCiAJb3V0ID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCkgJiAweGZmZjM7CiAKQEAgLTMzLDcgKzMyLDcgQEAKIAlzZWxlY3QgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0KTsKIAogCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCBzZWxlY3QgfCAweDcgfAotCQkoKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpID8gMCA6IFNXX0NPTlRST0xfR1BJTykpOworCQkgICAgICAgU1dfQ09OVFJPTF9HUElPKTsKIAogCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CiAJdWRlbGF5KDEwKTsKQEAgLTcxLDE2ICs3MCwxMSBAQAogCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CiAJdWRlbGF5KDEwKTsKIAotCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdXQgfAotCQkoKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpID8gNCA6IEJCX0hPU1RfQkFOR19FTikpOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdXQgfCBCQl9IT1NUX0JBTkdfRU4pOwogCi0Jd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIHNlbGVjdCB8Ci0JCSgocHJpdi0+Y2FyZF90eXBlID09IFVTQikgPyAwIDogU1dfQ09OVFJPTF9HUElPKSk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIHNlbGVjdCB8IFNXX0NPTlRST0xfR1BJTyk7CiAKLQlpZiAocHJpdi0+Y2FyZF90eXBlID09IFVTQikKLQkJbWRlbGF5KDIpOwotCWVsc2UKLQkJcnRsODE4NV9yZl9waW5zX2VuYWJsZShkZXYpOworCXJ0bDgxODVfcmZfcGluc19lbmFibGUoZGV2KTsKIH0KIAogc3RhdGljIGNvbnN0IHUxNiBydGw4MjI1YmNkX3J4Z2FpbltdID0gewpAQCAtMTc0LDE1ICsxNjgsOSBAQAogCXU4IGNja19wb3dlcl9sZXZlbCA9IDB4ZmYgJiBwcml2LT5jaHR4cHdyW2NoXTsKIAl1OCBvZmRtX3Bvd2VyX2xldmVsID0gMHhmZiAmIHByaXYtPmNodHhwd3Jfb2ZkbVtjaF07CiAKLQlpZiAocHJpdi0+Y2FyZF90eXBlID09IFVTQikgewotCQltYXhfY2NrX3Bvd2VyX2xldmVsID0gMTE7Ci0JCW1heF9vZmRtX3Bvd2VyX2xldmVsID0gMjU7Ci0JCW1pbl9vZmRtX3Bvd2VyX2xldmVsID0gMTA7Ci0JfSBlbHNlIHsKLQkJbWF4X2Nja19wb3dlcl9sZXZlbCA9IDM1OwotCQltYXhfb2ZkbV9wb3dlcl9sZXZlbCA9IDM1OwotCQltaW5fb2ZkbV9wb3dlcl9sZXZlbCA9IDA7Ci0JfQorCW1heF9jY2tfcG93ZXJfbGV2ZWwgPSAzNTsKKwltYXhfb2ZkbV9wb3dlcl9sZXZlbCA9IDM1OworCW1pbl9vZmRtX3Bvd2VyX2xldmVsID0gMDsKIAogCWlmIChjY2tfcG93ZXJfbGV2ZWwgPiBtYXhfY2NrX3Bvd2VyX2xldmVsKQogCQljY2tfcG93ZXJfbGV2ZWwgPSBtYXhfY2NrX3Bvd2VyX2xldmVsOwpAQCAtNDQ1LDMwICs0MzMsMjggQEAKIAkgKiBPRkRNIFBvd2VyIGluIGRCbSA9IEluZGV4ICogMC41ICsgMAogCSAqIENDSyBQb3dlciBpbiBkQm0gPSBJbmRleCAqIDAuMjUgKyAxMwogCSAqLwotCWlmIChwcml2LT5jYXJkXzgxODUgPj0gVkVSU0lPTl84MTg3U19CKSB7Ci0JCXMzMiB0bXAgPSAwOworCXMzMiB0bXAgPSAwOwogCi0JCWlmIChXaXJlbGVzc01vZGUgPT0gV0lSRUxFU1NfTU9ERV9HKSB7Ci0JCQliVXNlRGVmYXVsdCA9IGZhbHNlOwotCQkJdG1wID0gKDIgKiBQb3dlckluRGJtKTsKKwlpZiAoV2lyZWxlc3NNb2RlID09IFdJUkVMRVNTX01PREVfRykgeworCQliVXNlRGVmYXVsdCA9IGZhbHNlOworCQl0bXAgPSAoMiAqIFBvd2VySW5EYm0pOwogCi0JCQlpZiAodG1wIDwgMCkKLQkJCQlUeFB3cklkeCA9IDA7Ci0JCQllbHNlIGlmICh0bXAgPiA0MCkgLyogNDAgbWVhbnMgMjAgZEJtLiAqLwotCQkJCVR4UHdySWR4ID0gNDA7Ci0JCQllbHNlCi0JCQkJVHhQd3JJZHggPSAoczgpdG1wOwotCQl9IGVsc2UgaWYgKFdpcmVsZXNzTW9kZSA9PSBXSVJFTEVTU19NT0RFX0IpIHsKLQkJCWJVc2VEZWZhdWx0ID0gZmFsc2U7Ci0JCQl0bXAgPSAoNCAqIFBvd2VySW5EYm0pIC0gNTI7CisJCWlmICh0bXAgPCAwKQorCQkJVHhQd3JJZHggPSAwOworCQllbHNlIGlmICh0bXAgPiA0MCkgLyogNDAgbWVhbnMgMjAgZEJtLiAqLworCQkJVHhQd3JJZHggPSA0MDsKKwkJZWxzZQorCQkJVHhQd3JJZHggPSAoczgpdG1wOworCX0gZWxzZSBpZiAoV2lyZWxlc3NNb2RlID09IFdJUkVMRVNTX01PREVfQikgeworCQliVXNlRGVmYXVsdCA9IGZhbHNlOworCQl0bXAgPSAoNCAqIFBvd2VySW5EYm0pIC0gNTI7CiAKLQkJCWlmKHRtcCA8IDApCi0JCQkJVHhQd3JJZHggPSAwOwotCQkJZWxzZSBpZiAodG1wID4gMjgpIC8qIDI4IG1lYW5zIDIwIGRCbS4gKi8KLQkJCQlUeFB3cklkeCA9IDI4OwotCQkJZWxzZQotCQkJCVR4UHdySWR4ID0gKHM4KXRtcDsKLQkJfQorCQlpZiAodG1wIDwgMCkKKwkJCVR4UHdySWR4ID0gMDsKKwkJZWxzZSBpZiAodG1wID4gMjgpIC8qIDI4IG1lYW5zIDIwIGRCbS4gKi8KKwkJCVR4UHdySWR4ID0gMjg7CisJCWVsc2UKKwkJCVR4UHdySWR4ID0gKHM4KXRtcDsKIAl9CiAKIAkvKgpAQCAtNjMxLDggKzYxNyw3IEBACiAKIAlwcml2LT5jaGFuID0gY2hhbm5lbDsKIAotCWlmIChwcml2LT5jYXJkX3R5cGUgIT0gVVNCKQotCQlydGw4MjI1X2hvc3RfcGNpX2luaXQoZGV2KTsKKwlydGw4MjI1X2hvc3RfcGNpX2luaXQoZGV2KTsKIAogCXdyaXRlX25pY19kd29yZChkZXYsIFJGX1RJTUlORywgMHgwMDBhODAwOCk7CiAKQEAgLTY1NSw3ICs2NDAsNyBAQAogCXdyaXRlX3J0bDgyMjUoZGV2LCAweDQsIDB4OGMzKTsgbWRlbGF5KDEpOwogCXdyaXRlX3J0bDgyMjUoZGV2LCAweDUsIDB4YzcyKTsgbWRlbGF5KDEpOwogCXdyaXRlX3J0bDgyMjUoZGV2LCAweDYsIDB4ZTYpOyAgbWRlbGF5KDEpOwotCXdyaXRlX3J0bDgyMjUoZGV2LCAweDcsICgocHJpdi0+Y2FyZF90eXBlID09IFVTQik/IDB4ODJhIDogcnRsODIyNV9jaGFuW2NoYW5uZWxdKSk7ICBtZGVsYXkoMSk7CisJd3JpdGVfcnRsODIyNShkZXYsIDB4NywgcnRsODIyNV9jaGFuW2NoYW5uZWxdKTsgIG1kZWxheSgxKTsKIAl3cml0ZV9ydGw4MjI1KGRldiwgMHg4LCAweDNmKTsgIG1kZWxheSgxKTsKIAl3cml0ZV9ydGw4MjI1KGRldiwgMHg5LCAweDMzNSk7IG1kZWxheSgxKTsKIAl3cml0ZV9ydGw4MjI1KGRldiwgMHhhLCAweDlkNCk7IG1kZWxheSgxKTsKQEAgLTY4MSwxMyArNjY2LDYgQEAKIAogCXdyaXRlX3J0bDgyMjUoZGV2LCAweDIsIDB4YzRkKTsKIAotCWlmIChwcml2LT5jYXJkX3R5cGUgPT0gVVNCKSB7Ci0JCW1kZWxheSgyMDApOwotCi0JCXdyaXRlX3J0bDgyMjUoZGV2LCAweDIsIDB4NDRkKTsKLQkJbWRlbGF5KDEwMCk7Ci0JfQotCiAJLyogRklYTUUhISBydGw4MTg3IHdlIGhhdmUgdG8gY2hlY2sgaWYgY2FsaWJyYXJpb24KIAkgKiBpcyBzdWNjZXNzZnVsIGFuZCBldmVudHVhbGx5IGNhbC4gYWdhaW4gKHJlcGVhdAogCSAqIHRoZSB0d28gd3JpdGUgb24gcmVnIDIpCkBAIC03MDcsOSArNjg1LDYgQEAKIAogCXdyaXRlX3J0bDgyMjUoZGV2LCAweDAsIDB4MmJmKTsKIAotCWlmIChwcml2LT5jYXJkX3R5cGUgIT0gVVNCKQotCQlydGw4MTg1X3JmX3BpbnNfZW5hYmxlKGRldik7Ci0KIAlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKIAkJZGF0YSA9IHJ0bDgyMjVfYWdjW2ldOwogCkBAIC03MjYsNyArNzAxLDcgQEAKIAogCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwMCwgMHgwMSk7IG1kZWxheSgxKTsKIAl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MDEsIDB4MDIpOyBtZGVsYXkoMSk7Ci0Jd3JpdGVfcGh5X29mZG0oZGV2LCAweDAyLCAoKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpID8gMHg0MiA6IDB4NjIpKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwMiwgMHg2Mik7IG1kZWxheSgxKTsKIAl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MDMsIDB4MDApOyBtZGVsYXkoMSk7CiAJd3JpdGVfcGh5X29mZG0oZGV2LCAweDA0LCAweDAwKTsgbWRlbGF5KDEpOwogCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwNSwgMHgwMCk7IG1kZWxheSgxKTsKQEAgLTc3NCw3ICs3NDksNyBAQAogCXdyaXRlX3BoeV9jY2soZGV2LCAweDYsIDB4ZmMpOyBtZGVsYXkoMSk7CiAJd3JpdGVfcGh5X2NjayhkZXYsIDB4NywgMHg3OCk7IG1kZWxheSgxKTsKIAl3cml0ZV9waHlfY2NrKGRldiwgMHg4LCAweDJlKTsgbWRlbGF5KDEpOwotCXdyaXRlX3BoeV9jY2soZGV2LCAweDEwLCAoKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpID8gMHg5YjogMHg5MykpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTAsIDB4OTMpOyBtZGVsYXkoMSk7CiAJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTEsIDB4ODgpOyBtZGVsYXkoMSk7CiAJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTIsIDB4NDcpOyBtZGVsYXkoMSk7CiAJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTMsIDB4ZDApOwpAQCAtODA4LDEyICs3ODMsOCBAQAogCS8qIHN3aXRjaCB0byBoaWdoLXNwZWVkIDMtd2lyZQogCSAqIGxhc3QgZGlnaXQuIDIgZm9yIGJvdGggY2NrIGFuZCBvZmRtCiAJICovCi0JaWYgKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpCi0JCXdyaXRlX25pY19kd29yZChkZXYsIDB4OTQsIDB4M2RjMDAwMDIpOwotCWVsc2UgewotCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCAweDk0LCAweDE1YzAwMDAyKTsKLQkJcnRsODE4NV9yZl9waW5zX2VuYWJsZShkZXYpOwotCX0KKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCAweDk0LCAweDE1YzAwMDAyKTsKKwlydGw4MTg1X3JmX3BpbnNfZW5hYmxlKGRldik7CiAKIAlydGw4MjI1X3JmX3NldF9jaGFuKGRldiwgcHJpdi0+Y2hhbik7CiB9CkBAIC0xMDU4LDcgKzEwMjksNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQliUmVzdWx0ID0gZmFsc2U7Ci0JCQlwcmludGsoIlNldFplYnJhUkZQb3dlclN0YXRlODE4NSgpOiB1bmtub3cgc3RhdGUgdG8gc2V0OiAweCVYISEhXG4iLCBlUkZQb3dlclN0YXRlKTsKKwkJCXByaW50aygiU2V0WmVicmFSRlBvd2VyU3RhdGU4MTg1KCk6IHVua25vd24gc3RhdGUgdG8gc2V0OiAweCVYISEhXG4iLCBlUkZQb3dlclN0YXRlKTsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF93eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF93eC5jCmluZGV4IDc2Njg5MmUuLjUzNmNiNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfd3guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3d4LmMKQEAgLTI3Niw3ICsyNzYsNyBAQAogCXJhbmdlLT5tYXhfcXVhbC51cGRhdGVkID0gNzsgLyogVXBkYXRlZCBhbGwgdGhyZWUgKi8KIAogCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gOTI7IC8qID4gOCUgbWlzc2VkIGJlYWNvbnMgaXMgJ2JhZCcgKi8KLQkvKiBUT0RPOiBGaW5kIHJlYWwgJ2dvb2QnIHRvICdiYWQnIHRocmVzaG9sIHZhbHVlIGZvciBSU1NJICovCisJLyogVE9ETzogRmluZCByZWFsICdnb29kJyB0byAnYmFkJyB0aHJlc2hvbGQgdmFsdWUgZm9yIFJTU0kgKi8KIAlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAyMCArIC05ODsKIAlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSAwOwogCXJhbmdlLT5hdmdfcXVhbC51cGRhdGVkID0gNzsgLyogVXBkYXRlZCBhbGwgdGhyZWUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODViX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODViX2luaXQuYwppbmRleCBjZDA3MDU5Li41MDMwOWYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTg1Yl9pbml0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4NWJfaW5pdC5jCkBAIC0xMDIzLDYgKzEwMjMsNyBAQAogCXUzMglhZGRyLGRhdGE7CiAJdTMyCXU0YlJlZ09mZnNldCwgdTRiUmVnVmFsdWUsIHU0YlJGMjMsIHU0YlJGMjQ7CiAgICAgICAgdTgJCQl1MWIyNEU7CisJaW50IGRfY3V0ID0gMDsKIAogCiAJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTAzNSw4ICsxMDM2LDEwIEBACiAJdTRiUkYyMz0gUkZfUmVhZFJlZyhkZXYsIDB4MDgpOwkJCW1kZWxheSgxKTsKIAl1NGJSRjI0PSBSRl9SZWFkUmVnKGRldiwgMHgwOSk7CQkJbWRlbGF5KDEpOwogCi0JaWYgKHU0YlJGMjM9PTB4ODE4ICYmIHU0YlJGMjQ9PTB4NzBDICYmIHByaXYtPmNhcmRfODE4NSA9PSBWRVJTSU9OXzgxODdTX0MpCi0JCXByaXYtPmNhcmRfODE4NSA9IFZFUlNJT05fODE4N1NfRDsKKwlpZiAodTRiUkYyMyA9PSAweDgxOCAmJiB1NGJSRjI0ID09IDB4NzBDKSB7CisJCWRfY3V0ID0gMTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicnRsODE4N3NlOiBjYXJkIHR5cGUgY2hhbmdlZCBmcm9tIEMtIHRvIEQtY3V0XG4iKTsKKwl9CiAKIAkvLyBQYWdlMCA6IHJlZzAtcmVnMTUKIApAQCAtMTA3MCwxOCArMTA3Myw5IEBACiAKIAlSRl9Xcml0ZVJlZyhkZXYsIDB4MDMsIDB4MDgwNik7CQkJbWRlbGF5KDEpOwogCi0JaWYocHJpdi0+Y2FyZF84MTg1IDwgVkVSU0lPTl84MTg3U19DKQotCXsKLQkJUkZfV3JpdGVSZWcoZGV2LCAweDA0LCAweDAzZjcpOwkJCW1kZWxheSgxKTsKLQkJUkZfV3JpdGVSZWcoZGV2LCAweDA1LCAweDA1YWIpOwkJCW1kZWxheSgxKTsKLQkJUkZfV3JpdGVSZWcoZGV2LCAweDA2LCAweDAwYzEpOwkJCW1kZWxheSgxKTsKLQl9Ci0JZWxzZQotCXsKLQkJUkZfV3JpdGVSZWcoZGV2LCAweDA0LCAweDAzYTcpOwkJCW1kZWxheSgxKTsKLQkJUkZfV3JpdGVSZWcoZGV2LCAweDA1LCAweDA1OWIpOwkJCW1kZWxheSgxKTsKLQkJUkZfV3JpdGVSZWcoZGV2LCAweDA2LCAweDAwODEpOwkJCW1kZWxheSgxKTsKLQl9CisJUkZfV3JpdGVSZWcoZGV2LCAweDA0LCAweDAzYTcpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDUsIDB4MDU5Yik7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwNiwgMHgwMDgxKTsJCQltZGVsYXkoMSk7CiAKIAogCVJGX1dyaXRlUmVnKGRldiwgMHgwNywgMHgwMUEwKTsJCQltZGVsYXkoMSk7CkBAIC0xMDkxLDE0ICsxMDg1LDExIEBACiAJUkZfV3JpdGVSZWcoZGV2LCAweDBhLCAweDAwMDEpOwkJCW1kZWxheSgxKTsKIAlSRl9Xcml0ZVJlZyhkZXYsIDB4MGIsIDB4MDQxOCk7CQkJbWRlbGF5KDEpOwogCi0JaWYocHJpdi0+Y2FyZF84MTg1ID09IFZFUlNJT05fODE4N1NfRCkKLQl7CisJaWYgKGRfY3V0KSB7CiAJCVJGX1dyaXRlUmVnKGRldiwgMHgwYywgMHgwZmJlKTsJCQltZGVsYXkoMSk7CiAJCVJGX1dyaXRlUmVnKGRldiwgMHgwZCwgMHgwMDA4KTsJCQltZGVsYXkoMSk7CiAJCVJGX1dyaXRlUmVnKGRldiwgMHgwZSwgMHgwODA3KTsJCQltZGVsYXkoMSk7IC8vIFJYIExPIGJ1ZmZlcgotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCVJGX1dyaXRlUmVnKGRldiwgMHgwYywgMHgwZmJlKTsJCQltZGVsYXkoMSk7CiAJCVJGX1dyaXRlUmVnKGRldiwgMHgwZCwgMHgwMDA4KTsJCQltZGVsYXkoMSk7CiAJCVJGX1dyaXRlUmVnKGRldiwgMHgwZSwgMHgwODA2KTsJCQltZGVsYXkoMSk7IC8vIFJYIExPIGJ1ZmZlcgpAQCAtMjQ5Myw4ICsyNDg0LDggQEAKIAlQaHlDb25maWc4MTg1KGRldik7CiAKIAkvLyBXZSBhc3N1bWUgUmVnV2lyZWxlc3NNb2RlIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgYmVmb3JlLAotCS8vIGhvd2V2ZXIsIHdlIGhhcyB0byB2YWxpZGF0ZSB0aGUgd2lyZWxlc3MgbW9kZSBoZXJlIGFuZCBwcm92aWRlIGEgcmVhc29uYmxlCi0JLy8gaW5pdGlhbGl6ZWQgdmFsdWUgaWYgbmVjZXNzYXJ5LiAyMDA1LjAxLjEzLCBieSByY25qa28uCisJLy8gaG93ZXZlciwgd2UgaGFzIHRvIHZhbGlkYXRlIHRoZSB3aXJlbGVzcyBtb2RlIGhlcmUgYW5kIHByb3ZpZGUgYQorCS8vIHJlYXNvbmFibGUgaW5pdGlhbGl6ZWQgdmFsdWUgaWYgbmVjZXNzYXJ5LiAyMDA1LjAxLjEzLCBieSByY25qa28uCiAJU3VwcG9ydGVkV2lyZWxlc3NNb2RlID0gR2V0U3VwcG9ydGVkV2lyZWxlc3NNb2RlODE4NShkZXYpOwogCWlmKAkoaWVlZS0+bW9kZSAhPSBXSVJFTEVTU19NT0RFX0IpICYmCiAJCShpZWVlLT5tb2RlICE9IFdJUkVMRVNTX01PREVfRykgJiYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKaW5kZXggMTJjMmExOC4uMjY0NDE1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKQEAgLTE2NCw3ICsxNjQsNyBAQAogIAlpZWVlLT5wcml2YWN5X2ludm9rZWQgPSAwOwogIAlpZWVlLT5pZWVlODAyXzF4ID0gMTsKIAlpZWVlLT5yYXdfdHggPSAwOwotCS8vaWVlZS0+aHdzZWNfc3VwcG9ydCA9IDE7IC8vZGVmYWx0IHN1cHBvcnQgaHcgc2VjdXJpdHkuIC8vdXNlIG1vZHVsZV9wYXJhbSBpbnN0ZWFkLgorCS8vaWVlZS0+aHdzZWNfc3VwcG9ydCA9IDE7IC8vZGVmYXVsdCBzdXBwb3J0IGh3IHNlY3VyaXR5LiAvL3VzZSBtb2R1bGVfcGFyYW0gaW5zdGVhZC4KIAlpZWVlLT5od3NlY19hY3RpdmUgPSAwOyAvL2Rpc2FibGUgaHdzZWMsIHN3aXRjaCBpdCBvbiB3aGVuIG5lY2Vzc2FyeS4KIAogCWllZWU4MDIxMV9zb2Z0bWFjX2luaXQoaWVlZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKaW5kZXggZWFlN2M0NS4uNTkzZDIyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwpAQCAtMjMzMCwxMCArMjMzMCwxMCBAQAogICogY2FyZSBvZiB0aGUgaWVlZTgwMi4xMSBmcmFnbWVudGF0aW9uLgogICogU28gdGhlIGRyaXZlciByZWNlaXZlcyBhIGZyYWdtZW50IHBlciB0aW1lIGFuZCBtaWdodAogICogY2FsbCB0aGUgc3RvcCBmdW5jdGlvbiB3aGVuIGl0IHdhbnQgd2l0aG91dCB0YWtlIGNhcmUKLSAqIHRvIGhhdmUgZW5vdWdodCByb29tIHRvIFRYIGFuIGVudGlyZSBwYWNrZXQuCisgKiB0byBoYXZlIGVub3VnaCByb29tIHRvIFRYIGFuIGVudGlyZSBwYWNrZXQuCiAgKiBUaGlzIG1pZ2h0IGJlIHVzZWZ1bCBpZiBlYWNoIGZyYWdtZW50IG5lZWQgaXQncyBvd24KICAqIGRlc2NyaXB0b3IsIHRodXMganVzdCBrZWVwIGEgdG90YWwgZnJlZSBtZW1vcnkgPiB0aGFuCi0gKiB0aGUgbWF4IGZyYWdtZW50YXRpb24gdHJlc2hvbGQgaXMgbm90IGVub3VnaHQuLiBJZiB0aGUKKyAqIHRoZSBtYXggZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQgaXMgbm90IGVub3VnaC4uIElmIHRoZQogICogaWVlZTgwMi4xMSBzdGFjayBwYXNzZWQgYSBUWEIgc3RydWN0IHRoZW4geW91IG5lZWRlZAogICogdG8ga2VlcCBOIGZyZWUgZGVzY3JpcHRvcnMgd2hlcmUKICAqIE4gPSBNQVhfUEFDS0VUX1NJWkUgLyBNSU5fRlJBR19UUkVTSE9MRApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkwX3J0bDgyNTYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MF9ydGw4MjU2LmMKaW5kZXggMGVhZWUzYS4uM2Q2N2ZiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkwX3J0bDgyNTYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTBfcnRsODI1Ni5jCkBAIC02MjksNyArNjI5LDcgQEAKIAogCQkJZGVmYXVsdDoKIAkJCQkJYlJlc3VsdCA9IGZhbHNlOwotCQkJCQlSVF9UUkFDRShDT01QX0VSUiwgIlNldFJGUG93ZXJTdGF0ZTgxOTAoKTogdW5rbm93IHN0YXRlIHRvIHNldDogMHglWCEhIVxuIiwgZVJGUG93ZXJTdGF0ZSk7CisJCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiU2V0UkZQb3dlclN0YXRlODE5MCgpOiB1bmtub3duIHN0YXRlIHRvIHNldDogMHglWCEhIVxuIiwgZVJGUG93ZXJTdGF0ZSk7CiAJCQkJCWJyZWFrOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9jb3JlLmMKaW5kZXggYjA4MDJhNy4uZmY4ZmU3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9jb3JlLmMKQEAgLTEwNDEsNyArMTA0MSw3IEBACiAgICAgICAgIHR4X2Rlc2NfODE5eF9wY2kgKmVudHJ5ID0gJnJpbmctPmRlc2NbcmluZy0+aWR4XTsKICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAotICAgICAgICAvKiBiZWFjb24gcGFja2V0IHdpbGwgb25seSB1c2UgdGhlIGZpcnN0IGRlc2NyaXB0b3IgZGVmYXV0bHksCisgICAgICAgIC8qIGJlYWNvbiBwYWNrZXQgd2lsbCBvbmx5IHVzZSB0aGUgZmlyc3QgZGVzY3JpcHRvciBkZWZhdWx0bHksCiAgICAgICAgICAqIGFuZCB0aGUgT1dOIG1heSBub3QgYmUgY2xlYXJlZCBieSB0aGUgaGFyZHdhcmUKICAgICAgICAgICogKi8KICAgICAgICAgaWYocHJpbyAhPSBCRUFDT05fUVVFVUUpIHsKQEAgLTI1NjIsNyArMjU2Miw3IEBACiAJCXByaXYtPmJUWFBvd2VyRGF0YVJlYWRGcm9tRUVQT1JNID0gZmFsc2U7CiAJfQogCi0JLy8gMjAwNy8xMS8xNSBNSCA4MTkwUENJIERlZmF1bHQ9MlQ0UiwgODE5MlBDSUUgZGFmYXVsdD0xVDJSCisJLy8gMjAwNy8xMS8xNSBNSCA4MTkwUENJIERlZmF1bHQ9MlQ0UiwgODE5MlBDSUUgZGVmYXVsdD0xVDJSCiAJcHJpdi0+cmZfdHlwZSA9IFJUTDgxOVhfREVGQVVMVF9SRl9UWVBFOwogCiAJaWYocHJpdi0+Y2FyZF84MTkyX3ZlcnNpb24gPiBWRVJTSU9OXzgxOTBfQkQpCkBAIC0zNTU0LDcgKzM1NTQsNyBAQAogCS8vc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOwogCS8qIHByZXBhcmUgbWlzYyBpbmZvIGZvciB0aGUgYmVhY29uIHhtaXQgKi8KIAl0Y2JfZGVzYy0+cXVldWVfaW5kZXggPSBCRUFDT05fUVVFVUU7Ci0JLyogSUJTUyBkb2VzIG5vdCBzdXBwb3J0IEhUIHlldCwgdXNlIDFNIGRlZmF1dGx5ICovCisJLyogSUJTUyBkb2VzIG5vdCBzdXBwb3J0IEhUIHlldCwgdXNlIDFNIGRlZmF1bHRseSAqLwogCXRjYl9kZXNjLT5kYXRhX3JhdGUgPSAyOwogCXRjYl9kZXNjLT5SQVRSSW5kZXggPSA3OwogCXRjYl9kZXNjLT5iVHhEaXNhYmxlUmF0ZUZhbGxCYWNrID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfZG0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfZG0uYwppbmRleCBiZjg3NjMyLi41ZmZiNGY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2RtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9kbS5jCkBAIC00NTUsNyArNDU1LDcgQEAKIAkJCQkJKHByYS0+bG93X3Jzc2lfdGhyZXNoX2Zvcl9yYTQwTSk6KHByYS0+bG93X3Jzc2lfdGhyZXNoX2Zvcl9yYTIwTSk7CiAJCX0KIAotCQkvL0RiZ1ByaW50KCJbRE1dIFRIcmVzaCBIL0w9JWQvJWRcblxyIiwgUkFUUi5IaWdoUlNTSVRocmVzaEZvclJBLCBSQVRSLkxvd1JTU0lUaHJlc2hGb3JSQSk7CisJCS8vRGJnUHJpbnQoIltETV0gVGhyZXNoIEgvTD0lZC8lZFxuXHIiLCBSQVRSLkhpZ2hSU1NJVGhyZXNoRm9yUkEsIFJBVFIuTG93UlNTSVRocmVzaEZvclJBKTsKIAkJaWYocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+PSAobG9uZylIaWdoUlNTSVRocmVzaEZvclJBKQogCQl7CiAJCQkvL0RiZ1ByaW50KCJbRE1dIFJTU0k9JWQgU1RBPUhJR0hcblxyIiwgcEhhbERhdGEtPlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCKTsKQEAgLTU3MSw3ICs1NzEsNyBAQAogCTB4NWE0MDAxNjksCS8vIDMsICszZGIKIAkweDUwODAwMTQyLAkvLyA0LCArMmRiCiAJMHg0N2MwMDExZiwJLy8gNSwgKzFkYgotCTB4NDAwMDAxMDAsCS8vIDYsICswZGIgPT09PiBkZWZhdWx0LCB1cHBlciBmb3IgaGlnaGVyIHRlbXByYXR1cmUsIGxvd2VyIGZvciBsb3cgdGVtcHJhdHVyZQorCTB4NDAwMDAxMDAsCS8vIDYsICswZGIgPT09PiBkZWZhdWx0LCB1cHBlciBmb3IgaGlnaGVyIHRlbXBlcmF0dXJlLCBsb3dlciBmb3IgbG93IHRlbXBlcmF0dXJlCiAJMHgzOTAwMDBlNCwJLy8gNywgLTFkYgogCTB4MzJjMDAwY2IsCS8vIDgsIC0yZGIKIAkweDJkNDAwMGI1LAkvLyA5LCAtM2RiCkBAIC05MzIsMTQgKzkzMiwxNCBAQAogCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJSZWFkYmFjayBUaGVybWFsTWV0ZXJBID0gJWQgXG4iLCB0bXBSZWdBKTsKIAlpZih0bXBSZWdBIDwgMyB8fCB0bXBSZWdBID4gMTMpCiAJCXJldHVybjsKLQlpZih0bXBSZWdBID49IDEyKQkvLyBpZiBvdmVyIDEyLCBUUCB3aWxsIGJlIGJhZCB3aGVuIGhpZ2ggdGVtcHJhdHVyZQorCWlmKHRtcFJlZ0EgPj0gMTIpCS8vIGlmIG92ZXIgMTIsIFRQIHdpbGwgYmUgYmFkIHdoZW4gaGlnaCB0ZW1wZXJhdHVyZQogCQl0bXBSZWdBID0gMTI7CiAJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlZhbGlkIFRoZXJtYWxNZXRlckEgPSAlZCBcbiIsIHRtcFJlZ0EpOwogCXByaXYtPlRoZXJtYWxNZXRlclswXSA9IFRoZXJtYWxNZXRlclZhbDsJLy9XZSB1c2UgZml4ZWQgdmFsdWUgYnkgQnJ5YW50J3Mgc3VnZ2VzdGlvbgogCXByaXYtPlRoZXJtYWxNZXRlclsxXSA9IFRoZXJtYWxNZXRlclZhbDsJLy9XZSB1c2UgZml4ZWQgdmFsdWUgYnkgQnJ5YW50J3Mgc3VnZ2VzdGlvbgogCi0JLy9HZXQgY3VycmVudCBSRi1BIHRlbXByYXR1cmUgaW5kZXgKLQlpZihwcml2LT5UaGVybWFsTWV0ZXJbMF0gPj0gKHU4KXRtcFJlZ0EpCS8vbG93ZXIgdGVtcHJhdHVyZQorCS8vR2V0IGN1cnJlbnQgUkYtQSB0ZW1wZXJhdHVyZSBpbmRleAorCWlmKHByaXYtPlRoZXJtYWxNZXRlclswXSA+PSAodTgpdG1wUmVnQSkJLy9sb3dlciB0ZW1wZXJhdHVyZQogCXsKIAkJdG1wT0ZETWluZGV4ID0gdG1wQ0NLMjBNaW5kZXggPSA2Kyhwcml2LT5UaGVybWFsTWV0ZXJbMF0tKHU4KXRtcFJlZ0EpOwogCQl0bXBDQ0s0ME1pbmRleCA9IHRtcENDSzIwTWluZGV4IC0gNjsKQEAgLTk1Myw3ICs5NTMsNyBAQAogCWVsc2UKIAl7CiAJCXRtcHZhbCA9ICgodTgpdG1wUmVnQSAtIHByaXYtPlRoZXJtYWxNZXRlclswXSk7Ci0JCWlmKHRtcHZhbCA+PSA2KQkJCQkJCQkJLy8gaGlnaGVyIHRlbXByYXR1cmUKKwkJaWYodG1wdmFsID49IDYpCQkJCQkJCQkvLyBoaWdoZXIgdGVtcGVyYXR1cmUKIAkJCXRtcE9GRE1pbmRleCA9IHRtcENDSzIwTWluZGV4ID0gMDsJCS8vIG1heCB0byArNmRCCiAJCWVsc2UKIAkJCXRtcE9GRE1pbmRleCA9IHRtcENDSzIwTWluZGV4ID0gNiAtIHRtcHZhbDsKQEAgLTIwMTcsNyArMjAxNyw3IEBACiAJZG1fZGlndGFibGUuZGJnX21vZGUgPSBETV9EQkdfT0ZGOwkvL29mZj1ieSByZWFsIHJzc2kgdmFsdWUsIG9uPWJ5IERNX0RpZ1RhYmxlLlJzc2lfdmFsIGZvciBuZXcgZGlnCiAJZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobV9zd2l0Y2ggPSAwOwogCi0JLyogMjAwNy8xMC8wNCBNSCBEZWZpbmUgaW5pdCBnYWluIHRocmVzaG9sLiAqLworCS8qIDIwMDcvMTAvMDQgTUggRGVmaW5lIGluaXQgZ2FpbiB0aHJlc2hvbGQuICovCiAJZG1fZGlndGFibGUuZGlnX3N0YXRlCQk9IERNX1NUQV9ESUdfTUFYOwogCWRtX2RpZ3RhYmxlLmRpZ19oaWdocHdyX3N0YXRlCT0gRE1fU1RBX0RJR19NQVg7CiAJZG1fZGlndGFibGUuaW5pdGlhbGdhaW5fbG93ZXJib3VuZF9zdGF0ZSA9IGZhbHNlOwpAQCAtMjE0NSw3ICsyMTQ1LDcgQEAKIAkvKkRiZ1ByaW50KCJESUcgQ2hlY2tcblxyIFJTU0k9JWQgTE9XPSVkIEhJR0g9JWQgU1RBVEU9JWQiLAogCXBIYWxEYXRhLT5VbmRlY29yYXRlZFNtb290aGVkUFdEQiwgRE1fRGlnVGFibGUuUnNzaUxvd1RocmVzaCwKIAlETV9EaWdUYWJsZS5Sc3NpSGlnaFRocmVzaCwgRE1fRGlnVGFibGUuRGlnX1N0YXRlKTsqLwotCS8qIDEuIFdoZW4gUlNTSSBkZWNyZWFzZSwgV2UgaGF2ZSB0byBqdWRnZSBpZiBpdCBpcyBzbWFsbGVyIHRoYW4gYSB0cmVzaG9sZAorCS8qIDEuIFdoZW4gUlNTSSBkZWNyZWFzZSwgV2UgaGF2ZSB0byBqdWRnZSBpZiBpdCBpcyBzbWFsbGVyIHRoYW4gYSB0aHJlc2hvbGQKIAkJICBhbmQgdGhlbiBleGVjdXRlIGJlbG93IHN0ZXAuICovCiAJaWYgKChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDw9IGRtX2RpZ3RhYmxlLnJzc2lfbG93X3RocmVzaCkpCiAJewpAQCAtMjIwNSw3ICsyMjA1LDcgQEAKIAogCX0KIAotCS8qIDIuIFdoZW4gUlNTSSBpbmNyZWFzZSwgV2UgaGF2ZSB0byBqdWRnZSBpZiBpdCBpcyBsYXJnZXIgdGhhbiBhIHRyZXNob2xkCisJLyogMi4gV2hlbiBSU1NJIGluY3JlYXNlLCBXZSBoYXZlIHRvIGp1ZGdlIGlmIGl0IGlzIGxhcmdlciB0aGFuIGEgdGhyZXNob2xkCiAJCSAgYW5kIHRoZW4gZXhlY3V0ZSBiZWxvdyBzdGVwLiAgKi8KIAlpZiAoKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0gZG1fZGlndGFibGUucnNzaV9oaWdoX3RocmVzaCkgKQogCXsKQEAgLTIzMTQsNyArMjMxNCw3IEBACiAJfQogCiAJLyogMy4gV2hlbiBSU1NJID43NSUgb3IgPDcwJSwgaXQgaXMgYSBoaWdoIHBvd2VyIGlzc3VlLiBXZSBoYXZlIHRvIGp1ZGdlIGlmCi0JCSAgaXQgaXMgbGFyZ2VyIHRoYW4gYSB0cmVzaG9sZCBhbmQgdGhlbiBleGVjdXRlIGJlbG93IHN0ZXAuICAqLworCQkgIGl0IGlzIGxhcmdlciB0aGFuIGEgdGhyZXNob2xkIGFuZCB0aGVuIGV4ZWN1dGUgYmVsb3cgc3RlcC4gICovCiAJLy8gMjAwOC8wMi8wNSBNSCBTRDMtSmVycnkgTW9kaWZ5IFBEX1RIIGZvciBoaWdoIHBvd2VyIGlzc3VlLgogCWlmIChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IGRtX2RpZ3RhYmxlLnJzc2lfaGlnaF9wb3dlcl9oaWdodGhyZXNoKQogCXsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfd3guYwppbmRleCBlOWU3OTljLi5kMWViODkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX3d4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV93eC5jCkBAIC00NDYsNyArNDQ2LDcgQEAKIAlyYW5nZS0+bWF4X3F1YWwudXBkYXRlZCA9IDc7IC8qIFVwZGF0ZWQgYWxsIHRocmVlICovCiAKIAlyYW5nZS0+YXZnX3F1YWwucXVhbCA9IDkyOyAvKiA+IDglIG1pc3NlZCBiZWFjb25zIGlzICdiYWQnICovCi0JLyogVE9ETzogRmluZCByZWFsICdnb29kJyB0byAnYmFkJyB0aHJlc2hvbCB2YWx1ZSBmb3IgUlNTSSAqLworCS8qIFRPRE86IEZpbmQgcmVhbCAnZ29vZCcgdG8gJ2JhZCcgdGhyZXNob2xkIHZhbHVlIGZvciBSU1NJICovCiAJcmFuZ2UtPmF2Z19xdWFsLmxldmVsID0gMjAgKyAtOTg7CiAJcmFuZ2UtPmF2Z19xdWFsLm5vaXNlID0gMDsKIAlyYW5nZS0+YXZnX3F1YWwudXBkYXRlZCA9IDc7IC8qIFVwZGF0ZWQgYWxsIHRocmVlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOXhFX2NtZHBrdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTl4RV9jbWRwa3QuYwppbmRleCBkNmI3ZDJmLi4yYWFhNGUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOXhFX2NtZHBrdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5eEVfY21kcGt0LmMKQEAgLTc4Myw3ICs3ODMsNyBAQAogCiAJCQlkZWZhdWx0OgogCi0JCQkgICAgICAgIFJUX1RSQUNFKENPTVBfRVZFTlRTLCAiLS0tLT5jbXBrX21lc3NhZ2VfaGFuZGxlX3J4KCk6dW5rbm93IENNRCBFbGVtZW50XG4iKTsKKwkJCSAgICAgICAgUlRfVFJBQ0UoQ09NUF9FVkVOVFMsICItLS0tPmNtcGtfbWVzc2FnZV9oYW5kbGVfcngoKTp1bmtub3duIENNRCBFbGVtZW50XG4iKTsKIAkJCQlyZXR1cm4gMTsJLyogVGhpcyBpcyBhIGNvbW1hbmQgcGFja2V0LiAqLwogCQl9CiAJCS8vIDIwMDcvMDEvMjIgTUggRGlzcGxheSByZWNlaXZlZCByeCBjb21tYW5kIHBhY2tldCBpbmZvLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTl4RV9waHlyZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5eEVfcGh5cmVnLmgKaW5kZXggZDRhNDM5Mi4uMzdmMGZlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTl4RV9waHlyZWcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOXhFX3BoeXJlZy5oCkBAIC0yOTQsNyArMjk0LDcgQEAKICNkZWZpbmUgYlIyUkNDQU1hc2sgICAgICAgICAgICAgICAJCTB4MDAwMDBmMDAKICNkZWZpbmUgYkhTU0lfUjJURGVsYXkgICAgICAgICAgICAJCTB4ZjgwMDAwMDAKICNkZWZpbmUgYkhTU0lfVDJSRGVsYXkgICAgICAgICAgICAJCTB4ZjgwMDAwCi0jZGVmaW5lIGJDb250VHhIU1NJICAgICAgICAgICAgICAgCQkweDQwMCAgICAgLy9jaGFuZSBnYWluIGF0IGNvbnRpbnVlIFR4CisjZGVmaW5lIGJDb250VHhIU1NJICAgICAgICAgICAgICAgCQkweDQwMCAgICAgLy9jaGFubmVsIGdhaW4gYXQgY29udGludWUgVHgKICNkZWZpbmUgYklHRnJvbUNDSyAgICAgICAgICAgICAgICAJCTB4MjAwCiAjZGVmaW5lIGJBR0NBZGRyZXNzICAgICAgICAgICAgICAgCQkweDNmCiAjZGVmaW5lIGJSeEhQVHggICAgICAgICAgICAgICAgICAgCQkJMHg3MDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L0tjb25maWcKaW5kZXggYjhjOTVmOS4uMTIzZmE2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvS2NvbmZpZwpAQCAtMSw2ICsxLDYgQEAKIGNvbmZpZyBSVEw4MTkyU1UKIAl0cmlzdGF0ZSAiUmVhbFRlayBSVEw4MTkyU1UgV2lyZWxlc3MgTEFOIE5JQyBkcml2ZXIiCi0JZGVwZW5kcyBvbiBQQ0kgJiYgV0xBTgorCWRlcGVuZHMgb24gUENJICYmIFdMQU4gJiYgVVNCCiAJZGVwZW5kcyBvbiBXSVJFTEVTU19FWFQKIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKaW5kZXggYzMzODNiYi4uZThjNjdkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYwpAQCAtMTU2LDcgKzE1Niw3IEBACiAgCWllZWUtPnByaXZhY3lfaW52b2tlZCA9IDA7CiAgCWllZWUtPmllZWU4MDJfMXggPSAxOwogCWllZWUtPnJhd190eCA9IDA7Ci0JLy9pZWVlLT5od3NlY19zdXBwb3J0ID0gMTsgLy9kZWZhbHQgc3VwcG9ydCBodyBzZWN1cml0eS4gLy91c2UgbW9kdWxlX3BhcmFtIGluc3RlYWQuCisJLy9pZWVlLT5od3NlY19zdXBwb3J0ID0gMTsgLy9kZWZhdWx0IHN1cHBvcnQgaHcgc2VjdXJpdHkuIC8vdXNlIG1vZHVsZV9wYXJhbSBpbnN0ZWFkLgogCWllZWUtPmh3c2VjX2FjdGl2ZSA9IDA7IC8vZGlzYWJsZSBod3NlYywgc3dpdGNoIGl0IG9uIHdoZW4gbmVjZXNzYXJ5LgogCiAJaWVlZTgwMjExX3NvZnRtYWNfaW5pdChpZWVlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKaW5kZXggOGU1NmY5Ny4uYWMyMjNjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKQEAgLTM3LDcgKzM3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdGNwLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwppbmRleCBmZDhlMTEyLi4yMDNjMGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKQEAgLTIxMjAsMTAgKzIxMjAsMTAgQEAKICAqIGNhcmUgb2YgdGhlIGllZWU4MDIuMTEgZnJhZ21lbnRhdGlvbi4KICAqIFNvIHRoZSBkcml2ZXIgcmVjZWl2ZXMgYSBmcmFnbWVudCBwZXIgdGltZSBhbmQgbWlnaHQKICAqIGNhbGwgdGhlIHN0b3AgZnVuY3Rpb24gd2hlbiBpdCB3YW50IHdpdGhvdXQgdGFrZSBjYXJlCi0gKiB0byBoYXZlIGVub3VnaHQgcm9vbSB0byBUWCBhbiBlbnRpcmUgcGFja2V0LgorICogdG8gaGF2ZSBlbm91Z2ggcm9vbSB0byBUWCBhbiBlbnRpcmUgcGFja2V0LgogICogVGhpcyBtaWdodCBiZSB1c2VmdWwgaWYgZWFjaCBmcmFnbWVudCBuZWVkIGl0J3Mgb3duCiAgKiBkZXNjcmlwdG9yLCB0aHVzIGp1c3Qga2VlcCBhIHRvdGFsIGZyZWUgbWVtb3J5ID4gdGhhbgotICogdGhlIG1heCBmcmFnbWVudGF0aW9uIHRyZXNob2xkIGlzIG5vdCBlbm91Z2h0Li4gSWYgdGhlCisgKiB0aGUgbWF4IGZyYWdtZW50YXRpb24gdGhyZXNob2xkIGlzIG5vdCBlbm91Z2guLiBJZiB0aGUKICAqIGllZWU4MDIuMTEgc3RhY2sgcGFzc2VkIGEgVFhCIHN0cnVjdCB0aGVuIHlvdSBuZWVkZWQKICAqIHRvIGtlZXAgTiBmcmVlIGRlc2NyaXB0b3JzIHdoZXJlCiAgKiBOID0gTUFYX1BBQ0tFVF9TSVpFIC8gTUlOX0ZSQUdfVFJFU0hPTEQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKaW5kZXggNDdmZjBlZi4uNjA2MjFkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKQEAgLTQ3LDcgKzQ3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdGNwLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCmluZGV4IDYxNDZjNjQuLjg1YzdlOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCkBAIC0zMCw3ICszMCw2IEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL3JlYWRtZSBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL3JlYWRtZQppbmRleCA1NzY0ZjI4Li43YmExNzdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9yZWFkbWUKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvcmVhZG1lCkBAIC0zNyw3ICszNyw3IEBACiAgIGRpc2Fzc29jaWF0ZSBjbGllbnRzLCBhbmQgaXQgaXMgcmVhbGx5IHByb25lIHRvIGFsd2F5cyBhbGxvdyBhY2Nlc3MuCiAgIEluIGJzcyBjbGllbnQgbW9kZSBpdCBpcyBhIGJpdCByb3VnaCB3aXRoIEFQIGRlYXV0aCBhbmQgZGlzYXNzb2MgcmVxdWVzdHMuCiAtIEl0IGhhcyBub3QgYW55IGVudHJ5IHBvaW50IHRvIHZpZXcgdGhlIGNvbGxlY3RlZCBzdGF0cy4KLS0gQWx0b3VnaHQgaXQgdGFrZXMgY2FyZSBvZiB0aGUgY2FyZCBzdXBwb3J0ZWQgcmF0ZXMgaW4gdGhlIG1hbmFnZW1lbnQgZnJhbWUKKy0gQWx0aG91Z2ggaXQgdGFrZXMgY2FyZSBvZiB0aGUgY2FyZCBzdXBwb3J0ZWQgcmF0ZXMgaW4gdGhlIG1hbmFnZW1lbnQgZnJhbWUKICAgaXQgc2VuZHMsIHN1cHBvcnQgZm9yIHJhdGUgY2hhbmdpbmcgb24gVFhlZCBwYWNrZXQgaXMgbm90IGNvbXBsZXRlLgogLSBHaXZlIHVwIG9uY2UgYXNzb2NpYXRlZCBpbiBic3MgY2xpZW50IG1vZGUgKGl0IG5ldmVyIGRldGVjdCBhCiAgIHNpZ25hbCBsb3NzIGNvbmRpdGlvbiB0byBkaXNhc3NvY2lhdGUgYW5kIHJlc3RhcnQgc2Nhbm5pbmcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyU19waHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJTX3BoeS5jCmluZGV4IDJjMTExZDcuLjc3YWIwMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJTX3BoeS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJTX3BoeS5jCkBAIC0xNzI4LDcgKzE3MjgsNyBAQAogCiAJCQlkZWZhdWx0OgogCQkJCWJSZXN1bHQgPSBGQUxTRTsKLQkJCQkvL1JUX0FTU0VSVChGQUxTRSwgKCJwaHlfU2V0UkZQb3dlclN0YXRlODE5MlNVKCk6IHVua25vdyBzdGF0ZSB0byBzZXQ6IDB4JVghISFcbiIsIGVSRlBvd2VyU3RhdGUpKTsKKwkJCQkvL1JUX0FTU0VSVChGQUxTRSwgKCJwaHlfU2V0UkZQb3dlclN0YXRlODE5MlNVKCk6IHVua25vd24gc3RhdGUgdG8gc2V0OiAweCVYISEhXG4iLCBlUkZQb3dlclN0YXRlKSk7CiAJCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CkBAIC0yNzExLDcgKzI3MTEsNyBAQAogLy8gSG93ZXZlciwgdGhpcyBwcm9jZWR1cmUgaXMgcGVyZm9ybWVkIHN5bmNocm9ub3VzbHkgIHdoaWNoIHNob3VsZCBiZSBydW5uaW5nIHVuZGVyCiAvLyBwYXNzaXZlIGxldmVsLgogLy8KLS8vbm90IHVuZGVyc3RhbnQgaXQKKy8vbm90IHVuZGVyc3RhbmQgaXQKIHZvaWQgUEhZX1N3Q2hubFBoeTgxOTJTKAkvLyBPbmx5IGNhbGxlZCBkdXJpbmcgaW5pdGlhbGl6ZQogCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCiAJdTgJCWNoYW5uZWwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJTX3BoeXJlZy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNfcGh5cmVnLmgKaW5kZXggYWNmNjQ0Zi4uMmU0ZDc2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNfcGh5cmVnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNfcGh5cmVnLmgKQEAgLTQ1Myw3ICs0NTMsNyBAQAogI2RlZmluZQkJYlIyUkNDQU1hc2sgICAgICAgICAgICAgICAJCQkweDAwMDAwZjAwCiAjZGVmaW5lCQliSFNTSV9SMlREZWxheSAgICAgICAgICAgIAkJMHhmODAwMDAwMAogI2RlZmluZQkJYkhTU0lfVDJSRGVsYXkgICAgICAgICAgICAJCTB4ZjgwMDAwCi0jZGVmaW5lCQliQ29udFR4SFNTSSAgICAgICAgICAgICAgIAkJCTB4NDAwICAgICAvL2NoYW5lIGdhaW4gYXQgY29udGludWUgVHgKKyNkZWZpbmUJCWJDb250VHhIU1NJICAgICAgICAgICAgICAgCQkJMHg0MDAgICAgIC8vY2hhbm5lbCBnYWluIGF0IGNvbnRpbnVlIFR4CiAjZGVmaW5lCQliSUdGcm9tQ0NLICAgICAgICAgICAgICAgIAkJCTB4MjAwCiAjZGVmaW5lCQliQUdDQWRkcmVzcyAgICAgICAgICAgICAgIAkJCTB4M2YKICNkZWZpbmUJCWJSeEhQVHggICAgICAgICAgICAgICAgICAgCQkJMHg3MDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyU19ydGw2MDUyLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyU19ydGw2MDUyLmMKaW5kZXggNjllZjZkZi4uMjIzOTgwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNfcnRsNjA1Mi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJTX3J0bDYwNTIuYwpAQCAtMzI2LDcgKzMyNiw3IEBACiAKIAkJLy8KIAkJLy8gSWYgcGF0aCBBIGFuZCBQYXRoIEIgY29leGlzdCwgd2UgbXVzdCBsaW1pdCBQYXRoIEEgdHggcG93ZXIuCi0JCS8vIFByb3RlY3QgUGF0aCBCIHB3ciBvdmVyIG9yIHVuZGVyIGZsb3cuIFdlIG5lZWQgdG8gY2FsY3VsYXRlIHVwcGVyIGFuZAorCQkvLyBQcm90ZWN0IFBhdGggQiBwd3Igb3ZlciBvciB1bmRlcmZsb3cuIFdlIG5lZWQgdG8gY2FsY3VsYXRlIHVwcGVyIGFuZAogCQkvLyBsb3dlciBib3VuZCBvZiBwYXRoIEEgdHggcG93ZXIuCiAJCS8vCiAJCWlmIChwcml2LT5yZl90eXBlID09IFJGXzJUMlIpCkBAIC0zNTQsNyArMzU0LDcgQEAKIAogCQkJLy8KIAkJCS8vIElmIHBhdGggQSBhbmQgUGF0aCBCIGNvZXhpc3QsIHdlIG11c3QgbGltaXQgUGF0aCBBIHR4IHBvd2VyLgotCQkJLy8gUHJvdGVjdCBQYXRoIEIgcHdyIG92ZXIgb3IgdW5kZXIgZmxvdy4gV2UgbmVlZCB0byBjYWxjdWxhdGUgdXBwZXIgYW5kCisJCQkvLyBQcm90ZWN0IFBhdGggQiBwd3IgdW5kZXIvb3ZlciBmbG93LiBXZSBuZWVkIHRvIGNhbGN1bGF0ZSB1cHBlciBhbmQKIAkJCS8vIGxvd2VyIGJvdW5kIG9mIHBhdGggQSB0eCBwb3dlci4KIAkJCS8vCiAJCQlpZiAocHJpdi0+cmZfdHlwZSA9PSBSRl8yVDJSKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlVfZG0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJVX2RtLmMKaW5kZXggNTM1OGFlOC4uNzg5MWU5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlVfZG0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyVV9kbS5jCkBAIC01OTMsNyArNTkzLDcgQEAKIAkweDVhNDAwMTY5LAkvLyAzLCArM2RiCiAJMHg1MDgwMDE0MiwJLy8gNCwgKzJkYgogCTB4NDdjMDAxMWYsCS8vIDUsICsxZGIKLQkweDQwMDAwMTAwLAkvLyA2LCArMGRiID09PT4gZGVmYXVsdCwgdXBwZXIgZm9yIGhpZ2hlciB0ZW1wcmF0dXJlLCBsb3dlciBmb3IgbG93IHRlbXByYXR1cmUKKwkweDQwMDAwMTAwLAkvLyA2LCArMGRiID09PT4gZGVmYXVsdCwgdXBwZXIgZm9yIGhpZ2hlciB0ZW1wZXJhdHVyZSwgbG93ZXIgZm9yIGxvdyB0ZW1wZXJhdHVyZQogCTB4MzkwMDAwZTQsCS8vIDcsIC0xZGIKIAkweDMyYzAwMGNiLAkvLyA4LCAtMmRiCiAJMHgyZDQwMDBiNSwJLy8gOSwgLTNkYgpAQCAtOTEyLDE0ICs5MTIsMTQgQEAKIAlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiUmVhZGJhY2sgVGhlcm1hbE1ldGVyQSA9ICVkIFxuIiwgdG1wUmVnQSk7CiAJaWYodG1wUmVnQSA8IDMgfHwgdG1wUmVnQSA+IDEzKQogCQlyZXR1cm47Ci0JaWYodG1wUmVnQSA+PSAxMikJLy8gaWYgb3ZlciAxMiwgVFAgd2lsbCBiZSBiYWQgd2hlbiBoaWdoIHRlbXByYXR1cmUKKwlpZih0bXBSZWdBID49IDEyKQkvLyBpZiBvdmVyIDEyLCBUUCB3aWxsIGJlIGJhZCB3aGVuIGhpZ2ggdGVtcGVyYXR1cmUKIAkJdG1wUmVnQSA9IDEyOwogCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJWYWxpZCBUaGVybWFsTWV0ZXJBID0gJWQgXG4iLCB0bXBSZWdBKTsKIAlwcml2LT5UaGVybWFsTWV0ZXJbMF0gPSBUaGVybWFsTWV0ZXJWYWw7CS8vV2UgdXNlIGZpeGVkIHZhbHVlIGJ5IEJyeWFudCdzIHN1Z2dlc3Rpb24KIAlwcml2LT5UaGVybWFsTWV0ZXJbMV0gPSBUaGVybWFsTWV0ZXJWYWw7CS8vV2UgdXNlIGZpeGVkIHZhbHVlIGJ5IEJyeWFudCdzIHN1Z2dlc3Rpb24KIAotCS8vR2V0IGN1cnJlbnQgUkYtQSB0ZW1wcmF0dXJlIGluZGV4Ci0JaWYocHJpdi0+VGhlcm1hbE1ldGVyWzBdID49ICh1OCl0bXBSZWdBKQkvL2xvd2VyIHRlbXByYXR1cmUKKwkvL0dldCBjdXJyZW50IFJGLUEgdGVtcGVyYXR1cmUgaW5kZXgKKwlpZihwcml2LT5UaGVybWFsTWV0ZXJbMF0gPj0gKHU4KXRtcFJlZ0EpCS8vbG93ZXIgdGVtcGVyYXR1cmUKIAl7CiAJCXRtcE9GRE1pbmRleCA9IHRtcENDSzIwTWluZGV4ID0gNisocHJpdi0+VGhlcm1hbE1ldGVyWzBdLSh1OCl0bXBSZWdBKTsKIAkJdG1wQ0NLNDBNaW5kZXggPSB0bXBDQ0syME1pbmRleCAtIDY7CkBAIC05MzMsNyArOTMzLDcgQEAKIAllbHNlCiAJewogCQl0bXB2YWwgPSAoKHU4KXRtcFJlZ0EgLSBwcml2LT5UaGVybWFsTWV0ZXJbMF0pOwotCQlpZih0bXB2YWwgPj0gNikJCQkJCQkJCS8vIGhpZ2hlciB0ZW1wcmF0dXJlCisJCWlmKHRtcHZhbCA+PSA2KQkJCQkJCQkJLy8gaGlnaGVyIHRlbXBlcmF0dXJlCiAJCQl0bXBPRkRNaW5kZXggPSB0bXBDQ0syME1pbmRleCA9IDA7CQkvLyBtYXggdG8gKzZkQgogCQllbHNlCiAJCQl0bXBPRkRNaW5kZXggPSB0bXBDQ0syME1pbmRleCA9IDYgLSB0bXB2YWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyVV93eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlVfd3guYwppbmRleCAyMjA4YzliLi5hN2NjNmY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyVV93eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJVX3d4LmMKQEAgLTQzNSw3ICs0MzUsNyBAQAogCXJhbmdlLT5tYXhfcXVhbC51cGRhdGVkID0gNzsgLyogVXBkYXRlZCBhbGwgdGhyZWUgKi8KIAogCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gOTI7IC8qID4gOCUgbWlzc2VkIGJlYWNvbnMgaXMgJ2JhZCcgKi8KLQkvKiBUT0RPOiBGaW5kIHJlYWwgJ2dvb2QnIHRvICdiYWQnIHRocmVzaG9sIHZhbHVlIGZvciBSU1NJICovCisJLyogVE9ETzogRmluZCByZWFsICdnb29kJyB0byAnYmFkJyB0aHJlc2hvbGQgdmFsdWUgZm9yIFJTU0kgKi8KIAlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAyMCArIC05ODsKIAlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSAwOwogCXJhbmdlLT5hdmdfcXVhbC51cGRhdGVkID0gNzsgLyogVXBkYXRlZCBhbGwgdGhyZWUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOXhVX2NtZHBrdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5eFVfY21kcGt0LmMKaW5kZXggZTJiYTkzZS4uM2ViZmU3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5eFVfY21kcGt0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5eFVfY21kcGt0LmMKQEAgLTY5Nyw3ICs2OTcsNyBAQAogCiAJCQlkZWZhdWx0OgogCi0JCQkgICAgICAgIFJUX1RSQUNFKENPTVBfRVJSLCAiLS0tLT5jbXBrX21lc3NhZ2VfaGFuZGxlX3J4KCk6dW5rbm93IENNRCBFbGVtZW50XG4iKTsKKwkJCSAgICAgICAgUlRfVFJBQ0UoQ09NUF9FUlIsICItLS0tPmNtcGtfbWVzc2FnZV9oYW5kbGVfcngoKTp1bmtub3duIENNRCBFbGVtZW50XG4iKTsKIAkJCQlyZXR1cm4gMTsJLyogVGhpcyBpcyBhIGNvbW1hbmQgcGFja2V0LiAqLwogCQl9CiAJCS8vIDIwMDcvMDEvMjIgTUggRGlzcGxheSByZWNlaXZlZCByeCBjb21tYW5kIHBhY2tldCBpbmZvLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTEzYWI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L0tjb25maWcKQEAgLTAsMCArMSw2IEBACitjb25maWcgUlRMODE5MlUKKwl0cmlzdGF0ZSAiUmVhbFRlayBSVEw4MTkyVSBXaXJlbGVzcyBMQU4gTklDIGRyaXZlciIKKwlkZXBlbmRzIG9uIFBDSSAmJiBXTEFOICYmIFVTQgorCWRlcGVuZHMgb24gV0lSRUxFU1NfRVhUCisJZGVmYXVsdCBOCisJLS0taGVscC0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNTljNGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvTWFrZWZpbGUKQEAgLTAsMCArMSwzMyBAQAorTklDX1NFTEVDVCA9IFJUTDgxOTJVCisKK0VYVFJBX0NGTEFHUyArPSAtc3RkPWdudTg5CitFWFRSQV9DRkxBR1MgKz0gLU8yCisKK0VYVFJBX0NGTEFHUyArPSAtbWhhcmQtZmxvYXQgLURDT05GSUdfRk9SQ0VfSEFSRF9GTE9BVD15CitFWFRSQV9DRkxBR1MgKz0gLURKQUNLU09OX05FV184MTg3IC1ESkFDS1NPTl9ORVdfUlgKK0VYVFJBX0NGTEFHUyArPSAtRFRIT01BU19CRUFDT04gLURUSE9NQVNfVEFTS0xFVCAtRFRIT01BU19TS0IgLURUSE9NQVNfVFVSQk8KKyNFWFRSQV9DRkxBR1MgKz0gLURVU0JfVFhfRFJJVkVSX0FHR1JFR0FUSU9OX0VOQUJMRQorI0VYVFJBX0NGTEFHUyArPSAtRFVTQl9SWF9BR0dSRUdBVElPTl9TVVBQT1JUCitFWFRSQV9DRkxBR1MgKz0gLURVU0VfT05FX1BJUEUKK0VYVFJBX0NGTEFHUyArPSAtREVOQUJMRV9ET1QxMUQKK0VYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEKKworcjgxOTJ1X3VzYi1vYmpzIDo9IHI4MTkyVV9jb3JlLm8gcjgxODBfOTNjeDYubyByODE5MlVfd3gubwkJXAorCQkgIHI4MTkwX3J0bDgyNTYubyByODE5eFVfcGh5Lm8gcjgxOXhVX2Zpcm13YXJlLm8JXAorCQkgIHI4MTl4VV9jbWRwa3QubyByODE5MlVfZG0ubyByODE5eFVfZmlybXdhcmVfaW1nLm8JXAorCQkgIGllZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQubwkJCQlcCisJCSAgaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF90a2lwLm8JCQlcCisJCSAgaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLm8JCQlcCisJCSAgaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAubwkJCVwKKwkJICBpZWVlODAyMTEvaWVlZTgwMjExX3J4Lm8JCQkJXAorCQkgIGllZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5vCQkJCVwKKwkJICBpZWVlODAyMTEvaWVlZTgwMjExX3R4Lm8JCQkJXAorCQkgIGllZWU4MDIxMS9pZWVlODAyMTFfd3gubwkJCQlcCisJCSAgaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUubwkJCQlcCisJCSAgaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjX3d4Lm8JCQlcCisJCSAgaWVlZTgwMjExL3J0bDgxOXhfSFRQcm9jLm8JCQkJXAorCQkgIGllZWU4MDIxMS9ydGw4MTl4X1RTUHJvYy5vCQkJCVwKKwkJICBpZWVlODAyMTEvcnRsODE5eF9CQVByb2MubwkJCQlcCisJCSAgaWVlZTgwMjExL2RvdDExZC5vCisKK29iai0kKENPTkZJR19SVEw4MTkyVSkgKz0gcjgxOTJ1X3VzYi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvYXV0aG9ycyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9hdXRob3JzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOGJiYWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvYXV0aG9ycwpAQCAtMCwwICsxIEBACitBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvY2hhbmdlcyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9jaGFuZ2VzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YzMzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvY2hhbmdlcwpAQCAtMCwwICsxLDUgQEAKK3YgMC4xCisKK0ZpcnN0IHZlcnNpb24uCitUaGlzIGlzIGJhc2VkIG9uIHRoZSBydGw4MTgwLXNhMjQwMCBwcmUtMC4yMi1DVlMgY29kZS4uCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9jb3B5aW5nIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2NvcHlpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYwYzMxYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9jb3B5aW5nCkBAIC0wLDAgKzEsMzQwIEBACisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKwwKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCithIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCittZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgordGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCitsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCit0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCitzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKK2NvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKK2NvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKK25vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKK2FuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoreW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CisgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CisgICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAorICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKKyAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKKyAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCisgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKKyAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAorICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKwwKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorDAorICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorDAorICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKK3Rob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCit0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCisgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKK1BST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAorUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKwkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcword2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKKworICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgeWVhciAgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9kb3QxMWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9kb3QxMWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWI3YTRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2RvdDExZC5oCkBAIC0wLDAgKzEsMTAyIEBACisjaWZuZGVmIF9fSU5DX0RPVDExRF9ICisjZGVmaW5lIF9fSU5DX0RPVDExRF9ICisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCisKKy8vI2RlZmluZSBFTkFCTEVfRE9UMTFECisKKy8vI2RlZmluZSBET1QxMURfTUFYX0NITkxfTlVNIDgzCisKK3R5cGVkZWYgc3RydWN0IF9DSE5MX1RYUE9XRVJfVFJJUExFIHsKKwl1OCBGaXJzdENobmw7CisJdTggIE51bUNobmxzOworCXU4ICBNYXhUeFBvd2VySW5EYm07Cit9Q0hOTF9UWFBPV0VSX1RSSVBMRSwgKlBDSE5MX1RYUE9XRVJfVFJJUExFOworCit0eXBlZGVmIGVudW0gX0RPVDExRF9TVEFURSB7CisJRE9UMTFEX1NUQVRFX05PTkUgPSAwLAorCURPVDExRF9TVEFURV9MRUFSTkVELAorCURPVDExRF9TVEFURV9ET05FLAorfURPVDExRF9TVEFURTsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUX0RPVDExRF9JTkZPIHsKKwkvL0RFQ0xBUkVfUlRfT0JKRUNUKFJUX0RPVDExRF9JTkZPKTsKKworCWJvb2wgYkVuYWJsZWQ7IC8vIGRvdDExTXVsdGlEb21haW5DYXBhYmlsaXR5RW5hYmxlZAorCisJdTE2IENvdW50cnlJZUxlbjsgLy8gPiAwIGlmIENvdW50cnlJZUJ1ZltdIGNvbnRhaW5zIHZhbGlkIGNvdW50cnkgaW5mb3JtYXRpb24gZWxlbWVudC4KKwl1OCAgQ291bnRyeUllQnVmW01BWF9JRV9MRU5dOworCXU4ICBDb3VudHJ5SWVTcmNBZGRyWzZdOyAvLyBTb3VyY2UgQVAgb2YgdGhlIGNvdW50cnkgSUUuCisJdTggIENvdW50cnlJZVdhdGNoZG9nOworCisJdTggIGNoYW5uZWxfbWFwW01BWF9DSEFOTkVMX05VTUJFUisxXTsgIC8vISEhVmFsdWUgMDogSW52YWxpZCwgMTogVmFsaWQgKGFjdGl2ZSBzY2FuKSwgMjogVmFsaWQgKHBhc3NpdmUgc2NhbikKKwkvL3U4ICBDaG5sTGlzdExlbjsgLy8gI0J5dGVzIHZhbGlkIGluIENobmxMaXN0W10uCisJLy91OCAgQ2hubExpc3RbRE9UMTFEX01BWF9DSE5MX05VTV07CisJdTggIE1heFR4UHdyRGJtTGlzdFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CisKKwlET1QxMURfU1RBVEUgU3RhdGU7Cit9UlRfRE9UMTFEX0lORk8sICpQUlRfRE9UMTFEX0lORk87CisjZGVmaW5lIGVxTWFjQWRkcihhLGIpCQkoICgoYSlbMF09PShiKVswXSAmJiAoYSlbMV09PShiKVsxXSAmJiAoYSlbMl09PShiKVsyXSAmJiAoYSlbM109PShiKVszXSAmJiAoYSlbNF09PShiKVs0XSAmJiAoYSlbNV09PShiKVs1XSkgPyAxOjAgKQorI2RlZmluZSBjcE1hY0FkZHIoZGVzLHNyYykJICAgICAgKChkZXMpWzBdPShzcmMpWzBdLChkZXMpWzFdPShzcmMpWzFdLChkZXMpWzJdPShzcmMpWzJdLChkZXMpWzNdPShzcmMpWzNdLChkZXMpWzRdPShzcmMpWzRdLChkZXMpWzVdPShzcmMpWzVdKQorI2RlZmluZSBHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldikgKChQUlRfRE9UMTFEX0lORk8pKChfX3BJZWVlRGV2KS0+cERvdDExZEluZm8pKQorCisjZGVmaW5lIElTX0RPVDExRF9FTkFCTEUoX19wSWVlZURldikgR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5iRW5hYmxlZAorI2RlZmluZSBJU19DT1VOVFJZX0lFX1ZBTElEKF9fcEllZWVEZXYpIChHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZUxlbiA+IDApCisKKyNkZWZpbmUgSVNfRVFVQUxfQ0lFX1NSQyhfX3BJZWVlRGV2LCBfX3BUYSkgZXFNYWNBZGRyKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllU3JjQWRkciwgX19wVGEpCisjZGVmaW5lIFVQREFURV9DSUVfU1JDKF9fcEllZWVEZXYsIF9fcFRhKSBjcE1hY0FkZHIoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVTcmNBZGRyLCBfX3BUYSkKKworI2RlZmluZSBJU19DT1VOVFJZX0lFX0NIQU5HRUQoX19wSWVlZURldiwgX19JZSkgXAorCSgoKF9fSWUpLkxlbmd0aCA9PSAwIHx8IChfX0llKS5MZW5ndGggIT0gR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVMZW4pID8gXAorCUZBTFNFIDogXAorCSghbWVtY21wKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllQnVmLCAoX19JZSkuT2N0ZXQsIChfX0llKS5MZW5ndGgpKSkKKworI2RlZmluZSBDSUVfV0FUQ0hET0dfVEggMQorI2RlZmluZSBHRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpIEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllV2F0Y2hkb2cKKyNkZWZpbmUgUkVTRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpIEdFVF9DSUVfV0FUQ0hET0coX19wSWVlZURldikgPSAwCisjZGVmaW5lIFVQREFURV9DSUVfV0FUQ0hET0coX19wSWVlZURldikgKytHRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpCisKKyNkZWZpbmUgSVNfRE9UMTFEX1NUQVRFX0RPTkUoX19wSWVlZURldikgKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+U3RhdGUgPT0gRE9UMTFEX1NUQVRFX0RPTkUpCisKKwordm9pZAorRG90MTFkX0luaXQoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldgorCSk7CisKK3ZvaWQKK0RvdDExZF9SZXNldCgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2CisJKTsKKwordm9pZAorRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2LAorCXU4ICoJCXBUYWRkciwKKwl1MTYJQ291dHJ5SWVMZW4sCisJdTggKiBwQ291dHJ5SWUKKwkpOworCit1OAorRE9UMTFEX0dldE1heFR4UHdySW5EYm0oCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwKKwl1OCBDaGFubmVsCisJKTsKKwordm9pZAorRE9UMTFEX1NjYW5Db21wbGV0ZSgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGRldgorCSk7CisKK2ludCBJc0xlZ2FsQ2hhbm5lbCgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGRldiwKKwl1OCBjaGFubmVsCispOworCitpbnQgVG9MZWdhbENoYW5uZWwoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBkZXYsCisJdTggY2hhbm5lbAorKTsKKyNlbmRpZiAvL0VOQUJMRV9ET1QxMUQKKyNlbmRpZiAvLyAjaWZuZGVmIF9fSU5DX0RPVDExRF9ICmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E0N2YxMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEuaApAQCAtMCwwICsxLDI2MzggQEAKKy8qCisgKiBNZXJnZWQgd2l0aCBtYWlubGluZSBpZWVlODAyMTEuaCBpbiBBdWcgMjAwNC4gIE9yaWdpbmFsIGllZWU4MDJfMTEKKyAqIHJlbWFpbnMgY29weXJpZ2h0IGJ5IHRoZSBvcmlnaW5hbCBhdXRob3JzCisgKgorICogUG9ydGlvbnMgb2YgdGhlIG1lcmdlZCBjb2RlIGFyZSBiYXNlZCBvbiBIb3N0IEFQIChzb2Z0d2FyZSB3aXJlbGVzcworICogTEFOIGFjY2VzcyBwb2ludCkgZHJpdmVyIGZvciBJbnRlcnNpbCBQcmlzbTIvMi41LzMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgKiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBBZGFwdGlvbiB0byBhIGdlbmVyaWMgSUVFRSA4MDIuMTEgc3RhY2sgYnkgSmFtZXMgS2V0cmVub3MKKyAqIDxqa2V0cmVub0BsaW51eC5pbnRlbC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIEludGVsIENvcnBvcmF0aW9uCisgKgorICogTW9kaWZpZWQgZm9yIFJlYWx0ZWsncyB3aS1maSBjYXJkcyBieSBBbmRyZWEgTWVyZWxsbworICogPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgSUVFRTgwMjExX0gKKyNkZWZpbmUgSUVFRTgwMjExX0gKKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPiAvKiBFVEhfQUxFTiAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPiAgIC8qIEFSUkFZX1NJWkUgKi8KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKworI2luY2x1ZGUgImllZWU4MDIxMS9ydGw4MTl4X0hULmgiCisjaW5jbHVkZSAiaWVlZTgwMjExL3J0bDgxOXhfQkEuaCIKKyNpbmNsdWRlICJpZWVlODAyMTEvcnRsODE5eF9UUy5oIgorCisKKyNpZm5kZWYgSVdfTU9ERV9NT05JVE9SCisjZGVmaW5lIElXX01PREVfTU9OSVRPUiA2CisjZW5kaWYKKworI2lmbmRlZiBJV0VWQ1VTVE9NCisjZGVmaW5lIElXRVZDVVNUT00gMHg4YzAyCisjZW5kaWYKKworCisjaWZuZGVmIGNvbnRhaW5lcl9vZgorLyoqCisgKiBjb250YWluZXJfb2YgLSBjYXN0IGEgbWVtYmVyIG9mIGEgc3RydWN0dXJlIG91dCB0byB0aGUgY29udGFpbmluZyBzdHJ1Y3R1cmUKKyAqCisgKiBAcHRyOiAgICAgICAgdGhlIHBvaW50ZXIgdG8gdGhlIG1lbWJlci4KKyAqIEB0eXBlOiAgICAgICB0aGUgdHlwZSBvZiB0aGUgY29udGFpbmVyIHN0cnVjdCB0aGlzIGlzIGVtYmVkZGVkIGluLgorICogQG1lbWJlcjogICAgIHRoZSBuYW1lIG9mIHRoZSBtZW1iZXIgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKgorICovCisjZGVmaW5lIGNvbnRhaW5lcl9vZihwdHIsIHR5cGUsIG1lbWJlcikgKHsgICAgICAgICAgICAgICAgICAgICAgXAorCWNvbnN0IHR5cGVvZiggKCh0eXBlICopMCktPm1lbWJlciApICpfX21wdHIgPSAocHRyKTsgICAgXAorCSh0eXBlICopKCAoY2hhciAqKV9fbXB0ciAtIG9mZnNldG9mKHR5cGUsbWVtYmVyKSApO30pCisjZW5kaWYKKworI2RlZmluZSBLRVlfVFlQRV9OQQkJMHgwCisjZGVmaW5lIEtFWV9UWVBFX1dFUDQwIAkJMHgxCisjZGVmaW5lIEtFWV9UWVBFX1RLSVAJCTB4MgorI2RlZmluZSBLRVlfVFlQRV9DQ01QCQkweDQKKyNkZWZpbmUgS0VZX1RZUEVfV0VQMTA0CQkweDUKKworLyogYWRkZWQgZm9yIHJ0bDgxOXggdHggcHJvY2VkdXJlICovCisjZGVmaW5lIE1BWF9RVUVVRV9TSVpFCQkweDEwCisKKy8vCisvLyA4MTkwIHF1ZXVlIG1hcHBpbmcKKy8vCisjZGVmaW5lIEJLX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQkVfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBWSV9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFZPX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgSENDQV9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBUWENNRF9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIE1HTlRfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgSElHSF9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBCRUFDT05fUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICA4CisKKyNkZWZpbmUgTE9XX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVfUVVFVUUKKyNkZWZpbmUgTk9STUFMX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgTUdOVF9RVUVVRQorCisvL2FkZGVkIGJ5IGFteSBmb3IgcHMKKyNkZWZpbmUgU1dSRl9USU1FT1VUCQkJCTUwCisKKy8vYWRkZWQgYnkgYW15IGZvciBMRUFQIHJlbGF0ZWQKKyNkZWZpbmUgSUVfQ0lTQ09fRkxBR19QT1NJVElPTgkJMHgwOAkvLyBGbGFnIGJ5dGU6IGJ5dGUgOCwgbnVtYmVyZWQgZnJvbSAwLgorI2RlZmluZSBTVVBQT1JUX0NLSVBfTUlDCQkJMHgwOAkvLyBiaXQzCisjZGVmaW5lIFNVUFBPUlRfQ0tJUF9QSwkJCTB4MTAJLy8gYml0NAorLyogZGVmaW5lZCBmb3Igc2tiIGNiIGZpZWxkICovCisvKiBBdCBtb3N0IDI4IGJ5dGUgKi8KK3R5cGVkZWYgc3RydWN0IGNiX2Rlc2MgeworCS8qIFR4IERlc2MgUmVsYXRlZCBmbGFncyAoOC05KSAqLworCXU4IGJMYXN0SW5pUGt0OjE7CisJdTggYkNtZE9ySW5pdDoxOworCXU4IGJGaXJzdFNlZzoxOworCXU4IGJMYXN0U2VnOjE7CisJdTggYkVuY3J5cHQ6MTsKKwl1OCBiVHhEaXNhYmxlUmF0ZUZhbGxCYWNrOjE7CisJdTggYlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlOjE7CisJdTggYkh3U2VjOjE7IC8vaW5kaWNhdGUgd2hldGhlciB1c2UgSHcgc2VjdXJpdHkuIFdCCisKKwl1OCByZXNlcnZlZDE7CisKKwkvKiBUeCBGaXJtd2FyZSBSZWxhZ2VkIGZsYWdzICgxMC0xMSkqLworCXU4IGJDVFNFbmFibGU6MTsKKwl1OCBiUlRTRW5hYmxlOjE7CisJdTggYlVzZVNob3J0R0k6MTsKKwl1OCBiVXNlU2hvcnRQcmVhbWJsZToxOworCXU4IGJUeEVuYWJsZUZ3Q2FsY0R1cjoxOworCXU4IGJBTVBEVUVuYWJsZToxOworCXU4IGJSVFNTVEJDOjE7CisJdTggUlRTU0M6MTsKKworCXU4IGJSVFNCVzoxOworCXU4IGJQYWNrZXRCVzoxOworCXU4IGJSVFNVc2VTaG9ydFByZWFtYmxlOjE7CisJdTggYlJUU1VzZVNob3J0R0k6MTsKKwl1OCBiTXVsdGljYXN0OjE7CisJdTggYkJyb2FkY2FzdDoxOworCS8vdTggcmVzZXJ2ZWQyOjI7CisJdTggZHJ2X2FnZ19lbmFibGU6MTsKKwl1OCByZXNlcnZlZDI6MTsKKworCS8qIFR4IERlc2MgcmVsYXRlZCBlbGVtZW50KDEyLTE5KSAqLworCXU4IHJhdGFfaW5kZXg7CisJdTggcXVldWVfaW5kZXg7CisJLy91OCByZXNlcnZlZDM7CisJLy91OCByZXNlcnZlZDQ7CisJdTE2IHR4YnVmX3NpemU7CisJLy91OCByZXNlcnZlZDU7CisJdTggUkFUUkluZGV4OworCXU4IHJlc2VydmVkNjsKKwl1OCByZXNlcnZlZDc7CisJdTggcmVzZXJ2ZWQ4OworCisJLyogVHggZmlybXdhcmUgcmVsYXRlZCBlbGVtZW50KDIwLTI3KSAqLworCXU4IGRhdGFfcmF0ZTsKKwl1OCBydHNfcmF0ZTsKKwl1OCBhbXBkdV9mYWN0b3I7CisJdTggYW1wZHVfZGVuc2l0eTsKKwkvL3U4IHJlc2VydmVkOTsKKwkvL3U4IHJlc2VydmVkMTA7CisJLy91OCByZXNlcnZlZDExOworCXU4IERydkFnZ3JOdW07CisJdTE2IHBrdF9zaXplOworCXU4IHJlc2VydmVkMTI7Cit9Y2JfZGVzYywgKnBjYl9kZXNjOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBNR05fMU0gICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIE1HTl8yTSAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgTUdOXzVfNU0gICAgICAgICAgICAgICAgMHgwYgorI2RlZmluZSBNR05fMTFNICAgICAgICAgICAgICAgICAweDE2CisKKyNkZWZpbmUgTUdOXzZNICAgICAgICAgICAgICAgICAgMHgwYworI2RlZmluZSBNR05fOU0gICAgICAgICAgICAgICAgICAweDEyCisjZGVmaW5lIE1HTl8xMk0gICAgICAgICAgICAgICAgIDB4MTgKKyNkZWZpbmUgTUdOXzE4TSAgICAgICAgICAgICAgICAgMHgyNAorI2RlZmluZSBNR05fMjRNICAgICAgICAgICAgICAgICAweDMwCisjZGVmaW5lIE1HTl8zNk0gICAgICAgICAgICAgICAgIDB4NDgKKyNkZWZpbmUgTUdOXzQ4TSAgICAgICAgICAgICAgICAgMHg2MAorI2RlZmluZSBNR05fNTRNICAgICAgICAgICAgICAgICAweDZjCisKKyNkZWZpbmUgTUdOX01DUzAgICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBNR05fTUNTMSAgICAgICAgICAgICAgICAweDgxCisjZGVmaW5lIE1HTl9NQ1MyICAgICAgICAgICAgICAgIDB4ODIKKyNkZWZpbmUgTUdOX01DUzMgICAgICAgICAgICAgICAgMHg4MworI2RlZmluZSBNR05fTUNTNCAgICAgICAgICAgICAgICAweDg0CisjZGVmaW5lIE1HTl9NQ1M1ICAgICAgICAgICAgICAgIDB4ODUKKyNkZWZpbmUgTUdOX01DUzYgICAgICAgICAgICAgICAgMHg4NgorI2RlZmluZSBNR05fTUNTNyAgICAgICAgICAgICAgICAweDg3CisjZGVmaW5lIE1HTl9NQ1M4ICAgICAgICAgICAgICAgIDB4ODgKKyNkZWZpbmUgTUdOX01DUzkgICAgICAgICAgICAgICAgMHg4OQorI2RlZmluZSBNR05fTUNTMTAgICAgICAgICAgICAgICAweDhhCisjZGVmaW5lIE1HTl9NQ1MxMSAgICAgICAgICAgICAgIDB4OGIKKyNkZWZpbmUgTUdOX01DUzEyICAgICAgICAgICAgICAgMHg4YworI2RlZmluZSBNR05fTUNTMTMgICAgICAgICAgICAgICAweDhkCisjZGVmaW5lIE1HTl9NQ1MxNCAgICAgICAgICAgICAgIDB4OGUKKyNkZWZpbmUgTUdOX01DUzE1ICAgICAgICAgICAgICAgMHg4ZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCQk4MDIuMTEgTWFuYWdlbWVudCBmcmFtZSBSZWFzb24gQ29kZSBmaWVsZAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitlbnVtCV9SZWFzb25Db2RleworCXVuc3BlY19yZWFzb24JPSAweDEsCisJYXV0aF9ub3RfdmFsaWQJPSAweDIsCisJZGVhdXRoX2x2X3NzCT0gMHgzLAorCWluYWN0aXZpdHkJCT0gMHg0LAorCWFwX292ZXJsb2FkIAk9IDB4NSwKKwljbGFzczJfZXJyCQk9IDB4NiwKKwljbGFzczNfZXJyCQk9IDB4NywKKwlkaXNhc19sdl9zcyAJPSAweDgsCisJYXNvY19ub3RfYXV0aAk9IDB4OSwKKworCS8vLS0tLU1JQ19DSEVDSworCW1pY19mYWlsdXJlIAk9IDB4ZSwKKwkvLy0tLS1FTkQgTUlDX0NIRUNLCisKKwkvLyBSZWFzb24gY29kZSBkZWZpbmVkIGluIDgwMi4xMWkgRDEwLjAgcC4yOC4KKwlpbnZhbGlkX0lFCQk9IDB4MGQsCisJZm91cl93YXlfdG1vdXQJPSAweDBmLAorCXR3b193YXlfdG1vdXQJPSAweDEwLAorCUlFX2Rpc21hdGNoIAk9IDB4MTEsCisJaW52YWxpZF9HY2lwaGVyID0gMHgxMiwKKwlpbnZhbGlkX1BjaXBoZXIgPSAweDEzLAorCWludmFsaWRfQUtNUAk9IDB4MTQsCisJdW5zdXBfUlNOSUV2ZXIgPSAweDE1LAorCWludmFsaWRfUlNOSUUJPSAweDE2LAorCWF1dGhfODAyXzF4X2ZhaWw9IDB4MTcsCisJY2lwZXJfcmVqZWN0CQk9IDB4MTgsCisKKwkvLyBSZWFzb24gY29kZSBkZWZpbmVkIGluIDcuMy4xLjcsIDgwMi4xZSBEMTMuMCwgcC40Mi4gQWRkZWQgYnkgQW5uaWUsIDIwMDUtMTEtMTUuCisJUW9TX3Vuc3BlYwkJPSAweDIwLCAvLyAzMgorCVFBUF9iYW5kd2lkdGgJPSAweDIxLCAvLyAzMworCXBvb3JfY29uZGl0aW9uCT0gMHgyMiwgLy8gMzQKKwlub19mYWNpbGl0eSAJPSAweDIzLCAvLyAzNQorCQkJCQkJCS8vIFdoZXJlIGlzIDM2Pz8/CisJcmVxX2RlY2xpbmVkCT0gMHgyNSwgLy8gMzcKKwlpbnZhbGlkX3BhcmFtCT0gMHgyNiwgLy8gMzgKKwlyZXFfbm90X2hvbm9yZWQ9IDB4MjcsCS8vIDM5CisJVFNfbm90X2NyZWF0ZWQJPSAweDJGLCAvLyA0NworCURMX25vdF9hbGxvd2VkCT0gMHgzMCwgLy8gNDgKKwlkZXN0X25vdF9leGlzdAk9IDB4MzEsIC8vIDQ5CisJZGVzdF9ub3RfUVNUQQk9IDB4MzIsIC8vIDUwCit9OworCisKKworI2RlZmluZSBhU2lmc1RpbWUJICgocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX0EpfHwocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX05fMjRHKXx8KHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLm1vZGUgPT0gSUVFRV9OXzVHKSk/IDE2IDogMTAKKworI2RlZmluZSBNR01UX1FVRVVFX05VTSA1CisKKyNkZWZpbmUgSUVFRV9DTURfU0VUX1dQQV9QQVJBTQkJCTEKKyNkZWZpbmUJSUVFRV9DTURfU0VUX1dQQV9JRQkJCTIKKyNkZWZpbmUgSUVFRV9DTURfU0VUX0VOQ1JZUFRJT04JCQkzCisjZGVmaW5lIElFRUVfQ01EX01MTUUJCQkJNAorCisjZGVmaW5lIElFRUVfUEFSQU1fV1BBX0VOQUJMRUQJCQkxCisjZGVmaW5lIElFRUVfUEFSQU1fVEtJUF9DT1VOVEVSTUVBU1VSRVMJCTIKKyNkZWZpbmUgSUVFRV9QQVJBTV9EUk9QX1VORU5DUllQVEVECQkzCisjZGVmaW5lIElFRUVfUEFSQU1fUFJJVkFDWV9JTlZPS0VECQk0CisjZGVmaW5lIElFRUVfUEFSQU1fQVVUSF9BTEdTCQkJNQorI2RlZmluZSBJRUVFX1BBUkFNX0lFRUVfODAyXzFYCQkJNgorLy9JdCBzaG91bGQgY29uc2lzdGVudCB3aXRoIHRoZSBkcml2ZXJfWFhYLmMKKy8vICAgRGF2aWQsIDIwMDYuOS4yNgorI2RlZmluZSBJRUVFX1BBUkFNX1dQQVhfU0VMRUNUCQkJNworLy9BZGRlZCBmb3Igbm90aWZ5IHRoZSBlbmNyeXB0aW9uIHR5cGUgc2VsZWN0aW9uCisvLyAgIERhdmlkLCAyMDA2LjkuMjYKKyNkZWZpbmUgSUVFRV9QUk9UT19XUEEJCQkJMQorI2RlZmluZSBJRUVFX1BST1RPX1JTTgkJCQkyCisvL0FkZGVkIGZvciBub3RpZnkgdGhlIGVuY3J5cHRpb24gdHlwZSBzZWxlY3Rpb24KKy8vICAgRGF2aWQsIDIwMDYuOS4yNgorI2RlZmluZSBJRUVFX1dQQVhfVVNFR1JPVVAJCQkwCisjZGVmaW5lIElFRUVfV1BBWF9XRVA0MAkJCQkxCisjZGVmaW5lIElFRUVfV1BBWF9US0lQCQkJCTIKKyNkZWZpbmUgSUVFRV9XUEFYX1dSQVAgICAJCQkzCisjZGVmaW5lIElFRUVfV1BBWF9DQ01QCQkJCTQKKyNkZWZpbmUgSUVFRV9XUEFYX1dFUDEwNAkJCTUKKworI2RlZmluZSBJRUVFX0tFWV9NR01UX0lFRUU4MDIxWAkJCTEKKyNkZWZpbmUgSUVFRV9LRVlfTUdNVF9QU0sJCQkyCisKKyNkZWZpbmUgSUVFRV9NTE1FX1NUQV9ERUFVVEgJCQkxCisjZGVmaW5lIElFRUVfTUxNRV9TVEFfRElTQVNTT0MJCQkyCisKKworI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9VTktOT1dOX0FMRwkJMgorI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9VTktOT1dOX0FERFIJCTMKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfQ1JZUFRfSU5JVF9GQUlMRUQJNAorI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9LRVlfU0VUX0ZBSUxFRAkJNQorI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9UWF9LRVlfU0VUX0ZBSUxFRAk2CisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX0NBUkRfQ09ORl9GQUlMRUQJCTcKKworCisjZGVmaW5lCUlFRUVfQ1JZUFRfQUxHX05BTUVfTEVOCQkJMTYKKworI2RlZmluZSBNQVhfSUVfTEVOICAweGZmCisKKy8vIGFkZGVkIGZvciBrZXJuZWwgY29uZmxpY3QKKyNkZWZpbmUgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzIAlpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXNfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfaGFuZGxlciAJaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyX3JzbAorI2RlZmluZSBpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQgCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMgIAlpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wc19yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wcyBpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzX3JzbAorI2RlZmluZSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMgCWllZWU4MDIxMV9nZXRfY3J5cHRvX29wc19yc2wKKworI2RlZmluZSBpZWVlODAyMTFfY2NtcF9udWxsCQlpZWVlODAyMTFfY2NtcF9udWxsX3JzbAorCisjZGVmaW5lIGllZWU4MDIxMV90a2lwX251bGwJCWllZWU4MDIxMV90a2lwX251bGxfcnNsCisKKyNkZWZpbmUgaWVlZTgwMjExX3dlcF9udWxsCQlpZWVlODAyMTFfd2VwX251bGxfcnNsCisKKyNkZWZpbmUgZnJlZV9pZWVlODAyMTEgICAgICAgICAgCWZyZWVfaWVlZTgwMjExX3JzbAorI2RlZmluZSBhbGxvY19pZWVlODAyMTEgICAgICAgIAkJYWxsb2NfaWVlZTgwMjExX3JzbAorCisjZGVmaW5lIGllZWU4MDIxMV9yeCAJCQlpZWVlODAyMTFfcnhfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9yeF9tZ3QJCWllZWU4MDIxMV9yeF9tZ3RfcnNsCisKKyNkZWZpbmUgaWVlZTgwMjExX2dldF9iZWFjb24JCWllZWU4MDIxMV9nZXRfYmVhY29uX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd2FrZV9xdWV1ZQkJaWVlZTgwMjExX3dha2VfcXVldWVfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9zdG9wX3F1ZXVlCQlpZWVlODAyMTFfc3RvcF9xdWV1ZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3Jlc2V0X3F1ZXVlCQlpZWVlODAyMTFfcmVzZXRfcXVldWVfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2wJaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9wcm90b2NvbF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2wgaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2xfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9pc19zaG9ydHNsb3QJCWllZWU4MDIxMV9pc19zaG9ydHNsb3RfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9pc181NGcJCWllZWU4MDIxMV9pc181NGdfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93cGFfc3VwcGxpY2FudF9pb2N0bAlpZWVlODAyMTFfd3BhX3N1cHBsaWNhbnRfaW9jdGxfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9wc190eF9hY2sJCWllZWU4MDIxMV9wc190eF9hY2tfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9zb2Z0bWFjX3htaXQJCWllZWU4MDIxMV9zb2Z0bWFjX3htaXRfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucwlpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnNfcnNsCisjZGVmaW5lIG5vdGlmeV93eF9hc3NvY19ldmVudAkJbm90aWZ5X3d4X2Fzc29jX2V2ZW50X3JzbAorI2RlZmluZSBTZW5kRGlzYXNzb2NpYXRpb24JCVNlbmREaXNhc3NvY2lhdGlvbl9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZQkJaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucwlpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zX3JzbAorI2RlZmluZSBpZWVlODAyMTFfc3RvcF9zY2FuCQlpZWVlODAyMTFfc3RvcF9zY2FuX3JzbAorI2RlZmluZSBpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXF1ZXN0cwlpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXF1ZXN0c19yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl9zeW5jcm8JaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl9zeW5jcm9fcnNsCisjZGVmaW5lIGllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybwlpZWVlODAyMTFfc3RhcnRfc2Nhbl9zeW5jcm9fcnNsCisKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9lc3NpZAkJaWVlZTgwMjExX3d4X2dldF9lc3NpZF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9lc3NpZAkJaWVlZTgwMjExX3d4X3NldF9lc3NpZF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9yYXRlCQlpZWVlODAyMTFfd3hfc2V0X3JhdGVfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfcmF0ZQkJaWVlZTgwMjExX3d4X2dldF9yYXRlX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3dhcAkJaWVlZTgwMjExX3d4X3NldF93YXBfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfd2FwCQlpZWVlODAyMTFfd3hfZ2V0X3dhcF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9tb2RlCQlpZWVlODAyMTFfd3hfc2V0X21vZGVfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfbW9kZQkJaWVlZTgwMjExX3d4X2dldF9tb2RlX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3NjYW4JCWllZWU4MDIxMV93eF9zZXRfc2Nhbl9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9mcmVxCQlpZWVlODAyMTFfd3hfZ2V0X2ZyZXFfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZnJlcQkJaWVlZTgwMjExX3d4X3NldF9mcmVxX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3Jhd3R4CQlpZWVlODAyMTFfd3hfc2V0X3Jhd3R4X3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X25hbWUJCWllZWU4MDIxMV93eF9nZXRfbmFtZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9wb3dlcgkJaWVlZTgwMjExX3d4X3NldF9wb3dlcl9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9wb3dlcgkJaWVlZTgwMjExX3d4X2dldF9wb3dlcl9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXMJaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfcnRzCQlpZWVlODAyMTFfd3hfc2V0X3J0c19yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9ydHMJCWllZWU4MDIxMV93eF9nZXRfcnRzX3JzbAorCisjZGVmaW5lIGllZWU4MDIxMV90eGJfZnJlZQkJaWVlZTgwMjExX3R4Yl9mcmVlX3JzbAorCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZ2VuX2llCQlpZWVlODAyMTFfd3hfc2V0X2dlbl9pZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9zY2FuCQlpZWVlODAyMTFfd3hfZ2V0X3NjYW5fcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZW5jb2RlCQlpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9lbmNvZGUJCWllZWU4MDIxMV93eF9nZXRfZW5jb2RlX3JzbAorI2lmIFdJUkVMRVNTX0VYVCA+PSAxOAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X21sbWUJCWllZWU4MDIxMV93eF9zZXRfbWxtZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9hdXRoCQlpZWVlODAyMTFfd3hfc2V0X2F1dGhfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZW5jb2RlX2V4dAlpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9leHRfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfZW5jb2RlX2V4dAlpZWVlODAyMTFfd3hfZ2V0X2VuY29kZV9leHRfcnNsCisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCBpZWVlX3BhcmFtIHsKKwl1MzIgY21kOworCXU4IHN0YV9hZGRyW0VUSF9BTEVOXTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1OCBuYW1lOworCQkJdTMyIHZhbHVlOworCQl9IHdwYV9wYXJhbTsKKwkJc3RydWN0IHsKKwkJCXUzMiBsZW47CisJCQl1OCByZXNlcnZlZFszMl07CisJCQl1OCBkYXRhWzBdOworCQl9IHdwYV9pZTsKKwkJc3RydWN0eworCQkJaW50IGNvbW1hbmQ7CisJCQlpbnQgcmVhc29uX2NvZGU7CisJCX0gbWxtZTsKKwkJc3RydWN0IHsKKwkJCXU4IGFsZ1tJRUVFX0NSWVBUX0FMR19OQU1FX0xFTl07CisJCQl1OCBzZXRfdHg7CisJCQl1MzIgZXJyOworCQkJdTggaWR4OworCQkJdTggc2VxWzhdOyAvKiBzZXF1ZW5jZSBjb3VudGVyIChzZXQ6IFJYLCBnZXQ6IFRYKSAqLworCQkJdTE2IGtleV9sZW47CisJCQl1OCBrZXlbMF07CisJCX0gY3J5cHQ7CisJfSB1OworfWllZWVfcGFyYW07CisKKworI2lmIFdJUkVMRVNTX0VYVCA8IDE3CisjZGVmaW5lIElXX1FVQUxfUVVBTF9JTlZBTElEICAgMHgxMAorI2RlZmluZSBJV19RVUFMX0xFVkVMX0lOVkFMSUQgIDB4MjAKKyNkZWZpbmUgSVdfUVVBTF9OT0lTRV9JTlZBTElEICAweDQwCisjZGVmaW5lIElXX1FVQUxfUVVBTF9VUERBVEVEICAgMHgxCisjZGVmaW5lIElXX1FVQUxfTEVWRUxfVVBEQVRFRCAgMHgyCisjZGVmaW5lIElXX1FVQUxfTk9JU0VfVVBEQVRFRCAgMHg0CisjZW5kaWYKKworCisvLyBsaW51eCB1bmRlciAyLjYuOSByZWxlYXNlIG1heSBub3Qgc3VwcG9ydCBpdCwgc28gbW9kaWZ5IGl0IGZvciBjb21tb24gdXNlCisjZGVmaW5lIE1TRUNTKHQpIG1zZWNzX3RvX2ppZmZpZXModCkKKyNkZWZpbmUgbXNsZWVwX2ludGVycnVwdGlibGVfcnNsICBtc2xlZXBfaW50ZXJydXB0aWJsZQorCisjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0xFTgkJMjMwNAorLyogTWF4aW11bSBzaXplIGZvciB0aGUgTUEtVU5JVERBVEEgcHJpbWl0aXZlLCA4MDIuMTEgc3RhbmRhcmQgc2VjdGlvbgorICAgNi4yLjEuMS4yLgorCisgICBUaGUgZmlndXJlIGluIHNlY3Rpb24gNy4xLjIgc3VnZ2VzdHMgYSBib2R5IHNpemUgb2YgdXAgdG8gMjMxMgorICAgYnl0ZXMgaXMgYWxsb3dlZCwgd2hpY2ggaXMgYSBiaXQgY29uZnVzaW5nLCBJIHN1c3BlY3QgdGhpcworICAgcmVwcmVzZW50cyB0aGUgMjMwNCBieXRlcyBvZiByZWFsIGRhdGEsIHBsdXMgYSBwb3NzaWJsZSA4IGJ5dGVzIG9mCisgICBXRVAgSVYgYW5kIElDVi4gKHRoaXMgaW50ZXJwcmV0YXRpb24gc3VnZ2VzdGVkIGJ5IFJhbWlybyBCYXJyZWlybykgKi8KKyNkZWZpbmUgSUVFRTgwMjExXzFBRERSX0xFTiAxMAorI2RlZmluZSBJRUVFODAyMTFfMkFERFJfTEVOIDE2CisjZGVmaW5lIElFRUU4MDIxMV8zQUREUl9MRU4gMjQKKyNkZWZpbmUgSUVFRTgwMjExXzRBRERSX0xFTiAzMAorI2RlZmluZSBJRUVFODAyMTFfRkNTX0xFTiAgICA0CisjZGVmaW5lIElFRUU4MDIxMV9ITEVOICAgICAgICAgICAgICAgICAgKElFRUU4MDIxMV80QUREUl9MRU4pCisjZGVmaW5lIElFRUU4MDIxMV9GUkFNRV9MRU4gICAgICAgICAgICAgKElFRUU4MDIxMV9EQVRBX0xFTiArIElFRUU4MDIxMV9ITEVOKQorI2RlZmluZSBJRUVFODAyMTFfTUdNVF9IRFJfTEVOIDI0CisjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0hEUjNfTEVOIDI0CisjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0hEUjRfTEVOIDMwCisKKyNkZWZpbmUgTUlOX0ZSQUdfVEhSRVNIT0xEICAgICAyNTZVCisjZGVmaW5lIE1BWF9GUkFHX1RIUkVTSE9MRCAgICAgMjM0NlUKKworCisvKiBGcmFtZSBjb250cm9sIGZpZWxkIGNvbnN0YW50cyAqLworI2RlZmluZSBJRUVFODAyMTFfRkNUTF9WRVJTCQkweDAwMDMKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfRlRZUEUJCTB4MDAwYworI2RlZmluZSBJRUVFODAyMTFfRkNUTF9TVFlQRQkJMHgwMGYwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX0ZSQU1FVFlQRQkweDAwZmMKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfVE9EUwkJMHgwMTAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX0ZST01EUwkJMHgwMjAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX0RTVE9EUwkJMHgwMzAwIC8vYWRkZWQgYnkgZGF2aWQKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTCTB4MDQwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9SRVRSWQkJMHgwODAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1BNCQkweDEwMDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfTU9SRURBVEEJCTB4MjAwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9XRVAJCTB4NDAwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9PUkRFUgkJMHg4MDAwCisKKyNkZWZpbmUgSUVFRTgwMjExX0ZUWVBFX01HTVQJCTB4MDAwMAorI2RlZmluZSBJRUVFODAyMTFfRlRZUEVfQ1RMCQkweDAwMDQKKyNkZWZpbmUgSUVFRTgwMjExX0ZUWVBFX0RBVEEJCTB4MDAwOAorCisvKiBtYW5hZ2VtZW50ICovCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVEJMHgwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQIAkweDAwMTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVRCTB4MDAyMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVNQCTB4MDAzMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRCTB4MDA0MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUAkweDAwNTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0JFQUNPTgkJMHgwMDgwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BVElNCQkweDAwOTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RJU0FTU09DCTB4MDBBMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQVVUSAkJMHgwMEIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9ERUFVVEgJCTB4MDBDMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfTUFOQUdFX0FDVAkweDAwRDAKKworLyogY29udHJvbCAqLworI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFNQT0xMCQkweDAwQTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1JUUwkJMHgwMEIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DVFMJCTB4MDBDMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQUNLCQkweDAwRDAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGRU5ECQkweDAwRTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGRU5EQUNLCTB4MDBGMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQkxPQ0tBQ0sgICAweDAwOTQKKworLyogZGF0YSAqLworI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfREFUQQkJMHgwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGQUNLCTB4MDAxMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRlBPTEwJMHgwMDIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGQUNLUE9MTAkweDAwMzAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX05VTExGVU5DCTB4MDA0MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZBQ0sJCTB4MDA1MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZQT0xMCQkweDAwNjAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGQUNLUE9MTAkweDAwNzAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBCTB4MDA4MCAvL2FkZGVkIGZvciBXTU0gMjAwNi84LzIKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1FPU19OVUxMCTB4MDBDMAorCisjZGVmaW5lIElFRUU4MDIxMV9TQ1RMX0ZSQUcJCTB4MDAwRgorI2RlZmluZSBJRUVFODAyMTFfU0NUTF9TRVEJCTB4RkZGMAorCisvKiBRT1MgY29udHJvbCAqLworI2RlZmluZSBJRUVFODAyMTFfUUNUTF9USUQgICAgICAgICAgICAgIDB4MDAwRgorCisjZGVmaW5lCUZDX1FPU19CSVQJCQkJCUJJVDcKKyNkZWZpbmUgSXNEYXRhRnJhbWUocGR1KQkJCSggKChwZHVbMF0gJiAweDBDKT09MHgwOCkgPyB0cnVlIDogZmFsc2UgKQorI2RlZmluZQlJc0xlZ2FjeURhdGFGcmFtZShwZHUpCShJc0RhdGFGcmFtZShwZHUpICYmICghKHBkdVswXSZGQ19RT1NfQklUKSkgKQorLy9hZGRlZCBieSB3Yi4gSXMgdGhpcyByaWdodD8KKyNkZWZpbmUgSXNRb1NEYXRhRnJhbWUocGZyYW1lKSAgKCgqKHUxNiopcGZyYW1lJihJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEF8SUVFRTgwMjExX0ZUWVBFX0RBVEEpKSA9PSAoSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBfElFRUU4MDIxMV9GVFlQRV9EQVRBKSkKKyNkZWZpbmUgRnJhbWVfT3JkZXIocGZyYW1lKSAgICAgKCoodTE2KilwZnJhbWUmSUVFRTgwMjExX0ZDVExfT1JERVIpCisjZGVmaW5lIFNOX0xFU1MoYSwgYikJCSgoKGEtYikmMHg4MDApIT0wKQorI2RlZmluZSBTTl9FUVVBTChhLCBiKQkoYSA9PSBiKQorI2RlZmluZSBNQVhfREVWX0FERFJfU0laRSA4Cit0eXBlZGVmIGVudW0gX0FDVF9DQVRFR09SWXsKKwlBQ1RfQ0FUX1FPUyA9IDEsCisJQUNUX0NBVF9ETFMgPSAyLAorCUFDVF9DQVRfQkEgID0gMywKKwlBQ1RfQ0FUX0hUICA9IDcsCisJQUNUX0NBVF9XTU0gPSAxNywKK30gQUNUX0NBVEVHT1JZLCAqUEFDVF9DQVRFR09SWTsKKwordHlwZWRlZiBlbnVtIF9UU19BQ1RJT057CisJQUNUX0FERFRTUkVRID0gMCwKKwlBQ1RfQUREVFNSU1AgPSAxLAorCUFDVF9ERUxUUyAgICA9IDIsCisJQUNUX1NDSEVEVUxFID0gMywKK30gVFNfQUNUSU9OLCAqUFRTX0FDVElPTjsKKwordHlwZWRlZiBlbnVtIF9CQV9BQ1RJT057CisJQUNUX0FEREJBUkVRID0gMCwKKwlBQ1RfQUREQkFSU1AgPSAxLAorCUFDVF9ERUxCQSAgICA9IDIsCit9IEJBX0FDVElPTiwgKlBCQV9BQ1RJT047CisKK3R5cGVkZWYgZW51bSBfSW5pdGlhbEdhaW5PcFR5cGV7CisJSUdfQmFja3VwPTAsCisJSUdfUmVzdG9yZSwKKwlJR19NYXgKK31Jbml0aWFsR2Fpbk9wVHlwZTsKKworLyogZGVidWcgbWFjcm9zICovCisjZGVmaW5lIENPTkZJR19JRUVFODAyMTFfREVCVUcKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCitleHRlcm4gdTMyIGllZWU4MDIxMV9kZWJ1Z19sZXZlbDsKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIFwKK2RvIHsgaWYgKGllZWU4MDIxMV9kZWJ1Z19sZXZlbCAmIChsZXZlbCkpIFwKKyAgcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMTogIiBmbXQsICMjIGFyZ3MpOyB9IHdoaWxlICgwKQorLy93YiBhZGRlZCB0byBkZWJ1ZyBvdXQgZGF0YSBidWYKKy8vaWYgeW91IHdhbnQgcHJpbnQgREFUQSBidWZmZXIgcmVsYXRlZCBCQSwgcGxlYXNlIHNldCBpZWVlODAyMTFfZGVidWdfbGV2ZWwgdG8gREFUQXxCQQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfREFUQShsZXZlbCwgZGF0YSwgZGF0YWxlbikJXAorCWRveyBpZiAoKGllZWU4MDIxMV9kZWJ1Z19sZXZlbCAmIChsZXZlbCkpID09IChsZXZlbCkpCVwKKwkJeyAJXAorCQkJaW50IGk7CQkJCQlcCisJCQl1OCogcGRhdGEgPSAodTgqKSBkYXRhOwkJCVwKKwkJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTE6ICVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CVwKKwkJCWZvcihpPTA7IGk8KGludCkoZGF0YWxlbik7IGkrKykJCQlcCisJCQl7CQkJCQkJXAorCQkJCXByaW50aygiJTJ4ICIsIHBkYXRhW2ldKTsJCVwKKwkJCQlpZiAoKGkrMSklMTYgPT0gMCkgcHJpbnRrKCJcbiIpOwlcCisJCQl9CQkJCVwKKwkJCXByaW50aygiXG4iKTsJCQlcCisJCX0JCQkJCVwKKwl9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfREFUQShsZXZlbCwgZGF0YSwgZGF0YWxlbikgZG8ge30gd2hpbGUoMCkKKyNlbmRpZgkvKiBDT05GSUdfSUVFRTgwMjExX0RFQlVHICovCisKKy8qIGRlYnVnIG1hY3JvcyBub3QgZGVwZW5kZW50IG9uIENPTkZJR19JRUVFODAyMTFfREVCVUcgKi8KKworI2RlZmluZSBNQUNfRk1UICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIKKyNkZWZpbmUgTUFDX0FSRyh4KSAoKHU4KikoeCkpWzBdLCgodTgqKSh4KSlbMV0sKCh1OCopKHgpKVsyXSwoKHU4KikoeCkpWzNdLCgodTgqKSh4KSlbNF0sKCh1OCopKHgpKVs1XQorCisvKgorICogVG8gdXNlIHRoZSBkZWJ1ZyBzeXN0ZW07CisgKgorICogSWYgeW91IGFyZSBkZWZpbmluZyBhIG5ldyBkZWJ1ZyBjbGFzc2lmaWNhdGlvbiwgc2ltcGx5IGFkZCBpdCB0byB0aGUgI2RlZmluZQorICogbGlzdCBoZXJlIGluIHRoZSBmb3JtIG9mOgorICoKKyAqICNkZWZpbmUgSUVFRTgwMjExX0RMX3h4eHggVkFMVUUKKyAqCisgKiBzaGlmdGluZyB2YWx1ZSB0byB0aGUgbGVmdCBvbmUgYml0IGZyb20gdGhlIHByZXZpb3VzIGVudHJ5LiAgeHh4eCBzaG91bGQgYmUKKyAqIHRoZSBuYW1lIG9mIHRoZSBjbGFzc2lmaWNhdGlvbiAoZm9yIGV4YW1wbGUsIFdFUCkKKyAqCisgKiBZb3UgdGhlbiBuZWVkIHRvIGVpdGhlciBhZGQgYSBJRUVFODAyMTFfeHh4eF9ERUJVRygpIG1hY3JvIGRlZmluaXRpb24gZm9yIHlvdXIKKyAqIGNsYXNzaWZpY2F0aW9uLCBvciB1c2UgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF94eHh4LCAuLi4pIHdoZW5ldmVyIHlvdSB3YW50CisgKiB0byBzZW5kIG91dHB1dCB0byB0aGF0IGNsYXNzaWZpY2F0aW9uLgorICoKKyAqIFRvIGFkZCB5b3VyIGRlYnVnIGxldmVsIHRvIHRoZSBsaXN0IG9mIGxldmVscyBzZWVuIHdoZW4geW91IHBlcmZvcm0KKyAqCisgKiAlIGNhdCAvcHJvYy9uZXQvaXB3L2RlYnVnX2xldmVsCisgKgorICogeW91IHNpbXBseSBuZWVkIHRvIGFkZCB5b3VyIGVudHJ5IHRvIHRoZSBpcHdfZGVidWdfbGV2ZWxzIGFycmF5LgorICoKKyAqIElmIHlvdSBkbyBub3Qgc2VlIGRlYnVnX2xldmVsIGluIC9wcm9jL25ldC9pcHcgdGhlbiB5b3UgZG8gbm90IGhhdmUKKyAqIENPTkZJR19JRUVFODAyMTFfREVCVUcgZGVmaW5lZCBpbiB5b3VyIGtlcm5lbCBjb25maWd1cmF0aW9uCisgKgorICovCisKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0lORk8gICAgICAgICAgKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9ETF9XWCAgICAgICAgICAgICgxPDwxKQorI2RlZmluZSBJRUVFODAyMTFfRExfU0NBTiAgICAgICAgICAoMTw8MikKKyNkZWZpbmUgSUVFRTgwMjExX0RMX1NUQVRFICAgICAgICAgKDE8PDMpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9NR01UICAgICAgICAgICgxPDw0KQorI2RlZmluZSBJRUVFODAyMTFfRExfRlJBRyAgICAgICAgICAoMTw8NSkKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0VBUCAgICAgICAgICAgKDE8PDYpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9EUk9QICAgICAgICAgICgxPDw3KQorCisjZGVmaW5lIElFRUU4MDIxMV9ETF9UWCAgICAgICAgICAgICgxPDw4KQorI2RlZmluZSBJRUVFODAyMTFfRExfUlggICAgICAgICAgICAoMTw8OSkKKworI2RlZmluZSBJRUVFODAyMTFfRExfSFQJCSAgICgxPDwxMCkgIC8vSFQKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0JBCQkgICAoMTw8MTEpICAvL2JhCisjZGVmaW5lIElFRUU4MDIxMV9ETF9UUwkJICAgKDE8PDEyKSAgLy9UUworI2RlZmluZSBJRUVFODAyMTFfRExfUU9TICAgICAgICAgICAoMTw8MTMpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9SRU9SREVSCSAgICgxPDwxNCkKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0lPVAkgICAoMTw8MTUpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9JUFMJICAgKDE8PDE2KQorI2RlZmluZSBJRUVFODAyMTFfRExfVFJBQ0UJICAgKDE8PDI5KSAgLy90cmFjZSBmdW5jdGlvbiwgbmVlZCB0byB1c2VyIG5ldF9yYXRlbGltaXQoKSB0b2dldGhlciBpbiBvcmRlciBub3QgdG8gcHJpbnQgdG9vIG11Y2ggdG8gdGhlIHNjcmVlbgorI2RlZmluZSBJRUVFODAyMTFfRExfREFUQQkgICAoMTw8MzApICAgLy91c2UgdGhpcyBmbGFnIHRvIGNvbnRyb2wgd2hldGhlciBwcmludCBkYXRhIGJ1ZiBvdXQuCisjZGVmaW5lIElFRUU4MDIxMV9ETF9FUlIJICAgKDE8PDMxKSAgIC8vYWx3YXlzIG9wZW4KKyNkZWZpbmUgSUVFRTgwMjExX0VSUk9SKGYsIGEuLi4pIHByaW50ayhLRVJOX0VSUiAiaWVlZTgwMjExOiAiIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9XQVJOSU5HKGYsIGEuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgImllZWU4MDIxMTogIiBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfSU5GTyhmLCBhLi4uKSAgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSU5GTywgZiwgIyMgYSkKKworI2RlZmluZSBJRUVFODAyMTFfREVCVUdfV1goZiwgYS4uLikgICAgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfV1gsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19TQ0FOKGYsIGEuLi4pICAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9TQ0FOLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfU1RBVEUoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfU1RBVEUsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19NR01UKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX01HTVQsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19GUkFHKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0ZSQUcsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19FQVAoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRUFQLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfRFJPUChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9EUk9QLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfVFgoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfVFgsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19SWChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SWCwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1FPUyhmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9RT1MsIGYsICMjIGEpCisKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisvKiBBZGRlZCBieSBBbm5pZSwgMjAwNS0xMS0yMi4gKi8KKyNkZWZpbmUgTUFYX1NUUl9MRU4gICAgIDY0CisvKiBJIHdhbnQgdG8gc2VlIEFTQ0lJIDMzIHRvIDEyNiBvbmx5LiBPdGhlcndpc2UsIEkgcHJpbnQgJz8nLiBBbm5pZSwgMjAwNS0xMS0yMi4qLworI2RlZmluZSBQUklOVEFCTEUoX2NoKSAgKF9jaD4nIScgJiYgX2NoPCd+JykKKyNkZWZpbmUgSUVFRTgwMjExX1BSSU5UX1NUUihfQ29tcCwgX1RpdGxlU3RyaW5nLCBfUHRyLCBfTGVuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCQkJaWYoKF9Db21wKSAmIGxldmVsKSAgIAkJCQkJCQlcCisJCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJaW50ICAgICAgICAgICAgIF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQl1OCAgYnVmZmVyW01BWF9TVFJfTEVOXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCQkJCWludCBsZW5ndGggPSAoX0xlbjxNQVhfU1RSX0xFTik/IF9MZW4gOiAoTUFYX1NUUl9MRU4tMSkgOyAgCVwKKwkJCQltZW1zZXQoYnVmZmVyLCAwLCBNQVhfU1RSX0xFTik7ICAgICAgICAgICAgICAgICAgICAgIAkJXAorCQkJCW1lbWNweShidWZmZXIsICh1OCAqKV9QdHIsIGxlbmd0aCApOyAgICAgICAgICAgIAkJXAorCQkJCWZvciggX19pPTA7IF9faTxNQVhfU1RSX0xFTjsgX19pKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkgICAgIGlmKCAhUFJJTlRBQkxFKGJ1ZmZlcltfX2ldKSApICAgYnVmZmVyW19faV0gPSAnPyc7ICAgICAJXAorCQkJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJYnVmZmVyW2xlbmd0aF0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQlwcmludGsoIlJ0bDgxOXg6ICIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkJCQlwcmludGsoX1RpdGxlU3RyaW5nKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQlwcmludGsoIjogJWQsIDwlcz5cbiIsIF9MZW4sIGJ1ZmZlcik7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCX0KKyNlbHNlCisjZGVmaW5lIElFRUU4MDIxMV9QUklOVF9TVFIoX0NvbXAsIF9UaXRsZVN0cmluZywgX1B0ciwgX0xlbikgIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4gLyogQVJQSFJEX0VUSEVSICovCisKKyNpZm5kZWYgV0lSRUxFU1NfU1BZCisjZGVmaW5lIFdJUkVMRVNTX1NQWQkJLy8gZW5hYmxlIGl3c3B5IHN1cHBvcnQKKyNlbmRpZgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CS8vIG5ldyBkcml2ZXIgQVBJCisKKyNpZm5kZWYgRVRIX1BfUEFFCisjZGVmaW5lIEVUSF9QX1BBRSAweDg4OEUgLyogUG9ydCBBY2Nlc3MgRW50aXR5IChJRUVFIDgwMi4xWCkgKi8KKyNlbmRpZiAvKiBFVEhfUF9QQUUgKi8KKworI2RlZmluZSBFVEhfUF9QUkVBVVRIIDB4ODhDNyAvKiBJRUVFIDgwMi4xMWkgcHJlLWF1dGhlbnRpY2F0aW9uICovCisKKyNpZm5kZWYgRVRIX1BfODAyMTFfUkFXCisjZGVmaW5lIEVUSF9QXzgwMjExX1JBVyAoRVRIX1BfRUNPTkVUICsgMSkKKyNlbmRpZgorCisvKiBJRUVFIDgwMi4xMSBkZWZpbmVzICovCisKKyNkZWZpbmUgUDgwMjExX09VSV9MRU4gMworCitzdHJ1Y3QgaWVlZTgwMjExX3NuYXBfaGRyIHsKKworCXU4ICAgIGRzYXA7ICAgLyogYWx3YXlzIDB4QUEgKi8KKwl1OCAgICBzc2FwOyAgIC8qIGFsd2F5cyAweEFBICovCisJdTggICAgY3RybDsgICAvKiBhbHdheXMgMHgwMyAqLworCXU4ICAgIG91aVtQODAyMTFfT1VJX0xFTl07ICAgIC8qIG9yZ2FuaXphdGlvbmFsIHVuaXZlcnNhbCBpZCAqLworCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBTTkFQX1NJWkUgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIpCisKKyNkZWZpbmUgV0xBTl9GQ19HRVRfVkVSUyhmYykgKChmYykgJiBJRUVFODAyMTFfRkNUTF9WRVJTKQorI2RlZmluZSBXTEFOX0ZDX0dFVF9UWVBFKGZjKSAoKGZjKSAmIElFRUU4MDIxMV9GQ1RMX0ZUWVBFKQorI2RlZmluZSBXTEFOX0ZDX0dFVF9TVFlQRShmYykgKChmYykgJiBJRUVFODAyMTFfRkNUTF9TVFlQRSkKKworI2RlZmluZSBXTEFOX0ZDX0dFVF9GUkFNRVRZUEUoZmMpICgoZmMpICYgSUVFRTgwMjExX0ZDVExfRlJBTUVUWVBFKQorI2RlZmluZSBXTEFOX0dFVF9TRVFfRlJBRyhzZXEpICgoc2VxKSAmIElFRUU4MDIxMV9TQ1RMX0ZSQUcpCisjZGVmaW5lIFdMQU5fR0VUX1NFUV9TRVEoc2VxKSAgKCgoc2VxKSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkgPj4gNCkKKworLyogQXV0aGVudGljYXRpb24gYWxnb3JpdGhtcyAqLworI2RlZmluZSBXTEFOX0FVVEhfT1BFTiAwCisjZGVmaW5lIFdMQU5fQVVUSF9TSEFSRURfS0VZIDEKKyNkZWZpbmUgV0xBTl9BVVRIX0xFQVAgMgorCisjZGVmaW5lIFdMQU5fQVVUSF9DSEFMTEVOR0VfTEVOIDEyOAorCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9CU1MgKDE8PDApCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9JQlNTICgxPDwxKQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQ0ZfUE9MTEFCTEUgKDE8PDIpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9DRl9QT0xMX1JFUVVFU1QgKDE8PDMpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZICgxPDw0KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUgKDE8PDUpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9QQkNDICgxPDw2KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQ0hBTk5FTF9BR0lMSVRZICgxPDw3KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfU1BFQ1RSVU1fTUdNVCAoMTw8OCkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1FPUyAoMTw8OSkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QgKDE8PDEwKQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfRFNTU19PRkRNICgxPDwxMykKKworLyogODAyLjExZyBFUlAgaW5mb3JtYXRpb24gZWxlbWVudCAqLworI2RlZmluZSBXTEFOX0VSUF9OT05fRVJQX1BSRVNFTlQgKDE8PDApCisjZGVmaW5lIFdMQU5fRVJQX1VTRV9QUk9URUNUSU9OICgxPDwxKQorI2RlZmluZSBXTEFOX0VSUF9CQVJLRVJfUFJFQU1CTEUgKDE8PDIpCisKKy8qIFN0YXR1cyBjb2RlcyAqLworZW51bSBpZWVlODAyMTFfc3RhdHVzY29kZSB7CisJV0xBTl9TVEFUVVNfU1VDQ0VTUyA9IDAsCisJV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRSA9IDEsCisJV0xBTl9TVEFUVVNfQ0FQU19VTlNVUFBPUlRFRCA9IDEwLAorCVdMQU5fU1RBVFVTX1JFQVNTT0NfTk9fQVNTT0MgPSAxMSwKKwlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfVU5TUEVDID0gMTIsCisJV0xBTl9TVEFUVVNfTk9UX1NVUFBPUlRFRF9BVVRIX0FMRyA9IDEzLAorCVdMQU5fU1RBVFVTX1VOS05PV05fQVVUSF9UUkFOU0FDVElPTiA9IDE0LAorCVdMQU5fU1RBVFVTX0NIQUxMRU5HRV9GQUlMID0gMTUsCisJV0xBTl9TVEFUVVNfQVVUSF9USU1FT1VUID0gMTYsCisJV0xBTl9TVEFUVVNfQVBfVU5BQkxFX1RPX0hBTkRMRV9ORVdfU1RBID0gMTcsCisJV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX1JBVEVTID0gMTgsCisJLyogODAyLjExYiAqLworCVdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT1NIT1JUUFJFQU1CTEUgPSAxOSwKKwlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9QQkNDID0gMjAsCisJV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PQUdJTElUWSA9IDIxLAorCS8qIDgwMi4xMWggKi8KKwlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9TUEVDVFJVTSA9IDIyLAorCVdMQU5fU1RBVFVTX0FTU09DX1JFSkVDVEVEX0JBRF9QT1dFUiA9IDIzLAorCVdMQU5fU1RBVFVTX0FTU09DX1JFSkVDVEVEX0JBRF9TVVBQX0NIQU4gPSAyNCwKKwkvKiA4MDIuMTFnICovCisJV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PU0hPUlRUSU1FID0gMjUsCisJV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PRFNTU09GRE0gPSAyNiwKKwkvKiA4MDIuMTFpICovCisJV0xBTl9TVEFUVVNfSU5WQUxJRF9JRSA9IDQwLAorCVdMQU5fU1RBVFVTX0lOVkFMSURfR1JPVVBfQ0lQSEVSID0gNDEsCisJV0xBTl9TVEFUVVNfSU5WQUxJRF9QQUlSV0lTRV9DSVBIRVIgPSA0MiwKKwlXTEFOX1NUQVRVU19JTlZBTElEX0FLTVAgPSA0MywKKwlXTEFOX1NUQVRVU19VTlNVUFBfUlNOX1ZFUlNJT04gPSA0NCwKKwlXTEFOX1NUQVRVU19JTlZBTElEX1JTTl9JRV9DQVAgPSA0NSwKKwlXTEFOX1NUQVRVU19DSVBIRVJfU1VJVEVfUkVKRUNURUQgPSA0NiwKK307CisKKy8qIFJlYXNvbiBjb2RlcyAqLworZW51bSBpZWVlODAyMTFfcmVhc29uY29kZSB7CisJV0xBTl9SRUFTT05fVU5TUEVDSUZJRUQgPSAxLAorCVdMQU5fUkVBU09OX1BSRVZfQVVUSF9OT1RfVkFMSUQgPSAyLAorCVdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HID0gMywKKwlXTEFOX1JFQVNPTl9ESVNBU1NPQ19EVUVfVE9fSU5BQ1RJVklUWSA9IDQsCisJV0xBTl9SRUFTT05fRElTQVNTT0NfQVBfQlVTWSA9IDUsCisJV0xBTl9SRUFTT05fQ0xBU1MyX0ZSQU1FX0ZST01fTk9OQVVUSF9TVEEgPSA2LAorCVdMQU5fUkVBU09OX0NMQVNTM19GUkFNRV9GUk9NX05PTkFTU09DX1NUQSA9IDcsCisJV0xBTl9SRUFTT05fRElTQVNTT0NfU1RBX0hBU19MRUZUID0gOCwKKwlXTEFOX1JFQVNPTl9TVEFfUkVRX0FTU09DX1dJVEhPVVRfQVVUSCA9IDksCisJLyogODAyLjExaCAqLworCVdMQU5fUkVBU09OX0RJU0FTU09DX0JBRF9QT1dFUiA9IDEwLAorCVdMQU5fUkVBU09OX0RJU0FTU09DX0JBRF9TVVBQX0NIQU4gPSAxMSwKKwkvKiA4MDIuMTFpICovCisJV0xBTl9SRUFTT05fSU5WQUxJRF9JRSA9IDEzLAorCVdMQU5fUkVBU09OX01JQ19GQUlMVVJFID0gMTQsCisJV0xBTl9SRUFTT05fNFdBWV9IQU5EU0hBS0VfVElNRU9VVCA9IDE1LAorCVdMQU5fUkVBU09OX0dST1VQX0tFWV9IQU5EU0hBS0VfVElNRU9VVCA9IDE2LAorCVdMQU5fUkVBU09OX0lFX0RJRkZFUkVOVCA9IDE3LAorCVdMQU5fUkVBU09OX0lOVkFMSURfR1JPVVBfQ0lQSEVSID0gMTgsCisJV0xBTl9SRUFTT05fSU5WQUxJRF9QQUlSV0lTRV9DSVBIRVIgPSAxOSwKKwlXTEFOX1JFQVNPTl9JTlZBTElEX0FLTVAgPSAyMCwKKwlXTEFOX1JFQVNPTl9VTlNVUFBfUlNOX1ZFUlNJT04gPSAyMSwKKwlXTEFOX1JFQVNPTl9JTlZBTElEX1JTTl9JRV9DQVAgPSAyMiwKKwlXTEFOX1JFQVNPTl9JRUVFODAyMVhfRkFJTEVEID0gMjMsCisJV0xBTl9SRUFTT05fQ0lQSEVSX1NVSVRFX1JFSkVDVEVEID0gMjQsCit9OworCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19TSUdOQUwgKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19SU1NJICgxPDwxKQorI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfTk9JU0UgKDE8PDIpCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19SQVRFICgxPDwzKQorI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfV0VNQVNLIDB4NworCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTiAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTiAgICgxPDwxKQorCisjZGVmaW5lIElFRUU4MDIxMV8yNEdIWl9CQU5EICAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExXzUyR0haX0JBTkQgICAgICgxPDwxKQorCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV9MRU4gIAkJNAorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMU1CCQkJMHgwMgorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMk1CCQkJMHgwNAorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfNU1CCQkJMHgwQgorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQgkJCTB4MTYKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV9MRU4gCQk4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1CCQkJMHgwQworI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzlNQgkJCTB4MTIKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xMk1CCQkweDE4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQgkJMHgyNAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUIJCTB4MzAKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8zNk1CCQkweDQ4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQgkJMHg2MAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUIJCTB4NkMKKyNkZWZpbmUgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSwkJMHg4MAorCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xTUJfTUFTSwkJKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8yTUJfTUFTSwkJKDE8PDEpCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV81TUJfTUFTSwkJKDE8PDIpCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1CX01BU0sJCSgxPDwzKQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQl9NQVNLCQkoMTw8NCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV85TUJfTUFTSwkJKDE8PDUpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQl9NQVNLCQkoMTw8NikKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xOE1CX01BU0sJCSgxPDw3KQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSwkJKDE8PDgpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLCQkoMTw8OSkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV80OE1CX01BU0sJCSgxPDwxMCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV81NE1CX01BU0sJCSgxPDwxMSkKKworI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVTX01BU0sJCTB4MDAwMDAwMEYKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19CQVNJQ19SQVRFU19NQVNLCShJRUVFODAyMTFfQ0NLX1JBVEVfMU1CX01BU0sgfCBcCisJSUVFRTgwMjExX0NDS19SQVRFXzJNQl9NQVNLKQorI2RlZmluZSBJRUVFODAyMTFfQ0NLX0RFRkFVTFRfUkFURVNfTUFTSwkoSUVFRTgwMjExX0NDS19CQVNJQ19SQVRFU19NQVNLIHwgXAorCUlFRUU4MDIxMV9DQ0tfUkFURV81TUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQl9NQVNLKQorCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVTX01BU0sJCTB4MDAwMDBGRjAKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fQkFTSUNfUkFURVNfTUFTSwkoSUVFRTgwMjExX09GRE1fUkFURV82TUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSykKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fREVGQVVMVF9SQVRFU19NQVNLCShJRUVFODAyMTFfT0ZETV9CQVNJQ19SQVRFU19NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfOU1CX01BU0sgIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMThNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQl9NQVNLKQorI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9SQVRFU19NQVNLIChJRUVFODAyMTFfT0ZETV9ERUZBVUxUX1JBVEVTX01BU0sgfCBcCisJCQkJSUVFRTgwMjExX0NDS19ERUZBVUxUX1JBVEVTX01BU0spCisKKyNkZWZpbmUgSUVFRTgwMjExX05VTV9PRkRNX1JBVEVTCSAgICA4CisjZGVmaW5lIElFRUU4MDIxMV9OVU1fQ0NLX1JBVEVTCQkgICAgNAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9TSElGVF9NQVNLX0EgICAgICAgICA0CisKKworLyogdGhpcyBpcyBzdG9sZW4gYW5kIG1vZGlmaWVkIGZyb20gdGhlIG1hZHdpZmkgZHJpdmVyKi8KKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9UWVBFX01BU0sJCTB4MGMKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9UWVBFX0RBVEEJCTB4MDgKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX01BU0sJMHhCMAorI2RlZmluZSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TCTB4ODAKKworI2RlZmluZSBJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpIFwKKwkoKChmYykgJiAoSUVFRTgwMjExX0ZDMF9UWVBFX01BU0sgfCBJRUVFODAyMTFfRkMwX1NVQlRZUEVfTUFTSykpID09IFwKKwkgKElFRUU4MDIxMV9GQzBfVFlQRV9EQVRBIHwgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPUykpCisKKy8qIHRoaXMgaXMgc3RvbGVuIGZyb20gaXB3MjIwMCBkcml2ZXIgKi8KKyNkZWZpbmUgSUVFRV9JQlNTX01BQ19IQVNIX1NJWkUgMzEKK3N0cnVjdCBpZWVlX2lic3Nfc2VxIHsKKwl1OCBtYWNbRVRIX0FMRU5dOworCXUxNiBzZXFfbnVtWzE3XTsKKwl1MTYgZnJhZ19udW1bMTddOworCXVuc2lnbmVkIGxvbmcgcGFja2V0X3RpbWVbMTddOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKKy8qIE5PVEU6IFRoaXMgZGF0YSBpcyBmb3Igc3RhdGlzdGljYWwgcHVycG9zZXM7IG5vdCBhbGwgaGFyZHdhcmUgcHJvdmlkZXMgdGhpcworICogICAgICAgaW5mb3JtYXRpb24gZm9yIGZyYW1lcyByZWNlaXZlZC4gIE5vdCBzZXR0aW5nIHRoZXNlIHdpbGwgbm90IGNhdXNlCisgKiAgICAgICBhbnkgYWR2ZXJzZSBhZmZlY3RzLiAqLworc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyB7CisJdTMyIG1hY190aW1lWzJdOworCXM4IHJzc2k7CisJdTggc2lnbmFsOworCXU4IG5vaXNlOworCXUxNiByYXRlOyAvKiBpbiAxMDAga2JwcyAqLworCXU4IHJlY2VpdmVkX2NoYW5uZWw7CisJdTggY29udHJvbDsKKwl1OCBtYXNrOworCXU4IGZyZXE7CisJdTE2IGxlbjsKKwl1NjQgdHNmOworCXUzMiBiZWFjb25fdGltZTsKKwl1OCBuaWNfdHlwZTsKKwl1MTYgICAgICAgTGVuZ3RoOworCS8vICAgICAgdTggICAgICAgIERhdGFSYXRlOyAgICAgIC8vIEluIDAuNSBNYnBzCisJdTggICAgICAgIFNpZ25hbFF1YWxpdHk7IC8vIGluIDAtMTAwIGluZGV4LgorCXMzMiAgICAgICBSZWN2U2lnbmFsUG93ZXI7IC8vIFJlYWwgcG93ZXIgaW4gZEJtIGZvciB0aGlzIHBhY2tldCwgbm8gYmVhdXRpZmljYXRpb24gYW5kIGFnZ3JlZ2F0aW9uLgorCXM4ICAgICAgICBSeFBvd2VyOyAvLyBpbiBkQm0gVHJhbnNsYXRlIGZyb20gUFdkQgorCXU4ICAgICAgICBTaWduYWxTdHJlbmd0aDsgLy8gaW4gMC0xMDAgaW5kZXguCisJdTE2ICAgICAgIGJId0Vycm9yOjE7CisJdTE2ICAgICAgIGJDUkM6MTsKKwl1MTYgICAgICAgYklDVjoxOworCXUxNiAgICAgICBiU2hvcnRQcmVhbWJsZToxOworCXUxNiAgICAgICBBbnRlbm5hOjE7ICAgICAgLy9mb3IgcnRsODE4NQorCXUxNiAgICAgICBEZWNyeXB0ZWQ6MTsgICAgLy9mb3IgcnRsODE4NSwgcnRsODE4NworCXUxNiAgICAgICBXYWtldXA6MTsgICAgICAgLy9mb3IgcnRsODE4NQorCXUxNiAgICAgICBSZXNlcnZlZDA6MTsgICAgLy9mb3IgcnRsODE4NQorCXU4ICAgICAgICBBR0M7CisJdTMyICAgICAgIFRpbWVTdGFtcExvdzsKKwl1MzIgICAgICAgVGltZVN0YW1wSGlnaDsKKwlib29sICAgICAgYlNoaWZ0OworCWJvb2wgICAgICBiSXNRb3NEYXRhOyAgICAgICAgICAgICAvLyBBZGRlZCBieSBBbm5pZSwgMjAwNS0xMi0yMi4KKwl1OCAgICAgICAgVXNlclByaW9yaXR5OworCisJLy8xISEhISEhISEhISEhISEhISEhISEhISEhISEhCisJLy8xQXR0ZW50aW9uIFBsZWFzZSEhITwxMW4gb3IgODE5MCBzcGVjaWZpYyBjb2RlIHNob3VsZCBiZSBwdXQgYmVsb3cgdGhpcyBsaW5lPgorCS8vMSEhISEhISEhISEhISEhISEhISEhISEhISEhIQorCisJdTggICAgICAgIFJ4RHJ2SW5mb1NpemU7CisJdTggICAgICAgIFJ4QnVmU2hpZnQ7CisJYm9vbCAgICAgIGJJc0FNUERVOworCWJvb2wgICAgICBiRmlyc3RNUERVOworCWJvb2wgICAgICBiQ29udGFpbkhUQzsKKwlib29sICAgICAgUnhJczQwTUh6UGFja2V0OworCXUzMiAgICAgICBSeFBXREJBbGw7CisJdTggICAgICAgIFJ4TUlNT1NpZ25hbFN0cmVuZ3RoWzRdOyAgICAgICAgLy8gaW4gMH4xMDAgaW5kZXgKKwlzOCAgICAgICAgUnhNSU1PU2lnbmFsUXVhbGl0eVsyXTsKKwlib29sICAgICAgYlBhY2tldE1hdGNoQlNTSUQ7CisJYm9vbCAgICAgIGJJc0NDSzsKKwlib29sICAgICAgYlBhY2tldFRvU2VsZjsKKwkvL2FkZGVkIGJ5IGFteQorCXU4KiAgICAgICB2aXJ0dWFsX2FkZHJlc3M7CisJdTE2ICAgICAgICAgIHBhY2tldGxlbmd0aDsgICAgICAgICAgICAgIC8vIFRvdGFsIHBhY2tldCBsZW5ndGg6IE11c3QgZXF1YWwgdG8gc3VtIG9mIGFsbCBGcmFnTGVuZ3RoCisJdTE2ICAgICAgICAgIGZyYWdsZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gRnJhZ0xlbmd0aCBzaG91bGQgZXF1YWwgdG8gUGFja2V0TGVuZ3RoIGluIG5vbi1mcmFnbWVudCBjYXNlCisJdTE2ICAgICAgICAgIGZyYWdvZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGF0YSBvZmZzZXQgZm9yIHRoaXMgZnJhZ21lbnQKKwl1MTYgICAgICAgICAgbnRvdGFsZnJhZzsKKwlib29sICAgICAgCSAgYmlzcnhhZ2dyc3ViZnJhbWU7CisJYm9vbAkJICBiUGFja2V0QmVhY29uOwkvL2Nvc2EgYWRkIGZvciByc3NpCisJYm9vbAkJICBiVG9TZWxmQkE7CQkvL2Nvc2EgYWRkIGZvciByc3NpCisJY2hhciAJICBjY2tfYWRjX3B3ZGJbNF07CS8vY29zYSBhZGQgZm9yIHJ4IHBhdGggc2VsZWN0aW9uCisJdTE2CQkgIFNlcV9OdW07CisKK307CisKKy8qIElFRUUgODAyLjExIHJlcXVpcmVzIHRoYXQgU1RBIHN1cHBvcnRzIGNvbmN1cnJlbnQgcmVjZXB0aW9uIG9mIGF0IGxlYXN0CisgKiB0aHJlZSBmcmFnbWVudGVkIGZyYW1lcy4gVGhpcyBkZWZpbmUgY2FuIGJlIGluY3JlYXNlZCB0byBzdXBwb3J0IG1vcmUKKyAqIGNvbmN1cnJlbnQgZnJhbWVzLCBidXQgaXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgZWFjaCBlbnRyeSBjYW4gY29uc3VtZSBhYm91dAorICogMiBrQiBvZiBSQU0gYW5kIGluY3JlYXNpbmcgY2FjaGUgc2l6ZSB3aWxsIHNsb3cgZG93biBmcmFtZSByZWFzc2VtYmx5LiAqLworI2RlZmluZSBJRUVFODAyMTFfRlJBR19DQUNIRV9MRU4gNAorCitzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdfZW50cnkgeworCXVuc2lnbmVkIGxvbmcgZmlyc3RfZnJhZ190aW1lOworCXVuc2lnbmVkIGludCBzZXE7CisJdW5zaWduZWQgaW50IGxhc3RfZnJhZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXU4IHNyY19hZGRyW0VUSF9BTEVOXTsKKwl1OCBkc3RfYWRkcltFVEhfQUxFTl07Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX3N0YXRzIHsKKwl1bnNpZ25lZCBpbnQgdHhfdW5pY2FzdF9mcmFtZXM7CisJdW5zaWduZWQgaW50IHR4X211bHRpY2FzdF9mcmFtZXM7CisJdW5zaWduZWQgaW50IHR4X2ZyYWdtZW50czsKKwl1bnNpZ25lZCBpbnQgdHhfdW5pY2FzdF9vY3RldHM7CisJdW5zaWduZWQgaW50IHR4X211bHRpY2FzdF9vY3RldHM7CisJdW5zaWduZWQgaW50IHR4X2RlZmVycmVkX3RyYW5zbWlzc2lvbnM7CisJdW5zaWduZWQgaW50IHR4X3NpbmdsZV9yZXRyeV9mcmFtZXM7CisJdW5zaWduZWQgaW50IHR4X211bHRpcGxlX3JldHJ5X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfcmV0cnlfbGltaXRfZXhjZWVkZWQ7CisJdW5zaWduZWQgaW50IHR4X2Rpc2NhcmRzOworCXVuc2lnbmVkIGludCByeF91bmljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgcnhfbXVsdGljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgcnhfZnJhZ21lbnRzOworCXVuc2lnbmVkIGludCByeF91bmljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgcnhfbXVsdGljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgcnhfZmNzX2Vycm9yczsKKwl1bnNpZ25lZCBpbnQgcnhfZGlzY2FyZHNfbm9fYnVmZmVyOworCXVuc2lnbmVkIGludCB0eF9kaXNjYXJkc193cm9uZ19zYTsKKwl1bnNpZ25lZCBpbnQgcnhfZGlzY2FyZHNfdW5kZWNyeXB0YWJsZTsKKwl1bnNpZ25lZCBpbnQgcnhfbWVzc2FnZV9pbl9tc2dfZnJhZ21lbnRzOworCXVuc2lnbmVkIGludCByeF9tZXNzYWdlX2luX2JhZF9tc2dfZnJhZ21lbnRzOworfTsKKworc3RydWN0IGllZWU4MDIxMV9kZXZpY2U7CisKKyNpbmNsdWRlICJpZWVlODAyMTFfY3J5cHQuaCIKKworI2RlZmluZSBTRUNfS0VZXzEgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgU0VDX0tFWV8yICAgICAgICAgKDE8PDEpCisjZGVmaW5lIFNFQ19LRVlfMyAgICAgICAgICgxPDwyKQorI2RlZmluZSBTRUNfS0VZXzQgICAgICAgICAoMTw8MykKKyNkZWZpbmUgU0VDX0FDVElWRV9LRVkgICAgKDE8PDQpCisjZGVmaW5lIFNFQ19BVVRIX01PREUgICAgICgxPDw1KQorI2RlZmluZSBTRUNfVU5JQ0FTVF9HUk9VUCAoMTw8NikKKyNkZWZpbmUgU0VDX0xFVkVMICAgICAgICAgKDE8PDcpCisjZGVmaW5lIFNFQ19FTkFCTEVEICAgICAgICgxPDw4KQorI2RlZmluZSBTRUNfRU5DUllQVCAgICAgICAoMTw8OSkKKworI2RlZmluZSBTRUNfTEVWRUxfMCAgICAgIDAgLyogTm9uZSAqLworI2RlZmluZSBTRUNfTEVWRUxfMSAgICAgIDEgLyogV0VQIDQwIGFuZCAxMDQgYml0ICovCisjZGVmaW5lIFNFQ19MRVZFTF8yICAgICAgMiAvKiBMZXZlbCAxICsgVEtJUCAqLworI2RlZmluZSBTRUNfTEVWRUxfMl9DS0lQIDMgLyogTGV2ZWwgMSArIENLSVAgKi8KKyNkZWZpbmUgU0VDX0xFVkVMXzMgICAgICA0IC8qIExldmVsIDIgKyBDQ01QICovCisKKyNkZWZpbmUgU0VDX0FMR19OT05FICAgICAgICAgICAgMAorI2RlZmluZSBTRUNfQUxHX1dFUCAgICAgICAgICAgICAxCisjZGVmaW5lIFNFQ19BTEdfVEtJUCAgICAgICAgICAgIDIKKyNkZWZpbmUgU0VDX0FMR19DQ01QICAgICAgICAgICAgMworCisjZGVmaW5lIFdFUF9LRVlTIAkJNAorI2RlZmluZSBXRVBfS0VZX0xFTgkJMTMKKyNkZWZpbmUgU0NNX0tFWV9MRU4gICAgICAgICAgICAgMzIKKyNkZWZpbmUgU0NNX1RFTVBPUkFMX0tFWV9MRU5HVEggMTYKKworc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSB7CisJdTE2IGFjdGl2ZV9rZXk6MiwKKwkgICAgZW5hYmxlZDoxLAorCSAgICBhdXRoX21vZGU6MiwKKwkgICAgYXV0aF9hbGdvOjQsCisJICAgIHVuaWNhc3RfdXNlc19ncm91cDoxLAorCSAgICBlbmNyeXB0OjE7CisJdTgga2V5X3NpemVzW1dFUF9LRVlTXTsKKwl1OCBrZXlzW1dFUF9LRVlTXVtTQ01fS0VZX0xFTl07CisJdTggbGV2ZWw7CisJdTE2IGZsYWdzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworLyoKKyA4MDIuMTEgZGF0YSBmcmFtZSBmcm9tIEFQCisgICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK0J5dGVzIHwgIDIgICB8ICAyICAgfCAgICA2ICAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgMiAgIHwgMC4uMjMxMiB8ICAgNCAgfAorICAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS18CitEZXNjLiB8IGN0cmwgfCBkdXJhIHwgIERBL1JBICB8ICAgVEEgICAgfCAgICBTQSAgIHwgU2VxdSB8ICBmcmFtZSAgfCAgZmNzIHwKKyAgICAgIHwgICAgICB8IHRpb24gfCAoQlNTSUQpIHwgICAgICAgICB8ICAgICAgICAgfCBlbmNlIHwgIGRhdGEgICB8ICAgICAgfAorICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCitUb3RhbDogMjgtMjM0MCBieXRlcworKi8KKworLyogTWFuYWdlbWVudCBGcmFtZSBJbmZvcm1hdGlvbiBFbGVtZW50IFR5cGVzICovCitlbnVtIGllZWU4MDIxMV9tZmllIHsKKwlNRklFX1RZUEVfU1NJRCA9IDAsCisJTUZJRV9UWVBFX1JBVEVTID0gMSwKKwlNRklFX1RZUEVfRkhfU0VUID0gMiwKKwlNRklFX1RZUEVfRFNfU0VUID0gMywKKwlNRklFX1RZUEVfQ0ZfU0VUID0gNCwKKwlNRklFX1RZUEVfVElNID0gNSwKKwlNRklFX1RZUEVfSUJTU19TRVQgPSA2LAorCU1GSUVfVFlQRV9DT1VOVFJZID0gNywKKwlNRklFX1RZUEVfSE9QX1BBUkFNUyA9IDgsCisJTUZJRV9UWVBFX0hPUF9UQUJMRSA9IDksCisJTUZJRV9UWVBFX1JFUVVFU1QgPSAxMCwKKwlNRklFX1RZUEVfQ0hBTExFTkdFID0gMTYsCisJTUZJRV9UWVBFX1BPV0VSX0NPTlNUUkFJTlQgPSAzMiwKKwlNRklFX1RZUEVfUE9XRVJfQ0FQQUJJTElUWSA9IDMzLAorCU1GSUVfVFlQRV9UUENfUkVRVUVTVCA9IDM0LAorCU1GSUVfVFlQRV9UUENfUkVQT1JUID0gMzUsCisJTUZJRV9UWVBFX1NVUFBfQ0hBTk5FTFMgPSAzNiwKKwlNRklFX1RZUEVfQ1NBID0gMzcsCisJTUZJRV9UWVBFX01FQVNVUkVfUkVRVUVTVCA9IDM4LAorCU1GSUVfVFlQRV9NRUFTVVJFX1JFUE9SVCA9IDM5LAorCU1GSUVfVFlQRV9RVUlFVCA9IDQwLAorCU1GSUVfVFlQRV9JQlNTX0RGUyA9IDQxLAorCU1GSUVfVFlQRV9FUlAgPSA0MiwKKwlNRklFX1RZUEVfUlNOID0gNDgsCisJTUZJRV9UWVBFX1JBVEVTX0VYID0gNTAsCisJTUZJRV9UWVBFX0hUX0NBUD0gNDUsCisJIE1GSUVfVFlQRV9IVF9JTkZPPSA2MSwKKwkgTUZJRV9UWVBFX0FJUk9ORVQ9MTMzLAorCU1GSUVfVFlQRV9HRU5FUklDID0gMjIxLAorCU1GSUVfVFlQRV9RT1NfUEFSQU1FVEVSID0gMjIyLAorfTsKKworLyogTWluaW1hbCBoZWFkZXI7IGNhbiBiZSB1c2VkIGZvciBwYXNzaW5nIDgwMi4xMSBmcmFtZXMgd2l0aCBzdWZmaWNpZW50CisgKiBpbmZvcm1hdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0eXBlIG9mIHVuZGVybHlpbmcgZGF0YSB0eXBlIGlzIGFjdHVhbGx5CisgKiBzdG9yZWQgaW4gdGhlIGRhdGEuICovCitzdHJ1Y3QgaWVlZTgwMjExX2hkciB7CisJX19sZTE2IGZyYW1lX2N0bDsKKwlfX2xlMTYgZHVyYXRpb25faWQ7CisJdTggcGF5bG9hZFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2hkcl8xYWRkciB7CisJX19sZTE2IGZyYW1lX2N0bDsKKwlfX2xlMTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IHBheWxvYWRbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9oZHJfMmFkZHIgeworCV9fbGUxNiBmcmFtZV9jdGw7CisJX19sZTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBhZGRyMltFVEhfQUxFTl07CisJdTggcGF5bG9hZFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciB7CisJX19sZTE2IGZyYW1lX2N0bDsKKwlfX2xlMTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJX19sZTE2IHNlcV9jdGw7CisJdTggcGF5bG9hZFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciB7CisJX19sZTE2IGZyYW1lX2N0bDsKKwlfX2xlMTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJX19sZTE2IHNlcV9jdGw7CisJdTggYWRkcjRbRVRIX0FMRU5dOworCXU4IHBheWxvYWRbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJxb3MgeworCV9fbGUxNiBmcmFtZV9jdGw7CisJX19sZTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBhZGRyMltFVEhfQUxFTl07CisJdTggYWRkcjNbRVRIX0FMRU5dOworCV9fbGUxNiBzZXFfY3RsOworCXU4IHBheWxvYWRbMF07CisJX19sZTE2IHFvc19jdGw7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHJxb3MgeworCV9fbGUxNiBmcmFtZV9jdGw7CisJX19sZTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBhZGRyMltFVEhfQUxFTl07CisJdTggYWRkcjNbRVRIX0FMRU5dOworCV9fbGUxNiBzZXFfY3RsOworCXU4IGFkZHI0W0VUSF9BTEVOXTsKKwl1OCBwYXlsb2FkWzBdOworCV9fbGUxNiBxb3NfY3RsOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IHsKKwl1OCBpZDsKKwl1OCBsZW47CisJdTggZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisJX19sZTE2IGFsZ29yaXRobTsKKwlfX2xlMTYgdHJhbnNhY3Rpb247CisJX19sZTE2IHN0YXR1czsKKwkvKmNoYWxsZW5nZSovCisJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50WzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2MgeworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKKwlfX2xlMTYgcmVhc29uOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCB7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOworCS8qIFNTSUQsIHN1cHBvcnRlZCByYXRlcyAqLworCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisJdTMyIHRpbWVfc3RhbXBbMl07CisJX19sZTE2IGJlYWNvbl9pbnRlcnZhbDsKKwlfX2xlMTYgY2FwYWJpbGl0eTsKKwkvKiBTU0lELCBzdXBwb3J0ZWQgcmF0ZXMsIEZIIHBhcmFtcywgRFMgcGFyYW1zLAorCSAqIENGIHBhcmFtcywgSUJTUyBwYXJhbXMsIFRJTSAoaWYgYmVhY29uKSwgUlNOICovCisJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50WzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIEFsaWFzIGJlYWNvbiBmb3IgcHJvYmVfcmVzcG9uc2UgKi8KKyNkZWZpbmUgaWVlZTgwMjExX2JlYWNvbiBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UKKworc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisJX19sZTE2IGNhcGFiaWxpdHk7CisJX19sZTE2IGxpc3Rlbl9pbnRlcnZhbDsKKwkvKiBTU0lELCBzdXBwb3J0ZWQgcmF0ZXMsIFJTTiAqLworCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX3JlYXNzb2NfcmVxdWVzdF9mcmFtZSB7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOworCV9fbGUxNiBjYXBhYmlsaXR5OworCV9fbGUxNiBsaXN0ZW5faW50ZXJ2YWw7CisJdTggY3VycmVudF9hcFtFVEhfQUxFTl07CisJLyogU1NJRCwgc3VwcG9ydGVkIHJhdGVzLCBSU04gKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnRbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSB7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOworCV9fbGUxNiBjYXBhYmlsaXR5OworCV9fbGUxNiBzdGF0dXM7CisJX19sZTE2IGFpZDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnRbMF07IC8qIHN1cHBvcnRlZCByYXRlcyAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfdHhiIHsKKwl1OCBucl9mcmFnczsKKwl1OCBlbmNyeXB0ZWQ7CisJdTggcXVldWVfaW5kZXg7CisJdTggcnRzX2luY2x1ZGVkOworCXUxNiByZXNlcnZlZDsKKwlfX2xlMTYgZnJhZ19zaXplOworCV9fbGUxNiBwYXlsb2FkX3NpemU7CisJc3RydWN0IHNrX2J1ZmYgKmZyYWdtZW50c1swXTsKK307CisKKyNkZWZpbmUgTUFYX1RYX0FHR19DT1VOVAkJICAxNgorc3RydWN0IGllZWU4MDIxMV9kcnZfYWdnX3R4YiB7CisJdTggbnJfZHJ2X2FnZ19mcmFtZXM7CisJc3RydWN0IHNrX2J1ZmYgKnR4X2FnZ19mcmFtZXNbTUFYX1RYX0FHR19DT1VOVF07Cit9X19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgTUFYX1NVQkZSQU1FX0NPVU5UIAkJICA2NAorc3RydWN0IGllZWU4MDIxMV9yeGIgeworCXU4IG5yX3N1YmZyYW1lczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc3ViZnJhbWVzW01BWF9TVUJGUkFNRV9DT1VOVF07CisJdTggZHN0W0VUSF9BTEVOXTsKKwl1OCBzcmNbRVRIX0FMRU5dOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCit0eXBlZGVmIHVuaW9uIF9mcmFtZXFvcyB7CisJdTE2IHNob3J0ZGF0YTsKKwl1OCAgY2hhcmRhdGFbMl07CisJc3RydWN0IHsKKwkJdTE2IHRpZDo0OworCQl1MTYgZW9zcDoxOworCQl1MTYgYWNrX3BvbGljeToyOworCQl1MTYgcmVzZXJ2ZWQ6MTsKKwkJdTE2IHR4b3A6ODsKKwl9ZmllbGQ7Cit9ZnJhbWVxb3MsKnBmcmFtZXFvczsKKworLyogU1dFRVAgVEFCTEUgRU5UUklFUyBOVU1CRVIqLworI2RlZmluZSBNQVhfU1dFRVBfVEFCX0VOVFJJRVMJCSAgNDIKKyNkZWZpbmUgTUFYX1NXRUVQX1RBQl9FTlRSSUVTX1BFUl9QQUNLRVQgIDcKKy8qIE1BWF9SQVRFU19MRU5HVEggbmVlZHMgdG8gYmUgMTIuICBUaGUgc3BlYyBzYXlzIDgsIGFuZCBtYW55IEFQcworICogb25seSB1c2UgOCwgYW5kIHRoZW4gdXNlIGV4dGVuZGVkIHJhdGVzIGZvciB0aGUgcmVtYWluaW5nIHN1cHBvcnRlZAorICogcmF0ZXMuICBPdGhlciBBUHMsIGhvd2V2ZXIsIHN0aWNrIGFsbCBvZiB0aGVpciBzdXBwb3J0ZWQgcmF0ZXMgb24gdGhlCisgKiBtYWluIHJhdGVzIGluZm9ybWF0aW9uIGVsZW1lbnQuLi4gKi8KKyNkZWZpbmUgTUFYX1JBVEVTX0xFTkdUSCAgICAgICAgICAgICAgICAgICgodTgpMTIpCisjZGVmaW5lIE1BWF9SQVRFU19FWF9MRU5HVEggICAgICAgICAgICAgICAoKHU4KTE2KQorI2RlZmluZSBNQVhfTkVUV09SS19DT1VOVCAgICAgICAgICAgICAgICAgIDEyOAorCisjZGVmaW5lIE1BWF9DSEFOTkVMX05VTUJFUiAgICAgICAgICAgICAgICAgMTYxCisjZGVmaW5lIElFRUU4MDIxMV9TT0ZUTUFDX1NDQU5fVElNRQkgICAxMDAKKy8vKEhaIC8gMikKKyNkZWZpbmUgSUVFRTgwMjExX1NPRlRNQUNfQVNTT0NfUkVUUllfVElNRSAoSFogKiAyKQorCisjZGVmaW5lIENSQ19MRU5HVEggICAgICAgICAgICAgICAgIDRVCisKKyNkZWZpbmUgTUFYX1dQQV9JRV9MRU4gNjQKKworI2RlZmluZSBORVRXT1JLX0VNUFRZX0VTU0lEICgxPDwwKQorI2RlZmluZSBORVRXT1JLX0hBU19PRkRNICAgICgxPDwxKQorI2RlZmluZSBORVRXT1JLX0hBU19DQ0sgICAgICgxPDwyKQorCisvKiBRb1Mgc3RydWN0dXJlICovCisjZGVmaW5lIE5FVFdPUktfSEFTX1FPU19QQVJBTUVURVJTICAgICAgKDE8PDMpCisjZGVmaW5lIE5FVFdPUktfSEFTX1FPU19JTkZPUk1BVElPTiAgICAgKDE8PDQpCisjZGVmaW5lIE5FVFdPUktfSEFTX1FPU19NQVNLICAgICAgICAgICAgKE5FVFdPUktfSEFTX1FPU19QQVJBTUVURVJTIHwgXAorCQkJCQkgTkVUV09SS19IQVNfUU9TX0lORk9STUFUSU9OKQorLyogODAyLjExaCAqLworI2RlZmluZSBORVRXT1JLX0hBU19QT1dFUl9DT05TVFJBSU5UICAgICgxPDw1KQorI2RlZmluZSBORVRXT1JLX0hBU19DU0EgICAgICAgICAgICAgICAgICgxPDw2KQorI2RlZmluZSBORVRXT1JLX0hBU19RVUlFVCAgICAgICAgICAgICAgICgxPDw3KQorI2RlZmluZSBORVRXT1JLX0hBU19JQlNTX0RGUyAgICAgICAgICAgICgxPDw4KQorI2RlZmluZSBORVRXT1JLX0hBU19UUENfUkVQT1JUICAgICAgICAgICgxPDw5KQorCisjZGVmaW5lIE5FVFdPUktfSEFTX0VSUF9WQUxVRSAgICAgICAgICAgKDE8PDEwKQorCisjZGVmaW5lIFFPU19RVUVVRV9OVU0gICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBRT1NfT1VJX0xFTiAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUU9TX09VSV9UWVBFICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFFPU19FTEVNRU5UX0lEICAgICAgICAgICAgICAgICAgMjIxCisjZGVmaW5lIFFPU19PVUlfSU5GT19TVUJfVFlQRSAgICAgICAgICAgMAorI2RlZmluZSBRT1NfT1VJX1BBUkFNX1NVQl9UWVBFICAgICAgICAgIDEKKyNkZWZpbmUgUU9TX1ZFUlNJT05fMSAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFFPU19BSUZTTl9NSU5fVkFMVUUgICAgICAgICAgICAgMgorc3RydWN0IGllZWU4MDIxMV9xb3NfaW5mb3JtYXRpb25fZWxlbWVudCB7CisJdTggZWxlbWVudElEOworCXU4IGxlbmd0aDsKKwl1OCBxdWlbUU9TX09VSV9MRU5dOworCXU4IHF1aV90eXBlOworCXU4IHF1aV9zdWJ0eXBlOworCXU4IHZlcnNpb247CisJdTggYWNfaW5mbzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX3Fvc19hY19wYXJhbWV0ZXIgeworCXU4IGFjaV9haWZzbjsKKwl1OCBlY3dfbWluX21heDsKKwlfX2xlMTYgdHhfb3BfbGltaXQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9xb3NfcGFyYW1ldGVyX2luZm8geworCXN0cnVjdCBpZWVlODAyMTFfcW9zX2luZm9ybWF0aW9uX2VsZW1lbnQgaW5mb19lbGVtZW50OworCXU4IHJlc2VydmVkOworCXN0cnVjdCBpZWVlODAyMTFfcW9zX2FjX3BhcmFtZXRlciBhY19wYXJhbXNfcmVjb3JkW1FPU19RVUVVRV9OVU1dOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcnMgeworCV9fbGUxNiBjd19taW5bUU9TX1FVRVVFX05VTV07CisJX19sZTE2IGN3X21heFtRT1NfUVVFVUVfTlVNXTsKKwl1OCBhaWZzW1FPU19RVUVVRV9OVU1dOworCXU4IGZsYWdbUU9TX1FVRVVFX05VTV07CisJX19sZTE2IHR4X29wX2xpbWl0W1FPU19RVUVVRV9OVU1dOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfcW9zX2RhdGEgeworCXN0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcnMgcGFyYW1ldGVyczsKKwlpbnQgYWN0aXZlOworCWludCBzdXBwb3J0ZWQ7CisJdTggcGFyYW1fY291bnQ7CisJdTggb2xkX3BhcmFtX2NvdW50OworfTsKKworc3RydWN0IGllZWU4MDIxMV90aW1fcGFyYW1ldGVycyB7CisJdTggdGltX2NvdW50OworCXU4IHRpbV9wZXJpb2Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLy8jZWxzZQorc3RydWN0IGllZWU4MDIxMV93bW1fYWNfcGFyYW0geworCXU4IGFjX2FjaV9hY21fYWlmc247CisJdTggYWNfZWN3bWluX2Vjd21heDsKKwl1MTYgYWNfdHhvcF9saW1pdDsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfd21tX3RzX2luZm8geworCXU4IGFjX2Rpcl90aWQ7CisJdTggYWNfdXBfcHNiOworCXU4IHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfd21tX3RzcGVjX2VsZW0geworCXN0cnVjdCBpZWVlODAyMTFfd21tX3RzX2luZm8gdHNfaW5mbzsKKwl1MTYgbm9ybV9tc2R1X3NpemU7CisJdTE2IG1heF9tc2R1X3NpemU7CisJdTMyIG1pbl9zZXJ2X2ludGVyOworCXUzMiBtYXhfc2Vydl9pbnRlcjsKKwl1MzIgaW5hY3RfaW50ZXI7CisJdTMyIHN1c3Blbl9pbnRlcjsKKwl1MzIgc2Vydl9zdGFydF90aW1lOworCXUzMiBtaW5fZGF0YV9yYXRlOworCXUzMiBtZWFuX2RhdGFfcmF0ZTsKKwl1MzIgcGVha19kYXRhX3JhdGU7CisJdTMyIG1heF9idXJzdF9zaXplOworCXUzMiBkZWxheV9ib3VuZDsKKwl1MzIgbWluX3BoeV9yYXRlOworCXUxNiBzdXJwX2JhbmRfYWxsb3c7CisJdTE2IG1lZGl1bV90aW1lOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworZW51bSBlYXBfdHlwZSB7CisJRUFQX1BBQ0tFVCA9IDAsCisJRUFQT0xfU1RBUlQsCisJRUFQT0xfTE9HT0ZGLAorCUVBUE9MX0tFWSwKKwlFQVBPTF9FTkNBUF9BU0ZfQUxFUlQKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICplYXBfdHlwZXNbXSA9IHsKKwlbRUFQX1BBQ0tFVF0JCT0gIkVBUC1QYWNrZXQiLAorCVtFQVBPTF9TVEFSVF0JCT0gIkVBUE9MLVN0YXJ0IiwKKwlbRUFQT0xfTE9HT0ZGXQkJPSAiRUFQT0wtTG9nb2ZmIiwKKwlbRUFQT0xfS0VZXQkJPSAiRUFQT0wtS2V5IiwKKwlbRUFQT0xfRU5DQVBfQVNGX0FMRVJUXQk9ICJFQVBPTC1FbmNhcC1BU0YtQWxlcnQiCit9OworCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmVhcF9nZXRfdHlwZShpbnQgdHlwZSkKK3sKKwlyZXR1cm4gKCh1MzIpdHlwZSA+PSBBUlJBWV9TSVpFKGVhcF90eXBlcykpID8gIlVua25vd24iIDogZWFwX3R5cGVzW3R5cGVdOworfQorLy9hZGRlZCBieSBhbXkgZm9yIHJlb3JkZXIKK3N0YXRpYyBpbmxpbmUgdTggRnJhbWVfUW9TVElEKHU4KiBidWYpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmhkcjsKKwl1MTYgZmM7CisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopYnVmOworCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCXJldHVybiAodTgpKChmcmFtZXFvcyopKGJ1ZiArICgoKGZjICYgSUVFRTgwMjExX0ZDVExfVE9EUykmJihmYyAmIElFRUU4MDIxMV9GQ1RMX0ZST01EUykpPyAzMCA6IDI0KSkpLT5maWVsZC50aWQ7Cit9CisKKy8vYWRkZWQgYnkgYW15IGZvciByZW9yZGVyCisKK3N0cnVjdCBlYXBvbCB7CisJdTggc25hcFs2XTsKKwl1MTYgZXRoZXJ0eXBlOworCXU4IHZlcnNpb247CisJdTggdHlwZTsKKwl1MTYgbGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfc29mdG1hY19zdGF0c3sKKwl1bnNpZ25lZCBpbnQgcnhfYXNzX29rOworCXVuc2lnbmVkIGludCByeF9hc3NfZXJyOworCXVuc2lnbmVkIGludCByeF9wcm9iZV9ycTsKKwl1bnNpZ25lZCBpbnQgdHhfcHJvYmVfcnM7CisJdW5zaWduZWQgaW50IHR4X2JlYWNvbnM7CisJdW5zaWduZWQgaW50IHJ4X2F1dGhfcnE7CisJdW5zaWduZWQgaW50IHJ4X2F1dGhfcnNfb2s7CisJdW5zaWduZWQgaW50IHJ4X2F1dGhfcnNfZXJyOworCXVuc2lnbmVkIGludCB0eF9hdXRoX3JxOworCXVuc2lnbmVkIGludCBub19hdXRoX3JzOworCXVuc2lnbmVkIGludCBub19hc3NfcnM7CisJdW5zaWduZWQgaW50IHR4X2Fzc19ycTsKKwl1bnNpZ25lZCBpbnQgcnhfYXNzX3JxOworCXVuc2lnbmVkIGludCB0eF9wcm9iZV9ycTsKKwl1bnNpZ25lZCBpbnQgcmVhc3NvYzsKKwl1bnNpZ25lZCBpbnQgc3d0eHN0b3A7CisJdW5zaWduZWQgaW50IHN3dHhhd2FrZTsKKwl1bnNpZ25lZCBjaGFyIEN1cnJlbnRTaG93VHhhdGU7CisJdW5zaWduZWQgY2hhciBsYXN0X3BhY2tldF9yYXRlOworCXVuc2lnbmVkIGludCB0eHJldHJ5Y291bnQ7Cit9OworCisjZGVmaW5lIEJFQUNPTl9QUk9CRV9TU0lEX0lEX1BPU0lUSU9OIDEyCisKK3N0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50X2hkciB7CisJdTggaWQ7CisJdTggbGVuOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGRhdGEgdHlwZXMgdGhhdCBjYW4gbWFrZSB1cCBtYW5hZ2VtZW50IHBhY2tldHMKKyAqCisJdTE2IGF1dGhfYWxnb3JpdGhtOworCXUxNiBhdXRoX3NlcXVlbmNlOworCXUxNiBiZWFjb25faW50ZXJ2YWw7CisJdTE2IGNhcGFiaWxpdHk7CisJdTggY3VycmVudF9hcFtFVEhfQUxFTl07CisJdTE2IGxpc3Rlbl9pbnRlcnZhbDsKKwlzdHJ1Y3QgeworCQl1MTYgYXNzb2NpYXRpb25faWQ6MTQsIHJlc2VydmVkOjI7CisJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisJdTMyIHRpbWVfc3RhbXBbMl07CisJdTE2IHJlYXNvbjsKKwl1MTYgc3RhdHVzOworKi8KKworI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9UWF9FU1NJRCAiUGVuZ3VpbiIKKyNkZWZpbmUgSUVFRTgwMjExX0RFRkFVTFRfQkFTSUNfUkFURSAyIC8vMU1icHMKKworZW51bSB7V01NX2FsbF9mcmFtZSwgV01NX3R3b19mcmFtZSwgV01NX2ZvdXJfZnJhbWUsIFdNTV9zaXhfZnJhbWV9OworI2RlZmluZSBNQVhfU1BfTGVuICAoV01NX2FsbF9mcmFtZSA8PCA0KQorI2RlZmluZSBJRUVFODAyMTFfUU9TX1RJRCAweDBmCisjZGVmaW5lIFFPU19DVExfTk9UQ09OVEFJTl9BQ0sgKDB4MDEgPDwgNSkKKworI2RlZmluZSBJRUVFODAyMTFfRFRJTV9NQkNBU1QgNAorI2RlZmluZSBJRUVFODAyMTFfRFRJTV9VQ0FTVCAyCisjZGVmaW5lIElFRUU4MDIxMV9EVElNX1ZBTElEIDEKKyNkZWZpbmUgSUVFRTgwMjExX0RUSU1fSU5WQUxJRCAwCisKKyNkZWZpbmUgSUVFRTgwMjExX1BTX0RJU0FCTEVEIDAKKyNkZWZpbmUgSUVFRTgwMjExX1BTX1VOSUNBU1QgSUVFRTgwMjExX0RUSU1fVUNBU1QKKyNkZWZpbmUgSUVFRTgwMjExX1BTX01CQ0FTVCBJRUVFODAyMTFfRFRJTV9NQkNBU1QKKworLy9hZGRlZCBieSBEYXZpZCBmb3IgUW9TIDIwMDYvNi8zMAorLy8jZGVmaW5lIFdNTV9IYW5nXzgxODcKKyNpZmRlZiBXTU1fSGFuZ184MTg3CisjdW5kZWYgV01NX0hhbmdfODE4NworI2VuZGlmCisKKyNkZWZpbmUgV01FX0FDX0JLICAgMHgwMAorI2RlZmluZSBXTUVfQUNfQkUgICAweDAxCisjZGVmaW5lIFdNRV9BQ19WSSAgIDB4MDIKKyNkZWZpbmUgV01FX0FDX1ZPICAgMHgwMworI2RlZmluZSBXTUVfQUNJX01BU0sgMHgwMworI2RlZmluZSBXTUVfQUlGU05fTUFTSyAweDAzCisjZGVmaW5lIFdNRV9BQ19QUkFNX0xFTiAxNgorCisjZGVmaW5lIE1BWF9SRUNFSVZFX0JVRkZFUl9TSVpFIDkxMDAKKworLy9VUCBNYXBwaW5nIHRvIEFDLCB1c2luZyBpbiBNZ250UXVlcnlfU2VxdWVuY2VOdW1iZXIoKSBhbmQgbWF5YmUgZm9yIERTQ1AKKy8vI2RlZmluZSBVUDJBQyh1cCkJKCh1cDwzKSA/ICgodXA9PTApPzE6MCkgOiAodXA+PjEpKQorI2RlZmluZSBVUDJBQyh1cCkgKAkJICAgXAorCSgodXApIDwgMSkgPyBXTUVfQUNfQkUgOiBcCisJKCh1cCkgPCAzKSA/IFdNRV9BQ19CSyA6IFwKKwkoKHVwKSA8IDQpID8gV01FX0FDX0JFIDogXAorCSgodXApIDwgNikgPyBXTUVfQUNfVkkgOiBcCisJV01FX0FDX1ZPKQorLy9BQyBNYXBwaW5nIHRvIFVQLCB1c2luZyBpbiBUeCBwYXJ0IGZvciBzZWxlY3RpbmcgdGhlIGNvcnJlc3BvbmRpbmcgVFggcXVldWUKKyNkZWZpbmUgQUMyVVAoX2FjKQkoICAgICAgIFwKKwkoKF9hYykgPT0gV01FX0FDX1ZPKSA/IDYgOiBcCisJKChfYWMpID09IFdNRV9BQ19WSSkgPyA1IDogXAorCSgoX2FjKSA9PSBXTUVfQUNfQkspID8gMSA6IFwKKwkwKQorCisjZGVmaW5lCUVUSEVSX0FERFJfTEVOCQk2CS8qIGxlbmd0aCBvZiBhbiBFdGhlcm5ldCBhZGRyZXNzICovCisjZGVmaW5lIEVUSEVSTkVUX0hFQURFUl9TSVpFICAgIDE0ICAgICAgLyogbGVuZ3RoIG9mIHR3byBFdGhlcm5ldCBhZGRyZXNzIHBsdXMgZXRoZXIgdHlwZSovCisKK3N0cnVjdAlldGhlcl9oZWFkZXIgeworCXU4IGV0aGVyX2Rob3N0W0VUSEVSX0FERFJfTEVOXTsKKwl1OCBldGhlcl9zaG9zdFtFVEhFUl9BRERSX0xFTl07CisJdTE2IGV0aGVyX3R5cGU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjaWZuZGVmIEVUSEVSVFlQRV9QQUUKKyNkZWZpbmUJRVRIRVJUWVBFX1BBRQkweDg4OGUJCS8qIEVBUE9MIFBBRS84MDIuMXggKi8KKyNlbmRpZgorI2lmbmRlZiBFVEhFUlRZUEVfSVAKKyNkZWZpbmUJRVRIRVJUWVBFX0lQCTB4MDgwMAkJLyogSVAgcHJvdG9jb2wgKi8KKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBfYnNzX2h0eworCisJYm9vbAkJCQlzdXBwb3J0X2h0OworCisJLy8gSFQgcmVsYXRlZCBlbGVtZW50cworCXU4CQkJCQlodF9jYXBfYnVmWzMyXTsKKwl1MTYJCQkJCWh0X2NhcF9sZW47CisJdTgJCQkJCWh0X2luZm9fYnVmWzMyXTsKKwl1MTYJCQkJCWh0X2luZm9fbGVuOworCisJSFRfU1BFQ19WRVIJCQlodF9zcGVjX3ZlcjsKKwkvL0hUX0NBUEFCSUxJVFlfRUxFCQkJYmRIVENhcEVsZTsKKwkvL0hUX0lORk9STUFUSU9OX0VMRQkJYmRIVEluZm9FbGU7CisKKwlib29sCQkJCWFnZ3JlZ2F0aW9uOworCWJvb2wJCQkJbG9uZ19zbG90X3RpbWU7Cit9YnNzX2h0LCAqcGJzc19odDsKKwordHlwZWRlZiBlbnVtIF9lcnBfdHsKKwlFUlBfTm9uRVJQcHJlc2VudAk9IDB4MDEsCisJRVJQX1VzZVByb3RlY3Rpb24JPSAweDAyLAorCUVSUF9CYXJrZXJQcmVhbWJsZU1vZGUgPSAweDA0LAorfSBlcnBfdDsKKworCitzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgeworCS8qIFRoZXNlIGVudHJpZXMgYXJlIHVzZWQgdG8gaWRlbnRpZnkgYSB1bmlxdWUgbmV0d29yayAqLworCXU4IGJzc2lkW0VUSF9BTEVOXTsKKwl1OCBjaGFubmVsOworCS8qIEVuc3VyZSBudWxsLXRlcm1pbmF0ZWQgZm9yIGFueSBkZWJ1ZyBtc2dzICovCisJdTggc3NpZFtJV19FU1NJRF9NQVhfU0laRSArIDFdOworCXU4IHNzaWRfbGVuOworCXN0cnVjdCBpZWVlODAyMTFfcW9zX2RhdGEgcW9zX2RhdGE7CisJLy9hZGRlZCBieSBhbXkgZm9yIExFQVAKKwlib29sCWJXaXRoQWlyb25ldElFOworCWJvb2wJYkNraXBTdXBwb3J0ZWQ7CisJYm9vbAliQ2N4Um1FbmFibGU7CisJdTE2IAlDY3hSbVN0YXRlWzJdOworCS8vIENDWHY0IFM1OSwgTUJTU0lELgorCWJvb2wJYk1Cc3NpZFZhbGlkOworCXU4CU1Cc3NpZE1hc2s7CisJdTgJTUJzc2lkWzZdOworCS8vIENDWCAyIFMzOCwgV0xBTiBEZXZpY2UgVmVyc2lvbiBOdW1iZXIgZWxlbWVudC4gQW5uaWUsIDIwMDYtMDgtMjAuCisJYm9vbAliV2l0aENjeFZlck51bTsKKwl1OAlCc3NDY3hWZXJOdW1iZXI7CisJLyogVGhlc2UgYXJlIG5ldHdvcmsgc3RhdGlzdGljcyAqLworCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgc3RhdHM7CisJdTE2IGNhcGFiaWxpdHk7CisJdTggIHJhdGVzW01BWF9SQVRFU19MRU5HVEhdOworCXU4ICByYXRlc19sZW47CisJdTggIHJhdGVzX2V4W01BWF9SQVRFU19FWF9MRU5HVEhdOworCXU4ICByYXRlc19leF9sZW47CisJdW5zaWduZWQgbG9uZyBsYXN0X3NjYW5uZWQ7CisJdTggIG1vZGU7CisJdTMyIGZsYWdzOworCXUzMiBsYXN0X2Fzc29jaWF0ZTsKKwl1MzIgdGltZV9zdGFtcFsyXTsKKwl1MTYgYmVhY29uX2ludGVydmFsOworCXUxNiBsaXN0ZW5faW50ZXJ2YWw7CisJdTE2IGF0aW1fd2luZG93OworCXU4ICBlcnBfdmFsdWU7CisJdTggIHdwYV9pZVtNQVhfV1BBX0lFX0xFTl07CisJc2l6ZV90IHdwYV9pZV9sZW47CisJdTggIHJzbl9pZVtNQVhfV1BBX0lFX0xFTl07CisJc2l6ZV90IHJzbl9pZV9sZW47CisKKwlzdHJ1Y3QgaWVlZTgwMjExX3RpbV9wYXJhbWV0ZXJzIHRpbTsKKwl1OCAgZHRpbV9wZXJpb2Q7CisJdTggIGR0aW1fZGF0YTsKKwl1MzIgbGFzdF9kdGltX3N0YV90aW1lWzJdOworCisJLy9hcHBlZGVkIGZvciBRb1MKKwl1OCB3bW1faW5mbzsKKwlzdHJ1Y3QgaWVlZTgwMjExX3dtbV9hY19wYXJhbSB3bW1fcGFyYW1bNF07CisJdTggUW9TX0VuYWJsZTsKKyNpZmRlZiBUSE9NQVNfVFVSQk8KKwl1OCBUdXJib19FbmFibGU7Ly9lbmFibGUgdHVyYm8gbW9kZSwgYWRkZWQgYnkgdGhvbWFzCisjZW5kaWYKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJdTE2IENvdW50cnlJZUxlbjsKKwl1OCBDb3VudHJ5SWVCdWZbTUFYX0lFX0xFTl07CisjZW5kaWYKKwkvLyBIVCBSZWxhdGVkLCBieSBhbXksIDIwMDguMDQuMjkKKwlCU1NfSFQJYnNzaHQ7CisJLy8gQWRkIHRvIGhhbmRsZSBicm9hZGNvbSBBUCBtYW5hZ2VtZW50IGZyYW1lIENDSyByYXRlLgorCWJvb2wgYnJvYWRjb21fY2FwX2V4aXN0OworCWJvb2wgcmFsaW5rX2NhcF9leGlzdDsKKwlib29sIGF0aGVyb3NfY2FwX2V4aXN0OworCWJvb2wgY2lzY29fY2FwX2V4aXN0OworCWJvb2wgdW5rbm93bl9jYXBfZXhpc3Q7CisvLwl1OAliZXJwX2luZm87CisJYm9vbAliZXJwX2luZm9fdmFsaWQ7CisJYm9vbCBidXNlcHJvdGVjdGlvbjsKKwkvL3B1dCBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUuCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworZW51bSBpZWVlODAyMTFfc3RhdGUgeworCisJLyogdGhlIGNhcmQgaXMgbm90IGxpbmtlZCBhdCBhbGwgKi8KKwlJRUVFODAyMTFfTk9MSU5LID0gMCwKKworCS8qIElFRUU4MDIxMV9BU1NPQ0lBVElORyogYXJlIGZvciBCU1MgY2xpZW50IG1vZGUKKwkgKiB0aGUgZHJpdmVyIHNoYWxsIG5vdCBwZXJmb3JtIFJYIGZpbHRlcmluZyB1bmxlc3MKKwkgKiB0aGUgc3RhdGUgaXMgTElOS0VELgorCSAqIFRoZSBkcml2ZXIgc2hhbGwganVzdCBjaGVjayBmb3IgdGhlIHN0YXRlIExJTktFRCBhbmQKKwkgKiBkZWZhdWx0cyB0byBOT0xJTksgZm9yIEFMTCB0aGUgb3RoZXIgc3RhdGVzIChpbmNsdWRpbmcKKwkgKiBMSU5LRURfU0NBTk5JTkcpCisJICovCisKKwkvKiB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlIHdpbGwgc3RhcnQgKHdxIHNjaGVkdWxpbmcpKi8KKwlJRUVFODAyMTFfQVNTT0NJQVRJTkcsCisJSUVFRTgwMjExX0FTU09DSUFUSU5HX1JFVFJZLAorCisJLyogdGhlIGFzc29jaWF0aW9uIHByb2NlZHVyZSBpcyBzZW5kaW5nIEFVVEggcmVxdWVzdCovCisJSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FUSU5HLAorCisJLyogdGhlIGFzc29jaWF0aW9uIHByb2NlZHVyZSBoYXMgc3VjY2Vzc2Z1bGx5IGF1dGhlbnRjYXRlZAorCSAqIGFuZCBpcyBzZW5kaW5nIGFzc29jaWF0aW9uIHJlcXVlc3QKKwkgKi8KKwlJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRFRCwKKworCS8qIHRoZSBsaW5rIGlzIG9rLiB0aGUgY2FyZCBhc3NvY2lhdGVkIHRvIGEgQlNTIG9yIGxpbmtlZAorCSAqIHRvIGEgaWJzcyBjZWxsIG9yIGFjdGluZyBhcyBhbiBBUCBhbmQgY3JlYXRpbmcgdGhlIGJzcworCSAqLworCUlFRUU4MDIxMV9MSU5LRUQsCisKKwkvKiBzYW1lIGFzIExJTktFRCwgYnV0IHRoZSBkcml2ZXIgc2hhbGwgYXBwbHkgUlggZmlsdGVyCisJICogcnVsZXMgYXMgd2UgYXJlIGluIE5PX0xJTksgbW9kZS4gQXMgdGhlIGNhcmQgaXMgc3RpbGwKKwkgKiBsb2dpY2FsbHkgbGlua2VkLCBidXQgaXQgaXMgZG9pbmcgYSBzeW5jcm8gc2l0ZSBzdXJ2ZXkKKwkgKiB0aGVuIGl0IHdpbGwgYmUgYmFjayB0byBMSU5LRUQgc3RhdGUuCisJICovCisJSUVFRTgwMjExX0xJTktFRF9TQ0FOTklORywKKworfTsKKworI2RlZmluZSBERUZBVUxUX01BWF9TQ0FOX0FHRSAoMTUgKiBIWikKKyNkZWZpbmUgREVGQVVMVF9GVFMgMjM0NgorCisjZGVmaW5lIENGR19JRUVFODAyMTFfUkVTRVJWRV9GQ1MgKDE8PDApCisjZGVmaW5lIENGR19JRUVFODAyMTFfQ09NUFVURV9GQ1MgKDE8PDEpCisjZGVmaW5lIENGR19JRUVFODAyMTFfUlRTICgxPDwyKQorCisjZGVmaW5lIElFRUU4MDIxMV8yNEdIWl9NSU5fQ0hBTk5FTCAxCisjZGVmaW5lIElFRUU4MDIxMV8yNEdIWl9NQVhfQ0hBTk5FTCAxNAorI2RlZmluZSBJRUVFODAyMTFfMjRHSFpfQ0hBTk5FTFMgKElFRUU4MDIxMV8yNEdIWl9NQVhfQ0hBTk5FTCAtIFwKKwkJCQkgIElFRUU4MDIxMV8yNEdIWl9NSU5fQ0hBTk5FTCArIDEpCisKKyNkZWZpbmUgSUVFRTgwMjExXzUyR0haX01JTl9DSEFOTkVMIDM0CisjZGVmaW5lIElFRUU4MDIxMV81MkdIWl9NQVhfQ0hBTk5FTCAxNjUKKyNkZWZpbmUgSUVFRTgwMjExXzUyR0haX0NIQU5ORUxTIChJRUVFODAyMTFfNTJHSFpfTUFYX0NIQU5ORUwgLSBcCisJCQkJICBJRUVFODAyMTFfNTJHSFpfTUlOX0NIQU5ORUwgKyAxKQorCisKKwordHlwZWRlZiBzdHJ1Y3QgdHhfcGVuZGluZ190eworCWludCBmcmFnOworCXN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGI7Cit9dHhfcGVuZGluZ190OworCit0eXBlZGVmIHN0cnVjdCBfYmFuZHdpZHRoX2F1dG9zd2l0Y2gKK3sKKwlsb25nIHRocmVzaG9sZF8yME1oenRvNDBNaHo7CisJbG9uZwl0aHJlc2hvbGRfNDBNaHp0bzIwTWh6OworCWJvb2wgYmZvcmNlZF90eDIwTWh6OworCWJvb2wgYmF1dG9zd2l0Y2hfZW5hYmxlOworfWJhbmR3aWR0aF9hdXRvc3dpdGNoLCpwYmFuZHdpZHRoX2F1dG9zd2l0Y2g7CisKKworLy9hZGRlZCBieSBhbXkgZm9yIG9yZGVyCisKKyNkZWZpbmUgUkVPUkRFUl9XSU5fU0laRQkxMjgKKyNkZWZpbmUgUkVPUkRFUl9FTlRSWV9OVU0JMTI4Cit0eXBlZGVmIHN0cnVjdCBfUlhfUkVPUkRFUl9FTlRSWQoreworCXN0cnVjdCBsaXN0X2hlYWQJTGlzdDsKKwl1MTYJCQlTZXFOdW07CisJc3RydWN0IGllZWU4MDIxMV9yeGIqIHByeGI7Cit9IFJYX1JFT1JERVJfRU5UUlksICpQUlhfUkVPUkRFUl9FTlRSWTsKKy8vYWRkZWQgYnkgYW15IGZvciBvcmRlcgordHlwZWRlZiBlbnVtIF9Gc3luY19TdGF0ZXsKKwlEZWZhdWx0X0ZzeW5jLAorCUhXX0ZzeW5jLAorCVNXX0ZzeW5jCit9RnN5bmNfU3RhdGU7CisKKy8vIFBvd2VyIHNhdmUgbW9kZSBjb25maWd1cmVkLgordHlwZWRlZgllbnVtIF9SVF9QU19NT0RFCit7CisJZUFjdGl2ZSwJLy8gQWN0aXZlL0NvbnRpbnVvdXMgYWNjZXNzLgorCWVNYXhQcywJCS8vIE1heCBwb3dlciBzYXZlIG1vZGUuCisJZUZhc3RQcwkJLy8gRmFzdCBwb3dlciBzYXZlIG1vZGUuCit9UlRfUFNfTU9ERTsKKwordHlwZWRlZiBlbnVtIF9JUFNfQ0FMTEJBQ0tfRlVOQ0lPTgoreworCUlQU19DQUxMQkFDS19OT05FID0gMCwKKwlJUFNfQ0FMTEJBQ0tfTUdOVF9MSU5LX1JFUVVFU1QgPSAxLAorCUlQU19DQUxMQkFDS19KT0lOX1JFUVVFU1QgPSAyLAorfUlQU19DQUxMQkFDS19GVU5DSU9OOworCit0eXBlZGVmIGVudW0gX1JUX0pPSU5fQUNUSU9OeworCVJUX0pPSU5fSU5GUkEgICA9IDEsCisJUlRfSk9JTl9JQlNTICA9IDIsCisJUlRfU1RBUlRfSUJTUyA9IDMsCisJUlRfTk9fQUNUSU9OICA9IDQsCit9UlRfSk9JTl9BQ1RJT047CisKK3R5cGVkZWYgc3RydWN0IF9JYnNzUGFybXN7CisJdTE2ICAgYXRpbVdpbjsKK31JYnNzUGFybXMsICpQSWJzc1Bhcm1zOworI2RlZmluZSBNQVhfTlVNX1JBVEVTCTI2NCAvLyBNYXggbnVtIG9mIHN1cHBvcnQgcmF0ZXMgZWxlbWVudDogOCwgIE1heCBudW0gb2YgZXh0LiBzdXBwb3J0IHJhdGU6IDI1NS4gMDYxMTIyLCBieSByY25qa28uCisKKy8vIFJGIHN0YXRlLgordHlwZWRlZgllbnVtIF9SVF9SRl9QT1dFUl9TVEFURQoreworCWVSZk9uLAorCWVSZlNsZWVwLAorCWVSZk9mZgorfVJUX1JGX1BPV0VSX1NUQVRFOworCit0eXBlZGVmIHN0cnVjdCBfUlRfUE9XRVJfU0FWRV9DT05UUk9MCit7CisKKwkvLworCS8vIEluYWN0aXZlIFBvd2VyIFNhdmUoSVBTKSA6IERpc2FibGUgUkYgd2hlbiBkaXNjb25uZWN0ZWQKKwkvLworCWJvb2wJCQkJYkluYWN0aXZlUHM7CisJYm9vbAkJCQliSVBTTW9kZUJhY2t1cDsKKwlib29sCQkJCWJTd1JmUHJvY2Vzc2luZzsKKwlSVF9SRl9QT1dFUl9TVEFURQllSW5hY3RpdmVQb3dlclN0YXRlOworCXN0cnVjdCB3b3JrX3N0cnVjdCAJSW5hY3RpdmVQc1dvcmtJdGVtOworCXN0cnVjdCB0aW1lcl9saXN0CUluYWN0aXZlUHNUaW1lcjsKKworCS8vIFJldHVybiBwb2ludCBmb3Igam9pbiBhY3Rpb24KKwlJUFNfQ0FMTEJBQ0tfRlVOQ0lPTglSZXR1cm5Qb2ludDsKKworCS8vIFJlY29yZWQgUGFyYW1ldGVycyBmb3IgcmVzY2hlZHVsZWQgSm9pblJlcXVlc3QKKwlib29sCQkJCWJUbXBCc3NEZXNjOworCVJUX0pPSU5fQUNUSU9OCQl0bXBKb2luQWN0aW9uOworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayB0bXBCc3NEZXNjOworCisJLy8gUmVjb3JlZCBQYXJhbWV0ZXJzIGZvciByZXNjaGVkdWxlZCBNZ250TGlua1JlcXVlc3QKKwlib29sCQkJCWJUbXBTY2FuT25seTsKKwlib29sCQkJCWJUbXBBY3RpdmVTY2FuOworCWJvb2wJCQkJYlRtcEZpbHRlckhpZGRlbkFQOworCWJvb2wJCQkJYlRtcFVwZGF0ZVBhcm1zOworCXU4CQkJCQl0bXBTc2lkQnVmWzMzXTsKKwlPQ1RFVF9TVFJJTkcJCQl0bXBTc2lkMlNjYW47CisJYm9vbAkJCQliVG1wU3NpZDJTY2FuOworCXU4CQkJCQl0bXBOZXR3b3JrVHlwZTsKKwl1OAkJCQkJdG1wQ2hhbm5lbE51bWJlcjsKKwl1MTYJCQkJCXRtcEJjblBlcmlvZDsKKwl1OAkJCQkJdG1wRHRpbVBlcmlvZDsKKwl1MTYJCQkJCXRtcG1DYXA7CisJT0NURVRfU1RSSU5HCQkJdG1wU3VwcFJhdGVTZXQ7CisJdTgJCQkJCXRtcFN1cHBSYXRlQnVmW01BWF9OVU1fUkFURVNdOworCWJvb2wJCQkJYlRtcFN1cHBSYXRlOworCUlic3NQYXJtcwkJCQl0bXBJYnBtOworCWJvb2wJCQkJYlRtcElicG07CisKKwkvLworCS8vIExlaXNyZSBQb3N3ZXIgU2F2ZSA6IERpc2FibGUgUkYgaWYgY29ubmVjdGVkIGJ1dCB0cmFmZmljIGlzIG5vdCBidXN5CisJLy8KKwlib29sCQkJCWJMZWlzdXJlUHM7CisKK31SVF9QT1dFUl9TQVZFX0NPTlRST0wsKlBSVF9QT1dFUl9TQVZFX0NPTlRST0w7CisKK3R5cGVkZWYgdTMyIFJUX1JGX0NIQU5HRV9TT1VSQ0U7CisjZGVmaW5lIFJGX0NIQU5HRV9CWV9TVyBCSVQzMQorI2RlZmluZSBSRl9DSEFOR0VfQllfSFcgQklUMzAKKyNkZWZpbmUgUkZfQ0hBTkdFX0JZX1BTIEJJVDI5CisjZGVmaW5lIFJGX0NIQU5HRV9CWV9JUFMgQklUMjgKKyNkZWZpbmUgUkZfQ0hBTkdFX0JZX0lOSVQJMAkvLyBEbyBub3QgY2hhbmdlIHRoZSBSRk9mZiByZWFzb24uIERlZmluZWQgYnkgQnJ1Y2UsIDIwMDgtMDEtMTcuCisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECit0eXBlZGVmIGVudW0KK3sKKwlDT1VOVFJZX0NPREVfRkNDID0gMCwKKwlDT1VOVFJZX0NPREVfSUMgPSAxLAorCUNPVU5UUllfQ09ERV9FVFNJID0gMiwKKwlDT1VOVFJZX0NPREVfU1BBSU4gPSAzLAorCUNPVU5UUllfQ09ERV9GUkFOQ0UgPSA0LAorCUNPVU5UUllfQ09ERV9NS0sgPSA1LAorCUNPVU5UUllfQ09ERV9NS0sxID0gNiwKKwlDT1VOVFJZX0NPREVfSVNSQUVMID0gNywKKwlDT1VOVFJZX0NPREVfVEVMRUMsCisJQ09VTlRSWV9DT0RFX01JQywKKwlDT1VOVFJZX0NPREVfR0xPQkFMX0RPTUFJTgorfWNvdW50cnlfY29kZV90eXBlX3Q7CisjZW5kaWYKKworI2RlZmluZSBSVF9NQVhfTERfU0xPVF9OVU0JMTAKK3R5cGVkZWYgc3RydWN0IF9SVF9MSU5LX0RFVEVDVF9UeworCisJdTMyCQkJCU51bVJlY3ZCY25JblBlcmlvZDsKKwl1MzIJCQkJTnVtUmVjdkRhdGFJblBlcmlvZDsKKworCXUzMgkJCQlSeEJjbk51bVtSVF9NQVhfTERfU0xPVF9OVU1dOwkvLyBudW1iZXIgb2YgUnggYmVhY29uIC8gQ2hlY2tGb3JIYW5nX3BlcmlvZCAgdG8gZGV0ZXJtaW5lIGxpbmsgc3RhdHVzCisJdTMyCQkJCVJ4RGF0YU51bVtSVF9NQVhfTERfU0xPVF9OVU1dOwkvLyBudW1iZXIgb2YgUnggZGF0YSAvIENoZWNrRm9ySGFuZ19wZXJpb2QgIHRvIGRldGVybWluZSBsaW5rIHN0YXR1cworCXUxNgkJCQlTbG90TnVtOwkvLyBudW1iZXIgb2YgQ2hlY2tGb3JIYW5nIHBlcmlvZCB0byBkZXRlcm1pbmUgbGluayBzdGF0dXMKKwl1MTYJCQkJU2xvdEluZGV4OworCisJdTMyCQkJCU51bVR4T2tJblBlcmlvZDsKKwl1MzIJCQkJTnVtUnhPa0luUGVyaW9kOworCWJvb2wJCQkJYkJ1c3lUcmFmZmljOworfVJUX0xJTktfREVURUNUX1QsICpQUlRfTElOS19ERVRFQ1RfVDsKKworCitzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYzsKKworCS8vaHcgc2VjdXJpdHkgcmVsYXRlZAorLy8JdTggaHdzZWNfc3VwcG9ydDsgLy9zdXBwb3J0PworCXU4IGh3c2VjX2FjdGl2ZTsgIC8vaHcgc2VjdXJpdHkgYWN0aXZlLgorCWJvb2wgaXNfc2lsZW50X3Jlc2V0OworCWJvb2wgaWVlZV91cDsKKwkvL2FkZGVkIGJ5IGFteQorCWJvb2wgYlN1cHBvcnRSZW1vdGVXYWtlVXA7CisJUlRfUFNfTU9ERQlkb3QxMVBvd2VyU2F2ZU1vZGU7IC8vIFBvd2VyIHNhdmUgbW9kZSBjb25maWd1cmVkLgorCWJvb2wgYWN0c2Nhbm5pbmc7CisJYm9vbCBiZWlucmV0cnk7CisJUlRfUkZfUE9XRVJfU1RBVEUJCWVSRlBvd2VyU3RhdGU7CisJUlRfUkZfQ0hBTkdFX1NPVVJDRQlSZk9mZlJlYXNvbjsKKwlib29sIGlzX3NldF9rZXk7CisJLy8xMW4gc3BlYyByZWxhdGVkIEkgd29uZGVyIGlmIFRoZXNlIGluZm8gc3RydWN0dXJlIG5lZWQgdG8gYmUgbW92ZWQgb3V0IG9mIGllZWU4MDIxMV9kZXZpY2UKKworCS8vMTFuIEhUIGJlbG93CisJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvOworCS8vc3RydWN0IHRpbWVyX2xpc3QJCVN3QndUaW1lcjsKKy8vCXNwaW5sb2NrX3QgY2hubG9wX3NwaW5sb2NrOworCXNwaW5sb2NrX3QgYndfc3BpbmxvY2s7CisKKwlzcGlubG9ja190IHJlb3JkZXJfc3BpbmxvY2s7CisJLy8gZm9yIEhUIG9wZXJhdGlvbiByYXRlIHNldC4gIHdlIHVzZSB0aGlzIG9uZSBmb3IgSFQgZGF0YSByYXRlIHRvIHNlcGVyYXRlIGRpZmZlcmVudCBkZXNjcmlwdG9ycworCS8vdGhlIHdheSBmaWxsIHRoaXMgaXMgdGhlIHNhbWUgYXMgaW4gdGhlIElFCisJdTgJUmVnZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldFsxNl07CQkvL3VzZSBSQVRSIGZvcm1hdAorCXU4CWRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXRbMTZdOwkJLy91c2UgUkFUUiBmb3JtYXQKKwl1OAlSZWdIVFN1cHBSYXRlU2V0WzE2XTsKKwl1OAkJCQlIVEN1cnJlbnRPcGVyYVJhdGU7CisJdTgJCQkJSFRIaWdoZXN0T3BlcmFSYXRlOworCS8vd2IgYWRkZWQgZm9yIHJhdGUgb3BlcmF0aW9uIG1vZGUgdG8gZmlybXdhcmUKKwl1OAliVHhEaXNhYmxlUmF0ZUZhbGxCYWNrOworCXU4IAliVHhVc2VEcml2ZXJBc3NpbmdlZFJhdGU7CisJYXRvbWljX3QJYXRtX2NobmxvcDsKKwlhdG9taWNfdAlhdG1fc3didzsKKy8vCXU4CUhUSGlnaGVzdE9wZXJhUmF0ZTsKKy8vCXU4IAlIVEN1cnJlbnRPcGVyYVJhdGU7CisKKwkvLyA4MDIuMTFlIGFuZCBXTU0gVHJhZmZpYyBTdHJlYW0gSW5mbyAoVFgpCisJc3RydWN0IGxpc3RfaGVhZAkJVHhfVFNfQWRtaXRfTGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlUeF9UU19QZW5kaW5nX0xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAkJVHhfVFNfVW51c2VkX0xpc3Q7CisJVFhfVFNfUkVDT1JECQlUeFRzUmVjb3JkW1RPVEFMX1RTX05VTV07CisJLy8gODAyLjExZSBhbmQgV01NIFRyYWZmaWMgU3RyZWFtIEluZm8gKFJYKQorCXN0cnVjdCBsaXN0X2hlYWQJCVJ4X1RTX0FkbWl0X0xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAkJUnhfVFNfUGVuZGluZ19MaXN0OworCXN0cnVjdCBsaXN0X2hlYWQJCVJ4X1RTX1VudXNlZF9MaXN0OworCVJYX1RTX1JFQ09SRAkJUnhUc1JlY29yZFtUT1RBTF9UU19OVU1dOworLy8jaWZkZWYgVE9fRE9fTElTVAorCVJYX1JFT1JERVJfRU5UUlkJUnhSZW9yZGVyRW50cnlbMTI4XTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlSeFJlb3JkZXJfVW51c2VkX0xpc3Q7CisvLyNlbmRpZgorCS8vIFFvcyByZWxhdGVkLiBBZGRlZCBieSBBbm5pZSwgMjAwNS0xMS0wMS4KKy8vCVBTVEFfUU9TCQkJcFN0YVFvczsKKwl1OAkJCQlGb3JjZWRQcmlvcml0eTsJCS8vIEZvcmNlIHBlci1wYWNrZXQgcHJpb3JpdHkgMX43LiAoZGVmYXVsdDogMCwgbm90IHRvIGZvcmNlIGl0LikKKworCisJLyogQm9va2tlZXBpbmcgc3RydWN0dXJlcyAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCBpZWVlODAyMTFfc3RhdHMgaWVlZV9zdGF0czsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NvZnRtYWNfc3RhdHMgc29mdG1hY19zdGF0czsKKworCS8qIFByb2JlIC8gQmVhY29uIG1hbmFnZW1lbnQgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIG5ldHdvcmtfZnJlZV9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgbmV0d29ya19saXN0OworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29ya3M7CisJaW50IHNjYW5zOworCWludCBzY2FuX2FnZTsKKworCWludCBpd19tb2RlOyAvKiBvcGVyYXRpbmcgbW9kZSAoSVdfTU9ERV8qKSAqLworCXN0cnVjdCBpd19zcHlfZGF0YSBzcHlfZGF0YTsKKworCXNwaW5sb2NrX3QgbG9jazsKKwlzcGlubG9ja190IHdwYXhfc3VpdGxpc3RfbG9jazsKKworCWludCB0eF9oZWFkcm9vbTsgLyogU2V0IHRvIHNpemUgb2YgYW55IGFkZGl0aW9uYWwgcm9vbSBuZWVkZWQgYXQgZnJvbnQKKwkJCSAgKiBvZiBhbGxvY2F0ZWQgVHggU0tCcyAqLworCXUzMiBjb25maWc7CisKKwkvKiBXRVAgYW5kIG90aGVyIGVuY3J5cHRpb24gcmVsYXRlZCBzZXR0aW5ncyBhdCB0aGUgZGV2aWNlIGxldmVsICovCisJaW50IG9wZW5fd2VwOyAvKiBTZXQgdG8gMSB0byBhbGxvdyB1bmVuY3J5cHRlZCBmcmFtZXMgKi8KKwlpbnQgYXV0aF9tb2RlOworCWludCByZXNldF9vbl9rZXljaGFuZ2U7IC8qIFNldCB0byAxIGlmIHRoZSBIVyBuZWVkcyB0byBiZSByZXNldCBvbgorCQkJCSAqIFdFUCBrZXkgY2hhbmdlcyAqLworCisJLyogSWYgdGhlIGhvc3QgcGVyZm9ybXMge2VuLGRlfWNyeXB0aW9uLCB0aGVuIHNldCB0byAxICovCisJaW50IGhvc3RfZW5jcnlwdDsKKwlpbnQgaG9zdF9lbmNyeXB0X21zZHU7CisJaW50IGhvc3RfZGVjcnlwdDsKKwkvKiBob3N0IHBlcmZvcm1zIG11bHRpY2FzdCBkZWNyeXB0aW9uICovCisJaW50IGhvc3RfbWNfZGVjcnlwdDsKKworCS8qIGhvc3Qgc2hvdWxkIHN0cmlwIElWIGFuZCBJQ1YgZnJvbSBwcm90ZWN0ZWQgZnJhbWVzICovCisJLyogbWVhbmluZ2Z1bCBvbmx5IHdoZW4gaGFyZHdhcmUgZGVjcnlwdGlvbiBpcyBiZWluZyB1c2VkICovCisJaW50IGhvc3Rfc3RyaXBfaXZfaWN2OworCisJaW50IGhvc3Rfb3Blbl9mcmFnOworCWludCBob3N0X2J1aWxkX2l2OworCWludCBpZWVlODAyXzF4OyAvKiBpcyBJRUVFIDgwMi4xWCB1c2VkICovCisKKwkvKiBXUEEgZGF0YSAqLworCWJvb2wgYkhhbGZXaXJlbGVzc04yNEdNb2RlOworCWludCB3cGFfZW5hYmxlZDsKKwlpbnQgZHJvcF91bmVuY3J5cHRlZDsKKwlpbnQgdGtpcF9jb3VudGVybWVhc3VyZXM7CisJaW50IHByaXZhY3lfaW52b2tlZDsKKwlzaXplX3Qgd3BhX2llX2xlbjsKKwl1OCAqd3BhX2llOworCXU4IGFwX21hY19hZGRyWzZdOworCXUxNiBwYWlyd2lzZV9rZXlfdHlwZTsKKwl1MTYgZ3JvdXBfa2V5X3R5cGU7CisJc3RydWN0IGxpc3RfaGVhZCBjcnlwdF9kZWluaXRfbGlzdDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0W1dFUF9LRVlTXTsKKwlpbnQgdHhfa2V5aWR4OyAvKiBkZWZhdWx0IFRYIGtleSBpbmRleCAoY3J5cHRbdHhfa2V5aWR4XSkgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBjcnlwdF9kZWluaXRfdGltZXI7CisJaW50IGNyeXB0X3F1aWVzY2VkOworCisJaW50IGJjcnhfc3RhX2tleTsgLyogdXNlIGluZGl2aWR1YWwga2V5cyB0byBvdmVycmlkZSBkZWZhdWx0IGtleXMgZXZlbgorCQkJICAgKiB3aXRoIFJYIG9mIGJyb2FkL211bHRpY2FzdCBmcmFtZXMgKi8KKworCS8qIEZyYWdtZW50YXRpb24gc3RydWN0dXJlcyAqLworCS8vIGVhY2ggc3RyZWFtaW5nIGNvbnRhaW4gYSBlbnRyeQorCXN0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSBmcmFnX2NhY2hlWzE3XVtJRUVFODAyMTFfRlJBR19DQUNIRV9MRU5dOworCXVuc2lnbmVkIGludCBmcmFnX25leHRfaWR4WzE3XTsKKwl1MTYgZnRzOyAvKiBGcmFnbWVudGF0aW9uIFRocmVzaG9sZCAqLworI2RlZmluZSBERUZBVUxUX1JUU19USFJFU0hPTEQgMjM0NlUKKyNkZWZpbmUgTUlOX1JUU19USFJFU0hPTEQgMQorI2RlZmluZSBNQVhfUlRTX1RIUkVTSE9MRCAyMzQ2VQorCXUxNiBydHM7IC8qIFJUUyB0aHJlc2hvbGQgKi8KKworCS8qIEFzc29jaWF0aW9uIGluZm8gKi8KKwl1OCBic3NpZFtFVEhfQUxFTl07CisKKwkvKiBUaGlzIHN0b3JlcyBpbmZvcyBmb3IgdGhlIGN1cnJlbnQgbmV0d29yay4KKwkgKiBFaXRoZXIgdGhlIG5ldHdvcmsgd2UgYXJlIGFzc29jaWF0ZWQgaW4gSU5GUkFTVFJVQ1RVUkUKKwkgKiBvciB0aGUgbmV0d29yayB0aGF0IHdlIGFyZSBjcmVhdGluZyBpbiBNQVNURVIgbW9kZS4KKwkgKiBhZC1ob2MgaXMgYSBtaXh0dXJlIDstKS4KKwkgKiBOb3RlIHRoYXQgaW4gaW5mcmFzdHJ1Y3R1cmUgbW9kZSwgZXZlbiB3aGVuIG5vdCBhc3NvY2lhdGVkLAorCSAqIGZpZWxkcyBic3NpZCBhbmQgZXNzaWQgbWF5IGJlIHZhbGlkIChpZiB3cGFfc2V0IGFuZCBlc3NpZF9zZXQKKwkgKiBhcmUgdHJ1ZSkgYXMgdGh5IGNhcnJ5IHRoZSB2YWx1ZSBzZXQgYnkgdGhlIHVzZXIgdmlhIGl3Y29uZmlnCisJICovCisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIGN1cnJlbnRfbmV0d29yazsKKworCWVudW0gaWVlZTgwMjExX3N0YXRlIHN0YXRlOworCisJaW50IHNob3J0X3Nsb3Q7CisJaW50IHJlZ19tb2RlOworCWludCBtb2RlOyAgICAgICAvKiBBLCBCLCBHICovCisJaW50IG1vZHVsYXRpb247IC8qIENDSywgT0ZETSAqLworCWludCBmcmVxX2JhbmQ7ICAvKiAyLjRHaHosIDUuMkdoeiwgTWl4ZWQgKi8KKwlpbnQgYWJnX3RydWU7ICAgLyogQUJHIGZsYWcgICAgICAgICAgICAgICovCisKKwkvKiB1c2VkIGZvciBmb3JjaW5nIHRoZSBpYnNzIHdvcmtxdWV1ZSB0byB0ZXJtaW5hdGUKKwkgKiB3aXRob3V0IHdhaXQgZm9yIHRoZSBzeW5jcm8gc2NhbiB0byB0ZXJtaW5hdGUKKwkgKi8KKwlzaG9ydCBzeW5jX3NjYW5faHVycnl1cDsKKworCWludCBwZXJmZWN0X3Jzc2k7CisJaW50IHdvcnN0X3Jzc2k7CisKKwl1MTYgcHJldl9zZXFfY3RsOyAgICAgICAvKiB1c2VkIHRvIGRyb3AgZHVwbGljYXRlIGZyYW1lcyAqLworCisJLyogbWFwIG9mIGFsbG93ZWQgY2hhbm5lbHMuIDAgaXMgZHVtbXkgKi8KKwkvLyBGSVhNRTogcmVtZWJlciB0byBkZWZhdWx0IHRvIGEgYmFzaWMgY2hhbm5lbCBwbGFuIGRlcGVuZGluZyBvZiB0aGUgUEhZIHR5cGUKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJdm9pZCogcERvdDExZEluZm87CisJYm9vbCBiR2xvYmFsRG9tYWluOworI2Vsc2UKKwlpbnQgY2hhbm5lbF9tYXBbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOworI2VuZGlmCisJaW50IHJhdGU7ICAgICAgIC8qIGN1cnJlbnQgcmF0ZSAqLworCWludCBiYXNpY19yYXRlOworCS8vRklYTUU6IHBsZWFjZSBjYWxsYmFjaywgc2VlIGlmIHJlZHVuZGFudCB3aXRoIHNvZnRtYWNfZmVhdHVyZXMKKwlzaG9ydCBhY3RpdmVfc2NhbjsKKworCS8qIHRoaXMgY29udGFpbnMgZmxhZ3MgZm9yIHNlbGVjdGl2ZWx5IGVuYWJsZSBzb2Z0bWFjIHN1cHBvcnQgKi8KKwl1MTYgc29mdG1hY19mZWF0dXJlczsKKworCS8qIGlmIHRoZSBzZXF1ZW5jZSBjb250cm9sIGZpZWxkIGlzIG5vdCBmaWxsZWQgYnkgSFcgKi8KKwl1MTYgc2VxX2N0cmxbNV07CisKKwkvKiBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgdHJhbnNhY3Rpb24gc2VxdWVuY2UgbnVtYmVyICovCisJdTE2IGFzc29jaWF0ZV9zZXE7CisKKwkvKiBBSUQgZm9yIFJUWGVkIGFzc29jaWF0aW9uIHJlc3BvbnNlcyAqLworCXUxNiBhc3NvY19pZDsKKworCS8qIHBvd2VyIHNhdmUgbW9kZSByZWxhdGVkKi8KKwlzaG9ydCBwczsKKwlzaG9ydCBzdGFfc2xlZXA7CisJaW50IHBzX3RpbWVvdXQ7CisJaW50IHBzX3BlcmlvZDsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgcHNfdGFzazsKKwl1MzIgcHNfdGg7CisJdTMyIHBzX3RsOworCisJc2hvcnQgcmF3X3R4OworCS8qIHVzZWQgaWYgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFIGlzIHNldCAqLworCXNob3J0IHF1ZXVlX3N0b3A7CisJc2hvcnQgc2Nhbm5pbmc7CisJc2hvcnQgcHJvdG9fc3RhcnRlZDsKKworCXN0cnVjdCBzZW1hcGhvcmUgd3hfc2VtOworCXN0cnVjdCBzZW1hcGhvcmUgc2Nhbl9zZW07CisKKwlzcGlubG9ja190IG1nbXRfdHhfbG9jazsKKwlzcGlubG9ja190IGJlYWNvbl9sb2NrOworCisJc2hvcnQgYmVhY29uX3R4aW5nOworCisJc2hvcnQgd2FwX3NldDsKKwlzaG9ydCBzc2lkX3NldDsKKworCXU4ICB3cGF4X3R5cGVfc2V0OyAgICAvL3thZGRlZCBieSBEYXZpZCwgMjAwNi45LjI4fQorCXUzMiB3cGF4X3R5cGVfbm90aWZ5OyAvL3thZGRlZCBieSBEYXZpZCwgMjAwNi45LjI2fQorCisJLyogUW9TIHJlbGF0ZWQgZmxhZyAqLworCWNoYXIgaW5pdF93bW1wYXJhbV9mbGFnOworCS8qIHNldCBvbiBpbml0aWFsaXphdGlvbiAqLworCXU4ICBxb3Nfc3VwcG9ydDsKKworCS8qIGZvciBkaXNjYXJkaW5nIGR1cGxpY2F0ZWQgcGFja2V0cyBpbiBJQlNTICovCisJc3RydWN0IGxpc3RfaGVhZCBpYnNzX21hY19oYXNoW0lFRUVfSUJTU19NQUNfSEFTSF9TSVpFXTsKKworCS8qIGZvciBkaXNjYXJkaW5nIGR1cGxpY2F0ZWQgcGFja2V0cyBpbiBCU1MgKi8KKwl1MTYgbGFzdF9yeHNlcV9udW1bMTddOyAvKiByeCBzZXEgcHJldmlvdXMgcGVyLXRpZCAqLworCXUxNiBsYXN0X3J4ZnJhZ19udW1bMTddOy8qIHR4IGZyYWcgcHJldmlvdXMgcGVyLXRpZCAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF9wYWNrZXRfdGltZVsxN107CisKKwkvKiBmb3IgUFMgbW9kZSAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF9yeF9wc190aW1lOworCisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFIGlzIHNldCAqLworCXN0cnVjdCBza19idWZmICptZ210X3F1ZXVlX3JpbmdbTUdNVF9RVUVVRV9OVU1dOworCWludCBtZ210X3F1ZXVlX2hlYWQ7CisJaW50IG1nbXRfcXVldWVfdGFpbDsKKy8veyBhZGRlZCBmb3IgcnRsODE5eAorI2RlZmluZSBJRUVFODAyMTFfUVVFVUVfTElNSVQgMTI4CisJdTggQXNvY1JldHJ5Q291bnQ7CisJdW5zaWduZWQgaW50IGh3X2hlYWRlcjsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHNrYl93YWl0UVtNQVhfUVVFVUVfU0laRV07CisJc3RydWN0IHNrX2J1ZmZfaGVhZCAgc2tiX2FnZ1FbTUFYX1FVRVVFX1NJWkVdOworCXN0cnVjdCBza19idWZmX2hlYWQgIHNrYl9kcnZfYWdnUVtNQVhfUVVFVUVfU0laRV07CisJdTMyCXN0YV9lZGNhX3BhcmFtWzRdOworCWJvb2wgYWdncmVnYXRpb247CisJLy8gRW5hYmxlL0Rpc2FibGUgUnggaW1tZWRpYXRlIEJBIGNhcGFiaWxpdHkuCisJYm9vbCBlbmFibGVfcnhfaW1tX0JBOworCWJvb2wgYmlic3Njb29yZGluYXRvcjsKKworCS8vK2J5IGFteSBmb3IgRE0gLDA4MDUxNQorCS8vRHluYW1pYyBUeCBwb3dlciBmb3IgbmVhci9mYXIgcmFuZ2UgZW5hYmxlL0Rpc2FibGUgICwgYnkgYW15ICwgMjAwOC0wNS0xNQorCWJvb2wJYmR5bmFtaWNfdHhwb3dlcl9lbmFibGU7CisKKwlib29sIGJDVFNUb1NlbGZFbmFibGU7CisJdTggCUNUU1RvU2VsZlRIOworCisJdTMyIAlmc3luY190aW1lX2ludGVydmFsOworCXUzMglmc3luY19yYXRlX2JpdG1hcDsKKwl1OAlmc3luY19yc3NpX3RocmVzaG9sZDsKKwlib29sCWJmc3luY19lbmFibGU7CisKKwl1OAlmc3luY19tdWx0aXBsZV90aW1laW50ZXJ2YWw7CQkvLyBGc3luY011bHRpcGxlVGltZUludGVydmFsICogRnN5bmNUaW1lSW50ZXJ2YWwKKwl1MzIJZnN5bmNfZmlyc3RkaWZmX3JhdGV0aHJlc2hvbGQ7CQkvLyBsb3cgdGhyZXNob2xkCisJdTMyCWZzeW5jX3NlY29uZGRpZmZfcmF0ZXRocmVzaG9sZDsJIC8vIGRlY3JlYXNlIHRocmVzaG9sZAorCUZzeW5jX1N0YXRlCQkJZnN5bmNfc3RhdGU7CisJYm9vbAkJYmlzX2FueV9ub25iZXBrdHM7CisJLy8yME1oeiA0ME1oeiBBdXRvU3dpdGNoIFRocmVzaG9sZAorCWJhbmR3aWR0aF9hdXRvc3dpdGNoIGJhbmR3aWR0aF9hdXRvX3N3aXRjaDsKKwkvL2ZvciB0eHBvd2VyIHRyYWNraW5nCisJYm9vbCBGd1JXUkY7CisKKwkvL2FkZGVkIGJ5IGFteSBmb3IgQVAgcm9hbWluZworCVJUX0xJTktfREVURUNUX1QJTGlua0RldGVjdEluZm87CisJLy9hZGRlZCBieSBhbXkgZm9yIHBzCisJUlRfUE9XRVJfU0FWRV9DT05UUk9MCVBvd2VyU2F2ZUNvbnRyb2w7CisvL30KKwkvKiB1c2VkIGlmIElFRUVfU09GVE1BQ19UWF9RVUVVRSBpcyBzZXQgKi8KKwlzdHJ1Y3QgIHR4X3BlbmRpbmdfdCB0eF9wZW5kaW5nOworCisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFIGlzIHNldCAqLworCXN0cnVjdCB0aW1lcl9saXN0IGFzc29jaWF0ZV90aW1lcjsKKworCS8qIHVzZWQgaWYgSUVFRV9TT0ZUTUFDX0JFQUNPTlMgaXMgc2V0ICovCisJc3RydWN0IHRpbWVyX2xpc3QgYmVhY29uX3RpbWVyOworCXN0cnVjdCB3b3JrX3N0cnVjdCBhc3NvY2lhdGVfY29tcGxldGVfd3E7CisJc3RydWN0IHdvcmtfc3RydWN0IGFzc29jaWF0ZV9wcm9jZWR1cmVfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBzb2Z0bWFjX3NjYW5fd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBhc3NvY2lhdGVfcmV0cnlfd3E7CisJIHN0cnVjdCBkZWxheWVkX3dvcmsgc3RhcnRfaWJzc193cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd3hfc3luY19zY2FuX3dxOworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKKwkvLyBRb3MgcmVsYXRlZC4gQWRkZWQgYnkgQW5uaWUsIDIwMDUtMTEtMDEuCisJLy9TVEFfUU9TICBTdGFRb3M7CisKKwkvL3UzMiBTVEFfRURDQV9QQVJBTVs0XTsKKwkvL0NIQU5ORUxfQUNDRVNTX1NFVFRJTkcgQ2hhbm5lbEFjY2Vzc1NldHRpbmc7CisKKworCS8qIENhbGxiYWNrIGZ1bmN0aW9ucyAqLworCXZvaWQgKCpzZXRfc2VjdXJpdHkpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgKnNlYyk7CisKKwkvKiBVc2VkIHRvIFRYIGRhdGEgZnJhbWUgYnkgdXNpbmcgdHhiIHN0cnVjdHMuCisJICogdGhpcyBpcyBub3QgdXNlZCBpZiBpbiB0aGUgc29mdG1hY19mZWF0dXJlcworCSAqIGlzIHNldCB0aGUgZmxhZyBJRUVFX1NPRlRNQUNfVFhfUVVFVUUKKwkgKi8KKwlpbnQgKCpoYXJkX3N0YXJ0X3htaXQpKHN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIsCisJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwlpbnQgKCpyZXNldF9wb3J0KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwlpbnQgKCppc19xdWV1ZV9mdWxsKSAoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIGludCBwcmkpOworCisJaW50ICgqaGFuZGxlX21hbmFnZW1lbnQpIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwKKwkJCQkgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqIG5ldHdvcmssIHUxNiB0eXBlKTsKKwlpbnQgKCppc19xb3NfYWN0aXZlKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKwkvKiBTb2Z0bWFjLWdlbmVyYXRlZCBmcmFtZXMgKG1hbWFnZW1lbnQpIGFyZSBUWGVkIHZpYSB0aGlzCisJICogY2FsbGJhY2sgaWYgdGhlIGZsYWcgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSBpcworCSAqIG5vdCBzZXQuIEFzIHNvbWUgY2FyZHMgbWF5IGhhdmUgZGlmZmVyZW50IEhXIHF1ZXVlcyB0aGF0CisJICogb25lIG1pZ2h0IHdhbnQgdG8gdXNlIGZvciBkYXRhIGFuZCBtYW5hZ2VtZW50IGZyYW1lcworCSAqIHRoZSBvcHRpb24gdG8gaGF2ZSB0d28gY2FsbGJhY2tzIG1pZ2h0IGJlIHVzZWZ1bC4KKwkgKiBUaGlzIGZ1Y250aW9uIGNhbid0IHNsZWVwLgorCSAqLworCWludCAoKnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogdXNlZCBpbnN0ZWFkIG9mIGhhcmRfc3RhcnRfeG1pdCAobm90IHNvZnRtYWNfaGFyZF9zdGFydF94bWl0KQorCSAqIGlmIHRoZSBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgZmVhdHVyZSBpcyB1c2VkIHRvIFRYIGRhdGEKKwkgKiBmcmFtZXMuIEkgdGhlIG9wdGlvbiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFIGlzIGFsc28gc2V0CisJICogdGhlbiBhbHNvIG1hbmFnZW1lbnQgZnJhbWVzIGFyZSBzZW50IHZpYSB0aGlzIGNhbGxiYWNrLgorCSAqIFRoaXMgZnVuY3Rpb24gY2FuJ3Qgc2xlZXAuCisJICovCisJdm9pZCAoKnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQpKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldixpbnQgcmF0ZSk7CisKKwkvKiBzdG9wcyB0aGUgSFcgcXVldWUgZm9yIERBVEEgZnJhbWVzLiBVc2VmdWwgdG8gYXZvaWQKKwkgKiB3YXN0ZSB0aW1lIHRvIFRYIGRhdGEgZnJhbWUgd2hlbiB3ZSBhcmUgcmVhc3NvY2lhdGluZworCSAqIFRoaXMgZnVuY3Rpb24gY2FuIHNsZWVwLgorCSAqLworCXZvaWQgKCpkYXRhX2hhcmRfc3RvcCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiBPSyB0aGlzIGlzIGNvbXBsZW1lbnRhciB0byBkYXRhX3BvbGxfaGFyZF9zdG9wICovCisJdm9pZCAoKmRhdGFfaGFyZF9yZXN1bWUpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogYXNrIHRvIHRoZSBkcml2ZXIgdG8gcmV0dW5lIHRoZSByYWRpbyAuCisJICogVGhpcyBmdW5jdGlvbiBjYW4gc2xlZXAuIHRoZSBkcml2ZXIgc2hvdWxkIGVuc3VyZQorCSAqIHRoZSByYWRpbyBoYXMgYmVlbiBzd2l0aGNlZCBiZWZvcmUgcmV0dXJuLgorCSAqLworCXZvaWQgKCpzZXRfY2hhbikoc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCk7CisKKwkvKiBUaGVzZSBhcmUgbm90IHVzZWQgaWYgdGhlIGllZWUgc3RhY2sgdGFrZXMgY2FyZSBvZgorCSAqIHNjYW5uaW5nIChJRUVFX1NPRlRNQUNfU0NBTiBmZWF0dXJlIHNldCkuCisJICogSW4gdGhpcyBjYXNlIG9ubHkgdGhlIHNldF9jaGFuIGlzIHVzZWQuCisJICoKKwkgKiBUaGUgc3luY3JvIHZlcnNpb24gaXMgc2ltaWxhciB0byB0aGUgc3RhcnRfc2NhbiBidXQKKwkgKiBkb2VzIG5vdCByZXR1cm4gdW50aWwgYWxsIGNoYW5uZWxzIGhhcyBiZWVuIHNjYW5uZWQuCisJICogdGhpcyBpcyBjYWxsZWQgaW4gdXNlciBjb250ZXh0IGFuZCBzaG91bGQgc2xlZXAsCisJICogaXQgaXMgY2FsbGVkIGluIGEgd29ya19xdWV1ZSB3aGVuIHN3aXRoY2luZyB0byBhZC1ob2MgbW9kZQorCSAqIG9yIGluIGJlaGFsZiBvZiBpd2xpc3Qgc2NhbiB3aGVuIHRoZSBjYXJkIGlzIGFzc29jaWF0ZWQKKwkgKiBhbmQgcm9vdCB1c2VyIGFzayBmb3IgYSBzY2FuLgorCSAqIHRoZSBmdWNudGlvbiBzdG9wX3NjYW4gc2hvdWxkIHN0b3AgYm90aCB0aGUgc3luY3JvIGFuZAorCSAqIGJhY2tncm91bmQgc2Nhbm5pbmcgYW5kIGNhbiBzbGVlcC4KKwkgKiBUaGUgZnVjbnRpb24gc3RhcnRfc2NhbiBzaG91bGQgaW5pdGlhdGUgdGhlIGJhY2tncm91bmQKKwkgKiBzY2FubmluZyBhbmQgY2FuJ3Qgc2xlZXAuCisJICovCisJdm9pZCAoKnNjYW5fc3luY3JvKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqc3RhcnRfc2Nhbikoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKnN0b3Bfc2Nhbikoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiBpbmRpY2F0ZSB0aGUgZHJpdmVyIHRoYXQgdGhlIGxpbmsgc3RhdGUgaXMgY2hhbmdlZAorCSAqIGZvciBleGFtcGxlIGl0IG1heSBpbmRpY2F0ZSB0aGUgY2FyZCBpcyBhc3NvY2lhdGVkIG5vdy4KKwkgKiBEcml2ZXIgbWlnaHQgYmUgaW50ZXJlc3RlZCBpbiB0aGlzIHRvIGFwcGx5IFJYIGZpbHRlcgorCSAqIHJ1bGVzIG9yIHNpbXBseSBsaWdodCB0aGUgTElOSyBsZWQKKwkgKi8KKwl2b2lkICgqbGlua19jaGFuZ2UpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogdGhlc2UgdHdvIGZ1bmN0aW9uIGluZGljYXRlcyB0byB0aGUgSFcgd2hlbiB0byBzdGFydAorCSAqIGFuZCBzdG9wIHRvIHNlbmQgYmVhY29ucy4gVGhpcyBpcyB1c2VkIHdoZW4gdGhlCisJICogSUVFRV9TT0ZUTUFDX0JFQUNPTlMgaXMgbm90IHNldC4gRm9yIG5vdyB0aGUKKwkgKiBzdG9wX3NlbmRfYmFjb25zIGlzIE5PVCBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCBvbmx5CisJICogYWZ0ZXIgc3RhcnRfc2VuZF9iZWFjb25zLgorCSAqLworCXZvaWQgKCpzdGFydF9zZW5kX2JlYWNvbnMpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHUxNiB0eF9yYXRlKTsKKwl2b2lkICgqc3RvcF9zZW5kX2JlYWNvbnMpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIHBvd2VyIHNhdmUgbW9kZSByZWxhdGVkICovCisJdm9pZCAoKnN0YV93YWtlX3VwKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKnBzX3JlcXVlc3RfdHhfYWNrKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKmVudGVyX3NsZWVwX3N0YXRlKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHRoLCB1MzIgdGwpOworCXNob3J0ICgqcHNfaXNfcXVldWVfZW1wdHkpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwlpbnQgKCpoYW5kbGVfYmVhY29uKSAoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIHN0cnVjdCBpZWVlODAyMTFfYmVhY29uICogYmVhY29uLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKiBuZXR3b3JrKTsKKwlpbnQgKCpoYW5kbGVfYXNzb2NfcmVzcG9uc2UpIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSAqIHJlc3AsIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqIG5ldHdvcmspOworCisKKwkvKiBjaGVjayB3aGV0aGVyIFR4IGh3IHJlc291Y2UgYXZhaWxhYmxlICovCisJc2hvcnQgKCpjaGVja19uaWNfZW5vdWdoX2Rlc2MpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBxdWV1ZV9pbmRleCk7CisJLy9hZGRlZCBieSB3YiBmb3IgSFQgcmVsYXRlZAorLy8Jdm9pZCAoKlN3Q2hubEJ5VGltZXJIYW5kbGVyKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY2hhbm5lbCk7CisJdm9pZCAoKlNldEJXTW9kZUhhbmRsZXIpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIEhUX0NIQU5ORUxfV0lEVEggQmFuZHdpZHRoLCBIVF9FWFRDSE5MX09GRlNFVCBPZmZzZXQpOworLy8Jdm9pZCAoKlVwZGF0ZUhhbFJBVFJUYWJsZUhhbmRsZXIpKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHU4KiBwTWNzUmF0ZSk7CisJYm9vbCAoKkdldE5tb2RlU3VwcG9ydEJ5U2VjQ2ZnKShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKKwl2b2lkICgqU2V0V2lyZWxlc3NNb2RlKShzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1OCB3aXJlbGVzc19tb2RlKTsKKwlib29sICgqR2V0SGFsZk5tb2RlU3VwcG9ydEJ5QVBzSGFuZGxlcikoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CisJdm9pZCAoKkluaXRpYWxHYWluSGFuZGxlcikoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggT3BlcmF0aW9uKTsKKworCS8qIFRoaXMgbXVzdCBiZSB0aGUgbGFzdCBpdGVtIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBkYXRhCisJICogYWxsb2NhdGVkIGJleW9uZCB0aGlzIHN0cnVjdHVyZSBieSBhbGxvY19pZWVlODAyMTEgKi8KKwl1OCBwcml2WzBdOworfTsKKworI2RlZmluZSBJRUVFX0EgICAgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRV9CICAgICAgICAgICAgKDE8PDEpCisjZGVmaW5lIElFRUVfRyAgICAgICAgICAgICgxPDwyKQorI2RlZmluZSBJRUVFX05fMjRHIAkJICAoMTw8NCkKKyNkZWZpbmUJSUVFRV9OXzVHCQkgICgxPDw1KQorI2RlZmluZSBJRUVFX01PREVfTUFTSyAgICAoSUVFRV9BfElFRUVfQnxJRUVFX0cpCisKKy8qIEdlbmVyYXRlIGEgODAyLjExIGhlYWRlciAqLworCisvKiBVc2VzIHRoZSBjaGFubmVsIGNoYW5nZSBjYWxsYmFjayBkaXJlY3RseQorICogaW5zdGVhZCBvZiBbc3RhcnQvc3RvcF0gc2NhbiBjYWxsYmFja3MKKyAqLworI2RlZmluZSBJRUVFX1NPRlRNQUNfU0NBTiAoMTw8MikKKworLyogUGVyZm9ybSBhdXRoZW50aWNhdGlvbiBhbmQgYXNzb2NpYXRpb24gaGFuZHNoYWtlICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUgKDE8PDMpCisKKy8qIEdlbmVyYXRlIHByb2JlIHJlcXVlc3RzICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19QUk9CRVJRICgxPDw0KQorCisvKiBHZW5lcmF0ZSByZXNwb25lcyB0byBwcm9iZSByZXF1ZXN0cyAqLworI2RlZmluZSBJRUVFX1NPRlRNQUNfUFJPQkVSUyAoMTw8NSkKKworLyogVGhlIGllZWU4MDIuMTEgc3RhY2sgd2lsbCBtYW5hZ2VzIHRoZSBuZXRpZiBxdWV1ZQorICogd2FrZS9zdG9wIGZvciB0aGUgZHJpdmVyLCB0YWtpbmcgY2FyZSBvZiA4MDIuMTEKKyAqIGZyYWdtZW50YXRpb24uIFNlZSBzb2Z0bWFjLmMgZm9yIGRldGFpbHMuICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19UWF9RVUVVRSAoMTw8NykKKworLyogVXNlcyBvbmx5IHRoZSBzb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0CisgKiBldmVuIGZvciBUWCBtYW5hZ2VtZW50IGZyYW1lcy4KKyAqLworI2RlZmluZSBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFICgxPDw4KQorCisvKiBHZW5lcmF0ZSBiZWFjb25zLiAgVGhlIHN0YWNrIHdpbGwgZW5xdWV1ZSBiZWFjb25zCisgKiB0byB0aGUgY2FyZAorICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19CRUFDT05TICgxPDw2KQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmllZWU4MDIxMV9wcml2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuICgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiluZXRkZXZfcHJpdihkZXYpKS0+cHJpdjsKK30KKworZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2lzX2VtcHR5X2Vzc2lkKGNvbnN0IGNoYXIgKmVzc2lkLCBpbnQgZXNzaWRfbGVuKQoreworCS8qIFNpbmdsZSB3aGl0ZSBzcGFjZSBpcyBmb3IgTGlua3N5cyBBUHMgKi8KKwlpZiAoZXNzaWRfbGVuID09IDEgJiYgZXNzaWRbMF0gPT0gJyAnKQorCQlyZXR1cm4gMTsKKworCS8qIE90aGVyd2lzZSwgaWYgdGhlIGVudGlyZSBlc3NpZCBpcyAwLCB3ZSBhc3N1bWUgaXQgaXMgaGlkZGVuICovCisJd2hpbGUgKGVzc2lkX2xlbikgeworCQllc3NpZF9sZW4tLTsKKwkJaWYgKGVzc2lkW2Vzc2lkX2xlbl0gIT0gJ1wwJykKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitleHRlcm4gaW5saW5lIGludCBpZWVlODAyMTFfaXNfdmFsaWRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IG1vZGUpCit7CisJLyoKKwkgKiBJdCBpcyBwb3NzaWJsZSBmb3IgYm90aCBhY2Nlc3MgcG9pbnRzIGFuZCBvdXIgZGV2aWNlIHRvIHN1cHBvcnQKKwkgKiBjb21iaW5hdGlvbnMgb2YgbW9kZXMsIHNvIGFzIGxvbmcgYXMgdGhlcmUgaXMgb25lIHZhbGlkIGNvbWJpbmF0aW9uCisJICogb2YgYXAvZGV2aWNlIHN1cHBvcnRlZCBtb2RlcywgdGhlbiByZXR1cm4gc3VjY2VzcworCSAqCisJICovCisJaWYgKChtb2RlICYgSUVFRV9BKSAmJgorCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pICYmCisJICAgIChpZWVlLT5mcmVxX2JhbmQgJiBJRUVFODAyMTFfNTJHSFpfQkFORCkpCisJCXJldHVybiAxOworCisJaWYgKChtb2RlICYgSUVFRV9HKSAmJgorCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pICYmCisJICAgIChpZWVlLT5mcmVxX2JhbmQgJiBJRUVFODAyMTFfMjRHSFpfQkFORCkpCisJCXJldHVybiAxOworCisJaWYgKChtb2RlICYgSUVFRV9CKSAmJgorCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTikgJiYKKwkgICAgKGllZWUtPmZyZXFfYmFuZCAmIElFRUU4MDIxMV8yNEdIWl9CQU5EKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2dldF9oZHJsZW4odTE2IGZjKQoreworCWludCBoZHJsZW4gPSBJRUVFODAyMTFfM0FERFJfTEVOOworCisJc3dpdGNoIChXTEFOX0ZDX0dFVF9UWVBFKGZjKSkgeworCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0RBVEE6CisJCWlmICgoZmMgJiBJRUVFODAyMTFfRkNUTF9GUk9NRFMpICYmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1RPRFMpKQorCQkJaGRybGVuID0gSUVFRTgwMjExXzRBRERSX0xFTjsgLyogQWRkcjQgKi8KKwkJaWYoSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSkKKwkJCWhkcmxlbiArPSAyOyAvKiBRT1MgY3RybCovCisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0NUTDoKKwkJc3dpdGNoIChXTEFOX0ZDX0dFVF9TVFlQRShmYykpIHsKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQ1RTOgorCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BQ0s6CisJCQloZHJsZW4gPSBJRUVFODAyMTFfMUFERFJfTEVOOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQloZHJsZW4gPSBJRUVFODAyMTFfMkFERFJfTEVOOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGhkcmxlbjsKK30KKworc3RhdGljIGlubGluZSB1OCAqaWVlZTgwMjExX2dldF9wYXlsb2FkKHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIpCit7CisJc3dpdGNoIChpZWVlODAyMTFfZ2V0X2hkcmxlbihsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCkpKSB7CisJY2FzZSBJRUVFODAyMTFfMUFERFJfTEVOOgorCQlyZXR1cm4gKChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8xYWRkciAqKWhkciktPnBheWxvYWQ7CisJY2FzZSBJRUVFODAyMTFfMkFERFJfTEVOOgorCQlyZXR1cm4gKChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8yYWRkciAqKWhkciktPnBheWxvYWQ7CisJY2FzZSBJRUVFODAyMTFfM0FERFJfTEVOOgorCQlyZXR1cm4gKChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKWhkciktPnBheWxvYWQ7CisJY2FzZSBJRUVFODAyMTFfNEFERFJfTEVOOgorCQlyZXR1cm4gKChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqKWhkciktPnBheWxvYWQ7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfaXNfb2ZkbV9yYXRlKHU4IHJhdGUpCit7CisJc3dpdGNoIChyYXRlICYgfklFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0spIHsKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COgorCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV85TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUI6CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaWVlZTgwMjExX2lzX2Nja19yYXRlKHU4IHJhdGUpCit7CisJc3dpdGNoIChyYXRlICYgfklFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0spIHsKKwljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8xTUI6CisJY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfMk1COgorCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzVNQjoKKwljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1COgorCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyogaWVlZTgwMjExLmMgKi8KK2V4dGVybiB2b2lkIGZyZWVfaWVlZTgwMjExKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICphbGxvY19pZWVlODAyMTEoaW50IHNpemVvZl9wcml2KTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfc2V0X2VuY3J5cHRpb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworCisvKiBpZWVlODAyMTFfdHguYyAqLworCitleHRlcm4gaW50IGllZWU4MDIxMV9lbmNyeXB0X2ZyYWdtZW50KAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCXN0cnVjdCBza19idWZmICpmcmFnLAorCWludCBoZHJfbGVuKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV90eGJfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqKTsKKworCisvKiBpZWVlODAyMTFfcnguYyAqLworZXh0ZXJuIGludCBpZWVlODAyMTFfcngoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cyk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfcnhfbWd0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGVhZGVyLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cyk7CisKKy8qIGllZWU4MDIxMV93eC5jICovCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9lbmNvZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X2VuY29kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSk7CisjaWYgV0lSRUxFU1NfRVhUID49IDE4CitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfZW5jb2RlX2V4dChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEqIHdycXUsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9lbmNvZGVfZXh0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSogd3JxdSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X2F1dGgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmRhdGEsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9tbG1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworI2VuZGlmCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfZ2VuX2llKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqaWUsIHNpemVfdCBsZW4pOworCisvKiBpZWVlODAyMTFfc29mdG1hYy5jICovCitleHRlcm4gc2hvcnQgaWVlZTgwMjExX2lzXzU0ZyhzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgbmV0KTsKK2V4dGVybiBzaG9ydCBpZWVlODAyMTFfaXNfc2hvcnRzbG90KHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBuZXQpOworZXh0ZXJuIGludCBpZWVlODAyMTFfcnhfZnJhbWVfc29mdG1hYyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzLCB1MTYgdHlwZSwKKwkJCXUxNiBzdHlwZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19uZXdfbmV0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldCk7CisKK3ZvaWQgU2VuZERpc2Fzc29jaWF0aW9uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCogYXNTdGEsIHU4IGFzUnNuKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3htaXQoc3RydWN0IGllZWU4MDIxMV90eGIgKnR4Yiwgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworCitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgbm90aWZ5X3d4X2Fzc29jX2V2ZW50KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X21hc3Rlcl9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X2lic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19mcmVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfY2hlY2tfYWxsX25ldHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3Jlc2V0X3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV93YWtlX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2dldF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3BhX3N1cHBsaWNhbnRfaW9jdGwoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19wb2ludCAqcCk7CitleHRlcm4gdm9pZCBub3RpZnlfd3hfYXNzb2NfZXZlbnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3BzX3R4X2FjayhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgc3VjY2Vzcyk7CisKK2V4dGVybiB2b2lkIHNvZnRtYWNfbWdtdF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKKworLyogaWVlZTgwMjExX2NyeXB0X2NjbXAmdGtpcCZ3ZXAuYyAqLworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3RraXBfbnVsbCh2b2lkKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV93ZXBfbnVsbCh2b2lkKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9jY21wX251bGwodm9pZCk7CisKKy8qIGllZWU4MDIxMV9zb2Z0bWFjX3d4LmMgKi8KKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X3dhcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dCk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF93YXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSB1bmlvbiBpd3JlcV9kYXRhICphd3JxLAorCQkJIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X2Vzc2lkKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLHVuaW9uIGl3cmVxX2RhdGEgKndycXUsY2hhciAqYik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfZXNzaWQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9mcmVxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X2ZyZXEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworCisvL2V4dGVybiB2b2lkIGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3Eoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworCisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9yYXd0eChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X25hbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3Bvd2VyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9wb3dlcihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfcnRzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9ydHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKy8vSFQKKyNkZWZpbmUgTUFYX1JFQ0VJVkVfQlVGRkVSX1NJWkUgOTEwMCAgLy8KK2V4dGVybiB2b2lkIEhURGVidWdIVENhcGFiaWxpdHkodTgqIENhcElFLCB1OCogVGl0bGVTdHJpbmcgKTsKK2V4dGVybiB2b2lkIEhURGVidWdIVEluZm8odTgqICBJbmZvSUUsIHU4KiBUaXRsZVN0cmluZyk7CisKK3ZvaWQgSFRTZXRDb25uZWN0QndNb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBIVF9DSEFOTkVMX1dJRFRIIEJhbmR3aWR0aCwgSFRfRVhUQ0hOTF9PRkZTRVQgICAgT2Zmc2V0KTsKK2V4dGVybiB2b2lkIEhUVXBkYXRlRGVmYXVsdFNldHRpbmcoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUpOworZXh0ZXJuIHZvaWQgSFRDb25zdHJ1Y3RDYXBhYmlsaXR5RWxlbWVudChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTgqIHBvc0hUQ2FwLCB1OCogbGVuLCB1OCBpc0VuY3J5cHQpOworZXh0ZXJuIHZvaWQgSFRDb25zdHJ1Y3RJbmZvRWxlbWVudChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTgqIHBvc0hUSW5mbywgdTgqIGxlbiwgdTggaXNFbmNyeXB0KTsKK2V4dGVybiB2b2lkIEhUQ29uc3RydWN0UlQyUlRBZ2dFbGVtZW50KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogcG9zUlQyUlRBZ2csIHU4KiBsZW4pOworZXh0ZXJuIHZvaWQgSFRPbkFzc29jUnNwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIEhUSW5pdGlhbGl6ZUhUSW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSk7CitleHRlcm4gdm9pZCBIVEluaXRpYWxpemVCc3NEZXNjKFBCU1NfSFQgcEJzc0hUKTsKK2V4dGVybiB2b2lkIEhUUmVzZXRTZWxmQW5kU2F2ZVBlZXJTZXR0aW5nKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKiBwTmV0d29yayk7CitleHRlcm4gdm9pZCBIVFVwZGF0ZVNlbGZBbmRQZWVyU2V0dGluZyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKiBwTmV0d29yayk7CitleHRlcm4gdTggSFRHZXRIaWdoZXN0TUNTUmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTgqIHBNQ1NSYXRlU2V0LCB1OCogcE1DU0ZpbHRlcik7CitleHRlcm4gdTggTUNTX0ZJTFRFUl9BTExbXTsKK2V4dGVybiB1MTYgTUNTX0RBVEFfUkFURVsyXVsyXVs3N10gOworZXh0ZXJuIHU4IEhUQ0NoZWNrKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogICBwRnJhbWUpOworLy9leHRlcm4gdm9pZCBIVFNldENvbm5lY3RCd01vZGVDYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpOworZXh0ZXJuIHZvaWQgSFRSZXNldElPVFNldHRpbmcoUFJUX0hJR0hfVEhST1VHSFBVVCAgcEhUSW5mbyk7CitleHRlcm4gYm9vbCBJc0hUSGFsZk5tb2RlQVBzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlKTsKK2V4dGVybiB1MTYgSFRIYWxmTWNzVG9EYXRhUmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgIHU4ICAgICAgbk1jc1JhdGUpOworZXh0ZXJuIHUxNiBIVE1jc1RvRGF0YVJhdGUoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCBuTWNzUmF0ZSk7CitleHRlcm4gdTE2ICBUeENvdW50VG9EYXRhUmF0ZSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4IG5EYXRhUmF0ZSk7CisvL2Z1bmN0aW9uIGluIEJBUFJPQy5jCitleHRlcm4gaW50IGllZWU4MDIxMV9yeF9BRERCQVJlcSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHN0cnVjdCBza19idWZmICpza2IpOworZXh0ZXJuIGludCBpZWVlODAyMTFfcnhfQUREQkFSc3AoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3J4X0RFTEJBKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLHN0cnVjdCBza19idWZmICpza2IpOworZXh0ZXJuIHZvaWQgVHNJbml0QWRkQkEoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBQVFhfVFNfUkVDT1JEICAgcFRTLCB1OCBQb2xpY3ksIHU4IGJPdmVyd3JpdGVQZW5kaW5nKTsKK2V4dGVybiB2b2lkIFRzSW5pdERlbEJBKCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgUFRTX0NPTU1PTl9JTkZPIHBUc0NvbW1vbkluZm8sIFRSX1NFTEVDVCBUeFJ4U2VsZWN0KTsKK2V4dGVybiB2b2lkIEJhU2V0dXBUaW1lT3V0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitleHRlcm4gdm9pZCBUeEJhSW5hY3RUaW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitleHRlcm4gdm9pZCBSeEJhSW5hY3RUaW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitleHRlcm4gdm9pZCBSZXNldEJhRW50cnkoIFBCQV9SRUNPUkQgcEJBKTsKKy8vZnVuY3Rpb24gaW4gVFMuYworZXh0ZXJuIGJvb2wgR2V0VHMoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqICAgICAgICBpZWVlLAorCVBUU19DT01NT05fSU5GTyAgICAgICAgICAgICAgICAgKnBwVFMsCisJdTgqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyLAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElELAorCVRSX1NFTEVDVCAgICAgICAgICAgICAgICAgICAgICAgVHhSeFNlbGVjdCwgIC8vUng6MSwgVHg6MAorCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFkZE5ld1RzCisJKTsKK2V4dGVybiB2b2lkIFRTSW5pdGlhbGl6ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gIHZvaWQgVHNTdGFydEFkZEJhUHJvY2VzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgUFRYX1RTX1JFQ09SRCAgIHBUeFRTKTsKK2V4dGVybiB2b2lkIFJlbW92ZVBlZXJUUyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTgqIEFkZHIpOworZXh0ZXJuIHZvaWQgUmVtb3ZlQWxsVFMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUpOwordm9pZCBpZWVlODAyMTFfc29mdG1hY19zY2FuX3N5bmNybyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisKK2V4dGVybiBjb25zdCBsb25nIGllZWU4MDIxMV93bGFuX2ZyZXF1ZW5jaWVzW107CisKK2V4dGVybiBpbmxpbmUgdm9pZCBpZWVlODAyMTFfaW5jcmVtZW50X3NjYW5zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWllZWUtPnNjYW5zKys7Cit9CisKK2V4dGVybiBpbmxpbmUgaW50IGllZWU4MDIxMV9nZXRfc2NhbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJcmV0dXJuIGllZWUtPnNjYW5zOworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmVzY2FwZV9lc3NpZChjb25zdCBjaGFyICplc3NpZCwgdTggZXNzaWRfbGVuKSB7CisJc3RhdGljIGNoYXIgZXNjYXBlZFtJV19FU1NJRF9NQVhfU0laRSAqIDIgKyAxXTsKKwljb25zdCBjaGFyICpzID0gZXNzaWQ7CisJY2hhciAqZCA9IGVzY2FwZWQ7CisKKwlpZiAoaWVlZTgwMjExX2lzX2VtcHR5X2Vzc2lkKGVzc2lkLCBlc3NpZF9sZW4pKSB7CisJCW1lbWNweShlc2NhcGVkLCAiPGhpZGRlbj4iLCBzaXplb2YoIjxoaWRkZW4+IikpOworCQlyZXR1cm4gZXNjYXBlZDsKKwl9CisKKwllc3NpZF9sZW4gPSBtaW4oZXNzaWRfbGVuLCAodTgpSVdfRVNTSURfTUFYX1NJWkUpOworCXdoaWxlIChlc3NpZF9sZW4tLSkgeworCQlpZiAoKnMgPT0gJ1wwJykgeworCQkJKmQrKyA9ICdcXCc7CisJCQkqZCsrID0gJzAnOworCQkJcysrOworCQl9IGVsc2UgeworCQkJKmQrKyA9ICpzKys7CisJCX0KKwl9CisJKmQgPSAnXDAnOworCXJldHVybiBlc2NhcGVkOworfQorCisvKiBGb3IgdGhlIGZ1bmN0aW9uIGlzIG1vcmUgcmVsYXRlZCB0byBoYXJkd2FyZSBzZXR0aW5nLCBpdCdzIGJldHRlciB0byB1c2UgdGhlCisgKiBpZWVlIGhhbmRsZXIgdG8gcmVmZXIgdG8gaXQuCisgKi8KK2V4dGVybiBzaG9ydCBjaGVja19uaWNfZW5vdWdoX2Rlc2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHF1ZXVlX2luZGV4KTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX2RhdGFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3BhcnNlX2luZm9fcGFyYW0oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICppbmZvX2VsZW1lbnQsCisJCXUxNiBsZW5ndGgsCisJCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yaywKKwkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqc3RhdHMpOworCit2b2lkIGllZWU4MDIxMV9pbmRpY2F0ZV9wYWNrZXRzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaWVlZTgwMjExX3J4YioqIHByeGJJbmRpY2F0ZUFycmF5LHU4ICBpbmRleCk7CisjZGVmaW5lIFJUX0FTT0NfUkVUUllfTElNSVQJNQorI2VuZGlmIC8qIElFRUU4MDIxMV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL0VuZGlhbkZyZWUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvRW5kaWFuRnJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjODVmYjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL0VuZGlhbkZyZWUuaApAQCAtMCwwICsxLDE5NCBAQAorI2lmbmRlZiBfX0lOQ19FTkRJQU5GUkVFX0gKKyNkZWZpbmUgX19JTkNfRU5ESUFORlJFRV9ICisKKy8qCisgKglDYWxsIGVuZGlhbiBmcmVlIGZ1bmN0aW9uIHdoZW4KKyAqCQkxLiBSZWFkL3dyaXRlIHBhY2tldCBjb250ZW50LgorICoJCTIuIEJlZm9yZSB3cml0ZSBpbnRlZ2VyIHRvIElPLgorICoJCTMuIEFmdGVyIHJlYWQgaW50ZWdlciBmcm9tIElPLgorICovCisKKyNkZWZpbmUgX19NQUNISU5FX0xJVFRMRV9FTkRJQU4gMTIzNCAgICAvKiBMU0IgZmlyc3Q6IGkzODYsIHZheCAqLworI2RlZmluZSBfX01BQ0hJTkVfQklHX0VORElBTiAgICA0MzIxICAgIC8qIE1TQiBmaXJzdDogNjgwMDAsIGlibSwgbmV0LCBwcGMgKi8KKworI2RlZmluZSBCWVRFX09SREVSIF9fTUFDSElORV9MSVRUTEVfRU5ESUFOCisKKyNpZiBCWVRFX09SREVSID09IF9fTUFDSElORV9MSVRUTEVfRU5ESUFOCisvLyBDb252ZXJ0IGRhdGEKKyNkZWZpbmUgRUYxQnl0ZShfdmFsKQkJCQkoKHU4KShfdmFsKSkKKyNkZWZpbmUgRUYyQnl0ZShfdmFsKQkJCQkoKHUxNikoX3ZhbCkpCisjZGVmaW5lIEVGNEJ5dGUoX3ZhbCkJCQkJKCh1MzIpKF92YWwpKQorCisjZWxzZQorLy8gQ29udmVydCBkYXRhCisjZGVmaW5lIEVGMUJ5dGUoX3ZhbCkJCQkJKCh1OCkoX3ZhbCkpCisjZGVmaW5lIEVGMkJ5dGUoX3ZhbCkJCQkJKCgoKCh1MTYpKF92YWwpKSYweDAwZmYpPDw4KXwoKCgodTE2KShfdmFsKSkmMHhmZjAwKT4+OCkpCisjZGVmaW5lIEVGNEJ5dGUoX3ZhbCkJCQkJKCgoKCh1MzIpKF92YWwpKSYweDAwMDAwMGZmKTw8MjQpfFwKKwkJCQkJCSgoKCh1MzIpKF92YWwpKSYweDAwMDBmZjAwKTw8OCl8XAorCQkJCQkJKCgoKHUzMikoX3ZhbCkpJjB4MDBmZjAwMDApPj44KXxcCisJCQkJCQkoKCgodTMyKShfdmFsKSkmMHhmZjAwMDAwMCk+PjI0KSkKKyNlbmRpZgorCisvLyBSZWFkIGRhdGEgZnJvbSBtZW1vcnkKKyNkZWZpbmUgUmVhZEVGMUJ5dGUoX3B0cikJCUVGMUJ5dGUoKigodTggKikoX3B0cikpKQorI2RlZmluZSBSZWFkRUYyQnl0ZShfcHRyKQkJRUYyQnl0ZSgqKCh1MTYgKikoX3B0cikpKQorI2RlZmluZSBSZWFkRUY0Qnl0ZShfcHRyKQkJRUY0Qnl0ZSgqKCh1MzIgKikoX3B0cikpKQorCisvLyBXcml0ZSBkYXRhIHRvIG1lbW9yeQorI2RlZmluZSBXcml0ZUVGMUJ5dGUoX3B0ciwgX3ZhbCkJKCooKHU4ICopKF9wdHIpKSk9RUYxQnl0ZShfdmFsKQorI2RlZmluZSBXcml0ZUVGMkJ5dGUoX3B0ciwgX3ZhbCkJKCooKHUxNiAqKShfcHRyKSkpPUVGMkJ5dGUoX3ZhbCkKKyNkZWZpbmUgV3JpdGVFRjRCeXRlKF9wdHIsIF92YWwpCSgqKCh1MzIgKikoX3B0cikpKT1FRjRCeXRlKF92YWwpCisvLyBDb252ZXJ0IEhvc3Qgc3lzdGVtIHNwZWNpZmljIGJ5dGUgb3JkaW5nIChsaXR0ZW4gb3IgYmlnIGVuZGlhKSB0byBOZXR3b3JrIGJ5dGUgb3JkaW5nIChiaWcgZW5kaWFuKS4KKy8vIDIwMDYuMDUuMDcsIGJ5IHJjbmprby4KKyNpZiBCWVRFX09SREVSID09IF9fTUFDSElORV9MSVRUTEVfRU5ESUFOCisjZGVmaW5lIEgyTjFCWVRFKF92YWwpCSgodTgpKF92YWwpKQorI2RlZmluZSBIMk4yQllURShfdmFsKQkoKCgoKHUxNikoX3ZhbCkpJjB4MDBmZik8PDgpfFwKKwkJCSgoKCh1MTYpKF92YWwpKSYweGZmMDApPj44KSkKKyNkZWZpbmUgSDJONEJZVEUoX3ZhbCkJKCgoKCh1MzIpKF92YWwpKSYweDAwMDAwMGZmKTw8MjQpfFwKKwkJCSgoKCh1MzIpKF92YWwpKSYweDAwMDBmZjAwKTw8OCkJfFwKKwkJCSgoKCh1MzIpKF92YWwpKSYweDAwZmYwMDAwKT4+OCkJfFwKKwkJCSgoKCh1MzIpKF92YWwpKSYweGZmMDAwMDAwKT4+MjQpKQorI2Vsc2UKKyNkZWZpbmUgSDJOMUJZVEUoX3ZhbCkJCQkoKHU4KShfdmFsKSkKKyNkZWZpbmUgSDJOMkJZVEUoX3ZhbCkJCQkoKHUxNikoX3ZhbCkpCisjZGVmaW5lIEgyTjRCWVRFKF92YWwpCQkJKCh1MzIpKF92YWwpKQorI2VuZGlmCisKKy8vIENvbnZlcnQgZnJvbSBOZXR3b3JrIGJ5dGUgb3JkaW5nIChiaWcgZW5kaWFuKSB0byBIb3N0IHN5c3RlbSBzcGVjaWZpYyBieXRlIG9yZGluZyAobGl0dGVuIG9yIGJpZyBlbmRpYSkuCisvLyAyMDA2LjA1LjA3LCBieSByY25qa28uCisjaWYgQllURV9PUkRFUiA9PSBfX01BQ0hJTkVfTElUVExFX0VORElBTgorI2RlZmluZSBOMkgxQllURShfdmFsKQkoKHU4KShfdmFsKSkKKyNkZWZpbmUgTjJIMkJZVEUoX3ZhbCkJKCgoKCh1MTYpKF92YWwpKSYweDAwZmYpPDw4KXxcCisJCQkoKCgodTE2KShfdmFsKSkmMHhmZjAwKT4+OCkpCisjZGVmaW5lIE4ySDRCWVRFKF92YWwpCSgoKCgodTMyKShfdmFsKSkmMHgwMDAwMDBmZik8PDI0KXxcCisJCQkoKCgodTMyKShfdmFsKSkmMHgwMDAwZmYwMCk8PDgpCXxcCisJCQkoKCgodTMyKShfdmFsKSkmMHgwMGZmMDAwMCk+PjgpCXxcCisJCQkoKCgodTMyKShfdmFsKSkmMHhmZjAwMDAwMCk+PjI0KSkKKyNlbHNlCisjZGVmaW5lIE4ySDFCWVRFKF92YWwpCQkJKCh1OCkoX3ZhbCkpCisjZGVmaW5lIE4ySDJCWVRFKF92YWwpCQkJKCh1MTYpKF92YWwpKQorI2RlZmluZSBOMkg0QllURShfdmFsKQkJCSgodTMyKShfdmFsKSkKKyNlbmRpZgorCisvLworLy8JRXhhbXBsZToKKy8vCQlCSVRfTEVOX01BU0tfMzIoMCkgPT4gMHgwMDAwMDAwMAorLy8JCUJJVF9MRU5fTUFTS18zMigxKSA9PiAweDAwMDAwMDAxCisvLwkJQklUX0xFTl9NQVNLXzMyKDIpID0+IDB4MDAwMDAwMDMKKy8vCQlCSVRfTEVOX01BU0tfMzIoMzIpID0+IDB4RkZGRkZGRkYKKy8vCisjZGVmaW5lIEJJVF9MRU5fTUFTS18zMihfX0JpdExlbikgKDB4RkZGRkZGRkYgPj4gKDMyIC0gKF9fQml0TGVuKSkpCisvLworLy8JRXhhbXBsZToKKy8vCQlCSVRfT0ZGU0VUX0xFTl9NQVNLXzMyKDAsIDIpID0+IDB4MDAwMDAwMDMKKy8vCQlCSVRfT0ZGU0VUX0xFTl9NQVNLXzMyKDE2LCAyKSA9PiAweDAwMDMwMDAwCisvLworI2RlZmluZSBCSVRfT0ZGU0VUX0xFTl9NQVNLXzMyKF9fQml0T2Zmc2V0LCBfX0JpdExlbikgKEJJVF9MRU5fTUFTS18zMihfX0JpdExlbikgPDwgKF9fQml0T2Zmc2V0KSkKKworLy8KKy8vCURlc2NyaXB0aW9uOgorLy8JCVJldHVybiA0LWJ5dGUgdmFsdWUgaW4gaG9zdCBieXRlIG9yZGVyaW5nIGZyb20KKy8vCQk0LWJ5dGUgcG9pbnRlciBpbiBsaXR0ZW4tZW5kaWFuIHN5c3RlbS4KKy8vCisjZGVmaW5lIExFX1A0QllURV9UT19IT1NUXzRCWVRFKF9fcFN0YXJ0KSAoRUY0Qnl0ZSgqKCh1MzIgKikoX19wU3RhcnQpKSkpCisKKy8vCisvLwlEZXNjcmlwdGlvbjoKKy8vCQlUcmFuc2xhdGUgc3ViZmllbGQgKGNvbnRpbnVvdXMgYml0cyBpbiBsaXR0bGUtZW5kaWFuKSBvZiA0LWJ5dGUgdmFsdWUgaW4gbGl0dGVuIGJ5dGUgdG8KKy8vCQk0LWJ5dGUgdmFsdWUgaW4gaG9zdCBieXRlIG9yZGVyaW5nLgorLy8KKyNkZWZpbmUgTEVfQklUU19UT180QllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCisJKCBcCisJICAoIExFX1A0QllURV9UT19IT1NUXzRCWVRFKF9fcFN0YXJ0KSA+PiAoX19CaXRPZmZzZXQpICkgXAorCSAgJiBcCisJICBCSVRfTEVOX01BU0tfMzIoX19CaXRMZW4pIFwKKwkpCisKKy8vCisvLwlEZXNjcmlwdGlvbjoKKy8vCQlNYXNrIHN1YmZpZWxkIChjb250aW51b3VzIGJpdHMgaW4gbGl0dGxlLWVuZGlhbikgb2YgNC1ieXRlIHZhbHVlIGluIGxpdHRlbiBieXRlIG9yZWRlcmluZworLy8JCWFuZCByZXR1cm4gdGhlIHJlc3VsdCBpbiA0LWJ5dGUgdmFsdWUgaW4gaG9zdCBieXRlIG9yZGVyaW5nLgorLy8KKyNkZWZpbmUgTEVfQklUU19DTEVBUkVEX1RPXzRCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4pIFwKKwkoIFwKKwkgIExFX1A0QllURV9UT19IT1NUXzRCWVRFKF9fcFN0YXJ0KSBcCisJICAmIFwKKwkgICggfkJJVF9PRkZTRVRfTEVOX01BU0tfMzIoX19CaXRPZmZzZXQsIF9fQml0TGVuKSApIFwKKwkpCisKKy8vCisvLwlEZXNjcmlwdGlvbjoKKy8vCQlTZXQgc3ViZmllbGQgb2YgbGl0dGxlLWVuZGlhbiA0LWJ5dGUgdmFsdWUgdG8gc3BlY2lmaWVkIHZhbHVlLgorLy8KKyNkZWZpbmUgU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbiwgX19WYWx1ZSkgXAorCSooKHUzMiAqKShfX3BTdGFydCkpID0gXAorCUVGNEJ5dGUoIFwKKwlMRV9CSVRTX0NMRUFSRURfVE9fNEJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbikgXAorCXwgXAorCSggKCgodTMyKV9fVmFsdWUpICYgQklUX0xFTl9NQVNLXzMyKF9fQml0TGVuKSkgPDwgKF9fQml0T2Zmc2V0KSApIFwKKyAgICAgICApOworCisKKyNkZWZpbmUgQklUX0xFTl9NQVNLXzE2KF9fQml0TGVuKSBcCisJKDB4RkZGRiA+PiAoMTYgLSAoX19CaXRMZW4pKSkKKworI2RlZmluZSBCSVRfT0ZGU0VUX0xFTl9NQVNLXzE2KF9fQml0T2Zmc2V0LCBfX0JpdExlbikgXAorCShCSVRfTEVOX01BU0tfMTYoX19CaXRMZW4pIDw8IChfX0JpdE9mZnNldCkpCisKKyNkZWZpbmUgTEVfUDJCWVRFX1RPX0hPU1RfMkJZVEUoX19wU3RhcnQpIFwKKwkoRUYyQnl0ZSgqKCh1MTYgKikoX19wU3RhcnQpKSkpCisKKyNkZWZpbmUgTEVfQklUU19UT18yQllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCisJKCBcCisJICAoIExFX1AyQllURV9UT19IT1NUXzJCWVRFKF9fcFN0YXJ0KSA+PiAoX19CaXRPZmZzZXQpICkgXAorCSAgJiBcCisJICBCSVRfTEVOX01BU0tfMTYoX19CaXRMZW4pIFwKKwkpCisKKyNkZWZpbmUgTEVfQklUU19DTEVBUkVEX1RPXzJCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4pIFwKKwkoIFwKKwkgIExFX1AyQllURV9UT19IT1NUXzJCWVRFKF9fcFN0YXJ0KSBcCisJICAmIFwKKwkgICggfkJJVF9PRkZTRVRfTEVOX01BU0tfMTYoX19CaXRPZmZzZXQsIF9fQml0TGVuKSApIFwKKwkpCisKKyNkZWZpbmUgU0VUX0JJVFNfVE9fTEVfMkJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbiwgX19WYWx1ZSkgXAorCSooKHUxNiAqKShfX3BTdGFydCkpID0gXAorCUVGMkJ5dGUoIFwKKwkJTEVfQklUU19DTEVBUkVEX1RPXzJCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4pIFwKKwkJfCBcCisJCSggKCgodTE2KV9fVmFsdWUpICYgQklUX0xFTl9NQVNLXzE2KF9fQml0TGVuKSkgPDwgKF9fQml0T2Zmc2V0KSApIFwKKyAgICAgICApOworCisjZGVmaW5lIEJJVF9MRU5fTUFTS184KF9fQml0TGVuKSBcCisJKDB4RkYgPj4gKDggLSAoX19CaXRMZW4pKSkKKworI2RlZmluZSBCSVRfT0ZGU0VUX0xFTl9NQVNLXzgoX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCisJKEJJVF9MRU5fTUFTS184KF9fQml0TGVuKSA8PCAoX19CaXRPZmZzZXQpKQorCisjZGVmaW5lIExFX1AxQllURV9UT19IT1NUXzFCWVRFKF9fcFN0YXJ0KSBcCisJKEVGMUJ5dGUoKigodTggKikoX19wU3RhcnQpKSkpCisKKyNkZWZpbmUgTEVfQklUU19UT18xQllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCisJKCBcCisJICAoIExFX1AxQllURV9UT19IT1NUXzFCWVRFKF9fcFN0YXJ0KSA+PiAoX19CaXRPZmZzZXQpICkgXAorCSAgJiBcCisJICBCSVRfTEVOX01BU0tfOChfX0JpdExlbikgXAorCSkKKworI2RlZmluZSBMRV9CSVRTX0NMRUFSRURfVE9fMUJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbikgXAorCSggXAorCSAgTEVfUDFCWVRFX1RPX0hPU1RfMUJZVEUoX19wU3RhcnQpIFwKKwkgICYgXAorCSAgKCB+QklUX09GRlNFVF9MRU5fTUFTS184KF9fQml0T2Zmc2V0LCBfX0JpdExlbikgKSBcCisJKQorCisjZGVmaW5lIFNFVF9CSVRTX1RPX0xFXzFCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4sIF9fVmFsdWUpIFwKKwkqKCh1OCAqKShfX3BTdGFydCkpID0gXAorCUVGMUJ5dGUoIFwKKwkJTEVfQklUU19DTEVBUkVEX1RPXzFCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4pIFwKKwkJfCBcCisJCSggKCgodTgpX19WYWx1ZSkgJiBCSVRfTEVOX01BU0tfOChfX0JpdExlbikpIDw8IChfX0JpdE9mZnNldCkgKSBcCisgICAgICAgKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX19JTkNfRU5ESUFORlJFRV9ICmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWNhNWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9NYWtlZmlsZQpAQCAtMCwwICsxLDEzOSBAQAorTklDX1NFTEVDVCA9IFJUTDgxOTJVCisKK0tWRVIgIDo9ICQoc2hlbGwgdW5hbWUgLXIpCitNT0RERVNURElSIDo9IC9saWIvbW9kdWxlcy8kKEtWRVIpL2tlcm5lbC9kcml2ZXJzL25ldC93aXJlbGVzcy8kKE5JQ19TRUxFQ1QpCisKK0NDID0gZ2NjCitpZm5lcSAoJChzaGVsbCB1bmFtZSAtcnxjdXQgLWQuIC1mMSwyKSwgMi40KQorRVhUUkFfQ0ZMQUdTICs9IC1JJChUT1BESVIpL2RyaXZlcnMvbmV0L3dpcmVsZXNzCitFWFRSQV9DRkxBR1MgKz0gLU8yCitFWFRSQV9DRkxBR1MgKz0gLURKQUNLU09OX05FV184MTg3IC1ESkFDS1NPTl9ORVdfUlgKKworI2l0IHdpbGwgZmFpbCB0byBjb21waWxlIGluIHN1c2UgbGludXggZW50ZXJwcmlzZSAxMCBzcDIuIFRoaXMgZmxhZyBpcyB0byBzb2x2ZSB0aGlzIHByb2JsZW0uCitpZmVxICgkKHNoZWxsIHVuYW1lIC1yIHwgY3V0IC1kLiAtZjEsMiwzLDQpLCAyLjYuMTYuNjAtMCkKK0VYVFJBX0NGTEFHUyArPSAtRE9QRU5TVVNFX1NMRUQKK2VuZGlmCisKK2lmZXEgKCQoTklDX1NFTEVDVCksUlRMODE5MlUpCisjRVhUUkFfQ0ZMQUdTICs9IC1EVVNCX1RYX0RSSVZFUl9BR0dSRUdBVElPTl9FTkFCTEUKKyNFWFRSQV9DRkxBR1MgKz0gLURVU0JfUlhfQUdHUkVHQVRJT05fU1VQUE9SVAorZW5kaWYKKyNFWFRSQV9DRkxBR1MgKz0gLURKT0hOX05PQ1BZCisjZmxhZ3MgdG8gZW5hYmxlIG9yIGRpc2JsZSA4MDIxMUQgZmVhdHVyZQorRVhUUkFfQ0ZMQUdTICs9IC1ERU5BQkxFX0RPVDExRAoraWVlZTgwMjExLXJzbC1vYmpzIDo9IGllZWU4MDIxMV9yeC5vIFwKKwkJICAgICAgaWVlZTgwMjExX3NvZnRtYWMubyBcCisJCSAgICAgIGllZWU4MDIxMV90eC5vIFwKKwkJICAgICAgaWVlZTgwMjExX3d4Lm8gXAorCQkgICAgICBpZWVlODAyMTFfbW9kdWxlLm8gXAorCQkgICAgICBpZWVlODAyMTFfc29mdG1hY193eC5vXAorCQkgICAgICBydGw4MTl4X0hUUHJvYy5vXAorCQkgICAgICBydGw4MTl4X1RTUHJvYy5vXAorCQkgICAgICBydGw4MTl4X0JBUHJvYy5vXAorCQkgICAgICBkb3QxMWQubworCitpZWVlODAyMTFfY3J5cHQtcnNsLW9ianMgOj0gaWVlZTgwMjExX2NyeXB0Lm8KK2llZWU4MDIxMV9jcnlwdF90a2lwLXJzbC1vYmpzIDo9IGllZWU4MDIxMV9jcnlwdF90a2lwLm8KK2llZWU4MDIxMV9jcnlwdF9jY21wLXJzbC1vYmpzIDo9IGllZWU4MDIxMV9jcnlwdF9jY21wLm8KK2llZWU4MDIxMV9jcnlwdF93ZXAtcnNsLW9ianMgOj0gaWVlZTgwMjExX2NyeXB0X3dlcC5vCisKK29iai1tICs9aWVlZTgwMjExLXJzbC5vCitvYmotbSArPWllZWU4MDIxMV9jcnlwdC1yc2wubworb2JqLW0gKz1pZWVlODAyMTFfY3J5cHRfd2VwLXJzbC5vCitvYmotbSArPWllZWU4MDIxMV9jcnlwdF90a2lwLXJzbC5vCitvYmotbSArPWllZWU4MDIxMV9jcnlwdF9jY21wLXJzbC5vCisKK0tTUkMgOj0gL2xpYi9tb2R1bGVzLyQoS1ZFUikvYnVpbGQKK0lOU1RBTExfUFJFRklYIDo9CisKK2FsbDogbW9kdWxlcworCittb2R1bGVzOgorCSQoTUFLRSkgLUMgJChLU1JDKSBNPSQoUFdEKSBDQz0kKENDKSBtb2R1bGVzCisKK2luc3RhbGw6IG1vZHVsZXMKKwlybSAtZnIgJChNT0RERVNURElSKQorCW1rZGlyIC1wICQoTU9EREVTVERJUikKKwlAaW5zdGFsbCAtcCAtbSA2NDQgaWVlZTgwMjExX2NyeXB0LXJzbC5rbyAkKE1PRERFU1RESVIpCisJQGluc3RhbGwgLXAgLW0gNjQ0IGllZWU4MDIxMV9jcnlwdF93ZXAtcnNsLmtvICQoTU9EREVTVERJUikKKwlAaW5zdGFsbCAtcCAtbSA2NDQgaWVlZTgwMjExX2NyeXB0X3RraXAtcnNsLmtvICQoTU9EREVTVERJUikKKwlAaW5zdGFsbCAtcCAtbSA2NDQgaWVlZTgwMjExX2NyeXB0X2NjbXAtcnNsLmtvICQoTU9EREVTVERJUikKKwlAaW5zdGFsbCAtcCAtbSA2NDQgaWVlZTgwMjExLXJzbC5rbyAkKE1PRERFU1RESVIpCisJZGVwbW9kIC1hCit1bmluc3RhbGw6CisJcm0gLWZyICQoTU9EREVTVERJUikKKwlkZXBtb2QgLWEKKworZWxzZQorTEQgOj0gbGQKK0tTUkMgOj0gL2xpYi9tb2R1bGVzLyQoS1ZFUikvYnVpbGQKK0NPTkZJR19GSUxFIDo9ICQoS1NSQykvaW5jbHVkZS9saW51eC9hdXRvY29uZi5oCisKK0NGTEFHUyArPSAtRExJTlVYIC1EX19LRVJORUxfXyAtRE1PRFVMRSAtTzIgLXBpcGUgLVdhbGwKK0NGTEFHUyArPSAtSSQoS1NSQykvaW5jbHVkZSAtSS4KKyNLZXJuZWwgMi40LjMxCitDRkxBR1MgKz0gLURNT0RWRVJTSU9OUyAtREVYUE9SVF9TWU1UQUIgLWluY2x1ZGUgJChLU1JDKS9pbmNsdWRlL2xpbnV4L21vZHZlcnNpb25zLmgKKyNLZXJuZWwgMi40LjIwCisjQ0ZMQUdTICs9IC1EX19OT19WRVJTSU9OX18gLURFWFBPUlRfU1lNVEFCCisjQ0ZMQUdTICs9IC1ERU5BQkxFX0RPVDExRAorU01QIDo9ICQoc2hlbGwgJChDQykgJChNT0RDRkxBR1MpIC1FIC1kTSAkKENPTkZJR19GSUxFKSB8IFwKKyAgIGdyZXAgQ09ORklHX1NNUCB8IGF3ayAne3ByaW50ICQkM30nKQoraWZuZXEgKCQoU01QKSwxKQorICAgU01QIDo9IDAKK2VuZGlmCitpZmVxICgkKFNNUCksMSkKKyAgIENGTEFHUyAgICArPSAtRF9fU01QX18KK2VuZGlmCisKKyNDRkxBR1MgKz0gLURKT0hOX05PQ1BZCisKK09CSlMgOj0gJHtwYXRzdWJzdCAlLmMsICUubywgJHt3aWxkY2FyZCAqLmN9fQorYWxsOiR7T0JKU30gaWVlZTgwMjExX2NyeXB0LXJzbC5vIG1pY2hhZWxfbWljLXJzbC5vIGFlcy1yc2wubyBpZWVlODAyMTFfY3J5cHRfd2VwLXJzbC5vIGllZWU4MDIxMV9jcnlwdF90a2lwLXJzbC5vIGllZWU4MDIxMV9jcnlwdF9jY21wLXJzbC5vIGNyeXB0by1yc2wubyBpZWVlODAyMTEtcnNsLm8KKworaWVlZTgwMjExX2NyeXB0LXJzbC5vOiBpZWVlODAyMTFfY3J5cHQubworCW12ICReICRACisKK21pY2hhZWxfbWljLXJzbC5vOiBtaWNoYWVsX21pYy5vCisJbXYgJF4gJEAKKworYWVzLXJzbC5vOiBhZXMubworCW12ICReICRACisKK2llZWU4MDIxMV9jcnlwdF93ZXAtcnNsLm86IGllZWU4MDIxMV9jcnlwdF93ZXAubworCW12ICReICRACisKK2llZWU4MDIxMV9jcnlwdF90a2lwLXJzbC5vOiBpZWVlODAyMTFfY3J5cHRfdGtpcC5vCisJbXYgJF4gJEAKKworaWVlZTgwMjExX2NyeXB0X2NjbXAtcnNsLm86IGllZWU4MDIxMV9jcnlwdF9jY21wLm8KKwltdiAkXiAkQAorCitjcnlwdG8tcnNsLm86IGFyYzQubyBhcGkubyBhdXRvbG9hZC5vIGNpcGhlci5vIGNvbXByZXNzLm8gZGlnZXN0Lm8gc2NhdHRlcndhbGsubyBwcm9jLm8KKwkkKExEKSAtciAkXiAtbyAkQAorCitpZWVlODAyMTEtcnNsLm86IGllZWU4MDIxMV9yeC5vIGllZWU4MDIxMV90eC5vIGllZWU4MDIxMV93eC5vIGllZWU4MDIxMV9tb2R1bGUubyBpZWVlODAyMTFfc29mdG1hY193eC5vIGllZWU4MDIxMV9zb2Z0bWFjLm8gcnRsODE5eF9IVFByb2MubyBydGw4MTl4X1RTUHJvYy5vIHJ0bDgxOXhfQkFQcm9jLm8gZG90MTFkLm8KKwkkKExEKSAtciAkXiAtbyAkQAoraW5zdGFsbDoKKwlybSAtZnIgJChNT0RERVNURElSKQorCW1rZGlyIC1wICQoTU9EREVTVERJUikKKwlAaW5zdGFsbCAtcCAtbSA2NDQgaWVlZTgwMjExX2NyeXB0LXJzbC5vICQoTU9EREVTVERJUikKKwlAaW5zdGFsbCAtcCAtbSA2NDQgY3J5cHRvLXJzbC5vICQoTU9EREVTVERJUikKKwlAaW5zdGFsbCAtcCAtbSA2NDQgbWljaGFlbF9taWMtcnNsLm8gJChNT0RERVNURElSKQorCUBpbnN0YWxsIC1wIC1tIDY0NCBhZXMtcnNsLm8gJChNT0RERVNURElSKQorCUBpbnN0YWxsIC1wIC1tIDY0NCBpZWVlODAyMTFfY3J5cHRfd2VwLXJzbC5vICQoTU9EREVTVERJUikKKwlAaW5zdGFsbCAtcCAtbSA2NDQgaWVlZTgwMjExX2NyeXB0X3RraXAtcnNsLm8gJChNT0RERVNURElSKQorCUBpbnN0YWxsIC1wIC1tIDY0NCBpZWVlODAyMTFfY3J5cHRfY2NtcC1yc2wubyAkKE1PRERFU1RESVIpCisJQGluc3RhbGwgLXAgLW0gNjQ0IGllZWU4MDIxMS1yc2wubyAkKE1PRERFU1RESVIpCisJL3NiaW4vZGVwbW9kIC1hICR7c2hlbGwgdW5hbWUgLXJ9CisKK3VuaW5zdGFsbDoKKwlybSAtZnIgJChNT0RERVNURElSKQorCS9zYmluL2RlcG1vZCAtYSAke3NoZWxsIHVuYW1lIC1yfQorCitlbmRpZgorCisuUEhPTlk6IGNsZWFuCitjbGVhbjoKKwlybSAtZnIgKi5tb2QuYyAqLm1vZCAqLm8gLiouY21kICoubW9kLiogKi5rbyAqLm8gKn4KKwlybSAtcmYgLnRtcF92ZXJzaW9ucworCXJtIC1yZiBNb2R1bGUuc3ltdmVycwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9hZXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvYWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZiYjZjOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvYWVzLmMKQEAgLTAsMCArMSw0NjkgQEAKKy8qCisgKiBDcnlwdG9ncmFwaGljIEFQSS4KKyAqCisgKiBBRVMgQ2lwaGVyIEFsZ29yaXRobS4KKyAqCisgKiBCYXNlZCBvbiBCcmlhbiBHbGFkbWFuJ3MgY29kZS4KKyAqCisgKiBMaW51eCBkZXZlbG9wZXJzOgorICogIEFsZXhhbmRlciBLamVsZGFhcyA8YXN0b3JAZmFzdC5ubz4KKyAqICBIZXJiZXJ0IFZhbGVyaW8gUmllZGVsIDxodnJAaHZybGFiLm9yZz4KKyAqICBLeWxlIE1jTWFydGluIDxreWxlQGRlYmlhbi5vcmc+CisgKiAgQWRhbSBKLiBSaWNodGVyIDxhZGFtQHlnZ2RyYXNpbC5jb20+IChjb252ZXJzaW9uIHRvIDIuNSBBUEkpLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIERyIEJyaWFuIEdsYWRtYW4gPGJyZ0BnbGFkbWFuLm1lLnVrPiwgV29yY2VzdGVyLCBVSy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTElDRU5TRSBURVJNUworICoKKyAqIFRoZSBmcmVlIGRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gYm90aCBzb3VyY2UgYW5kIGJpbmFyeQorICogZm9ybSBpcyBhbGxvd2VkICh3aXRoIG9yIHdpdGhvdXQgY2hhbmdlcykgcHJvdmlkZWQgdGhhdDoKKyAqCisgKiAgIDEuIGRpc3RyaWJ1dGlvbnMgb2YgdGhpcyBzb3VyY2UgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyOworICoKKyAqICAgMi4gZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiAgICAgIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBhc3NvY2lhdGVkIG1hdGVyaWFsczsKKyAqCisgKiAgIDMuIHRoZSBjb3B5cmlnaHQgaG9sZGVyJ3MgbmFtZSBpcyBub3QgdXNlZCB0byBlbmRvcnNlIHByb2R1Y3RzCisgKiAgICAgIGJ1aWx0IHVzaW5nIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSBpcyByZXRhaW5lZCBpbiBmdWxsLCB0aGlzIHByb2R1Y3QKKyAqIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLAorICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFwcGx5IElOU1RFQUQgT0YgdGhvc2UgZ2l2ZW4gYWJvdmUuCisgKgorICogRElTQ0xBSU1FUgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzIGlzJyB3aXRoIG5vIGV4cGxpY2l0IG9yIGltcGxpZWQgd2FycmFudGllcworICogaW4gcmVzcGVjdCBvZiBpdHMgcHJvcGVydGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIGNvcnJlY3RuZXNzCisgKiBhbmQvb3IgZml0bmVzcyBmb3IgcHVycG9zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qIFNvbWUgY2hhbmdlcyBmcm9tIHRoZSBHbGFkbWFuIHZlcnNpb246CisgICAgcy9SSUpOREFFTChlX2tleSkvRV9LRVkvZworICAgIHMvUklKTkRBRUwoZF9rZXkpL0RfS0VZL2cKKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorLy8jaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSAicnRsX2NyeXB0by5oIgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2RlZmluZSBBRVNfTUlOX0tFWV9TSVpFCTE2CisjZGVmaW5lIEFFU19NQVhfS0VZX1NJWkUJMzIKKworI2RlZmluZSBBRVNfQkxPQ0tfU0laRQkJMTYKKworc3RhdGljIGlubGluZQordTMyIGdlbmVyaWNfcm90cjMyIChjb25zdCB1MzIgeCwgY29uc3QgdW5zaWduZWQgYml0cykKK3sKKwljb25zdCB1bnNpZ25lZCBuID0gYml0cyAlIDMyOworCXJldHVybiAoeCA+PiBuKSB8ICh4IDw8ICgzMiAtIG4pKTsKK30KKworc3RhdGljIGlubGluZQordTMyIGdlbmVyaWNfcm90bDMyIChjb25zdCB1MzIgeCwgY29uc3QgdW5zaWduZWQgYml0cykKK3sKKwljb25zdCB1bnNpZ25lZCBuID0gYml0cyAlIDMyOworCXJldHVybiAoeCA8PCBuKSB8ICh4ID4+ICgzMiAtIG4pKTsKK30KKworI2RlZmluZSByb3RsIGdlbmVyaWNfcm90bDMyCisjZGVmaW5lIHJvdHIgZ2VuZXJpY19yb3RyMzIKKworLyoKKyAqICNkZWZpbmUgYnl0ZSh4LCBucikgKCh1bnNpZ25lZCBjaGFyKSgoeCkgPj4gKG5yKjgpKSkKKyAqLworaW5saW5lIHN0YXRpYyB1OAorYnl0ZShjb25zdCB1MzIgeCwgY29uc3QgdW5zaWduZWQgbikKK3sKKwlyZXR1cm4geCA+PiAobiA8PCAzKTsKK30KKworI2RlZmluZSB1MzJfaW4oeCkgbGUzMl90b19jcHUoKihjb25zdCB1MzIgKikoeCkpCisjZGVmaW5lIHUzMl9vdXQodG8sIGZyb20pICgqKHUzMiAqKSh0bykgPSBjcHVfdG9fbGUzMihmcm9tKSkKKworc3RydWN0IGFlc19jdHggeworCWludCBrZXlfbGVuZ3RoOworCXUzMiBFWzYwXTsKKwl1MzIgRFs2MF07Cit9OworCisjZGVmaW5lIEVfS0VZIGN0eC0+RQorI2RlZmluZSBEX0tFWSBjdHgtPkQKKworc3RhdGljIHU4IHBvd190YWJbMjU2XSBfX2luaXRkYXRhOworc3RhdGljIHU4IGxvZ190YWJbMjU2XSBfX2luaXRkYXRhOworc3RhdGljIHU4IHNieF90YWJbMjU2XSBfX2luaXRkYXRhOworc3RhdGljIHU4IGlzYl90YWJbMjU2XSBfX2luaXRkYXRhOworc3RhdGljIHUzMiByY29fdGFiWzEwXTsKK3N0YXRpYyB1MzIgZnRfdGFiWzRdWzI1Nl07CitzdGF0aWMgdTMyIGl0X3RhYls0XVsyNTZdOworCitzdGF0aWMgdTMyIGZsX3RhYls0XVsyNTZdOworc3RhdGljIHUzMiBpbF90YWJbNF1bMjU2XTsKKworc3RhdGljIGlubGluZSB1OCBfX2luaXQKK2ZfbXVsdCAodTggYSwgdTggYikKK3sKKwl1OCBhYSA9IGxvZ190YWJbYV0sIGNjID0gYWEgKyBsb2dfdGFiW2JdOworCisJcmV0dXJuIHBvd190YWJbY2MgKyAoY2MgPCBhYSA/IDEgOiAwKV07Cit9CisKKyNkZWZpbmUgZmZfbXVsdChhLGIpICAgIChhICYmIGIgPyBmX211bHQoYSwgYikgOiAwKQorCisjZGVmaW5lIGZfcm4oYm8sIGJpLCBuLCBrKQkJCQkJXAorICAgIGJvW25dID0gIGZ0X3RhYlswXVtieXRlKGJpW25dLDApXSBeCQkJCVwKKwkgICAgIGZ0X3RhYlsxXVtieXRlKGJpWyhuICsgMSkgJiAzXSwxKV0gXgkJXAorCSAgICAgZnRfdGFiWzJdW2J5dGUoYmlbKG4gKyAyKSAmIDNdLDIpXSBeCQlcCisJICAgICBmdF90YWJbM11bYnl0ZShiaVsobiArIDMpICYgM10sMyldIF4gKihrICsgbikKKworI2RlZmluZSBpX3JuKGJvLCBiaSwgbiwgaykJCQkJCVwKKyAgICBib1tuXSA9ICBpdF90YWJbMF1bYnl0ZShiaVtuXSwwKV0gXgkJCQlcCisJICAgICBpdF90YWJbMV1bYnl0ZShiaVsobiArIDMpICYgM10sMSldIF4JCVwKKwkgICAgIGl0X3RhYlsyXVtieXRlKGJpWyhuICsgMikgJiAzXSwyKV0gXgkJXAorCSAgICAgaXRfdGFiWzNdW2J5dGUoYmlbKG4gKyAxKSAmIDNdLDMpXSBeICooayArIG4pCisKKyNkZWZpbmUgbHNfYm94KHgpCQkJCVwKKyAgICAoIGZsX3RhYlswXVtieXRlKHgsIDApXSBeCQkJXAorICAgICAgZmxfdGFiWzFdW2J5dGUoeCwgMSldIF4JCQlcCisgICAgICBmbF90YWJbMl1bYnl0ZSh4LCAyKV0gXgkJCVwKKyAgICAgIGZsX3RhYlszXVtieXRlKHgsIDMpXSApCisKKyNkZWZpbmUgZl9ybChibywgYmksIG4sIGspCQkJCQlcCisgICAgYm9bbl0gPSAgZmxfdGFiWzBdW2J5dGUoYmlbbl0sMCldIF4JCQkJXAorCSAgICAgZmxfdGFiWzFdW2J5dGUoYmlbKG4gKyAxKSAmIDNdLDEpXSBeCQlcCisJICAgICBmbF90YWJbMl1bYnl0ZShiaVsobiArIDIpICYgM10sMildIF4JCVwKKwkgICAgIGZsX3RhYlszXVtieXRlKGJpWyhuICsgMykgJiAzXSwzKV0gXiAqKGsgKyBuKQorCisjZGVmaW5lIGlfcmwoYm8sIGJpLCBuLCBrKQkJCQkJXAorICAgIGJvW25dID0gIGlsX3RhYlswXVtieXRlKGJpW25dLDApXSBeCQkJCVwKKwkgICAgIGlsX3RhYlsxXVtieXRlKGJpWyhuICsgMykgJiAzXSwxKV0gXgkJXAorCSAgICAgaWxfdGFiWzJdW2J5dGUoYmlbKG4gKyAyKSAmIDNdLDIpXSBeCQlcCisJICAgICBpbF90YWJbM11bYnl0ZShiaVsobiArIDEpICYgM10sMyldIF4gKihrICsgbikKKworc3RhdGljIHZvaWQgX19pbml0CitnZW5fdGFicyAodm9pZCkKK3sKKwl1MzIgaSwgdDsKKwl1OCBwLCBxOworCisJLyogbG9nIGFuZCBwb3dlciB0YWJsZXMgZm9yIEdGKDIqKjgpIGZpbml0ZSBmaWVsZCB3aXRoCisJICAgMHgwMTFiIGFzIG1vZHVsYXIgcG9seW5vbWlhbCAtIHRoZSBzaW1wbGVzdCBwcmltaXRpdmUKKwkgICByb290IGlzIDB4MDMsIHVzZWQgaGVyZSB0byBnZW5lcmF0ZSB0aGUgdGFibGVzICovCisKKwlmb3IgKGkgPSAwLCBwID0gMTsgaSA8IDI1NjsgKytpKSB7CisJCXBvd190YWJbaV0gPSAodTgpIHA7CisJCWxvZ190YWJbcF0gPSAodTgpIGk7CisKKwkJcCBePSAocCA8PCAxKSBeIChwICYgMHg4MCA/IDB4MDFiIDogMCk7CisJfQorCisJbG9nX3RhYlsxXSA9IDA7CisKKwlmb3IgKGkgPSAwLCBwID0gMTsgaSA8IDEwOyArK2kpIHsKKwkJcmNvX3RhYltpXSA9IHA7CisKKwkJcCA9IChwIDw8IDEpIF4gKHAgJiAweDgwID8gMHgwMWIgOiAwKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKwkJcCA9IChpID8gcG93X3RhYlsyNTUgLSBsb2dfdGFiW2ldXSA6IDApOworCQlxID0gKChwID4+IDcpIHwgKHAgPDwgMSkpIF4gKChwID4+IDYpIHwgKHAgPDwgMikpOworCQlwIF49IDB4NjMgXiBxIF4gKChxID4+IDYpIHwgKHEgPDwgMikpOworCQlzYnhfdGFiW2ldID0gcDsKKwkJaXNiX3RhYltwXSA9ICh1OCkgaTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKwkJcCA9IHNieF90YWJbaV07CisKKwkJdCA9IHA7CisJCWZsX3RhYlswXVtpXSA9IHQ7CisJCWZsX3RhYlsxXVtpXSA9IHJvdGwgKHQsIDgpOworCQlmbF90YWJbMl1baV0gPSByb3RsICh0LCAxNik7CisJCWZsX3RhYlszXVtpXSA9IHJvdGwgKHQsIDI0KTsKKworCQl0ID0gKCh1MzIpIGZmX211bHQgKDIsIHApKSB8CisJCSAgICAoKHUzMikgcCA8PCA4KSB8CisJCSAgICAoKHUzMikgcCA8PCAxNikgfCAoKHUzMikgZmZfbXVsdCAoMywgcCkgPDwgMjQpOworCisJCWZ0X3RhYlswXVtpXSA9IHQ7CisJCWZ0X3RhYlsxXVtpXSA9IHJvdGwgKHQsIDgpOworCQlmdF90YWJbMl1baV0gPSByb3RsICh0LCAxNik7CisJCWZ0X3RhYlszXVtpXSA9IHJvdGwgKHQsIDI0KTsKKworCQlwID0gaXNiX3RhYltpXTsKKworCQl0ID0gcDsKKwkJaWxfdGFiWzBdW2ldID0gdDsKKwkJaWxfdGFiWzFdW2ldID0gcm90bCAodCwgOCk7CisJCWlsX3RhYlsyXVtpXSA9IHJvdGwgKHQsIDE2KTsKKwkJaWxfdGFiWzNdW2ldID0gcm90bCAodCwgMjQpOworCisJCXQgPSAoKHUzMikgZmZfbXVsdCAoMTQsIHApKSB8CisJCSAgICAoKHUzMikgZmZfbXVsdCAoOSwgcCkgPDwgOCkgfAorCQkgICAgKCh1MzIpIGZmX211bHQgKDEzLCBwKSA8PCAxNikgfAorCQkgICAgKCh1MzIpIGZmX211bHQgKDExLCBwKSA8PCAyNCk7CisKKwkJaXRfdGFiWzBdW2ldID0gdDsKKwkJaXRfdGFiWzFdW2ldID0gcm90bCAodCwgOCk7CisJCWl0X3RhYlsyXVtpXSA9IHJvdGwgKHQsIDE2KTsKKwkJaXRfdGFiWzNdW2ldID0gcm90bCAodCwgMjQpOworCX0KK30KKworI2RlZmluZSBzdGFyX3goeCkgKCgoeCkgJiAweDdmN2Y3ZjdmKSA8PCAxKSBeICgoKCh4KSAmIDB4ODA4MDgwODApID4+IDcpICogMHgxYikKKworI2RlZmluZSBpbWl4X2NvbCh5LHgpICAgICAgIFwKKyAgICB1ICAgPSBzdGFyX3goeCk7ICAgICAgICBcCisgICAgdiAgID0gc3Rhcl94KHUpOyAgICAgICAgXAorICAgIHcgICA9IHN0YXJfeCh2KTsgICAgICAgIFwKKyAgICB0ICAgPSB3IF4gKHgpOyAgICAgICAgICBcCisgICAoeSkgID0gdSBeIHYgXiB3OyAgICAgICAgXAorICAgKHkpIF49IHJvdHIodSBeIHQsICA4KSBeIFwKKwkgIHJvdHIodiBeIHQsIDE2KSBeIFwKKwkgIHJvdHIodCwyNCkKKworLyogaW5pdGlhbGlzZSB0aGUga2V5IHNjaGVkdWxlIGZyb20gdGhlIHVzZXIgc3VwcGxpZWQga2V5ICovCisKKyNkZWZpbmUgbG9vcDQoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgdCA9IHJvdHIodCwgIDgpOyB0ID0gbHNfYm94KHQpIF4gcmNvX3RhYltpXTsgICAgXAorICAgIHQgXj0gRV9LRVlbNCAqIGldOyAgICAgRV9LRVlbNCAqIGkgKyA0XSA9IHQ7ICAgIFwKKyAgICB0IF49IEVfS0VZWzQgKiBpICsgMV07IEVfS0VZWzQgKiBpICsgNV0gPSB0OyAgICBcCisgICAgdCBePSBFX0tFWVs0ICogaSArIDJdOyBFX0tFWVs0ICogaSArIDZdID0gdDsgICAgXAorICAgIHQgXj0gRV9LRVlbNCAqIGkgKyAzXTsgRV9LRVlbNCAqIGkgKyA3XSA9IHQ7ICAgIFwKK30KKworI2RlZmluZSBsb29wNihpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICB0ID0gcm90cih0LCAgOCk7IHQgPSBsc19ib3godCkgXiByY29fdGFiW2ldOyAgICBcCisgICAgdCBePSBFX0tFWVs2ICogaV07ICAgICBFX0tFWVs2ICogaSArIDZdID0gdDsgICAgXAorICAgIHQgXj0gRV9LRVlbNiAqIGkgKyAxXTsgRV9LRVlbNiAqIGkgKyA3XSA9IHQ7ICAgIFwKKyAgICB0IF49IEVfS0VZWzYgKiBpICsgMl07IEVfS0VZWzYgKiBpICsgOF0gPSB0OyAgICBcCisgICAgdCBePSBFX0tFWVs2ICogaSArIDNdOyBFX0tFWVs2ICogaSArIDldID0gdDsgICAgXAorICAgIHQgXj0gRV9LRVlbNiAqIGkgKyA0XTsgRV9LRVlbNiAqIGkgKyAxMF0gPSB0OyAgIFwKKyAgICB0IF49IEVfS0VZWzYgKiBpICsgNV07IEVfS0VZWzYgKiBpICsgMTFdID0gdDsgICBcCit9CisKKyNkZWZpbmUgbG9vcDgoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgdCA9IHJvdHIodCwgIDgpOyA7IHQgPSBsc19ib3godCkgXiByY29fdGFiW2ldOyAgXAorICAgIHQgXj0gRV9LRVlbOCAqIGldOyAgICAgRV9LRVlbOCAqIGkgKyA4XSA9IHQ7ICAgIFwKKyAgICB0IF49IEVfS0VZWzggKiBpICsgMV07IEVfS0VZWzggKiBpICsgOV0gPSB0OyAgICBcCisgICAgdCBePSBFX0tFWVs4ICogaSArIDJdOyBFX0tFWVs4ICogaSArIDEwXSA9IHQ7ICAgXAorICAgIHQgXj0gRV9LRVlbOCAqIGkgKyAzXTsgRV9LRVlbOCAqIGkgKyAxMV0gPSB0OyAgIFwKKyAgICB0ICA9IEVfS0VZWzggKiBpICsgNF0gXiBsc19ib3godCk7ICAgIFwKKyAgICBFX0tFWVs4ICogaSArIDEyXSA9IHQ7ICAgICAgICAgICAgICAgIFwKKyAgICB0IF49IEVfS0VZWzggKiBpICsgNV07IEVfS0VZWzggKiBpICsgMTNdID0gdDsgICBcCisgICAgdCBePSBFX0tFWVs4ICogaSArIDZdOyBFX0tFWVs4ICogaSArIDE0XSA9IHQ7ICAgXAorICAgIHQgXj0gRV9LRVlbOCAqIGkgKyA3XTsgRV9LRVlbOCAqIGkgKyAxNV0gPSB0OyAgIFwKK30KKworc3RhdGljIGludAorYWVzX3NldF9rZXkodm9pZCAqY3R4X2FyZywgY29uc3QgdTggKmluX2tleSwgdW5zaWduZWQgaW50IGtleV9sZW4sIHUzMiAqZmxhZ3MpCit7CisJc3RydWN0IGFlc19jdHggKmN0eCA9IGN0eF9hcmc7CisJdTMyIGksIHQsIHUsIHYsIHc7CisKKwlpZiAoa2V5X2xlbiAhPSAxNiAmJiBrZXlfbGVuICE9IDI0ICYmIGtleV9sZW4gIT0gMzIpIHsKKwkJKmZsYWdzIHw9IENSWVBUT19URk1fUkVTX0JBRF9LRVlfTEVOOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljdHgtPmtleV9sZW5ndGggPSBrZXlfbGVuOworCisJRV9LRVlbMF0gPSB1MzJfaW4gKGluX2tleSk7CisJRV9LRVlbMV0gPSB1MzJfaW4gKGluX2tleSArIDQpOworCUVfS0VZWzJdID0gdTMyX2luIChpbl9rZXkgKyA4KTsKKwlFX0tFWVszXSA9IHUzMl9pbiAoaW5fa2V5ICsgMTIpOworCisJc3dpdGNoIChrZXlfbGVuKSB7CisJY2FzZSAxNjoKKwkJdCA9IEVfS0VZWzNdOworCQlmb3IgKGkgPSAwOyBpIDwgMTA7ICsraSkKKwkJCWxvb3A0IChpKTsKKwkJYnJlYWs7CisKKwljYXNlIDI0OgorCQlFX0tFWVs0XSA9IHUzMl9pbiAoaW5fa2V5ICsgMTYpOworCQl0ID0gRV9LRVlbNV0gPSB1MzJfaW4gKGluX2tleSArIDIwKTsKKwkJZm9yIChpID0gMDsgaSA8IDg7ICsraSkKKwkJCWxvb3A2IChpKTsKKwkJYnJlYWs7CisKKwljYXNlIDMyOgorCQlFX0tFWVs0XSA9IHUzMl9pbiAoaW5fa2V5ICsgMTYpOworCQlFX0tFWVs1XSA9IHUzMl9pbiAoaW5fa2V5ICsgMjApOworCQlFX0tFWVs2XSA9IHUzMl9pbiAoaW5fa2V5ICsgMjQpOworCQl0ID0gRV9LRVlbN10gPSB1MzJfaW4gKGluX2tleSArIDI4KTsKKwkJZm9yIChpID0gMDsgaSA8IDc7ICsraSkKKwkJCWxvb3A4IChpKTsKKwkJYnJlYWs7CisJfQorCisJRF9LRVlbMF0gPSBFX0tFWVswXTsKKwlEX0tFWVsxXSA9IEVfS0VZWzFdOworCURfS0VZWzJdID0gRV9LRVlbMl07CisJRF9LRVlbM10gPSBFX0tFWVszXTsKKworCWZvciAoaSA9IDQ7IGkgPCBrZXlfbGVuICsgMjQ7ICsraSkgeworCQlpbWl4X2NvbCAoRF9LRVlbaV0sIEVfS0VZW2ldKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogZW5jcnlwdCBhIGJsb2NrIG9mIHRleHQgKi8KKworI2RlZmluZSBmX25yb3VuZChibywgYmksIGspIFwKKyAgICBmX3JuKGJvLCBiaSwgMCwgayk7ICAgICBcCisgICAgZl9ybihibywgYmksIDEsIGspOyAgICAgXAorICAgIGZfcm4oYm8sIGJpLCAyLCBrKTsgICAgIFwKKyAgICBmX3JuKGJvLCBiaSwgMywgayk7ICAgICBcCisgICAgayArPSA0CisKKyNkZWZpbmUgZl9scm91bmQoYm8sIGJpLCBrKSBcCisgICAgZl9ybChibywgYmksIDAsIGspOyAgICAgXAorICAgIGZfcmwoYm8sIGJpLCAxLCBrKTsgICAgIFwKKyAgICBmX3JsKGJvLCBiaSwgMiwgayk7ICAgICBcCisgICAgZl9ybChibywgYmksIDMsIGspCisKK3N0YXRpYyB2b2lkIGFlc19lbmNyeXB0KHZvaWQgKmN0eF9hcmcsIHU4ICpvdXQsIGNvbnN0IHU4ICppbikKK3sKKwljb25zdCBzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gY3R4X2FyZzsKKwl1MzIgYjBbNF0sIGIxWzRdOworCWNvbnN0IHUzMiAqa3AgPSBFX0tFWSArIDQ7CisKKwliMFswXSA9IHUzMl9pbiAoaW4pIF4gRV9LRVlbMF07CisJYjBbMV0gPSB1MzJfaW4gKGluICsgNCkgXiBFX0tFWVsxXTsKKwliMFsyXSA9IHUzMl9pbiAoaW4gKyA4KSBeIEVfS0VZWzJdOworCWIwWzNdID0gdTMyX2luIChpbiArIDEyKSBeIEVfS0VZWzNdOworCisJaWYgKGN0eC0+a2V5X2xlbmd0aCA+IDI0KSB7CisJCWZfbnJvdW5kIChiMSwgYjAsIGtwKTsKKwkJZl9ucm91bmQgKGIwLCBiMSwga3ApOworCX0KKworCWlmIChjdHgtPmtleV9sZW5ndGggPiAxNikgeworCQlmX25yb3VuZCAoYjEsIGIwLCBrcCk7CisJCWZfbnJvdW5kIChiMCwgYjEsIGtwKTsKKwl9CisKKwlmX25yb3VuZCAoYjEsIGIwLCBrcCk7CisJZl9ucm91bmQgKGIwLCBiMSwga3ApOworCWZfbnJvdW5kIChiMSwgYjAsIGtwKTsKKwlmX25yb3VuZCAoYjAsIGIxLCBrcCk7CisJZl9ucm91bmQgKGIxLCBiMCwga3ApOworCWZfbnJvdW5kIChiMCwgYjEsIGtwKTsKKwlmX25yb3VuZCAoYjEsIGIwLCBrcCk7CisJZl9ucm91bmQgKGIwLCBiMSwga3ApOworCWZfbnJvdW5kIChiMSwgYjAsIGtwKTsKKwlmX2xyb3VuZCAoYjAsIGIxLCBrcCk7CisKKwl1MzJfb3V0IChvdXQsIGIwWzBdKTsKKwl1MzJfb3V0IChvdXQgKyA0LCBiMFsxXSk7CisJdTMyX291dCAob3V0ICsgOCwgYjBbMl0pOworCXUzMl9vdXQgKG91dCArIDEyLCBiMFszXSk7Cit9CisKKy8qIGRlY3J5cHQgYSBibG9jayBvZiB0ZXh0ICovCisKKyNkZWZpbmUgaV9ucm91bmQoYm8sIGJpLCBrKSBcCisgICAgaV9ybihibywgYmksIDAsIGspOyAgICAgXAorICAgIGlfcm4oYm8sIGJpLCAxLCBrKTsgICAgIFwKKyAgICBpX3JuKGJvLCBiaSwgMiwgayk7ICAgICBcCisgICAgaV9ybihibywgYmksIDMsIGspOyAgICAgXAorICAgIGsgLT0gNAorCisjZGVmaW5lIGlfbHJvdW5kKGJvLCBiaSwgaykgXAorICAgIGlfcmwoYm8sIGJpLCAwLCBrKTsgICAgIFwKKyAgICBpX3JsKGJvLCBiaSwgMSwgayk7ICAgICBcCisgICAgaV9ybChibywgYmksIDIsIGspOyAgICAgXAorICAgIGlfcmwoYm8sIGJpLCAzLCBrKQorCitzdGF0aWMgdm9pZCBhZXNfZGVjcnlwdCh2b2lkICpjdHhfYXJnLCB1OCAqb3V0LCBjb25zdCB1OCAqaW4pCit7CisJY29uc3Qgc3RydWN0IGFlc19jdHggKmN0eCA9IGN0eF9hcmc7CisJdTMyIGIwWzRdLCBiMVs0XTsKKwljb25zdCBpbnQga2V5X2xlbiA9IGN0eC0+a2V5X2xlbmd0aDsKKwljb25zdCB1MzIgKmtwID0gRF9LRVkgKyBrZXlfbGVuICsgMjA7CisKKwliMFswXSA9IHUzMl9pbiAoaW4pIF4gRV9LRVlba2V5X2xlbiArIDI0XTsKKwliMFsxXSA9IHUzMl9pbiAoaW4gKyA0KSBeIEVfS0VZW2tleV9sZW4gKyAyNV07CisJYjBbMl0gPSB1MzJfaW4gKGluICsgOCkgXiBFX0tFWVtrZXlfbGVuICsgMjZdOworCWIwWzNdID0gdTMyX2luIChpbiArIDEyKSBeIEVfS0VZW2tleV9sZW4gKyAyN107CisKKwlpZiAoa2V5X2xlbiA+IDI0KSB7CisJCWlfbnJvdW5kIChiMSwgYjAsIGtwKTsKKwkJaV9ucm91bmQgKGIwLCBiMSwga3ApOworCX0KKworCWlmIChrZXlfbGVuID4gMTYpIHsKKwkJaV9ucm91bmQgKGIxLCBiMCwga3ApOworCQlpX25yb3VuZCAoYjAsIGIxLCBrcCk7CisJfQorCisJaV9ucm91bmQgKGIxLCBiMCwga3ApOworCWlfbnJvdW5kIChiMCwgYjEsIGtwKTsKKwlpX25yb3VuZCAoYjEsIGIwLCBrcCk7CisJaV9ucm91bmQgKGIwLCBiMSwga3ApOworCWlfbnJvdW5kIChiMSwgYjAsIGtwKTsKKwlpX25yb3VuZCAoYjAsIGIxLCBrcCk7CisJaV9ucm91bmQgKGIxLCBiMCwga3ApOworCWlfbnJvdW5kIChiMCwgYjEsIGtwKTsKKwlpX25yb3VuZCAoYjEsIGIwLCBrcCk7CisJaV9scm91bmQgKGIwLCBiMSwga3ApOworCisJdTMyX291dCAob3V0LCBiMFswXSk7CisJdTMyX291dCAob3V0ICsgNCwgYjBbMV0pOworCXUzMl9vdXQgKG91dCArIDgsIGIwWzJdKTsKKwl1MzJfb3V0IChvdXQgKyAxMiwgYjBbM10pOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBhZXNfYWxnID0geworCS5jcmFfbmFtZQkJPQkiYWVzIiwKKwkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9DSVBIRVIsCisJLmNyYV9ibG9ja3NpemUJCT0JQUVTX0JMT0NLX1NJWkUsCisJLmNyYV9jdHhzaXplCQk9CXNpemVvZihzdHJ1Y3QgYWVzX2N0eCksCisJLmNyYV9tb2R1bGUJCT0JVEhJU19NT0RVTEUsCisJLmNyYV9saXN0CQk9CUxJU1RfSEVBRF9JTklUKGFlc19hbGcuY3JhX2xpc3QpLAorCS5jcmFfdQkJCT0JeworCQkuY2lwaGVyID0geworCQkJLmNpYV9taW5fa2V5c2l6ZQk9CUFFU19NSU5fS0VZX1NJWkUsCisJCQkuY2lhX21heF9rZXlzaXplCT0JQUVTX01BWF9LRVlfU0laRSwKKwkJCS5jaWFfc2V0a2V5CQk9IAlhZXNfc2V0X2tleSwKKwkJCS5jaWFfZW5jcnlwdAkJPQlhZXNfZW5jcnlwdCwKKwkJCS5jaWFfZGVjcnlwdAkJPQlhZXNfZGVjcnlwdAorCQl9CisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgYWVzX2luaXQodm9pZCkKK3sKKwlnZW5fdGFicygpOworCXJldHVybiBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZhZXNfYWxnKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFlc19maW5pKHZvaWQpCit7CisJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZhZXNfYWxnKTsKK30KKworbW9kdWxlX2luaXQoYWVzX2luaXQpOworbW9kdWxlX2V4aXQoYWVzX2ZpbmkpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlJpam5kYWVsIChBRVMpIENpcGhlciBBbGdvcml0aG0iKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9hcGkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvYXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYyN2QwMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvYXBpLmMKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiBTY2F0dGVybGlzdCBDcnlwdG9ncmFwaGljIEFQSS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICoKKyAqIFBvcnRpb25zIGRlcml2ZWQgZnJvbSBDcnlwdG9hcGksIGJ5IEFsZXhhbmRlciBLamVsZGFhcyA8YXN0b3JAZmFzdC5ubz4KKyAqIGFuZCBOZXR0bGUsIGJ5IE5pZWxzIE3psIhsZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKyNpbmNsdWRlICJrbWFwX3R5cGVzLmgiCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisvLyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlICJydGxfY3J5cHRvLmgiCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitMSVNUX0hFQUQoY3J5cHRvX2FsZ19saXN0KTsKK0RFQ0xBUkVfUldTRU0oY3J5cHRvX2FsZ19zZW0pOworCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fYWxnX2dldChzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQoreworCXJldHVybiB0cnlfaW5jX21vZF9jb3VudChhbGctPmNyYV9tb2R1bGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2FsZ19wdXQoc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3sKKwlpZiAoYWxnLT5jcmFfbW9kdWxlKQorCQlfX01PRF9ERUNfVVNFX0NPVU5UKGFsZy0+Y3JhX21vZHVsZSk7Cit9CisKK3N0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fYWxnX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBjcnlwdG9fYWxnICpxLCAqYWxnID0gTlVMTDsKKworCWlmICghbmFtZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlkb3duX3JlYWQoJmNyeXB0b19hbGdfc2VtKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocSwgJmNyeXB0b19hbGdfbGlzdCwgY3JhX2xpc3QpIHsKKwkJaWYgKCEoc3RyY21wKHEtPmNyYV9uYW1lLCBuYW1lKSkpIHsKKwkJCWlmIChjcnlwdG9fYWxnX2dldChxKSkKKwkJCQlhbGcgPSBxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwl1cF9yZWFkKCZjcnlwdG9fYWxnX3NlbSk7CisJcmV0dXJuIGFsZzsKK30KKworc3RhdGljIGludCBjcnlwdG9faW5pdF9mbGFncyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1MzIgZmxhZ3MpCit7CisJdGZtLT5jcnRfZmxhZ3MgPSAwOworCisJc3dpdGNoIChjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkpIHsKKwljYXNlIENSWVBUT19BTEdfVFlQRV9DSVBIRVI6CisJCXJldHVybiBjcnlwdG9faW5pdF9jaXBoZXJfZmxhZ3ModGZtLCBmbGFncyk7CisKKwljYXNlIENSWVBUT19BTEdfVFlQRV9ESUdFU1Q6CisJCXJldHVybiBjcnlwdG9faW5pdF9kaWdlc3RfZmxhZ3ModGZtLCBmbGFncyk7CisKKwljYXNlIENSWVBUT19BTEdfVFlQRV9DT01QUkVTUzoKKwkJcmV0dXJuIGNyeXB0b19pbml0X2NvbXByZXNzX2ZsYWdzKHRmbSwgZmxhZ3MpOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJQlVHKCk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgY3J5cHRvX2luaXRfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJc3dpdGNoIChjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkpIHsKKwljYXNlIENSWVBUT19BTEdfVFlQRV9DSVBIRVI6CisJCXJldHVybiBjcnlwdG9faW5pdF9jaXBoZXJfb3BzKHRmbSk7CisKKwljYXNlIENSWVBUT19BTEdfVFlQRV9ESUdFU1Q6CisJCXJldHVybiBjcnlwdG9faW5pdF9kaWdlc3Rfb3BzKHRmbSk7CisKKwljYXNlIENSWVBUT19BTEdfVFlQRV9DT01QUkVTUzoKKwkJcmV0dXJuIGNyeXB0b19pbml0X2NvbXByZXNzX29wcyh0Zm0pOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJQlVHKCk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB2b2lkIGNyeXB0b19leGl0X29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXN3aXRjaCAoY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pKSB7CisJY2FzZSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSOgorCQljcnlwdG9fZXhpdF9jaXBoZXJfb3BzKHRmbSk7CisJCWJyZWFrOworCisJY2FzZSBDUllQVE9fQUxHX1RZUEVfRElHRVNUOgorCQljcnlwdG9fZXhpdF9kaWdlc3Rfb3BzKHRmbSk7CisJCWJyZWFrOworCisJY2FzZSBDUllQVE9fQUxHX1RZUEVfQ09NUFJFU1M6CisJCWNyeXB0b19leGl0X2NvbXByZXNzX29wcyh0Zm0pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUJVRygpOworCisJfQorfQorCitzdHJ1Y3QgY3J5cHRvX3RmbSAqY3J5cHRvX2FsbG9jX3RmbShjb25zdCBjaGFyICpuYW1lLCB1MzIgZmxhZ3MpCit7CisJc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9IE5VTEw7CisJc3RydWN0IGNyeXB0b19hbGcgKmFsZzsKKworCWFsZyA9IGNyeXB0b19hbGdfbW9kX2xvb2t1cChuYW1lKTsKKwlpZiAoYWxnID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJdGZtID0ga21hbGxvYyhzaXplb2YoKnRmbSkgKyBhbGctPmNyYV9jdHhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAodGZtID09IE5VTEwpCisJCWdvdG8gb3V0X3B1dDsKKworCW1lbXNldCh0Zm0sIDAsIHNpemVvZigqdGZtKSArIGFsZy0+Y3JhX2N0eHNpemUpOworCisJdGZtLT5fX2NydF9hbGcgPSBhbGc7CisKKwlpZiAoY3J5cHRvX2luaXRfZmxhZ3ModGZtLCBmbGFncykpCisJCWdvdG8gb3V0X2ZyZWVfdGZtOworCisJaWYgKGNyeXB0b19pbml0X29wcyh0Zm0pKSB7CisJCWNyeXB0b19leGl0X29wcyh0Zm0pOworCQlnb3RvIG91dF9mcmVlX3RmbTsKKwl9CisKKwlnb3RvIG91dDsKKworb3V0X2ZyZWVfdGZtOgorCWtmcmVlKHRmbSk7CisJdGZtID0gTlVMTDsKK291dF9wdXQ6CisJY3J5cHRvX2FsZ19wdXQoYWxnKTsKK291dDoKKwlyZXR1cm4gdGZtOworfQorCit2b2lkIGNyeXB0b19mcmVlX3RmbShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXN0cnVjdCBjcnlwdG9fYWxnICphbGcgPSB0Zm0tPl9fY3J0X2FsZzsKKwlpbnQgc2l6ZSA9IHNpemVvZigqdGZtKSArIGFsZy0+Y3JhX2N0eHNpemU7CisKKwljcnlwdG9fZXhpdF9vcHModGZtKTsKKwljcnlwdG9fYWxnX3B1dChhbGcpOworCW1lbXNldCh0Zm0sIDAsIHNpemUpOworCWtmcmVlKHRmbSk7Cit9CisKK2ludCBjcnlwdG9fcmVnaXN0ZXJfYWxnKHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGNyeXB0b19hbGcgKnE7CisKKwlkb3duX3dyaXRlKCZjcnlwdG9fYWxnX3NlbSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHEsICZjcnlwdG9fYWxnX2xpc3QsIGNyYV9saXN0KSB7CisJCWlmICghKHN0cmNtcChxLT5jcmFfbmFtZSwgYWxnLT5jcmFfbmFtZSkpKSB7CisJCQlyZXQgPSAtRUVYSVNUOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlsaXN0X2FkZF90YWlsKCZhbGctPmNyYV9saXN0LCAmY3J5cHRvX2FsZ19saXN0KTsKK291dDoKKwl1cF93cml0ZSgmY3J5cHRvX2FsZ19zZW0pOworCXJldHVybiByZXQ7Cit9CisKK2ludCBjcnlwdG9fdW5yZWdpc3Rlcl9hbGcoc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3sKKwlpbnQgcmV0ID0gLUVOT0VOVDsKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqcTsKKworCUJVR19PTighYWxnLT5jcmFfbW9kdWxlKTsKKworCWRvd25fd3JpdGUoJmNyeXB0b19hbGdfc2VtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHEsICZjcnlwdG9fYWxnX2xpc3QsIGNyYV9saXN0KSB7CisJCWlmIChhbGcgPT0gcSkgeworCQkJbGlzdF9kZWwoJmFsZy0+Y3JhX2xpc3QpOworCQkJcmV0ID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorb3V0OgorCXVwX3dyaXRlKCZjcnlwdG9fYWxnX3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGNyeXB0b19hbGdfYXZhaWxhYmxlKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiBmbGFncykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnID0gY3J5cHRvX2FsZ19tb2RfbG9va3VwKG5hbWUpOworCisJaWYgKGFsZykgeworCQljcnlwdG9fYWxnX3B1dChhbGcpOworCQlyZXQgPSAxOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfY3J5cHRvKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiSW5pdGlhbGl6aW5nIENyeXB0b2dyYXBoaWMgQVBJXG4iKTsKKwljcnlwdG9faW5pdF9wcm9jKCk7CisJcmV0dXJuIDA7Cit9CisKK19faW5pdGNhbGwoaW5pdF9jcnlwdG8pOworCisvKgorRVhQT1JUX1NZTUJPTF9HUEwoY3J5cHRvX3JlZ2lzdGVyX2FsZyk7CitFWFBPUlRfU1lNQk9MX0dQTChjcnlwdG9fdW5yZWdpc3Rlcl9hbGcpOworRVhQT1JUX1NZTUJPTF9HUEwoY3J5cHRvX2FsbG9jX3RmbSk7CitFWFBPUlRfU1lNQk9MX0dQTChjcnlwdG9fZnJlZV90Zm0pOworRVhQT1JUX1NZTUJPTF9HUEwoY3J5cHRvX2FsZ19hdmFpbGFibGUpOworKi8KKworRVhQT1JUX1NZTUJPTF9OT1ZFUlMoY3J5cHRvX3JlZ2lzdGVyX2FsZyk7CitFWFBPUlRfU1lNQk9MX05PVkVSUyhjcnlwdG9fdW5yZWdpc3Rlcl9hbGcpOworRVhQT1JUX1NZTUJPTF9OT1ZFUlMoY3J5cHRvX2FsbG9jX3RmbSk7CitFWFBPUlRfU1lNQk9MX05PVkVSUyhjcnlwdG9fZnJlZV90Zm0pOworRVhQT1JUX1NZTUJPTF9OT1ZFUlMoY3J5cHRvX2FsZ19hdmFpbGFibGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9hcmM0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2FyYzQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2FkOGQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9hcmM0LmMKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDcnlwdG9ncmFwaGljIEFQSQorICoKKyAqIEFSQzQgQ2lwaGVyIEFsZ29yaXRobQorICoKKyAqIEpvbiBPYmVyaGVpZGUgPGpvbkBvYmVyaGVpZGUub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgInJ0bF9jcnlwdG8uaCIKKworI2RlZmluZSBBUkM0X01JTl9LRVlfU0laRQkxCisjZGVmaW5lIEFSQzRfTUFYX0tFWV9TSVpFCTI1NgorI2RlZmluZSBBUkM0X0JMT0NLX1NJWkUJCTEKKworc3RydWN0IGFyYzRfY3R4IHsKKwl1OCBTWzI1Nl07CisJdTggeCwgeTsKK307CisKK3N0YXRpYyBpbnQgYXJjNF9zZXRfa2V5KHZvaWQgKmN0eF9hcmcsIGNvbnN0IHU4ICppbl9rZXksIHVuc2lnbmVkIGludCBrZXlfbGVuLCB1MzIgKmZsYWdzKQoreworCXN0cnVjdCBhcmM0X2N0eCAqY3R4ID0gY3R4X2FyZzsKKwlpbnQgaSwgaiA9IDAsIGsgPSAwOworCisJY3R4LT54ID0gMTsKKwljdHgtPnkgPSAwOworCisJZm9yKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCWN0eC0+U1tpXSA9IGk7CisKKwlmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwl7CisJCXU4IGEgPSBjdHgtPlNbaV07CisJCWogPSAoaiArIGluX2tleVtrXSArIGEpICYgMHhmZjsKKwkJY3R4LT5TW2ldID0gY3R4LT5TW2pdOworCQljdHgtPlNbal0gPSBhOworCQlpZigodW5zaWduZWQgaW50KSsrayA+PSBrZXlfbGVuKQorCQkJayA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFyYzRfY3J5cHQodm9pZCAqY3R4X2FyZywgdTggKm91dCwgY29uc3QgdTggKmluKQoreworCXN0cnVjdCBhcmM0X2N0eCAqY3R4ID0gY3R4X2FyZzsKKworCXU4ICpjb25zdCBTID0gY3R4LT5TOworCXU4IHggPSBjdHgtPng7CisJdTggeSA9IGN0eC0+eTsKKwl1OCBhLCBiOworCisJYSA9IFNbeF07CisJeSA9ICh5ICsgYSkgJiAweGZmOworCWIgPSBTW3ldOworCVNbeF0gPSBiOworCVNbeV0gPSBhOworCXggPSAoeCArIDEpICYgMHhmZjsKKwkqb3V0KysgPSAqaW4gXiBTWyhhICsgYikgJiAweGZmXTsKKworCWN0eC0+eCA9IHg7CisJY3R4LT55ID0geTsKK30KKworc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGFyYzRfYWxnID0geworCS5jcmFfbmFtZQkJPQkiYXJjNCIsCisJLmNyYV9mbGFncwkJPQlDUllQVE9fQUxHX1RZUEVfQ0lQSEVSLAorCS5jcmFfYmxvY2tzaXplCQk9CUFSQzRfQkxPQ0tfU0laRSwKKwkuY3JhX2N0eHNpemUJCT0Jc2l6ZW9mKHN0cnVjdCBhcmM0X2N0eCksCisJLmNyYV9tb2R1bGUJCT0JVEhJU19NT0RVTEUsCisJLmNyYV9saXN0CQk9CUxJU1RfSEVBRF9JTklUKGFyYzRfYWxnLmNyYV9saXN0KSwKKwkuY3JhX3UJCQk9CXsgLmNpcGhlciA9IHsKKwkuY2lhX21pbl9rZXlzaXplCT0JQVJDNF9NSU5fS0VZX1NJWkUsCisJLmNpYV9tYXhfa2V5c2l6ZQk9CUFSQzRfTUFYX0tFWV9TSVpFLAorCS5jaWFfc2V0a2V5CQk9IAlhcmM0X3NldF9rZXksCisJLmNpYV9lbmNyeXB0CQk9CWFyYzRfY3J5cHQsCisJLmNpYV9kZWNyeXB0CQk9CWFyYzRfY3J5cHQgfSB9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBhcmM0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gY3J5cHRvX3JlZ2lzdGVyX2FsZygmYXJjNF9hbGcpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhcmM0X2V4aXQodm9pZCkKK3sKKwljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmFyYzRfYWxnKTsKK30KKworbW9kdWxlX2luaXQoYXJjNF9pbml0KTsKK21vZHVsZV9leGl0KGFyYzRfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQVJDNCBDaXBoZXIgQWxnb3JpdGhtIik7CitNT0RVTEVfQVVUSE9SKCJKb24gT2JlcmhlaWRlIDxqb25Ab2JlcmhlaWRlLm9yZz4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvYXV0b2xvYWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvYXV0b2xvYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTc3NTZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9hdXRvbG9hZC5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDcnlwdG9ncmFwaGljIEFQSS4KKyAqCisgKiBBbGdvcml0aG0gYXV0b2xvYWRlci4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKyNpbmNsdWRlICJrbWFwX3R5cGVzLmgiCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgInJ0bF9jcnlwdG8uaCIKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworLyoKKyAqIEEgZmFyIG1vcmUgaW50ZWxsaWdlbnQgdmVyc2lvbiBvZiB0aGlzIGlzIHBsYW5uZWQuICBGb3Igbm93LCBqdXN0CisgKiB0cnkgYW4gZXhhY3QgbWF0Y2ggb24gdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobS4KKyAqLwordm9pZCBjcnlwdG9fYWxnX2F1dG9sb2FkKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmVxdWVzdF9tb2R1bGUobmFtZSk7Cit9CisKK3N0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fYWxnX21vZF9sb29rdXAoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnID0gY3J5cHRvX2FsZ19sb29rdXAobmFtZSk7CisJaWYgKGFsZyA9PSBOVUxMKSB7CisJCWNyeXB0b19hbGdfYXV0b2xvYWQobmFtZSk7CisJCWFsZyA9IGNyeXB0b19hbGdfbG9va3VwKG5hbWUpOworCX0KKwlyZXR1cm4gYWxnOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9jaXBoZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvY2lwaGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI5ZThhNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvY2lwaGVyLmMKQEAgLTAsMCArMSwyOTkgQEAKKy8qCisgKiBDcnlwdG9ncmFwaGljIEFQSS4KKyAqCisgKiBDaXBoZXIgb3BlcmF0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgInJ0bF9jcnlwdG8uaCIKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAic2NhdHRlcndhbGsuaCIKKwordHlwZWRlZiB2b2lkIChjcnlwdGZuX3QpKHZvaWQgKiwgdTggKiwgY29uc3QgdTggKik7Cit0eXBlZGVmIHZvaWQgKHByb2Nmbl90KShzdHJ1Y3QgY3J5cHRvX3RmbSAqLCB1OCAqLAorCQkJdTgqLCBjcnlwdGZuX3QsIGludCBlbmMsIHZvaWQgKiwgaW50KTsKKworc3RhdGljIGlubGluZSB2b2lkIHhvcl82NCh1OCAqYSwgY29uc3QgdTggKmIpCit7CisJKCh1MzIgKilhKVswXSBePSAoKHUzMiAqKWIpWzBdOworCSgodTMyICopYSlbMV0gXj0gKCh1MzIgKiliKVsxXTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHhvcl8xMjgodTggKmEsIGNvbnN0IHU4ICpiKQoreworCSgodTMyICopYSlbMF0gXj0gKCh1MzIgKiliKVswXTsKKwkoKHUzMiAqKWEpWzFdIF49ICgodTMyICopYilbMV07CisJKCh1MzIgKilhKVsyXSBePSAoKHUzMiAqKWIpWzJdOworCSgodTMyICopYSlbM10gXj0gKCh1MzIgKiliKVszXTsKK30KKworCisvKgorICogR2VuZXJpYyBlbmNyeXB0L2RlY3J5cHQgd3JhcHBlciBmb3IgY2lwaGVycywgaGFuZGxlcyBvcGVyYXRpb25zIGFjcm9zcworICogbXVsdGlwbGUgcGFnZSBib3VuZGFyaWVzIGJ5IHVzaW5nIHRlbXBvcmFyeSBibG9ja3MuICBJbiB1c2VyIGNvbnRleHQsCisgKiB0aGUga2VybmVsIGlzIGdpdmVuIGEgY2hhbmNlIHRvIHNjaGVkdWxlIHVzIG9uY2UgcGVyIGJsb2NrLgorICovCitzdGF0aWMgaW50IGNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCQkgdW5zaWduZWQgaW50IG5ieXRlcywgY3J5cHRmbl90IGNyZm4sCisJCSBwcm9jZm5fdCBwcmZuLCBpbnQgZW5jLCB2b2lkICppbmZvKQoreworCXN0cnVjdCBzY2F0dGVyX3dhbGsgd2Fsa19pbiwgd2Fsa19vdXQ7CisJY29uc3QgdW5zaWduZWQgaW50IGJzaXplID0gY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSk7CisJdTggdG1wX3NyY1tic2l6ZV07CisJdTggdG1wX2RzdFtic2l6ZV07CisKKwlpZiAoIW5ieXRlcykKKwkJcmV0dXJuIDA7CisKKwlpZiAobmJ5dGVzICUgYnNpemUpIHsKKwkJdGZtLT5jcnRfZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfQkFEX0JMT0NLX0xFTjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc2NhdHRlcndhbGtfc3RhcnQoJndhbGtfaW4sIHNyYyk7CisJc2NhdHRlcndhbGtfc3RhcnQoJndhbGtfb3V0LCBkc3QpOworCisJZm9yKDs7KSB7CisJCXU4ICpzcmNfcCwgKmRzdF9wOworCQlpbnQgaW5fcGxhY2U7CisKKwkJc2NhdHRlcndhbGtfbWFwKCZ3YWxrX2luLCAwKTsKKwkJc2NhdHRlcndhbGtfbWFwKCZ3YWxrX291dCwgMSk7CisJCXNyY19wID0gc2NhdHRlcndhbGtfd2hpY2hidWYoJndhbGtfaW4sIGJzaXplLCB0bXBfc3JjKTsKKwkJZHN0X3AgPSBzY2F0dGVyd2Fsa193aGljaGJ1Zigmd2Fsa19vdXQsIGJzaXplLCB0bXBfZHN0KTsKKwkJaW5fcGxhY2UgPSBzY2F0dGVyd2Fsa19zYW1lYnVmKCZ3YWxrX2luLCAmd2Fsa19vdXQsCisJCQkJCSAgICAgICBzcmNfcCwgZHN0X3ApOworCisJCW5ieXRlcyAtPSBic2l6ZTsKKworCQlzY2F0dGVyd2Fsa19jb3B5Y2h1bmtzKHNyY19wLCAmd2Fsa19pbiwgYnNpemUsIDApOworCisJCXByZm4odGZtLCBkc3RfcCwgc3JjX3AsIGNyZm4sIGVuYywgaW5mbywgaW5fcGxhY2UpOworCisJCXNjYXR0ZXJ3YWxrX2RvbmUoJndhbGtfaW4sIDAsIG5ieXRlcyk7CisKKwkJc2NhdHRlcndhbGtfY29weWNodW5rcyhkc3RfcCwgJndhbGtfb3V0LCBic2l6ZSwgMSk7CisJCXNjYXR0ZXJ3YWxrX2RvbmUoJndhbGtfb3V0LCAxLCBuYnl0ZXMpOworCisJCWlmICghbmJ5dGVzKQorCQkJcmV0dXJuIDA7CisKKwkJY3J5cHRvX3lpZWxkKHRmbSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjYmNfcHJvY2VzcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCB1OCAqc3JjLAorCQkJY3J5cHRmbl90IGZuLCBpbnQgZW5jLCB2b2lkICppbmZvLCBpbnQgaW5fcGxhY2UpCit7CisJdTggKml2ID0gaW5mbzsKKworCS8qIE51bGwgZW5jcnlwdGlvbiAqLworCWlmICghaXYpCisJCXJldHVybjsKKworCWlmIChlbmMpIHsKKwkJdGZtLT5jcnRfdS5jaXBoZXIuY2l0X3hvcl9ibG9jayhpdiwgc3JjKTsKKwkJZm4oY3J5cHRvX3RmbV9jdHgodGZtKSwgZHN0LCBpdik7CisJCW1lbWNweShpdiwgZHN0LCBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSk7CisJfSBlbHNlIHsKKwkJdTggc3RhY2tbaW5fcGxhY2UgPyBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSA6IDBdOworCQl1OCAqYnVmID0gaW5fcGxhY2UgPyBzdGFjayA6IGRzdDsKKworCQlmbihjcnlwdG9fdGZtX2N0eCh0Zm0pLCBidWYsIHNyYyk7CisJCXRmbS0+Y3J0X3UuY2lwaGVyLmNpdF94b3JfYmxvY2soYnVmLCBpdik7CisJCW1lbWNweShpdiwgc3JjLCBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSk7CisJCWlmIChidWYgIT0gZHN0KQorCQkJbWVtY3B5KGRzdCwgYnVmLCBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBlY2JfcHJvY2VzcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCB1OCAqc3JjLAorCQkJY3J5cHRmbl90IGZuLCBpbnQgZW5jLCB2b2lkICppbmZvLCBpbnQgaW5fcGxhY2UpCit7CisJZm4oY3J5cHRvX3RmbV9jdHgodGZtKSwgZHN0LCBzcmMpOworfQorCitzdGF0aWMgaW50IHNldGtleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKQoreworCXN0cnVjdCBjaXBoZXJfYWxnICpjaWEgPSAmdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXI7CisKKwlpZiAoa2V5bGVuIDwgY2lhLT5jaWFfbWluX2tleXNpemUgfHwga2V5bGVuID4gY2lhLT5jaWFfbWF4X2tleXNpemUpIHsKKwkJdGZtLT5jcnRfZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9MRU47CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZQorCQlyZXR1cm4gY2lhLT5jaWFfc2V0a2V5KGNyeXB0b190Zm1fY3R4KHRmbSksIGtleSwga2V5bGVuLAorCQkJCSAgICAgICAmdGZtLT5jcnRfZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGVjYl9lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXJldHVybiBjcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMsCisJCSAgICAgdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX2VuY3J5cHQsCisJCSAgICAgZWNiX3Byb2Nlc3MsIDEsIE5VTEwpOworfQorCitzdGF0aWMgaW50IGVjYl9kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCQkgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlyZXR1cm4gY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzLAorCQkgICAgIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9kZWNyeXB0LAorCQkgICAgIGVjYl9wcm9jZXNzLCAxLCBOVUxMKTsKK30KKworc3RhdGljIGludCBjYmNfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKwkJICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJcmV0dXJuIGNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcywKKwkJICAgICB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZW5jcnlwdCwKKwkJICAgICBjYmNfcHJvY2VzcywgMSwgdGZtLT5jcnRfY2lwaGVyLmNpdF9pdik7Cit9CisKK3N0YXRpYyBpbnQgY2JjX2VuY3J5cHRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkJCSAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCQkJICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpCit7CisJcmV0dXJuIGNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcywKKwkJICAgICB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZW5jcnlwdCwKKwkJICAgICBjYmNfcHJvY2VzcywgMSwgaXYpOworfQorCitzdGF0aWMgaW50IGNiY19kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCQkgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlyZXR1cm4gY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzLAorCQkgICAgIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9kZWNyeXB0LAorCQkgICAgIGNiY19wcm9jZXNzLCAwLCB0Zm0tPmNydF9jaXBoZXIuY2l0X2l2KTsKK30KKworc3RhdGljIGludCBjYmNfZGVjcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkJICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJCSAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisJCQkgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdikKK3sKKwlyZXR1cm4gY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzLAorCQkgICAgIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9kZWNyeXB0LAorCQkgICAgIGNiY19wcm9jZXNzLCAwLCBpdik7Cit9CisKK3N0YXRpYyBpbnQgbm9jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKK3N0YXRpYyBpbnQgbm9jcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisJCSAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdikKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKworaW50IGNyeXB0b19pbml0X2NpcGhlcl9mbGFncyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1MzIgZmxhZ3MpCit7CisJdTMyIG1vZGUgPSBmbGFncyAmIENSWVBUT19URk1fTU9ERV9NQVNLOworCisJdGZtLT5jcnRfY2lwaGVyLmNpdF9tb2RlID0gbW9kZSA/IG1vZGUgOiBDUllQVE9fVEZNX01PREVfRUNCOworCWlmIChmbGFncyAmIENSWVBUT19URk1fUkVRX1dFQUtfS0VZKQorCQl0Zm0tPmNydF9mbGFncyA9IENSWVBUT19URk1fUkVRX1dFQUtfS0VZOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjcnlwdG9faW5pdF9jaXBoZXJfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGNpcGhlcl90Zm0gKm9wcyA9ICZ0Zm0tPmNydF9jaXBoZXI7CisKKwlvcHMtPmNpdF9zZXRrZXkgPSBzZXRrZXk7CisKKwlzd2l0Y2ggKHRmbS0+Y3J0X2NpcGhlci5jaXRfbW9kZSkgeworCWNhc2UgQ1JZUFRPX1RGTV9NT0RFX0VDQjoKKwkJb3BzLT5jaXRfZW5jcnlwdCA9IGVjYl9lbmNyeXB0OworCQlvcHMtPmNpdF9kZWNyeXB0ID0gZWNiX2RlY3J5cHQ7CisJCWJyZWFrOworCisJY2FzZSBDUllQVE9fVEZNX01PREVfQ0JDOgorCQlvcHMtPmNpdF9lbmNyeXB0ID0gY2JjX2VuY3J5cHQ7CisJCW9wcy0+Y2l0X2RlY3J5cHQgPSBjYmNfZGVjcnlwdDsKKwkJb3BzLT5jaXRfZW5jcnlwdF9pdiA9IGNiY19lbmNyeXB0X2l2OworCQlvcHMtPmNpdF9kZWNyeXB0X2l2ID0gY2JjX2RlY3J5cHRfaXY7CisJCWJyZWFrOworCisJY2FzZSBDUllQVE9fVEZNX01PREVfQ0ZCOgorCQlvcHMtPmNpdF9lbmNyeXB0ID0gbm9jcnlwdDsKKwkJb3BzLT5jaXRfZGVjcnlwdCA9IG5vY3J5cHQ7CisJCW9wcy0+Y2l0X2VuY3J5cHRfaXYgPSBub2NyeXB0X2l2OworCQlvcHMtPmNpdF9kZWNyeXB0X2l2ID0gbm9jcnlwdF9pdjsKKwkJYnJlYWs7CisKKwljYXNlIENSWVBUT19URk1fTU9ERV9DVFI6CisJCW9wcy0+Y2l0X2VuY3J5cHQgPSBub2NyeXB0OworCQlvcHMtPmNpdF9kZWNyeXB0ID0gbm9jcnlwdDsKKwkJb3BzLT5jaXRfZW5jcnlwdF9pdiA9IG5vY3J5cHRfaXY7CisJCW9wcy0+Y2l0X2RlY3J5cHRfaXYgPSBub2NyeXB0X2l2OworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCWlmIChvcHMtPmNpdF9tb2RlID09IENSWVBUT19URk1fTU9ERV9DQkMpIHsKKworCQlzd2l0Y2ggKGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pKSB7CisJCWNhc2UgODoKKwkJCW9wcy0+Y2l0X3hvcl9ibG9jayA9IHhvcl82NDsKKwkJCWJyZWFrOworCisJCWNhc2UgMTY6CisJCQlvcHMtPmNpdF94b3JfYmxvY2sgPSB4b3JfMTI4OworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBibG9jayBzaXplICV1IG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkgICAgICAgY3J5cHRvX3RmbV9hbGdfbmFtZSh0Zm0pLAorCQkJICAgICAgIGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCW9wcy0+Y2l0X2l2c2l6ZSA9IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pOworCQlvcHMtPmNpdF9pdiA9IGttYWxsb2Mob3BzLT5jaXRfaXZzaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKG9wcy0+Y2l0X2l2ID09IE5VTEwpCisJCQlyZXQgPSAtRU5PTUVNOworCX0KKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgY3J5cHRvX2V4aXRfY2lwaGVyX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCWlmICh0Zm0tPmNydF9jaXBoZXIuY2l0X2l2KQorCQlrZnJlZSh0Zm0tPmNydF9jaXBoZXIuY2l0X2l2KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvY29tcHJlc3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvY29tcHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmMyM2M5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9jb21wcmVzcy5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDcnlwdG9ncmFwaGljIEFQSS4KKyAqCisgKiBDb21wcmVzc2lvbiBvcGVyYXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisvLyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlICJydGxfY3J5cHRvLmgiCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgaW50IGNyeXB0b19jb21wcmVzcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkJICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAorCQkJICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbikKK3sKKwlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9jb21wcmVzcy5jb2FfY29tcHJlc3MoY3J5cHRvX3RmbV9jdHgodGZtKSwKKwkJCQkJCQkgc3JjLCBzbGVuLCBkc3QsCisJCQkJCQkJIGRsZW4pOworfQorCitzdGF0aWMgaW50IGNyeXB0b19kZWNvbXByZXNzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCQkgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAorCQkJICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pCit7CisJcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfY29tcHJlc3MuY29hX2RlY29tcHJlc3MoY3J5cHRvX3RmbV9jdHgodGZtKSwKKwkJCQkJCQkgICBzcmMsIHNsZW4sIGRzdCwKKwkJCQkJCQkgICBkbGVuKTsKK30KKworaW50IGNyeXB0b19pbml0X2NvbXByZXNzX2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncykKK3sKKwlyZXR1cm4gZmxhZ3MgPyAtRUlOVkFMIDogMDsKK30KKworaW50IGNyeXB0b19pbml0X2NvbXByZXNzX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBjb21wcmVzc190Zm0gKm9wcyA9ICZ0Zm0tPmNydF9jb21wcmVzczsKKworCXJldCA9IHRmbS0+X19jcnRfYWxnLT5jcmFfY29tcHJlc3MuY29hX2luaXQoY3J5cHRvX3RmbV9jdHgodGZtKSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlvcHMtPmNvdF9jb21wcmVzcyA9IGNyeXB0b19jb21wcmVzczsKKwlvcHMtPmNvdF9kZWNvbXByZXNzID0gY3J5cHRvX2RlY29tcHJlc3M7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGNyeXB0b19leGl0X2NvbXByZXNzX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXRmbS0+X19jcnRfYWxnLT5jcmFfY29tcHJlc3MuY29hX2V4aXQoY3J5cHRvX3RmbV9jdHgodGZtKSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2NyeXB0b19jb21wYXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvY3J5cHRvX2NvbXBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNDg2NTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2NyeXB0b19jb21wYXQuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogSGVhZGVyIGZpbGUgdG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSBhbW9uZyBkaWZmZXJlbnQga2VybmVsIHZlcnNpb25zLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2ICA8bGF3cmVuY2Vfd2FuZ0ByZWFsc2lsLmNvbS5jbj4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKworc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorCQkJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKwkJCQkJdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOworCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2VuY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzKTsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkJCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCQkJCQl1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfZGVjcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMpOworfQorCisgc3RydWN0IGNyeXB0b190Zm0gKmNyeXB0b19hbGxvY190Zm0oY29uc3QgY2hhciAqbmFtZSwgdTMyIGZsYWdzKQoreworCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBOVUxMOworCWludCBlcnI7CisJcHJpbnRrKCJjYWxsIGNyeXB0b19hbGxvY190Zm0hISFcbiIpOworCWRvIHsKKwkJc3RydWN0IGNyeXB0b19hbGcgKmFsZzsKKworCQlhbGcgPSBjcnlwdG9fYWxnX21vZF9sb29rdXAobmFtZSwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJCWVyciA9IFBUUl9FUlIoYWxnKTsKKwkJaWYgKElTX0VSUihhbGcpKQorCQkJY29udGludWU7CisKKwkJdGZtID0gX19jcnlwdG9fYWxsb2NfdGZtKGFsZywgZmxhZ3MpOworCQllcnIgPSAwOworCQlpZiAoSVNfRVJSKHRmbSkpIHsKKwkJCWNyeXB0b19tb2RfcHV0KGFsZyk7CisJCQllcnIgPSBQVFJfRVJSKHRmbSk7CisJCQl0Zm0gPSBOVUxMOworCQl9CisJfSB3aGlsZSAoZXJyID09IC1FQUdBSU4gJiYgIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKTsKKworCXJldHVybiB0Zm07Cit9CisvL0VYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19hbGxvY190Zm0pOworLy9FWFBPUlRfU1lNQk9MX0dQTChjcnlwdG9fZnJlZV90Zm0pOworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZGlnZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RpZ2VzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMWVkNTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RpZ2VzdC5jCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ3J5cHRvZ3JhcGhpYyBBUEkuCisgKgorICogRGlnZXN0IG9wZXJhdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisvLyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlICJydGxfY3J5cHRvLmgiCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgdm9pZCBpbml0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJdGZtLT5fX2NydF9hbGctPmNyYV9kaWdlc3QuZGlhX2luaXQoY3J5cHRvX3RmbV9jdHgodGZtKSk7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgbnNnKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5zZzsgaSsrKSB7CisKKwkJc3RydWN0IHBhZ2UgKnBnID0gc2dbaV0ucGFnZTsKKwkJdW5zaWduZWQgaW50IG9mZnNldCA9IHNnW2ldLm9mZnNldDsKKwkJdW5zaWduZWQgaW50IGwgPSBzZ1tpXS5sZW5ndGg7CisKKwkJZG8geworCQkJdW5zaWduZWQgaW50IGJ5dGVzX2Zyb21fcGFnZSA9IG1pbihsLCAoKHVuc2lnbmVkIGludCkKKwkJCQkJCQkgICAoUEFHRV9TSVpFKSkgLQorCQkJCQkJCSAgIG9mZnNldCk7CisJCQljaGFyICpwID0gY3J5cHRvX2ttYXAocGcsIDApICsgb2Zmc2V0OworCisJCQl0Zm0tPl9fY3J0X2FsZy0+Y3JhX2RpZ2VzdC5kaWFfdXBkYXRlCisJCQkJCShjcnlwdG9fdGZtX2N0eCh0Zm0pLCBwLAorCQkJCQkgYnl0ZXNfZnJvbV9wYWdlKTsKKwkJCWNyeXB0b19rdW5tYXAocCwgMCk7CisJCQljcnlwdG9feWllbGQodGZtKTsKKwkJCW9mZnNldCA9IDA7CisJCQlwZysrOworCQkJbCAtPSBieXRlc19mcm9tX3BhZ2U7CisJCX0gd2hpbGUgKGwgPiAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZpbmFsKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQpCit7CisJdGZtLT5fX2NydF9hbGctPmNyYV9kaWdlc3QuZGlhX2ZpbmFsKGNyeXB0b190Zm1fY3R4KHRmbSksIG91dCk7Cit9CisKK3N0YXRpYyBpbnQgc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pCit7CisJdTMyIGZsYWdzOworCWlmICh0Zm0tPl9fY3J0X2FsZy0+Y3JhX2RpZ2VzdC5kaWFfc2V0a2V5ID09IE5VTEwpCisJCXJldHVybiAtRU5PU1lTOworCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2RpZ2VzdC5kaWFfc2V0a2V5KGNyeXB0b190Zm1fY3R4KHRmbSksCisJCQkJCQkgICAgIGtleSwga2V5bGVuLCAmZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBkaWdlc3Qoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IG5zZywgdTggKm91dCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCXRmbS0+Y3J0X2RpZ2VzdC5kaXRfaW5pdCh0Zm0pOworCisJZm9yIChpID0gMDsgaSA8IG5zZzsgaSsrKSB7CisJCWNoYXIgKnAgPSBjcnlwdG9fa21hcChzZ1tpXS5wYWdlLCAwKSArIHNnW2ldLm9mZnNldDsKKwkJdGZtLT5fX2NydF9hbGctPmNyYV9kaWdlc3QuZGlhX3VwZGF0ZShjcnlwdG9fdGZtX2N0eCh0Zm0pLAorCQkJCQkJICAgICAgcCwgc2dbaV0ubGVuZ3RoKTsKKwkJY3J5cHRvX2t1bm1hcChwLCAwKTsKKwkJY3J5cHRvX3lpZWxkKHRmbSk7CisJfQorCWNyeXB0b19kaWdlc3RfZmluYWwodGZtLCBvdXQpOworfQorCitpbnQgY3J5cHRvX2luaXRfZGlnZXN0X2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncykKK3sKKwlyZXR1cm4gZmxhZ3MgPyAtRUlOVkFMIDogMDsKK30KKworaW50IGNyeXB0b19pbml0X2RpZ2VzdF9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlzdHJ1Y3QgZGlnZXN0X3RmbSAqb3BzID0gJnRmbS0+Y3J0X2RpZ2VzdDsKKworCW9wcy0+ZGl0X2luaXQJPSBpbml0OworCW9wcy0+ZGl0X3VwZGF0ZQk9IHVwZGF0ZTsKKwlvcHMtPmRpdF9maW5hbAk9IGZpbmFsOworCW9wcy0+ZGl0X2RpZ2VzdAk9IGRpZ2VzdDsKKwlvcHMtPmRpdF9zZXRrZXkJPSBzZXRrZXk7CisKKwlyZXR1cm4gY3J5cHRvX2FsbG9jX2htYWNfYmxvY2sodGZtKTsKK30KKwordm9pZCBjcnlwdG9fZXhpdF9kaWdlc3Rfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJY3J5cHRvX2ZyZWVfaG1hY19ibG9jayh0Zm0pOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kb3QxMWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZG90MTFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkxY2JmYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZG90MTFkLmMKQEAgLTAsMCArMSwyMjMgQEAKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLwlGaWxlOgorLy8JCURvdDExZC5jCisvLworLy8JRGVzY3JpcHRpb246CisvLwkJSW1wbGVtZW50IDgwMi4xMWQuCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaW5jbHVkZSAiZG90MTFkLmgiCisKK3ZvaWQKK0RvdDExZF9Jbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhpZWVlKTsKKworCXBEb3QxMWRJbmZvLT5iRW5hYmxlZCA9IDA7CisKKwlwRG90MTFkSW5mby0+U3RhdGUgPSBET1QxMURfU1RBVEVfTk9ORTsKKwlwRG90MTFkSW5mby0+Q291bnRyeUllTGVuID0gMDsKKwltZW1zZXQocERvdDExZEluZm8tPmNoYW5uZWxfbWFwLCAwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7CisJbWVtc2V0KHBEb3QxMWRJbmZvLT5NYXhUeFB3ckRibUxpc3QsIDB4RkYsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKKwlSRVNFVF9DSUVfV0FUQ0hET0coaWVlZSk7CisKKwlwcmludGsoIkRvdDExZF9Jbml0KClcbiIpOworfQorCisvLworLy8JRGVzY3JpcHRpb246CisvLwkJUmVzZXQgdG8gdGhlIHN0YXRlIGFzIHdlIGFyZSBqdXN0IGVudGVyaW5nIGEgcmVndWxhdG9yeSBkb21haW4uCisvLwordm9pZAorRG90MTFkX1Jlc2V0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXUzMiBpOworCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhpZWVlKTsKKwkvLyBDbGVhciBvbGQgY2hhbm5lbCBtYXAKKwltZW1zZXQocERvdDExZEluZm8tPmNoYW5uZWxfbWFwLCAwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7CisJbWVtc2V0KHBEb3QxMWRJbmZvLT5NYXhUeFB3ckRibUxpc3QsIDB4RkYsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKKwkvLyBTZXQgbmV3IGNoYW5uZWwgbWFwCisJZm9yIChpPTE7IGk8PTExOyBpKyspIHsKKwkJKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcClbaV0gPSAxOworCX0KKwlmb3IgKGk9MTI7IGk8PTE0OyBpKyspIHsKKwkJKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcClbaV0gPSAyOworCX0KKworCXBEb3QxMWRJbmZvLT5TdGF0ZSA9IERPVDExRF9TVEFURV9OT05FOworCXBEb3QxMWRJbmZvLT5Db3VudHJ5SWVMZW4gPSAwOworCVJFU0VUX0NJRV9XQVRDSERPRyhpZWVlKTsKKworCS8vcHJpbnRrKCJEb3QxMWRfUmVzZXQoKVxuIik7Cit9CisKKy8vCisvLwlEZXNjcmlwdGlvbjoKKy8vCQlVcGRhdGUgY291bnRyeSBJRSBmcm9tIEJlYWNvbiBvciBQcm9iZSBSZXNvcG5zZQorLy8JCWFuZCBjb25maWd1cmUgUEhZIGZvciBvcGVyYXRpb24gaW4gdGhlIHJlZ3VsYXRvcnkgZG9tYWluLgorLy8KKy8vCVRPRE86CisvLwkJQ29uZmlndXJlIFR4IHBvd2VyLgorLy8KKy8vCUFzc3VtcHRpb246CisvLwkJMS4gSVNfRE9UMTFEX0VOQUJMRSgpIGlzIFRSVUUuCisvLwkJMi4gSW5wdXQgSUUgaXMgYW4gdmFsaWQgb25lLgorLy8KK3ZvaWQKK0RvdDExZF9VcGRhdGVDb3VudHJ5SWUoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwKKwl1OCAqCQlwVGFkZHIsCisJdTE2CUNvdXRyeUllTGVuLAorCXU4ICogcENvdXRyeUllCisJKQoreworCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhkZXYpOworCXU4IGksIGosIE51bVRyaXBsZXMsIE1heENobmxOdW07CisJUENITkxfVFhQT1dFUl9UUklQTEUgcFRyaXBsZTsKKworCW1lbXNldChwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXAsIDAsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKKwltZW1zZXQocERvdDExZEluZm8tPk1heFR4UHdyRGJtTGlzdCwgMHhGRiwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOworCU1heENobmxOdW0gPSAwOworCU51bVRyaXBsZXMgPSAoQ291dHJ5SWVMZW4gLSAzKSAvIDM7IC8vIHNraXAgMy1ieXRlIGNvdW50cnkgc3RyaW5nLgorCXBUcmlwbGUgPSAoUENITkxfVFhQT1dFUl9UUklQTEUpKHBDb3V0cnlJZSArIDMpOworCWZvcihpID0gMDsgaSA8IE51bVRyaXBsZXM7IGkrKykKKwl7CisJCWlmKE1heENobmxOdW0gPj0gcFRyaXBsZS0+Rmlyc3RDaG5sKQorCQl7IC8vIEl0IGlzIG5vdCBpbiBhIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBvcmRlciwgc28gc3RvcCBwcm9jZXNzaW5nLgorCQkJcHJpbnRrKCJEb3QxMWRfVXBkYXRlQ291bnRyeUllKCk6IEludmFsaWQgY291bnRyeSBJRSwgc2tpcCBpdC4uLi4uLi4uMVxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYoTUFYX0NIQU5ORUxfTlVNQkVSIDwgKHBUcmlwbGUtPkZpcnN0Q2hubCArIHBUcmlwbGUtPk51bUNobmxzKSkKKwkJeyAvLyBJdCBpcyBub3QgYSB2YWxpZCBzZXQgb2YgY2hhbm5lbCBpZCwgc28gc3RvcCBwcm9jZXNzaW5nLgorCQkJcHJpbnRrKCJEb3QxMWRfVXBkYXRlQ291bnRyeUllKCk6IEludmFsaWQgY291bnRyeSBJRSwgc2tpcCBpdC4uLi4uLi4uMlxuIik7CisJCQlyZXR1cm47CisJCX0KKworCQlmb3IoaiA9IDAgOyBqIDwgcFRyaXBsZS0+TnVtQ2hubHM7IGorKykKKwkJeworCQkJcERvdDExZEluZm8tPmNoYW5uZWxfbWFwW3BUcmlwbGUtPkZpcnN0Q2hubCArIGpdID0gMTsKKwkJCXBEb3QxMWRJbmZvLT5NYXhUeFB3ckRibUxpc3RbcFRyaXBsZS0+Rmlyc3RDaG5sICsgal0gPSBwVHJpcGxlLT5NYXhUeFBvd2VySW5EYm07CisJCQlNYXhDaG5sTnVtID0gcFRyaXBsZS0+Rmlyc3RDaG5sICsgajsKKwkJfQorCisJCXBUcmlwbGUgPSAoUENITkxfVFhQT1dFUl9UUklQTEUpKCh1OCopcFRyaXBsZSArIDMpOworCX0KKwkvL3ByaW50aygiRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgpOiBDaGFubmVsIExpc3Q6XG4iKTsKKwlwcmludGsoIkNoYW5uZWwgTGlzdDoiKTsKKwlmb3IoaT0xOyBpPD0gTUFYX0NIQU5ORUxfTlVNQkVSOyBpKyspCisJCWlmKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtpXSA+IDApCisJCQlwcmludGsoIiAlZCIsIGkpOworCXByaW50aygiXG4iKTsKKworCVVQREFURV9DSUVfU1JDKGRldiwgcFRhZGRyKTsKKworCXBEb3QxMWRJbmZvLT5Db3VudHJ5SWVMZW4gPSBDb3V0cnlJZUxlbjsKKwltZW1jcHkocERvdDExZEluZm8tPkNvdW50cnlJZUJ1ZiwgcENvdXRyeUllLENvdXRyeUllTGVuKTsKKwlwRG90MTFkSW5mby0+U3RhdGUgPSBET1QxMURfU1RBVEVfTEVBUk5FRDsKK30KKworCit1OAorRE9UMTFEX0dldE1heFR4UHdySW5EYm0oCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwKKwl1OCBDaGFubmVsCisJKQoreworCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhkZXYpOworCXU4IE1heFR4UHdySW5EYm0gPSAyNTU7CisKKwlpZihNQVhfQ0hBTk5FTF9OVU1CRVIgPCBDaGFubmVsKQorCXsKKwkJcHJpbnRrKCJET1QxMURfR2V0TWF4VHhQd3JJbkRibSgpOiBJbnZhbGlkIENoYW5uZWxcbiIpOworCQlyZXR1cm4gTWF4VHhQd3JJbkRibTsKKwl9CisJaWYocERvdDExZEluZm8tPmNoYW5uZWxfbWFwW0NoYW5uZWxdKQorCXsKKwkJTWF4VHhQd3JJbkRibSA9IHBEb3QxMWRJbmZvLT5NYXhUeFB3ckRibUxpc3RbQ2hhbm5lbF07CisJfQorCisJcmV0dXJuIE1heFR4UHdySW5EYm07Cit9CisKKwordm9pZAorRE9UMTFEX1NjYW5Db21wbGV0ZSgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGRldgorCSkKK3sKKwlQUlRfRE9UMTFEX0lORk8gcERvdDExZEluZm8gPSBHRVRfRE9UMTFEX0lORk8oZGV2KTsKKworCXN3aXRjaChwRG90MTFkSW5mby0+U3RhdGUpCisJeworCWNhc2UgRE9UMTFEX1NUQVRFX0xFQVJORUQ6CisJCXBEb3QxMWRJbmZvLT5TdGF0ZSA9IERPVDExRF9TVEFURV9ET05FOworCQlicmVhazsKKworCWNhc2UgRE9UMTFEX1NUQVRFX0RPTkU6CisJCWlmKCBHRVRfQ0lFX1dBVENIRE9HKGRldikgPT0gMCApCisJCXsgLy8gUmVzZXQgY291bnRyeSBJRSBpZiBwcmV2aW91cyBvbmUgaXMgZ29uZS4KKwkJCURvdDExZF9SZXNldChkZXYpOworCQl9CisJCWJyZWFrOworCWNhc2UgRE9UMTFEX1NUQVRFX05PTkU6CisJCWJyZWFrOworCX0KK30KKworaW50IElzTGVnYWxDaGFubmVsKAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogZGV2LAorCXU4IGNoYW5uZWwKKykKK3sKKwlQUlRfRE9UMTFEX0lORk8gcERvdDExZEluZm8gPSBHRVRfRE9UMTFEX0lORk8oZGV2KTsKKworCWlmKE1BWF9DSEFOTkVMX05VTUJFUiA8IGNoYW5uZWwpCisJeworCQlwcmludGsoIklzTGVnYWxDaGFubmVsKCk6IEludmFsaWQgQ2hhbm5lbFxuIik7CisJCXJldHVybiAwOworCX0KKwlpZihwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbY2hhbm5lbF0gPiAwKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworaW50IFRvTGVnYWxDaGFubmVsKAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogZGV2LAorCXU4IGNoYW5uZWwKKykKK3sKKwlQUlRfRE9UMTFEX0lORk8gcERvdDExZEluZm8gPSBHRVRfRE9UMTFEX0lORk8oZGV2KTsKKwl1OCBkZWZhdWx0X2NobiA9IDA7CisJdTMyIGkgPSAwOworCisJZm9yIChpPTE7IGk8PSBNQVhfQ0hBTk5FTF9OVU1CRVI7IGkrKykKKwl7CisJCWlmKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtpXSA+IDApCisJCXsKKwkJCWRlZmF1bHRfY2huID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYoTUFYX0NIQU5ORUxfTlVNQkVSIDwgY2hhbm5lbCkKKwl7CisJCXByaW50aygiSXNMZWdhbENoYW5uZWwoKTogSW52YWxpZCBDaGFubmVsXG4iKTsKKwkJcmV0dXJuIGRlZmF1bHRfY2huOworCX0KKworCWlmKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtjaGFubmVsXSA+IDApCisJCXJldHVybiBjaGFubmVsOworCisJcmV0dXJuIGRlZmF1bHRfY2huOworfQorRVhQT1JUX1NZTUJPTChEb3QxMWRfSW5pdCk7CitFWFBPUlRfU1lNQk9MKERvdDExZF9SZXNldCk7CitFWFBPUlRfU1lNQk9MKERvdDExZF9VcGRhdGVDb3VudHJ5SWUpOworRVhQT1JUX1NZTUJPTChET1QxMURfR2V0TWF4VHhQd3JJbkRibSk7CitFWFBPUlRfU1lNQk9MKERPVDExRF9TY2FuQ29tcGxldGUpOworRVhQT1JUX1NZTUJPTChJc0xlZ2FsQ2hhbm5lbCk7CitFWFBPUlRfU1lNQk9MKFRvTGVnYWxDaGFubmVsKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RvdDExZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kb3QxMWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWI3YTRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kb3QxMWQuaApAQCAtMCwwICsxLDEwMiBAQAorI2lmbmRlZiBfX0lOQ19ET1QxMURfSAorI2RlZmluZSBfX0lOQ19ET1QxMURfSAorCisjaWZkZWYgRU5BQkxFX0RPVDExRAorI2luY2x1ZGUgImllZWU4MDIxMS5oIgorCisvLyNkZWZpbmUgRU5BQkxFX0RPVDExRAorCisvLyNkZWZpbmUgRE9UMTFEX01BWF9DSE5MX05VTSA4MworCit0eXBlZGVmIHN0cnVjdCBfQ0hOTF9UWFBPV0VSX1RSSVBMRSB7CisJdTggRmlyc3RDaG5sOworCXU4ICBOdW1DaG5sczsKKwl1OCAgTWF4VHhQb3dlckluRGJtOworfUNITkxfVFhQT1dFUl9UUklQTEUsICpQQ0hOTF9UWFBPV0VSX1RSSVBMRTsKKwordHlwZWRlZiBlbnVtIF9ET1QxMURfU1RBVEUgeworCURPVDExRF9TVEFURV9OT05FID0gMCwKKwlET1QxMURfU1RBVEVfTEVBUk5FRCwKKwlET1QxMURfU1RBVEVfRE9ORSwKK31ET1QxMURfU1RBVEU7CisKK3R5cGVkZWYgc3RydWN0IF9SVF9ET1QxMURfSU5GTyB7CisJLy9ERUNMQVJFX1JUX09CSkVDVChSVF9ET1QxMURfSU5GTyk7CisKKwlib29sIGJFbmFibGVkOyAvLyBkb3QxMU11bHRpRG9tYWluQ2FwYWJpbGl0eUVuYWJsZWQKKworCXUxNiBDb3VudHJ5SWVMZW47IC8vID4gMCBpZiBDb3VudHJ5SWVCdWZbXSBjb250YWlucyB2YWxpZCBjb3VudHJ5IGluZm9ybWF0aW9uIGVsZW1lbnQuCisJdTggIENvdW50cnlJZUJ1ZltNQVhfSUVfTEVOXTsKKwl1OCAgQ291bnRyeUllU3JjQWRkcls2XTsgLy8gU291cmNlIEFQIG9mIHRoZSBjb3VudHJ5IElFLgorCXU4ICBDb3VudHJ5SWVXYXRjaGRvZzsKKworCXU4ICBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07ICAvLyEhIVZhbHVlIDA6IEludmFsaWQsIDE6IFZhbGlkIChhY3RpdmUgc2NhbiksIDI6IFZhbGlkIChwYXNzaXZlIHNjYW4pCisJLy91OCAgQ2hubExpc3RMZW47IC8vICNCeXRlcyB2YWxpZCBpbiBDaG5sTGlzdFtdLgorCS8vdTggIENobmxMaXN0W0RPVDExRF9NQVhfQ0hOTF9OVU1dOworCXU4ICBNYXhUeFB3ckRibUxpc3RbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOworCisJRE9UMTFEX1NUQVRFIFN0YXRlOworfVJUX0RPVDExRF9JTkZPLCAqUFJUX0RPVDExRF9JTkZPOworI2RlZmluZSBlcU1hY0FkZHIoYSxiKQkJKCAoKGEpWzBdPT0oYilbMF0gJiYgKGEpWzFdPT0oYilbMV0gJiYgKGEpWzJdPT0oYilbMl0gJiYgKGEpWzNdPT0oYilbM10gJiYgKGEpWzRdPT0oYilbNF0gJiYgKGEpWzVdPT0oYilbNV0pID8gMTowICkKKyNkZWZpbmUgY3BNYWNBZGRyKGRlcyxzcmMpCSAgICAgICgoZGVzKVswXT0oc3JjKVswXSwoZGVzKVsxXT0oc3JjKVsxXSwoZGVzKVsyXT0oc3JjKVsyXSwoZGVzKVszXT0oc3JjKVszXSwoZGVzKVs0XT0oc3JjKVs0XSwoZGVzKVs1XT0oc3JjKVs1XSkKKyNkZWZpbmUgR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpICgoUFJUX0RPVDExRF9JTkZPKSgoX19wSWVlZURldiktPnBEb3QxMWRJbmZvKSkKKworI2RlZmluZSBJU19ET1QxMURfRU5BQkxFKF9fcEllZWVEZXYpIEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+YkVuYWJsZWQKKyNkZWZpbmUgSVNfQ09VTlRSWV9JRV9WQUxJRChfX3BJZWVlRGV2KSAoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVMZW4gPiAwKQorCisjZGVmaW5lIElTX0VRVUFMX0NJRV9TUkMoX19wSWVlZURldiwgX19wVGEpIGVxTWFjQWRkcihHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZVNyY0FkZHIsIF9fcFRhKQorI2RlZmluZSBVUERBVEVfQ0lFX1NSQyhfX3BJZWVlRGV2LCBfX3BUYSkgY3BNYWNBZGRyKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllU3JjQWRkciwgX19wVGEpCisKKyNkZWZpbmUgSVNfQ09VTlRSWV9JRV9DSEFOR0VEKF9fcEllZWVEZXYsIF9fSWUpIFwKKwkoKChfX0llKS5MZW5ndGggPT0gMCB8fCAoX19JZSkuTGVuZ3RoICE9IEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllTGVuKSA/IFwKKwlGQUxTRSA6IFwKKwkoIW1lbWNtcChHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZUJ1ZiwgKF9fSWUpLk9jdGV0LCAoX19JZSkuTGVuZ3RoKSkpCisKKyNkZWZpbmUgQ0lFX1dBVENIRE9HX1RIIDEKKyNkZWZpbmUgR0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSBHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZVdhdGNoZG9nCisjZGVmaW5lIFJFU0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSBHRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpID0gMAorI2RlZmluZSBVUERBVEVfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpICsrR0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KQorCisjZGVmaW5lIElTX0RPVDExRF9TVEFURV9ET05FKF9fcEllZWVEZXYpIChHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPlN0YXRlID09IERPVDExRF9TVEFURV9ET05FKQorCisKK3ZvaWQKK0RvdDExZF9Jbml0KAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYKKwkpOworCit2b2lkCitEb3QxMWRfUmVzZXQoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldgorCSk7CisKK3ZvaWQKK0RvdDExZF9VcGRhdGVDb3VudHJ5SWUoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwKKwl1OCAqCQlwVGFkZHIsCisJdTE2CUNvdXRyeUllTGVuLAorCXU4ICogcENvdXRyeUllCisJKTsKKwordTgKK0RPVDExRF9HZXRNYXhUeFB3ckluRGJtKAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYsCisJdTggQ2hhbm5lbAorCSk7CisKK3ZvaWQKK0RPVDExRF9TY2FuQ29tcGxldGUoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBkZXYKKwkpOworCitpbnQgSXNMZWdhbENoYW5uZWwoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBkZXYsCisJdTggY2hhbm5lbAorKTsKKworaW50IFRvTGVnYWxDaGFubmVsKAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogZGV2LAorCXU4IGNoYW5uZWwKKyk7CisjZW5kaWYgLy9FTkFCTEVfRE9UMTFECisjZW5kaWYgLy8gI2lmbmRlZiBfX0lOQ19ET1QxMURfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA5MDhlMTIzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTEuaApAQCAtMCwwICsxLDI2MzkgQEAKKy8qCisgKiBNZXJnZWQgd2l0aCBtYWlubGluZSBpZWVlODAyMTEuaCBpbiBBdWcgMjAwNC4gIE9yaWdpbmFsIGllZWU4MDJfMTEKKyAqIHJlbWFpbnMgY29weXJpZ2h0IGJ5IHRoZSBvcmlnaW5hbCBhdXRob3JzCisgKgorICogUG9ydGlvbnMgb2YgdGhlIG1lcmdlZCBjb2RlIGFyZSBiYXNlZCBvbiBIb3N0IEFQIChzb2Z0d2FyZSB3aXJlbGVzcworICogTEFOIGFjY2VzcyBwb2ludCkgZHJpdmVyIGZvciBJbnRlcnNpbCBQcmlzbTIvMi41LzMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgKiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBBZGFwdGlvbiB0byBhIGdlbmVyaWMgSUVFRSA4MDIuMTEgc3RhY2sgYnkgSmFtZXMgS2V0cmVub3MKKyAqIDxqa2V0cmVub0BsaW51eC5pbnRlbC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIEludGVsIENvcnBvcmF0aW9uCisgKgorICogTW9kaWZpZWQgZm9yIFJlYWx0ZWsncyB3aS1maSBjYXJkcyBieSBBbmRyZWEgTWVyZWxsbworICogPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgSUVFRTgwMjExX0gKKyNkZWZpbmUgSUVFRTgwMjExX0gKKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPiAvKiBFVEhfQUxFTiAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPiAgIC8qIEFSUkFZX1NJWkUgKi8KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKworI2luY2x1ZGUgInJ0bDgxOXhfSFQuaCIKKyNpbmNsdWRlICJydGw4MTl4X0JBLmgiCisjaW5jbHVkZSAicnRsODE5eF9UUy5oIgorCisKKyNpZm5kZWYgSVdfTU9ERV9NT05JVE9SCisjZGVmaW5lIElXX01PREVfTU9OSVRPUiA2CisjZW5kaWYKKworI2lmbmRlZiBJV0VWQ1VTVE9NCisjZGVmaW5lIElXRVZDVVNUT00gMHg4YzAyCisjZW5kaWYKKworCisjaWZuZGVmIGNvbnRhaW5lcl9vZgorLyoqCisgKiBjb250YWluZXJfb2YgLSBjYXN0IGEgbWVtYmVyIG9mIGEgc3RydWN0dXJlIG91dCB0byB0aGUgY29udGFpbmluZyBzdHJ1Y3R1cmUKKyAqCisgKiBAcHRyOiAgICAgICAgdGhlIHBvaW50ZXIgdG8gdGhlIG1lbWJlci4KKyAqIEB0eXBlOiAgICAgICB0aGUgdHlwZSBvZiB0aGUgY29udGFpbmVyIHN0cnVjdCB0aGlzIGlzIGVtYmVkZGVkIGluLgorICogQG1lbWJlcjogICAgIHRoZSBuYW1lIG9mIHRoZSBtZW1iZXIgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKgorICovCisjZGVmaW5lIGNvbnRhaW5lcl9vZihwdHIsIHR5cGUsIG1lbWJlcikgKHsgICAgICAgICAgICAgICAgICAgICAgXAorCWNvbnN0IHR5cGVvZiggKCh0eXBlICopMCktPm1lbWJlciApICpfX21wdHIgPSAocHRyKTsgICAgXAorCSh0eXBlICopKCAoY2hhciAqKV9fbXB0ciAtIG9mZnNldG9mKHR5cGUsbWVtYmVyKSApO30pCisjZW5kaWYKKworI2RlZmluZSBLRVlfVFlQRV9OQQkJMHgwCisjZGVmaW5lIEtFWV9UWVBFX1dFUDQwIAkJMHgxCisjZGVmaW5lIEtFWV9UWVBFX1RLSVAJCTB4MgorI2RlZmluZSBLRVlfVFlQRV9DQ01QCQkweDQKKyNkZWZpbmUgS0VZX1RZUEVfV0VQMTA0CQkweDUKKworLyogYWRkZWQgZm9yIHJ0bDgxOXggdHggcHJvY2VkdXJlICovCisjZGVmaW5lIE1BWF9RVUVVRV9TSVpFCQkweDEwCisKKy8vCisvLyA4MTkwIHF1ZXVlIG1hcHBpbmcKKy8vCisjZGVmaW5lIEJLX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQkVfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBWSV9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFZPX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgSENDQV9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBUWENNRF9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIE1HTlRfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgSElHSF9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBCRUFDT05fUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICA4CisKKyNkZWZpbmUgTE9XX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVfUVVFVUUKKyNkZWZpbmUgTk9STUFMX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgTUdOVF9RVUVVRQorCisvL2FkZGVkIGJ5IGFteSBmb3IgcHMKKyNkZWZpbmUgU1dSRl9USU1FT1VUCQkJCTUwCisKKy8vYWRkZWQgYnkgYW15IGZvciBMRUFQIHJlbGF0ZWQKKyNkZWZpbmUgSUVfQ0lTQ09fRkxBR19QT1NJVElPTgkJMHgwOAkvLyBGbGFnIGJ5dGU6IGJ5dGUgOCwgbnVtYmVyZWQgZnJvbSAwLgorI2RlZmluZSBTVVBQT1JUX0NLSVBfTUlDCQkJMHgwOAkvLyBiaXQzCisjZGVmaW5lIFNVUFBPUlRfQ0tJUF9QSwkJCTB4MTAJLy8gYml0NAorLyogZGVmaW5lZCBmb3Igc2tiIGNiIGZpZWxkICovCisvKiBBdCBtb3N0IDI4IGJ5dGUgKi8KK3R5cGVkZWYgc3RydWN0IGNiX2Rlc2MgeworCS8qIFR4IERlc2MgUmVsYXRlZCBmbGFncyAoOC05KSAqLworCXU4IGJMYXN0SW5pUGt0OjE7CisJdTggYkNtZE9ySW5pdDoxOworCXU4IGJGaXJzdFNlZzoxOworCXU4IGJMYXN0U2VnOjE7CisJdTggYkVuY3J5cHQ6MTsKKwl1OCBiVHhEaXNhYmxlUmF0ZUZhbGxCYWNrOjE7CisJdTggYlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlOjE7CisJdTggYkh3U2VjOjE7IC8vaW5kaWNhdGUgd2hldGhlciB1c2UgSHcgc2VjdXJpdHkuIFdCCisKKwl1OCByZXNlcnZlZDE7CisKKwkvKiBUeCBGaXJtd2FyZSBSZWxhZ2VkIGZsYWdzICgxMC0xMSkqLworCXU4IGJDVFNFbmFibGU6MTsKKwl1OCBiUlRTRW5hYmxlOjE7CisJdTggYlVzZVNob3J0R0k6MTsKKwl1OCBiVXNlU2hvcnRQcmVhbWJsZToxOworCXU4IGJUeEVuYWJsZUZ3Q2FsY0R1cjoxOworCXU4IGJBTVBEVUVuYWJsZToxOworCXU4IGJSVFNTVEJDOjE7CisJdTggUlRTU0M6MTsKKworCXU4IGJSVFNCVzoxOworCXU4IGJQYWNrZXRCVzoxOworCXU4IGJSVFNVc2VTaG9ydFByZWFtYmxlOjE7CisJdTggYlJUU1VzZVNob3J0R0k6MTsKKwl1OCBiTXVsdGljYXN0OjE7CisJdTggYkJyb2FkY2FzdDoxOworCS8vdTggcmVzZXJ2ZWQyOjI7CisJdTggZHJ2X2FnZ19lbmFibGU6MTsKKwl1OCByZXNlcnZlZDI6MTsKKworCS8qIFR4IERlc2MgcmVsYXRlZCBlbGVtZW50KDEyLTE5KSAqLworCXU4IHJhdGFfaW5kZXg7CisJdTggcXVldWVfaW5kZXg7CisJLy91OCByZXNlcnZlZDM7CisJLy91OCByZXNlcnZlZDQ7CisJdTE2IHR4YnVmX3NpemU7CisJLy91OCByZXNlcnZlZDU7CisJdTggUkFUUkluZGV4OworCXU4IHJlc2VydmVkNjsKKwl1OCByZXNlcnZlZDc7CisJdTggcmVzZXJ2ZWQ4OworCisJLyogVHggZmlybXdhcmUgcmVsYXRlZCBlbGVtZW50KDIwLTI3KSAqLworCXU4IGRhdGFfcmF0ZTsKKwl1OCBydHNfcmF0ZTsKKwl1OCBhbXBkdV9mYWN0b3I7CisJdTggYW1wZHVfZGVuc2l0eTsKKwkvL3U4IHJlc2VydmVkOTsKKwkvL3U4IHJlc2VydmVkMTA7CisJLy91OCByZXNlcnZlZDExOworCXU4IERydkFnZ3JOdW07CisJdTE2IHBrdF9zaXplOworCXU4IHJlc2VydmVkMTI7Cit9Y2JfZGVzYywgKnBjYl9kZXNjOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBNR05fMU0gICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIE1HTl8yTSAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgTUdOXzVfNU0gICAgICAgICAgICAgICAgMHgwYgorI2RlZmluZSBNR05fMTFNICAgICAgICAgICAgICAgICAweDE2CisKKyNkZWZpbmUgTUdOXzZNICAgICAgICAgICAgICAgICAgMHgwYworI2RlZmluZSBNR05fOU0gICAgICAgICAgICAgICAgICAweDEyCisjZGVmaW5lIE1HTl8xMk0gICAgICAgICAgICAgICAgIDB4MTgKKyNkZWZpbmUgTUdOXzE4TSAgICAgICAgICAgICAgICAgMHgyNAorI2RlZmluZSBNR05fMjRNICAgICAgICAgICAgICAgICAweDMwCisjZGVmaW5lIE1HTl8zNk0gICAgICAgICAgICAgICAgIDB4NDgKKyNkZWZpbmUgTUdOXzQ4TSAgICAgICAgICAgICAgICAgMHg2MAorI2RlZmluZSBNR05fNTRNICAgICAgICAgICAgICAgICAweDZjCisKKyNkZWZpbmUgTUdOX01DUzAgICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBNR05fTUNTMSAgICAgICAgICAgICAgICAweDgxCisjZGVmaW5lIE1HTl9NQ1MyICAgICAgICAgICAgICAgIDB4ODIKKyNkZWZpbmUgTUdOX01DUzMgICAgICAgICAgICAgICAgMHg4MworI2RlZmluZSBNR05fTUNTNCAgICAgICAgICAgICAgICAweDg0CisjZGVmaW5lIE1HTl9NQ1M1ICAgICAgICAgICAgICAgIDB4ODUKKyNkZWZpbmUgTUdOX01DUzYgICAgICAgICAgICAgICAgMHg4NgorI2RlZmluZSBNR05fTUNTNyAgICAgICAgICAgICAgICAweDg3CisjZGVmaW5lIE1HTl9NQ1M4ICAgICAgICAgICAgICAgIDB4ODgKKyNkZWZpbmUgTUdOX01DUzkgICAgICAgICAgICAgICAgMHg4OQorI2RlZmluZSBNR05fTUNTMTAgICAgICAgICAgICAgICAweDhhCisjZGVmaW5lIE1HTl9NQ1MxMSAgICAgICAgICAgICAgIDB4OGIKKyNkZWZpbmUgTUdOX01DUzEyICAgICAgICAgICAgICAgMHg4YworI2RlZmluZSBNR05fTUNTMTMgICAgICAgICAgICAgICAweDhkCisjZGVmaW5lIE1HTl9NQ1MxNCAgICAgICAgICAgICAgIDB4OGUKKyNkZWZpbmUgTUdOX01DUzE1ICAgICAgICAgICAgICAgMHg4ZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCQk4MDIuMTEgTWFuYWdlbWVudCBmcmFtZSBSZWFzb24gQ29kZSBmaWVsZAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitlbnVtCV9SZWFzb25Db2RleworCXVuc3BlY19yZWFzb24JPSAweDEsCisJYXV0aF9ub3RfdmFsaWQJPSAweDIsCisJZGVhdXRoX2x2X3NzCT0gMHgzLAorCWluYWN0aXZpdHkJCT0gMHg0LAorCWFwX292ZXJsb2FkIAk9IDB4NSwKKwljbGFzczJfZXJyCQk9IDB4NiwKKwljbGFzczNfZXJyCQk9IDB4NywKKwlkaXNhc19sdl9zcyAJPSAweDgsCisJYXNvY19ub3RfYXV0aAk9IDB4OSwKKworCS8vLS0tLU1JQ19DSEVDSworCW1pY19mYWlsdXJlIAk9IDB4ZSwKKwkvLy0tLS1FTkQgTUlDX0NIRUNLCisKKwkvLyBSZWFzb24gY29kZSBkZWZpbmVkIGluIDgwMi4xMWkgRDEwLjAgcC4yOC4KKwlpbnZhbGlkX0lFCQk9IDB4MGQsCisJZm91cl93YXlfdG1vdXQJPSAweDBmLAorCXR3b193YXlfdG1vdXQJPSAweDEwLAorCUlFX2Rpc21hdGNoIAk9IDB4MTEsCisJaW52YWxpZF9HY2lwaGVyID0gMHgxMiwKKwlpbnZhbGlkX1BjaXBoZXIgPSAweDEzLAorCWludmFsaWRfQUtNUAk9IDB4MTQsCisJdW5zdXBfUlNOSUV2ZXIgPSAweDE1LAorCWludmFsaWRfUlNOSUUJPSAweDE2LAorCWF1dGhfODAyXzF4X2ZhaWw9IDB4MTcsCisJY2lwZXJfcmVqZWN0CQk9IDB4MTgsCisKKwkvLyBSZWFzb24gY29kZSBkZWZpbmVkIGluIDcuMy4xLjcsIDgwMi4xZSBEMTMuMCwgcC40Mi4gQWRkZWQgYnkgQW5uaWUsIDIwMDUtMTEtMTUuCisJUW9TX3Vuc3BlYwkJPSAweDIwLCAvLyAzMgorCVFBUF9iYW5kd2lkdGgJPSAweDIxLCAvLyAzMworCXBvb3JfY29uZGl0aW9uCT0gMHgyMiwgLy8gMzQKKwlub19mYWNpbGl0eSAJPSAweDIzLCAvLyAzNQorCQkJCQkJCS8vIFdoZXJlIGlzIDM2Pz8/CisJcmVxX2RlY2xpbmVkCT0gMHgyNSwgLy8gMzcKKwlpbnZhbGlkX3BhcmFtCT0gMHgyNiwgLy8gMzgKKwlyZXFfbm90X2hvbm9yZWQ9IDB4MjcsCS8vIDM5CisJVFNfbm90X2NyZWF0ZWQJPSAweDJGLCAvLyA0NworCURMX25vdF9hbGxvd2VkCT0gMHgzMCwgLy8gNDgKKwlkZXN0X25vdF9leGlzdAk9IDB4MzEsIC8vIDQ5CisJZGVzdF9ub3RfUVNUQQk9IDB4MzIsIC8vIDUwCit9OworCisKKworI2RlZmluZSBhU2lmc1RpbWUJICgocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX0EpfHwocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX05fMjRHKXx8KHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLm1vZGUgPT0gSUVFRV9OXzVHKSk/IDE2IDogMTAKKworI2RlZmluZSBNR01UX1FVRVVFX05VTSA1CisKKyNkZWZpbmUgSUVFRV9DTURfU0VUX1dQQV9QQVJBTQkJCTEKKyNkZWZpbmUJSUVFRV9DTURfU0VUX1dQQV9JRQkJCTIKKyNkZWZpbmUgSUVFRV9DTURfU0VUX0VOQ1JZUFRJT04JCQkzCisjZGVmaW5lIElFRUVfQ01EX01MTUUJCQkJNAorCisjZGVmaW5lIElFRUVfUEFSQU1fV1BBX0VOQUJMRUQJCQkxCisjZGVmaW5lIElFRUVfUEFSQU1fVEtJUF9DT1VOVEVSTUVBU1VSRVMJCTIKKyNkZWZpbmUgSUVFRV9QQVJBTV9EUk9QX1VORU5DUllQVEVECQkzCisjZGVmaW5lIElFRUVfUEFSQU1fUFJJVkFDWV9JTlZPS0VECQk0CisjZGVmaW5lIElFRUVfUEFSQU1fQVVUSF9BTEdTCQkJNQorI2RlZmluZSBJRUVFX1BBUkFNX0lFRUVfODAyXzFYCQkJNgorLy9JdCBzaG91bGQgY29uc2lzdGVudCB3aXRoIHRoZSBkcml2ZXJfWFhYLmMKKy8vICAgRGF2aWQsIDIwMDYuOS4yNgorI2RlZmluZSBJRUVFX1BBUkFNX1dQQVhfU0VMRUNUCQkJNworLy9BZGRlZCBmb3Igbm90aWZ5IHRoZSBlbmNyeXB0aW9uIHR5cGUgc2VsZWN0aW9uCisvLyAgIERhdmlkLCAyMDA2LjkuMjYKKyNkZWZpbmUgSUVFRV9QUk9UT19XUEEJCQkJMQorI2RlZmluZSBJRUVFX1BST1RPX1JTTgkJCQkyCisvL0FkZGVkIGZvciBub3RpZnkgdGhlIGVuY3J5cHRpb24gdHlwZSBzZWxlY3Rpb24KKy8vICAgRGF2aWQsIDIwMDYuOS4yNgorI2RlZmluZSBJRUVFX1dQQVhfVVNFR1JPVVAJCQkwCisjZGVmaW5lIElFRUVfV1BBWF9XRVA0MAkJCQkxCisjZGVmaW5lIElFRUVfV1BBWF9US0lQCQkJCTIKKyNkZWZpbmUgSUVFRV9XUEFYX1dSQVAgICAJCQkzCisjZGVmaW5lIElFRUVfV1BBWF9DQ01QCQkJCTQKKyNkZWZpbmUgSUVFRV9XUEFYX1dFUDEwNAkJCTUKKworI2RlZmluZSBJRUVFX0tFWV9NR01UX0lFRUU4MDIxWAkJCTEKKyNkZWZpbmUgSUVFRV9LRVlfTUdNVF9QU0sJCQkyCisKKyNkZWZpbmUgSUVFRV9NTE1FX1NUQV9ERUFVVEgJCQkxCisjZGVmaW5lIElFRUVfTUxNRV9TVEFfRElTQVNTT0MJCQkyCisKKworI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9VTktOT1dOX0FMRwkJMgorI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9VTktOT1dOX0FERFIJCTMKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfQ1JZUFRfSU5JVF9GQUlMRUQJNAorI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9LRVlfU0VUX0ZBSUxFRAkJNQorI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9UWF9LRVlfU0VUX0ZBSUxFRAk2CisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX0NBUkRfQ09ORl9GQUlMRUQJCTcKKworCisjZGVmaW5lCUlFRUVfQ1JZUFRfQUxHX05BTUVfTEVOCQkJMTYKKworI2RlZmluZSBNQVhfSUVfTEVOICAweGZmCisKKy8vIGFkZGVkIGZvciBrZXJuZWwgY29uZmxpY3QKKyNkZWZpbmUgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzIAlpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXNfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfaGFuZGxlciAJaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyX3JzbAorI2RlZmluZSBpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQgCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMgIAlpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wc19yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wcyBpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzX3JzbAorI2RlZmluZSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMgCWllZWU4MDIxMV9nZXRfY3J5cHRvX29wc19yc2wKKworI2RlZmluZSBpZWVlODAyMTFfY2NtcF9udWxsCQlpZWVlODAyMTFfY2NtcF9udWxsX3JzbAorCisjZGVmaW5lIGllZWU4MDIxMV90a2lwX251bGwJCWllZWU4MDIxMV90a2lwX251bGxfcnNsCisKKyNkZWZpbmUgaWVlZTgwMjExX3dlcF9udWxsCQlpZWVlODAyMTFfd2VwX251bGxfcnNsCisKKyNkZWZpbmUgZnJlZV9pZWVlODAyMTEgICAgICAgICAgCWZyZWVfaWVlZTgwMjExX3JzbAorI2RlZmluZSBhbGxvY19pZWVlODAyMTEgICAgICAgIAkJYWxsb2NfaWVlZTgwMjExX3JzbAorCisjZGVmaW5lIGllZWU4MDIxMV9yeCAJCQlpZWVlODAyMTFfcnhfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9yeF9tZ3QJCWllZWU4MDIxMV9yeF9tZ3RfcnNsCisKKyNkZWZpbmUgaWVlZTgwMjExX2dldF9iZWFjb24JCWllZWU4MDIxMV9nZXRfYmVhY29uX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd2FrZV9xdWV1ZQkJaWVlZTgwMjExX3dha2VfcXVldWVfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9zdG9wX3F1ZXVlCQlpZWVlODAyMTFfc3RvcF9xdWV1ZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3Jlc2V0X3F1ZXVlCQlpZWVlODAyMTFfcmVzZXRfcXVldWVfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2wJaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9wcm90b2NvbF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2wgaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2xfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9pc19zaG9ydHNsb3QJCWllZWU4MDIxMV9pc19zaG9ydHNsb3RfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9pc181NGcJCWllZWU4MDIxMV9pc181NGdfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93cGFfc3VwcGxpY2FudF9pb2N0bAlpZWVlODAyMTFfd3BhX3N1cHBsaWNhbnRfaW9jdGxfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9wc190eF9hY2sJCWllZWU4MDIxMV9wc190eF9hY2tfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9zb2Z0bWFjX3htaXQJCWllZWU4MDIxMV9zb2Z0bWFjX3htaXRfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucwlpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnNfcnNsCisjZGVmaW5lIG5vdGlmeV93eF9hc3NvY19ldmVudAkJbm90aWZ5X3d4X2Fzc29jX2V2ZW50X3JzbAorI2RlZmluZSBTZW5kRGlzYXNzb2NpYXRpb24JCVNlbmREaXNhc3NvY2lhdGlvbl9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZQkJaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucwlpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zX3JzbAorI2RlZmluZSBpZWVlODAyMTFfc3RvcF9zY2FuCQlpZWVlODAyMTFfc3RvcF9zY2FuX3JzbAorI2RlZmluZSBpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXF1ZXN0cwlpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXF1ZXN0c19yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl9zeW5jcm8JaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl9zeW5jcm9fcnNsCisjZGVmaW5lIGllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybwlpZWVlODAyMTFfc3RhcnRfc2Nhbl9zeW5jcm9fcnNsCisKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9lc3NpZAkJaWVlZTgwMjExX3d4X2dldF9lc3NpZF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9lc3NpZAkJaWVlZTgwMjExX3d4X3NldF9lc3NpZF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9yYXRlCQlpZWVlODAyMTFfd3hfc2V0X3JhdGVfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfcmF0ZQkJaWVlZTgwMjExX3d4X2dldF9yYXRlX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3dhcAkJaWVlZTgwMjExX3d4X3NldF93YXBfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfd2FwCQlpZWVlODAyMTFfd3hfZ2V0X3dhcF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9tb2RlCQlpZWVlODAyMTFfd3hfc2V0X21vZGVfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfbW9kZQkJaWVlZTgwMjExX3d4X2dldF9tb2RlX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3NjYW4JCWllZWU4MDIxMV93eF9zZXRfc2Nhbl9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9mcmVxCQlpZWVlODAyMTFfd3hfZ2V0X2ZyZXFfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZnJlcQkJaWVlZTgwMjExX3d4X3NldF9mcmVxX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3Jhd3R4CQlpZWVlODAyMTFfd3hfc2V0X3Jhd3R4X3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X25hbWUJCWllZWU4MDIxMV93eF9nZXRfbmFtZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9wb3dlcgkJaWVlZTgwMjExX3d4X3NldF9wb3dlcl9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9wb3dlcgkJaWVlZTgwMjExX3d4X2dldF9wb3dlcl9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXMJaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfcnRzCQlpZWVlODAyMTFfd3hfc2V0X3J0c19yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9ydHMJCWllZWU4MDIxMV93eF9nZXRfcnRzX3JzbAorCisjZGVmaW5lIGllZWU4MDIxMV90eGJfZnJlZQkJaWVlZTgwMjExX3R4Yl9mcmVlX3JzbAorCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZ2VuX2llCQlpZWVlODAyMTFfd3hfc2V0X2dlbl9pZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9zY2FuCQlpZWVlODAyMTFfd3hfZ2V0X3NjYW5fcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZW5jb2RlCQlpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9lbmNvZGUJCWllZWU4MDIxMV93eF9nZXRfZW5jb2RlX3JzbAorI2lmIFdJUkVMRVNTX0VYVCA+PSAxOAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X21sbWUJCWllZWU4MDIxMV93eF9zZXRfbWxtZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9hdXRoCQlpZWVlODAyMTFfd3hfc2V0X2F1dGhfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZW5jb2RlX2V4dAlpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9leHRfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfZW5jb2RlX2V4dAlpZWVlODAyMTFfd3hfZ2V0X2VuY29kZV9leHRfcnNsCisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCBpZWVlX3BhcmFtIHsKKwl1MzIgY21kOworCXU4IHN0YV9hZGRyW0VUSF9BTEVOXTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1OCBuYW1lOworCQkJdTMyIHZhbHVlOworCQl9IHdwYV9wYXJhbTsKKwkJc3RydWN0IHsKKwkJCXUzMiBsZW47CisJCQl1OCByZXNlcnZlZFszMl07CisJCQl1OCBkYXRhWzBdOworCQl9IHdwYV9pZTsKKwkJc3RydWN0eworCQkJaW50IGNvbW1hbmQ7CisJCQlpbnQgcmVhc29uX2NvZGU7CisJCX0gbWxtZTsKKwkJc3RydWN0IHsKKwkJCXU4IGFsZ1tJRUVFX0NSWVBUX0FMR19OQU1FX0xFTl07CisJCQl1OCBzZXRfdHg7CisJCQl1MzIgZXJyOworCQkJdTggaWR4OworCQkJdTggc2VxWzhdOyAvKiBzZXF1ZW5jZSBjb3VudGVyIChzZXQ6IFJYLCBnZXQ6IFRYKSAqLworCQkJdTE2IGtleV9sZW47CisJCQl1OCBrZXlbMF07CisJCX0gY3J5cHQ7CisJfSB1OworfWllZWVfcGFyYW07CisKKworI2lmIFdJUkVMRVNTX0VYVCA8IDE3CisjZGVmaW5lIElXX1FVQUxfUVVBTF9JTlZBTElEICAgMHgxMAorI2RlZmluZSBJV19RVUFMX0xFVkVMX0lOVkFMSUQgIDB4MjAKKyNkZWZpbmUgSVdfUVVBTF9OT0lTRV9JTlZBTElEICAweDQwCisjZGVmaW5lIElXX1FVQUxfUVVBTF9VUERBVEVEICAgMHgxCisjZGVmaW5lIElXX1FVQUxfTEVWRUxfVVBEQVRFRCAgMHgyCisjZGVmaW5lIElXX1FVQUxfTk9JU0VfVVBEQVRFRCAgMHg0CisjZW5kaWYKKworCisvLyBsaW51eCB1bmRlciAyLjYuOSByZWxlYXNlIG1heSBub3Qgc3VwcG9ydCBpdCwgc28gbW9kaWZ5IGl0IGZvciBjb21tb24gdXNlCisjZGVmaW5lIE1TRUNTKHQpIG1zZWNzX3RvX2ppZmZpZXModCkKKyNkZWZpbmUgbXNsZWVwX2ludGVycnVwdGlibGVfcnNsICBtc2xlZXBfaW50ZXJydXB0aWJsZQorCisjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0xFTgkJMjMwNAorLyogTWF4aW11bSBzaXplIGZvciB0aGUgTUEtVU5JVERBVEEgcHJpbWl0aXZlLCA4MDIuMTEgc3RhbmRhcmQgc2VjdGlvbgorICAgNi4yLjEuMS4yLgorCisgICBUaGUgZmlndXJlIGluIHNlY3Rpb24gNy4xLjIgc3VnZ2VzdHMgYSBib2R5IHNpemUgb2YgdXAgdG8gMjMxMgorICAgYnl0ZXMgaXMgYWxsb3dlZCwgd2hpY2ggaXMgYSBiaXQgY29uZnVzaW5nLCBJIHN1c3BlY3QgdGhpcworICAgcmVwcmVzZW50cyB0aGUgMjMwNCBieXRlcyBvZiByZWFsIGRhdGEsIHBsdXMgYSBwb3NzaWJsZSA4IGJ5dGVzIG9mCisgICBXRVAgSVYgYW5kIElDVi4gKHRoaXMgaW50ZXJwcmV0YXRpb24gc3VnZ2VzdGVkIGJ5IFJhbWlybyBCYXJyZWlybykgKi8KKyNkZWZpbmUgSUVFRTgwMjExXzFBRERSX0xFTiAxMAorI2RlZmluZSBJRUVFODAyMTFfMkFERFJfTEVOIDE2CisjZGVmaW5lIElFRUU4MDIxMV8zQUREUl9MRU4gMjQKKyNkZWZpbmUgSUVFRTgwMjExXzRBRERSX0xFTiAzMAorI2RlZmluZSBJRUVFODAyMTFfRkNTX0xFTiAgICA0CisjZGVmaW5lIElFRUU4MDIxMV9ITEVOICAgICAgICAgICAgICAgICAgKElFRUU4MDIxMV80QUREUl9MRU4pCisjZGVmaW5lIElFRUU4MDIxMV9GUkFNRV9MRU4gICAgICAgICAgICAgKElFRUU4MDIxMV9EQVRBX0xFTiArIElFRUU4MDIxMV9ITEVOKQorI2RlZmluZSBJRUVFODAyMTFfTUdNVF9IRFJfTEVOIDI0CisjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0hEUjNfTEVOIDI0CisjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0hEUjRfTEVOIDMwCisKKyNkZWZpbmUgTUlOX0ZSQUdfVEhSRVNIT0xEICAgICAyNTZVCisjZGVmaW5lIE1BWF9GUkFHX1RIUkVTSE9MRCAgICAgMjM0NlUKKworCisvKiBGcmFtZSBjb250cm9sIGZpZWxkIGNvbnN0YW50cyAqLworI2RlZmluZSBJRUVFODAyMTFfRkNUTF9WRVJTCQkweDAwMDMKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfRlRZUEUJCTB4MDAwYworI2RlZmluZSBJRUVFODAyMTFfRkNUTF9TVFlQRQkJMHgwMGYwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX0ZSQU1FVFlQRQkweDAwZmMKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfVE9EUwkJMHgwMTAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX0ZST01EUwkJMHgwMjAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX0RTVE9EUwkJMHgwMzAwIC8vYWRkZWQgYnkgZGF2aWQKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTCTB4MDQwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9SRVRSWQkJMHgwODAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1BNCQkweDEwMDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfTU9SRURBVEEJCTB4MjAwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9XRVAJCTB4NDAwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9PUkRFUgkJMHg4MDAwCisKKyNkZWZpbmUgSUVFRTgwMjExX0ZUWVBFX01HTVQJCTB4MDAwMAorI2RlZmluZSBJRUVFODAyMTFfRlRZUEVfQ1RMCQkweDAwMDQKKyNkZWZpbmUgSUVFRTgwMjExX0ZUWVBFX0RBVEEJCTB4MDAwOAorCisvKiBtYW5hZ2VtZW50ICovCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVEJMHgwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQIAkweDAwMTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVRCTB4MDAyMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVNQCTB4MDAzMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRCTB4MDA0MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUAkweDAwNTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0JFQUNPTgkJMHgwMDgwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BVElNCQkweDAwOTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RJU0FTU09DCTB4MDBBMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQVVUSAkJMHgwMEIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9ERUFVVEgJCTB4MDBDMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfTUFOQUdFX0FDVAkweDAwRDAKKworLyogY29udHJvbCAqLworI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFNQT0xMCQkweDAwQTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1JUUwkJMHgwMEIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DVFMJCTB4MDBDMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQUNLCQkweDAwRDAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGRU5ECQkweDAwRTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGRU5EQUNLCTB4MDBGMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQkxPQ0tBQ0sgICAweDAwOTQKKworLyogZGF0YSAqLworI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfREFUQQkJMHgwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGQUNLCTB4MDAxMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRlBPTEwJMHgwMDIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGQUNLUE9MTAkweDAwMzAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX05VTExGVU5DCTB4MDA0MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZBQ0sJCTB4MDA1MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZQT0xMCQkweDAwNjAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGQUNLUE9MTAkweDAwNzAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBCTB4MDA4MCAvL2FkZGVkIGZvciBXTU0gMjAwNi84LzIKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1FPU19OVUxMCTB4MDBDMAorCisjZGVmaW5lIElFRUU4MDIxMV9TQ1RMX0ZSQUcJCTB4MDAwRgorI2RlZmluZSBJRUVFODAyMTFfU0NUTF9TRVEJCTB4RkZGMAorCisvKiBRT1MgY29udHJvbCAqLworI2RlZmluZSBJRUVFODAyMTFfUUNUTF9USUQgICAgICAgICAgICAgIDB4MDAwRgorCisjZGVmaW5lCUZDX1FPU19CSVQJCQkJCUJJVDcKKyNkZWZpbmUgSXNEYXRhRnJhbWUocGR1KQkJCSggKChwZHVbMF0gJiAweDBDKT09MHgwOCkgPyB0cnVlIDogZmFsc2UgKQorI2RlZmluZQlJc0xlZ2FjeURhdGFGcmFtZShwZHUpCShJc0RhdGFGcmFtZShwZHUpICYmICghKHBkdVswXSZGQ19RT1NfQklUKSkgKQorLy9hZGRlZCBieSB3Yi4gSXMgdGhpcyByaWdodD8KKyNkZWZpbmUgSXNRb1NEYXRhRnJhbWUocGZyYW1lKSAgKCgqKHUxNiopcGZyYW1lJihJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEF8SUVFRTgwMjExX0ZUWVBFX0RBVEEpKSA9PSAoSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBfElFRUU4MDIxMV9GVFlQRV9EQVRBKSkKKyNkZWZpbmUgRnJhbWVfT3JkZXIocGZyYW1lKSAgICAgKCoodTE2KilwZnJhbWUmSUVFRTgwMjExX0ZDVExfT1JERVIpCisjZGVmaW5lIFNOX0xFU1MoYSwgYikJCSgoKGEtYikmMHg4MDApIT0wKQorI2RlZmluZSBTTl9FUVVBTChhLCBiKQkoYSA9PSBiKQorI2RlZmluZSBNQVhfREVWX0FERFJfU0laRSA4Cit0eXBlZGVmIGVudW0gX0FDVF9DQVRFR09SWXsKKwlBQ1RfQ0FUX1FPUyA9IDEsCisJQUNUX0NBVF9ETFMgPSAyLAorCUFDVF9DQVRfQkEgID0gMywKKwlBQ1RfQ0FUX0hUICA9IDcsCisJQUNUX0NBVF9XTU0gPSAxNywKK30gQUNUX0NBVEVHT1JZLCAqUEFDVF9DQVRFR09SWTsKKwordHlwZWRlZiBlbnVtIF9UU19BQ1RJT057CisJQUNUX0FERFRTUkVRID0gMCwKKwlBQ1RfQUREVFNSU1AgPSAxLAorCUFDVF9ERUxUUyAgICA9IDIsCisJQUNUX1NDSEVEVUxFID0gMywKK30gVFNfQUNUSU9OLCAqUFRTX0FDVElPTjsKKwordHlwZWRlZiBlbnVtIF9CQV9BQ1RJT057CisJQUNUX0FEREJBUkVRID0gMCwKKwlBQ1RfQUREQkFSU1AgPSAxLAorCUFDVF9ERUxCQSAgICA9IDIsCit9IEJBX0FDVElPTiwgKlBCQV9BQ1RJT047CisKK3R5cGVkZWYgZW51bSBfSW5pdGlhbEdhaW5PcFR5cGV7CisJSUdfQmFja3VwPTAsCisJSUdfUmVzdG9yZSwKKwlJR19NYXgKK31Jbml0aWFsR2Fpbk9wVHlwZTsKKworLyogZGVidWcgbWFjcm9zICovCisjZGVmaW5lIENPTkZJR19JRUVFODAyMTFfREVCVUcKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCitleHRlcm4gdTMyIGllZWU4MDIxMV9kZWJ1Z19sZXZlbDsKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIFwKK2RvIHsgaWYgKGllZWU4MDIxMV9kZWJ1Z19sZXZlbCAmIChsZXZlbCkpIFwKKyAgcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMTogIiBmbXQsICMjIGFyZ3MpOyB9IHdoaWxlICgwKQorLy93YiBhZGRlZCB0byBkZWJ1ZyBvdXQgZGF0YSBidWYKKy8vaWYgeW91IHdhbnQgcHJpbnQgREFUQSBidWZmZXIgcmVsYXRlZCBCQSwgcGxlYXNlIHNldCBpZWVlODAyMTFfZGVidWdfbGV2ZWwgdG8gREFUQXxCQQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfREFUQShsZXZlbCwgZGF0YSwgZGF0YWxlbikJXAorCWRveyBpZiAoKGllZWU4MDIxMV9kZWJ1Z19sZXZlbCAmIChsZXZlbCkpID09IChsZXZlbCkpCVwKKwkJeyAJXAorCQkJaW50IGk7CQkJCQlcCisJCQl1OCogcGRhdGEgPSAodTgqKSBkYXRhOwkJCVwKKwkJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTE6ICVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CVwKKwkJCWZvcihpPTA7IGk8KGludCkoZGF0YWxlbik7IGkrKykJCQlcCisJCQl7CQkJCQkJXAorCQkJCXByaW50aygiJTJ4ICIsIHBkYXRhW2ldKTsJCVwKKwkJCQlpZiAoKGkrMSklMTYgPT0gMCkgcHJpbnRrKCJcbiIpOwlcCisJCQl9CQkJCVwKKwkJCXByaW50aygiXG4iKTsJCQlcCisJCX0JCQkJCVwKKwl9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfREFUQShsZXZlbCwgZGF0YSwgZGF0YWxlbikgZG8ge30gd2hpbGUoMCkKKyNlbmRpZgkvKiBDT05GSUdfSUVFRTgwMjExX0RFQlVHICovCisKKy8qIGRlYnVnIG1hY3JvcyBub3QgZGVwZW5kZW50IG9uIENPTkZJR19JRUVFODAyMTFfREVCVUcgKi8KKworI2RlZmluZSBNQUNfRk1UICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIKKyNkZWZpbmUgTUFDX0FSRyh4KSAoKHU4KikoeCkpWzBdLCgodTgqKSh4KSlbMV0sKCh1OCopKHgpKVsyXSwoKHU4KikoeCkpWzNdLCgodTgqKSh4KSlbNF0sKCh1OCopKHgpKVs1XQorCisvKgorICogVG8gdXNlIHRoZSBkZWJ1ZyBzeXN0ZW07CisgKgorICogSWYgeW91IGFyZSBkZWZpbmluZyBhIG5ldyBkZWJ1ZyBjbGFzc2lmaWNhdGlvbiwgc2ltcGx5IGFkZCBpdCB0byB0aGUgI2RlZmluZQorICogbGlzdCBoZXJlIGluIHRoZSBmb3JtIG9mOgorICoKKyAqICNkZWZpbmUgSUVFRTgwMjExX0RMX3h4eHggVkFMVUUKKyAqCisgKiBzaGlmdGluZyB2YWx1ZSB0byB0aGUgbGVmdCBvbmUgYml0IGZyb20gdGhlIHByZXZpb3VzIGVudHJ5LiAgeHh4eCBzaG91bGQgYmUKKyAqIHRoZSBuYW1lIG9mIHRoZSBjbGFzc2lmaWNhdGlvbiAoZm9yIGV4YW1wbGUsIFdFUCkKKyAqCisgKiBZb3UgdGhlbiBuZWVkIHRvIGVpdGhlciBhZGQgYSBJRUVFODAyMTFfeHh4eF9ERUJVRygpIG1hY3JvIGRlZmluaXRpb24gZm9yIHlvdXIKKyAqIGNsYXNzaWZpY2F0aW9uLCBvciB1c2UgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF94eHh4LCAuLi4pIHdoZW5ldmVyIHlvdSB3YW50CisgKiB0byBzZW5kIG91dHB1dCB0byB0aGF0IGNsYXNzaWZpY2F0aW9uLgorICoKKyAqIFRvIGFkZCB5b3VyIGRlYnVnIGxldmVsIHRvIHRoZSBsaXN0IG9mIGxldmVscyBzZWVuIHdoZW4geW91IHBlcmZvcm0KKyAqCisgKiAlIGNhdCAvcHJvYy9uZXQvaXB3L2RlYnVnX2xldmVsCisgKgorICogeW91IHNpbXBseSBuZWVkIHRvIGFkZCB5b3VyIGVudHJ5IHRvIHRoZSBpcHdfZGVidWdfbGV2ZWxzIGFycmF5LgorICoKKyAqIElmIHlvdSBkbyBub3Qgc2VlIGRlYnVnX2xldmVsIGluIC9wcm9jL25ldC9pcHcgdGhlbiB5b3UgZG8gbm90IGhhdmUKKyAqIENPTkZJR19JRUVFODAyMTFfREVCVUcgZGVmaW5lZCBpbiB5b3VyIGtlcm5lbCBjb25maWd1cmF0aW9uCisgKgorICovCisKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0lORk8gICAgICAgICAgKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9ETF9XWCAgICAgICAgICAgICgxPDwxKQorI2RlZmluZSBJRUVFODAyMTFfRExfU0NBTiAgICAgICAgICAoMTw8MikKKyNkZWZpbmUgSUVFRTgwMjExX0RMX1NUQVRFICAgICAgICAgKDE8PDMpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9NR01UICAgICAgICAgICgxPDw0KQorI2RlZmluZSBJRUVFODAyMTFfRExfRlJBRyAgICAgICAgICAoMTw8NSkKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0VBUCAgICAgICAgICAgKDE8PDYpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9EUk9QICAgICAgICAgICgxPDw3KQorCisjZGVmaW5lIElFRUU4MDIxMV9ETF9UWCAgICAgICAgICAgICgxPDw4KQorI2RlZmluZSBJRUVFODAyMTFfRExfUlggICAgICAgICAgICAoMTw8OSkKKworI2RlZmluZSBJRUVFODAyMTFfRExfSFQJCSAgICgxPDwxMCkgIC8vSFQKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0JBCQkgICAoMTw8MTEpICAvL2JhCisjZGVmaW5lIElFRUU4MDIxMV9ETF9UUwkJICAgKDE8PDEyKSAgLy9UUworI2RlZmluZSBJRUVFODAyMTFfRExfUU9TICAgICAgICAgICAoMTw8MTMpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9SRU9SREVSCSAgICgxPDwxNCkKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0lPVAkgICAoMTw8MTUpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9JUFMJICAgKDE8PDE2KQorI2RlZmluZSBJRUVFODAyMTFfRExfVFJBQ0UJICAgKDE8PDI5KSAgLy90cmFjZSBmdW5jdGlvbiwgbmVlZCB0byB1c2VyIG5ldF9yYXRlbGltaXQoKSB0b2dldGhlciBpbiBvcmRlciBub3QgdG8gcHJpbnQgdG9vIG11Y2ggdG8gdGhlIHNjcmVlbgorI2RlZmluZSBJRUVFODAyMTFfRExfREFUQQkgICAoMTw8MzApICAgLy91c2UgdGhpcyBmbGFnIHRvIGNvbnRyb2wgd2hldGhlciBwcmludCBkYXRhIGJ1ZiBvdXQuCisjZGVmaW5lIElFRUU4MDIxMV9ETF9FUlIJICAgKDE8PDMxKSAgIC8vYWx3YXlzIG9wZW4KKyNkZWZpbmUgSUVFRTgwMjExX0VSUk9SKGYsIGEuLi4pIHByaW50ayhLRVJOX0VSUiAiaWVlZTgwMjExOiAiIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9XQVJOSU5HKGYsIGEuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgImllZWU4MDIxMTogIiBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfSU5GTyhmLCBhLi4uKSAgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSU5GTywgZiwgIyMgYSkKKworI2RlZmluZSBJRUVFODAyMTFfREVCVUdfV1goZiwgYS4uLikgICAgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfV1gsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19TQ0FOKGYsIGEuLi4pICAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9TQ0FOLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfU1RBVEUoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfU1RBVEUsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19NR01UKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX01HTVQsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19GUkFHKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0ZSQUcsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19FQVAoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRUFQLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfRFJPUChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9EUk9QLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfVFgoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfVFgsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19SWChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SWCwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1FPUyhmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9RT1MsIGYsICMjIGEpCisKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisvKiBBZGRlZCBieSBBbm5pZSwgMjAwNS0xMS0yMi4gKi8KKyNkZWZpbmUgTUFYX1NUUl9MRU4gICAgIDY0CisvKiBJIHdhbnQgdG8gc2VlIEFTQ0lJIDMzIHRvIDEyNiBvbmx5LiBPdGhlcndpc2UsIEkgcHJpbnQgJz8nLiBBbm5pZSwgMjAwNS0xMS0yMi4qLworI2RlZmluZSBQUklOVEFCTEUoX2NoKSAgKF9jaD4nIScgJiYgX2NoPCd+JykKKyNkZWZpbmUgSUVFRTgwMjExX1BSSU5UX1NUUihfQ29tcCwgX1RpdGxlU3RyaW5nLCBfUHRyLCBfTGVuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCQkJaWYoKF9Db21wKSAmIGxldmVsKSAgIAkJCQkJCQlcCisJCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJaW50ICAgICAgICAgICAgIF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQl1OCAgYnVmZmVyW01BWF9TVFJfTEVOXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCQkJCWludCBsZW5ndGggPSAoX0xlbjxNQVhfU1RSX0xFTik/IF9MZW4gOiAoTUFYX1NUUl9MRU4tMSkgOyAgCVwKKwkJCQltZW1zZXQoYnVmZmVyLCAwLCBNQVhfU1RSX0xFTik7ICAgICAgICAgICAgICAgICAgICAgIAkJXAorCQkJCW1lbWNweShidWZmZXIsICh1OCAqKV9QdHIsIGxlbmd0aCApOyAgICAgICAgICAgIAkJXAorCQkJCWZvciggX19pPTA7IF9faTxNQVhfU1RSX0xFTjsgX19pKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkgICAgIGlmKCAhUFJJTlRBQkxFKGJ1ZmZlcltfX2ldKSApICAgYnVmZmVyW19faV0gPSAnPyc7ICAgICAJXAorCQkJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJYnVmZmVyW2xlbmd0aF0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQlwcmludGsoIlJ0bDgxOXg6ICIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkJCQlwcmludGsoX1RpdGxlU3RyaW5nKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQlwcmludGsoIjogJWQsIDwlcz5cbiIsIF9MZW4sIGJ1ZmZlcik7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCX0KKyNlbHNlCisjZGVmaW5lIElFRUU4MDIxMV9QUklOVF9TVFIoX0NvbXAsIF9UaXRsZVN0cmluZywgX1B0ciwgX0xlbikgIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4gLyogQVJQSFJEX0VUSEVSICovCisKKyNpZm5kZWYgV0lSRUxFU1NfU1BZCisjZGVmaW5lIFdJUkVMRVNTX1NQWQkJLy8gZW5hYmxlIGl3c3B5IHN1cHBvcnQKKyNlbmRpZgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CS8vIG5ldyBkcml2ZXIgQVBJCisKKyNpZm5kZWYgRVRIX1BfUEFFCisjZGVmaW5lIEVUSF9QX1BBRSAweDg4OEUgLyogUG9ydCBBY2Nlc3MgRW50aXR5IChJRUVFIDgwMi4xWCkgKi8KKyNlbmRpZiAvKiBFVEhfUF9QQUUgKi8KKworI2RlZmluZSBFVEhfUF9QUkVBVVRIIDB4ODhDNyAvKiBJRUVFIDgwMi4xMWkgcHJlLWF1dGhlbnRpY2F0aW9uICovCisKKyNpZm5kZWYgRVRIX1BfODAyMTFfUkFXCisjZGVmaW5lIEVUSF9QXzgwMjExX1JBVyAoRVRIX1BfRUNPTkVUICsgMSkKKyNlbmRpZgorCisvKiBJRUVFIDgwMi4xMSBkZWZpbmVzICovCisKKyNkZWZpbmUgUDgwMjExX09VSV9MRU4gMworCitzdHJ1Y3QgaWVlZTgwMjExX3NuYXBfaGRyIHsKKworCXU4ICAgIGRzYXA7ICAgLyogYWx3YXlzIDB4QUEgKi8KKwl1OCAgICBzc2FwOyAgIC8qIGFsd2F5cyAweEFBICovCisJdTggICAgY3RybDsgICAvKiBhbHdheXMgMHgwMyAqLworCXU4ICAgIG91aVtQODAyMTFfT1VJX0xFTl07ICAgIC8qIG9yZ2FuaXphdGlvbmFsIHVuaXZlcnNhbCBpZCAqLworCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBTTkFQX1NJWkUgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIpCisKKyNkZWZpbmUgV0xBTl9GQ19HRVRfVkVSUyhmYykgKChmYykgJiBJRUVFODAyMTFfRkNUTF9WRVJTKQorI2RlZmluZSBXTEFOX0ZDX0dFVF9UWVBFKGZjKSAoKGZjKSAmIElFRUU4MDIxMV9GQ1RMX0ZUWVBFKQorI2RlZmluZSBXTEFOX0ZDX0dFVF9TVFlQRShmYykgKChmYykgJiBJRUVFODAyMTFfRkNUTF9TVFlQRSkKKworI2RlZmluZSBXTEFOX0ZDX0dFVF9GUkFNRVRZUEUoZmMpICgoZmMpICYgSUVFRTgwMjExX0ZDVExfRlJBTUVUWVBFKQorI2RlZmluZSBXTEFOX0dFVF9TRVFfRlJBRyhzZXEpICgoc2VxKSAmIElFRUU4MDIxMV9TQ1RMX0ZSQUcpCisjZGVmaW5lIFdMQU5fR0VUX1NFUV9TRVEoc2VxKSAgKCgoc2VxKSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkgPj4gNCkKKworLyogQXV0aGVudGljYXRpb24gYWxnb3JpdGhtcyAqLworI2RlZmluZSBXTEFOX0FVVEhfT1BFTiAwCisjZGVmaW5lIFdMQU5fQVVUSF9TSEFSRURfS0VZIDEKKyNkZWZpbmUgV0xBTl9BVVRIX0xFQVAgMgorCisjZGVmaW5lIFdMQU5fQVVUSF9DSEFMTEVOR0VfTEVOIDEyOAorCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9CU1MgKDE8PDApCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9JQlNTICgxPDwxKQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQ0ZfUE9MTEFCTEUgKDE8PDIpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9DRl9QT0xMX1JFUVVFU1QgKDE8PDMpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZICgxPDw0KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUgKDE8PDUpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9QQkNDICgxPDw2KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQ0hBTk5FTF9BR0lMSVRZICgxPDw3KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfU1BFQ1RSVU1fTUdNVCAoMTw8OCkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1FPUyAoMTw8OSkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QgKDE8PDEwKQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfRFNTU19PRkRNICgxPDwxMykKKworLyogODAyLjExZyBFUlAgaW5mb3JtYXRpb24gZWxlbWVudCAqLworI2RlZmluZSBXTEFOX0VSUF9OT05fRVJQX1BSRVNFTlQgKDE8PDApCisjZGVmaW5lIFdMQU5fRVJQX1VTRV9QUk9URUNUSU9OICgxPDwxKQorI2RlZmluZSBXTEFOX0VSUF9CQVJLRVJfUFJFQU1CTEUgKDE8PDIpCisKKy8qIFN0YXR1cyBjb2RlcyAqLworZW51bSBpZWVlODAyMTFfc3RhdHVzY29kZSB7CisJV0xBTl9TVEFUVVNfU1VDQ0VTUyA9IDAsCisJV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRSA9IDEsCisJV0xBTl9TVEFUVVNfQ0FQU19VTlNVUFBPUlRFRCA9IDEwLAorCVdMQU5fU1RBVFVTX1JFQVNTT0NfTk9fQVNTT0MgPSAxMSwKKwlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfVU5TUEVDID0gMTIsCisJV0xBTl9TVEFUVVNfTk9UX1NVUFBPUlRFRF9BVVRIX0FMRyA9IDEzLAorCVdMQU5fU1RBVFVTX1VOS05PV05fQVVUSF9UUkFOU0FDVElPTiA9IDE0LAorCVdMQU5fU1RBVFVTX0NIQUxMRU5HRV9GQUlMID0gMTUsCisJV0xBTl9TVEFUVVNfQVVUSF9USU1FT1VUID0gMTYsCisJV0xBTl9TVEFUVVNfQVBfVU5BQkxFX1RPX0hBTkRMRV9ORVdfU1RBID0gMTcsCisJV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX1JBVEVTID0gMTgsCisJLyogODAyLjExYiAqLworCVdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT1NIT1JUUFJFQU1CTEUgPSAxOSwKKwlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9QQkNDID0gMjAsCisJV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PQUdJTElUWSA9IDIxLAorCS8qIDgwMi4xMWggKi8KKwlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9TUEVDVFJVTSA9IDIyLAorCVdMQU5fU1RBVFVTX0FTU09DX1JFSkVDVEVEX0JBRF9QT1dFUiA9IDIzLAorCVdMQU5fU1RBVFVTX0FTU09DX1JFSkVDVEVEX0JBRF9TVVBQX0NIQU4gPSAyNCwKKwkvKiA4MDIuMTFnICovCisJV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PU0hPUlRUSU1FID0gMjUsCisJV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PRFNTU09GRE0gPSAyNiwKKwkvKiA4MDIuMTFpICovCisJV0xBTl9TVEFUVVNfSU5WQUxJRF9JRSA9IDQwLAorCVdMQU5fU1RBVFVTX0lOVkFMSURfR1JPVVBfQ0lQSEVSID0gNDEsCisJV0xBTl9TVEFUVVNfSU5WQUxJRF9QQUlSV0lTRV9DSVBIRVIgPSA0MiwKKwlXTEFOX1NUQVRVU19JTlZBTElEX0FLTVAgPSA0MywKKwlXTEFOX1NUQVRVU19VTlNVUFBfUlNOX1ZFUlNJT04gPSA0NCwKKwlXTEFOX1NUQVRVU19JTlZBTElEX1JTTl9JRV9DQVAgPSA0NSwKKwlXTEFOX1NUQVRVU19DSVBIRVJfU1VJVEVfUkVKRUNURUQgPSA0NiwKK307CisKKy8qIFJlYXNvbiBjb2RlcyAqLworZW51bSBpZWVlODAyMTFfcmVhc29uY29kZSB7CisJV0xBTl9SRUFTT05fVU5TUEVDSUZJRUQgPSAxLAorCVdMQU5fUkVBU09OX1BSRVZfQVVUSF9OT1RfVkFMSUQgPSAyLAorCVdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HID0gMywKKwlXTEFOX1JFQVNPTl9ESVNBU1NPQ19EVUVfVE9fSU5BQ1RJVklUWSA9IDQsCisJV0xBTl9SRUFTT05fRElTQVNTT0NfQVBfQlVTWSA9IDUsCisJV0xBTl9SRUFTT05fQ0xBU1MyX0ZSQU1FX0ZST01fTk9OQVVUSF9TVEEgPSA2LAorCVdMQU5fUkVBU09OX0NMQVNTM19GUkFNRV9GUk9NX05PTkFTU09DX1NUQSA9IDcsCisJV0xBTl9SRUFTT05fRElTQVNTT0NfU1RBX0hBU19MRUZUID0gOCwKKwlXTEFOX1JFQVNPTl9TVEFfUkVRX0FTU09DX1dJVEhPVVRfQVVUSCA9IDksCisJLyogODAyLjExaCAqLworCVdMQU5fUkVBU09OX0RJU0FTU09DX0JBRF9QT1dFUiA9IDEwLAorCVdMQU5fUkVBU09OX0RJU0FTU09DX0JBRF9TVVBQX0NIQU4gPSAxMSwKKwkvKiA4MDIuMTFpICovCisJV0xBTl9SRUFTT05fSU5WQUxJRF9JRSA9IDEzLAorCVdMQU5fUkVBU09OX01JQ19GQUlMVVJFID0gMTQsCisJV0xBTl9SRUFTT05fNFdBWV9IQU5EU0hBS0VfVElNRU9VVCA9IDE1LAorCVdMQU5fUkVBU09OX0dST1VQX0tFWV9IQU5EU0hBS0VfVElNRU9VVCA9IDE2LAorCVdMQU5fUkVBU09OX0lFX0RJRkZFUkVOVCA9IDE3LAorCVdMQU5fUkVBU09OX0lOVkFMSURfR1JPVVBfQ0lQSEVSID0gMTgsCisJV0xBTl9SRUFTT05fSU5WQUxJRF9QQUlSV0lTRV9DSVBIRVIgPSAxOSwKKwlXTEFOX1JFQVNPTl9JTlZBTElEX0FLTVAgPSAyMCwKKwlXTEFOX1JFQVNPTl9VTlNVUFBfUlNOX1ZFUlNJT04gPSAyMSwKKwlXTEFOX1JFQVNPTl9JTlZBTElEX1JTTl9JRV9DQVAgPSAyMiwKKwlXTEFOX1JFQVNPTl9JRUVFODAyMVhfRkFJTEVEID0gMjMsCisJV0xBTl9SRUFTT05fQ0lQSEVSX1NVSVRFX1JFSkVDVEVEID0gMjQsCit9OworCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19TSUdOQUwgKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19SU1NJICgxPDwxKQorI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfTk9JU0UgKDE8PDIpCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19SQVRFICgxPDwzKQorI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfV0VNQVNLIDB4NworCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTiAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTiAgICgxPDwxKQorCisjZGVmaW5lIElFRUU4MDIxMV8yNEdIWl9CQU5EICAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExXzUyR0haX0JBTkQgICAgICgxPDwxKQorCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV9MRU4gIAkJNAorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMU1CCQkJMHgwMgorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMk1CCQkJMHgwNAorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfNU1CCQkJMHgwQgorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQgkJCTB4MTYKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV9MRU4gCQk4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1CCQkJMHgwQworI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzlNQgkJCTB4MTIKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xMk1CCQkweDE4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQgkJMHgyNAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUIJCTB4MzAKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8zNk1CCQkweDQ4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQgkJMHg2MAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUIJCTB4NkMKKyNkZWZpbmUgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSwkJMHg4MAorCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xTUJfTUFTSwkJKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8yTUJfTUFTSwkJKDE8PDEpCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV81TUJfTUFTSwkJKDE8PDIpCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1CX01BU0sJCSgxPDwzKQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQl9NQVNLCQkoMTw8NCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV85TUJfTUFTSwkJKDE8PDUpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQl9NQVNLCQkoMTw8NikKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xOE1CX01BU0sJCSgxPDw3KQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSwkJKDE8PDgpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLCQkoMTw8OSkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV80OE1CX01BU0sJCSgxPDwxMCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV81NE1CX01BU0sJCSgxPDwxMSkKKworI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVTX01BU0sJCTB4MDAwMDAwMEYKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19CQVNJQ19SQVRFU19NQVNLCShJRUVFODAyMTFfQ0NLX1JBVEVfMU1CX01BU0sgfCBcCisJSUVFRTgwMjExX0NDS19SQVRFXzJNQl9NQVNLKQorI2RlZmluZSBJRUVFODAyMTFfQ0NLX0RFRkFVTFRfUkFURVNfTUFTSwkoSUVFRTgwMjExX0NDS19CQVNJQ19SQVRFU19NQVNLIHwgXAorCUlFRUU4MDIxMV9DQ0tfUkFURV81TUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQl9NQVNLKQorCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVTX01BU0sJCTB4MDAwMDBGRjAKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fQkFTSUNfUkFURVNfTUFTSwkoSUVFRTgwMjExX09GRE1fUkFURV82TUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSykKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fREVGQVVMVF9SQVRFU19NQVNLCShJRUVFODAyMTFfT0ZETV9CQVNJQ19SQVRFU19NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfOU1CX01BU0sgIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMThNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQl9NQVNLKQorI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9SQVRFU19NQVNLIChJRUVFODAyMTFfT0ZETV9ERUZBVUxUX1JBVEVTX01BU0sgfCBcCisJCQkJSUVFRTgwMjExX0NDS19ERUZBVUxUX1JBVEVTX01BU0spCisKKyNkZWZpbmUgSUVFRTgwMjExX05VTV9PRkRNX1JBVEVTCSAgICA4CisjZGVmaW5lIElFRUU4MDIxMV9OVU1fQ0NLX1JBVEVTCQkgICAgNAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9TSElGVF9NQVNLX0EgICAgICAgICA0CisKKworLyogdGhpcyBpcyBzdG9sZW4gYW5kIG1vZGlmaWVkIGZyb20gdGhlIG1hZHdpZmkgZHJpdmVyKi8KKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9UWVBFX01BU0sJCTB4MGMKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9UWVBFX0RBVEEJCTB4MDgKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX01BU0sJMHhCMAorI2RlZmluZSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TCTB4ODAKKworI2RlZmluZSBJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpIFwKKwkoKChmYykgJiAoSUVFRTgwMjExX0ZDMF9UWVBFX01BU0sgfCBJRUVFODAyMTFfRkMwX1NVQlRZUEVfTUFTSykpID09IFwKKwkgKElFRUU4MDIxMV9GQzBfVFlQRV9EQVRBIHwgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPUykpCisKKy8qIHRoaXMgaXMgc3RvbGVuIGZyb20gaXB3MjIwMCBkcml2ZXIgKi8KKyNkZWZpbmUgSUVFRV9JQlNTX01BQ19IQVNIX1NJWkUgMzEKK3N0cnVjdCBpZWVlX2lic3Nfc2VxIHsKKwl1OCBtYWNbRVRIX0FMRU5dOworCXUxNiBzZXFfbnVtWzE3XTsKKwl1MTYgZnJhZ19udW1bMTddOworCXVuc2lnbmVkIGxvbmcgcGFja2V0X3RpbWVbMTddOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKKy8qIE5PVEU6IFRoaXMgZGF0YSBpcyBmb3Igc3RhdGlzdGljYWwgcHVycG9zZXM7IG5vdCBhbGwgaGFyZHdhcmUgcHJvdmlkZXMgdGhpcworICogICAgICAgaW5mb3JtYXRpb24gZm9yIGZyYW1lcyByZWNlaXZlZC4gIE5vdCBzZXR0aW5nIHRoZXNlIHdpbGwgbm90IGNhdXNlCisgKiAgICAgICBhbnkgYWR2ZXJzZSBhZmZlY3RzLiAqLworc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyB7CisJdTMyIG1hY190aW1lWzJdOworCXM4IHJzc2k7CisJdTggc2lnbmFsOworCXU4IG5vaXNlOworCXUxNiByYXRlOyAvKiBpbiAxMDAga2JwcyAqLworCXU4IHJlY2VpdmVkX2NoYW5uZWw7CisJdTggY29udHJvbDsKKwl1OCBtYXNrOworCXU4IGZyZXE7CisJdTE2IGxlbjsKKwl1NjQgdHNmOworCXUzMiBiZWFjb25fdGltZTsKKwl1OCBuaWNfdHlwZTsKKwl1MTYgICAgICAgTGVuZ3RoOworCS8vICAgICAgdTggICAgICAgIERhdGFSYXRlOyAgICAgIC8vIEluIDAuNSBNYnBzCisJdTggICAgICAgIFNpZ25hbFF1YWxpdHk7IC8vIGluIDAtMTAwIGluZGV4LgorCXMzMiAgICAgICBSZWN2U2lnbmFsUG93ZXI7IC8vIFJlYWwgcG93ZXIgaW4gZEJtIGZvciB0aGlzIHBhY2tldCwgbm8gYmVhdXRpZmljYXRpb24gYW5kIGFnZ3JlZ2F0aW9uLgorCXM4ICAgICAgICBSeFBvd2VyOyAvLyBpbiBkQm0gVHJhbnNsYXRlIGZyb20gUFdkQgorCXU4ICAgICAgICBTaWduYWxTdHJlbmd0aDsgLy8gaW4gMC0xMDAgaW5kZXguCisJdTE2ICAgICAgIGJId0Vycm9yOjE7CisJdTE2ICAgICAgIGJDUkM6MTsKKwl1MTYgICAgICAgYklDVjoxOworCXUxNiAgICAgICBiU2hvcnRQcmVhbWJsZToxOworCXUxNiAgICAgICBBbnRlbm5hOjE7ICAgICAgLy9mb3IgcnRsODE4NQorCXUxNiAgICAgICBEZWNyeXB0ZWQ6MTsgICAgLy9mb3IgcnRsODE4NSwgcnRsODE4NworCXUxNiAgICAgICBXYWtldXA6MTsgICAgICAgLy9mb3IgcnRsODE4NQorCXUxNiAgICAgICBSZXNlcnZlZDA6MTsgICAgLy9mb3IgcnRsODE4NQorCXU4ICAgICAgICBBR0M7CisJdTMyICAgICAgIFRpbWVTdGFtcExvdzsKKwl1MzIgICAgICAgVGltZVN0YW1wSGlnaDsKKwlib29sICAgICAgYlNoaWZ0OworCWJvb2wgICAgICBiSXNRb3NEYXRhOyAgICAgICAgICAgICAvLyBBZGRlZCBieSBBbm5pZSwgMjAwNS0xMi0yMi4KKwl1OCAgICAgICAgVXNlclByaW9yaXR5OworCisJLy8xISEhISEhISEhISEhISEhISEhISEhISEhISEhCisJLy8xQXR0ZW50aW9uIFBsZWFzZSEhITwxMW4gb3IgODE5MCBzcGVjaWZpYyBjb2RlIHNob3VsZCBiZSBwdXQgYmVsb3cgdGhpcyBsaW5lPgorCS8vMSEhISEhISEhISEhISEhISEhISEhISEhISEhIQorCisJdTggICAgICAgIFJ4RHJ2SW5mb1NpemU7CisJdTggICAgICAgIFJ4QnVmU2hpZnQ7CisJYm9vbCAgICAgIGJJc0FNUERVOworCWJvb2wgICAgICBiRmlyc3RNUERVOworCWJvb2wgICAgICBiQ29udGFpbkhUQzsKKwlib29sICAgICAgUnhJczQwTUh6UGFja2V0OworCXUzMiAgICAgICBSeFBXREJBbGw7CisJdTggICAgICAgIFJ4TUlNT1NpZ25hbFN0cmVuZ3RoWzRdOyAgICAgICAgLy8gaW4gMH4xMDAgaW5kZXgKKwlzOCAgICAgICAgUnhNSU1PU2lnbmFsUXVhbGl0eVsyXTsKKwlib29sICAgICAgYlBhY2tldE1hdGNoQlNTSUQ7CisJYm9vbCAgICAgIGJJc0NDSzsKKwlib29sICAgICAgYlBhY2tldFRvU2VsZjsKKwkvL2FkZGVkIGJ5IGFteQorCXU4KiAgICAgICB2aXJ0dWFsX2FkZHJlc3M7CisJdTE2ICAgICAgICAgIHBhY2tldGxlbmd0aDsgICAgICAgICAgICAgIC8vIFRvdGFsIHBhY2tldCBsZW5ndGg6IE11c3QgZXF1YWwgdG8gc3VtIG9mIGFsbCBGcmFnTGVuZ3RoCisJdTE2ICAgICAgICAgIGZyYWdsZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gRnJhZ0xlbmd0aCBzaG91bGQgZXF1YWwgdG8gUGFja2V0TGVuZ3RoIGluIG5vbi1mcmFnbWVudCBjYXNlCisJdTE2ICAgICAgICAgIGZyYWdvZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGF0YSBvZmZzZXQgZm9yIHRoaXMgZnJhZ21lbnQKKwl1MTYgICAgICAgICAgbnRvdGFsZnJhZzsKKwlib29sICAgICAgCSAgYmlzcnhhZ2dyc3ViZnJhbWU7CisJYm9vbAkJICBiUGFja2V0QmVhY29uOwkvL2Nvc2EgYWRkIGZvciByc3NpCisJYm9vbAkJICBiVG9TZWxmQkE7CQkvL2Nvc2EgYWRkIGZvciByc3NpCisJY2hhciAJICBjY2tfYWRjX3B3ZGJbNF07CS8vY29zYSBhZGQgZm9yIHJ4IHBhdGggc2VsZWN0aW9uCisJdTE2CQkgIFNlcV9OdW07CisKK307CisKKy8qIElFRUUgODAyLjExIHJlcXVpcmVzIHRoYXQgU1RBIHN1cHBvcnRzIGNvbmN1cnJlbnQgcmVjZXB0aW9uIG9mIGF0IGxlYXN0CisgKiB0aHJlZSBmcmFnbWVudGVkIGZyYW1lcy4gVGhpcyBkZWZpbmUgY2FuIGJlIGluY3JlYXNlZCB0byBzdXBwb3J0IG1vcmUKKyAqIGNvbmN1cnJlbnQgZnJhbWVzLCBidXQgaXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgZWFjaCBlbnRyeSBjYW4gY29uc3VtZSBhYm91dAorICogMiBrQiBvZiBSQU0gYW5kIGluY3JlYXNpbmcgY2FjaGUgc2l6ZSB3aWxsIHNsb3cgZG93biBmcmFtZSByZWFzc2VtYmx5LiAqLworI2RlZmluZSBJRUVFODAyMTFfRlJBR19DQUNIRV9MRU4gNAorCitzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdfZW50cnkgeworCXVuc2lnbmVkIGxvbmcgZmlyc3RfZnJhZ190aW1lOworCXVuc2lnbmVkIGludCBzZXE7CisJdW5zaWduZWQgaW50IGxhc3RfZnJhZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXU4IHNyY19hZGRyW0VUSF9BTEVOXTsKKwl1OCBkc3RfYWRkcltFVEhfQUxFTl07Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX3N0YXRzIHsKKwl1bnNpZ25lZCBpbnQgdHhfdW5pY2FzdF9mcmFtZXM7CisJdW5zaWduZWQgaW50IHR4X211bHRpY2FzdF9mcmFtZXM7CisJdW5zaWduZWQgaW50IHR4X2ZyYWdtZW50czsKKwl1bnNpZ25lZCBpbnQgdHhfdW5pY2FzdF9vY3RldHM7CisJdW5zaWduZWQgaW50IHR4X211bHRpY2FzdF9vY3RldHM7CisJdW5zaWduZWQgaW50IHR4X2RlZmVycmVkX3RyYW5zbWlzc2lvbnM7CisJdW5zaWduZWQgaW50IHR4X3NpbmdsZV9yZXRyeV9mcmFtZXM7CisJdW5zaWduZWQgaW50IHR4X211bHRpcGxlX3JldHJ5X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfcmV0cnlfbGltaXRfZXhjZWVkZWQ7CisJdW5zaWduZWQgaW50IHR4X2Rpc2NhcmRzOworCXVuc2lnbmVkIGludCByeF91bmljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgcnhfbXVsdGljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgcnhfZnJhZ21lbnRzOworCXVuc2lnbmVkIGludCByeF91bmljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgcnhfbXVsdGljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgcnhfZmNzX2Vycm9yczsKKwl1bnNpZ25lZCBpbnQgcnhfZGlzY2FyZHNfbm9fYnVmZmVyOworCXVuc2lnbmVkIGludCB0eF9kaXNjYXJkc193cm9uZ19zYTsKKwl1bnNpZ25lZCBpbnQgcnhfZGlzY2FyZHNfdW5kZWNyeXB0YWJsZTsKKwl1bnNpZ25lZCBpbnQgcnhfbWVzc2FnZV9pbl9tc2dfZnJhZ21lbnRzOworCXVuc2lnbmVkIGludCByeF9tZXNzYWdlX2luX2JhZF9tc2dfZnJhZ21lbnRzOworfTsKKworc3RydWN0IGllZWU4MDIxMV9kZXZpY2U7CisKKyNpbmNsdWRlICJpZWVlODAyMTFfY3J5cHQuaCIKKworI2RlZmluZSBTRUNfS0VZXzEgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgU0VDX0tFWV8yICAgICAgICAgKDE8PDEpCisjZGVmaW5lIFNFQ19LRVlfMyAgICAgICAgICgxPDwyKQorI2RlZmluZSBTRUNfS0VZXzQgICAgICAgICAoMTw8MykKKyNkZWZpbmUgU0VDX0FDVElWRV9LRVkgICAgKDE8PDQpCisjZGVmaW5lIFNFQ19BVVRIX01PREUgICAgICgxPDw1KQorI2RlZmluZSBTRUNfVU5JQ0FTVF9HUk9VUCAoMTw8NikKKyNkZWZpbmUgU0VDX0xFVkVMICAgICAgICAgKDE8PDcpCisjZGVmaW5lIFNFQ19FTkFCTEVEICAgICAgICgxPDw4KQorI2RlZmluZSBTRUNfRU5DUllQVCAgICAgICAoMTw8OSkKKworI2RlZmluZSBTRUNfTEVWRUxfMCAgICAgIDAgLyogTm9uZSAqLworI2RlZmluZSBTRUNfTEVWRUxfMSAgICAgIDEgLyogV0VQIDQwIGFuZCAxMDQgYml0ICovCisjZGVmaW5lIFNFQ19MRVZFTF8yICAgICAgMiAvKiBMZXZlbCAxICsgVEtJUCAqLworI2RlZmluZSBTRUNfTEVWRUxfMl9DS0lQIDMgLyogTGV2ZWwgMSArIENLSVAgKi8KKyNkZWZpbmUgU0VDX0xFVkVMXzMgICAgICA0IC8qIExldmVsIDIgKyBDQ01QICovCisKKyNkZWZpbmUgU0VDX0FMR19OT05FICAgICAgICAgICAgMAorI2RlZmluZSBTRUNfQUxHX1dFUCAgICAgICAgICAgICAxCisjZGVmaW5lIFNFQ19BTEdfVEtJUCAgICAgICAgICAgIDIKKyNkZWZpbmUgU0VDX0FMR19DQ01QICAgICAgICAgICAgMworCisjZGVmaW5lIFdFUF9LRVlTIAkJNAorI2RlZmluZSBXRVBfS0VZX0xFTgkJMTMKKyNkZWZpbmUgU0NNX0tFWV9MRU4gICAgICAgICAgICAgMzIKKyNkZWZpbmUgU0NNX1RFTVBPUkFMX0tFWV9MRU5HVEggMTYKKworc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSB7CisJdTE2IGFjdGl2ZV9rZXk6MiwKKwkgICAgZW5hYmxlZDoxLAorCSAgICBhdXRoX21vZGU6MiwKKwkgICAgYXV0aF9hbGdvOjQsCisJICAgIHVuaWNhc3RfdXNlc19ncm91cDoxLAorCSAgICBlbmNyeXB0OjE7CisJdTgga2V5X3NpemVzW1dFUF9LRVlTXTsKKwl1OCBrZXlzW1dFUF9LRVlTXVtTQ01fS0VZX0xFTl07CisJdTggbGV2ZWw7CisJdTE2IGZsYWdzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworLyoKKyA4MDIuMTEgZGF0YSBmcmFtZSBmcm9tIEFQCisgICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK0J5dGVzIHwgIDIgICB8ICAyICAgfCAgICA2ICAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgMiAgIHwgMC4uMjMxMiB8ICAgNCAgfAorICAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS18CitEZXNjLiB8IGN0cmwgfCBkdXJhIHwgIERBL1JBICB8ICAgVEEgICAgfCAgICBTQSAgIHwgU2VxdSB8ICBmcmFtZSAgfCAgZmNzIHwKKyAgICAgIHwgICAgICB8IHRpb24gfCAoQlNTSUQpIHwgICAgICAgICB8ICAgICAgICAgfCBlbmNlIHwgIGRhdGEgICB8ICAgICAgfAorICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCitUb3RhbDogMjgtMjM0MCBieXRlcworKi8KKworLyogTWFuYWdlbWVudCBGcmFtZSBJbmZvcm1hdGlvbiBFbGVtZW50IFR5cGVzICovCitlbnVtIGllZWU4MDIxMV9tZmllIHsKKwlNRklFX1RZUEVfU1NJRCA9IDAsCisJTUZJRV9UWVBFX1JBVEVTID0gMSwKKwlNRklFX1RZUEVfRkhfU0VUID0gMiwKKwlNRklFX1RZUEVfRFNfU0VUID0gMywKKwlNRklFX1RZUEVfQ0ZfU0VUID0gNCwKKwlNRklFX1RZUEVfVElNID0gNSwKKwlNRklFX1RZUEVfSUJTU19TRVQgPSA2LAorCU1GSUVfVFlQRV9DT1VOVFJZID0gNywKKwlNRklFX1RZUEVfSE9QX1BBUkFNUyA9IDgsCisJTUZJRV9UWVBFX0hPUF9UQUJMRSA9IDksCisJTUZJRV9UWVBFX1JFUVVFU1QgPSAxMCwKKwlNRklFX1RZUEVfQ0hBTExFTkdFID0gMTYsCisJTUZJRV9UWVBFX1BPV0VSX0NPTlNUUkFJTlQgPSAzMiwKKwlNRklFX1RZUEVfUE9XRVJfQ0FQQUJJTElUWSA9IDMzLAorCU1GSUVfVFlQRV9UUENfUkVRVUVTVCA9IDM0LAorCU1GSUVfVFlQRV9UUENfUkVQT1JUID0gMzUsCisJTUZJRV9UWVBFX1NVUFBfQ0hBTk5FTFMgPSAzNiwKKwlNRklFX1RZUEVfQ1NBID0gMzcsCisJTUZJRV9UWVBFX01FQVNVUkVfUkVRVUVTVCA9IDM4LAorCU1GSUVfVFlQRV9NRUFTVVJFX1JFUE9SVCA9IDM5LAorCU1GSUVfVFlQRV9RVUlFVCA9IDQwLAorCU1GSUVfVFlQRV9JQlNTX0RGUyA9IDQxLAorCU1GSUVfVFlQRV9FUlAgPSA0MiwKKwlNRklFX1RZUEVfUlNOID0gNDgsCisJTUZJRV9UWVBFX1JBVEVTX0VYID0gNTAsCisJTUZJRV9UWVBFX0hUX0NBUD0gNDUsCisJIE1GSUVfVFlQRV9IVF9JTkZPPSA2MSwKKwkgTUZJRV9UWVBFX0FJUk9ORVQ9MTMzLAorCU1GSUVfVFlQRV9HRU5FUklDID0gMjIxLAorCU1GSUVfVFlQRV9RT1NfUEFSQU1FVEVSID0gMjIyLAorfTsKKworLyogTWluaW1hbCBoZWFkZXI7IGNhbiBiZSB1c2VkIGZvciBwYXNzaW5nIDgwMi4xMSBmcmFtZXMgd2l0aCBzdWZmaWNpZW50CisgKiBpbmZvcm1hdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0eXBlIG9mIHVuZGVybHlpbmcgZGF0YSB0eXBlIGlzIGFjdHVhbGx5CisgKiBzdG9yZWQgaW4gdGhlIGRhdGEuICovCitzdHJ1Y3QgaWVlZTgwMjExX2hkciB7CisJX19sZTE2IGZyYW1lX2N0bDsKKwlfX2xlMTYgZHVyYXRpb25faWQ7CisJdTggcGF5bG9hZFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2hkcl8xYWRkciB7CisJX19sZTE2IGZyYW1lX2N0bDsKKwlfX2xlMTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IHBheWxvYWRbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9oZHJfMmFkZHIgeworCV9fbGUxNiBmcmFtZV9jdGw7CisJX19sZTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBhZGRyMltFVEhfQUxFTl07CisJdTggcGF5bG9hZFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciB7CisJX19sZTE2IGZyYW1lX2N0bDsKKwlfX2xlMTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJX19sZTE2IHNlcV9jdGw7CisJdTggcGF5bG9hZFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciB7CisJX19sZTE2IGZyYW1lX2N0bDsKKwlfX2xlMTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJX19sZTE2IHNlcV9jdGw7CisJdTggYWRkcjRbRVRIX0FMRU5dOworCXU4IHBheWxvYWRbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJxb3MgeworCV9fbGUxNiBmcmFtZV9jdGw7CisJX19sZTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBhZGRyMltFVEhfQUxFTl07CisJdTggYWRkcjNbRVRIX0FMRU5dOworCV9fbGUxNiBzZXFfY3RsOworCXU4IHBheWxvYWRbMF07CisJX19sZTE2IHFvc19jdGw7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHJxb3MgeworCV9fbGUxNiBmcmFtZV9jdGw7CisJX19sZTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBhZGRyMltFVEhfQUxFTl07CisJdTggYWRkcjNbRVRIX0FMRU5dOworCV9fbGUxNiBzZXFfY3RsOworCXU4IGFkZHI0W0VUSF9BTEVOXTsKKwl1OCBwYXlsb2FkWzBdOworCV9fbGUxNiBxb3NfY3RsOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IHsKKwl1OCBpZDsKKwl1OCBsZW47CisJdTggZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisJX19sZTE2IGFsZ29yaXRobTsKKwlfX2xlMTYgdHJhbnNhY3Rpb247CisJX19sZTE2IHN0YXR1czsKKwkvKmNoYWxsZW5nZSovCisJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50WzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2MgeworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKKwlfX2xlMTYgcmVhc29uOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCB7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOworCS8qIFNTSUQsIHN1cHBvcnRlZCByYXRlcyAqLworCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisJdTMyIHRpbWVfc3RhbXBbMl07CisJX19sZTE2IGJlYWNvbl9pbnRlcnZhbDsKKwlfX2xlMTYgY2FwYWJpbGl0eTsKKwkvKiBTU0lELCBzdXBwb3J0ZWQgcmF0ZXMsIEZIIHBhcmFtcywgRFMgcGFyYW1zLAorCSAqIENGIHBhcmFtcywgSUJTUyBwYXJhbXMsIFRJTSAoaWYgYmVhY29uKSwgUlNOICovCisJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50WzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIEFsaWFzIGJlYWNvbiBmb3IgcHJvYmVfcmVzcG9uc2UgKi8KKyNkZWZpbmUgaWVlZTgwMjExX2JlYWNvbiBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UKKworc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisJX19sZTE2IGNhcGFiaWxpdHk7CisJX19sZTE2IGxpc3Rlbl9pbnRlcnZhbDsKKwkvKiBTU0lELCBzdXBwb3J0ZWQgcmF0ZXMsIFJTTiAqLworCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX3JlYXNzb2NfcmVxdWVzdF9mcmFtZSB7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOworCV9fbGUxNiBjYXBhYmlsaXR5OworCV9fbGUxNiBsaXN0ZW5faW50ZXJ2YWw7CisJdTggY3VycmVudF9hcFtFVEhfQUxFTl07CisJLyogU1NJRCwgc3VwcG9ydGVkIHJhdGVzLCBSU04gKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnRbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSB7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOworCV9fbGUxNiBjYXBhYmlsaXR5OworCV9fbGUxNiBzdGF0dXM7CisJX19sZTE2IGFpZDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnRbMF07IC8qIHN1cHBvcnRlZCByYXRlcyAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfdHhiIHsKKwl1OCBucl9mcmFnczsKKwl1OCBlbmNyeXB0ZWQ7CisJdTggcXVldWVfaW5kZXg7CisJdTggcnRzX2luY2x1ZGVkOworCXUxNiByZXNlcnZlZDsKKwlfX2xlMTYgZnJhZ19zaXplOworCV9fbGUxNiBwYXlsb2FkX3NpemU7CisJc3RydWN0IHNrX2J1ZmYgKmZyYWdtZW50c1swXTsKK307CisKKyNkZWZpbmUgTUFYX1RYX0FHR19DT1VOVAkJICAxNgorc3RydWN0IGllZWU4MDIxMV9kcnZfYWdnX3R4YiB7CisJdTggbnJfZHJ2X2FnZ19mcmFtZXM7CisJc3RydWN0IHNrX2J1ZmYgKnR4X2FnZ19mcmFtZXNbTUFYX1RYX0FHR19DT1VOVF07Cit9X19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgTUFYX1NVQkZSQU1FX0NPVU5UIAkJICA2NAorc3RydWN0IGllZWU4MDIxMV9yeGIgeworCXU4IG5yX3N1YmZyYW1lczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc3ViZnJhbWVzW01BWF9TVUJGUkFNRV9DT1VOVF07CisJdTggZHN0W0VUSF9BTEVOXTsKKwl1OCBzcmNbRVRIX0FMRU5dOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCit0eXBlZGVmIHVuaW9uIF9mcmFtZXFvcyB7CisJdTE2IHNob3J0ZGF0YTsKKwl1OCAgY2hhcmRhdGFbMl07CisJc3RydWN0IHsKKwkJdTE2IHRpZDo0OworCQl1MTYgZW9zcDoxOworCQl1MTYgYWNrX3BvbGljeToyOworCQl1MTYgcmVzZXJ2ZWQ6MTsKKwkJdTE2IHR4b3A6ODsKKwl9ZmllbGQ7Cit9ZnJhbWVxb3MsKnBmcmFtZXFvczsKKworLyogU1dFRVAgVEFCTEUgRU5UUklFUyBOVU1CRVIqLworI2RlZmluZSBNQVhfU1dFRVBfVEFCX0VOVFJJRVMJCSAgNDIKKyNkZWZpbmUgTUFYX1NXRUVQX1RBQl9FTlRSSUVTX1BFUl9QQUNLRVQgIDcKKy8qIE1BWF9SQVRFU19MRU5HVEggbmVlZHMgdG8gYmUgMTIuICBUaGUgc3BlYyBzYXlzIDgsIGFuZCBtYW55IEFQcworICogb25seSB1c2UgOCwgYW5kIHRoZW4gdXNlIGV4dGVuZGVkIHJhdGVzIGZvciB0aGUgcmVtYWluaW5nIHN1cHBvcnRlZAorICogcmF0ZXMuICBPdGhlciBBUHMsIGhvd2V2ZXIsIHN0aWNrIGFsbCBvZiB0aGVpciBzdXBwb3J0ZWQgcmF0ZXMgb24gdGhlCisgKiBtYWluIHJhdGVzIGluZm9ybWF0aW9uIGVsZW1lbnQuLi4gKi8KKyNkZWZpbmUgTUFYX1JBVEVTX0xFTkdUSCAgICAgICAgICAgICAgICAgICgodTgpMTIpCisjZGVmaW5lIE1BWF9SQVRFU19FWF9MRU5HVEggICAgICAgICAgICAgICAoKHU4KTE2KQorI2RlZmluZSBNQVhfTkVUV09SS19DT1VOVCAgICAgICAgICAgICAgICAgIDEyOAorCisjZGVmaW5lIE1BWF9DSEFOTkVMX05VTUJFUiAgICAgICAgICAgICAgICAgMTYxCisjZGVmaW5lIElFRUU4MDIxMV9TT0ZUTUFDX1NDQU5fVElNRQkgICAxMDAKKy8vKEhaIC8gMikKKyNkZWZpbmUgSUVFRTgwMjExX1NPRlRNQUNfQVNTT0NfUkVUUllfVElNRSAoSFogKiAyKQorCisjZGVmaW5lIENSQ19MRU5HVEggICAgICAgICAgICAgICAgIDRVCisKKyNkZWZpbmUgTUFYX1dQQV9JRV9MRU4gNjQKKworI2RlZmluZSBORVRXT1JLX0VNUFRZX0VTU0lEICgxPDwwKQorI2RlZmluZSBORVRXT1JLX0hBU19PRkRNICAgICgxPDwxKQorI2RlZmluZSBORVRXT1JLX0hBU19DQ0sgICAgICgxPDwyKQorCisvKiBRb1Mgc3RydWN0dXJlICovCisjZGVmaW5lIE5FVFdPUktfSEFTX1FPU19QQVJBTUVURVJTICAgICAgKDE8PDMpCisjZGVmaW5lIE5FVFdPUktfSEFTX1FPU19JTkZPUk1BVElPTiAgICAgKDE8PDQpCisjZGVmaW5lIE5FVFdPUktfSEFTX1FPU19NQVNLICAgICAgICAgICAgKE5FVFdPUktfSEFTX1FPU19QQVJBTUVURVJTIHwgXAorCQkJCQkgTkVUV09SS19IQVNfUU9TX0lORk9STUFUSU9OKQorLyogODAyLjExaCAqLworI2RlZmluZSBORVRXT1JLX0hBU19QT1dFUl9DT05TVFJBSU5UICAgICgxPDw1KQorI2RlZmluZSBORVRXT1JLX0hBU19DU0EgICAgICAgICAgICAgICAgICgxPDw2KQorI2RlZmluZSBORVRXT1JLX0hBU19RVUlFVCAgICAgICAgICAgICAgICgxPDw3KQorI2RlZmluZSBORVRXT1JLX0hBU19JQlNTX0RGUyAgICAgICAgICAgICgxPDw4KQorI2RlZmluZSBORVRXT1JLX0hBU19UUENfUkVQT1JUICAgICAgICAgICgxPDw5KQorCisjZGVmaW5lIE5FVFdPUktfSEFTX0VSUF9WQUxVRSAgICAgICAgICAgKDE8PDEwKQorCisjZGVmaW5lIFFPU19RVUVVRV9OVU0gICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBRT1NfT1VJX0xFTiAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUU9TX09VSV9UWVBFICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFFPU19FTEVNRU5UX0lEICAgICAgICAgICAgICAgICAgMjIxCisjZGVmaW5lIFFPU19PVUlfSU5GT19TVUJfVFlQRSAgICAgICAgICAgMAorI2RlZmluZSBRT1NfT1VJX1BBUkFNX1NVQl9UWVBFICAgICAgICAgIDEKKyNkZWZpbmUgUU9TX1ZFUlNJT05fMSAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFFPU19BSUZTTl9NSU5fVkFMVUUgICAgICAgICAgICAgMgorc3RydWN0IGllZWU4MDIxMV9xb3NfaW5mb3JtYXRpb25fZWxlbWVudCB7CisJdTggZWxlbWVudElEOworCXU4IGxlbmd0aDsKKwl1OCBxdWlbUU9TX09VSV9MRU5dOworCXU4IHF1aV90eXBlOworCXU4IHF1aV9zdWJ0eXBlOworCXU4IHZlcnNpb247CisJdTggYWNfaW5mbzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX3Fvc19hY19wYXJhbWV0ZXIgeworCXU4IGFjaV9haWZzbjsKKwl1OCBlY3dfbWluX21heDsKKwlfX2xlMTYgdHhfb3BfbGltaXQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9xb3NfcGFyYW1ldGVyX2luZm8geworCXN0cnVjdCBpZWVlODAyMTFfcW9zX2luZm9ybWF0aW9uX2VsZW1lbnQgaW5mb19lbGVtZW50OworCXU4IHJlc2VydmVkOworCXN0cnVjdCBpZWVlODAyMTFfcW9zX2FjX3BhcmFtZXRlciBhY19wYXJhbXNfcmVjb3JkW1FPU19RVUVVRV9OVU1dOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcnMgeworCV9fbGUxNiBjd19taW5bUU9TX1FVRVVFX05VTV07CisJX19sZTE2IGN3X21heFtRT1NfUVVFVUVfTlVNXTsKKwl1OCBhaWZzW1FPU19RVUVVRV9OVU1dOworCXU4IGZsYWdbUU9TX1FVRVVFX05VTV07CisJX19sZTE2IHR4X29wX2xpbWl0W1FPU19RVUVVRV9OVU1dOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfcW9zX2RhdGEgeworCXN0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcnMgcGFyYW1ldGVyczsKKwlpbnQgYWN0aXZlOworCWludCBzdXBwb3J0ZWQ7CisJdTggcGFyYW1fY291bnQ7CisJdTggb2xkX3BhcmFtX2NvdW50OworfTsKKworc3RydWN0IGllZWU4MDIxMV90aW1fcGFyYW1ldGVycyB7CisJdTggdGltX2NvdW50OworCXU4IHRpbV9wZXJpb2Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLy8jZWxzZQorc3RydWN0IGllZWU4MDIxMV93bW1fYWNfcGFyYW0geworCXU4IGFjX2FjaV9hY21fYWlmc247CisJdTggYWNfZWN3bWluX2Vjd21heDsKKwl1MTYgYWNfdHhvcF9saW1pdDsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfd21tX3RzX2luZm8geworCXU4IGFjX2Rpcl90aWQ7CisJdTggYWNfdXBfcHNiOworCXU4IHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfd21tX3RzcGVjX2VsZW0geworCXN0cnVjdCBpZWVlODAyMTFfd21tX3RzX2luZm8gdHNfaW5mbzsKKwl1MTYgbm9ybV9tc2R1X3NpemU7CisJdTE2IG1heF9tc2R1X3NpemU7CisJdTMyIG1pbl9zZXJ2X2ludGVyOworCXUzMiBtYXhfc2Vydl9pbnRlcjsKKwl1MzIgaW5hY3RfaW50ZXI7CisJdTMyIHN1c3Blbl9pbnRlcjsKKwl1MzIgc2Vydl9zdGFydF90aW1lOworCXUzMiBtaW5fZGF0YV9yYXRlOworCXUzMiBtZWFuX2RhdGFfcmF0ZTsKKwl1MzIgcGVha19kYXRhX3JhdGU7CisJdTMyIG1heF9idXJzdF9zaXplOworCXUzMiBkZWxheV9ib3VuZDsKKwl1MzIgbWluX3BoeV9yYXRlOworCXUxNiBzdXJwX2JhbmRfYWxsb3c7CisJdTE2IG1lZGl1bV90aW1lOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworZW51bSBlYXBfdHlwZSB7CisJRUFQX1BBQ0tFVCA9IDAsCisJRUFQT0xfU1RBUlQsCisJRUFQT0xfTE9HT0ZGLAorCUVBUE9MX0tFWSwKKwlFQVBPTF9FTkNBUF9BU0ZfQUxFUlQKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICplYXBfdHlwZXNbXSA9IHsKKwlbRUFQX1BBQ0tFVF0JCT0gIkVBUC1QYWNrZXQiLAorCVtFQVBPTF9TVEFSVF0JCT0gIkVBUE9MLVN0YXJ0IiwKKwlbRUFQT0xfTE9HT0ZGXQkJPSAiRUFQT0wtTG9nb2ZmIiwKKwlbRUFQT0xfS0VZXQkJPSAiRUFQT0wtS2V5IiwKKwlbRUFQT0xfRU5DQVBfQVNGX0FMRVJUXQk9ICJFQVBPTC1FbmNhcC1BU0YtQWxlcnQiCit9OworCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmVhcF9nZXRfdHlwZShpbnQgdHlwZSkKK3sKKwlyZXR1cm4gKCh1MzIpdHlwZSA+PSBBUlJBWV9TSVpFKGVhcF90eXBlcykpID8gIlVua25vd24iIDogZWFwX3R5cGVzW3R5cGVdOworfQorLy9hZGRlZCBieSBhbXkgZm9yIHJlb3JkZXIKK3N0YXRpYyBpbmxpbmUgdTggRnJhbWVfUW9TVElEKHU4KiBidWYpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmhkcjsKKwl1MTYgZmM7CisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopYnVmOworCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCXJldHVybiAodTgpKChmcmFtZXFvcyopKGJ1ZiArICgoKGZjICYgSUVFRTgwMjExX0ZDVExfVE9EUykmJihmYyAmIElFRUU4MDIxMV9GQ1RMX0ZST01EUykpPyAzMCA6IDI0KSkpLT5maWVsZC50aWQ7Cit9CisKKy8vYWRkZWQgYnkgYW15IGZvciByZW9yZGVyCisKK3N0cnVjdCBlYXBvbCB7CisJdTggc25hcFs2XTsKKwl1MTYgZXRoZXJ0eXBlOworCXU4IHZlcnNpb247CisJdTggdHlwZTsKKwl1MTYgbGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfc29mdG1hY19zdGF0c3sKKwl1bnNpZ25lZCBpbnQgcnhfYXNzX29rOworCXVuc2lnbmVkIGludCByeF9hc3NfZXJyOworCXVuc2lnbmVkIGludCByeF9wcm9iZV9ycTsKKwl1bnNpZ25lZCBpbnQgdHhfcHJvYmVfcnM7CisJdW5zaWduZWQgaW50IHR4X2JlYWNvbnM7CisJdW5zaWduZWQgaW50IHJ4X2F1dGhfcnE7CisJdW5zaWduZWQgaW50IHJ4X2F1dGhfcnNfb2s7CisJdW5zaWduZWQgaW50IHJ4X2F1dGhfcnNfZXJyOworCXVuc2lnbmVkIGludCB0eF9hdXRoX3JxOworCXVuc2lnbmVkIGludCBub19hdXRoX3JzOworCXVuc2lnbmVkIGludCBub19hc3NfcnM7CisJdW5zaWduZWQgaW50IHR4X2Fzc19ycTsKKwl1bnNpZ25lZCBpbnQgcnhfYXNzX3JxOworCXVuc2lnbmVkIGludCB0eF9wcm9iZV9ycTsKKwl1bnNpZ25lZCBpbnQgcmVhc3NvYzsKKwl1bnNpZ25lZCBpbnQgc3d0eHN0b3A7CisJdW5zaWduZWQgaW50IHN3dHhhd2FrZTsKKwl1bnNpZ25lZCBjaGFyIEN1cnJlbnRTaG93VHhhdGU7CisJdW5zaWduZWQgY2hhciBsYXN0X3BhY2tldF9yYXRlOworCXVuc2lnbmVkIGludCB0eHJldHJ5Y291bnQ7Cit9OworCisjZGVmaW5lIEJFQUNPTl9QUk9CRV9TU0lEX0lEX1BPU0lUSU9OIDEyCisKK3N0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50X2hkciB7CisJdTggaWQ7CisJdTggbGVuOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGRhdGEgdHlwZXMgdGhhdCBjYW4gbWFrZSB1cCBtYW5hZ2VtZW50IHBhY2tldHMKKyAqCisJdTE2IGF1dGhfYWxnb3JpdGhtOworCXUxNiBhdXRoX3NlcXVlbmNlOworCXUxNiBiZWFjb25faW50ZXJ2YWw7CisJdTE2IGNhcGFiaWxpdHk7CisJdTggY3VycmVudF9hcFtFVEhfQUxFTl07CisJdTE2IGxpc3Rlbl9pbnRlcnZhbDsKKwlzdHJ1Y3QgeworCQl1MTYgYXNzb2NpYXRpb25faWQ6MTQsIHJlc2VydmVkOjI7CisJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisJdTMyIHRpbWVfc3RhbXBbMl07CisJdTE2IHJlYXNvbjsKKwl1MTYgc3RhdHVzOworKi8KKworI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9UWF9FU1NJRCAiUGVuZ3VpbiIKKyNkZWZpbmUgSUVFRTgwMjExX0RFRkFVTFRfQkFTSUNfUkFURSAyIC8vMU1icHMKKworZW51bSB7V01NX2FsbF9mcmFtZSwgV01NX3R3b19mcmFtZSwgV01NX2ZvdXJfZnJhbWUsIFdNTV9zaXhfZnJhbWV9OworI2RlZmluZSBNQVhfU1BfTGVuICAoV01NX2FsbF9mcmFtZSA8PCA0KQorI2RlZmluZSBJRUVFODAyMTFfUU9TX1RJRCAweDBmCisjZGVmaW5lIFFPU19DVExfTk9UQ09OVEFJTl9BQ0sgKDB4MDEgPDwgNSkKKworI2RlZmluZSBJRUVFODAyMTFfRFRJTV9NQkNBU1QgNAorI2RlZmluZSBJRUVFODAyMTFfRFRJTV9VQ0FTVCAyCisjZGVmaW5lIElFRUU4MDIxMV9EVElNX1ZBTElEIDEKKyNkZWZpbmUgSUVFRTgwMjExX0RUSU1fSU5WQUxJRCAwCisKKyNkZWZpbmUgSUVFRTgwMjExX1BTX0RJU0FCTEVEIDAKKyNkZWZpbmUgSUVFRTgwMjExX1BTX1VOSUNBU1QgSUVFRTgwMjExX0RUSU1fVUNBU1QKKyNkZWZpbmUgSUVFRTgwMjExX1BTX01CQ0FTVCBJRUVFODAyMTFfRFRJTV9NQkNBU1QKKworLy9hZGRlZCBieSBEYXZpZCBmb3IgUW9TIDIwMDYvNi8zMAorLy8jZGVmaW5lIFdNTV9IYW5nXzgxODcKKyNpZmRlZiBXTU1fSGFuZ184MTg3CisjdW5kZWYgV01NX0hhbmdfODE4NworI2VuZGlmCisKKyNkZWZpbmUgV01FX0FDX0JLICAgMHgwMAorI2RlZmluZSBXTUVfQUNfQkUgICAweDAxCisjZGVmaW5lIFdNRV9BQ19WSSAgIDB4MDIKKyNkZWZpbmUgV01FX0FDX1ZPICAgMHgwMworI2RlZmluZSBXTUVfQUNJX01BU0sgMHgwMworI2RlZmluZSBXTUVfQUlGU05fTUFTSyAweDAzCisjZGVmaW5lIFdNRV9BQ19QUkFNX0xFTiAxNgorCisjZGVmaW5lIE1BWF9SRUNFSVZFX0JVRkZFUl9TSVpFIDkxMDAKKworLy9VUCBNYXBwaW5nIHRvIEFDLCB1c2luZyBpbiBNZ250UXVlcnlfU2VxdWVuY2VOdW1iZXIoKSBhbmQgbWF5YmUgZm9yIERTQ1AKKy8vI2RlZmluZSBVUDJBQyh1cCkJKCh1cDwzKSA/ICgodXA9PTApPzE6MCkgOiAodXA+PjEpKQorI2RlZmluZSBVUDJBQyh1cCkgKAkJICAgXAorCSgodXApIDwgMSkgPyBXTUVfQUNfQkUgOiBcCisJKCh1cCkgPCAzKSA/IFdNRV9BQ19CSyA6IFwKKwkoKHVwKSA8IDQpID8gV01FX0FDX0JFIDogXAorCSgodXApIDwgNikgPyBXTUVfQUNfVkkgOiBcCisJV01FX0FDX1ZPKQorLy9BQyBNYXBwaW5nIHRvIFVQLCB1c2luZyBpbiBUeCBwYXJ0IGZvciBzZWxlY3RpbmcgdGhlIGNvcnJlc3BvbmRpbmcgVFggcXVldWUKKyNkZWZpbmUgQUMyVVAoX2FjKQkoICAgICAgIFwKKwkoKF9hYykgPT0gV01FX0FDX1ZPKSA/IDYgOiBcCisJKChfYWMpID09IFdNRV9BQ19WSSkgPyA1IDogXAorCSgoX2FjKSA9PSBXTUVfQUNfQkspID8gMSA6IFwKKwkwKQorCisjZGVmaW5lCUVUSEVSX0FERFJfTEVOCQk2CS8qIGxlbmd0aCBvZiBhbiBFdGhlcm5ldCBhZGRyZXNzICovCisjZGVmaW5lIEVUSEVSTkVUX0hFQURFUl9TSVpFICAgIDE0ICAgICAgLyogbGVuZ3RoIG9mIHR3byBFdGhlcm5ldCBhZGRyZXNzIHBsdXMgZXRoZXIgdHlwZSovCisKK3N0cnVjdAlldGhlcl9oZWFkZXIgeworCXU4IGV0aGVyX2Rob3N0W0VUSEVSX0FERFJfTEVOXTsKKwl1OCBldGhlcl9zaG9zdFtFVEhFUl9BRERSX0xFTl07CisJdTE2IGV0aGVyX3R5cGU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjaWZuZGVmIEVUSEVSVFlQRV9QQUUKKyNkZWZpbmUJRVRIRVJUWVBFX1BBRQkweDg4OGUJCS8qIEVBUE9MIFBBRS84MDIuMXggKi8KKyNlbmRpZgorI2lmbmRlZiBFVEhFUlRZUEVfSVAKKyNkZWZpbmUJRVRIRVJUWVBFX0lQCTB4MDgwMAkJLyogSVAgcHJvdG9jb2wgKi8KKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBfYnNzX2h0eworCisJYm9vbAkJCQlzdXBwb3J0X2h0OworCisJLy8gSFQgcmVsYXRlZCBlbGVtZW50cworCXU4CQkJCQlodF9jYXBfYnVmWzMyXTsKKwl1MTYJCQkJCWh0X2NhcF9sZW47CisJdTgJCQkJCWh0X2luZm9fYnVmWzMyXTsKKwl1MTYJCQkJCWh0X2luZm9fbGVuOworCisJSFRfU1BFQ19WRVIJCQlodF9zcGVjX3ZlcjsKKwkvL0hUX0NBUEFCSUxJVFlfRUxFCQkJYmRIVENhcEVsZTsKKwkvL0hUX0lORk9STUFUSU9OX0VMRQkJYmRIVEluZm9FbGU7CisKKwlib29sCQkJCWFnZ3JlZ2F0aW9uOworCWJvb2wJCQkJbG9uZ19zbG90X3RpbWU7Cit9YnNzX2h0LCAqcGJzc19odDsKKwordHlwZWRlZiBlbnVtIF9lcnBfdHsKKwlFUlBfTm9uRVJQcHJlc2VudAk9IDB4MDEsCisJRVJQX1VzZVByb3RlY3Rpb24JPSAweDAyLAorCUVSUF9CYXJrZXJQcmVhbWJsZU1vZGUgPSAweDA0LAorfSBlcnBfdDsKKworCitzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgeworCS8qIFRoZXNlIGVudHJpZXMgYXJlIHVzZWQgdG8gaWRlbnRpZnkgYSB1bmlxdWUgbmV0d29yayAqLworCXU4IGJzc2lkW0VUSF9BTEVOXTsKKwl1OCBjaGFubmVsOworCS8qIEVuc3VyZSBudWxsLXRlcm1pbmF0ZWQgZm9yIGFueSBkZWJ1ZyBtc2dzICovCisJdTggc3NpZFtJV19FU1NJRF9NQVhfU0laRSArIDFdOworCXU4IHNzaWRfbGVuOworCXN0cnVjdCBpZWVlODAyMTFfcW9zX2RhdGEgcW9zX2RhdGE7CisKKwkvL2FkZGVkIGJ5IGFteSBmb3IgTEVBUAorCWJvb2wJYldpdGhBaXJvbmV0SUU7CisJYm9vbAliQ2tpcFN1cHBvcnRlZDsKKwlib29sCWJDY3hSbUVuYWJsZTsKKwl1MTYgCUNjeFJtU3RhdGVbMl07CisJLy8gQ0NYdjQgUzU5LCBNQlNTSUQuCisJYm9vbAliTUJzc2lkVmFsaWQ7CisJdTgJTUJzc2lkTWFzazsKKwl1OAlNQnNzaWRbNl07CisJLy8gQ0NYIDIgUzM4LCBXTEFOIERldmljZSBWZXJzaW9uIE51bWJlciBlbGVtZW50LiBBbm5pZSwgMjAwNi0wOC0yMC4KKwlib29sCWJXaXRoQ2N4VmVyTnVtOworCXU4CUJzc0NjeFZlck51bWJlcjsKKwkvKiBUaGVzZSBhcmUgbmV0d29yayBzdGF0aXN0aWNzICovCisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyBzdGF0czsKKwl1MTYgY2FwYWJpbGl0eTsKKwl1OCAgcmF0ZXNbTUFYX1JBVEVTX0xFTkdUSF07CisJdTggIHJhdGVzX2xlbjsKKwl1OCAgcmF0ZXNfZXhbTUFYX1JBVEVTX0VYX0xFTkdUSF07CisJdTggIHJhdGVzX2V4X2xlbjsKKwl1bnNpZ25lZCBsb25nIGxhc3Rfc2Nhbm5lZDsKKwl1OCAgbW9kZTsKKwl1MzIgZmxhZ3M7CisJdTMyIGxhc3RfYXNzb2NpYXRlOworCXUzMiB0aW1lX3N0YW1wWzJdOworCXUxNiBiZWFjb25faW50ZXJ2YWw7CisJdTE2IGxpc3Rlbl9pbnRlcnZhbDsKKwl1MTYgYXRpbV93aW5kb3c7CisJdTggIGVycF92YWx1ZTsKKwl1OCAgd3BhX2llW01BWF9XUEFfSUVfTEVOXTsKKwlzaXplX3Qgd3BhX2llX2xlbjsKKwl1OCAgcnNuX2llW01BWF9XUEFfSUVfTEVOXTsKKwlzaXplX3QgcnNuX2llX2xlbjsKKworCXN0cnVjdCBpZWVlODAyMTFfdGltX3BhcmFtZXRlcnMgdGltOworCXU4ICBkdGltX3BlcmlvZDsKKwl1OCAgZHRpbV9kYXRhOworCXUzMiBsYXN0X2R0aW1fc3RhX3RpbWVbMl07CisKKwkvL2FwcGVkZWQgZm9yIFFvUworCXU4IHdtbV9pbmZvOworCXN0cnVjdCBpZWVlODAyMTFfd21tX2FjX3BhcmFtIHdtbV9wYXJhbVs0XTsKKwl1OCBRb1NfRW5hYmxlOworI2lmZGVmIFRIT01BU19UVVJCTworCXU4IFR1cmJvX0VuYWJsZTsvL2VuYWJsZSB0dXJibyBtb2RlLCBhZGRlZCBieSB0aG9tYXMKKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwl1MTYgQ291bnRyeUllTGVuOworCXU4IENvdW50cnlJZUJ1ZltNQVhfSUVfTEVOXTsKKyNlbmRpZgorCS8vIEhUIFJlbGF0ZWQsIGJ5IGFteSwgMjAwOC4wNC4yOQorCUJTU19IVAlic3NodDsKKwkvLyBBZGQgdG8gaGFuZGxlIGJyb2FkY29tIEFQIG1hbmFnZW1lbnQgZnJhbWUgQ0NLIHJhdGUuCisJYm9vbCBicm9hZGNvbV9jYXBfZXhpc3Q7CisJYm9vbCByYWxpbmtfY2FwX2V4aXN0OworCWJvb2wgYXRoZXJvc19jYXBfZXhpc3Q7CisJYm9vbCBjaXNjb19jYXBfZXhpc3Q7CisJYm9vbCB1bmtub3duX2NhcF9leGlzdDsKKy8vCXU4CWJlcnBfaW5mbzsKKwlib29sCWJlcnBfaW5mb192YWxpZDsKKwlib29sIGJ1c2Vwcm90ZWN0aW9uOworCS8vcHV0IGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZS4KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitlbnVtIGllZWU4MDIxMV9zdGF0ZSB7CisKKwkvKiB0aGUgY2FyZCBpcyBub3QgbGlua2VkIGF0IGFsbCAqLworCUlFRUU4MDIxMV9OT0xJTksgPSAwLAorCisJLyogSUVFRTgwMjExX0FTU09DSUFUSU5HKiBhcmUgZm9yIEJTUyBjbGllbnQgbW9kZQorCSAqIHRoZSBkcml2ZXIgc2hhbGwgbm90IHBlcmZvcm0gUlggZmlsdGVyaW5nIHVubGVzcworCSAqIHRoZSBzdGF0ZSBpcyBMSU5LRUQuCisJICogVGhlIGRyaXZlciBzaGFsbCBqdXN0IGNoZWNrIGZvciB0aGUgc3RhdGUgTElOS0VEIGFuZAorCSAqIGRlZmF1bHRzIHRvIE5PTElOSyBmb3IgQUxMIHRoZSBvdGhlciBzdGF0ZXMgKGluY2x1ZGluZworCSAqIExJTktFRF9TQ0FOTklORykKKwkgKi8KKworCS8qIHRoZSBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgd2lsbCBzdGFydCAod3Egc2NoZWR1bGluZykqLworCUlFRUU4MDIxMV9BU1NPQ0lBVElORywKKwlJRUVFODAyMTFfQVNTT0NJQVRJTkdfUkVUUlksCisKKwkvKiB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlIGlzIHNlbmRpbmcgQVVUSCByZXF1ZXN0Ki8KKwlJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRJTkcsCisKKwkvKiB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlIGhhcyBzdWNjZXNzZnVsbHkgYXV0aGVudGNhdGVkCisJICogYW5kIGlzIHNlbmRpbmcgYXNzb2NpYXRpb24gcmVxdWVzdAorCSAqLworCUlFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVEVELAorCisJLyogdGhlIGxpbmsgaXMgb2suIHRoZSBjYXJkIGFzc29jaWF0ZWQgdG8gYSBCU1Mgb3IgbGlua2VkCisJICogdG8gYSBpYnNzIGNlbGwgb3IgYWN0aW5nIGFzIGFuIEFQIGFuZCBjcmVhdGluZyB0aGUgYnNzCisJICovCisJSUVFRTgwMjExX0xJTktFRCwKKworCS8qIHNhbWUgYXMgTElOS0VELCBidXQgdGhlIGRyaXZlciBzaGFsbCBhcHBseSBSWCBmaWx0ZXIKKwkgKiBydWxlcyBhcyB3ZSBhcmUgaW4gTk9fTElOSyBtb2RlLiBBcyB0aGUgY2FyZCBpcyBzdGlsbAorCSAqIGxvZ2ljYWxseSBsaW5rZWQsIGJ1dCBpdCBpcyBkb2luZyBhIHN5bmNybyBzaXRlIHN1cnZleQorCSAqIHRoZW4gaXQgd2lsbCBiZSBiYWNrIHRvIExJTktFRCBzdGF0ZS4KKwkgKi8KKwlJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HLAorCit9OworCisjZGVmaW5lIERFRkFVTFRfTUFYX1NDQU5fQUdFICgxNSAqIEhaKQorI2RlZmluZSBERUZBVUxUX0ZUUyAyMzQ2CisKKyNkZWZpbmUgQ0ZHX0lFRUU4MDIxMV9SRVNFUlZFX0ZDUyAoMTw8MCkKKyNkZWZpbmUgQ0ZHX0lFRUU4MDIxMV9DT01QVVRFX0ZDUyAoMTw8MSkKKyNkZWZpbmUgQ0ZHX0lFRUU4MDIxMV9SVFMgKDE8PDIpCisKKyNkZWZpbmUgSUVFRTgwMjExXzI0R0haX01JTl9DSEFOTkVMIDEKKyNkZWZpbmUgSUVFRTgwMjExXzI0R0haX01BWF9DSEFOTkVMIDE0CisjZGVmaW5lIElFRUU4MDIxMV8yNEdIWl9DSEFOTkVMUyAoSUVFRTgwMjExXzI0R0haX01BWF9DSEFOTkVMIC0gXAorCQkJCSAgSUVFRTgwMjExXzI0R0haX01JTl9DSEFOTkVMICsgMSkKKworI2RlZmluZSBJRUVFODAyMTFfNTJHSFpfTUlOX0NIQU5ORUwgMzQKKyNkZWZpbmUgSUVFRTgwMjExXzUyR0haX01BWF9DSEFOTkVMIDE2NQorI2RlZmluZSBJRUVFODAyMTFfNTJHSFpfQ0hBTk5FTFMgKElFRUU4MDIxMV81MkdIWl9NQVhfQ0hBTk5FTCAtIFwKKwkJCQkgIElFRUU4MDIxMV81MkdIWl9NSU5fQ0hBTk5FTCArIDEpCisKKworCit0eXBlZGVmIHN0cnVjdCB0eF9wZW5kaW5nX3R7CisJaW50IGZyYWc7CisJc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YjsKK310eF9wZW5kaW5nX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9iYW5kd2lkdGhfYXV0b3N3aXRjaAoreworCWxvbmcgdGhyZXNob2xkXzIwTWh6dG80ME1oejsKKwlsb25nCXRocmVzaG9sZF80ME1oenRvMjBNaHo7CisJYm9vbCBiZm9yY2VkX3R4MjBNaHo7CisJYm9vbCBiYXV0b3N3aXRjaF9lbmFibGU7Cit9YmFuZHdpZHRoX2F1dG9zd2l0Y2gsKnBiYW5kd2lkdGhfYXV0b3N3aXRjaDsKKworCisvL2FkZGVkIGJ5IGFteSBmb3Igb3JkZXIKKworI2RlZmluZSBSRU9SREVSX1dJTl9TSVpFCTEyOAorI2RlZmluZSBSRU9SREVSX0VOVFJZX05VTQkxMjgKK3R5cGVkZWYgc3RydWN0IF9SWF9SRU9SREVSX0VOVFJZCit7CisJc3RydWN0IGxpc3RfaGVhZAlMaXN0OworCXUxNgkJCVNlcU51bTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4YiogcHJ4YjsKK30gUlhfUkVPUkRFUl9FTlRSWSwgKlBSWF9SRU9SREVSX0VOVFJZOworLy9hZGRlZCBieSBhbXkgZm9yIG9yZGVyCit0eXBlZGVmIGVudW0gX0ZzeW5jX1N0YXRleworCURlZmF1bHRfRnN5bmMsCisJSFdfRnN5bmMsCisJU1dfRnN5bmMKK31Gc3luY19TdGF0ZTsKKworLy8gUG93ZXIgc2F2ZSBtb2RlIGNvbmZpZ3VyZWQuCit0eXBlZGVmCWVudW0gX1JUX1BTX01PREUKK3sKKwllQWN0aXZlLAkvLyBBY3RpdmUvQ29udGludW91cyBhY2Nlc3MuCisJZU1heFBzLAkJLy8gTWF4IHBvd2VyIHNhdmUgbW9kZS4KKwllRmFzdFBzCQkvLyBGYXN0IHBvd2VyIHNhdmUgbW9kZS4KK31SVF9QU19NT0RFOworCit0eXBlZGVmIGVudW0gX0lQU19DQUxMQkFDS19GVU5DSU9OCit7CisJSVBTX0NBTExCQUNLX05PTkUgPSAwLAorCUlQU19DQUxMQkFDS19NR05UX0xJTktfUkVRVUVTVCA9IDEsCisJSVBTX0NBTExCQUNLX0pPSU5fUkVRVUVTVCA9IDIsCit9SVBTX0NBTExCQUNLX0ZVTkNJT047CisKK3R5cGVkZWYgZW51bSBfUlRfSk9JTl9BQ1RJT057CisJUlRfSk9JTl9JTkZSQSAgID0gMSwKKwlSVF9KT0lOX0lCU1MgID0gMiwKKwlSVF9TVEFSVF9JQlNTID0gMywKKwlSVF9OT19BQ1RJT04gID0gNCwKK31SVF9KT0lOX0FDVElPTjsKKwordHlwZWRlZiBzdHJ1Y3QgX0lic3NQYXJtc3sKKwl1MTYgICBhdGltV2luOworfUlic3NQYXJtcywgKlBJYnNzUGFybXM7CisjZGVmaW5lIE1BWF9OVU1fUkFURVMJMjY0IC8vIE1heCBudW0gb2Ygc3VwcG9ydCByYXRlcyBlbGVtZW50OiA4LCAgTWF4IG51bSBvZiBleHQuIHN1cHBvcnQgcmF0ZTogMjU1LiAwNjExMjIsIGJ5IHJjbmprby4KKworLy8gUkYgc3RhdGUuCit0eXBlZGVmCWVudW0gX1JUX1JGX1BPV0VSX1NUQVRFCit7CisJZVJmT24sCisJZVJmU2xlZXAsCisJZVJmT2ZmCit9UlRfUkZfUE9XRVJfU1RBVEU7CisKK3R5cGVkZWYgc3RydWN0IF9SVF9QT1dFUl9TQVZFX0NPTlRST0wKK3sKKworCS8vCisJLy8gSW5hY3RpdmUgUG93ZXIgU2F2ZShJUFMpIDogRGlzYWJsZSBSRiB3aGVuIGRpc2Nvbm5lY3RlZAorCS8vCisJYm9vbAkJCQliSW5hY3RpdmVQczsKKwlib29sCQkJCWJJUFNNb2RlQmFja3VwOworCWJvb2wJCQkJYlN3UmZQcm9jZXNzaW5nOworCVJUX1JGX1BPV0VSX1NUQVRFCWVJbmFjdGl2ZVBvd2VyU3RhdGU7CisJc3RydWN0IHdvcmtfc3RydWN0IAlJbmFjdGl2ZVBzV29ya0l0ZW07CisJc3RydWN0IHRpbWVyX2xpc3QJSW5hY3RpdmVQc1RpbWVyOworCisJLy8gUmV0dXJuIHBvaW50IGZvciBqb2luIGFjdGlvbgorCUlQU19DQUxMQkFDS19GVU5DSU9OCVJldHVyblBvaW50OworCisJLy8gUmVjb3JlZCBQYXJhbWV0ZXJzIGZvciByZXNjaGVkdWxlZCBKb2luUmVxdWVzdAorCWJvb2wJCQkJYlRtcEJzc0Rlc2M7CisJUlRfSk9JTl9BQ1RJT04JCXRtcEpvaW5BY3Rpb247CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIHRtcEJzc0Rlc2M7CisKKwkvLyBSZWNvcmVkIFBhcmFtZXRlcnMgZm9yIHJlc2NoZWR1bGVkIE1nbnRMaW5rUmVxdWVzdAorCWJvb2wJCQkJYlRtcFNjYW5Pbmx5OworCWJvb2wJCQkJYlRtcEFjdGl2ZVNjYW47CisJYm9vbAkJCQliVG1wRmlsdGVySGlkZGVuQVA7CisJYm9vbAkJCQliVG1wVXBkYXRlUGFybXM7CisJdTgJCQkJCXRtcFNzaWRCdWZbMzNdOworCU9DVEVUX1NUUklORwkJCXRtcFNzaWQyU2NhbjsKKwlib29sCQkJCWJUbXBTc2lkMlNjYW47CisJdTgJCQkJCXRtcE5ldHdvcmtUeXBlOworCXU4CQkJCQl0bXBDaGFubmVsTnVtYmVyOworCXUxNgkJCQkJdG1wQmNuUGVyaW9kOworCXU4CQkJCQl0bXBEdGltUGVyaW9kOworCXUxNgkJCQkJdG1wbUNhcDsKKwlPQ1RFVF9TVFJJTkcJCQl0bXBTdXBwUmF0ZVNldDsKKwl1OAkJCQkJdG1wU3VwcFJhdGVCdWZbTUFYX05VTV9SQVRFU107CisJYm9vbAkJCQliVG1wU3VwcFJhdGU7CisJSWJzc1Bhcm1zCQkJCXRtcElicG07CisJYm9vbAkJCQliVG1wSWJwbTsKKworCS8vCisJLy8gTGVpc3JlIFBvc3dlciBTYXZlIDogRGlzYWJsZSBSRiBpZiBjb25uZWN0ZWQgYnV0IHRyYWZmaWMgaXMgbm90IGJ1c3kKKwkvLworCWJvb2wJCQkJYkxlaXN1cmVQczsKKworfVJUX1BPV0VSX1NBVkVfQ09OVFJPTCwqUFJUX1BPV0VSX1NBVkVfQ09OVFJPTDsKKwordHlwZWRlZiB1MzIgUlRfUkZfQ0hBTkdFX1NPVVJDRTsKKyNkZWZpbmUgUkZfQ0hBTkdFX0JZX1NXIEJJVDMxCisjZGVmaW5lIFJGX0NIQU5HRV9CWV9IVyBCSVQzMAorI2RlZmluZSBSRl9DSEFOR0VfQllfUFMgQklUMjkKKyNkZWZpbmUgUkZfQ0hBTkdFX0JZX0lQUyBCSVQyOAorI2RlZmluZSBSRl9DSEFOR0VfQllfSU5JVAkwCS8vIERvIG5vdCBjaGFuZ2UgdGhlIFJGT2ZmIHJlYXNvbi4gRGVmaW5lZCBieSBCcnVjZSwgMjAwOC0wMS0xNy4KKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKK3R5cGVkZWYgZW51bQoreworCUNPVU5UUllfQ09ERV9GQ0MgPSAwLAorCUNPVU5UUllfQ09ERV9JQyA9IDEsCisJQ09VTlRSWV9DT0RFX0VUU0kgPSAyLAorCUNPVU5UUllfQ09ERV9TUEFJTiA9IDMsCisJQ09VTlRSWV9DT0RFX0ZSQU5DRSA9IDQsCisJQ09VTlRSWV9DT0RFX01LSyA9IDUsCisJQ09VTlRSWV9DT0RFX01LSzEgPSA2LAorCUNPVU5UUllfQ09ERV9JU1JBRUwgPSA3LAorCUNPVU5UUllfQ09ERV9URUxFQywKKwlDT1VOVFJZX0NPREVfTUlDLAorCUNPVU5UUllfQ09ERV9HTE9CQUxfRE9NQUlOCit9Y291bnRyeV9jb2RlX3R5cGVfdDsKKyNlbmRpZgorCisjZGVmaW5lIFJUX01BWF9MRF9TTE9UX05VTQkxMAordHlwZWRlZiBzdHJ1Y3QgX1JUX0xJTktfREVURUNUX1R7CisKKwl1MzIJCQkJTnVtUmVjdkJjbkluUGVyaW9kOworCXUzMgkJCQlOdW1SZWN2RGF0YUluUGVyaW9kOworCisJdTMyCQkJCVJ4QmNuTnVtW1JUX01BWF9MRF9TTE9UX05VTV07CS8vIG51bWJlciBvZiBSeCBiZWFjb24gLyBDaGVja0ZvckhhbmdfcGVyaW9kICB0byBkZXRlcm1pbmUgbGluayBzdGF0dXMKKwl1MzIJCQkJUnhEYXRhTnVtW1JUX01BWF9MRF9TTE9UX05VTV07CS8vIG51bWJlciBvZiBSeCBkYXRhIC8gQ2hlY2tGb3JIYW5nX3BlcmlvZCAgdG8gZGV0ZXJtaW5lIGxpbmsgc3RhdHVzCisJdTE2CQkJCVNsb3ROdW07CS8vIG51bWJlciBvZiBDaGVja0ZvckhhbmcgcGVyaW9kIHRvIGRldGVybWluZSBsaW5rIHN0YXR1cworCXUxNgkJCQlTbG90SW5kZXg7CisKKwl1MzIJCQkJTnVtVHhPa0luUGVyaW9kOworCXUzMgkJCQlOdW1SeE9rSW5QZXJpb2Q7CisJYm9vbAkJCQliQnVzeVRyYWZmaWM7Cit9UlRfTElOS19ERVRFQ1RfVCwgKlBSVF9MSU5LX0RFVEVDVF9UOworCisKK3N0cnVjdCBpZWVlODAyMTFfZGV2aWNlIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgc2VjOworCisJLy9odyBzZWN1cml0eSByZWxhdGVkCisvLwl1OCBod3NlY19zdXBwb3J0OyAvL3N1cHBvcnQ/CisJdTggaHdzZWNfYWN0aXZlOyAgLy9odyBzZWN1cml0eSBhY3RpdmUuCisJYm9vbCBpc19zaWxlbnRfcmVzZXQ7CisJYm9vbCBpZWVlX3VwOworCS8vYWRkZWQgYnkgYW15CisJYm9vbCBiU3VwcG9ydFJlbW90ZVdha2VVcDsKKwlSVF9QU19NT0RFCWRvdDExUG93ZXJTYXZlTW9kZTsgLy8gUG93ZXIgc2F2ZSBtb2RlIGNvbmZpZ3VyZWQuCisJYm9vbCBhY3RzY2FubmluZzsKKwlib29sIGJlaW5yZXRyeTsKKwlSVF9SRl9QT1dFUl9TVEFURQkJZVJGUG93ZXJTdGF0ZTsKKwlSVF9SRl9DSEFOR0VfU09VUkNFCVJmT2ZmUmVhc29uOworCWJvb2wgaXNfc2V0X2tleTsKKwkvLzExbiBzcGVjIHJlbGF0ZWQgSSB3b25kZXIgaWYgVGhlc2UgaW5mbyBzdHJ1Y3R1cmUgbmVlZCB0byBiZSBtb3ZlZCBvdXQgb2YgaWVlZTgwMjExX2RldmljZQorCisJLy8xMW4gSFQgYmVsb3cKKwlQUlRfSElHSF9USFJPVUdIUFVUCXBIVEluZm87CisJLy9zdHJ1Y3QgdGltZXJfbGlzdAkJU3dCd1RpbWVyOworLy8Jc3BpbmxvY2tfdCBjaG5sb3Bfc3BpbmxvY2s7CisJc3BpbmxvY2tfdCBid19zcGlubG9jazsKKworCXNwaW5sb2NrX3QgcmVvcmRlcl9zcGlubG9jazsKKwkvLyBmb3IgSFQgb3BlcmF0aW9uIHJhdGUgc2V0LiAgd2UgdXNlIHRoaXMgb25lIGZvciBIVCBkYXRhIHJhdGUgdG8gc2VwZXJhdGUgZGlmZmVyZW50IGRlc2NyaXB0b3JzCisJLy90aGUgd2F5IGZpbGwgdGhpcyBpcyB0aGUgc2FtZSBhcyBpbiB0aGUgSUUKKwl1OAlSZWdkb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0WzE2XTsJCS8vdXNlIFJBVFIgZm9ybWF0CisJdTgJZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldFsxNl07CQkvL3VzZSBSQVRSIGZvcm1hdAorCXU4CVJlZ0hUU3VwcFJhdGVTZXRbMTZdOworCXU4CQkJCUhUQ3VycmVudE9wZXJhUmF0ZTsKKwl1OAkJCQlIVEhpZ2hlc3RPcGVyYVJhdGU7CisJLy93YiBhZGRlZCBmb3IgcmF0ZSBvcGVyYXRpb24gbW9kZSB0byBmaXJtd2FyZQorCXU4CWJUeERpc2FibGVSYXRlRmFsbEJhY2s7CisJdTggCWJUeFVzZURyaXZlckFzc2luZ2VkUmF0ZTsKKwlhdG9taWNfdAlhdG1fY2hubG9wOworCWF0b21pY190CWF0bV9zd2J3OworLy8JdTgJSFRIaWdoZXN0T3BlcmFSYXRlOworLy8JdTggCUhUQ3VycmVudE9wZXJhUmF0ZTsKKworCS8vIDgwMi4xMWUgYW5kIFdNTSBUcmFmZmljIFN0cmVhbSBJbmZvIChUWCkKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlUeF9UU19BZG1pdF9MaXN0OworCXN0cnVjdCBsaXN0X2hlYWQJCVR4X1RTX1BlbmRpbmdfTGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlUeF9UU19VbnVzZWRfTGlzdDsKKwlUWF9UU19SRUNPUkQJCVR4VHNSZWNvcmRbVE9UQUxfVFNfTlVNXTsKKwkvLyA4MDIuMTFlIGFuZCBXTU0gVHJhZmZpYyBTdHJlYW0gSW5mbyAoUlgpCisJc3RydWN0IGxpc3RfaGVhZAkJUnhfVFNfQWRtaXRfTGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlSeF9UU19QZW5kaW5nX0xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAkJUnhfVFNfVW51c2VkX0xpc3Q7CisJUlhfVFNfUkVDT1JECQlSeFRzUmVjb3JkW1RPVEFMX1RTX05VTV07CisvLyNpZmRlZiBUT19ET19MSVNUCisJUlhfUkVPUkRFUl9FTlRSWQlSeFJlb3JkZXJFbnRyeVsxMjhdOworCXN0cnVjdCBsaXN0X2hlYWQJCVJ4UmVvcmRlcl9VbnVzZWRfTGlzdDsKKy8vI2VuZGlmCisJLy8gUW9zIHJlbGF0ZWQuIEFkZGVkIGJ5IEFubmllLCAyMDA1LTExLTAxLgorLy8JUFNUQV9RT1MJCQlwU3RhUW9zOworCXU4CQkJCUZvcmNlZFByaW9yaXR5OwkJLy8gRm9yY2UgcGVyLXBhY2tldCBwcmlvcml0eSAxfjcuIChkZWZhdWx0OiAwLCBub3QgdG8gZm9yY2UgaXQuKQorCisKKwkvKiBCb29ra2VlcGluZyBzdHJ1Y3R1cmVzICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IGllZWU4MDIxMV9zdGF0cyBpZWVlX3N0YXRzOworCXN0cnVjdCBpZWVlODAyMTFfc29mdG1hY19zdGF0cyBzb2Z0bWFjX3N0YXRzOworCisJLyogUHJvYmUgLyBCZWFjb24gbWFuYWdlbWVudCAqLworCXN0cnVjdCBsaXN0X2hlYWQgbmV0d29ya19mcmVlX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBuZXR3b3JrX2xpc3Q7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrczsKKwlpbnQgc2NhbnM7CisJaW50IHNjYW5fYWdlOworCisJaW50IGl3X21vZGU7IC8qIG9wZXJhdGluZyBtb2RlIChJV19NT0RFXyopICovCisJc3RydWN0IGl3X3NweV9kYXRhIHNweV9kYXRhOworCisJc3BpbmxvY2tfdCBsb2NrOworCXNwaW5sb2NrX3Qgd3BheF9zdWl0bGlzdF9sb2NrOworCisJaW50IHR4X2hlYWRyb29tOyAvKiBTZXQgdG8gc2l6ZSBvZiBhbnkgYWRkaXRpb25hbCByb29tIG5lZWRlZCBhdCBmcm9udAorCQkJICAqIG9mIGFsbG9jYXRlZCBUeCBTS0JzICovCisJdTMyIGNvbmZpZzsKKworCS8qIFdFUCBhbmQgb3RoZXIgZW5jcnlwdGlvbiByZWxhdGVkIHNldHRpbmdzIGF0IHRoZSBkZXZpY2UgbGV2ZWwgKi8KKwlpbnQgb3Blbl93ZXA7IC8qIFNldCB0byAxIHRvIGFsbG93IHVuZW5jcnlwdGVkIGZyYW1lcyAqLworCWludCBhdXRoX21vZGU7CisJaW50IHJlc2V0X29uX2tleWNoYW5nZTsgLyogU2V0IHRvIDEgaWYgdGhlIEhXIG5lZWRzIHRvIGJlIHJlc2V0IG9uCisJCQkJICogV0VQIGtleSBjaGFuZ2VzICovCisKKwkvKiBJZiB0aGUgaG9zdCBwZXJmb3JtcyB7ZW4sZGV9Y3J5cHRpb24sIHRoZW4gc2V0IHRvIDEgKi8KKwlpbnQgaG9zdF9lbmNyeXB0OworCWludCBob3N0X2VuY3J5cHRfbXNkdTsKKwlpbnQgaG9zdF9kZWNyeXB0OworCS8qIGhvc3QgcGVyZm9ybXMgbXVsdGljYXN0IGRlY3J5cHRpb24gKi8KKwlpbnQgaG9zdF9tY19kZWNyeXB0OworCisJLyogaG9zdCBzaG91bGQgc3RyaXAgSVYgYW5kIElDViBmcm9tIHByb3RlY3RlZCBmcmFtZXMgKi8KKwkvKiBtZWFuaW5nZnVsIG9ubHkgd2hlbiBoYXJkd2FyZSBkZWNyeXB0aW9uIGlzIGJlaW5nIHVzZWQgKi8KKwlpbnQgaG9zdF9zdHJpcF9pdl9pY3Y7CisKKwlpbnQgaG9zdF9vcGVuX2ZyYWc7CisJaW50IGhvc3RfYnVpbGRfaXY7CisJaW50IGllZWU4MDJfMXg7IC8qIGlzIElFRUUgODAyLjFYIHVzZWQgKi8KKworCS8qIFdQQSBkYXRhICovCisJYm9vbCBiSGFsZldpcmVsZXNzTjI0R01vZGU7CisJaW50IHdwYV9lbmFibGVkOworCWludCBkcm9wX3VuZW5jcnlwdGVkOworCWludCB0a2lwX2NvdW50ZXJtZWFzdXJlczsKKwlpbnQgcHJpdmFjeV9pbnZva2VkOworCXNpemVfdCB3cGFfaWVfbGVuOworCXU4ICp3cGFfaWU7CisJdTggYXBfbWFjX2FkZHJbNl07CisJdTE2IHBhaXJ3aXNlX2tleV90eXBlOworCXUxNiBncm91cF9rZXlfdHlwZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNyeXB0X2RlaW5pdF9saXN0OworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHRbV0VQX0tFWVNdOworCWludCB0eF9rZXlpZHg7IC8qIGRlZmF1bHQgVFgga2V5IGluZGV4IChjcnlwdFt0eF9rZXlpZHhdKSAqLworCXN0cnVjdCB0aW1lcl9saXN0IGNyeXB0X2RlaW5pdF90aW1lcjsKKwlpbnQgY3J5cHRfcXVpZXNjZWQ7CisKKwlpbnQgYmNyeF9zdGFfa2V5OyAvKiB1c2UgaW5kaXZpZHVhbCBrZXlzIHRvIG92ZXJyaWRlIGRlZmF1bHQga2V5cyBldmVuCisJCQkgICAqIHdpdGggUlggb2YgYnJvYWQvbXVsdGljYXN0IGZyYW1lcyAqLworCisJLyogRnJhZ21lbnRhdGlvbiBzdHJ1Y3R1cmVzICovCisJLy8gZWFjaCBzdHJlYW1pbmcgY29udGFpbiBhIGVudHJ5CisJc3RydWN0IGllZWU4MDIxMV9mcmFnX2VudHJ5IGZyYWdfY2FjaGVbMTddW0lFRUU4MDIxMV9GUkFHX0NBQ0hFX0xFTl07CisJdW5zaWduZWQgaW50IGZyYWdfbmV4dF9pZHhbMTddOworCXUxNiBmdHM7IC8qIEZyYWdtZW50YXRpb24gVGhyZXNob2xkICovCisjZGVmaW5lIERFRkFVTFRfUlRTX1RIUkVTSE9MRCAyMzQ2VQorI2RlZmluZSBNSU5fUlRTX1RIUkVTSE9MRCAxCisjZGVmaW5lIE1BWF9SVFNfVEhSRVNIT0xEIDIzNDZVCisJdTE2IHJ0czsgLyogUlRTIHRocmVzaG9sZCAqLworCisJLyogQXNzb2NpYXRpb24gaW5mbyAqLworCXU4IGJzc2lkW0VUSF9BTEVOXTsKKworCS8qIFRoaXMgc3RvcmVzIGluZm9zIGZvciB0aGUgY3VycmVudCBuZXR3b3JrLgorCSAqIEVpdGhlciB0aGUgbmV0d29yayB3ZSBhcmUgYXNzb2NpYXRlZCBpbiBJTkZSQVNUUlVDVFVSRQorCSAqIG9yIHRoZSBuZXR3b3JrIHRoYXQgd2UgYXJlIGNyZWF0aW5nIGluIE1BU1RFUiBtb2RlLgorCSAqIGFkLWhvYyBpcyBhIG1peHR1cmUgOy0pLgorCSAqIE5vdGUgdGhhdCBpbiBpbmZyYXN0cnVjdHVyZSBtb2RlLCBldmVuIHdoZW4gbm90IGFzc29jaWF0ZWQsCisJICogZmllbGRzIGJzc2lkIGFuZCBlc3NpZCBtYXkgYmUgdmFsaWQgKGlmIHdwYV9zZXQgYW5kIGVzc2lkX3NldAorCSAqIGFyZSB0cnVlKSBhcyB0aHkgY2FycnkgdGhlIHZhbHVlIHNldCBieSB0aGUgdXNlciB2aWEgaXdjb25maWcKKwkgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgY3VycmVudF9uZXR3b3JrOworCisJZW51bSBpZWVlODAyMTFfc3RhdGUgc3RhdGU7CisKKwlpbnQgc2hvcnRfc2xvdDsKKwlpbnQgcmVnX21vZGU7CisJaW50IG1vZGU7ICAgICAgIC8qIEEsIEIsIEcgKi8KKwlpbnQgbW9kdWxhdGlvbjsgLyogQ0NLLCBPRkRNICovCisJaW50IGZyZXFfYmFuZDsgIC8qIDIuNEdoeiwgNS4yR2h6LCBNaXhlZCAqLworCWludCBhYmdfdHJ1ZTsgICAvKiBBQkcgZmxhZyAgICAgICAgICAgICAgKi8KKworCS8qIHVzZWQgZm9yIGZvcmNpbmcgdGhlIGlic3Mgd29ya3F1ZXVlIHRvIHRlcm1pbmF0ZQorCSAqIHdpdGhvdXQgd2FpdCBmb3IgdGhlIHN5bmNybyBzY2FuIHRvIHRlcm1pbmF0ZQorCSAqLworCXNob3J0IHN5bmNfc2Nhbl9odXJyeXVwOworCisJaW50IHBlcmZlY3RfcnNzaTsKKwlpbnQgd29yc3RfcnNzaTsKKworCXUxNiBwcmV2X3NlcV9jdGw7ICAgICAgIC8qIHVzZWQgdG8gZHJvcCBkdXBsaWNhdGUgZnJhbWVzICovCisKKwkvKiBtYXAgb2YgYWxsb3dlZCBjaGFubmVscy4gMCBpcyBkdW1teSAqLworCS8vIEZJWE1FOiByZW1lYmVyIHRvIGRlZmF1bHQgdG8gYSBiYXNpYyBjaGFubmVsIHBsYW4gZGVwZW5kaW5nIG9mIHRoZSBQSFkgdHlwZQorI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwl2b2lkKiBwRG90MTFkSW5mbzsKKwlib29sIGJHbG9iYWxEb21haW47CisjZWxzZQorCWludCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CisjZW5kaWYKKwlpbnQgcmF0ZTsgICAgICAgLyogY3VycmVudCByYXRlICovCisJaW50IGJhc2ljX3JhdGU7CisJLy9GSVhNRTogcGxlYWNlIGNhbGxiYWNrLCBzZWUgaWYgcmVkdW5kYW50IHdpdGggc29mdG1hY19mZWF0dXJlcworCXNob3J0IGFjdGl2ZV9zY2FuOworCisJLyogdGhpcyBjb250YWlucyBmbGFncyBmb3Igc2VsZWN0aXZlbHkgZW5hYmxlIHNvZnRtYWMgc3VwcG9ydCAqLworCXUxNiBzb2Z0bWFjX2ZlYXR1cmVzOworCisJLyogaWYgdGhlIHNlcXVlbmNlIGNvbnRyb2wgZmllbGQgaXMgbm90IGZpbGxlZCBieSBIVyAqLworCXUxNiBzZXFfY3RybFs1XTsKKworCS8qIGFzc29jaWF0aW9uIHByb2NlZHVyZSB0cmFuc2FjdGlvbiBzZXF1ZW5jZSBudW1iZXIgKi8KKwl1MTYgYXNzb2NpYXRlX3NlcTsKKworCS8qIEFJRCBmb3IgUlRYZWQgYXNzb2NpYXRpb24gcmVzcG9uc2VzICovCisJdTE2IGFzc29jX2lkOworCisJLyogcG93ZXIgc2F2ZSBtb2RlIHJlbGF0ZWQqLworCXNob3J0IHBzOworCXNob3J0IHN0YV9zbGVlcDsKKwlpbnQgcHNfdGltZW91dDsKKwlpbnQgcHNfcGVyaW9kOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBwc190YXNrOworCXUzMiBwc190aDsKKwl1MzIgcHNfdGw7CisKKwlzaG9ydCByYXdfdHg7CisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgaXMgc2V0ICovCisJc2hvcnQgcXVldWVfc3RvcDsKKwlzaG9ydCBzY2FubmluZzsKKwlzaG9ydCBwcm90b19zdGFydGVkOworCisJc3RydWN0IHNlbWFwaG9yZSB3eF9zZW07CisJc3RydWN0IHNlbWFwaG9yZSBzY2FuX3NlbTsKKworCXNwaW5sb2NrX3QgbWdtdF90eF9sb2NrOworCXNwaW5sb2NrX3QgYmVhY29uX2xvY2s7CisKKwlzaG9ydCBiZWFjb25fdHhpbmc7CisKKwlzaG9ydCB3YXBfc2V0OworCXNob3J0IHNzaWRfc2V0OworCisJdTggIHdwYXhfdHlwZV9zZXQ7ICAgIC8ve2FkZGVkIGJ5IERhdmlkLCAyMDA2LjkuMjh9CisJdTMyIHdwYXhfdHlwZV9ub3RpZnk7IC8ve2FkZGVkIGJ5IERhdmlkLCAyMDA2LjkuMjZ9CisKKwkvKiBRb1MgcmVsYXRlZCBmbGFnICovCisJY2hhciBpbml0X3dtbXBhcmFtX2ZsYWc7CisJLyogc2V0IG9uIGluaXRpYWxpemF0aW9uICovCisJdTggIHFvc19zdXBwb3J0OworCisJLyogZm9yIGRpc2NhcmRpbmcgZHVwbGljYXRlZCBwYWNrZXRzIGluIElCU1MgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGlic3NfbWFjX2hhc2hbSUVFRV9JQlNTX01BQ19IQVNIX1NJWkVdOworCisJLyogZm9yIGRpc2NhcmRpbmcgZHVwbGljYXRlZCBwYWNrZXRzIGluIEJTUyAqLworCXUxNiBsYXN0X3J4c2VxX251bVsxN107IC8qIHJ4IHNlcSBwcmV2aW91cyBwZXItdGlkICovCisJdTE2IGxhc3RfcnhmcmFnX251bVsxN107LyogdHggZnJhZyBwcmV2aW91cyBwZXItdGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3BhY2tldF90aW1lWzE3XTsKKworCS8qIGZvciBQUyBtb2RlICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3J4X3BzX3RpbWU7CisKKwkvKiB1c2VkIGlmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUgaXMgc2V0ICovCisJc3RydWN0IHNrX2J1ZmYgKm1nbXRfcXVldWVfcmluZ1tNR01UX1FVRVVFX05VTV07CisJaW50IG1nbXRfcXVldWVfaGVhZDsKKwlpbnQgbWdtdF9xdWV1ZV90YWlsOworLy97IGFkZGVkIGZvciBydGw4MTl4CisjZGVmaW5lIElFRUU4MDIxMV9RVUVVRV9MSU1JVCAxMjgKKwl1OCBBc29jUmV0cnlDb3VudDsKKwl1bnNpZ25lZCBpbnQgaHdfaGVhZGVyOworCXN0cnVjdCBza19idWZmX2hlYWQgc2tiX3dhaXRRW01BWF9RVUVVRV9TSVpFXTsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICBza2JfYWdnUVtNQVhfUVVFVUVfU0laRV07CisJc3RydWN0IHNrX2J1ZmZfaGVhZCAgc2tiX2Rydl9hZ2dRW01BWF9RVUVVRV9TSVpFXTsKKwl1MzIJc3RhX2VkY2FfcGFyYW1bNF07CisJYm9vbCBhZ2dyZWdhdGlvbjsKKwkvLyBFbmFibGUvRGlzYWJsZSBSeCBpbW1lZGlhdGUgQkEgY2FwYWJpbGl0eS4KKwlib29sIGVuYWJsZV9yeF9pbW1fQkE7CisJYm9vbCBiaWJzc2Nvb3JkaW5hdG9yOworCisJLy8rYnkgYW15IGZvciBETSAsMDgwNTE1CisJLy9EeW5hbWljIFR4IHBvd2VyIGZvciBuZWFyL2ZhciByYW5nZSBlbmFibGUvRGlzYWJsZSAgLCBieSBhbXkgLCAyMDA4LTA1LTE1CisJYm9vbAliZHluYW1pY190eHBvd2VyX2VuYWJsZTsKKworCWJvb2wgYkNUU1RvU2VsZkVuYWJsZTsKKwl1OCAJQ1RTVG9TZWxmVEg7CisKKwl1MzIgCWZzeW5jX3RpbWVfaW50ZXJ2YWw7CisJdTMyCWZzeW5jX3JhdGVfYml0bWFwOworCXU4CWZzeW5jX3Jzc2lfdGhyZXNob2xkOworCWJvb2wJYmZzeW5jX2VuYWJsZTsKKworCXU4CWZzeW5jX211bHRpcGxlX3RpbWVpbnRlcnZhbDsJCS8vIEZzeW5jTXVsdGlwbGVUaW1lSW50ZXJ2YWwgKiBGc3luY1RpbWVJbnRlcnZhbAorCXUzMglmc3luY19maXJzdGRpZmZfcmF0ZXRocmVzaG9sZDsJCS8vIGxvdyB0aHJlc2hvbGQKKwl1MzIJZnN5bmNfc2Vjb25kZGlmZl9yYXRldGhyZXNob2xkOwkgLy8gZGVjcmVhc2UgdGhyZXNob2xkCisJRnN5bmNfU3RhdGUJCQlmc3luY19zdGF0ZTsKKwlib29sCQliaXNfYW55X25vbmJlcGt0czsKKwkvLzIwTWh6IDQwTWh6IEF1dG9Td2l0Y2ggVGhyZXNob2xkCisJYmFuZHdpZHRoX2F1dG9zd2l0Y2ggYmFuZHdpZHRoX2F1dG9fc3dpdGNoOworCS8vZm9yIHR4cG93ZXIgdHJhY2tpbmcKKwlib29sIEZ3UldSRjsKKworCS8vYWRkZWQgYnkgYW15IGZvciBBUCByb2FtaW5nCisJUlRfTElOS19ERVRFQ1RfVAlMaW5rRGV0ZWN0SW5mbzsKKwkvL2FkZGVkIGJ5IGFteSBmb3IgcHMKKwlSVF9QT1dFUl9TQVZFX0NPTlRST0wJUG93ZXJTYXZlQ29udHJvbDsKKy8vfQorCS8qIHVzZWQgaWYgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFIGlzIHNldCAqLworCXN0cnVjdCAgdHhfcGVuZGluZ190IHR4X3BlbmRpbmc7CisKKwkvKiB1c2VkIGlmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUgaXMgc2V0ICovCisJc3RydWN0IHRpbWVyX2xpc3QgYXNzb2NpYXRlX3RpbWVyOworCisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfQkVBQ09OUyBpcyBzZXQgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBiZWFjb25fdGltZXI7CisJc3RydWN0IHdvcmtfc3RydWN0IGFzc29jaWF0ZV9jb21wbGV0ZV93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYXNzb2NpYXRlX3Byb2NlZHVyZV93cTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHNvZnRtYWNfc2Nhbl93cTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGFzc29jaWF0ZV9yZXRyeV93cTsKKwkgc3RydWN0IGRlbGF5ZWRfd29yayBzdGFydF9pYnNzX3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3eF9zeW5jX3NjYW5fd3E7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOworICAgICAgICAvLyBRb3MgcmVsYXRlZC4gQWRkZWQgYnkgQW5uaWUsIDIwMDUtMTEtMDEuCisgICAgICAgIC8vU1RBX1FPUyAgU3RhUW9zOworCisgICAgICAgIC8vdTMyIFNUQV9FRENBX1BBUkFNWzRdOworCS8vQ0hBTk5FTF9BQ0NFU1NfU0VUVElORyBDaGFubmVsQWNjZXNzU2V0dGluZzsKKworCisJLyogQ2FsbGJhY2sgZnVuY3Rpb25zICovCisJdm9pZCAoKnNldF9zZWN1cml0eSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSAqc2VjKTsKKworCS8qIFVzZWQgdG8gVFggZGF0YSBmcmFtZSBieSB1c2luZyB0eGIgc3RydWN0cy4KKwkgKiB0aGlzIGlzIG5vdCB1c2VkIGlmIGluIHRoZSBzb2Z0bWFjX2ZlYXR1cmVzCisJICogaXMgc2V0IHRoZSBmbGFnIElFRUVfU09GVE1BQ19UWF9RVUVVRQorCSAqLworCWludCAoKmhhcmRfc3RhcnRfeG1pdCkoc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YiwKKwkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCWludCAoKnJlc2V0X3BvcnQpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworICAgICAgICBpbnQgKCppc19xdWV1ZV9mdWxsKSAoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIGludCBwcmkpOworCisgICAgICAgIGludCAoKmhhbmRsZV9tYW5hZ2VtZW50KSAoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICogbmV0d29yaywgdTE2IHR5cGUpOworICAgICAgICBpbnQgKCppc19xb3NfYWN0aXZlKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKwkvKiBTb2Z0bWFjLWdlbmVyYXRlZCBmcmFtZXMgKG1hbWFnZW1lbnQpIGFyZSBUWGVkIHZpYSB0aGlzCisJICogY2FsbGJhY2sgaWYgdGhlIGZsYWcgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSBpcworCSAqIG5vdCBzZXQuIEFzIHNvbWUgY2FyZHMgbWF5IGhhdmUgZGlmZmVyZW50IEhXIHF1ZXVlcyB0aGF0CisJICogb25lIG1pZ2h0IHdhbnQgdG8gdXNlIGZvciBkYXRhIGFuZCBtYW5hZ2VtZW50IGZyYW1lcworCSAqIHRoZSBvcHRpb24gdG8gaGF2ZSB0d28gY2FsbGJhY2tzIG1pZ2h0IGJlIHVzZWZ1bC4KKwkgKiBUaGlzIGZ1Y250aW9uIGNhbid0IHNsZWVwLgorCSAqLworCWludCAoKnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogdXNlZCBpbnN0ZWFkIG9mIGhhcmRfc3RhcnRfeG1pdCAobm90IHNvZnRtYWNfaGFyZF9zdGFydF94bWl0KQorCSAqIGlmIHRoZSBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgZmVhdHVyZSBpcyB1c2VkIHRvIFRYIGRhdGEKKwkgKiBmcmFtZXMuIEkgdGhlIG9wdGlvbiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFIGlzIGFsc28gc2V0CisJICogdGhlbiBhbHNvIG1hbmFnZW1lbnQgZnJhbWVzIGFyZSBzZW50IHZpYSB0aGlzIGNhbGxiYWNrLgorCSAqIFRoaXMgZnVuY3Rpb24gY2FuJ3Qgc2xlZXAuCisJICovCisJdm9pZCAoKnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQpKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldixpbnQgcmF0ZSk7CisKKwkvKiBzdG9wcyB0aGUgSFcgcXVldWUgZm9yIERBVEEgZnJhbWVzLiBVc2VmdWwgdG8gYXZvaWQKKwkgKiB3YXN0ZSB0aW1lIHRvIFRYIGRhdGEgZnJhbWUgd2hlbiB3ZSBhcmUgcmVhc3NvY2lhdGluZworCSAqIFRoaXMgZnVuY3Rpb24gY2FuIHNsZWVwLgorCSAqLworCXZvaWQgKCpkYXRhX2hhcmRfc3RvcCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiBPSyB0aGlzIGlzIGNvbXBsZW1lbnRhciB0byBkYXRhX3BvbGxfaGFyZF9zdG9wICovCisJdm9pZCAoKmRhdGFfaGFyZF9yZXN1bWUpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogYXNrIHRvIHRoZSBkcml2ZXIgdG8gcmV0dW5lIHRoZSByYWRpbyAuCisJICogVGhpcyBmdW5jdGlvbiBjYW4gc2xlZXAuIHRoZSBkcml2ZXIgc2hvdWxkIGVuc3VyZQorCSAqIHRoZSByYWRpbyBoYXMgYmVlbiBzd2l0aGNlZCBiZWZvcmUgcmV0dXJuLgorCSAqLworCXZvaWQgKCpzZXRfY2hhbikoc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCk7CisKKwkvKiBUaGVzZSBhcmUgbm90IHVzZWQgaWYgdGhlIGllZWUgc3RhY2sgdGFrZXMgY2FyZSBvZgorCSAqIHNjYW5uaW5nIChJRUVFX1NPRlRNQUNfU0NBTiBmZWF0dXJlIHNldCkuCisJICogSW4gdGhpcyBjYXNlIG9ubHkgdGhlIHNldF9jaGFuIGlzIHVzZWQuCisJICoKKwkgKiBUaGUgc3luY3JvIHZlcnNpb24gaXMgc2ltaWxhciB0byB0aGUgc3RhcnRfc2NhbiBidXQKKwkgKiBkb2VzIG5vdCByZXR1cm4gdW50aWwgYWxsIGNoYW5uZWxzIGhhcyBiZWVuIHNjYW5uZWQuCisJICogdGhpcyBpcyBjYWxsZWQgaW4gdXNlciBjb250ZXh0IGFuZCBzaG91bGQgc2xlZXAsCisJICogaXQgaXMgY2FsbGVkIGluIGEgd29ya19xdWV1ZSB3aGVuIHN3aXRoY2luZyB0byBhZC1ob2MgbW9kZQorCSAqIG9yIGluIGJlaGFsZiBvZiBpd2xpc3Qgc2NhbiB3aGVuIHRoZSBjYXJkIGlzIGFzc29jaWF0ZWQKKwkgKiBhbmQgcm9vdCB1c2VyIGFzayBmb3IgYSBzY2FuLgorCSAqIHRoZSBmdWNudGlvbiBzdG9wX3NjYW4gc2hvdWxkIHN0b3AgYm90aCB0aGUgc3luY3JvIGFuZAorCSAqIGJhY2tncm91bmQgc2Nhbm5pbmcgYW5kIGNhbiBzbGVlcC4KKwkgKiBUaGUgZnVjbnRpb24gc3RhcnRfc2NhbiBzaG91bGQgaW5pdGlhdGUgdGhlIGJhY2tncm91bmQKKwkgKiBzY2FubmluZyBhbmQgY2FuJ3Qgc2xlZXAuCisJICovCisJdm9pZCAoKnNjYW5fc3luY3JvKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqc3RhcnRfc2Nhbikoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKnN0b3Bfc2Nhbikoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiBpbmRpY2F0ZSB0aGUgZHJpdmVyIHRoYXQgdGhlIGxpbmsgc3RhdGUgaXMgY2hhbmdlZAorCSAqIGZvciBleGFtcGxlIGl0IG1heSBpbmRpY2F0ZSB0aGUgY2FyZCBpcyBhc3NvY2lhdGVkIG5vdy4KKwkgKiBEcml2ZXIgbWlnaHQgYmUgaW50ZXJlc3RlZCBpbiB0aGlzIHRvIGFwcGx5IFJYIGZpbHRlcgorCSAqIHJ1bGVzIG9yIHNpbXBseSBsaWdodCB0aGUgTElOSyBsZWQKKwkgKi8KKwl2b2lkICgqbGlua19jaGFuZ2UpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogdGhlc2UgdHdvIGZ1bmN0aW9uIGluZGljYXRlcyB0byB0aGUgSFcgd2hlbiB0byBzdGFydAorCSAqIGFuZCBzdG9wIHRvIHNlbmQgYmVhY29ucy4gVGhpcyBpcyB1c2VkIHdoZW4gdGhlCisJICogSUVFRV9TT0ZUTUFDX0JFQUNPTlMgaXMgbm90IHNldC4gRm9yIG5vdyB0aGUKKwkgKiBzdG9wX3NlbmRfYmFjb25zIGlzIE5PVCBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCBvbmx5CisJICogYWZ0ZXIgc3RhcnRfc2VuZF9iZWFjb25zLgorCSAqLworCXZvaWQgKCpzdGFydF9zZW5kX2JlYWNvbnMpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHUxNiB0eF9yYXRlKTsKKwl2b2lkICgqc3RvcF9zZW5kX2JlYWNvbnMpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIHBvd2VyIHNhdmUgbW9kZSByZWxhdGVkICovCisJdm9pZCAoKnN0YV93YWtlX3VwKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKnBzX3JlcXVlc3RfdHhfYWNrKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKmVudGVyX3NsZWVwX3N0YXRlKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHRoLCB1MzIgdGwpOworCXNob3J0ICgqcHNfaXNfcXVldWVfZW1wdHkpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwlpbnQgKCpoYW5kbGVfYmVhY29uKSAoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIHN0cnVjdCBpZWVlODAyMTFfYmVhY29uICogYmVhY29uLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKiBuZXR3b3JrKTsKKwlpbnQgKCpoYW5kbGVfYXNzb2NfcmVzcG9uc2UpIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSAqIHJlc3AsIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqIG5ldHdvcmspOworCisKKwkvKiBjaGVjayB3aGV0aGVyIFR4IGh3IHJlc291Y2UgYXZhaWxhYmxlICovCisJc2hvcnQgKCpjaGVja19uaWNfZW5vdWdoX2Rlc2MpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBxdWV1ZV9pbmRleCk7CisJLy9hZGRlZCBieSB3YiBmb3IgSFQgcmVsYXRlZAorLy8Jdm9pZCAoKlN3Q2hubEJ5VGltZXJIYW5kbGVyKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY2hhbm5lbCk7CisJdm9pZCAoKlNldEJXTW9kZUhhbmRsZXIpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIEhUX0NIQU5ORUxfV0lEVEggQmFuZHdpZHRoLCBIVF9FWFRDSE5MX09GRlNFVCBPZmZzZXQpOworLy8Jdm9pZCAoKlVwZGF0ZUhhbFJBVFJUYWJsZUhhbmRsZXIpKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHU4KiBwTWNzUmF0ZSk7CisJYm9vbCAoKkdldE5tb2RlU3VwcG9ydEJ5U2VjQ2ZnKShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKKwl2b2lkICgqU2V0V2lyZWxlc3NNb2RlKShzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1OCB3aXJlbGVzc19tb2RlKTsKKwlib29sICgqR2V0SGFsZk5tb2RlU3VwcG9ydEJ5QVBzSGFuZGxlcikoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CisJdm9pZCAoKkluaXRpYWxHYWluSGFuZGxlcikoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggT3BlcmF0aW9uKTsKKworCS8qIFRoaXMgbXVzdCBiZSB0aGUgbGFzdCBpdGVtIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBkYXRhCisJICogYWxsb2NhdGVkIGJleW9uZCB0aGlzIHN0cnVjdHVyZSBieSBhbGxvY19pZWVlODAyMTEgKi8KKwl1OCBwcml2WzBdOworfTsKKworI2RlZmluZSBJRUVFX0EgICAgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRV9CICAgICAgICAgICAgKDE8PDEpCisjZGVmaW5lIElFRUVfRyAgICAgICAgICAgICgxPDwyKQorI2RlZmluZSBJRUVFX05fMjRHIAkJICAoMTw8NCkKKyNkZWZpbmUJSUVFRV9OXzVHCQkgICgxPDw1KQorI2RlZmluZSBJRUVFX01PREVfTUFTSyAgICAoSUVFRV9BfElFRUVfQnxJRUVFX0cpCisKKy8qIEdlbmVyYXRlIGEgODAyLjExIGhlYWRlciAqLworCisvKiBVc2VzIHRoZSBjaGFubmVsIGNoYW5nZSBjYWxsYmFjayBkaXJlY3RseQorICogaW5zdGVhZCBvZiBbc3RhcnQvc3RvcF0gc2NhbiBjYWxsYmFja3MKKyAqLworI2RlZmluZSBJRUVFX1NPRlRNQUNfU0NBTiAoMTw8MikKKworLyogUGVyZm9ybSBhdXRoZW50aWNhdGlvbiBhbmQgYXNzb2NpYXRpb24gaGFuZHNoYWtlICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUgKDE8PDMpCisKKy8qIEdlbmVyYXRlIHByb2JlIHJlcXVlc3RzICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19QUk9CRVJRICgxPDw0KQorCisvKiBHZW5lcmF0ZSByZXNwb25lcyB0byBwcm9iZSByZXF1ZXN0cyAqLworI2RlZmluZSBJRUVFX1NPRlRNQUNfUFJPQkVSUyAoMTw8NSkKKworLyogVGhlIGllZWU4MDIuMTEgc3RhY2sgd2lsbCBtYW5hZ2VzIHRoZSBuZXRpZiBxdWV1ZQorICogd2FrZS9zdG9wIGZvciB0aGUgZHJpdmVyLCB0YWtpbmcgY2FyZSBvZiA4MDIuMTEKKyAqIGZyYWdtZW50YXRpb24uIFNlZSBzb2Z0bWFjLmMgZm9yIGRldGFpbHMuICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19UWF9RVUVVRSAoMTw8NykKKworLyogVXNlcyBvbmx5IHRoZSBzb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0CisgKiBldmVuIGZvciBUWCBtYW5hZ2VtZW50IGZyYW1lcy4KKyAqLworI2RlZmluZSBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFICgxPDw4KQorCisvKiBHZW5lcmF0ZSBiZWFjb25zLiAgVGhlIHN0YWNrIHdpbGwgZW5xdWV1ZSBiZWFjb25zCisgKiB0byB0aGUgY2FyZAorICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19CRUFDT05TICgxPDw2KQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmllZWU4MDIxMV9wcml2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuICgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiluZXRkZXZfcHJpdihkZXYpKS0+cHJpdjsKK30KKworZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2lzX2VtcHR5X2Vzc2lkKGNvbnN0IGNoYXIgKmVzc2lkLCBpbnQgZXNzaWRfbGVuKQoreworCS8qIFNpbmdsZSB3aGl0ZSBzcGFjZSBpcyBmb3IgTGlua3N5cyBBUHMgKi8KKwlpZiAoZXNzaWRfbGVuID09IDEgJiYgZXNzaWRbMF0gPT0gJyAnKQorCQlyZXR1cm4gMTsKKworCS8qIE90aGVyd2lzZSwgaWYgdGhlIGVudGlyZSBlc3NpZCBpcyAwLCB3ZSBhc3N1bWUgaXQgaXMgaGlkZGVuICovCisJd2hpbGUgKGVzc2lkX2xlbikgeworCQllc3NpZF9sZW4tLTsKKwkJaWYgKGVzc2lkW2Vzc2lkX2xlbl0gIT0gJ1wwJykKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitleHRlcm4gaW5saW5lIGludCBpZWVlODAyMTFfaXNfdmFsaWRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IG1vZGUpCit7CisJLyoKKwkgKiBJdCBpcyBwb3NzaWJsZSBmb3IgYm90aCBhY2Nlc3MgcG9pbnRzIGFuZCBvdXIgZGV2aWNlIHRvIHN1cHBvcnQKKwkgKiBjb21iaW5hdGlvbnMgb2YgbW9kZXMsIHNvIGFzIGxvbmcgYXMgdGhlcmUgaXMgb25lIHZhbGlkIGNvbWJpbmF0aW9uCisJICogb2YgYXAvZGV2aWNlIHN1cHBvcnRlZCBtb2RlcywgdGhlbiByZXR1cm4gc3VjY2VzcworCSAqCisJICovCisJaWYgKChtb2RlICYgSUVFRV9BKSAmJgorCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pICYmCisJICAgIChpZWVlLT5mcmVxX2JhbmQgJiBJRUVFODAyMTFfNTJHSFpfQkFORCkpCisJCXJldHVybiAxOworCisJaWYgKChtb2RlICYgSUVFRV9HKSAmJgorCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pICYmCisJICAgIChpZWVlLT5mcmVxX2JhbmQgJiBJRUVFODAyMTFfMjRHSFpfQkFORCkpCisJCXJldHVybiAxOworCisJaWYgKChtb2RlICYgSUVFRV9CKSAmJgorCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTikgJiYKKwkgICAgKGllZWUtPmZyZXFfYmFuZCAmIElFRUU4MDIxMV8yNEdIWl9CQU5EKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2dldF9oZHJsZW4odTE2IGZjKQoreworCWludCBoZHJsZW4gPSBJRUVFODAyMTFfM0FERFJfTEVOOworCisJc3dpdGNoIChXTEFOX0ZDX0dFVF9UWVBFKGZjKSkgeworCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0RBVEE6CisJCWlmICgoZmMgJiBJRUVFODAyMTFfRkNUTF9GUk9NRFMpICYmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1RPRFMpKQorCQkJaGRybGVuID0gSUVFRTgwMjExXzRBRERSX0xFTjsgLyogQWRkcjQgKi8KKwkJaWYoSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSkKKwkJCWhkcmxlbiArPSAyOyAvKiBRT1MgY3RybCovCisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0NUTDoKKwkJc3dpdGNoIChXTEFOX0ZDX0dFVF9TVFlQRShmYykpIHsKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQ1RTOgorCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BQ0s6CisJCQloZHJsZW4gPSBJRUVFODAyMTFfMUFERFJfTEVOOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQloZHJsZW4gPSBJRUVFODAyMTFfMkFERFJfTEVOOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGhkcmxlbjsKK30KKworc3RhdGljIGlubGluZSB1OCAqaWVlZTgwMjExX2dldF9wYXlsb2FkKHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIpCit7CisJc3dpdGNoIChpZWVlODAyMTFfZ2V0X2hkcmxlbihsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCkpKSB7CisJY2FzZSBJRUVFODAyMTFfMUFERFJfTEVOOgorCQlyZXR1cm4gKChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8xYWRkciAqKWhkciktPnBheWxvYWQ7CisJY2FzZSBJRUVFODAyMTFfMkFERFJfTEVOOgorCQlyZXR1cm4gKChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8yYWRkciAqKWhkciktPnBheWxvYWQ7CisJY2FzZSBJRUVFODAyMTFfM0FERFJfTEVOOgorCQlyZXR1cm4gKChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKWhkciktPnBheWxvYWQ7CisJY2FzZSBJRUVFODAyMTFfNEFERFJfTEVOOgorCQlyZXR1cm4gKChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqKWhkciktPnBheWxvYWQ7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfaXNfb2ZkbV9yYXRlKHU4IHJhdGUpCit7CisJc3dpdGNoIChyYXRlICYgfklFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0spIHsKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COgorCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV85TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUI6CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaWVlZTgwMjExX2lzX2Nja19yYXRlKHU4IHJhdGUpCit7CisJc3dpdGNoIChyYXRlICYgfklFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0spIHsKKwljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8xTUI6CisJY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfMk1COgorCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzVNQjoKKwljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1COgorCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyogaWVlZTgwMjExLmMgKi8KK2V4dGVybiB2b2lkIGZyZWVfaWVlZTgwMjExKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICphbGxvY19pZWVlODAyMTEoaW50IHNpemVvZl9wcml2KTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfc2V0X2VuY3J5cHRpb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworCisvKiBpZWVlODAyMTFfdHguYyAqLworCitleHRlcm4gaW50IGllZWU4MDIxMV9lbmNyeXB0X2ZyYWdtZW50KAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCXN0cnVjdCBza19idWZmICpmcmFnLAorCWludCBoZHJfbGVuKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV90eGJfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqKTsKKworCisvKiBpZWVlODAyMTFfcnguYyAqLworZXh0ZXJuIGludCBpZWVlODAyMTFfcngoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cyk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfcnhfbWd0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGVhZGVyLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cyk7CisKKy8qIGllZWU4MDIxMV93eC5jICovCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9lbmNvZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X2VuY29kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSk7CisjaWYgV0lSRUxFU1NfRVhUID49IDE4CitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfZW5jb2RlX2V4dChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEqIHdycXUsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9lbmNvZGVfZXh0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSogd3JxdSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X2F1dGgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmRhdGEsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9tbG1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworI2VuZGlmCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfZ2VuX2llKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqaWUsIHNpemVfdCBsZW4pOworCisvKiBpZWVlODAyMTFfc29mdG1hYy5jICovCitleHRlcm4gc2hvcnQgaWVlZTgwMjExX2lzXzU0ZyhzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgbmV0KTsKK2V4dGVybiBzaG9ydCBpZWVlODAyMTFfaXNfc2hvcnRzbG90KHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBuZXQpOworZXh0ZXJuIGludCBpZWVlODAyMTFfcnhfZnJhbWVfc29mdG1hYyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzLCB1MTYgdHlwZSwKKwkJCXUxNiBzdHlwZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19uZXdfbmV0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldCk7CisKK3ZvaWQgU2VuZERpc2Fzc29jaWF0aW9uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCogYXNTdGEsIHU4IGFzUnNuKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3htaXQoc3RydWN0IGllZWU4MDIxMV90eGIgKnR4Yiwgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworCitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgbm90aWZ5X3d4X2Fzc29jX2V2ZW50KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X21hc3Rlcl9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X2lic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19mcmVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfY2hlY2tfYWxsX25ldHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3Jlc2V0X3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV93YWtlX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2dldF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3BhX3N1cHBsaWNhbnRfaW9jdGwoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19wb2ludCAqcCk7CitleHRlcm4gdm9pZCBub3RpZnlfd3hfYXNzb2NfZXZlbnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3BzX3R4X2FjayhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgc3VjY2Vzcyk7CisKK2V4dGVybiB2b2lkIHNvZnRtYWNfbWdtdF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKKworLyogaWVlZTgwMjExX2NyeXB0X2NjbXAmdGtpcCZ3ZXAuYyAqLworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3RraXBfbnVsbCh2b2lkKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV93ZXBfbnVsbCh2b2lkKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9jY21wX251bGwodm9pZCk7CisKKy8qIGllZWU4MDIxMV9zb2Z0bWFjX3d4LmMgKi8KKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X3dhcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dCk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF93YXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSB1bmlvbiBpd3JlcV9kYXRhICphd3JxLAorCQkJIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X2Vzc2lkKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLHVuaW9uIGl3cmVxX2RhdGEgKndycXUsY2hhciAqYik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfZXNzaWQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9mcmVxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X2ZyZXEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworCisvL2V4dGVybiB2b2lkIGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3Eoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworCisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9yYXd0eChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X25hbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3Bvd2VyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9wb3dlcihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfcnRzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9ydHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKy8vSFQKKyNkZWZpbmUgTUFYX1JFQ0VJVkVfQlVGRkVSX1NJWkUgOTEwMCAgLy8KK2V4dGVybiB2b2lkIEhURGVidWdIVENhcGFiaWxpdHkodTgqIENhcElFLCB1OCogVGl0bGVTdHJpbmcgKTsKK2V4dGVybiB2b2lkIEhURGVidWdIVEluZm8odTgqICBJbmZvSUUsIHU4KiBUaXRsZVN0cmluZyk7CisKK3ZvaWQgSFRTZXRDb25uZWN0QndNb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBIVF9DSEFOTkVMX1dJRFRIIEJhbmR3aWR0aCwgSFRfRVhUQ0hOTF9PRkZTRVQgICAgT2Zmc2V0KTsKK2V4dGVybiB2b2lkIEhUVXBkYXRlRGVmYXVsdFNldHRpbmcoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUpOworZXh0ZXJuIHZvaWQgSFRDb25zdHJ1Y3RDYXBhYmlsaXR5RWxlbWVudChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTgqIHBvc0hUQ2FwLCB1OCogbGVuLCB1OCBpc0VuY3J5cHQpOworZXh0ZXJuIHZvaWQgSFRDb25zdHJ1Y3RJbmZvRWxlbWVudChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTgqIHBvc0hUSW5mbywgdTgqIGxlbiwgdTggaXNFbmNyeXB0KTsKK2V4dGVybiB2b2lkIEhUQ29uc3RydWN0UlQyUlRBZ2dFbGVtZW50KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogcG9zUlQyUlRBZ2csIHU4KiBsZW4pOworZXh0ZXJuIHZvaWQgSFRPbkFzc29jUnNwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIEhUSW5pdGlhbGl6ZUhUSW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSk7CitleHRlcm4gdm9pZCBIVEluaXRpYWxpemVCc3NEZXNjKFBCU1NfSFQgcEJzc0hUKTsKK2V4dGVybiB2b2lkIEhUUmVzZXRTZWxmQW5kU2F2ZVBlZXJTZXR0aW5nKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKiBwTmV0d29yayk7CitleHRlcm4gdm9pZCBIVFVwZGF0ZVNlbGZBbmRQZWVyU2V0dGluZyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKiBwTmV0d29yayk7CitleHRlcm4gdTggSFRHZXRIaWdoZXN0TUNTUmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTgqIHBNQ1NSYXRlU2V0LCB1OCogcE1DU0ZpbHRlcik7CitleHRlcm4gdTggTUNTX0ZJTFRFUl9BTExbXTsKK2V4dGVybiB1MTYgTUNTX0RBVEFfUkFURVsyXVsyXVs3N10gOworZXh0ZXJuIHU4IEhUQ0NoZWNrKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogICBwRnJhbWUpOworLy9leHRlcm4gdm9pZCBIVFNldENvbm5lY3RCd01vZGVDYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpOworZXh0ZXJuIHZvaWQgSFRSZXNldElPVFNldHRpbmcoUFJUX0hJR0hfVEhST1VHSFBVVCAgcEhUSW5mbyk7CitleHRlcm4gYm9vbCBJc0hUSGFsZk5tb2RlQVBzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlKTsKK2V4dGVybiB1MTYgSFRIYWxmTWNzVG9EYXRhUmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgIHU4ICAgICAgbk1jc1JhdGUpOworZXh0ZXJuIHUxNiBIVE1jc1RvRGF0YVJhdGUoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCBuTWNzUmF0ZSk7CitleHRlcm4gdTE2ICBUeENvdW50VG9EYXRhUmF0ZSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4IG5EYXRhUmF0ZSk7CisvL2Z1bmN0aW9uIGluIEJBUFJPQy5jCitleHRlcm4gaW50IGllZWU4MDIxMV9yeF9BRERCQVJlcSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHN0cnVjdCBza19idWZmICpza2IpOworZXh0ZXJuIGludCBpZWVlODAyMTFfcnhfQUREQkFSc3AoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3J4X0RFTEJBKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLHN0cnVjdCBza19idWZmICpza2IpOworZXh0ZXJuIHZvaWQgVHNJbml0QWRkQkEoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBQVFhfVFNfUkVDT1JEICAgcFRTLCB1OCBQb2xpY3ksIHU4IGJPdmVyd3JpdGVQZW5kaW5nKTsKK2V4dGVybiB2b2lkIFRzSW5pdERlbEJBKCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgUFRTX0NPTU1PTl9JTkZPIHBUc0NvbW1vbkluZm8sIFRSX1NFTEVDVCBUeFJ4U2VsZWN0KTsKK2V4dGVybiB2b2lkIEJhU2V0dXBUaW1lT3V0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitleHRlcm4gdm9pZCBUeEJhSW5hY3RUaW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitleHRlcm4gdm9pZCBSeEJhSW5hY3RUaW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitleHRlcm4gdm9pZCBSZXNldEJhRW50cnkoIFBCQV9SRUNPUkQgcEJBKTsKKy8vZnVuY3Rpb24gaW4gVFMuYworZXh0ZXJuIGJvb2wgR2V0VHMoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqICAgICAgICBpZWVlLAorCVBUU19DT01NT05fSU5GTyAgICAgICAgICAgICAgICAgKnBwVFMsCisJdTgqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyLAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElELAorCVRSX1NFTEVDVCAgICAgICAgICAgICAgICAgICAgICAgVHhSeFNlbGVjdCwgIC8vUng6MSwgVHg6MAorCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFkZE5ld1RzCisJKTsKK2V4dGVybiB2b2lkIFRTSW5pdGlhbGl6ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gIHZvaWQgVHNTdGFydEFkZEJhUHJvY2VzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgUFRYX1RTX1JFQ09SRCAgIHBUeFRTKTsKK2V4dGVybiB2b2lkIFJlbW92ZVBlZXJUUyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTgqIEFkZHIpOworZXh0ZXJuIHZvaWQgUmVtb3ZlQWxsVFMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUpOwordm9pZCBpZWVlODAyMTFfc29mdG1hY19zY2FuX3N5bmNybyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisKK2V4dGVybiBjb25zdCBsb25nIGllZWU4MDIxMV93bGFuX2ZyZXF1ZW5jaWVzW107CisKK2V4dGVybiBpbmxpbmUgdm9pZCBpZWVlODAyMTFfaW5jcmVtZW50X3NjYW5zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWllZWUtPnNjYW5zKys7Cit9CisKK2V4dGVybiBpbmxpbmUgaW50IGllZWU4MDIxMV9nZXRfc2NhbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJcmV0dXJuIGllZWUtPnNjYW5zOworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmVzY2FwZV9lc3NpZChjb25zdCBjaGFyICplc3NpZCwgdTggZXNzaWRfbGVuKSB7CisJc3RhdGljIGNoYXIgZXNjYXBlZFtJV19FU1NJRF9NQVhfU0laRSAqIDIgKyAxXTsKKwljb25zdCBjaGFyICpzID0gZXNzaWQ7CisJY2hhciAqZCA9IGVzY2FwZWQ7CisKKwlpZiAoaWVlZTgwMjExX2lzX2VtcHR5X2Vzc2lkKGVzc2lkLCBlc3NpZF9sZW4pKSB7CisJCW1lbWNweShlc2NhcGVkLCAiPGhpZGRlbj4iLCBzaXplb2YoIjxoaWRkZW4+IikpOworCQlyZXR1cm4gZXNjYXBlZDsKKwl9CisKKwllc3NpZF9sZW4gPSBtaW4oZXNzaWRfbGVuLCAodTgpSVdfRVNTSURfTUFYX1NJWkUpOworCXdoaWxlIChlc3NpZF9sZW4tLSkgeworCQlpZiAoKnMgPT0gJ1wwJykgeworCQkJKmQrKyA9ICdcXCc7CisJCQkqZCsrID0gJzAnOworCQkJcysrOworCQl9IGVsc2UgeworCQkJKmQrKyA9ICpzKys7CisJCX0KKwl9CisJKmQgPSAnXDAnOworCXJldHVybiBlc2NhcGVkOworfQorCisvKiBGb3IgdGhlIGZ1bmN0aW9uIGlzIG1vcmUgcmVsYXRlZCB0byBoYXJkd2FyZSBzZXR0aW5nLCBpdCdzIGJldHRlciB0byB1c2UgdGhlCisgKiBpZWVlIGhhbmRsZXIgdG8gcmVmZXIgdG8gaXQuCisgKi8KK2V4dGVybiBzaG9ydCBjaGVja19uaWNfZW5vdWdoX2Rlc2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHF1ZXVlX2luZGV4KTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX2RhdGFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3BhcnNlX2luZm9fcGFyYW0oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICppbmZvX2VsZW1lbnQsCisJCXUxNiBsZW5ndGgsCisJCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yaywKKwkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqc3RhdHMpOworCit2b2lkIGllZWU4MDIxMV9pbmRpY2F0ZV9wYWNrZXRzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaWVlZTgwMjExX3J4YioqIHByeGJJbmRpY2F0ZUFycmF5LHU4ICBpbmRleCk7CisjZGVmaW5lIFJUX0FTT0NfUkVUUllfTElNSVQJNQorI2VuZGlmIC8qIElFRUU4MDIxMV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjFlN2I5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuYwpAQCAtMCwwICsxLDI0NCBAQAorLyoKKyAqIEhvc3QgQVAgY3J5cHRvIHJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqIFBvcnRpb25zIENvcHlyaWdodCAoQykgMjAwNCwgSW50ZWwgQ29ycG9yYXRpb24gPGprZXRyZW5vQGxpbnV4LmludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisvLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKworTU9EVUxFX0FVVEhPUigiSm91bmkgTWFsaW5lbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJIb3N0QVAgY3J5cHRvIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzOworfTsKKworCitzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0byB7CisJc3RydWN0IGxpc3RfaGVhZCBhbGdzOworCXNwaW5sb2NrX3QgbG9jazsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0byAqaGNyeXB0OworCit2b2lkIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfZW50cmllcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkJICAgaW50IGZvcmNlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm47CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICplbnRyeTsKKworCWZvciAocHRyID0gaWVlZS0+Y3J5cHRfZGVpbml0X2xpc3QubmV4dCwgbiA9IHB0ci0+bmV4dDsKKwkgICAgIHB0ciAhPSAmaWVlZS0+Y3J5cHRfZGVpbml0X2xpc3Q7IHB0ciA9IG4sIG4gPSBwdHItPm5leHQpIHsKKwkJZW50cnkgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhLCBsaXN0KTsKKworCQlpZiAoYXRvbWljX3JlYWQoJmVudHJ5LT5yZWZjbnQpICE9IDAgJiYgIWZvcmNlKQorCQkJY29udGludWU7CisKKwkJbGlzdF9kZWwocHRyKTsKKworCQlpZiAoZW50cnktPm9wcykKKwkJCWVudHJ5LT5vcHMtPmRlaW5pdChlbnRyeS0+cHJpdik7CisJCWtmcmVlKGVudHJ5KTsKKwl9Cit9CisKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqKWRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzKGllZWUsIDApOworCWlmICghbGlzdF9lbXB0eSgmaWVlZS0+Y3J5cHRfZGVpbml0X2xpc3QpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZW50cmllcyByZW1haW5pbmcgaW4gZGVsYXllZCBjcnlwdCAiCisJCSAgICAgICAiZGVsZXRpb24gbGlzdFxuIiwgaWVlZS0+ZGV2LT5uYW1lKTsKKwkJaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisJCWFkZF90aW1lcigmaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCit9CisKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKnRtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCpjcnlwdCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwl0bXAgPSAqY3J5cHQ7CisJKmNyeXB0ID0gTlVMTDsKKworCS8qIG11c3Qgbm90IHJ1biBvcHMtPmRlaW5pdCgpIHdoaWxlIHRoZXJlIG1heSBiZSBwZW5kaW5nIGVuY3J5cHQgb3IKKwkgKiBkZWNyeXB0IG9wZXJhdGlvbnMuIFVzZSBhIGxpc3Qgb2YgZGVsYXllZCBkZWluaXRzIHRvIGF2b2lkIG5lZWRpbmcKKwkgKiBsb2NraW5nLiAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZCgmdG1wLT5saXN0LCAmaWVlZS0+Y3J5cHRfZGVpbml0X2xpc3QpOworCWlmICghdGltZXJfcGVuZGluZygmaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyKSkgeworCQlpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKwkJYWRkX3RpbWVyKCZpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7Cit9CisKK2ludCBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcyhzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqYWxnOworCisJaWYgKGhjcnlwdCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlhbGcgPSBrbWFsbG9jKHNpemVvZigqYWxnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGFsZyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChhbGcsIDAsIHNpemVvZigqYWxnKSk7CisJYWxnLT5vcHMgPSBvcHM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGNyeXB0LT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGQoJmFsZy0+bGlzdCwgJmhjcnlwdC0+YWxncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGNyeXB0LT5sb2NrLCBmbGFncyk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0OiByZWdpc3RlcmVkIGFsZ29yaXRobSAnJXMnXG4iLAorCSAgICAgICBvcHMtPm5hbWUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqZGVsX2FsZyA9IE5VTEw7CisKKwlpZiAoaGNyeXB0ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoY3J5cHQtPmxvY2ssIGZsYWdzKTsKKwlmb3IgKHB0ciA9IGhjcnlwdC0+YWxncy5uZXh0OyBwdHIgIT0gJmhjcnlwdC0+YWxnczsgcHRyID0gcHRyLT5uZXh0KSB7CisJCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqYWxnID0KKwkJCShzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKikgcHRyOworCQlpZiAoYWxnLT5vcHMgPT0gb3BzKSB7CisJCQlsaXN0X2RlbCgmYWxnLT5saXN0KTsKKwkJCWRlbF9hbGcgPSBhbGc7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoY3J5cHQtPmxvY2ssIGZsYWdzKTsKKworCWlmIChkZWxfYWxnKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHQ6IHVucmVnaXN0ZXJlZCBhbGdvcml0aG0gIgorCQkgICAgICAgIiclcydcbiIsIG9wcy0+bmFtZSk7CisJCWtmcmVlKGRlbF9hbGcpOworCX0KKworCXJldHVybiBkZWxfYWxnID8gMCA6IC0xOworfQorCisKK3N0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqIGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhjb25zdCBjaGFyICpuYW1lKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqZm91bmRfYWxnID0gTlVMTDsKKworCWlmIChoY3J5cHQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGNyeXB0LT5sb2NrLCBmbGFncyk7CisJZm9yIChwdHIgPSBoY3J5cHQtPmFsZ3MubmV4dDsgcHRyICE9ICZoY3J5cHQtPmFsZ3M7IHB0ciA9IHB0ci0+bmV4dCkgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKmFsZyA9CisJCQkoc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICopIHB0cjsKKwkJaWYgKHN0cmNtcChhbGctPm9wcy0+bmFtZSwgbmFtZSkgPT0gMCkgeworCQkJZm91bmRfYWxnID0gYWxnOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGNyeXB0LT5sb2NrLCBmbGFncyk7CisKKwlpZiAoZm91bmRfYWxnKQorCQlyZXR1cm4gZm91bmRfYWxnLT5vcHM7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgdm9pZCAqIGllZWU4MDIxMV9jcnlwdF9udWxsX2luaXQoaW50IGtleWlkeCkgeyByZXR1cm4gKHZvaWQgKikgMTsgfQorc3RhdGljIHZvaWQgaWVlZTgwMjExX2NyeXB0X251bGxfZGVpbml0KHZvaWQgKnByaXYpIHt9CisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgaWVlZTgwMjExX2NyeXB0X251bGwgPSB7CisJLm5hbWUJCQk9ICJOVUxMIiwKKwkuaW5pdAkJCT0gaWVlZTgwMjExX2NyeXB0X251bGxfaW5pdCwKKwkuZGVpbml0CQkJPSBpZWVlODAyMTFfY3J5cHRfbnVsbF9kZWluaXQsCisJLmVuY3J5cHRfbXBkdQkJPSBOVUxMLAorCS5kZWNyeXB0X21wZHUJCT0gTlVMTCwKKwkuZW5jcnlwdF9tc2R1CQk9IE5VTEwsCisJLmRlY3J5cHRfbXNkdQkJPSBOVUxMLAorCS5zZXRfa2V5CQk9IE5VTEwsCisJLmdldF9rZXkJCT0gTlVMTCwKKwkuZXh0cmFfcHJlZml4X2xlbgk9IDAsCisJLmV4dHJhX3Bvc3RmaXhfbGVuCT0gMCwKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorfTsKKworaW50IF9faW5pdCBpZWVlODAyMTFfY3J5cHRvX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gLUVOT01FTTsKKworCWhjcnlwdCA9IGttYWxsb2Moc2l6ZW9mKCpoY3J5cHQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhjcnlwdCkKKwkJZ290byBvdXQ7CisKKwltZW1zZXQoaGNyeXB0LCAwLCBzaXplb2YoKmhjcnlwdCkpOworCUlOSVRfTElTVF9IRUFEKCZoY3J5cHQtPmFsZ3MpOworCXNwaW5fbG9ja19pbml0KCZoY3J5cHQtPmxvY2spOworCisJcmV0ID0gaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF9udWxsKTsKKwlpZiAocmV0IDwgMCkgeworCQlrZnJlZShoY3J5cHQpOworCQloY3J5cHQgPSBOVUxMOworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIF9fZXhpdCBpZWVlODAyMTFfY3J5cHRvX2RlaW5pdCh2b2lkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm47CisKKwlpZiAoaGNyeXB0ID09IE5VTEwpCisJCXJldHVybjsKKworCWZvciAocHRyID0gaGNyeXB0LT5hbGdzLm5leHQsIG4gPSBwdHItPm5leHQ7IHB0ciAhPSAmaGNyeXB0LT5hbGdzOworCSAgICAgcHRyID0gbiwgbiA9IHB0ci0+bmV4dCkgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKmFsZyA9CisJCQkoc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICopIHB0cjsKKwkJbGlzdF9kZWwocHRyKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdDogdW5yZWdpc3RlcmVkIGFsZ29yaXRobSAiCisJCSAgICAgICAiJyVzJyAoZGVpbml0KVxuIiwgYWxnLT5vcHMtPm5hbWUpOworCQlrZnJlZShhbGcpOworCX0KKworCWtmcmVlKGhjcnlwdCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNThhM2JjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogT3JpZ2luYWwgY29kZSBiYXNlZCBvbiBIb3N0IEFQIChzb2Z0d2FyZSB3aXJlbGVzcyBMQU4gYWNjZXNzIHBvaW50KSBkcml2ZXIKKyAqIGZvciBJbnRlcnNpbCBQcmlzbTIvMi41LzMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgKiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBBZGFwdGlvbiB0byBhIGdlbmVyaWMgSUVFRSA4MDIuMTEgc3RhY2sgYnkgSmFtZXMgS2V0cmVub3MKKyAqIDxqa2V0cmVub0BsaW51eC5pbnRlbC5jb20+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgdG8gdGhlIGllZWU4MDIxMSBjcnlwdG8gbW9kdWxlLgorICovCisjaWZuZGVmIElFRUU4MDIxMV9DUllQVF9ICisjZGVmaW5lIElFRUU4MDIxMV9DUllQVF9ICisKKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzIHsKKwljb25zdCBjaGFyICpuYW1lOworCisJLyogaW5pdCBuZXcgY3J5cHRvIGNvbnRleHQgKGUuZy4sIGFsbG9jYXRlIHByaXZhdGUgZGF0YSBzcGFjZSwKKwkgKiBzZWxlY3QgSVYsIGV0Yy4pOyByZXR1cm5zIE5VTEwgb24gZmFpbHVyZSBvciBwb2ludGVyIHRvIGFsbG9jYXRlZAorCSAqIHByaXZhdGUgZGF0YSBvbiBzdWNjZXNzICovCisJdm9pZCAqICgqaW5pdCkoaW50IGtleWlkeCk7CisKKwkvKiBkZWluaXRpYWxpemUgY3J5cHRvIGNvbnRleHQgYW5kIGZyZWUgYWxsb2NhdGVkIHByaXZhdGUgZGF0YSAqLworCXZvaWQgKCpkZWluaXQpKHZvaWQgKnByaXYpOworCisJLyogZW5jcnlwdC9kZWNyeXB0IHJldHVybiA8IDAgb24gZXJyb3Igb3IgPj0gMCBvbiBzdWNjZXNzLiBUaGUgcmV0dXJuCisJICogdmFsdWUgZnJvbSBkZWNyeXB0X21wZHUgaXMgcGFzc2VkIGFzIHRoZSBrZXlpZHggdmFsdWUgZm9yCisJICogZGVjcnlwdF9tc2R1LiBza2IgbXVzdCBoYXZlIGVub3VnaCBoZWFkIGFuZCB0YWlsIHJvb20gZm9yIHRoZQorCSAqIGVuY3J5cHRpb247IGlmIG5vdCwgZXJyb3Igd2lsbCBiZSByZXR1cm5lZDsgdGhlc2UgZnVuY3Rpb25zIGFyZQorCSAqIGNhbGxlZCBmb3IgYWxsIE1QRFVzIChpLmUuLCBmcmFnbWVudHMpLgorCSAqLworCWludCAoKmVuY3J5cHRfbXBkdSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpOworCWludCAoKmRlY3J5cHRfbXBkdSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpOworCisJLyogVGhlc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgZm9yIGZ1bGwgTVNEVXMsIGkuZS4gZnVsbCBmcmFtZXMuCisJICogVGhlc2UgY2FuIGJlIE5VTEwgaWYgZnVsbCBNU0RVIG9wZXJhdGlvbnMgYXJlIG5vdCBuZWVkZWQuICovCisJaW50ICgqZW5jcnlwdF9tc2R1KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdik7CisJaW50ICgqZGVjcnlwdF9tc2R1KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQga2V5aWR4LCBpbnQgaGRyX2xlbiwKKwkJCSAgICB2b2lkICpwcml2KTsKKworCWludCAoKnNldF9rZXkpKHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdik7CisJaW50ICgqZ2V0X2tleSkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KTsKKworCS8qIHByb2NmcyBoYW5kbGVyIGZvciBwcmludGluZyBvdXQga2V5IGluZm9ybWF0aW9uIGFuZCBwb3NzaWJsZQorCSAqIHN0YXRpc3RpY3MgKi8KKwljaGFyICogKCpwcmludF9zdGF0cykoY2hhciAqcCwgdm9pZCAqcHJpdik7CisKKwkvKiBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBhZGRlZCBieSBlbmNyeXB0aW9uOyBlbmNyeXB0IGJ1ZiBpcworCSAqIGFsbG9jYXRlZCB3aXRoIGV4dHJhX3ByZWZpeF9sZW4gYnl0ZXMsIGNvcHkgb2YgaW5fYnVmLCBhbmQKKwkgKiBleHRyYV9wb3N0Zml4X2xlbjsgZW5jcnlwdCBuZWVkIG5vdCB1c2UgYWxsIHRoaXMgc3BhY2UsIGJ1dAorCSAqIHRoZSByZXN1bHQgbXVzdCBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgYW5kIGNvcnJlY3QKKwkgKiBsZW5ndGggbXVzdCBiZSByZXR1cm5lZCAqLworCWludCBleHRyYV9wcmVmaXhfbGVuLCBleHRyYV9wb3N0Zml4X2xlbjsKKworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworfTsKKworc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7IC8qIGRlbGF5ZWQgZGVsZXRpb24gbGlzdCAqLworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzOworCXZvaWQgKnByaXY7CisJYXRvbWljX3QgcmVmY250OworfTsKKworaW50IGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzKTsKK2ludCBpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzKTsKK3N0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqIGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICosIGludCk7Cit2b2lkIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfaGFuZGxlcih1bnNpZ25lZCBsb25nKTsKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfY2NtcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfY2NtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMzNiZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLmMKQEAgLTAsMCArMSw0ODAgQEAKKy8qCisgKiBIb3N0IEFQIGNyeXB0OiBob3N0LWJhc2VkIENDTVAgZW5jcnlwdGlvbiBpbXBsZW1lbnRhdGlvbiBmb3IgSG9zdCBBUCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCwgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKworI2luY2x1ZGUgImllZWU4MDIxMS5oIgorCisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisgICAgI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisKK01PRFVMRV9BVVRIT1IoIkpvdW5pIE1hbGluZW4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSG9zdCBBUCBjcnlwdDogQ0NNUCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIEFFU19CTE9DS19MRU4gMTYKKyNkZWZpbmUgQ0NNUF9IRFJfTEVOIDgKKyNkZWZpbmUgQ0NNUF9NSUNfTEVOIDgKKyNkZWZpbmUgQ0NNUF9US19MRU4gMTYKKyNkZWZpbmUgQ0NNUF9QTl9MRU4gNgorCitzdHJ1Y3QgaWVlZTgwMjExX2NjbXBfZGF0YSB7CisJdTgga2V5W0NDTVBfVEtfTEVOXTsKKwlpbnQga2V5X3NldDsKKworCXU4IHR4X3BuW0NDTVBfUE5fTEVOXTsKKwl1OCByeF9wbltDQ01QX1BOX0xFTl07CisKKwl1MzIgZG90MTFSU05BU3RhdHNDQ01QRm9ybWF0RXJyb3JzOworCXUzMiBkb3QxMVJTTkFTdGF0c0NDTVBSZXBsYXlzOworCXUzMiBkb3QxMVJTTkFTdGF0c0NDTVBEZWNyeXB0RXJyb3JzOworCisJaW50IGtleV9pZHg7CisKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtOworCisJLyogc2NyYXRjaCBidWZmZXJzIGZvciB2aXJ0X3RvX3BhZ2UoKSAoY3J5cHRvIEFQSSkgKi8KKwl1OCB0eF9iMFtBRVNfQkxPQ0tfTEVOXSwgdHhfYltBRVNfQkxPQ0tfTEVOXSwKKwkJdHhfZVtBRVNfQkxPQ0tfTEVOXSwgdHhfczBbQUVTX0JMT0NLX0xFTl07CisJdTggcnhfYjBbQUVTX0JMT0NLX0xFTl0sIHJ4X2JbQUVTX0JMT0NLX0xFTl0sIHJ4X2FbQUVTX0JMT0NLX0xFTl07Cit9OworCit2b2lkIGllZWU4MDIxMV9jY21wX2Flc19lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCQkgICAgIGNvbnN0IHU4IHB0WzE2XSwgdTggY3RbMTZdKQoreworCWNyeXB0b19jaXBoZXJfZW5jcnlwdF9vbmUoKHZvaWQqKXRmbSwgY3QsIHB0KTsKK30KKworc3RhdGljIHZvaWQgKiBpZWVlODAyMTFfY2NtcF9pbml0KGludCBrZXlfaWR4KQoreworCXN0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhICpwcml2OworCisJcHJpdiA9IGttYWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0FUT01JQyk7CisJaWYgKHByaXYgPT0gTlVMTCkKKwkJZ290byBmYWlsOworCW1lbXNldChwcml2LCAwLCBzaXplb2YoKnByaXYpKTsKKwlwcml2LT5rZXlfaWR4ID0ga2V5X2lkeDsKKworICAgICAgIHByaXYtPnRmbSA9ICh2b2lkKiljcnlwdG9fYWxsb2NfY2lwaGVyKCJhZXMiLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKHByaXYtPnRmbSkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF9jY21wOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImNyeXB0byBBUEkgYWVzXG4iKTsKKwkJcHJpdi0+dGZtID0gTlVMTDsKKwkJZ290byBmYWlsOworCX0KKworCXJldHVybiBwcml2OworCitmYWlsOgorCWlmIChwcml2KSB7CisJCWlmIChwcml2LT50Zm0pCisJCQljcnlwdG9fZnJlZV9jaXBoZXIoKHZvaWQqKXByaXYtPnRmbSk7CisJCWtmcmVlKHByaXYpOworCX0KKworCXJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9jY21wX2RlaW5pdCh2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhICpfcHJpdiA9IHByaXY7CisKKwlpZiAoX3ByaXYgJiYgX3ByaXYtPnRmbSkKKwkJY3J5cHRvX2ZyZWVfY2lwaGVyKCh2b2lkKilfcHJpdi0+dGZtKTsKKwlrZnJlZShwcml2KTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgeG9yX2Jsb2NrKHU4ICpiLCB1OCAqYSwgc2l6ZV90IGxlbikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCWJbaV0gXj0gYVtpXTsKK30KKworCisKK3N0YXRpYyB2b2lkIGNjbXBfaW5pdF9ibG9ja3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkciwKKwkJCSAgICAgdTggKnBuLCBzaXplX3QgZGxlbiwgdTggKmIwLCB1OCAqYXV0aCwKKwkJCSAgICAgdTggKnMwKQoreworCXU4ICpwb3MsIHFjID0gMDsKKwlzaXplX3QgYWFkX2xlbjsKKwl1MTYgZmM7CisJaW50IGE0X2luY2x1ZGVkLCBxY19pbmNsdWRlZDsKKwl1OCBhYWRbMiAqIEFFU19CTE9DS19MRU5dOworCisJZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisJYTRfaW5jbHVkZWQgPSAoKGZjICYgKElFRUU4MDIxMV9GQ1RMX1RPRFMgfCBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKSA9PQorCQkgICAgICAgKElFRUU4MDIxMV9GQ1RMX1RPRFMgfCBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKTsKKwkvKgorCXFjX2luY2x1ZGVkID0gKChXTEFOX0ZDX0dFVF9UWVBFKGZjKSA9PSBJRUVFODAyMTFfRlRZUEVfREFUQSkgJiYKKwkJICAgICAgIChXTEFOX0ZDX0dFVF9TVFlQRShmYykgJiAweDA4KSk7CisJKi8KKwkvLyBmaXhlZCBieSBEYXZpZCA6MjAwNi45LjYKKwlxY19pbmNsdWRlZCA9ICgoV0xBTl9GQ19HRVRfVFlQRShmYykgPT0gSUVFRTgwMjExX0ZUWVBFX0RBVEEpICYmCisJCSAgICAgICAoV0xBTl9GQ19HRVRfU1RZUEUoZmMpICYgMHg4MCkpOworCWFhZF9sZW4gPSAyMjsKKwlpZiAoYTRfaW5jbHVkZWQpCisJCWFhZF9sZW4gKz0gNjsKKwlpZiAocWNfaW5jbHVkZWQpIHsKKwkJcG9zID0gKHU4ICopICZoZHItPmFkZHI0OworCQlpZiAoYTRfaW5jbHVkZWQpCisJCQlwb3MgKz0gNjsKKwkJcWMgPSAqcG9zICYgMHgwZjsKKwkJYWFkX2xlbiArPSAyOworCX0KKwkvKiBDQ00gSW5pdGlhbCBCbG9jazoKKwkgKiBGbGFnIChJbmNsdWRlIGF1dGhlbnRpY2F0aW9uIGhlYWRlciwgTT0zICg4LW9jdGV0IE1JQyksCisJICogICAgICAgTD0xICgyLW9jdGV0IERsZW4pKQorCSAqIE5vbmNlOiAweDAwIHwgQTIgfCBQTgorCSAqIERsZW4gKi8KKwliMFswXSA9IDB4NTk7CisJYjBbMV0gPSBxYzsKKwltZW1jcHkoYjAgKyAyLCBoZHItPmFkZHIyLCBFVEhfQUxFTik7CisJbWVtY3B5KGIwICsgOCwgcG4sIENDTVBfUE5fTEVOKTsKKwliMFsxNF0gPSAoZGxlbiA+PiA4KSAmIDB4ZmY7CisJYjBbMTVdID0gZGxlbiAmIDB4ZmY7CisKKwkvKiBBQUQ6CisJICogRkMgd2l0aCBiaXRzIDQuLjYgYW5kIDExLi4xMyBtYXNrZWQgdG8gemVybzsgMTQgaXMgYWx3YXlzIG9uZQorCSAqIEExIHwgQTIgfCBBMworCSAqIFNDIHdpdGggYml0cyA0Li4xNSAoc2VxIykgbWFza2VkIHRvIHplcm8KKwkgKiBBNCAoaWYgcHJlc2VudCkKKwkgKiBRQyAoaWYgcHJlc2VudCkKKwkgKi8KKwlwb3MgPSAodTggKikgaGRyOworCWFhZFswXSA9IDA7IC8qIGFhZF9sZW4gPj4gOCAqLworCWFhZFsxXSA9IGFhZF9sZW4gJiAweGZmOworCWFhZFsyXSA9IHBvc1swXSAmIDB4OGY7CisJYWFkWzNdID0gcG9zWzFdICYgMHhjNzsKKwltZW1jcHkoYWFkICsgNCwgaGRyLT5hZGRyMSwgMyAqIEVUSF9BTEVOKTsKKwlwb3MgPSAodTggKikgJmhkci0+c2VxX2N0bDsKKwlhYWRbMjJdID0gcG9zWzBdICYgMHgwZjsKKwlhYWRbMjNdID0gMDsgLyogYWxsIGJpdHMgbWFza2VkICovCisJbWVtc2V0KGFhZCArIDI0LCAwLCA4KTsKKwlpZiAoYTRfaW5jbHVkZWQpCisJCW1lbWNweShhYWQgKyAyNCwgaGRyLT5hZGRyNCwgRVRIX0FMRU4pOworCWlmIChxY19pbmNsdWRlZCkgeworCQlhYWRbYTRfaW5jbHVkZWQgPyAzMCA6IDI0XSA9IHFjOworCQkvKiByZXN0IG9mIFFDIG1hc2tlZCAqLworCX0KKworCS8qIFN0YXJ0IHdpdGggdGhlIGZpcnN0IGJsb2NrIGFuZCBBQUQgKi8KKwlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdCh0Zm0sIGIwLCBhdXRoKTsKKwl4b3JfYmxvY2soYXV0aCwgYWFkLCBBRVNfQkxPQ0tfTEVOKTsKKwlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdCh0Zm0sIGF1dGgsIGF1dGgpOworCXhvcl9ibG9jayhhdXRoLCAmYWFkW0FFU19CTE9DS19MRU5dLCBBRVNfQkxPQ0tfTEVOKTsKKwlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdCh0Zm0sIGF1dGgsIGF1dGgpOworCWIwWzBdICY9IDB4MDc7CisJYjBbMTRdID0gYjBbMTVdID0gMDsKKwlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdCh0Zm0sIGIwLCBzMCk7Cit9CisKKworCitzdGF0aWMgaW50IGllZWU4MDIxMV9jY21wX2VuY3J5cHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9jY21wX2RhdGEgKmtleSA9IHByaXY7CisJaW50IGRhdGFfbGVuLCBpOworCXU4ICpwb3M7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkcjsKKwljYl9kZXNjICp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisKKwlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCBDQ01QX0hEUl9MRU4gfHwKKwkgICAgc2tiX3RhaWxyb29tKHNrYikgPCBDQ01QX01JQ19MRU4gfHwKKwkgICAgc2tiLT5sZW4gPCBoZHJfbGVuKQorCQlyZXR1cm4gLTE7CisKKwlkYXRhX2xlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbjsKKwlwb3MgPSBza2JfcHVzaChza2IsIENDTVBfSERSX0xFTik7CisJbWVtbW92ZShwb3MsIHBvcyArIENDTVBfSERSX0xFTiwgaGRyX2xlbik7CisJcG9zICs9IGhkcl9sZW47CisvLwltaWMgPSBza2JfcHV0KHNrYiwgQ0NNUF9NSUNfTEVOKTsKKworCWkgPSBDQ01QX1BOX0xFTiAtIDE7CisJd2hpbGUgKGkgPj0gMCkgeworCQlrZXktPnR4X3BuW2ldKys7CisJCWlmIChrZXktPnR4X3BuW2ldICE9IDApCisJCQlicmVhazsKKwkJaS0tOworCX0KKworCSpwb3MrKyA9IGtleS0+dHhfcG5bNV07CisJKnBvcysrID0ga2V5LT50eF9wbls0XTsKKwkqcG9zKysgPSAwOworCSpwb3MrKyA9IChrZXktPmtleV9pZHggPDwgNikgfCAoMSA8PCA1KSAvKiBFeHQgSVYgaW5jbHVkZWQgKi87CisJKnBvcysrID0ga2V5LT50eF9wblszXTsKKwkqcG9zKysgPSBrZXktPnR4X3BuWzJdOworCSpwb3MrKyA9IGtleS0+dHhfcG5bMV07CisJKnBvcysrID0ga2V5LT50eF9wblswXTsKKworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKKwlpZiAoIXRjYl9kZXNjLT5iSHdTZWMpCisJeworCQlpbnQgYmxvY2tzLCBsYXN0LCBsZW47CisJCXU4ICptaWM7CisJCXU4ICpiMCA9IGtleS0+dHhfYjA7CisJCXU4ICpiID0ga2V5LT50eF9iOworCQl1OCAqZSA9IGtleS0+dHhfZTsKKwkJdTggKnMwID0ga2V5LT50eF9zMDsKKworCQkvL21pYyBpcyBtb3ZlZCB0byBoZXJlIGJ5IGpvaG4KKwkJbWljID0gc2tiX3B1dChza2IsIENDTVBfTUlDX0xFTik7CisKKwkJY2NtcF9pbml0X2Jsb2NrcyhrZXktPnRmbSwgaGRyLCBrZXktPnR4X3BuLCBkYXRhX2xlbiwgYjAsIGIsIHMwKTsKKworCQlibG9ja3MgPSAoZGF0YV9sZW4gKyBBRVNfQkxPQ0tfTEVOIC0gMSkgLyBBRVNfQkxPQ0tfTEVOOworCQlsYXN0ID0gZGF0YV9sZW4gJSBBRVNfQkxPQ0tfTEVOOworCisJCWZvciAoaSA9IDE7IGkgPD0gYmxvY2tzOyBpKyspIHsKKwkJCWxlbiA9IChpID09IGJsb2NrcyAmJiBsYXN0KSA/IGxhc3QgOiBBRVNfQkxPQ0tfTEVOOworCQkJLyogQXV0aGVudGljYXRpb24gKi8KKwkJCXhvcl9ibG9jayhiLCBwb3MsIGxlbik7CisJCQlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdChrZXktPnRmbSwgYiwgYik7CisJCQkvKiBFbmNyeXB0aW9uLCB3aXRoIGNvdW50ZXIgKi8KKwkJCWIwWzE0XSA9IChpID4+IDgpICYgMHhmZjsKKwkJCWIwWzE1XSA9IGkgJiAweGZmOworCQkJaWVlZTgwMjExX2NjbXBfYWVzX2VuY3J5cHQoa2V5LT50Zm0sIGIwLCBlKTsKKwkJCXhvcl9ibG9jayhwb3MsIGUsIGxlbik7CisJCQlwb3MgKz0gbGVuOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IENDTVBfTUlDX0xFTjsgaSsrKQorCQkJbWljW2ldID0gYltpXSBeIHMwW2ldOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGllZWU4MDIxMV9jY21wX2RlY3J5cHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9jY21wX2RhdGEgKmtleSA9IHByaXY7CisJdTgga2V5aWR4LCAqcG9zOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZHI7CisJY2JfZGVzYyAqdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKShza2ItPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOworCXU4IHBuWzZdOworCisJaWYgKHNrYi0+bGVuIDwgaGRyX2xlbiArIENDTVBfSERSX0xFTiArIENDTVBfTUlDX0xFTikgeworCQlrZXktPmRvdDExUlNOQVN0YXRzQ0NNUEZvcm1hdEVycm9ycysrOworCQlyZXR1cm4gLTE7CisJfQorCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKKwlwb3MgPSBza2ItPmRhdGEgKyBoZHJfbGVuOworCWtleWlkeCA9IHBvc1szXTsKKwlpZiAoIShrZXlpZHggJiAoMSA8PCA1KSkpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkNDTVA6IHJlY2VpdmVkIHBhY2tldCB3aXRob3V0IEV4dElWIgorCQkJICAgICAgICIgZmxhZyBmcm9tICIgTUFDX0ZNVCAiXG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpKTsKKwkJfQorCQlrZXktPmRvdDExUlNOQVN0YXRzQ0NNUEZvcm1hdEVycm9ycysrOworCQlyZXR1cm4gLTI7CisJfQorCWtleWlkeCA+Pj0gNjsKKwlpZiAoa2V5LT5rZXlfaWR4ICE9IGtleWlkeCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiQ0NNUDogUlggdGtleS0+a2V5X2lkeD0lZCBmcmFtZSAiCisJCSAgICAgICAia2V5aWR4PSVkIHByaXY9JXBcbiIsIGtleS0+a2V5X2lkeCwga2V5aWR4LCBwcml2KTsKKwkJcmV0dXJuIC02OworCX0KKwlpZiAoIWtleS0+a2V5X3NldCkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiQ0NNUDogcmVjZWl2ZWQgcGFja2V0IGZyb20gIiBNQUNfRk1UCisJCQkgICAgICAgIiB3aXRoIGtleWlkPSVkIHRoYXQgZG9lcyBub3QgaGF2ZSBhIGNvbmZpZ3VyZWQiCisJCQkgICAgICAgIiBrZXlcbiIsIE1BQ19BUkcoaGRyLT5hZGRyMiksIGtleWlkeCk7CisJCX0KKwkJcmV0dXJuIC0zOworCX0KKworCXBuWzBdID0gcG9zWzddOworCXBuWzFdID0gcG9zWzZdOworCXBuWzJdID0gcG9zWzVdOworCXBuWzNdID0gcG9zWzRdOworCXBuWzRdID0gcG9zWzFdOworCXBuWzVdID0gcG9zWzBdOworCXBvcyArPSA4OworCisJaWYgKG1lbWNtcChwbiwga2V5LT5yeF9wbiwgQ0NNUF9QTl9MRU4pIDw9IDApIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkNDTVA6IHJlcGxheSBkZXRlY3RlZDogU1RBPSIgTUFDX0ZNVAorCQkJICAgICAgICIgcHJldmlvdXMgUE4gJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJCSAgICAgICAicmVjZWl2ZWQgUE4gJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLAorCQkJICAgICAgIE1BQ19BUkcoaGRyLT5hZGRyMiksIE1BQ19BUkcoa2V5LT5yeF9wbiksCisJCQkgICAgICAgTUFDX0FSRyhwbikpOworCQl9CisJCWtleS0+ZG90MTFSU05BU3RhdHNDQ01QUmVwbGF5cysrOworCQlyZXR1cm4gLTQ7CisJfQorCWlmICghdGNiX2Rlc2MtPmJId1NlYykKKwl7CisJCXNpemVfdCBkYXRhX2xlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbiAtIENDTVBfSERSX0xFTiAtIENDTVBfTUlDX0xFTjsKKwkJdTggKm1pYyA9IHNrYi0+ZGF0YSArIHNrYi0+bGVuIC0gQ0NNUF9NSUNfTEVOOworCQl1OCAqYjAgPSBrZXktPnJ4X2IwOworCQl1OCAqYiA9IGtleS0+cnhfYjsKKwkJdTggKmEgPSBrZXktPnJ4X2E7CisJCWludCBpLCBibG9ja3MsIGxhc3QsIGxlbjsKKworCisJCWNjbXBfaW5pdF9ibG9ja3Moa2V5LT50Zm0sIGhkciwgcG4sIGRhdGFfbGVuLCBiMCwgYSwgYik7CisJCXhvcl9ibG9jayhtaWMsIGIsIENDTVBfTUlDX0xFTik7CisKKwkJYmxvY2tzID0gKGRhdGFfbGVuICsgQUVTX0JMT0NLX0xFTiAtIDEpIC8gQUVTX0JMT0NLX0xFTjsKKwkJbGFzdCA9IGRhdGFfbGVuICUgQUVTX0JMT0NLX0xFTjsKKworCQlmb3IgKGkgPSAxOyBpIDw9IGJsb2NrczsgaSsrKSB7CisJCQlsZW4gPSAoaSA9PSBibG9ja3MgJiYgbGFzdCkgPyBsYXN0IDogQUVTX0JMT0NLX0xFTjsKKwkJCS8qIERlY3J5cHQsIHdpdGggY291bnRlciAqLworCQkJYjBbMTRdID0gKGkgPj4gOCkgJiAweGZmOworCQkJYjBbMTVdID0gaSAmIDB4ZmY7CisJCQlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdChrZXktPnRmbSwgYjAsIGIpOworCQkJeG9yX2Jsb2NrKHBvcywgYiwgbGVuKTsKKwkJCS8qIEF1dGhlbnRpY2F0aW9uICovCisJCQl4b3JfYmxvY2soYSwgcG9zLCBsZW4pOworCQkJaWVlZTgwMjExX2NjbXBfYWVzX2VuY3J5cHQoa2V5LT50Zm0sIGEsIGEpOworCQkJcG9zICs9IGxlbjsKKwkJfQorCisJCWlmIChtZW1jbXAobWljLCBhLCBDQ01QX01JQ19MRU4pICE9IDApIHsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiQ0NNUDogZGVjcnlwdCBmYWlsZWQ6IFNUQT0iCisJCQkJTUFDX0ZNVCAiXG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpKTsKKwkJCX0KKwkJCWtleS0+ZG90MTFSU05BU3RhdHNDQ01QRGVjcnlwdEVycm9ycysrOworCQkJcmV0dXJuIC01OworCQl9CisKKwkJbWVtY3B5KGtleS0+cnhfcG4sIHBuLCBDQ01QX1BOX0xFTik7CisJfQorCS8qIFJlbW92ZSBoZHIgYW5kIE1JQyAqLworCW1lbW1vdmUoc2tiLT5kYXRhICsgQ0NNUF9IRFJfTEVOLCBza2ItPmRhdGEsIGhkcl9sZW4pOworCXNrYl9wdWxsKHNrYiwgQ0NNUF9IRFJfTEVOKTsKKwlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gQ0NNUF9NSUNfTEVOKTsKKworCXJldHVybiBrZXlpZHg7Cit9CisKKworc3RhdGljIGludCBpZWVlODAyMTFfY2NtcF9zZXRfa2V5KHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NjbXBfZGF0YSAqZGF0YSA9IHByaXY7CisJaW50IGtleWlkeDsKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtID0gZGF0YS0+dGZtOworCisJa2V5aWR4ID0gZGF0YS0+a2V5X2lkeDsKKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKCpkYXRhKSk7CisJZGF0YS0+a2V5X2lkeCA9IGtleWlkeDsKKwlkYXRhLT50Zm0gPSB0Zm07CisJaWYgKGxlbiA9PSBDQ01QX1RLX0xFTikgeworCQltZW1jcHkoZGF0YS0+a2V5LCBrZXksIENDTVBfVEtfTEVOKTsKKwkJZGF0YS0+a2V5X3NldCA9IDE7CisJCWlmIChzZXEpIHsKKwkJCWRhdGEtPnJ4X3BuWzBdID0gc2VxWzVdOworCQkJZGF0YS0+cnhfcG5bMV0gPSBzZXFbNF07CisJCQlkYXRhLT5yeF9wblsyXSA9IHNlcVszXTsKKwkJCWRhdGEtPnJ4X3BuWzNdID0gc2VxWzJdOworCQkJZGF0YS0+cnhfcG5bNF0gPSBzZXFbMV07CisJCQlkYXRhLT5yeF9wbls1XSA9IHNlcVswXTsKKwkJfQorCQljcnlwdG9fY2lwaGVyX3NldGtleSgodm9pZCopZGF0YS0+dGZtLCBkYXRhLT5rZXksIENDTVBfVEtfTEVOKTsKKwl9IGVsc2UgaWYgKGxlbiA9PSAwKQorCQlkYXRhLT5rZXlfc2V0ID0gMDsKKwllbHNlCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX2NjbXBfZ2V0X2tleSh2b2lkICprZXksIGludCBsZW4sIHU4ICpzZXEsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9jY21wX2RhdGEgKmRhdGEgPSBwcml2OworCisJaWYgKGxlbiA8IENDTVBfVEtfTEVOKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoIWRhdGEtPmtleV9zZXQpCisJCXJldHVybiAwOworCW1lbWNweShrZXksIGRhdGEtPmtleSwgQ0NNUF9US19MRU4pOworCisJaWYgKHNlcSkgeworCQlzZXFbMF0gPSBkYXRhLT50eF9wbls1XTsKKwkJc2VxWzFdID0gZGF0YS0+dHhfcG5bNF07CisJCXNlcVsyXSA9IGRhdGEtPnR4X3BuWzNdOworCQlzZXFbM10gPSBkYXRhLT50eF9wblsyXTsKKwkJc2VxWzRdID0gZGF0YS0+dHhfcG5bMV07CisJCXNlcVs1XSA9IGRhdGEtPnR4X3BuWzBdOworCX0KKworCXJldHVybiBDQ01QX1RLX0xFTjsKK30KKworCitzdGF0aWMgY2hhciAqIGllZWU4MDIxMV9jY21wX3ByaW50X3N0YXRzKGNoYXIgKnAsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9jY21wX2RhdGEgKmNjbXAgPSBwcml2OworCXAgKz0gc3ByaW50ZihwLCAia2V5WyVkXSBhbGc9Q0NNUCBrZXlfc2V0PSVkICIKKwkJICAgICAidHhfcG49JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJICAgICAicnhfcG49JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJICAgICAiZm9ybWF0X2Vycm9ycz0lZCByZXBsYXlzPSVkIGRlY3J5cHRfZXJyb3JzPSVkXG4iLAorCQkgICAgIGNjbXAtPmtleV9pZHgsIGNjbXAtPmtleV9zZXQsCisJCSAgICAgTUFDX0FSRyhjY21wLT50eF9wbiksIE1BQ19BUkcoY2NtcC0+cnhfcG4pLAorCQkgICAgIGNjbXAtPmRvdDExUlNOQVN0YXRzQ0NNUEZvcm1hdEVycm9ycywKKwkJICAgICBjY21wLT5kb3QxMVJTTkFTdGF0c0NDTVBSZXBsYXlzLAorCQkgICAgIGNjbXAtPmRvdDExUlNOQVN0YXRzQ0NNUERlY3J5cHRFcnJvcnMpOworCisJcmV0dXJuIHA7Cit9CisKK3ZvaWQgaWVlZTgwMjExX2NjbXBfbnVsbCh2b2lkKQoreworLy8gICAgcHJpbnRrKCI9PT09PT09PT09PT0+JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgaWVlZTgwMjExX2NyeXB0X2NjbXAgPSB7CisJLm5hbWUJCQk9ICJDQ01QIiwKKwkuaW5pdAkJCT0gaWVlZTgwMjExX2NjbXBfaW5pdCwKKwkuZGVpbml0CQkJPSBpZWVlODAyMTFfY2NtcF9kZWluaXQsCisJLmVuY3J5cHRfbXBkdQkJPSBpZWVlODAyMTFfY2NtcF9lbmNyeXB0LAorCS5kZWNyeXB0X21wZHUJCT0gaWVlZTgwMjExX2NjbXBfZGVjcnlwdCwKKwkuZW5jcnlwdF9tc2R1CQk9IE5VTEwsCisJLmRlY3J5cHRfbXNkdQkJPSBOVUxMLAorCS5zZXRfa2V5CQk9IGllZWU4MDIxMV9jY21wX3NldF9rZXksCisJLmdldF9rZXkJCT0gaWVlZTgwMjExX2NjbXBfZ2V0X2tleSwKKwkucHJpbnRfc3RhdHMJCT0gaWVlZTgwMjExX2NjbXBfcHJpbnRfc3RhdHMsCisJLmV4dHJhX3ByZWZpeF9sZW4JPSBDQ01QX0hEUl9MRU4sCisJLmV4dHJhX3Bvc3RmaXhfbGVuCT0gQ0NNUF9NSUNfTEVOLAorCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCit9OworCitpbnQgX19pbml0IGllZWU4MDIxMV9jcnlwdG9fY2NtcF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfY2NtcCk7Cit9CisKK3ZvaWQgX19leGl0IGllZWU4MDIxMV9jcnlwdG9fY2NtcF9leGl0KHZvaWQpCit7CisJaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wcygmaWVlZTgwMjExX2NyeXB0X2NjbXApOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfdGtpcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfdGtpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MWI5OTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF90a2lwLmMKQEAgLTAsMCArMSw3ODAgQEAKKy8qCisgKiBIb3N0IEFQIGNyeXB0OiBob3N0LWJhc2VkIFRLSVAgZW5jcnlwdGlvbiBpbXBsZW1lbnRhdGlvbiBmb3IgSG9zdCBBUCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCwgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKworI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorCSNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisKK01PRFVMRV9BVVRIT1IoIkpvdW5pIE1hbGluZW4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSG9zdCBBUCBjcnlwdDogVEtJUCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSB7CisjZGVmaW5lIFRLSVBfS0VZX0xFTiAzMgorCXU4IGtleVtUS0lQX0tFWV9MRU5dOworCWludCBrZXlfc2V0OworCisJdTMyIHR4X2l2MzI7CisJdTE2IHR4X2l2MTY7CisJdTE2IHR4X3R0YWtbNV07CisJaW50IHR4X3BoYXNlMV9kb25lOworCisJdTMyIHJ4X2l2MzI7CisJdTE2IHJ4X2l2MTY7CisJdTE2IHJ4X3R0YWtbNV07CisJaW50IHJ4X3BoYXNlMV9kb25lOworCXUzMiByeF9pdjMyX25ldzsKKwl1MTYgcnhfaXYxNl9uZXc7CisKKwl1MzIgZG90MTFSU05BU3RhdHNUS0lQUmVwbGF5czsKKwl1MzIgZG90MTFSU05BU3RhdHNUS0lQSUNWRXJyb3JzOworCXUzMiBkb3QxMVJTTkFTdGF0c1RLSVBMb2NhbE1JQ0ZhaWx1cmVzOworCisJaW50IGtleV9pZHg7CisKKwlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqcnhfdGZtX2FyYzQ7CisJc3RydWN0IGNyeXB0b19oYXNoICpyeF90Zm1fbWljaGFlbDsKKwlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdHhfdGZtX2FyYzQ7CisJc3RydWN0IGNyeXB0b19oYXNoICp0eF90Zm1fbWljaGFlbDsKKworCS8qIHNjcmF0Y2ggYnVmZmVycyBmb3IgdmlydF90b19wYWdlKCkgKGNyeXB0byBBUEkpICovCisJdTggcnhfaGRyWzE2XSwgdHhfaGRyWzE2XTsKK307CisKK3N0YXRpYyB2b2lkICogaWVlZTgwMjExX3RraXBfaW5pdChpbnQga2V5X2lkeCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqcHJpdjsKKworCXByaXYgPSBrbWFsbG9jKHNpemVvZigqcHJpdiksIEdGUF9BVE9NSUMpOworCWlmIChwcml2ID09IE5VTEwpCisJCWdvdG8gZmFpbDsKKwltZW1zZXQocHJpdiwgMCwgc2l6ZW9mKCpwcml2KSk7CisJcHJpdi0+a2V5X2lkeCA9IGtleV9pZHg7CisKKwlwcml2LT50eF90Zm1fYXJjNCA9IGNyeXB0b19hbGxvY19ibGtjaXBoZXIoImVjYihhcmM0KSIsIDAsCisJCQlDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKHByaXYtPnR4X3RmbV9hcmM0KSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0X3RraXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCisJCQkJImNyeXB0byBBUEkgYXJjNFxuIik7CisJCXByaXYtPnR4X3RmbV9hcmM0ID0gTlVMTDsKKwkJZ290byBmYWlsOworCX0KKworCXByaXYtPnR4X3RmbV9taWNoYWVsID0gY3J5cHRvX2FsbG9jX2hhc2goIm1pY2hhZWxfbWljIiwgMCwKKwkJCUNSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIocHJpdi0+dHhfdGZtX21pY2hhZWwpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfdGtpcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJCQkiY3J5cHRvIEFQSSBtaWNoYWVsX21pY1xuIik7CisJCXByaXYtPnR4X3RmbV9taWNoYWVsID0gTlVMTDsKKwkJZ290byBmYWlsOworCX0KKworCXByaXYtPnJ4X3RmbV9hcmM0ID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigiZWNiKGFyYzQpIiwgMCwKKwkJCUNSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIocHJpdi0+cnhfdGZtX2FyYzQpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfdGtpcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJCQkiY3J5cHRvIEFQSSBhcmM0XG4iKTsKKwkJcHJpdi0+cnhfdGZtX2FyYzQgPSBOVUxMOworCQlnb3RvIGZhaWw7CisJfQorCisJcHJpdi0+cnhfdGZtX21pY2hhZWwgPSBjcnlwdG9fYWxsb2NfaGFzaCgibWljaGFlbF9taWMiLCAwLAorCQkJQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihwcml2LT5yeF90Zm1fbWljaGFlbCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF90a2lwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkJCSJjcnlwdG8gQVBJIG1pY2hhZWxfbWljXG4iKTsKKwkJcHJpdi0+cnhfdGZtX21pY2hhZWwgPSBOVUxMOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dXJuIHByaXY7CisKK2ZhaWw6CisJaWYgKHByaXYpIHsKKwkJaWYgKHByaXYtPnR4X3RmbV9taWNoYWVsKQorCQkJY3J5cHRvX2ZyZWVfaGFzaChwcml2LT50eF90Zm1fbWljaGFlbCk7CisJCWlmIChwcml2LT50eF90Zm1fYXJjNCkKKwkJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihwcml2LT50eF90Zm1fYXJjNCk7CisJCWlmIChwcml2LT5yeF90Zm1fbWljaGFlbCkKKwkJCWNyeXB0b19mcmVlX2hhc2gocHJpdi0+cnhfdGZtX21pY2hhZWwpOworCQlpZiAocHJpdi0+cnhfdGZtX2FyYzQpCisJCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIocHJpdi0+cnhfdGZtX2FyYzQpOworCQlrZnJlZShwcml2KTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfdGtpcF9kZWluaXQodm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqX3ByaXYgPSBwcml2OworCisJaWYgKF9wcml2KSB7CisJCWlmIChfcHJpdi0+dHhfdGZtX21pY2hhZWwpCisJCQljcnlwdG9fZnJlZV9oYXNoKF9wcml2LT50eF90Zm1fbWljaGFlbCk7CisJCWlmIChfcHJpdi0+dHhfdGZtX2FyYzQpCisJCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIoX3ByaXYtPnR4X3RmbV9hcmM0KTsKKwkJaWYgKF9wcml2LT5yeF90Zm1fbWljaGFlbCkKKwkJCWNyeXB0b19mcmVlX2hhc2goX3ByaXYtPnJ4X3RmbV9taWNoYWVsKTsKKwkJaWYgKF9wcml2LT5yeF90Zm1fYXJjNCkKKwkJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihfcHJpdi0+cnhfdGZtX2FyYzQpOworCX0KKwlrZnJlZShwcml2KTsKK30KKworCitzdGF0aWMgaW5saW5lIHUxNiBSb3RSMSh1MTYgdmFsKQoreworCXJldHVybiAodmFsID4+IDEpIHwgKHZhbCA8PCAxNSk7Cit9CisKKworc3RhdGljIGlubGluZSB1OCBMbzgodTE2IHZhbCkKK3sKKwlyZXR1cm4gdmFsICYgMHhmZjsKK30KKworCitzdGF0aWMgaW5saW5lIHU4IEhpOCh1MTYgdmFsKQoreworCXJldHVybiB2YWwgPj4gODsKK30KKworCitzdGF0aWMgaW5saW5lIHUxNiBMbzE2KHUzMiB2YWwpCit7CisJcmV0dXJuIHZhbCAmIDB4ZmZmZjsKK30KKworCitzdGF0aWMgaW5saW5lIHUxNiBIaTE2KHUzMiB2YWwpCit7CisJcmV0dXJuIHZhbCA+PiAxNjsKK30KKworCitzdGF0aWMgaW5saW5lIHUxNiBNazE2KHU4IGhpLCB1OCBsbykKK3sKKwlyZXR1cm4gbG8gfCAoKCh1MTYpIGhpKSA8PCA4KTsKK30KKworCitzdGF0aWMgaW5saW5lIHUxNiBNazE2X2xlKHUxNiAqdikKK3sKKwlyZXR1cm4gbGUxNl90b19jcHUoKnYpOworfQorCisKK3N0YXRpYyBjb25zdCB1MTYgU2JveFsyNTZdID0KK3sKKwkweEM2QTUsIDB4Rjg4NCwgMHhFRTk5LCAweEY2OEQsIDB4RkYwRCwgMHhENkJELCAweERFQjEsIDB4OTE1NCwKKwkweDYwNTAsIDB4MDIwMywgMHhDRUE5LCAweDU2N0QsIDB4RTcxOSwgMHhCNTYyLCAweDRERTYsIDB4RUM5QSwKKwkweDhGNDUsIDB4MUY5RCwgMHg4OTQwLCAweEZBODcsIDB4RUYxNSwgMHhCMkVCLCAweDhFQzksIDB4RkIwQiwKKwkweDQxRUMsIDB4QjM2NywgMHg1RkZELCAweDQ1RUEsIDB4MjNCRiwgMHg1M0Y3LCAweEU0OTYsIDB4OUI1QiwKKwkweDc1QzIsIDB4RTExQywgMHgzREFFLCAweDRDNkEsIDB4NkM1QSwgMHg3RTQxLCAweEY1MDIsIDB4ODM0RiwKKwkweDY4NUMsIDB4NTFGNCwgMHhEMTM0LCAweEY5MDgsIDB4RTI5MywgMHhBQjczLCAweDYyNTMsIDB4MkEzRiwKKwkweDA4MEMsIDB4OTU1MiwgMHg0NjY1LCAweDlENUUsIDB4MzAyOCwgMHgzN0ExLCAweDBBMEYsIDB4MkZCNSwKKwkweDBFMDksIDB4MjQzNiwgMHgxQjlCLCAweERGM0QsIDB4Q0QyNiwgMHg0RTY5LCAweDdGQ0QsIDB4RUE5RiwKKwkweDEyMUIsIDB4MUQ5RSwgMHg1ODc0LCAweDM0MkUsIDB4MzYyRCwgMHhEQ0IyLCAweEI0RUUsIDB4NUJGQiwKKwkweEE0RjYsIDB4NzY0RCwgMHhCNzYxLCAweDdEQ0UsIDB4NTI3QiwgMHhERDNFLCAweDVFNzEsIDB4MTM5NywKKwkweEE2RjUsIDB4Qjk2OCwgMHgwMDAwLCAweEMxMkMsIDB4NDA2MCwgMHhFMzFGLCAweDc5QzgsIDB4QjZFRCwKKwkweEQ0QkUsIDB4OEQ0NiwgMHg2N0Q5LCAweDcyNEIsIDB4OTRERSwgMHg5OEQ0LCAweEIwRTgsIDB4ODU0QSwKKwkweEJCNkIsIDB4QzUyQSwgMHg0RkU1LCAweEVEMTYsIDB4ODZDNSwgMHg5QUQ3LCAweDY2NTUsIDB4MTE5NCwKKwkweDhBQ0YsIDB4RTkxMCwgMHgwNDA2LCAweEZFODEsIDB4QTBGMCwgMHg3ODQ0LCAweDI1QkEsIDB4NEJFMywKKwkweEEyRjMsIDB4NURGRSwgMHg4MEMwLCAweDA1OEEsIDB4M0ZBRCwgMHgyMUJDLCAweDcwNDgsIDB4RjEwNCwKKwkweDYzREYsIDB4NzdDMSwgMHhBRjc1LCAweDQyNjMsIDB4MjAzMCwgMHhFNTFBLCAweEZEMEUsIDB4QkY2RCwKKwkweDgxNEMsIDB4MTgxNCwgMHgyNjM1LCAweEMzMkYsIDB4QkVFMSwgMHgzNUEyLCAweDg4Q0MsIDB4MkUzOSwKKwkweDkzNTcsIDB4NTVGMiwgMHhGQzgyLCAweDdBNDcsIDB4QzhBQywgMHhCQUU3LCAweDMyMkIsIDB4RTY5NSwKKwkweEMwQTAsIDB4MTk5OCwgMHg5RUQxLCAweEEzN0YsIDB4NDQ2NiwgMHg1NDdFLCAweDNCQUIsIDB4MEI4MywKKwkweDhDQ0EsIDB4QzcyOSwgMHg2QkQzLCAweDI4M0MsIDB4QTc3OSwgMHhCQ0UyLCAweDE2MUQsIDB4QUQ3NiwKKwkweERCM0IsIDB4NjQ1NiwgMHg3NDRFLCAweDE0MUUsIDB4OTJEQiwgMHgwQzBBLCAweDQ4NkMsIDB4QjhFNCwKKwkweDlGNUQsIDB4QkQ2RSwgMHg0M0VGLCAweEM0QTYsIDB4MzlBOCwgMHgzMUE0LCAweEQzMzcsIDB4RjI4QiwKKwkweEQ1MzIsIDB4OEI0MywgMHg2RTU5LCAweERBQjcsIDB4MDE4QywgMHhCMTY0LCAweDlDRDIsIDB4NDlFMCwKKwkweEQ4QjQsIDB4QUNGQSwgMHhGMzA3LCAweENGMjUsIDB4Q0FBRiwgMHhGNDhFLCAweDQ3RTksIDB4MTAxOCwKKwkweDZGRDUsIDB4RjA4OCwgMHg0QTZGLCAweDVDNzIsIDB4MzgyNCwgMHg1N0YxLCAweDczQzcsIDB4OTc1MSwKKwkweENCMjMsIDB4QTE3QywgMHhFODlDLCAweDNFMjEsIDB4OTZERCwgMHg2MURDLCAweDBEODYsIDB4MEY4NSwKKwkweEUwOTAsIDB4N0M0MiwgMHg3MUM0LCAweENDQUEsIDB4OTBEOCwgMHgwNjA1LCAweEY3MDEsIDB4MUMxMiwKKwkweEMyQTMsIDB4NkE1RiwgMHhBRUY5LCAweDY5RDAsIDB4MTc5MSwgMHg5OTU4LCAweDNBMjcsIDB4MjdCOSwKKwkweEQ5MzgsIDB4RUIxMywgMHgyQkIzLCAweDIyMzMsIDB4RDJCQiwgMHhBOTcwLCAweDA3ODksIDB4MzNBNywKKwkweDJEQjYsIDB4M0MyMiwgMHgxNTkyLCAweEM5MjAsIDB4ODc0OSwgMHhBQUZGLCAweDUwNzgsIDB4QTU3QSwKKwkweDAzOEYsIDB4NTlGOCwgMHgwOTgwLCAweDFBMTcsIDB4NjVEQSwgMHhENzMxLCAweDg0QzYsIDB4RDBCOCwKKwkweDgyQzMsIDB4MjlCMCwgMHg1QTc3LCAweDFFMTEsIDB4N0JDQiwgMHhBOEZDLCAweDZERDYsIDB4MkMzQSwKK307CisKKworc3RhdGljIGlubGluZSB1MTYgX1NfKHUxNiB2KQoreworCXUxNiB0ID0gU2JveFtIaTgodildOworCXJldHVybiBTYm94W0xvOCh2KV0gXiAoKHQgPDwgOCkgfCAodCA+PiA4KSk7Cit9CisKKworI2RlZmluZSBQSEFTRTFfTE9PUF9DT1VOVCA4CisKKworc3RhdGljIHZvaWQgdGtpcF9taXhpbmdfcGhhc2UxKHUxNiAqVFRBSywgY29uc3QgdTggKlRLLCBjb25zdCB1OCAqVEEsIHUzMiBJVjMyKQoreworCWludCBpLCBqOworCisJLyogSW5pdGlhbGl6ZSB0aGUgODAtYml0IFRUQUsgZnJvbSBUU0MgKElWMzIpIGFuZCBUQVswLi41XSAqLworCVRUQUtbMF0gPSBMbzE2KElWMzIpOworCVRUQUtbMV0gPSBIaTE2KElWMzIpOworCVRUQUtbMl0gPSBNazE2KFRBWzFdLCBUQVswXSk7CisJVFRBS1szXSA9IE1rMTYoVEFbM10sIFRBWzJdKTsKKwlUVEFLWzRdID0gTWsxNihUQVs1XSwgVEFbNF0pOworCisJZm9yIChpID0gMDsgaSA8IFBIQVNFMV9MT09QX0NPVU5UOyBpKyspIHsKKwkJaiA9IDIgKiAoaSAmIDEpOworCQlUVEFLWzBdICs9IF9TXyhUVEFLWzRdIF4gTWsxNihUS1sxICsgal0sIFRLWzAgKyBqXSkpOworCQlUVEFLWzFdICs9IF9TXyhUVEFLWzBdIF4gTWsxNihUS1s1ICsgal0sIFRLWzQgKyBqXSkpOworCQlUVEFLWzJdICs9IF9TXyhUVEFLWzFdIF4gTWsxNihUS1s5ICsgal0sIFRLWzggKyBqXSkpOworCQlUVEFLWzNdICs9IF9TXyhUVEFLWzJdIF4gTWsxNihUS1sxMyArIGpdLCBUS1sxMiArIGpdKSk7CisJCVRUQUtbNF0gKz0gX1NfKFRUQUtbM10gXiBNazE2KFRLWzEgKyBqXSwgVEtbMCArIGpdKSkgKyBpOworCX0KK30KKworCitzdGF0aWMgdm9pZCB0a2lwX21peGluZ19waGFzZTIodTggKldFUFNlZWQsIGNvbnN0IHU4ICpUSywgY29uc3QgdTE2ICpUVEFLLAorCQkJICAgICAgIHUxNiBJVjE2KQoreworCS8qIE1ha2UgdGVtcG9yYXJ5IGFyZWEgb3ZlcmxhcCBXRVAgc2VlZCBzbyB0aGF0IHRoZSBmaW5hbCBjb3B5IGNhbiBiZQorCSAqIGF2b2lkZWQgb24gbGl0dGxlIGVuZGlhbiBob3N0cy4gKi8KKwl1MTYgKlBQSyA9ICh1MTYgKikgJldFUFNlZWRbNF07CisKKwkvKiBTdGVwIDEgLSBtYWtlIGNvcHkgb2YgVFRBSyBhbmQgYnJpbmcgaW4gVFNDICovCisJUFBLWzBdID0gVFRBS1swXTsKKwlQUEtbMV0gPSBUVEFLWzFdOworCVBQS1syXSA9IFRUQUtbMl07CisJUFBLWzNdID0gVFRBS1szXTsKKwlQUEtbNF0gPSBUVEFLWzRdOworCVBQS1s1XSA9IFRUQUtbNF0gKyBJVjE2OworCisJLyogU3RlcCAyIC0gOTYtYml0IGJpamVjdGl2ZSBtaXhpbmcgdXNpbmcgUy1ib3ggKi8KKwlQUEtbMF0gKz0gX1NfKFBQS1s1XSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbMF0pKTsKKwlQUEtbMV0gKz0gX1NfKFBQS1swXSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbMl0pKTsKKwlQUEtbMl0gKz0gX1NfKFBQS1sxXSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbNF0pKTsKKwlQUEtbM10gKz0gX1NfKFBQS1syXSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbNl0pKTsKKwlQUEtbNF0gKz0gX1NfKFBQS1szXSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbOF0pKTsKKwlQUEtbNV0gKz0gX1NfKFBQS1s0XSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbMTBdKSk7CisKKwlQUEtbMF0gKz0gUm90UjEoUFBLWzVdIF4gTWsxNl9sZSgodTE2ICopICZUS1sxMl0pKTsKKwlQUEtbMV0gKz0gUm90UjEoUFBLWzBdIF4gTWsxNl9sZSgodTE2ICopICZUS1sxNF0pKTsKKwlQUEtbMl0gKz0gUm90UjEoUFBLWzFdKTsKKwlQUEtbM10gKz0gUm90UjEoUFBLWzJdKTsKKwlQUEtbNF0gKz0gUm90UjEoUFBLWzNdKTsKKwlQUEtbNV0gKz0gUm90UjEoUFBLWzRdKTsKKworCS8qIFN0ZXAgMyAtIGJyaW5nIGluIGxhc3Qgb2YgVEsgYml0cywgYXNzaWduIDI0LWJpdCBXRVAgSVYgdmFsdWUKKwkgKiBXRVBTZWVkWzAuLjJdIGlzIHRyYW5zbWl0dGVkIGFzIFdFUCBJViAqLworCVdFUFNlZWRbMF0gPSBIaTgoSVYxNik7CisJV0VQU2VlZFsxXSA9IChIaTgoSVYxNikgfCAweDIwKSAmIDB4N0Y7CisJV0VQU2VlZFsyXSA9IExvOChJVjE2KTsKKwlXRVBTZWVkWzNdID0gTG84KChQUEtbNV0gXiBNazE2X2xlKCh1MTYgKikgJlRLWzBdKSkgPj4gMSk7CisKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwl7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJUFBLW2ldID0gKFBQS1tpXSA8PCA4KSB8IChQUEtbaV0gPj4gOCk7CisJfQorI2VuZGlmCit9CisKKworc3RhdGljIGludCBpZWVlODAyMTFfdGtpcF9lbmNyeXB0KHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICp0a2V5ID0gcHJpdjsKKwkJaW50IGxlbjsKKwl1OCAqcG9zOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZHI7CisJY2JfZGVzYyAqdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKShza2ItPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOworCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjID0gey50Zm0gPSB0a2V5LT50eF90Zm1fYXJjNH07CisJaW50IHJldCA9IDA7CisJdTggcmM0a2V5WzE2XSwgICppY3Y7CisJdTMyIGNyYzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CisKKwlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCA4IHx8IHNrYl90YWlscm9vbShza2IpIDwgNCB8fAorCSAgICBza2ItPmxlbiA8IGhkcl9sZW4pCisJCXJldHVybiAtMTsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqKSBza2ItPmRhdGE7CisKKwlpZiAoIXRjYl9kZXNjLT5iSHdTZWMpCisJeworCQlpZiAoIXRrZXktPnR4X3BoYXNlMV9kb25lKSB7CisJCQl0a2lwX21peGluZ19waGFzZTEodGtleS0+dHhfdHRhaywgdGtleS0+a2V5LCBoZHItPmFkZHIyLAorCQkJCQl0a2V5LT50eF9pdjMyKTsKKwkJCXRrZXktPnR4X3BoYXNlMV9kb25lID0gMTsKKwkJfQorCQl0a2lwX21peGluZ19waGFzZTIocmM0a2V5LCB0a2V5LT5rZXksIHRrZXktPnR4X3R0YWssIHRrZXktPnR4X2l2MTYpOworCX0KKwllbHNlCisJdGtleS0+dHhfcGhhc2UxX2RvbmUgPSAxOworCisKKwlsZW4gPSBza2ItPmxlbiAtIGhkcl9sZW47CisJcG9zID0gc2tiX3B1c2goc2tiLCA4KTsKKwltZW1tb3ZlKHBvcywgcG9zICsgOCwgaGRyX2xlbik7CisJcG9zICs9IGhkcl9sZW47CisKKwlpZiAodGNiX2Rlc2MtPmJId1NlYykKKwl7CisJCSpwb3MrKyA9IEhpOCh0a2V5LT50eF9pdjE2KTsKKwkJKnBvcysrID0gKEhpOCh0a2V5LT50eF9pdjE2KSB8IDB4MjApICYgMHg3RjsKKwkJKnBvcysrID0gTG84KHRrZXktPnR4X2l2MTYpOworCX0KKwllbHNlCisJeworCQkqcG9zKysgPSByYzRrZXlbMF07CisJCSpwb3MrKyA9IHJjNGtleVsxXTsKKwkJKnBvcysrID0gcmM0a2V5WzJdOworCX0KKworCSpwb3MrKyA9ICh0a2V5LT5rZXlfaWR4IDw8IDYpIHwgKDEgPDwgNSkgLyogRXh0IElWIGluY2x1ZGVkICovOworCSpwb3MrKyA9IHRrZXktPnR4X2l2MzIgJiAweGZmOworCSpwb3MrKyA9ICh0a2V5LT50eF9pdjMyID4+IDgpICYgMHhmZjsKKwkqcG9zKysgPSAodGtleS0+dHhfaXYzMiA+PiAxNikgJiAweGZmOworCSpwb3MrKyA9ICh0a2V5LT50eF9pdjMyID4+IDI0KSAmIDB4ZmY7CisKKwlpZiAoIXRjYl9kZXNjLT5iSHdTZWMpCisJeworCQlpY3YgPSBza2JfcHV0KHNrYiwgNCk7CisJCWNyYyA9IH5jcmMzMl9sZSh+MCwgcG9zLCBsZW4pOworCQlpY3ZbMF0gPSBjcmM7CisJCWljdlsxXSA9IGNyYyA+PiA4OworCQlpY3ZbMl0gPSBjcmMgPj4gMTY7CisJCWljdlszXSA9IGNyYyA+PiAyNDsKKwkJY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkodGtleS0+dHhfdGZtX2FyYzQsIHJjNGtleSwgMTYpOworCQlzZ19pbml0X29uZSgmc2csIHBvcywgbGVuKzQpOworCQlyZXQ9IGNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdCgmZGVzYywgJnNnLCAmc2csIGxlbiArIDQpOworCX0KKworCXRrZXktPnR4X2l2MTYrKzsKKwlpZiAodGtleS0+dHhfaXYxNiA9PSAwKSB7CisJCXRrZXktPnR4X3BoYXNlMV9kb25lID0gMDsKKwkJdGtleS0+dHhfaXYzMisrOworCX0KKworCWlmICghdGNiX2Rlc2MtPmJId1NlYykKKwkJcmV0dXJuIHJldDsKKwllbHNlCisJCXJldHVybiAwOworCisKK30KKworc3RhdGljIGludCBpZWVlODAyMTFfdGtpcF9kZWNyeXB0KHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICp0a2V5ID0gcHJpdjsKKwl1OCBrZXlpZHgsICpwb3M7CisJdTMyIGl2MzI7CisJdTE2IGl2MTY7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkcjsKKwljYl9kZXNjICp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2MgPSB7LnRmbSA9IHRrZXktPnJ4X3RmbV9hcmM0fTsKKwl1OCByYzRrZXlbMTZdOworCXU4IGljdls0XTsKKwl1MzIgY3JjOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKwlpbnQgcGxlbjsKKwlpZiAoc2tiLT5sZW4gPCBoZHJfbGVuICsgOCArIDQpCisJCXJldHVybiAtMTsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqKSBza2ItPmRhdGE7CisJcG9zID0gc2tiLT5kYXRhICsgaGRyX2xlbjsKKwlrZXlpZHggPSBwb3NbM107CisJaWYgKCEoa2V5aWR4ICYgKDEgPDwgNSkpKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJUS0lQOiByZWNlaXZlZCBwYWNrZXQgd2l0aG91dCBFeHRJViIKKwkJCSAgICAgICAiIGZsYWcgZnJvbSAiIE1BQ19GTVQgIlxuIiwgTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJCX0KKwkJcmV0dXJuIC0yOworCX0KKwlrZXlpZHggPj49IDY7CisJaWYgKHRrZXktPmtleV9pZHggIT0ga2V5aWR4KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJUS0lQOiBSWCB0a2V5LT5rZXlfaWR4PSVkIGZyYW1lICIKKwkJICAgICAgICJrZXlpZHg9JWQgcHJpdj0lcFxuIiwgdGtleS0+a2V5X2lkeCwga2V5aWR4LCBwcml2KTsKKwkJcmV0dXJuIC02OworCX0KKwlpZiAoIXRrZXktPmtleV9zZXQpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIlRLSVA6IHJlY2VpdmVkIHBhY2tldCBmcm9tICIgTUFDX0ZNVAorCQkJICAgICAgICIgd2l0aCBrZXlpZD0lZCB0aGF0IGRvZXMgbm90IGhhdmUgYSBjb25maWd1cmVkIgorCQkJICAgICAgICIga2V5XG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpLCBrZXlpZHgpOworCQl9CisJCXJldHVybiAtMzsKKwl9CisJaXYxNiA9IChwb3NbMF0gPDwgOCkgfCBwb3NbMl07CisJaXYzMiA9IHBvc1s0XSB8IChwb3NbNV0gPDwgOCkgfCAocG9zWzZdIDw8IDE2KSB8IChwb3NbN10gPDwgMjQpOworCXBvcyArPSA4OworCisJaWYgKCF0Y2JfZGVzYy0+Ykh3U2VjKQorCXsKKwkJaWYgKGl2MzIgPCB0a2V5LT5yeF9pdjMyIHx8CisJCShpdjMyID09IHRrZXktPnJ4X2l2MzIgJiYgaXYxNiA8PSB0a2V5LT5yeF9pdjE2KSkgeworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJCXByaW50ayhLRVJOX0RFQlVHICJUS0lQOiByZXBsYXkgZGV0ZWN0ZWQ6IFNUQT0iIE1BQ19GTVQKKwkJCQkiIHByZXZpb3VzIFRTQyAlMDh4JTA0eCByZWNlaXZlZCBUU0MgIgorCQkJCSIlMDh4JTA0eFxuIiwgTUFDX0FSRyhoZHItPmFkZHIyKSwKKwkJCQl0a2V5LT5yeF9pdjMyLCB0a2V5LT5yeF9pdjE2LCBpdjMyLCBpdjE2KTsKKwkJCX0KKwkJCXRrZXktPmRvdDExUlNOQVN0YXRzVEtJUFJlcGxheXMrKzsKKwkJCXJldHVybiAtNDsKKwkJfQorCisJCWlmIChpdjMyICE9IHRrZXktPnJ4X2l2MzIgfHwgIXRrZXktPnJ4X3BoYXNlMV9kb25lKSB7CisJCQl0a2lwX21peGluZ19waGFzZTEodGtleS0+cnhfdHRhaywgdGtleS0+a2V5LCBoZHItPmFkZHIyLCBpdjMyKTsKKwkJCXRrZXktPnJ4X3BoYXNlMV9kb25lID0gMTsKKwkJfQorCQl0a2lwX21peGluZ19waGFzZTIocmM0a2V5LCB0a2V5LT5rZXksIHRrZXktPnJ4X3R0YWssIGl2MTYpOworCisJCXBsZW4gPSBza2ItPmxlbiAtIGhkcl9sZW4gLSAxMjsKKworCQljcnlwdG9fYmxrY2lwaGVyX3NldGtleSh0a2V5LT5yeF90Zm1fYXJjNCwgcmM0a2V5LCAxNik7CisJCXNnX2luaXRfb25lKCZzZywgcG9zLCBwbGVuKzQpOworCisJCWlmIChjcnlwdG9fYmxrY2lwaGVyX2RlY3J5cHQoJmRlc2MsICZzZywgJnNnLCBwbGVuICsgNCkpIHsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiOiBUS0lQOiBmYWlsZWQgdG8gZGVjcnlwdCAiCisJCQkJCQkicmVjZWl2ZWQgcGFja2V0IGZyb20gIiBNQUNfRk1UICJcbiIsCisJCQkJCQlNQUNfQVJHKGhkci0+YWRkcjIpKTsKKwkJCX0KKwkJCXJldHVybiAtNzsKKwkJfQorCisJCWNyYyA9IH5jcmMzMl9sZSh+MCwgcG9zLCBwbGVuKTsKKwkJaWN2WzBdID0gY3JjOworCQlpY3ZbMV0gPSBjcmMgPj4gODsKKwkJaWN2WzJdID0gY3JjID4+IDE2OworCQlpY3ZbM10gPSBjcmMgPj4gMjQ7CisKKwkJaWYgKG1lbWNtcChpY3YsIHBvcyArIHBsZW4sIDQpICE9IDApIHsKKwkJCWlmIChpdjMyICE9IHRrZXktPnJ4X2l2MzIpIHsKKwkJCQkvKiBQcmV2aW91c2x5IGNhY2hlZCBQaGFzZTEgcmVzdWx0IHdhcyBhbHJlYWR5IGxvc3QsIHNvCisJCQkJKiBpdCBuZWVkcyB0byBiZSByZWNhbGN1bGF0ZWQgZm9yIHRoZSBuZXh0IHBhY2tldC4gKi8KKwkJCQl0a2V5LT5yeF9waGFzZTFfZG9uZSA9IDA7CisJCQl9CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIlRLSVA6IElDViBlcnJvciBkZXRlY3RlZDogU1RBPSIKKwkJCQlNQUNfRk1UICJcbiIsIE1BQ19BUkcoaGRyLT5hZGRyMikpOworCQkJfQorCQkJdGtleS0+ZG90MTFSU05BU3RhdHNUS0lQSUNWRXJyb3JzKys7CisJCQlyZXR1cm4gLTU7CisJCX0KKworCX0KKworCS8qIFVwZGF0ZSByZWFsIGNvdW50ZXJzIG9ubHkgYWZ0ZXIgTWljaGFlbCBNSUMgdmVyaWZpY2F0aW9uIGhhcworCSAqIGNvbXBsZXRlZCAqLworCXRrZXktPnJ4X2l2MzJfbmV3ID0gaXYzMjsKKwl0a2V5LT5yeF9pdjE2X25ldyA9IGl2MTY7CisKKwkvKiBSZW1vdmUgSVYgYW5kIElDViAqLworCW1lbW1vdmUoc2tiLT5kYXRhICsgOCwgc2tiLT5kYXRhLCBoZHJfbGVuKTsKKwlza2JfcHVsbChza2IsIDgpOworCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSA0KTsKKworCXJldHVybiBrZXlpZHg7Cit9CisKK3N0YXRpYyBpbnQgbWljaGFlbF9taWMoc3RydWN0IGNyeXB0b19oYXNoICp0Zm1fbWljaGFlbCwgdTggKiBrZXksIHU4ICogaGRyLAorCQkgICAgICAgdTggKiBkYXRhLCBzaXplX3QgZGF0YV9sZW4sIHU4ICogbWljKQoreworCXN0cnVjdCBoYXNoX2Rlc2MgZGVzYzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbMl07CisKKwlpZiAodGZtX21pY2hhZWwgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtaWNoYWVsX21pYzogdGZtX21pY2hhZWwgPT0gTlVMTFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzZ19pbml0X3RhYmxlKHNnLCAyKTsKKwlzZ19zZXRfYnVmKCZzZ1swXSwgaGRyLCAxNik7CisJc2dfc2V0X2J1Zigmc2dbMV0sIGRhdGEsIGRhdGFfbGVuKTsKKworCWlmIChjcnlwdG9faGFzaF9zZXRrZXkodGZtX21pY2hhZWwsIGtleSwgOCkpCisJCXJldHVybiAtMTsKKworCWRlc2MudGZtID0gdGZtX21pY2hhZWw7CisJZGVzYy5mbGFncyA9IDA7CisJcmV0dXJuIGNyeXB0b19oYXNoX2RpZ2VzdCgmZGVzYywgc2csIGRhdGFfbGVuICsgMTYsIG1pYyk7Cit9CisKK3N0YXRpYyB2b2lkIG1pY2hhZWxfbWljX2hkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCAqaGRyKQoreworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZHIxMTsKKworCWhkcjExID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKKwlzd2l0Y2ggKGxlMTZfdG9fY3B1KGhkcjExLT5mcmFtZV9jdGwpICYKKwkJKElFRUU4MDIxMV9GQ1RMX0ZST01EUyB8IElFRUU4MDIxMV9GQ1RMX1RPRFMpKSB7CisJY2FzZSBJRUVFODAyMTFfRkNUTF9UT0RTOgorCQltZW1jcHkoaGRyLCBoZHIxMS0+YWRkcjMsIEVUSF9BTEVOKTsgLyogREEgKi8KKwkJbWVtY3B5KGhkciArIEVUSF9BTEVOLCBoZHIxMS0+YWRkcjIsIEVUSF9BTEVOKTsgLyogU0EgKi8KKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfRkNUTF9GUk9NRFM6CisJCW1lbWNweShoZHIsIGhkcjExLT5hZGRyMSwgRVRIX0FMRU4pOyAvKiBEQSAqLworCQltZW1jcHkoaGRyICsgRVRIX0FMRU4sIGhkcjExLT5hZGRyMywgRVRIX0FMRU4pOyAvKiBTQSAqLworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9GQ1RMX0ZST01EUyB8IElFRUU4MDIxMV9GQ1RMX1RPRFM6CisJCW1lbWNweShoZHIsIGhkcjExLT5hZGRyMywgRVRIX0FMRU4pOyAvKiBEQSAqLworCQltZW1jcHkoaGRyICsgRVRIX0FMRU4sIGhkcjExLT5hZGRyNCwgRVRIX0FMRU4pOyAvKiBTQSAqLworCQlicmVhazsKKwljYXNlIDA6CisJCW1lbWNweShoZHIsIGhkcjExLT5hZGRyMSwgRVRIX0FMRU4pOyAvKiBEQSAqLworCQltZW1jcHkoaGRyICsgRVRIX0FMRU4sIGhkcjExLT5hZGRyMiwgRVRIX0FMRU4pOyAvKiBTQSAqLworCQlicmVhazsKKwl9CisKKwloZHJbMTJdID0gMDsgLyogcHJpb3JpdHkgKi8KKworCWhkclsxM10gPSBoZHJbMTRdID0gaGRyWzE1XSA9IDA7IC8qIHJlc2VydmVkICovCit9CisKKworc3RhdGljIGludCBpZWVlODAyMTFfbWljaGFlbF9taWNfYWRkKHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICp0a2V5ID0gcHJpdjsKKwl1OCAqcG9zOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZHI7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKikgc2tiLT5kYXRhOworCisJaWYgKHNrYl90YWlscm9vbShza2IpIDwgOCB8fCBza2ItPmxlbiA8IGhkcl9sZW4pIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkludmFsaWQgcGFja2V0IGZvciBNaWNoYWVsIE1JQyBhZGQgIgorCQkgICAgICAgIih0YWlscm9vbT0lZCBoZHJfbGVuPSVkIHNrYi0+bGVuPSVkKVxuIiwKKwkJICAgICAgIHNrYl90YWlscm9vbShza2IpLCBoZHJfbGVuLCBza2ItPmxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwltaWNoYWVsX21pY19oZHIoc2tiLCB0a2V5LT50eF9oZHIpOworCisJLy8geyBkYXZpZCwgMjAwNi45LjEKKwkvLyBmaXggdGhlIHdwYSBwcm9jZXNzIHdpdGggd21tIGVuYWJsZWQuCisJaWYoSUVFRTgwMjExX1FPU19IQVNfU0VRKGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKSkpIHsKKwkJdGtleS0+dHhfaGRyWzEyXSA9ICooc2tiLT5kYXRhICsgaGRyX2xlbiAtIDIpICYgMHgwNzsKKwl9CisJLy8gfQorCXBvcyA9IHNrYl9wdXQoc2tiLCA4KTsKKworCWlmIChtaWNoYWVsX21pYyh0a2V5LT50eF90Zm1fbWljaGFlbCwgJnRrZXktPmtleVsxNl0sIHRrZXktPnR4X2hkciwKKwkJCQlza2ItPmRhdGEgKyBoZHJfbGVuLCBza2ItPmxlbiAtIDggLSBoZHJfbGVuLCBwb3MpKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaWVlZTgwMjExX21pY2hhZWxfbWljX2ZhaWx1cmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkciwKKwkJCQkgICAgICAgaW50IGtleWlkeCkKK3sKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJc3RydWN0IGl3X21pY2hhZWxtaWNmYWlsdXJlIGV2OworCisJLyogVE9ETzogbmVlZGVkIHBhcmFtZXRlcnM6IGNvdW50LCBrZXlpZCwga2V5IHR5cGUsIFRTQyAqLworCW1lbXNldCgmZXYsIDAsIHNpemVvZihldikpOworCWV2LmZsYWdzID0ga2V5aWR4ICYgSVdfTUlDRkFJTFVSRV9LRVlfSUQ7CisJaWYgKGhkci0+YWRkcjFbMF0gJiAweDAxKQorCQlldi5mbGFncyB8PSBJV19NSUNGQUlMVVJFX0dST1VQOworCWVsc2UKKwkJZXYuZmxhZ3MgfD0gSVdfTUlDRkFJTFVSRV9QQUlSV0lTRTsKKwlldi5zcmNfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJbWVtY3B5KGV2LnNyY19hZGRyLnNhX2RhdGEsIGhkci0+YWRkcjIsIEVUSF9BTEVOKTsKKwltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJd3JxdS5kYXRhLmxlbmd0aCA9IHNpemVvZihldik7CisJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIElXRVZNSUNIQUVMTUlDRkFJTFVSRSwgJndycXUsIChjaGFyICopICZldik7Cit9CisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX21pY2hhZWxfbWljX3ZlcmlmeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQga2V5aWR4LAorCQkJCSAgICAgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnRrZXkgPSBwcml2OworCXU4IG1pY1s4XTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGRyOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKKworCWlmICghdGtleS0+a2V5X3NldCkKKwkJcmV0dXJuIC0xOworCisJbWljaGFlbF9taWNfaGRyKHNrYiwgdGtleS0+cnhfaGRyKTsKKwkvLyB7IGRhdmlkLCAyMDA2LjkuMQorCS8vIGZpeCB0aGUgd3BhIHByb2Nlc3Mgd2l0aCB3bW0gZW5hYmxlZC4KKwlpZihJRUVFODAyMTFfUU9TX0hBU19TRVEobGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpKSkgeworCQl0a2V5LT5yeF9oZHJbMTJdID0gKihza2ItPmRhdGEgKyBoZHJfbGVuIC0gMikgJiAweDA3OworCX0KKwkvLyB9CisKKwlpZiAobWljaGFlbF9taWModGtleS0+cnhfdGZtX21pY2hhZWwsICZ0a2V5LT5rZXlbMjRdLCB0a2V5LT5yeF9oZHIsCisJCQkJc2tiLT5kYXRhICsgaGRyX2xlbiwgc2tiLT5sZW4gLSA4IC0gaGRyX2xlbiwgbWljKSkKKwkJcmV0dXJuIC0xOworCWlmIChtZW1jbXAobWljLCBza2ItPmRhdGEgKyBza2ItPmxlbiAtIDgsIDgpICE9IDApIHsKKwkJc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkcjsKKwkJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNaWNoYWVsIE1JQyB2ZXJpZmljYXRpb24gZmFpbGVkIGZvciAiCisJCSAgICAgICAiTVNEVSBmcm9tICIgTUFDX0ZNVCAiIGtleWlkeD0lZFxuIiwKKwkJICAgICAgIHNrYi0+ZGV2ID8gc2tiLT5kZXYtPm5hbWUgOiAiTi9BIiwgTUFDX0FSRyhoZHItPmFkZHIyKSwKKwkJICAgICAgIGtleWlkeCk7CisJCWlmIChza2ItPmRldikKKwkJCWllZWU4MDIxMV9taWNoYWVsX21pY19mYWlsdXJlKHNrYi0+ZGV2LCBoZHIsIGtleWlkeCk7CisJCXRrZXktPmRvdDExUlNOQVN0YXRzVEtJUExvY2FsTUlDRmFpbHVyZXMrKzsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFVwZGF0ZSBUU0MgY291bnRlcnMgZm9yIFJYIG5vdyB0aGF0IHRoZSBwYWNrZXQgdmVyaWZpY2F0aW9uIGhhcworCSAqIGNvbXBsZXRlZC4gKi8KKwl0a2V5LT5yeF9pdjMyID0gdGtleS0+cnhfaXYzMl9uZXc7CisJdGtleS0+cnhfaXYxNiA9IHRrZXktPnJ4X2l2MTZfbmV3OworCisJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIDgpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpZWVlODAyMTFfdGtpcF9zZXRfa2V5KHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqdGtleSA9IHByaXY7CisJaW50IGtleWlkeDsKKwlzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbSA9IHRrZXktPnR4X3RmbV9taWNoYWVsOworCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm0yID0gdGtleS0+dHhfdGZtX2FyYzQ7CisJc3RydWN0IGNyeXB0b19oYXNoICp0Zm0zID0gdGtleS0+cnhfdGZtX21pY2hhZWw7CisJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnRmbTQgPSB0a2V5LT5yeF90Zm1fYXJjNDsKKworCWtleWlkeCA9IHRrZXktPmtleV9pZHg7CisJbWVtc2V0KHRrZXksIDAsIHNpemVvZigqdGtleSkpOworCXRrZXktPmtleV9pZHggPSBrZXlpZHg7CisJdGtleS0+dHhfdGZtX21pY2hhZWwgPSB0Zm07CisJdGtleS0+dHhfdGZtX2FyYzQgPSB0Zm0yOworCXRrZXktPnJ4X3RmbV9taWNoYWVsID0gdGZtMzsKKwl0a2V5LT5yeF90Zm1fYXJjNCA9IHRmbTQ7CisKKwlpZiAobGVuID09IFRLSVBfS0VZX0xFTikgeworCQltZW1jcHkodGtleS0+a2V5LCBrZXksIFRLSVBfS0VZX0xFTik7CisJCXRrZXktPmtleV9zZXQgPSAxOworCQl0a2V5LT50eF9pdjE2ID0gMTsgLyogVFNDIGlzIGluaXRpYWxpemVkIHRvIDEgKi8KKwkJaWYgKHNlcSkgeworCQkJdGtleS0+cnhfaXYzMiA9IChzZXFbNV0gPDwgMjQpIHwgKHNlcVs0XSA8PCAxNikgfAorCQkJCShzZXFbM10gPDwgOCkgfCBzZXFbMl07CisJCQl0a2V5LT5yeF9pdjE2ID0gKHNlcVsxXSA8PCA4KSB8IHNlcVswXTsKKwkJfQorCX0gZWxzZSBpZiAobGVuID09IDApCisJCXRrZXktPmtleV9zZXQgPSAwOworCWVsc2UKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpZWVlODAyMTFfdGtpcF9nZXRfa2V5KHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqdGtleSA9IHByaXY7CisKKwlpZiAobGVuIDwgVEtJUF9LRVlfTEVOKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoIXRrZXktPmtleV9zZXQpCisJCXJldHVybiAwOworCW1lbWNweShrZXksIHRrZXktPmtleSwgVEtJUF9LRVlfTEVOKTsKKworCWlmIChzZXEpIHsKKwkJLyogUmV0dXJuIHRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGxhc3QgdHJhbnNtaXR0ZWQgZnJhbWUuICovCisJCXUxNiBpdjE2ID0gdGtleS0+dHhfaXYxNjsKKwkJdTMyIGl2MzIgPSB0a2V5LT50eF9pdjMyOworCQlpZiAoaXYxNiA9PSAwKQorCQkJaXYzMi0tOworCQlpdjE2LS07CisJCXNlcVswXSA9IHRrZXktPnR4X2l2MTY7CisJCXNlcVsxXSA9IHRrZXktPnR4X2l2MTYgPj4gODsKKwkJc2VxWzJdID0gdGtleS0+dHhfaXYzMjsKKwkJc2VxWzNdID0gdGtleS0+dHhfaXYzMiA+PiA4OworCQlzZXFbNF0gPSB0a2V5LT50eF9pdjMyID4+IDE2OworCQlzZXFbNV0gPSB0a2V5LT50eF9pdjMyID4+IDI0OworCX0KKworCXJldHVybiBUS0lQX0tFWV9MRU47Cit9CisKKworc3RhdGljIGNoYXIgKiBpZWVlODAyMTFfdGtpcF9wcmludF9zdGF0cyhjaGFyICpwLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICp0a2lwID0gcHJpdjsKKwlwICs9IHNwcmludGYocCwgImtleVslZF0gYWxnPVRLSVAga2V5X3NldD0lZCAiCisJCSAgICAgInR4X3BuPSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCisJCSAgICAgInJ4X3BuPSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCisJCSAgICAgInJlcGxheXM9JWQgaWN2X2Vycm9ycz0lZCBsb2NhbF9taWNfZmFpbHVyZXM9JWRcbiIsCisJCSAgICAgdGtpcC0+a2V5X2lkeCwgdGtpcC0+a2V5X3NldCwKKwkJICAgICAodGtpcC0+dHhfaXYzMiA+PiAyNCkgJiAweGZmLAorCQkgICAgICh0a2lwLT50eF9pdjMyID4+IDE2KSAmIDB4ZmYsCisJCSAgICAgKHRraXAtPnR4X2l2MzIgPj4gOCkgJiAweGZmLAorCQkgICAgIHRraXAtPnR4X2l2MzIgJiAweGZmLAorCQkgICAgICh0a2lwLT50eF9pdjE2ID4+IDgpICYgMHhmZiwKKwkJICAgICB0a2lwLT50eF9pdjE2ICYgMHhmZiwKKwkJICAgICAodGtpcC0+cnhfaXYzMiA+PiAyNCkgJiAweGZmLAorCQkgICAgICh0a2lwLT5yeF9pdjMyID4+IDE2KSAmIDB4ZmYsCisJCSAgICAgKHRraXAtPnJ4X2l2MzIgPj4gOCkgJiAweGZmLAorCQkgICAgIHRraXAtPnJ4X2l2MzIgJiAweGZmLAorCQkgICAgICh0a2lwLT5yeF9pdjE2ID4+IDgpICYgMHhmZiwKKwkJICAgICB0a2lwLT5yeF9pdjE2ICYgMHhmZiwKKwkJICAgICB0a2lwLT5kb3QxMVJTTkFTdGF0c1RLSVBSZXBsYXlzLAorCQkgICAgIHRraXAtPmRvdDExUlNOQVN0YXRzVEtJUElDVkVycm9ycywKKwkJICAgICB0a2lwLT5kb3QxMVJTTkFTdGF0c1RLSVBMb2NhbE1JQ0ZhaWx1cmVzKTsKKwlyZXR1cm4gcDsKK30KKworCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzIGllZWU4MDIxMV9jcnlwdF90a2lwID0geworCS5uYW1lCQkJPSAiVEtJUCIsCisJLmluaXQJCQk9IGllZWU4MDIxMV90a2lwX2luaXQsCisJLmRlaW5pdAkJCT0gaWVlZTgwMjExX3RraXBfZGVpbml0LAorCS5lbmNyeXB0X21wZHUJCT0gaWVlZTgwMjExX3RraXBfZW5jcnlwdCwKKwkuZGVjcnlwdF9tcGR1CQk9IGllZWU4MDIxMV90a2lwX2RlY3J5cHQsCisJLmVuY3J5cHRfbXNkdQkJPSBpZWVlODAyMTFfbWljaGFlbF9taWNfYWRkLAorCS5kZWNyeXB0X21zZHUJCT0gaWVlZTgwMjExX21pY2hhZWxfbWljX3ZlcmlmeSwKKwkuc2V0X2tleQkJPSBpZWVlODAyMTFfdGtpcF9zZXRfa2V5LAorCS5nZXRfa2V5CQk9IGllZWU4MDIxMV90a2lwX2dldF9rZXksCisJLnByaW50X3N0YXRzCQk9IGllZWU4MDIxMV90a2lwX3ByaW50X3N0YXRzLAorCS5leHRyYV9wcmVmaXhfbGVuCT0gNCArIDQsIC8qIElWICsgRXh0SVYgKi8KKwkuZXh0cmFfcG9zdGZpeF9sZW4JPSA4ICsgNCwgLyogTUlDICsgSUNWICovCisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKK307CisKK2ludCBfX2luaXQgaWVlZTgwMjExX2NyeXB0b190a2lwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF90a2lwKTsKK30KKwordm9pZCBfX2V4aXQgaWVlZTgwMjExX2NyeXB0b190a2lwX2V4aXQodm9pZCkKK3sKKwlpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfdGtpcCk7Cit9CisKK3ZvaWQgaWVlZTgwMjExX3RraXBfbnVsbCh2b2lkKQoreworLy8gICAgcHJpbnRrKCI9PT09PT09PT09PT0+JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYWQxMWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYwpAQCAtMCwwICsxLDI5NyBAQAorLyoKKyAqIEhvc3QgQVAgY3J5cHQ6IGhvc3QtYmFzZWQgV0VQIGVuY3J5cHRpb24gaW1wbGVtZW50YXRpb24gZm9yIEhvc3QgQVAgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKy8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKworI2luY2x1ZGUgImllZWU4MDIxMS5oIgorCisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisgICAgI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKworTU9EVUxFX0FVVEhPUigiSm91bmkgTWFsaW5lbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJIb3N0IEFQIGNyeXB0OiBXRVAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RydWN0IHByaXNtMl93ZXBfZGF0YSB7CisJdTMyIGl2OworI2RlZmluZSBXRVBfS0VZX0xFTiAxMworCXU4IGtleVtXRVBfS0VZX0xFTiArIDFdOworCXU4IGtleV9sZW47CisJdTgga2V5X2lkeDsKKwlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdHhfdGZtOworCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICpyeF90Zm07Cit9OworCisKK3N0YXRpYyB2b2lkICogcHJpc20yX3dlcF9pbml0KGludCBrZXlpZHgpCit7CisJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqcHJpdjsKKworCXByaXYgPSBrbWFsbG9jKHNpemVvZigqcHJpdiksIEdGUF9BVE9NSUMpOworCWlmIChwcml2ID09IE5VTEwpCisJCWdvdG8gZmFpbDsKKwltZW1zZXQocHJpdiwgMCwgc2l6ZW9mKCpwcml2KSk7CisJcHJpdi0+a2V5X2lkeCA9IGtleWlkeDsKKworCXByaXYtPnR4X3RmbSA9IGNyeXB0b19hbGxvY19ibGtjaXBoZXIoImVjYihhcmM0KSIsIDAsIENSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIocHJpdi0+dHhfdGZtKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0X3dlcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJICAgICAgICJjcnlwdG8gQVBJIGFyYzRcbiIpOworCQlwcml2LT50eF90Zm0gPSBOVUxMOworCQlnb3RvIGZhaWw7CisJfQorCXByaXYtPnJ4X3RmbSA9IGNyeXB0b19hbGxvY19ibGtjaXBoZXIoImVjYihhcmM0KSIsIDAsIENSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIocHJpdi0+cnhfdGZtKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0X3dlcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJICAgICAgICJjcnlwdG8gQVBJIGFyYzRcbiIpOworCQlwcml2LT5yeF90Zm0gPSBOVUxMOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogc3RhcnQgV0VQIElWIGZyb20gYSByYW5kb20gdmFsdWUgKi8KKwlnZXRfcmFuZG9tX2J5dGVzKCZwcml2LT5pdiwgNCk7CisKKwlyZXR1cm4gcHJpdjsKKworZmFpbDoKKwlpZiAocHJpdikgeworCQlpZiAocHJpdi0+dHhfdGZtKQorCQkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKHByaXYtPnR4X3RmbSk7CisJCWlmIChwcml2LT5yeF90Zm0pCisJCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIocHJpdi0+cnhfdGZtKTsKKwkJa2ZyZWUocHJpdik7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIHZvaWQgcHJpc20yX3dlcF9kZWluaXQodm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICpfcHJpdiA9IHByaXY7CisKKwlpZiAoX3ByaXYpIHsKKwkJaWYgKF9wcml2LT50eF90Zm0pCisJCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIoX3ByaXYtPnR4X3RmbSk7CisJCWlmIChfcHJpdi0+cnhfdGZtKQorCQkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKF9wcml2LT5yeF90Zm0pOworCX0KKwlrZnJlZShwcml2KTsKK30KKworLyogUGVyZm9ybSBXRVAgZW5jcnlwdGlvbiBvbiBnaXZlbiBza2IgdGhhdCBoYXMgYXQgbGVhc3QgNCBieXRlcyBvZiBoZWFkcm9vbQorICogZm9yIElWIGFuZCA0IGJ5dGVzIG9mIHRhaWxyb29tIGZvciBJQ1YuIEJvdGggSVYgYW5kIElDViB3aWxsIGJlIHRyYW5zbWl0dGVkLAorICogc28gdGhlIHBheWxvYWQgbGVuZ3RoIGluY3JlYXNlcyB3aXRoIDggYnl0ZXMuCisgKgorICogV0VQIGZyYW1lIHBheWxvYWQ6IElWICsgVFgga2V5IGlkeCwgUkM0KGRhdGEpLCBJQ1YgPSBSQzQoQ1JDMzIoZGF0YSkpCisgKi8KK3N0YXRpYyBpbnQgcHJpc20yX3dlcF9lbmNyeXB0KHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBwcmlzbTJfd2VwX2RhdGEgKndlcCA9IHByaXY7CisJdTMyIGtsZW4sIGxlbjsKKwl1OCBrZXlbV0VQX0tFWV9MRU4gKyAzXTsKKwl1OCAqcG9zOworCWNiX2Rlc2MgKnRjYl9kZXNjID0gKGNiX2Rlc2MgKikoc2tiLT5jYiArIE1BWF9ERVZfQUREUl9TSVpFKTsKKwlzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgZGVzYyA9IHsudGZtID0gd2VwLT50eF90Zm19OworCXUzMiBjcmM7CisJdTggKmljdjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CisJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgNCB8fCBza2JfdGFpbHJvb20oc2tiKSA8IDQgfHwKKwkgICAgc2tiLT5sZW4gPCBoZHJfbGVuKQorCQlyZXR1cm4gLTE7CisKKwlsZW4gPSBza2ItPmxlbiAtIGhkcl9sZW47CisJcG9zID0gc2tiX3B1c2goc2tiLCA0KTsKKwltZW1tb3ZlKHBvcywgcG9zICsgNCwgaGRyX2xlbik7CisJcG9zICs9IGhkcl9sZW47CisKKwlrbGVuID0gMyArIHdlcC0+a2V5X2xlbjsKKworCXdlcC0+aXYrKzsKKworCS8qIEZsdWhyZXIsIE1hbnRpbiwgYW5kIFNoYW1pciBoYXZlIHJlcG9ydGVkIHdlYWtuZXNzZXMgaW4gdGhlIGtleQorCSAqIHNjaGVkdWxpbmcgYWxnb3JpdGhtIG9mIFJDNC4gQXQgbGVhc3QgSVZzIChLZXlCeXRlICsgMywgMHhmZiwgTikKKwkgKiBjYW4gYmUgdXNlZCB0byBzcGVlZHVwIGF0dGFja3MsIHNvIGF2b2lkIHVzaW5nIHRoZW0uICovCisJaWYgKCh3ZXAtPml2ICYgMHhmZjAwKSA9PSAweGZmMDApIHsKKwkJdTggQiA9ICh3ZXAtPml2ID4+IDE2KSAmIDB4ZmY7CisJCWlmIChCID49IDMgJiYgQiA8IGtsZW4pCisJCQl3ZXAtPml2ICs9IDB4MDEwMDsKKwl9CisKKwkvKiBQcmVwZW5kIDI0LWJpdCBJViB0byBSQzQga2V5IGFuZCBUWCBmcmFtZSAqLworCSpwb3MrKyA9IGtleVswXSA9ICh3ZXAtPml2ID4+IDE2KSAmIDB4ZmY7CisJKnBvcysrID0ga2V5WzFdID0gKHdlcC0+aXYgPj4gOCkgJiAweGZmOworCSpwb3MrKyA9IGtleVsyXSA9IHdlcC0+aXYgJiAweGZmOworCSpwb3MrKyA9IHdlcC0+a2V5X2lkeCA8PCA2OworCisJLyogQ29weSByZXN0IG9mIHRoZSBXRVAga2V5ICh0aGUgc2VjcmV0IHBhcnQpICovCisJbWVtY3B5KGtleSArIDMsIHdlcC0+a2V5LCB3ZXAtPmtleV9sZW4pOworCisJaWYgKCF0Y2JfZGVzYy0+Ykh3U2VjKQorCXsKKworCQkvKiBBcHBlbmQgbGl0dGxlLWVuZGlhbiBDUkMzMiBhbmQgZW5jcnlwdCBpdCB0byBwcm9kdWNlIElDViAqLworCQljcmMgPSB+Y3JjMzJfbGUofjAsIHBvcywgbGVuKTsKKwkJaWN2ID0gc2tiX3B1dChza2IsIDQpOworCQlpY3ZbMF0gPSBjcmM7CisJCWljdlsxXSA9IGNyYyA+PiA4OworCQlpY3ZbMl0gPSBjcmMgPj4gMTY7CisJCWljdlszXSA9IGNyYyA+PiAyNDsKKworCQljcnlwdG9fYmxrY2lwaGVyX3NldGtleSh3ZXAtPnR4X3RmbSwga2V5LCBrbGVuKTsKKwkJc2dfaW5pdF9vbmUoJnNnLCBwb3MsIGxlbis0KTsKKworCQlyZXR1cm4gY3J5cHRvX2Jsa2NpcGhlcl9lbmNyeXB0KCZkZXNjLCAmc2csICZzZywgbGVuICsgNCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyogUGVyZm9ybSBXRVAgZGVjcnlwdGlvbiBvbiBnaXZlbiBidWZmZXIuIEJ1ZmZlciBpbmNsdWRlcyB3aG9sZSBXRVAgcGFydCBvZgorICogdGhlIGZyYW1lOiBJViAoNCBieXRlcyksIGVuY3J5cHRlZCBwYXlsb2FkIChpbmNsdWRpbmcgU05BUCBoZWFkZXIpLAorICogSUNWICg0IGJ5dGVzKS4gbGVuIGluY2x1ZGVzIGJvdGggSVYgYW5kIElDVi4KKyAqCisgKiBSZXR1cm5zIDAgaWYgZnJhbWUgd2FzIGRlY3J5cHRlZCBzdWNjZXNzZnVsbHkgYW5kIElDViB3YXMgY29ycmVjdCBhbmQgLTEgb24KKyAqIGZhaWx1cmUuIElmIGZyYW1lIGlzIE9LLCBJViBhbmQgSUNWIHdpbGwgYmUgcmVtb3ZlZC4KKyAqLworc3RhdGljIGludCBwcmlzbTJfd2VwX2RlY3J5cHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpCit7CisJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqd2VwID0gcHJpdjsKKwl1MzIgIGtsZW4sIHBsZW47CisJdTgga2V5W1dFUF9LRVlfTEVOICsgM107CisJdTgga2V5aWR4LCAqcG9zOworCWNiX2Rlc2MgKnRjYl9kZXNjID0gKGNiX2Rlc2MgKikoc2tiLT5jYiArIE1BWF9ERVZfQUREUl9TSVpFKTsKKwlzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgZGVzYyA9IHsudGZtID0gd2VwLT5yeF90Zm19OworCXUzMiBjcmM7CisJdTggaWN2WzRdOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKwlpZiAoc2tiLT5sZW4gPCBoZHJfbGVuICsgOCkKKwkJcmV0dXJuIC0xOworCisJcG9zID0gc2tiLT5kYXRhICsgaGRyX2xlbjsKKwlrZXlbMF0gPSAqcG9zKys7CisJa2V5WzFdID0gKnBvcysrOworCWtleVsyXSA9ICpwb3MrKzsKKwlrZXlpZHggPSAqcG9zKysgPj4gNjsKKwlpZiAoa2V5aWR4ICE9IHdlcC0+a2V5X2lkeCkKKwkJcmV0dXJuIC0xOworCisJa2xlbiA9IDMgKyB3ZXAtPmtleV9sZW47CisKKwkvKiBDb3B5IHJlc3Qgb2YgdGhlIFdFUCBrZXkgKHRoZSBzZWNyZXQgcGFydCkgKi8KKwltZW1jcHkoa2V5ICsgMywgd2VwLT5rZXksIHdlcC0+a2V5X2xlbik7CisKKwkvKiBBcHBseSBSQzQgdG8gZGF0YSBhbmQgY29tcHV0ZSBDUkMzMiBvdmVyIGRlY3J5cHRlZCBkYXRhICovCisJcGxlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbiAtIDg7CisKKwlpZiAoIXRjYl9kZXNjLT5iSHdTZWMpCisJeworCQljcnlwdG9fYmxrY2lwaGVyX3NldGtleSh3ZXAtPnJ4X3RmbSwga2V5LCBrbGVuKTsKKwkJc2dfaW5pdF9vbmUoJnNnLCBwb3MsIHBsZW4rNCk7CisKKwkJaWYgKGNyeXB0b19ibGtjaXBoZXJfZGVjcnlwdCgmZGVzYywgJnNnLCAmc2csIHBsZW4gKyA0KSkKKwkJCXJldHVybiAtNzsKKworCQljcmMgPSB+Y3JjMzJfbGUofjAsIHBvcywgcGxlbik7CisJCWljdlswXSA9IGNyYzsKKwkJaWN2WzFdID0gY3JjID4+IDg7CisJCWljdlsyXSA9IGNyYyA+PiAxNjsKKwkJaWN2WzNdID0gY3JjID4+IDI0OworCQlpZiAobWVtY21wKGljdiwgcG9zICsgcGxlbiwgNCkgIT0gMCkgeworCQkJLyogSUNWIG1pc21hdGNoIC0gZHJvcCBmcmFtZSAqLworCQkJcmV0dXJuIC0yOworCQl9CisJfQorCS8qIFJlbW92ZSBJViBhbmQgSUNWICovCisJbWVtbW92ZShza2ItPmRhdGEgKyA0LCBza2ItPmRhdGEsIGhkcl9sZW4pOworCXNrYl9wdWxsKHNrYiwgNCk7CisJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIDQpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfd2VwX3NldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBwcmlzbTJfd2VwX2RhdGEgKndlcCA9IHByaXY7CisKKwlpZiAobGVuIDwgMCB8fCBsZW4gPiBXRVBfS0VZX0xFTikKKwkJcmV0dXJuIC0xOworCisJbWVtY3B5KHdlcC0+a2V5LCBrZXksIGxlbik7CisJd2VwLT5rZXlfbGVuID0gbGVuOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcmlzbTJfd2VwX2dldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBwcmlzbTJfd2VwX2RhdGEgKndlcCA9IHByaXY7CisKKwlpZiAobGVuIDwgd2VwLT5rZXlfbGVuKQorCQlyZXR1cm4gLTE7CisKKwltZW1jcHkoa2V5LCB3ZXAtPmtleSwgd2VwLT5rZXlfbGVuKTsKKworCXJldHVybiB3ZXAtPmtleV9sZW47Cit9CisKKworc3RhdGljIGNoYXIgKiBwcmlzbTJfd2VwX3ByaW50X3N0YXRzKGNoYXIgKnAsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqd2VwID0gcHJpdjsKKwlwICs9IHNwcmludGYocCwgImtleVslZF0gYWxnPVdFUCBsZW49JWRcbiIsCisJCSAgICAgd2VwLT5rZXlfaWR4LCB3ZXAtPmtleV9sZW4pOworCXJldHVybiBwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgaWVlZTgwMjExX2NyeXB0X3dlcCA9IHsKKwkubmFtZQkJCT0gIldFUCIsCisJLmluaXQJCQk9IHByaXNtMl93ZXBfaW5pdCwKKwkuZGVpbml0CQkJPSBwcmlzbTJfd2VwX2RlaW5pdCwKKwkuZW5jcnlwdF9tcGR1CQk9IHByaXNtMl93ZXBfZW5jcnlwdCwKKwkuZGVjcnlwdF9tcGR1CQk9IHByaXNtMl93ZXBfZGVjcnlwdCwKKwkuZW5jcnlwdF9tc2R1CQk9IE5VTEwsCisJLmRlY3J5cHRfbXNkdQkJPSBOVUxMLAorCS5zZXRfa2V5CQk9IHByaXNtMl93ZXBfc2V0X2tleSwKKwkuZ2V0X2tleQkJPSBwcmlzbTJfd2VwX2dldF9rZXksCisJLnByaW50X3N0YXRzCQk9IHByaXNtMl93ZXBfcHJpbnRfc3RhdHMsCisJLmV4dHJhX3ByZWZpeF9sZW4JPSA0LCAvKiBJViAqLworCS5leHRyYV9wb3N0Zml4X2xlbgk9IDQsIC8qIElDViAqLworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCit9OworCitpbnQgX19pbml0IGllZWU4MDIxMV9jcnlwdG9fd2VwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF93ZXApOworfQorCit2b2lkIF9fZXhpdCBpZWVlODAyMTFfY3J5cHRvX3dlcF9leGl0KHZvaWQpCit7CisJaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wcygmaWVlZTgwMjExX2NyeXB0X3dlcCk7Cit9CisKK3ZvaWQgaWVlZTgwMjExX3dlcF9udWxsKHZvaWQpCit7CisvLwlwcmludGsoIj09PT09PT09PT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E4NjkwZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCkBAIC0wLDAgKzEsMzI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIENvcHlyaWdodChjKSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgYmFzZWQgb24gdGhlIFdFUCBlbmFibGVtZW50IGNvZGUgcHJvdmlkZWQgYnkgdGhlCisgIEhvc3QgQVAgcHJvamVjdCBob3N0YXAtZHJpdmVycyB2MC4xLjMKKyAgQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgIDxqa21hbGluZUBjYy5odXQuZmk+CisgIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKworICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKworICBDb250YWN0IEluZm9ybWF0aW9uOgorICBKYW1lcyBQLiBLZXRyZW5vcyA8aXB3MjEwMC1hZG1pbkBsaW51eC5pbnRlbC5jb20+CisgIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisvLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KKworI2luY2x1ZGUgImllZWU4MDIxMS5oIgorCitNT0RVTEVfREVTQ1JJUFRJT04oIjgwMi4xMSBkYXRhL21hbmFnZW1lbnQvY29udHJvbCBzdGFjayIpOworTU9EVUxFX0FVVEhPUigiQ29weXJpZ2h0IChDKSAyMDA0IEludGVsIENvcnBvcmF0aW9uIDxqa2V0cmVub0BsaW51eC5pbnRlbC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgRFJWX05BTUUgImllZWU4MDIxMSIKKworc3RhdGljIGlubGluZSBpbnQgaWVlZTgwMjExX25ldHdvcmtzX2FsbG9jYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWlmIChpZWVlLT5uZXR3b3JrcykKKwkJcmV0dXJuIDA7CisKKwlpZWVlLT5uZXR3b3JrcyA9IGttYWxsb2MoCisJCU1BWF9ORVRXT1JLX0NPVU5UICogc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayksCisJCUdGUF9LRVJORUwpOworCWlmICghaWVlZS0+bmV0d29ya3MpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyBiZWFjb25zXG4iLAorCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KGllZWUtPm5ldHdvcmtzLCAwLAorCSAgICAgICBNQVhfTkVUV09SS19DT1VOVCAqIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmspKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaWVlZTgwMjExX25ldHdvcmtzX2ZyZWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWYgKCFpZWVlLT5uZXR3b3JrcykKKwkJcmV0dXJuOworCWtmcmVlKGllZWUtPm5ldHdvcmtzKTsKKwlpZWVlLT5uZXR3b3JrcyA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFfbmV0d29ya3NfaW5pdGlhbGl6ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpbnQgaTsKKworCUlOSVRfTElTVF9IRUFEKCZpZWVlLT5uZXR3b3JrX2ZyZWVfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmllZWUtPm5ldHdvcmtfbGlzdCk7CisJZm9yIChpID0gMDsgaSA8IE1BWF9ORVRXT1JLX0NPVU5UOyBpKyspCisJCWxpc3RfYWRkX3RhaWwoJmllZWUtPm5ldHdvcmtzW2ldLmxpc3QsICZpZWVlLT5uZXR3b3JrX2ZyZWVfbGlzdCk7Cit9CisKKworc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX2llZWU4MDIxMShpbnQgc2l6ZW9mX3ByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgaSxlcnI7CisKKwlJRUVFODAyMTFfREVCVUdfSU5GTygiSW5pdGlhbGl6aW5nLi4uXG4iKTsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSkgKyBzaXplb2ZfcHJpdik7CisJaWYgKCFkZXYpIHsKKwkJSUVFRTgwMjExX0VSUk9SKCJVbmFibGUgdG8gbmV0d29yayBkZXZpY2UuXG4iKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJaWVlZSA9IG5ldGRldl9wcml2KGRldik7CisJbWVtc2V0KGllZWUsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSkrc2l6ZW9mX3ByaXYpOworCWllZWUtPmRldiA9IGRldjsKKworCWVyciA9IGllZWU4MDIxMV9uZXR3b3Jrc19hbGxvY2F0ZShpZWVlKTsKKwlpZiAoZXJyKSB7CisJCUlFRUU4MDIxMV9FUlJPUigiVW5hYmxlIHRvIGFsbG9jYXRlIGJlYWNvbiBzdG9yYWdlOiAlZFxuIiwKKwkJCQllcnIpOworCQlnb3RvIGZhaWxlZDsKKwl9CisJaWVlZTgwMjExX25ldHdvcmtzX2luaXRpYWxpemUoaWVlZSk7CisKKworCS8qIERlZmF1bHQgZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQgaXMgbWF4aW11bSBwYXlsb2FkIHNpemUgKi8KKwlpZWVlLT5mdHMgPSBERUZBVUxUX0ZUUzsKKwlpZWVlLT5zY2FuX2FnZSA9IERFRkFVTFRfTUFYX1NDQU5fQUdFOworCWllZWUtPm9wZW5fd2VwID0gMTsKKworCS8qIERlZmF1bHQgdG8gZW5hYmxpbmcgZnVsbCBvcGVuIFdFUCB3aXRoIGhvc3QgYmFzZWQgZW5jcnlwdC9kZWNyeXB0ICovCisJaWVlZS0+aG9zdF9lbmNyeXB0ID0gMTsKKwlpZWVlLT5ob3N0X2RlY3J5cHQgPSAxOworCWllZWUtPmllZWU4MDJfMXggPSAxOyAvKiBEZWZhdWx0IHRvIHN1cHBvcnRpbmcgODAyLjF4ICovCisKKwlJTklUX0xJU1RfSEVBRCgmaWVlZS0+Y3J5cHRfZGVpbml0X2xpc3QpOworCWluaXRfdGltZXIoJmllZWUtPmNyeXB0X2RlaW5pdF90aW1lcik7CisJaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylpZWVlOworCWllZWUtPmNyeXB0X2RlaW5pdF90aW1lci5mdW5jdGlvbiA9IGllZWU4MDIxMV9jcnlwdF9kZWluaXRfaGFuZGxlcjsKKworCXNwaW5fbG9ja19pbml0KCZpZWVlLT5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmaWVlZS0+d3BheF9zdWl0bGlzdF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmaWVlZS0+Yndfc3BpbmxvY2spOworCXNwaW5fbG9ja19pbml0KCZpZWVlLT5yZW9yZGVyX3NwaW5sb2NrKTsKKwkvL2FkZGVkIGJ5IFdCCisJYXRvbWljX3NldCgmKGllZWUtPmF0bV9jaG5sb3ApLCAwKTsKKwlhdG9taWNfc2V0KCYoaWVlZS0+YXRtX3N3YncpLCAwKTsKKworCWllZWUtPndwYXhfdHlwZV9zZXQgPSAwOworCWllZWUtPndwYV9lbmFibGVkID0gMDsKKwlpZWVlLT50a2lwX2NvdW50ZXJtZWFzdXJlcyA9IDA7CisJaWVlZS0+ZHJvcF91bmVuY3J5cHRlZCA9IDA7CisJaWVlZS0+cHJpdmFjeV9pbnZva2VkID0gMDsKKwlpZWVlLT5pZWVlODAyXzF4ID0gMTsKKwlpZWVlLT5yYXdfdHggPSAwOworCS8vaWVlZS0+aHdzZWNfc3VwcG9ydCA9IDE7IC8vZGVmYWx0IHN1cHBvcnQgaHcgc2VjdXJpdHkuIC8vdXNlIG1vZHVsZV9wYXJhbSBpbnN0ZWFkLgorCWllZWUtPmh3c2VjX2FjdGl2ZSA9IDA7IC8vZGlzYWJsZSBod3NlYywgc3dpdGNoIGl0IG9uIHdoZW4gbmVjZXNzYXJ5LgorCisJaWVlZTgwMjExX3NvZnRtYWNfaW5pdChpZWVlKTsKKworCWllZWUtPnBIVEluZm8gPSAoUlRfSElHSF9USFJPVUdIUFVUKilremFsbG9jKHNpemVvZihSVF9ISUdIX1RIUk9VR0hQVVQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoaWVlZS0+cEhUSW5mbyA9PSBOVUxMKQorCXsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJjYW4ndCBhbGxvYyBtZW1vcnkgZm9yIEhUSW5mb1xuIik7CisJCXJldHVybiBOVUxMOworCX0KKwlIVFVwZGF0ZURlZmF1bHRTZXR0aW5nKGllZWUpOworCUhUSW5pdGlhbGl6ZUhUSW5mbyhpZWVlKTsgLy9tYXkgbW92ZSB0byBvdGhlciBwbGFjZS4KKwlUU0luaXRpYWxpemUoaWVlZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSUVFRV9JQlNTX01BQ19IQVNIX1NJWkU7IGkrKykKKwkJSU5JVF9MSVNUX0hFQUQoJmllZWUtPmlic3NfbWFjX2hhc2hbaV0pOworCisJZm9yIChpID0gMDsgaSA8IDE3OyBpKyspIHsKKwkgIGllZWUtPmxhc3RfcnhzZXFfbnVtW2ldID0gLTE7CisJICBpZWVlLT5sYXN0X3J4ZnJhZ19udW1baV0gPSAtMTsKKwkgIGllZWUtPmxhc3RfcGFja2V0X3RpbWVbaV0gPSAwOworCX0KKworLy9UaGVzZSBmdW5jdGlvbiB3ZXJlIGFkZGVkIHRvIGxvYWQgY3J5cHRlIG1vZHVsZSBhdXRvbHkKKwlpZWVlODAyMTFfdGtpcF9udWxsKCk7CisJaWVlZTgwMjExX3dlcF9udWxsKCk7CisJaWVlZTgwMjExX2NjbXBfbnVsbCgpOworCisJcmV0dXJuIGRldjsKKworIGZhaWxlZDoKKwlpZiAoZGV2KQorCQlmcmVlX25ldGRldihkZXYpOworCisJcmV0dXJuIE5VTEw7Cit9CisKKwordm9pZCBmcmVlX2llZWU4MDIxMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKwkvL3N0cnVjdCBsaXN0X2hlYWQgKnAsICpxOworLy8JZGVsX3RpbWVyX3N5bmMoJmllZWUtPlN3QndUaW1lcik7CisJaWYgKGllZWUtPnBIVEluZm8gIT0gTlVMTCkKKwl7CisJCWtmcmVlKGllZWUtPnBIVEluZm8pOworCQlpZWVlLT5wSFRJbmZvID0gTlVMTDsKKwl9CisJUmVtb3ZlQWxsVFMoaWVlZSk7CisJaWVlZTgwMjExX3NvZnRtYWNfZnJlZShpZWVlKTsKKwlkZWxfdGltZXJfc3luYygmaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyKTsKKwlpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXMoaWVlZSwgMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgV0VQX0tFWVM7IGkrKykgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0ID0gaWVlZS0+Y3J5cHRbaV07CisJCWlmIChjcnlwdCkgeworCQkJaWYgKGNyeXB0LT5vcHMpCisJCQkJY3J5cHQtPm9wcy0+ZGVpbml0KGNyeXB0LT5wcml2KTsKKwkJCWtmcmVlKGNyeXB0KTsKKwkJCWllZWUtPmNyeXB0W2ldID0gTlVMTDsKKwkJfQorCX0KKworCWllZWU4MDIxMV9uZXR3b3Jrc19mcmVlKGllZWUpOworCWZyZWVfbmV0ZGV2KGRldik7Cit9CisKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisKK3UzMiBpZWVlODAyMTFfZGVidWdfbGV2ZWwgPSAwOworc3RhdGljIGludCBkZWJ1ZyA9IFwKKwkvLwkJICAgIElFRUU4MDIxMV9ETF9JTkZPCXwKKwkvLwkJICAgIElFRUU4MDIxMV9ETF9XWAl8CisJLy8JCSAgICBJRUVFODAyMTFfRExfU0NBTgl8CisJLy8JCSAgICBJRUVFODAyMTFfRExfU1RBVEUJfAorCS8vCQkgICAgSUVFRTgwMjExX0RMX01HTVQJfAorCS8vCQkgICAgSUVFRTgwMjExX0RMX0ZSQUcJfAorCS8vCQkgICAgSUVFRTgwMjExX0RMX0VBUAl8CisJLy8JCSAgICBJRUVFODAyMTFfRExfRFJPUAl8CisJLy8JCSAgICBJRUVFODAyMTFfRExfVFgJfAorCS8vCQkgICAgSUVFRTgwMjExX0RMX1JYCXwKKwkJCSAgICAvL0lFRUU4MDIxMV9ETF9RT1MgICAgfAorCS8vCQkgICAgSUVFRTgwMjExX0RMX0hUIAl8CisJLy8JCSAgICBJRUVFODAyMTFfRExfVFMJfAorLy8JCQkgICAgSUVFRTgwMjExX0RMX0JBIAl8CisJLy8JCSAgICBJRUVFODAyMTFfRExfUkVPUkRFUnwKKy8vCQkJICAgIElFRUU4MDIxMV9ETF9UUkFDRSAgfAorCQkJICAgIC8vSUVFRTgwMjExX0RMX0RBVEEJfAorCQkJICAgIElFRUU4MDIxMV9ETF9FUlIJICAvL2F3YXlscyBvcGVuIHRoaXMgZmxhZ3MgdG8gc2hvdyBlcnJvciBvdXQKKwkJCSAgICA7CitzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmllZWU4MDIxMV9wcm9jID0gTlVMTDsKKworc3RhdGljIGludCBzaG93X2RlYnVnX2xldmVsKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIHNucHJpbnRmKHBhZ2UsIGNvdW50LCAiMHglMDhYXG4iLCBpZWVlODAyMTFfZGVidWdfbGV2ZWwpOworfQorCitzdGF0aWMgaW50IHN0b3JlX2RlYnVnX2xldmVsKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWZmZXIsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJY2hhciBidWZbXSA9ICIweDAwMDAwMDAwIjsKKwl1bnNpZ25lZCBsb25nIGxlbiA9IG1pbihzaXplb2YoYnVmKSAtIDEsIGNvdW50KTsKKwljaGFyICpwID0gKGNoYXIgKilidWY7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGxlbikpCisJCXJldHVybiBjb3VudDsKKwlidWZbbGVuXSA9IDA7CisJaWYgKHBbMV0gPT0gJ3gnIHx8IHBbMV0gPT0gJ1gnIHx8IHBbMF0gPT0gJ3gnIHx8IHBbMF0gPT0gJ1gnKSB7CisJCXArKzsKKwkJaWYgKHBbMF0gPT0gJ3gnIHx8IHBbMF0gPT0gJ1gnKQorCQkJcCsrOworCQl2YWwgPSBzaW1wbGVfc3RydG91bChwLCAmcCwgMTYpOworCX0gZWxzZQorCQl2YWwgPSBzaW1wbGVfc3RydG91bChwLCAmcCwgMTApOworCWlmIChwID09IGJ1ZikKKwkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRQorCQkgICAgICAgIjogJXMgaXMgbm90IGluIGhleCBvciBkZWNpbWFsIGZvcm0uXG4iLCBidWYpOworCWVsc2UKKwkJaWVlZTgwMjExX2RlYnVnX2xldmVsID0gdmFsOworCisJcmV0dXJuIHN0cm5sZW4oYnVmLCBjb3VudCk7Cit9CisKK2ludCBfX2luaXQgaWVlZTgwMjExX2RlYnVnX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmU7CisKKwlpZWVlODAyMTFfZGVidWdfbGV2ZWwgPSBkZWJ1ZzsKKworCWllZWU4MDIxMV9wcm9jID0gY3JlYXRlX3Byb2NfZW50cnkoRFJWX05BTUUsIFNfSUZESVIsIGluaXRfbmV0LnByb2NfbmV0KTsKKwlpZiAoaWVlZTgwMjExX3Byb2MgPT0gTlVMTCkgeworCQlJRUVFODAyMTFfRVJST1IoIlVuYWJsZSB0byBjcmVhdGUgIiBEUlZfTkFNRQorCQkJCSIgcHJvYyBkaXJlY3RvcnlcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJkZWJ1Z19sZXZlbCIsIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCSAgICAgIGllZWU4MDIxMV9wcm9jKTsKKwlpZiAoIWUpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoRFJWX05BTUUsIGluaXRfbmV0LnByb2NfbmV0KTsKKwkJaWVlZTgwMjExX3Byb2MgPSBOVUxMOworCQlyZXR1cm4gLUVJTzsKKwl9CisJZS0+cmVhZF9wcm9jID0gc2hvd19kZWJ1Z19sZXZlbDsKKwllLT53cml0ZV9wcm9jID0gc3RvcmVfZGVidWdfbGV2ZWw7CisJZS0+ZGF0YSA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBfX2V4aXQgaWVlZTgwMjExX2RlYnVnX2V4aXQodm9pZCkKK3sKKwlpZiAoaWVlZTgwMjExX3Byb2MpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImRlYnVnX2xldmVsIiwgaWVlZTgwMjExX3Byb2MpOworCQlyZW1vdmVfcHJvY19lbnRyeShEUlZfTkFNRSwgaW5pdF9uZXQucHJvY19uZXQpOworCQlpZWVlODAyMTFfcHJvYyA9IE5VTEw7CisJfQorfQorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJkZWJ1ZyBvdXRwdXQgbWFzayIpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTAwM2M1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwpAQCAtMCwwICsxLDI2NjggQEAKKy8qCisgKiBPcmlnaW5hbCBjb2RlIGJhc2VkIEhvc3QgQVAgKHNvZnR3YXJlIHdpcmVsZXNzIExBTiBhY2Nlc3MgcG9pbnQpIGRyaXZlcgorICogZm9yIEludGVyc2lsIFByaXNtMi8yLjUvMyAtIGhvc3RhcC5vIG1vZHVsZSwgY29tbW9uIHJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgKiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIEZldyBtb2RpZmljYXRpb25zIGZvciBSZWFsdGVrJ3MgV2ktRmkgZHJpdmVycyBieQorICBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisKKyAgQSBzcGVjaWFsIHRoYW5rcyBnb2VzIHRvIFJlYWx0ZWsgZm9yIHRoZWlyIHN1cHBvcnQgIQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisvLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisjaW5jbHVkZSAiZG90MTFkLmgiCisjZW5kaWYKK3N0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFfbW9uaXRvcl9yeChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcnhfc3RhdHMpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqKXNrYi0+ZGF0YTsKKwl1MTYgZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisKKwlza2ItPmRldiA9IGllZWUtPmRldjsKKyAgICAgICAgc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKKworCXNrYl9wdWxsKHNrYiwgaWVlZTgwMjExX2dldF9oZHJsZW4oZmMpKTsKKwlza2ItPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKKwlza2ItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF84MDIxMV9SQVcpOworCW1lbXNldChza2ItPmNiLCAwLCBzaXplb2Yoc2tiLT5jYikpOworCW5ldGlmX3J4KHNrYik7Cit9CisKKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9mcmFnX2VudHJ5ICoKK2llZWU4MDIxMV9mcmFnX2NhY2hlX2ZpbmQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHVuc2lnbmVkIGludCBzZXEsCisJCQkgIHVuc2lnbmVkIGludCBmcmFnLCB1OCB0aWQsdTggKnNyYywgdTggKmRzdCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdfZW50cnkgKmVudHJ5OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IElFRUU4MDIxMV9GUkFHX0NBQ0hFX0xFTjsgaSsrKSB7CisJCWVudHJ5ID0gJmllZWUtPmZyYWdfY2FjaGVbdGlkXVtpXTsKKwkJaWYgKGVudHJ5LT5za2IgIT0gTlVMTCAmJgorCQkgICAgdGltZV9hZnRlcihqaWZmaWVzLCBlbnRyeS0+Zmlyc3RfZnJhZ190aW1lICsgMiAqIEhaKSkgeworCQkJSUVFRTgwMjExX0RFQlVHX0ZSQUcoCisJCQkJImV4cGlyaW5nIGZyYWdtZW50IGNhY2hlIGVudHJ5ICIKKwkJCQkic2VxPSV1IGxhc3RfZnJhZz0ldVxuIiwKKwkJCQllbnRyeS0+c2VxLCBlbnRyeS0+bGFzdF9mcmFnKTsKKwkJCWRldl9rZnJlZV9za2JfYW55KGVudHJ5LT5za2IpOworCQkJZW50cnktPnNrYiA9IE5VTEw7CisJCX0KKworCQlpZiAoZW50cnktPnNrYiAhPSBOVUxMICYmIGVudHJ5LT5zZXEgPT0gc2VxICYmCisJCSAgICAoZW50cnktPmxhc3RfZnJhZyArIDEgPT0gZnJhZyB8fCBmcmFnID09IC0xKSAmJgorCQkgICAgbWVtY21wKGVudHJ5LT5zcmNfYWRkciwgc3JjLCBFVEhfQUxFTikgPT0gMCAmJgorCQkgICAgbWVtY21wKGVudHJ5LT5kc3RfYWRkciwgZHN0LCBFVEhfQUxFTikgPT0gMCkKKwkJCXJldHVybiBlbnRyeTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgoraWVlZTgwMjExX2ZyYWdfY2FjaGVfZ2V0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZHIpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJdTE2IGZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCXUxNiBzYyA9IGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0bCk7CisJdW5zaWduZWQgaW50IGZyYWcgPSBXTEFOX0dFVF9TRVFfRlJBRyhzYyk7CisJdW5zaWduZWQgaW50IHNlcSA9IFdMQU5fR0VUX1NFUV9TRVEoc2MpOworCXN0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSAqZW50cnk7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJxb3MgKmhkcl8zYWRkcnFvczsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkcnFvcyAqaGRyXzRhZGRycW9zOworCXU4IHRpZDsKKworCWlmICgoKGZjICYgSUVFRTgwMjExX0ZDVExfRFNUT0RTKSA9PSBJRUVFODAyMTFfRkNUTF9EU1RPRFMpJiZJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpKSB7CisJICBoZHJfNGFkZHJxb3MgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHJxb3MgKiloZHI7CisJICB0aWQgPSBsZTE2X3RvX2NwdShoZHJfNGFkZHJxb3MtPnFvc19jdGwpICYgSUVFRTgwMjExX1FDVExfVElEOworCSAgdGlkID0gVVAyQUModGlkKTsKKwkgIHRpZCArKzsKKwl9IGVsc2UgaWYgKElFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykpIHsKKwkgIGhkcl8zYWRkcnFvcyA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcnFvcyAqKWhkcjsKKwkgIHRpZCA9IGxlMTZfdG9fY3B1KGhkcl8zYWRkcnFvcy0+cW9zX2N0bCkgJiBJRUVFODAyMTFfUUNUTF9USUQ7CisJICB0aWQgPSBVUDJBQyh0aWQpOworCSAgdGlkICsrOworCX0gZWxzZSB7CisJICB0aWQgPSAwOworCX0KKworCWlmIChmcmFnID09IDApIHsKKwkJLyogUmVzZXJ2ZSBlbm91Z2ggc3BhY2UgdG8gZml0IG1heGltdW0gZnJhbWUgbGVuZ3RoICovCisJCXNrYiA9IGRldl9hbGxvY19za2IoaWVlZS0+ZGV2LT5tdHUgKworCQkJCSAgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIpICsKKwkJCQkgICAgOCAvKiBMTEMgKi8gKworCQkJCSAgICAyIC8qIGFsaWdubWVudCAqLyArCisJCQkJICAgIDggLyogV0VQICovICsKKwkJCQkgICAgRVRIX0FMRU4gLyogV0RTICovICsKKwkJCQkgICAgKElFRUU4MDIxMV9RT1NfSEFTX1NFUShmYyk/MjowKSAvKiBRT1MgQ29udHJvbCAqLyk7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCisJCWVudHJ5ID0gJmllZWUtPmZyYWdfY2FjaGVbdGlkXVtpZWVlLT5mcmFnX25leHRfaWR4W3RpZF1dOworCQlpZWVlLT5mcmFnX25leHRfaWR4W3RpZF0rKzsKKwkJaWYgKGllZWUtPmZyYWdfbmV4dF9pZHhbdGlkXSA+PSBJRUVFODAyMTFfRlJBR19DQUNIRV9MRU4pCisJCQlpZWVlLT5mcmFnX25leHRfaWR4W3RpZF0gPSAwOworCisJCWlmIChlbnRyeS0+c2tiICE9IE5VTEwpCisJCQlkZXZfa2ZyZWVfc2tiX2FueShlbnRyeS0+c2tiKTsKKworCQllbnRyeS0+Zmlyc3RfZnJhZ190aW1lID0gamlmZmllczsKKwkJZW50cnktPnNlcSA9IHNlcTsKKwkJZW50cnktPmxhc3RfZnJhZyA9IGZyYWc7CisJCWVudHJ5LT5za2IgPSBza2I7CisJCW1lbWNweShlbnRyeS0+c3JjX2FkZHIsIGhkci0+YWRkcjIsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGVudHJ5LT5kc3RfYWRkciwgaGRyLT5hZGRyMSwgRVRIX0FMRU4pOworCX0gZWxzZSB7CisJCS8qIHJlY2VpdmVkIGEgZnJhZ21lbnQgb2YgYSBmcmFtZSBmb3Igd2hpY2ggdGhlIGhlYWQgZnJhZ21lbnQKKwkJICogc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHJlY2VpdmVkICovCisJCWVudHJ5ID0gaWVlZTgwMjExX2ZyYWdfY2FjaGVfZmluZChpZWVlLCBzZXEsIGZyYWcsIHRpZCxoZHItPmFkZHIyLAorCQkJCQkJICBoZHItPmFkZHIxKTsKKwkJaWYgKGVudHJ5ICE9IE5VTEwpIHsKKwkJCWVudHJ5LT5sYXN0X2ZyYWcgPSBmcmFnOworCQkJc2tiID0gZW50cnktPnNrYjsKKwkJfQorCX0KKworCXJldHVybiBza2I7Cit9CisKKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCitzdGF0aWMgaW50IGllZWU4MDIxMV9mcmFnX2NhY2hlX2ludmFsaWRhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZHIpCit7CisJdTE2IGZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCXUxNiBzYyA9IGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0bCk7CisJdW5zaWduZWQgaW50IHNlcSA9IFdMQU5fR0VUX1NFUV9TRVEoc2MpOworCXN0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSAqZW50cnk7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJxb3MgKmhkcl8zYWRkcnFvczsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkcnFvcyAqaGRyXzRhZGRycW9zOworCXU4IHRpZDsKKworCWlmKCgoZmMgJiBJRUVFODAyMTFfRkNUTF9EU1RPRFMpID09IElFRUU4MDIxMV9GQ1RMX0RTVE9EUykmJklFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykpIHsKKwkgIGhkcl80YWRkcnFvcyA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkcnFvcyAqKWhkcjsKKwkgIHRpZCA9IGxlMTZfdG9fY3B1KGhkcl80YWRkcnFvcy0+cW9zX2N0bCkgJiBJRUVFODAyMTFfUUNUTF9USUQ7CisJICB0aWQgPSBVUDJBQyh0aWQpOworCSAgdGlkICsrOworCX0gZWxzZSBpZiAoSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSkgeworCSAgaGRyXzNhZGRycW9zID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRycW9zICopaGRyOworCSAgdGlkID0gbGUxNl90b19jcHUoaGRyXzNhZGRycW9zLT5xb3NfY3RsKSAmIElFRUU4MDIxMV9RQ1RMX1RJRDsKKwkgIHRpZCA9IFVQMkFDKHRpZCk7CisJICB0aWQgKys7CisJfSBlbHNlIHsKKwkgIHRpZCA9IDA7CisJfQorCisJZW50cnkgPSBpZWVlODAyMTFfZnJhZ19jYWNoZV9maW5kKGllZWUsIHNlcSwgLTEsIHRpZCxoZHItPmFkZHIyLAorCQkJCQkgIGhkci0+YWRkcjEpOworCisJaWYgKGVudHJ5ID09IE5VTEwpIHsKKwkJSUVFRTgwMjExX0RFQlVHX0ZSQUcoCisJCQkiY291bGQgbm90IGludmFsaWRhdGUgZnJhZ21lbnQgY2FjaGUgIgorCQkJImVudHJ5IChzZXE9JXUpXG4iLCBzZXEpOworCQlyZXR1cm4gLTE7CisJfQorCisJZW50cnktPnNrYiA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKKworCisvKiBpZWVlODAyMTFfcnhfZnJhbWVfbWd0bXQKKyAqCisgKiBSZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgbWFuYWdlbWVudCBjb250cm9sIGZyYW1lcworICoKKyAqIENhbGxlZCBieSBpZWVlODAyMTFfcnggKi8KK3N0YXRpYyBpbmxpbmUgaW50CitpZWVlODAyMTFfcnhfZnJhbWVfbWdtdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzLCB1MTYgdHlwZSwKKwkJCXUxNiBzdHlwZSkKK3sKKwkvKiBPbiB0aGUgc3RydWN0IHN0YXRzIGRlZmluaXRpb24gdGhlcmUgaXMgd3JpdHRlbiB0aGF0CisJICogdGhpcyBpcyBub3QgbWFuZGF0b3J5Li4uLiBidXQgc2VlbXMgdGhhdCB0aGUgcHJvYmUKKwkgKiByZXNwb25zZSBwYXJzZXIgdXNlcyBpdAorCSAqLworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqIGhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKXNrYi0+ZGF0YTsKKworCXJ4X3N0YXRzLT5sZW4gPSBza2ItPmxlbjsKKwlpZWVlODAyMTFfcnhfbWd0KGllZWUsKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopc2tiLT5kYXRhLHJ4X3N0YXRzKTsKKyAgICAgICAgLy9pZiAoKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpICYmIChtZW1jbXAoaGRyLT5hZGRyMywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTikpKQorICAgICAgICBpZiAoKG1lbWNtcChoZHItPmFkZHIxLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTikpKS8vdXNlIEFERFIxIHRvIHBlcmZvcm0gYWRkcmVzcyBtYXRjaGluZyBmb3IgTWFuYWdlbWVudCBmcmFtZXMKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2JfYW55KHNrYik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworCWllZWU4MDIxMV9yeF9mcmFtZV9zb2Z0bWFjKGllZWUsIHNrYiwgcnhfc3RhdHMsIHR5cGUsIHN0eXBlKTsKKworCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisKKwlyZXR1cm4gMDsKKworCSNpZmRlZiBOT1RfWUVUCisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNYXN0ZXIgbW9kZSBub3QgeWV0IHN1cHBwb3J0ZWQuXG4iLAorCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisvKgorICBob3N0YXBfdXBkYXRlX3N0YV9wcyhpZWVlLCAoc3RydWN0IGhvc3RhcF9pZWVlODAyMTFfaGRyXzRhZGRyICopCisgIHNrYi0+ZGF0YSk7Ki8KKwl9CisKKwlpZiAoaWVlZS0+aG9zdGFwZCAmJiB0eXBlID09IElFRUU4MDIxMV9UWVBFX01HTVQpIHsKKwkJaWYgKHN0eXBlID09IFdMQU5fRkNfU1RZUEVfQkVBQ09OICYmCisJCSAgICBpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKKwkJCS8qIFByb2Nlc3MgYmVhY29uIGZyYW1lcyBhbHNvIGluIGtlcm5lbCBkcml2ZXIgdG8KKwkJCSAqIHVwZGF0ZSBTVEEoQVApIHRhYmxlIHN0YXRpc3RpY3MgKi8KKwkJCXNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChza2IyKQorCQkJCWhvc3RhcF9yeChza2IyLT5kZXYsIHNrYjIsIHJ4X3N0YXRzKTsKKwkJfQorCisJCS8qIHNlbmQgbWFuYWdlbWVudCBmcmFtZXMgdG8gdGhlIHVzZXIgc3BhY2UgZGFlbW9uIGZvcgorCQkgKiBwcm9jZXNzaW5nICovCisJCWllZWUtPmFwZGV2c3RhdHMucnhfcGFja2V0cysrOworCQlpZWVlLT5hcGRldnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQlwcmlzbTJfcnhfODAyMTEoaWVlZS0+YXBkZXYsIHNrYiwgcnhfc3RhdHMsIFBSSVNNMl9SWF9NR01UKTsKKwkJcmV0dXJuIDA7CisJfQorCisJICAgIGlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSB7CisJCWlmICh0eXBlICE9IFdMQU5fRkNfVFlQRV9NR01UICYmIHR5cGUgIT0gV0xBTl9GQ19UWVBFX0NUUkwpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogdW5rbm93biBtYW5hZ2VtZW50IGZyYW1lICIKKwkJCSAgICAgICAiKHR5cGU9MHglMDJ4LCBzdHlwZT0weCUwMngpIGRyb3BwZWRcbiIsCisJCQkgICAgICAgc2tiLT5kZXYtPm5hbWUsIHR5cGUsIHN0eXBlKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWhvc3RhcF9yeChza2ItPmRldiwgc2tiLCByeF9zdGF0cyk7CisJCXJldHVybiAwOworCX0KKworCXByaW50ayhLRVJOX0RFQlVHICIlczogaG9zdGFwX3J4X2ZyYW1lX21nbXQ6IG1hbmFnZW1lbnQgZnJhbWUgIgorCSAgICAgICAicmVjZWl2ZWQgaW4gbm9uLUhvc3QgQVAgbW9kZVxuIiwgc2tiLT5kZXYtPm5hbWUpOworCXJldHVybiAtMTsKKwkjZW5kaWYKK30KKworCisKKy8qIFNlZSBJRUVFIDgwMi4xSCBmb3IgTExDL1NOQVAgZW5jYXBzdWxhdGlvbi9kZWNhcHN1bGF0aW9uICovCisvKiBFdGhlcm5ldC1JSSBzbmFwIGhlYWRlciAoUkZDMTA0MiBmb3IgbW9zdCBFdGhlclR5cGVzKSAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgcmZjMTA0Ml9oZWFkZXJbXSA9Cit7IDB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKy8qIEJyaWRnZS1UdW5uZWwgaGVhZGVyIChmb3IgRXRoZXJUeXBlcyBFVEhfUF9BQVJQIGFuZCBFVEhfUF9JUFgpICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBicmlkZ2VfdHVubmVsX2hlYWRlcltdID0KK3sgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHhmOCB9OworLyogTm8gZW5jYXBzdWxhdGlvbiBoZWFkZXIgaWYgRXRoZXJUeXBlIDwgMHg2MDAgKD1sZW5ndGgpICovCisKKy8qIENhbGxlZCBieSBpZWVlODAyMTFfcnhfZnJhbWVfZGVjcnlwdCAqLworc3RhdGljIGludCBpZWVlODAyMTFfaXNfZWFwb2xfZnJhbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IsIHNpemVfdCBoZHJsZW4pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKwl1MTYgZmMsIGV0aGVydHlwZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGRyOworCXU4ICpwb3M7CisKKwlpZiAoc2tiLT5sZW4gPCAyNCkKKwkJcmV0dXJuIDA7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKikgc2tiLT5kYXRhOworCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCisJLyogY2hlY2sgdGhhdCB0aGUgZnJhbWUgaXMgdW5pY2FzdCBmcmFtZSB0byB1cyAqLworCWlmICgoZmMgJiAoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpID09CisJICAgIElFRUU4MDIxMV9GQ1RMX1RPRFMgJiYKKwkgICAgbWVtY21wKGhkci0+YWRkcjEsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSA9PSAwICYmCisJICAgIG1lbWNtcChoZHItPmFkZHIzLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTikgPT0gMCkgeworCQkvKiBUb0RTIGZyYW1lIHdpdGggb3duIGFkZHIgQlNTSUQgYW5kIERBICovCisJfSBlbHNlIGlmICgoZmMgJiAoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpID09CisJCSAgIElFRUU4MDIxMV9GQ1RMX0ZST01EUyAmJgorCQkgICBtZW1jbXAoaGRyLT5hZGRyMSwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pID09IDApIHsKKwkJLyogRnJvbURTIGZyYW1lIHdpdGggb3duIGFkZHIgYXMgREEgKi8KKwl9IGVsc2UKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2tiLT5sZW4gPCAyNCArIDgpCisJCXJldHVybiAwOworCisJLyogY2hlY2sgZm9yIHBvcnQgYWNjZXNzIGVudGl0eSBFdGhlcm5ldCB0eXBlICovCisvLwlwb3MgPSBza2ItPmRhdGEgKyAyNDsKKwlwb3MgPSBza2ItPmRhdGEgKyBoZHJsZW47CisJZXRoZXJ0eXBlID0gKHBvc1s2XSA8PCA4KSB8IHBvc1s3XTsKKwlpZiAoZXRoZXJ0eXBlID09IEVUSF9QX1BBRSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpLCBieSBpZWVlODAyMTFfcnggKi8KK3N0YXRpYyBpbmxpbmUgaW50CitpZWVlODAyMTFfcnhfZnJhbWVfZGVjcnlwdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHQpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkcjsKKwlpbnQgcmVzLCBoZHJsZW47CisKKwlpZiAoY3J5cHQgPT0gTlVMTCB8fCBjcnlwdC0+b3BzLT5kZWNyeXB0X21wZHUgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJaWYgKGllZWUtPmh3c2VjX2FjdGl2ZSkKKwl7CisJCWNiX2Rlc2MgKnRjYl9kZXNjID0gKGNiX2Rlc2MgKikoc2tiLT5jYisgTUFYX0RFVl9BRERSX1NJWkUpOworCQl0Y2JfZGVzYy0+Ykh3U2VjID0gMTsKKwl9CisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKKwloZHJsZW4gPSBpZWVlODAyMTFfZ2V0X2hkcmxlbihsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCkpOworCisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9DUllQVF9US0lQCisJaWYgKGllZWUtPnRraXBfY291bnRlcm1lYXN1cmVzICYmCisJICAgIHN0cmNtcChjcnlwdC0+b3BzLT5uYW1lLCAiVEtJUCIpID09IDApIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUS0lQIGNvdW50ZXJtZWFzdXJlczogZHJvcHBlZCAiCisJCQkgICAgICAgInJlY2VpdmVkIHBhY2tldCBmcm9tICIgTUFDX0ZNVCAiXG4iLAorCQkJICAgICAgIGllZWUtPmRldi0+bmFtZSwgTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKyNlbmRpZgorCisJYXRvbWljX2luYygmY3J5cHQtPnJlZmNudCk7CisJcmVzID0gY3J5cHQtPm9wcy0+ZGVjcnlwdF9tcGR1KHNrYiwgaGRybGVuLCBjcnlwdC0+cHJpdik7CisJYXRvbWljX2RlYygmY3J5cHQtPnJlZmNudCk7CisJaWYgKHJlcyA8IDApIHsKKwkJSUVFRTgwMjExX0RFQlVHX0RST1AoCisJCQkiZGVjcnlwdGlvbiBmYWlsZWQgKFNBPSIgTUFDX0ZNVAorCQkJIikgcmVzPSVkXG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpLCByZXMpOworCQlpZiAocmVzID09IC0yKQorCQkJSUVFRTgwMjExX0RFQlVHX0RST1AoIkRlY3J5cHRpb24gZmFpbGVkIElDViAiCisJCQkJCSAgICAgIm1pc21hdGNoIChrZXkgJWQpXG4iLAorCQkJCQkgICAgIHNrYi0+ZGF0YVtoZHJsZW4gKyAzXSA+PiA2KTsKKwkJaWVlZS0+aWVlZV9zdGF0cy5yeF9kaXNjYXJkc191bmRlY3J5cHRhYmxlKys7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorCisKKy8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKSwgYnkgaWVlZTgwMjExX3J4ICovCitzdGF0aWMgaW5saW5lIGludAoraWVlZTgwMjExX3J4X2ZyYW1lX2RlY3J5cHRfbXNkdShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgaW50IGtleWlkeCwgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGRyOworCWludCByZXMsIGhkcmxlbjsKKworCWlmIChjcnlwdCA9PSBOVUxMIHx8IGNyeXB0LT5vcHMtPmRlY3J5cHRfbXNkdSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlpZiAoaWVlZS0+aHdzZWNfYWN0aXZlKQorCXsKKwkJY2JfZGVzYyAqdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKShza2ItPmNiKyBNQVhfREVWX0FERFJfU0laRSk7CisJCXRjYl9kZXNjLT5iSHdTZWMgPSAxOworCX0KKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqKSBza2ItPmRhdGE7CisJaGRybGVuID0gaWVlZTgwMjExX2dldF9oZHJsZW4obGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpKTsKKworCWF0b21pY19pbmMoJmNyeXB0LT5yZWZjbnQpOworCXJlcyA9IGNyeXB0LT5vcHMtPmRlY3J5cHRfbXNkdShza2IsIGtleWlkeCwgaGRybGVuLCBjcnlwdC0+cHJpdik7CisJYXRvbWljX2RlYygmY3J5cHQtPnJlZmNudCk7CisJaWYgKHJlcyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNU0RVIGRlY3J5cHRpb24vTUlDIHZlcmlmaWNhdGlvbiBmYWlsZWQiCisJCSAgICAgICAiIChTQT0iIE1BQ19GTVQgIiBrZXlpZHg9JWQpXG4iLAorCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lLCBNQUNfQVJHKGhkci0+YWRkcjIpLCBrZXlpZHgpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyogdGhpcyBmdW5jdGlvbiBpcyBzdG9sZW4gZnJvbSBpcHcyMjAwIGRyaXZlciovCisjZGVmaW5lIElFRUVfUEFDS0VUX1JFVFJZX1RJTUUgKDUqSFopCitzdGF0aWMgaW50IGlzX2R1cGxpY2F0ZV9wYWNrZXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhlYWRlcikKK3sKKwl1MTYgZmMgPSBsZTE2X3RvX2NwdShoZWFkZXItPmZyYW1lX2N0bCk7CisJdTE2IHNjID0gbGUxNl90b19jcHUoaGVhZGVyLT5zZXFfY3RsKTsKKwl1MTYgc2VxID0gV0xBTl9HRVRfU0VRX1NFUShzYyk7CisJdTE2IGZyYWcgPSBXTEFOX0dFVF9TRVFfRlJBRyhzYyk7CisJdTE2ICpsYXN0X3NlcSwgKmxhc3RfZnJhZzsKKwl1bnNpZ25lZCBsb25nICpsYXN0X3RpbWU7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJxb3MgKmhkcl8zYWRkcnFvczsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkcnFvcyAqaGRyXzRhZGRycW9zOworCXU4IHRpZDsKKworCisJLy9UTzJEUyBhbmQgUW9TCisJaWYoKChmYyAmIElFRUU4MDIxMV9GQ1RMX0RTVE9EUykgPT0gSUVFRTgwMjExX0ZDVExfRFNUT0RTKSYmSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSkgeworCSAgaGRyXzRhZGRycW9zID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRycW9zICopaGVhZGVyOworCSAgdGlkID0gbGUxNl90b19jcHUoaGRyXzRhZGRycW9zLT5xb3NfY3RsKSAmIElFRUU4MDIxMV9RQ1RMX1RJRDsKKwkgIHRpZCA9IFVQMkFDKHRpZCk7CisJICB0aWQgKys7CisJfSBlbHNlIGlmKElFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykpIHsgLy9Rb1MKKwkgIGhkcl8zYWRkcnFvcyA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcnFvcyopaGVhZGVyOworCSAgdGlkID0gbGUxNl90b19jcHUoaGRyXzNhZGRycW9zLT5xb3NfY3RsKSAmIElFRUU4MDIxMV9RQ1RMX1RJRDsKKwkgIHRpZCA9IFVQMkFDKHRpZCk7CisJICB0aWQgKys7CisJfSBlbHNlIHsgLy8gbm8gUW9TCisJICB0aWQgPSAwOworCX0KKworCXN3aXRjaCAoaWVlZS0+aXdfbW9kZSkgeworCWNhc2UgSVdfTU9ERV9BREhPQzoKKwl7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJCXN0cnVjdCBpZWVlX2lic3Nfc2VxICplbnRyeSA9IE5VTEw7CisJCXU4ICptYWMgPSBoZWFkZXItPmFkZHIyOworCQlpbnQgaW5kZXggPSBtYWNbNV0gJSBJRUVFX0lCU1NfTUFDX0hBU0hfU0laRTsKKwkJLy9mb3IgKHBvcyA9IChoZWFkKS0+bmV4dDsgcG9zICE9IChoZWFkKTsgcG9zID0gcG9zLT5uZXh0KQorCQkvL19fbGlzdF9mb3JfZWFjaChwLCAmaWVlZS0+aWJzc19tYWNfaGFzaFtpbmRleF0pIHsKKwkJbGlzdF9mb3JfZWFjaChwLCAmaWVlZS0+aWJzc19tYWNfaGFzaFtpbmRleF0pIHsKKwkJCWVudHJ5ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaWVlZV9pYnNzX3NlcSwgbGlzdCk7CisJCQlpZiAoIW1lbWNtcChlbnRyeS0+bWFjLCBtYWMsIEVUSF9BTEVOKSkKKwkJCQlicmVhazsKKwkJfQorCS8vCWlmIChtZW1jbXAoZW50cnktPm1hYywgbWFjLCBFVEhfQUxFTikpeworCQlpZiAocCA9PSAmaWVlZS0+aWJzc19tYWNfaGFzaFtpbmRleF0pIHsKKwkJCWVudHJ5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGllZWVfaWJzc19zZXEpLCBHRlBfQVRPTUlDKTsKKwkJCWlmICghZW50cnkpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW5ub3QgbWFsbG9jIG5ldyBtYWMgZW50cnlcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJbWVtY3B5KGVudHJ5LT5tYWMsIG1hYywgRVRIX0FMRU4pOworCQkJZW50cnktPnNlcV9udW1bdGlkXSA9IHNlcTsKKwkJCWVudHJ5LT5mcmFnX251bVt0aWRdID0gZnJhZzsKKwkJCWVudHJ5LT5wYWNrZXRfdGltZVt0aWRdID0gamlmZmllczsKKwkJCWxpc3RfYWRkKCZlbnRyeS0+bGlzdCwgJmllZWUtPmlic3NfbWFjX2hhc2hbaW5kZXhdKTsKKwkJCXJldHVybiAwOworCQl9CisJCWxhc3Rfc2VxID0gJmVudHJ5LT5zZXFfbnVtW3RpZF07CisJCWxhc3RfZnJhZyA9ICZlbnRyeS0+ZnJhZ19udW1bdGlkXTsKKwkJbGFzdF90aW1lID0gJmVudHJ5LT5wYWNrZXRfdGltZVt0aWRdOworCQlicmVhazsKKwl9CisKKwljYXNlIElXX01PREVfSU5GUkE6CisJCWxhc3Rfc2VxID0gJmllZWUtPmxhc3RfcnhzZXFfbnVtW3RpZF07CisJCWxhc3RfZnJhZyA9ICZpZWVlLT5sYXN0X3J4ZnJhZ19udW1bdGlkXTsKKwkJbGFzdF90aW1lID0gJmllZWUtPmxhc3RfcGFja2V0X3RpbWVbdGlkXTsKKworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKy8vCWlmKHRpZCAhPSAwKSB7CisvLwkJcHJpbnRrKEtFUk5fV0FSTklORyAiOikpKSkpKSkpKSkpJXggJXggJXgsIGZjKCV4KVxuIiwgdGlkLCAqbGFzdF9zZXEsIHNlcSwgaGVhZGVyLT5mcmFtZV9jdGwpOworLy8JfQorCWlmICgoKmxhc3Rfc2VxID09IHNlcSkgJiYKKwkgICAgdGltZV9hZnRlcigqbGFzdF90aW1lICsgSUVFRV9QQUNLRVRfUkVUUllfVElNRSwgamlmZmllcykpIHsKKwkJaWYgKCpsYXN0X2ZyYWcgPT0gZnJhZyl7CisJCQkvL3ByaW50ayhLRVJOX1dBUk5JTkcgIlsxXSBnbyBkcm9wIVxuIik7CisJCQlnb3RvIGRyb3A7CisKKwkJfQorCQlpZiAoKmxhc3RfZnJhZyArIDEgIT0gZnJhZykKKwkJCS8qIG91dC1vZi1vcmRlciBmcmFnbWVudCAqLworCQkJLy9wcmludGsoS0VSTl9XQVJOSU5HICJbMl0gZ28gZHJvcCFcbiIpOworCQkJZ290byBkcm9wOworCX0gZWxzZQorCQkqbGFzdF9zZXEgPSBzZXE7CisKKwkqbGFzdF9mcmFnID0gZnJhZzsKKwkqbGFzdF90aW1lID0gamlmZmllczsKKwlyZXR1cm4gMDsKKworZHJvcDoKKy8vCUJVR19PTighKGZjICYgSUVFRTgwMjExX0ZDVExfUkVUUlkpKTsKKy8vCXByaW50aygiRFVQXG4iKTsKKworCXJldHVybiAxOworfQorYm9vbAorQWRkUmVvcmRlckVudHJ5KAorCVBSWF9UU19SRUNPUkQJCQlwVFMsCisJUFJYX1JFT1JERVJfRU5UUlkJCXBSZW9yZGVyRW50cnkKKwkpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcExpc3QgPSAmcFRTLT5SeFBlbmRpbmdQa3RMaXN0OworCXdoaWxlKHBMaXN0LT5uZXh0ICE9ICZwVFMtPlJ4UGVuZGluZ1BrdExpc3QpCisJeworCQlpZiggU05fTEVTUyhwUmVvcmRlckVudHJ5LT5TZXFOdW0sICgoUFJYX1JFT1JERVJfRU5UUlkpbGlzdF9lbnRyeShwTGlzdC0+bmV4dCxSWF9SRU9SREVSX0VOVFJZLExpc3QpKS0+U2VxTnVtKSApCisJCXsKKwkJCXBMaXN0ID0gcExpc3QtPm5leHQ7CisJCX0KKwkJZWxzZSBpZiggU05fRVFVQUwocFJlb3JkZXJFbnRyeS0+U2VxTnVtLCAoKFBSWF9SRU9SREVSX0VOVFJZKWxpc3RfZW50cnkocExpc3QtPm5leHQsUlhfUkVPUkRFUl9FTlRSWSxMaXN0KSktPlNlcU51bSkgKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJZWxzZQorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKwlwUmVvcmRlckVudHJ5LT5MaXN0Lm5leHQgPSBwTGlzdC0+bmV4dDsKKwlwUmVvcmRlckVudHJ5LT5MaXN0Lm5leHQtPnByZXYgPSAmcFJlb3JkZXJFbnRyeS0+TGlzdDsKKwlwUmVvcmRlckVudHJ5LT5MaXN0LnByZXYgPSBwTGlzdDsKKwlwTGlzdC0+bmV4dCA9ICZwUmVvcmRlckVudHJ5LT5MaXN0OworCisJcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgaWVlZTgwMjExX2luZGljYXRlX3BhY2tldHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpZWVlODAyMTFfcnhiKiogcHJ4YkluZGljYXRlQXJyYXksdTggIGluZGV4KQoreworCXU4IGkgPSAwICwgaj0wOworCXUxNiBldGhlcnR5cGU7CisvLwlpZihpbmRleCA+IDEpCisvLwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCIlcygpOiBoYWhhaGFoaGhoLCBXZSBpbmRpY2F0ZSBwYWNrZXQgZnJvbSByZW9yZGVyIGxpc3QsIGluZGV4IGlzICV1XG4iLF9fRlVOQ1RJT05fXyxpbmRleCk7CisJZm9yKGogPSAwOyBqPGluZGV4OyBqKyspCisJeworLy9hZGRlZCBieSBhbXkgZm9yIHJlb3JkZXIKKwkJc3RydWN0IGllZWU4MDIxMV9yeGIqIHByeGIgPSBwcnhiSW5kaWNhdGVBcnJheVtqXTsKKwkJZm9yKGkgPSAwOyBpPHByeGItPm5yX3N1YmZyYW1lczsgaSsrKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc3ViX3NrYiA9IHByeGItPnN1YmZyYW1lc1tpXTsKKworCQkvKiBjb252ZXJ0IGhkciArIHBvc3NpYmxlIExMQyBoZWFkZXJzIGludG8gRXRoZXJuZXQgaGVhZGVyICovCisJCQlldGhlcnR5cGUgPSAoc3ViX3NrYi0+ZGF0YVs2XSA8PCA4KSB8IHN1Yl9za2ItPmRhdGFbN107CisJCQlpZiAoc3ViX3NrYi0+bGVuID49IDggJiYKKwkJCQkoKG1lbWNtcChzdWJfc2tiLT5kYXRhLCByZmMxMDQyX2hlYWRlciwgU05BUF9TSVpFKSA9PSAwICYmCisJCQkJICBldGhlcnR5cGUgIT0gRVRIX1BfQUFSUCAmJiBldGhlcnR5cGUgIT0gRVRIX1BfSVBYKSB8fAorCQkJCSBtZW1jbXAoc3ViX3NrYi0+ZGF0YSwgYnJpZGdlX3R1bm5lbF9oZWFkZXIsIFNOQVBfU0laRSkgPT0gMCkpIHsKKwkJCS8qIHJlbW92ZSBSRkMxMDQyIG9yIEJyaWRnZS1UdW5uZWwgZW5jYXBzdWxhdGlvbiBhbmQKKwkJCSAqIHJlcGxhY2UgRXRoZXJUeXBlICovCisJCQkJc2tiX3B1bGwoc3ViX3NrYiwgU05BUF9TSVpFKTsKKwkJCQltZW1jcHkoc2tiX3B1c2goc3ViX3NrYiwgRVRIX0FMRU4pLCBwcnhiLT5zcmMsIEVUSF9BTEVOKTsKKwkJCQltZW1jcHkoc2tiX3B1c2goc3ViX3NrYiwgRVRIX0FMRU4pLCBwcnhiLT5kc3QsIEVUSF9BTEVOKTsKKwkJCX0gZWxzZSB7CisJCQkJdTE2IGxlbjsKKwkJCS8qIExlYXZlIEV0aGVybmV0IGhlYWRlciBwYXJ0IG9mIGhkciBhbmQgZnVsbCBwYXlsb2FkICovCisJCQkJbGVuID0gaHRvbnMoc3ViX3NrYi0+bGVuKTsKKwkJCQltZW1jcHkoc2tiX3B1c2goc3ViX3NrYiwgMiksICZsZW4sIDIpOworCQkJCW1lbWNweShza2JfcHVzaChzdWJfc2tiLCBFVEhfQUxFTiksIHByeGItPnNyYywgRVRIX0FMRU4pOworCQkJCW1lbWNweShza2JfcHVzaChzdWJfc2tiLCBFVEhfQUxFTiksIHByeGItPmRzdCwgRVRIX0FMRU4pOworCQkJfQorCQkJLy9zdGF0cy0+cnhfcGFja2V0cysrOworCQkJLy9zdGF0cy0+cnhfYnl0ZXMgKz0gc3ViX3NrYi0+bGVuOworCisJCS8qIEluZGljYXQgdGhlIHBhY2tldHMgdG8gdXBwZXIgbGF5ZXIgKi8KKwkJCWlmIChzdWJfc2tiKSB7CisJCQkJLy9wcmludGsoIjBza2JfbGVuKCVkKVxuIiwgc2tiLT5sZW4pOworCQkJCXN1Yl9za2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc3ViX3NrYiwgaWVlZS0+ZGV2KTsKKwkJCQltZW1zZXQoc3ViX3NrYi0+Y2IsIDAsIHNpemVvZihzdWJfc2tiLT5jYikpOworCQkJCXN1Yl9za2ItPmRldiA9IGllZWUtPmRldjsKKwkJCQlzdWJfc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOyAvKiA4MDIuMTEgY3JjIG5vdCBzdWZmaWNpZW50ICovCisJCQkJLy9za2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOyAvKiA4MDIuMTEgY3JjIG5vdCBzdWZmaWNpZW50ICovCisJCQkJaWVlZS0+bGFzdF9yeF9wc190aW1lID0gamlmZmllczsKKwkJCQkvL3ByaW50aygiMXNrYl9sZW4oJWQpXG4iLCBza2ItPmxlbik7CisJCQkJbmV0aWZfcngoc3ViX3NrYik7CisJCQl9CisJCX0KKwkJa2ZyZWUocHJ4Yik7CisJCXByeGIgPSBOVUxMOworCX0KK30KKworCit2b2lkIFJ4UmVvcmRlckluZGljYXRlUGFja2V0KCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJc3RydWN0IGllZWU4MDIxMV9yeGIqIHByeGIsCisJCVBSWF9UU19SRUNPUkQJCXBUUywKKwkJdTE2CQkJU2VxTnVtKQoreworCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CisJUFJYX1JFT1JERVJfRU5UUlkgCXBSZW9yZGVyRW50cnkgPSBOVUxMOworCXN0cnVjdCBpZWVlODAyMTFfcnhiKiBwcnhiSW5kaWNhdGVBcnJheVtSRU9SREVSX1dJTl9TSVpFXTsKKwl1OAkJCVdpblNpemUgPSBwSFRJbmZvLT5SeFJlb3JkZXJXaW5TaXplOworCXUxNgkJCVdpbkVuZCA9IChwVFMtPlJ4SW5kaWNhdGVTZXEgKyBXaW5TaXplIC0xKSU0MDk2OworCXU4CQkJaW5kZXggPSAwOworCWJvb2wJCQliTWF0Y2hXaW5TdGFydCA9IGZhbHNlLCBiUGt0SW5CdWYgPSBmYWxzZTsKKwlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1JFT1JERVIsIiVzKCk6IFNlcSBpcyAlZCxwVFMtPlJ4SW5kaWNhdGVTZXEgaXMgJWQsIFdpblNpemUgaXMgJWRcbiIsX19GVU5DVElPTl9fLFNlcU51bSxwVFMtPlJ4SW5kaWNhdGVTZXEsV2luU2l6ZSk7CisJLyogUnggUmVvcmRlciBpbml0aWFsaXplIGNvbmRpdGlvbi4qLworCWlmKHBUUy0+UnhJbmRpY2F0ZVNlcSA9PSAweGZmZmYpIHsKKwkJcFRTLT5SeEluZGljYXRlU2VxID0gU2VxTnVtOworCX0KKworCS8qIERyb3Agb3V0IHRoZSBwYWNrZXQgd2hpY2ggU2VxTnVtIGlzIHNtYWxsZXIgdGhhbiBXaW5TdGFydCAqLworCWlmKFNOX0xFU1MoU2VxTnVtLCBwVFMtPlJ4SW5kaWNhdGVTZXEpKSB7CisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUkVPUkRFUiwiUGFja2V0IERyb3AhIEluZGljYXRlU2VxOiAlZCwgTmV3U2VxOiAlZFxuIiwKKwkJCQkgcFRTLT5SeEluZGljYXRlU2VxLCBTZXFOdW0pOworCQlwSFRJbmZvLT5SeFJlb3JkZXJEcm9wQ291bnRlcisrOworCQl7CisJCQlpbnQgaTsKKwkJCWZvcihpID0wOyBpIDwgcHJ4Yi0+bnJfc3ViZnJhbWVzOyBpKyspIHsKKwkJCQlkZXZfa2ZyZWVfc2tiKHByeGItPnN1YmZyYW1lc1tpXSk7CisJCQl9CisJCQlrZnJlZShwcnhiKTsKKwkJCXByeGIgPSBOVUxMOworCQl9CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFNsaWRpbmcgd2luZG93IG1hbmlwdWxhdGlvbi4gQ29uZGl0aW9ucyBpbmNsdWRlczoKKwkgKiAxLiBJbmNvbWluZyBTZXFOdW0gaXMgZXF1YWwgdG8gV2luU3RhcnQgPT5XaW5kb3cgc2hpZnQgMQorCSAqIDIuIEluY29taW5nIFNlcU51bSBpcyBsYXJnZXIgdGhhbiB0aGUgV2luRW5kID0+IFdpbmRvdyBzaGlmdCBOCisJICovCisJaWYoU05fRVFVQUwoU2VxTnVtLCBwVFMtPlJ4SW5kaWNhdGVTZXEpKSB7CisJCXBUUy0+UnhJbmRpY2F0ZVNlcSA9IChwVFMtPlJ4SW5kaWNhdGVTZXEgKyAxKSAlIDQwOTY7CisJCWJNYXRjaFdpblN0YXJ0ID0gdHJ1ZTsKKwl9IGVsc2UgaWYoU05fTEVTUyhXaW5FbmQsIFNlcU51bSkpIHsKKwkJaWYoU2VxTnVtID49IChXaW5TaXplIC0gMSkpIHsKKwkJCXBUUy0+UnhJbmRpY2F0ZVNlcSA9IFNlcU51bSArIDEgLVdpblNpemU7CisJCX0gZWxzZSB7CisJCQlwVFMtPlJ4SW5kaWNhdGVTZXEgPSA0MDk1IC0gKFdpblNpemUgLSAoU2VxTnVtICsxKSkgKyAxOworCQl9CisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUkVPUkRFUiwgIldpbmRvdyBTaGlmdCEgSW5kaWNhdGVTZXE6ICVkLCBOZXdTZXE6ICVkXG4iLHBUUy0+UnhJbmRpY2F0ZVNlcSwgU2VxTnVtKTsKKwl9CisKKwkvKgorCSAqIEluZGljYXRpb24gcHJvY2Vzcy4KKwkgKiBBZnRlciBQYWNrZXQgZHJvcHBpbmcgYW5kIFNsaWRpbmcgV2luZG93IHNoaWZ0aW5nIGFzIGFib3ZlLCB3ZSBjYW4gbm93IGp1c3QgaW5kaWNhdGUgdGhlIHBhY2tldHMKKwkgKiB3aXRoIHRoZSBTZXFOdW0gc21hbGxlciB0aGFuIGxhdGVzdCBXaW5TdGFydCBhbmQgYnVmZmVyIG90aGVyIHBhY2tldHMuCisJICovCisJLyogRm9yIFJ4IFJlb3JkZXIgY29uZGl0aW9uOgorCSAqIDEuIEFsbCBwYWNrZXRzIHdpdGggU2VxTnVtIHNtYWxsZXIgdGhhbiBXaW5TdGFydCA9PiBJbmRpY2F0ZQorCSAqIDIuIEFsbCBwYWNrZXRzIHdpdGggU2VxTnVtIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIFdpblN0YXJ0ID0+IEJ1ZmZlciBpdC4KKwkgKi8KKwlpZihiTWF0Y2hXaW5TdGFydCkgeworCQkvKiBDdXJyZW50IHBhY2tldCBpcyBnb2luZyB0byBiZSBpbmRpY2F0ZWQuKi8KKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCAiUGFja2V0cyBpbmRpY2F0aW9uISEgSW5kaWNhdGVTZXE6ICVkLCBOZXdTZXE6ICVkXG4iLFwKKwkJCQlwVFMtPlJ4SW5kaWNhdGVTZXEsIFNlcU51bSk7CisJCXByeGJJbmRpY2F0ZUFycmF5WzBdID0gcHJ4YjsKKy8vCQlwcmludGsoIj09PT09PT09PT09PT09PT09PT09PT09PT4lcygpOiBTZXFOdW0gaXMgJWRcbiIsX19GVU5DVElPTl9fLFNlcU51bSk7CisJCWluZGV4ID0gMTsKKwl9IGVsc2UgeworCQkvKiBDdXJyZW50IHBhY2tldCBpcyBnb2luZyB0byBiZSBpbnNlcnRlZCBpbnRvIHBlbmRpbmcgbGlzdC4qLworCQkvL0lFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUkVPUkRFUiwiJXMoKTogV2UgUlggbm8gb3JkZXJlZCBwYWNrZWQsIGluc2VydCB0byBvcmRlcmQgbGlzdFxuIixfX0ZVTkNUSU9OX18pOworCQlpZighbGlzdF9lbXB0eSgmaWVlZS0+UnhSZW9yZGVyX1VudXNlZF9MaXN0KSkgeworCQkJcFJlb3JkZXJFbnRyeSA9IChQUlhfUkVPUkRFUl9FTlRSWSlsaXN0X2VudHJ5KGllZWUtPlJ4UmVvcmRlcl9VbnVzZWRfTGlzdC5uZXh0LFJYX1JFT1JERVJfRU5UUlksTGlzdCk7CisJCQlsaXN0X2RlbF9pbml0KCZwUmVvcmRlckVudHJ5LT5MaXN0KTsKKworCQkJLyogTWFrZSBhIHJlb3JkZXIgZW50cnkgYW5kIGluc2VydCBpbnRvIGEgdGhlIHBhY2tldCBsaXN0LiovCisJCQlwUmVvcmRlckVudHJ5LT5TZXFOdW0gPSBTZXFOdW07CisJCQlwUmVvcmRlckVudHJ5LT5wcnhiID0gcHJ4YjsKKwkvLwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCIlcygpOiBwUkVvcmRlckVudHJ5LT5TZXFOdW0gaXMgJWRcbiIsX19GVU5DVElPTl9fLHBSZW9yZGVyRW50cnktPlNlcU51bSk7CisKKwkJCWlmKCFBZGRSZW9yZGVyRW50cnkocFRTLCBwUmVvcmRlckVudHJ5KSkgeworCQkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUkVPUkRFUiwgIiVzKCk6IER1cGxpY2F0ZSBwYWNrZXQgaXMgZHJvcHBlZCEhIEluZGljYXRlU2VxOiAlZCwgTmV3U2VxOiAlZFxuIiwKKwkJCQkJX19GVU5DVElPTl9fLCBwVFMtPlJ4SW5kaWNhdGVTZXEsIFNlcU51bSk7CisJCQkJbGlzdF9hZGRfdGFpbCgmcFJlb3JkZXJFbnRyeS0+TGlzdCwmaWVlZS0+UnhSZW9yZGVyX1VudXNlZF9MaXN0KTsKKwkJCQl7CisJCQkJCWludCBpOworCQkJCQlmb3IoaSA9MDsgaSA8IHByeGItPm5yX3N1YmZyYW1lczsgaSsrKSB7CisJCQkJCQlkZXZfa2ZyZWVfc2tiKHByeGItPnN1YmZyYW1lc1tpXSk7CisJCQkJCX0KKwkJCQkJa2ZyZWUocHJ4Yik7CisJCQkJCXByeGIgPSBOVUxMOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLAorCQkJCQkgIlBrdCBpbnNlcnQgaW50byBidWZmZXIhISBJbmRpY2F0ZVNlcTogJWQsIE5ld1NlcTogJWRcbiIscFRTLT5SeEluZGljYXRlU2VxLCBTZXFOdW0pOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJLyoKKwkJCSAqIFBhY2tldHMgYXJlIGRyb3BwZWQgaWYgdGhlcmUgaXMgbm90IGVub3VnaCByZW9yZGVyIGVudHJpZXMuCisJCQkgKiBUaGlzIHBhcnQgc2hhbGwgYmUgbW9kaWZpZWQhISBXZSBjYW4ganVzdCBpbmRpY2F0ZSBhbGwgdGhlCisJCQkgKiBwYWNrZXRzIGluIGJ1ZmZlciBhbmQgZ2V0IHJlb3JkZXIgZW50cmllcy4KKwkJCSAqLworCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJSeFJlb3JkZXJJbmRpY2F0ZVBhY2tldCgpOiBUaGVyZSBpcyBubyByZW9yZGVyIGVudHJ5ISEgUGFja2V0IGlzIGRyb3BwZWQhIVxuIik7CisJCQl7CisJCQkJaW50IGk7CisJCQkJZm9yKGkgPTA7IGkgPCBwcnhiLT5ucl9zdWJmcmFtZXM7IGkrKykgeworCQkJCQlkZXZfa2ZyZWVfc2tiKHByeGItPnN1YmZyYW1lc1tpXSk7CisJCQkJfQorCQkJCWtmcmVlKHByeGIpOworCQkJCXByeGIgPSBOVUxMOworCQkJfQorCQl9CisJfQorCisJLyogQ2hlY2sgaWYgdGhlcmUgaXMgYW55IHBhY2tldCBuZWVkIGluZGljYXRlLiovCisJd2hpbGUoIWxpc3RfZW1wdHkoJnBUUy0+UnhQZW5kaW5nUGt0TGlzdCkpIHsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCIlcygpOiBzdGFydCBSUkVPUkRFUiBpbmRpY2F0ZVxuIixfX0ZVTkNUSU9OX18pOworCQlwUmVvcmRlckVudHJ5ID0gKFBSWF9SRU9SREVSX0VOVFJZKWxpc3RfZW50cnkocFRTLT5SeFBlbmRpbmdQa3RMaXN0LnByZXYsUlhfUkVPUkRFUl9FTlRSWSxMaXN0KTsKKwkJaWYoIFNOX0xFU1MocFJlb3JkZXJFbnRyeS0+U2VxTnVtLCBwVFMtPlJ4SW5kaWNhdGVTZXEpIHx8CisJCQkJU05fRVFVQUwocFJlb3JkZXJFbnRyeS0+U2VxTnVtLCBwVFMtPlJ4SW5kaWNhdGVTZXEpKQorCQl7CisJCQkvKiBUaGlzIHByb3RlY3QgYnVmZmVyIGZyb20gb3ZlcmZsb3cuICovCisJCQlpZihpbmRleCA+PSBSRU9SREVSX1dJTl9TSVpFKSB7CisJCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJSeFJlb3JkZXJJbmRpY2F0ZVBhY2tldCgpOiBCdWZmZXIgb3ZlcmZsb3chISBcbiIpOworCQkJCWJQa3RJbkJ1ZiA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWxpc3RfZGVsX2luaXQoJnBSZW9yZGVyRW50cnktPkxpc3QpOworCisJCQlpZihTTl9FUVVBTChwUmVvcmRlckVudHJ5LT5TZXFOdW0sIHBUUy0+UnhJbmRpY2F0ZVNlcSkpCisJCQkJcFRTLT5SeEluZGljYXRlU2VxID0gKHBUUy0+UnhJbmRpY2F0ZVNlcSArIDEpICUgNDA5NjsKKworCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCJQYWNrZXRzIGluZGljYXRpb24hISBJbmRpY2F0ZVNlcTogJWQsIE5ld1NlcTogJWRcbiIscFRTLT5SeEluZGljYXRlU2VxLCBTZXFOdW0pOworCQkJcHJ4YkluZGljYXRlQXJyYXlbaW5kZXhdID0gcFJlb3JkZXJFbnRyeS0+cHJ4YjsKKwkJLy8JcHJpbnRrKCI9PT09PT09PT09PT09PT09PT09PT09PT0+JXMoKTogcFJlb3JkZXJFbnRyeS0+U2VxTnVtIGlzICVkXG4iLF9fRlVOQ1RJT05fXyxwUmVvcmRlckVudHJ5LT5TZXFOdW0pOworCQkJaW5kZXgrKzsKKworCQkJbGlzdF9hZGRfdGFpbCgmcFJlb3JkZXJFbnRyeS0+TGlzdCwmaWVlZS0+UnhSZW9yZGVyX1VudXNlZF9MaXN0KTsKKwkJfSBlbHNlIHsKKwkJCWJQa3RJbkJ1ZiA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIEhhbmRsaW5nIHBlbmRpbmcgdGltZXIuIFNldCB0aGlzIHRpbWVyIHRvIHByZXZlbnQgZnJvbSBsb25nIHRpbWUgUnggYnVmZmVyaW5nLiovCisJaWYoaW5kZXg+MCkgeworCQkvLyBDYW5jZWwgcHJldmlvdXMgcGVuZGluZyB0aW1lci4KKwkvLwlkZWxfdGltZXJfc3luYygmcFRTLT5SeFBrdFBlbmRpbmdUaW1lcik7CisJCXBUUy0+UnhUaW1lb3V0SW5kaWNhdGVTZXEgPSAweGZmZmY7CisKKwkJLy8gSW5kaWNhdGUgcGFja2V0cworCQlpZihpbmRleD5SRU9SREVSX1dJTl9TSVpFKXsKKwkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiUnhSZW9yZGVySW5kaWNhdGVQYWNrZXQoKTogUnggUmVvcmVyIGJ1ZmZlciBmdWxsISEgXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZWVlODAyMTFfaW5kaWNhdGVfcGFja2V0cyhpZWVlLCBwcnhiSW5kaWNhdGVBcnJheSwgaW5kZXgpOworCX0KKworCWlmKGJQa3RJbkJ1ZiAmJiBwVFMtPlJ4VGltZW91dEluZGljYXRlU2VxPT0weGZmZmYpIHsKKwkJLy8gU2V0IG5ldyBwZW5kaW5nIHRpbWVyLgorCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1JFT1JERVIsIiVzKCk6IFNFVCByeCB0aW1lb3V0IHRpbWVyXG4iLCBfX0ZVTkNUSU9OX18pOworCQlwVFMtPlJ4VGltZW91dEluZGljYXRlU2VxID0gcFRTLT5SeEluZGljYXRlU2VxOworCQlpZih0aW1lcl9wZW5kaW5nKCZwVFMtPlJ4UGt0UGVuZGluZ1RpbWVyKSkKKwkJCWRlbF90aW1lcl9zeW5jKCZwVFMtPlJ4UGt0UGVuZGluZ1RpbWVyKTsKKwkJcFRTLT5SeFBrdFBlbmRpbmdUaW1lci5leHBpcmVzID0gamlmZmllcyArIE1TRUNTKHBIVEluZm8tPlJ4UmVvcmRlclBlbmRpbmdUaW1lKTsKKwkJYWRkX3RpbWVyKCZwVFMtPlJ4UGt0UGVuZGluZ1RpbWVyKTsKKwl9Cit9CisKK3U4IHBhcnNlX3N1YmZyYW1lKHN0cnVjdCBza19idWZmICpza2IsCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cywKKwkJICBzdHJ1Y3QgaWVlZTgwMjExX3J4YiAqcnhiLHU4KiBzcmMsdTgqIGRzdCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciogKXNrYi0+ZGF0YTsKKwl1MTYJCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCisJdTE2CQlMTENPZmZzZXQ9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CisJdTE2CQlDaGtMZW5ndGg7CisJYm9vbAkJYklzQWdncmVnYXRlRnJhbWUgPSBmYWxzZTsKKwl1MTYJCW5TdWJmcmFtZV9MZW5ndGg7CisJdTgJCW5QYWRkaW5nX0xlbmd0aCA9IDA7CisJdTE2CQlTZXFOdW09MDsKKworCXN0cnVjdCBza19idWZmICpzdWJfc2tiOworCXU4ICAgICAgICAgICAgICpkYXRhX3B0cjsKKwkvKiBqdXN0IGZvciBkZWJ1ZyBwdXJwb3NlICovCisJU2VxTnVtID0gV0xBTl9HRVRfU0VRX1NFUShsZTE2X3RvX2NwdShoZHItPnNlcV9jdGwpKTsKKworCWlmKChJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpKSYmXAorCQkJKCgoZnJhbWVxb3MgKikoc2tiLT5kYXRhICsgSUVFRTgwMjExXzNBRERSX0xFTikpLT5maWVsZC5yZXNlcnZlZCkpIHsKKwkJYklzQWdncmVnYXRlRnJhbWUgPSB0cnVlOworCX0KKworCWlmKElFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykpIHsKKwkJTExDT2Zmc2V0ICs9IDI7CisJfQorCisJaWYocnhfc3RhdHMtPmJDb250YWluSFRDKSB7CisJCUxMQ09mZnNldCArPSBzSFRDTG5nOworCX0KKwkvL3ByaW50aygiQ2hrTGVuZ3RoID0gJWRcbiIsIExMQ09mZnNldCk7CisJLy8gTnVsbCBwYWNrZXQsIGRvbid0IGluZGljYXRlIGl0IHRvIHVwcGVyIGxheWVyCisJQ2hrTGVuZ3RoID0gTExDT2Zmc2V0Oy8qICsgKEZyYW1lX1dFUChmcmFtZSkhPTAgP0FkYXB0ZXItPk1nbnRJbmZvLlNlY3VyaXR5SW5mby5FbmNyeXB0aW9uSGVhZE92ZXJoZWFkOjApOyovCisKKwlpZiggc2tiLT5sZW4gPD0gQ2hrTGVuZ3RoICkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlza2JfcHVsbChza2IsIExMQ09mZnNldCk7CisKKwlpZighYklzQWdncmVnYXRlRnJhbWUpIHsKKwkJcnhiLT5ucl9zdWJmcmFtZXMgPSAxOworI2lmZGVmIEpPSE5fTk9DUFkKKwkJcnhiLT5zdWJmcmFtZXNbMF0gPSBza2I7CisjZWxzZQorCQlyeGItPnN1YmZyYW1lc1swXSA9IHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7CisjZW5kaWYKKworCQltZW1jcHkocnhiLT5zcmMsc3JjLEVUSF9BTEVOKTsKKwkJbWVtY3B5KHJ4Yi0+ZHN0LGRzdCxFVEhfQUxFTik7CisJCS8vSUVFRTgwMjExX0RFQlVHX0RBVEEoSUVFRTgwMjExX0RMX1JYLHNrYi0+ZGF0YSxza2ItPmxlbik7CisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCXJ4Yi0+bnJfc3ViZnJhbWVzID0gMDsKKwkJbWVtY3B5KHJ4Yi0+c3JjLHNyYyxFVEhfQUxFTik7CisJCW1lbWNweShyeGItPmRzdCxkc3QsRVRIX0FMRU4pOworCQl3aGlsZShza2ItPmxlbiA+IEVUSEVSTkVUX0hFQURFUl9TSVpFKSB7CisJCQkvKiBPZmZzZXQgMTIgZGVub3RlIDIgbWFjIGFkZHJlc3MgKi8KKwkJCW5TdWJmcmFtZV9MZW5ndGggPSAqKCh1MTYqKShza2ItPmRhdGEgKyAxMikpOworCQkJLy89PW09PT5jaGFuZ2UgdGhlIGxlbmd0aCBvcmRlcgorCQkJblN1YmZyYW1lX0xlbmd0aCA9IChuU3ViZnJhbWVfTGVuZ3RoPj44KSArIChuU3ViZnJhbWVfTGVuZ3RoPDw4KTsKKworCQkJaWYoc2tiLT5sZW48KEVUSEVSTkVUX0hFQURFUl9TSVpFICsgblN1YmZyYW1lX0xlbmd0aCkpIHsKKwkJCQlwcmludGsoIiVzOiBBLU1TRFUgcGFyc2UgZXJyb3IhISBwUmZkLT5uVG90YWxTdWJmcmFtZSA6ICVkXG4iLFwKKwkJCQkJCV9fRlVOQ1RJT05fXyxyeGItPm5yX3N1YmZyYW1lcyk7CisJCQkJcHJpbnRrKCIlczogQS1NU0RVIHBhcnNlIGVycm9yISEgU3ViZnJhbWUgTGVuZ3RoOiAlZFxuIixfX0ZVTkNUSU9OX18sIG5TdWJmcmFtZV9MZW5ndGgpOworCQkJCXByaW50aygiblJlbWFpbl9MZW5ndGggaXMgJWQgYW5kIG5TdWJmcmFtZV9MZW5ndGggaXMgOiAlZFxuIixza2ItPmxlbixuU3ViZnJhbWVfTGVuZ3RoKTsKKwkJCQlwcmludGsoIlRoZSBQYWNrZXQgU2VxTnVtIGlzICVkXG4iLFNlcU51bSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCS8qIG1vdmUgdGhlIGRhdGEgcG9pbnQgdG8gZGF0YSBjb250ZW50ICovCisJCQlza2JfcHVsbChza2IsIEVUSEVSTkVUX0hFQURFUl9TSVpFKTsKKworI2lmZGVmIEpPSE5fTk9DUFkKKwkJCXN1Yl9za2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJCXN1Yl9za2ItPmxlbiA9IG5TdWJmcmFtZV9MZW5ndGg7CisJCQlzdWJfc2tiLT50YWlsID0gc3ViX3NrYi0+ZGF0YSArIG5TdWJmcmFtZV9MZW5ndGg7CisjZWxzZQorCQkJLyogQWxsb2NhdGUgbmV3IHNrYiBmb3IgcmVsZWFzaW5nIHRvIHVwcGVyIGxheWVyICovCisJCQlzdWJfc2tiID0gZGV2X2FsbG9jX3NrYihuU3ViZnJhbWVfTGVuZ3RoICsgMTIpOworCQkJc2tiX3Jlc2VydmUoc3ViX3NrYiwgMTIpOworCQkJZGF0YV9wdHIgPSAodTggKilza2JfcHV0KHN1Yl9za2IsIG5TdWJmcmFtZV9MZW5ndGgpOworCQkJbWVtY3B5KGRhdGFfcHRyLHNrYi0+ZGF0YSxuU3ViZnJhbWVfTGVuZ3RoKTsKKyNlbmRpZgorCQkJcnhiLT5zdWJmcmFtZXNbcnhiLT5ucl9zdWJmcmFtZXMrK10gPSBzdWJfc2tiOworCQkJaWYocnhiLT5ucl9zdWJmcmFtZXMgPj0gTUFYX1NVQkZSQU1FX0NPVU5UKSB7CisJCQkJSUVFRTgwMjExX0RFQlVHX1JYKCJQYXJzZVN1YmZyYW1lKCk6IFRvbyBtYW55IFN1YmZyYW1lcyEgUGFja2V0cyBkcm9wcGVkIVxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlza2JfcHVsbChza2IsblN1YmZyYW1lX0xlbmd0aCk7CisKKwkJCWlmKHNrYi0+bGVuICE9IDApIHsKKwkJCQluUGFkZGluZ19MZW5ndGggPSA0IC0gKChuU3ViZnJhbWVfTGVuZ3RoICsgRVRIRVJORVRfSEVBREVSX1NJWkUpICUgNCk7CisJCQkJaWYoblBhZGRpbmdfTGVuZ3RoID09IDQpIHsKKwkJCQkJblBhZGRpbmdfTGVuZ3RoID0gMDsKKwkJCQl9CisKKwkJCQlpZihza2ItPmxlbiA8IG5QYWRkaW5nX0xlbmd0aCkgeworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisKKwkJCQlza2JfcHVsbChza2IsblBhZGRpbmdfTGVuZ3RoKTsKKwkJCX0KKwkJfQorI2lmZGVmIEpPSE5fTk9DUFkKKwkJZGV2X2tmcmVlX3NrYihza2IpOworI2VuZGlmCisJCS8ve2p1c3QgZm9yIGRlYnVnIGFkZGVkIGJ5IGRhdmlkCisJCS8vcHJpbnRrKCJBTVNEVTo6cnhiLT5ucl9zdWJmcmFtZXMgPSAlZFxuIixyeGItPm5yX3N1YmZyYW1lcyk7CisJCS8vfQorCQlyZXR1cm4gcnhiLT5ucl9zdWJmcmFtZXM7CisJfQorfQorCisvKiBBbGwgcmVjZWl2ZWQgZnJhbWVzIGFyZSBzZW50IHRvIHRoaXMgZnVuY3Rpb24uIEBza2IgY29udGFpbnMgdGhlIGZyYW1lIGluCisgKiBJRUVFIDgwMi4xMSBmb3JtYXQsIGkuZS4sIGluIHRoZSBmb3JtYXQgaXQgd2FzIHNlbnQgb3ZlciBhaXIuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKS4gKi8KK2ludCBpZWVlODAyMTFfcngoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCSBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZHI7CisJLy9zdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcnFvcyAqaGRyOworCisJc2l6ZV90IGhkcmxlbjsKKwl1MTYgZmMsIHR5cGUsIHN0eXBlLCBzYzsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHM7CisJdW5zaWduZWQgaW50IGZyYWc7CisJdTggKnBheWxvYWQ7CisJdTE2IGV0aGVydHlwZTsKKwkvL2FkZGVkIGJ5IGFteSBmb3IgcmVvcmRlcgorCXU4CVRJRCA9IDA7CisJdTE2CVNlcU51bSA9IDA7CisJUFJYX1RTX1JFQ09SRCBwVFMgPSBOVUxMOworCS8vYm9vbCBiSXNBZ2dyZWdhdGVGcmFtZSA9IGZhbHNlOworCS8vYWRkZWQgYnkgYW15IGZvciByZW9yZGVyCisjaWZkZWYgTk9UX1lFVAorCXN0cnVjdCBuZXRfZGV2aWNlICp3ZHMgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpza2IyID0gTlVMTDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqd2RzID0gTlVMTDsKKwlpbnQgZnJhbWVfYXV0aG9yaXplZCA9IDA7CisJaW50IGZyb21fYXNzb2NfYXAgPSAwOworCXZvaWQgKnN0YSA9IE5VTEw7CisjZW5kaWYKKy8vCXUxNiBxb3NfY3RsID0gMDsKKwl1OCBkc3RbRVRIX0FMRU5dOworCXU4IHNyY1tFVEhfQUxFTl07CisJdTggYnNzaWRbRVRIX0FMRU5dOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHQgPSBOVUxMOworCWludCBrZXlpZHggPSAwOworCisJaW50IGk7CisJc3RydWN0IGllZWU4MDIxMV9yeGIqIHJ4YiA9IE5VTEw7CisJLy8gY2hlYXQgdGhlIHRoZSBoZHIgdHlwZQorCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqKXNrYi0+ZGF0YTsKKwlzdGF0cyA9ICZpZWVlLT5zdGF0czsKKworCWlmIChza2ItPmxlbiA8IDEwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTS0IgbGVuZ3RoIDwgMTBcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJfQorCisJZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisJdHlwZSA9IFdMQU5fRkNfR0VUX1RZUEUoZmMpOworCXN0eXBlID0gV0xBTl9GQ19HRVRfU1RZUEUoZmMpOworCXNjID0gbGUxNl90b19jcHUoaGRyLT5zZXFfY3RsKTsKKworCWZyYWcgPSBXTEFOX0dFVF9TRVFfRlJBRyhzYyk7CisJaGRybGVuID0gaWVlZTgwMjExX2dldF9oZHJsZW4oZmMpOworCisJaWYoSFRDQ2hlY2soaWVlZSwgc2tiLT5kYXRhKSkKKwl7CisJCWlmKG5ldF9yYXRlbGltaXQoKSkKKwkJcHJpbnRrKCJmaW5kIEhUQ0NvbnRyb2xcbiIpOworCQloZHJsZW4gKz0gNDsKKwkJcnhfc3RhdHMtPmJDb250YWluSFRDID0gMTsKKwl9CisKKwkvL0lFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKyNpZmRlZiBOT1RfWUVUCisjaWYgV0lSRUxFU1NfRVhUID4gMTUKKwkvKiBQdXQgdGhpcyBjb2RlIGhlcmUgc28gdGhhdCB3ZSBhdm9pZCBkdXBsaWNhdGluZyBpdCBpbiBhbGwKKwkgKiBSeCBwYXRocy4gLSBKZWFuIElJICovCisjaWZkZWYgSVdfV0lSRUxFU1NfU1BZCQkvKiBkZWZpbmVkIGluIGl3X2hhbmRsZXIuaCAqLworCS8qIElmIHNweSBtb25pdG9yaW5nIG9uICovCisJaWYgKGlmYWNlLT5zcHlfZGF0YS5zcHlfbnVtYmVyID4gMCkgeworCQlzdHJ1Y3QgaXdfcXVhbGl0eSB3c3RhdHM7CisJCXdzdGF0cy5sZXZlbCA9IHJ4X3N0YXRzLT5yc3NpOworCQl3c3RhdHMubm9pc2UgPSByeF9zdGF0cy0+bm9pc2U7CisJCXdzdGF0cy51cGRhdGVkID0gNjsJLyogTm8gcXVhbCB2YWx1ZSAqLworCQkvKiBVcGRhdGUgc3B5IHJlY29yZHMgKi8KKwkJd2lyZWxlc3Nfc3B5X3VwZGF0ZShkZXYsIGhkci0+YWRkcjIsICZ3c3RhdHMpOworCX0KKyNlbmRpZiAvKiBJV19XSVJFTEVTU19TUFkgKi8KKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxNSAqLworCWhvc3RhcF91cGRhdGVfcnhfc3RhdHMobG9jYWwtPmFwLCBoZHIsIHJ4X3N0YXRzKTsKKyNlbmRpZgorCisjaWYgV0lSRUxFU1NfRVhUID4gMTUKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpIHsKKwkJaWVlZTgwMjExX21vbml0b3JfcngoaWVlZSwgc2tiLCByeF9zdGF0cyk7CisJCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJCXN0YXRzLT5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisJaWYgKGllZWUtPmhvc3RfZGVjcnlwdCkgeworCQlpbnQgaWR4ID0gMDsKKwkJaWYgKHNrYi0+bGVuID49IGhkcmxlbiArIDMpCisJCQlpZHggPSBza2ItPmRhdGFbaGRybGVuICsgM10gPj4gNjsKKwkJY3J5cHQgPSBpZWVlLT5jcnlwdFtpZHhdOworI2lmZGVmIE5PVF9ZRVQKKwkJc3RhID0gTlVMTDsKKworCQkvKiBVc2Ugc3RhdGlvbiBzcGVjaWZpYyBrZXkgdG8gb3ZlcnJpZGUgZGVmYXVsdCBrZXlzIGlmIHRoZQorCQkgKiByZWNlaXZlciBhZGRyZXNzIGlzIGEgdW5pY2FzdCBhZGRyZXNzICgiaW5kaXZpZHVhbCBSQSIpLiBJZgorCQkgKiBiY3J4X3N0YV9rZXkgcGFyYW1ldGVyIGlzIHNldCwgc3RhdGlvbiBzcGVjaWZpYyBrZXkgaXMgdXNlZAorCQkgKiBldmVuIHdpdGggYnJvYWQvbXVsdGljYXN0IHRhcmdldHMgKHRoaXMgaXMgYWdhaW5zdCBJRUVFCisJCSAqIDgwMi4xMSwgYnV0IG1ha2VzIGl0IGVhc2llciB0byB1c2UgZGlmZmVyZW50IGtleXMgd2l0aAorCQkgKiBzdGF0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IFdFUCBrZXkgbWFwcGluZykuICovCisKKwkJaWYgKCEoaGRyLT5hZGRyMVswXSAmIDB4MDEpIHx8IGxvY2FsLT5iY3J4X3N0YV9rZXkpCisJCQkodm9pZCkgaG9zdGFwX2hhbmRsZV9zdGFfY3J5cHRvKGxvY2FsLCBoZHIsICZjcnlwdCwKKwkJCQkJCQkmc3RhKTsKKyNlbmRpZgorCisJCS8qIGFsbG93IE5VTEwgZGVjcnlwdCB0byBpbmRpY2F0ZSBhbiBzdGF0aW9uIHNwZWNpZmljIG92ZXJyaWRlCisJCSAqIGZvciBkZWZhdWx0IGVuY3J5cHRpb24gKi8KKwkJaWYgKGNyeXB0ICYmIChjcnlwdC0+b3BzID09IE5VTEwgfHwKKwkJCSAgICAgIGNyeXB0LT5vcHMtPmRlY3J5cHRfbXBkdSA9PSBOVUxMKSkKKwkJCWNyeXB0ID0gTlVMTDsKKworCQlpZiAoIWNyeXB0ICYmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1dFUCkpIHsKKwkJCS8qIFRoaXMgc2VlbXMgdG8gYmUgdHJpZ2dlcmVkIGJ5IHNvbWUgKG11bHRpY2FzdD8pCisJCQkgKiBmcmFtZXMgZnJvbSBvdGhlciB0aGFuIGN1cnJlbnQgQlNTLCBzbyBqdXN0IGRyb3AgdGhlCisJCQkgKiBmcmFtZXMgc2lsZW50bHkgaW5zdGVhZCBvZiBmaWxsaW5nIHN5c3RlbSBsb2cgd2l0aAorCQkJICogdGhlc2UgcmVwb3J0cy4gKi8KKwkJCUlFRUU4MDIxMV9ERUJVR19EUk9QKCJEZWNyeXB0aW9uIGZhaWxlZCAobm90IHNldCkiCisJCQkJCSAgICAgIiAoU0E9IiBNQUNfRk1UICIpXG4iLAorCQkJCQkgICAgIE1BQ19BUkcoaGRyLT5hZGRyMikpOworCQkJaWVlZS0+aWVlZV9zdGF0cy5yeF9kaXNjYXJkc191bmRlY3J5cHRhYmxlKys7CisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJCX0KKwl9CisKKwlpZiAoc2tiLT5sZW4gPCBJRUVFODAyMTFfREFUQV9IRFIzX0xFTikKKwkJZ290byByeF9kcm9wcGVkOworCisJLy8gaWYgUW9TIGVuYWJsZWQsIHNob3VsZCBjaGVjayB0aGUgc2VxdWVuY2UgZm9yIGVhY2ggb2YgdGhlIEFDCisJaWYoIChpZWVlLT5wSFRJbmZvLT5iQ3VyUnhSZW9yZGVyRW5hYmxlID09IGZhbHNlKSB8fCAhaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZXx8ICFJc0RhdGFGcmFtZShza2ItPmRhdGEpIHx8IElzTGVnYWN5RGF0YUZyYW1lKHNrYi0+ZGF0YSkpeworCQlpZiAoaXNfZHVwbGljYXRlX3BhY2tldChpZWVlLCBoZHIpKQorCQlnb3RvIHJ4X2Ryb3BwZWQ7CisKKwl9CisJZWxzZQorCXsKKwkJUFJYX1RTX1JFQ09SRCBwUnhUUyA9IE5VTEw7CisJCQkvL0lFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUkVPUkRFUiwiJXMoKTogUU9TIEVOQUJMRSBBTkQgUkVDRUlWRSBRT1MgREFUQSAsIHdlIHdpbGwgZ2V0IFRzLCB0aWQ6JWRcbiIsX19GVU5DVElPTl9fLCB0aWQpOworCQlpZihHZXRUcygKKwkJCQlpZWVlLAorCQkJCShQVFNfQ09NTU9OX0lORk8qKSAmcFJ4VFMsCisJCQkJaGRyLT5hZGRyMiwKKwkJCQkodTgpRnJhbWVfUW9TVElEKCh1OCopKHNrYi0+ZGF0YSkpLAorCQkJCVJYX0RJUiwKKwkJCQl0cnVlKSkKKwkJeworCisJCS8vCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUkVPUkRFUiwiJXMoKTogcFJ4VFMtPlJ4TGFzdEZyYWdOdW0gaXMgJWQsZnJhZyBpcyAlZCxwUnhUUy0+UnhMYXN0U2VxTnVtIGlzICVkLHNlcSBpcyAlZFxuIixfX0ZVTkNUSU9OX18scFJ4VFMtPlJ4TGFzdEZyYWdOdW0sZnJhZyxwUnhUUy0+UnhMYXN0U2VxTnVtLFdMQU5fR0VUX1NFUV9TRVEoc2MpKTsKKwkJCWlmKCAJKGZjICYgKDE8PDExKSkgICYmCisJCQkJCShmcmFnID09IHBSeFRTLT5SeExhc3RGcmFnTnVtKSAmJgorCQkJCQkoV0xBTl9HRVRfU0VRX1NFUShzYykgPT0gcFJ4VFMtPlJ4TGFzdFNlcU51bSkJKQorCQkJeworCQkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwUnhUUy0+UnhMYXN0RnJhZ051bSA9IGZyYWc7CisJCQkJcFJ4VFMtPlJ4TGFzdFNlcU51bSA9IFdMQU5fR0VUX1NFUV9TRVEoc2MpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICIlcygpOiBObyBUUyEhIFNraXAgdGhlIGNoZWNrISFcbiIsX19GVU5DVElPTl9fKTsKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJfQorCX0KKwlpZiAodHlwZSA9PSBJRUVFODAyMTFfRlRZUEVfTUdNVCkgeworCisKKwkvL0lFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJaWYgKGllZWU4MDIxMV9yeF9mcmFtZV9tZ210KGllZWUsIHNrYiwgcnhfc3RhdHMsIHR5cGUsIHN0eXBlKSkKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJZWxzZQorCQkJZ290byByeF9leGl0OworCX0KKworCS8qIERhdGEgZnJhbWUgLSBleHRyYWN0IHNyYy9kc3QgYWRkcmVzc2VzICovCisJc3dpdGNoIChmYyAmIChJRUVFODAyMTFfRkNUTF9GUk9NRFMgfCBJRUVFODAyMTFfRkNUTF9UT0RTKSkgeworCWNhc2UgSUVFRTgwMjExX0ZDVExfRlJPTURTOgorCQltZW1jcHkoZHN0LCBoZHItPmFkZHIxLCBFVEhfQUxFTik7CisJCW1lbWNweShzcmMsIGhkci0+YWRkcjMsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGJzc2lkLCBoZHItPmFkZHIyLCBFVEhfQUxFTik7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0ZDVExfVE9EUzoKKwkJbWVtY3B5KGRzdCwgaGRyLT5hZGRyMywgRVRIX0FMRU4pOworCQltZW1jcHkoc3JjLCBoZHItPmFkZHIyLCBFVEhfQUxFTik7CisJCW1lbWNweShic3NpZCwgaGRyLT5hZGRyMSwgRVRIX0FMRU4pOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9GQ1RMX0ZST01EUyB8IElFRUU4MDIxMV9GQ1RMX1RPRFM6CisJCWlmIChza2ItPmxlbiA8IElFRUU4MDIxMV9EQVRBX0hEUjRfTEVOKQorCQkJZ290byByeF9kcm9wcGVkOworCQltZW1jcHkoZHN0LCBoZHItPmFkZHIzLCBFVEhfQUxFTik7CisJCW1lbWNweShzcmMsIGhkci0+YWRkcjQsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGJzc2lkLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQltZW1jcHkoZHN0LCBoZHItPmFkZHIxLCBFVEhfQUxFTik7CisJCW1lbWNweShzcmMsIGhkci0+YWRkcjIsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGJzc2lkLCBoZHItPmFkZHIzLCBFVEhfQUxFTik7CisJCWJyZWFrOworCX0KKworI2lmZGVmIE5PVF9ZRVQKKwlpZiAoaG9zdGFwX3J4X2ZyYW1lX3dkcyhpZWVlLCBoZHIsIGZjLCAmd2RzKSkKKwkJZ290byByeF9kcm9wcGVkOworCWlmICh3ZHMpIHsKKwkJc2tiLT5kZXYgPSBkZXYgPSB3ZHM7CisJCXN0YXRzID0gaG9zdGFwX2dldF9zdGF0cyhkZXYpOworCX0KKworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSICYmICF3ZHMgJiYKKwkgICAgKGZjICYgKElFRUU4MDIxMV9GQ1RMX1RPRFMgfCBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKSA9PSBJRUVFODAyMTFfRkNUTF9GUk9NRFMgJiYKKwkgICAgaWVlZS0+c3RhZGV2ICYmCisJICAgIG1lbWNtcChoZHItPmFkZHIyLCBpZWVlLT5hc3NvY19hcF9hZGRyLCBFVEhfQUxFTikgPT0gMCkgeworCQkvKiBGcmFtZSBmcm9tIEJTU0lEIG9mIHRoZSBBUCBmb3Igd2hpY2ggd2UgYXJlIGEgY2xpZW50ICovCisJCXNrYi0+ZGV2ID0gZGV2ID0gaWVlZS0+c3RhZGV2OworCQlzdGF0cyA9IGhvc3RhcF9nZXRfc3RhdHMoZGV2KTsKKwkJZnJvbV9hc3NvY19hcCA9IDE7CisJfQorI2VuZGlmCisKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCisjaWZkZWYgTk9UX1lFVAorCWlmICgoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUiB8fAorCSAgICAgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX1JFUEVBVCkgJiYKKwkgICAgIWZyb21fYXNzb2NfYXApIHsKKwkJc3dpdGNoIChob3N0YXBfaGFuZGxlX3N0YV9yeChpZWVlLCBkZXYsIHNrYiwgcnhfc3RhdHMsCisJCQkJCSAgICAgd2RzICE9IE5VTEwpKSB7CisJCWNhc2UgQVBfUlhfQ09OVElOVUVfTk9UX0FVVEhPUklaRUQ6CisJCQlmcmFtZV9hdXRob3JpemVkID0gMDsKKwkJCWJyZWFrOworCQljYXNlIEFQX1JYX0NPTlRJTlVFOgorCQkJZnJhbWVfYXV0aG9yaXplZCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBBUF9SWF9EUk9QOgorCQkJZ290byByeF9kcm9wcGVkOworCQljYXNlIEFQX1JYX0VYSVQ6CisJCQlnb3RvIHJ4X2V4aXQ7CisJCX0KKwl9CisjZW5kaWYKKwkvL0lFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkvKiBOdWxsZnVuYyBmcmFtZXMgbWF5IGhhdmUgUFMtYml0IHNldCwgc28gdGhleSBtdXN0IGJlIHBhc3NlZCB0bworCSAqIGhvc3RhcF9oYW5kbGVfc3RhX3J4KCkgYmVmb3JlIGJlaW5nIGRyb3BwZWQgaGVyZS4gKi8KKwlpZiAoc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX0RBVEEgJiYKKwkgICAgc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZBQ0sgJiYKKwkgICAgc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZQT0xMICYmCisJICAgIHN0eXBlICE9IElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGQUNLUE9MTCYmCisJICAgIHN0eXBlICE9IElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQS8vYWRkIGJ5IERhdmlkLDIwMDYuOC40CisJICAgICkgeworCQlpZiAoc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX05VTExGVU5DKQorCQkJSUVFRTgwMjExX0RFQlVHX0RST1AoCisJCQkJIlJYOiBkcm9wcGVkIGRhdGEgZnJhbWUgIgorCQkJCSJ3aXRoIG5vIGRhdGEgKHR5cGU9MHglMDJ4LCAiCisJCQkJInN1YnR5cGU9MHglMDJ4LCBsZW49JWQpXG4iLAorCQkJCXR5cGUsIHN0eXBlLCBza2ItPmxlbik7CisJCWdvdG8gcnhfZHJvcHBlZDsKKwl9CisgICAgICAgIGlmIChtZW1jbXAoYnNzaWQsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pKQorICAgICAgICAgICAgICAgIGdvdG8gcnhfZHJvcHBlZDsKKworCS8qIHNrYjogaGRyICsgKHBvc3NpYmx5IGZyYWdtZW50ZWQsIHBvc3NpYmx5IGVuY3J5cHRlZCkgcGF5bG9hZCAqLworCisJaWYgKGllZWUtPmhvc3RfZGVjcnlwdCAmJiAoZmMgJiBJRUVFODAyMTFfRkNUTF9XRVApICYmCisJICAgIChrZXlpZHggPSBpZWVlODAyMTFfcnhfZnJhbWVfZGVjcnlwdChpZWVlLCBza2IsIGNyeXB0KSkgPCAwKQorCXsKKwkJcHJpbnRrKCJkZWNyeXB0IGZyYW1lIGVycm9yXG4iKTsKKwkJZ290byByeF9kcm9wcGVkOworCX0KKworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKKworCS8qIHNrYjogaGRyICsgKHBvc3NpYmx5IGZyYWdtZW50ZWQpIHBsYWludGV4dCBwYXlsb2FkICovCisJLy8gUFI6IEZJWE1FOiBob3N0YXAgaGFzIGFkZGl0aW9uYWwgY29uZGl0aW9ucyBpbiB0aGUgImlmIiBiZWxvdzoKKwkvLyBpZWVlLT5ob3N0X2RlY3J5cHQgJiYgKGZjICYgSUVFRTgwMjExX0ZDVExfV0VQKSAmJgorCWlmICgoZnJhZyAhPSAwIHx8IChmYyAmIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUykpKSB7CisJCWludCBmbGVuOworCQlzdHJ1Y3Qgc2tfYnVmZiAqZnJhZ19za2IgPSBpZWVlODAyMTFfZnJhZ19jYWNoZV9nZXQoaWVlZSwgaGRyKTsKKwkJSUVFRTgwMjExX0RFQlVHX0ZSQUcoIlJ4IEZyYWdtZW50IHJlY2VpdmVkICgldSlcbiIsIGZyYWcpOworCisJCWlmICghZnJhZ19za2IpIHsKKwkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUlggfCBJRUVFODAyMTFfRExfRlJBRywKKwkJCQkJIlJ4IGNhbm5vdCBnZXQgc2tiIGZyb20gZnJhZ21lbnQgIgorCQkJCQkiY2FjaGUgKG1vcmVmcmFnPSVkIHNlcT0ldSBmcmFnPSV1KVxuIiwKKwkJCQkJKGZjICYgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKSAhPSAwLAorCQkJCQlXTEFOX0dFVF9TRVFfU0VRKHNjKSwgZnJhZyk7CisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJCX0KKwkJZmxlbiA9IHNrYi0+bGVuOworCQlpZiAoZnJhZyAhPSAwKQorCQkJZmxlbiAtPSBoZHJsZW47CisKKwkJaWYgKGZyYWdfc2tiLT50YWlsICsgZmxlbiA+IGZyYWdfc2tiLT5lbmQpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBob3N0IGRlY3J5cHRlZCBhbmQgIgorCQkJICAgICAgICJyZWFzc2VtYmxlZCBmcmFtZSBkaWQgbm90IGZpdCBza2JcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWllZWU4MDIxMV9mcmFnX2NhY2hlX2ludmFsaWRhdGUoaWVlZSwgaGRyKTsKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJfQorCisJCWlmIChmcmFnID09IDApIHsKKwkJCS8qIGNvcHkgZmlyc3QgZnJhZ21lbnQgKGluY2x1ZGluZyBmdWxsIGhlYWRlcnMpIGludG8KKwkJCSAqIGJlZ2lubmluZyBvZiB0aGUgZnJhZ21lbnQgY2FjaGUgc2tiICovCisJCQltZW1jcHkoc2tiX3B1dChmcmFnX3NrYiwgZmxlbiksIHNrYi0+ZGF0YSwgZmxlbik7CisJCX0gZWxzZSB7CisJCQkvKiBhcHBlbmQgZnJhbWUgcGF5bG9hZCB0byB0aGUgZW5kIG9mIHRoZSBmcmFnbWVudAorCQkJICogY2FjaGUgc2tiICovCisJCQltZW1jcHkoc2tiX3B1dChmcmFnX3NrYiwgZmxlbiksIHNrYi0+ZGF0YSArIGhkcmxlbiwKKwkJCSAgICAgICBmbGVuKTsKKwkJfQorCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlza2IgPSBOVUxMOworCisJCWlmIChmYyAmIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUykgeworCQkJLyogbW9yZSBmcmFnbWVudHMgZXhwZWN0ZWQgLSBsZWF2ZSB0aGUgc2tiIGluIGZyYWdtZW50CisJCQkgKiBjYWNoZSBmb3Igbm93OyBpdCB3aWxsIGJlIGRlbGl2ZXJlZCB0byB1cHBlciBsYXllcnMKKwkJCSAqIGFmdGVyIGFsbCBmcmFnbWVudHMgaGF2ZSBiZWVuIHJlY2VpdmVkICovCisJCQlnb3RvIHJ4X2V4aXQ7CisJCX0KKworCQkvKiB0aGlzIHdhcyB0aGUgbGFzdCBmcmFnbWVudCBhbmQgdGhlIGZyYW1lIHdpbGwgYmUKKwkJICogZGVsaXZlcmVkLCBzbyByZW1vdmUgc2tiIGZyb20gZnJhZ21lbnQgY2FjaGUgKi8KKwkJc2tiID0gZnJhZ19za2I7CisJCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqKSBza2ItPmRhdGE7CisJCWllZWU4MDIxMV9mcmFnX2NhY2hlX2ludmFsaWRhdGUoaWVlZSwgaGRyKTsKKwl9CisKKwkvKiBza2I6IGhkciArIChwb3NzaWJsZSByZWFzc2VtYmxlZCkgZnVsbCBNU0RVIHBheWxvYWQ7IHBvc3NpYmx5IHN0aWxsCisJICogZW5jcnlwdGVkL2F1dGhlbnRpY2F0ZWQgKi8KKwlpZiAoaWVlZS0+aG9zdF9kZWNyeXB0ICYmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1dFUCkgJiYKKwkgICAgaWVlZTgwMjExX3J4X2ZyYW1lX2RlY3J5cHRfbXNkdShpZWVlLCBza2IsIGtleWlkeCwgY3J5cHQpKQorCXsKKwkJcHJpbnRrKCI9PT5kZWNyeXB0IG1zZHUgZXJyb3JcbiIpOworCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJfQorCisJLy9hZGRlZCBieSBhbXkgZm9yIEFQIHJvYW1pbmcKKwlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2RGF0YUluUGVyaW9kKys7CisJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUnhPa0luUGVyaW9kKys7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKikgc2tiLT5kYXRhOworCWlmIChjcnlwdCAmJiAhKGZjICYgSUVFRTgwMjExX0ZDVExfV0VQKSAmJiAhaWVlZS0+b3Blbl93ZXApIHsKKwkJaWYgKC8qaWVlZS0+aWVlZTgwMl8xeCAmJiovCisJCSAgICBpZWVlODAyMTFfaXNfZWFwb2xfZnJhbWUoaWVlZSwgc2tiLCBoZHJsZW4pKSB7CisKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisJCQkvKiBwYXNzIHVuZW5jcnlwdGVkIEVBUE9MIGZyYW1lcyBldmVuIGlmIGVuY3J5cHRpb24gaXMKKwkJCSAqIGNvbmZpZ3VyZWQgKi8KKwkJCXN0cnVjdCBlYXBvbCAqZWFwID0gKHN0cnVjdCBlYXBvbCAqKShza2ItPmRhdGEgKworCQkJCTI0KTsKKwkJCUlFRUU4MDIxMV9ERUJVR19FQVAoIlJYOiBJRUVFIDgwMi4xWCBFQVBPTCBmcmFtZTogJXNcbiIsCisJCQkJCQllYXBfZ2V0X3R5cGUoZWFwLT50eXBlKSk7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCUlFRUU4MDIxMV9ERUJVR19EUk9QKAorCQkJCSJlbmNyeXB0aW9uIGNvbmZpZ3VyZWQsIGJ1dCBSWCAiCisJCQkJImZyYW1lIG5vdCBlbmNyeXB0ZWQgKFNBPSIgTUFDX0ZNVCAiKVxuIiwKKwkJCQlNQUNfQVJHKGhkci0+YWRkcjIpKTsKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJfQorCX0KKworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwlpZiAoY3J5cHQgJiYgIShmYyAmIElFRUU4MDIxMV9GQ1RMX1dFUCkgJiYKKwkgICAgaWVlZTgwMjExX2lzX2VhcG9sX2ZyYW1lKGllZWUsIHNrYiwgaGRybGVuKSkgeworCQkJc3RydWN0IGVhcG9sICplYXAgPSAoc3RydWN0IGVhcG9sICopKHNrYi0+ZGF0YSArCisJCQkJMjQpOworCQkJSUVFRTgwMjExX0RFQlVHX0VBUCgiUlg6IElFRUUgODAyLjFYIEVBUE9MIGZyYW1lOiAlc1xuIiwKKwkJCQkJCWVhcF9nZXRfdHlwZShlYXAtPnR5cGUpKTsKKwl9CisjZW5kaWYKKworCWlmIChjcnlwdCAmJiAhKGZjICYgSUVFRTgwMjExX0ZDVExfV0VQKSAmJiAhaWVlZS0+b3Blbl93ZXAgJiYKKwkgICAgIWllZWU4MDIxMV9pc19lYXBvbF9mcmFtZShpZWVlLCBza2IsIGhkcmxlbikpIHsKKwkJSUVFRTgwMjExX0RFQlVHX0RST1AoCisJCQkiZHJvcHBlZCB1bmVuY3J5cHRlZCBSWCBkYXRhICIKKwkJCSJmcmFtZSBmcm9tICIgTUFDX0ZNVAorCQkJIiAoZHJvcF91bmVuY3J5cHRlZD0xKVxuIiwKKwkJCU1BQ19BUkcoaGRyLT5hZGRyMikpOworCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJfQorLyoKKwlpZihpZWVlODAyMTFfaXNfZWFwb2xfZnJhbWUoaWVlZSwgc2tiLCBoZHJsZW4pKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlJYOiBJRUVFODAyLjFYIEVQQU9MIGZyYW1lIVxuIik7CisJfQorKi8KKy8vYWRkZWQgYnkgYW15IGZvciByZW9yZGVyCisJaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZSAmJiBJc1FvU0RhdGFGcmFtZShza2ItPmRhdGEpCisJCSYmICFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSAmJiAhaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkpCisJeworCQlUSUQgPSBGcmFtZV9Rb1NUSUQoc2tiLT5kYXRhKTsKKwkJU2VxTnVtID0gV0xBTl9HRVRfU0VRX1NFUShzYyk7CisJCUdldFRzKGllZWUsKFBUU19DT01NT05fSU5GTyopICZwVFMsaGRyLT5hZGRyMixUSUQsUlhfRElSLHRydWUpOworCQlpZihUSUQgIT0wICYmIFRJRCAhPTMpCisJCXsKKwkJCWllZWUtPmJpc19hbnlfbm9uYmVwa3RzID0gdHJ1ZTsKKwkJfQorCX0KKy8vYWRkZWQgYnkgYW15IGZvciByZW9yZGVyCisJLyogc2tiOiBoZHIgKyAocG9zc2libGUgcmVhc3NlbWJsZWQpIGZ1bGwgcGxhaW50ZXh0IHBheWxvYWQgKi8KKwlwYXlsb2FkID0gc2tiLT5kYXRhICsgaGRybGVuOworCS8vZXRoZXJ0eXBlID0gKHBheWxvYWRbNl0gPDwgOCkgfCBwYXlsb2FkWzddOworCXJ4YiA9IChzdHJ1Y3QgaWVlZTgwMjExX3J4Yiopa21hbGxvYyhzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9yeGIpLEdGUF9BVE9NSUMpOworCWlmKHJ4YiA9PSBOVUxMKQorCXsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsIiVzKCk6IGttYWxsb2MgcnhiIGVycm9yXG4iLF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gcnhfZHJvcHBlZDsKKwl9CisJLyogdG8gcGFyc2UgYW1zZHUgcGFja2V0cyAqLworCS8qIHFvcyBkYXRhIHBhY2tldHMgJiByZXNlcnZlZCBiaXQgaXMgMSAqLworCWlmKHBhcnNlX3N1YmZyYW1lKHNrYixyeF9zdGF0cyxyeGIsc3JjLGRzdCkgPT0gMCkgeworCQkvKiBvbmx5IHRvIGZyZWUgcnhiLCBhbmQgbm90IHN1Ym1pdCB0aGUgcGFja2V0cyB0byB1cHBlciBsYXllciAqLworCQlmb3IoaSA9MDsgaSA8IHJ4Yi0+bnJfc3ViZnJhbWVzOyBpKyspIHsKKwkJCWRldl9rZnJlZV9za2IocnhiLT5zdWJmcmFtZXNbaV0pOworCQl9CisJCWtmcmVlKHJ4Yik7CisJCXJ4YiA9IE5VTEw7CisJCWdvdG8gcnhfZHJvcHBlZDsKKwl9CisKKy8vYWRkZWQgYnkgYW15IGZvciByZW9yZGVyCisJaWYoaWVlZS0+cEhUSW5mby0+YkN1clJ4UmVvcmRlckVuYWJsZSA9PSBmYWxzZSB8fHBUUyA9PSBOVUxMKXsKKy8vYWRkZWQgYnkgYW15IGZvciByZW9yZGVyCisJCWZvcihpID0gMDsgaTxyeGItPm5yX3N1YmZyYW1lczsgaSsrKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc3ViX3NrYiA9IHJ4Yi0+c3ViZnJhbWVzW2ldOworCisJCQlpZiAoc3ViX3NrYikgeworCQkJCS8qIGNvbnZlcnQgaGRyICsgcG9zc2libGUgTExDIGhlYWRlcnMgaW50byBFdGhlcm5ldCBoZWFkZXIgKi8KKwkJCQlldGhlcnR5cGUgPSAoc3ViX3NrYi0+ZGF0YVs2XSA8PCA4KSB8IHN1Yl9za2ItPmRhdGFbN107CisJCQkJaWYgKHN1Yl9za2ItPmxlbiA+PSA4ICYmCisJCQkJCQkoKG1lbWNtcChzdWJfc2tiLT5kYXRhLCByZmMxMDQyX2hlYWRlciwgU05BUF9TSVpFKSA9PSAwICYmCisJCQkJCQkgIGV0aGVydHlwZSAhPSBFVEhfUF9BQVJQICYmIGV0aGVydHlwZSAhPSBFVEhfUF9JUFgpIHx8CisJCQkJCQkgbWVtY21wKHN1Yl9za2ItPmRhdGEsIGJyaWRnZV90dW5uZWxfaGVhZGVyLCBTTkFQX1NJWkUpID09IDApKSB7CisJCQkJCS8qIHJlbW92ZSBSRkMxMDQyIG9yIEJyaWRnZS1UdW5uZWwgZW5jYXBzdWxhdGlvbiBhbmQKKwkJCQkJICogcmVwbGFjZSBFdGhlclR5cGUgKi8KKwkJCQkJc2tiX3B1bGwoc3ViX3NrYiwgU05BUF9TSVpFKTsKKwkJCQkJbWVtY3B5KHNrYl9wdXNoKHN1Yl9za2IsIEVUSF9BTEVOKSwgc3JjLCBFVEhfQUxFTik7CisJCQkJCW1lbWNweShza2JfcHVzaChzdWJfc2tiLCBFVEhfQUxFTiksIGRzdCwgRVRIX0FMRU4pOworCQkJCX0gZWxzZSB7CisJCQkJCXUxNiBsZW47CisJCQkJCS8qIExlYXZlIEV0aGVybmV0IGhlYWRlciBwYXJ0IG9mIGhkciBhbmQgZnVsbCBwYXlsb2FkICovCisJCQkJCWxlbiA9IGh0b25zKHN1Yl9za2ItPmxlbik7CisJCQkJCW1lbWNweShza2JfcHVzaChzdWJfc2tiLCAyKSwgJmxlbiwgMik7CisJCQkJCW1lbWNweShza2JfcHVzaChzdWJfc2tiLCBFVEhfQUxFTiksIHNyYywgRVRIX0FMRU4pOworCQkJCQltZW1jcHkoc2tiX3B1c2goc3ViX3NrYiwgRVRIX0FMRU4pLCBkc3QsIEVUSF9BTEVOKTsKKwkJCQl9CisKKwkJCQlzdGF0cy0+cnhfcGFja2V0cysrOworCQkJCXN0YXRzLT5yeF9ieXRlcyArPSBzdWJfc2tiLT5sZW47CisJCQkJaWYoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZHN0KSkgeworCQkJCQlzdGF0cy0+bXVsdGljYXN0Kys7CisJCQkJfQorCisJCQkJLyogSW5kaWNhdCB0aGUgcGFja2V0cyB0byB1cHBlciBsYXllciAqLworCQkJCS8vcHJpbnRrKCIwc2tiX2xlbiglZClcbiIsIHNrYi0+bGVuKTsKKwkJCQlzdWJfc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHN1Yl9za2IsIGRldik7CisJCQkJbWVtc2V0KHN1Yl9za2ItPmNiLCAwLCBzaXplb2Yoc3ViX3NrYi0+Y2IpKTsKKwkJCQlzdWJfc2tiLT5kZXYgPSBkZXY7CisJCQkJc3ViX3NrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsgLyogODAyLjExIGNyYyBub3Qgc3VmZmljaWVudCAqLworCQkJCS8vc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsgLyogODAyLjExIGNyYyBub3Qgc3VmZmljaWVudCAqLworCQkJCWllZWUtPmxhc3RfcnhfcHNfdGltZSA9IGppZmZpZXM7CisJCQkJLy9wcmludGsoIjFza2JfbGVuKCVkKVxuIiwgc2tiLT5sZW4pOworCQkJCW5ldGlmX3J4KHN1Yl9za2IpOworCQkJfQorCQl9CisJCWtmcmVlKHJ4Yik7CisJCXJ4YiA9IE5VTEw7CisKKwl9CisJZWxzZQorCXsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCIlcygpOiBSRU9SREVSIEVOQUJMRSBBTkQgUFRTIG5vdCBOVUxMLCBhbmQgd2Ugd2lsbCBlbnRlciBSeFJlb3JkZXJJbmRpY2F0ZVBhY2tldCgpXG4iLF9fRlVOQ1RJT05fXyk7CisJCVJ4UmVvcmRlckluZGljYXRlUGFja2V0KGllZWUsIHJ4YiwgcFRTLCBTZXFOdW0pOworCX0KKyNpZm5kZWYgSk9ITl9OT0NQWQorCWRldl9rZnJlZV9za2Ioc2tiKTsKKyNlbmRpZgorCisgcnhfZXhpdDoKKyNpZmRlZiBOT1RfWUVUCisJaWYgKHN0YSkKKwkJaG9zdGFwX2hhbmRsZV9zdGFfcmVsZWFzZShzdGEpOworI2VuZGlmCisJcmV0dXJuIDE7CisKKyByeF9kcm9wcGVkOgorCWlmIChyeGIgIT0gTlVMTCkKKwl7CisJCWtmcmVlKHJ4Yik7CisJCXJ4YiA9IE5VTEw7CisJfQorCXN0YXRzLT5yeF9kcm9wcGVkKys7CisKKwkvKiBSZXR1cm5pbmcgMCBpbmRpY2F0ZXMgdG8gY2FsbGVyIHRoYXQgd2UgaGF2ZSBub3QgaGFuZGxlZCB0aGUgU0tCLS0KKwkgKiBzbyBpdCBpcyBzdGlsbCBhbGxvY2F0ZWQgYW5kIGNhbiBiZSB1c2VkIGFnYWluIGJ5IHVuZGVybHlpbmcKKwkgKiBoYXJkd2FyZSBhcyBhIERNQSB0YXJnZXQgKi8KKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBNR01UX0ZSQU1FX0ZJWEVEX1BBUlRfTEVOR1RIICAgICAgICAgICAgMHgyNAorCitzdGF0aWMgdTggcW9zX291aVtRT1NfT1VJX0xFTl0gPSB7IDB4MDAsIDB4NTAsIDB4RjIgfTsKKworLyoKKyogTWFrZSB0aGVyIHN0cnVjdHVyZSB3ZSByZWFkIGZyb20gdGhlIGJlYWNvbiBwYWNrZXQgaGFzCisqIHRoZSByaWdodCB2YWx1ZXMKKyovCitzdGF0aWMgaW50IGllZWU4MDIxMV92ZXJpZnlfcW9zX2luZm8oc3RydWN0IGllZWU4MDIxMV9xb3NfaW5mb3JtYXRpb25fZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbmZvX2VsZW1lbnQsIGludCBzdWJfdHlwZSkKK3sKKworICAgICAgICBpZiAoaW5mb19lbGVtZW50LT5xdWlfc3VidHlwZSAhPSBzdWJfdHlwZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChtZW1jbXAoaW5mb19lbGVtZW50LT5xdWksIHFvc19vdWksIFFPU19PVUlfTEVOKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChpbmZvX2VsZW1lbnQtPnF1aV90eXBlICE9IFFPU19PVUlfVFlQRSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChpbmZvX2VsZW1lbnQtPnZlcnNpb24gIT0gUU9TX1ZFUlNJT05fMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFBhcnNlIGEgUW9TIHBhcmFtZXRlciBlbGVtZW50CisgKi8KK3N0YXRpYyBpbnQgaWVlZTgwMjExX3JlYWRfcW9zX3BhcmFtX2VsZW1lbnQoc3RydWN0IGllZWU4MDIxMV9xb3NfcGFyYW1ldGVyX2luZm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmVsZW1lbnRfcGFyYW0sIHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbmZvX2VsZW1lbnQpCit7CisgICAgICAgIGludCByZXQgPSAwOworICAgICAgICB1MTYgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJfaW5mbykgLSAyOworCisgICAgICAgIGlmICgoaW5mb19lbGVtZW50ID09IE5VTEwpIHx8IChlbGVtZW50X3BhcmFtID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBpZiAoaW5mb19lbGVtZW50LT5pZCA9PSBRT1NfRUxFTUVOVF9JRCAmJiBpbmZvX2VsZW1lbnQtPmxlbiA9PSBzaXplKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGVsZW1lbnRfcGFyYW0tPmluZm9fZWxlbWVudC5xdWksIGluZm9fZWxlbWVudC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5mb19lbGVtZW50LT5sZW4pOworICAgICAgICAgICAgICAgIGVsZW1lbnRfcGFyYW0tPmluZm9fZWxlbWVudC5lbGVtZW50SUQgPSBpbmZvX2VsZW1lbnQtPmlkOworICAgICAgICAgICAgICAgIGVsZW1lbnRfcGFyYW0tPmluZm9fZWxlbWVudC5sZW5ndGggPSBpbmZvX2VsZW1lbnQtPmxlbjsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgIGlmIChyZXQgPT0gMCkKKyAgICAgICAgICAgICAgICByZXQgPSBpZWVlODAyMTFfdmVyaWZ5X3Fvc19pbmZvKCZlbGVtZW50X3BhcmFtLT5pbmZvX2VsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRT1NfT1VJX1BBUkFNX1NVQl9UWVBFKTsKKyAgICAgICAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFBhcnNlIGEgUW9TIGluZm9ybWF0aW9uIGVsZW1lbnQKKyAqLworc3RhdGljIGludCBpZWVlODAyMTFfcmVhZF9xb3NfaW5mb19lbGVtZW50KHN0cnVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllZWU4MDIxMV9xb3NfaW5mb3JtYXRpb25fZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICplbGVtZW50X2luZm8sIHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmluZm9fZWxlbWVudCkKK3sKKyAgICAgICAgaW50IHJldCA9IDA7CisgICAgICAgIHUxNiBzaXplID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcW9zX2luZm9ybWF0aW9uX2VsZW1lbnQpIC0gMjsKKworICAgICAgICBpZiAoZWxlbWVudF9pbmZvID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoaW5mb19lbGVtZW50ID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGlmICgoaW5mb19lbGVtZW50LT5pZCA9PSBRT1NfRUxFTUVOVF9JRCkgJiYgKGluZm9fZWxlbWVudC0+bGVuID09IHNpemUpKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGVsZW1lbnRfaW5mby0+cXVpLCBpbmZvX2VsZW1lbnQtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIGluZm9fZWxlbWVudC0+bGVuKTsKKyAgICAgICAgICAgICAgICBlbGVtZW50X2luZm8tPmVsZW1lbnRJRCA9IGluZm9fZWxlbWVudC0+aWQ7CisgICAgICAgICAgICAgICAgZWxlbWVudF9pbmZvLT5sZW5ndGggPSBpbmZvX2VsZW1lbnQtPmxlbjsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgcmV0ID0gLTE7CisKKyAgICAgICAgaWYgKHJldCA9PSAwKQorICAgICAgICAgICAgICAgIHJldCA9IGllZWU4MDIxMV92ZXJpZnlfcW9zX2luZm8oZWxlbWVudF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU9TX09VSV9JTkZPX1NVQl9UWVBFKTsKKyAgICAgICAgcmV0dXJuIHJldDsKK30KKworCisvKgorICogV3JpdGUgUW9TIHBhcmFtZXRlcnMgZnJvbSB0aGUgYWMgcGFyYW1ldGVycy4KKyAqLworc3RhdGljIGludCBpZWVlODAyMTFfcW9zX2NvbnZlcnRfYWNfdG9fcGFyYW1ldGVycyhzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJfaW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGFyYW1fZWxtLCBzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpxb3NfcGFyYW0pCit7CisgICAgICAgIGludCByYyA9IDA7CisgICAgICAgIGludCBpOworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3Fvc19hY19wYXJhbWV0ZXIgKmFjX3BhcmFtczsKKwl1OCBhY2k7CisgICAgICAgIC8vdTggY3dfbWluOworICAgICAgICAvL3U4IGN3X21heDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUU9TX1FVRVVFX05VTTsgaSsrKSB7CisgICAgICAgICAgICAgICAgYWNfcGFyYW1zID0gJihwYXJhbV9lbG0tPmFjX3BhcmFtc19yZWNvcmRbaV0pOworCisJCWFjaSA9IChhY19wYXJhbXMtPmFjaV9haWZzbiAmIDB4NjApID4+IDU7CisKKwkJaWYoYWNpID49IFFPU19RVUVVRV9OVU0pCisJCQljb250aW51ZTsKKyAgICAgICAgICAgICAgICBxb3NfcGFyYW0tPmFpZnNbYWNpXSA9IChhY19wYXJhbXMtPmFjaV9haWZzbikgJiAweDBmOworCisJCS8qIFdNTSBzcGVjIFAuMTE6IFRoZSBtaW5pbXVtIHZhbHVlIGZvciBBSUZTTiBzaGFsbCBiZSAyICovCisgICAgICAgICAgICAgICAgcW9zX3BhcmFtLT5haWZzW2FjaV0gPSAocW9zX3BhcmFtLT5haWZzW2FjaV0gPCAyKSA/IDI6cW9zX3BhcmFtLT5haWZzW2FjaV07CisKKyAgICAgICAgICAgICAgICBxb3NfcGFyYW0tPmN3X21pblthY2ldID0gYWNfcGFyYW1zLT5lY3dfbWluX21heCAmIDB4MEY7CisKKyAgICAgICAgICAgICAgICBxb3NfcGFyYW0tPmN3X21heFthY2ldID0gKGFjX3BhcmFtcy0+ZWN3X21pbl9tYXggJiAweEYwKSA+PiA0OworCisgICAgICAgICAgICAgICAgcW9zX3BhcmFtLT5mbGFnW2FjaV0gPQorICAgICAgICAgICAgICAgICAgICAoYWNfcGFyYW1zLT5hY2lfYWlmc24gJiAweDEwKSA/IDB4MDEgOiAweDAwOworICAgICAgICAgICAgICAgIHFvc19wYXJhbS0+dHhfb3BfbGltaXRbYWNpXSA9IGxlMTZfdG9fY3B1KGFjX3BhcmFtcy0+dHhfb3BfbGltaXQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByYzsKK30KKworLyoKKyAqIHdlIGhhdmUgYSBnZW5lcmljIGRhdGEgZWxlbWVudCB3aGljaCBpdCBtYXkgY29udGFpbiBRb1MgaW5mb3JtYXRpb24gb3IKKyAqIHBhcmFtZXRlcnMgZWxlbWVudC4gY2hlY2sgdGhlIGluZm9ybWF0aW9uIGVsZW1lbnQgbGVuZ3RoIHRvIGRlY2lkZQorICogd2hpY2ggdHlwZSB0byByZWFkCisgKi8KK3N0YXRpYyBpbnQgaWVlZTgwMjExX3BhcnNlX3Fvc19pbmZvX3BhcmFtX0lFKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW5mb19lbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrKQoreworICAgICAgICBpbnQgcmMgPSAwOworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJzICpxb3NfcGFyYW0gPSBOVUxMOworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3Fvc19pbmZvcm1hdGlvbl9lbGVtZW50IHFvc19pbmZvX2VsZW1lbnQ7CisKKyAgICAgICAgcmMgPSBpZWVlODAyMTFfcmVhZF9xb3NfaW5mb19lbGVtZW50KCZxb3NfaW5mb19lbGVtZW50LCBpbmZvX2VsZW1lbnQpOworCisgICAgICAgIGlmIChyYyA9PSAwKSB7CisgICAgICAgICAgICAgICAgbmV0d29yay0+cW9zX2RhdGEucGFyYW1fY291bnQgPSBxb3NfaW5mb19lbGVtZW50LmFjX2luZm8gJiAweDBGOworICAgICAgICAgICAgICAgIG5ldHdvcmstPmZsYWdzIHw9IE5FVFdPUktfSEFTX1FPU19JTkZPUk1BVElPTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJfaW5mbyBwYXJhbV9lbGVtZW50OworCisgICAgICAgICAgICAgICAgcmMgPSBpZWVlODAyMTFfcmVhZF9xb3NfcGFyYW1fZWxlbWVudCgmcGFyYW1fZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fZWxlbWVudCk7CisgICAgICAgICAgICAgICAgaWYgKHJjID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHFvc19wYXJhbSA9ICYobmV0d29yay0+cW9zX2RhdGEucGFyYW1ldGVycyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZWVlODAyMTFfcW9zX2NvbnZlcnRfYWNfdG9fcGFyYW1ldGVycygmcGFyYW1fZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFvc19wYXJhbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrLT5mbGFncyB8PSBORVRXT1JLX0hBU19RT1NfUEFSQU1FVEVSUzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmstPnFvc19kYXRhLnBhcmFtX2NvdW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9lbGVtZW50LmluZm9fZWxlbWVudC5hY19pbmZvICYgMHgwRjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocmMgPT0gMCkgeworICAgICAgICAgICAgICAgIElFRUU4MDIxMV9ERUJVR19RT1MoIlFvUyBpcyBzdXBwb3J0ZWRcbiIpOworICAgICAgICAgICAgICAgIG5ldHdvcmstPnFvc19kYXRhLnN1cHBvcnRlZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJjOworfQorCisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworI2RlZmluZSBNRklFX1NUUklORyh4KSBjYXNlIE1GSUVfVFlQRV8gIyN4OiByZXR1cm4gI3gKKworc3RhdGljIGNvbnN0IGNoYXIgKmdldF9pbmZvX2VsZW1lbnRfc3RyaW5nKHUxNiBpZCkKK3sKKyAgICAgICAgc3dpdGNoIChpZCkgeworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKFNTSUQpOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKFJBVEVTKTsKKyAgICAgICAgICAgICAgICBNRklFX1NUUklORyhGSF9TRVQpOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKERTX1NFVCk7CisgICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoQ0ZfU0VUKTsKKyAgICAgICAgICAgICAgICBNRklFX1NUUklORyhUSU0pOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKElCU1NfU0VUKTsKKyAgICAgICAgICAgICAgICBNRklFX1NUUklORyhDT1VOVFJZKTsKKyAgICAgICAgICAgICAgICBNRklFX1NUUklORyhIT1BfUEFSQU1TKTsKKyAgICAgICAgICAgICAgICBNRklFX1NUUklORyhIT1BfVEFCTEUpOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKFJFUVVFU1QpOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKENIQUxMRU5HRSk7CisgICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoUE9XRVJfQ09OU1RSQUlOVCk7CisgICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoUE9XRVJfQ0FQQUJJTElUWSk7CisgICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoVFBDX1JFUVVFU1QpOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKFRQQ19SRVBPUlQpOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKFNVUFBfQ0hBTk5FTFMpOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKENTQSk7CisgICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoTUVBU1VSRV9SRVFVRVNUKTsKKyAgICAgICAgICAgICAgICBNRklFX1NUUklORyhNRUFTVVJFX1JFUE9SVCk7CisgICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoUVVJRVQpOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKElCU1NfREZTKTsKKyAgICAgICAgICAgICAgIC8vIE1GSUVfU1RSSU5HKEVSUF9JTkZPKTsKKyAgICAgICAgICAgICAgICBNRklFX1NUUklORyhSU04pOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKFJBVEVTX0VYKTsKKyAgICAgICAgICAgICAgICBNRklFX1NUUklORyhHRU5FUklDKTsKKyAgICAgICAgICAgICAgICBNRklFX1NUUklORyhRT1NfUEFSQU1FVEVSKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlVOS05PV04iOworICAgICAgICB9Cit9CisjZW5kaWYKKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKK3N0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFfZXh0cmFjdF9jb3VudHJ5X2llKAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICppbmZvX2VsZW1lbnQsCisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrLAorCXU4ICogYWRkcjIKKykKK3sKKwlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpKQorCXsKKwkJaWYoaW5mb19lbGVtZW50LT5sZW4hPSAwKQorCQl7CisJCQltZW1jcHkobmV0d29yay0+Q291bnRyeUllQnVmLCBpbmZvX2VsZW1lbnQtPmRhdGEsIGluZm9fZWxlbWVudC0+bGVuKTsKKwkJCW5ldHdvcmstPkNvdW50cnlJZUxlbiA9IGluZm9fZWxlbWVudC0+bGVuOworCisJCQlpZighSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkKKwkJCXsKKwkJCQlEb3QxMWRfVXBkYXRlQ291bnRyeUllKGllZWUsIGFkZHIyLCBpbmZvX2VsZW1lbnQtPmxlbiwgaW5mb19lbGVtZW50LT5kYXRhKTsKKwkJCX0KKwkJfQorCisJCS8vCisJCS8vIDA3MDMwNSwgcmNuamtvOiBJIHVwZGF0ZSBjb3VudHJ5IElFIHdhdGNoIGRvZyBoZXJlIGJlY2F1c2UKKwkJLy8gc29tZSBBUCAoZS5nLiBDaXNjbyAxMjQyKSBkb24ndCBpbmNsdWRlIGNvdW50cnkgSUUgaW4gdGhlaXIKKwkJLy8gcHJvYmUgcmVzcG9uc2UgZnJhbWUuCisJCS8vCisJCWlmKElTX0VRVUFMX0NJRV9TUkMoaWVlZSwgYWRkcjIpICkKKwkJeworCQkJVVBEQVRFX0NJRV9XQVRDSERPRyhpZWVlKTsKKwkJfQorCX0KKworfQorI2VuZGlmCisKK2ludCBpZWVlODAyMTFfcGFyc2VfaW5mb19wYXJhbShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKmluZm9fZWxlbWVudCwKKwkJdTE2IGxlbmd0aCwKKwkJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrLAorCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cykKK3sKKwl1OCBpOworCXNob3J0IG9mZnNldDsKKyAgICAgICAgdTE2CXRtcF9odGNhcF9sZW49MDsKKwl1MTYJdG1wX2h0aW5mb19sZW49MDsKKwl1MTYgaHRfcmVhbHRla19hZ2dfbGVuPTA7CisJdTggIGh0X3JlYWx0ZWtfYWdnX2J1ZltNQVhfSUVfTEVOXTsKKy8vCXUxNiBicm9hZGNvbV9sZW4gPSAwOworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwljaGFyIHJhdGVzX3N0cls2NF07CisJY2hhciAqcDsKKyNlbmRpZgorCisJd2hpbGUgKGxlbmd0aCA+PSBzaXplb2YoKmluZm9fZWxlbWVudCkpIHsKKwkJaWYgKHNpemVvZigqaW5mb19lbGVtZW50KSArIGluZm9fZWxlbWVudC0+bGVuID4gbGVuZ3RoKSB7CisJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiSW5mbyBlbGVtOiBwYXJzZSBmYWlsZWQ6ICIKKwkJCQkJICAgICAiaW5mb19lbGVtZW50LT5sZW4gKyAyID4gbGVmdCA6ICIKKwkJCQkJICAgICAiaW5mb19lbGVtZW50LT5sZW4rMj0lemQgbGVmdD0lZCwgaWQ9JWQuXG4iLAorCQkJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuICsKKwkJCQkJICAgICBzaXplb2YoKmluZm9fZWxlbWVudCksCisJCQkJCSAgICAgbGVuZ3RoLCBpbmZvX2VsZW1lbnQtPmlkKTsKKwkJCS8qIFdlIHN0b3AgcHJvY2Vzc2luZyBidXQgZG9uJ3QgcmV0dXJuIGFuIGVycm9yIGhlcmUKKwkJCSAqIGJlY2F1c2Ugc29tZSBtaXNiZWhhdmlvdXIgQVBzIGJyZWFrIHRoaXMgcnVsZS4gaWUuCisJCQkgKiBPcmlub2NvIEFQMTAwMC4gKi8KKwkJCWJyZWFrOworCQl9CisKKwkJc3dpdGNoIChpbmZvX2VsZW1lbnQtPmlkKSB7CisJCWNhc2UgTUZJRV9UWVBFX1NTSUQ6CisJCQlpZiAoaWVlZTgwMjExX2lzX2VtcHR5X2Vzc2lkKGluZm9fZWxlbWVudC0+ZGF0YSwKKwkJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4pKSB7CisJCQkJbmV0d29yay0+ZmxhZ3MgfD0gTkVUV09SS19FTVBUWV9FU1NJRDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJbmV0d29yay0+c3NpZF9sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4sCisJCQkJCQkodTgpIElXX0VTU0lEX01BWF9TSVpFKTsKKwkJCW1lbWNweShuZXR3b3JrLT5zc2lkLCBpbmZvX2VsZW1lbnQtPmRhdGEsIG5ldHdvcmstPnNzaWRfbGVuKTsKKwkJCWlmIChuZXR3b3JrLT5zc2lkX2xlbiA8IElXX0VTU0lEX01BWF9TSVpFKQorCQkJCW1lbXNldChuZXR3b3JrLT5zc2lkICsgbmV0d29yay0+c3NpZF9sZW4sIDAsCisJCQkJICAgICAgIElXX0VTU0lEX01BWF9TSVpFIC0gbmV0d29yay0+c3NpZF9sZW4pOworCisJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiTUZJRV9UWVBFX1NTSUQ6ICclcycgbGVuPSVkLlxuIiwKKwkJCQkJICAgICBuZXR3b3JrLT5zc2lkLCBuZXR3b3JrLT5zc2lkX2xlbik7CisJCQlicmVhazsKKworCQljYXNlIE1GSUVfVFlQRV9SQVRFUzoKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisJCQlwID0gcmF0ZXNfc3RyOworI2VuZGlmCisJCQluZXR3b3JrLT5yYXRlc19sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4sCisJCQkJCQkgTUFYX1JBVEVTX0xFTkdUSCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgbmV0d29yay0+cmF0ZXNfbGVuOyBpKyspIHsKKwkJCQluZXR3b3JrLT5yYXRlc1tpXSA9IGluZm9fZWxlbWVudC0+ZGF0YVtpXTsKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisJCQkJcCArPSBzbnByaW50ZihwLCBzaXplb2YocmF0ZXNfc3RyKSAtCisJCQkJCSAgICAgIChwIC0gcmF0ZXNfc3RyKSwgIiUwMlggIiwKKwkJCQkJICAgICAgbmV0d29yay0+cmF0ZXNbaV0pOworI2VuZGlmCisJCQkJaWYgKGllZWU4MDIxMV9pc19vZmRtX3JhdGUKKwkJCQkgICAgKGluZm9fZWxlbWVudC0+ZGF0YVtpXSkpIHsKKwkJCQkJbmV0d29yay0+ZmxhZ3MgfD0gTkVUV09SS19IQVNfT0ZETTsKKwkJCQkJaWYgKGluZm9fZWxlbWVudC0+ZGF0YVtpXSAmCisJCQkJCSAgICBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLKQorCQkJCQkJbmV0d29yay0+ZmxhZ3MgJj0KKwkJCQkJCSAgICB+TkVUV09SS19IQVNfQ0NLOworCQkJCX0KKwkJCX0KKworCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIk1GSUVfVFlQRV9SQVRFUzogJyVzJyAoJWQpXG4iLAorCQkJCQkgICAgIHJhdGVzX3N0ciwgbmV0d29yay0+cmF0ZXNfbGVuKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUZJRV9UWVBFX1JBVEVTX0VYOgorI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwkJCXAgPSByYXRlc19zdHI7CisjZW5kaWYKKwkJCW5ldHdvcmstPnJhdGVzX2V4X2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbiwKKwkJCQkJCSAgICBNQVhfUkFURVNfRVhfTEVOR1RIKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBuZXR3b3JrLT5yYXRlc19leF9sZW47IGkrKykgeworCQkJCW5ldHdvcmstPnJhdGVzX2V4W2ldID0gaW5mb19lbGVtZW50LT5kYXRhW2ldOworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwkJCQlwICs9IHNucHJpbnRmKHAsIHNpemVvZihyYXRlc19zdHIpIC0KKwkJCQkJICAgICAgKHAgLSByYXRlc19zdHIpLCAiJTAyWCAiLAorCQkJCQkgICAgICBuZXR3b3JrLT5yYXRlc1tpXSk7CisjZW5kaWYKKwkJCQlpZiAoaWVlZTgwMjExX2lzX29mZG1fcmF0ZQorCQkJCSAgICAoaW5mb19lbGVtZW50LT5kYXRhW2ldKSkgeworCQkJCQluZXR3b3JrLT5mbGFncyB8PSBORVRXT1JLX0hBU19PRkRNOworCQkJCQlpZiAoaW5mb19lbGVtZW50LT5kYXRhW2ldICYKKwkJCQkJICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0spCisJCQkJCQluZXR3b3JrLT5mbGFncyAmPQorCQkJCQkJICAgIH5ORVRXT1JLX0hBU19DQ0s7CisJCQkJfQorCQkJfQorCisJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiTUZJRV9UWVBFX1JBVEVTX0VYOiAnJXMnICglZClcbiIsCisJCQkJCSAgICAgcmF0ZXNfc3RyLCBuZXR3b3JrLT5yYXRlc19leF9sZW4pOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfRFNfU0VUOgorCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIk1GSUVfVFlQRV9EU19TRVQ6ICVkXG4iLAorCQkJCQkgICAgIGluZm9fZWxlbWVudC0+ZGF0YVswXSk7CisJCQluZXR3b3JrLT5jaGFubmVsID0gaW5mb19lbGVtZW50LT5kYXRhWzBdOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfRkhfU0VUOgorCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIk1GSUVfVFlQRV9GSF9TRVQ6IGlnbm9yZWRcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfQ0ZfU0VUOgorCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIk1GSUVfVFlQRV9DRl9TRVQ6IGlnbm9yZWRcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfVElNOgorCQkJaWYoaW5mb19lbGVtZW50LT5sZW4gPCA0KQorCQkJCWJyZWFrOworCisJCQluZXR3b3JrLT50aW0udGltX2NvdW50ID0gaW5mb19lbGVtZW50LT5kYXRhWzBdOworCQkJbmV0d29yay0+dGltLnRpbV9wZXJpb2QgPSBpbmZvX2VsZW1lbnQtPmRhdGFbMV07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmstPmR0aW1fcGVyaW9kID0gaW5mb19lbGVtZW50LT5kYXRhWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmstPmxhc3RfZHRpbV9zdGFfdGltZVswXSA9IHN0YXRzLT5tYWNfdGltZVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmstPmxhc3RfZHRpbV9zdGFfdGltZVsxXSA9IHN0YXRzLT5tYWNfdGltZVsxXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yay0+ZHRpbV9kYXRhID0gSUVFRTgwMjExX0RUSU1fVkFMSUQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGluZm9fZWxlbWVudC0+ZGF0YVswXSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoaW5mb19lbGVtZW50LT5kYXRhWzJdICYgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yay0+ZHRpbV9kYXRhIHw9IElFRUU4MDIxMV9EVElNX01CQ0FTVDsKKworICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKGluZm9fZWxlbWVudC0+ZGF0YVsyXSA+PiAxKSoyOworCisgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50aygib2Zmc2V0MToleCBhaWQ6JXhcbiIsb2Zmc2V0LCBpZWVlLT5hc3NvY19pZCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGllZWUtPmFzc29jX2lkIDwgOCpvZmZzZXQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVlZS0+YXNzb2NfaWQgPiA4KihvZmZzZXQgKyBpbmZvX2VsZW1lbnQtPmxlbiAtMykpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IChpZWVlLT5hc3NvY19pZCAvIDgpIC0gb2Zmc2V0Oy8vICsgKChhaWQgJSA4KT8gMCA6IDEpIDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoaW5mb19lbGVtZW50LT5kYXRhWzMrb2Zmc2V0XSAmICgxPDwoaWVlZS0+YXNzb2NfaWQlOCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrLT5kdGltX2RhdGEgfD0gSUVFRTgwMjExX0RUSU1fVUNBU1Q7CisKKwkJCS8vSUVFRTgwMjExX0RFQlVHX01HTVQoIk1GSUVfVFlQRV9USU06IHBhcnRpYWxseSBpZ25vcmVkXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUZJRV9UWVBFX0VSUDoKKwkJCW5ldHdvcmstPmVycF92YWx1ZSA9IGluZm9fZWxlbWVudC0+ZGF0YVswXTsKKwkJCW5ldHdvcmstPmZsYWdzIHw9IE5FVFdPUktfSEFTX0VSUF9WQUxVRTsKKwkJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJNRklFX1RZUEVfRVJQX1NFVDogJWRcbiIsCisJCQkJCSAgICAgbmV0d29yay0+ZXJwX3ZhbHVlKTsKKwkJCWJyZWFrOworCQljYXNlIE1GSUVfVFlQRV9JQlNTX1NFVDoKKwkJCW5ldHdvcmstPmF0aW1fd2luZG93ID0gaW5mb19lbGVtZW50LT5kYXRhWzBdOworCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIk1GSUVfVFlQRV9JQlNTX1NFVDogJWRcbiIsCisJCQkJCSAgICAgbmV0d29yay0+YXRpbV93aW5kb3cpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfQ0hBTExFTkdFOgorCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIk1GSUVfVFlQRV9DSEFMTEVOR0U6IGlnbm9yZWRcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfR0VORVJJQzoKKwkJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJNRklFX1RZUEVfR0VORVJJQzogJWQgYnl0ZXNcbiIsCisJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4pOworCQkJaWYgKCFpZWVlODAyMTFfcGFyc2VfcW9zX2luZm9fcGFyYW1fSUUoaW5mb19lbGVtZW50LAorCQkJCQkJCSAgICAgICBuZXR3b3JrKSkKKwkJCQlicmVhazsKKworCQkJaWYgKGluZm9fZWxlbWVudC0+bGVuID49IDQgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDUwICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4ZjIgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbM10gPT0gMHgwMSkgeworCQkJCW5ldHdvcmstPndwYV9pZV9sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4gKyAyLAorCQkJCQkJCSAgTUFYX1dQQV9JRV9MRU4pOworCQkJCW1lbWNweShuZXR3b3JrLT53cGFfaWUsIGluZm9fZWxlbWVudCwKKwkJCQkgICAgICAgbmV0d29yay0+d3BhX2llX2xlbik7CisJCQkJYnJlYWs7CisJCQl9CisKKyNpZmRlZiBUSE9NQVNfVFVSQk8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvX2VsZW1lbnQtPmxlbiA9PSA3ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHhlMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweDRjICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19lbGVtZW50LT5kYXRhWzNdID09IDB4MDEgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX2VsZW1lbnQtPmRhdGFbNF0gPT0gMHgwMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrLT5UdXJib19FbmFibGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vZm9yIEhUY2FwIGFuZCBIVGluZm8gcGFyYW1ldGVycworCQkJaWYodG1wX2h0Y2FwX2xlbiA9PSAwKXsKKwkJCQlpZihpbmZvX2VsZW1lbnQtPmxlbiA+PSA0ICYmCisJCQkJICAgaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKKwkJCQkgICBpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHg5MCAmJgorCQkJCSAgIGluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweDRjICYmCisJCQkJICAgaW5mb19lbGVtZW50LT5kYXRhWzNdID09IDB4MDMzKXsKKworCQkJCQkJdG1wX2h0Y2FwX2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbiwodTgpTUFYX0lFX0xFTik7CisJCQkJICAgCQlpZih0bXBfaHRjYXBfbGVuICE9IDApeworCQkJCSAgIAkJCW5ldHdvcmstPmJzc2h0LmJkSFRTcGVjVmVyID0gSFRfU1BFQ19WRVJfRVdDOworCQkJCQkJCW5ldHdvcmstPmJzc2h0LmJkSFRDYXBMZW4gPSB0bXBfaHRjYXBfbGVuID4gc2l6ZW9mKG5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWYpP1wKKwkJCQkJCQkJc2l6ZW9mKG5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWYpOnRtcF9odGNhcF9sZW47CisJCQkJCQkJbWVtY3B5KG5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWYsaW5mb19lbGVtZW50LT5kYXRhLG5ldHdvcmstPmJzc2h0LmJkSFRDYXBMZW4pOworCQkJCSAgIAkJfQorCQkJCX0KKwkJCQlpZih0bXBfaHRjYXBfbGVuICE9IDApCisJCQkJCW5ldHdvcmstPmJzc2h0LmJkU3VwcG9ydEhUID0gdHJ1ZTsKKwkJCQllbHNlCisJCQkJCW5ldHdvcmstPmJzc2h0LmJkU3VwcG9ydEhUID0gZmFsc2U7CisJCQl9CisKKworCQkJaWYodG1wX2h0aW5mb19sZW4gPT0gMCl7CisJCQkJaWYoaW5mb19lbGVtZW50LT5sZW4gPj0gNCAmJgorCQkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJCSAgIAlpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHg5MCAmJgorCQkJCSAgIAlpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHg0YyAmJgorCQkJCSAgIAlpbmZvX2VsZW1lbnQtPmRhdGFbM10gPT0gMHgwMzQpeworCisJCQkJCQl0bXBfaHRpbmZvX2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbiwodTgpTUFYX0lFX0xFTik7CisJCQkJCQlpZih0bXBfaHRpbmZvX2xlbiAhPSAwKXsKKwkJCQkJCQluZXR3b3JrLT5ic3NodC5iZEhUU3BlY1ZlciA9IEhUX1NQRUNfVkVSX0VXQzsKKwkJCQkJCQlpZih0bXBfaHRpbmZvX2xlbil7CisJCQkJCQkJCW5ldHdvcmstPmJzc2h0LmJkSFRJbmZvTGVuID0gdG1wX2h0aW5mb19sZW4gPiBzaXplb2YobmV0d29yay0+YnNzaHQuYmRIVEluZm9CdWYpP1wKKwkJCQkJCQkJCXNpemVvZihuZXR3b3JrLT5ic3NodC5iZEhUSW5mb0J1Zik6dG1wX2h0aW5mb19sZW47CisJCQkJCQkJCW1lbWNweShuZXR3b3JrLT5ic3NodC5iZEhUSW5mb0J1ZixpbmZvX2VsZW1lbnQtPmRhdGEsbmV0d29yay0+YnNzaHQuYmRIVEluZm9MZW4pOworCQkJCQkJCX0KKworCQkJCQkJfQorCisJCQkJfQorCQkJfQorCisJCQlpZihpZWVlLT5hZ2dyZWdhdGlvbil7CisJCQkJaWYobmV0d29yay0+YnNzaHQuYmRTdXBwb3J0SFQpeworCQkJCQlpZihpbmZvX2VsZW1lbnQtPmxlbiA+PSA0ICYmCisJCQkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJCQkJaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4ZTAgJiYKKwkJCQkJCWluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweDRjICYmCisJCQkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbM10gPT0gMHgwMil7CisKKwkJCQkJCWh0X3JlYWx0ZWtfYWdnX2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbiwodTgpTUFYX0lFX0xFTik7CisJCQkJCQltZW1jcHkoaHRfcmVhbHRla19hZ2dfYnVmLGluZm9fZWxlbWVudC0+ZGF0YSxpbmZvX2VsZW1lbnQtPmxlbik7CisKKwkJCQkJfQorCQkJCQlpZihodF9yZWFsdGVrX2FnZ19sZW4gPj0gNSl7CisJCQkJCQluZXR3b3JrLT5ic3NodC5iZFJUMlJUQWdncmVnYXRpb24gPSB0cnVlOworCisJCQkJCQlpZigoaHRfcmVhbHRla19hZ2dfYnVmWzRdID09IDEpICYmIChodF9yZWFsdGVrX2FnZ19idWZbNV0gJiAweDAyKSkKKwkJCQkJCW5ldHdvcmstPmJzc2h0LmJkUlQyUlRMb25nU2xvdFRpbWUgPSB0cnVlOworCQkJCQl9CisJCQkJfQorCisJCQl9CisKKwkJCS8vaWYodG1wX2h0Y2FwX2xlbiAhPTAgIHx8ICB0bXBfaHRpbmZvX2xlbiAhPSAwKQorCQkJeworCQkJCWlmKChpbmZvX2VsZW1lbnQtPmxlbiA+PSAzICYmCisJCQkJCSBpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJCQkgaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4MDUgJiYKKwkJCQkJIGluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweGI1KSB8fAorCQkJCQkgKGluZm9fZWxlbWVudC0+bGVuID49IDMgJiYKKwkJCQkJIGluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCisJCQkJCSBpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHgwYSAmJgorCQkJCQkgaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4ZjcpIHx8CisJCQkJCSAoaW5mb19lbGVtZW50LT5sZW4gPj0gMyAmJgorCQkJCQkgaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKKwkJCQkJIGluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDEwICYmCisJCQkJCSBpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHgxOCkpeworCisJCQkJCQluZXR3b3JrLT5icm9hZGNvbV9jYXBfZXhpc3QgPSB0cnVlOworCisJCQkJfQorCQkJfQorCQkJaWYoaW5mb19lbGVtZW50LT5sZW4gPj0gMyAmJgorCQkJCWluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCisJCQkJaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4MGMgJiYKKwkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHg0MykKKwkJCXsKKwkJCQluZXR3b3JrLT5yYWxpbmtfY2FwX2V4aXN0ID0gdHJ1ZTsKKwkJCX0KKwkJCWVsc2UKKwkJCQluZXR3b3JrLT5yYWxpbmtfY2FwX2V4aXN0ID0gZmFsc2U7CisJCQkvL2FkZGVkIGJ5IGFteSBmb3IgYXRoZXJvcyBBUAorCQkJaWYoKGluZm9fZWxlbWVudC0+bGVuID49IDMgJiYKKwkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJCWluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDAzICYmCisJCQkJaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4N2YpIHx8CisJCQkJKGluZm9fZWxlbWVudC0+bGVuID49IDMgJiYKKwkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJCWluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDEzICYmCisJCQkJaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4NzQpKQorCQkJeworCQkJCXByaW50aygiPT09PT09PT0+JXMoKTogYXRocm9zIEFQIGlzIGV4aXN0XG4iLF9fRlVOQ1RJT05fXyk7CisJCQkJbmV0d29yay0+YXRoZXJvc19jYXBfZXhpc3QgPSB0cnVlOworCQkJfQorCQkJZWxzZQorCQkJCW5ldHdvcmstPmF0aGVyb3NfY2FwX2V4aXN0ID0gZmFsc2U7CisKKwkJCWlmKGluZm9fZWxlbWVudC0+bGVuID49IDMgJiYKKwkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJCWluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDQwICYmCisJCQkJaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4OTYpCisJCQl7CisJCQkJbmV0d29yay0+Y2lzY29fY2FwX2V4aXN0ID0gdHJ1ZTsKKwkJCX0KKwkJCWVsc2UKKwkJCQluZXR3b3JrLT5jaXNjb19jYXBfZXhpc3QgPSBmYWxzZTsKKwkJCS8vYWRkZWQgYnkgYW15IGZvciBMRUFQIG9mIGNpc2NvCisJCQlpZihpbmZvX2VsZW1lbnQtPmxlbiA+IDQgJiYKKwkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJCWluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDQwICYmCisJCQkJaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4OTYgJiYKKwkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbM10gPT0gMHgwMSkKKwkJCXsKKwkJCQlpZihpbmZvX2VsZW1lbnQtPmxlbiA9PSA2KQorCQkJCXsKKwkJCQkJbWVtY3B5KG5ldHdvcmstPkNjeFJtU3RhdGUsICZpbmZvX2VsZW1lbnRbNF0sIDIpOworCQkJCQlpZihuZXR3b3JrLT5DY3hSbVN0YXRlWzBdICE9IDApCisJCQkJCXsKKwkJCQkJCW5ldHdvcmstPmJDY3hSbUVuYWJsZSA9IHRydWU7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQkJbmV0d29yay0+YkNjeFJtRW5hYmxlID0gZmFsc2U7CisJCQkJCS8vCisJCQkJCS8vIENDWHY0IFRhYmxlIDU5LTEgTUJTU0lEIE1hc2tzLgorCQkJCQkvLworCQkJCQluZXR3b3JrLT5NQnNzaWRNYXNrID0gbmV0d29yay0+Q2N4Um1TdGF0ZVsxXSAmIDB4MDc7CisJCQkJCWlmKG5ldHdvcmstPk1Cc3NpZE1hc2sgIT0gMCkKKwkJCQkJeworCQkJCQkJbmV0d29yay0+Yk1Cc3NpZFZhbGlkID0gdHJ1ZTsKKwkJCQkJCW5ldHdvcmstPk1Cc3NpZE1hc2sgPSAweGZmIDw8IChuZXR3b3JrLT5NQnNzaWRNYXNrKTsKKwkJCQkJCWNwTWFjQWRkcihuZXR3b3JrLT5NQnNzaWQsIG5ldHdvcmstPmJzc2lkKTsKKwkJCQkJCW5ldHdvcmstPk1Cc3NpZFs1XSAmPSBuZXR3b3JrLT5NQnNzaWRNYXNrOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJbmV0d29yay0+Yk1Cc3NpZFZhbGlkID0gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbmV0d29yay0+YkNjeFJtRW5hYmxlID0gZmFsc2U7CisJCQkJfQorCQkJfQorCQkJaWYoaW5mb19lbGVtZW50LT5sZW4gPiA0ICAmJgorCQkJCWluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCisJCQkJaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4NDAgJiYKKwkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHg5NiAmJgorCQkJCWluZm9fZWxlbWVudC0+ZGF0YVszXSA9PSAweDAzKQorCQkJeworCQkJCWlmKGluZm9fZWxlbWVudC0+bGVuID09IDUpCisJCQkJeworCQkJCQluZXR3b3JrLT5iV2l0aENjeFZlck51bSA9IHRydWU7CisJCQkJCW5ldHdvcmstPkJzc0NjeFZlck51bWJlciA9IGluZm9fZWxlbWVudC0+ZGF0YVs0XTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbmV0d29yay0+YldpdGhDY3hWZXJOdW0gPSBmYWxzZTsKKwkJCQkJbmV0d29yay0+QnNzQ2N4VmVyTnVtYmVyID0gMDsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE1GSUVfVFlQRV9SU046CisJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiTUZJRV9UWVBFX1JTTjogJWQgYnl0ZXNcbiIsCisJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4pOworCQkJbmV0d29yay0+cnNuX2llX2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbiArIDIsCisJCQkJCQkgIE1BWF9XUEFfSUVfTEVOKTsKKwkJCW1lbWNweShuZXR3b3JrLT5yc25faWUsIGluZm9fZWxlbWVudCwKKwkJCSAgICAgICBuZXR3b3JrLT5yc25faWVfbGVuKTsKKwkJCWJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAvL0hUIHJlbGF0ZWQgZWxlbWVudC4KKwkJY2FzZSBNRklFX1RZUEVfSFRfQ0FQOgorCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9IVF9DQVA6ICVkIGJ5dGVzXG4iLAorCQkJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuKTsKKwkJCXRtcF9odGNhcF9sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4sKHU4KU1BWF9JRV9MRU4pOworCQkJaWYodG1wX2h0Y2FwX2xlbiAhPSAwKXsKKwkJCQluZXR3b3JrLT5ic3NodC5iZEhUU3BlY1ZlciA9IEhUX1NQRUNfVkVSX0VXQzsKKwkJCQluZXR3b3JrLT5ic3NodC5iZEhUQ2FwTGVuID0gdG1wX2h0Y2FwX2xlbiA+IHNpemVvZihuZXR3b3JrLT5ic3NodC5iZEhUQ2FwQnVmKT9cCisJCQkJCXNpemVvZihuZXR3b3JrLT5ic3NodC5iZEhUQ2FwQnVmKTp0bXBfaHRjYXBfbGVuOworCQkJCW1lbWNweShuZXR3b3JrLT5ic3NodC5iZEhUQ2FwQnVmLGluZm9fZWxlbWVudC0+ZGF0YSxuZXR3b3JrLT5ic3NodC5iZEhUQ2FwTGVuKTsKKworCQkJCS8vSWYgcGVlciBpcyBIVCwgYnV0IG5vdCBXTU0sIGNhbGwgUW9zU2V0TGVnYWN5V01NUGFyYW1XaXRoSFQoKQorCQkJCS8vIHdpbmRvd3MgZHJpdmVyIHdpbGwgdXBkYXRlIFdNTSBwYXJhbWV0ZXJzIGVhY2ggYmVhY29uIHJlY2VpdmVkIG9uY2UgY29ubmVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExpbnV4IGRyaXZlciBpcyBhIGJpdCBkaWZmZXJlbnQuCisJCQkJbmV0d29yay0+YnNzaHQuYmRTdXBwb3J0SFQgPSB0cnVlOworCQkJfQorCQkJZWxzZQorCQkJCW5ldHdvcmstPmJzc2h0LmJkU3VwcG9ydEhUID0gZmFsc2U7CisJCQlicmVhazsKKworCisJCWNhc2UgTUZJRV9UWVBFX0hUX0lORk86CisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX0hUX0lORk86ICVkIGJ5dGVzXG4iLAorCQkJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuKTsKKwkJCXRtcF9odGluZm9fbGVuID0gbWluKGluZm9fZWxlbWVudC0+bGVuLCh1OClNQVhfSUVfTEVOKTsKKwkJCWlmKHRtcF9odGluZm9fbGVuKXsKKwkJCQluZXR3b3JrLT5ic3NodC5iZEhUU3BlY1ZlciA9IEhUX1NQRUNfVkVSX0lFRUU7CisJCQkJbmV0d29yay0+YnNzaHQuYmRIVEluZm9MZW4gPSB0bXBfaHRpbmZvX2xlbiA+IHNpemVvZihuZXR3b3JrLT5ic3NodC5iZEhUSW5mb0J1Zik/XAorCQkJCQlzaXplb2YobmV0d29yay0+YnNzaHQuYmRIVEluZm9CdWYpOnRtcF9odGluZm9fbGVuOworCQkJCW1lbWNweShuZXR3b3JrLT5ic3NodC5iZEhUSW5mb0J1ZixpbmZvX2VsZW1lbnQtPmRhdGEsbmV0d29yay0+YnNzaHQuYmRIVEluZm9MZW4pOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfQUlST05FVDoKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfQUlST05FVDogJWQgYnl0ZXNcbiIsCisJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4pOworCQkJaWYoaW5mb19lbGVtZW50LT5sZW4gPklFX0NJU0NPX0ZMQUdfUE9TSVRJT04pCisJCQl7CisJCQkJbmV0d29yay0+YldpdGhBaXJvbmV0SUUgPSB0cnVlOworCisJCQkJLy8gQ0NYIDEgc3BlYyB2MS4xMywgQTAxLjEgQ0tJUCBOZWdvdGlhdGlvbiAocGFnZTIzKToKKwkJCQkvLyAiQSBDaXNjbyBhY2Nlc3MgcG9pbnQgYWR2ZXJ0aXNlcyBzdXBwb3J0IGZvciBDS0lQIGluIGJlYWNvbiBhbmQgcHJvYmUgcmVzcG9uc2UgcGFja2V0cywKKwkJCQkvLyAgYnkgYWRkaW5nIGFuIEFpcm9uZXQgZWxlbWVudCBhbmQgc2V0dGluZyBvbmUgb3IgYm90aCBvZiB0aGUgQ0tJUCBuZWdvdGlhdGlvbiBiaXRzLiIKKwkJCQlpZigJKGluZm9fZWxlbWVudC0+ZGF0YVtJRV9DSVNDT19GTEFHX1BPU0lUSU9OXSZTVVBQT1JUX0NLSVBfTUlDKQl8fAorCQkJCQkoaW5mb19lbGVtZW50LT5kYXRhW0lFX0NJU0NPX0ZMQUdfUE9TSVRJT05dJlNVUFBPUlRfQ0tJUF9QSykJKQorCQkJCXsKKwkJIAkJCW5ldHdvcmstPmJDa2lwU3VwcG9ydGVkID0gdHJ1ZTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbmV0d29yay0+YkNraXBTdXBwb3J0ZWQgPSBmYWxzZTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbmV0d29yay0+YldpdGhBaXJvbmV0SUUgPSBmYWxzZTsKKwkJIAkJbmV0d29yay0+YkNraXBTdXBwb3J0ZWQgPSBmYWxzZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE1GSUVfVFlQRV9RT1NfUEFSQU1FVEVSOgorCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIlFvUyBFcnJvciBuZWVkIHRvIHBhcnNlIFFPU19QQVJBTUVURVIgSUVcbiIpOworCQkJYnJlYWs7CisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJCWNhc2UgTUZJRV9UWVBFX0NPVU5UUlk6CisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX0NPVU5UUlk6ICVkIGJ5dGVzXG4iLAorCQkJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuKTsKKwkJCS8vcHJpbnRrKCI9PT09PT5SZWNlaXZlIDwlcz4gQ291bnRyeSBJRVxuIixuZXR3b3JrLT5zc2lkKTsKKwkJCWllZWU4MDIxMV9leHRyYWN0X2NvdW50cnlfaWUoaWVlZSwgaW5mb19lbGVtZW50LCBuZXR3b3JrLCBuZXR3b3JrLT5ic3NpZCk7Ly9hZGRyMiBpcyBzYW1lIGFzIGFkZHIzIHdoZW4gZnJvbSBhbiBBUAorCQkJYnJlYWs7CisjZW5kaWYKKy8qIFRPRE8gKi8KKwkJZGVmYXVsdDoKKwkJCUlFRUU4MDIxMV9ERUJVR19NR01UCisJCQkgICAgKCJVbnN1cHBvcnRlZCBpbmZvIGVsZW1lbnQ6ICVzICglZClcbiIsCisJCQkgICAgIGdldF9pbmZvX2VsZW1lbnRfc3RyaW5nKGluZm9fZWxlbWVudC0+aWQpLAorCQkJICAgICBpbmZvX2VsZW1lbnQtPmlkKTsKKwkJCWJyZWFrOworCQl9CisKKwkJbGVuZ3RoIC09IHNpemVvZigqaW5mb19lbGVtZW50KSArIGluZm9fZWxlbWVudC0+bGVuOworCQlpbmZvX2VsZW1lbnQgPQorCQkgICAgKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICopJmluZm9fZWxlbWVudC0+CisJCSAgICBkYXRhW2luZm9fZWxlbWVudC0+bGVuXTsKKwl9CisKKwlpZighbmV0d29yay0+YXRoZXJvc19jYXBfZXhpc3QgJiYgIW5ldHdvcmstPmJyb2FkY29tX2NhcF9leGlzdCAmJgorCQkhbmV0d29yay0+Y2lzY29fY2FwX2V4aXN0ICYmICFuZXR3b3JrLT5yYWxpbmtfY2FwX2V4aXN0ICYmICFuZXR3b3JrLT5ic3NodC5iZFJUMlJUQWdncmVnYXRpb24pCisJeworCQluZXR3b3JrLT51bmtub3duX2NhcF9leGlzdCA9IHRydWU7CisJfQorCWVsc2UKKwl7CisJCW5ldHdvcmstPnVua25vd25fY2FwX2V4aXN0ID0gZmFsc2U7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHU4IGllZWU4MDIxMV9TaWduYWxTdHJlbmd0aFRyYW5zbGF0ZSgKKwl1OCAgQ3VyclNTCisJKQoreworCXU4IFJldFNTOworCisJLy8gU3RlcCAxLiBTY2FsZSBtYXBwaW5nLgorCWlmKEN1cnJTUyA+PSA3MSAmJiBDdXJyU1MgPD0gMTAwKQorCXsKKwkJUmV0U1MgPSA5MCArICgoQ3VyclNTIC0gNzApIC8gMyk7CisJfQorCWVsc2UgaWYoQ3VyclNTID49IDQxICYmIEN1cnJTUyA8PSA3MCkKKwl7CisJCVJldFNTID0gNzggKyAoKEN1cnJTUyAtIDQwKSAvIDMpOworCX0KKwllbHNlIGlmKEN1cnJTUyA+PSAzMSAmJiBDdXJyU1MgPD0gNDApCisJeworCQlSZXRTUyA9IDY2ICsgKEN1cnJTUyAtIDMwKTsKKwl9CisJZWxzZSBpZihDdXJyU1MgPj0gMjEgJiYgQ3VyclNTIDw9IDMwKQorCXsKKwkJUmV0U1MgPSA1NCArIChDdXJyU1MgLSAyMCk7CisJfQorCWVsc2UgaWYoQ3VyclNTID49IDUgJiYgQ3VyclNTIDw9IDIwKQorCXsKKwkJUmV0U1MgPSA0MiArICgoKEN1cnJTUyAtIDUpICogMikgLyAzKTsKKwl9CisJZWxzZSBpZihDdXJyU1MgPT0gNCkKKwl7CisJCVJldFNTID0gMzY7CisJfQorCWVsc2UgaWYoQ3VyclNTID09IDMpCisJeworCQlSZXRTUyA9IDI3OworCX0KKwllbHNlIGlmKEN1cnJTUyA9PSAyKQorCXsKKwkJUmV0U1MgPSAxODsKKwl9CisJZWxzZSBpZihDdXJyU1MgPT0gMSkKKwl7CisJCVJldFNTID0gOTsKKwl9CisJZWxzZQorCXsKKwkJUmV0U1MgPSBDdXJyU1M7CisJfQorCS8vUlRfVFJBQ0UoQ09NUF9EQkcsIERCR19MT1VELCAoIiMjIyMjIEFmdGVyIE1hcHBpbmc6ICBMYXN0U1M6ICVkLCBDdXJyU1M6ICVkLCBSZXRTUzogJWRcbiIsIExhc3RTUywgQ3VyclNTLCBSZXRTUykpOworCisJLy8gU3RlcCAyLiBTbW9vdGhpbmcuCisKKwkvL1JUX1RSQUNFKENPTVBfREJHLCBEQkdfTE9VRCwgKCIkJCQkJCBBZnRlciBTbW9vdGhpbmc6ICBMYXN0U1M6ICVkLCBDdXJyU1M6ICVkLCBSZXRTUzogJWRcbiIsIExhc3RTUywgQ3VyclNTLCBSZXRTUykpOworCisJcmV0dXJuIFJldFNTOworfQorCitsb25nIGllZWU4MDIxMV90cmFuc2xhdGVfdG9kYm0odTggc2lnbmFsX3N0cmVuZ3RoX2luZGV4CSkvLyAwLTEwMCBpbmRleC4KK3sKKwlsb25nCXNpZ25hbF9wb3dlcjsgLy8gaW4gZEJtLgorCisJLy8gVHJhbnNsYXRlIHRvIGRCbSAoeD0wLjV5LTk1KS4KKwlzaWduYWxfcG93ZXIgPSAobG9uZykoKHNpZ25hbF9zdHJlbmd0aF9pbmRleCArIDEpID4+IDEpOworCXNpZ25hbF9wb3dlciAtPSA5NTsKKworCXJldHVybiBzaWduYWxfcG93ZXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGllZWU4MDIxMV9uZXR3b3JrX2luaXQoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqYmVhY29uLAorCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yaywKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cykKK3sKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisJLy9jaGFyIHJhdGVzX3N0cls2NF07CisJLy9jaGFyICpwOworI2VuZGlmCisKKyAgICAgICAgbmV0d29yay0+cW9zX2RhdGEuYWN0aXZlID0gMDsKKyAgICAgICAgbmV0d29yay0+cW9zX2RhdGEuc3VwcG9ydGVkID0gMDsKKyAgICAgICAgbmV0d29yay0+cW9zX2RhdGEucGFyYW1fY291bnQgPSAwOworICAgICAgICBuZXR3b3JrLT5xb3NfZGF0YS5vbGRfcGFyYW1fY291bnQgPSAwOworCisJLyogUHVsbCBvdXQgZml4ZWQgZmllbGQgZGF0YSAqLworCW1lbWNweShuZXR3b3JrLT5ic3NpZCwgYmVhY29uLT5oZWFkZXIuYWRkcjMsIEVUSF9BTEVOKTsKKwluZXR3b3JrLT5jYXBhYmlsaXR5ID0gbGUxNl90b19jcHUoYmVhY29uLT5jYXBhYmlsaXR5KTsKKwluZXR3b3JrLT5sYXN0X3NjYW5uZWQgPSBqaWZmaWVzOworCW5ldHdvcmstPnRpbWVfc3RhbXBbMF0gPSBsZTMyX3RvX2NwdShiZWFjb24tPnRpbWVfc3RhbXBbMF0pOworCW5ldHdvcmstPnRpbWVfc3RhbXBbMV0gPSBsZTMyX3RvX2NwdShiZWFjb24tPnRpbWVfc3RhbXBbMV0pOworCW5ldHdvcmstPmJlYWNvbl9pbnRlcnZhbCA9IGxlMzJfdG9fY3B1KGJlYWNvbi0+YmVhY29uX2ludGVydmFsKTsKKwkvKiBXaGVyZSB0byBwdWxsIHRoaXM/IGJlYWNvbi0+bGlzdGVuX2ludGVydmFsOyovCisJbmV0d29yay0+bGlzdGVuX2ludGVydmFsID0gMHgwQTsKKwluZXR3b3JrLT5yYXRlc19sZW4gPSBuZXR3b3JrLT5yYXRlc19leF9sZW4gPSAwOworCW5ldHdvcmstPmxhc3RfYXNzb2NpYXRlID0gMDsKKwluZXR3b3JrLT5zc2lkX2xlbiA9IDA7CisJbmV0d29yay0+ZmxhZ3MgPSAwOworCW5ldHdvcmstPmF0aW1fd2luZG93ID0gMDsKKwluZXR3b3JrLT5lcnBfdmFsdWUgPSAobmV0d29yay0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSA/CisgICAgICAgICAgICAweDMgOiAweDA7CisJbmV0d29yay0+YmVycF9pbmZvX3ZhbGlkID0gZmFsc2U7CisgICAgICAgIG5ldHdvcmstPmJyb2FkY29tX2NhcF9leGlzdCA9IGZhbHNlOworCW5ldHdvcmstPnJhbGlua19jYXBfZXhpc3QgPSBmYWxzZTsKKwluZXR3b3JrLT5hdGhlcm9zX2NhcF9leGlzdCA9IGZhbHNlOworCW5ldHdvcmstPmNpc2NvX2NhcF9leGlzdCA9IGZhbHNlOworCW5ldHdvcmstPnVua25vd25fY2FwX2V4aXN0ID0gZmFsc2U7CisjaWZkZWYgVEhPTUFTX1RVUkJPCisJbmV0d29yay0+VHVyYm9fRW5hYmxlID0gMDsKKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwluZXR3b3JrLT5Db3VudHJ5SWVMZW4gPSAwOworCW1lbXNldChuZXR3b3JrLT5Db3VudHJ5SWVCdWYsIDAsIE1BWF9JRV9MRU4pOworI2VuZGlmCisvL0luaXRpYWxpemUgSFQgcGFyYW1ldGVycworCS8vaWVlZTgwMjExX2h0X2luaXRpYWxpemUoJm5ldHdvcmstPmJzc2h0KTsKKwlIVEluaXRpYWxpemVCc3NEZXNjKCZuZXR3b3JrLT5ic3NodCk7CisJaWYgKHN0YXRzLT5mcmVxID09IElFRUU4MDIxMV81MkdIWl9CQU5EKSB7CisJCS8qIGZvciBBIGJhbmQgKE5vIERTIGluZm8pICovCisJCW5ldHdvcmstPmNoYW5uZWwgPSBzdGF0cy0+cmVjZWl2ZWRfY2hhbm5lbDsKKwl9IGVsc2UKKwkJbmV0d29yay0+ZmxhZ3MgfD0gTkVUV09SS19IQVNfQ0NLOworCisgCW5ldHdvcmstPndwYV9pZV9sZW4gPSAwOworIAluZXR3b3JrLT5yc25faWVfbGVuID0gMDsKKworICAgICAgICBpZiAoaWVlZTgwMjExX3BhcnNlX2luZm9fcGFyYW0KKyAgICAgICAgICAgIChpZWVlLGJlYWNvbi0+aW5mb19lbGVtZW50LCBzdGF0cy0+bGVuIC0gc2l6ZW9mKCpiZWFjb24pLCBuZXR3b3JrLCBzdGF0cykpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisKKwluZXR3b3JrLT5tb2RlID0gMDsKKwlpZiAoc3RhdHMtPmZyZXEgPT0gSUVFRTgwMjExXzUyR0haX0JBTkQpCisJCW5ldHdvcmstPm1vZGUgPSBJRUVFX0E7CisJZWxzZSB7CisJCWlmIChuZXR3b3JrLT5mbGFncyAmIE5FVFdPUktfSEFTX09GRE0pCisJCQluZXR3b3JrLT5tb2RlIHw9IElFRUVfRzsKKwkJaWYgKG5ldHdvcmstPmZsYWdzICYgTkVUV09SS19IQVNfQ0NLKQorCQkJbmV0d29yay0+bW9kZSB8PSBJRUVFX0I7CisJfQorCisJaWYgKG5ldHdvcmstPm1vZGUgPT0gMCkgeworCQlJRUVFODAyMTFfREVCVUdfU0NBTigiRmlsdGVyZWQgb3V0ICclcyAoIiBNQUNfRk1UICIpJyAiCisJCQkJICAgICAibmV0d29yay5cbiIsCisJCQkJICAgICBlc2NhcGVfZXNzaWQobmV0d29yay0+c3NpZCwKKwkJCQkJCSAgbmV0d29yay0+c3NpZF9sZW4pLAorCQkJCSAgICAgTUFDX0FSRyhuZXR3b3JrLT5ic3NpZCkpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZihuZXR3b3JrLT5ic3NodC5iZFN1cHBvcnRIVCl7CisJCWlmKG5ldHdvcmstPm1vZGUgPT0gSUVFRV9BKQorCQkJbmV0d29yay0+bW9kZSA9IElFRUVfTl81RzsKKwkJZWxzZSBpZihuZXR3b3JrLT5tb2RlICYgKElFRUVfRyB8IElFRUVfQikpCisJCQluZXR3b3JrLT5tb2RlID0gSUVFRV9OXzI0RzsKKwl9CisJaWYgKGllZWU4MDIxMV9pc19lbXB0eV9lc3NpZChuZXR3b3JrLT5zc2lkLCBuZXR3b3JrLT5zc2lkX2xlbikpCisJCW5ldHdvcmstPmZsYWdzIHw9IE5FVFdPUktfRU1QVFlfRVNTSUQ7CisKKwlzdGF0cy0+c2lnbmFsID0gMzAgKyAoc3RhdHMtPlNpZ25hbFN0cmVuZ3RoICogNzApIC8gMTAwOworCS8vc3RhdHMtPnNpZ25hbCA9IGllZWU4MDIxMV9TaWduYWxTdHJlbmd0aFRyYW5zbGF0ZShzdGF0cy0+c2lnbmFsKTsKKwlzdGF0cy0+bm9pc2UgPSBpZWVlODAyMTFfdHJhbnNsYXRlX3RvZGJtKCh1OCkoMTAwLXN0YXRzLT5zaWduYWwpKSAtMjU7CisKKwltZW1jcHkoJm5ldHdvcmstPnN0YXRzLCBzdGF0cywgc2l6ZW9mKG5ldHdvcmstPnN0YXRzKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfc2FtZV9uZXR3b3JrKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqc3JjLAorCQkJCSAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpkc3QsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlKQoreworCS8qIEEgbmV0d29yayBpcyBvbmx5IGEgZHVwbGljYXRlIGlmIHRoZSBjaGFubmVsLCBCU1NJRCwgRVNTSUQKKwkgKiBhbmQgdGhlIGNhcGFiaWxpdHkgZmllbGQgKGluIHBhcnRpY3VsYXIgSUJTUyBhbmQgQlNTKSBhbGwgbWF0Y2guCisJICogV2UgdHJlYXQgYWxsIDxoaWRkZW4+IHdpdGggdGhlIHNhbWUgQlNTSUQgYW5kIGNoYW5uZWwKKwkgKiBhcyBvbmUgbmV0d29yayAqLworCXJldHVybiAvLygoc3JjLT5zc2lkX2xlbiA9PSBkc3QtPnNzaWRfbGVuKSAmJgorCQkoKChzcmMtPnNzaWRfbGVuID09IGRzdC0+c3NpZF9sZW4pIHx8IChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpKSAmJgorCQkoc3JjLT5jaGFubmVsID09IGRzdC0+Y2hhbm5lbCkgJiYKKwkJIW1lbWNtcChzcmMtPmJzc2lkLCBkc3QtPmJzc2lkLCBFVEhfQUxFTikgJiYKKwkJLy8hbWVtY21wKHNyYy0+c3NpZCwgZHN0LT5zc2lkLCBzcmMtPnNzaWRfbGVuKSAmJgorCQkoIW1lbWNtcChzcmMtPnNzaWQsIGRzdC0+c3NpZCwgc3JjLT5zc2lkX2xlbikgfHwgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkpICYmCisJCSgoc3JjLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpID09CisJCShkc3QtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUykpICYmCisJCSgoc3JjLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0JTUykgPT0KKwkJKGRzdC0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9CU1MpKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfbmV0d29yayhzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmRzdCwKKwkJCQkgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqc3JjKQoreworCWludCBxb3NfYWN0aXZlOworCXU4IG9sZF9wYXJhbTsKKworCW1lbWNweSgmZHN0LT5zdGF0cywgJnNyYy0+c3RhdHMsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzKSk7CisJZHN0LT5jYXBhYmlsaXR5ID0gc3JjLT5jYXBhYmlsaXR5OworCW1lbWNweShkc3QtPnJhdGVzLCBzcmMtPnJhdGVzLCBzcmMtPnJhdGVzX2xlbik7CisJZHN0LT5yYXRlc19sZW4gPSBzcmMtPnJhdGVzX2xlbjsKKwltZW1jcHkoZHN0LT5yYXRlc19leCwgc3JjLT5yYXRlc19leCwgc3JjLT5yYXRlc19leF9sZW4pOworCWRzdC0+cmF0ZXNfZXhfbGVuID0gc3JjLT5yYXRlc19leF9sZW47CisJaWYoc3JjLT5zc2lkX2xlbiA+IDApCisJeworCQltZW1zZXQoZHN0LT5zc2lkLCAwLCBkc3QtPnNzaWRfbGVuKTsKKwkJZHN0LT5zc2lkX2xlbiA9IHNyYy0+c3NpZF9sZW47CisJCW1lbWNweShkc3QtPnNzaWQsIHNyYy0+c3NpZCwgc3JjLT5zc2lkX2xlbik7CisJfQorCWRzdC0+bW9kZSA9IHNyYy0+bW9kZTsKKwlkc3QtPmZsYWdzID0gc3JjLT5mbGFnczsKKwlkc3QtPnRpbWVfc3RhbXBbMF0gPSBzcmMtPnRpbWVfc3RhbXBbMF07CisJZHN0LT50aW1lX3N0YW1wWzFdID0gc3JjLT50aW1lX3N0YW1wWzFdOworCWlmIChzcmMtPmZsYWdzICYgTkVUV09SS19IQVNfRVJQX1ZBTFVFKQorCXsKKwkJZHN0LT5lcnBfdmFsdWUgPSBzcmMtPmVycF92YWx1ZTsKKwkJZHN0LT5iZXJwX2luZm9fdmFsaWQgPSBzcmMtPmJlcnBfaW5mb192YWxpZCA9IHRydWU7CisJfQorCWRzdC0+YmVhY29uX2ludGVydmFsID0gc3JjLT5iZWFjb25faW50ZXJ2YWw7CisJZHN0LT5saXN0ZW5faW50ZXJ2YWwgPSBzcmMtPmxpc3Rlbl9pbnRlcnZhbDsKKwlkc3QtPmF0aW1fd2luZG93ID0gc3JjLT5hdGltX3dpbmRvdzsKKwlkc3QtPmR0aW1fcGVyaW9kID0gc3JjLT5kdGltX3BlcmlvZDsKKwlkc3QtPmR0aW1fZGF0YSA9IHNyYy0+ZHRpbV9kYXRhOworCWRzdC0+bGFzdF9kdGltX3N0YV90aW1lWzBdID0gc3JjLT5sYXN0X2R0aW1fc3RhX3RpbWVbMF07CisJZHN0LT5sYXN0X2R0aW1fc3RhX3RpbWVbMV0gPSBzcmMtPmxhc3RfZHRpbV9zdGFfdGltZVsxXTsKKwltZW1jcHkoJmRzdC0+dGltLCAmc3JjLT50aW0sIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3RpbV9wYXJhbWV0ZXJzKSk7CisKKyAgICAgICAgZHN0LT5ic3NodC5iZFN1cHBvcnRIVCA9IHNyYy0+YnNzaHQuYmRTdXBwb3J0SFQ7CisJZHN0LT5ic3NodC5iZFJUMlJUQWdncmVnYXRpb24gPSBzcmMtPmJzc2h0LmJkUlQyUlRBZ2dyZWdhdGlvbjsKKwlkc3QtPmJzc2h0LmJkSFRDYXBMZW49IHNyYy0+YnNzaHQuYmRIVENhcExlbjsKKwltZW1jcHkoZHN0LT5ic3NodC5iZEhUQ2FwQnVmLHNyYy0+YnNzaHQuYmRIVENhcEJ1ZixzcmMtPmJzc2h0LmJkSFRDYXBMZW4pOworCWRzdC0+YnNzaHQuYmRIVEluZm9MZW49IHNyYy0+YnNzaHQuYmRIVEluZm9MZW47CisJbWVtY3B5KGRzdC0+YnNzaHQuYmRIVEluZm9CdWYsc3JjLT5ic3NodC5iZEhUSW5mb0J1ZixzcmMtPmJzc2h0LmJkSFRJbmZvTGVuKTsKKwlkc3QtPmJzc2h0LmJkSFRTcGVjVmVyID0gc3JjLT5ic3NodC5iZEhUU3BlY1ZlcjsKKwlkc3QtPmJzc2h0LmJkUlQyUlRMb25nU2xvdFRpbWUgPSBzcmMtPmJzc2h0LmJkUlQyUlRMb25nU2xvdFRpbWU7CisJZHN0LT5icm9hZGNvbV9jYXBfZXhpc3QgPSBzcmMtPmJyb2FkY29tX2NhcF9leGlzdDsKKwlkc3QtPnJhbGlua19jYXBfZXhpc3QgPSBzcmMtPnJhbGlua19jYXBfZXhpc3Q7CisJZHN0LT5hdGhlcm9zX2NhcF9leGlzdCA9IHNyYy0+YXRoZXJvc19jYXBfZXhpc3Q7CisJZHN0LT5jaXNjb19jYXBfZXhpc3QgPSBzcmMtPmNpc2NvX2NhcF9leGlzdDsKKwlkc3QtPnVua25vd25fY2FwX2V4aXN0ID0gc3JjLT51bmtub3duX2NhcF9leGlzdDsKKwltZW1jcHkoZHN0LT53cGFfaWUsIHNyYy0+d3BhX2llLCBzcmMtPndwYV9pZV9sZW4pOworCWRzdC0+d3BhX2llX2xlbiA9IHNyYy0+d3BhX2llX2xlbjsKKwltZW1jcHkoZHN0LT5yc25faWUsIHNyYy0+cnNuX2llLCBzcmMtPnJzbl9pZV9sZW4pOworCWRzdC0+cnNuX2llX2xlbiA9IHNyYy0+cnNuX2llX2xlbjsKKworCWRzdC0+bGFzdF9zY2FubmVkID0gamlmZmllczsKKwkvKiBxb3MgcmVsYXRlZCBwYXJhbWV0ZXJzICovCisJLy9xb3NfYWN0aXZlID0gc3JjLT5xb3NfZGF0YS5hY3RpdmU7CisJcW9zX2FjdGl2ZSA9IGRzdC0+cW9zX2RhdGEuYWN0aXZlOworCS8vb2xkX3BhcmFtID0gZHN0LT5xb3NfZGF0YS5vbGRfcGFyYW1fY291bnQ7CisJb2xkX3BhcmFtID0gZHN0LT5xb3NfZGF0YS5wYXJhbV9jb3VudDsKKwlpZihkc3QtPmZsYWdzICYgTkVUV09SS19IQVNfUU9TX01BU0spCisJCW1lbWNweSgmZHN0LT5xb3NfZGF0YSwgJnNyYy0+cW9zX2RhdGEsCisJCQlzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9xb3NfZGF0YSkpOworCWVsc2UgeworCQlkc3QtPnFvc19kYXRhLnN1cHBvcnRlZCA9IHNyYy0+cW9zX2RhdGEuc3VwcG9ydGVkOworCQlkc3QtPnFvc19kYXRhLnBhcmFtX2NvdW50ID0gc3JjLT5xb3NfZGF0YS5wYXJhbV9jb3VudDsKKwl9CisKKwlpZihkc3QtPnFvc19kYXRhLnN1cHBvcnRlZCA9PSAxKSB7CisJCWRzdC0+UW9TX0VuYWJsZSA9IDE7CisJCWlmKGRzdC0+c3NpZF9sZW4pCisJCQlJRUVFODAyMTFfREVCVUdfUU9TCisJCQkJKCJRb1MgdGhlIG5ldHdvcmsgJXMgaXMgUW9TIHN1cHBvcnRlZFxuIiwKKwkJCQlkc3QtPnNzaWQpOworCQllbHNlCisJCQlJRUVFODAyMTFfREVCVUdfUU9TCisJCQkJKCJRb1MgdGhlIG5ldHdvcmsgaXMgUW9TIHN1cHBvcnRlZFxuIik7CisJfQorCWRzdC0+cW9zX2RhdGEuYWN0aXZlID0gcW9zX2FjdGl2ZTsKKwlkc3QtPnFvc19kYXRhLm9sZF9wYXJhbV9jb3VudCA9IG9sZF9wYXJhbTsKKworCS8qIGRzdC0+bGFzdF9hc3NvY2lhdGUgaXMgbm90IG92ZXJ3cml0dGVuICovCisJZHN0LT53bW1faW5mbyA9IHNyYy0+d21tX2luZm87IC8vc3VyZSB0byBleGlzdCBpbiBiZWFjb24gb3IgcHJvYmUgcmVzcG9uc2UgZnJhbWUuCisJaWYoc3JjLT53bW1fcGFyYW1bMF0uYWNfYWNpX2FjbV9haWZzbnx8IFwKKwkgICBzcmMtPndtbV9wYXJhbVsxXS5hY19hY2lfYWNtX2FpZnNufHwgXAorCSAgIHNyYy0+d21tX3BhcmFtWzJdLmFjX2FjaV9hY21fYWlmc258fCBcCisJICAgc3JjLT53bW1fcGFyYW1bMV0uYWNfYWNpX2FjbV9haWZzbikgeworCSAgbWVtY3B5KGRzdC0+d21tX3BhcmFtLCBzcmMtPndtbV9wYXJhbSwgV01FX0FDX1BSQU1fTEVOKTsKKwl9CisJLy9kc3QtPlFvU19FbmFibGUgPSBzcmMtPlFvU19FbmFibGU7CisjaWZkZWYgVEhPTUFTX1RVUkJPCisJZHN0LT5UdXJib19FbmFibGUgPSBzcmMtPlR1cmJvX0VuYWJsZTsKKyNlbmRpZgorCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWRzdC0+Q291bnRyeUllTGVuID0gc3JjLT5Db3VudHJ5SWVMZW47CisJbWVtY3B5KGRzdC0+Q291bnRyeUllQnVmLCBzcmMtPkNvdW50cnlJZUJ1Ziwgc3JjLT5Db3VudHJ5SWVMZW4pOworI2VuZGlmCisKKwkvL2FkZGVkIGJ5IGFteSBmb3IgTEVBUAorCWRzdC0+YldpdGhBaXJvbmV0SUUgPSBzcmMtPmJXaXRoQWlyb25ldElFOworCWRzdC0+YkNraXBTdXBwb3J0ZWQgPSBzcmMtPmJDa2lwU3VwcG9ydGVkOworCW1lbWNweShkc3QtPkNjeFJtU3RhdGUsc3JjLT5DY3hSbVN0YXRlLDIpOworCWRzdC0+YkNjeFJtRW5hYmxlID0gc3JjLT5iQ2N4Um1FbmFibGU7CisJZHN0LT5NQnNzaWRNYXNrID0gc3JjLT5NQnNzaWRNYXNrOworCWRzdC0+Yk1Cc3NpZFZhbGlkID0gc3JjLT5iTUJzc2lkVmFsaWQ7CisJbWVtY3B5KGRzdC0+TUJzc2lkLHNyYy0+TUJzc2lkLDYpOworCWRzdC0+YldpdGhDY3hWZXJOdW0gPSBzcmMtPmJXaXRoQ2N4VmVyTnVtOworCWRzdC0+QnNzQ2N4VmVyTnVtYmVyID0gc3JjLT5Cc3NDY3hWZXJOdW1iZXI7CisKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfYmVhY29uKF9fbGUxNiBmYykKK3sKKwlyZXR1cm4gKFdMQU5fRkNfR0VUX1NUWVBFKGxlMTZfdG9fY3B1KGZjKSkgPT0gSUVFRTgwMjExX1NUWVBFX0JFQUNPTik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFfcHJvY2Vzc19wcm9iZV9yZXNwb25zZSgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwlzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICpiZWFjb24sCisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqc3RhdHMpCit7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIG5ldHdvcms7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICp0YXJnZXQ7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpvbGRlc3QgPSBOVUxMOworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqaW5mb19lbGVtZW50ID0gJmJlYWNvbi0+aW5mb19lbGVtZW50WzBdOworI2VuZGlmCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzaG9ydCByZW5ldzsKKwkvL3U4IHdtbV9pbmZvOworCisJbWVtc2V0KCZuZXR3b3JrLCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrKSk7CisJSUVFRTgwMjExX0RFQlVHX1NDQU4oCisJCSInJXMnICgiIE1BQ19GTVQgIik6ICVjJWMlYyVjICVjJWMlYyVjLSVjJWMlYyVjICVjJWMlYyVjXG4iLAorCQllc2NhcGVfZXNzaWQoaW5mb19lbGVtZW50LT5kYXRhLCBpbmZvX2VsZW1lbnQtPmxlbiksCisJCU1BQ19BUkcoYmVhY29uLT5oZWFkZXIuYWRkcjMpLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4ZikpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4ZSkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4ZCkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4YykpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4YikpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4YSkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4OSkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4OCkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4NykpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4NikpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4NSkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4NCkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4MykpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4MikpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4MSkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4MCkpID8gJzEnIDogJzAnKTsKKworCWlmIChpZWVlODAyMTFfbmV0d29ya19pbml0KGllZWUsIGJlYWNvbiwgJm5ldHdvcmssIHN0YXRzKSkgeworCQlJRUVFODAyMTFfREVCVUdfU0NBTigiRHJvcHBlZCAnJXMnICgiIE1BQ19GTVQgIikgdmlhICVzLlxuIiwKKwkJCQkgICAgIGVzY2FwZV9lc3NpZChpbmZvX2VsZW1lbnQtPmRhdGEsCisJCQkJCQkgIGluZm9fZWxlbWVudC0+bGVuKSwKKwkJCQkgICAgIE1BQ19BUkcoYmVhY29uLT5oZWFkZXIuYWRkcjMpLAorCQkJCSAgICAgV0xBTl9GQ19HRVRfU1RZUEUoYmVhY29uLT5oZWFkZXIuZnJhbWVfY3RsKSA9PQorCQkJCSAgICAgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1AgPworCQkJCSAgICAgIlBST0JFIFJFU1BPTlNFIiA6ICJCRUFDT04iKTsKKwkJcmV0dXJuOworCX0KKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkvLyBGb3IgQXN1cyBFZWVQYyByZXF1ZXN0LAorCS8vICgxKSBpZiB3aXJlbGVzcyBhZGFwdGVyIHJlY2VpdmUgZ2V0IGFueSA4MDIuMTFkIGNvdW50cnkgY29kZSBpbiBBUCBiZWFjb24sCisJLy8JICAgd2lyZWxlc3MgYWRhcHRlciBzaG91bGQgZm9sbG93IHRoZSBjb3VudHJ5IGNvZGUuCisJLy8gKDIpICBJZiB0aGVyZSBpcyBubyBhbnkgY291bnRyeSBjb2RlIGluIGJlYWNvbiwKKwkvLyAgICAgICB0aGVuIHdpcmVsZXNzIGFkYXB0ZXIgc2hvdWxkIGRvIGFjdGl2ZSBzY2FuIGZyb20gY2gxfjExIGFuZAorCS8vICAgICAgIHBhc3NpdmUgc2NhbiBmcm9tIGNoMTJ+MTQKKworCWlmKCAhSXNMZWdhbENoYW5uZWwoaWVlZSwgbmV0d29yay5jaGFubmVsKSApCisJCXJldHVybjsKKwlpZihpZWVlLT5iR2xvYmFsRG9tYWluKQorCXsKKwkJaWYgKFdMQU5fRkNfR0VUX1NUWVBFKGJlYWNvbi0+aGVhZGVyLmZyYW1lX2N0bCkgPT0gSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1ApCisJCXsKKwkJCS8vIENhc2UgMTogQ291bnRyeSBjb2RlCisJCQlpZihJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpICkKKwkJCXsKKwkJCQlpZiggIUlzTGVnYWxDaGFubmVsKGllZWUsIG5ldHdvcmsuY2hhbm5lbCkgKQorCQkJCXsKKwkJCQkJcHJpbnRrKCJHZXRTY2FuSW5mbygpOiBGb3IgQ291bnRyeSBjb2RlLCBmaWx0ZXIgcHJvYmUgcmVzcG9uc2UgYXQgY2hhbm5lbCglZCkuXG4iLCBuZXR3b3JrLmNoYW5uZWwpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQkJLy8gQ2FzZSAyOiBObyBhbnkgY291bnRyeSBjb2RlLgorCQkJZWxzZQorCQkJeworCQkJCS8vIEZpbHRlciBvdmVyIGNoYW5uZWwgY2gxMn4xNAorCQkJCWlmKG5ldHdvcmsuY2hhbm5lbCA+IDExKQorCQkJCXsKKwkJCQkJcHJpbnRrKCJHZXRTY2FuSW5mbygpOiBGb3IgR2xvYmFsIERvbWFpbiwgZmlsdGVyIHByb2JlIHJlc3BvbnNlIGF0IGNoYW5uZWwoJWQpLlxuIiwgbmV0d29yay5jaGFubmVsKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIENhc2UgMTogQ291bnRyeSBjb2RlCisJCQlpZihJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpICkKKwkJCXsKKwkJCQlpZiggIUlzTGVnYWxDaGFubmVsKGllZWUsIG5ldHdvcmsuY2hhbm5lbCkgKQorCQkJCXsKKwkJCQkJcHJpbnRrKCJHZXRTY2FuSW5mbygpOiBGb3IgQ291bnRyeSBjb2RlLCBmaWx0ZXIgYmVhY29uIGF0IGNoYW5uZWwoJWQpLlxuIixuZXR3b3JrLmNoYW5uZWwpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQkJLy8gQ2FzZSAyOiBObyBhbnkgY291bnRyeSBjb2RlLgorCQkJZWxzZQorCQkJeworCQkJCS8vIEZpbHRlciBvdmVyIGNoYW5uZWwgY2gxMn4xNAorCQkJCWlmKG5ldHdvcmsuY2hhbm5lbCA+IDE0KQorCQkJCXsKKwkJCQkJcHJpbnRrKCJHZXRTY2FuSW5mbygpOiBGb3IgR2xvYmFsIERvbWFpbiwgZmlsdGVyIGJlYWNvbiBhdCBjaGFubmVsKCVkKS5cbiIsbmV0d29yay5jaGFubmVsKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCisJLyogVGhlIG5ldHdvcmsgcGFyc2VkIGNvcnJlY3RseSAtLSBzbyBub3cgd2Ugc2NhbiBvdXIga25vd24gbmV0d29ya3MKKwkgKiB0byBzZWUgaWYgd2UgY2FuIGZpbmQgaXQgaW4gb3VyIGxpc3QuCisJICoKKwkgKiBOT1RFOiAgVGhpcyBzZWFyY2ggaXMgZGVmaW5pdGVseSBub3Qgb3B0aW1pemVkLiAgT25jZSBpdHMgZG9pbmcKKwkgKiAgICAgICAgdGhlICJyaWdodCB0aGluZyIgd2UnbGwgb3B0aW1pemUgaXQgZm9yIGVmZmljaWVuY3kgaWYKKwkgKiAgICAgICAgbmVjZXNzYXJ5ICovCisKKwkvKiBTZWFyY2ggZm9yIHRoaXMgZW50cnkgaW4gdGhlIGxpc3QgYW5kIHVwZGF0ZSBpdCBpZiBpdCBpcworCSAqIGFscmVhZHkgdGhlcmUuICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWYoaXNfc2FtZV9uZXR3b3JrKCZpZWVlLT5jdXJyZW50X25ldHdvcmssICZuZXR3b3JrLCBpZWVlKSkgeworCQl1cGRhdGVfbmV0d29yaygmaWVlZS0+Y3VycmVudF9uZXR3b3JrLCAmbmV0d29yayk7CisJCWlmKChpZWVlLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX05fMjRHIHx8IGllZWUtPmN1cnJlbnRfbmV0d29yay5tb2RlID09IElFRUVfRykKKwkJJiYgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlcnBfaW5mb192YWxpZCl7CisJCWlmKGllZWUtPmN1cnJlbnRfbmV0d29yay5lcnBfdmFsdWUmIEVSUF9Vc2VQcm90ZWN0aW9uKQorCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJ1c2Vwcm90ZWN0aW9uID0gdHJ1ZTsKKwkJZWxzZQorCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJ1c2Vwcm90ZWN0aW9uID0gZmFsc2U7CisJCX0KKwkJaWYoaXNfYmVhY29uKGJlYWNvbi0+aGVhZGVyLmZyYW1lX2N0bCkpCisJCXsKKwkJCWlmKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpCisJCQkJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkJjbkluUGVyaW9kKys7CisJCX0KKwkJZWxzZSAvL2hpZGRlbiBBUAorCQkJbmV0d29yay5mbGFncyA9ICh+TkVUV09SS19FTVBUWV9FU1NJRCAmIG5ldHdvcmsuZmxhZ3MpfChORVRXT1JLX0VNUFRZX0VTU0lEICYgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmZsYWdzKTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRhcmdldCwgJmllZWUtPm5ldHdvcmtfbGlzdCwgbGlzdCkgeworCQlpZiAoaXNfc2FtZV9uZXR3b3JrKHRhcmdldCwgJm5ldHdvcmssIGllZWUpKQorCQkJYnJlYWs7CisJCWlmICgob2xkZXN0ID09IE5VTEwpIHx8CisJCSAgICAodGFyZ2V0LT5sYXN0X3NjYW5uZWQgPCBvbGRlc3QtPmxhc3Rfc2Nhbm5lZCkpCisJCQlvbGRlc3QgPSB0YXJnZXQ7CisJfQorCisJLyogSWYgd2UgZGlkbid0IGZpbmQgYSBtYXRjaCwgdGhlbiBnZXQgYSBuZXcgbmV0d29yayBzbG90IHRvIGluaXRpYWxpemUKKwkgKiB3aXRoIHRoaXMgYmVhY29uJ3MgaW5mb3JtYXRpb24gKi8KKwlpZiAoJnRhcmdldC0+bGlzdCA9PSAmaWVlZS0+bmV0d29ya19saXN0KSB7CisJCWlmIChsaXN0X2VtcHR5KCZpZWVlLT5uZXR3b3JrX2ZyZWVfbGlzdCkpIHsKKwkJCS8qIElmIHRoZXJlIGFyZSBubyBtb3JlIHNsb3RzLCBleHBpcmUgdGhlIG9sZGVzdCAqLworCQkJbGlzdF9kZWwoJm9sZGVzdC0+bGlzdCk7CisJCQl0YXJnZXQgPSBvbGRlc3Q7CisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiRXhwaXJlZCAnJXMnICgiIE1BQ19GTVQgIikgZnJvbSAiCisJCQkJCSAgICAgIm5ldHdvcmsgbGlzdC5cbiIsCisJCQkJCSAgICAgZXNjYXBlX2Vzc2lkKHRhcmdldC0+c3NpZCwKKwkJCQkJCQkgIHRhcmdldC0+c3NpZF9sZW4pLAorCQkJCQkgICAgIE1BQ19BUkcodGFyZ2V0LT5ic3NpZCkpOworCQl9IGVsc2UgeworCQkJLyogT3RoZXJ3aXNlIGp1c3QgcHVsbCBmcm9tIHRoZSBmcmVlIGxpc3QgKi8KKwkJCXRhcmdldCA9IGxpc3RfZW50cnkoaWVlZS0+bmV0d29ya19mcmVlX2xpc3QubmV4dCwKKwkJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yaywgbGlzdCk7CisJCQlsaXN0X2RlbChpZWVlLT5uZXR3b3JrX2ZyZWVfbGlzdC5uZXh0KTsKKwkJfQorCisKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJBZGRpbmcgJyVzJyAoIiBNQUNfRk1UICIpIHZpYSAlcy5cbiIsCisJCQkJICAgICBlc2NhcGVfZXNzaWQobmV0d29yay5zc2lkLAorCQkJCQkJICBuZXR3b3JrLnNzaWRfbGVuKSwKKwkJCQkgICAgIE1BQ19BUkcobmV0d29yay5ic3NpZCksCisJCQkJICAgICBXTEFOX0ZDX0dFVF9TVFlQRShiZWFjb24tPmhlYWRlci5mcmFtZV9jdGwpID09CisJCQkJICAgICBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCA/CisJCQkJICAgICAiUFJPQkUgUkVTUE9OU0UiIDogIkJFQUNPTiIpOworI2VuZGlmCisJCW1lbWNweSh0YXJnZXQsICZuZXR3b3JrLCBzaXplb2YoKnRhcmdldCkpOworCQlsaXN0X2FkZF90YWlsKCZ0YXJnZXQtPmxpc3QsICZpZWVlLT5uZXR3b3JrX2xpc3QpOworCQlpZihpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSkKKwkJCWllZWU4MDIxMV9zb2Z0bWFjX25ld19uZXQoaWVlZSwmbmV0d29yayk7CisJfSBlbHNlIHsKKwkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIlVwZGF0aW5nICclcycgKCIgTUFDX0ZNVCAiKSB2aWEgJXMuXG4iLAorCQkJCSAgICAgZXNjYXBlX2Vzc2lkKHRhcmdldC0+c3NpZCwKKwkJCQkJCSAgdGFyZ2V0LT5zc2lkX2xlbiksCisJCQkJICAgICBNQUNfQVJHKHRhcmdldC0+YnNzaWQpLAorCQkJCSAgICAgV0xBTl9GQ19HRVRfU1RZUEUoYmVhY29uLT5oZWFkZXIuZnJhbWVfY3RsKSA9PQorCQkJCSAgICAgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1AgPworCQkJCSAgICAgIlBST0JFIFJFU1BPTlNFIiA6ICJCRUFDT04iKTsKKworCQkvKiB3ZSBoYXZlIGFuIGVudHJ5IGFuZCB3ZSBhcmUgZ29pbmcgdG8gdXBkYXRlIGl0LiBCdXQgdGhpcyBlbnRyeSBtYXkKKwkJICogYmUgYWxyZWFkeSBleHBpcmVkLiBJbiB0aGlzIGNhc2Ugd2UgZG8gdGhlIHNhbWUgYXMgd2UgZm91bmQgYSBuZXcKKwkJICogbmV0IGFuZCBjYWxsIHRoZSBuZXdfbmV0IGhhbmRsZXIKKwkJICovCisJCXJlbmV3ID0gIXRpbWVfYWZ0ZXIodGFyZ2V0LT5sYXN0X3NjYW5uZWQgKyBpZWVlLT5zY2FuX2FnZSwgamlmZmllcyk7CisJCS8vWUosYWRkLDA4MDgxOSxmb3IgaGlkZGVuIGFwCisJCWlmKGlzX2JlYWNvbihiZWFjb24tPmhlYWRlci5mcmFtZV9jdGwpID09IDApCisJCQluZXR3b3JrLmZsYWdzID0gKH5ORVRXT1JLX0VNUFRZX0VTU0lEICYgbmV0d29yay5mbGFncyl8KE5FVFdPUktfRU1QVFlfRVNTSUQgJiB0YXJnZXQtPmZsYWdzKTsKKwkJLy9pZihzdHJuY21wKG5ldHdvcmsuc3NpZCwgImxpbmtzeXMtYyIsOSkgPT0gMCkKKwkJLy8JcHJpbnRrKCI9PT09PjIgbmV0d29yay5zc2lkPSVzIEZMQUc9JWQgdGFyZ2V0LnNzaWQ9JXMgRkxBRz0lZFxuIiwgbmV0d29yay5zc2lkLCBuZXR3b3JrLmZsYWdzLCB0YXJnZXQtPnNzaWQsIHRhcmdldC0+ZmxhZ3MpOworCQlpZigoKG5ldHdvcmsuZmxhZ3MgJiBORVRXT1JLX0VNUFRZX0VTU0lEKSA9PSBORVRXT1JLX0VNUFRZX0VTU0lEKSBcCisJCSAgICAmJiAoKChuZXR3b3JrLnNzaWRfbGVuID4gMCkgJiYgKHN0cm5jbXAodGFyZ2V0LT5zc2lkLCBuZXR3b3JrLnNzaWQsIG5ldHdvcmsuc3NpZF9sZW4pKSlcCisJCSAgICB8fCgoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID09IG5ldHdvcmsuc3NpZF9sZW4pJiYoc3RybmNtcChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgbmV0d29yay5zc2lkLCBuZXR3b3JrLnNzaWRfbGVuKSA9PSAwKSYmKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspKSkpCisJCQlyZW5ldyA9IDE7CisJCS8vWUosYWRkLDA4MDgxOSxmb3IgaGlkZGVuIGFwLGVuZAorCisJCXVwZGF0ZV9uZXR3b3JrKHRhcmdldCwgJm5ldHdvcmspOworCQlpZihyZW5ldyAmJiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUpKQorCQkJaWVlZTgwMjExX3NvZnRtYWNfbmV3X25ldChpZWVlLCZuZXR3b3JrKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJaWYgKGlzX2JlYWNvbihiZWFjb24tPmhlYWRlci5mcmFtZV9jdGwpJiZpc19zYW1lX25ldHdvcmsoJmllZWUtPmN1cnJlbnRfbmV0d29yaywgJm5ldHdvcmssIGllZWUpJiZcCisJCShpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKSkgeworCQlpZihpZWVlLT5oYW5kbGVfYmVhY29uICE9IE5VTEwpIHsKKwkJCWllZWUtPmhhbmRsZV9iZWFjb24oaWVlZS0+ZGV2LGJlYWNvbiwmaWVlZS0+Y3VycmVudF9uZXR3b3JrKTsKKwkJfQorCX0KK30KKwordm9pZCBpZWVlODAyMTFfcnhfbWd0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGVhZGVyLAorCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cykKK3sKKwlzd2l0Y2ggKFdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSkgeworCisJY2FzZSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OOgorCQlJRUVFODAyMTFfREVCVUdfTUdNVCgicmVjZWl2ZWQgQkVBQ09OICglZClcbiIsCisJCQkJICAgICBXTEFOX0ZDX0dFVF9TVFlQRShoZWFkZXItPmZyYW1lX2N0bCkpOworCQlJRUVFODAyMTFfREVCVUdfU0NBTigiQmVhY29uXG4iKTsKKwkJaWVlZTgwMjExX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2UoCisJCQlpZWVlLCAoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqKWhlYWRlciwgc3RhdHMpOworCQlicmVhazsKKworCWNhc2UgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1A6CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJyZWNlaXZlZCBQUk9CRSBSRVNQT05TRSAoJWQpXG4iLAorCQkJCSAgICAgV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpKTsKKwkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIlByb2JlIHJlc3BvbnNlXG4iKTsKKwkJaWVlZTgwMjExX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2UoCisJCQlpZWVlLCAoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqKWhlYWRlciwgc3RhdHMpOworCQlicmVhazsKKworCX0KK30KKworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfcnhfbWd0KTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3J4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTg2ZTkzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCkBAIC0wLDAgKzEsMzI4NyBAQAorLyogSUVFRSA4MDIuMTEgU29mdE1BQyBsYXllcgorICogQ29weXJpZ2h0IChjKSAyMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAqCisgKiBNb3N0bHkgZXh0cmFjdGVkIGZyb20gdGhlIHJ0bDgxODAtc2EyNDAwIGRyaXZlciBmb3IgdGhlCisgKiBpbi1rZXJuZWwgZ2VuZXJpYyBpZWVlODAyLjExIHN0YWNrLgorICoKKyAqIEZldyBsaW5lcyBtaWdodCBiZSBzdG9sZW4gZnJvbSBvdGhlciBwYXJ0IG9mIHRoZSBpZWVlODAyMTEKKyAqIHN0YWNrLiBDb3B5cmlnaHQgd2hvIG93biBpdCdzIGNvcHlyaWdodAorICoKKyAqIFdQQSBjb2RlIHN0b2xlbiBmcm9tIHRoZSBpcHcyMjAwIGRyaXZlci4KKyAqIENvcHlyaWdodCB3aG8gb3duIGl0J3MgY29weXJpZ2h0LgorICoKKyAqIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKworI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaWZkZWYgRU5BQkxFX0RPVDExRAorI2luY2x1ZGUgImRvdDExZC5oIgorI2VuZGlmCisKK3U4IHJzbl9hdXRoZW5fY2lwaGVyX3N1aXRlWzE2XVs0XSA9IHsKKwl7MHgwMCwweDBGLDB4QUMsMHgwMH0sIC8vVXNlIGdyb3VwIGtleSwgLy9SZXNlcnZlZAorCXsweDAwLDB4MEYsMHhBQywweDAxfSwgLy9XRVAtNDAgICAgICAgICAvL1JTTkEgZGVmYXVsdAorCXsweDAwLDB4MEYsMHhBQywweDAyfSwgLy9US0lQICAgICAgICAgICAvL05PTkUJCS8ve3VzZWQganVzdCBhcyBkZWZhdWx0fQorCXsweDAwLDB4MEYsMHhBQywweDAzfSwgLy9XUkFQLWhpc3RvcmljYWwKKwl7MHgwMCwweDBGLDB4QUMsMHgwNH0sIC8vQ0NNUAorCXsweDAwLDB4MEYsMHhBQywweDA1fSwgLy9XRVAtMTA0Cit9OworCitzaG9ydCBpZWVlODAyMTFfaXNfNTRnKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBuZXQpCit7CisJcmV0dXJuICgobmV0LnJhdGVzX2V4X2xlbiA+IDApIHx8IChuZXQucmF0ZXNfbGVuID4gNCkpOworfQorCitzaG9ydCBpZWVlODAyMTFfaXNfc2hvcnRzbG90KHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBuZXQpCit7CisJcmV0dXJuIChuZXQuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UKTsKK30KKworLyogcmV0dXJucyB0aGUgdG90YWwgbGVuZ3RoIG5lZWRlZCBmb3IgcGxlYWNpbmcgdGhlIFJBVEUgTUZJRQorICogdGFnIGFuZCB0aGUgRVhURU5ERUQgUkFURSBNRklFIHRhZyBpZiBuZWVkZWQuCisgKiBJdCBlbmNsdWRlcyB0d28gYnl0ZXMgcGVyIHRhZyBmb3IgdGhlIHRhZyBpdHNlbGYgYW5kIGl0cyBsZW4KKyAqLwordW5zaWduZWQgaW50IGllZWU4MDIxMV9NRklFX3JhdGVfbGVuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXVuc2lnbmVkIGludCByYXRlX2xlbiA9IDA7CisKKwlpZiAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTikKKwkJcmF0ZV9sZW4gPSBJRUVFODAyMTFfQ0NLX1JBVEVfTEVOICsgMjsKKworCWlmIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikKKworCQlyYXRlX2xlbiArPSBJRUVFODAyMTFfT0ZETV9SQVRFX0xFTiArIDI7CisKKwlyZXR1cm4gcmF0ZV9sZW47Cit9CisKKy8qIHBsZWFjZSB0aGUgTUZJRSByYXRlLCB0YWcgdG8gdGhlIG1lbW9yeSAoZG91YmxlKSBwb2luZWQuCisgKiBUaGVuIGl0IHVwZGF0ZXMgdGhlIHBvaW50ZXIgc28gdGhhdAorICogaXQgcG9pbnRzIGFmdGVyIHRoZSBuZXcgTUZJRSB0YWcgYWRkZWQuCisgKi8KK3ZvaWQgaWVlZTgwMjExX01GSUVfQnJhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICoqdGFnX3ApCit7CisJdTggKnRhZyA9ICp0YWdfcDsKKworCWlmIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OKXsKKwkJKnRhZysrID0gTUZJRV9UWVBFX1JBVEVTOworCQkqdGFnKysgPSA0OworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzFNQjsKKwkJKnRhZysrID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV8yTUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfQ0NLX1JBVEVfNU1COworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzExTUI7CisJfQorCisJLyogV2UgbWF5IGFkZCBhbiBvcHRpb24gZm9yIGN1c3RvbSByYXRlcyB0aGF0IHNwZWNpZmljIEhXIG1pZ2h0IHN1cHBvcnQgKi8KKwkqdGFnX3AgPSB0YWc7Cit9CisKK3ZvaWQgaWVlZTgwMjExX01GSUVfR3JhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICoqdGFnX3ApCit7CisJdTggKnRhZyA9ICp0YWdfcDsKKworCQlpZiAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04peworCisJCSp0YWcrKyA9IE1GSUVfVFlQRV9SQVRFU19FWDsKKwkJKnRhZysrID0gODsKKwkJKnRhZysrID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV85TUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUI7CisKKwl9CisKKwkvKiBXZSBtYXkgYWRkIGFuIG9wdGlvbiBmb3IgY3VzdG9tIHJhdGVzIHRoYXQgc3BlY2lmaWMgSFcgbWlnaHQgc3VwcG9ydCAqLworCSp0YWdfcCA9IHRhZzsKK30KKworCit2b2lkIGllZWU4MDIxMV9XTU1fSW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKip0YWdfcCkgeworCXU4ICp0YWcgPSAqdGFnX3A7CisKKwkqdGFnKysgPSBNRklFX1RZUEVfR0VORVJJQzsgLy8wCisJKnRhZysrID0gNzsKKwkqdGFnKysgPSAweDAwOworCSp0YWcrKyA9IDB4NTA7CisJKnRhZysrID0gMHhmMjsKKwkqdGFnKysgPSAweDAyOy8vNQorCSp0YWcrKyA9IDB4MDA7CisJKnRhZysrID0gMHgwMTsKKyNpZmRlZiBTVVBQT1JUX1VTUEQKKwlpZihpZWVlLT5jdXJyZW50X25ldHdvcmsud21tX2luZm8gJiAweDgwKSB7CisJCSp0YWcrKyA9IDB4MGZ8TUFYX1NQX0xlbjsKKwl9IGVsc2UgeworCQkqdGFnKysgPSBNQVhfU1BfTGVuOworCX0KKyNlbHNlCisJKnRhZysrID0gTUFYX1NQX0xlbjsKKyNlbmRpZgorCSp0YWdfcCA9IHRhZzsKK30KKworI2lmZGVmIFRIT01BU19UVVJCTwordm9pZCBpZWVlODAyMTFfVFVSQk9fSW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKip0YWdfcCkgeworCXU4ICp0YWcgPSAqdGFnX3A7CisKKwkqdGFnKysgPSBNRklFX1RZUEVfR0VORVJJQzsgLy8wCisJKnRhZysrID0gNzsKKwkqdGFnKysgPSAweDAwOworCSp0YWcrKyA9IDB4ZTA7CisJKnRhZysrID0gMHg0YzsKKwkqdGFnKysgPSAweDAxOy8vNQorCSp0YWcrKyA9IDB4MDI7CisJKnRhZysrID0gMHgxMTsKKwkqdGFnKysgPSAweDAwOworCisJKnRhZ19wID0gdGFnOworCXByaW50ayhLRVJOX0FMRVJUICJUaGlzIGlzIGVuYWJsZSB0dXJibyBtb2RlIElFIHByb2Nlc3NcbiIpOworfQorI2VuZGlmCisKK3ZvaWQgZW5xdWV1ZV9tZ210KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBuaDsKKwluaCA9IChpZWVlLT5tZ210X3F1ZXVlX2hlYWQgKzEpICUgTUdNVF9RVUVVRV9OVU07CisKKy8qCisgKiBpZiB0aGUgcXVldWUgaXMgZnVsbCBidXQgd2UgaGF2ZSBuZXdlciBmcmFtZXMgdGhlbgorICoganVzdCBvdmVyd3JpdGVzIHRoZSBvbGRlc3QuCisgKgorICogaWYgKG5oID09IGllZWUtPm1nbXRfcXVldWVfdGFpbCkKKyAqCQlyZXR1cm4gLTE7CisgKi8KKwlpZWVlLT5tZ210X3F1ZXVlX2hlYWQgPSBuaDsKKwlpZWVlLT5tZ210X3F1ZXVlX3JpbmdbbmhdID0gc2tiOworCisJLy9yZXR1cm4gMDsKK30KKworc3RydWN0IHNrX2J1ZmYgKmRlcXVldWVfbWdtdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqcmV0OworCisJaWYoaWVlZS0+bWdtdF9xdWV1ZV90YWlsID09IGllZWUtPm1nbXRfcXVldWVfaGVhZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXQgPSBpZWVlLT5tZ210X3F1ZXVlX3JpbmdbaWVlZS0+bWdtdF9xdWV1ZV90YWlsXTsKKworCWllZWUtPm1nbXRfcXVldWVfdGFpbCA9CisJCShpZWVlLT5tZ210X3F1ZXVlX3RhaWwrMSkgJSBNR01UX1FVRVVFX05VTTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgaW5pdF9tZ210X3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWllZWUtPm1nbXRfcXVldWVfdGFpbCA9IGllZWUtPm1nbXRfcXVldWVfaGVhZCA9IDA7Cit9CisKK3U4IE1nbnRRdWVyeV9NZ250RnJhbWVUeFJhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJUFJUX0hJR0hfVEhST1VHSFBVVCAgICAgIHBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworCXU4IHJhdGU7CisKKwkvLyAyMDA4LzAxLzI1IE1IIEZvciBicm9hZGNvbSwgTUdOVCBmcmFtZSBzZXQgYXMgT0ZETSA2TS4KKwlpZihwSFRJbmZvLT5JT1RBY3Rpb24gJiBIVF9JT1RfQUNUX01HTlRfVVNFX0NDS182TSkKKwkJcmF0ZSA9IDB4MGM7CisJZWxzZQorCQlyYXRlID0gaWVlZS0+YmFzaWNfcmF0ZSAmIDB4N2Y7CisKKwlpZihyYXRlID09IDApeworCQkvLyAyMDA1LjAxLjI2LCBieSByY25qa28uCisJCWlmKGllZWUtPm1vZGUgPT0gSUVFRV9BfHwKKwkJICAgaWVlZS0+bW9kZT09IElFRUVfTl81R3x8CisJCSAgIChpZWVlLT5tb2RlPT0gSUVFRV9OXzI0RyYmIXBIVEluZm8tPmJDdXJTdXBwQ0NLKSkKKwkJCXJhdGUgPSAweDBjOworCQllbHNlCisJCQlyYXRlID0gMHgwMjsKKwl9CisKKwkvKgorCS8vIERhdGEgcmF0ZSBvZiBQcm9iZVJlcSBpcyBhbHJlYWR5IGRlY2lkZWQuIEFubmllLCAyMDA1LTAzLTMxCisJaWYoIHBNZ250SW5mby0+YlNjYW5JblByb2dyZXNzIHx8IChwTWdudEluZm8tPmJEdWFsTW9kZVNjYW5TdGVwIT0wKSApCisJeworCWlmKHBNZ250SW5mby0+ZG90MTFDdXJyZW50V2lyZWxlc3NNb2RlPT1XSVJFTEVTU19NT0RFX0EpCisJcmF0ZSA9IDB4MGM7CisJZWxzZQorCXJhdGUgPSAweDAyOworCX0KKwkgKi8KKwlyZXR1cm4gcmF0ZTsKK30KKworCit2b2lkIGllZWU4MDIxMV9zdGFfd2FrZXVwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzaG9ydCBubCk7CisKK2lubGluZSB2b2lkIHNvZnRtYWNfbWdtdF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc2hvcnQgc2luZ2xlID0gaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUU7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICpoZWFkZXI9CisJCShzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKikgc2tiLT5kYXRhOworCisJY2JfZGVzYyAqdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKShza2ItPmNiICsgOCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCS8qIGNhbGxlZCB3aXRoIDJuZCBwYXJhbSAwLCBubyBtZ210IGxvY2sgcmVxdWlyZWQgKi8KKwlpZWVlODAyMTFfc3RhX3dha2V1cChpZWVlLDApOworCisJdGNiX2Rlc2MtPnF1ZXVlX2luZGV4ID0gTUdOVF9RVUVVRTsKKwl0Y2JfZGVzYy0+ZGF0YV9yYXRlID0gTWdudFF1ZXJ5X01nbnRGcmFtZVR4UmF0ZShpZWVlKTsKKwl0Y2JfZGVzYy0+UkFUUkluZGV4ID0gNzsKKwl0Y2JfZGVzYy0+YlR4RGlzYWJsZVJhdGVGYWxsQmFjayA9IDE7CisJdGNiX2Rlc2MtPmJUeFVzZURyaXZlckFzc2luZ2VkUmF0ZSA9IDE7CisKKwlpZihzaW5nbGUpeworCQlpZihpZWVlLT5xdWV1ZV9zdG9wKXsKKwkJCWVucXVldWVfbWdtdChpZWVlLHNrYik7CisJCX1lbHNleworCQkJaGVhZGVyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF08PDQpOworCisJCQlpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCisJCQkJaWVlZS0+c2VxX2N0cmxbMF0gPSAwOworCQkJZWxzZQorCQkJCWllZWUtPnNlcV9jdHJsWzBdKys7CisKKwkJCS8qIGF2b2lkIHdhdGNoZG9nIHRyaWdnZXJzICovCisJCQlpZWVlLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoc2tiLGllZWUtPmRldixpZWVlLT5iYXNpY19yYXRlKTsKKwkJCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCisJCX0KKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJfWVsc2V7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MpOworCisJCWhlYWRlci0+c2VxX2N0bCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsWzBdIDw8IDQpOworCisJCWlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKKwkJCWllZWUtPnNlcV9jdHJsWzBdID0gMDsKKwkJZWxzZQorCQkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKKworCQkvKiBjaGVjayB3ZXRoZXIgdGhlIG1hbmFnZWQgcGFja2V0IHF1ZXVlZCBncmVhdGVyIHRoYW4gNSAqLworCQlpZighaWVlZS0+Y2hlY2tfbmljX2Vub3VnaF9kZXNjKGllZWUtPmRldix0Y2JfZGVzYy0+cXVldWVfaW5kZXgpfHxcCisJCQkJKHNrYl9xdWV1ZV9sZW4oJmllZWUtPnNrYl93YWl0UVt0Y2JfZGVzYy0+cXVldWVfaW5kZXhdKSAhPSAwKXx8XAorCQkJCShpZWVlLT5xdWV1ZV9zdG9wKSApIHsKKwkJCS8qIGluc2VydCB0aGUgc2tiIHBhY2tldCB0byB0aGUgbWFuYWdlbWVudCBxdWV1ZSAqLworCQkJLyogYXMgZm9yIHRoZSBjb21wbGV0aW9uIGZ1bmN0aW9uLCBpdCBkb2VzIG5vdCBuZWVkCisJCQkgKiB0byBjaGVjayBpdCBhbnkgbW9yZS4KKwkJCSAqICovCisJCQlwcmludGsoIiVzKCk6aW5zZXJ0IHRvIHdhaXRxdWV1ZSFcbiIsX19GVU5DVElPTl9fKTsKKwkJCXNrYl9xdWV1ZV90YWlsKCZpZWVlLT5za2Jfd2FpdFFbdGNiX2Rlc2MtPnF1ZXVlX2luZGV4XSwgc2tiKTsKKwkJfSBlbHNlIHsKKwkJCS8vcHJpbnRrKCJUWCBwYWNrZXQhXG4iKTsKKwkJCWllZWUtPnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KHNrYixpZWVlLT5kZXYpOworCQkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzKTsKKwl9Cit9CisKK2lubGluZSB2b2lkIHNvZnRtYWNfcHNfbWdtdF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCisJc2hvcnQgc2luZ2xlID0gaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUU7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICpoZWFkZXIgPQorCQkoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICopIHNrYi0+ZGF0YTsKKworCisJaWYoc2luZ2xlKXsKKworCQloZWFkZXItPnNlcV9jdGwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFswXSA8PCA0KTsKKworCQlpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCisJCQlpZWVlLT5zZXFfY3RybFswXSA9IDA7CisJCWVsc2UKKwkJCWllZWUtPnNlcV9jdHJsWzBdKys7CisKKwkJLyogYXZvaWQgd2F0Y2hkb2cgdHJpZ2dlcnMgKi8KKwkJaWVlZS0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoc2tiLGllZWUtPmRldixpZWVlLT5iYXNpY19yYXRlKTsKKworCX1lbHNleworCisJCWhlYWRlci0+c2VxX2N0bCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsWzBdIDw8IDQpOworCisJCWlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKKwkJCWllZWUtPnNlcV9jdHJsWzBdID0gMDsKKwkJZWxzZQorCQkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKKworCQlpZWVlLT5zb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdChza2IsaWVlZS0+ZGV2KTsKKworCX0KKwkvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcworfQorCitpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9wcm9iZV9yZXEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJdW5zaWduZWQgaW50IGxlbixyYXRlX2xlbjsKKwl1OCAqdGFnOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0ICpyZXE7CisKKwlsZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW47CisKKwlyYXRlX2xlbiA9IGllZWU4MDIxMV9NRklFX3JhdGVfbGVuKGllZWUpOworCisJc2tiID0gZGV2X2FsbG9jX3NrYihzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0KSArCisJCQkgICAgMiArIGxlbiArIHJhdGVfbGVuICsgaWVlZS0+dHhfaGVhZHJvb20pOworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCXNrYl9yZXNlcnZlKHNrYiwgaWVlZS0+dHhfaGVhZHJvb20pOworCisJcmVxID0gKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCAqKSBza2JfcHV0KHNrYixzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0KSk7CisJcmVxLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUSk7CisJcmVxLT5oZWFkZXIuZHVyYXRpb25faWQgPSAwOyAvL0ZJWE1FOiBpcyB0aGlzIE9LID8KKworCW1lbXNldChyZXEtPmhlYWRlci5hZGRyMSwgMHhmZiwgRVRIX0FMRU4pOworCW1lbWNweShyZXEtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbXNldChyZXEtPmhlYWRlci5hZGRyMywgMHhmZiwgRVRIX0FMRU4pOworCisJdGFnID0gKHU4ICopIHNrYl9wdXQoc2tiLGxlbisyK3JhdGVfbGVuKTsKKworCSp0YWcrKyA9IE1GSUVfVFlQRV9TU0lEOworCSp0YWcrKyA9IGxlbjsKKwltZW1jcHkodGFnLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgbGVuKTsKKwl0YWcgKz0gbGVuOworCisJaWVlZTgwMjExX01GSUVfQnJhdGUoaWVlZSwmdGFnKTsKKwlpZWVlODAyMTFfTUZJRV9HcmF0ZShpZWVlLCZ0YWcpOworCXJldHVybiBza2I7Cit9CisKK3N0cnVjdCBza19idWZmICppZWVlODAyMTFfZ2V0X2JlYWNvbl8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwordm9pZCBpZWVlODAyMTFfc2VuZF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpZighaWVlZS0+aWVlZV91cCkKKwkJcmV0dXJuOworCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKKwlza2IgPSBpZWVlODAyMTFfZ2V0X2JlYWNvbl8oaWVlZSk7CisKKwlpZiAoc2tiKXsKKwkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKKwkJaWVlZS0+c29mdG1hY19zdGF0cy50eF9iZWFjb25zKys7CisJCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCisJfQorLy8JaWVlZS0+YmVhY29uX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsKKy8vCQkoTVNFQ1MoIGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgLTUpKTsKKworCS8vc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKKwlpZihpZWVlLT5iZWFjb25fdHhpbmcgJiYgaWVlZS0+aWVlZV91cCl7CisvLwkJaWYoIXRpbWVyX3BlbmRpbmcoJmllZWUtPmJlYWNvbl90aW1lcikpCisvLwkJCWFkZF90aW1lcigmaWVlZS0+YmVhY29uX3RpbWVyKTsKKwkJbW9kX3RpbWVyKCZpZWVlLT5iZWFjb25fdGltZXIsamlmZmllcysoTVNFQ1MoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbC01KSkpOworCX0KKwkvL3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKK30KKworCit2b2lkIGllZWU4MDIxMV9zZW5kX2JlYWNvbl9jYih1bnNpZ25lZCBsb25nIF9pZWVlKQoreworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0KKwkJKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICopIF9pZWVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+YmVhY29uX2xvY2ssIGZsYWdzKTsKKwlpZWVlODAyMTFfc2VuZF9iZWFjb24oaWVlZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+YmVhY29uX2xvY2ssIGZsYWdzKTsKK30KKworCit2b2lkIGllZWU4MDIxMV9zZW5kX3Byb2JlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBpZWVlODAyMTFfcHJvYmVfcmVxKGllZWUpOworCWlmIChza2IpeworCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOworCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X3Byb2JlX3JxKys7CisJCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCisJfQorfQorCit2b2lkIGllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcXVlc3RzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWlmIChpZWVlLT5hY3RpdmVfc2NhbiAmJiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19QUk9CRVJRKSl7CisJCWllZWU4MDIxMV9zZW5kX3Byb2JlKGllZWUpOworCQlpZWVlODAyMTFfc2VuZF9wcm9iZShpZWVlKTsKKwl9Cit9CisKKy8qIHRoaXMgcGVyZm9ybXMgc3luY3JvIHNjYW4gYmxvY2tpbmcgdGhlIGNhbGxlciB1bnRpbCBhbGwgY2hhbm5lbHMKKyAqIGluIHRoZSBhbGxvd2VkIGNoYW5uZWwgbWFwIGhhcyBiZWVuIGNoZWNrZWQuCisgKi8KK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl9zeW5jcm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJc2hvcnQgY2ggPSAwOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwl1OCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CisJbWVtY3B5KGNoYW5uZWxfbWFwLCBHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7CisjZW5kaWYKKwlkb3duKCZpZWVlLT5zY2FuX3NlbSk7CisKKwl3aGlsZSgxKQorCXsKKworCQlkb3sKKwkJCWNoKys7CisJCQlpZiAoY2ggPiBNQVhfQ0hBTk5FTF9OVU1CRVIpCisJCQkJZ290byBvdXQ7IC8qIHNjYW4gY29tcGxldGVkICovCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCQl9d2hpbGUoIWNoYW5uZWxfbWFwW2NoXSk7CisjZWxzZQorCQl9d2hpbGUoIWllZWUtPmNoYW5uZWxfbWFwW2NoXSk7CisjZW5kaWYKKworCQkvKiB0aGlzIGZ1Y3Rpb24gY2FuIGJlIGNhbGxlZCBpbiB0d28gc2l0dWF0aW9ucworCQkgKiAxLSBXZSBoYXZlIHN3aXRjaGVkIHRvIGFkLWhvYyBtb2RlIGFuZCB3ZSBhcmUKKwkJICogICAgcGVyZm9ybWluZyBhIGNvbXBsZXRlIHN5bmNybyBzY2FuIGJlZm9yZSBjb25jbHVkZQorCQkgKiAgICB0aGVyZSBhcmUgbm8gaW50ZXJlc3RpbmcgY2VsbCBhbmQgdG8gY3JlYXRlIGEKKwkJICogICAgbmV3IG9uZS4gSW4gdGhpcyBjYXNlIHRoZSBsaW5rIHN0YXRlIGlzCisJCSAqICAgIElFRUU4MDIxMV9OT0xJTksgdW50aWwgd2UgZm91bmQgYW4gaW50ZXJlc3RpbmcgY2VsbC4KKwkJICogICAgSWYgc28gdGhlIGllZWU4MDIxX25ld19uZXQsIGNhbGxlZCBieSB0aGUgUlggcGF0aAorCQkgKiAgICB3aWxsIHNldCB0aGUgc3RhdGUgdG8gSUVFRTgwMjExX0xJTktFRCwgc28gd2Ugc3RvcAorCQkgKiAgICBzY2FubmluZworCQkgKiAyLSBXZSBhcmUgbGlua2VkIGFuZCB0aGUgcm9vdCB1c2VzIHJ1biBpd2xpc3Qgc2Nhbi4KKwkJICogICAgU28gd2Ugc3dpdGNoIHRvIElFRUU4MDIxMV9MSU5LRURfU0NBTk5JTkcgdG8gcmVtZW1iZXIKKwkJICogICAgdGhhdCB3ZSBhcmUgc3RpbGwgbG9naWNhbGx5IGxpbmtlZCAobm90IGludGVyZXN0ZWQgaW4KKwkJICogICAgbmV3IG5ldHdvcmsgZXZlbnRzLCBkZXNwaXRlIGZvciB1cGRhdGluZyB0aGUgbmV0IGxpc3QsCisJCSAqICAgIGJ1dCB3ZSBhcmUgdGVtcG9yYXJseSAndW5saW5rZWQnIGFzIHRoZSBkcml2ZXIgc2hhbGwKKwkJICogICAgbm90IGZpbHRlciBSWCBmcmFtZXMgYW5kIHRoZSBjaGFubmVsIGlzIGNoYW5naW5nLgorCQkgKiBTbyB0aGUgb25seSBzaXR1YXRpb24gaW4gd2l0Y2ggYXJlIGludGVyZXN0ZWQgaXMgdG8gY2hlY2sKKwkJICogaWYgdGhlIHN0YXRlIGJlY29tZSBMSU5LRUQgYmVjYXVzZSBvZiB0aGUgIzEgc2l0dWF0aW9uCisJCSAqLworCisJCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQorCQkJZ290byBvdXQ7CisJCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgY2gpOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkJaWYoY2hhbm5lbF9tYXBbY2hdID09IDEpCisjZW5kaWYKKwkJaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxdWVzdHMoaWVlZSk7CisKKwkJLyogdGhpcyBwcmV2ZW50IGV4Y2Vzc2l2ZSB0aW1lIHdhaXQgd2hlbiB3ZQorCQkgKiBuZWVkIHRvIHdhaXQgZm9yIGEgc3luY3JvIHNjYW4gdG8gZW5kLi4KKwkJICovCisJCWlmKGllZWUtPnN0YXRlIDwgSUVFRTgwMjExX0xJTktFRCkKKwkJCTsKKwkJZWxzZQorCQlpZiAoaWVlZS0+c3luY19zY2FuX2h1cnJ5dXApCisJCQlnb3RvIG91dDsKKworCisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlX3JzbChJRUVFODAyMTFfU09GVE1BQ19TQ0FOX1RJTUUpOworCisJfQorb3V0OgorCWlmKGllZWUtPnN0YXRlIDwgSUVFRTgwMjExX0xJTktFRCl7CisJCWllZWUtPmFjdHNjYW5uaW5nID0gZmFsc2U7CisJCXVwKCZpZWVlLT5zY2FuX3NlbSk7CisJfQorCWVsc2V7CisJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAwOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpKQorCQlET1QxMURfU2NhbkNvbXBsZXRlKGllZWUpOworI2VuZGlmCisJdXAoJmllZWUtPnNjYW5fc2VtKTsKK30KK30KKworCit2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgc29mdG1hY19zY2FuX3dxKTsKKwlzdGF0aWMgc2hvcnQgd2F0Y2hkb2cgPSAwOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwl1OCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CisJbWVtY3B5KGNoYW5uZWxfbWFwLCBHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7CisjZW5kaWYKKwlpZighaWVlZS0+aWVlZV91cCkKKwkJcmV0dXJuOworCWRvd24oJmllZWUtPnNjYW5fc2VtKTsKKwlkb3sKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPQorCQkJKGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsICsgMSkgJSBNQVhfQ0hBTk5FTF9OVU1CRVI7CisJCWlmICh3YXRjaGRvZysrID4gTUFYX0NIQU5ORUxfTlVNQkVSKQorCQl7CisJCS8vaWYgY3VycmVudCBjaGFubmVsIGlzIG5vdCBpbiBjaGFubmVsIG1hcCwgc2V0IHRvIGRlZmF1bHQgY2hhbm5lbC4KKwkJI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkJCWlmICghY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKKwkJI2Vsc2UKKwkJCWlmICghaWVlZS0+Y2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKKwkJI2VuZGlmCisJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSA2OworCQkJCWdvdG8gb3V0OyAvKiBubyBnb29kIGNoYW5zICovCisJCX0KKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJfXdoaWxlKCFjaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0pOworI2Vsc2UKKwl9d2hpbGUoIWllZWUtPmNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSk7CisjZW5kaWYKKwlpZiAoaWVlZS0+c2Nhbm5pbmcgPT0gMCApCisJCWdvdG8gb3V0OworCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwlpZihjaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0gPT0gMSkKKyNlbmRpZgorCWllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcXVlc3RzKGllZWUpOworCisKKwlxdWV1ZV9kZWxheWVkX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EsIElFRUU4MDIxMV9TT0ZUTUFDX1NDQU5fVElNRSk7CisKKwl1cCgmaWVlZS0+c2Nhbl9zZW0pOworCXJldHVybjsKK291dDoKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKKwkJRE9UMTFEX1NjYW5Db21wbGV0ZShpZWVlKTsKKyNlbmRpZgorCWllZWUtPmFjdHNjYW5uaW5nID0gZmFsc2U7CisJd2F0Y2hkb2cgPSAwOworCWllZWUtPnNjYW5uaW5nID0gMDsKKwl1cCgmaWVlZS0+c2Nhbl9zZW0pOworfQorCisKKwordm9pZCBpZWVlODAyMTFfYmVhY29uc19zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5iZWFjb25fbG9jayxmbGFncyk7CisKKwlpZWVlLT5iZWFjb25fdHhpbmcgPSAxOworCWllZWU4MDIxMV9zZW5kX2JlYWNvbihpZWVlKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKK30KKwordm9pZCBpZWVlODAyMTFfYmVhY29uc19zdG9wKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+YmVhY29uX2xvY2ssZmxhZ3MpOworCisJaWVlZS0+YmVhY29uX3R4aW5nID0gMDsKKwlkZWxfdGltZXJfc3luYygmaWVlZS0+YmVhY29uX3RpbWVyKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKKworfQorCisKK3ZvaWQgaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWlmKGllZWUtPnN0b3Bfc2VuZF9iZWFjb25zKQorCQlpZWVlLT5zdG9wX3NlbmRfYmVhY29ucyhpZWVlLT5kZXYpOworCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0JFQUNPTlMpCisJCWllZWU4MDIxMV9iZWFjb25zX3N0b3AoaWVlZSk7Cit9CisKKwordm9pZCBpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWlmKGllZWUtPnN0YXJ0X3NlbmRfYmVhY29ucykKKwkJaWVlZS0+c3RhcnRfc2VuZF9iZWFjb25zKGllZWUtPmRldixpZWVlLT5iYXNpY19yYXRlKTsKKwlpZihpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0JFQUNPTlMpCisJCWllZWU4MDIxMV9iZWFjb25zX3N0YXJ0KGllZWUpOworfQorCisKK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworLy8JdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8vaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAxOworCisJZG93bigmaWVlZS0+c2Nhbl9zZW0pOworLy8Jc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWlmIChpZWVlLT5zY2FubmluZyA9PSAxKXsKKwkJaWVlZS0+c2Nhbm5pbmcgPSAwOworCisJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPnNvZnRtYWNfc2Nhbl93cSk7CisJfQorCisvLwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJdXAoJmllZWUtPnNjYW5fc2VtKTsKK30KKwordm9pZCBpZWVlODAyMTFfc3RvcF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NDQU4pCisJCWllZWU4MDIxMV9zb2Z0bWFjX3N0b3Bfc2NhbihpZWVlKTsKKwllbHNlCisJCWllZWUtPnN0b3Bfc2NhbihpZWVlLT5kZXYpOworfQorCisvKiBjYWxsZWQgd2l0aCBpZWVlLT5sb2NrIGhlbGQgKi8KK3ZvaWQgaWVlZTgwMjExX3N0YXJ0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkgKQorCXsKKwkJaWYoSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkKKwkJeworCQkJUkVTRVRfQ0lFX1dBVENIRE9HKGllZWUpOworCQl9CisJfQorI2VuZGlmCisJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0NBTil7CisJCWlmIChpZWVlLT5zY2FubmluZyA9PSAwKXsKKwkJCWllZWUtPnNjYW5uaW5nID0gMTsKKwkJCXF1ZXVlX2RlbGF5ZWRfd29yayhpZWVlLT53cSwgJmllZWUtPnNvZnRtYWNfc2Nhbl93cSwgMCk7CisJCX0KKwl9ZWxzZQorCQlpZWVlLT5zdGFydF9zY2FuKGllZWUtPmRldik7CisKK30KKworLyogY2FsbGVkIHdpdGggd3hfc2VtIGhlbGQgKi8KK3ZvaWQgaWVlZTgwMjExX3N0YXJ0X3NjYW5fc3luY3JvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpICkKKwl7CisJCWlmKElTX0NPVU5UUllfSUVfVkFMSUQoaWVlZSkpCisJCXsKKwkJCVJFU0VUX0NJRV9XQVRDSERPRyhpZWVlKTsKKwkJfQorCX0KKyNlbmRpZgorCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMDsKKwlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TQ0FOKQorCQlpZWVlODAyMTFfc29mdG1hY19zY2FuX3N5bmNybyhpZWVlKTsKKwllbHNlCisJCWllZWUtPnNjYW5fc3luY3JvKGllZWUtPmRldik7CisKK30KKworaW5saW5lIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfYXV0aGVudGljYXRpb25fcmVxKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uLAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBpbnQgY2hhbGxlbmdlbGVuKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqYXV0aDsKKwlpbnQgbGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pICsgY2hhbGxlbmdlbGVuICsgaWVlZS0+dHhfaGVhZHJvb207CisKKworCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKKwlpZiAoIXNrYikgcmV0dXJuIE5VTEw7CisKKwlza2JfcmVzZXJ2ZShza2IsIGllZWUtPnR4X2hlYWRyb29tKTsKKwlhdXRoID0gKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gKikKKwkJc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKSk7CisKKwlhdXRoLT5oZWFkZXIuZnJhbWVfY3RsID0gSUVFRTgwMjExX1NUWVBFX0FVVEg7CisJaWYgKGNoYWxsZW5nZWxlbikgYXV0aC0+aGVhZGVyLmZyYW1lX2N0bCB8PSBJRUVFODAyMTFfRkNUTF9XRVA7CisKKwlhdXRoLT5oZWFkZXIuZHVyYXRpb25faWQgPSAweDAxM2E7IC8vRklYTUUKKworCW1lbWNweShhdXRoLT5oZWFkZXIuYWRkcjEsIGJlYWNvbi0+YnNzaWQsIEVUSF9BTEVOKTsKKwltZW1jcHkoYXV0aC0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGF1dGgtPmhlYWRlci5hZGRyMywgYmVhY29uLT5ic3NpZCwgRVRIX0FMRU4pOworCisJLy9hdXRoLT5hbGdvcml0aG0gPSBpZWVlLT5vcGVuX3dlcCA/IFdMQU5fQVVUSF9PUEVOIDogV0xBTl9BVVRIX1NIQVJFRF9LRVk7CisJaWYoaWVlZS0+YXV0aF9tb2RlID09IDApCisJCWF1dGgtPmFsZ29yaXRobSA9IFdMQU5fQVVUSF9PUEVOOworCWVsc2UgaWYoaWVlZS0+YXV0aF9tb2RlID09IDEpCisJCWF1dGgtPmFsZ29yaXRobSA9IFdMQU5fQVVUSF9TSEFSRURfS0VZOworCWVsc2UgaWYoaWVlZS0+YXV0aF9tb2RlID09IDIpCisJCWF1dGgtPmFsZ29yaXRobSA9IFdMQU5fQVVUSF9PUEVOOy8vMHg4MDsKKwlwcmludGsoIj09PT09PT09PT09PT09PT09PiVzKCk6YXV0aC0+YWxnb3JpdGhtIGlzICVkXG4iLF9fRlVOQ1RJT05fXyxhdXRoLT5hbGdvcml0aG0pOworCWF1dGgtPnRyYW5zYWN0aW9uID0gY3B1X3RvX2xlMTYoaWVlZS0+YXNzb2NpYXRlX3NlcSk7CisJaWVlZS0+YXNzb2NpYXRlX3NlcSsrOworCisJYXV0aC0+c3RhdHVzID0gY3B1X3RvX2xlMTYoV0xBTl9TVEFUVVNfU1VDQ0VTUyk7CisKKwlyZXR1cm4gc2tiOworCit9CisKKworc3RhdGljIHN0cnVjdCBza19idWZmKiBpZWVlODAyMTFfcHJvYmVfcmVzcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmRlc3QpCit7CisJdTggKnRhZzsKKwlpbnQgYmVhY29uX3NpemU7CisJc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqYmVhY29uX2J1ZjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlpbnQgZW5jcnlwdDsKKwlpbnQgYXRpbV9sZW4sZXJwX2xlbjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEqIGNyeXB0OworCisJY2hhciAqc3NpZCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkOworCWludCBzc2lkX2xlbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbjsKKwlpbnQgcmF0ZV9sZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfbGVuKzI7CisJaW50IHJhdGVfZXhfbGVuID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4X2xlbjsKKwlpbnQgd3BhX2llX2xlbiA9IGllZWUtPndwYV9pZV9sZW47CisJdTggZXJwaW5mb19jb250ZW50ID0gMDsKKworCXU4KiB0bXBfaHRfY2FwX2J1ZjsKKwl1OCB0bXBfaHRfY2FwX2xlbj0wOworCXU4KiB0bXBfaHRfaW5mb19idWY7CisJdTggdG1wX2h0X2luZm9fbGVuPTA7CisJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKwl1OCogdG1wX2dlbmVyaWNfaWVfYnVmPU5VTEw7CisJdTggdG1wX2dlbmVyaWNfaWVfbGVuPTA7CisKKwlpZihyYXRlX2V4X2xlbiA+IDApIHJhdGVfZXhfbGVuKz0yOworCisJaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUykKKwkJYXRpbV9sZW4gPSA0OworCWVsc2UKKwkJYXRpbV9sZW4gPSAwOworCisJaWYoaWVlZTgwMjExX2lzXzU0ZyhpZWVlLT5jdXJyZW50X25ldHdvcmspKQorCQllcnBfbGVuID0gMzsKKwllbHNlCisJCWVycF9sZW4gPSAwOworCisKKwljcnlwdCA9IGllZWUtPmNyeXB0W2llZWUtPnR4X2tleWlkeF07CisKKworCWVuY3J5cHQgPSBpZWVlLT5ob3N0X2VuY3J5cHQgJiYgY3J5cHQgJiYgY3J5cHQtPm9wcyAmJgorCQkoKDAgPT0gc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsICJXRVAiKSB8fCB3cGFfaWVfbGVuKSk7CisJLy9IVCByYWxhdGVkIGVsZW1lbnQKKwl0bXBfaHRfY2FwX2J1ZiA9KHU4KikgJihpZWVlLT5wSFRJbmZvLT5TZWxmSFRDYXApOworCXRtcF9odF9jYXBfbGVuID0gc2l6ZW9mKGllZWUtPnBIVEluZm8tPlNlbGZIVENhcCk7CisJdG1wX2h0X2luZm9fYnVmID0odTgqKSAmKGllZWUtPnBIVEluZm8tPlNlbGZIVEluZm8pOworCXRtcF9odF9pbmZvX2xlbiA9IHNpemVvZihpZWVlLT5wSFRJbmZvLT5TZWxmSFRJbmZvKTsKKwlIVENvbnN0cnVjdENhcGFiaWxpdHlFbGVtZW50KGllZWUsIHRtcF9odF9jYXBfYnVmLCAmdG1wX2h0X2NhcF9sZW4sZW5jcnlwdCk7CisJSFRDb25zdHJ1Y3RJbmZvRWxlbWVudChpZWVlLHRtcF9odF9pbmZvX2J1ZiwmdG1wX2h0X2luZm9fbGVuLCBlbmNyeXB0KTsKKworCisJaWYocEhUSW5mby0+YlJlZ1JUMlJUQWdncmVnYXRpb24pCisJeworCQl0bXBfZ2VuZXJpY19pZV9idWYgPSBpZWVlLT5wSFRJbmZvLT5zelJUMlJUQWdnQnVmZmVyOworCQl0bXBfZ2VuZXJpY19pZV9sZW4gPSBzaXplb2YoaWVlZS0+cEhUSW5mby0+c3pSVDJSVEFnZ0J1ZmZlcik7CisJCUhUQ29uc3RydWN0UlQyUlRBZ2dFbGVtZW50KGllZWUsIHRtcF9nZW5lcmljX2llX2J1ZiwgJnRtcF9nZW5lcmljX2llX2xlbik7CisJfQorLy8JcHJpbnRrKCI9PT09PT09PT09PT09PT0+dG1wX2h0X2NhcF9sZW4gaXMgJWQsdG1wX2h0X2luZm9fbGVuIGlzICVkLCB0bXBfZ2VuZXJpY19pZV9sZW4gaXMgJWRcbiIsdG1wX2h0X2NhcF9sZW4sdG1wX2h0X2luZm9fbGVuLHRtcF9nZW5lcmljX2llX2xlbik7CisJYmVhY29uX3NpemUgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSkrMisKKwkJc3NpZF9sZW4KKwkJKzMgLy9jaGFubmVsCisJCStyYXRlX2xlbgorCQkrcmF0ZV9leF9sZW4KKwkJK2F0aW1fbGVuCisJCStlcnBfbGVuCisJCSt3cGFfaWVfbGVuCisJLy8JK3RtcF9odF9jYXBfbGVuCisJLy8JK3RtcF9odF9pbmZvX2xlbgorCS8vCSt0bXBfZ2VuZXJpY19pZV9sZW4KKy8vCQkrd21tX2xlbisyCisJCStpZWVlLT50eF9oZWFkcm9vbTsKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGJlYWNvbl9zaXplKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisJc2tiX3Jlc2VydmUoc2tiLCBpZWVlLT50eF9oZWFkcm9vbSk7CisJYmVhY29uX2J1ZiA9IChzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlKikgc2tiX3B1dChza2IsIChiZWFjb25fc2l6ZSAtIGllZWUtPnR4X2hlYWRyb29tKSk7CisJbWVtY3B5IChiZWFjb25fYnVmLT5oZWFkZXIuYWRkcjEsIGRlc3QsRVRIX0FMRU4pOworCW1lbWNweSAoYmVhY29uX2J1Zi0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5IChiZWFjb25fYnVmLT5oZWFkZXIuYWRkcjMsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOworCisJYmVhY29uX2J1Zi0+aGVhZGVyLmR1cmF0aW9uX2lkID0gMDsgLy9GSVhNRQorCWJlYWNvbl9idWYtPmJlYWNvbl9pbnRlcnZhbCA9CisJCWNwdV90b19sZTE2KGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwpOworCWJlYWNvbl9idWYtPmNhcGFiaWxpdHkgPQorCQljcHVfdG9fbGUxNihpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKTsKKwliZWFjb25fYnVmLT5jYXBhYmlsaXR5IHw9CisJCWNwdV90b19sZTE2KGllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFKTsgLy9hZGQgc2hvcnQgcHJlYW1ibGUgaGVyZQorCisJaWYoaWVlZS0+c2hvcnRfc2xvdCAmJiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVCkpCisJCWNwdV90b19sZTE2KChiZWFjb25fYnVmLT5jYXBhYmlsaXR5IHw9IFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UKSk7CisKKwljcnlwdCA9IGllZWUtPmNyeXB0W2llZWUtPnR4X2tleWlkeF07CisJaWYgKGVuY3J5cHQpCisJCWJlYWNvbl9idWYtPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpOworCisKKwliZWFjb25fYnVmLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1ApOworCWJlYWNvbl9idWYtPmluZm9fZWxlbWVudFswXS5pZCA9IE1GSUVfVFlQRV9TU0lEOworCWJlYWNvbl9idWYtPmluZm9fZWxlbWVudFswXS5sZW4gPSBzc2lkX2xlbjsKKworCXRhZyA9ICh1OCopIGJlYWNvbl9idWYtPmluZm9fZWxlbWVudFswXS5kYXRhOworCisJbWVtY3B5KHRhZywgc3NpZCwgc3NpZF9sZW4pOworCisJdGFnICs9IHNzaWRfbGVuOworCisJKih0YWcrKykgPSBNRklFX1RZUEVfUkFURVM7CisJKih0YWcrKykgPSByYXRlX2xlbi0yOworCW1lbWNweSh0YWcsaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzLHJhdGVfbGVuLTIpOworCXRhZys9cmF0ZV9sZW4tMjsKKworCSoodGFnKyspID0gTUZJRV9UWVBFX0RTX1NFVDsKKwkqKHRhZysrKSA9IDE7CisJKih0YWcrKykgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbDsKKworCWlmKGF0aW1fbGVuKXsKKwl1MTYgdmFsMTY7CisJCSoodGFnKyspID0gTUZJRV9UWVBFX0lCU1NfU0VUOworCQkqKHRhZysrKSA9IDI7CisJCS8vKigodTE2KikodGFnKSkgPSBjcHVfdG9fbGUxNihpZWVlLT5jdXJyZW50X25ldHdvcmsuYXRpbV93aW5kb3cpOworCQkgdmFsMTYgPSBjcHVfdG9fbGUxNihpZWVlLT5jdXJyZW50X25ldHdvcmsuYXRpbV93aW5kb3cpOworCQltZW1jcHkoKHU4ICopdGFnLCAodTggKikmdmFsMTYsIDIpOworCQl0YWcrPTI7CisJfQorCisJaWYoZXJwX2xlbil7CisJCSoodGFnKyspID0gTUZJRV9UWVBFX0VSUDsKKwkJKih0YWcrKykgPSAxOworCQkqKHRhZysrKSA9IGVycGluZm9fY29udGVudDsKKwl9CisJaWYocmF0ZV9leF9sZW4peworCQkqKHRhZysrKSA9IE1GSUVfVFlQRV9SQVRFU19FWDsKKwkJKih0YWcrKykgPSByYXRlX2V4X2xlbi0yOworCQltZW1jcHkodGFnLGllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leCxyYXRlX2V4X2xlbi0yKTsKKwkJdGFnKz1yYXRlX2V4X2xlbi0yOworCX0KKworCWlmICh3cGFfaWVfbGVuKQorCXsKKwkJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykKKwkJey8vYXMgV2luZG93cyB3aWxsIHNldCBwYWlyd2lzZSBrZXkgc2FtZSBhcyB0aGUgZ3JvdXAga2V5IHdoaWNoIGlzIG5vdCBhbGxvd2VkIGluIExpbnV4LCBzbyBzZXQgdGhpcyBmb3IgSU9UIGlzc3VlLiBXQiAyMDA4LjA3LjA3CisJCQltZW1jcHkoJmllZWUtPndwYV9pZVsxNF0sICZpZWVlLT53cGFfaWVbOF0sIDQpOworCQl9CisJCW1lbWNweSh0YWcsIGllZWUtPndwYV9pZSwgaWVlZS0+d3BhX2llX2xlbik7CisJCXRhZyArPSB3cGFfaWVfbGVuOworCX0KKworCS8vc2tiLT5kZXYgPSBpZWVlLT5kZXY7CisJcmV0dXJuIHNrYjsKK30KKworCitzdHJ1Y3Qgc2tfYnVmZiogaWVlZTgwMjExX2Fzc29jX3Jlc3Aoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpkZXN0KQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdTgqIHRhZzsKKworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSogY3J5cHQ7CisJc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSAqYXNzb2M7CisJc2hvcnQgZW5jcnlwdDsKKworCXVuc2lnbmVkIGludCByYXRlX2xlbiA9IGllZWU4MDIxMV9NRklFX3JhdGVfbGVuKGllZWUpOworCWludCBsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSkgKyByYXRlX2xlbiArIGllZWUtPnR4X2hlYWRyb29tOworCisJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pOworCisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJc2tiX3Jlc2VydmUoc2tiLCBpZWVlLT50eF9oZWFkcm9vbSk7CisKKwlhc3NvYyA9IChzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICopCisJCXNrYl9wdXQoc2tiLHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKSk7CisKKwlhc3NvYy0+aGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQKTsKKwltZW1jcHkoYXNzb2MtPmhlYWRlci5hZGRyMSwgZGVzdCxFVEhfQUxFTik7CisJbWVtY3B5KGFzc29jLT5oZWFkZXIuYWRkcjMsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoYXNzb2MtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCWFzc29jLT5jYXBhYmlsaXR5ID0gY3B1X3RvX2xlMTYoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUiA/CisJCVdMQU5fQ0FQQUJJTElUWV9CU1MgOiBXTEFOX0NBUEFCSUxJVFlfSUJTUyk7CisKKworCWlmKGllZWUtPnNob3J0X3Nsb3QpCisJCWFzc29jLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UKTsKKworCWlmIChpZWVlLT5ob3N0X2VuY3J5cHQpCisJCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKKwllbHNlIGNyeXB0ID0gTlVMTDsKKworCWVuY3J5cHQgPSAoIGNyeXB0ICYmIGNyeXB0LT5vcHMpOworCisJaWYgKGVuY3J5cHQpCisJCWFzc29jLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKTsKKworCWFzc29jLT5zdGF0dXMgPSAwOworCWFzc29jLT5haWQgPSBjcHVfdG9fbGUxNihpZWVlLT5hc3NvY19pZCk7CisJaWYgKGllZWUtPmFzc29jX2lkID09IDB4MjAwNykgaWVlZS0+YXNzb2NfaWQ9MDsKKwllbHNlIGllZWUtPmFzc29jX2lkKys7CisKKwl0YWcgPSAodTgqKSBza2JfcHV0KHNrYiwgcmF0ZV9sZW4pOworCisJaWVlZTgwMjExX01GSUVfQnJhdGUoaWVlZSwgJnRhZyk7CisJaWVlZTgwMjExX01GSUVfR3JhdGUoaWVlZSwgJnRhZyk7CisKKwlyZXR1cm4gc2tiOworfQorCitzdHJ1Y3Qgc2tfYnVmZiogaWVlZTgwMjExX2F1dGhfcmVzcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSxpbnQgc3RhdHVzLCB1OCAqZGVzdCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gKmF1dGg7CisJaW50IGxlbiA9IGllZWUtPnR4X2hlYWRyb29tICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pKzE7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbik7CisKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwlza2ItPmxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKTsKKworCWF1dGggPSAoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqKXNrYi0+ZGF0YTsKKworCWF1dGgtPnN0YXR1cyA9IGNwdV90b19sZTE2KHN0YXR1cyk7CisJYXV0aC0+dHJhbnNhY3Rpb24gPSBjcHVfdG9fbGUxNigyKTsKKwlhdXRoLT5hbGdvcml0aG0gPSBjcHVfdG9fbGUxNihXTEFOX0FVVEhfT1BFTik7CisKKwltZW1jcHkoYXV0aC0+aGVhZGVyLmFkZHIzLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGF1dGgtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShhdXRoLT5oZWFkZXIuYWRkcjEsIGRlc3QsIEVUSF9BTEVOKTsKKwlhdXRoLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0FVVEgpOworCXJldHVybiBza2I7CisKKworfQorCitzdHJ1Y3Qgc2tfYnVmZiogaWVlZTgwMjExX251bGxfZnVuYyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSxzaG9ydCBwd3IpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciogaGRyOworCisJc2tiID0gZGV2X2FsbG9jX3NrYihzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKTsKKworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciopc2tiX3B1dChza2Isc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7CisKKwltZW1jcHkoaGRyLT5hZGRyMSwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KGhkci0+YWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoaGRyLT5hZGRyMywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisKKwloZHItPmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9EQVRBIHwKKwkJSUVFRTgwMjExX1NUWVBFX05VTExGVU5DIHwgSUVFRTgwMjExX0ZDVExfVE9EUyB8CisJCShwd3IgPyBJRUVFODAyMTFfRkNUTF9QTTowKSk7CisKKwlyZXR1cm4gc2tiOworCisKK30KKworCit2b2lkIGllZWU4MDIxMV9yZXNwX3RvX2Fzc29jX3JxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCogZGVzdCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gaWVlZTgwMjExX2Fzc29jX3Jlc3AoaWVlZSwgZGVzdCk7CisKKwlpZiAoYnVmKQorCQlzb2Z0bWFjX21nbXRfeG1pdChidWYsIGllZWUpOworfQorCisKK3ZvaWQgaWVlZTgwMjExX3Jlc3BfdG9fYXV0aChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IHMsIHU4KiBkZXN0KQoreworCXN0cnVjdCBza19idWZmICpidWYgPSBpZWVlODAyMTFfYXV0aF9yZXNwKGllZWUsIHMsIGRlc3QpOworCisJaWYgKGJ1ZikKKwkJc29mdG1hY19tZ210X3htaXQoYnVmLCBpZWVlKTsKK30KKworCit2b2lkIGllZWU4MDIxMV9yZXNwX3RvX3Byb2JlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqZGVzdCkKK3sKKworCisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGllZWU4MDIxMV9wcm9iZV9yZXNwKGllZWUsIGRlc3QpOworCWlmIChidWYpCisJCXNvZnRtYWNfbWdtdF94bWl0KGJ1ZiwgaWVlZSk7Cit9CisKKworaW5saW5lIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfYXNzb2NpYXRpb25fcmVxKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uLHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJLy91bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lICpoZHI7CisJdTggKnRhZzsvLywqcnNuX2llOworCS8vc2hvcnQgaW5mb19hZGRyID0gMDsKKwkvL2ludCBpOworCS8vdTE2IHN1aXRlX2NvdW50ID0gMDsKKwkvL3U4IHN1aXRfc2VsZWN0ID0gMDsKKwkvL3Vuc2lnbmVkIGludCB3cGFfbGVuID0gYmVhY29uLT53cGFfaWVfbGVuOworCS8vZm9yIEhUCisJdTgqIGh0X2NhcF9idWYgPSBOVUxMOworCXU4IGh0X2NhcF9sZW49MDsKKwl1OCogcmVhbHRla19pZV9idWY9TlVMTDsKKwl1OCByZWFsdGVrX2llX2xlbj0wOworCWludCB3cGFfaWVfbGVuPSBpZWVlLT53cGFfaWVfbGVuOworCXVuc2lnbmVkIGludCBja2lwX2llX2xlbj0wOworCXVuc2lnbmVkIGludCBjY3hybV9pZV9sZW49MDsKKwl1bnNpZ25lZCBpbnQgY3h2ZXJudW1faWVfbGVuPTA7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKiBjcnlwdDsKKwlpbnQgZW5jcnlwdDsKKworCXVuc2lnbmVkIGludCByYXRlX2xlbiA9IGllZWU4MDIxMV9NRklFX3JhdGVfbGVuKGllZWUpOworCXVuc2lnbmVkIGludCB3bW1faW5mb19sZW4gPSBiZWFjb24tPnFvc19kYXRhLnN1cHBvcnRlZD85OjA7CisjaWZkZWYgVEhPTUFTX1RVUkJPCisJdW5zaWduZWQgaW50IHR1cmJvX2luZm9fbGVuID0gYmVhY29uLT5UdXJib19FbmFibGU/OTowOworI2VuZGlmCisKKwlpbnQgbGVuID0gMDsKKworCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKKwllbmNyeXB0ID0gaWVlZS0+aG9zdF9lbmNyeXB0ICYmIGNyeXB0ICYmIGNyeXB0LT5vcHMgJiYgKCgwID09IHN0cmNtcChjcnlwdC0+b3BzLT5uYW1lLCJXRVAiKSB8fCB3cGFfaWVfbGVuKSk7CisKKwkvL0luY2x1ZGUgSGlnaCBUaHJvdXB1dCBjYXBhYmlsaXR5ICYmIFJlYWx0ZWsgcHJvcHJpZXRhcnkKKwlpZihpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCYmaWVlZS0+cEhUSW5mby0+YkVuYWJsZUhUKQorCXsKKwkJaHRfY2FwX2J1ZiA9ICh1OCopJihpZWVlLT5wSFRJbmZvLT5TZWxmSFRDYXApOworCQlodF9jYXBfbGVuID0gc2l6ZW9mKGllZWUtPnBIVEluZm8tPlNlbGZIVENhcCk7CisJCUhUQ29uc3RydWN0Q2FwYWJpbGl0eUVsZW1lbnQoaWVlZSwgaHRfY2FwX2J1ZiwgJmh0X2NhcF9sZW4sIGVuY3J5cHQpOworCQlpZihpZWVlLT5wSFRJbmZvLT5iQ3VycmVudFJUMlJUQWdncmVnYXRpb24pCisJCXsKKwkJCXJlYWx0ZWtfaWVfYnVmID0gaWVlZS0+cEhUSW5mby0+c3pSVDJSVEFnZ0J1ZmZlcjsKKwkJCXJlYWx0ZWtfaWVfbGVuID0gc2l6ZW9mKCBpZWVlLT5wSFRJbmZvLT5zelJUMlJUQWdnQnVmZmVyKTsKKwkJCUhUQ29uc3RydWN0UlQyUlRBZ2dFbGVtZW50KGllZWUsIHJlYWx0ZWtfaWVfYnVmLCAmcmVhbHRla19pZV9sZW4pOworCisJCX0KKwl9CisJaWYoaWVlZS0+cW9zX3N1cHBvcnQpeworCQl3bW1faW5mb19sZW4gPSBiZWFjb24tPnFvc19kYXRhLnN1cHBvcnRlZD85OjA7CisJfQorCisKKwlpZihiZWFjb24tPmJDa2lwU3VwcG9ydGVkKQorCXsKKwkJY2tpcF9pZV9sZW4gPSAzMCsyOworCX0KKwlpZihiZWFjb24tPmJDY3hSbUVuYWJsZSkKKwl7CisJCWNjeHJtX2llX2xlbiA9IDYrMjsKKwl9CisJaWYoIGJlYWNvbi0+QnNzQ2N4VmVyTnVtYmVyID49IDIgKQorCXsKKwkJY3h2ZXJudW1faWVfbGVuID0gNSsyOworCX0KKyNpZmRlZiBUSE9NQVNfVFVSQk8KKwlsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lKSsgMgorCQkrIGJlYWNvbi0+c3NpZF9sZW4vL2Vzc2lkIHRhZ2dlZCB2YWwKKwkJKyByYXRlX2xlbi8vcmF0ZXMgdGFnZ2VkIHZhbAorCQkrIHdwYV9pZV9sZW4KKwkJKyB3bW1faW5mb19sZW4KKwkJKyB0dXJib19pbmZvX2xlbgorCQkrIGh0X2NhcF9sZW4KKwkJKyByZWFsdGVrX2llX2xlbgorCQkrIGNraXBfaWVfbGVuCisJCSsgY2N4cm1faWVfbGVuCisJCSsgY3h2ZXJudW1faWVfbGVuCisJCSsgaWVlZS0+dHhfaGVhZHJvb207CisjZWxzZQorCWxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUpKyAyCisJCSsgYmVhY29uLT5zc2lkX2xlbi8vZXNzaWQgdGFnZ2VkIHZhbAorCQkrIHJhdGVfbGVuLy9yYXRlcyB0YWdnZWQgdmFsCisJCSsgd3BhX2llX2xlbgorCQkrIHdtbV9pbmZvX2xlbgorCQkrIGh0X2NhcF9sZW4KKwkJKyByZWFsdGVrX2llX2xlbgorCQkrIGNraXBfaWVfbGVuCisJCSsgY2N4cm1faWVfbGVuCisJCSsgY3h2ZXJudW1faWVfbGVuCisJCSsgaWVlZS0+dHhfaGVhZHJvb207CisjZW5kaWYKKworCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKKworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCXNrYl9yZXNlcnZlKHNrYiwgaWVlZS0+dHhfaGVhZHJvb20pOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSAqKQorCQlza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSkrMik7CisKKworCWhkci0+aGVhZGVyLmZyYW1lX2N0bCA9IElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVE7CisJaGRyLT5oZWFkZXIuZHVyYXRpb25faWQ9IDM3OyAvL0ZJWE1FCisJbWVtY3B5KGhkci0+aGVhZGVyLmFkZHIxLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KGhkci0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGhkci0+aGVhZGVyLmFkZHIzLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7CisKKwltZW1jcHkoaWVlZS0+YXBfbWFjX2FkZHIsIGJlYWNvbi0+YnNzaWQsIEVUSF9BTEVOKTsvL2ZvciBIVyBzZWN1cml0eSwgSm9obgorCisJaGRyLT5jYXBhYmlsaXR5ID0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX0JTUyk7CisJaWYgKGJlYWNvbi0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZICkKKwkJaGRyLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKTsKKworCWlmIChiZWFjb24tPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpCisJCWhkci0+Y2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpOyAvL2FkZCBzaG9ydF9wcmVhbWJsZSBoZXJlCisKKwlpZihpZWVlLT5zaG9ydF9zbG90KQorCQloZHItPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QpOworCWlmICh3bW1faW5mb19sZW4pIC8vUU9TCisJaGRyLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9RT1MpOworCisJaGRyLT5saXN0ZW5faW50ZXJ2YWwgPSAweGE7IC8vRklYTUUKKworCWhkci0+aW5mb19lbGVtZW50WzBdLmlkID0gTUZJRV9UWVBFX1NTSUQ7CisKKwloZHItPmluZm9fZWxlbWVudFswXS5sZW4gPSBiZWFjb24tPnNzaWRfbGVuOworCXRhZyA9IHNrYl9wdXQoc2tiLCBiZWFjb24tPnNzaWRfbGVuKTsKKwltZW1jcHkodGFnLCBiZWFjb24tPnNzaWQsIGJlYWNvbi0+c3NpZF9sZW4pOworCisJdGFnID0gc2tiX3B1dChza2IsIHJhdGVfbGVuKTsKKworCWllZWU4MDIxMV9NRklFX0JyYXRlKGllZWUsICZ0YWcpOworCWllZWU4MDIxMV9NRklFX0dyYXRlKGllZWUsICZ0YWcpOworCS8vIEZvciBDQ1ggMSBTMTMsIENLSVAuIEFkZGVkIGJ5IEFubmllLCAyMDA2LTA4LTE0LgorCWlmKCBiZWFjb24tPmJDa2lwU3VwcG9ydGVkICkKKwl7CisJCXN0YXRpYyB1OAlBaXJvbmV0SWVPdWlbXSA9IHsweDAwLCAweDAxLCAweDY2fTsgLy8gIjQ1MDAtY2xpZW50IgorCQl1OAlDY3hBaXJvbmV0QnVmWzMwXTsKKwkJT0NURVRfU1RSSU5HCW9zQ2N4QWlyb25ldElFOworCisJCW1lbXNldChDY3hBaXJvbmV0QnVmLCAwLDMwKTsKKwkJb3NDY3hBaXJvbmV0SUUuT2N0ZXQgPSBDY3hBaXJvbmV0QnVmOworCQlvc0NjeEFpcm9uZXRJRS5MZW5ndGggPSBzaXplb2YoQ2N4QWlyb25ldEJ1Zik7CisJCS8vCisJCS8vIFJlZi4gQ0NYIHRlc3QgcGxhbiB2My42MSwgMy4yLjMuMSBzdGVwIDEzLgorCQkvLyBXZSB3YW50IHRvIG1ha2UgdGhlIGRldmljZSB0eXBlIGFzICI0NTAwLWNsaWVudCIuIDA2MDkyNiwgYnkgQ0NXLgorCQkvLworCQltZW1jcHkob3NDY3hBaXJvbmV0SUUuT2N0ZXQsIEFpcm9uZXRJZU91aSwgc2l6ZW9mKEFpcm9uZXRJZU91aSkpOworCisJCS8vIENDWDEgc3BlYyBWMS4xMywgQTAxLjEgQ0tJUCBOZWdvdGlhdGlvbiAocGFnZTIzKToKKwkJLy8gIlRoZSBDS0lQIG5lZ290aWF0aW9uIGlzIHN0YXJ0ZWQgd2l0aCB0aGUgYXNzb2NpYXRlIHJlcXVlc3QgZnJvbSB0aGUgY2xpZW50IHRvIHRoZSBhY2Nlc3MgcG9pbnQsCisJCS8vICBjb250YWluaW5nIGFuIEFpcm9uZXQgZWxlbWVudCB3aXRoIGJvdGggdGhlIE1JQyBhbmQgS1AgYml0cyBzZXQuIgorCQlvc0NjeEFpcm9uZXRJRS5PY3RldFtJRV9DSVNDT19GTEFHX1BPU0lUSU9OXSB8PSAgKFNVUFBPUlRfQ0tJUF9QS3xTVVBQT1JUX0NLSVBfTUlDKSA7CisJCXRhZyA9IHNrYl9wdXQoc2tiLCBja2lwX2llX2xlbik7CisJCSp0YWcrKyA9IE1GSUVfVFlQRV9BSVJPTkVUOworCQkqdGFnKysgPSBvc0NjeEFpcm9uZXRJRS5MZW5ndGg7CisJCW1lbWNweSh0YWcsb3NDY3hBaXJvbmV0SUUuT2N0ZXQsb3NDY3hBaXJvbmV0SUUuTGVuZ3RoKTsKKwkJdGFnICs9IG9zQ2N4QWlyb25ldElFLkxlbmd0aDsKKwl9CisKKwlpZihiZWFjb24tPmJDY3hSbUVuYWJsZSkKKwl7CisJCXN0YXRpYyB1OCBDY3hSbUNhcEJ1ZltdID0gezB4MDAsIDB4NDAsIDB4OTYsIDB4MDEsIDB4MDEsIDB4MDB9OworCQlPQ1RFVF9TVFJJTkcgb3NDY3hSbUNhcDsKKworCQlvc0NjeFJtQ2FwLk9jdGV0ID0gQ2N4Um1DYXBCdWY7CisJCW9zQ2N4Um1DYXAuTGVuZ3RoID0gc2l6ZW9mKENjeFJtQ2FwQnVmKTsKKwkJdGFnID0gc2tiX3B1dChza2IsY2N4cm1faWVfbGVuKTsKKwkJKnRhZysrID0gTUZJRV9UWVBFX0dFTkVSSUM7CisJCSp0YWcrKyA9IG9zQ2N4Um1DYXAuTGVuZ3RoOworCQltZW1jcHkodGFnLG9zQ2N4Um1DYXAuT2N0ZXQsb3NDY3hSbUNhcC5MZW5ndGgpOworCQl0YWcgKz0gb3NDY3hSbUNhcC5MZW5ndGg7CisJfQorCisJaWYoIGJlYWNvbi0+QnNzQ2N4VmVyTnVtYmVyID49IDIgKQorCXsKKwkJdTgJCQlDY3hWZXJOdW1CdWZbXSA9IHsweDAwLCAweDQwLCAweDk2LCAweDAzLCAweDAwfTsKKwkJT0NURVRfU1RSSU5HCW9zQ2N4VmVyTnVtOworCQlDY3hWZXJOdW1CdWZbNF0gPSBiZWFjb24tPkJzc0NjeFZlck51bWJlcjsKKwkJb3NDY3hWZXJOdW0uT2N0ZXQgPSBDY3hWZXJOdW1CdWY7CisJCW9zQ2N4VmVyTnVtLkxlbmd0aCA9IHNpemVvZihDY3hWZXJOdW1CdWYpOworCQl0YWcgPSBza2JfcHV0KHNrYixjeHZlcm51bV9pZV9sZW4pOworCQkqdGFnKysgPSBNRklFX1RZUEVfR0VORVJJQzsKKwkJKnRhZysrID0gb3NDY3hWZXJOdW0uTGVuZ3RoOworCQltZW1jcHkodGFnLG9zQ2N4VmVyTnVtLk9jdGV0LG9zQ2N4VmVyTnVtLkxlbmd0aCk7CisJCXRhZyArPSBvc0NjeFZlck51bS5MZW5ndGg7CisJfQorCS8vSFQgY2FwIGVsZW1lbnQKKwlpZihpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCYmaWVlZS0+cEhUSW5mby0+YkVuYWJsZUhUKXsKKwkJaWYoaWVlZS0+cEhUSW5mby0+ZVBlZXJIVFNwZWNWZXIgIT0gSFRfU1BFQ19WRVJfRVdDKQorCQl7CisJCQl0YWcgPSBza2JfcHV0KHNrYiwgaHRfY2FwX2xlbik7CisJCQkqdGFnKysgPSBNRklFX1RZUEVfSFRfQ0FQOworCQkJKnRhZysrID0gaHRfY2FwX2xlbiAtIDI7CisJCQltZW1jcHkodGFnLCBodF9jYXBfYnVmLGh0X2NhcF9sZW4gLTIpOworCQkJdGFnICs9IGh0X2NhcF9sZW4gLTI7CisJCX0KKwl9CisKKworCS8vY2hvb3NlIHdoYXQgd3BhX3N1cHBsaWNhbnQgZ2l2ZXMgdG8gYXNzb2NpYXRlLgorCXRhZyA9IHNrYl9wdXQoc2tiLCB3cGFfaWVfbGVuKTsKKwlpZiAod3BhX2llX2xlbil7CisJCW1lbWNweSh0YWcsIGllZWUtPndwYV9pZSwgaWVlZS0+d3BhX2llX2xlbik7CisJfQorCisJdGFnID0gc2tiX3B1dChza2Isd21tX2luZm9fbGVuKTsKKwlpZih3bW1faW5mb19sZW4pIHsKKwkgIGllZWU4MDIxMV9XTU1fSW5mbyhpZWVlLCAmdGFnKTsKKwl9CisjaWZkZWYgVEhPTUFTX1RVUkJPCisJdGFnID0gc2tiX3B1dChza2IsdHVyYm9faW5mb19sZW4pOworCWlmKHR1cmJvX2luZm9fbGVuKSB7CisJCWllZWU4MDIxMV9UVVJCT19JbmZvKGllZWUsICZ0YWcpOworCX0KKyNlbmRpZgorCisJaWYoaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQmJmllZWUtPnBIVEluZm8tPmJFbmFibGVIVCl7CisJCWlmKGllZWUtPnBIVEluZm8tPmVQZWVySFRTcGVjVmVyID09IEhUX1NQRUNfVkVSX0VXQykKKwkJeworCQkJdGFnID0gc2tiX3B1dChza2IsIGh0X2NhcF9sZW4pOworCQkJKnRhZysrID0gTUZJRV9UWVBFX0dFTkVSSUM7CisJCQkqdGFnKysgPSBodF9jYXBfbGVuIC0gMjsKKwkJCW1lbWNweSh0YWcsIGh0X2NhcF9idWYsaHRfY2FwX2xlbiAtIDIpOworCQkJdGFnICs9IGh0X2NhcF9sZW4gLTI7CisJCX0KKworCQlpZihpZWVlLT5wSFRJbmZvLT5iQ3VycmVudFJUMlJUQWdncmVnYXRpb24peworCQkJdGFnID0gc2tiX3B1dChza2IsIHJlYWx0ZWtfaWVfbGVuKTsKKwkJCSp0YWcrKyA9IE1GSUVfVFlQRV9HRU5FUklDOworCQkJKnRhZysrID0gcmVhbHRla19pZV9sZW4gLSAyOworCQkJbWVtY3B5KHRhZywgcmVhbHRla19pZV9idWYscmVhbHRla19pZV9sZW4gLTIgKTsKKwkJfQorCX0KKy8vCXByaW50aygiPD09PT09JXMoKSwgJXAsICVwXG4iLCBfX0ZVTkNUSU9OX18sIGllZWUtPmRldiwgaWVlZS0+ZGV2LT5kZXZfYWRkcik7CisvLwlJRUVFODAyMTFfREVCVUdfREFUQShJRUVFODAyMTFfRExfREFUQSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJcmV0dXJuIHNrYjsKK30KKwordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWVlZS0+YXNzb2NpYXRlX3NlcSsrOworCisJLyogZG9uJ3Qgc2NhbiwgYW5kIGF2b2lkIHRvIGhhdmUgdGhlIFJYIHBhdGggcG9zc2liaWx5CisJICogdHJ5IGFnYWluIHRvIGFzc29jaWF0ZS4gRXZlbiBkbyBub3QgcmVhY3QgdG8gQVVUSCBvcgorCSAqIEFTU09DIHJlc3BvbnNlLiBKdXN0IHdhaXQgZm9yIHRoZSByZXRyeSB3cSB0byBiZSBzY2hlZHVsZWQuCisJICogSGVyZSB3ZSB3aWxsIGNoZWNrIGlmIHRoZXJlIGFyZSBnb29kIG5ldHMgdG8gYXNzb2NpYXRlCisJICogd2l0aCwgc28gd2UgcmV0cnkgb3IganVzdCBnZXQgYmFjayB0byBOT19MSU5LIGFuZCBzY2FubmluZworCSAqLworCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRJTkcpeworCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiQXV0aGVudGljYXRpb24gZmFpbGVkXG4iKTsKKwkJaWVlZS0+c29mdG1hY19zdGF0cy5ub19hdXRoX3JzKys7CisJfWVsc2V7CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJBc3NvY2lhdGlvbiBmYWlsZWRcbiIpOworCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLm5vX2Fzc19ycysrOworCX0KKworCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HX1JFVFJZOworCisJcXVldWVfZGVsYXllZF93b3JrKGllZWUtPndxLCAmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxLCBcCisJCQkgICBJRUVFODAyMTFfU09GVE1BQ19BU1NPQ19SRVRSWV9USU1FKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKK30KKwordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0X2NiKHVuc2lnbmVkIGxvbmcgZGV2KQoreworCWllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICopIGRldik7Cit9CisKKwordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3N0ZXAxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJSUVFRTgwMjExX0RFQlVHX01HTVQoIlN0b3BwaW5nIHNjYW5cbiIpOworCisJaWVlZS0+c29mdG1hY19zdGF0cy50eF9hdXRoX3JxKys7CisJc2tiPWllZWU4MDIxMV9hdXRoZW50aWNhdGlvbl9yZXEoYmVhY29uLCBpZWVlLCAwKTsKKworCWlmICghc2tiKQorCQlpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KGllZWUpOworCWVsc2V7CisJCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FUSU5HIDsKKwkJSUVFRTgwMjExX0RFQlVHX01HTVQoIlNlbmRpbmcgYXV0aGVudGljYXRpb24gcmVxdWVzdFxuIik7CisJCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiU2VuZGluZyBhdXRoZW50aWNhdGlvbiByZXF1ZXN0XG4iKTsKKwkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKKwkJLy9CVUdPTiB3aGVuIHlvdSB0cnkgdG8gYWRkX3RpbWVyIHR3aWNlLCB1c2luZyBtb2RfdGltZXIgbWF5IGJlIGJldHRlciwgam9objA3MDkKKwkJaWYoIXRpbWVyX3BlbmRpbmcoJmllZWUtPmFzc29jaWF0ZV90aW1lcikpeworCQkJaWVlZS0+YXNzb2NpYXRlX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaIC8gMik7CisJCQlhZGRfdGltZXIoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CisJCX0KKwkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKKwl9Cit9CisKK3ZvaWQgaWVlZTgwMjExX2F1dGhfY2hhbGxlbmdlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqY2hhbGxlbmdlLCBpbnQgY2hsZW4pCit7CisJdTggKmM7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7CisvLwlpbnQgaGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKTsKKworCWllZWUtPmFzc29jaWF0ZV9zZXErKzsKKwlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X2F1dGhfcnErKzsKKworCXNrYiA9IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbl9yZXEoYmVhY29uLCBpZWVlLCBjaGxlbisyKTsKKwlpZiAoIXNrYikKKwkJaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKKwllbHNleworCQljID0gc2tiX3B1dChza2IsIGNobGVuKzIpOworCQkqKGMrKykgPSBNRklFX1RZUEVfQ0hBTExFTkdFOworCQkqKGMrKykgPSBjaGxlbjsKKwkJbWVtY3B5KGMsIGNoYWxsZW5nZSwgY2hsZW4pOworCisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJTZW5kaW5nIGF1dGhlbnRpY2F0aW9uIGNoYWxsZW5nZSByZXNwb25zZVxuIik7CisKKwkJaWVlZTgwMjExX2VuY3J5cHRfZnJhZ21lbnQoaWVlZSwgc2tiLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICkpOworCisJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CisJCW1vZF90aW1lcigmaWVlZS0+YXNzb2NpYXRlX3RpbWVyLCBqaWZmaWVzICsgKEhaLzIpKTsKKwkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKKwl9CisJa2ZyZWUoY2hhbGxlbmdlKTsKK30KKwordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3N0ZXAyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXN0cnVjdCBza19idWZmKiBza2I7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24gPSAmaWVlZS0+Y3VycmVudF9uZXR3b3JrOworCisJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CisKKwlJRUVFODAyMTFfREVCVUdfTUdNVCgiU2VuZGluZyBhc3NvY2lhdGlvbiByZXF1ZXN0XG4iKTsKKworCWllZWUtPnNvZnRtYWNfc3RhdHMudHhfYXNzX3JxKys7CisJc2tiPWllZWU4MDIxMV9hc3NvY2lhdGlvbl9yZXEoYmVhY29uLCBpZWVlKTsKKwlpZiAoIXNrYikKKwkJaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKKwllbHNleworCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOworCQltb2RfdGltZXIoJmllZWUtPmFzc29jaWF0ZV90aW1lciwgamlmZmllcyArIChIWi8yKSk7CisJCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCisJfQorfQordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX2NvbXBsZXRlX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgYXNzb2NpYXRlX2NvbXBsZXRlX3dxKTsKKwlwcmludGsoS0VSTl9JTkZPICJBc3NvY2lhdGVkIHN1Y2Nlc3NmdWxseVxuIik7CisJaWYoaWVlZTgwMjExX2lzXzU0ZyhpZWVlLT5jdXJyZW50X25ldHdvcmspICYmCisJCShpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikpeworCisJCWllZWUtPnJhdGUgPSAxMDg7CisJCXByaW50ayhLRVJOX0lORk8iVXNpbmcgRyByYXRlczolZFxuIiwgaWVlZS0+cmF0ZSk7CisJfWVsc2V7CisJCWllZWUtPnJhdGUgPSAyMjsKKwkJcHJpbnRrKEtFUk5fSU5GTyJVc2luZyBCIHJhdGVzOiVkXG4iLCBpZWVlLT5yYXRlKTsKKwl9CisJaWYgKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0JiZpZWVlLT5wSFRJbmZvLT5iRW5hYmxlSFQpCisJeworCQlwcmludGsoIlN1Y2Nlc3NmdWxseSBhc3NvY2lhdGVkLCBodCBlbmFibGVkXG4iKTsKKwkJSFRPbkFzc29jUnNwKGllZWUpOworCX0KKwllbHNlCisJeworCQlwcmludGsoIlN1Y2Nlc3NmdWxseSBhc3NvY2lhdGVkLCBodCBub3QgZW5hYmxlZCglZCwgJWQpXG4iLCBpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCwgaWVlZS0+cEhUSW5mby0+YkVuYWJsZUhUKTsKKwkJbWVtc2V0KGllZWUtPmRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQsIDAsIDE2KTsKKwkJLy9IVFNldENvbm5lY3RCd01vZGUoaWVlZSwgSFRfQ0hBTk5FTF9XSURUSF8yMCwgSFRfRVhUQ0hOTF9PRkZTRVRfTk9fRVhUKTsKKwl9CisJaWVlZS0+TGlua0RldGVjdEluZm8uU2xvdE51bSA9IDIgKiAoMSArIGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwvNTAwKTsKKwkvLyBUbyBwcmV2ZW50IHRoZSBpbW1lZGlhdGVseSBjYWxsaW5nIHdhdGNoX2RvZyBhZnRlciBhc3NvY2lhdGlvbi4KKwlpZihpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2QmNuSW5QZXJpb2Q9PTB8fGllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZEYXRhSW5QZXJpb2Q9PTAgKQorCXsKKwkJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkJjbkluUGVyaW9kID0gMTsKKwkJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkRhdGFJblBlcmlvZD0gMTsKKwl9CisJaWVlZS0+bGlua19jaGFuZ2UoaWVlZS0+ZGV2KTsKKwlpZihpZWVlLT5pc19zaWxlbnRfcmVzZXQgPT0gMCl7CisJCXByaW50aygiPT09PT09PT09PT09Pm5vcm1hbCBhc3NvY2lhdGVcbiIpOworCW5vdGlmeV93eF9hc3NvY19ldmVudChpZWVlKTsKKwl9CisJZWxzZSBpZihpZWVlLT5pc19zaWxlbnRfcmVzZXQgPT0gMSkKKwl7CisJCXByaW50aygiPT09PT09PT09PT09PT09PT09PnNpbGVudCByZXNldCBhc3NvY2lhdGVcbiIpOworCQlpZWVlLT5pc19zaWxlbnRfcmVzZXQgPSAwOworCX0KKworCWlmIChpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKQorCQlpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKGllZWUtPmRldik7CisJbmV0aWZfY2Fycmllcl9vbihpZWVlLT5kZXYpOworfQorCit2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfY29tcGxldGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisvLwlpbnQgaTsKKy8vCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXYgPSBpZWVlLT5kZXY7CisJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CisKKwlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9MSU5LRUQ7CisJLy9pZWVlLT5VcGRhdGVIYWxSQVRSVGFibGVIYW5kbGVyKGRldiwgaWVlZS0+ZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCk7CisJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPmFzc29jaWF0ZV9jb21wbGV0ZV93cSk7Cit9CisKK3ZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9wcm9jZWR1cmVfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBhc3NvY2lhdGVfcHJvY2VkdXJlX3dxKTsKKwlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDE7CisJZG93bigmaWVlZS0+d3hfc2VtKTsKKworCWlmIChpZWVlLT5kYXRhX2hhcmRfc3RvcCkKKwkJaWVlZS0+ZGF0YV9oYXJkX3N0b3AoaWVlZS0+ZGV2KTsKKworCWllZWU4MDIxMV9zdG9wX3NjYW4oaWVlZSk7CisJcHJpbnRrKCI9PT0+JXMoKSwgY2hhbjolZFxuIiwgX19GVU5DVElPTl9fLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisJLy9pZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKwlIVFNldENvbm5lY3RCd01vZGUoaWVlZSwgSFRfQ0hBTk5FTF9XSURUSF8yMCwgSFRfRVhUQ0hOTF9PRkZTRVRfTk9fRVhUKTsKKworCWllZWUtPmFzc29jaWF0ZV9zZXEgPSAxOworCWllZWU4MDIxMV9hc3NvY2lhdGVfc3RlcDEoaWVlZSk7CisKKwl1cCgmaWVlZS0+d3hfc2VtKTsKK30KKworaW5saW5lIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfbmV3X25ldChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXQpCit7CisJdTggdG1wX3NzaWRbSVdfRVNTSURfTUFYX1NJWkUrMV07CisJaW50IHRtcF9zc2lkX2xlbiA9IDA7CisKKwlzaG9ydCBhcHNldCxzc2lkc2V0LHNzaWRicm9hZCxhcG1hdGNoLHNzaWRtYXRjaDsKKworCS8qIHdlIGFyZSBpbnRlcmVzdGVkIGluIG5ldyBuZXcgb25seSBpZiB3ZSBhcmUgbm90IGFzc29jaWF0ZWQKKwkgKiBhbmQgd2UgYXJlIG5vdCBhc3NvY2lhdGluZyAvIGF1dGhlbnRpY2F0aW5nCisJICovCisJaWYgKGllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9OT0xJTkspCisJCXJldHVybjsKKworCWlmICgoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSAmJiAhKG5ldC0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9CU1MpKQorCQlyZXR1cm47CisKKwlpZiAoKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgJiYgIShuZXQtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUykpCisJCXJldHVybjsKKworCisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSB8fCBpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpeworCQkvKiBpZiB0aGUgdXNlciBzcGVjaWZpZWQgdGhlIEFQIE1BQywgd2UgbmVlZCBhbHNvIHRoZSBlc3NpZAorCQkgKiBUaGlzIGNvdWxkIGJlIG9idGFpbmVkIGJ5IGJlYWNvbnMgb3IsIGlmIHRoZSBuZXR3b3JrIGRvZXMgbm90CisJCSAqIGJyb2FkY2FzdCBpdCwgaXQgY2FuIGJlIHB1dCBtYW51YWxseS4KKwkJICovCisJCWFwc2V0ID0gaWVlZS0+d2FwX3NldDsvLyhtZW1jbXAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCB6ZXJvLEVUSF9BTEVOKSE9MCApOworCQlzc2lkc2V0ID0gaWVlZS0+c3NpZF9zZXQ7Ly9pZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZFswXSAhPSAnXDAnOworCQlzc2lkYnJvYWQgPSAgIShuZXQtPnNzaWRfbGVuID09IDAgfHwgbmV0LT5zc2lkWzBdPT0gJ1wwJyk7CisJCWFwbWF0Y2ggPSAobWVtY21wKGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgbmV0LT5ic3NpZCwgRVRIX0FMRU4pPT0wKTsKKwkJc3NpZG1hdGNoID0gKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9PSBuZXQtPnNzaWRfbGVuKSYmXAorCQkJCSghc3RybmNtcChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgbmV0LT5zc2lkLCBuZXQtPnNzaWRfbGVuKSk7CisKKworCQlpZiAoCS8qIGlmIHRoZSB1c2VyIHNldCB0aGUgQVAgY2hlY2sgaWYgbWF0Y2guCisJCQkgKiBpZiB0aGUgbmV0d29yayBkb2VzIG5vdCBicm9hZGNhc3QgZXNzaWQgd2UgY2hlY2sgdGhlIHVzZXIgc3VwcGx5ZWQgQU5ZIGVzc2lkCisJCQkgKiBpZiB0aGUgbmV0d29yayBkb2VzIGJyb2FkY2FzdCBhbmQgdGhlIHVzZXIgZG9lcyBub3Qgc2V0IGVzc2lkIGl0IGlzIE9LCisJCQkgKiBpZiB0aGUgbmV0d29yayBkb2VzIGJyb2FkY2FzdCBhbmQgdGhlIHVzZXIgZGlkIHNldCBlc3NpZCBjaGVjaCBpZiBlc3NpZCBtYXRjaAorCQkJICovCisJCQkoIGFwc2V0ICYmIGFwbWF0Y2ggJiYKKwkJCQkoKHNzaWRzZXQgJiYgc3NpZGJyb2FkICYmIHNzaWRtYXRjaCkgfHwgKHNzaWRicm9hZCAmJiAhc3NpZHNldCkgfHwgKCFzc2lkYnJvYWQgJiYgc3NpZHNldCkpICkgfHwKKwkJCS8qIGlmIHRoZSBhcCBpcyBub3Qgc2V0LCBjaGVjayB0aGF0IHRoZSB1c2VyIHNldCB0aGUgYnNzaWQKKwkJCSAqIGFuZCB0aGUgbmV0d29yayBkb2VzIGJyYWRjYXN0IGFuZCB0aGF0IHRob3NlIHR3byBic3NpZCBtYXRjaGVzCisJCQkgKi8KKwkJCSghYXBzZXQgJiYgc3NpZHNldCAmJiBzc2lkYnJvYWQgJiYgc3NpZG1hdGNoKQorCQkJKXsKKwkJCQkvKiBpZiB0aGUgZXNzaWQgaXMgaGlkZGVuIHJlcGxhY2UgaXQgd2l0aCB0aGUKKwkJCQkqIGVzc2lkIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLgorCQkJCSovCisJCQkJaWYgKCFzc2lkYnJvYWQpeworCQkJCQlzdHJuY3B5KHRtcF9zc2lkLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgSVdfRVNTSURfTUFYX1NJWkUpOworCQkJCQl0bXBfc3NpZF9sZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW47CisJCQkJfQorCQkJCW1lbWNweSgmaWVlZS0+Y3VycmVudF9uZXR3b3JrLCBuZXQsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmspKTsKKworCQkJCWlmICghc3NpZGJyb2FkKXsKKwkJCQkJc3RybmNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgdG1wX3NzaWQsIElXX0VTU0lEX01BWF9TSVpFKTsKKwkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID0gdG1wX3NzaWRfbGVuOworCQkJCX0KKwkJCQlwcmludGsoS0VSTl9JTkZPIkxpbmtpbmcgd2l0aCAlcyxjaGFubmVsOiVkLCBxb3M6JWQsIG15SFQ6JWQsIG5ldHdvcmtIVDolZFxuIixpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCxpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLnN1cHBvcnRlZCwgaWVlZS0+cEhUSW5mby0+YkVuYWJsZUhULCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaHQuYmRTdXBwb3J0SFQpOworCisJCQkJLy9pZWVlLT5wSFRJbmZvLT5JT1RBY3Rpb24gPSAwOworCQkJCUhUUmVzZXRJT1RTZXR0aW5nKGllZWUtPnBIVEluZm8pOworCQkJCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpeworCQkJCQkvKiBKb2luIHRoZSBuZXR3b3JrIGZvciB0aGUgZmlyc3QgdGltZSAqLworCQkJCQlpZWVlLT5Bc29jUmV0cnlDb3VudCA9IDA7CisJCQkJCS8vZm9yIEhUIGJ5IGFteSAwODA1MTQKKwkJCQkJaWYoKGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5zdXBwb3J0ZWQgPT0gMSkgJiYKKwkJCQkJICAvLyAoaWVlZS0+cEhUSW5mby0+YkVuYWJsZUhUICYmIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NodC5iZFN1cHBvcnRIVCkpCisJCQkJCSAgIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NodC5iZFN1cHBvcnRIVCkKKy8qV0IsIDIwMDguMDkuMDk6YkN1cnJlbnRIVFN1cHBvcnQgYW5kIGJFbmFibGVIVCB0d28gZmxhZ3MgYXJlIGdvaW5nIHRvIHB1dCB0b2dldGhlciB0byBjaGVjayB3aGV0aGVyIHdlIGFyZSBpbiBIVCBub3csIHNvIG5lZWRuJ3QgdG8gY2hlY2sgYkVuYWJsZUhUIGZsYWdzIGhlcmUuIFRoYXQncyBpcyB0byBzYXkgd2Ugd2lsbCBzZXQgdG8gSFQgc3VwcG9ydCB3aGVuZXZlciBqb2luZWQgQVAgaGFzIHRoZSBhYmlsaXR5IHRvIHN1cHBvcnQgSFQuIEFuZCB3aGV0aGVyIHdlIGFyZSBpbiBIVCBvciBub3QsIHBsZWFzZSBjaGVjayBiQ3VycmVudEhUU3VwcG9ydCYmYkVuYWJsZUhUIG5vdyBwbGVhc2UuKi8KKwkJCQkJeworCQkJCQkvLwlpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9IHRydWU7CisJCQkJCQlIVFJlc2V0U2VsZkFuZFNhdmVQZWVyU2V0dGluZyhpZWVlLCAmKGllZWUtPmN1cnJlbnRfbmV0d29yaykpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPSBmYWxzZTsKKwkJCQkJfQorCisJCQkJCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HOworCQkJCQlxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+YXNzb2NpYXRlX3Byb2NlZHVyZV93cSk7CisJCQkJfWVsc2V7CisJCQkJCWlmKGllZWU4MDIxMV9pc181NGcoaWVlZS0+Y3VycmVudF9uZXR3b3JrKSAmJgorCQkJCQkJKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKSl7CisJCQkJCQlpZWVlLT5yYXRlID0gMTA4OworCQkJCQkJaWVlZS0+U2V0V2lyZWxlc3NNb2RlKGllZWUtPmRldiwgSUVFRV9HKTsKKwkJCQkJCXByaW50ayhLRVJOX0lORk8iVXNpbmcgRyByYXRlc1xuIik7CisJCQkJCX1lbHNleworCQkJCQkJaWVlZS0+cmF0ZSA9IDIyOworCQkJCQkJaWVlZS0+U2V0V2lyZWxlc3NNb2RlKGllZWUtPmRldiwgSUVFRV9CKTsKKwkJCQkJCXByaW50ayhLRVJOX0lORk8iVXNpbmcgQiByYXRlc1xuIik7CisJCQkJCX0KKwkJCQkJbWVtc2V0KGllZWUtPmRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQsIDAsIDE2KTsKKwkJCQkJLy9IVFNldENvbm5lY3RCd01vZGUoaWVlZSwgSFRfQ0hBTk5FTF9XSURUSF8yMCwgSFRfRVhUQ0hOTF9PRkZTRVRfTk9fRVhUKTsKKwkJCQkJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTElOS0VEOworCQkJCX0KKworCQl9CisJfQorCit9CisKK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKnRhcmdldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRhcmdldCwgJmllZWUtPm5ldHdvcmtfbGlzdCwgbGlzdCkgeworCisJCS8qIGlmIHRoZSBzdGF0ZSBiZWNvbWUgZGlmZmVyZW50IHRoYXQgTk9MSU5LIG1lYW5zCisJCSAqIHdlIGhhZCBmb3VuZCB3aGF0IHdlIGFyZSBzZWFyY2hpbmcgZm9yCisJCSAqLworCisJCWlmIChpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTk9MSU5LKQorCQkJYnJlYWs7CisKKwkJaWYgKGllZWUtPnNjYW5fYWdlID09IDAgfHwgdGltZV9hZnRlcih0YXJnZXQtPmxhc3Rfc2Nhbm5lZCArIGllZWUtPnNjYW5fYWdlLCBqaWZmaWVzKSkKKwkJaWVlZTgwMjExX3NvZnRtYWNfbmV3X25ldChpZWVlLCB0YXJnZXQpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworfQorCisKK3N0YXRpYyBpbmxpbmUgdTE2IGF1dGhfcGFyc2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTgqKiBjaGFsbGVuZ2UsIGludCAqY2hsZW4pCit7CisJc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqYTsKKwl1OCAqdDsKKwlpZiAoc2tiLT5sZW4gPCAgKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKS1zaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQpKSl7CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJpbnZhbGlkIGxlbiBpbiBhdXRoIHJlc3A6ICVkXG4iLHNrYi0+bGVuKTsKKwkJcmV0dXJuIDB4Y2FmZTsKKwl9CisJKmNoYWxsZW5nZSA9IE5VTEw7CisJYSA9IChzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKikgc2tiLT5kYXRhOworCWlmKHNrYi0+bGVuID4gKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKSArMykpeworCQl0ID0gc2tiLT5kYXRhICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pOworCisJCWlmKCoodCsrKSA9PSBNRklFX1RZUEVfQ0hBTExFTkdFKXsKKwkJCSpjaGxlbiA9ICoodCsrKTsKKwkJCSpjaGFsbGVuZ2UgPSAodTgqKWttYWxsb2MoKmNobGVuLCBHRlBfQVRPTUlDKTsKKwkJCW1lbWNweSgqY2hhbGxlbmdlLCB0LCAqY2hsZW4pOworCQl9CisJfQorCisJcmV0dXJuIGNwdV90b19sZTE2KGEtPnN0YXR1cyk7CisKK30KKworCitpbnQgYXV0aF9ycV9wYXJzZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLHU4KiBkZXN0KQoreworCXN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gKmE7CisKKwlpZiAoc2tiLT5sZW4gPCAgKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKS1zaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQpKSl7CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJpbnZhbGlkIGxlbiBpbiBhdXRoIHJlcXVlc3Q6ICVkXG4iLHNrYi0+bGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKwlhID0gKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24qKSBza2ItPmRhdGE7CisKKwltZW1jcHkoZGVzdCxhLT5oZWFkZXIuYWRkcjIsIEVUSF9BTEVOKTsKKworCWlmIChsZTE2X3RvX2NwdShhLT5hbGdvcml0aG0pICE9IFdMQU5fQVVUSF9PUEVOKQorCQlyZXR1cm4gIFdMQU5fU1RBVFVTX05PVF9TVVBQT1JURURfQVVUSF9BTEc7CisKKwlyZXR1cm4gV0xBTl9TVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIHNob3J0IHByb2JlX3JxX3BhcnNlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCAqc3JjKQoreworCXU4ICp0YWc7CisJdTggKnNrYmVuZDsKKwl1OCAqc3NpZD1OVUxMOworCXU4IHNzaWRsZW4gPSAwOworCisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICAqaGVhZGVyID0KKwkJKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAgKikgc2tiLT5kYXRhOworCisJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mIChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKSkKKwkJcmV0dXJuIC0xOyAvKiBjb3JydXB0ZWQgKi8KKworCW1lbWNweShzcmMsaGVhZGVyLT5hZGRyMiwgRVRIX0FMRU4pOworCisJc2tiZW5kID0gKHU4Kilza2ItPmRhdGEgKyBza2ItPmxlbjsKKworCXRhZyA9IHNrYi0+ZGF0YSArIHNpemVvZiAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICk7CisKKwl3aGlsZSAodGFnKzEgPCBza2JlbmQpeworCQlpZiAoKnRhZyA9PSAwKXsKKwkJCXNzaWQgPSB0YWcrMjsKKwkJCXNzaWRsZW4gPSAqKHRhZysxKTsKKwkJCWJyZWFrOworCQl9CisJCXRhZysrOyAvKiBwb2ludCB0byB0aGUgbGVuIGZpZWxkICovCisJCXRhZyA9IHRhZyArICoodGFnKTsgLyogcG9pbnQgdG8gdGhlIGxhc3QgZGF0YSBieXRlIG9mIHRoZSB0YWcgKi8KKwkJdGFnKys7IC8qIHBvaW50IHRvIHRoZSBuZXh0IHRhZyAqLworCX0KKworCS8vSUVFRTgwMjExRE1FU0coIkNhcmQgTUFDIGFkZHJlc3MgaXMgIk1BQ1NUUiwgTUFDMlNUUihzcmMpKTsKKwlpZiAoc3NpZGxlbiA9PSAwKSByZXR1cm4gMTsKKworCWlmICghc3NpZCkgcmV0dXJuIDE7IC8qIHNzaWQgbm90IGZvdW5kIGluIHRhZ2dlZCBwYXJhbSAqLworCXJldHVybiAoIXN0cm5jbXAoc3NpZCwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIHNzaWRsZW4pKTsKKworfQorCitpbnQgYXNzb2NfcnFfcGFyc2Uoc3RydWN0IHNrX2J1ZmYgKnNrYix1OCogZGVzdCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUgKmE7CisKKwlpZiAoc2tiLT5sZW4gPCAoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSkgLQorCQlzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQpKSkgeworCisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJpbnZhbGlkIGxlbiBpbiBhdXRoIHJlcXVlc3Q6JWQgXG4iLCBza2ItPmxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlhID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSopIHNrYi0+ZGF0YTsKKworCW1lbWNweShkZXN0LGEtPmhlYWRlci5hZGRyMixFVEhfQUxFTik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1MTYgYXNzb2NfcGFyc2Uoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsIGludCAqYWlkKQoreworCXN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgKnJlc3BvbnNlX2hlYWQ7CisJdTE2IHN0YXR1c19jb2RlOworCisJaWYgKHNrYi0+bGVuIDwgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKSl7CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJpbnZhbGlkIGxlbiBpbiBhdXRoIHJlc3A6ICVkXG4iLCBza2ItPmxlbik7CisJCXJldHVybiAweGNhZmU7CisJfQorCisJcmVzcG9uc2VfaGVhZCA9IChzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKikgc2tiLT5kYXRhOworCSphaWQgPSBsZTE2X3RvX2NwdShyZXNwb25zZV9oZWFkLT5haWQpICYgMHgzZmZmOworCisJc3RhdHVzX2NvZGUgPSBsZTE2X3RvX2NwdShyZXNwb25zZV9oZWFkLT5zdGF0dXMpOworCWlmKChzdGF0dXNfY29kZT09V0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX1JBVEVTIHx8IFwKKwkgICBzdGF0dXNfY29kZT09V0xBTl9TVEFUVVNfQ0FQU19VTlNVUFBPUlRFRCkmJgorCSAgICgoaWVlZS0+bW9kZSA9PSBJRUVFX0cpICYmCisJICAgIChpZWVlLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX05fMjRHKSAmJgorCSAgICAoaWVlZS0+QXNvY1JldHJ5Q291bnQrKyA8IChSVF9BU09DX1JFVFJZX0xJTUlULTEpKSkpIHsKKwkJIGllZWUtPnBIVEluZm8tPklPVEFjdGlvbiB8PSBIVF9JT1RfQUNUX1BVUkVfTl9NT0RFOworCX1lbHNlIHsKKwkJIGllZWUtPkFzb2NSZXRyeUNvdW50ID0gMDsKKwl9CisKKwlyZXR1cm4gbGUxNl90b19jcHUocmVzcG9uc2VfaGVhZC0+c3RhdHVzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpZWVlODAyMTFfcnhfcHJvYmVfcnEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTggZGVzdFtFVEhfQUxFTl07CisKKwkvL0lFRUU4MDIxMURNRVNHKCJSeCBwcm9iZSIpOworCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfcHJvYmVfcnErKzsKKwkvL0RNRVNHKCJEZXN0IGlzICJNQUNTVFIsIE1BQzJTVFIoZGVzdCkpOworCWlmIChwcm9iZV9ycV9wYXJzZShpZWVlLCBza2IsIGRlc3QpKXsKKwkJLy9JRUVFODAyMTFETUVTRygiV2FzIGZvciBtZSEiKTsKKwkJaWVlZS0+c29mdG1hY19zdGF0cy50eF9wcm9iZV9ycysrOworCQlpZWVlODAyMTFfcmVzcF90b19wcm9iZShpZWVlLCBkZXN0KTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWVlZTgwMjExX3J4X2F1dGhfcnEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTggZGVzdFtFVEhfQUxFTl07CisJaW50IHN0YXR1czsKKwkvL0lFRUU4MDIxMURNRVNHKCJSeCBwcm9iZSIpOworCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXV0aF9ycSsrOworCisJaWYgKChzdGF0dXMgPSBhdXRoX3JxX3BhcnNlKHNrYiwgZGVzdCkpIT0gLTEpeworCQlpZWVlODAyMTFfcmVzcF90b19hdXRoKGllZWUsIHN0YXR1cywgZGVzdCk7CisJfQorCS8vRE1FU0coIkRlc3QgaXMgIk1BQ1NUUiwgTUFDMlNUUihkZXN0KSk7CisKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpZWVlODAyMTFfcnhfYXNzb2NfcnEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCit7CisKKwl1OCBkZXN0W0VUSF9BTEVOXTsKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2Fzc19ycSsrOworCWlmIChhc3NvY19ycV9wYXJzZShza2IsZGVzdCkgIT0gLTEpeworCQlpZWVlODAyMTFfcmVzcF90b19hc3NvY19ycShpZWVlLCBkZXN0KTsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIk5ldyBjbGllbnQgYXNzb2NpYXRlZDogIk1BQ19GTVQiXG4iLCBNQUNfQVJHKGRlc3QpKTsKKwkvL0ZJWE1FCit9CisKKworCit2b2lkIGllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzaG9ydCBwd3IpCit7CisKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gaWVlZTgwMjExX251bGxfZnVuYyhpZWVlLCBwd3IpOworCisJaWYgKGJ1ZikKKwkJc29mdG1hY19wc19tZ210X3htaXQoYnVmLCBpZWVlKTsKKworfQorCisKK3Nob3J0IGllZWU4MDIxMV9zdGFfcHNfc2xlZXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHUzMiAqdGltZV9oLCB1MzIgKnRpbWVfbCkKK3sKKwlpbnQgdGltZW91dCA9IGllZWUtPnBzX3RpbWVvdXQ7CisJdTggZHRpbTsKKwkvKmlmKGllZWUtPnBzID09IElFRUU4MDIxMV9QU19ESVNBQkxFRCB8fAorCQlpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEgfHwKKwkJaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCkKKworCQlyZXR1cm4gMDsKKwkqLworCWR0aW0gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuZHRpbV9kYXRhOworCS8vcHJpbnRrKCJEVElNXG4iKTsKKwlpZighKGR0aW0gJiBJRUVFODAyMTFfRFRJTV9WQUxJRCkpCisJCXJldHVybiAwOworCXRpbWVvdXQgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsOyAvL3Nob3VsZCB3ZSB1c2UgcHNfdGltZW91dCB2YWx1ZSBvciBiZWFjb25faW50ZXJ2YWwKKwkvL3ByaW50aygiVkFMSURcbiIpOworCWllZWUtPmN1cnJlbnRfbmV0d29yay5kdGltX2RhdGEgPSBJRUVFODAyMTFfRFRJTV9JTlZBTElEOworCisJaWYoZHRpbSAmICgoSUVFRTgwMjExX0RUSU1fVUNBU1QgfCBJRUVFODAyMTFfRFRJTV9NQkNBU1QpJiBpZWVlLT5wcykpCisJCXJldHVybiAyOworCisJaWYoIXRpbWVfYWZ0ZXIoamlmZmllcywgaWVlZS0+ZGV2LT50cmFuc19zdGFydCArIE1TRUNTKHRpbWVvdXQpKSkKKwkJcmV0dXJuIDA7CisKKwlpZighdGltZV9hZnRlcihqaWZmaWVzLCBpZWVlLT5sYXN0X3J4X3BzX3RpbWUgKyBNU0VDUyh0aW1lb3V0KSkpCisJCXJldHVybiAwOworCisJaWYoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFICkgJiYKKwkJKGllZWUtPm1nbXRfcXVldWVfdGFpbCAhPSBpZWVlLT5tZ210X3F1ZXVlX2hlYWQpKQorCQlyZXR1cm4gMDsKKworCWlmKHRpbWVfbCl7CisJCSp0aW1lX2wgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsubGFzdF9kdGltX3N0YV90aW1lWzBdCisJCQkrIChpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsCisJCQkqIGllZWUtPmN1cnJlbnRfbmV0d29yay5kdGltX3BlcmlvZCkgKiAxMDAwOworCX0KKworCWlmKHRpbWVfaCl7CisJCSp0aW1lX2ggPSBpZWVlLT5jdXJyZW50X25ldHdvcmsubGFzdF9kdGltX3N0YV90aW1lWzFdOworCQlpZih0aW1lX2wgJiYgKnRpbWVfbCA8IGllZWUtPmN1cnJlbnRfbmV0d29yay5sYXN0X2R0aW1fc3RhX3RpbWVbMF0pCisJCQkqdGltZV9oICs9IDE7CisJfQorCisJcmV0dXJuIDE7CisKKworfQorCitpbmxpbmUgdm9pZCBpZWVlODAyMTFfc3RhX3BzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCisJdTMyIHRoLHRsOworCXNob3J0IHNsZWVwOworCisJdW5zaWduZWQgbG9uZyBmbGFncyxmbGFnczI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWYoKGllZWUtPnBzID09IElFRUU4MDIxMV9QU19ESVNBQkxFRCB8fAorCQlpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEgfHwKKwkJaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCkpeworCisJLy8JI3dhcm5pbmcgQ0hFQ0tfTE9DS19IRVJFCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisKKwkJaWVlZTgwMjExX3N0YV93YWtldXAoaWVlZSwgMSk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFnczIpOworCX0KKworCXNsZWVwID0gaWVlZTgwMjExX3N0YV9wc19zbGVlcChpZWVlLCZ0aCwgJnRsKTsKKwkvKiAyIHdha2UsIDEgc2xlZXAsIDAgZG8gbm90aGluZyAqLworCWlmKHNsZWVwID09IDApCisJCWdvdG8gb3V0OworCisJaWYoc2xlZXAgPT0gMSl7CisKKwkJaWYoaWVlZS0+c3RhX3NsZWVwID09IDEpCisJCQlpZWVlLT5lbnRlcl9zbGVlcF9zdGF0ZShpZWVlLT5kZXYsdGgsdGwpOworCisJCWVsc2UgaWYoaWVlZS0+c3RhX3NsZWVwID09IDApeworCQkvLwlwcmludGsoInNlbmQgbnVsbCAxXG4iKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisKKwkJCWlmKGllZWUtPnBzX2lzX3F1ZXVlX2VtcHR5KGllZWUtPmRldikpeworCisKKwkJCQlpZWVlLT5zdGFfc2xlZXAgPSAyOworCisJCQkJaWVlZS0+cHNfcmVxdWVzdF90eF9hY2soaWVlZS0+ZGV2KTsKKworCQkJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsMSk7CisKKwkJCQlpZWVlLT5wc190aCA9IHRoOworCQkJCWllZWUtPnBzX3RsID0gdGw7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisKKwkJfQorCisKKwl9ZWxzZSBpZihzbGVlcCA9PSAyKXsKKy8vI3dhcm5pbmcgQ0hFQ0tfTE9DS19IRVJFCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisKKwkJaWVlZTgwMjExX3N0YV93YWtldXAoaWVlZSwxKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisJfQorCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCit9CisKK3ZvaWQgaWVlZTgwMjExX3N0YV93YWtldXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHNob3J0IG5sKQoreworCWlmKGllZWUtPnN0YV9zbGVlcCA9PSAwKXsKKwkJaWYobmwpeworCQkJcHJpbnRrKCJXYXJuaW5nOiBkcml2ZXIgaXMgcHJvYmFibHkgZmFpbGluZyB0byByZXBvcnQgVFggcHMgZXJyb3JcbiIpOworCQkJaWVlZS0+cHNfcmVxdWVzdF90eF9hY2soaWVlZS0+ZGV2KTsKKwkJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsIDApOworCQl9CisJCXJldHVybjsKKworCX0KKworCWlmKGllZWUtPnN0YV9zbGVlcCA9PSAxKQorCQlpZWVlLT5zdGFfd2FrZV91cChpZWVlLT5kZXYpOworCisJaWVlZS0+c3RhX3NsZWVwID0gMDsKKworCWlmKG5sKXsKKwkJaWVlZS0+cHNfcmVxdWVzdF90eF9hY2soaWVlZS0+ZGV2KTsKKwkJaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoaWVlZSwgMCk7CisJfQorfQorCit2b2lkIGllZWU4MDIxMV9wc190eF9hY2soc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHNob3J0IHN1Y2Nlc3MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyxmbGFnczI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWYoaWVlZS0+c3RhX3NsZWVwID09IDIpeworCQkvKiBOdWxsIGZyYW1lIHdpdGggUFMgYml0IHNldCAqLworCQlpZihzdWNjZXNzKXsKKwkJCWllZWUtPnN0YV9zbGVlcCA9IDE7CisJCQlpZWVlLT5lbnRlcl9zbGVlcF9zdGF0ZShpZWVlLT5kZXYsaWVlZS0+cHNfdGgsaWVlZS0+cHNfdGwpOworCQl9CisJCS8qIGlmIHRoZSBjYXJkIHJlcG9ydCBub3Qgc3VjY2VzcyB3ZSBjYW4ndCBiZSBzdXJlIHRoZSBBUAorCQkgKiBoYXMgbm90IFJYZWQgc28gd2UgY2FuJ3QgYXNzdW1lIHRoZSBBUCBiZWxpZXZlIHVzIGF3YWtlCisJCSAqLworCX0KKwkvKiAyMTExMjAwNSAtIHR4IGFnYWluIG51bGwgd2l0aG91dCBQUyBiaXQgaWYgbG9zdCAqLworCWVsc2UgeworCisJCWlmKChpZWVlLT5zdGFfc2xlZXAgPT0gMCkgJiYgIXN1Y2Nlc3MpeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKKwkJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsIDApOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFnczIpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKK30KK3ZvaWQgaWVlZTgwMjExX3Byb2Nlc3NfYWN0aW9uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBzdHJ1Y3Qgc2tfYnVmZiogc2tiKQoreworCXN0cnVjdCBpZWVlODAyMTFfaGRyKiBoZWFkZXIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIqKXNrYi0+ZGF0YTsKKwl1OCogYWN0ID0gaWVlZTgwMjExX2dldF9wYXlsb2FkKGhlYWRlcik7CisJdTggdG1wID0gMDsKKy8vCUlFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBfElFRUU4MDIxMV9ETF9CQSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJaWYgKGFjdCA9PSBOVUxMKQorCXsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJlcnJvciB0byBnZXQgcGF5bG9hZCBvZiBhY3Rpb24gZnJhbWVcbiIpOworCQlyZXR1cm47CisJfQorCXRtcCA9ICphY3Q7CisJYWN0ICsrOworCXN3aXRjaCAodG1wKQorCXsKKwkJY2FzZSBBQ1RfQ0FUX0JBOgorCQkJaWYgKCphY3QgPT0gQUNUX0FEREJBUkVRKQorCQkJaWVlZTgwMjExX3J4X0FEREJBUmVxKGllZWUsIHNrYik7CisJCQllbHNlIGlmICgqYWN0ID09IEFDVF9BRERCQVJTUCkKKwkJCWllZWU4MDIxMV9yeF9BRERCQVJzcChpZWVlLCBza2IpOworCQkJZWxzZSBpZiAoKmFjdCA9PSBBQ1RfREVMQkEpCisJCQlpZWVlODAyMTFfcnhfREVMQkEoaWVlZSwgc2tiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorLy8JCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorLy8JCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0JBLCAidW5rbm93biBhY3Rpb24gZnJhbWUoJWQpXG4iLCB0bXApOworCQkJYnJlYWs7CisJfQorCXJldHVybjsKKworfQoraW5saW5lIGludAoraWVlZTgwMjExX3J4X2ZyYW1lX3NvZnRtYWMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cywgdTE2IHR5cGUsCisJCQl1MTYgc3R5cGUpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmhlYWRlciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKSBza2ItPmRhdGE7CisJdTE2IGVycmNvZGU7CisJdTgqIGNoYWxsZW5nZTsKKwlpbnQgY2hsZW49MDsKKwlpbnQgYWlkOworCXN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgKmFzc29jX3Jlc3A7CisvLwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqaW5mb19lbGVtZW50OworCWJvb2wgYlN1cHBvcnRObW9kZSA9IHRydWUsIGJIYWxmU3VwcG9ydE5tb2RlID0gZmFsc2U7IC8vZGVmYXVsdCBzdXBwb3J0IE4gbW9kZSwgZGlzYWJsZSBoYWxmTm1vZGUKKworCWlmKCFpZWVlLT5wcm90b19zdGFydGVkKQorCQlyZXR1cm4gMDsKKworCWlmKGllZWUtPnN0YV9zbGVlcCB8fCAoaWVlZS0+cHMgIT0gSUVFRTgwMjExX1BTX0RJU0FCTEVEICYmCisJCWllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSAmJgorCQlpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKSkKKworCQl0YXNrbGV0X3NjaGVkdWxlKCZpZWVlLT5wc190YXNrKTsKKworCWlmKFdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSAhPSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCAmJgorCQlXTEFOX0ZDX0dFVF9TVFlQRShoZWFkZXItPmZyYW1lX2N0bCkgIT0gSUVFRTgwMjExX1NUWVBFX0JFQUNPTikKKwkJaWVlZS0+bGFzdF9yeF9wc190aW1lID0gamlmZmllczsKKworCXN3aXRjaCAoV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpKSB7CisKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVTUDoKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVNQOgorCisJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgicmVjZWl2ZWQgW1JFXUFTU09DSUFUSU9OIFJFU1BPTlNFICglZClcbiIsCisJCQkJCVdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSk7CisJCQlpZiAoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFKSAmJgorCQkJCWllZWUtPnN0YXRlID09IElFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVEVEICYmCisJCQkJaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKXsKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgbmV0d29ya19yZXNwOworCQkJCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yayA9ICZuZXR3b3JrX3Jlc3A7CisKKwkJCQlpZiAoMCA9PSAoZXJyY29kZT1hc3NvY19wYXJzZShpZWVlLHNrYiwgJmFpZCkpKXsKKwkJCQkJaWVlZS0+c3RhdGU9SUVFRTgwMjExX0xJTktFRDsKKwkJCQkJaWVlZS0+YXNzb2NfaWQgPSBhaWQ7CisJCQkJCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXNzX29rKys7CisJCQkJCS8qIHN0YXRpb24gc3VwcG9ydCBxb3MgKi8KKwkJCQkJLyogTGV0IHRoZSByZWdpc3RlciBzZXR0aW5nIGRlZmF1bHRseSB3aXRoIExlZ2FjeSBzdGF0aW9uICovCisJCQkJCWlmKGllZWUtPnFvc19zdXBwb3J0KSB7CisJCQkJCQlhc3NvY19yZXNwID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUqKXNrYi0+ZGF0YTsKKwkJCQkJCW1lbXNldChuZXR3b3JrLCAwLCBzaXplb2YoKm5ldHdvcmspKTsKKwkJCQkJCWlmIChpZWVlODAyMTFfcGFyc2VfaW5mb19wYXJhbShpZWVlLGFzc29jX3Jlc3AtPmluZm9fZWxlbWVudCxcCisJCQkJCQkJCQlyeF9zdGF0cy0+bGVuIC0gc2l6ZW9mKCphc3NvY19yZXNwKSxcCisJCQkJCQkJCQluZXR3b3JrLHJ4X3N0YXRzKSl7CisJCQkJCQkJcmV0dXJuIDE7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CS8vZmlsbGluZyB0aGUgUGVlckhUQ2FwLiAvL21heWJlIG5vdCBuZWNjZXNhcnkgYXMgd2UgY2FuIGdldCBpdHMgaW5mbyBmcm9tIGN1cnJlbnRfbmV0d29yay4KKwkJCQkJCQltZW1jcHkoaWVlZS0+cEhUSW5mby0+UGVlckhUQ2FwQnVmLCBuZXR3b3JrLT5ic3NodC5iZEhUQ2FwQnVmLCBuZXR3b3JrLT5ic3NodC5iZEhUQ2FwTGVuKTsKKwkJCQkJCQltZW1jcHkoaWVlZS0+cEhUSW5mby0+UGVlckhUSW5mb0J1ZiwgbmV0d29yay0+YnNzaHQuYmRIVEluZm9CdWYsIG5ldHdvcmstPmJzc2h0LmJkSFRJbmZvTGVuKTsKKwkJCQkJCX0KKwkJCQkJCWlmIChpZWVlLT5oYW5kbGVfYXNzb2NfcmVzcG9uc2UgIT0gTlVMTCkKKwkJCQkJCQlpZWVlLT5oYW5kbGVfYXNzb2NfcmVzcG9uc2UoaWVlZS0+ZGV2LCAoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSopaGVhZGVyLCBuZXR3b3JrKTsKKwkJCQkJfQorCQkJCQlpZWVlODAyMTFfYXNzb2NpYXRlX2NvbXBsZXRlKGllZWUpOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIGFpZCBjb3VsZCBub3QgYmVlbiBhbGxvY2F0ZWQgKi8KKwkJCQkJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hc3NfZXJyKys7CisJCQkJCXByaW50aygKKwkJCQkJCSJBc3NvY2lhdGlvbiByZXNwb25zZSBzdGF0dXMgY29kZSAweCV4XG4iLAorCQkJCQkJZXJyY29kZSk7CisJCQkJCUlFRUU4MDIxMV9ERUJVR19NR01UKAorCQkJCQkJIkFzc29jaWF0aW9uIHJlc3BvbnNlIHN0YXR1cyBjb2RlIDB4JXhcbiIsCisJCQkJCQllcnJjb2RlKTsKKwkJCQkJaWYoaWVlZS0+QXNvY1JldHJ5Q291bnQgPCBSVF9BU09DX1JFVFJZX0xJTUlUKSB7CisJCQkJCQlxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+YXNzb2NpYXRlX3Byb2NlZHVyZV93cSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KGllZWUpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVROgorCQljYXNlIElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFUToKKworCQkJaWYgKChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSkgJiYKKwkJCQlpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKQorCisJCQkJaWVlZTgwMjExX3J4X2Fzc29jX3JxKGllZWUsIHNrYik7CisJCQlicmVhazsKKworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BVVRIOgorCisJCQlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUpeworCQkJCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRJTkcgJiYKKwkJCQlpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpeworCisJCQkJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiUmVjZWl2ZWQgYXV0aGVudGljYXRpb24gcmVzcG9uc2UiKTsKKworCQkJCQkJaWYgKDAgPT0gKGVycmNvZGU9YXV0aF9wYXJzZShza2IsICZjaGFsbGVuZ2UsICZjaGxlbikpKXsKKwkJCQkJCQlpZihpZWVlLT5vcGVuX3dlcCB8fCAhY2hhbGxlbmdlKXsKKwkJCQkJCQkJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRFRDsKKwkJCQkJCQkJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hdXRoX3JzX29rKys7CisJCQkJCQkJCWlmKCEoaWVlZS0+cEhUSW5mby0+SU9UQWN0aW9uJkhUX0lPVF9BQ1RfUFVSRV9OX01PREUpKQorCQkJCQkJCQl7CisJCQkJCQkJCQlpZiAoIWllZWUtPkdldE5tb2RlU3VwcG9ydEJ5U2VjQ2ZnKGllZWUtPmRldikpCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJCQkvLyBXRVAgb3IgVEtJUCBlbmNyeXB0aW9uCisJCQkJCQkJCQkJaWYoSXNIVEhhbGZObW9kZUFQcyhpZWVlKSkKKwkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCWJTdXBwb3J0Tm1vZGUgPSB0cnVlOworCQkJCQkJCQkJCQliSGFsZlN1cHBvcnRObW9kZSA9IHRydWU7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCWVsc2UKKwkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCWJTdXBwb3J0Tm1vZGUgPSBmYWxzZTsKKwkJCQkJCQkJCQkJYkhhbGZTdXBwb3J0Tm1vZGUgPSBmYWxzZTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQlwcmludGsoIj09PT09PT09PT0+dG8gbGluayB3aXRoIEFQIHVzaW5nIFNFQyglZCwgJWQpIiwgYlN1cHBvcnRObW9kZSwgYkhhbGZTdXBwb3J0Tm1vZGUpOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCS8qIER1bW15IHdpcmxlc3MgbW9kZSBzZXR0aW5nIHRvIGF2b2lkIGVuY3J5cHRpb24gaXNzdWUgKi8KKwkJCQkJCQkJaWYoYlN1cHBvcnRObW9kZSkgeworCQkJCQkJCQkJLy9OIG1vZGUgc2V0dGluZworCQkJCQkJCQkJaWVlZS0+U2V0V2lyZWxlc3NNb2RlKGllZWUtPmRldiwgXAorCQkJCQkJCQkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsubW9kZSk7CisJCQkJCQkJCX1lbHNleworCQkJCQkJCQkJLy9iL2cgbW9kZSBzZXR0aW5nCisJCQkJCQkJCQkvKlRPRE8qLworCQkJCQkJCQkJaWVlZS0+U2V0V2lyZWxlc3NNb2RlKGllZWUtPmRldiwgSUVFRV9HKTsKKwkJCQkJCQkJfQorCisJCQkJCQkJCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX05fMjRHICYmIGJIYWxmU3VwcG9ydE5tb2RlID09IHRydWUpCisJCQkJCQkJCXsKKwkJCQkJCQkJCXByaW50aygiPT09PT09PT09PT09PT09PmVudGVybiBoYWxmIE4gbW9kZVxuIik7CisJCQkJCQkJCQlpZWVlLT5iSGFsZldpcmVsZXNzTjI0R01vZGUgPSB0cnVlOworCQkJCQkJCQl9CisJCQkJCQkJCWVsc2UKKwkJCQkJCQkJCWllZWUtPmJIYWxmV2lyZWxlc3NOMjRHTW9kZSA9IGZhbHNlOworCisJCQkJCQkJCWllZWU4MDIxMV9hc3NvY2lhdGVfc3RlcDIoaWVlZSk7CisJCQkJCQkJfWVsc2V7CisJCQkJCQkJCWllZWU4MDIxMV9hdXRoX2NoYWxsZW5nZShpZWVlLCBjaGFsbGVuZ2UsIGNobGVuKTsKKwkJCQkJCQl9CisJCQkJCQl9ZWxzZXsKKwkJCQkJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2F1dGhfcnNfZXJyKys7CisJCQkJCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIkF1dGhlbnRpY2F0aW9uIHJlc3Bvc2Ugc3RhdHVzIGNvZGUgMHgleCIsZXJyY29kZSk7CisJCQkJCQkJaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKKwkJCQkJCX0KKworCQkJCQl9ZWxzZSBpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUil7CisJCQkJCQlpZWVlODAyMTFfcnhfYXV0aF9ycShpZWVlLCBza2IpOworCQkJCQl9CisJCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVROgorCisJCQlpZiAoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfUFJPQkVSUykgJiYKKwkJCQkoKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQyB8fAorCQkJCWllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpICYmCisJCQkJaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkpeworCQkJCWllZWU4MDIxMV9yeF9wcm9iZV9ycShpZWVlLCBza2IpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfRElTQVNTT0M6CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0RFQVVUSDoKKwkJCS8qIEZJWE1FIGZvciBub3cgcmVwZWF0IGFsbCB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlCisJCQkqIGJvdGggZm9yIGRpc2Fzc29jaWF0aW9uIGFuZCBkZWF1dGhlbnRpY2F0aW9uCisJCQkqLworCQkJaWYgKChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSkgJiYKKwkJCQlpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEICYmCisJCQkJaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKXsKKworCQkJCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HOworCQkJCWllZWUtPnNvZnRtYWNfc3RhdHMucmVhc3NvYysrOworCisJCQkJbm90aWZ5X3d4X2Fzc29jX2V2ZW50KGllZWUpOworCQkJCS8vSFRTZXRDb25uZWN0QndNb2RlKGllZWUsIEhUX0NIQU5ORUxfV0lEVEhfMjAsIEhUX0VYVENITkxfT0ZGU0VUX05PX0VYVCk7CisJCQkJUmVtb3ZlUGVlclRTKGllZWUsIGhlYWRlci0+YWRkcjIpOworCQkJCXF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5hc3NvY2lhdGVfcHJvY2VkdXJlX3dxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9NQU5BR0VfQUNUOgorCQkJaWVlZTgwMjExX3Byb2Nlc3NfYWN0aW9uKGllZWUsc2tiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC0xOworCQkJYnJlYWs7CisJfQorCisJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOworCXJldHVybiAwOworfQorCisvKiBmb2xsb3dpbmcgYXJlIGZvciBhIHNpbXBsaWVyIFRYIHF1ZXVlIG1hbmFnZW1lbnQuCisgKiBJbnN0ZWFkIG9mIHVzaW5nIG5ldGlmX1tzdG9wL3dha2VdX3F1ZXVlIHRoZSBkcml2ZXIKKyAqIHdpbGwgdXNlcyB0aGVzZSB0d28gZnVuY3Rpb24gKHBsdXMgYSByZXNldCBvbmUpLCB0aGF0CisgKiB3aWxsIGludGVybmFsbHkgdXNlcyB0aGUga2VybmVsIG5ldGlmXyogYW5kIHRha2VzCisgKiBjYXJlIG9mIHRoZSBpZWVlODAyLjExIGZyYWdtZW50YXRpb24uCisgKiBTbyB0aGUgZHJpdmVyIHJlY2VpdmVzIGEgZnJhZ21lbnQgcGVyIHRpbWUgYW5kIG1pZ2h0CisgKiBjYWxsIHRoZSBzdG9wIGZ1bmN0aW9uIHdoZW4gaXQgd2FudCB3aXRob3V0IHRha2UgY2FyZQorICogdG8gaGF2ZSBlbm91Z2h0IHJvb20gdG8gVFggYW4gZW50aXJlIHBhY2tldC4KKyAqIFRoaXMgbWlnaHQgYmUgdXNlZnVsIGlmIGVhY2ggZnJhZ21lbnQgbmVlZCBpdCdzIG93bgorICogZGVzY3JpcHRvciwgdGh1cyBqdXN0IGtlZXAgYSB0b3RhbCBmcmVlIG1lbW9yeSA+IHRoYW4KKyAqIHRoZSBtYXggZnJhZ21lbnRhdGlvbiB0cmVzaG9sZCBpcyBub3QgZW5vdWdodC4uIElmIHRoZQorICogaWVlZTgwMi4xMSBzdGFjayBwYXNzZWQgYSBUWEIgc3RydWN0IHRoZW4geW91IG5lZWRlZAorICogdG8ga2VlcCBOIGZyZWUgZGVzY3JpcHRvcnMgd2hlcmUKKyAqIE4gPSBNQVhfUEFDS0VUX1NJWkUgLyBNSU5fRlJBR19UUkVTSE9MRAorICogSW4gdGhpcyB3YXkgeW91IG5lZWQganVzdCBvbmUgYW5kIHRoZSA4MDIuMTEgc3RhY2sKKyAqIHdpbGwgdGFrZSBjYXJlIG9mIGJ1ZmZlcmluZyBmcmFnbWVudHMgYW5kIHBhc3MgdGhlbSB0bworICogdG8gdGhlIGRyaXZlciBsYXRlciwgd2hlbiBpdCB3YWtlcyB0aGUgcXVldWUuCisgKi8KK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfeG1pdChzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKworCXVuc2lnbmVkIGludCBxdWV1ZV9pbmRleCA9IHR4Yi0+cXVldWVfaW5kZXg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgIGk7CisJY2JfZGVzYyAqdGNiX2Rlc2MgPSBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssZmxhZ3MpOworCisJLyogY2FsbGVkIHdpdGggMm5kIHBhcm0gMCwgbm8gdHggbWdtdCBsb2NrIHJlcXVpcmVkICovCisJaWVlZTgwMjExX3N0YV93YWtldXAoaWVlZSwwKTsKKworCS8qIHVwZGF0ZSB0aGUgdHggc3RhdHVzICovCisJaWVlZS0+c3RhdHMudHhfYnl0ZXMgKz0gdHhiLT5wYXlsb2FkX3NpemU7CisJaWVlZS0+c3RhdHMudHhfcGFja2V0cysrOworCXRjYl9kZXNjID0gKGNiX2Rlc2MgKikodHhiLT5mcmFnbWVudHNbMF0tPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOworCWlmKHRjYl9kZXNjLT5iTXVsdGljYXN0KSB7CisJCWllZWUtPnN0YXRzLm11bHRpY2FzdCsrOworCX0KKwkvKiBpZiB4bWl0IGF2YWlsYWJsZSwganVzdCB4bWl0IGl0IGltbWVkaWF0ZWx5LCBlbHNlIGp1c3QgaW5zZXJ0IGl0IHRvIHRoZSB3YWl0IHF1ZXVlICovCisJZm9yKGkgPSAwOyBpIDwgdHhiLT5ucl9mcmFnczsgaSsrKSB7CisjaWZkZWYgVVNCX1RYX0RSSVZFUl9BR0dSRUdBVElPTl9FTkFCTEUKKwkJaWYgKChza2JfcXVldWVfbGVuKCZpZWVlLT5za2JfZHJ2X2FnZ1FbcXVldWVfaW5kZXhdKSAhPSAwKSB8fAorI2Vsc2UKKwkJaWYgKChza2JfcXVldWVfbGVuKCZpZWVlLT5za2Jfd2FpdFFbcXVldWVfaW5kZXhdKSAhPSAwKSB8fAorI2VuZGlmCisJCSghaWVlZS0+Y2hlY2tfbmljX2Vub3VnaF9kZXNjKGllZWUtPmRldixxdWV1ZV9pbmRleCkpfHxcCisJCSAgICAgKGllZWUtPnF1ZXVlX3N0b3ApKSB7CisJCQkvKiBpbnNlcnQgdGhlIHNrYiBwYWNrZXQgdG8gdGhlIHdhaXQgcXVldWUgKi8KKwkJCS8qIGFzIGZvciB0aGUgY29tcGxldGlvbiBmdW5jdGlvbiwgaXQgZG9lcyBub3QgbmVlZAorCQkJICogdG8gY2hlY2sgaXQgYW55IG1vcmUuCisJCQkgKiAqLworCQkJLy9wcmludGsoImVycm9yOm5vIGRlc2NyaXB0b3IgbGVmdEBxdWV1ZV9pbmRleCAlZFxuIiwgcXVldWVfaW5kZXgpOworCQkJLy9pZWVlODAyMTFfc3RvcF9xdWV1ZShpZWVlKTsKKyNpZmRlZiBVU0JfVFhfRFJJVkVSX0FHR1JFR0FUSU9OX0VOQUJMRQorCQkJc2tiX3F1ZXVlX3RhaWwoJmllZWUtPnNrYl9kcnZfYWdnUVtxdWV1ZV9pbmRleF0sIHR4Yi0+ZnJhZ21lbnRzW2ldKTsKKyNlbHNlCisJCQlza2JfcXVldWVfdGFpbCgmaWVlZS0+c2tiX3dhaXRRW3F1ZXVlX2luZGV4XSwgdHhiLT5mcmFnbWVudHNbaV0pOworI2VuZGlmCisJCX1lbHNleworCQkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCgKKwkJCQkJdHhiLT5mcmFnbWVudHNbaV0sCisJCQkJCWllZWUtPmRldixpZWVlLT5yYXRlKTsKKwkJCS8vaWVlZS0+c3RhdHMudHhfcGFja2V0cysrOworCQkJLy9pZWVlLT5zdGF0cy50eF9ieXRlcyArPSB0eGItPmZyYWdtZW50c1tpXS0+bGVuOworCQkJLy9pZWVlLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJfQorCX0KKwlpZWVlODAyMTFfdHhiX2ZyZWUodHhiKTsKKworLy9leGl0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssZmxhZ3MpOworCit9CisKKy8qIGNhbGxlZCB3aXRoIGllZWUtPmxvY2sgYWNxdWlyZWQgKi8KK3ZvaWQgaWVlZTgwMjExX3Jlc3VtZV90eChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpbnQgaTsKKwlmb3IoaSA9IGllZWUtPnR4X3BlbmRpbmcuZnJhZzsgaSA8IGllZWUtPnR4X3BlbmRpbmcudHhiLT5ucl9mcmFnczsgaSsrKSB7CisKKwkJaWYgKGllZWUtPnF1ZXVlX3N0b3ApeworCQkJaWVlZS0+dHhfcGVuZGluZy5mcmFnID0gaTsKKwkJCXJldHVybjsKKwkJfWVsc2V7CisKKwkJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoCisJCQkJaWVlZS0+dHhfcGVuZGluZy50eGItPmZyYWdtZW50c1tpXSwKKwkJCQlpZWVlLT5kZXYsaWVlZS0+cmF0ZSk7CisJCQkJLy8oaSsxKTxpZWVlLT50eF9wZW5kaW5nLnR4Yi0+bnJfZnJhZ3MpOworCQkJaWVlZS0+c3RhdHMudHhfcGFja2V0cysrOworCQkJaWVlZS0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCX0KKwl9CisKKworCWllZWU4MDIxMV90eGJfZnJlZShpZWVlLT50eF9wZW5kaW5nLnR4Yik7CisJaWVlZS0+dHhfcGVuZGluZy50eGIgPSBOVUxMOworfQorCisKK3ZvaWQgaWVlZTgwMjExX3Jlc2V0X3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jayxmbGFncyk7CisJaW5pdF9tZ210X3F1ZXVlKGllZWUpOworCWlmIChpZWVlLT50eF9wZW5kaW5nLnR4Yil7CisJCWllZWU4MDIxMV90eGJfZnJlZShpZWVlLT50eF9wZW5kaW5nLnR4Yik7CisJCWllZWUtPnR4X3BlbmRpbmcudHhiID0gTlVMTDsKKwl9CisJaWVlZS0+cXVldWVfc3RvcCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jayxmbGFncyk7CisKK30KKwordm9pZCBpZWVlODAyMTFfd2FrZV9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKmhlYWRlcjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLGZsYWdzKTsKKwlpZiAoISBpZWVlLT5xdWV1ZV9zdG9wKSBnb3RvIGV4aXQ7CisKKwlpZWVlLT5xdWV1ZV9zdG9wID0gMDsKKworCWlmKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFKXsKKwkJd2hpbGUgKCFpZWVlLT5xdWV1ZV9zdG9wICYmIChza2IgPSBkZXF1ZXVlX21nbXQoaWVlZSkpKXsKKworCQkJaGVhZGVyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqKSBza2ItPmRhdGE7CisKKwkJCWhlYWRlci0+c2VxX2N0bCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsWzBdIDw8IDQpOworCisJCQlpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCisJCQkJaWVlZS0+c2VxX2N0cmxbMF0gPSAwOworCQkJZWxzZQorCQkJCWllZWUtPnNlcV9jdHJsWzBdKys7CisKKwkJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoc2tiLGllZWUtPmRldixpZWVlLT5iYXNpY19yYXRlKTsKKwkJCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCisJCX0KKwl9CisJaWYgKCFpZWVlLT5xdWV1ZV9zdG9wICYmIGllZWUtPnR4X3BlbmRpbmcudHhiKQorCQlpZWVlODAyMTFfcmVzdW1lX3R4KGllZWUpOworCisJaWYgKCFpZWVlLT5xdWV1ZV9zdG9wICYmIG5ldGlmX3F1ZXVlX3N0b3BwZWQoaWVlZS0+ZGV2KSl7CisJCWllZWUtPnNvZnRtYWNfc3RhdHMuc3d0eGF3YWtlKys7CisJCW5ldGlmX3dha2VfcXVldWUoaWVlZS0+ZGV2KTsKKwl9CisKK2V4aXQgOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssZmxhZ3MpOworfQorCisKK3ZvaWQgaWVlZTgwMjExX3N0b3BfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJLy91bnNpZ25lZCBsb25nIGZsYWdzOworCS8vc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssZmxhZ3MpOworCisJaWYgKCEgbmV0aWZfcXVldWVfc3RvcHBlZChpZWVlLT5kZXYpKXsKKwkJbmV0aWZfc3RvcF9xdWV1ZShpZWVlLT5kZXYpOworCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnN3dHhzdG9wKys7CisJfQorCWllZWUtPnF1ZXVlX3N0b3AgPSAxOworCS8vc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jayxmbGFncyk7CisKK30KKworCitpbmxpbmUgdm9pZCBpZWVlODAyMTFfcmFuZG9taXplX2NlbGwoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisKKwlnZXRfcmFuZG9tX2J5dGVzKGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOworCisJLyogYW4gSUJTUyBjZWxsIGFkZHJlc3MgbXVzdCBoYXZlIHRoZSB0d28gbGVzcyBzaWduaWZpY2FudAorCSAqIGJpdHMgb2YgdGhlIGZpcnN0IGJ5dGUgPSAyCisJICovCisJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkWzBdICY9IH4weDAxOworCWllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZFswXSB8PSAweDAyOworfQorCisvKiBjYWxsZWQgaW4gdXNlciBjb250ZXh0IG9ubHkgKi8KK3ZvaWQgaWVlZTgwMjExX3N0YXJ0X21hc3Rlcl9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWVlZS0+YXNzb2NfaWQgPSAxOworCisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9PSAwKXsKKwkJc3RybmNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwKKwkJCUlFRUU4MDIxMV9ERUZBVUxUX1RYX0VTU0lELAorCQkJSVdfRVNTSURfTUFYX1NJWkUpOworCisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9IHN0cmxlbihJRUVFODAyMTFfREVGQVVMVF9UWF9FU1NJRCk7CisJCWllZWUtPnNzaWRfc2V0ID0gMTsKKwl9CisKKwltZW1jcHkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisKKwlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKwlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9MSU5LRUQ7CisJaWVlZS0+bGlua19jaGFuZ2UoaWVlZS0+ZGV2KTsKKwlub3RpZnlfd3hfYXNzb2NfZXZlbnQoaWVlZSk7CisKKwlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKKwkJaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZShpZWVlLT5kZXYpOworCisJbmV0aWZfY2Fycmllcl9vbihpZWVlLT5kZXYpOworfQorCit2b2lkIGllZWU4MDIxMV9zdGFydF9tb25pdG9yX21vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWYoaWVlZS0+cmF3X3R4KXsKKworCQlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKKwkJCWllZWUtPmRhdGFfaGFyZF9yZXN1bWUoaWVlZS0+ZGV2KTsKKworCQluZXRpZl9jYXJyaWVyX29uKGllZWUtPmRldik7CisJfQorfQordm9pZCBpZWVlODAyMTFfc3RhcnRfaWJzc193cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIHN0YXJ0X2lic3Nfd3EpOworCS8qIGl3Y29uZmlnIG1vZGUgYWQtaG9jIHdpbGwgc2NoZWR1bGUgdGhpcyBhbmQgcmV0dXJuCisJICogb24gdGhlIG90aGVyIGhhbmQgdGhpcyB3aWxsIGJsb2NrIGZ1cnRoZXIgaXdjb25maWcgU0VUCisJICogb3BlcmF0aW9ucyBiZWNhdXNlIG9mIHRoZSB3eF9zZW0gaG9sZC4KKwkgKiBBbnl3YXkgc29tZSBtb3N0IHNldCBvcGVyYXRpb25zIHNldCBhIGZsYWcgdG8gc3BlZWQtdXAKKwkgKiAoYWJvcnQpIHRoaXMgd3EgKHdoZW4gc3luY3JvIHNjYW5uaW5nKSBiZWZvcmUgc2xlZXBpbmcKKwkgKiBvbiB0aGUgc2VtYXBob3JlCisJICovCisJaWYoIWllZWUtPnByb3RvX3N0YXJ0ZWQpeworCQlwcmludGsoIj09PT09PT09PT1vaCBkcml2ZXIgZG93biByZXR1cm5cbiIpOworCQlyZXR1cm47CisJfQorCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKwlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID09IDApeworCQlzdHJjcHkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsSUVFRTgwMjExX0RFRkFVTFRfVFhfRVNTSUQpOworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPSBzdHJsZW4oSUVFRTgwMjExX0RFRkFVTFRfVFhfRVNTSUQpOworCQlpZWVlLT5zc2lkX3NldCA9IDE7CisJfQorCisJLyogY2hlY2sgaWYgd2UgaGF2ZSB0aGlzIGNlbGwgaW4gb3VyIG5ldHdvcmsgbGlzdCAqLworCWllZWU4MDIxMV9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzKGllZWUpOworCisKKyNpZmRlZiBFTkFCTEVfRE9UMTFEIC8vaWYgY3JlYXRpbmcgYW4gYWQtaG9jLCBzZXQgaXRzIGNoYW5uZWwgdG8gMTAgdGVtcG9yYXJpbHktLXRoaXMgaXMgdGhlIHJlcXVpcmVtZW50IGZvciBBU1VTLCBub3QgMTFELCBzbyBkaXNhYmxlIDExZC4KKy8vCWlmKChJU19ET1QxMURfRU5BQkxFKGllZWUpKSAmJiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykpCisJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspCisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0gNjsKKyNlbmRpZgorCS8qIGlmIG5vdCB0aGVuIHRoZSBzdGF0ZSBpcyBub3QgbGlua2VkLiBNYXliZSB0aGUgdXNlciBzd2l0aGNlZCB0bworCSAqIGFkLWhvYyBtb2RlIGp1c3QgYWZ0ZXIgYmVpbmcgaW4gbW9uaXRvciBtb2RlLCBvciBqdXN0IGFmdGVyCisJICogYmVpbmcgdmVyeSBmZXcgdGltZSBpbiBtYW5hZ2VkIG1vZGUgKHNvIHRoZSBjYXJkIGhhdmUgaGFkIG5vCisJICogdGltZSB0byBzY2FuIGFsbCB0aGUgY2hhbnMuLikgb3Igd2UgaGF2ZSBqdXN0IHJ1biB1cCB0aGUgaWZhY2UKKwkgKiBhZnRlciBzZXR0aW5nIGFkLWhvYyBtb2RlLiBTbyB3ZSBoYXZlIHRvIGdpdmUgYW5vdGhlciB0cnkuLgorCSAqIEhlcmUsIGluIGlic3MgbW9kZSwgc2hvdWxkIGJlIHNhZmUgdG8gZG8gdGhpcyB3aXRob3V0IGV4dHJhIGNhcmUKKwkgKiAoaW4gYnNzIG1vZGUgd2UgaGFkIHRvIG1ha2Ugc3VyZSBuby1vbmUgdHJ5ZWQgdG8gYXNzb2NpYXRlIHdoZW4KKwkgKiB3ZSBoYWQganVzdCBjaGVja2VkIHRoZSBpZWVlLT5zdGF0ZSBhbmQgd2Ugd2FzIGdvaW5nIHRvIHN0YXJ0IHRoZQorCSAqIHNjYW4pIGJlYWNhdXNlIGluIGlic3MgbW9kZSB0aGUgaWVlZTgwMjExX25ld19uZXQgZnVuY3Rpb24sIHdoZW4KKwkgKiBmaW5kcyBhIGdvb2QgbmV0LCBqdXN0IHNldCB0aGUgaWVlZS0+c3RhdGUgdG8gSUVFRTgwMjExX0xJTktFRCwKKwkgKiBzbywgYXQgd29yc3QsIHdlIHdhc3RlIGEgYml0IG9mIHRpbWUgdG8gaW5pdGlhdGUgYW4gdW5uZWVkZWQgc3luY3JvCisJICogc2NhbiwgdGhhdCB3aWxsIHN0b3AgYXQgdGhlIGZpcnN0IHJvdW5kIGJlY2F1c2UgaXQgc2VlcyB0aGUgc3RhdGUKKwkgKiBhc3NvY2lhdGVkLgorCSAqLworCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKQorCQlpZWVlODAyMTFfc3RhcnRfc2Nhbl9zeW5jcm8oaWVlZSk7CisKKwkvKiB0aGUgbmV0d29yayBkZWZpbml0aXZlbHkgaXMgbm90IGhlcmUuLiBjcmVhdGUgYSBuZXcgY2VsbCAqLworCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKXsKKwkJcHJpbnRrKCJjcmVhdGluZyBuZXcgSUJTUyBjZWxsXG4iKTsKKwkJaWYoIWllZWUtPndhcF9zZXQpCisJCQlpZWVlODAyMTFfcmFuZG9taXplX2NlbGwoaWVlZSk7CisKKwkJaWYoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTil7CisKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19sZW4gPSA0OworCisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNbMF0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzFNQjsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc1sxXSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfQ0NLX1JBVEVfMk1COworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzWzJdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV81TUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNbM10gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzExTUI7CisKKwkJfWVsc2UKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19sZW4gPSAwOworCisJCWlmKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKXsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leF9sZW4gPSA4OworCisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbMF0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV82TUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbMV0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV85TUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbMl0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV8xMk1COworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzNdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQjsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFs0XSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbNV0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV8zNk1COworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzZdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQjsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFs3XSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUI7CisKKwkJCWllZWUtPnJhdGUgPSAxMDg7CisJCX1lbHNleworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4X2xlbiA9IDA7CisJCQlpZWVlLT5yYXRlID0gMjI7CisJCX0KKworCQkvLyBCeSBkZWZhdWx0LCBXTU0gZnVuY3Rpb24gd2lsbCBiZSBkaXNhYmxlZCBpbiBJQlNTIG1vZGUKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLlFvU19FbmFibGUgPSAwOworCQlpZWVlLT5TZXRXaXJlbGVzc01vZGUoaWVlZS0+ZGV2LCBJRUVFX0cpOworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuYXRpbV93aW5kb3cgPSAwOworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSA9IFdMQU5fQ0FQQUJJTElUWV9JQlNTOworCQlpZihpZWVlLT5zaG9ydF9zbG90KQorCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgfD0gV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1Q7CisKKwl9CisKKwlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9MSU5LRUQ7CisKKwlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKwlpZWVlLT5saW5rX2NoYW5nZShpZWVlLT5kZXYpOworCisJbm90aWZ5X3d4X2Fzc29jX2V2ZW50KGllZWUpOworCisJaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucyhpZWVlKTsKKworCWlmIChpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKQorCQlpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKGllZWUtPmRldik7CisJbmV0aWZfY2Fycmllcl9vbihpZWVlLT5kZXYpOworCisJdXAoJmllZWUtPnd4X3NlbSk7Cit9CisKK2lubGluZSB2b2lkIGllZWU4MDIxMV9zdGFydF9pYnNzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXF1ZXVlX2RlbGF5ZWRfd29yayhpZWVlLT53cSwgJmllZWUtPnN0YXJ0X2lic3Nfd3EsIDE1MCk7Cit9CisKKy8qIHRoaXMgaXMgY2FsbGVkIG9ubHkgaW4gdXNlciBjb250ZXh0LCB3aXRoIHd4X3NlbSBoZWxkICovCit2b2lkIGllZWU4MDIxMV9zdGFydF9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJLy8KKwkvLyBSZWY6IDgwMi4xMWQgMTEuMS4zLjMKKwkvLyBTVEEgc2hhbGwgbm90IHN0YXJ0IGEgQlNTIHVubGVzcyBwcm9wZXJseSBmb3JtZWQgQmVhY29uIGZyYW1lIGluY2x1ZGluZyBhIENvdW50cnkgSUUuCisJLy8KKwlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpICYmICFJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpKQorCXsKKwkJaWYoISBpZWVlLT5iR2xvYmFsRG9tYWluKQorCQl7CisJCQlyZXR1cm47CisJCX0KKwl9CisjZW5kaWYKKwkvKiBjaGVjayBpZiB3ZSBoYXZlIGFscmVhZHkgZm91bmQgdGhlIG5ldCB3ZQorCSAqIGFyZSBpbnRlcmVzdGVkIGluIChpZiBhbnkpLgorCSAqIGlmIG5vdCAod2UgYXJlIGRpc2Fzc29jaWF0ZWQgYW5kIHdlIGFyZSBub3QKKwkgKiBpbiBhc3NvY2lhdGluZyAvIGF1dGhlbnRpY2F0aW5nIHBoYXNlKSBzdGFydCB0aGUgYmFja2dyb3VuZCBzY2FubmluZy4KKwkgKi8KKwlpZWVlODAyMTFfc29mdG1hY19jaGVja19hbGxfbmV0cyhpZWVlKTsKKworCS8qIGVuc3VyZSBuby1vbmUgc3RhcnQgYW4gYXNzb2NpYXRpbmcgcHJvY2VzcyAodGh1cyBzZXR0aW5nCisJICogdGhlIGllZWUtPnN0YXRlIHRvIGllZWU4MDIxMV9BU1NPQ0lBVElORykgd2hpbGUgd2UKKwkgKiBoYXZlIGp1c3QgY2hla2VkIGl0IGFuZCB3ZSBhcmUgZ29pbmcgdG8gZW5hYmxlIHNjYW4uCisJICogVGhlIGllZWU4MDIxMV9uZXdfbmV0IGZ1bmN0aW9uIGlzIGFsd2F5cyBjYWxsZWQgd2l0aAorCSAqIGxvY2sgaGVsZCAoZnJvbSBib3RoIGllZWU4MDIxMV9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzIGFuZAorCSAqIHRoZSByeCBwYXRoKSwgc28gd2UgY2Fubm90IGJlIGluIHRoZSBtaWRkbGUgb2Ygc3VjaCBmdW5jdGlvbgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSyl7CisJCWllZWUtPmFjdHNjYW5uaW5nID0gdHJ1ZTsKKwkJaWVlZTgwMjExX3N0YXJ0X3NjYW4oaWVlZSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKK30KKworLyogY2FsbGVkIG9ubHkgaW4gdXNlcnNwYWNlIGNvbnRleHQgKi8KK3ZvaWQgaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKworCisJbmV0aWZfY2Fycmllcl9vZmYoaWVlZS0+ZGV2KTsKKwlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19UWF9RVUVVRSkKKwkJCWllZWU4MDIxMV9yZXNldF9xdWV1ZShpZWVlKTsKKworCWlmIChpZWVlLT5kYXRhX2hhcmRfc3RvcCkKKwkJCWllZWUtPmRhdGFfaGFyZF9zdG9wKGllZWUtPmRldik7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpCisJCURvdDExZF9SZXNldChpZWVlKTsKKyNlbmRpZgorCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX05PTElOSzsKKwlpZWVlLT5pc19zZXRfa2V5ID0gZmFsc2U7CisJaWVlZS0+bGlua19jaGFuZ2UoaWVlZS0+ZGV2KTsKKwkvL0hUU2V0Q29ubmVjdEJ3TW9kZShpZWVlLCBIVF9DSEFOTkVMX1dJRFRIXzIwLCBIVF9FWFRDSE5MX09GRlNFVF9OT19FWFQpOworCW5vdGlmeV93eF9hc3NvY19ldmVudChpZWVlKTsKKworfQordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3JldHJ5X3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKyAgICAgICAgc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayk7CisgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgYXNzb2NpYXRlX3JldHJ5X3dxKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKwlpZighaWVlZS0+cHJvdG9fc3RhcnRlZCkKKwkJZ290byBleGl0OworCisJaWYoaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0FTU09DSUFUSU5HX1JFVFJZKQorCQlnb3RvIGV4aXQ7CisKKwkvKiB1bnRpbCB3ZSBkbyBub3Qgc2V0IHRoZSBzdGF0ZSB0byBJRUVFODAyMTFfTk9MSU5LCisJKiB0aGVyZSBhcmUgbm8gcG9zc2liaWxpdHkgdG8gaGF2ZSBzb21lb25lIGVsc2UgdHJ5aW5nCisJKiB0byBzdGFydCBhbiBhc3NvY2lhdGlvbiBwcm9jZHVyZSAod2UgZ2V0IGhlcmUgd2l0aAorCSogaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkcpLgorCSogV2hlbiB3ZSBzZXQgdGhlIHN0YXRlIHRvIElFRUU4MDIxMV9OT0xJTksgaXQgaXMgcG9zc2libGUKKwkqIHRoYXQgdGhlIFJYIHBhdGggcnVuIGFuIGF0dGVtcHQgdG8gYXNzb2NpYXRlLCBidXQKKwkqIGJvdGggaWVlZTgwMjExX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMgYW5kIHRoZQorCSogUlggcGF0aCB3b3JrcyB3aXRoIGllZWUtPmxvY2sgaGVsZCBzbyB0aGVyZSBhcmUgbm8KKwkqIHByb2JsZW1zLiBJZiB3ZSBhcmUgc3RpbGwgZGlzYXNzb2NpYXRlZCB0aGVuIHN0YXJ0IGEgc2Nhbi4KKwkqIHRoZSBsb2NrIGhlcmUgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSBubyBvbmUgdHJ5IHRvIHN0YXJ0CisJKiBhbiBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgd2hlbiB3ZSBoYXZlIGp1c3QgY2hlY2tlZCB0aGUKKwkqIHN0YXRlIGFuZCB3ZSBhcmUgZ29pbmcgdG8gc3RhcnQgdGhlIHNjYW4uCisJKi8KKwlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9OT0xJTks7CisKKwlpZWVlODAyMTFfc29mdG1hY19jaGVja19hbGxfbmV0cyhpZWVlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZihpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKQorCQlpZWVlODAyMTFfc3RhcnRfc2NhbihpZWVlKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworZXhpdDoKKwl1cCgmaWVlZS0+d3hfc2VtKTsKK30KKworc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9nZXRfYmVhY29uXyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwl1OCBicm9hZGNhc3RfYWRkcltdID0gezB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmfTsKKworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqYjsKKworCXNrYiA9IGllZWU4MDIxMV9wcm9iZV9yZXNwKGllZWUsIGJyb2FkY2FzdF9hZGRyKTsKKworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCWIgPSAoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqKSBza2ItPmRhdGE7CisJYi0+aGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9CRUFDT04pOworCisJcmV0dXJuIHNrYjsKKworfQorCitzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2dldF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICpiOworCisJc2tiID0gaWVlZTgwMjExX2dldF9iZWFjb25fKGllZWUpOworCWlmKCFza2IpCisJCXJldHVybiBOVUxMOworCisJYiA9IChzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICopIHNrYi0+ZGF0YTsKKwliLT5oZWFkZXIuc2VxX2N0bCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsWzBdIDw8IDQpOworCisJaWYgKGllZWUtPnNlcV9jdHJsWzBdID09IDB4RkZGKQorCQlpZWVlLT5zZXFfY3RybFswXSA9IDA7CisJZWxzZQorCQlpZWVlLT5zZXFfY3RybFswXSsrOworCisJcmV0dXJuIHNrYjsKK30KKwordm9pZCBpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMTsKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCWllZWU4MDIxMV9zdG9wX3Byb3RvY29sKGllZWUpOworCXVwKCZpZWVlLT53eF9zZW0pOworfQorCisKK3ZvaWQgaWVlZTgwMjExX3N0b3BfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWYgKCFpZWVlLT5wcm90b19zdGFydGVkKQorCQlyZXR1cm47CisKKwlpZWVlLT5wcm90b19zdGFydGVkID0gMDsKKworCWllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucyhpZWVlKTsKKwlkZWxfdGltZXJfc3luYygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EpOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPnN0YXJ0X2lic3Nfd3EpOworCWllZWU4MDIxMV9zdG9wX3NjYW4oaWVlZSk7CisKKwlpZWVlODAyMTFfZGlzYXNzb2NpYXRlKGllZWUpOworCVJlbW92ZUFsbFRTKGllZWUpOyAvL2FkZGVkIGFzIHdlIGRpc2Nvbm5lY3QgZnJvbSB0aGUgcHJldmlvdXMgQlNTLCBSZW1vdmUgYWxsIFRTCit9CisKK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAwOworCWRvd24oJmllZWUtPnd4X3NlbSk7CisJaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKGllZWUpOworCXVwKCZpZWVlLT53eF9zZW0pOworfQorCit2b2lkIGllZWU4MDIxMV9zdGFydF9wcm90b2NvbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlzaG9ydCBjaCA9IDA7CisJaW50IGkgPSAwOworCWlmIChpZWVlLT5wcm90b19zdGFydGVkKQorCQlyZXR1cm47CisKKwlpZWVlLT5wcm90b19zdGFydGVkID0gMTsKKworCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9PSAwKXsKKwkJZG97CisJCQljaCsrOworCQkJaWYgKGNoID4gTUFYX0NIQU5ORUxfTlVNQkVSKQorCQkJCXJldHVybjsgLyogbm8gY2hhbm5lbCBmb3VuZCAqLworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkJfXdoaWxlKCFHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwW2NoXSk7CisjZWxzZQorCQl9d2hpbGUoIWllZWUtPmNoYW5uZWxfbWFwW2NoXSk7CisjZW5kaWYKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSBjaDsKKwl9CisKKwlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCA9PSAwKQorCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsID0gMTAwOworLy8JcHJpbnRrKCI9PT0+JXMoKSwgY2hhbjolZFxuIiwgX19GVU5DVElPTl9fLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisvLwlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCisJZm9yKGkgPSAwOyBpIDwgMTc7IGkrKykgeworCSAgaWVlZS0+bGFzdF9yeHNlcV9udW1baV0gPSAtMTsKKwkgIGllZWUtPmxhc3RfcnhmcmFnX251bVtpXSA9IC0xOworCSAgaWVlZS0+bGFzdF9wYWNrZXRfdGltZVtpXSA9IDA7CisJfQorCisJaWVlZS0+aW5pdF93bW1wYXJhbV9mbGFnID0gMDsvL3JlaW5pdGlhbGl6ZSBBQ194eF9QQVJBTSByZWdpc3RlcnMuCisKKworCS8qIGlmIHRoZSB1c2VyIHNldCB0aGUgTUFDIG9mIHRoZSBhZC1ob2MgY2VsbCBhbmQgdGhlbgorCSAqIHN3aXRjaCB0byBtYW5hZ2VkIG1vZGUsIHNoYWxsIHdlICBtYWtlIHN1cmUgdGhhdCBhc3NvY2lhdGlvbgorCSAqIGF0dGVtcHRzIGRvZXMgbm90IGZhaWwganVzdCBiZWNhdXNlIHRoZSB1c2VyIHByb3ZpZGUgdGhlIGVzc2lkCisJICogYW5kIHRoZSBuaWMgaXMgc3RpbGwgY2hlY2tpbmcgZm9yIHRoZSBBUCBNQUMgPz8KKwkgKi8KKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKQorCQlpZWVlODAyMTFfc3RhcnRfYnNzKGllZWUpOworCisJZWxzZSBpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQorCQlpZWVlODAyMTFfc3RhcnRfaWJzcyhpZWVlKTsKKworCWVsc2UgaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpCisJCWllZWU4MDIxMV9zdGFydF9tYXN0ZXJfYnNzKGllZWUpOworCisJZWxzZSBpZihpZWVlLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikKKwkJaWVlZTgwMjExX3N0YXJ0X21vbml0b3JfbW9kZShpZWVlKTsKK30KKworCisjZGVmaW5lIERSVl9OQU1FICAiSWVlZTgwMjExIgordm9pZCBpZWVlODAyMTFfc29mdG1hY19pbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWludCBpOworCW1lbXNldCgmaWVlZS0+Y3VycmVudF9uZXR3b3JrLCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrKSk7CisKKwlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9OT0xJTks7CisJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAwOworCWZvcihpID0gMDsgaSA8IDU7IGkrKykgeworCSAgaWVlZS0+c2VxX2N0cmxbaV0gPSAwOworCX0KKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWVlZS0+cERvdDExZEluZm8gPSBrbWFsbG9jKHNpemVvZihSVF9ET1QxMURfSU5GTyksIEdGUF9BVE9NSUMpOworCWlmICghaWVlZS0+cERvdDExZEluZm8pCisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiY2FuJ3QgYWxsb2MgbWVtb3J5IGZvciBET1QxMURcbiIpOworCW1lbXNldChpZWVlLT5wRG90MTFkSW5mbywgMCwgc2l6ZW9mKFJUX0RPVDExRF9JTkZPKSk7CisjZW5kaWYKKwkvL2FkZGVkIGZvciAgQVAgcm9hbWluZworCWllZWUtPkxpbmtEZXRlY3RJbmZvLlNsb3ROdW0gPSAyOworCWllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZCY25JblBlcmlvZD0wOworCWllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZEYXRhSW5QZXJpb2Q9MDsKKworCWllZWUtPmFzc29jX2lkID0gMDsKKwlpZWVlLT5xdWV1ZV9zdG9wID0gMDsKKwlpZWVlLT5zY2FubmluZyA9IDA7CisJaWVlZS0+c29mdG1hY19mZWF0dXJlcyA9IDA7IC8vc28gSUVFRTIxMDAtbGlrZSBkcml2ZXIgYXJlIGhhcHB5CisJaWVlZS0+d2FwX3NldCA9IDA7CisJaWVlZS0+c3NpZF9zZXQgPSAwOworCWllZWUtPnByb3RvX3N0YXJ0ZWQgPSAwOworCWllZWUtPmJhc2ljX3JhdGUgPSBJRUVFODAyMTFfREVGQVVMVF9CQVNJQ19SQVRFOworCWllZWUtPnJhdGUgPSAyMjsKKwlpZWVlLT5wcyA9IElFRUU4MDIxMV9QU19ESVNBQkxFRDsKKwlpZWVlLT5zdGFfc2xlZXAgPSAwOworCWllZWUtPlJlZ2RvdDExSFRPcGVyYXRpb25hbFJhdGVTZXRbMF09IDB4ZmY7Ly9zdXBwb3J0IE1DUyAwfjcKKwlpZWVlLT5SZWdkb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0WzFdPSAweGZmOy8vc3VwcG9ydCBNQ1MgOH4xNQorCWllZWUtPlJlZ2RvdDExSFRPcGVyYXRpb25hbFJhdGVTZXRbNF09IDB4MDE7CisJLy9hZGRlZCBieSBhbXkKKwlpZWVlLT5hY3RzY2FubmluZyA9IGZhbHNlOworCWllZWUtPmJlaW5yZXRyeSA9IGZhbHNlOworCWllZWUtPmlzX3NldF9rZXkgPSBmYWxzZTsKKwlpbml0X21nbXRfcXVldWUoaWVlZSk7CisKKwlpZWVlLT5zdGFfZWRjYV9wYXJhbVswXSA9IDB4MDAwMEE0MDM7CisJaWVlZS0+c3RhX2VkY2FfcGFyYW1bMV0gPSAweDAwMDBBNDI3OworCWllZWUtPnN0YV9lZGNhX3BhcmFtWzJdID0gMHgwMDVFNDM0MjsKKwlpZWVlLT5zdGFfZWRjYV9wYXJhbVszXSA9IDB4MDAyRjMyNjI7CisJaWVlZS0+YWdncmVnYXRpb24gPSB0cnVlOworCWllZWUtPmVuYWJsZV9yeF9pbW1fQkEgPSAxOworCWllZWUtPnR4X3BlbmRpbmcudHhiID0gTlVMTDsKKworCWluaXRfdGltZXIoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CisJaWVlZS0+YXNzb2NpYXRlX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylpZWVlOworCWllZWUtPmFzc29jaWF0ZV90aW1lci5mdW5jdGlvbiA9IGllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnRfY2I7CisKKwlpbml0X3RpbWVyKCZpZWVlLT5iZWFjb25fdGltZXIpOworCWllZWUtPmJlYWNvbl90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGllZWU7CisJaWVlZS0+YmVhY29uX3RpbWVyLmZ1bmN0aW9uID0gaWVlZTgwMjExX3NlbmRfYmVhY29uX2NiOworCisjaWZkZWYgUEZfU1lOQ1RIUkVBRAorCWllZWUtPndxID0gY3JlYXRlX3dvcmtxdWV1ZShEUlZfTkFNRSwwKTsKKyNlbHNlCisJaWVlZS0+d3EgPSBjcmVhdGVfd29ya3F1ZXVlKERSVl9OQU1FKTsKKyNlbmRpZgorCisJSU5JVF9ERUxBWUVEX1dPUksoJmllZWUtPnN0YXJ0X2lic3Nfd3EsaWVlZTgwMjExX3N0YXJ0X2lic3Nfd3EpOworCUlOSVRfV09SSygmaWVlZS0+YXNzb2NpYXRlX2NvbXBsZXRlX3dxLCBpZWVlODAyMTFfYXNzb2NpYXRlX2NvbXBsZXRlX3dxKTsKKwlJTklUX1dPUksoJmllZWUtPmFzc29jaWF0ZV9wcm9jZWR1cmVfd3EsIGllZWU4MDIxMV9hc3NvY2lhdGVfcHJvY2VkdXJlX3dxKTsKKwlJTklUX0RFTEFZRURfV09SSygmaWVlZS0+c29mdG1hY19zY2FuX3dxLGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fd3EpOworCUlOSVRfREVMQVlFRF9XT1JLKCZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EsIGllZWU4MDIxMV9hc3NvY2lhdGVfcmV0cnlfd3EpOworCUlOSVRfV09SSygmaWVlZS0+d3hfc3luY19zY2FuX3dxLGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3EpOworCisKKwlzZW1hX2luaXQoJmllZWUtPnd4X3NlbSwgMSk7CisJc2VtYV9pbml0KCZpZWVlLT5zY2FuX3NlbSwgMSk7CisKKwlzcGluX2xvY2tfaW5pdCgmaWVlZS0+bWdtdF90eF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmaWVlZS0+YmVhY29uX2xvY2spOworCisJdGFza2xldF9pbml0KCZpZWVlLT5wc190YXNrLAorCSAgICAgKHZvaWQoKikodW5zaWduZWQgbG9uZykpIGllZWU4MDIxMV9zdGFfcHMsCisJICAgICAodW5zaWduZWQgbG9uZylpZWVlKTsKKworfQorCit2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2ZyZWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJZG93bigmaWVlZS0+d3hfc2VtKTsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYoTlVMTCAhPSBpZWVlLT5wRG90MTFkSW5mbykKKwl7CisJCWtmcmVlKGllZWUtPnBEb3QxMWRJbmZvKTsKKwkJaWVlZS0+cERvdDExZEluZm8gPSBOVUxMOworCX0KKyNlbmRpZgorCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOworCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShpZWVlLT53cSk7CisKKwl1cCgmaWVlZS0+d3hfc2VtKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTdGFydCBvZiBXUEEgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHRoaXMgaXMgc3RvbGVuIGZyb20gdGhlIGlwdzIyMDAgZHJpdmVyICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3dwYV9lbmFibGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGludCB2YWx1ZSkKK3sKKwkvKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHdwYV9zdXBwbGljYW50IGxvYWRzIGFuZCBjbG9zZXMgdGhlIGRyaXZlcgorCSAqIGludGVyZmFjZS4gKi8KKwlwcmludGsoIiVzIFdQQVxuIix2YWx1ZSA/ICJlbmFibGluZyIgOiAiZGlzYWJsaW5nIik7CisJaWVlZS0+d3BhX2VuYWJsZWQgPSB2YWx1ZTsKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGllZWU4MDIxMV93cGFfYXNzb2NfZnJhbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGNoYXIgKndwYV9pZSwgaW50IHdwYV9pZV9sZW4pCit7CisJLyogbWFrZSBzdXJlIFdQQSBpcyBlbmFibGVkICovCisJaWVlZTgwMjExX3dwYV9lbmFibGUoaWVlZSwgMSk7CisKKwlpZWVlODAyMTFfZGlzYXNzb2NpYXRlKGllZWUpOworfQorCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3dwYV9tbG1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBpbnQgY29tbWFuZCwgaW50IHJlYXNvbikKK3sKKworCWludCByZXQgPSAwOworCisJc3dpdGNoIChjb21tYW5kKSB7CisJY2FzZSBJRUVFX01MTUVfU1RBX0RFQVVUSDoKKwkJLy8gc2lsZW50bHkgaWdub3JlCisJCWJyZWFrOworCisJY2FzZSBJRUVFX01MTUVfU1RBX0RJU0FTU09DOgorCQlpZWVlODAyMTFfZGlzYXNzb2NpYXRlKGllZWUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50aygiVW5rbm93biBNTE1FIHJlcXVlc3Q6ICVkXG4iLCBjb21tYW5kKTsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IGllZWU4MDIxMV93cGFfc2V0X3dwYV9pZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgIHN0cnVjdCBpZWVlX3BhcmFtICpwYXJhbSwgaW50IHBsZW4pCit7CisJdTggKmJ1ZjsKKworCWlmIChwYXJhbS0+dS53cGFfaWUubGVuID4gTUFYX1dQQV9JRV9MRU4gfHwKKwkgICAgKHBhcmFtLT51LndwYV9pZS5sZW4gJiYgcGFyYW0tPnUud3BhX2llLmRhdGEgPT0gTlVMTCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBhcmFtLT51LndwYV9pZS5sZW4pIHsKKwkJYnVmID0ga21hbGxvYyhwYXJhbS0+dS53cGFfaWUubGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJbWVtY3B5KGJ1ZiwgcGFyYW0tPnUud3BhX2llLmRhdGEsIHBhcmFtLT51LndwYV9pZS5sZW4pOworCQlrZnJlZShpZWVlLT53cGFfaWUpOworCQlpZWVlLT53cGFfaWUgPSBidWY7CisJCWllZWUtPndwYV9pZV9sZW4gPSBwYXJhbS0+dS53cGFfaWUubGVuOworCX0gZWxzZSB7CisJCWtmcmVlKGllZWUtPndwYV9pZSk7CisJCWllZWUtPndwYV9pZSA9IE5VTEw7CisJCWllZWUtPndwYV9pZV9sZW4gPSAwOworCX0KKworCWllZWU4MDIxMV93cGFfYXNzb2NfZnJhbWUoaWVlZSwgaWVlZS0+d3BhX2llLCBpZWVlLT53cGFfaWVfbGVuKTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBBVVRIX0FMR19PUEVOX1NZU1RFTQkJCTB4MQorI2RlZmluZSBBVVRIX0FMR19TSEFSRURfS0VZCQkJMHgyCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3dwYV9zZXRfYXV0aF9hbGdzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBpbnQgdmFsdWUpCit7CisKKwlzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYyA9IHsKKwkJLmZsYWdzID0gU0VDX0FVVEhfTU9ERSwKKwl9OworCWludCByZXQgPSAwOworCisJaWYgKHZhbHVlICYgQVVUSF9BTEdfU0hBUkVEX0tFWSkgeworCQlzZWMuYXV0aF9tb2RlID0gV0xBTl9BVVRIX1NIQVJFRF9LRVk7CisJCWllZWUtPm9wZW5fd2VwID0gMDsKKwkJaWVlZS0+YXV0aF9tb2RlID0gMTsKKwl9IGVsc2UgaWYgKHZhbHVlICYgQVVUSF9BTEdfT1BFTl9TWVNURU0peworCQlzZWMuYXV0aF9tb2RlID0gV0xBTl9BVVRIX09QRU47CisJCWllZWUtPm9wZW5fd2VwID0gMTsKKwkJaWVlZS0+YXV0aF9tb2RlID0gMDsKKwl9CisJZWxzZSBpZiAodmFsdWUgJiBJV19BVVRIX0FMR19MRUFQKXsKKwkJc2VjLmF1dGhfbW9kZSA9IFdMQU5fQVVUSF9MRUFQOworCQlpZWVlLT5vcGVuX3dlcCA9IDE7CisJCWllZWUtPmF1dGhfbW9kZSA9IDI7CisJfQorCisKKwlpZiAoaWVlZS0+c2V0X3NlY3VyaXR5KQorCQlpZWVlLT5zZXRfc2VjdXJpdHkoaWVlZS0+ZGV2LCAmc2VjKTsKKwkvL2Vsc2UKKwkvLwlyZXQgPSAtRU9QTk9UU1VQUDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3dwYV9zZXRfcGFyYW0oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4IG5hbWUsIHUzMiB2YWx1ZSkKK3sKKwlpbnQgcmV0PTA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN3aXRjaCAobmFtZSkgeworCWNhc2UgSUVFRV9QQVJBTV9XUEFfRU5BQkxFRDoKKwkJcmV0ID0gaWVlZTgwMjExX3dwYV9lbmFibGUoaWVlZSwgdmFsdWUpOworCQlicmVhazsKKworCWNhc2UgSUVFRV9QQVJBTV9US0lQX0NPVU5URVJNRUFTVVJFUzoKKwkJaWVlZS0+dGtpcF9jb3VudGVybWVhc3VyZXM9dmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBJRUVFX1BBUkFNX0RST1BfVU5FTkNSWVBURUQ6IHsKKwkJLyogSEFDSzoKKwkJICoKKwkJICogd3BhX3N1cHBsaWNhbnQgY2FsbHMgc2V0X3dwYV9lbmFibGVkIHdoZW4gdGhlIGRyaXZlcgorCQkgKiBpcyBsb2FkZWQgYW5kIHVubG9hZGVkLCByZWdhcmRsZXNzIG9mIGlmIFdQQSBpcyBiZWluZworCQkgKiB1c2VkLiAgTm8gb3RoZXIgY2FsbHMgYXJlIG1hZGUgd2hpY2ggY2FuIGJlIHVzZWQgdG8KKwkJICogZGV0ZXJtaW5lIGlmIGVuY3J5cHRpb24gd2lsbCBiZSB1c2VkIG9yIG5vdCBwcmlvciB0bworCQkgKiBhc3NvY2lhdGlvbiBiZWluZyBleHBlY3RlZC4gIElmIGVuY3J5cHRpb24gaXMgbm90IGJlaW5nCisJCSAqIHVzZWQsIGRyb3BfdW5lbmNyeXB0ZWQgaXMgc2V0IHRvIGZhbHNlLCBlbHNlIHRydWUgLS0gd2UKKwkJICogY2FuIHVzZSB0aGlzIHRvIGRldGVybWluZSBpZiB0aGUgQ0FQX1BSSVZBQ1lfT04gYml0IHNob3VsZAorCQkgKiBiZSBzZXQuCisJCSAqLworCQlzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYyA9IHsKKwkJCS5mbGFncyA9IFNFQ19FTkFCTEVELAorCQkJLmVuYWJsZWQgPSB2YWx1ZSwKKwkJfTsKKwkJaWVlZS0+ZHJvcF91bmVuY3J5cHRlZCA9IHZhbHVlOworCQkvKiBXZSBvbmx5IGNoYW5nZSBTRUNfTEVWRUwgZm9yIG9wZW4gbW9kZS4gT3RoZXJzCisJCSAqIGFyZSBzZXQgYnkgaXB3X3dwYV9zZXRfZW5jcnlwdGlvbi4KKwkJICovCisJCWlmICghdmFsdWUpIHsKKwkJCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMDsKKwkJfQorCQllbHNlIHsKKwkJCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMTsKKwkJfQorCQlpZiAoaWVlZS0+c2V0X3NlY3VyaXR5KQorCQkJaWVlZS0+c2V0X3NlY3VyaXR5KGllZWUtPmRldiwgJnNlYyk7CisJCWJyZWFrOworCX0KKworCWNhc2UgSUVFRV9QQVJBTV9QUklWQUNZX0lOVk9LRUQ6CisJCWllZWUtPnByaXZhY3lfaW52b2tlZD12YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIElFRUVfUEFSQU1fQVVUSF9BTEdTOgorCQlyZXQgPSBpZWVlODAyMTFfd3BhX3NldF9hdXRoX2FsZ3MoaWVlZSwgdmFsdWUpOworCQlicmVhazsKKworCWNhc2UgSUVFRV9QQVJBTV9JRUVFXzgwMl8xWDoKKwkJaWVlZS0+aWVlZTgwMl8xeD12YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFX1BBUkFNX1dQQVhfU0VMRUNUOgorCQkvLyBhZGRlZCBmb3IgV1BBMiBtaXhlZCBtb2RlCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT53cGF4X3N1aXRsaXN0X2xvY2ssZmxhZ3MpOworCQlpZWVlLT53cGF4X3R5cGVfc2V0ID0gMTsKKwkJaWVlZS0+d3BheF90eXBlX25vdGlmeSA9IHZhbHVlOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT53cGF4X3N1aXRsaXN0X2xvY2ssZmxhZ3MpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50aygiVW5rbm93biBXUEEgcGFyYW06ICVkXG4iLG5hbWUpOworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBpbXBsZW1lbnRhdGlvbiBib3Jyb3dlZCBmcm9tIGhvc3RhcCBkcml2ZXIgKi8KKworc3RhdGljIGludCBpZWVlODAyMTFfd3BhX3NldF9lbmNyeXB0aW9uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgc3RydWN0IGllZWVfcGFyYW0gKnBhcmFtLCBpbnQgcGFyYW1fbGVuKQoreworCWludCByZXQgPSAwOworCisJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpvcHM7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICoqY3J5cHQ7CisKKwlzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYyA9IHsKKwkJLmZsYWdzID0gMCwKKwl9OworCisJcGFyYW0tPnUuY3J5cHQuZXJyID0gMDsKKwlwYXJhbS0+dS5jcnlwdC5hbGdbSUVFRV9DUllQVF9BTEdfTkFNRV9MRU4gLSAxXSA9ICdcMCc7CisKKwlpZiAocGFyYW1fbGVuICE9CisJICAgIChpbnQpICgoY2hhciAqKSBwYXJhbS0+dS5jcnlwdC5rZXkgLSAoY2hhciAqKSBwYXJhbSkgKworCSAgICBwYXJhbS0+dS5jcnlwdC5rZXlfbGVuKSB7CisJCXByaW50aygiTGVuIG1pc21hdGNoICVkLCAlZFxuIiwgcGFyYW1fbGVuLAorCQkJICAgICAgIHBhcmFtLT51LmNyeXB0LmtleV9sZW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHBhcmFtLT5zdGFfYWRkclswXSA9PSAweGZmICYmIHBhcmFtLT5zdGFfYWRkclsxXSA9PSAweGZmICYmCisJICAgIHBhcmFtLT5zdGFfYWRkclsyXSA9PSAweGZmICYmIHBhcmFtLT5zdGFfYWRkclszXSA9PSAweGZmICYmCisJICAgIHBhcmFtLT5zdGFfYWRkcls0XSA9PSAweGZmICYmIHBhcmFtLT5zdGFfYWRkcls1XSA9PSAweGZmKSB7CisJCWlmIChwYXJhbS0+dS5jcnlwdC5pZHggPj0gV0VQX0tFWVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY3J5cHQgPSAmaWVlZS0+Y3J5cHRbcGFyYW0tPnUuY3J5cHQuaWR4XTsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIm5vbmUiKSA9PSAwKSB7CisJCWlmIChjcnlwdCkgeworCQkJc2VjLmVuYWJsZWQgPSAwOworCQkJLy8gRklYTUUgRklYTUUKKwkJCS8vc2VjLmVuY3J5cHQgPSAwOworCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzA7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0VOQUJMRUQgfCBTRUNfTEVWRUw7CisJCQlpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoaWVlZSwgY3J5cHQpOworCQl9CisJCWdvdG8gZG9uZTsKKwl9CisJc2VjLmVuYWJsZWQgPSAxOworLy8gRklYTUUgRklYTUUKKy8vCXNlYy5lbmNyeXB0ID0gMTsKKwlzZWMuZmxhZ3MgfD0gU0VDX0VOQUJMRUQ7CisKKwkvKiBJUFcgSFcgY2Fubm90IGJ1aWxkIFRLSVAgTUlDLCBob3N0IGRlY3J5cHRpb24gc3RpbGwgbmVlZGVkLiAqLworCWlmICghKGllZWUtPmhvc3RfZW5jcnlwdCB8fCBpZWVlLT5ob3N0X2RlY3J5cHQpICYmCisJICAgIHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJUS0lQIikpCisJCWdvdG8gc2tpcF9ob3N0X2NyeXB0OworCisJb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKHBhcmFtLT51LmNyeXB0LmFsZyk7CisJaWYgKG9wcyA9PSBOVUxMICYmIHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJXRVAiKSA9PSAwKSB7CisJCXJlcXVlc3RfbW9kdWxlKCJpZWVlODAyMTFfY3J5cHRfd2VwIik7CisJCW9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhwYXJhbS0+dS5jcnlwdC5hbGcpOworCQkvL3NldCBXRVA0MCBmaXJzdCwgaXQgd2lsbCBiZSBtb2RpZmllZCBhY2NvcmRpbmcgdG8gV0VQMTA0IG9yIFdFUDQwIGF0IG90aGVyIHBsYWNlCisJfSBlbHNlIGlmIChvcHMgPT0gTlVMTCAmJiBzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAiVEtJUCIpID09IDApIHsKKwkJcmVxdWVzdF9tb2R1bGUoImllZWU4MDIxMV9jcnlwdF90a2lwIik7CisJCW9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhwYXJhbS0+dS5jcnlwdC5hbGcpOworCX0gZWxzZSBpZiAob3BzID09IE5VTEwgJiYgc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIkNDTVAiKSA9PSAwKSB7CisJCXJlcXVlc3RfbW9kdWxlKCJpZWVlODAyMTFfY3J5cHRfY2NtcCIpOworCQlvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMocGFyYW0tPnUuY3J5cHQuYWxnKTsKKwl9CisJaWYgKG9wcyA9PSBOVUxMKSB7CisJCXByaW50aygidW5rbm93biBjcnlwdG8gYWxnICclcydcbiIsIHBhcmFtLT51LmNyeXB0LmFsZyk7CisJCXBhcmFtLT51LmNyeXB0LmVyciA9IElFRUVfQ1JZUFRfRVJSX1VOS05PV05fQUxHOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKCpjcnlwdCA9PSBOVUxMIHx8ICgqY3J5cHQpLT5vcHMgIT0gb3BzKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqbmV3X2NyeXB0OworCisJCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChpZWVlLCBjcnlwdCk7CisKKwkJbmV3X2NyeXB0ID0gKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqKQorCQkJa21hbGxvYyhzaXplb2YoKm5ld19jcnlwdCksIEdGUF9LRVJORUwpOworCQlpZiAobmV3X2NyeXB0ID09IE5VTEwpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJbWVtc2V0KG5ld19jcnlwdCwgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSkpOworCQluZXdfY3J5cHQtPm9wcyA9IG9wczsKKwkJaWYgKG5ld19jcnlwdC0+b3BzICYmIHRyeV9tb2R1bGVfZ2V0KG5ld19jcnlwdC0+b3BzLT5vd25lcikpCisJCQluZXdfY3J5cHQtPnByaXYgPQorCQkJCW5ld19jcnlwdC0+b3BzLT5pbml0KHBhcmFtLT51LmNyeXB0LmlkeCk7CisKKwkJaWYgKG5ld19jcnlwdC0+cHJpdiA9PSBOVUxMKSB7CisJCQlrZnJlZShuZXdfY3J5cHQpOworCQkJcGFyYW0tPnUuY3J5cHQuZXJyID0gSUVFRV9DUllQVF9FUlJfQ1JZUFRfSU5JVF9GQUlMRUQ7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBkb25lOworCQl9CisKKwkJKmNyeXB0ID0gbmV3X2NyeXB0OworCX0KKworCWlmIChwYXJhbS0+dS5jcnlwdC5rZXlfbGVuID4gMCAmJiAoKmNyeXB0KS0+b3BzLT5zZXRfa2V5ICYmCisJICAgICgqY3J5cHQpLT5vcHMtPnNldF9rZXkocGFyYW0tPnUuY3J5cHQua2V5LAorCQkJCSAgIHBhcmFtLT51LmNyeXB0LmtleV9sZW4sIHBhcmFtLT51LmNyeXB0LnNlcSwKKwkJCQkgICAoKmNyeXB0KS0+cHJpdikgPCAwKSB7CisJCXByaW50aygia2V5IHNldHRpbmcgZmFpbGVkXG4iKTsKKwkJcGFyYW0tPnUuY3J5cHQuZXJyID0gSUVFRV9DUllQVF9FUlJfS0VZX1NFVF9GQUlMRUQ7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKyBza2lwX2hvc3RfY3J5cHQ6CisJaWYgKHBhcmFtLT51LmNyeXB0LnNldF90eCkgeworCQlpZWVlLT50eF9rZXlpZHggPSBwYXJhbS0+dS5jcnlwdC5pZHg7CisJCXNlYy5hY3RpdmVfa2V5ID0gcGFyYW0tPnUuY3J5cHQuaWR4OworCQlzZWMuZmxhZ3MgfD0gU0VDX0FDVElWRV9LRVk7CisJfSBlbHNlCisJCXNlYy5mbGFncyAmPSB+U0VDX0FDVElWRV9LRVk7CisKKwlpZiAocGFyYW0tPnUuY3J5cHQuYWxnICE9IE5VTEwpIHsKKwkJbWVtY3B5KHNlYy5rZXlzW3BhcmFtLT51LmNyeXB0LmlkeF0sCisJCSAgICAgICBwYXJhbS0+dS5jcnlwdC5rZXksCisJCSAgICAgICBwYXJhbS0+dS5jcnlwdC5rZXlfbGVuKTsKKwkJc2VjLmtleV9zaXplc1twYXJhbS0+dS5jcnlwdC5pZHhdID0gcGFyYW0tPnUuY3J5cHQua2V5X2xlbjsKKwkJc2VjLmZsYWdzIHw9ICgxIDw8IHBhcmFtLT51LmNyeXB0LmlkeCk7CisKKwkJaWYgKHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJXRVAiKSA9PSAwKSB7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOworCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzE7CisJCX0gZWxzZSBpZiAoc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIlRLSVAiKSA9PSAwKSB7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOworCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzI7CisJCX0gZWxzZSBpZiAoc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIkNDTVAiKSA9PSAwKSB7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOworCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzM7CisJCX0KKwl9CisgZG9uZToKKwlpZiAoaWVlZS0+c2V0X3NlY3VyaXR5KQorCQlpZWVlLT5zZXRfc2VjdXJpdHkoaWVlZS0+ZGV2LCAmc2VjKTsKKworCS8qIERvIG5vdCByZXNldCBwb3J0IGlmIGNhcmQgaXMgaW4gTWFuYWdlZCBtb2RlIHNpbmNlIHJlc2V0dGluZyB3aWxsCisJICogZ2VuZXJhdGUgbmV3IElFRUUgODAyLjExIGF1dGhlbnRpY2F0aW9uIHdoaWNoIG1heSBlbmQgdXAgaW4gbG9vcGluZworCSAqIHdpdGggSUVFRSA4MDIuMVguICBJZiB5b3VyIGhhcmR3YXJlIHJlcXVpcmVzIGEgcmVzZXQgYWZ0ZXIgV0VQCisJICogY29uZmlndXJhdGlvbiAoZm9yIGV4YW1wbGUuLi4gUHJpc20yKSwgaW1wbGVtZW50IHRoZSByZXNldF9wb3J0IGluCisJICogdGhlIGNhbGxiYWNrcyBzdHJ1Y3R1cmVzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgODAyLjExIHN0YWNrLiAqLworCWlmIChpZWVlLT5yZXNldF9vbl9rZXljaGFuZ2UgJiYKKwkgICAgaWVlZS0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBICYmCisJICAgIGllZWUtPnJlc2V0X3BvcnQgJiYKKwkgICAgaWVlZS0+cmVzZXRfcG9ydChpZWVlLT5kZXYpKSB7CisJCXByaW50aygicmVzZXRfcG9ydCBmYWlsZWRcbiIpOworCQlwYXJhbS0+dS5jcnlwdC5lcnIgPSBJRUVFX0NSWVBUX0VSUl9DQVJEX0NPTkZfRkFJTEVEOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9kaXNhc3NvY2lhdGVfc2tiKAorCQkJCQkJCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uLAorCQkJCQkJCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCQkJCXU4CWFzUnNuKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV9kaXNhc3NvYyAqZGlzYXNzOworCisJc2tiID0gZGV2X2FsbG9jX3NrYihzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9kaXNhc3NvYykpOworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCWRpc2FzcyA9IChzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jICopIHNrYl9wdXQoc2tiLHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jKSk7CisJZGlzYXNzLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0RJU0FTU09DKTsKKwlkaXNhc3MtPmhlYWRlci5kdXJhdGlvbl9pZCA9IDA7CisKKwltZW1jcHkoZGlzYXNzLT5oZWFkZXIuYWRkcjEsIGJlYWNvbi0+YnNzaWQsIEVUSF9BTEVOKTsKKwltZW1jcHkoZGlzYXNzLT5oZWFkZXIuYWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoZGlzYXNzLT5oZWFkZXIuYWRkcjMsIGJlYWNvbi0+YnNzaWQsIEVUSF9BTEVOKTsKKworCWRpc2Fzcy0+cmVhc29uID0gYXNSc247CisJcmV0dXJuIHNrYjsKK30KKworCit2b2lkCitTZW5kRGlzYXNzb2NpYXRpb24oCisJCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQl1OCogCQkJCQlhc1N0YSwKKwkJdTgJCQkJCQlhc1JzbgorKQoreworCQlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXNrYiA9IGllZWU4MDIxMV9kaXNhc3NvY2lhdGVfc2tiKGJlYWNvbixpZWVlLGFzUnNuKTsKKwkJaWYgKHNrYil7CisJCQkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKKwkJCQkvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcworCQl9Cit9CisKK2ludCBpZWVlODAyMTFfd3BhX3N1cHBsaWNhbnRfaW9jdGwoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19wb2ludCAqcCkKK3sKKwlzdHJ1Y3QgaWVlZV9wYXJhbSAqcGFyYW07CisJaW50IHJldD0wOworCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKwkvL0lFRUVfREVCVUdfSU5GTygid3BhX3N1cHBsaWNhbnQ6IGxlbj0lZFxuIiwgcC0+bGVuZ3RoKTsKKworCWlmIChwLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGllZWVfcGFyYW0pIHx8ICFwLT5wb2ludGVyKXsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJcGFyYW0gPSAoc3RydWN0IGllZWVfcGFyYW0gKilrbWFsbG9jKHAtPmxlbmd0aCwgR0ZQX0tFUk5FTCk7CisJaWYgKHBhcmFtID09IE5VTEwpeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKHBhcmFtLCBwLT5wb2ludGVyLCBwLT5sZW5ndGgpKSB7CisJCWtmcmVlKHBhcmFtKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCisJc3dpdGNoIChwYXJhbS0+Y21kKSB7CisKKwljYXNlIElFRUVfQ01EX1NFVF9XUEFfUEFSQU06CisJCXJldCA9IGllZWU4MDIxMV93cGFfc2V0X3BhcmFtKGllZWUsIHBhcmFtLT51LndwYV9wYXJhbS5uYW1lLAorCQkJCQlwYXJhbS0+dS53cGFfcGFyYW0udmFsdWUpOworCQlicmVhazsKKworCWNhc2UgSUVFRV9DTURfU0VUX1dQQV9JRToKKwkJcmV0ID0gaWVlZTgwMjExX3dwYV9zZXRfd3BhX2llKGllZWUsIHBhcmFtLCBwLT5sZW5ndGgpOworCQlicmVhazsKKworCWNhc2UgSUVFRV9DTURfU0VUX0VOQ1JZUFRJT046CisJCXJldCA9IGllZWU4MDIxMV93cGFfc2V0X2VuY3J5cHRpb24oaWVlZSwgcGFyYW0sIHAtPmxlbmd0aCk7CisJCWJyZWFrOworCisJY2FzZSBJRUVFX0NNRF9NTE1FOgorCQlyZXQgPSBpZWVlODAyMTFfd3BhX21sbWUoaWVlZSwgcGFyYW0tPnUubWxtZS5jb21tYW5kLAorCQkJCSAgIHBhcmFtLT51Lm1sbWUucmVhc29uX2NvZGUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50aygiVW5rbm93biBXUEEgc3VwcGxpY2FudCByZXF1ZXN0OiAlZFxuIixwYXJhbS0+Y21kKTsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCX0KKworCWlmIChyZXQgPT0gMCAmJiBjb3B5X3RvX3VzZXIocC0+cG9pbnRlciwgcGFyYW0sIHAtPmxlbmd0aCkpCisJCXJldCA9IC1FRkFVTFQ7CisKKwlrZnJlZShwYXJhbSk7CitvdXQ6CisJdXAoJmllZWUtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG5vdGlmeV93eF9hc3NvY19ldmVudChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJd3JxdS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkKKwkJbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKKwllbHNlCisJCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgRVRIX0FMRU4pOworCXdpcmVsZXNzX3NlbmRfZXZlbnQoaWVlZS0+ZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKK30KKworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfZ2V0X2JlYWNvbik7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93YWtlX3F1ZXVlKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0b3BfcXVldWUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfcmVzZXRfcXVldWUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2wpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfaXNfc2hvcnRzbG90KTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2lzXzU0Zyk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93cGFfc3VwcGxpY2FudF9pb2N0bCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9wc190eF9hY2spOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc29mdG1hY194bWl0KTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zKTsKK0VYUE9SVF9TWU1CT0wobm90aWZ5X3d4X2Fzc29jX2V2ZW50KTsKK0VYUE9SVF9TWU1CT0woU2VuZERpc2Fzc29jaWF0aW9uKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zdGFydF9zZW5kX2JlYWNvbnMpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc3RvcF9zY2FuKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxdWVzdHMpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc29mdG1hY19zY2FuX3N5bmNybyk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybyk7CisvL0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hY193eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hY193eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMzVjMjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjX3d4LmMKQEAgLTAsMCArMSw2MTUgQEAKKy8qIElFRUUgODAyLjExIFNvZnRNQUMgbGF5ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNSBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisgKgorICogTW9zdGx5IGV4dHJhY3RlZCBmcm9tIHRoZSBydGw4MTgwLXNhMjQwMCBkcml2ZXIgZm9yIHRoZQorICogaW4ta2VybmVsIGdlbmVyaWMgaWVlZTgwMi4xMSBzdGFjay4KKyAqCisgKiBTb21lIHBpZWNlcyBvZiBjb2RlIG1pZ2h0IGJlIHN0b2xlbiBmcm9tIGlwdzIxMDAgZHJpdmVyCisgKiBjb3B5cmlnaHQgb2Ygd2hvIG93biBpdCdzIGNvcHlyaWdodCA7LSkKKyAqCisgKiBQUyB3eCBoYW5kbGVyIG1vc3RseSBzdG9sZW4gZnJvbSBob3N0YXAsIGNvcHlyaWdodCB3aG8KKyAqIG93biBpdCdzIGNvcHlyaWdodCA7LSkKKyAqCisgKiByZWxlYXNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworCisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCisjaWZkZWYgRU5BQkxFX0RPVDExRAorI2luY2x1ZGUgImRvdDExZC5oIgorI2VuZGlmCisvKiBGSVhNRTogYWRkIEEgZnJlcXMgKi8KKworY29uc3QgbG9uZyBpZWVlODAyMTFfd2xhbl9mcmVxdWVuY2llc1tdID0geworCTI0MTIsIDI0MTcsIDI0MjIsIDI0MjcsCisJMjQzMiwgMjQzNywgMjQ0MiwgMjQ0NywKKwkyNDUyLCAyNDU3LCAyNDYyLCAyNDY3LAorCTI0NzIsIDI0ODQKK307CisKKworaW50IGllZWU4MDIxMV93eF9zZXRfZnJlcShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpd19mcmVxICpmd3JxID0gJiB3cnF1LT5mcmVxOworCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKworCWlmKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSl7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBpZiBzZXR0aW5nIGJ5IGZyZXEgY29udmVydCB0byBjaGFubmVsICovCisJaWYgKGZ3cnEtPmUgPT0gMSkgeworCQlpZiAoKGZ3cnEtPm0gPj0gKGludCkgMi40MTJlOCAmJgorCQkgICAgIGZ3cnEtPm0gPD0gKGludCkgMi40ODdlOCkpIHsKKwkJCWludCBmID0gZndycS0+bSAvIDEwMDAwMDsKKwkJCWludCBjID0gMDsKKworCQkJd2hpbGUgKChjIDwgMTQpICYmIChmICE9IGllZWU4MDIxMV93bGFuX2ZyZXF1ZW5jaWVzW2NdKSkKKwkJCQljKys7CisKKwkJCS8qIGhhY2sgdG8gZmFsbCB0aHJvdWdoICovCisJCQlmd3JxLT5lID0gMDsKKwkJCWZ3cnEtPm0gPSBjICsgMTsKKwkJfQorCX0KKworCWlmIChmd3JxLT5lID4gMCB8fCBmd3JxLT5tID4gMTQgfHwgZndycS0+bSA8IDEgKXsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0OworCisJfWVsc2UgeyAvKiBTZXQgdGhlIGNoYW5uZWwgKi8KKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkJaWYgKCEoR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcClbZndycS0+bV0pIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorI2VuZGlmCisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0gZndycS0+bTsKKwkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisKKwkJaWYoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DIHx8IGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpCisJCQlpZihpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKXsKKworCQkJaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zKGllZWUpOworCQkJaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucyhpZWVlKTsKKwkJCX0KKwl9CisKKwlyZXQgPSAwOworb3V0OgorCXVwKCZpZWVlLT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKKworaW50IGllZWU4MDIxMV93eF9nZXRfZnJlcShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlzdHJ1Y3QgaXdfZnJlcSAqZndycSA9ICYgd3JxdS0+ZnJlcTsKKworCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9PSAwKQorCQlyZXR1cm4gLTE7CisJLy9OTSAwLjcuMCB3aWxsIG5vdCBhY2NlcHQgY2hhbm5lbCBhbnkgbW9yZS4KKwlmd3JxLT5tID0gaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwtMV0gKiAxMDAwMDA7CisJZndycS0+ZSA9IDE7CisvLwlmd3JxLT5tID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWw7CisvLwlmd3JxLT5lID0gMDsKKworCXJldHVybiAwOworfQorCitpbnQgaWVlZTgwMjExX3d4X2dldF93YXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJd3JxdS0+YXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpCisJCXJldHVybiAtMTsKKworCS8qIFdlIHdhbnQgYXZvaWQgdG8gZ2l2ZSB0byB0aGUgdXNlciBpbmNvbnNpc3RlbnQgaW5mb3MqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCAmJgorCQlpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HICYmCisJCWllZWUtPndhcF9zZXQgPT0gMCkKKworCQltZW1zZXQod3JxdS0+YXBfYWRkci5zYV9kYXRhLCAwLCBFVEhfQUxFTik7CisJZWxzZQorCQltZW1jcHkod3JxdS0+YXBfYWRkci5zYV9kYXRhLAorCQkgICAgICAgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgaWVlZTgwMjExX3d4X3NldF93YXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSB1bmlvbiBpd3JlcV9kYXRhICphd3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCisJaW50IHJldCA9IDA7CisJdTggemVyb1tdID0gezAsMCwwLDAsMCwwfTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc2hvcnQgaWZ1cCA9IGllZWUtPnByb3RvX3N0YXJ0ZWQ7Ly9kZXYtPmZsYWdzICYgSUZGX1VQOworCXN0cnVjdCBzb2NrYWRkciAqdGVtcCA9IChzdHJ1Y3Qgc29ja2FkZHIgKilhd3JxOworCisJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAxOworCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKwkvKiB1c2UgaWZjb25maWcgaHcgZXRoZXIgKi8KKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUil7CisJCXJldCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAodGVtcC0+c2FfZmFtaWx5ICE9IEFSUEhSRF9FVEhFUil7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChpZnVwKQorCQlpZWVlODAyMTFfc3RvcF9wcm90b2NvbChpZWVlKTsKKworCS8qIGp1c3QgdG8gYXZvaWQgdG8gZ2l2ZSBpbmNvbnNpc3RlbnQgaW5mb3MgaW4gdGhlCisJICogZ2V0IHd4IG1ldGhvZC4gbm90IHJlYWxseSBuZWVkZWQgb3RoZXJ3aXNlCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCW1lbWNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIHRlbXAtPnNhX2RhdGEsIEVUSF9BTEVOKTsKKwlpZWVlLT53YXBfc2V0ID0gbWVtY21wKHRlbXAtPnNhX2RhdGEsIHplcm8sRVRIX0FMRU4pIT0wOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWYgKGlmdXApCisJCWllZWU4MDIxMV9zdGFydF9wcm90b2NvbChpZWVlKTsKK291dDoKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCisgaW50IGllZWU4MDIxMV93eF9nZXRfZXNzaWQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsdW5pb24gaXdyZXFfZGF0YSAqd3JxdSxjaGFyICpiKQoreworCWludCBsZW4scmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQorCQlyZXR1cm4gLTE7CisKKwkvKiBXZSB3YW50IGF2b2lkIHRvIGdpdmUgdG8gdGhlIHVzZXIgaW5jb25zaXN0ZW50IGluZm9zKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkWzBdID09ICdcMCcgfHwKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID09IDApeworCQlyZXQgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRUQgJiYKKwkJaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRF9TQ0FOTklORyAmJgorCQlpZWVlLT5zc2lkX3NldCA9PSAwKXsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKwlsZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW47CisJd3JxdS0+ZXNzaWQubGVuZ3RoID0gbGVuOworCXN0cm5jcHkoYixpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCxsZW4pOworCXdycXUtPmVzc2lkLmZsYWdzID0gMTsKKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7CisKK30KKworaW50IGllZWU4MDIxMV93eF9zZXRfcmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisKKwl1MzIgdGFyZ2V0X3JhdGUgPSB3cnF1LT5iaXRyYXRlLnZhbHVlOworCisJaWVlZS0+cmF0ZSA9IHRhcmdldF9yYXRlLzEwMDAwMDsKKwkvL0ZJWE1FOiB3ZSBtaWdodCB3YW50IHRvIGxpbWl0IHJhdGUgYWxzbyBpbiBtYW5hZ2VtZW50IHByb3RvY29scy4KKwlyZXR1cm4gMDsKK30KKworCisKK2ludCBpZWVlODAyMTFfd3hfZ2V0X3JhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXUzMiB0bXBfcmF0ZTsKKwl0bXBfcmF0ZSA9IFR4Q291bnRUb0RhdGFSYXRlKGllZWUsIGllZWUtPnNvZnRtYWNfc3RhdHMuQ3VycmVudFNob3dUeGF0ZSk7CisKKwl3cnF1LT5iaXRyYXRlLnZhbHVlID0gdG1wX3JhdGUgKiA1MDAwMDA7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgaWVlZTgwMjExX3d4X3NldF9ydHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWlmICh3cnF1LT5ydHMuZGlzYWJsZWQgfHwgIXdycXUtPnJ0cy5maXhlZCkKKwkJaWVlZS0+cnRzID0gREVGQVVMVF9SVFNfVEhSRVNIT0xEOworCWVsc2UKKwl7CisJCWlmICh3cnF1LT5ydHMudmFsdWUgPCBNSU5fUlRTX1RIUkVTSE9MRCB8fAorCQkJCXdycXUtPnJ0cy52YWx1ZSA+IE1BWF9SVFNfVEhSRVNIT0xEKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWllZWUtPnJ0cyA9IHdycXUtPnJ0cy52YWx1ZTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBpZWVlODAyMTFfd3hfZ2V0X3J0cyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJd3JxdS0+cnRzLnZhbHVlID0gaWVlZS0+cnRzOworCXdycXUtPnJ0cy5maXhlZCA9IDA7CS8qIG5vIGF1dG8gc2VsZWN0ICovCisJd3JxdS0+cnRzLmRpc2FibGVkID0gKHdycXUtPnJ0cy52YWx1ZSA9PSBERUZBVUxUX1JUU19USFJFU0hPTEQpOworCXJldHVybiAwOworfQoraW50IGllZWU4MDIxMV93eF9zZXRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKworCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMTsKKworCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKwlpZiAod3JxdS0+bW9kZSA9PSBpZWVlLT5pd19tb2RlKQorCQlnb3RvIG91dDsKKworCWlmICh3cnF1LT5tb2RlID09IElXX01PREVfTU9OSVRPUil7CisKKwkJaWVlZS0+ZGV2LT50eXBlID0gQVJQSFJEX0lFRUU4MDIxMTsKKwl9ZWxzZXsKKwkJaWVlZS0+ZGV2LT50eXBlID0gQVJQSFJEX0VUSEVSOworCX0KKworCWlmICghaWVlZS0+cHJvdG9fc3RhcnRlZCl7CisJCWllZWUtPml3X21vZGUgPSB3cnF1LT5tb2RlOworCX1lbHNleworCQlpZWVlODAyMTFfc3RvcF9wcm90b2NvbChpZWVlKTsKKwkJaWVlZS0+aXdfbW9kZSA9IHdycXUtPm1vZGU7CisJCWllZWU4MDIxMV9zdGFydF9wcm90b2NvbChpZWVlKTsKKwl9CisKK291dDoKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBpZWVlODAyMTFfd3hfc3luY19zY2FuX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgd3hfc3luY19zY2FuX3dxKTsKKwlzaG9ydCBjaGFuOworCUhUX0VYVENITkxfT0ZGU0VUIGNoYW5fb2Zmc2V0PTA7CisJSFRfQ0hBTk5FTF9XSURUSCBiYW5kd2lkdGg9MDsKKwlpbnQgYjQwTSA9IDA7CisJc3RhdGljIGludCBjb3VudCA9IDA7CisJY2hhbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsOworCW5ldGlmX2NhcnJpZXJfb2ZmKGllZWUtPmRldik7CisKKwlpZiAoaWVlZS0+ZGF0YV9oYXJkX3N0b3ApCisJCWllZWUtPmRhdGFfaGFyZF9zdG9wKGllZWUtPmRldik7CisKKwlpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMoaWVlZSk7CisKKwlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9MSU5LRURfU0NBTk5JTkc7CisJaWVlZS0+bGlua19jaGFuZ2UoaWVlZS0+ZGV2KTsKKwlpZWVlLT5Jbml0aWFsR2FpbkhhbmRsZXIoaWVlZS0+ZGV2LElHX0JhY2t1cCk7CisJaWYgKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ICYmIGllZWUtPnBIVEluZm8tPmJFbmFibGVIVCAmJiBpZWVlLT5wSFRJbmZvLT5iQ3VyQlc0ME1IeikgeworCQliNDBNID0gMTsKKwkJY2hhbl9vZmZzZXQgPSBpZWVlLT5wSFRJbmZvLT5DdXJTVEFFeHRDaG5sT2Zmc2V0OworCQliYW5kd2lkdGggPSAoSFRfQ0hBTk5FTF9XSURUSClpZWVlLT5wSFRJbmZvLT5iQ3VyQlc0ME1IejsKKwkJcHJpbnRrKCJTY2FuIGluIDQwTSwgZm9yY2UgdG8gMjBNIGZpcnN0OiVkLCAlZFxuIiwgY2hhbl9vZmZzZXQsIGJhbmR3aWR0aCk7CisJCWllZWUtPlNldEJXTW9kZUhhbmRsZXIoaWVlZS0+ZGV2LCBIVF9DSEFOTkVMX1dJRFRIXzIwLCBIVF9FWFRDSE5MX09GRlNFVF9OT19FWFQpOworCQl9CisJaWVlZTgwMjExX3N0YXJ0X3NjYW5fc3luY3JvKGllZWUpOworCWlmIChiNDBNKSB7CisJCXByaW50aygiU2NhbiBpbiAyME0sIGJhY2sgdG8gNDBNXG4iKTsKKwkJaWYgKGNoYW5fb2Zmc2V0ID09IEhUX0VYVENITkxfT0ZGU0VUX1VQUEVSKQorCQkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBjaGFuICsgMik7CisJCWVsc2UgaWYgKGNoYW5fb2Zmc2V0ID09IEhUX0VYVENITkxfT0ZGU0VUX0xPV0VSKQorCQkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBjaGFuIC0gMik7CisJCWVsc2UKKwkJCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgY2hhbik7CisJCWllZWUtPlNldEJXTW9kZUhhbmRsZXIoaWVlZS0+ZGV2LCBiYW5kd2lkdGgsIGNoYW5fb2Zmc2V0KTsKKwl9IGVsc2UgeworCQlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGNoYW4pOworCX0KKworCWllZWUtPkluaXRpYWxHYWluSGFuZGxlcihpZWVlLT5kZXYsSUdfUmVzdG9yZSk7CisJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTElOS0VEOworCWllZWUtPmxpbmtfY2hhbmdlKGllZWUtPmRldik7CisJLy8gVG8gcHJldmVudCB0aGUgaW1tZWRpYXRlbHkgY2FsbGluZyB3YXRjaF9kb2cgYWZ0ZXIgc2Nhbi4KKwlpZihpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2QmNuSW5QZXJpb2Q9PTB8fGllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZEYXRhSW5QZXJpb2Q9PTAgKQorCXsKKwkJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkJjbkluUGVyaW9kID0gMTsKKwkJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkRhdGFJblBlcmlvZD0gMTsKKwl9CisJaWYgKGllZWUtPmRhdGFfaGFyZF9yZXN1bWUpCisJCWllZWUtPmRhdGFfaGFyZF9yZXN1bWUoaWVlZS0+ZGV2KTsKKworCWlmKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQyB8fCBpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKQorCQlpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zKGllZWUpOworCisJbmV0aWZfY2Fycmllcl9vbihpZWVlLT5kZXYpOworCWNvdW50ID0gMDsKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKworfQorCitpbnQgaWVlZTgwMjExX3d4X3NldF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCWludCByZXQgPSAwOworCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUiB8fCAhKGllZWUtPnByb3RvX3N0YXJ0ZWQpKXsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCWlmICggaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCl7CisJCXF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT53eF9zeW5jX3NjYW5fd3EpOworCQkvKiBpbnRlbnRpb25hbGx5IGZvcmdldCB0byB1cCBzZW0gKi8KKwkJcmV0dXJuIDA7CisJfQorCitvdXQ6CisJdXAoJmllZWUtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGllZWU4MDIxMV93eF9zZXRfZXNzaWQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisKKwlpbnQgcmV0PTAsbGVuOworCXNob3J0IHByb3RvX3N0YXJ0ZWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMTsKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCisJcHJvdG9fc3RhcnRlZCA9IGllZWUtPnByb3RvX3N0YXJ0ZWQ7CisKKwlpZiAod3JxdS0+ZXNzaWQubGVuZ3RoID4gSVdfRVNTSURfTUFYX1NJWkUpeworCQlyZXQ9IC1FMkJJRzsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKXsKKwkJcmV0PSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYocHJvdG9fc3RhcnRlZCkKKwkJaWVlZTgwMjExX3N0b3BfcHJvdG9jb2woaWVlZSk7CisKKworCS8qIHRoaXMgaXMganVzdCB0byBiZSBzdXJlIHRoYXQgdGhlIEdFVCB3eCBjYWxsYmFjaworCSAqIGhhcyBjb25zaXN0ZW4gaW5mb3MuIG5vdCBuZWVkZWQgb3RoZXJ3aXNlCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWlmICh3cnF1LT5lc3NpZC5mbGFncyAmJiB3cnF1LT5lc3NpZC5sZW5ndGgpIHsKKwkJLy9maXJzdCBmbHVzaCBjdXJyZW50IG5ldHdvcmsuc3NpZAorCQlsZW4gPSAoKHdycXUtPmVzc2lkLmxlbmd0aC0xKSA8IElXX0VTU0lEX01BWF9TSVpFKSA/ICh3cnF1LT5lc3NpZC5sZW5ndGgtMSkgOiBJV19FU1NJRF9NQVhfU0laRTsKKwkJc3RybmNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgZXh0cmEsIGxlbisxKTsKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID0gbGVuKzE7CisJCWllZWUtPnNzaWRfc2V0ID0gMTsKKwl9CisJZWxzZXsKKwkJaWVlZS0+c3NpZF9zZXQgPSAwOworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZFswXSA9ICdcMCc7CisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWlmIChwcm90b19zdGFydGVkKQorCQlpZWVlODAyMTFfc3RhcnRfcHJvdG9jb2woaWVlZSk7CitvdXQ6CisJdXAoJmllZWUtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworIGludCBpZWVlODAyMTFfd3hfZ2V0X21vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisKKwl3cnF1LT5tb2RlID0gaWVlZS0+aXdfbW9kZTsKKwlyZXR1cm4gMDsKK30KKworIGludCBpZWVlODAyMTFfd3hfc2V0X3Jhd3R4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisKKwlpbnQgKnBhcm1zID0gKGludCAqKWV4dHJhOworCWludCBlbmFibGUgPSAocGFybXNbMF0gPiAwKTsKKwlzaG9ydCBwcmV2ID0gaWVlZS0+cmF3X3R4OworCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKworCWlmKGVuYWJsZSkKKwkJaWVlZS0+cmF3X3R4ID0gMTsKKwllbHNlCisJCWllZWUtPnJhd190eCA9IDA7CisKKwlwcmludGsoS0VSTl9JTkZPInJhdyBUWCBpcyAlc1xuIiwKKwkgICAgICBpZWVlLT5yYXdfdHggPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKworCWlmKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQorCXsKKwkJaWYocHJldiA9PSAwICYmIGllZWUtPnJhd190eCl7CisJCQlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKKwkJCQlpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKGllZWUtPmRldik7CisKKwkJCW5ldGlmX2NhcnJpZXJfb24oaWVlZS0+ZGV2KTsKKwkJfQorCisJCWlmKHByZXYgJiYgaWVlZS0+cmF3X3R4ID09IDEpCisJCQluZXRpZl9jYXJyaWVyX29mZihpZWVlLT5kZXYpOworCX0KKworCXVwKCZpZWVlLT53eF9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpZWVlODAyMTFfd3hfZ2V0X25hbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cmNweSh3cnF1LT5uYW1lLCAiODAyLjExIik7CisJaWYoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTil7CisJCXN0cmNhdCh3cnF1LT5uYW1lLCAiYiIpOworCQlpZihpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikKKwkJCXN0cmNhdCh3cnF1LT5uYW1lLCAiL2ciKTsKKwl9ZWxzZSBpZihpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikKKwkJc3RyY2F0KHdycXUtPm5hbWUsICJnIik7CisJaWYgKGllZWUtPm1vZGUgJiAoSUVFRV9OXzI0RyB8IElFRUVfTl81RykpCisJCXN0cmNhdCh3cnF1LT5uYW1lLCAiL24iKTsKKworCWlmKChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKSB8fAorCQkoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRF9TQ0FOTklORykpCisJCXN0cmNhdCh3cnF1LT5uYW1lLCIgbGlua2VkIik7CisJZWxzZSBpZihpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTk9MSU5LKQorCQlzdHJjYXQod3JxdS0+bmFtZSwiIGxpbmsuLiIpOworCisKKwlyZXR1cm4gMDsKK30KKworCisvKiB0aGlzIGlzIG1vc3RseSBzdG9sZW4gZnJvbSBob3N0YXAgKi8KK2ludCBpZWVlODAyMTFfd3hfc2V0X3Bvd2VyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCisJaWYgKHdycXUtPnBvd2VyLmRpc2FibGVkKXsKKwkJaWVlZS0+cHMgPSBJRUVFODAyMTFfUFNfRElTQUJMRUQ7CisJCWdvdG8gZXhpdDsKKwl9CisJaWYgKHdycXUtPnBvd2VyLmZsYWdzICYgSVdfUE9XRVJfVElNRU9VVCkgeworCQkvL2llZWUtPnBzX3BlcmlvZCA9IHdycXUtPnBvd2VyLnZhbHVlIC8gMTAwMDsKKwkJaWVlZS0+cHNfdGltZW91dCA9IHdycXUtPnBvd2VyLnZhbHVlIC8gMTAwMDsKKwl9CisKKwlpZiAod3JxdS0+cG93ZXIuZmxhZ3MgJiBJV19QT1dFUl9QRVJJT0QpIHsKKworCQkvL2llZWUtPnBzX3RpbWVvdXQgPSB3cnF1LT5wb3dlci52YWx1ZSAvIDEwMDA7CisJCWllZWUtPnBzX3BlcmlvZCA9IHdycXUtPnBvd2VyLnZhbHVlIC8gMTAwMDsKKwkJLy93cnEtPnZhbHVlIC8gMTAyNDsKKworCX0KKwlzd2l0Y2ggKHdycXUtPnBvd2VyLmZsYWdzICYgSVdfUE9XRVJfTU9ERSkgeworCWNhc2UgSVdfUE9XRVJfVU5JQ0FTVF9SOgorCQlpZWVlLT5wcyA9IElFRUU4MDIxMV9QU19VTklDQVNUOworCQlicmVhazsKKwljYXNlIElXX1BPV0VSX01VTFRJQ0FTVF9SOgorCQlpZWVlLT5wcyA9IElFRUU4MDIxMV9QU19NQkNBU1Q7CisJCWJyZWFrOworCWNhc2UgSVdfUE9XRVJfQUxMX1I6CisJCWllZWUtPnBzID0gSUVFRTgwMjExX1BTX1VOSUNBU1QgfCBJRUVFODAyMTFfUFNfTUJDQVNUOworCQlicmVhazsKKworCWNhc2UgSVdfUE9XRVJfT046CisJLy8JaWVlZS0+cHMgPSBJRUVFODAyMTFfUFNfRElTQUJMRUQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCisJfQorZXhpdDoKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworCit9CisKKy8qIHRoaXMgaXMgc3RvbGVuIGZyb20gaG9zdGFwICovCitpbnQgaWVlZTgwMjExX3d4X2dldF9wb3dlcihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldCA9MDsKKworCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKwlpZihpZWVlLT5wcyA9PSBJRUVFODAyMTFfUFNfRElTQUJMRUQpeworCQl3cnF1LT5wb3dlci5kaXNhYmxlZCA9IDE7CisJCWdvdG8gZXhpdDsKKwl9CisKKwl3cnF1LT5wb3dlci5kaXNhYmxlZCA9IDA7CisKKwlpZiAoKHdycXUtPnBvd2VyLmZsYWdzICYgSVdfUE9XRVJfVFlQRSkgPT0gSVdfUE9XRVJfVElNRU9VVCkgeworCQl3cnF1LT5wb3dlci5mbGFncyA9IElXX1BPV0VSX1RJTUVPVVQ7CisJCXdycXUtPnBvd2VyLnZhbHVlID0gaWVlZS0+cHNfdGltZW91dCAqIDEwMDA7CisJfSBlbHNlIHsKKy8vCQlyZXQgPSAtRU9QTk9UU1VQUDsKKy8vCQlnb3RvIGV4aXQ7CisJCXdycXUtPnBvd2VyLmZsYWdzID0gSVdfUE9XRVJfUEVSSU9EOworCQl3cnF1LT5wb3dlci52YWx1ZSA9IGllZWUtPnBzX3BlcmlvZCAqIDEwMDA7CisvL2llZWUtPmN1cnJlbnRfbmV0d29yay5kdGltX3BlcmlvZCAqIGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgKiAxMDI0OworCX0KKworICAgICAgIGlmICgoaWVlZS0+cHMgJiAoSUVFRTgwMjExX1BTX01CQ0FTVCB8IElFRUU4MDIxMV9QU19VTklDQVNUKSkgPT0gKElFRUU4MDIxMV9QU19NQkNBU1QgfCBJRUVFODAyMTFfUFNfVU5JQ0FTVCkpCisJCXdycXUtPnBvd2VyLmZsYWdzIHw9IElXX1BPV0VSX0FMTF9SOworCWVsc2UgaWYgKGllZWUtPnBzICYgSUVFRTgwMjExX1BTX01CQ0FTVCkKKwkJd3JxdS0+cG93ZXIuZmxhZ3MgfD0gSVdfUE9XRVJfTVVMVElDQVNUX1I7CisJZWxzZQorCQl3cnF1LT5wb3dlci5mbGFncyB8PSBJV19QT1dFUl9VTklDQVNUX1I7CisKK2V4aXQ6CisJdXAoJmllZWUtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKKworfQorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfZ2V0X2Vzc2lkKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9lc3NpZCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfcmF0ZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9nZXRfcmF0ZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfd2FwKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF93YXApOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X21vZGUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfZ2V0X21vZGUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X3NjYW4pOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfZ2V0X2ZyZXEpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X2ZyZXEpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X3Jhd3R4KTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF9uYW1lKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9wb3dlcik7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9nZXRfcG93ZXIpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd2xhbl9mcmVxdWVuY2llcyk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfcnRzKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF9ydHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI5YzM2YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKQEAgLTAsMCArMSw5MTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKworICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKworICBDb250YWN0IEluZm9ybWF0aW9uOgorICBKYW1lcyBQLiBLZXRyZW5vcyA8aXB3MjEwMC1hZG1pbkBsaW51eC5pbnRlbC5jb20+CisgIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgRmV3IG1vZGlmaWNhdGlvbnMgZm9yIFJlYWx0ZWsncyBXaS1GaSBkcml2ZXJzIGJ5CisgIEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKworICBBIHNwZWNpYWwgdGhhbmtzIGdvZXMgdG8gUmVhbHRlayBmb3IgdGhlaXIgc3VwcG9ydCAhCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisvLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKworI2luY2x1ZGUgImllZWU4MDIxMS5oIgorCisKKy8qCisKKworODAyLjExIERhdGEgRnJhbWUKKworCis4MDIuMTEgZnJhbWVfY29udG9ybCBmb3IgZGF0YSBmcmFtZXMgLSAyIGJ5dGVzCisgICAgICwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK2JpdHMgfCAwICB8ICAxICB8ICAyICB8ICAzICB8ICA0ICB8ICA1ICB8ICA2ICB8ICA3ICB8ICA4ICB8ICA5ICB8ICBhICB8ICBiICB8ICBjICB8ICBkICB8ICBlICAgfAorICAgICB8LS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLS18Cit2YWwgIHwgMCAgfCAgMCAgfCAgMCAgfCAgMSAgfCAgeCAgfCAgMCAgfCAgMCAgfCAgMCAgfCAgMSAgfCAgMCAgfCAgeCAgfCAgeCAgfCAgeCAgfCAgeCAgfCAgeCAgIHwKKyAgICAgfC0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS0tfAorZGVzYyB8IF4tdmVyLV4gIHwgIF50eXBlLV4gIHwgIF4tLS0tLXN1YnR5cGUtLS0tLV4gIHwgdG8gIHxmcm9tIHxtb3JlIHxyZXRyeXwgcHdyIHxtb3JlIHx3ZXAgICB8CisgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgfCB4PTAgZGF0YSx4PTEgZGF0YSthY2sgfCBEUyAgfCBEUyAgfGZyYWcgfCAgICAgfCBtZ20gfGRhdGEgfCAgICAgIHwKKyAgICAgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKzgwMi4xMSBEYXRhIEZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICwtLS0tLS0tLS0gJ2N0cmwnIGV4cGFuZHMgdG8gPi0tLS0tLS0tLS0tJworICAgICAgICAgIHwKKyAgICAgICwtLSctLS0sLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK0J5dGVzIHwgIDIgICB8ICAyICAgfCAgICA2ICAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgMiAgIHwgMC4uMjMxMiB8ICAgNCAgfAorICAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS18CitEZXNjLiB8IGN0cmwgfCBkdXJhIHwgIERBL1JBICB8ICAgVEEgICAgfCAgICBTQSAgIHwgU2VxdSB8ICBGcmFtZSAgfCAgZmNzIHwKKyAgICAgIHwgICAgICB8IHRpb24gfCAoQlNTSUQpIHwgICAgICAgICB8ICAgICAgICAgfCBlbmNlIHwgIGRhdGEgICB8ICAgICAgfAorICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAgICAgICAgIHwtLS0tLS0nCitUb3RhbDogMjggbm9uLWRhdGEgYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgLS0tLS4tLS0tJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgLi0gJ0ZyYW1lIGRhdGEnIGV4cGFuZHMgdG8gPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKKyAgICAgICB8CisgICAgICAgVgorICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK0J5dGVzIHwgIDEgICB8ICAxICAgfCAgICAxICAgIHwgICAgMyAgICAgfCAgMiAgIHwgIDAtMjMwNCB8CisgICAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfAorRGVzYy4gfCBTTkFQIHwgU05BUCB8IENvbnRyb2wgfEV0aCBUdW5uZWx8IFR5cGUgfCBJUCAgICAgIHwKKyAgICAgIHwgRFNBUCB8IFNTQVAgfCAgICAgICAgIHwgICAgICAgICAgfCAgICAgIHwgUGFja2V0ICB8CisgICAgICB8IDB4QUEgfCAweEFBIHwweDAzIChVSSl8MHgwMC0wMC1GOHwgICAgICB8ICAgICAgICAgfAorICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAgICAgICAgIHwKK1RvdGFsOiA4IG5vbi1kYXRhIGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgIGAtLS0tLi0tLS0nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAuLSAnSVAgUGFja2V0JyBleHBhbmRzLCBpZiBXRVAgZW5hYmxlZCwgdG8gPC0tJworICAgICAgIHwKKyAgICAgICBWCisgICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCitCeXRlcyB8ICA0ICB8ICAgMC0yMjk2ICB8ICA0ICB8CisgICAgICB8LS0tLS18LS0tLS0tLS0tLS18LS0tLS18CitEZXNjLiB8IElWICB8IEVuY3J5cHRlZCB8IElDViB8CisgICAgICB8ICAgICB8IElQIFBhY2tldCB8ICAgICB8CisgICAgICBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCitUb3RhbDogOCBub24tZGF0YSBieXRlcworCisKKzgwMi4zIEV0aGVybmV0IERhdGEgRnJhbWUKKworICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorQnl0ZXMgfCAgIDYgICB8ICAgNiAgIHwgIDIgICB8ICBWYXJpYWJsZSB8ICAgNCAgfAorICAgICAgfC0tLS0tLS18LS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tfAorRGVzYy4gfCBEZXN0LiB8IFNvdXJjZXwgVHlwZSB8IElQIFBhY2tldCB8ICBmY3MgfAorICAgICAgfCAgTUFDICB8ICBNQUMgIHwgICAgICB8ICAgICAgICAgICB8ICAgICAgfAorICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworVG90YWw6IDE4IG5vbi1kYXRhIGJ5dGVzCisKK0luIHRoZSBldmVudCB0aGF0IGZyYWdtZW50YXRpb24gaXMgcmVxdWlyZWQsIHRoZSBpbmNvbWluZyBwYXlsb2FkIGlzIHNwbGl0IGludG8KK04gcGFydHMgb2Ygc2l6ZSBpZWVlLT5mdHMuICBUaGUgZmlyc3QgZnJhZ21lbnQgY29udGFpbnMgdGhlIFNOQVAgaGVhZGVyIGFuZCB0aGUKK3JlbWFpbmluZyBwYWNrZXRzIGFyZSBqdXN0IGRhdGEuCisKK0lmIGVuY3J5cHRpb24gaXMgZW5hYmxlZCwgZWFjaCBmcmFnbWVudCBwYXlsb2FkIHNpemUgaXMgcmVkdWNlZCBieSBlbm91Z2ggc3BhY2UKK3RvIGFkZCB0aGUgcHJlZml4IGFuZCBwb3N0Zml4IChJViBhbmQgSUNWIHRvdGFsbGluZyA4IGJ5dGVzIGluIHRoZSBjYXNlIG9mIFdFUCkKK1NvIGlmIHlvdSBoYXZlIDE1MDAgYnl0ZXMgb2YgcGF5bG9hZCB3aXRoIGllZWUtPmZ0cyBzZXQgdG8gNTAwIHdpdGhvdXQKK2VuY3J5cHRpb24gaXQgd2lsbCB0YWtlIDMgZnJhbWVzLiAgV2l0aCBXRVAgaXQgd2lsbCB0YWtlIDQgZnJhbWVzIGFzIHRoZQorcGF5bG9hZCBvZiBlYWNoIGZyYW1lIGlzIHJlZHVjZWQgdG8gNDkyIGJ5dGVzLgorCisqIFNLQiB2aXN1YWxpemF0aW9uCisqCisqICAsLSBza2ItPmRhdGEKKyogfAorKiB8ICAgIEVUSEVSTkVUIEhFQURFUiAgICAgICAgLC08LS0gUEFZTE9BRAorKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgMTQgYnl0ZXMgZnJvbSBza2ItPmRhdGEKKyogfCAgMiBieXRlcyBmb3IgVHlwZSAtLT4gLFQuIHwgICAgIChzaXplb2YgZXRoaGRyKQorKiB8ICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAorKiB8LC1EZXN0Li0tLiAsLS1TcmMuLS0tLiB8IHwgfAorKiB8ICA2IGJ5dGVzfCB8IDYgYnl0ZXMgfCB8IHwgfAorKiB2ICAgICAgICAgfCB8ICAgICAgICAgfCB8IHwgfAorKiAwICAgICAgICAgfCB2ICAgICAgIDEgfCB2IHwgdiAgICAgICAgICAgMgorKiAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUKKyogICAgIF4gICAgIHwgXiAgICAgICAgIHwgXiB8CisqICAgICB8ICAgICB8IHwgICAgICAgICB8IHwgfAorKiAgICAgfCAgICAgfCB8ICAgICAgICAgfCBgVCcgPC0tLS0gMiBieXRlcyBmb3IgVHlwZQorKiAgICAgfCAgICAgfCB8ICAgICAgICAgfAorKiAgICAgfCAgICAgfCAnLS0tU05BUC0tJyA8LS0tLS0tLS0gNiBieXRlcyBmb3IgU05BUAorKiAgICAgfCAgICAgfAorKiAgICAgYC1JVi0tJyA8LS0tLS0tLS0tLS0tLS0tLS0tLS0gNCBieXRlcyBmb3IgSVYgKFdFUCkKKyoKKyogICAgICBTTkFQIEhFQURFUgorKgorKi8KKworc3RhdGljIHU4IFA4MDJfMUhfT1VJW1A4MDIxMV9PVUlfTEVOXSA9IHsgMHgwMCwgMHgwMCwgMHhmOCB9Oworc3RhdGljIHU4IFJGQzEwNDJfT1VJW1A4MDIxMV9PVUlfTEVOXSA9IHsgMHgwMCwgMHgwMCwgMHgwMCB9OworCitzdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfcHV0X3NuYXAodTggKmRhdGEsIHUxNiBoX3Byb3RvKQoreworCXN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIgKnNuYXA7CisJdTggKm91aTsKKworCXNuYXAgPSAoc3RydWN0IGllZWU4MDIxMV9zbmFwX2hkciAqKWRhdGE7CisJc25hcC0+ZHNhcCA9IDB4YWE7CisJc25hcC0+c3NhcCA9IDB4YWE7CisJc25hcC0+Y3RybCA9IDB4MDM7CisKKwlpZiAoaF9wcm90byA9PSAweDgxMzcgfHwgaF9wcm90byA9PSAweDgwZjMpCisJCW91aSA9IFA4MDJfMUhfT1VJOworCWVsc2UKKwkJb3VpID0gUkZDMTA0Ml9PVUk7CisJc25hcC0+b3VpWzBdID0gb3VpWzBdOworCXNuYXAtPm91aVsxXSA9IG91aVsxXTsKKwlzbmFwLT5vdWlbMl0gPSBvdWlbMl07CisKKwkqKHUxNiAqKShkYXRhICsgU05BUF9TSVpFKSA9IGh0b25zKGhfcHJvdG8pOworCisJcmV0dXJuIFNOQVBfU0laRSArIHNpemVvZih1MTYpOworfQorCitpbnQgaWVlZTgwMjExX2VuY3J5cHRfZnJhZ21lbnQoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJc3RydWN0IHNrX2J1ZmYgKmZyYWcsCisJaW50IGhkcl9sZW4pCit7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKiBjcnlwdCA9IGllZWUtPmNyeXB0W2llZWUtPnR4X2tleWlkeF07CisJaW50IHJlczsKKworCWlmICghKGNyeXB0ICYmIGNyeXB0LT5vcHMpKQorCXsKKwkJcHJpbnRrKCI9PT09PT09PT0+JXMoKSwgY3J5cHQgaXMgbnVsbFxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC0xOworCX0KKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0NSWVBUX1RLSVAKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyOworCisJaWYgKGllZWUtPnRraXBfY291bnRlcm1lYXN1cmVzICYmCisJICAgIGNyeXB0ICYmIGNyeXB0LT5vcHMgJiYgc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsICJUS0lQIikgPT0gMCkgeworCQloZWFkZXIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgZnJhZy0+ZGF0YTsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUS0lQIGNvdW50ZXJtZWFzdXJlczogZHJvcHBlZCAiCisJCQkgICAgICAgIlRYIHBhY2tldCB0byAiIE1BQ19GTVQgIlxuIiwKKwkJCSAgICAgICBpZWVlLT5kZXYtPm5hbWUsIE1BQ19BUkcoaGVhZGVyLT5hZGRyMSkpOworCQl9CisJCXJldHVybiAtMTsKKwl9CisjZW5kaWYKKwkvKiBUbyBlbmNyeXB0LCBmcmFtZSBmb3JtYXQgaXM6CisJICogSVYgKDQgYnl0ZXMpLCBjbGVhciBwYXlsb2FkIChpbmNsdWRpbmcgU05BUCksIElDViAoNCBieXRlcykgKi8KKworCS8vIFBSOiBGSVhNRTogQ29waWVkIGZyb20gaG9zdGFwLiBDaGVjayBmcmFnbWVudGF0aW9uL01TRFUvTVBEVSBlbmNyeXB0aW9uLgorCS8qIEhvc3QtYmFzZWQgSUVFRSA4MDIuMTEgZnJhZ21lbnRhdGlvbiBmb3IgVFggaXMgbm90IHlldCBzdXBwb3J0ZWQsIHNvCisJICogY2FsbCBib3RoIE1TRFUgYW5kIE1QRFUgZW5jcnlwdGlvbiBmdW5jdGlvbnMgZnJvbSBoZXJlLiAqLworCWF0b21pY19pbmMoJmNyeXB0LT5yZWZjbnQpOworCXJlcyA9IDA7CisJaWYgKGNyeXB0LT5vcHMtPmVuY3J5cHRfbXNkdSkKKwkJcmVzID0gY3J5cHQtPm9wcy0+ZW5jcnlwdF9tc2R1KGZyYWcsIGhkcl9sZW4sIGNyeXB0LT5wcml2KTsKKwlpZiAocmVzID09IDAgJiYgY3J5cHQtPm9wcy0+ZW5jcnlwdF9tcGR1KQorCQlyZXMgPSBjcnlwdC0+b3BzLT5lbmNyeXB0X21wZHUoZnJhZywgaGRyX2xlbiwgY3J5cHQtPnByaXYpOworCisJYXRvbWljX2RlYygmY3J5cHQtPnJlZmNudCk7CisJaWYgKHJlcyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVuY3J5cHRpb24gZmFpbGVkOiBsZW49JWQuXG4iLAorCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lLCBmcmFnLT5sZW4pOworCQlpZWVlLT5pZWVlX3N0YXRzLnR4X2Rpc2NhcmRzKys7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGllZWU4MDIxMV90eGJfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiKSB7CisJLy9pbnQgaTsKKwlpZiAodW5saWtlbHkoIXR4YikpCisJCXJldHVybjsKKwlrZnJlZSh0eGIpOworfQorCitzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqaWVlZTgwMjExX2FsbG9jX3R4YihpbnQgbnJfZnJhZ3MsIGludCB0eGJfc2l6ZSwKKwkJCQkJICBpbnQgZ2ZwX21hc2spCit7CisJc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YjsKKwlpbnQgaTsKKwl0eGIgPSBrbWFsbG9jKAorCQlzaXplb2Yoc3RydWN0IGllZWU4MDIxMV90eGIpICsgKHNpemVvZih1OCopICogbnJfZnJhZ3MpLAorCQlnZnBfbWFzayk7CisJaWYgKCF0eGIpCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KHR4YiwgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfdHhiKSk7CisJdHhiLT5ucl9mcmFncyA9IG5yX2ZyYWdzOworCXR4Yi0+ZnJhZ19zaXplID0gdHhiX3NpemU7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfZnJhZ3M7IGkrKykgeworCQl0eGItPmZyYWdtZW50c1tpXSA9IGRldl9hbGxvY19za2IodHhiX3NpemUpOworCQlpZiAodW5saWtlbHkoIXR4Yi0+ZnJhZ21lbnRzW2ldKSkgeworCQkJaS0tOworCQkJYnJlYWs7CisJCX0KKwkJbWVtc2V0KHR4Yi0+ZnJhZ21lbnRzW2ldLT5jYiwgMCwgc2l6ZW9mKHR4Yi0+ZnJhZ21lbnRzW2ldLT5jYikpOworCX0KKwlpZiAodW5saWtlbHkoaSAhPSBucl9mcmFncykpIHsKKwkJd2hpbGUgKGkgPj0gMCkKKwkJCWRldl9rZnJlZV9za2JfYW55KHR4Yi0+ZnJhZ21lbnRzW2ktLV0pOworCQlrZnJlZSh0eGIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIHR4YjsKK30KKworLy8gQ2xhc3NpZnkgdGhlIHRvLWJlIHNlbmQgZGF0YSBwYWNrZXQKKy8vIE5lZWQgdG8gYWNxdWlyZSB0aGUgc2VudCBxdWV1ZSBpbmRleC4KK3N0YXRpYyBpbnQKK2llZWU4MDIxMV9jbGFzc2lmeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmspCit7CisJc3RydWN0IGV0aGhkciAqZXRoOworCXN0cnVjdCBpcGhkciAqaXA7CisJZXRoID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7CisJaWYgKGV0aC0+aF9wcm90byAhPSBodG9ucyhFVEhfUF9JUCkpCisJCXJldHVybiAwOworCisvLwlJRUVFODAyMTFfREVCVUdfREFUQShJRUVFODAyMTFfRExfREFUQSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJaXAgPSBpcF9oZHIoc2tiKTsKKwlzd2l0Y2ggKGlwLT50b3MgJiAweGZjKSB7CisJCWNhc2UgMHgyMDoKKwkJCXJldHVybiAyOworCQljYXNlIDB4NDA6CisJCQlyZXR1cm4gMTsKKwkJY2FzZSAweDYwOgorCQkJcmV0dXJuIDM7CisJCWNhc2UgMHg4MDoKKwkJCXJldHVybiA0OworCQljYXNlIDB4YTA6CisJCQlyZXR1cm4gNTsKKwkJY2FzZSAweGMwOgorCQkJcmV0dXJuIDY7CisJCWNhc2UgMHhlMDoKKwkJCXJldHVybiA3OworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJfQorfQorCisjZGVmaW5lIFNOX0xFU1MoYSwgYikJCSgoKGEtYikmMHg4MDApIT0wKQordm9pZCBpZWVlODAyMTFfdHhfcXVlcnlfYWdnX2NhcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgc3RydWN0IHNrX2J1ZmYqIHNrYiwgY2JfZGVzYyogdGNiX2Rlc2MpCit7CisJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKwlQVFhfVFNfUkVDT1JECQkJcFR4VHMgPSBOVUxMOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzFhZGRyKiBoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfMWFkZHIqKXNrYi0+ZGF0YTsKKworCWlmICghcEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnR8fCFwSFRJbmZvLT5iRW5hYmxlSFQpCisJCXJldHVybjsKKwlpZiAoIUlzUW9TRGF0YUZyYW1lKHNrYi0+ZGF0YSkpCisJCXJldHVybjsKKworCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSB8fCBpc19icm9hZGNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSkKKwkJcmV0dXJuOworCS8vY2hlY2sgcGFja2V0IGFuZCBtb2RlIGxhdGVyCisjaWZkZWYgVE9fRE9fTElTVAorCWlmKHBUY2ItPlBhY2tldExlbmd0aCA+PSA0MDk2KQorCQlyZXR1cm47CisJLy8gRm9yIFJUTDgxOVgsIGlmIHBhaXJ3aXNla2V5ID0gd2VwL3RraXAsIHdlIGRvbid0IGFnZ3JyZWdhdGlvbi4KKwlpZighQWRhcHRlci0+SGFsRnVuYy5HZXRObW9kZVN1cHBvcnRCeVNlY0NmZ0hhbmRsZXIoQWRhcHRlcikpCisJCXJldHVybjsKKyNlbmRpZgorCWlmKCFpZWVlLT5HZXRObW9kZVN1cHBvcnRCeVNlY0NmZyhpZWVlLT5kZXYpKQorCXsKKwkJcmV0dXJuOworCX0KKwlpZihwSFRJbmZvLT5iQ3VycmVudEFNUERVRW5hYmxlKQorCXsKKwkJaWYgKCFHZXRUcyhpZWVlLCAoUFRTX0NPTU1PTl9JTkZPKikoJnBUeFRzKSwgaGRyLT5hZGRyMSwgc2tiLT5wcmlvcml0eSwgVFhfRElSLCB0cnVlKSkKKwkJeworCQkJcHJpbnRrKCI9PT0+Y2FuJ3QgZ2V0IFRTXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAocFR4VHMtPlR4QWRtaXR0ZWRCQVJlY29yZC5iVmFsaWQgPT0gZmFsc2UpCisJCXsKKwkJCVRzU3RhcnRBZGRCYVByb2Nlc3MoaWVlZSwgcFR4VHMpOworCQkJZ290byBGT1JDRURfQUdHX1NFVFRJTkc7CisJCX0KKwkJZWxzZSBpZiAocFR4VHMtPmJVc2luZ0JhID09IGZhbHNlKQorCQl7CisJCQlpZiAoU05fTEVTUyhwVHhUcy0+VHhBZG1pdHRlZEJBUmVjb3JkLkJhU3RhcnRTZXFDdHJsLmZpZWxkLlNlcU51bSwgKHBUeFRzLT5UeEN1clNlcSsxKSU0MDk2KSkKKwkJCQlwVHhUcy0+YlVzaW5nQmEgPSB0cnVlOworCQkJZWxzZQorCQkJCWdvdG8gRk9SQ0VEX0FHR19TRVRUSU5HOworCQl9CisKKwkJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkKKwkJeworCQkJdGNiX2Rlc2MtPmJBTVBEVUVuYWJsZSA9IHRydWU7CisJCQl0Y2JfZGVzYy0+YW1wZHVfZmFjdG9yID0gcEhUSW5mby0+Q3VycmVudEFNUERVRmFjdG9yOworCQkJdGNiX2Rlc2MtPmFtcGR1X2RlbnNpdHkgPSBwSFRJbmZvLT5DdXJyZW50TVBEVURlbnNpdHk7CisJCX0KKwl9CitGT1JDRURfQUdHX1NFVFRJTkc6CisJc3dpdGNoKHBIVEluZm8tPkZvcmNlZEFNUERVTW9kZSApCisJeworCQljYXNlIEhUX0FHR19BVVRPOgorCQkJYnJlYWs7CisKKwkJY2FzZSBIVF9BR0dfRk9SQ0VfRU5BQkxFOgorCQkJdGNiX2Rlc2MtPmJBTVBEVUVuYWJsZSA9IHRydWU7CisJCQl0Y2JfZGVzYy0+YW1wZHVfZGVuc2l0eSA9IHBIVEluZm8tPkZvcmNlZE1QRFVEZW5zaXR5OworCQkJdGNiX2Rlc2MtPmFtcGR1X2ZhY3RvciA9IHBIVEluZm8tPkZvcmNlZEFNUERVRmFjdG9yOworCQkJYnJlYWs7CisKKwkJY2FzZSBIVF9BR0dfRk9SQ0VfRElTQUJMRToKKwkJCXRjYl9kZXNjLT5iQU1QRFVFbmFibGUgPSBmYWxzZTsKKwkJCXRjYl9kZXNjLT5hbXBkdV9kZW5zaXR5ID0gMDsKKwkJCXRjYl9kZXNjLT5hbXBkdV9mYWN0b3IgPSAwOworCQkJYnJlYWs7CisKKwl9CisJCXJldHVybjsKK30KKworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3F1cmV5X1Nob3J0UHJlYW1ibGVNb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBjYl9kZXNjKiB0Y2JfZGVzYykKK3sKKwl0Y2JfZGVzYy0+YlVzZVNob3J0UHJlYW1ibGUgPSBmYWxzZTsKKwlpZiAodGNiX2Rlc2MtPmRhdGFfcmF0ZSA9PSAyKQorCXsvLy8vIDFNIGNhbiBvbmx5IHVzZSBMb25nIFByZWFtYmxlLiAxMUIgc3BlYworCQlyZXR1cm47CisJfQorCWVsc2UgaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFKQorCXsKKwkJdGNiX2Rlc2MtPmJVc2VTaG9ydFByZWFtYmxlID0gdHJ1ZTsKKwl9CisJcmV0dXJuOworfQorZXh0ZXJuCXZvaWQKK2llZWU4MDIxMV9xdWVyeV9IVENhcFNob3J0R0koc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGNiX2Rlc2MgKnRjYl9kZXNjKQoreworCVBSVF9ISUdIX1RIUk9VR0hQVVQJCXBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworCisJdGNiX2Rlc2MtPmJVc2VTaG9ydEdJIAkJPSBmYWxzZTsKKworCWlmKCFwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydHx8IXBIVEluZm8tPmJFbmFibGVIVCkKKwkJcmV0dXJuOworCisJaWYocEhUSW5mby0+YkZvcmNlZFNob3J0R0kpCisJeworCQl0Y2JfZGVzYy0+YlVzZVNob3J0R0kgPSB0cnVlOworCQlyZXR1cm47CisJfQorCisJaWYoKHBIVEluZm8tPmJDdXJCVzQwTUh6PT10cnVlKSAmJiBwSFRJbmZvLT5iQ3VyU2hvcnRHSTQwTUh6KQorCQl0Y2JfZGVzYy0+YlVzZVNob3J0R0kgPSB0cnVlOworCWVsc2UgaWYoKHBIVEluZm8tPmJDdXJCVzQwTUh6PT1mYWxzZSkgJiYgcEhUSW5mby0+YkN1clNob3J0R0kyME1IeikKKwkJdGNiX2Rlc2MtPmJVc2VTaG9ydEdJID0gdHJ1ZTsKK30KKwordm9pZCBpZWVlODAyMTFfcXVlcnlfQmFuZHdpZHRoTW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgY2JfZGVzYyAqdGNiX2Rlc2MpCit7CisJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKworCXRjYl9kZXNjLT5iUGFja2V0QlcgPSBmYWxzZTsKKworCWlmKCFwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydHx8IXBIVEluZm8tPmJFbmFibGVIVCkKKwkJcmV0dXJuOworCisJaWYodGNiX2Rlc2MtPmJNdWx0aWNhc3QgfHwgdGNiX2Rlc2MtPmJCcm9hZGNhc3QpCisJCXJldHVybjsKKworCWlmKCh0Y2JfZGVzYy0+ZGF0YV9yYXRlICYgMHg4MCk9PTApIC8vIElmIHVzaW5nIGxlZ2FjeSByYXRlLCBpdCBzaGFsbCB1c2UgMjBNSHogY2hhbm5lbC4KKwkJcmV0dXJuOworCS8vQmFuZFdpZHRoQXV0b1N3aXRjaCBpcyBmb3IgYXV0byBzd2l0Y2ggdG8gMjAgb3IgNDAgaW4gbG9uZyBkaXN0YW5jZQorCWlmKHBIVEluZm8tPmJDdXJCVzQwTUh6ICYmIHBIVEluZm8tPmJDdXJUeEJXNDBNSHogJiYgIWllZWUtPmJhbmR3aWR0aF9hdXRvX3N3aXRjaC5iZm9yY2VkX3R4MjBNaHopCisJCXRjYl9kZXNjLT5iUGFja2V0QlcgPSB0cnVlOworCXJldHVybjsKK30KKwordm9pZCBpZWVlODAyMTFfcXVlcnlfcHJvdGVjdGlvbm1vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIGNiX2Rlc2MqIHRjYl9kZXNjLCBzdHJ1Y3Qgc2tfYnVmZiogc2tiKQoreworCS8vIENvbW1vbiBTZXR0aW5ncworCXRjYl9kZXNjLT5iUlRTU1RCQwkJCT0gZmFsc2U7CisJdGNiX2Rlc2MtPmJSVFNVc2VTaG9ydEdJCQk9IGZhbHNlOyAvLyBTaW5jZSBwcm90ZWN0aW9uIGZyYW1lcyBhcmUgYWx3YXlzIHNlbnQgYnkgbGVnYWN5IHJhdGUsIFNob3J0R0kgd2lsbCBuZXZlciBiZSB1c2VkLgorCXRjYl9kZXNjLT5iQ1RTRW5hYmxlCQkJPSBmYWxzZTsgLy8gTW9zdCBvZiBwcm90ZWN0aW9uIHVzaW5nIFJUUy9DVFMKKwl0Y2JfZGVzYy0+UlRTU0MJCQkJPSAwOwkJLy8gMjBNSHo6IERvbid0IGNhcmU7ICA0ME1IejogRHVwbGljYXRlLgorCXRjYl9kZXNjLT5iUlRTQlcJCQk9IGZhbHNlOyAvLyBSVFMgZnJhbWUgYmFuZHdpZHRoIGlzIGFsd2F5cyAyME1IegorCisJaWYodGNiX2Rlc2MtPmJCcm9hZGNhc3QgfHwgdGNiX2Rlc2MtPmJNdWx0aWNhc3QpLy9vbmx5IHVuaWNhc3QgZnJhbWUgd2lsbCB1c2UgcnRzL2N0cworCQlyZXR1cm47CisKKwlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoc2tiLT5kYXRhKzE2KSkgIC8vY2hlY2sgYWRkcjMgYXMgaW5mcmFzdHJ1Y3R1cmUgYWRkMyBpcyBEQS4KKwkJcmV0dXJuOworCisJaWYgKGllZWUtPm1vZGUgPCBJRUVFX05fMjRHKSAvL2IsIGcgbW9kZQorCXsKKwkJCS8vICgxKSBSVFNfVGhyZXNob2xkIGlzIGNvbXBhcmVkIHRvIHRoZSBNUERVLCBub3QgTVNEVS4KKwkJCS8vICgyKSBJZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBmcmFnIGluICB0aGlzIE1TRFUsIG9ubHkgdGhlIGZpcnN0IGZyYWcgdXNlcyBwcm90ZWN0aW9uIGZyYW1lLgorCQkJLy8JCU90aGVyIGZyYWdtZW50cyBhcmUgcHJvdGVjdGVkIGJ5IHByZXZpb3VzIGZyYWdtZW50LgorCQkJLy8JCVNvIHdlIG9ubHkgbmVlZCB0byBjaGVjayB0aGUgbGVuZ3RoIG9mIGZpcnN0IGZyYWdtZW50LgorCQlpZiAoc2tiLT5sZW4gPiBpZWVlLT5ydHMpCisJCXsKKwkJCXRjYl9kZXNjLT5iUlRTRW5hYmxlID0gdHJ1ZTsKKwkJCXRjYl9kZXNjLT5ydHNfcmF0ZSA9IE1HTl8yNE07CisJCX0KKwkJZWxzZSBpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJ1c2Vwcm90ZWN0aW9uKQorCQl7CisJCQkvLyBVc2UgQ1RTLXRvLVNFTEYgaW4gcHJvdGVjdGlvbiBtb2RlLgorCQkJdGNiX2Rlc2MtPmJSVFNFbmFibGUgPSB0cnVlOworCQkJdGNiX2Rlc2MtPmJDVFNFbmFibGUgPSB0cnVlOworCQkJdGNiX2Rlc2MtPnJ0c19yYXRlID0gTUdOXzI0TTsKKwkJfQorCQkvL290aGVyd2lzZSByZXR1cm47CisJCXJldHVybjsKKwl9CisJZWxzZQorCXsvLyAxMW4gSGlnaCB0aHJvdWdocHV0IGNhc2UuCisJCVBSVF9ISUdIX1RIUk9VR0hQVVQgcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CisJCXdoaWxlICh0cnVlKQorCQl7CisJCQkvL2NoZWNrIEVSUCBwcm90ZWN0aW9uCisJCQlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJ1c2Vwcm90ZWN0aW9uKQorCQkJey8vIENUUy10by1TRUxGCisJCQkJdGNiX2Rlc2MtPmJSVFNFbmFibGUgPSB0cnVlOworCQkJCXRjYl9kZXNjLT5iQ1RTRW5hYmxlID0gdHJ1ZTsKKwkJCQl0Y2JfZGVzYy0+cnRzX3JhdGUgPSBNR05fMjRNOworCQkJCWJyZWFrOworCQkJfQorCQkJLy9jaGVjayBIVCBvcCBtb2RlCisJCQlpZihwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCAgJiYgcEhUSW5mby0+YkVuYWJsZUhUKQorCQkJeworCQkJCXU4IEhUT3BNb2RlID0gcEhUSW5mby0+Q3VycmVudE9wTW9kZTsKKwkJCQlpZigocEhUSW5mby0+YkN1ckJXNDBNSHogJiYgKEhUT3BNb2RlID09IDIgfHwgSFRPcE1vZGUgPT0gMykpIHx8CisJCQkJCQkJKCFwSFRJbmZvLT5iQ3VyQlc0ME1IeiAmJiBIVE9wTW9kZSA9PSAzKSApCisJCQkJeworCQkJCQl0Y2JfZGVzYy0+cnRzX3JhdGUgPSBNR05fMjRNOyAvLyBSYXRlIGlzIDI0TWJwcy4KKwkJCQkJdGNiX2Rlc2MtPmJSVFNFbmFibGUgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQkvL2NoZWNrIHJ0cworCQkJaWYgKHNrYi0+bGVuID4gaWVlZS0+cnRzKQorCQkJeworCQkJCXRjYl9kZXNjLT5ydHNfcmF0ZSA9IE1HTl8yNE07IC8vIFJhdGUgaXMgMjRNYnBzLgorCQkJCXRjYl9kZXNjLT5iUlRTRW5hYmxlID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8vdG8gZG8gbGlzdDogY2hlY2sgTUlNTyBwb3dlciBzYXZlIGNvbmRpdGlvbi4KKwkJCS8vY2hlY2sgQU1QRFUgYWdncmVnYXRpb24gZm9yIFRYT1AKKwkJCWlmKHRjYl9kZXNjLT5iQU1QRFVFbmFibGUpCisJCQl7CisJCQkJdGNiX2Rlc2MtPnJ0c19yYXRlID0gTUdOXzI0TTsgLy8gUmF0ZSBpcyAyNE1icHMuCisJCQkJLy8gQWNjb3JkaW5nIHRvIDgxOTAgZGVzaWduLCBmaXJtd2FyZSBzZW5kcyBDRi1FbmQgb25seSBpZiBSVFMvQ1RTIGlzIGVuYWJsZWQuIEhvd2V2ZXIsIGl0IGRlZ3JhZHMKKwkJCQkvLyB0aHJvdWdocHV0IGFyb3VuZCAxME0sIHNvIHdlIGRpc2FibGUgb2YgdGhpcyBtZWNoYW5pc20uIDIwMDcuMDguMDMgYnkgRW1pbHkKKwkJCQl0Y2JfZGVzYy0+YlJUU0VuYWJsZSA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJfQorCQkJLy9jaGVjayBJT1QgYWN0aW9uCisJCQlpZihwSFRJbmZvLT5JT1RBY3Rpb24gJiBIVF9JT1RfQUNUX0ZPUkNFRF9DVFMyU0VMRikKKwkJCXsKKwkJCQl0Y2JfZGVzYy0+YkNUU0VuYWJsZQk9IHRydWU7CisJCQkJdGNiX2Rlc2MtPnJ0c19yYXRlICA9IAlNR05fMjRNOworCQkJCXRjYl9kZXNjLT5iUlRTRW5hYmxlID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8vIFRvdGFsbHkgbm8gcHJvdGVjdGlvbiBjYXNlISEKKwkJCWdvdG8gTk9fUFJPVEVDVElPTjsKKwkJfQorCQl9CisJLy8gRm9yIHRlc3QgLCBDVFMgcmVwbGFjZSB3aXRoIFJUUworCWlmKCAwICkKKwl7CisJCXRjYl9kZXNjLT5iQ1RTRW5hYmxlCT0gdHJ1ZTsKKwkJdGNiX2Rlc2MtPnJ0c19yYXRlID0gTUdOXzI0TTsKKwkJdGNiX2Rlc2MtPmJSVFNFbmFibGUgCT0gdHJ1ZTsKKwl9CisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFKQorCQl0Y2JfZGVzYy0+YlVzZVNob3J0UHJlYW1ibGUgPSB0cnVlOworCWlmIChpZWVlLT5tb2RlID09IElXX01PREVfTUFTVEVSKQorCQkJZ290byBOT19QUk9URUNUSU9OOworCXJldHVybjsKK05PX1BST1RFQ1RJT046CisJdGNiX2Rlc2MtPmJSVFNFbmFibGUJPSBmYWxzZTsKKwl0Y2JfZGVzYy0+YkNUU0VuYWJsZQk9IGZhbHNlOworCXRjYl9kZXNjLT5ydHNfcmF0ZQkJPSAwOworCXRjYl9kZXNjLT5SVFNTQwkJPSAwOworCXRjYl9kZXNjLT5iUlRTQlcJCT0gZmFsc2U7Cit9CisKKwordm9pZCBpZWVlODAyMTFfdHhyYXRlX3NlbGVjdG1vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIGNiX2Rlc2MqIHRjYl9kZXNjKQoreworI2lmZGVmIFRPX0RPX0xJU1QKKwlpZighSXNEYXRhRnJhbWUocEZyYW1lKSkKKwl7CisJCXBUY2ItPmJUeERpc2FibGVSYXRlRmFsbEJhY2sgPSBUUlVFOworCQlwVGNiLT5iVHhVc2VEcml2ZXJBc3NpbmdlZFJhdGUgPSBUUlVFOworCQlwVGNiLT5SQVRSSW5kZXggPSA3OworCQlyZXR1cm47CisJfQorCisJaWYocE1nbnRJbmZvLT5Gb3JjZWREYXRhUmF0ZSE9IDApCisJeworCQlwVGNiLT5iVHhEaXNhYmxlUmF0ZUZhbGxCYWNrID0gVFJVRTsKKwkJcFRjYi0+YlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlID0gVFJVRTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCWlmKGllZWUtPmJUeERpc2FibGVSYXRlRmFsbEJhY2spCisJCXRjYl9kZXNjLT5iVHhEaXNhYmxlUmF0ZUZhbGxCYWNrID0gdHJ1ZTsKKworCWlmKGllZWUtPmJUeFVzZURyaXZlckFzc2luZ2VkUmF0ZSkKKwkJdGNiX2Rlc2MtPmJUeFVzZURyaXZlckFzc2luZ2VkUmF0ZSA9IHRydWU7CisJaWYoIXRjYl9kZXNjLT5iVHhEaXNhYmxlUmF0ZUZhbGxCYWNrIHx8ICF0Y2JfZGVzYy0+YlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlKQorCXsKKwkJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSB8fCBpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCisJCQl0Y2JfZGVzYy0+UkFUUkluZGV4ID0gMDsKKwl9Cit9CisKK3ZvaWQgaWVlZTgwMjExX3F1ZXJ5X3NlcW51bShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiogc2tiLCB1OCogZHN0KQoreworCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihkc3QpIHx8IGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGRzdCkpCisJCXJldHVybjsKKwlpZiAoSXNRb1NEYXRhRnJhbWUoc2tiLT5kYXRhKSkgLy93ZSBkZWFsIHFvcyBkYXRhIG9ubHkKKwl7CisJCVBUWF9UU19SRUNPUkQgcFRTID0gTlVMTDsKKwkJaWYgKCFHZXRUcyhpZWVlLCAoUFRTX0NPTU1PTl9JTkZPKikoJnBUUyksIGRzdCwgc2tiLT5wcmlvcml0eSwgVFhfRElSLCB0cnVlKSkKKwkJeworCQkJcmV0dXJuOworCQl9CisJCXBUUy0+VHhDdXJTZXEgPSAocFRTLT5UeEN1clNlcSsxKSU0MDk2OworCX0KK30KKworaW50IGllZWU4MDIxMV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIgPSBOVUxMOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRycW9zICpmcmFnX2hkcjsKKwlpbnQgaSwgYnl0ZXNfcGVyX2ZyYWcsIG5yX2ZyYWdzLCBieXRlc19sYXN0X2ZyYWcsIGZyYWdfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZpZWVlLT5zdGF0czsKKwlpbnQgZXRoZXJfdHlwZSA9IDAsIGVuY3J5cHQ7CisJaW50IGJ5dGVzLCBmYywgcW9zX2N0bCA9IDAsIGhkcl9sZW47CisJc3RydWN0IHNrX2J1ZmYgKnNrYl9mcmFnOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRycW9zIGhlYWRlciA9IHsgLyogRW5zdXJlIHplcm8gaW5pdGlhbGl6ZWQgKi8KKwkJLmR1cmF0aW9uX2lkID0gMCwKKwkJLnNlcV9jdGwgPSAwLAorCQkucW9zX2N0bCA9IDAKKwl9OworCXU4IGRlc3RbRVRIX0FMRU5dLCBzcmNbRVRIX0FMRU5dOworCWludCBxb3NfYWN0aXZlZCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5hY3RpdmU7CisKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEqIGNyeXB0OworCisJY2JfZGVzYyAqdGNiX2Rlc2M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJLyogSWYgdGhlcmUgaXMgbm8gZHJpdmVyIGhhbmRsZXIgdG8gdGFrZSB0aGUgVFhCLCBkb250JyBib3RoZXIKKwkgKiBjcmVhdGluZyBpdC4uLiAqLworCWlmICgoIWllZWUtPmhhcmRfc3RhcnRfeG1pdCAmJiAhKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfVFhfUVVFVUUpKXx8CisJICAgKCghaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCAmJiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19UWF9RVUVVRSkpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm8geG1pdCBoYW5kbGVyLlxuIiwKKwkJICAgICAgIGllZWUtPmRldi0+bmFtZSk7CisJCWdvdG8gc3VjY2VzczsKKwl9CisKKworCWlmKGxpa2VseShpZWVlLT5yYXdfdHggPT0gMCkpeworCQlpZiAodW5saWtlbHkoc2tiLT5sZW4gPCBTTkFQX1NJWkUgKyBzaXplb2YodTE2KSkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBza2IgdG9vIHNtYWxsICglZCkuXG4iLAorCQkJaWVlZS0+ZGV2LT5uYW1lLCBza2ItPmxlbik7CisJCQlnb3RvIHN1Y2Nlc3M7CisJCX0KKworCQltZW1zZXQoc2tiLT5jYiwgMCwgc2l6ZW9mKHNrYi0+Y2IpKTsKKwkJZXRoZXJfdHlwZSA9IG50b2hzKCgoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YSktPmhfcHJvdG8pOworCisJCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKKworCQllbmNyeXB0ID0gIShldGhlcl90eXBlID09IEVUSF9QX1BBRSAmJiBpZWVlLT5pZWVlODAyXzF4KSAmJgorCQkJaWVlZS0+aG9zdF9lbmNyeXB0ICYmIGNyeXB0ICYmIGNyeXB0LT5vcHM7CisKKwkJaWYgKCFlbmNyeXB0ICYmIGllZWUtPmllZWU4MDJfMXggJiYKKwkJaWVlZS0+ZHJvcF91bmVuY3J5cHRlZCAmJiBldGhlcl90eXBlICE9IEVUSF9QX1BBRSkgeworCQkJc3RhdHMtPnR4X2Ryb3BwZWQrKzsKKwkJCWdvdG8gc3VjY2VzczsKKwkJfQorCSNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisJCWlmIChjcnlwdCAmJiAhZW5jcnlwdCAmJiBldGhlcl90eXBlID09IEVUSF9QX1BBRSkgeworCQkJc3RydWN0IGVhcG9sICplYXAgPSAoc3RydWN0IGVhcG9sICopKHNrYi0+ZGF0YSArCisJCQkJc2l6ZW9mKHN0cnVjdCBldGhoZHIpIC0gU05BUF9TSVpFIC0gc2l6ZW9mKHUxNikpOworCQkJSUVFRTgwMjExX0RFQlVHX0VBUCgiVFg6IElFRUUgODAyLjExIEVBUE9MIGZyYW1lOiAlc1xuIiwKKwkJCQllYXBfZ2V0X3R5cGUoZWFwLT50eXBlKSk7CisJCX0KKwkjZW5kaWYKKworCQkvKiBTYXZlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYWRkcmVzc2VzICovCisJCW1lbWNweSgmZGVzdCwgc2tiLT5kYXRhLCBFVEhfQUxFTik7CisJCW1lbWNweSgmc3JjLCBza2ItPmRhdGErRVRIX0FMRU4sIEVUSF9BTEVOKTsKKworICAgICAgICAgICAgICAgIC8qIEFkdmFuY2UgdGhlIFNLQiB0byB0aGUgc3RhcnQgb2YgdGhlIHBheWxvYWQgKi8KKyAgICAgICAgICAgICAgICBza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7CisKKyAgICAgICAgICAgICAgICAvKiBEZXRlcm1pbmUgdG90YWwgYW1vdW50IG9mIHN0b3JhZ2UgcmVxdWlyZWQgZm9yIFRYQiBwYWNrZXRzICovCisgICAgICAgICAgICAgICAgYnl0ZXMgPSBza2ItPmxlbiArIFNOQVBfU0laRSArIHNpemVvZih1MTYpOworCisJCWlmIChlbmNyeXB0KQorCQkJZmMgPSBJRUVFODAyMTFfRlRZUEVfREFUQSB8IElFRUU4MDIxMV9GQ1RMX1dFUDsKKwkJZWxzZQorCisgICAgICAgICAgICAgICAgICAgICAgICBmYyA9IElFRUU4MDIxMV9GVFlQRV9EQVRBOworCisJCS8vaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLlFvU19FbmFibGUpCisJCWlmKHFvc19hY3RpdmVkKQorCQkJZmMgfD0gSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBOworCQllbHNlCisJCQlmYyB8PSBJRUVFODAyMTFfU1RZUEVfREFUQTsKKworCQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSB7CisJCQlmYyB8PSBJRUVFODAyMTFfRkNUTF9UT0RTOworCQkJLyogVG8gRFM6IEFkZHIxID0gQlNTSUQsIEFkZHIyID0gU0EsCisJCQlBZGRyMyA9IERBICovCisJCQltZW1jcHkoJmhlYWRlci5hZGRyMSwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisJCQltZW1jcHkoJmhlYWRlci5hZGRyMiwgJnNyYywgRVRIX0FMRU4pOworCQkJbWVtY3B5KCZoZWFkZXIuYWRkcjMsICZkZXN0LCBFVEhfQUxFTik7CisJCX0gZWxzZSBpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSB7CisJCQkvKiBub3QgRnJvbS9UbyBEUzogQWRkcjEgPSBEQSwgQWRkcjIgPSBTQSwKKwkJCUFkZHIzID0gQlNTSUQgKi8KKwkJCW1lbWNweSgmaGVhZGVyLmFkZHIxLCBkZXN0LCBFVEhfQUxFTik7CisJCQltZW1jcHkoJmhlYWRlci5hZGRyMiwgc3JjLCBFVEhfQUxFTik7CisJCQltZW1jcHkoJmhlYWRlci5hZGRyMywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisJCX0KKworICAgICAgICAgICAgICAgIGhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihmYyk7CisKKwkJLyogRGV0ZXJtaW5lIGZyYWdtZW50YXRpb24gc2l6ZSBiYXNlZCBvbiBkZXN0aW5hdGlvbiAobXVsdGljYXN0CisJCSogYW5kIGJyb2FkY2FzdCBhcmUgbm90IGZyYWdtZW50ZWQpICovCisJCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZWFkZXIuYWRkcjEpIHx8CisJCWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGhlYWRlci5hZGRyMSkpIHsKKwkJCWZyYWdfc2l6ZSA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKwkJCXFvc19jdGwgfD0gUU9TX0NUTF9OT1RDT05UQUlOX0FDSzsKKwkJfQorCQllbHNlIHsKKwkJCWZyYWdfc2l6ZSA9IGllZWUtPmZ0czsvL2RlZmF1bHQ6MzkyCisJCQlxb3NfY3RsID0gMDsKKwkJfQorCisJCS8vaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5Rb1NfRW5hYmxlKQorCQlpZihxb3NfYWN0aXZlZCkKKwkJeworCQkJaGRyX2xlbiA9IElFRUU4MDIxMV8zQUREUl9MRU4gKyAyOworCisJCQlza2ItPnByaW9yaXR5ID0gaWVlZTgwMjExX2NsYXNzaWZ5KHNrYiwgJmllZWUtPmN1cnJlbnRfbmV0d29yayk7CisJCQlxb3NfY3RsIHw9IHNrYi0+cHJpb3JpdHk7IC8vc2V0IGluIHRoZSBpZWVlODAyMTFfY2xhc3NpZnkKKwkJCWhlYWRlci5xb3NfY3RsID0gY3B1X3RvX2xlMTYocW9zX2N0bCAmIElFRUU4MDIxMV9RT1NfVElEKTsKKwkJfSBlbHNlIHsKKwkJCWhkcl9sZW4gPSBJRUVFODAyMTFfM0FERFJfTEVOOworCQl9CisJCS8qIERldGVybWluZSBhbW91bnQgb2YgcGF5bG9hZCBwZXIgZnJhZ21lbnQuICBSZWdhcmRsZXNzIG9mIGlmCisJCSogdGhpcyBzdGFjayBpcyBwcm92aWRpbmcgdGhlIGZ1bGwgODAyLjExIGhlYWRlciwgb25lIHdpbGwKKwkJKiBldmVudHVhbGx5IGJlIGFmZml4ZWQgdG8gdGhpcyBmcmFnbWVudCAtLSBzbyB3ZSBtdXN0IGFjY291bnQgZm9yCisJCSogaXQgd2hlbiBkZXRlcm1pbmluZyB0aGUgYW1vdW50IG9mIHBheWxvYWQgc3BhY2UuICovCisJCWJ5dGVzX3Blcl9mcmFnID0gZnJhZ19zaXplIC0gaGRyX2xlbjsKKwkJaWYgKGllZWUtPmNvbmZpZyAmCisJCShDRkdfSUVFRTgwMjExX0NPTVBVVEVfRkNTIHwgQ0ZHX0lFRUU4MDIxMV9SRVNFUlZFX0ZDUykpCisJCQlieXRlc19wZXJfZnJhZyAtPSBJRUVFODAyMTFfRkNTX0xFTjsKKworCQkvKiBFYWNoIGZyYWdtZW50IG1heSBuZWVkIHRvIGhhdmUgcm9vbSBmb3IgZW5jcnlwdGlvbmcgcHJlL3Bvc3RmaXggKi8KKwkJaWYgKGVuY3J5cHQpCisJCQlieXRlc19wZXJfZnJhZyAtPSBjcnlwdC0+b3BzLT5leHRyYV9wcmVmaXhfbGVuICsKKwkJCQljcnlwdC0+b3BzLT5leHRyYV9wb3N0Zml4X2xlbjsKKworCQkvKiBOdW1iZXIgb2YgZnJhZ21lbnRzIGlzIHRoZSB0b3RhbCBieXRlc19wZXJfZnJhZyAvCisJCSogcGF5bG9hZF9wZXJfZnJhZ21lbnQgKi8KKwkJbnJfZnJhZ3MgPSBieXRlcyAvIGJ5dGVzX3Blcl9mcmFnOworCQlieXRlc19sYXN0X2ZyYWcgPSBieXRlcyAlIGJ5dGVzX3Blcl9mcmFnOworCQlpZiAoYnl0ZXNfbGFzdF9mcmFnKQorCQkJbnJfZnJhZ3MrKzsKKwkJZWxzZQorCQkJYnl0ZXNfbGFzdF9mcmFnID0gYnl0ZXNfcGVyX2ZyYWc7CisKKwkJLyogV2hlbiB3ZSBhbGxvY2F0ZSB0aGUgVFhCIHdlIGFsbG9jYXRlIGVub3VnaCBzcGFjZSBmb3IgdGhlIHJlc2VydmUKKwkJKiBhbmQgZnVsbCBmcmFnbWVudCBieXRlcyAoYnl0ZXNfcGVyX2ZyYWcgZG9lc24ndCBpbmNsdWRlIHByZWZpeCwKKwkJKiBwb3N0Zml4LCBoZWFkZXIsIEZDUywgZXRjLikgKi8KKwkJdHhiID0gaWVlZTgwMjExX2FsbG9jX3R4Yihucl9mcmFncywgZnJhZ19zaXplICsgaWVlZS0+dHhfaGVhZHJvb20sIEdGUF9BVE9NSUMpOworCQlpZiAodW5saWtlbHkoIXR4YikpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgVFhCXG4iLAorCQkJaWVlZS0+ZGV2LT5uYW1lKTsKKwkJCWdvdG8gZmFpbGVkOworCQl9CisJCXR4Yi0+ZW5jcnlwdGVkID0gZW5jcnlwdDsKKwkJdHhiLT5wYXlsb2FkX3NpemUgPSBieXRlczsKKworCQkvL2lmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuUW9TX0VuYWJsZSkKKwkJaWYocW9zX2FjdGl2ZWQpCisJCXsKKwkJCXR4Yi0+cXVldWVfaW5kZXggPSBVUDJBQyhza2ItPnByaW9yaXR5KTsKKwkJfSBlbHNlIHsKKwkJCXR4Yi0+cXVldWVfaW5kZXggPSBXTUVfQUNfQks7OworCQl9CisKKworCisJCWZvciAoaSA9IDA7IGkgPCBucl9mcmFnczsgaSsrKSB7CisJCQlza2JfZnJhZyA9IHR4Yi0+ZnJhZ21lbnRzW2ldOworCQkJdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKShza2JfZnJhZy0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJCQlpZihxb3NfYWN0aXZlZCl7CisJCQkJc2tiX2ZyYWctPnByaW9yaXR5ID0gc2tiLT5wcmlvcml0eTsvL1VQMkFDKHNrYi0+cHJpb3JpdHkpOworCQkJCXRjYl9kZXNjLT5xdWV1ZV9pbmRleCA9ICBVUDJBQyhza2ItPnByaW9yaXR5KTsKKwkJCX0gZWxzZSB7CisJCQkJc2tiX2ZyYWctPnByaW9yaXR5ID0gV01FX0FDX0JLOworCQkJCXRjYl9kZXNjLT5xdWV1ZV9pbmRleCA9IFdNRV9BQ19CSzsKKwkJCX0KKwkJCXNrYl9yZXNlcnZlKHNrYl9mcmFnLCBpZWVlLT50eF9oZWFkcm9vbSk7CisKKwkJCWlmIChlbmNyeXB0KXsKKwkJCQlpZiAoaWVlZS0+aHdzZWNfYWN0aXZlKQorCQkJCQl0Y2JfZGVzYy0+Ykh3U2VjID0gMTsKKwkJCQllbHNlCisJCQkJCXRjYl9kZXNjLT5iSHdTZWMgPSAwOworCQkJCXNrYl9yZXNlcnZlKHNrYl9mcmFnLCBjcnlwdC0+b3BzLT5leHRyYV9wcmVmaXhfbGVuKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl0Y2JfZGVzYy0+Ykh3U2VjID0gMDsKKwkJCX0KKwkJCWZyYWdfaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRycW9zICopc2tiX3B1dChza2JfZnJhZywgaGRyX2xlbik7CisJCQltZW1jcHkoZnJhZ19oZHIsICZoZWFkZXIsIGhkcl9sZW4pOworCisJCQkvKiBJZiB0aGlzIGlzIG5vdCB0aGUgbGFzdCBmcmFnbWVudCwgdGhlbiBhZGQgdGhlIE1PUkVGUkFHUworCQkJKiBiaXQgdG8gdGhlIGZyYW1lIGNvbnRyb2wgKi8KKwkJCWlmIChpICE9IG5yX2ZyYWdzIC0gMSkgeworCQkJCWZyYWdfaGRyLT5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNigKKwkJCQkJZmMgfCBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MpOworCQkJCWJ5dGVzID0gYnl0ZXNfcGVyX2ZyYWc7CisKKwkJCX0gZWxzZSB7CisJCQkJLyogVGhlIGxhc3QgZnJhZ21lbnQgdGFrZXMgdGhlIHJlbWFpbmluZyBsZW5ndGggKi8KKwkJCQlieXRlcyA9IGJ5dGVzX2xhc3RfZnJhZzsKKwkJCX0KKwkJCS8vaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLlFvU19FbmFibGUpCisJCQlpZihxb3NfYWN0aXZlZCkKKwkJCXsKKwkJCQkvLyBhZGQgMSBvbmx5IGluZGljYXRlIHRvIGNvcnJlc3BvbmRpbmcgc2VxIG51bWJlciBjb250cm9sIDIwMDYvNy8xMgorCQkJCWZyYWdfaGRyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbVVAyQUMoc2tiLT5wcmlvcml0eSkrMV08PDQgfCBpKTsKKwkJCX0gZWxzZSB7CisJCQkJZnJhZ19oZHItPnNlcV9jdGwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFswXTw8NCB8IGkpOworCQkJfQorCisJCQkvKiBQdXQgYSBTTkFQIGhlYWRlciBvbiB0aGUgZmlyc3QgZnJhZ21lbnQgKi8KKwkJCWlmIChpID09IDApIHsKKwkJCQlpZWVlODAyMTFfcHV0X3NuYXAoCisJCQkJCXNrYl9wdXQoc2tiX2ZyYWcsIFNOQVBfU0laRSArIHNpemVvZih1MTYpKSwKKwkJCQkJZXRoZXJfdHlwZSk7CisJCQkJYnl0ZXMgLT0gU05BUF9TSVpFICsgc2l6ZW9mKHUxNik7CisJCQl9CisKKwkJCW1lbWNweShza2JfcHV0KHNrYl9mcmFnLCBieXRlcyksIHNrYi0+ZGF0YSwgYnl0ZXMpOworCisJCQkvKiBBZHZhbmNlIHRoZSBTS0IuLi4gKi8KKwkJCXNrYl9wdWxsKHNrYiwgYnl0ZXMpOworCisJCQkvKiBFbmNyeXB0aW9uIHJvdXRpbmUgd2lsbCBtb3ZlIHRoZSBoZWFkZXIgZm9yd2FyZCBpbiBvcmRlcgorCQkJKiB0byBpbnNlcnQgdGhlIElWIGJldHdlZW4gdGhlIGhlYWRlciBhbmQgdGhlIHBheWxvYWQgKi8KKwkJCWlmIChlbmNyeXB0KQorCQkJCWllZWU4MDIxMV9lbmNyeXB0X2ZyYWdtZW50KGllZWUsIHNrYl9mcmFnLCBoZHJfbGVuKTsKKwkJCWlmIChpZWVlLT5jb25maWcgJgorCQkJKENGR19JRUVFODAyMTFfQ09NUFVURV9GQ1MgfCBDRkdfSUVFRTgwMjExX1JFU0VSVkVfRkNTKSkKKwkJCQlza2JfcHV0KHNrYl9mcmFnLCA0KTsKKwkJfQorCisJCWlmKHFvc19hY3RpdmVkKQorCQl7CisJCSAgaWYgKGllZWUtPnNlcV9jdHJsW1VQMkFDKHNrYi0+cHJpb3JpdHkpICsgMV0gPT0gMHhGRkYpCisJCQlpZWVlLT5zZXFfY3RybFtVUDJBQyhza2ItPnByaW9yaXR5KSArIDFdID0gMDsKKwkJICBlbHNlCisJCQlpZWVlLT5zZXFfY3RybFtVUDJBQyhza2ItPnByaW9yaXR5KSArIDFdKys7CisJCX0gZWxzZSB7CisgIAkJICBpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCisJCQlpZWVlLT5zZXFfY3RybFswXSA9IDA7CisJCSAgZWxzZQorCQkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKKwkJfQorCX1lbHNleworCQlpZiAodW5saWtlbHkoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHNrYiB0b28gc21hbGwgKCVkKS5cbiIsCisJCQlpZWVlLT5kZXYtPm5hbWUsIHNrYi0+bGVuKTsKKwkJCWdvdG8gc3VjY2VzczsKKwkJfQorCisJCXR4YiA9IGllZWU4MDIxMV9hbGxvY190eGIoMSwgc2tiLT5sZW4sIEdGUF9BVE9NSUMpOworCQlpZighdHhiKXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgVFhCXG4iLAorCQkJaWVlZS0+ZGV2LT5uYW1lKTsKKwkJCWdvdG8gZmFpbGVkOworCQl9CisKKwkJdHhiLT5lbmNyeXB0ZWQgPSAwOworCQl0eGItPnBheWxvYWRfc2l6ZSA9IHNrYi0+bGVuOworCQltZW1jcHkoc2tiX3B1dCh0eGItPmZyYWdtZW50c1swXSxza2ItPmxlbiksIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCX0KKworIHN1Y2Nlc3M6CisvL1dCIGFkZCB0byBmaWxsIGRhdGEgdGNiX2Rlc2MgaGVyZS4gb25seSBmaXJzdCBmcmFnbWVudCBpcyBjb25zaWRlcmVkLCBuZWVkIHRvIGNoYW5nZSwgYW5kIHlvdSBtYXkgcmVtb3ZlIHRvIG90aGVyIHBsYWNlLgorCWlmICh0eGIpCisJeworCQljYl9kZXNjICp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHR4Yi0+ZnJhZ21lbnRzWzBdLT5jYiArIE1BWF9ERVZfQUREUl9TSVpFKTsKKwkJdGNiX2Rlc2MtPmJUeEVuYWJsZUZ3Q2FsY0R1ciA9IDE7CisJCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZWFkZXIuYWRkcjEpKQorCQkJdGNiX2Rlc2MtPmJNdWx0aWNhc3QgPSAxOworCQlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaGVhZGVyLmFkZHIxKSkKKwkJCXRjYl9kZXNjLT5iQnJvYWRjYXN0ID0gMTsKKwkJaWVlZTgwMjExX3R4cmF0ZV9zZWxlY3Rtb2RlKGllZWUsIHRjYl9kZXNjKTsKKwkJaWYgKCB0Y2JfZGVzYy0+Yk11bHRpY2FzdCB8fCAgdGNiX2Rlc2MtPmJCcm9hZGNhc3QpCisJCQl0Y2JfZGVzYy0+ZGF0YV9yYXRlID0gaWVlZS0+YmFzaWNfcmF0ZTsKKwkJZWxzZQorCQkJLy90Y2JfZGVzYy0+ZGF0YV9yYXRlID0gQ1VSUkVOVF9SQVRFKGllZWUtPmN1cnJlbnRfbmV0d29yay5tb2RlLCBpZWVlLT5yYXRlLCBpZWVlLT5IVEN1cnJlbnRPcGVyYVJhdGUpOworCQkJdGNiX2Rlc2MtPmRhdGFfcmF0ZSA9IENVUlJFTlRfUkFURShpZWVlLT5tb2RlLCBpZWVlLT5yYXRlLCBpZWVlLT5IVEN1cnJlbnRPcGVyYVJhdGUpOworCQlpZWVlODAyMTFfcXVyZXlfU2hvcnRQcmVhbWJsZU1vZGUoaWVlZSwgdGNiX2Rlc2MpOworCQlpZWVlODAyMTFfdHhfcXVlcnlfYWdnX2NhcChpZWVlLCB0eGItPmZyYWdtZW50c1swXSwgdGNiX2Rlc2MpOworCQlpZWVlODAyMTFfcXVlcnlfSFRDYXBTaG9ydEdJKGllZWUsIHRjYl9kZXNjKTsKKwkJaWVlZTgwMjExX3F1ZXJ5X0JhbmR3aWR0aE1vZGUoaWVlZSwgdGNiX2Rlc2MpOworCQlpZWVlODAyMTFfcXVlcnlfcHJvdGVjdGlvbm1vZGUoaWVlZSwgdGNiX2Rlc2MsIHR4Yi0+ZnJhZ21lbnRzWzBdKTsKKwkJaWVlZTgwMjExX3F1ZXJ5X3NlcW51bShpZWVlLCB0eGItPmZyYWdtZW50c1swXSwgaGVhZGVyLmFkZHIxKTsKKy8vCQlJRUVFODAyMTFfREVCVUdfREFUQShJRUVFODAyMTFfRExfREFUQSwgdHhiLT5mcmFnbWVudHNbMF0tPmRhdGEsIHR4Yi0+ZnJhZ21lbnRzWzBdLT5sZW4pOworCQkvL0lFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBLCB0Y2JfZGVzYywgc2l6ZW9mKGNiX2Rlc2MpKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJaWYgKHR4YikgeworCQlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19UWF9RVUVVRSl7CisJCQlpZWVlODAyMTFfc29mdG1hY194bWl0KHR4YiwgaWVlZSk7CisJCX1lbHNleworCQkJaWYgKCgqaWVlZS0+aGFyZF9zdGFydF94bWl0KSh0eGIsIGRldikgPT0gMCkgeworCQkJCXN0YXRzLT50eF9wYWNrZXRzKys7CisJCQkJc3RhdHMtPnR4X2J5dGVzICs9IHR4Yi0+cGF5bG9hZF9zaXplOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWVlZTgwMjExX3R4Yl9mcmVlKHR4Yik7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworIGZhaWxlZDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXN0YXRzLT50eF9lcnJvcnMrKzsKKwlyZXR1cm4gMTsKKworfQorCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV90eGJfZnJlZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfd3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzk3ZjFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfd3guYwpAQCAtMCwwICsxLDg3OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIENvcHlyaWdodChjKSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgYmFzZWQgb24gdGhlIFdFUCBlbmFibGVtZW50IGNvZGUgcHJvdmlkZWQgYnkgdGhlCisgIEhvc3QgQVAgcHJvamVjdCBob3N0YXAtZHJpdmVycyB2MC4xLjMKKyAgQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgIDxqa21hbGluZUBjYy5odXQuZmk+CisgIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKworICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKworICBDb250YWN0IEluZm9ybWF0aW9uOgorICBKYW1lcyBQLiBLZXRyZW5vcyA8aXB3MjEwMC1hZG1pbkBsaW51eC5pbnRlbC5jb20+CisgIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgImllZWU4MDIxMS5oIgorc3RydWN0IG1vZGVzX3VuaXQgeworCWNoYXIgKm1vZGVfc3RyaW5nOworCWludCBtb2RlX3NpemU7Cit9Oworc3RydWN0IG1vZGVzX3VuaXQgaWVlZTgwMjExX21vZGVzW10gPSB7CisJeyJhIiwxfSwKKwl7ImIiLDF9LAorCXsiZyIsMX0sCisJeyI/IiwxfSwKKwl7Ik4tMjRHIiw1fSwKKwl7Ik4tNUciLDR9LAorfTsKKworI2RlZmluZSBpd2Vfc3RyZWFtX2FkZF9ldmVudF9yc2wgaXdlX3N0cmVhbV9hZGRfZXZlbnQKKworI2RlZmluZSBNQVhfQ1VTVE9NX0xFTiA2NAorc3RhdGljIGlubGluZSBjaGFyICpydGw4MTl4X3RyYW5zbGF0ZV9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCQkgICBjaGFyICpzdGFydCwgY2hhciAqc3RvcCwKKwkJCQkJICAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrLAorCQkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvKQoreworCWNoYXIgY3VzdG9tW01BWF9DVVNUT01fTEVOXTsKKwljaGFyIHByb3RvX25hbWVbSUZOQU1TSVpdOworCWNoYXIgKnBuYW1lID0gcHJvdG9fbmFtZTsKKwljaGFyICpwOworCXN0cnVjdCBpd19ldmVudCBpd2U7CisJaW50IGksIGo7CisJdTE2IG1heF9yYXRlLCByYXRlOworCXN0YXRpYyB1OAlFV0MxMU5IVENhcFtdID0gezB4MDAsIDB4OTAsIDB4NGMsIDB4MzN9OworCisJLyogRmlyc3QgZW50cnkgKk1VU1QqIGJlIHRoZSBBUCBNQUMgYWRkcmVzcyAqLworCWl3ZS5jbWQgPSBTSU9DR0lXQVA7CisJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgbmV0d29yay0+YnNzaWQsIEVUSF9BTEVOKTsKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50X3JzbChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfQUREUl9MRU4pOworCS8qIFJlbWFpbmluZyBlbnRyaWVzIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBvcmRlciB3ZSBwcm92aWRlIHRoZW0gKi8KKworCS8qIEFkZCB0aGUgRVNTSUQgKi8KKwlpd2UuY21kID0gU0lPQ0dJV0VTU0lEOworCWl3ZS51LmRhdGEuZmxhZ3MgPSAxOworLy8JaWYgKG5ldHdvcmstPmZsYWdzICYgTkVUV09SS19FTVBUWV9FU1NJRCkgeworCWlmIChuZXR3b3JrLT5zc2lkX2xlbiA9PSAwKSB7CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKCI8aGlkZGVuPiIpOworCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCAiPGhpZGRlbj4iKTsKKwl9IGVsc2UgeworCQlpd2UudS5kYXRhLmxlbmd0aCA9IG1pbihuZXR3b3JrLT5zc2lkX2xlbiwgKHU4KTMyKTsKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgbmV0d29yay0+c3NpZCk7CisJfQorCS8qIEFkZCB0aGUgcHJvdG9jb2wgbmFtZSAqLworCWl3ZS5jbWQgPSBTSU9DR0lXTkFNRTsKKwlmb3IoaT0wOyBpPChzaXplb2YoaWVlZTgwMjExX21vZGVzKS9zaXplb2YoaWVlZTgwMjExX21vZGVzWzBdKSk7IGkrKykgeworCQlpZihuZXR3b3JrLT5tb2RlJigxPDxpKSkgeworCQkJc3ByaW50ZihwbmFtZSxpZWVlODAyMTFfbW9kZXNbaV0ubW9kZV9zdHJpbmcsaWVlZTgwMjExX21vZGVzW2ldLm1vZGVfc2l6ZSk7CisJCQlwbmFtZSArPWllZWU4MDIxMV9tb2Rlc1tpXS5tb2RlX3NpemU7CisJCX0KKwl9CisJKnBuYW1lID0gJ1wwJzsKKwlzbnByaW50Zihpd2UudS5uYW1lLCBJRk5BTVNJWiwgIklFRUU4MDIuMTElcyIsIHByb3RvX25hbWUpOworCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnRfcnNsKGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9DSEFSX0xFTik7CisJLyogQWRkIG1vZGUgKi8KKwlpd2UuY21kID0gU0lPQ0dJV01PREU7CisJaWYgKG5ldHdvcmstPmNhcGFiaWxpdHkgJgorCSAgICAoV0xBTl9DQVBBQklMSVRZX0JTUyB8IFdMQU5fQ0FQQUJJTElUWV9JQlNTKSkgeworCQlpZiAobmV0d29yay0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9CU1MpCisJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9NQVNURVI7CisJCWVsc2UKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0FESE9DOworCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50X3JzbChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfVUlOVF9MRU4pOworCX0KKworCS8qIEFkZCBmcmVxdWVuY3kvY2hhbm5lbCAqLworCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKKy8qCWl3ZS51LmZyZXEubSA9IGllZWU4MDIxMV9mcmVxdWVuY3kobmV0d29yay0+Y2hhbm5lbCwgbmV0d29yay0+bW9kZSk7CisJaXdlLnUuZnJlcS5lID0gMzsgKi8KKwlpd2UudS5mcmVxLm0gPSBuZXR3b3JrLT5jaGFubmVsOworCWl3ZS51LmZyZXEuZSA9IDA7CisJaXdlLnUuZnJlcS5pID0gMDsKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50X3JzbChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfRlJFUV9MRU4pOworCS8qIEFkZCBlbmNyeXB0aW9uIGNhcGFiaWxpdHkgKi8KKwlpd2UuY21kID0gU0lPQ0dJV0VOQ09ERTsKKwlpZiAobmV0d29yay0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKQorCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0VOQUJMRUQgfCBJV19FTkNPREVfTk9LRVk7CisJZWxzZQorCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCWl3ZS51LmRhdGEubGVuZ3RoID0gMDsKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBuZXR3b3JrLT5zc2lkKTsKKwkvKiBBZGQgYmFzaWMgYW5kIGV4dGVuZGVkIHJhdGVzICovCisJbWF4X3JhdGUgPSAwOworCXAgPSBjdXN0b207CisJcCArPSBzbnByaW50ZihwLCBNQVhfQ1VTVE9NX0xFTiAtIChwIC0gY3VzdG9tKSwgIiBSYXRlcyAoTWIvcyk6ICIpOworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgbmV0d29yay0+cmF0ZXNfbGVuOyApIHsKKwkJaWYgKGogPCBuZXR3b3JrLT5yYXRlc19leF9sZW4gJiYKKwkJICAgICgobmV0d29yay0+cmF0ZXNfZXhbal0gJiAweDdGKSA8CisJCSAgICAgKG5ldHdvcmstPnJhdGVzW2ldICYgMHg3RikpKQorCQkJcmF0ZSA9IG5ldHdvcmstPnJhdGVzX2V4W2orK10gJiAweDdGOworCQllbHNlCisJCQlyYXRlID0gbmV0d29yay0+cmF0ZXNbaSsrXSAmIDB4N0Y7CisJCWlmIChyYXRlID4gbWF4X3JhdGUpCisJCQltYXhfcmF0ZSA9IHJhdGU7CisJCXAgKz0gc25wcmludGYocCwgTUFYX0NVU1RPTV9MRU4gLSAocCAtIGN1c3RvbSksCisJCQkgICAgICAiJWQlcyAiLCByYXRlID4+IDEsIChyYXRlICYgMSkgPyAiLjUiIDogIiIpOworCX0KKwlmb3IgKDsgaiA8IG5ldHdvcmstPnJhdGVzX2V4X2xlbjsgaisrKSB7CisJCXJhdGUgPSBuZXR3b3JrLT5yYXRlc19leFtqXSAmIDB4N0Y7CisJCXAgKz0gc25wcmludGYocCwgTUFYX0NVU1RPTV9MRU4gLSAocCAtIGN1c3RvbSksCisJCQkgICAgICAiJWQlcyAiLCByYXRlID4+IDEsIChyYXRlICYgMSkgPyAiLjUiIDogIiIpOworCQlpZiAocmF0ZSA+IG1heF9yYXRlKQorCQkJbWF4X3JhdGUgPSByYXRlOworCX0KKworCWlmIChuZXR3b3JrLT5tb2RlID49IElFRUVfTl8yNEcpLy9hZGQgTiByYXRlIGhlcmU7CisJeworCQlQSFRfQ0FQQUJJTElUWV9FTEUgaHRfY2FwID0gTlVMTDsKKwkJYm9vbCBpczQwTSA9IGZhbHNlLCBpc1Nob3J0R0kgPSBmYWxzZTsKKwkJdTggbWF4X21jcyA9IDA7CisJCWlmICghbWVtY21wKG5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWYsIEVXQzExTkhUQ2FwLCA0KSkKKwkJCWh0X2NhcCA9IChQSFRfQ0FQQUJJTElUWV9FTEUpJm5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWZbNF07CisJCWVsc2UKKwkJCWh0X2NhcCA9IChQSFRfQ0FQQUJJTElUWV9FTEUpJm5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWZbMF07CisJCWlzNDBNID0gKGh0X2NhcC0+Q2hsV2lkdGgpPzE6MDsKKwkJaXNTaG9ydEdJID0gKGh0X2NhcC0+Q2hsV2lkdGgpPworCQkJCQkJKChodF9jYXAtPlNob3J0R0k0ME1oeik/MTowKToKKwkJCQkJCSgoaHRfY2FwLT5TaG9ydEdJMjBNaHopPzE6MCk7CisKKwkJbWF4X21jcyA9IEhUR2V0SGlnaGVzdE1DU1JhdGUoaWVlZSwgaHRfY2FwLT5NQ1MsIE1DU19GSUxURVJfQUxMKTsKKwkJcmF0ZSA9IE1DU19EQVRBX1JBVEVbaXM0ME1dW2lzU2hvcnRHSV1bbWF4X21jcyYweDdmXTsKKwkJaWYgKHJhdGUgPiBtYXhfcmF0ZSkKKwkJCW1heF9yYXRlID0gcmF0ZTsKKwl9CisJaXdlLmNtZCA9IFNJT0NHSVdSQVRFOworCWl3ZS51LmJpdHJhdGUuZml4ZWQgPSBpd2UudS5iaXRyYXRlLmRpc2FibGVkID0gMDsKKwlpd2UudS5iaXRyYXRlLnZhbHVlID0gbWF4X3JhdGUgKiA1MDAwMDA7CisJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudF9yc2woaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsCisJCQkJICAgICBJV19FVl9QQVJBTV9MRU4pOworCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworCWl3ZS51LmRhdGEubGVuZ3RoID0gcCAtIGN1c3RvbTsKKwlpZiAoaXdlLnUuZGF0YS5sZW5ndGgpCisJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgY3VzdG9tKTsKKwkvKiBBZGQgcXVhbGl0eSBzdGF0aXN0aWNzICovCisJLyogVE9ETzogRml4IHRoZXNlIHZhbHVlcy4uLiAqLworCWl3ZS5jbWQgPSBJV0VWUVVBTDsKKwlpd2UudS5xdWFsLnF1YWwgPSBuZXR3b3JrLT5zdGF0cy5zaWduYWw7CisJaXdlLnUucXVhbC5sZXZlbCA9IG5ldHdvcmstPnN0YXRzLnJzc2k7CisJaXdlLnUucXVhbC5ub2lzZSA9IG5ldHdvcmstPnN0YXRzLm5vaXNlOworCWl3ZS51LnF1YWwudXBkYXRlZCA9IG5ldHdvcmstPnN0YXRzLm1hc2sgJiBJRUVFODAyMTFfU1RBVE1BU0tfV0VNQVNLOworCWlmICghKG5ldHdvcmstPnN0YXRzLm1hc2sgJiBJRUVFODAyMTFfU1RBVE1BU0tfUlNTSSkpCisJCWl3ZS51LnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX0xFVkVMX0lOVkFMSUQ7CisJaWYgKCEobmV0d29yay0+c3RhdHMubWFzayAmIElFRUU4MDIxMV9TVEFUTUFTS19OT0lTRSkpCisJCWl3ZS51LnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX05PSVNFX0lOVkFMSUQ7CisJaWYgKCEobmV0d29yay0+c3RhdHMubWFzayAmIElFRUU4MDIxMV9TVEFUTUFTS19TSUdOQUwpKQorCQlpd2UudS5xdWFsLnVwZGF0ZWQgfD0gSVdfUVVBTF9RVUFMX0lOVkFMSUQ7CisJaXdlLnUucXVhbC51cGRhdGVkID0gNzsKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50X3JzbChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOworCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworCXAgPSBjdXN0b207CisKKwlpd2UudS5kYXRhLmxlbmd0aCA9IHAgLSBjdXN0b207CisJaWYgKGl3ZS51LmRhdGEubGVuZ3RoKQorCSAgICBzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBjdXN0b20pOworI2lmIChXSVJFTEVTU19FWFQgPCAxOCkKKwlpZiAoaWVlZS0+d3BhX2VuYWJsZWQgJiYgbmV0d29yay0+d3BhX2llX2xlbil7CisJCWNoYXIgYnVmW01BWF9XUEFfSUVfTEVOICogMiArIDMwXTsKKwkvLwlwcmludGsoIldQQSBJRVxuIik7CisJCXU4ICpwID0gYnVmOworCQlwICs9IHNwcmludGYocCwgIndwYV9pZT0iKTsKKwkJZm9yIChpID0gMDsgaSA8IG5ldHdvcmstPndwYV9pZV9sZW47IGkrKykgeworCQkJcCArPSBzcHJpbnRmKHAsICIlMDJ4IiwgbmV0d29yay0+d3BhX2llW2ldKTsKKwkJfQorCisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOworCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBidWYpOworCX0KKworCWlmIChpZWVlLT53cGFfZW5hYmxlZCAmJiBuZXR3b3JrLT5yc25faWVfbGVuKXsKKwkJY2hhciBidWZbTUFYX1dQQV9JRV9MRU4gKiAyICsgMzBdOworCisJCXU4ICpwID0gYnVmOworCQlwICs9IHNwcmludGYocCwgInJzbl9pZT0iKTsKKwkJZm9yIChpID0gMDsgaSA8IG5ldHdvcmstPnJzbl9pZV9sZW47IGkrKykgeworCQkJcCArPSBzcHJpbnRmKHAsICIlMDJ4IiwgbmV0d29yay0+cnNuX2llW2ldKTsKKwkJfQorCisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOworCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBidWYpOworCX0KKyNlbHNlCisJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwlpZiAobmV0d29yay0+d3BhX2llX2xlbikKKwl7CisJCWNoYXIgYnVmW01BWF9XUEFfSUVfTEVOXTsKKwkJbWVtY3B5KGJ1ZiwgbmV0d29yay0+d3BhX2llLCBuZXR3b3JrLT53cGFfaWVfbGVuKTsKKwkJaXdlLmNtZCA9IElXRVZHRU5JRTsKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSBuZXR3b3JrLT53cGFfaWVfbGVuOworCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBidWYpOworCX0KKwltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCWlmIChuZXR3b3JrLT5yc25faWVfbGVuKQorCXsKKwkJY2hhciBidWZbTUFYX1dQQV9JRV9MRU5dOworCQltZW1jcHkoYnVmLCBuZXR3b3JrLT5yc25faWUsIG5ldHdvcmstPnJzbl9pZV9sZW4pOworCQlpd2UuY21kID0gSVdFVkdFTklFOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IG5ldHdvcmstPnJzbl9pZV9sZW47CisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIGJ1Zik7CisJfQorI2VuZGlmCisKKworCS8qIEFkZCBFWFRSQTogQWdlIHRvIGRpc3BsYXkgc2Vjb25kcyBzaW5jZSBsYXN0IGJlYWNvbi9wcm9iZSByZXNwb25zZQorCSAqIGZvciBnaXZlbiBuZXR3b3JrLiAqLworCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworCXAgPSBjdXN0b207CisJcCArPSBzbnByaW50ZihwLCBNQVhfQ1VTVE9NX0xFTiAtIChwIC0gY3VzdG9tKSwKKwkJICAgICAgIiBMYXN0IGJlYWNvbjogJWx1bXMgYWdvIiwgKGppZmZpZXMgLSBuZXR3b3JrLT5sYXN0X3NjYW5uZWQpIC8gKEhaIC8gMTAwKSk7CisJaXdlLnUuZGF0YS5sZW5ndGggPSBwIC0gY3VzdG9tOworCWlmIChpd2UudS5kYXRhLmxlbmd0aCkKKwkgICAgc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgY3VzdG9tKTsKKworCXJldHVybiBzdGFydDsKK30KKworaW50IGllZWU4MDIxMV93eF9nZXRfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwljaGFyICpldiA9IGV4dHJhOworLy8JY2hhciAqc3RvcCA9IGV2ICsgSVdfU0NBTl9NQVhfREFUQTsKKwljaGFyICpzdG9wID0gZXYgKyB3cnF1LT5kYXRhLmxlbmd0aDsvL0lXX1NDQU5fTUFYX0RBVEE7CisJLy9jaGFyICpzdG9wID0gZXYgKyBJV19TQ0FOX01BWF9EQVRBOworCWludCBpID0gMDsKKwlpbnQgZXJyID0gMDsKKwlJRUVFODAyMTFfREVCVUdfV1goIkdldHRpbmcgc2NhblxuIik7CisJZG93bigmaWVlZS0+d3hfc2VtKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShuZXR3b3JrLCAmaWVlZS0+bmV0d29ya19saXN0LCBsaXN0KSB7CisJCWkrKzsKKwkJaWYoKHN0b3AtZXYpPDIwMCkKKwkJeworCQkJZXJyID0gLUUyQklHOworCQkJYnJlYWs7CisJCQkJCQkJCQkJCQl9CisJCWlmIChpZWVlLT5zY2FuX2FnZSA9PSAwIHx8CisJCSAgICB0aW1lX2FmdGVyKG5ldHdvcmstPmxhc3Rfc2Nhbm5lZCArIGllZWUtPnNjYW5fYWdlLCBqaWZmaWVzKSkKKwkJCWV2ID0gcnRsODE5eF90cmFuc2xhdGVfc2NhbihpZWVlLCBldiwgc3RvcCwgbmV0d29yaywgaW5mbyk7CisJCWVsc2UKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKAorCQkJCSJOb3Qgc2hvd2luZyBuZXR3b3JrICclcyAoIgorCQkJCU1BQ19GTVQgIiknIGR1ZSB0byBhZ2UgKCVsdW1zKS5cbiIsCisJCQkJZXNjYXBlX2Vzc2lkKG5ldHdvcmstPnNzaWQsCisJCQkJCSAgICAgbmV0d29yay0+c3NpZF9sZW4pLAorCQkJCU1BQ19BUkcobmV0d29yay0+YnNzaWQpLAorCQkJCShqaWZmaWVzIC0gbmV0d29yay0+bGFzdF9zY2FubmVkKSAvIChIWiAvIDEwMCkpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IGV2IC0gIGV4dHJhOworCXdycXUtPmRhdGEuZmxhZ3MgPSAwOworCisJSUVFRTgwMjExX0RFQlVHX1dYKCJleGl0OiAlZCBuZXR3b3JrcyByZXR1cm5lZC5cbiIsIGkpOworCisJcmV0dXJuIGVycjsKK30KKworaW50IGllZWU4MDIxMV93eF9zZXRfZW5jb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5YnVmKQoreworCXN0cnVjdCBpd19wb2ludCAqZXJxID0gJih3cnF1LT5lbmNvZGluZyk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYyA9IHsKKwkJLmZsYWdzID0gMAorCX07CisJaW50IGksIGtleSwga2V5X3Byb3ZpZGVkLCBsZW47CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICoqY3J5cHQ7CisKKwlJRUVFODAyMTFfREVCVUdfV1goIlNFVF9FTkNPREVcbiIpOworCisJa2V5ID0gZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKwlpZiAoa2V5KSB7CisJCWlmIChrZXkgPiBXRVBfS0VZUykKKwkJCXJldHVybiAtRUlOVkFMOworCQlrZXktLTsKKwkJa2V5X3Byb3ZpZGVkID0gMTsKKwl9IGVsc2UgeworCQlrZXlfcHJvdmlkZWQgPSAwOworCQlrZXkgPSBpZWVlLT50eF9rZXlpZHg7CisJfQorCisJSUVFRTgwMjExX0RFQlVHX1dYKCJLZXk6ICVkIFslc11cbiIsIGtleSwga2V5X3Byb3ZpZGVkID8KKwkJCSAgICJwcm92aWRlZCIgOiAiZGVmYXVsdCIpOworCWNyeXB0ID0gJmllZWUtPmNyeXB0W2tleV07CisKKwlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgeworCQlpZiAoa2V5X3Byb3ZpZGVkICYmICpjcnlwdCkgeworCQkJSUVFRTgwMjExX0RFQlVHX1dYKCJEaXNhYmxpbmcgZW5jcnlwdGlvbiBvbiBrZXkgJWQuXG4iLAorCQkJCQkgICBrZXkpOworCQkJaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KGllZWUsIGNyeXB0KTsKKwkJfSBlbHNlCisJCQlJRUVFODAyMTFfREVCVUdfV1goIkRpc2FibGluZyBlbmNyeXB0aW9uLlxuIik7CisKKwkJLyogQ2hlY2sgYWxsIHRoZSBrZXlzIHRvIHNlZSBpZiBhbnkgYXJlIHN0aWxsIGNvbmZpZ3VyZWQsCisJCSAqIGFuZCBpZiBubyBrZXkgaW5kZXggd2FzIHByb3ZpZGVkLCBkZS1pbml0IHRoZW0gYWxsICovCisJCWZvciAoaSA9IDA7IGkgPCBXRVBfS0VZUzsgaSsrKSB7CisJCQlpZiAoaWVlZS0+Y3J5cHRbaV0gIT0gTlVMTCkgeworCQkJCWlmIChrZXlfcHJvdmlkZWQpCisJCQkJCWJyZWFrOworCQkJCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdCgKKwkJCQkJaWVlZSwgJmllZWUtPmNyeXB0W2ldKTsKKwkJCX0KKwkJfQorCisJCWlmIChpID09IFdFUF9LRVlTKSB7CisJCQlzZWMuZW5hYmxlZCA9IDA7CisJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMDsKKwkJCXNlYy5mbGFncyB8PSBTRUNfRU5BQkxFRCB8IFNFQ19MRVZFTDsKKwkJfQorCisJCWdvdG8gZG9uZTsKKwl9CisKKworCisJc2VjLmVuYWJsZWQgPSAxOworCXNlYy5mbGFncyB8PSBTRUNfRU5BQkxFRDsKKworCWlmICgqY3J5cHQgIT0gTlVMTCAmJiAoKmNyeXB0KS0+b3BzICE9IE5VTEwgJiYKKwkgICAgc3RyY21wKCgqY3J5cHQpLT5vcHMtPm5hbWUsICJXRVAiKSAhPSAwKSB7CisJCS8qIGNoYW5naW5nIHRvIHVzZSBXRVA7IGRlaW5pdCBwcmV2aW91c2x5IHVzZWQgYWxnb3JpdGhtCisJCSAqIG9uIHRoaXMga2V5ICovCisJCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChpZWVlLCBjcnlwdCk7CisJfQorCisJaWYgKCpjcnlwdCA9PSBOVUxMKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqbmV3X2NyeXB0OworCisJCS8qIHRha2UgV0VQIGludG8gdXNlICovCisJCW5ld19jcnlwdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSksCisJCQkJICAgIEdGUF9LRVJORUwpOworCQlpZiAobmV3X2NyeXB0ID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJbWVtc2V0KG5ld19jcnlwdCwgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSkpOworCQluZXdfY3J5cHQtPm9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcygiV0VQIik7CisJCWlmICghbmV3X2NyeXB0LT5vcHMpIHsKKwkJCXJlcXVlc3RfbW9kdWxlKCJpZWVlODAyMTFfY3J5cHRfd2VwIik7CisJCQluZXdfY3J5cHQtPm9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcygiV0VQIik7CisJCX0KKwkJaWYgKG5ld19jcnlwdC0+b3BzICYmIHRyeV9tb2R1bGVfZ2V0KG5ld19jcnlwdC0+b3BzLT5vd25lcikpCisJCQluZXdfY3J5cHQtPnByaXYgPSBuZXdfY3J5cHQtPm9wcy0+aW5pdChrZXkpOworCisJCWlmICghbmV3X2NyeXB0LT5vcHMgfHwgIW5ld19jcnlwdC0+cHJpdikgeworCQkJa2ZyZWUobmV3X2NyeXB0KTsKKwkJCW5ld19jcnlwdCA9IE5VTEw7CisKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjb3VsZCBub3QgaW5pdGlhbGl6ZSBXRVA6ICIKKwkJCSAgICAgICAibG9hZCBtb2R1bGUgaWVlZTgwMjExX2NyeXB0X3dlcFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl9CisJCSpjcnlwdCA9IG5ld19jcnlwdDsKKwl9CisKKwkvKiBJZiBhIG5ldyBrZXkgd2FzIHByb3ZpZGVkLCBzZXQgaXQgdXAgKi8KKwlpZiAoZXJxLT5sZW5ndGggPiAwKSB7CisJCWxlbiA9IGVycS0+bGVuZ3RoIDw9IDUgPyA1IDogMTM7CisJCW1lbWNweShzZWMua2V5c1trZXldLCBrZXlidWYsIGVycS0+bGVuZ3RoKTsKKwkJaWYgKGxlbiA+IGVycS0+bGVuZ3RoKQorCQkJbWVtc2V0KHNlYy5rZXlzW2tleV0gKyBlcnEtPmxlbmd0aCwgMCwKKwkJCSAgICAgICBsZW4gLSBlcnEtPmxlbmd0aCk7CisJCUlFRUU4MDIxMV9ERUJVR19XWCgiU2V0dGluZyBrZXkgJWQgdG8gJyVzJyAoJWQ6JWQgYnl0ZXMpXG4iLAorCQkJCSAgIGtleSwgZXNjYXBlX2Vzc2lkKHNlYy5rZXlzW2tleV0sIGxlbiksCisJCQkJICAgZXJxLT5sZW5ndGgsIGxlbik7CisJCXNlYy5rZXlfc2l6ZXNba2V5XSA9IGxlbjsKKwkJKCpjcnlwdCktPm9wcy0+c2V0X2tleShzZWMua2V5c1trZXldLCBsZW4sIE5VTEwsCisJCQkJICAgICAgICgqY3J5cHQpLT5wcml2KTsKKwkJc2VjLmZsYWdzIHw9ICgxIDw8IGtleSk7CisJCS8qIFRoaXMgZW5zdXJlcyBhIGtleSB3aWxsIGJlIGFjdGl2YXRlZCBpZiBubyBrZXkgaXMKKwkJICogZXhwbGljaXRlbHkgc2V0ICovCisJCWlmIChrZXkgPT0gc2VjLmFjdGl2ZV9rZXkpCisJCQlzZWMuZmxhZ3MgfD0gU0VDX0FDVElWRV9LRVk7CisJCWllZWUtPnR4X2tleWlkeCA9IGtleTsKKworCX0gZWxzZSB7CisJCWxlbiA9ICgqY3J5cHQpLT5vcHMtPmdldF9rZXkoc2VjLmtleXNba2V5XSwgV0VQX0tFWV9MRU4sCisJCQkJCSAgICAgTlVMTCwgKCpjcnlwdCktPnByaXYpOworCQlpZiAobGVuID09IDApIHsKKwkJCS8qIFNldCBhIGRlZmF1bHQga2V5IG9mIGFsbCAwICovCisJCQlwcmludGsoIlNldHRpbmcga2V5ICVkIHRvIGFsbCB6ZXJvLlxuIiwKKwkJCQkJICAga2V5KTsKKworCQkJSUVFRTgwMjExX0RFQlVHX1dYKCJTZXR0aW5nIGtleSAlZCB0byBhbGwgemVyby5cbiIsCisJCQkJCSAgIGtleSk7CisJCQltZW1zZXQoc2VjLmtleXNba2V5XSwgMCwgMTMpOworCQkJKCpjcnlwdCktPm9wcy0+c2V0X2tleShzZWMua2V5c1trZXldLCAxMywgTlVMTCwKKwkJCQkJICAgICAgICgqY3J5cHQpLT5wcml2KTsKKwkJCXNlYy5rZXlfc2l6ZXNba2V5XSA9IDEzOworCQkJc2VjLmZsYWdzIHw9ICgxIDw8IGtleSk7CisJCX0KKworCQkvKiBObyBrZXkgZGF0YSAtIGp1c3Qgc2V0IHRoZSBkZWZhdWx0IFRYIGtleSBpbmRleCAqLworCQlpZiAoa2V5X3Byb3ZpZGVkKSB7CisJCQlJRUVFODAyMTFfREVCVUdfV1goCisJCQkJIlNldHRpbmcga2V5ICVkIHRvIGRlZmF1bHQgVHgga2V5LlxuIiwga2V5KTsKKwkJCWllZWUtPnR4X2tleWlkeCA9IGtleTsKKwkJCXNlYy5hY3RpdmVfa2V5ID0ga2V5OworCQkJc2VjLmZsYWdzIHw9IFNFQ19BQ1RJVkVfS0VZOworCQl9CisJfQorCisgZG9uZToKKwlpZWVlLT5vcGVuX3dlcCA9ICEoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKTsKKwlpZWVlLT5hdXRoX21vZGUgPSBpZWVlLT5vcGVuX3dlcCA/IFdMQU5fQVVUSF9PUEVOIDogV0xBTl9BVVRIX1NIQVJFRF9LRVk7CisJc2VjLmF1dGhfbW9kZSA9IGllZWUtPm9wZW5fd2VwID8gV0xBTl9BVVRIX09QRU4gOiBXTEFOX0FVVEhfU0hBUkVEX0tFWTsKKwlzZWMuZmxhZ3MgfD0gU0VDX0FVVEhfTU9ERTsKKwlJRUVFODAyMTFfREVCVUdfV1goIkF1dGg6ICVzXG4iLCBzZWMuYXV0aF9tb2RlID09IFdMQU5fQVVUSF9PUEVOID8KKwkJCSAgICJPUEVOIiA6ICJTSEFSRUQgS0VZIik7CisKKwkvKiBGb3Igbm93IHdlIGp1c3Qgc3VwcG9ydCBXRVAsIHNvIG9ubHkgc2V0IHRoYXQgc2VjdXJpdHkgbGV2ZWwuLi4KKwkgKiBUT0RPOiBXaGVuIFdQQSBpcyBhZGRlZCB0aGlzIGlzIG9uZSBwbGFjZSB0aGF0IG5lZWRzIHRvIGNoYW5nZSAqLworCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisJc2VjLmxldmVsID0gU0VDX0xFVkVMXzE7IC8qIDQwIGFuZCAxMDQgYml0IFdFUCAqLworCisJaWYgKGllZWUtPnNldF9zZWN1cml0eSkKKwkJaWVlZS0+c2V0X3NlY3VyaXR5KGRldiwgJnNlYyk7CisKKwkvKiBEbyBub3QgcmVzZXQgcG9ydCBpZiBjYXJkIGlzIGluIE1hbmFnZWQgbW9kZSBzaW5jZSByZXNldHRpbmcgd2lsbAorCSAqIGdlbmVyYXRlIG5ldyBJRUVFIDgwMi4xMSBhdXRoZW50aWNhdGlvbiB3aGljaCBtYXkgZW5kIHVwIGluIGxvb3BpbmcKKwkgKiB3aXRoIElFRUUgODAyLjFYLiAgSWYgeW91ciBoYXJkd2FyZSByZXF1aXJlcyBhIHJlc2V0IGFmdGVyIFdFUAorCSAqIGNvbmZpZ3VyYXRpb24gKGZvciBleGFtcGxlLi4uIFByaXNtMiksIGltcGxlbWVudCB0aGUgcmVzZXRfcG9ydCBpbgorCSAqIHRoZSBjYWxsYmFja3Mgc3RydWN0dXJlcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIDgwMi4xMSBzdGFjay4gKi8KKwlpZiAoaWVlZS0+cmVzZXRfb25fa2V5Y2hhbmdlICYmCisJICAgIGllZWUtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSAmJgorCSAgICBpZWVlLT5yZXNldF9wb3J0ICYmIGllZWUtPnJlc2V0X3BvcnQoZGV2KSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlc2V0X3BvcnQgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBpZWVlODAyMTFfd3hfZ2V0X2VuY29kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleWJ1ZikKK3sKKwlzdHJ1Y3QgaXdfcG9pbnQgKmVycSA9ICYod3JxdS0+ZW5jb2RpbmcpOworCWludCBsZW4sIGtleTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0OworCisJSUVFRTgwMjExX0RFQlVHX1dYKCJHRVRfRU5DT0RFXG4iKTsKKworCWlmKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQorCQlyZXR1cm4gLTE7CisKKwlrZXkgPSBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworCWlmIChrZXkpIHsKKwkJaWYgKGtleSA+IFdFUF9LRVlTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWtleS0tOworCX0gZWxzZQorCQlrZXkgPSBpZWVlLT50eF9rZXlpZHg7CisKKwljcnlwdCA9IGllZWUtPmNyeXB0W2tleV07CisJZXJxLT5mbGFncyA9IGtleSArIDE7CisKKwlpZiAoY3J5cHQgPT0gTlVMTCB8fCBjcnlwdC0+b3BzID09IE5VTEwpIHsKKwkJZXJxLT5sZW5ndGggPSAwOworCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwkJcmV0dXJuIDA7CisJfQorCWxlbiA9IGNyeXB0LT5vcHMtPmdldF9rZXkoa2V5YnVmLCBTQ01fS0VZX0xFTiwgTlVMTCwgY3J5cHQtPnByaXYpOworCWVycS0+bGVuZ3RoID0gKGxlbiA+PSAwID8gbGVuIDogMCk7CisKKwllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOworCisJaWYgKGllZWUtPm9wZW5fd2VwKQorCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOworCWVsc2UKKwkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsKKworCXJldHVybiAwOworfQorI2lmIChXSVJFTEVTU19FWFQgPj0gMTgpCitpbnQgaWVlZTgwMjExX3d4X3NldF9lbmNvZGVfZXh0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKwlzdHJ1Y3QgaXdfcG9pbnQgKmVuY29kaW5nID0gJndycXUtPmVuY29kaW5nOworCXN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQgPSAoc3RydWN0IGl3X2VuY29kZV9leHQgKilleHRyYTsKKwlpbnQgaSwgaWR4OworCWludCBncm91cF9rZXkgPSAwOworCWNvbnN0IGNoYXIgKmFsZywgKm1vZHVsZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wczsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdDsKKworCXN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgc2VjID0geworCQkuZmxhZ3MgPSAwLAorCX07CisJLy9wcmludGsoIj09PT09PT5lbmNvZGluZyBmbGFnOiV4LGV4dCBmbGFnOiV4LCBleHQgYWxnOiVkXG4iLCBlbmNvZGluZy0+ZmxhZ3MsZXh0LT5leHRfZmxhZ3MsIGV4dC0+YWxnKTsKKwlpZHggPSBlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJaWYgKGlkeCkgeworCQlpZiAoaWR4IDwgMSB8fCBpZHggPiBXRVBfS0VZUykKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZHgtLTsKKwl9IGVsc2UKKwkJaWR4ID0gaWVlZS0+dHhfa2V5aWR4OworCisJaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpIHsKKworCQljcnlwdCA9ICZpZWVlLT5jcnlwdFtpZHhdOworCisJCWdyb3VwX2tleSA9IDE7CisJfSBlbHNlIHsKKwkJLyogc29tZSBDaXNjbyBBUHMgdXNlIGlkeD4wIGZvciB1bmljYXN0IGluIGR5bmFtaWMgV0VQICovCisJCS8vcHJpbnRrKCJub3QgZ3JvdXAga2V5LCBmbGFnczoleCwgZXh0LT5hbGc6JWRcbiIsIGV4dC0+ZXh0X2ZsYWdzLCBleHQtPmFsZyk7CisJCWlmIChpZHggIT0gMCAmJiBleHQtPmFsZyAhPSBJV19FTkNPREVfQUxHX1dFUCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKQorCisJCQljcnlwdCA9ICZpZWVlLT5jcnlwdFtpZHhdOworCisJCWVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNlYy5mbGFncyB8PSBTRUNfRU5BQkxFRDsvLyB8IFNFQ19FTkNSWVBUOworCWlmICgoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSB8fAorCSAgICBleHQtPmFsZyA9PSBJV19FTkNPREVfQUxHX05PTkUpIHsKKwkJaWYgKCpjcnlwdCkKKwkJCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChpZWVlLCBjcnlwdCk7CisKKwkJZm9yIChpID0gMDsgaSA8IFdFUF9LRVlTOyBpKyspCisKKwkJCWlmIChpZWVlLT5jcnlwdFtpXSAhPSBOVUxMKQorCisJCQkJYnJlYWs7CisKKwkJaWYgKGkgPT0gV0VQX0tFWVMpIHsKKwkJCXNlYy5lbmFibGVkID0gMDsKKwkJICAgICAgLy8gIHNlYy5lbmNyeXB0ID0gMDsKKwkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8wOworCQkJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKwkJfQorCQkvL3ByaW50aygiZGlzYWJsZWQ6IGZsYWc6JXhcbiIsIGVuY29kaW5nLT5mbGFncyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzZWMuZW5hYmxlZCA9IDE7CisgICAgLy8gICAgc2VjLmVuY3J5cHQgPSAxOworCXN3aXRjaCAoZXh0LT5hbGcpIHsKKwljYXNlIElXX0VOQ09ERV9BTEdfV0VQOgorCQlhbGcgPSAiV0VQIjsKKwkJbW9kdWxlID0gImllZWU4MDIxMV9jcnlwdF93ZXAiOworCQlicmVhazsKKwljYXNlIElXX0VOQ09ERV9BTEdfVEtJUDoKKwkJYWxnID0gIlRLSVAiOworCQltb2R1bGUgPSAiaWVlZTgwMjExX2NyeXB0X3RraXAiOworCQlicmVhazsKKwljYXNlIElXX0VOQ09ERV9BTEdfQ0NNUDoKKwkJYWxnID0gIkNDTVAiOworCQltb2R1bGUgPSAiaWVlZTgwMjExX2NyeXB0X2NjbXAiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJRUVFODAyMTFfREVCVUdfV1goIiVzOiB1bmtub3duIGNyeXB0byBhbGcgJWRcbiIsCisJCQkJICAgZGV2LT5uYW1lLCBleHQtPmFsZyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisJcHJpbnRrKCJhbGcgbmFtZTolc1xuIixhbGcpOworCisJIG9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhhbGcpOworCWlmIChvcHMgPT0gTlVMTCkgeworCQlyZXF1ZXN0X21vZHVsZShtb2R1bGUpOworCQlvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoYWxnKTsKKwl9CisJaWYgKG9wcyA9PSBOVUxMKSB7CisJCUlFRUU4MDIxMV9ERUJVR19XWCgiJXM6IHVua25vd24gY3J5cHRvIGFsZyAlZFxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIGV4dC0+YWxnKTsKKwkJcHJpbnRrKCI9PT09PT09PT51bmtub3duIGNyeXB0byBhbGcgJWRcbiIsIGV4dC0+YWxnKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmICgqY3J5cHQgPT0gTlVMTCB8fCAoKmNyeXB0KS0+b3BzICE9IG9wcykgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKm5ld19jcnlwdDsKKworCQlpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoaWVlZSwgY3J5cHQpOworCisJCW5ld19jcnlwdCA9IGt6YWxsb2Moc2l6ZW9mKCpuZXdfY3J5cHQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKG5ld19jcnlwdCA9PSBOVUxMKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBkb25lOworCQl9CisJCW5ld19jcnlwdC0+b3BzID0gb3BzOworCQlpZiAobmV3X2NyeXB0LT5vcHMgJiYgdHJ5X21vZHVsZV9nZXQobmV3X2NyeXB0LT5vcHMtPm93bmVyKSkKKwkJCW5ld19jcnlwdC0+cHJpdiA9IG5ld19jcnlwdC0+b3BzLT5pbml0KGlkeCk7CisJCWlmIChuZXdfY3J5cHQtPnByaXYgPT0gTlVMTCkgeworCQkJa2ZyZWUobmV3X2NyeXB0KTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJKmNyeXB0ID0gbmV3X2NyeXB0OworCisJfQorCisJaWYgKGV4dC0+a2V5X2xlbiA+IDAgJiYgKCpjcnlwdCktPm9wcy0+c2V0X2tleSAmJgorCSAgICAoKmNyeXB0KS0+b3BzLT5zZXRfa2V5KGV4dC0+a2V5LCBleHQtPmtleV9sZW4sIGV4dC0+cnhfc2VxLAorCQkJCSAgICgqY3J5cHQpLT5wcml2KSA8IDApIHsKKwkJSUVFRTgwMjExX0RFQlVHX1dYKCIlczoga2V5IHNldHRpbmcgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOworCQlwcmludGsoImtleSBzZXR0aW5nIGZhaWxlZFxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisgLy9za2lwX2hvc3RfY3J5cHQ6CisJLy9wcmludGsoInNraXBfaG9zdF9jcnlwdDpleHRfZmxhZ3M6JXhcbiIsIGV4dC0+ZXh0X2ZsYWdzKTsKKwlpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpIHsKKwkJaWVlZS0+dHhfa2V5aWR4ID0gaWR4OworCQlzZWMuYWN0aXZlX2tleSA9IGlkeDsKKwkJc2VjLmZsYWdzIHw9IFNFQ19BQ1RJVkVfS0VZOworCX0KKworCWlmIChleHQtPmFsZyAhPSBJV19FTkNPREVfQUxHX05PTkUpIHsKKwkJLy9tZW1jcHkoc2VjLmtleXNbaWR4XSwgZXh0LT5rZXksIGV4dC0+a2V5X2xlbik7CisJCXNlYy5rZXlfc2l6ZXNbaWR4XSA9IGV4dC0+a2V5X2xlbjsKKwkJc2VjLmZsYWdzIHw9ICgxIDw8IGlkeCk7CisJCWlmIChleHQtPmFsZyA9PSBJV19FTkNPREVfQUxHX1dFUCkgeworCQkgICAgICAvLyAgc2VjLmVuY29kZV9hbGdbaWR4XSA9IFNFQ19BTEdfV0VQOworCQkJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKwkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8xOworCQl9IGVsc2UgaWYgKGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfVEtJUCkgeworCQkgICAgICAvLyAgc2VjLmVuY29kZV9hbGdbaWR4XSA9IFNFQ19BTEdfVEtJUDsKKwkJCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMjsKKwkJfSBlbHNlIGlmIChleHQtPmFsZyA9PSBJV19FTkNPREVfQUxHX0NDTVApIHsKKwkJICAgICAgIC8vIHNlYy5lbmNvZGVfYWxnW2lkeF0gPSBTRUNfQUxHX0NDTVA7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOworCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzM7CisJCX0KKwkJLyogRG9uJ3Qgc2V0IHNlYyBsZXZlbCBmb3IgZ3JvdXAga2V5cy4gKi8KKwkJaWYgKGdyb3VwX2tleSkKKwkJCXNlYy5mbGFncyAmPSB+U0VDX0xFVkVMOworCX0KK2RvbmU6CisJaWYgKGllZWUtPnNldF9zZWN1cml0eSkKKwkJaWVlZS0+c2V0X3NlY3VyaXR5KGllZWUtPmRldiwgJnNlYyk7CisKKwkgaWYgKGllZWUtPnJlc2V0X29uX2tleWNoYW5nZSAmJgorCSAgICBpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEgJiYKKwkgICAgaWVlZS0+cmVzZXRfcG9ydCAmJiBpZWVlLT5yZXNldF9wb3J0KGRldikpIHsKKwkJSUVFRTgwMjExX0RFQlVHX1dYKCIlczogcmVzZXRfcG9ydCBmYWlsZWRcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgaWVlZTgwMjExX3d4X2dldF9lbmNvZGVfZXh0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKKwlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdDsKKwlpbnQgaWR4LCBtYXhfa2V5X2xlbjsKKworCW1heF9rZXlfbGVuID0gZW5jb2RpbmctPmxlbmd0aCAtIHNpemVvZigqZXh0KTsKKwlpZiAobWF4X2tleV9sZW4gPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlkeCA9IGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKwlpZiAoaWR4KSB7CisJCWlmIChpZHggPCAxIHx8IGlkeCA+IFdFUF9LRVlTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlkeC0tOworCX0gZWxzZQorCQlpZHggPSBpZWVlLT50eF9rZXlpZHg7CisKKwlpZiAoIWV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkgJiYKKwkgICAgZXh0LT5hbGcgIT0gSVdfRU5DT0RFX0FMR19XRVApCisJCWlmIChpZHggIT0gMCB8fCBpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWR4XTsKKwllbmNvZGluZy0+ZmxhZ3MgPSBpZHggKyAxOworCW1lbXNldChleHQsIDAsIHNpemVvZigqZXh0KSk7CisKKwlpZiAoY3J5cHQgPT0gTlVMTCB8fCBjcnlwdC0+b3BzID09IE5VTEwgKSB7CisJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19OT05FOworCQlleHQtPmtleV9sZW4gPSAwOworCQllbmNvZGluZy0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0RJU0FCTEVEOworCX0gZWxzZSB7CisJCWlmIChzdHJjbXAoY3J5cHQtPm9wcy0+bmFtZSwgIldFUCIpID09IDAgKQorCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX1dFUDsKKwkJZWxzZSBpZiAoc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsICJUS0lQIikpCisJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfVEtJUDsKKwkJZWxzZSBpZiAoc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsICJDQ01QIikpCisJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfQ0NNUDsKKwkJZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWV4dC0+a2V5X2xlbiA9IGNyeXB0LT5vcHMtPmdldF9rZXkoZXh0LT5rZXksIFNDTV9LRVlfTEVOLCBOVUxMLCBjcnlwdC0+cHJpdik7CisJCWVuY29kaW5nLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsKKwkJaWYgKGV4dC0+a2V5X2xlbiAmJgorCQkgICAgKGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfVEtJUCB8fAorCQkgICAgIGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfQ0NNUCkpCisJCQlleHQtPmV4dF9mbGFncyB8PSBJV19FTkNPREVfRVhUX1RYX1NFUV9WQUxJRDsKKworCX0KKworCXJldHVybiAwOworfQorCitpbnQgaWVlZTgwMjExX3d4X3NldF9tbG1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGl3X21sbWUgKm1sbWUgPSAoc3RydWN0IGl3X21sbWUgKikgZXh0cmE7CisJc3dpdGNoIChtbG1lLT5jbWQpIHsKKwljYXNlIElXX01MTUVfREVBVVRIOgorCWNhc2UgSVdfTUxNRV9ESVNBU1NPQzoKKwkJaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZShpZWVlKTsKKwkJYnJlYWs7CisJIGRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBpZWVlODAyMTFfd3hfc2V0X2F1dGgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCXN3aXRjaCAoZGF0YS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7CisJY2FzZSBJV19BVVRIX1dQQV9WRVJTSU9OOgorCSAgICAgLypuZWVkIHRvIHN1cHBvcnQgd3BhMiBoZXJlKi8KKwkJLy9wcmludGsoIndwYSB2ZXJzaW9uOiV4XG4iLCBkYXRhLT52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgSVdfQVVUSF9DSVBIRVJfUEFJUldJU0U6CisJY2FzZSBJV19BVVRIX0NJUEhFUl9HUk9VUDoKKwljYXNlIElXX0FVVEhfS0VZX01HTVQ6CisJCS8qCisgKiAgICAgICAgICAgICAgICAgICogSG9zdCBBUCBkcml2ZXIgZG9lcyBub3QgdXNlIHRoZXNlIHBhcmFtZXRlcnMgYW5kIGFsbG93cworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd3BhX3N1cHBsaWNhbnQgdG8gY29udHJvbCB0aGVtIGludGVybmFsbHkuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQlicmVhazsKKwljYXNlIElXX0FVVEhfVEtJUF9DT1VOVEVSTUVBU1VSRVM6CisJCWllZWUtPnRraXBfY291bnRlcm1lYXN1cmVzID0gZGF0YS0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgorCQlpZWVlLT5kcm9wX3VuZW5jcnlwdGVkID0gZGF0YS0+dmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgorCQkvL3ByaW50aygiPT09PT09PiVzKCk6ZGF0YS0+dmFsdWUgaXMgJWRcbiIsX19GVU5DVElPTl9fLGRhdGEtPnZhbHVlKTsKKwkvLwlpZWVlLT5vcGVuX3dlcCA9IChkYXRhLT52YWx1ZSZJV19BVVRIX0FMR19PUEVOX1NZU1RFTSk/MTowOworCQlpZihkYXRhLT52YWx1ZSAmIElXX0FVVEhfQUxHX1NIQVJFRF9LRVkpeworCQkJaWVlZS0+b3Blbl93ZXAgPSAwOworCQkJaWVlZS0+YXV0aF9tb2RlID0gMTsKKwkJfQorCQllbHNlIGlmKGRhdGEtPnZhbHVlICYgSVdfQVVUSF9BTEdfT1BFTl9TWVNURU0peworCQkJaWVlZS0+b3Blbl93ZXAgPSAxOworCQkJaWVlZS0+YXV0aF9tb2RlID0gMDsKKwkJfQorCQllbHNlIGlmKGRhdGEtPnZhbHVlICYgSVdfQVVUSF9BTEdfTEVBUCl7CisJCQlpZWVlLT5vcGVuX3dlcCA9IDE7CisJCQlpZWVlLT5hdXRoX21vZGUgPSAyOworCQkJLy9wcmludGsoImhhaGFoYWE6TEVBUFxuIik7CisJCX0KKwkJZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCS8vcHJpbnRrKCJvcGVuX3dlcDolZFxuIiwgaWVlZS0+b3Blbl93ZXApOworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKKwkJaWVlZS0+d3BhX2VuYWJsZWQgPSAoZGF0YS0+dmFsdWUpPzE6MDsKKwkJLy9wcmludGsoImVuYWxiZSB3cGE6JWRcbiIsIGllZWUtPndwYV9lbmFibGVkKTsKKwkJYnJlYWs7CisKKwljYXNlIElXX0FVVEhfUlhfVU5FTkNSWVBURURfRUFQT0w6CisJCWllZWUtPmllZWU4MDJfMXggPSBkYXRhLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRDoKKwkJaWVlZS0+cHJpdmFjeV9pbnZva2VkID0gZGF0YS0+dmFsdWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKK2ludCBpZWVlODAyMTFfd3hfc2V0X2dlbl9pZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmllLCBzaXplX3QgbGVuKQoreworCXU4ICpidWY7CisKKwlpZiAobGVuPk1BWF9XUEFfSUVfTEVOIHx8IChsZW4gJiYgaWUgPT0gTlVMTCkpCisJeworCS8vCXByaW50aygicmV0dXJuIGVycm9yIG91dCwgbGVuOiVkXG4iLCBsZW4pOworCXJldHVybiAtRUlOVkFMOworCX0KKworCisJaWYgKGxlbikKKwl7CisJCWlmIChsZW4gIT0gaWVbMV0rMikKKwkJeworCQkJcHJpbnRrKCJsZW46JWQsIGllOiVkXG4iLCBsZW4sIGllWzFdKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJ1ZiA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCW1lbWNweShidWYsIGllLCBsZW4pOworCQlrZnJlZShpZWVlLT53cGFfaWUpOworCQlpZWVlLT53cGFfaWUgPSBidWY7CisJCWllZWUtPndwYV9pZV9sZW4gPSBsZW47CisJfQorCWVsc2V7CisJCWlmIChpZWVlLT53cGFfaWUpCisJCWtmcmVlKGllZWUtPndwYV9pZSk7CisJCWllZWUtPndwYV9pZSA9IE5VTEw7CisJCWllZWUtPndwYV9pZV9sZW4gPSAwOworCX0KKwlyZXR1cm4gMDsKKworfQorCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfZ2VuX2llKTsKKyNpZiAoV0lSRUxFU1NfRVhUID49IDE4KQorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X21sbWUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X2F1dGgpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9leHQpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfZ2V0X2VuY29kZV9leHQpOworI2VuZGlmCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9nZXRfc2Nhbik7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfZW5jb2RlKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF9lbmNvZGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YzA5NmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2ludGVybmFsLmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENyeXB0b2dyYXBoaWMgQVBJLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworI2lmbmRlZiBfQ1JZUFRPX0lOVEVSTkFMX0gKKyNkZWZpbmUgX0NSWVBUT19JTlRFUk5BTF9ICisKKworLy8jaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSAicnRsX2NyeXB0by5oIgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vaGFyZGlycS5oPgorI2luY2x1ZGUgPGFzbS9zb2Z0aXJxLmg+CisjaW5jbHVkZSA8YXNtL2ttYXBfdHlwZXMuaD4KKworCitleHRlcm4gZW51bSBrbV90eXBlIGNyeXB0b19rbV90eXBlc1tdOworCitzdGF0aWMgaW5saW5lIGVudW0ga21fdHlwZSBjcnlwdG9fa21hcF90eXBlKGludCBvdXQpCit7CisJcmV0dXJuIGNyeXB0b19rbV90eXBlc1soaW5fc29mdGlycSgpID8gMiA6IDApICsgb3V0XTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpjcnlwdG9fa21hcChzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG91dCkKK3sKKwlyZXR1cm4ga21hcF9hdG9taWMocGFnZSwgY3J5cHRvX2ttYXBfdHlwZShvdXQpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19rdW5tYXAodm9pZCAqdmFkZHIsIGludCBvdXQpCit7CisJa3VubWFwX2F0b21pYyh2YWRkciwgY3J5cHRvX2ttYXBfdHlwZShvdXQpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b195aWVsZChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCWlmICghaW5fc29mdGlycSgpKQorCQljb25kX3Jlc2NoZWQoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpjcnlwdG9fdGZtX2N0eChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXJldHVybiAodm9pZCAqKSZ0Zm1bMV07Cit9CisKK3N0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fYWxnX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKTsKKworI2lmZGVmIENPTkZJR19LTU9ECit2b2lkIGNyeXB0b19hbGdfYXV0b2xvYWQoY29uc3QgY2hhciAqbmFtZSk7CitzdHJ1Y3QgY3J5cHRvX2FsZyAqY3J5cHRvX2FsZ19tb2RfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b19hbGcgKmNyeXB0b19hbGdfbW9kX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiBjcnlwdG9fYWxnX2xvb2t1cChuYW1lKTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NSWVBUT19ITUFDCitpbnQgY3J5cHRvX2FsbG9jX2htYWNfYmxvY2soc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7Cit2b2lkIGNyeXB0b19mcmVlX2htYWNfYmxvY2soc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2FsbG9jX2htYWNfYmxvY2soc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19mcmVlX2htYWNfYmxvY2soc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sgfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUwordm9pZCBfX2luaXQgY3J5cHRvX2luaXRfcHJvYyh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2luaXRfcHJvYyh2b2lkKQoreyB9CisjZW5kaWYKKworaW50IGNyeXB0b19pbml0X2RpZ2VzdF9mbGFncyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1MzIgZmxhZ3MpOworaW50IGNyeXB0b19pbml0X2NpcGhlcl9mbGFncyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1MzIgZmxhZ3MpOworaW50IGNyeXB0b19pbml0X2NvbXByZXNzX2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncyk7CisKK2ludCBjcnlwdG9faW5pdF9kaWdlc3Rfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOworaW50IGNyeXB0b19pbml0X2NpcGhlcl9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7CitpbnQgY3J5cHRvX2luaXRfY29tcHJlc3Nfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOworCit2b2lkIGNyeXB0b19leGl0X2RpZ2VzdF9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7Cit2b2lkIGNyeXB0b19leGl0X2NpcGhlcl9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7Cit2b2lkIGNyeXB0b19leGl0X2NvbXByZXNzX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKKworI2VuZGlmCS8qIF9DUllQVE9fSU5URVJOQUxfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2ttYXBfdHlwZXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEva21hcF90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNjdiYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2ttYXBfdHlwZXMuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIF9fS01BUF9UWVBFU19ICisKKyNkZWZpbmUgX19LTUFQX1RZUEVTX0gKKworCitlbnVtIGttX3R5cGUgeworCUtNX0JPVU5DRV9SRUFELAorCUtNX1NLQl9TVU5SUENfREFUQSwKKwlLTV9TS0JfREFUQV9TT0ZUSVJRLAorCUtNX1VTRVIwLAorCUtNX1VTRVIxLAorCUtNX0JIX0lSUSwKKwlLTV9TT0ZUSVJRMCwKKwlLTV9TT0ZUSVJRMSwKKwlLTV9UWVBFX05SCit9OworCisjZGVmaW5lIF9BU01fS01BUF9UWVBFU19ICisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9taWNoYWVsX21pYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9taWNoYWVsX21pYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMjU2ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL21pY2hhZWxfbWljLmMKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBDcnlwdG9ncmFwaGljIEFQSQorICoKKyAqIE1pY2hhZWwgTUlDIChJRUVFIDgwMi4xMWkvVEtJUCkga2V5ZWQgZGlnZXN0CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0IEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisvLyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlICJydGxfY3J5cHRvLmgiCisKKworc3RydWN0IG1pY2hhZWxfbWljX2N0eCB7CisJdTggcGVuZGluZ1s0XTsKKwlzaXplX3QgcGVuZGluZ19sZW47CisKKwl1MzIgbCwgcjsKK307CisKKworc3RhdGljIGlubGluZSB1MzIgcm90bCh1MzIgdmFsLCBpbnQgYml0cykKK3sKKwlyZXR1cm4gKHZhbCA8PCBiaXRzKSB8ICh2YWwgPj4gKDMyIC0gYml0cykpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdTMyIHJvdHIodTMyIHZhbCwgaW50IGJpdHMpCit7CisJcmV0dXJuICh2YWwgPj4gYml0cykgfCAodmFsIDw8ICgzMiAtIGJpdHMpKTsKK30KKworCitzdGF0aWMgaW5saW5lIHUzMiB4c3dhcCh1MzIgdmFsKQoreworCXJldHVybiAoKHZhbCAmIDB4MDBmZjAwZmYpIDw8IDgpIHwgKCh2YWwgJiAweGZmMDBmZjAwKSA+PiA4KTsKK30KKworCisjZGVmaW5lIG1pY2hhZWxfYmxvY2sobCwgcikJXAorZG8gewkJCQlcCisJciBePSByb3RsKGwsIDE3KTsJXAorCWwgKz0gcjsJCQlcCisJciBePSB4c3dhcChsKTsJCVwKKwlsICs9IHI7CQkJXAorCXIgXj0gcm90bChsLCAzKTsJXAorCWwgKz0gcjsJCQlcCisJciBePSByb3RyKGwsIDIpOwlcCisJbCArPSByOwkJCVwKK30gd2hpbGUgKDApCisKKworc3RhdGljIGlubGluZSB1MzIgZ2V0X2xlMzIoY29uc3QgdTggKnApCit7CisJcmV0dXJuIHBbMF0gfCAocFsxXSA8PCA4KSB8IChwWzJdIDw8IDE2KSB8IChwWzNdIDw8IDI0KTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X2xlMzIodTggKnAsIHUzMiB2KQoreworCXBbMF0gPSB2OworCXBbMV0gPSB2ID4+IDg7CisJcFsyXSA9IHYgPj4gMTY7CisJcFszXSA9IHYgPj4gMjQ7Cit9CisKKworc3RhdGljIHZvaWQgbWljaGFlbF9pbml0KHZvaWQgKmN0eCkKK3sKKwlzdHJ1Y3QgbWljaGFlbF9taWNfY3R4ICptY3R4ID0gY3R4OworCW1jdHgtPnBlbmRpbmdfbGVuID0gMDsKK30KKworCitzdGF0aWMgdm9pZCBtaWNoYWVsX3VwZGF0ZSh2b2lkICpjdHgsIGNvbnN0IHU4ICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXN0cnVjdCBtaWNoYWVsX21pY19jdHggKm1jdHggPSBjdHg7CisKKwlpZiAobWN0eC0+cGVuZGluZ19sZW4pIHsKKwkJaW50IGZsZW4gPSA0IC0gbWN0eC0+cGVuZGluZ19sZW47CisJCWlmIChmbGVuID4gbGVuKQorCQkJZmxlbiA9IGxlbjsKKwkJbWVtY3B5KCZtY3R4LT5wZW5kaW5nW21jdHgtPnBlbmRpbmdfbGVuXSwgZGF0YSwgZmxlbik7CisJCW1jdHgtPnBlbmRpbmdfbGVuICs9IGZsZW47CisJCWRhdGEgKz0gZmxlbjsKKwkJbGVuIC09IGZsZW47CisKKwkJaWYgKG1jdHgtPnBlbmRpbmdfbGVuIDwgNCkKKwkJCXJldHVybjsKKworCQltY3R4LT5sIF49IGdldF9sZTMyKG1jdHgtPnBlbmRpbmcpOworCQltaWNoYWVsX2Jsb2NrKG1jdHgtPmwsIG1jdHgtPnIpOworCQltY3R4LT5wZW5kaW5nX2xlbiA9IDA7CisJfQorCisJd2hpbGUgKGxlbiA+PSA0KSB7CisJCW1jdHgtPmwgXj0gZ2V0X2xlMzIoZGF0YSk7CisJCW1pY2hhZWxfYmxvY2sobWN0eC0+bCwgbWN0eC0+cik7CisJCWRhdGEgKz0gNDsKKwkJbGVuIC09IDQ7CisJfQorCisJaWYgKGxlbiA+IDApIHsKKwkJbWN0eC0+cGVuZGluZ19sZW4gPSBsZW47CisJCW1lbWNweShtY3R4LT5wZW5kaW5nLCBkYXRhLCBsZW4pOworCX0KK30KKworCitzdGF0aWMgdm9pZCBtaWNoYWVsX2ZpbmFsKHZvaWQgKmN0eCwgdTggKm91dCkKK3sKKwlzdHJ1Y3QgbWljaGFlbF9taWNfY3R4ICptY3R4ID0gY3R4OworCXU4ICpkYXRhID0gbWN0eC0+cGVuZGluZzsKKworCS8qIExhc3QgYmxvY2sgYW5kIHBhZGRpbmcgKDB4NWEsIDQuLjcgeCAwKSAqLworCXN3aXRjaCAobWN0eC0+cGVuZGluZ19sZW4pIHsKKwljYXNlIDA6CisJCW1jdHgtPmwgXj0gMHg1YTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQltY3R4LT5sIF49IGRhdGFbMF0gfCAweDVhMDA7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJbWN0eC0+bCBePSBkYXRhWzBdIHwgKGRhdGFbMV0gPDwgOCkgfCAweDVhMDAwMDsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQltY3R4LT5sIF49IGRhdGFbMF0gfCAoZGF0YVsxXSA8PCA4KSB8IChkYXRhWzJdIDw8IDE2KSB8CisJCQkweDVhMDAwMDAwOworCQlicmVhazsKKwl9CisJbWljaGFlbF9ibG9jayhtY3R4LT5sLCBtY3R4LT5yKTsKKwkvKiBsIF49IDA7ICovCisJbWljaGFlbF9ibG9jayhtY3R4LT5sLCBtY3R4LT5yKTsKKworCXB1dF9sZTMyKG91dCwgbWN0eC0+bCk7CisJcHV0X2xlMzIob3V0ICsgNCwgbWN0eC0+cik7Cit9CisKKworc3RhdGljIGludCBtaWNoYWVsX3NldGtleSh2b2lkICpjdHgsIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4sCisJCQkgIHUzMiAqZmxhZ3MpCit7CisJc3RydWN0IG1pY2hhZWxfbWljX2N0eCAqbWN0eCA9IGN0eDsKKwlpZiAoa2V5bGVuICE9IDgpIHsKKwkJaWYgKGZsYWdzKQorCQkJKmZsYWdzID0gQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9MRU47CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltY3R4LT5sID0gZ2V0X2xlMzIoa2V5KTsKKwltY3R4LT5yID0gZ2V0X2xlMzIoa2V5ICsgNCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIG1pY2hhZWxfbWljX2FsZyA9IHsKKwkuY3JhX25hbWUJPSAibWljaGFlbF9taWMiLAorCS5jcmFfZmxhZ3MJPSBDUllQVE9fQUxHX1RZUEVfRElHRVNULAorCS5jcmFfYmxvY2tzaXplCT0gOCwKKwkuY3JhX2N0eHNpemUJPSBzaXplb2Yoc3RydWN0IG1pY2hhZWxfbWljX2N0eCksCisJLmNyYV9tb2R1bGUJPSBUSElTX01PRFVMRSwKKwkuY3JhX2xpc3QJPSBMSVNUX0hFQURfSU5JVChtaWNoYWVsX21pY19hbGcuY3JhX2xpc3QpLAorCS5jcmFfdQkJPSB7IC5kaWdlc3QgPSB7CisJLmRpYV9kaWdlc3RzaXplCT0gOCwKKwkuZGlhX2luaXQJPSBtaWNoYWVsX2luaXQsCisJLmRpYV91cGRhdGUJPSBtaWNoYWVsX3VwZGF0ZSwKKwkuZGlhX2ZpbmFsCT0gbWljaGFlbF9maW5hbCwKKwkuZGlhX3NldGtleQk9IG1pY2hhZWxfc2V0a2V5IH0gfQorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBtaWNoYWVsX21pY19pbml0KHZvaWQpCit7CisJcmV0dXJuIGNyeXB0b19yZWdpc3Rlcl9hbGcoJm1pY2hhZWxfbWljX2FsZyk7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IG1pY2hhZWxfbWljX2V4aXQodm9pZCkKK3sKKwljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJm1pY2hhZWxfbWljX2FsZyk7Cit9CisKKworbW9kdWxlX2luaXQobWljaGFlbF9taWNfaW5pdCk7Cittb2R1bGVfZXhpdChtaWNoYWVsX21pY19leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNaWNoYWVsIE1JQyIpOworTU9EVUxFX0FVVEhPUigiSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9wcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3Byb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWRhOTI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9wcm9jLmMKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBTY2F0dGVybGlzdCBDcnlwdG9ncmFwaGljIEFQSS4KKyAqCisgKiBQcm9jZnMgaW5mb3JtYXRpb24uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorLy8jaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSAicnRsX2NyeXB0by5oIgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgY3J5cHRvX2FsZ19saXN0OworZXh0ZXJuIHN0cnVjdCByd19zZW1hcGhvcmUgY3J5cHRvX2FsZ19zZW07CisKK3N0YXRpYyB2b2lkICpjX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqdjsKKwlsb2ZmX3QgbiA9ICpwb3M7CisKKwlkb3duX3JlYWQoJmNyeXB0b19hbGdfc2VtKTsKKwlsaXN0X2Zvcl9lYWNoKHYsICZjcnlwdG9fYWxnX2xpc3QpCisJCWlmICghbi0tKQorCQkJcmV0dXJuIGxpc3RfZW50cnkodiwgc3RydWN0IGNyeXB0b19hbGcsIGNyYV9saXN0KTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKmNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnAsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnYgPSBwOworCisJKCpwb3MpKys7CisJdiA9IHYtPm5leHQ7CisJcmV0dXJuICh2ID09ICZjcnlwdG9fYWxnX2xpc3QpID8KKwkJTlVMTCA6IGxpc3RfZW50cnkodiwgc3RydWN0IGNyeXB0b19hbGcsIGNyYV9saXN0KTsKK30KKworc3RhdGljIHZvaWQgY19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCkKK3sKKwl1cF9yZWFkKCZjcnlwdG9fYWxnX3NlbSk7Cit9CisKK3N0YXRpYyBpbnQgY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnID0gKHN0cnVjdCBjcnlwdG9fYWxnICopcDsKKworCXNlcV9wcmludGYobSwgIm5hbWUgICAgICAgICA6ICVzXG4iLCBhbGctPmNyYV9uYW1lKTsKKwlzZXFfcHJpbnRmKG0sICJtb2R1bGUgICAgICAgOiAlc1xuIiwKKwkJICAgKGFsZy0+Y3JhX21vZHVsZSA/CisJCSAgICBhbGctPmNyYV9tb2R1bGUtPm5hbWUgOgorCQkgICAgImtlcm5lbCIpKTsKKworCXN3aXRjaCAoYWxnLT5jcmFfZmxhZ3MgJiBDUllQVE9fQUxHX1RZUEVfTUFTSykgeworCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0NJUEhFUjoKKwkJc2VxX3ByaW50ZihtLCAidHlwZSAgICAgICAgIDogY2lwaGVyXG4iKTsKKwkJc2VxX3ByaW50ZihtLCAiYmxvY2tzaXplICAgIDogJXVcbiIsIGFsZy0+Y3JhX2Jsb2Nrc2l6ZSk7CisJCXNlcV9wcmludGYobSwgIm1pbiBrZXlzaXplICA6ICV1XG4iLAorCQkJCQlhbGctPmNyYV9jaXBoZXIuY2lhX21pbl9rZXlzaXplKTsKKwkJc2VxX3ByaW50ZihtLCAibWF4IGtleXNpemUgIDogJXVcbiIsCisJCQkJCWFsZy0+Y3JhX2NpcGhlci5jaWFfbWF4X2tleXNpemUpOworCQlicmVhazsKKworCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0RJR0VTVDoKKwkJc2VxX3ByaW50ZihtLCAidHlwZSAgICAgICAgIDogZGlnZXN0XG4iKTsKKwkJc2VxX3ByaW50ZihtLCAiYmxvY2tzaXplICAgIDogJXVcbiIsIGFsZy0+Y3JhX2Jsb2Nrc2l6ZSk7CisJCXNlcV9wcmludGYobSwgImRpZ2VzdHNpemUgICA6ICV1XG4iLAorCQkJICAgYWxnLT5jcmFfZGlnZXN0LmRpYV9kaWdlc3RzaXplKTsKKwkJYnJlYWs7CisJY2FzZSBDUllQVE9fQUxHX1RZUEVfQ09NUFJFU1M6CisJCXNlcV9wcmludGYobSwgInR5cGUgICAgICAgICA6IGNvbXByZXNzaW9uXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2VxX3ByaW50ZihtLCAidHlwZSAgICAgICAgIDogdW5rbm93blxuIik7CisJCWJyZWFrOworCX0KKworCXNlcV9wdXRjKG0sICdcbicpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGNyeXB0b19zZXFfb3BzID0geworCS5zdGFydAkJPSBjX3N0YXJ0LAorCS5uZXh0CQk9IGNfbmV4dCwKKwkuc3RvcAkJPSBjX3N0b3AsCisJLnNob3cJCT0gY19zaG93Cit9OworCitzdGF0aWMgaW50IGNyeXB0b19pbmZvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZjcnlwdG9fc2VxX29wcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfY3J5cHRvX29wcyA9IHsKKwkub3BlbgkJPSBjcnlwdG9faW5mb19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UKK307CisKK3ZvaWQgX19pbml0IGNyeXB0b19pbml0X3Byb2Modm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2M7CisKKwlwcm9jID0gY3JlYXRlX3Byb2NfZW50cnkoImNyeXB0byIsIDAsIE5VTEwpOworCWlmIChwcm9jKQorCQlwcm9jLT5wcm9jX2ZvcHMgPSAmcHJvY19jcnlwdG9fb3BzOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0JBLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfQkEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGRjOGJmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9CQS5oCkBAIC0wLDAgKzEsNjkgQEAKKyNpZm5kZWYgX0JBVFlQRV9IXworI2RlZmluZSBfQkFUWVBFX0hfCisKKyNkZWZpbmUgCVRPVEFMX1RYQkFfTlVNCTE2CisjZGVmaW5lCVRPVEFMX1JYQkFfTlVNCTE2CisKKyNkZWZpbmUJQkFfU0VUVVBfVElNRU9VVAkyMDAKKyNkZWZpbmUJQkFfSU5BQ1RfVElNRU9VVAk2MDAwMAorCisjZGVmaW5lCUJBX1BPTElDWV9ERUxBWUVECQkwCisjZGVmaW5lCUJBX1BPTElDWV9JTU1FRElBVEUJMQorCisjZGVmaW5lCUFEREJBX1NUQVRVU19TVUNDRVNTCQkJMAorI2RlZmluZQlBRERCQV9TVEFUVVNfUkVGVVNFRAkJMzcKKyNkZWZpbmUJQUREQkFfU1RBVFVTX0lOVkFMSURfUEFSQU0JMzgKKworI2RlZmluZQlERUxCQV9SRUFTT05fUVNUQV9MRUFWSU5HCTM2CisjZGVmaW5lCURFTEJBX1JFQVNPTl9FTkRfQkEJCQkzNworI2RlZmluZQlERUxCQV9SRUFTT05fVU5LTk9XTl9CQQkzOAorI2RlZmluZQlERUxCQV9SRUFTT05fVElNRU9VVAkJCTM5CisvKiAgd2hldGhlciBuZWVkIGRlZmluZSBCQSBBY3Rpb24gZnJhbWVzIGhlcmU/CitzdHJ1Y3QgaWVlZTgwMjExX0FEREJBX1JlcXsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hlYWRlcl9kYXRhIGhlYWRlcjsKKwl1OAljYXRlZ29yeTsKKwl1OAorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisqLworLy9JcyB0aGlzIG5lZWQ/SSBwdXQgaGVyZSBqdXN0IHRvIG1ha2UgaXQgZWFzaWVyIHRvIGRlZmluZSBzdHJ1Y3R1cmUgQkFfUkVDT1JEIC8vV0IKK3R5cGVkZWYgdW5pb24gX1NFUVVFTkNFX0NPTlRST0x7CisJdTE2IFNob3J0RGF0YTsKKwlzdHJ1Y3QKKwl7CisJCXUxNglGcmFnTnVtOjQ7CisJCXUxNglTZXFOdW06MTI7CisJfWZpZWxkOworfVNFUVVFTkNFX0NPTlRST0wsICpQU0VRVUVOQ0VfQ09OVFJPTDsKKwordHlwZWRlZiB1bmlvbiBfQkFfUEFSQU1fU0VUIHsKKwl1OCBjaGFyRGF0YVsyXTsKKwl1MTYgc2hvcnREYXRhOworCXN0cnVjdCB7CisJCXUxNiBBTVNEVV9TdXBwb3J0OjE7CisJCXUxNiBCQVBvbGljeToxOworCQl1MTYgVElEOjQ7CisJCXUxNiBCdWZmZXJTaXplOjEwOworCX0gZmllbGQ7Cit9IEJBX1BBUkFNX1NFVCwgKlBCQV9QQVJBTV9TRVQ7CisKK3R5cGVkZWYgdW5pb24gX0RFTEJBX1BBUkFNX1NFVCB7CisJdTggY2hhckRhdGFbMl07CisJdTE2IHNob3J0RGF0YTsKKwlzdHJ1Y3QgeworCQl1MTYgUmVzZXJ2ZWQ6MTE7CisJCXUxNiBJbml0aWF0b3I6MTsKKwkJdTE2IFRJRDo0OworCX0gZmllbGQ7Cit9IERFTEJBX1BBUkFNX1NFVCwgKlBERUxCQV9QQVJBTV9TRVQ7CisKK3R5cGVkZWYgc3RydWN0IF9CQV9SRUNPUkQgeworCXN0cnVjdCB0aW1lcl9saXN0CQlUaW1lcjsKKwl1OAkJCQliVmFsaWQ7CisJdTgJCQkJRGlhbG9nVG9rZW47CisJQkFfUEFSQU1fU0VUCQlCYVBhcmFtU2V0OworCXUxNgkJCQlCYVRpbWVvdXRWYWx1ZTsKKwlTRVFVRU5DRV9DT05UUk9MCUJhU3RhcnRTZXFDdHJsOworfSBCQV9SRUNPUkQsICpQQkFfUkVDT1JEOworCisjZW5kaWYgLy9lbmQgX0JBVFlQRV9IXworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfQkFQcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfQkFQcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZhZjQzYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9CQVByb2MuYwpAQCAtMCwwICsxLDczNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGlzIGZpbGUgaXMgY3JlYXRlZCB0byBwcm9jZXNzIEJBIEFjdGlvbiBGcmFtZS4gQWNjb3JkaW5nIHRvIDgwMi4xMSBzcGVjLCB0aGVyZSBhcmUgMyBCQSBhY3Rpb24gdHlwZXMgYXQgYWxsLiBBbmQgYXMgQkEgaXMKKyAqIHJlbGF0ZWQgdG8gVFMsIHRoaXMgcGFydCBuZWVkIHNvbWUgc3RydXR1cmUgZGVmaW5lZCBpbiBRT1Mgc2lkZSBjb2RlLiBBbHNvIFRYIFJYIGlzIGdvaW5nIHRvIGJlIHJlc3R1cmN0dXJlZCwgc28gaG93IHRvIHNlbmQKKyAqIEFEREJBUkVRIEFEREJBUlNQIGFuZCBERUxCQSBwYWNrZXQgaXMgc3RpbGwgb24gY29uc2lkZXJhdGlvbi4gVGVtcG9yYXJpbHkgdXNlIE1BTkFHRSBRVUVVRSBpbnN0ZWFkIG9mIE5vcm1hbCBRdWV1ZS4KKyAqIFdCIDIwMDgtMDUtMjcKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImllZWU4MDIxMS5oIgorI2luY2x1ZGUgInJ0bDgxOXhfQkEuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgQWN0aXZhdGUgQkEgZW50cnkuIEFuZCBpZiBUaW1lIGlzIG5vemVybywgc3RhcnQgdGltZXIuCisgKiAgIGlucHV0OiAgUEJBX1JFQ09SRCAJCXBCQSAgLy9CQSBlbnRyeSB0byBiZSBlbmFibGVkCisgKiAgIAkgICAgIHUxNiAJCQlUaW1lIC8vaW5kaWNhdGUgdGltZSBkZWxheS4KKyAqICBvdXRwdXQ6ICBub25lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgQWN0aXZhdGVCQUVudHJ5KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBQQkFfUkVDT1JEIHBCQSwgdTE2IFRpbWUpCit7CisJcEJBLT5iVmFsaWQgPSB0cnVlOworCWlmKFRpbWUgIT0gMCkKKwkJbW9kX3RpbWVyKCZwQkEtPlRpbWVyLCBqaWZmaWVzICsgTVNFQ1MoVGltZSkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBkZWFjdGl2YXRlIEJBIGVudHJ5LCBpbmNsdWRpbmcgaXRzIHRpbWVyLgorICogICBpbnB1dDogIFBCQV9SRUNPUkQgCQlwQkEgIC8vQkEgZW50cnkgdG8gYmUgZGlzYWJsZWQKKyAqICBvdXRwdXQ6ICBub25lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRGVBY3RpdmF0ZUJBRW50cnkoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBQQkFfUkVDT1JEIHBCQSkKK3sKKwlwQkEtPmJWYWxpZCA9IGZhbHNlOworCWRlbF90aW1lcl9zeW5jKCZwQkEtPlRpbWVyKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogZGVhY3RpdmV0ZSBCQSBlbnRyeSBpbiBUeCBUcywgYW5kIHNlbmQgREVMQkEuCisgKiAgIGlucHV0OgorICogICAJICAgICBQVFhfVFNfUkVDT1JECQlwVHhUcyAvL1R4IFRzIHdoaWNoIGlzIHRvIGRlYWN0aXZhdGUgQkEgZW50cnkuCisgKiAgb3V0cHV0OiAgbm9uZQorICogIG5vdGljZTogIEFzIFBUWF9UU19SRUNPUkQgc3RydWN0dXJlIHdpbGwgYmUgZGVmaW5lZCBpbiBRT1MsIHNvIHdhaXQgdG8gYmUgbWVyZ2VkLiAvL0ZJWE1FCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IFR4VHNEZWxldGVCQSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIFBUWF9UU19SRUNPUkQJcFR4VHMpCit7CisJUEJBX1JFQ09SRAkJcEFkbWl0dGVkQmEgPSAmcFR4VHMtPlR4QWRtaXR0ZWRCQVJlY29yZDsgIC8vVGhlc2UgdHdvIEJBIGVudHJpZXMgbXVzdCBleGlzdCBpbiBUUyBzdHJ1Y3R1cmUKKwlQQkFfUkVDT1JECQlwUGVuZGluZ0JhID0gJnBUeFRzLT5UeFBlbmRpbmdCQVJlY29yZDsKKwl1OAkJCWJTZW5kREVMQkEgPSBmYWxzZTsKKworCS8vIERlbGV0ZSBwZW5kaW5nIEJBCisJaWYocFBlbmRpbmdCYS0+YlZhbGlkKQorCXsKKwkJRGVBY3RpdmF0ZUJBRW50cnkoaWVlZSwgcFBlbmRpbmdCYSk7CisJCWJTZW5kREVMQkEgPSB0cnVlOworCX0KKworCS8vIERlbGV0ZSBhZG1pdHRlZCBCQQorCWlmKHBBZG1pdHRlZEJhLT5iVmFsaWQpCisJeworCQlEZUFjdGl2YXRlQkFFbnRyeShpZWVlLCBwQWRtaXR0ZWRCYSk7CisJCWJTZW5kREVMQkEgPSB0cnVlOworCX0KKworCXJldHVybiBiU2VuZERFTEJBOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246IGRlYWN0aXZldGUgQkEgZW50cnkgaW4gVHggVHMsIGFuZCBzZW5kIERFTEJBLgorICogICBpbnB1dDoKKyAqICAgCSAgICAgUFJYX1RTX1JFQ09SRAkJcFJ4VHMgLy9SeCBUcyB3aGljaCBpcyB0byBkZWFjdGl2YXRlIEJBIGVudHJ5LgorICogIG91dHB1dDogIG5vbmUKKyAqICBub3RpY2U6ICBBcyBQUlhfVFNfUkVDT1JEIHN0cnVjdHVyZSB3aWxsIGJlIGRlZmluZWQgaW4gUU9TLCBzbyB3YWl0IHRvIGJlIG1lcmdlZC4gLy9GSVhNRSwgc2FtZSB3aXRoIGFib3ZlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IFJ4VHNEZWxldGVCQSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIFBSWF9UU19SRUNPUkQJcFJ4VHMpCit7CisJUEJBX1JFQ09SRAkJcEJhID0gJnBSeFRzLT5SeEFkbWl0dGVkQkFSZWNvcmQ7CisJdTgJCQliU2VuZERFTEJBID0gZmFsc2U7CisKKwlpZihwQmEtPmJWYWxpZCkKKwl7CisJCURlQWN0aXZhdGVCQUVudHJ5KGllZWUsIHBCYSk7CisJCWJTZW5kREVMQkEgPSB0cnVlOworCX0KKworCXJldHVybiBiU2VuZERFTEJBOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246IHJlc2V0IEJBIGVudHJ5CisgKiAgIGlucHV0OgorICogICAJICAgICBQQkFfUkVDT1JECQlwQkEgLy9lbnRyeSB0byBiZSByZXNldAorICogIG91dHB1dDogIG5vbmUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBSZXNldEJhRW50cnkoIFBCQV9SRUNPUkQgcEJBKQoreworCXBCQS0+YlZhbGlkCQkJPSBmYWxzZTsKKwlwQkEtPkJhUGFyYW1TZXQuc2hvcnREYXRhCT0gMDsKKwlwQkEtPkJhVGltZW91dFZhbHVlCQk9IDA7CisJcEJBLT5EaWFsb2dUb2tlbgkJPSAwOworCXBCQS0+QmFTdGFydFNlcUN0cmwuU2hvcnREYXRhCT0gMDsKK30KKy8vVGhlc2UgZnVuY3Rpb25zIG5lZWQgcG9ydGluZyBoZXJlIG9yIG5vdD8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgY29uc3RydWN0IEFEREJBUkVRIGFuZCBBRERCQVJTUCBmcmFtZSBoZXJlIHRvZ2V0aGVyLgorICogICBpbnB1dDogIHU4KiAJCURzdCAJLy9BRERCQSBmcmFtZSdzIGRlc3RpbmF0aW9uCisgKiAgIAkgICAgIFBCQV9SRUNPUkQgCXBCQQkvL0JBX1JFQ09SRCBlbnRyeSB3aGljaCBzdG9yZXMgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3IgQkEuCisgKiAgIAkgICAgIHUxNiAJCVN0YXR1c0NvZGUgIC8vc3RhdHVzIGNvZGUgaW4gUlNQIGFuZCBJIHdpbGwgdXNlIGl0IHRvIGluZGljYXRlIHdoZXRoZXIgaXQncyBSU1Agb3IgUkVRKHdpbGwgST8pCisgKiAgIAkgICAgIHU4CQkJdHlwZQkvL2luZGljYXRlIHdoZXRoZXIgaXQncyBSU1AoQUNUX0FEREJBUlNQKSBvdyBSRVEoQUNUX0FEREJBUkVRKQorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBza19idWZmKiAJCXNrYiAgICAgLy9yZXR1cm4gY29uc3RydWN0ZWQgc2tiIHRvIHhtaXQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYqIGllZWU4MDIxMV9BRERCQShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTgqIERzdCwgUEJBX1JFQ09SRCBwQkEsIHUxNiBTdGF0dXNDb2RlLCB1OCB0eXBlKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCSBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciogQkFSZXEgPSBOVUxMOworCXU4KiB0YWcgPSBOVUxMOworCXUxNiB0bXAgPSAwOworCXUxNiBsZW4gPSBpZWVlLT50eF9oZWFkcm9vbSArIDk7CisJLy9jYXRlZ29yeSgxKSArIGFjdGlvbiBmaWVsZCgxKSArIERpYWxvZyBUb2tlbigxKSArIEJBIFBhcmFtZXRlciBTZXQoMikgKyAgQkEgVGltZW91dCBWYWx1ZSgyKSArICBCQSBTdGFydCBTZXFDdHJsKDIpKG9yIFN0YXR1c0NvZGUoMikpCisJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9UUkFDRSB8IElFRUU4MDIxMV9ETF9CQSwgIj09PT09PT09PiVzKCksIGZyYW1lKCVkKSBzZW50ZCB0bzoiTUFDX0ZNVCIsIGllZWUtPmRldjolcFxuIiwgX19GVU5DVElPTl9fLCB0eXBlLCBNQUNfQVJHKERzdCksIGllZWUtPmRldik7CisJaWYgKHBCQSA9PSBOVUxMfHxpZWVlID09IE5VTEwpCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgInBCQSglcCkgaXMgTlVMTCBvciBpZWVlKCVwKSBpcyBOVUxMXG4iLCBwQkEsIGllZWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyBzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7IC8vbmVlZCB0byBhZGQgc29tZXRoaW5nIG90aGVycz8gRklYTUUKKwlpZiAoc2tiID09IE5VTEwpCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgImNhbid0IGFsbG9jIHNrYiBmb3IgQUREQkFfUkVRXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHNrYi0+ZGF0YSwgMCwgc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikpOyAgCS8vSSB3b25kZXIgd2hldGhlciBpdCdzIG5lY2Vzc2FyeS4gQXBwYXJlbnRseSBrZXJuZWwgd2lsbCBub3QgZG8gaXQgd2hlbiBhbGxvYyBhIHNrYi4KKwlza2JfcmVzZXJ2ZShza2IsIGllZWUtPnR4X2hlYWRyb29tKTsKKworCUJBUmVxID0gKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKSBza2JfcHV0KHNrYixzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7CisKKwltZW1jcHkoQkFSZXEtPmFkZHIxLCBEc3QsIEVUSF9BTEVOKTsKKwltZW1jcHkoQkFSZXEtPmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisKKwltZW1jcHkoQkFSZXEtPmFkZHIzLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKKworCUJBUmVxLT5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfTUFOQUdFX0FDVCk7IC8vYWN0aW9uIGZyYW1lCisKKwkvL3RhZyArPSBzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsgLy9tb3ZlIHRvIGFjdGlvbiBmaWVsZAorCXRhZyA9ICh1OCopc2tiX3B1dChza2IsIDkpOworCSp0YWcgKys9IEFDVF9DQVRfQkE7CisJKnRhZyArKz0gdHlwZTsKKwkvLyBEaWFsb2cgVG9rZW4KKwkqdGFnICsrPSBwQkEtPkRpYWxvZ1Rva2VuOworCisJaWYgKEFDVF9BRERCQVJTUCA9PSB0eXBlKQorCXsKKwkJLy8gU3RhdHVzIENvZGUKKwkJcHJpbnRrKCI9PT09PT50byBzZW5kIEFEREJBUlNQXG4iKTsKKwkJdG1wID0gY3B1X3RvX2xlMTYoU3RhdHVzQ29kZSk7CisJCW1lbWNweSh0YWcsICh1OCopJnRtcCwgMik7CisJCXRhZyArPSAyOworCX0KKwkvLyBCQSBQYXJhbWV0ZXIgU2V0CisJdG1wID0gY3B1X3RvX2xlMTYocEJBLT5CYVBhcmFtU2V0LnNob3J0RGF0YSk7CisJbWVtY3B5KHRhZywgKHU4KikmdG1wLCAyKTsKKwl0YWcgKz0gMjsKKwkvLyBCQSBUaW1lb3V0IFZhbHVlCisJdG1wID0gY3B1X3RvX2xlMTYocEJBLT5CYVRpbWVvdXRWYWx1ZSk7CisJbWVtY3B5KHRhZywgKHU4KikmdG1wLCAyKTsKKwl0YWcgKz0gMjsKKworCWlmIChBQ1RfQUREQkFSRVEgPT0gdHlwZSkKKwl7CisJLy8gQkEgU3RhcnQgU2VxQ3RybAorCQltZW1jcHkodGFnLCh1OCopJihwQkEtPkJhU3RhcnRTZXFDdHJsKSwgMik7CisJCXRhZyArPSAyOworCX0KKworCUlFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBfElFRUU4MDIxMV9ETF9CQSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJcmV0dXJuIHNrYjsKKwkvL3JldHVybiBOVUxMOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIGNvbnN0cnVjdCBERUxCQSBmcmFtZQorICogICBpbnB1dDogIHU4KiAJCWRzdCAJLy9ERUxCQSBmcmFtZSdzIGRlc3RpbmF0aW9uCisgKiAgIAkgICAgIFBCQV9SRUNPUkQgCXBCQQkvL0JBX1JFQ09SRCBlbnRyeSB3aGljaCBzdG9yZXMgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3IgQkEKKyAqICAgCSAgICAgVFJfU0VMRUNUCSAgICAgICAgVHhSeFNlbGVjdCAgLy9UWCBSWCBkaXJlY3Rpb24KKyAqICAgCSAgICAgdTE2IAkJUmVhc29uQ29kZSAgLy9zdGF0dXMgY29kZS4KKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgc2tfYnVmZiogCQlza2IgICAgIC8vcmV0dXJuIGNvbnN0cnVjdGVkIHNrYiB0byB4bWl0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiogaWVlZTgwMjExX0RFTEJBKAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLAorCXU4KgkJICAgICAgICAgZHN0LAorCVBCQV9SRUNPUkQJCSBwQkEsCisJVFJfU0VMRUNUCQkgVHhSeFNlbGVjdCwKKwl1MTYJCQkgUmVhc29uQ29kZQorCSkKK3sKKwlERUxCQV9QQVJBTV9TRVQJRGVsYmFQYXJhbVNldDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwkgc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIqIERlbGJhID0gTlVMTDsKKwl1OCogdGFnID0gTlVMTDsKKwl1MTYgdG1wID0gMDsKKwkvL2xlbiA9IGhlYWQgbGVuICsgREVMQkEgUGFyYW1ldGVyIFNldCgyKSArIFJlYXNvbiBDb2RlKDIpCisJdTE2IGxlbiA9IDYgKyBpZWVlLT50eF9oZWFkcm9vbTsKKworCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9UUkFDRSB8IElFRUU4MDIxMV9ETF9CQSwgIj09PT09PT09PiVzKCksIFJlYXNvbkNvZGUoJWQpIHNlbnRkIHRvOiJNQUNfRk1UIlxuIiwgX19GVU5DVElPTl9fLCBSZWFzb25Db2RlLCBNQUNfQVJHKGRzdCkpOworCisJbWVtc2V0KCZEZWxiYVBhcmFtU2V0LCAwLCAyKTsKKworCURlbGJhUGFyYW1TZXQuZmllbGQuSW5pdGlhdG9yCT0gKFR4UnhTZWxlY3Q9PVRYX0RJUik/MTowOworCURlbGJhUGFyYW1TZXQuZmllbGQuVElECT0gcEJBLT5CYVBhcmFtU2V0LmZpZWxkLlRJRDsKKworCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsgc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikpOyAvL25lZWQgdG8gYWRkIHNvbWV0aGluZyBvdGhlcnM/IEZJWE1FCisJaWYgKHNrYiA9PSBOVUxMKQorCXsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJjYW4ndCBhbGxvYyBza2IgZm9yIEFEREJBX1JFUVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKy8vCW1lbXNldChza2ItPmRhdGEsIDAsIGxlbitzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7CisJc2tiX3Jlc2VydmUoc2tiLCBpZWVlLT50eF9oZWFkcm9vbSk7CisKKwlEZWxiYSA9ICggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKikgc2tiX3B1dChza2Isc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikpOworCisJbWVtY3B5KERlbGJhLT5hZGRyMSwgZHN0LCBFVEhfQUxFTik7CisJbWVtY3B5KERlbGJhLT5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShEZWxiYS0+YWRkcjMsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOworCURlbGJhLT5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfTUFOQUdFX0FDVCk7IC8vYWN0aW9uIGZyYW1lCisKKwl0YWcgPSAodTgqKXNrYl9wdXQoc2tiLCA2KTsKKworCSp0YWcgKys9IEFDVF9DQVRfQkE7CisJKnRhZyArKz0gQUNUX0RFTEJBOworCisJLy8gREVMQkEgUGFyYW1ldGVyIFNldAorCXRtcCA9IGNwdV90b19sZTE2KERlbGJhUGFyYW1TZXQuc2hvcnREYXRhKTsKKwltZW1jcHkodGFnLCAodTgqKSZ0bXAsIDIpOworCXRhZyArPSAyOworCS8vIFJlYXNvbiBDb2RlCisJdG1wID0gY3B1X3RvX2xlMTYoUmVhc29uQ29kZSk7CisJbWVtY3B5KHRhZywgKHU4KikmdG1wLCAyKTsKKwl0YWcgKz0gMjsKKworCUlFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBfElFRUU4MDIxMV9ETF9CQSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1RSQUNFIHwgSUVFRTgwMjExX0RMX0JBLCAiPD09PT09JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlyZXR1cm4gc2tiOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246IHNlbmQgQUREQkFSZXEgZnJhbWUgb3V0CisgKiAgIGlucHV0OiAgdTgqIAkJZHN0IAkvL0FEREJBUmVxIGZyYW1lJ3MgZGVzdGluYXRpb24KKyAqICAgCSAgICAgUEJBX1JFQ09SRCAJcEJBCS8vQkFfUkVDT1JEIGVudHJ5IHdoaWNoIHN0b3JlcyB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZvciBCQQorICogIG91dHB1dDogIG5vbmUKKyAqICBub3RpY2U6IElmIGFueSBwb3NzaWJsZSwgcGxlYXNlIGhpZGUgcEJBIGluIGllZWUuIEFuZCB0ZW1wb3JhcmlseSB1c2UgTWFuYWdlIFF1ZXVlIGFzIHNvZnRtYWNfbWdtdF94bWl0KCkgdXN1YWxseSBkb2VzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaWVlZTgwMjExX3NlbmRfQUREQkFSZXEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4Kglkc3QsIFBCQV9SRUNPUkQJcEJBKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXNrYiA9IGllZWU4MDIxMV9BRERCQShpZWVlLCBkc3QsIHBCQSwgMCwgQUNUX0FEREJBUkVRKTsgLy9jb25zdHJ1Y3QgQUNUX0FEREJBUkVRIGZyYW1lcyBzbyBzZXQgc3RhdHVzY29kZSB6ZXJvLgorCisJaWYgKHNrYikKKwl7CisJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CisJCS8vYWRkIHN0YXRpc3RpYyBuZWVkZWQgaGVyZS4KKwkJLy9hbmQgc2tiIHdpbGwgYmUgZnJlZWQgaW4gc29mdG1hY19tZ210X3htaXQoKSwgc28gb21pdCBhbGwgZGV2X2tmcmVlX3NrYl9hbnkoKSBvdXRzaWRlIHNvZnRtYWNfbWdtdF94bWl0KCkKKwkJLy9XQgorCX0KKwllbHNlCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgImFsbG9jIHNrYiBlcnJvciBpbiBmdW5jdGlvbiAlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCX0KKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogc2VuZCBBRERCQVJTUCBmcmFtZSBvdXQKKyAqICAgaW5wdXQ6ICB1OCogCQlkc3QgCS8vREVMQkEgZnJhbWUncyBkZXN0aW5hdGlvbgorICogICAJICAgICBQQkFfUkVDT1JEIAlwQkEJLy9CQV9SRUNPUkQgZW50cnkgd2hpY2ggc3RvcmVzIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIEJBCisgKiAgIAkgICAgIHUxNgkJU3RhdHVzQ29kZSAvL1JTUCBTdGF0dXNDb2RlCisgKiAgb3V0cHV0OiAgbm9uZQorICogIG5vdGljZTogSWYgYW55IHBvc3NpYmxlLCBwbGVhc2UgaGlkZSBwQkEgaW4gaWVlZS4gQW5kIHRlbXBvcmFyaWx5IHVzZSBNYW5hZ2UgUXVldWUgYXMgc29mdG1hY19tZ210X3htaXQoKSB1c3VhbGx5IGRvZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBpZWVlODAyMTFfc2VuZF9BRERCQVJzcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTgqIGRzdCwgUEJBX1JFQ09SRCBwQkEsIHUxNiBTdGF0dXNDb2RlKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXNrYiA9IGllZWU4MDIxMV9BRERCQShpZWVlLCBkc3QsIHBCQSwgU3RhdHVzQ29kZSwgQUNUX0FEREJBUlNQKTsgLy9jb25zdHJ1Y3QgQUNUX0FEREJBUlNQIGZyYW1lcworCWlmIChza2IpCisJeworCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOworCQkvL3NhbWUgYWJvdmUKKwl9CisJZWxzZQorCXsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJhbGxvYyBza2IgZXJyb3IgaW4gZnVuY3Rpb24gJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwl9CisKKwlyZXR1cm47CisKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogc2VuZCBBRERCQVJTUCBmcmFtZSBvdXQKKyAqICAgaW5wdXQ6ICB1OCogCQlkc3QgCS8vREVMQkEgZnJhbWUncyBkZXN0aW5hdGlvbgorICogICAJICAgICBQQkFfUkVDT1JEIAlwQkEJLy9CQV9SRUNPUkQgZW50cnkgd2hpY2ggc3RvcmVzIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIEJBCisgKiAgIAkgICAgIFRSX1NFTEVDVCAgICAgICAgICBUeFJ4U2VsZWN0IC8vVFggb3IgUlgKKyAqICAgCSAgICAgdTE2CQlSZWFzb25Db2RlIC8vREVMIFJlYXNvbkNvZGUKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgbm90aWNlOiBJZiBhbnkgcG9zc2libGUsIHBsZWFzZSBoaWRlIHBCQSBpbiBpZWVlLiBBbmQgdGVtcG9yYXJpbHkgdXNlIE1hbmFnZSBRdWV1ZSBhcyBzb2Z0bWFjX21nbXRfeG1pdCgpIHVzdWFsbHkgZG9lcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgaWVlZTgwMjExX3NlbmRfREVMQkEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4KiBkc3QsIFBCQV9SRUNPUkQgcEJBLCBUUl9TRUxFQ1QgVHhSeFNlbGVjdCwgdTE2IFJlYXNvbkNvZGUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJc2tiID0gaWVlZTgwMjExX0RFTEJBKGllZWUsIGRzdCwgcEJBLCBUeFJ4U2VsZWN0LCBSZWFzb25Db2RlKTsgLy9jb25zdHJ1Y3QgQUNUX0FEREJBUlNQIGZyYW1lcworCWlmIChza2IpCisJeworCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOworCQkvL3NhbWUgYWJvdmUKKwl9CisJZWxzZQorCXsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJhbGxvYyBza2IgZXJyb3IgaW4gZnVuY3Rpb24gJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwl9CisJcmV0dXJuIDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiBSWCBBRERCQVJlcQorICogICBpbnB1dDogIHN0cnVjdCBza19idWZmICogICBza2IJLy9pbmNvbWluZyBBRERCQVJlcSBza2IuCisgKiAgcmV0dXJuOiAgMChwYXNzKSwgb3RoZXIoZmFpbCkKKyAqICBub3RpY2U6ICBBcyB0aGlzIGZ1bmN0aW9uIG5lZWQgc3VwcG9ydCBvZiBRT1MsIEkgY29tbWVudCBzb21lIGNvZGUgb3V0LiBBbmQgd2hlbiBxb3MgaXMgcmVhZHksIHRoaXMgY29kZSBuZWVkIHRvIGJlIHN1cHBvcnQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBpZWVlODAyMTFfcnhfQUREQkFSZXEoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCSBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciogcmVxID0gTlVMTDsKKwl1MTYgcmMgPSAwOworCXU4ICogZHN0ID0gTlVMTCwgKnBEaWFsb2dUb2tlbiA9IE5VTEwsICp0YWcgPSBOVUxMOworCVBCQV9SRUNPUkQgcEJBID0gTlVMTDsKKwlQQkFfUEFSQU1fU0VUCXBCYVBhcmFtU2V0ID0gTlVMTDsKKwl1MTYqIHBCYVRpbWVvdXRWYWwgPSBOVUxMOworCVBTRVFVRU5DRV9DT05UUk9MIHBCYVN0YXJ0U2VxQ3RybCA9IE5VTEw7CisJUFJYX1RTX1JFQ09SRAlwVFMgPSBOVUxMOworCisJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyA5KQorCXsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICIgSW52YWxpZCBza2IgbGVuIGluIEJBUkVRKCVkIC8gJWQpXG4iLCBza2ItPmxlbiwgCShzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSArIDkpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCUlFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBfElFRUU4MDIxMV9ETF9CQSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisKKwlyZXEgPSAoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKikgc2tiLT5kYXRhOworCXRhZyA9ICh1OCopcmVxOworCWRzdCA9ICh1OCopKCZyZXEtPmFkZHIyWzBdKTsKKwl0YWcgKz0gc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcERpYWxvZ1Rva2VuID0gdGFnICsgMjsgIC8vY2F0ZWdvcnkrYWN0aW9uCisJcEJhUGFyYW1TZXQgPSAoUEJBX1BBUkFNX1NFVCkodGFnICsgMyk7ICAgLy8rRGlhbG9nVG9rZW4KKwlwQmFUaW1lb3V0VmFsID0gKHUxNiopKHRhZyArIDUpOworCXBCYVN0YXJ0U2VxQ3RybCA9IChQU0VRVUVOQ0VfQ09OVFJPTCkocmVxICsgNyk7CisKKwlwcmludGsoIj09PT09PT09PT09PT09PT09PT09PnJ4IEFEREJBUkVRIGZyb20gOiJNQUNfRk1UIlxuIiwgTUFDX0FSRyhkc3QpKTsKKy8vc29tZSBvdGhlciBjYXBhYmlsaXR5IGlzIG5vdCByZWFkeSBub3cuCisJaWYoCShpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuYWN0aXZlID09IDApIHx8CisJCShpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9PSBmYWxzZSkpIC8vfHwKKwkvLwkoaWVlZS0+cFN0YVFvcy0+YkVuYWJsZVJ4SW1tQkEgPT0gZmFsc2UpCSkKKwl7CisJCXJjID0gQUREQkFfU1RBVFVTX1JFRlVTRUQ7CisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiRmFpbGVkIHRvIHJlcGx5IG9uIEFEREJBX1JFUSBhcyBzb21lIGNhcGFiaWxpdHkgaXMgbm90IHJlYWR5KCVkLCAlZClcbiIsIGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5hY3RpdmUsIGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0KTsKKwkJZ290byBPbkFEREJBUmVxX0ZhaWw7CisJfQorCS8vIFNlYXJjaCBmb3IgcmVsYXRlZCB0cmFmZmljIHN0cmVhbS4KKwkvLyBJZiB0aGVyZSBpcyBubyBtYXRjaGVkIFRTLCByZWplY3QgdGhlIEFEREJBIHJlcXVlc3QuCisJaWYoCSFHZXRUcygKKwkJCWllZWUsCisJCQkoUFRTX0NPTU1PTl9JTkZPKikoJnBUUyksCisJCQlkc3QsCisJCQkodTgpKHBCYVBhcmFtU2V0LT5maWVsZC5USUQpLAorCQkJUlhfRElSLAorCQkJdHJ1ZSkJKQorCXsKKwkJcmMgPSBBRERCQV9TVEFUVVNfUkVGVVNFRDsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJjYW4ndCBnZXQgVFMgaW4gJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBPbkFEREJBUmVxX0ZhaWw7CisJfQorCXBCQSA9ICZwVFMtPlJ4QWRtaXR0ZWRCQVJlY29yZDsKKwkvLyBUbyBEZXRlcm1pbmUgdGhlIEFEREJBIFJlcSBjb250ZW50CisJLy8gV2UgY2FuIGRvIG11Y2ggbW9yZSBjaGVjayBoZXJlLCBpbmNsdWRpbmcgQnVmZmVyU2l6ZSwgQU1TRFVfU3VwcG9ydCwgUG9saWN5LCBTdGFydFNlcUN0cmwuLi4KKwkvLyBJIHdhbnQgdG8gY2hlY2sgU3RhcnRTZXFDdHJsIHRvIG1ha2Ugc3VyZSB3aGVuIHdlIHN0YXJ0IGFnZ3JlZ2F0aW9uISEhCisJLy8KKwlpZihwQmFQYXJhbVNldC0+ZmllbGQuQkFQb2xpY3kgPT0gQkFfUE9MSUNZX0RFTEFZRUQpCisJeworCQlyYyA9IEFEREJBX1NUQVRVU19JTlZBTElEX1BBUkFNOworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgIkJBIFBvbGljeSBpcyBub3QgY29ycmVjdCBpbiAlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIE9uQUREQkFSZXFfRmFpbDsKKwl9CisJCS8vIEFkbWl0IHRoZSBBRERCQSBSZXF1ZXN0CisJLy8KKwlEZUFjdGl2YXRlQkFFbnRyeShpZWVlLCBwQkEpOworCXBCQS0+RGlhbG9nVG9rZW4gPSAqcERpYWxvZ1Rva2VuOworCXBCQS0+QmFQYXJhbVNldCA9ICpwQmFQYXJhbVNldDsKKwlwQkEtPkJhVGltZW91dFZhbHVlID0gKnBCYVRpbWVvdXRWYWw7CisJcEJBLT5CYVN0YXJ0U2VxQ3RybCA9ICpwQmFTdGFydFNlcUN0cmw7CisJLy9mb3IgaGFsZiBOIG1vZGUgd2Ugb25seSBhZ2dyZWdhdGUgMSBmcmFtZQorCWlmIChpZWVlLT5HZXRIYWxmTm1vZGVTdXBwb3J0QnlBUHNIYW5kbGVyKGllZWUtPmRldikpCisJcEJBLT5CYVBhcmFtU2V0LmZpZWxkLkJ1ZmZlclNpemUgPSAxOworCWVsc2UKKwlwQkEtPkJhUGFyYW1TZXQuZmllbGQuQnVmZmVyU2l6ZSA9IDMyOworCUFjdGl2YXRlQkFFbnRyeShpZWVlLCBwQkEsIHBCQS0+QmFUaW1lb3V0VmFsdWUpOworCWllZWU4MDIxMV9zZW5kX0FEREJBUnNwKGllZWUsIGRzdCwgcEJBLCBBRERCQV9TVEFUVVNfU1VDQ0VTUyk7CisKKwkvLyBFbmQgb2YgcHJvY2VkdXJlLgorCXJldHVybiAwOworCitPbkFEREJBUmVxX0ZhaWw6CisJeworCQlCQV9SRUNPUkQJQkE7CisJCUJBLkJhUGFyYW1TZXQgPSAqcEJhUGFyYW1TZXQ7CisJCUJBLkJhVGltZW91dFZhbHVlID0gKnBCYVRpbWVvdXRWYWw7CisJCUJBLkRpYWxvZ1Rva2VuID0gKnBEaWFsb2dUb2tlbjsKKwkJQkEuQmFQYXJhbVNldC5maWVsZC5CQVBvbGljeSA9IEJBX1BPTElDWV9JTU1FRElBVEU7CisJCWllZWU4MDIxMV9zZW5kX0FEREJBUnNwKGllZWUsIGRzdCwgJkJBLCByYyk7CisJCXJldHVybiAwOyAvL3dlIHNlbmQgUlNQIG91dC4KKwl9CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiBSWCBBRERCQVJTUAorICogICBpbnB1dDogIHN0cnVjdCBza19idWZmICogICBza2IJLy9pbmNvbWluZyBBRERCQVJlcSBza2IuCisgKiAgcmV0dXJuOiAgMChwYXNzKSwgb3RoZXIoZmFpbCkKKyAqICBub3RpY2U6ICBBcyB0aGlzIGZ1bmN0aW9uIG5lZWQgc3VwcG9ydCBvZiBRT1MsIEkgY29tbWVudCBzb21lIGNvZGUgb3V0LiBBbmQgd2hlbiBxb3MgaXMgcmVhZHksIHRoaXMgY29kZSBuZWVkIHRvIGJlIHN1cHBvcnQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBpZWVlODAyMTFfcnhfQUREQkFSc3AoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCSBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciogcnNwID0gTlVMTDsKKwlQQkFfUkVDT1JECQlwUGVuZGluZ0JBLCBwQWRtaXR0ZWRCQTsKKwlQVFhfVFNfUkVDT1JECQlwVFMgPSBOVUxMOworCXU4KiBkc3QgPSBOVUxMLCAqcERpYWxvZ1Rva2VuID0gTlVMTCwgKnRhZyA9IE5VTEw7CisJdTE2KiBwU3RhdHVzQ29kZSA9IE5VTEwsICpwQmFUaW1lb3V0VmFsID0gTlVMTDsKKwlQQkFfUEFSQU1fU0VUCQlwQmFQYXJhbVNldCA9IE5VTEw7CisJdTE2CQkJUmVhc29uQ29kZTsKKworCWlmIChza2ItPmxlbiA8IHNpemVvZiggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpICsgOSkKKwl7CisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiIEludmFsaWQgc2tiIGxlbiBpbiBCQVJTUCglZCAvICVkKVxuIiwgc2tiLT5sZW4sIAkoc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyA5KSk7CisJCXJldHVybiAtMTsKKwl9CisJcnNwID0gKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciopc2tiLT5kYXRhOworCXRhZyA9ICh1OCopcnNwOworCWRzdCA9ICh1OCopKCZyc3AtPmFkZHIyWzBdKTsKKwl0YWcgKz0gc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcERpYWxvZ1Rva2VuID0gdGFnICsgMjsKKwlwU3RhdHVzQ29kZSA9ICh1MTYqKSh0YWcgKyAzKTsKKwlwQmFQYXJhbVNldCA9IChQQkFfUEFSQU1fU0VUKSh0YWcgKyA1KTsKKwlwQmFUaW1lb3V0VmFsID0gKHUxNiopKHRhZyArIDcpOworCisJLy8gQ2hlY2sgdGhlIGNhcGFiaWxpdHkKKwkvLyBTaW5jZSB3ZSBjYW4gYWx3YXlzIHJlY2VpdmUgQS1NUERVLCB3ZSBqdXN0IGNoZWNrIGlmIGl0IGlzIHVuZGVyIEhUIG1vZGUuCisJaWYoICAgICBpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuYWN0aXZlID09IDAgIHx8CisJCWllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID09IGZhbHNlIHx8CisJCWllZWUtPnBIVEluZm8tPmJDdXJyZW50QU1QRFVFbmFibGUgPT0gZmFsc2UgKQorCXsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJyZWplY3QgdG8gQUREQkFfUlNQIGFzIHNvbWUgY2FwYWJpbGl0eSBpcyBub3QgcmVhZHkoJWQsICVkLCAlZClcbiIsaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZSwgaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQsIGllZWUtPnBIVEluZm8tPmJDdXJyZW50QU1QRFVFbmFibGUpOworCQlSZWFzb25Db2RlID0gREVMQkFfUkVBU09OX1VOS05PV05fQkE7CisJCWdvdG8gT25BRERCQVJzcF9SZWplY3Q7CisJfQorCisKKwkvLworCS8vIFNlYXJjaCBmb3IgcmVsYXRlZCBUUy4KKwkvLyBJZiB0aGVyZSBpcyBubyBUUyBmb3VuZCwgd2Ugd2lsIHJlamVjdCBBRERCQSBSc3AgYnkgc2VuZGluZyBERUxCQSBmcmFtZS4KKwkvLworCWlmICghR2V0VHMoCisJCQlpZWVlLAorCQkJKFBUU19DT01NT05fSU5GTyopKCZwVFMpLAorCQkJZHN0LAorCQkJKHU4KShwQmFQYXJhbVNldC0+ZmllbGQuVElEKSwKKwkJCVRYX0RJUiwKKwkJCWZhbHNlKQkpCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgImNhbid0IGdldCBUUyBpbiAlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCQlSZWFzb25Db2RlID0gREVMQkFfUkVBU09OX1VOS05PV05fQkE7CisJCWdvdG8gT25BRERCQVJzcF9SZWplY3Q7CisJfQorCisJcFRTLT5iQWRkQmFSZXFJblByb2dyZXNzID0gZmFsc2U7CisJcFBlbmRpbmdCQSA9ICZwVFMtPlR4UGVuZGluZ0JBUmVjb3JkOworCXBBZG1pdHRlZEJBID0gJnBUUy0+VHhBZG1pdHRlZEJBUmVjb3JkOworCisKKwkvLworCS8vIENoZWNrIGlmIHJlbGF0ZWQgQkEgaXMgd2FpdGluZyBmb3Igc2V0dXAuCisJLy8gSWYgbm90LCByZWplY3QgYnkgc2VuZGluZyBERUxCQSBmcmFtZS4KKwkvLworCWlmKChwQWRtaXR0ZWRCQS0+YlZhbGlkPT10cnVlKSkKKwl7CisJCS8vIFNpbmNlIEJBIGlzIGFscmVhZHkgc2V0dXAsIHdlIGlnbm9yZSBhbGwgb3RoZXIgQUREQkEgUmVzcG9uc2UuCisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfQkEsICJPbkFEREJBUnNwKCk6IFJlY3YgQUREQkEgUnNwLiBEcm9wIGJlY2F1c2UgYWxyZWFkeSBhZG1pdCBpdCEgXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwllbHNlIGlmKChwUGVuZGluZ0JBLT5iVmFsaWQgPT0gZmFsc2UpIHx8KCpwRGlhbG9nVG9rZW4gIT0gcFBlbmRpbmdCQS0+RGlhbG9nVG9rZW4pKQorCXsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICAiT25BRERCQVJzcCgpOiBSZWN2IEFEREJBIFJzcC4gQkEgaW52YWxpZCwgREVMQkEhIFxuIik7CisJCVJlYXNvbkNvZGUgPSBERUxCQV9SRUFTT05fVU5LTk9XTl9CQTsKKwkJZ290byBPbkFEREJBUnNwX1JlamVjdDsKKwl9CisJZWxzZQorCXsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9CQSwgIk9uQUREQkFSc3AoKTogUmVjdiBBRERCQSBSc3AuIEJBIGlzIGFkbWl0dGVkISBTdGF0dXMgY29kZTolWFxuIiwgKnBTdGF0dXNDb2RlKTsKKwkJRGVBY3RpdmF0ZUJBRW50cnkoaWVlZSwgcFBlbmRpbmdCQSk7CisJfQorCisKKwlpZigqcFN0YXR1c0NvZGUgPT0gQUREQkFfU1RBVFVTX1NVQ0NFU1MpCisJeworCQkvLworCQkvLyBEZXRlcm1pbmUgQUREQkEgUnNwIGNvbnRlbnQgaGVyZS4KKwkJLy8gV2UgY2FuIGNvbXBhcmUgdGhlIHZhbHVlIG9mIEJBIHBhcmFtZXRlciBzZXQgdGhhdCBQZWVyIHJldHVybmVkIGFuZCBTZWxmIHNlbnQuCisJCS8vIElmIGl0IGlzIE9LLCB0aGVuIGFkbWl0dGVkLiBPciB3ZSBjYW4gc2VuZCBERUxCQSB0byBjYW5jZWwgQkEgbWVjaGFuaXNtLgorCQkvLworCQlpZihwQmFQYXJhbVNldC0+ZmllbGQuQkFQb2xpY3kgPT0gQkFfUE9MSUNZX0RFTEFZRUQpCisJCXsKKwkJCS8vIFNpbmNlIHRoaXMgaXMgYSBraW5kIG9mIEFEREJBIGZhaWxlZCwgd2UgZGVsYXkgbmV4dCBBRERCQSBwcm9jZXNzLgorCQkJcFRTLT5iQWRkQmFSZXFEZWxheWVkID0gdHJ1ZTsKKwkJCURlQWN0aXZhdGVCQUVudHJ5KGllZWUsIHBBZG1pdHRlZEJBKTsKKwkJCVJlYXNvbkNvZGUgPSBERUxCQV9SRUFTT05fRU5EX0JBOworCQkJZ290byBPbkFEREJBUnNwX1JlamVjdDsKKwkJfQorCisKKwkJLy8KKwkJLy8gQWRtaXR0ZWQgY29uZGl0aW9uCisJCS8vCisJCXBBZG1pdHRlZEJBLT5EaWFsb2dUb2tlbiA9ICpwRGlhbG9nVG9rZW47CisJCXBBZG1pdHRlZEJBLT5CYVRpbWVvdXRWYWx1ZSA9ICpwQmFUaW1lb3V0VmFsOworCQlwQWRtaXR0ZWRCQS0+QmFTdGFydFNlcUN0cmwgPSBwUGVuZGluZ0JBLT5CYVN0YXJ0U2VxQ3RybDsKKwkJcEFkbWl0dGVkQkEtPkJhUGFyYW1TZXQgPSAqcEJhUGFyYW1TZXQ7CisJCURlQWN0aXZhdGVCQUVudHJ5KGllZWUsIHBBZG1pdHRlZEJBKTsKKwkJQWN0aXZhdGVCQUVudHJ5KGllZWUsIHBBZG1pdHRlZEJBLCAqcEJhVGltZW91dFZhbCk7CisJfQorCWVsc2UKKwl7CisJCS8vIERlbGF5IG5leHQgQUREQkEgcHJvY2Vzcy4KKwkJcFRTLT5iQWRkQmFSZXFEZWxheWVkID0gdHJ1ZTsKKwl9CisKKwkvLyBFbmQgb2YgcHJvY2VkdXJlCisJcmV0dXJuIDA7CisKK09uQUREQkFSc3BfUmVqZWN0OgorCXsKKwkJQkFfUkVDT1JECUJBOworCQlCQS5CYVBhcmFtU2V0ID0gKnBCYVBhcmFtU2V0OworCQlpZWVlODAyMTFfc2VuZF9ERUxCQShpZWVlLCBkc3QsICZCQSwgVFhfRElSLCBSZWFzb25Db2RlKTsKKwkJcmV0dXJuIDA7CisJfQorCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogUlggREVMQkEKKyAqICAgaW5wdXQ6ICBzdHJ1Y3Qgc2tfYnVmZiAqICAgc2tiCS8vaW5jb21pbmcgQUREQkFSZXEgc2tiLgorICogIHJldHVybjogIDAocGFzcyksIG90aGVyKGZhaWwpCisgKiAgbm90aWNlOiAgQXMgdGhpcyBmdW5jdGlvbiBuZWVkIHN1cHBvcnQgb2YgUU9TLCBJIGNvbW1lbnQgc29tZSBjb2RlIG91dC4gQW5kIHdoZW4gcW9zIGlzIHJlYWR5LCB0aGlzIGNvZGUgbmVlZCB0byBiZSBzdXBwb3J0LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgaWVlZTgwMjExX3J4X0RFTEJBKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLHN0cnVjdCBza19idWZmICpza2IpCit7CisJIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKiBkZWxiYSA9IE5VTEw7CisJUERFTEJBX1BBUkFNX1NFVAlwRGVsQmFQYXJhbVNldCA9IE5VTEw7CisJdTE2KgkJCXBSZWFzb25Db2RlID0gTlVMTDsKKwl1OCoJCQlkc3QgPSBOVUxMOworCisJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyA2KQorCXsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICIgSW52YWxpZCBza2IgbGVuIGluIERFTEJBKCVkIC8gJWQpXG4iLCBza2ItPmxlbiwgCShzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSArIDYpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmKGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5hY3RpdmUgPT0gMCB8fAorCQlpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9PSBmYWxzZSApCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgInJlY2VpdmVkIERFTEJBIHdoaWxlIFFPUyBvciBIVCBpcyBub3Qgc3VwcG9ydGVkKCVkLCAlZClcbiIsaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZSwgaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQpOworCQlyZXR1cm4gLTE7CisJfQorCisJSUVFRTgwMjExX0RFQlVHX0RBVEEoSUVFRTgwMjExX0RMX0RBVEF8SUVFRTgwMjExX0RMX0JBLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlkZWxiYSA9ICggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIqKXNrYi0+ZGF0YTsKKwlkc3QgPSAodTgqKSgmZGVsYmEtPmFkZHIyWzBdKTsKKwlkZWxiYSArPSBzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKKwlwRGVsQmFQYXJhbVNldCA9IChQREVMQkFfUEFSQU1fU0VUKShkZWxiYSsyKTsKKwlwUmVhc29uQ29kZSA9ICh1MTYqKShkZWxiYSs0KTsKKworCWlmKHBEZWxCYVBhcmFtU2V0LT5maWVsZC5Jbml0aWF0b3IgPT0gMSkKKwl7CisJCVBSWF9UU19SRUNPUkQgCXBSeFRzOworCisJCWlmKCAhR2V0VHMoCisJCQkJaWVlZSwKKwkJCQkoUFRTX0NPTU1PTl9JTkZPKikmcFJ4VHMsCisJCQkJZHN0LAorCQkJCSh1OClwRGVsQmFQYXJhbVNldC0+ZmllbGQuVElELAorCQkJCVJYX0RJUiwKKwkJCQlmYWxzZSkJKQorCQl7CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgICJjYW4ndCBnZXQgVFMgZm9yIFJYVFMgaW4gJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCVJ4VHNEZWxldGVCQShpZWVlLCBwUnhUcyk7CisJfQorCWVsc2UKKwl7CisJCVBUWF9UU19SRUNPUkQJcFR4VHM7CisKKwkJaWYoIUdldFRzKAorCQkJaWVlZSwKKwkJCShQVFNfQ09NTU9OX0lORk8qKSZwVHhUcywKKwkJCWRzdCwKKwkJCSh1OClwRGVsQmFQYXJhbVNldC0+ZmllbGQuVElELAorCQkJVFhfRElSLAorCQkJZmFsc2UpCSkKKwkJeworCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICAiY2FuJ3QgZ2V0IFRTIGZvciBUWFRTIGluICVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlwVHhUcy0+YlVzaW5nQmEgPSBmYWxzZTsKKwkJcFR4VHMtPmJBZGRCYVJlcUluUHJvZ3Jlc3MgPSBmYWxzZTsKKwkJcFR4VHMtPmJBZGRCYVJlcURlbGF5ZWQgPSBmYWxzZTsKKwkJZGVsX3RpbWVyX3N5bmMoJnBUeFRzLT5Uc0FkZEJhVGltZXIpOworCQkvL1BsYXRmb3JtQ2FuY2VsVGltZXIoQWRhcHRlciwgJnBUeFRzLT5Uc0FkZEJhVGltZXIpOworCQlUeFRzRGVsZXRlQkEoaWVlZSwgcFR4VHMpOworCX0KKwlyZXR1cm4gMDsKK30KKworLy8KKy8vIEFEREJBIGluaXRpYXRlLiBUaGlzIGNhbiBvbmx5IGJlIGNhbGxlZCBieSBUWCBzaWRlLgorLy8KK3ZvaWQKK1RzSW5pdEFkZEJBKAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLAorCVBUWF9UU19SRUNPUkQJcFRTLAorCXU4CQlQb2xpY3ksCisJdTgJCWJPdmVyd3JpdGVQZW5kaW5nCisJKQoreworCVBCQV9SRUNPUkQJCQlwQkEgPSAmcFRTLT5UeFBlbmRpbmdCQVJlY29yZDsKKworCWlmKHBCQS0+YlZhbGlkPT10cnVlICYmIGJPdmVyd3JpdGVQZW5kaW5nPT1mYWxzZSkKKwkJcmV0dXJuOworCisJLy8gU2V0IHBhcmFtZXRlcnMgdG8gIlBlbmRpbmciIHZhcmlhYmxlIHNldAorCURlQWN0aXZhdGVCQUVudHJ5KGllZWUsIHBCQSk7CisKKwlwQkEtPkRpYWxvZ1Rva2VuKys7CQkJCQkJLy8gRGlhbG9nVG9rZW46IE9ubHkga2VlcCB0aGUgbGF0ZXN0IGRpYWxvZyB0b2tlbgorCXBCQS0+QmFQYXJhbVNldC5maWVsZC5BTVNEVV9TdXBwb3J0ID0gMDsJLy8gRG8gbm90IHN1cHBvcnQgQS1NU0RVIHdpdGggQS1NUERVIG5vdyEhCisJcEJBLT5CYVBhcmFtU2V0LmZpZWxkLkJBUG9saWN5ID0gUG9saWN5OwkvLyBQb2xpY3k6IERlbGF5ZWQgb3IgSW1tZWRpYXRlCisJcEJBLT5CYVBhcmFtU2V0LmZpZWxkLlRJRCA9IHBUUy0+VHNDb21tb25JbmZvLlRTcGVjLmYuVFNJbmZvLmZpZWxkLnVjVFNJRDsJLy8gVElECisJLy8gQnVmZmVyU2l6ZTogVGhpcyBuZWVkIHRvIGJlIHNldCBhY2NvcmRpbmcgdG8gQS1NUERVIHZlY3RvcgorCXBCQS0+QmFQYXJhbVNldC5maWVsZC5CdWZmZXJTaXplID0gMzI7CQkvLyBCdWZmZXJTaXplOiBUaGlzIG5lZWQgdG8gYmUgc2V0IGFjY29yZGluZyB0byBBLU1QRFUgdmVjdG9yCisJcEJBLT5CYVRpbWVvdXRWYWx1ZSA9IDA7CQkJCQkvLyBUaW1lb3V0IHZhbHVlOiBTZXQgMCB0byBkaXNhYmxlIFRpbWVyCisJcEJBLT5CYVN0YXJ0U2VxQ3RybC5maWVsZC5TZXFOdW0gPSAocFRTLT5UeEN1clNlcSArIDMpICUgNDA5NjsgCS8vIEJsb2NrIEFjayB3aWxsIHN0YXJ0IGFmdGVyIDMgcGFja2V0cyBsYXRlci4KKworCUFjdGl2YXRlQkFFbnRyeShpZWVlLCBwQkEsIEJBX1NFVFVQX1RJTUVPVVQpOworCisJaWVlZTgwMjExX3NlbmRfQUREQkFSZXEoaWVlZSwgcFRTLT5Uc0NvbW1vbkluZm8uQWRkciwgcEJBKTsKK30KKwordm9pZAorVHNJbml0RGVsQkEoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBQVFNfQ09NTU9OX0lORk8gcFRzQ29tbW9uSW5mbywgVFJfU0VMRUNUIFR4UnhTZWxlY3QpCit7CisKKwlpZihUeFJ4U2VsZWN0ID09IFRYX0RJUikKKwl7CisJCVBUWF9UU19SRUNPUkQJcFR4VHMgPSAoUFRYX1RTX1JFQ09SRClwVHNDb21tb25JbmZvOworCisJCWlmKFR4VHNEZWxldGVCQShpZWVlLCBwVHhUcykpCisJCQlpZWVlODAyMTFfc2VuZF9ERUxCQSgKKwkJCQlpZWVlLAorCQkJCXBUc0NvbW1vbkluZm8tPkFkZHIsCisJCQkJKHBUeFRzLT5UeEFkbWl0dGVkQkFSZWNvcmQuYlZhbGlkKT8oJnBUeFRzLT5UeEFkbWl0dGVkQkFSZWNvcmQpOigmcFR4VHMtPlR4UGVuZGluZ0JBUmVjb3JkKSwKKwkJCQlUeFJ4U2VsZWN0LAorCQkJCURFTEJBX1JFQVNPTl9FTkRfQkEpOworCX0KKwllbHNlIGlmKFR4UnhTZWxlY3QgPT0gUlhfRElSKQorCXsKKwkJUFJYX1RTX1JFQ09SRAlwUnhUcyA9IChQUlhfVFNfUkVDT1JEKXBUc0NvbW1vbkluZm87CisJCWlmKFJ4VHNEZWxldGVCQShpZWVlLCBwUnhUcykpCisJCQlpZWVlODAyMTFfc2VuZF9ERUxCQSgKKwkJCQlpZWVlLAorCQkJCXBUc0NvbW1vbkluZm8tPkFkZHIsCisJCQkJJnBSeFRzLT5SeEFkbWl0dGVkQkFSZWNvcmQsCisJCQkJVHhSeFNlbGVjdCwKKwkJCQlERUxCQV9SRUFTT05fRU5EX0JBCSk7CisJfQorfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgQkEgc2V0dXAgdGltZXIKKyAqICAgaW5wdXQ6ICB1bnNpZ25lZCBsb25nCSBkYXRhCQkvL2FjdHVyYWxseSB3ZSBzZW5kIFRYX1RTX1JFQ09SRCBvciBSWF9UU19SRUNPUkQgdG8gdGhlc2UgdGltZXIKKyAqICByZXR1cm46ICBOVUxMCisgKiAgbm90aWNlOgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEJhU2V0dXBUaW1lT3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlQVFhfVFNfUkVDT1JECXBUeFRzID0gKFBUWF9UU19SRUNPUkQpZGF0YTsKKworCXBUeFRzLT5iQWRkQmFSZXFJblByb2dyZXNzID0gZmFsc2U7CisJcFR4VHMtPmJBZGRCYVJlcURlbGF5ZWQgPSB0cnVlOworCXBUeFRzLT5UeFBlbmRpbmdCQVJlY29yZC5iVmFsaWQgPSBmYWxzZTsKK30KKwordm9pZCBUeEJhSW5hY3RUaW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlQVFhfVFNfUkVDT1JECXBUeFRzID0gKFBUWF9UU19SRUNPUkQpZGF0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihwVHhUcywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIFR4VHNSZWNvcmRbcFR4VHMtPm51bV0pOworCVR4VHNEZWxldGVCQShpZWVlLCBwVHhUcyk7CisJaWVlZTgwMjExX3NlbmRfREVMQkEoCisJCWllZWUsCisJCXBUeFRzLT5Uc0NvbW1vbkluZm8uQWRkciwKKwkJJnBUeFRzLT5UeEFkbWl0dGVkQkFSZWNvcmQsCisJCVRYX0RJUiwKKwkJREVMQkFfUkVBU09OX1RJTUVPVVQpOworfQorCit2b2lkIFJ4QmFJbmFjdFRpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCVBSWF9UU19SRUNPUkQJcFJ4VHMgPSAoUFJYX1RTX1JFQ09SRClkYXRhOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHBSeFRzLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgUnhUc1JlY29yZFtwUnhUcy0+bnVtXSk7CisKKwlSeFRzRGVsZXRlQkEoaWVlZSwgcFJ4VHMpOworCWllZWU4MDIxMV9zZW5kX0RFTEJBKAorCQlpZWVlLAorCQlwUnhUcy0+VHNDb21tb25JbmZvLkFkZHIsCisJCSZwUnhUcy0+UnhBZG1pdHRlZEJBUmVjb3JkLAorCQlSWF9ESVIsCisJCURFTEJBX1JFQVNPTl9USU1FT1VUKTsKKwlyZXR1cm4gOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfSFQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9IVC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZTYwM2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfSFQuaApAQCAtMCwwICsxLDQ4MSBAQAorI2lmbmRlZiBfUlRMODE5WFVfSFRUWVBFX0hfCisjZGVmaW5lIF9SVEw4MTlYVV9IVFRZUEVfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBIVCBDYXBhYmlsaXR5IGVsZW1lbnQgaXMgcHJlc2VudCBpbiBiZWFjb25zLCBhc3NvY2lhdGlvbiByZXF1ZXN0LAorLy8JcmVhc3NvY2lhdGlvbiByZXF1ZXN0IGFuZCBwcm9iZSByZXNwb25zZSBmcmFtZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vCisvLyBPcGVyYXRpb24gbW9kZSB2YWx1ZQorLy8KKyNkZWZpbmUgSFRfT1BNT0RFX05PX1BST1RFQ1QJCTAKKyNkZWZpbmUgSFRfT1BNT0RFX09QVElPTkFMCQkxCisjZGVmaW5lIEhUX09QTU9ERV80ME1IWl9QUk9URUNUCTIKKyNkZWZpbmUgSFRfT1BNT0RFX01JWEVECQkJMworCisvLworLy8gTUlNTyBQb3dlciBTYXZlIFNldGluZ3MKKy8vCisjZGVmaW5lIE1JTU9fUFNfU1RBVElDCQkJCTAKKyNkZWZpbmUgTUlNT19QU19EWU5BTUlDCQkJMQorI2RlZmluZSBNSU1PX1BTX05PTElNSVQJCQkzCisKKworLy8KKy8vCVRoZXJlIHNob3VsZCBiZSAxMjggYml0cyB0byBjb3ZlciBhbGwgb2YgdGhlIE1DUyByYXRlcy4gSG93ZXZlciwgc2luY2UKKy8vCTgxOTAgZG9lcyBub3Qgc3VwcG9ydCB0b28gbXVjaCByYXRlcywgb25lIGludGVnZXIgaXMgcXVpdGUgZW5vdWdoLgorLy8KKworI2RlZmluZSBzSFRDTG5nCTQKKworCisjZGVmaW5lIEhUX1NVUFBPUlRFRF9NQ1NfMVNTX0JJVE1BUAkJCQkJMHgwMDAwMDBmZgorI2RlZmluZSBIVF9TVVBQT1JURURfTUNTXzJTU19CSVRNQVAJCQkJCTB4MDAwMGZmMDAKKyNkZWZpbmUgSFRfU1VQUE9SVEVEX01DU18xU1NfMlNTX0JJVE1BUAkJCUhUX01DU18xU1NfQklUTUFQfEhUX01DU18xU1NfMlNTX0JJVE1BUAorCisKK3R5cGVkZWYgZW51bSBfSFRfTUNTX1JBVEV7CisJSFRfTUNTMCAgID0gMHgwMDAwMDAwMSwKKwlIVF9NQ1MxICAgPSAweDAwMDAwMDAyLAorCUhUX01DUzIgICA9IDB4MDAwMDAwMDQsCisJSFRfTUNTMyAgID0gMHgwMDAwMDAwOCwKKwlIVF9NQ1M0ICAgPSAweDAwMDAwMDEwLAorCUhUX01DUzUgICA9IDB4MDAwMDAwMjAsCisJSFRfTUNTNiAgID0gMHgwMDAwMDA0MCwKKwlIVF9NQ1M3ICAgPSAweDAwMDAwMDgwLAorCUhUX01DUzggICA9IDB4MDAwMDAxMDAsCisJSFRfTUNTOSAgID0gMHgwMDAwMDIwMCwKKwlIVF9NQ1MxMCA9IDB4MDAwMDA0MDAsCisJSFRfTUNTMTEgPSAweDAwMDAwODAwLAorCUhUX01DUzEyID0gMHgwMDAwMTAwMCwKKwlIVF9NQ1MxMyA9IDB4MDAwMDIwMDAsCisJSFRfTUNTMTQgPSAweDAwMDA0MDAwLAorCUhUX01DUzE1ID0gMHgwMDAwODAwMCwKKwkvLyBEbyBub3QgZGVmaW5lIE1DUzMyIGhlcmUgYWx0aG91Z2ggODE5MCBzdXBwb3J0IE1DUzMyCit9SFRfTUNTX1JBVEUsKlBIVF9NQ1NfUkFURTsKKworLy8KKy8vIFJlcHJlc2VudCBDaGFubmVsIFdpZHRoIGluIEhUIENhcGFiaWxpdGllcworLy8KK3R5cGVkZWYgZW51bSBfSFRfQ0hBTk5FTF9XSURUSHsKKwlIVF9DSEFOTkVMX1dJRFRIXzIwID0gMCwKKwlIVF9DSEFOTkVMX1dJRFRIXzIwXzQwID0gMSwKK31IVF9DSEFOTkVMX1dJRFRILCAqUEhUX0NIQU5ORUxfV0lEVEg7CisKKy8vCisvLyBSZXByZXNlbnQgRXh0ZW50aW9uIENoYW5uZWwgT2Zmc2V0IGluIEhUIENhcGFiaWxpdGllcworLy8gVGhpcyBpcyBhdmFpbGFibGUgb25seSBpbiA0ME1oeiBtb2RlLgorLy8KK3R5cGVkZWYgZW51bSBfSFRfRVhUQ0hOTF9PRkZTRVR7CisJSFRfRVhUQ0hOTF9PRkZTRVRfTk9fRVhUID0gMCwKKwlIVF9FWFRDSE5MX09GRlNFVF9VUFBFUiA9IDEsCisJSFRfRVhUQ0hOTF9PRkZTRVRfTk9fREVGID0gMiwKKwlIVF9FWFRDSE5MX09GRlNFVF9MT1dFUiA9IDMsCit9SFRfRVhUQ0hOTF9PRkZTRVQsICpQSFRfRVhUQ0hOTF9PRkZTRVQ7CisKK3R5cGVkZWYgZW51bSBfQ0hOTE9QeworCUNITkxPUF9OT05FID0gMCwgLy8gTm8gQWN0aW9uIG5vdworCUNITkxPUF9TQ0FOID0gMSwgLy8gU2NhbiBpbiBwcm9ncmVzcworCUNITkxPUF9TV0JXID0gMiwgLy8gQmFuZHdpZHRoIHN3aXRjaGluZyBpbiBwcm9ncmVzcworCUNITkxPUF9TV0NITkwgPSAzLCAvLyBTb2Z0d2FyZSBDaGFubmVsIHN3aXRjaGluZyBpbiBwcm9ncmVzcworfSBDSE5MT1AsICpQQ0hOTE9QOworCisvLyBEZXRlcm1pbmUgaWYgdGhlIENoYW5uZWwgT3BlcmF0aW9uIGlzIGluIHByb2dyZXNzCisjZGVmaW5lIENISExPUF9JTl9QUk9HUkVTUyhfcEhUSW5mbykJXAorCQkoKF9wSFRJbmZvKS0+Q2hubE9wID4gQ0hOTE9QX05PTkUpID8gVFJVRSA6IEZBTFNFCisKKy8qCit0eXBlZGVmCXVuaW9uIF9IVF9DQVBBQklMSVRZeworCXUxNglTaG9ydERhdGE7CisJdTgJQ2hhckRhdGFbMl07CisJc3RydWN0CisJeworCQl1MTYJQWR2Q29kaW5nOjE7CisJCXUxNglDaGxXaWR0aDoxOworCQl1MTYJTWltb1B3clNhdmU6MjsKKwkJdTE2CUdyZWVuRmllbGQ6MTsKKwkJdTE2CVNob3J0R0kyME1oejoxOworCQl1MTYJU2hvcnRHSTQwTWh6OjE7CisJCXUxNglTVEJDOjE7CisJCXUxNglCZWFtRm9ybToxOworCQl1MTYJRGVsYXlCQToxOworCQl1MTYJTWF4QU1TRFVTaXplOjE7CisJCXUxNglEc3NDQ2s6MTsKKwkJdTE2CVBTTVA6MTsKKwkJdTE2CVJzdmQ6MzsKKwl9RmllbGQ7Cit9SFRfQ0FQQUJJTElUWSwgKlBIVF9DQVBBQklMSVRZOworCit0eXBlZGVmCXVuaW9uIF9IVF9DQVBBQklMSVRZX01BQ1BBUkF7CisJdTgJU2hvcnREYXRhOworCXU4CUNoYXJEYXRhWzFdOworCXN0cnVjdAorCXsKKwkJdTgJTWF4UnhBTVBEVToyOworCQl1OAlNUERVRGVuc2l0eToyOworCQl1OAlSc3ZkOjQ7CisJfUZpZWxkOworfUhUX0NBUEFCSUxJVFlfTUFDUEFSQSwgKlBIVF9DQVBBQklMSVRZX01BQ1BBUkE7CisqLworCit0eXBlZGVmIGVudW0gX0hUX0FDVElPTnsKKwlBQ1RfUkVDT01NQU5EX1dJRFRICQk9IDAsCisJQUNUX01JTU9fUFdSX1NBVkUgCQk9IDEsCisJQUNUX1BTTVAJCQkJCT0gMiwKKwlBQ1RfU0VUX1BDT19QSEFTRQkJPSAzLAorCUFDVF9NSU1PX0NITF9NRUFTVVJFCT0gNCwKKwlBQ1RfUkVDSVBST0NJVFlfQ09SUkVDVAk9IDUsCisJQUNUX01JTU9fQ1NJX01BVFJJQ1MJCT0gNiwKKwlBQ1RfTUlNT19OT0NPTVBSX1NURUVSCT0gNywKKwlBQ1RfTUlNT19DT01QUl9TVEVFUgkJPSA4LAorCUFDVF9BTlRFTk5BX1NFTEVDVAkJPSA5LAorfSBIVF9BQ1RJT04sICpQSFRfQUNUSU9OOworCisKKy8qIDIwMDcvMDYvMDcgTUggRGVmaW5lIHN1Yi1jYXJyaWVyIG1vZGUgZm9yIDQwTUhaLiAqLwordHlwZWRlZiBlbnVtIF9IVF9CYW5kd2lkdGhfNDBNSFpfU3ViX0NhcnJpZXJ7CisJU0NfTU9ERV9EVVBMSUNBVEUgPSAwLAorCVNDX01PREVfTE9XRVIgPSAxLAorCVNDX01PREVfVVBQRVIgPSAyLAorCVNDX01PREVfRlVMTDQwTUhaID0gMywKK31IVF9CVzQwX1NDX0U7CisKK3R5cGVkZWYJc3RydWN0IF9IVF9DQVBBQklMSVRZX0VMRXsKKworCS8vSFQgY2FwYWJpbGl0eSBpbmZvCisJdTgJQWR2Q29kaW5nOjE7CisJdTgJQ2hsV2lkdGg6MTsKKwl1OAlNaW1vUHdyU2F2ZToyOworCXU4CUdyZWVuRmllbGQ6MTsKKwl1OAlTaG9ydEdJMjBNaHo6MTsKKwl1OAlTaG9ydEdJNDBNaHo6MTsKKwl1OAlUeFNUQkM6MTsKKwl1OAlSeFNUQkM6MjsKKwl1OAlEZWxheUJBOjE7CisJdTgJTWF4QU1TRFVTaXplOjE7CisJdTgJRHNzQ0NrOjE7CisJdTgJUFNNUDoxOworCXU4CVJzdmQxOjE7CisJdTgJTFNpZ1R4b3BQcm90ZWN0OjE7CisKKwkvL01BQyBIVCBwYXJhbWV0ZXJzIGluZm8KKwl1OAlNYXhSeEFNUERVRmFjdG9yOjI7CisJdTgJTVBEVURlbnNpdHk6MzsKKwl1OAlSc3ZkMjozOworCisJLy9TdXBwb3J0ZWQgTUNTIHNldAorCXU4CU1DU1sxNl07CisKKworCS8vRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0eSBJbmZvCisJdTE2CUV4dEhUQ2FwSW5mbzsKKworCS8vVFhCRiBDYXBhYmlsaXRpZXMKKwl1OAlUeEJGQ2FwWzRdOworCisJLy9BbnRlbm5hIFNlbGVjdGlvbiBDYXBhYmlsaXRpZXMKKwl1OAlBU0NhcDsKKworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgSFRfQ0FQQUJJTElUWV9FTEUsICpQSFRfQ0FQQUJJTElUWV9FTEU7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgSFQgSW5mb3JtYXRpb24gZWxlbWVudCBpcyBwcmVzZW50IGluIGJlYWNvbnMKKy8vIE9ubHkgQVAgaXMgcmVxdWlyZWQgdG8gaW5jbHVkZSB0aGlzIGVsZW1lbnQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IF9IVF9JTkZPUk1BVElPTl9FTEV7CisJdTgJQ29udHJvbENobDsKKworCXU4CUV4dENobE9mZnNldDoyOworCXU4CVJlY29tbWVtZGVkVHhXaWR0aDoxOworCXU4CVJJRlM6MTsKKwl1OAlQU01QQWNjZXNzT25seToxOworCXU4CVNydkludEdyYW51bGFyaXR5OjM7CisKKwl1OAlPcHRNb2RlOjI7CisJdTgJTm9uR0ZEZXZQcmVzZW50OjE7CisJdTgJUmV2ZDE6NTsKKwl1OAlSZXZkMjo4OworCisJdTgJUnN2ZDM6NjsKKwl1OAlEdWFsQmVhY29uOjE7CisJdTgJRHVhbENUU1Byb3RlY3Q6MTsKKworCXU4CVNlY29uZGFyeUJlYWNvbjoxOworCXU4CUxTaWdUeG9wUHJvdGVjdEZ1bGw6MTsKKwl1OAlQY29BY3RpdmU6MTsKKwl1OAlQY29QaGFzZToxOworCXU4CVJzdmQ0OjQ7CisKKwl1OAlCYXNpY01TQ1sxNl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBIVF9JTkZPUk1BVElPTl9FTEUsICpQSFRfSU5GT1JNQVRJT05fRUxFOworCisvLworLy8gTUlNTyBQb3dlciBTYXZlIGNvbnRyb2wgZmllbGQuCisvLyBUaGlzIGlzIGFwcGVhciBpbiBNSU1PIFBvd2VyIFNhdmUgQWN0aW9uIEZyYW1lCisvLwordHlwZWRlZiBzdHJ1Y3QgX01JTU9QU19DVFJMeworCXU4CU1pbW9Qc0VuYWJsZToxOworCXU4CU1pbW9Qc01vZGU6MTsKKwl1OAlSZXNlcnZlZDo2OworfSBNSU1PUFNfQ1RSTCwgKlBNSU1PUFNfQ1RSTDsKKwordHlwZWRlZiBlbnVtIF9IVF9TUEVDX1ZFUnsKKwlIVF9TUEVDX1ZFUl9JRUVFID0gMCwKKwlIVF9TUEVDX1ZFUl9FV0MgPSAxLAorfUhUX1NQRUNfVkVSLCAqUEhUX1NQRUNfVkVSOworCit0eXBlZGVmIGVudW0gX0hUX0FHR1JFX01PREVfRXsKKwlIVF9BR0dfQVVUTyA9IDAsCisJSFRfQUdHX0ZPUkNFX0VOQUJMRSA9IDEsCisJSFRfQUdHX0ZPUkNFX0RJU0FCTEUgPSAyLAorfUhUX0FHR1JFX01PREVfRSwgKlBIVF9BR0dSRV9NT0RFX0U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgVGhlIERhdGEgc3RydWN0dXJlIGlzIHVzZWQgdG8ga2VlcCBIVCByZWxhdGVkIHZhcmlhYmxlcyB3aGVuIGNhcmQgaXMKKy8vICBjb25maWd1cmVkIGFzIG5vbi1BUCBTVEEgbW9kZS4gICoqTm90ZSoqICBDdXJyZW50X3h4eCBzaG91bGQgYmUgc2V0CisvLwl0byBkZWZhdWx0IHZhbHVlIGluIEhUSW5pdGlhbGl6ZUhUSW5mbygpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCBfUlRfSElHSF9USFJPVUdIUFVUeworCXU4CQkJCWJFbmFibGVIVDsKKwl1OAkJCQliQ3VycmVudEhUU3VwcG9ydDsKKworCXU4CQkJCWJSZWdCVzQwTUh6OwkJCQkvLyBUeCA0ME1IeiBjaGFubmVsIGNhcGFibGl0eQorCXU4CQkJCWJDdXJCVzQwTUh6OwkJCQkvLyBUeCA0ME1IeiBjaGFubmVsIGNhcGFiaWxpdHkKKworCXU4CQkJCWJSZWdTaG9ydEdJNDBNSHo7CQkJLy8gVHggU2hvcnQgR0kgZm9yIDQwTWh6CisJdTgJCQkJYkN1clNob3J0R0k0ME1IejsJCQkvLyBUeCBTaG9ydCBHSSBmb3IgNDBNSHoKKworCXU4CQkJCWJSZWdTaG9ydEdJMjBNSHo7CQkJLy8gVHggU2hvcnQgR0kgZm9yIDIwTUh6CisJdTgJCQkJYkN1clNob3J0R0kyME1IejsJCQkvLyBUeCBTaG9ydCBHSSBmb3IgMjBNSHoKKworCXU4CQkJCWJSZWdTdXBwQ0NLOwkJCQkvLyBUeCBDQ0sgcmF0ZSBjYXBhYmlsaXR5CisJdTgJCQkJYkN1clN1cHBDQ0s7CQkJCS8vIFR4IENDSyByYXRlIGNhcGFiaWxpdHkKKworCS8vIDgwMi4xMW4gc3BlYyB2ZXJzaW9uIGZvciAicGVlciIKKwlIVF9TUEVDX1ZFUgkJCWVQZWVySFRTcGVjVmVyOworCisKKwkvLyBIVCByZWxhdGVkIGluZm9ybWF0aW9uIGZvciAiU2VsZiIKKwlIVF9DQVBBQklMSVRZX0VMRQlTZWxmSFRDYXA7CQkvLyBUaGlzIGlzIEhUIGNhcCBlbGVtZW50IHNlbnQgdG8gcGVlciBTVEEsIHdoaWNoIGFsc28gaW5kaWNhdGUgSFQgUnggY2FwYWJpbGl0aWVzLgorCUhUX0lORk9STUFUSU9OX0VMRQlTZWxmSFRJbmZvOwkJLy8gVGhpcyBpcyBIVCBpbmZvIGVsZW1lbnQgc2VudCB0byBwZWVyIFNUQSwgd2hpY2ggYWxzbyBpbmRpY2F0ZSBIVCBSeCBjYXBhYmlsaXRpZXMuCisKKwkvLyBIVCByZWxhdGVkIGluZm9ybWF0aW9uIGZvciAiUGVlciIKKwl1OAkJCQlQZWVySFRDYXBCdWZbMzJdOworCXU4CQkJCVBlZXJIVEluZm9CdWZbMzJdOworCisKKwkvLyBBLU1TRFUgcmVsYXRlZAorCXU4CQkJCWJBTVNEVV9TdXBwb3J0OwkJCS8vIFRoaXMgaW5kaWNhdGVzIFR4IEEtTVNEVSBjYXBhYmlsaXR5CisJdTE2CQkJCW5BTVNEVV9NYXhTaXplOwkJCS8vIFRoaXMgaW5kaWNhdGVzIFR4IEEtTVNEVSBjYXBhYmlsaXR5CisJdTgJCQkJYkN1cnJlbnRfQU1TRFVfU3VwcG9ydDsJLy8gVGhpcyBpbmRpY2F0ZXMgVHggQS1NU0RVIGNhcGFiaWxpdHkKKwl1MTYJCQkJbkN1cnJlbnRfQU1TRFVfTWF4U2l6ZTsJLy8gVGhpcyBpbmRpY2F0ZXMgVHggQS1NU0RVIGNhcGFiaWxpdHkKKworCisJLy8gQU1QRFUgIHJlbGF0ZWQgPDIwMDYuMDguMTAgRW1pbHk+CisJdTgJCQkJYkFNUERVRW5hYmxlOwkJCQkvLyBUaGlzIGluZGljYXRlIFR4IEEtTVBEVSBjYXBhYmlsaXR5CisJdTgJCQkJYkN1cnJlbnRBTVBEVUVuYWJsZTsJCS8vIFRoaXMgaW5kaWNhdGUgVHggQS1NUERVIGNhcGFiaWxpdHkKKwl1OAkJCQlBTVBEVV9GYWN0b3I7CQkJCS8vIFRoaXMgaW5kaWNhdGUgVHggQS1NUERVIGNhcGFiaWxpdHkKKwl1OAkJCQlDdXJyZW50QU1QRFVGYWN0b3I7CQkvLyBUaGlzIGluZGljYXRlIFR4IEEtTVBEVSBjYXBhYmlsaXR5CisJdTgJCQkJTVBEVV9EZW5zaXR5OwkJCQkvLyBUaGlzIGluZGljYXRlIFR4IEEtTVBEVSBjYXBhYmlsaXR5CisJdTgJCQkJQ3VycmVudE1QRFVEZW5zaXR5OwkJCS8vIFRoaXMgaW5kaWNhdGUgVHggQS1NUERVIGNhcGFiaWxpdHkKKworCS8vIEZvcmNlZCBBLU1QRFUgZW5hYmxlCisJSFRfQUdHUkVfTU9ERV9FCUZvcmNlZEFNUERVTW9kZTsKKwl1OAkJCQlGb3JjZWRBTVBEVUZhY3RvcjsKKwl1OAkJCQlGb3JjZWRNUERVRGVuc2l0eTsKKworCS8vIEZvcmNlZCBBLU1TRFUgZW5hYmxlCisJSFRfQUdHUkVfTU9ERV9FCUZvcmNlZEFNU0RVTW9kZTsKKwl1MTYJCQkJRm9yY2VkQU1TRFVNYXhTaXplOworCisJdTgJCQkJYkZvcmNlZFNob3J0R0k7CisKKwl1OAkJCQlDdXJyZW50T3BNb2RlOworCisJLy8gTUlNTyBQUyByZWxhdGVkCisJdTgJCQkJU2VsZk1pbW9QczsKKwl1OAkJCQlQZWVyTWltb1BzOworCisJLy8gNDBNSHogQ2hhbm5lbCBPZmZzZXQgc2V0dGluZ3MuCisJSFRfRVhUQ0hOTF9PRkZTRVQJQ3VyU1RBRXh0Q2hubE9mZnNldDsKKwl1OAkJCQliQ3VyVHhCVzQwTUh6OwkvLyBJZiB3ZSB1c2UgNDAgTUh6IHRvIFR4CisJdTgJCQkJUGVlckJhbmR3aWR0aDsKKworCS8vIEZvciBCYW5kd2lkdGggU3dpdGNoaW5nCisJdTgJCQkJYlN3QndJblByb2dyZXNzOworCUNITkxPUAkJCQlDaG5sT3A7IC8vIHNvZnR3YXJlIHN3aXRjaGluZyBjaGFubmVsIGluIHByb2dyZXNzLiBCeSBCcnVjZSwgMjAwOC0wMi0xNS4KKwl1OAkJCQlTd0J3U3RlcDsKKwkvL3N0cnVjdCB0aW1lcl9saXN0CQlTd0J3VGltZXI7ICAvL21vdmVkIHRvIGllZWU4MDIxMV9kZXZpY2UuIGFzIHRpbWVyX2xpc3QgbmVlZCBpbmNsdWRlIHNvbWUgaGVhZGVyIGZpbGUgaGVyZS4KKworCS8vIEZvciBSZWFsdGVrIHByb3ByaWV0YXJ5IEEtTVBEVSBmYWN0b3IgZm9yIGFnZ3JlZ2F0aW9uCisJdTgJCQkJYlJlZ1JUMlJUQWdncmVnYXRpb247CisJdTgJCQkJYkN1cnJlbnRSVDJSVEFnZ3JlZ2F0aW9uOworCXU4CQkJCWJDdXJyZW50UlQyUlRMb25nU2xvdFRpbWU7CisJdTgJCQkJc3pSVDJSVEFnZ0J1ZmZlclsxMF07CisKKwkvLyBSeCBSZW9yZGVyIGNvbnRyb2wKKwl1OAkJCQliUmVnUnhSZW9yZGVyRW5hYmxlOworCXU4CQkJCWJDdXJSeFJlb3JkZXJFbmFibGU7CisJdTgJCQkJUnhSZW9yZGVyV2luU2l6ZTsKKwl1OAkJCQlSeFJlb3JkZXJQZW5kaW5nVGltZTsKKwl1MTYJCQkJUnhSZW9yZGVyRHJvcENvdW50ZXI7CisKKyNpZmRlZiBVU0JfVFhfRFJJVkVSX0FHR1JFR0FUSU9OX0VOQUJMRQorCXU4CQkJCVVzYlR4QWdnck51bTsKKyNlbmRpZgorI2lmZGVmIFVTQl9SWF9BR0dSRUdBVElPTl9TVVBQT1JUCisJdTgJCQkJVXNiUnhGd0FnZ3JFbjsKKwl1OAkJCQlVc2JSeEZ3QWdnclBhZ2VOdW07CisJdTgJCQkJVXNiUnhGd0FnZ3JQYWNrZXROdW07CisJdTgJCQkJVXNiUnhGd0FnZ3JUaW1lb3V0OworI2VuZGlmCisKKwkvLyBBZGQgZm9yIEJyb2FkY29tKExpbmtzeXMpIElPVC4gSm9zZXBoCisJdTgJCQkJYklzUGVlckJjbTsKKworCS8vIEZvciBJT1QgaXNzdWUuCisJdTgJCQkJSU9UUGVlcjsKKwl1MzIJCQkJSU9UQWN0aW9uOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgUlRfSElHSF9USFJPVUdIUFVULCAqUFJUX0hJR0hfVEhST1VHSFBVVDsKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGhlIERhdGEgc3RydWN0dXJlIGlzIHVzZWQgdG8ga2VlcCBIVCByZWxhdGVkIHZhcmlhYmxlIGZvciAiZWFjaCBTdGEiCisvLyB3aGVuIGNhcmQgaXMgY29uZmlndXJlZCBhcyAiQVAgbW9kZSIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IF9SVF9IVElORk9fU1RBX0VOVFJZeworCXU4CQkJYkVuYWJsZUhUOworCisJdTgJCQliU3VwcG9ydENjazsKKworCXUxNgkJCUFNU0RVX01heFNpemU7CisKKwl1OAkJCUFNUERVX0ZhY3RvcjsKKwl1OAkJCU1QRFVfRGVuc2l0eTsKKworCXU4CQkJSFRIaWdoZXN0T3BlcmFSYXRlOworCisJdTgJCQliQnc0ME1IejsKKworCXU4CQkJTWltb1BzOworCisJdTgJCQlNY3NSYXRlU2V0WzE2XTsKKworCit9UlRfSFRJTkZPX1NUQV9FTlRSWSwgKlBSVF9IVElORk9fU1RBX0VOVFJZOworCisKKworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgRGF0YSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBrZWVwIEhUIHJlbGF0ZWQgdmFyaWFibGUgZm9yICJlYWNoIEFQIgorLy8gd2hlbiBjYXJkIGlzIGNvbmZpZ3VyZWQgYXMgIlNUQSBtb2RlIgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgX0JTU19IVHsKKworCXU4CQkJCWJkU3VwcG9ydEhUOworCisJLy8gSFQgcmVsYXRlZCBlbGVtZW50cworCXU4CQkJCQliZEhUQ2FwQnVmWzMyXTsKKwl1MTYJCQkJCWJkSFRDYXBMZW47CisJdTgJCQkJCWJkSFRJbmZvQnVmWzMyXTsKKwl1MTYJCQkJCWJkSFRJbmZvTGVuOworCisJSFRfU1BFQ19WRVIJCQkJYmRIVFNwZWNWZXI7CisJLy9IVF9DQVBBQklMSVRZX0VMRQkJCWJkSFRDYXBFbGU7CisJLy9IVF9JTkZPUk1BVElPTl9FTEUJCWJkSFRJbmZvRWxlOworCisJdTgJCQkJCWJkUlQyUlRBZ2dyZWdhdGlvbjsKKwl1OAkJCQkJYmRSVDJSVExvbmdTbG90VGltZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIEJTU19IVCwgKlBCU1NfSFQ7CisKK3R5cGVkZWYgc3RydWN0IF9NSU1PX1JTU0l7CisJdTMyCUVuYWJsZUFudGVubmE7CisJdTMyCUFudGVubmFBOworCXUzMiAJQW50ZW5uYUI7CisJdTMyIAlBbnRlbm5hQzsKKwl1MzIgCUFudGVubmFEOworCXUzMglBdmVyYWdlOworfU1JTU9fUlNTSSwgKlBNSU1PX1JTU0k7CisKK3R5cGVkZWYgc3RydWN0IF9NSU1PX0VWTXsKKwl1MzIJRVZNMTsKKwl1MzIgICAgRVZNMjsKK31NSU1PX0VWTSwgKlBNSU1PX0VWTTsKKwordHlwZWRlZiBzdHJ1Y3QgX0ZBTFNFX0FMQVJNX1NUQVRJU1RJQ1N7CisJdTMyCUNudF9QYXJpdHlfRmFpbDsKKwl1MzIgICAgQ250X1JhdGVfSWxsZWdhbDsKKwl1MzIJQ250X0NyYzhfZmFpbDsKKwl1MzIJQ250X2FsbDsKK31GQUxTRV9BTEFSTV9TVEFUSVNUSUNTLCAqUEZBTFNFX0FMQVJNX1NUQVRJU1RJQ1M7CisKKworZXh0ZXJuIHU4IE1DU19GSUxURVJfQUxMWzE2XTsKK2V4dGVybiB1OCBNQ1NfRklMVEVSXzFTU1sxNl07CisKKy8qIDIwMDcvMDcvMTEgTUggTW9kaWZ5IHRoZSBtYWNyby4gQmVjYXVzIFNUQSBtYXkgbGluayB3aXRoIGEgTi1BUC4gSWYgd2Ugc2V0CisgICBTVEEgaW4gQS9CL0cgbW9kZSBhbmQgQVAgaXMgc3RpbGwgaW4gTiBtb2RlLiBUaGUgbWFjcm8gd2lsbCBiZSB3cm9uZy4gV2UgaGF2ZQorICAgdG8gYWRkIGEgbWFjcm8gdG8ganVkZ2Ugd2lyZWxlc3MgbW9kZS4gKi8KKyNkZWZpbmUgUElDS19SQVRFKF9uTGVnYWN5UmF0ZSwgX25NY3NSYXRlKQlcCisJCShfbk1jc1JhdGU9PTApPyhfbkxlZ2FjeVJhdGUmMHg3Zik6KF9uTWNzUmF0ZSkKKy8qIDIwMDcvMDcvMTIgTUggV2Ugb25seSBkZWZpbmUgbGVnYWN5IGFuZCBIVCB3aXJlbGVzcyBtb2RlIG5vdy4gKi8KKyNkZWZpbmUJTEVHQUNZX1dJUkVMRVNTX01PREUJSUVFRV9NT0RFX01BU0sKKworI2RlZmluZSBDVVJSRU5UX1JBVEUoV2lyZWxlc3NNb2RlLCBMZWdhY3lSYXRlLCBIVFJhdGUpCVwKKwkJCQkJKChXaXJlbGVzc01vZGUgJiAoTEVHQUNZX1dJUkVMRVNTX01PREUpKSE9MCk/XAorCQkJCQkJKExlZ2FjeVJhdGUpOlwKKwkJCQkJCShQSUNLX1JBVEUoTGVnYWN5UmF0ZSwgSFRSYXRlKSkKKworCisKKy8vIE1DUyBCdyA0MCB7MX43LCAxMn4xNSwzMn0KKyNkZWZpbmUJUkFURV9BRFBUXzFTU19NQVNLIAkJMHhGRgorI2RlZmluZQlSQVRFX0FEUFRfMlNTX01BU0sJCTB4RjAgLy9Ta2lwIE1DUzh+MTEgYmVjYXVzZSBtY3M3ID4gbWNzNiwgOSwgMTAsIDExLiAyMDA3LjAxLjE2IGJ5IEVtaWx5CisjZGVmaW5lCVJBVEVfQURQVF9NQ1MzMl9NQVNLCQkweDAxCisKKyNkZWZpbmUgCUlTXzExTl9NQ1NfUkFURShyYXRlKQkJKHJhdGUmMHg4MCkKKwordHlwZWRlZiBlbnVtIF9IVF9BR0dSRV9TSVpFeworCUhUX0FHR19TSVpFXzhLID0gMCwKKwlIVF9BR0dfU0laRV8xNksgPSAxLAorCUhUX0FHR19TSVpFXzMySyA9IDIsCisJSFRfQUdHX1NJWkVfNjRLID0gMywKK31IVF9BR0dSRV9TSVpFX0UsICpQSFRfQUdHUkVfU0laRV9FOworCisvKiBJbmRpY2F0ZSBkaWZmZXJlbnQgQVAgdmVuZG9yIGZvciBJT1QgaXNzdWUgKi8KK3R5cGVkZWYgZW51bSBfSFRfSU9UX1BFRVIKK3sKKwlIVF9JT1RfUEVFUl9VTktOT1dOID0gMCwKKwlIVF9JT1RfUEVFUl9SRUFMVEVLID0gMSwKKwlIVF9JT1RfUEVFUl9CUk9BRENPTSA9IDIsCisJSFRfSU9UX1BFRVJfUkFMSU5LID0gMywKKwlIVF9JT1RfUEVFUl9BVEhFUk9TID0gNCwKKwlIVF9JT1RfUEVFUl9DSVNDTz0gNSwKKwlIVF9JT1RfUEVFUl9NQVggPSA2Cit9SFRfSU9UX1BFRVJfRSwgKlBIVElPVF9QRUVSX0U7CisKKy8vCisvLyBJT1QgQWN0aW9uIGZvciBkaWZmZXJlbnQgQVAKKy8vCit0eXBlZGVmIGVudW0gX0hUX0lPVF9BQ1RJT057CisJSFRfSU9UX0FDVF9UWF9VU0VfQU1TRFVfNEsgPSAweDAwMDAwMDAxLAorCUhUX0lPVF9BQ1RfVFhfVVNFX0FNU0RVXzhLID0gMHgwMDAwMDAwMiwKKwlIVF9JT1RfQUNUX0RJU0FCTEVfTUNTMTQgPSAweDAwMDAwMDA0LAorCUhUX0lPVF9BQ1RfRElTQUJMRV9NQ1MxNSA9IDB4MDAwMDAwMDgsCisJSFRfSU9UX0FDVF9ESVNBQkxFX0FMTF8yU1MgPSAweDAwMDAwMDEwLAorCUhUX0lPVF9BQ1RfRElTQUJMRV9FRENBX1RVUkJPID0gMHgwMDAwMDAyMCwKKwlIVF9JT1RfQUNUX01HTlRfVVNFX0NDS182TSA9IDB4MDAwMDAwNDAsCisJSFRfSU9UX0FDVF9DRERfRlNZTkMgPSAweDAwMDAwMDgwLAorCUhUX0lPVF9BQ1RfUFVSRV9OX01PREUgPSAweDAwMDAwMTAwLAorCUhUX0lPVF9BQ1RfRk9SQ0VEX0NUUzJTRUxGID0gMHgwMDAwMDIwMCwKK31IVF9JT1RfQUNUSU9OX0UsICpQSFRfSU9UX0FDVElPTl9FOworCisjZW5kaWYgLy9fUlRMODE5WFVfSFRUWVBFX0hfCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9IVFByb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9IVFByb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzRlYjM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0hUUHJvYy5jCkBAIC0wLDAgKzEsMTQ2MiBAQAorCisvL0FzIHRoaXMgZnVuY3Rpb24gaXMgbWFpbmx5IHBvcnRlZCBmcm9tIFdpbmRvd3MgZHJpdmVyLCBzbyBsZWF2ZSB0aGUgbmFtZSBsaXR0bGUgY2hhbmdlZC4gSWYgYW55IGNvbmZ1c2lvbiBjYXVzZWQsIHRlbGwgbWUuIENyZWF0ZWQgYnkgV0IuIDIwMDguMDUuMDgKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKyNpbmNsdWRlICJydGw4MTl4X0hULmgiCit1OCBNQ1NfRklMVEVSX0FMTFsxNl0gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgxZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisKK3U4IE1DU19GSUxURVJfMVNTWzE2XSA9IHsweGZmLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKwordTE2IE1DU19EQVRBX1JBVEVbMl1bMl1bNzddID0KKwl7CXsJezEzLCAyNiwgMzksIDUyLCA3OCwgMTA0LCAxMTcsIDEzMCwgMjYsIDUyLCA3OCAsMTA0LCAxNTYsIDIwOCwgMjM0LCAyNjAsCisJCQkzOSwgNzgsIDExNywgMjM0LCAzMTIsIDM1MSwgMzkwLCA1MiwgMTA0LCAxNTYsIDIwOCwgMzEyLCA0MTYsIDQ2OCwgNTIwLAorCQkJMCwgNzgsIDEwNCwgMTMwLCAxMTcsIDE1NiwgMTk1LCAxMDQsIDEzMCwgMTMwLCAxNTYsIDE4MiwgMTgyLCAyMDgsIDE1NiwgMTk1LAorCQkJMTk1LCAyMzQsIDI3MywgMjczLCAzMTIsIDEzMCwgMTU2LCAxODEsIDE1NiwgMTgxLCAyMDgsIDIzNCwgMjA4LCAyMzQsIDI2MCwgMjYwLAorCQkJMjg2LCAxOTUsIDIzNCwgMjczLCAyMzQsIDI3MywgMzEyLCAzNTEsIDMxMiwgMzUxLCAzOTAsIDM5MCwgNDI5fSwJCQkvLyBMb25nIEdJLCAyME1IegorCQkJezE0LCAyOSwgNDMsIDU4LCA4NywgMTE2LCAxMzAsIDE0NCwgMjksIDU4LCA4NywgMTE2LCAxNzMsIDIzMSwgMjYwLCAyODksCisJCQk0MywgODcsIDEzMCwgMTczLCAyNjAsIDM0NywgMzkwLCA0MzMsIDU4LCAxMTYsIDE3MywgMjMxLCAzNDcsIDQ2MiwgNTIwLCA1NzgsCisJCQkwLCA4NywgMTE2LCAxNDQsIDEzMCwgMTczLCAyMTcsIDExNiwgMTQ0LCAxNDQsIDE3MywgMjAyLCAyMDIsIDIzMSwgMTczLCAyMTcsCisJCQkyMTcsIDI2MCwgMzAzLCAzMDMsIDM0NywgMTQ0LCAxNzMsIDIwMiwgMTczLCAyMDIsIDIzMSwgMjYwLCAyMzEsIDI2MCwgMjg5LCAyODksCisJCQkzMTgsIDIxNywgMjYwLCAzMDMsIDI2MCwgMzAzLCAzNDcsIDM5MCwgMzQ3LCAzOTAsIDQzMywgNDMzLCA0Nzd9CX0sCQkvLyBTaG9ydCBHSSwgMjBNSHoKKwkJewl7MjcsIDU0LCA4MSwgMTA4LCAxNjIsIDIxNiwgMjQzLCAyNzAsIDU0LCAxMDgsIDE2MiwgMjE2LCAzMjQsIDQzMiwgNDg2LCA1NDAsCisJCQk4MSwgMTYyLCAyNDMsIDMyNCwgNDg2LCA2NDgsIDcyOSwgODEwLCAxMDgsIDIxNiwgMzI0LCA0MzIsIDY0OCwgODY0LCA5NzIsIDEwODAsCisJCQkxMiwgMTYyLCAyMTYsIDI3MCwgMjQzLCAzMjQsIDQwNSwgMjE2LCAyNzAsIDI3MCwgMzI0LCAzNzgsIDM3OCwgNDMyLCAzMjQsIDQwNSwKKwkJCTQwNSwgNDg2LCA1NjcsIDU2NywgNjQ4LCAyNzAsIDMyNCwgMzc4LCAzMjQsIDM3OCwgNDMyLCA0ODYsIDQzMiwgNDg2LCA1NDAsIDU0MCwKKwkJCTU5NCwgNDA1LCA0ODYsIDU2NywgNDg2LCA1NjcsIDY0OCwgNzI5LCA2NDgsIDcyOSwgODEwLCA4MTAsIDg5MX0sIAkvLyBMb25nIEdJLCA0ME1IegorCQkJezMwLCA2MCwgOTAsIDEyMCwgMTgwLCAyNDAsIDI3MCwgMzAwLCA2MCwgMTIwLCAxODAsIDI0MCwgMzYwLCA0ODAsIDU0MCwgNjAwLAorCQkJOTAsIDE4MCwgMjcwLCAzNjAsIDU0MCwgNzIwLCA4MTAsIDkwMCwgMTIwLCAyNDAsIDM2MCwgNDgwLCA3MjAsIDk2MCwgMTA4MCwgMTIwMCwKKwkJCTEzLCAxODAsIDI0MCwgMzAwLCAyNzAsIDM2MCwgNDUwLCAyNDAsIDMwMCwgMzAwLCAzNjAsIDQyMCwgNDIwLCA0ODAsIDM2MCwgNDUwLAorCQkJNDUwLCA1NDAsIDYzMCwgNjMwLCA3MjAsIDMwMCwgMzYwLCA0MjAsIDM2MCwgNDIwLCA0ODAsIDU0MCwgNDgwLCA1NDAsIDYwMCwgNjAwLAorCQkJNjYwLCA0NTAsIDU0MCwgNjMwLCA1NDAsIDYzMCwgNzIwLCA4MTAsIDcyMCwgODEwLCA5MDAsIDkwMCwgOTkwfQl9CS8vIFNob3J0IEdJLCA0ME1IegorCX07CisKK3N0YXRpYyB1OCBVTktOT1dOX0JPUkFEQ09NWzNdID0gezB4MDAsIDB4MTQsIDB4YmZ9Oworc3RhdGljIHU4IExJTktTWVNXUlQzMzBfTElOS1NZU1dSVDMwMF9CUk9BRENPTVszXSA9IHsweDAwLCAweDFhLCAweDcwfTsKK3N0YXRpYyB1OCBMSU5LU1lTV1JUMzUwX0xJTktTWVNXUlQxNTBfQlJPQURDT01bM10gPSB7MHgwMCwgMHgxZCwgMHg3ZX07CitzdGF0aWMgdTggTkVUR0VBUjgzNEJ2Ml9CUk9BRENPTVszXSA9IHsweDAwLCAweDFiLCAweDJmfTsKK3N0YXRpYyB1OCBCRUxLSU5GNUQ4MjMzVjFfUkFMSU5LWzNdID0gezB4MDAsIDB4MTcsIDB4M2Z9OwkvL2Nvc2EgMDMyMDIwMDgKK3N0YXRpYyB1OCBCRUxLSU5GNUQ4MjMzNFYzX1JBTElOS1szXSA9IHsweDAwLCAweDFjLCAweGRmfTsKK3N0YXRpYyB1OCBQQ0lfUkFMSU5LWzNdID0gezB4MDAsIDB4OTAsIDB4Y2N9Oworc3RhdGljIHU4IEVESU1BWF9SQUxJTktbM10gPSB7MHgwMCwgMHgwZSwgMHgyZX07CitzdGF0aWMgdTggQUlSTElOS19SQUxJTktbM10gPSB7MHgwMCwgMHgxOCwgMHgwMn07CisvL3N0YXRpYyB1OCBETElOS19BVEhFUk9TWzNdID0gezB4MDAsIDB4MWMsIDB4ZjB9Oworc3RhdGljIHU4IENJU0NPX0JST0FEQ09NWzNdID0gezB4MDAsIDB4MTcsIDB4OTR9OworCisvLyAyMDA4LzA0LzAxIE1IIEZvciBDaXNjbyBHIG1vZGUgUlggVFAgV2UgbmVlZCB0byBjaGFuZ2UgRlcgZHVyYXRpb24uIFNob3VkIHdlIHB1dCB0aGUKKy8vIGNvZGUgaW4gb3RoZXIgcGxhY2U/PworLy9zdGF0aWMgdTggV0lGSV9DSVNDT19HX0FQWzNdID0gezB4MDAsIDB4NDAsIDB4OTZ9OworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiB1cGRhdGUgZGVmYXVsdCBzZXR0aW5ncyBpbiBwSFRJbmZvIHN0cnVjdHVyZQorICogICBpbnB1dDogIFBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbworICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgbm90aWNlOiAgVGhlc2UgdmFsdWUgbmVlZCBiZSBtb2RpZmllZCBpZiBhbnkgY2hhbmdlcy4KKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIVFVwZGF0ZURlZmF1bHRTZXR0aW5nKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlKQoreworCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CisJLy9jb25zdCB0eXBlb2YoICgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKikwKS0+cEhUSW5mbyApICpfX21wdHIgPSAmcEhUSW5mbzsKKworCS8vcHJpbnRrKCJwSFRpbmZvOiVwLCAmcEhUaW5mbzolcCwgbXB0cjolcCwgIG9mZnNldG9mOiV4XG4iLCBwSFRJbmZvLCAmcEhUSW5mbywgX19tcHRyLCBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgcEhUSW5mbykpOworCS8vcHJpbnRrKCI9PT0+aWVlZTolcCxcbiIsIGllZWUpOworCS8vIFNob3J0R0kgc3VwcG9ydAorCXBIVEluZm8tPmJSZWdTaG9ydEdJMjBNSHo9IDE7CisJcEhUSW5mby0+YlJlZ1Nob3J0R0k0ME1Iej0gMTsKKworCS8vIDQwTUh6IGNoYW5uZWwgc3VwcG9ydAorCXBIVEluZm8tPmJSZWdCVzQwTUh6ID0gMTsKKworCS8vIENDSyByYXRlIHN1cHBvcnQgaW4gNDBNSHogY2hhbm5lbAorCWlmKHBIVEluZm8tPmJSZWdCVzQwTUh6KQorCQlwSFRJbmZvLT5iUmVnU3VwcENDSyA9IDE7CisJZWxzZQorCQlwSFRJbmZvLT5iUmVnU3VwcENDSyA9IHRydWU7CisKKwkvLyBBTVNEVSByZWxhdGVkCisJcEhUSW5mby0+bkFNU0RVX01heFNpemUgPSA3OTM1VUw7CisJcEhUSW5mby0+YkFNU0RVX1N1cHBvcnQgPSAwOworCisJLy8gQU1QRFUgcmVsYXRlZAorCXBIVEluZm8tPmJBTVBEVUVuYWJsZSA9IDE7CisJcEhUSW5mby0+QU1QRFVfRmFjdG9yID0gMjsgLy8vLyAwOiAybjEzKDhLKSwgMToybjE0KDE2SyksIDI6Mm4xNSgzMkspLCAzOjJuMTYoNjRrKQorCXBIVEluZm8tPk1QRFVfRGVuc2l0eSA9IDA7Ly8gMDogTm8gcmVzdHJpY3Rpb24sIDE6IDEvOHVzZWMsIDI6IDEvNHVzZWMsIDM6IDEvMnVzZWMsIDQ6IDF1c2VjLCA1OiAydXNlYywgNjogNHVzZWMsIDc6OHVzZWMKKworCS8vIE1JTU8gUG93ZXIgU2F2ZQorCXBIVEluZm8tPlNlbGZNaW1vUHMgPSAzOy8vIDA6IFN0YXRpYyBNaW1vIFBzLCAxOiBEeW5hbWljIE1pbW8gUHMsIDM6IE5vIExpbWl0YXRpb24sIDI6IFJlc2VydmVkKFNldCB0byAzIGF1dG9tYXRpY2FsbHkuKQorCWlmKHBIVEluZm8tPlNlbGZNaW1vUHMgPT0gMikKKwkJcEhUSW5mby0+U2VsZk1pbW9QcyA9IDM7CisJLy8gODE5MCBvbmx5LiBBc3NpZ24gcmF0ZSBvcGVyYXRpb24gbW9kZSB0byBmaXJtd2FyZQorCWllZWUtPmJUeERpc2FibGVSYXRlRmFsbEJhY2sgPSAwOworCWllZWUtPmJUeFVzZURyaXZlckFzc2luZ2VkUmF0ZSA9IDA7CisKKyNpZmRlZiAJVE9fRE9fTElTVAorCS8vIDgxOTAgb25seS4gQXNzaWduIGR1cmF0aW9uIG9wZXJhdGlvbiBtb2RlIHRvIGZpcm13YXJlCisJcE1nbnRJbmZvLT5iVHhFbmFibGVGd0NhbGNEdXIgPSAoQk9PTEVBTilwTmRpc0NvbW1vbi0+YlJlZ1R4RW5hYmxlRndDYWxjRHVyOworI2VuZGlmCisJLy8gODE5MCBvbmx5LCBSZWFsdGVrIHByb3ByaWV0YXJ5IGFnZ3JlZ2F0aW9uIG1vZGUKKwkvLyBTZXQgTVBEVURlbnNpdHk9MiwgICAxOiBTZXQgTVBEVURlbnNpdHk9MigzMmspICBmb3IgUmVhbHRlayBBUCBhbmQgc2V0IE1QRFVEZW5zaXR5PTAoOGspIGZvciBvdGhlcnMKKwlwSFRJbmZvLT5iUmVnUlQyUlRBZ2dyZWdhdGlvbiA9IDE7Ly8wOiBTZXQgTVBEVURlbnNpdHk9MiwgICAxOiBTZXQgTVBEVURlbnNpdHk9MigzMmspICBmb3IgUmVhbHRlayBBUCBhbmQgc2V0IE1QRFVEZW5zaXR5PTAoOGspIGZvciBvdGhlcnMKKworCS8vIEZvciBSeCBSZW9yZGVyIENvbnRyb2wKKwlwSFRJbmZvLT5iUmVnUnhSZW9yZGVyRW5hYmxlID0gMTsKKwlwSFRJbmZvLT5SeFJlb3JkZXJXaW5TaXplID0gNjQ7CisJcEhUSW5mby0+UnhSZW9yZGVyUGVuZGluZ1RpbWUgPSAzMDsKKworI2lmZGVmIFVTQl9UWF9EUklWRVJfQUdHUkVHQVRJT05fRU5BQkxFCisJcEhUSW5mby0+VXNiVHhBZ2dyTnVtID0gNDsKKyNlbmRpZgorI2lmZGVmIFVTQl9SWF9BR0dSRUdBVElPTl9TVVBQT1JUCisJcEhUSW5mby0+VXNiUnhGd0FnZ3JFbiA9IDE7CisJcEhUSW5mby0+VXNiUnhGd0FnZ3JQYWdlTnVtID0gMjQ7CisJcEhUSW5mby0+VXNiUnhGd0FnZ3JQYWNrZXROdW0gPSA4OworCXBIVEluZm8tPlVzYlJ4RndBZ2dyVGltZW91dCA9IDE2OyAvLy8vdXNiIHJ4IEZXIGFnZ3JlZ2F0aW9uIHRpbWVvdXQgdGhyZXNob2xkLkl0J3MgaW4gdW5pdHMgb2YgNjR1cworI2VuZGlmCisKKworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBwcmludCBvdXQgZWFjaCBmaWVsZCBvbiBIVCBjYXBhYmlsaXR5IElFIG1haW5seSBmcm9tIChCZWFjb24vUHJvYmVSc3AvQXNzb2NSZXEpCisgKiAgIGlucHV0OiAgdTgqCUNhcElFICAgICAgIC8vQ2FwYWJpbGl0eSBJRSB0byBiZSBwcmludGVkIG91dAorICogICAJICAgICB1OCogCVRpdGxlU3RyaW5nIC8vbWFpbmx5IHByaW50IG91dCBjYWxsZXIgZnVuY3Rpb24KKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgbm9uZQorICogIG5vdGljZTogIERyaXZlciBzaG91bGQgbm90IHByaW50IG91dCB0aGlzIG1lc3NhZ2UgYnkgZGVmYXVsdC4KKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIVERlYnVnSFRDYXBhYmlsaXR5KHU4KiBDYXBJRSwgdTgqIFRpdGxlU3RyaW5nICkKK3sKKworCXN0YXRpYyB1OAlFV0MxMU5IVENhcFtdID0gezB4MDAsIDB4OTAsIDB4NGMsIDB4MzN9OwkvLyBGb3IgMTFuIEVXQyBkZWZpbml0aW9uLCAyMDA3LjA3LjE3LCBieSBFbWlseQorCVBIVF9DQVBBQklMSVRZX0VMRSAJCXBDYXBFTEU7CisKKwlpZighbWVtY21wKENhcElFLCBFV0MxMU5IVENhcCwgc2l6ZW9mKEVXQzExTkhUQ2FwKSkpCisJeworCQkvL0VXQyBJRQorCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiRVdDIElFIGluICVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXBDYXBFTEUgPSAoUEhUX0NBUEFCSUxJVFlfRUxFKSgmQ2FwSUVbNF0pOworCX1lbHNlCisJCXBDYXBFTEUgPSAoUEhUX0NBUEFCSUxJVFlfRUxFKSgmQ2FwSUVbMF0pOworCisJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIjxMb2cgSFQgQ2FwYWJpbGl0eT4uIENhbGxlZCBieSAlc1xuIiwgVGl0bGVTdHJpbmcgKTsKKworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICAiXHRTdXBwb3J0ZWQgQ2hhbm5lbCBXaWR0aCA9ICVzXG4iLCAocENhcEVMRS0+Q2hsV2lkdGgpPyIyME1IeiI6ICIyMC80ME1IeiIpOworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICAiXHRTdXBwb3J0IFNob3J0IEdJIGZvciAyME0gPSAlc1xuIiwgKHBDYXBFTEUtPlNob3J0R0kyME1oeik/IllFUyI6ICJOTyIpOworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICAiXHRTdXBwb3J0IFNob3J0IEdJIGZvciA0ME0gPSAlc1xuIiwgKHBDYXBFTEUtPlNob3J0R0k0ME1oeik/IllFUyI6ICJOTyIpOworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICAiXHRTdXBwb3J0IFRYIFNUQkMgPSAlc1xuIiwgKHBDYXBFTEUtPlR4U1RCQyk/IllFUyI6ICJOTyIpOworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICAiXHRNYXggQU1TRFUgU2l6ZSA9ICVzXG4iLCAocENhcEVMRS0+TWF4QU1TRFVTaXplKT8iMzgzOSI6ICI3OTM1Iik7CisJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgICJcdFN1cHBvcnQgQ0NLIGluIDIwLzQwIG1vZGUgPSAlc1xuIiwgKHBDYXBFTEUtPkRzc0NDayk/IllFUyI6ICJOTyIpOworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICAiXHRNYXggQU1QRFUgRmFjdG9yID0gJWRcbiIsIHBDYXBFTEUtPk1heFJ4QU1QRFVGYWN0b3IpOworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICAiXHRNUERVIERlbnNpdHkgPSAlZFxuIiwgcENhcEVMRS0+TVBEVURlbnNpdHkpOworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICAiXHRNQ1MgUmF0ZSBTZXQgPSBbJXhdWyV4XVsleF1bJXhdWyV4XVxuIiwgcENhcEVMRS0+TUNTWzBdLFwKKwkJCQlwQ2FwRUxFLT5NQ1NbMV0sIHBDYXBFTEUtPk1DU1syXSwgcENhcEVMRS0+TUNTWzNdLCBwQ2FwRUxFLT5NQ1NbNF0pOworCXJldHVybjsKKworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBwcmludCBvdXQgZWFjaCBmaWVsZCBvbiBIVCBJbmZvcm1hdGlvbiBJRSBtYWlubHkgZnJvbSAoQmVhY29uL1Byb2JlUnNwKQorICogICBpbnB1dDogIHU4KglJbmZvSUUgICAgICAgLy9DYXBhYmlsaXR5IElFIHRvIGJlIHByaW50ZWQgb3V0CisgKiAgIAkgICAgIHU4KiAJVGl0bGVTdHJpbmcgLy9tYWlubHkgcHJpbnQgb3V0IGNhbGxlciBmdW5jdGlvbgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgbm90aWNlOiAgRHJpdmVyIHNob3VsZCBub3QgcHJpbnQgb3V0IHRoaXMgbWVzc2FnZSBieSBkZWZhdWx0LgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhURGVidWdIVEluZm8odTgqCUluZm9JRSwgdTgqIFRpdGxlU3RyaW5nKQoreworCisJc3RhdGljIHU4CUVXQzExTkhUSW5mb1tdID0gezB4MDAsIDB4OTAsIDB4NGMsIDB4MzR9OwkvLyBGb3IgMTFuIEVXQyBkZWZpbml0aW9uLCAyMDA3LjA3LjE3LCBieSBFbWlseQorCVBIVF9JTkZPUk1BVElPTl9FTEUJCXBIVEluZm9FbGU7CisKKwlpZighbWVtY21wKEluZm9JRSwgRVdDMTFOSFRJbmZvLCBzaXplb2YoRVdDMTFOSFRJbmZvKSkpCisJeworCQkvLyBOb3QgRVdDIElFCisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICJFV0MgSUUgaW4gJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcEhUSW5mb0VsZSA9IChQSFRfSU5GT1JNQVRJT05fRUxFKSgmSW5mb0lFWzRdKTsKKwl9ZWxzZQorCQlwSFRJbmZvRWxlID0gKFBIVF9JTkZPUk1BVElPTl9FTEUpKCZJbmZvSUVbMF0pOworCisKKwlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiPExvZyBIVCBJbmZvcm1hdGlvbiBFbGVtZW50Pi4gQ2FsbGVkIGJ5ICVzXG4iLCBUaXRsZVN0cmluZyk7CisKKwlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiXHRQcmltYXJ5IGNoYW5uZWwgPSAlZFxuIiwgcEhUSW5mb0VsZS0+Q29udHJvbENobCk7CisJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIlx0U2Vub25kYXJ5IGNoYW5uZWwgPSIpOworCXN3aXRjaChwSFRJbmZvRWxlLT5FeHRDaGxPZmZzZXQpCisJeworCQljYXNlIDA6CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiTm90IFByZXNlbnRcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICJVcHBlciBjaGFubmVsXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiUmVzZXJ2ZWQuIEVvb3JvISEhXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiTG93ZXIgQ2hhbm5lbFxuIik7CisJCQlicmVhazsKKwl9CisJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIlx0UmVjb21tZW5kZWQgY2hhbm5lbCB3aWR0aCA9ICVzXG4iLCAocEhUSW5mb0VsZS0+UmVjb21tZW1kZWRUeFdpZHRoKT8iMjBNaHoiOiAiNDBNaHoiKTsKKworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICJcdE9wZXJhdGlvbiBtb2RlIGZvciBwcm90ZWN0aW9uID0gIik7CisJc3dpdGNoKHBIVEluZm9FbGUtPk9wdE1vZGUpCisJeworCQljYXNlIDA6CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiTm8gUHJvdGVjdGlvblxuIik7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIkhUIG5vbi1tZW1iZXIgcHJvdGVjdGlvbiBtb2RlXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiU3VnZ2VzdCB0byBvcGVuIHByb3RlY3Rpb25cbiIpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICJIVCBtaXhlZCBtb2RlXG4iKTsKKwkJCWJyZWFrOworCX0KKworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICJcdEJhc2ljIE1DUyBSYXRlIFNldCA9IFsleF1bJXhdWyV4XVsleF1bJXhdXG4iLCBwSFRJbmZvRWxlLT5CYXNpY01TQ1swXSxcCisJCQkJcEhUSW5mb0VsZS0+QmFzaWNNU0NbMV0sIHBIVEluZm9FbGUtPkJhc2ljTVNDWzJdLCBwSFRJbmZvRWxlLT5CYXNpY01TQ1szXSwgcEhUSW5mb0VsZS0+QmFzaWNNU0NbNF0pOworCXJldHVybjsKK30KKworLyoKKyoJUmV0dXJuOiAgICAgCXRydWUgaWYgc3RhdGlvbiBpbiBoYWxmIG4gbW9kZSBhbmQgQVAgc3VwcG9ydHMgNDAgYncKKyovCitib29sIElzSFRIYWxmTm1vZGU0MEJhbmR3aWR0aChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSkKK3sKKwlib29sCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwlQUlRfSElHSF9USFJPVUdIUFVUCSBwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKworCWlmKHBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID09IGZhbHNlICkJLy8gd2lyZWxlc3MgaXMgbiBtb2RlCisJCXJldFZhbHVlID0gZmFsc2U7CisJZWxzZSBpZihwSFRJbmZvLT5iUmVnQlc0ME1IeiA9PSBmYWxzZSkJLy8gc3RhdGlvbiBzdXBwb3J0cyA0MCBidworCQlyZXRWYWx1ZSA9IGZhbHNlOworCWVsc2UgaWYoIWllZWUtPkdldEhhbGZObW9kZVN1cHBvcnRCeUFQc0hhbmRsZXIoaWVlZS0+ZGV2KSkgCS8vIHN0YXRpb24gaW4gaGFsZiBuIG1vZGUKKwkJcmV0VmFsdWUgPSBmYWxzZTsKKwllbHNlIGlmKCgoUEhUX0NBUEFCSUxJVFlfRUxFKShwSFRJbmZvLT5QZWVySFRDYXBCdWYpKS0+Q2hsV2lkdGgpIC8vIGFwIHN1cHBvcnQgNDAgYncKKwkJcmV0VmFsdWUgPSB0cnVlOworCWVsc2UKKwkJcmV0VmFsdWUgPSBmYWxzZTsKKworCXJldHVybiByZXRWYWx1ZTsKK30KKworYm9vbCBJc0hUSGFsZk5tb2RlU0dJKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBib29sIGlzNDBNSHopCit7CisJYm9vbAkJCXJldFZhbHVlID0gZmFsc2U7CisJUFJUX0hJR0hfVEhST1VHSFBVVAkgcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CisKKwlpZihwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9PSBmYWxzZSApCS8vIHdpcmVsZXNzIGlzIG4gbW9kZQorCQlyZXRWYWx1ZSA9IGZhbHNlOworCWVsc2UgaWYoIWllZWUtPkdldEhhbGZObW9kZVN1cHBvcnRCeUFQc0hhbmRsZXIoaWVlZS0+ZGV2KSkgCS8vIHN0YXRpb24gaW4gaGFsZiBuIG1vZGUKKwkJcmV0VmFsdWUgPSBmYWxzZTsKKwllbHNlIGlmKGlzNDBNSHopIC8vIGFwIHN1cHBvcnQgNDAgYncKKwl7CisJCWlmKCgoUEhUX0NBUEFCSUxJVFlfRUxFKShwSFRJbmZvLT5QZWVySFRDYXBCdWYpKS0+U2hvcnRHSTQwTWh6KSAvLyBhcCBzdXBwb3J0IDQwIGJ3IHNob3J0IEdJCisJCQlyZXRWYWx1ZSA9IHRydWU7CisJCWVsc2UKKwkJCXJldFZhbHVlID0gZmFsc2U7CisJfQorCWVsc2UKKwl7CisJCWlmKCgoUEhUX0NBUEFCSUxJVFlfRUxFKShwSFRJbmZvLT5QZWVySFRDYXBCdWYpKS0+U2hvcnRHSTIwTWh6KSAvLyBhcCBzdXBwb3J0IDQwIGJ3IHNob3J0IEdJCisJCQlyZXRWYWx1ZSA9IHRydWU7CisJCWVsc2UKKwkJCXJldFZhbHVlID0gZmFsc2U7CisJfQorCisJcmV0dXJuIHJldFZhbHVlOworfQorCit1MTYgSFRIYWxmTWNzVG9EYXRhUmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgCXU4CW5NY3NSYXRlKQoreworCisJdTgJaXM0ME1IejsKKwl1OAlpc1Nob3J0R0k7CisKKwlpczQwTUh6ICA9ICAoSXNIVEhhbGZObW9kZTQwQmFuZHdpZHRoKGllZWUpKT8xOjA7CisJaXNTaG9ydEdJID0gKElzSFRIYWxmTm1vZGVTR0koaWVlZSwgaXM0ME1IeikpPyAxOjA7CisKKwlyZXR1cm4gTUNTX0RBVEFfUkFURVtpczQwTUh6XVtpc1Nob3J0R0ldWyhuTWNzUmF0ZSYweDdmKV07Cit9CisKKwordTE2IEhUTWNzVG9EYXRhUmF0ZSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4IG5NY3NSYXRlKQoreworCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CisKKwl1OAlpczQwTUh6ID0gKHBIVEluZm8tPmJDdXJCVzQwTUh6KT8xOjA7CisJdTgJaXNTaG9ydEdJID0gKHBIVEluZm8tPmJDdXJCVzQwTUh6KT8KKwkJCQkJCSgocEhUSW5mby0+YkN1clNob3J0R0k0ME1Ieik/MTowKToKKwkJCQkJCSgocEhUSW5mby0+YkN1clNob3J0R0kyME1Ieik/MTowKTsKKwlyZXR1cm4gTUNTX0RBVEFfUkFURVtpczQwTUh6XVtpc1Nob3J0R0ldWyhuTWNzUmF0ZSYweDdmKV07Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBjdXJyZW50IGRhdGFyYXRlLgorICogICBpbnB1dDogIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiAJaWVlZQorICogICAJICAgICB1OCAJCQluRGF0YVJhdGUKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgdHggcmF0ZQorICogIG5vdGljZTogIHF1aXRlIHVuc3VyZSBhYm91dCBob3cgdG8gdXNlIHRoaXMgZnVuY3Rpb24gLy93YgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgIFR4Q291bnRUb0RhdGFSYXRlKCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTggbkRhdGFSYXRlKQoreworCS8vUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKwl1MTYJCUNDS09GRE1SYXRlWzEyXSA9IHsweDAyICwgMHgwNCAsIDB4MGIgLCAweDE2ICwgMHgwYyAsIDB4MTIgLCAweDE4ICwgMHgyNCAsIDB4MzAgLCAweDQ4ICwgMHg2MCAsIDB4NmN9OworCXU4CWlzNDBNSHogPSAwOworCXU4CWlzU2hvcnRHSSA9IDA7CisKKwlpZihuRGF0YVJhdGUgPCAxMikKKwl7CisJCXJldHVybiBDQ0tPRkRNUmF0ZVtuRGF0YVJhdGVdOworCX0KKwllbHNlCisJeworCQlpZiAobkRhdGFSYXRlID49IDB4MTAgJiYgbkRhdGFSYXRlIDw9IDB4MWYpLy9pZihuRGF0YVJhdGUgPiAxMSAmJiBuRGF0YVJhdGUgPCAyOCApCisJCXsKKwkJCWlzNDBNSHogPSAwOworCQkJaXNTaG9ydEdJID0gMDsKKworCQkgICAgICAvLyBuRGF0YVJhdGUgPSBuRGF0YVJhdGUgLSAxMjsKKwkJfQorCQllbHNlIGlmKG5EYXRhUmF0ZSA+PTB4MjAgICYmIG5EYXRhUmF0ZSA8PSAweDJmICkgLy8oMjcsIDQ0KQorCQl7CisJCQlpczQwTUh6ID0gMTsKKwkJCWlzU2hvcnRHSSA9IDA7CisKKwkJCS8vbkRhdGFSYXRlID0gbkRhdGFSYXRlIC0gMjg7CisJCX0KKwkJZWxzZSBpZihuRGF0YVJhdGUgPj0gMHgzMCAgJiYgbkRhdGFSYXRlIDw9IDB4M2YgKSAgLy8oNDMsIDYwKQorCQl7CisJCQlpczQwTUh6ID0gMDsKKwkJCWlzU2hvcnRHSSA9IDE7CisKKwkJCS8vbkRhdGFSYXRlID0gbkRhdGFSYXRlIC0gNDQ7CisJCX0KKwkJZWxzZSBpZihuRGF0YVJhdGUgPj0gMHg0MCAgJiYgbkRhdGFSYXRlIDw9IDB4NGYgKSAvLyg1OSwgNzYpCisJCXsKKwkJCWlzNDBNSHogPSAxOworCQkJaXNTaG9ydEdJID0gMTsKKworCQkJLy9uRGF0YVJhdGUgPSBuRGF0YVJhdGUgLSA2MDsKKwkJfQorCQlyZXR1cm4gTUNTX0RBVEFfUkFURVtpczQwTUh6XVtpc1Nob3J0R0ldW25EYXRhUmF0ZSYweGZdOworCX0KK30KKworCisKK2Jvb2wgSXNIVEhhbGZObW9kZUFQcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSkKK3sKKwlib29sCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsqIG5ldCA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7CisJaWYoKG1lbWNtcChuZXQtPmJzc2lkLCBCRUxLSU5GNUQ4MjMzVjFfUkFMSU5LLCAzKT09MCkgfHwKKwkJICAgICAobWVtY21wKG5ldC0+YnNzaWQsIEJFTEtJTkY1RDgyMzM0VjNfUkFMSU5LLCAzKT09MCkgfHwKKwkJICAgICAobWVtY21wKG5ldC0+YnNzaWQsIFBDSV9SQUxJTkssIDMpPT0wKSB8fAorCQkgICAgIChtZW1jbXAobmV0LT5ic3NpZCwgRURJTUFYX1JBTElOSywgMyk9PTApIHx8CisJCSAgICAgKG1lbWNtcChuZXQtPmJzc2lkLCBBSVJMSU5LX1JBTElOSywgMyk9PTApIHx8CisJCSAgICAgKG5ldC0+cmFsaW5rX2NhcF9leGlzdCkpCisJCXJldFZhbHVlID0gdHJ1ZTsKKwllbHNlIGlmKChtZW1jbXAobmV0LT5ic3NpZCwgVU5LTk9XTl9CT1JBRENPTSwgMyk9PTApIHx8CisJCSAgICAobWVtY21wKG5ldC0+YnNzaWQsIExJTktTWVNXUlQzMzBfTElOS1NZU1dSVDMwMF9CUk9BRENPTSwgMyk9PTApfHwKKwkJICAgIChtZW1jbXAobmV0LT5ic3NpZCwgTElOS1NZU1dSVDM1MF9MSU5LU1lTV1JUMTUwX0JST0FEQ09NLCAzKT09MCl8fAorCQkgICAgKG1lbWNtcChuZXQtPmJzc2lkLCBORVRHRUFSODM0QnYyX0JST0FEQ09NLCAzKT09MCkgfHwKKwkJICAgIChuZXQtPmJyb2FkY29tX2NhcF9leGlzdCkpCisJCSAgcmV0VmFsdWUgPSB0cnVlOworCWVsc2UgaWYobmV0LT5ic3NodC5iZFJUMlJUQWdncmVnYXRpb24pCisJCXJldFZhbHVlID0gdHJ1ZTsKKwllbHNlCisJCXJldFZhbHVlID0gZmFsc2U7CisKKwlyZXR1cm4gcmV0VmFsdWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBwZWVyIElPVC4KKyAqICAgaW5wdXQ6ICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogCWllZWUKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOgorICogIG5vdGljZToKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIVElPVFBlZXJEZXRlcm1pbmUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUpCit7CisJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsqIG5ldCA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7CisJaWYobmV0LT5ic3NodC5iZFJUMlJUQWdncmVnYXRpb24pCisJCXBIVEluZm8tPklPVFBlZXIgPSBIVF9JT1RfUEVFUl9SRUFMVEVLOworCWVsc2UgaWYobmV0LT5icm9hZGNvbV9jYXBfZXhpc3QpCisJCXBIVEluZm8tPklPVFBlZXIgPSBIVF9JT1RfUEVFUl9CUk9BRENPTTsKKwllbHNlIGlmKChtZW1jbXAobmV0LT5ic3NpZCwgVU5LTk9XTl9CT1JBRENPTSwgMyk9PTApIHx8CisJCQkobWVtY21wKG5ldC0+YnNzaWQsIExJTktTWVNXUlQzMzBfTElOS1NZU1dSVDMwMF9CUk9BRENPTSwgMyk9PTApfHwKKwkJCShtZW1jbXAobmV0LT5ic3NpZCwgTElOS1NZU1dSVDM1MF9MSU5LU1lTV1JUMTUwX0JST0FEQ09NLCAzKT09MCl8fAorCQkJKG1lbWNtcChuZXQtPmJzc2lkLCBORVRHRUFSODM0QnYyX0JST0FEQ09NLCAzKT09MCkgKQorCQlwSFRJbmZvLT5JT1RQZWVyID0gSFRfSU9UX1BFRVJfQlJPQURDT007CisJZWxzZSBpZigobWVtY21wKG5ldC0+YnNzaWQsIEJFTEtJTkY1RDgyMzNWMV9SQUxJTkssIDMpPT0wKSB8fAorCQkJKG1lbWNtcChuZXQtPmJzc2lkLCBCRUxLSU5GNUQ4MjMzNFYzX1JBTElOSywgMyk9PTApIHx8CisJCQkobWVtY21wKG5ldC0+YnNzaWQsIFBDSV9SQUxJTkssIDMpPT0wKSB8fAorCQkJKG1lbWNtcChuZXQtPmJzc2lkLCBFRElNQVhfUkFMSU5LLCAzKT09MCkgfHwKKwkJCShtZW1jbXAobmV0LT5ic3NpZCwgQUlSTElOS19SQUxJTkssIDMpPT0wKSB8fAorCQkJIG5ldC0+cmFsaW5rX2NhcF9leGlzdCkKKwkJcEhUSW5mby0+SU9UUGVlciA9IEhUX0lPVF9QRUVSX1JBTElOSzsKKwllbHNlIGlmKG5ldC0+YXRoZXJvc19jYXBfZXhpc3QpCisJCXBIVEluZm8tPklPVFBlZXIgPSBIVF9JT1RfUEVFUl9BVEhFUk9TOworCWVsc2UgaWYobWVtY21wKG5ldC0+YnNzaWQsIENJU0NPX0JST0FEQ09NLCAzKT09MCkKKwkJcEhUSW5mby0+SU9UUGVlciA9IEhUX0lPVF9QRUVSX0NJU0NPOworCWVsc2UKKwkJcEhUSW5mby0+SU9UUGVlciA9IEhUX0lPVF9QRUVSX1VOS05PV047CisKKwlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0lPVCwgIkpvc2VwaCBkZWJ1ZyEhIElPVFBFRVI6ICV4XG4iLCBwSFRJbmZvLT5JT1RQZWVyKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIENoZWNrIHdoZXRoZXIgZHJpdmVyIHNob3VsZCBkZWNsYXJlIHJlY2VpdmVkIHJhdGUgdXAgdG8gTUNTMTMgb25seSBzaW5jZSBzb21lIGNoaXBzZXQgaXMgbm90IGdvb2QKKyAqCSAgICAgYXQgcmVjZWl2aW5nIE1DUzE0fjE1IGZyYW1lIGZyb20gc29tZSBBUC4KKyAqICAgaW5wdXQ6ICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogCWllZWUKKyAqICAgCSAgICAgdTggKgkJCVBlZXJNYWNBZGRyCisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIHJldHVybiAxIGlmIGRyaXZlciBzaG91bGQgZGVjbGFyZSBNQ1MxMyBvbmx5KG90aGVyd2lzZSByZXR1cm4gMCkKKyAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IEhUSU9UQWN0SXNEaXNhYmxlTUNTMTQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4KiBQZWVyTWFjQWRkcikKK3sKKwl1OCByZXQgPSAwOworCXJldHVybiByZXQ7CisgfQorCisKKy8qKgorKiBGdW5jdGlvbjoJSFRJT1RBY3RJc0Rpc2FibGVNQ1MxNQorKgorKiBPdmVydmlldzoJQ2hlY2sgd2hldGhlciBkcml2ZXIgc2hvdWxkIGRlY2xhcmUgY2FwYWJpbGl0eSBvZiByZWNldmluZyBNQ1MxNQorKgorKiBJbnB1dDoKKyoJCQlQQURBUFRFUgkJQWRhcHRlciwKKyoKKyogT3V0cHV0OgkJTm9uZQorKiBSZXR1cm46ICAgICAJdHJ1ZSBpZiBkcml2ZXIgc2hvdWxkIGRpc2FibGUgTUNTMTUKKyogMjAwOC4wNC4xNQlFbWlseQorKi8KK2Jvb2wgSFRJT1RBY3RJc0Rpc2FibGVNQ1MxNShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSkKK3sKKwlib29sIHJldFZhbHVlID0gZmFsc2U7CisKKyNpZmRlZiBUT0RPCisJLy8gQXBwbHkgZm9yIDgxOXUgb25seQorI2lmIChIQUxfQ09ERV9CQVNFPT1SVEw4MTkyKQorCisjaWYgKERFVl9CVVNfVFlQRSA9PSBVU0JfSU5URVJGQUNFKQorCS8vIEFsd2F5IGRpc2FibGUgTUNTMTUgYnkgSmVycnkgQ2hhbmcncyByZXF1ZXN0LmJ5IEVtaWx5LCAyMDA4LjA0LjE1CisJcmV0VmFsdWUgPSB0cnVlOworI2VsaWYgKERFVl9CVVNfVFlQRSA9PSBQQ0lfSU5URVJGQUNFKQorCS8vIEVuYWJsZSBNQ1MxNSBpZiB0aGUgcGVlciBpcyBDaXNjbyBBUC4gYnkgRW1pbHksIDIwMDguMDUuMTIKKy8vCWlmKHBCc3NEZXNjLT5iQ2lzY29DYXBFeGlzdCkKKy8vCQlyZXRWYWx1ZSA9IGZhbHNlOworLy8JZWxzZQorCQlyZXRWYWx1ZSA9IGZhbHNlOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCS8vIEplcnJ5IENoYW5nIHN1Z2dlc3QgdGhhdCA4MTkwIDF4MiBkb2VzIG5vdCBuZWVkIHRvIGRpc2FibGUgTUNTMTUKKworCXJldHVybiByZXRWYWx1ZTsKK30KKworLyoqCisqIEZ1bmN0aW9uOglIVElPVEFjdElzRGlzYWJsZU1DU1R3b1NwYXRpYWxTdHJlYW0KKyoKKyogT3ZlcnZpZXc6CUNoZWNrIHdoZXRoZXIgZHJpdmVyIHNob3VsZCBkZWNsYXJlIGNhcGFiaWxpdHkgb2YgcmVjZXZpbmcgQWxsIDIgc3MgcGFja2V0cworKgorKiBJbnB1dDoKKyoJCQlQQURBUFRFUgkJQWRhcHRlciwKKyoKKyogT3V0cHV0OgkJTm9uZQorKiBSZXR1cm46ICAgICAJdHJ1ZSBpZiBkcml2ZXIgc2hvdWxkIGRpc2FibGUgYWxsIHR3byBzcGF0aWFsIHN0cmVhbSBwYWNrZXQKKyogMjAwOC4wNC4yMQlFbWlseQorKi8KK2Jvb2wgSFRJT1RBY3RJc0Rpc2FibGVNQ1NUd29TcGF0aWFsU3RyZWFtKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCAqUGVlck1hY0FkZHIpCit7CisJYm9vbCByZXRWYWx1ZSA9IGZhbHNlOworCisjaWZkZWYgVE9ETworCS8vIEFwcGx5IGZvciA4MTl1IG9ubHkKKyNlbmRpZgorCXJldHVybiByZXRWYWx1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgQ2hlY2sgd2hldGhlciBkcml2ZXIgc2hvdWxkIGRpc2FibGUgRURDQSB0dXJibyBtb2RlCisgKiAgIGlucHV0OiAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIAlpZWVlCisgKiAgIAkgICAgIHU4KiAJCQlQZWVyTWFjQWRkcgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICByZXR1cm4gMSBpZiBkcml2ZXIgc2hvdWxkIGRpc2FibGUgRURDQSB0dXJibyBtb2RlKG90aGVyd2lzZSByZXR1cm4gMCkKKyAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IEhUSU9UQWN0SXNEaXNhYmxlRURDQVR1cmJvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiAJaWVlZSwgdTgqIFBlZXJNYWNBZGRyKQoreworCXU4CXJldFZhbHVlID0gZmFsc2U7CS8vIGRlZmF1bHQgZW5hYmxlIEVEQ0EgVHVyYm8gbW9kZS4KKwkvLyBTZXQgc3BlY2lmaWMgRURDQSBwYXJhbWV0ZXIgZm9yIGRpZmZlcmVudCBBUCBpbiBETSBoYW5kbGVyLgorCisJcmV0dXJuIHJldFZhbHVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBDaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gdXNlIE9GRE0gdG8gc25lZCBNR05UIGZyYW1lIGZvciBicm9hZGNvbSBBUAorICogICBpbnB1dDogIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yayAgIC8vY3VycmVudCBuZXR3b3JrIHdlIGxpdmUKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgcmV0dXJuIDEgaWYgdHJ1ZQorICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggSFRJT1RBY3RJc01nbnRVc2VDQ0s2TShzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmspCit7CisJdTgJcmV0VmFsdWUgPSAwOworCisJLy8gMjAwOC8wMS8yNSBNSCBKdWRlZyBpZiB3ZSBuZWVkIHRvIHVzZSBPRkRNIHRvIHNuZWQgTUdOVCBmcmFtZSBmb3IgYnJvYWRjb20gQVAuCisJLy8gMjAwOC8wMS8yOCBNSCBXZSBtdXN0IHByZXZlbnQgdGhhdCB3ZSBzZWxlY3QgbnVsbCBic3NpZCB0byBsaW5rLgorCisJaWYobmV0d29yay0+YnJvYWRjb21fY2FwX2V4aXN0KQorCXsKKwkJcmV0VmFsdWUgPSAxOworCX0KKworCXJldHVybiByZXRWYWx1ZTsKK30KKwordTggSFRJT1RBY3RJc0NDREZzeW5jKHU4KiBQZWVyTWFjQWRkcikKK3sKKwl1OAlyZXRWYWx1ZSA9IDA7CisJaWYoCShtZW1jbXAoUGVlck1hY0FkZHIsIFVOS05PV05fQk9SQURDT00sIDMpPT0wKSB8fAorCQkobWVtY21wKFBlZXJNYWNBZGRyLCBMSU5LU1lTV1JUMzMwX0xJTktTWVNXUlQzMDBfQlJPQURDT00sIDMpPT0wKSB8fAorCQkobWVtY21wKFBlZXJNYWNBZGRyLCBMSU5LU1lTV1JUMzUwX0xJTktTWVNXUlQxNTBfQlJPQURDT00sIDMpID09MCkpCisJeworCQlyZXRWYWx1ZSA9IDE7CisJfQorCisJcmV0dXJuIHJldFZhbHVlOworfQorCit2b2lkIEhUUmVzZXRJT1RTZXR0aW5nKAorCVBSVF9ISUdIX1RIUk9VR0hQVVQJCXBIVEluZm8KKykKK3sKKwlwSFRJbmZvLT5JT1RBY3Rpb24gPSAwOworCXBIVEluZm8tPklPVFBlZXIgPSBIVF9JT1RfUEVFUl9VTktOT1dOOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIENvbnN0cnVjdCBDYXBhYmxpbGl0eSBFbGVtZW50IGluIEJlYWNvbi4uLiBpZiBIVEVuYWJsZSBpcyB0dXJuZWQgb24KKyAqICAgaW5wdXQ6ICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogCWllZWUKKyAqICAgCSAgICAgdTgqIAkJCXBvc0hUQ2FwIC8vcG9pbnRlciB0byBzdG9yZSBDYXBhYmlsaXR5IEVsZQorICogICAJICAgICB1OCoJCQlsZW4gLy9zdG9yZSBsZW5ndGggb2YgQ0UKKyAqICAgCSAgICAgdTgJCQkJSXNFbmNyeXB0IC8vd2hldGhlciBlbmNyeXB0LCBuZWVkZWQgZnVydGhlcgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgbm90aWNlOiAgcG9zSFRDYXAgY2FuJ3QgYmUgbnVsbCBhbmQgc2hvdWxkIGJlIGluaXRpYWxpemVkIGJlZm9yZS4KKyAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSFRDb25zdHJ1Y3RDYXBhYmlsaXR5RWxlbWVudChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTgqIHBvc0hUQ2FwLCB1OCogbGVuLCB1OCBJc0VuY3J5cHQpCit7CisJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFQgPSBpZWVlLT5wSFRJbmZvOworCVBIVF9DQVBBQklMSVRZX0VMRSAJcENhcEVMRSA9IE5VTEw7CisJLy91OCBiSXNEZWNsYXJlTUNTMTM7CisKKwlpZiAoKHBvc0hUQ2FwID09IE5VTEwpIHx8IChwSFQgPT0gTlVMTCkpCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgInBvc0hUQ2FwIG9yIHBIVEluZm8gY2FuJ3QgYmUgbnVsbCBpbiBIVENvbnN0cnVjdENhcGFiaWxpdHlFbGVtZW50KClcbiIpOworCQlyZXR1cm47CisJfQorCW1lbXNldChwb3NIVENhcCwgMCwgKmxlbik7CisJaWYocEhULT5lUGVlckhUU3BlY1ZlciA9PSBIVF9TUEVDX1ZFUl9FV0MpCisJeworCQl1OAlFV0MxMU5IVENhcFtdID0gezB4MDAsIDB4OTAsIDB4NGMsIDB4MzN9OwkvLyBGb3IgMTFuIEVXQyBkZWZpbml0aW9uLCAyMDA3LjA3LjE3LCBieSBFbWlseQorCQltZW1jcHkocG9zSFRDYXAsIEVXQzExTkhUQ2FwLCBzaXplb2YoRVdDMTFOSFRDYXApKTsKKwkJcENhcEVMRSA9IChQSFRfQ0FQQUJJTElUWV9FTEUpJihwb3NIVENhcFs0XSk7CisJfWVsc2UKKwl7CisJCXBDYXBFTEUgPSAoUEhUX0NBUEFCSUxJVFlfRUxFKXBvc0hUQ2FwOworCX0KKworCisJLy9IVCBjYXBhYmlsaXR5IGluZm8KKwlwQ2FwRUxFLT5BZHZDb2RpbmcgCQk9IDA7IC8vIFRoaXMgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkIG5vdyEhCisJaWYoaWVlZS0+R2V0SGFsZk5tb2RlU3VwcG9ydEJ5QVBzSGFuZGxlcihpZWVlLT5kZXYpKQorCXsKKwkJcENhcEVMRS0+Q2hsV2lkdGggPSAwOworCX0KKwllbHNlCisJeworCQlwQ2FwRUxFLT5DaGxXaWR0aCA9IChwSFQtPmJSZWdCVzQwTUh6PzE6MCk7CisJfQorCisvLwlwQ2FwRUxFLT5DaGxXaWR0aCAJCT0gKHBIVC0+YlJlZ0JXNDBNSHo/MTowKTsKKwlwQ2FwRUxFLT5NaW1vUHdyU2F2ZSAJCT0gcEhULT5TZWxmTWltb1BzOworCXBDYXBFTEUtPkdyZWVuRmllbGQJCT0gMDsgLy8gVGhpcyBmZWF0dXJlIGlzIG5vdCBzdXBwb3J0ZWQgbm93ISEKKwlwQ2FwRUxFLT5TaG9ydEdJMjBNaHoJCT0gMTsgLy8gV2UgY2FuIHJlY2VpdmUgU2hvcnQgR0khIQorCXBDYXBFTEUtPlNob3J0R0k0ME1oegkJPSAxOyAvLyBXZSBjYW4gcmVjZWl2ZSBTaG9ydCBHSSEhCisJLy9EYmdQcmludCgiVFggSFQgY2FwL2luZm8gZWxlIEJXPSVkIFNHMjA9JWQgU0c0MD0lZFxuXHIiLAorCQkvL3BDYXBFTEUtPkNobFdpZHRoLCBwQ2FwRUxFLT5TaG9ydEdJMjBNaHosIHBDYXBFTEUtPlNob3J0R0k0ME1oeik7CisJcENhcEVMRS0+VHhTVEJDIAkJPSAxOworCXBDYXBFTEUtPlJ4U1RCQyAJCT0gMDsKKwlwQ2FwRUxFLT5EZWxheUJBCQk9IDA7CS8vIERvIG5vdCBzdXBwb3J0IG5vdyEhCisJcENhcEVMRS0+TWF4QU1TRFVTaXplCT0gKE1BWF9SRUNFSVZFX0JVRkZFUl9TSVpFPj03OTM1KT8xOjA7CisJcENhcEVMRS0+RHNzQ0NrIAkJPSAoKHBIVC0+YlJlZ0JXNDBNSHopPyhwSFQtPmJSZWdTdXBwQ0NLPzE6MCk6MCk7CisJcENhcEVMRS0+UFNNUAkJCT0gMDsgLy8gRG8gbm90IHN1cHBvcnQgbm93ISEKKwlwQ2FwRUxFLT5MU2lnVHhvcFByb3RlY3QJPSAwOyAvLyBEbyBub3Qgc3VwcG9ydCBub3chIQorCisKKwkvL01BQyBIVCBwYXJhbWV0ZXJzIGluZm8KKwkvLyBUT0RPOiBOZWRkIHRvIHRha2UgY2FyZSBvZiB0aGlzIHBhcnQKKwlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiVFggSFQgY2FwL2luZm8gZWxlIEJXPSVkIE1heEFNU0RVU2l6ZTolZCBEc3NDQ2s6JWRcbiIsIHBDYXBFTEUtPkNobFdpZHRoLCBwQ2FwRUxFLT5NYXhBTVNEVVNpemUsIHBDYXBFTEUtPkRzc0NDayk7CisKKwlpZiggSXNFbmNyeXB0KQorCXsKKwkJcENhcEVMRS0+TVBEVURlbnNpdHkgCT0gNzsgLy8gOHVzCisJCXBDYXBFTEUtPk1heFJ4QU1QRFVGYWN0b3IgCT0gMjsgLy8gMiBpcyBmb3IgMzIgSyBhbmQgMyBpcyA2NEsKKwl9CisJZWxzZQorCXsKKwkJcENhcEVMRS0+TWF4UnhBTVBEVUZhY3RvciAJPSAzOyAvLyAyIGlzIGZvciAzMiBLIGFuZCAzIGlzIDY0SworCQlwQ2FwRUxFLT5NUERVRGVuc2l0eSAJPSAwOyAvLyBubyBkZW5zaXR5CisJfQorCisJLy9TdXBwb3J0ZWQgTUNTIHNldAorCW1lbWNweShwQ2FwRUxFLT5NQ1MsIGllZWUtPlJlZ2RvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQsIDE2KTsKKwlpZihwSFQtPklPVEFjdGlvbiAmIEhUX0lPVF9BQ1RfRElTQUJMRV9NQ1MxNSkKKwkJcENhcEVMRS0+TUNTWzFdICY9IDB4N2Y7CisKKwlpZihwSFQtPklPVEFjdGlvbiAmIEhUX0lPVF9BQ1RfRElTQUJMRV9NQ1MxNCkKKwkJcENhcEVMRS0+TUNTWzFdICY9IDB4YmY7CisKKwlpZihwSFQtPklPVEFjdGlvbiAmIEhUX0lPVF9BQ1RfRElTQUJMRV9BTExfMlNTKQorCQlwQ2FwRUxFLT5NQ1NbMV0gJj0gMHgwMDsKKworCS8vIDIwMDguMDYuMTIKKwkvLyBGb3IgUlRMODE5WCwgaWYgcGFpcndpc2VrZXkgPSB3ZXAvdGtpcCwgYXAgaXMgcmFsaW5rLCB3ZSBzdXBwb3J0IG9ubHkgTUNTMH43LgorCWlmKGllZWUtPkdldEhhbGZObW9kZVN1cHBvcnRCeUFQc0hhbmRsZXIoaWVlZS0+ZGV2KSkKKwl7CisJCWludCBpOworCQlmb3IoaSA9IDE7IGk8IDE2OyBpKyspCisJCQlwQ2FwRUxFLT5NQ1NbaV0gPSAwOworCX0KKworCS8vRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0eSBJbmZvCisJbWVtc2V0KCZwQ2FwRUxFLT5FeHRIVENhcEluZm8sIDAsIDIpOworCisKKwkvL1RYQkYgQ2FwYWJpbGl0aWVzCisJbWVtc2V0KHBDYXBFTEUtPlR4QkZDYXAsIDAsIDQpOworCisJLy9BbnRlbm5hIFNlbGVjdGlvbiBDYXBhYmlsaXRpZXMKKwlwQ2FwRUxFLT5BU0NhcCA9IDA7CisvL2FkZCAyIHRvIGdpdmUgc3BhY2UgZm9yIGVsZW1lbnQgSUQgYW5kIGxlbiB3aGVuIGNvbnN0cnVjdCBmcmFtZXMKKwlpZihwSFQtPmVQZWVySFRTcGVjVmVyID09IEhUX1NQRUNfVkVSX0VXQykKKwkJKmxlbiA9IDMwICsgMjsKKwllbHNlCisJCSpsZW4gPSAyNiArIDI7CisKKworCisvLwlJRUVFODAyMTFfREVCVUdfREFUQShJRUVFODAyMTFfRExfREFUQSB8IElFRUU4MDIxMV9ETF9IVCwgcG9zSFRDYXAsICpsZW4gLTIpOworCisJLy9QcmludCBlYWNoIGZpZWxkIGluIGRldGFpbC4gRHJpdmVyIHNob3VsZCBub3QgcHJpbnQgb3V0IHRoaXMgbWVzc2FnZSBieSBkZWZhdWx0CisvLwlIVERlYnVnSFRDYXBhYmlsaXR5KHBvc0hUQ2FwLCAodTgqKSJIVENvbnN0cnVjdENhcGFiaWxpdHkoKSIpOworCXJldHVybjsKKworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgQ29uc3RydWN0ICBJbmZvcm1hdGlvbiBFbGVtZW50IGluIEJlYWNvbi4uLiBpZiBIVEVuYWJsZSBpcyB0dXJuZWQgb24KKyAqICAgaW5wdXQ6ICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogCWllZWUKKyAqICAgCSAgICAgdTgqIAkJCXBvc0hUQ2FwIC8vcG9pbnRlciB0byBzdG9yZSBJbmZvcm1hdGlvbiBFbGUKKyAqICAgCSAgICAgdTgqCQkJbGVuICAgLy9zdG9yZSBsZW4gb2YKKyAqICAgCSAgICAgdTgJCQkJSXNFbmNyeXB0IC8vd2hldGhlciBlbmNyeXB0LCBuZWVkZWQgZnVydGhlcgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgbm90aWNlOiAgcG9zSFRDYXAgY2FuJ3QgYmUgbnVsbCBhbmQgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlLiBvbmx5IEFQIGFuZCBJQlNTIHN0YSBzaG91bGQgZG8gdGhpcworICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIVENvbnN0cnVjdEluZm9FbGVtZW50KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogcG9zSFRJbmZvLCB1OCogbGVuLCB1OCBJc0VuY3J5cHQpCit7CisJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFQgPSBpZWVlLT5wSFRJbmZvOworCVBIVF9JTkZPUk1BVElPTl9FTEUJCXBIVEluZm9FbGUgPSAoUEhUX0lORk9STUFUSU9OX0VMRSlwb3NIVEluZm87CisJaWYgKChwb3NIVEluZm8gPT0gTlVMTCkgfHwgKHBIVEluZm9FbGUgPT0gTlVMTCkpCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgInBvc0hUSW5mbyBvciBwSFRJbmZvRWxlIGNhbid0IGJlIG51bGwgaW4gSFRDb25zdHJ1Y3RJbmZvRWxlbWVudCgpXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW1lbXNldChwb3NIVEluZm8sIDAsICpsZW4pOworCWlmICggKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgfHwgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpKSAvL2FwIG1vZGUgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKKwl7CisJCXBIVEluZm9FbGUtPkNvbnRyb2xDaGwgCQkJPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbDsKKwkJcEhUSW5mb0VsZS0+RXh0Q2hsT2Zmc2V0IAkJCT0gKChwSFQtPmJSZWdCVzQwTUh6ID09IGZhbHNlKT9IVF9FWFRDSE5MX09GRlNFVF9OT19FWFQ6CisJCQkJCQkJCQkJCShpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbDw9Nik/CisJCQkJCQkJCQkJCQlIVF9FWFRDSE5MX09GRlNFVF9VUFBFUjpIVF9FWFRDSE5MX09GRlNFVF9MT1dFUik7CisJCXBIVEluZm9FbGUtPlJlY29tbWVtZGVkVHhXaWR0aAk9IHBIVC0+YlJlZ0JXNDBNSHo7CisJCXBIVEluZm9FbGUtPlJJRlMgCQkJCQk9IDA7CisJCXBIVEluZm9FbGUtPlBTTVBBY2Nlc3NPbmx5CQk9IDA7CisJCXBIVEluZm9FbGUtPlNydkludEdyYW51bGFyaXR5CQk9IDA7CisJCXBIVEluZm9FbGUtPk9wdE1vZGUJCQkJPSBwSFQtPkN1cnJlbnRPcE1vZGU7CisJCXBIVEluZm9FbGUtPk5vbkdGRGV2UHJlc2VudAkJPSAwOworCQlwSFRJbmZvRWxlLT5EdWFsQmVhY29uCQkJPSAwOworCQlwSFRJbmZvRWxlLT5TZWNvbmRhcnlCZWFjb24JCT0gMDsKKwkJcEhUSW5mb0VsZS0+TFNpZ1R4b3BQcm90ZWN0RnVsbAkJPSAwOworCQlwSFRJbmZvRWxlLT5QY29BY3RpdmUJCQkJPSAwOworCQlwSFRJbmZvRWxlLT5QY29QaGFzZQkJCQk9IDA7CisKKwkJbWVtc2V0KHBIVEluZm9FbGUtPkJhc2ljTVNDLCAwLCAxNik7CisKKworCQkqbGVuID0gMjIgKyAyOyAvL3NhbWUgYWJvdmUKKworCX0KKwllbHNlCisJeworCQkvL1NUQSBzaG91bGQgbm90IGdlbmVyYXRlIEhpZ2ggVGhyb3VnaHB1dCBJbmZvcm1hdGlvbiBFbGVtZW50CisJCSpsZW4gPSAwOworCX0KKwkvL0lFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBIHwgSUVFRTgwMjExX0RMX0hULCBwb3NIVEluZm8sICpsZW4gLSAyKTsKKwkvL0hURGVidWdIVEluZm8ocG9zSFRJbmZvLCAiSFRDb25zdHJ1Y3RJbmZvckVsZW1lbnQiKTsKKwlyZXR1cm47Cit9CisKKy8qCisgICogIEFjY29yZGluZyB0byBleHBlcmltZW50LCBSZWFsdGVrIEFQIHRvIFNUQSAoYmFzZWQgb24gcnRsODE5MCkgbWF5IGFjaGlldmUgYmVzdCBwZXJmb3JtYW5jZQorICAqICBpZiBib3RoIFNUQSBhbmQgQVAgc2V0IGxpbWl0YXRpb24gb2YgYWdncmVnYXRpb24gc2l6ZSB0byAzMkssIHRoYXQgaXMsIHNldCBBTVBEVSBkZW5zaXR5IHRvIDIKKyAgKiAgKFJlZjogSUVFRSAxMW4gc3BlY2lmaWNhdGlvbikuIEhvd2V2ZXIsIGlmIFJlYWx0ZWsgU1RBIGFzc29jaWF0ZXMgdG8gb3RoZXIgQVAsIFNUQSBzaG91bGQgc2V0CisgICogIGxpbWl0YXRpb24gb2YgYWdncmVnYXRpb24gc2l6ZSB0byA4Sywgb3RoZXJ3aXNlLCBwZXJmb3JtYW5jZSBvZiB0cmFmZmljIHN0cmVhbSBmcm9tIFNUQSB0byBBUAorICAqICB3aWxsIGJlIG11Y2ggbGVzcyB0aGFuIHRoZSB0cmFmZmljIHN0cmVhbSBmcm9tIEFQIHRvIFNUQSBpZiBib3RoIG9mIHRoZSBzdHJlYW0gcnVucyBjb25jdXJyZW50bHkKKyAgKiAgYXQgdGhlIHNhbWUgdGltZS4KKyAgKgorICAqICBGcmFtZSBGb3JtYXQKKyAgKiAgRWxlbWVudCBJRAkJTGVuZ3RoCQlPVUkJCQlUeXBlMQkJUmVzZXJ2ZWQKKyAgKiAgMSBieXRlCQkJMSBieXRlCQkzIGJ5dGVzCQkxIGJ5dGUJCTEgYnl0ZQorICAqCisgICogIE9VSSAJCT0gMHgwMCwgMHhlMCwgMHg0YywKKyAgKiAgVHlwZSAJPSAweDAyCisgICogIFJlc2VydmVkIAk9IDB4MDAKKyAgKgorICAqICAyMDA3LjguMjEgYnkgRW1pbHkKKyovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBDb25zdHJ1Y3QgIEluZm9ybWF0aW9uIEVsZW1lbnQgaW4gQmVhY29uLi4uIGluIFJUMlJUIGNvbmRpdGlvbgorICogICBpbnB1dDogIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiAJaWVlZQorICogICAJICAgICB1OCogCQkJcG9zUlQyUlRBZ2cgLy9wb2ludGVyIHRvIHN0b3JlIEluZm9ybWF0aW9uIEVsZQorICogICAJICAgICB1OCoJCQlsZW4gICAvL3N0b3JlIGxlbgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgbm90aWNlOgorICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIVENvbnN0cnVjdFJUMlJUQWdnRWxlbWVudChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTgqIHBvc1JUMlJUQWdnLCB1OCogbGVuKQoreworCWlmIChwb3NSVDJSVEFnZyA9PSBOVUxMKSB7CisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAicG9zUlQyUlRBZ2cgY2FuJ3QgYmUgbnVsbCBpbiBIVENvbnN0cnVjdFJUMlJUQWdnRWxlbWVudCgpXG4iKTsKKwkJcmV0dXJuOworCX0KKwltZW1zZXQocG9zUlQyUlRBZ2csIDAsICpsZW4pOworCSpwb3NSVDJSVEFnZysrID0gMHgwMDsKKwkqcG9zUlQyUlRBZ2crKyA9IDB4ZTA7CisJKnBvc1JUMlJUQWdnKysgPSAweDRjOworCSpwb3NSVDJSVEFnZysrID0gMHgwMjsKKwkqcG9zUlQyUlRBZ2crKyA9IDB4MDE7CisJKnBvc1JUMlJUQWdnID0gMHgxMDsvLypwb3NSVDJSVEFnZyA9IDB4MDI7CisKKwlpZihpZWVlLT5iU3VwcG9ydFJlbW90ZVdha2VVcCkgeworCQkqcG9zUlQyUlRBZ2cgfD0gMHgwODsvL1JUX0hUX0NBUF9VU0VfV09XOworCX0KKworCSpsZW4gPSA2ICsgMjsKKwlyZXR1cm47CisjaWZkZWYgVE9ETworI2lmIChIQUxfQ09ERV9CQVNFID09IFJUTDgxOTIgJiYgREVWX0JVU19UWVBFID09IFVTQl9JTlRFUkZBQ0UpCisJLyoKKwkvL0VtaWx5LiBJZiBpdCBpcyByZXF1aXJlZCB0byBBc2sgUmVhbHRlayBBUCB0byBzZW5kIEFNUERVIGR1cmluZyBBRVMgbW9kZSwgZW5hYmxlIHRoaXMKKwkgICBzZWN0aW9uIG9mIGNvZGUuCisJaWYoSVNfVU5ERVJfMTFOX0FFU19NT0RFKEFkYXB0ZXIpKQorCXsKKwkJcG9zUlQyUlRBZ2ctPk9jdGV0WzVdIHw9UlRfSFRfQ0FQX1VTRV9BTVBEVTsKKwl9ZWxzZQorCXsKKwkJcG9zUlQyUlRBZ2ctPk9jdGV0WzVdICY9IDB4ZmI7CisJfQorCSovCisKKyNlbHNlCisJLy8gRG8gTm90aGluZworI2VuZGlmCisKKwlwb3NSVDJSVEFnZy0+TGVuZ3RoID0gNjsKKyNlbmRpZgorCisKKworCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgUGljayB0aGUgcmlnaHQgUmF0ZSBBZGFwdGl2ZSB0YWJsZSB0byB1c2UKKyAqICAgaW5wdXQ6ICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogCWllZWUKKyAqICAgCSAgICAgdTgqIAkJCXBPcGVyYXRlTUNTIC8vQSBwb2ludGVyIHRvIE1DUyByYXRlIGJpdG1hcAorICogIHJldHVybjogIGFsd2F5cyB3ZSByZXR1cm4gdHJ1ZQorICogIG5vdGljZToKKyAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IEhUX1BpY2tNQ1NSYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogcE9wZXJhdGVNQ1MpCit7CisJdTgJCQkJCWk7CisJaWYgKHBPcGVyYXRlTUNTID09IE5VTEwpCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgInBPcGVyYXRlTUNTIGNhbid0IGJlIG51bGwgaW4gSFRfUGlja01DU1JhdGUoKVxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlzd2l0Y2goaWVlZS0+bW9kZSkKKwl7CisJY2FzZSBJRUVFX0E6CisJY2FzZSBJRUVFX0I6CisJY2FzZSBJRUVFX0c6CisJCQkvL2xlZ2FjeSByYXRlIHJvdXRpbmUgaGFuZGxlZCBhdCBzZWxlY3RlZHJhdGUKKworCQkJLy9ubyBNQ1MgcmF0ZQorCQkJZm9yKGk9MDtpPD0xNTtpKyspeworCQkJCXBPcGVyYXRlTUNTW2ldID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCisJY2FzZSBJRUVFX05fMjRHOgkvL2Fzc3VtZSBDQ0sgcmF0ZSBvaworCWNhc2UgSUVFRV9OXzVHOgorCQkJLy8gTGVnYWN5IHBhcnQgd2Ugb25seSB1c2UgNiwgNS41LDIsMSBmb3IgTl8yNEcgYW5kIDYgZm9yIE5fNUcuCisJCQkvLyBMZWdhY3kgcGFydCBzaGFsbCBiZSBoYW5kbGVkIGF0IFNlbGVjdFJhdGVTZXQoKS4KKworCQkJLy9IVCBwYXJ0CisJCQkvLyBUT0RPOiBtYXkgYmUgZGlmZmVyZW50IGlmIHdlIGhhdmUgZGlmZmVyZW50IG51bWJlciBvZiBhbnRlbm5hCisJCQlwT3BlcmF0ZU1DU1swXSAmPVJBVEVfQURQVF8xU1NfTUFTSzsJLy9zdXBwb3J0IE1DUyAwfjcKKwkJCXBPcGVyYXRlTUNTWzFdICY9UkFURV9BRFBUXzJTU19NQVNLOworCQkJcE9wZXJhdGVNQ1NbM10gJj1SQVRFX0FEUFRfTUNTMzJfTUFTSzsKKwkJCWJyZWFrOworCisJLy9zaG91bGQgbmV2ZXIgcmVhY2ggaGVyZQorCWRlZmF1bHQ6CisKKwkJCWJyZWFrOworCisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisqCURlc2NyaXB0aW9uOgorKgkJVGhpcyBmdW5jdGlvbiB3aWxsIGdldCB0aGUgaGlnaGVzdCBzcGVlZCByYXRlIGluIGlucHV0IE1DUyBzZXQuCisqCisqCS9wYXJhbSAJQWRhcHRlcgkJCVBpb250ZXIgdG8gQWRhcHRlciBlbnRpdHkKKyoJCQlwTUNTUmF0ZVNldAkJUG9pbnRlciB0byBNQ1MgcmF0ZSBiaXRtYXAKKyoJCQlwTUNTRmlsdGVyCQlQb2ludGVyIHRvIE1DUyByYXRlIGZpbHRlcgorKgorKgkvcmV0dXJuCUhpZ2hlc3QgTUNTIHJhdGUgaW5jbHVkZWQgaW4gcE1DU1JhdGVTZXQgYW5kIGZpbHRlcmVkIGJ5IHBNQ1NGaWx0ZXIuCisqCisqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiB3aWxsIGdldCB0aGUgaGlnaGVzdCBzcGVlZCByYXRlIGluIGlucHV0IE1DUyBzZXQuCisgKiAgIGlucHV0OiAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIAlpZWVlCisgKiAgIAkgICAgIHU4KiAJCQlwTUNTUmF0ZVNldCAvL1BvaW50ZXIgdG8gTUNTIHJhdGUgYml0bWFwCisgKiAgIAkgICAgIHU4KgkJCXBNQ1NGaWx0ZXIgLy9Qb2ludGVyIHRvIE1DUyByYXRlIGZpbHRlcgorICogIHJldHVybjogIEhpZ2hlc3QgTUNTIHJhdGUgaW5jbHVkZWQgaW4gcE1DU1JhdGVTZXQgYW5kIGZpbHRlcmVkIGJ5IHBNQ1NGaWx0ZXIKKyAqICBub3RpY2U6CisgICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBIVEdldEhpZ2hlc3RNQ1NSYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogcE1DU1JhdGVTZXQsIHU4KiBwTUNTRmlsdGVyKQoreworCXU4CQlpLCBqOworCXU4CQliaXRNYXA7CisJdTgJCW1jc1JhdGUgPSAwOworCXU4CQlhdmFpbGFibGVNY3NSYXRlWzE2XTsKKwlpZiAocE1DU1JhdGVTZXQgPT0gTlVMTCB8fCBwTUNTRmlsdGVyID09IE5VTEwpCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgInBNQ1NSYXRlU2V0IG9yIHBNQ1NGaWx0ZXIgY2FuJ3QgYmUgbnVsbCBpbiBIVEdldEhpZ2hlc3RNQ1NSYXRlKClcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCWZvcihpPTA7IGk8MTY7IGkrKykKKwkJYXZhaWxhYmxlTWNzUmF0ZVtpXSA9IHBNQ1NSYXRlU2V0W2ldICYgcE1DU0ZpbHRlcltpXTsKKworCWZvcihpID0gMDsgaSA8IDE2OyBpKyspCisJeworCQlpZihhdmFpbGFibGVNY3NSYXRlW2ldICE9IDApCisJCQlicmVhazsKKwl9CisJaWYoaSA9PSAxNikKKwkJcmV0dXJuIGZhbHNlOworCisJZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykKKwl7CisJCWlmKGF2YWlsYWJsZU1jc1JhdGVbaV0gIT0gMCkKKwkJeworCQkJYml0TWFwID0gYXZhaWxhYmxlTWNzUmF0ZVtpXTsKKwkJCWZvcihqID0gMDsgaiA8IDg7IGorKykKKwkJCXsKKwkJCQlpZigoYml0TWFwJTIpICE9IDApCisJCQkJeworCQkJCQlpZihIVE1jc1RvRGF0YVJhdGUoaWVlZSwgKDgqaStqKSkgPiBIVE1jc1RvRGF0YVJhdGUoaWVlZSwgbWNzUmF0ZSkpCisJCQkJCQltY3NSYXRlID0gKDgqaStqKTsKKwkJCQl9CisJCQkJYml0TWFwID0gYml0TWFwPj4xOworCQkJfQorCQl9CisJfQorCXJldHVybiAobWNzUmF0ZXwweDgwKTsKK30KKworCisKKy8qCisqKgorKioxLkZpbHRlciBvdXIgb3BlcmF0aW9uIHJhdGUgc2V0IHdpdGggQVAncyByYXRlIHNldAorKioyLnNoYWxsIHJlZmVyZW5jZSBjaGFubmVsIGJhbmR3aWR0aCwgU1RCQywgQW50ZW5uYSBudW1iZXIKKyoqMy5nZW5lcmF0ZSByYXRlIGFkYXRpdmUgdGFibGUgZm9yIGZpcm13YXJlCisqKkRhdmlkIDIwMDYwOTA2CisqKgorKiogXHBIVFN1cHBvcnRlZENhcDogdGhlIGNvbm5lY3RlZCBTVEEncyBzdXBwb3J0ZWQgcmF0ZSBDYXBhYmlsaXR5IGVsZW1lbnQKKyovCit1OCBIVEZpbHRlck1DU1JhdGUoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogcFN1cHBvcnRNQ1MsIHU4KiBwT3BlcmF0ZU1DUykKK3sKKworCXU4IGk9MDsKKworCS8vIGZpbHRlciBvdXQgb3BlcmF0aW9uYWwgcmF0ZSBzZXQgbm90IHN1cHBvcnRlZCBieSBBUCwgdGhlIGxlbnRoIG9mIGl0IGlzIDE2CisJZm9yKGk9MDtpPD0xNTtpKyspeworCQlwT3BlcmF0ZU1DU1tpXSA9IGllZWUtPlJlZ2RvdDExSFRPcGVyYXRpb25hbFJhdGVTZXRbaV0mcFN1cHBvcnRNQ1NbaV07CisJfQorCisKKwkvLyBUT0RPOiBhZGp1c3Qgb3VyIG9wZXJhdGlvbmFsIHJhdGUgc2V0ICBhY2NvcmRpbmcgdG8gb3VyIGNoYW5uZWwgYmFuZHdpZHRoLCBTVEJDIGFuZCBBbnRlbm5hIG51bWJlcgorCisJLy8gVE9ETzogZmlsbCBzdWdnZXN0ZWQgcmF0ZSBhZGFwdGl2ZSByYXRlIGluZGV4IGFuZCBnaXZlIGZpcm13YXJlIGluZm8gdXNpbmcgVHggY29tbWFuZCBwYWNrZXQKKwkvLyB3ZSBhbHNvIHNoYWxsIHN1Z2dlc3RlZCB0aGUgZmlyc3Qgc3RhcnQgcmF0ZSBzZXQgYWNjb3JkaW5nIHRvIG91ciBzaW5nYWwgc3RyZW5ndGgKKwlIVF9QaWNrTUNTUmF0ZShpZWVlLCBwT3BlcmF0ZU1DUyk7CisKKwkvLyBGb3IgUlRMODE5WCwgaWYgcGFpcndpc2VrZXkgPSB3ZXAvdGtpcCwgd2Ugc3VwcG9ydCBvbmx5IE1DUzB+Ny4KKwlpZihpZWVlLT5HZXRIYWxmTm1vZGVTdXBwb3J0QnlBUHNIYW5kbGVyKGllZWUtPmRldikpCisJCXBPcGVyYXRlTUNTWzFdID0gMDsKKworCS8vCisJLy8gRm9yIFJUTDgxOVgsIHdlIHN1cHBvcnQgb25seSBNQ1MwfjE1LgorCS8vIEFuZCBhbHNvLCB3ZSBkbyBub3Qga25vdyBob3cgdG8gdXNlIE1DUzMyIG5vdy4KKwkvLworCWZvcihpPTI7IGk8PTE1OyBpKyspCisJCXBPcGVyYXRlTUNTW2ldID0gMDsKKworCXJldHVybiB0cnVlOworfQordm9pZCBIVFNldENvbm5lY3RCd01vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIEhUX0NIQU5ORUxfV0lEVEgJQmFuZHdpZHRoLCBIVF9FWFRDSE5MX09GRlNFVAlPZmZzZXQpOwordm9pZCBIVE9uQXNzb2NSc3Aoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKwlQSFRfQ0FQQUJJTElUWV9FTEUJCXBQZWVySFRDYXAgPSBOVUxMOworCVBIVF9JTkZPUk1BVElPTl9FTEUJCXBQZWVySFRJbmZvID0gTlVMTDsKKwl1MTYJbk1heEFNU0RVU2l6ZSA9IDA7CisJdTgqCXBNY3NGaWx0ZXIgPSBOVUxMOworCisJc3RhdGljIHU4CQkJCUVXQzExTkhUQ2FwW10gPSB7MHgwMCwgMHg5MCwgMHg0YywgMHgzM307CQkvLyBGb3IgMTFuIEVXQyBkZWZpbml0aW9uLCAyMDA3LjA3LjE3LCBieSBFbWlseQorCXN0YXRpYyB1OAkJCQlFV0MxMU5IVEluZm9bXSA9IHsweDAwLCAweDkwLCAweDRjLCAweDM0fTsJLy8gRm9yIDExbiBFV0MgZGVmaW5pdGlvbiwgMjAwNy4wNy4xNywgYnkgRW1pbHkKKworCWlmKCBwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9PSBmYWxzZSApCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgIjw9PT0gSFRPbkFzc29jUnNwKCk6IEhUX0RJU0FCTEVcbiIpOworCQlyZXR1cm47CisJfQorCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICI9PT0+IEhUT25Bc3NvY1JzcF93cSgpOiBIVF9FTkFCTEVcbiIpOworLy8JSUVFRTgwMjExX0RFQlVHX0RBVEEoSUVFRTgwMjExX0RMX0RBVEEsIHBIVEluZm8tPlBlZXJIVENhcEJ1Ziwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfRUxFKSk7CisvLwlJRUVFODAyMTFfREVCVUdfREFUQShJRUVFODAyMTFfRExfREFUQSwgcEhUSW5mby0+UGVlckhUSW5mb0J1Ziwgc2l6ZW9mKEhUX0lORk9STUFUSU9OX0VMRSkpOworCisvLwlIVERlYnVnSFRDYXBhYmlsaXR5KHBIVEluZm8tPlBlZXJIVENhcEJ1ZiwiSFRPbkFzc29jUnNwX3dxIik7CisvLwlIVERlYnVnSFRJbmZvKHBIVEluZm8tPlBlZXJIVEluZm9CdWYsIkhUT25Bc3NvY1JzcF93cSIpOworCS8vCisJaWYoIW1lbWNtcChwSFRJbmZvLT5QZWVySFRDYXBCdWYsRVdDMTFOSFRDYXAsIHNpemVvZihFV0MxMU5IVENhcCkpKQorCQlwUGVlckhUQ2FwID0gKFBIVF9DQVBBQklMSVRZX0VMRSkoJnBIVEluZm8tPlBlZXJIVENhcEJ1Zls0XSk7CisJZWxzZQorCQlwUGVlckhUQ2FwID0gKFBIVF9DQVBBQklMSVRZX0VMRSkocEhUSW5mby0+UGVlckhUQ2FwQnVmKTsKKworCWlmKCFtZW1jbXAocEhUSW5mby0+UGVlckhUSW5mb0J1ZiwgRVdDMTFOSFRJbmZvLCBzaXplb2YoRVdDMTFOSFRJbmZvKSkpCisJCXBQZWVySFRJbmZvID0gKFBIVF9JTkZPUk1BVElPTl9FTEUpKCZwSFRJbmZvLT5QZWVySFRJbmZvQnVmWzRdKTsKKwllbHNlCisJCXBQZWVySFRJbmZvID0gKFBIVF9JTkZPUk1BVElPTl9FTEUpKHBIVEluZm8tPlBlZXJIVEluZm9CdWYpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENvbmZpZ3VyYXRpb25zOgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJSUVFRTgwMjExX0RFQlVHX0RBVEEoSUVFRTgwMjExX0RMX0RBVEF8SUVFRTgwMjExX0RMX0hULCBwUGVlckhUQ2FwLCBzaXplb2YoSFRfQ0FQQUJJTElUWV9FTEUpKTsKKy8vCUlFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBfElFRUU4MDIxMV9ETF9IVCwgcFBlZXJIVEluZm8sIHNpemVvZihIVF9JTkZPUk1BVElPTl9FTEUpKTsKKwkvLyBDb25maWcgU3VwcG9ydGVkIENoYW5uZWwgV2lkdGggc2V0dGluZworCS8vCisJSFRTZXRDb25uZWN0QndNb2RlKGllZWUsIChIVF9DSEFOTkVMX1dJRFRIKShwUGVlckhUQ2FwLT5DaGxXaWR0aCksIChIVF9FWFRDSE5MX09GRlNFVCkocFBlZXJIVEluZm8tPkV4dENobE9mZnNldCkpOworCisvLwlpZihwSFRJbmZvLT5iQ3VyQlc0ME1IeiA9PSB0cnVlKQorCQlwSFRJbmZvLT5iQ3VyVHhCVzQwTUh6ID0gKChwUGVlckhUSW5mby0+UmVjb21tZW1kZWRUeFdpZHRoID09IDEpP3RydWU6ZmFsc2UpOworCisJLy8KKwkvLyBVcGRhdGUgc2hvcnQgR0kvIGxvbmcgR0kgc2V0dGluZworCS8vCisJLy8gVE9ETzoKKwlwSFRJbmZvLT5iQ3VyU2hvcnRHSTIwTUh6PQorCQkoKHBIVEluZm8tPmJSZWdTaG9ydEdJMjBNSHopPygocFBlZXJIVENhcC0+U2hvcnRHSTIwTWh6PT0xKT90cnVlOmZhbHNlKTpmYWxzZSk7CisJcEhUSW5mby0+YkN1clNob3J0R0k0ME1Iej0KKwkJKChwSFRJbmZvLT5iUmVnU2hvcnRHSTQwTUh6KT8oKHBQZWVySFRDYXAtPlNob3J0R0k0ME1oej09MSk/dHJ1ZTpmYWxzZSk6ZmFsc2UpOworCisJLy8KKwkvLyBDb25maWcgVFggU1RCQyBzZXR0aW5nCisJLy8KKwkvLyBUT0RPOgorCisJLy8KKwkvLyBDb25maWcgRFNTUy9DQ0sgIG1vZGUgaW4gNDBNSHogbW9kZQorCS8vCisJLy8gVE9ETzoKKwlwSFRJbmZvLT5iQ3VyU3VwcENDSyA9CisJCSgocEhUSW5mby0+YlJlZ1N1cHBDQ0spPygocFBlZXJIVENhcC0+RHNzQ0NrPT0xKT90cnVlOmZhbHNlKTpmYWxzZSk7CisKKworCS8vCisJLy8gQ29uZmlnIGFuZCBjb25maWd1cmUgQS1NU0RVIHNldHRpbmcKKwkvLworCXBIVEluZm8tPmJDdXJyZW50X0FNU0RVX1N1cHBvcnQgPSBwSFRJbmZvLT5iQU1TRFVfU3VwcG9ydDsKKworCW5NYXhBTVNEVVNpemUgPSAocFBlZXJIVENhcC0+TWF4QU1TRFVTaXplPT0wKT8zODM5Ojc5MzU7CisKKwlpZihwSFRJbmZvLT5uQU1TRFVfTWF4U2l6ZSA+IG5NYXhBTVNEVVNpemUgKQorCQlwSFRJbmZvLT5uQ3VycmVudF9BTVNEVV9NYXhTaXplID0gbk1heEFNU0RVU2l6ZTsKKwllbHNlCisJCXBIVEluZm8tPm5DdXJyZW50X0FNU0RVX01heFNpemUgPSBwSFRJbmZvLT5uQU1TRFVfTWF4U2l6ZTsKKworCisJLy8KKwkvLyBDb25maWcgQS1NUERVIHNldHRpbmcKKwkvLworCXBIVEluZm8tPmJDdXJyZW50QU1QRFVFbmFibGUgPSBwSFRJbmZvLT5iQU1QRFVFbmFibGU7CisKKwkvLyA8MT4gRGVjaWRlIEFNUERVIEZhY3RvcgorCisJLy8gQnkgRW1pbHkKKwlpZighcEhUSW5mby0+YlJlZ1JUMlJUQWdncmVnYXRpb24pCisJeworCQkvLyBEZWNpZGUgQU1QRFUgRmFjdG9yIGFjY29yZGluZyB0byBwcm90b2NvbCBoYW5kc2hha2UKKwkJaWYocEhUSW5mby0+QU1QRFVfRmFjdG9yID4gcFBlZXJIVENhcC0+TWF4UnhBTVBEVUZhY3RvcikKKwkJCXBIVEluZm8tPkN1cnJlbnRBTVBEVUZhY3RvciA9IHBQZWVySFRDYXAtPk1heFJ4QU1QRFVGYWN0b3I7CisJCWVsc2UKKwkJCXBIVEluZm8tPkN1cnJlbnRBTVBEVUZhY3RvciA9IHBIVEluZm8tPkFNUERVX0ZhY3RvcjsKKworCX1lbHNlCisJeworCQkvLyBTZXQgTVBEVSBkZW5zaXR5IHRvIDIgdG8gUmVhbHRlayBBUCwgYW5kIHNldCBpdCB0byAwIGZvciBvdGhlcnMKKwkJLy8gUmVwbGFjZSBNUERVIGZhY3RvciBkZWNsYXJlZCBpbiBvcmlnaW5hbCBhc3NvY2lhdGlvbiByZXNwb25zZSBmcmFtZSBmb3JtYXQuIDIwMDcuMDguMjAgYnkgRW1pbHkKKwkJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NodC5iZFJUMlJUQWdncmVnYXRpb24pCisJCXsKKwkJCWlmKCBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSAhPSBLRVlfVFlQRV9OQSkKKwkJCQkvLyBSZWFsdGVrIG1heSBzZXQgMzJrIGluIHNlY3VyaXR5IG1vZGUgYW5kIDY0ayBmb3Igb3RoZXJzCisJCQkJcEhUSW5mby0+Q3VycmVudEFNUERVRmFjdG9yID0gcFBlZXJIVENhcC0+TWF4UnhBTVBEVUZhY3RvcjsKKwkJCWVsc2UKKwkJCQlwSFRJbmZvLT5DdXJyZW50QU1QRFVGYWN0b3IgPSBIVF9BR0dfU0laRV82NEs7CisJCX1lbHNlCisJCXsKKwkJCWlmKHBQZWVySFRDYXAtPk1heFJ4QU1QRFVGYWN0b3IgPCBIVF9BR0dfU0laRV8zMkspCisJCQkJcEhUSW5mby0+Q3VycmVudEFNUERVRmFjdG9yID0gcFBlZXJIVENhcC0+TWF4UnhBTVBEVUZhY3RvcjsKKwkJCWVsc2UKKwkJCQlwSFRJbmZvLT5DdXJyZW50QU1QRFVGYWN0b3IgPSBIVF9BR0dfU0laRV8zMks7CisJCX0KKwl9CisKKwkvLyA8Mj4gU2V0IEFNUERVIE1pbmltdW0gTVBEVSBTdGFydCBTcGFjaW5nCisJLy8gODAyLjExbiAzLjAgc2VjdGlvbiA5LjdkLjMKKwlpZihwSFRJbmZvLT5NUERVX0RlbnNpdHkgPiBwUGVlckhUQ2FwLT5NUERVRGVuc2l0eSkKKwkJcEhUSW5mby0+Q3VycmVudE1QRFVEZW5zaXR5ID0gcEhUSW5mby0+TVBEVV9EZW5zaXR5OworCWVsc2UKKwkJcEhUSW5mby0+Q3VycmVudE1QRFVEZW5zaXR5ID0gcFBlZXJIVENhcC0+TVBEVURlbnNpdHk7CisJaWYoaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUgIT0gS0VZX1RZUEVfTkEgKQorCQlwSFRJbmZvLT5DdXJyZW50TVBEVURlbnNpdHkgCT0gNzsgLy8gOHVzCisJLy8gRm9yY2UgVFggQU1TRFUKKworCS8vIExhbmhzaW46IG1hcmsgZm9yIHRtcCB0byBhdm9pZCBkZWF1dGggYnkgYXAgZnJvbSAgczMKKwkvL2lmKG1lbWNtcChwTWdudEluZm8tPkJzc2lkLCBORVRHRUFSODM0QnYyX0JST0FEQ09NLCAzKT09MCkKKwlpZigwKQorCQl7CisKKwkJCXBIVEluZm8tPmJDdXJyZW50QU1QRFVFbmFibGUgPSBmYWxzZTsKKwkJCXBIVEluZm8tPkZvcmNlZEFNU0RVTW9kZSA9IEhUX0FHR19GT1JDRV9FTkFCTEU7CisJCQlwSFRJbmZvLT5Gb3JjZWRBTVNEVU1heFNpemUgPSA3OTM1OworCisJCXBIVEluZm8tPklPVEFjdGlvbiB8PSAgSFRfSU9UX0FDVF9UWF9VU0VfQU1TRFVfOEs7CisJfQorCisJLy8gUnggUmVvcmRlciBTZXR0aW5nCisJcEhUSW5mby0+YkN1clJ4UmVvcmRlckVuYWJsZSA9IHBIVEluZm8tPmJSZWdSeFJlb3JkZXJFbmFibGU7CisKKwkvLworCS8vIEZpbHRlciBvdXQgdW5zdXBwb3J0ZWQgSFQgcmF0ZSBmb3IgdGhpcyBBUAorCS8vIFVwZGF0ZSBSQVRSIHRhYmxlCisJLy8gVGhpcyBpcyBvbmx5IGZvciA4MTkwICw4MTkyIG9yIGxhdGVyIHByb2R1Y3Qgd2hpY2ggdXNpbmcgZmlybXdhcmUgdG8gaGFuZGxlIHJhdGUgYWRhcHRpdmUgbWVjaGFuaXNtLgorCS8vCisKKwkvLyBIYW5kbGUgUmFsaW5rIEFQIGJhZCBNQ1MgcmF0ZSBzZXQgY29uZGl0aW9uLiBKb3NlcGguCisJLy8gVGhpcyBmaXggdGhlIGJ1ZyBvZiBSYWxpbmsgQVAuIFRoaXMgbWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KKwlpZihwUGVlckhUQ2FwLT5NQ1NbMF0gPT0gMCkKKwkJcFBlZXJIVENhcC0+TUNTWzBdID0gMHhmZjsKKworCUhURmlsdGVyTUNTUmF0ZShpZWVlLCBwUGVlckhUQ2FwLT5NQ1MsIGllZWUtPmRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQpOworCisJLy8KKwkvLyBDb25maWcgTUlNTyBQb3dlciBTYXZlIHNldHRpbmcKKwkvLworCXBIVEluZm8tPlBlZXJNaW1vUHMgPSBwUGVlckhUQ2FwLT5NaW1vUHdyU2F2ZTsKKwlpZihwSFRJbmZvLT5QZWVyTWltb1BzID09IE1JTU9fUFNfU1RBVElDKQorCQlwTWNzRmlsdGVyID0gTUNTX0ZJTFRFUl8xU1M7CisJZWxzZQorCQlwTWNzRmlsdGVyID0gTUNTX0ZJTFRFUl9BTEw7CisJLy9XQiBhZGQgZm9yIE1DUzggYnVnCisvLwlwTWNzRmlsdGVyID0gTUNTX0ZJTFRFUl8xU1M7CisJaWVlZS0+SFRIaWdoZXN0T3BlcmFSYXRlID0gSFRHZXRIaWdoZXN0TUNTUmF0ZShpZWVlLCBpZWVlLT5kb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0LCBwTWNzRmlsdGVyKTsKKwlpZWVlLT5IVEN1cnJlbnRPcGVyYVJhdGUgPSBpZWVlLT5IVEhpZ2hlc3RPcGVyYVJhdGU7CisKKwkvLworCS8vIENvbmZpZyBjdXJyZW50IG9wZXJhdGlvbiBtb2RlLgorCS8vCisJcEhUSW5mby0+Q3VycmVudE9wTW9kZSA9IHBQZWVySFRJbmZvLT5PcHRNb2RlOworCisKKworfQorCit2b2lkIEhUU2V0Q29ubmVjdEJ3TW9kZUNhbGxiYWNrKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIGluaXRpYWxpemUgSFQgaW5mbyhzdHJ1Y3QgUFJUX0hJR0hfVEhST1VHSFBVVCkKKyAqICAgaW5wdXQ6ICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogCWllZWUKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgbm9uZQorICogIG5vdGljZTogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiAqICAoMSkgTVBJbml0aWFsaXphdGlvbiBQaGFzZSAqICAoMikgUmVjZWl2aW5nIG9mIERlYXV0aGVudGljYXRpb24gZnJvbSBBUAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBUT0RPOiBTaG91bGQgdGhpcyBmdW5jaXRvbiBiZSBjYWxsZWQgd2hlbiByZWNlaXZpbmcgb2YgRGlzYXNzb2NpYXRpb24/Cit2b2lkIEhUSW5pdGlhbGl6ZUhUSW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSkKK3sKKwlQUlRfSElHSF9USFJPVUdIUFVUIHBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworCisJLy8KKwkvLyBUaGVzZSBwYXJhbWV0ZXJzIHdpbGwgYmUgcmVzZXQgd2hlbiByZWNlaXZpbmcgZGVhdXRoZW50aWNhdGlvbiBwYWNrZXQKKwkvLworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICI9PT09PT09PT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCXBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID0gZmFsc2U7CisKKwkvLyA0ME1IeiBjaGFubmVsIHN1cHBvcnQKKwlwSFRJbmZvLT5iQ3VyQlc0ME1IeiA9IGZhbHNlOworCXBIVEluZm8tPmJDdXJUeEJXNDBNSHogPSBmYWxzZTsKKworCS8vIFNob3J0IEdJIHN1cHBvcnQKKwlwSFRJbmZvLT5iQ3VyU2hvcnRHSTIwTUh6ID0gZmFsc2U7CisJcEhUSW5mby0+YkN1clNob3J0R0k0ME1IeiA9IGZhbHNlOworCXBIVEluZm8tPmJGb3JjZWRTaG9ydEdJID0gZmFsc2U7CisKKwkvLyBDQ0sgcmF0ZSBzdXBwb3J0CisJLy8gVGhpcyBmbGFnIGlzIHNldCB0byB0cnVlIHRvIHN1cHBvcnQgQ0NLIHJhdGUgYnkgZGVmYXVsdC4KKwkvLyBJdCB3aWxsIGJlIGFmZmVjdGVkIGJ5ICJwSFRJbmZvLT5iUmVnU3VwcENDSyIgYW5kIEFQIGNhcGFiaWxpdGllcyBvbmx5IHdoZW4gYXNzb2NpYXRlIHRvCisJLy8gMTFOIEJTUy4KKwlwSFRJbmZvLT5iQ3VyU3VwcENDSyA9IHRydWU7CisKKwkvLyBBTVNEVSByZWxhdGVkCisJcEhUSW5mby0+YkN1cnJlbnRfQU1TRFVfU3VwcG9ydCA9IGZhbHNlOworCXBIVEluZm8tPm5DdXJyZW50X0FNU0RVX01heFNpemUgPSBwSFRJbmZvLT5uQU1TRFVfTWF4U2l6ZTsKKworCS8vIEFNUFVEIHJlbGF0ZWQKKwlwSFRJbmZvLT5DdXJyZW50TVBEVURlbnNpdHkgPSBwSFRJbmZvLT5NUERVX0RlbnNpdHk7CisJcEhUSW5mby0+Q3VycmVudEFNUERVRmFjdG9yID0gcEhUSW5mby0+QU1QRFVfRmFjdG9yOworCisKKworCS8vIEluaXRpYWxpemUgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzIHJlbGF0ZWQgdG8gMTFuCisJbWVtc2V0KCh2b2lkKikoJihwSFRJbmZvLT5TZWxmSFRDYXApKSwgMCwgc2l6ZW9mKHBIVEluZm8tPlNlbGZIVENhcCkpOworCW1lbXNldCgodm9pZCopKCYocEhUSW5mby0+U2VsZkhUSW5mbykpLCAwLCBzaXplb2YocEhUSW5mby0+U2VsZkhUSW5mbykpOworCW1lbXNldCgodm9pZCopKCYocEhUSW5mby0+UGVlckhUQ2FwQnVmKSksIDAsIHNpemVvZihwSFRJbmZvLT5QZWVySFRDYXBCdWYpKTsKKwltZW1zZXQoKHZvaWQqKSgmKHBIVEluZm8tPlBlZXJIVEluZm9CdWYpKSwgMCwgc2l6ZW9mKHBIVEluZm8tPlBlZXJIVEluZm9CdWYpKTsKKworCXBIVEluZm8tPmJTd0J3SW5Qcm9ncmVzcyA9IGZhbHNlOworCXBIVEluZm8tPkNobmxPcCA9IENITkxPUF9OT05FOworCisJLy8gU2V0IGRlZmF1bHQgSUVFRSBzcGVjIGZvciBEcmFmdCBOCisJcEhUSW5mby0+ZVBlZXJIVFNwZWNWZXIgPSBIVF9TUEVDX1ZFUl9JRUVFOworCisJLy8gUmVhbHRlayBwcm9wcmlldGFyeSBhZ2dyZWdhdGlvbiBtb2RlCisJcEhUSW5mby0+YkN1cnJlbnRSVDJSVEFnZ3JlZ2F0aW9uID0gZmFsc2U7CisJcEhUSW5mby0+YkN1cnJlbnRSVDJSVExvbmdTbG90VGltZSA9IGZhbHNlOworCXBIVEluZm8tPklPVFBlZXIgPSAwOworCXBIVEluZm8tPklPVEFjdGlvbiA9IDA7CisKKwkvL01DUyByYXRlIGluaXRpYWxpemVkIGhlcmUKKwl7CisJCXU4KiBSZWdIVFN1cHBSYXRlU2V0cyA9ICYoaWVlZS0+UmVnSFRTdXBwUmF0ZVNldFswXSk7CisJCVJlZ0hUU3VwcFJhdGVTZXRzWzBdID0gMHhGRjsJLy9zdXBwb3J0IE1DUyAwfjcKKwkJUmVnSFRTdXBwUmF0ZVNldHNbMV0gPSAweEZGOwkvL3N1cHBvcnQgTUNTIDh+MTUKKwkJUmVnSFRTdXBwUmF0ZVNldHNbNF0gPSAweDAxOwkvL3N1cHBvcnQgTUNTIDMyCisJfQorfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgaW5pdGlhbGl6ZSBCc3MgSFQgc3RydWN0dXJlKHN0cnVjdCBQQlNTX0hUKQorICogICBpbnB1dDogIFBCU1NfSFQgcEJzc0hUIC8vdG8gYmUgaW5pdGlhbGl6ZWQKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgbm9uZQorICogIG5vdGljZTogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBpbml0aWFsaXplIG5ldHdvcmsgc3RydWN0dXJlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSFRJbml0aWFsaXplQnNzRGVzYyhQQlNTX0hUIHBCc3NIVCkKK3sKKworCXBCc3NIVC0+YmRTdXBwb3J0SFQgPSBmYWxzZTsKKwltZW1zZXQocEJzc0hULT5iZEhUQ2FwQnVmLCAwLCBzaXplb2YocEJzc0hULT5iZEhUQ2FwQnVmKSk7CisJcEJzc0hULT5iZEhUQ2FwTGVuID0gMDsKKwltZW1zZXQocEJzc0hULT5iZEhUSW5mb0J1ZiwgMCwgc2l6ZW9mKHBCc3NIVC0+YmRIVEluZm9CdWYpKTsKKwlwQnNzSFQtPmJkSFRJbmZvTGVuID0gMDsKKworCXBCc3NIVC0+YmRIVFNwZWNWZXI9IEhUX1NQRUNfVkVSX0lFRUU7CisKKwlwQnNzSFQtPmJkUlQyUlRBZ2dyZWdhdGlvbiA9IGZhbHNlOworCXBCc3NIVC0+YmRSVDJSVExvbmdTbG90VGltZSA9IGZhbHNlOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgaW5pdGlhbGl6ZSBCc3MgSFQgc3RydWN0dXJlKHN0cnVjdCBQQlNTX0hUKQorICogICBpbnB1dDogIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlIAkqaWVlZQorICogICAJICAgICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgCSpwTmV0d29yayAvL3VzdWFsbHkgY3VycmVudCBuZXR3b3JrIHdlIGFyZSBsaXZlIGluCisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIG5vbmUKKyAqICBub3RpY2U6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIE9OTFkgYmUgY2FsbGVkIGJlZm9yZSBhc3NvY2lhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhUUmVzZXRTZWxmQW5kU2F2ZVBlZXJTZXR0aW5nKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCAJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICogcE5ldHdvcmspCit7CisJUFJUX0hJR0hfVEhST1VHSFBVVAkJcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CisvLwl1MTYJCQkJCQluTWF4QU1TRFVTaXplOworLy8JUEhUX0NBUEFCSUxJVFlfRUxFCQlwUGVlckhUQ2FwID0gKFBIVF9DQVBBQklMSVRZX0VMRSlwTmV0d29yay0+YnNzaHQuYmRIVENhcEJ1ZjsKKy8vCVBIVF9JTkZPUk1BVElPTl9FTEUJCXBQZWVySFRJbmZvID0gKFBIVF9JTkZPUk1BVElPTl9FTEUpcE5ldHdvcmstPmJzc2h0LmJkSFRJbmZvQnVmOworLy8JdTgqCXBNY3NGaWx0ZXI7CisJdTgJYklPVEFjdGlvbiA9IDA7CisKKwkvLworCS8vICBTYXZlIFBlZXIgU2V0dGluZyBiZWZvcmUgQXNzb2NpYXRpb24KKwkvLworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICI9PT09PT09PT09PT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCS8qdW5tYXJrIGJFbmFibGVIVCBmbGFnIGhlcmUgaXMgdGhlIHNhbWUgcmVhc29uIHdoeSB1bm1hcmtlZCBpbiBmdW5jdGlvbiBpZWVlODAyMTFfc29mdG1hY19uZXdfbmV0LiBXQiAyMDA4LjA5LjEwKi8KKy8vCWlmKCBwSFRJbmZvLT5iRW5hYmxlSFQgJiYgIHBOZXR3b3JrLT5ic3NodC5iZFN1cHBvcnRIVCkKKwlpZiAocE5ldHdvcmstPmJzc2h0LmJkU3VwcG9ydEhUKQorCXsKKwkJcEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPSB0cnVlOworCQlwSFRJbmZvLT5lUGVlckhUU3BlY1ZlciA9IHBOZXR3b3JrLT5ic3NodC5iZEhUU3BlY1ZlcjsKKworCQkvLyBTYXZlIEhUQ2FwIGFuZCBIVEluZm8gaW5mb3JtYXRpb24gRWxlbWVudAorCQlpZihwTmV0d29yay0+YnNzaHQuYmRIVENhcExlbiA+IDAgJiYgCXBOZXR3b3JrLT5ic3NodC5iZEhUQ2FwTGVuIDw9IHNpemVvZihwSFRJbmZvLT5QZWVySFRDYXBCdWYpKQorCQkJbWVtY3B5KHBIVEluZm8tPlBlZXJIVENhcEJ1ZiwgcE5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWYsIHBOZXR3b3JrLT5ic3NodC5iZEhUQ2FwTGVuKTsKKworCQlpZihwTmV0d29yay0+YnNzaHQuYmRIVEluZm9MZW4gPiAwICYmIHBOZXR3b3JrLT5ic3NodC5iZEhUSW5mb0xlbiA8PSBzaXplb2YocEhUSW5mby0+UGVlckhUSW5mb0J1ZikpCisJCQltZW1jcHkocEhUSW5mby0+UGVlckhUSW5mb0J1ZiwgcE5ldHdvcmstPmJzc2h0LmJkSFRJbmZvQnVmLCBwTmV0d29yay0+YnNzaHQuYmRIVEluZm9MZW4pOworCisJCS8vIENoZWNrIHdoZXRoZXIgUlQgdG8gUlQgYWdncmVnYXRpb24gbW9kZSBpcyBlbmFibGVkCisJCWlmKHBIVEluZm8tPmJSZWdSVDJSVEFnZ3JlZ2F0aW9uKQorCQl7CisJCQlwSFRJbmZvLT5iQ3VycmVudFJUMlJUQWdncmVnYXRpb24gPSBwTmV0d29yay0+YnNzaHQuYmRSVDJSVEFnZ3JlZ2F0aW9uOworCQkJcEhUSW5mby0+YkN1cnJlbnRSVDJSVExvbmdTbG90VGltZSA9IHBOZXR3b3JrLT5ic3NodC5iZFJUMlJUTG9uZ1Nsb3RUaW1lOworCQl9CisJCWVsc2UKKwkJeworCQkJcEhUSW5mby0+YkN1cnJlbnRSVDJSVEFnZ3JlZ2F0aW9uID0gZmFsc2U7CisJCQlwSFRJbmZvLT5iQ3VycmVudFJUMlJUTG9uZ1Nsb3RUaW1lID0gZmFsc2U7CisJCX0KKworCQkvLyBEZXRlcm1pbmUgdGhlIElPVCBQZWVyIFZlbmRvci4KKwkJSFRJT1RQZWVyRGV0ZXJtaW5lKGllZWUpOworCisJCS8vIERlY2lkZSBJT1QgQWN0aW9uCisJCS8vIE11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBwYXJhbWV0ZXIgb2YgcEhUSW5mby0+YkN1cnJlbnRSVDJSVEFnZ3JlZ2F0aW9uIGlzIGRlY2lkZWQKKwkJcEhUSW5mby0+SU9UQWN0aW9uID0gMDsKKwkJYklPVEFjdGlvbiA9IEhUSU9UQWN0SXNEaXNhYmxlTUNTMTQoaWVlZSwgcE5ldHdvcmstPmJzc2lkKTsKKwkJaWYoYklPVEFjdGlvbikKKwkJCXBIVEluZm8tPklPVEFjdGlvbiB8PSBIVF9JT1RfQUNUX0RJU0FCTEVfTUNTMTQ7CisKKwkJYklPVEFjdGlvbiA9IEhUSU9UQWN0SXNEaXNhYmxlTUNTMTUoaWVlZSk7CisJCWlmKGJJT1RBY3Rpb24pCisJCQlwSFRJbmZvLT5JT1RBY3Rpb24gfD0gSFRfSU9UX0FDVF9ESVNBQkxFX01DUzE1OworCisJCWJJT1RBY3Rpb24gPSBIVElPVEFjdElzRGlzYWJsZU1DU1R3b1NwYXRpYWxTdHJlYW0oaWVlZSwgcE5ldHdvcmstPmJzc2lkKTsKKwkJaWYoYklPVEFjdGlvbikKKwkJCXBIVEluZm8tPklPVEFjdGlvbiB8PSBIVF9JT1RfQUNUX0RJU0FCTEVfQUxMXzJTUzsKKworCisJCWJJT1RBY3Rpb24gPSBIVElPVEFjdElzRGlzYWJsZUVEQ0FUdXJibyhpZWVlLCBwTmV0d29yay0+YnNzaWQpOworCQlpZihiSU9UQWN0aW9uKQorCQkJcEhUSW5mby0+SU9UQWN0aW9uIHw9IEhUX0lPVF9BQ1RfRElTQUJMRV9FRENBX1RVUkJPOworCisJCWJJT1RBY3Rpb24gPSBIVElPVEFjdElzTWdudFVzZUNDSzZNKHBOZXR3b3JrKTsKKwkJaWYoYklPVEFjdGlvbikKKwkJCXBIVEluZm8tPklPVEFjdGlvbiB8PSBIVF9JT1RfQUNUX01HTlRfVVNFX0NDS182TTsKKworCQliSU9UQWN0aW9uID0gSFRJT1RBY3RJc0NDREZzeW5jKHBOZXR3b3JrLT5ic3NpZCk7CisJCWlmKGJJT1RBY3Rpb24pCisJCQlwSFRJbmZvLT5JT1RBY3Rpb24gfD0gSFRfSU9UX0FDVF9DRERfRlNZTkM7CisKKworCX0KKwllbHNlCisJeworCQlwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9IGZhbHNlOworCQlwSFRJbmZvLT5iQ3VycmVudFJUMlJUQWdncmVnYXRpb24gPSBmYWxzZTsKKwkJcEhUSW5mby0+YkN1cnJlbnRSVDJSVExvbmdTbG90VGltZSA9IGZhbHNlOworCisJCXBIVEluZm8tPklPVEFjdGlvbiA9IDA7CisJfQorCit9CisKK3ZvaWQgSFRVcGRhdGVTZWxmQW5kUGVlclNldHRpbmcoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIAlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKiBwTmV0d29yaykKK3sKKwlQUlRfSElHSF9USFJPVUdIUFVUCXBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworLy8JUEhUX0NBUEFCSUxJVFlfRUxFCQlwUGVlckhUQ2FwID0gKFBIVF9DQVBBQklMSVRZX0VMRSlwTmV0d29yay0+YnNzaHQuYmRIVENhcEJ1ZjsKKwlQSFRfSU5GT1JNQVRJT05fRUxFCQlwUGVlckhUSW5mbyA9IChQSFRfSU5GT1JNQVRJT05fRUxFKXBOZXR3b3JrLT5ic3NodC5iZEhUSW5mb0J1ZjsKKworCWlmKHBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0KQorCXsKKwkJLy8KKwkJLy8gQ29uZmlnIGN1cnJlbnQgb3BlcmF0aW9uIG1vZGUuCisJCS8vCisJCWlmKHBOZXR3b3JrLT5ic3NodC5iZEhUSW5mb0xlbiAhPSAwKQorCQkJcEhUSW5mby0+Q3VycmVudE9wTW9kZSA9IHBQZWVySFRJbmZvLT5PcHRNb2RlOworCisJCS8vCisJCS8vIDxUT0RPOiBDb25maWcgYWNjb3JkaW5nIHRvIE9CU1Mgbm9uLUhUIFNUQSBwcmVzZW50ISE+CisJCS8vCisJfQorfQorCit2b2lkIEhUVXNlRGVmYXVsdFNldHRpbmcoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUpCit7CisJUFJUX0hJR0hfVEhST1VHSFBVVCBwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKy8vCXU4CXJlZ0J3T3BNb2RlOworCisJaWYocEhUSW5mby0+YkVuYWJsZUhUKQorCXsKKwkJcEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPSB0cnVlOworCisJCXBIVEluZm8tPmJDdXJTdXBwQ0NLID0gcEhUSW5mby0+YlJlZ1N1cHBDQ0s7CisKKwkJcEhUSW5mby0+YkN1ckJXNDBNSHogPSBwSFRJbmZvLT5iUmVnQlc0ME1IejsKKworCQlwSFRJbmZvLT5iQ3VyU2hvcnRHSTIwTUh6PSBwSFRJbmZvLT5iUmVnU2hvcnRHSTIwTUh6OworCisJCXBIVEluZm8tPmJDdXJTaG9ydEdJNDBNSHo9IHBIVEluZm8tPmJSZWdTaG9ydEdJNDBNSHo7CisKKwkJcEhUSW5mby0+YkN1cnJlbnRfQU1TRFVfU3VwcG9ydCA9IHBIVEluZm8tPmJBTVNEVV9TdXBwb3J0OworCisJCXBIVEluZm8tPm5DdXJyZW50X0FNU0RVX01heFNpemUgPSBwSFRJbmZvLT5uQU1TRFVfTWF4U2l6ZTsKKworCQlwSFRJbmZvLT5iQ3VycmVudEFNUERVRW5hYmxlID0gcEhUSW5mby0+YkFNUERVRW5hYmxlOworCisJCXBIVEluZm8tPkN1cnJlbnRBTVBEVUZhY3RvciA9IHBIVEluZm8tPkFNUERVX0ZhY3RvcjsKKworCQlwSFRJbmZvLT5DdXJyZW50TVBEVURlbnNpdHkgPSBwSFRJbmZvLT5DdXJyZW50TVBEVURlbnNpdHk7CisKKwkJLy8gU2V0IEJXT3BNb2RlIHJlZ2lzdGVyCisKKwkJLy91cGRhdGUgUkFUUiBpbmRleDAKKwkJSFRGaWx0ZXJNQ1NSYXRlKGllZWUsIGllZWUtPlJlZ2RvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQsIGllZWUtPmRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQpOworCS8vZnVuY3Rpb24gYmVsb3cgaXMgbm90IGltcGxlbWVudGVkIGF0IGFsbC4gV0IKKyNpZmRlZiBUT0RPCisJCUFkYXB0ZXItPkhhbEZ1bmMuSW5pdEhhbFJBVFJUYWJsZUhhbmRsZXIoIEFkYXB0ZXIsICZwTWdudEluZm8tPmRvdDExT3BlcmF0aW9uYWxSYXRlU2V0LCBwTWdudEluZm8tPmRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQpOworI2VuZGlmCisJCWllZWUtPkhUSGlnaGVzdE9wZXJhUmF0ZSA9IEhUR2V0SGlnaGVzdE1DU1JhdGUoaWVlZSwgaWVlZS0+ZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCwgTUNTX0ZJTFRFUl9BTEwpOworCQlpZWVlLT5IVEN1cnJlbnRPcGVyYVJhdGUgPSBpZWVlLT5IVEhpZ2hlc3RPcGVyYVJhdGU7CisKKwl9CisJZWxzZQorCXsKKwkJcEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPSBmYWxzZTsKKwl9CisJcmV0dXJuOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgY2hlY2sgd2hldGhlciBIVCBjb250cm9sIGZpZWxkIGV4aXN0cworICogICBpbnB1dDogIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlIAkqaWVlZQorICogICAJICAgICB1OCoJCQlwRnJhbWUgLy9jb21pbmcgc2tiLT5kYXRhCisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIHJldHVybiB0cnVlIGlmIEhUIGNvbnRyb2wgZmllbGQgZXhpc3RzKGZhbHNlIG90aGVyd2lzZSkKKyAqICBub3RpY2U6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IEhUQ0NoZWNrKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCoJcEZyYW1lKQoreworCWlmKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0KQorCXsKKwkJaWYoIChJc1FvU0RhdGFGcmFtZShwRnJhbWUpICYmIEZyYW1lX09yZGVyKHBGcmFtZSkpID09IDEpCisJCXsKKwkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICJIVCBDT05UUk9MIEZJTEVEIEVYSVNUISFcbiIpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOworfQorCisvLworLy8gVGhpcyBmdW5jdGlvbiBzZXQgYmFuZHdpZHRoIG1vZGUgaW4gcHJvdG9jb2wgbGF5ZXIuCisvLwordm9pZCBIVFNldENvbm5lY3RCd01vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIEhUX0NIQU5ORUxfV0lEVEgJQmFuZHdpZHRoLCBIVF9FWFRDSE5MX09GRlNFVAlPZmZzZXQpCit7CisJUFJUX0hJR0hfVEhST1VHSFBVVCBwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKy8vCXUzMiBmbGFncyA9IDA7CisKKwlpZihwSFRJbmZvLT5iUmVnQlc0ME1IeiA9PSBmYWxzZSkKKwkJcmV0dXJuOworCisKKworCS8vIFRvIHJlZHVjZSBkdW1teSBvcGVyYXRpb24KKy8vCWlmKChwSFRJbmZvLT5iQ3VyQlc0ME1Iej09ZmFsc2UgJiYgQmFuZHdpZHRoPT1IVF9DSEFOTkVMX1dJRFRIXzIwKSB8fAorLy8JICAgKHBIVEluZm8tPmJDdXJCVzQwTUh6PT10cnVlICYmIEJhbmR3aWR0aD09SFRfQ0hBTk5FTF9XSURUSF8yMF80MCAmJiBPZmZzZXQ9PXBIVEluZm8tPkN1clNUQUV4dENobmxPZmZzZXQpKQorLy8JCXJldHVybjsKKworLy8Jc3Bpbl9sb2NrX2lycXNhdmUoJihpZWVlLT5id19zcGlubG9jayksIGZsYWdzKTsKKwlpZihwSFRJbmZvLT5iU3dCd0luUHJvZ3Jlc3MpIHsKKy8vCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaWVlZS0+Yndfc3BpbmxvY2spLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJLy9pZiBpbiBoYWxmIE4gbW9kZSwgc2V0IHRvIDIwTSBiYW5kd2lkdGggcGxlYXNlIDA5LjA4LjIwMDggV0IuCisJaWYoQmFuZHdpZHRoPT1IVF9DSEFOTkVMX1dJRFRIXzIwXzQwICYmICghaWVlZS0+R2V0SGFsZk5tb2RlU3VwcG9ydEJ5QVBzSGFuZGxlcihpZWVlLT5kZXYpKSkKKwkgeworCQkJLy8gSGFuZGxlIElsbGVnYWwgZXh0ZW50aW9uIGNoYW5uZWwgb2Zmc2V0ISEKKwkJaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWw8MiAmJiBPZmZzZXQ9PUhUX0VYVENITkxfT0ZGU0VUX0xPV0VSKQorCQkJT2Zmc2V0ID0gSFRfRVhUQ0hOTF9PRkZTRVRfTk9fRVhUOworCQlpZihPZmZzZXQ9PUhUX0VYVENITkxfT0ZGU0VUX1VQUEVSIHx8IE9mZnNldD09SFRfRVhUQ0hOTF9PRkZTRVRfTE9XRVIpIHsKKwkJCXBIVEluZm8tPmJDdXJCVzQwTUh6ID0gdHJ1ZTsKKwkJCXBIVEluZm8tPkN1clNUQUV4dENobmxPZmZzZXQgPSBPZmZzZXQ7CisJCX0gZWxzZSB7CisJCQlwSFRJbmZvLT5iQ3VyQlc0ME1IeiA9IGZhbHNlOworCQkJcEhUSW5mby0+Q3VyU1RBRXh0Q2hubE9mZnNldCA9IEhUX0VYVENITkxfT0ZGU0VUX05PX0VYVDsKKwkJfQorCX0gZWxzZSB7CisJCXBIVEluZm8tPmJDdXJCVzQwTUh6ID0gZmFsc2U7CisJCXBIVEluZm8tPkN1clNUQUV4dENobmxPZmZzZXQgPSBIVF9FWFRDSE5MX09GRlNFVF9OT19FWFQ7CisJfQorCisJcEhUSW5mby0+YlN3QndJblByb2dyZXNzID0gdHJ1ZTsKKworCS8vIFRPRE86IDIwMDcuNy4xMyBieSBFbWlseSBXYWl0IDIwMDBtcyAgaW4gb3JkZXIgdG8gZ2FyYW50ZWUgdGhhdCBzd2l0Y2hpbmcKKwkvLyAgIGJhbmR3aWR0aCBpcyBleGVjdXRlZCBhZnRlciBzY2FuIGlzIGZpbmlzaGVkLiBJdCBpcyBhIHRlbXBvcmFsIHNvbHV0aW9uCisJLy8gICBiZWNhdXNlIHNvZnR3YXJlIHNob3VsZCBnYW5yYW50ZWUgdGhlIGxhc3Qgb3BlcmF0aW9uIG9mIHN3aXRjaGluZyBiYW5kd2lkdGgKKwkvLyAgIGlzIGV4ZWN1dGVkIHByb3BlcmxseS4KKwlIVFNldENvbm5lY3RCd01vZGVDYWxsYmFjayhpZWVlKTsKKworLy8Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKGllZWUtPmJ3X3NwaW5sb2NrKSwgZmxhZ3MpOworfQorCit2b2lkIEhUU2V0Q29ubmVjdEJ3TW9kZUNhbGxiYWNrKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlKQoreworCVBSVF9ISUdIX1RIUk9VR0hQVVQgcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CisKKwlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiPT09PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZihwSFRJbmZvLT5iQ3VyQlc0ME1IeikKKwl7CisJCWlmKHBIVEluZm8tPkN1clNUQUV4dENobmxPZmZzZXQ9PUhUX0VYVENITkxfT0ZGU0VUX1VQUEVSKQorCQkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCsyKTsKKwkJZWxzZSBpZihwSFRJbmZvLT5DdXJTVEFFeHRDaG5sT2Zmc2V0PT1IVF9FWFRDSE5MX09GRlNFVF9MT1dFUikKKwkJCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwtMik7CisJCWVsc2UKKwkJCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCisJCWllZWUtPlNldEJXTW9kZUhhbmRsZXIoaWVlZS0+ZGV2LCBIVF9DSEFOTkVMX1dJRFRIXzIwXzQwLCBwSFRJbmZvLT5DdXJTVEFFeHRDaG5sT2Zmc2V0KTsKKwl9IGVsc2UgeworCQlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKwkJaWVlZS0+U2V0QldNb2RlSGFuZGxlcihpZWVlLT5kZXYsIEhUX0NIQU5ORUxfV0lEVEhfMjAsIEhUX0VYVENITkxfT0ZGU0VUX05PX0VYVCk7CisJfQorCisJcEhUSW5mby0+YlN3QndJblByb2dyZXNzID0gZmFsc2U7Cit9CisKK0VYUE9SVF9TWU1CT0woSFRVcGRhdGVTZWxmQW5kUGVlclNldHRpbmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X1Fvcy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X1Fvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYjFlNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfUW9zLmgKQEAgLTAsMCArMSw1ODMgQEAKKyNpZm5kZWYgX19JTkNfUU9TX1RZUEVfSAorI2RlZmluZSBfX0lOQ19RT1NfVFlQRV9ICisKKy8vI2luY2x1ZGUgIkVuZGlhbkZyZWUuaCIKKyNkZWZpbmUgQklUMCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBCSVQxICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEJJVDIgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQklUMyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBCSVQ0ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEJJVDUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgQklUNiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBCSVQ3ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEJJVDggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgQklUOSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBCSVQxMCAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEJJVDExICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgQklUMTIgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBCSVQxMyAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEJJVDE0ICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgQklUMTUgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBCSVQxNiAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEJJVDE3ICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgQklUMTggICAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBCSVQxOSAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIEJJVDIwICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgQklUMjEgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBCSVQyMiAgICAgICAgICAgICAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIEJJVDIzICAgICAgICAgICAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgQklUMjQgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBCSVQyNSAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIEJJVDI2ICAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgQklUMjcgICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBCSVQyOCAgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIEJJVDI5ICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgQklUMzAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBCSVQzMSAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisKKyNkZWZpbmUJTUFYX1dNTUVMRV9MRU5HVEgJNjQKKworLy8KKy8vIFFvUyBtb2RlLgorLy8gZW51bSAwLCAxLCAyLCA0OiBzaW5jZSB3ZSBjYW4gdXNlIHRoZSBPUih8KSBvcGVyYXRpb24uCisvLworLy8gUU9TX01PREUgaXMgcmVkZWZpbmVkIGZvciBlbnVtIGNhbid0IGJlICsrLCB8IHVuZGVyIEMrKyBjb21waWxlciwgMjAwNi4wNS4xNywgYnkgcmNuamtvLgorLy90eXBlZGVmCWVudW0gX1FPU19NT0RFeworLy8JUU9TX0RJU0FCTEUJCT0gMCwKKy8vCVFPU19XTU0JCQk9IDEsCisvLwlRT1NfRURDQQkJCT0gMiwKKy8vCVFPU19IQ0NBCQkJPSA0LAorLy99UU9TX01PREUsKlBRT1NfTU9ERTsKKy8vCit0eXBlZGVmIHUzMiBRT1NfTU9ERSwgKlBRT1NfTU9ERTsKKyNkZWZpbmUgUU9TX0RJU0FCTEUJCTAKKyNkZWZpbmUgUU9TX1dNTQkJCTEKKyNkZWZpbmUgUU9TX1dNTVNBCQkyCisjZGVmaW5lIFFPU19FRENBCQk0CisjZGVmaW5lIFFPU19IQ0NBCQk4CisjZGVmaW5lIFFPU19XTU1fVUFQU0QJCTE2ICAgLy9XTU0gUG93ZXIgU2F2ZSwgMjAwNi0wNi0xNCBJc2FpYWgKKworI2RlZmluZSBBQ19QQVJBTV9TSVpFCTQKKyNkZWZpbmUgV01NX1BBUkFNX0VMRV9CT0RZX0xFTgkxOAorCisvLworLy8gUW9TIEFDSyBQb2xpY3kgRmllbGQgVmFsdWVzCisvLyBSZWY6IFdNTSBzcGVjIDIuMS42OiBRb1MgQ29udHJvbCBGaWVsZCwgcC4xMC4KKy8vCit0eXBlZGVmCWVudW0gX0FDS19QT0xJQ1l7CisJZUFja1BsYzBfQUNLCQk9IDB4MDAsCisJZUFja1BsYzFfTm9BQ0sJCT0gMHgwMSwKK31BQ0tfUE9MSUNZLCpQQUNLX1BPTElDWTsKKworI2RlZmluZSBXTU1fUEFSQU1fRUxFTUVOVF9TSVpFCSg4Kyg0KkFDX1BBUkFNX1NJWkUpKQorCisvLworLy8gUW9TIENvbnRyb2wgRmllbGQKKy8vIFJlZjoKKy8vCTEuIFdNTSBzcGVjIDIuMS42OiBRb1MgQ29udHJvbCBGaWVsZCwgcC45LgorLy8JMi4gODAyLjExZS9EMTMuMCA3LjEuMy41LCBwLjI2LgorLy8KK3R5cGVkZWYJdW5pb24gX1FPU19DVFJMX0ZJRUxEeworCXU4CWNoYXJEYXRhWzJdOworCXUxNglzaG9ydERhdGE7CisKKwkvLyBXTU0gc3BlYworCXN0cnVjdAorCXsKKwkJdTgJCVVQOjM7CisJCXU4CQl1c1JzdmQxOjE7CisJCXU4CQlFT1NQOjE7CisJCXU4CQlBY2tQb2xpY3k6MjsKKwkJdTgJCXVzUnN2ZDI6MTsKKwkJdTgJCXVjUnN2ZEJ5dGU7CisJfVdNTTsKKworCS8vIDgwMi4xMWU6IFFvUyBkYXRhIHR5cGUgZnJhbWUgc2VudCBieSBub24tQVAgUVNUQXMuCisJc3RydWN0CisJeworCQl1OAkJVElEOjQ7CisJCXU4CQliSXNRc2l6ZToxOy8vIDA6IEJJVFs4OjE1XSBpcyBUWE9QIER1cmF0aW9uIFJlcXVlc3RlZCwgMTogQklUWzg6MTVdIGlzIFF1ZXVlIFNpemUuCisJCXU4CQlBY2tQb2xpY3k6MjsKKwkJdTgJCXVzUnN2ZDoxOworCQl1OAkJVHhvcE9yUXNpemU7CS8vIChCSVQ0PTApVFhPUCBEdXJhdGlvbiBSZXF1ZXN0ZWQgb3IgKEJJVDQ9MSlRdWV1ZSBTaXplLgorCX1CeVN0YTsKKworCS8vIDgwMi4xMWU6IFFvUyBkYXRhLCBRb1MgTnVsbCwgYW5kIFFvUyBEYXRhK0NGLUFjayBmcmFtZXMgc2VudCBieSBIQy4KKwlzdHJ1Y3QKKwl7CisJCXU4CQlUSUQ6NDsKKwkJdTgJCUVPU1A6MTsKKwkJdTgJCUFja1BvbGljeToyOworCQl1OAkJdXNSc3ZkOjE7CisJCXU4CQlQU0J1ZlN0YXRlOwkJLy8gUUFQIFBTIEJ1ZmZlciBTdGF0ZS4KKwl9QnlIY19EYXRhOworCisJLy8gODAyLjExZTogUW9TICgrKSBDRi1Qb2xsIGZyYW1lcyBzZW50IGJ5IEhDLgorCXN0cnVjdAorCXsKKwkJdTgJCVRJRDo0OworCQl1OAkJRU9TUDoxOworCQl1OAkJQWNrUG9saWN5OjI7CisJCXU4CQl1c1JzdmQ6MTsKKwkJdTgJCVR4b3BMaW1pdDsJCS8vIFRYT1AgTGltaXQuCisJfUJ5SGNfQ0ZQOworCit9UU9TX0NUUkxfRklFTEQsICpQUU9TX0NUUkxfRklFTEQ7CisKKworLy8KKy8vIFFvUyBJbmZvIEZpZWxkCisvLyBSZWY6CisvLwkxLiBXTU0gc3BlYyAyLjIuMTogV01FIEluZm9ybWF0aW9uIEVsZW1lbnQsIHAuMTEuCisvLwkyLiA4MTg1IFFvUyBjb2RlOiBRT1NfSU5GTyBbZGVmLiBpbiBRb1NfbXAuaF0KKy8vCit0eXBlZGVmCXVuaW9uIF9RT1NfSU5GT19GSUVMRHsKKwl1OAljaGFyRGF0YTsKKworCXN0cnVjdAorCXsKKwkJdTgJCXVjUGFyYW1ldGVyU2V0Q291bnQ6NDsKKwkJdTgJCXVjUmVzZXJ2ZWQ6NDsKKwl9V01NOworCisJc3RydWN0CisJeworCQkvL1JlZiBXTU1fU3BlY2lmaWNhdGlvbl8xLTEucGRmLCAyMDA2LTA2LTEzIElzYWlhaAorCQl1OAkJdWNBQ19WT19VQVBTRDoxOworCQl1OAkJdWNBQ19WSV9VQVBTRDoxOworCQl1OAkJdWNBQ19CRV9VQVBTRDoxOworCQl1OAkJdWNBQ19CS19VQVBTRDoxOworCQl1OAkJdWNSZXNlcnZlZDE6MTsKKwkJdTgJCXVjTWF4U1BMZW46MjsKKwkJdTgJCXVjUmVzZXJ2ZWQyOjE7CisKKwl9QnlXbW1Qc1N0YTsKKworCXN0cnVjdAorCXsKKwkJLy9SZWYgV01NX1NwZWNpZmljYXRpb25fMS0xLnBkZiwgMjAwNi0wNi0xMyBJc2FpYWgKKwkJdTgJCXVjUGFyYW1ldGVyU2V0Q291bnQ6NDsKKwkJdTgJCXVjUmVzZXJ2ZWQ6MzsKKwkJdTgJCXVjQXBVYXBzZDoxOworCX1CeVdtbVBzQXA7CisKKwlzdHJ1Y3QKKwl7CisJCXU4CQl1Y0FDM19VQVBTRDoxOworCQl1OAkJdWNBQzJfVUFQU0Q6MTsKKwkJdTgJCXVjQUMxX1VBUFNEOjE7CisJCXU4CQl1Y0FDMF9VQVBTRDoxOworCQl1OAkJdWNRQWNrOjE7CisJCXU4CQl1Y01heFNQTGVuOjI7CisJCXU4CQl1Y01vcmVEYXRhQWNrOjE7CisJfSBCeTExZVN0YTsKKworCXN0cnVjdAorCXsKKwkJdTgJCXVjUGFyYW1ldGVyU2V0Q291bnQ6NDsKKwkJdTgJCXVjUUFjazoxOworCQl1OAkJdWNRdWV1ZVJlcToxOworCQl1OAkJdWNUWE9QUmVxOjE7CisJCXU4CQl1Y1Jlc2VydmVkOjE7CisJfSBCeTExZUFwOworCisJc3RydWN0CisJeworCQl1OAkJdWNSZXNlcnZlZDE6NDsKKwkJdTgJCXVjUUFjazoxOworCQl1OAkJdWNSZXNlcnZlZDI6MjsKKwkJdTgJCXVjTW9yZURhdGFBY2s6MTsKKwl9IEJ5V21tc2FTdGE7CisKKwlzdHJ1Y3QKKwl7CisJCXU4CQl1Y1Jlc2VydmVkMTo0OworCQl1OAkJdWNRQWNrOjE7CisJCXU4CQl1Y1F1ZXVlUmVxOjE7CisJCXU4CQl1Y1RYT1BSZXE6MTsKKwkJdTgJCXVjUmVzZXJ2ZWQyOjE7CisJfSBCeVdtbXNhQXA7CisKKwlzdHJ1Y3QKKwl7CisJCXU4CQl1Y0FDM19VQVBTRDoxOworCQl1OAkJdWNBQzJfVUFQU0Q6MTsKKwkJdTgJCXVjQUMxX1VBUFNEOjE7CisJCXU4CQl1Y0FDMF9VQVBTRDoxOworCQl1OAkJdWNRQWNrOjE7CisJCXU4CQl1Y01heFNQTGVuOjI7CisJCXU4CQl1Y01vcmVEYXRhQWNrOjE7CisJfSBCeUFsbFN0YTsKKworCXN0cnVjdAorCXsKKwkJdTgJCXVjUGFyYW1ldGVyU2V0Q291bnQ6NDsKKwkJdTgJCXVjUUFjazoxOworCQl1OAkJdWNRdWV1ZVJlcToxOworCQl1OAkJdWNUWE9QUmVxOjE7CisJCXU4CQl1Y0FwVWFwc2Q6MTsKKwl9IEJ5QWxsQXA7CisKK31RT1NfSU5GT19GSUVMRCwgKlBRT1NfSU5GT19GSUVMRDsKKworCisvLworLy8gQUNJIHRvIEFDIGNvZGluZy4KKy8vIFJlZjogV01NIHNwZWMgMi4yLjI6IFdNRSBQYXJhbWV0ZXIgRWxlbWVudCwgcC4xMy4KKy8vCisvLyBBQ19DT0RJTkcgaXMgcmVkZWZpbmVkIGZvciBlbnVtIGNhbid0IGJlICsrLCB8IHVuZGVyIEMrKyBjb21waWxlciwgMjAwNi4wNS4xNywgYnkgcmNuamtvLgorLy90eXBlZGVmCWVudW0gX0FDX0NPRElOR3sKKy8vCUFDMF9CRQk9IDAsCQkvLyBBQ0k6IDB4MDAJLy8gQmVzdCBFZmZvcnQKKy8vCUFDMV9CSwk9IDEsCQkvLyBBQ0k6IDB4MDEJLy8gQmFja2dyb3VuZAorLy8JQUMyX1ZJCT0gMiwJCS8vIEFDSTogMHgxMAkvLyBWaWRlbworLy8JQUMzX1ZPCT0gMywJCS8vIEFDSTogMHgxMQkvLyBWb2ljZQorLy8JQUNfTUFYID0gNCwJCS8vIE1heDogZGVmaW5lIHRvdGFsIG51bWJlcjsgU2hvdWxkIG5vdCB0byBiZSB1c2VkIGFzIGEgcmVhbCBlbnVtLgorLy99QUNfQ09ESU5HLCpQQUNfQ09ESU5HOworLy8KK3R5cGVkZWYgdTMyIEFDX0NPRElORzsKKyNkZWZpbmUgQUMwX0JFCTAJCS8vIEFDSTogMHgwMAkvLyBCZXN0IEVmZm9ydAorI2RlZmluZSBBQzFfQksJMQkJLy8gQUNJOiAweDAxCS8vIEJhY2tncm91bmQKKyNkZWZpbmUgQUMyX1ZJCTIJCS8vIEFDSTogMHgxMAkvLyBWaWRlbworI2RlZmluZSBBQzNfVk8JMwkJLy8gQUNJOiAweDExCS8vIFZvaWNlCisjZGVmaW5lIEFDX01BWAk0CQkvLyBNYXg6IGRlZmluZSB0b3RhbCBudW1iZXI7IFNob3VsZCBub3QgdG8gYmUgdXNlZCBhcyBhIHJlYWwgZW51bS4KKworLy8KKy8vIEFDSS9BSUZTTiBGaWVsZC4KKy8vIFJlZjogV01NIHNwZWMgMi4yLjI6IFdNRSBQYXJhbWV0ZXIgRWxlbWVudCwgcC4xMi4KKy8vCit0eXBlZGVmCXVuaW9uIF9BQ0lfQUlGU057CisJdTgJY2hhckRhdGE7CisKKwlzdHJ1Y3QKKwl7CisJCXU4CUFJRlNOOjQ7CisJCXU4CUFDTToxOworCQl1OAlBQ0k6MjsKKwkJdTgJUmVzZXJ2ZWQ6MTsKKwl9ZjsJLy8gRmllbGQKK31BQ0lfQUlGU04sICpQQUNJX0FJRlNOOworCisvLworLy8gRUNXbWluL0VDV21heCBmaWVsZC4KKy8vIFJlZjogV01NIHNwZWMgMi4yLjI6IFdNRSBQYXJhbWV0ZXIgRWxlbWVudCwgcC4xMy4KKy8vCit0eXBlZGVmCXVuaW9uIF9FQ1d7CisJdTgJY2hhckRhdGE7CisJc3RydWN0CisJeworCQl1OAlFQ1dtaW46NDsKKwkJdTgJRUNXbWF4OjQ7CisJfWY7CS8vIEZpZWxkCit9RUNXLCAqUEVDVzsKKworLy8KKy8vIEFDIFBhcmFtZXRlcnMgUmVjb3JkIEZvcm1hdC4KKy8vIFJlZjogV01NIHNwZWMgMi4yLjI6IFdNRSBQYXJhbWV0ZXIgRWxlbWVudCwgcC4xMi4KKy8vCit0eXBlZGVmCXVuaW9uIF9BQ19QQVJBTXsKKwl1MzIJbG9uZ0RhdGE7CisJdTgJY2hhckRhdGFbNF07CisKKwlzdHJ1Y3QKKwl7CisJCUFDSV9BSUZTTglBY2lBaWZzbjsKKwkJRUNXCQlFY3c7CisJCXUxNgkJVFhPUExpbWl0OworCX1mOwkvLyBGaWVsZAorfUFDX1BBUkFNLCAqUEFDX1BBUkFNOworCisKKworLy8KKy8vIFFvUyBlbGVtZW50IHN1YnR5cGUKKy8vCit0eXBlZGVmCWVudW0gX1FPU19FTEVfU1VCVFlQRXsKKwlRT1NFTEVfVFlQRV9JTkZPCT0gMHgwMCwJCS8vIDB4MDA6IEluZm9ybWF0aW9uIGVsZW1lbnQKKwlRT1NFTEVfVFlQRV9QQVJBTQk9IDB4MDEsCQkvLyAweDAxOiBwYXJhbWV0ZXIgZWxlbWVudAorfVFPU19FTEVfU1VCVFlQRSwqUFFPU19FTEVfU1VCVFlQRTsKKworCisvLworLy8gRGlyZWN0aW9uIEZpZWxkIFZhbHVlcy4KKy8vIFJlZjogV01NIHNwZWMgMi4yLjExOiBXTUUgVFNQRUMgRWxlbWVudCwgcC4xOC4KKy8vCit0eXBlZGVmCWVudW0gX0RJUkVDVElPTl9WQUxVRXsKKwlESVJfVVAJCQk9IDAsCQkvLyAweDAwCS8vIFVwTGluaworCURJUl9ET1dOCQk9IDEsCQkvLyAweDAxCS8vIERvd25MaW5rCisJRElSX0RJUkVDVAkJPSAyLAkJLy8gMHgxMAkvLyBEaXJlY3RMaW5rCisJRElSX0JJX0RJUgkJPSAzLAkJLy8gMHgxMQkvLyBCaS1EaXJlY3Rpb24KK31ESVJFQ1RJT05fVkFMVUUsKlBESVJFQ1RJT05fVkFMVUU7CisKKworLy8KKy8vIFRTIEluZm8gZmllbGQgaW4gV01NIFRTUEVDIEVsZW1lbnQuCisvLyBSZWY6CisvLwkxLiBXTU0gc3BlYyAyLjIuMTE6IFdNRSBUU1BFQyBFbGVtZW50LCBwLjE4LgorLy8JMi4gODE4NSBRb1MgY29kZTogUU9TX1RTSU5GTyBbZGVmLiBpbiBRb1NfbXAuaF0KKy8vCit0eXBlZGVmIHVuaW9uIF9RT1NfVFNJTkZPeworCXU4CQljaGFyRGF0YVszXTsKKwlzdHJ1Y3QgeworCQl1OAkJdWNUcmFmZmljVHlwZToxOwkJCS8vV01NIGlzIHJlc2VydmVkCisJCXU4CQl1Y1RTSUQ6NDsKKwkJdTgJCXVjRGlyZWN0aW9uOjI7CisJCXU4CQl1Y0FjY2Vzc1BvbGljeToyOwkvL1dNTTogYml0OD0wLCBiaXQ3PTEKKwkJdTgJCXVjQWdncmVnYXRpb246MTsJCS8vV01NIGlzIHJlc2VydmVkCisJCXU4CQl1Y1BTQjoxOwkJCQkvL1dNTVNBIGlzIEFQU0QKKwkJdTgJCXVjVVA6MzsKKwkJdTgJCXVjVFNJbmZvQWNrUG9saWN5OjI7CQkvL1dNTSBpcyByZXNlcnZlZAorCQl1OAkJdWNTY2hlZHVsZToxOwkJCS8vV01NIGlzIHJlc2VydmVkCisJCXU4CQl1Y1Jlc2VydmVkOjc7CisJfWZpZWxkOworfVFPU19UU0lORk8sICpQUU9TX1RTSU5GTzsKKworLy8KKy8vIFdNTSBUU1BFQyBCb2R5LgorLy8gUmVmOiBXTU0gc3BlYyAyLjIuMTE6IFdNRSBUU1BFQyBFbGVtZW50LCBwLjE2LgorLy8KK3R5cGVkZWYgdW5pb24gX1RTUEVDX0JPRFl7CisJdTgJCWNoYXJEYXRhWzU1XTsKKworCXN0cnVjdAorCXsKKwkJUU9TX1RTSU5GTwlUU0luZm87CS8vdTgJVFNJbmZvWzNdOworCQl1MTYJTm9taW5hbE1TRFVzaXplOworCQl1MTYJTWF4TVNEVXNpemU7CisJCXUzMglNaW5TZXJ2aWNlSXR2OworCQl1MzIJTWF4U2VydmljZUl0djsKKwkJdTMyCUluYWN0aXZpdHlJdHY7CisJCXUzMglTdXNwZW5JdHY7CisJCXUzMglTZXJ2aWNlU3RhcnRUaW1lOworCQl1MzIJTWluRGF0YVJhdGU7CisJCXUzMglNZWFuRGF0YVJhdGU7CisJCXUzMglQZWFrRGF0YVJhdGU7CisJCXUzMglNYXhCdXJzdFNpemU7CisJCXUzMglEZWxheUJvdW5kOworCQl1MzIJTWluUGh5UmF0ZTsKKwkJdTE2CVN1cnBsdXNCYW5kd2lkdGhBbGxvd2FuY2U7CisJCXUxNglNZWRpdW1UaW1lOworCX0gZjsJLy8gRmllbGQKK31UU1BFQ19CT0RZLCAqUFRTUEVDX0JPRFk7CisKKworLy8KKy8vIFdNTSBUU1BFQyBFbGVtZW50LgorLy8gUmVmOiBXTU0gc3BlYyAyLjIuMTE6IFdNRSBUU1BFQyBFbGVtZW50LCBwLjE2LgorLy8KK3R5cGVkZWYgc3RydWN0IF9XTU1fVFNQRUN7CisJdTgJCUlEOworCXU4CQlMZW5ndGg7CisJdTgJCU9VSVszXTsKKwl1OAkJT1VJX1R5cGU7CisJdTgJCU9VSV9TdWJUeXBlOworCXU4CQlWZXJzaW9uOworCVRTUEVDX0JPRFkJQm9keTsKK30gV01NX1RTUEVDLCAqUFdNTV9UU1BFQzsKKworLy8KKy8vIEFDTSBpbXBsZW1lbnRhdGlvbiBtZXRob2QuCisvLyBBbm5pZSwgMjAwNS0xMi0xMy4KKy8vCit0eXBlZGVmCWVudW0gX0FDTV9NRVRIT0R7CisJZUFjbVdheTBfU3dBbmRIdwkJPSAwLAkJLy8gQnkgU1cgYW5kIEhXLgorCWVBY21XYXkxX0hXCQkJPSAxLAkJLy8gQnkgSFcuCisJZUFjbVdheTJfU1cJCQk9IDIsCQkvLyBCeSBTVy4KK31BQ01fTUVUSE9ELCpQQUNNX01FVEhPRDsKKworCit0eXBlZGVmIHN0cnVjdCBfQUNNeworLy8JdTgJCVJlZ0VuYWJsZUFDTTsKKwl1NjQJCVVzZWRUaW1lOworCXU2NAkJTWVkaXVtVGltZTsKKwl1OAkJSHdBY21DdGw7CS8vIFRSVUU6IFVzZWRUaW1lIGV4Y2VlZCA9PiBEbyBOT1QgVVNFIHRoaXMgQUMuIEl0IHdsbCBiZSB3cml0dGVuIHRvIEFDTV9DT05UUk9MKDB4QkYgQklUIDAvMS8yIGluIDgxODVCKS4KK31BQ00sICpQQUNNOworCit0eXBlZGVmCXU4CQlBQ19VQVBTRCwgKlBBQ19VQVBTRDsKKworI2RlZmluZQlHRVRfVk9fVUFQU0QoX2Fwc2QpICgoX2Fwc2QpICYgQklUMCkKKyNkZWZpbmUJU0VUX1ZPX1VBUFNEKF9hcHNkKSAoKF9hcHNkKSB8PSBCSVQwKQorCisjZGVmaW5lCUdFVF9WSV9VQVBTRChfYXBzZCkgKChfYXBzZCkgJiBCSVQxKQorI2RlZmluZQlTRVRfVklfVUFQU0QoX2Fwc2QpICgoX2Fwc2QpIHw9IEJJVDEpCisKKyNkZWZpbmUJR0VUX0JLX1VBUFNEKF9hcHNkKSAoKF9hcHNkKSAmIEJJVDIpCisjZGVmaW5lCVNFVF9CS19VQVBTRChfYXBzZCkgKChfYXBzZCkgfD0gQklUMikKKworI2RlZmluZQlHRVRfQkVfVUFQU0QoX2Fwc2QpICgoX2Fwc2QpICYgQklUMykKKyNkZWZpbmUJU0VUX0JFX1VBUFNEKF9hcHNkKSAoKF9hcHNkKSB8PSBCSVQzKQorCisKKy8vdHlwZWRlZiBzdHJ1Y3QgX1RDTEFTU3sKKy8vIFRPRE8KKy8vfSBUQ0xBU1MsICpQVENMQVNTOwordHlwZWRlZiB1bmlvbiBfUU9TX1RDTEFTeworCisJc3RydWN0IF9UWVBFX0dFTkVSQUx7CisJCXU4CQlQcmlvcml0eTsKKwkJdTggCQlDbGFzc2lmaWVyVHlwZTsKKwkJdTggCQlNYXNrOworCX0gVFlQRV9HRU5FUkFMOworCisJc3RydWN0IF9UWVBFMF9FVEh7CisJCXU4CQlQcmlvcml0eTsKKwkJdTggCQlDbGFzc2lmaWVyVHlwZTsKKwkJdTggCQlNYXNrOworCQl1OAkJU3JjQWRkcls2XTsKKwkJdTgJCURzdEFkZHJbNl07CisJCXUxNgkJVHlwZTsKKwl9IFRZUEUwX0VUSDsKKworCXN0cnVjdCBfVFlQRTFfSVBWNHsKKwkJdTgJCVByaW9yaXR5OworCQl1OCAJCUNsYXNzaWZpZXJUeXBlOworCQl1OCAJCU1hc2s7CisJCXU4IAkJVmVyc2lvbjsKKwkJdTgJCVNyY0lQWzRdOworCQl1OAkJRHN0SVBbNF07CisJCXUxNgkJU3JjUG9ydDsKKwkJdTE2CQlEc3RQb3J0OworCQl1OAkJRFNDUDsKKwkJdTgJCVByb3RvY29sOworCQl1OAkJUmVzZXJ2ZWQ7CisJfSBUWVBFMV9JUFY0OworCisJc3RydWN0IF9UWVBFMV9JUFY2eworCQl1OAkJUHJpb3JpdHk7CisJCXU4IAkJQ2xhc3NpZmllclR5cGU7CisJCXU4IAkJTWFzazsKKwkJdTggCQlWZXJzaW9uOworCQl1OAkJU3JjSVBbMTZdOworCQl1OAkJRHN0SVBbMTZdOworCQl1MTYJCVNyY1BvcnQ7CisJCXUxNgkJRHN0UG9ydDsKKwkJdTgJCUZsb3dMYWJlbFszXTsKKwl9IFRZUEUxX0lQVjY7CisKKwlzdHJ1Y3QgX1RZUEUyXzgwMjFReworCQl1OAkJUHJpb3JpdHk7CisJCXU4IAkJQ2xhc3NpZmllclR5cGU7CisJCXU4IAkJTWFzazsKKwkJdTE2CQlUYWdUeXBlOworCX0gVFlQRTJfODAyMVE7Cit9IFFPU19UQ0xBUywgKlBRT1NfVENMQVM7CisKKy8vdHlwZWRlZiBzdHJ1Y3QgX1dNTV9UU1RSRUFNeworLy8KKy8vLSBUU1BFQworLy8tIEFDICh3aGljaCB0byBtYXBwaW5nKQorLy99IFdNTV9UU1RSRUFNLCAqUFdNTV9UU1RSRUFNOwordHlwZWRlZiBzdHJ1Y3QgX1FPU19UU1RSRUFNeworCXU4CQkJQUM7CisJV01NX1RTUEVDCQlUU3BlYzsKKwlRT1NfVENMQVMJCVRDbGFzczsKK30gUU9TX1RTVFJFQU0sICpQUU9TX1RTVFJFQU07CisKKy8vdHlwZWRlZiBzdHJ1Y3QgX1VfQVBTRHsKKy8vLSBUcmlnZ2VyRW5hYmxlIFs0XQorLy8tIE1heFNQTGVuZ3RoCisvLy0gSGlnaGVzdEFjQnVmZmVyZWQKKy8vfSBVX0FQU0QsICpQVV9BUFNEOworCisvL2pvc2VwaCBUT0RPOgorLy8JVUFQU0QgZnVuY3Rpb24gc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IDIgZGF0YSBzdHJ1Y3R1cmUKKy8vCSJRb3MgY29udHJvbCBmaWVsZCIgYW5kICJRb3MgaW5mbyBmaWVsZCIKKy8vdHlwZWRlZiBzdHJ1Y3QgX1FPU19VQVBTRHsKKy8vCXU4CQkJYlRyaWdnZXJFbmFibGVbNF07CisvLwl1OCAJCQlNYXhTUExlbmd0aDsKKy8vCXU4CQkJSGlnaGVzdEJ1ZkFDOworLy99IFFPU19VQVBTRCwgKlBRT1NfQVBTRDsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgIDgwMi4xMSBNYW5hZ2VtZW50IGZyYW1lIFN0YXR1cyBDb2RlIGZpZWxkCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3R5cGVkZWYgc3RydWN0IF9PQ1RFVF9TVFJJTkd7CisJdTggICAgICAgIAkqT2N0ZXQ7CisJdTE2ICAgICAgICAgICAgIExlbmd0aDsKK31PQ1RFVF9TVFJJTkcsICpQT0NURVRfU1RSSU5HOworLy8KKy8vIFNUQSBRb1MgZGF0YS4KKy8vIFJlZjogRE9UMTFfUU9TIGluIDgxODUgY29kZS4gW2RlZi4gaW4gUW9TX21wLmhdCisvLwordHlwZWRlZiBzdHJ1Y3QgX1NUQV9RT1N7CisJLy9ERUNMQVJFX1JUX09CSkVDVChTVEFfUU9TKTsKKwl1OAkJCQlXTU1JRUJ1ZltNQVhfV01NRUxFX0xFTkdUSF07CisJdTgqCQkJCVdNTUlFOworCisJLy8gUGFydCAxLiBTZWxmIFFvUyBNb2RlLgorCVFPU19NT0RFCQkJUW9zQ2FwYWJpbGl0eTsgLy9Rb1MgQ2FwYWJpbGl0eSwgMjAwNi0wNi0xNCBJc2FpYWgKKwlRT1NfTU9ERQkJCUN1cnJlbnRRb3NNb2RlOworCisJLy8gRm9yIFdNTSBQb3dlciBTYXZlIE1vZGUgOgorCS8vIEFDcyBhcmUgdHJpZ2dlci9kZWxpdmVyeSBlbmFibGVkIG9yIGxlZ2FjeSBwb3dlciBzYXZlIGVuYWJsZWQuIDIwMDYtMDYtMTMgSXNhaWFoCisJQUNfVUFQU0QJCQliNGFjX1VhcHNkOyAgLy9Wb1VhcHNkKGJpdDApLCBWaVVhcHNkKGJpdDEpLCAgQmtVYXBzZChiaXQyKSwgQmVVYXBzZChiaXQzKSwKKwlBQ19VQVBTRAkJCUN1cnI0YWNVYXBzZDsKKwl1OAkJCQliSW5TZXJ2aWNlUGVyaW9kOworCXU4CQkJCU1heFNQTGVuZ3RoOworCWludCAJCQkJTnVtQmNuQmVmb3JlVHJpZ2dlcjsKKworCS8vIFBhcnQgMi4gRURDQSBQYXJhbWV0ZXIgKHBlckFDKQorCXU4ICoJCQkJcFdNTUluZm9FbGU7CisJdTgJCQkJV01NUGFyYW1FbGVbV01NX1BBUkFNX0VMRU1FTlRfU0laRV07CisJdTgJCQkJV01NUEVMZW5ndGg7CisKKwkvLyA8QnJ1Y2VfTm90ZT4KKwkvLzIgVG9EbzogcmVtb3ZlIHRoZSBRb3MgSW5mbyBGaWVsZCBhbmQgcmVwbGFjZSBpdCBieSB0aGUgYWJvdmUgV01NIEluZm8gZWxlbWVudC4KKwkvLyBCeSBCcnVjZSwgMjAwOC0wMS0zMC4KKwkvLyBQYXJ0IDIuIEVEQ0EgUGFyYW1ldGVyIChwZXJBQykKKwlRT1NfSU5GT19GSUVMRAkJCVFvc0luZm9GaWVsZF9TVEE7IAkvLyBNYWludGFpbmVkIGJ5IFNUQQorCVFPU19JTkZPX0ZJRUxECQkJUW9zSW5mb0ZpZWxkX0FQOwkvLyBSZXRyaWV2ZWQgZnJvbSBBUAorCisJQUNfUEFSQU0JCQlDdXJBY1BhcmFtZXRlcnNbNF07CisKKwkvLyBQYXJ0IDMuIEFDTQorCUFDTQkJCQlhY21bNF07CisJQUNNX01FVEhPRAkJCUFjbU1ldGhvZDsKKworCS8vIFBhcnQgNC4gUGVyIFRJRCAoUGFydCA1OiBUQ0xBU1Mgd2lsbCBiZSBkZXNjcmliZWQgYnkgVFN0cmVhbSkKKwlRT1NfVFNUUkVBTQkJCVRTdHJlYW1bMTZdOworCVdNTV9UU1BFQwkJCVRTcGVjOworCisJdTMyCQkJCVFCc3NXaXJlbGVzc01vZGU7CisKKwkvLyBObyBBY2sgU2V0dGluZworCXU4CQkJCWJOb0FjazsKKworCS8vIEVuYWJsZS9EaXNhYmxlIFJ4IGltbWVkaWF0ZSBCQSBjYXBhYmlsaXR5LgorCXU4CQkJCWJFbmFibGVSeEltbUJBOworCit9U1RBX1FPUywgKlBTVEFfUU9TOworCisvLworLy8gQlNTIFFPUyBkYXRhLgorLy8gUmVmOiBCc3NEc2NyIGluIDgxODUgY29kZS4gW2RlZi4gaW4gQnNzRHNjci5oXQorLy8KK3R5cGVkZWYgc3RydWN0IF9CU1NfUU9TeworCVFPU19NT0RFCQliZFFvU01vZGU7CisKKwl1OAkJCWJkV01NSUVCdWZbTUFYX1dNTUVMRV9MRU5HVEhdOworCXU4KgkJYmRXTU1JRTsKKworCVFPU19FTEVfU1VCVFlQRQkJRWxlU3ViVHlwZTsKKworCXU4ICoJCQlwV01NSW5mb0VsZTsKKwl1OCAqCQkJcFdNTVBhcmFtRWxlOworCisJUU9TX0lORk9fRklFTEQJCVFvc0luZm9GaWVsZDsKKwlBQ19QQVJBTQkJQWNQYXJhbWV0ZXJbNF07Cit9QlNTX1FPUywgKlBCU1NfUU9TOworCisKKy8vCisvLyBSZWY6IHNRb1NDdGxMbmcgYW5kIFFvU0N0bCBkZWZpbml0aW9uIGluIDgxODUgUW9TIGNvZGUuCisvLyNkZWZpbmUgUW9TQ3RsICAgKCgJKEFkYXB0ZXItPmJSZWdRb1MpICYmIChBZGFwdGVyLT5kb3QxMVFvUy5Rb1NNb2RlICYoUU9TX0VEQ0F8UU9TX0hDQ0EpKQkgICkgID9zUW9TQ3RsTG5nOjApCisvLworI2RlZmluZSBzUW9TQ3RsTG5nCQkJMgorI2RlZmluZQlRT1NfQ1RSTF9MRU4oX1Fvc01vZGUpCQkoKF9Rb3NNb2RlID4gUU9TX0RJU0FCTEUpPyBzUW9TQ3RsTG5nIDogMCkKKworCisvL0FkZGVkIGJ5IGpvc2VwaAorLy9VUCBNYXBwaW5nIHRvIEFDLCB1c2luZyBpbiBNZ250UXVlcnlfU2VxdWVuY2VOdW1iZXIoKSBhbmQgbWF5YmUgZm9yIERTQ1AKKy8vI2RlZmluZSBVUDJBQyh1cCkJCQkoKHVwPDMpPygodXA9PTApPzE6MCk6KHVwPj4xKSkKKyNkZWZpbmUgSXNBQ1ZhbGlkKGFjKQkJCSgoYWM8PTcgKT90cnVlOmZhbHNlICkKKworI2VuZGlmIC8vICNpZm5kZWYgX19JTkNfUU9TX1RZUEVfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X1RTLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfVFMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWFhYzIxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X1RTLmgKQEAgLTAsMCArMSw1NiBAQAorI2lmbmRlZiBfVFNUWVBFX0hfCisjZGVmaW5lIF9UU1RZUEVfSF8KKyNpbmNsdWRlICJydGw4MTl4X1Fvcy5oIgorI2RlZmluZSBUU19TRVRVUF9USU1FT1VUCTYwICAvLyBJbiBtaWxsaXNlY29uZAorI2RlZmluZSBUU19JTkFDVF9USU1FT1VUCTYwCisjZGVmaW5lIFRTX0FEREJBX0RFTEFZCQk2MAorCisjZGVmaW5lIFRPVEFMX1RTX05VTQkJMTYKKyNkZWZpbmUgVENMQVNfTlVNCQk0CisKKy8vIFRoaXMgZGVmaW5lIHRoZSBUeC9SeCBkaXJlY3Rpb25zCit0eXBlZGVmIGVudW0gX1RSX1NFTEVDVCB7CisJVFhfRElSID0gMCwKKwlSWF9ESVIgPSAxLAorfSBUUl9TRUxFQ1QsICpQVFJfU0VMRUNUOworCit0eXBlZGVmIHN0cnVjdCBfVFNfQ09NTU9OX0lORk97CisJc3RydWN0IGxpc3RfaGVhZAkJTGlzdDsKKwlzdHJ1Y3QgdGltZXJfbGlzdAkJU2V0dXBUaW1lcjsKKwlzdHJ1Y3QgdGltZXJfbGlzdAkJSW5hY3RUaW1lcjsKKwl1OAkJCQlBZGRyWzZdOworCVRTUEVDX0JPRFkJCQlUU3BlYzsKKwlRT1NfVENMQVMJCQlUQ2xhc3NbVENMQVNfTlVNXTsKKwl1OAkJCQlUQ2xhc1Byb2M7CisJdTgJCQkJVENsYXNOdW07Cit9IFRTX0NPTU1PTl9JTkZPLCAqUFRTX0NPTU1PTl9JTkZPOworCit0eXBlZGVmIHN0cnVjdCBfVFhfVFNfUkVDT1JEeworCVRTX0NPTU1PTl9JTkZPCQlUc0NvbW1vbkluZm87CisJdTE2CQkJCVR4Q3VyU2VxOworCUJBX1JFQ09SRAkJCVR4UGVuZGluZ0JBUmVjb3JkOyAgCS8vIEZvciBCQSBPcmlnaW5hdG9yCisJQkFfUkVDT1JECQkJVHhBZG1pdHRlZEJBUmVjb3JkOwkvLyBGb3IgQkEgT3JpZ2luYXRvcgorLy8JUU9TX0RMX1JFQ09SRAkJRExSZWNvcmQ7CisJdTgJCQkJYkFkZEJhUmVxSW5Qcm9ncmVzczsKKwl1OAkJCQliQWRkQmFSZXFEZWxheWVkOworCXU4CQkJCWJVc2luZ0JhOworCXN0cnVjdCB0aW1lcl9saXN0CQlUc0FkZEJhVGltZXI7CisJdTgJCQkJbnVtOworfSBUWF9UU19SRUNPUkQsICpQVFhfVFNfUkVDT1JEOworCit0eXBlZGVmIHN0cnVjdCBfUlhfVFNfUkVDT1JEIHsKKwlUU19DT01NT05fSU5GTwkJVHNDb21tb25JbmZvOworCXUxNgkJCQlSeEluZGljYXRlU2VxOworCXUxNgkJCQlSeFRpbWVvdXRJbmRpY2F0ZVNlcTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlSeFBlbmRpbmdQa3RMaXN0OworCXN0cnVjdCB0aW1lcl9saXN0CQlSeFBrdFBlbmRpbmdUaW1lcjsKKwlCQV9SRUNPUkQJCQlSeEFkbWl0dGVkQkFSZWNvcmQ7CSAvLyBGb3IgQkEgUmVjZXBpZW50CisJdTE2CQkJCVJ4TGFzdFNlcU51bTsKKwl1OAkJCQlSeExhc3RGcmFnTnVtOworCXU4CQkJCW51bTsKKy8vCVFPU19ETF9SRUNPUkQJCURMUmVjb3JkOworfSBSWF9UU19SRUNPUkQsICpQUlhfVFNfUkVDT1JEOworCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfVFNQcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfVFNQcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM3M2Q1NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9UU1Byb2MuYwpAQCAtMCwwICsxLDYyOCBAQAorI2luY2x1ZGUgImllZWU4MDIxMS5oIgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSAicnRsODE5eF9UUy5oIgorCit2b2lkIFRzU2V0dXBUaW1lT3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwkvLyBOb3QgaW1wbGVtZW50IHlldAorCS8vIFRoaXMgaXMgdXNlZCBmb3IgV01NU0EgYW5kIEFDTSAsIHRoYXQgd291bGQgc2VuZCBBRERUU1JlcSBmcmFtZS4KK30KKwordm9pZCBUc0luYWN0VGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJLy8gTm90IGltcGxlbWVudCB5ZXQKKwkvLyBUaGlzIGlzIHVzZWQgZm9yIFdNTVNBIGFuZCBBQ00uCisJLy8gVGhpcyBmdW5jdGlvbiB3b3VsZCBiZSBjYWxsIHdoZW4gVFMgaXMgbm8gVHgvUnggZm9yIHNvbWUgcGVyaW9kIG9mIHRpbWUuCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIEkgc3RpbGwgbm90IHVuZGVyc3RhbmQgdGhpcyBmdW5jdGlvbiwgc28gd2FpdCBmb3IgZnVydGhlciBpbXBsZW1lbnRhdGlvbgorICogICBpbnB1dDogIHVuc2lnbmVkIGxvbmcJIGRhdGEJCS8vYWN0dXJhbGx5IHdlIHNlbmQgVFhfVFNfUkVDT1JEIG9yIFJYX1RTX1JFQ09SRCB0byB0aGVzZSB0aW1lcgorICogIHJldHVybjogIE5VTEwKKyAqICBub3RpY2U6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUnhQa3RQZW5kaW5nVGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJUFJYX1RTX1JFQ09SRAlwUnhUcyA9IChQUlhfVFNfUkVDT1JEKWRhdGE7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YocFJ4VHMsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBSeFRzUmVjb3JkW3BSeFRzLT5udW1dKTsKKworCVBSWF9SRU9SREVSX0VOVFJZIAlwUmVvcmRlckVudHJ5ID0gTlVMTDsKKworCS8vdTMyIGZsYWdzID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4YiAqc3RhdHNfSW5kaWNhdGVBcnJheVtSRU9SREVSX1dJTl9TSVpFXTsKKwl1OCBpbmRleCA9IDA7CisJYm9vbCBiUGt0SW5CdWYgPSBmYWxzZTsKKworCisJc3Bpbl9sb2NrX2lycXNhdmUoJihpZWVlLT5yZW9yZGVyX3NwaW5sb2NrKSwgZmxhZ3MpOworCS8vUGxhdGZvcm1BY3F1aXJlU3BpbkxvY2soQWRhcHRlciwgUlRfUlhfU1BJTkxPQ0spOworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUkVPUkRFUiwiPT09PT09PT09PT09PT09PT09PiVzKClcbiIsX19GVU5DVElPTl9fKTsKKwlpZihwUnhUcy0+UnhUaW1lb3V0SW5kaWNhdGVTZXEgIT0gMHhmZmZmKQorCXsKKwkJLy8gSW5kaWNhdGUgdGhlIHBlbmRpbmcgcGFja2V0cyBzZXF1ZW50aWFsbHkgYWNjb3JkaW5nIHRvIFNlcU51bSB1bnRpbCBtZWV0IHRoZSBnYXAuCisJCXdoaWxlKCFsaXN0X2VtcHR5KCZwUnhUcy0+UnhQZW5kaW5nUGt0TGlzdCkpCisJCXsKKwkJCXBSZW9yZGVyRW50cnkgPSAoUFJYX1JFT1JERVJfRU5UUlkpbGlzdF9lbnRyeShwUnhUcy0+UnhQZW5kaW5nUGt0TGlzdC5wcmV2LFJYX1JFT1JERVJfRU5UUlksTGlzdCk7CisJCQlpZihpbmRleCA9PSAwKQorCQkJCXBSeFRzLT5SeEluZGljYXRlU2VxID0gcFJlb3JkZXJFbnRyeS0+U2VxTnVtOworCisJCQlpZiggU05fTEVTUyhwUmVvcmRlckVudHJ5LT5TZXFOdW0sIHBSeFRzLT5SeEluZGljYXRlU2VxKSB8fAorCQkJCVNOX0VRVUFMKHBSZW9yZGVyRW50cnktPlNlcU51bSwgcFJ4VHMtPlJ4SW5kaWNhdGVTZXEpCSkKKwkJCXsKKwkJCQlsaXN0X2RlbF9pbml0KCZwUmVvcmRlckVudHJ5LT5MaXN0KTsKKworCQkJCWlmKFNOX0VRVUFMKHBSZW9yZGVyRW50cnktPlNlcU51bSwgcFJ4VHMtPlJ4SW5kaWNhdGVTZXEpKQorCQkJCQlwUnhUcy0+UnhJbmRpY2F0ZVNlcSA9IChwUnhUcy0+UnhJbmRpY2F0ZVNlcSArIDEpICUgNDA5NjsKKworCQkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUkVPUkRFUiwiUnhQa3RQZW5kaW5nVGltZW91dCgpOiBJbmRpY2F0ZVNlcTogJWRcbiIsIHBSZW9yZGVyRW50cnktPlNlcU51bSk7CisJCQkJc3RhdHNfSW5kaWNhdGVBcnJheVtpbmRleF0gPSBwUmVvcmRlckVudHJ5LT5wcnhiOworCQkJCWluZGV4Kys7CisKKwkJCQlsaXN0X2FkZF90YWlsKCZwUmVvcmRlckVudHJ5LT5MaXN0LCAmaWVlZS0+UnhSZW9yZGVyX1VudXNlZF9MaXN0KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQliUGt0SW5CdWYgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYoaW5kZXg+MCkKKwl7CisJCS8vIFNldCBSeFRpbWVvdXRJbmRpY2F0ZVNlcSB0byAweGZmZmYgdG8gaW5kaWNhdGUgbm8gcGVuZGluZyBwYWNrZXRzIGluIGJ1ZmZlciBub3cuCisJCXBSeFRzLT5SeFRpbWVvdXRJbmRpY2F0ZVNlcSA9IDB4ZmZmZjsKKworCQkvLyBJbmRpY2F0ZSBwYWNrZXRzCisJCWlmKGluZGV4ID4gUkVPUkRFUl9XSU5fU0laRSl7CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgIlJ4UmVvcmRlckluZGljYXRlUGFja2V0KCk6IFJ4IFJlb3JlciBidWZmZXIgZnVsbCEhIFxuIik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaWVlZS0+cmVvcmRlcl9zcGlubG9jayksIGZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZWVlODAyMTFfaW5kaWNhdGVfcGFja2V0cyhpZWVlLCBzdGF0c19JbmRpY2F0ZUFycmF5LCBpbmRleCk7CisJfQorCisJaWYoYlBrdEluQnVmICYmIChwUnhUcy0+UnhUaW1lb3V0SW5kaWNhdGVTZXE9PTB4ZmZmZikpCisJeworCQlwUnhUcy0+UnhUaW1lb3V0SW5kaWNhdGVTZXEgPSBwUnhUcy0+UnhJbmRpY2F0ZVNlcTsKKwkJaWYodGltZXJfcGVuZGluZygmcFJ4VHMtPlJ4UGt0UGVuZGluZ1RpbWVyKSkKKwkJCWRlbF90aW1lcl9zeW5jKCZwUnhUcy0+UnhQa3RQZW5kaW5nVGltZXIpOworCQlwUnhUcy0+UnhQa3RQZW5kaW5nVGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBpZWVlLT5wSFRJbmZvLT5SeFJlb3JkZXJQZW5kaW5nVGltZTsKKwkJYWRkX3RpbWVyKCZwUnhUcy0+UnhQa3RQZW5kaW5nVGltZXIpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaWVlZS0+cmVvcmRlcl9zcGlubG9jayksIGZsYWdzKTsKKwkvL1BsYXRmb3JtUmVsZWFzZVNwaW5Mb2NrKEFkYXB0ZXIsIFJUX1JYX1NQSU5MT0NLKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgQWRkIEJBIHRpbWVyIGZ1bmN0aW9uCisgKiAgIGlucHV0OiAgdW5zaWduZWQgbG9uZwkgZGF0YQkJLy9hY3R1cmFsbHkgd2Ugc2VuZCBUWF9UU19SRUNPUkQgb3IgUlhfVFNfUkVDT1JEIHRvIHRoZXNlIHRpbWVyCisgKiAgcmV0dXJuOiAgTlVMTAorICogIG5vdGljZToKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBUc0FkZEJhUHJvY2Vzcyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJUFRYX1RTX1JFQ09SRAlwVHhUcyA9IChQVFhfVFNfUkVDT1JEKWRhdGE7CisJdTggbnVtID0gcFR4VHMtPm51bTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihwVHhUcywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIFR4VHNSZWNvcmRbbnVtXSk7CisKKwlUc0luaXRBZGRCQShpZWVlLCBwVHhUcywgQkFfUE9MSUNZX0lNTUVESUFURSwgZmFsc2UpOworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfQkEsICJUc0FkZEJhUHJvY2VzcygpOiBBRERCQSBSZXEgaXMgc3RhcnRlZCEhIFxuIik7Cit9CisKKwordm9pZCBSZXNldFRzQ29tbW9uSW5mbyhQVFNfQ09NTU9OX0lORk8JcFRzQ29tbW9uSW5mbykKK3sKKwltZW1zZXQocFRzQ29tbW9uSW5mby0+QWRkciwgMCwgNik7CisJbWVtc2V0KCZwVHNDb21tb25JbmZvLT5UU3BlYywgMCwgc2l6ZW9mKFRTUEVDX0JPRFkpKTsKKwltZW1zZXQoJnBUc0NvbW1vbkluZm8tPlRDbGFzcywgMCwgc2l6ZW9mKFFPU19UQ0xBUykqVENMQVNfTlVNKTsKKwlwVHNDb21tb25JbmZvLT5UQ2xhc1Byb2MgPSAwOworCXBUc0NvbW1vbkluZm8tPlRDbGFzTnVtID0gMDsKK30KKwordm9pZCBSZXNldFR4VHNFbnRyeShQVFhfVFNfUkVDT1JEIHBUUykKK3sKKwlSZXNldFRzQ29tbW9uSW5mbygmcFRTLT5Uc0NvbW1vbkluZm8pOworCXBUUy0+VHhDdXJTZXEgPSAwOworCXBUUy0+YkFkZEJhUmVxSW5Qcm9ncmVzcyA9IGZhbHNlOworCXBUUy0+YkFkZEJhUmVxRGVsYXllZCA9IGZhbHNlOworCXBUUy0+YlVzaW5nQmEgPSBmYWxzZTsKKwlSZXNldEJhRW50cnkoJnBUUy0+VHhBZG1pdHRlZEJBUmVjb3JkKTsgLy9Gb3IgQkEgT3JpZ2luYXRvcgorCVJlc2V0QmFFbnRyeSgmcFRTLT5UeFBlbmRpbmdCQVJlY29yZCk7Cit9CisKK3ZvaWQgUmVzZXRSeFRzRW50cnkoUFJYX1RTX1JFQ09SRCBwVFMpCit7CisJUmVzZXRUc0NvbW1vbkluZm8oJnBUUy0+VHNDb21tb25JbmZvKTsKKwlwVFMtPlJ4SW5kaWNhdGVTZXEgPSAweGZmZmY7IC8vIFRoaXMgaW5kaWNhdGUgdGhlIFJ4SW5kaWNhdGVTZXEgaXMgbm90IHVzZWQgbm93ISEKKwlwVFMtPlJ4VGltZW91dEluZGljYXRlU2VxID0gMHhmZmZmOyAvLyBUaGlzIGluZGljYXRlIHRoZSBSeFRpbWVvdXRJbmRpY2F0ZVNlcSBpcyBub3QgdXNlZCBub3chIQorCVJlc2V0QmFFbnRyeSgmcFRTLT5SeEFkbWl0dGVkQkFSZWNvcmQpOwkgIC8vIEZvciBCQSBSZWNlcGllbnQKK30KKwordm9pZCBUU0luaXRpYWxpemUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJUFRYX1RTX1JFQ09SRAkJcFR4VFMgID0gaWVlZS0+VHhUc1JlY29yZDsKKwlQUlhfVFNfUkVDT1JECQlwUnhUUyAgPSBpZWVlLT5SeFRzUmVjb3JkOworCVBSWF9SRU9SREVSX0VOVFJZCXBSeFJlb3JkZXJFbnRyeSA9IGllZWUtPlJ4UmVvcmRlckVudHJ5OworCXU4CQkJCWNvdW50ID0gMDsKKwlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1RTLCAiPT09PT09PT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCS8vIEluaXRpYWxpemUgVHggVFMgcmVsYXRlZCBpbmZvLgorCUlOSVRfTElTVF9IRUFEKCZpZWVlLT5UeF9UU19BZG1pdF9MaXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaWVlZS0+VHhfVFNfUGVuZGluZ19MaXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaWVlZS0+VHhfVFNfVW51c2VkX0xpc3QpOworCisJZm9yKGNvdW50ID0gMDsgY291bnQgPCBUT1RBTF9UU19OVU07IGNvdW50KyspCisJeworCQkvLworCQlwVHhUUy0+bnVtID0gY291bnQ7CisJCS8vIFRoZSB0aW1lcnMgZm9yIHRoZSBvcGVyYXRpb24gb2YgVHJhZmZpYyBTdHJlYW0gYW5kIEJsb2NrIEFjay4KKwkJLy8gRExTIHJlbGF0ZWQgdGltZXIgd2lsbCBiZSBhZGQgaGVyZSBpbiB0aGUgZnV0dXJlISEKKwkJaW5pdF90aW1lcigmcFR4VFMtPlRzQ29tbW9uSW5mby5TZXR1cFRpbWVyKTsKKwkJcFR4VFMtPlRzQ29tbW9uSW5mby5TZXR1cFRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVHhUUzsKKwkJcFR4VFMtPlRzQ29tbW9uSW5mby5TZXR1cFRpbWVyLmZ1bmN0aW9uID0gVHNTZXR1cFRpbWVPdXQ7CisKKwkJaW5pdF90aW1lcigmcFR4VFMtPlRzQ29tbW9uSW5mby5JbmFjdFRpbWVyKTsKKwkJcFR4VFMtPlRzQ29tbW9uSW5mby5JbmFjdFRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVHhUUzsKKwkJcFR4VFMtPlRzQ29tbW9uSW5mby5JbmFjdFRpbWVyLmZ1bmN0aW9uID0gVHNJbmFjdFRpbWVvdXQ7CisKKwkJaW5pdF90aW1lcigmcFR4VFMtPlRzQWRkQmFUaW1lcik7CisJCXBUeFRTLT5Uc0FkZEJhVGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBUeFRTOworCQlwVHhUUy0+VHNBZGRCYVRpbWVyLmZ1bmN0aW9uID0gVHNBZGRCYVByb2Nlc3M7CisKKwkJaW5pdF90aW1lcigmcFR4VFMtPlR4UGVuZGluZ0JBUmVjb3JkLlRpbWVyKTsKKwkJcFR4VFMtPlR4UGVuZGluZ0JBUmVjb3JkLlRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVHhUUzsKKwkJcFR4VFMtPlR4UGVuZGluZ0JBUmVjb3JkLlRpbWVyLmZ1bmN0aW9uID0gQmFTZXR1cFRpbWVPdXQ7CisKKwkJaW5pdF90aW1lcigmcFR4VFMtPlR4QWRtaXR0ZWRCQVJlY29yZC5UaW1lcik7CisJCXBUeFRTLT5UeEFkbWl0dGVkQkFSZWNvcmQuVGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBUeFRTOworCQlwVHhUUy0+VHhBZG1pdHRlZEJBUmVjb3JkLlRpbWVyLmZ1bmN0aW9uID0gVHhCYUluYWN0VGltZW91dDsKKworCQlSZXNldFR4VHNFbnRyeShwVHhUUyk7CisJCWxpc3RfYWRkX3RhaWwoJnBUeFRTLT5Uc0NvbW1vbkluZm8uTGlzdCwgJmllZWUtPlR4X1RTX1VudXNlZF9MaXN0KTsKKwkJcFR4VFMrKzsKKwl9CisKKwkvLyBJbml0aWFsaXplIFJ4IFRTIHJlbGF0ZWQgaW5mby4KKwlJTklUX0xJU1RfSEVBRCgmaWVlZS0+UnhfVFNfQWRtaXRfTGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmllZWUtPlJ4X1RTX1BlbmRpbmdfTGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmllZWUtPlJ4X1RTX1VudXNlZF9MaXN0KTsKKwlmb3IoY291bnQgPSAwOyBjb3VudCA8IFRPVEFMX1RTX05VTTsgY291bnQrKykKKwl7CisJCXBSeFRTLT5udW0gPSBjb3VudDsKKwkJSU5JVF9MSVNUX0hFQUQoJnBSeFRTLT5SeFBlbmRpbmdQa3RMaXN0KTsKKworCQlpbml0X3RpbWVyKCZwUnhUUy0+VHNDb21tb25JbmZvLlNldHVwVGltZXIpOworCQlwUnhUUy0+VHNDb21tb25JbmZvLlNldHVwVGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBSeFRTOworCQlwUnhUUy0+VHNDb21tb25JbmZvLlNldHVwVGltZXIuZnVuY3Rpb24gPSBUc1NldHVwVGltZU91dDsKKworCQlpbml0X3RpbWVyKCZwUnhUUy0+VHNDb21tb25JbmZvLkluYWN0VGltZXIpOworCQlwUnhUUy0+VHNDb21tb25JbmZvLkluYWN0VGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBSeFRTOworCQlwUnhUUy0+VHNDb21tb25JbmZvLkluYWN0VGltZXIuZnVuY3Rpb24gPSBUc0luYWN0VGltZW91dDsKKworCQlpbml0X3RpbWVyKCZwUnhUUy0+UnhBZG1pdHRlZEJBUmVjb3JkLlRpbWVyKTsKKwkJcFJ4VFMtPlJ4QWRtaXR0ZWRCQVJlY29yZC5UaW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFJ4VFM7CisJCXBSeFRTLT5SeEFkbWl0dGVkQkFSZWNvcmQuVGltZXIuZnVuY3Rpb24gPSBSeEJhSW5hY3RUaW1lb3V0OworCisJCWluaXRfdGltZXIoJnBSeFRTLT5SeFBrdFBlbmRpbmdUaW1lcik7CisJCXBSeFRTLT5SeFBrdFBlbmRpbmdUaW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFJ4VFM7CisJCXBSeFRTLT5SeFBrdFBlbmRpbmdUaW1lci5mdW5jdGlvbiA9IFJ4UGt0UGVuZGluZ1RpbWVvdXQ7CisKKwkJUmVzZXRSeFRzRW50cnkocFJ4VFMpOworCQlsaXN0X2FkZF90YWlsKCZwUnhUUy0+VHNDb21tb25JbmZvLkxpc3QsICZpZWVlLT5SeF9UU19VbnVzZWRfTGlzdCk7CisJCXBSeFRTKys7CisJfQorCS8vIEluaXRpYWxpemUgdW51c2VkIFJ4IFJlb3JkZXIgTGlzdC4KKwlJTklUX0xJU1RfSEVBRCgmaWVlZS0+UnhSZW9yZGVyX1VudXNlZF9MaXN0KTsKKy8vI2lmZGVmIFRPX0RPX0xJU1QKKwlmb3IoY291bnQgPSAwOyBjb3VudCA8IFJFT1JERVJfRU5UUllfTlVNOyBjb3VudCsrKQorCXsKKwkJbGlzdF9hZGRfdGFpbCggJnBSeFJlb3JkZXJFbnRyeS0+TGlzdCwmaWVlZS0+UnhSZW9yZGVyX1VudXNlZF9MaXN0KTsKKwkJaWYoY291bnQgPT0gKFJFT1JERVJfRU5UUllfTlVNLTEpKQorCQkJYnJlYWs7CisJCXBSeFJlb3JkZXJFbnRyeSA9ICZpZWVlLT5SeFJlb3JkZXJFbnRyeVtjb3VudCsxXTsKKwl9CisvLyNlbmRpZgorCit9CisKK3ZvaWQgQWRtaXRUUyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgUFRTX0NPTU1PTl9JTkZPIHBUc0NvbW1vbkluZm8sIHUzMiBJbmFjdFRpbWUpCit7CisJZGVsX3RpbWVyX3N5bmMoJnBUc0NvbW1vbkluZm8tPlNldHVwVGltZXIpOworCWRlbF90aW1lcl9zeW5jKCZwVHNDb21tb25JbmZvLT5JbmFjdFRpbWVyKTsKKworCWlmKEluYWN0VGltZSE9MCkKKwkJbW9kX3RpbWVyKCZwVHNDb21tb25JbmZvLT5JbmFjdFRpbWVyLCBqaWZmaWVzICsgTVNFQ1MoSW5hY3RUaW1lKSk7Cit9CisKKworUFRTX0NPTU1PTl9JTkZPIFNlYXJjaEFkbWl0VFJTdHJlYW0oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4KglBZGRyLCB1OCBUSUQsIFRSX1NFTEVDVAlUeFJ4U2VsZWN0KQoreworCS8vRElSRUNUSU9OX1ZBTFVFIAlkaXI7CisJdTggCWRpcjsKKwlib29sCQkJCXNlYXJjaF9kaXJbNF0gPSB7MCwgMCwgMCwgMH07CisJc3RydWN0IGxpc3RfaGVhZCoJCXBzZWFyY2hfbGlzdDsgLy9GSVhNRQorCVBUU19DT01NT05fSU5GTwlwUmV0ID0gTlVMTDsKKwlpZihpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSAvL2FwIG1vZGUKKwl7CisJCWlmKFR4UnhTZWxlY3QgPT0gVFhfRElSKQorCQl7CisJCQlzZWFyY2hfZGlyW0RJUl9ET1dOXSA9IHRydWU7CisJCQlzZWFyY2hfZGlyW0RJUl9CSV9ESVJdPSB0cnVlOworCQl9CisJCWVsc2UKKwkJeworCQkJc2VhcmNoX2RpcltESVJfVVBdIAk9IHRydWU7CisJCQlzZWFyY2hfZGlyW0RJUl9CSV9ESVJdPSB0cnVlOworCQl9CisJfQorCWVsc2UgaWYoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQorCXsKKwkJaWYoVHhSeFNlbGVjdCA9PSBUWF9ESVIpCisJCQlzZWFyY2hfZGlyW0RJUl9VUF0gCT0gdHJ1ZTsKKwkJZWxzZQorCQkJc2VhcmNoX2RpcltESVJfRE9XTl0gPSB0cnVlOworCX0KKwllbHNlCisJeworCQlpZihUeFJ4U2VsZWN0ID09IFRYX0RJUikKKwkJeworCQkJc2VhcmNoX2RpcltESVJfVVBdIAk9IHRydWU7CisJCQlzZWFyY2hfZGlyW0RJUl9CSV9ESVJdPSB0cnVlOworCQkJc2VhcmNoX2RpcltESVJfRElSRUNUXT0gdHJ1ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXNlYXJjaF9kaXJbRElSX0RPV05dID0gdHJ1ZTsKKwkJCXNlYXJjaF9kaXJbRElSX0JJX0RJUl09IHRydWU7CisJCQlzZWFyY2hfZGlyW0RJUl9ESVJFQ1RdPSB0cnVlOworCQl9CisJfQorCisJaWYoVHhSeFNlbGVjdCA9PSBUWF9ESVIpCisJCXBzZWFyY2hfbGlzdCA9ICZpZWVlLT5UeF9UU19BZG1pdF9MaXN0OworCWVsc2UKKwkJcHNlYXJjaF9saXN0ID0gJmllZWUtPlJ4X1RTX0FkbWl0X0xpc3Q7CisKKwkvL2ZvcihkaXIgPSBESVJfVVA7IGRpciA8PSBESVJfQklfRElSOyBkaXIrKykKKwlmb3IoZGlyID0gMDsgZGlyIDw9IERJUl9CSV9ESVI7IGRpcisrKQorCXsKKwkJaWYoc2VhcmNoX2RpcltkaXJdID09ZmFsc2UgKQorCQkJY29udGludWU7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocFJldCwgcHNlYXJjaF9saXN0LCBMaXN0KXsKKwkvLwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9UUywgIkFERDoiTUFDX0ZNVCIsIFRJRDolZCwgZGlyOiVkXG4iLCBNQUNfQVJHKHBSZXQtPkFkZHIpLCBwUmV0LT5UU3BlYy5mLlRTSW5mby5maWVsZC51Y1RTSUQsIHBSZXQtPlRTcGVjLmYuVFNJbmZvLmZpZWxkLnVjRGlyZWN0aW9uKTsKKwkJCWlmIChtZW1jbXAocFJldC0+QWRkciwgQWRkciwgNikgPT0gMCkKKwkJCQlpZiAocFJldC0+VFNwZWMuZi5UU0luZm8uZmllbGQudWNUU0lEID09IFRJRCkKKwkJCQkJaWYocFJldC0+VFNwZWMuZi5UU0luZm8uZmllbGQudWNEaXJlY3Rpb24gPT0gZGlyKQorCQkJCQl7CisJLy8JCQkJCXByaW50aygiQmluZ28hIGdvdCBpdFxuIik7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCX0KKwkJaWYoJnBSZXQtPkxpc3QgICE9IHBzZWFyY2hfbGlzdCkKKwkJCWJyZWFrOworCX0KKworCWlmKCZwUmV0LT5MaXN0ICAhPSBwc2VhcmNoX2xpc3QpeworCQlyZXR1cm4gcFJldCA7CisJfQorCWVsc2UKKwkJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgTWFrZVRTRW50cnkoCisJCVBUU19DT01NT05fSU5GTwlwVHNDb21tb25JbmZvLAorCQl1OCoJCUFkZHIsCisJCVBUU1BFQ19CT0RZCXBUU1BFQywKKwkJUFFPU19UQ0xBUwlwVENMQVMsCisJCXU4CQlUQ0xBU19OdW0sCisJCXU4CQlUQ0xBU19Qcm9jCisJKQoreworCXU4CWNvdW50OworCisJaWYocFRzQ29tbW9uSW5mbyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwltZW1jcHkocFRzQ29tbW9uSW5mby0+QWRkciwgQWRkciwgNik7CisKKwlpZihwVFNQRUMgIT0gTlVMTCkKKwkJbWVtY3B5KCh1OCopKCYocFRzQ29tbW9uSW5mby0+VFNwZWMpKSwgKHU4KilwVFNQRUMsIHNpemVvZihUU1BFQ19CT0RZKSk7CisKKwlmb3IoY291bnQgPSAwOyBjb3VudCA8IFRDTEFTX051bTsgY291bnQrKykKKwkJbWVtY3B5KCh1OCopKCYocFRzQ29tbW9uSW5mby0+VENsYXNzW2NvdW50XSkpLCAodTgqKXBUQ0xBUywgc2l6ZW9mKFFPU19UQ0xBUykpOworCisJcFRzQ29tbW9uSW5mby0+VENsYXNQcm9jID0gVENMQVNfUHJvYzsKKwlwVHNDb21tb25JbmZvLT5UQ2xhc051bSA9IFRDTEFTX051bTsKK30KKworCitib29sIEdldFRzKAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKglpZWVlLAorCVBUU19DT01NT05fSU5GTwkJCSpwcFRTLAorCXU4KgkJCQlBZGRyLAorCXU4CQkJCVRJRCwKKwlUUl9TRUxFQ1QJCQlUeFJ4U2VsZWN0LCAgLy9SeDoxLCBUeDowCisJYm9vbAkJCQliQWRkTmV3VHMKKwkpCit7CisJdTgJVVAgPSAwOworCS8vCisJLy8gV2UgZG8gbm90IGJ1aWxkIGFueSBUUyBmb3IgQnJvYWRjYXN0IG9yIE11bHRpY2FzdCBzdHJlYW0uCisJLy8gU28gcmVqZWN0IHRoZXNlIGtpbmRzIG9mIHNlYXJjaCBoZXJlLgorCS8vCisJaWYoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoQWRkcikgfHwgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoQWRkcikpCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgImdldCBUUyBmb3IgQnJvYWRjYXN0IG9yIE11bHRpY2FzdFxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5zdXBwb3J0ZWQgPT0gMCkKKwkJVVAgPSAwOworCWVsc2UKKwl7CisJCS8vIEluIFdNTSBjYXNlOiB3ZSB1c2UgNCBUSUQgb25seQorCQlpZiAoIUlzQUNWYWxpZChUSUQpKQorCQl7CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgIiBpbiAlcygpLCBUSUQoJWQpIGlzIG5vdCB2YWxpZFxuIiwgX19GVU5DVElPTl9fLCBUSUQpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJc3dpdGNoKFRJRCkKKwkJeworCQljYXNlIDA6CisJCWNhc2UgMzoKKwkJCVVQID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgMToKKwkJY2FzZSAyOgorCQkJVVAgPSAyOworCQkJYnJlYWs7CisKKwkJY2FzZSA0OgorCQljYXNlIDU6CisJCQlVUCA9IDU7CisJCQlicmVhazsKKworCQljYXNlIDY6CisJCWNhc2UgNzoKKwkJCVVQID0gNzsKKwkJCWJyZWFrOworCQl9CisJfQorCisJKnBwVFMgPSBTZWFyY2hBZG1pdFRSU3RyZWFtKAorCQkJaWVlZSwKKwkJCUFkZHIsCisJCQlVUCwKKwkJCVR4UnhTZWxlY3QpOworCWlmKCpwcFRTICE9IE5VTEwpCisJeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJZWxzZQorCXsKKwkJaWYoYkFkZE5ld1RzID09IGZhbHNlKQorCQl7CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1RTLCAiYWRkIG5ldyBUUyBmYWlsZWQodGlkOiVkKVxuIiwgVVApOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8KKwkJCS8vIENyZWF0ZSBhIG5ldyBUcmFmZmljIHN0cmVhbSBmb3IgY3VycmVudCBUeC9SeAorCQkJLy8gVGhpcyBpcyBmb3IgRURDQSBhbmQgV01NIHRvIGFkZCBhIG5ldyBUUy4KKwkJCS8vIEZvciBIQ0NBIG9yIFdNTVNBLCBUUyBjYW5ub3QgYmUgYWRkbWl0IHdpdGhvdXQgbmVnb3RpYXRpb24uCisJCQkvLworCQkJVFNQRUNfQk9EWQlUU3BlYzsKKwkJCVBRT1NfVFNJTkZPCQlwVFNJbmZvID0gJlRTcGVjLmYuVFNJbmZvOworCQkJc3RydWN0IGxpc3RfaGVhZCoJcFVudXNlZExpc3QgPQorCQkJCQkJCQkoVHhSeFNlbGVjdCA9PSBUWF9ESVIpPworCQkJCQkJCQkoJmllZWUtPlR4X1RTX1VudXNlZF9MaXN0KToKKwkJCQkJCQkJKCZpZWVlLT5SeF9UU19VbnVzZWRfTGlzdCk7CisKKwkJCXN0cnVjdCBsaXN0X2hlYWQqCXBBZGRtaXRMaXN0ID0KKwkJCQkJCQkJKFR4UnhTZWxlY3QgPT0gVFhfRElSKT8KKwkJCQkJCQkJKCZpZWVlLT5UeF9UU19BZG1pdF9MaXN0KToKKwkJCQkJCQkJKCZpZWVlLT5SeF9UU19BZG1pdF9MaXN0KTsKKworCQkJRElSRUNUSU9OX1ZBTFVFCQlEaXIgPQkJKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpPworCQkJCQkJCQkoKFR4UnhTZWxlY3Q9PVRYX0RJUik/RElSX0RPV046RElSX1VQKToKKwkJCQkJCQkJKChUeFJ4U2VsZWN0PT1UWF9ESVIpP0RJUl9VUDpESVJfRE9XTik7CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1RTLCAidG8gYWRkIFRzXG4iKTsKKwkJCWlmKCFsaXN0X2VtcHR5KHBVbnVzZWRMaXN0KSkKKwkJCXsKKwkJCQkoKnBwVFMpID0gbGlzdF9lbnRyeShwVW51c2VkTGlzdC0+bmV4dCwgVFNfQ09NTU9OX0lORk8sIExpc3QpOworCQkJCWxpc3RfZGVsX2luaXQoJigqcHBUUyktPkxpc3QpOworCQkJCWlmKFR4UnhTZWxlY3Q9PVRYX0RJUikKKwkJCQl7CisJCQkJCVBUWF9UU19SRUNPUkQgdG1wID0gY29udGFpbmVyX29mKCpwcFRTLCBUWF9UU19SRUNPUkQsIFRzQ29tbW9uSW5mbyk7CisJCQkJCVJlc2V0VHhUc0VudHJ5KHRtcCk7CisJCQkJfQorCQkJCWVsc2V7CisJCQkJCVBSWF9UU19SRUNPUkQgdG1wID0gY29udGFpbmVyX29mKCpwcFRTLCBSWF9UU19SRUNPUkQsIFRzQ29tbW9uSW5mbyk7CisJCQkJCVJlc2V0UnhUc0VudHJ5KHRtcCk7CisJCQkJfQorCisJCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9UUywgInRvIGluaXQgY3VycmVudCBUUywgVVA6JWQsIERpcjolZCwgYWRkcjoiTUFDX0ZNVCJcbiIsIFVQLCBEaXIsIE1BQ19BUkcoQWRkcikpOworCQkJCS8vIFByZXBhcmUgVFMgSW5mbyByZWxlYXRlZCBmaWVsZAorCQkJCXBUU0luZm8tPmZpZWxkLnVjVHJhZmZpY1R5cGUgPSAwOwkJCS8vIFRyYWZmaWMgdHlwZTogV01NIGlzIHJlc2VydmVkIGluIHRoaXMgZmllbGQKKwkJCQlwVFNJbmZvLT5maWVsZC51Y1RTSUQgPSBVUDsJCQkvLyBUU0lECisJCQkJcFRTSW5mby0+ZmllbGQudWNEaXJlY3Rpb24gPSBEaXI7CQkJLy8gRGlyZWN0aW9uOiBpZiB0aGVyZSBpcyBEaXJlY3RMaW5rLCB0aGlzIG5lZWQgYWRkaXRpb25hbCBjb25zaWRlcmF0aW9uLgorCQkJCXBUU0luZm8tPmZpZWxkLnVjQWNjZXNzUG9saWN5ID0gMTsJCS8vIEFjY2VzcyBwb2xpY3kKKwkJCQlwVFNJbmZvLT5maWVsZC51Y0FnZ3JlZ2F0aW9uID0gMDsgCQkvLyBBZ2dyZWdhdGlvbgorCQkJCXBUU0luZm8tPmZpZWxkLnVjUFNCID0gMDsgCQkJCS8vIEFnZ3JlZ2F0aW9uCisJCQkJcFRTSW5mby0+ZmllbGQudWNVUCA9IFVQOwkJCQkvLyBVc2VyIHByaW9yaXR5CisJCQkJcFRTSW5mby0+ZmllbGQudWNUU0luZm9BY2tQb2xpY3kgPSAwOwkJLy8gQWNrIHBvbGljeQorCQkJCXBUU0luZm8tPmZpZWxkLnVjU2NoZWR1bGUgPSAwOwkJCS8vIFNjaGVkdWxlCisKKwkJCQlNYWtlVFNFbnRyeSgqcHBUUywgQWRkciwgJlRTcGVjLCBOVUxMLCAwLCAwKTsKKwkJCQlBZG1pdFRTKGllZWUsICpwcFRTLCAwKTsKKwkJCQlsaXN0X2FkZF90YWlsKCYoKCpwcFRTKS0+TGlzdCksIHBBZGRtaXRMaXN0KTsKKwkJCQkvLyBpZiB0aGVyZSBpcyBEaXJlY3RMaW5rLCB3ZSBuZWVkIHRvIGRvIGFkZGl0aW9uYWwgb3BlcmF0aW9uIGhlcmUhIQorCisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJpbiBmdW5jdGlvbiAlcygpIFRoZXJlIGlzIG5vdCBlbm91Z2ggVFMgcmVjb3JkIHRvIGJlIHVzZWQhISIsIF9fRlVOQ1RJT05fXyk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJfQorfQorCit2b2lkIFJlbW92ZVRzRW50cnkoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqCWllZWUsCisJUFRTX0NPTU1PTl9JTkZPCQkJcFRzLAorCVRSX1NFTEVDVAkJCVR4UnhTZWxlY3QKKwkpCit7CisJLy91MzIgZmxhZ3MgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCWRlbF90aW1lcl9zeW5jKCZwVHMtPlNldHVwVGltZXIpOworCWRlbF90aW1lcl9zeW5jKCZwVHMtPkluYWN0VGltZXIpOworCVRzSW5pdERlbEJBKGllZWUsIHBUcywgVHhSeFNlbGVjdCk7CisKKwlpZihUeFJ4U2VsZWN0ID09IFJYX0RJUikKKwl7CisvLyNpZmRlZiBUT19ET19MSVNUCisJCVBSWF9SRU9SREVSX0VOVFJZCXBSeFJlb3JkZXJFbnRyeTsKKwkJUFJYX1RTX1JFQ09SRCAJCXBSeFRTID0gKFBSWF9UU19SRUNPUkQpcFRzOworCQlpZih0aW1lcl9wZW5kaW5nKCZwUnhUUy0+UnhQa3RQZW5kaW5nVGltZXIpKQorCQkJZGVsX3RpbWVyX3N5bmMoJnBSeFRTLT5SeFBrdFBlbmRpbmdUaW1lcik7CisKKwkJd2hpbGUoIWxpc3RfZW1wdHkoJnBSeFRTLT5SeFBlbmRpbmdQa3RMaXN0KSkKKwkJeworCQkvLyAgICAgIFBsYXRmb3JtQWNxdWlyZVNwaW5Mb2NrKEFkYXB0ZXIsIFJUX1JYX1NQSU5MT0NLKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCYoaWVlZS0+cmVvcmRlcl9zcGlubG9jayksIGZsYWdzKTsKKwkJCS8vcFJ4UmVvcmRlckVudHJ5ID0gbGlzdF9lbnRyeSgmcFJ4VFMtPlJ4UGVuZGluZ1BrdExpc3QucHJldixSWF9SRU9SREVSX0VOVFJZLExpc3QpOworCQkJcFJ4UmVvcmRlckVudHJ5ID0gKFBSWF9SRU9SREVSX0VOVFJZKWxpc3RfZW50cnkocFJ4VFMtPlJ4UGVuZGluZ1BrdExpc3QucHJldixSWF9SRU9SREVSX0VOVFJZLExpc3QpOworCQkJbGlzdF9kZWxfaW5pdCgmcFJ4UmVvcmRlckVudHJ5LT5MaXN0KTsKKwkJCXsKKwkJCQlpbnQgaSA9IDA7CisJCQkJc3RydWN0IGllZWU4MDIxMV9yeGIgKiBwcnhiID0gcFJ4UmVvcmRlckVudHJ5LT5wcnhiOworCQkJCWlmICh1bmxpa2VseSghcHJ4YikpCisJCQkJeworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaWVlZS0+cmVvcmRlcl9zcGlubG9jayksIGZsYWdzKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlmb3IoaSA9MDsgaSA8IHByeGItPm5yX3N1YmZyYW1lczsgaSsrKSB7CisJCQkJCWRldl9rZnJlZV9za2IocHJ4Yi0+c3ViZnJhbWVzW2ldKTsKKwkJCQl9CisJCQkJa2ZyZWUocHJ4Yik7CisJCQkJcHJ4YiA9IE5VTEw7CisJCQl9CisJCQlsaXN0X2FkZF90YWlsKCZwUnhSZW9yZGVyRW50cnktPkxpc3QsJmllZWUtPlJ4UmVvcmRlcl9VbnVzZWRfTGlzdCk7CisJCQkvL1BsYXRmb3JtUmVsZWFzZVNwaW5Mb2NrKEFkYXB0ZXIsIFJUX1JYX1NQSU5MT0NLKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihpZWVlLT5yZW9yZGVyX3NwaW5sb2NrKSwgZmxhZ3MpOworCQl9CisKKy8vI2VuZGlmCisJfQorCWVsc2UKKwl7CisJCVBUWF9UU19SRUNPUkQgcFR4VFMgPSAoUFRYX1RTX1JFQ09SRClwVHM7CisJCWRlbF90aW1lcl9zeW5jKCZwVHhUUy0+VHNBZGRCYVRpbWVyKTsKKwl9Cit9CisKK3ZvaWQgUmVtb3ZlUGVlclRTKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogQWRkcikKK3sKKwlQVFNfQ09NTU9OX0lORk8JcFRTLCBwVG1wVFM7CisJcHJpbnRrKCI9PT09PT09PT09PT5SZW1vdmVQZWVyVFMsIk1BQ19GTVQiXG4iLCBNQUNfQVJHKEFkZHIpKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocFRTLCBwVG1wVFMsICZpZWVlLT5UeF9UU19QZW5kaW5nX0xpc3QsIExpc3QpCisJeworCQlpZiAobWVtY21wKHBUUy0+QWRkciwgQWRkciwgNikgPT0gMCkKKwkJeworCQkJUmVtb3ZlVHNFbnRyeShpZWVlLCBwVFMsIFRYX0RJUik7CisJCQlsaXN0X2RlbF9pbml0KCZwVFMtPkxpc3QpOworCQkJbGlzdF9hZGRfdGFpbCgmcFRTLT5MaXN0LCAmaWVlZS0+VHhfVFNfVW51c2VkX0xpc3QpOworCQl9CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBUUywgcFRtcFRTLCAmaWVlZS0+VHhfVFNfQWRtaXRfTGlzdCwgTGlzdCkKKwl7CisJCWlmIChtZW1jbXAocFRTLT5BZGRyLCBBZGRyLCA2KSA9PSAwKQorCQl7CisJCQlwcmludGsoIj09PT0+cmVtb3ZlIFR4X1RTX2FkbWluX2xpc3RcbiIpOworCQkJUmVtb3ZlVHNFbnRyeShpZWVlLCBwVFMsIFRYX0RJUik7CisJCQlsaXN0X2RlbF9pbml0KCZwVFMtPkxpc3QpOworCQkJbGlzdF9hZGRfdGFpbCgmcFRTLT5MaXN0LCAmaWVlZS0+VHhfVFNfVW51c2VkX0xpc3QpOworCQl9CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBUUywgcFRtcFRTLCAmaWVlZS0+UnhfVFNfUGVuZGluZ19MaXN0LCBMaXN0KQorCXsKKwkJaWYgKG1lbWNtcChwVFMtPkFkZHIsIEFkZHIsIDYpID09IDApCisJCXsKKwkJCVJlbW92ZVRzRW50cnkoaWVlZSwgcFRTLCBSWF9ESVIpOworCQkJbGlzdF9kZWxfaW5pdCgmcFRTLT5MaXN0KTsKKwkJCWxpc3RfYWRkX3RhaWwoJnBUUy0+TGlzdCwgJmllZWUtPlJ4X1RTX1VudXNlZF9MaXN0KTsKKwkJfQorCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwVFMsIHBUbXBUUywgJmllZWUtPlJ4X1RTX0FkbWl0X0xpc3QsIExpc3QpCisJeworCQlpZiAobWVtY21wKHBUUy0+QWRkciwgQWRkciwgNikgPT0gMCkKKwkJeworCQkJUmVtb3ZlVHNFbnRyeShpZWVlLCBwVFMsIFJYX0RJUik7CisJCQlsaXN0X2RlbF9pbml0KCZwVFMtPkxpc3QpOworCQkJbGlzdF9hZGRfdGFpbCgmcFRTLT5MaXN0LCAmaWVlZS0+UnhfVFNfVW51c2VkX0xpc3QpOworCQl9CisJfQorfQorCit2b2lkIFJlbW92ZUFsbFRTKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlKQoreworCVBUU19DT01NT05fSU5GTyBwVFMsIHBUbXBUUzsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocFRTLCBwVG1wVFMsICZpZWVlLT5UeF9UU19QZW5kaW5nX0xpc3QsIExpc3QpCisJeworCQlSZW1vdmVUc0VudHJ5KGllZWUsIHBUUywgVFhfRElSKTsKKwkJbGlzdF9kZWxfaW5pdCgmcFRTLT5MaXN0KTsKKwkJbGlzdF9hZGRfdGFpbCgmcFRTLT5MaXN0LCAmaWVlZS0+VHhfVFNfVW51c2VkX0xpc3QpOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwVFMsIHBUbXBUUywgJmllZWUtPlR4X1RTX0FkbWl0X0xpc3QsIExpc3QpCisJeworCQlSZW1vdmVUc0VudHJ5KGllZWUsIHBUUywgVFhfRElSKTsKKwkJbGlzdF9kZWxfaW5pdCgmcFRTLT5MaXN0KTsKKwkJbGlzdF9hZGRfdGFpbCgmcFRTLT5MaXN0LCAmaWVlZS0+VHhfVFNfVW51c2VkX0xpc3QpOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwVFMsIHBUbXBUUywgJmllZWUtPlJ4X1RTX1BlbmRpbmdfTGlzdCwgTGlzdCkKKwl7CisJCVJlbW92ZVRzRW50cnkoaWVlZSwgcFRTLCBSWF9ESVIpOworCQlsaXN0X2RlbF9pbml0KCZwVFMtPkxpc3QpOworCQlsaXN0X2FkZF90YWlsKCZwVFMtPkxpc3QsICZpZWVlLT5SeF9UU19VbnVzZWRfTGlzdCk7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBUUywgcFRtcFRTLCAmaWVlZS0+UnhfVFNfQWRtaXRfTGlzdCwgTGlzdCkKKwl7CisJCVJlbW92ZVRzRW50cnkoaWVlZSwgcFRTLCBSWF9ESVIpOworCQlsaXN0X2RlbF9pbml0KCZwVFMtPkxpc3QpOworCQlsaXN0X2FkZF90YWlsKCZwVFMtPkxpc3QsICZpZWVlLT5SeF9UU19VbnVzZWRfTGlzdCk7CisJfQorfQorCit2b2lkIFRzU3RhcnRBZGRCYVByb2Nlc3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIFBUWF9UU19SRUNPUkQJcFR4VFMpCit7CisJaWYocFR4VFMtPmJBZGRCYVJlcUluUHJvZ3Jlc3MgPT0gZmFsc2UpCisJeworCQlwVHhUUy0+YkFkZEJhUmVxSW5Qcm9ncmVzcyA9IHRydWU7CisJCWlmKHBUeFRTLT5iQWRkQmFSZXFEZWxheWVkKQorCQl7CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0JBLCAiVHNTdGFydEFkZEJhUHJvY2VzcygpOiBEZWxheWVkIFN0YXJ0IEFEREJBIGFmdGVyIDYwIHNlYyEhXG4iKTsKKwkJCW1vZF90aW1lcigmcFR4VFMtPlRzQWRkQmFUaW1lciwgamlmZmllcyArIE1TRUNTKFRTX0FEREJBX0RFTEFZKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0JBLCJUc1N0YXJ0QWRkQmFQcm9jZXNzKCk6IEltbWVkaWF0ZWx5IFN0YXJ0IEFEREJBIG5vdyEhXG4iKTsKKwkJCW1vZF90aW1lcigmcFR4VFMtPlRzQWRkQmFUaW1lciwgamlmZmllcysxMCk7IC8vc2V0IDEwIHRpY2tzCisJCX0KKwl9CisJZWxzZQorCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgIiVzKCk9PT5CQSB0aW1lciBpcyBhbHJlYWR5IGFkZGVkXG4iLCBfX0ZVTkNUSU9OX18pOworfQorRVhQT1JUX1NZTUJPTChSZW1vdmVQZWVyVFMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGxfY3J5cHRvLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bF9jcnlwdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2Y2YWU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGxfY3J5cHRvLmgKQEAgLTAsMCArMSwzOTkgQEAKKy8qCisgKiBTY2F0dGVybGlzdCBDcnlwdG9ncmFwaGljIEFQSS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICoKKyAqIFBvcnRpb25zIGRlcml2ZWQgZnJvbSBDcnlwdG9hcGksIGJ5IEFsZXhhbmRlciBLamVsZGFhcyA8YXN0b3JAZmFzdC5ubz4KKyAqIGFuZCBOZXR0bGUsIGJ5IE5pZWxzIE3psIhsZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKyNpZm5kZWYgX0xJTlVYX0NSWVBUT19ICisjZGVmaW5lIF9MSU5VWF9DUllQVE9fSAorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKworI2RlZmluZSBjcnlwdG9fcmVnaXN0ZXJfYWxnIGNyeXB0b19yZWdpc3Rlcl9hbGdfcnNsCisjZGVmaW5lIGNyeXB0b191bnJlZ2lzdGVyX2FsZyBjcnlwdG9fdW5yZWdpc3Rlcl9hbGdfcnNsCisjZGVmaW5lIGNyeXB0b19hbGxvY190Zm0gY3J5cHRvX2FsbG9jX3RmbV9yc2wKKyNkZWZpbmUgY3J5cHRvX2ZyZWVfdGZtIGNyeXB0b19mcmVlX3RmbV9yc2wKKyNkZWZpbmUgY3J5cHRvX2FsZ19hdmFpbGFibGUgY3J5cHRvX2FsZ19hdmFpbGFibGVfcnNsCisKKy8qCisgKiBBbGdvcml0aG0gbWFza3MgYW5kIHR5cGVzLgorICovCisjZGVmaW5lIENSWVBUT19BTEdfVFlQRV9NQVNLCQkweDAwMDAwMGZmCisjZGVmaW5lIENSWVBUT19BTEdfVFlQRV9DSVBIRVIJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX0RJR0VTVAkJMHgwMDAwMDAwMgorI2RlZmluZSBDUllQVE9fQUxHX1RZUEVfQ09NUFJFU1MJMHgwMDAwMDAwNAorCisvKgorICogVHJhbnNmb3JtIG1hc2tzIGFuZCB2YWx1ZXMgKGZvciBjcnRfZmxhZ3MpLgorICovCisjZGVmaW5lIENSWVBUT19URk1fTU9ERV9NQVNLCQkweDAwMDAwMGZmCisjZGVmaW5lIENSWVBUT19URk1fUkVRX01BU0sJCTB4MDAwZmZmMDAKKyNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfTUFTSwkJMHhmZmYwMDAwMAorCisjZGVmaW5lIENSWVBUT19URk1fTU9ERV9FQ0IJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQ1JZUFRPX1RGTV9NT0RFX0NCQwkJMHgwMDAwMDAwMgorI2RlZmluZSBDUllQVE9fVEZNX01PREVfQ0ZCCQkweDAwMDAwMDA0CisjZGVmaW5lIENSWVBUT19URk1fTU9ERV9DVFIJCTB4MDAwMDAwMDgKKworI2RlZmluZSBDUllQVE9fVEZNX1JFUV9XRUFLX0tFWQkJMHgwMDAwMDEwMAorI2RlZmluZSBDUllQVE9fVEZNX1JFU19XRUFLX0tFWQkJMHgwMDEwMDAwMAorI2RlZmluZSBDUllQVE9fVEZNX1JFU19CQURfS0VZX0xFTiAgIAkweDAwMjAwMDAwCisjZGVmaW5lIENSWVBUT19URk1fUkVTX0JBRF9LRVlfU0NIRUQgCTB4MDA0MDAwMDAKKyNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfQkFEX0JMT0NLX0xFTiAJMHgwMDgwMDAwMAorI2RlZmluZSBDUllQVE9fVEZNX1JFU19CQURfRkxBR1MgCTB4MDEwMDAwMDAKKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgc3R1ZmYuCisgKi8KKyNkZWZpbmUgQ1JZUFRPX1VOU1BFQwkJCTAKKyNkZWZpbmUgQ1JZUFRPX01BWF9BTEdfTkFNRQkJNjQKKworc3RydWN0IHNjYXR0ZXJsaXN0OworCisvKgorICogQWxnb3JpdGhtczogbW9kdWxhciBjcnlwdG8gYWxnb3JpdGhtIGltcGxlbWVudGF0aW9ucywgbWFuYWdlZAorICogdmlhIGNyeXB0b19yZWdpc3Rlcl9hbGcoKSBhbmQgY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCkuCisgKi8KK3N0cnVjdCBjaXBoZXJfYWxnIHsKKwl1bnNpZ25lZCBpbnQgY2lhX21pbl9rZXlzaXplOworCXVuc2lnbmVkIGludCBjaWFfbWF4X2tleXNpemU7CisJaW50ICgqY2lhX3NldGtleSkodm9pZCAqY3R4LCBjb25zdCB1OCAqa2V5LAorCSAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBrZXlsZW4sIHUzMiAqZmxhZ3MpOworCXZvaWQgKCpjaWFfZW5jcnlwdCkodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKTsKKwl2b2lkICgqY2lhX2RlY3J5cHQpKHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYyk7Cit9OworCitzdHJ1Y3QgZGlnZXN0X2FsZyB7CisJdW5zaWduZWQgaW50IGRpYV9kaWdlc3RzaXplOworCXZvaWQgKCpkaWFfaW5pdCkodm9pZCAqY3R4KTsKKwl2b2lkICgqZGlhX3VwZGF0ZSkodm9pZCAqY3R4LCBjb25zdCB1OCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbik7CisJdm9pZCAoKmRpYV9maW5hbCkodm9pZCAqY3R4LCB1OCAqb3V0KTsKKwlpbnQgKCpkaWFfc2V0a2V5KSh2b2lkICpjdHgsIGNvbnN0IHU4ICprZXksCisJICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGtleWxlbiwgdTMyICpmbGFncyk7Cit9OworCitzdHJ1Y3QgY29tcHJlc3NfYWxnIHsKKwlpbnQgKCpjb2FfaW5pdCkodm9pZCAqY3R4KTsKKwl2b2lkICgqY29hX2V4aXQpKHZvaWQgKmN0eCk7CisJaW50ICgqY29hX2NvbXByZXNzKSh2b2lkICpjdHgsIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAorCSAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKKwlpbnQgKCpjb2FfZGVjb21wcmVzcykodm9pZCAqY3R4LCBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKKwkgICAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKK307CisKKyNkZWZpbmUgY3JhX2NpcGhlcgljcmFfdS5jaXBoZXIKKyNkZWZpbmUgY3JhX2RpZ2VzdAljcmFfdS5kaWdlc3QKKyNkZWZpbmUgY3JhX2NvbXByZXNzCWNyYV91LmNvbXByZXNzCisKK3N0cnVjdCBjcnlwdG9fYWxnIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNyYV9saXN0OworCXUzMiBjcmFfZmxhZ3M7CisJdW5zaWduZWQgaW50IGNyYV9ibG9ja3NpemU7CisJdW5zaWduZWQgaW50IGNyYV9jdHhzaXplOworCWNvbnN0IGNoYXIgY3JhX25hbWVbQ1JZUFRPX01BWF9BTEdfTkFNRV07CisKKwl1bmlvbiB7CisJCXN0cnVjdCBjaXBoZXJfYWxnIGNpcGhlcjsKKwkJc3RydWN0IGRpZ2VzdF9hbGcgZGlnZXN0OworCQlzdHJ1Y3QgY29tcHJlc3NfYWxnIGNvbXByZXNzOworCX0gY3JhX3U7CisKKwlzdHJ1Y3QgbW9kdWxlICpjcmFfbW9kdWxlOworfTsKKworLyoKKyAqIEFsZ29yaXRobSByZWdpc3RyYXRpb24gaW50ZXJmYWNlLgorICovCitpbnQgY3J5cHRvX3JlZ2lzdGVyX2FsZyhzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKTsKK2ludCBjcnlwdG9fdW5yZWdpc3Rlcl9hbGcoc3RydWN0IGNyeXB0b19hbGcgKmFsZyk7CisKKy8qCisgKiBBbGdvcml0aG0gcXVlcnkgaW50ZXJmYWNlLgorICovCitpbnQgY3J5cHRvX2FsZ19hdmFpbGFibGUoY29uc3QgY2hhciAqbmFtZSwgdTMyIGZsYWdzKTsKKworLyoKKyAqIFRyYW5zZm9ybXM6IHVzZXItaW5zdGFudGlhdGVkIG9iamVjdHMgd2hpY2ggZW5jYXBzdWxhdGUgYWxnb3JpdGhtcworICogYW5kIGNvcmUgcHJvY2Vzc2luZyBsb2dpYy4gIE1hbmFnZWQgdmlhIGNyeXB0b19hbGxvY190Zm0oKSBhbmQKKyAqIGNyeXB0b19mcmVlX3RmbSgpLCBhcyB3ZWxsIGFzIHRoZSB2YXJpb3VzIGhlbHBlcnMgYmVsb3cuCisgKi8KK3N0cnVjdCBjcnlwdG9fdGZtOworCitzdHJ1Y3QgY2lwaGVyX3RmbSB7CisJdm9pZCAqY2l0X2l2OworCXVuc2lnbmVkIGludCBjaXRfaXZzaXplOworCXUzMiBjaXRfbW9kZTsKKwlpbnQgKCpjaXRfc2V0a2V5KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCSAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pOworCWludCAoKmNpdF9lbmNyeXB0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKwkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMpOworCWludCAoKmNpdF9lbmNyeXB0X2l2KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCSAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisJICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdik7CisJaW50ICgqY2l0X2RlY3J5cHQpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcyk7CisJaW50ICgqY2l0X2RlY3J5cHRfaXYpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KTsKKwl2b2lkICgqY2l0X3hvcl9ibG9jaykodTggKmRzdCwgY29uc3QgdTggKnNyYyk7Cit9OworCitzdHJ1Y3QgZGlnZXN0X3RmbSB7CisJdm9pZCAoKmRpdF9pbml0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKKwl2b2lkICgqZGl0X3VwZGF0ZSkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IG5zZyk7CisJdm9pZCAoKmRpdF9maW5hbCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCk7CisJdm9pZCAoKmRpdF9kaWdlc3QpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuc2csIHU4ICpvdXQpOworCWludCAoKmRpdF9zZXRrZXkpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJICAgICAgICAgICAgICAgICAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbik7CisjaWZkZWYgQ09ORklHX0NSWVBUT19ITUFDCisJdm9pZCAqZGl0X2htYWNfYmxvY2s7CisjZW5kaWYKK307CisKK3N0cnVjdCBjb21wcmVzc190Zm0geworCWludCAoKmNvdF9jb21wcmVzcykoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAorCSAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKKwlpbnQgKCpjb3RfZGVjb21wcmVzcykoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCisJICAgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbik7Cit9OworCisjZGVmaW5lIGNydF9jaXBoZXIJY3J0X3UuY2lwaGVyCisjZGVmaW5lIGNydF9kaWdlc3QJY3J0X3UuZGlnZXN0CisjZGVmaW5lIGNydF9jb21wcmVzcwljcnRfdS5jb21wcmVzcworCitzdHJ1Y3QgY3J5cHRvX3RmbSB7CisKKwl1MzIgY3J0X2ZsYWdzOworCisJdW5pb24geworCQlzdHJ1Y3QgY2lwaGVyX3RmbSBjaXBoZXI7CisJCXN0cnVjdCBkaWdlc3RfdGZtIGRpZ2VzdDsKKwkJc3RydWN0IGNvbXByZXNzX3RmbSBjb21wcmVzczsKKwl9IGNydF91OworCisJc3RydWN0IGNyeXB0b19hbGcgKl9fY3J0X2FsZzsKK307CisKKy8qCisgKiBUcmFuc2Zvcm0gdXNlciBpbnRlcmZhY2UuCisgKi8KKworLyoKKyAqIGNyeXB0b19hbGxvY190Zm0oKSB3aWxsIGZpcnN0IGF0dGVtcHQgdG8gbG9jYXRlIGFuIGFscmVhZHkgbG9hZGVkIGFsZ29yaXRobS4KKyAqIElmIHRoYXQgZmFpbHMgYW5kIHRoZSBrZXJuZWwgc3VwcG9ydHMgZHluYW1pY2FsbHkgbG9hZGFibGUgbW9kdWxlcywgaXQKKyAqIHdpbGwgdGhlbiBhdHRlbXB0IHRvIGxvYWQgYSBtb2R1bGUgb2YgdGhlIHNhbWUgbmFtZSBvciBhbGlhcy4gIEEgcmVmY291bnQKKyAqIGlzIGdyYWJiZWQgb24gdGhlIGFsZ29yaXRobSB3aGljaCBpcyB0aGVuIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3IHRyYW5zZm9ybS4KKyAqCisgKiBjcnlwdG9fZnJlZV90Zm0oKSBmcmVlcyB1cCB0aGUgdHJhbnNmb3JtIGFuZCBhbnkgYXNzb2NpYXRlZCByZXNvdXJjZXMsCisgKiB0aGVuIGRyb3BzIHRoZSByZWZjb3VudCBvbiB0aGUgYXNzb2NpYXRlZCBhbGdvcml0aG0uCisgKi8KK3N0cnVjdCBjcnlwdG9fdGZtICpjcnlwdG9fYWxsb2NfdGZtKGNvbnN0IGNoYXIgKmFsZ19uYW1lLCB1MzIgdGZtX2ZsYWdzKTsKK3ZvaWQgY3J5cHRvX2ZyZWVfdGZtKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOworCisvKgorICogVHJhbnNmb3JtIGhlbHBlcnMgd2hpY2ggcXVlcnkgdGhlIHVuZGVybHlpbmcgYWxnb3JpdGhtLgorICovCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmNyeXB0b190Zm1fYWxnX25hbWUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9uYW1lOworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmNyeXB0b190Zm1fYWxnX21vZG5hbWUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnID0gdGZtLT5fX2NydF9hbGc7CisKKwlpZiAoYWxnLT5jcmFfbW9kdWxlKQorCQlyZXR1cm4gYWxnLT5jcmFfbW9kdWxlLT5uYW1lOworCWVsc2UKKwkJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGNyeXB0b190Zm1fYWxnX3R5cGUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9mbGFncyAmIENSWVBUT19BTEdfVFlQRV9NQVNLOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19taW5fa2V5c2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9taW5fa2V5c2l6ZTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfbWF4X2tleXNpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOworCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfbWF4X2tleXNpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX2l2c2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfaXZzaXplOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9ibG9ja3NpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX2RpZ2VzdHNpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QpOworCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2RpZ2VzdC5kaWFfZGlnZXN0c2l6ZTsKK30KKworLyoKKyAqIEFQSSB3cmFwcGVycy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19kaWdlc3RfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCk7CisJdGZtLT5jcnRfZGlnZXN0LmRpdF9pbml0KHRmbSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fZGlnZXN0X3VwZGF0ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5zZykKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QpOworCXRmbS0+Y3J0X2RpZ2VzdC5kaXRfdXBkYXRlKHRmbSwgc2csIG5zZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fZGlnZXN0X2ZpbmFsKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQpCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfRElHRVNUKTsKKwl0Zm0tPmNydF9kaWdlc3QuZGl0X2ZpbmFsKHRmbSwgb3V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19kaWdlc3RfZGlnZXN0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnNnLCB1OCAqb3V0KQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCk7CisJdGZtLT5jcnRfZGlnZXN0LmRpdF9kaWdlc3QodGZtLCBzZywgbnNnLCBvdXQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fZGlnZXN0X3NldGtleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QpOworCWlmICh0Zm0tPmNydF9kaWdlc3QuZGl0X3NldGtleSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT1NZUzsKKwlyZXR1cm4gdGZtLT5jcnRfZGlnZXN0LmRpdF9zZXRrZXkodGZtLCBrZXksIGtleWxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfc2V0a2V5KHRmbSwga2V5LCBrZXlsZW4pOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfZW5jcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMpOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX2VuY3J5cHRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKKwlCVUdfT04odGZtLT5jcnRfY2lwaGVyLmNpdF9tb2RlID09IENSWVBUT19URk1fTU9ERV9FQ0IpOworCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2VuY3J5cHRfaXYodGZtLCBkc3QsIHNyYywgbmJ5dGVzLCBpdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKKwlyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9kZWNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZGVjcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdikKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOworCUJVR19PTih0Zm0tPmNydF9jaXBoZXIuY2l0X21vZGUgPT0gQ1JZUFRPX1RGTV9NT0RFX0VDQik7CisJcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfZGVjcnlwdF9pdih0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMsIGl2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19jaXBoZXJfc2V0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IGxlbikKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOworCW1lbWNweSh0Zm0tPmNydF9jaXBoZXIuY2l0X2l2LCBzcmMsIGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fY2lwaGVyX2dldF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCBsZW4pCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKKwltZW1jcHkoZHN0LCB0Zm0tPmNydF9jaXBoZXIuY2l0X2l2LCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY29tcF9jb21wcmVzcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ09NUFJFU1MpOworCXJldHVybiB0Zm0tPmNydF9jb21wcmVzcy5jb3RfY29tcHJlc3ModGZtLCBzcmMsIHNsZW4sIGRzdCwgZGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jb21wX2RlY29tcHJlc3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbikKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DT01QUkVTUyk7CisJcmV0dXJuIHRmbS0+Y3J0X2NvbXByZXNzLmNvdF9kZWNvbXByZXNzKHRmbSwgc3JjLCBzbGVuLCBkc3QsIGRsZW4pOworfQorCisvKgorICogSE1BQyBzdXBwb3J0LgorICovCisjaWZkZWYgQ09ORklHX0NSWVBUT19ITUFDCit2b2lkIGNyeXB0b19obWFjX2luaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmtleSwgdW5zaWduZWQgaW50ICprZXlsZW4pOwordm9pZCBjcnlwdG9faG1hY191cGRhdGUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGludCBuc2cpOwordm9pZCBjcnlwdG9faG1hY19maW5hbChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmtleWxlbiwgdTggKm91dCk7Cit2b2lkIGNyeXB0b19obWFjKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICprZXksIHVuc2lnbmVkIGludCAqa2V5bGVuLAorICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgbnNnLCB1OCAqb3V0KTsKKyNlbmRpZgkvKiBDT05GSUdfQ1JZUFRPX0hNQUMgKi8KKworI2VuZGlmCS8qIF9MSU5VWF9DUllQVE9fSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3NjYXR0ZXJ3YWxrLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3NjYXR0ZXJ3YWxrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmNDAxZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvc2NhdHRlcndhbGsuYwpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIENyeXB0b2dyYXBoaWMgQVBJLgorICoKKyAqIENpcGhlciBvcGVyYXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KKyAqICAgICAgICAgICAgICAgMjAwMiBBZGFtIEouIFJpY2h0ZXIgPGFkYW1AeWdnZHJhc2lsLmNvbT4KKyAqICAgICAgICAgICAgICAgMjAwNCBKZWFuLUx1YyBDb29rZSA8amxjb29rZUBjZXJ0YWlua2V5LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworI2luY2x1ZGUgImttYXBfdHlwZXMuaCIKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInNjYXR0ZXJ3YWxrLmgiCisKK2VudW0ga21fdHlwZSBjcnlwdG9fa21fdHlwZXNbXSA9IHsKKwlLTV9VU0VSMCwKKwlLTV9VU0VSMSwKKwlLTV9TT0ZUSVJRMCwKKwlLTV9TT0ZUSVJRMSwKK307CisKK3ZvaWQgKnNjYXR0ZXJ3YWxrX3doaWNoYnVmKHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssIHVuc2lnbmVkIGludCBuYnl0ZXMsIHZvaWQgKnNjcmF0Y2gpCit7CisJaWYgKG5ieXRlcyA8PSB3YWxrLT5sZW5fdGhpc19wYWdlICYmCisJICAgICgoKHVuc2lnbmVkIGxvbmcpd2Fsay0+ZGF0YSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpICsgbmJ5dGVzIDw9CisJICAgIFBBR0VfQ0FDSEVfU0laRSkKKwkJcmV0dXJuIHdhbGstPmRhdGE7CisJZWxzZQorCQlyZXR1cm4gc2NyYXRjaDsKK30KKworc3RhdGljIHZvaWQgbWVtY3B5X2Rpcih2b2lkICpidWYsIHZvaWQgKnNnZGF0YSwgc2l6ZV90IG5ieXRlcywgaW50IG91dCkKK3sKKwlpZiAob3V0KQorCQltZW1jcHkoc2dkYXRhLCBidWYsIG5ieXRlcyk7CisJZWxzZQorCQltZW1jcHkoYnVmLCBzZ2RhdGEsIG5ieXRlcyk7Cit9CisKK3ZvaWQgc2NhdHRlcndhbGtfc3RhcnQoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2Fsaywgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZykKK3sKKwl1bnNpZ25lZCBpbnQgcmVzdF9vZl9wYWdlOworCisJd2Fsay0+c2cgPSBzZzsKKworCXdhbGstPnBhZ2UgPSBzZy0+cGFnZTsKKwl3YWxrLT5sZW5fdGhpc19zZWdtZW50ID0gc2ctPmxlbmd0aDsKKworCXJlc3Rfb2ZfcGFnZSA9IFBBR0VfQ0FDSEVfU0laRSAtIChzZy0+b2Zmc2V0ICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKTsKKwl3YWxrLT5sZW5fdGhpc19wYWdlID0gbWluKHNnLT5sZW5ndGgsIHJlc3Rfb2ZfcGFnZSk7CisJd2Fsay0+b2Zmc2V0ID0gc2ctPm9mZnNldDsKK30KKwordm9pZCBzY2F0dGVyd2Fsa19tYXAoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2FsaywgaW50IG91dCkKK3sKKwl3YWxrLT5kYXRhID0gY3J5cHRvX2ttYXAod2Fsay0+cGFnZSwgb3V0KSArIHdhbGstPm9mZnNldDsKK30KKworc3RhdGljIHZvaWQgc2NhdHRlcndhbGtfcGFnZWRvbmUoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2FsaywgaW50IG91dCwKKwkJCQkgdW5zaWduZWQgaW50IG1vcmUpCit7CisJLyogd2Fsay0+ZGF0YSBtYXkgYmUgcG9pbnRpbmcgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG5leHQgcGFnZTsKKwkgICBob3dldmVyLCB3ZSBrbm93IHdlIHRyYW5zZmVyZWQgYXQgbGVhc3Qgb25lIGJ5dGUuICBTbywKKwkgICB3YWxrLT5kYXRhIC0gMSB3aWxsIGJlIGEgdmlydHVhbCBhZGRyZXNzIGluIHRoZSBtYXBwZWQgcGFnZS4gKi8KKworCWlmIChvdXQpCisJCWZsdXNoX2RjYWNoZV9wYWdlKHdhbGstPnBhZ2UpOworCisJaWYgKG1vcmUpIHsKKwkJd2Fsay0+bGVuX3RoaXNfc2VnbWVudCAtPSB3YWxrLT5sZW5fdGhpc19wYWdlOworCisJCWlmICh3YWxrLT5sZW5fdGhpc19zZWdtZW50KSB7CisJCQl3YWxrLT5wYWdlKys7CisJCQl3YWxrLT5sZW5fdGhpc19wYWdlID0gbWluKHdhbGstPmxlbl90aGlzX3NlZ21lbnQsCisJCQkJCQkgICh1bnNpZ25lZClQQUdFX0NBQ0hFX1NJWkUpOworCQkJd2Fsay0+b2Zmc2V0ID0gMDsKKwkJfQorCQllbHNlCisJCQlzY2F0dGVyd2Fsa19zdGFydCh3YWxrLCBzZ19uZXh0KHdhbGstPnNnKSk7CisJfQorfQorCit2b2lkIHNjYXR0ZXJ3YWxrX2RvbmUoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2FsaywgaW50IG91dCwgaW50IG1vcmUpCit7CisJY3J5cHRvX2t1bm1hcCh3YWxrLT5kYXRhLCBvdXQpOworCWlmICh3YWxrLT5sZW5fdGhpc19wYWdlID09IDAgfHwgIW1vcmUpCisJCXNjYXR0ZXJ3YWxrX3BhZ2Vkb25lKHdhbGssIG91dCwgbW9yZSk7Cit9CisKKy8qCisgKiBEbyBub3QgY2FsbCB0aGlzIHVubGVzcyB0aGUgdG90YWwgbGVuZ3RoIG9mIGFsbCBvZiB0aGUgZnJhZ21lbnRzCisgKiBoYXMgYmVlbiB2ZXJpZmllZCBhcyBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZS4KKyAqLworaW50IHNjYXR0ZXJ3YWxrX2NvcHljaHVua3Modm9pZCAqYnVmLCBzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLAorCQkJICAgc2l6ZV90IG5ieXRlcywgaW50IG91dCkKK3sKKwlpZiAoYnVmICE9IHdhbGstPmRhdGEpIHsKKwkJd2hpbGUgKG5ieXRlcyA+IHdhbGstPmxlbl90aGlzX3BhZ2UpIHsKKwkJCW1lbWNweV9kaXIoYnVmLCB3YWxrLT5kYXRhLCB3YWxrLT5sZW5fdGhpc19wYWdlLCBvdXQpOworCQkJYnVmICs9IHdhbGstPmxlbl90aGlzX3BhZ2U7CisJCQluYnl0ZXMgLT0gd2Fsay0+bGVuX3RoaXNfcGFnZTsKKworCQkJY3J5cHRvX2t1bm1hcCh3YWxrLT5kYXRhLCBvdXQpOworCQkJc2NhdHRlcndhbGtfcGFnZWRvbmUod2Fsaywgb3V0LCAxKTsKKwkJCXNjYXR0ZXJ3YWxrX21hcCh3YWxrLCBvdXQpOworCQl9CisKKwkJbWVtY3B5X2RpcihidWYsIHdhbGstPmRhdGEsIG5ieXRlcywgb3V0KTsKKwl9CisKKwl3YWxrLT5vZmZzZXQgKz0gbmJ5dGVzOworCXdhbGstPmxlbl90aGlzX3BhZ2UgLT0gbmJ5dGVzOworCXdhbGstPmxlbl90aGlzX3NlZ21lbnQgLT0gbmJ5dGVzOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9zY2F0dGVyd2Fsay5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9zY2F0dGVyd2Fsay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNjQ0NjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3NjYXR0ZXJ3YWxrLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENyeXB0b2dyYXBoaWMgQVBJLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KKyAqIENvcHlyaWdodCAoYykgMjAwMiBBZGFtIEouIFJpY2h0ZXIgPGFkYW1AeWdnZHJhc2lsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwNCBKZWFuLUx1YyBDb29rZSA8amxjb29rZUBjZXJ0YWlua2V5LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaWZuZGVmIF9DUllQVE9fU0NBVFRFUldBTEtfSAorI2RlZmluZSBfQ1JZUFRPX1NDQVRURVJXQUxLX0gKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorCitzdHJ1Y3Qgc2NhdHRlcl93YWxrIHsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKnNnOworCXN0cnVjdCBwYWdlCQkqcGFnZTsKKwl2b2lkCQkJKmRhdGE7CisJdW5zaWduZWQgaW50CQlsZW5fdGhpc19wYWdlOworCXVuc2lnbmVkIGludAkJbGVuX3RoaXNfc2VnbWVudDsKKwl1bnNpZ25lZCBpbnQJCW9mZnNldDsKK307CisKKy8qIERlZmluZSBzZ19uZXh0IGlzIGFuIGlubGluZSByb3V0aW5lIG5vdyBpbiBjYXNlIHdlIHdhbnQgdG8gY2hhbmdlCisgICBzY2F0dGVybGlzdCB0byBhIGxpbmtlZCBsaXN0IGxhdGVyLiAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX25leHQoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZykKK3sKKwlyZXR1cm4gc2cgKyAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBzY2F0dGVyd2Fsa19zYW1lYnVmKHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGtfaW4sCisJCQkJICAgICAgc3RydWN0IHNjYXR0ZXJfd2FsayAqd2Fsa19vdXQsCisJCQkJICAgICAgdm9pZCAqc3JjX3AsIHZvaWQgKmRzdF9wKQoreworCXJldHVybiB3YWxrX2luLT5wYWdlID09IHdhbGtfb3V0LT5wYWdlICYmCisJICAgICAgIHdhbGtfaW4tPm9mZnNldCA9PSB3YWxrX291dC0+b2Zmc2V0ICYmCisJICAgICAgIHdhbGtfaW4tPmRhdGEgPT0gc3JjX3AgJiYgd2Fsa19vdXQtPmRhdGEgPT0gZHN0X3A7Cit9CisKK3ZvaWQgKnNjYXR0ZXJ3YWxrX3doaWNoYnVmKHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssIHVuc2lnbmVkIGludCBuYnl0ZXMsIHZvaWQgKnNjcmF0Y2gpOwordm9pZCBzY2F0dGVyd2Fsa19zdGFydChzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnKTsKK2ludCBzY2F0dGVyd2Fsa19jb3B5Y2h1bmtzKHZvaWQgKmJ1Ziwgc3RydWN0IHNjYXR0ZXJfd2FsayAqd2Fsaywgc2l6ZV90IG5ieXRlcywgaW50IG91dCk7Cit2b2lkIHNjYXR0ZXJ3YWxrX21hcChzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLCBpbnQgb3V0KTsKK3ZvaWQgc2NhdHRlcndhbGtfZG9uZShzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLCBpbnQgb3V0LCBpbnQgbW9yZSk7CisKKyNlbmRpZiAgLyogX0NSWVBUT19TQ0FUVEVSV0FMS19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExX2NyeXB0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExX2NyeXB0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU4YTNiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTFfY3J5cHQuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogT3JpZ2luYWwgY29kZSBiYXNlZCBvbiBIb3N0IEFQIChzb2Z0d2FyZSB3aXJlbGVzcyBMQU4gYWNjZXNzIHBvaW50KSBkcml2ZXIKKyAqIGZvciBJbnRlcnNpbCBQcmlzbTIvMi41LzMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgKiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBBZGFwdGlvbiB0byBhIGdlbmVyaWMgSUVFRSA4MDIuMTEgc3RhY2sgYnkgSmFtZXMgS2V0cmVub3MKKyAqIDxqa2V0cmVub0BsaW51eC5pbnRlbC5jb20+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgdG8gdGhlIGllZWU4MDIxMSBjcnlwdG8gbW9kdWxlLgorICovCisjaWZuZGVmIElFRUU4MDIxMV9DUllQVF9ICisjZGVmaW5lIElFRUU4MDIxMV9DUllQVF9ICisKKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzIHsKKwljb25zdCBjaGFyICpuYW1lOworCisJLyogaW5pdCBuZXcgY3J5cHRvIGNvbnRleHQgKGUuZy4sIGFsbG9jYXRlIHByaXZhdGUgZGF0YSBzcGFjZSwKKwkgKiBzZWxlY3QgSVYsIGV0Yy4pOyByZXR1cm5zIE5VTEwgb24gZmFpbHVyZSBvciBwb2ludGVyIHRvIGFsbG9jYXRlZAorCSAqIHByaXZhdGUgZGF0YSBvbiBzdWNjZXNzICovCisJdm9pZCAqICgqaW5pdCkoaW50IGtleWlkeCk7CisKKwkvKiBkZWluaXRpYWxpemUgY3J5cHRvIGNvbnRleHQgYW5kIGZyZWUgYWxsb2NhdGVkIHByaXZhdGUgZGF0YSAqLworCXZvaWQgKCpkZWluaXQpKHZvaWQgKnByaXYpOworCisJLyogZW5jcnlwdC9kZWNyeXB0IHJldHVybiA8IDAgb24gZXJyb3Igb3IgPj0gMCBvbiBzdWNjZXNzLiBUaGUgcmV0dXJuCisJICogdmFsdWUgZnJvbSBkZWNyeXB0X21wZHUgaXMgcGFzc2VkIGFzIHRoZSBrZXlpZHggdmFsdWUgZm9yCisJICogZGVjcnlwdF9tc2R1LiBza2IgbXVzdCBoYXZlIGVub3VnaCBoZWFkIGFuZCB0YWlsIHJvb20gZm9yIHRoZQorCSAqIGVuY3J5cHRpb247IGlmIG5vdCwgZXJyb3Igd2lsbCBiZSByZXR1cm5lZDsgdGhlc2UgZnVuY3Rpb25zIGFyZQorCSAqIGNhbGxlZCBmb3IgYWxsIE1QRFVzIChpLmUuLCBmcmFnbWVudHMpLgorCSAqLworCWludCAoKmVuY3J5cHRfbXBkdSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpOworCWludCAoKmRlY3J5cHRfbXBkdSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpOworCisJLyogVGhlc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgZm9yIGZ1bGwgTVNEVXMsIGkuZS4gZnVsbCBmcmFtZXMuCisJICogVGhlc2UgY2FuIGJlIE5VTEwgaWYgZnVsbCBNU0RVIG9wZXJhdGlvbnMgYXJlIG5vdCBuZWVkZWQuICovCisJaW50ICgqZW5jcnlwdF9tc2R1KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdik7CisJaW50ICgqZGVjcnlwdF9tc2R1KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQga2V5aWR4LCBpbnQgaGRyX2xlbiwKKwkJCSAgICB2b2lkICpwcml2KTsKKworCWludCAoKnNldF9rZXkpKHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdik7CisJaW50ICgqZ2V0X2tleSkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KTsKKworCS8qIHByb2NmcyBoYW5kbGVyIGZvciBwcmludGluZyBvdXQga2V5IGluZm9ybWF0aW9uIGFuZCBwb3NzaWJsZQorCSAqIHN0YXRpc3RpY3MgKi8KKwljaGFyICogKCpwcmludF9zdGF0cykoY2hhciAqcCwgdm9pZCAqcHJpdik7CisKKwkvKiBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBhZGRlZCBieSBlbmNyeXB0aW9uOyBlbmNyeXB0IGJ1ZiBpcworCSAqIGFsbG9jYXRlZCB3aXRoIGV4dHJhX3ByZWZpeF9sZW4gYnl0ZXMsIGNvcHkgb2YgaW5fYnVmLCBhbmQKKwkgKiBleHRyYV9wb3N0Zml4X2xlbjsgZW5jcnlwdCBuZWVkIG5vdCB1c2UgYWxsIHRoaXMgc3BhY2UsIGJ1dAorCSAqIHRoZSByZXN1bHQgbXVzdCBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgYW5kIGNvcnJlY3QKKwkgKiBsZW5ndGggbXVzdCBiZSByZXR1cm5lZCAqLworCWludCBleHRyYV9wcmVmaXhfbGVuLCBleHRyYV9wb3N0Zml4X2xlbjsKKworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworfTsKKworc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7IC8qIGRlbGF5ZWQgZGVsZXRpb24gbGlzdCAqLworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzOworCXZvaWQgKnByaXY7CisJYXRvbWljX3QgcmVmY250OworfTsKKworaW50IGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzKTsKK2ludCBpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzKTsKK3N0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqIGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICosIGludCk7Cit2b2lkIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfaGFuZGxlcih1bnNpZ25lZCBsb25nKTsKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTgwXzkzY3g2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxODBfOTNjeDYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODc4Y2ZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTgwXzkzY3g2LmMKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgICBUaGlzIGZpbGVzIGNvbnRhaW5zIGNhcmQgZWVwcm9tICg5M2M0NiBvciA5M2M1NikgcHJvZ3JhbW1pbmcgcm91dGluZXMsCisgICBtZW1vcnkgaXMgYWRkcmVzc2VkIGJ5IDE2IGJpdHMgd29yZHMuCisKKyAgIFRoaXMgaXMgcGFydCBvZiBydGw4MTgwIE9wZW5Tb3VyY2UgZHJpdmVyLgorICAgQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0ICA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisgICBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZQorICAgb2ZmaWNpYWwgcmVhbHRlayBkcml2ZXIuCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24KKyAgIGZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbi4KKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyLgorCisgICBXZSB3YW50IHRvIHRhbmtzIHRoZSBBdXRob3JzIG9mIHRob3NlIHByb2plY3RzIGFuZCB0aGUgTmRpc3dyYXBwZXIKKyAgIHByb2plY3QgQXV0aG9ycy4KKyovCisKKyNpbmNsdWRlICJyODE4MF85M2N4Ni5oIgorCit2b2lkIGVwcm9tX2NzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGJpdCkKK3sKKwlpZihiaXQpCisJCXdyaXRlX25pY19ieXRlX0UoZGV2LCBFUFJPTV9DTUQsCisJCQkgICAgICAgKDE8PEVQUk9NX0NTX1NISUZUKSB8IFwKKwkJCSAgICAgICByZWFkX25pY19ieXRlX0UoZGV2LCBFUFJPTV9DTUQpKTsgLy9lbmFibGUgRVBST00KKwllbHNlCisJCXdyaXRlX25pY19ieXRlX0UoZGV2LCBFUFJPTV9DTUQsIHJlYWRfbmljX2J5dGVfRShkZXYsIEVQUk9NX0NNRClcCisJCQkgICAgICAgJn4oMTw8RVBST01fQ1NfU0hJRlQpKTsgLy9kaXNhYmxlIEVQUk9NCisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheShFUFJPTV9ERUxBWSk7Cit9CisKKwordm9pZCBlcHJvbV9ja19jeWNsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdyaXRlX25pY19ieXRlX0UoZGV2LCBFUFJPTV9DTUQsCisJCSAgICAgICAoMTw8RVBST01fQ0tfU0hJRlQpIHwgcmVhZF9uaWNfYnl0ZV9FKGRldixFUFJPTV9DTUQpKTsKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheShFUFJPTV9ERUxBWSk7CisJd3JpdGVfbmljX2J5dGVfRShkZXYsIEVQUk9NX0NNRCwKKwkJICAgICAgIHJlYWRfbmljX2J5dGVfRShkZXYsIEVQUk9NX0NNRCkgJn4gKDE8PEVQUk9NX0NLX1NISUZUKSk7CisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoRVBST01fREVMQVkpOworfQorCisKK3ZvaWQgZXByb21fdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGJpdCkKK3sKKwlpZihiaXQpCisJCXdyaXRlX25pY19ieXRlX0UoZGV2LCBFUFJPTV9DTUQsICgxPDxFUFJPTV9XX1NISUZUKSB8IFwKKwkJCSAgICAgICByZWFkX25pY19ieXRlX0UoZGV2LEVQUk9NX0NNRCkpOworCWVsc2UKKwkJd3JpdGVfbmljX2J5dGVfRShkZXYsIEVQUk9NX0NNRCwgcmVhZF9uaWNfYnl0ZV9FKGRldixFUFJPTV9DTUQpXAorCQkJICAgICAgICZ+KDE8PEVQUk9NX1dfU0hJRlQpKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KEVQUk9NX0RFTEFZKTsKK30KKworCitzaG9ydCBlcHJvbV9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc2hvcnQgYml0OworCisJYml0PShyZWFkX25pY19ieXRlX0UoZGV2LCBFUFJPTV9DTUQpICYgKDE8PEVQUk9NX1JfU0hJRlQpICk7CisJdWRlbGF5KEVQUk9NX0RFTEFZKTsKKworCWlmKGJpdCkgcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBlcHJvbV9zZW5kX2JpdHNfc3RyaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGJbXSwgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCWZvcihpPTA7IGk8bGVuOyBpKyspeworCQllcHJvbV93KGRldiwgYltpXSk7CisJCWVwcm9tX2NrX2N5Y2xlKGRldik7CisJfQorfQorCisKK3UzMiBlcHJvbV9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBhZGRyKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzaG9ydCByZWFkX2NtZFtdPXsxLDEsMH07CisJc2hvcnQgYWRkcl9zdHJbOF07CisJaW50IGk7CisJaW50IGFkZHJfbGVuOworCXUzMiByZXQ7CisKKwlyZXQ9MDsKKyAgICAgICAgLy9lbmFibGUgRVBST00gcHJvZ3JhbW1pbmcKKwl3cml0ZV9uaWNfYnl0ZV9FKGRldiwgRVBST01fQ01ELAorCQkgICAgICAgKEVQUk9NX0NNRF9QUk9HUkFNPDxFUFJPTV9DTURfT1BFUkFUSU5HX01PREVfU0hJRlQpKTsKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheShFUFJPTV9ERUxBWSk7CisKKwlpZiAocHJpdi0+ZXByb210eXBlPT1FUFJPTV85M2M1Nil7CisJCWFkZHJfc3RyWzddPWFkZHIgJiAxOworCQlhZGRyX3N0cls2XT1hZGRyICYgKDE8PDEpOworCQlhZGRyX3N0cls1XT1hZGRyICYgKDE8PDIpOworCQlhZGRyX3N0cls0XT1hZGRyICYgKDE8PDMpOworCQlhZGRyX3N0clszXT1hZGRyICYgKDE8PDQpOworCQlhZGRyX3N0clsyXT1hZGRyICYgKDE8PDUpOworCQlhZGRyX3N0clsxXT1hZGRyICYgKDE8PDYpOworCQlhZGRyX3N0clswXT1hZGRyICYgKDE8PDcpOworCQlhZGRyX2xlbj04OworCX1lbHNleworCQlhZGRyX3N0cls1XT1hZGRyICYgMTsKKwkJYWRkcl9zdHJbNF09YWRkciAmICgxPDwxKTsKKwkJYWRkcl9zdHJbM109YWRkciAmICgxPDwyKTsKKwkJYWRkcl9zdHJbMl09YWRkciAmICgxPDwzKTsKKwkJYWRkcl9zdHJbMV09YWRkciAmICgxPDw0KTsKKwkJYWRkcl9zdHJbMF09YWRkciAmICgxPDw1KTsKKwkJYWRkcl9sZW49NjsKKwl9CisJZXByb21fY3MoZGV2LCAxKTsKKwllcHJvbV9ja19jeWNsZShkZXYpOworCWVwcm9tX3NlbmRfYml0c19zdHJpbmcoZGV2LCByZWFkX2NtZCwgMyk7CisJZXByb21fc2VuZF9iaXRzX3N0cmluZyhkZXYsIGFkZHJfc3RyLCBhZGRyX2xlbik7CisKKwkvL2tlZXAgY2hpcCBwaW4gRCB0byBsb3cgc3RhdGUgd2hpbGUgcmVhZGluZy4KKwkvL0knbSB1bnN1cmUgaWYgaXQgaXMgbmVjZXNzYXJ5LCBidXQgYW55d2F5IHNob3VsZG4ndCBodXJ0CisJZXByb21fdyhkZXYsIDApOworCisJZm9yKGk9MDtpPDE2O2krKyl7CisJCS8vZWVwcm9tIG5lZWRzIGEgY2xrIGN5Y2xlIGJldHdlZW4gd3JpdGluZyBvcGNvZGUmYWRyCisJCS8vYW5kIHJlYWRpbmcgZGF0YS4gKGVlcHJvbSBvdXRzIGEgZHVtbXkgMCkKKwkJZXByb21fY2tfY3ljbGUoZGV2KTsKKwkJcmV0IHw9IChlcHJvbV9yKGRldik8PCgxNS1pKSk7CisJfQorCisJZXByb21fY3MoZGV2LCAwKTsKKwllcHJvbV9ja19jeWNsZShkZXYpOworCisJLy9kaXNhYmxlIEVQUk9NIHByb2dyYW1taW5nCisJd3JpdGVfbmljX2J5dGVfRShkZXYsIEVQUk9NX0NNRCwKKwkJICAgICAgIChFUFJPTV9DTURfTk9STUFMPDxFUFJPTV9DTURfT1BFUkFUSU5HX01PREVfU0hJRlQpKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTgwXzkzY3g2LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxODBfOTNjeDYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjNhYzk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTgwXzkzY3g2LmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKwlUaGlzIGlzIHBhcnQgb2YgcnRsODE4NyBPcGVuU291cmNlIGRyaXZlcgorCUNvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNC0yMDA1ICA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisJUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKworCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlIG9mZmljaWFsIHJlYWx0ZWsgZHJpdmVyCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBydGw4MTgwIGRyaXZlciBza2VsZXRvbiBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24KKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIKKworCVdlIHdhbnQgdG8gdGFua3MgdGhlIEF1dGhvcnMgb2Ygc3VjaCBwcm9qZWN0cyBhbmQgdGhlIE5kaXN3cmFwcGVyIHByb2plY3QgQXV0aG9ycy4KKyovCisKKy8qVGhpcyBmaWxlcyBjb250YWlucyBjYXJkIGVlcHJvbSAoOTNjNDYgb3IgOTNjNTYpIHByb2dyYW1taW5nIHJvdXRpbmVzKi8KKy8qbWVtb3J5IGlzIGFkZHJlc3NlZCBieSBXT1JEUyovCisKKyNpbmNsdWRlICJyODE5MlUuaCIKKyNpbmNsdWRlICJyODE5MlVfaHcuaCIKKworI2RlZmluZSBFUFJPTV9ERUxBWSAxMAorCisjZGVmaW5lIEVQUk9NX0FOQVBBUkFNX0FERFJMV09SRCAweGQKKyNkZWZpbmUgRVBST01fQU5BUEFSQU1fQUREUkhXT1JEIDB4ZQorCisjZGVmaW5lIEVQUk9NX1JGQ0hJUElEIDB4NgorI2RlZmluZSBFUFJPTV9UWFBXX0JBU0UgMHgwNQorI2RlZmluZSBFUFJPTV9SRkNISVBJRF9SVEw4MjI1VSA1CisjZGVmaW5lIEVQUk9NX1JGX1BBUkFNIDB4NAorI2RlZmluZSBFUFJPTV9DT05GSUcyIDB4YworCisjZGVmaW5lIEVQUk9NX1ZFUlNJT04gMHgxRQorI2RlZmluZSBNQUNfQURSIDB4NworCisjZGVmaW5lIENJUyAweDE4CisKKyNkZWZpbmUgRVBST01fVFhQVzAgMHgxNgorI2RlZmluZSBFUFJPTV9UWFBXMiAweDFiCisjZGVmaW5lIEVQUk9NX1RYUFcxIDB4M2QKKworCit1MzIgZXByb21fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHUzMiBhZGRyKTsgLy9yZWFkcyBhIDE2IGJpdHMgd29yZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTgwX3BtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxODBfcG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzU4ZDBlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTgwX3BtLmMKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAgIFBvd2VyIG1hbmFnZW1lbnQgaW50ZXJmYWNlIHJvdXRpbmVzLgorICAgV3JpdHRlbiBieSBNYXJpdXN6IE1hdHVzemVrLgorICAgVGhpcyBjb2RlIGlzIGN1cnJlbnRseSBqdXN0IGEgcGxhY2Vob2xkZXIgZm9yIGxhdGVyIHdvcmsgYW5kCisgICBkb2VzIG5vdCBkbyBhbnl0aGluZyB1c2VmdWwuCisKKyAgIFRoaXMgaXMgcGFydCBvZiBydGw4MTgwIE9wZW5Tb3VyY2UgZHJpdmVyLgorICAgQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0ICA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisgICBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQorKi8KKworI2lmZGVmIENPTkZJR19SVEw4MTgwX1BNCisKKworI2luY2x1ZGUgInI4MTgwX2h3LmgiCisjaW5jbHVkZSAicjgxODBfcG0uaCIKKworaW50IHJ0bDgxODBfc2F2ZV9zdGF0ZSAoc3RydWN0IHBjaV9kZXYgKmRldiwgdTMyIHN0YXRlKQoreworCXByaW50ayhLRVJOX05PVElDRSAicjgxODAgc2F2ZSBzdGF0ZSBjYWxsIChzdGF0ZSAldSkuXG4iLCBzdGF0ZSk7CisJcmV0dXJuKC1FQUdBSU4pOworfQorCisKK2ludCBydGw4MTgwX3N1c3BlbmQgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHUzMiBzdGF0ZSkKK3sKKwlwcmludGsoS0VSTl9OT1RJQ0UgInI4MTgwIHN1c3BlbmQgY2FsbCAoc3RhdGUgJXUpLlxuIiwgc3RhdGUpOworCXJldHVybigtRUFHQUlOKTsKK30KKworCitpbnQgcnRsODE4MF9yZXN1bWUgKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJcHJpbnRrKEtFUk5fTk9USUNFICJyODE4MCByZXN1bWUgY2FsbC5cbiIpOworCXJldHVybigtRUFHQUlOKTsKK30KKworCitpbnQgcnRsODE4MF9lbmFibGVfd2FrZSAoc3RydWN0IHBjaV9kZXYgKmRldiwgdTMyIHN0YXRlLCBpbnQgZW5hYmxlKQoreworCXByaW50ayhLRVJOX05PVElDRSAicjgxODAgZW5hYmxlIHdha2UgY2FsbCAoc3RhdGUgJXUsIGVuYWJsZSAlZCkuXG4iLAorCSAgICAgICBzdGF0ZSwgZW5hYmxlKTsKKwlyZXR1cm4oLUVBR0FJTik7Cit9CisKKworCisjZW5kaWYgLy9DT05GSUdfUlRMODE4MF9QTQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTgwX3BtLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxODBfcG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2QxOGE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTgwX3BtLmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAgICAgICAgUG93ZXIgbWFuYWdlbWVudCBpbnRlcmZhY2Ugcm91dGluZXMuCisJV3JpdHRlbiBieSBNYXJpdXN6IE1hdHVzemVrLgorCVRoaXMgY29kZSBpcyBjdXJyZW50bHkganVzdCBhIHBsYWNlaG9sZGVyIGZvciBsYXRlciB3b3JrIGFuZAorCWRvZXMgbm90IGRvIGFueXRoaW5nIHVzZWZ1bC4KKworCVRoaXMgaXMgcGFydCBvZiBydGw4MTgwIE9wZW5Tb3VyY2UgZHJpdmVyLgorCUNvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNCAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorCVJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKyovCisKKyNpZmRlZiBDT05GSUdfUlRMODE4MF9QTQorCisjaWZuZGVmIFI4MTgwX1BNX0gKKyNkZWZpbmUgUjgxODBfUE1fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworaW50IHJ0bDgxODBfc2F2ZV9zdGF0ZSAoc3RydWN0IHBjaV9kZXYgKmRldiwgdTMyIHN0YXRlKTsKK2ludCBydGw4MTgwX3N1c3BlbmQgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHUzMiBzdGF0ZSk7CitpbnQgcnRsODE4MF9yZXN1bWUgKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworaW50IHJ0bDgxODBfZW5hYmxlX3dha2UgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHUzMiBzdGF0ZSwgaW50IGVuYWJsZSk7CisKKyNlbmRpZiAvL1I4MTgwX1BNX0gKKworI2VuZGlmIC8vIENPTkZJR19SVEw4MTgwX1BNCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTBfcnRsODI1Ni5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkwX3J0bDgyNTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGZmMzM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkwX3J0bDgyNTYuYwpAQCAtMCwwICsxLDMxMiBAQAorLyoKKyAgVGhpcyBpcyBwYXJ0IG9mIHRoZSBydGw4MTkyIGRyaXZlcgorICByZWxlYXNlZCB1bmRlciB0aGUgR1BMIChTZWUgZmlsZSBDT1BZSU5HIGZvciBkZXRhaWxzKS4KKworICBUaGlzIGZpbGVzIGNvbnRhaW5zIHByb2dyYW1taW5nIGNvZGUgZm9yIHRoZSBydGw4MjU2CisgIHJhZGlvIGZyb250ZW5kLgorCisgICpNYW55KiB0aGFua3MgdG8gUmVhbHRlayBDb3JwLiBmb3IgdGhlaXIgZ3JlYXQgc3VwcG9ydCEKKworKi8KKworI2luY2x1ZGUgInI4MTkyVS5oIgorI2luY2x1ZGUgInI4MTkyVV9ody5oIgorI2luY2x1ZGUgInI4MTl4VV9waHlyZWcuaCIKKyNpbmNsdWRlICJyODE5eFVfcGh5LmgiCisjaW5jbHVkZSAicjgxOTBfcnRsODI1Ni5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBPdmVydmlldzogICAJc2V0IFJGIGJhbmQgd2lkdGggKDIwTSBvciA0ME0pCisgKiBJbnB1dDogICAgICAgc3RydWN0IG5ldF9kZXZpY2UqCWRldgorICogCQlXSVJFTEVTU19CQU5EV0lEVEhfRQlCYW5kd2lkdGgJLy8yME0gb3IgNDBNCisgKiBPdXRwdXQ6ICAgICAgTk9ORQorICogUmV0dXJuOiAgICAgIE5PTkUKKyAqIE5vdGU6CTgyMjYgc3VwcG9ydCBib3RoIDIwTSAgYW5kIDQwIE1IegorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBQSFlfU2V0UkY4MjU2QmFuZHdpZHRoKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYgLCBIVF9DSEFOTkVMX1dJRFRIIEJhbmR3aWR0aCkJLy8yME0gb3IgNDBNCit7CisJdTgJZVJGUGF0aDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwkvL2ZvcihlUkZQYXRoID0gUkY5MF9QQVRIX0E7IGVSRlBhdGggPHBIYWxEYXRhLT5OdW1Ub3RhbFJGUGF0aDsgZVJGUGF0aCsrKQorCWZvcihlUkZQYXRoID0gMDsgZVJGUGF0aCA8UkY5MF9QQVRIX01BWDsgZVJGUGF0aCsrKQorCXsKKwkJaWYgKCFydGw4MTkyX3BoeV9DaGVja0lzTGVnYWxSRlBhdGgoZGV2LCBlUkZQYXRoKSkKKwkJCQljb250aW51ZTsKKworCQlzd2l0Y2goQmFuZHdpZHRoKQorCQl7CisJCQljYXNlIEhUX0NIQU5ORUxfV0lEVEhfMjA6CisJCQkJaWYocHJpdi0+Y2FyZF84MTkyX3ZlcnNpb24gPT0gVkVSU0lPTl84MTl4VV9BIHx8IHByaXYtPmNhcmRfODE5Ml92ZXJzaW9uID09IFZFUlNJT05fODE5eFVfQikvLyA4MjU2IEQtY3V0LCBFLWN1dCwgeGlvbmc6IGNvbnNpZGVyIGl0IGxhdGVyIQorCQkJCXsKKwkJCQkJcnRsODE5Ml9waHlfU2V0UkZSZWcoZGV2LCAoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCwgMHgwYiwgYk1hc2sxMkJpdHMsIDB4MTAwKTsgLy9waHkgcGFyYToxYmEKKwkJCQkJcnRsODE5Ml9waHlfU2V0UkZSZWcoZGV2LCAoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCwgMHgyYywgYk1hc2sxMkJpdHMsIDB4M2Q3KTsKKwkJCQkJcnRsODE5Ml9waHlfU2V0UkZSZWcoZGV2LCAoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCwgMHgwZSwgYk1hc2sxMkJpdHMsIDB4MDIxKTsKKworCQkJCQkvL2Nvc2EgYWRkIGZvciBzZDMncyByZXF1ZXN0IDAxLzIzLzIwMDgKKwkJCQkJcnRsODE5Ml9waHlfU2V0UkZSZWcoZGV2LCAoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCwgMHgxNCwgYk1hc2sxMkJpdHMsIDB4NWFiKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJQSFlfU2V0UkY4MjU2QmFuZHdpZHRoKCk6IHVua25vd24gaGFyZHdhcmUgdmVyc2lvblxuIik7CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQljYXNlIEhUX0NIQU5ORUxfV0lEVEhfMjBfNDA6CisJCQkJaWYocHJpdi0+Y2FyZF84MTkyX3ZlcnNpb24gPT0gVkVSU0lPTl84MTl4VV9BIHx8cHJpdi0+Y2FyZF84MTkyX3ZlcnNpb24gPT0gVkVSU0lPTl84MTl4VV9CKS8vIDgyNTYgRC1jdXQsIEUtY3V0LCB4aW9uZzogY29uc2lkZXIgaXQgbGF0ZXIhCisJCQkJeworCQkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCAweDBiLCBiTWFzazEyQml0cywgMHgzMDApOyAvL3BoeSBwYXJhOjNiYQorCQkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCAweDJjLCBiTWFzazEyQml0cywgMHgzZGYpOworCQkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCAweDBlLCBiTWFzazEyQml0cywgMHgwYTEpOworCisJCQkJCS8vY29zYSBhZGQgZm9yIHNkMydzIHJlcXVlc3QgMDEvMjMvMjAwOAorCQkJCQlpZihwcml2LT5jaGFuID09IDMgfHwgcHJpdi0+Y2hhbiA9PSA5KSAvL0kgbmVlZCB0byBzZXQgcHJpdi0+Y2hhbiB3aGVuZXZlciBjdXJyZW50IGNoYW5uZWwgY2hhbmdlcworCQkJCQkJcnRsODE5Ml9waHlfU2V0UkZSZWcoZGV2LCAoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCwgMHgxNCwgYk1hc2sxMkJpdHMsIDB4NTliKTsKKwkJCQkJZWxzZQorCQkJCQkJcnRsODE5Ml9waHlfU2V0UkZSZWcoZGV2LCAoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCwgMHgxNCwgYk1hc2sxMkJpdHMsIDB4NWFiKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJQSFlfU2V0UkY4MjU2QmFuZHdpZHRoKCk6IHVua25vd24gaGFyZHdhcmUgdmVyc2lvblxuIik7CisJCQkJfQorCisKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJQSFlfU2V0UkY4MjU2QmFuZHdpZHRoKCk6IHVua25vd24gQmFuZHdpZHRoOiAlI1hcbiIsQmFuZHdpZHRoICk7CisJCQkJYnJlYWs7CisKKwkJfQorCX0KKwlyZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBPdmVydmlldzogICAgSW50ZXJmYWNlIHRvIGNvbmZpZyA4MjU2CisgKiBJbnB1dDogICAgICAgc3RydWN0IG5ldF9kZXZpY2UqCWRldgorICogT3V0cHV0OiAgICAgIE5PTkUKKyAqIFJldHVybjogICAgICBOT05FCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIFBIWV9SRjgyNTZfQ29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8vIEluaXRpYWxpemUgZ2VuZXJhbCBnbG9iYWwgdmFsdWUKKwkvLworCS8vIFRPRE86IEV4dGVuZCBSRl9QQVRIX0MgYW5kIFJGX1BBVEhfRCBpbiB0aGUgZnV0dXJlCisJcHJpdi0+TnVtVG90YWxSRlBhdGggPSBSVEw4MTlYX1RPVEFMX1JGX1BBVEg7CisJLy8gQ29uZmlnIEJCIGFuZCBSRgorCXBoeV9SRjgyNTZfQ29uZmlnX1BhcmFGaWxlKGRldik7CisKKwlyZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBPdmVydmlldzogICAgSW50ZXJmYWNlIHRvIGNvbmZpZyA4MjU2CisgKiBJbnB1dDogICAgICAgc3RydWN0IG5ldF9kZXZpY2UqCWRldgorICogT3V0cHV0OiAgICAgIE5PTkUKKyAqIFJldHVybjogICAgICBOT05FCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHBoeV9SRjgyNTZfQ29uZmlnX1BhcmFGaWxlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJdTMyIAl1NFJlZ1ZhbHVlID0gMDsKKwkvL3N0YXRpYyBzMUJ5dGUJCQkJc3pSYWRpb0FGaWxlW10gPSBSVEw4MTlYX1BIWV9SQURJT19BOworCS8vc3RhdGljIHMxQnl0ZQkJCQlzelJhZGlvQkZpbGVbXSA9IFJUTDgxOVhfUEhZX1JBRElPX0I7CisJLy9zdGF0aWMgczFCeXRlCQkJCXN6UmFkaW9DRmlsZVtdID0gUlRMODE5WF9QSFlfUkFESU9fQzsKKwkvL3N0YXRpYyBzMUJ5dGUJCQkJc3pSYWRpb0RGaWxlW10gPSBSVEw4MTlYX1BIWV9SQURJT19EOworCXU4IAllUkZQYXRoOworCUJCX1JFR0lTVEVSX0RFRklOSVRJT05fVAkqcFBoeVJlZzsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyCVJlZ09mZlNldFRvQmVDaGVjayA9IDB4MzsKKwl1MzIgCVJlZ1ZhbHVlVG9CZUNoZWNrID0gMHg3ZjE7CisJdTMyCVJGM19GaW5hbF9WYWx1ZSA9IDA7CisJdTgJQ29uc3RSZXRyeVRpbWVzID0gNSwgUmV0cnlUaW1lcyA9IDU7CisJdTggcmV0ID0gMDsKKwkvLzMvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8zLy8gPDI+IEluaXRpYWxpemUgUkYKKwkvLzMvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJZm9yKGVSRlBhdGggPSAoUkY5MF9SQURJT19QQVRIX0UpUkY5MF9QQVRIX0E7IGVSRlBhdGggPHByaXYtPk51bVRvdGFsUkZQYXRoOyBlUkZQYXRoKyspCisJeworCQlpZiAoIXJ0bDgxOTJfcGh5X0NoZWNrSXNMZWdhbFJGUGF0aChkZXYsIGVSRlBhdGgpKQorCQkJCWNvbnRpbnVlOworCisJCXBQaHlSZWcgPSAmcHJpdi0+UEhZUmVnRGVmW2VSRlBhdGhdOworCisJCS8vIEpvc2VwaCB0ZXN0IGZvciBzaG9ydGVuIFJGIGNvbmZpZworCS8vCXBIYWxEYXRhLT5SZlJlZzBWYWx1ZVtlUkZQYXRoXSA9ICBydGw4MTkyX3BoeV9RdWVyeVJGUmVnKGRldiwgKFJGOTBfUkFESU9fUEFUSF9FKWVSRlBhdGgsIHJHbG9iYWxDdHJsLCBiTWFza0RXb3JkKTsKKworCQkvKi0tLS1TdG9yZSBvcmlnaW5hbCBSRkVOViBjb250cm9sIHR5cGUtLS0tKi8KKwkJc3dpdGNoKGVSRlBhdGgpCisJCXsKKwkJY2FzZSBSRjkwX1BBVEhfQToKKwkJY2FzZSBSRjkwX1BBVEhfQzoKKwkJCXU0UmVnVmFsdWUgPSBydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCBwUGh5UmVnLT5yZmludGZzLCBiUkZTSV9SRkVOVik7CisJCQlicmVhazsKKwkJY2FzZSBSRjkwX1BBVEhfQiA6CisJCWNhc2UgUkY5MF9QQVRIX0Q6CisJCQl1NFJlZ1ZhbHVlID0gcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwgcFBoeVJlZy0+cmZpbnRmcywgYlJGU0lfUkZFTlY8PDE2KTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyotLS0tU2V0IFJGX0VOViBlbmFibGUtLS0tKi8KKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHBQaHlSZWctPnJmaW50ZmUsIGJSRlNJX1JGRU5WPDwxNiwgMHgxKTsKKworCQkvKi0tLS1TZXQgUkZfRU5WIG91dHB1dCBoaWdoLS0tLSovCisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBwUGh5UmVnLT5yZmludGZvLCBiUkZTSV9SRkVOViwgMHgxKTsKKworCQkvKiBTZXQgYml0IG51bWJlciBvZiBBZGRyZXNzIGFuZCBEYXRhIGZvciBSRiByZWdpc3RlciAqLworCQlydGw4MTkyX3NldEJCcmVnKGRldiwgcFBoeVJlZy0+cmZIU1NJUGFyYTIsIGIzV2lyZUFkZHJlc3NMZW5ndGgsIDB4MCk7IAkvLyBTZXQgMCB0byA0IGJpdHMgZm9yIFotc2VyaWFsIGFuZCBzZXQgMSB0byA2IGJpdHMgZm9yIDgyNTgKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHBQaHlSZWctPnJmSFNTSVBhcmEyLCBiM1dpcmVEYXRhTGVuZ3RoLCAweDApOwkvLyBTZXQgMCB0byAxMiBiaXRzIGZvciBaLXNlcmlhbCBhbmQgODI1OCwgYW5kIHNldCAxIHRvIDE0IGJpdHMgZm9yID8/PworCisJCXJ0bDgxOTJfcGh5X1NldFJGUmVnKGRldiwgKFJGOTBfUkFESU9fUEFUSF9FKSBlUkZQYXRoLCAweDAsIGJNYXNrMTJCaXRzLCAweGJmKTsKKworCQkvKi0tLS1DaGVjayBSRiBibG9jayAoZm9yIEZQR0EgcGxhdGZvcm0gb25seSktLS0tKi8KKwkJLy8gVE9ETzogdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgcmVtb3ZlZCBvbiBBU0lDICwgRW1pbHkgMjAwNy4yLjIKKwkJaWYgKHJ0bDgxOTJfcGh5X2NoZWNrQkJBbmRSRihkZXYsIEhXOTBfQkxPQ0tfUkYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoKSkKKwkJeworCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJQSFlfUkY4MjU2X0NvbmZpZygpOkNoZWNrIFJhZGlvWyVkXSBGYWlsISFcbiIsIGVSRlBhdGgpOworCQkJZ290byBwaHlfUkY4MjU2X0NvbmZpZ19QYXJhRmlsZV9GYWlsOworCQl9CisKKwkJUmV0cnlUaW1lcyA9IENvbnN0UmV0cnlUaW1lczsKKwkJUkYzX0ZpbmFsX1ZhbHVlID0gMDsKKwkJLyotLS0tSW5pdGlhbGl6ZSBSRiBmb20gY29ubmZpZ3VyYXRpb24gZmlsZS0tLS0qLworCQlzd2l0Y2goZVJGUGF0aCkKKwkJeworCQljYXNlIFJGOTBfUEFUSF9BOgorCQkJd2hpbGUoUkYzX0ZpbmFsX1ZhbHVlIT1SZWdWYWx1ZVRvQmVDaGVjayAmJiBSZXRyeVRpbWVzIT0wKQorCQkJeworCQkJCXJldCA9IHJ0bDgxOTJfcGh5X0NvbmZpZ1JGV2l0aEhlYWRlckZpbGUoZGV2LChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoKTsKKwkJCQlSRjNfRmluYWxfVmFsdWUgPSBydGw4MTkyX3BoeV9RdWVyeVJGUmVnKGRldiwgKFJGOTBfUkFESU9fUEFUSF9FKWVSRlBhdGgsIFJlZ09mZlNldFRvQmVDaGVjaywgYk1hc2sxMkJpdHMpOworCQkJCVJUX1RSQUNFKENPTVBfUkYsICJSRiAlZCAlZCByZWdpc3RlciBmaW5hbCB2YWx1ZTogJXhcbiIsIGVSRlBhdGgsIFJlZ09mZlNldFRvQmVDaGVjaywgUkYzX0ZpbmFsX1ZhbHVlKTsKKwkJCQlSZXRyeVRpbWVzLS07CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBSRjkwX1BBVEhfQjoKKwkJCXdoaWxlKFJGM19GaW5hbF9WYWx1ZSE9UmVnVmFsdWVUb0JlQ2hlY2sgJiYgUmV0cnlUaW1lcyE9MCkKKwkJCXsKKwkJCQlyZXQgPSBydGw4MTkyX3BoeV9Db25maWdSRldpdGhIZWFkZXJGaWxlKGRldiwoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCk7CisJCQkJUkYzX0ZpbmFsX1ZhbHVlID0gcnRsODE5Ml9waHlfUXVlcnlSRlJlZyhkZXYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCBSZWdPZmZTZXRUb0JlQ2hlY2ssIGJNYXNrMTJCaXRzKTsKKwkJCQlSVF9UUkFDRShDT01QX1JGLCAiUkYgJWQgJWQgcmVnaXN0ZXIgZmluYWwgdmFsdWU6ICV4XG4iLCBlUkZQYXRoLCBSZWdPZmZTZXRUb0JlQ2hlY2ssIFJGM19GaW5hbF9WYWx1ZSk7CisJCQkJUmV0cnlUaW1lcy0tOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUkY5MF9QQVRIX0M6CisJCQl3aGlsZShSRjNfRmluYWxfVmFsdWUhPVJlZ1ZhbHVlVG9CZUNoZWNrICYmIFJldHJ5VGltZXMhPTApCisJCQl7CisJCQkJcmV0ID0gcnRsODE5Ml9waHlfQ29uZmlnUkZXaXRoSGVhZGVyRmlsZShkZXYsKFJGOTBfUkFESU9fUEFUSF9FKWVSRlBhdGgpOworCQkJCVJGM19GaW5hbF9WYWx1ZSA9IHJ0bDgxOTJfcGh5X1F1ZXJ5UkZSZWcoZGV2LCAoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCwgUmVnT2ZmU2V0VG9CZUNoZWNrLCBiTWFzazEyQml0cyk7CisJCQkJUlRfVFJBQ0UoQ09NUF9SRiwgIlJGICVkICVkIHJlZ2lzdGVyIGZpbmFsIHZhbHVlOiAleFxuIiwgZVJGUGF0aCwgUmVnT2ZmU2V0VG9CZUNoZWNrLCBSRjNfRmluYWxfVmFsdWUpOworCQkJCVJldHJ5VGltZXMtLTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFJGOTBfUEFUSF9EOgorCQkJd2hpbGUoUkYzX0ZpbmFsX1ZhbHVlIT1SZWdWYWx1ZVRvQmVDaGVjayAmJiBSZXRyeVRpbWVzIT0wKQorCQkJeworCQkJCXJldCA9IHJ0bDgxOTJfcGh5X0NvbmZpZ1JGV2l0aEhlYWRlckZpbGUoZGV2LChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoKTsKKwkJCQlSRjNfRmluYWxfVmFsdWUgPSBydGw4MTkyX3BoeV9RdWVyeVJGUmVnKGRldiwgKFJGOTBfUkFESU9fUEFUSF9FKWVSRlBhdGgsIFJlZ09mZlNldFRvQmVDaGVjaywgYk1hc2sxMkJpdHMpOworCQkJCVJUX1RSQUNFKENPTVBfUkYsICJSRiAlZCAlZCByZWdpc3RlciBmaW5hbCB2YWx1ZTogJXhcbiIsIGVSRlBhdGgsIFJlZ09mZlNldFRvQmVDaGVjaywgUkYzX0ZpbmFsX1ZhbHVlKTsKKwkJCQlSZXRyeVRpbWVzLS07CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8qLS0tLVJlc3RvcmUgUkZFTlYgY29udHJvbCB0eXBlLS0tLSovOworCQlzd2l0Y2goZVJGUGF0aCkKKwkJeworCQljYXNlIFJGOTBfUEFUSF9BOgorCQljYXNlIFJGOTBfUEFUSF9DOgorCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHBQaHlSZWctPnJmaW50ZnMsIGJSRlNJX1JGRU5WLCB1NFJlZ1ZhbHVlKTsKKwkJCWJyZWFrOworCQljYXNlIFJGOTBfUEFUSF9CIDoKKwkJY2FzZSBSRjkwX1BBVEhfRDoKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBwUGh5UmVnLT5yZmludGZzLCBiUkZTSV9SRkVOVjw8MTYsIHU0UmVnVmFsdWUpOworCQkJYnJlYWs7CisJCX0KKworCQlpZihyZXQpeworCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJwaHlfUkY4MjU2X0NvbmZpZ19QYXJhRmlsZSgpOlJhZGlvWyVkXSBGYWlsISEiLCBlUkZQYXRoKTsKKwkJCWdvdG8gcGh5X1JGODI1Nl9Db25maWdfUGFyYUZpbGVfRmFpbDsKKwkJfQorCisJfQorCisJUlRfVFJBQ0UoQ09NUF9QSFksICJQSFkgSW5pdGlhbGl6YXRpb24gU3VjY2Vzc1xuIikgOworCXJldHVybiA7CisKK3BoeV9SRjgyNTZfQ29uZmlnX1BhcmFGaWxlX0ZhaWw6CisJUlRfVFJBQ0UoQ09NUF9FUlIsICJQSFkgSW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKSA7CisJcmV0dXJuIDsKK30KKworCit2b2lkIFBIWV9TZXRSRjgyNTZDQ0tUeFBvd2VyKHN0cnVjdCBuZXRfZGV2aWNlKglkZXYsIHU4CXBvd2VybGV2ZWwpCit7CisJdTMyCVR4QUdDPTA7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8vbW9kaWZpZWQgYnkgdml2aSwgMjAwODAxMDkKKwlUeEFHQyA9IHBvd2VybGV2ZWw7CisKKwlpZihwcml2LT5iRHluYW1pY1R4TG93UG93ZXIgPT0gVFJVRSApIC8vY29zYSAwNS8yMi8yMDA4IGZvciBzY2FuCisJeworCQlpZihwcml2LT5DdXN0b21lcklEID09IFJUX0NJRF84MTl4X05ldGNvcmUpCisJCQlUeEFHQyA9IDB4MjI7CisJCWVsc2UKKwkJVHhBR0MgKz0gcHJpdi0+Q2NrUHdFbmw7CisJfQorCisJaWYoVHhBR0MgPiAweDI0KQorCQlUeEFHQyA9IDB4MjQ7CisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJUeEFHQ19DQ0tfTWNzMzIsIGJUeEFHQ1JhdGVDQ0ssIFR4QUdDKTsKK30KKworCit2b2lkIFBIWV9TZXRSRjgyNTZPRkRNVHhQb3dlcihzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1OCBwb3dlcmxldmVsKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvL0pvc2VwaCBUeFBvd2VyIGZvciA4MTkyIHRlc3RpbmcKKwl1MzIgd3JpdGVWYWwsIHBvd2VyQmFzZTAsIHBvd2VyQmFzZTEsIHdyaXRlVmFsX3RtcDsKKwl1OCBpbmRleCA9IDA7CisJdTE2IFJlZ09mZnNldFs2XSA9IHsweGUwMCwgMHhlMDQsIDB4ZTEwLCAweGUxNCwgMHhlMTgsIDB4ZTFjfTsKKwl1OCBieXRlMCwgYnl0ZTEsIGJ5dGUyLCBieXRlMzsKKworCXBvd2VyQmFzZTAgPSBwb3dlcmxldmVsICsgcHJpdi0+VHhQb3dlckRpZmY7CS8vT0ZETSByYXRlcworCXBvd2VyQmFzZTAgPSAocG93ZXJCYXNlMDw8MjQpIHwgKHBvd2VyQmFzZTA8PDE2KSB8KHBvd2VyQmFzZTA8PDgpIHxwb3dlckJhc2UwOworCXBvd2VyQmFzZTEgPSBwb3dlcmxldmVsOwkJCQkJCQkvL01DUyByYXRlcworCXBvd2VyQmFzZTEgPSAocG93ZXJCYXNlMTw8MjQpIHwgKHBvd2VyQmFzZTE8PDE2KSB8KHBvd2VyQmFzZTE8PDgpIHxwb3dlckJhc2UxOworCisJZm9yKGluZGV4PTA7IGluZGV4PDY7IGluZGV4KyspCisJeworCQl3cml0ZVZhbCA9IHByaXYtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W2luZGV4XSArICgoaW5kZXg8Mik/cG93ZXJCYXNlMDpwb3dlckJhc2UxKTsKKwkJYnl0ZTAgPSAodTgpKHdyaXRlVmFsICYgMHg3Zik7CisJCWJ5dGUxID0gKHU4KSgod3JpdGVWYWwgJiAweDdmMDApPj44KTsKKwkJYnl0ZTIgPSAodTgpKCh3cml0ZVZhbCAmIDB4N2YwMDAwKT4+MTYpOworCQlieXRlMyA9ICh1OCkoKHdyaXRlVmFsICYgMHg3ZjAwMDAwMCk+PjI0KTsKKwkJaWYoYnl0ZTAgPiAweDI0KQkvLyBNYXggcG93ZXIgaW5kZXggPSAweDI0CisJCQlieXRlMCA9IDB4MjQ7CisJCWlmKGJ5dGUxID4gMHgyNCkKKwkJCWJ5dGUxID0gMHgyNDsKKwkJaWYoYnl0ZTIgPiAweDI0KQorCQkJYnl0ZTIgPSAweDI0OworCQlpZihieXRlMyA+IDB4MjQpCisJCQlieXRlMyA9IDB4MjQ7CisKKwkJLy9mb3IgdHggcG93ZXIgdHJhY2sKKwkJaWYoaW5kZXggPT0gMykKKwkJeworCQkJd3JpdGVWYWxfdG1wID0gKGJ5dGUzPDwyNCkgfCAoYnl0ZTI8PDE2KSB8KGJ5dGUxPDw4KSB8Ynl0ZTA7CisJCQlwcml2LT5Qd3JfVHJhY2sgPSB3cml0ZVZhbF90bXA7CisJCX0KKworCQlpZihwcml2LT5iRHluYW1pY1R4SGlnaFBvd2VyID09IFRSVUUpICAgICAvL0FkZCBieSBKYWNrZW4gMjAwOC8wMy8wNgorCQl7CisJCQkvLyBFbWlseSwgMjAwODA2MTMuIFNldCBsb3cgdHggcG93ZXIgZm9yIGJvdGggTUNTIGFuZCBsZWdhY3kgT0ZETQorCQkJd3JpdGVWYWwgPSAweDAzMDMwMzAzOworCQl9CisJCWVsc2UKKwkJeworCQkJd3JpdGVWYWwgPSAoYnl0ZTM8PDI0KSB8IChieXRlMjw8MTYpIHwoYnl0ZTE8PDgpIHxieXRlMDsKKwkJfQorCQlydGw4MTkyX3NldEJCcmVnKGRldiwgUmVnT2Zmc2V0W2luZGV4XSwgMHg3ZjdmN2Y3Ziwgd3JpdGVWYWwpOworCX0KKwlyZXR1cm47CisKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkwX3J0bDgyNTYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MF9ydGw4MjU2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMxZjY1MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MF9ydGw4MjU2LmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAgVGhpcyBpcyBwYXJ0IG9mIHRoZSBydGw4MTgwLXNhMjQwMCBkcml2ZXIKKyAgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTCAoU2VlIGZpbGUgQ09QWUlORyBmb3IgZGV0YWlscykuCisgIENvcHlyaWdodCAoYykgMjAwNSBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisKKyAgVGhpcyBmaWxlcyBjb250YWlucyBwcm9ncmFtbWluZyBjb2RlIGZvciB0aGUgcnRsODI1NgorICByYWRpbyBmcm9udGVuZC4KKworICAqTWFueSogdGhhbmtzIHRvIFJlYWx0ZWsgQ29ycC4gZm9yIHRoZWlyIGdyZWF0IHN1cHBvcnQhCisKKyovCisKKyNpZm5kZWYgUlRMODIyNUgKKyNkZWZpbmUgUlRMODIyNUgKKworI2lmZGVmIFJUTDgxOTBQCisjZGVmaW5lIFJUTDgxOVhfVE9UQUxfUkZfUEFUSCA0IC8vZm9yIDkwUAorI2Vsc2UKKyNkZWZpbmUgUlRMODE5WF9UT1RBTF9SRl9QQVRIIDIgLy9mb3IgODE5MlUKKyNlbmRpZgorZXh0ZXJuIHZvaWQgUEhZX1NldFJGODI1NkJhbmR3aWR0aChzdHJ1Y3QgbmV0X2RldmljZSogZGV2ICwgSFRfQ0hBTk5FTF9XSURUSCBCYW5kd2lkdGgpOworZXh0ZXJuIHZvaWQgUEhZX1JGODI1Nl9Db25maWcoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitleHRlcm4gdm9pZCBwaHlfUkY4MjU2X0NvbmZpZ19QYXJhRmlsZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK2V4dGVybiB2b2lkIFBIWV9TZXRSRjgyNTZDQ0tUeFBvd2VyKHN0cnVjdCBuZXRfZGV2aWNlKglkZXYsIHU4CXBvd2VybGV2ZWwpOworZXh0ZXJuIHZvaWQgUEhZX1NldFJGODI1Nk9GRE1UeFBvd2VyKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHU4IHBvd2VybGV2ZWwpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWEyNzIxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVS5oCkBAIC0wLDAgKzEsMTI2MyBAQAorLyoKKyAgIFRoaXMgaXMgcGFydCBvZiBydGw4MTg3IE9wZW5Tb3VyY2UgZHJpdmVyLgorICAgQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0LTIwMDUgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAgIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlCisgICBvZmZpY2lhbCByZWFsdGVrIGRyaXZlcgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxOTIgZHJpdmVyIHNrZWxldG9uCisgICBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24KKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyCisKKyAgIFdlIHdhbnQgdG8gdGFua3MgdGhlIEF1dGhvcnMgb2YgdGhvc2UgcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlcgorICAgcHJvamVjdCBBdXRob3JzLgorKi8KKworI2lmbmRlZiBSODE5eFVfSAorI2RlZmluZSBSODE5eFVfSAorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisvLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4JLy9mb3IgcnRubF9sb2NrKCkKKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgkvLyBOZWNlc3NhcnkgYmVjYXVzZSB3ZSB1c2UgdGhlIHByb2MgZnMKKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCisKKyNkZWZpbmUgUlRMODE5MlUKKyNkZWZpbmUgUlRMODE5eFVfTU9EVUxFX05BTUUgInJ0bDgxOXhVIgorLy9hZGRlZCBmb3IgSFcgc2VjdXJpdHksIGpvaG4uMDYyOQorI2RlZmluZSBGQUxTRSAwCisjZGVmaW5lIFRSVUUgMQorI2RlZmluZSBNQVhfS0VZX0xFTiAgICAgNjEKKyNkZWZpbmUgS0VZX0JVRl9TSVpFICAgIDUKKworI2RlZmluZSBCSVQwICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBCSVQxICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBCSVQyICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBCSVQzICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBCSVQ0ICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBCSVQ1ICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBCSVQ2ICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBCSVQ3ICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBCSVQ4ICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBCSVQ5ICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBCSVQxMCAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBCSVQxMSAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBCSVQxMiAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBCSVQxMyAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBCSVQxNCAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBCSVQxNSAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBCSVQxNiAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBCSVQxNyAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBCSVQxOCAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBCSVQxOSAgICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBCSVQyMCAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBCSVQyMSAgICAgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBCSVQyMiAgICAgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBCSVQyMyAgICAgICAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBCSVQyNCAgICAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBCSVQyNSAgICAgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBCSVQyNiAgICAgICAgICAgMHgwNDAwMDAwMAorI2RlZmluZSBCSVQyNyAgICAgICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBCSVQyOCAgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBCSVQyOSAgICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBCSVQzMCAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBCSVQzMSAgICAgICAgICAgMHg4MDAwMDAwMAorCisvLyBSeCBzbW9vdGggZmFjdG9yCisjZGVmaW5lCVJ4X1Ntb290aF9GYWN0b3IJCTIwCisjZGVmaW5lIERNRVNHKHgsYS4uLikKKyNkZWZpbmUgRE1FU0dXKHgsYS4uLikKKyNkZWZpbmUgRE1FU0dFKHgsYS4uLikKK2V4dGVybiB1MzIgcnRfZ2xvYmFsX2RlYnVnX2NvbXBvbmVudDsKKyNkZWZpbmUgUlRfVFJBQ0UoY29tcG9uZW50LCB4LCBhcmdzLi4uKSBcCitkbyB7IGlmKHJ0X2dsb2JhbF9kZWJ1Z19jb21wb25lbnQgJiBjb21wb25lbnQpIFwKKwlwcmludGsoS0VSTl9ERUJVRyBSVEw4MTl4VV9NT0RVTEVfTkFNRSAiOiIgeCAiXG4iICwgXAorCSAgICAgICAjI2FyZ3MpO1wKK313aGlsZSgwKTsKKworI2RlZmluZSBDT01QX1RSQUNFCQkJCUJJVDAJCS8vIEZvciBmdW5jdGlvbiBjYWxsIHRyYWNpbmcuCisjZGVmaW5lIENPTVBfREJHCQkJCUJJVDEJCS8vIE9ubHkgZm9yIHRlbXBvcmFyeSBkZWJ1ZyBtZXNzYWdlLgorI2RlZmluZSBDT01QX0lOSVQJCQkJQklUMgkJLy8gZHVyaW5nIGRyaXZlciBpbml0aWFsaXphdGlvbiAvIGhhbHQgLyByZXNldC4KKworCisjZGVmaW5lIENPTVBfUkVDVgkJCQlCSVQzCQkvLyBSZXZlaXZlIHBhcnQgZGF0YSBwYXRoLgorI2RlZmluZSBDT01QX1NFTkQJCQkJQklUNAkJLy8gU2VuZCBwYXJ0IHBhdGguCisjZGVmaW5lIENPTVBfSU8JCQkJCUJJVDUJCS8vIEkvTyBSZWxhdGVkLiBBZGRlZCBieSBBbm5pZSwgMjAwNi0wMy0wMi4KKyNkZWZpbmUgQ09NUF9QT1dFUgkJCQlCSVQ2CQkvLyA4MDIuMTEgUG93ZXIgU2F2ZSBtb2RlIG9yIFN5c3RlbS9EZXZpY2UgUG93ZXIgc3RhdGUgcmVsYXRlZC4KKyNkZWZpbmUgQ09NUF9FUFJPTQkJCQlCSVQ3CQkvLyA4MDIuMTEgbGluayByZWxhdGVkOiBqb2luL3N0YXJ0IEJTUywgbGVhdmUgQlNTLgorI2RlZmluZSBDT01QX1NXQlcJCQkJQklUOAkvLyBGb3IgYmFuZHdpZHRoIHN3aXRjaC4KKyNkZWZpbmUgQ09NUF9QT1dFUl9UUkFDS0lORwkJCUJJVDkJLy9GT1IgODE5MCBUWCBQT1dFUiBUUkFDS0lORworI2RlZmluZSBDT01QX1RVUkJPCQkJCUJJVDEwCS8vIEZvciBUdXJibyBNb2RlIHJlbGF0ZWQuIEJ5IEFubmllLCAyMDA1LTEwLTIxLgorI2RlZmluZSBDT01QX1FPUwkJCQlCSVQxMQkvLyBGb3IgUW9TLgorI2RlZmluZSBDT01QX1JBVEUJCQkJQklUMTIJLy8gRm9yIFJhdGUgQWRhcHRpdmUgbWVjaGFuaXNtLCAyMDA2LjA3LjAyLCBieSByY25qa28uCisjZGVmaW5lIENPTVBfUk0JCQkJCUJJVDEzCS8vIEZvciBSYWRpbyBNZWFzdXJlbWVudC4KKyNkZWZpbmUgQ09NUF9ESUcJCQkJQklUMTQJLy8gRm9yIERJRywgMjAwNi4wOS4yNSwgYnkgcmNuamtvLgorI2RlZmluZSBDT01QX1BIWQkgCQkJQklUMTUKKyNkZWZpbmUgQ09NUF9DSAkJCQkJQklUMTYJLy9jaGFubmVsIHNldHRpbmcgZGVidWcKKyNkZWZpbmUgQ09NUF9UWEFHQwkJCQlCSVQxNwkvLyBGb3IgVHggcG93ZXIsIDA2MDkyOCwgYnkgcmNuamtvLgorI2RlZmluZSBDT01QX0hJUFdSCQkJCUJJVDE4CS8vIEZvciBIaWdoIFBvd2VyIE1lY2hhbmlzbSwgMDYwOTI4LCBieSByY25qa28uCisjZGVmaW5lIENPTVBfSEFMRE0JCQkJQklUMTkJLy8gRm9yIEhXIER5bmFtaWMgTWVjaGFuaXNtLCAwNjEwMTAsIGJ5IHJjbmprby4KKyNkZWZpbmUgQ09NUF9TRUMJCQkgICAgICAgIEJJVDIwCS8vIEV2ZW50IGhhbmRsaW5nCisjZGVmaW5lIENPTVBfTEVECQkJCUJJVDIxCS8vIEZvciBMRUQuCisjZGVmaW5lIENPTVBfUkYJCQkJCUJJVDIyCS8vIEZvciBSRi4KKy8vMSEhISEhISEhISEhISEhISEhISEhISEhISEhIQorI2RlZmluZSBDT01QX1JYREVTQwkJCQlCSVQyMwkvLyBTaG93IFJ4IGRlc2MgaW5mb3JtYXRpb24gZm9yIFNEMyBkZWJ1Zy4gQWRkZWQgYnkgQW5uaWUsIDIwMDYtMDctMTUuCisvLzEvLzFBdHRlbnRpb24gUGxlYXNlISEhPDExbiBvciA4MTkwIHNwZWNpZmljIGNvZGUgc2hvdWxkIGJlIHB1dCBiZWxvdyB0aGlzIGxpbmU+CisvLzEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKworI2RlZmluZSBDT01QX0ZJUk1XQVJFCQkJCUJJVDI0CS8vZm9yIGZpcm13YXJlIGRvd25sb2FkaW5nCisjZGVmaW5lIENPTVBfSFQJCQkJCUJJVDI1CS8vIEZvciA4MDIuMTFuIEhUIHJlbGF0ZWQgaW5mb3JtYXRpb24uIGJ5IEVtaWx5IDIwMDYtOC0xMQorI2RlZmluZSBDT01QX0FNU0RVCQkJCUJJVDI2CS8vIEZvciBBLU1TRFUgRGVidWdnaW5nCisKKyNkZWZpbmUgQ09NUF9TQ0FOCQkJCUJJVDI3CisvLyNkZWZpbmUgQ09NUF9SRVNFVAkJCQlCSVQyOAorI2RlZmluZSBDT01QX0RPV04JCQkJQklUMjkgIC8vZm9yIHJtIGRyaXZlciBtb2R1bGUKKyNkZWZpbmUgQ09NUF9SRVNFVAkJCQlCSVQzMCAgLy9mb3Igc2lsZW50IHJlc2V0CisjZGVmaW5lIENPTVBfRVJSCQkJCUJJVDMxIC8vZm9yIGVycm9yIG91dCwgYWx3YXlzIG9uCisKKyNkZWZpbmUgUlRMODE5eF9ERUJVRworI2lmZGVmIFJUTDgxOXhfREVCVUcKKyNkZWZpbmUgYXNzZXJ0KGV4cHIpIFwKKyAgICAgICAgaWYgKCEoZXhwcikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHByaW50ayggIkFzc2VydGlvbiBmYWlsZWQhICVzLCVzLCVzLGxpbmU9JWRcbiIsIFwKKyAgICAgICAgICAgICAgICAjZXhwcixfX0ZJTEVfXyxfX0ZVTkNUSU9OX18sX19MSU5FX18pOyAgICAgICAgICBcCisgICAgICAgIH0KKy8vd2IgYWRkZWQgdG8gZGVidWcgb3V0IGRhdGEgYnVmCisvL2lmIHlvdSB3YW50IHByaW50IERBVEEgYnVmZmVyIHJlbGF0ZWQgQkEsIHBsZWFzZSBzZXQgaWVlZTgwMjExX2RlYnVnX2xldmVsIHRvIERBVEF8QkEKKyNkZWZpbmUgUlRfREVCVUdfREFUQShsZXZlbCwgZGF0YSwgZGF0YWxlbikgICAgICBcCisgICAgICAgIGRveyBpZiAoKHJ0X2dsb2JhbF9kZWJ1Z19jb21wb25lbnQgJiAobGV2ZWwpKSA9PSAobGV2ZWwpKSAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB1OCogcGRhdGEgPSAodTgqKSBkYXRhOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgUlRMODE5eFVfTU9EVUxFX05BTUUgIjogJXMoKVxuIiwgX19GVU5DVElPTl9fKTsgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPChpbnQpKGRhdGFsZW4pOyBpKyspICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiJTJ4ICIsIHBkYXRhW2ldKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaSsxKSUxNiA9PSAwKSBwcmludGsoIlxuIik7ICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiXG4iKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBhc3NlcnQoZXhwcikgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIFJUX0RFQlVHX0RBVEEobGV2ZWwsIGRhdGEsIGRhdGFsZW4pIGRvIHt9IHdoaWxlKDApCisjZW5kaWYgLyogUlRMODE2OV9ERUJVRyAqLworCisKKy8vCisvLyBRdWV1ZSBTZWxlY3QgVmFsdWUgaW4gVHhEZXNjCisvLworI2RlZmluZSBRU0xUX0JLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFFTTFRfQkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgUVNMVF9WSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBRU0xUX1ZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2CisjZGVmaW5lIFFTTFRfQkVBQ09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIFFTTFRfSElHSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDExCisjZGVmaW5lIFFTTFRfTUdOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEyCisjZGVmaW5lIFFTTFRfQ01EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEzCisKKyNkZWZpbmUgREVTQzkwX1JBVEUxTSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgREVTQzkwX1JBVEUyTSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgREVTQzkwX1JBVEU1XzVNICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgREVTQzkwX1JBVEUxMU0gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgREVTQzkwX1JBVEU2TSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgREVTQzkwX1JBVEU5TSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgREVTQzkwX1JBVEUxMk0gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgREVTQzkwX1JBVEUxOE0gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgREVTQzkwX1JBVEUyNE0gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgREVTQzkwX1JBVEUzNk0gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkKKyNkZWZpbmUgREVTQzkwX1JBVEU0OE0gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGEKKyNkZWZpbmUgREVTQzkwX1JBVEU1NE0gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1MwICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1MxICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1MyICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1MzICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1M0ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1M1ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1M2ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1M3ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1M4ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1M5ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1MxMCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGEKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1MxMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1MxMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1MxMyAgICAgICAgICAgICAgICAgICAgICAgIDB4MGQKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1MxNCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGUKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1MxNSAgICAgICAgICAgICAgICAgICAgICAgIDB4MGYKKyNkZWZpbmUgREVTQzkwX1JBVEVNQ1MzMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAKKworI2RlZmluZSBSVEw4MTlYX0RFRkFVTFRfUkZfVFlQRSBSRl8xVDJSCisKKyNkZWZpbmUgSUVFRTgwMjExX1dBVENIX0RPR19USU1FICAgIDIwMDAKKyNkZWZpbmUJCVBIWV9CZWFjb25fUlNTSV9TTElEX1dJTl9NQVgJCTEwCisvL2ZvciB0eHBvd2VydHJhY2tpbmcgYnkgYW15CisjZGVmaW5lIAlPRkRNX1RhYmxlX0xlbmd0aAkxOQorI2RlZmluZQlDQ0tfVGFibGVfbGVuZ3RoCTEyCisKKy8qIGZvciBydGw4MTl4ICovCit0eXBlZGVmIHN0cnVjdCBfdHhfZGVzY184MTl4X3VzYiB7CisgICAgICAgIC8vRFdPUkQgMAorICAgICAgICB1MTYJUGt0U2l6ZTsKKyAgICAgICAgdTgJT2Zmc2V0OworICAgICAgICB1OAlSZXNlcnZlZDA6MzsKKyAgICAgICAgdTgJQ21kSW5pdDoxOworICAgICAgICB1OAlMYXN0U2VnOjE7CisgICAgICAgIHU4CUZpcnN0U2VnOjE7CisgICAgICAgIHU4CUxJTklQOjE7CisgICAgICAgIHU4CU9XTjoxOworCisgICAgICAgIC8vRFdPUkQgMQorICAgICAgICB1OAlUeEZXSW5mb1NpemU7CisgICAgICAgIHU4CVJBVGlkOjM7CisgICAgICAgIHU4CURJU0ZCOjE7CisgICAgICAgIHU4CVVTRVJBVEU6MTsKKyAgICAgICAgdTgJTU9SRUZSQUc6MTsKKyAgICAgICAgdTgJTm9FbmM6MTsKKyAgICAgICAgdTgJUElGUzoxOworICAgICAgICB1OAlRdWV1ZVNlbGVjdDo1OworICAgICAgICB1OAlOb0FDTToxOworICAgICAgICB1OAlSZXNlcnZlZDE6MjsKKyAgICAgICAgdTgJU2VjQ0FNSUQ6NTsKKyAgICAgICAgdTgJU2VjRGVzY0Fzc2lnbjoxOworICAgICAgICB1OAlTZWNUeXBlOjI7CisKKyAgICAgICAgLy9EV09SRCAyCisgICAgICAgIHUxNglUeEJ1ZmZlclNpemU7CisgICAgICAgIC8vdTE2IFJlc2VydmVkMjsKKyAgICAgICAgdTgJUmVzdkZvclBhZGRpbmdMZW46NzsKKyAgICAgICAgdTgJUmVzZXJ2ZWQzOjE7CisgICAgICAgIHU4CVJlc2VydmVkNDsKKworICAgICAgICAvL0RXT1JEIDMsIDQsIDUKKyAgICAgICAgdTMyCVJlc2VydmVkNTsKKyAgICAgICAgdTMyCVJlc2VydmVkNjsKKyAgICAgICAgdTMyCVJlc2VydmVkNzsKK310eF9kZXNjXzgxOXhfdXNiLCAqcHR4X2Rlc2NfODE5eF91c2I7CisKKyNpZmRlZiBVU0JfVFhfRFJJVkVSX0FHR1JFR0FUSU9OX0VOQUJMRQordHlwZWRlZiBzdHJ1Y3QgX3R4X2Rlc2NfODE5eF91c2JfYWdncl9zdWJmcmFtZSB7CisJLy9EV09SRCAwCisJdTE2CVBrdFNpemU7CisJdTgJT2Zmc2V0OworCXU4CVR4RldJbmZvU2l6ZTsKKworCS8vRFdPUkQgMQorCXU4CVJBVGlkOjM7CisJdTgJRElTRkI6MTsKKwl1OAlVU0VSQVRFOjE7CisJdTgJTU9SRUZSQUc6MTsKKwl1OAlOb0VuYzoxOworCXU4CVBJRlM6MTsKKwl1OAlRdWV1ZVNlbGVjdDo1OworCXU4CU5vQUNNOjE7CisJdTgJUmVzZXJ2ZWQxOjI7CisJdTgJU2VjQ0FNSUQ6NTsKKwl1OAlTZWNEZXNjQXNzaWduOjE7CisJdTgJU2VjVHlwZToyOworCXU4CVBhY2tldElEOjc7CisJdTgJT1dOOjE7Cit9dHhfZGVzY184MTl4X3VzYl9hZ2dyX3N1YmZyYW1lLCAqcHR4X2Rlc2NfODE5eF91c2JfYWdncl9zdWJmcmFtZTsKKyNlbmRpZgorCisKKwordHlwZWRlZiBzdHJ1Y3QgX3R4X2Rlc2NfY21kXzgxOXhfdXNiIHsKKyAgICAgICAgLy9EV09SRCAwCisJdTE2CVJlc2VydmVkMDsKKwl1OAlSZXNlcnZlZDE7CisJdTgJUmVzZXJ2ZWQyOjM7CisJdTgJQ21kSW5pdDoxOworCXU4CUxhc3RTZWc6MTsKKwl1OAlGaXJzdFNlZzoxOworCXU4CUxJTklQOjE7CisJdTgJT1dOOjE7CisKKyAgICAgICAgLy9ET1dSRCAxCisJLy91MzIJUmVzZXJ2ZWQzOworCXU4CVR4RldJbmZvU2l6ZTsKKwl1OAlSZXNlcnZlZDM7CisJdTgJUXVldWVTZWxlY3Q7CisJdTgJUmVzZXJ2ZWQ0OworCisgICAgICAgIC8vRE9XUkQgMgorCXUxNiAJVHhCdWZmZXJTaXplOworCXUxNglSZXNlcnZlZDU7CisKKyAgICAgICAvL0RXT1JEIDMsNCw1CisJLy91MzIJVHhCdWZmZXJBZGRyOworCS8vdTMyCU5leHREZXNjQWRkcmVzczsKKwl1MzIJUmVzZXJ2ZWQ2OworCXUzMglSZXNlcnZlZDc7CisJdTMyCVJlc2VydmVkODsKK310eF9kZXNjX2NtZF84MTl4X3VzYiwgKnB0eF9kZXNjX2NtZF84MTl4X3VzYjsKKworCit0eXBlZGVmIHN0cnVjdCBfdHhfZndpbmZvXzgxOXhfdXNiIHsKKyAgICAgICAgLy9ET1dSRCAwCisgICAgICAgIHU4CQlUeFJhdGU6NzsKKyAgICAgICAgdTgJCUN0c0VuYWJsZToxOworICAgICAgICB1OAkJUnRzUmF0ZTo3OworICAgICAgICB1OAkJUnRzRW5hYmxlOjE7CisgICAgICAgIHU4CQlUeEhUOjE7CisgICAgICAgIHU4CQlTaG9ydDoxOyAgICAgICAgICAgICAgICAvL1Nob3J0IFBMQ1AgZm9yIENDSywgb3Igc2hvcnQgR0kgZm9yIDExbiBNQ1MKKyAgICAgICAgdTgJCVR4QmFuZHdpZHRoOjE7ICAgICAgICAgIC8vIFRoaXMgaXMgdXNlZCBmb3IgSFQgTUNTIHJhdGUgb25seS4KKyAgICAgICAgdTgJCVR4U3ViQ2FycmllcjoyOyAgICAgICAgIC8vIFRoaXMgaXMgdXNlZCBmb3IgbGVnYWN5IE9GRE0gcmF0ZSBvbmx5LgorICAgICAgICB1OAkJU1RCQzoyOworICAgICAgICB1OAkJQWxsb3dBZ2dyZWdhdGlvbjoxOworICAgICAgICB1OAkJUnRzSFQ6MTsgICAgICAgICAgICAgICAgLy9JbnRlcnByZSBSdHNSYXRlIGZpZWxkIGFzIGhpZ2ggdGhyb3VnaHB1dCBkYXRhIHJhdGUKKyAgICAgICAgdTgJCVJ0c1Nob3J0OjE7ICAgICAgICAgICAgIC8vU2hvcnQgUExDUCBmb3IgQ0NLLCBvciBzaG9ydCBHSSBmb3IgMTFuIE1DUworICAgICAgICB1OAkJUnRzQmFuZHdpZHRoOjE7ICAgICAgICAgLy8gVGhpcyBpcyB1c2VkIGZvciBIVCBNQ1MgcmF0ZSBvbmx5LgorICAgICAgICB1OAkJUnRzU3ViY2FycmllcjoyOyAgICAgICAgLy8gVGhpcyBpcyB1c2VkIGZvciBsZWdhY3kgT0ZETSByYXRlIG9ubHkuCisgICAgICAgIHU4CQlSdHNTVEJDOjI7CisgICAgICAgIHU4CQlFbmFibGVDUFVEdXI6MTsgICAgICAgICAvL0VuYWJsZSBmaXJtd2FyZSB0byByZWNhbGN1bGF0ZSBhbmQgYXNzaWduIHBhY2tldCBkdXJhdGlvbgorCisgICAgICAgIC8vRFdPUkQgMQorICAgICAgICB1MzIJCVJ4TUY6MjsKKyAgICAgICAgdTMyCQlSeEFNRDozOworICAgICAgICB1MzIJCVR4UGVyUGt0SW5mb0ZlZWRiYWNrOjE7Ly8xIGluZGljYXRlIFR4IGluZm8gZ2F0aHRlcmVkIGJ5IGZpcm13YXJlIGFuZCByZXR1cm5lZCBieSBSeCBDbWQKKyAgICAgICAgdTMyCQlSZXNlcnZlZDE6MjsKKyAgICAgICAgdTMyCQlUeEFHQ09mZlNldDo0OworICAgICAgICB1MzIJCVR4QUdDU2lnbjoxOworICAgICAgICB1MzIJCVR4X0lORk9fUlNWRDo2OworCXUzMgkJUGFja2V0SUQ6MTM7CisgICAgICAgIC8vdTMyICAgICAgICAgICAgICAgIFJlc2VydmVkOworfXR4X2Z3aW5mb184MTl4X3VzYiwgKnB0eF9md2luZm9fODE5eF91c2I7CisKK3R5cGVkZWYgc3RydWN0IHJ0bDgxOTJfcnhfaW5mbyB7CisJc3RydWN0IHVyYiAqdXJiOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdTggb3V0X3BpcGU7Cit9cnRsODE5Ml9yeF9pbmZvIDsKKwordHlwZWRlZiBzdHJ1Y3QgcnhfZGVzY184MTl4X3VzYnsKKwkvL0RPV1JEIDAKKwl1MTYgICAgICAgICAgICAgICAgIExlbmd0aDoxNDsKKwl1MTYgICAgICAgICAgICAgICAgIENSQzMyOjE7CisJdTE2ICAgICAgICAgICAgICAgICBJQ1Y6MTsKKwl1OCAgICAgICAgICAgICAgICAgIFJ4RHJ2SW5mb1NpemU7CisJdTggICAgICAgICAgICAgICAgICBTaGlmdDoyOworCXU4ICAgICAgICAgICAgICAgICAgUEhZU3RhdHVzOjE7CisJdTggICAgICAgICAgICAgICAgICBTV0RlYzoxOworCS8vdTggICAgICAgICAgICAgICAgTGFzdFNlZzoxOworCS8vdTggICAgICAgICAgICAgICAgRmlyc3RTZWc6MTsKKwkvL3U4ICAgICAgICAgICAgICAgIEVPUjoxOworCS8vdTggICAgICAgICAgICAgICAgT1dOOjE7CisJdTggICAgICAgICAgICAgICAgICBSZXNlcnZlZDE6NDsKKworCS8vRFdPUkQgMQorCXUzMiAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOworCisJLy9EV09SRCAyCisJLy91MzIgICAgICAgICAgICAgICBSZXNlcnZlZDM7CisKKwkvL0RXT1JEIDMKKwkvL3UzMiAgICAgICAgICAgICAgICBCdWZmZXJBZGRyZXNzOworCit9cnhfZGVzY184MTl4X3VzYiwgKnByeF9kZXNjXzgxOXhfdXNiOworCisjaWZkZWYgVVNCX1JYX0FHR1JFR0FUSU9OX1NVUFBPUlQKK3R5cGVkZWYgc3RydWN0IF9yeF9kZXNjXzgxOXhfdXNiX2FnZ3Jfc3ViZnJhbWV7CisJLy9ET1dSRCAwCisJdTE2CQkJTGVuZ3RoOjE0OworCXUxNgkJCUNSQzMyOjE7CisJdTE2CQkJSUNWOjE7CisJdTgJCQlPZmZzZXQ7CisJdTgJCQlSeERydkluZm9TaXplOworCS8vRE9XUkQgMQorCXU4CQkJU2hpZnQ6MjsKKwl1OAkJCVBIWVN0YXR1czoxOworCXU4CQkJU1dEZWM6MTsKKwl1OAkJCVJlc2VydmVkMTo0OworCXU4CQkJUmVzZXJ2ZWQyOworCXUxNgkJCVJlc2VydmVkMzsKKwkvL0RXT1JEIDIKKwkvL3U0Qnl0ZQkJUmVzZXJ2ZWQzOworCS8vRFdPUkQgMworCS8vdTRCeXRlICAgICAgICAgICAJQnVmZmVyQWRkcmVzczsKK31yeF9kZXNjXzgxOXhfdXNiX2FnZ3Jfc3ViZnJhbWUsICpwcnhfZGVzY184MTl4X3VzYl9hZ2dyX3N1YmZyYW1lOworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHJ4X2RydmluZm9fODE5eF91c2J7CisJLy9EV09SRCAwCisJdTE2ICAgICAgICAgICAgICAgICBSZXNlcnZlZDE6MTI7CisJdTE2ICAgICAgICAgICAgICAgICBQYXJ0QWdncjoxOworCXUxNiAgICAgICAgICAgICAgICAgRmlyc3RBR0dSOjE7CisJdTE2ICAgICAgICAgICAgICAgICBSZXNlcnZlZDI6MjsKKworCXU4ICAgICAgICAgICAgICAgICAgUnhSYXRlOjc7CisJdTggICAgICAgICAgICAgICAgICBSeEhUOjE7CisKKwl1OCAgICAgICAgICAgICAgICAgIEJXOjE7CisJdTggICAgICAgICAgICAgICAgICBTUExDUDoxOworCXU4ICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOjI7CisJdTggICAgICAgICAgICAgICAgICBQQU06MTsKKwl1OCAgICAgICAgICAgICAgICAgIE1jYXN0OjE7CisJdTggICAgICAgICAgICAgICAgICBCY2FzdDoxOworCXU4ICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ0OjE7CisKKwkvL0RXT1JEIDEKKwl1MzIgICAgICAgICAgICAgICAgICBUU0ZMOworCit9cnhfZHJ2aW5mb184MTl4X3VzYiwgKnByeF9kcnZpbmZvXzgxOXhfdXNiOworCisKKyNkZWZpbmUgTUFYX0RFVl9BRERSX1NJWkUJCTggIC8qIHN1cHBvcnQgdGlsbCA2NCBiaXQgYnVzIHdpZHRoIE9TICovCisjZGVmaW5lIE1BWF9GSVJNV0FSRV9JTkZPUk1BVElPTl9TSVpFICAgMzIgLyoyMDA2LzA0LzMwIGJ5IEVtaWx5IGZvclJUTDgxOTAqLworI2RlZmluZSBNQVhfODAyXzExX0hFQURFUl9MRU5HVEggICAgICAgICg0MCArIE1BWF9GSVJNV0FSRV9JTkZPUk1BVElPTl9TSVpFKQorI2RlZmluZSBFTkNSWVBUSU9OX01BWF9PVkVSSEVBRAkJMTI4CisjZGVmaW5lCVVTQl9IV0RFU0NfSEVBREVSX0xFTgkJc2l6ZW9mKHR4X2Rlc2NfODE5eF91c2IpCisjZGVmaW5lIFRYX1BBQ0tFVF9TSElGVF9CWVRFUyAJICAJKFVTQl9IV0RFU0NfSEVBREVSX0xFTiArIHNpemVvZih0eF9md2luZm9fODE5eF91c2IpKQorI2RlZmluZSBNQVhfRlJBR01FTlRfQ09VTlQJCTgKKyNpZmRlZiBSVEw4MTkyVQorI2lmZGVmIFVTQl9UWF9EUklWRVJfQUdHUkVHQVRJT05fRU5BQkxFCisjZGVmaW5lIE1BWF9UUkFOU01JVF9CVUZGRVJfU0laRQkJCTMyMDAwCisjZWxzZQorI2RlZmluZSBNQVhfVFJBTlNNSVRfQlVGRkVSX1NJWkUJCQk4MDAwCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIE1BWF9UUkFOU01JVF9CVUZGRVJfU0laRSAgCSgxNjAwKyhNQVhfODAyXzExX0hFQURFUl9MRU5HVEgrRU5DUllQVElPTl9NQVhfT1ZFUkhFQUQpKk1BWF9GUkFHTUVOVF9DT1VOVCkKKyNlbmRpZgorI2lmZGVmIFVTQl9UWF9EUklWRVJfQUdHUkVHQVRJT05fRU5BQkxFCisjZGVmaW5lIFRYX1BBQ0tFVF9EUlZBR0dSX1NVQkZSQU1FX1NISUZUX0JZVEVTIChzaXplb2YodHhfZGVzY184MTl4X3VzYl9hZ2dyX3N1YmZyYW1lKSArIHNpemVvZih0eF9md2luZm9fODE5eF91c2IpKQorI2VuZGlmCisjZGVmaW5lIHNjcmNsbmcJCQkJCTQJCS8vIG9jdGV0cyBmb3IgY3JjMzIgKEZDUywgSUNWKQorCit0eXBlZGVmIGVudW0gcmZfb3B0eXBlCit7CisJUkZfT1BfQnlfU1dfM3dpcmUgPSAwLAorCVJGX09QX0J5X0ZXLAorCVJGX09QX01BWAorfXJmX29wX3R5cGU7CisvKiA4MTkwIExvb3BiYWNrIE1vZGUgZGVmaW5pdGlvbiAqLwordHlwZWRlZiBlbnVtIF9ydGw4MTl4VXNiX2xvb3BiYWNreworCVJUTDgxOXhVX05PX0xPT1BCQUNLID0gMCwKKwlSVEw4MTl4VV9NQUNfTE9PUEJBQ0sgPSAxLAorCVJUTDgxOXhVX0RNQV9MT09QQkFDSyA9IDIsCisJUlRMODE5eFVfQ0NLX0xPT1BCQUNLID0gMywKK31ydGw4MTl4VXNiX2xvb3BiYWNrX2U7CisKKy8qIGR1ZSB0byBydGw4MTkyIGZpcm13YXJlICovCit0eXBlZGVmIGVudW0gX2Rlc2NfcGFja2V0X3R5cGVfZXsKKwlERVNDX1BBQ0tFVF9UWVBFX0lOSVQgPSAwLAorCURFU0NfUEFDS0VUX1RZUEVfTk9STUFMID0gMSwKK31kZXNjX3BhY2tldF90eXBlX2U7CisKK3R5cGVkZWYgZW51bSBfZmlybXdhcmVfc291cmNleworCUZXX1NPVVJDRV9JTUdfRklMRSA9IDAsCisJRldfU09VUkNFX0hFQURFUl9GSUxFID0gMSwJCS8vZnJvbSBoZWFkZXIgZmlsZQorfWZpcm13YXJlX3NvdXJjZV9lLCAqcGZpcm13YXJlX3NvdXJjZV9lOworCit0eXBlZGVmIGVudW0gX2Zpcm13YXJlX3N0YXR1c3sKKwlGV19TVEFUVVNfMF9JTklUID0gMCwKKwlGV19TVEFUVVNfMV9NT1ZFX0JPT1RfQ09ERSA9IDEsCisJRldfU1RBVFVTXzJfTU9WRV9NQUlOX0NPREUgPSAyLAorCUZXX1NUQVRVU18zX1RVUk5PTl9DUFUgPSAzLAorCUZXX1NUQVRVU180X01PVkVfREFUQV9DT0RFID0gNCwKKwlGV19TVEFUVVNfNV9SRUFEWSA9IDUsCit9ZmlybXdhcmVfc3RhdHVzX2U7CisKK3R5cGVkZWYgc3RydWN0IF9ydF9maXJtYXJlX3NlZ19jb250YWluZXIgeworCXUxNglzZWdfc2l6ZTsKKwl1OAkqc2VnX3B0cjsKK31md19zZWdfY29udGFpbmVyLCAqcGZ3X3NlZ19jb250YWluZXI7Cit0eXBlZGVmIHN0cnVjdCBfcnRfZmlybXdhcmV7CisJZmlybXdhcmVfc3RhdHVzX2UgZmlybXdhcmVfc3RhdHVzOworCXUxNiAgICAgICAgICAgICAgIGNtZHBhY2tldF9mcmFnX3RocmVzb2xkOworI2RlZmluZSBSVEw4MTkwX01BWF9GSVJNV0FSRV9DT0RFX1NJWkUgIDY0MDAwICAgLy82NGsKKwl1OCAgICAgICAgICAgICAgICBmaXJtd2FyZV9idWZbUlRMODE5MF9NQVhfRklSTVdBUkVfQ09ERV9TSVpFXTsKKwl1MTYgICAgICAgICAgICAgICBmaXJtd2FyZV9idWZfc2l6ZTsKK31ydF9maXJtd2FyZSwgKnBydF9maXJtd2FyZTsKKworLy8rYnkgYW15IDA4MDUwNworI2RlZmluZSBNQVhfUkVDRUlWRV9CVUZGRVJfU0laRQk5MTAwCS8vIEFkZCB0aGlzIHRvIDkxMDAgYnl0ZXMgdG8gcmVjZWl2ZSBBLU1TRFUgZnJvbSBSVC1BUAorCit0eXBlZGVmIHN0cnVjdCBfcnRfZmlybXdhcmVfaW5mb184MTl4VXNieworCXU4CQlzel9pbmZvWzE2XTsKK31ydF9maXJtd2FyZV9pbmZvXzgxOXhVc2IsICpwcnRfZmlybXdhcmVfaW5mb184MTl4VXNiOworCisvKiBGaXJtd2FyZSBRdWV1ZSBMYXlvdXQgKi8KKyNkZWZpbmUgTlVNX09GX0ZJUk1XQVJFX1FVRVVFCQkxMAorI2RlZmluZSBOVU1fT0ZfUEFHRVNfSU5fRlcJCTB4MTAwCisKKyNpZmRlZiBVU0VfT05FX1BJUEUKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQkUJMHgwMDAKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQksJMHgwMDAKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfVkkJMHgwZmYKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfVk8JMHgwMDAKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfSENDQQkwCisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0NNRAkweDAKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfTUdOVAkweDAwCisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0hJR0gJMAorI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9CQ04JMHgwCisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1BVQgkweDAwCisjZWxzZQorCisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0JFCTB4MDIwCisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0JLCTB4MDIwCisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1ZJCTB4MDQwCisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1ZPCTB4MDQwCisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0hDQ0EJMAorI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9DTUQJMHg0CisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX01HTlQJMHgyMAorI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9ISUdICTAKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQkNOCTB4NAorI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9QVUIJMHgxOAorCisjZW5kaWYKKworI2RlZmluZSBBUFBMSUVEX1JFU0VSVkVEX1FVRVVFX0lOX0ZXCTB4ODAwMDAwMDAKKyNkZWZpbmUgUlNWRF9GV19RVUVVRV9QQUdFX0JLX1NISUZUCTB4MDAKKyNkZWZpbmUgUlNWRF9GV19RVUVVRV9QQUdFX0JFX1NISUZUCTB4MDgKKyNkZWZpbmUgUlNWRF9GV19RVUVVRV9QQUdFX1ZJX1NISUZUCTB4MTAKKyNkZWZpbmUgUlNWRF9GV19RVUVVRV9QQUdFX1ZPX1NISUZUCTB4MTgKKyNkZWZpbmUgUlNWRF9GV19RVUVVRV9QQUdFX01HTlRfU0hJRlQJMHgxMAorI2RlZmluZSBSU1ZEX0ZXX1FVRVVFX1BBR0VfQ01EX1NISUZUCTB4MDgKKyNkZWZpbmUgUlNWRF9GV19RVUVVRV9QQUdFX0JDTl9TSElGVAkweDAwCisjZGVmaW5lIFJTVkRfRldfUVVFVUVfUEFHRV9QVUJfU0hJRlQJMHgwOAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjZGVmaW5lIEVQUk9NXzkzYzQ2IDAKKyNkZWZpbmUgRVBST01fOTNjNTYgMQorCisjZGVmaW5lIERFRkFVTFRfRlJBR19USFJFU0hPTEQgMjM0MlUKKyNkZWZpbmUgTUlOX0ZSQUdfVEhSRVNIT0xEICAgICAyNTZVCisjZGVmaW5lIERFRkFVTFRfQkVBQ09OSU5URVJWQUwgMHg2NFUKKyNkZWZpbmUgREVGQVVMVF9CRUFDT05fRVNTSUQgIlJ0bDgxOXhVIgorCisjZGVmaW5lIERFRkFVTFRfU1NJRCAiIgorI2RlZmluZSBERUZBVUxUX1JFVFJZX1JUUyA3CisjZGVmaW5lIERFRkFVTFRfUkVUUllfREFUQSA3CisjZGVmaW5lIFBSSVNNX0hEUl9TSVpFIDY0CisKKyNkZWZpbmUJCVBIWV9SU1NJX1NMSURfV0lOX01BWAkJCQkxMDAKKworCit0eXBlZGVmIGVudW0gX1dJUkVMRVNTX01PREUgeworCVdJUkVMRVNTX01PREVfVU5LTk9XTiA9IDB4MDAsCisJV0lSRUxFU1NfTU9ERV9BID0gMHgwMSwKKwlXSVJFTEVTU19NT0RFX0IgPSAweDAyLAorCVdJUkVMRVNTX01PREVfRyA9IDB4MDQsCisJV0lSRUxFU1NfTU9ERV9BVVRPID0gMHgwOCwKKwlXSVJFTEVTU19NT0RFX05fMjRHID0gMHgxMCwKKwlXSVJFTEVTU19NT0RFX05fNUcgPSAweDIwCit9IFdJUkVMRVNTX01PREU7CisKKworI2RlZmluZSBSVExfSU9DVExfV1BBX1NVUFBMSUNBTlQJCVNJT0NJV0ZJUlNUUFJJViszMAorCit0eXBlZGVmIHN0cnVjdCBidWZmZXIKK3sKKwlzdHJ1Y3QgYnVmZmVyICpuZXh0OworCXUzMiAqYnVmOworCit9IGJ1ZmZlcjsKKwordHlwZWRlZiBzdHJ1Y3QgcnRsX3JlZ19kZWJ1Z3sKKyAgICAgICAgdW5zaWduZWQgaW50ICBjbWQ7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYWRkcjsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHBhZ2U7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBsZW5ndGg7CisgICAgICAgIH0gaGVhZDsKKyAgICAgICAgdW5zaWduZWQgY2hhciBidWZbMHhmZl07Cit9cnRsX3JlZ19kZWJ1ZzsKKworCisKKworCisKK3R5cGVkZWYgc3RydWN0IF9ydF85eF90eF9yYXRlX2hpc3RvcnkgeworCXUzMiAgICAgICAgICAgICBjY2tbNF07CisJdTMyICAgICAgICAgICAgIG9mZG1bOF07CisJLy8gSFRfTUNTWzBdW106IEJXPTAgU0c9MAorCS8vIEhUX01DU1sxXVtdOiBCVz0xIFNHPTAKKwkvLyBIVF9NQ1NbMl1bXTogQlc9MCBTRz0xCisJLy8gSFRfTUNTWzNdW106IEJXPTEgU0c9MQorCXUzMiAgICAgICAgICAgICBodF9tY3NbNF1bMTZdOworfXJ0X3R4X3JhaGlzX3QsICpwcnRfdHhfcmFoaXNfdDsKK3R5cGVkZWYgc3RydWN0IF9SVF9TTU9PVEhfREFUQV80UkYgeworCWNoYXIgICAgZWxlbWVudHNbNF1bMTAwXTsvL2FycmF5IHRvIHN0b3JlIHZhbHVlcworCXUzMiAgICAgaW5kZXg7ICAgICAgICAgICAgICAgICAgLy9pbmRleCB0byBjdXJyZW50IGFycmF5IHRvIHN0b3JlCisJdTMyICAgICBUb3RhbE51bTsgICAgICAgICAgICAgICAvL251bSBvZiB2YWxpZCBlbGVtZW50cworCXUzMiAgICAgVG90YWxWYWxbNF07ICAgICAgICAgICAgLy9zdW0gb2YgdmFsaWQgZWxlbWVudHMKK31SVF9TTU9PVEhfREFUQV80UkYsICpQUlRfU01PT1RIX0RBVEFfNFJGOworCisjZGVmaW5lIE1BWF84MTkyVV9SWF9TSVpFCQkJODE5MiAgICAvLyBUaGlzIG1heWJlIGNoYW5nZWQgZm9yIEQtY3V0IGxhcmdlciBhZ2dyZWdhdGlvbiBzaXplCisvL3N0YXRzIHNlZW1zIG1lc3NlZCB1cCwgY2xlYW4gaXQgQVNBUAordHlwZWRlZiBzdHJ1Y3QgU3RhdHMKK3sKKwl1bnNpZ25lZCBsb25nIHR4cmR1OworLy8JdW5zaWduZWQgbG9uZyByeHJkdTsKKwkvL3Vuc2lnbmVkIGxvbmcgcnhub2xhc3Q7CisJLy91bnNpZ25lZCBsb25nIHJ4bm9kYXRhOworLy8JdW5zaWduZWQgbG9uZyByeHJlc2V0OworLy8JdW5zaWduZWQgbG9uZyByeG5vcG9pbnRlcjsKKwl1bnNpZ25lZCBsb25nIHJ4b2s7CisJdW5zaWduZWQgbG9uZyByeGZyYW1nbWVudDsKKwl1bnNpZ25lZCBsb25nIHJ4Y21kcGt0WzRdOwkJLy8wOC8wNS8wOCBhbXkgcnggY21kIGVsZW1lbnQgdHhmZWVkYmFjay9iY24gcmVwb3J0L2NmZyBzZXQvcXVlcnkKKwl1bnNpZ25lZCBsb25nIHJ4dXJiZXJyOworCXVuc2lnbmVkIGxvbmcgcnhzdGF0ZXJyOworCXVuc2lnbmVkIGxvbmcgcmVjZWl2ZWRfcmF0ZV9oaXN0b2dyYW1bNF1bMzJdOwkvLzA6IFRvdGFsLCAxOk9LLCAyOkNSQywgMzpJQ1YsIDIwMDcgMDcgMDMgY29zYQorCXVuc2lnbmVkIGxvbmcgcmVjZWl2ZWRfcHJlYW1ibGVfR0lbMl1bMzJdOwkJLy8wOiBMb25nIHByZWFtYmxlL0dJLCAxOlNob3J0IHByZWFtYmxlL0dJCisJdW5zaWduZWQgbG9uZyByeF9BTVBEVXNpemVfaGlzdG9ncmFtWzVdOyAvLyBsZXZlbDogKDw0SyksICg0S344SyksICg4S34xNkspLCAoMTZLfjMySyksICgzMkt+NjRLKQorCXVuc2lnbmVkIGxvbmcgcnhfQU1QRFVudW1faGlzdG9ncmFtWzVdOyAvLyBsZXZlbDogKDw1KSwgKDV+MTApLCAoMTB+MjApLCAoMjB+NDApLCAoPjQwKQorCXVuc2lnbmVkIGxvbmcgbnVtcGFja2V0X21hdGNoYnNzaWQ7CS8vIGRlYnVnIHVzZSBvbmx5LgorCXVuc2lnbmVkIGxvbmcgbnVtcGFja2V0X3Rvc2VsZjsJCS8vIGRlYnVnIHVzZSBvbmx5LgorCXVuc2lnbmVkIGxvbmcgbnVtX3Byb2Nlc3NfcGh5aW5mbzsJCS8vIGRlYnVnIHVzZSBvbmx5LgorCXVuc2lnbmVkIGxvbmcgbnVtcXJ5X3BoeXN0YXR1czsKKwl1bnNpZ25lZCBsb25nIG51bXFyeV9waHlzdGF0dXNDQ0s7CisJdW5zaWduZWQgbG9uZyBudW1xcnlfcGh5c3RhdHVzSFQ7CisJdW5zaWduZWQgbG9uZyByZWNlaXZlZF9id3R5cGVbNV07ICAgICAgICAgICAgICAvLzA6IDIwTSwgMTogZnVubjQwTSwgMjogdXBwZXIyME0sIDM6IGxvd2VyMjBNLCA0OiBkdXBsaWNhdGUKKwl1bnNpZ25lZCBsb25nIHR4bnBlcnI7CisJdW5zaWduZWQgbG9uZyB0eG5wZHJvcDsKKwl1bnNpZ25lZCBsb25nIHR4cmVzdW1lZDsKKy8vCXVuc2lnbmVkIGxvbmcgcnhlcnI7CisvLwl1bnNpZ25lZCBsb25nIHJ4b3ZlcmZsb3c7CisvLwl1bnNpZ25lZCBsb25nIHJ4aW50OworCXVuc2lnbmVkIGxvbmcgdHhucG9raW50OworLy8JdW5zaWduZWQgbG9uZyB0eGhwb2tpbnQ7CisvLwl1bnNpZ25lZCBsb25nIHR4aHBlcnI7CisvLwl1bnNpZ25lZCBsb25nIGludHM7CisvLwl1bnNpZ25lZCBsb25nIHNoaW50czsKKwl1bnNpZ25lZCBsb25nIHR4b3ZlcmZsb3c7CisvLwl1bnNpZ25lZCBsb25nIHJ4ZG1hZmFpbDsKKy8vCXVuc2lnbmVkIGxvbmcgdHhiZWFjb247CisvLwl1bnNpZ25lZCBsb25nIHR4YmVhY29uZXJyOworCXVuc2lnbmVkIGxvbmcgdHhscG9raW50OworCXVuc2lnbmVkIGxvbmcgdHhscGRyb3A7CisJdW5zaWduZWQgbG9uZyB0eGxwZXJyOworCXVuc2lnbmVkIGxvbmcgdHhiZW9raW50OworCXVuc2lnbmVkIGxvbmcgdHhiZWRyb3A7CisJdW5zaWduZWQgbG9uZyB0eGJlZXJyOworCXVuc2lnbmVkIGxvbmcgdHhia29raW50OworCXVuc2lnbmVkIGxvbmcgdHhia2Ryb3A7CisJdW5zaWduZWQgbG9uZyB0eGJrZXJyOworCXVuc2lnbmVkIGxvbmcgdHh2aW9raW50OworCXVuc2lnbmVkIGxvbmcgdHh2aWRyb3A7CisJdW5zaWduZWQgbG9uZyB0eHZpZXJyOworCXVuc2lnbmVkIGxvbmcgdHh2b29raW50OworCXVuc2lnbmVkIGxvbmcgdHh2b2Ryb3A7CisJdW5zaWduZWQgbG9uZyB0eHZvZXJyOworCXVuc2lnbmVkIGxvbmcgdHhiZWFjb25va2ludDsKKwl1bnNpZ25lZCBsb25nIHR4YmVhY29uZHJvcDsKKwl1bnNpZ25lZCBsb25nIHR4YmVhY29uZXJyOworCXVuc2lnbmVkIGxvbmcgdHhtYW5hZ2Vva2ludDsKKwl1bnNpZ25lZCBsb25nIHR4bWFuYWdlZHJvcDsKKwl1bnNpZ25lZCBsb25nIHR4bWFuYWdlZXJyOworCXVuc2lnbmVkIGxvbmcgdHhkYXRhcGt0OworCXVuc2lnbmVkIGxvbmcgdHhmZWVkYmFjazsKKwl1bnNpZ25lZCBsb25nIHR4ZmVlZGJhY2tvazsKKworCXVuc2lnbmVkIGxvbmcgdHhva3RvdGFsOworCXVuc2lnbmVkIGxvbmcgdHhva2J5dGVzdG90YWw7CisJdW5zaWduZWQgbG9uZyB0eG9raW5wZXJpb2Q7CisJdW5zaWduZWQgbG9uZyB0eG11bHRpY2FzdDsKKwl1bnNpZ25lZCBsb25nIHR4Ynl0ZXNtdWx0aWNhc3Q7CisJdW5zaWduZWQgbG9uZyB0eGJyb2FkY2FzdDsKKwl1bnNpZ25lZCBsb25nIHR4Ynl0ZXNicm9hZGNhc3Q7CisJdW5zaWduZWQgbG9uZyB0eHVuaWNhc3Q7CisJdW5zaWduZWQgbG9uZyB0eGJ5dGVzdW5pY2FzdDsKKworCXVuc2lnbmVkIGxvbmcgcnhva3RvdGFsOworCXVuc2lnbmVkIGxvbmcgcnhieXRlc3VuaWNhc3Q7CisJdW5zaWduZWQgbG9uZyB0eGZlZWRiYWNrZmFpbDsKKwl1bnNpZ25lZCBsb25nIHR4ZXJydG90YWw7CisJdW5zaWduZWQgbG9uZyB0eGVycmJ5dGVzdG90YWw7CisJdW5zaWduZWQgbG9uZyB0eGVycm11bHRpY2FzdDsKKwl1bnNpZ25lZCBsb25nIHR4ZXJyYnJvYWRjYXN0OworCXVuc2lnbmVkIGxvbmcgdHhlcnJ1bmljYXN0OworCXVuc2lnbmVkIGxvbmcgdHhyZXRyeWNvdW50OworCXVuc2lnbmVkIGxvbmcgdHhmZWVkYmFja3JldHJ5OworCXU4CSAgICAgIGxhc3RfcGFja2V0X3JhdGU7CisJdW5zaWduZWQgbG9uZyBzbGlkZV9zaWduYWxfc3RyZW5ndGhbMTAwXTsKKwl1bnNpZ25lZCBsb25nIHNsaWRlX2V2bVsxMDBdOworCXVuc2lnbmVkIGxvbmcgc2xpZGVfcnNzaV90b3RhbDsJLy8gRm9yIHJlY29yZGluZyBzbGlkaW5nIHdpbmRvdydzIFJTU0kgdmFsdWUKKwl1bnNpZ25lZCBsb25nIHNsaWRlX2V2bV90b3RhbDsJLy8gRm9yIHJlY29yZGluZyBzbGlkaW5nIHdpbmRvdydzIEVWTSB2YWx1ZQorCWxvbmcgc2lnbmFsX3N0cmVuZ3RoOyAvLyBUcmFuc2Zvcm1lZCwgaW4gZGJtLiBCZWF1dGlmaWVkIHNpZ25hbCBzdHJlbmd0aCBmb3IgVUksIG5vdCBjb3JyZWN0LgorCWxvbmcgc2lnbmFsX3F1YWxpdHk7CisJbG9uZyBsYXN0X3NpZ25hbF9zdHJlbmd0aF9pbnBlcmNlbnQ7CisJbG9uZyByZWN2X3NpZ25hbF9wb3dlcjsJLy8gQ29ycmVjdCBzbW9vdGhlZCBzcyBpbiBEYm0sIG9ubHkgdXNlZCBpbiBkcml2ZXIgdG8gcmVwb3J0IHJlYWwgcG93ZXIgbm93LgorCXU4IHJ4X3Jzc2lfcGVyY2VudGFnZVs0XTsKKwl1OCByeF9ldm1fcGVyY2VudGFnZVsyXTsKKwlsb25nIHJ4U05SZEJbNF07CisJcnRfdHhfcmFoaXNfdCB0eHJhdGU7CisJdTMyIFNsaWRlX0JlYWNvbl9wd2RiWzEwMF07ICAgICAvL2Nvc2EgYWRkIGZvciBiZWFjb24gcnNzaQorCXUzMiBTbGlkZV9CZWFjb25fVG90YWw7ICAgICAgICAgLy9jb3NhIGFkZCBmb3IgYmVhY29uIHJzc2kKKwlSVF9TTU9PVEhfREFUQV80UkYgICAgICAgICAgICAgIGNja19hZGNfcHdkYjsKKworCXUzMglDdXJyZW50U2hvd1R4YXRlOworfSBTdGF0czsKKworCisvLyBCYW5kd2lkdGggT2Zmc2V0CisjZGVmaW5lIEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkUJCTAKKyNkZWZpbmUgSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0xPV0VSCQkJMQorI2RlZmluZSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfVVBQRVIJCQkyCisKKy8vK2J5IGFteSAwODA1MDcKKwordHlwZWRlZiBzdHJ1Y3QgCUNobmxBY2Nlc3NTZXR0aW5nIHsKKwl1MTYgU0lGU19UaW1lcjsKKwl1MTYgRElGU19UaW1lcjsKKwl1MTYgU2xvdFRpbWVUaW1lcjsKKwl1MTYgRUlGU19UaW1lcjsKKwl1MTYgQ1dtaW5JbmRleDsKKwl1MTYgQ1dtYXhJbmRleDsKK30qUENIQU5ORUxfQUNDRVNTX1NFVFRJTkcsQ0hBTk5FTF9BQ0NFU1NfU0VUVElORzsKKwordHlwZWRlZiBzdHJ1Y3QgX0JCX1JFR0lTVEVSX0RFRklOSVRJT057CisJdTMyIHJmaW50ZnM7IAkJCS8vIHNldCBzb2Z0d2FyZSBjb250cm9sOiAvLwkJMHg4NzB+MHg4NzdbOCBieXRlc10KKwl1MzIgcmZpbnRmaTsgCQkJLy8gcmVhZGJhY2sgZGF0YTogLy8JCTB4OGUwfjB4OGU3WzggYnl0ZXNdCisJdTMyIHJmaW50Zm87IAkJCS8vIG91dHB1dCBkYXRhOiAvLwkJMHg4NjB+MHg4NmYgWzE2IGJ5dGVzXQorCXUzMiByZmludGZlOyAJCQkvLyBvdXRwdXQgZW5hYmxlOiAvLwkJMHg4NjB+MHg4NmYgWzE2IGJ5dGVzXQorCXUzMiByZjN3aXJlT2Zmc2V0OyAJCS8vIExTU0kgZGF0YTogLy8JCTB4ODQwfjB4ODRmIFsxNiBieXRlc10KKwl1MzIgcmZMU1NJX1NlbGVjdDsgCQkvLyBCQiBCYW5kIFNlbGVjdDogLy8JCTB4ODc4fjB4ODdmIFs4IGJ5dGVzXQorCXUzMiByZlR4R2FpblN0YWdlOwkJLy8gVHggZ2FpbiBzdGFnZTogLy8JCTB4ODBjfjB4ODBmIFs0IGJ5dGVzXQorCXUzMiByZkhTU0lQYXJhMTsgCQkvLyB3aXJlIHBhcmFtZXRlciBjb250cm9sMSA6IC8vCQkweDgyMH4weDgyMywweDgyOH4weDgyYiwgMHg4MzB+MHg4MzMsIDB4ODM4fjB4ODNiIFsxNiBieXRlc10KKwl1MzIgcmZIU1NJUGFyYTI7IAkJLy8gd2lyZSBwYXJhbWV0ZXIgY29udHJvbDIgOiAvLwkJMHg4MjR+MHg4MjcsMHg4MmN+MHg4MmYsIDB4ODM0fjB4ODM3LCAweDgzY34weDgzZiBbMTYgYnl0ZXNdCisJdTMyIHJmU3dpdGNoQ29udHJvbDsgCS8vVHggUnggYW50ZW5uYSBjb250cm9sIDogLy8JCTB4ODU4fjB4ODVmIFsxNiBieXRlc10KKwl1MzIgcmZBR0NDb250cm9sMTsgCS8vQUdDIHBhcmFtZXRlciBjb250cm9sMSA6IC8vCQkweGM1MH4weGM1MywweGM1OH4weGM1YiwgMHhjNjB+MHhjNjMsIDB4YzY4fjB4YzZiIFsxNiBieXRlc10KKwl1MzIgcmZBR0NDb250cm9sMjsgCS8vQUdDIHBhcmFtZXRlciBjb250cm9sMiA6IC8vCQkweGM1NH4weGM1NywweGM1Y34weGM1ZiwgMHhjNjR+MHhjNjcsIDB4YzZjfjB4YzZmIFsxNiBieXRlc10KKwl1MzIgcmZSeElRSW1iYWxhbmNlOyAJLy9PRkRNIFJ4IElRIGltYmFsYW5jZSBtYXRyaXggOiAvLwkJMHhjMTR+MHhjMTcsMHhjMWN+MHhjMWYsIDB4YzI0fjB4YzI3LCAweGMyY34weGMyZiBbMTYgYnl0ZXNdCisJdTMyIHJmUnhBRkU7ICAJCQkvL1J4IElRIERDIG9mc2V0IGFuZCBSeCBkaWdpdGFsIGZpbHRlciwgUnggREMgbm90Y2ggZmlsdGVyIDogLy8JCTB4YzEwfjB4YzEzLDB4YzE4fjB4YzFiLCAweGMyMH4weGMyMywgMHhjMjh+MHhjMmIgWzE2IGJ5dGVzXQorCXUzMiByZlR4SVFJbWJhbGFuY2U7IAkvL09GRE0gVHggSVEgaW1iYWxhbmNlIG1hdHJpeCAvLwkJMHhjODB+MHhjODMsMHhjODh+MHhjOGIsIDB4YzkwfjB4YzkzLCAweGM5OH4weGM5YiBbMTYgYnl0ZXNdCisJdTMyIHJmVHhBRkU7IAkJCS8vVHggSVEgREMgT2Zmc2V0IGFuZCBUeCBERklSIHR5cGUgLy8JCTB4Yzg0fjB4Yzg3LDB4YzhjfjB4YzhmLCAweGM5NH4weGM5NywgMHhjOWN+MHhjOWYgWzE2IGJ5dGVzXQorCXUzMiByZkxTU0lSZWFkQmFjazsgCS8vTFNTSSBSRiByZWFkYmFjayBkYXRhIC8vCQkweDhhMH4weDhhZiBbMTYgYnl0ZXNdCit9QkJfUkVHSVNURVJfREVGSU5JVElPTl9ULCAqUEJCX1JFR0lTVEVSX0RFRklOSVRJT05fVDsKKwordHlwZWRlZiBlbnVtIF9SVF9SRl9UWVBFXzgxOXhVeworICAgICAgICBSRl9UWVBFX01JTiA9IDAsCisgICAgICAgIFJGXzgyMjUsCisgICAgICAgIFJGXzgyNTYsCisgICAgICAgIFJGXzgyNTgsCisgICAgICAgIFJGX1BTRVVET18xMU4gPSA0LAorfVJUX1JGX1RZUEVfODE5eFUsICpQUlRfUkZfVFlQRV84MTl4VTsKKwordHlwZWRlZiBzdHJ1Y3QgX3JhdGVfYWRhcHRpdmUKK3sKKwl1OAkJCQlyYXRlX2FkYXB0aXZlX2Rpc2FibGVkOworCXU4CQkJCXJhdHJfc3RhdGU7CisJdTE2CQkJCXJlc2VydmU7CisKKwl1MzIJCQkJaGlnaF9yc3NpX3RocmVzaF9mb3JfcmE7CisJdTMyCQkJCWhpZ2gybG93X3Jzc2lfdGhyZXNoX2Zvcl9yYTsKKwl1OAkJCQlsb3cyaGlnaF9yc3NpX3RocmVzaF9mb3JfcmE0ME07CisJdTMyCQkJCWxvd19yc3NpX3RocmVzaF9mb3JfcmE0ME07CisJdTgJCQkJbG93MmhpZ2hfcnNzaV90aHJlc2hfZm9yX3JhMjBNOworCXUzMgkJCQlsb3dfcnNzaV90aHJlc2hfZm9yX3JhMjBNOworCXUzMgkJCQl1cHBlcl9yc3NpX3RocmVzaG9sZF9yYXRyOworCXUzMgkJCQltaWRkbGVfcnNzaV90aHJlc2hvbGRfcmF0cjsKKwl1MzIJCQkJbG93X3Jzc2lfdGhyZXNob2xkX3JhdHI7CisJdTMyCQkJCWxvd19yc3NpX3RocmVzaG9sZF9yYXRyXzQwTTsKKwl1MzIJCQkJbG93X3Jzc2lfdGhyZXNob2xkX3JhdHJfMjBNOworCXU4CQkJCXBpbmdfcnNzaV9lbmFibGU7CS8vY29zYSBhZGQgZm9yIHRlc3QKKwl1MzIJCQkJcGluZ19yc3NpX3JhdHI7CS8vY29zYSBhZGQgZm9yIHRlc3QKKwl1MzIJCQkJcGluZ19yc3NpX3RocmVzaF9mb3JfcmE7Ly9jb3NhIGFkZCBmb3IgdGVzdAorCXUzMgkJCQlsYXN0X3JhdHI7CisKK30gcmF0ZV9hZGFwdGl2ZSwgKnByYXRlX2FkYXB0aXZlOworCisjZGVmaW5lIFR4QkJHYWluVGFibGVMZW5ndGggMzcKKyNkZWZpbmUJQ0NLVHhCQkdhaW5UYWJsZUxlbmd0aCAyMworCit0eXBlZGVmIHN0cnVjdCBfdHhiYmdhaW5fc3RydWN0Cit7CisJbG9uZwl0eGJiX2lxX2FtcGxpZnlnYWluOworCXUzMgl0eGJiZ2Fpbl92YWx1ZTsKK30gdHhiYmdhaW5fc3RydWN0LCAqcHR4YmJnYWluX3N0cnVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2Nja3R4YmJnYWluX3N0cnVjdAoreworCS8vVGhlIFZhbHVlIGlzIGZyb20gYTIyIHRvIGEyOSBvbmUgQnl0ZSBvbmUgdGltZSBpcyBtdWNoIFNhZmVyCisJdTgJY2NrdHhiYl92YWx1ZWFycmF5WzhdOworfSBjY2t0eGJiZ2Fpbl9zdHJ1Y3QsKnBjY2t0eGJiZ2Fpbl9zdHJ1Y3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgX2luaXRfZ2FpbgoreworCXU4CQkJCXhhYWdjY29yZTE7CisJdTgJCQkJeGJhZ2Njb3JlMTsKKwl1OAkJCQl4Y2FnY2NvcmUxOworCXU4CQkJCXhkYWdjY29yZTE7CisJdTgJCQkJY2NhOworCit9IGluaXRfZ2FpbiwgKnBpbml0X2dhaW47CisvL2J5IGFteSAwNjA2CisKK3R5cGVkZWYgc3RydWN0IF9waHlfb2ZkbV9yeF9zdGF0dXNfcmVwb3J0XzgxOXh1c2IKK3sKKwl1OAl0cnN3X2dhaW5fWFs0XTsKKwl1OAlwd2RiX2FsbDsKKwl1OAljZm9zaG9fWFs0XTsKKwl1OAljZm90YWlsX1hbNF07CisJdTgJcnhldm1fWFsyXTsKKwl1OAlyeHNucl9YWzRdOworCXU4CXBkc25yX1hbMl07CisJdTgJY3NpX2N1cnJlbnRfWFsyXTsKKwl1OAljc2lfdGFyZ2V0X1hbMl07CisJdTgJc2lnZXZtOworCXU4CW1heF9leF9wd3I7CisJdTgJc2dpX2VuOworCXU4ICByeHNjX3NnaWVuX2V4ZmxnOworfXBoeV9zdHNfb2ZkbV84MTl4dXNiX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9waHlfY2NrX3J4X3N0YXR1c19yZXBvcnRfODE5eHVzYgoreworCS8qIEZvciBDQ0sgcmF0ZSBkZXNjcmlwdG9yLiBUaGlzIGlzIGEgdW5zaWduZWQgODoxIHZhcmlhYmxlLiBMU0IgYml0IHByZXNlbmQKKwkgICAwLjUuIEFuZCBNU0IgNyBidHMgcHJlc2VuZCBhIHNpZ25lZCB2YWx1ZS4gUmFuZ2UgZnJvbSAtNjR+KzYzLjUuICovCisJdTgJYWRjX3B3ZGJfWFs0XTsKKwl1OAlzcV9ycHQ7CisJdTgJY2NrX2FnY19ycHQ7Cit9cGh5X3N0c19jY2tfODE5eHVzYl90OworCisKK3R5cGVkZWYgc3RydWN0IF9waHlfb2ZkbV9yeF9zdGF0dXNfcnhzY19zZ2llbl9leGludGZmbGFneworCXU4CQkJcmVzZXJ2ZWQ6NDsKKwl1OAkJCXJ4c2M6MjsKKwl1OAkJCXNnaV9lbjoxOworCXU4CQkJZXhfaW50Zl9mbGFnOjE7Cit9cGh5X29mZG1fcnhfc3RhdHVzX3J4c2Nfc2dpZW5fZXhpbnRmZmxhZzsKKwordHlwZWRlZiBlbnVtIF9SVF9DVVNUT01FUl9JRAoreworCVJUX0NJRF9ERUZBVUxUID0gMCwKKwlSVF9DSURfODE4N19BTFBIQTAgPSAxLAorCVJUX0NJRF84MTg3X1NFUkNPTU1fUFMgPSAyLAorCVJUX0NJRF84MTg3X0hXX0xFRCA9IDMsCisJUlRfQ0lEXzgxODdfTkVUR0VBUiA9IDQsCisJUlRfQ0lEX1dIUUwgPSA1LAorCVJUX0NJRF84MTl4X0NBTUVPICA9IDYsCisJUlRfQ0lEXzgxOXhfUlVOVE9QID0gNywKKwlSVF9DSURfODE5eF9TZW5hbyA9IDgsCisJUlRfQ0lEX1RPU0hJQkEgPSA5LAkvLyBNZXJnZSBieSBKYWNrZW4sIDIwMDgvMDEvMzEuCisJUlRfQ0lEXzgxOXhfTmV0Y29yZSA9IDEwLAorCVJUX0NJRF9OZXR0cm9uaXggPSAxMSwKKwlSVF9DSURfRExJTksgPSAxMiwKKwlSVF9DSURfUFJPTkVUID0gMTMsCit9UlRfQ1VTVE9NRVJfSUQsICpQUlRfQ1VTVE9NRVJfSUQ7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIExFRCBjdXN0b21pemF0aW9uLgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit0eXBlZGVmCWVudW0gX0xFRF9TVFJBVEVHWV84MTkweworCVNXX0xFRF9NT0RFMCwgLy8gU1cgY29udHJvbCAxIExFRCB2aWEgR1BJTzAuIEl0IGlzIGRlZmF1bHQgb3B0aW9uLgorCVNXX0xFRF9NT0RFMSwgLy8gU1cgY29udHJvbCBmb3IgUENJIEV4cHJlc3MKKwlTV19MRURfTU9ERTIsIC8vIFNXIGNvbnRyb2wgZm9yIENhbWVvLgorCVNXX0xFRF9NT0RFMywgLy8gU1cgY29udG9ybCBmb3IgUnVuVG9wLgorCVNXX0xFRF9NT0RFNCwgLy8gU1cgY29udHJvbCBmb3IgTmV0Y29yZQorCUhXX0xFRCwgLy8gSFcgY29udHJvbCAyIExFRHMsIExFRDAgYW5kIExFRDEgKHRoZXJlIGFyZSA0IGRpZmZlcmVudCBjb250cm9sIG1vZGVzKQorfUxFRF9TVFJBVEVHWV84MTkwLCAqUExFRF9TVFJBVEVHWV84MTkwOworCit0eXBlZGVmIGVudW0gX1JFU0VUX1RZUEUgeworCVJFU0VUX1RZUEVfTk9SRVNFVCA9IDB4MDAsCisJUkVTRVRfVFlQRV9OT1JNQUwgPSAweDAxLAorCVJFU0VUX1RZUEVfU0lMRU5UID0gMHgwMgorfSBSRVNFVF9UWVBFOworCisvKiBUaGUgc2ltcGxlIHR4IGNvbW1hbmQgT1AgY29kZS4gKi8KK3R5cGVkZWYgZW51bSBfdGFnX1R4Q21kX0NvbmZpZ19JbmRleHsKKwlUWENNRF9UWFJBX0hJU1RPUllfQ1RSTAkJCQk9IDB4RkY5MDAwMDAsCisJVFhDTURfUkVTRVRfVFhfUEtUX0JVRkYJCQkJPSAweEZGOTAwMDAxLAorCVRYQ01EX1JFU0VUX1JYX1BLVF9CVUZGCQkJCT0gMHhGRjkwMDAwMiwKKwlUWENNRF9TRVRfVFhfRFVSQVRJT04JCQkJPSAweEZGOTAwMDAzLAorCVRYQ01EX1NFVF9SWF9SU1NJCQkJCQkJPSAweEZGOTAwMDA0LAorCVRYQ01EX1NFVF9UWF9QV1JfVFJBQ0tJTkcJCQk9IDB4RkY5MDAwMDUsCisJVFhDTURfWFhYWF9DVFJMLAorfURDTURfVFhDTURfT1A7CisKK3R5cGVkZWYgc3RydWN0IHI4MTkyX3ByaXYKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwkvL2FkZGVkIGZvciBtYWludGFpbiBpbmZvIGZyb20gZWVwcm9tCisJc2hvcnQgZXByb210eXBlOworCXUxNiBlZXByb21fdmlkOworCXUxNiBlZXByb21fcGlkOworCXU4ICBlZXByb21fQ3VzdG9tZXJJRDsKKwl1OCAgZWVwcm9tX0NoYW5uZWxQbGFuOworCVJUX0NVU1RPTUVSX0lEIEN1c3RvbWVySUQ7CisJTEVEX1NUUkFURUdZXzgxOTAJTGVkU3RyYXRlZ3k7CisJdTggIHR4cXVldWVfdG9fb3V0cGlwZW1hcFs5XTsKKwlpbnQgaXJxOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlODAyMTE7CisKKwlzaG9ydCBjYXJkXzgxOTI7IC8qIE86IHJ0bDgxOTIsIDE6cnRsODE4NSBWIEIvQywgMjpydGw4MTg1IFYgRCAqLworCXU4IGNhcmRfODE5Ml92ZXJzaW9uOyAvKiBpZiBUQ1IgcmVwb3J0cyBjYXJkIFYgQi9DIHRoaXMgZGlzY3JpbWluYXRlcyAqLworLy8Jc2hvcnQgcGh5X3ZlcjsgLyogbWVhbmluZ2Z1bCBmb3IgcnRsODIyNSAxOkEgMjpCIDM6QyAqLworCXNob3J0IGVuYWJsZV9ncGlvMDsKKwllbnVtIGNhcmRfdHlwZSB7UENJLE1JTklQQ0ksQ0FSREJVUyxVU0J9Y2FyZF90eXBlOworCXNob3J0IGh3X3BsY3BfbGVuOworCXNob3J0IHBsY3BfcHJlYW1ibGVfbW9kZTsKKworCXNwaW5sb2NrX3QgaXJxX2xvY2s7CisvLwlzcGlubG9ja190IGlycV90aF9sb2NrOworCXNwaW5sb2NrX3QgdHhfbG9jazsKKyAgICAgICAgc3RydWN0IG11dGV4IG11dGV4OworCS8vc3BpbmxvY2tfdCByZl9sb2NrOyAvL3VzZWQgdG8gbG9jayByZiB3cml0ZSBvcGVyYXRpb24gYWRkZWQgYnkgd2IKKworCXUxNiBpcnFfbWFzazsKKy8vCXNob3J0IGlycV9lbmFibGVkOworLy8Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsgLy9jb21tZW50IHRoaXMgb3V0LgorCXNob3J0IGNoYW47CisJc2hvcnQgc2VuczsKKwlzaG9ydCBtYXhfc2VuczsKKworCisJLy8JdTggY2h0eHB3clsxNV07IC8vY2hhbm5lbHMgZnJvbSAxIHRvIDE0LCAwIG5vdCB1c2VkCisvLwl1OCBjaHR4cHdyX29mZG1bMTVdOyAvL2NoYW5uZWxzIGZyb20gMSB0byAxNCwgMCBub3QgdXNlZAorLy8JdTggY2NrX3R4cHdyX2Jhc2U7CisvLwl1OCBvZmRtX3R4cHdyX2Jhc2U7CisvLwl1OCBjaGFsbG93WzE1XTsgLy9jaGFubmVscyBmcm9tIDEgdG8gMTQsIDAgbm90IHVzZWQKKwlzaG9ydCB1cDsKKwlzaG9ydCBjcmNtb247IC8vaWYgMSBhbGxvdyBiYWQgY3JjIGZyYW1lIHJlY2VwdGlvbiBpbiBtb25pdG9yIG1vZGUKKy8vCXNob3J0IHByaXNtX2hkcjsKKworLy8Jc3RydWN0IHRpbWVyX2xpc3Qgc2Nhbl90aW1lcjsKKwkvKnNob3J0IHNjYW5wZW5kaW5nOworCXNob3J0IHN0b3BzY2FuOyovCisvLwlzcGlubG9ja190IHNjYW5fbG9jazsKKy8vCXU4IGFjdGl2ZV9wcm9iZTsKKwkvL3U4IGFjdGl2ZV9zY2FuX251bTsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHd4X3NlbTsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHJmX3NlbTsgLy91c2VkIHRvIGxvY2sgcmYgd3JpdGUgb3BlcmF0aW9uIGFkZGVkIGJ5IHdiLCBtb2RpZmllZCBieSBkYXZpZAorLy8Jc2hvcnQgaHdfd2VwOworCisvLwlzaG9ydCBkaWdwaHk7CisvLwlzaG9ydCBhbnRiOworLy8Jc2hvcnQgZGl2ZXJzaXR5OworLy8JdTggY3NfdHJlc2hvbGQ7CisvLwlzaG9ydCByY3JfY3NlbnNlOworCXU4IHJmX3R5cGU7IC8vMCBtZWFucyAxVDJSLCAxIG1lYW5zIDJUNFIKKwlSVF9SRl9UWVBFXzgxOXhVIHJmX2NoaXA7CisKKy8vCXUzMiBrZXkwWzRdOworCXNob3J0ICgqcmZfc2V0X3NlbnMpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgc2Vucyk7CisJdTggKCpyZl9zZXRfY2hhbikoc3RydWN0IG5ldF9kZXZpY2UgKmRldix1OCBjaCk7CisJdm9pZCAoKnJmX2Nsb3NlKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqcmZfaW5pdCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJLy9zaG9ydCByYXRlOworCXNob3J0IHByb21pc2M7CisJLypzdGF0cyovCisJc3RydWN0IFN0YXRzIHN0YXRzOworCXN0cnVjdCBpd19zdGF0aXN0aWNzIHdzdGF0czsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRpcl9kZXY7CisKKwkvKlJYIHN0dWZmKi8KKy8vCXUzMiAqcnhyaW5nOworLy8JdTMyICpyeHJpbmd0YWlsOworLy8JZG1hX2FkZHJfdCByeHJpbmdkbWE7CisJc3RydWN0IHVyYiAqKnJ4X3VyYjsKKwlzdHJ1Y3QgdXJiICoqcnhfY21kX3VyYjsKKyNpZmRlZiBUSE9NQVNfQkVBQ09OCisJdTMyICpvbGRhZGRyOworI2VuZGlmCisjaWZkZWYgVEhPTUFTX1RBU0tMRVQKKwlhdG9taWNfdCBpcnRfY291bnRlcjsvL2NvdW50IGZvciBpcnFfcnhfdGFza2xldAorI2VuZGlmCisjaWZkZWYgSkFDS1NPTl9ORVdfUlgKKyAgICAgICAgc3RydWN0IHNrX2J1ZmYgKipwcF9yeHNrYjsKKyAgICAgICAgaW50ICAgICByeF9pbng7CisjZW5kaWYKKworLyogbW9kaWZpZWQgYnkgZGF2YWQgZm9yIFJ4IHByb2Nlc3MgKi8KKyAgICAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHJ4X3F1ZXVlOworICAgICAgIHN0cnVjdCBza19idWZmX2hlYWQgc2tiX3F1ZXVlOworICAgICAgIHN0cnVjdCB3b3JrX3N0cnVjdCBxb3NfYWN0aXZhdGU7CisJc2hvcnQgIHR4X3VyYl9pbmRleDsKKwlhdG9taWNfdCB0eF9wZW5kaW5nWzB4MTBdOy8vVUFSVF9QUklPUklUWSsxCisKKworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBpcnFfcnhfdGFza2xldDsKKwlzdHJ1Y3QgdXJiICpyeHVyYl90YXNrOworCisJLy8yIFR4IFJlbGF0ZWQgdmFyaWFibGVzCisJdTE2CVNob3J0UmV0cnlMaW1pdDsKKwl1MTYJTG9uZ1JldHJ5TGltaXQ7CisJdTMyCVRyYW5zbWl0Q29uZmlnOworCXU4CVJlZ0NXaW5NaW47CQkvLyBGb3IgdHVyYm8gbW9kZSBDVyBhZGFwdGl2ZS4gQWRkZWQgYnkgQW5uaWUsIDIwMDUtMTAtMjcuCisKKwl1MzIgICAgIExhc3RSeERlc2NUU0ZIaWdoOworCXUzMiAgICAgTGFzdFJ4RGVzY1RTRkxvdzsKKworCisJLy8yIFJ4IFJlbGF0ZWQgdmFyaWFibGVzCisJdTE2CUVhcmx5UnhUaHJlc2hvbGQ7CisJdTMyCVJlY2VpdmVDb25maWc7CisJdTgJQWNtQ29udHJvbDsKKworCXU4CVJGUHJvZ1R5cGU7CisKKwl1OCByZXRyeV9kYXRhOworCXU4IHJldHJ5X3J0czsKKwl1MTYgcnRzOworCisJc3RydWN0IAlDaG5sQWNjZXNzU2V0dGluZyAgQ2hhbm5lbEFjY2Vzc1NldHRpbmc7CisJc3RydWN0IHdvcmtfc3RydWN0IHJlc2V0X3dxOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvL2ZvciBydGw4MTl4VXNiCisJdTE2ICAgICBiYXNpY19yYXRlOworCXU4ICAgICAgc2hvcnRfcHJlYW1ibGU7CisJdTggICAgICBzbG90X3RpbWU7CisJYm9vbCAJYkRjdXQ7CisJYm9vbCBiQ3VycmVudFJ4QWdnckVuYWJsZTsKKwl1OCBSZl9Nb2RlOyAvL2FkZCBmb3IgRmlybXdhcmUgUkYgLVIvVyBzd2l0Y2gKKwlwcnRfZmlybXdhcmUJCXBGaXJtd2FyZTsKKwlydGw4MTl4VXNiX2xvb3BiYWNrX2UJTG9vcGJhY2tNb2RlOworCWZpcm13YXJlX3NvdXJjZV9lCWZpcm13YXJlX3NvdXJjZTsKKwl1MTYgRUVQUk9NVHhQb3dlckRpZmY7CisJdTggRUVQUk9NVGhlcm1hbE1ldGVyOworCXU4IEVFUFJPTVB3RGlmZjsKKwl1OCBFRVBST01DcnlzdGFsQ2FwOworCXU4IEVFUFJPTV9EZWZfVmVyOworCXU4IEVFUFJPTVR4UG93ZXJMZXZlbENDSzsvLyBDQ0sgY2hhbm5lbCAxfjE0CisJdTggRUVQUk9NVHhQb3dlckxldmVsQ0NLX1YxWzNdOworCXU4IEVFUFJPTVR4UG93ZXJMZXZlbE9GRE0yNEdbM107IC8vIE9GRE0gMi40RyBjaGFubmVsIDF+MTQKKwl1OCBFRVBST01UeFBvd2VyTGV2ZWxPRkRNNUdbMjRdOwkvLyBPRkRNIDVHCisKKy8qUEhZIHJlbGF0ZWQqLworCUJCX1JFR0lTVEVSX0RFRklOSVRJT05fVAlQSFlSZWdEZWZbNF07CS8vUmFkaW8gQS9CL0MvRAorCS8vIFJlYWQvd3JpdGUgYXJlIGFsbG93IGZvciBmb2xsb3dpbmcgaGFyZHdhcmUgaW5mb3JtYXRpb24gdmFyaWFibGVzCisJdTMyCU1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WzZdOworCXUzMglDQ0tUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldDsKKwl1OAlUeFBvd2VyTGV2ZWxDQ0tbMTRdOwkJCS8vIENDSyBjaGFubmVsIDF+MTQKKwl1OAlUeFBvd2VyTGV2ZWxPRkRNMjRHWzE0XTsJCS8vIE9GRE0gMi40RyBjaGFubmVsIDF+MTQKKwl1OAlUeFBvd2VyTGV2ZWxPRkRNNUdbMTRdOwkJCS8vIE9GRE0gNUcKKwl1MzIJUHdyX1RyYWNrOworCXU4CVR4UG93ZXJEaWZmOworCXU4CUFudGVubmFUeFB3RGlmZlsyXTsJCQkJLy8gQW50ZW5uYSBnYWluIG9mZnNldCwgaW5kZXggMCBmb3IgQiwgMSBmb3IgQywgYW5kIDIgZm9yIEQKKwl1OAlDcnlzdGFsQ2FwOwkJCQkJCS8vIENyeXN0YWxDYXAuCisJdTgJVGhlcm1hbE1ldGVyWzJdOwkJCQkvLyBUaGVybWFsTWV0ZXIsIGluZGV4IDAgZm9yIFJGSUMwLCBhbmQgMSBmb3IgUkZJQzEKKworCXU4CUNja1B3RW5sOworCS8vIFVzZSB0byBjYWxjdWxhdGUgUFdCRC4KKwl1OAliQ2NrSGlnaFBvd2VyOworCWxvbmcJdW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYjsKKworCS8vZm9yIHNldCBjaGFubmVsCisJdTgJU3dDaG5sSW5Qcm9ncmVzczsKKwl1OCAJU3dDaG5sU3RhZ2U7CisJdTgJU3dDaG5sU3RlcDsKKwl1OAlTZXRCV01vZGVJblByb2dyZXNzOworCUhUX0NIQU5ORUxfV0lEVEgJCUN1cnJlbnRDaGFubmVsQlc7CisJdTggICAgICBDaGFubmVsUGxhbjsKKwkvLyA4MTkwIDQwTUh6IG1vZGUKKwkvLworCXU4CW5DdXI0ME1oelByaW1lU0M7CS8vIENvbnRyb2wgY2hhbm5lbCBzdWItY2FycmllcgorCS8vIEpvc2VwaCB0ZXN0IGZvciBzaG9ydGVuIFJGIGNvbmZpZ3VyYXRpb24gdGltZS4KKwkvLyBXZSBzYXZlIFJGIHJlZzAgaW4gdGhpcyB2YXJpYWJsZSB0byByZWR1Y2UgUkYgcmVhZGluZy4KKwkvLworCXUzMgkJCQkJUmZSZWcwVmFsdWVbNF07CisJdTggCQkJCQlOdW1Ub3RhbFJGUGF0aDsKKwlib29sIAkJCQlicmZwYXRoX3J4ZW5hYmxlWzRdOworCS8vUkYgc2V0IHJlbGF0ZWQKKwlib29sCQkJCVNldFJGUG93ZXJTdGF0ZUluUHJvZ3Jlc3M7CisvLytieSBhbXkgMDgwNTA3CisJc3RydWN0IHRpbWVyX2xpc3Qgd2F0Y2hfZG9nX3RpbWVyOworCisvLytieSBhbXkgMDgwNTE1IGZvciBkeW5hbWljIG1lY2hlbmlzbQorCS8vQWRkIGJ5IGFteSBUeCBQb3dlciBDb250cm9sIGZvciBOZWFyL0ZhciBSYW5nZSAyMDA4LzA1LzE1CisJYm9vbAliZHluYW1pY190eHBvd2VyOyAgLy9iRHluYW1pY1R4UG93ZXIKKwlib29sCWJEeW5hbWljVHhIaWdoUG93ZXI7ICAvLyBUeCBoaWdoIHBvd2VyIHN0YXRlCisJYm9vbAliRHluYW1pY1R4TG93UG93ZXI7ICAvLyBUeCBsb3cgcG93ZXIgc3RhdGUKKwlib29sCWJMYXN0RFRQRmxhZ19IaWdoOworCWJvb2wJYkxhc3REVFBGbGFnX0xvdzsKKworCWJvb2wJYnN0b3JlX2xhc3RfZHRwZmxhZzsKKwlib29sCWJzdGFydF90eGN0cmxfYnlkdHA7ICAgLy9EZWZpbmUgdG8gZGlzY3JpbWluYXRlIG9uIEhpZ2ggcG93ZXIgU3RhdGUgb3Igb24gc2l0ZXN1dmV5IHRvIGNoYW5nZSBUeCBnYWluIGluZGV4CisJLy9BZGQgYnkgYW15IGZvciBSYXRlIEFkYXB0aXZlCisJcmF0ZV9hZGFwdGl2ZSByYXRlX2FkYXB0aXZlOworCS8vQWRkIGJ5IGFteSBmb3IgVFggcG93ZXIgdHJhY2tpbmcKKwkvLzIwMDgvMDUvMTUgIE1hcnMgT1BFTi9DTE9TRSBUWCBQT1dFUiBUUkFDS0lORworICAgICAgIHR4YmJnYWluX3N0cnVjdCB0eGJiZ2Fpbl90YWJsZVtUeEJCR2FpblRhYmxlTGVuZ3RoXTsKKwl1OAkJCSAgIHR4cG93ZXJfY291bnQ7Ly9Gb3IgNiBzZWMgZG8gdHJhY2tpbmcgYWdhaW4KKwlib29sCQkJICAgYnR4cG93ZXJfdHJhY2tpbmdJbml0OworCXU4CQkJICAgT0ZETV9pbmRleDsKKwl1OAkJCSAgIENDS19pbmRleDsKKwkvLzIwMDcvMDkvMTAgTWFycyBBZGQgQ0NLIFRYIFBvd2VyIFRyYWNraW5nCisJY2NrdHhiYmdhaW5fc3RydWN0CWNja190eGJiZ2Fpbl90YWJsZVtDQ0tUeEJCR2FpblRhYmxlTGVuZ3RoXTsKKwljY2t0eGJiZ2Fpbl9zdHJ1Y3QJY2NrX3R4YmJnYWluX2NoMTRfdGFibGVbQ0NLVHhCQkdhaW5UYWJsZUxlbmd0aF07CisJdTggcmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4OworCXU4IHJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsOworCXU4IHJmYV90eHBvd2VydHJhY2tpbmdfZGVmYXVsdDsKKwl1OCByZmNfdHhwb3dlcnRyYWNraW5naW5kZXg7CisJdTggcmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWw7CisKKwlzOCBjY2tfcHJlc2VudF9hdHRlbnR1YXRpb247CisJdTggY2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uXzIwTWRlZmF1bHQ7CisJdTggY2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uXzQwTWRlZmF1bHQ7CisJY2hhciBjY2tfcHJlc2VudF9hdHRlbnR1YXRpb25fZGlmZmVyZW5jZTsKKwlib29sIGJ0eHBvd2VyX3RyYWNraW5nOworCWJvb2wgYmNja19pbl9jaDE0OworCWJvb2wgYnR4cG93ZXJkYXRhX3JlYWRmcm9tRUVQT1JNOworCXUxNiAJVFNTSV8xM2RCbTsKKwkvL0ZvciBCYWNrdXAgSW5pdGlhbCBHYWluCisJaW5pdF9nYWluIGluaXRnYWluX2JhY2t1cDsKKwl1OCBEZWZhdWx0SW5pdGlhbEdhaW5bNF07CisJLy8gRm9yIEVEQ0EgVHVyYm8gbW9kZSwgQWRkZWQgYnkgYW15IDA4MDUxNS4KKwlib29sCQliaXNfYW55X25vbmJlcGt0czsKKwlib29sCQliY3VycmVudF90dXJib19FRENBOworCWJvb2wJCWJpc19jdXJfcmRsc3RhdGU7CisJc3RydWN0IHRpbWVyX2xpc3QgZnN5bmNfdGltZXI7CisJYm9vbCBiZnN5bmNfcHJvY2Vzc2luZzsJLy8gNTAwbXMgRnN5bmMgdGltZXIgaXMgYWN0aXZlIG9yIG5vdAorCXUzMiAJcmF0ZV9yZWNvcmQ7CisJdTMyIAlyYXRlQ291bnREaWZmUmVjb3JkOworCXUzMglDb250aXVuZURpZmZDb3VudDsKKwlib29sIGJzd2l0Y2hfZnN5bmM7CisKKwl1OAlmcmFtZXN5bmM7CisJdTMyIAlmcmFtZXN5bmNDMzQ7CisJdTggICAJZnJhbWVzeW5jTW9uaXRvcjsKKyAgICAgICAgCS8vQWRkZWQgYnkgYW15IDA4MDUxNiAgZm9yIFJYIHJlbGF0ZWQKKwl1MTYgCW5yeEFNUERVX3NpemU7CisJdTggCW5yeEFNUERVX2FnZ3JfbnVtOworCisJLy9ieSBhbXkgZm9yIGdwaW8KKwkgYm9vbCBiSHdSYWRpb09mZjsKKworCS8vYnkgYW15IGZvciByZXNldF9jb3VudAorCXUzMiByZXNldF9jb3VudDsKKwlib29sIGJwYmNfcHJlc3NlZDsKKwkvL2J5IGFteSBmb3IgZGVidWcKKwl1MzIgdHhwb3dlcl9jaGVja2NudDsKKwl1MzIgdHhwb3dlcl90cmFja2luZ19jYWxsYmFja19jbnQ7CisJdTggdGhlcm1hbF9yZWFkX3ZhbFs0MF07CisJdTggdGhlcm1hbF9yZWFkYmFja19pbmRleDsKKwl1MzIgY2NrdHhwb3dlcl9hZGp1c3RjbnRfbm90X2NoMTQ7CisJdTMyIGNja3R4cG93ZXJfYWRqdXN0Y250X2NoMTQ7CisJdTggdHhfZndpbmZvX2ZvcmNlX3N1YmNhcnJpZXJtb2RlOworCXU4IHR4X2Z3aW5mb19mb3JjZV9zdWJjYXJyaWVydmFsOworCS8vYnkgYW15IGZvciBzaWxlbnQgcmVzZXQKKwlSRVNFVF9UWVBFCVJlc2V0UHJvZ3Jlc3M7CisJYm9vbAkJYkZvcmNlZFNpbGVudFJlc2V0OworCWJvb2wJCWJEaXNhYmxlTm9ybWFsUmVzZXRDaGVjazsKKwl1MTYJCVR4Q291bnRlcjsKKwl1MTYJCVJ4Q291bnRlcjsKKwlpbnQJCUlycFBlbmRpbmdDb3VudDsKKwlib29sCQliUmVzZXRJblByb2dyZXNzOworCWJvb2wJCWZvcmNlX3Jlc2V0OworCXU4CQlJbml0aWFsR2Fpbk9wZXJhdGVUeXBlOworCisJdTE2CQlTaWZzVGltZTsKKworCS8vZGVmaW5lIHdvcmsgaXRlbSBieSBhbXkgMDgwNTI2CisKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHVwZGF0ZV9iZWFjb25fd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayB3YXRjaF9kb2dfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayB0eHBvd2VyX3RyYWNraW5nX3dxOworCXN0cnVjdCBkZWxheWVkX3dvcmsgcmZwYXRoX2NoZWNrX3dxOworCXN0cnVjdCBkZWxheWVkX3dvcmsgZ3Bpb19jaGFuZ2VfcmZfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBpbml0aWFsZ2Fpbl9vcGVyYXRlX3dxOworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpwcml2X3dxOworfXI4MTkyX3ByaXY7CisKKy8vIGZvciBydGw4MTg3CisvLyBub3cgbWlyZ2luZyB0byBydGw4MTg3QgorLyoKK3R5cGVkZWYgZW51bXsKKwlMT1dfUFJJT1JJVFkgPSAweDAyLAorCU5PUk1fUFJJT1JJVFkKKwl9IHByaW9yaXR5X3Q7CisqLworLy9mb3IgcnRsODE4N0IKK3R5cGVkZWYgZW51bXsKKwlCVUxLX1BSSU9SSVRZID0gMHgwMSwKKwkvL1JTVkQwLAorCS8vUlNWRDEsCisJTE9XX1BSSU9SSVRZLAorCU5PUk1fUFJJT1JJVFksCisJVk9fUFJJT1JJVFksCisJVklfUFJJT1JJVFksIC8vMHgwNQorCUJFX1BSSU9SSVRZLAorCUJLX1BSSU9SSVRZLAorCVJTVkQyLAorCVJTVkQzLAorCUJFQUNPTl9QUklPUklUWSwgLy8weDBBCisJSElHSF9QUklPUklUWSwKKwlNQU5BR0VfUFJJT1JJVFksCisJUlNWRDQsCisJUlNWRDUsCisJVUFSVF9QUklPUklUWSAvLzB4MEYKK30gcHJpb3JpdHlfdDsKKwordHlwZWRlZiBlbnVteworCU5JQ184MTkyVSA9IDEsCisJTklDXzgxOTBQID0gMiwKKwlOSUNfODE5MkUgPSAzLAorCX0gbmljX3Q7CisKKworI2lmZGVmIEpPSE5fSFdTRUMKK3N0cnVjdCBzc2lkX3RocmVhZCB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICAgICAJdTggbmFtZVtJV19FU1NJRF9NQVhfU0laRSArIDFdOworfTsKKyNlbmRpZgorCitib29sIGluaXRfZmlybXdhcmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzaG9ydCBydGw4MTl4VV90eF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzaG9ydCBydGw4MTkyX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmKiBza2IpOworCit1MzIgcmVhZF9jYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRkcik7Cit2b2lkIHdyaXRlX2NhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZGRyLCB1MzIgZGF0YSk7CisKK3U4IHJlYWRfbmljX2J5dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgpOwordTggcmVhZF9uaWNfYnl0ZV9FKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4KTsKK3UzMiByZWFkX25pY19kd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCk7Cit1MTYgcmVhZF9uaWNfd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCkgOwordm9pZCB3cml0ZV9uaWNfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCx1OCB5KTsKK3ZvaWQgd3JpdGVfbmljX2J5dGVfRShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCx1OCB5KTsKK3ZvaWQgd3JpdGVfbmljX3dvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgsdTE2IHkpOwordm9pZCB3cml0ZV9uaWNfZHdvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgsdTMyIHkpOwordm9pZCBmb3JjZV9wY2lfcG9zdGluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwordm9pZCBydGw4MTkyX3J0eF9kaXNhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICopOwordm9pZCBydGw4MTkyX3J4X2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3ZvaWQgcnRsODE5Ml90eF9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKik7CisKK3ZvaWQgcnRsODE5Ml9kaXNhc3NvY2lhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisvL3ZvaWQgZml4X3J4X2ZpZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODVfc2V0X3JmX3BpbnNfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdTMyIGEpOworCit2b2lkIHJ0bDgxOTJfc2V0X2FuYXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdTMyIGEpOwordm9pZCBydGw4MTg1X3NldF9hbmFwYXJhbTIoc3RydWN0IG5ldF9kZXZpY2UgKmRldix1MzIgYSk7Cit2b2lkIHJ0bDgxOTJfdXBkYXRlX21zcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCBydGw4MTkyX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgcnRsODE5Ml91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE5Ml9jb21taXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxOTJfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCk7Cit2b2lkIHdyaXRlX3BoeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIsIHU4IGRhdGEpOwordm9pZCB3cml0ZV9waHlfY2NrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkciwgdTMyIGRhdGEpOwordm9pZCB3cml0ZV9waHlfb2ZkbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIsIHUzMiBkYXRhKTsKK3ZvaWQgcnRsODE4NV90eF9hbnRlbm5hKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFudCk7Cit2b2lkIHJ0bDgxOTJfc2V0X3J4Y29uZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKy8vc2hvcnQgY2hlY2tfbmljX2Vub3VnaF9kZXNjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHByaW9yaXR5X3QgcHJpb3JpdHkpOworZXh0ZXJuIHZvaWQgcnRsODE5eHVzYl9iZWFjb25fdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldix1MTYgIHR4X3JhdGUpOworCit2b2lkIEVuYWJsZUhXU2VjdXJpdHlDb25maWc4MTkyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBzZXRLZXkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggRW50cnlObywgdTggS2V5SW5kZXgsIHUxNiBLZXlUeXBlLCB1OCAqTWFjQWRkciwgdTggRGVmYXVsdEtleSwgdTMyICpLZXlDb250ZW50ICk7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYWRlMTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2NvcmUuYwpAQCAtMCwwICsxLDYwODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogTGludXggZGV2aWNlIGRyaXZlciBmb3IgUlRMODE5MlUKKyAqCisgKiBCYXNlZCBvbiB0aGUgcjgxODcgZHJpdmVyLCB3aGljaCBpczoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDUgQW5kcmVhIE1lcmVsbG8gPGFuZHJlYW1ybEB0aXNjYWxpLml0PiwgZXQgYWwuCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIEplcnJ5IGNodWFuZyA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqLworCisjaWZuZGVmIENPTkZJR19GT1JDRV9IQVJEX0ZMT0FUCitkb3VibGUgX19mbG9hdHNpZGYgKGludCBpKSB7IHJldHVybiBpOyB9Cit1bnNpZ25lZCBpbnQgX19maXh1bnNkZnNpIChkb3VibGUgZCkgeyByZXR1cm4gZDsgfQorZG91YmxlIF9fYWRkZGYzKGRvdWJsZSBhLCBkb3VibGUgYikgeyByZXR1cm4gYStiOyB9Citkb3VibGUgX19hZGRzZjMoZmxvYXQgYSwgZmxvYXQgYikgeyByZXR1cm4gYStiOyB9Citkb3VibGUgX19zdWJkZjMoZG91YmxlIGEsIGRvdWJsZSBiKSB7IHJldHVybiBhLWI7IH0KK2RvdWJsZSBfX2V4dGVuZHNmZGYyKGZsb2F0IGEpIHtyZXR1cm4gYTt9CisjZW5kaWYKKworI3VuZGVmIExPT1BfVEVTVAorI3VuZGVmIERVTVBfUlgKKyN1bmRlZiBEVU1QX1RYCisjdW5kZWYgREVCVUdfVFhfREVTQzIKKyN1bmRlZiBSWF9ET05UX1BBU1NfVUwKKyN1bmRlZiBERUJVR19FUFJPTQorI3VuZGVmIERFQlVHX1JYX1ZFUkJPU0UKKyN1bmRlZiBEVU1NWV9SWAorI3VuZGVmIERFQlVHX1pFUk9fUlgKKyN1bmRlZiBERUJVR19SWF9TS0IKKyN1bmRlZiBERUJVR19UWF9GUkFHCisjdW5kZWYgREVCVUdfUlhfRlJBRworI3VuZGVmIERFQlVHX1RYX0ZJTExERVNDCisjdW5kZWYgREVCVUdfVFgKKyN1bmRlZiBERUJVR19JUlEKKyN1bmRlZiBERUJVR19SWAorI3VuZGVmIERFQlVHX1JYQUxMT0MKKyN1bmRlZiBERUJVR19SRUdJU1RFUlMKKyN1bmRlZiBERUJVR19SSU5HCisjdW5kZWYgREVCVUdfSVJRX1RBU0tMRVQKKyN1bmRlZiBERUJVR19UWF9BTExPQworI3VuZGVmIERFQlVHX1RYX0RFU0MKKworI2RlZmluZSBDT05GSUdfUlRMODE5Ml9JT19NQVAKKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSAicjgxOTJVX2h3LmgiCisjaW5jbHVkZSAicjgxOTJVLmgiCisjaW5jbHVkZSAicjgxOTBfcnRsODI1Ni5oIiAvKiBSVEw4MjI1IFJhZGlvIGZyb250ZW5kICovCisjaW5jbHVkZSAicjgxODBfOTNjeDYuaCIgICAvKiBDYXJkIEVFUFJPTSAqLworI2luY2x1ZGUgInI4MTkyVV93eC5oIgorI2luY2x1ZGUgInI4MTl4VV9waHkuaCIgLy9hZGRlZCBieSBXQiA0LjMwLjIwMDgKKyNpbmNsdWRlICJyODE5eFVfcGh5cmVnLmgiCisjaW5jbHVkZSAicjgxOXhVX2NtZHBrdC5oIgorI2luY2x1ZGUgInI4MTkyVV9kbS5oIgorLy8jaW5jbHVkZSAicjgxOTJ4VV9waHlyZWcuaCIKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKy8vIEZJWE1FOiBjaGVjayBpZiAyLjYuNyBpcyBvaworCisjaWZkZWYgQ09ORklHX1JUTDgxOTJfUE0KKyNpbmNsdWRlICJyODE5Ml9wbS5oIgorI2VuZGlmCisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisjaW5jbHVkZSAiZG90MTFkLmgiCisjZW5kaWYKKy8vc2V0IGhlcmUgdG8gb3BlbiB5b3VyIHRyYWNlIGNvZGUuIC8vV0IKK3UzMiBydF9nbG9iYWxfZGVidWdfY29tcG9uZW50ID0gXAorCQkJLy8JQ09NUF9JTklUICAgIAl8CisvLwkJCQlDT01QX0RCRwl8CisJCQkvLwlDT01QX0VQUk9NICAgCXwKKy8vCQkJCUNPTVBfUEhZCXwKKwkJCS8vCUNPTVBfUkYJCXwKKy8vCQkJCUNPTVBfRklSTVdBUkUJfAorLy8JCQkJQ09NUF9DSAkJfAorCQkJLy8JQ09NUF9QT1dFUl9UUkFDS0lORyB8CisvLwkJCQlDT01QX1JBVEUJfAorCQkJLy8JQ09NUF9UWEFHQwl8CisJCS8vCQlDT01QX1RSQUNFCXwKKwkJCQlDT01QX0RPV04JfAorCQkvLwkJQ09NUF9SRUNWCXwKKwkJLy8gICAgICAgICAgICAgIENPTVBfU1dCVwl8CisJCQkJQ09NUF9TRUMJfAorCS8vCQkJQ09NUF9SRVNFVAl8CisJCS8vCQlDT01QX1NFTkQJfAorCQkJLy8JQ09NUF9FVkVOVFMJfAorCQkJCUNPTVBfRVJSIDsgLy9hbHdheXMgb3BlbiBlcnIgZmxhZ3Mgb24KKworI2RlZmluZSBUT1RBTF9DQU1fRU5UUlkgMzIKKyNkZWZpbmUgQ0FNX0NPTlRFTlRfQ09VTlQgOAorCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgcnRsODE5Ml91c2JfaWRfdGJsW10gPSB7CisJLyogUmVhbHRlayAqLworCXtVU0JfREVWSUNFKDB4MGJkYSwgMHg4MTkyKX0sCisJe1VTQl9ERVZJQ0UoMHgwYmRhLCAweDg3MDkpfSwKKwkvKiBDb3JlZ2EgKi8KKwl7VVNCX0RFVklDRSgweDA3YWEsIDB4MDA0Myl9LAorCS8qIEJlbGtpbiAqLworCXtVU0JfREVWSUNFKDB4MDUwZCwgMHg4MDVFKX0sCisJLyogU2l0ZWNvbSAqLworCXtVU0JfREVWSUNFKDB4MGRmNiwgMHgwMDMxKX0sCisJLyogRW5HZW5pdXMgKi8KKwl7VVNCX0RFVklDRSgweDE3NDAsIDB4OTIwMSl9LAorCS8qIERsaW5rICovCisJe1VTQl9ERVZJQ0UoMHgyMDAxLCAweDMzMDEpfSwKKwkvKiBaaW53ZWxsICovCisJe1VTQl9ERVZJQ0UoMHg1YTU3LCAweDAyOTApfSwKKwl7fQorfTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oIlYgMS4xIik7CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgcnRsODE5Ml91c2JfaWRfdGJsKTsKK01PRFVMRV9ERVNDUklQVElPTigiTGludXggZHJpdmVyIGZvciBSZWFsdGVrIFJUTDgxOTIgVVNCIFdpRmkgY2FyZHMiKTsKKworc3RhdGljIGNoYXIqIGlmbmFtZSA9ICJ3bGFuJWQiOworc3RhdGljIGludCBod3dlcCA9IDE7ICAvL2RlZmF1bHQgdXNlIGh3LiBzZXQgMCB0byB1c2Ugc29mdHdhcmUgc2VjdXJpdHkKK3N0YXRpYyBpbnQgY2hhbm5lbHMgPSAweDNmZmY7CisKKworCittb2R1bGVfcGFyYW0oaWZuYW1lLCBjaGFycCwgU19JUlVHT3xTX0lXVVNSICk7CisvL21vZHVsZV9wYXJhbShod3NlcW51bSxpbnQsIFNfSVJVR098U19JV1VTUik7Cittb2R1bGVfcGFyYW0oaHd3ZXAsaW50LCBTX0lSVUdPfFNfSVdVU1IpOworbW9kdWxlX3BhcmFtKGNoYW5uZWxzLGludCwgU19JUlVHT3xTX0lXVVNSKTsKKworTU9EVUxFX1BBUk1fREVTQyhpZm5hbWUsIiBOZXQgaW50ZXJmYWNlIG5hbWUsIHdsYW4lZD1kZWZhdWx0Iik7CisvL01PRFVMRV9QQVJNX0RFU0MoaHdzZXFudW0sIiBUcnkgdG8gdXNlIGhhcmR3YXJlIDgwMi4xMSBoZWFkZXIgc2VxdWVuY2UgbnVtYmVycy4gWmVybz1kZWZhdWx0Iik7CitNT0RVTEVfUEFSTV9ERVNDKGh3d2VwLCIgVHJ5IHRvIHVzZSBoYXJkd2FyZSBzZWN1cml0eSBzdXBwb3J0LiAiKTsKK01PRFVMRV9QQVJNX0RFU0MoY2hhbm5lbHMsIiBDaGFubmVsIGJpdG1hc2sgZm9yIHNwZWNpZmljIGxvY2FsZXMuIE5ZSSIpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBydGw4MTkyX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCSBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOworc3RhdGljIHZvaWQgX19kZXZleGl0IHJ0bDgxOTJfdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOworCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBydGw4MTkyX3VzYl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gUlRMODE5eFVfTU9EVUxFX05BTUUsCQkgIC8qIERyaXZlciBuYW1lICAgKi8KKwkuaWRfdGFibGUJPSBydGw4MTkyX3VzYl9pZF90YmwsCQkgIC8qIFBDSV9JRCB0YWJsZSAgKi8KKwkucHJvYmUJCT0gcnRsODE5Ml91c2JfcHJvYmUsCQkgIC8qIHByb2JlIGZuICAgICAgKi8KKwkuZGlzY29ubmVjdAk9IHJ0bDgxOTJfdXNiX2Rpc2Nvbm5lY3QsCSAgLyogcmVtb3ZlIGZuICAgICAqLworI2lmZGVmIENPTkZJR19SVEw4MTkyX1BNCisJLnN1c3BlbmQJPSBydGw4MTkyX3N1c3BlbmQsCQkgIC8qIFBNIHN1c3BlbmQgZm4gKi8KKwkucmVzdW1lCQk9IHJ0bDgxOTJfcmVzdW1lLCAgICAgICAgICAgICAgICAgLyogUE0gcmVzdW1lIGZuICAqLworI2Vsc2UKKwkuc3VzcGVuZAk9IE5VTEwsCQkJCSAgLyogUE0gc3VzcGVuZCBmbiAqLworCS5yZXN1bWUgICAgICAJPSBOVUxMLAkJCQkgIC8qIFBNIHJlc3VtZSBmbiAgKi8KKyNlbmRpZgorfTsKKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwordHlwZWRlZiBzdHJ1Y3QgX0NIQU5ORUxfTElTVAoreworCXU4CUNoYW5uZWxbMzJdOworCXU4CUxlbjsKK31DSEFOTkVMX0xJU1QsICpQQ0hBTk5FTF9MSVNUOworCitzdGF0aWMgQ0hBTk5FTF9MSVNUIENoYW5uZWxQbGFuW10gPSB7CisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NCwxNDksMTUzLDE1NywxNjEsMTY1fSwyNH0sICAJCS8vRkNDCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMX0sMTF9LCAgICAgICAgICAgICAgICAgICAgCQkJCS8vSUMKKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwyMX0sICAJLy9FVFNJCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxM30sMTN9LCAgICAvL1NwYWluLiBDaGFuZ2UgdG8gRVRTSS4KKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzfSwxM30sICAJLy9GcmFuY2UuIENoYW5nZSB0byBFVFNJLgorCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDIyfSwJLy9NS0sJCQkJCS8vTUtLCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sMjJ9LC8vTUtLMQorCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTN9LDEzfSwJLy9Jc3JhZWwuCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sMjJ9LAkJCS8vIEZvciAxMWEgLCBURUxFQworCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LCAyMn0sICAgIC8vTUlDCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNH0sMTR9CQkJCQkvL0ZvciBHbG9iYWwgRG9tYWluLiAxLTExOmFjdGl2ZSBzY2FuLCAxMi0xNCBwYXNzaXZlIHNjYW4uIC8vK1lKLCAwODA2MjYKK307CisKK3N0YXRpYyB2b2lkIHJ0bDgxOXhfc2V0X2NoYW5uZWxfbWFwKHU4IGNoYW5uZWxfcGxhbiwgc3RydWN0IHI4MTkyX3ByaXYqIHByaXYpCit7CisJaW50IGksIG1heF9jaGFuPS0xLCBtaW5fY2hhbj0tMTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKwlzd2l0Y2ggKGNoYW5uZWxfcGxhbikKKwl7CisJCWNhc2UgQ09VTlRSWV9DT0RFX0ZDQzoKKwkJY2FzZSBDT1VOVFJZX0NPREVfSUM6CisJCWNhc2UgQ09VTlRSWV9DT0RFX0VUU0k6CisJCWNhc2UgQ09VTlRSWV9DT0RFX1NQQUlOOgorCQljYXNlIENPVU5UUllfQ09ERV9GUkFOQ0U6CisJCWNhc2UgQ09VTlRSWV9DT0RFX01LSzoKKwkJY2FzZSBDT1VOVFJZX0NPREVfTUtLMToKKwkJY2FzZSBDT1VOVFJZX0NPREVfSVNSQUVMOgorCQljYXNlIENPVU5UUllfQ09ERV9URUxFQzoKKwkJY2FzZSBDT1VOVFJZX0NPREVfTUlDOgorCQl7CisJCQlEb3QxMWRfSW5pdChpZWVlKTsKKwkJCWllZWUtPmJHbG9iYWxEb21haW4gPSBmYWxzZTsKKwkJCS8vYWN0dXJhbGx5IDgyMjUgJiA4MjU2IHJmIGNoaXAgb25seSBzdXBwb3J0IEIsRywyNE4gbW9kZQorCQkJaWYgKChwcml2LT5yZl9jaGlwID09IFJGXzgyMjUpIHx8IChwcml2LT5yZl9jaGlwID09IFJGXzgyNTYpKQorCQkJeworCQkJCW1pbl9jaGFuID0gMTsKKwkJCQltYXhfY2hhbiA9IDE0OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAidW5rbm93biByZiBjaGlwLCBjYW4ndCBzZXQgY2hhbm5lbCBtYXAgaW4gZnVuY3Rpb246JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCX0KKwkJCWlmIChDaGFubmVsUGxhbltjaGFubmVsX3BsYW5dLkxlbiAhPSAwKXsKKwkJCQkvLyBDbGVhciBvbGQgY2hhbm5lbCBtYXAKKwkJCQltZW1zZXQoR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcCwgMCwgc2l6ZW9mKEdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXApKTsKKwkJCQkvLyBTZXQgbmV3IGNoYW5uZWwgbWFwCisJCQkJZm9yIChpPTA7aTxDaGFubmVsUGxhbltjaGFubmVsX3BsYW5dLkxlbjtpKyspCisJCQkJeworCQkJCQlpZiAoQ2hhbm5lbFBsYW5bY2hhbm5lbF9wbGFuXS5DaGFubmVsW2ldIDwgbWluX2NoYW4gfHwgQ2hhbm5lbFBsYW5bY2hhbm5lbF9wbGFuXS5DaGFubmVsW2ldID4gbWF4X2NoYW4pCisJCQkJCWJyZWFrOworCQkJCQlHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwW0NoYW5uZWxQbGFuW2NoYW5uZWxfcGxhbl0uQ2hhbm5lbFtpXV0gPSAxOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgQ09VTlRSWV9DT0RFX0dMT0JBTF9ET01BSU46CisJCXsKKwkJCUdFVF9ET1QxMURfSU5GTyhpZWVlKS0+YkVuYWJsZWQgPSAwOy8vdGhpcyBmbGFnIGVuYWJsZWQgdG8gZm9sbG93IDExZCBjb3VudHJ5IElFIHNldHRpbmcsIG90aGVyd2lzZSwgaXQgc2hhbGwgZm9sbG93IGdsb2JhbCBkb21haW4gc2V0dGluZ3MuCisJCQlEb3QxMWRfUmVzZXQoaWVlZSk7CisJCQlpZWVlLT5iR2xvYmFsRG9tYWluID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisJcmV0dXJuOworfQorI2VuZGlmCisKKyNkZWZpbmUgZXFNYWNBZGRyKGEsYikgKCAoKGEpWzBdPT0oYilbMF0gJiYgKGEpWzFdPT0oYilbMV0gJiYgKGEpWzJdPT0oYilbMl0gJiYgKGEpWzNdPT0oYilbM10gJiYgKGEpWzRdPT0oYilbNF0gJiYgKGEpWzVdPT0oYilbNV0pID8gMTowICkKKworI2RlZmluZSAJcnhfaGFsX2lzX2Nja19yYXRlKF9wZHJ2aW5mbylcCisJCQkoX3BkcnZpbmZvLT5SeFJhdGUgPT0gREVTQzkwX1JBVEUxTSB8fFwKKwkJCV9wZHJ2aW5mby0+UnhSYXRlID09IERFU0M5MF9SQVRFMk0gfHxcCisJCQlfcGRydmluZm8tPlJ4UmF0ZSA9PSBERVNDOTBfUkFURTVfNU0gfHxcCisJCQlfcGRydmluZm8tPlJ4UmF0ZSA9PSBERVNDOTBfUkFURTExTSkgJiZcCisJCQkhX3BkcnZpbmZvLT5SeEhUXAorCisKK3ZvaWQgQ2FtUmVzZXRBbGxFbnRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXUzMiB1bGNvbW1hbmQgPSAwOworCS8vMjAwNC8wMi8xMSAgSW4gc3RhdGljIFdFUCwgT0lEX0FERF9LRVkgb3IgT0lEX0FERF9XRVAgYXJlIHNldCBiZWZvcmUgU1RBIGFzc29jaWF0ZSB0byBBUC4KKwkvLyBIb3dldmVyLCBSZXNldEtleSBpcyBjYWxsZWQgb24gT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFIGFuZCBNbG1lQXNzb2NpYXRlUmVxdWVzdAorCS8vIEluIHRoaXMgY29uZGl0aW9uLCBDYW0gY2FuIG5vdCBiZSByZXNldCBiZWNhdXNlIHVwcGVyIGxheWVyIHdpbGwgbm90IHNldCB0aGlzIHN0YXRpYyBrZXkgYWdhaW4uCisJLy9pZihBZGFwdGVyLT5FbmNBbGdvcml0aG0gPT0gV0VQX0VuY3J5cHRpb24pCisJLy8gICAgICByZXR1cm47CisvL2RlYnVnCisJLy9EYmdQcmludCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisJLy9EYmdQcmludCgiICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGwgUmVzZXRBbGxFbnRyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOworCS8vRGJnUHJpbnQoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuIik7CisJdWxjb21tYW5kIHw9IEJJVDMxfEJJVDMwOworCXdyaXRlX25pY19kd29yZChkZXYsIFJXQ0FNLCB1bGNvbW1hbmQpOworCit9CisKKwordm9pZCB3cml0ZV9jYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRkciwgdTMyIGRhdGEpCit7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgV0NBTUksIGRhdGEpOworCXdyaXRlX25pY19kd29yZChkZXYsIFJXQ0FNLCBCSVQzMXxCSVQxNnwoYWRkciYweGZmKSApOworfQorCit1MzIgcmVhZF9jYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRkcikKK3sKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSV0NBTSwgMHg4MDAwMDAwMHwoYWRkciYweGZmKSApOworCXJldHVybiByZWFkX25pY19kd29yZChkZXYsIDB4YTgpOworfQorCit2b2lkIHdyaXRlX25pY19ieXRlX0Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGluZHgsIHU4IGRhdGEpCit7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBwcml2LT51ZGV2OworCisJc3RhdHVzID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKKwkJCSAgICAgICBSVEw4MTg3X1JFUV9TRVRfUkVHUywgUlRMODE4N19SRVFUX1dSSVRFLAorCQkJICAgICAgIGluZHh8MHhmZTAwLCAwLCAmZGF0YSwgMSwgSFogLyAyKTsKKworCWlmIChzdGF0dXMgPCAwKQorCXsKKwkJcHJpbnRrKCJ3cml0ZV9uaWNfYnl0ZV9FIFRpbWVPdXQhIHN0YXR1czolZFxuIiwgc3RhdHVzKTsKKwl9Cit9CisKK3U4IHJlYWRfbmljX2J5dGVfRShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW5keCkKK3sKKwlpbnQgc3RhdHVzOworCXU4IGRhdGE7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gcHJpdi0+dWRldjsKKworCXN0YXR1cyA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksCisJCQkgICAgICAgUlRMODE4N19SRVFfR0VUX1JFR1MsIFJUTDgxODdfUkVRVF9SRUFELAorCQkJICAgICAgIGluZHh8MHhmZTAwLCAwLCAmZGF0YSwgMSwgSFogLyAyKTsKKworCWlmIChzdGF0dXMgPCAwKQorCXsKKwkJcHJpbnRrKCJyZWFkX25pY19ieXRlX0UgVGltZU91dCEgc3RhdHVzOiVkXG4iLCBzdGF0dXMpOworCX0KKworCXJldHVybiBkYXRhOworfQorLy9hcyA5MlUgaGFzIGV4dGVuZCBwYWdlIGZyb20gNCB0byAxNiwgc28gbW9kaWZ5IGZ1bmN0aW9ucyBiZWxvdy4KK3ZvaWQgd3JpdGVfbmljX2J5dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGluZHgsIHU4IGRhdGEpCit7CisJaW50IHN0YXR1czsKKworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHByaXYtPnVkZXY7CisKKwlzdGF0dXMgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAorCQkJICAgICAgIFJUTDgxODdfUkVRX1NFVF9SRUdTLCBSVEw4MTg3X1JFUVRfV1JJVEUsCisJCQkgICAgICAgKGluZHgmMHhmZil8MHhmZjAwLCAoaW5keD4+OCkmMHgwZiwgJmRhdGEsIDEsIEhaIC8gMik7CisKKwlpZiAoc3RhdHVzIDwgMCkKKwl7CisJCXByaW50aygid3JpdGVfbmljX2J5dGUgVGltZU91dCEgc3RhdHVzOiVkXG4iLCBzdGF0dXMpOworCX0KKworCit9CisKKwordm9pZCB3cml0ZV9uaWNfd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW5keCwgdTE2IGRhdGEpCit7CisKKwlpbnQgc3RhdHVzOworCisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gcHJpdi0+dWRldjsKKworCXN0YXR1cyA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCisJCQkgICAgICAgUlRMODE4N19SRVFfU0VUX1JFR1MsIFJUTDgxODdfUkVRVF9XUklURSwKKwkJCSAgICAgICAoaW5keCYweGZmKXwweGZmMDAsIChpbmR4Pj44KSYweDBmLCAmZGF0YSwgMiwgSFogLyAyKTsKKworCWlmIChzdGF0dXMgPCAwKQorCXsKKwkJcHJpbnRrKCJ3cml0ZV9uaWNfd29yZCBUaW1lT3V0ISBzdGF0dXM6JWRcbiIsIHN0YXR1cyk7CisJfQorCit9CisKKwordm9pZCB3cml0ZV9uaWNfZHdvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGluZHgsIHUzMiBkYXRhKQoreworCisJaW50IHN0YXR1czsKKworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHByaXYtPnVkZXY7CisKKwlzdGF0dXMgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAorCQkJICAgICAgIFJUTDgxODdfUkVRX1NFVF9SRUdTLCBSVEw4MTg3X1JFUVRfV1JJVEUsCisJCQkgICAgICAgKGluZHgmMHhmZil8MHhmZjAwLCAoaW5keD4+OCkmMHgwZiwgJmRhdGEsIDQsIEhaIC8gMik7CisKKworCWlmIChzdGF0dXMgPCAwKQorCXsKKwkJcHJpbnRrKCJ3cml0ZV9uaWNfZHdvcmQgVGltZU91dCEgc3RhdHVzOiVkXG4iLCBzdGF0dXMpOworCX0KKworfQorCisKKwordTggcmVhZF9uaWNfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW5keCkKK3sKKwl1OCBkYXRhOworCWludCBzdGF0dXM7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gcHJpdi0+dWRldjsKKworCXN0YXR1cyA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksCisJCQkgICAgICAgUlRMODE4N19SRVFfR0VUX1JFR1MsIFJUTDgxODdfUkVRVF9SRUFELAorCQkJICAgICAgIChpbmR4JjB4ZmYpfDB4ZmYwMCwgKGluZHg+PjgpJjB4MGYsICZkYXRhLCAxLCBIWiAvIDIpOworCisJaWYgKHN0YXR1cyA8IDApCisJeworCQlwcmludGsoInJlYWRfbmljX2J5dGUgVGltZU91dCEgc3RhdHVzOiVkXG4iLCBzdGF0dXMpOworCX0KKworCXJldHVybiBkYXRhOworfQorCisKKwordTE2IHJlYWRfbmljX3dvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGluZHgpCit7CisJdTE2IGRhdGE7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBwcml2LT51ZGV2OworCisJc3RhdHVzID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKSwKKwkJCSAgICAgICBSVEw4MTg3X1JFUV9HRVRfUkVHUywgUlRMODE4N19SRVFUX1JFQUQsCisJCQkgICAgICAgKGluZHgmMHhmZil8MHhmZjAwLCAoaW5keD4+OCkmMHgwZiwgJmRhdGEsIDIsIEhaIC8gMik7CisKKwlpZiAoc3RhdHVzIDwgMCkKKwl7CisJCXByaW50aygicmVhZF9uaWNfd29yZCBUaW1lT3V0ISBzdGF0dXM6JWRcbiIsIHN0YXR1cyk7CisJfQorCisKKwlyZXR1cm4gZGF0YTsKK30KKwordTE2IHJlYWRfbmljX3dvcmRfRShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW5keCkKK3sKKwl1MTYgZGF0YTsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHByaXYtPnVkZXY7CisKKwlzdGF0dXMgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3JjdmN0cmxwaXBlKHVkZXYsIDApLAorCQkJICAgICAgIFJUTDgxODdfUkVRX0dFVF9SRUdTLCBSVEw4MTg3X1JFUVRfUkVBRCwKKwkJCSAgICAgICBpbmR4fDB4ZmUwMCwgMCwgJmRhdGEsIDIsIEhaIC8gMik7CisKKwlpZiAoc3RhdHVzIDwgMCkKKwl7CisJCXByaW50aygicmVhZF9uaWNfd29yZCBUaW1lT3V0ISBzdGF0dXM6JWRcbiIsIHN0YXR1cyk7CisJfQorCisKKwlyZXR1cm4gZGF0YTsKK30KKwordTMyIHJlYWRfbmljX2R3b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbmR4KQoreworCXUzMiBkYXRhOworCWludCBzdGF0dXM7CisvLwlpbnQgcmVzdWx0OworCisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gcHJpdi0+dWRldjsKKworCXN0YXR1cyA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksCisJCQkgICAgICAgUlRMODE4N19SRVFfR0VUX1JFR1MsIFJUTDgxODdfUkVRVF9SRUFELAorCQkJICAgICAgIChpbmR4JjB4ZmYpfDB4ZmYwMCwgKGluZHg+PjgpJjB4MGYsICZkYXRhLCA0LCBIWiAvIDIpOworLy8JaWYoMCAhPSByZXN1bHQpIHsKKy8vCSAgcHJpbnRrKEtFUk5fV0FSTklORyAicmVhZCBzaXplIG9mIGRhdGEgPSAlZFwsIGRhdGUgPSAlZFxuIiwgcmVzdWx0LCBkYXRhKTsKKy8vCX0KKworCWlmIChzdGF0dXMgPCAwKQorCXsKKwkJcHJpbnRrKCJyZWFkX25pY19kd29yZCBUaW1lT3V0ISBzdGF0dXM6JWRcbiIsIHN0YXR1cyk7CisJfQorCisKKworCXJldHVybiBkYXRhOworfQorCisKKy8vdTggcmVhZF9waHlfY2NrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkcik7CisvL3U4IHJlYWRfcGh5X29mZG0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyKTsKKy8qIHRoaXMgbWlnaHQgc3RpbGwgY2FsbGVkIGluIHdoYXQgd2FzIHRoZSBQSFkgcnRsODE4NS9ydGw4MTkyIGNvbW1vbiBjb2RlCisgKiBwbGFucyBhcmUgdG8gcG9zc2liaWx0eSB0dXJuIGl0IGFnYWluIGluIG9uZSBjb21tb24gY29kZS4uLgorICovCitpbmxpbmUgdm9pZCBmb3JjZV9wY2lfcG9zdGluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworfQorCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcnRsODE5Ml9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE5Ml9jb21taXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisvL3ZvaWQgcnRsODE5Ml9yZXN0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTkyX3Jlc3RhcnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKy8vdm9pZCBydGw4MTkyX3JxX3R4X2FjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworCit2b2lkIHdhdGNoX2RvZ190aW1lcl9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1QUk9DRlMgU1RVRkYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcnRsODE5Ml9wcm9jID0gTlVMTDsKKworCisKK3N0YXRpYyBpbnQgcHJvY19nZXRfc3RhdHNfYXAoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAorCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKKwkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gcHJpdi0+aWVlZTgwMjExOworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqdGFyZ2V0OworCisJaW50IGxlbiA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRhcmdldCwgJmllZWUtPm5ldHdvcmtfbGlzdCwgbGlzdCkgeworCisJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJIiVzICIsIHRhcmdldC0+c3NpZCk7CisKKwkJaWYodGFyZ2V0LT53cGFfaWVfbGVuPjAgfHwgdGFyZ2V0LT5yc25faWVfbGVuPjApeworCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJIldQQVxuIik7CisJCX0KKwkJZWxzZXsKKwkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSJub25fV1BBXG4iKTsKKwkJfQorCisJfQorCisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBwcm9jX2dldF9yZWdpc3RlcnMoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAorCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKKwkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7CisvLwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlpbnQgbGVuID0gMDsKKwlpbnQgaSxuOworCisJaW50IG1heD0weGZmOworCisJLyogVGhpcyBkdW1wIHRoZSBjdXJyZW50IHJlZ2lzdGVyIHBhZ2UgKi8KK2xlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjcGFnZSAwIyMjIyMjIyMjIyMjIyMjIyMjXG4gIik7CisKKwlmb3Iobj0wO248PW1heDspCisJeworCQkvL3ByaW50ayggIlxuRDogJTJ4PiAiLCBuKTsKKwkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJIlxuRDogICUyeCA+ICIsbik7CisKKwkJZm9yKGk9MDtpPDE2ICYmIG48PW1heDtpKyssbisrKQorCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCQkiJTJ4ICIscmVhZF9uaWNfYnl0ZShkZXYsMHgwMDB8bikpOworCisJCS8vCXByaW50aygiJTJ4ICIscmVhZF9uaWNfYnl0ZShkZXYsbikpOworCX0KK2xlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjcGFnZSAxIyMjIyMjIyMjIyMjIyMjIyMjXG4gIik7CisJZm9yKG49MDtuPD1tYXg7KQorCXsKKwkJLy9wcmludGsoICJcbkQ6ICUyeD4gIiwgbik7CisJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSJcbkQ6ICAlMnggPiAiLG4pOworCisJCWZvcihpPTA7aTwxNiAmJiBuPD1tYXg7aSsrLG4rKykKKwkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJIiUyeCAiLHJlYWRfbmljX2J5dGUoZGV2LDB4MTAwfG4pKTsKKworCQkvLyAgICAgIHByaW50aygiJTJ4ICIscmVhZF9uaWNfYnl0ZShkZXYsbikpOworCX0KK2xlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjcGFnZSAzIyMjIyMjIyMjIyMjIyMjIyMjXG4gIik7CisJZm9yKG49MDtuPD1tYXg7KQorCXsKKwkJLy9wcmludGsoICJcbkQ6ICUyeD4gIiwgbik7CisJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSJcbkQ6ICAlMnggPiAiLG4pOworCisJCWZvcihpPTA7aTwxNiAmJiBuPD1tYXg7aSsrLG4rKykKKwkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJIiUyeCAiLHJlYWRfbmljX2J5dGUoZGV2LDB4MzAwfG4pKTsKKworCQkvLyAgICAgIHByaW50aygiJTJ4ICIscmVhZF9uaWNfYnl0ZShkZXYsbikpOworCX0KKworCisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCJcbiIpOworCSplb2YgPSAxOworCXJldHVybiBsZW47CisKK30KKworCisKKworCitzdGF0aWMgaW50IHByb2NfZ2V0X3N0YXRzX3R4KGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKKwkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCisJCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWludCBsZW4gPSAwOworCisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkiVFggVkkgcHJpb3JpdHkgb2sgaW50OiAlbHVcbiIKKwkJIlRYIFZJIHByaW9yaXR5IGVycm9yIGludDogJWx1XG4iCisJCSJUWCBWTyBwcmlvcml0eSBvayBpbnQ6ICVsdVxuIgorCQkiVFggVk8gcHJpb3JpdHkgZXJyb3IgaW50OiAlbHVcbiIKKwkJIlRYIEJFIHByaW9yaXR5IG9rIGludDogJWx1XG4iCisJCSJUWCBCRSBwcmlvcml0eSBlcnJvciBpbnQ6ICVsdVxuIgorCQkiVFggQksgcHJpb3JpdHkgb2sgaW50OiAlbHVcbiIKKwkJIlRYIEJLIHByaW9yaXR5IGVycm9yIGludDogJWx1XG4iCisJCSJUWCBNQU5BR0UgcHJpb3JpdHkgb2sgaW50OiAlbHVcbiIKKwkJIlRYIE1BTkFHRSBwcmlvcml0eSBlcnJvciBpbnQ6ICVsdVxuIgorCQkiVFggQkVBQ09OIHByaW9yaXR5IG9rIGludDogJWx1XG4iCisJCSJUWCBCRUFDT04gcHJpb3JpdHkgZXJyb3IgaW50OiAlbHVcbiIKKy8vCQkiVFggaGlnaCBwcmlvcml0eSBvayBpbnQ6ICVsdVxuIgorLy8JCSJUWCBoaWdoIHByaW9yaXR5IGZhaWxlZCBlcnJvciBpbnQ6ICVsdVxuIgorCQkiVFggcXVldWUgcmVzdW1lOiAlbHVcbiIKKwkJIlRYIHF1ZXVlIHN0b3BwZWQ/OiAlZFxuIgorCQkiVFggZmlmbyBvdmVyZmxvdzogJWx1XG4iCisvLwkJIlRYIGJlYWNvbjogJWx1XG4iCisJCSJUWCBWSSBxdWV1ZTogJWRcbiIKKwkJIlRYIFZPIHF1ZXVlOiAlZFxuIgorCQkiVFggQkUgcXVldWU6ICVkXG4iCisJCSJUWCBCSyBxdWV1ZTogJWRcbiIKKy8vCQkiVFggSFcgcXVldWU6ICVkXG4iCisJCSJUWCBWSSBkcm9wcGVkOiAlbHVcbiIKKwkJIlRYIFZPIGRyb3BwZWQ6ICVsdVxuIgorCQkiVFggQkUgZHJvcHBlZDogJWx1XG4iCisJCSJUWCBCSyBkcm9wcGVkOiAlbHVcbiIKKwkJIlRYIHRvdGFsIGRhdGEgcGFja2V0cyAlbHVcbiIsCisvLwkJIlRYIGJlYWNvbiBhYm9ydGVkOiAlbHVcbiIsCisJCXByaXYtPnN0YXRzLnR4dmlva2ludCwKKwkJcHJpdi0+c3RhdHMudHh2aWVyciwKKwkJcHJpdi0+c3RhdHMudHh2b29raW50LAorCQlwcml2LT5zdGF0cy50eHZvZXJyLAorCQlwcml2LT5zdGF0cy50eGJlb2tpbnQsCisJCXByaXYtPnN0YXRzLnR4YmVlcnIsCisJCXByaXYtPnN0YXRzLnR4Ymtva2ludCwKKwkJcHJpdi0+c3RhdHMudHhia2VyciwKKwkJcHJpdi0+c3RhdHMudHhtYW5hZ2Vva2ludCwKKwkJcHJpdi0+c3RhdHMudHhtYW5hZ2VlcnIsCisJCXByaXYtPnN0YXRzLnR4YmVhY29ub2tpbnQsCisJCXByaXYtPnN0YXRzLnR4YmVhY29uZXJyLAorLy8JCXByaXYtPnN0YXRzLnR4aHBva2ludCwKKy8vCQlwcml2LT5zdGF0cy50eGhwZXJyLAorCQlwcml2LT5zdGF0cy50eHJlc3VtZWQsCisJCW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSwKKwkJcHJpdi0+c3RhdHMudHhvdmVyZmxvdywKKy8vCQlwcml2LT5zdGF0cy50eGJlYWNvbiwKKwkJYXRvbWljX3JlYWQoJihwcml2LT50eF9wZW5kaW5nW1ZJX1BSSU9SSVRZXSkpLAorCQlhdG9taWNfcmVhZCgmKHByaXYtPnR4X3BlbmRpbmdbVk9fUFJJT1JJVFldKSksCisJCWF0b21pY19yZWFkKCYocHJpdi0+dHhfcGVuZGluZ1tCRV9QUklPUklUWV0pKSwKKwkJYXRvbWljX3JlYWQoJihwcml2LT50eF9wZW5kaW5nW0JLX1BSSU9SSVRZXSkpLAorLy8JCXJlYWRfbmljX2J5dGUoZGV2LCBUWEZJRk9DT1VOVCksCisJCXByaXYtPnN0YXRzLnR4dmlkcm9wLAorCQlwcml2LT5zdGF0cy50eHZvZHJvcCwKKwkJcHJpdi0+c3RhdHMudHhiZWRyb3AsCisJCXByaXYtPnN0YXRzLnR4Ymtkcm9wLAorCQlwcml2LT5zdGF0cy50eGRhdGFwa3QKKy8vCQlwcml2LT5zdGF0cy50eGJlYWNvbmVycgorCQkpOworCisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbjsKK30KKworCisKK3N0YXRpYyBpbnQgcHJvY19nZXRfc3RhdHNfcngoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAorCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKKwkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJaW50IGxlbiA9IDA7CisKKwlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCSJSWCBwYWNrZXRzOiAlbHVcbiIKKwkJIlJYIHVyYiBzdGF0dXMgZXJyb3I6ICVsdVxuIgorCQkiUlggaW52YWxpZCB1cmIgZXJyb3I6ICVsdVxuIiwKKwkJcHJpdi0+c3RhdHMucnhva3RvdGFsLAorCQlwcml2LT5zdGF0cy5yeHN0YXRlcnIsCisJCXByaXYtPnN0YXRzLnJ4dXJiZXJyKTsKKworCSplb2YgPSAxOworCXJldHVybiBsZW47Cit9Cit2b2lkIHJ0bDgxOTJfcHJvY19tb2R1bGVfaW5pdCh2b2lkKQoreworCVJUX1RSQUNFKENPTVBfSU5JVCwgIkluaXRpYWxpemluZyBwcm9jIGZpbGVzeXN0ZW0iKTsKKwlydGw4MTkyX3Byb2M9Y3JlYXRlX3Byb2NfZW50cnkoUlRMODE5eFVfTU9EVUxFX05BTUUsIFNfSUZESVIsIGluaXRfbmV0LnByb2NfbmV0KTsKK30KKworCit2b2lkIHJ0bDgxOTJfcHJvY19tb2R1bGVfcmVtb3ZlKHZvaWQpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkoUlRMODE5eFVfTU9EVUxFX05BTUUsIGluaXRfbmV0LnByb2NfbmV0KTsKK30KKworCit2b2lkIHJ0bDgxOTJfcHJvY19yZW1vdmVfb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisKKwlpZiAocHJpdi0+ZGlyX2RldikgeworCS8vCXJlbW92ZV9wcm9jX2VudHJ5KCJzdGF0cy1odyIsIHByaXYtPmRpcl9kZXYpOworCQlyZW1vdmVfcHJvY19lbnRyeSgic3RhdHMtdHgiLCBwcml2LT5kaXJfZGV2KTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoInN0YXRzLXJ4IiwgcHJpdi0+ZGlyX2Rldik7CisJLy8JcmVtb3ZlX3Byb2NfZW50cnkoInN0YXRzLWllZWUiLCBwcml2LT5kaXJfZGV2KTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoInN0YXRzLWFwIiwgcHJpdi0+ZGlyX2Rldik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJyZWdpc3RlcnMiLCBwcml2LT5kaXJfZGV2KTsKKwkvLwlyZW1vdmVfcHJvY19lbnRyeSgiY2NrLXJlZ2lzdGVycyIscHJpdi0+ZGlyX2Rldik7CisJLy8JcmVtb3ZlX3Byb2NfZW50cnkoIm9mZG0tcmVnaXN0ZXJzIixwcml2LT5kaXJfZGV2KTsKKwkJLy9yZW1vdmVfcHJvY19lbnRyeShkZXYtPm5hbWUsIHJ0bDgxOTJfcHJvYyk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJ3bGFuMCIsIHJ0bDgxOTJfcHJvYyk7CisJCXByaXYtPmRpcl9kZXYgPSBOVUxMOworCX0KK30KKworCit2b2lkIHJ0bDgxOTJfcHJvY19pbml0X29uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJcHJpdi0+ZGlyX2RldiA9IGNyZWF0ZV9wcm9jX2VudHJ5KGRldi0+bmFtZSwKKwkJCQkJICBTX0lGRElSIHwgU19JUlVHTyB8IFNfSVhVR08sCisJCQkJCSAgcnRsODE5Ml9wcm9jKTsKKwlpZiAoIXByaXYtPmRpcl9kZXYpIHsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSAvcHJvYy9uZXQvcnRsODE5Mi8lc1xuIiwKKwkJICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKwllID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgic3RhdHMtcngiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgICBwcml2LT5kaXJfZGV2LCBwcm9jX2dldF9zdGF0c19yeCwgZGV2KTsKKworCWlmICghZSkgeworCQlSVF9UUkFDRShDT01QX0VSUiwiVW5hYmxlIHRvIGluaXRpYWxpemUgIgorCQkgICAgICAiL3Byb2MvbmV0L3J0bDgxOTIvJXMvc3RhdHMtcnhcbiIsCisJCSAgICAgIGRldi0+bmFtZSk7CisJfQorCisKKwllID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgic3RhdHMtdHgiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgICBwcml2LT5kaXJfZGV2LCBwcm9jX2dldF9zdGF0c190eCwgZGV2KTsKKworCWlmICghZSkgeworCQlSVF9UUkFDRShDT01QX0VSUiwgIlVuYWJsZSB0byBpbml0aWFsaXplICIKKwkJICAgICAgIi9wcm9jL25ldC9ydGw4MTkyLyVzL3N0YXRzLXR4XG4iLAorCQkgICAgICBkZXYtPm5hbWUpOworCX0KKworCWUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJzdGF0cy1hcCIsIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJCSAgIHByaXYtPmRpcl9kZXYsIHByb2NfZ2V0X3N0YXRzX2FwLCBkZXYpOworCisJaWYgKCFlKSB7CisJCVJUX1RSQUNFKENPTVBfRVJSLCAiVW5hYmxlIHRvIGluaXRpYWxpemUgIgorCQkgICAgICAiL3Byb2MvbmV0L3J0bDgxOTIvJXMvc3RhdHMtYXBcbiIsCisJCSAgICAgIGRldi0+bmFtZSk7CisJfQorCisJZSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInJlZ2lzdGVycyIsIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJCSAgIHByaXYtPmRpcl9kZXYsIHByb2NfZ2V0X3JlZ2lzdGVycywgZGV2KTsKKwlpZiAoIWUpIHsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSAiCisJCSAgICAgICIvcHJvYy9uZXQvcnRsODE5Mi8lcy9yZWdpc3RlcnNcbiIsCisJCSAgICAgIGRldi0+bmFtZSk7CisJfQorfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tTUlTQyBTVFVGRi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiB0aGlzIGlzIG9ubHkgZm9yIGRlYnVnZ2luZyAqLwordm9pZCBwcmludF9idWZmZXIodTMyICpidWZmZXIsIGludCBsZW4pCit7CisJaW50IGk7CisJdTggKmJ1ZiA9KHU4KilidWZmZXI7CisKKwlwcmludGsoIkFTQ0lJIEJVRkZFUiBEVU1QIChsZW46ICV4KTpcbiIsbGVuKTsKKworCWZvcihpPTA7aTxsZW47aSsrKQorCQlwcmludGsoIiVjIixidWZbaV0pOworCisJcHJpbnRrKCJcbkJJTkFSWSBCVUZGRVIgRFVNUCAobGVuOiAleCk6XG4iLGxlbik7CisKKwlmb3IoaT0wO2k8bGVuO2krKykKKwkJcHJpbnRrKCIleCIsYnVmW2ldKTsKKworCXByaW50aygiXG4iKTsKK30KKworLy9zaG9ydCBjaGVja19uaWNfZW5vdWdoX2Rlc2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgcHJpb3JpdHlfdCBwcmlvcml0eSkKK3Nob3J0IGNoZWNrX25pY19lbm91Z2hfZGVzYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGludCBxdWV1ZV9pbmRleCkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IHVzZWQgPSBhdG9taWNfcmVhZCgmcHJpdi0+dHhfcGVuZGluZ1txdWV1ZV9pbmRleF0pOworCisJcmV0dXJuICh1c2VkIDwgTUFYX1RYX1VSQik7Cit9CisKK3ZvaWQgdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvL3J0bDgxOTJfY29tbWl0KGRldik7CisKKwlzY2hlZHVsZV93b3JrKCZwcml2LT5yZXNldF93cSk7CisJLy9ETUVTRygiVFhUSU1FT1VUIik7Cit9CisKKworLyogdGhpcyBpcyBvbmx5IGZvciBkZWJ1ZyAqLwordm9pZCBkdW1wX2Vwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisJZm9yKGk9MDsgaTw2MzsgaSsrKQorCQlSVF9UUkFDRShDT01QX0VQUk9NLCAiRUVQUk9NIGFkZHIgJXggOiAleCIsIGksIGVwcm9tX3JlYWQoZGV2LGkpKTsKK30KKworLyogdGhpcyBpcyBvbmx5IGZvciBkZWJ1ZyAqLwordm9pZCBydGw4MTkyX2R1bXBfcmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisJaW50IG47CisJaW50IG1heD0weDFmZjsKKworCVJUX1RSQUNFKENPTVBfUEhZLCAiRHVtcGluZyBOSUMgcmVnaXN0ZXIgbWFwIik7CisKKwlmb3Iobj0wO248PW1heDspCisJeworCQlwcmludGsoICJcbkQ6ICUyeD4gIiwgbik7CisJCWZvcihpPTA7aTwxNiAmJiBuPD1tYXg7aSsrLG4rKykKKwkJCXByaW50aygiJTJ4ICIscmVhZF9uaWNfYnl0ZShkZXYsbikpOworCX0KKwlwcmludGsoIlxuIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1IVyBTVFVGRi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwordm9pZCBydGw4MTkyX3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsaW50IG1vZGUpCit7CisJdTggZWNtZDsKKwllY21kPXJlYWRfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQpOworCWVjbWQ9ZWNtZCAmfiBFUFJPTV9DTURfT1BFUkFUSU5HX01PREVfTUFTSzsKKwllY21kPWVjbWQgfCAobW9kZTw8RVBST01fQ01EX09QRVJBVElOR19NT0RFX1NISUZUKTsKKwllY21kPWVjbWQgJn4gKDE8PEVQUk9NX0NTX1NISUZUKTsKKwllY21kPWVjbWQgJn4gKDE8PEVQUk9NX0NLX1NISUZUKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCwgZWNtZCk7Cit9CisKKwordm9pZCBydGw4MTkyX3VwZGF0ZV9tc3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTggbXNyOworCisJbXNyICA9IHJlYWRfbmljX2J5dGUoZGV2LCBNU1IpOworCW1zciAmPSB+IE1TUl9MSU5LX01BU0s7CisKKwkvKiBkbyBub3QgY2hhbmdlIGluIGxpbmtfc3RhdGUgIT0gV0xBTl9MSU5LX0FTU09DSUFURUQuCisJICogbXNyIG11c3QgYmUgdXBkYXRlZCBpZiB0aGUgc3RhdGUgaXMgQVNTT0NJQVRJTkcuCisJICogdGhpcyBpcyBpbnRlbnRpb25hbCBhbmQgbWFrZSBzZW5zZSBmb3IgYWQtaG9jIGFuZAorCSAqIG1hc3RlciAoc2VlIHRoZSBjcmVhdGUgQlNTL0lCU1MgZnVuYykKKwkgKi8KKwlpZiAocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKXsKKworCQlpZiAocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpCisJCQltc3IgfD0gKE1TUl9MSU5LX01BTkFHRUQ8PE1TUl9MSU5LX1NISUZUKTsKKwkJZWxzZSBpZiAocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCisJCQltc3IgfD0gKE1TUl9MSU5LX0FESE9DPDxNU1JfTElOS19TSElGVCk7CisJCWVsc2UgaWYgKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikKKwkJCW1zciB8PSAoTVNSX0xJTktfTUFTVEVSPDxNU1JfTElOS19TSElGVCk7CisKKwl9ZWxzZQorCQltc3IgfD0gKE1TUl9MSU5LX05PTkU8PE1TUl9MSU5LX1NISUZUKTsKKworCXdyaXRlX25pY19ieXRlKGRldiwgTVNSLCBtc3IpOworfQorCit2b2lkIHJ0bDgxOTJfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisvLwl1MzIgdHg7CisJUlRfVFJBQ0UoQ09NUF9DSCwgIj09PT09PiVzKCk9PT09Y2g6JWRcbiIsIF9fRlVOQ1RJT05fXywgY2gpOworCXByaXYtPmNoYW49Y2g7CisKKwkvKiB0aGlzIGhhY2sgc2hvdWxkIGF2b2lkIGZyYW1lIFRYIGR1cmluZyBjaGFubmVsIHNldHRpbmcqLworCisKKy8vCXR4ID0gcmVhZF9uaWNfZHdvcmQoZGV2LFRYX0NPTkYpOworLy8JdHggJj0gflRYX0xPT1BCQUNLX01BU0s7CisKKyNpZm5kZWYgTE9PUF9URVNUCisvLwl3cml0ZV9uaWNfZHdvcmQoZGV2LFRYX0NPTkYsIHR4IHwoIFRYX0xPT1BCQUNLX01BQzw8VFhfTE9PUEJBQ0tfU0hJRlQpKTsKKworCS8vbmVlZCB0byBpbXBsZW1lbnQgcmYgc2V0IGNoYW5uZWwgaGVyZSBXQgorCisJaWYgKHByaXYtPnJmX3NldF9jaGFuKQorCXByaXYtPnJmX3NldF9jaGFuKGRldixwcml2LT5jaGFuKTsKKwltZGVsYXkoMTApOworLy8Jd3JpdGVfbmljX2R3b3JkKGRldixUWF9DT05GLHR4IHwgKFRYX0xPT1BCQUNLX05PTkU8PFRYX0xPT1BCQUNLX1NISUZUKSk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgcnRsODE5Ml9yeF9pc3Ioc3RydWN0IHVyYiAqdXJiKTsKKy8vc3RhdGljIHZvaWQgcnRsODE5Ml9yeF9pc3Ioc3RydWN0IHVyYiAqcnhfdXJiKTsKKwordTMyIGdldF9yeHBhY2tldF9zaGlmdGJ5dGVzXzgxOXh1c2Ioc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcHN0YXRzKQoreworCisjaWZkZWYgVVNCX1JYX0FHR1JFR0FUSU9OX1NVUFBPUlQKKwlpZiAocHN0YXRzLT5iaXNyeGFnZ3JzdWJmcmFtZSkKKwkJcmV0dXJuIChzaXplb2YocnhfZGVzY184MTl4X3VzYikgKyBwc3RhdHMtPlJ4RHJ2SW5mb1NpemUKKwkJCSsgcHN0YXRzLT5SeEJ1ZlNoaWZ0ICsgOCk7CisJZWxzZQorI2VuZGlmCisJCXJldHVybiAoc2l6ZW9mKHJ4X2Rlc2NfODE5eF91c2IpICsgcHN0YXRzLT5SeERydkluZm9TaXplCisJCQkJKyBwc3RhdHMtPlJ4QnVmU2hpZnQpOworCit9CitzdGF0aWMgaW50IHJ0bDgxOTJfcnhfaW5pdGlhdGUoc3RydWN0IG5ldF9kZXZpY2UqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdXJiICplbnRyeTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBydGw4MTkyX3J4X2luZm8gKmluZm87CisKKwkvKiBub21hbCBwYWNrZXQgcnggcHJvY2VkdXJlICovCisJd2hpbGUgKHNrYl9xdWV1ZV9sZW4oJnByaXYtPnJ4X3F1ZXVlKSA8IE1BWF9SWF9VUkIpIHsKKwkJc2tiID0gX19kZXZfYWxsb2Nfc2tiKFJYX1VSQl9TSVpFLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFza2IpCisJCQlicmVhazsKKwkJZW50cnkgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCQlpZiAoIWVudHJ5KSB7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCWJyZWFrOworCQl9CisvLwkJcHJpbnRrKCJub21hbCBwYWNrZXQgSU4gcmVxdWVzdCFcbiIpOworCQl1c2JfZmlsbF9idWxrX3VyYihlbnRyeSwgcHJpdi0+dWRldiwKKwkJCQkgIHVzYl9yY3ZidWxrcGlwZShwcml2LT51ZGV2LCAzKSwgc2tiX3RhaWxfcG9pbnRlcihza2IpLAorCQkJCSAgUlhfVVJCX1NJWkUsIHJ0bDgxOTJfcnhfaXNyLCBza2IpOworCQlpbmZvID0gKHN0cnVjdCBydGw4MTkyX3J4X2luZm8gKikgc2tiLT5jYjsKKwkJaW5mby0+dXJiID0gZW50cnk7CisJCWluZm8tPmRldiA9IGRldjsKKwkJaW5mby0+b3V0X3BpcGUgPSAzOyAvL2Rlbm90ZSByeCBub3JtYWwgcGFja2V0IHF1ZXVlCisJCXNrYl9xdWV1ZV90YWlsKCZwcml2LT5yeF9xdWV1ZSwgc2tiKTsKKwkJdXNiX3N1Ym1pdF91cmIoZW50cnksIEdGUF9LRVJORUwpOworCX0KKworCS8qIGNvbW1hbmQgcGFja2V0IHJ4IHByb2NlZHVyZSAqLworCXdoaWxlIChza2JfcXVldWVfbGVuKCZwcml2LT5yeF9xdWV1ZSkgPCBNQVhfUlhfVVJCICsgMykgeworLy8JCXByaW50aygiY29tbWFuZCBwYWNrZXQgSU4gcmVxdWVzdCFcbiIpOworCQlza2IgPSBfX2Rldl9hbGxvY19za2IoUlhfVVJCX1NJWkUgLEdGUF9LRVJORUwpOworCQlpZiAoIXNrYikKKwkJCWJyZWFrOworCQllbnRyeSA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJCWlmICghZW50cnkpIHsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJYnJlYWs7CisJCX0KKwkJdXNiX2ZpbGxfYnVsa191cmIoZW50cnksIHByaXYtPnVkZXYsCisJCQkJICB1c2JfcmN2YnVsa3BpcGUocHJpdi0+dWRldiwgOSksIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwKKwkJCQkgIFJYX1VSQl9TSVpFLCBydGw4MTkyX3J4X2lzciwgc2tiKTsKKwkJaW5mbyA9IChzdHJ1Y3QgcnRsODE5Ml9yeF9pbmZvICopIHNrYi0+Y2I7CisJCWluZm8tPnVyYiA9IGVudHJ5OworCQlpbmZvLT5kZXYgPSBkZXY7CisJCSAgIGluZm8tPm91dF9waXBlID0gOTsgLy9kZW5vdGUgcnggY21kIHBhY2tldCBxdWV1ZQorCQlza2JfcXVldWVfdGFpbCgmcHJpdi0+cnhfcXVldWUsIHNrYik7CisJCXVzYl9zdWJtaXRfdXJiKGVudHJ5LCBHRlBfS0VSTkVMKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBydGw4MTkyX3NldF9yeGNvbmYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIHJ4Y29uZjsKKworCXJ4Y29uZj1yZWFkX25pY19kd29yZChkZXYsUkNSKTsKKwlyeGNvbmYgPSByeGNvbmYgJn4gTUFDX0ZJTFRFUl9NQVNLOworCXJ4Y29uZiA9IHJ4Y29uZiB8IFJDUl9BTUY7CisJcnhjb25mID0gcnhjb25mIHwgUkNSX0FERjsKKwlyeGNvbmYgPSByeGNvbmYgfCBSQ1JfQUI7CisJcnhjb25mID0gcnhjb25mIHwgUkNSX0FNOworCS8vcnhjb25mID0gcnhjb25mIHwgUkNSX0FDRjsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHtETUVTRyAoIk5JQyBpbiBwcm9taXNjIG1vZGUiKTt9CisKKwlpZihwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SIHx8IFwKKwkgICBkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpeworCQlyeGNvbmYgPSByeGNvbmYgfCBSQ1JfQUFQOworCX0gLyplbHNlIGlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUil7CisJCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfQUxMTUFDX0ZSQU1FX1NISUZUKTsKKwkJcnhjb25mID0gcnhjb25mIHwgKDE8PFJYX0NIRUNLX0JTU0lEX1NISUZUKTsKKwl9Ki9lbHNleworCQlyeGNvbmYgPSByeGNvbmYgfCBSQ1JfQVBNOworCQlyeGNvbmYgPSByeGNvbmYgfCBSQ1JfQ0JTU0lEOworCX0KKworCisJaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUil7CisJCXJ4Y29uZiA9IHJ4Y29uZiB8IFJDUl9BSUNWOworCQlyeGNvbmYgPSByeGNvbmYgfCBSQ1JfQVBXUk1HVDsKKwl9CisKKwlpZiggcHJpdi0+Y3JjbW9uID09IDEgJiYgcHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikKKwkJcnhjb25mID0gcnhjb25mIHwgUkNSX0FDUkMzMjsKKworCisJcnhjb25mID0gcnhjb25mICZ+IFJYX0ZJRk9fVEhSRVNIT0xEX01BU0s7CisJcnhjb25mID0gcnhjb25mIHwgKFJYX0ZJRk9fVEhSRVNIT0xEX05PTkU8PFJYX0ZJRk9fVEhSRVNIT0xEX1NISUZUKTsKKwlyeGNvbmYgPSByeGNvbmYgJn4gTUFYX1JYX0RNQV9NQVNLOworCXJ4Y29uZiA9IHJ4Y29uZiB8ICgodTMyKTc8PFJDUl9NWERNQV9PRkZTRVQpOworCisvLwlyeGNvbmYgPSByeGNvbmYgfCAoMTw8UlhfQVVUT1JFU0VUUEhZX1NISUZUKTsKKwlyeGNvbmYgPSByeGNvbmYgfCBSQ1JfT05MWUVSTFBLVDsKKworLy8Jcnhjb25mID0gcnhjb25mICZ+IFJDUl9DU19NQVNLOworLy8Jcnhjb25mID0gcnhjb25mIHwgKDE8PFJDUl9DU19TSElGVCk7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSQ1IsIHJ4Y29uZik7CisKKwkjaWZkZWYgREVCVUdfUlgKKwlETUVTRygicnhjb25mOiAleCAleCIscnhjb25mICxyZWFkX25pY19kd29yZChkZXYsUkNSKSk7CisJI2VuZGlmCit9CisvL3dhaXQgdG8gYmUgcmVtb3ZlZAordm9pZCBydGw4MTkyX3J4X2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8vdTggY21kOworCisJLy9zdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlydGw4MTkyX3J4X2luaXRpYXRlKGRldik7CisKKy8vCXJ0bDgxOTJfc2V0X3J4Y29uZihkZXYpOworfQorCisKK3ZvaWQgcnRsODE5Ml90eF9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKK30KKworCisKK3ZvaWQgcnRsODE5Ml9ydHhfZGlzYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXU4IGNtZDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgcnRsODE5Ml9yeF9pbmZvICppbmZvOworCisJY21kPXJlYWRfbmljX2J5dGUoZGV2LENNRFIpOworCXdyaXRlX25pY19ieXRlKGRldiwgQ01EUiwgY21kICZ+IFwKKwkJKENSX1RFfENSX1JFKSk7CisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMTApOworCisJd2hpbGUgKChza2IgPSBfX3NrYl9kZXF1ZXVlKCZwcml2LT5yeF9xdWV1ZSkpKSB7CisJCWluZm8gPSAoc3RydWN0IHJ0bDgxOTJfcnhfaW5mbyAqKSBza2ItPmNiOworCQlpZiAoIWluZm8tPnVyYikKKwkJCWNvbnRpbnVlOworCisJCXVzYl9raWxsX3VyYihpbmZvLT51cmIpOworCQlrZnJlZV9za2Ioc2tiKTsKKwl9CisKKwlpZiAoc2tiX3F1ZXVlX2xlbigmcHJpdi0+c2tiX3F1ZXVlKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJza2JfcXVldWUgbm90IGVtcHR5XG4iKTsKKwl9CisKKwlza2JfcXVldWVfcHVyZ2UoJnByaXYtPnNrYl9xdWV1ZSk7CisJcmV0dXJuOworfQorCisKK2ludCBhbGxvY190eF9iZWFjb25fZGVzY19yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCkKK3sKKwlyZXR1cm4gMDsKK30KKworaW5saW5lIHUxNiBpZWVlcmF0ZTJydGxyYXRlKGludCByYXRlKQoreworCXN3aXRjaChyYXRlKXsKKwljYXNlIDEwOgorCXJldHVybiAwOworCWNhc2UgMjA6CisJcmV0dXJuIDE7CisJY2FzZSA1NToKKwlyZXR1cm4gMjsKKwljYXNlIDExMDoKKwlyZXR1cm4gMzsKKwljYXNlIDYwOgorCXJldHVybiA0OworCWNhc2UgOTA6CisJcmV0dXJuIDU7CisJY2FzZSAxMjA6CisJcmV0dXJuIDY7CisJY2FzZSAxODA6CisJcmV0dXJuIDc7CisJY2FzZSAyNDA6CisJcmV0dXJuIDg7CisJY2FzZSAzNjA6CisJcmV0dXJuIDk7CisJY2FzZSA0ODA6CisJcmV0dXJuIDEwOworCWNhc2UgNTQwOgorCXJldHVybiAxMTsKKwlkZWZhdWx0OgorCXJldHVybiAzOworCisJfQorfQorc3RhdGljIHUxNiBydGxfcmF0ZVtdID0gezEwLDIwLDU1LDExMCw2MCw5MCwxMjAsMTgwLDI0MCwzNjAsNDgwLDU0MH07CitpbmxpbmUgdTE2IHJ0bDgxOTJfcmF0ZTJyYXRlKHNob3J0IHJhdGUpCit7CisJaWYgKHJhdGUgPjExKSByZXR1cm4gMDsKKwlyZXR1cm4gcnRsX3JhdGVbcmF0ZV07Cit9CisKKworLyogVGhlIHByb3R5cGUgb2YgcnhfaXNyIGhhcyBjaGFuZ2VkIHNpbmNlIG9uZSB2ZXJpb24gb2YgTGludXggS2VybmVsICovCitzdGF0aWMgdm9pZCBydGw4MTkyX3J4X2lzcihzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHJ0bDgxOTJfcnhfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgcnRsODE5Ml9yeF9pbmZvICopc2tiLT5jYjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaW5mby0+ZGV2OworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgb3V0X3BpcGUgPSBpbmZvLT5vdXRfcGlwZTsKKwlpbnQgZXJyOworCWlmKCFwcml2LT51cCkKKwkJcmV0dXJuOworCWlmICh1bmxpa2VseSh1cmItPnN0YXR1cykpIHsKKwkJaW5mby0+dXJiID0gTlVMTDsKKwkJcHJpdi0+c3RhdHMucnhzdGF0ZXJyKys7CisJCXByaXYtPmllZWU4MDIxMS0+c3RhdHMucnhfZXJyb3JzKys7CisJCXVzYl9mcmVlX3VyYih1cmIpOworCS8vCXByaW50aygiJXMoKTpyeCBzdGF0dXMgZXJyXG4iLF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisJc2tiX3VubGluayhza2IsICZwcml2LT5yeF9xdWV1ZSk7CisJc2tiX3B1dChza2IsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisKKwlza2JfcXVldWVfdGFpbCgmcHJpdi0+c2tiX3F1ZXVlLCBza2IpOworCXRhc2tsZXRfc2NoZWR1bGUoJnByaXYtPmlycV9yeF90YXNrbGV0KTsKKworCXNrYiA9IGRldl9hbGxvY19za2IoUlhfVVJCX1NJWkUpOworCWlmICh1bmxpa2VseSghc2tiKSkgeworCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJcHJpbnRrKCIlcygpOmNhbix0IGFsbG9jIHNrYlxuIixfX0ZVTkNUSU9OX18pOworCQkvKiBUT0RPIGNoZWNrIHJ4IHF1ZXVlIGxlbmd0aCBhbmQgcmVmaWxsICpzb21ld2hlcmUqICovCisJCXJldHVybjsKKwl9CisKKwl1c2JfZmlsbF9idWxrX3VyYih1cmIsIHByaXYtPnVkZXYsCisJCQl1c2JfcmN2YnVsa3BpcGUocHJpdi0+dWRldiwgb3V0X3BpcGUpLCBza2JfdGFpbF9wb2ludGVyKHNrYiksCisJCQlSWF9VUkJfU0laRSwgcnRsODE5Ml9yeF9pc3IsIHNrYik7CisKKwlpbmZvID0gKHN0cnVjdCBydGw4MTkyX3J4X2luZm8gKikgc2tiLT5jYjsKKwlpbmZvLT51cmIgPSB1cmI7CisJaW5mby0+ZGV2ID0gZGV2OworCWluZm8tPm91dF9waXBlID0gb3V0X3BpcGU7CisKKwl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKKwl1cmItPmNvbnRleHQgPSBza2I7CisJc2tiX3F1ZXVlX3RhaWwoJnByaXYtPnJ4X3F1ZXVlLCBza2IpOworCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYoZXJyICYmIGVyciAhPSBFUEVSTSkKKwkJcHJpbnRrKCJjYW4gbm90IHN1Ym1pdCByeHVyYiwgZXJyIGlzICV4LFVSQiBzdGF0dXMgaXMgJXhcbiIsZXJyLHVyYi0+c3RhdHVzKTsKK30KKwordTMyCitydGw4MTl4dXNiX3J4X2NvbW1hbmRfcGFja2V0KAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcHN0YXRzCisJKQoreworCXUzMglzdGF0dXM7CisKKwkvL1JUX1RSQUNFKENPTVBfUkVDViwgREJHX1RSQUNFLCAoIi0tLT4gUnhDb21tYW5kUGFja2V0SGFuZGxlODE5eFVzYigpXG4iKSk7CisKKwlzdGF0dXMgPSBjbXBrX21lc3NhZ2VfaGFuZGxlX3J4KGRldiwgcHN0YXRzKTsKKwlpZiAoc3RhdHVzKQorCXsKKwkJRE1FU0coInJ4Y29tbWFuZHBhY2tldGhhbmRsZTgxOXh1c2I6IEl0IGlzIGEgY29tbWFuZCBwYWNrZXRcbiIpOworCX0KKwllbHNlCisJeworCQkvL1JUX1RSQUNFKENPTVBfUkVDViwgREJHX1RSQUNFLCAoIlJ4Q29tbWFuZFBhY2tldEhhbmRsZTgxOXhVc2I6IEl0IGlzIG5vdCBhIGNvbW1hbmQgcGFja2V0XG4iKSk7CisJfQorCisJLy9SVF9UUkFDRShDT01QX1JFQ1YsIERCR19UUkFDRSwgKCI8LS0tIFJ4Q29tbWFuZFBhY2tldEhhbmRsZTgxOXhVc2IoKVxuIikpOworCXJldHVybiBzdGF0dXM7Cit9CisKKwordm9pZCBydGw4MTkyX2RhdGFfaGFyZF9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLy9GSVhNRSAhIQorfQorCisKK3ZvaWQgcnRsODE5Ml9kYXRhX2hhcmRfcmVzdW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLy8gRklYTUUgISEKK30KKworLyogdGhpcyBmdW5jdGlvbiBUWCBkYXRhIGZyYW1lcyB3aGVuIHRoZSBpZWVlODAyMTEgc3RhY2sgcmVxdWlyZXMgdGhpcy4KKyAqIEl0IGNoZWNrcyBhbHNvIGlmIHdlIG5lZWQgdG8gc3RvcCB0aGUgaWVlZSB0eCBxdWV1ZSwgZXZlbnR1YWxseSBkbyBpdAorICovCit2b2lkIHJ0bDgxOTJfaGFyZF9kYXRhX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHJhdGUpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljYl9kZXNjICp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJdTggcXVldWVfaW5kZXggPSB0Y2JfZGVzYy0+cXVldWVfaW5kZXg7CisKKwkvKiBzaGFsbCBub3QgYmUgcmVmZXJyZWQgYnkgY29tbWFuZCBwYWNrZXQgKi8KKwlhc3NlcnQocXVldWVfaW5kZXggIT0gVFhDTURfUVVFVUUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOworCisJbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopKHNrYi0+Y2IpLCZkZXYsc2l6ZW9mKGRldikpOworLy8JdGNiX2Rlc2MtPlJBVFJJbmRleCA9IDc7CisvLwl0Y2JfZGVzYy0+YlR4RGlzYWJsZVJhdGVGYWxsQmFjayA9IDE7CisvLwl0Y2JfZGVzYy0+YlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlID0gMTsKKwl0Y2JfZGVzYy0+YlR4RW5hYmxlRndDYWxjRHVyID0gMTsKKwlza2JfcHVzaChza2IsIHByaXYtPmllZWU4MDIxMS0+dHhfaGVhZHJvb20pOworCXJldCA9IHJ0bDgxOTJfdHgoZGV2LCBza2IpOworCisJLy9wcml2LT5pZWVlODAyMTEtPnN0YXRzLnR4X2J5dGVzKz0oc2tiLT5sZW4gLSBwcml2LT5pZWVlODAyMTEtPnR4X2hlYWRyb29tKTsKKwkvL3ByaXYtPmllZWU4MDIxMS0+c3RhdHMudHhfcGFja2V0cysrOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CisKKy8vCXJldHVybiByZXQ7CisJcmV0dXJuOworfQorCisvKiBUaGlzIGlzIGEgcm91Z2ggYXR0ZW1wdCB0byBUWCBhIGZyYW1lCisgKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgaWVlZSA4MDIxMSBzdGFjayB0byBUWCBtYW5hZ2VtZW50IGZyYW1lcy4KKyAqIElmIHRoZSByaW5nIGlzIGZ1bGwgcGFja2V0IGFyZSBkcm9wcGVkIChmb3IgZGF0YSBmcmFtZSB0aGUgcXVldWUKKyAqIGlzIHN0b3BwZWQgYmVmb3JlIHRoaXMgY2FuIGhhcHBlbikuCisgKi8KK2ludCBydGw4MTkyX2hhcmRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljYl9kZXNjICp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJdTggcXVldWVfaW5kZXggPSB0Y2JfZGVzYy0+cXVldWVfaW5kZXg7CisKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT50eF9sb2NrLGZsYWdzKTsKKworCW1lbWNweSgodW5zaWduZWQgY2hhciAqKShza2ItPmNiKSwmZGV2LHNpemVvZihkZXYpKTsKKwlpZihxdWV1ZV9pbmRleCA9PSBUWENNRF9RVUVVRSkgeworCQlza2JfcHVzaChza2IsIFVTQl9IV0RFU0NfSEVBREVSX0xFTik7CisJCXJ0bDgxOXhVX3R4X2NtZChkZXYsIHNrYik7CisJCXJldCA9IDE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOworCQlyZXR1cm4gcmV0OworCX0gZWxzZSB7CisJCXNrYl9wdXNoKHNrYiwgcHJpdi0+aWVlZTgwMjExLT50eF9oZWFkcm9vbSk7CisJCXJldCA9IHJ0bDgxOTJfdHgoZGV2LCBza2IpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworCit2b2lkIHJ0bDgxOTJfdHJ5X3dha2VfcXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHByaSk7CisKKyNpZmRlZiBVU0JfVFhfRFJJVkVSX0FHR1JFR0FUSU9OX0VOQUJMRQordTE2IERydkFnZ3JfUGFkZGluZ0FkZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXUxNiAgICAgUGFkZGluZ051bSA9ICAyNTYgLSAoKHNrYi0+bGVuICsgVFhfUEFDS0VUX0RSVkFHR1JfU1VCRlJBTUVfU0hJRlRfQllURVMpICUgMjU2KTsKKwlyZXR1cm4gIChQYWRkaW5nTnVtJjB4ZmYpOworfQorCit1OCBNUmF0ZVRvSHdSYXRlODE5MFBjaSh1OCByYXRlKTsKK3U4IFF1ZXJ5SXNTaG9ydCh1OCBUeEhULCB1OCBUeFJhdGUsIGNiX2Rlc2MgKnRjYl9kZXNjKTsKK3U4IE1hcEh3UXVldWVUb0Zpcm13YXJlUXVldWUodTggUXVldWVJRCk7CitzdHJ1Y3Qgc2tfYnVmZiAqRHJ2QWdncl9BZ2dyZWdhdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWVlZTgwMjExX2Rydl9hZ2dfdHhiICpwU2VuZExpc3QpCit7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwljYl9kZXNjIAkqdGNiX2Rlc2MgPSBOVUxMOworCXU4IAkJaTsKKwl1MzIJCVRvdGFsTGVuZ3RoOworCXN0cnVjdCBza19idWZmCSpza2I7CisJc3RydWN0IHNrX2J1ZmYgICphZ2dfc2tiOworCXR4X2Rlc2NfODE5eF91c2JfYWdncl9zdWJmcmFtZSAqdHhfYWdnX2Rlc2MgPSBOVUxMOworCXR4X2Z3aW5mb184MTl4X3VzYgkgICAgICAgKnR4X2Z3aW5mbyA9IE5VTEw7CisKKwkvLworCS8vIExvY2FsIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uLgorCS8vCisJLyogZmlyc3Qgc2tiIGluaXRpYWxpemF0aW9uICovCisJc2tiID0gcFNlbmRMaXN0LT50eF9hZ2dfZnJhbWVzWzBdOworCVRvdGFsTGVuZ3RoID0gc2tiLT5sZW47CisKKwkvKiBHZXQgdGhlIHRvdGFsIGFnZ3JlZ2F0aW9uIGxlbmd0aCBpbmNsdWRpbmcgdGhlIHBhZGRpbmcgc3BhY2UgYW5kCisJICogc3ViIGZyYW1lIGhlYWRlci4KKwkgKi8KKwlmb3IoaSA9IDE7IGkgPCBwU2VuZExpc3QtPm5yX2Rydl9hZ2dfZnJhbWVzOyBpKyspIHsKKwkJVG90YWxMZW5ndGggKz0gRHJ2QWdncl9QYWRkaW5nQWRkKGRldiwgc2tiKTsKKwkJc2tiID0gcFNlbmRMaXN0LT50eF9hZ2dfZnJhbWVzW2ldOworCQlUb3RhbExlbmd0aCArPSAoc2tiLT5sZW4gKyBUWF9QQUNLRVRfRFJWQUdHUl9TVUJGUkFNRV9TSElGVF9CWVRFUyk7CisJfQorCisJLyogYWxsb2NhdGUgc2tiIHRvIGNvbnRhaW4gdGhlIGFnZ3JlZ2F0ZWQgcGFja2V0cyAqLworCWFnZ19za2IgPSBkZXZfYWxsb2Nfc2tiKFRvdGFsTGVuZ3RoICsgaWVlZS0+dHhfaGVhZHJvb20pOworCW1lbXNldChhZ2dfc2tiLT5kYXRhLCAwLCBhZ2dfc2tiLT5sZW4pOworCXNrYl9yZXNlcnZlKGFnZ19za2IsIGllZWUtPnR4X2hlYWRyb29tKTsKKworLy8JUlRfREVCVUdfREFUQShDT01QX1NFTkQsIHNrYi0+Y2IsIHNpemVvZihza2ItPmNiKSk7CisJLyogcmVzZXJ2ZSBpbmZvIGZvciBmaXJzdCBzdWJmcmFtZSBUeCBkZXNjcmlwdG9yIHRvIGJlIHNldCBpbiB0aGUgdHggZnVuY3Rpb24gKi8KKwlza2IgPSBwU2VuZExpc3QtPnR4X2FnZ19mcmFtZXNbMF07CisJdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKShza2ItPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOworCXRjYl9kZXNjLT5kcnZfYWdnX2VuYWJsZSA9IDE7CisJdGNiX2Rlc2MtPnBrdF9zaXplID0gc2tiLT5sZW47CisJdGNiX2Rlc2MtPkRydkFnZ3JOdW0gPSBwU2VuZExpc3QtPm5yX2Rydl9hZ2dfZnJhbWVzOworCXByaW50aygiRHJ2QWdnTnVtID0gJWRcbiIsIHRjYl9kZXNjLT5EcnZBZ2dyTnVtKTsKKy8vCVJUX0RFQlVHX0RBVEEoQ09NUF9TRU5ELCBza2ItPmNiLCBzaXplb2Yoc2tiLT5jYikpOworLy8JcHJpbnRrKCI9PT09PT09PT5za2ItPmRhdGEgPT09PT09PiBcbiIpOworLy8JUlRfREVCVUdfREFUQShDT01QX1NFTkQsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCW1lbWNweShhZ2dfc2tiLT5jYiwgc2tiLT5jYiwgc2l6ZW9mKHNrYi0+Y2IpKTsKKwltZW1jcHkoc2tiX3B1dChhZ2dfc2tiLHNrYi0+bGVuKSxza2ItPmRhdGEsc2tiLT5sZW4pOworCisJZm9yKGkgPSAxOyBpIDwgcFNlbmRMaXN0LT5ucl9kcnZfYWdnX2ZyYW1lczsgaSsrKSB7CisJCS8qIHB1c2ggdGhlIG5leHQgc3ViIGZyYW1lIHRvIGJlIDI1NiBieXRlIGFsaW5lICovCisJCXNrYl9wdXQoYWdnX3NrYixEcnZBZ2dyX1BhZGRpbmdBZGQoZGV2LHNrYikpOworCisJCS8qIFN1YmZyYW1lIGRydiBUeCBkZXNjcmlwdG9yIGFuZCBmaXJtd2FyZSBpbmZvIHNldHRpbmcgKi8KKwkJc2tiID0gcFNlbmRMaXN0LT50eF9hZ2dfZnJhbWVzW2ldOworCQl0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJCXR4X2FnZ19kZXNjID0gKHR4X2Rlc2NfODE5eF91c2JfYWdncl9zdWJmcmFtZSAqKWFnZ19za2ItPnRhaWw7CisJCXR4X2Z3aW5mbyA9ICh0eF9md2luZm9fODE5eF91c2IgKikoYWdnX3NrYi0+dGFpbCArIHNpemVvZih0eF9kZXNjXzgxOXhfdXNiX2FnZ3Jfc3ViZnJhbWUpKTsKKworCQltZW1zZXQodHhfZndpbmZvLDAsc2l6ZW9mKHR4X2Z3aW5mb184MTl4X3VzYikpOworCQkvKiBEV09SRCAwICovCisJCXR4X2Z3aW5mby0+VHhIVCA9ICh0Y2JfZGVzYy0+ZGF0YV9yYXRlJjB4ODApPzE6MDsKKwkJdHhfZndpbmZvLT5UeFJhdGUgPSBNUmF0ZVRvSHdSYXRlODE5MFBjaSh0Y2JfZGVzYy0+ZGF0YV9yYXRlKTsKKwkJdHhfZndpbmZvLT5FbmFibGVDUFVEdXIgPSB0Y2JfZGVzYy0+YlR4RW5hYmxlRndDYWxjRHVyOworCQl0eF9md2luZm8tPlNob3J0ID0gUXVlcnlJc1Nob3J0KHR4X2Z3aW5mby0+VHhIVCwgdHhfZndpbmZvLT5UeFJhdGUsIHRjYl9kZXNjKTsKKwkJaWYodGNiX2Rlc2MtPmJBTVBEVUVuYWJsZSkgey8vQU1QRFUgZW5hYmxlZAorCQkJdHhfZndpbmZvLT5BbGxvd0FnZ3JlZ2F0aW9uID0gMTsKKwkJCS8qIERXT1JEIDEgKi8KKwkJCXR4X2Z3aW5mby0+UnhNRiA9IHRjYl9kZXNjLT5hbXBkdV9mYWN0b3I7CisJCQl0eF9md2luZm8tPlJ4QU1EID0gdGNiX2Rlc2MtPmFtcGR1X2RlbnNpdHkmMHgwNzsvL2FtcGR1ZGVuc2l0eQorCQl9IGVsc2UgeworCQkJdHhfZndpbmZvLT5BbGxvd0FnZ3JlZ2F0aW9uID0gMDsKKwkJCS8qIERXT1JEIDEgKi8KKwkJCXR4X2Z3aW5mby0+UnhNRiA9IDA7CisJCQl0eF9md2luZm8tPlJ4QU1EID0gMDsKKwkJfQorCisJCS8qIFByb3RlY3Rpb24gbW9kZSByZWxhdGVkICovCisJCXR4X2Z3aW5mby0+UnRzRW5hYmxlID0gKHRjYl9kZXNjLT5iUlRTRW5hYmxlKT8xOjA7CisJCXR4X2Z3aW5mby0+Q3RzRW5hYmxlID0gKHRjYl9kZXNjLT5iQ1RTRW5hYmxlKT8xOjA7CisJCXR4X2Z3aW5mby0+UnRzU1RCQyA9ICh0Y2JfZGVzYy0+YlJUU1NUQkMpPzE6MDsKKwkJdHhfZndpbmZvLT5SdHNIVCA9ICh0Y2JfZGVzYy0+cnRzX3JhdGUmMHg4MCk/MTowOworCQl0eF9md2luZm8tPlJ0c1JhdGUgPSAgTVJhdGVUb0h3UmF0ZTgxOTBQY2koKHU4KXRjYl9kZXNjLT5ydHNfcmF0ZSk7CisJCXR4X2Z3aW5mby0+UnRzU3ViY2FycmllciA9ICh0eF9md2luZm8tPlJ0c0hUPT0wKT8odGNiX2Rlc2MtPlJUU1NDKTowOworCQl0eF9md2luZm8tPlJ0c0JhbmR3aWR0aCA9ICh0eF9md2luZm8tPlJ0c0hUPT0xKT8oKHRjYl9kZXNjLT5iUlRTQlcpPzE6MCk6MDsKKwkJdHhfZndpbmZvLT5SdHNTaG9ydCA9ICh0eF9md2luZm8tPlJ0c0hUPT0wKT8odGNiX2Rlc2MtPmJSVFNVc2VTaG9ydFByZWFtYmxlPzE6MCk6XAorCQkJCSAgICAgICh0Y2JfZGVzYy0+YlJUU1VzZVNob3J0R0k/MTowKTsKKworCQkvKiBTZXQgQmFuZHdpZHRoIGFuZCBzdWItY2hhbm5lbCBzZXR0aW5ncy4gKi8KKwkJaWYocHJpdi0+Q3VycmVudENoYW5uZWxCVyA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwXzQwKQorCQl7CisJCQlpZih0Y2JfZGVzYy0+YlBhY2tldEJXKSB7CisJCQkJdHhfZndpbmZvLT5UeEJhbmR3aWR0aCA9IDE7CisJCQkJdHhfZndpbmZvLT5UeFN1YkNhcnJpZXIgPSAwOyAgICAvL0J5IFNEMydzIEplcnJ5IHN1Z2dlc3Rpb24sIHVzZSBkdXBsaWNhdGVkIG1vZGUKKwkJCX0gZWxzZSB7CisJCQkJdHhfZndpbmZvLT5UeEJhbmR3aWR0aCA9IDA7CisJCQkJdHhfZndpbmZvLT5UeFN1YkNhcnJpZXIgPSBwcml2LT5uQ3VyNDBNaHpQcmltZVNDOworCQkJfQorCQl9IGVsc2UgeworCQkJdHhfZndpbmZvLT5UeEJhbmR3aWR0aCA9IDA7CisJCQl0eF9md2luZm8tPlR4U3ViQ2FycmllciA9IDA7CisJCX0KKworCQkvKiBGaWxsIFR4IGRlc2NyaXB0b3IgKi8KKwkJbWVtc2V0KHR4X2FnZ19kZXNjLCAwLCBzaXplb2YodHhfZGVzY184MTl4X3VzYl9hZ2dyX3N1YmZyYW1lKSk7CisJCS8qIERXT1JEIDAgKi8KKwkJLy90eF9hZ2dfZGVzYy0+TElOSVAgPSAwOworCQkvL3R4X2FnZ19kZXNjLT5DbWRJbml0ID0gMTsKKwkJdHhfYWdnX2Rlc2MtPk9mZnNldCA9ICBzaXplb2YodHhfZndpbmZvXzgxOXhfdXNiKSArIDg7CisJCS8qIGFscmVhZHkgcmF3IGRhdGEsIG5lZWQgbm90IHRvIHN1YnN0cmFjdCBoZWFkZXIgbGVuZ3RoICovCisJCXR4X2FnZ19kZXNjLT5Qa3RTaXplID0gc2tiLT5sZW4gJiAweGZmZmY7CisKKwkJLypEV09SRCAxKi8KKwkJdHhfYWdnX2Rlc2MtPlNlY0NBTUlEPSAwOworCQl0eF9hZ2dfZGVzYy0+UkFUaWQgPSB0Y2JfZGVzYy0+UkFUUkluZGV4OworCQl7CisJCQkvL01QRFVPdmVyaGVhZCA9IDA7CisJCQl0eF9hZ2dfZGVzYy0+Tm9FbmMgPSAxOworCQl9CisJCXR4X2FnZ19kZXNjLT5TZWNUeXBlID0gMHgwOworCisJCWlmICh0Y2JfZGVzYy0+Ykh3U2VjKSB7CisJCQlzd2l0Y2ggKHByaXYtPmllZWU4MDIxMS0+cGFpcndpc2Vfa2V5X3R5cGUpCisJCQl7CisJCQkJY2FzZSBLRVlfVFlQRV9XRVA0MDoKKwkJCQljYXNlIEtFWV9UWVBFX1dFUDEwNDoKKwkJCQkJdHhfYWdnX2Rlc2MtPlNlY1R5cGUgPSAweDE7CisJCQkJCXR4X2FnZ19kZXNjLT5Ob0VuYyA9IDA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgS0VZX1RZUEVfVEtJUDoKKwkJCQkJdHhfYWdnX2Rlc2MtPlNlY1R5cGUgPSAweDI7CisJCQkJCXR4X2FnZ19kZXNjLT5Ob0VuYyA9IDA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgS0VZX1RZUEVfQ0NNUDoKKwkJCQkJdHhfYWdnX2Rlc2MtPlNlY1R5cGUgPSAweDM7CisJCQkJCXR4X2FnZ19kZXNjLT5Ob0VuYyA9IDA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgS0VZX1RZUEVfTkE6CisJCQkJCXR4X2FnZ19kZXNjLT5TZWNUeXBlID0gMHgwOworCQkJCQl0eF9hZ2dfZGVzYy0+Tm9FbmMgPSAxOworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXR4X2FnZ19kZXNjLT5RdWV1ZVNlbGVjdCA9IE1hcEh3UXVldWVUb0Zpcm13YXJlUXVldWUodGNiX2Rlc2MtPnF1ZXVlX2luZGV4KTsKKwkJdHhfYWdnX2Rlc2MtPlR4RldJbmZvU2l6ZSA9ICBzaXplb2YodHhfZndpbmZvXzgxOXhfdXNiKTsKKworCQl0eF9hZ2dfZGVzYy0+RElTRkIgPSB0Y2JfZGVzYy0+YlR4RGlzYWJsZVJhdGVGYWxsQmFjazsKKwkJdHhfYWdnX2Rlc2MtPlVTRVJBVEUgPSB0Y2JfZGVzYy0+YlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlOworCisJCXR4X2FnZ19kZXNjLT5PV04gPSAxOworCisJCS8vRFdPUkQgMgorCQkvKiBBY2NvcmRpbmcgd2luZG93cyBkcml2ZXIsIGl0IHNlZW1zIHRoYXQgdGhlcmUgbm8gbmVlZCB0byBmaWxsIHRoaXMgZmllbGQgKi8KKwkJLy90eF9hZ2dfZGVzYy0+VHhCdWZmZXJTaXplPSAodTMyKShza2ItPmxlbiAtIFVTQl9IV0RFU0NfSEVBREVSX0xFTik7CisKKwkJLyogdG8gZmlsbCBuZXh0IHBhY2tldCAqLworCQlza2JfcHV0KGFnZ19za2IsVFhfUEFDS0VUX0RSVkFHR1JfU1VCRlJBTUVfU0hJRlRfQllURVMpOworCQltZW1jcHkoc2tiX3B1dChhZ2dfc2tiLHNrYi0+bGVuKSxza2ItPmRhdGEsc2tiLT5sZW4pOworCX0KKworCWZvcihpID0gMDsgaSA8IHBTZW5kTGlzdC0+bnJfZHJ2X2FnZ19mcmFtZXM7IGkrKykgeworCQlkZXZfa2ZyZWVfc2tiX2FueShwU2VuZExpc3QtPnR4X2FnZ19mcmFtZXNbaV0pOworCX0KKworCXJldHVybiBhZ2dfc2tiOworfQorCisvKiBOT1RFOgorCVRoaXMgZnVuY3Rpb24gcmV0dXJuIGEgbGlzdCBvZiBQVENCIHdoaWNoIGlzIHByb3BlciB0byBiZSBhZ2dyZWdhdGUgd2l0aCB0aGUgaW5wdXQgVENCLgorCUlmIG5vIHByb3BlciBUQ0IgaXMgZm91bmQgdG8gZG8gYWdncmVnYXRpb24sIFNlbmRMaXN0IHdpbGwgb25seSBjb250YWluIHRoZSBpbnB1dCBUQ0IuCisqLwordTggRHJ2QWdncl9HZXRBZ2dyZWdhdGlibGVMaXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCisJCXN0cnVjdCBpZWVlODAyMTFfZHJ2X2FnZ190eGIgKnBTZW5kTGlzdCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IG5ldGRldl9wcml2KGRldik7CisJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKwl1MTYJCW5NYXhBZ2dyTnVtID0gcEhUSW5mby0+VXNiVHhBZ2dyTnVtOworCWNiX2Rlc2MgCSp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJdTgJCVF1ZXVlSUQgPSB0Y2JfZGVzYy0+cXVldWVfaW5kZXg7CisKKwlkbyB7CisJCXBTZW5kTGlzdC0+dHhfYWdnX2ZyYW1lc1twU2VuZExpc3QtPm5yX2Rydl9hZ2dfZnJhbWVzKytdID0gc2tiOworCQlpZihwU2VuZExpc3QtPm5yX2Rydl9hZ2dfZnJhbWVzID49IG5NYXhBZ2dyTnVtKSB7CisJCQlicmVhazsKKwkJfQorCisJfSB3aGlsZSgoc2tiID0gc2tiX2RlcXVldWUoJmllZWUtPnNrYl9kcnZfYWdnUVtRdWV1ZUlEXSkpKTsKKworCVJUX1RSQUNFKENPTVBfQU1TRFUsICJEcnZBZ2dyX0dldEFnZ3JlZ2F0aWJsZUxpc3QsIG5BZ2dyVGNiTnVtID0gJWQgXG4iLCBwU2VuZExpc3QtPm5yX2Rydl9hZ2dfZnJhbWVzKTsKKwlyZXR1cm4gcFNlbmRMaXN0LT5ucl9kcnZfYWdnX2ZyYW1lczsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBydGw4MTkyX3R4X2lzcihzdHJ1Y3QgdXJiICp0eF91cmIpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiopdHhfdXJiLT5jb250ZXh0OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gTlVMTDsKKwljYl9kZXNjICp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJdTggIHF1ZXVlX2luZGV4ID0gdGNiX2Rlc2MtPnF1ZXVlX2luZGV4OworLy8JYm9vbCBiVG9TZW5kMEJ5dGU7CisvLwl1MTYgQnVmTGVuID0gc2tiLT5sZW47CisKKwltZW1jcHkoJmRldiwoc3RydWN0IG5ldF9kZXZpY2UqKShza2ItPmNiKSxzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2UqKSk7CisJcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZih0Y2JfZGVzYy0+cXVldWVfaW5kZXggIT0gVFhDTURfUVVFVUUpIHsKKwkJaWYodHhfdXJiLT5zdGF0dXMgPT0gMCkgeworCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQkvLyBBcyBhY3QgYXMgc3RhdGlvbiBtb2RlLCBkZXN0aW9uIHNoYWxsIGJlICB1bmljYXN0IGFkZHJlc3MuCisJCQkvL3ByaXYtPmllZWU4MDIxMS0+c3RhdHMudHhfYnl0ZXMrPShza2ItPmxlbiAtIHByaXYtPmllZWU4MDIxMS0+dHhfaGVhZHJvb20pOworCQkJLy9wcml2LT5pZWVlODAyMTEtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCXByaXYtPnN0YXRzLnR4b2t0b3RhbCsrOworCQkJcHJpdi0+aWVlZTgwMjExLT5MaW5rRGV0ZWN0SW5mby5OdW1UeE9rSW5QZXJpb2QrKzsKKwkJCXByaXYtPnN0YXRzLnR4Ynl0ZXN1bmljYXN0ICs9IChza2ItPmxlbiAtIHByaXYtPmllZWU4MDIxMS0+dHhfaGVhZHJvb20pOworCQl9IGVsc2UgeworCQkJcHJpdi0+aWVlZTgwMjExLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCS8vcHJpdi0+c3RhdHMudHhtYW5hZ2VlcnIrKzsKKwkJCS8qIFRPRE8gKi8KKwkJfQorCX0KKworCS8qIGZyZWUgc2tiIGFuZCB0eF91cmIgKi8KKwlpZihza2IgIT0gTlVMTCkgeworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQl1c2JfZnJlZV91cmIodHhfdXJiKTsKKwkJYXRvbWljX2RlYygmcHJpdi0+dHhfcGVuZGluZ1txdWV1ZV9pbmRleF0pOworCX0KKworCXsKKwkJLy8KKwkJLy8gSGFuZGxlIEhXIEJlYWNvbjoKKwkJLy8gV2UgaGFkIHRyYW5zZmVyIG91ciBiZWFjb24gZnJhbWUgdG8gaG9zdCBjb250cm9sZXIgYXQgdGhpcyBtb21lbnQuCisJCS8vCisJCS8vCisJCS8vIENhdXRpb246CisJCS8vIEhhbmRsaW5nIHRoZSB3YWl0IHF1ZXVlIG9mIGNvbW1hbmQgcGFja2V0cy4KKwkJLy8gRm9yIFR4IGNvbW1hbmQgcGFja2V0cywgd2UgbXVzdCBub3QgZG8gVENCIGZyYWdtZW50IGJlY2F1c2UgaXQgaXMgbm90IGhhbmRsZWQgcmlnaHQgbm93LgorCQkvLyBXZSBtdXN0IGN1dCB0aGUgcGFja2V0cyB0byBtYXRjaCB0aGUgc2l6ZSBvZiBUWF9DTURfUEtUIGJlZm9yZSB3ZSBzZW5kIGl0LgorCQkvLworCisJCS8qIEhhbmRsZSBNUERVIGluIHdhaXQgcXVldWUuICovCisJCWlmKHF1ZXVlX2luZGV4ICE9IEJFQUNPTl9RVUVVRSkgeworCQkJLyogRG9uJ3Qgc2VuZCBkYXRhIGZyYW1lIGR1cmluZyBzY2FubmluZy4qLworCQkJaWYoKHNrYl9xdWV1ZV9sZW4oJnByaXYtPmllZWU4MDIxMS0+c2tiX3dhaXRRW3F1ZXVlX2luZGV4XSkgIT0gMCkmJlwKKwkJCQkJKCEocHJpdi0+aWVlZTgwMjExLT5xdWV1ZV9zdG9wKSkpIHsKKwkJCQlpZihOVUxMICE9IChza2IgPSBza2JfZGVxdWV1ZSgmKHByaXYtPmllZWU4MDIxMS0+c2tiX3dhaXRRW3F1ZXVlX2luZGV4XSkpKSkKKwkJCQkJcHJpdi0+aWVlZTgwMjExLT5zb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdChza2IsIGRldik7CisKKwkJCQlyZXR1cm47IC8vbW9kaWZpZWQgYnkgZGF2aWQgdG8gYXZvaWQgZnVydGhlciBwcm9jZXNzaW5nIEFNU0RVCisJCQl9CisjaWZkZWYgVVNCX1RYX0RSSVZFUl9BR0dSRUdBVElPTl9FTkFCTEUKKwkJCWVsc2UgaWYgKChza2JfcXVldWVfbGVuKCZwcml2LT5pZWVlODAyMTEtPnNrYl9kcnZfYWdnUVtxdWV1ZV9pbmRleF0pIT0gMCkmJlwKKwkJCQkoIShwcml2LT5pZWVlODAyMTEtPnF1ZXVlX3N0b3ApKSkgeworCQkJCS8vIFR4IERyaXZlciBBZ2dyZWdhdGlvbiBwcm9jZXNzCisJCQkJLyogVGhlIGRyaXZlciB3aWxsIGFnZ3JlZ2F0aW9uIHRoZSBwYWNrZXRzIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHN0ZXRzCisJCQkJICogMS4gY2hlY2sgd2hldGhlciB0aGVyZSdzIHR4IGlycSBhdmFpbGFibGUsIGZvciBpdCdzIGEgY29tcGxldGlvbiByZXR1cm4KKwkJCQkgKiAgICBmdW5jdGlvbiwgaXQgc2hvdWxkIGNvbnRhaW4gZW5vdWdoIHR4IGlycTsKKwkJCQkgKiAyLiBjaGVjayBwYWtjZXQgdHlwZTsKKwkJCQkgKiAzLiBpbnRpYWxpemUgc2VuZGxpc3QsIGNoZWNrIHdoZXRoZXIgdGhlIHRvLWJlIHNlbmQgcGFja2V0IG5vIGdyZWF0ZXIgdGhhbiAxCisJCQkJICogNC4gYWdncmVnYXRpb24gdGhlIHBhY2tldHMsIGFuZCBmaWxsIGZpcm13YXJlIGluZm8gYW5kIHR4IGRlc2MgdG8gaXQsIGV0Yy4KKwkJCQkgKiA1LiBjaGVjayB3aGVodGVyIHRoZSBwYWNrZXQgY291bGQgYmUgc2VudCwgb3RoZXJ3aXNlIGp1c3QgaW5zZXJ0IHRvIHdhaXQgaGVhZAorCQkJCSAqICovCisJCQkJc2tiID0gc2tiX2RlcXVldWUoJnByaXYtPmllZWU4MDIxMS0+c2tiX2Rydl9hZ2dRW3F1ZXVlX2luZGV4XSk7CisJCQkJaWYoIWNoZWNrX25pY19lbm91Z2hfZGVzYyhkZXYsIHF1ZXVlX2luZGV4KSkgeworCQkJCQlza2JfcXVldWVfaGVhZCgmKHByaXYtPmllZWU4MDIxMS0+c2tiX2Rydl9hZ2dRW3F1ZXVlX2luZGV4XSksIHNrYik7CisJCQkJCXJldHVybjsKKwkJCQl9CisKKwkJCQl7CisJCQkJCS8qVE9ETyovCisJCQkJCS8qCisJCQkJCXU4KiBwSGVhZGVyID0gc2tiLT5kYXRhOworCisJCQkJCWlmKElzTWdudFFvc0RhdGEocEhlYWRlcikgfHwKKwkJCQkJICAgIElzTWdudFFEYXRhX0FjayhwSGVhZGVyKSB8fAorCQkJCQkgICAgSXNNZ250UURhdGFfUG9sbChwSGVhZGVyKSB8fAorCQkJCQkgICAgSXNNZ250UURhdGFfUG9sbF9BY2socEhlYWRlcikKKwkJCQkJICApCisJCQkJCSovCisJCQkJCXsKKwkJCQkJCXN0cnVjdCBpZWVlODAyMTFfZHJ2X2FnZ190eGIgU2VuZExpc3Q7CisKKwkJCQkJCW1lbXNldCgmU2VuZExpc3QsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Rydl9hZ2dfdHhiKSk7CisJCQkJCQlpZihEcnZBZ2dyX0dldEFnZ3JlZ2F0aWJsZUxpc3QoZGV2LCBza2IsICZTZW5kTGlzdCkgPiAxKSB7CisJCQkJCQkJc2tiID0gRHJ2QWdncl9BZ2dyZWdhdGlvbihkZXYsICZTZW5kTGlzdCk7CisKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlwcml2LT5pZWVlODAyMTEtPnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KHNrYiwgZGV2KTsKKwkJCQl9CisJCQl9CisjZW5kaWYKKwkJfQorCX0KKworfQorCit2b2lkIHJ0bDgxOTJfYmVhY29uX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1OCBtc3IsIG1zcm0sIG1zcjI7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJbXNyICA9IHJlYWRfbmljX2J5dGUoZGV2LCBNU1IpOworCW1zcm0gPSBtc3IgJiBNU1JfTElOS19NQVNLOworCW1zcjIgPSBtc3IgJiB+TVNSX0xJTktfTUFTSzsKKworCWlmKE5JQ184MTkyVSA9PSBwcml2LT5jYXJkXzgxOTIpIHsKKwkJdXNiX2tpbGxfdXJiKHByaXYtPnJ4X3VyYltNQVhfUlhfVVJCXSk7CisJfQorCWlmICgobXNybSA9PSAoTVNSX0xJTktfQURIT0M8PE1TUl9MSU5LX1NISUZUKSB8fAorCQkobXNybSA9PSAoTVNSX0xJTktfTUFTVEVSPDxNU1JfTElOS19TSElGVCkpKSl7CisJCXdyaXRlX25pY19ieXRlKGRldiwgTVNSLCBtc3IyIHwgTVNSX0xJTktfTk9ORSk7CisJCXdyaXRlX25pY19ieXRlKGRldiwgTVNSLCBtc3IpOworCX0KK30KKwordm9pZCBydGw4MTkyX2NvbmZpZ19yYXRlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHUxNiogcmF0ZV9jb25maWcpCit7CisJIHN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXQ7CisJIHU4IGk9MCwgYmFzaWNfcmF0ZSA9IDA7CisJIG5ldCA9ICYgcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcms7CisKKwkgZm9yIChpPTA7IGk8bmV0LT5yYXRlc19sZW47IGkrKykKKwkgeworCQkgYmFzaWNfcmF0ZSA9IG5ldC0+cmF0ZXNbaV0mMHg3ZjsKKwkJIHN3aXRjaChiYXNpY19yYXRlKQorCQkgeworCQkJIGNhc2UgTUdOXzFNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl8xTTsJYnJlYWs7CisJCQkgY2FzZSBNR05fMk06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzJNOwlicmVhazsKKwkJCSBjYXNlIE1HTl81XzVNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl81XzVNOwlicmVhazsKKwkJCSBjYXNlIE1HTl8xMU06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzExTTsJYnJlYWs7CisJCQkgY2FzZSBNR05fNk06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzZNOwlicmVhazsKKwkJCSBjYXNlIE1HTl85TToJKnJhdGVfY29uZmlnIHw9IFJSU1JfOU07CWJyZWFrOworCQkJIGNhc2UgTUdOXzEyTToJKnJhdGVfY29uZmlnIHw9IFJSU1JfMTJNOwlicmVhazsKKwkJCSBjYXNlIE1HTl8xOE06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzE4TTsJYnJlYWs7CisJCQkgY2FzZSBNR05fMjRNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl8yNE07CWJyZWFrOworCQkJIGNhc2UgTUdOXzM2TToJKnJhdGVfY29uZmlnIHw9IFJSU1JfMzZNOwlicmVhazsKKwkJCSBjYXNlIE1HTl80OE06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzQ4TTsJYnJlYWs7CisJCQkgY2FzZSBNR05fNTRNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl81NE07CWJyZWFrOworCQkgfQorCSB9CisJIGZvciAoaT0wOyBpPG5ldC0+cmF0ZXNfZXhfbGVuOyBpKyspCisJIHsKKwkJIGJhc2ljX3JhdGUgPSBuZXQtPnJhdGVzX2V4W2ldJjB4N2Y7CisJCSBzd2l0Y2goYmFzaWNfcmF0ZSkKKwkJIHsKKwkJCSBjYXNlIE1HTl8xTToJKnJhdGVfY29uZmlnIHw9IFJSU1JfMU07CWJyZWFrOworCQkJIGNhc2UgTUdOXzJNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl8yTTsJYnJlYWs7CisJCQkgY2FzZSBNR05fNV81TToJKnJhdGVfY29uZmlnIHw9IFJSU1JfNV81TTsJYnJlYWs7CisJCQkgY2FzZSBNR05fMTFNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl8xMU07CWJyZWFrOworCQkJIGNhc2UgTUdOXzZNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl82TTsJYnJlYWs7CisJCQkgY2FzZSBNR05fOU06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzlNOwlicmVhazsKKwkJCSBjYXNlIE1HTl8xMk06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzEyTTsJYnJlYWs7CisJCQkgY2FzZSBNR05fMThNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl8xOE07CWJyZWFrOworCQkJIGNhc2UgTUdOXzI0TToJKnJhdGVfY29uZmlnIHw9IFJSU1JfMjRNOwlicmVhazsKKwkJCSBjYXNlIE1HTl8zNk06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzM2TTsJYnJlYWs7CisJCQkgY2FzZSBNR05fNDhNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl80OE07CWJyZWFrOworCQkJIGNhc2UgTUdOXzU0TToJKnJhdGVfY29uZmlnIHw9IFJSU1JfNTRNOwlicmVhazsKKwkJIH0KKwkgfQorfQorCisKKyNkZWZpbmUgU0hPUlRfU0xPVF9USU1FIDkKKyNkZWZpbmUgTk9OX1NIT1JUX1NMT1RfVElNRSAyMAorCit2b2lkIHJ0bDgxOTJfdXBkYXRlX2NhcChzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1MTYgY2FwKQoreworCXUzMiB0bXAgPSAwOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldCA9ICZwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yazsKKwlwcml2LT5zaG9ydF9wcmVhbWJsZSA9IGNhcCAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRTsKKwl0bXAgPSBwcml2LT5iYXNpY19yYXRlOworCWlmIChwcml2LT5zaG9ydF9wcmVhbWJsZSkKKwkJdG1wIHw9IEJSU1JfQWNrU2hvcnRQbWI7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgUlJTUiwgdG1wKTsKKworCWlmIChuZXQtPm1vZGUgJiAoSUVFRV9HfElFRUVfTl8yNEcpKQorCXsKKwkJdTggc2xvdF90aW1lID0gMDsKKwkJaWYgKChjYXAgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVCkmJighcHJpdi0+aWVlZTgwMjExLT5wSFRJbmZvLT5iQ3VycmVudFJUMlJUTG9uZ1Nsb3RUaW1lKSkKKwkJey8vc2hvcnQgc2xvdCB0aW1lCisJCQlzbG90X3RpbWUgPSBTSE9SVF9TTE9UX1RJTUU7CisJCX0KKwkJZWxzZSAvL2xvbmcgc2xvdCB0aW1lCisJCQlzbG90X3RpbWUgPSBOT05fU0hPUlRfU0xPVF9USU1FOworCQlwcml2LT5zbG90X3RpbWUgPSBzbG90X3RpbWU7CisJCXdyaXRlX25pY19ieXRlKGRldiwgU0xPVF9USU1FLCBzbG90X3RpbWUpOworCX0KKworfQordm9pZCBydGw4MTkyX25ldF91cGRhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldDsKKwl1MTYgQmNuVGltZUNmZyA9IDAsIEJjbkNXID0gNiwgQmNuSUZTID0gMHhmOworCXUxNiByYXRlX2NvbmZpZyA9IDA7CisJbmV0ID0gJiBwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yazsKKworCXJ0bDgxOTJfY29uZmlnX3JhdGUoZGV2LCAmcmF0ZV9jb25maWcpOworCXByaXYtPmJhc2ljX3JhdGUgPSByYXRlX2NvbmZpZyAmPSAweDE1ZjsKKworCXdyaXRlX25pY19kd29yZChkZXYsQlNTSURSLCgodTMyKiluZXQtPmJzc2lkKVswXSk7CisJd3JpdGVfbmljX3dvcmQoZGV2LEJTU0lEUis0LCgodTE2KiluZXQtPmJzc2lkKVsyXSk7CisJLy9mb3IoaT0wO2k8RVRIX0FMRU47aSsrKQorCS8vCXdyaXRlX25pY19ieXRlKGRldixCU1NJRCtpLG5ldC0+YnNzaWRbaV0pOworCisJcnRsODE5Ml91cGRhdGVfbXNyKGRldik7CisvLwlydGw4MTkyX3VwZGF0ZV9jYXAoZGV2LCBuZXQtPmNhcGFiaWxpdHkpOworCWlmIChwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykKKwl7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBBVElNV05ELCAyKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIEJDTl9ETUFUSU1FLCAxMDIzKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIEJDTl9JTlRFUlZBTCwgbmV0LT5iZWFjb25faW50ZXJ2YWwpOworLy8Jd3JpdGVfbmljX3dvcmQoZGV2LCBCY25JbnRUaW1lLCAxMDApOworCXdyaXRlX25pY193b3JkKGRldiwgQkNOX0RSVl9FQVJMWV9JTlQsIDEpOworCXdyaXRlX25pY19ieXRlKGRldiwgQkNOX0VSUl9USFJFU0gsIDEwMCk7CisJCUJjblRpbWVDZmcgfD0gKEJjbkNXPDxCQ05fVENGR19DV19TSElGVCk7CisJLy8gVE9ETzogQmNuSUZTIG1heSByZXF1aXJlZCB0byBiZSBjaGFuZ2VkIG9uIEFTSUMKKwkJQmNuVGltZUNmZyB8PSBCY25JRlM8PEJDTl9UQ0ZHX0lGUzsKKworCXdyaXRlX25pY193b3JkKGRldiwgQkNOX1RDRkcsIEJjblRpbWVDZmcpOworCX0KKworCisKK30KKworLy90ZW1wb3JhcnkgaHcgYmVhY29uIGlzIG5vdCB1c2VkIGFueSBtb3JlLgorLy9vcGVuIGl0IHdoZW4gbmVjZXNzYXJ5Cit2b2lkIHJ0bDgxOXh1c2JfYmVhY29uX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdTE2ICB0eF9yYXRlKQoreworCit9CitpbmxpbmUgdTggcnRsODE5Ml9Jc1dpcmVsZXNzQk1vZGUodTE2IHJhdGUpCit7CisJaWYoICgocmF0ZSA8PSAxMTApICYmIChyYXRlICE9IDYwKSAmJiAocmF0ZSAhPSA5MCkpIHx8IChyYXRlID09IDIyMCkgKQorCQlyZXR1cm4gMTsKKwllbHNlIHJldHVybiAwOworfQorCit1MTYgTl9EQlBTT2ZSYXRlKHUxNiBEYXRhUmF0ZSk7CisKK3UxNiBDb21wdXRlVHhUaW1lKAorCXUxNgkJRnJhbWVMZW5ndGgsCisJdTE2CQlEYXRhUmF0ZSwKKwl1OAkJYk1hbmFnZW1lbnRGcmFtZSwKKwl1OAkJYlNob3J0UHJlYW1ibGUKKykKK3sKKwl1MTYJRnJhbWVUaW1lOworCXUxNglOX0RCUFM7CisJdTE2CUNlaWxpbmc7CisKKwlpZiggcnRsODE5Ml9Jc1dpcmVsZXNzQk1vZGUoRGF0YVJhdGUpICkKKwl7CisJCWlmKCBiTWFuYWdlbWVudEZyYW1lIHx8ICFiU2hvcnRQcmVhbWJsZSB8fCBEYXRhUmF0ZSA9PSAxMCApCisJCXsJLy8gbG9uZyBwcmVhbWJsZQorCQkJRnJhbWVUaW1lID0gKHUxNikoMTQ0KzQ4KyhGcmFtZUxlbmd0aCo4LyhEYXRhUmF0ZS8xMCkpKTsKKwkJfQorCQllbHNlCisJCXsJLy8gU2hvcnQgcHJlYW1ibGUKKwkJCUZyYW1lVGltZSA9ICh1MTYpKDcyKzI0KyhGcmFtZUxlbmd0aCo4LyhEYXRhUmF0ZS8xMCkpKTsKKwkJfQorCQlpZiggKCBGcmFtZUxlbmd0aCo4ICUgKERhdGFSYXRlLzEwKSApICE9IDAgKSAvL0dldCB0aGUgQ2VpbGxpbmcKKwkJCQlGcmFtZVRpbWUgKys7CisJfSBlbHNlIHsJLy84MDIuMTFnIERTU1MtT0ZETSBQTENQIGxlbmd0aCBmaWVsZCBjYWxjdWxhdGlvbi4KKwkJTl9EQlBTID0gTl9EQlBTT2ZSYXRlKERhdGFSYXRlKTsKKwkJQ2VpbGluZyA9ICgxNiArIDgqRnJhbWVMZW5ndGggKyA2KSAvIE5fREJQUworCQkJCSsgKCgoMTYgKyA4KkZyYW1lTGVuZ3RoICsgNikgJSBOX0RCUFMpID8gMSA6IDApOworCQlGcmFtZVRpbWUgPSAodTE2KSgxNiArIDQgKyA0KkNlaWxpbmcgKyA2KTsKKwl9CisJcmV0dXJuIEZyYW1lVGltZTsKK30KKwordTE2IE5fREJQU09mUmF0ZSh1MTYgRGF0YVJhdGUpCit7CisJIHUxNiBOX0RCUFMgPSAyNDsKKworCSBzd2l0Y2goRGF0YVJhdGUpCisJIHsKKwkgY2FzZSA2MDoKKwkgIE5fREJQUyA9IDI0OworCSAgYnJlYWs7CisKKwkgY2FzZSA5MDoKKwkgIE5fREJQUyA9IDM2OworCSAgYnJlYWs7CisKKwkgY2FzZSAxMjA6CisJICBOX0RCUFMgPSA0ODsKKwkgIGJyZWFrOworCisJIGNhc2UgMTgwOgorCSAgTl9EQlBTID0gNzI7CisJICBicmVhazsKKworCSBjYXNlIDI0MDoKKwkgIE5fREJQUyA9IDk2OworCSAgYnJlYWs7CisKKwkgY2FzZSAzNjA6CisJICBOX0RCUFMgPSAxNDQ7CisJICBicmVhazsKKworCSBjYXNlIDQ4MDoKKwkgIE5fREJQUyA9IDE5MjsKKwkgIGJyZWFrOworCisJIGNhc2UgNTQwOgorCSAgTl9EQlBTID0gMjE2OworCSAgYnJlYWs7CisKKwkgZGVmYXVsdDoKKwkgIGJyZWFrOworCSB9CisKKwkgcmV0dXJuIE5fREJQUzsKK30KKwordm9pZCBydGw4MTl4VV9jbWRfaXNyKHN0cnVjdCB1cmIgKnR4X2NtZF91cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVzYl9mcmVlX3VyYih0eF9jbWRfdXJiKTsKK30KKwordW5zaWduZWQgaW50IHR4cXVldWUyb3V0cGlwZShzdHJ1Y3QgcjgxOTJfcHJpdiogcHJpdix1bnNpZ25lZCBpbnQgdHhfcXVldWUpIHsKKworCWlmKHR4X3F1ZXVlID49IDkpCisJeworCQlSVF9UUkFDRShDT01QX0VSUiwiJXMoKTpVbmtub3duIHF1ZXVlIElEISEhXG4iLF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAweDA0OworCX0KKwlyZXR1cm4gcHJpdi0+dHhxdWV1ZV90b19vdXRwaXBlbWFwW3R4X3F1ZXVlXTsKK30KKworc2hvcnQgcnRsODE5eFVfdHhfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8vdTgJCQkqdHg7CisJaW50CQkJc3RhdHVzOworCXN0cnVjdCB1cmIJCSp0eF91cmI7CisJLy9pbnQJCQl1cmJfYnVmX2xlbjsKKwl1bnNpZ25lZCBpbnQgCQlpZHhfcGlwZTsKKwl0eF9kZXNjX2NtZF84MTl4X3VzYiAqcGRlc2MgPSAodHhfZGVzY19jbWRfODE5eF91c2IgKilza2ItPmRhdGE7CisJY2JfZGVzYyAqdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKShza2ItPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOworCXU4IHF1ZXVlX2luZGV4ID0gdGNiX2Rlc2MtPnF1ZXVlX2luZGV4OworCisJLy9wcmludGsoIlxuICVzOjpxdWV1ZV9pbmRleCA9ICVkXG4iLF9fRlVOQ1RJT05fXywgcXVldWVfaW5kZXgpOworCWF0b21pY19pbmMoJnByaXYtPnR4X3BlbmRpbmdbcXVldWVfaW5kZXhdKTsKKwl0eF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsR0ZQX0FUT01JQyk7CisJaWYoIXR4X3VyYil7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KHBkZXNjLCAwLCBVU0JfSFdERVNDX0hFQURFUl9MRU4pOworCS8qIFR4IGRlc2NyaXB0b3Igb3VnaHQgdG8gYmUgc2V0IGFjY29yZGluZyB0byB0aGUgc2tiLT5jYiAqLworCXBkZXNjLT5GaXJzdFNlZyA9IDE7Ly9iRmlyc3RTZWc7CisJcGRlc2MtPkxhc3RTZWcgPSAxOy8vYkxhc3RTZWc7CisJcGRlc2MtPkNtZEluaXQgPSB0Y2JfZGVzYy0+YkNtZE9ySW5pdDsKKwlwZGVzYy0+VHhCdWZmZXJTaXplID0gdGNiX2Rlc2MtPnR4YnVmX3NpemU7CisJcGRlc2MtPk9XTiA9IDE7CisJcGRlc2MtPkxJTklQID0gdGNiX2Rlc2MtPmJMYXN0SW5pUGt0OworCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gRmlsbCB1cCBVU0JfT1VUX0NPTlRFWFQuCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gR2V0IGluZGV4IHRvIG91dCBwaXBlIGZyb20gc3BlY2lmaWVkIFF1ZXVlSUQuCisjaWZuZGVmIFVTRV9PTkVfUElQRQorCWlkeF9waXBlID0gdHhxdWV1ZTJvdXRwaXBlKHByaXYscXVldWVfaW5kZXgpOworI2Vsc2UKKwlpZHhfcGlwZSA9IDB4MDQ7CisjZW5kaWYKKyNpZmRlZiBKT0hOX0RVTVBfVFhERVNDCisJaW50IGk7CisJcHJpbnRrKCI8VHggZGVzY3JpcHRvcj4tLXJhdGUgJXgtLS0iLHJhdGUpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXByaW50aygiJTh4ICIsIHR4W2ldKTsKKwlwcmludGsoIlxuIik7CisjZW5kaWYKKwl1c2JfZmlsbF9idWxrX3VyYih0eF91cmIscHJpdi0+dWRldiwgdXNiX3NuZGJ1bGtwaXBlKHByaXYtPnVkZXYsaWR4X3BpcGUpLCBcCisJCQlza2ItPmRhdGEsIHNrYi0+bGVuLCBydGw4MTkyX3R4X2lzciwgc2tiKTsKKworCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHR4X3VyYiwgR0ZQX0FUT01JQyk7CisKKwlpZiAoIXN0YXR1cyl7CisJCXJldHVybiAwOworCX1lbHNleworCQlETUVTR0UoIkVycm9yIFRYIENNRCBVUkIsIGVycm9yICVkIiwKKwkJCQlzdGF0dXMpOworCQlyZXR1cm4gLTE7CisJfQorfQorCisvKgorICogTWFwcGluZyBTb2Z0d2FyZS9IYXJkd2FyZSBkZXNjcmlwdG9yIHF1ZXVlIGlkIHRvICJRdWV1ZSBTZWxlY3QgRmllbGQiCisgKiBpbiBUeEZ3SW5mbyBkYXRhIHN0cnVjdHVyZQorICogMjAwNi4xMC4zMCBieSBFbWlseQorICoKKyAqIFxwYXJhbSBRVUVVRUlEICAgICAgIFNvZnR3YXJlIFF1ZXVlCisqLwordTggTWFwSHdRdWV1ZVRvRmlybXdhcmVRdWV1ZSh1OCBRdWV1ZUlEKQoreworCXU4IFF1ZXVlU2VsZWN0ID0gMHgwOyAgICAgICAvL2RlZnVhbHQgc2V0IHRvCisKKwlzd2l0Y2goUXVldWVJRCkgeworCQljYXNlIEJFX1FVRVVFOgorCQkJUXVldWVTZWxlY3QgPSBRU0xUX0JFOyAgLy9vciBRU2VsZWN0ID0gcFRjYi0+cHJpb3JpdHk7CisJCQlicmVhazsKKworCQljYXNlIEJLX1FVRVVFOgorCQkJUXVldWVTZWxlY3QgPSBRU0xUX0JLOyAgLy9vciBRU2VsZWN0ID0gcFRjYi0+cHJpb3JpdHk7CisJCQlicmVhazsKKworCQljYXNlIFZPX1FVRVVFOgorCQkJUXVldWVTZWxlY3QgPSBRU0xUX1ZPOyAgLy9vciBRU2VsZWN0ID0gcFRjYi0+cHJpb3JpdHk7CisJCQlicmVhazsKKworCQljYXNlIFZJX1FVRVVFOgorCQkJUXVldWVTZWxlY3QgPSBRU0xUX1ZJOyAgLy9vciBRU2VsZWN0ID0gcFRjYi0+cHJpb3JpdHk7CisJCQlicmVhazsKKwkJY2FzZSBNR05UX1FVRVVFOgorCQkJUXVldWVTZWxlY3QgPSBRU0xUX01HTlQ7CisJCQlicmVhazsKKworCQljYXNlIEJFQUNPTl9RVUVVRToKKwkJCVF1ZXVlU2VsZWN0ID0gUVNMVF9CRUFDT047CisJCQlicmVhazsKKworCQkJLy8gVE9ETzogMjAwNi4xMC4zMCBtYXJrIG90aGVyIHF1ZXVlIHNlbGVjdGlvbiB1bnRpbCB3ZSB2ZXJpZnkgaXQgaXMgT0sKKwkJCS8vIFRPRE86IFJlbW92ZSBBc3NlcnRpb25zCisvLyNpZiAoUlRMODE5WF9GUEdBX1ZFUiAmIFJUTDgxOVhfRlBHQV9HVUFOR0FOXzA3MDUwMikKKwkJY2FzZSBUWENNRF9RVUVVRToKKwkJCVF1ZXVlU2VsZWN0ID0gUVNMVF9DTUQ7CisJCQlicmVhazsKKy8vI2VuZGlmCisJCWNhc2UgSElHSF9RVUVVRToKKwkJCVF1ZXVlU2VsZWN0ID0gUVNMVF9ISUdIOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCAiVHJhbnNtaXRUQ0IoKTogSW1wb3NzaWJsZSBRdWV1ZSBTZWxlY3Rpb246ICVkIFxuIiwgUXVldWVJRCk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIFF1ZXVlU2VsZWN0OworfQorCit1OCBNUmF0ZVRvSHdSYXRlODE5MFBjaSh1OCByYXRlKQoreworCXU4ICByZXQgPSBERVNDOTBfUkFURTFNOworCisJc3dpdGNoKHJhdGUpIHsKKwkJY2FzZSBNR05fMU06ICAgIHJldCA9IERFU0M5MF9SQVRFMU07ICAgIGJyZWFrOworCQljYXNlIE1HTl8yTTogICAgcmV0ID0gREVTQzkwX1JBVEUyTTsgICAgYnJlYWs7CisJCWNhc2UgTUdOXzVfNU06ICByZXQgPSBERVNDOTBfUkFURTVfNU07ICBicmVhazsKKwkJY2FzZSBNR05fMTFNOiAgIHJldCA9IERFU0M5MF9SQVRFMTFNOyAgIGJyZWFrOworCQljYXNlIE1HTl82TTogICAgcmV0ID0gREVTQzkwX1JBVEU2TTsgICAgYnJlYWs7CisJCWNhc2UgTUdOXzlNOiAgICByZXQgPSBERVNDOTBfUkFURTlNOyAgICBicmVhazsKKwkJY2FzZSBNR05fMTJNOiAgIHJldCA9IERFU0M5MF9SQVRFMTJNOyAgIGJyZWFrOworCQljYXNlIE1HTl8xOE06ICAgcmV0ID0gREVTQzkwX1JBVEUxOE07ICAgYnJlYWs7CisJCWNhc2UgTUdOXzI0TTogICByZXQgPSBERVNDOTBfUkFURTI0TTsgICBicmVhazsKKwkJY2FzZSBNR05fMzZNOiAgIHJldCA9IERFU0M5MF9SQVRFMzZNOyAgIGJyZWFrOworCQljYXNlIE1HTl80OE06ICAgcmV0ID0gREVTQzkwX1JBVEU0OE07ICAgYnJlYWs7CisJCWNhc2UgTUdOXzU0TTogICByZXQgPSBERVNDOTBfUkFURTU0TTsgICBicmVhazsKKworCQkvLyBIVCByYXRlIHNpbmNlIGhlcmUKKwkJY2FzZSBNR05fTUNTMDogIHJldCA9IERFU0M5MF9SQVRFTUNTMDsgIGJyZWFrOworCQljYXNlIE1HTl9NQ1MxOiAgcmV0ID0gREVTQzkwX1JBVEVNQ1MxOyAgYnJlYWs7CisJCWNhc2UgTUdOX01DUzI6ICByZXQgPSBERVNDOTBfUkFURU1DUzI7ICBicmVhazsKKwkJY2FzZSBNR05fTUNTMzogIHJldCA9IERFU0M5MF9SQVRFTUNTMzsgIGJyZWFrOworCQljYXNlIE1HTl9NQ1M0OiAgcmV0ID0gREVTQzkwX1JBVEVNQ1M0OyAgYnJlYWs7CisJCWNhc2UgTUdOX01DUzU6ICByZXQgPSBERVNDOTBfUkFURU1DUzU7ICBicmVhazsKKwkJY2FzZSBNR05fTUNTNjogIHJldCA9IERFU0M5MF9SQVRFTUNTNjsgIGJyZWFrOworCQljYXNlIE1HTl9NQ1M3OiAgcmV0ID0gREVTQzkwX1JBVEVNQ1M3OyAgYnJlYWs7CisJCWNhc2UgTUdOX01DUzg6ICByZXQgPSBERVNDOTBfUkFURU1DUzg7ICBicmVhazsKKwkJY2FzZSBNR05fTUNTOTogIHJldCA9IERFU0M5MF9SQVRFTUNTOTsgIGJyZWFrOworCQljYXNlIE1HTl9NQ1MxMDogcmV0ID0gREVTQzkwX1JBVEVNQ1MxMDsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzExOiByZXQgPSBERVNDOTBfUkFURU1DUzExOyBicmVhazsKKwkJY2FzZSBNR05fTUNTMTI6IHJldCA9IERFU0M5MF9SQVRFTUNTMTI7IGJyZWFrOworCQljYXNlIE1HTl9NQ1MxMzogcmV0ID0gREVTQzkwX1JBVEVNQ1MxMzsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzE0OiByZXQgPSBERVNDOTBfUkFURU1DUzE0OyBicmVhazsKKwkJY2FzZSBNR05fTUNTMTU6IHJldCA9IERFU0M5MF9SQVRFTUNTMTU7IGJyZWFrOworCQljYXNlICgweDgwfDB4MjApOiByZXQgPSBERVNDOTBfUkFURU1DUzMyOyBicmVhazsKKworCQlkZWZhdWx0OiAgICAgICBicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworCit1OCBRdWVyeUlzU2hvcnQodTggVHhIVCwgdTggVHhSYXRlLCBjYl9kZXNjICp0Y2JfZGVzYykKK3sKKwl1OCAgIHRtcF9TaG9ydDsKKworCXRtcF9TaG9ydCA9IChUeEhUPT0xKT8oKHRjYl9kZXNjLT5iVXNlU2hvcnRHSSk/MTowKTooKHRjYl9kZXNjLT5iVXNlU2hvcnRQcmVhbWJsZSk/MTowKTsKKworCWlmKFR4SFQ9PTEgJiYgVHhSYXRlICE9IERFU0M5MF9SQVRFTUNTMTUpCisJCXRtcF9TaG9ydCA9IDA7CisKKwlyZXR1cm4gdG1wX1Nob3J0OworfQorCitzdGF0aWMgdm9pZCB0eF96ZXJvX2lzcihzdHJ1Y3QgdXJiICp0eF91cmIpCit7CisJcmV0dXJuOworfQorCisvKgorICogVGhlIHR4IHByb2NlZHVyZSBpcyBqdXN0IGFzIGZvbGxvd2luZywKKyAqIHNrYi0+Y2Igd2lsbCBjb250YWluIGFsbCB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uLAorICogcHJpb3JpdHksIG1vcmVmcmFnLCByYXRlLCAmZGV2LgorICogKi8KK3Nob3J0IHJ0bDgxOTJfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYqIHNrYikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJY2JfZGVzYyAqdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKShza2ItPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOworCXR4X2Rlc2NfODE5eF91c2IgKnR4X2Rlc2MgPSAodHhfZGVzY184MTl4X3VzYiAqKXNrYi0+ZGF0YTsKKwl0eF9md2luZm9fODE5eF91c2IgKnR4X2Z3aW5mbyA9ICh0eF9md2luZm9fODE5eF91c2IgKikoc2tiLT5kYXRhICsgVVNCX0hXREVTQ19IRUFERVJfTEVOKTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHByaXYtPnVkZXY7CisJaW50IHBlbmQ7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgdXJiICp0eF91cmIgPSBOVUxMLCAqdHhfdXJiX3plcm8gPSBOVUxMOworCS8vaW50IHVyYl9sZW47CisJdW5zaWduZWQgaW50IGlkeF9waXBlOworLy8JUlRfREVCVUdfREFUQShDT01QX1NFTkQsIHRjYl9kZXNjLCBzaXplb2YoY2JfZGVzYykpOworLy8JcHJpbnRrKCI9PT09PT09PT09PT09PiAlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlwZW5kID0gYXRvbWljX3JlYWQoJnByaXYtPnR4X3BlbmRpbmdbdGNiX2Rlc2MtPnF1ZXVlX2luZGV4XSk7CisJLyogd2UgYXJlIGxvY2tlZCBoZXJlIHNvIHRoZSB0d28gYXRvbWljX3JlYWQgYW5kIGluYyBhcmUgZXhlY3V0ZWQKKwkgKiB3aXRob3V0IGludGVybGVhdmVzCisJICogISEhIEZvciBkZWJ1ZyBwdXJwb3NlCisJICovCisJaWYoIHBlbmQgPiBNQVhfVFhfVVJCKXsKKwkJcHJpbnRrKCJUbyBkaXNjYXJkIHNrYiBwYWNrZXQhXG4iKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXR4X3VyYiA9IHVzYl9hbGxvY191cmIoMCxHRlBfQVRPTUlDKTsKKwlpZighdHhfdXJiKXsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogRmlsbCBUeCBmaXJtd2FyZSBpbmZvICovCisJbWVtc2V0KHR4X2Z3aW5mbywwLHNpemVvZih0eF9md2luZm9fODE5eF91c2IpKTsKKwkvKiBEV09SRCAwICovCisJdHhfZndpbmZvLT5UeEhUID0gKHRjYl9kZXNjLT5kYXRhX3JhdGUmMHg4MCk/MTowOworCXR4X2Z3aW5mby0+VHhSYXRlID0gTVJhdGVUb0h3UmF0ZTgxOTBQY2kodGNiX2Rlc2MtPmRhdGFfcmF0ZSk7CisJdHhfZndpbmZvLT5FbmFibGVDUFVEdXIgPSB0Y2JfZGVzYy0+YlR4RW5hYmxlRndDYWxjRHVyOworCXR4X2Z3aW5mby0+U2hvcnQgPSBRdWVyeUlzU2hvcnQodHhfZndpbmZvLT5UeEhULCB0eF9md2luZm8tPlR4UmF0ZSwgdGNiX2Rlc2MpOworCWlmKHRjYl9kZXNjLT5iQU1QRFVFbmFibGUpIHsvL0FNUERVIGVuYWJsZWQKKwkJdHhfZndpbmZvLT5BbGxvd0FnZ3JlZ2F0aW9uID0gMTsKKwkJLyogRFdPUkQgMSAqLworCQl0eF9md2luZm8tPlJ4TUYgPSB0Y2JfZGVzYy0+YW1wZHVfZmFjdG9yOworCQl0eF9md2luZm8tPlJ4QU1EID0gdGNiX2Rlc2MtPmFtcGR1X2RlbnNpdHkmMHgwNzsvL2FtcGR1ZGVuc2l0eQorCX0gZWxzZSB7CisJCXR4X2Z3aW5mby0+QWxsb3dBZ2dyZWdhdGlvbiA9IDA7CisJCS8qIERXT1JEIDEgKi8KKwkJdHhfZndpbmZvLT5SeE1GID0gMDsKKwkJdHhfZndpbmZvLT5SeEFNRCA9IDA7CisJfQorCisJLyogUHJvdGVjdGlvbiBtb2RlIHJlbGF0ZWQgKi8KKwl0eF9md2luZm8tPlJ0c0VuYWJsZSA9ICh0Y2JfZGVzYy0+YlJUU0VuYWJsZSk/MTowOworCXR4X2Z3aW5mby0+Q3RzRW5hYmxlID0gKHRjYl9kZXNjLT5iQ1RTRW5hYmxlKT8xOjA7CisJdHhfZndpbmZvLT5SdHNTVEJDID0gKHRjYl9kZXNjLT5iUlRTU1RCQyk/MTowOworCXR4X2Z3aW5mby0+UnRzSFQgPSAodGNiX2Rlc2MtPnJ0c19yYXRlJjB4ODApPzE6MDsKKwl0eF9md2luZm8tPlJ0c1JhdGUgPSAgTVJhdGVUb0h3UmF0ZTgxOTBQY2koKHU4KXRjYl9kZXNjLT5ydHNfcmF0ZSk7CisJdHhfZndpbmZvLT5SdHNTdWJjYXJyaWVyID0gKHR4X2Z3aW5mby0+UnRzSFQ9PTApPyh0Y2JfZGVzYy0+UlRTU0MpOjA7CisJdHhfZndpbmZvLT5SdHNCYW5kd2lkdGggPSAodHhfZndpbmZvLT5SdHNIVD09MSk/KCh0Y2JfZGVzYy0+YlJUU0JXKT8xOjApOjA7CisJdHhfZndpbmZvLT5SdHNTaG9ydCA9ICh0eF9md2luZm8tPlJ0c0hUPT0wKT8odGNiX2Rlc2MtPmJSVFNVc2VTaG9ydFByZWFtYmxlPzE6MCk6XAorCQkJCSh0Y2JfZGVzYy0+YlJUU1VzZVNob3J0R0k/MTowKTsKKworCS8qIFNldCBCYW5kd2lkdGggYW5kIHN1Yi1jaGFubmVsIHNldHRpbmdzLiAqLworCWlmKHByaXYtPkN1cnJlbnRDaGFubmVsQlcgPT0gSFRfQ0hBTk5FTF9XSURUSF8yMF80MCkKKwl7CisJCWlmKHRjYl9kZXNjLT5iUGFja2V0QlcpIHsKKwkJCXR4X2Z3aW5mby0+VHhCYW5kd2lkdGggPSAxOworCQkJdHhfZndpbmZvLT5UeFN1YkNhcnJpZXIgPSAwOyAgICAvL0J5IFNEMydzIEplcnJ5IHN1Z2dlc3Rpb24sIHVzZSBkdXBsaWNhdGVkIG1vZGUKKwkJfSBlbHNlIHsKKwkJCXR4X2Z3aW5mby0+VHhCYW5kd2lkdGggPSAwOworCQkJdHhfZndpbmZvLT5UeFN1YkNhcnJpZXIgPSBwcml2LT5uQ3VyNDBNaHpQcmltZVNDOworCQl9CisJfSBlbHNlIHsKKwkJdHhfZndpbmZvLT5UeEJhbmR3aWR0aCA9IDA7CisJCXR4X2Z3aW5mby0+VHhTdWJDYXJyaWVyID0gMDsKKwl9CisKKyNpZmRlZiBVU0JfVFhfRFJJVkVSX0FHR1JFR0FUSU9OX0VOQUJMRQorCWlmICh0Y2JfZGVzYy0+ZHJ2X2FnZ19lbmFibGUpCisJeworCQl0eF9md2luZm8tPlR4X0lORk9fUlNWRCA9ICh0Y2JfZGVzYy0+RHJ2QWdnck51bSAmIDB4MWYpIDw8IDE7CisJfQorI2VuZGlmCisJLyogRmlsbCBUeCBkZXNjcmlwdG9yICovCisJbWVtc2V0KHR4X2Rlc2MsIDAsIHNpemVvZih0eF9kZXNjXzgxOXhfdXNiKSk7CisJLyogRFdPUkQgMCAqLworCXR4X2Rlc2MtPkxJTklQID0gMDsKKwl0eF9kZXNjLT5DbWRJbml0ID0gMTsKKwl0eF9kZXNjLT5PZmZzZXQgPSAgc2l6ZW9mKHR4X2Z3aW5mb184MTl4X3VzYikgKyA4OworCisjaWZkZWYgVVNCX1RYX0RSSVZFUl9BR0dSRUdBVElPTl9FTkFCTEUKKwlpZiAodGNiX2Rlc2MtPmRydl9hZ2dfZW5hYmxlKSB7CisJCXR4X2Rlc2MtPlBrdFNpemUgPSB0Y2JfZGVzYy0+cGt0X3NpemU7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCXR4X2Rlc2MtPlBrdFNpemUgPSAoc2tiLT5sZW4gLSBUWF9QQUNLRVRfU0hJRlRfQllURVMpICYgMHhmZmZmOworCX0KKworCS8qRFdPUkQgMSovCisJdHhfZGVzYy0+U2VjQ0FNSUQ9IDA7CisJdHhfZGVzYy0+UkFUaWQgPSB0Y2JfZGVzYy0+UkFUUkluZGV4OworCXsKKwkJLy9NUERVT3ZlcmhlYWQgPSAwOworCQl0eF9kZXNjLT5Ob0VuYyA9IDE7CisJfQorCXR4X2Rlc2MtPlNlY1R5cGUgPSAweDA7CisJCWlmICh0Y2JfZGVzYy0+Ykh3U2VjKQorCQkJeworCQkJCXN3aXRjaCAocHJpdi0+aWVlZTgwMjExLT5wYWlyd2lzZV9rZXlfdHlwZSkKKwkJCQl7CisJCQkJCWNhc2UgS0VZX1RZUEVfV0VQNDA6CisJCQkJCWNhc2UgS0VZX1RZUEVfV0VQMTA0OgorCQkJCQkJIHR4X2Rlc2MtPlNlY1R5cGUgPSAweDE7CisJCQkJCQkgdHhfZGVzYy0+Tm9FbmMgPSAwOworCQkJCQkJIGJyZWFrOworCQkJCQljYXNlIEtFWV9UWVBFX1RLSVA6CisJCQkJCQkgdHhfZGVzYy0+U2VjVHlwZSA9IDB4MjsKKwkJCQkJCSB0eF9kZXNjLT5Ob0VuYyA9IDA7CisJCQkJCQkgYnJlYWs7CisJCQkJCWNhc2UgS0VZX1RZUEVfQ0NNUDoKKwkJCQkJCSB0eF9kZXNjLT5TZWNUeXBlID0gMHgzOworCQkJCQkJIHR4X2Rlc2MtPk5vRW5jID0gMDsKKwkJCQkJCSBicmVhazsKKwkJCQkJY2FzZSBLRVlfVFlQRV9OQToKKwkJCQkJCSB0eF9kZXNjLT5TZWNUeXBlID0gMHgwOworCQkJCQkJIHR4X2Rlc2MtPk5vRW5jID0gMTsKKwkJCQkJCSBicmVhazsKKwkJCQl9CisJCQl9CisKKwl0eF9kZXNjLT5RdWV1ZVNlbGVjdCA9IE1hcEh3UXVldWVUb0Zpcm13YXJlUXVldWUodGNiX2Rlc2MtPnF1ZXVlX2luZGV4KTsKKwl0eF9kZXNjLT5UeEZXSW5mb1NpemUgPSAgc2l6ZW9mKHR4X2Z3aW5mb184MTl4X3VzYik7CisKKwl0eF9kZXNjLT5ESVNGQiA9IHRjYl9kZXNjLT5iVHhEaXNhYmxlUmF0ZUZhbGxCYWNrOworCXR4X2Rlc2MtPlVTRVJBVEUgPSB0Y2JfZGVzYy0+YlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlOworCisJLyogRmlsbCBmaWVsZHMgdGhhdCBhcmUgcmVxdWlyZWQgdG8gYmUgaW5pdGlhbGl6ZWQgaW4gYWxsIG9mIHRoZSBkZXNjcmlwdG9ycyAqLworCS8vRFdPUkQgMAorCXR4X2Rlc2MtPkZpcnN0U2VnID0gMTsKKwl0eF9kZXNjLT5MYXN0U2VnID0gMTsKKwl0eF9kZXNjLT5PV04gPSAxOworCisjaWZkZWYgVVNCX1RYX0RSSVZFUl9BR0dSRUdBVElPTl9FTkFCTEUKKwlpZiAodGNiX2Rlc2MtPmRydl9hZ2dfZW5hYmxlKSB7CisJCXR4X2Rlc2MtPlR4QnVmZmVyU2l6ZSA9IHRjYl9kZXNjLT5wa3Rfc2l6ZSArIHNpemVvZih0eF9md2luZm9fODE5eF91c2IpOworCX0gZWxzZQorI2VuZGlmCisJeworCQkvL0RXT1JEIDIKKwkJdHhfZGVzYy0+VHhCdWZmZXJTaXplID0gKHUzMikoc2tiLT5sZW4gLSBVU0JfSFdERVNDX0hFQURFUl9MRU4pOworCX0KKwkvKiBHZXQgaW5kZXggdG8gb3V0IHBpcGUgZnJvbSBzcGVjaWZpZWQgUXVldWVJRCAqLworI2lmbmRlZiBVU0VfT05FX1BJUEUKKwlpZHhfcGlwZSA9IHR4cXVldWUyb3V0cGlwZShwcml2LHRjYl9kZXNjLT5xdWV1ZV9pbmRleCk7CisjZWxzZQorCWlkeF9waXBlID0gMHg1OworI2VuZGlmCisKKwkvL1JUX0RFQlVHX0RBVEEoQ09NUF9TRU5ELHR4X2Z3aW5mbyxzaXplb2YodHhfZndpbmZvXzgxOXhfdXNiKSk7CisJLy9SVF9ERUJVR19EQVRBKENPTVBfU0VORCx0eF9kZXNjLHNpemVvZih0eF9kZXNjXzgxOXhfdXNiKSk7CisKKwkvKiBUbyBzdWJtaXQgYnVsayB1cmIgKi8KKwl1c2JfZmlsbF9idWxrX3VyYih0eF91cmIsdWRldiwKKwkJCXVzYl9zbmRidWxrcGlwZSh1ZGV2LGlkeF9waXBlKSwgc2tiLT5kYXRhLAorCQkJc2tiLT5sZW4sIHJ0bDgxOTJfdHhfaXNyLCBza2IpOworCisJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodHhfdXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXN0YXR1cyl7CisvL3dlIG5lZWQgdG8gc2VuZCAwIGJ5dGUgcGFja2V0IHdoZW5ldmVyIDUxMk4gYnl0ZXMvNjROKEhJR04gU1BFRUQvTk9STUFMIFNQRUVEKSBieXRlcyBwYWNrZXQgaGFzIGJlZW4gdHJhbnNtaXR0ZWQuIE90aGVyd2lzZSwgaXQgd2lsbCBiZSBoYWx0IHRvIHdhaXQgZm9yIGFub3RoZXIgcGFja2V0LiBXQi4gMjAwOC4wOC4yNworCQlib29sIGJTZW5kMEJ5dGUgPSBmYWxzZTsKKwkJdTggemVybyA9IDA7CisJCWlmKHVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQorCQl7CisJCQlpZiAoc2tiLT5sZW4gPiAwICYmIHNrYi0+bGVuICUgNTEyID09IDApCisJCQkJYlNlbmQwQnl0ZSA9IHRydWU7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoc2tiLT5sZW4gPiAwICYmIHNrYi0+bGVuICUgNjQgPT0gMCkKKwkJCQliU2VuZDBCeXRlID0gdHJ1ZTsKKwkJfQorCQlpZiAoYlNlbmQwQnl0ZSkKKwkJeworCQkJdHhfdXJiX3plcm8gPSB1c2JfYWxsb2NfdXJiKDAsR0ZQX0FUT01JQyk7CisJCQlpZighdHhfdXJiX3plcm8peworCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiY2FuJ3QgYWxsb2MgdXJiIGZvciB6ZXJvIGJ5dGVcbiIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJdXNiX2ZpbGxfYnVsa191cmIodHhfdXJiX3plcm8sdWRldiwKKwkJCQkJdXNiX3NuZGJ1bGtwaXBlKHVkZXYsaWR4X3BpcGUpLCAmemVybywKKwkJCQkJMCwgdHhfemVyb19pc3IsIGRldik7CisJCQlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih0eF91cmJfemVybywgR0ZQX0FUT01JQyk7CisJCQlpZiAoc3RhdHVzKXsKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCAiRXJyb3IgVFggVVJCIGZvciB6ZXJvIGJ5dGUgJWQsIGVycm9yICVkIiwgYXRvbWljX3JlYWQoJnByaXYtPnR4X3BlbmRpbmdbdGNiX2Rlc2MtPnF1ZXVlX2luZGV4XSksIHN0YXR1cyk7CisJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCWF0b21pY19pbmMoJnByaXYtPnR4X3BlbmRpbmdbdGNiX2Rlc2MtPnF1ZXVlX2luZGV4XSk7CisJCXJldHVybiAwOworCX1lbHNleworCQlSVF9UUkFDRShDT01QX0VSUiwgIkVycm9yIFRYIFVSQiAlZCwgZXJyb3IgJWQiLCBhdG9taWNfcmVhZCgmcHJpdi0+dHhfcGVuZGluZ1t0Y2JfZGVzYy0+cXVldWVfaW5kZXhdKSwKKwkJCQlzdGF0dXMpOworCQlyZXR1cm4gLTE7CisJfQorfQorCitzaG9ydCBydGw4MTkyX3VzYl9pbml0ZW5kcG9pbnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJcHJpdi0+cnhfdXJiID0gKHN0cnVjdCB1cmIqKikga21hbGxvYyAoc2l6ZW9mKHN0cnVjdCB1cmIqKSAqIChNQVhfUlhfVVJCKzEpLCBHRlBfS0VSTkVMKTsKKworI2lmbmRlZiBKQUNLU09OX05FV19SWAorCWZvcihpPTA7aTwoTUFYX1JYX1VSQisxKTtpKyspeworCisJCXByaXYtPnJ4X3VyYltpXSA9IHVzYl9hbGxvY191cmIoMCxHRlBfS0VSTkVMKTsKKworCQlwcml2LT5yeF91cmJbaV0tPnRyYW5zZmVyX2J1ZmZlciA9IGttYWxsb2MoUlhfVVJCX1NJWkUsIEdGUF9LRVJORUwpOworCisJCXByaXYtPnJ4X3VyYltpXS0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IFJYX1VSQl9TSVpFOworCX0KKyNlbmRpZgorCisjaWZkZWYgVEhPTUFTX0JFQUNPTgoreworCWxvbmcgYWxpZ24gPSAwOworCXZvaWQgKm9sZGFkZHIsICpuZXdhZGRyOworCisJcHJpdi0+cnhfdXJiWzE2XSA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJcHJpdi0+b2xkYWRkciA9IGttYWxsb2MoMTYsIEdGUF9LRVJORUwpOworCW9sZGFkZHIgPSBwcml2LT5vbGRhZGRyOworCWFsaWduID0gKChsb25nKW9sZGFkZHIpICYgMzsKKwlpZiAoYWxpZ24pIHsKKwkJbmV3YWRkciA9IG9sZGFkZHIgKyA0IC0gYWxpZ247CisJCXByaXYtPnJ4X3VyYlsxNl0tPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSAxNiAtIDQgKyBhbGlnbjsKKwl9IGVsc2UgeworCQluZXdhZGRyID0gb2xkYWRkcjsKKwkJcHJpdi0+cnhfdXJiWzE2XS0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IDE2OworCX0KKwlwcml2LT5yeF91cmJbMTZdLT50cmFuc2Zlcl9idWZmZXIgPSBuZXdhZGRyOworfQorI2VuZGlmCisKKwltZW1zZXQocHJpdi0+cnhfdXJiLCAwLCBzaXplb2Yoc3RydWN0IHVyYiopICogTUFYX1JYX1VSQik7CisJcHJpdi0+cHBfcnhza2IgPSAoc3RydWN0IHNrX2J1ZmYgKiopa21hbGxvYyhzaXplb2Yoc3RydWN0IHNrX2J1ZmYgKikgKiBNQVhfUlhfVVJCLCBHRlBfS0VSTkVMKTsKKwlpZiAocHJpdi0+cHBfcnhza2IgPT0gTlVMTCkKKwkJZ290byBkZXN0cm95OworCisJbWVtc2V0KHByaXYtPnBwX3J4c2tiLCAwLCBzaXplb2Yoc3RydWN0IHNrX2J1ZmYqKSAqIE1BWF9SWF9VUkIpOworCisJZ290byBfbWlkZGxlOworCisKK2Rlc3Ryb3k6CisJaWYgKHByaXYtPnBwX3J4c2tiKSB7CisJCWtmcmVlKHByaXYtPnBwX3J4c2tiKTsKKwl9CisJaWYgKHByaXYtPnJ4X3VyYikgeworCQlrZnJlZShwcml2LT5yeF91cmIpOworCX0KKworCXByaXYtPnBwX3J4c2tiID0gTlVMTDsKKwlwcml2LT5yeF91cmIgPSBOVUxMOworCisJRE1FU0dFKCJFbmRwb2ludCBBbGxvYyBGYWlsdXJlIik7CisJcmV0dXJuIC1FTk9NRU07CisKKworX21pZGRsZToKKworCXByaW50aygiRW5kIG9mIGluaXRlbmRwb2ludHNcbiIpOworCXJldHVybiAwOworCit9CisjaWZkZWYgVEhPTUFTX0JFQUNPTgordm9pZCBydGw4MTkyX3VzYl9kZWxldGVlbmRwb2ludHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZihwcml2LT5yeF91cmIpeworCQlmb3IoaT0wO2k8KE1BWF9SWF9VUkIrMSk7aSsrKXsKKwkJCXVzYl9raWxsX3VyYihwcml2LT5yeF91cmJbaV0pOworCQkJdXNiX2ZyZWVfdXJiKHByaXYtPnJ4X3VyYltpXSk7CisJCX0KKwkJa2ZyZWUocHJpdi0+cnhfdXJiKTsKKwkJcHJpdi0+cnhfdXJiID0gTlVMTDsKKwl9CisJaWYocHJpdi0+b2xkYWRkcil7CisJCWtmcmVlKHByaXYtPm9sZGFkZHIpOworCQlwcml2LT5vbGRhZGRyID0gTlVMTDsKKwl9CisJaWYgKHByaXYtPnBwX3J4c2tiKSB7CisJCWtmcmVlKHByaXYtPnBwX3J4c2tiKTsKKwkJcHJpdi0+cHBfcnhza2IgPSAwOworCX0KK30KKyNlbHNlCit2b2lkIHJ0bDgxOTJfdXNiX2RlbGV0ZWVuZHBvaW50cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworI2lmbmRlZiBKQUNLU09OX05FV19SWAorCisJaWYocHJpdi0+cnhfdXJiKXsKKwkJZm9yKGk9MDtpPChNQVhfUlhfVVJCKzEpO2krKyl7CisJCQl1c2Jfa2lsbF91cmIocHJpdi0+cnhfdXJiW2ldKTsKKwkJCWtmcmVlKHByaXYtPnJ4X3VyYltpXS0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJCXVzYl9mcmVlX3VyYihwcml2LT5yeF91cmJbaV0pOworCQl9CisJCWtmcmVlKHByaXYtPnJ4X3VyYik7CisJCXByaXYtPnJ4X3VyYiA9IE5VTEw7CisKKwl9CisjZWxzZQorCWlmKHByaXYtPnJ4X3VyYil7CisJCWtmcmVlKHByaXYtPnJ4X3VyYik7CisJCXByaXYtPnJ4X3VyYiA9IE5VTEw7CisJfQorCWlmKHByaXYtPm9sZGFkZHIpeworCQlrZnJlZShwcml2LT5vbGRhZGRyKTsKKwkJcHJpdi0+b2xkYWRkciA9IE5VTEw7CisJfQorCWlmIChwcml2LT5wcF9yeHNrYikgeworCQlrZnJlZShwcml2LT5wcF9yeHNrYik7CisJCXByaXYtPnBwX3J4c2tiID0gMDsKKworCX0KKworI2VuZGlmCit9CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgcnRsODE5Ml91cGRhdGVfcmF0cl90YWJsZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK3ZvaWQgcnRsODE5Ml9saW5rX2NoYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworLy8JaW50IGk7CisKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUgPSBwcml2LT5pZWVlODAyMTE7CisJLy93cml0ZV9uaWNfd29yZChkZXYsIEJDTl9JTlRSX0lUViwgbmV0LT5iZWFjb25faW50ZXJ2YWwpOworCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQorCXsKKwkJcnRsODE5Ml9uZXRfdXBkYXRlKGRldik7CisJCXJ0bDgxOTJfdXBkYXRlX3JhdHJfdGFibGUoZGV2KTsKKwkJLy9hZGQgdGhpcyBhcyBpbiBwdXJlIE4gbW9kZSwgd2VwIGVuY3J5cHRpb24gd2lsbCB1c2Ugc29mdHdhcmUgd2F5LCBidXQgdGhlcmUgaXMgbm8gY2hhbmNlIHRvIHNldCB0aGlzIGFzIHdlcCB3aWxsIG5vdCBzZXQgZ3JvdXAga2V5IGluIHdleHQuIFdCLjIwMDguMDcuMDgKKwkJaWYgKChLRVlfVFlQRV9XRVA0MCA9PSBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSkgfHwgKEtFWV9UWVBFX1dFUDEwNCA9PSBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSkpCisJCUVuYWJsZUhXU2VjdXJpdHlDb25maWc4MTkyKGRldik7CisJfQorCS8qdXBkYXRlIHRpbWluZyBwYXJhbXMqLworLy8JUlRfVFJBQ0UoQ09NUF9DSCwgIj09PT09PT09PiVzKCksIGNoYW46JWRcbiIsIF9fRlVOQ1RJT05fXywgcHJpdi0+Y2hhbik7CisvLwlydGw4MTkyX3NldF9jaGFuKGRldiwgcHJpdi0+Y2hhbik7CisJIGlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEgfHwgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgdTMyIHJlZyA9IDA7CisgICAgICAgICAgICAgICAgcmVnID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBSQ1IpOworICAgICAgICAgICAgICAgIGlmIChwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpCisgICAgICAgICAgICAgICAgICAgICAgICBwcml2LT5SZWNlaXZlQ29uZmlnID0gcmVnIHw9IFJDUl9DQlNTSUQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpdi0+UmVjZWl2ZUNvbmZpZyA9IHJlZyAmPSB+UkNSX0NCU1NJRDsKKyAgICAgICAgICAgICAgICB3cml0ZV9uaWNfZHdvcmQoZGV2LCBSQ1IsIHJlZyk7CisgICAgICAgIH0KKworLy8JcnRsODE5Ml9zZXRfcnhjb25mKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJzIGRlZl9xb3NfcGFyYW1ldGVycyA9IHsKKyAgICAgICAgezMsMywzLDN9LC8qIGN3X21pbiAqLworICAgICAgICB7Nyw3LDcsN30sLyogY3dfbWF4ICovCisgICAgICAgIHsyLDIsMiwyfSwvKiBhaWZzICovCisgICAgICAgIHswLDAsMCwwfSwvKiBmbGFncyAqLworICAgICAgICB7MCwwLDAsMH0gLyogdHhfb3BfbGltaXQgKi8KK307CisKKwordm9pZCBydGw4MTkyX3VwZGF0ZV9iZWFjb24oc3RydWN0IHdvcmtfc3RydWN0ICogd29yaykKK3sKKyAgICAgICAgc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHI4MTkyX3ByaXYsIHVwZGF0ZV9iZWFjb25fd3Eud29yayk7CisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5pZWVlODAyMTEtPmRldjsKKyAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUgPSBwcml2LT5pZWVlODAyMTE7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrKiBuZXQgPSAmaWVlZS0+Y3VycmVudF9uZXR3b3JrOworCisJaWYgKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0KQorCQlIVFVwZGF0ZVNlbGZBbmRQZWVyU2V0dGluZyhpZWVlLCBuZXQpOworCWllZWUtPnBIVEluZm8tPmJDdXJyZW50UlQyUlRMb25nU2xvdFRpbWUgPSBuZXQtPmJzc2h0LmJkUlQyUlRMb25nU2xvdFRpbWU7CisJcnRsODE5Ml91cGRhdGVfY2FwKGRldiwgbmV0LT5jYXBhYmlsaXR5KTsKK30KKy8qCisqIGJhY2tncm91bmQgc3VwcG9ydCB0byBydW4gUW9TIGFjdGl2YXRlIGZ1bmN0aW9uYWxpdHkKKyovCitpbnQgV0RDQVBBUkFfQUREW10gPSB7RURDQVBBUkFfQkUsRURDQVBBUkFfQkssRURDQVBBUkFfVkksRURDQVBBUkFfVk99Owordm9pZCBydGw4MTkyX3Fvc19hY3RpdmF0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKiB3b3JrKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByODE5Ml9wcml2LCBxb3NfYWN0aXZhdGUpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5pZWVlODAyMTEtPmRldjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJzICpxb3NfcGFyYW1ldGVycyA9ICZwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5wYXJhbWV0ZXJzOworCXU4IG1vZGUgPSBwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5tb2RlOworCS8vdTMyIHNpemUgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9xb3NfcGFyYW1ldGVycyk7CisJdTggIHUxYkFJRlM7CisJdTMyIHU0YkFjUGFyYW07CisJaW50IGk7CisKKwlpZiAocHJpdiA9PSBOVUxMKQorCQlyZXR1cm47CisKKyAgICAgICBtdXRleF9sb2NrKCZwcml2LT5tdXRleCk7CisJaWYocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEKQorCQlnb3RvIHN1Y2Nlc3M7CisJUlRfVFJBQ0UoQ09NUF9RT1MsInFvcyBhY3RpdmUgcHJvY2VzcyB3aXRoIGFzc29jaWF0ZSByZXNwb25zZSByZWNlaXZlZFxuIik7CisJLyogSXQgYmV0dGVyIHNldCBzbG90IHRpbWUgYXQgZmlyc3QgKi8KKwkvKiBGb3Igd2UganVzdCBzdXBwb3J0IGIvZyBtb2RlIGF0IHByZXNlbnQsIGxldCB0aGUgc2xvdCB0aW1lIGF0IDkvMjAgc2VsZWN0aW9uICovCisJLyogdXBkYXRlIHRoZSBhYyBwYXJhbWV0ZXIgdG8gcmVsYXRlZCByZWdpc3RlcnMgKi8KKwlmb3IoaSA9IDA7IGkgPCAgUU9TX1FVRVVFX05VTTsgaSsrKSB7CisJCS8vTW9kZSBHL0E6IHNsb3RUaW1lVGltZXIgPSA5OyBNb2RlIEI6IDIwCisJCXUxYkFJRlMgPSBxb3NfcGFyYW1ldGVycy0+YWlmc1tpXSAqICgobW9kZSYoSUVFRV9HfElFRUVfTl8yNEcpKSA/OToyMCkgKyBhU2lmc1RpbWU7CisJCXU0YkFjUGFyYW0gPSAoKCgodTMyKShxb3NfcGFyYW1ldGVycy0+dHhfb3BfbGltaXRbaV0pKTw8IEFDX1BBUkFNX1RYT1BfTElNSVRfT0ZGU0VUKXwKKwkJCQkoKCh1MzIpKHFvc19wYXJhbWV0ZXJzLT5jd19tYXhbaV0pKTw8IEFDX1BBUkFNX0VDV19NQVhfT0ZGU0VUKXwKKwkJCQkoKCh1MzIpKHFvc19wYXJhbWV0ZXJzLT5jd19taW5baV0pKTw8IEFDX1BBUkFNX0VDV19NSU5fT0ZGU0VUKXwKKwkJCQkoKHUzMil1MWJBSUZTIDw8IEFDX1BBUkFNX0FJRlNfT0ZGU0VUKSk7CisKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgV0RDQVBBUkFfQUREW2ldLCB1NGJBY1BhcmFtKTsKKwkJLy93cml0ZV9uaWNfZHdvcmQoZGV2LCBXRENBUEFSQV9BRERbaV0sIDB4MDA1ZTQzMzIpOworCX0KKworc3VjY2VzczoKKyAgICAgICBtdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKK30KKworc3RhdGljIGludCBydGw4MTkyX3Fvc19oYW5kbGVfcHJvYmVfcmVzcG9uc2Uoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsCisJCWludCBhY3RpdmVfbmV0d29yaywKKwkJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrKQoreworCWludCByZXQgPSAwOworCXUzMiBzaXplID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcnMpOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSAhPUlFRUU4MDIxMV9MSU5LRUQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBKSkKKwkJcmV0dXJuIHJldDsKKworCWlmIChuZXR3b3JrLT5mbGFncyAmIE5FVFdPUktfSEFTX1FPU19NQVNLKSB7CisJCWlmIChhY3RpdmVfbmV0d29yayAmJgorCQkJCShuZXR3b3JrLT5mbGFncyAmIE5FVFdPUktfSEFTX1FPU19QQVJBTUVURVJTKSkKKwkJCW5ldHdvcmstPnFvc19kYXRhLmFjdGl2ZSA9IG5ldHdvcmstPnFvc19kYXRhLnN1cHBvcnRlZDsKKworCQlpZiAoKG5ldHdvcmstPnFvc19kYXRhLmFjdGl2ZSA9PSAxKSAmJiAoYWN0aXZlX25ldHdvcmsgPT0gMSkgJiYKKwkJCQkobmV0d29yay0+ZmxhZ3MgJiBORVRXT1JLX0hBU19RT1NfUEFSQU1FVEVSUykgJiYKKwkJCQkobmV0d29yay0+cW9zX2RhdGEub2xkX3BhcmFtX2NvdW50ICE9CisJCQkJIG5ldHdvcmstPnFvc19kYXRhLnBhcmFtX2NvdW50KSkgeworCQkJbmV0d29yay0+cW9zX2RhdGEub2xkX3BhcmFtX2NvdW50ID0KKwkJCQluZXR3b3JrLT5xb3NfZGF0YS5wYXJhbV9jb3VudDsKKwkJCXF1ZXVlX3dvcmsocHJpdi0+cHJpdl93cSwgJnByaXYtPnFvc19hY3RpdmF0ZSk7CisJCQlSVF9UUkFDRSAoQ09NUF9RT1MsICJRb1MgcGFyYW1ldGVycyBjaGFuZ2UgY2FsbCAiCisJCQkJCSJxb3NfYWN0aXZhdGVcbiIpOworCQl9CisJfSBlbHNlIHsKKwkJbWVtY3B5KCZwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5wYXJhbWV0ZXJzLFwKKwkJICAgICAgICZkZWZfcW9zX3BhcmFtZXRlcnMsIHNpemUpOworCisJCWlmICgobmV0d29yay0+cW9zX2RhdGEuYWN0aXZlID09IDEpICYmIChhY3RpdmVfbmV0d29yayA9PSAxKSkgeworCQkJcXVldWVfd29yayhwcml2LT5wcml2X3dxLCAmcHJpdi0+cW9zX2FjdGl2YXRlKTsKKwkJCVJUX1RSQUNFKENPTVBfUU9TLCAiUW9TIHdhcyBkaXNhYmxlZCBjYWxsIHFvc19hY3RpdmF0ZSBcbiIpOworCQl9CisJCW5ldHdvcmstPnFvc19kYXRhLmFjdGl2ZSA9IDA7CisJCW5ldHdvcmstPnFvc19kYXRhLnN1cHBvcnRlZCA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIGhhbmRsZSBtYW5hZ2UgZnJhbWUgZnJhbWUgYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZSAqLworc3RhdGljIGludCBydGw4MTkyX2hhbmRsZV9iZWFjb24oc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2JlYWNvbiAqIGJlYWNvbiwKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqIG5ldHdvcmspCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJcnRsODE5Ml9xb3NfaGFuZGxlX3Byb2JlX3Jlc3BvbnNlKHByaXYsMSxuZXR3b3JrKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+cHJpdl93cSwgJnByaXYtPnVwZGF0ZV9iZWFjb25fd3EsIDApOworCXJldHVybiAwOworCit9CisKKy8qCisqIGhhbmRsaW5nIHRoZSBiZWFjb25pbmcgcmVzcG9uc2VzLiBpZiB3ZSBnZXQgZGlmZmVyZW50IFFvUyBzZXR0aW5nCisqIG9mZiB0aGUgbmV0d29yayBmcm9tIHRoZSBhc3NvY2lhdGVkIHNldHRpbmcsIGFkanVzdCB0aGUgUW9TCisqIHNldHRpbmcKKyovCitzdGF0aWMgaW50IHJ0bDgxOTJfcW9zX2Fzc29jaWF0aW9uX3Jlc3Aoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsCisJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yaykKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBzaXplID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcnMpOworCWludCBzZXRfcW9zX3BhcmFtID0gMDsKKworCWlmICgocHJpdiA9PSBOVUxMKSB8fCAobmV0d29yayA9PSBOVUxMKSkKKwkJcmV0dXJuIHJldDsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgIT1JRUVFODAyMTFfTElOS0VEKQorCQlyZXR1cm4gcmV0OworCisJaWYgKChwcml2LT5pZWVlODAyMTEtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSkpCisJCXJldHVybiByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+aWVlZTgwMjExLT5sb2NrLCBmbGFncyk7CisJaWYobmV0d29yay0+ZmxhZ3MgJiBORVRXT1JLX0hBU19RT1NfUEFSQU1FVEVSUykgeworCQltZW1jcHkoJnByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLnBhcmFtZXRlcnMsXAorCQkJICZuZXR3b3JrLT5xb3NfZGF0YS5wYXJhbWV0ZXJzLFwKKwkJCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJzKSk7CisJCXByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZSA9IDE7CisJCSB7CisJCQlzZXRfcW9zX3BhcmFtID0gMTsKKwkJCS8qIHVwZGF0ZSBxb3MgcGFyYW1ldGVyIGZvciBjdXJyZW50IG5ldHdvcmsgKi8KKwkJCXByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLm9sZF9wYXJhbV9jb3VudCA9IFwKKwkJCQkgcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEucGFyYW1fY291bnQ7CisJCQlwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5wYXJhbV9jb3VudCA9IFwKKwkJCQkgbmV0d29yay0+cW9zX2RhdGEucGFyYW1fY291bnQ7CisJCX0KKwl9IGVsc2UgeworCQltZW1jcHkoJnByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLnBhcmFtZXRlcnMsXAorCQkgICAgICAgJmRlZl9xb3NfcGFyYW1ldGVycywgc2l6ZSk7CisJCXByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZSA9IDA7CisJCXByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLnN1cHBvcnRlZCA9IDA7CisJCXNldF9xb3NfcGFyYW0gPSAxOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmllZWU4MDIxMS0+bG9jaywgZmxhZ3MpOworCisJUlRfVFJBQ0UoQ09NUF9RT1MsICIlczogbmV0d29yay0+ZmxhZ3MgPSAlZCwlZFxuIixfX0ZVTkNUSU9OX18sbmV0d29yay0+ZmxhZ3MgLHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZSk7CisJaWYgKHNldF9xb3NfcGFyYW0gPT0gMSkKKwkJcXVldWVfd29yayhwcml2LT5wcml2X3dxLCAmcHJpdi0+cW9zX2FjdGl2YXRlKTsKKworCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHJ0bDgxOTJfaGFuZGxlX2Fzc29jX3Jlc3BvbnNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICpyZXNwLAorCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlydGw4MTkyX3Fvc19hc3NvY2lhdGlvbl9yZXNwKHByaXYsIG5ldHdvcmspOworCXJldHVybiAwOworfQorCisKK3ZvaWQgcnRsODE5Ml91cGRhdGVfcmF0cl90YWJsZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQorCS8vCVBPQ1RFVF9TVFJJTkcJcG9zTGVnYWN5UmF0ZSwKKwkvLwl1OCoJCQlwTWNzUmF0ZSkKKwkvLwlQUlRfV0xBTl9TVEEJcEVudHJ5KQoreworCXN0cnVjdCByODE5Ml9wcml2KiBwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKwl1OCogcE1jc1JhdGUgPSBpZWVlLT5kb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0OworCS8vc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXQgPSAmaWVlZS0+Y3VycmVudF9uZXR3b3JrOworCXUzMiByYXRyX3ZhbHVlID0gMDsKKwl1OCByYXRlX2luZGV4ID0gMDsKKwlydGw4MTkyX2NvbmZpZ19yYXRlKGRldiwgKHUxNiopKCZyYXRyX3ZhbHVlKSk7CisJcmF0cl92YWx1ZSB8PSAoKih1MTYqKShwTWNzUmF0ZSkpIDw8IDEyOworLy8Jc3dpdGNoIChuZXQtPm1vZGUpCisJc3dpdGNoIChpZWVlLT5tb2RlKQorCXsKKwkJY2FzZSBJRUVFX0E6CisJCQlyYXRyX3ZhbHVlICY9IDB4MDAwMDBGRjA7CisJCQlicmVhazsKKwkJY2FzZSBJRUVFX0I6CisJCQlyYXRyX3ZhbHVlICY9IDB4MDAwMDAwMEY7CisJCQlicmVhazsKKwkJY2FzZSBJRUVFX0c6CisJCQlyYXRyX3ZhbHVlICY9IDB4MDAwMDBGRjc7CisJCQlicmVhazsKKwkJY2FzZSBJRUVFX05fMjRHOgorCQljYXNlIElFRUVfTl81RzoKKwkJCWlmIChpZWVlLT5wSFRJbmZvLT5QZWVyTWltb1BzID09IDApIC8vTUlNT19QU19TVEFUSUMKKwkJCQlyYXRyX3ZhbHVlICY9IDB4MDAwN0YwMDc7CisJCQllbHNleworCQkJCWlmIChwcml2LT5yZl90eXBlID09IFJGXzFUMlIpCisJCQkJCXJhdHJfdmFsdWUgJj0gMHgwMDBGRjAwNzsKKwkJCQllbHNlCisJCQkJCXJhdHJfdmFsdWUgJj0gMHgwRjgxRjAwNzsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCXJhdHJfdmFsdWUgJj0gMHgwRkZGRkZGRjsKKwlpZihpZWVlLT5wSFRJbmZvLT5iQ3VyVHhCVzQwTUh6ICYmIGllZWUtPnBIVEluZm8tPmJDdXJTaG9ydEdJNDBNSHopeworCQlyYXRyX3ZhbHVlIHw9IDB4ODAwMDAwMDA7CisJfWVsc2UgaWYoIWllZWUtPnBIVEluZm8tPmJDdXJUeEJXNDBNSHogJiYgaWVlZS0+cEhUSW5mby0+YkN1clNob3J0R0kyME1Ieil7CisJCXJhdHJfdmFsdWUgfD0gMHg4MDAwMDAwMDsKKwl9CisJd3JpdGVfbmljX2R3b3JkKGRldiwgUkFUUjArcmF0ZV9pbmRleCo0LCByYXRyX3ZhbHVlKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFVGV1AsIDEpOworfQorCitzdGF0aWMgdTggY2NtcF9pZVs0XSA9IHsweDAwLDB4NTAsMHhmMiwweDA0fTsKK3N0YXRpYyB1OCBjY21wX3Jzbl9pZVs0XSA9IHsweDAwLCAweDBmLCAweGFjLCAweDA0fTsKK2Jvb2wgR2V0Tm1vZGVTdXBwb3J0QnlTZWNDZmc4MTkyKHN0cnVjdCBuZXRfZGV2aWNlKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiogcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUgPSBwcml2LT5pZWVlODAyMTE7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICogbmV0d29yayA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7CisJaW50IHdwYV9pZV9sZW49IGllZWUtPndwYV9pZV9sZW47CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKiBjcnlwdDsKKwlpbnQgZW5jcnlwdDsKKworCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKKwkvL3dlIHVzZSBjb25uZWN0aW5nIEFQJ3MgY2FwYWJpbGl0eSBpbnN0ZWFkIG9mIG9ubHkgc2VjdXJpdHkgY29uZmlnIG9uIG91ciBkcml2ZXIgdG8gZGlzdGluZ3Vpc2ggd2hldGhlciBpdCBzaG91bGQgdXNlIE4gbW9kZSBvciBHIG1vZGUKKwllbmNyeXB0ID0gKG5ldHdvcmstPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkgfHwgKGllZWUtPmhvc3RfZW5jcnlwdCAmJiBjcnlwdCAmJiBjcnlwdC0+b3BzICYmICgwID09IHN0cmNtcChjcnlwdC0+b3BzLT5uYW1lLCJXRVAiKSkpOworCisJLyogc2ltcGx5IGp1ZGdlICAqLworCWlmKGVuY3J5cHQgJiYgKHdwYV9pZV9sZW4gPT0gMCkpIHsKKwkJLyogd2VwIGVuY3J5cHRpb24sIG5vIE4gbW9kZSBzZXR0aW5nICovCisJCXJldHVybiBmYWxzZTsKKy8vCX0gZWxzZSBpZigod3BhX2llX2xlbiAhPSAwKSYmKG1lbWNtcCgmKGllZWUtPndwYV9pZVsxNF0pLGNjbXBfaWUsNCkpKSB7CisJfSBlbHNlIGlmKCh3cGFfaWVfbGVuICE9IDApKSB7CisJCS8qIHBhcnNlIHBhaXJ3aXNlIGtleSB0eXBlICovCisJCS8vaWYoKHBhaXJ3aXNla2V5ID0gV0VQNDApfHwocGFpcndpc2VrZXkgPSBXRVAxMDQpfHwocGFpcndpc2VrZXkgPSBUS0lQKSkKKwkJaWYgKCgoaWVlZS0+d3BhX2llWzBdID09IDB4ZGQpICYmICghbWVtY21wKCYoaWVlZS0+d3BhX2llWzE0XSksY2NtcF9pZSw0KSkpIHx8ICgoaWVlZS0+d3BhX2llWzBdID09IDB4MzApICYmICghbWVtY21wKCZpZWVlLT53cGFfaWVbMTBdLGNjbXBfcnNuX2llLCA0KSkpKQorCQkJcmV0dXJuIHRydWU7CisJCWVsc2UKKwkJCXJldHVybiBmYWxzZTsKKwl9IGVsc2UgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBHZXRIYWxmTm1vZGVTdXBwb3J0QnlBUHM4MTl4VXNiKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJYm9vbAkJCVJldmFsOworCXN0cnVjdCByODE5Ml9wcml2KiBwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKworCWlmKGllZWUtPmJIYWxmV2lyZWxlc3NOMjRHTW9kZSA9PSB0cnVlKQorCQlSZXZhbCA9IHRydWU7CisJZWxzZQorCQlSZXZhbCA9ICBmYWxzZTsKKworCXJldHVybiBSZXZhbDsKK30KKwordm9pZCBydGw4MTkyX3JlZnJlc2hfc3VwcG9ydHJhdGUoc3RydWN0IHI4MTkyX3ByaXYqIHByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUgPSBwcml2LT5pZWVlODAyMTE7CisJLy93ZSBkb25vdCBjb25zaWRlciBzZXQgc3VwcG9ydCByYXRlIGZvciBBQkcgbW9kZSwgb25seSBIVCBNQ1MgcmF0ZSBpcyBzZXQgaGVyZS4KKwlpZiAoaWVlZS0+bW9kZSA9PSBXSVJFTEVTU19NT0RFX05fMjRHIHx8IGllZWUtPm1vZGUgPT0gV0lSRUxFU1NfTU9ERV9OXzVHKQorCXsKKwkJbWVtY3B5KGllZWUtPlJlZ2RvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQsIGllZWUtPlJlZ0hUU3VwcFJhdGVTZXQsIDE2KTsKKwkJLy9SVF9ERUJVR19EQVRBKENPTVBfSU5JVCwgaWVlZS0+UmVnSFRTdXBwUmF0ZVNldCwgMTYpOworCQkvL1JUX0RFQlVHX0RBVEEoQ09NUF9JTklULCBpZWVlLT5SZWdkb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0LCAxNik7CisJfQorCWVsc2UKKwkJbWVtc2V0KGllZWUtPlJlZ2RvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQsIDAsIDE2KTsKKwlyZXR1cm47Cit9CisKK3U4IHJ0bDgxOTJfZ2V0U3VwcG9ydGVkV2lyZWxlZU1vZGUoc3RydWN0IG5ldF9kZXZpY2UqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OCByZXQgPSAwOworCXN3aXRjaChwcml2LT5yZl9jaGlwKQorCXsKKwkJY2FzZSBSRl84MjI1OgorCQljYXNlIFJGXzgyNTY6CisJCWNhc2UgUkZfUFNFVURPXzExTjoKKwkJCXJldCA9IChXSVJFTEVTU19NT0RFX05fMjRHfFdJUkVMRVNTX01PREVfR3xXSVJFTEVTU19NT0RFX0IpOworCQkJYnJlYWs7CisJCWNhc2UgUkZfODI1ODoKKwkJCXJldCA9IChXSVJFTEVTU19NT0RFX0F8V0lSRUxFU1NfTU9ERV9OXzVHKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gV0lSRUxFU1NfTU9ERV9COworCQkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9Cit2b2lkIHJ0bDgxOTJfU2V0V2lyZWxlc3NNb2RlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHU4IHdpcmVsZXNzX21vZGUpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXU4IGJTdXBwb3J0TW9kZSA9IHJ0bDgxOTJfZ2V0U3VwcG9ydGVkV2lyZWxlZU1vZGUoZGV2KTsKKworCWlmICgod2lyZWxlc3NfbW9kZSA9PSBXSVJFTEVTU19NT0RFX0FVVE8pIHx8ICgod2lyZWxlc3NfbW9kZSZiU3VwcG9ydE1vZGUpPT0wKSkKKwl7CisJCWlmKGJTdXBwb3J0TW9kZSAmIFdJUkVMRVNTX01PREVfTl8yNEcpCisJCXsKKwkJCXdpcmVsZXNzX21vZGUgPSBXSVJFTEVTU19NT0RFX05fMjRHOworCQl9CisJCWVsc2UgaWYoYlN1cHBvcnRNb2RlICYgV0lSRUxFU1NfTU9ERV9OXzVHKQorCQl7CisJCQl3aXJlbGVzc19tb2RlID0gV0lSRUxFU1NfTU9ERV9OXzVHOworCQl9CisJCWVsc2UgaWYoKGJTdXBwb3J0TW9kZSAmIFdJUkVMRVNTX01PREVfQSkpCisJCXsKKwkJCXdpcmVsZXNzX21vZGUgPSBXSVJFTEVTU19NT0RFX0E7CisJCX0KKwkJZWxzZSBpZigoYlN1cHBvcnRNb2RlICYgV0lSRUxFU1NfTU9ERV9HKSkKKwkJeworCQkJd2lyZWxlc3NfbW9kZSA9IFdJUkVMRVNTX01PREVfRzsKKwkJfQorCQllbHNlIGlmKChiU3VwcG9ydE1vZGUgJiBXSVJFTEVTU19NT0RFX0IpKQorCQl7CisJCQl3aXJlbGVzc19tb2RlID0gV0lSRUxFU1NfTU9ERV9COworCQl9CisJCWVsc2V7CisJCQlSVF9UUkFDRShDT01QX0VSUiwgIiVzKCksIE5vIHZhbGlkIHdpcmVsZXNzIG1vZGUgc3VwcG9ydGVkLCBTdXBwb3J0ZWRXaXJlbGVzc01vZGUoJXgpISEhXG4iLCBfX0ZVTkNUSU9OX18sYlN1cHBvcnRNb2RlKTsKKwkJCXdpcmVsZXNzX21vZGUgPSBXSVJFTEVTU19NT0RFX0I7CisJCX0KKwl9CisjaWZkZWYgVE9fRE9fTElTVCAvLy8vIFRPRE86IHRoaXMgZnVuY3Rpb24gZG9lc24ndCB3b3JrIHdlbGwgYXQgdGhpcyB0aW1lLCB3ZSBzaG91ZCB3YWl0IGZvciBGUEdBCisJQWN0VXBkYXRlQ2hhbm5lbEFjY2Vzc1NldHRpbmcoIHBBZGFwdGVyLCBwSGFsRGF0YS0+Q3VycmVudFdpcmVsZXNzTW9kZSwgJnBBZGFwdGVyLT5NZ250SW5mby5JbmZvODE4NS5DaGFubmVsQWNjZXNzU2V0dGluZyApOworI2VuZGlmCisJcHJpdi0+aWVlZTgwMjExLT5tb2RlID0gd2lyZWxlc3NfbW9kZTsKKworCWlmICgod2lyZWxlc3NfbW9kZSA9PSBXSVJFTEVTU19NT0RFX05fMjRHKSB8fCAgKHdpcmVsZXNzX21vZGUgPT0gV0lSRUxFU1NfTU9ERV9OXzVHKSkKKwkJcHJpdi0+aWVlZTgwMjExLT5wSFRJbmZvLT5iRW5hYmxlSFQgPSAxOworCWVsc2UKKwkJcHJpdi0+aWVlZTgwMjExLT5wSFRJbmZvLT5iRW5hYmxlSFQgPSAwOworCVJUX1RSQUNFKENPTVBfSU5JVCwgIkN1cnJlbnQgV2lyZWxlc3MgTW9kZSBpcyAleFxuIiwgd2lyZWxlc3NfbW9kZSk7CisJcnRsODE5Ml9yZWZyZXNoX3N1cHBvcnRyYXRlKHByaXYpOworCit9CisvL2luaXQgcHJpdiB2YXJpYWJsZXMgaGVyZS4gb25seSBub25femVybyB2YWx1ZSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgaGVyZS4KK3N0YXRpYyB2b2lkIHJ0bDgxOTJfaW5pdF9wcml2X3ZhcmlhYmxlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXU4IGk7CisJcHJpdi0+Y2FyZF84MTkyID0gTklDXzgxOTJVOworCXByaXYtPmNoYW4gPSAxOyAvL3NldCB0byBjaGFubmVsIDEKKwlwcml2LT5pZWVlODAyMTEtPm1vZGUgPSBXSVJFTEVTU19NT0RFX0FVVE87IC8vU0VUIEFVVE8KKwlwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPSBJV19NT0RFX0lORlJBOworCXByaXYtPmllZWU4MDIxMS0+aWVlZV91cD0wOworCXByaXYtPnJldHJ5X3J0cyA9IERFRkFVTFRfUkVUUllfUlRTOworCXByaXYtPnJldHJ5X2RhdGEgPSBERUZBVUxUX1JFVFJZX0RBVEE7CisJcHJpdi0+aWVlZTgwMjExLT5ydHMgPSBERUZBVUxUX1JUU19USFJFU0hPTEQ7CisJcHJpdi0+aWVlZTgwMjExLT5yYXRlID0gMTEwOyAvLzExIG1icHMKKwlwcml2LT5pZWVlODAyMTEtPnNob3J0X3Nsb3QgPSAxOworCXByaXYtPnByb21pc2MgPSAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSA/IDE6MDsKKwlwcml2LT5DY2tQd0VubCA9IDY7CisJLy9mb3Igc2lsZW50IHJlc2V0CisJcHJpdi0+SXJwUGVuZGluZ0NvdW50ID0gMTsKKwlwcml2LT5SZXNldFByb2dyZXNzID0gUkVTRVRfVFlQRV9OT1JFU0VUOworCXByaXYtPmJGb3JjZWRTaWxlbnRSZXNldCA9IDA7CisJcHJpdi0+YkRpc2FibGVOb3JtYWxSZXNldENoZWNrID0gZmFsc2U7CisJcHJpdi0+Zm9yY2VfcmVzZXQgPSBmYWxzZTsKKworCXByaXYtPmllZWU4MDIxMS0+RndSV1JGID0gMDsgCS8vd2UgZG9uJ3QgdXNlIEZXIHJlYWQvd3JpdGUgUkYgdW50aWwgc3RhYmxlIGZpcm13YXJlIGlzIGF2YWlsYWJsZS4KKwlwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgPSBERUZBVUxUX0JFQUNPTklOVEVSVkFMOworCXByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9IElXX01PREVfSU5GUkE7CisJcHJpdi0+aWVlZTgwMjExLT5zb2Z0bWFjX2ZlYXR1cmVzICA9IElFRUVfU09GVE1BQ19TQ0FOIHwKKwkJSUVFRV9TT0ZUTUFDX0FTU09DSUFURSB8IElFRUVfU09GVE1BQ19QUk9CRVJRIHwKKwkJSUVFRV9TT0ZUTUFDX1BST0JFUlMgfCBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgfAorCQlJRUVFX1NPRlRNQUNfQkVBQ09OUzsvL2FkZGVkIGJ5IGFteSAwODA2MDQgLy98ICAvL0lFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUU7CisKKwlwcml2LT5pZWVlODAyMTEtPmFjdGl2ZV9zY2FuID0gMTsKKwlwcml2LT5pZWVlODAyMTEtPm1vZHVsYXRpb24gPSBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT04gfCBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OOworCXByaXYtPmllZWU4MDIxMS0+aG9zdF9lbmNyeXB0ID0gMTsKKwlwcml2LT5pZWVlODAyMTEtPmhvc3RfZGVjcnlwdCA9IDE7CisJcHJpdi0+aWVlZTgwMjExLT5zdGFydF9zZW5kX2JlYWNvbnMgPSBOVUxMOy8vcnRsODE5eHVzYl9iZWFjb25fdHg7Ly8tYnkgYW15IDA4MDYwNAorCXByaXYtPmllZWU4MDIxMS0+c3RvcF9zZW5kX2JlYWNvbnMgPSBOVUxMOy8vcnRsODE5Ml9iZWFjb25fc3RvcDsvLy1ieSBhbXkgMDgwNjA0CisJcHJpdi0+aWVlZTgwMjExLT5zb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdCA9IHJ0bDgxOTJfaGFyZF9zdGFydF94bWl0OworCXByaXYtPmllZWU4MDIxMS0+c2V0X2NoYW4gPSBydGw4MTkyX3NldF9jaGFuOworCXByaXYtPmllZWU4MDIxMS0+bGlua19jaGFuZ2UgPSBydGw4MTkyX2xpbmtfY2hhbmdlOworCXByaXYtPmllZWU4MDIxMS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCA9IHJ0bDgxOTJfaGFyZF9kYXRhX3htaXQ7CisJcHJpdi0+aWVlZTgwMjExLT5kYXRhX2hhcmRfc3RvcCA9IHJ0bDgxOTJfZGF0YV9oYXJkX3N0b3A7CisJcHJpdi0+aWVlZTgwMjExLT5kYXRhX2hhcmRfcmVzdW1lID0gcnRsODE5Ml9kYXRhX2hhcmRfcmVzdW1lOworCXByaXYtPmllZWU4MDIxMS0+aW5pdF93bW1wYXJhbV9mbGFnID0gMDsKKwlwcml2LT5pZWVlODAyMTEtPmZ0cyA9IERFRkFVTFRfRlJBR19USFJFU0hPTEQ7CisJcHJpdi0+aWVlZTgwMjExLT5jaGVja19uaWNfZW5vdWdoX2Rlc2MgPSBjaGVja19uaWNfZW5vdWdoX2Rlc2M7CisJcHJpdi0+aWVlZTgwMjExLT50eF9oZWFkcm9vbSA9IFRYX1BBQ0tFVF9TSElGVF9CWVRFUzsKKwlwcml2LT5pZWVlODAyMTEtPnFvc19zdXBwb3J0ID0gMTsKKworCS8vYWRkZWQgYnkgV0IKKy8vCXByaXYtPmllZWU4MDIxMS0+U3dDaG5sQnlUaW1lckhhbmRsZXIgPSBydGw4MTkyX3BoeV9Td0Nobmw7CisJcHJpdi0+aWVlZTgwMjExLT5TZXRCV01vZGVIYW5kbGVyID0gcnRsODE5Ml9TZXRCV01vZGU7CisJcHJpdi0+aWVlZTgwMjExLT5oYW5kbGVfYXNzb2NfcmVzcG9uc2UgPSBydGw4MTkyX2hhbmRsZV9hc3NvY19yZXNwb25zZTsKKwlwcml2LT5pZWVlODAyMTEtPmhhbmRsZV9iZWFjb24gPSBydGw4MTkyX2hhbmRsZV9iZWFjb247CisJLy9hZGRlZCBieSBkYXZpZAorCXByaXYtPmllZWU4MDIxMS0+R2V0Tm1vZGVTdXBwb3J0QnlTZWNDZmcgPSBHZXRObW9kZVN1cHBvcnRCeVNlY0NmZzgxOTI7CisJcHJpdi0+aWVlZTgwMjExLT5HZXRIYWxmTm1vZGVTdXBwb3J0QnlBUHNIYW5kbGVyID0gR2V0SGFsZk5tb2RlU3VwcG9ydEJ5QVBzODE5eFVzYjsKKwlwcml2LT5pZWVlODAyMTEtPlNldFdpcmVsZXNzTW9kZSA9IHJ0bDgxOTJfU2V0V2lyZWxlc3NNb2RlOworCS8vYWRkZWQgYnkgYW15CisJcHJpdi0+aWVlZTgwMjExLT5Jbml0aWFsR2FpbkhhbmRsZXIgPSBJbml0aWFsR2FpbjgxOXhVc2I7CisJcHJpdi0+Y2FyZF90eXBlID0gVVNCOworI2lmZGVmIFRPX0RPX0xJU1QKKwlpZihBZGFwdGVyLT5iSW5IY3RUZXN0KQorCXsKKwkJcEhhbERhdGEtPlNob3J0UmV0cnlMaW1pdCA9IDc7CisJCXBIYWxEYXRhLT5Mb25nUmV0cnlMaW1pdCA9IDc7CisJfQorI2VuZGlmCisJeworCQlwcml2LT5TaG9ydFJldHJ5TGltaXQgPSAweDMwOworCQlwcml2LT5Mb25nUmV0cnlMaW1pdCA9IDB4MzA7CisJfQorCXByaXYtPkVhcmx5UnhUaHJlc2hvbGQgPSA3OworCXByaXYtPmVuYWJsZV9ncGlvMCA9IDA7CisJcHJpdi0+VHJhbnNtaXRDb25maWcgPQorCS8vCVRDUl9EdXJQcm9jTW9kZSB8CS8vZm9yIFJUTDgxODVCLCBkdXJhdGlvbiBzZXR0aW5nIGJ5IEhXCisJLy8/CVRDUl9ESVNSZXFRc2l6ZSB8CisJCShUQ1JfTVhETUFfMjA0ODw8VENSX01YRE1BX09GRlNFVCl8ICAvLyBNYXggRE1BIEJ1cnN0IFNpemUgcGVyIFR4IERNQSBCdXJzdCwgNzogcmVzZXJ2aWVkLgorCQkocHJpdi0+U2hvcnRSZXRyeUxpbWl0PDxUQ1JfU1JMX09GRlNFVCl8CS8vIFNob3J0IHJldHJ5IGxpbWl0CisJCShwcml2LT5Mb25nUmV0cnlMaW1pdDw8VENSX0xSTF9PRkZTRVQpIHwJLy8gTG9uZyByZXRyeSBsaW1pdAorCQkoZmFsc2UgPyBUQ1JfU0FUOiAwKTsJLy8gRkFMU0U6IEhXIHByb3ZpZXMgUExDUCBsZW5ndGggYW5kIExFTkdFWFQsIFRVUkU6IFNXIHByb2l2ZWRzIHRoZW0KKyNpZmRlZiBUT19ET19MSVNUCisJaWYoQWRhcHRlci0+YkluSGN0VGVzdCkKKwkJcEhhbERhdGEtPlJlY2VpdmVDb25maWcJPQlwSGFsRGF0YS0+Q1NNZXRob2QgfAorCQkJCQkJUkNSX0FNRiB8IFJDUl9BREYgfAkvL1JDUl9BQVAgfCAJLy9hY2NlcHQgbWFuYWdlbWVudC9kYXRhCisJCQkJCQkvL2d1YW5nYW4yMDA3MTAKKwkJCQkJCVJDUl9BQ0YgfAkvL2FjY2VwdCBjb250cm9sIGZyYW1lIGZvciBTVyBBUCBuZWVkcyBQUy1wb2xsLCAyMDA1LjA3LjA3LCBieSByY25qa28uCisJCQkJCQlSQ1JfQUIgfCBSQ1JfQU0gfCBSQ1JfQVBNIHwJCS8vYWNjZXB0IEJDL01DL1VDCisJCQkJCQlSQ1JfQUlDViB8IFJDUl9BQ1JDMzIgfCAJCS8vYWNjZXB0IElDVi9DUkMgZXJyb3IgcGFja2V0CisJCQkJCQkoKHUzMik3PDxSQ1JfTVhETUFfT0ZGU0VUKSB8IC8vIE1heCBETUEgQnVyc3QgU2l6ZSBwZXIgUnggRE1BIEJ1cnN0LCA3OiB1bmxpbWl0ZWQuCisJCQkJCQkocEhhbERhdGEtPkVhcmx5UnhUaHJlc2hvbGQ8PFJDUl9GSUZPX09GRlNFVCkgfCAvLyBSeCBGSUZPIFRocmVzaG9sZCwgNzogTm8gUnggdGhyZXNob2xkLgorCQkJCQkJKHBIYWxEYXRhLT5FYXJseVJ4VGhyZXNob2xkID09IDcgPyBSQ1JfT25seUVybFBrdDowKTsKKwllbHNlCisKKyNlbmRpZgorCXByaXYtPlJlY2VpdmVDb25maWcJPQorCQlSQ1JfQU1GIHwgUkNSX0FERiB8CQkvL2FjY2VwdCBtYW5hZ2VtZW50L2RhdGEKKwkJUkNSX0FDRiB8CQkJLy9hY2NlcHQgY29udHJvbCBmcmFtZSBmb3IgU1cgQVAgbmVlZHMgUFMtcG9sbCwgMjAwNS4wNy4wNywgYnkgcmNuamtvLgorCQlSQ1JfQUIgfCBSQ1JfQU0gfCBSQ1JfQVBNIHwJLy9hY2NlcHQgQkMvTUMvVUMKKwkJLy9SQ1JfQUlDViB8IFJDUl9BQ1JDMzIgfCAJLy9hY2NlcHQgSUNWL0NSQyBlcnJvciBwYWNrZXQKKwkJKCh1MzIpNzw8UkNSX01YRE1BX09GRlNFVCl8IC8vIE1heCBETUEgQnVyc3QgU2l6ZSBwZXIgUnggRE1BIEJ1cnN0LCA3OiB1bmxpbWl0ZWQuCisJCShwcml2LT5FYXJseVJ4VGhyZXNob2xkPDxSWF9GSUZPX1RIUkVTSE9MRF9TSElGVCkgfCAvLyBSeCBGSUZPIFRocmVzaG9sZCwgNzogTm8gUnggdGhyZXNob2xkLgorCQkocHJpdi0+RWFybHlSeFRocmVzaG9sZCA9PSA3ID8gUkNSX09OTFlFUkxQS1Q6MCk7CisKKwlwcml2LT5BY21Db250cm9sID0gMDsKKwlwcml2LT5wRmlybXdhcmUgPSAocnRfZmlybXdhcmUqKWttYWxsb2Moc2l6ZW9mKHJ0X2Zpcm13YXJlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByaXYtPnBGaXJtd2FyZSkKKwltZW1zZXQocHJpdi0+cEZpcm13YXJlLCAwLCBzaXplb2YocnRfZmlybXdhcmUpKTsKKworCS8qIHJ4IHJlbGF0ZWQgcXVldWUgKi8KKwlza2JfcXVldWVfaGVhZF9pbml0KCZwcml2LT5yeF9xdWV1ZSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcHJpdi0+c2tiX3F1ZXVlKTsKKworCS8qIFR4IHJlbGF0ZWQgcXVldWUgKi8KKwlmb3IoaSA9IDA7IGkgPCBNQVhfUVVFVUVfU0laRTsgaSsrKSB7CisJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnByaXYtPmllZWU4MDIxMS0+c2tiX3dhaXRRIFtpXSk7CisJfQorCWZvcihpID0gMDsgaSA8IE1BWF9RVUVVRV9TSVpFOyBpKyspIHsKKwkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcHJpdi0+aWVlZTgwMjExLT5za2JfYWdnUSBbaV0pOworCX0KKwlmb3IoaSA9IDA7IGkgPCBNQVhfUVVFVUVfU0laRTsgaSsrKSB7CisJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnByaXYtPmllZWU4MDIxMS0+c2tiX2Rydl9hZ2dRIFtpXSk7CisJfQorCXByaXYtPnJmX3NldF9jaGFuID0gcnRsODE5Ml9waHlfU3dDaG5sOworfQorCisvL2luaXQgbG9jayBoZXJlCitzdGF0aWMgdm9pZCBydGw4MTkyX2luaXRfcHJpdl9sb2NrKHN0cnVjdCByODE5Ml9wcml2KiBwcml2KQoreworCXNwaW5fbG9ja19pbml0KCZwcml2LT50eF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+aXJxX2xvY2spOy8vYWRkZWQgYnkgdGhvbWFzCisJLy9zcGluX2xvY2tfaW5pdCgmcHJpdi0+cmZfbG9jayk7CisJc2VtYV9pbml0KCZwcml2LT53eF9zZW0sMSk7CisJc2VtYV9pbml0KCZwcml2LT5yZl9zZW0sMSk7CisJbXV0ZXhfaW5pdCgmcHJpdi0+bXV0ZXgpOworfQorCitleHRlcm4gIHZvaWQgICAgcnRsODE5eF93YXRjaGRvZ193cWNhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKK3ZvaWQgcnRsODE5Ml9pcnFfcnhfdGFza2xldChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdik7CisvL2luaXQgdGFza2xldCBhbmQgd2FpdF9xdWV1ZSBoZXJlLiBvbmx5IDIuNiBhYm92ZSBrZXJuZWwgaXMgY29uc2lkZXJlZAorI2RlZmluZSBEUlZfTkFNRSAid2xhbjAiCitzdGF0aWMgdm9pZCBydGw4MTkyX2luaXRfcHJpdl90YXNrKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisjaWZkZWYgUEZfU1lOQ1RIUkVBRAorCXByaXYtPnByaXZfd3EgPSBjcmVhdGVfd29ya3F1ZXVlKERSVl9OQU1FLDApOworI2Vsc2UKKwlwcml2LT5wcml2X3dxID0gY3JlYXRlX3dvcmtxdWV1ZShEUlZfTkFNRSk7CisjZW5kaWYKKworCUlOSVRfV09SSygmcHJpdi0+cmVzZXRfd3EsIHJ0bDgxOTJfcmVzdGFydCk7CisKKwkvL0lOSVRfREVMQVlFRF9XT1JLKCZwcml2LT53YXRjaF9kb2dfd3EsIGhhbF9kbV93YXRjaGRvZyk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPndhdGNoX2RvZ193cSwgcnRsODE5eF93YXRjaGRvZ193cWNhbGxiYWNrKTsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+dHhwb3dlcl90cmFja2luZ193cSwgIGRtX3R4cG93ZXJfdHJhY2tpbmdjYWxsYmFjayk7CisvLwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+Z3Bpb19jaGFuZ2VfcmZfd3EsICBkbV9ncGlvX2NoYW5nZV9yZl9jYWxsYmFjayk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPnJmcGF0aF9jaGVja193cSwgIGRtX3JmX3BhdGhjaGVja193b3JraXRlbWNhbGxiYWNrKTsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+dXBkYXRlX2JlYWNvbl93cSwgcnRsODE5Ml91cGRhdGVfYmVhY29uKTsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+aW5pdGlhbGdhaW5fb3BlcmF0ZV93cSwgSW5pdGlhbEdhaW5PcGVyYXRlV29ya0l0ZW1DYWxsQmFjayk7CisJLy9JTklUX1dPUksoJnByaXYtPlN3Q2hubFdvcmtJdGVtLCAgcnRsODE5Ml9Td0NobmxfV29ya0l0ZW0pOworCS8vSU5JVF9XT1JLKCZwcml2LT5TZXRCV01vZGVXb3JrSXRlbSwgIHJ0bDgxOTJfU2V0QldNb2RlV29ya0l0ZW0pOworCUlOSVRfV09SSygmcHJpdi0+cW9zX2FjdGl2YXRlLCBydGw4MTkyX3Fvc19hY3RpdmF0ZSk7CisKKwl0YXNrbGV0X2luaXQoJnByaXYtPmlycV9yeF90YXNrbGV0LAorCSAgICAgKHZvaWQoKikodW5zaWduZWQgbG9uZykpcnRsODE5Ml9pcnFfcnhfdGFza2xldCwKKwkgICAgICh1bnNpZ25lZCBsb25nKXByaXYpOworfQorCitzdGF0aWMgdm9pZCBydGw4MTkyX2dldF9lZXByb21fc2l6ZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXUxNiBjdXJDUiA9IDA7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCVJUX1RSQUNFKENPTVBfRVBST00sICI9PT09PT09PT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCWN1ckNSID0gcmVhZF9uaWNfd29yZF9FKGRldixFUFJPTV9DTUQpOworCVJUX1RSQUNFKENPTVBfRVBST00sICJyZWFkIGZyb20gUmVnIEVQUk9NX0NNRCgleCk6JXhcbiIsIEVQUk9NX0NNRCwgY3VyQ1IpOworCS8vd2hldGhlciBuZWVkIEkgY29uc2lkZXIgQklUNT8KKwlwcml2LT5lcHJvbXR5cGUgPSAoY3VyQ1IgJiBDbWQ5MzQ2Q1JfOTM1NlNFTCkgPyBFUFJPTV85M2M1NiA6IEVQUk9NXzkzYzQ2OworCVJUX1RSQUNFKENPTVBfRVBST00sICI8PT09PT09PT09PT0lcygpLCBlcHJvbXR5cGU6JWRcbiIsIF9fRlVOQ1RJT05fXywgcHJpdi0+ZXByb210eXBlKTsKK30KKworLy91c2VkIHRvIHN3YXAgZW5kaWFuLiBhcyBudG9obCAmIGh0b25sIGFyZSBub3QgbmVjY2Vzc2FyeSB0byBzd2FwIGVuZGlhbiwgc28gdXNlIHRoaXMgaW5zdGVhZC4KK3N0YXRpYyBpbmxpbmUgdTE2IGVuZGlhbl9zd2FwKHUxNiogZGF0YSkKK3sKKwl1MTYgdG1wID0gKmRhdGE7CisJKmRhdGEgPSAodG1wID4+IDgpIHwgKHRtcCA8PCA4KTsKKwlyZXR1cm4gKmRhdGE7Cit9CitzdGF0aWMgdm9pZCBydGw4MTkyX3JlYWRfZWVwcm9tX2luZm8oc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwl1MTYgd0VQUk9NX0lEID0gMDsKKwl1OCBiTWFjX1RtcF9BZGRyWzZdID0gezB4MDAsIDB4ZTAsIDB4NGMsIDB4MDAsIDB4MDAsIDB4MDJ9OworCXU4IGJMb2FkX0Zyb21fRUVQT00gPSBmYWxzZTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTE2IHRtcFZhbHVlID0gMDsKKwlSVF9UUkFDRShDT01QX0VQUk9NLCAiPT09PT09PT09PT0+JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwl3RVBST01fSUQgPSBlcHJvbV9yZWFkKGRldiwgMCk7IC8vZmlyc3QgcmVhZCBFRVBST00gSUQgb3V0OworCVJUX1RSQUNFKENPTVBfRVBST00sICJFRVBST00gSUQgaXMgMHgleFxuIiwgd0VQUk9NX0lEKTsKKworCWlmICh3RVBST01fSUQgIT0gUlRMODE5MF9FRVBST01fSUQpCisJeworCQlSVF9UUkFDRShDT01QX0VSUiwgIkVFUFJPTSBJRCBpcyBpbnZhbGlkKGlzIDB4JXgoc2hvdWxkIGJlIDB4JXgpXG4iLCB3RVBST01fSUQsIFJUTDgxOTBfRUVQUk9NX0lEKTsKKwl9CisJZWxzZQorCQliTG9hZF9Gcm9tX0VFUE9NID0gdHJ1ZTsKKworCWlmIChiTG9hZF9Gcm9tX0VFUE9NKQorCXsKKwkJdG1wVmFsdWUgPSBlcHJvbV9yZWFkKGRldiwgKEVFUFJPTV9WSUQ+PjEpKTsKKwkJcHJpdi0+ZWVwcm9tX3ZpZCA9IGVuZGlhbl9zd2FwKCZ0bXBWYWx1ZSk7CisJCXByaXYtPmVlcHJvbV9waWQgPSBlcHJvbV9yZWFkKGRldiwgKEVFUFJPTV9QSUQ+PjEpKTsKKwkJdG1wVmFsdWUgPSBlcHJvbV9yZWFkKGRldiwgKEVFUFJPTV9DaGFubmVsUGxhbj4+MSkpOworCQlwcml2LT5lZXByb21fQ2hhbm5lbFBsYW4gPSgodG1wVmFsdWUmMHhmZjAwKT4+OCk7CisJCXByaXYtPmJ0eHBvd2VyZGF0YV9yZWFkZnJvbUVFUE9STSA9IHRydWU7CisJCXByaXYtPmVlcHJvbV9DdXN0b21lcklEID0gZXByb21fcmVhZChkZXYsIChFRVBST01fQ3VzdG9tZXJfSUQ+PjEpKSA+Pjg7CisJfQorCWVsc2UKKwl7CisJCXByaXYtPmVlcHJvbV92aWQgPSAwOworCQlwcml2LT5lZXByb21fcGlkID0gMDsKKwkJcHJpdi0+Y2FyZF84MTkyX3ZlcnNpb24gPSBWRVJTSU9OXzgxOXhVX0I7CisJCXByaXYtPmVlcHJvbV9DaGFubmVsUGxhbiA9IDA7CisJCXByaXYtPmVlcHJvbV9DdXN0b21lcklEID0gMDsKKwl9CisJUlRfVFJBQ0UoQ09NUF9FUFJPTSwgInZpZDoweCU0eCwgcGlkOjB4JTR4LCBDdXN0b21JRDoweCUyeCwgQ2hhblBsYW46MHgleFxuIiwgcHJpdi0+ZWVwcm9tX3ZpZCwgcHJpdi0+ZWVwcm9tX3BpZCwgcHJpdi0+ZWVwcm9tX0N1c3RvbWVySUQsIHByaXYtPmVlcHJvbV9DaGFubmVsUGxhbik7CisJLy9zZXQgY2hhbm5lbHBsYW4gZnJvbSBlZXByb20KKwlwcml2LT5DaGFubmVsUGxhbiA9IHByaXYtPmVlcHJvbV9DaGFubmVsUGxhbjsKKwlpZiAoYkxvYWRfRnJvbV9FRVBPTSkKKwl7CisJCWludCBpOworCQlmb3IgKGk9MDsgaTw2OyBpKz0yKQorCQl7CisJCQl1MTYgdG1wID0gMDsKKwkJCXRtcCA9IGVwcm9tX3JlYWQoZGV2LCAodTE2KSgoRUVQUk9NX05PREVfQUREUkVTU19CWVRFXzAgKyBpKT4+MSkpOworCQkJKih1MTYqKSgmZGV2LT5kZXZfYWRkcltpXSkgPSB0bXA7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGJNYWNfVG1wX0FkZHIsIDYpOworCQkvL3Nob3VsZCBJIHNldCBJRFIwIGhlcmU/CisJfQorCVJUX1RSQUNFKENPTVBfRVBST00sICJNQUMgYWRkcjoiTUFDX0ZNVCJcbiIsIE1BQ19BUkcoZGV2LT5kZXZfYWRkcikpOworCXByaXYtPnJmX3R5cGUgPSBSVEw4MTlYX0RFRkFVTFRfUkZfVFlQRTsgLy9kZWZhdWx0IDFUMlIKKwlwcml2LT5yZl9jaGlwID0gUkZfODI1NjsKKworCWlmIChwcml2LT5jYXJkXzgxOTJfdmVyc2lvbiA9PSAodTgpVkVSU0lPTl84MTl4VV9BKQorCXsKKwkJLy9yZWFkIFR4IHBvd2VyIGdhaW4gb2Zmc2V0IG9mIGxlZ2FjeSBPRkRNIHRvIEhUIHJhdGUKKwkJaWYgKGJMb2FkX0Zyb21fRUVQT00pCisJCQlwcml2LT5FRVBST01UeFBvd2VyRGlmZiA9IChlcHJvbV9yZWFkKGRldiwgKEVFUFJPTV9UeFBvd2VyRGlmZj4+MSkpJjB4ZmYwMCkgPj4gODsKKwkJZWxzZQorCQkJcHJpdi0+RUVQUk9NVHhQb3dlckRpZmYgPSBFRVBST01fRGVmYXVsdF9UeFBvd2VyOworCQlSVF9UUkFDRShDT01QX0VQUk9NLCAiVHhQb3dlckRpZmY6JWRcbiIsIHByaXYtPkVFUFJPTVR4UG93ZXJEaWZmKTsKKwkJLy9yZWFkIFRoZXJtYWxNZXRlciBmcm9tIEVFUFJPTQorCQlpZiAoYkxvYWRfRnJvbV9FRVBPTSkKKwkJCXByaXYtPkVFUFJPTVRoZXJtYWxNZXRlciA9ICh1OCkoZXByb21fcmVhZChkZXYsIChFRVBST01fVGhlcm1hbE1ldGVyPj4xKSkmMHgwMGZmKTsKKwkJZWxzZQorCQkJcHJpdi0+RUVQUk9NVGhlcm1hbE1ldGVyID0gRUVQUk9NX0RlZmF1bHRfVGhlcm1hbE1ldGVyOworCQlSVF9UUkFDRShDT01QX0VQUk9NLCAiVGhlcm1hbE1ldGVyOiVkXG4iLCBwcml2LT5FRVBST01UaGVybWFsTWV0ZXIpOworCQkvL3ZpdmksIGZvciB0eCBwb3dlciB0cmFjaworCQlwcml2LT5UU1NJXzEzZEJtID0gcHJpdi0+RUVQUk9NVGhlcm1hbE1ldGVyICoxMDA7CisJCS8vcmVhZCBhbnRlbm5hIHR4IHBvd2VyIG9mZnNldCBvZiBCL0MvRCB0byBBIGZyb20gRUVQUk9NCisJCWlmIChiTG9hZF9Gcm9tX0VFUE9NKQorCQkJcHJpdi0+RUVQUk9NUHdEaWZmID0gKGVwcm9tX3JlYWQoZGV2LCAoRUVQUk9NX1B3RGlmZj4+MSkpJjB4MGYwMCk+Pjg7CisJCWVsc2UKKwkJCXByaXYtPkVFUFJPTVB3RGlmZiA9IEVFUFJPTV9EZWZhdWx0X1B3RGlmZjsKKwkJUlRfVFJBQ0UoQ09NUF9FUFJPTSwgIlR4UHdEaWZmOiVkXG4iLCBwcml2LT5FRVBST01Qd0RpZmYpOworCQkvLyBSZWFkIENyeXN0YWxDYXAgZnJvbSBFRVBST00KKwkJaWYgKGJMb2FkX0Zyb21fRUVQT00pCisJCQlwcml2LT5FRVBST01DcnlzdGFsQ2FwID0gKGVwcm9tX3JlYWQoZGV2LCAoRUVQUk9NX0NyeXN0YWxDYXA+PjEpKSYweDBmKTsKKwkJZWxzZQorCQkJcHJpdi0+RUVQUk9NQ3J5c3RhbENhcCA9IEVFUFJPTV9EZWZhdWx0X0NyeXN0YWxDYXA7CisJCVJUX1RSQUNFKENPTVBfRVBST00sICJDcnlzdGFsQ2FwID0gJWRcbiIsIHByaXYtPkVFUFJPTUNyeXN0YWxDYXApOworCQkvL2dldCBwZXItY2hhbm5lbCBUeCBwb3dlciBsZXZlbAorCQlpZiAoYkxvYWRfRnJvbV9FRVBPTSkKKwkJCXByaXYtPkVFUFJPTV9EZWZfVmVyID0gKGVwcm9tX3JlYWQoZGV2LCAoRUVQUk9NX1R4UHdJbmRleF9WZXI+PjEpKSYweGZmMDApPj44OworCQllbHNlCisJCQlwcml2LT5FRVBST01fRGVmX1ZlciA9IDE7CisJCVJUX1RSQUNFKENPTVBfRVBST00sICJFRVBST01fREVGX1ZFUjolZFxuIiwgcHJpdi0+RUVQUk9NX0RlZl9WZXIpOworCQlpZiAocHJpdi0+RUVQUk9NX0RlZl9WZXIgPT0gMCkgLy9vbGQgZWVwcm9tIGRlZmluaXRpb24KKwkJeworCQkJaW50IGk7CisJCQlpZiAoYkxvYWRfRnJvbV9FRVBPTSkKKwkJCQlwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxDQ0sgPSAoZXByb21fcmVhZChkZXYsIChFRVBST01fVHhQd0luZGV4X0NDSz4+MSkpJjB4ZmYpID4+IDg7CisJCQllbHNlCisJCQkJcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsQ0NLID0gMHgxMDsKKwkJCVJUX1RSQUNFKENPTVBfRVBST00sICJDQ0sgVHggUG93ZXIgTGV2bDogMHglMDJ4XG4iLCBwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxDQ0spOworCQkJZm9yIChpPTA7IGk8MzsgaSsrKQorCQkJeworCQkJCWlmIChiTG9hZF9Gcm9tX0VFUE9NKQorCQkJCXsKKwkJCQkJdG1wVmFsdWUgPSBlcHJvbV9yZWFkKGRldiwgKEVFUFJPTV9UeFB3SW5kZXhfT0ZETV8yNEcraSk+PjEpOworCQkJCQlpZiAoKChFRVBST01fVHhQd0luZGV4X09GRE1fMjRHK2kpICUgMikgPT0gMCkKKwkJCQkJCXRtcFZhbHVlID0gdG1wVmFsdWUgJiAweDAwZmY7CisJCQkJCWVsc2UKKwkJCQkJCXRtcFZhbHVlID0gKHRtcFZhbHVlICYgMHhmZjAwKSA+PiA4OworCQkJCX0KKwkJCQllbHNlCisJCQkJCXRtcFZhbHVlID0gMHgxMDsKKwkJCQlwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxPRkRNMjRHW2ldID0gKHU4KSB0bXBWYWx1ZTsKKwkJCQlSVF9UUkFDRShDT01QX0VQUk9NLCAiT0ZETSAyLjRHIFR4IFBvd2VyIExldmVsLCBJbmRleCAlZCA9IDB4JTAyeFxuIiwgaSwgcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsQ0NLKTsKKwkJCX0KKwkJfS8vZW5kIGlmIEVFUFJPTV9ERUZfVkVSID09IDAKKwkJZWxzZSBpZiAocHJpdi0+RUVQUk9NX0RlZl9WZXIgPT0gMSkKKwkJeworCQkJaWYgKGJMb2FkX0Zyb21fRUVQT00pCisJCQl7CisJCQkJdG1wVmFsdWUgPSBlcHJvbV9yZWFkKGRldiwgKEVFUFJPTV9UeFB3SW5kZXhfQ0NLX1YxPj4xKSk7CisJCQkJdG1wVmFsdWUgPSAodG1wVmFsdWUgJiAweGZmMDApID4+IDg7CisJCQl9CisJCQllbHNlCisJCQkJdG1wVmFsdWUgPSAweDEwOworCQkJcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsQ0NLX1YxWzBdID0gKHU4KXRtcFZhbHVlOworCisJCQlpZiAoYkxvYWRfRnJvbV9FRVBPTSkKKwkJCQl0bXBWYWx1ZSA9IGVwcm9tX3JlYWQoZGV2LCAoRUVQUk9NX1R4UHdJbmRleF9DQ0tfVjEgKyAyKT4+MSk7CisJCQllbHNlCisJCQkJdG1wVmFsdWUgPSAweDEwMTA7CisJCQkqKCh1MTYqKSgmcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsQ0NLX1YxWzFdKSkgPSB0bXBWYWx1ZTsKKwkJCWlmIChiTG9hZF9Gcm9tX0VFUE9NKQorCQkJCXRtcFZhbHVlID0gZXByb21fcmVhZChkZXYsIChFRVBST01fVHhQd0luZGV4X09GRE1fMjRHX1YxPj4xKSk7CisJCQllbHNlCisJCQkJdG1wVmFsdWUgPSAweDEwMTA7CisJCQkqKCh1MTYqKSgmcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsT0ZETTI0R1swXSkpID0gdG1wVmFsdWU7CisJCQlpZiAoYkxvYWRfRnJvbV9FRVBPTSkKKwkJCQl0bXBWYWx1ZSA9IGVwcm9tX3JlYWQoZGV2LCAoRUVQUk9NX1R4UHdJbmRleF9PRkRNXzI0R19WMSsyKT4+MSk7CisJCQllbHNlCisJCQkJdG1wVmFsdWUgPSAweDEwOworCQkJcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsT0ZETTI0R1syXSA9ICh1OCl0bXBWYWx1ZTsKKwkJfS8vZW5kaWYgRUVQUk9NX0RlZl9WZXIgPT0gMQorCisJCS8vdXBkYXRlIEhBTCB2YXJpYWJsZXMKKwkJLy8KKwkJeworCQkJaW50IGk7CisJCQlmb3IgKGk9MDsgaTwxNDsgaSsrKQorCQkJeworCQkJCWlmIChpPD0zKQorCQkJCQlwcml2LT5UeFBvd2VyTGV2ZWxPRkRNMjRHW2ldID0gcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsT0ZETTI0R1swXTsKKwkJCQllbHNlIGlmIChpPj00ICYmIGk8PTkpCisJCQkJCXByaXYtPlR4UG93ZXJMZXZlbE9GRE0yNEdbaV0gPSBwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxPRkRNMjRHWzFdOworCQkJCWVsc2UKKwkJCQkJcHJpdi0+VHhQb3dlckxldmVsT0ZETTI0R1tpXSA9IHByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbE9GRE0yNEdbMl07CisJCQl9CisKKwkJCWZvciAoaT0wOyBpPDE0OyBpKyspCisJCQl7CisJCQkJaWYgKHByaXYtPkVFUFJPTV9EZWZfVmVyID09IDApCisJCQkJeworCQkJCQlpZiAoaTw9MykKKwkJCQkJCXByaXYtPlR4UG93ZXJMZXZlbENDS1tpXSA9IHByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbE9GRE0yNEdbMF0gKyAocHJpdi0+RUVQUk9NVHhQb3dlckxldmVsQ0NLIC0gcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsT0ZETTI0R1sxXSk7CisJCQkJCWVsc2UgaWYgKGk+PTQgJiYgaTw9OSkKKwkJCQkJCXByaXYtPlR4UG93ZXJMZXZlbENDS1tpXSA9IHByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbENDSzsKKwkJCQkJZWxzZQorCQkJCQkJcHJpdi0+VHhQb3dlckxldmVsQ0NLW2ldID0gcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsT0ZETTI0R1syXSArIChwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxDQ0sgLSBwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxPRkRNMjRHWzFdKTsKKwkJCQl9CisJCQkJZWxzZSBpZiAocHJpdi0+RUVQUk9NX0RlZl9WZXIgPT0gMSkKKwkJCQl7CisJCQkJCWlmIChpPD0zKQorCQkJCQkJcHJpdi0+VHhQb3dlckxldmVsQ0NLW2ldID0gcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsQ0NLX1YxWzBdOworCQkJCQllbHNlIGlmIChpPj00ICYmIGk8PTkpCisJCQkJCQlwcml2LT5UeFBvd2VyTGV2ZWxDQ0tbaV0gPSBwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxDQ0tfVjFbMV07CisJCQkJCWVsc2UKKwkJCQkJCXByaXYtPlR4UG93ZXJMZXZlbENDS1tpXSA9IHByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbENDS19WMVsyXTsKKwkJCQl9CisJCQl9CisJCX0vL2VuZCB1cGRhdGUgSEFMIHZhcmlhYmxlcworCQlwcml2LT5UeFBvd2VyRGlmZiA9IHByaXYtPkVFUFJPTVB3RGlmZjsKKy8vIEFudGVubmEgQiBnYWluIG9mZnNldCB0byBhbnRlbm5hIEEsIGJpdDB+MworCQlwcml2LT5BbnRlbm5hVHhQd0RpZmZbMF0gPSAocHJpdi0+RUVQUk9NVHhQb3dlckRpZmYgJiAweGYpOworCQkvLyBBbnRlbm5hIEMgZ2FpbiBvZmZzZXQgdG8gYW50ZW5uYSBBLCBiaXQ0fjcKKwkJcHJpdi0+QW50ZW5uYVR4UHdEaWZmWzFdID0gKChwcml2LT5FRVBST01UeFBvd2VyRGlmZiAmIDB4ZjApPj40KTsKKwkJLy8gQ3J5c3RhbENhcCwgYml0MTJ+MTUKKwkJcHJpdi0+Q3J5c3RhbENhcCA9IHByaXYtPkVFUFJPTUNyeXN0YWxDYXA7CisJCS8vIFRoZXJtYWxNZXRlciwgYml0MH4zIGZvciBSRklDMSwgYml0NH43IGZvciBSRklDMgorCQkvLyA5MlUgZG9lcyBub3QgZW5hYmxlIFRYIHBvd2VyIHRyYWNraW5nLgorCQlwcml2LT5UaGVybWFsTWV0ZXJbMF0gPSBwcml2LT5FRVBST01UaGVybWFsTWV0ZXI7CisJfS8vZW5kIGlmIFZlcnNpb25JRCA9PSBWRVJTSU9OXzgxOXhVX0EKKworLy9hZGRlZCBieSB2aXZpLCBmb3IgZGxpbmsgbGVkLCAyMDA4MDQxNgorCXN3aXRjaChwcml2LT5lZXByb21fQ3VzdG9tZXJJRCkKKwl7CisJCWNhc2UgRUVQUk9NX0NJRF9SVU5UT1A6CisJCQlwcml2LT5DdXN0b21lcklEID0gUlRfQ0lEXzgxOXhfUlVOVE9QOworCQkJYnJlYWs7CisKKwkJY2FzZSBFRVBST01fQ0lEX0RMSU5LOgorCQkJcHJpdi0+Q3VzdG9tZXJJRCA9IFJUX0NJRF9ETElOSzsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcml2LT5DdXN0b21lcklEID0gUlRfQ0lEX0RFRkFVTFQ7CisJCQlicmVhazsKKworCX0KKworCXN3aXRjaChwcml2LT5DdXN0b21lcklEKQorCXsKKwkJY2FzZSBSVF9DSURfODE5eF9SVU5UT1A6CisJCQlwcml2LT5MZWRTdHJhdGVneSA9IFNXX0xFRF9NT0RFMjsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfQ0lEX0RMSU5LOgorCQkJcHJpdi0+TGVkU3RyYXRlZ3kgPSBTV19MRURfTU9ERTQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcHJpdi0+TGVkU3RyYXRlZ3kgPSBTV19MRURfTU9ERTA7CisJCQlicmVhazsKKworCX0KKworCisJaWYocHJpdi0+cmZfdHlwZSA9PSBSRl8xVDJSKQorCXsKKwkJUlRfVFJBQ0UoQ09NUF9FUFJPTSwgIlxuMVQyUiBjb25maWdcbiIpOworCX0KKwllbHNlCisJeworCQlSVF9UUkFDRShDT01QX0VQUk9NLCAiXG4yVDRSIGNvbmZpZ1xuIik7CisJfQorCisJLy8gMjAwOC8wMS8xNiBNSCBXZSBjYW4gb25seSBrbm93IFJGIHR5cGUgaW4gdGhlIGZ1bmN0aW9uLiBTbyB3ZSBoYXZlIHRvIGluaXQKKwkvLyBESUcgUkFUUiB0YWJsZSBhZ2Fpbi4KKwlpbml0X3JhdGVfYWRhcHRpdmUoZGV2KTsKKwkvL3dlIG5lZWQgaW5pdCBESUcgUkFUUiB0YWJsZSBoZXJlIGFnYWluLgorCisJUlRfVFJBQ0UoQ09NUF9FUFJPTSwgIjw9PT09PT09PT09PSVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuOworfQorCitzaG9ydCBydGw4MTkyX2dldF9jaGFubmVsX21hcChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmKHByaXYtPkNoYW5uZWxQbGFuID4gQ09VTlRSWV9DT0RFX0dMT0JBTF9ET01BSU4peworCQlwcmludGsoInJ0bDgxODBfaW5pdDpFcnJvciBjaGFubmVsIHBsYW4hIFNldCB0byBkZWZhdWx0LlxuIik7CisJCXByaXYtPkNoYW5uZWxQbGFuPSAwOworCX0KKwlSVF9UUkFDRShDT01QX0lOSVQsICJDaGFubmVsIHBsYW4gaXMgJWRcbiIscHJpdi0+Q2hhbm5lbFBsYW4pOworCisJcnRsODE5eF9zZXRfY2hhbm5lbF9tYXAocHJpdi0+Q2hhbm5lbFBsYW4sIHByaXYpOworI2Vsc2UKKwlpbnQgY2gsaTsKKwkvL1NldCBEZWZhdWx0IENoYW5uZWwgUGxhbgorCWlmKCFjaGFubmVscyl7CisJCURNRVNHKCJObyBjaGFubmVscywgYWJvcnRpbmciKTsKKwkJcmV0dXJuIC0xOworCX0KKwljaD1jaGFubmVsczsKKwlwcml2LT5DaGFubmVsUGxhbj0gMDsvL2hpa2FydQorCSAvLyBzZXQgY2hhbm5lbHMgMS4uMTQgYWxsb3dlZCBpbiBnaXZlbiBsb2NhbGUKKwlmb3IgKGk9MTsgaTw9MTQ7IGkrKykgeworCQkocHJpdi0+aWVlZTgwMjExLT5jaGFubmVsX21hcClbaV0gPSAodTgpKGNoICYgMHgwMSk7CisJCWNoID4+PSAxOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCitzaG9ydCBydGw4MTkyX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCW1lbXNldCgmKHByaXYtPnN0YXRzKSwwLHNpemVvZihzdHJ1Y3QgU3RhdHMpKTsKKwltZW1zZXQocHJpdi0+dHhxdWV1ZV90b19vdXRwaXBlbWFwLDAsOSk7CisjaWZkZWYgUElQRTEyCisJeworCQlpbnQgaT0wOworCQl1OCBxdWV1ZXRvcGlwZVtdPXszLDIsMSwwLDQsOCw3LDYsNX07CisJCW1lbWNweShwcml2LT50eHF1ZXVlX3RvX291dHBpcGVtYXAscXVldWV0b3BpcGUsOSk7CisvKgkJZm9yKGk9MDtpPDk7aSsrKQorCQkJcHJpbnRrKCIlZCAiLHByaXYtPnR4cXVldWVfdG9fb3V0cGlwZW1hcFtpXSk7CisJCXByaW50aygiXG4iKTsqLworCX0KKyNlbHNlCisJeworCQl1OCBxdWV1ZXRvcGlwZVtdPXszLDIsMSwwLDQsNCwwLDQsNH07CisJCW1lbWNweShwcml2LT50eHF1ZXVlX3RvX291dHBpcGVtYXAscXVldWV0b3BpcGUsOSk7CisvKgkJZm9yKGk9MDtpPDk7aSsrKQorCQkJcHJpbnRrKCIlZCAiLHByaXYtPnR4cXVldWVfdG9fb3V0cGlwZW1hcFtpXSk7CisJCXByaW50aygiXG4iKTsqLworCX0KKyNlbmRpZgorCXJ0bDgxOTJfaW5pdF9wcml2X3ZhcmlhYmxlKGRldik7CisJcnRsODE5Ml9pbml0X3ByaXZfbG9jayhwcml2KTsKKwlydGw4MTkyX2luaXRfcHJpdl90YXNrKGRldik7CisJcnRsODE5Ml9nZXRfZWVwcm9tX3NpemUoZGV2KTsKKwlydGw4MTkyX3JlYWRfZWVwcm9tX2luZm8oZGV2KTsKKwlydGw4MTkyX2dldF9jaGFubmVsX21hcChkZXYpOworCWluaXRfaGFsX2RtKGRldik7CisJaW5pdF90aW1lcigmcHJpdi0+d2F0Y2hfZG9nX3RpbWVyKTsKKwlwcml2LT53YXRjaF9kb2dfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwlwcml2LT53YXRjaF9kb2dfdGltZXIuZnVuY3Rpb24gPSB3YXRjaF9kb2dfdGltZXJfY2FsbGJhY2s7CisJaWYocnRsODE5Ml91c2JfaW5pdGVuZHBvaW50cyhkZXYpIT0wKXsKKwkJRE1FU0coIkVuZG9wb2ludHMgaW5pdGlhbGl6YXRpb24gZmFpbGVkIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8vcnRsODE5Ml9hZGFwdGVyX3N0YXJ0KGRldik7CisjaWZkZWYgREVCVUdfRVBST00KKwlkdW1wX2Vwcm9tKGRldik7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gYWN0dWFsbHkgb25seSBzZXQgUlJTUiwgUkFUUiBhbmQgQldfT1BNT0RFIHJlZ2lzdGVycworICoJICAgICBub3QgdG8gZG8gYWxsIHRoZSBodyBjb25maWcgYXMgaXRzIG5hbWUgc2F5cworICogICBpbnB1dDogIG5ldF9kZXZpY2UgZGV2CisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIG5vbmUKKyAqICBub3RpY2U6ICBUaGlzIHBhcnQgbmVlZCB0byBtb2RpZmllZCBhY2NvcmRpbmcgdG8gdGhlIHJhdGUgc2V0IHdlIGZpbHRlcmVkCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBydGw4MTkyX2h3Y29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJdTMyIHJlZ1JBVFIgPSAwLCByZWdSUlNSID0gMDsKKwl1OCByZWdCd09wTW9kZSA9IDAsIHJlZ1RtcCA9IDA7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisvLyBTZXQgUlJTUiwgUkFUUiwgYW5kIEJXX09QTU9ERSByZWdpc3RlcnMKKwkvLworCXN3aXRjaChwcml2LT5pZWVlODAyMTEtPm1vZGUpCisJeworCWNhc2UgV0lSRUxFU1NfTU9ERV9COgorCQlyZWdCd09wTW9kZSA9IEJXX09QTU9ERV8yME1IWjsKKwkJcmVnUkFUUiA9IFJBVEVfQUxMX0NDSzsKKwkJcmVnUlJTUiA9IFJBVEVfQUxMX0NDSzsKKwkJYnJlYWs7CisJY2FzZSBXSVJFTEVTU19NT0RFX0E6CisJCXJlZ0J3T3BNb2RlID0gQldfT1BNT0RFXzVHIHxCV19PUE1PREVfMjBNSFo7CisJCXJlZ1JBVFIgPSBSQVRFX0FMTF9PRkRNX0FHOworCQlyZWdSUlNSID0gUkFURV9BTExfT0ZETV9BRzsKKwkJYnJlYWs7CisJY2FzZSBXSVJFTEVTU19NT0RFX0c6CisJCXJlZ0J3T3BNb2RlID0gQldfT1BNT0RFXzIwTUhaOworCQlyZWdSQVRSID0gUkFURV9BTExfQ0NLIHwgUkFURV9BTExfT0ZETV9BRzsKKwkJcmVnUlJTUiA9IFJBVEVfQUxMX0NDSyB8IFJBVEVfQUxMX09GRE1fQUc7CisJCWJyZWFrOworCWNhc2UgV0lSRUxFU1NfTU9ERV9BVVRPOgorI2lmZGVmIFRPX0RPX0xJU1QKKwkJaWYgKEFkYXB0ZXItPmJJbkhjdFRlc3QpCisJCXsKKwkJICAgIHJlZ0J3T3BNb2RlID0gQldfT1BNT0RFXzIwTUhaOworCQkgICAgcmVnUkFUUiA9IFJBVEVfQUxMX0NDSyB8IFJBVEVfQUxMX09GRE1fQUc7CisJCSAgICByZWdSUlNSID0gUkFURV9BTExfQ0NLIHwgUkFURV9BTExfT0ZETV9BRzsKKwkJfQorCQllbHNlCisjZW5kaWYKKwkJeworCQkgICAgcmVnQndPcE1vZGUgPSBCV19PUE1PREVfMjBNSFo7CisJCSAgICByZWdSQVRSID0gUkFURV9BTExfQ0NLIHwgUkFURV9BTExfT0ZETV9BRyB8IFJBVEVfQUxMX09GRE1fMVNTIHwgUkFURV9BTExfT0ZETV8yU1M7CisJCSAgICByZWdSUlNSID0gUkFURV9BTExfQ0NLIHwgUkFURV9BTExfT0ZETV9BRzsKKwkJfQorCQlicmVhazsKKwljYXNlIFdJUkVMRVNTX01PREVfTl8yNEc6CisJCS8vIEl0IHN1cHBvcnQgQ0NLIHJhdGUgYnkgZGVmYXVsdC4KKwkJLy8gQ0NLIHJhdGUgd2lsbCBiZSBmaWx0ZXJlZCBvdXQgb25seSB3aGVuIGFzc29jaWF0ZWQgQVAgZG9lcyBub3Qgc3VwcG9ydCBpdC4KKwkJcmVnQndPcE1vZGUgPSBCV19PUE1PREVfMjBNSFo7CisJCQlyZWdSQVRSID0gUkFURV9BTExfQ0NLIHwgUkFURV9BTExfT0ZETV9BRyB8IFJBVEVfQUxMX09GRE1fMVNTIHwgUkFURV9BTExfT0ZETV8yU1M7CisJCQlyZWdSUlNSID0gUkFURV9BTExfQ0NLIHwgUkFURV9BTExfT0ZETV9BRzsKKwkJYnJlYWs7CisJY2FzZSBXSVJFTEVTU19NT0RFX05fNUc6CisJCXJlZ0J3T3BNb2RlID0gQldfT1BNT0RFXzVHOworCQlyZWdSQVRSID0gUkFURV9BTExfT0ZETV9BRyB8IFJBVEVfQUxMX09GRE1fMVNTIHwgUkFURV9BTExfT0ZETV8yU1M7CisJCXJlZ1JSU1IgPSBSQVRFX0FMTF9PRkRNX0FHOworCQlicmVhazsKKwl9CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIEJXX09QTU9ERSwgcmVnQndPcE1vZGUpOworCXsKKwkJdTMyIHJhdHJfdmFsdWUgPSAwOworCQlyYXRyX3ZhbHVlID0gcmVnUkFUUjsKKwkJaWYgKHByaXYtPnJmX3R5cGUgPT0gUkZfMVQyUikKKwkJeworCQkJcmF0cl92YWx1ZSAmPSB+KFJBVEVfQUxMX09GRE1fMlNTKTsKKwkJfQorCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSQVRSMCwgcmF0cl92YWx1ZSk7CisJCXdyaXRlX25pY19ieXRlKGRldiwgVUZXUCwgMSk7CisJfQorCXJlZ1RtcCA9IHJlYWRfbmljX2J5dGUoZGV2LCAweDMxMyk7CisJcmVnUlJTUiA9ICgocmVnVG1wKSA8PCAyNCkgfCAocmVnUlJTUiAmIDB4MDBmZmZmZmYpOworCXdyaXRlX25pY19kd29yZChkZXYsIFJSU1IsIHJlZ1JSU1IpOworCisJLy8KKwkvLyBTZXQgUmV0cnkgTGltaXQgaGVyZQorCS8vCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRVRSWV9MSU1JVCwKKwkJCXByaXYtPlNob3J0UmV0cnlMaW1pdCA8PCBSRVRSWV9MSU1JVF9TSE9SVF9TSElGVCB8IFwKKwkJCXByaXYtPkxvbmdSZXRyeUxpbWl0IDw8IFJFVFJZX0xJTUlUX0xPTkdfU0hJRlQpOworCS8vIFNldCBDb250ZW50aW9uIFdpbmRvdyBoZXJlCisKKwkvLyBTZXQgVHggQUdDCisKKwkvLyBTZXQgVHggQW50ZW5uYSBpbmNsdWRpbmcgRmVlZGJhY2sgY29udHJvbAorCisJLy8gU2V0IEF1dG8gUmF0ZSBmYWxsYmFjayBjb250cm9sCisKKworfQorCisKKy8vSW5pdGlhbGl6ZUFkYXB0ZXIgYW5kIFBoeUNmZworYm9vbCBydGw4MTkyX2FkYXB0ZXJfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIGR3UmVnUmVhZCA9IDA7CisJYm9vbCBpbml0X3N0YXR1cyA9IHRydWU7CisJUlRfVFJBQ0UoQ09NUF9JTklULCAiPT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCXByaXYtPlJmX01vZGUgPSBSRl9PUF9CeV9TV18zd2lyZTsKKwkvL2ZvciBBU0lDIHBvd2VyIG9uIHNlcXVlbmNlCisJd3JpdGVfbmljX2J5dGVfRShkZXYsIDB4NWYsIDB4ODApOworCW1kZWxheSg1MCk7CisJd3JpdGVfbmljX2J5dGVfRShkZXYsIDB4NWYsIDB4ZjApOworCXdyaXRlX25pY19ieXRlX0UoZGV2LCAweDVkLCAweDAwKTsKKwl3cml0ZV9uaWNfYnl0ZV9FKGRldiwgMHg1ZSwgMHg4MCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCAweDE3LCAweDM3KTsKKwltZGVsYXkoMTApOworLy8jaWZkZWYgVE9fRE9fTElTVAorCXByaXYtPnBGaXJtd2FyZS0+ZmlybXdhcmVfc3RhdHVzID0gRldfU1RBVFVTXzBfSU5JVDsKKwkvL2NvbmZpZyBDUFVSZXNldCBSZWdpc3RlcgorCS8vRmlybXdhcmUgUmVzZXQgb3Igbm90PworCWR3UmVnUmVhZCA9IHJlYWRfbmljX2R3b3JkKGRldiwgQ1BVX0dFTik7CisJaWYgKHByaXYtPnBGaXJtd2FyZS0+ZmlybXdhcmVfc3RhdHVzID09IEZXX1NUQVRVU18wX0lOSVQpCisJCWR3UmVnUmVhZCB8PSBDUFVfR0VOX1NZU1RFTV9SRVNFVDsgLy9kbyBub3RoaW5nIGhlcmU/CisJZWxzZSBpZiAocHJpdi0+cEZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPT0gRldfU1RBVFVTXzVfUkVBRFkpCisJCWR3UmVnUmVhZCB8PSBDUFVfR0VOX0ZJUk1XQVJFX1JFU0VUOworCWVsc2UKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsICJFUlJPUiBpbiAlcygpOiB1bmRlZmluZWQgZmlybXdhcmUgc3RhdGUoJWQpXG4iLCBfX0ZVTkNUSU9OX18sICAgcHJpdi0+cEZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMpOworCisJd3JpdGVfbmljX2R3b3JkKGRldiwgQ1BVX0dFTiwgZHdSZWdSZWFkKTsKKwkvL21kZWxheSgzMCk7CisJLy9jb25maWcgQkIuCisJcnRsODE5Ml9CQkNvbmZpZyhkZXYpOworCisJLy9Mb29wYmFjayBtb2RlIG9yIG5vdAorCXByaXYtPkxvb3BiYWNrTW9kZSA9IFJUTDgxOXhVX05PX0xPT1BCQUNLOworLy8JcHJpdi0+TG9vcGJhY2tNb2RlID0gUlRMODE5eFVfTUFDX0xPT1BCQUNLOworCisJZHdSZWdSZWFkID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBDUFVfR0VOKTsKKwlpZiAocHJpdi0+TG9vcGJhY2tNb2RlID09IFJUTDgxOXhVX05PX0xPT1BCQUNLKQorCQlkd1JlZ1JlYWQgPSAoKGR3UmVnUmVhZCAmIENQVV9HRU5fTk9fTE9PUEJBQ0tfTVNLKSB8IENQVV9HRU5fTk9fTE9PUEJBQ0tfU0VUKTsKKwllbHNlIGlmIChwcml2LT5Mb29wYmFja01vZGUgPT0gUlRMODE5eFVfTUFDX0xPT1BCQUNLKQorCQlkd1JlZ1JlYWQgfD0gQ1BVX0NDS19MT09QQkFDSzsKKwllbHNlCisJCVJUX1RSQUNFKENPTVBfRVJSLCAiU2VyaW91cyBlcnJvciBpbiAlcygpOiB3cm9uZyBsb29wYmFjayBtb2RlIHNldHRpbmcoJWQpXG4iLCBfX0ZVTkNUSU9OX18sICBwcml2LT5Mb29wYmFja01vZGUpOworCisJd3JpdGVfbmljX2R3b3JkKGRldiwgQ1BVX0dFTiwgZHdSZWdSZWFkKTsKKworCS8vYWZ0ZXIgcmVzZXQgY3B1LCB3ZSBuZWVkIHdhaXQgZm9yIGEgc2Vjb25kcyB0byB3cml0ZSBpbiByZWdpc3Rlci4KKwl1ZGVsYXkoNTAwKTsKKworCS8veGlvbmcgYWRkIGZvciBuZXcgYml0ZmlsZTp1c2Igc3VzcGVuZCByZXNldCBwaW4gc2V0IHRvIDEuIC8vZG8gd2UgbmVlZD8KKwl3cml0ZV9uaWNfYnl0ZV9FKGRldiwgMHg1ZiwgKHJlYWRfbmljX2J5dGVfRShkZXYsIDB4NWYpfDB4MjApKTsKKworCS8vU2V0IEhhcmR3YXJlCisJcnRsODE5Ml9od2NvbmZpZyhkZXYpOworCisJLy90dXJuIG9uIFR4L1J4CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDTURSLCBDUl9SRXxDUl9URSk7CisKKwkvL3NldCBJRFIwIGhlcmUKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBNQUMwLCAoKHUzMiopZGV2LT5kZXZfYWRkcilbMF0pOworCXdyaXRlX25pY193b3JkKGRldiwgTUFDNCwgKCh1MTYqKShkZXYtPmRldl9hZGRyICsgNCkpWzBdKTsKKworCS8vc2V0IFJDUgorCXdyaXRlX25pY19kd29yZChkZXYsIFJDUiwgcHJpdi0+UmVjZWl2ZUNvbmZpZyk7CisKKwkvL0luaXRpYWxpemUgTnVtYmVyIG9mIFJlc2VydmVkIFBhZ2VzIGluIEZpcm13YXJlIFF1ZXVlCisJd3JpdGVfbmljX2R3b3JkKGRldiwgUlFQTjEsICBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9CSyA8PCBSU1ZEX0ZXX1FVRVVFX1BBR0VfQktfU0hJRlQgfFwKKwkJCQkJCU5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0JFIDw8IFJTVkRfRldfUVVFVUVfUEFHRV9CRV9TSElGVCB8IFwKKwkJCQkJCU5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1ZJIDw8IFJTVkRfRldfUVVFVUVfUEFHRV9WSV9TSElGVCB8IFwKKwkJCQkJCU5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1ZPIDw8UlNWRF9GV19RVUVVRV9QQUdFX1ZPX1NISUZUKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSUVBOMiwgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfTUdOVCA8PCBSU1ZEX0ZXX1FVRVVFX1BBR0VfTUdOVF9TSElGVCB8XAorCQkJCQkJTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQ01EIDw8IFJTVkRfRldfUVVFVUVfUEFHRV9DTURfU0hJRlQpOworCXdyaXRlX25pY19kd29yZChkZXYsIFJRUE4zLCBBUFBMSUVEX1JFU0VSVkVEX1FVRVVFX0lOX0ZXfCBcCisJCQkJCQlOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9CQ048PFJTVkRfRldfUVVFVUVfUEFHRV9CQ05fU0hJRlQKKy8vCQkJCQkJfCBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9QVUI8PFJTVkRfRldfUVVFVUVfUEFHRV9QVUJfU0hJRlQKKwkJCQkJCSk7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgUkFUUjArNCo3LCAoUkFURV9BTExfT0ZETV9BRyB8IFJBVEVfQUxMX0NDSykpOworCisJLy9TZXQgQWNrVGltZW91dAorCS8vIFRPRE86IChpdCB2YWx1ZSBpcyBvbmx5IGZvciBGUEdBIHZlcnNpb24pLiBuZWVkIHRvIGJlIGNoYW5nZWQhITIwMDYuMTIuMTgsIGJ5IEVtaWx5CisJd3JpdGVfbmljX2J5dGUoZGV2LCBBQ0tfVElNRU9VVCwgMHgzMCk7CisKKy8vCVJUX1RSQUNFKENPTVBfSU5JVCwgIiVzKCk6cHJpdi0+UmVzZXRQcm9ncmVzcyBpcyAlZFxuIiwgX19GVU5DVElPTl9fLHByaXYtPlJlc2V0UHJvZ3Jlc3MpOworCWlmKHByaXYtPlJlc2V0UHJvZ3Jlc3MgPT0gUkVTRVRfVFlQRV9OT1JFU0VUKQorCXJ0bDgxOTJfU2V0V2lyZWxlc3NNb2RlKGRldiwgcHJpdi0+aWVlZTgwMjExLT5tb2RlKTsKKwlpZihwcml2LT5SZXNldFByb2dyZXNzID09IFJFU0VUX1RZUEVfTk9SRVNFVCl7CisJQ2FtUmVzZXRBbGxFbnRyeShkZXYpOworCXsKKwkJdTggU0VDUl92YWx1ZSA9IDB4MDsKKwkJU0VDUl92YWx1ZSB8PSBTQ1JfVHhFbmNFbmFibGU7CisJCVNFQ1JfdmFsdWUgfD0gU0NSX1J4RGVjRW5hYmxlOworCQlTRUNSX3ZhbHVlIHw9IFNDUl9Ob1NLTUM7CisJCXdyaXRlX25pY19ieXRlKGRldiwgU0VDUiwgU0VDUl92YWx1ZSk7CisJfQorCX0KKworCS8vQmVhY29uIHJlbGF0ZWQKKwl3cml0ZV9uaWNfd29yZChkZXYsIEFUSU1XTkQsIDIpOworCXdyaXRlX25pY193b3JkKGRldiwgQkNOX0lOVEVSVkFMLCAxMDApOworCisJeworI2RlZmluZSBERUZBVUxUX0VEQ0EgMHgwMDVlNDMzMgorCQlpbnQgaTsKKwkJZm9yIChpPTA7IGk8UU9TX1FVRVVFX05VTTsgaSsrKQorCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBXRENBUEFSQV9BRERbaV0sIERFRkFVTFRfRURDQSk7CisJfQorI2lmZGVmIFVTQl9SWF9BR0dSRUdBVElPTl9TVVBQT1JUCisJLy8zIEZvciB1c2IgcnggZmlybXdhcmUgYWdncmVnYXRpb24gY29udHJvbAorCWlmKHByaXYtPlJlc2V0UHJvZ3Jlc3MgPT0gUkVTRVRfVFlQRV9OT1JFU0VUKQorCXsKKwkJdTMyIHVsVmFsdWU7CisJCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IHByaXYtPmllZWU4MDIxMS0+cEhUSW5mbzsKKwkJdWxWYWx1ZSA9IChwSFRJbmZvLT5Vc2JSeEZ3QWdnckVuPDwyNCkgfCAocEhUSW5mby0+VXNiUnhGd0FnZ3JQYWdlTnVtPDwxNikgfAorCQkJCQkocEhUSW5mby0+VXNiUnhGd0FnZ3JQYWNrZXROdW08PDgpIHwgKHBIVEluZm8tPlVzYlJ4RndBZ2dyVGltZW91dCk7CisJCS8qCisJCSAqIElmIHVzYiByeCBmaXJtd2FyZSBhZ2dyZWdhdGlvbiBpcyBlbmFibGVkLAorCQkgKiB3aGVuIGFueW9uZSBvZiB0aHJlZSB0aHJlc2hvbGQgY29uZGl0aW9ucyBhYm92ZSBpcyByZWFjaGVkLAorCQkgKiBmaXJtd2FyZSB3aWxsIHNlbmQgYWdncmVnYXRlZCBwYWNrZXQgdG8gZHJpdmVyLgorCQkgKi8KKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgMHgxYTgsIHVsVmFsdWUpOworCQlwcml2LT5iQ3VycmVudFJ4QWdnckVuYWJsZSA9IHRydWU7CisJfQorI2VuZGlmCisKKwlydGw4MTkyX3BoeV9jb25maWdtYWMoZGV2KTsKKworCWlmIChwcml2LT5jYXJkXzgxOTJfdmVyc2lvbiA9PSAodTgpIFZFUlNJT05fODE5eFVfQSkKKwl7CisJCXJ0bDgxOTJfcGh5X2dldFR4UG93ZXIoZGV2KTsKKwkJcnRsODE5Ml9waHlfc2V0VHhQb3dlcihkZXYsIHByaXYtPmNoYW4pOworCX0KKworCS8vRmlybXdhcmUgZG93bmxvYWQKKwlpbml0X3N0YXR1cyA9IGluaXRfZmlybXdhcmUoZGV2KTsKKwlpZighaW5pdF9zdGF0dXMpCisJeworCQlSVF9UUkFDRShDT01QX0VSUiwiRVJSISEhICVzKCk6IEZpcm13YXJlIGRvd25sb2FkIGlzIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIGluaXRfc3RhdHVzOworCX0KKwlSVF9UUkFDRShDT01QX0lOSVQsICIlcygpOmFmdGVyIGZpcm13YXJlIGRvd25sb2FkXG4iLCBfX0ZVTkNUSU9OX18pOworCS8vCisjaWZkZWYgVE9fRE9fTElTVAoraWYoQWRhcHRlci0+UmVzZXRQcm9ncmVzcyA9PSBSRVNFVF9UWVBFX05PUkVTRVQpCisJeworCQlpZihwTWdudEluZm8tPlJlZ1JmT2ZmID09IFRSVUUpCisJCXsgLy8gVXNlciBkaXNhYmxlIFJGIHZpYSByZWdpc3RyeS4KKwkJCVJUX1RSQUNFKChDT01QX0lOSVR8Q09NUF9SRiksIERCR19MT1VELCAoIkluaXRpYWxpemVBZGFwdGVyODE5eFVzYigpOiBUdXJuIG9mZiBSRiBmb3IgUmVnUmZPZmYgLS0tLS0tLS0tLVxuIikpOworCQkJTWdudEFjdFNldF9SRl9TdGF0ZShBZGFwdGVyLCBlUmZPZmYsIFJGX0NIQU5HRV9CWV9TVyk7CisJCQkvLyBUaG9zZSBhY3Rpb24gd2lsbCBiZSBkaXNjYXJkIGluIE1nbnRBY3RTZXRfUkZfU3RhdGUgYmVjYXVzZSBvZmYgdGhlIHNhbWUgc3RhdGUKKwkJCWZvcihlUkZQYXRoID0gMDsgZVJGUGF0aCA8cEhhbERhdGEtPk51bVRvdGFsUkZQYXRoOyBlUkZQYXRoKyspCisJCQkJUEhZX1NldFJGUmVnKEFkYXB0ZXIsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCAweDQsIDB4QzAwLCAweDApOworCQl9CisJCWVsc2UgaWYocE1nbnRJbmZvLT5SZk9mZlJlYXNvbiA+IFJGX0NIQU5HRV9CWV9QUykKKwkJeyAvLyBIL1cgb3IgUy9XIFJGIE9GRiBiZWZvcmUgc2xlZXAuCisJCQlSVF9UUkFDRSgoQ09NUF9JTklUfENPTVBfUkYpLCBEQkdfTE9VRCwgKCJJbml0aWFsaXplQWRhcHRlcjgxOXhVc2IoKTogVHVybiBvZmYgUkYgZm9yIFJmT2ZmUmVhc29uKCVkKSAtLS0tLS0tLS0tXG4iLCBwTWdudEluZm8tPlJmT2ZmUmVhc29uKSk7CisJCQlNZ250QWN0U2V0X1JGX1N0YXRlKEFkYXB0ZXIsIGVSZk9mZiwgcE1nbnRJbmZvLT5SZk9mZlJlYXNvbik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwSGFsRGF0YS0+ZVJGUG93ZXJTdGF0ZSA9IGVSZk9uOworCQkJcE1nbnRJbmZvLT5SZk9mZlJlYXNvbiA9IDA7CisJCQlSVF9UUkFDRSgoQ09NUF9JTklUfENPTVBfUkYpLCBEQkdfTE9VRCwgKCJJbml0aWFsaXplQWRhcHRlcjgxOXhVc2IoKTogUkYgaXMgb24gLS0tLS0tLS0tLVxuIikpOworCQl9CisJfQorCWVsc2UKKwl7CisJCWlmKHBIYWxEYXRhLT5lUkZQb3dlclN0YXRlID09IGVSZk9mZikKKwkJeworCQkJTWdudEFjdFNldF9SRl9TdGF0ZShBZGFwdGVyLCBlUmZPZmYsIHBNZ250SW5mby0+UmZPZmZSZWFzb24pOworCQkJLy8gVGhvc2UgYWN0aW9uIHdpbGwgYmUgZGlzY2FyZCBpbiBNZ250QWN0U2V0X1JGX1N0YXRlIGJlY2F1c2Ugb2ZmIHRoZSBzYW1lIHN0YXRlCisJCQlmb3IoZVJGUGF0aCA9IDA7IGVSRlBhdGggPHBIYWxEYXRhLT5OdW1Ub3RhbFJGUGF0aDsgZVJGUGF0aCsrKQorCQkJCVBIWV9TZXRSRlJlZyhBZGFwdGVyLCAoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCwgMHg0LCAweEMwMCwgMHgwKTsKKwkJfQorCX0KKyNlbmRpZgorCS8vY29uZmlnIFJGLgorCWlmKHByaXYtPlJlc2V0UHJvZ3Jlc3MgPT0gUkVTRVRfVFlQRV9OT1JFU0VUKXsKKwlydGw4MTkyX3BoeV9SRkNvbmZpZyhkZXYpOworCVJUX1RSQUNFKENPTVBfSU5JVCwgIiVzKCk6YWZ0ZXIgcGh5IFJGIGNvbmZpZ1xuIiwgX19GVU5DVElPTl9fKTsKKwl9CisKKworCWlmKHByaXYtPmllZWU4MDIxMS0+RndSV1JGKQorCQkvLyBXZSBjYW4gZm9yY2UgZmlybXdhcmUgdG8gZG8gUkYtUi9XCisJCXByaXYtPlJmX01vZGUgPSBSRl9PUF9CeV9GVzsKKwllbHNlCisJCXByaXYtPlJmX01vZGUgPSBSRl9PUF9CeV9TV18zd2lyZTsKKworCisJcnRsODE5Ml9waHlfdXBkYXRlSW5pdEdhaW4oZGV2KTsKKwkvKi0tc2V0IENDSyBhbmQgT0ZETSBCbG9jayAiT04iLS0qLworCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfUkZNT0QsIGJDQ0tFbiwgMHgxKTsKKwlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0EwX1JGTU9ELCBiT0ZETUVuLCAweDEpOworCisJaWYocHJpdi0+UmVzZXRQcm9ncmVzcyA9PSBSRVNFVF9UWVBFX05PUkVTRVQpCisJeworCQkvL2lmIEQgb3IgQyBjdXQKKwkJdTggdG1wdmFsdWUgPSByZWFkX25pY19ieXRlKGRldiwgMHgzMDEpOworCQlpZih0bXB2YWx1ZSA9PTB4MDMpCisJCXsKKwkJCXByaXYtPmJEY3V0ID0gVFJVRTsKKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJELWN1dFxuIik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwcml2LT5iRGN1dCA9IEZBTFNFOworCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIkMtY3V0XG4iKTsKKwkJfQorCQlkbV9pbml0aWFsaXplX3R4cG93ZXJfdHJhY2tpbmcoZGV2KTsKKworCQlpZihwcml2LT5iRGN1dCA9PSBUUlVFKQorCQl7CisJCQl1MzIgaSwgVGVtcENDazsKKwkJCXUzMiB0bXBSZWdBPSBydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsYk1hc2tEV29yZCk7CisJCS8vCXUzMiB0bXBSZWdDPSBydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LHJPRkRNMF9YQ1R4SVFJbWJhbGFuY2UsYk1hc2tEV29yZCk7CisJCQlmb3IoaSA9IDA7IGk8VHhCQkdhaW5UYWJsZUxlbmd0aDsgaSsrKQorCQkJeworCQkJCWlmKHRtcFJlZ0EgPT0gcHJpdi0+dHhiYmdhaW5fdGFibGVbaV0udHhiYmdhaW5fdmFsdWUpCisJCQkJeworCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXg9ICh1OClpOworCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbD0gKHU4KWk7CisJCQkJCXByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdfZGVmYXVsdD0gcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4OworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCVRlbXBDQ2sgPSBydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCByQ0NLMF9UeEZpbHRlcjEsIGJNYXNrQnl0ZTIpOworCisJCQlmb3IoaT0wIDsgaTxDQ0tUeEJCR2FpblRhYmxlTGVuZ3RoIDsgaSsrKQorCQkJeworCisJCQkJaWYoVGVtcENDayA9PSBwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbaV0uY2NrdHhiYl92YWx1ZWFycmF5WzBdKQorCQkJCXsKKwkJCQkJcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uXzIwTWRlZmF1bHQ9KHU4KSBpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25fNDBNZGVmYXVsdD0gMDsKKwkJCXByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl9kaWZmZXJlbmNlPSAwOworCQkJcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uID0gcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uXzIwTWRlZmF1bHQ7CisKKwkvLwkJcE1nbnRJbmZvLT5iVFhQb3dlclRyYWNraW5nID0gRkFMU0U7Ly9URU1QTFkgRElTQUJMRQorCQl9CisJfQorCXdyaXRlX25pY19ieXRlKGRldiwgMHg4NywgMHgwKTsKKworCisJcmV0dXJuIGluaXRfc3RhdHVzOworfQorCisvKiB0aGlzIGNvbmZpZ3VyZXMgcmVnaXN0ZXJzIGZvciBiZWFjb24gdHggYW5kIGVuYWJsZXMgaXQgdmlhCisgKiBydGw4MTkyX2JlYWNvbl90eF9lbmFibGUoKS4gcnRsODE5Ml9iZWFjb25fdHhfZGlzYWJsZSgpIG1pZ2h0CisgKiBiZSB1c2VkIHRvIHN0b3AgYmVhY29uIHRyYW5zbWlzc2lvbgorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLU5FVCBTVFVGRi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnJ0bDgxOTJfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlyZXR1cm4gJnByaXYtPmllZWU4MDIxMS0+c3RhdHM7Cit9CisKK2Jvb2wKK0hhbFR4Q2hlY2tTdHVjazgxOXhVc2IoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldgorCSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTE2IAkJUmVnVHhDb3VudGVyID0gcmVhZF9uaWNfd29yZChkZXYsIDB4MTI4KTsKKwlib29sCQliU3R1Y2sgPSBGQUxTRTsKKwlSVF9UUkFDRShDT01QX1JFU0VULCIlcygpOlJlZ1R4Q291bnRlciBpcyAlZCxUeENvdW50ZXIgaXMgJWRcbiIsX19GVU5DVElPTl9fLFJlZ1R4Q291bnRlcixwcml2LT5UeENvdW50ZXIpOworCWlmKHByaXYtPlR4Q291bnRlcj09UmVnVHhDb3VudGVyKQorCQliU3R1Y2sgPSBUUlVFOworCisJcHJpdi0+VHhDb3VudGVyID0gUmVnVHhDb3VudGVyOworCisJcmV0dXJuIGJTdHVjazsKK30KKworLyoKKyoJPEFzc3VtcHRpb246IFJUX1RYX1NQSU5MT0NLIGlzIGFjcXVpcmVkLj4KKyoJRmlyc3QgYWRkZWQ6IDIwMDYuMTEuMTkgYnkgZW1pbHkKKyovCitSRVNFVF9UWVBFCitUeENoZWNrU3R1Y2soc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTgJCQlRdWV1ZUlEOworLy8JUFJUX1RDQgkJCXBUY2I7CisvLwl1OAkJCVJlc2V0VGhyZXNob2xkOworCWJvb2wJCQliQ2hlY2tGd1R4Q250ID0gZmFsc2U7CisJLy91bnNpZ25lZCBsb25nIGZsYWdzOworCisJLy8KKwkvLyBEZWNpZGUgU3R1Y2ggdGhyZXNob2xkIGFjY29yZGluZyB0byBjdXJyZW50IHBvd2VyIHNhdmUgbW9kZQorCS8vCisKKy8vICAgICBSVF9UUkFDRShDT01QX1JFU0VULCAiID09PiBUeENoZWNrU3R1Y2soKVxuIik7CisvLwkgICAgIFBsYXRmb3JtQWNxdWlyZVNwaW5Mb2NrKEFkYXB0ZXIsIFJUX1RYX1NQSU5MT0NLKTsKKy8vCSAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmllZWU4MDIxMS0+bG9jayxmbGFncyk7CisJICAgICBmb3IgKFF1ZXVlSUQgPSAwOyBRdWV1ZUlEPD1CRUFDT05fUVVFVUU7UXVldWVJRCArKykKKwkgICAgIHsKKwkgICAgIAkJaWYoUXVldWVJRCA9PSBUWENNRF9RVUVVRSkKKwkJICAgICAgICAgY29udGludWU7CisjaWZkZWYgVVNCX1RYX0RSSVZFUl9BR0dSRUdBVElPTl9FTkFCTEUKKwkJCWlmKChza2JfcXVldWVfbGVuKCZwcml2LT5pZWVlODAyMTEtPnNrYl93YWl0UVtRdWV1ZUlEXSkgPT0gMCkgJiYgKHNrYl9xdWV1ZV9sZW4oJnByaXYtPmllZWU4MDIxMS0+c2tiX2FnZ1FbUXVldWVJRF0pID09IDApICYmIChza2JfcXVldWVfbGVuKCZwcml2LT5pZWVlODAyMTEtPnNrYl9kcnZfYWdnUVtRdWV1ZUlEXSkgPT0gMCkpCisjZWxzZQorCQkgICAgIAlpZigoc2tiX3F1ZXVlX2xlbigmcHJpdi0+aWVlZTgwMjExLT5za2Jfd2FpdFFbUXVldWVJRF0pID09IDApICAmJiAoc2tiX3F1ZXVlX2xlbigmcHJpdi0+aWVlZTgwMjExLT5za2JfYWdnUVtRdWV1ZUlEXSkgPT0gMCkpCisjZW5kaWYKKwkJCSAJY29udGludWU7CisKKwkgICAgICAgICAgICAgYkNoZWNrRndUeENudCA9IHRydWU7CisJICAgICB9CisvLwkgICAgIFBsYXRmb3JtUmVsZWFzZVNwaW5Mb2NrKEFkYXB0ZXIsIFJUX1RYX1NQSU5MT0NLKTsKKy8vCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmllZWU4MDIxMS0+bG9jayxmbGFncyk7CisvLwlSVF9UUkFDRShDT01QX1JFU0VULCJiQ2hlY2tGd1R4Q250IGlzICVkXG4iLGJDaGVja0Z3VHhDbnQpOworCWlmKGJDaGVja0Z3VHhDbnQpCisJeworCQlpZihIYWxUeENoZWNrU3R1Y2s4MTl4VXNiKGRldikpCisJCXsKKwkJCVJUX1RSQUNFKENPTVBfUkVTRVQsICJUeENoZWNrU3R1Y2soKTogRncgaW5kaWNhdGVzIG5vIFR4IGNvbmRpdGlvbiEgXG4iKTsKKwkJCXJldHVybiBSRVNFVF9UWVBFX1NJTEVOVDsKKwkJfQorCX0KKwlyZXR1cm4gUkVTRVRfVFlQRV9OT1JFU0VUOworfQorCitib29sCitIYWxSeENoZWNrU3R1Y2s4MTl4VXNiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTE2IAlSZWdSeENvdW50ZXIgPSByZWFkX25pY193b3JkKGRldiwgMHgxMzApOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlib29sIGJTdHVjayA9IEZBTFNFOworCXN0YXRpYyB1OAlyeF9jaGtfY250ID0gMDsKKwlSVF9UUkFDRShDT01QX1JFU0VULCIlcygpOiBSZWdSeENvdW50ZXIgaXMgJWQsUnhDb3VudGVyIGlzICVkXG4iLF9fRlVOQ1RJT05fXyxSZWdSeENvdW50ZXIscHJpdi0+UnhDb3VudGVyKTsKKwkvLyBJZiByc3NpIGlzIHNtYWxsLCB3ZSBzaG91bGQgY2hlY2sgcnggZm9yIGxvbmcgdGltZSBiZWNhdXNlIG9mIGJhZCByeC4KKwkvLyBvciBtYXliZSBpdCB3aWxsIGNvbnRpbnVvdXMgc2lsZW50IHJlc2V0IGV2ZXJ5IDIgc2Vjb25kcy4KKwlyeF9jaGtfY250Kys7CisJaWYocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+PSAoUmF0ZUFkYXB0aXZlVEhfSGlnaCs1KSkKKwl7CisJCXJ4X2Noa19jbnQgPSAwOwkvL2hpZ2ggcnNzaSwgY2hlY2sgcnggc3R1Y2sgcmlnaHQgbm93LgorCX0KKwllbHNlIGlmKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPCAoUmF0ZUFkYXB0aXZlVEhfSGlnaCs1KSAmJgorCQkoKHByaXYtPkN1cnJlbnRDaGFubmVsQlchPUhUX0NIQU5ORUxfV0lEVEhfMjAmJnByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGI+PVJhdGVBZGFwdGl2ZVRIX0xvd180ME0pIHx8CisJCShwcml2LT5DdXJyZW50Q2hhbm5lbEJXPT1IVF9DSEFOTkVMX1dJRFRIXzIwJiZwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiPj1SYXRlQWRhcHRpdmVUSF9Mb3dfMjBNKSkgKQorCXsKKwkJaWYocnhfY2hrX2NudCA8IDIpCisJCXsKKwkJCXJldHVybiBiU3R1Y2s7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyeF9jaGtfY250ID0gMDsKKwkJfQorCX0KKwllbHNlIGlmKCgocHJpdi0+Q3VycmVudENoYW5uZWxCVyE9SFRfQ0hBTk5FTF9XSURUSF8yMCYmcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYjxSYXRlQWRhcHRpdmVUSF9Mb3dfNDBNKSB8fAorCQkocHJpdi0+Q3VycmVudENoYW5uZWxCVz09SFRfQ0hBTk5FTF9XSURUSF8yMCYmcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYjxSYXRlQWRhcHRpdmVUSF9Mb3dfMjBNKSkgJiYKKwkJcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+PSBWZXJ5TG93UlNTSSkKKwl7CisJCWlmKHJ4X2Noa19jbnQgPCA0KQorCQl7CisJCQkvL0RiZ1ByaW50KCJSU1NJIDwgJWQgJiYgUlNTSSA+PSAlZCwgbm8gY2hlY2sgdGhpcyB0aW1lIFxuIiwgUmF0ZUFkYXB0aXZlVEhfTG93LCBWZXJ5TG93UlNTSSk7CisJCQlyZXR1cm4gYlN0dWNrOworCQl9CisJCWVsc2UKKwkJeworCQkJcnhfY2hrX2NudCA9IDA7CisJCQkvL0RiZ1ByaW50KCJSU1NJIDwgJWQgJiYgUlNTSSA+PSAlZCwgY2hlY2sgdGhpcyB0aW1lIFxuIiwgUmF0ZUFkYXB0aXZlVEhfTG93LCBWZXJ5TG93UlNTSSk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYocnhfY2hrX2NudCA8IDgpCisJCXsKKwkJCS8vRGJnUHJpbnQoIlJTU0kgPD0gJWQsIG5vIGNoZWNrIHRoaXMgdGltZSBcbiIsIFZlcnlMb3dSU1NJKTsKKwkJCXJldHVybiBiU3R1Y2s7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyeF9jaGtfY250ID0gMDsKKwkJCS8vRGJnUHJpbnQoIlJTU0kgPD0gJWQsIGNoZWNrIHRoaXMgdGltZSBcbiIsIFZlcnlMb3dSU1NJKTsKKwkJfQorCX0KKworCWlmKHByaXYtPlJ4Q291bnRlcj09UmVnUnhDb3VudGVyKQorCQliU3R1Y2sgPSBUUlVFOworCisJcHJpdi0+UnhDb3VudGVyID0gUmVnUnhDb3VudGVyOworCisJcmV0dXJuIGJTdHVjazsKK30KKworUkVTRVRfVFlQRQorUnhDaGVja1N0dWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8vaW50ICAgICAgICAgICAgICAgICAgICAgaTsKKwlib29sICAgICAgICBiUnhDaGVjayA9IEZBTFNFOworCisvLyAgICAgICBSVF9UUkFDRShDT01QX1JFU0VULCIgPT0+IFJ4Q2hlY2tTdHVjaygpXG4iKTsKKwkvL1BsYXRmb3JtQWNxdWlyZVNwaW5Mb2NrKEFkYXB0ZXIsIFJUX1JYX1NQSU5MT0NLKTsKKworCSBpZihwcml2LT5JcnBQZW5kaW5nQ291bnQgPiAxKQorCQliUnhDaGVjayA9IFRSVUU7CisgICAgICAgLy9QbGF0Zm9ybVJlbGVhc2VTcGluTG9jayhBZGFwdGVyLCBSVF9SWF9TUElOTE9DSyk7CisKKy8vICAgICAgIFJUX1RSQUNFKENPTVBfUkVTRVQsImJSeENoZWNrIGlzICVkIFxuIixiUnhDaGVjayk7CisJaWYoYlJ4Q2hlY2spCisJeworCQlpZihIYWxSeENoZWNrU3R1Y2s4MTl4VXNiKGRldikpCisJCXsKKwkJCVJUX1RSQUNFKENPTVBfUkVTRVQsICJSeFN0dWNrIENvbmRpdGlvblxuIik7CisJCQlyZXR1cm4gUkVTRVRfVFlQRV9TSUxFTlQ7CisJCX0KKwl9CisJcmV0dXJuIFJFU0VUX1RZUEVfTk9SRVNFVDsKK30KKworCisvKioKKyoJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgQ2hlY2tmb3JoYW5nIHRvIGNoZWNrIHdoZXRoZXIgd2Ugc2hvdWxkIGFzayBPUyB0byByZXNldCBkcml2ZXIKKyoKKyoJXHBhcmFtIHBBZGFwdGVyCVRoZSBhZGFwdGVyIGNvbnRleHQgZm9yIHRoaXMgbWluaXBvcnQKKyoKKyoJTm90ZTpOSUMgd2l0aCBVU0IgaW50ZXJmYWNlIHNob2x1ZCBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGJlY2F1c2Ugd2UgY2Fubm90IHNjYW4gZGVzY3JpcHRvcgorKgl0byBqdWRnZSB3aGV0aGVyIHRoZXJlIGlzIHR4IHN0dWNrLgorKglOb3RlOiBUaGlzIGZ1bmN0aW9uIG1heSBiZSByZXF1aXJlZCB0byBiZSByZXdyaXRlIGZvciBWaXN0YSBPUy4KKyoJPDw8QXNzdW1wdGlvbjogVHggc3BpbmxvY2sgaGFzIGJlZW4gYWNxdWlyZWQgPj4+CisqCisqCTgxODUgYW5kIDgxODViIGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLiBUaGlzIGlzIGFkZGVkIGJ5IEVtaWx5IGF0IDIwMDYuMTEuMjQKKyovCitSRVNFVF9UWVBFCitydGw4MTl4X2lmY2hlY2tfcmVzZXRvcm5vdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlSRVNFVF9UWVBFCVR4UmVzZXRUeXBlID0gUkVTRVRfVFlQRV9OT1JFU0VUOworCVJFU0VUX1RZUEUJUnhSZXNldFR5cGUgPSBSRVNFVF9UWVBFX05PUkVTRVQ7CisJUlRfUkZfUE9XRVJfU1RBVEUgCXJmU3RhdGU7CisKKwlyZlN0YXRlID0gcHJpdi0+aWVlZTgwMjExLT5lUkZQb3dlclN0YXRlOworCisJVHhSZXNldFR5cGUgPSBUeENoZWNrU3R1Y2soZGV2KTsKKwlpZiggcmZTdGF0ZSAhPSBlUmZPZmYgfHwKKwkJLypBREFQVEVSX1RFU1RfU1RBVFVTX0ZMQUcoQWRhcHRlciwgQURBUFRFUl9TVEFUVVNfRldfRE9XTkxPQURfRkFJTFVSRSkpICYmKi8KKwkJKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSAhPSBJV19NT0RFX0FESE9DKSkKKwl7CisJCS8vIElmIGRyaXZlciBpcyBpbiB0aGUgc3RhdHVzIG9mIGZpcm13YXJlIGRvd25sb2FkIGZhaWx1cmUgLCBkcml2ZXIgc2tpcHMgUkYgaW5pdGlhbGl6YXRpb24gYW5kIFJGIGlzCisJCS8vIGluIHR1cm5lZCBvZmYgc3RhdGUuIERyaXZlciBzaG91bGQgY2hlY2sgd2hldGhlciBSeCBzdHVjayBhbmQgZG8gc2lsZW50IHJlc2V0LiBBbmQKKwkJLy8gaWYgZHJpdmVyIGlzIGluIGZpcm13YXJlIGRvd25sb2FkIGZhaWx1cmUgc3RhdHVzLCBkcml2ZXIgc2hvdWxkIGluaXRpYWxpemUgUkYgaW4gdGhlIGZvbGxvd2luZworCQkvLyBzaWxlbnQgcmVzZXQgcHJvY2VkdXJlIEVtaWx5LCAyMDA4LjAxLjIxCisKKwkJLy8gRHJpdmVyIHNob3VsZCBub3QgY2hlY2sgUlggc3R1Y2sgaW4gSUJTUyBtb2RlIGJlY2F1c2UgaXQgaXMgcmVxdWlyZWQgdG8KKwkJLy8gc2V0IENoZWNrIEJTU0lEIGluIG9yZGVyIHRvIHNlbmQgYmVhY29uLCBob3dldmVyLCBpZiBjaGVjayBCU1NJRCBpcworCQkvLyBzZXQsIFNUQSBjYW5ub3QgaGVhciBhbnkgcGFja2V0IGEgYWxsLiBFbWlseSwgMjAwOC4wNC4xMgorCQlSeFJlc2V0VHlwZSA9IFJ4Q2hlY2tTdHVjayhkZXYpOworCX0KKwlpZihUeFJlc2V0VHlwZT09UkVTRVRfVFlQRV9OT1JNQUwgfHwgUnhSZXNldFR5cGU9PVJFU0VUX1RZUEVfTk9STUFMKQorCQlyZXR1cm4gUkVTRVRfVFlQRV9OT1JNQUw7CisJZWxzZSBpZihUeFJlc2V0VHlwZT09UkVTRVRfVFlQRV9TSUxFTlQgfHwgUnhSZXNldFR5cGU9PVJFU0VUX1RZUEVfU0lMRU5UKXsKKwkJUlRfVFJBQ0UoQ09NUF9SRVNFVCwiJXMoKTpzaWxlbnQgcmVzZXRcbiIsX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIFJFU0VUX1RZUEVfU0lMRU5UOworCX0KKwllbHNlCisJCXJldHVybiBSRVNFVF9UWVBFX05PUkVTRVQ7CisKK30KKwordm9pZCBydGw4MTkyX2NhbmNlbF9kZWZlcnJlZF93b3JrKHN0cnVjdCByODE5Ml9wcml2KiBwcml2KTsKK2ludCBfcnRsODE5Ml91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCBydGw4MTkyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisKKwordm9pZAorQ2FtUmVzdG9yZUFsbEVudHJ5KAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXU4IEVudHJ5SWQgPSAwOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OCoJTWFjQWRkciA9IHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkOworCisJc3RhdGljIHU4CUNBTV9DT05TVF9BRERSWzRdWzZdID0geworCQl7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCisJCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxfSwKKwkJezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDJ9LAorCQl7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwM319OworCXN0YXRpYyB1OAlDQU1fQ09OU1RfQlJPQURbXSA9CisJCXsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKKworCVJUX1RSQUNFKENPTVBfU0VDLCAiQ2FtUmVzdG9yZUFsbEVudHJ5OiBcbiIpOworCisKKwlpZiAoKHByaXYtPmllZWU4MDIxMS0+cGFpcndpc2Vfa2V5X3R5cGUgPT0gS0VZX1RZUEVfV0VQNDApfHwKKwkgICAgKHByaXYtPmllZWU4MDIxMS0+cGFpcndpc2Vfa2V5X3R5cGUgPT0gS0VZX1RZUEVfV0VQMTA0KSkKKwl7CisKKwkJZm9yKEVudHJ5SWQ9MDsgRW50cnlJZDw0OyBFbnRyeUlkKyspCisJCXsKKwkJCXsKKwkJCQlNYWNBZGRyID0gQ0FNX0NPTlNUX0FERFJbRW50cnlJZF07CisJCQkJc2V0S2V5KGRldiwKKwkJCQkJCUVudHJ5SWQgLAorCQkJCQkJRW50cnlJZCwKKwkJCQkJCXByaXYtPmllZWU4MDIxMS0+cGFpcndpc2Vfa2V5X3R5cGUsCisJCQkJCQlNYWNBZGRyLAorCQkJCQkJMCwKKwkJCQkJCU5VTEwpOworCQkJfQorCQl9CisKKwl9CisJZWxzZSBpZihwcml2LT5pZWVlODAyMTEtPnBhaXJ3aXNlX2tleV90eXBlID09IEtFWV9UWVBFX1RLSVApCisJeworCisJCXsKKwkJCWlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQorCQkJCXNldEtleShkZXYsCisJCQkJCQk0LAorCQkJCQkJMCwKKwkJCQkJCXByaXYtPmllZWU4MDIxMS0+cGFpcndpc2Vfa2V5X3R5cGUsCisJCQkJCQkodTgqKWRldi0+ZGV2X2FkZHIsCisJCQkJCQkwLAorCQkJCQkJTlVMTCk7CisJCQllbHNlCisJCQkJc2V0S2V5KGRldiwKKwkJCQkJCTQsCisJCQkJCQkwLAorCQkJCQkJcHJpdi0+aWVlZTgwMjExLT5wYWlyd2lzZV9rZXlfdHlwZSwKKwkJCQkJCU1hY0FkZHIsCisJCQkJCQkwLAorCQkJCQkJTlVMTCk7CisJCX0KKwl9CisJZWxzZSBpZihwcml2LT5pZWVlODAyMTEtPnBhaXJ3aXNlX2tleV90eXBlID09IEtFWV9UWVBFX0NDTVApCisJeworCisJCXsKKwkJCWlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQorCQkJCXNldEtleShkZXYsCisJCQkJCQk0LAorCQkJCQkJMCwKKwkJCQkJCXByaXYtPmllZWU4MDIxMS0+cGFpcndpc2Vfa2V5X3R5cGUsCisJCQkJCQkodTgqKWRldi0+ZGV2X2FkZHIsCisJCQkJCQkwLAorCQkJCQkJTlVMTCk7CisJCQllbHNlCisJCQkJc2V0S2V5KGRldiwKKwkJCQkJCTQsCisJCQkJCQkwLAorCQkJCQkJcHJpdi0+aWVlZTgwMjExLT5wYWlyd2lzZV9rZXlfdHlwZSwKKwkJCQkJCU1hY0FkZHIsCisJCQkJCQkwLAorCQkJCQkJTlVMTCk7CisJCX0KKwl9CisKKworCisJaWYocHJpdi0+aWVlZTgwMjExLT5ncm91cF9rZXlfdHlwZSA9PSBLRVlfVFlQRV9US0lQKQorCXsKKwkJTWFjQWRkciA9IENBTV9DT05TVF9CUk9BRDsKKwkJZm9yKEVudHJ5SWQ9MSA7IEVudHJ5SWQ8NCA7IEVudHJ5SWQrKykKKwkJeworCQkJeworCQkJCXNldEtleShkZXYsCisJCQkJCQlFbnRyeUlkLAorCQkJCQkJRW50cnlJZCwKKwkJCQkJCXByaXYtPmllZWU4MDIxMS0+Z3JvdXBfa2V5X3R5cGUsCisJCQkJCQlNYWNBZGRyLAorCQkJCQkJMCwKKwkJCQkJCU5VTEwpOworCQkJfQorCQl9CisJCWlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQorCQkJCXNldEtleShkZXYsCisJCQkJCQkwLAorCQkJCQkJMCwKKwkJCQkJCXByaXYtPmllZWU4MDIxMS0+Z3JvdXBfa2V5X3R5cGUsCisJCQkJCQlDQU1fQ09OU1RfQUREUlswXSwKKwkJCQkJCTAsCisJCQkJCQlOVUxMKTsKKwl9CisJZWxzZSBpZihwcml2LT5pZWVlODAyMTEtPmdyb3VwX2tleV90eXBlID09IEtFWV9UWVBFX0NDTVApCisJeworCQlNYWNBZGRyID0gQ0FNX0NPTlNUX0JST0FEOworCQlmb3IoRW50cnlJZD0xOyBFbnRyeUlkPDQgOyBFbnRyeUlkKyspCisJCXsKKwkJCXsKKwkJCQlzZXRLZXkoZGV2LAorCQkJCQkJRW50cnlJZCAsCisJCQkJCQlFbnRyeUlkLAorCQkJCQkJcHJpdi0+aWVlZTgwMjExLT5ncm91cF9rZXlfdHlwZSwKKwkJCQkJCU1hY0FkZHIsCisJCQkJCQkwLAorCQkJCQkJTlVMTCk7CisJCQl9CisJCX0KKworCQlpZihwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykKKwkJCQlzZXRLZXkoZGV2LAorCQkJCQkJMCAsCisJCQkJCQkwLAorCQkJCQkJcHJpdi0+aWVlZTgwMjExLT5ncm91cF9rZXlfdHlwZSwKKwkJCQkJCUNBTV9DT05TVF9BRERSWzBdLAorCQkJCQkJMCwKKwkJCQkJCU5VTEwpOworCX0KK30KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZml4IFR4L1J4IHN0b3AgYnVnIHRlbXBvcmFyaWx5LgorLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGRvICJzeXN0ZW0gcmVzZXQiIHRvIE5JQyB3aGVuIFR4IG9yIFJ4IGlzIHN0dWNrLgorLy8gVGhlIG1ldGhvZCBjaGVja2luZyBUeC9SeCBzdHVjayBvZiB0aGlzIGZ1bmN0aW9uIGlzIHN1cHBvcnRlZCBieSBGVywKKy8vIHdoaWNoIHJlcG9ydHMgVHggYW5kIFJ4IGNvdW50ZXIgdG8gcmVnaXN0ZXIgMHgxMjggYW5kIDB4MTMwLgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK3ZvaWQKK3J0bDgxOXhfaWZzaWxlbnRyZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8vT0NURVRfU1RSSU5HIGFzb2NwZHU7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXU4CXJlc2V0X3RpbWVzID0gMDsKKwlpbnQgcmVzZXRfc3RhdHVzID0gMDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKworCisJLy8gMjAwNy4wNy4yMC4gSWYgd2UgbmVlZCB0byBjaGVjayBDQ0sgc3RvcCwgcGxlYXNlIHVuY29tbWVudCB0aGlzIGxpbmUuCisJLy9iU3R1Y2sgPSBBZGFwdGVyLT5IYWxGdW5jLkNoZWNrSFdTdG9wSGFuZGxlcihBZGFwdGVyKTsKKworCWlmKHByaXYtPlJlc2V0UHJvZ3Jlc3M9PVJFU0VUX1RZUEVfTk9SRVNFVCkKKwl7CitSRVNFVF9TVEFSVDoKKworCQlSVF9UUkFDRShDT01QX1JFU0VULCI9PT09PT09PT0+UmVzZXQgcHJvZ3Jlc3MhISBcbiIpOworCisJCS8vIFNldCB0aGUgdmFyaWFibGUgZm9yIHJlc2V0LgorCQlwcml2LT5SZXNldFByb2dyZXNzID0gUkVTRVRfVFlQRV9TSUxFTlQ7CisvLwkJcnRsODE5Ml9jbG9zZShkZXYpOworCQlkb3duKCZwcml2LT53eF9zZW0pOworCQlpZihwcml2LT51cCA9PSAwKQorCQl7CisJCQlSVF9UUkFDRShDT01QX0VSUiwiJXMoKTp0aGUgZHJpdmVyIGlzIG5vdCB1cCEgcmV0dXJuXG4iLF9fRlVOQ1RJT05fXyk7CisJCQl1cCgmcHJpdi0+d3hfc2VtKTsKKwkJCXJldHVybiA7CisJCX0KKwkJcHJpdi0+dXAgPSAwOworCQlSVF9UUkFDRShDT01QX1JFU0VULCIlcygpOj09PT09PT5zdGFydCB0byBkb3duIHRoZSBkcml2ZXJcbiIsX19GVU5DVElPTl9fKTsKKy8vCQlpZighbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKQorLy8JCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkJcnRsODE5Ml9ydHhfZGlzYWJsZShkZXYpOworCQlydGw4MTkyX2NhbmNlbF9kZWZlcnJlZF93b3JrKHByaXYpOworCQlkZWluaXRfaGFsX2RtKGRldik7CisJCWRlbF90aW1lcl9zeW5jKCZwcml2LT53YXRjaF9kb2dfdGltZXIpOworCisJCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMTsKKwkJaWYoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkKKwkJeworCQkJZG93bigmaWVlZS0+d3hfc2VtKTsKKwkJCXByaW50aygiaWVlZS0+c3RhdGUgaXMgSUVFRTgwMjExX0xJTktFRFxuIik7CisJCQlpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMocHJpdi0+aWVlZTgwMjExKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOworCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxKTsKKwkJCWllZWU4MDIxMV9zdG9wX3NjYW4oaWVlZSk7CisJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQkJdXAoJmllZWUtPnd4X3NlbSk7CisJCX0KKwkJZWxzZXsKKwkJCXByaW50aygiaWVlZS0+c3RhdGUgaXMgTk9UIExJTktFRFxuIik7CisJCQlpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sKHByaXYtPmllZWU4MDIxMSk7CQkJfQorCQl1cCgmcHJpdi0+d3hfc2VtKTsKKwkJUlRfVFJBQ0UoQ09NUF9SRVNFVCwiJXMoKTo8PT09PT09PT09PWRvd24gcHJvY2VzcyBpcyBmaW5pc2hlZFxuIixfX0ZVTkNUSU9OX18pOworCS8vcnRsODE5Ml9pcnFfZGlzYWJsZShkZXYpOworCQlSVF9UUkFDRShDT01QX1JFU0VULCIlcygpOj09PT09PT09PT09PnN0YXJ0IHRvIHVwIHRoZSBkcml2ZXJcbiIsX19GVU5DVElPTl9fKTsKKwkJcmVzZXRfc3RhdHVzID0gX3J0bDgxOTJfdXAoZGV2KTsKKworCQlSVF9UUkFDRShDT01QX1JFU0VULCIlcygpOjw9PT09PT09PT09PXVwIHByb2Nlc3MgaXMgZmluaXNoZWRcbiIsX19GVU5DVElPTl9fKTsKKwkJaWYocmVzZXRfc3RhdHVzID09IC1FQUdBSU4pCisJCXsKKwkJCWlmKHJlc2V0X3RpbWVzIDwgMykKKwkJCXsKKwkJCQlyZXNldF90aW1lcysrOworCQkJCWdvdG8gUkVTRVRfU1RBUlQ7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsIiBFUlIhISEgJXMoKTogIFJlc2V0IEZhaWxlZCEhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJfQorCQl9CisJCWllZWUtPmlzX3NpbGVudF9yZXNldCA9IDE7CisJCUVuYWJsZUhXU2VjdXJpdHlDb25maWc4MTkyKGRldik7CisJCWlmKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQgJiYgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKQorCQl7CisJCQlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKworCQkJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPmFzc29jaWF0ZV9jb21wbGV0ZV93cSk7CisKKwkJfQorCQllbHNlIGlmKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQgJiYgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQorCQl7CisJCQlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKwkJCWllZWUtPmxpbmtfY2hhbmdlKGllZWUtPmRldik7CisKKwkJLy8Jbm90aWZ5X3d4X2Fzc29jX2V2ZW50KGllZWUpOworCisJCQlpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zKGllZWUpOworCisJCQlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKKwkJCQlpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKGllZWUtPmRldik7CisJCQluZXRpZl9jYXJyaWVyX29uKGllZWUtPmRldik7CisJCX0KKworCQlDYW1SZXN0b3JlQWxsRW50cnkoZGV2KTsKKworCQlwcml2LT5SZXNldFByb2dyZXNzID0gUkVTRVRfVFlQRV9OT1JFU0VUOworCQlwcml2LT5yZXNldF9jb3VudCsrOworCisJCXByaXYtPmJGb3JjZWRTaWxlbnRSZXNldCA9ZmFsc2U7CisJCXByaXYtPmJSZXNldEluUHJvZ3Jlc3MgPSBmYWxzZTsKKworCQkvLyBGb3IgdGVzdCAtLT4gZm9yY2Ugd3JpdGUgVUZXUC4KKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBVRldQLCAxKTsKKwkJUlRfVFJBQ0UoQ09NUF9SRVNFVCwgIlJlc2V0IGZpbmlzaGVkISEgPT09PT5bJWRdXG4iLCBwcml2LT5yZXNldF9jb3VudCk7CisJfQorfQorCit2b2lkIENBTV9yZWFkX2VudHJ5KAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTMyCSAJCWlJbmRleAorKQoreworIAl1MzIgdGFyZ2V0X2NvbW1hbmQ9MDsKKwkgdTMyIHRhcmdldF9jb250ZW50PTA7CisJIHU4IGVudHJ5X2k9MDsKKwkgdTMyIHVsU3RhdHVzOworCXMzMiBpPTEwMDsKKy8vCXByaW50aygiPT09PT09PT5zdGFydCByZWFkIENBTVxuIik7CisgCWZvcihlbnRyeV9pPTA7ZW50cnlfaTxDQU1fQ09OVEVOVF9DT1VOVDtlbnRyeV9pKyspCisgCXsKKyAgIAkvLyBwb2xsaW5nIGJpdCwgYW5kIE5vIFdyaXRlIGVuYWJsZSwgYW5kIGFkZHJlc3MKKwkJdGFyZ2V0X2NvbW1hbmQ9IGVudHJ5X2krQ0FNX0NPTlRFTlRfQ09VTlQqaUluZGV4OworCQl0YXJnZXRfY29tbWFuZD0gdGFyZ2V0X2NvbW1hbmQgfCBCSVQzMTsKKworCS8vQ2hlY2sgcG9sbGluZyBiaXQgaXMgY2xlYXIKKy8vCW1kZWxheSgxKTsKKwkJd2hpbGUoKGktLSk+PTApCisJCXsKKwkJCXVsU3RhdHVzID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBSV0NBTSk7CisJCQlpZih1bFN0YXR1cyAmIEJJVDMxKXsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWVsc2V7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgUldDQU0sIHRhcmdldF9jb21tYW5kKTsKKwkJUlRfVFJBQ0UoQ09NUF9TRUMsIkNBTV9yZWFkX2VudHJ5KCk6IFdSSVRFIEEwOiAleCBcbiIsdGFyZ2V0X2NvbW1hbmQpOworCSAvLwlwcmludGsoIkNBTV9yZWFkX2VudHJ5KCk6IFdSSVRFIEEwOiAlbHggXG4iLHRhcmdldF9jb21tYW5kKTsKKwkJdGFyZ2V0X2NvbnRlbnQgPSByZWFkX25pY19kd29yZChkZXYsIFJDQU1PKTsKKwkJUlRfVFJBQ0UoQ09NUF9TRUMsICJDQU1fcmVhZF9lbnRyeSgpOiBXUklURSBBODogJXggXG4iLHRhcmdldF9jb250ZW50KTsKKwkgLy8JcHJpbnRrKCJDQU1fcmVhZF9lbnRyeSgpOiBXUklURSBBODogJWx4IFxuIix0YXJnZXRfY29udGVudCk7CisJfQorCXByaW50aygiXG4iKTsKK30KKwordm9pZCBydGw4MTl4X3VwZGF0ZV9yeGNvdW50cygKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwKKwl1MzIqIFRvdGFsUnhCY25OdW0sCisJdTMyKiBUb3RhbFJ4RGF0YU51bQorKQoreworCXUxNiAJCQlTbG90SW5kZXg7CisJdTgJCQlpOworCisJKlRvdGFsUnhCY25OdW0gPSAwOworCSpUb3RhbFJ4RGF0YU51bSA9IDA7CisKKwlTbG90SW5kZXggPSAocHJpdi0+aWVlZTgwMjExLT5MaW5rRGV0ZWN0SW5mby5TbG90SW5kZXgrKyklKHByaXYtPmllZWU4MDIxMS0+TGlua0RldGVjdEluZm8uU2xvdE51bSk7CisJcHJpdi0+aWVlZTgwMjExLT5MaW5rRGV0ZWN0SW5mby5SeEJjbk51bVtTbG90SW5kZXhdID0gcHJpdi0+aWVlZTgwMjExLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2QmNuSW5QZXJpb2Q7CisJcHJpdi0+aWVlZTgwMjExLT5MaW5rRGV0ZWN0SW5mby5SeERhdGFOdW1bU2xvdEluZGV4XSA9IHByaXYtPmllZWU4MDIxMS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkRhdGFJblBlcmlvZDsKKwlmb3IoIGk9MDsgaTxwcml2LT5pZWVlODAyMTEtPkxpbmtEZXRlY3RJbmZvLlNsb3ROdW07IGkrKyApeworCQkqVG90YWxSeEJjbk51bSArPSBwcml2LT5pZWVlODAyMTEtPkxpbmtEZXRlY3RJbmZvLlJ4QmNuTnVtW2ldOworCQkqVG90YWxSeERhdGFOdW0gKz0gcHJpdi0+aWVlZTgwMjExLT5MaW5rRGV0ZWN0SW5mby5SeERhdGFOdW1baV07CisJfQorfQorCisKK2V4dGVybgl2b2lkCXJ0bDgxOXhfd2F0Y2hkb2dfd3FjYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yayxzdHJ1Y3QgZGVsYXllZF93b3JrLHdvcmspOworICAgICAgIHN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGR3b3JrLHN0cnVjdCByODE5Ml9wcml2LHdhdGNoX2RvZ193cSk7CisgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPmllZWU4MDIxMS0+ZGV2OworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlID0gcHJpdi0+aWVlZTgwMjExOworCVJFU0VUX1RZUEUJUmVzZXRUeXBlID0gUkVTRVRfVFlQRV9OT1JFU0VUOworCXN0YXRpYyB1OAljaGVja19yZXNldF9jbnQ9MDsKKwlib29sIGJCdXN5VHJhZmZpYyA9IGZhbHNlOworCisJaWYoIXByaXYtPnVwKQorCQlyZXR1cm47CisJaGFsX2RtX3dhdGNoZG9nKGRldik7CisKKwl7Ly90byBnZXQgYnVzeSB0cmFmZmljIGNvbmRpdGlvbgorCQlpZihpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQorCQl7CisJCQlpZigJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUnhPa0luUGVyaW9kPiA2NjYgfHwKKwkJCQlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1UeE9rSW5QZXJpb2Q+IDY2NiApIHsKKwkJCQliQnVzeVRyYWZmaWMgPSB0cnVlOworCQkJfQorCQkJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUnhPa0luUGVyaW9kID0gMDsKKwkJCWllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVR4T2tJblBlcmlvZCA9IDA7CisJCQlpZWVlLT5MaW5rRGV0ZWN0SW5mby5iQnVzeVRyYWZmaWMgPSBiQnVzeVRyYWZmaWM7CisJCX0KKwl9CisJLy9hZGRlZCBieSBhbXkgZm9yIEFQIHJvYW1pbmcKKwl7CisJCWlmKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCAmJiBwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkKKwkJeworCQkJdTMyCVRvdGFsUnhCY25OdW0gPSAwOworCQkJdTMyCVRvdGFsUnhEYXRhTnVtID0gMDsKKworCQkJcnRsODE5eF91cGRhdGVfcnhjb3VudHMocHJpdiwgJlRvdGFsUnhCY25OdW0sICZUb3RhbFJ4RGF0YU51bSk7CisJCQlpZigoVG90YWxSeEJjbk51bStUb3RhbFJ4RGF0YU51bSkgPT0gMCkKKwkJCXsKKwkJCQkjaWZkZWYgVE9ETworCQkJCWlmKHJmU3RhdGUgPT0gZVJmT2ZmKQorCQkJCQlSVF9UUkFDRShDT01QX0VSUiwiPT09PT09PT0+JXMoKVxuIixfX0ZVTkNUSU9OX18pOworCQkJCSNlbmRpZgorCQkJCXByaW50aygiPT09PiVzKCk6IEFQIGlzIHBvd2VyIG9mZixjb25uZWN0IGFub3RoZXIgb25lXG4iLF9fRlVOQ1RJT05fXyk7CisJCQkvLwlEb3QxMWRfUmVzZXQoZGV2KTsKKwkJCQlwcml2LT5pZWVlODAyMTEtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HOworCQkJCW5vdGlmeV93eF9hc3NvY19ldmVudChwcml2LT5pZWVlODAyMTEpOworCQkJCVJlbW92ZVBlZXJUUyhwcml2LT5pZWVlODAyMTEscHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYnNzaWQpOworCQkJCXByaXYtPmllZWU4MDIxMS0+bGlua19jaGFuZ2UoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVfd29yayhwcml2LT5pZWVlODAyMTEtPndxLCAmcHJpdi0+aWVlZTgwMjExLT5hc3NvY2lhdGVfcHJvY2VkdXJlX3dxKTsKKworCQkJfQorCQl9CisJCXByaXYtPmllZWU4MDIxMS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkJjbkluUGVyaW9kPTA7CisJCXByaXYtPmllZWU4MDIxMS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkRhdGFJblBlcmlvZD0wOworCX0KKy8vCUNBTV9yZWFkX2VudHJ5KGRldiw0KTsKKwkvL2NoZWNrIGlmIHJlc2V0IHRoZSBkcml2ZXIKKwlpZihjaGVja19yZXNldF9jbnQrKyA+PSAzKQorCXsKKyAgICAJCVJlc2V0VHlwZSA9IHJ0bDgxOXhfaWZjaGVja19yZXNldG9ybm90KGRldik7CisJCWNoZWNrX3Jlc2V0X2NudCA9IDM7CisJCS8vRGJnUHJpbnQoIlN0YXJ0IHRvIGNoZWNrIHNpbGVudCByZXNldFxuIik7CisJfQorCS8vCVJUX1RSQUNFKENPTVBfUkVTRVQsIiVzKCk6cHJpdi0+Zm9yY2VfcmVzZXQgaXMgJWQscHJpdi0+UmVzZXRQcm9ncmVzcyBpcyAlZCwgcHJpdi0+YkZvcmNlZFNpbGVudFJlc2V0IGlzICVkLHByaXYtPmJEaXNhYmxlTm9ybWFsUmVzZXRDaGVjayBpcyAlZCxSZXNldFR5cGUgaXMgJWRcbiIsX19GVU5DVElPTl9fLHByaXYtPmZvcmNlX3Jlc2V0LHByaXYtPlJlc2V0UHJvZ3Jlc3MscHJpdi0+YkZvcmNlZFNpbGVudFJlc2V0LHByaXYtPmJEaXNhYmxlTm9ybWFsUmVzZXRDaGVjayxSZXNldFR5cGUpOworCWlmKCAocHJpdi0+Zm9yY2VfcmVzZXQpIHx8IChwcml2LT5SZXNldFByb2dyZXNzPT1SRVNFVF9UWVBFX05PUkVTRVQgJiYKKwkJKHByaXYtPmJGb3JjZWRTaWxlbnRSZXNldCB8fAorCQkoIXByaXYtPmJEaXNhYmxlTm9ybWFsUmVzZXRDaGVjayAmJiBSZXNldFR5cGU9PVJFU0VUX1RZUEVfU0lMRU5UKSkpKSAvLyBUaGlzIGlzIGNvbnRyb2wgYnkgT0lEIHNldCBpbiBQb21lbG8KKwl7CisJCVJUX1RSQUNFKENPTVBfUkVTRVQsIiVzKCk6cHJpdi0+Zm9yY2VfcmVzZXQgaXMgJWQscHJpdi0+UmVzZXRQcm9ncmVzcyBpcyAlZCwgcHJpdi0+YkZvcmNlZFNpbGVudFJlc2V0IGlzICVkLHByaXYtPmJEaXNhYmxlTm9ybWFsUmVzZXRDaGVjayBpcyAlZCxSZXNldFR5cGUgaXMgJWRcbiIsX19GVU5DVElPTl9fLHByaXYtPmZvcmNlX3Jlc2V0LHByaXYtPlJlc2V0UHJvZ3Jlc3MscHJpdi0+YkZvcmNlZFNpbGVudFJlc2V0LHByaXYtPmJEaXNhYmxlTm9ybWFsUmVzZXRDaGVjayxSZXNldFR5cGUpOworCQlydGw4MTl4X2lmc2lsZW50cmVzZXQoZGV2KTsKKwl9CisJcHJpdi0+Zm9yY2VfcmVzZXQgPSBmYWxzZTsKKwlwcml2LT5iRm9yY2VkU2lsZW50UmVzZXQgPSBmYWxzZTsKKwlwcml2LT5iUmVzZXRJblByb2dyZXNzID0gZmFsc2U7CisJUlRfVFJBQ0UoQ09NUF9UUkFDRSwgIiA8PT1SdFVzYkNoZWNrRm9ySGFuZ1dvcmtJdGVtQ2FsbGJhY2soKVxuIik7CisKK30KKwordm9pZCB3YXRjaF9kb2dfdGltZXJfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoKHN0cnVjdCBuZXRfZGV2aWNlICopIGRhdGEpOworCS8vcHJpbnRrKCI9PT09PT09PT09PT09PT0+d2F0Y2hfZG9nICB0aW1lclxuIik7CisJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPnByaXZfd3EsJnByaXYtPndhdGNoX2RvZ193cSwgMCk7CisJbW9kX3RpbWVyKCZwcml2LT53YXRjaF9kb2dfdGltZXIsIGppZmZpZXMgKyBNU0VDUyhJRUVFODAyMTFfV0FUQ0hfRE9HX1RJTUUpKTsKK30KK2ludCBfcnRsODE5Ml91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvL2ludCBpOworCWludCBpbml0X3N0YXR1cyA9IDA7CisJcHJpdi0+dXA9MTsKKwlwcml2LT5pZWVlODAyMTEtPmllZWVfdXA9MTsKKwlSVF9UUkFDRShDT01QX0lOSVQsICJCcmluZ2luZyB1cCBpZmFjZSIpOworCWluaXRfc3RhdHVzID0gcnRsODE5Ml9hZGFwdGVyX3N0YXJ0KGRldik7CisJaWYoIWluaXRfc3RhdHVzKQorCXsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsIkVSUiEhISAlcygpOiBpbml0aWFsaXphdGlvbiBpcyBmYWlsZWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlwcml2LT51cD1wcml2LT5pZWVlODAyMTEtPmllZWVfdXAgPSAwOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJUlRfVFJBQ0UoQ09NUF9JTklULCAic3RhcnQgYWRhcHRlciBmaW5pc2hlZFxuIik7CisJcnRsODE5Ml9yeF9lbmFibGUoZGV2KTsKKy8vCXJ0bDgxOTJfdHhfZW5hYmxlKGRldik7CisJaWYocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEKQorCWllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sKHByaXYtPmllZWU4MDIxMSk7CisJaWVlZTgwMjExX3Jlc2V0X3F1ZXVlKHByaXYtPmllZWU4MDIxMSk7CisJd2F0Y2hfZG9nX3RpbWVyX2NhbGxiYWNrKCh1bnNpZ25lZCBsb25nKSBkZXYpOworCWlmKCFuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpCisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJZWxzZQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgcnRsODE5Ml9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCByZXQ7CisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlyZXQgPSBydGw4MTkyX3VwKGRldik7CisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKKworfQorCisKK2ludCBydGw4MTkyX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJaWYgKHByaXYtPnVwID09IDEpIHJldHVybiAtMTsKKworCXJldHVybiBfcnRsODE5Ml91cChkZXYpOworfQorCisKK2ludCBydGw4MTkyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCByZXQ7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcmV0ID0gcnRsODE5Ml9kb3duKGRldik7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7CisKK30KKworaW50IHJ0bDgxOTJfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCWlmIChwcml2LT51cCA9PSAwKSByZXR1cm4gLTE7CisKKwlwcml2LT51cD0wOworCXByaXYtPmllZWU4MDIxMS0+aWVlZV91cCA9IDA7CisJUlRfVFJBQ0UoQ09NUF9ET1dOLCAiPT09PT09PT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworLyogRklYTUUgKi8KKwlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJcnRsODE5Ml9ydHhfZGlzYWJsZShkZXYpOworCS8vcnRsODE5Ml9pcnFfZGlzYWJsZShkZXYpOworCisgLyogVHggcmVsYXRlZCBxdWV1ZSByZWxlYXNlICovCisJZm9yKGkgPSAwOyBpIDwgTUFYX1FVRVVFX1NJWkU7IGkrKykgeworCQlza2JfcXVldWVfcHVyZ2UoJnByaXYtPmllZWU4MDIxMS0+c2tiX3dhaXRRIFtpXSk7CisJfQorCWZvcihpID0gMDsgaSA8IE1BWF9RVUVVRV9TSVpFOyBpKyspIHsKKwkJc2tiX3F1ZXVlX3B1cmdlKCZwcml2LT5pZWVlODAyMTEtPnNrYl9hZ2dRIFtpXSk7CisJfQorCisJZm9yKGkgPSAwOyBpIDwgTUFYX1FVRVVFX1NJWkU7IGkrKykgeworCQlza2JfcXVldWVfcHVyZ2UoJnByaXYtPmllZWU4MDIxMS0+c2tiX2Rydl9hZ2dRIFtpXSk7CisJfQorCisJLy9hcyBjYW5jZWxfZGVsYXllZF93b3JrIHdpbGwgZGVsIHdvcmstPnRpbWVyLCBzbyBpZiB3b3JrIGlzIG5vdCBkZWZpbmVkYXMgc3RydWN0IGRlbGF5ZWRfd29yaywgaXQgd2lsbCBjb3JydXB0CisvLwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCXJ0bDgxOTJfY2FuY2VsX2RlZmVycmVkX3dvcmsocHJpdik7CisJZGVpbml0X2hhbF9kbShkZXYpOworCWRlbF90aW1lcl9zeW5jKCZwcml2LT53YXRjaF9kb2dfdGltZXIpOworCisKKwlpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sKHByaXYtPmllZWU4MDIxMSk7CisJbWVtc2V0KCZwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yaywgMCAsIG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yaywgbGlzdCkpOworCVJUX1RSQUNFKENPTVBfRE9XTiwgIjw9PT09PT09PT09JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCQlyZXR1cm4gMDsKK30KKworCit2b2lkIHJ0bDgxOTJfY29tbWl0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCByZXNldF9zdGF0dXMgPSAwOworCS8vdTggcmVzZXRfdGltZXMgPSAwOworCWlmIChwcml2LT51cCA9PSAwKSByZXR1cm4gOworCXByaXYtPnVwID0gMDsKKworCXJ0bDgxOTJfY2FuY2VsX2RlZmVycmVkX3dvcmsocHJpdik7CisJZGVsX3RpbWVyX3N5bmMoJnByaXYtPndhdGNoX2RvZ190aW1lcik7CisJLy9jYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5Td0NobmxXb3JrSXRlbSk7CisKKwlpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sKHByaXYtPmllZWU4MDIxMSk7CisKKwkvL3J0bDgxOTJfaXJxX2Rpc2FibGUoZGV2KTsKKwlydGw4MTkyX3J0eF9kaXNhYmxlKGRldik7CisJcmVzZXRfc3RhdHVzID0gX3J0bDgxOTJfdXAoZGV2KTsKKworfQorCisvKgordm9pZCBydGw4MTkyX3Jlc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisqLwordm9pZCBydGw4MTkyX3Jlc3RhcnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByODE5Ml9wcml2LCByZXNldF93cSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPmllZWU4MDIxMS0+ZGV2OworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJ0bDgxOTJfY29tbWl0KGRldik7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKK30KKworc3RhdGljIHZvaWQgcjgxOTJfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzaG9ydCBwcm9taXNjOworCisJLy9kb3duKCZwcml2LT53eF9zZW0pOworCisJLyogRklYTUUgRklYTUUgKi8KKworCXByb21pc2MgPSAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSA/IDE6MDsKKworCWlmIChwcm9taXNjICE9IHByaXYtPnByb21pc2MpCisJLy8JcnRsODE5Ml9jb21taXQoZGV2KTsKKworCXByaXYtPnByb21pc2MgPSBwcm9taXNjOworCisJLy9zY2hlZHVsZV93b3JrKCZwcml2LT5yZXNldF93cSk7CisJLy91cCgmcHJpdi0+d3hfc2VtKTsKK30KKworCitpbnQgcjgxOTJfc2V0X21hY19hZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqbWFjKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBtYWM7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIEVUSF9BTEVOKTsKKworCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJlc2V0X3dxKTsKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiAwOworfQorCisvKiBiYXNlZCBvbiBpcHcyMjAwIGRyaXZlciAqLworaW50IHJ0bDgxOTJfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopcnE7CisJaW50IHJldD0tMTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKwl1MzIga2V5WzRdOworCXU4IGJyb2FkY2FzdF9hZGRyWzZdID0gezB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmfTsKKwlzdHJ1Y3QgaXdfcG9pbnQgKnAgPSAmd3JxLT51LmRhdGE7CisJc3RydWN0IGllZWVfcGFyYW0gKmlwdyA9IE5VTEw7Ly8oc3RydWN0IGllZWVfcGFyYW0gKil3cnEtPnUuZGF0YS5wb2ludGVyOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCisgICAgIGlmIChwLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGllZWVfcGFyYW0pIHx8ICFwLT5wb2ludGVyKXsKKwkgICAgIHJldCA9IC1FSU5WQUw7CisJICAgICBnb3RvIG91dDsKKwl9CisKKyAgICAgaXB3ID0gKHN0cnVjdCBpZWVlX3BhcmFtICopa21hbGxvYyhwLT5sZW5ndGgsIEdGUF9LRVJORUwpOworICAgICBpZiAoaXB3ID09IE5VTEwpeworCSAgICAgcmV0ID0gLUVOT01FTTsKKwkgICAgIGdvdG8gb3V0OworICAgICB9CisgICAgIGlmIChjb3B5X2Zyb21fdXNlcihpcHcsIHAtPnBvaW50ZXIsIHAtPmxlbmd0aCkpIHsKKwkJa2ZyZWUoaXB3KTsKKwkgICAgcmV0ID0gLUVGQVVMVDsKKwkgICAgZ290byBvdXQ7CisJfQorCisJc3dpdGNoIChjbWQpIHsKKwkgICAgY2FzZSBSVExfSU9DVExfV1BBX1NVUFBMSUNBTlQ6CisJLy9wYXJzZSBoZXJlIGZvciBIVyBzZWN1cml0eQorCQkJaWYgKGlwdy0+Y21kID09IElFRUVfQ01EX1NFVF9FTkNSWVBUSU9OKQorCQkJeworCQkJCWlmIChpcHctPnUuY3J5cHQuc2V0X3R4KQorCQkJCXsKKwkJCQkJaWYgKHN0cmNtcChpcHctPnUuY3J5cHQuYWxnLCAiQ0NNUCIpID09IDApCisJCQkJCQlpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9IEtFWV9UWVBFX0NDTVA7CisJCQkJCWVsc2UgaWYgKHN0cmNtcChpcHctPnUuY3J5cHQuYWxnLCAiVEtJUCIpID09IDApCisJCQkJCQlpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9IEtFWV9UWVBFX1RLSVA7CisJCQkJCWVsc2UgaWYgKHN0cmNtcChpcHctPnUuY3J5cHQuYWxnLCAiV0VQIikgPT0gMCkKKwkJCQkJeworCQkJCQkJaWYgKGlwdy0+dS5jcnlwdC5rZXlfbGVuID09IDEzKQorCQkJCQkJCWllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gS0VZX1RZUEVfV0VQMTA0OworCQkJCQkJZWxzZSBpZiAoaXB3LT51LmNyeXB0LmtleV9sZW4gPT0gNSkKKwkJCQkJCQlpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9IEtFWV9UWVBFX1dFUDQwOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCWllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gS0VZX1RZUEVfTkE7CisKKwkJCQkJaWYgKGllZWUtPnBhaXJ3aXNlX2tleV90eXBlKQorCQkJCQl7CisJCQkJCQltZW1jcHkoKHU4KilrZXksIGlwdy0+dS5jcnlwdC5rZXksIDE2KTsKKwkJCQkJCUVuYWJsZUhXU2VjdXJpdHlDb25maWc4MTkyKGRldik7CisJCQkJCS8vd2UgZmlsbCBib3RoIGluZGV4IGVudHJ5IGFuZCA0dGggZW50cnkgZm9yIHBhaXJ3aXNlIGtleSBhcyBpbiBJUFcgaW50ZXJmYWNlLCBhZGhvYyB3aWxsIG9ubHkgZ2V0IGhlcmUsIHNvIHdlIG5lZWQgaW5kZXggZW50cnkgZm9yIGl0cyBkZWZhdWx0IGtleSBzZXJjaGluZyEKKwkJCQkJLy9hZGRlZCBieSBXQi4KKwkJCQkJCXNldEtleShkZXYsIDQsIGlwdy0+dS5jcnlwdC5pZHgsIGllZWUtPnBhaXJ3aXNlX2tleV90eXBlLCAodTgqKWllZWUtPmFwX21hY19hZGRyLCAwLCBrZXkpOworCQkJCQkJaWYgKGllZWUtPmF1dGhfbW9kZSAhPSAyKQorCQkJCQkJc2V0S2V5KGRldiwgaXB3LT51LmNyeXB0LmlkeCwgaXB3LT51LmNyeXB0LmlkeCwgaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUsICh1OCopaWVlZS0+YXBfbWFjX2FkZHIsIDAsIGtleSk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSAvL2lmIChpcHctPnUuY3J5cHQuaWR4KSAvL2dyb3VwIGtleSB1c2UgaWR4ID4gMAorCQkJCXsKKwkJCQkJbWVtY3B5KCh1OCopa2V5LCBpcHctPnUuY3J5cHQua2V5LCAxNik7CisJCQkJCWlmIChzdHJjbXAoaXB3LT51LmNyeXB0LmFsZywgIkNDTVAiKSA9PSAwKQorCQkJCQkJaWVlZS0+Z3JvdXBfa2V5X3R5cGU9IEtFWV9UWVBFX0NDTVA7CisJCQkJCWVsc2UgaWYgKHN0cmNtcChpcHctPnUuY3J5cHQuYWxnLCAiVEtJUCIpID09IDApCisJCQkJCQlpZWVlLT5ncm91cF9rZXlfdHlwZSA9IEtFWV9UWVBFX1RLSVA7CisJCQkJCWVsc2UgaWYgKHN0cmNtcChpcHctPnUuY3J5cHQuYWxnLCAiV0VQIikgPT0gMCkKKwkJCQkJeworCQkJCQkJaWYgKGlwdy0+dS5jcnlwdC5rZXlfbGVuID09IDEzKQorCQkJCQkJCWllZWUtPmdyb3VwX2tleV90eXBlID0gS0VZX1RZUEVfV0VQMTA0OworCQkJCQkJZWxzZSBpZiAoaXB3LT51LmNyeXB0LmtleV9sZW4gPT0gNSkKKwkJCQkJCQlpZWVlLT5ncm91cF9rZXlfdHlwZSA9IEtFWV9UWVBFX1dFUDQwOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCWllZWUtPmdyb3VwX2tleV90eXBlID0gS0VZX1RZUEVfTkE7CisKKwkJCQkJaWYgKGllZWUtPmdyb3VwX2tleV90eXBlKQorCQkJCQl7CisJCQkJCQkJc2V0S2V5KAlkZXYsCisJCQkJCQkJCWlwdy0+dS5jcnlwdC5pZHgsCisJCQkJCQkJCWlwdy0+dS5jcnlwdC5pZHgsCQkvL0tleUluZGV4CisJCQkJCQkgICAgIAkJaWVlZS0+Z3JvdXBfa2V5X3R5cGUsCS8vS2V5VHlwZQorCQkJCQkJICAgICAgICAgICAgCWJyb2FkY2FzdF9hZGRyLAkvL01hY0FkZHIKKwkJCQkJCQkJMCwJCS8vRGVmYXVsdEtleQorCQkJCQkJCSAgICAgIAlrZXkpOwkJLy9LZXlDb250ZW50CisJCQkJCX0KKwkJCQl9CisJCQl9CisjaWZkZWYgSk9ITl9IV1NFQ19ERUJVRworCQkvL2pvaG4ncyB0ZXN0IDA3MTEKKwkJcHJpbnRrKCJAQCB3cnEtPnUgcG9pbnRlciA9ICIpOworCQlmb3IoaT0wO2k8d3JxLT51LmRhdGEubGVuZ3RoO2krKyl7CisJCQlpZihpJTEwPT0wKSBwcmludGsoIlxuIik7CisJCQlwcmludGsoICIlOHh8IiwgKCh1MzIqKXdycS0+dS5kYXRhLnBvaW50ZXIpW2ldICk7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworI2VuZGlmIC8qSk9ITl9IV1NFQ19ERUJVRyovCisJCXJldCA9IGllZWU4MDIxMV93cGFfc3VwcGxpY2FudF9pb2N0bChwcml2LT5pZWVlODAyMTEsICZ3cnEtPnUuZGF0YSk7CisJCWJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJCXJldCA9IC1FT1BOT1RTVVBQOworCQlicmVhazsKKwl9CisJa2ZyZWUoaXB3KTsKKwlpcHcgPSBOVUxMOworb3V0OgorCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKK3U4IEh3UmF0ZVRvTVJhdGU5MChib29sIGJJc0hULCB1OCByYXRlKQoreworCXU4ICByZXRfcmF0ZSA9IDB4ZmY7CisKKwlpZighYklzSFQpIHsKKwkJc3dpdGNoKHJhdGUpIHsKKwkJCWNhc2UgREVTQzkwX1JBVEUxTTogICByZXRfcmF0ZSA9IE1HTl8xTTsgICAgICAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEUyTTogICByZXRfcmF0ZSA9IE1HTl8yTTsgICAgICAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEU1XzVNOiByZXRfcmF0ZSA9IE1HTl81XzVNOyAgICAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEUxMU06ICByZXRfcmF0ZSA9IE1HTl8xMU07ICAgICAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEU2TTogICByZXRfcmF0ZSA9IE1HTl82TTsgICAgICAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEU5TTogICByZXRfcmF0ZSA9IE1HTl85TTsgICAgICAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEUxMk06ICByZXRfcmF0ZSA9IE1HTl8xMk07ICAgICAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEUxOE06ICByZXRfcmF0ZSA9IE1HTl8xOE07ICAgICAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEUyNE06ICByZXRfcmF0ZSA9IE1HTl8yNE07ICAgICAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEUzNk06ICByZXRfcmF0ZSA9IE1HTl8zNk07ICAgICAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEU0OE06ICByZXRfcmF0ZSA9IE1HTl80OE07ICAgICAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEU1NE06ICByZXRfcmF0ZSA9IE1HTl81NE07ICAgICAgICBicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlyZXRfcmF0ZSA9IDB4ZmY7CisJCQkJUlRfVFJBQ0UoQ09NUF9SRUNWLCAiSHdSYXRlVG9NUmF0ZTkwKCk6IE5vbiBzdXBwb3J0ZWQgUmF0ZSBbJXhdLCBiSXNIVCA9ICVkISEhXG4iLCByYXRlLCBiSXNIVCk7CisJCQkJYnJlYWs7CisJCX0KKworCX0gZWxzZSB7CisJCXN3aXRjaChyYXRlKSB7CisJCQljYXNlIERFU0M5MF9SQVRFTUNTMDogICByZXRfcmF0ZSA9IE1HTl9NQ1MwOyAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEVNQ1MxOiAgIHJldF9yYXRlID0gTUdOX01DUzE7ICAgIGJyZWFrOworCQkJY2FzZSBERVNDOTBfUkFURU1DUzI6ICAgcmV0X3JhdGUgPSBNR05fTUNTMjsgICAgYnJlYWs7CisJCQljYXNlIERFU0M5MF9SQVRFTUNTMzogICByZXRfcmF0ZSA9IE1HTl9NQ1MzOyAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEVNQ1M0OiAgIHJldF9yYXRlID0gTUdOX01DUzQ7ICAgIGJyZWFrOworCQkJY2FzZSBERVNDOTBfUkFURU1DUzU6ICAgcmV0X3JhdGUgPSBNR05fTUNTNTsgICAgYnJlYWs7CisJCQljYXNlIERFU0M5MF9SQVRFTUNTNjogICByZXRfcmF0ZSA9IE1HTl9NQ1M2OyAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEVNQ1M3OiAgIHJldF9yYXRlID0gTUdOX01DUzc7ICAgIGJyZWFrOworCQkJY2FzZSBERVNDOTBfUkFURU1DUzg6ICAgcmV0X3JhdGUgPSBNR05fTUNTODsgICAgYnJlYWs7CisJCQljYXNlIERFU0M5MF9SQVRFTUNTOTogICByZXRfcmF0ZSA9IE1HTl9NQ1M5OyAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEVNQ1MxMDogIHJldF9yYXRlID0gTUdOX01DUzEwOyAgIGJyZWFrOworCQkJY2FzZSBERVNDOTBfUkFURU1DUzExOiAgcmV0X3JhdGUgPSBNR05fTUNTMTE7ICAgYnJlYWs7CisJCQljYXNlIERFU0M5MF9SQVRFTUNTMTI6ICByZXRfcmF0ZSA9IE1HTl9NQ1MxMjsgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEVNQ1MxMzogIHJldF9yYXRlID0gTUdOX01DUzEzOyAgIGJyZWFrOworCQkJY2FzZSBERVNDOTBfUkFURU1DUzE0OiAgcmV0X3JhdGUgPSBNR05fTUNTMTQ7ICAgYnJlYWs7CisJCQljYXNlIERFU0M5MF9SQVRFTUNTMTU6ICByZXRfcmF0ZSA9IE1HTl9NQ1MxNTsgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEVNQ1MzMjogIHJldF9yYXRlID0gKDB4ODB8MHgyMCk7IGJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCXJldF9yYXRlID0gMHhmZjsKKwkJCQlSVF9UUkFDRShDT01QX1JFQ1YsICJId1JhdGVUb01SYXRlOTAoKTogTm9uIHN1cHBvcnRlZCBSYXRlIFsleF0sIGJJc0hUID0gJWQhISFcbiIscmF0ZSwgYklzSFQpOworCQkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJldF9yYXRlOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiAgICAgVXBkYXRlUnhQa3RUaW1lU3RhbXAKKyAqIE92ZXJ2aWV3OiAgICAgUmVjb3JlZCBkb3duIHRoZSBUU0YgdGltZSBzdGFtcCB3aGVuIHJlY2VpdmluZyBhIHBhY2tldAorICoKKyAqIElucHV0OgorICogICAgICAgUEFEQVBURVIgICAgICAgIEFkYXB0ZXIKKyAqICAgICAgIFBSVF9SRkQgICAgICAgICBwUmZkLAorICoKKyAqIE91dHB1dDoKKyAqICAgICAgIFBSVF9SRkQgICAgICAgICBwUmZkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFJmZC0+U3RhdHVzLlRpbWVTdGFtcEhpZ2ggaXMgdXBkYXRlZCkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwUmZkLT5TdGF0dXMuVGltZVN0YW1wTG93IGlzIHVwZGF0ZWQpCisgKiBSZXR1cm46CisgKiAgICAgICAgICAgICAgIE5vbmUKKyAqLwordm9pZCBVcGRhdGVSeFBrdFRpbWVTdGFtcDgxOTAgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmKHN0YXRzLT5iSXNBTVBEVSAmJiAhc3RhdHMtPmJGaXJzdE1QRFUpIHsKKwkJc3RhdHMtPm1hY190aW1lWzBdID0gcHJpdi0+TGFzdFJ4RGVzY1RTRkxvdzsKKwkJc3RhdHMtPm1hY190aW1lWzFdID0gcHJpdi0+TGFzdFJ4RGVzY1RTRkhpZ2g7CisJfSBlbHNlIHsKKwkJcHJpdi0+TGFzdFJ4RGVzY1RTRkxvdyA9IHN0YXRzLT5tYWNfdGltZVswXTsKKwkJcHJpdi0+TGFzdFJ4RGVzY1RTRkhpZ2ggPSBzdGF0cy0+bWFjX3RpbWVbMV07CisJfQorfQorCisvL2J5IGFteSAwODA2MDYKKworbG9uZyBydGw4MTl4X3RyYW5zbGF0ZV90b2RibSh1OCBzaWduYWxfc3RyZW5ndGhfaW5kZXgJKS8vIDAtMTAwIGluZGV4LgoreworCWxvbmcJc2lnbmFsX3Bvd2VyOyAvLyBpbiBkQm0uCisKKwkvLyBUcmFuc2xhdGUgdG8gZEJtICh4PTAuNXktOTUpLgorCXNpZ25hbF9wb3dlciA9IChsb25nKSgoc2lnbmFsX3N0cmVuZ3RoX2luZGV4ICsgMSkgPj4gMSk7CisJc2lnbmFsX3Bvd2VyIC09IDk1OworCisJcmV0dXJuIHNpZ25hbF9wb3dlcjsKK30KKworCisvKiAyMDA4LzAxLzIyIE1IIFdlIGNhbiBub3QgZGVsY2FyZSBSU1NJL0VWTSB0b3RhbCB2YWx1ZSBvZiBzbGlkaW5nIHdpbmRvdyB0bworICAgIGJlIGEgbG9jYWwgc3RhdGljLiBPdGhlcndpc2UsIGl0IG1heSBpbmNyZWFzZSB3aGVuIHdlIHJldHVybiBmcm9tIFMzL1M0LiBUaGUKKyAgICB2YWx1ZSB3aWxsIGJlIGtlcHQgaW4gbWVtb3J5IG9yIGRpc2suIFdlIG11c3QgZGVsY2FyZSB0aGUgdmFsdWUgaW4gYWRhcHRlcgorICAgIGFuZCBpdCB3aWxsIGJlIHJlaW5pdGlhbGl6ZWQgd2hlbiByZXR1cm4gZnJvbSBTMy9TNC4gKi8KK3ZvaWQgcnRsODE5Ml9wcm9jZXNzX3BoeWluZm8oc3RydWN0IHI4MTkyX3ByaXYgKiBwcml2LHU4KiBidWZmZXIsIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKiBwcHJldmlvdXNfc3RhdHMsIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKiBwY3VycmVudF9zdGF0cykKK3sKKwlib29sIGJjaGVjayA9IGZhbHNlOworCXU4CXJmcGF0aDsKKwl1MzIJbnNwYXRpYWxfc3RyZWFtLCB0bXBfdmFsOworCS8vdTgJaTsKKwlzdGF0aWMgdTMyIHNsaWRlX3Jzc2lfaW5kZXg9MCwgc2xpZGVfcnNzaV9zdGF0aXN0aWNzPTA7CisJc3RhdGljIHUzMiBzbGlkZV9ldm1faW5kZXg9MCwgc2xpZGVfZXZtX3N0YXRpc3RpY3M9MDsKKwlzdGF0aWMgdTMyIGxhc3RfcnNzaT0wLCBsYXN0X2V2bT0wOworCisJc3RhdGljIHUzMiBzbGlkZV9iZWFjb25fYWRjX3B3ZGJfaW5kZXg9MCwgc2xpZGVfYmVhY29uX2FkY19wd2RiX3N0YXRpc3RpY3M9MDsKKwlzdGF0aWMgdTMyIGxhc3RfYmVhY29uX2FkY19wd2RiPTA7CisKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqaGRyOworCXUxNiBzYyA7CisJdW5zaWduZWQgaW50IGZyYWcsc2VxOworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKWJ1ZmZlcjsKKwlzYyA9IGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0bCk7CisJZnJhZyA9IFdMQU5fR0VUX1NFUV9GUkFHKHNjKTsKKwlzZXEgPSBXTEFOX0dFVF9TRVFfU0VRKHNjKTsKKwkvL2Nvc2EgYWRkIDA0MjkyMDA4IHRvIHJlY29yZCB0aGUgc2VxdWVuY2UgbnVtYmVyCisJcGN1cnJlbnRfc3RhdHMtPlNlcV9OdW0gPSBzZXE7CisJLy8KKwkvLyBDaGVjayB3aGV0aGVyIHdlIHNob3VsZCB0YWtlIHRoZSBwcmV2aW91cyBwYWNrZXQgaW50byBhY2NvdW50aW5nCisJLy8KKwlpZighcHByZXZpb3VzX3N0YXRzLT5iSXNBTVBEVSkKKwl7CisJCS8vIGlmIHByZXZpb3VzIHBhY2tldCBpcyBub3QgYWdncmVnYXRlZCBwYWNrZXQKKwkJYmNoZWNrID0gdHJ1ZTsKKwl9ZWxzZQorCXsKKwl9CisKKworCWlmKHNsaWRlX3Jzc2lfc3RhdGlzdGljcysrID49IFBIWV9SU1NJX1NMSURfV0lOX01BWCkKKwl7CisJCXNsaWRlX3Jzc2lfc3RhdGlzdGljcyA9IFBIWV9SU1NJX1NMSURfV0lOX01BWDsKKwkJbGFzdF9yc3NpID0gcHJpdi0+c3RhdHMuc2xpZGVfc2lnbmFsX3N0cmVuZ3RoW3NsaWRlX3Jzc2lfaW5kZXhdOworCQlwcml2LT5zdGF0cy5zbGlkZV9yc3NpX3RvdGFsIC09IGxhc3RfcnNzaTsKKwl9CisJcHJpdi0+c3RhdHMuc2xpZGVfcnNzaV90b3RhbCArPSBwcHJldmlvdXNfc3RhdHMtPlNpZ25hbFN0cmVuZ3RoOworCisJcHJpdi0+c3RhdHMuc2xpZGVfc2lnbmFsX3N0cmVuZ3RoW3NsaWRlX3Jzc2lfaW5kZXgrK10gPSBwcHJldmlvdXNfc3RhdHMtPlNpZ25hbFN0cmVuZ3RoOworCWlmKHNsaWRlX3Jzc2lfaW5kZXggPj0gUEhZX1JTU0lfU0xJRF9XSU5fTUFYKQorCQlzbGlkZV9yc3NpX2luZGV4ID0gMDsKKworCS8vIDwxPiBTaG93ZWQgb24gVUkgZm9yIHVzZXIsIGluIGRibQorCXRtcF92YWwgPSBwcml2LT5zdGF0cy5zbGlkZV9yc3NpX3RvdGFsL3NsaWRlX3Jzc2lfc3RhdGlzdGljczsKKwlwcml2LT5zdGF0cy5zaWduYWxfc3RyZW5ndGggPSBydGw4MTl4X3RyYW5zbGF0ZV90b2RibSgodTgpdG1wX3ZhbCk7CisJcGN1cnJlbnRfc3RhdHMtPnJzc2kgPSBwcml2LT5zdGF0cy5zaWduYWxfc3RyZW5ndGg7CisJLy8KKwkvLyBJZiB0aGUgcHJldmlvdXMgcGFja2V0IGRvZXMgbm90IG1hdGNoIHRoZSBjcml0ZXJpYSwgbmVnbGVjdCBpdAorCS8vCisJaWYoIXBwcmV2aW91c19zdGF0cy0+YlBhY2tldE1hdGNoQlNTSUQpCisJeworCQlpZighcHByZXZpb3VzX3N0YXRzLT5iVG9TZWxmQkEpCisJCQlyZXR1cm47CisJfQorCisJaWYoIWJjaGVjaykKKwkJcmV0dXJuOworCisKKwkvL3J0bDgxOTBfcHJvY2Vzc19jY2tfcnhwYXRoc2VsKHByaXYscHByZXZpb3VzX3N0YXRzKTsvL29ubHkgcnRsODE5MCBzdXBwb3J0ZWQKKworCS8vCisJLy8gQ2hlY2sgUlNTSQorCS8vCisJcHJpdi0+c3RhdHMubnVtX3Byb2Nlc3NfcGh5aW5mbysrOworCisJLyogcmVjb3JkIHRoZSBnZW5lcmFsIHNpZ25hbCBzdHJlbmd0aCB0byB0aGUgc2xpZGluZyB3aW5kb3cuICovCisKKworCS8vIDwyPiBTaG93ZWQgb24gVUkgZm9yIGVuZ2luZWVyaW5nCisJLy8gaGFyZHdhcmUgZG9lcyBub3QgcHJvdmlkZSByc3NpIGluZm9ybWF0aW9uIGZvciBlYWNoIHJmIHBhdGggaW4gQ0NLCisJaWYoIXBwcmV2aW91c19zdGF0cy0+YklzQ0NLICYmIChwcHJldmlvdXNfc3RhdHMtPmJQYWNrZXRUb1NlbGYgfHwgcHByZXZpb3VzX3N0YXRzLT5iVG9TZWxmQkEpKQorCXsKKwkJZm9yIChyZnBhdGggPSBSRjkwX1BBVEhfQTsgcmZwYXRoIDwgcHJpdi0+TnVtVG90YWxSRlBhdGg7IHJmcGF0aCsrKQorCQl7CisJCSAgICAgaWYgKCFydGw4MTkyX3BoeV9DaGVja0lzTGVnYWxSRlBhdGgocHJpdi0+aWVlZTgwMjExLT5kZXYsIHJmcGF0aCkpCisJCQkJIGNvbnRpbnVlOworCisJCQkvL0ZpeGVkIGJ5IEphY2tlbiAyMDA4LTAzLTIwCisJCQlpZihwcml2LT5zdGF0cy5yeF9yc3NpX3BlcmNlbnRhZ2VbcmZwYXRoXSA9PSAwKQorCQkJeworCQkJCXByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdID0gcHByZXZpb3VzX3N0YXRzLT5SeE1JTU9TaWduYWxTdHJlbmd0aFtyZnBhdGhdOworCQkJCS8vRGJnUHJpbnQoIk1JTU8gUlNTSSBpbml0aWFsaXplIFxuIik7CisJCQl9CisJCQlpZihwcHJldmlvdXNfc3RhdHMtPlJ4TUlNT1NpZ25hbFN0cmVuZ3RoW3JmcGF0aF0gID4gcHJpdi0+c3RhdHMucnhfcnNzaV9wZXJjZW50YWdlW3JmcGF0aF0pCisJCQl7CisJCQkJcHJpdi0+c3RhdHMucnhfcnNzaV9wZXJjZW50YWdlW3JmcGF0aF0gPQorCQkJCQkoIChwcml2LT5zdGF0cy5yeF9yc3NpX3BlcmNlbnRhZ2VbcmZwYXRoXSooUnhfU21vb3RoX0ZhY3Rvci0xKSkgKworCQkJCQkocHByZXZpb3VzX3N0YXRzLT5SeE1JTU9TaWduYWxTdHJlbmd0aFtyZnBhdGhdKSkgLyhSeF9TbW9vdGhfRmFjdG9yKTsKKwkJCQlwcml2LT5zdGF0cy5yeF9yc3NpX3BlcmNlbnRhZ2VbcmZwYXRoXSA9IHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdICArIDE7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcHJpdi0+c3RhdHMucnhfcnNzaV9wZXJjZW50YWdlW3JmcGF0aF0gPQorCQkJCQkoIChwcml2LT5zdGF0cy5yeF9yc3NpX3BlcmNlbnRhZ2VbcmZwYXRoXSooUnhfU21vb3RoX0ZhY3Rvci0xKSkgKworCQkJCQkocHByZXZpb3VzX3N0YXRzLT5SeE1JTU9TaWduYWxTdHJlbmd0aFtyZnBhdGhdKSkgLyhSeF9TbW9vdGhfRmFjdG9yKTsKKwkJCX0KKwkJCVJUX1RSQUNFKENPTVBfREJHLCJwcml2LT5zdGF0cy5yeF9yc3NpX3BlcmNlbnRhZ2VbcmZQYXRoXSAgPSAlZCBcbiIgLHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdICk7CisJCX0KKwl9CisKKworCS8vCisJLy8gQ2hlY2sgUFdEQi4KKwkvLworCVJUX1RSQUNFKENPTVBfUlhERVNDLCAiU21vb3RoICVzIFBXREIgPSAlZFxuIiwKKwkJCQlwcHJldmlvdXNfc3RhdHMtPmJJc0NDSz8gIkNDSyI6ICJPRkRNIiwKKwkJCQlwcHJldmlvdXNfc3RhdHMtPlJ4UFdEQkFsbCk7CisKKwlpZihwcHJldmlvdXNfc3RhdHMtPmJQYWNrZXRCZWFjb24pCisJeworLyogcmVjb3JkIHRoZSBiZWFjb24gcHdkYiB0byB0aGUgc2xpZGluZyB3aW5kb3cuICovCisJCWlmKHNsaWRlX2JlYWNvbl9hZGNfcHdkYl9zdGF0aXN0aWNzKysgPj0gUEhZX0JlYWNvbl9SU1NJX1NMSURfV0lOX01BWCkKKwkJeworCQkJc2xpZGVfYmVhY29uX2FkY19wd2RiX3N0YXRpc3RpY3MgPSBQSFlfQmVhY29uX1JTU0lfU0xJRF9XSU5fTUFYOworCQkJbGFzdF9iZWFjb25fYWRjX3B3ZGIgPSBwcml2LT5zdGF0cy5TbGlkZV9CZWFjb25fcHdkYltzbGlkZV9iZWFjb25fYWRjX3B3ZGJfaW5kZXhdOworCQkJcHJpdi0+c3RhdHMuU2xpZGVfQmVhY29uX1RvdGFsIC09IGxhc3RfYmVhY29uX2FkY19wd2RiOworCQkJLy9EYmdQcmludCgic2xpZGVfYmVhY29uX2FkY19wd2RiX2luZGV4ID0gJWQsIGxhc3RfYmVhY29uX2FkY19wd2RiID0gJWQsIEFkYXB0ZXItPlJ4U3RhdHMuU2xpZGVfQmVhY29uX1RvdGFsID0gJWRcbiIsCisJCQkvLwlzbGlkZV9iZWFjb25fYWRjX3B3ZGJfaW5kZXgsIGxhc3RfYmVhY29uX2FkY19wd2RiLCBBZGFwdGVyLT5SeFN0YXRzLlNsaWRlX0JlYWNvbl9Ub3RhbCk7CisJCX0KKwkJcHJpdi0+c3RhdHMuU2xpZGVfQmVhY29uX1RvdGFsICs9IHBwcmV2aW91c19zdGF0cy0+UnhQV0RCQWxsOworCQlwcml2LT5zdGF0cy5TbGlkZV9CZWFjb25fcHdkYltzbGlkZV9iZWFjb25fYWRjX3B3ZGJfaW5kZXhdID0gcHByZXZpb3VzX3N0YXRzLT5SeFBXREJBbGw7CisJCS8vRGJnUHJpbnQoInNsaWRlX2JlYWNvbl9hZGNfcHdkYl9pbmRleCA9ICVkLCBwUHJldmlvdXNSZmQtPlN0YXR1cy5SeFBXREJBbGwgPSAlZFxuIiwgc2xpZGVfYmVhY29uX2FkY19wd2RiX2luZGV4LCBwUHJldmlvdXNSZmQtPlN0YXR1cy5SeFBXREJBbGwpOworCQlzbGlkZV9iZWFjb25fYWRjX3B3ZGJfaW5kZXgrKzsKKwkJaWYoc2xpZGVfYmVhY29uX2FkY19wd2RiX2luZGV4ID49IFBIWV9CZWFjb25fUlNTSV9TTElEX1dJTl9NQVgpCisJCQlzbGlkZV9iZWFjb25fYWRjX3B3ZGJfaW5kZXggPSAwOworCQlwcHJldmlvdXNfc3RhdHMtPlJ4UFdEQkFsbCA9IHByaXYtPnN0YXRzLlNsaWRlX0JlYWNvbl9Ub3RhbC9zbGlkZV9iZWFjb25fYWRjX3B3ZGJfc3RhdGlzdGljczsKKwkJaWYocHByZXZpb3VzX3N0YXRzLT5SeFBXREJBbGwgPj0gMykKKwkJCXBwcmV2aW91c19zdGF0cy0+UnhQV0RCQWxsIC09IDM7CisJfQorCisJUlRfVFJBQ0UoQ09NUF9SWERFU0MsICJTbW9vdGggJXMgUFdEQiA9ICVkXG4iLAorCQkJCXBwcmV2aW91c19zdGF0cy0+YklzQ0NLPyAiQ0NLIjogIk9GRE0iLAorCQkJCXBwcmV2aW91c19zdGF0cy0+UnhQV0RCQWxsKTsKKworCisJaWYocHByZXZpb3VzX3N0YXRzLT5iUGFja2V0VG9TZWxmIHx8IHBwcmV2aW91c19zdGF0cy0+YlBhY2tldEJlYWNvbiB8fCBwcHJldmlvdXNfc3RhdHMtPmJUb1NlbGZCQSkKKwl7CisJCWlmKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPCAwKQkvLyBpbml0aWFsaXplCisJCXsKKwkJCXByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPSBwcHJldmlvdXNfc3RhdHMtPlJ4UFdEQkFsbDsKKwkJCS8vRGJnUHJpbnQoIkZpcnN0IHB3ZGIgaW5pdGlhbGl6ZSBcbiIpOworCQl9CisJCWlmKHBwcmV2aW91c19zdGF0cy0+UnhQV0RCQWxsID4gKHUzMilwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiKQorCQl7CisJCQlwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID0KKwkJCQkJKCAoKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIpKihSeF9TbW9vdGhfRmFjdG9yLTEpKSArCisJCQkJCShwcHJldmlvdXNfc3RhdHMtPlJ4UFdEQkFsbCkpIC8oUnhfU21vb3RoX0ZhY3Rvcik7CisJCQlwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID0gcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiArIDE7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID0KKwkJCQkJKCAoKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIpKihSeF9TbW9vdGhfRmFjdG9yLTEpKSArCisJCQkJCShwcHJldmlvdXNfc3RhdHMtPlJ4UFdEQkFsbCkpIC8oUnhfU21vb3RoX0ZhY3Rvcik7CisJCX0KKworCX0KKworCS8vCisJLy8gQ2hlY2sgRVZNCisJLy8KKwkvKiByZWNvcmQgdGhlIGdlbmVyYWwgRVZNIHRvIHRoZSBzbGlkaW5nIHdpbmRvdy4gKi8KKwlpZihwcHJldmlvdXNfc3RhdHMtPlNpZ25hbFF1YWxpdHkgPT0gMCkKKwl7CisJfQorCWVsc2UKKwl7CisJCWlmKHBwcmV2aW91c19zdGF0cy0+YlBhY2tldFRvU2VsZiB8fCBwcHJldmlvdXNfc3RhdHMtPmJQYWNrZXRCZWFjb24gfHwgcHByZXZpb3VzX3N0YXRzLT5iVG9TZWxmQkEpeworCQkJaWYoc2xpZGVfZXZtX3N0YXRpc3RpY3MrKyA+PSBQSFlfUlNTSV9TTElEX1dJTl9NQVgpeworCQkJCXNsaWRlX2V2bV9zdGF0aXN0aWNzID0gUEhZX1JTU0lfU0xJRF9XSU5fTUFYOworCQkJCWxhc3RfZXZtID0gcHJpdi0+c3RhdHMuc2xpZGVfZXZtW3NsaWRlX2V2bV9pbmRleF07CisJCQkJcHJpdi0+c3RhdHMuc2xpZGVfZXZtX3RvdGFsIC09IGxhc3RfZXZtOworCQkJfQorCisJCQlwcml2LT5zdGF0cy5zbGlkZV9ldm1fdG90YWwgKz0gcHByZXZpb3VzX3N0YXRzLT5TaWduYWxRdWFsaXR5OworCisJCQlwcml2LT5zdGF0cy5zbGlkZV9ldm1bc2xpZGVfZXZtX2luZGV4KytdID0gcHByZXZpb3VzX3N0YXRzLT5TaWduYWxRdWFsaXR5OworCQkJaWYoc2xpZGVfZXZtX2luZGV4ID49IFBIWV9SU1NJX1NMSURfV0lOX01BWCkKKwkJCQlzbGlkZV9ldm1faW5kZXggPSAwOworCisJCQkvLyA8MT4gU2hvd2VkIG9uIFVJIGZvciB1c2VyLCBpbiBwZXJjZW50YWdlLgorCQkJdG1wX3ZhbCA9IHByaXYtPnN0YXRzLnNsaWRlX2V2bV90b3RhbC9zbGlkZV9ldm1fc3RhdGlzdGljczsKKwkJCXByaXYtPnN0YXRzLnNpZ25hbF9xdWFsaXR5ID0gdG1wX3ZhbDsKKwkJCS8vY29zYSBhZGQgMTAvMTEvMjAwNywgU2hvd2VkIG9uIFVJIGZvciB1c2VyIGluIFdpbmRvd3MgVmlzdGEsIGZvciBMaW5rIHF1YWxpdHkuCisJCQlwcml2LT5zdGF0cy5sYXN0X3NpZ25hbF9zdHJlbmd0aF9pbnBlcmNlbnQgPSB0bXBfdmFsOworCQl9CisKKwkJLy8gPDI+IFNob3dlZCBvbiBVSSBmb3IgZW5naW5lZXJpbmcKKwkJaWYocHByZXZpb3VzX3N0YXRzLT5iUGFja2V0VG9TZWxmIHx8IHBwcmV2aW91c19zdGF0cy0+YlBhY2tldEJlYWNvbiB8fCBwcHJldmlvdXNfc3RhdHMtPmJUb1NlbGZCQSkKKwkJeworCQkJZm9yKG5zcGF0aWFsX3N0cmVhbSA9IDA7IG5zcGF0aWFsX3N0cmVhbTwyIDsgbnNwYXRpYWxfc3RyZWFtKyspIC8vIDIgc3BhdGlhbCBzdHJlYW0KKwkJCXsKKwkJCQlpZihwcHJldmlvdXNfc3RhdHMtPlJ4TUlNT1NpZ25hbFF1YWxpdHlbbnNwYXRpYWxfc3RyZWFtXSAhPSAtMSkKKwkJCQl7CisJCQkJCWlmKHByaXYtPnN0YXRzLnJ4X2V2bV9wZXJjZW50YWdlW25zcGF0aWFsX3N0cmVhbV0gPT0gMCkJLy8gaW5pdGlhbGl6ZQorCQkJCQl7CisJCQkJCQlwcml2LT5zdGF0cy5yeF9ldm1fcGVyY2VudGFnZVtuc3BhdGlhbF9zdHJlYW1dID0gcHByZXZpb3VzX3N0YXRzLT5SeE1JTU9TaWduYWxRdWFsaXR5W25zcGF0aWFsX3N0cmVhbV07CisJCQkJCX0KKwkJCQkJcHJpdi0+c3RhdHMucnhfZXZtX3BlcmNlbnRhZ2VbbnNwYXRpYWxfc3RyZWFtXSA9CisJCQkJCQkoIChwcml2LT5zdGF0cy5yeF9ldm1fcGVyY2VudGFnZVtuc3BhdGlhbF9zdHJlYW1dKiAoUnhfU21vb3RoX0ZhY3Rvci0xKSkgKworCQkJCQkJKHBwcmV2aW91c19zdGF0cy0+UnhNSU1PU2lnbmFsUXVhbGl0eVtuc3BhdGlhbF9zdHJlYW1dKiAxKSkgLyAoUnhfU21vb3RoX0ZhY3Rvcik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246CXJ0bDgxOXhfcXVlcnlfcnhwd3JwZXJjZW50YWdlKCkKKyAqCisgKiBPdmVydmlldzoKKyAqCisgKiBJbnB1dDoJCWNoYXIJCWFudHBvd2VyCisgKgorICogT3V0cHV0OgkJTk9ORQorICoKKyAqIFJldHVybjoJCTAtMTAwIHBlcmNlbnRhZ2UKKyAqCisgKiBSZXZpc2VkIEhpc3Rvcnk6CisgKglXaGVuCQlXaG8JCVJlbWFyaworICoJMDUvMjYvMjAwOAlhbXkJCUNyZWF0ZSBWZXJzaW9uIDAgcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdTggcnRsODE5eF9xdWVyeV9yeHB3cnBlcmNlbnRhZ2UoCisJY2hhcgkJYW50cG93ZXIKKwkpCit7CisJaWYgKChhbnRwb3dlciA8PSAtMTAwKSB8fCAoYW50cG93ZXIgPj0gMjApKQorCXsKKwkJcmV0dXJuCTA7CisJfQorCWVsc2UgaWYgKGFudHBvd2VyID49IDApCisJeworCQlyZXR1cm4JMTAwOworCX0KKwllbHNlCisJeworCQlyZXR1cm4JKDEwMCthbnRwb3dlcik7CisJfQorCit9CS8qIFF1ZXJ5UnhQd3JQZXJjZW50YWdlICovCisKK3N0YXRpYyB1OAorcnRsODE5eF9ldm1fZGJ0b3BlcmNlbnRhZ2UoCisgICAgY2hhciB2YWx1ZQorICAgICkKK3sKKyAgICBjaGFyIHJldF92YWw7CisKKyAgICByZXRfdmFsID0gdmFsdWU7CisKKyAgICBpZihyZXRfdmFsID49IDApCisgICAgICAgIHJldF92YWwgPSAwOworICAgIGlmKHJldF92YWwgPD0gLTMzKQorICAgICAgICByZXRfdmFsID0gLTMzOworICAgIHJldF92YWwgPSAwIC0gcmV0X3ZhbDsKKyAgICByZXRfdmFsKj0zOworCWlmKHJldF92YWwgPT0gOTkpCisJCXJldF92YWwgPSAxMDA7CisgICAgcmV0dXJuKHJldF92YWwpOworfQorLy8KKy8vCURlc2NyaXB0aW9uOgorLy8gCVdlIHdhbnQgZ29vZC1sb29raW5nIGZvciBzaWduYWwgc3RyZW5ndGgvcXVhbGl0eQorLy8JMjAwNy83LzE5IDAxOjA5LCBieSBjb3NhLgorLy8KK2xvbmcKK3J0bDgxOXhfc2lnbmFsX3NjYWxlX21hcHBpbmcoCisJbG9uZyBjdXJyc2lnCisJKQoreworCWxvbmcgcmV0c2lnOworCisJLy8gU3RlcCAxLiBTY2FsZSBtYXBwaW5nLgorCWlmKGN1cnJzaWcgPj0gNjEgJiYgY3VycnNpZyA8PSAxMDApCisJeworCQlyZXRzaWcgPSA5MCArICgoY3VycnNpZyAtIDYwKSAvIDQpOworCX0KKwllbHNlIGlmKGN1cnJzaWcgPj0gNDEgJiYgY3VycnNpZyA8PSA2MCkKKwl7CisJCXJldHNpZyA9IDc4ICsgKChjdXJyc2lnIC0gNDApIC8gMik7CisJfQorCWVsc2UgaWYoY3VycnNpZyA+PSAzMSAmJiBjdXJyc2lnIDw9IDQwKQorCXsKKwkJcmV0c2lnID0gNjYgKyAoY3VycnNpZyAtIDMwKTsKKwl9CisJZWxzZSBpZihjdXJyc2lnID49IDIxICYmIGN1cnJzaWcgPD0gMzApCisJeworCQlyZXRzaWcgPSA1NCArIChjdXJyc2lnIC0gMjApOworCX0KKwllbHNlIGlmKGN1cnJzaWcgPj0gNSAmJiBjdXJyc2lnIDw9IDIwKQorCXsKKwkJcmV0c2lnID0gNDIgKyAoKChjdXJyc2lnIC0gNSkgKiAyKSAvIDMpOworCX0KKwllbHNlIGlmKGN1cnJzaWcgPT0gNCkKKwl7CisJCXJldHNpZyA9IDM2OworCX0KKwllbHNlIGlmKGN1cnJzaWcgPT0gMykKKwl7CisJCXJldHNpZyA9IDI3OworCX0KKwllbHNlIGlmKGN1cnJzaWcgPT0gMikKKwl7CisJCXJldHNpZyA9IDE4OworCX0KKwllbHNlIGlmKGN1cnJzaWcgPT0gMSkKKwl7CisJCXJldHNpZyA9IDk7CisJfQorCWVsc2UKKwl7CisJCXJldHNpZyA9IGN1cnJzaWc7CisJfQorCisJcmV0dXJuIHJldHNpZzsKK30KKworc3RhdGljIHZvaWQgcnRsODE5Ml9xdWVyeV9yeHBoeXN0YXR1cygKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqIHByaXYsCisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqIHBzdGF0cywKKwlyeF9kcnZpbmZvXzgxOXhfdXNiICAqIHBkcnZpbmZvLAorCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKiBwcmVjb3JkX3N0YXRzLAorCWJvb2wgYnBhY2tldF9tYXRjaF9ic3NpZCwKKwlib29sIGJwYWNrZXRfdG9zZWxmLAorCWJvb2wgYlBhY2tldEJlYWNvbiwKKwlib29sIGJUb1NlbGZCQQorCSkKK3sKKwkvL1BSVF9SRkRfU1RBVFVTCQlwUnRSZmRTdGF0dXMgPSAmKHBSZmQtPlN0YXR1cyk7CisJcGh5X3N0c19vZmRtXzgxOXh1c2JfdCoJcG9mZG1fYnVmOworCXBoeV9zdHNfY2NrXzgxOXh1c2JfdAkqCXBjY2tfYnVmOworCXBoeV9vZmRtX3J4X3N0YXR1c19yeHNjX3NnaWVuX2V4aW50ZmZsYWcqIHByeHNjOworCXU4CQkJCSpwcnhwa3Q7CisJdTgJCQkJaSwgbWF4X3NwYXRpYWxfc3RyZWFtLCB0bXBfcnhzbnIsIHRtcF9yeGV2bSwgcnhzY19zZ2llbl9leGZsZzsKKwljaGFyCQkJCXJ4X3B3cls0XSwgcnhfcHdyX2FsbD0wOworCS8vbG9uZwkJCQlyeF9hdmdfcHdyID0gMDsKKwljaGFyCQkJCXJ4X3NuclgsIHJ4X2V2bVg7CisJdTgJCQkJZXZtLCBwd2RiX2FsbDsKKwl1MzIJCQkJUlNTSSwgdG90YWxfcnNzaT0wOy8vLCB0b3RhbF9ldm09MDsKKy8vCWxvbmcJCQkJc2lnbmFsX3N0cmVuZ3RoX2luZGV4ID0gMDsKKwl1OAkJCQlpc19jY2tfcmF0ZT0wOworCXU4CQkJCXJmX3J4X251bSA9IDA7CisKKworCXByaXYtPnN0YXRzLm51bXFyeV9waHlzdGF0dXMrKzsKKworCWlzX2Nja19yYXRlID0gcnhfaGFsX2lzX2Nja19yYXRlKHBkcnZpbmZvKTsKKworCS8vIFJlY29yZCBpdCBmb3IgbmV4dCBwYWNrZXQgcHJvY2Vzc2luZworCW1lbXNldChwcmVjb3JkX3N0YXRzLCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cykpOworCXBzdGF0cy0+YlBhY2tldE1hdGNoQlNTSUQgPSBwcmVjb3JkX3N0YXRzLT5iUGFja2V0TWF0Y2hCU1NJRCA9IGJwYWNrZXRfbWF0Y2hfYnNzaWQ7CisJcHN0YXRzLT5iUGFja2V0VG9TZWxmID0gcHJlY29yZF9zdGF0cy0+YlBhY2tldFRvU2VsZiA9IGJwYWNrZXRfdG9zZWxmOworCXBzdGF0cy0+YklzQ0NLID0gcHJlY29yZF9zdGF0cy0+YklzQ0NLID0gaXNfY2NrX3JhdGU7Ly9SWF9IQUxfSVNfQ0NLX1JBVEUocERydkluZm8pOworCXBzdGF0cy0+YlBhY2tldEJlYWNvbiA9IHByZWNvcmRfc3RhdHMtPmJQYWNrZXRCZWFjb24gPSBiUGFja2V0QmVhY29uOworCXBzdGF0cy0+YlRvU2VsZkJBID0gcHJlY29yZF9zdGF0cy0+YlRvU2VsZkJBID0gYlRvU2VsZkJBOworCisJcHJ4cGt0ID0gKHU4KilwZHJ2aW5mbzsKKworCS8qIE1vdmUgcG9pbnRlciB0byB0aGUgMTZ0aCBieXRlcy4gUGh5IHN0YXR1cyBzdGFydCBhZGRyZXNzLiAqLworCXByeHBrdCArPSBzaXplb2YocnhfZHJ2aW5mb184MTl4X3VzYik7CisKKwkvKiBJbml0aWFsIHRoZSBjY2sgYW5kIG9mZG0gYnVmZmVyIHBvaW50ZXIgKi8KKwlwY2NrX2J1ZiA9IChwaHlfc3RzX2Nja184MTl4dXNiX3QgKilwcnhwa3Q7CisJcG9mZG1fYnVmID0gKHBoeV9zdHNfb2ZkbV84MTl4dXNiX3QgKilwcnhwa3Q7CisKKwlwc3RhdHMtPlJ4TUlNT1NpZ25hbFF1YWxpdHlbMF0gPSAtMTsKKwlwc3RhdHMtPlJ4TUlNT1NpZ25hbFF1YWxpdHlbMV0gPSAtMTsKKwlwcmVjb3JkX3N0YXRzLT5SeE1JTU9TaWduYWxRdWFsaXR5WzBdID0gLTE7CisJcHJlY29yZF9zdGF0cy0+UnhNSU1PU2lnbmFsUXVhbGl0eVsxXSA9IC0xOworCisJaWYoaXNfY2NrX3JhdGUpCisJeworCQkvLworCQkvLyAoMSlIYXJkd2FyZSBkb2VzIG5vdCBwcm92aWRlIFJTU0kgZm9yIENDSworCQkvLworCisJCS8vCisJCS8vICgyKVBXREIsIEF2ZXJhZ2UgUFdEQiBjYWNsdWF0ZWQgYnkgaGFyZHdhcmUgKGZvciByYXRlIGFkYXB0aXZlKQorCQkvLworCQl1OCByZXBvcnQ7Ly8sIGNja19hZ2NfcnB0OworCisJCXByaXYtPnN0YXRzLm51bXFyeV9waHlzdGF0dXNDQ0srKzsKKworCQlpZighcHJpdi0+YkNja0hpZ2hQb3dlcikKKwkJeworCQkJcmVwb3J0ID0gcGNja19idWYtPmNja19hZ2NfcnB0ICYgMHhjMDsKKwkJCXJlcG9ydCA9IHJlcG9ydD4+NjsKKwkJCXN3aXRjaChyZXBvcnQpCisJCQl7CisJCQkJLy9GaXhlZCBieSBKYWNrZW4gZnJvbSBCcnlhbnQgMjAwOC0wMy0yMAorCQkJCS8vT3JpZ2luYWwgdmFsdWUgaXMgLTM4ICwgLTI2ICwgLTE0ICwgLTIKKwkJCQkvL0ZpeGVkIHZhbHVlIGlzIC0zNSAsIC0yMyAsIC0xMSAsIDYKKwkJCQljYXNlIDB4MzoKKwkJCQkJcnhfcHdyX2FsbCA9IC0zNSAtIChwY2NrX2J1Zi0+Y2NrX2FnY19ycHQgJiAweDNlKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDI6CisJCQkJCXJ4X3B3cl9hbGwgPSAtMjMgLSAocGNja19idWYtPmNja19hZ2NfcnB0ICYgMHgzZSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMHgxOgorCQkJCQlyeF9wd3JfYWxsID0gLTExIC0gKHBjY2tfYnVmLT5jY2tfYWdjX3JwdCAmIDB4M2UpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MDoKKwkJCQkJcnhfcHdyX2FsbCA9IDYgLSAocGNja19idWYtPmNja19hZ2NfcnB0ICYgMHgzZSk7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJcmVwb3J0ID0gcGNja19idWYtPmNja19hZ2NfcnB0ICYgMHg2MDsKKwkJCXJlcG9ydCA9IHJlcG9ydD4+NTsKKwkJCXN3aXRjaChyZXBvcnQpCisJCQl7CisJCQkJY2FzZSAweDM6CisJCQkJCXJ4X3B3cl9hbGwgPSAtMzUgLSAoKHBjY2tfYnVmLT5jY2tfYWdjX3JwdCAmIDB4MWYpPDwxKSA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMHgyOgorCQkJCQlyeF9wd3JfYWxsID0gLTIzIC0gKChwY2NrX2J1Zi0+Y2NrX2FnY19ycHQgJiAweDFmKTw8MSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMHgxOgorCQkJCQlyeF9wd3JfYWxsID0gLTExIC0gKChwY2NrX2J1Zi0+Y2NrX2FnY19ycHQgJiAweDFmKTw8MSkgOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MDoKKwkJCQkJcnhfcHdyX2FsbCA9IDYgLSAoKHBjY2tfYnVmLT5jY2tfYWdjX3JwdCAmIDB4MWYpPDwxKSA7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJcHdkYl9hbGwgPSBydGw4MTl4X3F1ZXJ5X3J4cHdycGVyY2VudGFnZShyeF9wd3JfYWxsKTsKKwkJcHN0YXRzLT5SeFBXREJBbGwgPSBwcmVjb3JkX3N0YXRzLT5SeFBXREJBbGwgPSBwd2RiX2FsbDsKKwkJcHN0YXRzLT5SZWN2U2lnbmFsUG93ZXIgPSBwd2RiX2FsbDsKKworCQkvLworCQkvLyAoMykgR2V0IFNpZ25hbCBRdWFsaXR5IChFVk0pCisJCS8vCisJCS8vaWYoYnBhY2tldF9tYXRjaF9ic3NpZCkKKwkJeworCQkJdTgJc3E7CisKKwkJCWlmKHBzdGF0cy0+UnhQV0RCQWxsID4gNDApCisJCQl7CisJCQkJc3EgPSAxMDA7CisJCQl9ZWxzZQorCQkJeworCQkJCXNxID0gcGNja19idWYtPnNxX3JwdDsKKworCQkJCWlmKHBjY2tfYnVmLT5zcV9ycHQgPiA2NCkKKwkJCQkJc3EgPSAwOworCQkJCWVsc2UgaWYgKHBjY2tfYnVmLT5zcV9ycHQgPCAyMCkKKwkJCQkJc3EgPSAxMDA7CisJCQkJZWxzZQorCQkJCQlzcSA9ICgoNjQtc3EpICogMTAwKSAvIDQ0OworCQkJfQorCQkJcHN0YXRzLT5TaWduYWxRdWFsaXR5ID0gcHJlY29yZF9zdGF0cy0+U2lnbmFsUXVhbGl0eSA9IHNxOworCQkJcHN0YXRzLT5SeE1JTU9TaWduYWxRdWFsaXR5WzBdID0gcHJlY29yZF9zdGF0cy0+UnhNSU1PU2lnbmFsUXVhbGl0eVswXSA9IHNxOworCQkJcHN0YXRzLT5SeE1JTU9TaWduYWxRdWFsaXR5WzFdID0gcHJlY29yZF9zdGF0cy0+UnhNSU1PU2lnbmFsUXVhbGl0eVsxXSA9IC0xOworCQl9CisJfQorCWVsc2UKKwl7CisJCXByaXYtPnN0YXRzLm51bXFyeV9waHlzdGF0dXNIVCsrOworCQkvLworCQkvLyAoMSlHZXQgUlNTSSBmb3IgSFQgcmF0ZQorCQkvLworCQlmb3IoaT1SRjkwX1BBVEhfQTsgaTxwcml2LT5OdW1Ub3RhbFJGUGF0aDsgaSsrKQorCQl7CisJCQkvLyAyMDA4LzAxLzMwIE1IIHdlIHdpbGwganVkZ2UgUkYgUlggcGF0aCBub3cuCisJCQlpZiAocHJpdi0+YnJmcGF0aF9yeGVuYWJsZVtpXSkKKwkJCQlyZl9yeF9udW0rKzsKKwkJCWVsc2UKKwkJCQljb250aW51ZTsKKworCQlpZiAoIXJ0bDgxOTJfcGh5X0NoZWNrSXNMZWdhbFJGUGF0aChwcml2LT5pZWVlODAyMTEtPmRldiwgaSkpCisJCQkJY29udGludWU7CisKKwkJCS8vRml4ZWQgYnkgSmFja2VuIGZyb20gQnJ5YW50IDIwMDgtMDMtMjAKKwkJCS8vT3JpZ2luYWwgdmFsdWUgaXMgMTA2CisJCQlyeF9wd3JbaV0gPSAoKHBvZmRtX2J1Zi0+dHJzd19nYWluX1hbaV0mMHgzRikqMikgLSAxMDY7CisKKwkJCS8vR2V0IFJ4IHNuciB2YWx1ZSBpbiBEQgorCQkJdG1wX3J4c25yID0JcG9mZG1fYnVmLT5yeHNucl9YW2ldOworCQkJcnhfc25yWCA9IChjaGFyKSh0bXBfcnhzbnIpOworCQkJLy9yeF9zbnJYID4+PSAxOzsKKwkJCXJ4X3NuclggLz0gMjsKKwkJCXByaXYtPnN0YXRzLnJ4U05SZEJbaV0gPSAobG9uZylyeF9zbnJYOworCisJCQkvKiBUcmFuc2xhdGUgREJNIHRvIHBlcmNlbnRhZ2UuICovCisJCQlSU1NJID0gcnRsODE5eF9xdWVyeV9yeHB3cnBlcmNlbnRhZ2UocnhfcHdyW2ldKTsKKwkJCXRvdGFsX3Jzc2kgKz0gUlNTSTsKKworCQkJLyogUmVjb3JkIFNpZ25hbCBTdHJlbmd0aCBmb3IgbmV4dCBwYWNrZXQgKi8KKwkJCS8vaWYoYnBhY2tldF9tYXRjaF9ic3NpZCkKKwkJCXsKKwkJCQlwc3RhdHMtPlJ4TUlNT1NpZ25hbFN0cmVuZ3RoW2ldID0odTgpIFJTU0k7CisJCQkJcHJlY29yZF9zdGF0cy0+UnhNSU1PU2lnbmFsU3RyZW5ndGhbaV0gPSh1OCkgUlNTSTsKKwkJCX0KKwkJfQorCisKKwkJLy8KKwkJLy8gKDIpUFdEQiwgQXZlcmFnZSBQV0RCIGNhY2x1YXRlZCBieSBoYXJkd2FyZSAoZm9yIHJhdGUgYWRhcHRpdmUpCisJCS8vCisJCS8vRml4ZWQgYnkgSmFja2VuIGZyb20gQnJ5YW50IDIwMDgtMDMtMjAKKwkJLy9PcmlnaW5hbCB2YWx1ZSBpcyAxMDYKKwkJcnhfcHdyX2FsbCA9ICgoKHBvZmRtX2J1Zi0+cHdkYl9hbGwgKSA+PiAxICkmIDB4N2YpIC0xMDY7CisJCXB3ZGJfYWxsID0gcnRsODE5eF9xdWVyeV9yeHB3cnBlcmNlbnRhZ2UocnhfcHdyX2FsbCk7CisKKwkJcHN0YXRzLT5SeFBXREJBbGwgPSBwcmVjb3JkX3N0YXRzLT5SeFBXREJBbGwgPSBwd2RiX2FsbDsKKwkJcHN0YXRzLT5SeFBvd2VyID0gcHJlY29yZF9zdGF0cy0+UnhQb3dlciA9ICByeF9wd3JfYWxsOworCisJCS8vCisJCS8vICgzKUVWTSBvZiBIVCByYXRlCisJCS8vCisJCWlmKHBkcnZpbmZvLT5SeEhUICYmIHBkcnZpbmZvLT5SeFJhdGU+PURFU0M5MF9SQVRFTUNTOCAmJgorCQkJcGRydmluZm8tPlJ4UmF0ZTw9REVTQzkwX1JBVEVNQ1MxNSkKKwkJCW1heF9zcGF0aWFsX3N0cmVhbSA9IDI7IC8vYm90aCBzcGF0aWFsIHN0cmVhbSBtYWtlIHNlbnNlCisJCWVsc2UKKwkJCW1heF9zcGF0aWFsX3N0cmVhbSA9IDE7IC8vb25seSBzcGF0aWFsIHN0cmVhbSAxIG1ha2VzIHNlbnNlCisKKwkJZm9yKGk9MDsgaTxtYXhfc3BhdGlhbF9zdHJlYW07IGkrKykKKwkJeworCQkJdG1wX3J4ZXZtID0JcG9mZG1fYnVmLT5yeGV2bV9YW2ldOworCQkJcnhfZXZtWCA9IChjaGFyKSh0bXBfcnhldm0pOworCisJCQkvLyBEbyBub3QgdXNlIHNoaWZ0IG9wZXJhdGlvbiBsaWtlICJyeF9ldm1YID4+PSAxIiBiZWNhdXNlIHRoZSBjb21waWxvciBvZiBmcmVlIGJ1aWxkIGVudmlyb25tZW50CisJCQkvLyBmaWxsIG1vc3Qgc2lnbmlmaWNhbnQgYml0IHRvICJ6ZXJvIiB3aGVuIGRvaW5nIHNoaWZ0aW5nIG9wZXJhdGlvbiB3aGljaCBtYXkgY2hhbmdlIGEgbmVnYXRpdmUKKwkJCS8vIHZhbHVlIHRvIHBvc2l0aXZlIG9uZSwgdGhlbiB0aGUgZGJtIHZhbHVlICh3aGljaCBpcyBzdXBwb3NlZCB0byBiZSBuZWdhdGl2ZSkgIGlzIG5vdCBjb3JyZWN0IGFueW1vcmUuCisJCQlyeF9ldm1YIC89IDI7CS8vZGJtCisKKwkJCWV2bSA9IHJ0bDgxOXhfZXZtX2RidG9wZXJjZW50YWdlKHJ4X2V2bVgpOworCQkJLy9pZihicGFja2V0X21hdGNoX2Jzc2lkKQorCQkJeworCQkJCWlmKGk9PTApIC8vIEZpbGwgdmFsdWUgaW4gUkZELCBHZXQgdGhlIGZpcnN0IHNwYXRpYWwgc3RyZWFtIG9ubHkKKwkJCQkJcHN0YXRzLT5TaWduYWxRdWFsaXR5ID0gcHJlY29yZF9zdGF0cy0+U2lnbmFsUXVhbGl0eSA9ICh1OCkoZXZtICYgMHhmZik7CisJCQkJcHN0YXRzLT5SeE1JTU9TaWduYWxRdWFsaXR5W2ldID0gcHJlY29yZF9zdGF0cy0+UnhNSU1PU2lnbmFsUXVhbGl0eVtpXSA9ICh1OCkoZXZtICYgMHhmZik7CisJCQl9CisJCX0KKworCisJCS8qIHJlY29yZCByeCBzdGF0aXN0aWNzIGZvciBkZWJ1ZyAqLworCQlyeHNjX3NnaWVuX2V4ZmxnID0gcG9mZG1fYnVmLT5yeHNjX3NnaWVuX2V4ZmxnOworCQlwcnhzYyA9CShwaHlfb2ZkbV9yeF9zdGF0dXNfcnhzY19zZ2llbl9leGludGZmbGFnICopJnJ4c2Nfc2dpZW5fZXhmbGc7CisJCWlmKHBkcnZpbmZvLT5CVykJLy80ME0gY2hhbm5lbAorCQkJcHJpdi0+c3RhdHMucmVjZWl2ZWRfYnd0eXBlWzErcHJ4c2MtPnJ4c2NdKys7CisJCWVsc2UJCQkJLy8yME0gY2hhbm5lbAorCQkJcHJpdi0+c3RhdHMucmVjZWl2ZWRfYnd0eXBlWzBdKys7CisJfQorCisJLy9VSSBCU1MgTGlzdCBzaWduYWwgc3RyZW5ndGgoaW4gcGVyY2VudGFnZSksIG1ha2UgaXQgZ29vZCBsb29raW5nLCBmcm9tIDB+MTAwLgorCS8vSXQgaXMgYXNzaWduZWQgdG8gdGhlIEJTUyBMaXN0IGluIEdldFZhbHVlRnJvbUJlYWNvbk9yUHJvYmVSc3AoKS4KKwlpZihpc19jY2tfcmF0ZSkKKwl7CisJCXBzdGF0cy0+U2lnbmFsU3RyZW5ndGggPSBwcmVjb3JkX3N0YXRzLT5TaWduYWxTdHJlbmd0aCA9ICh1OCkocnRsODE5eF9zaWduYWxfc2NhbGVfbWFwcGluZygobG9uZylwd2RiX2FsbCkpOy8vUFdEQl9BTEw7CisKKwl9CisJZWxzZQorCXsKKwkJLy9wUmZkLT5TdGF0dXMuU2lnbmFsU3RyZW5ndGggPSBwUmVjb3JkUmZkLT5TdGF0dXMuU2lnbmFsU3RyZW5ndGggPSAodTgpKFNpZ25hbFNjYWxlTWFwcGluZyh0b3RhbF9yc3NpLz1SRjkwX1BBVEhfTUFYKSk7Ly8odTgpKHRvdGFsX3Jzc2kvPVJGOTBfUEFUSF9NQVgpOworCQkvLyBXZSBjYW4ganVkZ2UgUlggcGF0aCBudW1iZXIgbm93LgorCQlpZiAocmZfcnhfbnVtICE9IDApCisJCQlwc3RhdHMtPlNpZ25hbFN0cmVuZ3RoID0gcHJlY29yZF9zdGF0cy0+U2lnbmFsU3RyZW5ndGggPSAodTgpKHJ0bDgxOXhfc2lnbmFsX3NjYWxlX21hcHBpbmcoKGxvbmcpKHRvdGFsX3Jzc2kvPXJmX3J4X251bSkpKTsKKwl9Cit9CS8qIFF1ZXJ5UnhQaHlTdGF0dXM4MTkwUGNpICovCisKK3ZvaWQKK3J0bDgxOTJfcmVjb3JkX3J4ZGVzY19mb3JsYXRlcnVzZSgKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICoJcHNyY19zdGF0cywKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICoJcHRhcmdldF9zdGF0cworKQoreworCXB0YXJnZXRfc3RhdHMtPmJJc0FNUERVID0gcHNyY19zdGF0cy0+YklzQU1QRFU7CisJcHRhcmdldF9zdGF0cy0+YkZpcnN0TVBEVSA9IHBzcmNfc3RhdHMtPmJGaXJzdE1QRFU7CisJcHRhcmdldF9zdGF0cy0+U2VxX051bSA9IHBzcmNfc3RhdHMtPlNlcV9OdW07Cit9CisKKwordm9pZCBUcmFuc2xhdGVSeFNpZ25hbFN0dWZmODE5eFVzYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKiBwc3RhdHMsCisJCQkJICAgcnhfZHJ2aW5mb184MTl4X3VzYiAgKnBkcnZpbmZvKQoreworCS8vIFRPRE86IFdlIG11c3Qgb25seSBjaGVjayBwYWNrZXQgZm9yIGN1cnJlbnQgTUFDIGFkZHJlc3MuIE5vdCBmaW5pc2gKKwlydGw4MTkyX3J4X2luZm8gKmluZm8gPSAoc3RydWN0IHJ0bDgxOTJfcnhfaW5mbyAqKXNrYi0+Y2I7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldj1pbmZvLT5kZXY7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCWJvb2wgYnBhY2tldF9tYXRjaF9ic3NpZCwgYnBhY2tldF90b3NlbGY7CisJYm9vbCBiUGFja2V0QmVhY29uPUZBTFNFLCBiVG9TZWxmQkE9RkFMU0U7CisJc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgIHByZXZpb3VzX3N0YXRzOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICpoZHI7Ly9ieSBhbXkKKyAgICAgICB1MTYgZmMsdHlwZTsKKworCS8vIEdldCBTaWduYWwgUXVhbGl0eSBmb3Igb25seSBSWCBkYXRhIHF1ZXVlIChidXQgbm90IGNvbW1hbmQgcXVldWUpCisKKwl1OCogdG1wX2J1ZjsKKwkvL3UxNiB0bXBfYnVmX2xlbiA9IDA7CisJdTggICpwcmFkZHI7CisKKwkvKiBHZXQgTUFDIGZyYW1lIHN0YXJ0IGFkZHJlc3MuICovCisJdG1wX2J1ZiA9ICh1OCopc2tiLT5kYXRhOy8vICsgZ2V0X3J4cGFja2V0X3NoaWZ0Ynl0ZXNfODE5eHVzYihwc3RhdHMpOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopdG1wX2J1ZjsKKwlmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKKwl0eXBlID0gV0xBTl9GQ19HRVRfVFlQRShmYyk7CisJcHJhZGRyID0gaGRyLT5hZGRyMTsKKworCS8qIENoZWNrIGlmIHRoZSByZWNlaXZlZCBwYWNrZXQgaXMgYWNjZXB0YWJlLiAqLworCWJwYWNrZXRfbWF0Y2hfYnNzaWQgPSAoKElFRUU4MDIxMV9GVFlQRV9DVEwgIT0gdHlwZSkgJiYKKwkJCQkJCQkoZXFNYWNBZGRyKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCAgKGZjICYgSUVFRTgwMjExX0ZDVExfVE9EUyk/IGhkci0+YWRkcjEgOiAoZmMgJiBJRUVFODAyMTFfRkNUTF9GUk9NRFMgKT8gaGRyLT5hZGRyMiA6IGhkci0+YWRkcjMpKQorCQkJCQkJCQkgJiYgKCFwc3RhdHMtPmJId0Vycm9yKSAmJiAoIXBzdGF0cy0+YkNSQykmJiAoIXBzdGF0cy0+YklDVikpOworCWJwYWNrZXRfdG9zZWxmID0gIGJwYWNrZXRfbWF0Y2hfYnNzaWQgJiAoZXFNYWNBZGRyKHByYWRkciwgcHJpdi0+aWVlZTgwMjExLT5kZXYtPmRldl9hZGRyKSk7CisKKwkJaWYoV0xBTl9GQ19HRVRfRlJBTUVUWVBFKGZjKT09IElFRUU4MDIxMV9TVFlQRV9CRUFDT04pCisJCXsKKwkJCWJQYWNrZXRCZWFjb24gPSB0cnVlOworCQkJLy9EYmdQcmludCgiQmVhY29uIDIsIE1hdGNoQlNTSUQgPSAlZCwgVG9TZWxmID0gJWQgXG4iLCBiUGFja2V0TWF0Y2hCU1NJRCwgYlBhY2tldFRvU2VsZik7CisJCX0KKwkJaWYoV0xBTl9GQ19HRVRfRlJBTUVUWVBFKGZjKSA9PSBJRUVFODAyMTFfU1RZUEVfQkxPQ0tBQ0spCisJCXsKKwkJCWlmKChlcU1hY0FkZHIocHJhZGRyLGRldi0+ZGV2X2FkZHIpKSkKKwkJCQliVG9TZWxmQkEgPSB0cnVlOworCQkJCS8vRGJnUHJpbnQoIkJsb2NrQWNrLCBNYXRjaEJTU0lEID0gJWQsIFRvU2VsZiA9ICVkIFxuIiwgYlBhY2tldE1hdGNoQlNTSUQsIGJQYWNrZXRUb1NlbGYpOworCQl9CisKKworCisJaWYoYnBhY2tldF9tYXRjaF9ic3NpZCkKKwl7CisJCXByaXYtPnN0YXRzLm51bXBhY2tldF9tYXRjaGJzc2lkKys7CisJfQorCWlmKGJwYWNrZXRfdG9zZWxmKXsKKwkJcHJpdi0+c3RhdHMubnVtcGFja2V0X3Rvc2VsZisrOworCX0KKwkvLworCS8vIFByb2Nlc3MgUEhZIGluZm9ybWF0aW9uIGZvciBwcmV2aW91cyBwYWNrZXQgKFJTU0kvUFdEQi9FVk0pCisJLy8KKwkvLyBCZWNhdXNlIHBoeSBpbmZvcm1hdGlvbiBpcyBjb250YWluZWQgaW4gdGhlIGxhc3QgcGFja2V0IG9mIEFNUERVIG9ubHksIHNvIGRyaXZlcgorCS8vIHNob3VsZCBwcm9jZXNzIHBoeSBpbmZvcm1hdGlvbiBvZiBwcmV2aW91cyBwYWNrZXQKKwlydGw4MTkyX3Byb2Nlc3NfcGh5aW5mbyhwcml2LCB0bXBfYnVmLCAmcHJldmlvdXNfc3RhdHMsIHBzdGF0cyk7CisJcnRsODE5Ml9xdWVyeV9yeHBoeXN0YXR1cyhwcml2LCBwc3RhdHMsIHBkcnZpbmZvLCAmcHJldmlvdXNfc3RhdHMsIGJwYWNrZXRfbWF0Y2hfYnNzaWQsYnBhY2tldF90b3NlbGYsYlBhY2tldEJlYWNvbixiVG9TZWxmQkEpOworCXJ0bDgxOTJfcmVjb3JkX3J4ZGVzY19mb3JsYXRlcnVzZShwc3RhdHMsICZwcmV2aW91c19zdGF0cyk7CisKK30KKworLyoqCisqIEZ1bmN0aW9uOglVcGRhdGVSZWNlaXZlZFJhdGVIaXN0b2dyYW1TdGF0aXN0aWNzCisqIE92ZXJ2aWV3OglSZWNvcmVkIGRvd24gdGhlIHJlY2VpdmVkIGRhdGEgcmF0ZQorKgorKiBJbnB1dDoKKyogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKyoJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqc3RhdHMKKyoKKyogT3V0cHV0OgorKgorKgkJCShwcml2LT5zdGF0cy5SZWNlaXZlZFJhdGVIaXN0b2dyYW1bXSBpcyB1cGRhdGVkKQorKiBSZXR1cm46CisqCQlOb25lCisqLwordm9pZAorVXBkYXRlUmVjZWl2ZWRSYXRlSGlzdG9ncmFtU3RhdGlzdGljczgxOTAoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cworCSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIHJjdlR5cGU9MTsgICAvLzA6IFRvdGFsLCAxOk9LLCAyOkNSQywgMzpJQ1YKKwl1MzIgcmF0ZUluZGV4OworCXUzMiBwcmVhbWJsZV9ndWFyZGludGVydmFsOyAgLy8xOiBzaG9ydCBwcmVhbWJsZS9HSSwgMDogbG9uZyBwcmVhbWJsZS9HSQorCisKKwlpZihzdGF0cy0+YkNSQykKKwlyY3ZUeXBlID0gMjsKKwllbHNlIGlmKHN0YXRzLT5iSUNWKQorCXJjdlR5cGUgPSAzOworCisJaWYoc3RhdHMtPmJTaG9ydFByZWFtYmxlKQorCXByZWFtYmxlX2d1YXJkaW50ZXJ2YWwgPSAxOy8vIHNob3J0CisJZWxzZQorCXByZWFtYmxlX2d1YXJkaW50ZXJ2YWwgPSAwOy8vIGxvbmcKKworCXN3aXRjaChzdGF0cy0+cmF0ZSkKKwl7CisJCS8vCisJCS8vIENDSyByYXRlCisJCS8vCisJCWNhc2UgTUdOXzFNOiAgICByYXRlSW5kZXggPSAwOyAgYnJlYWs7CisJCWNhc2UgTUdOXzJNOiAgICByYXRlSW5kZXggPSAxOyAgYnJlYWs7CisJCWNhc2UgTUdOXzVfNU06ICByYXRlSW5kZXggPSAyOyAgYnJlYWs7CisJCWNhc2UgTUdOXzExTTogICByYXRlSW5kZXggPSAzOyAgYnJlYWs7CisJCS8vCisJCS8vIExlZ2FjeSBPRkRNIHJhdGUKKwkJLy8KKwkJY2FzZSBNR05fNk06ICAgIHJhdGVJbmRleCA9IDQ7ICBicmVhazsKKwkJY2FzZSBNR05fOU06ICAgIHJhdGVJbmRleCA9IDU7ICBicmVhazsKKwkJY2FzZSBNR05fMTJNOiAgIHJhdGVJbmRleCA9IDY7ICBicmVhazsKKwkJY2FzZSBNR05fMThNOiAgIHJhdGVJbmRleCA9IDc7ICBicmVhazsKKwkJY2FzZSBNR05fMjRNOiAgIHJhdGVJbmRleCA9IDg7ICBicmVhazsKKwkJY2FzZSBNR05fMzZNOiAgIHJhdGVJbmRleCA9IDk7ICBicmVhazsKKwkJY2FzZSBNR05fNDhNOiAgIHJhdGVJbmRleCA9IDEwOyBicmVhazsKKwkJY2FzZSBNR05fNTRNOiAgIHJhdGVJbmRleCA9IDExOyBicmVhazsKKwkJLy8KKwkJLy8gMTFuIEhpZ2ggdGhyb3VnaHB1dCByYXRlCisJCS8vCisJCWNhc2UgTUdOX01DUzA6ICByYXRlSW5kZXggPSAxMjsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzE6ICByYXRlSW5kZXggPSAxMzsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzI6ICByYXRlSW5kZXggPSAxNDsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzM6ICByYXRlSW5kZXggPSAxNTsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzQ6ICByYXRlSW5kZXggPSAxNjsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzU6ICByYXRlSW5kZXggPSAxNzsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzY6ICByYXRlSW5kZXggPSAxODsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzc6ICByYXRlSW5kZXggPSAxOTsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzg6ICByYXRlSW5kZXggPSAyMDsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzk6ICByYXRlSW5kZXggPSAyMTsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzEwOiByYXRlSW5kZXggPSAyMjsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzExOiByYXRlSW5kZXggPSAyMzsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzEyOiByYXRlSW5kZXggPSAyNDsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzEzOiByYXRlSW5kZXggPSAyNTsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzE0OiByYXRlSW5kZXggPSAyNjsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzE1OiByYXRlSW5kZXggPSAyNzsgYnJlYWs7CisJCWRlZmF1bHQ6ICAgICAgICByYXRlSW5kZXggPSAyODsgYnJlYWs7CisJfQorICAgIHByaXYtPnN0YXRzLnJlY2VpdmVkX3ByZWFtYmxlX0dJW3ByZWFtYmxlX2d1YXJkaW50ZXJ2YWxdW3JhdGVJbmRleF0rKzsKKyAgICBwcml2LT5zdGF0cy5yZWNlaXZlZF9yYXRlX2hpc3RvZ3JhbVswXVtyYXRlSW5kZXhdKys7IC8vdG90YWwKKyAgICBwcml2LT5zdGF0cy5yZWNlaXZlZF9yYXRlX2hpc3RvZ3JhbVtyY3ZUeXBlXVtyYXRlSW5kZXhdKys7Cit9CisKKwordm9pZCBxdWVyeV9yeGRlc2Nfc3RhdHVzKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzLCBib29sIGJJc1J4QWdnclN1YmZyYW1lKQoreworCXJ0bDgxOTJfcnhfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgcnRsODE5Ml9yeF9pbmZvICopc2tiLT5jYjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2PWluZm8tPmRldjsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJLy9yeF9kZXNjXzgxOXhfdXNiICpkZXNjID0gKHJ4X2Rlc2NfODE5eF91c2IgKilza2ItPmRhdGE7CisJcnhfZHJ2aW5mb184MTl4X3VzYiAgKmRyaXZlcl9pbmZvID0gTlVMTDsKKworCS8vCisJLy9HZXQgUnggRGVzY3JpcHRvciBJbmZvcm1hdGlvbgorCS8vCisjaWZkZWYgVVNCX1JYX0FHR1JFR0FUSU9OX1NVUFBPUlQKKwlpZiAoYklzUnhBZ2dyU3ViZnJhbWUpCisJeworCQlyeF9kZXNjXzgxOXhfdXNiX2FnZ3Jfc3ViZnJhbWUgKmRlc2MgPSAocnhfZGVzY184MTl4X3VzYl9hZ2dyX3N1YmZyYW1lICopc2tiLT5kYXRhOworCQlzdGF0cy0+TGVuZ3RoID0gZGVzYy0+TGVuZ3RoIDsKKwkJc3RhdHMtPlJ4RHJ2SW5mb1NpemUgPSBkZXNjLT5SeERydkluZm9TaXplOworCQlzdGF0cy0+UnhCdWZTaGlmdCA9IDA7IC8vUnhCdWZTaGlmdCA9IDIgaW4gUnhEZXNjLCBidXQgdXNiIGRpZG4ndCBzaGlmdCBieXRlcyBpbiBmYWN0LgorCQlzdGF0cy0+YklDViA9IGRlc2MtPklDVjsKKwkJc3RhdHMtPmJDUkMgPSBkZXNjLT5DUkMzMjsKKwkJc3RhdHMtPmJId0Vycm9yID0gc3RhdHMtPmJDUkN8c3RhdHMtPmJJQ1Y7CisJCXN0YXRzLT5EZWNyeXB0ZWQgPSAhZGVzYy0+U1dEZWM7Ly9SVEw4MTkwIHNldCB0aGlzIGJpdCB0byBpbmRpY2F0ZSB0aGF0IEh3IGRvZXMgbm90IGRlY3J5cHQgcGFja2V0CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCXJ4X2Rlc2NfODE5eF91c2IgKmRlc2MgPSAocnhfZGVzY184MTl4X3VzYiAqKXNrYi0+ZGF0YTsKKworCQlzdGF0cy0+TGVuZ3RoID0gZGVzYy0+TGVuZ3RoOworCQlzdGF0cy0+UnhEcnZJbmZvU2l6ZSA9IGRlc2MtPlJ4RHJ2SW5mb1NpemU7CisJCXN0YXRzLT5SeEJ1ZlNoaWZ0ID0gMDsvL2Rlc2MtPlNoaWZ0JjB4MDM7CisJCXN0YXRzLT5iSUNWID0gZGVzYy0+SUNWOworCQlzdGF0cy0+YkNSQyA9IGRlc2MtPkNSQzMyOworCQlzdGF0cy0+Ykh3RXJyb3IgPSBzdGF0cy0+YkNSQ3xzdGF0cy0+YklDVjsKKwkJLy9SVEw4MTkwIHNldCB0aGlzIGJpdCB0byBpbmRpY2F0ZSB0aGF0IEh3IGRvZXMgbm90IGRlY3J5cHQgcGFja2V0CisJCXN0YXRzLT5EZWNyeXB0ZWQgPSAhZGVzYy0+U1dEZWM7CisJfQorCisJaWYoKHByaXYtPmllZWU4MDIxMS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPT0gdHJ1ZSkgJiYgKHByaXYtPmllZWU4MDIxMS0+cGFpcndpc2Vfa2V5X3R5cGUgPT0gS0VZX1RZUEVfQ0NNUCkpCisJeworCQlzdGF0cy0+Ykh3RXJyb3IgPSBmYWxzZTsKKwl9CisJZWxzZQorCXsKKwkJc3RhdHMtPmJId0Vycm9yID0gc3RhdHMtPmJDUkN8c3RhdHMtPmJJQ1Y7CisJfQorCisJaWYoc3RhdHMtPkxlbmd0aCA8IDI0IHx8IHN0YXRzLT5MZW5ndGggPiBNQVhfODE5MlVfUlhfU0laRSkKKwkJc3RhdHMtPmJId0Vycm9yIHw9IDE7CisJLy8KKwkvL0dldCBEcml2ZXIgSW5mbworCS8vCisJLy8gVE9ETzogTmVlZCB0byB2ZXJpZnkgaXQgb24gRkdQQSBwbGF0Zm9ybQorCS8vRHJpdmVyIGluZm8gYXJlIHdyaXR0ZW4gdG8gdGhlIFJ4QnVmZmVyIGZvbGxvd2luZyByeCBkZXNjCisJaWYgKHN0YXRzLT5SeERydkluZm9TaXplICE9IDApIHsKKwkJZHJpdmVyX2luZm8gPSAocnhfZHJ2aW5mb184MTl4X3VzYiAqKShza2ItPmRhdGEgKyBzaXplb2YocnhfZGVzY184MTl4X3VzYikgKyBcCisJCQkJc3RhdHMtPlJ4QnVmU2hpZnQpOworCQkvKiB1bml0OiAwLjVNICovCisJCS8qIFRPRE8gKi8KKwkJaWYoIXN0YXRzLT5iSHdFcnJvcil7CisJCQl1OAlyZXRfcmF0ZTsKKwkJCXJldF9yYXRlID0gSHdSYXRlVG9NUmF0ZTkwKGRyaXZlcl9pbmZvLT5SeEhULCBkcml2ZXJfaW5mby0+UnhSYXRlKTsKKwkJCWlmKHJldF9yYXRlID09IDB4ZmYpCisJCQl7CisJCQkJLy8gQWJub3JtYWwgQ2FzZTogUmVjZWl2ZSBDUkMgT0sgcGFja2V0IHdpdGggUnggZGVzY3JpcHRvciBpbmRpY2F0aW5nIG5vbiBzdXBwb3J0ZWQgcmF0ZS4KKwkJCQkvLyBTcGVjaWFsIEVycm9yIEhhbmRsaW5nIGhlcmUsIDIwMDguMDUuMTYsIGJ5IEVtaWx5CisKKwkJCQlzdGF0cy0+Ykh3RXJyb3IgPSAxOworCQkJCXN0YXRzLT5yYXRlID0gTUdOXzFNOwkvL1NldCAxTSByYXRlIGJ5IGRlZmF1bHQKKwkJCX1lbHNlCisJCQl7CisJCQkJc3RhdHMtPnJhdGUgPSByZXRfcmF0ZTsKKwkJCX0KKwkJfQorCQllbHNlCisJCQlzdGF0cy0+cmF0ZSA9IDB4MDI7CisKKwkJc3RhdHMtPmJTaG9ydFByZWFtYmxlID0gZHJpdmVyX2luZm8tPlNQTENQOworCisKKwkJVXBkYXRlUmVjZWl2ZWRSYXRlSGlzdG9ncmFtU3RhdGlzdGljczgxOTAoZGV2LCBzdGF0cyk7CisKKwkJc3RhdHMtPmJJc0FNUERVID0gKGRyaXZlcl9pbmZvLT5QYXJ0QWdncj09MSk7CisJCXN0YXRzLT5iRmlyc3RNUERVID0gKGRyaXZlcl9pbmZvLT5QYXJ0QWdncj09MSkgJiYgKGRyaXZlcl9pbmZvLT5GaXJzdEFHR1I9PTEpOworCQlzdGF0cy0+VGltZVN0YW1wTG93ID0gZHJpdmVyX2luZm8tPlRTRkw7CisJCS8vIHhpb25nIG1hc2sgaXQsIDA3MDUxNAorCQkvL3BSZmQtPlN0YXR1cy5UaW1lU3RhbXBIaWdoID0gUGxhdGZvcm1FRklPUmVhZDRCeXRlKEFkYXB0ZXIsIFRTRlIrNCk7CisJCS8vIHN0YXRzLT5UaW1lU3RhbXBIaWdoID0gcmVhZF9uaWNfZHdvcmQoZGV2LCAgVFNGUis0KTsKKworCQlVcGRhdGVSeFBrdFRpbWVTdGFtcDgxOTAoZGV2LCBzdGF0cyk7CisKKwkJLy8KKwkJLy8gUnggQS1NUERVCisJCS8vCisJCWlmKGRyaXZlcl9pbmZvLT5GaXJzdEFHR1I9PTEgfHwgZHJpdmVyX2luZm8tPlBhcnRBZ2dyID09IDEpCisJCQlSVF9UUkFDRShDT01QX1JYREVTQywgImRyaXZlcl9pbmZvLT5GaXJzdEFHR1IgPSAlZCwgZHJpdmVyX2luZm8tPlBhcnRBZ2dyID0gJWRcbiIsCisJCQkJCWRyaXZlcl9pbmZvLT5GaXJzdEFHR1IsIGRyaXZlcl9pbmZvLT5QYXJ0QWdncik7CisKKwl9CisKKwlza2JfcHVsbChza2Isc2l6ZW9mKHJ4X2Rlc2NfODE5eF91c2IpKTsKKwkvLworCS8vIEdldCBUb3RhbCBvZmZzZXQgb2YgTVBEVSBGcmFtZSBCb2R5CisJLy8KKwlpZigoc3RhdHMtPlJ4QnVmU2hpZnQgKyBzdGF0cy0+UnhEcnZJbmZvU2l6ZSkgPiAwKSB7CisJCXN0YXRzLT5iU2hpZnQgPSAxOworCQlza2JfcHVsbChza2Isc3RhdHMtPlJ4QnVmU2hpZnQgKyBzdGF0cy0+UnhEcnZJbmZvU2l6ZSk7CisJfQorCisjaWZkZWYgVVNCX1JYX0FHR1JFR0FUSU9OX1NVUFBPUlQKKwkvKiBmb3IgdGhlIHJ4IGFnZ3JlZ2F0ZWQgc3ViIGZyYW1lLCB0aGUgcmVkdW5kYW50IHNwYWNlIHRydWVsbHkgY29udGFpbmVkIGluIHRoZSBwYWNrZXQgKi8KKwlpZihiSXNSeEFnZ3JTdWJmcmFtZSkgeworCQlza2JfcHVsbChza2IsIDgpOworCX0KKyNlbmRpZgorCS8qIGZvciBkZWJ1ZyAyMDA4LjUuMjkgKi8KKworCS8vYWRkZWQgYnkgdml2aSwgZm9yIE1QLCAyMDA4MDEwOAorCXN0YXRzLT5SeElzNDBNSHpQYWNrZXQgPSBkcml2ZXJfaW5mby0+Qlc7CisJaWYoc3RhdHMtPlJ4RHJ2SW5mb1NpemUgIT0gMCkKKwkJVHJhbnNsYXRlUnhTaWduYWxTdHVmZjgxOXhVc2Ioc2tiLCBzdGF0cywgZHJpdmVyX2luZm8pOworCit9CisKK3UzMiBHZXRSeFBhY2tldFNoaWZ0Qnl0ZXM4MTl4VXNiKHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgICpTdGF0dXMsIGJvb2wgYklzUnhBZ2dyU3ViZnJhbWUpCit7CisjaWZkZWYgVVNCX1JYX0FHR1JFR0FUSU9OX1NVUFBPUlQKKwlpZiAoYklzUnhBZ2dyU3ViZnJhbWUpCisJCXJldHVybiAoc2l6ZW9mKHJ4X2Rlc2NfODE5eF91c2IpICsgU3RhdHVzLT5SeERydkluZm9TaXplCisJCQkrIFN0YXR1cy0+UnhCdWZTaGlmdCArIDgpOworCWVsc2UKKyNlbmRpZgorCQlyZXR1cm4gKHNpemVvZihyeF9kZXNjXzgxOXhfdXNiKSArIFN0YXR1cy0+UnhEcnZJbmZvU2l6ZQorCQkJCSsgU3RhdHVzLT5SeEJ1ZlNoaWZ0KTsKK30KKwordm9pZCBydGw4MTkyX3J4X25vbWFsKHN0cnVjdCBza19idWZmKiBza2IpCit7CisJcnRsODE5Ml9yeF9pbmZvICppbmZvID0gKHN0cnVjdCBydGw4MTkyX3J4X2luZm8gKilza2ItPmNiOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY9aW5mby0+ZGV2OworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzIHN0YXRzID0geworCQkuc2lnbmFsID0gMCwKKwkJLm5vaXNlID0gLTk4LAorCQkucmF0ZSA9IDAsCisJCS8vICAgICAgLm1hY190aW1lID0gamlmZmllcywKKwkJLmZyZXEgPSBJRUVFODAyMTFfMjRHSFpfQkFORCwKKwl9OworCXUzMiByeF9wa3RfbGVuID0gMDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8xYWRkciAqaWVlZTgwMjExX2hkciA9IE5VTEw7CisJYm9vbCB1bmljYXN0X3BhY2tldCA9IGZhbHNlOworI2lmZGVmIFVTQl9SWF9BR0dSRUdBVElPTl9TVVBQT1JUCisJc3RydWN0IHNrX2J1ZmYgKmFnZ19za2IgPSBOVUxMOworCXUzMiAgVG90YWxMZW5ndGggPSAwOworCXUzMiAgVGVtcERXb3JkID0gMDsKKwl1MzIgIFBhY2tldExlbmd0aCA9IDA7CisJdTMyICBQYWNrZXRPY2N1cGllZExlbmR0aCA9IDA7CisJdTggICBUZW1wQnl0ZSA9IDA7CisJdTMyICBQYWNrZXRTaGlmdEJ5dGVzID0gMDsKKwlyeF9kZXNjXzgxOXhfdXNiX2FnZ3Jfc3ViZnJhbWUgKlJ4RGVzY3IgPSBOVUxMOworCXU4ICBQYWRkaW5nQnl0ZXMgPSAwOworCS8vYWRkIGp1c3QgZm9yIHRlc3RpbmcKKwl1OCAgIHRlc3Rpbmc7CisKKyNlbmRpZgorCisJLyogMjAgaXMgZm9yIHBzLXBvbGwgKi8KKwlpZigoc2tiLT5sZW4gPj0oMjAgKyBzaXplb2YocnhfZGVzY184MTl4X3VzYikpKSAmJiAoc2tiLT5sZW4gPCBSWF9VUkJfU0laRSkpIHsKKyNpZmRlZiBVU0JfUlhfQUdHUkVHQVRJT05fU1VQUE9SVAorCQlUZW1wQnl0ZSA9ICooc2tiLT5kYXRhICsgc2l6ZW9mKHJ4X2Rlc2NfODE5eF91c2IpKTsKKyNlbmRpZgorCQkvKiBmaXJzdCBwYWNrZXQgc2hvdWxkIG5vdCBjb250YWluIFJ4IGFnZ3JlZ2F0aW9uIGhlYWRlciAqLworCQlxdWVyeV9yeGRlc2Nfc3RhdHVzKHNrYiwgJnN0YXRzLCBmYWxzZSk7CisJCS8qIFRPRE8gKi8KKwkJLyogaGFyZHdhcmUgcmVsYXRlZCBpbmZvICovCisjaWZkZWYgVVNCX1JYX0FHR1JFR0FUSU9OX1NVUFBPUlQKKwkJaWYgKFRlbXBCeXRlICYgQklUMCkgeworCQkJYWdnX3NrYiA9IHNrYjsKKwkJCS8vVG90YWxMZW5ndGggPSBhZ2dfc2tiLT5sZW4gLSA0OyAvKnNDcmNMbmcqLworCQkJVG90YWxMZW5ndGggPSBzdGF0cy5MZW5ndGggLSA0OyAvKnNDcmNMbmcqLworCQkJLy9SVF9UUkFDRShDT01QX1JFQ1YsICIlczpmaXJzdCBhZ2dyZWdhdGVkIHBhY2tldCFMZW5ndGg9JWRcbiIsX19GVU5DVElPTl9fLFRvdGFsTGVuZ3RoKTsKKwkJCS8qIHRob3VnaCB0aGUgaGVhZCBwb2ludGVyIGhhcyBwYXNzZWQgdGhpcyBwb3NpdGlvbiAgKi8KKwkJCVRlbXBEV29yZCA9ICoodTMyICopKGFnZ19za2ItPmRhdGEgLSA0KTsKKwkJCVBhY2tldExlbmd0aCA9ICh1MTYpKFRlbXBEV29yZCAmIDB4M0ZGRik7IC8qc0NyY0xuZyovCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKFBhY2tldExlbmd0aCk7CisJCQltZW1jcHkoc2tiX3B1dChza2IsUGFja2V0TGVuZ3RoKSxhZ2dfc2tiLT5kYXRhLFBhY2tldExlbmd0aCk7CisJCQlQYWNrZXRTaGlmdEJ5dGVzID0gR2V0UnhQYWNrZXRTaGlmdEJ5dGVzODE5eFVzYigmc3RhdHMsIGZhbHNlKTsKKwkJfQorI2VuZGlmCisJCS8qIFByb2Nlc3MgdGhlIE1QRFUgcmVjZXZpZWQgKi8KKwkJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIDQvKnNDcmNMbmcqLyk7CisKKwkJcnhfcGt0X2xlbiA9IHNrYi0+bGVuOworCQlpZWVlODAyMTFfaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzFhZGRyICopc2tiLT5kYXRhOworCQl1bmljYXN0X3BhY2tldCA9IGZhbHNlOworCQlpZihpc19icm9hZGNhc3RfZXRoZXJfYWRkcihpZWVlODAyMTFfaGRyLT5hZGRyMSkpIHsKKwkJCS8vVE9ETworCQl9ZWxzZSBpZihpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihpZWVlODAyMTFfaGRyLT5hZGRyMSkpeworCQkJLy9UT0RPCisJCX1lbHNlIHsKKwkJCS8qIHVuaWNhc3QgcGFja2V0ICovCisJCQl1bmljYXN0X3BhY2tldCA9IHRydWU7CisJCX0KKworCQlpZighaWVlZTgwMjExX3J4KHByaXYtPmllZWU4MDIxMSxza2IsICZzdGF0cykpIHsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCX0gZWxzZSB7CisJCQlwcml2LT5zdGF0cy5yeG9rdG90YWwrKzsKKwkJCWlmKHVuaWNhc3RfcGFja2V0KSB7CisJCQkJcHJpdi0+c3RhdHMucnhieXRlc3VuaWNhc3QgKz0gcnhfcGt0X2xlbjsKKwkJCX0KKwkJfQorI2lmZGVmIFVTQl9SWF9BR0dSRUdBVElPTl9TVVBQT1JUCisJCXRlc3RpbmcgPSAxOworCQkvLyAoUGlwZUluZGV4ID09IDApICYmIChUZW1wQnl0ZSAmIEJJVDApID0+IFRvdGFsTGVuZ3RoID4gMC4KKwkJaWYgKFRvdGFsTGVuZ3RoID4gMCkgeworCQkJUGFja2V0T2NjdXBpZWRMZW5kdGggPSBQYWNrZXRMZW5ndGggKyAoUGFja2V0U2hpZnRCeXRlcyArIDgpOworCQkJaWYgKChQYWNrZXRPY2N1cGllZExlbmR0aCAmIDB4RkYpICE9IDApCisJCQkJUGFja2V0T2NjdXBpZWRMZW5kdGggPSAoUGFja2V0T2NjdXBpZWRMZW5kdGggJiAweEZGRkZGRjAwKSArIDI1NjsKKwkJCVBhY2tldE9jY3VwaWVkTGVuZHRoIC09IDg7CisJCQlUZW1wRFdvcmQgPSBQYWNrZXRPY2N1cGllZExlbmR0aCAtIFBhY2tldFNoaWZ0Qnl0ZXM7IC8qLSBQYWNrZXRMZW5ndGggKi8KKwkJCWlmIChhZ2dfc2tiLT5sZW4gPiBUZW1wRFdvcmQpCisJCQkJc2tiX3B1bGwoYWdnX3NrYiwgVGVtcERXb3JkKTsKKwkJCWVsc2UKKwkJCQlhZ2dfc2tiLT5sZW4gPSAwOworCisJCQl3aGlsZSAoYWdnX3NrYi0+bGVuPj1HZXRSeFBhY2tldFNoaWZ0Qnl0ZXM4MTl4VXNiKCZzdGF0cywgdHJ1ZSkpIHsKKwkJCQl1OCB0bXBDUkMgPSAwLCB0bXBJQ1YgPSAwOworCQkJCS8vUlRfVFJBQ0UoQ09NUF9SRUNWLCIlczphZ2dyZWQgcGt0LHRvdGFsX2xlbiA9ICVkXG4iLF9fRlVOQ1RJT05fXyxhZ2dfc2tiLT5sZW4pOworCQkJCVJ4RGVzY3IgPSAocnhfZGVzY184MTl4X3VzYl9hZ2dyX3N1YmZyYW1lICopKGFnZ19za2ItPmRhdGEpOworCQkJCXRtcENSQyA9IFJ4RGVzY3ItPkNSQzMyOworCQkJCXRtcElDViA9IFJ4RGVzY3ItPklDVjsKKwkJCQltZW1jcHkoYWdnX3NrYi0+ZGF0YSwgJmFnZ19za2ItPmRhdGFbNDRdLCAyKTsKKwkJCQlSeERlc2NyLT5DUkMzMiA9IHRtcENSQzsKKwkJCQlSeERlc2NyLT5JQ1YgPSB0bXBJQ1Y7CisKKwkJCQltZW1zZXQoJnN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cykpOworCQkJCXN0YXRzLnNpZ25hbCA9IDA7CisJCQkJc3RhdHMubm9pc2UgPSAtOTg7CisJCQkJc3RhdHMucmF0ZSA9IDA7CisJCQkJc3RhdHMuZnJlcSA9IElFRUU4MDIxMV8yNEdIWl9CQU5EOworCQkJCXF1ZXJ5X3J4ZGVzY19zdGF0dXMoYWdnX3NrYiwgJnN0YXRzLCB0cnVlKTsKKwkJCQlQYWNrZXRMZW5ndGggPSBzdGF0cy5MZW5ndGg7CisKKwkJCQlpZihQYWNrZXRMZW5ndGggPiBhZ2dfc2tiLT5sZW4pIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qIFByb2Nlc3MgdGhlIE1QRFUgcmVjZXZpZWQgKi8KKwkJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKFBhY2tldExlbmd0aCk7CisJCQkJbWVtY3B5KHNrYl9wdXQoc2tiLFBhY2tldExlbmd0aCksYWdnX3NrYi0+ZGF0YSwgUGFja2V0TGVuZ3RoKTsKKwkJCQlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gNC8qc0NyY0xuZyovKTsKKworCQkJCXJ4X3BrdF9sZW4gPSBza2ItPmxlbjsKKwkJCQlpZWVlODAyMTFfaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzFhZGRyICopc2tiLT5kYXRhOworCQkJCXVuaWNhc3RfcGFja2V0ID0gZmFsc2U7CisJCQkJaWYoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaWVlZTgwMjExX2hkci0+YWRkcjEpKSB7CisJCQkJCS8vVE9ETworCQkJCX1lbHNlIGlmKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGllZWU4MDIxMV9oZHItPmFkZHIxKSl7CisJCQkJCS8vVE9ETworCQkJCX1lbHNlIHsKKwkJCQkJLyogdW5pY2FzdCBwYWNrZXQgKi8KKwkJCQkJdW5pY2FzdF9wYWNrZXQgPSB0cnVlOworCQkJCX0KKwkJCQlpZighaWVlZTgwMjExX3J4KHByaXYtPmllZWU4MDIxMSxza2IsICZzdGF0cykpIHsKKwkJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCQl9IGVsc2UgeworCQkJCQlwcml2LT5zdGF0cy5yeG9rdG90YWwrKzsKKwkJCQkJaWYodW5pY2FzdF9wYWNrZXQpIHsKKwkJCQkJCXByaXYtPnN0YXRzLnJ4Ynl0ZXN1bmljYXN0ICs9IHJ4X3BrdF9sZW47CisJCQkJCX0KKwkJCQl9CisJCQkJLyogc2hvdWxkIHRyaW0gdGhlIHBhY2tldCB3aGljaCBoYXMgYmVlbiBjb3BpZWQgdG8gdGFyZ2V0IHNrYiAqLworCQkJCXNrYl9wdWxsKGFnZ19za2IsIFBhY2tldExlbmd0aCk7CisJCQkJUGFja2V0U2hpZnRCeXRlcyA9IEdldFJ4UGFja2V0U2hpZnRCeXRlczgxOXhVc2IoJnN0YXRzLCB0cnVlKTsKKwkJCQlQYWNrZXRPY2N1cGllZExlbmR0aCA9IFBhY2tldExlbmd0aCArIFBhY2tldFNoaWZ0Qnl0ZXM7CisJCQkJaWYgKChQYWNrZXRPY2N1cGllZExlbmR0aCAmIDB4RkYpICE9IDApIHsKKwkJCQkJUGFkZGluZ0J5dGVzID0gMjU2IC0gKFBhY2tldE9jY3VwaWVkTGVuZHRoICYgMHhGRik7CisJCQkJCWlmIChhZ2dfc2tiLT5sZW4gPiBQYWRkaW5nQnl0ZXMpCisJCQkJCQlza2JfcHVsbChhZ2dfc2tiLCBQYWRkaW5nQnl0ZXMpOworCQkJCQllbHNlCisJCQkJCQlhZ2dfc2tiLT5sZW4gPSAwOworCQkJCX0KKwkJCX0KKwkJCWRldl9rZnJlZV9za2IoYWdnX3NrYik7CisJCX0KKyNlbmRpZgorCX0gZWxzZSB7CisJCXByaXYtPnN0YXRzLnJ4dXJiZXJyKys7CisJCXByaW50aygiYWN0dWFsX2xlbmd0aDolZFxuIiwgc2tiLT5sZW4pOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX0KKworfQorCit2b2lkCitydGw4MTl4dXNiX3Byb2Nlc3NfcmVjZWl2ZWRfcGFja2V0KAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcHN0YXRzCisJKQoreworLy8JYm9vbCBiZnJlZXJmZD1mYWxzZSwgYnF1ZXVlZD1mYWxzZTsKKwl1OCogCWZyYW1lOworCXUxNiAgICAgZnJhbWVfbGVuPTA7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworLy8JdTgJCQlpbmRleCA9IDA7CisvLwl1OAkJCVRJRCA9IDA7CisJLy91MTYJCQlzZXFudW0gPSAwOworCS8vUFJYX1RTX1JFQ09SRAlwdHMgPSBOVUxMOworCisJLy8gR2V0IHNoaWZ0ZWQgYnl0ZXMgb2YgU3RhcnRpbmcgYWRkcmVzcyBvZiA4MDIuMTEgaGVhZGVyLiAyMDA2LjA5LjI4LCBieSBFbWlseQorCS8vcG9ydGluZyBieSBhbXkgMDgwNTA4CisJcHN0YXRzLT52aXJ0dWFsX2FkZHJlc3MgKz0gZ2V0X3J4cGFja2V0X3NoaWZ0Ynl0ZXNfODE5eHVzYihwc3RhdHMpOworCWZyYW1lID0gcHN0YXRzLT52aXJ0dWFsX2FkZHJlc3M7CisJZnJhbWVfbGVuID0gcHN0YXRzLT5wYWNrZXRsZW5ndGg7CisjaWZkZWYgVE9ETwkvLyBieSBhbXkgYWJvdXQgSENUCisJaWYoIUFkYXB0ZXItPmJJbkhjdFRlc3QpCisJCUNvdW50UnhFcnJTdGF0aXN0aWNzKEFkYXB0ZXIsIHBSZmQpOworI2VuZGlmCisJeworCSNpZmRlZiBFTkFCTEVfUFMgIC8vYnkgYW15IGZvciBhZGRpbmcgcHMgZnVuY3Rpb24gaW4gZnV0dXJlCisJCVJUX1JGX1BPV0VSX1NUQVRFIHJ0U3RhdGU7CisJCS8vIFdoZW4gUkYgaXMgb2ZmLCB3ZSBzaG91bGQgbm90IGNvdW50IHRoZSBwYWNrZXQgZm9yIGh3L3N3IHN5bmNocm9uaXplCisJCS8vIHJlYXNvbiwgaWUuIHRoZXJlIG1heSBiZSBhIGR1cmF0aW9uIHdoaWxlIHN3IHN3aXRjaCBpcyBjaGFuZ2VkIGFuZCBodworCQkvLyBzd2l0Y2ggaXMgYmVpbmcgY2hhbmdlZC4gMjAwNi4xMi4wNCwgYnkgc2hpZW4gY2hhbmcuCisJCUFkYXB0ZXItPkhhbEZ1bmMuR2V0SHdSZWdIYW5kbGVyKEFkYXB0ZXIsIEhXX1ZBUl9SRl9TVEFURSwgKHU4KiApKCZydFN0YXRlKSk7CisJCWlmIChydFN0YXRlID09IGVSZk9mZikKKwkJeworCQkJcmV0dXJuOworCQl9CisJI2VuZGlmCisJcHJpdi0+c3RhdHMucnhmcmFtZ21lbnQrKzsKKworCX0KKyNpZmRlZiBUT0RPCisJUm1Nb25pdG9yU2lnbmFsU3RyZW5ndGgoQWRhcHRlciwgcFJmZCk7CisjZW5kaWYKKwkvKiAyMDA3LzAxLzE2IE1IIEFkZCBSWCBjb21tYW5kIHBhY2tldCBoYW5kbGUgaGVyZS4gKi8KKwkvKiAyMDA3LzAzLzAxIE1IIFdlIGhhdmUgdG8gcmVsZWFzZSBSRkQgYW5kIHJldHVybiBpZiByeCBwa3QgaXMgY21kIHBrdC4gKi8KKwlpZiAocnRsODE5eHVzYl9yeF9jb21tYW5kX3BhY2tldChkZXYsIHBzdGF0cykpCisJeworCQlyZXR1cm47CisJfQorCisjaWZkZWYgU1dfQ1JDX0NIRUNLCisJU3dDcmNDaGVjaygpOworI2VuZGlmCisKKworfQorCit2b2lkIHF1ZXJ5X3J4X2NtZHBrdF9kZXNjX3N0YXR1cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cykKK3sKKy8vCXJ0bDgxOTJfcnhfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgcnRsODE5Ml9yeF9pbmZvICopc2tiLT5jYjsKKy8vCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY9aW5mby0+ZGV2OworLy8Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXJ4X2Rlc2NfODE5eF91c2IgKmRlc2MgPSAocnhfZGVzY184MTl4X3VzYiAqKXNrYi0+ZGF0YTsKKy8vCXJ4X2RydmluZm9fODE5eF91c2IgICpkcml2ZXJfaW5mbzsKKworCS8vCisJLy9HZXQgUnggRGVzY3JpcHRvciBJbmZvcm1hdGlvbgorCS8vCisJc3RhdHMtPnZpcnR1YWxfYWRkcmVzcyA9ICh1OCopc2tiLT5kYXRhOworCXN0YXRzLT5MZW5ndGggPSBkZXNjLT5MZW5ndGg7CisJc3RhdHMtPlJ4RHJ2SW5mb1NpemUgPSAwOworCXN0YXRzLT5SeEJ1ZlNoaWZ0ID0gMDsKKwlzdGF0cy0+cGFja2V0bGVuZ3RoID0gc3RhdHMtPkxlbmd0aC1zY3JjbG5nOworCXN0YXRzLT5mcmFnbGVuZ3RoID0gc3RhdHMtPnBhY2tldGxlbmd0aDsKKwlzdGF0cy0+ZnJhZ29mZnNldCA9IDA7CisJc3RhdHMtPm50b3RhbGZyYWcgPSAxOworfQorCisKK3ZvaWQgcnRsODE5Ml9yeF9jbWQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcnRsODE5Ml9yeF9pbmZvICppbmZvID0gKHN0cnVjdCBydGw4MTkyX3J4X2luZm8gKilza2ItPmNiOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpbmZvLT5kZXY7CisJLy9pbnQgcmV0OworLy8Jc3RydWN0IHVyYiAqcnhfdXJiID0gaW5mby0+dXJiOworCS8qIFRPRE8gKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzIHN0YXRzID0geworCQkuc2lnbmFsID0gMCwKKwkJLm5vaXNlID0gLTk4LAorCQkucmF0ZSA9IDAsCisJCS8vICAgICAgLm1hY190aW1lID0gamlmZmllcywKKwkJLmZyZXEgPSBJRUVFODAyMTFfMjRHSFpfQkFORCwKKwl9OworCisJaWYoKHNrYi0+bGVuID49KDIwICsgc2l6ZW9mKHJ4X2Rlc2NfODE5eF91c2IpKSkgJiYgKHNrYi0+bGVuIDwgUlhfVVJCX1NJWkUpKQorCXsKKworCQlxdWVyeV9yeF9jbWRwa3RfZGVzY19zdGF0dXMoc2tiLCZzdGF0cyk7CisJCS8vIHRoaXMgaXMgdG8gYmUgZG9uZSBieSBhbXkgMDgwNTA4ICAgICBwcmZkLT5xdWV1ZV9pZCA9IDE7CisKKworCQkvLworCQkvLyAgUHJvY2VzcyB0aGUgY29tbWFuZCBwYWNrZXQgcmVjZWl2ZWQuCisJCS8vCisKKwkJcnRsODE5eHVzYl9wcm9jZXNzX3JlY2VpdmVkX3BhY2tldChkZXYsJnN0YXRzKTsKKworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX0KKwllbHNlCisJCTsKKworCit9CisKK3ZvaWQgcnRsODE5Ml9pcnFfcnhfdGFza2xldChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBydGw4MTkyX3J4X2luZm8gKmluZm87CisKKwl3aGlsZSAoTlVMTCAhPSAoc2tiID0gc2tiX2RlcXVldWUoJnByaXYtPnNrYl9xdWV1ZSkpKSB7CisJCWluZm8gPSAoc3RydWN0IHJ0bDgxOTJfcnhfaW5mbyAqKXNrYi0+Y2I7CisJCXN3aXRjaCAoaW5mby0+b3V0X3BpcGUpIHsKKwkJLyogTm9tYWwgcGFja2V0IHBpcGUgKi8KKwkJCWNhc2UgMzoKKwkJCQkvL1JUX1RSQUNFKENPTVBfUkVDViwgIm5vcm1hbCBpbi1waXBlIGluZGV4KCVkKVxuIixpbmZvLT5vdXRfcGlwZSk7CisJCQkJcHJpdi0+SXJwUGVuZGluZ0NvdW50LS07CisJCQkJcnRsODE5Ml9yeF9ub21hbChza2IpOworCQkJCWJyZWFrOworCisJCQkJLyogQ29tbWFuZCBwYWNrZXQgcGlwZSAqLworCQkJY2FzZSA5OgorCQkJCVJUX1RSQUNFKENPTVBfUkVDViwgImNvbW1hbmQgaW4tcGlwZSBpbmRleCglZClcbiIsXAorCQkJCQkJaW5mby0+b3V0X3BpcGUpOworCisJCQkJcnRsODE5Ml9yeF9jbWQoc2tiKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDogLyogc2hvdWxkIG5ldmVyIGdldCBoZXJlISAqLworCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiVW5rbm93biBpbi1waXBlIGluZGV4KCVkKVxuIixcCisJCQkJCQlpbmZvLT5vdXRfcGlwZSk7CisJCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJCWJyZWFrOworCisJCX0KKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgcnRsODE5Ml9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbiAgICAgICAgICAgICAgID0gcnRsODE5Ml9vcGVuLAorCS5uZG9fc3RvcCAgICAgICAgICAgICAgID0gcnRsODE5Ml9jbG9zZSwKKwkubmRvX2dldF9zdGF0cyAgICAgICAgICA9IHJ0bDgxOTJfc3RhdHMsCisJLm5kb190eF90aW1lb3V0ICAgICAgICAgPSB0eF90aW1lb3V0LAorCS5uZG9fZG9faW9jdGwgICAgICAgICAgID0gcnRsODE5Ml9pb2N0bCwKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IHI4MTkyX3NldF9tdWx0aWNhc3QsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgICAgPSByODE5Ml9zZXRfbWFjX2FkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIgICAgICA9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fY2hhbmdlX210dSAgICAgICAgID0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zdGFydF94bWl0ICAgICAgICAgPSBpZWVlODAyMTFfeG1pdCwKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0JfU1RVRkYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBydGw4MTkyX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCSBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisvLwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IDA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXY9IE5VTEw7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCVJUX1RSQUNFKENPTVBfSU5JVCwgIk9vcHM6IGknbSBjb21pbmdcbiIpOworCisJZGV2ID0gYWxsb2NfaWVlZTgwMjExKHNpemVvZihzdHJ1Y3QgcjgxOTJfcHJpdikpOworCisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmaW50Zi0+ZGV2KTsKKwlwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlwcml2LT5pZWVlODAyMTEgPSBuZXRkZXZfcHJpdihkZXYpOworCXByaXYtPnVkZXY9dWRldjsKKworCWRldi0+bmV0ZGV2X29wcyA9ICZydGw4MTkyX25ldGRldl9vcHM7CisKKwkgLy9ETUVTRygiT29wczogaSdtIGNvbWluZ1xuIik7CisjaWYgV0lSRUxFU1NfRVhUID49IDEyCisjaWYgV0lSRUxFU1NfRVhUIDwgMTcKKwlkZXYtPmdldF93aXJlbGVzc19zdGF0cyA9IHI4MTkyX2dldF93aXJlbGVzc19zdGF0czsKKyNlbmRpZgorCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopICZyODE5Ml93eF9oYW5kbGVyc19kZWY7CisjZW5kaWYKKwlkZXYtPnR5cGU9QVJQSFJEX0VUSEVSOworCisJZGV2LT53YXRjaGRvZ190aW1lbyA9IEhaKjM7CS8vbW9kaWZpZWQgYnkgam9obiwgMDgwNQorCisJaWYgKGRldl9hbGxvY19uYW1lKGRldiwgaWZuYW1lKSA8IDApeworCQlSVF9UUkFDRShDT01QX0lOSVQsICJPb3BzOiBkZXZuYW1lIGFscmVhZHkgdGFrZW4hIFRyeWluZyB3bGFuJSVkLi4uXG4iKTsKKwkJaWZuYW1lID0gIndsYW4lZCI7CisJCWRldl9hbGxvY19uYW1lKGRldiwgaWZuYW1lKTsKKwl9CisKKwlSVF9UUkFDRShDT01QX0lOSVQsICJEcml2ZXIgcHJvYmUgY29tcGxldGVkMVxuIik7CisJaWYocnRsODE5Ml9pbml0KGRldikhPTApeworCQlSVF9UUkFDRShDT01QX0VSUiwgIkluaXRpYWxpemF0aW9uIGZhaWxlZCIpOworCQlnb3RvIGZhaWw7CisJfQorCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJUlRfVFJBQ0UoQ09NUF9JTklULCAiZGV2IG5hbWU9PT09PT09PiAlc1xuIixkZXYtPm5hbWUpOworCXJ0bDgxOTJfcHJvY19pbml0X29uZShkZXYpOworCisKKwlSVF9UUkFDRShDT01QX0lOSVQsICJEcml2ZXIgcHJvYmUgY29tcGxldGVkXG4iKTsKKwlyZXR1cm4gMDsKKworCitmYWlsOgorCWZyZWVfaWVlZTgwMjExKGRldik7CisKKwlSVF9UUkFDRShDT01QX0VSUiwgIndsYW4gZHJpdmVyIGxvYWQgZmFpbGVkXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKKworfQorCisvL2RldGFjaCBhbGwgdGhlIHdvcmsgYW5kIHRpbWVyIHN0cnVjdHVyZSBkZWNsYXJlZCBvciBpbml0aXRpYWxpemUgaW4gcjgxOTJVX2luaXQgZnVuY3Rpb24uCit2b2lkIHJ0bDgxOTJfY2FuY2VsX2RlZmVycmVkX3dvcmsoc3RydWN0IHI4MTkyX3ByaXYqIHByaXYpCit7CisKKwljYW5jZWxfd29ya19zeW5jKCZwcml2LT5yZXNldF93cSk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+d2F0Y2hfZG9nX3dxKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT51cGRhdGVfYmVhY29uX3dxKTsKKwljYW5jZWxfd29ya19zeW5jKCZwcml2LT5xb3NfYWN0aXZhdGUpOworCS8vY2FuY2VsX3dvcmtfc3luYygmcHJpdi0+U2V0QldNb2RlV29ya0l0ZW0pOworCS8vY2FuY2VsX3dvcmtfc3luYygmcHJpdi0+U3dDaG5sV29ya0l0ZW0pOworCit9CisKKworc3RhdGljIHZvaWQgX19kZXZleGl0IHJ0bDgxOTJfdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaWYoZGV2KXsKKworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJCVJUX1RSQUNFKENPTVBfRE9XTiwgIj09PT09PT09PT09PT0+d2xhbiBkcml2ZXIgdG8gYmUgcmVtb3ZlZFxuIik7CisJCXJ0bDgxOTJfcHJvY19yZW1vdmVfb25lKGRldik7CisKKwkJCXJ0bDgxOTJfZG93bihkZXYpOworCQlpZiAocHJpdi0+cEZpcm13YXJlKQorCQl7CisJCQlrZnJlZShwcml2LT5wRmlybXdhcmUpOworCQkJcHJpdi0+cEZpcm13YXJlID0gTlVMTDsKKwkJfQorCS8vCXByaXYtPnJmX2Nsb3NlKGRldik7CisvLwkJcnRsODE5Ml9TZXRSRlBvd2VyU3RhdGUoZGV2LCBlUmZPZmYpOworCQlydGw4MTkyX3VzYl9kZWxldGVlbmRwb2ludHMoZGV2KTsKKwkJZGVzdHJveV93b3JrcXVldWUocHJpdi0+cHJpdl93cSk7CisJCS8vcnRsODE5Ml9pcnFfZGlzYWJsZShkZXYpOworCQkvL3J0bDgxOTJfcmVzZXQoZGV2KTsKKwkJbWRlbGF5KDEwKTsKKworCX0KKwlmcmVlX2llZWU4MDIxMShkZXYpOworCVJUX1RSQUNFKENPTVBfRE9XTiwgIndsYW4gZHJpdmVyIHJlbW92ZWRcbiIpOworfQorCisvKiBmdW4gd2l0aCB0aGUgYnVpbHQtaW4gaWVlZTgwMjExIHN0YWNrLi4uICovCitleHRlcm4gaW50IGllZWU4MDIxMV9kZWJ1Z19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2RlYnVnX2V4aXQodm9pZCk7CitleHRlcm4gaW50IGllZWU4MDIxMV9jcnlwdG9faW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9jcnlwdG9fZGVpbml0KHZvaWQpOworZXh0ZXJuIGludCBpZWVlODAyMTFfY3J5cHRvX3RraXBfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9jcnlwdG9fdGtpcF9leGl0KHZvaWQpOworZXh0ZXJuIGludCBpZWVlODAyMTFfY3J5cHRvX2NjbXBfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9jcnlwdG9fY2NtcF9leGl0KHZvaWQpOworZXh0ZXJuIGludCBpZWVlODAyMTFfY3J5cHRvX3dlcF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2NyeXB0b193ZXBfZXhpdCh2b2lkKTsKKworc3RhdGljIGludCBfX2luaXQgcnRsODE5Ml91c2JfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworCXJldCA9IGllZWU4MDIxMV9kZWJ1Z19pbml0KCk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImllZWU4MDIxMV9kZWJ1Z19pbml0KCkgZmFpbGVkICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKyNlbmRpZgorCXJldCA9IGllZWU4MDIxMV9jcnlwdG9faW5pdCgpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpZWVlODAyMTFfY3J5cHRvX2luaXQoKSBmYWlsZWQgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gaWVlZTgwMjExX2NyeXB0b190a2lwX2luaXQoKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWVlZTgwMjExX2NyeXB0b190a2lwX2luaXQoKSBmYWlsZWQgJWRcbiIsCisJCQlyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGllZWU4MDIxMV9jcnlwdG9fY2NtcF9pbml0KCk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImllZWU4MDIxMV9jcnlwdG9fY2NtcF9pbml0KCkgZmFpbGVkICVkXG4iLAorCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBpZWVlODAyMTFfY3J5cHRvX3dlcF9pbml0KCk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImllZWU4MDIxMV9jcnlwdG9fd2VwX2luaXQoKSBmYWlsZWQgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiXG5MaW51eCBrZXJuZWwgZHJpdmVyIGZvciBSVEw4MTkyIGJhc2VkIFdMQU4gY2FyZHNcbiIpOworCXByaW50ayhLRVJOX0lORk8gIkNvcHlyaWdodCAoYykgMjAwNy0yMDA4LCBSZWFsc2lsIFdsYW5cbiIpOworCVJUX1RSQUNFKENPTVBfSU5JVCwgIkluaXRpYWxpemluZyBtb2R1bGUiKTsKKwlSVF9UUkFDRShDT01QX0lOSVQsICJXaXJlbGVzcyBleHRlbnNpb25zIHZlcnNpb24gJWQiLCBXSVJFTEVTU19FWFQpOworCXJ0bDgxOTJfcHJvY19tb2R1bGVfaW5pdCgpOworCXJldHVybiB1c2JfcmVnaXN0ZXIoJnJ0bDgxOTJfdXNiX2RyaXZlcik7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IHJ0bDgxOTJfdXNiX21vZHVsZV9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJnJ0bDgxOTJfdXNiX2RyaXZlcik7CisKKwlSVF9UUkFDRShDT01QX0RPV04sICJFeGl0aW5nIik7CisvLwlydGw4MTkyX3Byb2NfbW9kdWxlX3JlbW92ZSgpOworfQorCisKK3ZvaWQgcnRsODE5Ml90cnlfd2FrZV9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcHJpKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc2hvcnQgZW5vdWdoX2Rlc2M7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOworCWVub3VnaF9kZXNjID0gY2hlY2tfbmljX2Vub3VnaF9kZXNjKGRldixwcmkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOworCisJaWYoZW5vdWdoX2Rlc2MpCisJCWllZWU4MDIxMV93YWtlX3F1ZXVlKHByaXYtPmllZWU4MDIxMSk7Cit9CisKK3ZvaWQgRW5hYmxlSFdTZWN1cml0eUNvbmZpZzgxOTIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1OCBTRUNSX3ZhbHVlID0gMHgwOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUgPSBwcml2LT5pZWVlODAyMTE7CisJU0VDUl92YWx1ZSA9IFNDUl9UeEVuY0VuYWJsZSB8IFNDUl9SeERlY0VuYWJsZTsKKwlpZiAoKChLRVlfVFlQRV9XRVA0MCA9PSBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSkgfHwgKEtFWV9UWVBFX1dFUDEwNCA9PSBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSkpICYmIChwcml2LT5pZWVlODAyMTEtPmF1dGhfbW9kZSAhPSAyKSkKKwl7CisJCVNFQ1JfdmFsdWUgfD0gU0NSX1J4VXNlREs7CisJCVNFQ1JfdmFsdWUgfD0gU0NSX1R4VXNlREs7CisJfQorCWVsc2UgaWYgKChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpICYmIChpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSAmIChLRVlfVFlQRV9DQ01QIHwgS0VZX1RZUEVfVEtJUCkpKQorCXsKKwkJU0VDUl92YWx1ZSB8PSBTQ1JfUnhVc2VESzsKKwkJU0VDUl92YWx1ZSB8PSBTQ1JfVHhVc2VESzsKKwl9CisJLy9hZGQgSFdTZWMgYWN0aXZlIGVuYWJsZSBoZXJlLgorLy9kZWZhdWx0IHVzaW5nIGh3c2VjLiB3aGVuIHBlZXIgQVAgaXMgaW4gTiBtb2RlIG9ubHkgYW5kIHBhaXJ3aXNlX2tleV90eXBlIGlzIG5vbmVfYWVzKHdoaWNoIEhUX0lPVF9BQ1RfUFVSRV9OX01PREUgaW5kaWNhdGVzIGl0KSwgdXNlIHNvZnR3YXJlIHNlY3VyaXR5LiB3aGVuIHBlZXIgQVAgaXMgaW4gYixnLG4gbW9kZSBtaXhlZCBhbmQgcGFpcndpc2Vfa2V5X3R5cGUgaXMgbm9uZV9hZXMsIHVzZSBnIG1vZGUgaHcgc2VjdXJpdHkuIFdCIG9uIDIwMDguNy40CisKKwlpZWVlLT5od3NlY19hY3RpdmUgPSAxOworCisJaWYgKChpZWVlLT5wSFRJbmZvLT5JT1RBY3Rpb24mSFRfSU9UX0FDVF9QVVJFX05fTU9ERSkgfHwgIWh3d2VwKS8vIWllZWUtPmh3c2VjX3N1cHBvcnQpIC8vYWRkIGh3c2VjX3N1cHBvcnQgZmxhZyB0byB0b3RvbCBjb250cm9sIGh3X3NlYyBvbi9vZmYKKwl7CisJCWllZWUtPmh3c2VjX2FjdGl2ZSA9IDA7CisJCVNFQ1JfdmFsdWUgJj0gflNDUl9SeERlY0VuYWJsZTsKKwl9CisJUlRfVFJBQ0UoQ09NUF9TRUMsIiVzOiwgaHdzZWM6JWQsIHBhaXJ3aXNlX2tleTolZCwgU0VDUl92YWx1ZToleFxuIiwgX19GVU5DVElPTl9fLCBcCisJCQlpZWVlLT5od3NlY19hY3RpdmUsIGllZWUtPnBhaXJ3aXNlX2tleV90eXBlLCBTRUNSX3ZhbHVlKTsKKwl7CisJCXdyaXRlX25pY19ieXRlKGRldiwgU0VDUiwgIFNFQ1JfdmFsdWUpOy8vU0VDUl92YWx1ZSB8ICBTQ1JfVXNlREsgKTsKKwl9Cit9CisKKwordm9pZCBzZXRLZXkoCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCXU4IEVudHJ5Tm8sCisJCXU4IEtleUluZGV4LAorCQl1MTYgS2V5VHlwZSwKKwkJdTggKk1hY0FkZHIsCisJCXU4IERlZmF1bHRLZXksCisJCXUzMiAqS2V5Q29udGVudCApCit7CisJdTMyIFRhcmdldENvbW1hbmQgPSAwOworCXUzMiBUYXJnZXRDb250ZW50ID0gMDsKKwl1MTYgdXNDb25maWcgPSAwOworCXU4IGk7CisJaWYgKEVudHJ5Tm8gPj0gVE9UQUxfQ0FNX0VOVFJZKQorCQlSVF9UUkFDRShDT01QX0VSUiwgImNhbSBlbnRyeSBleGNlZWRzIGluIHNldEtleSgpXG4iKTsKKworCVJUX1RSQUNFKENPTVBfU0VDLCAiPT09PT50byBzZXRLZXkoKSwgZGV2OiVwLCBFbnRyeU5vOiVkLCBLZXlJbmRleDolZCwgS2V5VHlwZTolZCwgTWFjQWRkciJNQUNfRk1UIlxuIiwgZGV2LEVudHJ5Tm8sIEtleUluZGV4LCBLZXlUeXBlLCBNQUNfQVJHKE1hY0FkZHIpKTsKKworCWlmIChEZWZhdWx0S2V5KQorCQl1c0NvbmZpZyB8PSBCSVQxNSB8IChLZXlUeXBlPDwyKTsKKwllbHNlCisJCXVzQ29uZmlnIHw9IEJJVDE1IHwgKEtleVR5cGU8PDIpIHwgS2V5SW5kZXg7CisvLwl1c0NvbmZpZyB8PSBCSVQxNSB8IChLZXlUeXBlPDwyKSB8IChEZWZhdWx0S2V5PDw1KSB8IEtleUluZGV4OworCisKKwlmb3IoaT0wIDsgaTxDQU1fQ09OVEVOVF9DT1VOVDsgaSsrKXsKKwkJVGFyZ2V0Q29tbWFuZCAgPSBpK0NBTV9DT05URU5UX0NPVU5UKkVudHJ5Tm87CisJCVRhcmdldENvbW1hbmQgfD0gQklUMzF8QklUMTY7CisKKwkJaWYoaT09MCl7Ly9NQUN8Q29uZmlnCisJCQlUYXJnZXRDb250ZW50ID0gKHUzMikoKihNYWNBZGRyKzApKSA8PCAxNnwKKwkJCQkJKHUzMikoKihNYWNBZGRyKzEpKSA8PCAyNHwKKwkJCQkJKHUzMil1c0NvbmZpZzsKKworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgV0NBTUksIFRhcmdldENvbnRlbnQpOworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUldDQU0sIFRhcmdldENvbW1hbmQpOworCS8vCQlwcmludGsoInNldGtleSBjYW0gPSU4eFxuIiwgcmVhZF9jYW0oZGV2LCBpKzYqRW50cnlObykpOworCQl9CisJCWVsc2UgaWYoaT09MSl7Ly9NQUMKKwkJCVRhcmdldENvbnRlbnQgPSAodTMyKSgqKE1hY0FkZHIrMikpIAkgfAorCQkJCQkodTMyKSgqKE1hY0FkZHIrMykpIDw8ICA4fAorCQkJCQkodTMyKSgqKE1hY0FkZHIrNCkpIDw8IDE2fAorCQkJCQkodTMyKSgqKE1hY0FkZHIrNSkpIDw8IDI0OworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgV0NBTUksIFRhcmdldENvbnRlbnQpOworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUldDQU0sIFRhcmdldENvbW1hbmQpOworCQl9CisJCWVsc2UgeworCQkJLy9LZXkgTWF0ZXJpYWwKKwkJCWlmKEtleUNvbnRlbnQgIT1OVUxMKXsKKwkJCXdyaXRlX25pY19kd29yZChkZXYsIFdDQU1JLCAodTMyKSgqKEtleUNvbnRlbnQraS0yKSkgKTsKKwkJCXdyaXRlX25pY19kd29yZChkZXYsIFJXQ0FNLCBUYXJnZXRDb21tYW5kKTsKKwkJfQorCX0KKwl9CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tIG1vZHVsZSBpbml0IC8gZXhpdCBzdHVicyAtLS0tLS0tLS0tLS0tLS0tCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworbW9kdWxlX2luaXQocnRsODE5Ml91c2JfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQocnRsODE5Ml91c2JfbW9kdWxlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9kbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9kbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZGU5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2RtLmMKQEAgLTAsMCArMSwzODkwIEBACisvKisrCitDb3B5cmlnaHQtYyBSZWFsdGVrIFNlbWljb25kdWN0b3IgQ29ycC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworTW9kdWxlIE5hbWU6CisJcjgxOTJVX2RtLmMKKworQWJzdHJhY3Q6CisJSFcgZHluYW1pYyBtZWNoYW5pc20uCisKK01ham9yIENoYW5nZSBIaXN0b3J5OgorCVdoZW4gICAgICAJV2hvCQkJCVdoYXQKKwktLS0tLS0tLS0tCS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJMjAwOC0wNS0xNAlhbXkgICAgICAgICAgICAgICAgICAgICBjcmVhdGUgdmVyc2lvbiAwIHBvcnRpbmcgZnJvbSB3aW5kb3dzIGNvZGUuCisKKy0tKi8KKyNpbmNsdWRlICJyODE5MlUuaCIKKyNpbmNsdWRlICJyODE5MlVfZG0uaCIKKyNpbmNsdWRlICJyODE5MlVfaHcuaCIKKyNpbmNsdWRlICJyODE5eFVfcGh5LmgiCisjaW5jbHVkZSAicjgxOXhVX3BoeXJlZy5oIgorI2luY2x1ZGUgInI4MTkwX3J0bDgyNTYuaCIKKyNpbmNsdWRlICJyODE5eFVfY21kcGt0LmgiCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBMb2NhbCBDb25zdGFudC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvLworLy8gSW5kaWNhdGUgZGlmZmVyZW50IEFQIHZlbmRvciBmb3IgSU9UIGlzc3VlLgorLy8KK3N0YXRpYyB1MzIgZWRjYV9zZXR0aW5nX0RMW0hUX0lPVF9QRUVSX01BWF0gPQorCQl7IDB4NWU0MzIyLCAJMHg1ZTQzMjIsIAkweDVlNDMyMiwgCTB4NjA0MzIyLCAJMHhhNDRmLCAJMHg1ZWE0NGZ9Oworc3RhdGljIHUzMiBlZGNhX3NldHRpbmdfVUxbSFRfSU9UX1BFRVJfTUFYXSA9CisJCXsgMHg1ZTQzMjIsIAkweGE0NGYsIAkweDVlNDMyMiwgCTB4NjA0MzIyLCAJMHg1ZWE0NGYsIAkweDVlYTQ0Zn07CisKKworI2RlZmluZSBSVEtfVUxfRURDQSAweGE0NGYKKyNkZWZpbmUgUlRLX0RMX0VEQ0EgMHg1ZTQzMjIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIExvY2FsIENvbnN0YW50LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBnbG9iYWwgdmFyaWFibGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvLyBEZWJ1ZyB2YXJpYWJsZSA/CitkaWdfdAlkbV9kaWd0YWJsZTsKKy8vIFN0b3JlIGN1cnJlbnQgc2hvZnR3YXJlIHdyaXRlIHJlZ2lzdGVyIGNvbnRlbnQgZm9yIE1BQyBQSFkuCit1OAkJZG1fc2hhZG93WzE2XVsyNTZdID0ge3swfX07CisvLyBGb3IgRHluYW1pYyBSeCBQYXRoIFNlbGVjdGlvbiBieSBTaWduYWwgU3RyZW5ndGgKK0RSeFBhdGhTZWwJRE1fUnhQYXRoU2VsVGFibGU7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBnbG9iYWwgdmFyaWFibGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgbG9jYWwgdmFyaWFibGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgbG9jYWwgdmFyaWFibGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgZXhwb3J0IGZ1bmN0aW9uIHByb3RvdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2V4dGVybgl2b2lkCWluaXRfaGFsX2RtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuCXZvaWQgZGVpbml0X2hhbF9kbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworZXh0ZXJuIHZvaWQgaGFsX2RtX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisKK2V4dGVybgl2b2lkCWluaXRfcmF0ZV9hZGFwdGl2ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybgl2b2lkCWRtX3R4cG93ZXJfdHJhY2tpbmdjYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworCitleHRlcm4Jdm9pZAlkbV9jY2tfdHhwb3dlcl9hZGp1c3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldixib29sICBiaW5jaDE0KTsKK2V4dGVybgl2b2lkCWRtX3Jlc3RvcmVfZHluYW1pY19tZWNoYW5pc21fc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4Jdm9pZAlkbV9iYWNrdXBfZHluYW1pY19tZWNoYW5pc21fc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4Jdm9pZAlkbV9jaGFuZ2VfZHluYW1pY19pbml0Z2Fpbl90aHJlc2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCQkJdTMyCQlkbV90eXBlLAorCQkJCQkJCQl1MzIJCWRtX3ZhbHVlKTsKK2V4dGVybgl2b2lkCURNX0NoYW5nZUZzeW5jU2V0dGluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkJCQkJCQkJczMyCQlETV9UeXBlLAorCQkJCQkJCQkJCQkJczMyCQlETV9WYWx1ZSk7CitleHRlcm4Jdm9pZCBkbV9mb3JjZV90eF9md19pbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCQkJCQkJdTMyCQlmb3JjZV90eXBlLAorCQkJCQkJCQkJCXUzMgkJZm9yY2VfdmFsdWUpOworZXh0ZXJuCXZvaWQJZG1faW5pdF9lZGNhX3R1cmJvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuCXZvaWQJZG1fcmZfb3BlcmF0aW9uX3Rlc3RfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKTsKK2V4dGVybgl2b2lkCWRtX3JmX3BhdGhjaGVja193b3JraXRlbWNhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitleHRlcm4Jdm9pZCBkbV9mc3luY190aW1lcl9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpOworZXh0ZXJuCXZvaWQgZG1fY2hlY2tfZnN5bmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4Jdm9pZAlkbV9zaGFkb3dfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIGV4cG9ydCBmdW5jdGlvbiBwcm90b3R5cGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLy8gRE0gLS0+IFJhdGUgQWRhcHRpdmUKK3N0YXRpYwl2b2lkCWRtX2NoZWNrX3JhdGVfYWRhcHRpdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8vIERNIC0tPiBCYW5kd2lkdGggc3dpdGNoCitzdGF0aWMJdm9pZAlkbV9pbml0X2JhbmR3aWR0aF9hdXRvc3dpdGNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljCXZvaWQJZG1fYmFuZHdpZHRoX2F1dG9zd2l0Y2goCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvLyBETSAtLT4gVFggcG93ZXIgY29udHJvbAorLy9zdGF0aWMJdm9pZAlkbV9pbml0aWFsaXplX3R4cG93ZXJfdHJhY2tpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYwl2b2lkCWRtX2NoZWNrX3R4cG93ZXJfdHJhY2tpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKworCisvL3N0YXRpYwl2b2lkCWRtX3R4cG93ZXJfcmVzZXRfcmVjb3Zlcnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKworLy8gRE0gLS0+IEJCIGluaXQgZ2FpbiByZXN0b3JlCisjaWZuZGVmIFJUTDgxOTJVCitzdGF0aWMJdm9pZAlkbV9iYl9pbml0aWFsZ2Fpbl9yZXN0b3JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisKKy8vIERNIC0tPiBCQiBpbml0IGdhaW4gYmFja3VwCitzdGF0aWMJdm9pZAlkbV9iYl9pbml0aWFsZ2Fpbl9iYWNrdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKKy8vIERNIC0tPiBEeW5hbWljIEluaXQgR2FpbiBieSBSU1NJCitzdGF0aWMJdm9pZAlkbV9kaWdfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYwl2b2lkCWRtX2N0cmxfaW5pdGdhaW5fYnlyc3NpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljCXZvaWQJZG1fY3RybF9pbml0Z2Fpbl9ieXJzc2lfaGlnaHB3cihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYwl2b2lkCWRtX2N0cmxfaW5pdGdhaW5fYnlyc3NpX2J5X2RyaXZlcnJzc2koCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljCXZvaWQJZG1fY3RybF9pbml0Z2Fpbl9ieXJzc2lfYnlfZndmYWxzZV9hbGFybShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYwl2b2lkCWRtX2luaXRpYWxfZ2FpbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYwl2b2lkCWRtX3BkX3RoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljCXZvaWQJZG1fY3NfcmF0aW8oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYwl2b2lkIGRtX2luaXRfY3RzdG9zZWxmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworLy8gRE0gLS0+IEVEQ0EgdHVyYm9lIG1vZGUgY29udHJvbAorc3RhdGljCXZvaWQJZG1fY2hlY2tfZWRjYV90dXJibyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLy8gRE0gLS0+IEhXIFJGIGNvbnRyb2wKK3N0YXRpYwl2b2lkCWRtX2NoZWNrX3JmY3RybF9ncGlvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisjaWZuZGVmIFJUTDgxOTBQCisvL3N0YXRpYwl2b2lkCWRtX2dwaW9fY2hhbmdlX3JmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCisvLyBETSAtLT4gQ2hlY2sgUEJDCitzdGF0aWMJdm9pZCBkbV9jaGVja19wYmNfZ3BpbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCisvLyBETSAtLT4gQ2hlY2sgY3VycmVudCBSWCBSRiBwYXRoIHN0YXRlCitzdGF0aWMJdm9pZAlkbV9jaGVja19yeF9wYXRoX3NlbGVjdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyAJdm9pZCBkbV9pbml0X3J4cGF0aF9zZWxlY3Rpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMJdm9pZCBkbV9yeHBhdGhfc2VsX2J5cnNzaShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCisvLyBETSAtLT4gRnN5bmMgZm9yIGJyb2FkY29tIGFwCitzdGF0aWMgdm9pZCBkbV9pbml0X2ZzeW5jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZG1fZGVJbml0X2ZzeW5jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvL0FkZGVkIGJ5IHZpdmksIDIwMDgwNTIyCitzdGF0aWMJdm9pZAlkbV9jaGVja190eHJhdGVhbmRyZXRyeWNvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIG9mIFR4IFBvd2VyIENvbnRyb2wgRm9yIE5lYXIvRmFyIFJhbmdlIC0tLS0tLS0tKi8gICAvL0FkZCBieSBKYWNrZW4gMjAwOC8wMi8xOAorc3RhdGljCXZvaWQJZG1faW5pdF9keW5hbWljX3R4cG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMJdm9pZAlkbV9keW5hbWljX3R4cG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKworLy8gRE0gLS0+IEZvciByYXRlIGFkYXB0aXZlIGFuZCBESUcsIHdlIG11c3Qgc2VuZCBSU1NJIHRvIGZpcm13YXJlCitzdGF0aWMJdm9pZCBkbV9zZW5kX3Jzc2lfdG9mdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYwl2b2lkCWRtX2N0c3Rvc2VsZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIGZ1bmN0aW9uIHByb3RvdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLwlIVyBEeW5hbWljIG1lY2hhbmlzbSBpbnRlcmZhY2UuCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vCisvLwlEZXNjcmlwdGlvbjoKKy8vCQlQcmVwYXJlIFNXIHJlc291cmNlIGZvciBIVyBkeW5hbWljIG1lY2hhbmlzbS4KKy8vCisvLwlBc3N1bXB0aW9uOgorLy8JCVRoaXMgZnVuY3Rpb24gaXMgb25seSBpbnZva2VkIGF0IGRyaXZlciBpbnRpYWxpemF0aW9uIG9uY2UuCisvLworLy8KK2V4dGVybgl2b2lkCitpbml0X2hhbF9kbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCS8vIFVuZGVjb3JhdGVkIFNtb290aGVkIFNpZ25hbCBTdHJlbmd0aCwgaXQgY2FuIHV0aWxpemVkIHRvIGR5bmFtaWMgbWVjaGFuaXNtLgorCXByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPSAtMTsKKworCS8vSW5pdGlhbCBUWCBQb3dlciBDb250cm9sIGZvciBuZWFyL2ZhciByYW5nZSAsIGFkZCBieSBhbXkgMjAwOC8wNS8xNSwgcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KKwlkbV9pbml0X2R5bmFtaWNfdHhwb3dlcihkZXYpOworCWluaXRfcmF0ZV9hZGFwdGl2ZShkZXYpOworCS8vZG1faW5pdGlhbGl6ZV90eHBvd2VyX3RyYWNraW5nKGRldik7CisJZG1fZGlnX2luaXQoZGV2KTsKKwlkbV9pbml0X2VkY2FfdHVyYm8oZGV2KTsKKwlkbV9pbml0X2JhbmR3aWR0aF9hdXRvc3dpdGNoKGRldik7CisJZG1faW5pdF9mc3luYyhkZXYpOworCWRtX2luaXRfcnhwYXRoX3NlbGVjdGlvbihkZXYpOworCWRtX2luaXRfY3RzdG9zZWxmKGRldik7CisKK30JLy8gSW5pdEhhbERtCisKK2V4dGVybiB2b2lkIGRlaW5pdF9oYWxfZG0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCWRtX2RlSW5pdF9mc3luYyhkZXYpOworCit9CisKKworI2lmZGVmIFVTQl9SWF9BR0dSRUdBVElPTl9TVVBQT1JUCit2b2lkIGRtX0NoZWNrUnhBZ2dyZWdhdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdigoc3RydWN0IG5ldF9kZXZpY2UgKilkZXYpOworCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IHByaXYtPmllZWU4MDIxMS0+cEhUSW5mbzsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZwlsYXN0VHhPa0NudCA9IDA7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcJbGFzdFJ4T2tDbnQgPSAwOworCXVuc2lnbmVkIGxvbmcJCWN1clR4T2tDbnQgPSAwOworCXVuc2lnbmVkIGxvbmcJCWN1clJ4T2tDbnQgPSAwOworCisvKgorCWlmIChwSGFsRGF0YS0+YkZvcmNlZFVzYlJ4QWdncikgeworCQlpZiAocEhhbERhdGEtPkZvcmNlZFVzYlJ4QWdnckluZm8gPT0gMCkgeworCQkJaWYgKHBIYWxEYXRhLT5iQ3VycmVudFJ4QWdnckVuYWJsZSkgeworCQkJCUFkYXB0ZXItPkhhbEZ1bmMuSGFsVXNiUnhBZ2dySGFuZGxlcihBZGFwdGVyLCBGQUxTRSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoIXBIYWxEYXRhLT5iQ3VycmVudFJ4QWdnckVuYWJsZSB8fCAocEhhbERhdGEtPkZvcmNlZFVzYlJ4QWdnckluZm8gIT0gcEhhbERhdGEtPkxhc3RVc2JSeEFnZ3JJbmZvU2V0dGluZykpIHsKKwkJCQlBZGFwdGVyLT5IYWxGdW5jLkhhbFVzYlJ4QWdnckhhbmRsZXIoQWRhcHRlciwgVFJVRSk7CisJCQl9CisJCX0KKwkJcmV0dXJuOworCX0KKworKi8KKwljdXJUeE9rQ250ID0gcHJpdi0+c3RhdHMudHhieXRlc3VuaWNhc3QgLSBsYXN0VHhPa0NudDsKKwljdXJSeE9rQ250ID0gcHJpdi0+c3RhdHMucnhieXRlc3VuaWNhc3QgLSBsYXN0UnhPa0NudDsKKworCWlmKChjdXJUeE9rQ250ICsgY3VyUnhPa0NudCkgPCAxNTAwMDAwMCkgeworCQlyZXR1cm47CisJfQorCisJaWYoY3VyVHhPa0NudCA+IDQqY3VyUnhPa0NudCkgeworCQlpZiAocHJpdi0+YkN1cnJlbnRSeEFnZ3JFbmFibGUpIHsKKwkJCXdyaXRlX25pY19kd29yZChkZXYsIDB4MWE4LCAwKTsKKwkJCXByaXYtPmJDdXJyZW50UnhBZ2dyRW5hYmxlID0gZmFsc2U7CisJCX0KKwl9ZWxzZXsKKwkJaWYgKCFwcml2LT5iQ3VycmVudFJ4QWdnckVuYWJsZSAmJiAhcEhUSW5mby0+YkN1cnJlbnRSVDJSVEFnZ3JlZ2F0aW9uKSB7CisJCQl1MzIgdWxWYWx1ZTsKKwkJCXVsVmFsdWUgPSAocEhUSW5mby0+VXNiUnhGd0FnZ3JFbjw8MjQpIHwgKHBIVEluZm8tPlVzYlJ4RndBZ2dyUGFnZU51bTw8MTYpIHwKKwkJCQkocEhUSW5mby0+VXNiUnhGd0FnZ3JQYWNrZXROdW08PDgpIHwgKHBIVEluZm8tPlVzYlJ4RndBZ2dyVGltZW91dCk7CisJCQkvKgorCQkJICogSWYgdXNiIHJ4IGZpcm13YXJlIGFnZ3JlZ2F0aW9uIGlzIGVuYWJsZWQsCisJCQkgKiB3aGVuIGFueW9uZSBvZiB0aHJlZSB0aHJlc2hvbGQgY29uZGl0aW9ucyBhYm92ZSBpcyByZWFjaGVkLAorCQkJICogZmlybXdhcmUgd2lsbCBzZW5kIGFnZ3JlZ2F0ZWQgcGFja2V0IHRvIGRyaXZlci4KKwkJCSAqLworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgMHgxYTgsIHVsVmFsdWUpOworCQkJcHJpdi0+YkN1cnJlbnRSeEFnZ3JFbmFibGUgPSB0cnVlOworCQl9CisJfQorCisJbGFzdFR4T2tDbnQgPSBwcml2LT5zdGF0cy50eGJ5dGVzdW5pY2FzdDsKKwlsYXN0UnhPa0NudCA9IHByaXYtPnN0YXRzLnJ4Ynl0ZXN1bmljYXN0OworfQkvLyBkbV9DaGVja0VkY2FUdXJibworI2VuZGlmCisKKworCitleHRlcm4gIHZvaWQgICAgaGFsX2RtX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLy9zdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwkvL3N0YXRpYyB1OCAJcHJldmlvdXNfYnNzaWRbNl0gPXswfTsKKworCS8qQWRkIGJ5IGFteSAyMDA4LzA1LzE1ICxwb3J0aW5nIGZyb20gd2luZG93cyBjb2RlLiovCisJZG1fY2hlY2tfcmF0ZV9hZGFwdGl2ZShkZXYpOworCWRtX2R5bmFtaWNfdHhwb3dlcihkZXYpOworCWRtX2NoZWNrX3R4cmF0ZWFuZHJldHJ5Y291bnQoZGV2KTsKKwlkbV9jaGVja190eHBvd2VyX3RyYWNraW5nKGRldik7CisJZG1fY3RybF9pbml0Z2Fpbl9ieXJzc2koZGV2KTsKKwlkbV9jaGVja19lZGNhX3R1cmJvKGRldik7CisJZG1fYmFuZHdpZHRoX2F1dG9zd2l0Y2goZGV2KTsKKwlkbV9jaGVja19yZmN0cmxfZ3BpbyhkZXYpOworCWRtX2NoZWNrX3J4X3BhdGhfc2VsZWN0aW9uKGRldik7CisJZG1fY2hlY2tfZnN5bmMoZGV2KTsKKworCS8vIEFkZCBieSBhbXkgMjAwOC0wNS0xNSBwb3J0aW5nIGZyb20gd2luZG93cyBjb2RlLgorCWRtX2NoZWNrX3BiY19ncGlvKGRldik7CisJZG1fc2VuZF9yc3NpX3RvZncoZGV2KTsKKwlkbV9jdHN0b3NlbGYoZGV2KTsKKyNpZmRlZiBVU0JfUlhfQUdHUkVHQVRJT05fU1VQUE9SVAorCWRtX0NoZWNrUnhBZ2dyZWdhdGlvbihkZXYpOworI2VuZGlmCit9CS8vSGFsRG1XYXRjaERvZworCisKKy8qCisgICogRGVjaWRlIFJhdGUgQWRhcHRpdmUgU2V0IGFjY29yZGluZyB0byBkaXN0YW5jZSAoc2lnbmFsIHN0cmVuZ3RoKQorICAqCTAxLzExLzIwMDgJTUhDCQlNb2RpZnkgaW5wdXQgYXJndW1lbnRzIGFuZCBSQVRSIHRhYmxlIGxldmVsLgorICAqCTAxLzE2LzIwMDgJTUhDCQlSRl9UeXBlIGlzIGFzc2lnbmVkIGluIFJlYWRBZGFwdGVySW5mbygpLiBXZSBtdXN0IGNhbGwKKyAgKgkJCQkJCXRoZSBmdW5jdGlvbiBhZnRlciBtYWtpbmcgc3VyZSBSRl9UeXBlLgorICAqLworZXh0ZXJuIHZvaWQgaW5pdF9yYXRlX2FkYXB0aXZlKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXByYXRlX2FkYXB0aXZlCXByYSA9IChwcmF0ZV9hZGFwdGl2ZSkmcHJpdi0+cmF0ZV9hZGFwdGl2ZTsKKworCXByYS0+cmF0cl9zdGF0ZSA9IERNX1JBVFJfU1RBX01BWDsKKwlwcmEtPmhpZ2gybG93X3Jzc2lfdGhyZXNoX2Zvcl9yYSA9IFJhdGVBZGFwdGl2ZVRIX0hpZ2g7CisJcHJhLT5sb3cyaGlnaF9yc3NpX3RocmVzaF9mb3JfcmEyME0gPSBSYXRlQWRhcHRpdmVUSF9Mb3dfMjBNKzU7CisJcHJhLT5sb3cyaGlnaF9yc3NpX3RocmVzaF9mb3JfcmE0ME0gPSBSYXRlQWRhcHRpdmVUSF9Mb3dfNDBNKzU7CisKKwlwcmEtPmhpZ2hfcnNzaV90aHJlc2hfZm9yX3JhID0gUmF0ZUFkYXB0aXZlVEhfSGlnaCs1OworCXByYS0+bG93X3Jzc2lfdGhyZXNoX2Zvcl9yYTIwTSA9IFJhdGVBZGFwdGl2ZVRIX0xvd18yME07CisJcHJhLT5sb3dfcnNzaV90aHJlc2hfZm9yX3JhNDBNID0gUmF0ZUFkYXB0aXZlVEhfTG93XzQwTTsKKworCWlmKHByaXYtPkN1c3RvbWVySUQgPT0gUlRfQ0lEXzgxOXhfTmV0Y29yZSkKKwkJcHJhLT5waW5nX3Jzc2lfZW5hYmxlID0gMTsKKwllbHNlCisJCXByYS0+cGluZ19yc3NpX2VuYWJsZSA9IDA7CisJcHJhLT5waW5nX3Jzc2lfdGhyZXNoX2Zvcl9yYSA9IDE1OworCisKKwlpZiAocHJpdi0+cmZfdHlwZSA9PSBSRl8yVDRSKQorCXsKKwkJLy8gMDcvMTAvMDggTUggTW9kaWZ5IGZvciBSQSBzbW9vdGggc2NoZW1lLgorCQkvKiAyMDA4LzAxLzExIE1IIE1vZGlmeSAyVCBSQVRSIHRhYmxlIGZvciBkaWZmZXJlbnQgUlNTSS4gMDgwNTE1IHBvcnRpbmcgYnkgYW15IGZyb20gd2luZG93cyBjb2RlLiovCisJCXByYS0+dXBwZXJfcnNzaV90aHJlc2hvbGRfcmF0cgkJPSAJMHg4ZjBmMDAwMDsKKwkJcHJhLT5taWRkbGVfcnNzaV90aHJlc2hvbGRfcmF0cgkJPSAJMHg4ZjBmZjAwMDsKKwkJcHJhLT5sb3dfcnNzaV90aHJlc2hvbGRfcmF0cgkJPSAJMHg4ZjBmZjAwMTsKKwkJcHJhLT5sb3dfcnNzaV90aHJlc2hvbGRfcmF0cl80ME0JPSAJMHg4ZjBmZjAwNTsKKwkJcHJhLT5sb3dfcnNzaV90aHJlc2hvbGRfcmF0cl8yME0JPSAJMHg4ZjBmZjAwMTsKKwkJcHJhLT5waW5nX3Jzc2lfcmF0cgk9IAkweDAwMDAwMDBkOy8vY29zYSBhZGQgZm9yIHRlc3QKKwl9CisJZWxzZSBpZiAocHJpdi0+cmZfdHlwZSA9PSBSRl8xVDJSKQorCXsKKwkJcHJhLT51cHBlcl9yc3NpX3RocmVzaG9sZF9yYXRyCQk9IAkweDAwMGYwMDAwOworCQlwcmEtPm1pZGRsZV9yc3NpX3RocmVzaG9sZF9yYXRyCQk9IAkweDAwMGZmMDAwOworCQlwcmEtPmxvd19yc3NpX3RocmVzaG9sZF9yYXRyCQk9IAkweDAwMGZmMDAxOworCQlwcmEtPmxvd19yc3NpX3RocmVzaG9sZF9yYXRyXzQwTQk9IAkweDAwMGZmMDA1OworCQlwcmEtPmxvd19yc3NpX3RocmVzaG9sZF9yYXRyXzIwTQk9IAkweDAwMGZmMDAxOworCQlwcmEtPnBpbmdfcnNzaV9yYXRyCT0gCTB4MDAwMDAwMGQ7Ly9jb3NhIGFkZCBmb3IgdGVzdAorCX0KKworfQkvLyBJbml0UmF0ZUFkYXB0aXZlCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246CWRtX2NoZWNrX3JhdGVfYWRhcHRpdmUoKQorICoKKyAqIE92ZXJ2aWV3OgorICoKKyAqIElucHV0OgkJTk9ORQorICoKKyAqIE91dHB1dDoJCU5PTkUKKyAqCisgKiBSZXR1cm46CQlOT05FCisgKgorICogUmV2aXNlZCBIaXN0b3J5OgorICoJV2hlbgkJV2hvCQlSZW1hcmsKKyAqCTA1LzI2LzA4CWFteSAJQ3JlYXRlIHZlcnNpb24gMCBwcm90aW5nIGZyb20gd2luZG93cyBjb2RlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIGRtX2NoZWNrX3JhdGVfYWRhcHRpdmUoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IHByaXYtPmllZWU4MDIxMS0+cEhUSW5mbzsKKwlwcmF0ZV9hZGFwdGl2ZQkJCXByYSA9IChwcmF0ZV9hZGFwdGl2ZSkmcHJpdi0+cmF0ZV9hZGFwdGl2ZTsKKwl1MzIJCQkJCQljdXJyZW50UkFUUiwgdGFyZ2V0UkFUUiA9IDA7CisJdTMyCQkJCQkJTG93UlNTSVRocmVzaEZvclJBID0gMCwgSGlnaFJTU0lUaHJlc2hGb3JSQSA9IDA7CisJYm9vbAkJCQkJCWJzaG9ydF9naV9lbmFibGVkID0gZmFsc2U7CisJc3RhdGljIHU4CQkJCQlwaW5nX3Jzc2lfc3RhdGU9MDsKKworCisJaWYoIXByaXYtPnVwKQorCXsKKwkJUlRfVFJBQ0UoQ09NUF9SQVRFLCAiPC0tLS0gZG1fY2hlY2tfcmF0ZV9hZGFwdGl2ZSgpOiBkcml2ZXIgaXMgZ29pbmcgdG8gdW5sb2FkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmKHByYS0+cmF0ZV9hZGFwdGl2ZV9kaXNhYmxlZCkvL3RoaXMgdmFyaWFibGUgaXMgc2V0IGJ5IGlvY3RsLgorCQlyZXR1cm47CisKKwkvLyBUT0RPOiBPbmx5IDExbiBtb2RlIGlzIGltcGxlbWVudGVkIGN1cnJlbnRseSwKKwlpZiggIShwcml2LT5pZWVlODAyMTEtPm1vZGUgPT0gV0lSRUxFU1NfTU9ERV9OXzI0RyB8fAorCQkgcHJpdi0+aWVlZTgwMjExLT5tb2RlID09IFdJUkVMRVNTX01PREVfTl81RykpCisJCSByZXR1cm47CisKKwlpZiggcHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEICkKKwl7CisJLy8JUlRfVFJBQ0UoQ09NUF9SQVRFLCAiZG1fQ2hlY2tSYXRlQWRhcHRpdmUoKTogXHQiKTsKKworCQkvLworCQkvLyBDaGVjayB3aGV0aGVyIFNob3J0IEdJIGlzIGVuYWJsZWQKKwkJLy8KKwkJYnNob3J0X2dpX2VuYWJsZWQgPSAocEhUSW5mby0+YkN1clR4Qlc0ME1IeiAmJiBwSFRJbmZvLT5iQ3VyU2hvcnRHSTQwTUh6KSB8fAorCQkJKCFwSFRJbmZvLT5iQ3VyVHhCVzQwTUh6ICYmIHBIVEluZm8tPmJDdXJTaG9ydEdJMjBNSHopOworCisKKwkJcHJhLT51cHBlcl9yc3NpX3RocmVzaG9sZF9yYXRyID0KKwkJCQkocHJhLT51cHBlcl9yc3NpX3RocmVzaG9sZF9yYXRyICYgKH5CSVQzMSkpIHwgKChic2hvcnRfZ2lfZW5hYmxlZCk/IEJJVDMxOjApIDsKKworCQlwcmEtPm1pZGRsZV9yc3NpX3RocmVzaG9sZF9yYXRyID0KKwkJCQkocHJhLT5taWRkbGVfcnNzaV90aHJlc2hvbGRfcmF0ciAmICh+QklUMzEpKSB8ICgoYnNob3J0X2dpX2VuYWJsZWQpPyBCSVQzMTowKSA7CisKKwkJaWYgKHByaXYtPkN1cnJlbnRDaGFubmVsQlcgIT0gSFRfQ0hBTk5FTF9XSURUSF8yMCkKKwkJeworCQkJcHJhLT5sb3dfcnNzaV90aHJlc2hvbGRfcmF0ciA9CisJCQkJKHByYS0+bG93X3Jzc2lfdGhyZXNob2xkX3JhdHJfNDBNICYgKH5CSVQzMSkpIHwgKChic2hvcnRfZ2lfZW5hYmxlZCk/IEJJVDMxOjApIDsKKwkJfQorCQllbHNlCisJCXsKKwkJCXByYS0+bG93X3Jzc2lfdGhyZXNob2xkX3JhdHIgPQorCQkJKHByYS0+bG93X3Jzc2lfdGhyZXNob2xkX3JhdHJfMjBNICYgKH5CSVQzMSkpIHwgKChic2hvcnRfZ2lfZW5hYmxlZCk/IEJJVDMxOjApIDsKKwkJfQorCQkvL2Nvc2EgYWRkIGZvciB0ZXN0CisJCXByYS0+cGluZ19yc3NpX3JhdHIgPQorCQkJCShwcmEtPnBpbmdfcnNzaV9yYXRyICYgKH5CSVQzMSkpIHwgKChic2hvcnRfZ2lfZW5hYmxlZCk/IEJJVDMxOjApIDsKKworCQkvKiAyMDA3LzEwLzA4IE1IIFdlIHN1cHBvcnQgUkEgc21vb3RoIHNjaGVtZSBub3cuIFdoZW4gaXQgaXMgdGhlIGZpcnN0CisJCSAgIHRpbWUgdG8gbGluayB3aXRoIEFQLiBXZSB3aWxsIG5vdCBjaGFuZ2UgdXBwZXIvbG93ZXIgdGhyZXNob2xkLiBJZgorCQkgICBTVEEgc3RheSBpbiBoaWdoIG9yIGxvdyBsZXZlbCwgd2UgbXVzdCBjaGFuZ2UgdHdvIGRpZmZlcmVudCB0aHJlc2hvbGQKKwkJICAgdG8gcHJldmVudCBqdW1waW5nIGZyZXF1ZW50bHkuICovCisJCWlmIChwcmEtPnJhdHJfc3RhdGUgPT0gRE1fUkFUUl9TVEFfSElHSCkKKwkJeworCQkJSGlnaFJTU0lUaHJlc2hGb3JSQSAJPSBwcmEtPmhpZ2gybG93X3Jzc2lfdGhyZXNoX2Zvcl9yYTsKKwkJCUxvd1JTU0lUaHJlc2hGb3JSQQk9IChwcml2LT5DdXJyZW50Q2hhbm5lbEJXICE9IEhUX0NIQU5ORUxfV0lEVEhfMjApPworCQkJCQkocHJhLT5sb3dfcnNzaV90aHJlc2hfZm9yX3JhNDBNKToocHJhLT5sb3dfcnNzaV90aHJlc2hfZm9yX3JhMjBNKTsKKwkJfQorCQllbHNlIGlmIChwcmEtPnJhdHJfc3RhdGUgPT0gRE1fUkFUUl9TVEFfTE9XKQorCQl7CisJCQlIaWdoUlNTSVRocmVzaEZvclJBCT0gcHJhLT5oaWdoX3Jzc2lfdGhyZXNoX2Zvcl9yYTsKKwkJCUxvd1JTU0lUaHJlc2hGb3JSQSAJPSAocHJpdi0+Q3VycmVudENoYW5uZWxCVyAhPSBIVF9DSEFOTkVMX1dJRFRIXzIwKT8KKwkJCQkJKHByYS0+bG93MmhpZ2hfcnNzaV90aHJlc2hfZm9yX3JhNDBNKToocHJhLT5sb3cyaGlnaF9yc3NpX3RocmVzaF9mb3JfcmEyME0pOworCQl9CisJCWVsc2UKKwkJeworCQkJSGlnaFJTU0lUaHJlc2hGb3JSQQk9IHByYS0+aGlnaF9yc3NpX3RocmVzaF9mb3JfcmE7CisJCQlMb3dSU1NJVGhyZXNoRm9yUkEJPSAocHJpdi0+Q3VycmVudENoYW5uZWxCVyAhPSBIVF9DSEFOTkVMX1dJRFRIXzIwKT8KKwkJCQkJKHByYS0+bG93X3Jzc2lfdGhyZXNoX2Zvcl9yYTQwTSk6KHByYS0+bG93X3Jzc2lfdGhyZXNoX2Zvcl9yYTIwTSk7CisJCX0KKworCQkvL0RiZ1ByaW50KCJbRE1dIFRIcmVzaCBIL0w9JWQvJWRcblxyIiwgUkFUUi5IaWdoUlNTSVRocmVzaEZvclJBLCBSQVRSLkxvd1JTU0lUaHJlc2hGb3JSQSk7CisJCWlmKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0gKGxvbmcpSGlnaFJTU0lUaHJlc2hGb3JSQSkKKwkJeworCQkJLy9EYmdQcmludCgiW0RNXSBSU1NJPSVkIFNUQT1ISUdIXG5cciIsIHBIYWxEYXRhLT5VbmRlY29yYXRlZFNtb290aGVkUFdEQik7CisJCQlwcmEtPnJhdHJfc3RhdGUgPSBETV9SQVRSX1NUQV9ISUdIOworCQkJdGFyZ2V0UkFUUiA9IHByYS0+dXBwZXJfcnNzaV90aHJlc2hvbGRfcmF0cjsKKwkJfWVsc2UgaWYocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+PSAobG9uZylMb3dSU1NJVGhyZXNoRm9yUkEpCisJCXsKKwkJCS8vRGJnUHJpbnQoIltETV0gUlNTST0lZCBTVEE9TWlkZGxlXG5cciIsIHBIYWxEYXRhLT5VbmRlY29yYXRlZFNtb290aGVkUFdEQik7CisJCQlwcmEtPnJhdHJfc3RhdGUgPSBETV9SQVRSX1NUQV9NSURETEU7CisJCQl0YXJnZXRSQVRSID0gcHJhLT5taWRkbGVfcnNzaV90aHJlc2hvbGRfcmF0cjsKKwkJfWVsc2UKKwkJeworCQkJLy9EYmdQcmludCgiW0RNXSBSU1NJPSVkIFNUQT1MT1dcblxyIiwgcEhhbERhdGEtPlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCKTsKKwkJCXByYS0+cmF0cl9zdGF0ZSA9IERNX1JBVFJfU1RBX0xPVzsKKwkJCXRhcmdldFJBVFIgPSBwcmEtPmxvd19yc3NpX3RocmVzaG9sZF9yYXRyOworCQl9CisKKwkJCS8vY29zYSBhZGQgZm9yIHRlc3QKKwkJaWYocHJhLT5waW5nX3Jzc2lfZW5hYmxlKQorCQl7CisJCQkvL3BIYWxEYXRhLT5VbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IDE5OworCQkJaWYocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8IChsb25nKShwcmEtPnBpbmdfcnNzaV90aHJlc2hfZm9yX3JhKzUpKQorCQkJeworCQkJCWlmKCAocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8IChsb25nKXByYS0+cGluZ19yc3NpX3RocmVzaF9mb3JfcmEpIHx8CisJCQkJCXBpbmdfcnNzaV9zdGF0ZSApCisJCQkJeworCQkJCQkvL0RiZ1ByaW50KCJUZXN0UlNTSSA9ICVkLCBzZXQgUkFUUiB0byAweCV4IFxuIiwgcEhhbERhdGEtPlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCLCBwUkEtPlRlc3RSU1NJUkFUUik7CisJCQkJCXByYS0+cmF0cl9zdGF0ZSA9IERNX1JBVFJfU1RBX0xPVzsKKwkJCQkJdGFyZ2V0UkFUUiA9IHByYS0+cGluZ19yc3NpX3JhdHI7CisJCQkJCXBpbmdfcnNzaV9zdGF0ZSA9IDE7CisJCQkJfQorCQkJCS8vZWxzZQorCQkJCS8vCURiZ1ByaW50KCJUZXN0UlNTSSBpcyBiZXR3ZWVuIHRoZSByYW5nZS4gXG4iKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvL0RiZ1ByaW50KCJUZXN0UlNTSSBSZWNvdmVyIHRvIDB4JXggXG4iLCB0YXJnZXRSQVRSKTsKKwkJCQlwaW5nX3Jzc2lfc3RhdGUgPSAwOworCQkJfQorCQl9CisKKwkJLy8gMjAwOC4wNC4wMQorCQkvLyBGb3IgUlRMODE5WCwgaWYgcGFpcndpc2VrZXkgPSB3ZXAvdGtpcCwgd2Ugc3VwcG9ydCBvbmx5IE1DUzB+Ny4KKwkJaWYocHJpdi0+aWVlZTgwMjExLT5HZXRIYWxmTm1vZGVTdXBwb3J0QnlBUHNIYW5kbGVyKGRldikpCisJCQl0YXJnZXRSQVRSICY9ICAweGYwMGZmZmZmOworCisJCS8vCisJCS8vIENoZWNrIHdoZXRoZXIgdXBkYXRpbmcgb2YgUkFUUjAgaXMgcmVxdWlyZWQKKwkJLy8KKwkJY3VycmVudFJBVFIgPSByZWFkX25pY19kd29yZChkZXYsIFJBVFIwKTsKKwkJaWYoIHRhcmdldFJBVFIgIT0gIGN1cnJlbnRSQVRSICkKKwkJeworCQkJdTMyIHJhdHJfdmFsdWU7CisJCQlyYXRyX3ZhbHVlID0gdGFyZ2V0UkFUUjsKKwkJCVJUX1RSQUNFKENPTVBfUkFURSwiY3VycmVudFJBVFIgPSAleCwgdGFyZ2V0UkFUUiA9ICV4XG4iLCBjdXJyZW50UkFUUiwgdGFyZ2V0UkFUUik7CisJCQlpZihwcml2LT5yZl90eXBlID09IFJGXzFUMlIpCisJCQl7CisJCQkJcmF0cl92YWx1ZSAmPSB+KFJBVEVfQUxMX09GRE1fMlNTKTsKKwkJCX0KKwkJCXdyaXRlX25pY19kd29yZChkZXYsIFJBVFIwLCByYXRyX3ZhbHVlKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgVUZXUCwgMSk7CisKKwkJCXByYS0+bGFzdF9yYXRyID0gdGFyZ2V0UkFUUjsKKwkJfQorCisJfQorCWVsc2UKKwl7CisJCXByYS0+cmF0cl9zdGF0ZSA9IERNX1JBVFJfU1RBX01BWDsKKwl9CisKK30JLy8gZG1fQ2hlY2tSYXRlQWRhcHRpdmUKKworCitzdGF0aWMgdm9pZCBkbV9pbml0X2JhbmR3aWR0aF9hdXRvc3dpdGNoKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXByaXYtPmllZWU4MDIxMS0+YmFuZHdpZHRoX2F1dG9fc3dpdGNoLnRocmVzaG9sZF8yME1oenRvNDBNaHogPSBCV19BVVRPX1NXSVRDSF9MT1dfSElHSDsKKwlwcml2LT5pZWVlODAyMTEtPmJhbmR3aWR0aF9hdXRvX3N3aXRjaC50aHJlc2hvbGRfNDBNaHp0bzIwTWh6ID0gQldfQVVUT19TV0lUQ0hfSElHSF9MT1c7CisJcHJpdi0+aWVlZTgwMjExLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2guYmZvcmNlZF90eDIwTWh6ID0gZmFsc2U7CisJcHJpdi0+aWVlZTgwMjExLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2guYmF1dG9zd2l0Y2hfZW5hYmxlID0gZmFsc2U7CisKK30JLy8gZG1faW5pdF9iYW5kd2lkdGhfYXV0b3N3aXRjaAorCisKK3N0YXRpYyB2b2lkIGRtX2JhbmR3aWR0aF9hdXRvc3dpdGNoKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmKHByaXYtPkN1cnJlbnRDaGFubmVsQlcgPT0gSFRfQ0hBTk5FTF9XSURUSF8yMCB8fCFwcml2LT5pZWVlODAyMTEtPmJhbmR3aWR0aF9hdXRvX3N3aXRjaC5iYXV0b3N3aXRjaF9lbmFibGUpeworCQlyZXR1cm47CisJfWVsc2V7CisJCWlmKHByaXYtPmllZWU4MDIxMS0+YmFuZHdpZHRoX2F1dG9fc3dpdGNoLmJmb3JjZWRfdHgyME1oeiA9PSBmYWxzZSl7Ly9JZiBzZW5kIHBhY2tldHMgaW4gNDAgTWh6IGluIDIwLzQwCisJCQlpZihwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDw9IHByaXYtPmllZWU4MDIxMS0+YmFuZHdpZHRoX2F1dG9fc3dpdGNoLnRocmVzaG9sZF80ME1oenRvMjBNaHopCisJCQkJcHJpdi0+aWVlZTgwMjExLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2guYmZvcmNlZF90eDIwTWh6ID0gdHJ1ZTsKKwkJfWVsc2V7Ly9pbiBmb3JjZSBzZW5kIHBhY2tldHMgaW4gMjAgTWh6IGluIDIwLzQwCisJCQlpZihwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IHByaXYtPmllZWU4MDIxMS0+YmFuZHdpZHRoX2F1dG9fc3dpdGNoLnRocmVzaG9sZF8yME1oenRvNDBNaHopCisJCQkJcHJpdi0+aWVlZTgwMjExLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2guYmZvcmNlZF90eDIwTWh6ID0gZmFsc2U7CisKKwkJfQorCX0KK30JLy8gZG1fQmFuZHdpZHRoQXV0b1N3aXRjaAorCisvL09GRE0gZGVmYXVsdCBhdCAwZGIsIGluZGV4PTYuCitzdGF0aWMgdTMyIE9GRE1Td2luZ1RhYmxlW09GRE1fVGFibGVfTGVuZ3RoXSA9IHsKKwkweDdmODAwMWZlLAkvLyAwLCArNmRiCisJMHg3MWMwMDFjNywJLy8gMSwgKzVkYgorCTB4NjU0MDAxOTUsCS8vIDIsICs0ZGIKKwkweDVhNDAwMTY5LAkvLyAzLCArM2RiCisJMHg1MDgwMDE0MiwJLy8gNCwgKzJkYgorCTB4NDdjMDAxMWYsCS8vIDUsICsxZGIKKwkweDQwMDAwMTAwLAkvLyA2LCArMGRiID09PT4gZGVmYXVsdCwgdXBwZXIgZm9yIGhpZ2hlciB0ZW1wcmF0dXJlLCBsb3dlciBmb3IgbG93IHRlbXByYXR1cmUKKwkweDM5MDAwMGU0LAkvLyA3LCAtMWRiCisJMHgzMmMwMDBjYiwJLy8gOCwgLTJkYgorCTB4MmQ0MDAwYjUsCS8vIDksIC0zZGIKKwkweDI4ODAwMGEyLAkvLyAxMCwgLTRkYgorCTB4MjQwMDAwOTAsCS8vIDExLCAtNWRiCisJMHgyMDAwMDA4MCwJLy8gMTIsIC02ZGIKKwkweDFjODAwMDcyLAkvLyAxMywgLTdkYgorCTB4MTk4MDAwNjYsCS8vIDE0LCAtOGRiCisJMHgyNmMwMDA1YiwJLy8gMTUsIC05ZGIKKwkweDI0NDAwMDUxLAkvLyAxNiwgLTEwZGIKKwkweDEyMDAwMDQ4LAkvLyAxNywgLTExZGIKKwkweDEwMDAwMDQwCS8vIDE4LCAtMTJkYgorfTsKKworc3RhdGljIHU4CUNDS1N3aW5nVGFibGVfQ2gxX0NoMTNbQ0NLX1RhYmxlX2xlbmd0aF1bOF0gPSB7CisJezB4MzYsIDB4MzUsIDB4MmUsIDB4MjUsIDB4MWMsIDB4MTIsIDB4MDksIDB4MDR9LAkvLyAwLCArMGRiID09PT4gQ0NLNDBNIGRlZmF1bHQKKwl7MHgzMCwgMHgyZiwgMHgyOSwgMHgyMSwgMHgxOSwgMHgxMCwgMHgwOCwgMHgwM30sCS8vIDEsIC0xZGIKKwl7MHgyYiwgMHgyYSwgMHgyNSwgMHgxZSwgMHgxNiwgMHgwZSwgMHgwNywgMHgwM30sCS8vIDIsIC0yZGIKKwl7MHgyNiwgMHgyNSwgMHgyMSwgMHgxYiwgMHgxNCwgMHgwZCwgMHgwNiwgMHgwM30sCS8vIDMsIC0zZGIKKwl7MHgyMiwgMHgyMSwgMHgxZCwgMHgxOCwgMHgxMSwgMHgwYiwgMHgwNiwgMHgwMn0sCS8vIDQsIC00ZGIKKwl7MHgxZiwgMHgxZSwgMHgxYSwgMHgxNSwgMHgxMCwgMHgwYSwgMHgwNSwgMHgwMn0sCS8vIDUsIC01ZGIKKwl7MHgxYiwgMHgxYSwgMHgxNywgMHgxMywgMHgwZSwgMHgwOSwgMHgwNCwgMHgwMn0sCS8vIDYsIC02ZGIgPT09PiBDQ0syME0gZGVmYXVsdAorCXsweDE4LCAweDE3LCAweDE1LCAweDExLCAweDBjLCAweDA4LCAweDA0LCAweDAyfSwJLy8gNywgLTdkYgorCXsweDE2LCAweDE1LCAweDEyLCAweDBmLCAweDBiLCAweDA3LCAweDA0LCAweDAxfSwJLy8gOCwgLThkYgorCXsweDEzLCAweDEzLCAweDEwLCAweDBkLCAweDBhLCAweDA2LCAweDAzLCAweDAxfSwJLy8gOSwgLTlkYgorCXsweDExLCAweDExLCAweDBmLCAweDBjLCAweDA5LCAweDA2LCAweDAzLCAweDAxfSwJLy8gMTAsIC0xMGRiCisJezB4MGYsIDB4MGYsIDB4MGQsIDB4MGIsIDB4MDgsIDB4MDUsIDB4MDMsIDB4MDF9CS8vIDExLCAtMTFkYgorfTsKKworc3RhdGljIHU4CUNDS1N3aW5nVGFibGVfQ2gxNFtDQ0tfVGFibGVfbGVuZ3RoXVs4XSA9IHsKKwl7MHgzNiwgMHgzNSwgMHgyZSwgMHgxYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vIDAsICswZGIgID09PT4gQ0NLNDBNIGRlZmF1bHQKKwl7MHgzMCwgMHgyZiwgMHgyOSwgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vIDEsIC0xZGIKKwl7MHgyYiwgMHgyYSwgMHgyNSwgMHgxNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vIDIsIC0yZGIKKwl7MHgyNiwgMHgyNSwgMHgyMSwgMHgxMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vIDMsIC0zZGIKKwl7MHgyMiwgMHgyMSwgMHgxZCwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vIDQsIC00ZGIKKwl7MHgxZiwgMHgxZSwgMHgxYSwgMHgwZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vIDUsIC01ZGIKKwl7MHgxYiwgMHgxYSwgMHgxNywgMHgwZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vIDYsIC02ZGIgID09PT4gQ0NLMjBNIGRlZmF1bHQKKwl7MHgxOCwgMHgxNywgMHgxNSwgMHgwYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vIDcsIC03ZGIKKwl7MHgxNiwgMHgxNSwgMHgxMiwgMHgwYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vIDgsIC04ZGIKKwl7MHgxMywgMHgxMywgMHgxMCwgMHgwYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vIDksIC05ZGIKKwl7MHgxMSwgMHgxMSwgMHgwZiwgMHgwOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCS8vIDEwLCAtMTBkYgorCXsweDBmLCAweDBmLCAweDBkLCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwfQkvLyAxMSwgLTExZGIKK307CisKK3N0YXRpYyB2b2lkIGRtX1RYUG93ZXJUcmFja2luZ0NhbGxiYWNrX1RTU0koc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWJvb2wJCQkJCQliSGlnaHBvd2Vyc3RhdGUsIHZpdmlmbGFnID0gRkFMU0U7CisJRENNRF9UWENNRF9UCQkJdHhfY21kOworCXU4CQkJCQkJcG93ZXJsZXZlbE9GRE0yNEc7CisJaW50CQkJCQkJaSA9MCwgaiA9IDAsIGsgPSAwOworCXU4CQkJCQkJUkZfVHlwZSwgdG1wX3JlcG9ydFs1XT17MCwgMCwgMCwgMCwgMH07CisJdTMyCQkJCQkJVmFsdWU7CisJdTgJCQkJCQlQd3JfRmxhZzsKKwl1MTYJCQkJCQlBdmdfVFNTSV9NZWFzLCBUU1NJXzEzZEJtLCBBdmdfVFNTSV9NZWFzX2Zyb21fZHJpdmVyPTA7CisJLy9SVF9TVEFUVVMgCQkJCXJ0U3RhdHVzID0gUlRfU1RBVFVTX1NVQ0NFU1M7CisJYm9vbCBydFN0YXR1cyA9IHRydWU7CisJdTMyCQkJCQkJZGVsdGE9MDsKKworCXdyaXRlX25pY19ieXRlKGRldiwgMHgxYmEsIDApOworCisJcHJpdi0+aWVlZTgwMjExLT5iZHluYW1pY190eHBvd2VyX2VuYWJsZSA9IGZhbHNlOworCWJIaWdocG93ZXJzdGF0ZSA9IHByaXYtPmJEeW5hbWljVHhIaWdoUG93ZXI7CisKKwlwb3dlcmxldmVsT0ZETTI0RyA9ICh1OCkocHJpdi0+UHdyX1RyYWNrPj4yNCk7CisJUkZfVHlwZSA9IHByaXYtPnJmX3R5cGU7CisJVmFsdWUgPSAoUkZfVHlwZTw8OCkgfCBwb3dlcmxldmVsT0ZETTI0RzsKKworCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJwb3dlcmxldmVsT0ZETTI0RyA9ICV4XG4iLCBwb3dlcmxldmVsT0ZETTI0Ryk7CisKKwlmb3IoaiA9IDA7IGo8PTMwOyBqKyspCit7CS8vZmlsbCB0eF9jbWQKKworCXR4X2NtZC5PcAkJPSBUWENNRF9TRVRfVFhfUFdSX1RSQUNLSU5HOworCXR4X2NtZC5MZW5ndGgJPSA0OworCXR4X2NtZC5WYWx1ZQkJPSBWYWx1ZTsKKyNpZmRlZiBSVEw4MTkyVQorCXJ0U3RhdHVzID0gU2VuZFR4Q29tbWFuZFBhY2tldChkZXYsICZ0eF9jbWQsIDEyKTsKKwlpZiAocnRTdGF0dXMgPT0gUlRfU1RBVFVTX0ZBSUxVUkUpCisJeworCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiU2V0IGNvbmZpZ3VyYXRpb24gd2l0aCB0eCBjbWQgcXVldWUgZmFpbCFcbiIpOworCX0KKyNlbHNlCisJY21wa19tZXNzYWdlX2hhbmRsZV90eChkZXYsICh1OCopJnR4X2NtZCwKKwkJCQkJCQkJREVTQ19QQUNLRVRfVFlQRV9JTklULCBzaXplb2YoRENNRF9UWENNRF9UKSk7CisjZW5kaWYKKwltZGVsYXkoMSk7CisJLy9EYmdQcmludCgiaGksIHZpdmksIHN0cmFuZ2VcbiIpOworCWZvcihpID0gMDtpIDw9IDMwOyBpKyspCisJeworCQlQd3JfRmxhZyA9IHJlYWRfbmljX2J5dGUoZGV2LCAweDFiYSk7CisKKwkJaWYgKFB3cl9GbGFnID09IDApCisJCXsKKwkJCW1kZWxheSgxKTsKKwkJCWNvbnRpbnVlOworCQl9CisjaWZkZWYgUlRMODE5MFAKKwkJQXZnX1RTU0lfTWVhcyA9IHJlYWRfbmljX3dvcmQoZGV2LCAweDFiYyk7CisjZWxzZQorCQlBdmdfVFNTSV9NZWFzID0gcmVhZF9uaWNfd29yZChkZXYsIDB4MTNjKTsKKyNlbmRpZgorCQlpZihBdmdfVFNTSV9NZWFzID09IDApCisJCXsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgMHgxYmEsIDApOworCQkJYnJlYWs7CisJCX0KKworCQlmb3IoayA9IDA7ayA8IDU7IGsrKykKKwkJeworI2lmZGVmIFJUTDgxOTBQCisJCQl0bXBfcmVwb3J0W2tdID0gcmVhZF9uaWNfYnl0ZShkZXYsIDB4MWQ4K2spOworI2Vsc2UKKwkJCWlmKGsgIT00KQorCQkJCXRtcF9yZXBvcnRba10gPSByZWFkX25pY19ieXRlKGRldiwgMHgxMzQrayk7CisJCQllbHNlCisJCQkJdG1wX3JlcG9ydFtrXSA9IHJlYWRfbmljX2J5dGUoZGV2LCAweDEzZSk7CisjZW5kaWYKKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJUU1NJX3JlcG9ydF92YWx1ZSA9ICVkXG4iLCB0bXBfcmVwb3J0W2tdKTsKKwkJfQorCisJCS8vY2hlY2sgaWYgdGhlIHJlcG9ydCB2YWx1ZSBpcyByaWdodAorCQlmb3IoayA9IDA7ayA8IDU7IGsrKykKKwkJeworCQkJaWYodG1wX3JlcG9ydFtrXSA8PSAyMCkKKwkJCXsKKwkJCQl2aXZpZmxhZyA9VFJVRTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZih2aXZpZmxhZyA9PVRSVUUpCisJCXsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgMHgxYmEsIDApOworCQkJdml2aWZsYWcgPSBGQUxTRTsKKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJ3ZSBmaWx0ZWQgdGhpcyBkYXRhXG4iKTsKKwkJCWZvcihrID0gMDtrIDwgNTsgaysrKQorCQkJCXRtcF9yZXBvcnRba10gPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlmb3IoayA9IDA7ayA8IDU7IGsrKykKKwkJeworCQkJQXZnX1RTU0lfTWVhc19mcm9tX2RyaXZlciArPSB0bXBfcmVwb3J0W2tdOworCQl9CisKKwkJQXZnX1RTU0lfTWVhc19mcm9tX2RyaXZlciA9IEF2Z19UU1NJX01lYXNfZnJvbV9kcml2ZXIqMTAwLzU7CisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJBdmdfVFNTSV9NZWFzX2Zyb21fZHJpdmVyID0gJWRcbiIsIEF2Z19UU1NJX01lYXNfZnJvbV9kcml2ZXIpOworCQlUU1NJXzEzZEJtID0gcHJpdi0+VFNTSV8xM2RCbTsKKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlRTU0lfMTNkQm0gPSAlZFxuIiwgVFNTSV8xM2RCbSk7CisKKwkJLy9pZihhYnMoQXZnX1RTU0lfTWVhc19mcm9tX2RyaXZlciAtIFRTU0lfMTNkQm0pIDw9IEVfRk9SX1RYX1BPV0VSX1RSQUNLKQorCQkvLyBGb3IgTWFjT1MtY29tcGF0aWJsZQorCQlpZihBdmdfVFNTSV9NZWFzX2Zyb21fZHJpdmVyID4gVFNTSV8xM2RCbSkKKwkJCWRlbHRhID0gQXZnX1RTU0lfTWVhc19mcm9tX2RyaXZlciAtIFRTU0lfMTNkQm07CisJCWVsc2UKKwkJCWRlbHRhID0gVFNTSV8xM2RCbSAtIEF2Z19UU1NJX01lYXNfZnJvbV9kcml2ZXI7CisKKwkJaWYoZGVsdGEgPD0gRV9GT1JfVFhfUE9XRVJfVFJBQ0spCisJCXsKKwkJCXByaXYtPmllZWU4MDIxMS0+YmR5bmFtaWNfdHhwb3dlcl9lbmFibGUgPSBUUlVFOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweDFiYSwgMCk7CisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAidHggcG93ZXIgdHJhY2sgaXMgZG9uZVxuIik7CisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAicHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4ID0gJWRcbiIsIHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCk7CisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAicHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwgPSAlZFxuIiwgcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwpOworI2lmZGVmIFJUTDgxOTBQCisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAicHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4ID0gJWRcbiIsIHByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleCk7CisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAicHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwgPSAlZFxuIiwgcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwpOworI2VuZGlmCisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAicHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UgPSAlZFxuIiwgcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UpOworCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbiA9ICVkXG4iLCBwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb24pOworCQkJcmV0dXJuOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYoQXZnX1RTU0lfTWVhc19mcm9tX2RyaXZlciA8IFRTU0lfMTNkQm0gLSBFX0ZPUl9UWF9QT1dFUl9UUkFDSykKKwkJCXsKKwkJCQlpZigocHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4ID4gMCkKKyNpZmRlZiBSVEw4MTkwUAorCQkJCQkmJihwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXggPiAwKQorI2VuZGlmCisJCQkJKQorCQkJCXsKKwkJCQkJcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4LS07CisJCQkJCWlmKHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsID4gNCkKKwkJCQkJeworCQkJCQkJcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwtLTsKKwkJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWEFUeElRSW1iYWxhbmNlLCBiTWFza0RXb3JkLCBwcml2LT50eGJiZ2Fpbl90YWJsZVtwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbF0udHhiYmdhaW5fdmFsdWUpOworCQkJCQl9CisjaWZkZWYgUlRMODE5MFAKKwkJCQkJcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4LS07CisJCQkJCWlmKHByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsID4gNCkKKwkJCQkJeworCQkJCQkJcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwtLTsKKwkJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWENUeElRSW1iYWxhbmNlLCBiTWFza0RXb3JkLCBwcml2LT50eGJiZ2Fpbl90YWJsZVtwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbF0udHhiYmdhaW5fdmFsdWUpOworCQkJCQl9CisjZW5kaWYKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYoKHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCA8IDM2KQorI2lmZGVmIFJUTDgxOTBQCisJCQkJCSYmKHByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleCA8IDM2KQorI2VuZGlmCisJCQkJCSkKKwkJCQl7CisJCQkJCXByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCsrOworCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCsrOworCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwgYk1hc2tEV29yZCwgcHJpdi0+dHhiYmdhaW5fdGFibGVbcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWxdLnR4YmJnYWluX3ZhbHVlKTsKKworI2lmZGVmIFJUTDgxOTBQCisJCQkJCXByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleCsrOworCQkJCQlwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCsrOworCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1hDVHhJUUltYmFsYW5jZSwgYk1hc2tEV29yZCwgcHJpdi0+dHhiYmdhaW5fdGFibGVbcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWxdLnR4YmJnYWluX3ZhbHVlKTsKKyNlbmRpZgorCQkJCX0KKwkJCX0KKwkJCXByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl9kaWZmZXJlbmNlCisJCQkJPSBwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXggLSBwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5nX2RlZmF1bHQ7CisKKwkJCWlmKHByaXYtPkN1cnJlbnRDaGFubmVsQlcgPT0gSFRfQ0hBTk5FTF9XSURUSF8yMCkKKwkJCQlwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb24KKwkJCQk9IHByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl8yME1kZWZhdWx0ICsgcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uX2RpZmZlcmVuY2U7CisJCQllbHNlCisJCQkJcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uCisJCQkJPSBwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25fNDBNZGVmYXVsdCArIHByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl9kaWZmZXJlbmNlOworCisJCQlpZihwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb24gPiAtMSYmcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uIDwyMykKKwkJCXsKKwkJCQlpZihwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID09IDE0ICYmICFwcml2LT5iY2NrX2luX2NoMTQpCisJCQkJeworCQkJCQlwcml2LT5iY2NrX2luX2NoMTQgPSBUUlVFOworCQkJCQlkbV9jY2tfdHhwb3dlcl9hZGp1c3QoZGV2LHByaXYtPmJjY2tfaW5fY2gxNCk7CisJCQkJfQorCQkJCWVsc2UgaWYocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCAhPSAxNCAmJiBwcml2LT5iY2NrX2luX2NoMTQpCisJCQkJeworCQkJCQlwcml2LT5iY2NrX2luX2NoMTQgPSBGQUxTRTsKKwkJCQkJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KGRldixwcml2LT5iY2NrX2luX2NoMTQpOworCQkJCX0KKwkJCQllbHNlCisJCQkJCWRtX2Nja190eHBvd2VyX2FkanVzdChkZXYscHJpdi0+YmNja19pbl9jaDE0KTsKKwkJCX0KKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCA9ICVkXG4iLCBwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXgpOworCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAicHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwgPSAlZFxuIiwgcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwpOworI2lmZGVmIFJUTDgxOTBQCisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXggPSAlZFxuIiwgcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4KTsKKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsID0gJWRcbiIsIHByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsKTsKKyNlbmRpZgorCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAicHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UgPSAlZFxuIiwgcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UpOworCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAicHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uID0gJWRcbiIsIHByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbik7CisKKwkJaWYgKHByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl9kaWZmZXJlbmNlIDw9IC0xMnx8cHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UgPj0gMjQpCisJCXsKKwkJCXByaXYtPmllZWU4MDIxMS0+YmR5bmFtaWNfdHhwb3dlcl9lbmFibGUgPSBUUlVFOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweDFiYSwgMCk7CisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAidHggcG93ZXIgdHJhY2stLS0+bGltaXRlZFxuIik7CisJCQlyZXR1cm47CisJCX0KKworCisJfQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4MWJhLCAwKTsKKwkJQXZnX1RTU0lfTWVhc19mcm9tX2RyaXZlciA9IDA7CisJCWZvcihrID0gMDtrIDwgNTsgaysrKQorCQkJdG1wX3JlcG9ydFtrXSA9IDA7CisJCWJyZWFrOworCX0KK30KKwkJcHJpdi0+aWVlZTgwMjExLT5iZHluYW1pY190eHBvd2VyX2VuYWJsZSA9IFRSVUU7CisJCXdyaXRlX25pY19ieXRlKGRldiwgMHgxYmEsIDApOworfQorCitzdGF0aWMgdm9pZCBkbV9UWFBvd2VyVHJhY2tpbmdDYWxsYmFja19UaGVybWFsTWV0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisjZGVmaW5lIFRoZXJtYWxNZXRlclZhbAk5CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMiB0bXBSZWdBLCBUZW1wQ0NrOworCXU4IHRtcE9GRE1pbmRleCwgdG1wQ0NLaW5kZXgsIHRtcENDSzIwTWluZGV4LCB0bXBDQ0s0ME1pbmRleCwgdG1wdmFsOworCWludCBpID0wLCBDQ0tTd2luZ05lZWRVcGRhdGU9MDsKKworCWlmKCFwcml2LT5idHhwb3dlcl90cmFja2luZ0luaXQpCisJeworCQkvL1F1ZXJ5IE9GRE0gZGVmYXVsdCBzZXR0aW5nCisJCXRtcFJlZ0E9IHJ0bDgxOTJfUXVlcnlCQlJlZyhkZXYsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsIGJNYXNrRFdvcmQpOworCQlmb3IoaT0wOyBpPE9GRE1fVGFibGVfTGVuZ3RoOyBpKyspCS8vZmluZCB0aGUgaW5kZXgKKwkJeworCQkJaWYodG1wUmVnQSA9PSBPRkRNU3dpbmdUYWJsZVtpXSkKKwkJCXsKKwkJCQlwcml2LT5PRkRNX2luZGV4PSAodTgpaTsKKwkJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiSW5pdGlhbCByZWcweCV4ID0gMHgleCwgT0ZETV9pbmRleD0weCV4XG4iLAorCQkJCQlyT0ZETTBfWEFUeElRSW1iYWxhbmNlLCB0bXBSZWdBLCBwcml2LT5PRkRNX2luZGV4KTsKKwkJCX0KKwkJfQorCisJCS8vUXVlcnkgQ0NLIGRlZmF1bHQgc2V0dGluZyBGcm9tIDB4YTIyCisJCVRlbXBDQ2sgPSBydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCByQ0NLMF9UeEZpbHRlcjEsIGJNYXNrQnl0ZTIpOworCQlmb3IoaT0wIDsgaTxDQ0tfVGFibGVfbGVuZ3RoIDsgaSsrKQorCQl7CisJCQlpZihUZW1wQ0NrID09ICh1MzIpQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1tpXVswXSkKKwkJCXsKKwkJCQlwcml2LT5DQ0tfaW5kZXggPSh1OCkgaTsKKwkJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiSW5pdGlhbCByZWcweCV4ID0gMHgleCwgQ0NLX2luZGV4PTB4JXhcbiIsCisJCQkJCXJDQ0swX1R4RmlsdGVyMSwgVGVtcENDaywgcHJpdi0+Q0NLX2luZGV4KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlwcml2LT5idHhwb3dlcl90cmFja2luZ0luaXQgPSBUUlVFOworCQkvL3BIYWxEYXRhLT5UWFBvd2VyY291bnQgPSAwOworCQlyZXR1cm47CisJfQorCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIHRoaXMgaXMgb25seSBmb3IgdGVzdCwgc2hvdWxkIGJlIG1hc2tlZAorCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8vIHJlYWQgYW5kIGZpbHRlciBvdXQgdW5yZWFzb25hYmxlIHZhbHVlCisJdG1wUmVnQSA9IHJ0bDgxOTJfcGh5X1F1ZXJ5UkZSZWcoZGV2LCBSRjkwX1BBVEhfQSwgMHgxMiwgMHgwNzgpOwkvLyAweDEyOiBSRiBSZWdbMTA6N10KKwlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiUmVhZGJhY2sgVGhlcm1hbE1ldGVyQSA9ICVkIFxuIiwgdG1wUmVnQSk7CisJaWYodG1wUmVnQSA8IDMgfHwgdG1wUmVnQSA+IDEzKQorCQlyZXR1cm47CisJaWYodG1wUmVnQSA+PSAxMikJLy8gaWYgb3ZlciAxMiwgVFAgd2lsbCBiZSBiYWQgd2hlbiBoaWdoIHRlbXByYXR1cmUKKwkJdG1wUmVnQSA9IDEyOworCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJWYWxpZCBUaGVybWFsTWV0ZXJBID0gJWQgXG4iLCB0bXBSZWdBKTsKKwlwcml2LT5UaGVybWFsTWV0ZXJbMF0gPSBUaGVybWFsTWV0ZXJWYWw7CS8vV2UgdXNlIGZpeGVkIHZhbHVlIGJ5IEJyeWFudCdzIHN1Z2dlc3Rpb24KKwlwcml2LT5UaGVybWFsTWV0ZXJbMV0gPSBUaGVybWFsTWV0ZXJWYWw7CS8vV2UgdXNlIGZpeGVkIHZhbHVlIGJ5IEJyeWFudCdzIHN1Z2dlc3Rpb24KKworCS8vR2V0IGN1cnJlbnQgUkYtQSB0ZW1wcmF0dXJlIGluZGV4CisJaWYocHJpdi0+VGhlcm1hbE1ldGVyWzBdID49ICh1OCl0bXBSZWdBKQkvL2xvd2VyIHRlbXByYXR1cmUKKwl7CisJCXRtcE9GRE1pbmRleCA9IHRtcENDSzIwTWluZGV4ID0gNisocHJpdi0+VGhlcm1hbE1ldGVyWzBdLSh1OCl0bXBSZWdBKTsKKwkJdG1wQ0NLNDBNaW5kZXggPSB0bXBDQ0syME1pbmRleCAtIDY7CisJCWlmKHRtcE9GRE1pbmRleCA+PSBPRkRNX1RhYmxlX0xlbmd0aCkKKwkJCXRtcE9GRE1pbmRleCA9IE9GRE1fVGFibGVfTGVuZ3RoLTE7CisJCWlmKHRtcENDSzIwTWluZGV4ID49IENDS19UYWJsZV9sZW5ndGgpCisJCQl0bXBDQ0syME1pbmRleCA9IENDS19UYWJsZV9sZW5ndGgtMTsKKwkJaWYodG1wQ0NLNDBNaW5kZXggPj0gQ0NLX1RhYmxlX2xlbmd0aCkKKwkJCXRtcENDSzQwTWluZGV4ID0gQ0NLX1RhYmxlX2xlbmd0aC0xOworCX0KKwllbHNlCisJeworCQl0bXB2YWwgPSAoKHU4KXRtcFJlZ0EgLSBwcml2LT5UaGVybWFsTWV0ZXJbMF0pOworCQlpZih0bXB2YWwgPj0gNikJCQkJCQkJCS8vIGhpZ2hlciB0ZW1wcmF0dXJlCisJCQl0bXBPRkRNaW5kZXggPSB0bXBDQ0syME1pbmRleCA9IDA7CQkvLyBtYXggdG8gKzZkQgorCQllbHNlCisJCQl0bXBPRkRNaW5kZXggPSB0bXBDQ0syME1pbmRleCA9IDYgLSB0bXB2YWw7CisJCXRtcENDSzQwTWluZGV4ID0gMDsKKwl9CisJLy9EYmdQcmludCgiJWRkYiwgdG1wT0ZETWluZGV4ID0gJWQsIHRtcENDSzIwTWluZGV4ID0gJWQsIHRtcENDSzQwTWluZGV4ID0gJWQiLAorCQkvLygodTFCeXRlKXRtcFJlZ0EgLSBwSGFsRGF0YS0+VGhlcm1hbE1ldGVyWzBdKSwKKwkJLy90bXBPRkRNaW5kZXgsIHRtcENDSzIwTWluZGV4LCB0bXBDQ0s0ME1pbmRleCk7CisJaWYocHJpdi0+Q3VycmVudENoYW5uZWxCVyAhPSBIVF9DSEFOTkVMX1dJRFRIXzIwKQkvLzQwTQorCQl0bXBDQ0tpbmRleCA9IHRtcENDSzQwTWluZGV4OworCWVsc2UKKwkJdG1wQ0NLaW5kZXggPSB0bXBDQ0syME1pbmRleDsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPT0gMTQgJiYgIXByaXYtPmJjY2tfaW5fY2gxNCkKKwl7CisJCXByaXYtPmJjY2tfaW5fY2gxNCA9IFRSVUU7CisJCUNDS1N3aW5nTmVlZFVwZGF0ZSA9IDE7CisJfQorCWVsc2UgaWYocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCAhPSAxNCAmJiBwcml2LT5iY2NrX2luX2NoMTQpCisJeworCQlwcml2LT5iY2NrX2luX2NoMTQgPSBGQUxTRTsKKwkJQ0NLU3dpbmdOZWVkVXBkYXRlID0gMTsKKwl9CisKKwlpZihwcml2LT5DQ0tfaW5kZXggIT0gdG1wQ0NLaW5kZXgpCisJeworCQlwcml2LT5DQ0tfaW5kZXggPSB0bXBDQ0tpbmRleDsKKwkJQ0NLU3dpbmdOZWVkVXBkYXRlID0gMTsKKwl9CisKKwlpZihDQ0tTd2luZ05lZWRVcGRhdGUpCisJeworCQkvL0RiZ1ByaW50KCJVcGRhdGUgQ0NLIFN3aW5nLCBDQ0tfaW5kZXggPSAlZFxuIiwgcEhhbERhdGEtPkNDS19pbmRleCk7CisJCWRtX2Nja190eHBvd2VyX2FkanVzdChkZXYsIHByaXYtPmJjY2tfaW5fY2gxNCk7CisJfQorCWlmKHByaXYtPk9GRE1faW5kZXggIT0gdG1wT0ZETWluZGV4KQorCXsKKwkJcHJpdi0+T0ZETV9pbmRleCA9IHRtcE9GRE1pbmRleDsKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsIGJNYXNrRFdvcmQsIE9GRE1Td2luZ1RhYmxlW3ByaXYtPk9GRE1faW5kZXhdKTsKKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlVwZGF0ZSBPRkRNU3dpbmdbJWRdID0gMHgleFxuIiwKKwkJCXByaXYtPk9GRE1faW5kZXgsIE9GRE1Td2luZ1RhYmxlW3ByaXYtPk9GRE1faW5kZXhdKTsKKwl9CisJcHJpdi0+dHhwb3dlcl9jb3VudCA9IDA7Cit9CisKK2V4dGVybgl2b2lkCWRtX3R4cG93ZXJfdHJhY2tpbmdjYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yayxzdHJ1Y3QgZGVsYXllZF93b3JrLHdvcmspOworICAgICAgIHN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGR3b3JrLHN0cnVjdCByODE5Ml9wcml2LHR4cG93ZXJfdHJhY2tpbmdfd3EpOworICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5pZWVlODAyMTEtPmRldjsKKworI2lmZGVmIFJUTDgxOTBQCisJZG1fVFhQb3dlclRyYWNraW5nQ2FsbGJhY2tfVFNTSShkZXYpOworI2Vsc2UKKwlpZihwcml2LT5iRGN1dCA9PSBUUlVFKQorCQlkbV9UWFBvd2VyVHJhY2tpbmdDYWxsYmFja19UU1NJKGRldik7CisJZWxzZQorCQlkbV9UWFBvd2VyVHJhY2tpbmdDYWxsYmFja19UaGVybWFsTWV0ZXIoZGV2KTsKKyNlbmRpZgorfQorCisKK3N0YXRpYyB2b2lkIGRtX0luaXRpYWxpemVUWFBvd2VyVHJhY2tpbmdfVFNTSShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJLy9Jbml0aWFsIHRoZSBUeCBCQiBpbmRleCBhbmQgbWFwcGluZyB2YWx1ZQorCXByaXYtPnR4YmJnYWluX3RhYmxlWzBdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCQkxMjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVswXS50eGJiZ2Fpbl92YWx1ZT0weDdmODAwMWZlOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzFdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCQkxMTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxXS50eGJiZ2Fpbl92YWx1ZT0weDc4ODAwMWUyOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzJdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCQkxMDsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyXS50eGJiZ2Fpbl92YWx1ZT0weDcxYzAwMWM3OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzNdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCQk5OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzNdLnR4YmJnYWluX3ZhbHVlPTB4NmI4MDAxYWU7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbNF0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAgIDg7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbNF0udHhiYmdhaW5fdmFsdWU9MHg2NTQwMDE5NTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVs1XS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgICAgNzsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVs1XS50eGJiZ2Fpbl92YWx1ZT0weDVmYzAwMTdmOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzZdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCSAgICAgICA2OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzZdLnR4YmJnYWluX3ZhbHVlPTB4NWE0MDAxNjk7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbN10udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAgIDU7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbN10udHhiYmdhaW5fdmFsdWU9MHg1NTQwMDE1NTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVs4XS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgICAgNDsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVs4XS50eGJiZ2Fpbl92YWx1ZT0weDUwODAwMTQyOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzldLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCSAgICAgICAzOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzldLnR4YmJnYWluX3ZhbHVlPTB4NGMwMDAxMzA7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMTBdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCSAgICAgICAyOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzEwXS50eGJiZ2Fpbl92YWx1ZT0weDQ3YzAwMTFmOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzExXS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgICAgMTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxMV0udHhiYmdhaW5fdmFsdWU9MHg0M2MwMDEwZjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxMl0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAgIDA7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMTJdLnR4YmJnYWluX3ZhbHVlPTB4NDAwMDAxMDA7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMTNdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCSAgICAgICAtMTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxM10udHhiYmdhaW5fdmFsdWU9MHgzYzgwMDBmMjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxNF0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtMjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxNF0udHhiYmdhaW5fdmFsdWU9MHgzOTAwMDBlNDsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxNV0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtMzsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxNV0udHhiYmdhaW5fdmFsdWU9MHgzNWMwMDBkNzsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxNl0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtNDsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxNl0udHhiYmdhaW5fdmFsdWU9MHgzMmMwMDBjYjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxN10udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtNTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxN10udHhiYmdhaW5fdmFsdWU9MHgzMDAwMDBjMDsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxOF0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJCSAgICAtNjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxOF0udHhiYmdhaW5fdmFsdWU9MHgyZDQwMDBiNTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxOV0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtNzsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxOV0udHhiYmdhaW5fdmFsdWU9MHgyYWMwMDBhYjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyMF0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtODsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyMF0udHhiYmdhaW5fdmFsdWU9MHgyODgwMDBhMjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyMV0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtOTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyMV0udHhiYmdhaW5fdmFsdWU9MHgyNjAwMDA5ODsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyMl0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtMTA7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMjJdLnR4YmJnYWluX3ZhbHVlPTB4MjQwMDAwOTA7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMjNdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCSAgICAgLTExOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzIzXS50eGJiZ2Fpbl92YWx1ZT0weDIyMDAwMDg4OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzI0XS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgIC0xMjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyNF0udHhiYmdhaW5fdmFsdWU9MHgyMDAwMDA4MDsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyNV0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtMTM7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMjVdLnR4YmJnYWluX3ZhbHVlPTB4MWEwMDAwNmM7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMjZdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCSAgICAgLTE0OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzI2XS50eGJiZ2Fpbl92YWx1ZT0weDFjODAwMDcyOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzI3XS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgIC0xNTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyN10udHhiYmdhaW5fdmFsdWU9MHgxODAwMDA2MDsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyOF0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtMTY7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMjhdLnR4YmJnYWluX3ZhbHVlPTB4MTk4MDAwNjY7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMjldLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCSAgICAgLTE3OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzI5XS50eGJiZ2Fpbl92YWx1ZT0weDE1ODAwMDU2OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzMwXS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgIC0xODsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVszMF0udHhiYmdhaW5fdmFsdWU9MHgyNmMwMDA1YjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVszMV0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtMTk7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMzFdLnR4YmJnYWluX3ZhbHVlPTB4MTQ0MDAwNTE7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMzJdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCSAgICAgLTIwOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzMyXS50eGJiZ2Fpbl92YWx1ZT0weDI0NDAwMDUxOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzMzXS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgIC0yMTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVszM10udHhiYmdhaW5fdmFsdWU9MHgxMzAwMDA0YzsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVszNF0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtMjI7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMzRdLnR4YmJnYWluX3ZhbHVlPTB4MTIwMDAwNDg7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMzVdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCSAgICAgLTIzOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzM1XS50eGJiZ2Fpbl92YWx1ZT0weDExMDAwMDQ0OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzM2XS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgIC0yNDsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVszNl0udHhiYmdhaW5fdmFsdWU9MHgxMDAwMDA0MDsKKworCS8vY2NrdHhiYl92YWx1ZWFycmF5WzBdIGlzIDB4QTIyIFsxXSBpcyAweEEyNCAuLi5bN10gaXMgMHhBMjkKKwkvL1RoaXMgVGFibGUgaXMgZm9yIENIMX5DSDEzCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzBdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MzY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzBdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MzU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzBdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MmU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzBdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MjU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzBdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MWM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzBdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MTI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzBdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDk7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzBdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDQ7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgzMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgzMjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgyYjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgyMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgxYTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgxMTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwODsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwNDsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDMwOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDJmOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDI5OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDIxOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDE5OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDEwOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDA4OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAzOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzNdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MmQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzNdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MmQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzNdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4Mjc7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzNdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MWY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzNdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MTg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzNdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MGY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzNdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzNdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDM7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgyYjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyYTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgyNTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgxZTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgxNjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwZTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwNzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMzsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDI4OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDI4OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDIyOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDFjOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDE1OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDBkOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDA3OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAzOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzZdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MjY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzZdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MjU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzZdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MjE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzZdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MWI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzZdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MTQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzZdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MGQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzZdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzZdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDM7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgyNDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxZjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgxOTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgxMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwYzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwNjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMzsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDIyOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDIxOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDFkOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDE4OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDExOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDBiOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDA2OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAyOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzldLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MjA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzldLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MjA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzldLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MWI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzldLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzldLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MTE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzldLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzldLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzldLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDI7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTBdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MWY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDFlOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMF0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxYTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTBdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDEwOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMF0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwYTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTBdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAyOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzExXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDFkOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxYzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MTg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzExXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDE0OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMV0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwZjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MGE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzExXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDA1OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMV0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMjsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxYjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTJdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MWE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDE3OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgxMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTJdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MGU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDA5OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwNDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTJdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDI7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTNdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MWE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDE5OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxM10uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxNjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTNdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDBkOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxM10uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwOTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTNdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAyOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDE4OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNF0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxNzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MTU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDExOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNF0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwYzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDA0OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNF0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMjsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxNzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTVdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MTY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDEzOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgxMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTVdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MGM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDA4OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwNDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTVdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDI7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTZdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MTY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDE1OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNl0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxMjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTZdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MGY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDBiOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNl0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwNzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTZdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAxOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDE0OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxN10uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxNDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MTE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDBlOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxN10uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwYjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDc7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAzOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxN10uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMjsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMThdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MTM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDEwOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgwZDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMThdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MGE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDA2OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMThdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDE7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTldLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MTI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDEyOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxOV0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgwZjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTldLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MGM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDA5OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxOV0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwNjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTldLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAxOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDExOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMF0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxMTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MGY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDBjOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMF0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwOTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAzOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMF0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMTsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjFdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MTA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDBlOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgwYjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjFdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MDg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDA1OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjFdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDE7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjJdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MGY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDBmOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMl0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgwZDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjJdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MGI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDA4OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMl0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwNTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjJdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAxOworCisJLy9jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gaXMgMHhBMjIgWzFdIGlzIDB4QTI0IC4uLls3XSBpcyAweEEyOQorCS8vVGhpcyBUYWJsZSBpcyBmb3IgQ0gxNAorCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzBdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MzY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMF0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgzNTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVswXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDJlOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzBdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MWI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMF0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVswXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzBdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMF0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzFdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MzM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgzMjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDJiOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzFdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTk7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzFdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzJdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MzA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMl0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyZjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDI5OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzJdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMl0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzJdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMl0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzNdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MmQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbM10uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyZDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVszXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDI3OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzNdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTc7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbM10uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVszXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzNdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbM10uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzRdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MmI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyYTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDI1OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzRdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzRdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzVdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4Mjg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyODsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDIyOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzVdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNV0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzVdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNV0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzZdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MjY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNl0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyNTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDIxOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzZdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNl0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzZdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNl0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzddLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MjQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDFmOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzddLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzddLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzhdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MjI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbOF0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyMTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDFkOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzhdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbOF0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzhdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbOF0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzldLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MjA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbOV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDFiOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzldLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbOV0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzldLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbOV0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDFmOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDFlOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDFhOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDBmOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MWQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MWM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MTg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MGU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDA7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxYjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxYTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxNzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgwZTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDFhOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDE5OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDE2OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDBkOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MTg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MTc7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MTU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MGM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDA7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxNzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxNjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgwYjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDE2OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDE1OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDEyOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDBiOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MTQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MTQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MTE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MGE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDA7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgwYTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDEyOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDEyOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDBmOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDA5OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MTE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MTE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MGY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MDk7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDA7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgwZTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgwODsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDBmOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDBmOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDBkOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDA4OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+YnR4cG93ZXJfdHJhY2tpbmcgPSBUUlVFOworCXByaXYtPnR4cG93ZXJfY291bnQgICAgICAgPSAwOworCXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nSW5pdCA9IEZBTFNFOworCit9CisKK3N0YXRpYyB2b2lkIGRtX0luaXRpYWxpemVUWFBvd2VyVHJhY2tpbmdfVGhlcm1hbE1ldGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJLy8gVHggUG93ZXIgdHJhY2tpbmcgYnkgVGhlcmVtYWwgTWV0ZXIgcmVxdWlyZSBGaXJtd2FyZSBSL1cgMy13aXJlLiBUaGlzIG1lY2hhbmlzbQorCS8vIGNhbiBiZSBlbmFibGVkIG9ubHkgd2hlbiBGaXJtd2FyZSBSL1cgMy13aXJlIGlzIGVuYWJsZWQuIE90aGVyd2lzZSwgZnJlcXVlbnQgci93CisJLy8gMy13aXJlIGJ5IGRyaXZlciBjYXVzZSBSRiBnb2VzIGludG8gd3Jvbmcgc3RhdGUuCisJaWYocHJpdi0+aWVlZTgwMjExLT5Gd1JXUkYpCisJCXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nID0gVFJVRTsKKwllbHNlCisJCXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nID0gRkFMU0U7CisJcHJpdi0+dHhwb3dlcl9jb3VudCAgICAgICA9IDA7CisJcHJpdi0+YnR4cG93ZXJfdHJhY2tpbmdJbml0ID0gRkFMU0U7Cit9CisKKwordm9pZCBkbV9pbml0aWFsaXplX3R4cG93ZXJfdHJhY2tpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisjaWZkZWYgUlRMODE5MFAKKwlkbV9Jbml0aWFsaXplVFhQb3dlclRyYWNraW5nX1RTU0koZGV2KTsKKyNlbHNlCisJaWYocHJpdi0+YkRjdXQgPT0gVFJVRSkKKwkJZG1fSW5pdGlhbGl6ZVRYUG93ZXJUcmFja2luZ19UU1NJKGRldik7CisJZWxzZQorCQlkbV9Jbml0aWFsaXplVFhQb3dlclRyYWNraW5nX1RoZXJtYWxNZXRlcihkZXYpOworI2VuZGlmCit9Ly8gZG1fSW5pdGlhbGl6ZVRYUG93ZXJUcmFja2luZworCisKK3N0YXRpYyB2b2lkIGRtX0NoZWNrVFhQb3dlclRyYWNraW5nX1RTU0koc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RhdGljIHUzMiB0eF9wb3dlcl90cmFja19jb3VudGVyID0gMDsKKworCWlmKCFwcml2LT5idHhwb3dlcl90cmFja2luZykKKwkJcmV0dXJuOworCWVsc2UKKwl7CisJCWlmKCh0eF9wb3dlcl90cmFja19jb3VudGVyICUgMzAgPT0gMCkmJih0eF9wb3dlcl90cmFja19jb3VudGVyICE9IDApKQorCQl7CisJCQkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPnByaXZfd3EsJnByaXYtPnR4cG93ZXJfdHJhY2tpbmdfd3EsMCk7CisJCX0KKwkJdHhfcG93ZXJfdHJhY2tfY291bnRlcisrOworCX0KKworfQorCisKK3N0YXRpYyB2b2lkIGRtX0NoZWNrVFhQb3dlclRyYWNraW5nX1RoZXJtYWxNZXRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdGF0aWMgdTggCVRNX1RyaWdnZXI9MDsKKwkvL0RiZ1ByaW50KCJkbV9DaGVja1RYUG93ZXJUcmFja2luZygpIFxuIik7CisJaWYoIXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nKQorCQlyZXR1cm47CisJZWxzZQorCXsKKwkJaWYocHJpdi0+dHhwb3dlcl9jb3VudCAgPD0gMikKKwkJeworCQkJcHJpdi0+dHhwb3dlcl9jb3VudCsrOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaWYoIVRNX1RyaWdnZXIpCisJeworCQkvL0F0dGVudGlvbiEhIFlvdSBoYXZlIHRvIHdpcnRlIGFsbCAxMmJpdHMgZGF0YSB0byBSRiwgb3IgaXQgbWF5IGNhdXNlIFJGIHRvIGNyYXNoCisJCS8vYWN0dWFsbHkgd3JpdGUgcmVnMHgwMiBiaXQxPTAsIHRoZW4gYml0MT0xLgorCQkvL0RiZ1ByaW50KCJUcmlnZ2VyIFRoZXJtYWxNZXRlciwgd3JpdGUgUkYgcmVnMHgyID0gMHg0ZCB0byAweDRmXG4iKTsKKwkJcnRsODE5Ml9waHlfU2V0UkZSZWcoZGV2LCBSRjkwX1BBVEhfQSwgMHgwMiwgYk1hc2sxMkJpdHMsIDB4NGQpOworCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIFJGOTBfUEFUSF9BLCAweDAyLCBiTWFzazEyQml0cywgMHg0Zik7CisJCXJ0bDgxOTJfcGh5X1NldFJGUmVnKGRldiwgUkY5MF9QQVRIX0EsIDB4MDIsIGJNYXNrMTJCaXRzLCAweDRkKTsKKwkJcnRsODE5Ml9waHlfU2V0UkZSZWcoZGV2LCBSRjkwX1BBVEhfQSwgMHgwMiwgYk1hc2sxMkJpdHMsIDB4NGYpOworCQlUTV9UcmlnZ2VyID0gMTsKKwkJcmV0dXJuOworCX0KKwllbHNlCisJeworCQkvL0RiZ1ByaW50KCJTY2hlZHVsZSBUeFBvd2VyVHJhY2tpbmdXb3JrSXRlbVxuIik7CisJCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+cHJpdl93cSwmcHJpdi0+dHhwb3dlcl90cmFja2luZ193cSwwKTsKKwkJVE1fVHJpZ2dlciA9IDA7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGRtX2NoZWNrX3R4cG93ZXJfdHJhY2tpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJLy9zdGF0aWMgdTMyIHR4X3Bvd2VyX3RyYWNrX2NvdW50ZXIgPSAwOworCisjaWZkZWYgIFJUTDgxOTBQCisJZG1fQ2hlY2tUWFBvd2VyVHJhY2tpbmdfVFNTSShkZXYpOworI2Vsc2UKKwlpZihwcml2LT5iRGN1dCA9PSBUUlVFKQorCQlkbV9DaGVja1RYUG93ZXJUcmFja2luZ19UU1NJKGRldik7CisJZWxzZQorCQlkbV9DaGVja1RYUG93ZXJUcmFja2luZ19UaGVybWFsTWV0ZXIoZGV2KTsKKyNlbmRpZgorCit9CS8vIGRtX0NoZWNrVFhQb3dlclRyYWNraW5nCisKKworc3RhdGljIHZvaWQgZG1fQ0NLVHhQb3dlckFkanVzdF9UU1NJKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGJvb2wgIGJJbkNIMTQpCit7CisJdTMyIFRlbXBWYWw7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8vV3JpdGUgMHhhMjIgMHhhMjMKKwlUZW1wVmFsID0gMDsKKwlpZighYkluQ0gxNCl7CisJCS8vV3JpdGUgMHhhMjIgMHhhMjMKKwkJVGVtcFZhbCA9IAlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gKworCQkJCQkocHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlW3ByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl0uY2NrdHhiYl92YWx1ZWFycmF5WzFdPDw4KSA7CisKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX1R4RmlsdGVyMSxiTWFza0hXb3JkLCBUZW1wVmFsKTsKKwkJLy9Xcml0ZSAweGEyNCB+IDB4YTI3CisJCVRlbXBWYWwgPSAwOworCQlUZW1wVmFsID0gCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVtwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25dLmNja3R4YmJfdmFsdWVhcnJheVsyXSArCisJCQkJCShwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM108PDgpICsKKwkJCQkJKHByaXYtPmNja190eGJiZ2Fpbl90YWJsZVtwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25dLmNja3R4YmJfdmFsdWVhcnJheVs0XTw8MTYgKSsKKwkJCQkJKHByaXYtPmNja190eGJiZ2Fpbl90YWJsZVtwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25dLmNja3R4YmJfdmFsdWVhcnJheVs1XTw8MjQpOworCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfVHhGaWx0ZXIyLGJNYXNrRFdvcmQsIFRlbXBWYWwpOworCQkvL1dyaXRlIDB4YTI4ICAweGEyOQorCQlUZW1wVmFsID0gMDsKKwkJVGVtcFZhbCA9IAlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gKworCQkJCQkocHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlW3ByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl0uY2NrdHhiYl92YWx1ZWFycmF5WzddPDw4KSA7CisKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX0RlYnVnUG9ydCxiTWFza0xXb3JkLCBUZW1wVmFsKTsKKwl9CisJZWxzZQorCXsKKwkJVGVtcFZhbCA9IAlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVtwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25dLmNja3R4YmJfdmFsdWVhcnJheVswXSArCisJCQkJCShwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVtwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25dLmNja3R4YmJfdmFsdWVhcnJheVsxXTw8OCkgOworCisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9UeEZpbHRlcjEsYk1hc2tIV29yZCwgVGVtcFZhbCk7CisJCS8vV3JpdGUgMHhhMjQgfiAweGEyNworCQlUZW1wVmFsID0gMDsKKwkJVGVtcFZhbCA9IAlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVtwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25dLmNja3R4YmJfdmFsdWVhcnJheVsyXSArCisJCQkJCShwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVtwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25dLmNja3R4YmJfdmFsdWVhcnJheVszXTw8OCkgKworCQkJCQkocHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF08PDE2ICkrCisJCQkJCShwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVtwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25dLmNja3R4YmJfdmFsdWVhcnJheVs1XTw8MjQpOworCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfVHhGaWx0ZXIyLGJNYXNrRFdvcmQsIFRlbXBWYWwpOworCQkvL1dyaXRlIDB4YTI4ICAweGEyOQorCQlUZW1wVmFsID0gMDsKKwkJVGVtcFZhbCA9IAlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVtwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25dLmNja3R4YmJfdmFsdWVhcnJheVs2XSArCisJCQkJCShwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVtwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25dLmNja3R4YmJfdmFsdWVhcnJheVs3XTw8OCkgOworCisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9EZWJ1Z1BvcnQsYk1hc2tMV29yZCwgVGVtcFZhbCk7CisJfQorCisKK30KKworc3RhdGljIHZvaWQgZG1fQ0NLVHhQb3dlckFkanVzdF9UaGVybWFsTWV0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwJYm9vbCAgYkluQ0gxNCkKK3sKKwl1MzIgVGVtcFZhbDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlUZW1wVmFsID0gMDsKKwlpZighYkluQ0gxNCkKKwl7CisJCS8vV3JpdGUgMHhhMjIgMHhhMjMKKwkJVGVtcFZhbCA9IAlDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW3ByaXYtPkNDS19pbmRleF1bMF0gKworCQkJCQkoQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1twcml2LT5DQ0tfaW5kZXhdWzFdPDw4KSA7CisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9UeEZpbHRlcjEsIGJNYXNrSFdvcmQsIFRlbXBWYWwpOworCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiQ0NLIG5vdCBjaG5sIDE0LCByZWcgMHgleCA9IDB4JXhcbiIsCisJCQlyQ0NLMF9UeEZpbHRlcjEsIFRlbXBWYWwpOworCQkvL1dyaXRlIDB4YTI0IH4gMHhhMjcKKwkJVGVtcFZhbCA9IDA7CisJCVRlbXBWYWwgPSAJQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1twcml2LT5DQ0tfaW5kZXhdWzJdICsKKwkJCQkJKENDS1N3aW5nVGFibGVfQ2gxX0NoMTNbcHJpdi0+Q0NLX2luZGV4XVszXTw8OCkgKworCQkJCQkoQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1twcml2LT5DQ0tfaW5kZXhdWzRdPDwxNiApKworCQkJCQkoQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1twcml2LT5DQ0tfaW5kZXhdWzVdPDwyNCk7CisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9UeEZpbHRlcjIsIGJNYXNrRFdvcmQsIFRlbXBWYWwpOworCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiQ0NLIG5vdCBjaG5sIDE0LCByZWcgMHgleCA9IDB4JXhcbiIsCisJCQlyQ0NLMF9UeEZpbHRlcjIsIFRlbXBWYWwpOworCQkvL1dyaXRlIDB4YTI4ICAweGEyOQorCQlUZW1wVmFsID0gMDsKKwkJVGVtcFZhbCA9IAlDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW3ByaXYtPkNDS19pbmRleF1bNl0gKworCQkJCQkoQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1twcml2LT5DQ0tfaW5kZXhdWzddPDw4KSA7CisKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX0RlYnVnUG9ydCwgYk1hc2tMV29yZCwgVGVtcFZhbCk7CisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJDQ0sgbm90IGNobmwgMTQsIHJlZyAweCV4ID0gMHgleFxuIiwKKwkJCXJDQ0swX0RlYnVnUG9ydCwgVGVtcFZhbCk7CisJfQorCWVsc2UKKwl7CisvLwkJcHJpdi0+Q0NLVHhQb3dlckFkanVzdENudE5vdENoMTQrKzsJLy9jb3NhIGFkZCBmb3IgZGVidWcuCisJCS8vV3JpdGUgMHhhMjIgMHhhMjMKKwkJVGVtcFZhbCA9IAlDQ0tTd2luZ1RhYmxlX0NoMTRbcHJpdi0+Q0NLX2luZGV4XVswXSArCisJCQkJCShDQ0tTd2luZ1RhYmxlX0NoMTRbcHJpdi0+Q0NLX2luZGV4XVsxXTw8OCkgOworCisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9UeEZpbHRlcjEsIGJNYXNrSFdvcmQsIFRlbXBWYWwpOworCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiQ0NLIGNobmwgMTQsIHJlZyAweCV4ID0gMHgleFxuIiwKKwkJCXJDQ0swX1R4RmlsdGVyMSwgVGVtcFZhbCk7CisJCS8vV3JpdGUgMHhhMjQgfiAweGEyNworCQlUZW1wVmFsID0gMDsKKwkJVGVtcFZhbCA9IAlDQ0tTd2luZ1RhYmxlX0NoMTRbcHJpdi0+Q0NLX2luZGV4XVsyXSArCisJCQkJCShDQ0tTd2luZ1RhYmxlX0NoMTRbcHJpdi0+Q0NLX2luZGV4XVszXTw8OCkgKworCQkJCQkoQ0NLU3dpbmdUYWJsZV9DaDE0W3ByaXYtPkNDS19pbmRleF1bNF08PDE2ICkrCisJCQkJCShDQ0tTd2luZ1RhYmxlX0NoMTRbcHJpdi0+Q0NLX2luZGV4XVs1XTw8MjQpOworCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfVHhGaWx0ZXIyLCBiTWFza0RXb3JkLCBUZW1wVmFsKTsKKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIkNDSyBjaG5sIDE0LCByZWcgMHgleCA9IDB4JXhcbiIsCisJCQlyQ0NLMF9UeEZpbHRlcjIsIFRlbXBWYWwpOworCQkvL1dyaXRlIDB4YTI4ICAweGEyOQorCQlUZW1wVmFsID0gMDsKKwkJVGVtcFZhbCA9IAlDQ0tTd2luZ1RhYmxlX0NoMTRbcHJpdi0+Q0NLX2luZGV4XVs2XSArCisJCQkJCShDQ0tTd2luZ1RhYmxlX0NoMTRbcHJpdi0+Q0NLX2luZGV4XVs3XTw8OCkgOworCisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9EZWJ1Z1BvcnQsIGJNYXNrTFdvcmQsIFRlbXBWYWwpOworCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCJDQ0sgY2hubCAxNCwgcmVnIDB4JXggPSAweCV4XG4iLAorCQkJckNDSzBfRGVidWdQb3J0LCBUZW1wVmFsKTsKKwl9Cit9CisKKworCitleHRlcm4gdm9pZCBkbV9jY2tfdHhwb3dlcl9hZGp1c3QoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlib29sICBiaW5jaDE0CispCit7CS8vIGRtX0NDS1R4UG93ZXJBZGp1c3QKKworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKyNpZmRlZiBSVEw4MTkwUAorCWRtX0NDS1R4UG93ZXJBZGp1c3RfVFNTSShkZXYsIGJpbmNoMTQpOworI2Vsc2UKKwlpZihwcml2LT5iRGN1dCA9PSBUUlVFKQorCQlkbV9DQ0tUeFBvd2VyQWRqdXN0X1RTU0koZGV2LCBiaW5jaDE0KTsKKwllbHNlCisJCWRtX0NDS1R4UG93ZXJBZGp1c3RfVGhlcm1hbE1ldGVyKGRldiwgYmluY2gxNCk7CisjZW5kaWYKK30KKworCisjaWZuZGVmICBSVEw4MTkyVQorc3RhdGljIHZvaWQgZG1fdHhwb3dlcl9yZXNldF9yZWNvdmVyeSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CispCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlN0YXJ0IFJlc2V0IFJlY292ZXJ5ID09PlxuIik7CisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsIGJNYXNrRFdvcmQsIHByaXYtPnR4YmJnYWluX3RhYmxlW3ByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF0udHhiYmdhaW5fdmFsdWUpOworCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJSZXNldCBSZWNvdmVyeTogRmlsbCBpbiAweGM4MCBpcyAlMDh4XG4iLHByaXYtPnR4YmJnYWluX3RhYmxlW3ByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF0udHhiYmdhaW5fdmFsdWUpOworCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJSZXNldCBSZWNvdmVyeTogRmlsbCBpbiBSRkFfdHhQb3dlclRyYWNraW5nSW5kZXggaXMgJXhcbiIscHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4KTsKKwlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiUmVzZXQgUmVjb3ZlcnkgOiBSRiBBIEkvUSBBbXBsaWZ5IEdhaW4gaXMgJWxkXG4iLHByaXYtPnR4YmJnYWluX3RhYmxlW3ByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF0udHhiYl9pcV9hbXBsaWZ5Z2Fpbik7CisJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlJlc2V0IFJlY292ZXJ5OiBDQ0sgQXR0ZW51YXRpb24gaXMgJWQgZEJcbiIscHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uKTsKKwlkbV9jY2tfdHhwb3dlcl9hZGp1c3QoZGV2LHByaXYtPmJjY2tfaW5fY2gxNCk7CisKKwlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1hDVHhJUUltYmFsYW5jZSwgYk1hc2tEV29yZCwgcHJpdi0+dHhiYmdhaW5fdGFibGVbcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4XS50eGJiZ2Fpbl92YWx1ZSk7CisJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlJlc2V0IFJlY292ZXJ5OiBGaWxsIGluIDB4YzkwIGlzICUwOHhcbiIscHJpdi0+dHhiYmdhaW5fdGFibGVbcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4XS50eGJiZ2Fpbl92YWx1ZSk7CisJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlJlc2V0IFJlY292ZXJ5OiBGaWxsIGluIFJGQ190eFBvd2VyVHJhY2tpbmdJbmRleCBpcyAleFxuIixwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXgpOworCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJSZXNldCBSZWNvdmVyeSA6IFJGIEMgSS9RIEFtcGxpZnkgR2FpbiBpcyAlbGRcbiIscHJpdi0+dHhiYmdhaW5fdGFibGVbcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4XS50eGJiX2lxX2FtcGxpZnlnYWluKTsKKworfQkvLyBkbV9UWFBvd2VyUmVzZXRSZWNvdmVyeQorCitleHRlcm4gdm9pZCBkbV9yZXN0b3JlX2R5bmFtaWNfbWVjaGFuaXNtX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMiAJcmVnX3JhdHIgPSBwcml2LT5yYXRlX2FkYXB0aXZlLmxhc3RfcmF0cjsKKworCWlmKCFwcml2LT51cCkKKwl7CisJCVJUX1RSQUNFKENPTVBfUkFURSwgIjwtLS0tIGRtX3Jlc3RvcmVfZHluYW1pY19tZWNoYW5pc21fc3RhdGUoKTogZHJpdmVyIGlzIGdvaW5nIHRvIHVubG9hZFxuIik7CisJCXJldHVybjsKKwl9CisKKwkvLworCS8vIFJlc3RvcmUgcHJldmlvdXMgc3RhdGUgZm9yIHJhdGUgYWRhcHRpdmUKKwkvLworCWlmKHByaXYtPnJhdGVfYWRhcHRpdmUucmF0ZV9hZGFwdGl2ZV9kaXNhYmxlZCkKKwkJcmV0dXJuOworCS8vIFRPRE86IE9ubHkgMTFuIG1vZGUgaXMgaW1wbGVtZW50ZWQgY3VycmVudGx5LAorCWlmKCAhKHByaXYtPmllZWU4MDIxMS0+bW9kZT09V0lSRUxFU1NfTU9ERV9OXzI0RyB8fAorCQkgcHJpdi0+aWVlZTgwMjExLT5tb2RlPT1XSVJFTEVTU19NT0RFX05fNUcpKQorCQkgcmV0dXJuOworCXsKKwkJCS8qIDIwMDcvMTEvMTUgTUggQ29weSBmcm9tIDgxOTBQQ0kuICovCisJCQl1MzIgcmF0cl92YWx1ZTsKKwkJCXJhdHJfdmFsdWUgPSByZWdfcmF0cjsKKwkJCWlmKHByaXYtPnJmX3R5cGUgPT0gUkZfMVQyUikJLy8gMVQyUiwgU3BhdGlhbCBTdHJlYW0gMiBzaG91bGQgYmUgZGlzYWJsZWQKKwkJCXsKKwkJCQlyYXRyX3ZhbHVlICY9fiAoUkFURV9BTExfT0ZETV8yU1MpOworCQkJCS8vRGJnUHJpbnQoIkhXX1ZBUl9UQVRSXzAgZnJvbSAweCV4ID09PiAweCV4XG4iLCAoKHB1NEJ5dGUpKHZhbCkpWzBdLCByYXRyX3ZhbHVlKTsKKwkJCX0KKwkJCS8vRGJnUHJpbnQoInNldCBIV19WQVJfVEFUUl8wID0gMHgleFxuIiwgcmF0cl92YWx1ZSk7CisJCQkvL2Nvc2EgUGxhdGZvcm1FRklPV3JpdGU0Qnl0ZShBZGFwdGVyLCBSQVRSMCwgKChwdTRCeXRlKSh2YWwpKVswXSk7CisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSQVRSMCwgcmF0cl92YWx1ZSk7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFVGV1AsIDEpOworCX0KKwkvL1Jlc29yZSBUWCBQb3dlciBUcmFja2luZyBJbmRleAorCWlmKHByaXYtPmJ0eHBvd2VyX3RyYWNraW5nSW5pdCAmJiBwcml2LT5idHhwb3dlcl90cmFja2luZyl7CisJCWRtX3R4cG93ZXJfcmVzZXRfcmVjb3ZlcnkoZGV2KTsKKwl9CisKKwkvLworCS8vUmVzdG9yZSBCQiBJbml0aWFsIEdhaW4KKwkvLworCWRtX2JiX2luaXRpYWxnYWluX3Jlc3RvcmUoZGV2KTsKKworfQkvLyBETV9SZXN0b3JlRHluYW1pY01lY2hhbmlzbVN0YXRlCisKK3N0YXRpYyB2b2lkIGRtX2JiX2luaXRpYWxnYWluX3Jlc3RvcmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIGJpdF9tYXNrID0gMHg3ZjsgLy9CaXQwfiBCaXQ2CisKKwlpZihkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtID09IERJR19BTEdPX0JZX1JTU0kpCisJCXJldHVybjsKKworCS8vRGlzYWJsZSBJbml0aWFsIEdhaW4KKwkvL1BIWV9TZXRCQlJlZyhBZGFwdGVyLCBVRldQLCBiTWFza0xXb3JkLCAweDgwMCk7CisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIFVGV1AsIGJNYXNrQnl0ZTEsIDB4OCk7CS8vIE9ubHkgY2xlYXIgYnl0ZSAxIGFuZCByZXdyaXRlLgorCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWEFBR0NDb3JlMSwgYml0X21hc2ssICh1MzIpcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhhYWdjY29yZTEpOworCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWEJBR0NDb3JlMSwgYml0X21hc2ssICh1MzIpcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhiYWdjY29yZTEpOworCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWENBR0NDb3JlMSwgYml0X21hc2ssICh1MzIpcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhjYWdjY29yZTEpOworCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWERBR0NDb3JlMSwgYml0X21hc2ssICh1MzIpcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhkYWdjY29yZTEpOworCWJpdF9tYXNrICA9IGJNYXNrQnl0ZTI7CisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX0NDQSwgYml0X21hc2ssICh1MzIpcHJpdi0+aW5pdGdhaW5fYmFja3VwLmNjYSk7CisKKwlSVF9UUkFDRShDT01QX0RJRywgImRtX0JCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YzUwIGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC54YWFnY2NvcmUxKTsKKwlSVF9UUkFDRShDT01QX0RJRywgImRtX0JCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YzU4IGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC54YmFnY2NvcmUxKTsKKwlSVF9UUkFDRShDT01QX0RJRywgImRtX0JCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YzYwIGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC54Y2FnY2NvcmUxKTsKKwlSVF9UUkFDRShDT01QX0RJRywgImRtX0JCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YzY4IGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC54ZGFnY2NvcmUxKTsKKwlSVF9UUkFDRShDT01QX0RJRywgImRtX0JCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YTBhIGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC5jY2EpOworCS8vRW5hYmxlIEluaXRpYWwgR2FpbgorCS8vUEhZX1NldEJCUmVnKEFkYXB0ZXIsIFVGV1AsIGJNYXNrTFdvcmQsIDB4MTAwKTsKKwlydGw4MTkyX3NldEJCcmVnKGRldiwgVUZXUCwgYk1hc2tCeXRlMSwgMHgxKTsJLy8gT25seSBjbGVhciBieXRlIDEgYW5kIHJld3JpdGUuCisKK30JLy8gZG1fQkJJbml0aWFsR2FpblJlc3RvcmUKKworCitleHRlcm4gdm9pZCBkbV9iYWNrdXBfZHluYW1pY19tZWNoYW5pc21fc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwkvLyBGc3luYyB0byBhdm9pZCByZXNldAorCXByaXYtPmJzd2l0Y2hfZnN5bmMgID0gZmFsc2U7CisJcHJpdi0+YmZzeW5jX3Byb2Nlc3NpbmcgPSBmYWxzZTsKKwkvL0JhY2t1cCBCQiBJbml0aWFsR2FpbgorCWRtX2JiX2luaXRpYWxnYWluX2JhY2t1cChkZXYpOworCit9CS8vIERNX0JhY2t1cER5bmFtaWNNZWNoYW5pc21TdGF0ZQorCisKK3N0YXRpYyB2b2lkIGRtX2JiX2luaXRpYWxnYWluX2JhY2t1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgYml0X21hc2sgPSBiTWFza0J5dGUwOyAvL0JpdDB+IEJpdDYKKworCWlmKGRtX2RpZ3RhYmxlLmRpZ19hbGdvcml0aG0gPT0gRElHX0FMR09fQllfUlNTSSkKKwkJcmV0dXJuOworCisJLy9QSFlfU2V0QkJSZWcoQWRhcHRlciwgVUZXUCwgYk1hc2tMV29yZCwgMHg4MDApOworCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBVRldQLCBiTWFza0J5dGUxLCAweDgpOwkvLyBPbmx5IGNsZWFyIGJ5dGUgMSBhbmQgcmV3cml0ZS4KKwlwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGFhZ2Njb3JlMSA9ICh1OClydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCByT0ZETTBfWEFBR0NDb3JlMSwgYml0X21hc2spOworCXByaXYtPmluaXRnYWluX2JhY2t1cC54YmFnY2NvcmUxID0gKHU4KXJ0bDgxOTJfUXVlcnlCQlJlZyhkZXYsIHJPRkRNMF9YQkFHQ0NvcmUxLCBiaXRfbWFzayk7CisJcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhjYWdjY29yZTEgPSAodTgpcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwgck9GRE0wX1hDQUdDQ29yZTEsIGJpdF9tYXNrKTsKKwlwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGRhZ2Njb3JlMSA9ICh1OClydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCByT0ZETTBfWERBR0NDb3JlMSwgYml0X21hc2spOworCWJpdF9tYXNrICA9IGJNYXNrQnl0ZTI7CisJcHJpdi0+aW5pdGdhaW5fYmFja3VwLmNjYSA9ICh1OClydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCByQ0NLMF9DQ0EsIGJpdF9tYXNrKTsKKworCVJUX1RSQUNFKENPTVBfRElHLCAiQkJJbml0aWFsR2FpbkJhY2t1cCAweGM1MCBpcyAleFxuIixwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGFhZ2Njb3JlMSk7CisJUlRfVFJBQ0UoQ09NUF9ESUcsICJCQkluaXRpYWxHYWluQmFja3VwIDB4YzU4IGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC54YmFnY2NvcmUxKTsKKwlSVF9UUkFDRShDT01QX0RJRywgIkJCSW5pdGlhbEdhaW5CYWNrdXAgMHhjNjAgaXMgJXhcbiIscHJpdi0+aW5pdGdhaW5fYmFja3VwLnhjYWdjY29yZTEpOworCVJUX1RSQUNFKENPTVBfRElHLCAiQkJJbml0aWFsR2FpbkJhY2t1cCAweGM2OCBpcyAleFxuIixwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGRhZ2Njb3JlMSk7CisJUlRfVFJBQ0UoQ09NUF9ESUcsICJCQkluaXRpYWxHYWluQmFja3VwIDB4YTBhIGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC5jY2EpOworCit9ICAgLy8gZG1fQkJJbml0aWFsR2FpbkJha2N1cAorCisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOglkbV9jaGFuZ2VfZHluYW1pY19pbml0Z2Fpbl90aHJlc2goKQorICoKKyAqIE92ZXJ2aWV3OgorICoKKyAqIElucHV0OgkJTk9ORQorICoKKyAqIE91dHB1dDoJCU5PTkUKKyAqCisgKiBSZXR1cm46CQlOT05FCisgKgorICogUmV2aXNlZCBIaXN0b3J5OgorICoJV2hlbgkJV2hvCQlSZW1hcmsKKyAqCTA1LzI5LzIwMDgJYW15CQlDcmVhdGUgVmVyc2lvbiAwIHBvcnRpbmcgZnJvbSB3aW5kb3dzIGNvZGUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIHZvaWQgZG1fY2hhbmdlX2R5bmFtaWNfaW5pdGdhaW5fdGhyZXNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCQkJCXUzMgkJZG1fdHlwZSwKKwkJCQkJCQkJdTMyCQlkbV92YWx1ZSkKK3sKKwlpZiAoZG1fdHlwZSA9PSBESUdfVFlQRV9USFJFU0hfSElHSCkKKwl7CisJCWRtX2RpZ3RhYmxlLnJzc2lfaGlnaF90aHJlc2ggPSBkbV92YWx1ZTsKKwl9CisJZWxzZSBpZiAoZG1fdHlwZSA9PSBESUdfVFlQRV9USFJFU0hfTE9XKQorCXsKKwkJZG1fZGlndGFibGUucnNzaV9sb3dfdGhyZXNoID0gZG1fdmFsdWU7CisJfQorCWVsc2UgaWYgKGRtX3R5cGUgPT0gRElHX1RZUEVfVEhSRVNIX0hJR0hQV1JfSElHSCkKKwl7CisJCWRtX2RpZ3RhYmxlLnJzc2lfaGlnaF9wb3dlcl9oaWdodGhyZXNoID0gZG1fdmFsdWU7CisJfQorCWVsc2UgaWYgKGRtX3R5cGUgPT0gRElHX1RZUEVfVEhSRVNIX0hJR0hQV1JfSElHSCkKKwl7CisJCWRtX2RpZ3RhYmxlLnJzc2lfaGlnaF9wb3dlcl9oaWdodGhyZXNoID0gZG1fdmFsdWU7CisJfQorCWVsc2UgaWYgKGRtX3R5cGUgPT0gRElHX1RZUEVfRU5BQkxFKQorCXsKKwkJZG1fZGlndGFibGUuZGlnX3N0YXRlCQk9IERNX1NUQV9ESUdfTUFYOworCQlkbV9kaWd0YWJsZS5kaWdfZW5hYmxlX2ZsYWcJPSB0cnVlOworCX0KKwllbHNlIGlmIChkbV90eXBlID09IERJR19UWVBFX0RJU0FCTEUpCisJeworCQlkbV9kaWd0YWJsZS5kaWdfc3RhdGUJCT0gRE1fU1RBX0RJR19NQVg7CisJCWRtX2RpZ3RhYmxlLmRpZ19lbmFibGVfZmxhZwk9IGZhbHNlOworCX0KKwllbHNlIGlmIChkbV90eXBlID09IERJR19UWVBFX0RCR19NT0RFKQorCXsKKwkJaWYoZG1fdmFsdWUgPj0gRE1fREJHX01BWCkKKwkJCWRtX3ZhbHVlID0gRE1fREJHX09GRjsKKwkJZG1fZGlndGFibGUuZGJnX21vZGUJCT0gKHU4KWRtX3ZhbHVlOworCX0KKwllbHNlIGlmIChkbV90eXBlID09IERJR19UWVBFX1JTU0kpCisJeworCQlpZihkbV92YWx1ZSA+IDEwMCkKKwkJCWRtX3ZhbHVlID0gMzA7CisJCWRtX2RpZ3RhYmxlLnJzc2lfdmFsCQkJPSAobG9uZylkbV92YWx1ZTsKKwl9CisJZWxzZSBpZiAoZG1fdHlwZSA9PSBESUdfVFlQRV9BTEdPUklUSE0pCisJeworCQlpZiAoZG1fdmFsdWUgPj0gRElHX0FMR09fTUFYKQorCQkJZG1fdmFsdWUgPSBESUdfQUxHT19CWV9GQUxTRV9BTEFSTTsKKwkJaWYoZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobSAhPSAodTgpZG1fdmFsdWUpCisJCQlkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtX3N3aXRjaCA9IDE7CisJCWRtX2RpZ3RhYmxlLmRpZ19hbGdvcml0aG0JPSAodTgpZG1fdmFsdWU7CisJfQorCWVsc2UgaWYgKGRtX3R5cGUgPT0gRElHX1RZUEVfQkFDS09GRikKKwl7CisJCWlmKGRtX3ZhbHVlID4gMzApCisJCQlkbV92YWx1ZSA9IDMwOworCQlkbV9kaWd0YWJsZS5iYWNrb2ZmX3ZhbAkJPSAodTgpZG1fdmFsdWU7CisJfQorCWVsc2UgaWYoZG1fdHlwZSA9PSBESUdfVFlQRV9SWF9HQUlOX01JTikKKwl7CisJCWlmKGRtX3ZhbHVlID09IDApCisJCQlkbV92YWx1ZSA9IDB4MTsKKwkJZG1fZGlndGFibGUucnhfZ2Fpbl9yYW5nZV9taW4gPSAodTgpZG1fdmFsdWU7CisJfQorCWVsc2UgaWYoZG1fdHlwZSA9PSBESUdfVFlQRV9SWF9HQUlOX01BWCkKKwl7CisJCWlmKGRtX3ZhbHVlID4gMHg1MCkKKwkJCWRtX3ZhbHVlID0gMHg1MDsKKwkJZG1fZGlndGFibGUucnhfZ2Fpbl9yYW5nZV9tYXggPSAodTgpZG1fdmFsdWU7CisJfQorfQkvKiBETV9DaGFuZ2VEeW5hbWljSW5pdEdhaW5UaHJlc2ggKi8KK2V4dGVybgl2b2lkCitkbV9jaGFuZ2VfZnN5bmNfc2V0dGluZygKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXMzMgkJRE1fVHlwZSwKKwlzMzIJCURNX1ZhbHVlKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmIChETV9UeXBlID09IDApCS8vIG1vbml0b3IgMHhjMzggcmVnaXN0ZXIKKwl7CisJCWlmKERNX1ZhbHVlID4gMSkKKwkJCURNX1ZhbHVlID0gMTsKKwkJcHJpdi0+ZnJhbWVzeW5jTW9uaXRvciA9ICh1OClETV9WYWx1ZTsKKwkJLy9EYmdQcmludCgicEhhbERhdGEtPmZyYW1lc3luY01vbml0b3IgPSAlZCIsIHBIYWxEYXRhLT5mcmFtZXN5bmNNb25pdG9yKTsKKwl9Cit9CisKK2V4dGVybiB2b2lkCitkbV9jaGFuZ2VfcnhwYXRoX3NlbGVjdGlvbl9zZXR0aW5nKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJczMyCQlETV9UeXBlLAorCXMzMgkJRE1fVmFsdWUpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXByYXRlX2FkYXB0aXZlIAlwUkEgPSAocHJhdGVfYWRhcHRpdmUpJihwcml2LT5yYXRlX2FkYXB0aXZlKTsKKworCisJaWYoRE1fVHlwZSA9PSAwKQorCXsKKwkJaWYoRE1fVmFsdWUgPiAxKQorCQkJRE1fVmFsdWUgPSAxOworCQlETV9SeFBhdGhTZWxUYWJsZS5FbmFibGUgPSAodTgpRE1fVmFsdWU7CisJfQorCWVsc2UgaWYoRE1fVHlwZSA9PSAxKQorCXsKKwkJaWYoRE1fVmFsdWUgPiAxKQorCQkJRE1fVmFsdWUgPSAxOworCQlETV9SeFBhdGhTZWxUYWJsZS5EYmdNb2RlID0gKHU4KURNX1ZhbHVlOworCX0KKwllbHNlIGlmKERNX1R5cGUgPT0gMikKKwl7CisJCWlmKERNX1ZhbHVlID4gNDApCisJCQlETV9WYWx1ZSA9IDQwOworCQlETV9SeFBhdGhTZWxUYWJsZS5TU19USF9sb3cgPSAodTgpRE1fVmFsdWU7CisJfQorCWVsc2UgaWYoRE1fVHlwZSA9PSAzKQorCXsKKwkJaWYoRE1fVmFsdWUgPiAyNSkKKwkJCURNX1ZhbHVlID0gMjU7CisJCURNX1J4UGF0aFNlbFRhYmxlLmRpZmZfVEggPSAodTgpRE1fVmFsdWU7CisJfQorCWVsc2UgaWYoRE1fVHlwZSA9PSA0KQorCXsKKwkJaWYoRE1fVmFsdWUgPj0gQ0NLX1J4X1ZlcnNpb25fTUFYKQorCQkJRE1fVmFsdWUgPSBDQ0tfUnhfVmVyc2lvbl8xOworCQlETV9SeFBhdGhTZWxUYWJsZS5jY2tfbWV0aG9kPSAodTgpRE1fVmFsdWU7CisJfQorCWVsc2UgaWYoRE1fVHlwZSA9PSAxMCkKKwl7CisJCWlmKERNX1ZhbHVlID4gMTAwKQorCQkJRE1fVmFsdWUgPSA1MDsKKwkJRE1fUnhQYXRoU2VsVGFibGUucmZfcnNzaVswXSA9ICh1OClETV9WYWx1ZTsKKwl9CisJZWxzZSBpZihETV9UeXBlID09IDExKQorCXsKKwkJaWYoRE1fVmFsdWUgPiAxMDApCisJCQlETV9WYWx1ZSA9IDUwOworCQlETV9SeFBhdGhTZWxUYWJsZS5yZl9yc3NpWzFdID0gKHU4KURNX1ZhbHVlOworCX0KKwllbHNlIGlmKERNX1R5cGUgPT0gMTIpCisJeworCQlpZihETV9WYWx1ZSA+IDEwMCkKKwkJCURNX1ZhbHVlID0gNTA7CisJCURNX1J4UGF0aFNlbFRhYmxlLnJmX3Jzc2lbMl0gPSAodTgpRE1fVmFsdWU7CisJfQorCWVsc2UgaWYoRE1fVHlwZSA9PSAxMykKKwl7CisJCWlmKERNX1ZhbHVlID4gMTAwKQorCQkJRE1fVmFsdWUgPSA1MDsKKwkJRE1fUnhQYXRoU2VsVGFibGUucmZfcnNzaVszXSA9ICh1OClETV9WYWx1ZTsKKwl9CisJZWxzZSBpZihETV9UeXBlID09IDIwKQorCXsKKwkJaWYoRE1fVmFsdWUgPiAxKQorCQkJRE1fVmFsdWUgPSAxOworCQlwUkEtPnBpbmdfcnNzaV9lbmFibGUgPSAodTgpRE1fVmFsdWU7CisJfQorCWVsc2UgaWYoRE1fVHlwZSA9PSAyMSkKKwl7CisJCWlmKERNX1ZhbHVlID4gMzApCisJCQlETV9WYWx1ZSA9IDMwOworCQlwUkEtPnBpbmdfcnNzaV90aHJlc2hfZm9yX3JhID0gRE1fVmFsdWU7CisJfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOglkbV9kaWdfaW5pdCgpCisgKgorICogT3ZlcnZpZXc6CVNldCBESUcgc2NoZW1lIGluaXQgdmFsdWUuCisgKgorICogSW5wdXQ6CQlOT05FCisgKgorICogT3V0cHV0OgkJTk9ORQorICoKKyAqIFJldHVybjoJCU5PTkUKKyAqCisgKiBSZXZpc2VkIEhpc3Rvcnk6CisgKglXaGVuCQlXaG8JCVJlbWFyaworICoJMDUvMTUvMjAwOAlhbXkJCUNyZWF0ZSBWZXJzaW9uIDAgcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBkbV9kaWdfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvKiAyMDA3LzEwLzA1IE1IIERpc2FibGUgRElHIHNjaGVtZSBub3cuIE5vdCB0ZXN0ZWQuICovCisJZG1fZGlndGFibGUuZGlnX2VuYWJsZV9mbGFnCT0gdHJ1ZTsKKwlkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtID0gRElHX0FMR09fQllfUlNTSTsKKwlkbV9kaWd0YWJsZS5kYmdfbW9kZSA9IERNX0RCR19PRkY7CS8vb2ZmPWJ5IHJlYWwgcnNzaSB2YWx1ZSwgb249YnkgRE1fRGlnVGFibGUuUnNzaV92YWwgZm9yIG5ldyBkaWcKKwlkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtX3N3aXRjaCA9IDA7CisKKwkvKiAyMDA3LzEwLzA0IE1IIERlZmluZSBpbml0IGdhaW4gdGhyZXNob2wuICovCisJZG1fZGlndGFibGUuZGlnX3N0YXRlCQk9IERNX1NUQV9ESUdfTUFYOworCWRtX2RpZ3RhYmxlLmRpZ19oaWdocHdyX3N0YXRlCT0gRE1fU1RBX0RJR19NQVg7CisJZG1fZGlndGFibGUuaW5pdGlhbGdhaW5fbG93ZXJib3VuZF9zdGF0ZSA9IGZhbHNlOworCisJZG1fZGlndGFibGUucnNzaV9sb3dfdGhyZXNoIAk9IERNX0RJR19USFJFU0hfTE9XOworCWRtX2RpZ3RhYmxlLnJzc2lfaGlnaF90aHJlc2ggCT0gRE1fRElHX1RIUkVTSF9ISUdIOworCisJZG1fZGlndGFibGUucnNzaV9oaWdoX3Bvd2VyX2xvd3RocmVzaCA9IERNX0RJR19ISUdIX1BXUl9USFJFU0hfTE9XOworCWRtX2RpZ3RhYmxlLnJzc2lfaGlnaF9wb3dlcl9oaWdodGhyZXNoID0gRE1fRElHX0hJR0hfUFdSX1RIUkVTSF9ISUdIOworCisJZG1fZGlndGFibGUucnNzaV92YWwgPSA1MDsJLy9mb3IgbmV3IGRpZyBkZWJ1ZyByc3NpIHZhbHVlCisJZG1fZGlndGFibGUuYmFja29mZl92YWwgPSBETV9ESUdfQkFDS09GRjsKKwlkbV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21heCA9IERNX0RJR19NQVg7CisJaWYocHJpdi0+Q3VzdG9tZXJJRCA9PSBSVF9DSURfODE5eF9OZXRjb3JlKQorCQlkbV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21pbiA9IERNX0RJR19NSU5fTmV0Y29yZTsKKwllbHNlCisJCWRtX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWluID0gRE1fRElHX01JTjsKKworfQkvKiBkbV9kaWdfaW5pdCAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOglkbV9jdHJsX2luaXRnYWluX2J5cnNzaSgpCisgKgorICogT3ZlcnZpZXc6CURyaXZlciBtdXN0IG1vbml0b3IgUlNTSSBhbmQgbm90aWZ5IGZpcm13YXJlIHRvIGNoYW5nZSBpbml0aWFsCisgKgkJCQlnYWluIGFjY29yZGluZyB0byBkaWZmZXJlbnQgdGhyZXNob2xkLiBCQiB0ZWFtIHByb3ZpZGUgdGhlCisgKgkJCQlzdWdnZXN0ZWQgc29sdXRpb24uCisgKgorICogSW5wdXQ6CQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldgorICoKKyAqIE91dHB1dDoJCU5PTkUKKyAqCisgKiBSZXR1cm46CQlOT05FCisgKgorICogUmV2aXNlZCBIaXN0b3J5OgorICoJV2hlbgkJV2hvCQlSZW1hcmsKKyAqCTA1LzI3LzIwMDgJYW15CQlDcmVhdGUgVmVyc2lvbiAwIHBvcnRpbmcgZnJvbSB3aW5kb3dzIGNvZGUuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBkbV9jdHJsX2luaXRnYWluX2J5cnNzaShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJaWYgKGRtX2RpZ3RhYmxlLmRpZ19lbmFibGVfZmxhZyA9PSBmYWxzZSkKKwkJcmV0dXJuOworCisJaWYoZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobSA9PSBESUdfQUxHT19CWV9GQUxTRV9BTEFSTSkKKwkJZG1fY3RybF9pbml0Z2Fpbl9ieXJzc2lfYnlfZndmYWxzZV9hbGFybShkZXYpOworCWVsc2UgaWYoZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobSA9PSBESUdfQUxHT19CWV9SU1NJKQorCQlkbV9jdHJsX2luaXRnYWluX2J5cnNzaV9ieV9kcml2ZXJyc3NpKGRldik7CisvLwkJOworCWVsc2UKKwkJcmV0dXJuOworfQorCisKK3N0YXRpYyB2b2lkIGRtX2N0cmxfaW5pdGdhaW5fYnlyc3NpX2J5X2RyaXZlcnJzc2koCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTggaTsKKwlzdGF0aWMgdTggCWZ3X2RpZz0wOworCisJaWYgKGRtX2RpZ3RhYmxlLmRpZ19lbmFibGVfZmxhZyA9PSBmYWxzZSkKKwkJcmV0dXJuOworCisJLy9EYmdQcmludCgiRGlnIGJ5IFN3IFJzc2kgXG4iKTsKKwlpZihkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtX3N3aXRjaCkJLy8gaWYgc3dpdGhlZCBhbGdvcml0aG0sIHdlIGhhdmUgdG8gZGlzYWJsZSBGVyBEaWcuCisJCWZ3X2RpZyA9IDA7CisJaWYoZndfZGlnIDw9IDMpCS8vIGV4ZWN1dGUgc2V2ZXJhbCB0aW1lcyB0byBtYWtlIHN1cmUgdGhlIEZXIERpZyBpcyBkaXNhYmxlZAorCXsvLyBGVyBESUcgT2ZmCisJCWZvcihpPTA7IGk8MzsgaSsrKQorCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIFVGV1AsIGJNYXNrQnl0ZTEsIDB4OCk7CS8vIE9ubHkgY2xlYXIgYnl0ZSAxIGFuZCByZXdyaXRlLgorCQlmd19kaWcrKzsKKwkJZG1fZGlndGFibGUuZGlnX3N0YXRlID0gRE1fU1RBX0RJR19PRkY7CS8vZncgZGlnIG9mZi4KKwl9CisKKwlpZihwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpCisJCWRtX2RpZ3RhYmxlLmN1cl9jb25uZWN0X3N0YXRlID0gRElHX0NPTk5FQ1Q7CisJZWxzZQorCQlkbV9kaWd0YWJsZS5jdXJfY29ubmVjdF9zdGF0ZSA9IERJR19ESVNDT05ORUNUOworCisJLy9EYmdQcmludCgiRE1fRGlnVGFibGUuUHJlQ29ubmVjdFN0YXRlID0gJWQsIERNX0RpZ1RhYmxlLkN1ckNvbm5lY3RTdGF0ZSA9ICVkIFxuIiwKKwkJLy9ETV9EaWdUYWJsZS5QcmVDb25uZWN0U3RhdGUsIERNX0RpZ1RhYmxlLkN1ckNvbm5lY3RTdGF0ZSk7CisKKwlpZihkbV9kaWd0YWJsZS5kYmdfbW9kZSA9PSBETV9EQkdfT0ZGKQorCQlkbV9kaWd0YWJsZS5yc3NpX3ZhbCA9IHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGI7CisJLy9EYmdQcmludCgiRE1fRGlnVGFibGUuUnNzaV92YWwgPSAlZCBcbiIsIERNX0RpZ1RhYmxlLlJzc2lfdmFsKTsKKwlkbV9pbml0aWFsX2dhaW4oZGV2KTsKKwlkbV9wZF90aChkZXYpOworCWRtX2NzX3JhdGlvKGRldik7CisJaWYoZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobV9zd2l0Y2gpCisJCWRtX2RpZ3RhYmxlLmRpZ19hbGdvcml0aG1fc3dpdGNoID0gMDsKKwlkbV9kaWd0YWJsZS5wcmVfY29ubmVjdF9zdGF0ZSA9IGRtX2RpZ3RhYmxlLmN1cl9jb25uZWN0X3N0YXRlOworCit9CS8qIGRtX0N0cmxJbml0R2FpbkJ5UnNzaSAqLworCitzdGF0aWMgdm9pZCBkbV9jdHJsX2luaXRnYWluX2J5cnNzaV9ieV9md2ZhbHNlX2FsYXJtKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0YXRpYyB1MzIgcmVzZXRfY250ID0gMDsKKwl1OCBpOworCisJaWYgKGRtX2RpZ3RhYmxlLmRpZ19lbmFibGVfZmxhZyA9PSBmYWxzZSkKKwkJcmV0dXJuOworCisJaWYoZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobV9zd2l0Y2gpCisJeworCQlkbV9kaWd0YWJsZS5kaWdfc3RhdGUgPSBETV9TVEFfRElHX01BWDsKKwkJLy8gRncgRElHIE9uLgorCQlmb3IoaT0wOyBpPDM7IGkrKykKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBVRldQLCBiTWFza0J5dGUxLCAweDEpOwkvLyBPbmx5IGNsZWFyIGJ5dGUgMSBhbmQgcmV3cml0ZS4KKwkJZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobV9zd2l0Y2ggPSAwOworCX0KKworCWlmIChwcml2LT5pZWVlODAyMTEtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRUQpCisJCXJldHVybjsKKworCS8vIEZvciBzbW9vdGgsIHdlIGNhbiBub3QgY2hhbmdlIERJRyBzdGF0ZS4KKwlpZiAoKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPiBkbV9kaWd0YWJsZS5yc3NpX2xvd190aHJlc2gpICYmCisJCShwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDwgZG1fZGlndGFibGUucnNzaV9oaWdoX3RocmVzaCkpCisJeworCQlyZXR1cm47CisJfQorCS8vRGJnUHJpbnQoIkRpZyBieSBGdyBGYWxzZSBBbGFybVxuIik7CisJLy9pZiAoRE1fRGlnVGFibGUuRGlnX1N0YXRlID09IERNX1NUQV9ESUdfT0ZGKQorCS8qRGJnUHJpbnQoIkRJRyBDaGVja1xuXHIgUlNTST0lZCBMT1c9JWQgSElHSD0lZCBTVEFURT0lZCIsCisJcEhhbERhdGEtPlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCLCBETV9EaWdUYWJsZS5Sc3NpTG93VGhyZXNoLAorCURNX0RpZ1RhYmxlLlJzc2lIaWdoVGhyZXNoLCBETV9EaWdUYWJsZS5EaWdfU3RhdGUpOyovCisJLyogMS4gV2hlbiBSU1NJIGRlY3JlYXNlLCBXZSBoYXZlIHRvIGp1ZGdlIGlmIGl0IGlzIHNtYWxsZXIgdGhhbiBhIHRyZXNob2xkCisJCSAgYW5kIHRoZW4gZXhlY3V0ZSBiZWxvdyBzdGVwLiAqLworCWlmICgocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8PSBkbV9kaWd0YWJsZS5yc3NpX2xvd190aHJlc2gpKQorCXsKKwkJLyogMjAwOC8wMi8wNSBNSCBXaGVuIHdlIGV4ZWN1dGUgc2lsZW50IHJlc2V0LCB0aGUgRElHIFBIWSBwYXJhbWV0ZXJzCisJCSAgIHdpbGwgYmUgcmVzZXQgdG8gaW5pdCB2YWx1ZS4gV2UgbXVzdCBwcmV2ZW50IHRoZSBjb25kaXRpb24uICovCisJCWlmIChkbV9kaWd0YWJsZS5kaWdfc3RhdGUgPT0gRE1fU1RBX0RJR19PRkYgJiYKKwkJCShwcml2LT5yZXNldF9jb3VudCA9PSByZXNldF9jbnQpKQorCQl7CisJCQlyZXR1cm47CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXNldF9jbnQgPSBwcml2LT5yZXNldF9jb3VudDsKKwkJfQorCisJCS8vIElmIERJRyBpcyBvZmYsIERJRyBoaWdoIHBvd2VyIHN0YXRlIG11c3QgcmVzZXQuCisJCWRtX2RpZ3RhYmxlLmRpZ19oaWdocHdyX3N0YXRlID0gRE1fU1RBX0RJR19NQVg7CisJCWRtX2RpZ3RhYmxlLmRpZ19zdGF0ZSA9IERNX1NUQV9ESUdfT0ZGOworCisJCS8vIDEuMSBESUcgT2ZmLgorCQlydGw4MTkyX3NldEJCcmVnKGRldiwgVUZXUCwgYk1hc2tCeXRlMSwgMHg4KTsJLy8gT25seSBjbGVhciBieXRlIDEgYW5kIHJld3JpdGUuCisKKwkJLy8gMS4yIFNldCBpbml0aWFsIGdhaW4uCisJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hBQUdDQ29yZTEsIDB4MTcpOworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQkFHQ0NvcmUxLCAweDE3KTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWENBR0NDb3JlMSwgMHgxNyk7CisJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hEQUdDQ29yZTEsIDB4MTcpOworCisJCS8vIDEuMyBMb3dlciBQRF9USCBmb3IgT0ZETS4KKwkJaWYgKHByaXYtPkN1cnJlbnRDaGFubmVsQlcgIT0gSFRfQ0hBTk5FTF9XSURUSF8yMCkKKwkJeworCQkJLyogMjAwOC8wMS8xMSBNSCA0ME1IWiA5MC85MiByZWdpc3RlciBhcmUgbm90IHRoZSBzYW1lLiAqLworCQkJLy8gMjAwOC8wMi8wNSBNSCBTRDMtSmVycnkgOTJVLzkyRSBQRF9USCBhcmUgdGhlIHNhbWUuCisJCQkjaWZkZWYgUlRMODE5MFAKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0MCk7CisJCQkjZWxzZQorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgKHJPRkRNMF9YQVR4QUZFKzMpLCAweDAwKTsKKwkJCSNlbmRpZgorCQkJLyplbHNlIGlmIChwcml2LT5jYXJkXzgxOTIgPT0gSEFSRFdBUkVfVFlQRV9SVEw4MTkwUCkKKwkJCQl3cml0ZV9uaWNfYnl0ZShwQWRhcHRlciwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQwKTsKKwkJCSovCisJCQkvL2Vsc2UgaWYgKHBBZGFwdGVyLT5IYXJkd2FyZVR5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4MTkyRSkKKworCisJCQkvL2Vsc2UKKwkJCQkvL1BsYXRmb3JtRUZJT1dyaXRlMUJ5dGUocEFkYXB0ZXIsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0MCk7CisJCX0KKwkJZWxzZQorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjEsIDB4NDIpOworCisJCS8vIDEuNCBMb3dlciBDUyByYXRpbyBmb3IgQ0NLLgorCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4YTBhLCAweDA4KTsKKworCQkvLyAxLjUgSGlnaGVyIEVEQ0NBLgorCQkvL1BsYXRmb3JtRUZJT1dyaXRlNEJ5dGUocEFkYXB0ZXIsIHJPRkRNMF9FQ0NBVGhyZXNob2xkLCAweDMyNSk7CisJCXJldHVybjsKKworCX0KKworCS8qIDIuIFdoZW4gUlNTSSBpbmNyZWFzZSwgV2UgaGF2ZSB0byBqdWRnZSBpZiBpdCBpcyBsYXJnZXIgdGhhbiBhIHRyZXNob2xkCisJCSAgYW5kIHRoZW4gZXhlY3V0ZSBiZWxvdyBzdGVwLiAgKi8KKwlpZiAoKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0gZG1fZGlndGFibGUucnNzaV9oaWdoX3RocmVzaCkgKQorCXsKKwkJdTggcmVzZXRfZmxhZyA9IDA7CisKKwkJaWYgKGRtX2RpZ3RhYmxlLmRpZ19zdGF0ZSA9PSBETV9TVEFfRElHX09OICYmCisJCQkocHJpdi0+cmVzZXRfY291bnQgPT0gcmVzZXRfY250KSkKKwkJeworCQkJZG1fY3RybF9pbml0Z2Fpbl9ieXJzc2lfaGlnaHB3cihkZXYpOworCQkJcmV0dXJuOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKHByaXYtPnJlc2V0X2NvdW50ICE9IHJlc2V0X2NudCkKKwkJCQlyZXNldF9mbGFnID0gMTsKKworCQkJcmVzZXRfY250ID0gcHJpdi0+cmVzZXRfY291bnQ7CisJCX0KKworCQlkbV9kaWd0YWJsZS5kaWdfc3RhdGUgPSBETV9TVEFfRElHX09OOworCQkvL0RiZ1ByaW50KCJESUcgT05cblxyIik7CisKKwkJLy8gMi4xIFNldCBpbml0aWFsIGdhaW4uCisJCS8vIDIwMDgvMDIvMjYgTUggU0QzLUplcnJ5IHN1Z2dlc3QgdG8gcHJldmVudCBkaXJ0eSBlbnZpcm9ubWVudC4KKwkJaWYgKHJlc2V0X2ZsYWcgPT0gMSkKKwkJeworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWEFBR0NDb3JlMSwgMHgyYyk7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQkFHQ0NvcmUxLCAweDJjKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hDQUdDQ29yZTEsIDB4MmMpOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWERBR0NDb3JlMSwgMHgyYyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQUFHQ0NvcmUxLCAweDIwKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hCQUdDQ29yZTEsIDB4MjApOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWENBR0NDb3JlMSwgMHgyMCk7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YREFHQ0NvcmUxLCAweDIwKTsKKwkJfQorCisJCS8vIDIuMiBIaWdoZXIgUERfVEggZm9yIE9GRE0uCisJCWlmIChwcml2LT5DdXJyZW50Q2hhbm5lbEJXICE9IEhUX0NIQU5ORUxfV0lEVEhfMjApCisJCXsKKwkJCS8qIDIwMDgvMDEvMTEgTUggNDBNSFogOTAvOTIgcmVnaXN0ZXIgYXJlIG5vdCB0aGUgc2FtZS4gKi8KKwkJCS8vIDIwMDgvMDIvMDUgTUggU0QzLUplcnJ5IDkyVS85MkUgUERfVEggYXJlIHRoZSBzYW1lLgorCQkJI2lmZGVmIFJUTDgxOTBQCisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjEsIDB4NDIpOworCQkJI2Vsc2UKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIChyT0ZETTBfWEFUeEFGRSszKSwgMHgyMCk7CisJCQkjZW5kaWYKKwkJCS8qCisJCQllbHNlIGlmIChwcml2LT5jYXJkXzgxOTIgPT0gSEFSRFdBUkVfVFlQRV9SVEw4MTkwUCkKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0Mik7CisJCQkqLworCQkJLy9lbHNlIGlmIChwQWRhcHRlci0+SGFyZHdhcmVUeXBlID09IEhBUkRXQVJFX1RZUEVfUlRMODE5MkUpCisKKwkJCS8vZWxzZQorCQkJCS8vUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwQWRhcHRlciwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQyKTsKKwkJfQorCQllbHNlCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0NCk7CisKKwkJLy8gMi4zIEhpZ2hlciBDUyByYXRpbyBmb3IgQ0NLLgorCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4YTBhLCAweGNkKTsKKworCQkvLyAyLjQgTG93ZXIgRURDQ0EuCisJCS8qIDIwMDgvMDEvMTEgTUggOTAvOTIgc2VyaWVzIGFyZSB0aGUgc2FtZS4gKi8KKwkJLy9QbGF0Zm9ybUVGSU9Xcml0ZTRCeXRlKHBBZGFwdGVyLCByT0ZETTBfRUNDQVRocmVzaG9sZCwgMHgzNDYpOworCisJCS8vIDIuNSBESUcgT24uCisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBVRldQLCBiTWFza0J5dGUxLCAweDEpOwkvLyBPbmx5IGNsZWFyIGJ5dGUgMSBhbmQgcmV3cml0ZS4KKworCX0KKworCWRtX2N0cmxfaW5pdGdhaW5fYnlyc3NpX2hpZ2hwd3IoZGV2KTsKKworfQkvKiBkbV9DdHJsSW5pdEdhaW5CeVJzc2kgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjoJZG1fY3RybF9pbml0Z2Fpbl9ieXJzc2lfaGlnaHB3cigpCisgKgorICogT3ZlcnZpZXc6CisgKgorICogSW5wdXQ6CQlOT05FCisgKgorICogT3V0cHV0OgkJTk9ORQorICoKKyAqIFJldHVybjoJCU5PTkUKKyAqCisgKiBSZXZpc2VkIEhpc3Rvcnk6CisgKglXaGVuCQlXaG8JCVJlbWFyaworICoJMDUvMjgvMjAwOAlhbXkJCUNyZWF0ZSBWZXJzaW9uIDAgcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBkbV9jdHJsX2luaXRnYWluX2J5cnNzaV9oaWdocHdyKAorCXN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdGF0aWMgdTMyIHJlc2V0X2NudF9oaWdocHdyID0gMDsKKworCS8vIEZvciBzbW9vdGgsIHdlIGNhbiBub3QgY2hhbmdlIGhpZ2ggcG93ZXIgRElHIHN0YXRlIGluIHRoZSByYW5nZS4KKwlpZiAoKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPiBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfcG93ZXJfbG93dGhyZXNoKSAmJgorCQkocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8IGRtX2RpZ3RhYmxlLnJzc2lfaGlnaF9wb3dlcl9oaWdodGhyZXNoKSkKKwl7CisJCXJldHVybjsKKwl9CisKKwkvKiAzLiBXaGVuIFJTU0kgPjc1JSBvciA8NzAlLCBpdCBpcyBhIGhpZ2ggcG93ZXIgaXNzdWUuIFdlIGhhdmUgdG8ganVkZ2UgaWYKKwkJICBpdCBpcyBsYXJnZXIgdGhhbiBhIHRyZXNob2xkIGFuZCB0aGVuIGV4ZWN1dGUgYmVsb3cgc3RlcC4gICovCisJLy8gMjAwOC8wMi8wNSBNSCBTRDMtSmVycnkgTW9kaWZ5IFBEX1RIIGZvciBoaWdoIHBvd2VyIGlzc3VlLgorCWlmIChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IGRtX2RpZ3RhYmxlLnJzc2lfaGlnaF9wb3dlcl9oaWdodGhyZXNoKQorCXsKKwkJaWYgKGRtX2RpZ3RhYmxlLmRpZ19oaWdocHdyX3N0YXRlID09IERNX1NUQV9ESUdfT04gJiYKKwkJCShwcml2LT5yZXNldF9jb3VudCA9PSByZXNldF9jbnRfaGlnaHB3cikpCisJCQlyZXR1cm47CisJCWVsc2UKKwkJCWRtX2RpZ3RhYmxlLmRpZ19oaWdocHdyX3N0YXRlID0gRE1fU1RBX0RJR19PTjsKKworCQkvLyAzLjEgSGlnaGVyIFBEX1RIIGZvciBPRkRNIGZvciBoaWdoIHBvd2VyIHN0YXRlLgorCQlpZiAocHJpdi0+Q3VycmVudENoYW5uZWxCVyAhPSBIVF9DSEFOTkVMX1dJRFRIXzIwKQorCQl7CisJCQkjaWZkZWYgUlRMODE5MFAKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0MSk7CisJCQkjZWxzZQorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgKHJPRkRNMF9YQVR4QUZFKzMpLCAweDEwKTsKKwkJCSNlbmRpZgorCisJCQkvKmVsc2UgaWYgKHByaXYtPmNhcmRfODE5MiA9PSBIQVJEV0FSRV9UWVBFX1JUTDgxOTBQKQorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQxKTsKKwkJCSovCisKKwkJfQorCQllbHNlCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0Myk7CisJfQorCWVsc2UKKwl7CisJCWlmIChkbV9kaWd0YWJsZS5kaWdfaGlnaHB3cl9zdGF0ZSA9PSBETV9TVEFfRElHX09GRiYmCisJCQkocHJpdi0+cmVzZXRfY291bnQgPT0gcmVzZXRfY250X2hpZ2hwd3IpKQorCQkJcmV0dXJuOworCQllbHNlCisJCQlkbV9kaWd0YWJsZS5kaWdfaGlnaHB3cl9zdGF0ZSA9IERNX1NUQV9ESUdfT0ZGOworCisJCWlmIChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDwgZG1fZGlndGFibGUucnNzaV9oaWdoX3Bvd2VyX2xvd3RocmVzaCAmJgorCQkJIHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0gZG1fZGlndGFibGUucnNzaV9oaWdoX3RocmVzaCkKKwkJeworCQkJLy8gMy4yIFJlY292ZXIgUERfVEggZm9yIE9GRE0gZm9yIG5vcm1hbCBwb3dlciByZWdpb24uCisJCQlpZiAocHJpdi0+Q3VycmVudENoYW5uZWxCVyAhPSBIVF9DSEFOTkVMX1dJRFRIXzIwKQorCQkJeworCQkJCSNpZmRlZiBSVEw4MTkwUAorCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0Mik7CisJCQkJI2Vsc2UKKwkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAock9GRE0wX1hBVHhBRkUrMyksIDB4MjApOworCQkJCSNlbmRpZgorCQkJCS8qZWxzZSBpZiAocHJpdi0+Y2FyZF84MTkyID09IEhBUkRXQVJFX1RZUEVfUlRMODE5MFApCisJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQyKTsKKwkJCQkqLworCisJCQl9CisJCQllbHNlCisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjEsIDB4NDQpOworCQl9CisJfQorCisJcmVzZXRfY250X2hpZ2hwd3IgPSBwcml2LT5yZXNldF9jb3VudDsKKworfQkvKiBkbV9DdHJsSW5pdEdhaW5CeVJzc2lIaWdoUHdyICovCisKKworc3RhdGljIHZvaWQgZG1faW5pdGlhbF9nYWluKAorCXN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OAkJCQkJaW5pdGlhbF9nYWluPTA7CisJc3RhdGljIHU4CQkJCWluaXRpYWxpemVkPTAsIGZvcmNlX3dyaXRlPTA7CisJc3RhdGljIHUzMgkJCXJlc2V0X2NudD0wOworCisJaWYoZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobV9zd2l0Y2gpCisJeworCQlpbml0aWFsaXplZCA9IDA7CisJCXJlc2V0X2NudCA9IDA7CisJfQorCisJaWYoZG1fZGlndGFibGUucHJlX2Nvbm5lY3Rfc3RhdGUgPT0gZG1fZGlndGFibGUuY3VyX2Nvbm5lY3Rfc3RhdGUpCisJeworCQlpZihkbV9kaWd0YWJsZS5jdXJfY29ubmVjdF9zdGF0ZSA9PSBESUdfQ09OTkVDVCkKKwkJeworCQkJaWYoKGRtX2RpZ3RhYmxlLnJzc2lfdmFsKzEwLWRtX2RpZ3RhYmxlLmJhY2tvZmZfdmFsKSA+IGRtX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWF4KQorCQkJCWRtX2RpZ3RhYmxlLmN1cl9pZ192YWx1ZSA9IGRtX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWF4OworCQkJZWxzZSBpZigoZG1fZGlndGFibGUucnNzaV92YWwrMTAtZG1fZGlndGFibGUuYmFja29mZl92YWwpIDwgZG1fZGlndGFibGUucnhfZ2Fpbl9yYW5nZV9taW4pCisJCQkJZG1fZGlndGFibGUuY3VyX2lnX3ZhbHVlID0gZG1fZGlndGFibGUucnhfZ2Fpbl9yYW5nZV9taW47CisJCQllbHNlCisJCQkJZG1fZGlndGFibGUuY3VyX2lnX3ZhbHVlID0gZG1fZGlndGFibGUucnNzaV92YWwrMTAtZG1fZGlndGFibGUuYmFja29mZl92YWw7CisJCX0KKwkJZWxzZQkJLy9jdXJyZW50IHN0YXRlIGlzIGRpc2Nvbm5lY3RlZAorCQl7CisJCQlpZihkbV9kaWd0YWJsZS5jdXJfaWdfdmFsdWUgPT0gMCkKKwkJCQlkbV9kaWd0YWJsZS5jdXJfaWdfdmFsdWUgPSBwcml2LT5EZWZhdWx0SW5pdGlhbEdhaW5bMF07CisJCQllbHNlCisJCQkJZG1fZGlndGFibGUuY3VyX2lnX3ZhbHVlID0gZG1fZGlndGFibGUucHJlX2lnX3ZhbHVlOworCQl9CisJfQorCWVsc2UJLy8gZGlzY29ubmVjdGVkIC0+IGNvbm5lY3RlZCBvciBjb25uZWN0ZWQgLT4gZGlzY29ubmVjdGVkCisJeworCQlkbV9kaWd0YWJsZS5jdXJfaWdfdmFsdWUgPSBwcml2LT5EZWZhdWx0SW5pdGlhbEdhaW5bMF07CisJCWRtX2RpZ3RhYmxlLnByZV9pZ192YWx1ZSA9IDA7CisJfQorCS8vRGJnUHJpbnQoIkRNX0RpZ1RhYmxlLkN1cklHVmFsdWUgPSAweCV4LCBETV9EaWdUYWJsZS5QcmVJR1ZhbHVlID0gMHgleFxuIiwgRE1fRGlnVGFibGUuQ3VySUdWYWx1ZSwgRE1fRGlnVGFibGUuUHJlSUdWYWx1ZSk7CisKKwkvLyBpZiBzaWxlbnQgcmVzZXQgaGFwcGVuZWQsIHdlIHNob3VsZCByZXdyaXRlIHRoZSB2YWx1ZXMgYmFjaworCWlmKHByaXYtPnJlc2V0X2NvdW50ICE9IHJlc2V0X2NudCkKKwl7CisJCWZvcmNlX3dyaXRlID0gMTsKKwkJcmVzZXRfY250ID0gcHJpdi0+cmVzZXRfY291bnQ7CisJfQorCisJaWYoZG1fZGlndGFibGUucHJlX2lnX3ZhbHVlICE9IHJlYWRfbmljX2J5dGUoZGV2LCByT0ZETTBfWEFBR0NDb3JlMSkpCisJCWZvcmNlX3dyaXRlID0gMTsKKworCXsKKwkJaWYoKGRtX2RpZ3RhYmxlLnByZV9pZ192YWx1ZSAhPSBkbV9kaWd0YWJsZS5jdXJfaWdfdmFsdWUpCisJCQl8fCAhaW5pdGlhbGl6ZWQgfHwgZm9yY2Vfd3JpdGUpCisJCXsKKwkJCWluaXRpYWxfZ2FpbiA9ICh1OClkbV9kaWd0YWJsZS5jdXJfaWdfdmFsdWU7CisJCQkvL0RiZ1ByaW50KCJXcml0ZSBpbml0aWFsIGdhaW4gPSAweCV4XG4iLCBpbml0aWFsX2dhaW4pOworCQkJLy8gU2V0IGluaXRpYWwgZ2Fpbi4KKwkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hBQUdDQ29yZTEsIGluaXRpYWxfZ2Fpbik7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQkFHQ0NvcmUxLCBpbml0aWFsX2dhaW4pOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWENBR0NDb3JlMSwgaW5pdGlhbF9nYWluKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hEQUdDQ29yZTEsIGluaXRpYWxfZ2Fpbik7CisJCQlkbV9kaWd0YWJsZS5wcmVfaWdfdmFsdWUgPSBkbV9kaWd0YWJsZS5jdXJfaWdfdmFsdWU7CisJCQlpbml0aWFsaXplZCA9IDE7CisJCQlmb3JjZV93cml0ZSA9IDA7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRtX3BkX3RoKAorCXN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdGF0aWMgdTgJCQkJaW5pdGlhbGl6ZWQ9MCwgZm9yY2Vfd3JpdGU9MDsKKwlzdGF0aWMgdTMyCQkJcmVzZXRfY250ID0gMDsKKworCWlmKGRtX2RpZ3RhYmxlLmRpZ19hbGdvcml0aG1fc3dpdGNoKQorCXsKKwkJaW5pdGlhbGl6ZWQgPSAwOworCQlyZXNldF9jbnQgPSAwOworCX0KKworCWlmKGRtX2RpZ3RhYmxlLnByZV9jb25uZWN0X3N0YXRlID09IGRtX2RpZ3RhYmxlLmN1cl9jb25uZWN0X3N0YXRlKQorCXsKKwkJaWYoZG1fZGlndGFibGUuY3VyX2Nvbm5lY3Rfc3RhdGUgPT0gRElHX0NPTk5FQ1QpCisJCXsKKwkJCWlmIChkbV9kaWd0YWJsZS5yc3NpX3ZhbCA+PSBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfcG93ZXJfaGlnaHRocmVzaCkKKwkJCQlkbV9kaWd0YWJsZS5jdXJwZF90aHN0YXRlID0gRElHX1BEX0FUX0hJR0hfUE9XRVI7CisJCQllbHNlIGlmICgoZG1fZGlndGFibGUucnNzaV92YWwgPD0gZG1fZGlndGFibGUucnNzaV9sb3dfdGhyZXNoKSkKKwkJCQlkbV9kaWd0YWJsZS5jdXJwZF90aHN0YXRlID0gRElHX1BEX0FUX0xPV19QT1dFUjsKKwkJCWVsc2UgaWYgKChkbV9kaWd0YWJsZS5yc3NpX3ZhbCA+PSBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfdGhyZXNoKSAmJgorCQkJCQkoZG1fZGlndGFibGUucnNzaV92YWwgPCBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfcG93ZXJfbG93dGhyZXNoKSkKKwkJCQlkbV9kaWd0YWJsZS5jdXJwZF90aHN0YXRlID0gRElHX1BEX0FUX05PUk1BTF9QT1dFUjsKKwkJCWVsc2UKKwkJCQlkbV9kaWd0YWJsZS5jdXJwZF90aHN0YXRlID0gZG1fZGlndGFibGUucHJlcGRfdGhzdGF0ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWRtX2RpZ3RhYmxlLmN1cnBkX3Roc3RhdGUgPSBESUdfUERfQVRfTE9XX1BPV0VSOworCQl9CisJfQorCWVsc2UJLy8gZGlzY29ubmVjdGVkIC0+IGNvbm5lY3RlZCBvciBjb25uZWN0ZWQgLT4gZGlzY29ubmVjdGVkCisJeworCQlkbV9kaWd0YWJsZS5jdXJwZF90aHN0YXRlID0gRElHX1BEX0FUX0xPV19QT1dFUjsKKwl9CisKKwkvLyBpZiBzaWxlbnQgcmVzZXQgaGFwcGVuZWQsIHdlIHNob3VsZCByZXdyaXRlIHRoZSB2YWx1ZXMgYmFjaworCWlmKHByaXYtPnJlc2V0X2NvdW50ICE9IHJlc2V0X2NudCkKKwl7CisJCWZvcmNlX3dyaXRlID0gMTsKKwkJcmVzZXRfY250ID0gcHJpdi0+cmVzZXRfY291bnQ7CisJfQorCisJeworCQlpZigoZG1fZGlndGFibGUucHJlcGRfdGhzdGF0ZSAhPSBkbV9kaWd0YWJsZS5jdXJwZF90aHN0YXRlKSB8fAorCQkJKGluaXRpYWxpemVkPD0zKSB8fCBmb3JjZV93cml0ZSkKKwkJeworCQkJLy9EYmdQcmludCgiV3JpdGUgUERfVEggc3RhdGUgPSAlZFxuIiwgRE1fRGlnVGFibGUuQ3VyUERfVEhTdGF0ZSk7CisJCQlpZihkbV9kaWd0YWJsZS5jdXJwZF90aHN0YXRlID09IERJR19QRF9BVF9MT1dfUE9XRVIpCisJCQl7CisJCQkJLy8gTG93ZXIgUERfVEggZm9yIE9GRE0uCisJCQkJaWYgKHByaXYtPkN1cnJlbnRDaGFubmVsQlcgIT0gSFRfQ0hBTk5FTF9XSURUSF8yMCkKKwkJCQl7CisJCQkJCS8qIDIwMDgvMDEvMTEgTUggNDBNSFogOTAvOTIgcmVnaXN0ZXIgYXJlIG5vdCB0aGUgc2FtZS4gKi8KKwkJCQkJLy8gMjAwOC8wMi8wNSBNSCBTRDMtSmVycnkgOTJVLzkyRSBQRF9USCBhcmUgdGhlIHNhbWUuCisJCQkJCSNpZmRlZiBSVEw4MTkwUAorCQkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjEsIDB4NDApOworCQkJCQkjZWxzZQorCQkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAock9GRE0wX1hBVHhBRkUrMyksIDB4MDApOworCQkJCQkjZW5kaWYKKwkJCQkJLyplbHNlIGlmIChwcml2LT5jYXJkXzgxOTIgPT0gSEFSRFdBUkVfVFlQRV9SVEw4MTkwUCkKKwkJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQwKTsKKwkJCQkJKi8KKwkJCQl9CisJCQkJZWxzZQorCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0Mik7CisJCQl9CisJCQllbHNlIGlmKGRtX2RpZ3RhYmxlLmN1cnBkX3Roc3RhdGUgPT0gRElHX1BEX0FUX05PUk1BTF9QT1dFUikKKwkJCXsKKwkJCQkvLyBIaWdoZXIgUERfVEggZm9yIE9GRE0uCisJCQkJaWYgKHByaXYtPkN1cnJlbnRDaGFubmVsQlcgIT0gSFRfQ0hBTk5FTF9XSURUSF8yMCkKKwkJCQl7CisJCQkJCS8qIDIwMDgvMDEvMTEgTUggNDBNSFogOTAvOTIgcmVnaXN0ZXIgYXJlIG5vdCB0aGUgc2FtZS4gKi8KKwkJCQkJLy8gMjAwOC8wMi8wNSBNSCBTRDMtSmVycnkgOTJVLzkyRSBQRF9USCBhcmUgdGhlIHNhbWUuCisJCQkJCSNpZmRlZiBSVEw4MTkwUAorCQkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjEsIDB4NDIpOworCQkJCQkjZWxzZQorCQkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAock9GRE0wX1hBVHhBRkUrMyksIDB4MjApOworCQkJCQkjZW5kaWYKKwkJCQkJLyplbHNlIGlmIChwcml2LT5jYXJkXzgxOTIgPT0gSEFSRFdBUkVfVFlQRV9SVEw4MTkwUCkKKwkJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQyKTsKKwkJCQkJKi8KKwkJCQl9CisJCQkJZWxzZQorCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0NCk7CisJCQl9CisJCQllbHNlIGlmKGRtX2RpZ3RhYmxlLmN1cnBkX3Roc3RhdGUgPT0gRElHX1BEX0FUX0hJR0hfUE9XRVIpCisJCQl7CisJCQkJLy8gSGlnaGVyIFBEX1RIIGZvciBPRkRNIGZvciBoaWdoIHBvd2VyIHN0YXRlLgorCQkJCWlmIChwcml2LT5DdXJyZW50Q2hhbm5lbEJXICE9IEhUX0NIQU5ORUxfV0lEVEhfMjApCisJCQkJeworCQkJCQkjaWZkZWYgUlRMODE5MFAKKwkJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQxKTsKKwkJCQkJI2Vsc2UKKwkJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgKHJPRkRNMF9YQVR4QUZFKzMpLCAweDEwKTsKKwkJCQkJI2VuZGlmCisJCQkJCS8qZWxzZSBpZiAocHJpdi0+Y2FyZF84MTkyID09IEhBUkRXQVJFX1RZUEVfUlRMODE5MFApCisJCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0MSk7CisJCQkJCSovCisJCQkJfQorCQkJCWVsc2UKKwkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjEsIDB4NDMpOworCQkJfQorCQkJZG1fZGlndGFibGUucHJlcGRfdGhzdGF0ZSA9IGRtX2RpZ3RhYmxlLmN1cnBkX3Roc3RhdGU7CisJCQlpZihpbml0aWFsaXplZCA8PSAzKQorCQkJCWluaXRpYWxpemVkKys7CisJCQlmb3JjZV93cml0ZSA9IDA7CisJCX0KKwl9Cit9CisKK3N0YXRpYwl2b2lkIGRtX2NzX3JhdGlvKAorCXN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdGF0aWMgdTgJCQkJaW5pdGlhbGl6ZWQ9MCxmb3JjZV93cml0ZT0wOworCXN0YXRpYyB1MzIJCQlyZXNldF9jbnQgPSAwOworCisJaWYoZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobV9zd2l0Y2gpCisJeworCQlpbml0aWFsaXplZCA9IDA7CisJCXJlc2V0X2NudCA9IDA7CisJfQorCisJaWYoZG1fZGlndGFibGUucHJlX2Nvbm5lY3Rfc3RhdGUgPT0gZG1fZGlndGFibGUuY3VyX2Nvbm5lY3Rfc3RhdGUpCisJeworCQlpZihkbV9kaWd0YWJsZS5jdXJfY29ubmVjdF9zdGF0ZSA9PSBESUdfQ09OTkVDVCkKKwkJeworCQkJaWYgKChkbV9kaWd0YWJsZS5yc3NpX3ZhbCA8PSBkbV9kaWd0YWJsZS5yc3NpX2xvd190aHJlc2gpKQorCQkJCWRtX2RpZ3RhYmxlLmN1cmNzX3JhdGlvX3N0YXRlID0gRElHX0NTX1JBVElPX0xPV0VSOworCQkJZWxzZSBpZiAoKGRtX2RpZ3RhYmxlLnJzc2lfdmFsID49IGRtX2RpZ3RhYmxlLnJzc2lfaGlnaF90aHJlc2gpICkKKwkJCQlkbV9kaWd0YWJsZS5jdXJjc19yYXRpb19zdGF0ZSA9IERJR19DU19SQVRJT19ISUdIRVI7CisJCQllbHNlCisJCQkJZG1fZGlndGFibGUuY3VyY3NfcmF0aW9fc3RhdGUgPSBkbV9kaWd0YWJsZS5wcmVjc19yYXRpb19zdGF0ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWRtX2RpZ3RhYmxlLmN1cmNzX3JhdGlvX3N0YXRlID0gRElHX0NTX1JBVElPX0xPV0VSOworCQl9CisJfQorCWVsc2UJLy8gZGlzY29ubmVjdGVkIC0+IGNvbm5lY3RlZCBvciBjb25uZWN0ZWQgLT4gZGlzY29ubmVjdGVkCisJeworCQlkbV9kaWd0YWJsZS5jdXJjc19yYXRpb19zdGF0ZSA9IERJR19DU19SQVRJT19MT1dFUjsKKwl9CisKKwkvLyBpZiBzaWxlbnQgcmVzZXQgaGFwcGVuZWQsIHdlIHNob3VsZCByZXdyaXRlIHRoZSB2YWx1ZXMgYmFjaworCWlmKHByaXYtPnJlc2V0X2NvdW50ICE9IHJlc2V0X2NudCkKKwl7CisJCWZvcmNlX3dyaXRlID0gMTsKKwkJcmVzZXRfY250ID0gcHJpdi0+cmVzZXRfY291bnQ7CisJfQorCisKKwl7CisJCWlmKChkbV9kaWd0YWJsZS5wcmVjc19yYXRpb19zdGF0ZSAhPSBkbV9kaWd0YWJsZS5jdXJjc19yYXRpb19zdGF0ZSkgfHwKKwkJCSFpbml0aWFsaXplZCB8fCBmb3JjZV93cml0ZSkKKwkJeworCQkJLy9EYmdQcmludCgiV3JpdGUgQ1NfcmF0aW8gc3RhdGUgPSAlZFxuIiwgRE1fRGlnVGFibGUuQ3VyQ1NfcmF0aW9TdGF0ZSk7CisJCQlpZihkbV9kaWd0YWJsZS5jdXJjc19yYXRpb19zdGF0ZSA9PSBESUdfQ1NfUkFUSU9fTE9XRVIpCisJCQl7CisJCQkJLy8gTG93ZXIgQ1MgcmF0aW8gZm9yIENDSy4KKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4YTBhLCAweDA4KTsKKwkJCX0KKwkJCWVsc2UgaWYoZG1fZGlndGFibGUuY3VyY3NfcmF0aW9fc3RhdGUgPT0gRElHX0NTX1JBVElPX0hJR0hFUikKKwkJCXsKKwkJCQkvLyBIaWdoZXIgQ1MgcmF0aW8gZm9yIENDSy4KKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4YTBhLCAweGNkKTsKKwkJCX0KKwkJCWRtX2RpZ3RhYmxlLnByZWNzX3JhdGlvX3N0YXRlID0gZG1fZGlndGFibGUuY3VyY3NfcmF0aW9fc3RhdGU7CisJCQlpbml0aWFsaXplZCA9IDE7CisJCQlmb3JjZV93cml0ZSA9IDA7CisJCX0KKwl9Cit9CisKK2V4dGVybiB2b2lkIGRtX2luaXRfZWRjYV90dXJibyhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlwcml2LT5iY3VycmVudF90dXJib19FRENBID0gZmFsc2U7CisJcHJpdi0+aWVlZTgwMjExLT5iaXNfYW55X25vbmJlcGt0cyA9IGZhbHNlOworCXByaXYtPmJpc19jdXJfcmRsc3RhdGUgPSBmYWxzZTsKK30JLy8gZG1faW5pdF9lZGNhX3R1cmJvCisKK3N0YXRpYyB2b2lkIGRtX2NoZWNrX2VkY2FfdHVyYm8oCisJc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IHByaXYtPmllZWU4MDIxMS0+cEhUSW5mbzsKKwkvL1BTVEFfUU9TCQkJcFN0YVFvcyA9IHBNZ250SW5mby0+cFN0YVFvczsKKworCS8vIEtlZXAgcGFzdCBUeC9SeCBwYWNrZXQgY291bnQgZm9yIFJULXRvLVJUIEVEQ0EgdHVyYm8uCisJc3RhdGljIHVuc2lnbmVkIGxvbmcJCQlsYXN0VHhPa0NudCA9IDA7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcJCQlsYXN0UnhPa0NudCA9IDA7CisJdW5zaWduZWQgbG9uZwkJCQljdXJUeE9rQ250ID0gMDsKKwl1bnNpZ25lZCBsb25nCQkJCWN1clJ4T2tDbnQgPSAwOworCisJLy8KKwkvLyBEbyBub3QgYmUgVHVyYm8gaWYgaXQncyB1bmRlciBXaUZpIGNvbmZpZyBhbmQgUW9zIEVuYWJsZWQsIGJlY2F1c2UgdGhlIEVEQ0EgcGFyYW1ldGVycworCS8vIHNob3VsZCBmb2xsb3cgdGhlIHNldHRpbmdzIGZyb20gUUFQLiBCeSBCcnVjZSwgMjAwNy0xMi0wNy4KKwkvLworCWlmKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCkKKwkJZ290byBkbV9DaGVja0VkY2FUdXJib19FWElUOworCS8vIFdlIGRvIG5vdCB0dXJuIG9uIEVEQ0EgdHVyYm8gbW9kZSBmb3Igc29tZSBBUCB0aGF0IGhhcyBJT1QgaXNzdWUKKwlpZihwcml2LT5pZWVlODAyMTEtPnBIVEluZm8tPklPVEFjdGlvbiAmIEhUX0lPVF9BQ1RfRElTQUJMRV9FRENBX1RVUkJPKQorCQlnb3RvIGRtX0NoZWNrRWRjYVR1cmJvX0VYSVQ7CisKKy8vCXByaW50aygiPT09PT09PT0+JXMoKTpiaXNfYW55X25vbmJlcGt0cyBpcyAlZFxuIixfX0ZVTkNUSU9OX18scHJpdi0+YmlzX2FueV9ub25iZXBrdHMpOworCS8vIENoZWNrIHRoZSBzdGF0dXMgZm9yIGN1cnJlbnQgY29uZGl0aW9uLgorCWlmKCFwcml2LT5pZWVlODAyMTEtPmJpc19hbnlfbm9uYmVwa3RzKQorCXsKKwkJY3VyVHhPa0NudCA9IHByaXYtPnN0YXRzLnR4Ynl0ZXN1bmljYXN0IC0gbGFzdFR4T2tDbnQ7CisJCWN1clJ4T2tDbnQgPSBwcml2LT5zdGF0cy5yeGJ5dGVzdW5pY2FzdCAtIGxhc3RSeE9rQ250OworCQkvLyBGb3IgUlQtQVAsIHdlIG5lZWRzIHRvIHR1cm4gaXQgb24gd2hlbiBSeD5UeAorCQlpZihjdXJSeE9rQ250ID4gNCpjdXJUeE9rQ250KQorCQl7CisJCQkvL3ByaW50aygiJXMoKTpjdXJSeE9rQ250ID4gNCpjdXJUeE9rQ250XG4iKTsKKwkJCWlmKCFwcml2LT5iaXNfY3VyX3JkbHN0YXRlIHx8ICFwcml2LT5iY3VycmVudF90dXJib19FRENBKQorCQkJeworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEVEQ0FQQVJBX0JFLCBlZGNhX3NldHRpbmdfRExbcEhUSW5mby0+SU9UUGVlcl0pOworCQkJCXByaXYtPmJpc19jdXJfcmRsc3RhdGUgPSB0cnVlOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCisJCQkvL3ByaW50aygiJXMoKTpjdXJSeE9rQ250IDwgNCpjdXJUeE9rQ250XG4iKTsKKwkJCWlmKHByaXYtPmJpc19jdXJfcmRsc3RhdGUgfHwgIXByaXYtPmJjdXJyZW50X3R1cmJvX0VEQ0EpCisJCQl7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgRURDQVBBUkFfQkUsIGVkY2Ffc2V0dGluZ19VTFtwSFRJbmZvLT5JT1RQZWVyXSk7CisJCQkJcHJpdi0+YmlzX2N1cl9yZGxzdGF0ZSA9IGZhbHNlOworCQkJfQorCisJCX0KKworCQlwcml2LT5iY3VycmVudF90dXJib19FRENBID0gdHJ1ZTsKKwl9CisJZWxzZQorCXsKKwkJLy8KKwkJLy8gVHVybiBPZmYgRURDQSB0dXJibyBoZXJlLgorCQkvLyBSZXN0b3JlIG9yaWdpbmFsIEVEQ0EgYWNjb3JkaW5nIHRvIHRoZSBkZWNsYXJhdGlvbiBvZiBBUC4KKwkJLy8KKwkJIGlmKHByaXYtPmJjdXJyZW50X3R1cmJvX0VEQ0EpCisJCXsKKworCQkJeworCQkJCXU4CQl1MWJBSUZTOworCQkJCXUzMgkJdTRiQWNQYXJhbTsKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJzICpxb3NfcGFyYW1ldGVycyA9ICZwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5wYXJhbWV0ZXJzOworCQkJCXU4IG1vZGUgPSBwcml2LT5pZWVlODAyMTEtPm1vZGU7CisKKwkJCS8vIEZvciBFYWNoIHRpbWUgdXBkYXRpbmcgRURDQSBwYXJhbWV0ZXIsIHJlc2V0IEVEQ0EgdHVyYm8gbW9kZSBzdGF0dXMuCisJCQkJZG1faW5pdF9lZGNhX3R1cmJvKGRldik7CisJCQkJdTFiQUlGUyA9IHFvc19wYXJhbWV0ZXJzLT5haWZzWzBdICogKChtb2RlJihJRUVFX0d8SUVFRV9OXzI0RykpID85OjIwKSArIGFTaWZzVGltZTsKKwkJCQl1NGJBY1BhcmFtID0gKCgoKHUzMikocW9zX3BhcmFtZXRlcnMtPnR4X29wX2xpbWl0WzBdKSk8PCBBQ19QQVJBTV9UWE9QX0xJTUlUX09GRlNFVCl8CisJCQkJCSgoKHUzMikocW9zX3BhcmFtZXRlcnMtPmN3X21heFswXSkpPDwgQUNfUEFSQU1fRUNXX01BWF9PRkZTRVQpfAorCQkJCQkoKCh1MzIpKHFvc19wYXJhbWV0ZXJzLT5jd19taW5bMF0pKTw8IEFDX1BBUkFNX0VDV19NSU5fT0ZGU0VUKXwKKwkJCQkJKCh1MzIpdTFiQUlGUyA8PCBBQ19QQVJBTV9BSUZTX09GRlNFVCkpOworCQkJLy93cml0ZV9uaWNfZHdvcmQoZGV2LCBXRENBUEFSQV9BRERbaV0sIHU0YkFjUGFyYW0pOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEVEQ0FQQVJBX0JFLCAgdTRiQWNQYXJhbSk7CisKKwkJCS8vIENoZWNrIEFDTSBiaXQuCisJCQkvLyBJZiBpdCBpcyBzZXQsIGltbWVkaWF0ZWx5IHNldCBBQ00gY29udHJvbCBiaXQgdG8gZG93bmdyYWRpbmcgQUMgZm9yIHBhc3NpbmcgV01NIHRlc3RwbGFuLiBBbm5pZSwgMjAwNS0xMi0xMy4KKwkJCQl7CisJCQkvLyBUT0RPOiAgTW9kaWZpZWQgdGhpcyBwYXJ0IGFuZCB0cnkgdG8gc2V0IGFjbSBjb250cm9sIGluIG9ubHkgMSBJTyBwcm9jZXNzaW5nISEKKworCQkJCQlQQUNJX0FJRlNOCXBBY2lBaWZzbiA9IChQQUNJX0FJRlNOKSYocW9zX3BhcmFtZXRlcnMtPmFpZnNbMF0pOworCQkJCQl1OAkJQWNtQ3RybCA9IHJlYWRfbmljX2J5dGUoIGRldiwgQWNtSHdDdHJsICk7CisJCQkJCWlmKCBwQWNpQWlmc24tPmYuQUNNICkKKwkJCQkJeyAvLyBBQ00gYml0IGlzIDEuCisJCQkJCQlBY21DdHJsIHw9IEFjbUh3X0JlcUVuOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeyAvLyBBQ00gYml0IGlzIDAuCisJCQkJCQlBY21DdHJsICY9ICh+QWNtSHdfQmVxRW4pOworCQkJCQl9CisKKwkJCQkJUlRfVFJBQ0UoIENPTVBfUU9TLCJTZXRId1JlZzgxOTBwY2koKTogW0hXX1ZBUl9BQ01fQ1RSTF0gV3JpdGUgMHglWFxuIiwgQWNtQ3RybCApIDsKKwkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBBY21Id0N0cmwsIEFjbUN0cmwgKTsKKwkJCQl9CisJCQl9CisJCQlwcml2LT5iY3VycmVudF90dXJib19FRENBID0gZmFsc2U7CisJCX0KKwl9CisKKworZG1fQ2hlY2tFZGNhVHVyYm9fRVhJVDoKKwkvLyBTZXQgdmFyaWFibGVzIGZvciBuZXh0IHRpbWUuCisJcHJpdi0+aWVlZTgwMjExLT5iaXNfYW55X25vbmJlcGt0cyA9IGZhbHNlOworCWxhc3RUeE9rQ250ID0gcHJpdi0+c3RhdHMudHhieXRlc3VuaWNhc3Q7CisJbGFzdFJ4T2tDbnQgPSBwcml2LT5zdGF0cy5yeGJ5dGVzdW5pY2FzdDsKK30JLy8gZG1fQ2hlY2tFZGNhVHVyYm8KKworZXh0ZXJuIHZvaWQgRE1fQ1RTVG9TZWxmU2V0dGluZyhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldix1MzIgRE1fVHlwZSwgdTMyIERNX1ZhbHVlKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2KTsKKworCWlmIChETV9UeXBlID09IDApCS8vIENUUyB0byBzZWxmIGRpc2FibGUvZW5hYmxlCisJeworCQlpZihETV9WYWx1ZSA+IDEpCisJCQlETV9WYWx1ZSA9IDE7CisJCXByaXYtPmllZWU4MDIxMS0+YkNUU1RvU2VsZkVuYWJsZSA9IChib29sKURNX1ZhbHVlOworCQkvL0RiZ1ByaW50KCJwTWdudEluZm8tPmJDVFNUb1NlbGZFbmFibGUgPSAlZFxuIiwgcE1nbnRJbmZvLT5iQ1RTVG9TZWxmRW5hYmxlKTsKKwl9CisJZWxzZSBpZihETV9UeXBlID09IDEpIC8vQ1RTIHRvIHNlbGYgVGgKKwl7CisJCWlmKERNX1ZhbHVlID49IDUwKQorCQkJRE1fVmFsdWUgPSA1MDsKKwkJcHJpdi0+aWVlZTgwMjExLT5DVFNUb1NlbGZUSCA9ICh1OClETV9WYWx1ZTsKKwkJLy9EYmdQcmludCgicE1nbnRJbmZvLT5DVFNUb1NlbGZUSCA9ICVkXG4iLCBwTWdudEluZm8tPkNUU1RvU2VsZlRIKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRtX2luaXRfY3RzdG9zZWxmKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2KTsKKworCXByaXYtPmllZWU4MDIxMS0+YkNUU1RvU2VsZkVuYWJsZSA9IFRSVUU7CisJcHJpdi0+aWVlZTgwMjExLT5DVFNUb1NlbGZUSCA9IENUU1RvU2VsZlRIVmFsOworfQorCitzdGF0aWMgdm9pZCBkbV9jdHN0b3NlbGYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldik7CisJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gcHJpdi0+aWVlZTgwMjExLT5wSFRJbmZvOworCXN0YXRpYyB1bnNpZ25lZCBsb25nCQkJCWxhc3RUeE9rQ250ID0gMDsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZwkJCQlsYXN0UnhPa0NudCA9IDA7CisJdW5zaWduZWQgbG9uZwkJCQkJCWN1clR4T2tDbnQgPSAwOworCXVuc2lnbmVkIGxvbmcJCQkJCQljdXJSeE9rQ250ID0gMDsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+YkNUU1RvU2VsZkVuYWJsZSAhPSBUUlVFKQorCXsKKwkJcEhUSW5mby0+SU9UQWN0aW9uICY9IH5IVF9JT1RfQUNUX0ZPUkNFRF9DVFMyU0VMRjsKKwkJcmV0dXJuOworCX0KKwkvKgorCTEuIFVwbGluaworCTIuIExpbmtzeXMzNTAvTGlua3N5czMwME4KKwkzLiA8NTAgZGlzYWJsZSwgPjU1IGVuYWJsZQorCSovCisKKwlpZihwSFRJbmZvLT5JT1RQZWVyID09IEhUX0lPVF9QRUVSX0JST0FEQ09NKQorCXsKKwkJY3VyVHhPa0NudCA9IHByaXYtPnN0YXRzLnR4Ynl0ZXN1bmljYXN0IC0gbGFzdFR4T2tDbnQ7CisJCWN1clJ4T2tDbnQgPSBwcml2LT5zdGF0cy5yeGJ5dGVzdW5pY2FzdCAtIGxhc3RSeE9rQ250OworCQlpZihjdXJSeE9rQ250ID4gNCpjdXJUeE9rQ250KQkvL2Rvd25saW5rLCBkaXNhYmxlIENUUyB0byBzZWxmCisJCXsKKwkJCXBIVEluZm8tPklPVEFjdGlvbiAmPSB+SFRfSU9UX0FDVF9GT1JDRURfQ1RTMlNFTEY7CisJCQkvL0RiZ1ByaW50KCJkbV9DVFNUb1NlbGYoKSA9PT4gQ1RTIHRvIHNlbGYgZGlzYWJsZWQgLS0gZG93bmxpbmtcbiIpOworCQl9CisJCWVsc2UJLy91cGxpbmsKKwkJeworCQkJcEhUSW5mby0+SU9UQWN0aW9uIHw9IEhUX0lPVF9BQ1RfRk9SQ0VEX0NUUzJTRUxGOworCQl9CisKKwkJbGFzdFR4T2tDbnQgPSBwcml2LT5zdGF0cy50eGJ5dGVzdW5pY2FzdDsKKwkJbGFzdFJ4T2tDbnQgPSBwcml2LT5zdGF0cy5yeGJ5dGVzdW5pY2FzdDsKKwl9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246CWRtX2NoZWNrX3JmY3RybF9ncGlvKCkKKyAqCisgKiBPdmVydmlldzoJQ29weSA4MTg3QiB0ZW1wbGF0ZSBmb3IgOXhzZXJpZXMuCisgKgorICogSW5wdXQ6CQlOT05FCisgKgorICogT3V0cHV0OgkJTk9ORQorICoKKyAqIFJldHVybjoJCU5PTkUKKyAqCisgKiBSZXZpc2VkIEhpc3Rvcnk6CisgKglXaGVuCQlXaG8JCVJlbWFyaworICoJMDUvMjgvMjAwOAlhbXkJCUNyZWF0ZSBWZXJzaW9uIDAgcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBkbV9jaGVja19yZmN0cmxfZ3BpbyhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwkvL3N0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCS8vIFdhbGsgYXJvdW5kIGZvciBEVE0gdGVzdCwgd2Ugd2lsbCBub3QgZW5hYmxlIEhXIC0gcmFkaW8gb24vb2ZmIGJlY2F1c2Ugci93CisJLy8gcGFnZSAxIHJlZ2lzdGVyIGJlZm9yZSBMZXh0cmEgYnVzIGlzIGVuYWJsZWQgY2F1c2Ugc3lzdGVtIGZhaWxzIHdoZW4gcmVzdW1pbmcKKwkvLyBmcm9tIFM0LiAyMDA4MDIxOCwgRW1pbHkKKworCS8vIFN0b3AgdG8gZXhlY3V0ZSB3b3JraXRlbSB0byBwcmV2ZW50IFMzL1M0IGJ1Zy4KKyNpZmRlZiBSVEw4MTkwUAorCXJldHVybjsKKyNlbmRpZgorI2lmZGVmIFJUTDgxOTJVCisJcmV0dXJuOworI2VuZGlmCisjaWZkZWYgUlRMODE5MkUKKwkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPnByaXZfd3EsJnByaXYtPmdwaW9fY2hhbmdlX3JmX3dxLDApOworI2VuZGlmCisKK30JLyogZG1fQ2hlY2tSZkN0cmxHUElPICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOglkbV9jaGVja19wYmNfZ3BpbygpCisgKgorICogT3ZlcnZpZXc6CUNoZWNrIGlmIFBCQyBidXR0b24gaXMgcHJlc3NlZC4KKyAqCisgKiBJbnB1dDoJCU5PTkUKKyAqCisgKiBPdXRwdXQ6CQlOT05FCisgKgorICogUmV0dXJuOgkJTk9ORQorICoKKyAqIFJldmlzZWQgSGlzdG9yeToKKyAqCVdoZW4JCVdobwkJUmVtYXJrCisgKgkwNS8yOC8yMDA4CWFteSAJQ3JlYXRlIFZlcnNpb24gMCBwb3J0aW5nIGZyb20gd2luZG93cyBjb2RlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwl2b2lkCWRtX2NoZWNrX3BiY19ncGlvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisjaWZkZWYgUlRMODE5MlUKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTggdG1wMWJ5dGU7CisKKworCXRtcDFieXRlID0gcmVhZF9uaWNfYnl0ZShkZXYsR1BJKTsKKwlpZih0bXAxYnl0ZSA9PSAweGZmKQorCQlyZXR1cm47CisKKwlpZiAodG1wMWJ5dGUmQklUNiB8fCB0bXAxYnl0ZSZCSVQwKQorCXsKKwkJLy8gSGVyZSB3ZSBvbmx5IHNldCBiUGJjUHJlc3NlZCB0byBUUlVFCisJCS8vIEFmdGVyIHRyaWdnZXIgUEJDLCB0aGUgdmFyaWFibGUgd2lsbCBiZSBzZXQgdG8gRkFMU0UKKwkJUlRfVFJBQ0UoQ09NUF9JTywgIkNoZWNrUGJjR1BJTyAtIFBCQyBpcyBwcmVzc2VkXG4iKTsKKwkJcHJpdi0+YnBiY19wcmVzc2VkID0gdHJ1ZTsKKwl9CisjZW5kaWYKKworfQorCisjaWZkZWYgUlRMODE5MkUKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246CWRtX0dQSU9DaGFuZ2VSRgorICogT3ZlcnZpZXc6CVBDSSB3aWxsIG5vdCBzdXBwb3J0IHdvcmtpdGVtIGNhbGwgYmFjayBIVyByYWRpbyBvbi1vZmYgY29udHJvbC4KKyAqCisgKiBJbnB1dDoJCU5PTkUKKyAqCisgKiBPdXRwdXQ6CQlOT05FCisgKgorICogUmV0dXJuOgkJTk9ORQorICoKKyAqIFJldmlzZWQgSGlzdG9yeToKKyAqCVdoZW4JCVdobwkJUmVtYXJrCisgKgkwMi8yMS8yMDA4CU1IQwkJQ3JlYXRlIFZlcnNpb24gMC4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitleHRlcm4Jdm9pZAlkbV9ncGlvX2NoYW5nZV9yZl9jYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yayxzdHJ1Y3QgZGVsYXllZF93b3JrLHdvcmspOworICAgICAgIHN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGR3b3JrLHN0cnVjdCByODE5Ml9wcml2LGdwaW9fY2hhbmdlX3JmX3dxKTsKKyAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+aWVlZTgwMjExLT5kZXY7CisJdTggdG1wMWJ5dGU7CisJUlRfUkZfUE9XRVJfU1RBVEUJZVJmUG93ZXJTdGF0ZVRvU2V0OworCWJvb2wgYkFjdHVhbGx5U2V0ID0gZmFsc2U7CisKKwlkb3sKKwkJYkFjdHVhbGx5U2V0PWZhbHNlOworCisJCWlmKCFwcml2LT51cCkKKwkJeworCQkJUlRfVFJBQ0UoKENPTVBfSU5JVCB8IENPTVBfUE9XRVIgfCBDT01QX1JGKSwiZG1fZ3Bpb19jaGFuZ2VfcmZfY2FsbGJhY2soKTogQ2FsbGJhY2sgZnVuY3Rpb24gYnJlYWtzIG91dCEhXG4iKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIDB4MTA4IEdQSU8gaW5wdXQgcmVnaXN0ZXIgaXMgcmVhZCBvbmx5CisJCQkvL3NldCAweDEwOCBCMT0gMTogUkYtT047IDA6IFJGLU9GRi4KKwkJCXRtcDFieXRlID0gcmVhZF9uaWNfYnl0ZShkZXYsR1BJKTsKKworCQkJZVJmUG93ZXJTdGF0ZVRvU2V0ID0gKHRtcDFieXRlJkJJVDEpID8gIGVSZk9uIDogZVJmT2ZmOworCisJCQlpZiggKHByaXYtPmJId1JhZGlvT2ZmID09IHRydWUpICYmIChlUmZQb3dlclN0YXRlVG9TZXQgPT0gZVJmT24pKQorCQkJeworCQkJCVJUX1RSQUNFKENPTVBfUkYsICJncGlvY2hhbmdlUkYgIC0gSFcgUmFkaW8gT05cbiIpOworCisJCQkJcHJpdi0+Ykh3UmFkaW9PZmYgPSBmYWxzZTsKKwkJCQliQWN0dWFsbHlTZXQgPSB0cnVlOworCQkJfQorCQkJZWxzZSBpZiAoIChwcml2LT5iSHdSYWRpb09mZiA9PSBmYWxzZSkgJiYgKGVSZlBvd2VyU3RhdGVUb1NldCA9PSBlUmZPZmYpKQorCQkJeworCQkJCVJUX1RSQUNFKENPTVBfUkYsICJncGlvY2hhbmdlUkYgIC0gSFcgUmFkaW8gT0ZGXG4iKTsKKwkJCQlwcml2LT5iSHdSYWRpb09mZiA9IHRydWU7CisJCQkJYkFjdHVhbGx5U2V0ID0gdHJ1ZTsKKwkJCX0KKworCQkJaWYoYkFjdHVhbGx5U2V0KQorCQkJeworCQkJCSNpZmRlZiBUT19ETworCQkJCU1nbnRBY3RTZXRfUkZfU3RhdGUoZGV2LCBlUmZQb3dlclN0YXRlVG9TZXQsIFJGX0NIQU5HRV9CWV9IVyk7CisJCQkJLy9EcnZJRkluZGljYXRlQ3VycmVudFBoeVN0YXR1cyhwQWRhcHRlcik7CisJCQkJI2VuZGlmCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbXNsZWVwKDIwMDApOworCQkJfQorCisJCX0KKwl9d2hpbGUoVFJVRSkKKworfQkvKiBkbV9HUElPQ2hhbmdlUkYgKi8KKworI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjoJRE1fUkZQYXRoQ2hlY2tXb3JrSXRlbUNhbGxCYWNrKCkKKyAqCisgKiBPdmVydmlldzoJQ2hlY2sgaWYgQ3VycmVudCBSRiBSWCBwYXRoIGlzIGVuYWJsZWQKKyAqCisgKiBJbnB1dDoJCU5PTkUKKyAqCisgKiBPdXRwdXQ6CQlOT05FCisgKgorICogUmV0dXJuOgkJTk9ORQorICoKKyAqIFJldmlzZWQgSGlzdG9yeToKKyAqCVdoZW4JCVdobwkJUmVtYXJrCisgKgkwMS8zMC8yMDA4CU1IQwkJQ3JlYXRlIFZlcnNpb24gMC4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitleHRlcm4Jdm9pZAlkbV9yZl9wYXRoY2hlY2tfd29ya2l0ZW1jYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yayxzdHJ1Y3QgZGVsYXllZF93b3JrLHdvcmspOworICAgICAgIHN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGR3b3JrLHN0cnVjdCByODE5Ml9wcml2LHJmcGF0aF9jaGVja193cSk7CisgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9cHJpdi0+aWVlZTgwMjExLT5kZXY7CisJLy9ib29sIGJhY3R1YWxseV9zZXQgPSBmYWxzZTsKKwl1OCByZnBhdGggPSAwLCBpOworCisKKwkvKiAyMDA4LzAxLzMwIE1IIEFmdGVyIGRpc2N1c3Npbmcgd2l0aCBTRDMgSmVycnksIDB4YzA0LzB4ZDA0IHJlZ2lzdGVyIHdpbGwKKwkgICBhbHdheXMgYmUgdGhlIHNhbWUuIFdlIG9ubHkgcmVhZCAweGMwNCBub3cuICovCisJcmZwYXRoID0gcmVhZF9uaWNfYnl0ZShkZXYsIDB4YzA0KTsKKworCS8vIENoZWNrIEJpdCAwLTMsIGl0IG1lYW5zIGlmIFJGIEEtRCBpcyBlbmFibGVkLgorCWZvciAoaSA9IDA7IGkgPCBSRjkwX1BBVEhfTUFYOyBpKyspCisJeworCQlpZiAocmZwYXRoICYgKDB4MDE8PGkpKQorCQkJcHJpdi0+YnJmcGF0aF9yeGVuYWJsZVtpXSA9IDE7CisJCWVsc2UKKwkJCXByaXYtPmJyZnBhdGhfcnhlbmFibGVbaV0gPSAwOworCX0KKwlpZighRE1fUnhQYXRoU2VsVGFibGUuRW5hYmxlKQorCQlyZXR1cm47CisKKwlkbV9yeHBhdGhfc2VsX2J5cnNzaShkZXYpOworfQkvKiBETV9SRlBhdGhDaGVja1dvcmtJdGVtQ2FsbEJhY2sgKi8KKworc3RhdGljIHZvaWQgZG1faW5pdF9yeHBhdGhfc2VsZWN0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXU4IGk7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCURNX1J4UGF0aFNlbFRhYmxlLkVuYWJsZSA9IDE7CS8vZGVmYXVsdCBlbmFibGVkCisJRE1fUnhQYXRoU2VsVGFibGUuU1NfVEhfbG93ID0gUnhQYXRoU2VsZWN0aW9uX1NTX1RIX2xvdzsKKwlETV9SeFBhdGhTZWxUYWJsZS5kaWZmX1RIID0gUnhQYXRoU2VsZWN0aW9uX2RpZmZfVEg7CisJaWYocHJpdi0+Q3VzdG9tZXJJRCA9PSBSVF9DSURfODE5eF9OZXRjb3JlKQorCQlETV9SeFBhdGhTZWxUYWJsZS5jY2tfbWV0aG9kID0gQ0NLX1J4X1ZlcnNpb25fMjsKKwllbHNlCisJCURNX1J4UGF0aFNlbFRhYmxlLmNja19tZXRob2QgPSBDQ0tfUnhfVmVyc2lvbl8xOworCURNX1J4UGF0aFNlbFRhYmxlLkRiZ01vZGUgPSBETV9EQkdfT0ZGOworCURNX1J4UGF0aFNlbFRhYmxlLmRpc2FibGVkUkYgPSAwOworCWZvcihpPTA7IGk8NDsgaSsrKQorCXsKKwkJRE1fUnhQYXRoU2VsVGFibGUucmZfcnNzaVtpXSA9IDUwOworCQlETV9SeFBhdGhTZWxUYWJsZS5jY2tfcHdkYl9zdGFbaV0gPSAtNjQ7CisJCURNX1J4UGF0aFNlbFRhYmxlLnJmX2VuYWJsZV9yc3NpX3RoW2ldID0gMTAwOworCX0KK30KKworc3RhdGljIHZvaWQgZG1fcnhwYXRoX3NlbF9ieXJzc2koc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXU4CQkJCWksIG1heF9yc3NpX2luZGV4PTAsIG1pbl9yc3NpX2luZGV4PTAsIHNlY19yc3NpX2luZGV4PTAsIHJmX251bT0wOworCXU4CQkJCXRtcF9tYXhfcnNzaT0wLCB0bXBfbWluX3Jzc2k9MCwgdG1wX3NlY19yc3NpPTA7CisJdTgJCQkJY2NrX2RlZmF1bHRfUng9MHgyOwkvL1JGLUMKKwl1OAkJCQljY2tfb3B0aW9uYWxfUng9MHgzOy8vUkYtRAorCWxvbmcJCQkJdG1wX2Nja19tYXhfcHdkYj0wLCB0bXBfY2NrX21pbl9wd2RiPTAsIHRtcF9jY2tfc2VjX3B3ZGI9MDsKKwl1OAkJCQljY2tfcnhfdmVyMl9tYXhfaW5kZXg9MCwgY2NrX3J4X3ZlcjJfbWluX2luZGV4PTAsIGNja19yeF92ZXIyX3NlY19pbmRleD0wOworCXU4CQkJCWN1cl9yZl9yc3NpOworCWxvbmcJCQkJY3VyX2Nja19wd2RiOworCXN0YXRpYyB1OAkJCWRpc2FibGVkX3JmX2NudD0wLCBjY2tfUnhfUGF0aF9pbml0aWFsaXplZD0wOworCXU4CQkJCXVwZGF0ZV9jY2tfcnhfcGF0aDsKKworCWlmKHByaXYtPnJmX3R5cGUgIT0gUkZfMlQ0UikKKwkJcmV0dXJuOworCisJaWYoIWNja19SeF9QYXRoX2luaXRpYWxpemVkKQorCXsKKwkJRE1fUnhQYXRoU2VsVGFibGUuY2NrX1J4X3BhdGggPSAocmVhZF9uaWNfYnl0ZShkZXYsIDB4YTA3KSYweGYpOworCQljY2tfUnhfUGF0aF9pbml0aWFsaXplZCA9IDE7CisJfQorCisJRE1fUnhQYXRoU2VsVGFibGUuZGlzYWJsZWRSRiA9IDB4ZjsKKwlETV9SeFBhdGhTZWxUYWJsZS5kaXNhYmxlZFJGICY9fiAocmVhZF9uaWNfYnl0ZShkZXYsIDB4YzA0KSk7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPm1vZGUgPT0gV0lSRUxFU1NfTU9ERV9CKQorCXsKKwkJRE1fUnhQYXRoU2VsVGFibGUuY2NrX21ldGhvZCA9IENDS19SeF9WZXJzaW9uXzI7CS8vcHVyZSBCIG1vZGUsIGZpeGVkIGNjayB2ZXJzaW9uMgorCQkvL0RiZ1ByaW50KCJQdXJlIEIgbW9kZSwgdXNlIGNjayByeCB2ZXJzaW9uMiBcbiIpOworCX0KKworCS8vZGVjaWRlIG1heC9zZWMvbWluIHJzc2kgaW5kZXgKKwlmb3IgKGk9MDsgaTxSRjkwX1BBVEhfTUFYOyBpKyspCisJeworCQlpZighRE1fUnhQYXRoU2VsVGFibGUuRGJnTW9kZSkKKwkJCURNX1J4UGF0aFNlbFRhYmxlLnJmX3Jzc2lbaV0gPSBwcml2LT5zdGF0cy5yeF9yc3NpX3BlcmNlbnRhZ2VbaV07CisKKwkJaWYocHJpdi0+YnJmcGF0aF9yeGVuYWJsZVtpXSkKKwkJeworCQkJcmZfbnVtKys7CisJCQljdXJfcmZfcnNzaSA9IERNX1J4UGF0aFNlbFRhYmxlLnJmX3Jzc2lbaV07CisKKwkJCWlmKHJmX251bSA9PSAxKQkvLyBmaW5kIGZpcnN0IGVuYWJsZWQgcmYgcGF0aCBhbmQgdGhlIHJzc2kgdmFsdWVzCisJCQl7CS8vaW5pdGlhbGl6ZSwgc2V0IGFsbCByc3NpIGluZGV4IHRvIHRoZSBzYW1lIG9uZQorCQkJCW1heF9yc3NpX2luZGV4ID0gbWluX3Jzc2lfaW5kZXggPSBzZWNfcnNzaV9pbmRleCA9IGk7CisJCQkJdG1wX21heF9yc3NpID0gdG1wX21pbl9yc3NpID0gdG1wX3NlY19yc3NpID0gY3VyX3JmX3Jzc2k7CisJCQl9CisJCQllbHNlIGlmKHJmX251bSA9PSAyKQorCQkJewkvLyB3ZSBwaWNrIHVwIHRoZSBtYXggaW5kZXggZmlyc3QsIGFuZCBsZXQgc2VjIGFuZCBtaW4gdG8gYmUgdGhlIHNhbWUgb25lCisJCQkJaWYoY3VyX3JmX3Jzc2kgPj0gdG1wX21heF9yc3NpKQorCQkJCXsKKwkJCQkJdG1wX21heF9yc3NpID0gY3VyX3JmX3Jzc2k7CisJCQkJCW1heF9yc3NpX2luZGV4ID0gaTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJdG1wX3NlY19yc3NpID0gdG1wX21pbl9yc3NpID0gY3VyX3JmX3Jzc2k7CisJCQkJCXNlY19yc3NpX2luZGV4ID0gbWluX3Jzc2lfaW5kZXggPSBpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZihjdXJfcmZfcnNzaSA+IHRtcF9tYXhfcnNzaSkKKwkJCQl7CisJCQkJCXRtcF9zZWNfcnNzaSA9IHRtcF9tYXhfcnNzaTsKKwkJCQkJc2VjX3Jzc2lfaW5kZXggPSBtYXhfcnNzaV9pbmRleDsKKwkJCQkJdG1wX21heF9yc3NpID0gY3VyX3JmX3Jzc2k7CisJCQkJCW1heF9yc3NpX2luZGV4ID0gaTsKKwkJCQl9CisJCQkJZWxzZSBpZihjdXJfcmZfcnNzaSA9PSB0bXBfbWF4X3Jzc2kpCisJCQkJewkvLyBsZXQgc2VjIGFuZCBtaW4gcG9pbnQgdG8gdGhlIGRpZmZlcmVudCBpbmRleAorCQkJCQl0bXBfc2VjX3Jzc2kgPSBjdXJfcmZfcnNzaTsKKwkJCQkJc2VjX3Jzc2lfaW5kZXggPSBpOworCQkJCX0KKwkJCQllbHNlIGlmKChjdXJfcmZfcnNzaSA8IHRtcF9tYXhfcnNzaSkgJiYoY3VyX3JmX3Jzc2kgPiB0bXBfc2VjX3Jzc2kpKQorCQkJCXsKKwkJCQkJdG1wX3NlY19yc3NpID0gY3VyX3JmX3Jzc2k7CisJCQkJCXNlY19yc3NpX2luZGV4ID0gaTsKKwkJCQl9CisJCQkJZWxzZSBpZihjdXJfcmZfcnNzaSA9PSB0bXBfc2VjX3Jzc2kpCisJCQkJeworCQkJCQlpZih0bXBfc2VjX3Jzc2kgPT0gdG1wX21pbl9yc3NpKQorCQkJCQl7CS8vIGxldCBzZWMgYW5kIG1pbiBwb2ludCB0byB0aGUgZGlmZmVyZW50IGluZGV4CisJCQkJCQl0bXBfc2VjX3Jzc2kgPSBjdXJfcmZfcnNzaTsKKwkJCQkJCXNlY19yc3NpX2luZGV4ID0gaTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCS8vIFRoaXMgY2FzZSB3ZSBkb24ndCBuZWVkIHRvIHNldCBhbnkgaW5kZXgKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKChjdXJfcmZfcnNzaSA8IHRtcF9zZWNfcnNzaSkgJiYgKGN1cl9yZl9yc3NpID4gdG1wX21pbl9yc3NpKSkKKwkJCQl7CisJCQkJCS8vIFRoaXMgY2FzZSB3ZSBkb24ndCBuZWVkIHRvIHNldCBhbnkgaW5kZXgKKwkJCQl9CisJCQkJZWxzZSBpZihjdXJfcmZfcnNzaSA9PSB0bXBfbWluX3Jzc2kpCisJCQkJeworCQkJCQlpZih0bXBfc2VjX3Jzc2kgPT0gdG1wX21pbl9yc3NpKQorCQkJCQl7CS8vIGxldCBzZWMgYW5kIG1pbiBwb2ludCB0byB0aGUgZGlmZmVyZW50IGluZGV4CisJCQkJCQl0bXBfbWluX3Jzc2kgPSBjdXJfcmZfcnNzaTsKKwkJCQkJCW1pbl9yc3NpX2luZGV4ID0gaTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCS8vIFRoaXMgY2FzZSB3ZSBkb24ndCBuZWVkIHRvIHNldCBhbnkgaW5kZXgKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKGN1cl9yZl9yc3NpIDwgdG1wX21pbl9yc3NpKQorCQkJCXsKKwkJCQkJdG1wX21pbl9yc3NpID0gY3VyX3JmX3Jzc2k7CisJCQkJCW1pbl9yc3NpX2luZGV4ID0gaTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZl9udW0gPSAwOworCS8vIGRlY2lkZSBtYXgvc2VjL21pbiBjY2sgcHdkYiBpbmRleAorCWlmKERNX1J4UGF0aFNlbFRhYmxlLmNja19tZXRob2QgPT0gQ0NLX1J4X1ZlcnNpb25fMikKKwl7CisJCWZvciAoaT0wOyBpPFJGOTBfUEFUSF9NQVg7IGkrKykKKwkJeworCQkJaWYocHJpdi0+YnJmcGF0aF9yeGVuYWJsZVtpXSkKKwkJCXsKKwkJCQlyZl9udW0rKzsKKwkJCQljdXJfY2NrX3B3ZGIgPSAgRE1fUnhQYXRoU2VsVGFibGUuY2NrX3B3ZGJfc3RhW2ldOworCisJCQkJaWYocmZfbnVtID09IDEpCS8vIGZpbmQgZmlyc3QgZW5hYmxlZCByZiBwYXRoIGFuZCB0aGUgcnNzaSB2YWx1ZXMKKwkJCQl7CS8vaW5pdGlhbGl6ZSwgc2V0IGFsbCByc3NpIGluZGV4IHRvIHRoZSBzYW1lIG9uZQorCQkJCQljY2tfcnhfdmVyMl9tYXhfaW5kZXggPSBjY2tfcnhfdmVyMl9taW5faW5kZXggPSBjY2tfcnhfdmVyMl9zZWNfaW5kZXggPSBpOworCQkJCQl0bXBfY2NrX21heF9wd2RiID0gdG1wX2Nja19taW5fcHdkYiA9IHRtcF9jY2tfc2VjX3B3ZGIgPSBjdXJfY2NrX3B3ZGI7CisJCQkJfQorCQkJCWVsc2UgaWYocmZfbnVtID09IDIpCisJCQkJewkvLyB3ZSBwaWNrIHVwIHRoZSBtYXggaW5kZXggZmlyc3QsIGFuZCBsZXQgc2VjIGFuZCBtaW4gdG8gYmUgdGhlIHNhbWUgb25lCisJCQkJCWlmKGN1cl9jY2tfcHdkYiA+PSB0bXBfY2NrX21heF9wd2RiKQorCQkJCQl7CisJCQkJCQl0bXBfY2NrX21heF9wd2RiID0gY3VyX2Nja19wd2RiOworCQkJCQkJY2NrX3J4X3ZlcjJfbWF4X2luZGV4ID0gaTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXRtcF9jY2tfc2VjX3B3ZGIgPSB0bXBfY2NrX21pbl9wd2RiID0gY3VyX2Nja19wd2RiOworCQkJCQkJY2NrX3J4X3ZlcjJfc2VjX2luZGV4ID0gY2NrX3J4X3ZlcjJfbWluX2luZGV4ID0gaTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlpZihjdXJfY2NrX3B3ZGIgPiB0bXBfY2NrX21heF9wd2RiKQorCQkJCQl7CisJCQkJCQl0bXBfY2NrX3NlY19wd2RiID0gdG1wX2Nja19tYXhfcHdkYjsKKwkJCQkJCWNja19yeF92ZXIyX3NlY19pbmRleCA9IGNja19yeF92ZXIyX21heF9pbmRleDsKKwkJCQkJCXRtcF9jY2tfbWF4X3B3ZGIgPSBjdXJfY2NrX3B3ZGI7CisJCQkJCQljY2tfcnhfdmVyMl9tYXhfaW5kZXggPSBpOworCQkJCQl9CisJCQkJCWVsc2UgaWYoY3VyX2Nja19wd2RiID09IHRtcF9jY2tfbWF4X3B3ZGIpCisJCQkJCXsJLy8gbGV0IHNlYyBhbmQgbWluIHBvaW50IHRvIHRoZSBkaWZmZXJlbnQgaW5kZXgKKwkJCQkJCXRtcF9jY2tfc2VjX3B3ZGIgPSBjdXJfY2NrX3B3ZGI7CisJCQkJCQljY2tfcnhfdmVyMl9zZWNfaW5kZXggPSBpOworCQkJCQl9CisJCQkJCWVsc2UgaWYoKGN1cl9jY2tfcHdkYiA8IHRtcF9jY2tfbWF4X3B3ZGIpICYmKGN1cl9jY2tfcHdkYiA+IHRtcF9jY2tfc2VjX3B3ZGIpKQorCQkJCQl7CisJCQkJCQl0bXBfY2NrX3NlY19wd2RiID0gY3VyX2Nja19wd2RiOworCQkJCQkJY2NrX3J4X3ZlcjJfc2VjX2luZGV4ID0gaTsKKwkJCQkJfQorCQkJCQllbHNlIGlmKGN1cl9jY2tfcHdkYiA9PSB0bXBfY2NrX3NlY19wd2RiKQorCQkJCQl7CisJCQkJCQlpZih0bXBfY2NrX3NlY19wd2RiID09IHRtcF9jY2tfbWluX3B3ZGIpCisJCQkJCQl7CS8vIGxldCBzZWMgYW5kIG1pbiBwb2ludCB0byB0aGUgZGlmZmVyZW50IGluZGV4CisJCQkJCQkJdG1wX2Nja19zZWNfcHdkYiA9IGN1cl9jY2tfcHdkYjsKKwkJCQkJCQljY2tfcnhfdmVyMl9zZWNfaW5kZXggPSBpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCS8vIFRoaXMgY2FzZSB3ZSBkb24ndCBuZWVkIHRvIHNldCBhbnkgaW5kZXgKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlIGlmKChjdXJfY2NrX3B3ZGIgPCB0bXBfY2NrX3NlY19wd2RiKSAmJiAoY3VyX2Nja19wd2RiID4gdG1wX2Nja19taW5fcHdkYikpCisJCQkJCXsKKwkJCQkJCS8vIFRoaXMgY2FzZSB3ZSBkb24ndCBuZWVkIHRvIHNldCBhbnkgaW5kZXgKKwkJCQkJfQorCQkJCQllbHNlIGlmKGN1cl9jY2tfcHdkYiA9PSB0bXBfY2NrX21pbl9wd2RiKQorCQkJCQl7CisJCQkJCQlpZih0bXBfY2NrX3NlY19wd2RiID09IHRtcF9jY2tfbWluX3B3ZGIpCisJCQkJCQl7CS8vIGxldCBzZWMgYW5kIG1pbiBwb2ludCB0byB0aGUgZGlmZmVyZW50IGluZGV4CisJCQkJCQkJdG1wX2Nja19taW5fcHdkYiA9IGN1cl9jY2tfcHdkYjsKKwkJCQkJCQljY2tfcnhfdmVyMl9taW5faW5kZXggPSBpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCS8vIFRoaXMgY2FzZSB3ZSBkb24ndCBuZWVkIHRvIHNldCBhbnkgaW5kZXgKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlIGlmKGN1cl9jY2tfcHdkYiA8IHRtcF9jY2tfbWluX3B3ZGIpCisJCQkJCXsKKwkJCQkJCXRtcF9jY2tfbWluX3B3ZGIgPSBjdXJfY2NrX3B3ZGI7CisJCQkJCQljY2tfcnhfdmVyMl9taW5faW5kZXggPSBpOworCQkJCQl9CisJCQkJfQorCisJCQl9CisJCX0KKwl9CisKKworCS8vIFNldCBDQ0sgUnggcGF0aAorCS8vIHJlZzB4QTA3WzM6Ml09Y2NrIGRlZmF1bHQgcnggcGF0aCwgcmVnMHhhMDdbMTowXT1jY2sgb3B0aW9uYWwgcnggcGF0aC4KKwl1cGRhdGVfY2NrX3J4X3BhdGggPSAwOworCWlmKERNX1J4UGF0aFNlbFRhYmxlLmNja19tZXRob2QgPT0gQ0NLX1J4X1ZlcnNpb25fMikKKwl7CisJCWNja19kZWZhdWx0X1J4ID0gY2NrX3J4X3ZlcjJfbWF4X2luZGV4OworCQljY2tfb3B0aW9uYWxfUnggPSBjY2tfcnhfdmVyMl9zZWNfaW5kZXg7CisJCWlmKHRtcF9jY2tfbWF4X3B3ZGIgIT0gLTY0KQorCQkJdXBkYXRlX2Nja19yeF9wYXRoID0gMTsKKwl9CisKKwlpZih0bXBfbWluX3Jzc2kgPCBETV9SeFBhdGhTZWxUYWJsZS5TU19USF9sb3cgJiYgZGlzYWJsZWRfcmZfY250IDwgMikKKwl7CisJCWlmKCh0bXBfbWF4X3Jzc2kgLSB0bXBfbWluX3Jzc2kpID49IERNX1J4UGF0aFNlbFRhYmxlLmRpZmZfVEgpCisJCXsKKwkJCS8vcmVjb3JkIHRoZSBlbmFibGVkIHJzc2kgdGhyZXNob2xkCisJCQlETV9SeFBhdGhTZWxUYWJsZS5yZl9lbmFibGVfcnNzaV90aFttaW5fcnNzaV9pbmRleF0gPSB0bXBfbWF4X3Jzc2krNTsKKwkJCS8vZGlzYWJsZSB0aGUgQkIgUnggcGF0aCwgT0ZETQorCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9UUnhQYXRoRW5hYmxlLCAweDE8PG1pbl9yc3NpX2luZGV4LCAweDApOwkvLyAweGMwNFszOjBdCisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0xX1RSeFBhdGhFbmFibGUsIDB4MTw8bWluX3Jzc2lfaW5kZXgsIDB4MCk7CS8vIDB4ZDA0WzM6MF0KKwkJCWRpc2FibGVkX3JmX2NudCsrOworCQl9CisJCWlmKERNX1J4UGF0aFNlbFRhYmxlLmNja19tZXRob2QgPT0gQ0NLX1J4X1ZlcnNpb25fMSkKKwkJeworCQkJY2NrX2RlZmF1bHRfUnggPSBtYXhfcnNzaV9pbmRleDsKKwkJCWNja19vcHRpb25hbF9SeCA9IHNlY19yc3NpX2luZGV4OworCQkJaWYodG1wX21heF9yc3NpKQorCQkJCXVwZGF0ZV9jY2tfcnhfcGF0aCA9IDE7CisJCX0KKwl9CisKKwlpZih1cGRhdGVfY2NrX3J4X3BhdGgpCisJeworCQlETV9SeFBhdGhTZWxUYWJsZS5jY2tfUnhfcGF0aCA9IChjY2tfZGVmYXVsdF9SeDw8Mil8KGNja19vcHRpb25hbF9SeCk7CisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9BRkVTZXR0aW5nLCAweDBmMDAwMDAwLCBETV9SeFBhdGhTZWxUYWJsZS5jY2tfUnhfcGF0aCk7CisJfQorCisJaWYoRE1fUnhQYXRoU2VsVGFibGUuZGlzYWJsZWRSRikKKwl7CisJCWZvcihpPTA7IGk8NDsgaSsrKQorCQl7CisJCQlpZigoRE1fUnhQYXRoU2VsVGFibGUuZGlzYWJsZWRSRj4+aSkgJiAweDEpCS8vZGlzYWJsZWQgcmYKKwkJCXsKKwkJCQlpZih0bXBfbWF4X3Jzc2kgPj0gRE1fUnhQYXRoU2VsVGFibGUucmZfZW5hYmxlX3Jzc2lfdGhbaV0pCisJCQkJeworCQkJCQkvL2VuYWJsZSB0aGUgQkIgUnggcGF0aAorCQkJCQkvL0RiZ1ByaW50KCJSRi0lZCBpcyBlbmFibGVkLiBcbiIsIDB4MTw8aSk7CisJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfVFJ4UGF0aEVuYWJsZSwgMHgxPDxpLCAweDEpOwkvLyAweGMwNFszOjBdCisJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTFfVFJ4UGF0aEVuYWJsZSwgMHgxPDxpLCAweDEpOwkvLyAweGQwNFszOjBdCisJCQkJCURNX1J4UGF0aFNlbFRhYmxlLnJmX2VuYWJsZV9yc3NpX3RoW2ldID0gMTAwOworCQkJCQlkaXNhYmxlZF9yZl9jbnQtLTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOglkbV9jaGVja19yeF9wYXRoX3NlbGVjdGlvbigpCisgKgorICogT3ZlcnZpZXc6CUNhbGwgYSB3b3JraXRlbSB0byBjaGVjayBjdXJyZW50IFJYUkYgcGF0aCBhbmQgUnggUGF0aCBzZWxlY3Rpb24gYnkgUlNTSS4KKyAqCisgKiBJbnB1dDoJCU5PTkUKKyAqCisgKiBPdXRwdXQ6CQlOT05FCisgKgorICogUmV0dXJuOgkJTk9ORQorICoKKyAqIFJldmlzZWQgSGlzdG9yeToKKyAqCVdoZW4JCVdobwkJUmVtYXJrCisgKgkwNS8yOC8yMDA4CWFteQkJQ3JlYXRlIFZlcnNpb24gMCBwb3J0aW5nIGZyb20gd2luZG93cyBjb2RlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwl2b2lkCWRtX2NoZWNrX3J4X3BhdGhfc2VsZWN0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT5wcml2X3dxLCZwcml2LT5yZnBhdGhfY2hlY2tfd3EsMCk7Cit9CS8qIGRtX0NoZWNrUnhSRlBhdGggKi8KKworCitzdGF0aWMgdm9pZCBkbV9pbml0X2ZzeW5jIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXByaXYtPmllZWU4MDIxMS0+ZnN5bmNfdGltZV9pbnRlcnZhbCA9IDUwMDsKKwlwcml2LT5pZWVlODAyMTEtPmZzeW5jX3JhdGVfYml0bWFwID0gMHgwZjAwMDgwMDsKKwlwcml2LT5pZWVlODAyMTEtPmZzeW5jX3Jzc2lfdGhyZXNob2xkID0gMzA7CisjaWZkZWYgUlRMODE5MFAKKwlwcml2LT5pZWVlODAyMTEtPmJmc3luY19lbmFibGUgPSB0cnVlOworI2Vsc2UKKwlwcml2LT5pZWVlODAyMTEtPmJmc3luY19lbmFibGUgPSBmYWxzZTsKKyNlbmRpZgorCXByaXYtPmllZWU4MDIxMS0+ZnN5bmNfbXVsdGlwbGVfdGltZWludGVydmFsID0gMzsKKwlwcml2LT5pZWVlODAyMTEtPmZzeW5jX2ZpcnN0ZGlmZl9yYXRldGhyZXNob2xkPSAxMDA7CisJcHJpdi0+aWVlZTgwMjExLT5mc3luY19zZWNvbmRkaWZmX3JhdGV0aHJlc2hvbGQ9IDIwMDsKKwlwcml2LT5pZWVlODAyMTEtPmZzeW5jX3N0YXRlID0gRGVmYXVsdF9Gc3luYzsKKwlwcml2LT5mcmFtZXN5bmNNb25pdG9yID0gMTsJLy8gY3VycmVudCBkZWZhdWx0IDB4YzM4IG1vbml0b3Igb24KKworCWluaXRfdGltZXIoJnByaXYtPmZzeW5jX3RpbWVyKTsKKwlwcml2LT5mc3luY190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCXByaXYtPmZzeW5jX3RpbWVyLmZ1bmN0aW9uID0gZG1fZnN5bmNfdGltZXJfY2FsbGJhY2s7Cit9CisKKworc3RhdGljIHZvaWQgZG1fZGVJbml0X2ZzeW5jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWRlbF90aW1lcl9zeW5jKCZwcml2LT5mc3luY190aW1lcik7Cit9CisKK2V4dGVybiB2b2lkIGRtX2ZzeW5jX3RpbWVyX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGEpOworCXUzMiByYXRlX2luZGV4LCByYXRlX2NvdW50ID0gMCwgcmF0ZV9jb3VudF9kaWZmPTA7CisJYm9vbAkJYlN3aXRjaEZyb21Db3VudERpZmYgPSBmYWxzZTsKKwlib29sCQliRG91YmxlVGltZUludGVydmFsID0gZmFsc2U7CisKKwlpZigJcHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEICYmCisJCXByaXYtPmllZWU4MDIxMS0+YmZzeW5jX2VuYWJsZSAmJgorCQkocHJpdi0+aWVlZTgwMjExLT5wSFRJbmZvLT5JT1RBY3Rpb24gJiBIVF9JT1RfQUNUX0NERF9GU1lOQykpCisJeworCQkgLy8gQ291bnQgcmF0ZSA1NCwgTUNTIFs3XSwgWzEyLCAxMywgMTQsIDE1XQorCQl1MzIgcmF0ZV9iaXRtYXA7CisJCWZvcihyYXRlX2luZGV4ID0gMDsgcmF0ZV9pbmRleCA8PSAyNzsgcmF0ZV9pbmRleCsrKQorCQl7CisJCQlyYXRlX2JpdG1hcCAgPSAxIDw8IHJhdGVfaW5kZXg7CisJCQlpZihwcml2LT5pZWVlODAyMTEtPmZzeW5jX3JhdGVfYml0bWFwICYgIHJhdGVfYml0bWFwKQorCQkJCXJhdGVfY291bnQrPSBwcml2LT5zdGF0cy5yZWNlaXZlZF9yYXRlX2hpc3RvZ3JhbVsxXVtyYXRlX2luZGV4XTsKKwkJfQorCisJCWlmKHJhdGVfY291bnQgPCBwcml2LT5yYXRlX3JlY29yZCkKKwkJCXJhdGVfY291bnRfZGlmZiA9IDB4ZmZmZmZmZmYgLSByYXRlX2NvdW50ICsgcHJpdi0+cmF0ZV9yZWNvcmQ7CisJCWVsc2UKKwkJCXJhdGVfY291bnRfZGlmZiA9IHJhdGVfY291bnQgLSBwcml2LT5yYXRlX3JlY29yZDsKKwkJaWYocmF0ZV9jb3VudF9kaWZmIDwgcHJpdi0+cmF0ZUNvdW50RGlmZlJlY29yZCkKKwkJeworCisJCQl1MzIgRGlmZk51bSA9IHByaXYtPnJhdGVDb3VudERpZmZSZWNvcmQgLSByYXRlX2NvdW50X2RpZmY7CisJCQkvLyBDb250aXVuZSBjb3VudAorCQkJaWYoRGlmZk51bSA+PSBwcml2LT5pZWVlODAyMTEtPmZzeW5jX3NlY29uZGRpZmZfcmF0ZXRocmVzaG9sZCkKKwkJCQlwcml2LT5Db250aXVuZURpZmZDb3VudCsrOworCQkJZWxzZQorCQkJCXByaXYtPkNvbnRpdW5lRGlmZkNvdW50ID0gMDsKKworCQkJLy8gQ29udGl1bmUgY291bnQgb3ZlcgorCQkJaWYocHJpdi0+Q29udGl1bmVEaWZmQ291bnQgPj0yKQorCQkJeworCQkJCWJTd2l0Y2hGcm9tQ291bnREaWZmID0gdHJ1ZTsKKwkJCQlwcml2LT5Db250aXVuZURpZmZDb3VudCA9IDA7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBTdG9wIGNvbnRpdW5lIGNvdW50CisJCQlwcml2LT5Db250aXVuZURpZmZDb3VudCA9IDA7CisJCX0KKworCQkvL0lmIENvdW50IGRpZmYgPD0gRnN5bmNSYXRlQ291bnRUaHJlc2hvbGQKKwkJaWYocmF0ZV9jb3VudF9kaWZmIDw9IHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfZmlyc3RkaWZmX3JhdGV0aHJlc2hvbGQpCisJCXsKKwkJCWJTd2l0Y2hGcm9tQ291bnREaWZmID0gdHJ1ZTsKKwkJCXByaXYtPkNvbnRpdW5lRGlmZkNvdW50ID0gMDsKKwkJfQorCQlwcml2LT5yYXRlX3JlY29yZCA9IHJhdGVfY291bnQ7CisJCXByaXYtPnJhdGVDb3VudERpZmZSZWNvcmQgPSByYXRlX2NvdW50X2RpZmY7CisJCVJUX1RSQUNFKENPTVBfSEFMRE0sICJyYXRlUmVjb3JkICVkIHJhdGVDb3VudCAlZCwgcmF0ZUNvdW50ZGlmZiAlZCBiU3dpdGNoRnN5bmMgJWRcbiIsIHByaXYtPnJhdGVfcmVjb3JkLCByYXRlX2NvdW50LCByYXRlX2NvdW50X2RpZmYgLCBwcml2LT5ic3dpdGNoX2ZzeW5jKTsKKwkJLy8gaWYgd2UgbmV2ZXIgcmVjZWl2ZSB0aG9zZSBtY3MgcmF0ZSBhbmQgcnNzaSA+IDMwICUgdGhlbiBzd2l0Y2ggZnN5bgorCQlpZihwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID4gcHJpdi0+aWVlZTgwMjExLT5mc3luY19yc3NpX3RocmVzaG9sZCAmJiBiU3dpdGNoRnJvbUNvdW50RGlmZikKKwkJeworCQkJYkRvdWJsZVRpbWVJbnRlcnZhbCA9IHRydWU7CisJCQlwcml2LT5ic3dpdGNoX2ZzeW5jID0gIXByaXYtPmJzd2l0Y2hfZnN5bmM7CisJCQlpZihwcml2LT5ic3dpdGNoX2ZzeW5jKQorCQkJeworCQkJI2lmZGVmIFJUTDgxOTBQCisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweEMzNiwgMHgwMCk7CisJCQkjZWxzZQorCQkJCXdyaXRlX25pY19ieXRlKGRldiwweEMzNiwgMHgxYyk7CisJCQkjZW5kaWYKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4QzNlLCAweDkwKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCSNpZmRlZiBSVEw4MTkwUAorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgMHhDMzYsIDB4NDApOworCQkJI2Vsc2UKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4QzM2LCAweDVjKTsKKwkJCSNlbmRpZgorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgMHhDM2UsIDB4OTYpOworCQkJfQorCQl9CisJCWVsc2UgaWYocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8PSBwcml2LT5pZWVlODAyMTEtPmZzeW5jX3Jzc2lfdGhyZXNob2xkKQorCQl7CisJCQlpZihwcml2LT5ic3dpdGNoX2ZzeW5jKQorCQkJeworCQkJCXByaXYtPmJzd2l0Y2hfZnN5bmMgID0gZmFsc2U7CisJCQkjaWZkZWYgUlRMODE5MFAKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4QzM2LCAweDQwKTsKKwkJCSNlbHNlCisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweEMzNiwgMHg1Yyk7CisJCQkjZW5kaWYKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4QzNlLCAweDk2KTsKKwkJCX0KKwkJfQorCQlpZihiRG91YmxlVGltZUludGVydmFsKXsKKwkJCWlmKHRpbWVyX3BlbmRpbmcoJnByaXYtPmZzeW5jX3RpbWVyKSkKKwkJCQlkZWxfdGltZXJfc3luYygmcHJpdi0+ZnN5bmNfdGltZXIpOworCQkJcHJpdi0+ZnN5bmNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBNU0VDUyhwcml2LT5pZWVlODAyMTEtPmZzeW5jX3RpbWVfaW50ZXJ2YWwqcHJpdi0+aWVlZTgwMjExLT5mc3luY19tdWx0aXBsZV90aW1laW50ZXJ2YWwpOworCQkJYWRkX3RpbWVyKCZwcml2LT5mc3luY190aW1lcik7CisJCX0KKwkJZWxzZXsKKwkJCWlmKHRpbWVyX3BlbmRpbmcoJnByaXYtPmZzeW5jX3RpbWVyKSkKKwkJCQlkZWxfdGltZXJfc3luYygmcHJpdi0+ZnN5bmNfdGltZXIpOworCQkJcHJpdi0+ZnN5bmNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBNU0VDUyhwcml2LT5pZWVlODAyMTEtPmZzeW5jX3RpbWVfaW50ZXJ2YWwpOworCQkJYWRkX3RpbWVyKCZwcml2LT5mc3luY190aW1lcik7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJLy8gTGV0IFJlZ2lzdGVyIHJldHVybiB0byBkZWZhdWx0IHZhbHVlOworCQlpZihwcml2LT5ic3dpdGNoX2ZzeW5jKQorCQl7CisJCQlwcml2LT5ic3dpdGNoX2ZzeW5jICA9IGZhbHNlOworCQkjaWZkZWYgUlRMODE5MFAKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgMHhDMzYsIDB4NDApOworCQkjZWxzZQorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweEMzNiwgMHg1Yyk7CisJCSNlbmRpZgorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweEMzZSwgMHg5Nik7CisJCX0KKwkJcHJpdi0+Q29udGl1bmVEaWZmQ291bnQgPSAwOworCSNpZmRlZiBSVEw4MTkwUAorCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjIsIDB4MTY0MDUyY2QpOworCSNlbHNlCisJCXdyaXRlX25pY19kd29yZChkZXYsIHJPRkRNMF9SeERldGVjdG9yMiwgMHg0NjVjNTJjZCk7CisJI2VuZGlmCisJfQorCVJUX1RSQUNFKENPTVBfSEFMRE0sICJDb250aXVuZURpZmZDb3VudCAlZFxuIiwgcHJpdi0+Q29udGl1bmVEaWZmQ291bnQpOworCVJUX1RSQUNFKENPTVBfSEFMRE0sICJyYXRlUmVjb3JkICVkIHJhdGVDb3VudCAlZCwgcmF0ZUNvdW50ZGlmZiAlZCBiU3dpdGNoRnN5bmMgJWRcbiIsIHByaXYtPnJhdGVfcmVjb3JkLCByYXRlX2NvdW50LCByYXRlX2NvdW50X2RpZmYgLCBwcml2LT5ic3dpdGNoX2ZzeW5jKTsKK30KKworc3RhdGljIHZvaWQgZG1fU3RhcnRIV0ZzeW5jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJUlRfVFJBQ0UoQ09NUF9IQUxETSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCXdyaXRlX25pY19kd29yZChkZXYsIHJPRkRNMF9SeERldGVjdG9yMiwgMHg0NjVjMTJjZik7CisJd3JpdGVfbmljX2J5dGUoZGV2LCAweGMzYiwgMHg0MSk7Cit9CisKK3N0YXRpYyB2b2lkIGRtX0VuZFNXRnN5bmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlSVF9UUkFDRShDT01QX0hBTERNLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJZGVsX3RpbWVyX3N5bmMoJihwcml2LT5mc3luY190aW1lcikpOworCisJLy8gTGV0IFJlZ2lzdGVyIHJldHVybiB0byBkZWZhdWx0IHZhbHVlOworCWlmKHByaXYtPmJzd2l0Y2hfZnN5bmMpCisJeworCQlwcml2LT5ic3dpdGNoX2ZzeW5jICA9IGZhbHNlOworCisJCSNpZmRlZiBSVEw4MTkwUAorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweEMzNiwgMHg0MCk7CisJCSNlbHNlCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4QzM2LCAweDVjKTsKKwkJI2VuZGlmCisKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCAweEMzZSwgMHg5Nik7CisJfQorCisJcHJpdi0+Q29udGl1bmVEaWZmQ291bnQgPSAwOworI2lmbmRlZiBSVEw4MTkwUAorCXdyaXRlX25pY19kd29yZChkZXYsIHJPRkRNMF9SeERldGVjdG9yMiwgMHg0NjVjNTJjZCk7CisjZW5kaWYKKworfQorCitzdGF0aWMgdm9pZCBkbV9TdGFydFNXRnN5bmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIAkJCXJhdGVJbmRleDsKKwl1MzIgCQkJcmF0ZUJpdG1hcDsKKworCVJUX1RSQUNFKENPTVBfSEFMRE0sIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCS8vIEluaXRpYWwgcmF0ZSByZWNvcmQgdG8gemVybywgc3RhcnQgdG8gcmVjb3JkLgorCXByaXYtPnJhdGVfcmVjb3JkID0gMDsKKwkvLyBJbml0aWFsIGNvbnRpdW5lIGRpZmYgY291bnQgdG8gemVybywgc3RhcnQgdG8gcmVjb3JkLgorCXByaXYtPkNvbnRpdW5lRGlmZkNvdW50ID0gMDsKKwlwcml2LT5yYXRlQ291bnREaWZmUmVjb3JkID0gMDsKKwlwcml2LT5ic3dpdGNoX2ZzeW5jICA9IGZhbHNlOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5tb2RlID09IFdJUkVMRVNTX01PREVfTl8yNEcpCisJeworCQlwcml2LT5pZWVlODAyMTEtPmZzeW5jX2ZpcnN0ZGlmZl9yYXRldGhyZXNob2xkPSA2MDA7CisJCXByaXYtPmllZWU4MDIxMS0+ZnN5bmNfc2Vjb25kZGlmZl9yYXRldGhyZXNob2xkID0gMHhmZmZmOworCX0KKwllbHNlCisJeworCQlwcml2LT5pZWVlODAyMTEtPmZzeW5jX2ZpcnN0ZGlmZl9yYXRldGhyZXNob2xkPSAyMDA7CisJCXByaXYtPmllZWU4MDIxMS0+ZnN5bmNfc2Vjb25kZGlmZl9yYXRldGhyZXNob2xkID0gMjAwOworCX0KKwlmb3IocmF0ZUluZGV4ID0gMDsgcmF0ZUluZGV4IDw9IDI3OyByYXRlSW5kZXgrKykKKwl7CisJCXJhdGVCaXRtYXAgID0gMSA8PCByYXRlSW5kZXg7CisJCWlmKHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfcmF0ZV9iaXRtYXAgJiAgcmF0ZUJpdG1hcCkKKwkJCXByaXYtPnJhdGVfcmVjb3JkICs9IHByaXYtPnN0YXRzLnJlY2VpdmVkX3JhdGVfaGlzdG9ncmFtWzFdW3JhdGVJbmRleF07CisJfQorCWlmKHRpbWVyX3BlbmRpbmcoJnByaXYtPmZzeW5jX3RpbWVyKSkKKwkJZGVsX3RpbWVyX3N5bmMoJnByaXYtPmZzeW5jX3RpbWVyKTsKKwlwcml2LT5mc3luY190aW1lci5leHBpcmVzID0gamlmZmllcyArIE1TRUNTKHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfdGltZV9pbnRlcnZhbCk7CisJYWRkX3RpbWVyKCZwcml2LT5mc3luY190aW1lcik7CisKKyNpZm5kZWYgUlRMODE5MFAKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjIsIDB4NDY1YzEyY2QpOworI2VuZGlmCisKK30KKworc3RhdGljIHZvaWQgZG1fRW5kSFdGc3luYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCVJUX1RSQUNFKENPTVBfSEFMRE0sIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCXdyaXRlX25pY19kd29yZChkZXYsIHJPRkRNMF9SeERldGVjdG9yMiwgMHg0NjVjNTJjZCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCAweGMzYiwgMHg0OSk7CisKK30KKwordm9pZCBkbV9jaGVja19mc3luYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworI2RlZmluZQlSZWdDMzhfRGVmYXVsdAkJCQkwCisjZGVmaW5lCVJlZ0MzOF9Ob25Gc3luY19PdGhlcl9BUAkxCisjZGVmaW5lCVJlZ0MzOF9Gc3luY19BUF9CQ00JCTIKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJLy91MzIgCQkJZnJhbWVzeW5jQzM0OworCXN0YXRpYyB1OAkJcmVnX2MzOF9TdGF0ZT1SZWdDMzhfRGVmYXVsdDsKKwlzdGF0aWMgdTMyCXJlc2V0X2NudD0wOworCisJUlRfVFJBQ0UoQ09NUF9IQUxETSwgIlJTU0kgJWQgVGltZUludGVydmFsICVkIE11bHRpcGxlVGltZUludGVydmFsICVkXG4iLCBwcml2LT5pZWVlODAyMTEtPmZzeW5jX3Jzc2lfdGhyZXNob2xkLCBwcml2LT5pZWVlODAyMTEtPmZzeW5jX3RpbWVfaW50ZXJ2YWwsIHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfbXVsdGlwbGVfdGltZWludGVydmFsKTsKKwlSVF9UUkFDRShDT01QX0hBTERNLCAiUmF0ZUJpdG1hcCAweCV4IEZpcnN0RGlmZlJhdGVUaHJlc2hvbGQgJWQgU2Vjb25kRGlmZlJhdGVUaHJlc2hvbGQgJWRcbiIsIHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfcmF0ZV9iaXRtYXAsIHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfZmlyc3RkaWZmX3JhdGV0aHJlc2hvbGQsIHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfc2Vjb25kZGlmZl9yYXRldGhyZXNob2xkKTsKKworCWlmKAlwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQgJiYKKwkJKHByaXYtPmllZWU4MDIxMS0+cEhUSW5mby0+SU9UQWN0aW9uICYgSFRfSU9UX0FDVF9DRERfRlNZTkMpKQorCXsKKwkJaWYocHJpdi0+aWVlZTgwMjExLT5iZnN5bmNfZW5hYmxlID09IDApCisJCXsKKwkJCXN3aXRjaChwcml2LT5pZWVlODAyMTEtPmZzeW5jX3N0YXRlKQorCQkJeworCQkJCWNhc2UgRGVmYXVsdF9Gc3luYzoKKwkJCQkJZG1fU3RhcnRIV0ZzeW5jKGRldik7CisJCQkJCXByaXYtPmllZWU4MDIxMS0+ZnN5bmNfc3RhdGUgPSBIV19Gc3luYzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTV19Gc3luYzoKKwkJCQkJZG1fRW5kU1dGc3luYyhkZXYpOworCQkJCQlkbV9TdGFydEhXRnN5bmMoZGV2KTsKKwkJCQkJcHJpdi0+aWVlZTgwMjExLT5mc3luY19zdGF0ZSA9IEhXX0ZzeW5jOworCQkJCQlicmVhazsKKwkJCQljYXNlIEhXX0ZzeW5jOgorCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJc3dpdGNoKHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfc3RhdGUpCisJCQl7CisJCQkJY2FzZSBEZWZhdWx0X0ZzeW5jOgorCQkJCQlkbV9TdGFydFNXRnN5bmMoZGV2KTsKKwkJCQkJcHJpdi0+aWVlZTgwMjExLT5mc3luY19zdGF0ZSA9IFNXX0ZzeW5jOworCQkJCQlicmVhazsKKwkJCQljYXNlIEhXX0ZzeW5jOgorCQkJCQlkbV9FbmRIV0ZzeW5jKGRldik7CisJCQkJCWRtX1N0YXJ0U1dGc3luYyhkZXYpOworCQkJCQlwcml2LT5pZWVlODAyMTEtPmZzeW5jX3N0YXRlID0gU1dfRnN5bmM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU1dfRnN5bmM6CisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWs7CisKKwkJCX0KKwkJfQorCQlpZihwcml2LT5mcmFtZXN5bmNNb25pdG9yKQorCQl7CisJCQlpZihyZWdfYzM4X1N0YXRlICE9IFJlZ0MzOF9Gc3luY19BUF9CQ00pCisJCQl7CS8vRm9yIGJyb2FkY29tIEFQIHdlIHdyaXRlIGRpZmZlcmVudCBkZWZhdWx0IHZhbHVlCisJCQkJI2lmZGVmIFJUTDgxOTBQCisJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IzLCAweDE1KTsKKwkJCQkjZWxzZQorCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMywgMHg5NSk7CisJCQkJI2VuZGlmCisKKwkJCQlyZWdfYzM4X1N0YXRlID0gUmVnQzM4X0ZzeW5jX0FQX0JDTTsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlzd2l0Y2gocHJpdi0+aWVlZTgwMjExLT5mc3luY19zdGF0ZSkKKwkJeworCQkJY2FzZSBIV19Gc3luYzoKKwkJCQlkbV9FbmRIV0ZzeW5jKGRldik7CisJCQkJcHJpdi0+aWVlZTgwMjExLT5mc3luY19zdGF0ZSA9IERlZmF1bHRfRnN5bmM7CisJCQkJYnJlYWs7CisJCQljYXNlIFNXX0ZzeW5jOgorCQkJCWRtX0VuZFNXRnN5bmMoZGV2KTsKKwkJCQlwcml2LT5pZWVlODAyMTEtPmZzeW5jX3N0YXRlID0gRGVmYXVsdF9Gc3luYzsKKwkJCQlicmVhazsKKwkJCWNhc2UgRGVmYXVsdF9Gc3luYzoKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKworCQlpZihwcml2LT5mcmFtZXN5bmNNb25pdG9yKQorCQl7CisJCQlpZihwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpCisJCQl7CisJCQkJaWYocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8PSBSZWdDMzhfVEgpCisJCQkJeworCQkJCQlpZihyZWdfYzM4X1N0YXRlICE9IFJlZ0MzOF9Ob25Gc3luY19PdGhlcl9BUCkKKwkJCQkJeworCQkJCQkJI2lmZGVmIFJUTDgxOTBQCisJCQkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjMsIDB4MTApOworCQkJCQkJI2Vsc2UKKwkJCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMywgMHg5MCk7CisJCQkJCQkjZW5kaWYKKworCQkJCQkJcmVnX2MzOF9TdGF0ZSA9IFJlZ0MzOF9Ob25Gc3luY19PdGhlcl9BUDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0gKFJlZ0MzOF9USCs1KSkKKwkJCQl7CisJCQkJCWlmKHJlZ19jMzhfU3RhdGUpCisJCQkJCXsKKwkJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IzLCBwcml2LT5mcmFtZXN5bmMpOworCQkJCQkJcmVnX2MzOF9TdGF0ZSA9IFJlZ0MzOF9EZWZhdWx0OworCQkJCQkJLy9EYmdQcmludCgiRnN5bmMgaXMgaWRsZSwgcnNzaT49NDAsIHdyaXRlIDB4YzM4ID0gMHgleCBcbiIsIHBIYWxEYXRhLT5mcmFtZXN5bmMpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmKHJlZ19jMzhfU3RhdGUpCisJCQkJeworCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMywgcHJpdi0+ZnJhbWVzeW5jKTsKKwkJCQkJcmVnX2MzOF9TdGF0ZSA9IFJlZ0MzOF9EZWZhdWx0OworCQkJCQkvL0RiZ1ByaW50KCJGc3luYyBpcyBpZGxlLCBub3QgY29ubmVjdGVkLCB3cml0ZSAweGMzOCA9IDB4JXggXG4iLCBwSGFsRGF0YS0+ZnJhbWVzeW5jKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYocHJpdi0+ZnJhbWVzeW5jTW9uaXRvcikKKwl7CisJCWlmKHByaXYtPnJlc2V0X2NvdW50ICE9IHJlc2V0X2NudCkKKwkJewkvL0FmdGVyIHNpbGVudCByZXNldCwgdGhlIHJlZ19jMzhfU3RhdGUgd2lsbCBiZSByZXR1cm5lZCB0byBkZWZhdWx0IHZhbHVlCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMywgcHJpdi0+ZnJhbWVzeW5jKTsKKwkJCXJlZ19jMzhfU3RhdGUgPSBSZWdDMzhfRGVmYXVsdDsKKwkJCXJlc2V0X2NudCA9IHByaXYtPnJlc2V0X2NvdW50OworCQkJLy9EYmdQcmludCgicmVnX2MzOF9TdGF0ZSA9IDAgZm9yIHNpbGVudCByZXNldC4gXG4iKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlpZihyZWdfYzM4X1N0YXRlKQorCQl7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMywgcHJpdi0+ZnJhbWVzeW5jKTsKKwkJCXJlZ19jMzhfU3RhdGUgPSBSZWdDMzhfRGVmYXVsdDsKKwkJCS8vRGJnUHJpbnQoImZyYW1lc3luYyBubyBtb25pdG9yLCB3cml0ZSAweGMzOCA9IDB4JXggXG4iLCBwSGFsRGF0YS0+ZnJhbWVzeW5jKTsKKwkJfQorCX0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjoJZG1fc2hhZG93X2luaXQoKQorICoKKyAqIE92ZXJ2aWV3OglTdG9yZSBhbGwgTklDIE1BQy9CQiByZWdpc3RlciBjb250ZW50LgorICoKKyAqIElucHV0OgkJTk9ORQorICoKKyAqIE91dHB1dDoJCU5PTkUKKyAqCisgKiBSZXR1cm46CQlOT05FCisgKgorICogUmV2aXNlZCBIaXN0b3J5OgorICoJV2hlbgkJV2hvCQlSZW1hcmsKKyAqCTA1LzI5LzIwMDgJYW15CQlDcmVhdGUgVmVyc2lvbiAwIHBvcnRpbmcgZnJvbSB3aW5kb3dzIGNvZGUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIHZvaWQgZG1fc2hhZG93X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1OAlwYWdlOworCXUxNglvZmZzZXQ7CisKKwlmb3IgKHBhZ2UgPSAwOyBwYWdlIDwgNTsgcGFnZSsrKQorCQlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IDI1Njsgb2Zmc2V0KyspCisJCXsKKwkJCWRtX3NoYWRvd1twYWdlXVtvZmZzZXRdID0gcmVhZF9uaWNfYnl0ZShkZXYsIG9mZnNldCtwYWdlKjI1Nik7CisJCQkvL0RiZ1ByaW50KCJQLSVkL08tJTAyeD0lMDJ4XHJcbiIsIHBhZ2UsIG9mZnNldCwgRE1fU2hhZG93W3BhZ2VdW29mZnNldF0pOworCQl9CisKKwlmb3IgKHBhZ2UgPSA4OyBwYWdlIDwgMTE7IHBhZ2UrKykKKwkJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCAyNTY7IG9mZnNldCsrKQorCQkJZG1fc2hhZG93W3BhZ2VdW29mZnNldF0gPSByZWFkX25pY19ieXRlKGRldiwgb2Zmc2V0K3BhZ2UqMjU2KTsKKworCWZvciAocGFnZSA9IDEyOyBwYWdlIDwgMTU7IHBhZ2UrKykKKwkJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCAyNTY7IG9mZnNldCsrKQorCQkJZG1fc2hhZG93W3BhZ2VdW29mZnNldF0gPSByZWFkX25pY19ieXRlKGRldiwgb2Zmc2V0K3BhZ2UqMjU2KTsKKworfSAgIC8qIGRtX3NoYWRvd19pbml0ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIGZ1bmN0aW9uIHByb3RvdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjoJRE1fRHluYW1pY1R4UG93ZXIoKQorICoKKyAqIE92ZXJ2aWV3OglEZXRlY3QgU2lnbmFsIHN0cmVuZ3RoIHRvIGNvbnRyb2wgVFggUmVnaXN0cnkKKwkJCVR4IFBvd2VyIENvbnRyb2wgRm9yIE5lYXIvRmFyIFJhbmdlCisgKgorICogSW5wdXQ6CQlOT05FCisgKgorICogT3V0cHV0OgkJTk9ORQorICoKKyAqIFJldHVybjoJCU5PTkUKKyAqCisgKiBSZXZpc2VkIEhpc3Rvcnk6CisgKglXaGVuCQlXaG8JCVJlbWFyaworICoJMDMvMDYvMjAwOAlKYWNrZW4JQ3JlYXRlIFZlcnNpb24gMC4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBkbV9pbml0X2R5bmFtaWNfdHhwb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCS8vSW5pdGlhbCBUWCBQb3dlciBDb250cm9sIGZvciBuZWFyL2ZhciByYW5nZSAsIGFkZCBieSBhbXkgMjAwOC8wNS8xNSwgcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KKwlwcml2LT5pZWVlODAyMTEtPmJkeW5hbWljX3R4cG93ZXJfZW5hYmxlID0gdHJ1ZTsgICAgLy9EZWZhdWx0IHRvIGVuYWJsZSBUeCBQb3dlciBDb250cm9sCisJcHJpdi0+Ykxhc3REVFBGbGFnX0hpZ2ggPSBmYWxzZTsKKwlwcml2LT5iTGFzdERUUEZsYWdfTG93ID0gZmFsc2U7CisJcHJpdi0+YkR5bmFtaWNUeEhpZ2hQb3dlciA9IGZhbHNlOworCXByaXYtPmJEeW5hbWljVHhMb3dQb3dlciA9IGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBkbV9keW5hbWljX3R4cG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdW5zaWduZWQgaW50IHR4aGlwb3dlcl90aHJlc2hob2xkPTA7CisJdW5zaWduZWQgaW50IHR4bG93cG93ZXJfdGhyZXNob2xkPTA7CisJaWYocHJpdi0+aWVlZTgwMjExLT5iZHluYW1pY190eHBvd2VyX2VuYWJsZSAhPSB0cnVlKQorCXsKKwkJcHJpdi0+YkR5bmFtaWNUeEhpZ2hQb3dlciA9IGZhbHNlOworCQlwcml2LT5iRHluYW1pY1R4TG93UG93ZXIgPSBmYWxzZTsKKwkJcmV0dXJuOworCX0KKwkvL3ByaW50aygicHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsudW5rbm93bl9jYXBfZXhpc3QgaXMgJWQgLHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJyb2FkY29tX2NhcF9leGlzdCBpcyAlZFxuIixwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay51bmtub3duX2NhcF9leGlzdCxwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5icm9hZGNvbV9jYXBfZXhpc3QpOworCWlmKChwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5hdGhlcm9zX2NhcF9leGlzdCApICYmIChwcml2LT5pZWVlODAyMTEtPm1vZGUgPT0gSUVFRV9HKSl7CisJCXR4aGlwb3dlcl90aHJlc2hob2xkID0gVFhfUE9XRVJfQVRIRVJPQVBfVEhSRVNIX0hJR0g7CisJCXR4bG93cG93ZXJfdGhyZXNob2xkID0gVFhfUE9XRVJfQVRIRVJPQVBfVEhSRVNIX0xPVzsKKwl9CisJZWxzZQorCXsKKwkJdHhoaXBvd2VyX3RocmVzaGhvbGQgPSBUWF9QT1dFUl9ORUFSX0ZJRUxEX1RIUkVTSF9ISUdIOworCQl0eGxvd3Bvd2VyX3RocmVzaG9sZCA9IFRYX1BPV0VSX05FQVJfRklFTERfVEhSRVNIX0xPVzsKKwl9CisKKy8vCXByaW50aygiPT09PT09PT4lcygpOiB0eGhpcG93ZXJfdGhyZXNoaG9sZCBpcyAlZCx0eGxvd3Bvd2VyX3RocmVzaG9sZCBpcyAlZFxuIixfX0ZVTkNUSU9OX18sdHhoaXBvd2VyX3RocmVzaGhvbGQsdHhsb3dwb3dlcl90aHJlc2hvbGQpOworCVJUX1RSQUNFKENPTVBfVFhBR0MsInByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPSAlbGQgXG4iICwgcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYik7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpCisJeworCQlpZihwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IHR4aGlwb3dlcl90aHJlc2hob2xkKQorCQl7CisJCQlwcml2LT5iRHluYW1pY1R4SGlnaFBvd2VyID0gdHJ1ZTsKKwkJCXByaXYtPmJEeW5hbWljVHhMb3dQb3dlciA9IGZhbHNlOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gaGlnaCBwb3dlciBzdGF0ZSBjaGVjaworCQkJaWYocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8IHR4bG93cG93ZXJfdGhyZXNob2xkICYmIHByaXYtPmJEeW5hbWljVHhIaWdoUG93ZXIgPT0gdHJ1ZSkKKwkJCXsKKwkJCQlwcml2LT5iRHluYW1pY1R4SGlnaFBvd2VyID0gZmFsc2U7CisJCQl9CisJCQkvLyBsb3cgcG93ZXIgc3RhdGUgY2hlY2sKKwkJCWlmKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPCAzNSkKKwkJCXsKKwkJCQlwcml2LT5iRHluYW1pY1R4TG93UG93ZXIgPSB0cnVlOworCQkJfQorCQkJZWxzZSBpZihwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IDQwKQorCQkJeworCQkJCXByaXYtPmJEeW5hbWljVHhMb3dQb3dlciA9IGZhbHNlOworCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCS8vcEhhbERhdGEtPmJUWFBvd2VyQ3RybGZvck5lYXJGYXJSYW5nZSA9ICFwSGFsRGF0YS0+YlRYUG93ZXJDdHJsZm9yTmVhckZhclJhbmdlOworCQlwcml2LT5iRHluYW1pY1R4SGlnaFBvd2VyID0gZmFsc2U7CisJCXByaXYtPmJEeW5hbWljVHhMb3dQb3dlciA9IGZhbHNlOworCX0KKworCWlmKCAocHJpdi0+YkR5bmFtaWNUeEhpZ2hQb3dlciAhPSBwcml2LT5iTGFzdERUUEZsYWdfSGlnaCApIHx8CisJCShwcml2LT5iRHluYW1pY1R4TG93UG93ZXIgIT0gcHJpdi0+Ykxhc3REVFBGbGFnX0xvdyApICkKKwl7CisJCVJUX1RSQUNFKENPTVBfVFhBR0MsIlNldFR4UG93ZXJMZXZlbDgxOTAoKSAgY2hhbm5lbCA9ICVkIFxuIiAsIHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCisjaWYgIGRlZmluZWQoUlRMODE5MFApIHx8IGRlZmluZWQoUlRMODE5MkUpCisJCVNldFR4UG93ZXJMZXZlbDgxOTAoQWRhcHRlcixwSGFsRGF0YS0+Q3VycmVudENoYW5uZWwpOworI2VuZGlmCisKKyNpZmRlZiBSVEw4MTkyVQorCQlydGw4MTkyX3BoeV9zZXRUeFBvd2VyKGRldixwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKwkJLy9wSGFsRGF0YS0+YlN0YXJ0VHhDdHJsQnlUUENORlIgPSBGQUxTRTsgICAgLy9DbGVhciB0aCBmbGFnIG9mIFNldCBUWCBQb3dlciBmcm9tIFNpdGVzdXJ2ZXkKKyNlbmRpZgorCX0KKwlwcml2LT5iTGFzdERUUEZsYWdfSGlnaCA9IHByaXYtPmJEeW5hbWljVHhIaWdoUG93ZXI7CisJcHJpdi0+Ykxhc3REVFBGbGFnX0xvdyA9IHByaXYtPmJEeW5hbWljVHhMb3dQb3dlcjsKKworfQkvKiBkbV9keW5hbWljX3R4cG93ZXIgKi8KKworLy9hZGRlZCBieSB2aXZpLCBmb3IgcmVhZCB0eCByYXRlIGFuZCByZXRyeWNvdW50CitzdGF0aWMgdm9pZCBkbV9jaGVja190eHJhdGVhbmRyZXRyeWNvdW50KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKwkvL2ZvciAxMW4gdHggcmF0ZQorLy8JcHJpdi0+c3RhdHMuQ3VycmVudFNob3dUeGF0ZSA9IHJlYWRfbmljX2J5dGUoZGV2LCBDdXJyZW50X1R4X1JhdGVfUmVnKTsKKwlpZWVlLT5zb2Z0bWFjX3N0YXRzLkN1cnJlbnRTaG93VHhhdGUgPSByZWFkX25pY19ieXRlKGRldiwgQ3VycmVudF9UeF9SYXRlX1JlZyk7CisJLy9wcmludGsoIj09PT09PT09PT09PT0+dHhfcmF0ZV9yZWc6JXhcbiIsIGllZWUtPnNvZnRtYWNfc3RhdHMuQ3VycmVudFNob3dUeGF0ZSk7CisJLy9mb3IgaW5pdGlhbCB0eCByYXRlCisvLwlwcml2LT5zdGF0cy5sYXN0X3BhY2tldF9yYXRlID0gcmVhZF9uaWNfYnl0ZShkZXYsIEluaXRpYWxfVHhfUmF0ZV9SZWcpOworCWllZWUtPnNvZnRtYWNfc3RhdHMubGFzdF9wYWNrZXRfcmF0ZSA9IHJlYWRfbmljX2J5dGUoZGV2ICxJbml0aWFsX1R4X1JhdGVfUmVnKTsKKwkvL2ZvciB0eCB0eCByZXRyeSBjb3VudAorLy8JcHJpdi0+c3RhdHMudHhyZXRyeWNvdW50ID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBUeF9SZXRyeV9Db3VudF9SZWcpOworCWllZWUtPnNvZnRtYWNfc3RhdHMudHhyZXRyeWNvdW50ID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBUeF9SZXRyeV9Db3VudF9SZWcpOworfQorCitzdGF0aWMgdm9pZCBkbV9zZW5kX3Jzc2lfdG9mdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCURDTURfVFhDTURfVAkJCXR4X2NtZDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwkvLyBJZiB3ZSB0ZXN0IGNoYXJpb3QsIHdlIHNob3VsZCBzdG9wIHRoZSBUWCBjb21tYW5kID8KKwkvLyBCZWNhdXNlIDkyRSB3aWxsIGFsd2F5cyBzaWxlbnQgcmVzZXQgd2hlbiB3ZSBzZW5kIHR4IGNvbW1hbmQuIFdlIHVzZSByZWdpc3RlcgorCS8vIDB4MWUwKGJ5dGUpIHRvIGJvdGlmeSBkcml2ZXIuCisJd3JpdGVfbmljX2J5dGUoZGV2LCBEUklWRVJfUlNTSSwgKHU4KXByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIpOworCXJldHVybjsKKwl0eF9jbWQuT3AJCT0gVFhDTURfU0VUX1JYX1JTU0k7CisJdHhfY21kLkxlbmd0aAk9IDQ7CisJdHhfY21kLlZhbHVlCQk9IHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGI7CisKKwljbXBrX21lc3NhZ2VfaGFuZGxlX3R4KGRldiwgKHU4KikmdHhfY21kLAorCQkJCQkJCQlERVNDX1BBQ0tFVF9UWVBFX0lOSVQsIHNpemVvZihEQ01EX1RYQ01EX1QpKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgZnVuY3Rpb24gcHJvdG90eXBlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9kbS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9kbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZWI1OWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2RtLmgKQEAgLTAsMCArMSwyNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJQ29weXJpZ2h0KGMpIDIwMDcsICBSZWFsVEVLIFRlY2hub2xvZ3kgSW5jLiBBbGwgUmlnaHQgUmVzZXJ2ZWQuCisgKgorICogTW9kdWxlOgkJSGFsODE5eFVzYkRNLmgJKFJUTDgxOTIgIEhlYWRlciBIIEZpbGUpCisgKgorICoKKyAqIE5vdGU6CQlGb3IgZHluYW1pYyBjb250cm9sIGRlZmluaXRpb24gY29uc3RhbnQgc3RydWN0dXJlLgorICoKKyAqCisgKiBFeHBvcnQ6CisgKgorICogQWJicmV2OgorICoKKyAqIEhpc3Rvcnk6CisgKglEYXRhCQlXaG8JCVJlbWFyaworICoJMTAvMDQvMjAwNyAgTUhDICAgIAlDcmVhdGUgaW5pdGlhbCB2ZXJzaW9uLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAvKiBDaGVjayB0byBzZWUgaWYgdGhlIGZpbGUgaGFzIGJlZW4gaW5jbHVkZWQgYWxyZWFkeS4gICovCisjaWZuZGVmCV9fUjgxOTJVRE1fSF9fCisjZGVmaW5lIF9fUjgxOTJVRE1fSF9fCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBQYXJhbWV0ZXJzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lCQlETV9ESUdfVEhSRVNIX0hJR0gJCQkJCTQwCisjZGVmaW5lCQlETV9ESUdfVEhSRVNIX0xPVwkJCQkJMzUKKworI2RlZmluZQkJRE1fRElHX0hJR0hfUFdSX1RIUkVTSF9ISUdICQk3NQorI2RlZmluZQkJRE1fRElHX0hJR0hfUFdSX1RIUkVTSF9MT1cJCTcwCisKKyNkZWZpbmUJCUJXX0FVVE9fU1dJVENIX0hJR0hfTE9XCQkJMjUKKyNkZWZpbmUJCUJXX0FVVE9fU1dJVENIX0xPV19ISUdICQkJMzAKKworI2RlZmluZQkJRE1fY2hlY2tfZnN5bmNfdGltZV9pbnRlcnZhbAkJCQk1MDAKKworCisjZGVmaW5lCQlETV9ESUdfQkFDS09GRgkJCQkxMgorI2RlZmluZQkJRE1fRElHX01BWAkJCQkJMHgzNgorI2RlZmluZQkJRE1fRElHX01JTgkJCQkJMHgxYworI2RlZmluZQkJRE1fRElHX01JTl9OZXRjb3JlCQkJMHgxMgorCisjZGVmaW5lCQlSeFBhdGhTZWxlY3Rpb25fU1NfVEhfbG93CQkzMAorI2RlZmluZQkJUnhQYXRoU2VsZWN0aW9uX2RpZmZfVEgJCQkxOAorCisjZGVmaW5lCQlSYXRlQWRhcHRpdmVUSF9IaWdoCQkJNTAKKyNkZWZpbmUJCVJhdGVBZGFwdGl2ZVRIX0xvd18yME0JCTMwCisjZGVmaW5lCQlSYXRlQWRhcHRpdmVUSF9Mb3dfNDBNCQkxMAorI2RlZmluZQkJVmVyeUxvd1JTU0kJCQkJCTE1CisjZGVmaW5lCQlDVFNUb1NlbGZUSFZhbAkJCQkJMzAKKworLy9kZWZpbmVkIGJ5IHZpdmksIGZvciB0eCBwb3dlciB0cmFjaworI2RlZmluZQkJRV9GT1JfVFhfUE9XRVJfVFJBQ0sgICAgICAgICAgICAgICAzMDAKKy8vRHluYW1pYyBUeCBQb3dlciBDb250cm9sIFRocmVzaG9sZAorI2RlZmluZQkJVFhfUE9XRVJfTkVBUl9GSUVMRF9USFJFU0hfSElHSAkJNjgKKyNkZWZpbmUJCVRYX1BPV0VSX05FQVJfRklFTERfVEhSRVNIX0xPVwkJNjIKKy8vYWRkZWQgYnkgYW15IGZvciBhdGhlcm9zIEFQCisjZGVmaW5lICAgICAgICAgVFhfUE9XRVJfQVRIRVJPQVBfVEhSRVNIX0hJR0ggICAgICAgICAgIDc4CisjZGVmaW5lIAlUWF9QT1dFUl9BVEhFUk9BUF9USFJFU0hfTE9XCQk3MgorCisvL2RlZmluZWQgYnkgdml2aSwgZm9yIHNob3dpbmcgb24gVUkKKyNkZWZpbmUgCQlDdXJyZW50X1R4X1JhdGVfUmVnICAgICAgICAgMHgxYjgKKyNkZWZpbmUgCQlJbml0aWFsX1R4X1JhdGVfUmVnICAgICAgICAgCSAgMHgxYjkKKyNkZWZpbmUgCQlUeF9SZXRyeV9Db3VudF9SZWcgICAgICAgICAweDFhYworI2RlZmluZQkJUmVnQzM4X1RICQkJCSAyMAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBQYXJhbWV0ZXJzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgc3RydWN0dXJlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAyMDA3LzEwLzA0IE1IIERlZmluZSB1cHBlciBhbmQgbG93ZXIgdGhyZXNob2xkIG9mIERJRyBlbmFibGUgb3IgZGlzYWJsZS4gKi8KK3R5cGVkZWYgc3RydWN0IF9keW5hbWljX2luaXRpYWxfZ2Fpbl90aHJlc2hvbGRfCit7CisJdTgJCWRpZ19lbmFibGVfZmxhZzsKKwl1OAkJZGlnX2FsZ29yaXRobTsKKwl1OAkJZGJnX21vZGU7CisJdTgJCWRpZ19hbGdvcml0aG1fc3dpdGNoOworCisJbG9uZwkJcnNzaV9sb3dfdGhyZXNoOworCWxvbmcJCXJzc2lfaGlnaF90aHJlc2g7CisKKwlsb25nCQlyc3NpX2hpZ2hfcG93ZXJfbG93dGhyZXNoOworCWxvbmcJCXJzc2lfaGlnaF9wb3dlcl9oaWdodGhyZXNoOworCisJdTgJCWRpZ19zdGF0ZTsKKwl1OAkJZGlnX2hpZ2hwd3Jfc3RhdGU7CisJdTgJCWN1cl9jb25uZWN0X3N0YXRlOworCXU4CQlwcmVfY29ubmVjdF9zdGF0ZTsKKworCXU4CQljdXJwZF90aHN0YXRlOworCXU4CQlwcmVwZF90aHN0YXRlOworCXU4CQljdXJjc19yYXRpb19zdGF0ZTsKKwl1OAkJcHJlY3NfcmF0aW9fc3RhdGU7CisKKwl1MzIJCXByZV9pZ192YWx1ZTsKKwl1MzIJCWN1cl9pZ192YWx1ZTsKKworCXU4CQliYWNrb2ZmX3ZhbDsKKwl1OAkJcnhfZ2Fpbl9yYW5nZV9tYXg7CisJdTgJCXJ4X2dhaW5fcmFuZ2VfbWluOworCWJvb2wJCWluaXRpYWxnYWluX2xvd2VyYm91bmRfc3RhdGU7CisKKwlsb25nCQlyc3NpX3ZhbDsKK31kaWdfdDsKKwordHlwZWRlZiBlbnVtIHRhZ19keW5hbWljX2luaXRfZ2Fpbl9zdGF0ZV9kZWZpbml0aW9uCit7CisJRE1fU1RBX0RJR19PRkYgPSAwLAorCURNX1NUQV9ESUdfT04sCisJRE1fU1RBX0RJR19NQVgKK31kbV9kaWdfc3RhX2U7CisKKworLyogMjAwNy8xMC8wOCBNSCBEZWZpbmUgUkFUUiBzdGF0ZS4gKi8KK3R5cGVkZWYgZW51bSB0YWdfZHluYW1pY19yYXRyX3N0YXRlX2RlZmluaXRpb24KK3sKKwlETV9SQVRSX1NUQV9ISUdIID0gMCwKKwlETV9SQVRSX1NUQV9NSURETEUgPSAxLAorCURNX1JBVFJfU1RBX0xPVyA9IDIsCisJRE1fUkFUUl9TVEFfTUFYCit9ZG1fcmF0cl9zdGFfZTsKKworLyogMjAwNy8xMC8xMSBNSCBEZWZpbmUgRElHIG9wZXJhdGlvbiB0eXBlLiAqLwordHlwZWRlZiBlbnVtIHRhZ19keW5hbWljX2luaXRfZ2Fpbl9vcGVyYXRpb25fdHlwZV9kZWZpbml0aW9uCit7CisJRElHX1RZUEVfVEhSRVNIX0hJR0gJPSAwLAorCURJR19UWVBFX1RIUkVTSF9MT1cJPSAxLAorCURJR19UWVBFX1RIUkVTSF9ISUdIUFdSX0hJR0gJPSAyLAorCURJR19UWVBFX1RIUkVTSF9ISUdIUFdSX0xPVwk9IDMsCisJRElHX1RZUEVfREJHX01PREUJCQkJPSA0LAorCURJR19UWVBFX1JTU0kJCQkJCQk9IDUsCisJRElHX1RZUEVfQUxHT1JJVEhNCQkJCT0gNiwKKwlESUdfVFlQRV9CQUNLT0ZGCQkJCQk9IDcsCisJRElHX1RZUEVfUFdEQl9GQUNUT1IJCQk9IDgsCisJRElHX1RZUEVfUlhfR0FJTl9NSU4JCQkJPSA5LAorCURJR19UWVBFX1JYX0dBSU5fTUFYCQkJCT0gMTAsCisJRElHX1RZUEVfRU5BQkxFIAkJPSAyMCwKKwlESUdfVFlQRV9ESVNBQkxFIAkJPSAzMCwKKwlESUdfT1BfVFlQRV9NQVgKK31kbV9kaWdfb3BfZTsKKwordHlwZWRlZiBlbnVtIHRhZ19kaWdfYWxnb3JpdGhtX2RlZmluaXRpb24KK3sKKwlESUdfQUxHT19CWV9GQUxTRV9BTEFSTSA9IDAsCisJRElHX0FMR09fQllfUlNTSQk9IDEsCisJRElHX0FMR09fTUFYCit9ZG1fZGlnX2FsZ19lOworCit0eXBlZGVmIGVudW0gdGFnX2RpZ19kYmdtb2RlX2RlZmluaXRpb24KK3sKKwlESUdfREJHX09GRiA9IDAsCisJRElHX0RCR19PTiA9IDEsCisJRElHX0RCR19NQVgKK31kbV9kaWdfZGJnX2U7CisKK3R5cGVkZWYgZW51bSB0YWdfZGlnX2Nvbm5lY3RfZGVmaW5pdGlvbgoreworCURJR19ESVNDT05ORUNUID0gMCwKKwlESUdfQ09OTkVDVCA9IDEsCisJRElHX0NPTk5FQ1RfTUFYCit9ZG1fZGlnX2Nvbm5lY3RfZTsKKwordHlwZWRlZiBlbnVtIHRhZ19kaWdfcGFja2V0ZGV0ZWN0aW9uX3RocmVzaG9sZF9kZWZpbml0aW9uCit7CisJRElHX1BEX0FUX0xPV19QT1dFUiA9IDAsCisJRElHX1BEX0FUX05PUk1BTF9QT1dFUiA9IDEsCisJRElHX1BEX0FUX0hJR0hfUE9XRVIgPSAyLAorCURJR19QRF9NQVgKK31kbV9kaWdfcGRfdGhfZTsKKwordHlwZWRlZiBlbnVtIHRhZ19kaWdfY2NrX2NzX3JhdGlvX3N0YXRlX2RlZmluaXRpb24KK3sKKwlESUdfQ1NfUkFUSU9fTE9XRVIgPSAwLAorCURJR19DU19SQVRJT19ISUdIRVIgPSAxLAorCURJR19DU19NQVgKK31kbV9kaWdfY3NfcmF0aW9fZTsKK3R5cGVkZWYgc3RydWN0IF9EeW5hbWljX1J4X1BhdGhfU2VsZWN0aW9uXworeworCXU4CQlFbmFibGU7CisJdTgJCURiZ01vZGU7CisJdTgJCWNja19tZXRob2Q7CisJdTgJCWNja19SeF9wYXRoOworCisJdTgJCVNTX1RIX2xvdzsKKwl1OAkJZGlmZl9USDsKKwl1OAkJZGlzYWJsZWRSRjsKKwl1OAkJcmVzZXJ2ZWQ7CisKKwl1OAkJcmZfcnNzaVs0XTsKKwl1OAkJcmZfZW5hYmxlX3Jzc2lfdGhbNF07CisJbG9uZwkJY2NrX3B3ZGJfc3RhWzRdOworfURSeFBhdGhTZWw7CisKK3R5cGVkZWYgZW51bSB0YWdfQ0NLX1J4X1BhdGhfTWV0aG9kX0RlZmluaXRpb24KK3sKKwlDQ0tfUnhfVmVyc2lvbl8xID0gMCwKKwlDQ0tfUnhfVmVyc2lvbl8yPSAxLAorCUNDS19SeF9WZXJzaW9uX01BWAorfURNX0NDS19SeF9QYXRoX01ldGhvZDsKKwordHlwZWRlZiBlbnVtIHRhZ19ETV9EYmdNb2RlX0RlZmluaXRpb24KK3sKKwlETV9EQkdfT0ZGID0gMCwKKwlETV9EQkdfT04gPSAxLAorCURNX0RCR19NQVgKK31ETV9EQkdfRTsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnX1R4X0NvbmZpZ19DbWRfRm9ybWF0Cit7CisJdTMyCU9wOwkJCQkJCQkJCQkvKiBDb21tYW5kIHBhY2tldCB0eXBlLiAqLworCXUzMglMZW5ndGg7CQkJCQkJCQkJLyogQ29tbWFuZCBwYWNrZXQgbGVuZ3RoLiAqLworCXUzMglWYWx1ZTsKK31EQ01EX1RYQ01EX1QsICpQRENNRF9UWENNRF9UOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgc3RydWN0dXJlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnQgZ2xvYmFsIHZhcmlhYmxlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitleHRlcm4JZGlnX3QJZG1fZGlndGFibGU7CitleHRlcm4JdTgJCWRtX3NoYWRvd1sxNl1bMjU2XTsKK2V4dGVybiBEUnhQYXRoU2VsICAgICAgRE1fUnhQYXRoU2VsVGFibGU7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydCBnbG9iYWwgdmFyaWFibGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydCBNYXJjbyBEZWZpbml0aW9uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnQgTWFyY28gRGVmaW5pdGlvbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydGVkIEZ1bmN0aW9uIHByb3RvdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitleHRlcm4gIHZvaWQgICAgaW5pdF9oYWxfZG0oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gIHZvaWQgZGVpbml0X2hhbF9kbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworZXh0ZXJuIHZvaWQgaGFsX2RtX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitleHRlcm4gIHZvaWQgICAgaW5pdF9yYXRlX2FkYXB0aXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuICB2b2lkICAgIGRtX3R4cG93ZXJfdHJhY2tpbmdjYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworZXh0ZXJuICB2b2lkICAgIGRtX3Jlc3RvcmVfZHluYW1pY19tZWNoYW5pc21fc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gIHZvaWQgICAgZG1fYmFja3VwX2R5bmFtaWNfbWVjaGFuaXNtX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuICB2b2lkICAgIGRtX2NoYW5nZV9keW5hbWljX2luaXRnYWluX3RocmVzaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkJCQl1MzIgZG1fdHlwZSwgdTMyIGRtX3ZhbHVlKTsKK2V4dGVybiAgdm9pZCAgICBkbV9mb3JjZV90eF9md19pbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdTMyIGZvcmNlX3R5cGUsIHUzMiBmb3JjZV92YWx1ZSk7CitleHRlcm4gIHZvaWQgICAgZG1faW5pdF9lZGNhX3R1cmJvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuICB2b2lkICAgIGRtX3JmX29wZXJhdGlvbl90ZXN0X2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitleHRlcm4gIHZvaWQgICAgZG1fcmZfcGF0aGNoZWNrX3dvcmtpdGVtY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK2V4dGVybiAgdm9pZCBkbV9mc3luY190aW1lcl9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpOworZXh0ZXJuCXZvaWQJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsYm9vbCAgYmluY2gxNCk7CitleHRlcm4gIHZvaWQgICAgZG1fc2hhZG93X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBkbV9pbml0aWFsaXplX3R4cG93ZXJfdHJhY2tpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0ZWQgRnVuY3Rpb24gcHJvdG90eXBlLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisjZW5kaWYJLypfX1I4MTkyVURNX0hfXyAqLworCisKKy8qIEVuZCBvZiByODE5MlVfZG0uaCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2h3LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2h3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg5YWFmNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfaHcuaApAQCAtMCwwICsxLDQxMSBAQAorLyoKKwlUaGlzIGlzIHBhcnQgb2YgcnRsODE4NyBPcGVuU291cmNlIGRyaXZlci4KKwlDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQtMjAwNSAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorCVJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZQorCW9mZmljaWFsIFJlYWx0ZWsgZHJpdmVyLgorCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24KKwlmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24uCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MKKwkyMTAwIEdQTCBkcml2ZXIuCisKKwlXZSB3YW50IHRvIHRhbmtzIHRoZSBBdXRob3JzIG9mIHRob3NlIHByb2plY3RzCisJYW5kIHRoZSBOZGlzd3JhcHBlciBwcm9qZWN0IEF1dGhvcnMuCisqLworCisvKiBNYXJpdXN6IE1hdHVzemVrIGFkZGVkIGZ1bGwgcmVnaXN0ZXJzIGRlZmluaXRpb24gd2l0aCBSZWFsdGVrJ3MgbmFtZSAqLworCisvKiB0aGlzIGZpbGUgY29udGFpbnMgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSBydGw4MTg3IE1BQyBjb250cm9sbGVyICovCisjaWZuZGVmIFI4MTkyX0hXCisjZGVmaW5lIFI4MTkyX0hXCisKK3R5cGVkZWYgZW51bSBfVkVSU0lPTl84MTl4VXsKKwlWRVJTSU9OXzgxOXhVX0EsIC8vIEEtY3V0CisJVkVSU0lPTl84MTl4VV9CLCAvLyBCLWN1dAorCVZFUlNJT05fODE5eFVfQywvLyBDLWN1dAorfVZFUlNJT05fODE5eFUsKlBWRVJTSU9OXzgxOXhVOworLy9hZGRlZCBmb3IgZGlmZmVyZW50IFJGIHR5cGUKK3R5cGVkZWYgZW51bSBfUlRfUkZfVFlQRV9ERUYKK3sKKwlSRl8xVDJSID0gMCwKKwlSRl8yVDRSLAorCisJUkZfODE5WF9NQVhfVFlQRQorfVJUX1JGX1RZUEVfREVGOworCisKK3R5cGVkZWYgZW51bSBfQmFzZUJhbmRfQ29uZmlnX1R5cGV7CisJQmFzZUJhbmRfQ29uZmlnX1BIWV9SRUcgPSAwLAkJCS8vUmFkaW8gUGF0aCBBCisJQmFzZUJhbmRfQ29uZmlnX0FHQ19UQUIgPSAxLAkJCS8vUmFkaW8gUGF0aCBCCit9QmFzZUJhbmRfQ29uZmlnX1R5cGUsICpQQmFzZUJhbmRfQ29uZmlnX1R5cGU7CisjZGVmaW5lCVJUTDgxODdfUkVRVF9SRUFECTB4YzAKKyNkZWZpbmUJUlRMODE4N19SRVFUX1dSSVRFCTB4NDAKKyNkZWZpbmUJUlRMODE4N19SRVFfR0VUX1JFR1MJMHgwNQorI2RlZmluZQlSVEw4MTg3X1JFUV9TRVRfUkVHUwkweDA1CisKKyNkZWZpbmUgTUFYX1RYX1VSQiA1CisjZGVmaW5lIE1BWF9SWF9VUkIgMTYKKworI2RlZmluZSBSODE4MF9NQVhfUkVUUlkgMjU1CisvLyNkZWZpbmUgTUFYX1JYX05PUk1BTF9VUkIgMworLy8jZGVmaW5lIE1BWF9SWF9DT01NQU5EX1VSQiAyCisjZGVmaW5lIFJYX1VSQl9TSVpFIDkxMDAKKworI2RlZmluZSBCQl9BTlRBVFRFTl9DSEFOMTQJMHgwYworI2RlZmluZSBCQl9BTlRFTk5BX0IgMHg0MAorCisjZGVmaW5lIEJCX0hPU1RfQkFORyAoMTw8MzApCisjZGVmaW5lIEJCX0hPU1RfQkFOR19FTiAoMTw8MikKKyNkZWZpbmUgQkJfSE9TVF9CQU5HX0NMSyAoMTw8MSkKKyNkZWZpbmUgQkJfSE9TVF9CQU5HX1JXICgxPDwzKQorI2RlZmluZSBCQl9IT1NUX0JBTkdfREFUQQkgMQorCisvLyNpZiAoUlRMODE5WF9GUEdBX1ZFUiAmIFJUTDgxOVhfRlBHQV9WSVZJXzA3MDkyMCkKKyNkZWZpbmUgQUZSCQkJMHgwMTAKKyNkZWZpbmUgQUZSX0NhcmRCRW4JCSgxPDwwKQorI2RlZmluZSBBRlJfQ0xLUlVOX1NFTAkJKDE8PDEpCisjZGVmaW5lIEFGUl9GdW5jUmVnRW4JCSgxPDwyKQorI2RlZmluZSBSVEw4MTkwX0VFUFJPTV9JRAkweDgxMjkKKyNkZWZpbmUgRUVQUk9NX1ZJRAkJMHgwMgorI2RlZmluZSBFRVBST01fUElECQkweDA0CisjZGVmaW5lIEVFUFJPTV9OT0RFX0FERFJFU1NfQllURV8wCTB4MEMKKworI2RlZmluZSBFRVBST01fVHhQb3dlckRpZmYJMHgxRgorI2RlZmluZSBFRVBST01fVGhlcm1hbE1ldGVyCTB4MjAKKyNkZWZpbmUgRUVQUk9NX1B3RGlmZgkJMHgyMQkvLzB4MjEKKyNkZWZpbmUgRUVQUk9NX0NyeXN0YWxDYXAJMHgyMgkvLzB4MjIKKworI2RlZmluZSBFRVBST01fVHhQd0luZGV4X0NDSwkweDIzCS8vMHgyMworI2RlZmluZSBFRVBST01fVHhQd0luZGV4X09GRE1fMjRHCTB4MjQJLy8weDI0fjB4MjYKKyNkZWZpbmUgRUVQUk9NX1R4UHdJbmRleF9DQ0tfVjEJCTB4MjkJLy8weDI5fjB4MkIKKyNkZWZpbmUgRUVQUk9NX1R4UHdJbmRleF9PRkRNXzI0R19WMQkweDJDCS8vMHgyQ34weDJFCisjZGVmaW5lIEVFUFJPTV9UeFB3SW5kZXhfVmVyCQkweDI3CS8vMHgyNworCisjZGVmaW5lIEVFUFJPTV9EZWZhdWx0X1R4UG93ZXJEaWZmCQkweDAKKyNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfVGhlcm1hbE1ldGVyCQkweDcKKyNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfUHdEaWZmCQkJMHg0CisjZGVmaW5lIEVFUFJPTV9EZWZhdWx0X0NyeXN0YWxDYXAJCTB4NQorI2RlZmluZSBFRVBST01fRGVmYXVsdF9UeFBvd2VyCQkJMHgxMDEwCisjZGVmaW5lIEVFUFJPTV9DdXN0b21lcl9JRAkJCTB4N0IJLy8weDdCOkN1c3RvbWVySUQKKyNkZWZpbmUgRUVQUk9NX0NoYW5uZWxQbGFuCQkJMHgxNgkvLzB4N0MKKyNkZWZpbmUgRUVQUk9NX0lDX1ZFUgkJCQkweDdkCS8vMHg3RAorI2RlZmluZSBFRVBST01fQ1JDCQkJCTB4N2UJLy8weDdFfjB4N0YKKworI2RlZmluZSBFRVBST01fQ0lEX0RFRkFVTFQJCQkweDAKKyNkZWZpbmUgRUVQUk9NX0NJRF9DQU1FTwkJCQkweDEKKyNkZWZpbmUgRUVQUk9NX0NJRF9SVU5UT1AJCQkJMHgyCisjZGVmaW5lIEVFUFJPTV9DSURfU2VuYW8JCQkJMHgzCisjZGVmaW5lIEVFUFJPTV9DSURfVE9TSElCQQkJCQkweDQJLy8gVG9zaGliYSBzZXR0aW5nLCBNZXJnZSBieSBKYWNrZW4sIDIwMDgvMDEvMzEKKyNkZWZpbmUgRUVQUk9NX0NJRF9OZXRDb3JlCQkJCTB4NQorI2RlZmluZSBFRVBST01fQ0lEX05ldHRyb25peAkJCTB4NgorI2RlZmluZSBFRVBST01fQ0lEX1Byb25ldAkJCQkweDcKKyNkZWZpbmUgRUVQUk9NX0NJRF9ETElOSwkJCQkweDgKKworI2RlZmluZSBBQ19QQVJBTV9UWE9QX0xJTUlUX09GRlNFVAkxNgorI2RlZmluZSBBQ19QQVJBTV9FQ1dfTUFYX09GRlNFVAkJMTIKKyNkZWZpbmUgQUNfUEFSQU1fRUNXX01JTl9PRkZTRVQJCTgKKyNkZWZpbmUgQUNfUEFSQU1fQUlGU19PRkZTRVQJCTAKKworLy8jZW5kaWYKK2VudW0gX1JUTDgxOTJVc2JfSFcgeworCisJUENJRgkJCT0gMHgwMDksIC8vIFBDSSBGdW5jdGlvbiBSZWdpc3RlciAweDAwMDlofjB4MDAwYmgKKyNkZWZpbmUJQkJfR0xPQkFMX1JFU0VUX0JJVAkweDEKKwlCQl9HTE9CQUxfUkVTRVQJCT0gMHgwMjAsIC8vIEJhc2ViYW5kR2xvYmFsIFJlc2V0IFJlZ2lzdGVyCisJQlNTSURSCQkJPSAweDAyRSwgLy8gQlNTSUQgUmVnaXN0ZXIKKwlDTURSCQkJPSAweDAzNywgLy8gQ29tbWFuZCByZWdpc3RlcgorI2RlZmluZSBDUl9SU1QJCQkweDEwCisjZGVmaW5lIENSX1JFCQkJMHgwOAorI2RlZmluZSBDUl9URQkJCTB4MDQKKyNkZWZpbmUgQ1JfTXVsUlcJCTB4MDEKKwlTSUZTCQkJPSAweDAzRSwgLy8gU0lGUyByZWdpc3RlcgorCVRDUgkJCT0gMHgwNDAsIC8vIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKworI2RlZmluZSBUQ1JfTVhETUFfMjA0OCAJCTcKKyNkZWZpbmUgVENSX0xSTF9PRkZTRVQJCTAKKyNkZWZpbmUgVENSX1NSTF9PRkZTRVQJCTgKKyNkZWZpbmUgVENSX01YRE1BX09GRlNFVAkyMQorI2RlZmluZSBUQ1JfU0FUCQkJQklUMjQJCS8vIEVuYWJsZSBSYXRlIGRlcGVkZW50IGFjayB0aW1lb3V0IHRpbWVyCisJUkNSCQkJPSAweDA0NCwgLy8gUmVjZWl2ZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCisjZGVmaW5lIE1BQ19GSUxURVJfTUFTSyAoKDE8PDApIHwgKDE8PDEpIHwgKDE8PDIpIHwgKDE8PDMpIHwgKDE8PDUpIHwgXAorCQkoMTw8MTIpIHwgKDE8PDE4KSB8ICgxPDwxOSkgfCAoMTw8MjApIHwgKDE8PDIxKSB8ICgxPDwyMikgfCAoMTw8MjMpKQorI2RlZmluZSBSWF9GSUZPX1RIUkVTSE9MRF9NQVNLICgoMTw8MTMpIHwgKDE8PDE0KSB8ICgxPDwxNSkpCisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNIT0xEX1NISUZUIDEzCisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNIT0xEXzEyOCAzCisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNIT0xEXzI1NiA0CisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNIT0xEXzUxMiA1CisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNIT0xEXzEwMjQgNgorI2RlZmluZSBSWF9GSUZPX1RIUkVTSE9MRF9OT05FIDcKKyNkZWZpbmUgTUFYX1JYX0RNQV9NQVNLICgoMTw8OCkgfCAoMTw8OSkgfCAoMTw8MTApKQorI2RlZmluZSBSQ1JfTVhETUFfT0ZGU0VUCTgKKyNkZWZpbmUgUkNSX0ZJRk9fT0ZGU0VUCQkxMworI2RlZmluZSBSQ1JfT05MWUVSTFBLVAkJQklUMzEJCQkvLyBFYXJseSBSZWNlaXZpbmcgYmFzZWQgb24gUGFja2V0IFNpemUuCisjZGVmaW5lIFJDUl9FTkNTMgkJQklUMzAJCQkvLyBFbmFibGUgQ2FycmllciBTZW5zZSBEZXRlY3Rpb24gTWV0aG9kIDIKKyNkZWZpbmUgUkNSX0VOQ1MxCQlCSVQyOQkJCS8vIEVuYWJsZSBDYXJyaWVyIFNlbnNlIERldGVjdGlvbiBNZXRob2QgMQorI2RlZmluZSBSQ1JfRU5NQklECQlCSVQyNwkJCS8vIEVuYWJsZSBNdWx0aXBsZSBCc3NJZC4KKyNkZWZpbmUgUkNSX0FDS1RYQlcJCShCSVQyNHxCSVQyNSkJCS8vIFRYQlcgU2V0dGluZyBvZiBBQ0sgZnJhbWVzCisjZGVmaW5lIFJDUl9DQlNTSUQJCUJJVDIzCQkJLy8gQWNjZXB0IEJTU0lEIG1hdGNoIHBhY2tldAorI2RlZmluZSBSQ1JfQVBXUk1HVAkJQklUMjIJCQkvLyBBY2NlcHQgcG93ZXIgbWFuYWdlbWVudCBwYWNrZXQKKyNkZWZpbmUJUkNSX0FERDMJCUJJVDIxCQkJLy8gQWNjZXB0IGFkZHJlc3MgMyBtYXRjaCBwYWNrZXQKKyNkZWZpbmUgUkNSX0FNRgkJCUJJVDIwCQkJLy8gQWNjZXB0IG1hbmFnZW1lbnQgdHlwZSBmcmFtZQorI2RlZmluZSBSQ1JfQUNGCQkJQklUMTkJCQkvLyBBY2NlcHQgY29udHJvbCB0eXBlIGZyYW1lCisjZGVmaW5lIFJDUl9BREYJCQlCSVQxOAkJCS8vIEFjY2VwdCBkYXRhIHR5cGUgZnJhbWUKKyNkZWZpbmUgUkNSX1JYRlRICQlCSVQxMwkJCS8vIFJ4IEZJRk8gVGhyZXNob2xkCisjZGVmaW5lIFJDUl9BSUNWCQlCSVQxMgkJCS8vIEFjY2VwdCBJQ1YgZXJyb3IgcGFja2V0CisjZGVmaW5lCVJDUl9BQ1JDMzIJCUJJVDUJCQkvLyBBY2NlcHQgQ1JDMzIgZXJyb3IgcGFja2V0CisjZGVmaW5lCVJDUl9BQgkJCUJJVDMJCQkvLyBBY2NlcHQgYnJvYWRjYXN0IHBhY2tldAorI2RlZmluZQlSQ1JfQU0JCQlCSVQyCQkJLy8gQWNjZXB0IG11bHRpY2FzdCBwYWNrZXQKKyNkZWZpbmUJUkNSX0FQTQkJCUJJVDEJCQkvLyBBY2NlcHQgcGh5c2ljYWwgbWF0Y2ggcGFja2V0CisjZGVmaW5lCVJDUl9BQVAJCQlCSVQwCQkJLy8gQWNjZXB0IGFsbCB1bmljYXN0IHBhY2tldAorCVNMT1RfVElNRQkJPSAweDA0OSwgLy8gU2xvdCBUaW1lIFJlZ2lzdGVyCisJQUNLX1RJTUVPVVQJCT0gMHgwNGMsIC8vIEFjayBUaW1lb3V0IFJlZ2lzdGVyCisJUElGU19USU1FCQk9IDB4MDRkLCAvLyBQSUZTIHRpbWUKKwlVU1RJTUUJCQk9IDB4MDRlLCAvLyBNaWNyb3NlY29uZCBUdW5pbmcgUmVnaXN0ZXIsIFNldHMgdGhlIG1pY3Jvc2Vjb25kIHRpbWUgdW5pdCB1c2VkIGJ5IE1BQyBjbG9jay4KKwlFRENBUEFSQV9CRQkJPSAweDA1MCwgLy8gRURDQSBQYXJhbWV0ZXIgb2YgQUMgQkUKKwlFRENBUEFSQV9CSwkJPSAweDA1NCwgLy8gRURDQSBQYXJhbWV0ZXIgb2YgQUMgQksKKwlFRENBUEFSQV9WTwkJPSAweDA1OCwgLy8gRURDQSBQYXJhbWV0ZXIgb2YgQUMgVk8KKwlFRENBUEFSQV9WSQkJPSAweDA1QywgLy8gRURDQSBQYXJhbWV0ZXIgb2YgQUMgVkkKKwlSRlBDCQkJPSAweDA1RiwgLy8gUnggRklGTyBQYWNrZXQgQ291bnQKKwlDV1JSCQkJPSAweDA2MCwgLy8gQ29udGVudGlvbiBXaW5kb3cgUmVwb3J0IFJlZ2lzdGVyCisJQkNOX1RDRkcJCT0gMHgwNjIsIC8vIEJlYWNvbiBUaW1lIENvbmZpZ3VyYXRpb24KKyNkZWZpbmUgQkNOX1RDRkdfQ1dfU0hJRlQJCTgKKyNkZWZpbmUgQkNOX1RDRkdfSUZTCQkJMAorCUJDTl9JTlRFUlZBTAkJPSAweDA3MCwgLy8gQmVhY29uIEludGVydmFsIChUVSkKKwlBVElNV05ECQkJPSAweDA3MiwgLy8gQVRJTSBXaW5kb3cgU2l6ZSAoVFUpCisJQkNOX0RSVl9FQVJMWV9JTlQJPSAweDA3NCwgLy8gRHJpdmVyIEVhcmx5IEludGVycnVwdCBUaW1lIChUVSkuIFRpbWUgdG8gc2VuZCBpbnRlcnJ1cHQgdG8gbm90aWZ5IHRvIGNoYW5nZSBiZWFjb24gY29udGVudCBiZWZvcmUgVEJUVAorCUJDTl9ETUFUSU1FCQk9IDB4MDc2LCAvLyBCZWFjb24gRE1BIGFuZCBBVElNIGludGVycnVwdCB0aW1lIChVUykuIEluZGljYXRlcyB0aGUgdGltZSBiZWZvcmUgVEJUVCB0byBwZXJmb3JtIGJlYWNvbiBxdWV1ZSBETUEKKwlCQ05fRVJSX1RIUkVTSAkJPSAweDA3OCwgLy8gQmVhY29uIEVycm9yIFRocmVzaG9sZAorCVJXQ0FNCQkJPSAweDBBMCwgLy9JTiA4MTkwIERhdGEgU2hlZXQgaXMgY2FsbGVkIENBTWNtZAorCVdDQU1JCQkJPSAweDBBNCwgLy8gU29mdHdhcmUgd3JpdGUgQ0FNIGlucHV0IGNvbnRlbnQKKwlSQ0FNTwkJCT0gMHgwQTgsIC8vIFNvZnR3YXJlIHJlYWQvd3JpdGUgQ0FNIGNvbmZpZworCVNFQ1IJCQk9IDB4MEIwLCAvL1NlY3VyaXR5IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKyNkZWZpbmUJU0NSX1R4VXNlREsJCUJJVDAJCQkvL0ZvcmNlIFR4IFVzZSBEZWZhdWx0IEtleQorI2RlZmluZSBTQ1JfUnhVc2VESwkJQklUMQkJCS8vRm9yY2UgUnggVXNlIERlZmF1bHQgS2V5CisjZGVmaW5lIFNDUl9UeEVuY0VuYWJsZQkJQklUMgkJCS8vRW5hYmxlIFR4IEVuY3J5cHRpb24KKyNkZWZpbmUgU0NSX1J4RGVjRW5hYmxlCQlCSVQzCQkJLy9FbmFibGUgUnggRGVjcnlwdGlvbgorI2RlZmluZSBTQ1JfU0tCeUEyCQlCSVQ0CQkJLy9TZWFyY2gga0VZIEJZIEEyCisjZGVmaW5lIFNDUl9Ob1NLTUMJCUJJVDUJCQkvL05vIEtleSBTZWFyY2ggZm9yIE11bHRpY2FzdAorI2RlZmluZSBTQ1JfVXNlREsJCTB4MDEKKyNkZWZpbmUgU0NSX1R4U2VjRW5hYmxlCQkweDAyCisjZGVmaW5lIFNDUl9SeFNlY0VuYWJsZQkJMHgwNAorCVRQUG9sbAkJCT0gMHgwZmQsIC8vIFRyYW5zbWl0IHByaW9yaXR5IHBvbGxpbmcgcmVnaXN0ZXIKKwlQU1IJCQk9IDB4MGZmLCAvLyBQYWdlIFNlbGVjdCBSZWdpc3RlcgorI2RlZmluZSBDUFVfQ0NLX0xPT1BCQUNLCTB4MDAwMzAwMDAKKyNkZWZpbmUgQ1BVX0dFTl9TWVNURU1fUkVTRVQJMHgwMDAwMDAwMQorI2RlZmluZSBDUFVfR0VOX0ZJUk1XQVJFX1JFU0VUCTB4MDAwMDAwMDgKKyNkZWZpbmUgQ1BVX0dFTl9CT09UX1JEWQkweDAwMDAwMDEwCisjZGVmaW5lIENQVV9HRU5fRklSTV9SRFkJMHgwMDAwMDAyMAorI2RlZmluZSBDUFVfR0VOX1BVVF9DT0RFX09LCTB4MDAwMDAwODAKKyNkZWZpbmUgQ1BVX0dFTl9CQl9SU1QJCTB4MDAwMDAxMDAKKyNkZWZpbmUgQ1BVX0dFTl9QV1JfU1RCX0NQVQkweDAwMDAwMDA0CisjZGVmaW5lIENQVV9HRU5fTk9fTE9PUEJBQ0tfTVNLCTB4RkZGOEZGRkYJCS8vIFNldCBiaXQxOCwxNywxNiB0byAwLiBTZXQgYml0MTkKKyNkZWZpbmUgQ1BVX0dFTl9OT19MT09QQkFDS19TRVQJMHgwMDA4MDAwMAkJLy8gU2V0IEJJVDE5IHRvIDEKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICA4MTkwIENQVSBHZW5lcmFsIFJlZ2lzdGVyCQkob2Zmc2V0IDB4MTAwLCA0IGJ5dGUpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUJQ1BVX0NDS19MT09QQkFDSwkweDAwMDMwMDAwCisjZGVmaW5lCUNQVV9HRU5fU1lTVEVNX1JFU0VUCTB4MDAwMDAwMDEKKyNkZWZpbmUJQ1BVX0dFTl9GSVJNV0FSRV9SRVNFVAkweDAwMDAwMDA4CisjZGVmaW5lCUNQVV9HRU5fQk9PVF9SRFkJMHgwMDAwMDAxMAorI2RlZmluZQlDUFVfR0VOX0ZJUk1fUkRZCTB4MDAwMDAwMjAKKyNkZWZpbmUJQ1BVX0dFTl9QVVRfQ09ERV9PSwkweDAwMDAwMDgwCisjZGVmaW5lCUNQVV9HRU5fQkJfUlNUCQkweDAwMDAwMTAwCisjZGVmaW5lCUNQVV9HRU5fUFdSX1NUQl9DUFUJMHgwMDAwMDAwNAorI2RlZmluZSBDUFVfR0VOX05PX0xPT1BCQUNLX01TSwkweEZGRjhGRkZGIC8vIFNldCBiaXQxOCwxNywxNiB0byAwLiBTZXQgYml0MTkKKyNkZWZpbmUgQ1BVX0dFTl9OT19MT09QQkFDS19TRVQJMHgwMDA4MDAwMCAvLyBTZXQgQklUMTkgdG8gMQorCUNQVV9HRU4JCQk9IDB4MTAwLCAvLyBDUFUgUmVzZXQgUmVnaXN0ZXIKKwlMRUQxQ2ZnCQkJPQkJMHgxNTQsLy8gTEVEMSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCisJTEVEMENmZwkJCT0JCTB4MTU1LC8vIExFRDAgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorCisJQWNtQXZnCQkJPSAweDE3MCwgLy8gQUNNIEF2ZXJhZ2UgUGVyaW9kIFJlZ2lzdGVyCisJQWNtSHdDdHJsCQk9IDB4MTcxLCAvLyBBQ00gSGFyZHdhcmUgQ29udHJvbCBSZWdpc3RlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy8vCisvLy8vICAgICAgIDgxOTAgQWNtSHdDdHJsIGJpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2Zmc2V0IDB4MTcxLCAxIGJ5dGUpCisvLy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKyNkZWZpbmUgQWNtSHdfSHdFbiAgICAgICAgICAgICAgQklUMAorI2RlZmluZSBBY21Id19CZXFFbiAgICAgICAgICAgICBCSVQxCisjZGVmaW5lIEFjbUh3X1ZpcUVuICAgICAgICAgICAgIEJJVDIKKyNkZWZpbmUgQWNtSHdfVm9xRW4gICAgICAgICAgICAgQklUMworI2RlZmluZSBBY21Id19CZXFTdGF0dXMgICAgICAgICBCSVQ0CisjZGVmaW5lIEFjbUh3X1ZpcVN0YXR1cyAgICAgICAgIEJJVDUKKyNkZWZpbmUgQWNtSHdfVm9xU3RhdHVzICAgICAgICAgQklUNgorCisJQWNtRndDdHJsCQk9IDB4MTcyLCAvLyBBQ00gRmlybXdhcmUgQ29udHJvbCBSZWdpc3RlcgorCUFFU18xMU5fRklYCQk9IDB4MTczLAorCVZPQWRtVGltZQkJPSAweDE3NCwgLy8gVk8gUXVldWUgQWRtaXR0ZWQgVGltZSBSZWdpc3RlcgorCVZJQWRtVGltZQkJPSAweDE3OCwgLy8gVkkgUXVldWUgQWRtaXR0ZWQgVGltZSBSZWdpc3RlcgorCUJFQWRtVGltZQkJPSAweDE3QywgLy8gQkUgUXVldWUgQWRtaXR0ZWQgVGltZSBSZWdpc3RlcgorCVJRUE4xCQkJPSAweDE4MCwgLy8gUmVzZXJ2ZWQgUXVldWUgUGFnZSBOdW1iZXIgLCBWbyBWaSwgQmUsIEJrCisJUlFQTjIJCQk9IDB4MTg0LCAvLyBSZXNlcnZlZCBRdWV1ZSBQYWdlIE51bWJlciwgSENDQSwgQ21kLCBNZ250LCBIaWdoCisJUlFQTjMJCQk9IDB4MTg4LCAvLyBSZXNlcnZlZCBRdWV1ZSBQYWdlIE51bWJlciwgQmNuLCBQdWJsaWMsCisvLwlRUFJSCQkJPSAweDFFMCwgLy8gUXVldWUgUGFnZSBSZXBvcnQgcGVyIFRJRAorCVFQTlIJCQk9IDB4MUQwLCAvLzB4MUYwLCAvLyBRdWV1ZSBQYWNrZXQgTnVtYmVyIHJlcG9ydCBwZXIgVElECisJQlFEQQkJCT0gMHgyMDAsIC8vIEJlYWNvbiBRdWV1ZSBEZXNjcmlwdG9yIEFkZHJlc3MKKwlIUURBCQkJPSAweDIwNCwgLy8gSGlnaCBQcmlvcml0eSBRdWV1ZSBEZXNjcmlwdG9yIEFkZHJlc3MKKwlDUURBCQkJPSAweDIwOCwgLy8gQ29tbWFuZCBRdWV1ZSBEZXNjcmlwdG9yIEFkZHJlc3MKKwlNUURBCQkJPSAweDIwQywgLy8gTWFuYWdlbWVudCBRdWV1ZSBEZXNjcmlwdG9yIEFkZHJlc3MKKwlIQ0NBUURBCQkJPSAweDIxMCwgLy8gSENDQSBRdWV1ZSBEZXNjcmlwdG9yIEFkZHJlc3MKKwlWT1FEQQkJCT0gMHgyMTQsIC8vIFZPIFF1ZXVlIERlc2NyaXB0b3IgQWRkcmVzcworCVZJUURBCQkJPSAweDIxOCwgLy8gVkkgUXVldWUgRGVzY3JpcHRvciBBZGRyZXNzCisJQkVRREEJCQk9IDB4MjFDLCAvLyBCRSBRdWV1ZSBEZXNjcmlwdG9yIEFkZHJlc3MKKwlCS1FEQQkJCT0gMHgyMjAsIC8vIEJLIFF1ZXVlIERlc2NyaXB0b3IgQWRkcmVzcworCVJDUURBCQkJPSAweDIyNCwgLy8gUmVjZWl2ZSBjb21tYW5kIFF1ZXVlIERlc2NyaXB0b3IgQWRkcmVzcworCVJEUURBCQkJPSAweDIyOCwgLy8gUmVjZWl2ZSBRdWV1ZSBEZXNjcmlwdG9yIFN0YXJ0IEFkZHJlc3MKKworCU1BUjAJCQk9IDB4MjQwLCAvLyBNdWx0aWNhc3QgZmlsdGVyLgorCU1BUjQJCQk9IDB4MjQ0LAorCisJQ0NYX1BFUklPRAkJPSAweDI1MCwgLy8gQ0NYIE1lYXN1cmVtZW50IFBlcmlvZCBSZWdpc3RlciwgaW4gdW5pdCBvZiBUVS4KKwlDTE1fUkVTVUxUCQk9IDB4MjUxLCAvLyBDQ0EgQnVzeSBmcmFjdGlvbiByZWdpc3Rlci4KKwlOSE1fUEVSSU9ECQk9IDB4MjUyLCAvLyBOSE0gTWVhc3VyZW1lbnQgUGVyaW9kIHJlZ2lzdGVyLCBpbiB1bml0IG9mIFRVLgorCisJTkhNX1RIUkVTSE9MRDAJCT0gMHgyNTMsIC8vIE5vaXNlIEhpc3RvZ3JhbSBNZWFzaG9yZW1lbnQwLgorCU5ITV9USFJFU0hPTEQxCQk9IDB4MjU0LCAvLyBOb2lzZSBIaXN0b2dyYW0gTWVhc2hvcmVtZW50MS4KKwlOSE1fVEhSRVNIT0xEMgkJPSAweDI1NSwgLy8gTm9pc2UgSGlzdG9ncmFtIE1lYXNob3JlbWVudDIuCisJTkhNX1RIUkVTSE9MRDMJCT0gMHgyNTYsIC8vIE5vaXNlIEhpc3RvZ3JhbSBNZWFzaG9yZW1lbnQzLgorCU5ITV9USFJFU0hPTEQ0CQk9IDB4MjU3LCAvLyBOb2lzZSBIaXN0b2dyYW0gTWVhc2hvcmVtZW50NC4KKwlOSE1fVEhSRVNIT0xENQkJPSAweDI1OCwgLy8gTm9pc2UgSGlzdG9ncmFtIE1lYXNob3JlbWVudDUuCisJTkhNX1RIUkVTSE9MRDYJCT0gMHgyNTksIC8vIE5vaXNlIEhpc3RvZ3JhbSBNZWFzaG9yZW1lbnQ2CisKKwlNQ1RSTAkJCT0gMHgyNUEsIC8vIE1lYXN1cmVtZW50IENvbnRyb2wKKworCU5ITV9SUElfQ09VTlRFUjAJPSAweDI2NCwgLy8gTm9pc2UgSGlzdG9ncmFtIFJQSSBjb3VudGVyMCwgdGhlIGZyYWN0aW9uIG9mIHNpZ25hbCBzdHJlbmd0aCA8IE5ITV9USFJFU0hPTEQwLgorCU5ITV9SUElfQ09VTlRFUjEJPSAweDI2NSwgLy8gTm9pc2UgSGlzdG9ncmFtIFJQSSBjb3VudGVyMSwgdGhlIGZyYWN0aW9uIG9mIHNpZ25hbCBzdHJlbmd0aCBpbiAoTkhNX1RIUkVTSE9MRDAsIE5ITV9USFJFU0hPTEQxXS4KKwlOSE1fUlBJX0NPVU5URVIyCT0gMHgyNjYsIC8vIE5vaXNlIEhpc3RvZ3JhbSBSUEkgY291bnRlcjIsIHRoZSBmcmFjdGlvbiBvZiBzaWduYWwgc3RyZW5ndGggaW4gKE5ITV9USFJFU0hPTEQxLCBOSE1fVEhSRVNIT0xEMl0uCisJTkhNX1JQSV9DT1VOVEVSMwk9IDB4MjY3LCAvLyBOb2lzZSBIaXN0b2dyYW0gUlBJIGNvdW50ZXIzLCB0aGUgZnJhY3Rpb24gb2Ygc2lnbmFsIHN0cmVuZ3RoIGluIChOSE1fVEhSRVNIT0xEMiwgTkhNX1RIUkVTSE9MRDNdLgorCU5ITV9SUElfQ09VTlRFUjQJPSAweDI2OCwgLy8gTm9pc2UgSGlzdG9ncmFtIFJQSSBjb3VudGVyNCwgdGhlIGZyYWN0aW9uIG9mIHNpZ25hbCBzdHJlbmd0aCBpbiAoTkhNX1RIUkVTSE9MRDMsIE5ITV9USFJFU0hPTEQ0XS4KKwlOSE1fUlBJX0NPVU5URVI1CT0gMHgyNjksIC8vIE5vaXNlIEhpc3RvZ3JhbSBSUEkgY291bnRlcjUsIHRoZSBmcmFjdGlvbiBvZiBzaWduYWwgc3RyZW5ndGggaW4gKE5ITV9USFJFU0hPTEQ0LCBOSE1fVEhSRVNIT0xENV0uCisJTkhNX1JQSV9DT1VOVEVSNgk9IDB4MjZBLCAvLyBOb2lzZSBIaXN0b2dyYW0gUlBJIGNvdW50ZXI2LCB0aGUgZnJhY3Rpb24gb2Ygc2lnbmFsIHN0cmVuZ3RoIGluIChOSE1fVEhSRVNIT0xENSwgTkhNX1RIUkVTSE9MRDZdLgorCU5ITV9SUElfQ09VTlRFUjcJPSAweDI2QiwgLy8gTm9pc2UgSGlzdG9ncmFtIFJQSSBjb3VudGVyNywgdGhlIGZyYWN0aW9uIG9mIHNpZ25hbCBzdHJlbmd0aCBpbiAoTkhNX1RIUkVTSE9MRDYsIE5ITV9USFJFU0hPTEQ3XS4KKyNkZWZpbmUJQldfT1BNT0RFXzExSgkJCUJJVDAKKyNkZWZpbmUJQldfT1BNT0RFXzVHCQkJQklUMQorI2RlZmluZQlCV19PUE1PREVfMjBNSFoJCQlCSVQyCisJQldfT1BNT0RFCQk9IDB4MzAwLCAvLyBCYW5kd2lkdGggb3BlcmF0aW9uIG1vZGUKKwlNU1IJCQk9IDB4MzAzLCAvLyBNZWRpYSBTdGF0dXMgcmVnaXN0ZXIKKyNkZWZpbmUgTVNSX0xJTktfTUFTSyAgICAgICgoMTw8MCl8KDE8PDEpKQorI2RlZmluZSBNU1JfTElOS19NQU5BR0VEICAgMgorI2RlZmluZSBNU1JfTElOS19OT05FICAgICAgMAorI2RlZmluZSBNU1JfTElOS19TSElGVCAgICAgMAorI2RlZmluZSBNU1JfTElOS19BREhPQyAgICAgMQorI2RlZmluZSBNU1JfTElOS19NQVNURVIgICAgMworI2RlZmluZSBNU1JfTElOS19FTkVEQ0EJICAgKDE8PDQpCisJUkVUUllfTElNSVQJCT0gMHgzMDQsIC8vIFJldHJ5IExpbWl0IFsxNTo4XS1zaG9ydCwgWzc6MF0tbG9uZworI2RlZmluZSBSRVRSWV9MSU1JVF9TSE9SVF9TSElGVCA4CisjZGVmaW5lIFJFVFJZX0xJTUlUX0xPTkdfU0hJRlQgMAorCVRTRlIJCQk9IDB4MzA4LAorCVJSU1IJCQk9IDB4MzEwLCAvLyBSZXNwb25zZSBSYXRlIFNldAorI2RlZmluZSBSUlNSX1JTQ19PRkZTRVQJCQkyMQorI2RlZmluZSBSUlNSX1NIT1JUX09GRlNFVAkJCTIzCisjZGVmaW5lIFJSU1JfUlNDX0RVUExJQ0FURQkJCTB4NjAwMDAwCisjZGVmaW5lIFJSU1JfUlNDX0xPV1NVQkNITkwJCTB4NDAwMDAwCisjZGVmaW5lIFJSU1JfUlNDX1VQU1VCQ0hBTkwJCTB4MjAwMDAwCisjZGVmaW5lIFJSU1JfU0hPUlQJCQkJCTB4ODAwMDAwCisjZGVmaW5lIFJSU1JfMU0JCQkJCQlCSVQwCisjZGVmaW5lIFJSU1JfMk0JCQkJCQlCSVQxCisjZGVmaW5lIFJSU1JfNV81TQkJCQkJQklUMgorI2RlZmluZSBSUlNSXzExTQkJCQkJQklUMworI2RlZmluZSBSUlNSXzZNCQkJCQkJQklUNAorI2RlZmluZSBSUlNSXzlNCQkJCQkJQklUNQorI2RlZmluZSBSUlNSXzEyTQkJCQkJQklUNgorI2RlZmluZSBSUlNSXzE4TQkJCQkJQklUNworI2RlZmluZSBSUlNSXzI0TQkJCQkJQklUOAorI2RlZmluZSBSUlNSXzM2TQkJCQkJQklUOQorI2RlZmluZSBSUlNSXzQ4TQkJCQkJQklUMTAKKyNkZWZpbmUgUlJTUl81NE0JCQkJCUJJVDExCisjZGVmaW5lIFJSU1JfTUNTMAkJCQkJQklUMTIKKyNkZWZpbmUgUlJTUl9NQ1MxCQkJCQlCSVQxMworI2RlZmluZSBSUlNSX01DUzIJCQkJCUJJVDE0CisjZGVmaW5lIFJSU1JfTUNTMwkJCQkJQklUMTUKKyNkZWZpbmUgUlJTUl9NQ1M0CQkJCQlCSVQxNgorI2RlZmluZSBSUlNSX01DUzUJCQkJCUJJVDE3CisjZGVmaW5lIFJSU1JfTUNTNgkJCQkJQklUMTgKKyNkZWZpbmUgUlJTUl9NQ1M3CQkJCQlCSVQxOQorI2RlZmluZSBCUlNSX0Fja1Nob3J0UG1iCQkJQklUMjMJCS8vIENDSyBBQ0s6IHVzZSBTaG9ydCBQcmVhbWJsZSBvciBub3QuCisJUkFUUjAJCQk9IDB4MzIwLCAvLyBSYXRlIEFkYXB0aXZlIFRhYmxlIHJlZ2lzdGVyMQorCVVGV1AJCQk9IDB4MzE4LAorCURSSVZFUl9SU1NJCQk9IDB4MzJjLAkJCQkJLy8gRHJpdmVyIHRlbGwgRmlybXdhcmUgY3VycmVudCBSU1NJCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgIDgxOTAgUmF0ZSBBZGFwdGl2ZSBUYWJsZSBSZWdpc3Rlcgkob2Zmc2V0IDB4MzIwLCA0IGJ5dGUpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vQ0NLCisjZGVmaW5lCVJBVFJfMU0JCQkweDAwMDAwMDAxCisjZGVmaW5lCVJBVFJfMk0JCQkweDAwMDAwMDAyCisjZGVmaW5lCVJBVFJfNTVNCQkweDAwMDAwMDA0CisjZGVmaW5lCVJBVFJfMTFNCQkweDAwMDAwMDA4CisvL09GRE0KKyNkZWZpbmUJUkFUUl82TQkJCTB4MDAwMDAwMTAKKyNkZWZpbmUJUkFUUl85TQkJCTB4MDAwMDAwMjAKKyNkZWZpbmUJUkFUUl8xMk0JCTB4MDAwMDAwNDAKKyNkZWZpbmUJUkFUUl8xOE0JCTB4MDAwMDAwODAKKyNkZWZpbmUJUkFUUl8yNE0JCTB4MDAwMDAxMDAKKyNkZWZpbmUJUkFUUl8zNk0JCTB4MDAwMDAyMDAKKyNkZWZpbmUJUkFUUl80OE0JCTB4MDAwMDA0MDAKKyNkZWZpbmUJUkFUUl81NE0JCTB4MDAwMDA4MDAKKy8vTUNTIDEgU3BhdGlhbCBTdHJlYW0KKyNkZWZpbmUJUkFUUl9NQ1MwCQkweDAwMDAxMDAwCisjZGVmaW5lCVJBVFJfTUNTMQkJMHgwMDAwMjAwMAorI2RlZmluZQlSQVRSX01DUzIJCTB4MDAwMDQwMDAKKyNkZWZpbmUJUkFUUl9NQ1MzCQkweDAwMDA4MDAwCisjZGVmaW5lCVJBVFJfTUNTNAkJMHgwMDAxMDAwMAorI2RlZmluZQlSQVRSX01DUzUJCTB4MDAwMjAwMDAKKyNkZWZpbmUJUkFUUl9NQ1M2CQkweDAwMDQwMDAwCisjZGVmaW5lCVJBVFJfTUNTNwkJMHgwMDA4MDAwMAorLy9NQ1MgMiBTcGF0aWFsIFN0cmVhbQorI2RlZmluZQlSQVRSX01DUzgJCTB4MDAxMDAwMDAKKyNkZWZpbmUJUkFUUl9NQ1M5CQkweDAwMjAwMDAwCisjZGVmaW5lCVJBVFJfTUNTMTAJCTB4MDA0MDAwMDAKKyNkZWZpbmUJUkFUUl9NQ1MxMQkJMHgwMDgwMDAwMAorI2RlZmluZQlSQVRSX01DUzEyCQkweDAxMDAwMDAwCisjZGVmaW5lCVJBVFJfTUNTMTMJCTB4MDIwMDAwMDAKKyNkZWZpbmUJUkFUUl9NQ1MxNAkJMHgwNDAwMDAwMAorI2RlZmluZQlSQVRSX01DUzE1CQkweDA4MDAwMDAwCisvLyBBTEwgQ0NLIFJhdGUKKyNkZWZpbmUgUkFURV9BTExfQ0NLCQlSQVRSXzFNfFJBVFJfMk18UkFUUl81NU18UkFUUl8xMU0KKyNkZWZpbmUgUkFURV9BTExfT0ZETV9BRwlSQVRSXzZNfFJBVFJfOU18UkFUUl8xMk18UkFUUl8xOE18UkFUUl8yNE1cCisJCQkJCQkJfFJBVFJfMzZNfFJBVFJfNDhNfFJBVFJfNTRNCisjZGVmaW5lIFJBVEVfQUxMX09GRE1fMVNTCVJBVFJfTUNTMHxSQVRSX01DUzF8UkFUUl9NQ1MyfFJBVFJfTUNTMyB8IFwKKwkJCQkJCQlSQVRSX01DUzR8UkFUUl9NQ1M1fFJBVFJfTUNTNnxSQVRSX01DUzcKKyNkZWZpbmUgUkFURV9BTExfT0ZETV8yU1MJUkFUUl9NQ1M4fFJBVFJfTUNTOQl8UkFUUl9NQ1MxMHxSQVRSX01DUzExfCBcCisJCQkJCQkJUkFUUl9NQ1MxMnxSQVRSX01DUzEzfFJBVFJfTUNTMTR8UkFUUl9NQ1MxNQorCisJTUNTX1RYQUdDCQk9IDB4MzQwLCAvLyBNQ1MgQUdDCisJQ0NLX1RYQUdDCQk9IDB4MzQ4LCAvLyBDQ0sgQUdDCisvLwlJU1IJCQk9IDB4MzUwLCAvLyBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyCisvLwlJTVIJCQk9IDB4MzU0LCAvLyBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlcgorLy8JSU1SX1BPTEwJCT0gMHgzNjAsCisJTWFjQmxrQ3RybAkJPSAweDQwMywgLy8gTWFjIGJsb2NrIG9uL29mZiBjb250cm9sIHJlZ2lzdGVyCisKKwlFUFJPTV9DTUQgCQk9IDB4ZmU1OCwKKyNkZWZpbmUgQ21kOTM0NkNSXzkzNTZTRUwJKDE8PDQpCisjZGVmaW5lIEVQUk9NX0NNRF9SRVNFUlZFRF9NQVNLICgxPDw1KQorI2RlZmluZSBFUFJPTV9DTURfT1BFUkFUSU5HX01PREVfU0hJRlQgNgorI2RlZmluZSBFUFJPTV9DTURfT1BFUkFUSU5HX01PREVfTUFTSyAoKDE8PDcpfCgxPDw2KSkKKyNkZWZpbmUgRVBST01fQ01EX0NPTkZJRyAweDMKKyNkZWZpbmUgRVBST01fQ01EX05PUk1BTCAwCisjZGVmaW5lIEVQUk9NX0NNRF9MT0FEIDEKKyNkZWZpbmUgRVBST01fQ01EX1BST0dSQU0gMgorI2RlZmluZSBFUFJPTV9DU19TSElGVCAzCisjZGVmaW5lIEVQUk9NX0NLX1NISUZUIDIKKyNkZWZpbmUgRVBST01fV19TSElGVCAxCisjZGVmaW5lIEVQUk9NX1JfU0hJRlQgMAorCU1BQzAgCQkJPSAweDAwMCwKKwlNQUMxIAkJCT0gMHgwMDEsCisJTUFDMiAJCQk9IDB4MDAyLAorCU1BQzMgCQkJPSAweDAwMywKKwlNQUM0IAkJCT0gMHgwMDQsCisJTUFDNSAJCQk9IDB4MDA1LAorCit9OworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICA4MTh4QiBBbmFQYXJtICYgQW5hUGFybTIgUmVnaXN0ZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8jZGVmaW5lIEFOQVBBUk1fQVNJQ19PTiAgICAweDQ1MDkwNjU4CisvLyNkZWZpbmUgQU5BUEFSTTJfQVNJQ19PTiAgIDB4NzI3ZjNmNTIKKyNkZWZpbmUgR1BJIDB4MTA4CisjZGVmaW5lIEdQTyAweDEwOQorI2RlZmluZSBHUEUgMHgxMGEKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV93eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV93eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZDVjODcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX3d4LmMKQEAgLTAsMCArMSwxMjI4IEBACisvKgorICAgVGhpcyBmaWxlIGNvbnRhaW5zIHdpcmVsZXNzIGV4dGVuc2lvbiBoYW5kbGVycy4KKworICAgVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIuCisgICBDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQtMjAwNSAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICAgUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydAorICAgb2YgdGhlIG9mZmljaWFsIHJlYWx0ZWsgZHJpdmVyLgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uCisgICBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24uCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzIDIxMDAgR1BMIGRyaXZlci4KKworICAgV2Ugd2FudCB0byB0YW5rcyB0aGUgQXV0aG9ycyBvZiB0aG9zZSBwcm9qZWN0cyBhbmQgdGhlIE5kaXN3cmFwcGVyCisgICBwcm9qZWN0IEF1dGhvcnMuCisqLworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSAicjgxOTJVLmgiCisjaW5jbHVkZSAicjgxOTJVX2h3LmgiCisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisjaW5jbHVkZSAiZG90MTFkLmgiCisjZW5kaWYKKworI2RlZmluZSBSQVRFX0NPVU5UIDEyCit1MzIgcnRsODE4MF9yYXRlc1tdID0gezEwMDAwMDAsMjAwMDAwMCw1NTAwMDAwLDExMDAwMDAwLAorCTYwMDAwMDAsOTAwMDAwMCwxMjAwMDAwMCwxODAwMDAwMCwyNDAwMDAwMCwzNjAwMDAwMCw0ODAwMDAwMCw1NDAwMDAwMH07CisKKworI2lmbmRlZiBFTkVURE9XTgorI2RlZmluZSBFTkVURE9XTiAxCisjZW5kaWYKKworc3RhdGljIGludCByODE5Ml93eF9nZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXJldHVybiBpZWVlODAyMTFfd3hfZ2V0X2ZyZXEocHJpdi0+aWVlZTgwMjExLGEsd3JxdSxiKTsKK30KKworCitzdGF0aWMgaW50IHI4MTkyX3d4X2dldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXY9aWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXJldHVybiBpZWVlODAyMTFfd3hfZ2V0X21vZGUocHJpdi0+aWVlZTgwMjExLGEsd3JxdSxiKTsKK30KKworCisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfZ2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXJldHVybiBpZWVlODAyMTFfd3hfZ2V0X3JhdGUocHJpdi0+aWVlZTgwMjExLGluZm8sd3JxdSxleHRyYSk7Cit9CisKKworCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfcmF0ZShwcml2LT5pZWVlODAyMTEsaW5mbyx3cnF1LGV4dHJhKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9ydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9ydHMocHJpdi0+aWVlZTgwMjExLGluZm8sd3JxdSxleHRyYSk7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfZ2V0X3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJcmV0dXJuIGllZWU4MDIxMV93eF9nZXRfcnRzKHByaXYtPmllZWU4MDIxMSxpbmZvLHdycXUsZXh0cmEpOworfQorCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X3Bvd2VyKHByaXYtPmllZWU4MDIxMSxpbmZvLHdycXUsZXh0cmEpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHI4MTkyX3d4X2dldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJcmV0dXJuIGllZWU4MDIxMV93eF9nZXRfcG93ZXIocHJpdi0+aWVlZTgwMjExLGluZm8sd3JxdSxleHRyYSk7Cit9CisKKyNpZmRlZiBKT0hOX0lPQ1RMCit1MTYgcmVhZF9ydGw4MjI1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkZHIpOwordm9pZCB3cml0ZV9ydGw4MjI1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkciwgdTE2IGRhdGEpOwordTMyIGpvaG5fcmVhZF9ydGw4MjI1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkcik7Cit2b2lkIF93cml0ZV9ydGw4MjI1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkciwgdTE2IGRhdGEpOworCitzdGF0aWMgaW50IHI4MTkyX3d4X3JlYWRfcmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXU4IGFkZHI7CisJdTE2IGRhdGExOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCisJZ2V0X3VzZXIoYWRkciwodTgqKXdycXUtPmRhdGEucG9pbnRlcik7CisJZGF0YTEgPSByZWFkX3J0bDgyMjUoZGV2LCBhZGRyKTsKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IGRhdGExOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIGludCByODE5Ml93eF93cml0ZV9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTggYWRkcjsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlnZXRfdXNlcihhZGRyLCAodTgqKXdycXUtPmRhdGEucG9pbnRlcik7CisJd3JpdGVfcnRsODIyNShkZXYsIGFkZHIsIHdycXUtPmRhdGEubGVuZ3RoKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiAwOworCit9CisKK3ZvaWQgcnRsODE4N193cml0ZV9waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyLCB1MzIgZGF0YSk7Cit1OCBydGw4MTg3X3JlYWRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdTggYWRyLCB1MzIgZGF0YSk7CisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfcmVhZF9iYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXU4IGRhdGFiYjsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlkYXRhYmIgPSBydGw4MTg3X3JlYWRfcGh5KGRldiwgKHU4KXdycXUtPmRhdGEubGVuZ3RoLCAweDAwMDAwMDAwKTsKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IGRhdGFiYjsKKworCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiAwOworfQorCit2b2lkIHJ0bDgxODdfd3JpdGVfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkciwgdTMyIGRhdGEpOworc3RhdGljIGludCByODE5Ml93eF93cml0ZV9iYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXU4IGRhdGFiYjsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlnZXRfdXNlcihkYXRhYmIsICh1OCopd3JxdS0+ZGF0YS5wb2ludGVyKTsKKwlydGw4MTg3X3dyaXRlX3BoeShkZXYsIHdycXUtPmRhdGEubGVuZ3RoLCBkYXRhYmIpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIDA7CisKK30KKworCitzdGF0aWMgaW50IHI4MTkyX3d4X3dyaXRlX25pY2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgYWRkcjsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlnZXRfdXNlcihhZGRyLCAodTMyKil3cnF1LT5kYXRhLnBvaW50ZXIpOworCXdyaXRlX25pY19ieXRlKGRldiwgYWRkciwgd3JxdS0+ZGF0YS5sZW5ndGgpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIDA7CisKK30KK3N0YXRpYyBpbnQgcjgxOTJfd3hfcmVhZF9uaWNiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIGFkZHI7CisJdTE2IGRhdGExOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCWdldF91c2VyKGFkZHIsKHUzMiopd3JxdS0+ZGF0YS5wb2ludGVyKTsKKwlkYXRhMSA9IHJlYWRfbmljX2J5dGUoZGV2LCBhZGRyKTsKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IGRhdGExOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfZ2V0X2FwX3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gcHJpdi0+aWVlZTgwMjExOworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqdGFyZ2V0OworCWludCBuYW1lX2xlbjsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwkvL2NvdW50IHRoZSBsZW5ndGggb2YgaW5wdXQgc3NpZAorCWZvcihuYW1lX2xlbj0wIDsgKChjaGFyKil3cnF1LT5kYXRhLnBvaW50ZXIpW25hbWVfbGVuXSE9J1wwJyA7IG5hbWVfbGVuKyspOworCisJLy9zZWFyY2ggZm9yIHRoZSBjb3JyZXNwb2RpbmcgaW5mbyB3aGljaCBpcyByZWNlaXZlZAorCWxpc3RfZm9yX2VhY2hfZW50cnkodGFyZ2V0LCAmaWVlZS0+bmV0d29ya19saXN0LCBsaXN0KSB7CisJCWlmICggKHRhcmdldC0+c3NpZF9sZW4gPT0gbmFtZV9sZW4pICYmCisJCSAgICAgKHN0cm5jbXAodGFyZ2V0LT5zc2lkLCAoY2hhciopd3JxdS0+ZGF0YS5wb2ludGVyLCBuYW1lX2xlbik9PTApKXsKKwkJCWlmKHRhcmdldC0+d3BhX2llX2xlbj4wIHx8IHRhcmdldC0+cnNuX2llX2xlbj4wICkKKwkJCQkvL3NldCBmbGFncz0xIHRvIGluZGljYXRlIHRoaXMgYXAgaXMgV1BBCisJCQkJd3JxdS0+ZGF0YS5mbGFncyA9IDE7CisJCQllbHNlIHdycXUtPmRhdGEuZmxhZ3MgPSAwOworCisKKwkJYnJlYWs7CisJCX0KKwl9CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gMDsKK30KKworCisKKyNlbmRpZgorc3RhdGljIGludCByODE5Ml93eF9mb3JjZV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcHJpbnRrKCIlcygpOiBmb3JjZSByZXNldCAhIGV4dHJhIGlzICVkXG4iLF9fRlVOQ1RJT05fXywgKmV4dHJhKTsKKwlwcml2LT5mb3JjZV9yZXNldCA9ICpleHRyYTsKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gMDsKKworfQorCisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X3Jhd3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IHJldDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X3Jhd3R4KHByaXYtPmllZWU4MDIxMSwgaW5mbywgd3JxdSwgZXh0cmEpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworCit9CisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X2NyY21vbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCAqcGFybXMgPSAoaW50ICopZXh0cmE7CisJaW50IGVuYWJsZSA9IChwYXJtc1swXSA+IDApOworCXNob3J0IHByZXYgPSBwcml2LT5jcmNtb247CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJaWYoZW5hYmxlKQorCQlwcml2LT5jcmNtb249MTsKKwllbHNlCisJCXByaXYtPmNyY21vbj0wOworCisJRE1FU0coImJhZCBDUkMgaW4gbW9uaXRvciBtb2RlIGFyZSAlcyIsCisJICAgICAgcHJpdi0+Y3JjbW9uID8gImFjY2VwdGVkIiA6ICJyZWplY3RlZCIpOworCisJaWYocHJldiAhPSBwcml2LT5jcmNtb24gJiYgcHJpdi0+dXApeworCQkvL3J0bDgxODBfZG93bihkZXYpOworCQkvL3J0bDgxODBfdXAoZGV2KTsKKwl9CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCByZXQ7CisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfbW9kZShwcml2LT5pZWVlODAyMTEsYSx3cnF1LGIpOworCisJcnRsODE5Ml9zZXRfcnhjb25mKGRldik7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCitzdHJ1Y3QgIGl3X3JhbmdlX3dpdGhfc2Nhbl9jYXBhCit7CisJLyogSW5mb3JtYXRpdmUgc3R1ZmYgKHRvIGNob29zZSBiZXR3ZWVuIGRpZmZlcmVudCBpbnRlcmZhY2UpICovCisJX191MzIgICAgICAgICAgIHRocm91Z2hwdXQ7ICAgICAvKiBUbyBnaXZlIGFuIGlkZWEuLi4gKi8KKwkvKiBJbiB0aGVvcnkgdGhpcyB2YWx1ZSBzaG91bGQgYmUgdGhlIG1heGltdW0gYmVuY2htYXJrZWQKKwkgKiBUQ1AvSVAgdGhyb3VnaHB1dCwgYmVjYXVzZSB3aXRoIG1vc3Qgb2YgdGhlc2UgZGV2aWNlcyB0aGUKKwkgKiBiaXQgcmF0ZSBpcyBtZWFuaW5nbGVzcyAob3ZlcmhlYWQgYW4gY28pIHRvIGVzdGltYXRlIGhvdworCSAqIGZhc3QgdGhlIGNvbm5lY3Rpb24gd2lsbCBnbyBhbmQgcGljayB0aGUgZmFzdGVzdCBvbmUuCisJICogSSBzdWdnZXN0IHBlb3BsZSB0byBwbGF5IHdpdGggTmV0cGVyZiBvciBhbnkgYmVuY2htYXJrLi4uCisJICovCisKKwkvKiBOV0lEIChvciBkb21haW4gaWQpICovCisJX191MzIgICAgICAgICAgIG1pbl9ud2lkOyAgICAgICAvKiBNaW5pbWFsIE5XSUQgd2UgYXJlIGFibGUgdG8gc2V0ICovCisJX191MzIgICAgICAgICAgIG1heF9ud2lkOyAgICAgICAvKiBNYXhpbWFsIE5XSUQgd2UgYXJlIGFibGUgdG8gc2V0ICovCisKKwkvKiBPbGQgRnJlcXVlbmN5IChiYWNrd2FyZCBjb21wYXQgLSBtb3ZlZCBsb3dlciApICovCisJX191MTYgICAgICAgICAgIG9sZF9udW1fY2hhbm5lbHM7CisJX191OCAgICAgICAgICAgIG9sZF9udW1fZnJlcXVlbmN5OworCisJLyogU2NhbiBjYXBhYmlsaXRpZXMgKi8KKwlfX3U4ICAgICAgICAgICAgc2Nhbl9jYXBhOworfTsKK3N0YXRpYyBpbnQgcnRsODE4MF93eF9nZXRfcmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopZXh0cmE7CisJc3RydWN0IGl3X3JhbmdlX3dpdGhfc2Nhbl9jYXBhKiB0bXAgPSAoc3RydWN0IGl3X3JhbmdlX3dpdGhfc2Nhbl9jYXBhKilyYW5nZTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTE2IHZhbDsKKwlpbnQgaTsKKworCXdycXUtPmRhdGEubGVuZ3RoID0gc2l6ZW9mKCpyYW5nZSk7CisJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2YoKnJhbmdlKSk7CisKKwkvKiBMZXQncyB0cnkgdG8ga2VlcCB0aGlzIHN0cnVjdCBpbiB0aGUgc2FtZSBvcmRlciBhcyBpbgorCSAqIGxpbnV4L2luY2x1ZGUvd2lyZWxlc3MuaAorCSAqLworCisJLyogVE9ETzogU2VlIHdoYXQgdmFsdWVzIHdlIGNhbiBzZXQsIGFuZCByZW1vdmUgdGhlIG9uZXMgd2UgY2FuJ3QKKwkgKiBzZXQsIG9yIGZpbGwgdGhlbSB3aXRoIHNvbWUgZGVmYXVsdCBkYXRhLgorCSAqLworCisJLyogfjUgTWIvcyByZWFsICg4MDIuMTFiKSAqLworCXJhbmdlLT50aHJvdWdocHV0ID0gNSAqIDEwMDAgKiAxMDAwOworCisJLy8gVE9ETzogTm90IHVzZWQgaW4gODAyLjExYj8KKy8vCXJhbmdlLT5taW5fbndpZDsJLyogTWluaW1hbCBOV0lEIHdlIGFyZSBhYmxlIHRvIHNldCAqLworCS8vIFRPRE86IE5vdCB1c2VkIGluIDgwMi4xMWI/CisvLwlyYW5nZS0+bWF4X253aWQ7CS8qIE1heGltYWwgTldJRCB3ZSBhcmUgYWJsZSB0byBzZXQgKi8KKworCS8qIE9sZCBGcmVxdWVuY3kgKGJhY2t3YXJkIGNvbXBhdCAtIG1vdmVkIGxvd2VyICkgKi8KKy8vCXJhbmdlLT5vbGRfbnVtX2NoYW5uZWxzOworLy8JcmFuZ2UtPm9sZF9udW1fZnJlcXVlbmN5OworLy8JcmFuZ2UtPm9sZF9mcmVxWzZdOyAvKiBGaWxsZXIgdG8ga2VlcCAidmVyc2lvbiIgYXQgdGhlIHNhbWUgb2Zmc2V0ICovCisJaWYocHJpdi0+cmZfc2V0X3NlbnMgIT0gTlVMTCkKKwkJcmFuZ2UtPnNlbnNpdGl2aXR5ID0gcHJpdi0+bWF4X3NlbnM7CS8qIHNpZ25hbCBsZXZlbCB0aHJlc2hvbGQgcmFuZ2UgKi8KKworCXJhbmdlLT5tYXhfcXVhbC5xdWFsID0gMTAwOworCS8qIFRPRE86IEZpbmQgcmVhbCBtYXggUlNTSSBhbmQgc3RpY2sgaGVyZSAqLworCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDA7CisJcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gLTk4OworCXJhbmdlLT5tYXhfcXVhbC51cGRhdGVkID0gNzsgLyogVXBkYXRlZCBhbGwgdGhyZWUgKi8KKworCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gOTI7IC8qID4gOCUgbWlzc2VkIGJlYWNvbnMgaXMgJ2JhZCcgKi8KKwkvKiBUT0RPOiBGaW5kIHJlYWwgJ2dvb2QnIHRvICdiYWQnIHRocmVzaG9sIHZhbHVlIGZvciBSU1NJICovCisJcmFuZ2UtPmF2Z19xdWFsLmxldmVsID0gMjAgKyAtOTg7CisJcmFuZ2UtPmF2Z19xdWFsLm5vaXNlID0gMDsKKwlyYW5nZS0+YXZnX3F1YWwudXBkYXRlZCA9IDc7IC8qIFVwZGF0ZWQgYWxsIHRocmVlICovCisKKwlyYW5nZS0+bnVtX2JpdHJhdGVzID0gUkFURV9DT1VOVDsKKworCWZvciAoaSA9IDA7IGkgPCBSQVRFX0NPVU5UICYmIGkgPCBJV19NQVhfQklUUkFURVM7IGkrKykgeworCQlyYW5nZS0+Yml0cmF0ZVtpXSA9IHJ0bDgxODBfcmF0ZXNbaV07CisJfQorCisJcmFuZ2UtPm1pbl9mcmFnID0gTUlOX0ZSQUdfVEhSRVNIT0xEOworCXJhbmdlLT5tYXhfZnJhZyA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKworCXJhbmdlLT5taW5fcG1wPTA7CisJcmFuZ2UtPm1heF9wbXAgPSA1MDAwMDAwOworCXJhbmdlLT5taW5fcG10ID0gMDsKKwlyYW5nZS0+bWF4X3BtdCA9IDY1NTM1KjEwMDA7CisJcmFuZ2UtPnBtcF9mbGFncyA9IElXX1BPV0VSX1BFUklPRDsKKwlyYW5nZS0+cG10X2ZsYWdzID0gSVdfUE9XRVJfVElNRU9VVDsKKwlyYW5nZS0+cG1fY2FwYSA9IElXX1BPV0VSX1BFUklPRCB8IElXX1BPV0VSX1RJTUVPVVQgfCBJV19QT1dFUl9BTExfUjsKKworCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IDE2OworCisvLwlyYW5nZS0+cmV0cnlfY2FwYTsJLyogV2hhdCByZXRyeSBvcHRpb25zIGFyZSBzdXBwb3J0ZWQgKi8KKy8vCXJhbmdlLT5yZXRyeV9mbGFnczsJLyogSG93IHRvIGRlY29kZSBtYXgvbWluIHJldHJ5IGxpbWl0ICovCisvLwlyYW5nZS0+cl90aW1lX2ZsYWdzOwkvKiBIb3cgdG8gZGVjb2RlIG1heC9taW4gcmV0cnkgbGlmZSAqLworLy8JcmFuZ2UtPm1pbl9yZXRyeTsJLyogTWluaW1hbCBudW1iZXIgb2YgcmV0cmllcyAqLworLy8JcmFuZ2UtPm1heF9yZXRyeTsJLyogTWF4aW1hbCBudW1iZXIgb2YgcmV0cmllcyAqLworLy8JcmFuZ2UtPm1pbl9yX3RpbWU7CS8qIE1pbmltYWwgcmV0cnkgbGlmZXRpbWUgKi8KKy8vCXJhbmdlLT5tYXhfcl90aW1lOwkvKiBNYXhpbWFsIHJldHJ5IGxpZmV0aW1lICovCisKKworCWZvciAoaSA9IDAsIHZhbCA9IDA7IGkgPCAxNDsgaSsrKSB7CisKKwkJLy8gSW5jbHVkZSBvbmx5IGxlZ2FsIGZyZXF1ZW5jaWVzIGZvciBzb21lIGNvdW50cmllcworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkJaWYgKChHRVRfRE9UMTFEX0lORk8ocHJpdi0+aWVlZTgwMjExKS0+Y2hhbm5lbF9tYXApW2krMV0pIHsKKyNlbHNlCisJCWlmICgocHJpdi0+aWVlZTgwMjExLT5jaGFubmVsX21hcClbaSsxXSkgeworI2VuZGlmCisJCQlyYW5nZS0+ZnJlcVt2YWxdLmkgPSBpICsgMTsKKwkJCXJhbmdlLT5mcmVxW3ZhbF0ubSA9IGllZWU4MDIxMV93bGFuX2ZyZXF1ZW5jaWVzW2ldICogMTAwMDAwOworCQkJcmFuZ2UtPmZyZXFbdmFsXS5lID0gMTsKKwkJCXZhbCsrOworCQl9IGVsc2UgeworCQkJLy8gRklYTUU6IGRvIHdlIG5lZWQgdG8gc2V0IGFueXRoaW5nIGZvciBjaGFubmVscworCQkJLy8gd2UgZG9uJ3QgdXNlID8KKwkJfQorCisJCWlmICh2YWwgPT0gSVdfTUFYX0ZSRVFVRU5DSUVTKQorCQlicmVhazsKKwl9CisJcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSB2YWw7CisJcmFuZ2UtPm51bV9jaGFubmVscyA9IHZhbDsKKyNpZiBXSVJFTEVTU19FWFQgPiAxNworCXJhbmdlLT5lbmNfY2FwYSA9IElXX0VOQ19DQVBBX1dQQXxJV19FTkNfQ0FQQV9XUEEyfAorCQkJICBJV19FTkNfQ0FQQV9DSVBIRVJfVEtJUHxJV19FTkNfQ0FQQV9DSVBIRVJfQ0NNUDsKKyNlbmRpZgorCXRtcC0+c2Nhbl9jYXBhID0gMHgwMTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlID0gcHJpdi0+aWVlZTgwMjExOworCWludCByZXQgPSAwOworCisJaWYoIXByaXYtPnVwKSByZXR1cm4gLUVORVRET1dOOworCisJaWYgKHByaXYtPmllZWU4MDIxMS0+TGlua0RldGVjdEluZm8uYkJ1c3lUcmFmZmljID09IHRydWUpCisJCXJldHVybiAtRUFHQUlOOworCWlmICh3cnF1LT5kYXRhLmZsYWdzICYgSVdfU0NBTl9USElTX0VTU0lEKQorCXsKKwkJc3RydWN0IGl3X3NjYW5fcmVxKiByZXEgPSAoc3RydWN0IGl3X3NjYW5fcmVxKiliOworCQlpZiAocmVxLT5lc3NpZF9sZW4pCisJCXsKKwkJCS8vcHJpbnRrKCI9PSoqJiomKiYqKj09PT5zY2FuIHNldCBzc2lkOiVzXG4iLCByZXEtPmVzc2lkKTsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9IHJlcS0+ZXNzaWRfbGVuOworCQkJbWVtY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCByZXEtPmVzc2lkLCByZXEtPmVzc2lkX2xlbik7CisJCQkvL3ByaW50aygiPT09PT0+bmV0d29yayBzc2lkOiVzXG4iLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCk7CisJCX0KKwl9CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCWlmKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCl7CisJCXByaXYtPmllZWU4MDIxMS0+c2Nhbm5pbmcgPSAwOworCQlpZWVlODAyMTFfc29mdG1hY19zY2FuX3N5bmNybyhwcml2LT5pZWVlODAyMTEpOworCQlyZXQgPSAwOworCX0KKwllbHNlCisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9zY2FuKHByaXYtPmllZWU4MDIxMSxhLHdycXUsYik7CisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHI4MTkyX3d4X2dldF9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisKKwlpbnQgcmV0OworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmKCFwcml2LT51cCkgcmV0dXJuIC1FTkVURE9XTjsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlyZXQgPSBpZWVlODAyMTFfd3hfZ2V0X3NjYW4ocHJpdi0+aWVlZTgwMjExLGEsd3JxdSxiKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByODE5Ml93eF9zZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X2Vzc2lkKHByaXYtPmllZWU4MDIxMSxhLHdycXUsYik7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKKworCisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfZ2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlyZXQgPSBpZWVlODAyMTFfd3hfZ2V0X2Vzc2lkKHByaXYtPmllZWU4MDIxMSwgYSwgd3JxdSwgYik7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCByODE5Ml93eF9zZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCWludCByZXQ7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfZnJlcShwcml2LT5pZWVlODAyMTEsIGEsIHdycXUsIGIpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByODE5Ml93eF9nZXRfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJcmV0dXJuIGllZWU4MDIxMV93eF9nZXRfbmFtZShwcml2LT5pZWVlODAyMTEsIGluZm8sIHdycXUsIGV4dHJhKTsKK30KKworCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9mcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmICh3cnF1LT5mcmFnLmRpc2FibGVkKQorCQlwcml2LT5pZWVlODAyMTEtPmZ0cyA9IERFRkFVTFRfRlJBR19USFJFU0hPTEQ7CisJZWxzZSB7CisJCWlmICh3cnF1LT5mcmFnLnZhbHVlIDwgTUlOX0ZSQUdfVEhSRVNIT0xEIHx8CisJCSAgICB3cnF1LT5mcmFnLnZhbHVlID4gTUFYX0ZSQUdfVEhSRVNIT0xEKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcHJpdi0+aWVlZTgwMjExLT5mdHMgPSB3cnF1LT5mcmFnLnZhbHVlICYgfjB4MTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHI4MTkyX3d4X2dldF9mcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXdycXUtPmZyYWcudmFsdWUgPSBwcml2LT5pZWVlODAyMTEtPmZ0czsKKwl3cnF1LT5mcmFnLmZpeGVkID0gMDsJLyogbm8gYXV0byBzZWxlY3QgKi8KKwl3cnF1LT5mcmFnLmRpc2FibGVkID0gKHdycXUtPmZyYWcudmFsdWUgPT0gREVGQVVMVF9GUkFHX1RIUkVTSE9MRCk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF93YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHVuaW9uIGl3cmVxX2RhdGEgKmF3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisKKwlpbnQgcmV0OworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKy8vICAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKnRlbXAgPSAoc3RydWN0IHNvY2thZGRyICopYXdycTsKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF93YXAocHJpdi0+aWVlZTgwMjExLGluZm8sYXdycSxleHRyYSk7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7CisKK30KKworCitzdGF0aWMgaW50IHI4MTkyX3d4X2dldF93YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXJldHVybiBpZWVlODAyMTFfd3hfZ2V0X3dhcChwcml2LT5pZWVlODAyMTEsaW5mbyx3cnF1LGV4dHJhKTsKK30KKworCitzdGF0aWMgaW50IHI4MTkyX3d4X2dldF9lbmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlyZXR1cm4gaWVlZTgwMjExX3d4X2dldF9lbmNvZGUocHJpdi0+aWVlZTgwMjExLCBpbmZvLCB3cnF1LCBrZXkpOworfQorCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9lbmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBwcml2LT5pZWVlODAyMTE7CisJaW50IHJldDsKKworCS8vdTMyIFRhcmdldENvbnRlbnQ7CisJdTMyIGh3a2V5WzRdPXswLDAsMCwwfTsKKwl1OCBtYXNrPTB4ZmY7CisJdTMyIGtleV9pZHg9MDsKKwkvL3U4IGJyb2FkY2FzdF9hZGRyWzZdID17CTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmfTsKKwl1OCB6ZXJvX2FkZHJbNF1bNl0gPXsJezB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfSwKKwkJCQl7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDF9LAorCQkJCXsweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMn0sCisJCQkJezB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzfSB9OworCWludCBpOworCisgICAgICAgaWYoIXByaXYtPnVwKSByZXR1cm4gLUVORVRET1dOOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCVJUX1RSQUNFKENPTVBfU0VDLCAiU2V0dGluZyBTVyB3ZXAga2V5Iik7CisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9lbmNvZGUocHJpdi0+aWVlZTgwMjExLGluZm8sd3JxdSxrZXkpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKworCisJLy9zb21ldGltZXMsIHRoZSBsZW5ndGggaXMgemVybyB3aGlsZSB3ZSBkbyBub3QgdHlwZSBrZXkgdmFsdWUKKwlpZih3cnF1LT5lbmNvZGluZy5sZW5ndGghPTApeworCisJCWZvcihpPTAgOyBpPDQgOyBpKyspeworCQkJaHdrZXlbaV0gfD0gIGtleVs0KmkrMF0mbWFzazsKKwkJCWlmKGk9PTEmJig0KmkrMSk9PXdycXUtPmVuY29kaW5nLmxlbmd0aCkgbWFzaz0weDAwOworCQkJaWYoaT09MyYmKDQqaSsxKT09d3JxdS0+ZW5jb2RpbmcubGVuZ3RoKSBtYXNrPTB4MDA7CisJCQlod2tleVtpXSB8PSAoa2V5WzQqaSsxXSZtYXNrKTw8ODsKKwkJCWh3a2V5W2ldIHw9IChrZXlbNCppKzJdJm1hc2spPDwxNjsKKwkJCWh3a2V5W2ldIHw9IChrZXlbNCppKzNdJm1hc2spPDwyNDsKKwkJfQorCisJCSNkZWZpbmUgQ09ORl9XRVA0MCAgMHg0CisJCSNkZWZpbmUgQ09ORl9XRVAxMDQgMHgxNAorCisJCXN3aXRjaCh3cnF1LT5lbmNvZGluZy5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCl7CisJCQljYXNlIDA6IGtleV9pZHggPSBpZWVlLT50eF9rZXlpZHg7IGJyZWFrOworCQkJY2FzZSAxOglrZXlfaWR4ID0gMDsgYnJlYWs7CisJCQljYXNlIDI6CWtleV9pZHggPSAxOyBicmVhazsKKwkJCWNhc2UgMzoJa2V5X2lkeCA9IDI7IGJyZWFrOworCQkJY2FzZSA0OglrZXlfaWR4CT0gMzsgYnJlYWs7CisJCQlkZWZhdWx0OiBicmVhazsKKwkJfQorCisJCWlmKHdycXUtPmVuY29kaW5nLmxlbmd0aD09MHg1KXsKKwkJCQlpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9IEtFWV9UWVBFX1dFUDQwOworCQkJRW5hYmxlSFdTZWN1cml0eUNvbmZpZzgxOTIoZGV2KTsKKworCQkJc2V0S2V5KCBkZXYsCisJCQkJa2V5X2lkeCwgICAgICAgICAgICAgICAgLy9FbnRyeU5vCisJCQkJa2V5X2lkeCwgICAgICAgICAgICAgICAgLy9LZXlJbmRleAorCQkJCUtFWV9UWVBFX1dFUDQwLCAgICAgICAgIC8vS2V5VHlwZQorCQkJCXplcm9fYWRkcltrZXlfaWR4XSwKKwkJCQkwLCAgICAgICAgICAgICAgICAgICAgICAvL0RlZmF1bHRLZXkKKwkJCQlod2tleSk7ICAgICAgICAgICAgICAgICAvL0tleUNvbnRlbnQKKworCQl9CisKKwkJZWxzZSBpZih3cnF1LT5lbmNvZGluZy5sZW5ndGg9PTB4ZCl7CisJCQkJaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUgPSBLRVlfVFlQRV9XRVAxMDQ7CisJCQkJRW5hYmxlSFdTZWN1cml0eUNvbmZpZzgxOTIoZGV2KTsKKworCQkJc2V0S2V5KCBkZXYsCisJCQkJa2V5X2lkeCwgICAgICAgICAgICAgICAgLy9FbnRyeU5vCisJCQkJa2V5X2lkeCwgICAgICAgICAgICAgICAgLy9LZXlJbmRleAorCQkJCUtFWV9UWVBFX1dFUDEwNCwgICAgICAgIC8vS2V5VHlwZQorCQkJCXplcm9fYWRkcltrZXlfaWR4XSwKKwkJCQkwLCAgICAgICAgICAgICAgICAgICAgICAvL0RlZmF1bHRLZXkKKwkJCQlod2tleSk7ICAgICAgICAgICAgICAgICAvL0tleUNvbnRlbnQKKworCQl9CisJCWVsc2UgcHJpbnRrKCJ3cm9uZyB0eXBlIGluIFdFUCwgbm90IFdFUDQwIGFuZCBXRVAxMDRcbiIpOworCisJfQorCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9zY2FuX3R5cGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYWEsIHVuaW9uCisgaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqcCl7CisKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50ICpwYXJtcz0oaW50KilwOworCWludCBtb2RlPXBhcm1zWzBdOworCisJcHJpdi0+aWVlZTgwMjExLT5hY3RpdmVfc2NhbiA9IG1vZGU7CisKKwlyZXR1cm4gMTsKK30KKworCisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IGVyciA9IDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJaWYgKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTElGRVRJTUUgfHwKKwkgICAgd3JxdS0+cmV0cnkuZGlzYWJsZWQpeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCWlmICghKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTElNSVQpKXsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworCWlmKHdycXUtPnJldHJ5LnZhbHVlID4gUjgxODBfTUFYX1JFVFJZKXsKKwkJZXJyPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCWlmICh3cnF1LT5yZXRyeS5mbGFncyAmIElXX1JFVFJZX01BWCkgeworCQlwcml2LT5yZXRyeV9ydHMgPSB3cnF1LT5yZXRyeS52YWx1ZTsKKwkJRE1FU0coIlNldHRpbmcgcmV0cnkgZm9yIFJUUy9DVFMgZGF0YSB0byAlZCIsIHdycXUtPnJldHJ5LnZhbHVlKTsKKworCX1lbHNlIHsKKwkJcHJpdi0+cmV0cnlfZGF0YSA9IHdycXUtPnJldHJ5LnZhbHVlOworCQlETUVTRygiU2V0dGluZyByZXRyeSBmb3Igbm9uIFJUUy9DVFMgZGF0YSB0byAlZCIsIHdycXUtPnJldHJ5LnZhbHVlKTsKKwl9CisKKwkvKiBGSVhNRSAhCisJICogV2UgbWlnaHQgdHJ5IHRvIHdyaXRlIGRpcmVjdGx5IHRoZSBUWCBjb25maWcgcmVnaXN0ZXIKKwkgKiBvciB0byByZXN0YXJ0IGp1c3QgdGhlIChSKVRYIHByb2Nlc3MuCisJICogSSdtIHVuc3VyZSBpZiB3aG9sZSByZXNldCBpcyByZWFsbHkgbmVlZGVkCisJICovCisKKwlydGw4MTkyX2NvbW1pdChkZXYpOworCS8qCisJaWYocHJpdi0+dXApeworCQlydGw4MTgwX3J0eF9kaXNhYmxlKGRldik7CisJCXJ0bDgxODBfcnhfZW5hYmxlKGRldik7CisJCXJ0bDgxODBfdHhfZW5hYmxlKGRldik7CisKKwl9CisJKi8KK2V4aXQ6CisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHI4MTkyX3d4X2dldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisKKwl3cnF1LT5yZXRyeS5kaXNhYmxlZCA9IDA7IC8qIGNhbid0IGJlIGRpc2FibGVkICovCisKKwlpZiAoKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfVFlQRSkgPT0KKwkgICAgSVdfUkVUUllfTElGRVRJTUUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTUFYKSB7CisJCXdycXUtPnJldHJ5LmZsYWdzID0gSVdfUkVUUllfTElNSVQgfCBJV19SRVRSWV9NQVg7CisJCXdycXUtPnJldHJ5LnZhbHVlID0gcHJpdi0+cmV0cnlfcnRzOworCX0gZWxzZSB7CisJCXdycXUtPnJldHJ5LmZsYWdzID0gSVdfUkVUUllfTElNSVQgfCBJV19SRVRSWV9NSU47CisJCXdycXUtPnJldHJ5LnZhbHVlID0gcHJpdi0+cmV0cnlfZGF0YTsKKwl9CisJLy9wcmludGsoInJldHVybmluZyAlZCIsd3JxdS0+cmV0cnkudmFsdWUpOworCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByODE5Ml93eF9nZXRfc2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWlmKHByaXYtPnJmX3NldF9zZW5zID09IE5VTEwpCisJCXJldHVybiAtMTsgLyogd2UgaGF2ZSBub3QgdGhpcyBzdXBwb3J0IGZvciB0aGlzIHJhZGlvICovCisJd3JxdS0+c2Vucy52YWx1ZSA9IHByaXYtPnNlbnM7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCByODE5Ml93eF9zZXRfc2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlzaG9ydCBlcnIgPSAwOworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJLy9ETUVTRygiYXR0ZW1wdCB0byBzZXQgc2Vuc2l2aXR5IHRvICVkZGIiLHdycXUtPnNlbnMudmFsdWUpOworCWlmKHByaXYtPnJmX3NldF9zZW5zID09IE5VTEwpIHsKKwkJZXJyPSAtMTsgLyogd2UgaGF2ZSBub3QgdGhpcyBzdXBwb3J0IGZvciB0aGlzIHJhZGlvICovCisJCWdvdG8gZXhpdDsKKwl9CisJaWYocHJpdi0+cmZfc2V0X3NlbnMoZGV2LCB3cnF1LT5zZW5zLnZhbHVlKSA9PSAwKQorCQlwcml2LT5zZW5zID0gd3JxdS0+c2Vucy52YWx1ZTsKKwllbHNlCisJCWVycj0gLUVJTlZBTDsKKworZXhpdDoKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiBlcnI7Cit9CisKKyNpZiAoV0lSRUxFU1NfRVhUID49IDE4KQorLy9odyBzZWN1cml0eSBuZWVkIHRvIHJlb3JnYW5pemVkLgorc3RhdGljIGludCByODE5Ml93eF9zZXRfZW5jX2V4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0PTA7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlID0gcHJpdi0+aWVlZTgwMjExOworCS8vcHJpbnRrKCI9PT0+JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9leHQocHJpdi0+aWVlZTgwMjExLCBpbmZvLCB3cnF1LCBleHRyYSk7CisKKwl7CisJCXU4IGJyb2FkY2FzdF9hZGRyWzZdID0gezB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmfTsKKwkJdTggemVyb1s2XSA9IHswfTsKKwkJdTMyIGtleVs0XSA9IHswfTsKKwkJc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOworCQlzdHJ1Y3QgaXdfcG9pbnQgKmVuY29kaW5nID0gJndycXUtPmVuY29kaW5nOworCQl1OCBpZHggPSAwLCBhbGcgPSAwLCBncm91cCA9IDA7CisJCWlmICgoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSB8fAorCQlleHQtPmFsZyA9PSBJV19FTkNPREVfQUxHX05PTkUpIC8vbm9uZSBpcyBub3QgYWxsb3dlZCB0byB1c2UgaHdzZWMgV0IgMjAwOC4wNy4wMQorCQkJZ290byBlbmRfaHdfc2VjOworCisJCWFsZyA9ICAoZXh0LT5hbGcgPT0gSVdfRU5DT0RFX0FMR19DQ01QKT9LRVlfVFlQRV9DQ01QOmV4dC0+YWxnOyAvLyBhcyBJV19FTkNPREVfQUxHX0NDTVAgaXMgZGVmaW5lZCB0byBiZSAzIGFuZCBLRVlfVFlQRV9DQ01QIGlzIGRlZmluZWQgdG8gNDsKKwkJaWR4ID0gZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworCQlpZiAoaWR4KQorCQkJaWR4IC0tOworCQlncm91cCA9IGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVk7CisKKwkJaWYgKCghZ3JvdXApIHx8IChJV19NT0RFX0FESE9DID09IGllZWUtPml3X21vZGUpIHx8IChhbGcgPT0gIEtFWV9UWVBFX1dFUDQwKSkKKwkJeworCQkJaWYgKChleHQtPmtleV9sZW4gPT0gMTMpICYmIChhbGcgPT0gS0VZX1RZUEVfV0VQNDApICkKKwkJCQlhbGcgPSBLRVlfVFlQRV9XRVAxMDQ7CisJCQlpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9IGFsZzsKKwkJCUVuYWJsZUhXU2VjdXJpdHlDb25maWc4MTkyKGRldik7CisJCX0KKwkJbWVtY3B5KCh1OCopa2V5LCBleHQtPmtleSwgMTYpOyAvL3dlIG9ubHkgZ2V0IDE2IGJ5dGVzIGtleS53aHk/IFdCIDIwMDguNy4xCisKKwkJaWYgKChhbGcgJiBLRVlfVFlQRV9XRVA0MCkgJiYgKGllZWUtPmF1dGhfbW9kZSAhPTIpICkKKwkJeworCisJCQlzZXRLZXkoIGRldiwKKwkJCQkJaWR4LC8vRW50cnlObworCQkJCQlpZHgsIC8vS2V5SW5kZXgKKwkJCQkJYWxnLCAgLy9LZXlUeXBlCisJCQkJCXplcm8sIC8vTWFjQWRkcgorCQkJCQkwLCAgICAgICAgICAgICAgLy9EZWZhdWx0S2V5CisJCQkJCWtleSk7ICAgICAgICAgICAvL0tleUNvbnRlbnQKKwkJfQorCQllbHNlIGlmIChncm91cCkKKwkJeworCQkJaWVlZS0+Z3JvdXBfa2V5X3R5cGUgPSBhbGc7CisJCQlzZXRLZXkoIGRldiwKKwkJCQkJaWR4LC8vRW50cnlObworCQkJCQlpZHgsIC8vS2V5SW5kZXgKKwkJCQkJYWxnLCAgLy9LZXlUeXBlCisJCQkJCWJyb2FkY2FzdF9hZGRyLCAvL01hY0FkZHIKKwkJCQkJMCwgICAgICAgICAgICAgIC8vRGVmYXVsdEtleQorCQkJCQlrZXkpOyAgICAgICAgICAgLy9LZXlDb250ZW50CisJCX0KKwkJZWxzZSAvL3BhaXJ3aXNlIGtleQorCQl7CisJCQlzZXRLZXkoIGRldiwKKwkJCQkJNCwvL0VudHJ5Tm8KKwkJCQkJaWR4LCAvL0tleUluZGV4CisJCQkJCWFsZywgIC8vS2V5VHlwZQorCQkJCQkodTgqKWllZWUtPmFwX21hY19hZGRyLCAvL01hY0FkZHIKKwkJCQkJMCwgICAgICAgICAgICAgIC8vRGVmYXVsdEtleQorCQkJCQlrZXkpOyAgICAgICAgICAgLy9LZXlDb250ZW50CisJCX0KKworCisJfQorCitlbmRfaHdfc2VjOgorCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKKworfQorc3RhdGljIGludCByODE5Ml93eF9zZXRfYXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCQl1bmlvbiBpd3JlcV9kYXRhICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0PTA7CisJLy9wcmludGsoIj09PT0+JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X2F1dGgocHJpdi0+aWVlZTgwMjExLCBpbmZvLCAmKGRhdGEtPnBhcmFtKSwgZXh0cmEpOworCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X21sbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJLy9wcmludGsoIj09PT0+JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCWludCByZXQ9MDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X21sbWUocHJpdi0+aWVlZTgwMjExLCBpbmZvLCB3cnF1LCBleHRyYSk7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9nZW5faWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkJdW5pb24gaXdyZXFfZGF0YSAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisJICAgLy9wcmludGsoIj09PT0+JXMoKSwgbGVuOiVkXG4iLCBfX0ZVTkNUSU9OX18sIGRhdGEtPmxlbmd0aCk7CisJaW50IHJldD0wOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlkb3duKCZwcml2LT53eF9zZW0pOworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfZ2VuX2llKHByaXYtPmllZWU4MDIxMSwgZXh0cmEsIGRhdGEtPmRhdGEubGVuZ3RoKTsKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwkvL3ByaW50aygiPD09PT09PSVzKCksIHJldDolZFxuIiwgX19GVU5DVElPTl9fLCByZXQpOworCXJldHVybiByZXQ7CisKKworfQorCitzdGF0aWMgaW50IGR1bW15KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LGNoYXIgKmIpCit7CisJcmV0dXJuIC0xOworfQorCisKK3N0YXRpYyBpd19oYW5kbGVyIHI4MTkyX3d4X2hhbmRsZXJzW10gPQoreworCU5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV0NPTU1JVCAqLworCXI4MTkyX3d4X2dldF9uYW1lLCAgIAkgIC8qIFNJT0NHSVdOQU1FICovCisJZHVtbXksICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXTldJRCAqLworCWR1bW15LCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV05XSUQgKi8KKwlyODE5Ml93eF9zZXRfZnJlcSwgICAgICAgIC8qIFNJT0NTSVdGUkVRICovCisJcjgxOTJfd3hfZ2V0X2ZyZXEsICAgICAgICAvKiBTSU9DR0lXRlJFUSAqLworCXI4MTkyX3d4X3NldF9tb2RlLCAgICAgICAgLyogU0lPQ1NJV01PREUgKi8KKwlyODE5Ml93eF9nZXRfbW9kZSwgICAgICAgIC8qIFNJT0NHSVdNT0RFICovCisJcjgxOTJfd3hfc2V0X3NlbnMsICAgICAgICAvKiBTSU9DU0lXU0VOUyAqLworCXI4MTkyX3d4X2dldF9zZW5zLCAgICAgICAgLyogU0lPQ0dJV1NFTlMgKi8KKwlOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdSQU5HRSAqLworCXJ0bDgxODBfd3hfZ2V0X3JhbmdlLAkgIC8qIFNJT0NHSVdSQU5HRSAqLworCU5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1BSSVYgKi8KKwlOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdQUklWICovCisJTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU1RBVFMgKi8KKwlOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdTVEFUUyAqLworCWR1bW15LCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NQWSAqLworCWR1bW15LCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NQWSAqLworCU5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1RIUlNQWSAqLworCU5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1dJV1RIUlNQWSAqLworCXI4MTkyX3d4X3NldF93YXAsICAgICAgCSAgLyogU0lPQ1NJV0FQICovCisJcjgxOTJfd3hfZ2V0X3dhcCwgICAgICAgICAvKiBTSU9DR0lXQVAgKi8KKyNpZiAoV0lSRUxFU1NfRVhUID49IDE4KQorCXI4MTkyX3d4X3NldF9tbG1lLCAgICAgICAgICAgICAgICAgICAgIC8qIE1MTUUtLSAqLworI2Vsc2UKKwkgTlVMTCwKKyNlbmRpZgorCWR1bW15LCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdBUExJU1QgLS0gZGVwcmljYXRlZCAqLworCXI4MTkyX3d4X3NldF9zY2FuLCAgICAgICAgLyogU0lPQ1NJV1NDQU4gKi8KKwlyODE5Ml93eF9nZXRfc2NhbiwgICAgICAgIC8qIFNJT0NHSVdTQ0FOICovCisJcjgxOTJfd3hfc2V0X2Vzc2lkLCAgICAgICAvKiBTSU9DU0lXRVNTSUQgKi8KKwlyODE5Ml93eF9nZXRfZXNzaWQsICAgICAgIC8qIFNJT0NHSVdFU1NJRCAqLworCWR1bW15LCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV05JQ0tOICovCisJZHVtbXksICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXTklDS04gKi8KKwlOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIC0tIGhvbGUgLS0gKi8KKwlOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIC0tIGhvbGUgLS0gKi8KKwlyODE5Ml93eF9zZXRfcmF0ZSwgICAgICAgIC8qIFNJT0NTSVdSQVRFICovCisJcjgxOTJfd3hfZ2V0X3JhdGUsICAgICAgICAvKiBTSU9DR0lXUkFURSAqLworCXI4MTkyX3d4X3NldF9ydHMsICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUlRTICovCisJcjgxOTJfd3hfZ2V0X3J0cywgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdSVFMgKi8KKwlyODE5Ml93eF9zZXRfZnJhZywgICAgICAgIC8qIFNJT0NTSVdGUkFHICovCisJcjgxOTJfd3hfZ2V0X2ZyYWcsICAgICAgICAvKiBTSU9DR0lXRlJBRyAqLworCWR1bW15LCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1RYUE9XICovCisJZHVtbXksICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXVFhQT1cgKi8KKwlyODE5Ml93eF9zZXRfcmV0cnksICAgICAgIC8qIFNJT0NTSVdSRVRSWSAqLworCXI4MTkyX3d4X2dldF9yZXRyeSwgICAgICAgLyogU0lPQ0dJV1JFVFJZICovCisJcjgxOTJfd3hfc2V0X2VuYywgICAgICAgICAvKiBTSU9DU0lXRU5DT0RFICovCisJcjgxOTJfd3hfZ2V0X2VuYywgICAgICAgICAvKiBTSU9DR0lXRU5DT0RFICovCisJcjgxOTJfd3hfc2V0X3Bvd2VyLCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1BPV0VSICovCisJcjgxOTJfd3hfZ2V0X3Bvd2VyLCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1BPV0VSICovCisJTlVMTCwJCQkvKi0tLWhvbGUtLS0qLworCU5VTEwsIAkJCS8qLS0taG9sZS0tLSovCisJcjgxOTJfd3hfc2V0X2dlbl9pZSwvL05VTEwsIAkJCS8qIFNJT0NTSVdHRU5JRSAqLworCU5VTEwsIAkJCS8qIFNJT0NTSVdHRU5JRSAqLworCisjaWYgKFdJUkVMRVNTX0VYVCA+PSAxOCkKKwlyODE5Ml93eF9zZXRfYXV0aCwvL05VTEwsIAkJCS8qIFNJT0NTSVdBVVRIICovCisJTlVMTCwvL3I4MTkyX3d4X2dldF9hdXRoLC8vTlVMTCwgCQkJLyogU0lPQ1NJV0FVVEggKi8KKwlyODE5Ml93eF9zZXRfZW5jX2V4dCwgCQkJLyogU0lPQ1NJV0VOQ09ERUVYVCAqLworCU5VTEwsLy9yODE5Ml93eF9nZXRfZW5jX2V4dCwvL05VTEwsIAkJCS8qIFNJT0NTSVdFTkNPREVFWFQgKi8KKyNlbHNlCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKyNlbmRpZgorCU5VTEwsIAkJCS8qIFNJT0NTSVdQTUtTQSAqLworCU5VTEwsIAkJCSAvKi0tLWhvbGUtLS0qLworCit9OworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfcHJpdl9hcmdzIHI4MTkyX3ByaXZhdGVfYXJnc1tdID0geworCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDAsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiYmFkY3JjIgorCX0sCisKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4MSwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJhY3RpdmVzY2FuIgorCisJfSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4MiwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJyYXd0eCIKKwl9CisjaWZkZWYgSk9ITl9JT0NUTAorCSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4MywKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJyZWFkUkYiCisJfQorCSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4NCwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJ3cml0ZVJGIgorCX0KKwksCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDUsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAicmVhZEJCIgorCX0KKwksCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDYsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAid3JpdGVCQiIKKwl9CisJLAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHg3LAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInJlYWRuaWNiIgorCX0KKwksCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDgsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAid3JpdGVuaWNiIgorCX0KKwksCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDksCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiYXBpbmZvIgorCX0KKworI2VuZGlmCisJLAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHgzLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgImZvcmNlcmVzZXQiCisKKwl9CisKK307CisKKworc3RhdGljIGl3X2hhbmRsZXIgcjgxOTJfcHJpdmF0ZV9oYW5kbGVyW10gPSB7CisvLwlyODE5Ml93eF9zZXRfbW9uaXRvciwgIC8qIFNJT0NJV0ZJUlNUUFJJViAqLworCXI4MTkyX3d4X3NldF9jcmNtb24sICAgLypTSU9DSVdTRUNPTkRQUklWKi8KKy8vCXI4MTkyX3d4X3NldF9mb3JjZWFzc29jaWF0ZSwKKy8vCXI4MTkyX3d4X3NldF9iZWFjb25pbnRlcnZhbCwKKy8vCXI4MTkyX3d4X3NldF9tb25pdG9yX3R5cGUsCisJcjgxOTJfd3hfc2V0X3NjYW5fdHlwZSwKKwlyODE5Ml93eF9zZXRfcmF3dHgsCisjaWZkZWYgSk9ITl9JT0NUTAorCXI4MTkyX3d4X3JlYWRfcmVncywKKwlyODE5Ml93eF93cml0ZV9yZWdzLAorCXI4MTkyX3d4X3JlYWRfYmIsCisJcjgxOTJfd3hfd3JpdGVfYmIsCisJcjgxOTJfd3hfcmVhZF9uaWNiLAorCXI4MTkyX3d4X3dyaXRlX25pY2IsCisJcjgxOTJfd3hfZ2V0X2FwX3N0YXR1cywKKyNlbmRpZgorCS8vcjgxOTJfd3hfbnVsbCwKKwlyODE5Ml93eF9mb3JjZV9yZXNldCwKK307CisKKy8vI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworc3RydWN0IGl3X3N0YXRpc3RpY3MgKnI4MTkyX2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgIHN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcyogd3N0YXRzID0gJnByaXYtPndzdGF0czsKKwlpbnQgdG1wX2xldmVsID0gMDsKKwlpbnQgdG1wX3F1YWwgPSAwOworCWludCB0bXBfbm9pc2UgPSAwOworCWlmKGllZWUtPnN0YXRlIDwgSUVFRTgwMjExX0xJTktFRCkKKwl7CisJCXdzdGF0cy0+cXVhbC5xdWFsID0gMDsKKwkJd3N0YXRzLT5xdWFsLmxldmVsID0gMDsKKwkJd3N0YXRzLT5xdWFsLm5vaXNlID0gMDsKKwkJd3N0YXRzLT5xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX0FMTF9VUERBVEVEIHwgSVdfUVVBTF9EQk07CisJCXJldHVybiB3c3RhdHM7CisJfQorCisgICAgICAgdG1wX2xldmVsID0gKCZpZWVlLT5jdXJyZW50X25ldHdvcmspLT5zdGF0cy5yc3NpOworCXRtcF9xdWFsID0gKCZpZWVlLT5jdXJyZW50X25ldHdvcmspLT5zdGF0cy5zaWduYWw7CisJdG1wX25vaXNlID0gKCZpZWVlLT5jdXJyZW50X25ldHdvcmspLT5zdGF0cy5ub2lzZTsKKwkvL3ByaW50aygibGV2ZWw6JWQsIHF1YWw6JWQsIG5vaXNlOiVkXG4iLCB0bXBfbGV2ZWwsIHRtcF9xdWFsLCB0bXBfbm9pc2UpOworCisJd3N0YXRzLT5xdWFsLmxldmVsID0gdG1wX2xldmVsOworCXdzdGF0cy0+cXVhbC5xdWFsID0gdG1wX3F1YWw7CisJd3N0YXRzLT5xdWFsLm5vaXNlID0gdG1wX25vaXNlOworCXdzdGF0cy0+cXVhbC51cGRhdGVkID0gSVdfUVVBTF9BTExfVVBEQVRFRHwgSVdfUVVBTF9EQk07CisJcmV0dXJuIHdzdGF0czsKK30KKy8vI2VuZGlmCisKKworc3RydWN0IGl3X2hhbmRsZXJfZGVmICByODE5Ml93eF9oYW5kbGVyc19kZWY9eworCS5zdGFuZGFyZCA9IHI4MTkyX3d4X2hhbmRsZXJzLAorCS5udW1fc3RhbmRhcmQgPSBzaXplb2YocjgxOTJfd3hfaGFuZGxlcnMpIC8gc2l6ZW9mKGl3X2hhbmRsZXIpLAorCS5wcml2YXRlID0gcjgxOTJfcHJpdmF0ZV9oYW5kbGVyLAorCS5udW1fcHJpdmF0ZSA9IHNpemVvZihyODE5Ml9wcml2YXRlX2hhbmRsZXIpIC8gc2l6ZW9mKGl3X2hhbmRsZXIpLAorCS5udW1fcHJpdmF0ZV9hcmdzID0gc2l6ZW9mKHI4MTkyX3ByaXZhdGVfYXJncykgLyBzaXplb2Yoc3RydWN0IGl3X3ByaXZfYXJncyksCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisJLmdldF93aXJlbGVzc19zdGF0cyA9IHI4MTkyX2dldF93aXJlbGVzc19zdGF0cywKKyNlbmRpZgorCS5wcml2YXRlX2FyZ3MgPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKXI4MTkyX3ByaXZhdGVfYXJncywKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX3d4LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX3d4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJmN2E1NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfd3guaApAQCAtMCwwICsxLDIzIEBACisvKgorCVRoaXMgaXMgcGFydCBvZiBydGw4MTgwIE9wZW5Tb3VyY2UgZHJpdmVyIC0gdiAwLjMKKwlDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKwlSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQorCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydCBvZiB0aGUgb2ZmaWNpYWwgcmVhbHRlayBkcml2ZXIKKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uIGZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbgorCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzIDIxMDAgR1BMIGRyaXZlcgorCisJV2Ugd2FudCB0byB0YW5rcyB0aGUgQXV0aG9ycyBvZiBzdWNoIHByb2plY3RzIGFuZCB0aGUgTmRpc3dyYXBwZXIgcHJvamVjdCBBdXRob3JzLgorKi8KKworLyogdGhpcyBmaWxlICh3aWxsKSBjb250YWlucyB3aXJlbGVzcyBleHRlbnNpb24gaGFuZGxlcnMqLworCisjaWZuZGVmIFI4MTgwX1dYX0gKKyNkZWZpbmUgUjgxODBfV1hfSAorLy8jaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKy8vI2luY2x1ZGUgImllZWU4MDIxMS5oIgorZXh0ZXJuIHN0cnVjdCBpd19oYW5kbGVyX2RlZiByODE5Ml93eF9oYW5kbGVyc19kZWY7CisvKiBFbmFibGUgIHRoZSBydGw4MTl4X2NvcmUuYyB0byBzaGFyZSB0aGlzIGZ1bmN0aW9uLCBkYXZpZCAyMDA4LjkuMjIgKi8KK2V4dGVybiBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcjgxOTJfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfSFRHZW4uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfSFRHZW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzdiNmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9IVEdlbi5oCkBAIC0wLDAgKzEsMTMgQEAKKy8vCisvLyBJT1QgQWN0aW9uIGZvciBkaWZmZXJlbnQgQVAKKy8vCit0eXBlZGVmIGVudW0gX0hUX0lPVF9BQ1RJT057CisJSFRfSU9UX0FDVF9UWF9VU0VfQU1TRFVfNEsgPSAweDAwMDAwMDAxLAorCUhUX0lPVF9BQ1RfVFhfVVNFX0FNU0RVXzhLID0gMHgwMDAwMDAwMiwKKwlIVF9JT1RfQUNUX0RFQ0xBUkVfTUNTMTMgPSAweDAwMDAwMDA0LAorCUhUX0lPVF9BQ1RfRElTQUJMRV9FRENBX1RVUkJPID0gMHgwMDAwMDAwOCwKKwlIVF9JT1RfQUNUX01HTlRfVVNFX0NDS182TSA9IDB4MDAwMDAwMTAsCisJSFRfSU9UX0FDVF9DRERfRlNZTkMgPSAweDAwMDAwMDIwLAorCUhUX0lPVF9BQ1RfUFVSRV9OX01PREUgPSAweDAwMDAwMDQwLAorfUhUX0lPVF9BQ1RJT05fRSwgKlBIVF9JT1RfQUNUSU9OX0U7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfSFRUeXBlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX0hUVHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZjU4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX0hUVHlwZS5oCkBAIC0wLDAgKzEsMzkxIEBACisjaWZuZGVmIF9SODE5WFVfSFRUWVBFX0hfCisjZGVmaW5lIF9SODE5WFVfSFRUWVBFX0hfCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBIVCBDYXBhYmlsaXR5IGVsZW1lbnQgaXMgcHJlc2VudCBpbiBiZWFjb25zLCBhc3NvY2lhdGlvbiByZXF1ZXN0LAorLy8JcmVhc3NvY2lhdGlvbiByZXF1ZXN0IGFuZCBwcm9iZSByZXNwb25zZSBmcmFtZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vCisvLyBPcGVyYXRpb24gbW9kZSB2YWx1ZQorLy8KKyNkZWZpbmUgSFRfT1BNT0RFX05PX1BST1RFQ1QJCTAKKyNkZWZpbmUgSFRfT1BNT0RFX09QVElPTkFMCQkxCisjZGVmaW5lIEhUX09QTU9ERV80ME1IWl9QUk9URUNUCTIKKyNkZWZpbmUgSFRfT1BNT0RFX01JWEVECQkJMworCisvLworLy8gTUlNTyBQb3dlciBTYXZlIFNldGluZ3MKKy8vCisjZGVmaW5lIE1JTU9fUFNfU1RBVElDCQkJCTAKKyNkZWZpbmUgTUlNT19QU19EWU5BTUlDCQkJMQorI2RlZmluZSBNSU1PX1BTX05PTElNSVQJCQkzCisKKworLy8KKy8vCVRoZXJlIHNob3VsZCBiZSAxMjggYml0cyB0byBjb3ZlciBhbGwgb2YgdGhlIE1DUyByYXRlcy4gSG93ZXZlciwgc2luY2UKKy8vCTgxOTAgZG9lcyBub3Qgc3VwcG9ydCB0b28gbXVjaCByYXRlcywgb25lIGludGVnZXIgaXMgcXVpdGUgZW5vdWdoLgorLy8KKworI2RlZmluZSBzSFRDTG5nCTQKKworCisjZGVmaW5lIEhUX1NVUFBPUlRFRF9NQ1NfMVNTX0JJVE1BUAkJCQkJMHgwMDAwMDBmZgorI2RlZmluZSBIVF9TVVBQT1JURURfTUNTXzJTU19CSVRNQVAJCQkJCTB4MDAwMGZmMDAKKyNkZWZpbmUgSFRfU1VQUE9SVEVEX01DU18xU1NfMlNTX0JJVE1BUAkJCUhUX01DU18xU1NfQklUTUFQfEhUX01DU18xU1NfMlNTX0JJVE1BUAorCisKK3R5cGVkZWYgZW51bSBfSFRfTUNTX1JBVEV7CisJSFRfTUNTMCAgID0gMHgwMDAwMDAwMSwKKwlIVF9NQ1MxICAgPSAweDAwMDAwMDAyLAorCUhUX01DUzIgICA9IDB4MDAwMDAwMDQsCisJSFRfTUNTMyAgID0gMHgwMDAwMDAwOCwKKwlIVF9NQ1M0ICAgPSAweDAwMDAwMDEwLAorCUhUX01DUzUgICA9IDB4MDAwMDAwMjAsCisJSFRfTUNTNiAgID0gMHgwMDAwMDA0MCwKKwlIVF9NQ1M3ICAgPSAweDAwMDAwMDgwLAorCUhUX01DUzggICA9IDB4MDAwMDAxMDAsCisJSFRfTUNTOSAgID0gMHgwMDAwMDIwMCwKKwlIVF9NQ1MxMCA9IDB4MDAwMDA0MDAsCisJSFRfTUNTMTEgPSAweDAwMDAwODAwLAorCUhUX01DUzEyID0gMHgwMDAwMTAwMCwKKwlIVF9NQ1MxMyA9IDB4MDAwMDIwMDAsCisJSFRfTUNTMTQgPSAweDAwMDA0MDAwLAorCUhUX01DUzE1ID0gMHgwMDAwODAwMCwKKwkvLyBEbyBub3QgZGVmaW5lIE1DUzMyIGhlcmUgYWx0aG91Z2ggODE5MCBzdXBwb3J0IE1DUzMyCit9SFRfTUNTX1JBVEUsKlBIVF9NQ1NfUkFURTsKKworLy8KKy8vIFJlcHJlc2VudCBDaGFubmVsIFdpZHRoIGluIEhUIENhcGFiaWxpdGllcworLy8KK3R5cGVkZWYgZW51bSBfSFRfQ0hBTk5FTF9XSURUSHsKKwlIVF9DSEFOTkVMX1dJRFRIXzIwID0gMCwKKwlIVF9DSEFOTkVMX1dJRFRIXzIwXzQwID0gMSwKK31IVF9DSEFOTkVMX1dJRFRILCAqUEhUX0NIQU5ORUxfV0lEVEg7CisKKy8vCisvLyBSZXByZXNlbnQgRXh0ZW50aW9uIENoYW5uZWwgT2Zmc2V0IGluIEhUIENhcGFiaWxpdGllcworLy8gVGhpcyBpcyBhdmFpbGFibGUgb25seSBpbiA0ME1oeiBtb2RlLgorLy8KK3R5cGVkZWYgZW51bSBfSFRfRVhUQ0hOTF9PRkZTRVR7CisJSFRfRVhUQ0hOTF9PRkZTRVRfTk9fRVhUID0gMCwKKwlIVF9FWFRDSE5MX09GRlNFVF9VUFBFUiA9IDEsCisJSFRfRVhUQ0hOTF9PRkZTRVRfTk9fREVGID0gMiwKKwlIVF9FWFRDSE5MX09GRlNFVF9MT1dFUiA9IDMsCit9SFRfRVhUQ0hOTF9PRkZTRVQsICpQSFRfRVhUQ0hOTF9PRkZTRVQ7CisKK3R5cGVkZWYgZW51bSBfQ0hOTE9QeworCUNITkxPUF9OT05FID0gMCwgLy8gTm8gQWN0aW9uIG5vdworCUNITkxPUF9TQ0FOID0gMSwgLy8gU2NhbiBpbiBwcm9ncmVzcworCUNITkxPUF9TV0JXID0gMiwgLy8gQmFuZHdpZHRoIHN3aXRjaGluZyBpbiBwcm9ncmVzcworCUNITkxPUF9TV0NITkwgPSAzLCAvLyBTb2Z0d2FyZSBDaGFubmVsIHN3aXRjaGluZyBpbiBwcm9ncmVzcworfSBDSE5MT1AsICpQQ0hOTE9QOworCisvLyBEZXRlcm1pbmUgaWYgdGhlIENoYW5uZWwgT3BlcmF0aW9uIGlzIGluIHByb2dyZXNzCisjZGVmaW5lIENISExPUF9JTl9QUk9HUkVTUyhfcEhUSW5mbykJXAorCQkoKF9wSFRJbmZvKS0+Q2hubE9wID4gQ0hOTE9QX05PTkUpID8gVFJVRSA6IEZBTFNFCisKKwordHlwZWRlZiBlbnVtIF9IVF9BQ1RJT057CisJQUNUX1JFQ09NTUFORF9XSURUSAkJPSAwLAorCUFDVF9NSU1PX1BXUl9TQVZFIAkJPSAxLAorCUFDVF9QU01QCQkJCQk9IDIsCisJQUNUX1NFVF9QQ09fUEhBU0UJCT0gMywKKwlBQ1RfTUlNT19DSExfTUVBU1VSRQk9IDQsCisJQUNUX1JFQ0lQUk9DSVRZX0NPUlJFQ1QJPSA1LAorCUFDVF9NSU1PX0NTSV9NQVRSSUNTCQk9IDYsCisJQUNUX01JTU9fTk9DT01QUl9TVEVFUgk9IDcsCisJQUNUX01JTU9fQ09NUFJfU1RFRVIJCT0gOCwKKwlBQ1RfQU5URU5OQV9TRUxFQ1QJCT0gOSwKK30gSFRfQUNUSU9OLCAqUEhUX0FDVElPTjsKKworCisvKiAyMDA3LzA2LzA3IE1IIERlZmluZSBzdWItY2FycmllciBtb2RlIGZvciA0ME1IWi4gKi8KK3R5cGVkZWYgZW51bSBfSFRfQmFuZHdpZHRoXzQwTUhaX1N1Yl9DYXJyaWVyeworCVNDX01PREVfRFVQTElDQVRFID0gMCwKKwlTQ19NT0RFX0xPV0VSID0gMSwKKwlTQ19NT0RFX1VQUEVSID0gMiwKKwlTQ19NT0RFX0ZVTEw0ME1IWiA9IDMsCit9SFRfQlc0MF9TQ19FOworCit0eXBlZGVmCXN0cnVjdCBfSFRfQ0FQQUJJTElUWV9FTEV7CisKKwkvL0hUIGNhcGFiaWxpdHkgaW5mbworCXU4CUFkdkNvZGluZzoxOworCXU4CUNobFdpZHRoOjE7CisJdTgJTWltb1B3clNhdmU6MjsKKwl1OAlHcmVlbkZpZWxkOjE7CisJdTgJU2hvcnRHSTIwTWh6OjE7CisJdTgJU2hvcnRHSTQwTWh6OjE7CisJdTgJVHhTVEJDOjE7CisJdTgJUnhTVEJDOjI7CisJdTgJRGVsYXlCQToxOworCXU4CU1heEFNU0RVU2l6ZToxOworCXU4CURzc0NDazoxOworCXU4CVBTTVA6MTsKKwl1OAlSc3ZkMToxOworCXU4CUxTaWdUeG9wUHJvdGVjdDoxOworCisJLy9NQUMgSFQgcGFyYW1ldGVycyBpbmZvCisJdTgJTWF4UnhBTVBEVUZhY3RvcjoyOworCXU4CU1QRFVEZW5zaXR5OjM7CisJdTgJUnN2ZDI6MzsKKworCS8vU3VwcG9ydGVkIE1DUyBzZXQKKwl1OAlNQ1NbMTZdOworCisKKwkvL0V4dGVuZGVkIEhUIENhcGFiaWxpdHkgSW5mbworCXUxNglFeHRIVENhcEluZm87CisKKwkvL1RYQkYgQ2FwYWJpbGl0aWVzCisJdTgJVHhCRkNhcFs0XTsKKworCS8vQW50ZW5uYSBTZWxlY3Rpb24gQ2FwYWJpbGl0aWVzCisJdTgJQVNDYXA7CisKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBIVF9DQVBBQklMSVRZX0VMRSwgKlBIVF9DQVBBQklMSVRZX0VMRTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBIVCBJbmZvcm1hdGlvbiBlbGVtZW50IGlzIHByZXNlbnQgaW4gYmVhY29ucworLy8gT25seSBBUCBpcyByZXF1aXJlZCB0byBpbmNsdWRlIHRoaXMgZWxlbWVudAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgX0hUX0lORk9STUFUSU9OX0VMRXsKKwl1OAlDb250cm9sQ2hsOworCisJdTgJRXh0Q2hsT2Zmc2V0OjI7CisJdTgJUmVjb21tZW1kZWRUeFdpZHRoOjE7CisJdTgJUklGUzoxOworCXU4CVBTTVBBY2Nlc3NPbmx5OjE7CisJdTgJU3J2SW50R3JhbnVsYXJpdHk6MzsKKworCXU4CU9wdE1vZGU6MjsKKwl1OAlOb25HRkRldlByZXNlbnQ6MTsKKwl1OAlSZXZkMTo1OworCXU4CVJldmQyOjg7CisKKwl1OAlSc3ZkMzo2OworCXU4CUR1YWxCZWFjb246MTsKKwl1OAlEdWFsQ1RTUHJvdGVjdDoxOworCisJdTgJU2Vjb25kYXJ5QmVhY29uOjE7CisJdTgJTFNpZ1R4b3BQcm90ZWN0RnVsbDoxOworCXU4CVBjb0FjdGl2ZToxOworCXU4CVBjb1BoYXNlOjE7CisJdTgJUnN2ZDQ6NDsKKworCXU4CUJhc2ljTVNDWzE2XTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBIVF9JTkZPUk1BVElPTl9FTEUsICpQSFRfSU5GT1JNQVRJT05fRUxFOworCisvLworLy8gTUlNTyBQb3dlciBTYXZlIGNvbnRyb2wgZmllbGQuCisvLyBUaGlzIGlzIGFwcGVhciBpbiBNSU1PIFBvd2VyIFNhdmUgQWN0aW9uIEZyYW1lCisvLwordHlwZWRlZiBzdHJ1Y3QgX01JTU9QU19DVFJMeworCXU4CU1pbW9Qc0VuYWJsZToxOworCXU4CU1pbW9Qc01vZGU6MTsKKwl1OAlSZXNlcnZlZDo2OworfSBNSU1PUFNfQ1RSTCwgKlBNSU1PUFNfQ1RSTDsKKwordHlwZWRlZiBlbnVtIF9IVF9TUEVDX1ZFUnsKKwlIVF9TUEVDX1ZFUl9JRUVFID0gMCwKKwlIVF9TUEVDX1ZFUl9FV0MgPSAxLAorfUhUX1NQRUNfVkVSLCAqUEhUX1NQRUNfVkVSOworCit0eXBlZGVmIGVudW0gX0hUX0FHR1JFX01PREVfRXsKKwlIVF9BR0dfQVVUTyA9IDAsCisJSFRfQUdHX0ZPUkNFX0VOQUJMRSA9IDEsCisJSFRfQUdHX0ZPUkNFX0RJU0FCTEUgPSAyLAorfUhUX0FHR1JFX01PREVfRSwgKlBIVF9BR0dSRV9NT0RFX0U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgVGhlIERhdGEgc3RydWN0dXJlIGlzIHVzZWQgdG8ga2VlcCBIVCByZWxhdGVkIHZhcmlhYmxlcyB3aGVuIGNhcmQgaXMKKy8vICBjb25maWd1cmVkIGFzIG5vbi1BUCBTVEEgbW9kZS4gICoqTm90ZSoqICBDdXJyZW50X3h4eCBzaG91bGQgYmUgc2V0CisvLwl0byBkZWZhdWx0IHZhbHVlIGluIEhUSW5pdGlhbGl6ZUhUSW5mbygpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCBfUlRfSElHSF9USFJPVUdIUFVUeworLy8JREVDTEFSRV9SVF9PQkpFQ1QoX1JUX0hJR0hfVEhST1VHSFBVVCk7CisJdTgJCQkJYkVuYWJsZUhUOworCXU4CQkJCWJDdXJyZW50SFRTdXBwb3J0OworCisJdTgJCQkJYlJlZ0JXNDBNSHo7CQkJCS8vIFR4IDQwTUh6IGNoYW5uZWwgY2FwYWJsaXR5CisJdTgJCQkJYkN1ckJXNDBNSHo7CQkJCS8vIFR4IDQwTUh6IGNoYW5uZWwgY2FwYWJpbGl0eQorCisJdTgJCQkJYlJlZ1Nob3J0R0k0ME1IejsJCQkvLyBUeCBTaG9ydCBHSSBmb3IgNDBNaHoKKwl1OAkJCQliQ3VyU2hvcnRHSTQwTUh6OwkJCS8vIFR4IFNob3J0IEdJIGZvciA0ME1IegorCisJdTgJCQkJYlJlZ1Nob3J0R0kyME1IejsJCQkvLyBUeCBTaG9ydCBHSSBmb3IgMjBNSHoKKwl1OAkJCQliQ3VyU2hvcnRHSTIwTUh6OwkJCS8vIFR4IFNob3J0IEdJIGZvciAyME1IegorCisJdTgJCQkJYlJlZ1N1cHBDQ0s7CQkJCS8vIFR4IENDSyByYXRlIGNhcGFiaWxpdHkKKwl1OAkJCQliQ3VyU3VwcENDSzsJCQkJLy8gVHggQ0NLIHJhdGUgY2FwYWJpbGl0eQorCisJLy8gODAyLjExbiBzcGVjIHZlcnNpb24gZm9yICJwZWVyIgorCUhUX1NQRUNfVkVSCQkJZVBlZXJIVFNwZWNWZXI7CisKKworCS8vIEhUIHJlbGF0ZWQgaW5mb3JtYXRpb24gZm9yICJTZWxmIgorCUhUX0NBUEFCSUxJVFlfRUxFCVNlbGZIVENhcDsJCQkJCS8vIFRoaXMgaXMgSFQgY2FwIGVsZW1lbnQgc2VudCB0byBwZWVyIFNUQSwgd2hpY2ggYWxzbyBpbmRpY2F0ZSBIVCBSeCBjYXBhYmlsaXRpZXMuCisJSFRfSU5GT1JNQVRJT05fRUxFCVNlbGZIVEluZm87CQkJCQkvLyBUaGlzIGlzIEhUIGluZm8gZWxlbWVudCBzZW50IHRvIHBlZXIgU1RBLCB3aGljaCBhbHNvIGluZGljYXRlIEhUIFJ4IGNhcGFiaWxpdGllcy4KKworCS8vIEhUIHJlbGF0ZWQgaW5mb3JtYXRpb24gZm9yICJQZWVyIgorCXU4CQkJCVBlZXJIVENhcEJ1ZlszMl07CisJdTgJCQkJUGVlckhUSW5mb0J1ZlszMl07CisKKworCS8vIEEtTVNEVSByZWxhdGVkCisJdTgJCQkJYkFNU0RVX1N1cHBvcnQ7CQkJLy8gVGhpcyBpbmRpY2F0ZXMgVHggQS1NU0RVIGNhcGFiaWxpdHkKKwl1MTYJCQkJbkFNU0RVX01heFNpemU7CQkJLy8gVGhpcyBpbmRpY2F0ZXMgVHggQS1NU0RVIGNhcGFiaWxpdHkKKwl1OAkJCQliQ3VycmVudF9BTVNEVV9TdXBwb3J0OwkvLyBUaGlzIGluZGljYXRlcyBUeCBBLU1TRFUgY2FwYWJpbGl0eQorCXUxNgkJCQluQ3VycmVudF9BTVNEVV9NYXhTaXplOwkvLyBUaGlzIGluZGljYXRlcyBUeCBBLU1TRFUgY2FwYWJpbGl0eQorCisKKwkvLyBBTVBEVSAgcmVsYXRlZCA8MjAwNi4wOC4xMCBFbWlseT4KKwl1OAkJCQliQU1QRFVFbmFibGU7CQkJCS8vIFRoaXMgaW5kaWNhdGUgVHggQS1NUERVIGNhcGFiaWxpdHkKKwl1OAkJCQliQ3VycmVudEFNUERVRW5hYmxlOwkJLy8gVGhpcyBpbmRpY2F0ZSBUeCBBLU1QRFUgY2FwYWJpbGl0eQorCXU4CQkJCUFNUERVX0ZhY3RvcjsJCQkJLy8gVGhpcyBpbmRpY2F0ZSBUeCBBLU1QRFUgY2FwYWJpbGl0eQorCXU4CQkJCUN1cnJlbnRBTVBEVUZhY3RvcjsJCS8vIFRoaXMgaW5kaWNhdGUgVHggQS1NUERVIGNhcGFiaWxpdHkKKwl1OAkJCQlNUERVX0RlbnNpdHk7CQkJCS8vIFRoaXMgaW5kaWNhdGUgVHggQS1NUERVIGNhcGFiaWxpdHkKKwl1OAkJCQlDdXJyZW50TVBEVURlbnNpdHk7CQkJLy8gVGhpcyBpbmRpY2F0ZSBUeCBBLU1QRFUgY2FwYWJpbGl0eQorCisJLy8gRm9yY2VkIEEtTVBEVSBlbmFibGUKKwlIVF9BR0dSRV9NT0RFX0UJRm9yY2VkQU1QRFVNb2RlOworCXU4CQkJCUZvcmNlZEFNUERVRmFjdG9yOworCXU4CQkJCUZvcmNlZE1QRFVEZW5zaXR5OworCisJLy8gRm9yY2VkIEEtTVNEVSBlbmFibGUKKwlIVF9BR0dSRV9NT0RFX0UJRm9yY2VkQU1TRFVNb2RlOworCXUxNgkJCQlGb3JjZWRBTVNEVU1heFNpemU7CisKKwl1OAkJCQliRm9yY2VkU2hvcnRHSTsKKworCXU4CQkJCUN1cnJlbnRPcE1vZGU7CisKKwkvLyBNSU1PIFBTIHJlbGF0ZWQKKwl1OAkJCQlTZWxmTWltb1BzOworCXU4CQkJCVBlZXJNaW1vUHM7CisKKwkvLyA0ME1IeiBDaGFubmVsIE9mZnNldCBzZXR0aW5ncy4KKwlIVF9FWFRDSE5MX09GRlNFVAlDdXJTVEFFeHRDaG5sT2Zmc2V0OworCXU4CQkJCWJDdXJUeEJXNDBNSHo7CS8vIElmIHdlIHVzZSA0MCBNSHogdG8gVHgKKwl1OAkJCQlQZWVyQmFuZHdpZHRoOworCisJLy8gRm9yIEJhbmR3aWR0aCBTd2l0Y2hpbmcKKwl1OAkJCQliU3dCd0luUHJvZ3Jlc3M7CisJQ0hOTE9QCQkJCUNobmxPcDsgLy8gc29mdHdhcmUgc3dpdGNoaW5nIGNoYW5uZWwgaW4gcHJvZ3Jlc3MuIEJ5IEJydWNlLCAyMDA4LTAyLTE1LgorCXU4CQkJCVN3QndTdGVwOworCS8vUlRfVElNRVIJCQlTd0J3VGltZXI7CisJc3RydWN0IHRpbWVyX2xpc3QJCVN3QndUaW1lcjsKKworCS8vIEZvciBSZWFsdGVrIHByb3ByaWV0YXJ5IEEtTVBEVSBmYWN0b3IgZm9yIGFnZ3JlZ2F0aW9uCisJdTgJCQkJYlJlZ1JUMlJUQWdncmVnYXRpb247CisJdTgJCQkJYkN1cnJlbnRSVDJSVEFnZ3JlZ2F0aW9uOworCXU4CQkJCWJDdXJyZW50UlQyUlRMb25nU2xvdFRpbWU7CisJdTgJCQkJc3pSVDJSVEFnZ0J1ZmZlclsxMF07CisKKwkvLyBSeCBSZW9yZGVyIGNvbnRyb2wKKwl1OAkJCQliUmVnUnhSZW9yZGVyRW5hYmxlOworCXU4CQkJCWJDdXJSeFJlb3JkZXJFbmFibGU7CisJdTgJCQkJUnhSZW9yZGVyV2luU2l6ZTsKKwl1OAkJCQlSeFJlb3JkZXJQZW5kaW5nVGltZTsKKwl1MTYJCQkJUnhSZW9yZGVyRHJvcENvdW50ZXI7CisKKyNpZmRlZiBVU0JfVFhfRFJJVkVSX0FHR1JFR0FUSU9OX0VOQUJMRQorCXU4CQkJCVVzYlR4QWdnck51bTsKKyNlbmRpZgorI2lmZGVmIFVTQl9SWF9BR0dSRUdBVElPTl9TVVBQT1JUCisJdTgJCQkJVXNiUnhGd0FnZ3JFbjsKKwl1OAkJCQlVc2JSeEZ3QWdnclBhZ2VOdW07CisJdTgJCQkJVXNiUnhGd0FnZ3JQYWNrZXROdW07CisJdTgJCQkJVXNiUnhGd0FnZ3JUaW1lb3V0OworI2VuZGlmCisKKwkvLyBBZGQgZm9yIEJyb2FkY29tKExpbmtzeXMpIElPVC4gSm9zZXBoCisJdTgJCQkJYklzUGVlckJjbTsKKworCS8vIEZvciBJT1QgaXNzdWUuCisJdTMyCQkJCQlJT1RBY3Rpb247Cit9UlRfSElHSF9USFJPVUdIUFVULCAqUFJUX0hJR0hfVEhST1VHSFBVVDsKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGhlIERhdGEgc3RydWN0dXJlIGlzIHVzZWQgdG8ga2VlcCBIVCByZWxhdGVkIHZhcmlhYmxlIGZvciAiZWFjaCBTdGEiCisvLyB3aGVuIGNhcmQgaXMgY29uZmlndXJlZCBhcyAiQVAgbW9kZSIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IF9SVF9IVElORk9fU1RBX0VOVFJZeworCXU4CQkJYkVuYWJsZUhUOworCisJdTgJCQliU3VwcG9ydENjazsKKworCXUxNgkJCUFNU0RVX01heFNpemU7CisKKwl1OAkJCUFNUERVX0ZhY3RvcjsKKwl1OAkJCU1QRFVfRGVuc2l0eTsKKworCXU4CQkJSFRIaWdoZXN0T3BlcmFSYXRlOworCisJdTgJCQliQnc0ME1IejsKKworCXU4CQkJTWltb1BzOworCisJdTgJCQlNY3NSYXRlU2V0WzE2XTsKKworCit9UlRfSFRJTkZPX1NUQV9FTlRSWSwgKlBSVF9IVElORk9fU1RBX0VOVFJZOworCisKKworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgRGF0YSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBrZWVwIEhUIHJlbGF0ZWQgdmFyaWFibGUgZm9yICJlYWNoIEFQIgorLy8gd2hlbiBjYXJkIGlzIGNvbmZpZ3VyZWQgYXMgIlNUQSBtb2RlIgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgX0JTU19IVHsKKworCXU4CQkJCWJkU3VwcG9ydEhUOworCisJLy8gSFQgcmVsYXRlZCBlbGVtZW50cworCXU4CQkJCQliZEhUQ2FwQnVmWzMyXTsKKwl1MTYJCQkJCWJkSFRDYXBMZW47CisJdTgJCQkJCWJkSFRJbmZvQnVmWzMyXTsKKwl1MTYJCQkJCWJkSFRJbmZvTGVuOworCisJSFRfU1BFQ19WRVIJCQkJYmRIVFNwZWNWZXI7CisJLy9IVF9DQVBBQklMSVRZX0VMRQkJCWJkSFRDYXBFbGU7CisJLy9IVF9JTkZPUk1BVElPTl9FTEUJCWJkSFRJbmZvRWxlOworCisJdTgJCQkJCWJkUlQyUlRBZ2dyZWdhdGlvbjsKKwl1OAkJCQkJYmRSVDJSVExvbmdTbG90VGltZTsKK31CU1NfSFQsICpQQlNTX0hUOworCit0eXBlZGVmIHN0cnVjdCBfTUlNT19SU1NJeworCXUzMglFbmFibGVBbnRlbm5hOworCXUzMglBbnRlbm5hQTsKKwl1MzIgCUFudGVubmFCOworCXUzMiAJQW50ZW5uYUM7CisJdTMyIAlBbnRlbm5hRDsKKwl1MzIJQXZlcmFnZTsKK31NSU1PX1JTU0ksICpQTUlNT19SU1NJOworCit0eXBlZGVmIHN0cnVjdCBfTUlNT19FVk17CisJdTMyCUVWTTE7CisJdTMyICAgIEVWTTI7Cit9TUlNT19FVk0sICpQTUlNT19FVk07CisKK3R5cGVkZWYgc3RydWN0IF9GQUxTRV9BTEFSTV9TVEFUSVNUSUNTeworCXUzMglDbnRfUGFyaXR5X0ZhaWw7CisJdTMyICAgIENudF9SYXRlX0lsbGVnYWw7CisJdTMyCUNudF9DcmM4X2ZhaWw7CisJdTMyCUNudF9hbGw7Cit9RkFMU0VfQUxBUk1fU1RBVElTVElDUywgKlBGQUxTRV9BTEFSTV9TVEFUSVNUSUNTOworCisKKworI2VuZGlmIC8vX19JTkNfSFRUWVBFX0gKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9jbWRwa3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfY21kcGt0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQxOWE4NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfY21kcGt0LmMKQEAgLTAsMCArMSw3OTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAoYykgQ29weXJpZ2h0IDIwMDgsIFJlYWxURUsgVGVjaG5vbG9naWVzIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIE1vZHVsZToJcjgxOXh1c2JfY21kcGt0LmMJKFJUTDgxOTAgVFgvUlggY29tbWFuZCBwYWNrZXQgaGFuZGxlciBTb3VyY2UgQyBGaWxlKQorCisgTm90ZTogICAgICBUaGUgbW9kdWxlIGlzIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyBUWCBhbmQgUlggY29tbWFuZCBwYWNrZXQuCisJCQkxLiBUWCA6IFNlbmQgc2V0IGFuZCBxdWVyeSBjb25maWd1cmF0aW9uIGNvbW1hbmQgcGFja2V0LgorCQkJMi4gUlggOiBSZWNlaXZlIHR4IGZlZWRiYWNrLCBiZWFjb24gc3RhdGUsIHF1ZXJ5IGNvbmZpZ3VyYXRpb24KKwkJCQljb21tYW5kIHBhY2tldC4KKworIEZ1bmN0aW9uOgorCisgRXhwb3J0OgorCisgQWJicmV2OgorCisgSGlzdG9yeToKKwlEYXRhCQlXaG8JCVJlbWFyaworCisJMDUvMDYvMjAwOCAgYW15ICAgIAlDcmVhdGUgaW5pdGlhbCB2ZXJzaW9uIHBvcnRpbmcgZnJvbSB3aW5kb3dzIGRyaXZlci4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInI4MTkyVS5oIgorI2luY2x1ZGUgInI4MTl4VV9jbWRwa3QuaCIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIExvY2FsIENvbnN0YW50LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIERlYnVnIGNvbnN0YW50Ki8KKyNkZWZpbmUJCUNNUEtfREVCT1VOQ0VfQ05UCQkJMQorLyogMjAwNy8xMC8yNCBNSCBBZGQgZm9yIHByaW50aW5nIGEgcmFuZ2Ugb2YgZGF0YS4gKi8KKyNkZWZpbmUJCUNNUEtfUFJJTlQoQWRkcmVzcylcCit7XAorCXVuc2lnbmVkIGNoYXIJaTtcCisJdTMyCXRlbXBbMTBdO1wKKwlcCisJbWVtY3B5KHRlbXAsIEFkZHJlc3MsIDQwKTtcCisJZm9yIChpID0gMDsgaSA8NDA7IGkrPTQpXAorCQlwcmludGsoIlxyXG4gJTA4eCIsIHRlbXBbaV0pO1wKK31cCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBmdW5jdGlvbnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitydF9zdGF0dXMKK1NlbmRUeENvbW1hbmRQYWNrZXQoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl2b2lkKiAJCQlwRGF0YSwKKwl1MzIJCQkJRGF0YUxlbgorCSkKK3sKKwlydF9zdGF0dXMJcnRTdGF0dXMgPSBSVF9TVEFUVVNfU1VDQ0VTUzsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAgICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc2tfYnVmZgkgICAgKnNrYjsKKwljYl9kZXNjCQkgICAgKnRjYl9kZXNjOworCXVuc2lnbmVkIGNoYXIJICAgICpwdHJfYnVmOworCS8vYm9vbAliTGFzdEluaXRQYWNrZXQgPSBmYWxzZTsKKworCS8vUGxhdGZvcm1BY3F1aXJlU3BpbkxvY2soQWRhcHRlciwgUlRfVFhfU1BJTkxPQ0spOworCisJLy9HZXQgVENCIGFuZCBsb2NhbCBidWZmZXIgZnJvbSBjb21tb24gcG9vbC4gKEl0IGlzIHNoYXJlZCBieSBDbWRRLCBNZ250USwgYW5kIFVTQiBjb2FsZXNjZSBEYXRhUSkKKwlza2IgID0gZGV2X2FsbG9jX3NrYihVU0JfSFdERVNDX0hFQURFUl9MRU4gKyBEYXRhTGVuICsgNCk7CisJbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopKHNrYi0+Y2IpLCZkZXYsc2l6ZW9mKGRldikpOworCXRjYl9kZXNjID0gKGNiX2Rlc2MqKShza2ItPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOworCXRjYl9kZXNjLT5xdWV1ZV9pbmRleCA9IFRYQ01EX1FVRVVFOworCXRjYl9kZXNjLT5iQ21kT3JJbml0ID0gREVTQ19QQUNLRVRfVFlQRV9OT1JNQUw7CisJdGNiX2Rlc2MtPmJMYXN0SW5pUGt0ID0gMDsKKwlza2JfcmVzZXJ2ZShza2IsIFVTQl9IV0RFU0NfSEVBREVSX0xFTik7CisJcHRyX2J1ZiA9IHNrYl9wdXQoc2tiLCBEYXRhTGVuKTsKKwltZW1zZXQocHRyX2J1ZiwwLERhdGFMZW4pOworCW1lbWNweShwdHJfYnVmLHBEYXRhLERhdGFMZW4pOworCXRjYl9kZXNjLT50eGJ1Zl9zaXplPSAodTE2KURhdGFMZW47CisKKwlpZighcHJpdi0+aWVlZTgwMjExLT5jaGVja19uaWNfZW5vdWdoX2Rlc2MoZGV2LHRjYl9kZXNjLT5xdWV1ZV9pbmRleCl8fAorCQkJKCFza2JfcXVldWVfZW1wdHkoJnByaXYtPmllZWU4MDIxMS0+c2tiX3dhaXRRW3RjYl9kZXNjLT5xdWV1ZV9pbmRleF0pKXx8XAorCQkJKHByaXYtPmllZWU4MDIxMS0+cXVldWVfc3RvcCkgKSB7CisJCQlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLCI9PT09PT09PT09PT09PT09PT09TlVMTCBwYWNrZXQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PiB0eCBmdWxsIVxuIik7CisJCQlza2JfcXVldWVfdGFpbCgmcHJpdi0+aWVlZTgwMjExLT5za2Jfd2FpdFFbdGNiX2Rlc2MtPnF1ZXVlX2luZGV4XSwgc2tiKTsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPmllZWU4MDIxMS0+c29mdG1hY19oYXJkX3N0YXJ0X3htaXQoc2tiLGRldik7CisJCX0KKworCS8vUGxhdGZvcm1SZWxlYXNlU3BpbkxvY2soQWRhcHRlciwgUlRfVFhfU1BJTkxPQ0spOworCXJldHVybiBydFN0YXR1czsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246CWNtcGtfbWVzc2FnZV9oYW5kbGVfdHgoKQorICoKKyAqIE92ZXJ2aWV3OglEcml2ZXIgaW50ZXJuYWwgbW9kdWxlIGNhbiBjYWxsIHRoZSBBUEkgdG8gc2VuZCBtZXNzYWdlIHRvCisgKgkJCQlmaXJtd2FyZSBzaWRlLiBGb3IgZXhhbXBsZSwgeW91IGNhbiBzZW5kIGEgZGVidWcgY29tbWFuZCBwYWNrZXQuCisgKgkJCQlPciB5b3UgY2FuIHNlbmQgYSByZXF1ZXN0IGZvciBGVyB0byBtb2RpZnkgUkxYNDE4MSBMQlVTIEhXIGJhbmsuCisgKgkJCQlPdGhlcndpc2UsIHlvdSBjYW4gY2hhbmdlIE1BQy9QSFQvUkYgcmVnaXN0ZXIgYnkgZmlybXdhcmUgYXQKKyAqCQkJCXJ1biB0aW1lLiBXZSBkbyBub3Qgc3VwcG9ydCBtZXNzYWdlIG1vcmUgdGhhbiBvbmUgc2VnbWVudCBub3cuCisgKgorICogSW5wdXQ6CQlOT05FCisgKgorICogT3V0cHV0OgkJTk9ORQorICoKKyAqIFJldHVybjoJCU5PTkUKKyAqCisgKiBSZXZpc2VkIEhpc3Rvcnk6CisgKglXaGVuCQlXaG8JCVJlbWFyaworICoJMDUvMDYvMjAwOAlhbXkJCXBvcnRpbmcgZnJvbSB3aW5kb3dzIGNvZGUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworIGV4dGVybglydF9zdGF0dXMJY21wa19tZXNzYWdlX2hhbmRsZV90eCgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXU4Kgljb2RldmlydHVhbGFkZHJlc3MsCisJdTMyCXBhY2tldHR5cGUsCisJdTMyCWJ1ZmZlcl9sZW4pCit7CisKKwlib29sIAkgICAgcnRfc3RhdHVzID0gdHJ1ZTsKKyNpZmRlZiBSVEw4MTkyVQorCXJldHVybiBydF9zdGF0dXM7CisjZWxzZQorCXN0cnVjdCByODE5Ml9wcml2ICAgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUxNgkJICAgIGZyYWdfdGhyZXNob2xkOworCXUxNgkJICAgIGZyYWdfbGVuZ3RoLCBmcmFnX29mZnNldCA9IDA7CisJLy91MTYJCSAgICB0b3RhbF9zaXplOworCS8vaW50CQkgICAgaTsKKworCXJ0X2Zpcm13YXJlCSAgICAqcGZpcm13YXJlID0gcHJpdi0+cEZpcm13YXJlOworCXN0cnVjdCBza19idWZmCSAgICAqc2tiOworCXVuc2lnbmVkIGNoYXIJICAgICpzZWdfcHRyOworCWNiX2Rlc2MJCSAgICAqdGNiX2Rlc2M7CisJdTggICAgICAgICAgICAgICAgICBiTGFzdEluaVBrdDsKKworCWZpcm13YXJlX2luaXRfcGFyYW0oZGV2KTsKKwkvL0ZyYWdtZW50YXRpb24gbWlnaHQgYmUgcmVxdWlyZWQKKwlmcmFnX3RocmVzaG9sZCA9IHBmaXJtd2FyZS0+Y21kcGFja2V0X2ZyYWdfdGhyZXNvbGQ7CisJZG8geworCQlpZigoYnVmZmVyX2xlbiAtIGZyYWdfb2Zmc2V0KSA+IGZyYWdfdGhyZXNob2xkKSB7CisJCQlmcmFnX2xlbmd0aCA9IGZyYWdfdGhyZXNob2xkIDsKKwkJCWJMYXN0SW5pUGt0ID0gMDsKKworCQl9IGVsc2UgeworCQkJZnJhZ19sZW5ndGggPSBidWZmZXJfbGVuIC0gZnJhZ19vZmZzZXQ7CisJCQliTGFzdEluaVBrdCA9IDE7CisKKwkJfQorCisJCS8qIEFsbG9jYXRlIHNrYiBidWZmZXIgdG8gY29udGFpbiBmaXJtd2FyZSBpbmZvIGFuZCB0eCBkZXNjcmlwdG9yIGluZm8KKwkJICogYWRkIDQgdG8gYXZvaWQgcGFja2V0IGFwcGVuZGluZyBvdmVyZmxvdy4KKwkJICogKi8KKwkJI2lmZGVmIFJUTDgxOTJVCisJCXNrYiAgPSBkZXZfYWxsb2Nfc2tiKFVTQl9IV0RFU0NfSEVBREVSX0xFTiArIGZyYWdfbGVuZ3RoICsgNCk7CisJCSNlbHNlCisJCXNrYiAgPSBkZXZfYWxsb2Nfc2tiKGZyYWdfbGVuZ3RoICsgNCk7CisJCSNlbmRpZgorCQltZW1jcHkoKHVuc2lnbmVkIGNoYXIgKikoc2tiLT5jYiksJmRldixzaXplb2YoZGV2KSk7CisJCXRjYl9kZXNjID0gKGNiX2Rlc2MqKShza2ItPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOworCQl0Y2JfZGVzYy0+cXVldWVfaW5kZXggPSBUWENNRF9RVUVVRTsKKwkJdGNiX2Rlc2MtPmJDbWRPckluaXQgPSBwYWNrZXR0eXBlOworCQl0Y2JfZGVzYy0+Ykxhc3RJbmlQa3QgPSBiTGFzdEluaVBrdDsKKworCQkjaWZkZWYgUlRMODE5MlUKKwkJc2tiX3Jlc2VydmUoc2tiLCBVU0JfSFdERVNDX0hFQURFUl9MRU4pOworCQkjZW5kaWYKKworCQlzZWdfcHRyID0gc2tiX3B1dChza2IsIGJ1ZmZlcl9sZW4pOworCQkvKgorCQkgKiBUcmFuc2Zvcm0gZnJvbSBsaXR0bGUgZW5kaWFuIHRvIGJpZyBlbmRpYW4KKwkJICogYW5kIHBlbmRpbmcgIHplcm8KKwkJICovCisJCW1lbWNweShzZWdfcHRyLGNvZGV2aXJ0dWFsYWRkcmVzcyxidWZmZXJfbGVuKTsKKwkJdGNiX2Rlc2MtPnR4YnVmX3NpemU9ICh1MTYpYnVmZmVyX2xlbjsKKworCisJCWlmKCFwcml2LT5pZWVlODAyMTEtPmNoZWNrX25pY19lbm91Z2hfZGVzYyhkZXYsdGNiX2Rlc2MtPnF1ZXVlX2luZGV4KXx8CisJCQkoIXNrYl9xdWV1ZV9lbXB0eSgmcHJpdi0+aWVlZTgwMjExLT5za2Jfd2FpdFFbdGNiX2Rlc2MtPnF1ZXVlX2luZGV4XSkpfHxcCisJCQkocHJpdi0+aWVlZTgwMjExLT5xdWV1ZV9zdG9wKSApIHsKKwkJCVJUX1RSQUNFKENPTVBfRklSTVdBUkUsIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PiB0eCBmdWxsIVxuIik7CisJCQlza2JfcXVldWVfdGFpbCgmcHJpdi0+aWVlZTgwMjExLT5za2Jfd2FpdFFbdGNiX2Rlc2MtPnF1ZXVlX2luZGV4XSwgc2tiKTsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPmllZWU4MDIxMS0+c29mdG1hY19oYXJkX3N0YXJ0X3htaXQoc2tiLGRldik7CisJCX0KKworCQljb2RldmlydHVhbGFkZHJlc3MgKz0gZnJhZ19sZW5ndGg7CisJCWZyYWdfb2Zmc2V0ICs9IGZyYWdfbGVuZ3RoOworCisJfXdoaWxlKGZyYWdfb2Zmc2V0IDwgYnVmZmVyX2xlbik7CisKKwlyZXR1cm4gcnRfc3RhdHVzOworCisKKyNlbmRpZgorfQkvKiBDTVBLX01lc3NhZ2VfSGFuZGxlX1R4ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOiAgICBjbXBrX2NvdW50dHhzdGF0aXN0aWMoKQorICoKKyAqIE92ZXJ2aWV3OgorICoKKyAqIElucHV0OiAgICAgICBQQURBUFRFUiAJcEFkYXB0ZXIJCS0JLgorICoJCQkJQ01QS19UWEZCX1QgKnBzVHhfRkIJLQkuCisgKgorICogT3V0cHV0OiAgICAgIE5PTkUKKyAqCisgKiBSZXR1cm46ICAgICAgTk9ORQorICoKKyAqIFJldmlzZWQgSGlzdG9yeToKKyAqICBXaGVuCQlXaG8JCVJlbWFyaworICogIDA1LzEyLzIwMDgJYW15IAlDcmVhdGUgVmVyc2lvbiAwIHBvcnRpbmcgZnJvbSB3aW5kb3dzIGNvZGUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCXZvaWQKK2NtcGtfY291bnRfdHhzdGF0aXN0aWMoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwljbXBrX3R4ZmJfdAkqcHN0eF9mYikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisjaWZkZWYgRU5BQkxFX1BTCisJUlRfUkZfUE9XRVJfU1RBVEUJcnRTdGF0ZTsKKworCXBBZGFwdGVyLT5IYWxGdW5jLkdldEh3UmVnSGFuZGxlcihwQWRhcHRlciwgSFdfVkFSX1JGX1NUQVRFLCAocHUxQnl0ZSkoJnJ0U3RhdGUpKTsKKworCS8vIFdoZW4gUkYgaXMgb2ZmLCB3ZSBzaG91bGQgbm90IGNvdW50IHRoZSBwYWNrZXQgZm9yIGh3L3N3IHN5bmNocm9uaXplCisJLy8gcmVhc29uLCBpZS4gdGhlcmUgbWF5IGJlIGEgZHVyYXRpb24gd2hpbGUgc3cgc3dpdGNoIGlzIGNoYW5nZWQgYW5kIGh3CisJLy8gc3dpdGNoIGlzIGJlaW5nIGNoYW5nZWQuIDIwMDYuMTIuMDQsIGJ5IHNoaWVuIGNoYW5nLgorCWlmIChydFN0YXRlID09IGVSZk9mZikKKwl7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKworI2lmZGVmIFRPRE8KKwlpZihwQWRhcHRlci0+YkluSGN0VGVzdCkKKwkJcmV0dXJuOworI2VuZGlmCisJLyogV2UgY2FuIG5vdCBrbm93IHRoZSBwYWNrZXQgbGVuZ3RoIGFuZCB0cmFuc21pdCB0eXBlOiBicm9hZGNhc3Qgb3IgdW5pCisJICAgb3IgbXVsdGljYXN0LiBTbyB0aGUgcmVsYXRpdmUgc3RhdGlzdGljcyBtdXN0IGJlIGNvbGxlY3RlZCBpbiB0eAorCSAgIGZlZWRiYWNrIGluZm8uICovCisJaWYgKHBzdHhfZmItPnRvaykKKwl7CisJCXByaXYtPnN0YXRzLnR4ZmVlZGJhY2tvaysrOworCQlwcml2LT5zdGF0cy50eG9rdG90YWwrKzsKKwkJcHJpdi0+c3RhdHMudHhva2J5dGVzdG90YWwgKz0gcHN0eF9mYi0+cGt0X2xlbmd0aDsKKwkJcHJpdi0+c3RhdHMudHhva2lucGVyaW9kKys7CisKKwkJLyogV2UgY2FuIG5vdCBtYWtlIHN1cmUgYnJvYWRjYXN0L211bHRpY2FzdCBvciB1bmljYXN0IG1vZGUuICovCisJCWlmIChwc3R4X2ZiLT5wa3RfdHlwZSA9PSBQQUNLRVRfTVVMVElDQVNUKQorCQl7CisJCQlwcml2LT5zdGF0cy50eG11bHRpY2FzdCsrOworCQkJcHJpdi0+c3RhdHMudHhieXRlc211bHRpY2FzdCArPSBwc3R4X2ZiLT5wa3RfbGVuZ3RoOworCQl9CisJCWVsc2UgaWYgKHBzdHhfZmItPnBrdF90eXBlID09IFBBQ0tFVF9CUk9BRENBU1QpCisJCXsKKwkJCXByaXYtPnN0YXRzLnR4YnJvYWRjYXN0Kys7CisJCQlwcml2LT5zdGF0cy50eGJ5dGVzYnJvYWRjYXN0ICs9IHBzdHhfZmItPnBrdF9sZW5ndGg7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwcml2LT5zdGF0cy50eHVuaWNhc3QrKzsKKwkJCXByaXYtPnN0YXRzLnR4Ynl0ZXN1bmljYXN0ICs9IHBzdHhfZmItPnBrdF9sZW5ndGg7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcHJpdi0+c3RhdHMudHhmZWVkYmFja2ZhaWwrKzsKKwkJcHJpdi0+c3RhdHMudHhlcnJ0b3RhbCsrOworCQlwcml2LT5zdGF0cy50eGVycmJ5dGVzdG90YWwgKz0gcHN0eF9mYi0+cGt0X2xlbmd0aDsKKworCQkvKiBXZSBjYW4gbm90IG1ha2Ugc3VyZSBicm9hZGNhc3QvbXVsdGljYXN0IG9yIHVuaWNhc3QgbW9kZS4gKi8KKwkJaWYgKHBzdHhfZmItPnBrdF90eXBlID09IFBBQ0tFVF9NVUxUSUNBU1QpCisJCXsKKwkJCXByaXYtPnN0YXRzLnR4ZXJybXVsdGljYXN0Kys7CisJCX0KKwkJZWxzZSBpZiAocHN0eF9mYi0+cGt0X3R5cGUgPT0gUEFDS0VUX0JST0FEQ0FTVCkKKwkJeworCQkJcHJpdi0+c3RhdHMudHhlcnJicm9hZGNhc3QrKzsKKwkJfQorCQllbHNlCisJCXsKKwkJCXByaXYtPnN0YXRzLnR4ZXJydW5pY2FzdCsrOworCQl9CisJfQorCisJcHJpdi0+c3RhdHMudHhyZXRyeWNvdW50ICs9IHBzdHhfZmItPnJldHJ5X2NudDsKKwlwcml2LT5zdGF0cy50eGZlZWRiYWNrcmV0cnkgKz0gcHN0eF9mYi0+cmV0cnlfY250OworCit9CS8qIGNtcGtfQ291bnRUeFN0YXRpc3RpYyAqLworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246ICAgIGNtcGtfaGFuZGxlX3R4X2ZlZWRiYWNrKCkKKyAqCisgKiBPdmVydmlldzoJVGhlIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBleHRyYWN0IHRoZSBtZXNzYWdlIGluc2lkZSBUWAorICoJCQkJZmVlZGJjayBtZXNzYWdlIGZyb20gZmlybXdhcmUuIEl0IHdpbGwgY29udGFpbiBkZWRpY2F0ZWQgaW5mbyBpbgorICoJCQkJd3MtMDYtMDA2My1ydGw4MTkwLWNvbW1hbmQtcGFja2V0LXNwZWNpZmljYXRpb24uIFBsZWFzZQorICoJCQkJcmVmZXIgdG8gY2hhcHRlciAiVFggRmVlZGJhY2sgRWxlbWVudCIuIFdlIGhhdmUgdG8gcmVhZCAyMCBieXRlcworICoJCQkJaW4gdGhlIGNvbW1hbmQgcGFja2V0LgorICoKKyAqIElucHV0OiAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqICAgIGRldgorICoJCQkJdTggCSoJcG1zZwkJLQlNc2cgUHRyIG9mIHRoZSBjb21tYW5kIHBhY2tldC4KKyAqCisgKiBPdXRwdXQ6ICAgICAgTk9ORQorICoKKyAqIFJldHVybjogICAgICBOT05FCisgKgorICogUmV2aXNlZCBIaXN0b3J5OgorICogIFdoZW4JCVdobwkJUmVtYXJrCisgKiAgMDUvMDgvMjAwOAlhbXkJCUNyZWF0ZSBWZXJzaW9uIDAgcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMJdm9pZAorY21wa19oYW5kbGVfdHhfZmVlZGJhY2soCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1OAkqCXBtc2cpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWNtcGtfdHhmYl90CQlyeF90eF9mYjsJLyogKi8KKworCXByaXYtPnN0YXRzLnR4ZmVlZGJhY2srKzsKKworCS8qIDAuIERpc3BsYXkgcmVjZWl2ZWQgbWVzc2FnZS4gKi8KKwkvL2NtcGtfRGlzcGxheV9NZXNzYWdlKENNUEtfUlhfVFhfRkJfU0laRSwgcE1zZyk7CisKKwkvKiAxLiBFeHRyYWN0IFRYIGZlZWRiYWNrIGluZm8gZnJvbSBSRkQgdG8gdGVtcCBzdHJ1Y3R1cmUgYnVmZmVyLiAqLworCS8qIEl0IHNlZW1zIHRoYXQgRlcgdXNlIGJpZyBlbmRpYW4oTUlQUykgYW5kIERSViB1c2UgbGl0dGxlIGVuZGlhbiBpbgorCSAgIHdpbmRvd3MgT1MuIFNvIHdlIGhhdmUgdG8gcmVhZCB0aGUgY29udGVudCBieXRlIGJ5IGJ5dGUgb3IgdHJhbnNmZXIKKwkgICBlbmRpYW4gdHlwZSBiZWZvcmUgY29weSB0aGUgbWVzc2FnZSBjb3B5LiAqLworCS8qIDIwMDcvMDcvMDUgTUggVXNlIHBvaW50ZXIgdG8gdHJhbnNmZXIgc3RydWN0dXJlIG1lbW9yeS4gKi8KKwkvL21lbWNweSgoVUlOVDggKikmcnhfdHhfZmIsIHBNc2csIHNpemVvZihDTVBLX1RYRkJfVCkpOworCW1lbWNweSgodTgqKSZyeF90eF9mYiwgcG1zZywgc2l6ZW9mKGNtcGtfdHhmYl90KSk7CisJLyogMi4gVXNlIHR4IGZlZWRiYWNrIGluZm8gdG8gY291bnQgVFggc3RhdGlzdGljcy4gKi8KKwljbXBrX2NvdW50X3R4c3RhdGlzdGljKGRldiwgJnJ4X3R4X2ZiKTsKKwkvKiAyMDA3LzAxLzE3IE1IIENvbW1lbnQgcHJldmlvdXMgbWV0aG9kIGZvciBUWCBzdGF0aXN0aWMgZnVuY3Rpb24uICovCisJLyogQ29sbGVjdCBpbmZvIFRYIGZlZWRiYWNrIHBhY2tldCB0byBmaWxsIFRDQi4gKi8KKwkvKiBXZSBjYW4gbm90IGtub3cgdGhlIHBhY2tldCBsZW5ndGggYW5kIHRyYW5zbWl0IHR5cGU6IGJyb2FkY2FzdCBvciB1bmkKKwkgICBvciBtdWx0aWNhc3QuICovCisJLy9Db3VudFR4U3RhdGlzdGljcyggcEFkYXB0ZXIsICZ0Y2IgKTsKKworfQkvKiBjbXBrX0hhbmRsZV9UeF9GZWVkYmFjayAqLworCit2b2lkCitjbWRwa3RfYmVhY29udGltZXJpbnRlcnJ1cHRfODE5eHVzYigKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CispCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUxNiB0eF9yYXRlOworCXsKKwkJLy8KKwkJLy8gMDcwMTE3LCByY25qa286IDg3QiBoYXZlIHRvIFMvVyBiZWFjb24gZm9yIERUTSBlbmNyeXB0aW9uX2Ntbi4KKwkJLy8KKwkJaWYocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX0EgIHx8CisJCQlwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5tb2RlID09IElFRUVfTl81RyB8fAorCQkJKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLm1vZGUgPT0gSUVFRV9OXzI0RyAgJiYgKCFwcml2LT5pZWVlODAyMTEtPnBIVEluZm8tPmJDdXJTdXBwQ0NLKSkpCisJCXsKKwkJCXR4X3JhdGUgPSA2MDsKKwkJCURNRVNHKCJzZW5kIGJlYWNvbiBmcmFtZSAgdHggcmF0ZSBpcyA2TWJwbVxuIik7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0eF9yYXRlID0xMDsKKwkJCURNRVNHKCJzZW5kIGJlYWNvbiBmcmFtZSAgdHggcmF0ZSBpcyAxTWJwbVxuIik7CisJCX0KKworCQlydGw4MTl4dXNiX2JlYWNvbl90eChkZXYsdHhfcmF0ZSk7IC8vIEhXIEJlYWNvbgorCisJfQorCit9CisKKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOiAgICBjbXBrX2hhbmRsZV9pbnRlcnJ1cHRfc3RhdHVzKCkKKyAqCisgKiBPdmVydmlldzogICAgVGhlIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBleHRyYWN0IHRoZSBtZXNzYWdlIGZyb20KKyAqCQkJCWZpcm13YXJlLiBJdCB3aWxsIGNvbnRhaW4gZGVkaWNhdGVkIGluZm8gaW4KKyAqCQkJCXdzLTA3LTAwNjMtdjA2LXJ0bDgxOXgtY29tbWFuZC1wYWNrZXQtc3BlY2lmaWNhdGlvbi0wNzAzMTUuZG9jLgorICogCQkJCVBsZWFzZSByZWZlciB0byBjaGFwdGVyICJJbnRlcnJ1cHQgU3RhdHVzIEVsZW1lbnQiLgorICoKKyAqIElucHV0OiAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICoJCQl1OCoJcG1zZwkJLQlNZXNzYWdlIFBvaW50ZXIgb2YgdGhlIGNvbW1hbmQgcGFja2V0LgorICoKKyAqIE91dHB1dDogICAgICBOT05FCisgKgorICogUmV0dXJuOiAgICAgIE5PTkUKKyAqCisgKiBSZXZpc2VkIEhpc3Rvcnk6CisgKiAgV2hlbgkJCVdobwkJCVJlbWFyaworICogIDA1LzEyLzIwMDgJYW15CQlBZGQgdGhpcyBmb3IgcnRsODE5MiBwb3J0aW5nIGZyb20gd2luZG93cyBjb2RlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwl2b2lkCitjbXBrX2hhbmRsZV9pbnRlcnJ1cHRfc3RhdHVzKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTgqCXBtc2cpCit7CisJY21wa19pbnRyX3N0YV90CQlyeF9pbnRyX3N0YXR1czsJLyogKi8KKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlETUVTRygiLS0tPiBjbXBrX0hhbmRsZV9JbnRlcnJ1cHRfU3RhdHVzKClcbiIpOworCisJLyogMC4gRGlzcGxheSByZWNlaXZlZCBtZXNzYWdlLiAqLworCS8vY21wa19EaXNwbGF5X01lc3NhZ2UoQ01QS19SWF9CRUFDT05fU1RBVEVfU0laRSwgcE1zZyk7CisKKwkvKiAxLiBFeHRyYWN0IFRYIGZlZWRiYWNrIGluZm8gZnJvbSBSRkQgdG8gdGVtcCBzdHJ1Y3R1cmUgYnVmZmVyLiAqLworCS8qIEl0IHNlZW1zIHRoYXQgRlcgdXNlIGJpZyBlbmRpYW4oTUlQUykgYW5kIERSViB1c2UgbGl0dGxlIGVuZGlhbiBpbgorCSAgIHdpbmRvd3MgT1MuIFNvIHdlIGhhdmUgdG8gcmVhZCB0aGUgY29udGVudCBieXRlIGJ5IGJ5dGUgb3IgdHJhbnNmZXIKKwkgICBlbmRpYW4gdHlwZSBiZWZvcmUgY29weSB0aGUgbWVzc2FnZSBjb3B5LiAqLworCS8vcnhfYmNuX3N0YXRlLkVsZW1lbnRfSUQgCT0gcE1zZ1swXTsKKwkvL3J4X2Jjbl9zdGF0ZS5MZW5ndGggCQk9IHBNc2dbMV07CisJcnhfaW50cl9zdGF0dXMubGVuZ3RoID0gcG1zZ1sxXTsKKwlpZiAocnhfaW50cl9zdGF0dXMubGVuZ3RoICE9IChzaXplb2YoY21wa19pbnRyX3N0YV90KSAtIDIpKQorCXsKKwkJRE1FU0coImNtcGtfSGFuZGxlX0ludGVycnVwdF9TdGF0dXM6IHdyb25nIGxlbmd0aCFcbiIpOworCQlyZXR1cm47CisJfQorCisKKwkvLyBTdGF0aXN0aWNzIG9mIGJlYWNvbiBmb3IgYWQtaG9jIG1vZGUuCisJaWYoCXByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQorCXsKKwkJLy8yIG1heWJlIG5lZWQgZW5kaWFuIHRyYW5zZm9ybT8KKwkJcnhfaW50cl9zdGF0dXMuaW50ZXJydXB0X3N0YXR1cyA9ICooKHUzMiAqKShwbXNnICsgNCkpOworCQkvL3J4X2ludHJfc3RhdHVzLkludGVycnVwdFN0YXR1cyA9IE4ySDRCWVRFKCooKFVJTlQzMiAqKShwTXNnICsgNCkpKTsKKworCQlETUVTRygiaW50ZXJydXB0IHN0YXR1cyA9IDB4JXhcbiIsIHJ4X2ludHJfc3RhdHVzLmludGVycnVwdF9zdGF0dXMpOworCisJCWlmIChyeF9pbnRyX3N0YXR1cy5pbnRlcnJ1cHRfc3RhdHVzICYgSVNSX1R4QmNuT2spCisJCXsKKwkJCXByaXYtPmllZWU4MDIxMS0+Ymlic3Njb29yZGluYXRvciA9IHRydWU7CisJCQlwcml2LT5zdGF0cy50eGJlYWNvbm9raW50Kys7CisJCX0KKwkJZWxzZSBpZiAocnhfaW50cl9zdGF0dXMuaW50ZXJydXB0X3N0YXR1cyAmIElTUl9UeEJjbkVycikKKwkJeworCQkJcHJpdi0+aWVlZTgwMjExLT5iaWJzc2Nvb3JkaW5hdG9yID0gZmFsc2U7CisJCQlwcml2LT5zdGF0cy50eGJlYWNvbmVycisrOworCQl9CisKKwkJaWYgKHJ4X2ludHJfc3RhdHVzLmludGVycnVwdF9zdGF0dXMgJiBJU1JfQmNuVGltZXJJbnRyKQorCQl7CisJCQljbWRwa3RfYmVhY29udGltZXJpbnRlcnJ1cHRfODE5eHVzYihkZXYpOworCQl9CisKKwl9CisKKwkgLy8gT3RoZXIgaW5mb3JtYXRpb25zIGluIGludGVycnVwdCBzdGF0dXMgd2UgbmVlZD8KKworCisJRE1FU0coIjwtLS0tIGNtcGtfaGFuZGxlX2ludGVycnVwdF9zdGF0dXMoKVxuIik7CisKK30JLyogY21wa19oYW5kbGVfaW50ZXJydXB0X3N0YXR1cyAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOiAgICBjbXBrX2hhbmRsZV9xdWVyeV9jb25maWdfcngoKQorICoKKyAqIE92ZXJ2aWV3OiAgICBUaGUgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGV4dHJhY3QgdGhlIG1lc3NhZ2UgZnJvbQorICoJCQkJZmlybXdhcmUuIEl0IHdpbGwgY29udGFpbiBkZWRpY2F0ZWQgaW5mbyBpbgorICoJCQkJd3MtMDYtMDA2My1ydGw4MTkwLWNvbW1hbmQtcGFja2V0LXNwZWNpZmljYXRpb24uIFBsZWFzZQorICoJCQkJcmVmZXIgdG8gY2hhcHRlciAiQmVhY29uIFN0YXRlIEVsZW1lbnQiLgorICoKKyAqIElucHV0OiAgICAgICB1OCAqICBwbXNnCS0JTWVzc2FnZSBQb2ludGVyIG9mIHRoZSBjb21tYW5kIHBhY2tldC4KKyAqCisgKiBPdXRwdXQ6ICAgICAgTk9ORQorICoKKyAqIFJldHVybjogICAgICBOT05FCisgKgorICogUmV2aXNlZCBIaXN0b3J5OgorICogIFdoZW4JCVdobwkJUmVtYXJrCisgKiAgMDUvMTIvMjAwOAlhbXkJCUNyZWF0ZSBWZXJzaW9uIDAgcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMJdm9pZAorY21wa19oYW5kbGVfcXVlcnlfY29uZmlnX3J4KAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTgqCSAgIHBtc2cpCit7CisJY21wa19xdWVyeV9jZmdfdAlyeF9xdWVyeV9jZmc7CS8qICovCisKKwkvKiAwLiBEaXNwbGF5IHJlY2VpdmVkIG1lc3NhZ2UuICovCisJLy9jbXBrX0Rpc3BsYXlfTWVzc2FnZShDTVBLX1JYX0JFQUNPTl9TVEFURV9TSVpFLCBwTXNnKTsKKworCS8qIDEuIEV4dHJhY3QgVFggZmVlZGJhY2sgaW5mbyBmcm9tIFJGRCB0byB0ZW1wIHN0cnVjdHVyZSBidWZmZXIuICovCisJLyogSXQgc2VlbXMgdGhhdCBGVyB1c2UgYmlnIGVuZGlhbihNSVBTKSBhbmQgRFJWIHVzZSBsaXR0bGUgZW5kaWFuIGluCisJICAgd2luZG93cyBPUy4gU28gd2UgaGF2ZSB0byByZWFkIHRoZSBjb250ZW50IGJ5dGUgYnkgYnl0ZSBvciB0cmFuc2ZlcgorCSAgIGVuZGlhbiB0eXBlIGJlZm9yZSBjb3B5IHRoZSBtZXNzYWdlIGNvcHkuICovCisJLy9yeF9xdWVyeV9jZmcuRWxlbWVudF9JRCAJPSBwTXNnWzBdOworCS8vcnhfcXVlcnlfY2ZnLkxlbmd0aCAJCT0gcE1zZ1sxXTsKKwlyeF9xdWVyeV9jZmcuY2ZnX2FjdGlvbiAJPSAocG1zZ1s0XSAmIDB4ODAwMDAwMDApPj4zMTsKKwlyeF9xdWVyeV9jZmcuY2ZnX3R5cGUgCQk9IChwbXNnWzRdICYgMHg2MCkgPj4gNTsKKwlyeF9xdWVyeV9jZmcuY2ZnX3NpemUgCQk9IChwbXNnWzRdICYgMHgxOCkgPj4gMzsKKwlyeF9xdWVyeV9jZmcuY2ZnX3BhZ2UgCQk9IChwbXNnWzZdICYgMHgwRikgPj4gMDsKKwlyeF9xdWVyeV9jZmcuY2ZnX29mZnNldCAJCT0gcG1zZ1s3XTsKKwlyeF9xdWVyeV9jZmcudmFsdWUgCQkJPSAocG1zZ1s4XSA8PCAyNCkgfCAocG1zZ1s5XSA8PCAxNikgfAorCQkJCQkJCQkgIChwbXNnWzEwXSA8PCA4KSB8IChwbXNnWzExXSA8PCAwKTsKKwlyeF9xdWVyeV9jZmcubWFzayAJCQk9IChwbXNnWzEyXSA8PCAyNCkgfCAocG1zZ1sxM10gPDwgMTYpIHwKKwkJCQkJCQkJICAocG1zZ1sxNF0gPDwgOCkgfCAocG1zZ1sxNV0gPDwgMCk7CisKK30JLyogY21wa19IYW5kbGVfUXVlcnlfQ29uZmlnX1J4ICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246CWNtcGtfY291bnRfdHhfc3RhdHVzKCkKKyAqCisgKiBPdmVydmlldzoJQ291bnQgYWdncmVnYXRlZCB0eCBzdGF0dXMgZnJvbSBmaXJtd2FyIG9mIG9uZSB0eXBlIHJ4IGNvbW1hbmQKKyAqCQkJCXBhY2tldCBlbGVtZW50IGlkID0gUlhfVFhfU1RBVFVTLgorICoKKyAqIElucHV0OgkJTk9ORQorICoKKyAqIE91dHB1dDoJCU5PTkUKKyAqCisgKiBSZXR1cm46CQlOT05FCisgKgorICogUmV2aXNlZCBIaXN0b3J5OgorICoJV2hlbgkJV2hvCQlSZW1hcmsKKyAqCTA1LzEyLzIwMDgJYW15CQlDcmVhdGUgVmVyc2lvbiAwIHBvcnRpbmcgZnJvbSB3aW5kb3dzIGNvZGUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCXZvaWQJY21wa19jb3VudF90eF9zdGF0dXMoCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCQkJCQljbXBrX3R4X3N0YXR1c190IAkqcHN0eF9zdGF0dXMpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisjaWZkZWYgRU5BQkxFX1BTCisKKwlSVF9SRl9QT1dFUl9TVEFURQlydHN0YXRlOworCisJcEFkYXB0ZXItPkhhbEZ1bmMuR2V0SHdSZWdIYW5kbGVyKHBBZGFwdGVyLCBIV19WQVJfUkZfU1RBVEUsIChwdTFCeXRlKSgmcnRTdGF0ZSkpOworCisJLy8gV2hlbiBSRiBpcyBvZmYsIHdlIHNob3VsZCBub3QgY291bnQgdGhlIHBhY2tldCBmb3IgaHcvc3cgc3luY2hyb25pemUKKwkvLyByZWFzb24sIGllLiB0aGVyZSBtYXkgYmUgYSBkdXJhdGlvbiB3aGlsZSBzdyBzd2l0Y2ggaXMgY2hhbmdlZCBhbmQgaHcKKwkvLyBzd2l0Y2ggaXMgYmVpbmcgY2hhbmdlZC4gMjAwNi4xMi4wNCwgYnkgc2hpZW4gY2hhbmcuCisJaWYgKHJ0U3RhdGUgPT0gZVJmT2ZmKQorCXsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisJcHJpdi0+c3RhdHMudHhmZWVkYmFja29rCSs9IHBzdHhfc3RhdHVzLT50eG9rOworCXByaXYtPnN0YXRzLnR4b2t0b3RhbAkJKz0gcHN0eF9zdGF0dXMtPnR4b2s7CisKKwlwcml2LT5zdGF0cy50eGZlZWRiYWNrZmFpbAkrPSBwc3R4X3N0YXR1cy0+dHhmYWlsOworCXByaXYtPnN0YXRzLnR4ZXJydG90YWwJCSs9IHBzdHhfc3RhdHVzLT50eGZhaWw7CisKKwlwcml2LT5zdGF0cy50eHJldHJ5Y291bnQJCSs9IHBzdHhfc3RhdHVzLT50eHJldHJ5OworCXByaXYtPnN0YXRzLnR4ZmVlZGJhY2tyZXRyeQkrPSBwc3R4X3N0YXR1cy0+dHhyZXRyeTsKKworCS8vcEFkYXB0ZXItPlR4U3RhdHMuTnVtVHhPa0J5dGVzVG90YWwgKz0gcHNUeF9GQi0+cGt0X2xlbmd0aDsKKwkvL3BBZGFwdGVyLT5UeFN0YXRzLk51bVR4RXJyQnl0ZXNUb3RhbCArPSBwc1R4X0ZCLT5wa3RfbGVuZ3RoOworCS8vcEFkYXB0ZXItPk1nbnRJbmZvLkxpbmtEZXRlY3RJbmZvLk51bVR4T2tJblBlcmlvZCsrOworCisJcHJpdi0+c3RhdHMudHhtdWx0aWNhc3QJKz0gcHN0eF9zdGF0dXMtPnR4bWNvazsKKwlwcml2LT5zdGF0cy50eGJyb2FkY2FzdAkrPSBwc3R4X3N0YXR1cy0+dHhiY29rOworCXByaXYtPnN0YXRzLnR4dW5pY2FzdAkJKz0gcHN0eF9zdGF0dXMtPnR4dWNvazsKKworCXByaXYtPnN0YXRzLnR4ZXJybXVsdGljYXN0CSs9IHBzdHhfc3RhdHVzLT50eG1jZmFpbDsKKwlwcml2LT5zdGF0cy50eGVycmJyb2FkY2FzdAkrPSBwc3R4X3N0YXR1cy0+dHhiY2ZhaWw7CisJcHJpdi0+c3RhdHMudHhlcnJ1bmljYXN0CSs9IHBzdHhfc3RhdHVzLT50eHVjZmFpbDsKKworCXByaXYtPnN0YXRzLnR4Ynl0ZXNtdWx0aWNhc3QJKz0gcHN0eF9zdGF0dXMtPnR4bWNsZW5ndGg7CisJcHJpdi0+c3RhdHMudHhieXRlc2Jyb2FkY2FzdAkrPSBwc3R4X3N0YXR1cy0+dHhiY2xlbmd0aDsKKwlwcml2LT5zdGF0cy50eGJ5dGVzdW5pY2FzdAkJKz0gcHN0eF9zdGF0dXMtPnR4dWNsZW5ndGg7CisKKwlwcml2LT5zdGF0cy5sYXN0X3BhY2tldF9yYXRlCQk9IHBzdHhfc3RhdHVzLT5yYXRlOworfQkvKiBjbXBrX0NvdW50VHhTdGF0dXMgKi8KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOgljbXBrX2hhbmRsZV90eF9zdGF0dXMoKQorICoKKyAqIE92ZXJ2aWV3OglGaXJtd2FyZSBhZGQgYSBuZXcgdHggZmVlZGJhY2sgc3RhdHVzIHRvIHJlZHVjZSByeCBjb21tYW5kCisgKgkJCQlwYWNrZXQgYnVmZmVyIG9wZXJhdGlvbiBsb2FkLgorICoKKyAqIElucHV0OgkJTk9ORQorICoKKyAqIE91dHB1dDoJCU5PTkUKKyAqCisgKiBSZXR1cm46CQlOT05FCisgKgorICogUmV2aXNlZCBIaXN0b3J5OgorICoJV2hlbgkJV2hvCQlSZW1hcmsKKyAqCTA1LzEyLzIwMDgJYW15CQlDcmVhdGUgVmVyc2lvbiAwIHBvcnRpbmcgZnJvbSB3aW5kb3dzIGNvZGUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCXZvaWQKK2NtcGtfaGFuZGxlX3R4X3N0YXR1cygKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXU4KgkgICBwbXNnKQoreworCWNtcGtfdHhfc3RhdHVzX3QJcnhfdHhfc3RzOwkvKiAqLworCisJbWVtY3B5KCh2b2lkKikmcnhfdHhfc3RzLCAodm9pZCopcG1zZywgc2l6ZW9mKGNtcGtfdHhfc3RhdHVzX3QpKTsKKwkvKiAyLiBVc2UgdHggZmVlZGJhY2sgaW5mbyB0byBjb3VudCBUWCBzdGF0aXN0aWNzLiAqLworCWNtcGtfY291bnRfdHhfc3RhdHVzKGRldiwgJnJ4X3R4X3N0cyk7CisKK30JLyogY21wa19IYW5kbGVfVHhfU3RhdHVzICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246CWNtcGtfaGFuZGxlX3R4X3JhdGVfaGlzdG9yeSgpCisgKgorICogT3ZlcnZpZXc6CUZpcm13YXJlIGFkZCBhIG5ldyB0eCByYXRlIGhpc3RvcnkKKyAqCisgKiBJbnB1dDoJCU5PTkUKKyAqCisgKiBPdXRwdXQ6CQlOT05FCisgKgorICogUmV0dXJuOgkJTk9ORQorICoKKyAqIFJldmlzZWQgSGlzdG9yeToKKyAqCVdoZW4JCVdobwkJUmVtYXJrCisgKgkwNS8xMi8yMDA4CWFteQkJQ3JlYXRlIFZlcnNpb24gMCBwb3J0aW5nIGZyb20gd2luZG93cyBjb2RlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwl2b2lkCitjbXBrX2hhbmRsZV90eF9yYXRlX2hpc3RvcnkoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1OCoJICAgcG1zZykKK3sKKwljbXBrX3R4X3JhaGlzX3QJKnB0eHJhdGU7CisvLwlSVF9SRl9QT1dFUl9TVEFURQlydFN0YXRlOworCXU4CQkJCWksIGo7CisJdTE2CQkJCWxlbmd0aCA9IHNpemVvZihjbXBrX3R4X3JhaGlzX3QpOworCXUzMgkJCQkqcHRlbXA7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisKKyNpZmRlZiBFTkFCTEVfUFMKKwlwQWRhcHRlci0+SGFsRnVuYy5HZXRId1JlZ0hhbmRsZXIocEFkYXB0ZXIsIEhXX1ZBUl9SRl9TVEFURSwgKHB1MUJ5dGUpKCZydFN0YXRlKSk7CisKKwkvLyBXaGVuIFJGIGlzIG9mZiwgd2Ugc2hvdWxkIG5vdCBjb3VudCB0aGUgcGFja2V0IGZvciBody9zdyBzeW5jaHJvbml6ZQorCS8vIHJlYXNvbiwgaWUuIHRoZXJlIG1heSBiZSBhIGR1cmF0aW9uIHdoaWxlIHN3IHN3aXRjaCBpcyBjaGFuZ2VkIGFuZCBodworCS8vIHN3aXRjaCBpcyBiZWluZyBjaGFuZ2VkLiAyMDA2LjEyLjA0LCBieSBzaGllbiBjaGFuZy4KKwlpZiAocnRTdGF0ZSA9PSBlUmZPZmYpCisJeworCQlyZXR1cm47CisJfQorI2VuZGlmCisKKwlwdGVtcCA9ICh1MzIgKilwbXNnOworCisJLy8KKwkvLyBEbyBlbmRpYW4gdHJhbnNmZXIgdG8gd29yZCBhbGlnbm1lbnQoMTYgYml0cykgZm9yIHdpbmRvd3Mgc3lzdGVtLgorCS8vIFlvdSBtdXN0IGRvIGRpZmZlcmVudCBlbmRpYW4gdHJhbnNmZXIgZm9yIGxpbnV4IGFuZCBNQUMgT1MKKwkvLworCWZvciAoaSA9IDA7IGkgPCAobGVuZ3RoLzQpOyBpKyspCisJeworCQl1MTYJIHRlbXAxLCB0ZW1wMjsKKworCQl0ZW1wMSA9IHB0ZW1wW2ldJjB4MDAwMEZGRkY7CisJCXRlbXAyID0gcHRlbXBbaV0+PjE2OworCQlwdGVtcFtpXSA9ICh0ZW1wMTw8MTYpfHRlbXAyOworCX0KKworCXB0eHJhdGUgPSAoY21wa190eF9yYWhpc190ICopcG1zZzsKKworCWlmIChwdHhyYXRlID09IE5VTEwgKQorCXsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCXsKKwkJLy8gQ29sbGVjdCBDQ0sgcmF0ZSBwYWNrZXQgbnVtCisJCWlmIChpIDwgNCkKKwkJCXByaXYtPnN0YXRzLnR4cmF0ZS5jY2tbaV0gKz0gcHR4cmF0ZS0+Y2NrW2ldOworCisJCS8vIENvbGxlY3QgT0ZETSByYXRlIHBhY2tldCBudW0KKwkJaWYgKGk8IDgpCisJCQlwcml2LT5zdGF0cy50eHJhdGUub2ZkbVtpXSArPSBwdHhyYXRlLT5vZmRtW2ldOworCisJCWZvciAoaiA9IDA7IGogPCA0OyBqKyspCisJCQlwcml2LT5zdGF0cy50eHJhdGUuaHRfbWNzW2pdW2ldICs9IHB0eHJhdGUtPmh0X21jc1tqXVtpXTsKKwl9CisKK30JLyogY21wa19IYW5kbGVfVHhfUmF0ZV9IaXN0b3J5ICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246ICAgIGNtcGtfbWVzc2FnZV9oYW5kbGVfcngoKQorICoKKyAqIE92ZXJ2aWV3OiAgICBJbiB0aGUgZnVuY3Rpb24sIHdlIHdpbGwgY2FwdHVyZSBkaWZmZXJlbnQgUlggY29tbWFuZCBwYWNrZXQKKyAqCQkJCWluZm8uIEV2ZXJ5IFJYIGNvbW1hbmQgcGFja2V0IGVsZW1lbnQgaGFzIGRpZmZlcmVudCBtZXNzYWdlCisgKgkJCQlsZW5ndGggYW5kIG1lYW5pbmcgaW4gY29udGVudC4gV2Ugb25seSBzdXBwb3J0IHRocmVlIHR5cGUgb2YgUlgKKyAqCQkJCWNvbW1hbmQgcGFja2V0IG5vdy4gUGxlYXNlIHJlZmVyIHRvIGRvY3VtZW50CisgKgkJCQl3cy0wNi0wMDYzLXJ0bDgxOTAtY29tbWFuZC1wYWNrZXQtc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBJbnB1dDogICAgICAgTk9ORQorICoKKyAqIE91dHB1dDogICAgICBOT05FCisgKgorICogUmV0dXJuOiAgICAgIE5PTkUKKyAqCisgKiBSZXZpc2VkIEhpc3Rvcnk6CisgKiAgV2hlbgkJV2hvCQlSZW1hcmsKKyAqICAwNS8wNi8yMDA4CWFteQkJQ3JlYXRlIFZlcnNpb24gMCBwb3J0aW5nIGZyb20gd2luZG93cyBjb2RlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2V4dGVybgl1MzIKK2NtcGtfbWVzc2FnZV9oYW5kbGVfcngoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpwc3RhdHMpCit7CisvLwl1MzIJCQlkZWJ1Z19sZXZlbCA9IERCR19MT1VEOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQJCQl0b3RhbF9sZW5ndGg7CisJdTgJCQljbWRfbGVuZ3RoLCBleGVfY250ID0gMDsKKwl1OAkJCWVsZW1lbnRfaWQ7CisJdTgJCQkqcGNtZF9idWZmOworCisJLyogMC4gQ2hlY2sgaW5wdCBhcmd1bWVudHMuIElmIGlzIGlzIGEgY29tbWFuZCBxdWV1ZSBtZXNzYWdlIG9yIHBvaW50ZXIgaXMKKwkgICAgICBudWxsLiAqLworCWlmICgvKihwcmZkLT5xdWV1ZV9pZCAhPSBDTVBLX1JYX1FVRVVFX0lEKSB8fCAqLyhwc3RhdHM9PSBOVUxMKSkKKwl7CisJCS8qIFByaW50IGVycm9yIG1lc3NhZ2UuICovCisJCS8qUlRfVFJBQ0UoQ09NUF9TRU5ELCBEZWJ1Z0xldmVsLAorCQkJCSgiXG5ccltDTVBLXS0tPkVyciBxdWV1ZSBpZCBvciBwb2ludGVyIikpOyovCisJCXJldHVybiAwOwkvKiBUaGlzIGlzIG5vdCBhIGNvbW1hbmQgcGFja2V0LiAqLworCX0KKworCS8qIDEuIFJlYWQgcmVjZWl2ZWQgY29tbWFuZCBwYWNrZXQgbWVzc2FnZSBsZW5ndGggZnJvbSBSRkQuICovCisJdG90YWxfbGVuZ3RoID0gcHN0YXRzLT5MZW5ndGg7CisKKwkvKiAyLiBSZWFkIHZpcnR1YWwgYWRkcmVzcyBmcm9tIFJGRC4gKi8KKwlwY21kX2J1ZmYgPSBwc3RhdHMtPnZpcnR1YWxfYWRkcmVzczsKKworCS8qIDMuIFJlYWQgY29tbWFuZCBwYWtjZXQgZWxlbWVudCBpZCBhbmQgbGVuZ3RoLiAqLworCWVsZW1lbnRfaWQgPSBwY21kX2J1ZmZbMF07CisJLypSVF9UUkFDRShDT01QX1NFTkQsIERlYnVnTGV2ZWwsCisJCQkoIlxuXHJbQ01QS10tLT5lbGVtZW50IElEPSVkIExlbj0lZCIsIGVsZW1lbnRfaWQsIHRvdGFsX2xlbmd0aCkpOyovCisKKwkvKiA0LiBDaGVjayBldmVyeSByZWNlaXZlZCBjb21tYW5kIHBhY2tldCBjb25lbnQgYWNjb3JkaW5nIHRvIGRpZmZlcmVudAorCSAgICAgIGVsZW1lbnQgdHlwZS4gQmVjYXVzZSBGVyBtYXkgYWdncmVnYXRlIFJYIGNvbW1hbmQgcGFja2V0IHRvIG1pbmltaXplCisJICAgICAgdHJhbnNtaXQgdGltZSBiZXR3ZWVuIERSViBhbmQgRlcuKi8KKwkvLyBBZGQgYSBjb3VudGVyIHRvIHByZXZlbnQgdG8gbG9ja2VkIGluIHRoZSBsb29wIHRvbyBsb25nCisJd2hpbGUgKHRvdGFsX2xlbmd0aCA+IDAgfHwgZXhlX2NudCsrID4xMDApCisJeworCQkvKiAyMDA3LzAxLzE3IE1IIFdlIHN1cHBvcnQgYWdncmVnYXRpb24gb2YgZGlmZmVyZW50IGNtZCBpbiB0aGUgc2FtZSBwYWNrZXQuICovCisJCWVsZW1lbnRfaWQgPSBwY21kX2J1ZmZbMF07CisKKwkJc3dpdGNoKGVsZW1lbnRfaWQpCisJCXsKKwkJCWNhc2UgUlhfVFhfRkVFREJBQ0s6CisJCQkJY21wa19oYW5kbGVfdHhfZmVlZGJhY2sgKGRldiwgcGNtZF9idWZmKTsKKwkJCQljbWRfbGVuZ3RoID0gQ01QS19SWF9UWF9GQl9TSVpFOworCQkJCWJyZWFrOworCisJCQljYXNlIFJYX0lOVEVSUlVQVF9TVEFUVVM6CisJCQkJY21wa19oYW5kbGVfaW50ZXJydXB0X3N0YXR1cyhkZXYsIHBjbWRfYnVmZik7CisJCQkJY21kX2xlbmd0aCA9IHNpemVvZihjbXBrX2ludHJfc3RhX3QpOworCQkJCWJyZWFrOworCisJCQljYXNlIEJPVEhfUVVFUllfQ09ORklHOgorCQkJCWNtcGtfaGFuZGxlX3F1ZXJ5X2NvbmZpZ19yeChkZXYsIHBjbWRfYnVmZik7CisJCQkJY21kX2xlbmd0aCA9IENNUEtfQk9USF9RVUVSWV9DT05GSUdfU0laRTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBSWF9UWF9TVEFUVVM6CisJCQkJY21wa19oYW5kbGVfdHhfc3RhdHVzKGRldiwgcGNtZF9idWZmKTsKKwkJCQljbWRfbGVuZ3RoID0gQ01QS19SWF9UWF9TVFNfU0laRTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBSWF9UWF9QRVJfUEtUX0ZFRURCQUNLOgorCQkJCS8vIFlvdSBtdXN0IGF0IGxlYXNlIGFkZCBhIHN3aXRjaCBjYXNlIGVsZW1lbnQgaGVyZSwKKwkJCQkvLyBPdGhlcndpc2UsIHdlIHdpbGwganVtcCB0byBkZWZhdWx0IGNhc2UuCisJCQkJLy9EYmdQcmludCgiQ0NYIFRlc3RcclxuIik7CisJCQkJY21kX2xlbmd0aCA9IENNUEtfUlhfVFhfRkJfU0laRTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBSWF9UWF9SQVRFX0hJU1RPUlk6CisJCQkJLy9EYmdQcmludCgiIHJ4IHR4IHJhdGUgaGlzdG9yeVxyXG4iKTsKKwkJCQljbXBrX2hhbmRsZV90eF9yYXRlX2hpc3RvcnkoZGV2LCBwY21kX2J1ZmYpOworCQkJCWNtZF9sZW5ndGggPSBDTVBLX1RYX1JBSElTX1NJWkU7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisKKwkJCQlSVF9UUkFDRShDT01QX0VSUiwgIi0tLS0+Y21wa19tZXNzYWdlX2hhbmRsZV9yeCgpOnVua25vdyBDTUQgRWxlbWVudFxuIik7CisJCQkJcmV0dXJuIDE7CS8qIFRoaXMgaXMgYSBjb21tYW5kIHBhY2tldC4gKi8KKwkJfQorCQkvLyAyMDA3LzAxLzIyIE1IIERpc3BsYXkgcmVjZWl2ZWQgcnggY29tbWFuZCBwYWNrZXQgaW5mby4KKwkJLy9jbXBrX0Rpc3BsYXlfTWVzc2FnZShjbWRfbGVuZ3RoLCBwY21kX2J1ZmYpOworCisJCS8vIDIwMDcvMDEvMjIgTUggQWRkIHRvIGRpc3BsYXkgdHggc3RhdGlzdGljLgorCQkvL2NtcGtfRGlzcGxheVR4U3RhdGlzdGljKHBBZGFwdGVyKTsKKworCQkvKiAyMDA3LzAzLzA5IE1IIENvbGxlY3Qgc2lkZGVyZW50IGNtZCBlbGVtZW50IHBrdCBudW0uICovCisJCXByaXYtPnN0YXRzLnJ4Y21kcGt0W2VsZW1lbnRfaWRdKys7CisKKwkJdG90YWxfbGVuZ3RoIC09IGNtZF9sZW5ndGg7CisJCXBjbWRfYnVmZiAgICArPSBjbWRfbGVuZ3RoOworCX0JLyogd2hpbGUgKHRvdGFsX2xlbmd0aCA+IDApICovCisJcmV0dXJuCTE7CS8qIFRoaXMgaXMgYSBjb21tYW5kIHBhY2tldC4gKi8KKworfQkvKiBDTVBLX01lc3NhZ2VfSGFuZGxlX1J4ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2NtZHBrdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9jbWRwa3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODg1NWU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9jbWRwa3QuaApAQCAtMCwwICsxLDIwNyBAQAorI2lmbmRlZiBSODE5WFVTQl9DTURQS1RfSAorI2RlZmluZSBSODE5WFVTQl9DTURQS1RfSAorLyogRGlmZmVyZW50IGNvbW1hbmQgcGFja2V0IGhhdmUgZGVkaWNhdGVkIG1lc3NhZ2UgbGVuZ3RoIGFuZCBkZWZpbml0aW9uLiAqLworI2RlZmluZQkJQ01QS19SWF9UWF9GQl9TSVpFCQkJCQlzaXplb2YoY21wa190eGZiX3QpCQkvLzIwCisjZGVmaW5lCQlDTVBLX1RYX1NFVF9DT05GSUdfU0laRQkJCQlzaXplb2YoY21wa19zZXRfY2ZnX3QpCS8vMTYKKyNkZWZpbmUJCUNNUEtfQk9USF9RVUVSWV9DT05GSUdfU0laRQkJCXNpemVvZihjbXBrX3NldF9jZmdfdCkJLy8xNgorI2RlZmluZQkJQ01QS19SWF9UWF9TVFNfU0laRQkJCQkJc2l6ZW9mKGNtcGtfdHhfc3RhdHVzX3QpLy8KKyNkZWZpbmUJCUNNUEtfUlhfREJHX01TR19TSVpFCQkJc2l6ZW9mKGNtcGtfcnhfZGJnaW5mb190KS8vCisjZGVmaW5lCQlDTVBLX1RYX1JBSElTX1NJWkUJCQlzaXplb2YoY21wa190eF9yYWhpc190KQorCisvKiAyMDA4LzA1LzA4IGFteSBGb3IgVVNCIGNvbnN0YW50LiAqLworI2RlZmluZSBJU1JfVHhCY25PawkJCQkJQklUMjcJCQkvLyBUcmFuc21pdCBCZWFjb24gT0sKKyNkZWZpbmUgSVNSX1R4QmNuRXJyCQkJCUJJVDI2CQkJLy8gVHJhbnNtaXQgQmVhY29uIEVycm9yCisjZGVmaW5lIElTUl9CY25UaW1lckludHIJCQlCSVQxMwkJCS8vIEJlYWNvbiBUaW1lciBJbnRlcnJ1cHQKKworCisvKiBEZWZpbmUgZWxlbWVudCBJRCBvZiBjb21tYW5kIHBhY2tldC4gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgc3RydWN0dXJlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBEZWZpbmUgZGlmZmVyZW50IGNvbW1hbmQgcGFja2V0IHN0cnVjdHVyZS4gKi8KKy8qIDEuIFJYIHNpZGU6IFRYIGZlZWRiYWNrIHBhY2tldC4gKi8KK3R5cGVkZWYgc3RydWN0IHRhZ19jbWRfcGt0X3R4X2ZlZWRiYWNrCit7CisJLy8gRFdPUkQgMAorCXU4CWVsZW1lbnRfaWQ7CQkJLyogQ29tbWFuZCBwYWNrZXQgdHlwZS4gKi8KKwl1OAlsZW5ndGg7CQkJCS8qIENvbW1hbmQgcGFja2V0IGxlbmd0aC4gKi8KKwkvKiAyMDA3LzA3LzA1IE1IIENoYW5nZSB0eCBmZWVkYmFjayBpbmZvIGZpZWxkLiAqLworCS8qLS0tLS0tVFggRmVlZGJhY2sgSW5mbyBGaWVsZCAqLworCXU4CVRJRDo0OwkJCQkvKiAqLworCXU4CWZhaWxfcmVhc29uOjM7CQkvKiAqLworCXU4CXRvazoxOwkJCQkvKiBUcmFuc21pdCBvay4gKi8KKwl1OAlyZXNlcnZlMTo0OwkJCS8qICovCisJdTgJcGt0X3R5cGU6MjsJCS8qICovCisJdTgJYmFuZHdpZHRoOjE7CQkvKiAqLworCXU4CXFvc19wa3Q6MTsJCQkvKiAqLworCisJLy8gRFdPUkQgMQorCXU4CXJlc2VydmUyOwkJCS8qICovCisJLyotLS0tLS1UWCBGZWVkYmFjayBJbmZvIEZpZWxkICovCisJdTgJcmV0cnlfY250OwkJCS8qICovCisJdTE2CXBrdF9pZDsJCQkJLyogKi8KKworCS8vIERXT1JEIDMKKwl1MTYJc2VxX251bTsJCQkvKiAqLworCXU4CXNfcmF0ZTsJCQkJLyogU3RhcnQgcmF0ZS4gKi8KKwl1OAlmX3JhdGU7CQkJCS8qIEZpbmFsIHJhdGUuICovCisKKwkvLyBEV09SRCA0CisJdTgJc19ydHNfcmF0ZTsJCQkvKiAqLworCXU4CWZfcnRzX3JhdGU7CQkJLyogKi8KKwl1MTYJcGt0X2xlbmd0aDsJCQkvKiAqLworCisJLy8gRFdPUkQgNQorCXUxNglyZXNlcnZlMzsJCQkvKiAqLworCXUxNglkdXJhdGlvbjsJCQkvKiAqLworfWNtcGtfdHhmYl90OworCisvKiAyLiBSWCBzaWRlOiBJbnRlcnJ1cHQgc3RhdHVzIHBhY2tldC4gSXQgaW5jbHVkZXMgQmVhY29uIFN0YXRlLAorCSAgQmVhY29uIFRpbWVyIEludGVycnVwdCBhbmQgb3RoZXIgdXNlZnVsIGluZm9ybWF0aW9ucyBpbiBNQUMgSVNSIFJlZy4gKi8KK3R5cGVkZWYgc3RydWN0IHRhZ19jbWRfcGt0X2ludGVycnVwdF9zdGF0dXMKK3sKKwl1OAllbGVtZW50X2lkOwkJCS8qIENvbW1hbmQgcGFja2V0IHR5cGUuICovCisJdTgJbGVuZ3RoOwkJCQkvKiBDb21tYW5kIHBhY2tldCBsZW5ndGguICovCisJdTE2CXJlc2VydmU7CisJdTMyCWludGVycnVwdF9zdGF0dXM7CQkJCS8qIEludGVycnVwdCBTdGF0dXMuICovCit9Y21wa19pbnRyX3N0YV90OworCisKKy8qIDMuIFRYIHNpZGU6IFNldCBjb25maWd1cmF0aW9uIHBhY2tldC4gKi8KK3R5cGVkZWYgc3RydWN0IHRhZ19jbWRfcGt0X3NldF9jb25maWd1cmF0aW9uCit7CisJdTgJZWxlbWVudF9pZDsJCQkvKiBDb21tYW5kIHBhY2tldCB0eXBlLiAqLworCXU4CWxlbmd0aDsJCQkJLyogQ29tbWFuZCBwYWNrZXQgbGVuZ3RoLiAqLworCXUxNglyZXNlcnZlMTsJCQkvKiAqLworCXU4IAljZmdfcmVzZXJ2ZTE6MzsKKwl1OAljZmdfc2l6ZToyOwkJCS8qIENvbmZpZ3VyYXRpb24gaW5mby4gKi8KKwl1OAljZmdfdHlwZToyOwkJCS8qIENvbmZpZ3VyYXRpb24gaW5mby4gKi8KKwl1OAljZmdfYWN0aW9uOjE7CQkvKiBDb25maWd1cmF0aW9uIGluZm8uICovCisJdTgJY2ZnX3Jlc2VydmUyOwkJLyogQ29uZmlndXJhdGlvbiBpbmZvLiAqLworCXU4CWNmZ19wYWdlOjQ7CQkJLyogQ29uZmlndXJhdGlvbiBpbmZvLiAqLworCXU4CWNmZ19yZXNlcnZlMzo0OwkJLyogQ29uZmlndXJhdGlvbiBpbmZvLiAqLworCXU4CWNmZ19vZmZzZXQ7CQkJLyogQ29uZmlndXJhdGlvbiBpbmZvLiAqLworCXUzMgl2YWx1ZTsJCQkJLyogKi8KKwl1MzIJbWFzazsJCQkJLyogKi8KK31jbXBrX3NldF9jZmdfdDsKKworLyogNC4gQm90aCBzaWRlIDogVFgvUlggcXVlcnkgY29uZmlndXJhdG9uIHBhY2tldC4gVGhlIHF1ZXJ5IHN0cnVjdHVyZSBpcyB0aGUKKyAgICAgIHNhbWUgYXMgc2V0IGNvbmZpZ3VyYXRpb24uICovCisjZGVmaW5lCQljbXBrX3F1ZXJ5X2NmZ190CWNtcGtfc2V0X2NmZ190CisKKy8qIDUuIE11bHRpIHBhY2tldCBmZWVkYmFjayBzdGF0dXMuICovCit0eXBlZGVmIHN0cnVjdCB0YWdfdHhfc3RhdHNfZmVlZGJhY2sgLy8gUEogcXVpY2sgcnhjbWQgMDkwNDIwMDcKK3sKKwkvLyBGb3IgZW5kaWFuIHRyYW5zZmVyIC0tPiBEcml2ZXIgd2lsbCBub3QgdGhlIHNhbWUgYXMgZmlybXdhcmUgc3RydWN0dXJlLgorCS8vIERXIDAKKwl1MTYJcmVzZXJ2ZTE7CisJdTggCWxlbmd0aDsJCQkJLy8gQ29tbWFuZCBwYWNrZXQgbGVuZ3RoCisJdTggCWVsZW1lbnRfaWQ7CQkJLy8gQ29tbWFuZCBwYWNrZXQgdHlwZQorCisJLy8gRFcgMQorCXUxNgl0eGZhaWw7CQkJCS8vIFR4IEZhaWwgY291bnQKKwl1MTYgCXR4b2s7CQkJCS8vIFR4IG9rIGNvdW50CisKKwkvLyBEVyAyCisJdTE2CXR4bWNvazsgIAkJCS8vIHR4IG11bHRpY2FzdAorCXUxNiAJdHhyZXRyeTsJCQkvLyBUeCBSZXRyeSBjb3VudAorCisJLy8gRFcgMworCXUxNiAgdHh1Y29rOwkJCQkvLyB0eCB1bmljYXN0CisJdTE2CXR4YmNvazsgIAkJCS8vIHR4IGJyb2FkY2FzdAorCisJLy8gRFcgNAorCXUxNgl0eGJjZmFpbDsJCQkvLworCXUxNgl0eG1jZmFpbDsJCQkvLworCisJLy8gRFcgNQorCXUxNglyZXNlcnZlMjsJCQkvLworCXUxNgl0eHVjZmFpbDsJCQkvLworCisJLy8gRFcgNi04CisJdTMyCXR4bWNsZW5ndGg7CisJdTMyCXR4YmNsZW5ndGg7CisJdTMyCXR4dWNsZW5ndGg7CisKKwkvLyBEVyA5CisJdTE2CXJlc2VydmUzXzIzOworCXU4CXJlc2VydmUzXzE7CisJdTgJcmF0ZTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBjbXBrX3R4X3N0YXR1c190OworCisvKiA2LiBEZWJ1ZyBmZWVkYmFjayBtZXNzYWdlLiAqLworLyogMjAwNy8xMC8yMyBNSCBEZWZpbmUgUlggZGVidWcgbWVzc2FnZSAgKi8KK3R5cGVkZWYgc3RydWN0IHRhZ19yeF9kZWJ1Z19tZXNzYWdlX2ZlZWRiYWNrCit7CisJLy8gRm9yIGVuZGlhbiB0cmFuc2ZlciAtLT4gZm9yIGRyaXZlcgorCS8vIERXIDAKKwl1MTYJcmVzZXJ2ZTE7CisJdTggCWxlbmd0aDsJCQkJLy8gQ29tbWFuZCBwYWNrZXQgbGVuZ3RoCisJdTggCWVsZW1lbnRfaWQ7CQkJLy8gQ29tbWFuZCBwYWNrZXQgdHlwZQorCisJLy8gRFcgMS0/PworCS8vIFZhcmlhYmxlIGRlYnVnIG1lc3NhZ2UuCisKK31jbXBrX3J4X2RiZ2luZm9fdDsKKworLyogMjAwOC8wMy8yMCBNSCBEZWZpbmUgdHJhbnNtaXQgcmF0ZSBoaXN0b3J5LiBGb3IgYmlnIGVuZGlhbiBmb3JtYXQuICovCit0eXBlZGVmIHN0cnVjdCB0YWdfdHhfcmF0ZV9oaXN0b3J5Cit7CisJLy8gRm9yIGVuZGlhbiB0cmFuc2ZlciAtLT4gZm9yIGRyaXZlcgorCS8vIERXIDAKKwl1OCAJZWxlbWVudF9pZDsJCQkvLyBDb21tYW5kIHBhY2tldCB0eXBlCisJdTggCWxlbmd0aDsJCQkJLy8gQ29tbWFuZCBwYWNrZXQgbGVuZ3RoCisJdTE2CXJlc2VydmVkMTsKKworCS8vIERXIDEtMglDQ0sgcmF0ZSBjb3VudGVyCisJdTE2IAljY2tbNF07CisKKwkvLyBEVyAzLTYKKwl1MTYgCW9mZG1bOF07CisKKwkvLyBEVyA3LTE0CisJLy9VSU5UMTYJTUNTX0JXMF9TRzBbMTZdOworCisJLy8gRFcgMTUtMjIKKwkvL1VJTlQxNglNQ1NfQlcxX1NHMFsxNl07CisKKwkvLyBEVyAyMy0zMAorCS8vVUlOVDE2CU1DU19CVzBfU0cxWzE2XTsKKworCS8vIERXIDMxLTM4CisJLy9VSU5UMTYJTUNTX0JXMV9TRzFbMTZdOworCisJLy8gRFcgNy0xNAlCVz0wIFNHPTAKKwkvLyBEVyAxNS0yMglCVz0xIFNHPTAKKwkvLyBEVyAyMy0zMAlCVz0wIFNHPTEKKwkvLyBEVyAzMS0zOAlCVz0xIFNHPTEKKwl1MTYJaHRfbWNzWzRdWzE2XTsKKworfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGNtcGtfdHhfcmFoaXNfdDsKKwordHlwZWRlZiBlbnVtIHRhZ19jb21tYW5kX3BhY2tldF9kaXJlY3RvcmllcworeworICAgIFJYX1RYX0ZFRURCQUNLID0gMCwKKyAgICBSWF9JTlRFUlJVUFRfU1RBVFVTCQk9IDEsCisgICAgVFhfU0VUX0NPTkZJRwkJCQk9IDIsCisgICAgQk9USF9RVUVSWV9DT05GSUcJCQk9IDMsCisgICAgUlhfVFhfU1RBVFVTCQkJCT0gNCwKKyAgICBSWF9EQkdJTkZPX0ZFRURCQUNLCQk9IDUsCisgICAgUlhfVFhfUEVSX1BLVF9GRUVEQkFDSwkJPSA2LAorICAgIFJYX1RYX1JBVEVfSElTVE9SWQkJPSA3LAorICAgIFJYX0NNRF9FTEVfTUFYCit9Y21wa19lbGVtZW50X2U7CisKK3R5cGVkZWYgZW51bSBfcnRfc3RhdHVzeworCVJUX1NUQVRVU19TVUNDRVNTLAorCVJUX1NUQVRVU19GQUlMVVJFLAorCVJUX1NUQVRVU19QRU5ESU5HLAorCVJUX1NUQVRVU19SRVNPVVJDRQorfXJ0X3N0YXR1cywqcHJ0X3N0YXR1czsKKworZXh0ZXJuIHJ0X3N0YXR1cyBjbXBrX21lc3NhZ2VfaGFuZGxlX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4KiBjb2RldmlydHVhbGFkZHJlc3MsIHUzMiBwYWNrZXR0eXBlLCB1MzIgYnVmZmVyX2xlbik7CisKK2V4dGVybiAgdTMyIGNtcGtfbWVzc2FnZV9oYW5kbGVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqIHBzdGF0cyk7CitleHRlcm4gcnRfc3RhdHVzIFNlbmRUeENvbW1hbmRQYWNrZXQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQqIHBEYXRhLCB1MzIgRGF0YUxlbik7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NjMmQ1NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfZmlybXdhcmUuYwpAQCAtMCwwICsxLDQzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQcm9jZWR1cmU6ICAgIEluaXQgYm9vdCBjb2RlL2Zpcm13YXJlIGNvZGUvZGF0YSBzZXNzaW9uCisgKgorICogRGVzY3JpcHRpb246IFRoaXMgcm91dGluZSB3aWxsIGludGlhbGl6ZSBmaXJtd2FyZS4gSWYgYW55IGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uCisgKiAJCXByb2Nlc3MsIHRoZSByb3V0aW5lIHNoYWxsIHRlcm1pbmF0ZSBpbW1lZGlhdGVseSBhbmQgcmV0dXJuIGZhaWwuCisgKgkJTklDIGRyaXZlciBzaG91bGQgY2FsbCBOZGlzT3BlbkZpbGUgb25seSBmcm9tIE1pbmlwb3J0SW5pdGlhbGl6ZS4KKyAqCisgKiBBcmd1bWVudHM6ICAgVGhlIHBvaW50ZXIgb2YgdGhlIGFkYXB0ZXIKKworICogUmV0dXJuczoKKyAqICAgICAgICBORElTX1NUQVRVU19GQUlMVVJFIC0gdGhlIGZvbGxvd2luZyBpbml0aWFsaXphdGlvbiBwcm9jZXNzIHNob3VsZCBiZSB0ZXJtaW5hdGVkCisgKiAgICAgICAgTkRJU19TVEFUVVNfU1VDQ0VTUyAtIGlmIGZpcm13YXJlIGluaXRpYWxpemF0aW9uIHByb2Nlc3Mgc3VjY2VzcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKyNpbmNsdWRlICJyODE5MlUuaCIKKyNpbmNsdWRlICJyODE5MlVfaHcuaCIKKyNpbmNsdWRlICJyODE5eFVfZmlybXdhcmVfaW1nLmgiCisjaW5jbHVkZSAicjgxOXhVX2Zpcm13YXJlLmgiCisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KK3ZvaWQgZmlybXdhcmVfaW5pdF9wYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2IAkqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJcnRfZmlybXdhcmUJCSpwZmlybXdhcmUgPSBwcml2LT5wRmlybXdhcmU7CisKKwlwZmlybXdhcmUtPmNtZHBhY2tldF9mcmFnX3RocmVzb2xkID0gR0VUX0NPTU1BTkRfUEFDS0VUX0ZSQUdfVEhSRVNIT0xEKE1BWF9UUkFOU01JVF9CVUZGRVJfU0laRSk7Cit9CisKKy8qCisgKiBzZWdtZW50IHRoZSBpbWcgYW5kIHVzZSB0aGUgcHRyIGFuZCBsZW5ndGggdG8gcmVtZW1iZXIgaW5mbyBvbiBlYWNoIHNlZ21lbnQKKyAqCisgKi8KK2Jvb2wgZndfZG93bmxvYWRfY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqY29kZV92aXJ0dWFsX2FkZHJlc3MsIHUzMiBidWZmZXJfbGVuKQoreworCXN0cnVjdCByODE5Ml9wcml2ICAgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWJvb2wgCQkgICAgcnRfc3RhdHVzID0gdHJ1ZTsKKwl1MTYJCSAgICBmcmFnX3RocmVzaG9sZDsKKwl1MTYJCSAgICBmcmFnX2xlbmd0aCwgZnJhZ19vZmZzZXQgPSAwOworCS8vdTE2CQkgICAgdG90YWxfc2l6ZTsKKwlpbnQJCSAgICBpOworCisJcnRfZmlybXdhcmUJICAgICpwZmlybXdhcmUgPSBwcml2LT5wRmlybXdhcmU7CisJc3RydWN0IHNrX2J1ZmYJICAgICpza2I7CisJdW5zaWduZWQgY2hhcgkgICAgKnNlZ19wdHI7CisJY2JfZGVzYwkJICAgICp0Y2JfZGVzYzsKKwl1OCAgICAgICAgICAgICAgICAgIGJMYXN0SW5pUGt0OworCisJZmlybXdhcmVfaW5pdF9wYXJhbShkZXYpOworCS8vRnJhZ21lbnRhdGlvbiBtaWdodCBiZSByZXF1aXJlZAorCWZyYWdfdGhyZXNob2xkID0gcGZpcm13YXJlLT5jbWRwYWNrZXRfZnJhZ190aHJlc29sZDsKKwlkbyB7CisJCWlmKChidWZmZXJfbGVuIC0gZnJhZ19vZmZzZXQpID4gZnJhZ190aHJlc2hvbGQpIHsKKwkJCWZyYWdfbGVuZ3RoID0gZnJhZ190aHJlc2hvbGQgOworCQkJYkxhc3RJbmlQa3QgPSAwOworCisJCX0gZWxzZSB7CisJCQlmcmFnX2xlbmd0aCA9IGJ1ZmZlcl9sZW4gLSBmcmFnX29mZnNldDsKKwkJCWJMYXN0SW5pUGt0ID0gMTsKKworCQl9CisKKwkJLyogQWxsb2NhdGUgc2tiIGJ1ZmZlciB0byBjb250YWluIGZpcm13YXJlIGluZm8gYW5kIHR4IGRlc2NyaXB0b3IgaW5mbworCQkgKiBhZGQgNCB0byBhdm9pZCBwYWNrZXQgYXBwZW5kaW5nIG92ZXJmbG93LgorCQkgKiAqLworCQkjaWZkZWYgUlRMODE5MlUKKwkJc2tiICA9IGRldl9hbGxvY19za2IoVVNCX0hXREVTQ19IRUFERVJfTEVOICsgZnJhZ19sZW5ndGggKyA0KTsKKwkJI2Vsc2UKKwkJc2tiICA9IGRldl9hbGxvY19za2IoZnJhZ19sZW5ndGggKyA0KTsKKwkJI2VuZGlmCisJCW1lbWNweSgodW5zaWduZWQgY2hhciAqKShza2ItPmNiKSwmZGV2LHNpemVvZihkZXYpKTsKKwkJdGNiX2Rlc2MgPSAoY2JfZGVzYyopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJCXRjYl9kZXNjLT5xdWV1ZV9pbmRleCA9IFRYQ01EX1FVRVVFOworCQl0Y2JfZGVzYy0+YkNtZE9ySW5pdCA9IERFU0NfUEFDS0VUX1RZUEVfSU5JVDsKKwkJdGNiX2Rlc2MtPmJMYXN0SW5pUGt0ID0gYkxhc3RJbmlQa3Q7CisKKwkJI2lmZGVmIFJUTDgxOTJVCisJCXNrYl9yZXNlcnZlKHNrYiwgVVNCX0hXREVTQ19IRUFERVJfTEVOKTsKKwkJI2VuZGlmCisJCXNlZ19wdHIgPSBza2ItPmRhdGE7CisJCS8qCisJCSAqIFRyYW5zZm9ybSBmcm9tIGxpdHRsZSBlbmRpYW4gdG8gYmlnIGVuZGlhbgorCQkgKiBhbmQgcGVuZGluZyAgemVybworCQkgKi8KKwkJZm9yKGk9MCA7IGkgPCBmcmFnX2xlbmd0aDsgaSs9NCkgeworCQkJKnNlZ19wdHIrKyA9ICgoaSswKTxmcmFnX2xlbmd0aCk/Y29kZV92aXJ0dWFsX2FkZHJlc3NbaSszXTowOworCQkJKnNlZ19wdHIrKyA9ICgoaSsxKTxmcmFnX2xlbmd0aCk/Y29kZV92aXJ0dWFsX2FkZHJlc3NbaSsyXTowOworCQkJKnNlZ19wdHIrKyA9ICgoaSsyKTxmcmFnX2xlbmd0aCk/Y29kZV92aXJ0dWFsX2FkZHJlc3NbaSsxXTowOworCQkJKnNlZ19wdHIrKyA9ICgoaSszKTxmcmFnX2xlbmd0aCk/Y29kZV92aXJ0dWFsX2FkZHJlc3NbaSswXTowOworCQl9CisJCXRjYl9kZXNjLT50eGJ1Zl9zaXplPSAodTE2KWk7CisJCXNrYl9wdXQoc2tiLCBpKTsKKworCQlpZighcHJpdi0+aWVlZTgwMjExLT5jaGVja19uaWNfZW5vdWdoX2Rlc2MoZGV2LHRjYl9kZXNjLT5xdWV1ZV9pbmRleCl8fAorCQkJKCFza2JfcXVldWVfZW1wdHkoJnByaXYtPmllZWU4MDIxMS0+c2tiX3dhaXRRW3RjYl9kZXNjLT5xdWV1ZV9pbmRleF0pKXx8XAorCQkJKHByaXYtPmllZWU4MDIxMS0+cXVldWVfc3RvcCkgKSB7CisJCQlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT4gdHggZnVsbCFcbiIpOworCQkJc2tiX3F1ZXVlX3RhaWwoJnByaXYtPmllZWU4MDIxMS0+c2tiX3dhaXRRW3RjYl9kZXNjLT5xdWV1ZV9pbmRleF0sIHNrYik7CisJCX0gZWxzZSB7CisJCQlwcml2LT5pZWVlODAyMTEtPnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KHNrYixkZXYpOworCQl9CisKKwkJY29kZV92aXJ0dWFsX2FkZHJlc3MgKz0gZnJhZ19sZW5ndGg7CisJCWZyYWdfb2Zmc2V0ICs9IGZyYWdfbGVuZ3RoOworCisJfXdoaWxlKGZyYWdfb2Zmc2V0IDwgYnVmZmVyX2xlbik7CisKKwlyZXR1cm4gcnRfc3RhdHVzOworCit9CisKK2Jvb2wKK2Z3U2VuZE51bGxQYWNrZXQoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1MzIJCQlMZW5ndGgKKykKK3sKKwlib29sCXJ0U3RhdHVzID0gdHJ1ZTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAgICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc2tfYnVmZgkgICAgKnNrYjsKKwljYl9kZXNjCQkgICAgKnRjYl9kZXNjOworCXVuc2lnbmVkIGNoYXIJICAgICpwdHJfYnVmOworCWJvb2wJYkxhc3RJbml0UGFja2V0ID0gZmFsc2U7CisKKwkvL1BsYXRmb3JtQWNxdWlyZVNwaW5Mb2NrKEFkYXB0ZXIsIFJUX1RYX1NQSU5MT0NLKTsKKworCS8vR2V0IFRDQiBhbmQgbG9jYWwgYnVmZmVyIGZyb20gY29tbW9uIHBvb2wuIChJdCBpcyBzaGFyZWQgYnkgQ21kUSwgTWdudFEsIGFuZCBVU0IgY29hbGVzY2UgRGF0YVEpCisJc2tiICA9IGRldl9hbGxvY19za2IoTGVuZ3RoKyA0KTsKKwltZW1jcHkoKHVuc2lnbmVkIGNoYXIgKikoc2tiLT5jYiksJmRldixzaXplb2YoZGV2KSk7CisJdGNiX2Rlc2MgPSAoY2JfZGVzYyopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJdGNiX2Rlc2MtPnF1ZXVlX2luZGV4ID0gVFhDTURfUVVFVUU7CisJdGNiX2Rlc2MtPmJDbWRPckluaXQgPSBERVNDX1BBQ0tFVF9UWVBFX0lOSVQ7CisJdGNiX2Rlc2MtPmJMYXN0SW5pUGt0ID0gYkxhc3RJbml0UGFja2V0OworCXB0cl9idWYgPSBza2JfcHV0KHNrYiwgTGVuZ3RoKTsKKwltZW1zZXQocHRyX2J1ZiwwLExlbmd0aCk7CisJdGNiX2Rlc2MtPnR4YnVmX3NpemU9ICh1MTYpTGVuZ3RoOworCisJaWYoIXByaXYtPmllZWU4MDIxMS0+Y2hlY2tfbmljX2Vub3VnaF9kZXNjKGRldix0Y2JfZGVzYy0+cXVldWVfaW5kZXgpfHwKKwkJCSghc2tiX3F1ZXVlX2VtcHR5KCZwcml2LT5pZWVlODAyMTEtPnNrYl93YWl0UVt0Y2JfZGVzYy0+cXVldWVfaW5kZXhdKSl8fFwKKwkJCShwcml2LT5pZWVlODAyMTEtPnF1ZXVlX3N0b3ApICkgeworCQkJUlRfVFJBQ0UoQ09NUF9GSVJNV0FSRSwiPT09PT09PT09PT09PT09PT09PU5VTEwgcGFja2V0PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT4gdHggZnVsbCFcbiIpOworCQkJc2tiX3F1ZXVlX3RhaWwoJnByaXYtPmllZWU4MDIxMS0+c2tiX3dhaXRRW3RjYl9kZXNjLT5xdWV1ZV9pbmRleF0sIHNrYik7CisJCX0gZWxzZSB7CisJCQlwcml2LT5pZWVlODAyMTEtPnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KHNrYixkZXYpOworCQl9CisKKwkvL1BsYXRmb3JtUmVsZWFzZVNwaW5Mb2NrKEFkYXB0ZXIsIFJUX1RYX1NQSU5MT0NLKTsKKwlyZXR1cm4gcnRTdGF0dXM7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHJvY2VkdXJlOiAgICBDaGVjayB3aGV0aGVyIG1haW4gY29kZSBpcyBkb3dubG9hZCBPSy4gSWYgT0ssIHR1cm4gb24gQ1BVCisvLworLy8gRGVzY3JpcHRpb246ICAgQ1BVIHJlZ2lzdGVyIGxvY2F0ZXMgaW4gZGlmZmVyZW50IHBhZ2UgYWdhaW5zdCBnZW5lcmFsIHJlZ2lzdGVyLgorLy8JCQkgICAgU3dpdGNoIHRvIENQVSByZWdpc3RlciBpbiB0aGUgYmVnaW4gYW5kIHN3aXRjaCBiYWNrIGJlZm9yZSByZXR1cm4KKy8vCisvLworLy8gQXJndW1lbnRzOiAgIFRoZSBwb2ludGVyIG9mIHRoZSBhZGFwdGVyCisvLworLy8gUmV0dXJuczoKKy8vICAgICAgICBORElTX1NUQVRVU19GQUlMVVJFIC0gdGhlIGZvbGxvd2luZyBpbml0aWFsaXphdGlvbiBwcm9jZXNzIHNob3VsZCBiZSB0ZXJtaW5hdGVkCisvLyAgICAgICAgTkRJU19TVEFUVVNfU1VDQ0VTUyAtIGlmIGZpcm13YXJlIGluaXRpYWxpemF0aW9uIHByb2Nlc3Mgc3VjY2VzcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorYm9vbCBDUFVjaGVja19tYWluY29kZW9rX3R1cm5vbkNQVShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWJvb2wJCXJ0X3N0YXR1cyA9IHRydWU7CisJaW50CQljaGVja19wdXRjb2RlT0tfdGltZSA9IDIwMDAwMCwgY2hlY2tfYm9vdE9rX3RpbWUgPSAyMDAwMDA7CisJdTMyCQlDUFVfc3RhdHVzID0gMDsKKworCS8qIENoZWNrIHdoZXRoZXIgcHV0IGNvZGUgT0sgKi8KKwlkbyB7CisJCUNQVV9zdGF0dXMgPSByZWFkX25pY19kd29yZChkZXYsIENQVV9HRU4pOworCisJCWlmKENQVV9zdGF0dXMmQ1BVX0dFTl9QVVRfQ09ERV9PSykKKwkJCWJyZWFrOworCisJfXdoaWxlKGNoZWNrX3B1dGNvZGVPS190aW1lLS0pOworCisJaWYoIShDUFVfc3RhdHVzJkNQVV9HRU5fUFVUX0NPREVfT0spKSB7CisJCVJUX1RSQUNFKENPTVBfRVJSLCAiRG93bmxvYWQgRmlybXdhcmU6IFB1dCBjb2RlIGZhaWwhXG4iKTsKKwkJZ290byBDUFVDaGVja01haW5Db2RlT0tBbmRUdXJuT25DUFVfRmFpbDsKKwl9IGVsc2UgeworCQlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLCAiRG93bmxvYWQgRmlybXdhcmU6IFB1dCBjb2RlIG9rIVxuIik7CisJfQorCisJLyogVHVybiBPbiBDUFUgKi8KKwlDUFVfc3RhdHVzID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBDUFVfR0VOKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENQVV9HRU4sICh1OCkoKENQVV9zdGF0dXN8Q1BVX0dFTl9QV1JfU1RCX0NQVSkmMHhmZikpOworCW1kZWxheSgxMDAwKTsKKworCS8qIENoZWNrIHdoZXRoZXIgQ1BVIGJvb3QgT0sgKi8KKwlkbyB7CisJCUNQVV9zdGF0dXMgPSByZWFkX25pY19kd29yZChkZXYsIENQVV9HRU4pOworCisJCWlmKENQVV9zdGF0dXMmQ1BVX0dFTl9CT09UX1JEWSkKKwkJCWJyZWFrOworCX13aGlsZShjaGVja19ib290T2tfdGltZS0tKTsKKworCWlmKCEoQ1BVX3N0YXR1cyZDUFVfR0VOX0JPT1RfUkRZKSkgeworCQlnb3RvIENQVUNoZWNrTWFpbkNvZGVPS0FuZFR1cm5PbkNQVV9GYWlsOworCX0gZWxzZSB7CisJCVJUX1RSQUNFKENPTVBfRklSTVdBUkUsICJEb3dubG9hZCBGaXJtd2FyZTogQm9vdCByZWFkeSFcbiIpOworCX0KKworCXJldHVybiBydF9zdGF0dXM7CisKK0NQVUNoZWNrTWFpbkNvZGVPS0FuZFR1cm5PbkNQVV9GYWlsOgorCVJUX1RSQUNFKENPTVBfRVJSLCAiRVJSIGluICVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJcnRfc3RhdHVzID0gRkFMU0U7CisJcmV0dXJuIHJ0X3N0YXR1czsKK30KKworYm9vbCBDUFVjaGVja19maXJtd2FyZV9yZWFkeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJYm9vbAkJcnRfc3RhdHVzID0gdHJ1ZTsKKwlpbnQJCWNoZWNrX3RpbWUgPSAyMDAwMDA7CisJdTMyCQlDUFVfc3RhdHVzID0gMDsKKworCS8qIENoZWNrIEZpcm13YXJlIFJlYWR5ICovCisJZG8geworCQlDUFVfc3RhdHVzID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBDUFVfR0VOKTsKKworCQlpZihDUFVfc3RhdHVzJkNQVV9HRU5fRklSTV9SRFkpCisJCQlicmVhazsKKworCX13aGlsZShjaGVja190aW1lLS0pOworCisJaWYoIShDUFVfc3RhdHVzJkNQVV9HRU5fRklSTV9SRFkpKQorCQlnb3RvIENQVUNoZWNrRmlybXdhcmVSZWFkeV9GYWlsOworCWVsc2UKKwkJUlRfVFJBQ0UoQ09NUF9GSVJNV0FSRSwgIkRvd25sb2FkIEZpcm13YXJlOiBGaXJtd2FyZSByZWFkeSFcbiIpOworCisJcmV0dXJuIHJ0X3N0YXR1czsKKworQ1BVQ2hlY2tGaXJtd2FyZVJlYWR5X0ZhaWw6CisJUlRfVFJBQ0UoQ09NUF9FUlIsICJFUlIgaW4gJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlydF9zdGF0dXMgPSBmYWxzZTsKKwlyZXR1cm4gcnRfc3RhdHVzOworCit9CisKK2Jvb2wgaW5pdF9maXJtd2FyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2IAkqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJYm9vbAkJCXJ0X3N0YXR1cyA9IFRSVUU7CisKKwl1OAkJCSpmaXJtd2FyZV9pbWdfYnVmWzNdID0geyAmcnRsODE5MF9md2Jvb3RfYXJyYXlbMF0sCisJCQkJCQkJICZydGw4MTkwX2Z3bWFpbl9hcnJheVswXSwKKwkJCQkJCQkgJnJ0bDgxOTBfZndkYXRhX2FycmF5WzBdfTsKKworCXUzMgkJCWZpcm13YXJlX2ltZ19sZW5bM10gPSB7IHNpemVvZihydGw4MTkwX2Z3Ym9vdF9hcnJheSksCisJCQkJCQkJc2l6ZW9mKHJ0bDgxOTBfZndtYWluX2FycmF5KSwKKwkJCQkJCQlzaXplb2YocnRsODE5MF9md2RhdGFfYXJyYXkpfTsKKwl1MzIJCQlmaWxlX2xlbmd0aCA9IDA7CisJdTgJCQkqbWFwcGVkX2ZpbGUgPSBOVUxMOworCXUzMgkJCWluaXRfc3RlcCA9IDA7CisJb3B0X3JzdF90eXBlX2UJcnN0X29wdCA9IE9QVF9TWVNURU1fUkVTRVQ7CisJZmlybXdhcmVfaW5pdF9zdGVwX2UgCXN0YXJ0aW5nX3N0YXRlID0gRldfSU5JVF9TVEVQMF9CT09UOworCisJcnRfZmlybXdhcmUJCSpwZmlybXdhcmUgPSBwcml2LT5wRmlybXdhcmU7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlIAkqZndfZW50cnk7CisJY29uc3QgY2hhciAqZndfbmFtZVszXSA9IHsgIlJUTDgxOTJVL2Jvb3QuaW1nIiwKKwkJCSAgICJSVEw4MTkyVS9tYWluLmltZyIsCisJCQkgICAiUlRMODE5MlUvZGF0YS5pbWcifTsKKwlpbnQgcmM7CisKKwlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLCAiIFBsYXRmb3JtSW5pdEZpcm13YXJlKCk9PT5cbiIpOworCisJaWYgKHBmaXJtd2FyZS0+ZmlybXdhcmVfc3RhdHVzID09IEZXX1NUQVRVU18wX0lOSVQgKSB7CisJCS8qIGl0IGlzIGNhbGxlZCBieSByZXNldCAqLworCQlyc3Rfb3B0ID0gT1BUX1NZU1RFTV9SRVNFVDsKKwkJc3RhcnRpbmdfc3RhdGUgPSBGV19JTklUX1NURVAwX0JPT1Q7CisJCS8vIFRPRE86IHN5c3RlbSByZXNldAorCisJfWVsc2UgaWYocGZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPT0gRldfU1RBVFVTXzVfUkVBRFkpIHsKKwkJLyogaXQgaXMgY2FsbGVkIGJ5IEluaXRpYWxpemUgKi8KKwkJcnN0X29wdCA9IE9QVF9GSVJNV0FSRV9SRVNFVDsKKwkJc3RhcnRpbmdfc3RhdGUgPSBGV19JTklUX1NURVAyX0RBVEE7CisJfWVsc2UgeworCQkgUlRfVFJBQ0UoQ09NUF9GSVJNV0FSRSwgIlBsYXRmb3JtSW5pdEZpcm13YXJlOiB1bmRlZmluZWQgZmlybXdhcmUgc3RhdGVcbiIpOworCX0KKworCS8qCisJICogRG93bmxvYWQgYm9vdCwgbWFpbiwgYW5kIGRhdGEgaW1hZ2UgZm9yIFN5c3RlbSByZXNldC4KKwkgKiBEb3dubG9hZCBkYXRhIGltYWdlIGZvciBmaXJtd2FyZSByZXNldGEKKwkgKi8KKwlwcml2LT5maXJtd2FyZV9zb3VyY2UgPSBGV19TT1VSQ0VfSU1HX0ZJTEU7CisJZm9yKGluaXRfc3RlcCA9IHN0YXJ0aW5nX3N0YXRlOyBpbml0X3N0ZXAgPD0gRldfSU5JVF9TVEVQMl9EQVRBOyBpbml0X3N0ZXArKykgeworCQkvKgorCQkgKiBPcGVuIEltYWdlIGZpbGUsIGFuZCBtYXAgZmlsZSB0byBjb250aW5lb3VzIG1lbW9yeSBpZiBvcGVuIGZpbGUgc3VjY2Vzcy4KKwkJICogb3IgcmVhZCBpbWFnZSBmaWxlIGZyb20gYXJyYXkuIERlZmF1bHQgbG9hZCBmcm9tIElNRyBmaWxlCisJCSAqLworCQlpZihyc3Rfb3B0ID09IE9QVF9TWVNURU1fUkVTRVQpIHsKKwkJCXN3aXRjaChwcml2LT5maXJtd2FyZV9zb3VyY2UpIHsKKwkJCQljYXNlIEZXX1NPVVJDRV9JTUdfRklMRToKKwkJCQkJcmMgPSByZXF1ZXN0X2Zpcm13YXJlKCZmd19lbnRyeSwgZndfbmFtZVtpbml0X3N0ZXBdLCZwcml2LT51ZGV2LT5kZXYpOworCQkJCQlpZihyYyA8IDAgKSB7CisJCQkJCQlSVF9UUkFDRShDT01QX0VSUiwgInJlcXVlc3QgZmlybXdhcmUgZmFpbCFcbiIpOworCQkJCQkJZ290byBkb3dubG9hZF9maXJtd2FyZV9mYWlsOworCQkJCQl9CisKKwkJCQkJaWYoZndfZW50cnktPnNpemUgPiBzaXplb2YocGZpcm13YXJlLT5maXJtd2FyZV9idWYpKSB7CisJCQkJCQlSVF9UUkFDRShDT01QX0VSUiwgImltZyBmaWxlIHNpemUgZXhjZWVkIHRoZSBjb250YWluZXIgYnVmZmVyIGZhaWwhXG4iKTsKKwkJCQkJCWdvdG8gZG93bmxvYWRfZmlybXdhcmVfZmFpbDsKKwkJCQkJfQorCisJCQkJCWlmKGluaXRfc3RlcCAhPSBGV19JTklUX1NURVAxX01BSU4pIHsKKwkJCQkJCW1lbWNweShwZmlybXdhcmUtPmZpcm13YXJlX2J1Zixmd19lbnRyeS0+ZGF0YSxmd19lbnRyeS0+c2l6ZSk7CisJCQkJCQltYXBwZWRfZmlsZSA9IHBmaXJtd2FyZS0+ZmlybXdhcmVfYnVmOworCQkJCQkJZmlsZV9sZW5ndGggPSBmd19lbnRyeS0+c2l6ZTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJI2lmZGVmIFJUTDgxOTBQCisJCQkJCQltZW1jcHkocGZpcm13YXJlLT5maXJtd2FyZV9idWYsZndfZW50cnktPmRhdGEsZndfZW50cnktPnNpemUpOworCQkJCQkJbWFwcGVkX2ZpbGUgPSBwZmlybXdhcmUtPmZpcm13YXJlX2J1ZjsKKwkJCQkJCWZpbGVfbGVuZ3RoID0gZndfZW50cnktPnNpemU7CisJCQkJCSNlbHNlCisJCQkJCQltZW1zZXQocGZpcm13YXJlLT5maXJtd2FyZV9idWYsMCwxMjgpOworCQkJCQkJbWVtY3B5KCZwZmlybXdhcmUtPmZpcm13YXJlX2J1ZlsxMjhdLGZ3X2VudHJ5LT5kYXRhLGZ3X2VudHJ5LT5zaXplKTsKKwkJCQkJCW1hcHBlZF9maWxlID0gcGZpcm13YXJlLT5maXJtd2FyZV9idWY7CisJCQkJCQlmaWxlX2xlbmd0aCA9IGZ3X2VudHJ5LT5zaXplICsgMTI4OworCQkJCQkjZW5kaWYKKwkJCQkJfQorCQkJCQlwZmlybXdhcmUtPmZpcm13YXJlX2J1Zl9zaXplID0gZmlsZV9sZW5ndGg7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBGV19TT1VSQ0VfSEVBREVSX0ZJTEU6CisJCQkJCW1hcHBlZF9maWxlID0gIGZpcm13YXJlX2ltZ19idWZbaW5pdF9zdGVwXTsKKwkJCQkJZmlsZV9sZW5ndGggID0gZmlybXdhcmVfaW1nX2xlbltpbml0X3N0ZXBdOworCQkJCQlpZihpbml0X3N0ZXAgPT0gRldfSU5JVF9TVEVQMl9EQVRBKSB7CisJCQkJCQltZW1jcHkocGZpcm13YXJlLT5maXJtd2FyZV9idWYsIG1hcHBlZF9maWxlLCBmaWxlX2xlbmd0aCk7CisJCQkJCQlwZmlybXdhcmUtPmZpcm13YXJlX2J1Zl9zaXplID0gZmlsZV9sZW5ndGg7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCX0KKworCisJCX1lbHNlIGlmKHJzdF9vcHQgPT0gT1BUX0ZJUk1XQVJFX1JFU0VUICkgeworCQkJLyogd2Ugb25seSBuZWVkIHRvIGRvd25sb2FkIGRhdGEuaW1nIGhlcmUgKi8KKwkJCW1hcHBlZF9maWxlID0gcGZpcm13YXJlLT5maXJtd2FyZV9idWY7CisJCQlmaWxlX2xlbmd0aCA9IHBmaXJtd2FyZS0+ZmlybXdhcmVfYnVmX3NpemU7CisJCX0KKworCQkvKiBEb3dubG9hZCBpbWFnZSBmaWxlICovCisJCS8qIFRoZSBmaXJtd2FyZSBkb3dubG9hZCBwcm9jZXNzIGlzIGp1c3QgYXMgZm9sbG93aW5nLAorCQkgKiAxLiB0aGF0IGlzIGVhY2ggcGFja2V0IHdpbGwgYmUgc2VnbWVudGVkIGFuZCBpbnNlcnRlZCB0byB0aGUgd2FpdCBxdWV1ZS4KKwkJICogMi4gZWFjaCBwYWNrZXQgc2VnbWVudCB3aWxsIGJlIHB1dCBpbiB0aGUgc2tiX2J1ZmYgcGFja2V0LgorCQkgKiAzLiBlYWNoIHNrYl9idWZmIHBhY2tldCBkYXRhIGNvbnRlbnQgd2lsbCBhbHJlYWR5IGluY2x1ZGUgdGhlIGZpcm13YXJlIGluZm8KKwkJICogICBhbmQgVHggZGVzY3JpcHRvciBpbmZvCisJCSAqICovCisJCXJ0X3N0YXR1cyA9IGZ3X2Rvd25sb2FkX2NvZGUoZGV2LG1hcHBlZF9maWxlLGZpbGVfbGVuZ3RoKTsKKwkJaWYocnN0X29wdCA9PSBPUFRfU1lTVEVNX1JFU0VUKSB7CisJCQlyZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKKwkJfQorCisJCWlmKHJ0X3N0YXR1cyAhPSBUUlVFKSB7CisJCQlnb3RvIGRvd25sb2FkX2Zpcm13YXJlX2ZhaWw7CisJCX0KKworCQlzd2l0Y2goaW5pdF9zdGVwKSB7CisJCQljYXNlIEZXX0lOSVRfU1RFUDBfQk9PVDoKKwkJCQkvKiBEb3dubG9hZCBib290CisJCQkJICogaW5pdGlhbGl6ZSBjb21tYW5kIGRlc2NyaXB0b3IuCisJCQkJICogd2lsbCBzZXQgcG9sbGluZyBiaXQgd2hlbiBmaXJtd2FyZSBjb2RlIGlzIGFsc28gY29uZmlndXJlZAorCQkJCSAqLworCQkJCXBmaXJtd2FyZS0+ZmlybXdhcmVfc3RhdHVzID0gRldfU1RBVFVTXzFfTU9WRV9CT09UX0NPREU7CisjaWZkZWYgUlRMODE5MFAKKwkJCQkvLyBUbyBpbml0aWFsaXplIElNRU0sIENQVSBtb3ZlIGNvZGUgIGZyb20gMHg4MDAwMDA4MCwgaGVuY2UsIHdlIHNlbmQgMHg4MCBieXRlIHBhY2tldAorCQkJCXJ0X3N0YXR1cyA9IGZ3U2VuZE51bGxQYWNrZXQoZGV2LCBSVEw4MTkwX0NQVV9TVEFSVF9PRkZTRVQpOworCQkJCWlmKHJ0X3N0YXR1cyAhPSB0cnVlKQorCQkJCXsKKwkJCQkJUlRfVFJBQ0UoQ09NUF9JTklULCAiZndTZW5kTnVsbFBhY2tldCgpIGZhaWwgISBcbiIpOworCQkJCQlnb3RvICBkb3dubG9hZF9maXJtd2FyZV9mYWlsOworCQkJCX0KKyNlbmRpZgorCQkJCS8vbWRlbGF5KDEwMDApOworCQkJCS8qCisJCQkJICogVG8gaW5pdGlhbGl6ZSBJTUVNLCBDUFUgbW92ZSBjb2RlICBmcm9tIDB4ODAwMDAwODAsCisJCQkJICogaGVuY2UsIHdlIHNlbmQgMHg4MCBieXRlIHBhY2tldAorCQkJCSAqLworCQkJCWJyZWFrOworCisJCQljYXNlIEZXX0lOSVRfU1RFUDFfTUFJTjoKKwkJCQkvKiBEb3dubG9hZCBmaXJtd2FyZSBjb2RlLiBXYWl0IHVudGlsIEJvb3QgUmVhZHkgYW5kIFR1cm4gb24gQ1BVICovCisJCQkJcGZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPSBGV19TVEFUVVNfMl9NT1ZFX01BSU5fQ09ERTsKKworCQkJCS8qIENoZWNrIFB1dCBDb2RlIE9LIGFuZCBUdXJuIE9uIENQVSAqLworCQkJCXJ0X3N0YXR1cyA9IENQVWNoZWNrX21haW5jb2Rlb2tfdHVybm9uQ1BVKGRldik7CisJCQkJaWYocnRfc3RhdHVzICE9IFRSVUUpIHsKKwkJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJDUFVjaGVja19tYWluY29kZW9rX3R1cm5vbkNQVSBmYWlsIVxuIik7CisJCQkJCWdvdG8gZG93bmxvYWRfZmlybXdhcmVfZmFpbDsKKwkJCQl9CisKKwkJCQlwZmlybXdhcmUtPmZpcm13YXJlX3N0YXR1cyA9IEZXX1NUQVRVU18zX1RVUk5PTl9DUFU7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRldfSU5JVF9TVEVQMl9EQVRBOgorCQkJCS8qIGRvd25sb2FkIGluaXRpYWwgZGF0YSBjb2RlICovCisJCQkJcGZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPSBGV19TVEFUVVNfNF9NT1ZFX0RBVEFfQ09ERTsKKwkJCQltZGVsYXkoMSk7CisKKwkJCQlydF9zdGF0dXMgPSBDUFVjaGVja19maXJtd2FyZV9yZWFkeShkZXYpOworCQkJCWlmKHJ0X3N0YXR1cyAhPSBUUlVFKSB7CisJCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiQ1BVY2hlY2tfZmlybXdhcmVfcmVhZHkgZmFpbCglZCkhXG4iLHJ0X3N0YXR1cyk7CisJCQkJCWdvdG8gZG93bmxvYWRfZmlybXdhcmVfZmFpbDsKKwkJCQl9CisKKwkJCQkvKiB3YWl0IHVudGlsIGRhdGEgY29kZSBpcyBpbml0aWFsaXplZCByZWFkeS4qLworCQkJCXBmaXJtd2FyZS0+ZmlybXdhcmVfc3RhdHVzID0gRldfU1RBVFVTXzVfUkVBRFk7CisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLCAiRmlybXdhcmUgRG93bmxvYWQgU3VjY2Vzc1xuIik7CisJLy9hc3NlcnQocGZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPT0gRldfU1RBVFVTXzVfUkVBRFksICgiRmlybXdhcmUgRG93bmxvYWQgRmFpbFxuIikpOworCisJcmV0dXJuIHJ0X3N0YXR1czsKKworZG93bmxvYWRfZmlybXdhcmVfZmFpbDoKKwlSVF9UUkFDRShDT01QX0VSUiwgIkVSUiBpbiAlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCXJ0X3N0YXR1cyA9IEZBTFNFOworCXJldHVybiBydF9zdGF0dXM7CisKK30KKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRiY2VlZWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlLmgKQEAgLTAsMCArMSwyNyBAQAorI2lmbmRlZiBfX0lOQ19GSVJNV0FSRV9ICisjZGVmaW5lIF9fSU5DX0ZJUk1XQVJFX0gKKworI2RlZmluZSBSVEw4MTkwX0NQVV9TVEFSVF9PRkZTRVQJMHg4MAorLyogVE9ETzogdGhpcyBkZWZpbml0aW9uIGlzIFRCRCAqLworLy8jZGVmaW5lIFVTQl9IV0RFU0NfSEVBREVSX0xFTgkwCisKKy8qIEl0IHNob3VsZCBiZSBkb3VibGUgd29yZCBhbGlnbm1lbnQgKi8KKy8vI2lmIERFVl9CVVNfVFlQRT09UENJX0lOVEVSRkFDRQorLy8jZGVmaW5lIEdFVF9DT01NQU5EX1BBQ0tFVF9GUkFHX1RIUkVTSE9MRCh2KQk0Kih2LzQpIC0gOAorLy8jZWxzZQorI2RlZmluZSBHRVRfQ09NTUFORF9QQUNLRVRfRlJBR19USFJFU0hPTEQodikJKDQqKHYvNCkgLSA4IC0gVVNCX0hXREVTQ19IRUFERVJfTEVOKQorLy8jZW5kaWYKKwordHlwZWRlZiBlbnVtIF9maXJtd2FyZV9pbml0X3N0ZXB7CisJRldfSU5JVF9TVEVQMF9CT09UID0gMCwKKwlGV19JTklUX1NURVAxX01BSU4gPSAxLAorCUZXX0lOSVRfU1RFUDJfREFUQSA9IDIsCit9ZmlybXdhcmVfaW5pdF9zdGVwX2U7CisKK3R5cGVkZWYgZW51bSBfb3B0X3JzdF90eXBleworCU9QVF9TWVNURU1fUkVTRVQgPSAwLAorCU9QVF9GSVJNV0FSRV9SRVNFVCA9IDEsCit9b3B0X3JzdF90eXBlX2U7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlX2ltZy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9maXJtd2FyZV9pbWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWI2NTZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9maXJtd2FyZV9pbWcuYwpAQCAtMCwwICsxLDM0NDcgQEAKKy8qQ3JlYXRlZCBvbiAgMjAwOC8gNy8xNiwgIDU6MzEqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3U4IHJ0bDgxOTBfZndib290X2FycmF5W10gPSB7CisweDEwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDA4LDB4YmYsMHhjMCwweDI1LDB4MDgsMHgwMCwweDA4LAorMHgzYywweDA5LDB4YjAsMHgwMywweGFkLDB4MjgsMHgwMCwweDIwLDB4NDAsMHg4MCwweDY4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4M2MsMHgwYSwweGQwLDB4MDAsMHg0MCwweDhhLDB4NjAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwOCwweDgwLDB4MDEsCisweDI1LDB4MDgsMHhiMCwweDUwLDB4MjQsMHgwOSwweDAwLDB4MDEsMHgzYywweDAxLDB4N2YsMHhmZiwweDM0LDB4MjEsMHhmZiwweGZmLAorMHgwMSwweDAxLDB4NTAsMHgyNCwweDAwLDB4MDksMHg0OCwweDQwLDB4MzUsMHgyOSwweDAwLDB4MDEsMHgwMSwweDJhLDB4MTAsMHgyYiwKKzB4MTQsMHg0MCwweGZmLDB4ZmMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MGEsMHgwMCwweDAwLDB4MjUsMHg0YSwweDAwLDB4MDAsCisweDRjLDB4OGEsMHgwMCwweDAwLDB4NGMsMHg4OSwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDgsMHg4MCwweDAxLAorMHgyNSwweDA4LDB4YjAsMHg1MCwweDNjLDB4MDEsMHg4MCwweDAwLDB4MDEsMHgyMSwweDQ4LDB4MjUsMHgzYywweDBhLDB4YmYsMHhjMCwKKzB4MjUsMHg0YSwweDAwLDB4N2MsMHgzYywweDBiLDB4YjAsMHgwMywweGFkLDB4NmEsMHgwMCwweDIwLDB4YWQsMHgwMCwweDAwLDB4MDAsCisweDIxLDB4MDgsMHgwMCwweDA0LDB4MDEsMHgwOSwweDEwLDB4MmIsMHgxNCwweDQwLDB4ZmYsMHhmOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzYywweDA4LDB4ODAsMHgwMSwweDI1LDB4MDgsMHg3ZiwweGZmLDB4MjQsMHgwOSwweDAwLDB4MDEsMHgzYywweDAxLDB4N2YsMHhmZiwKKzB4MzQsMHgyMSwweGZmLDB4ZmYsMHgwMSwweDAxLDB4NTAsMHgyNCwweDAwLDB4MDksMHg0OCwweDQwLDB4MzUsMHgyOSwweDAwLDB4MDEsCisweDAxLDB4MmEsMHgxMCwweDJiLDB4MTQsMHg0MCwweGZmLDB4ZmMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MGEsMHg4MCwweDAxLAorMHgyNSwweDRhLDB4MDAsMHgwMCwweDNjLDB4MDEsMHg3ZiwweGZmLDB4MzQsMHgyMSwweGZmLDB4ZmYsMHgwMSwweDQxLDB4NTAsMHgyNCwKKzB4M2MsMHgwOSwweDAwLDB4MDEsMHgzNSwweDI5LDB4N2YsMHhmZiwweDRjLDB4OGEsMHgyMCwweDAwLDB4NGMsMHg4OSwweDI4LDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDgsMHgwNCwweDEwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDQwLDB4ODgsMHhhMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4M2MsMHgwOCwweGJmLDB4YzAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhkLDB4MDksMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MGEsMHhiZiwweGMwLDB4MjUsMHg0YSwweDAxLDB4MjAsMHgzYywweDBiLDB4YjAsMHgwMywweGFkLDB4NmEsMHgwMCwweDIwLAorMHgzYywweDA4LDB4YjAsMHgwMywweDhkLDB4MDksMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzNSwweDI5LDB4MDAsMHgxMCwKKzB4YWQsMHgwOSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDgsMHg4MCwweDAwLDB4MjUsMHgwOCwweDRiLDB4ODQsCisweDAxLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsfTsKKwordTggcnRsODE5MF9md21haW5fYXJyYXlbXSA9IHsKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg0MCwweDA0LDB4NjgsMHgwMCwweDQwLDB4MDUsMHg3MCwweDAwLDB4NDAsMHgwNiwweDQwLDB4MDAsMHgwYywweDAwLDB4MTIsMHg5NCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MCwweDFhLDB4NjgsMHgwMCwweDMzLDB4NWIsMHgwMCwweDNjLDB4MTcsMHg2MCwweDAwLDB4MDksCisweDAwLDB4MDAsMHgwMCwweDAwLDB4NDAsMHgxYiwweDYwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4NWIsMHhkMCwweDI0LAorMHg0MCwweDFhLDB4NzAsMHgwMCwweDAzLDB4NDAsMHgwMCwweDA4LDB4NDIsMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAyLDB4ZmYsMHhmZiwweDM0LDB4NDIsMHhmZiwweGZmLDB4OGMsMHg0MywweDAwLDB4MDAsCisweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgzNCwweDYzLDB4MDAsMHgyMCwweDI0LDB4NDIsMHgwMCwweGQwLAorMHhhYywweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyMCwweDIxLDB4MjcsMHg4NSwweDhiLDB4NjAsMHgwMCwweDg1LDB4MTgsMHgyMSwKKzB4MjQsMHg4NCwweDAwLDB4MDEsMHgyOCwweDgyLDB4MDAsMHgwYSwweDE0LDB4NDAsMHhmZiwweGZjLDB4YTAsMHg2MCwweDAwLDB4MDAsCisweDI3LDB4ODIsMHg4YiwweDZhLDB4MjQsMHgwNCwweDAwLDB4MDYsMHgyNCwweDg0LDB4ZmYsMHhmZiwweGE0LDB4NDAsMHgwMCwweDAwLAorMHgwNCwweDgxLDB4ZmYsMHhmZCwweDI0LDB4NDIsMHgwMCwweDAyLDB4MjQsMHgwMiwweDAwLDB4MDMsMHhhMywweDgyLDB4OGIsMHg2MCwKKzB4MjQsMHgwMiwweDA5LDB4YzQsMHgyNCwweDAzLDB4MDEsMHgwMCwweGE3LDB4ODIsMHg4YiwweDc2LDB4MjQsMHgwMiwweDA0LDB4MDAsCisweGFmLDB4ODMsMHg4YiwweDc4LDB4YWYsMHg4MiwweDhiLDB4N2MsMHgyNCwweDAzLDB4MDAsMHgwYSwweDI0LDB4MDIsMHgwMCwweDA0LAorMHgyNCwweDA1LDB4MDAsMHgwMiwweDI0LDB4MDQsMHgwMCwweDAxLDB4YTMsMHg4MywweDhiLDB4NjIsMHhhMywweDgyLDB4OGIsMHg2OCwKKzB4MjQsMHgwMywweDAwLDB4MDEsMHgyNCwweDAyLDB4MDIsMHgwMCwweGEzLDB4ODQsMHg4YiwweDY2LDB4YTMsMHg4NSwweDhiLDB4NjksCisweGE3LDB4ODIsMHg4YiwweDZhLDB4YTcsMHg4MywweDhiLDB4NmMsMHhhMywweDg0LDB4OGIsMHg2MSwweGEzLDB4ODAsMHg4YiwweDYzLAorMHhhMywweDgwLDB4OGIsMHg2NCwweGEzLDB4ODAsMHg4YiwweDY1LDB4YTMsMHg4NSwweDhiLDB4NjcsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLDB4MjQsMHg0MiwweDAxLDB4ODQsCisweDM0LDB4NjMsMHgwMCwweDIwLDB4YWMsMHg2MiwweDAwLDB4MDAsMHgyNywweDg0LDB4OGIsMHg4OCwweDAwLDB4MDAsMHgxMCwweDIxLAorMHgyNCwweDQyLDB4MDAsMHgwMSwweDAwLDB4MDIsMHgxNiwweDAwLDB4MDAsMHgwMiwweDE2LDB4MDMsMHgyOCwweDQzLDB4MDAsMHgwMywKKzB4YWMsMHg4MCwweGZmLDB4ZmMsMHhhMCwweDgwLDB4MDAsMHgwMCwweDE0LDB4NjAsMHhmZiwweGY5LDB4MjQsMHg4NCwweDAwLDB4MGMsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLAorMHgzNCwweDYzLDB4MDAsMHgyMCwweDI0LDB4NDIsMHgwMSwweGM4LDB4M2MsMHgwOCwweGIwLDB4MDMsMHhhYywweDYyLDB4MDAsMHgwMCwKKzB4MzUsMHgwOCwweDAwLDB4NzAsMHg4ZCwweDAyLDB4MDAsMHgwMCwweDAwLDB4YTAsMHg0OCwweDIxLDB4MDAsMHgwNCwweDI2LDB4MDAsCisweDAwLDB4MDIsMHgyYSwweDQzLDB4MDAsMHgwNiwweDM2LDB4MDAsMHgwMCwweDA3LDB4M2UsMHgwMCwweDAwLDB4MDIsMHgxMiwweDAzLAorMHgyOSwweDIzLDB4MDAsMHgwMywweDAwLDB4MDQsMHg1NiwweDAzLDB4MDAsMHgwNiwweDM2LDB4MDMsMHgwMCwweDA3LDB4M2UsMHgwMywKKzB4MzAsMHg0OCwweDAwLDB4MDEsMHgxMCwweDYwLDB4MDAsMHgxMSwweDMwLDB4YTUsMHgwMCwweDA3LDB4MjQsMHgwMiwweDAwLDB4MDIsCisweDAwLDB4NDksMHgxMCwweDIzLDB4MDAsMHg0NSwweDEwLDB4MDcsMHgzMCwweDQyLDB4MDAsMHgwMSwweDEwLDB4NDAsMHgwMCwweDY2LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4YTIsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MjEsMHg0MywKKzB4MTEsMHgwMCwweDAwLDB4MTAsMHgwMCwweDA3LDB4MjAsMHgwYiwweDE1LDB4MjAsMHgwMCwweDA2LDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDNjLDB4MDIsMHhiMCwweDA1LDB4MzQsMHg0MiwweDAxLDB4MjAsMHhhNCwweDQ0LDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDExLDB4MjIsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwNSwKKzB4MDgsMHgwMCwweDAwLDB4OTYsMHgzNCwweDQyLDB4MDEsMHgyNCwweDNjLDB4MDIsMHhiMCwweDA1LDB4MDgsMHgwMCwweDAwLDB4OTYsCisweDM0LDB4NDIsMHgwMSwweDIyLDB4MTUsMHgyMCwweDAwLDB4NTQsMHgyNCwweDAyLDB4MDAsMHgwMSwweDNjLDB4MDIsMHhiMCwweDAzLAorMHgzNCwweDQyLDB4MDAsMHg3NCwweDkwLDB4NDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhhZiwweDgzLDB4OGIsMHg4NCwKKzB4M2MsMHgwMiwweGIwLDB4MDMsMHgzNCwweDQyLDB4MDAsMHg3MCwweDkwLDB4NDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDMwLDB4NmIsMHgwMCwweDA4LDB4MTEsMHg2MCwweDAwLDB4MTgsMHgwMCwweDA5LDB4MjgsMHg0MCwweDAwLDB4MDAsMHg0MCwweDIxLAorMHgyNywweDg1LDB4OGIsMHg4MCwweDhjLDB4YTMsMHgwMCwweDAwLDB4OGMsMHhhMiwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHg2MiwweDM4LDB4MjMsMHgwMCwweDQzLDB4MTAsMHgyYSwweDEwLDB4NDAsMHgwMCwweDNkLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweGFjLDB4YTcsMHgwMCwweDAwLDB4MjUsMHgwMiwweDAwLDB4MDEsMHgwMCwweDAyLDB4MTYsMHgwMCwweDAwLDB4MDIsMHg0NiwweDAzLAorMHgyOSwweDAzLDB4MDAsMHgwMywweDE0LDB4NjAsMHhmZiwweGYzLDB4MjQsMHhhNSwweDAwLDB4MGMsMHgzYywweDAzLDB4YjAsMHgwMywKKzB4MzQsMHg2MywweDAwLDB4NzAsMHg5MCwweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0YiwweDEwLDB4MjMsCisweGEwLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwOSwweDI4LDB4NDAsMHgwMCwweGE5LDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgyNywweDgzLDB4OGIsMHg4OCwweDAwLDB4MGEsMHgyMCwweDBiLDB4MDAsMHg0MywweDE4LDB4MjEsMHgxMCwweGMwLDB4MDAsMHgwNSwKKzB4MDAsMHgwMCwweDM4LDB4MjEsMHg4MCwweDYyLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweDAwLDB4MDUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4ODAsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDAzLAorMHgwMCwweGE5LDB4MTAsMHgyMSwweDI0LDB4MDcsMHgwMCwweDAxLDB4MDAsMHhhOSwweDEwLDB4MjEsMHgwMCwweDAyLDB4MzAsMHg4MCwKKzB4MjcsMHg4MiwweDhiLDB4ODgsMHhhMCwweDY3LDB4MDAsMHgwMSwweDAwLDB4YzIsMHgzOCwweDIxLDB4ODAsMHhlMywweDAwLDB4MDEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg2MCwweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4ODMsMHg4YiwweDgwLAorMHgwMCwweGMzLDB4MTgsMHgyMSwweDhjLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQ0LDB4MTAsMHgyMSwKKzB4YWMsMHg2MiwweDAwLDB4MDAsMHgyNywweDg1LDB4OGIsMHg4NCwweDI3LDB4ODIsMHg4YiwweDgwLDB4MDAsMHhjNSwweDI4LDB4MjEsCisweDAwLDB4YzIsMHgxMCwweDIxLDB4OGMsMHg0MywweDAwLDB4MDAsMHg4YywweGE0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDY0LDB4MTgsMHgyYSwweDE0LDB4NjAsMHgwMCwweDAzLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4YTAsMHhlMiwweDAwLDB4MDAsMHhhMCwweGUwLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgwMCwweGI5LDB4YWMsMHhhMCwweDAwLDB4MDAsMHgxMSwweDIyLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzYywweDAyLDB4YjAsMHgwMywweDM0LDB4NDIsMHgwMCwweDdjLDB4OTAsMHg0MywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4YWYsMHg4MywweDhiLDB4OWMsMHgwOCwweDAwLDB4MDAsMHhhOSwweDNjLDB4MDIsMHhiMCwweDAzLDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDM0LDB4NDIsMHgwMCwweDc4LDB4OTAsMHg0MywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGFmLDB4ODMsMHg4YiwweDkwLAorMHgwOCwweDAwLDB4MDAsMHhhOSwweDNjLDB4MDIsMHhiMCwweDAzLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwKKzB4MzQsMHg2MywweDAwLDB4MjAsMHgyNCwweDQyLDB4MDQsMHgxOCwweDNjLDB4MDUsMHhiMCwweDAzLDB4YWMsMHg2MiwweDAwLDB4MDAsCisweDM0LDB4YTUsMHgwMCwweDcwLDB4OGMsMHhhMiwweDAwLDB4MDAsMHg5MCwweDg0LDB4MDAsMHgwOCwweDNjLDB4MDYsMHhiMCwweDAzLAorMHgwMCwweDAyLDB4MTYsMHgwMCwweDJjLDB4ODMsMHgwMCwweDAzLDB4MzQsMHhjNiwweDAwLDB4NzIsMHgyNCwweDA3LDB4MDAsMHgwMSwKKzB4MTAsMHg2MCwweDAwLDB4MTEsMHgwMCwweDAyLDB4MmYsMHhjMiwweDkwLDB4YzIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE4LDB4MjEsCisweDAwLDB4MDIsMHgxNiwweDAwLDB4MTAsMHhhNywweDAwLDB4MDksMHgwMCwweDAyLDB4MTYsMHgwMywweDE0LDB4ODAsMHgwMCwweDBjLAorMHgzMCwweDQzLDB4MDAsMHgwMywweDgzLDB4ODIsMHg4YiwweDg4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MTAsMHg4MCwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDAyLDB4MTYsMHgwMCwweDAwLDB4MDIsMHgxZSwweDAzLDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDM0LDB4NDIsMHgwMCwweDcyLDB4YTAsMHg0MywweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzMCwweDQ1LDB4MDAsMHgwNSwweDEwLDB4ODcsMHgwMCwweDA0LDB4MzAsMHg0MywweDAwLDB4MDYsMHg5MywweDgyLDB4OGIsMHhhMCwKKzB4MDgsMHgwMCwweDAxLDB4MjEsMHgwMCwweDQzLDB4MTAsMHgyMSwweDgzLDB4ODIsMHg4YiwweDk0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDIsMHgxMCwweDQwLDB4MDgsMHgwMCwweDAxLDB4MjEsMHgwMCwweDQ1LDB4MTAsMHgyMSwweDEwLDB4ODAsMHgwMCwweDA1LAorMHgwMCwweDAwLDB4MTgsMHgyMSwweDI0LDB4NjMsMHgwMCwweDAxLDB4MDAsMHg2NCwweDEwLDB4MmIsMHgxNCwweDQwLDB4ZmYsMHhmZCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMywweGIwLDB4MDMsCisweDNjLDB4MDIsMHg4MCwweDAwLDB4MjQsMHg0MiwweDA0LDB4ZWMsMHgzYywweDA0LDB4YjAsMHgwMiwweDM0LDB4NjMsMHgwMCwweDIwLAorMHhhYywweDYyLDB4MDAsMHgwMCwweDM0LDB4ODQsMHgwMCwweDA4LDB4MjQsMHgwMiwweDAwLDB4MDEsMHhhZiwweDg0LDB4OGIsMHhiMCwKKzB4YTMsMHg4MiwweDhiLDB4YzAsMHhhNywweDgwLDB4OGIsMHhiNCwweGE3LDB4ODAsMHg4YiwweGI2LDB4YWYsMHg4MCwweDhiLDB4YjgsCisweGFmLDB4ODAsMHg4YiwweGJjLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDMsMHhiMCwweDAzLAorMHgzYywweDAyLDB4ODAsMHgwMCwweDM0LDB4NjMsMHgwMCwweDIwLDB4MjQsMHg0MiwweDA1LDB4MmMsMHgzYywweDA0LDB4YjAsMHgwMywKKzB4YWMsMHg2MiwweDAwLDB4MDAsMHgzNCwweDg0LDB4MDAsMHhhYywweDgwLDB4YTIsMHgwMCwweDE1LDB4OGMsMHg4MywweDAwLDB4MDAsCisweDI3LDB4YmQsMHhmZiwweGYwLDB4MDAsMHg0MywweDEwLDB4MjEsMHhhYywweDgyLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHgxMCwweDNjLDB4MDIsMHhiMCwweDAzLDB4M2MsMHgwMywweDgwLDB4MDAsMHgzNCwweDQyLDB4MDAsMHgyMCwKKzB4MjQsMHg2MywweDA1LDB4NjQsMHgyNywweGJkLDB4ZmYsMHhlMCwweGFjLDB4NDMsMHgwMCwweDAwLDB4YWYsMHhiMSwweDAwLDB4MTQsCisweGFmLDB4YjAsMHgwMCwweDEwLDB4YWYsMHhiZiwweDAwLDB4MTgsMHg4ZiwweDkwLDB4OGIsMHhiMCwweDBjLDB4MDAsMHgwMiwweDlhLAorMHgwMCwweDgwLDB4ODgsMHgyMSwweDE0LDB4NDAsMHgwMCwweDJhLDB4M2MsMHgwMiwweDAwLDB4ODAsMHgxNiwweDIwLDB4MDAsMHgwMiwKKzB4MzQsMHg0MiwweDAyLDB4MDEsMHgyNCwweDAyLDB4MDIsMHgwMSwweGFlLDB4MDIsMHgwMCwweDAwLDB4OTcsMHg4NCwweDhiLDB4YjQsCisweDk3LDB4ODIsMHg4YiwweGI2LDB4M2MsMHgwMywweGIwLDB4MDIsMHgwMCwweDgzLDB4MjAsMHgyMSwweDI0LDB4NDIsMHgwMCwweDA0LAorMHhhNywweDgyLDB4OGIsMHhiNiwweGE0LDB4ODIsMHgwMCwweDAwLDB4OGYsMHg4NCwweDhiLDB4YjgsMHg4ZiwweDgyLDB4OGIsMHhiMCwKKzB4OTMsMHg4NSwweDhiLDB4NjIsMHgyNCwweDg0LDB4MDAsMHgwMSwweDI0LDB4NDIsMHgwMCwweDA0LDB4MjQsMHgwMywweDhmLDB4ZmYsCisweDNjLDB4MDcsMHhiMCwweDA2LDB4M2MsMHgwNiwweGIwLDB4MDMsMHgwMCwweDQzLDB4MTAsMHgyNCwweDAwLDB4ODUsMHgyOCwweDJhLAorMHgzNCwweGU3LDB4ODAsMHgxOCwweGFmLDB4ODIsMHg4YiwweGIwLDB4YWYsMHg4NCwweDhiLDB4YjgsMHgxMCwweGEwLDB4MDAsMHgwOCwKKzB4MzQsMHhjNiwweDAxLDB4MDgsMHg4ZiwweDgzLDB4OGIsMHhiYywweDhmLDB4ODQsMHg4YiwweDdjLDB4OGMsMHhjMiwweDAwLDB4MDAsCisweDAwLDB4NjQsMHgxOCwweDIxLDB4MDAsMHg0MywweDEwLDB4MmIsMHgxNCwweDQwLDB4MDAsMHgwOSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4YywweGUyLDB4MDAsMHgwMCwweDNjLDB4MDMsMHgwZiwweDAwLDB4M2MsMHgwNCwweDA0LDB4MDAsMHgwMCwweDQzLDB4MTAsMHgyNCwKKzB4MTAsMHg0NCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDBjLDB4MDAsMHgwNCwweDk4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhmLDB4YmYsMHgwMCwweDE4LDB4N2IsMHhiMCwweDAwLDB4YmMsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDIwLAorMHgyNywweGJkLDB4ZmYsMHhkOCwweDNjLDB4MDIsMHhiMCwweDAzLDB4M2MsMHgwMywweDgwLDB4MDAsMHgyNCwweDYzLDB4MDYsMHg1MCwKKzB4YWYsMHhiMCwweDAwLDB4MTAsMHgzNCwweDQyLDB4MDAsMHgyMCwweDhmLDB4OTAsMHg4YiwweGIwLDB4YWMsMHg0MywweDAwLDB4MDAsCisweGFmLDB4YjMsMHgwMCwweDFjLDB4YWYsMHhiMiwweDAwLDB4MTgsMHhhZiwweGIxLDB4MDAsMHgxNCwweGFmLDB4YmYsMHgwMCwweDIwLAorMHgwMCwweDgwLDB4ODgsMHgyMSwweDAwLDB4YTAsMHg5MCwweDIxLDB4MGMsMHgwMCwweDAyLDB4OWEsMHgwMCwweGMwLDB4OTgsMHgyMSwKKzB4MjQsMHgwNywweDhmLDB4ZmYsMHgxNCwweDQwLDB4MDAsMHgxOSwweDI2LDB4MDMsMHgwMCwweDA0LDB4MjQsMHgwMiwweDBlLDB4MDMsCisweGFlLDB4MDIsMHgwMCwweDAwLDB4MDAsMHg2NywweDgwLDB4MjQsMHgyNiwweDAyLDB4MDAsMHgwNCwweGFlLDB4MTEsMHgwMCwweDAwLAorMHgwMCwweDQ3LDB4ODAsMHgyNCwweDk3LDB4ODYsMHg4YiwweGI0LDB4MjYsMHgwMywweDAwLDB4MDQsMHhhZSwweDEyLDB4MDAsMHgwMCwKKzB4MDAsMHg2NywweDgwLDB4MjQsMHhhZSwweDEzLDB4MDAsMHgwMCwweDhmLDB4ODQsMHg4YiwweGIwLDB4M2MsMHgwMiwweGIwLDB4MDIsCisweDk3LDB4ODUsMHg4YiwweGI2LDB4MDAsMHhjMiwweDMwLDB4MjEsMHg4ZiwweDgyLDB4OGIsMHhiOCwweDI0LDB4ODQsMHgwMCwweDEwLAorMHgyNCwweGE1LDB4MDAsMHgxMCwweDAwLDB4ODcsMHgyMCwweDI0LDB4MjQsMHg0MiwweDAwLDB4MDEsMHhhNywweDg1LDB4OGIsMHhiNiwKKzB4YWYsMHg4NCwweDhiLDB4YjAsMHhhZiwweDgyLDB4OGIsMHhiOCwweGE0LDB4YzUsMHgwMCwweDAwLDB4OGYsMHhiZiwweDAwLDB4MjAsCisweDdiLDB4YjIsMHgwMCwweGZjLDB4N2IsMHhiMCwweDAwLDB4YmMsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDI4LAorMHgyNywweGJkLDB4ZmYsMHhlOCwweGFmLDB4YmYsMHgwMCwweDEwLDB4OTQsMHg4MiwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg0MiwweGUwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgxNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTAsMHg4MiwweDAwLDB4MDIsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4ZmMsMHgwMCwweDgyLDB4MjgsMHgyMSwweDhjLDB4YTQsMHgwMCwweDAwLAorMHgzYywweDAyLDB4MDAsMHg3MCwweDhjLDB4YTYsMHgwMCwweDA4LDB4MDAsMHg4MiwweDEwLDB4MjEsMHgyYywweDQzLDB4MDAsMHgwNiwKKzB4MTAsMHg2MCwweDAwLDB4MDksMHgzYywweDAzLDB4ODAsMHgwMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MjQsMHg2MywweDAxLDB4ZTgsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4OGMsMHg0NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODAsMHgwMCwweDA4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweGFmLDB4ODYsMHg4MCwweDE0LDB4OGYsMHhiZiwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgxOCwweDhjLDB4YTQsMHgwMCwweDAwLDB4MGMsMHgwMCwweDE3LDB4YjMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAxLDB4ZGUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDBjLDB4MDAsMHgyNCwweGFhLAorMHgwMCwweGMwLDB4MjAsMHgyMSwweDA4LDB4MDAsMHgwMSwweGRlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4MzQsMHg0MiwweDAxLDB4MDgsMHg4YywweDQ0LDB4MDAsMHgwMCwweDhmLDB4ODIsMHg4MCwweDE4LDB4M2MsMHgwMywweDAwLDB4MGYsCisweDM0LDB4NjMsMHg0MiwweDQwLDB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDgyLDB4MjAsMHgyYiwweDEwLDB4ODAsMHgwMCwweDA5LAorMHgyNCwweDAzLDB4MDAsMHgwNSwweDhmLDB4ODIsMHg4MywweDMwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDQyLDB4MDAsMHgwMSwKKzB4YWYsMHg4MiwweDgzLDB4MzAsMHgxMCwweDQzLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMywweGIwLDB4MDMsMHg4YywweDYzLDB4MDEsMHgwOCwweDI0LDB4MDIsMHgwMCwweDAxLAorMHhhMywweDgyLDB4ODAsMHgxMSwweGFmLDB4ODAsMHg4MywweDMwLDB4YWYsMHg4MywweDgwLDB4MTgsMHgwOCwweDAwLDB4MDEsMHhmYiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDg0LDB4MDAsMHhmZiwweDE0LDB4ODAsMHgwMCwweDJmLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhmLDB4ODIsMHg4MCwweDE0LDB4YTMsMHg4NSwweDgzLDB4NjMsMHgxMCwweDQwLDB4MDAsMHgyYiwweDJjLDB4YTIsMHgwMCwweDA0LAorMHgxNCwweDQwLDB4MDAsMHgwNiwweDAwLDB4MDUsMHgxMCwweDQwLDB4MjQsMHhhMiwweGZmLDB4ZmMsMHgyYywweDQyLDB4MDAsMHgwOCwKKzB4MTAsMHg0MCwweDAwLDB4MDksMHgyNCwweGEyLDB4ZmYsMHhmMCwweDAwLDB4MDUsMHgxMCwweDQwLDB4MjcsMHg4NCwweDgzLDB4NmMsCisweDAwLDB4NDQsMHgxMCwweDIxLDB4OTQsMHg0MywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NjMsMHgwMCwweDAxLAorMHgwMywweGUwLDB4MDAsMHgwOCwweGE0LDB4NDMsMHgwMCwweDAwLDB4MmMsMHg0MiwweDAwLDB4MTAsMHgxNCwweDQwLDB4MDAsMHgwYSwKKzB4MDAsMHgwNSwweDEwLDB4NDAsMHgyNCwweGEyLDB4ZmYsMHhlMCwweDJjLDB4NDIsMHgwMCwweDEwLDB4MTQsMHg0MCwweDAwLDB4MDYsCisweDAwLDB4MDUsMHgxMCwweDQwLDB4MjQsMHhhMiwweGZmLDB4ZDAsMHgyYywweDQyLDB4MDAsMHgxMCwweDEwLDB4NDAsMHgwMCwweDA5LAorMHgyNCwweGEyLDB4ZmYsMHhjMCwweDAwLDB4MDUsMHgxMCwweDQwLDB4MjcsMHg4NCwweDgzLDB4NmMsMHgwMCwweDQ0LDB4MTAsMHgyMSwKKzB4OTQsMHg0MywweGZmLDB4ZjgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NjMsMHgwMCwweDAxLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweGE0LDB4NDMsMHhmZiwweGY4LDB4MmMsMHg0MiwweDAwLDB4MTAsMHgxMCwweDQwLDB4MDAsMHgwNywweDAwLDB4MDUsMHgxMCwweDQwLAorMHgyNywweDg0LDB4ODMsMHg2YywweDAwLDB4NDQsMHgxMCwweDIxLDB4OTQsMHg0MywweGZmLDB4ZjgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHg2MywweDAwLDB4MDEsMHhhNCwweDQzLDB4ZmYsMHhmOCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhmLDB4ODYsMHg4YiwweGIwLDB4OGYsMHg4MiwweDgwLDB4MTQsMHgyNywweGJkLDB4ZmYsMHhlOCwweGFmLDB4YmYsMHgwMCwweDEwLAorMHgxMCwweDQwLDB4MDAsMHgyYSwweDAwLDB4YzAsMHgzOCwweDIxLDB4MjQsMHgwMiwweDAwLDB4MDcsMHgyNCwweDAzLDB4ZmYsMHg5YywKKzB4YTMsMHg4MiwweDgzLDB4NmIsMHhhMywweDgzLDB4ODMsMHg2YSwweDI3LDB4OGEsMHg4MywweDY4LDB4MDAsMHgwMCwweDIwLDB4MjEsCisweDI0LDB4MDksMHg4ZiwweGZmLDB4MDAsMHgwNCwweDEwLDB4ODAsMHgwMCwweDRhLDB4MjgsMHgyMSwweDhjLDB4YTIsMHgwMCwweDAwLAorMHgyNCwweGUzLDB4MDAsMHgwNCwweDI0LDB4ODgsMHgwMCwweDAxLDB4YWMsMHhlMiwweDAwLDB4MDAsMHgxMCwweDgwLDB4MDAsMHgwMiwKKzB4MDAsMHg2OSwweDM4LDB4MjQsMHhhYywweGEwLDB4MDAsMHgwMCwweDMxLDB4MDQsMHgwMCwweGZmLDB4MmMsMHg4MiwweDAwLDB4MjcsCisweDE0LDB4NDAsMHhmZiwweGY1LDB4MDAsMHgwNCwweDEwLDB4ODAsMHg5NywweDgzLDB4OGIsMHhiNiwweDk3LDB4ODUsMHg4YiwweGI0LAorMHgzYywweDAyLDB4YjAsMHgwMiwweDI0LDB4NjMsMHgwMCwweDljLDB4MDAsMHhhMiwweDI4LDB4MjEsMHgzYywweDA0LDB4YjAsMHgwNiwKKzB4YTcsMHg4MywweDhiLDB4YjYsMHgzNCwweDg0LDB4ODAsMHgxOCwweGE0LDB4YTMsMHgwMCwweDAwLDB4OGMsMHg4NSwweDAwLDB4MDAsCisweDI0LDB4MDIsMHg4ZiwweGZmLDB4MjQsMHhjNiwweDAwLDB4OWMsMHgzYywweDAzLDB4MGYsMHgwMCwweDAwLDB4YzIsMHgzMCwweDI0LAorMHgwMCwweGEzLDB4MjgsMHgyNCwweDNjLDB4MDIsMHgwNCwweDAwLDB4YWYsMHg4NiwweDhiLDB4YjAsMHgxMCwweGEyLDB4MDAsMHgwMywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwYywweDAwLDB4MDQsMHg5OCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHhiZiwweDAwLDB4MTAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgxOCwweDhmLDB4ODYsMHg4YiwweGIwLAorMHgyNywweGJkLDB4ZmYsMHhjOCwweDI0LDB4MDIsMHgwMCwweDA4LDB4MjQsMHgwMywweDAwLDB4MjAsMHhhZiwweGJmLDB4MDAsMHgzMCwKKzB4YTMsMHhhMiwweDAwLDB4MTMsMHhhMywweGEzLDB4MDAsMHgxMiwweGE3LDB4YTQsMHgwMCwweDEwLDB4MDAsMHhjMCwweDI4LDB4MjEsCisweDI3LDB4YTksMHgwMCwweDEwLDB4MDAsMHgwMCwweDM4LDB4MjEsMHgyNCwweDA4LDB4OGYsMHhmZiwweDAwLDB4MDcsMHgxMCwweDgwLAorMHgwMCwweDQ5LDB4MTAsMHgyMSwweDhjLDB4NDQsMHgwMCwweDAwLDB4MjQsMHhlMywweDAwLDB4MDEsMHgzMCwweDY3LDB4MDAsMHhmZiwKKzB4MjQsMHhhMiwweDAwLDB4MDQsMHgyYywweGUzLDB4MDAsMHgwOCwweGFjLDB4YTQsMHgwMCwweDAwLDB4MTQsMHg2MCwweGZmLDB4ZjcsCisweDAwLDB4NDgsMHgyOCwweDI0LDB4OTcsMHg4MywweDhiLDB4YjYsMHg5NywweDg1LDB4OGIsMHhiNCwweDNjLDB4MDIsMHhiMCwweDAyLAorMHgyNCwweDYzLDB4MDAsMHgyMCwweDAwLDB4YTIsMHgyOCwweDIxLDB4M2MsMHgwNCwweGIwLDB4MDYsMHhhNywweDgzLDB4OGIsMHhiNiwKKzB4MzQsMHg4NCwweDgwLDB4MTgsMHhhNCwweGEzLDB4MDAsMHgwMCwweDhjLDB4ODUsMHgwMCwweDAwLDB4MjQsMHgwMiwweDhmLDB4ZmYsCisweDI0LDB4YzYsMHgwMCwweDIwLDB4M2MsMHgwMywweDBmLDB4MDAsMHgwMCwweGMyLDB4MzAsMHgyNCwweDAwLDB4YTMsMHgyOCwweDI0LAorMHgzYywweDAyLDB4MDQsMHgwMCwweGFmLDB4ODYsMHg4YiwweGIwLDB4MTAsMHhhMiwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MGMsMHgwMCwweDA0LDB4OTgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4YmYsMHgwMCwweDMwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MzgsMHg5MywweDgyLDB4OGIsMHhjMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxMCwweDQwLDB4MDAsMHgxMSwweDI0LDB4MDYsMHgwMCwweDAxLDB4OGYsMHg4MiwweDhiLDB4YjgsMHgzYywweDA1LDB4YjAsMHgwNiwKKzB4M2MsMHgwNCwweGIwLDB4MDMsMHgzNCwweGE1LDB4ODAsMHgxOCwweDM0LDB4ODQsMHgwMSwweDA4LDB4MTQsMHg0MCwweDAwLDB4MDksCisweDAwLDB4MDAsMHgzMCwweDIxLDB4OTcsMHg4MiwweDhiLDB4YjQsMHg4YywweDg0LDB4MDAsMHgwMCwweDNjLDB4MDMsMHhiMCwweDAyLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweGFmLDB4ODQsMHg4YiwweGJjLDB4YTcsMHg4MCwweDhiLDB4YjYsMHhhYywweDQwLDB4MDAsMHgwMCwKKzB4YWMsMHg0MCwweDAwLDB4MDQsMHg4YywweGEyLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHhjMCwweDEwLDB4MjEsCisweDhmLDB4ODYsMHg4YiwweGIwLDB4OGYsMHg4MiwweDhiLDB4YjgsMHgyNywweGJkLDB4ZmYsMHhlOCwweGFmLDB4YmYsMHgwMCwweDEwLAorMHgwMCwweGMwLDB4NDAsMHgyMSwweDE0LDB4NDAsMHgwMCwweDBhLDB4MDAsMHg0MCwweDUwLDB4MjEsMHgwMCwweDAwLDB4MzgsMHgyMSwKKzB4MjcsMHg4OSwweDgzLDB4MzgsMHgyNCwweGUyLDB4MDAsMHgwMSwweDAwLDB4MDcsMHgxOCwweDgwLDB4MzAsMHg0NywweDAwLDB4ZmYsCisweDAwLDB4NjksMHgxOCwweDIxLDB4MmMsMHhlMiwweDAwLDB4MGEsMHgxNCwweDQwLDB4ZmYsMHhmYSwweGFjLDB4NjAsMHgwMCwweDAwLAorMHgzYywweDAyLDB4MDAsMHg4MCwweDEwLDB4ODIsMHgwMCwweDZmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5NywweDgyLDB4ODMsMHgzZSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDQyLDB4MDAsMHgwMSwweGE3LDB4ODIsMHg4MywweDNlLDB4OTAsMHhhMywweDAwLDB4MTUsCisweDk3LDB4ODIsMHg4MywweDQwLDB4MDAsMHgwMywweDFlLDB4MDAsMHgwMCwweDAzLDB4MWUsMHgwMywweDAwLDB4NDMsMHgxMCwweDIxLAorMHhhNywweDgyLDB4ODMsMHg0MCwweDhjLDB4YTQsMHgwMCwweDIwLDB4M2MsMHgwMiwweDAwLDB4NjAsMHgzYywweDAzLDB4MDAsMHgyMCwKKzB4MDAsMHg4MiwweDIwLDB4MjQsMHgxMCwweDgzLDB4MDAsMHg1NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg4MCwweDAwLDB4NDcsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTcsMHg4MiwweDgzLDB4NDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NDIsMHgwMCwweDAxLAorMHhhNywweDgyLDB4ODMsMHg0NCwweDg0LDB4YTMsMHgwMCwweDA2LDB4OGYsMHg4MiwweDgzLDB4NTQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHhhZiwweDgyLDB4ODMsMHg1NCwweDI1LDB4NDIsMHgwMCwweDAxLDB4MjgsMHg0MywweDI3LDB4MTAsCisweGFmLDB4ODIsMHg4YiwweGI4LDB4MTAsMHg2MCwweDAwLDB4MDksMHgyNCwweDAyLDB4MDAsMHgwNCwweDkzLDB4ODMsMHg4MCwweDExLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4NjIsMHgwMCwweDA1LDB4MjQsMHgwMiwweDAwLDB4MDQsMHg4ZiwweGJmLDB4MDAsMHgxMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDE4LDB4MjQsMHgwMywweDAwLDB4MjgsCisweGEzLDB4ODMsMHg4MywweDNhLDB4YTMsMHg4MiwweDgzLDB4M2IsMHg5MCwweGEyLDB4MDAsMHgxOCwweDkzLDB4ODMsMHg4MywweDYzLAorMHgwMCwweDAwLDB4MzgsMHgyMSwweDAwLDB4MDIsMHgxNiwweDAwLDB4MDAsMHgwMiwweDE2LDB4MDMsMHhhNywweDgyLDB4ODMsMHg0ZSwKKzB4YTMsMHg4MywweDgzLDB4NWMsMHgyNywweDg5LDB4ODMsMHgzOCwweDI0LDB4MDUsMHg4ZiwweGZmLDB4MDAsMHgwNywweDEwLDB4ODAsCisweDAwLDB4NDksMHgxMCwweDIxLDB4OGMsMHg0NCwweDAwLDB4MDAsMHgyNCwweGUzLDB4MDAsMHgwMSwweDMwLDB4NjcsMHgwMCwweGZmLAorMHgyNSwweDAyLDB4MDAsMHgwNCwweDJjLDB4ZTMsMHgwMCwweDBhLDB4YWQsMHgwNCwweDAwLDB4MDAsMHgxNCwweDYwLDB4ZmYsMHhmNywKKzB4MDAsMHg0NSwweDQwLDB4MjQsMHg5NywweDgzLDB4OGIsMHhiNiwweDk3LDB4ODUsMHg4YiwweGI0LDB4M2MsMHgwMiwweGIwLDB4MDIsCisweDI0LDB4NjMsMHgwMCwweDI4LDB4MDAsMHhhMiwweDI4LDB4MjEsMHgzYywweDA0LDB4YjAsMHgwNiwweGE3LDB4ODMsMHg4YiwweGI2LAorMHgzNCwweDg0LDB4ODAsMHgxOCwweGE0LDB4YTMsMHgwMCwweDAwLDB4OGMsMHg4NSwweDAwLDB4MDAsMHgyNCwweDAyLDB4OGYsMHhmZiwKKzB4MjQsMHhjNiwweDAwLDB4MjgsMHgzYywweDAzLDB4MGYsMHgwMCwweDAwLDB4YzIsMHgzMCwweDI0LDB4MDAsMHhhMywweDI4LDB4MjQsCisweDNjLDB4MDIsMHgwNCwweDAwLDB4YWYsMHg4NiwweDhiLDB4YjAsMHgxMCwweGEyLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwYywweDAwLDB4MDQsMHg5OCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDAyLDB4MzgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4YTMsMHg4MCwweDgwLDB4MTEsMHgwOCwweDAwLDB4MDIsMHhlNywweDAwLDB4MDAsMHgwMCwweDAwLDB4OTcsMHg4MiwweDgzLDB4NDYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4MDEsMHhhNywweDgyLDB4ODMsMHg0NiwweDg0LDB4YTMsMHgwMCwweDA2LAorMHg4ZiwweDgyLDB4ODMsMHg1OCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MywweDEwLDB4MjEsMHhhZiwweDgyLDB4ODMsMHg1OCwKKzB4MDgsMHgwMCwweDAyLDB4ZGYsMHgyNSwweDQyLDB4MDAsMHgwMSwweDk3LDB4ODIsMHg4MywweDQyLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4NDIsMHgwMCwweDAxLDB4YTcsMHg4MiwweDgzLDB4NDIsMHg4NCwweGEzLDB4MDAsMHgwNiwweDhmLDB4ODIsMHg4MywweDUwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4YWYsMHg4MiwweDgzLDB4NTAsMHgwOCwweDAwLDB4MDIsMHhkZiwKKzB4MjUsMHg0MiwweDAwLDB4MDEsMHg5NywweDgyLDB4ODMsMHgzYywweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4MDEsCisweGE3LDB4ODIsMHg4MywweDNjLDB4MDgsMHgwMCwweDAyLDB4YzcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4YmQsMHhmZiwweGQwLAorMHhhZiwweGJmLDB4MDAsMHgyOCwweDhjLDB4YTMsMHgwMCwweDIwLDB4OGYsMHg4YSwweDhiLDB4YjAsMHgzYywweDAyLDB4MDAsMHgxMCwKKzB4MDAsMHg2MiwweDEwLDB4MjQsMHgwMCwweGEwLDB4MzgsMHgyMSwweDAxLDB4NDAsMHg0OCwweDIxLDB4MTAsMHg0MCwweDAwLDB4M2QsCisweDAwLDB4ODAsMHgyOCwweDIxLDB4OGMsMHhlNCwweDAwLDB4MWMsMHgzNCwweGE1LDB4MTIsMHgwNiwweGFmLDB4YTUsMHgwMCwweDEwLAorMHg4YywweDgyLDB4MDAsMHgwOCwweDAwLDB4MDMsMHgxYywweDQyLDB4MzAsMHg2MywweDAwLDB4MzAsMHgwMCwweDAyLDB4MTMsMHgwMiwKKzB4MzAsMHg0MiwweDAwLDB4NDAsMHgwMCwweDQzLDB4MTAsMHgyNSwweDkwLDB4ZTYsMHgwMCwweDEwLDB4OTAsMHhlNCwweDAwLDB4MTMsCisweDk0LDB4ZTgsMHgwMCwweDBjLDB4OTQsMHhlMywweDAwLDB4MWEsMHgwMCwweDAyLDB4MTYsMHgwMCwweDkwLDB4ZTcsMHgwMCwweDEyLAorMHgwMCwweGEyLDB4MjgsMHgyNSwweDI0LDB4MDIsMHgxMiwweDM0LDB4YTcsMHhhMiwweDAwLDB4MWMsMHgyNCwweDAyLDB4NTYsMHg3OCwKKzB4YWYsMHhhNSwweDAwLDB4MTAsMHhhMywweGE2LDB4MDAsMHgxOCwweGEzLDB4YTcsMHgwMCwweDFmLDB4YTcsMHhhMywweDAwLDB4MWEsCisweGEzLDB4YTQsMHgwMCwweDE5LDB4YTcsMHhhOCwweDAwLDB4MjAsMHhhNywweGEyLDB4MDAsMHgyMiwweDAwLDB4MDAsMHgyOCwweDIxLAorMHgyNywweGE3LDB4MDAsMHgxMCwweDI0LDB4MDYsMHg4ZiwweGZmLDB4MDAsMHgwNSwweDEwLDB4ODAsMHgwMCwweDQ3LDB4MTAsMHgyMSwKKzB4OGMsMHg0NCwweDAwLDB4MDAsMHgyNCwweGEzLDB4MDAsMHgwMSwweDMwLDB4NjUsMHgwMCwweGZmLDB4MjUsMHgyMiwweDAwLDB4MDQsCisweDJjLDB4YTMsMHgwMCwweDA1LDB4YWQsMHgyNCwweDAwLDB4MDAsMHgxNCwweDYwLDB4ZmYsMHhmNywweDAwLDB4NDYsMHg0OCwweDI0LAorMHg5NywweDgzLDB4OGIsMHhiNiwweDk3LDB4ODUsMHg4YiwweGI0LDB4M2MsMHgwMiwweGIwLDB4MDIsMHgyNCwweDYzLDB4MDAsMHgxNCwKKzB4MDAsMHhhMiwweDI4LDB4MjEsMHgzYywweDA0LDB4YjAsMHgwNiwweGE3LDB4ODMsMHg4YiwweGI2LDB4MzQsMHg4NCwweDgwLDB4MTgsCisweGE0LDB4YTMsMHgwMCwweDAwLDB4OGMsMHg4NSwweDAwLDB4MDAsMHgyNCwweDAyLDB4OGYsMHhmZiwweDI1LDB4NDYsMHgwMCwweDE0LAorMHgzYywweDAzLDB4MGYsMHgwMCwweDAwLDB4YzIsMHg1MCwweDI0LDB4MDAsMHhhMywweDI4LDB4MjQsMHgzYywweDAyLDB4MDQsMHgwMCwKKzB4YWYsMHg4YSwweDhiLDB4YjAsMHgxMCwweGEyLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDA0LDB4OTgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHhiZiwweDAwLDB4MjgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHgzMCwweDNjLDB4MDUsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgyNywweGJkLDB4ZmYsMHhjOCwKKzB4MDAsMHgwNCwweDIyLDB4MDAsMHgzNCwweGE1LDB4MDAsMHgyMCwweDI0LDB4NDIsMHgwZSwweDA0LDB4M2MsMHgwMywweGIwLDB4MDAsCisweGFmLDB4YjUsMHgwMCwweDI0LDB4YWYsMHhiNCwweDAwLDB4MjAsMHhhZiwweGIyLDB4MDAsMHgxOCwweGFmLDB4YjAsMHgwMCwweDEwLAorMHhhZiwweGJmLDB4MDAsMHgzMCwweDAwLDB4ODMsMHg4MCwweDIxLDB4YWYsMHhiNywweDAwLDB4MmMsMHhhZiwweGI2LDB4MDAsMHgyOCwKKzB4YWYsMHhiMywweDAwLDB4MWMsMHhhZiwweGIxLDB4MDAsMHgxNCwweGFjLDB4YTIsMHgwMCwweDAwLDB4OGUsMHgwOSwweDAwLDB4MDAsCisweDAwLDB4MDAsMHg5MCwweDIxLDB4MjYsMHgxMCwweDAwLDB4MDgsMHgwMCwweDA5LDB4YTYsMHgwMiwweDEyLDB4ODAsMHgwMCwweDEzLAorMHgwMCwweDAwLDB4YTgsMHgyMSwweDI0LDB4MTMsMHgwMCwweDAyLDB4M2MsMHgxNiwweDAwLDB4ZmYsMHgzYywweDE3LDB4ZmYsMHgwMCwKKzB4OGUsMHgwOSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDksMHgxMiwweDAyLDB4MjQsMHg0MiwweDAwLDB4MDIsCisweDMxLDB4MjUsMHgwMCwweGZmLDB4MTAsMHhiMywweDAwLDB4NzYsMHgzMCwweDUxLDB4MDAsMHhmZiwweDI0LDB4MDIsMHgwMCwweDAzLAorMHgxMCwweGEyLDB4MDAsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHg1MSwweDEwLDB4MjEsMHgzMCwweDUyLDB4ZmYsMHhmZiwKKzB4MDIsMHg1NCwweDE4LDB4MmIsMHgxNCwweDYwLDB4ZmYsMHhmMiwweDAyLDB4MTEsMHg4MCwweDIxLDB4MTIsMHhhMCwweDAwLDB4MGEsCisweDNjLDB4MDIsMHhiMCwweDA2LDB4MzQsMHg0MiwweDgwLDB4MTgsMHg4YywweDQzLDB4MDAsMHgwMCwweDNjLDB4MDQsMHgwZiwweDAwLAorMHgzYywweDAyLDB4MDQsMHgwMCwweDAwLDB4NjQsMHgxOCwweDI0LDB4MTAsMHg2MiwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MGMsMHgwMCwweDA0LDB4OTgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4YmYsMHgwMCwweDMwLDB4N2IsMHhiNiwweDAxLDB4N2MsCisweDdiLDB4YjQsMHgwMSwweDNjLDB4N2IsMHhiMiwweDAwLDB4ZmMsMHg3YiwweGIwLDB4MDAsMHhiYywweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHgzOCwweDhlLDB4MDksMHgwMCwweDA0LDB4MjQsMHgxNSwweDAwLDB4MDEsMHg4ZSwweDA2LDB4MDAsMHgwYywKKzB4MDAsMHgwOSwweDExLDB4NDIsMHgwMCwweDA5LDB4MTgsMHhjMiwweDMwLDB4NDgsMHgwMCwweDAzLDB4MDAsMHgwOSwweDE0LDB4MDIsCisweDMwLDB4NmMsMHgwMCwweDAzLDB4MDAsMHgwOSwweDI2LDB4MDIsMHgxMSwweDE1LDB4MDAsMHg0NSwweDMwLDB4NDMsMHgwMCwweDBmLAorMHgyOSwweDAyLDB4MDAsMHgwMiwweDE0LDB4NDAsMHgwMCwweDI2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMSwweDEzLDB4MDAsMHgwZiwKKzB4MDAsMHgwMCwweDM4LDB4MjEsMHgwMCwweDA3LDB4MjIsMHgwMiwweDMwLDB4ODQsMHhmZiwweDAwLDB4M2MsMHgwMywweDAwLDB4ZmYsCisweDAwLDB4MDcsMHgyZSwweDAyLDB4MDAsMHgwNywweDEyLDB4MDAsMHgwMCwweDQzLDB4MTAsMHgyNCwweDAwLDB4YTQsMHgyOCwweDI1LAorMHgwMCwweGEyLDB4MjgsMHgyNSwweDAwLDB4MDcsMHgxZSwweDAwLDB4MDAsMHhhMywweDI4LDB4MjUsMHgwYywweDAwLDB4MDEsMHg5NCwKKzB4MDEsMHgyMCwweDIwLDB4MjEsMHgwOCwweDAwLDB4MDMsMHhhNywweDAyLDB4NTEsMHgxMCwweDIxLDB4MTEsMHg5NSwweDAwLDB4MGYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTEsMHg4OCwweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgxMCwweDgwLAorMHgyNywweDgzLDB4OGIsMHg2MCwweDAwLDB4NDMsMHgxMCwweDIxLDB4OGMsMHg0NywweDAwLDB4MTgsMHgwOCwweDAwLDB4MDMsMHhjZSwKKzB4MDAsMHgwNywweDIyLDB4MDIsMHgwMCwweDA0LDB4MTAsMHg0MCwweDI3LDB4ODMsMHg4YiwweDY4LDB4MDAsMHg0MywweDEwLDB4MjEsCisweDk0LDB4NDcsMHgwMCwweDAyLDB4MDgsMHgwMCwweDAzLDB4Y2UsMHgwMCwweDA3LDB4MjIsMHgwMiwweDI3LDB4ODIsMHg4YiwweDYwLAorMHgwMCwweDgyLDB4MTAsMHgyMSwweDkwLDB4NDcsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAzLDB4Y2UsMHgwMCwweDA3LDB4MjIsMHgwMiwKKzB4MTUsMHgwMCwweGZmLDB4ZGMsMHgwMCwweDAwLDB4MzgsMHgyMSwweDEwLDB4NzUsMHgwMCwweDA1LDB4MDAsMHg4MCwweDM4LDB4MjEsCisweDAwLDB4NjUsMHgxOCwweDI2LDB4MjQsMHg4MiwweDAxLDB4MDAsMHgwMCwweDAwLDB4MzgsMHgyMSwweDAwLDB4NDMsMHgzOCwweDBhLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDExLDB4ODIsMHgwMCwweDBlLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4MTEsMHg4MiwweDAwLDB4MDYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDIsMHhiMCwweDAzLDB4MDAsMHhlMiwweDEwLDB4MjEsCisweDhjLDB4NDcsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAzLDB4Y2UsMHgwMCwweDA3LDB4MjIsMHgwMiwweDNjLDB4MDIsMHhiMCwweDAzLAorMHgwMCwweGUyLDB4MTAsMHgyMSwweDk0LDB4NDMsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAzLDB4Y2QsMHgzMCwweDY3LDB4ZmYsMHhmZiwKKzB4MDAsMHhlMiwweDEwLDB4MjEsMHg5MCwweDQzLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMywweGNkLDB4MzAsMHg2NywweDAwLDB4ZmYsCisweDMwLDB4NjIsMHgwMCwweDAzLDB4MDAsMHgwMiwweDEyLDB4MDAsMHgxMSwweDk1LDB4MDAsMHgwNywweDAwLDB4NDQsMHgzOCwweDIxLAorMHgxMSwweDkzLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAzLDB4ZmYsMHgzYywweDAyLDB4YjAsMHgwYSwKKzB4MDgsMHgwMCwweDA0LDB4MDQsMHgzYywweDAyLDB4YjAsMHgwYSwweDA4LDB4MDAsMHgwNCwweDA4LDB4M2MsMHgwMiwweGIwLDB4MGEsCisweDhlLDB4MDksMHgwMCwweDA0LDB4OGUsMHgwMiwweDAwLDB4MDgsMHg4ZSwweDAzLDB4MDAsMHgwYywweDAwLDB4MDksMHg0MSwweDQyLAorMHgwMCwweDAyLDB4MjIsMHgwMiwweDAwLDB4MDMsMHgzYSwweDAyLDB4MzAsMHg4NCwweGZmLDB4MDAsMHgzMCwweGU3LDB4ZmYsMHgwMCwKKzB4MDAsMHgwMiwweDVlLDB4MDIsMHgwMCwweDAyLDB4MzIsMHgwMCwweDAwLDB4MDMsMHg1NiwweDAyLDB4MDAsMHgwMywweDJhLDB4MDAsCisweDAxLDB4NjQsMHg1OCwweDI1LDB4MDAsMHhkNiwweDMwLDB4MjQsMHgwMSwweDQ3LDB4NTAsMHgyNSwweDAwLDB4MDIsMHgxNiwweDAwLAorMHgwMCwweGI2LDB4MjgsMHgyNCwweDAwLDB4MDMsMHgxZSwweDAwLDB4MDEsMHg2NiwweDU4LDB4MjUsMHgwMSwweDQ1LDB4NTAsMHgyNSwKKzB4MDAsMHg1NywweDEwLDB4MjQsMHgwMCwweDc3LDB4MTgsMHgyNCwweDAxLDB4NjIsMHgzOCwweDI1LDB4MDEsMHg0MywweDMwLDB4MjUsCisweDAwLDB4MDksMHgxMCwweGMyLDB4MDAsMHgwOSwweDFjLDB4MDIsMHgzMSwweDA4LDB4MDAsMHgwMywweDMwLDB4NGMsMHgwMCwweDAzLAorMHgzMCwweDYzLDB4MDAsMHgwZiwweDAwLDB4MDksMHgyNiwweDAyLDB4MDAsMHhlMCwweDU4LDB4MjEsMHgxNSwweDAwLDB4MDAsMHgyOCwKKzB4MDAsMHhjMCwweDUwLDB4MjEsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4NjIsMHgwMCwweDA2LDB4MDAsMHg4MCwweDI4LDB4MjEsCisweDI0LDB4MDIsMHgwMCwweDAzLDB4MTQsMHg2MiwweGZmLDB4NjksMHgwMiwweDUxLDB4MTAsMHgyMSwweDI0LDB4ODUsMHgwMSwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDExLDB4ODIsMHgwMCwweDE1LDB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMSwweDgyLDB4MDAsMHgwYSwKKzB4M2MsMHgwMywweGIwLDB4MDMsMHgwMCwweGEzLDB4MTgsMHgyMSwweDhjLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwYSwweDIwLDB4MjcsCisweDAxLDB4NmEsMHgyOCwweDI0LDB4MDAsMHg0NCwweDEwLDB4MjQsMHgwMCwweDQ1LDB4MTAsMHgyNSwweGFjLDB4NjIsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MDMsMHhhNywweDAyLDB4NTEsMHgxMCwweDIxLDB4MDAsMHhhMywweDE4LDB4MjEsMHg5NCwweDYyLDB4MDAsMHgwMCwKKzB4MDAsMHgwYSwweDIwLDB4MjcsMHgwMSwweDZhLDB4MjgsMHgyNCwweDAwLDB4NDQsMHgxMCwweDI0LDB4MDAsMHg0NSwweDEwLDB4MjUsCisweGE0LDB4NjIsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAzLDB4YTcsMHgwMiwweDUxLDB4MTAsMHgyMSwweDNjLDB4MDMsMHhiMCwweDAzLAorMHgwMCwweGEzLDB4MTgsMHgyMSwweDkwLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwYSwweDIwLDB4MjcsMHgwMSwweDZhLDB4MjgsMHgyNCwKKzB4MDAsMHg0NCwweDEwLDB4MjQsMHgwMCwweDQ1LDB4MTAsMHgyNSwweDA4LDB4MDAsMHgwMywweGE2LDB4YTAsMHg2MiwweDAwLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4MTEsMHgwMiwweDAwLDB4MjEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE1LDB4MTMsMHhmZiwweDQyLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDExLDB4ODIsMHgwMCwweDE3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMSwweDg4LDB4MDAsMHgwYiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDgzLDB4OGIsMHg2MCwweDAwLDB4MDQsMHgyMCwweDgwLDB4MDAsMHg4MywweDIwLDB4MjEsCisweDhjLDB4ODIsMHgwMCwweDE4LDB4MDAsMHgwNiwweDE4LDB4MjcsMHgwMCwweGU2LDB4MjgsMHgyNCwweDAwLDB4NDMsMHgxMCwweDI0LAorMHgwMCwweDQ1LDB4MTAsMHgyNSwweDA4LDB4MDAsMHgwMywweGE2LDB4YWMsMHg4MiwweDAwLDB4MTgsMHgyNywweDgzLDB4OGIsMHg2OCwKKzB4MDAsMHgwNCwweDIwLDB4NDAsMHgwMCwweDgzLDB4MjAsMHgyMSwweDk0LDB4ODIsMHgwMCwweDAyLDB4MDAsMHgwNiwweDE4LDB4MjcsCisweDAwLDB4ZTYsMHgyOCwweDI0LDB4MDAsMHg0MywweDEwLDB4MjQsMHgwMCwweDQ1LDB4MTAsMHgyNSwweDA4LDB4MDAsMHgwMywweGE2LAorMHhhNCwweDgyLDB4MDAsMHgwMiwweDI3LDB4ODMsMHg4YiwweDYwLDB4MDAsMHg4MywweDE4LDB4MjEsMHg5MCwweDYyLDB4MDAsMHgwMCwKKzB4MDAsMHgwNiwweDIwLDB4MjcsMHgwOCwweDAwLDB4MDQsMHg1YywweDAwLDB4ZTYsMHgyOCwweDI0LDB4MzAsMHg2MiwweDAwLDB4MDcsCisweDAwLDB4MDIsMHgxMiwweDAwLDB4MTEsMHg4OCwweDAwLDB4MGYsMHgwMCwweDQ0LDB4MTAsMHgyMSwweDExLDB4OTMsMHgwMCwweDA3LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDMsMHhiMCwweDBhLDB4MDAsMHg0MywweDE4LDB4MjEsMHg4YywweDYyLDB4MDAsMHgwMCwKKzB4MDAsMHgwNiwweDIwLDB4MjcsMHgwOCwweDAwLDB4MDQsMHg0OSwweDAwLDB4ZTYsMHgyOCwweDI0LDB4M2MsMHgwMywweGIwLDB4MGEsCisweDAwLDB4NDMsMHgxOCwweDIxLDB4OTQsMHg2MiwweDAwLDB4MDAsMHgwMCwweDA2LDB4MjAsMHgyNywweDA4LDB4MDAsMHgwNCwweDUyLAorMHgwMCwweGU2LDB4MjgsMHgyNCwweDNjLDB4MDMsMHhiMCwweDBhLDB4MDgsMHgwMCwweDA0LDB4N2YsMHgwMCwweDQzLDB4MTgsMHgyMSwKKzB4OTcsMHg4NSwweDhiLDB4YjQsMHgzYywweDA3LDB4YjAsMHgwMiwweDNjLDB4MDQsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsCisweDAwLDB4YTcsMHgyOCwweDIxLDB4MzQsMHg4NCwweDAwLDB4MjAsMHgyNCwweDQyLDB4MTIsMHg2MCwweDI0LDB4MDMsMHhmZiwweDgwLAorMHhhYywweDgyLDB4MDAsMHgwMCwweGEwLDB4YTMsMHgwMCwweDA3LDB4OTcsMHg4MiwweDhiLDB4YjYsMHg5NywweDg1LDB4OGIsMHhiNCwKKzB4M2MsMHgwNiwweGIwLDB4MDYsMHgzMCwweDQyLDB4ZmYsMHhmOCwweDI0LDB4NDIsMHgwMCwweDEwLDB4MDAsMHhhMiwweDEwLDB4MjEsCisweDMwLDB4NDIsMHgwZiwweGZmLDB4MjQsMHg0NCwweDAwLDB4MDgsMHgzMCwweDg0LDB4MGYsMHhmZiwweDAwLDB4MDUsMHgyOCwweGMyLAorMHgzYywweDAzLDB4MDAsMHg0MCwweDAwLDB4YTMsMHgyOCwweDI1LDB4MDAsMHg4NywweDIwLDB4MjEsMHgzNCwweGM2LDB4ODAsMHgxOCwKKzB4YWMsMHhjNSwweDAwLDB4MDAsMHhhZiwweDg0LDB4OGIsMHhiMCwweGE3LDB4ODIsMHg4YiwweGI0LDB4YTcsMHg4MCwweDhiLDB4YjYsCisweGFmLDB4ODAsMHg4YiwweGI4LDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4YTUsMHgwMCwweGZmLAorMHgzMCwweDg0LDB4MDAsMHhmZiwweDI0LDB4MDIsMHgwMCwweDAxLDB4MDAsMHhlMCwweDQ4LDB4MjEsMHgzMCwweGM2LDB4MDAsMHhmZiwKKzB4OGYsMHhhNywweDAwLDB4MTAsMHgxMCwweDgyLDB4MDAsMHgwNywweDAwLDB4YTAsMHg0MCwweDIxLDB4MjQsMHgwMiwweDAwLDB4MDMsCisweDEwLDB4ODIsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweGE4LDB4MDEsMHgwMCwweDNjLDB4MDMsMHhiMCwweDAzLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgwMCwweDA3LDB4MjAsMHgyNywKKzB4MDEsMHgyNywweDI4LDB4MjQsMHgxMCwweGMyLDB4MDAsMHgxNCwweDAxLDB4MDMsMHgxOCwweDIxLDB4MjQsMHgwMiwweDAwLDB4MDIsCisweDEwLDB4YzIsMHgwMCwweDA5LDB4MDAsMHgwNywweDUwLDB4MjcsMHgzYywweDAzLDB4YjAsMHgwMywweDAxLDB4MDMsMHgxOCwweDIxLAorMHg4YywweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0YSwweDEwLDB4MjQsMHgwMCwweDQ1LDB4MTAsMHgyNSwKKzB4MDgsMHgwMCwweDA0LDB4ZTMsMHhhYywweDYyLDB4MDAsMHgwMCwweDNjLDB4MDMsMHhiMCwweDAzLDB4MDEsMHgwMywweDE4LDB4MjEsCisweDk0LDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDRhLDB4MTAsMHgyNCwweDAwLDB4NDUsMHgxMCwweDI1LAorMHgwMywweGUwLDB4MDAsMHgwOCwweGE0LDB4NjIsMHgwMCwweDAwLDB4OTAsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHg0NCwweDEwLDB4MjQsMHgwMCwweDQ1LDB4MTAsMHgyNSwweGEwLDB4NjIsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg4NCwweDAwLDB4MDcsMHgwMCwweDA0LDB4MjIsMHgwMCwweDMwLDB4YTUsMHgwMCwweGZmLAorMHgwMCwweDg1LDB4MjgsMHgyMSwweDNjLDB4MDIsMHhiMCwweDBhLDB4MDAsMHhhMiwweDQwLDB4MjEsMHgzMCwweGM2LDB4MDAsMHhmZiwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHg4ZiwweGE0LDB4MDAsMHgxMCwweDEwLDB4YzIsMHgwMCwweDE0LDB4MjQsMHgwMiwweDAwLDB4MDIsCisweDAwLDB4MDQsMHg1MCwweDI3LDB4MTAsMHhjMiwweDAwLDB4MDksMHgwMCwweGU0LDB4NDgsMHgyNCwweDNjLDB4MDMsMHhiMCwweDBhLAorMHgwMCwweGEzLDB4MTgsMHgyMSwweDhjLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDRhLDB4MTAsMHgyNCwKKzB4MDAsMHg0OSwweDEwLDB4MjUsMHgwMywweGUwLDB4MDAsMHgwOCwweGFjLDB4NjIsMHgwMCwweDAwLDB4M2MsMHgwMywweGIwLDB4MGEsCisweDAwLDB4YTMsMHgxOCwweDIxLDB4OTQsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NGEsMHgxMCwweDI0LAorMHgwMCwweDQ5LDB4MTAsMHgyNSwweDAzLDB4ZTAsMHgwMCwweDA4LDB4YTQsMHg2MiwweDAwLDB4MDAsMHg5MSwweDAyLDB4MDAsMHgwMCwKKzB4MDAsMHgwNCwweDE4LDB4MjcsMHgwMCwweGU0LDB4MjAsMHgyNCwweDAwLDB4NDMsMHgxMCwweDI0LDB4MDAsMHg0NCwweDEwLDB4MjUsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4YTEsMHgwMiwweDAwLDB4MDAsMHgzMCwweGE5LDB4MDAsMHhmZiwweDI3LDB4ODMsMHg4YiwweDYwLAorMHgzMCwweDg1LDB4MDAsMHhmZiwweDI0LDB4MDIsMHgwMCwweDAxLDB4MDAsMHgwNywweDUwLDB4MjcsMHgwMCwweGM3LDB4NDAsMHgyNCwKKzB4MTEsMHgyMiwweDAwLDB4MTcsMHgwMCwweGEzLDB4MTgsMHgyMSwweDAwLDB4MDUsMHgyMCwweDQwLDB4MjcsMHg4MiwweDhiLDB4NjAsCisweDAwLDB4MDUsMHgyOCwweDgwLDB4MjcsMHg4MywweDhiLDB4NjgsMHgwMCwweDgzLDB4NTAsMHgyMSwweDAwLDB4YTIsMHgyMCwweDIxLAorMHgyNCwweDAyLDB4MDAsMHgwMiwweDAwLDB4MDcsMHg0MCwweDI3LDB4MTEsMHgyMiwweDAwLDB4MDcsMHgwMCwweGM3LDB4MjgsMHgyNCwKKzB4OGMsMHg4MiwweDAwLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDgsMHgxMCwweDI0LDB4MDAsMHg0NSwweDEwLDB4MjUsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4YWMsMHg4MiwweDAwLDB4MTgsMHg5NSwweDQyLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDQ4LDB4MTAsMHgyNCwweDAwLDB4NDUsMHgxMCwweDI1LDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhNSwweDQyLDB4MDAsMHgwMiwKKzB4OTAsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NGEsMHgxMCwweDI0LDB4MDAsMHg0OCwweDEwLDB4MjUsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4YTAsMHg2MiwweDAwLDB4MDAsMHgwMCwweDA0LDB4MzIsMHgwMiwweDMwLDB4YzYsMHhmZiwweDAwLAorMHgwMCwweDA0LDB4MTYsMHgwMiwweDAwLDB4MDQsMHgxYSwweDAwLDB4M2MsMHgwNSwweDAwLDB4ZmYsMHgwMCwweDY1LDB4MTgsMHgyNCwKKzB4MDAsMHg0NiwweDEwLDB4MjUsMHgwMCwweDQzLDB4MTAsMHgyNSwweDAwLDB4MDQsMHgyNiwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDAwLDB4NDQsMHgxMCwweDI1LDB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwweDI3LDB4YmQsMHhmZiwweGU4LAorMHgzNCwweDYzLDB4MDAsMHgyMCwweDI0LDB4NDIsMHgxNCwweGU0LDB4M2MsMHgwNCwweGIwLDB4MDMsMHhhZiwweGJmLDB4MDAsMHgxNCwKKzB4YWMsMHg2MiwweDAwLDB4MDAsMHhhZiwweGIwLDB4MDAsMHgxMCwweDM0LDB4ODQsMHgwMCwweDJjLDB4OGMsMHg4MywweDAwLDB4MDAsCisweGE3LDB4ODAsMHhiYiwweGYwLDB4MDAsMHgwMywweDEyLDB4MDIsMHgwMCwweDAzLDB4MmQsMHgwMiwweDMwLDB4NDIsMHgwZiwweGZmLAorMHhhMywweDgzLDB4YmIsMHhmOCwweGE3LDB4ODUsMHhiYiwweGZjLDB4YTcsMHg4MiwweGJiLDB4ZmEsMHhhNywweDgwLDB4YmIsMHhmMiwKKzB4YTcsMHg4MCwweGJiLDB4ZjQsMHhhNywweDgwLDB4YmIsMHhmNiwweDBjLDB4MDAsMHgwNiwweGNlLDB4MjQsMHgwNCwweDA1LDB4MDAsCisweDNjLDB4MDUsMHgwOCwweDAwLDB4MDAsMHg0NSwweDI4LDB4MjUsMHgyNCwweDA0LDB4MDUsMHgwMCwweDBjLDB4MDAsMHgwNiwweGMxLAorMHgwMCwweDQwLDB4ODAsMHgyMSwweDNjLDB4MDIsMHhmNywweGZmLDB4MzQsMHg0MiwweGZmLDB4ZmYsMHgwMiwweDAyLDB4ODAsMHgyNCwKKzB4MDIsMHgwMCwweDI4LDB4MjEsMHgwYywweDAwLDB4MDYsMHhjMSwweDI0LDB4MDQsMHgwNSwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDNjLDB4MDMsMHhiMCwweDAzLDB4MzQsMHg0MiwweDAxLDB4MDgsMHgzNCwweDYzLDB4MDEsMHgxOCwweDhjLDB4NDUsMHgwMCwweDAwLAorMHg4YywweDY0LDB4MDAsMHgwMCwweDNjLDB4MDIsMHgwMCwweDBmLDB4M2MsMHgwMywweDAwLDB4NGMsMHgzMCwweDg0LDB4MDIsMHgwMCwKKzB4MzQsMHg2MywweDRiLDB4NDAsMHhhZiwweDg1LDB4YmMsMHgwMCwweDEwLDB4ODAsMHgwMCwweDA2LDB4MzQsMHg0MiwweDQyLDB4NDAsCisweGFmLDB4ODMsMHhiYywweDA0LDB4OGYsMHhiZiwweDAwLDB4MTQsMHg4ZiwweGIwLDB4MDAsMHgxMCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHgxOCwweGFmLDB4ODIsMHhiYywweDA0LDB4MDgsMHgwMCwweDA1LDB4NjksMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwweDI3LDB4YmQsMHhmZiwweGM4LDB4MzQsMHg2MywweDAwLDB4MjAsCisweDI0LDB4NDIsMHgxNSwweGMwLDB4MzAsMHg4NCwweDAwLDB4ZmYsMHhhZiwweGJmLDB4MDAsMHgzMCwweGFmLDB4YjcsMHgwMCwweDJjLAorMHhhZiwweGI2LDB4MDAsMHgyOCwweGFmLDB4YjUsMHgwMCwweDI0LDB4YWYsMHhiNCwweDAwLDB4MjAsMHhhZiwweGIzLDB4MDAsMHgxYywKKzB4YWYsMHhiMiwweDAwLDB4MTgsMHhhZiwweGIxLDB4MDAsMHgxNCwweGFmLDB4YjAsMHgwMCwweDEwLDB4YWMsMHg2MiwweDAwLDB4MDAsCisweDEwLDB4ODAsMHgwMCwweDFjLDB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweDgyLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4ZiwweGJmLDB4MDAsMHgzMCwweDdiLDB4YjYsMHgwMSwweDdjLDB4N2IsMHhiNCwweDAxLDB4M2MsMHg3YiwweGIyLDB4MDAsMHhmYywKKzB4N2IsMHhiMCwweDAwLDB4YmMsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDM4LDB4YTcsMHg4MCwweGJiLDB4ZjAsCisweGE3LDB4ODAsMHhiYiwweGYyLDB4YTcsMHg4MCwweGJiLDB4ZjQsMHhhNywweDgwLDB4YmIsMHhmNiwweDBjLDB4MDAsMHgwNiwweGNlLAorMHgyNCwweDA0LDB4MDUsMHgwMCwweDNjLDB4MDUsMHgwOCwweDAwLDB4MDAsMHg0NSwweDI4LDB4MjUsMHgyNCwweDA0LDB4MDUsMHgwMCwKKzB4MGMsMHgwMCwweDA2LDB4YzEsMHgwMCwweDQwLDB4ODAsMHgyMSwweDNjLDB4MDUsMHhmNywweGZmLDB4MzQsMHhhNSwweGZmLDB4ZmYsCisweDAyLDB4MDUsMHgyOCwweDI0LDB4MGMsMHgwMCwweDA2LDB4YzEsMHgyNCwweDA0LDB4MDUsMHgwMCwweDA4LDB4MDAsMHgwNSwweDg0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDBjLDB4MDAsMHgwNiwweGNlLDB4MjQsMHgwNCwweDA1LDB4YTAsMHgyNCwweDA0LDB4MDUsMHhhNCwKKzB4MGMsMHgwMCwweDA2LDB4Y2UsMHgwMCwweDAyLDB4YmMsMHgwMiwweDI0LDB4MDQsMHgwNSwweGE4LDB4MDAsMHgwMiwweGI0LDB4MDIsCisweDBjLDB4MDAsMHgwNiwweGNlLDB4MzAsMHg1NSwweGZmLDB4ZmYsMHgwMCwweDQwLDB4ODAsMHgyMSwweDk3LDB4ODQsMHhiYiwweGYwLAorMHg5NywweDgyLDB4YmIsMHhmMiwweDk3LDB4ODMsMHhiYiwweGY2LDB4MDIsMHhlNCwweDIwLDB4MjMsMHgwMiwweGEyLDB4MTAsMHgyMywKKzB4MDAsMHg4MiwweDIwLDB4MjEsMHg5NywweDgyLDB4YmIsMHhmNCwweDMyLDB4MTQsMHhmZiwweGZmLDB4MDIsMHg4MywweDE4LDB4MjMsCisweDAyLDB4YzIsMHgxMCwweDIzLDB4MDAsMHg4MiwweDIwLDB4MjEsMHg5MywweDgyLDB4YmIsMHhmOCwweDAwLDB4ODMsMHgyMCwweDIxLAorMHgzMCwweDg0LDB4ZmYsMHhmZiwweDAwLDB4ODIsMHgxMCwweDJiLDB4MTQsMHg0MCwweDAwLDB4YWEsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OTcsMHg4MiwweGJiLDB4ZmMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDQsMHgxMCwweDJiLDB4MTQsMHg0MCwweDAwLDB4N2YsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTcsMHg4MiwweGJiLDB4ZmEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDQsMHgxMCwweDJiLAorMHgxMCwweDQwLDB4MDAsMHgzYSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDA2LDB4Y2UsMHgyNCwweDA0LDB4MDQsMHg1MCwKKzB4MzAsMHg1MSwweDAwLDB4N2YsMHgwMCwweDQwLDB4ODAsMHgyMSwweDJlLDB4MjIsMHgwMCwweDMyLDB4MTAsMHg0MCwweDAwLDB4MTMsCisweDI0LDB4MDIsMHgwMCwweDIwLDB4MTIsMHgyMiwweDAwLDB4MTcsMHgyNCwweDAyLDB4ZmYsMHg4MCwweDAyLDB4MDIsMHgxMCwweDI0LAorMHgyNiwweDMxLDB4MDAsMHgwMSwweDAwLDB4NTEsMHg4MCwweDI1LDB4MDIsMHgwMCwweDI4LDB4MjEsMHgwYywweDAwLDB4MDYsMHhjMSwKKzB4MjQsMHgwNCwweDA0LDB4NTAsMHgwMiwweDAwLDB4MjgsMHgyMSwweDBjLDB4MDAsMHgwNiwweGMxLDB4MjQsMHgwNCwweDA0LDB4NTgsCisweDAyLDB4MDAsMHgyOCwweDIxLDB4MGMsMHgwMCwweDA2LDB4YzEsMHgyNCwweDA0LDB4MDQsMHg2MCwweDAyLDB4MDAsMHgyOCwweDIxLAorMHgyNCwweDA0LDB4MDQsMHg2OCwweDBjLDB4MDAsMHgwNiwweGMxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhhNywweDk3LDB4YmIsMHhmMCwKKzB4YTcsMHg5NSwweGJiLDB4ZjIsMHhhNywweDk2LDB4YmIsMHhmNCwweGE3LDB4OTQsMHhiYiwweGY2LDB4MDgsMHgwMCwweDA1LDB4ODQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDA2LDB4Y2UsMHgyNCwweDA0LDB4MDIsMHgwOCwweDNjLDB4MDQsMHgwMCwweGMwLAorMHgwMCwweDQwLDB4MjgsMHgyMSwweDAwLDB4NDQsMHgxMCwweDI0LDB4MDAsMHgwMiwweDE1LDB4ODIsMHgyNCwweDAzLDB4MDAsMHgwMywKKzB4MTAsMHg0MywweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDIsMHhmZiwweDNmLDB4MzQsMHg0MiwweGZmLDB4ZmYsCisweDAwLDB4YTIsMHgxMCwweDI0LDB4MDAsMHg0NCwweDI4LDB4MjUsMHgwYywweDAwLDB4MDYsMHhjMSwweDI0LDB4MDQsMHgwMiwweDA4LAorMHgwYywweDAwLDB4MDYsMHhjZSwweDI0LDB4MDQsMHgwMiwweDJjLDB4MDAsMHg0MCwweDkwLDB4MjEsMHgzYywweDAyLDB4ZmYsMHhmZiwKKzB4MzQsMHg0MiwweDNmLDB4ZmYsMHgwMiwweDQyLDB4OTAsMHgyNCwweDAyLDB4NDAsMHgyOCwweDIxLDB4MGMsMHgwMCwweDA2LDB4YzEsCisweDI0LDB4MDQsMHgwMiwweDJjLDB4MDgsMHgwMCwweDA1LDB4Y2IsMHgyNCwweDAyLDB4ZmYsMHg4MCwweDBjLDB4MDAsMHgwNiwweGNlLAorMHgyNCwweDA0LDB4MDQsMHg1MCwweDMwLDB4NTEsMHgwMCwweDdmLDB4MjQsMHgwMiwweDAwLDB4MjAsMHgxNiwweDIyLDB4ZmYsMHhkYiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwYywweDAwLDB4MDYsMHhjZSwweDI0LDB4MDQsMHgwMiwweDJjLDB4MzQsMHg1MiwweDQwLDB4MDAsCisweDAyLDB4NDAsMHgyOCwweDIxLDB4MGMsMHgwMCwweDA2LDB4YzEsMHgyNCwweDA0LDB4MDIsMHgyYywweDBjLDB4MDAsMHgwNiwweGNlLAorMHgyNCwweDA0LDB4MDIsMHg1OCwweDI0LDB4MDQsMHgwMiwweDVjLDB4MGMsMHgwMCwweDA2LDB4Y2UsMHgwMCwweDAyLDB4OWUsMHgwMiwKKzB4MzAsMHg0MywweDAwLDB4ZmYsMHgwMCwweDEzLDB4MTIsMHgwMCwweDAwLDB4NDMsMHgxMCwweDI1LDB4MmMsMHg0MywweDAwLDB4MDQsCisweDE0LDB4NjAsMHgwMCwweDFkLDB4MmMsMHg0MiwweDAwLDB4MTEsMHgxMCwweDQwLDB4MDAsMHgwYiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzYywweDAyLDB4ZmYsMHhmZiwweDM0LDB4NDIsMHgzZiwweGZmLDB4MDIsMHg0MiwweDkwLDB4MjQsMHgwMiwweDQwLDB4MjgsMHgyMSwKKzB4MjQsMHgwNCwweDAyLDB4MmMsMHgwYywweDAwLDB4MDYsMHhjMSwweDM2LDB4NTIsMHg4MCwweDAwLDB4MDIsMHg0MCwweDI4LDB4MjEsCisweDA4LDB4MDAsMHgwNSwweGQ5LDB4MjQsMHgwNCwweDAyLDB4MmMsMHgwYywweDAwLDB4MDYsMHhjZSwweDI0LDB4MDQsMHgwMiwweDA4LAorMHgzYywweDA0LDB4MDAsMHhjMCwweDAwLDB4NDAsMHgyOCwweDIxLDB4MDAsMHg0NCwweDEwLDB4MjQsMHgwMCwweDAyLDB4MTUsMHg4MiwKKzB4MjQsMHgwMywweDAwLDB4MDIsMHgxNCwweDQzLDB4ZmYsMHhlZSwweDNjLDB4MDIsMHhmZiwweDNmLDB4MzQsMHg0MiwweGZmLDB4ZmYsCisweDAwLDB4YTIsMHgxMCwweDI0LDB4MDAsMHg0NCwweDI4LDB4MjUsMHgwYywweDAwLDB4MDYsMHhjMSwweDI0LDB4MDQsMHgwMiwweDA4LAorMHgwOCwweDAwLDB4MDYsMHgxNSwweDNjLDB4MDIsMHhmZiwweGZmLDB4MGMsMHgwMCwweDA2LDB4Y2UsMHgyNCwweDA0LDB4MDIsMHgwOCwKKzB4MDAsMHg0MCwweDI4LDB4MjEsMHgwMCwweDAyLDB4MTUsMHg4MiwweDMwLDB4NDIsMHgwMCwweDAzLDB4MjQsMHgwMywweDAwLDB4MDMsCisweDE0LDB4NDMsMHhmZiwweGRmLDB4M2MsMHgwMiwweGZmLDB4M2YsMHgzNCwweDQyLDB4ZmYsMHhmZiwweDAwLDB4YTIsMHgxMCwweDI0LAorMHgzYywweDAzLDB4MDAsMHg4MCwweDA4LDB4MDAsMHgwNiwweDJhLDB4MDAsMHg0MywweDI4LDB4MjUsMHgwYywweDAwLDB4MDYsMHhjZSwKKzB4MjQsMHgwNCwweDA0LDB4NTAsMHgzMCwweDUxLDB4MDAsMHg3ZiwweDAwLDB4NDAsMHg4MCwweDIxLDB4MmUsMHgyMiwweDAwLDB4MzIsCisweDEwLDB4NDAsMHhmZiwweDlhLDB4MjQsMHgwMiwweDAwLDB4MjAsMHgxMiwweDIyLDB4MDAsMHgwNCwweDI0LDB4MDIsMHhmZiwweDgwLAorMHgwMiwweDAyLDB4MTAsMHgyNCwweDA4LDB4MDAsMHgwNSwweGNkLDB4MjYsMHgzMSwweDAwLDB4MDIsMHgwYywweDAwLDB4MDYsMHhjZSwKKzB4MjQsMHgwNCwweDAyLDB4MDgsMHgzYywweDA0LDB4MDAsMHhjMCwweDAwLDB4NDAsMHgyOCwweDIxLDB4MDAsMHg0NCwweDEwLDB4MjQsCisweDAwLDB4MDIsMHgxNSwweDgyLDB4MjQsMHgwMywweDAwLDB4MDMsMHgxMCwweDQzLDB4MDAsMHgwNywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzYywweDAyLDB4ZmYsMHgzZiwweDM0LDB4NDIsMHhmZiwweGZmLDB4MDAsMHhhMiwweDEwLDB4MjQsMHgwMCwweDQ0LDB4MjgsMHgyNSwKKzB4MGMsMHgwMCwweDA2LDB4YzEsMHgyNCwweDA0LDB4MDIsMHgwOCwweDBjLDB4MDAsMHgwNiwweGNlLDB4MjQsMHgwNCwweDAyLDB4MmMsCisweDAwLDB4NDAsMHg5MCwweDIxLDB4M2MsMHgwMiwweGZmLDB4ZmYsMHgzNCwweDQyLDB4M2YsMHhmZiwweDAyLDB4NDIsMHg5MCwweDI0LAorMHgwMiwweDQwLDB4MjgsMHgyMSwweDBjLDB4MDAsMHgwNiwweGMxLDB4MjQsMHgwNCwweDAyLDB4MmMsMHgwOCwweDAwLDB4MDYsMHg0NCwKKzB4MjQsMHgwMiwweGZmLDB4ODAsMHgwYywweDAwLDB4MDYsMHhjZSwweDI0LDB4MDQsMHgwNCwweDUwLDB4MDAsMHg0MCwweDgwLDB4MjEsCisweDMwLDB4NTEsMHgwMCwweDdmLDB4MjQsMHgwMiwweDAwLDB4MjAsMHgxMiwweDIyLDB4MDAsMHgxZCwweDJlLDB4MjIsMHgwMCwweDIxLAorMHgxNCwweDQwLDB4ZmYsMHg3MiwweDI0LDB4MDIsMHhmZiwweDgwLDB4MDIsMHgwMiwweDEwLDB4MjQsMHgyNiwweDMxLDB4ZmYsMHhmZiwKKzB4MDAsMHg1MSwweDgwLDB4MjUsMHgyNCwweDA0LDB4MDQsMHg1MCwweDBjLDB4MDAsMHgwNiwweGMxLDB4MDIsMHgwMCwweDI4LDB4MjEsCisweDI0LDB4MDQsMHgwNCwweDU4LDB4MGMsMHgwMCwweDA2LDB4YzEsMHgwMiwweDAwLDB4MjgsMHgyMSwweDI0LDB4MDQsMHgwNCwweDYwLAorMHgwYywweDAwLDB4MDYsMHhjMSwweDAyLDB4MDAsMHgyOCwweDIxLDB4MDIsMHgwMCwweDI4LDB4MjEsMHgwYywweDAwLDB4MDYsMHhjMSwKKzB4MjQsMHgwNCwweDA0LDB4NjgsMHgyNCwweDAyLDB4MDAsMHgyMCwweDE2LDB4MjIsMHhmZiwweDYwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDBjLDB4MDAsMHgwNiwweGNlLDB4MjQsMHgwNCwweDAyLDB4MmMsMHgwMCwweDQwLDB4OTAsMHgyMSwweDNjLDB4MDIsMHhmZiwweGZmLAorMHgzNCwweDQyLDB4M2YsMHhmZiwweDAyLDB4NDIsMHgxMCwweDI0LDB4MDgsMHgwMCwweDA2LDB4MWIsMHgzNCwweDUyLDB4ODAsMHgwMCwKKzB4MGMsMHgwMCwweDA2LDB4Y2UsMHgyNCwweDA0LDB4MDIsMHgyYywweDM0LDB4NTIsMHg0MCwweDAwLDB4MDIsMHg0MCwweDI4LDB4MjEsCisweDBjLDB4MDAsMHgwNiwweGMxLDB4MjQsMHgwNCwweDAyLDB4MmMsMHgwYywweDAwLDB4MDYsMHhjZSwweDI0LDB4MDQsMHgwMiwweDU4LAorMHgyNCwweDA0LDB4MDIsMHg1YywweDBjLDB4MDAsMHgwNiwweGNlLDB4MDAsMHgwMiwweDllLDB4MDIsMHgzMCwweDQzLDB4MDAsMHhmZiwKKzB4MDAsMHgxMywweDEyLDB4MDAsMHgwMCwweDQzLDB4MTAsMHgyNSwweDJjLDB4NDMsMHgwMCwweDA0LDB4MTQsMHg2MCwweDAwLDB4MjAsCisweDJjLDB4NDIsMHgwMCwweDExLDB4MTAsMHg0MCwweDAwLDB4MGQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDIsMHhmZiwweGZmLAorMHgzNCwweDQyLDB4M2YsMHhmZiwweDAyLDB4NDIsMHg5MCwweDI0LDB4MDIsMHg0MCwweDI4LDB4MjEsMHgyNCwweDA0LDB4MDIsMHgyYywKKzB4MGMsMHgwMCwweDA2LDB4YzEsMHgzNiwweDUyLDB4ODAsMHgwMCwweDAyLDB4NDAsMHgyOCwweDIxLDB4MGMsMHgwMCwweDA2LDB4YzEsCisweDI0LDB4MDQsMHgwMiwweDJjLDB4MDgsMHgwMCwweDA2LDB4NjgsMHgyZSwweDIyLDB4MDAsMHgyMSwweDBjLDB4MDAsMHgwNiwweGNlLAorMHgyNCwweDA0LDB4MDIsMHgwOCwweDNjLDB4MDQsMHgwMCwweGMwLDB4MDAsMHg0MCwweDI4LDB4MjEsMHgwMCwweDQ0LDB4MTAsMHgyNCwKKzB4MDAsMHgwMiwweDE1LDB4ODIsMHgyNCwweDAzLDB4MDAsMHgwMiwweDE0LDB4NDMsMHhmZiwweGVjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MDIsMHhmZiwweDNmLDB4MzQsMHg0MiwweGZmLDB4ZmYsMHgwMCwweGEyLDB4MTAsMHgyNCwweDAwLDB4NDQsMHgyOCwweDI1LAorMHgwYywweDAwLDB4MDYsMHhjMSwweDI0LDB4MDQsMHgwMiwweDA4LDB4MDgsMHgwMCwweDA2LDB4OTgsMHgzYywweDAyLDB4ZmYsMHhmZiwKKzB4MGMsMHgwMCwweDA2LDB4Y2UsMHgyNCwweDA0LDB4MDIsMHgwOCwweDAwLDB4NDAsMHgyOCwweDIxLDB4MDAsMHgwMiwweDE1LDB4ODIsCisweDMwLDB4NDIsMHgwMCwweDAzLDB4MjQsMHgwMywweDAwLDB4MDMsMHgxNCwweDQzLDB4ZmYsMHhkYywweDNjLDB4MDMsMHgwMCwweDgwLAorMHgzYywweDAyLDB4ZmYsMHgzZiwweDM0LDB4NDIsMHhmZiwweGZmLDB4MDAsMHhhMiwweDEwLDB4MjQsMHgwOCwweDAwLDB4MDYsMHhiMCwKKzB4MDAsMHg0MywweDI4LDB4MjUsMHgzMCwweDgzLDB4MDAsMHgwMywweDAwLDB4MDQsMHgyMCwweDQwLDB4MDAsMHg4MywweDIwLDB4MjMsCisweDNjLDB4MDIsMHhiMCwweDBhLDB4MDAsMHg4MiwweDIwLDB4MjEsMHhhYywweDg1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxOCwweDIxLAorMHgyNCwweDYzLDB4MDAsMHgwMSwweDJjLDB4NjIsMHgwMCwweDBhLDB4MTQsMHg0MCwweGZmLDB4ZmUsMHgyNCwweDYzLDB4MDAsMHgwMSwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNCwweDYzLDB4ZmYsMHhmZiwweDMwLDB4ODYsMHgwMCwweDAzLDB4MDAsMHgwNCwweDI4LDB4NDAsCisweDNjLDB4MDMsMHhiMCwweDBhLDB4MDAsMHhhNiwweDEwLDB4MjMsMHgwMCwweDQzLDB4MTAsMHgyMSwweDI0LDB4MDQsMHhmZiwweGZmLAorMHhhYywweDQ0LDB4MTAsMHgwMCwweDAwLDB4MDAsMHgxOCwweDIxLDB4MjQsMHg2MywweDAwLDB4MDEsMHgyYywweDYyLDB4MDAsMHgwYSwKKzB4MTQsMHg0MCwweGZmLDB4ZmUsMHgyNCwweDYzLDB4MDAsMHgwMSwweDI0LDB4NjMsMHhmZiwweGZmLDB4MDAsMHhhNiwweDE4LDB4MjMsCisweDNjLDB4MDIsMHhiMCwweDBhLDB4MDAsMHg2MiwweDE4LDB4MjEsMHg4YywweDYyLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDUsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgyNCwweDQyLDB4MWIsMHg4NCwKKzB4MjQsMHgwMywweDAwLDB4MDEsMHgzNCwweGE1LDB4MDAsMHgyMCwweDNjLDB4MDYsMHhiMCwweDAzLDB4YWMsMHhhMiwweDAwLDB4MDAsCisweDM0LDB4YzYsMHgwMSwweDA0LDB4YTAsMHg4MywweDAwLDB4NDgsMHhhMCwweDgwLDB4MDAsMHgwNCwweGEwLDB4ODAsMHgwMCwweDA1LAorMHhhMCwweDgwLDB4MDAsMHgwNiwweGEwLDB4ODAsMHgwMCwweDA3LDB4YTAsMHg4MCwweDAwLDB4MDgsMHhhMCwweDgwLDB4MDAsMHgwOSwKKzB4YTAsMHg4MCwweDAwLDB4MGEsMHhhMCwweDgwLDB4MDAsMHgxMSwweGEwLDB4ODAsMHgwMCwweDEzLDB4YTAsMHg4MCwweDAwLDB4NDksCisweDk0LDB4YzIsMHgwMCwweDAwLDB4YWMsMHg4MCwweDAwLDB4MDAsMHhhMCwweDgwLDB4MDAsMHg0ZSwweDAwLDB4MDIsMHgxNCwweDAwLAorMHgwMCwweDAyLDB4MTQsMHgwMywweDMwLDB4NDMsMHgwMCwweGZmLDB4MzAsMHg0MiwweGZmLDB4MDAsMHhhNCwweDgyLDB4MDAsMHg0NCwKKzB4YTQsMHg4MywweDAwLDB4NDYsMHhhYywweDgwLDB4MDAsMHgyNCwweGFjLDB4ODAsMHgwMCwweDI4LDB4YWMsMHg4MCwweDAwLDB4MmMsCisweGFjLDB4ODAsMHgwMCwweDMwLDB4YWMsMHg4MCwweDAwLDB4MzQsMHhhYywweDgwLDB4MDAsMHgzOCwweGFjLDB4ODAsMHgwMCwweDNjLAorMHgwMywweGUwLDB4MDAsMHgwOCwweGFjLDB4ODAsMHgwMCwweDQwLDB4ODQsMHg4MywweDAwLDB4MGMsMHgzYywweDA3LDB4YjAsMHgwMywKKzB4MzQsMHhlNywweDAwLDB4MjAsMHgwMCwweDAzLDB4MTAsMHhjMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDI3LDB4ODMsMHg4ZiwweGY0LDB4MDAsMHg0MywweDEwLDB4MjEsMHg4YywweDQ4LDB4MDAsMHgxOCwweDNjLDB4MDIsMHg4MCwweDAwLAorMHgyNCwweDQyLDB4MWMsMHgxOCwweGFjLDB4ZTIsMHgwMCwweDAwLDB4OGQsMHgwMywweDAwLDB4MDgsMHg4MCwweDgyLDB4MDAsMHgxMywKKzB4MDAsMHgwNSwweDJjLDB4MDAsMHgwMCwweDAzLDB4MWUsMHgwMiwweDAwLDB4MDIsMHgxMiwweDAwLDB4MzAsMHg2MywweDAwLDB4N2UsCisweDAwLDB4NjIsMHgxOCwweDIxLDB4MDAsMHg2NSwweDE4LDB4MjEsMHgzYywweDAyLDB4YzAsMHgwMCwweDNjLDB4MDUsMHhiMCwweDA1LAorMHgzNCwweDQyLDB4MDQsMHgwMCwweDI0LDB4NjMsMHgwMCwweDAxLDB4M2MsMHgwNywweGIwLDB4MDUsMHgzYywweDA4LDB4YjAsMHgwNSwKKzB4MzQsMHhhNSwweDA0LDB4MjAsMHhhYywweGEzLDB4MDAsMHgwMCwweDAwLDB4YzIsMHgzMCwweDIxLDB4MzQsMHhlNywweDA0LDB4MjQsCisweDM1LDB4MDgsMHgwMiwweDI4LDB4MjQsMHgwMiwweDAwLDB4MDEsMHgyNCwweDAzLDB4MDAsMHgyMCwweGFjLDB4ZTYsMHgwMCwweDAwLAorMHhhYywweDgyLDB4MDAsMHgzYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4YTEsMHgwMywweDAwLDB4MDAsMHgyNywweGJkLDB4ZmYsMHhhOCwKKzB4MDAsMHgwNywweDYwLDB4ODAsMHgyNywweDgyLDB4YjMsMHhmMCwweGFmLDB4YmUsMHgwMCwweDUwLDB4YWYsMHhiNywweDAwLDB4NGMsCisweGFmLDB4YjUsMHgwMCwweDQ0LDB4YWYsMHhiNCwweDAwLDB4NDAsMHhhZiwweGJmLDB4MDAsMHg1NCwweGFmLDB4YjYsMHgwMCwweDQ4LAorMHhhZiwweGIzLDB4MDAsMHgzYywweGFmLDB4YjIsMHgwMCwweDM4LDB4YWYsMHhiMSwweDAwLDB4MzQsMHhhZiwweGIwLDB4MDAsMHgzMCwKKzB4MDEsMHg4MiwweDEwLDB4MjEsMHg4YywweDQzLDB4MDAsMHgwMCwweDAwLDB4ZTAsMHg3MCwweDIxLDB4M2MsMHgwMiwweDgwLDB4MDAsCisweDk0LDB4NzMsMHgwMCwweDE0LDB4M2MsMHgwNywweGIwLDB4MDMsMHgzNCwweGU3LDB4MDAsMHgyMCwweDI0LDB4NDIsMHgxYywweGFjLAorMHgzYywweDAzLDB4YjAsMHgwNSwweGFjLDB4ZTIsMHgwMCwweDAwLDB4MzQsMHg2MywweDAxLDB4MjgsMHg5MCwweDY3LDB4MDAsMHgwMCwKKzB4MDAsMHgxMywweGE4LDB4YzAsMHgwMiwweGIzLDB4MTgsMHgyMSwweDI3LDB4ODIsMHg4ZiwweGY0LDB4MDAsMHgwMywweDE4LDB4ODAsCisweDAwLDB4NjIsMHgxOCwweDIxLDB4MDAsMHgwNSwweDJjLDB4MDAsMHgwMCwweDA3LDB4M2UsMHgwMCwweDI4LDB4YzIsMHgwMCwweDAzLAorMHgwMCwweGMwLDB4YTAsMHgyMSwweDAwLDB4ODAsMHg3OCwweDIxLDB4MDAsMHgwNSwweGJjLDB4MDMsMHg4YywweDY4LDB4MDAsMHgxOCwKKzB4MDIsMHhhMCwweDU4LDB4MjEsMHgxMCwweDQwLDB4MDEsMHg4MSwweDAwLDB4MDcsMHhmNiwweDAzLDB4MDAsMHhkZSwweDEwLDB4MDcsCisweDMwLDB4NWUsMHgwMCwweDAxLDB4MDEsMHg3MywweDEwLDB4MjEsMHgyNywweDgzLDB4OGYsMHhmOCwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweDgwLDB4NGQsMHgwMCwweDA2LDB4OGQsMHgwMywweDAwLDB4MDAsMHg4ZCwweDAyLDB4MDAsMHgwNCwKKzB4OGQsMHgwYSwweDAwLDB4MDgsMHg4ZCwweDAzLDB4MDAsMHgwYywweGFmLDB4YTIsMHgwMCwweDIwLDB4MTEsMHhhMCwweDAxLDB4NzEsCisweGFmLDB4YTMsMHgwMCwweDE4LDB4MjcsMHg4MiwweGIzLDB4ZjAsMHgwMSwweDgyLDB4MTAsMHgyMSwweDhjLDB4NDQsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDkwLDB4ODMsMHgwMCwweDE2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDYzLDB4MDAsMHgwNCwKKzB4MTQsMHg2MCwweDAwLDB4MTIsMHgwMCwweDAwLDB4YjAsMHgyMSwweDNjLDB4MDIsMHhiMCwweDA5LDB4MzQsMHg0MiwweDAxLDB4NDYsCisweDkwLDB4NDMsMHgwMCwweDAwLDB4MmEsMHg4NCwweDAwLDB4MDQsMHgxMCwweDgwLDB4MDEsMHg1NiwweDMwLDB4NjUsMHgwMCwweDAxLAorMHg5MSwweGUyLDB4MDAsMHgwOSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTIsMHg4MiwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDI4LDB4MjEsMHgxNCwweGEwLDB4MDAsMHgwMywweDAwLDB4MDAsMHgzOCwweDIxLDB4MTMsMHhjMCwweDAwLDB4MDMsCisweDM4LDB4ZjYsMHgwMCwweDAxLDB4MjQsMHgwNywweDAwLDB4MDEsMHgzOCwweGY2LDB4MDAsMHgwMSwweDAxLDB4NzMsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MzAsMHg4MCwweDI3LDB4ODMsMHg5MCwweDAwLDB4MDAsMHhjMywweDQ4LDB4MjEsMHg5MSwweDI1LDB4MDAsMHgwMCwKKzB4OGYsMHhhNCwweDAwLDB4MjAsMHgyYywweGEzLDB4MDAsMHgwNCwweDAwLDB4MDQsMHgxMSwweGMzLDB4MzAsMHg0MiwweDAwLDB4MDEsCisweDAwLDB4MDMsMHhiMCwweDBiLDB4MTIsMHhjMCwweDAwLDB4ZDgsMHhhZiwweGEyLDB4MDAsMHgyNCwweDkzLDB4OTAsMHhiYiwweGRhLAorMHgwMCwweDBhLDB4MTYsMHg0MiwweDMwLDB4NTIsMHgwMCwweDNmLDB4MmUsMHgwNiwweDAwLDB4MGMsMHgxMCwweGMwLDB4MDAsMHhjMCwKKzB4MDAsMHhhMCwweDIwLDB4MjEsMHgyYywweGEyLDB4MDAsMHgxMCwweDE0LDB4NDAsMHgwMCwweDA0LDB4MDAsMHg5MCwweDEwLDB4MmIsCisweDMwLDB4YTIsMHgwMCwweDA3LDB4MjQsMHg0NCwweDAwLDB4MDQsMHgwMCwweDkwLDB4MTAsMHgyYiwweDEwLDB4NDAsMHgwMCwweDBiLAorMHgwMSwweDczLDB4MTAsMHgyMSwweDI3LDB4ODUsMHhiYiwweDBjLDB4MDAsMHgxMCwweDEwLDB4NDAsMHgwMCwweDUwLDB4MTAsMHgyMSwKKzB4MDAsMHg0NSwweDEwLDB4MjEsMHg5MCwweDUwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MCwweDE4LDB4MmIsCisweDE0LDB4NjAsMHhmZiwweGZhLDB4MDAsMHgxMCwweDEwLDB4NDAsMHgwMSwweDczLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgyNywweDgzLDB4OGYsMHhmOCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MzEsMHhhNCwweDAwLDB4MDEsMHgxMCwweDgwLDB4MDAsMHhhNSwKKzB4YTAsMHg1MCwweDAwLDB4MDcsMHgzYywweDA0LDB4YjAsMHgwNSwweDM0LDB4ODQsMHgwMCwweDA4LDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDNjLDB4MDMsMHg4MCwweDAwLDB4YTEsMHhlMiwweDAwLDB4NGUsMHhhYywweDgzLDB4MDAsMHgwMCwweDhjLDB4ODUsMHgwMCwweDAwLAorMHgzYywweDAyLDB4MDAsMHhmMCwweDNjLDB4MDMsMHg0MCwweGYwLDB4MzQsMHg0MiwweGYwLDB4MDAsMHgzNCwweDYzLDB4ZjAsMHgwMCwKKzB4MjQsMHgxNywweDAwLDB4MGUsMHgyNCwweDEzLDB4MDEsMHgwNiwweGFjLDB4ODIsMHgwMCwweDAwLDB4YWMsMHg4MywweDAwLDB4MDAsCisweDI3LDB4ODIsMHhiMywweGYwLDB4MDEsMHg4MiwweDEwLDB4MjEsMHg4YywweDQzLDB4MDAsMHgwMCwweDI0LDB4MDUsMHgwMCwweDAxLAorMHhhZiwweGE1LDB4MDAsMHgxYywweDkwLDB4NjIsMHgwMCwweDE2LDB4MDAsMHgxMywweGE4LDB4YzAsMHgzMiwweDUxLDB4MDAsMHgwMiwKKzB4MzQsMHg0MiwweDAwLDB4MDQsMHhhMCwweDYyLDB4MDAsMHgxNiwweDhmLDB4YTMsMHgwMCwweDIwLDB4OGYsMHhhNCwweDAwLDB4MTgsCisweDAwLDB4MDMsMHgxMywweDQzLDB4MDAsMHgwNCwweDFhLDB4MDIsMHgzMCwweDQ3LDB4MDAsMHgwMSwweDEyLDB4MjAsMHgwMCwweDA0LAorMHgzMCwweDY0LDB4MDcsMHhmZiwweDJlLDB4MDMsMHgwMCwweDA0LDB4MzIsMHg0MiwweDAwLDB4MzMsMHgwMCwweDQzLDB4OTAsMHgwYiwKKzB4OGYsMHhhNSwweDAwLDB4MjQsMHg4ZiwweGE2LDB4MDAsMHgxYywweDAwLDB4MTIsMHgxMCwweDQwLDB4MDAsMHgwNSwweDE5LDB4YzAsCisweDAwLDB4NDcsMHgxMCwweDIxLDB4MDAsMHgwNiwweDJhLDB4ODAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MTAsMHgzMiwweDAwLAorMHgwMCwweDA0LDB4MjQsMHg4MCwweDAyLDB4NjUsMHgyOCwweDIxLDB4MDAsMHhhNCwweDI4LDB4MjEsMHgwMCwweDQ2LDB4MTAsMHgyMSwKKzB4MDAsMHgxNywweDFjLDB4MDAsMHgzYywweDA0LDB4YzAsMHgwMCwweDAwLDB4NDMsMHgzMCwweDIxLDB4MTYsMHg4MCwweDAwLDB4MjksCisweDAwLDB4YTQsMHgyOCwweDIxLDB4M2MsMHgwMiwweGIwLDB4MDUsMHgzNCwweDQyLDB4MDQsMHgwMCwweDNjLDB4MDMsMHhiMCwweDA1LAorMHgzYywweDA0LDB4YjAsMHgwNSwweGFjLDB4NDYsMHgwMCwweDAwLDB4MzQsMHg2MywweDA0LDB4MDQsMHgzNCwweDg0LDB4MDIsMHgyOCwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHhhYywweDY1LDB4MDAsMHgwMCwweGEwLDB4ODIsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDksCisweDM0LDB4NDIsMHgwMSwweDQ2LDB4OTAsMHg0NCwweDAwLDB4MDAsMHg5MSwweGUzLDB4MDAsMHgwOSwweDMwLDB4ODYsMHgwMCwweDAxLAorMHgwMiwweDgzLDB4MTgsMHgyNiwweDAwLDB4MDMsMHgzMCwweDBiLDB4MTQsMHhjMCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MjgsMHgyMSwKKzB4MTMsMHhjMCwweDAwLDB4MDMsMHgwMiwweGIzLDB4MTAsMHgyMSwweDI0LDB4MDUsMHgwMCwweDAxLDB4MDIsMHhiMywweDEwLDB4MjEsCisweDI3LDB4ODMsMHg4ZiwweGY4LDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDg0LDB4NDgsMHgwMCwweDA0LAorMHgwMCwweGEwLDB4MzAsMHgyMSwweDAwLDB4ZTAsMHgyMCwweDIxLDB4MDIsMHg4MCwweDI4LDB4MjEsMHgwMiwweGMwLDB4MzgsMHgyMSwKKzB4MGMsMHgwMCwweDAwLDB4NzIsMHhhZiwweGE4LDB4MDAsMHgxMCwweDdiLDB4YmUsMHgwMiwweGJjLDB4N2IsMHhiNiwweDAyLDB4N2MsCisweDdiLDB4YjQsMHgwMiwweDNjLDB4N2IsMHhiMiwweDAxLDB4ZmMsMHg3YiwweGIwLDB4MDEsMHhiYywweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHg1OCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTIsMHg4MiwweDAwLDB4M2QsMHgzYywweDAyLDB4YjAsMHgwNSwKKzB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMiwweDgyLDB4MDAsMHgzMSwweDNjLDB4MDIsMHhiMCwweDA1LDB4MjQsMHgwMiwweDAwLDB4MDMsCisweDEyLDB4ODIsMHgwMCwweDI1LDB4M2MsMHgwMiwweGIwLDB4MDUsMHgyNCwweDAyLDB4MDAsMHgxMCwweDEyLDB4ODIsMHgwMCwweDE5LAorMHgzYywweDAyLDB4YjAsMHgwNSwweDI0LDB4MDIsMHgwMCwweDExLDB4MTIsMHg4MiwweDAwLDB4MGQsMHgzYywweDAyLDB4YjAsMHgwNSwKKzB4MjQsMHgwMiwweDAwLDB4MTIsMHgxNiwweDgyLDB4ZmYsMHhkMSwweDNjLDB4MDIsMHhiMCwweDA1LDB4M2MsMHgwMywweGIwLDB4MDUsCisweDM0LDB4NDIsMHgwNCwweDIwLDB4M2MsMHgwNCwweGIwLDB4MDUsMHgzNCwweDYzLDB4MDQsMHgyNCwweGFjLDB4NDYsMHgwMCwweDAwLAorMHgzNCwweDg0LDB4MDIsMHgyOCwweGFjLDB4NjUsMHgwMCwweDAwLDB4MDgsMHgwMCwweDA3LDB4ZTIsMHgyNCwweDAyLDB4MDAsMHgyMCwKKzB4MzQsMHg0MiwweDA0LDB4NDAsMHgzYywweDAzLDB4YjAsMHgwNSwweDNjLDB4MDQsMHhiMCwweDA1LDB4YWMsMHg0NiwweDAwLDB4MDAsCisweDM0LDB4NjMsMHgwNCwweDQ0LDB4MzQsMHg4NCwweDAyLDB4MjgsMHgyNCwweDAyLDB4MDAsMHg0MCwweDA4LDB4MDAsMHgwNywweGUyLAorMHhhYywweDY1LDB4MDAsMHgwMCwweDM0LDB4NDIsMHgwNCwweDI4LDB4M2MsMHgwMywweGIwLDB4MDUsMHgzYywweDA0LDB4YjAsMHgwNSwKKzB4YWMsMHg0NiwweDAwLDB4MDAsMHgzNCwweDYzLDB4MDQsMHgyYywweDM0LDB4ODQsMHgwMiwweDI4LDB4MjQsMHgwMiwweGZmLDB4ODAsCisweDA4LDB4MDAsMHgwNywweGUyLDB4YWMsMHg2NSwweDAwLDB4MDAsMHgzNCwweDQyLDB4MDQsMHgxOCwweDNjLDB4MDMsMHhiMCwweDA1LAorMHgzYywweDA0LDB4YjAsMHgwNSwweGFjLDB4NDYsMHgwMCwweDAwLDB4MzQsMHg2MywweDA0LDB4MWMsMHgzNCwweDg0LDB4MDIsMHgyOCwKKzB4MjQsMHgwMiwweDAwLDB4MDgsMHgwOCwweDAwLDB4MDcsMHhlMiwweGFjLDB4NjUsMHgwMCwweDAwLDB4MzQsMHg0MiwweDA0LDB4MTAsCisweDNjLDB4MDMsMHhiMCwweDA1LDB4M2MsMHgwNCwweGIwLDB4MDUsMHhhYywweDQ2LDB4MDAsMHgwMCwweDM0LDB4NjMsMHgwNCwweDE0LAorMHgzNCwweDg0LDB4MDIsMHgyOCwweDI0LDB4MDIsMHgwMCwweDA0LDB4MDgsMHgwMCwweDA3LDB4ZTIsMHhhYywweDY1LDB4MDAsMHgwMCwKKzB4MzQsMHg0MiwweDA0LDB4MDgsMHgzYywweDAzLDB4YjAsMHgwNSwweDNjLDB4MDQsMHhiMCwweDA1LDB4YWMsMHg0NiwweDAwLDB4MDAsCisweDM0LDB4NjMsMHgwNCwweDBjLDB4MzQsMHg4NCwweDAyLDB4MjgsMHgyNCwweDAyLDB4MDAsMHgwMiwweDA4LDB4MDAsMHgwNywweGUyLAorMHhhYywweDY1LDB4MDAsMHgwMCwweDI0LDB4MTcsMHgwMCwweDE0LDB4MDgsMHgwMCwweDA3LDB4YjQsMHgyNCwweDEzLDB4MDEsMHgwMiwKKzB4MzAsMHhhMiwweDAwLDB4MDcsMHgyNCwweDQ0LDB4MDAsMHgwYywweDAwLDB4OTAsMHgxOCwweDJiLDB4MTAsMHg2MCwweDAwLDB4MGMsCisweDI2LDB4MDIsMHgwMCwweDA0LDB4MjcsMHg4NSwweGJiLDB4MGMsMHgwMCwweDEwLDB4MTAsMHg0MCwweDAwLDB4NTAsMHgxMCwweDIxLAorMHgwMCwweDQ1LDB4MTAsMHgyMSwweDkwLDB4NTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDkwLDB4MTgsMHgyYiwKKzB4MTQsMHg2MCwweGZmLDB4ZmEsMHgwMCwweDEwLDB4MTAsMHg0MCwweDJlLDB4MDYsMHgwMCwweDBjLDB4MjYsMHgwMiwweDAwLDB4MDQsCisweDA4LDB4MDAsMHgwNywweDllLDB4MDAsMHg0NiwweDgwLDB4MGEsMHgyNywweDgyLDB4YjMsMHhmMCwweDAxLDB4ODIsMHgyMCwweDIxLAorMHg4YywweDg3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTAsMHhlMiwweDAwLDB4MTksMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTQsMHg0MCwweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4ODIsMHg5MCwweDEwLDB4MDAsMHhjMiwweDEwLDB4MjEsCisweDkwLDB4NDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDYwLDB4MDAsMHgxNCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg5MCwweGUzLDB4MDAsMHgxNiwweDI3LDB4ODIsMHg4ZiwweGY4LDB4MDAsMHhjMiwweDEwLDB4MjEsMHgzNCwweDYzLDB4MDAsMHgyMCwKKzB4OTAsMHg1MCwweDAwLDB4MDcsMHhhMCwweGUzLDB4MDAsMHgxNiwweDhjLDB4ODQsMHgwMCwweDAwLDB4MDAsMHgwYSwweDFlLDB4NDIsCisweDI0LDB4MDYsMHgwMCwweDAxLDB4OTAsMHg4MiwweDAwLDB4MTYsMHgzMCwweDcxLDB4MDAsMHgwMiwweDMwLDB4NzIsMHgwMCwweDNmLAorMHgzMCwweDQyLDB4MDAsMHhmYiwweDI0LDB4MTcsMHgwMCwweDE4LDB4MjQsMHgxMywweDAxLDB4MDMsMHgyNCwweDE1LDB4MDgsMHgxOCwKKzB4YWYsMHhhNiwweDAwLDB4MWMsMHgwOCwweDAwLDB4MDcsMHhiZSwweGEwLDB4ODIsMHgwMCwweDE2LDB4OGQsMHgwMiwweDAwLDB4MDQsCisweDAwLDB4MGEsMHgxYywweDQyLDB4MzAsMHg0MiwweDAwLDB4MTAsMHgxNCwweDQwLDB4MDAsMHgxNSwweDMwLDB4NzIsMHgwMCwweDNmLAorMHg4MSwweDIyLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweDAwLDB4MTEsMHgzMCwweDcyLDB4MDAsMHgzZSwKKzB4MjcsMHg4MywweDkwLDB4MDgsMHgwMCwweGMzLDB4MTgsMHgyMSwweDgwLDB4NjQsMHgwMCwweDAwLDB4MjcsMHg4MywweGI1LDB4NjgsCisweDAwLDB4MDQsMHgxMSwweDAwLDB4MDAsMHg0NCwweDEwLDB4MjMsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDQsMHgxMCwweDIzLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDMsMHgxMCwweDIxLDB4OTAsMHg0NCwweDAwLDB4MDUsMHg5MCwweDQzLDB4MDAsMHgwNCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDY0LDB4MTgsMHgyNCwweDMwLDB4NjMsMHgwMCwweDAxLDB4MDIsMHg0MywweDkwLDB4MjUsCisweDI3LDB4ODUsMHhiMywweGYwLDB4MDEsMHg4NSwweDI4LDB4MjEsMHg4YywweGE2LDB4MDAsMHgwMCwweDAxLDB4NzMsMHgxMCwweDIxLAorMHgyNywweDgzLDB4OTAsMHgwMCwweDkwLDB4YzQsMHgwMCwweDE2LDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4MzAsMHg4NCwweDAwLDB4ZGYsMHg5MCwweDUwLDB4MDAsMHgwMCwweGEwLDB4YzQsMHgwMCwweDE2LDB4ODAsMHhjNiwweDAwLDB4MTIsCisweDhjLDB4YTMsMHgwMCwweDAwLDB4MmQsMHhjNCwweDAwLDB4MDIsMHhhZiwweGE2LDB4MDAsMHgxYywweDkwLDB4NjIsMHgwMCwweDE2LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweGZiLDB4MTQsMHg4MCwweDAwLDB4MDYsMHhhMCwweDYyLDB4MDAsMHgxNiwKKzB4MjQsMHgwMiwweDAwLDB4MDYsMHgxMSwweGMyLDB4MDAsMHgwMywweDI0LDB4MDIsMHgwMCwweDA0LDB4MTUsMHhjMiwweGZmLDB4MGUsCisweDMyLDB4NTEsMHgwMCwweDAyLDB4MzIsMHg1MSwweDAwLDB4MDIsMHgyZSwweDAyLDB4MDAsMHgwYywweDE0LDB4NDAsMHgwMCwweDBmLAorMHgwMCwweDExLDB4MTgsMHgyYiwweDMyLDB4MDIsMHgwMCwweDBmLDB4MzQsMHg0MiwweDAwLDB4MTAsMHgwMCwweDAzLDB4MTksMHgwMCwKKzB4MDAsMHg0MywweDE4LDB4MjEsMHgzYywweDAyLDB4YjAsMHgwMywweDM0LDB4NDIsMHgwMCwweGI4LDB4YTAsMHg0MywweDAwLDB4MDAsCisweDAwLDB4MDAsMHgyMCwweDIxLDB4MDIsMHgwMCwweDI4LDB4MjEsMHgwYywweDAwLDB4MDIsMHgwNSwweGFmLDB4YWYsMHgwMCwweDI4LAorMHg4ZiwweGFmLDB4MDAsMHgyOCwweDA4LDB4MDAsMHgwNywweGJlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDgsMHhiOSwKKzB4MzIsMHgwMywweDAwLDB4ZmYsMHgzYywweDAzLDB4YjAsMHgwNSwweDM0LDB4NjMsMHgwMiwweDQyLDB4OTAsMHg2MiwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4MGYsMHgxNCwweDQwLDB4ZmUsMHhhYSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg5MSwweGUyLDB4MDAsMHgwOSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHg4MiwweDEwLDB4MjYsMHgwOCwweDAwLDB4MDcsMHg3NSwKKzB4MDAsMHgwMiwweDI4LDB4MGIsMHgwOCwweDAwLDB4MDcsMHg3YiwweDAwLDB4MDAsMHhiMCwweDIxLDB4MjQsMHgwMiwweDAwLDB4MTAsCisweDEwLDB4YzIsMHgwMCwweDA4LDB4MjQsMHgwMiwweDAwLDB4MTEsMHgxMCwweGMyLDB4ZmUsMHg3ZCwweDAwLDB4MDcsMHgxNywweDgzLAorMHgyNCwweDAyLDB4MDAsMHgxMiwweDE0LDB4YzIsMHhmZSwweDdiLDB4MDAsMHgwNywweDE3LDB4NDMsMHgwOCwweDAwLDB4MDcsMHg1NSwKKzB4MzAsMHg1ZSwweDAwLDB4MDEsMHgwOCwweDAwLDB4MDcsMHg1NSwweDAwLDB4MDcsMHhmNywweGMyLDB4MDAsMHgwNCwweDEwLDB4NDAsCisweDI3LDB4ODMsMHg4MCwweDFjLDB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDgwLDB4NDAsMHgyMSwweDk0LDB4NDQsMHgwMCwweDAwLAorMHgyZCwweDA3LDB4MDAsMHgwNCwweDI0LDB4YzIsMHgwMCwweDAzLDB4MDAsMHg0NywweDMwLDB4MGEsMHgwMCwweDg2LDB4MDAsMHgxOCwKKzB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwweDM0LDB4NjMsMHgwMCwweDIwLDB4MjQsMHg0MiwweDIzLDB4N2MsCisweGFjLDB4NjIsMHgwMCwweDAwLDB4MmQsMHgwNiwweDAwLDB4MTAsMHgwMCwweDAwLDB4MjAsMHgxMiwweDAwLDB4MDQsMHgyMiwweDQyLAorMHgyNCwweDg0LDB4MDAsMHgwMSwweDI0LDB4ODMsMHgwMCwweGMwLDB4MTAsMHhlMCwweDAwLDB4MGIsMHgyNCwweDgyLDB4MDAsMHg2MCwKKzB4MDAsMHg0MCwweDIwLDB4MjEsMHgwMCwweDY1LDB4MjAsMHgwYSwweDNjLDB4MDMsMHhiMCwweDAzLDB4MzQsMHg2MywweDAxLDB4MDAsCisweDkwLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHgwMSwweDAwLDB4NDQsMHgyMCwweDA0LAorMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4ODAsMHgxMCwweDIxLDB4MjQsMHg4NSwweDAwLDB4MjgsMHgyNCwweDgzLDB4MDAsMHgyNCwKKzB4MzEsMHgwMiwweDAwLDB4MDgsMHgxNCwweGMwLDB4ZmYsMHhmNCwweDI0LDB4ODQsMHgwMCwweDE0LDB4MDAsMHg2MCwweDIwLDB4MjEsCisweDA4LDB4MDAsMHgwOCwweGY2LDB4MDAsMHhhMiwweDIwLDB4MGIsMHgyNywweGJkLDB4ZmYsMHhlMCwweDNjLDB4MDMsMHhiMCwweDAzLAorMHgzYywweDAyLDB4ODAsMHgwMCwweGFmLDB4YjAsMHgwMCwweDEwLDB4MjQsMHg0MiwweDI0LDB4MTgsMHgwMCwweDgwLDB4ODAsMHgyMSwKKzB4MzQsMHg2MywweDAwLDB4MjAsMHgzYywweDA0LDB4YjAsMHgwMywweGFmLDB4YjIsMHgwMCwweDE4LDB4YWYsMHhiMSwweDAwLDB4MTQsCisweGFmLDB4YmYsMHgwMCwweDFjLDB4ODMsMHhiMSwweDAwLDB4MzMsMHg4MywweGE4LDB4MDAsMHgzNywweDM0LDB4ODQsMHgwMSwweDEwLAorMHhhYywweDYyLDB4MDAsMHgwMCwweDJlLDB4MDIsMHgwMCwweDEwLDB4MDAsMHhlMCwweDkwLDB4MjEsMHg4YywweDg3LDB4MDAsMHgwMCwKKzB4MTQsMHg0MCwweDAwLDB4MGMsMHgyZSwweDAyLDB4MDAsMHgwYywweDNjLDB4MDIsMHgwMCwweDBmLDB4MzQsMHg0MiwweGYwLDB4MDAsCisweDAwLDB4ZTIsMHgxMCwweDI0LDB4MTQsMHg0MCwweDAwLDB4MzcsMHgzMiwweDAyLDB4MDAsMHgwOCwweDMyLDB4MDIsMHgwMCwweDA3LAorMHgyNywweDgzLDB4ODAsMHhjYywweDAwLDB4NDMsMHgxMCwweDIxLDB4OTAsMHg1MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MmUsMHgwMiwweDAwLDB4MGMsMHgxNCwweDQwLDB4MDAsMHgwMywweDAyLDB4MDAsMHgyMCwweDIxLDB4MzIsMHgwMiwweDAwLDB4MGYsCisweDI0LDB4NDQsMHgwMCwweDBjLDB4MDAsMHg4NywweDEwLDB4MDYsMHgzMCwweDQyLDB4MDAsMHgwMSwweDE0LDB4NDAsMHgwMCwweDA3LAorMHgyYywweDgyLDB4MDAsMHgwYywweDAwLDB4MDQsMHgxMCwweDgwLDB4MjcsMHg4MywweGI0LDB4NDAsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4OGMsMHg0NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDJjLDB4ODIsMHgwMCwweDBjLDB4MTQsMHg0MCwweDAwLDB4MDUsCisweDAwLDB4MDUsMHgxMCwweDQwLDB4MDAsMHg0NiwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTEsMHgwMCwweDAwLDB4ODIsMHgxMCwweDIxLAorMHgyNCwweDQ0LDB4MDAsMHgwNCwweDE1LDB4MDAsMHgwMCwweDAyLDB4MjQsMHgwNiwweDAwLDB4MjAsMHgyNCwweDA2LDB4MDAsMHgwZSwKKzB4MGMsMHgwMCwweDA4LDB4ZGYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDAsMHgzMCwweDIxLDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDM0LDB4NDIsMHgwMSwweDAwLDB4OTAsMHg0MywweDAwLDB4MDAsMHgyZSwweDA0LDB4MDAsMHgwNCwweDI0LDB4MDIsMHgwMCwweDEwLAorMHgyNCwweDA1LDB4MDAsMHgwYSwweDAwLDB4NDQsMHgyOCwweDBhLDB4MzAsMHg2MywweDAwLDB4MDEsMHgxNCwweDYwLDB4MDAsMHgwMiwKKzB4MDAsMHgwNSwweDEwLDB4NDAsMHgwMCwweGEwLDB4MTAsMHgyMSwweDMwLDB4NDUsMHgwMCwweGZmLDB4MDAsMHhjNSwweDEwLDB4MjEsCisweDI0LDB4NDYsMHgwMCwweDQ2LDB4MDIsMHgyNiwweDE4LDB4MDQsMHhhNiwweDQzLDB4MDAsMHgwMCwweDhmLDB4YmYsMHgwMCwweDFjLAorMHg4ZiwweGIyLDB4MDAsMHgxOCwweDdiLDB4YjAsMHgwMCwweGJjLDB4MDAsMHhjMCwweDEwLDB4MjEsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4MjcsMHhiZCwweDAwLDB4MjAsMHgxMCwweDQwLDB4ZmYsMHhjZiwweDJlLDB4MDIsMHgwMCwweDBjLDB4MzIsMHgwMiwweDAwLDB4MDcsCisweDI3LDB4ODMsMHg4MCwweGM0LDB4MDAsMHg0MywweDEwLDB4MjEsMHg5MCwweDQ0LDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwOSwweDI0LAorMHgwMiwweDA0LDB4ODAsMHgyMywweDI3LDB4YmQsMHhmZiwweGI4LDB4MDAsMHgwNSwweDM4LDB4ODAsMHgyNywweDgyLDB4YjMsMHhmMCwKKzB4YWYsMHhiZSwweDAwLDB4NDAsMHhhZiwweGI2LDB4MDAsMHgzOCwweGFmLDB4YjMsMHgwMCwweDJjLDB4YWYsMHhiZiwweDAwLDB4NDQsCisweGFmLDB4YjcsMHgwMCwweDNjLDB4YWYsMHhiNSwweDAwLDB4MzQsMHhhZiwweGI0LDB4MDAsMHgzMCwweGFmLDB4YjIsMHgwMCwweDI4LAorMHhhZiwweGIxLDB4MDAsMHgyNCwweGFmLDB4YjAsMHgwMCwweDIwLDB4MDAsMHhlMiwweDM4LDB4MjEsMHg4YywweGU2LDB4MDAsMHgwMCwKKzB4YWYsMHhhNSwweDAwLDB4NGMsMHgzYywweDAyLDB4ODAsMHgwMCwweDNjLDB4MDUsMHhiMCwweDAzLDB4MzQsMHhhNSwweDAwLDB4MjAsCisweDI0LDB4NDIsMHgyNSwweDc0LDB4MjQsMHgwMywweDAwLDB4MDEsMHhhYywweGEyLDB4MDAsMHgwMCwweGEwLDB4YzMsMHgwMCwweDEyLAorMHg4YywweGU1LDB4MDAsMHgwMCwweDk0LDB4YzMsMHgwMCwweDA2LDB4OTAsMHhhMiwweDAwLDB4MTYsMHhhNCwweGMzLDB4MDAsMHgxNCwKKzB4MjcsMHg4MywweDhmLDB4ZjAsMHgzNCwweDQyLDB4MDAsMHgwOCwweGEwLDB4YTIsMHgwMCwweDE2LDB4OGMsMHhlOCwweDAwLDB4MDAsCisweGFmLDB4YTQsMHgwMCwweDQ4LDB4MjcsMHg4MiwweDhmLDB4ZjQsMHg5NSwweDExLDB4MDAsMHgxNCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDExLDB4OTgsMHhjMCwweDAyLDB4NzEsMHgyMCwweDIxLDB4MDAsMHgwNCwweDIwLDB4ODAsMHgwMCwweDgyLDB4MTAsMHgyMSwKKzB4OGMsMHg1MiwweDAwLDB4MTgsMHgwMCwweDgzLDB4MTgsMHgyMSwweDg0LDB4NzUsMHgwMCwweDA2LDB4OGUsMHg0NSwweDAwLDB4MDgsCisweDhlLDB4NDYsMHgwMCwweDA0LDB4OGUsMHg0NywweDAwLDB4MDQsMHgwMCwweDA1LDB4MWMsMHg4MiwweDAwLDB4MDYsMHgzMSwweDQyLAorMHgyNywweDgyLDB4OTAsMHgwMCwweDMwLDB4NjMsMHgwMCwweDAxLDB4MzAsMHhjNiwweDAwLDB4MDEsMHgwMCwweDgyLDB4MjAsMHgyMSwKKzB4YTUsMHgxNSwweDAwLDB4MWEsMHgwMCwweDA1LDB4MTQsMHg0MiwweGFmLDB4YTMsMHgwMCwweDE4LDB4YWYsMHhhNiwweDAwLDB4MWMsCisweDMwLDB4ZTcsMHgwMCwweDEwLDB4MzAsMHg1NiwweDAwLDB4MDEsMHg4MCwweDk3LDB4MDAsMHgwNiwweDE0LDB4ZTAsMHgwMCwweDQ3LAorMHgwMCwweDA1LDB4ZjcsMHhjMiwweDgwLDB4ODIsMHgwMCwweDA1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHg0NCwKKzB4MDIsMHg3MSwweDEwLDB4MjEsMHg5MywweDkwLDB4YmIsMHhkOSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MmUsMHgwMiwweDAwLDB4MGMsCisweDE0LDB4NDAsMHgwMCwweDA2LDB4MDIsMHgwMCwweDIwLDB4MjEsMHgwMCwweDE2LDB4MTAsMHg0MCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MTEsMHgwMCwweDAyLDB4MDIsMHgxMCwweDIxLDB4MjQsMHg0NCwweDAwLDB4MDQsMHgwMiwweDcxLDB4MTAsMHgyMSwKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgyNywweDgzLDB4OTAsMHgwMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHg4MCwweDgwLDB4MjEsCisweGEwLDB4NDQsMHgwMCwweDAzLDB4YTAsMHg0NCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MjAsMHgyMSwweDAyLDB4YzAsMHgyOCwweDIxLAorMHgwYywweDAwLDB4MDgsMHhkZiwweDAyLDB4YTAsMHgzMCwweDIxLDB4MDIsMHg3MSwweDE4LDB4MjEsMHgwMCwweDAzLDB4ODgsMHg4MCwKKzB4MDAsMHg0MCwweGEwLDB4MjEsMHgyNywweDgyLDB4OTAsMHgxMCwweDAyLDB4MjIsMHgxMCwweDIxLDB4OGMsMHg0NCwweDAwLDB4MDAsCisweDI2LDB4ZTMsMHgwMCwweDAyLDB4MDAsMHgwMywweDE3LDB4YzIsMHgwMCwweDYyLDB4MTgsMHgyMSwweDAwLDB4MDQsMHgyNSwweGMyLAorMHgwMCwweDAzLDB4MTgsMHg0MywweDMwLDB4ODQsMHgwMCwweDAxLDB4MDAsMHgwMywweDE4LDB4NDAsMHgwMywweGM0LDB4MjAsMHgyNCwKKzB4MTQsMHg4MCwweDAwLDB4MTUsMHgwMiwweDQzLDB4MzgsMHgyMSwweDNjLDB4MDgsMHhiMCwweDAzLDB4MzUsMHgwOCwweDAwLDB4MjgsCisweDhkLDB4MDMsMHgwMCwweDAwLDB4OGYsMHhhNiwweDAwLDB4NGMsMHg4ZiwweGE0LDB4MDAsMHg0OCwweDI3LDB4ODIsMHg4ZiwweGY4LAorMHgwMiwweDIyLDB4MTAsMHgyMSwweDI0LDB4NjMsMHgwMCwweDAxLDB4MDIsMHhhMCwweDI4LDB4MjEsMHhhNCwweDU0LDB4MDAsMHgwNCwKKzB4MDAsMHhjMCwweDM4LDB4MjEsMHgwYywweDAwLDB4MDcsMHgyYiwweGFkLDB4MDMsMHgwMCwweDAwLDB4N2IsMHhiZSwweDAyLDB4M2MsCisweDdiLDB4YjYsMHgwMSwweGZjLDB4N2IsMHhiNCwweDAxLDB4YmMsMHg3YiwweGIyLDB4MDEsMHg3YywweDdiLDB4YjAsMHgwMSwweDNjLAorMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDQ4LDB4OGYsMHhhMiwweDAwLDB4MWMsMHg4ZiwweGE2LDB4MDAsMHgxOCwKKzB4MDIsMHgwMCwweDIwLDB4MjEsMHgwMiwweGMwLDB4MjgsMHgyMSwweGFmLDB4YTIsMHgwMCwweDEwLDB4MGMsMHgwMCwweDA5LDB4MDYsCisweGFmLDB4YTAsMHgwMCwweDE0LDB4MDgsMHgwMCwweDA5LDB4YzIsMHgwMiwweDgyLDB4YTAsMHgyMSwweDAyLDB4NzEsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDI3LDB4ODMsMHg5MCwweDAwLDB4MDAsMHg0MywweDEwLDB4MjEsMHg5MCwweDUwLDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDA5LDB4YWUsMHhhMCwweDUwLDB4MDAsMHgwMywweDI3LDB4YmQsMHhmZiwweGI4LDB4YWYsMHhiMSwweDAwLDB4MjQsCisweDhmLDB4YjEsMHgwMCwweDVjLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwweDM0LDB4NjMsMHgwMCwweDIwLAorMHgyNCwweDQyLDB4MjcsMHg5OCwweGFmLDB4YmUsMHgwMCwweDQwLDB4YWYsMHhiNywweDAwLDB4M2MsMHhhZiwweGI2LDB4MDAsMHgzOCwKKzB4YWYsMHhiNSwweDAwLDB4MzQsMHhhZiwweGI0LDB4MDAsMHgzMCwweGFmLDB4YTUsMHgwMCwweDRjLDB4OGYsMHhiNSwweDAwLDB4NTgsCisweGFmLDB4YmYsMHgwMCwweDQ0LDB4YWYsMHhiMywweDAwLDB4MmMsMHhhZiwweGIyLDB4MDAsMHgyOCwweGFmLDB4YjAsMHgwMCwweDIwLAorMHgwMCwweGUwLDB4YjAsMHgyMSwweGFjLDB4NjIsMHgwMCwweDAwLDB4MDAsMHg4MCwweGYwLDB4MjEsMHgwMCwweDAwLDB4YjgsMHgyMSwKKzB4MTYsMHgyMCwweDAwLDB4MmIsMHgwMCwweDAwLDB4YTAsMHgyMSwweDI3LDB4ODUsMHhiMywweGYwLDB4MDAsMHgwNywweDEwLDB4ODAsCisweDAwLDB4NDUsMHgxMCwweDIxLDB4OGMsMHg1MywweDAwLDB4MDAsMHgwMCwweDE1LDB4MTgsMHg4MCwweDAwLDB4NjUsMHgxOCwweDIxLAorMHg5MiwweDYyLDB4MDAsMHgxNiwweDhjLDB4NzIsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4MDMsMHgxNCwweDQwLDB4MDAsMHgyZCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MiwweDQyLDB4MDAsMHgxNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4MDMsCisweDE0LDB4NDAsMHgwMCwweDI4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4YywweDgyLDB4MDAsMHgzNCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxNCwweDQwLDB4MDAsMHgxOCwweDAyLDB4MjAsMHgxMCwweDIxLDB4OGMsMHg4MiwweDAwLDB4MzgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTQsMHg0MCwweDAwLDB4MTQsMHgwMiwweDIwLDB4MTAsMHgyMSwweDhjLDB4ODIsMHgwMCwweDNjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDE0LDB4NDAsMHgwMCwweDBmLDB4M2MsMHgwMywweGIwLDB4MDksMHgzYywweDA1LDB4YjAsMHgwNSwweDM0LDB4NjMsMHgwMSwweDQ0LAorMHgzNCwweGE1LDB4MDIsMHg1MiwweDk0LDB4NjYsMHgwMCwweDAwLDB4OTAsMHhhMiwweDAwLDB4MDAsMHg4ZiwweGEzLDB4MDAsMHg0YywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDYyLDB4MTAsMHgwNiwweDMwLDB4NDIsMHgwMCwweDAxLDB4MTAsMHg0MCwweDAwLDB4MDQsCisweDMwLDB4YzYsMHhmZiwweGZmLDB4MmMsMHhjMiwweDAwLDB4NDEsMHgxMCwweDQwLDB4MDAsMHgwOSwweDI0LDB4MDUsMHgwMCwweDE0LAorMHgwMiwweDIwLDB4MTAsMHgyMSwweDdiLDB4YmUsMHgwMiwweDNjLDB4N2IsMHhiNiwweDAxLDB4ZmMsMHg3YiwweGI0LDB4MDEsMHhiYywKKzB4N2IsMHhiMiwweDAxLDB4N2MsMHg3YiwweGIwLDB4MDEsMHgzYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4NDgsCisweDBjLDB4MDAsMHgwNywweDA2LDB4MjQsMHgwNiwweDAxLDB4MDcsMHgyNCwweDAyLDB4MDAsMHgwMSwweDA4LDB4MDAsMHgwYSwweDI4LAorMHhhMywweGMyLDB4MDAsMHgxMSwweDEwLDB4YzAsMHgwMCwweDFjLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweGMyLDB4MDAsMHgxNywKKzB4MDAsMHhjMCwweDg4LDB4MjEsMHg5NiwweDU0LDB4MDAsMHgxYSwweDAyLDB4YTAsMHhiOCwweDIxLDB4MTIsMHgyMCwweGZmLDB4ZWQsCisweDAyLDB4MjAsMHgxMCwweDIxLDB4MjcsMHg4MywweGIzLDB4ZjAsMHgwMCwweDE3LDB4MTAsMHg4MCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHg4YywweDQ0LDB4MDAsMHgwMCwweDNjLDB4MDMsMHhiMCwweDAzLDB4MzQsMHg2MywweDAwLDB4MjgsMHg4MCwweDg2LDB4MDAsMHgxMiwKKzB4OGMsMHg2MiwweDAwLDB4MDAsMHgwMCwweDE0LDB4MmMsMHgwMCwweDAwLDB4MDUsMHgyYywweDAzLDB4MDAsMHg0NiwweDEwLDB4MjEsCisweDhmLDB4YTYsMHgwMCwweDRjLDB4MDIsMHhlMCwweDM4LDB4MjEsMHgwMywweGMwLDB4MjAsMHgyMSwweDBjLDB4MDAsMHgwNywweDJiLAorMHhhYywweDYyLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwYSwweDI4LDB4YWYsMHhkMSwweDAwLDB4NDAsMHg5NiwweDc0LDB4MDAsMHgxYSwKKzB4MDgsMHgwMCwweDBhLDB4M2IsMHgwMiwweGMwLDB4YjgsMHgyMSwweDNjLDB4MDIsMHhiMCwweDAzLDB4MzQsMHg0MiwweDAxLDB4MDgsCisweDhjLDB4NTAsMHgwMCwweDAwLDB4MDIsMHg2MCwweDIwLDB4MjEsMHgwYywweDAwLDB4MWYsMHgxMSwweDAyLDB4MDAsMHgyOCwweDIxLAorMHgzMCwweDQyLDB4MDAsMHhmZiwweDAyLDB4MDAsMHgyOCwweDIxLDB4MDIsMHg0MCwweDIwLDB4MjEsMHgwYywweDAwLDB4MWYsMHgxMSwKKzB4YWYsMHhhMiwweDAwLDB4MTgsMHg4ZiwweGE0LDB4MDAsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg4MCwweDAwLDB4ZWQsCisweDMwLDB4NTAsMHgwMCwweGZmLDB4MTIsMHgwMCwweDAwLDB4MTgsMHgyNCwweDExLDB4MDAsMHgwMSwweDk2LDB4NjMsMHgwMCwweDE0LAorMHg5NiwweDQ0LDB4MDAsMHgxNCwweDI3LDB4ODUsMHg4ZiwweGYwLDB4MDAsMHgwMywweDEwLDB4YzAsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQ1LDB4MTAsMHgyMSwweDAwLDB4MDQsMHgxOCwweGMwLDB4OGMsMHg0NiwweDAwLDB4MDgsCisweDAwLDB4NjQsMHgxOCwweDIxLDB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDY1LDB4MTgsMHgyMSwweDAwLDB4MDYsMHgxNywweDAyLAorMHgyNCwweDA0LDB4MDAsMHhmZiwweDhjLDB4NjMsMHgwMCwweDA4LDB4MTAsMHg0NCwweDAwLDB4ZDYsMHgwMCwweDAzLDB4MTcsMHgwMiwKKzB4MTAsMHg0NCwweDAwLDB4ZDUsMHgzYywweDAyLDB4ODAsMHgwMCwweDAwLDB4NjYsMHgxOCwweDJiLDB4MjQsMHgxMSwweDAwLDB4MDIsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4MDAsMHg0MywweDg4LDB4MGEsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEyLDB4MjIsMHgwMCwweDVhLAorMHgyNCwweDAyLDB4MDAsMHgwMiwweDE2LDB4MjIsMHhmZiwweGJkLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5NiwweDQ5LDB4MDAsMHgxNCwKKzB4MjcsMHg4MiwweDhmLDB4ZjQsMHgwMiwweGEwLDB4YjgsMHgyMSwweDAwLDB4MDksMHg1MCwweGMwLDB4MDEsMHg0OSwweDE4LDB4MjEsCisweDAwLDB4MDMsMHg0MCwweDgwLDB4MDEsMHgwMiwweDEwLDB4MjEsMHg4YywweDQzLDB4MDAsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4YywweDY1LDB4MDAsMHgwOCwweDhjLDB4NjIsMHgwMCwweDBjLDB4OGMsMHg2MiwweDAwLDB4MDQsMHgwMCwweDA1LDB4MjQsMHg0MiwKKzB4MDAsMHgwNSwweDFjLDB4ODIsMHgzMCwweDQyLDB4MDAsMHgxMCwweDMwLDB4NjYsMHgwMCwweDAxLDB4MTQsMHg0MCwweDAwLDB4NDEsCisweDMwLDB4ODcsMHgwMCwweDAxLDB4MjcsMHg4MiwweDkwLDB4MDgsMHgwMSwweDAyLDB4MTAsMHgyMSwweDgwLDB4NDQsMHgwMCwweDAwLAorMHgyNywweDgyLDB4YjUsMHg2OCwweDAwLDB4MDQsMHgxOSwweDAwLDB4MDAsMHg2NCwweDE4LDB4MjMsMHgwMCwweDAzLDB4MTgsMHg4MCwKKzB4MDAsMHg2NCwweDE4LDB4MjMsMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4NjIsMHgxMCwweDIxLDB4OTAsMHg0NSwweDAwLDB4MDUsCisweDI3LDB4ODQsMHhiNCwweDkwLDB4MDAsMHg2NCwweDE4LDB4MjEsMHg5MCwweDYzLDB4MDAsMHgwMCwweDEwLDB4YTAsMHgwMCwweDJiLAorMHgyYywweDY0LDB4MDAsMHgwYywweDE0LDB4ODAsMHgwMCwweDA0LDB4MDAsMHg2MCwweDEwLDB4MjEsMHgwMCwweDA2LDB4MTEsMHgwMCwKKzB4MDAsMHg2MiwweDEwLDB4MjEsMHgyNCwweDQyLDB4MDAsMHgyNCwweDNjLDB4MDEsMHhiMCwweDAzLDB4YTAsMHgyMiwweDAwLDB4YjksCisweDE0LDB4ODAsMHgwMCwweDA2LDB4MDAsMHg2MCwweDI4LDB4MjEsMHgwMCwweDA3LDB4MTAsMHg0MCwweDAwLDB4NDYsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MTEsMHgwMCwweDAwLDB4NjIsMHgxMCwweDIxLDB4MjQsMHg0NSwweDAwLDB4MDQsMHgwMSwweDQ5LDB4MTAsMHgyMSwKKzB4MjcsMHg4MywweDkwLDB4MDAsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHhhMCwweDE4LDB4MjEsCisweGEwLDB4NDUsMHgwMCwweDAzLDB4YTAsMHg0NSwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwOCwweDEyLDB4MDIsMHgwMCwweDBiLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDAwLDB4NjAsMHgyOCwweDIxLDB4MDIsMHg0MCwweDIwLDB4MjEsMHgwYywweDAwLDB4MWYsMHg4ZCwKKzB4YWYsMHhhMiwweDAwLDB4MTAsMHgzMCwweDU0LDB4ZmYsMHhmZiwweDkyLDB4NDIsMHgwMCwweDE2LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAyLDB4MDIsMHgxMCwweDI1LDB4MDgsMHgwMCwweDBhLDB4M2IsMHhhMiwweDQyLDB4MDAsMHgxNiwweDAwLDB4NjAsMHgyOCwweDIxLAorMHgwMiwweDQwLDB4MjAsMHgyMSwweDBjLDB4MDAsMHgxZiwweDNlLDB4YWYsMHhhMCwweDAwLDB4MTAsMHgwOCwweDAwLDB4MGEsMHhiZSwKKzB4MzAsMHg1NCwweGZmLDB4ZmYsMHgwOCwweDAwLDB4MGEsMHhhNiwweDAwLDB4NjAsMHgxMCwweDIxLDB4MTQsMHg4MCwweGZmLDB4ZmQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNiwweDExLDB4MDAsMHgwMCwweDYyLDB4MTAsMHgyMSwweDA4LDB4MDAsMHgwYSwweGE2LAorMHgyNCwweDQyLDB4MDAsMHgwNCwweDI3LDB4ODIsMHg5MCwweDAwLDB4MDEsMHgwMiwweDEwLDB4MjEsMHg5MCwweDQzLDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDBhLDB4YjYsMHhhMCwweDQzLDB4MDAsMHgwMywweDk2LDB4NjksMHgwMCwweDE0LDB4MDIsMHhjMCwweGI4LDB4MjEsCisweDI0LDB4MGIsMHgwMCwweDAxLDB4MDAsMHgwOSwweDEwLDB4YzAsMHgwMCwweDQ5LDB4MTgsMHgyMSwweDAwLDB4MDMsMHg0MCwweDgwLAorMHgwMCwweDQwLDB4NTAsMHgyMSwweDI3LDB4ODIsMHg4ZiwweGY0LDB4MDEsMHgwMiwweDEwLDB4MjEsMHg4YywweDQzLDB4MDAsMHgxOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg4YywweDY1LDB4MDAsMHgwOCwweDhjLDB4NjIsMHgwMCwweDBjLDB4OGMsMHg2MiwweDAwLDB4MDQsCisweDAwLDB4MDUsMHgyNCwweDQyLDB4MDAsMHgwNSwweDFjLDB4ODIsMHgzMCwweDQyLDB4MDAsMHgxMCwweDMwLDB4NjYsMHgwMCwweDAxLAorMHgxMCwweDQwLDB4MDAsMHgwZCwweDMwLDB4ODcsMHgwMCwweDAxLDB4MjcsMHg4MiwweDkwLDB4MDgsMHgwMSwweDAyLDB4MTAsMHgyMSwKKzB4ODAsMHg0MywweDAwLDB4MDAsMHgwMCwweDAwLDB4NTgsMHgyMSwweDAwLDB4MDMsMHgxMSwweDAwLDB4MDAsMHg0MywweDEwLDB4MjMsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0MywweDEwLDB4MjMsMHgwMCwweDAyLDB4MTAsMHg4MCwweDI3LDB4ODMsMHhiNSwweDYwLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweGEwLDB4NDAsMHgwMCwweDA0LDB4MTEsMHg2MCwweDAwLDB4NGYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDEsMHg0OSwweDEwLDB4MjEsMHgwMCwweDAyLDB4MjAsMHg4MCwweDI3LDB4ODUsMHg5MCwweDAwLDB4MDAsMHg4NSwweDEwLDB4MjEsCisweDgwLDB4NDMsMHgwMCwweDA1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDYwLDB4MDAsMHg0MiwweDAxLDB4NDksMHgxMCwweDIxLAorMHgyNywweDgyLDB4OTAsMHgwOCwweDAwLDB4ODIsMHgxMCwweDIxLDB4ODAsMHg0NCwweDAwLDB4MDAsMHgyNywweDgyLDB4YjUsMHg2OCwKKzB4MDAsMHgwNCwweDE5LDB4MDAsMHgwMCwweDY0LDB4MTgsMHgyMywweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHg2NCwweDE4LDB4MjMsCisweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHg2MiwweDEwLDB4MjEsMHg5MCwweDQ1LDB4MDAsMHgwNSwweDI3LDB4ODQsMHhiNCwweDkwLAorMHgwMCwweDY0LDB4MTgsMHgyMSwweDkwLDB4NjMsMHgwMCwweDAwLDB4MTAsMHhhMCwweDAwLDB4MmMsMHgyYywweDY0LDB4MDAsMHgwYywKKzB4MTQsMHg4MCwweDAwLDB4MDQsMHgwMCwweDYwLDB4MTAsMHgyMSwweDAwLDB4MDYsMHgxMSwweDAwLDB4MDAsMHg2MiwweDEwLDB4MjEsCisweDI0LDB4NDIsMHgwMCwweDI0LDB4M2MsMHgwMSwweGIwLDB4MDMsMHhhMCwweDIyLDB4MDAsMHhiOSwweDE0LDB4ODAsMHgwMCwweDA2LAorMHgwMCwweDYwLDB4MjgsMHgyMSwweDAwLDB4MDcsMHgxMCwweDQwLDB4MDAsMHg0NiwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTEsMHgwMCwKKzB4MDAsMHg2MiwweDEwLDB4MjEsMHgyNCwweDQ1LDB4MDAsMHgwNCwweDAxLDB4NDksMHgxMCwweDIxLDB4MjcsMHg4MywweDkwLDB4MDAsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweGEwLDB4MTgsMHgyMSwweGEwLDB4NDUsMHgwMCwweDAzLAorMHhhMCwweDQ1LDB4MDAsMHgwMCwweDhmLDB4YTQsMHgwMCwweDE4LDB4MjQsMHgwMiwweDAwLDB4MDgsMHgxMCwweDgyLDB4MDAsMHgwYywKKzB4MDAsMHg2MCwweDI4LDB4MjEsMHgyNCwweDAyLDB4MDAsMHgwMSwweDAyLDB4NjAsMHgyMCwweDIxLDB4MGMsMHgwMCwweDFmLDB4OGQsCisweGFmLDB4YTIsMHgwMCwweDEwLDB4OGYsMHhhMywweDAwLDB4MTgsMHgzMCwweDU0LDB4ZmYsMHhmZiwweDkyLDB4NjIsMHgwMCwweDE2LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NjIsMHgxMCwweDI1LDB4MDgsMHgwMCwweDBhLDB4M2IsMHhhMiwweDYyLDB4MDAsMHgxNiwKKzB4MDIsMHg2MCwweDIwLDB4MjEsMHgwYywweDAwLDB4MWYsMHgzZSwweGFmLDB4YTAsMHgwMCwweDEwLDB4MDgsMHgwMCwweDBiLDB4MmQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDBiLDB4MTUsMHgwMCwweDYwLDB4MTAsMHgyMSwweDE0LDB4ODAsMHhmZiwweGZkLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDYsMHgxMSwweDAwLDB4MDAsMHg2MiwweDEwLDB4MjEsMHgwOCwweDAwLDB4MGIsMHgxNSwKKzB4MjQsMHg0MiwweDAwLDB4MDQsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDUsMHgxMCwweDIxLDB4OTAsMHg0MywweDAwLDB4MDAsCisweDA4LDB4MDAsMHgwYiwweDI1LDB4YTAsMHg0MywweDAwLDB4MDMsMHgyNywweDg1LDB4OTAsMHgwMCwweDA4LDB4MDAsMHgwYiwweDQxLAorMHgwMSwweDQ5LDB4MTAsMHgyMSwweDNjLDB4MDIsMHg4MCwweDAwLDB4MDAsMHg2MiwweDE4LDB4MjYsMHgwOCwweDAwLDB4MGEsMHg3NiwKKzB4MDAsMHhjMiwweDMwLDB4MjYsMHgxMiwweDAwLDB4ZmYsMHgyZCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MDgsMHgwMCwweDBhLDB4N2IsCisweDI0LDB4MTEsMHgwMCwweDAyLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwweDI3LDB4YmQsMHhmZiwweGQwLAorMHgyNCwweDQyLDB4MmQsMHg0NCwweDM0LDB4NjMsMHgwMCwweDIwLDB4M2MsMHgwNSwweGIwLDB4MDUsMHhhZiwweGIzLDB4MDAsMHgyNCwKKzB4YWYsMHhiMiwweDAwLDB4MjAsMHhhZiwweGIxLDB4MDAsMHgxYywweGFmLDB4YmYsMHgwMCwweDI4LDB4YWYsMHhiMCwweDAwLDB4MTgsCisweGFjLDB4NjIsMHgwMCwweDAwLDB4MzQsMHhhNSwweDAyLDB4NDIsMHg5MCwweGEyLDB4MDAsMHgwMCwweDAwLDB4ODAsMHg5MCwweDIxLAorMHgyNCwweDExLDB4MDAsMHgxMCwweDMwLDB4NTMsMHgwMCwweGZmLDB4MjQsMHgwMiwweDAwLDB4MTAsMHgxMiwweDIyLDB4MDAsMHhjZiwKKzB4MDAsMHgwMCwweDE4LDB4MjEsMHgyNCwweDAyLDB4MDAsMHgxMSwweDEyLDB4MjIsMHgwMCwweGMxLDB4MjQsMHgwMiwweDAwLDB4MTIsCisweDEyLDB4MjIsMHgwMCwweGI0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDYwLDB4MDAsMHhhZCwweGFlLDB4NDMsMHgwMCwweDQwLAorMHgzYywweDAyLDB4YjAsMHgwNSwweDM0LDB4NDIsMHgwMiwweDJjLDB4OGMsMHg0NCwweDAwLDB4MDAsMHgzYywweDAzLDB4MDAsMHgwMiwKKzB4MzQsMHg2MywweDAwLDB4ZmYsMHgwMCwweDgzLDB4ODAsMHgyNCwweDAwLDB4MTAsMHgxNCwweDQzLDB4MTAsMHg0MCwweDAwLDB4MDUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGUsMHg0MiwweDAwLDB4MzQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDkyLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDkzLDB4ODMsMHg4YiwweDYxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDYyLDB4MDAsMHgwMiwKKzB4MTAsMHg0MCwweDAwLDB4MDQsMHgzMiwweDEwLDB4MDAsMHhmZiwweDAwLDB4MTAsMHgxMSwweGMzLDB4MTQsMHg0MCwweDAwLDB4ODYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTYsMHgwMCwweDAwLDB4MTUsMHgwMiwweDAwLDB4MTAsMHgyMSwweDI2LDB4MjIsMHgwMCwweDAxLAorMHgzMCwweDUxLDB4MDAsMHhmZiwweDJlLDB4MjMsMHgwMCwweDEzLDB4MTQsMHg2MCwweGZmLDB4ZGIsMHgyNCwweDAzLDB4MDAsMHgwMiwKKzB4MTIsMHg2MywweDAwLDB4NzMsMHgyNCwweDAyLDB4MDAsMHgwNSwweDJhLDB4NjIsMHgwMCwweDAzLDB4MTAsMHg0MCwweDAwLDB4NTgsCisweDI0LDB4MDIsMHgwMCwweDA0LDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMiwweDYyLDB4MDAsMHg0YiwweDAyLDB4NDAsMHgyMCwweDIxLAorMHgzYywweDAyLDB4YjAsMHgwNSwweDM0LDB4NDIsMHgwMiwweDJjLDB4OGMsMHg0MywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg3MCwweDAwLDB4ZmYsMHgxMiwweDAwLDB4MDAsMHgwNiwweDAyLDB4MDAsMHgxMCwweDIxLDB4OGYsMHhiZiwweDAwLDB4MjgsCisweDdiLDB4YjIsMHgwMSwweDNjLDB4N2IsMHhiMCwweDAwLDB4ZmMsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDMwLAorMHg5MiwweDQ2LDB4MDAsMHgwNCwweDhlLDB4NDMsMHgwMCwweDI0LDB4MjQsMHgwMiwweDAwLDB4MDcsMHgwMiwweDQwLDB4MjAsMHgyMSwKKzB4MDAsMHgwMCwweDI4LDB4MjEsMHgyNCwweDA3LDB4MDAsMHgwNiwweGFmLDB4YTIsMHgwMCwweDEwLDB4MGMsMHgwMCwweDA5LDB4ZTYsCisweGFmLDB4YTMsMHgwMCwweDE0LDB4YWUsMHg0MiwweDAwLDB4MjQsMHgzYywweDAyLDB4YjAsMHgwNSwweDhjLDB4NDIsMHgwMiwweDJjLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NTAsMHgwMCwweGZmLDB4MTYsMHgwMCwweGZmLDB4ZWMsMHgwMiwweDAwLDB4MTAsMHgyMSwKKzB4OTIsMHg0NiwweDAwLDB4MDUsMHg4ZSwweDQzLDB4MDAsMHgyOCwweDI0LDB4MDIsMHgwMCwweDA1LDB4MDIsMHg0MCwweDIwLDB4MjEsCisweDI0LDB4MDUsMHgwMCwweDAxLDB4MjQsMHgwNywweDAwLDB4MDQsMHhhZiwweGEyLDB4MDAsMHgxMCwweDBjLDB4MDAsMHgwOSwweGU2LAorMHhhZiwweGEzLDB4MDAsMHgxNCwweGFlLDB4NDIsMHgwMCwweDI4LDB4M2MsMHgwMiwweGIwLDB4MDUsMHg4YywweDQyLDB4MDIsMHgyYywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDUwLDB4MDAsMHhmZiwweDE2LDB4MDAsMHhmZiwweGRjLDB4MDIsMHgwMCwweDEwLDB4MjEsCisweDkyLDB4NDYsMHgwMCwweDA2LDB4OGUsMHg0MywweDAwLDB4MmMsMHgyNCwweDAyLDB4MDAsMHgwMywweDAyLDB4NDAsMHgyMCwweDIxLAorMHgyNCwweDA1LDB4MDAsMHgwMiwweDAwLDB4MDAsMHgzOCwweDIxLDB4YWYsMHhhMiwweDAwLDB4MTAsMHgwYywweDAwLDB4MDksMHhlNiwKKzB4YWYsMHhhMywweDAwLDB4MTQsMHhhZSwweDQyLDB4MDAsMHgyYywweDNjLDB4MDIsMHhiMCwweDA1LDB4OGMsMHg0MiwweDAyLDB4MmMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg1MCwweDAwLDB4ZmYsMHgxNiwweDAwLDB4ZmYsMHhjYywweDAyLDB4MDAsMHgxMCwweDIxLAorMHg5MiwweDQ2LDB4MDAsMHgwNywweDhlLDB4NDMsMHgwMCwweDMwLDB4MjQsMHgwMiwweDAwLDB4MDIsMHgwMiwweDQwLDB4MjAsMHgyMSwKKzB4MjQsMHgwNSwweDAwLDB4MDMsMHgyNCwweDA3LDB4MDAsMHgwMSwweGFmLDB4YTIsMHgwMCwweDEwLDB4MGMsMHgwMCwweDA5LDB4ZTYsCisweGFmLDB4YTMsMHgwMCwweDE0LDB4YWUsMHg0MiwweDAwLDB4MzAsMHgzYywweDAyLDB4YjAsMHgwNSwweDhjLDB4NDIsMHgwMiwweDJjLAorMHgwOCwweDAwLDB4MGIsMHg5NywweDMwLDB4NDIsMHgwMCwweGZmLDB4OTIsMHg0NiwweDAwLDB4MDQsMHg4ZSwweDQzLDB4MDAsMHgyNCwKKzB4MjQsMHgwMiwweDAwLDB4MDcsMHgwMCwweDAwLDB4MjgsMHgyMSwweDI0LDB4MDcsMHgwMCwweDA2LDB4YWYsMHhhMiwweDAwLDB4MTAsCisweDBjLDB4MDAsMHgwOSwweGU2LDB4YWYsMHhhMywweDAwLDB4MTQsMHgwOCwweDAwLDB4MGIsMHg5MCwweGFlLDB4NDIsMHgwMCwweDI0LAorMHgxMiwweDYyLDB4MDAsMHgwZCwweDI0LDB4MDIsMHgwMCwweDAzLDB4MjQsMHgwMiwweDAwLDB4MDgsMHgxNiwweDYyLDB4ZmYsMHhhOCwKKzB4MDIsMHg0MCwweDIwLDB4MjEsMHg5MiwweDQ2LDB4MDAsMHgwNywweDhlLDB4NDIsMHgwMCwweDMwLDB4MjQsMHgwNSwweDAwLDB4MDMsCisweDI0LDB4MDcsMHgwMCwweDAxLDB4YWYsMHhhMywweDAwLDB4MTAsMHgwYywweDAwLDB4MDksMHhlNiwweGFmLDB4YTIsMHgwMCwweDE0LAorMHgwOCwweDAwLDB4MGIsMHg5MCwweGFlLDB4NDIsMHgwMCwweDMwLDB4OTIsMHg0NiwweDAwLDB4MDYsMHg4ZSwweDQzLDB4MDAsMHgyYywKKzB4MDIsMHg0MCwweDIwLDB4MjEsMHgyNCwweDA1LDB4MDAsMHgwMiwweDAwLDB4MDAsMHgzOCwweDIxLDB4YWYsMHhhMiwweDAwLDB4MTAsCisweDBjLDB4MDAsMHgwOSwweGU2LDB4YWYsMHhhMywweDAwLDB4MTQsMHgwOCwweDAwLDB4MGIsMHg5MCwweGFlLDB4NDIsMHgwMCwweDJjLAorMHg5MiwweDQ2LDB4MDAsMHgwNSwweDhlLDB4NDMsMHgwMCwweDI4LDB4MDIsMHg0MCwweDIwLDB4MjEsMHgyNCwweDA1LDB4MDAsMHgwMSwKKzB4MjQsMHgwNywweDAwLDB4MDQsMHhhZiwweGEyLDB4MDAsMHgxMCwweDBjLDB4MDAsMHgwOSwweGU2LDB4YWYsMHhhMywweDAwLDB4MTQsCisweDA4LDB4MDAsMHgwYiwweDkwLDB4YWUsMHg0MiwweDAwLDB4MjgsMHgwYywweDAwLDB4MDEsMHg1OSwweDI0LDB4MDQsMHgwMCwweDAxLAorMHgwOCwweDAwLDB4MGIsMHg4MSwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHg4NCwweGI0LDB4MzAsMHhhZSwweDQwLDB4MDAsMHgzNCwKKzB4OTQsMHg4NSwweDAwLDB4MTQsMHgwYywweDAwLDB4MWIsMHg4NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTMsMHg4MywweDhiLDB4NjEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg2MiwweDAwLDB4MDIsMHgxMCwweDQwLDB4ZmYsMHg2OSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwYywweDAwLDB4MDEsMHg1OSwweDAwLDB4MDAsMHgyMCwweDIxLDB4MDgsMHgwMCwweDBiLDB4NzksMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDIsMHg0MCwweDIwLDB4MjEsMHgwYywweDAwLDB4MDksMHg1ZCwweDAyLDB4MjAsMHgyOCwweDIxLDB4MDgsMHgwMCwweDBiLDB4NmQsCisweDNjLDB4MDIsMHhiMCwweDA1LDB4OGUsMHg0MiwweDAwLDB4M2MsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHhmZiwweDRhLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4ODIsMHhiNCwweDM4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MCwweDQyLDB4MDAsMHgwYSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MTgsMHgyYiwweDA4LDB4MDAsMHgwYiwweDZhLDB4YWUsMHg0MywweDAwLDB4M2MsCisweDhlLDB4NDIsMHgwMCwweDM4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4ZmYsMHgzZCwweDI0LDB4MDIsMHgwMCwweDEyLAorMHg4ZiwweDgyLDB4YjQsMHgzNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTAsMHg0MiwweDAwLDB4MGEsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMiwweDE4LDB4MmIsMHgwOCwweDAwLDB4MGIsMHg2YSwweGFlLDB4NDMsMHgwMCwweDM4LDB4OGUsMHg0MiwweDAwLDB4MzQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweGZmLDB4MzAsMHgyNCwweDAyLDB4MDAsMHgxMSwweDhmLDB4ODIsMHhiNCwweDMwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDkwLDB4NDIsMHgwMCwweDBhLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MTgsMHgyYiwKKzB4MDgsMHgwMCwweDBiLDB4NmEsMHhhZSwweDQzLDB4MDAsMHgzNCwweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsCisweDI3LDB4YmQsMHhmZiwweGUwLDB4MzQsMHg2MywweDAwLDB4MjAsMHgyNCwweDQyLDB4MzAsMHhmOCwweDNjLDB4MDgsMHhiMCwweDAzLAorMHhhZiwweGIxLDB4MDAsMHgxNCwweGFjLDB4NjIsMHgwMCwweDAwLDB4MzUsMHgwOCwweDAxLDB4MDAsMHhhZiwweGJmLDB4MDAsMHgxOCwKKzB4YWYsMHhiMCwweDAwLDB4MTAsMHg5MSwweDAzLDB4MDAsMHgwMCwweDAwLDB4YTAsMHg0OCwweDIxLDB4MjQsMHgxMSwweDAwLDB4MGEsCisweDJjLDB4YTUsMHgwMCwweDA0LDB4MjQsMHgwMiwweDAwLDB4MTAsMHgwMCwweDQ1LDB4ODgsMHgwYSwweDMwLDB4NjMsMHgwMCwweDAxLAorMHgwMCwweGMwLDB4MjgsMHgyMSwweDE0LDB4NjAsMHgwMCwweDAyLDB4MDAsMHgxMSwweDQwLDB4NDAsMHgwMiwweDIwLDB4NDAsMHgyMSwKKzB4ODQsMHg4MywweDAwLDB4MGMsMHgzMSwweDExLDB4MDAsMHhmZiwweDAxLDB4MjAsMHgyMCwweDIxLDB4MDAsMHgwMywweDEwLDB4YzAsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgyNywweDgzLDB4OGYsMHhmOCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHg4NCwweDQzLDB4MDAsMHgwNCwweDI0LDB4MDYsMHgwMCwweDBlLDB4MTAsMHhlMCwweDAwLDB4MDYsMHgwMiwweDIzLDB4ODAsMHgyMSwKKzB4MDIsMHgwMCwweDEwLDB4MjEsMHg4ZiwweGJmLDB4MDAsMHgxOCwweDdiLDB4YjAsMHgwMCwweGJjLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDI3LDB4YmQsMHgwMCwweDIwLDB4MGMsMHgwMCwweDA4LDB4ZGYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MTEsMHgxOCwweDIxLAorMHgwOCwweDAwLDB4MGMsMHg2MCwweDAwLDB4NjIsMHg4MCwweDIxLDB4MjcsMHhiZCwweGZmLDB4ZDAsMHhhZiwweGJmLDB4MDAsMHgyOCwKKzB4YWYsMHhiNCwweDAwLDB4MjAsMHhhZiwweGIzLDB4MDAsMHgxYywweGFmLDB4YjIsMHgwMCwweDE4LDB4YWYsMHhiNSwweDAwLDB4MjQsCisweGFmLDB4YjEsMHgwMCwweDE0LDB4YWYsMHhiMCwweDAwLDB4MTAsMHg4NCwweDgyLDB4MDAsMHgwYywweDNjLDB4MDYsMHhiMCwweDAzLAorMHgzNCwweGM2LDB4MDAsMHgyMCwweDAwLDB4MDIsMHgxOCwweGMwLDB4MDAsMHg2MiwweDE4LDB4MjEsMHgwMCwweDAzLDB4MTgsMHg4MCwKKzB4MjcsMHg4MiwweDhmLDB4ZjQsMHgwMCwweDYyLDB4MTAsMHgyMSwweDhjLDB4NTUsMHgwMCwweDE4LDB4M2MsMHgwMiwweDgwLDB4MDAsCisweDI0LDB4NDIsMHgzMSwweGE4LDB4YWMsMHhjMiwweDAwLDB4MDAsMHg4ZSwweGIwLDB4MDAsMHgwOCwweDI3LDB4ODIsMHg4ZiwweGY4LAorMHgwMCwweDYyLDB4MTgsMHgyMSwweDkwLDB4NzEsMHgwMCwweDA3LDB4MDAsMHgxMCwweDg2LDB4NDMsMHgzMiwweDEwLDB4MDAsMHgwMSwKKzB4MDAsMHhhMCwweDM4LDB4MjEsMHgwMiwweDAwLDB4MzAsMHgyMSwweDAwLDB4YTAsMHg5OCwweDIxLDB4MDIsMHgyMCwweDI4LDB4MjEsCisweDBjLDB4MDAsMHgwYywweDNlLDB4MDAsMHg4MCwweDkwLDB4MjEsMHgwMiwweDIwLDB4MjAsMHgyMSwweDAyLDB4MDAsMHgyOCwweDIxLAorMHgyNCwweDA2LDB4MDAsMHgxNCwweDBjLDB4MDAsMHgwOCwweGRmLDB4MDAsMHg0MCwweGEwLDB4MjEsMHg4NiwweDQzLDB4MDAsMHgwYywKKzB4M2MsMHgwOSwweGIwLDB4MDksMHgzYywweDA4LDB4YjAsMHgwOSwweDAwLDB4MDMsMHgxMCwweGMwLDB4MDAsMHg0MywweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MjcsMHg4MywweDkwLDB4MDAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDgwLDB4NDMsMHgwMCwweDA2LAorMHgzYywweDA3LDB4YjAsMHgwOSwweDNjLDB4MDUsMHhiMCwweDA5LDB4MjgsMHg2MiwweDAwLDB4MDAsMHgyNCwweDY0LDB4MDAsMHgwMywKKzB4MDAsMHg4MiwweDE4LDB4MGIsMHgwMCwweDAzLDB4MTgsMHg4MywweDNjLDB4MDIsMHhiMCwweDA5LDB4MDAsMHgwMywweDE4LDB4ODAsCisweDM0LDB4NDIsMHgwMSwweDAyLDB4MzUsMHgyOSwweDAxLDB4MTAsMHgzNSwweDA4LDB4MDEsMHgxNCwweDM0LDB4ZTcsMHgwMSwweDIwLAorMHgzNCwweGE1LDB4MDEsMHgyNCwweGE0LDB4NTQsMHgwMCwweDAwLDB4MTIsMHg2MCwweDAwLDB4MTEsMHgwMiwweGEzLDB4YTgsMHgyMSwKKzB4OGUsMHhhMiwweDAwLDB4MGMsMHg4ZSwweGEzLDB4MDAsMHgwOCwweDAwLDB4MDIsMHgxNCwweDAwLDB4MDAsMHgwMywweDFjLDB4MDIsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4YWQsMHgyMiwweDAwLDB4MDAsMHg4ZSwweGEzLDB4MDAsMHgwYywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAzLDB4MWMsMHgwMiwweGE1LDB4MDMsMHgwMCwweDAwLDB4OGYsMHhiZiwweDAwLDB4MjgsMHg3YiwweGI0LDB4MDEsMHgzYywKKzB4N2IsMHhiMiwweDAwLDB4ZmMsMHg3YiwweGIwLDB4MDAsMHhiYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MzAsCisweDhlLDB4YTIsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHhhZCwweDIyLDB4MDAsMHgwMCwweDhlLDB4YTQsMHgwMCwweDA4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweGE1LDB4MDQsMHgwMCwweDAwLDB4N2EsMHhhMiwweDAwLDB4N2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMywweDFjLDB4MDAsMHgwMCwweDAyLDB4MTQsMHgwMiwweDAwLDB4NjIsMHgxOCwweDIxLDB4YWMsMHhlMywweDAwLDB4MDAsCisweDhlLDB4YTIsMHgwMCwweDBjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MTQsMHgwMiwweDA4LDB4MDAsMHgwYywweGIyLAorMHhhNCwweGEyLDB4MDAsMHgwMCwweDI3LDB4YmQsMHhmZiwweGUwLDB4YWYsMHhiMiwweDAwLDB4MTgsMHhhZiwweGIwLDB4MDAsMHgxMCwKKzB4YWYsMHhiZiwweDAwLDB4MWMsMHhhZiwweGIxLDB4MDAsMHgxNCwweDg0LDB4ODIsMHgwMCwweDBjLDB4MDAsMHg4MCwweDkwLDB4MjEsCisweDNjLDB4MDUsMHhiMCwweDAzLDB4MDAsMHgwMiwweDIwLDB4YzAsMHgwMCwweDgyLDB4MjAsMHgyMSwweDAwLDB4MDQsMHgyMCwweDgwLAorMHgyNywweDgyLDB4OGYsMHhmNCwweDAwLDB4ODIsMHgxMCwweDIxLDB4OGMsMHg1MSwweDAwLDB4MTgsMHgzYywweDAyLDB4ODAsMHgwMCwKKzB4MzQsMHhhNSwweDAwLDB4MjAsMHgyNCwweDQyLDB4MzMsMHgyNCwweDI3LDB4ODMsMHg4ZiwweGY4LDB4YWMsMHhhMiwweDAwLDB4MDAsCisweDAwLDB4ODMsMHgyMCwweDIxLDB4M2MsMHgwMiwweGIwLDB4MDMsMHg5MCwweDg2LDB4MDAsMHgwNywweDM0LDB4NDIsMHgwMSwweDAwLAorMHg4ZSwweDIzLDB4MDAsMHgwOCwweDkwLDB4NDQsMHgwMCwweDAwLDB4MmMsMHhjNSwweDAwLDB4MDQsMHgyNCwweDAyLDB4MDAsMHgxMCwKKzB4MjQsMHgxMCwweDAwLDB4MGEsMHgwMCwweDQ1LDB4ODAsMHgwYSwweDAwLDB4MDMsMHgxZSwweDQzLDB4MzAsMHg4NCwweDAwLDB4MDEsCisweDMwLDB4NjUsMHgwMCwweDAxLDB4MTQsMHg4MCwweDAwLDB4MDIsMHgwMCwweDEwLDB4MTAsMHg0MCwweDAyLDB4MDAsMHgxMCwweDIxLAorMHgwMCwweGMwLDB4MjAsMHgyMSwweDI0LDB4MDYsMHgwMCwweDIwLDB4MGMsMHgwMCwweDA4LDB4ZGYsMHgzMCwweDUwLDB4MDAsMHhmZiwKKzB4ODYsMHg0NCwweDAwLDB4MGMsMHgyNywweDg1LDB4OTAsMHgwMCwweDNjLDB4MDYsMHhiMCwweDA5LDB4MDAsMHgwNCwweDE4LDB4YzAsCisweDAwLDB4NjQsMHgxOCwweDIxLDB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDY1LDB4MTgsMHgyMSwweDgwLDB4NjQsMHgwMCwweDA2LAorMHgwMCwweDUwLDB4MTAsMHgyMSwweDM0LDB4YzYsMHgwMSwweDAyLDB4MjQsMHg4NSwweDAwLDB4MDMsMHgyOCwweDgzLDB4MDAsMHgwMCwKKzB4MDAsMHhhMywweDIwLDB4MGIsMHgwMCwweDA0LDB4MjAsMHg4MywweDAwLDB4MDQsMHgyMCwweDgwLDB4YTQsMHhjMiwweDAwLDB4MDAsCisweDAyLDB4MjQsMHgyMCwweDIxLDB4OGMsMHg4MywweDAwLDB4MDQsMHgzYywweDAyLDB4YjAsMHgwOSwweDM0LDB4NDIsMHgwMSwweDEwLAorMHhhYywweDQzLDB4MDAsMHgwMCwweDhjLDB4ODYsMHgwMCwweDA4LDB4M2MsMHgwMiwweGIwLDB4MDksMHgzNCwweDQyLDB4MDEsMHgxNCwKKzB4YTQsMHg0NiwweDAwLDB4MDAsMHg4YywweDg1LDB4MDAsMHgwYywweDhjLDB4ODIsMHgwMCwweDA4LDB4M2MsMHgwNiwweGIwLDB4MDksCisweDAwLDB4MDUsMHgyYywweDAwLDB4MDAsMHgwMiwweDE0LDB4MDIsMHgwMCwweGEyLDB4MjgsMHgyMSwweDM0LDB4YzYsMHgwMSwweDIwLAorMHhhYywweGM1LDB4MDAsMHgwMCwweDhjLDB4ODMsMHgwMCwweDBjLDB4M2MsMHgwNSwweGIwLDB4MDksMHgzNCwweGE1LDB4MDEsMHgyNCwKKzB4MDAsMHgwMywweDFjLDB4MDIsMHhhNCwweGEzLDB4MDAsMHgwMCwweDkyLDB4NDIsMHgwMCwweDBhLDB4M2MsMHgwMywweGIwLDB4MDksCisweDM0LDB4NjMsMHgwMSwweDMwLDB4MDAsMHgwMiwweDEzLDB4MDAsMHgyNCwweDQyLDB4MDAsMHgwNCwweDMwLDB4NDIsMHhmZiwweGZmLAorMHhhNCwweDYyLDB4MDAsMHgwMCwweDg2LDB4NDQsMHgwMCwweDBjLDB4MjcsMHg4MywweDkwLDB4MDgsMHg4ZiwweGJmLDB4MDAsMHgxYywKKzB4MDAsMHgwNCwweDEwLDB4YzAsMHgwMCwweDQ0LDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0MywweDEwLDB4MjEsCisweDk0LDB4NDQsMHgwMCwweDAyLDB4OGYsMHhiMiwweDAwLDB4MTgsMHg3YiwweGIwLDB4MDAsMHhiYywweDNjLDB4MDUsMHhiMCwweDA5LAorMHgzNCwweGE1LDB4MDEsMHgzMiwweGE0LDB4YTQsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgyMCwKKzB4MjcsMHhiZCwweGZmLDB4ZTAsMHgzYywweDAyLDB4YjAsMHgwMywweDNjLDB4MDMsMHg4MCwweDAwLDB4YWYsMHhiMCwweDAwLDB4MTAsCisweDM0LDB4NDIsMHgwMCwweDIwLDB4MDAsMHhhMCwweDgwLDB4MjEsMHgyNCwweDYzLDB4MzQsMHhiMCwweDAwLDB4MDUsMHgyYywweDQzLAorMHhhZiwweGIxLDB4MDAsMHgxNCwweGFmLDB4YmYsMHgwMCwweDE4LDB4YWMsMHg0MywweDAwLDB4MDAsMHgxMCwweGEwLDB4MDAsMHgwNSwKKzB4MDAsMHg4MCwweDg4LDB4MjEsMHg4YywweDgyLDB4MDAsMHgzNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweDAwLDB4YjYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzIsMHgxMCwweDAwLDB4ZmYsMHgxMiwweDAwLDB4MDAsMHg0YywweDAwLDB4MDAsMHgxMCwweDIxLAorMHgyNCwweDAyLDB4MDAsMHgwOCwweDEyLDB4MDIsMHgwMCwweGEzLDB4MmEsMHgwMiwweDAwLDB4MDksMHgxMCwweDQwLDB4MDAsMHg4OSwKKzB4MjQsMHgwMiwweDAwLDB4NDAsMHgyNCwweDA0LDB4MDAsMHgwMiwweDEyLDB4MDQsMHgwMCwweDc5LDB4MmEsMHgwMiwweDAwLDB4MDMsCisweDEwLDB4NDAsMHgwMCwweDY5LDB4MjQsMHgwMiwweDAwLDB4MDQsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEyLDB4MDIsMHgwMCwweDVhLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDIsMHhiMCwweDA1LDB4MzQsMHg0MiwweDAwLDB4MDgsMHgzYywweDAzLDB4ODAsMHgwMCwKKzB4YTIsMHgyMCwweDAwLDB4NGUsMHhhYywweDQzLDB4MDAsMHgwMCwweDgyLDB4MjQsMHgwMCwweDExLDB4OTIsMHgyNywweDAwLDB4MTEsCisweDEwLDB4ODAsMHgwMCwweDRlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MiwweDI2LDB4MDAsMHgwYSwweDI0LDB4MDIsMHgwMCwweDEyLAorMHgxMCwweDQ2LDB4MDAsMHgwOSwweDMwLDB4YzIsMHgwMCwweGZmLDB4MjcsMHg4MywweGIzLDB4ZjAsMHgwMCwweDAyLDB4MTAsMHg4MCwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHg4YywweDQ0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTQsMHg4MywweDAwLDB4MTQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4YTYsMHgyMywweDAwLDB4MGMsMHgzYywweDAyLDB4YjAsMHgwOSwweDM0LDB4NDIsMHgwMCwweDQwLAorMHg5MCwweDQzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg2MywweDAwLDB4MDMsMHhhMiwweDIzLDB4MDAsMHgxMCwKKzB4MTQsMHg2MCwweDAwLDB4MmIsMHgzMCwweDY1LDB4MDAsMHgwMSwweDMwLDB4YzIsMHgwMCwweGZmLDB4MjcsMHg4MywweGIzLDB4ZjAsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0MywweDEwLDB4MjEsMHg4YywweDQ0LDB4MDAsMHgwMCwweDgyLDB4MjMsMHgwMCwweDEyLAorMHg5MCwweDgyLDB4MDAsMHgxNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDExLDB4NDIsMHgzMCwweDQyLDB4MDAsMHgwMSwKKzB4MDAsMHg2MiwweDE4LDB4MjEsMHgwMCwweDAzLDB4MjYsMHgwMCwweDE0LDB4ODAsMHgwMCwweDE4LDB4YTIsMHgyMywweDAwLDB4MTIsCisweDAwLDB4MDcsMHgxNiwweDAwLDB4MTQsMHg0MCwweDAwLDB4MTEsMHgyNCwweDAyLDB4MDAsMHgwMSwweDk2LDB4MjMsMHgwMCwweDBjLAorMHgyNywweDg0LDB4OTAsMHgwMCwweDAwLDB4MDMsMHgxMCwweGMwLDB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwKKzB4MDAsMHg0NCwweDEwLDB4MjEsMHg4MCwweDQ1LDB4MDAsMHgwNiwweDAwLDB4MDMsMHgxYSwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDAsCisweDAwLDB4NjUsMHgxOCwweDIxLDB4MDAsMHg2MiwweDE4LDB4MjEsMHg5MCwweDY0LDB4MDAsMHgwMCwweDkwLDB4NjIsMHgwMCwweDA0LAorMHhhMiwweDIwLDB4MDAsMHgxNSwweGEzLDB4ODAsMHg4YiwweGM0LDB4MjQsMHgwMiwweDAwLDB4MDEsMHg4ZiwweGJmLDB4MDAsMHgxOCwKKzB4N2IsMHhiMCwweDAwLDB4YmMsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDIwLDB4MGMsMHgwMCwweDBjLDB4YzksCisweDAyLDB4MjAsMHgyMCwweDIxLDB4OTIsMHgyNywweDAwLDB4MTEsMHgwOCwweDAwLDB4MGQsMHg3OSwweDAwLDB4MDcsMHgxNiwweDAwLAorMHgwYywweDAwLDB4MGMsMHg2YSwweDAyLDB4MjAsMHgyMCwweDIxLDB4ODYsMHgyMywweDAwLDB4MGMsMHgyNywweDg0LDB4OGYsMHhmOCwKKzB4MDAsMHgwMywweDEwLDB4YzAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0NCwweDIwLDB4MjEsCisweDkwLDB4ODUsMHgwMCwweDA3LDB4MjcsMHg4MywweDkwLDB4MDAsMHgwMCwweDQzLDB4MTAsMHgyMSwweGEyLDB4MjUsMHgwMCwweDEzLAorMHg5MCwweDgzLDB4MDAsMHgwNywweDA4LDB4MDAsMHgwZCwweDkxLDB4YTAsMHg0MywweDAwLDB4MDIsMHg5MiwweDI2LDB4MDAsMHgwYSwKKzB4MDgsMHgwMCwweDBkLDB4NWEsMHgzMCwweGMyLDB4MDAsMHhmZiwweDhlLDB4MjIsMHgwMCwweDI0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4NTAsMHgwMCwweDA3LDB4YTIsMHgyMCwweDAwLDB4MDgsMHgyNCwweDAyLDB4MDAsMHgwNywweGEyLDB4MjIsMHgwMCwweDBhLAorMHg5MiwweDIyLDB4MDAsMHgyNywweGFlLDB4MjAsMHgwMCwweDI0LDB4MDgsMHgwMCwweDBkLDB4NGQsMHhhMiwweDIyLDB4MDAsMHgwNCwKKzB4MDgsMHgwMCwweDBkLDB4YWIsMHgyNCwweDAyLDB4MDAsMHgwNiwweDE2LDB4MDIsMHhmZiwweDliLDB4M2MsMHgwMiwweGIwLDB4MDUsCisweDhlLDB4MjMsMHgwMCwweDJjLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweDYyLDB4MDAsMHgwNywweGEyLDB4MjQsMHgwMCwweDA4LAorMHgyNCwweDAyLDB4MDAsMHgwMywweGEyLDB4MjIsMHgwMCwweDBhLDB4OTIsMHgyMiwweDAwLDB4MmYsMHhhZSwweDIwLDB4MDAsMHgyYywKKzB4MDgsMHgwMCwweDBkLDB4NGQsMHhhMiwweDIyLDB4MDAsMHgwNiwweDA4LDB4MDAsMHgwZCwweGJhLDB4YTIsMHgyMCwweDAwLDB4MGEsCisweDhlLDB4MjIsMHgwMCwweDI4LDB4MjQsMHgwMywweDAwLDB4MDEsMHgyNCwweDA0LDB4MDAsMHgwMSwweDEwLDB4NDQsMHgwMCwweDA3LAorMHhhMiwweDIzLDB4MDAsMHgwOCwweDI0LDB4MDIsMHgwMCwweDA1LDB4YTIsMHgyMiwweDAwLDB4MGEsMHg5MiwweDIyLDB4MDAsMHgyYiwKKzB4YWUsMHgyMCwweDAwLDB4MjgsMHgwOCwweDAwLDB4MGQsMHg0ZCwweGEyLDB4MjIsMHgwMCwweDA1LDB4MDgsMHgwMCwweDBkLDB4YzYsCisweDI0LDB4MDIsMHgwMCwweDA0LDB4MTIsMHgwMiwweDAwLDB4MTIsMHgyYSwweDAyLDB4MDAsMHg0MSwweDEwLDB4NDAsMHgwMCwweDA5LAorMHgyNCwweDAyLDB4MDAsMHg4MCwweDI0LDB4MDIsMHgwMCwweDIwLDB4MTYsMHgwMiwweGZmLDB4N2IsMHgzYywweDAyLDB4YjAsMHgwNSwKKzB4MjQsMHgwMiwweDAwLDB4MTIsMHhhMiwweDIyLDB4MDAsMHgwYSwweGEyLDB4MjIsMHgwMCwweDA4LDB4MDgsMHgwMCwweDBkLDB4NGQsCisweGFlLDB4MjAsMHgwMCwweDNjLDB4MTYsMHgwMiwweGZmLDB4NzQsMHgzYywweDAyLDB4YjAsMHgwNSwweDI0LDB4MDIsMHgwMCwweDEwLAorMHhhMiwweDIyLDB4MDAsMHgwYSwweGEyLDB4MjIsMHgwMCwweDA4LDB4MDgsMHgwMCwweDBkLDB4NGQsMHhhZSwweDIwLDB4MDAsMHgzNCwKKzB4MjQsMHgwMiwweDAwLDB4MTEsMHhhMiwweDIyLDB4MDAsMHgwYSwweGEyLDB4MjIsMHgwMCwweDA4LDB4MDgsMHgwMCwweDBkLDB4NGQsCisweGFlLDB4MjAsMHgwMCwweDM4LDB4OGUsMHgyNCwweDAwLDB4MzAsMHgyNCwweDAyLDB4MDAsMHgwMywweDI0LDB4MDMsMHgwMCwweDAxLAorMHgxMCwweDgzLDB4MDAsMHgwNywweGEyLDB4MjIsMHgwMCwweDA4LDB4MjQsMHgwMiwweDAwLDB4MDIsMHhhMiwweDIyLDB4MDAsMHgwYSwKKzB4OTIsMHgyMiwweDAwLDB4MzMsMHhhZSwweDIwLDB4MDAsMHgzMCwweDA4LDB4MDAsMHgwZCwweDRkLDB4YTIsMHgyMiwweDAwLDB4MDcsCisweDA4LDB4MDAsMHgwZCwweGVjLDB4YTIsMHgyNCwweDAwLDB4MGEsMHg4ZiwweDg0LDB4YjQsMHgzMCwweGFlLDB4MjAsMHgwMCwweDM0LAorMHg5NCwweDg1LDB4MDAsMHgxNCwweDBjLDB4MDAsMHgxYiwweDg0LDB4MzIsMHgxMCwweDAwLDB4ZmYsMHgwOCwweDAwLDB4MGQsMHgzZSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLDB4MjQsMHg0MiwweDM3LDB4ZTQsCisweDM0LDB4NjMsMHgwMCwweDIwLDB4YWMsMHg2MiwweDAwLDB4MDAsMHg4MCwweGEyLDB4MDAsMHgxNSwweDNjLDB4MDYsMHhiMCwweDA1LAorMHgxMCwweDQwLDB4MDAsMHgwYSwweDM0LDB4YzYsMHgwMiwweDU0LDB4ODMsMHg4MywweDhiLDB4YzQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4YWMsMHg4MywweDAwLDB4MjQsMHg4YywweGMyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDE3LDB4NDIsCisweDMwLDB4NDIsMHgwMCwweDAxLDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhYywweDgyLDB4MDAsMHgyOCwweDhjLDB4ODIsMHgwMCwweDJjLAorMHgzYywweDA2LDB4YjAsMHgwNSwweDM0LDB4YzYsMHgwNCwweDUwLDB4MDAsMHgwMiwweDE4LDB4NDMsMHgzMCwweDYzLDB4MDAsMHgwMSwKKzB4MTAsMHg0MCwweDAwLDB4MDQsMHgzMCwweDQ1LDB4MDAsMHgwMSwweGFjLDB4ODMsMHgwMCwweDI4LDB4MDMsMHhlMCwweDAwLDB4MDgsCisweGFjLDB4ODUsMHgwMCwweDI0LDB4OTAsMHhjMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweGZmLAorMHgzMCwweDQzLDB4MDAsMHgwMiwweDMwLDB4NDIsMHgwMCwweDAxLDB4YWMsMHg4MywweDAwLDB4MjgsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4YWMsMHg4MiwweDAwLDB4MjQsMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLDB4MjcsMHhiZCwweGZmLDB4ZDgsCisweDM0LDB4NjMsMHgwMCwweDIwLDB4MjQsMHg0MiwweDM4LDB4NzQsMHhhYywweDYyLDB4MDAsMHgwMCwweGFmLDB4YjEsMHgwMCwweDFjLAorMHhhZiwweGJmLDB4MDAsMHgyMCwweGFmLDB4YjAsMHgwMCwweDE4LDB4OTAsMHhhNiwweDAwLDB4MGEsMHgyNywweDgzLDB4YjMsMHhmMCwKKzB4MDAsMHhhMCwweDg4LDB4MjEsMHgwMCwweDA2LDB4MTAsMHg4MCwweDAwLDB4NDMsMHgxMCwweDIxLDB4OGMsMHg1MCwweDAwLDB4MDAsCisweDgwLDB4YTUsMHgwMCwweDExLDB4OTIsMHgwMywweDAwLDB4MTIsMHgxMCwweGEwLDB4MDAsMHgwNCwweGEyLDB4MjAsMHgwMCwweDE1LAorMHgyNCwweDAyLDB4MDAsMHgxMiwweDEwLDB4YzIsMHgwMCwweGRhLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MiwweDIyLDB4MDAsMHgxMiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHg2NywweDAwLDB4MDAsMHgwMCwweDAwLDB4YTIsMHgyMCwweDAwLDB4MTIsCisweGEyLDB4MDAsMHgwMCwweDE5LDB4ODYsMHgyMywweDAwLDB4MGMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgxMCwweGMwLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MjcsMHg4MywweDkwLDB4MTAsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4YTAsMHg0MCwweDAwLDB4MDAsMHg5MiwweDAzLDB4MDAsMHgxNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg2MywweDAwLDB4ZGYsCisweGEyLDB4MDMsMHgwMCwweDE2LDB4ODIsMHgwMiwweDAwLDB4MTIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDIwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDkyLDB4MjMsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDYwLDB4MDAsMHg0NSwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHhhMiwweDIwLDB4MDAsMHgwNCwweDkyLDB4MDgsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDE1LDB4MDAsMHgwMCwweDFlLDB4MjQsMHgwMiwweDAwLDB4MDEsMHg5MiwweDA3LDB4MDAsMHgwYSwweGEyLDB4MDIsMHgwMCwweDE3LAorMHg5MiwweDAyLDB4MDAsMHgxNiwweDMwLDB4ZTMsMHgwMCwweGZmLDB4MzAsMHg0MiwweDAwLDB4ZTQsMHgxMCwweDYwLDB4MDAsMHgwMywKKzB4YTIsMHgwMiwweDAwLDB4MTYsMHgzNCwweDQyLDB4MDAsMHgwMSwweGEyLDB4MDIsMHgwMCwweDE2LDB4MTEsMHgwMCwweDAwLDB4MDUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTIsMHgwMiwweDAwLDB4MTYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDM0LDB4NDIsMHgwMCwweDAyLAorMHhhMiwweDAyLDB4MDAsMHgxNiwweDkyLDB4MDIsMHgwMCwweDE3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgwOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg5NiwweDAyLDB4MDAsMHgwNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4YTYsMHgwMiwweDAwLDB4MTQsCisweDhmLDB4YmYsMHgwMCwweDIwLDB4N2IsMHhiMCwweDAwLDB4ZmMsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDI4LAorMHg5NiwweDAyLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwZSwweDY4LDB4YTYsMHgwMiwweDAwLDB4MTQsMHg5MiwweDA3LDB4MDAsMHgwYSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweGUwLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDBlLDB4NTQsCisweGEyLDB4MDAsMHgwMCwweDE3LDB4OTYsMHgwNCwweDAwLDB4MDAsMHg5NiwweDA1LDB4MDAsMHgwNiwweDI3LDB4ODYsMHg4ZiwweGYwLAorMHgwMCwweDA0LDB4MTgsMHhjMCwweDAwLDB4NjQsMHgxOCwweDIxLDB4MDAsMHgwNSwweDEwLDB4YzAsMHgwMCwweDQ1LDB4MTAsMHgyMSwKKzB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDY2LDB4MTgsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0NiwweDEwLDB4MjEsCisweDhjLDB4NjYsMHgwMCwweDA4LDB4OGMsMHg0NSwweDAwLDB4MDgsMHgzYywweDAzLDB4ODAsMHgwMCwweDAwLDB4YzMsMHgyMCwweDI0LAorMHgxMCwweDgwLDB4MDAsMHgwOCwweDAwLDB4YTMsMHgxMCwweDI0LDB4MTAsMHg0MCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MTgsMHgyMSwKKzB4MTAsMHg4MCwweDAwLDB4MDIsMHgyNCwweDAzLDB4MDAsMHgwMSwweDAwLDB4YTYsMHgxOCwweDJiLDB4MDgsMHgwMCwweDBlLDB4NTQsCisweGEyLDB4MDMsMHgwMCwweDE3LDB4MTAsMHg0MCwweGZmLDB4ZmQsMHgwMCwweGE2LDB4MTgsMHgyYiwweDA4LDB4MDAsMHgwZSwweDg4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NjIsMHgwMCwweDA5LDB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweDYyLDB4MDAsMHgwNSwKKzB4MjQsMHgwMiwweDAwLDB4MDMsMHgxNCwweDYyLDB4ZmYsMHhiOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDBlLDB4NGUsCisweGEyLDB4MjAsMHgwMCwweDA3LDB4MDgsMHgwMCwweDBlLDB4NGUsMHhhMiwweDIwLDB4MDAsMHgwNiwweDA4LDB4MDAsMHgwZSwweDRlLAorMHhhMiwweDIwLDB4MDAsMHgwNSwweDgyLDB4MjIsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHg2OSwKKzB4MmMsMHg2MiwweDAwLDB4MDIsMHgxMCwweDQwLDB4MDAsMHg0OSwweDNjLDB4MDIsMHhiMCwweDA5LDB4OTIsMHgyNSwweDAwLDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHhhNiwweDAwLDB4ZmYsMHgyYywweGMyLDB4MDAsMHgwNCwweDEwLDB4NDAsMHgwMCwweDNiLAorMHgyYywweGMyLDB4MDAsMHgxMCwweDNjLDB4MDQsMHhiMCwweDA1LDB4MzQsMHg4NCwweDAyLDB4MjksMHg5MCwweDgzLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHgwMCwweGMyLDB4MTAsMHgwNCwweDAwLDB4MDIsMHgxMCwweDI3LDB4MDAsMHg2MiwweDE4LDB4MjQsCisweGEwLDB4ODMsMHgwMCwweDAwLDB4ODYsMHgyMywweDAwLDB4MGMsMHg5NiwweDI2LDB4MDAsMHgwYywweDAwLDB4MDMsMHgxMCwweGMwLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgyOCwweDgwLDB4MjcsMHg4MywweDhmLDB4ZjQsMHgwMCwweGEzLDB4MTgsMHgyMSwKKzB4OGMsMHg2NCwweDAwLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhjLDB4ODIsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDMwLDB4NDIsMHgwMCwweDEwLDB4MTAsMHg0MCwweDAwLDB4MTgsMHgyNCwweDA3LDB4MDAsMHgwMSwweDkzLDB4ODIsMHg4YiwweDYxLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweDAxLDB4MTQsMHg0MCwweDAwLDB4MGEsMHgyNCwweDA1LDB4MDAsMHgyNCwKKzB4MDAsMHgwNiwweDJjLDB4MDAsMHgwMCwweDA1LDB4MmMsMHgwMywweDBjLDB4MDAsMHgxYiwweDg0LDB4MDIsMHgwMCwweDIwLDB4MjEsCisweDkyLDB4MDIsMHgwMCwweDE2LDB4YTIsMHgwMCwweDAwLDB4MTIsMHgzMCwweDQyLDB4MDAsMHhlNywweDA4LDB4MDAsMHgwZSwweDQ1LAorMHhhMiwweDAyLDB4MDAsMHgxNiwweGYwLDB4YzUsMHgwMCwweDA2LDB4MDAsMHgwMCwweDI4LDB4MTIsMHgyNywweDgyLDB4OGYsMHhmMCwKKzB4MDAsMHhhMiwweDI4LDB4MjEsMHgwYywweDAwLDB4MDEsMHg0YiwweDNjLDB4MDQsMHgwMCwweDgwLDB4OTYsMHgyNiwweDAwLDB4MGMsCisweDA4LDB4MDAsMHgwZSwweGM1LDB4MDAsMHgwNiwweDJjLDB4MDAsMHgyNywweDgzLDB4OTAsMHgwMCwweDI3LDB4ODIsMHg5MCwweDA4LAorMHgwMCwweGEyLDB4MTAsMHgyMSwweDAwLDB4YTMsMHgxOCwweDIxLDB4OTAsMHg0NCwweDAwLDB4MDAsMHg5MCwweDY1LDB4MDAsMHgwNSwKKzB4OTMsMHg4MiwweDgwLDB4MTAsMHgwMCwweDAwLDB4MzAsMHgyMSwweDBjLDB4MDAsMHgyMSwweGY1LDB4YWYsMHhhMiwweDAwLDB4MTAsCisweDk2LDB4MjYsMHgwMCwweDBjLDB4MDgsMHgwMCwweDBlLDB4YmYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHhmZiwweGNkLAorMHgzYywweDA0LDB4YjAsMHgwNSwweDM0LDB4ODQsMHgwMiwweDI5LDB4OTAsMHg4MywweDAwLDB4MDAsMHgzMCwweGE1LDB4MDAsMHgwZiwKKzB4MjQsMHgwMiwweDAwLDB4ODAsMHgwOCwweDAwLDB4MGUsMHhhZSwweDAwLDB4YTIsMHgxMCwweDA3LDB4ODYsMHgyNiwweDAwLDB4MGMsCisweDNjLDB4MDMsMHhiMCwweDA5LDB4MzQsMHg0MiwweDAxLDB4NzIsMHgzNCwweDYzLDB4MDEsMHg3OCwweDk0LDB4NDcsMHgwMCwweDAwLAorMHg4YywweDY1LDB4MDAsMHgwMCwweDAwLDB4MDYsMHgxMCwweGMwLDB4MDAsMHg0NiwweDEwLDB4MjEsMHgzYywweDA0LDB4YjAsMHgwOSwKKzB4YWUsMHgyNSwweDAwLDB4MWMsMHgzNCwweDg0LDB4MDEsMHg3YywweDI3LDB4ODMsMHg4ZiwweGY0LDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDhjLDB4ODUsMHgwMCwweDAwLDB4MDAsMHg0MywweDEwLDB4MjEsMHg4YywweDQzLDB4MDAsMHgxOCwweGFlLDB4MjUsMHgwMCwweDIwLAorMHhhNiwweDI3LDB4MDAsMHgxOCwweDhjLDB4NjYsMHgwMCwweDA4LDB4MDIsMHgyMCwweDIwLDB4MjEsMHgwYywweDAwLDB4MGYsMHgxNSwKKzB4MDAsMHgwMCwweDI4LDB4MjEsMHg4NiwweDI1LDB4MDAsMHgxOCwweDhlLDB4MjYsMHgwMCwweDFjLDB4OGUsMHgyNywweDAwLDB4MjAsCisweDAyLDB4MjAsMHgyMCwweDIxLDB4MGMsMHgwMCwweDFjLDB4ODYsMHhhZiwweGEyLDB4MDAsMHgxMCwweDA4LDB4MDAsMHgwZSwweDQ1LAorMHhhMiwweDAyLDB4MDAsMHgxMiwweDkyLDB4MjIsMHgwMCwweDA4LDB4MDgsMHgwMCwweDBlLDB4NDUsMHhhMiwweDIyLDB4MDAsMHgwOSwKKzB4YTIsMHgyMCwweDAwLDB4MTEsMHg4MCwweDgyLDB4MDAsMHg1MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MDMsCisweDNjLDB4MDIsMHhiMCwweDAzLDB4MzQsMHg0MiwweDAwLDB4ZDAsMHhhYywweDQwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwZSwweDQ1LAorMHhhMCwweDgwLDB4MDAsMHg1MCwweDk0LDB4OGEsMHgwMCwweDBjLDB4MjQsMHgwMywweDAwLDB4MjQsMHgwMCwweDgwLDB4NzAsMHgyMSwKKzB4M2MsMHgwMiwweDgwLDB4MDAsMHgzYywweDA0LDB4YjAsMHgwMywweDI0LDB4NDIsMHgzYywweDU0LDB4ZjEsMHg0MywweDAwLDB4MDYsCisweDM0LDB4ODQsMHgwMCwweDIwLDB4MDAsMHgwMCwweDE4LDB4MTIsMHgwMCwweGEwLDB4NjgsMHgyMSwweGFjLDB4ODIsMHgwMCwweDAwLAorMHgyNywweDg1LDB4OTAsMHgwMCwweDI3LDB4ODIsMHg4ZiwweGZmLDB4MjcsMHhiZCwweGZmLDB4ZjgsMHgwMCwweDYyLDB4NjAsMHgyMSwKKzB4MDAsMHg2NSwweDU4LDB4MjEsMHgwMCwweDAwLDB4YzAsMHgyMSwweDExLDB4YTAsMHgwMCwweGNjLDB4MDAsMHgwMCwweDc4LDB4MjEsCisweDAwLDB4MGEsMHgxYywweDAwLDB4MDAsMHgwMywweDFjLDB4MDMsMHgwMCwweDAzLDB4MTAsMHhjMCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDUsMHgxMCwweDIxLDB4OTEsMHg4NywweDAwLDB4MDAsMHg4MCwweDQ4LDB4MDAsMHgwNCwKKzB4MDMsMHhhMCwweDYwLDB4MjEsMHgwMCwweDBhLDB4MWMsMHgwMCwweDAwLDB4MDMsMHgxYywweDAzLDB4MDAsMHgwMywweDEwLDB4YzAsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDQ4LDB4ODAsMHgyNywweDgzLDB4OGYsMHhmNCwweGEzLDB4YTcsMHgwMCwweDAwLAorMHgwMSwweDIzLDB4MTgsMHgyMSwweDhjLDB4NjQsMHgwMCwweDE4LDB4MjUsMHgwMiwweGZmLDB4ZmYsMHgwMCwweDQ4LDB4NDAsMHgwYiwKKzB4OGMsMHg4MywweDAwLDB4MDQsMHgyZCwweDA1LDB4MDAsMHgwNywweDI0LDB4MDIsMHgwMCwweDA2LDB4MzAsMHg2MywweDAwLDB4MDgsCisweDE0LDB4NjAsMHgwMCwweDM1LDB4MDAsMHg0NSwweDQwLDB4MGEsMHg5MywweGE3LDB4MDAsMHgwMCwweDI3LDB4ODIsMHg5MCwweDA4LAorMHgwMSwweDIyLDB4MTAsMHgyMSwweDMwLDB4ZTMsMHgwMCwweGYwLDB4MzgsMHg2MywweDAwLDB4NTAsMHgzMCwweGU1LDB4MDAsMHhmZiwKKzB4MDAsMHgwNSwweDIwLDB4MmIsMHgwMCwweDAzLDB4MTgsMHgyYiwweDAwLDB4NjQsMHgxOCwweDI0LDB4OTAsMHg0OSwweDAwLDB4MDAsCisweDEwLDB4NjAsMHgwMCwweDE2LDB4MzAsMHhlNCwweDAwLDB4MGYsMHgyNCwweDAyLDB4MDAsMHgwNCwweDEwLDB4YTIsMHgwMCwweDlkLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDExLDB4YTAsMHgwMCwweDNhLDB4MmMsMHhhMiwweDAwLDB4MGMsMHgxMCwweDQwLDB4MDAsMHgwMiwKKzB4MjQsMHg4NCwweDAwLDB4MGMsMHgwMCwweGUwLDB4MjAsMHgyMSwweDMwLDB4ODQsMHgwMCwweGZmLDB4MDAsMHgwNCwweDEwLDB4NDAsCisweDI3LDB4ODMsMHhiYiwweDBjLDB4MDAsMHg0NCwweDEwLDB4MjEsMHgwMCwweDQzLDB4MTAsMHgyMSwweDkwLDB4NDcsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDJjLDB4ZTMsMHgwMCwweDBjLDB4YTMsMHhhNywweDAwLDB4MDAsMHgxMCwweDYwLDB4MDAsMHgwMiwKKzB4MjQsMHhlMiwweDAwLDB4MDQsMHgwMCwweGUwLDB4MTAsMHgyMSwweGEzLDB4YTIsMHgwMCwweDAwLDB4OTEsMHg2NSwweDAwLDB4MDAsCisweDkxLDB4ODIsMHgwMCwweDAwLDB4MzAsMHhhMywweDAwLDB4ZmYsMHgwMCwweDYyLDB4MTAsMHgyYiwweDEwLDB4NDAsMHgwMCwweDBlLAorMHgyYywweDYyLDB4MDAsMHgwYywweDE0LDB4NDAsMHgwMCwweDAzLDB4MDAsMHg2MCwweDIwLDB4MjEsMHgzMCwweGEyLDB4MDAsMHgwZiwKKzB4MjQsMHg0NCwweDAwLDB4MGMsMHgwMCwweDA0LDB4MTAsMHg0MCwweDAwLDB4NDQsMHgyMCwweDIxLDB4MjcsMHg4MywweGJiLDB4MGMsCisweDAwLDB4ODMsMHgxOCwweDIxLDB4OTAsMHg2MiwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDA1LAorMHgwMCwweDA5LDB4MTEsMHgwMCwweGExLDB4ODUsMHgwMCwweDAwLDB4OTMsMHhhMiwweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4MjcsMHhiZCwweDAwLDB4MDgsMHgwMCwweDQ5LDB4MTAsMHgyMywweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0OSwweDEwLDB4MjMsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0NCwweDEwLDB4MjEsMHgyNywweDgzLDB4YjQsMHg5OCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHg5MCwweDQ0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MmMsMHg4MywweDAwLDB4MGMsMHgxNCwweDYwLDB4MDAsMHgwNiwKKzB4MDAsMHg4MCwweDEwLDB4MjEsMHgwMCwweDE4LDB4MTAsMHg0MCwweDAwLDB4NGYsMHgxMCwweDIxLDB4MDAsMHgwMiwweDExLDB4MDAsCisweDAwLDB4ODIsMHgxMCwweDIxLDB4MjQsMHg0MiwweDAwLDB4MDQsMHgwOCwweDAwLDB4MGYsMHg3NiwweGExLDB4ODIsMHgwMCwweDAwLAorMHg4ZiwweDhkLDB4ODEsMHg1YywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHhhOCwweDEwLDB4MjEsMHg5MCwweDQzLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDYwLDB4ZmYsMHhkMSwweDAwLDB4MDAsMHgyOCwweDIxLDB4MDAsMHgwNiwweDc0LDB4ODIsCisweDMwLDB4ZTIsMHgwMCwweGZmLDB4MmMsMHg0MiwweDAwLDB4MGMsMHgxNCwweDQwLDB4MDAsMHgwMywweDAwLDB4ZTAsMHgxMCwweDIxLAorMHgzMCwweGUyLDB4MDAsMHgwZiwweDI0LDB4NDIsMHgwMCwweDBjLDB4MzAsMHg0NCwweDAwLDB4ZmYsMHhhMywweGEyLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDAwLDB4MGMsMHgxMCwweDgyLDB4MDAsMHgwZCwweDAwLDB4MDksMHgxMSwweDAwLDB4MDAsMHg0OSwweDEwLDB4MjMsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHgwNCwweDE4LDB4NDAsMHgwMCwweDQ5LDB4MTAsMHgyMywweDAwLDB4NjQsMHgxOCwweDIxLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MjcsMHg4NCwweGI0LDB4OTgsMHgwMCwweDQ0LDB4MTAsMHgyMSwKKzB4OTAsMHg0NywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGEzLDB4YTcsMHgwMCwweDAwLDB4MDAsMHgwYSwweDFjLDB4MDAsCisweDAwLDB4MDMsMHgxYywweDAzLDB4MDAsMHgwMywweDEwLDB4YzAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgyNywweDgzLDB4OGYsMHhmNCwweDAwLDB4NDMsMHgxMCwweDIxLDB4OGMsMHg0NCwweDAwLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGMsMHg4MywweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NjMsMHgwMCwweDEwLDB4MTQsMHg2MCwweDAwLDB4MzMsCisweDAwLDB4MDYsMHgxNCwweDQyLDB4MDAsMHgwOSwweDExLDB4MDAsMHgwMCwweDQ5LDB4MTAsMHgyMywweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDQ5LDB4MTAsMHgyMywweDI3LDB4ODMsMHhiNSwweDY4LDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4OTAsMHg0NCwweDAwLDB4MDQsMHg5MCwweDQzLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg2NCwweGMwLDB4MjQsCisweDkzLDB4YTcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyYywweGUyLDB4MDAsMHgwZiwweDEwLDB4NDAsMHgwMCwweDBmLAorMHgzMSwweGNmLDB4MDAsMHgwMSwweDAwLDB4MGEsMHgxYywweDAwLDB4MDAsMHgwMywweDFjLDB4MDMsMHgwMCwweDAzLDB4MTAsMHhjMCwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwweDI3LDB4ODQsMHg4ZiwweGYwLDB4MDAsMHg0NCwweDEwLDB4MjEsCisweDg0LDB4NDMsMHgwMCwweDA2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyOCwweDYzLDB4MDYsMHg0MSwweDE0LDB4NjAsMHgwMCwweDA0LAorMHgzMCwweGUyLDB4MDAsMHhmZiwweDI0LDB4MDcsMHgwMCwweDBmLDB4YTMsMHhhNywweDAwLDB4MDAsMHgzMCwweGUyLDB4MDAsMHhmZiwKKzB4MmMsMHg0MiwweDAwLDB4MGMsMHgxNCwweDQwLDB4MDAsMHgwNiwweDAwLDB4ZTAsMHgxMCwweDIxLDB4MDAsMHgxOCwweDEwLDB4NDAsCisweDAwLDB4NGYsMHgxMCwweDIxLDB4MDAsMHgwMiwweDExLDB4MDAsMHgwMCwweDQ3LDB4MTAsMHgyMSwweDI0LDB4NDIsMHgwMCwweDA0LAorMHhhMywweGEyLDB4MDAsMHgwMCwweDAwLDB4NDAsMHgzOCwweDIxLDB4MDEsMHhhOCwweDEwLDB4MjEsMHg5MCwweDQzLDB4MDAsMHgwMCwKKzB4MjQsMHhhNCwweDAwLDB4MDEsMHgzMCwweDg1LDB4ZmYsMHhmZiwweDAwLDB4YTMsMHgxOCwweDJiLDB4MTQsMHg2MCwweGZmLDB4YWQsCisweDMwLDB4ZTIsMHgwMCwweGZmLDB4MDgsMHgwMCwweDBmLDB4NjMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwZiwweGM0LAorMHgzMCwweDU4LDB4MDAsMHgwMSwweDgxLDB4YzIsMHgwMCwweDQ4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4ZmYsMHg3MywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MGYsMHg1MSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwYSwweDFjLDB4MDAsCisweDAwLDB4MDMsMHgxYywweDAzLDB4MDAsMHgwMywweDEwLDB4YzAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDQ1LDB4MTAsMHgyMSwweDgwLDB4NDgsMHgwMCwweDA1LDB4OTEsMHg2NywweDAwLDB4MDAsMHgwOCwweDAwLDB4MGYsMHgzMSwKKzB4MDMsMHhhMCwweDU4LDB4MjEsMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLDB4MzQsMHg2MywweDAwLDB4MjAsCisweDI0LDB4NDIsMHgzZiwweGY0LDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhYywweDYyLDB4MDAsMHgwMCwweDI3LDB4YmQsMHhmZiwweGMwLAorMHhhZiwweGI3LDB4MDAsMHgzNCwweGFmLDB4YjYsMHgwMCwweDMwLDB4YWYsMHhiNSwweDAwLDB4MmMsMHhhZiwweGI0LDB4MDAsMHgyOCwKKzB4YWYsMHhiMywweDAwLDB4MjQsMHhhZiwweGIyLDB4MDAsMHgyMCwweGFmLDB4YmYsMHgwMCwweDNjLDB4YWYsMHhiZSwweDAwLDB4MzgsCisweGFmLDB4YjEsMHgwMCwweDFjLDB4YWYsMHhiMCwweDAwLDB4MTgsMHg4NCwweDgyLDB4MDAsMHgwYywweDI3LDB4OTMsMHg4ZiwweGY0LAorMHgzYywweDA1LDB4YjAsMHgwMywweDAwLDB4MDIsMHgxOCwweGMwLDB4MDAsMHg2MiwweDE4LDB4MjEsMHgwMCwweDAzLDB4MTgsMHg4MCwKKzB4MDAsMHg3MywweDEwLDB4MjEsMHg4YywweDVlLDB4MDAsMHgxOCwweDNjLDB4MDIsMHg4MCwweDAwLDB4MzQsMHhhNSwweDAwLDB4MjAsCisweDI0LDB4NDIsMHg0MCwweDBjLDB4YWMsMHhhMiwweDAwLDB4MDAsMHg4ZiwweGQwLDB4MDAsMHgwOCwweDI3LDB4OTUsMHg5MCwweDAwLAorMHgwMCwweDc1LDB4MTgsMHgyMSwweDAwLDB4MDAsMHgyOCwweDIxLDB4MDIsMHgwMCwweDMwLDB4MjEsMHg5MCwweDcxLDB4MDAsMHgwMCwKKzB4MGMsMHgwMCwweDBmLDB4MTUsMHgwMCwweDgwLDB4YjAsMHgyMSwweDAwLDB4NDAsMHg5MCwweDIxLDB4MDAsMHgxMCwweDE0LDB4NDIsCisweDMwLDB4NTQsMHgwMCwweDAxLDB4MDIsMHg0MCwweDIwLDB4MjEsMHgwMCwweDEwLDB4MTQsMHg4MiwweDAyLDB4ODAsMHgyOCwweDIxLAorMHgxMiwweDUxLDB4MDAsMHgyMywweDAwLDB4MTAsMHhiZiwweGMyLDB4ODYsMHhjMywweDAwLDB4MGMsMHgzMCwweDUwLDB4MDAsMHgwMSwKKzB4MDAsMHgwMywweDEwLDB4YzAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg1NSwweDEwLDB4MjEsCisweGEwLDB4NTIsMHgwMCwweDAwLDB4ODYsMHhjMywweDAwLDB4MGMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgxMCwweGMwLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg1MywweDMwLDB4MjEsMHg4YywweGM3LDB4MDAsMHgxOCwKKzB4MjcsMHg4MywweDhmLDB4ZjAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDhjLDB4ZTMsMHgwMCwweDA0LDB4ODQsMHg0NiwweDAwLDB4MDYsCisweDAwLDB4MDMsMHgxOSwweDQyLDB4MGMsMHgwMCwweDA4LDB4ZGYsMHgzMCwweDczLDB4MDAsMHgwMSwweDAwLDB4NDAsMHg4OCwweDIxLAorMHgwMiwweDQwLDB4MjAsMHgyMSwweDAyLDB4ODAsMHgyOCwweDIxLDB4MTYsMHhlMCwweDAwLDB4MTAsMHgwMiwweDAwLDB4MzAsMHgyMSwKKzB4ODYsMHhjMiwweDAwLDB4MGMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgxOCwweGMwLDB4MDAsMHg2MiwweDE4LDB4MjEsCisweDAwLDB4MDMsMHgxOCwweDgwLDB4MjcsMHg4MiwweDhmLDB4ZjgsMHgwMCwweDYyLDB4MTgsMHgyMSwweGE0LDB4NzEsMHgwMCwweDA0LAorMHg3YiwweGJlLDB4MDEsMHhmYywweDdiLDB4YjYsMHgwMSwweGJjLDB4N2IsMHhiNCwweDAxLDB4N2MsMHg3YiwweGIyLDB4MDEsMHgzYywKKzB4N2IsMHhiMCwweDAwLDB4ZmMsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDQwLDB4ODYsMHhjMywweDAwLDB4MGMsCisweGFmLDB4YjMsMHgwMCwweDEwLDB4YWYsMHhhMCwweDAwLDB4MTQsMHgwMCwweDAzLDB4MTAsMHhjMCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NTUsMHgxMCwweDIxLDB4ODAsMHg0NywweDAwLDB4MDYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHhlNywweDAwLDB4MDIsMHgwMCwweDA3LDB4MTcsMHhjMiwweDAwLDB4ZTIsMHgzOCwweDIxLDB4MDAsMHgwNywweDM4LDB4NDMsCisweDAwLDB4MDcsMHgzOCwweDQwLDB4MGMsMHgwMCwweDA5LDB4MDYsMHgwMywweGM3LDB4MzgsMHgyMSwweDA4LDB4MDAsMHgxMCwweDQ0LAorMHgwMiwweDIyLDB4ODgsMHgyMSwweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgyNywweGJkLDB4ZmYsMHhkMCwKKzB4MzQsMHg2MywweDAwLDB4MjAsMHgyNCwweDQyLDB4NDEsMHg5NCwweGFmLDB4YjIsMHgwMCwweDIwLDB4YWMsMHg2MiwweDAwLDB4MDAsCisweGFmLDB4YmYsMHgwMCwweDI4LDB4YWYsMHhiMywweDAwLDB4MjQsMHhhZiwweGIxLDB4MDAsMHgxYywweGFmLDB4YjAsMHgwMCwweDE4LAorMHgzYywweDAyLDB4YjAsMHgwMywweDkwLDB4ODMsMHgwMCwweDBhLDB4MzQsMHg0MiwweDAxLDB4MDQsMHg5NCwweDQ1LDB4MDAsMHgwMCwKKzB4MDAsMHgwMywweDE4LDB4ODAsMHgyNywweDgyLDB4YjMsMHhmMCwweDAwLDB4NjIsMHgxOCwweDIxLDB4MzAsMHhhNiwweGZmLDB4ZmYsCisweDhjLDB4NzEsMHgwMCwweDAwLDB4ODAsMHg4NSwweDAwLDB4MTIsMHgzMCwweGM5LDB4MDAsMHhmZiwweDAwLDB4MDYsMHgzMiwweDAyLAorMHhhNCwweDg2LDB4MDAsMHg0NCwweGE0LDB4ODksMHgwMCwweDQ2LDB4ODIsMHgyMiwweDAwLDB4MTIsMHgwMCwweDgwLDB4OTAsMHgyMSwKKzB4MTAsMHhhMCwweDAwLDB4MWIsMHhhMCwweDgwLDB4MDAsMHgxNSwweDAwLDB4YzUsMHgxMCwweDJhLDB4MTAsMHg0MCwweDAwLDB4MTQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4YTIsMHgyMCwweDAwLDB4MTksMHg4NCwweDgzLDB4MDAsMHgwYywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAzLDB4MTAsMHhjMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgyNywweDgzLDB4OTAsMHgxMCwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHhhMCwweDQwLDB4MDAsMHgwMCwweGEwLDB4ODAsMHgwMCwweDEyLDB4OTIsMHgyMiwweDAwLDB4MTYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4ZGYsMHhhMiwweDIyLDB4MDAsMHgxNiwweDhmLDB4YmYsMHgwMCwweDI4LAorMHg3YiwweGIyLDB4MDEsMHgzYywweDdiLDB4YjAsMHgwMCwweGZjLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgzMCwKKzB4MGMsMHgwMCwweDBmLDB4ZmQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxMCwweDkzLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI4LDB4NDIsMHgwMCwweDAyLDB4MTAsMHg0MCwweDAxLDB4NzYsMHgwMCwweDAwLDB4MjgsMHgyMSwweDk0LDB4ODcsMHgwMCwweDBjLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ZTAsMHgxMCwweDIxLDB4MDAsMHgwMiwweDE0LDB4MDAsMHgwMCwweDAyLDB4MTQsMHgwMywKKzB4MDAsMHgwNywweDI0LDB4MDAsMHgwMCwweDA0LDB4MjQsMHgwMywweDAwLDB4MDIsMHgxOCwweGMwLDB4MDAsMHg2MiwweDE4LDB4MjEsCisweDAwLDB4MDQsMHgyOCwweGMwLDB4MDAsMHhhNCwweDI4LDB4MjEsMHgyNywweDgyLDB4OTAsMHgxMCwweDAwLDB4MDMsMHgxOCwweDgwLAorMHgwMCwweDYyLDB4MTgsMHgyMSwweDAwLDB4MDUsMHgyOCwweDgwLDB4MjcsMHg4MiwweDhmLDB4ZjgsMHgwMCwweGEyLDB4MTAsMHgyMSwKKzB4OGMsMHg2OCwweDAwLDB4MDAsMHg4MCwweDQ0LDB4MDAsMHgwNiwweDI3LDB4ODIsMHg5MCwweDAwLDB4MDAsMHgwOCwweDFkLDB4MDIsCisweDAwLDB4YTIsMHgyOCwweDIxLDB4MzgsMHg4NCwweDAwLDB4MDAsMHgzMCwweDYzLDB4MDAsMHgwMSwweDAxLDB4MjQsMHgzMCwweDBiLAorMHg4MCwweGFhLDB4MDAsMHgwNCwweDgwLDB4YTksMHgwMCwweDA1LDB4MTAsMHg2MCwweDAwLDB4MDIsMHgwMCwweDA4LDB4MTQsMHgwMiwKKzB4MzAsMHg0NiwweDAwLDB4MGYsMHgxNSwweDIwLDB4MDAsMHgyOCwweDAxLDB4NDksMHgxMCwweDIxLDB4MTUsMHg0MCwweDAwLDB4MTEsCisweDMwLDB4ZTMsMHhmZiwweGZmLDB4OTIsMHg0NSwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4YTgsMHgwMCwweGZmLAorMHgyZCwweDAyLDB4MDAsMHgwNCwweDEwLDB4NDAsMHgwMSwweDQ2LDB4MmQsMHgwMiwweDAwLDB4MTAsMHgzYywweDA0LDB4YjAsMHgwNSwKKzB4MzQsMHg4NCwweDAyLDB4MjksMHg5MCwweDgzLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MDEsMHgwMiwweDEwLDB4MDQsCisweDAwLDB4NjIsMHgxOCwweDI1LDB4YTAsMHg4MywweDAwLDB4MDAsMHg5NiwweDQ3LDB4MDAsMHgwYywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzMCwweGUzLDB4ZmYsMHhmZiwweDAwLDB4MDMsMHgxMCwweGMwLDB4MDAsMHg0MywweDEwLDB4MjEsMHgyNywweDg0LDB4OTAsMHgwMCwKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQ0LDB4MTAsMHgyMSwweDgwLDB4NDUsMHgwMCwweDA2LDB4MDAsMHgwMywweDFhLDB4MDAsCisweDNjLDB4MDQsMHhiMCwweDAwLDB4MDAsMHg2NSwweDE4LDB4MjEsMHgwMCwweDY0LDB4MjAsMHgyMSwweDk0LDB4ODIsMHgwMCwweDAwLAorMHg4MiwweDQzLDB4MDAsMHgxMCwweDAwLDB4MDIsMHgxNCwweDAwLDB4MTQsMHg2MCwweDAwLDB4MDYsMHgwMCwweDAyLDB4M2MsMHgwMywKKzB4MzAsMHhlMiwweDAwLDB4MDQsMHgxNCwweDQwLDB4MDAsMHgwNCwweDAxLDB4NDksMHgxMCwweDIxLDB4MzQsMHhlMiwweDA4LDB4MDAsCisweGE0LDB4ODIsMHgwMCwweDAwLDB4MDEsMHg0OSwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTYsMHgwMCwweDAwLDB4MDIsMHgxNiwweDAzLAorMHgwMCwweDQ2LDB4MTAsMHgyYSwweDEwLDB4NDAsMHgwMCwweDdjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MiwweDQyLDB4MDAsMHgxMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgwZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODYsMHg0MywweDAwLDB4MGMsCisweDI1LDB4NDQsMHgwMCwweDAxLDB4MDAsMHgwMywweDEwLDB4YzAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgyNywweDgzLDB4OTAsMHgwMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4YTAsMHg0NCwweDAwLDB4MDQsMHg5MiwweDIzLDB4MDAsMHgxNiwKKzB4MDIsMHg0MCwweDIwLDB4MjEsMHgzMCwweDYzLDB4MDAsMHhmYiwweDA4LDB4MDAsMHgxMCwweDk4LDB4YTIsMHgyMywweDAwLDB4MTYsCisweDg2LDB4NDMsMHgwMCwweDBjLDB4MjUsMHgyNCwweDAwLDB4MDEsMHgwMCwweDAzLDB4MTAsMHhjMCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDI3LDB4ODMsMHg5MCwweDAwLDB4MDAsMHg0MywweDEwLDB4MjEsMHhhMCwweDQ0LDB4MDAsMHgwNSwKKzB4ODYsMHg0NSwweDAwLDB4MGMsMHgwYywweDAwLDB4MWYsMHgwOCwweDAyLDB4MjAsMHgyMCwweDIxLDB4MTAsMHg0MCwweDAwLDB4NWEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTIsMHg0NSwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4YTYsMHgwMCwweGZmLAorMHgyYywweGMyLDB4MDAsMHgwNCwweDEwLDB4NDAsMHgwMCwweDRjLDB4MmMsMHhjMiwweDAwLDB4MTAsMHgzYywweDA0LDB4YjAsMHgwNSwKKzB4MzQsMHg4NCwweDAyLDB4MjksMHg5MCwweDgzLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MDAsMHhjMiwweDEwLDB4MDQsCisweDAwLDB4MDIsMHgxMCwweDI3LDB4MDAsMHg2MiwweDE4LDB4MjQsMHhhMCwweDgzLDB4MDAsMHgwMCwweDkyLDB4NDUsMHgwMCwweDA4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4YTUsMHgwMCwweGZmLDB4MTQsMHhhMCwweDAwLDB4MzMsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4YTIsMHg0MCwweDAwLDB4MDQsMHg5MiwweDIyLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweDAwLDB4MGMsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4YTIsMHgyMiwweDAwLDB4MTcsMHg5MiwweDIyLDB4MDAsMHgxNywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxMCwweDQwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTYsMHgyMiwweDAwLDB4MDYsMHgwOCwweDAwLDB4MTAsMHg5MywKKzB4YTYsMHgyMiwweDAwLDB4MTQsMHg5NiwweDIyLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxMCwweDkzLDB4YTYsMHgyMiwweDAwLDB4MTQsCisweDkyLDB4MjIsMHgwMCwweDBhLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MTEsMHgyMiwweGEyLDB4MjAsMHgwMCwweDE3LDB4OTYsMHgyNCwweDAwLDB4MDAsMHg5NiwweDI1LDB4MDAsMHgwNiwKKzB4MjcsMHg4NiwweDhmLDB4ZjAsMHgwMCwweDA0LDB4MTgsMHhjMCwweDAwLDB4NjQsMHgxOCwweDIxLDB4MDAsMHgwNSwweDEwLDB4YzAsCisweDAwLDB4NDUsMHgxMCwweDIxLDB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDY2LDB4MTgsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDQ2LDB4MTAsMHgyMSwweDhjLDB4NjUsMHgwMCwweDA4LDB4OGMsMHg0NCwweDAwLDB4MDgsMHgzYywweDAzLDB4ODAsMHgwMCwKKzB4MDAsMHhhMywweDMwLDB4MjQsMHgxMCwweGMwLDB4MDAsMHgwOCwweDAwLDB4ODMsMHgxMCwweDI0LDB4MTAsMHg0MCwweDAwLDB4MDQsCisweDAwLDB4MDAsMHgxOCwweDIxLDB4MTAsMHhjMCwweDAwLDB4MDIsMHgyNCwweDAzLDB4MDAsMHgwMSwweDAwLDB4ODUsMHgxOCwweDJiLAorMHgwOCwweDAwLDB4MTEsMHgyMiwweGEyLDB4MjMsMHgwMCwweDE3LDB4MTAsMHg0MCwweGZmLDB4ZmQsMHgwMCwweDg1LDB4MTgsMHgyYiwKKzB4MDgsMHgwMCwweDExLDB4NDUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4YTIsMHgwMCwweDA5LDB4MjQsMHgwMiwweDAwLDB4MDIsCisweDEwLDB4YTIsMHgwMCwweDA1LDB4MjQsMHgwMiwweDAwLDB4MDMsMHgxNCwweGEyLDB4ZmYsMHhjYSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MTEsMHgxZCwweGEyLDB4NDAsMHgwMCwweDA3LDB4MDgsMHgwMCwweDExLDB4MWQsMHhhMiwweDQwLDB4MDAsMHgwNiwKKzB4MDgsMHgwMCwweDExLDB4MWQsMHhhMiwweDQwLDB4MDAsMHgwNSwweDE0LDB4NDAsMHhmZiwweGJlLDB4M2MsMHgwNCwweGIwLDB4MDUsCisweDM0LDB4ODQsMHgwMiwweDI5LDB4OTAsMHg4MywweDAwLDB4MDAsMHgzMCwweGE1LDB4MDAsMHgwZiwweDI0LDB4MDIsMHgwMCwweDgwLAorMHgwOCwweDAwLDB4MTEsMHgxNCwweDAwLDB4YTIsMHgxMCwweDA3LDB4MGMsMHgwMCwweDEwLDB4MDMsMHgwMiwweDQwLDB4MjAsMHgyMSwKKzB4MDgsMHgwMCwweDEwLDB4OTMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDkyLDB4NDUsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDMwLDB4YTYsMHgwMCwweGZmLDB4MmMsMHhjMiwweDAwLDB4MDQsMHgxMCwweDQwLDB4MDAsMHg5OSwweDJjLDB4YzIsMHgwMCwweDEwLAorMHgzYywweDA0LDB4YjAsMHgwNSwweDM0LDB4ODQsMHgwMiwweDI5LDB4OTAsMHg4MywweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4MDAsMHhjMiwweDEwLDB4MDQsMHgwMCwweDAyLDB4MTAsMHgyNywweDAwLDB4NjIsMHgxOCwweDI0LDB4YTAsMHg4MywweDAwLDB4MDAsCisweDkyLDB4NDUsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweGE1LDB4MDAsMHhmZiwweDE0LDB4YTAsMHgwMCwweDgwLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweGEyLDB4NDAsMHgwMCwweDA0LDB4ODYsMHg0MywweDAwLDB4MGMsMHgyNywweDkzLDB4OGYsMHhmNCwKKzB4OTYsMHg0NywweDAwLDB4MGMsMHgwMCwweDAzLDB4MTAsMHhjMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDI4LDB4ODAsCisweDAwLDB4YjMsMHgxOCwweDIxLDB4OGMsMHg2NCwweDAwLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhjLDB4ODIsMHgwMCwweDA0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweDEwLDB4MTAsMHg0MCwweDAwLDB4NjQsMHgwMCwweDAwLDB4MzAsMHgyMSwKKzB4MDAsMHgwNywweDFjLDB4MDAsMHgwMCwweDAzLDB4MWMsMHgwMywweDAwLDB4MDMsMHgxMCwweGMwLDB4MDAsMHg0MywweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg1MywweDEwLDB4MjEsMHg4YywweDQzLDB4MDAsMHgxOCwweDkzLDB4ODIsMHg4YiwweDYxLAorMHg4YywweDY0LDB4MDAsMHgwNCwweDMwLDB4NDIsMHgwMCwweDAxLDB4MDAsMHgwNCwweDIxLDB4NDIsMHgxNCwweDQwLDB4MDAsMHg0ZCwKKzB4MzAsMHg5MCwweDAwLDB4MDEsMHgwMCwweDA3LDB4MmMsMHgwMCwweDAwLDB4MDUsMHgyYywweDAzLDB4MGMsMHgwMCwweDFiLDB4ODQsCisweDAyLDB4MjAsMHgyMCwweDIxLDB4OTYsMHgyNiwweDAwLDB4MDYsMHgxMiwweDAwLDB4MDAsMHgxNCwweDMwLDB4YzUsMHhmZiwweGZmLAorMHgwMiwweDYwLDB4OTAsMHgyMSwweDAwLDB4MDUsMHgxMCwweGMwLDB4MDAsMHg0NSwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwKKzB4MDAsMHg1MiwweDE4LDB4MjEsMHg5MiwweDIyLDB4MDAsMHgwYSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MGIsCisweDAyLDB4MjAsMHgyMCwweDIxLDB4OGMsMHg2MywweDAwLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhjLDB4NjIsMHgwMCwweDA0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgxMSwweDQyLDB4MGMsMHgwMCwweDFiLDB4ODQsMHgzMCwweDUwLDB4MDAsMHgwMSwKKzB4OTYsMHgyNiwweDAwLDB4MDYsMHgxNiwweDAwLDB4ZmYsMHhlZiwweDMwLDB4YzUsMHhmZiwweGZmLDB4OTIsMHgyMiwweDAwLDB4MDQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweDAwLDB4MGQsMHgyNCwweDAyLDB4MDAsMHgwMSwweGEyLDB4MjIsMHgwMCwweDE3LAorMHg5MiwweDIyLDB4MDAsMHgxNywweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MDUsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4YTYsMHgyNiwweDAwLDB4MTQsMHg5MiwweDIyLDB4MDAsMHgxNiwweDA4LDB4MDAsMHgxMCwweDkyLDB4MzAsMHg0MiwweDAwLDB4YzMsCisweDk2LDB4MjIsMHgwMCwweDAwLDB4MDgsMHgwMCwweDExLDB4YjksMHhhNiwweDIyLDB4MDAsMHgxNCwweDkyLDB4MjIsMHgwMCwweDBhLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MTEsMHhiNCwKKzB4YTIsMHgyMCwweDAwLDB4MTcsMHg5NiwweDI0LDB4MDAsMHgwMCwweDMwLDB4YzUsMHhmZiwweGZmLDB4MDAsMHgwNSwweDE4LDB4YzAsCisweDAwLDB4MDQsMHgxMCwweGMwLDB4MDAsMHg0NCwweDEwLDB4MjEsMHgwMCwweDY1LDB4MTgsMHgyMSwweDI3LDB4ODQsMHg4ZiwweGYwLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDQsMHgxMCwweDIxLDB4MDAsMHgwMywweDE4LDB4ODAsMHg4YywweDQ1LDB4MDAsMHgwOCwKKzB4MDAsMHg2NCwweDE4LDB4MjEsMHg4YywweDY0LDB4MDAsMHgwOCwweDNjLDB4MDIsMHg4MCwweDAwLDB4MDAsMHhhMiwweDM4LDB4MjQsCisweDEwLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHg4MiwweDEwLDB4MjQsMHgxMCwweDQwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgxOCwweDIxLAorMHgxMCwweGUwLDB4MDAsMHgwMiwweDI0LDB4MDMsMHgwMCwweDAxLDB4MDAsMHg4NSwweDE4LDB4MmIsMHgwOCwweDAwLDB4MTEsMHhiNCwKKzB4YTIsMHgyMywweDAwLDB4MTcsMHgxMCwweDQwLDB4ZmYsMHhmZCwweDAwLDB4ODUsMHgxOCwweDJiLDB4MDgsMHgwMCwweDExLDB4ZDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwNSwweDAwLDB4MjQsMHhmMCwweGU1LDB4MDAsMHgwNiwweDAwLDB4MDAsMHgyOCwweDEyLAorMHgyNywweDgyLDB4OGYsMHhmMCwweDAwLDB4YTIsMHgyOCwweDIxLDB4MGMsMHgwMCwweDAxLDB4NGIsMHgwMCwweDAwLDB4MjAsMHgyMSwKKzB4OTYsMHg0NywweDAwLDB4MGMsMHgwOCwweDAwLDB4MTEsMHg5NiwweDAwLDB4MDcsMHgyYywweDAwLDB4MjcsMHg4MywweDkwLDB4MDAsCisweDI3LDB4ODIsMHg5MCwweDA4LDB4MDAsMHhhMiwweDEwLDB4MjEsMHgwMCwweGEzLDB4MTgsMHgyMSwweDkwLDB4NDQsMHgwMCwweDAwLAorMHg5MCwweDY1LDB4MDAsMHgwNSwweDkzLDB4ODIsMHg4MCwweDEwLDB4MjQsMHgwNywweDAwLDB4MDEsMHgwYywweDAwLDB4MjEsMHhmNSwKKzB4YWYsMHhhMiwweDAwLDB4MTAsMHg5NiwweDQ3LDB4MDAsMHgwYywweDA4LDB4MDAsMHgxMSwweDg5LDB4MDAsMHgwNywweDFjLDB4MDAsCisweDEwLDB4YTIsMHgwMCwweDA5LDB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweGEyLDB4MDAsMHgwNSwweDI0LDB4MDIsMHgwMCwweDAzLAorMHgxNCwweGEyLDB4ZmYsMHg3ZCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDExLDB4N2EsMHhhMiwweDQwLDB4MDAsMHgwNywKKzB4MDgsMHgwMCwweDExLDB4N2EsMHhhMiwweDQwLDB4MDAsMHgwNiwweDA4LDB4MDAsMHgxMSwweDdhLDB4YTIsMHg0MCwweDAwLDB4MDUsCisweDE0LDB4NDAsMHhmZiwweDcxLDB4M2MsMHgwNCwweGIwLDB4MDUsMHgzNCwweDg0LDB4MDIsMHgyOSwweDkwLDB4ODMsMHgwMCwweDAwLAorMHgzMCwweGE1LDB4MDAsMHgwZiwweDI0LDB4MDIsMHgwMCwweDgwLDB4MDgsMHgwMCwweDExLDB4NzEsMHgwMCwweGEyLDB4MTAsMHgwNywKKzB4MTQsMHg0MCwweGZlLDB4YzMsMHgzYywweDA0LDB4YjAsMHgwNSwweDM0LDB4ODQsMHgwMiwweDI5LDB4OTAsMHg4MywweDAwLDB4MDAsCisweDMwLDB4YTUsMHgwMCwweDBmLDB4MjQsMHgwMiwweDAwLDB4ODAsMHgwOCwweDAwLDB4MTAsMHhjYywweDAwLDB4YTIsMHgxMCwweDA3LAorMHg4NCwweDgzLDB4MDAsMHgwYywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweDEwLDB4YzAsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgyNywweDgzLDB4OGYsMHhmNCwweDAwLDB4NDMsMHgxMCwweDIxLDB4OGMsMHg0NywweDAwLDB4MTgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGMsMHhlNiwweDAwLDB4MDgsMHgwYywweDAwLDB4MGYsMHgxNSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMiwweDQwLDB4MjAsMHgyMSwweDAwLDB4MDAsMHgyOCwweDIxLDB4MDAsMHgwMCwweDMwLDB4MjEsMHgwMCwweDAwLDB4MzgsMHgyMSwKKzB4MGMsMHgwMCwweDFjLDB4ODYsMHhhZiwweGEyLDB4MDAsMHgxMCwweDAwLDB4MDIsMHgxZSwweDAwLDB4MTQsMHg2MCwweGZlLDB4NmIsCisweGEyLDB4MjIsMHgwMCwweDEyLDB4OTIsMHg0MywweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NjAsMHgwMCwweDQwLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweGEyLDB4NDAsMHgwMCwweDA0LDB4OTIsMHgyOCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTUsMHgwMCwweDAwLDB4MTksMHgyNCwweDAyLDB4MDAsMHgwMSwweDkyLDB4MjcsMHgwMCwweDBhLDB4YTIsMHgyMiwweDAwLDB4MTcsCisweDkyLDB4MjIsMHgwMCwweDE3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg5NiwweDIyLDB4MDAsMHgwNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4YTYsMHgyMiwweDAwLDB4MTQsMHg5MiwweDIyLDB4MDAsMHgxNiwKKzB4MzAsMHhlMywweDAwLDB4ZmYsMHgzMCwweDQyLDB4MDAsMHhjMCwweDEwLDB4NjAsMHgwMCwweDAzLDB4YTIsMHgyMiwweDAwLDB4MTYsCisweDM0LDB4NDIsMHgwMCwweDAxLDB4YTIsMHgyMiwweDAwLDB4MTYsMHgxMSwweDAwLDB4ZmUsMHg1MCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg5MiwweDIyLDB4MDAsMHgxNiwweDA4LDB4MDAsMHgxMCwweDkyLDB4MzQsMHg0MiwweDAwLDB4MDIsMHg5NiwweDIyLDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDEyLDB4M2IsMHhhNiwweDIyLDB4MDAsMHgxNCwweDkyLDB4MjcsMHgwMCwweDBhLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDE0LDB4ZTAsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MTIsMHgzNCwweGEyLDB4MjAsMHgwMCwweDE3LAorMHg5NiwweDI0LDB4MDAsMHgwMCwweDk2LDB4MjUsMHgwMCwweDA2LDB4MjcsMHg4NiwweDhmLDB4ZjAsMHgwMCwweDA0LDB4MTgsMHhjMCwKKzB4MDAsMHg2NCwweDE4LDB4MjEsMHgwMCwweDA1LDB4MTAsMHhjMCwweDAwLDB4NDUsMHgxMCwweDIxLDB4MDAsMHgwMywweDE4LDB4ODAsCisweDAwLDB4NjYsMHgxOCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQ2LDB4MTAsMHgyMSwweDhjLDB4NjUsMHgwMCwweDA4LAorMHg4YywweDQ0LDB4MDAsMHgwOCwweDNjLDB4MDMsMHg4MCwweDAwLDB4MDAsMHhhMywweDMwLDB4MjQsMHgxMCwweGMwLDB4MDAsMHgwOCwKKzB4MDAsMHg4MywweDEwLDB4MjQsMHgxMCwweDQwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgxOCwweDIxLDB4MTAsMHhjMCwweDAwLDB4MDIsCisweDI0LDB4MDMsMHgwMCwweDAxLDB4MDAsMHg4NSwweDE4LDB4MmIsMHgwOCwweDAwLDB4MTIsMHgzNCwweGEyLDB4MjMsMHgwMCwweDE3LAorMHgxMCwweDQwLDB4ZmYsMHhmZCwweDAwLDB4ODUsMHgxOCwweDJiLDB4MDgsMHgwMCwweDEyLDB4NjMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTAsMHg2MiwweDAwLDB4MDksMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4NjIsMHgwMCwweDA1LDB4MjQsMHgwMiwweDAwLDB4MDMsCisweDE0LDB4NjIsMHhmZiwweGJkLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MTIsMHgyZSwweGEyLDB4NDAsMHgwMCwweDA3LAorMHgwOCwweDAwLDB4MTIsMHgyZSwweGEyLDB4NDAsMHgwMCwweDA2LDB4MDgsMHgwMCwweDEyLDB4MmUsMHhhMiwweDQwLDB4MDAsMHgwNSwKKzB4M2MsMHgwMiwweDgwLDB4MDAsMHgwMCwweDgyLDB4MzAsMHgyNCwweDEwLDB4YzAsMHgwMCwweDA4LDB4MDAsMHhhMiwweDE4LDB4MjQsCisweDEwLDB4NjAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDEwLDB4MjEsMHgxMCwweGMwLDB4MDAsMHgwMiwweDI0LDB4MDIsMHgwMCwweDAxLAorMHgwMCwweGE0LDB4MTAsMHgyYiwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDYwLDB4ZmYsMHhmZCwKKzB4MDAsMHhhNCwweDEwLDB4MmIsMHgwOCwweDAwLDB4MTIsMHg3ZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg4MiwweGZmLDB4ZmYsCisweDAwLDB4MDIsMHgxOCwweGMwLDB4MDAsMHg2MiwweDE4LDB4MjEsMHgyNywweDg0LDB4OTAsMHgwMCwweDAwLDB4MDMsMHgxOCwweDgwLAorMHgwMCwweDY0LDB4MTgsMHgyMSwweDgwLDB4NjYsMHgwMCwweDA2LDB4MDAsMHgwMiwweDEyLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwMCwKKzB4MDAsMHg0NiwweDEwLDB4MjEsMHgwMCwweDQ1LDB4MTAsMHgyMSwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHg0MywweDEwLDB4MjEsCisweDI3LDB4YmQsMHhmZiwweGUwLDB4MzAsMHg4MiwweDAwLDB4N2MsMHgzMCwweDg0LDB4ZmYsMHgwMCwweGFmLDB4YmYsMHgwMCwweDFjLAorMHhhZiwweGIyLDB4MDAsMHgxOCwweGFmLDB4YjEsMHgwMCwweDE0LDB4YWYsMHhiMCwweDAwLDB4MTAsMHgxNCwweDQwLDB4MDAsMHg0MSwKKzB4MDAsMHgwNCwweDIyLDB4MDMsMHgyNCwweDAyLDB4MDAsMHgwNCwweDNjLDB4MTAsMHhiMCwweDAzLDB4OGUsMHgxMCwweDAwLDB4MDAsCisweDEwLDB4ODIsMHgwMCwweDMyLDB4MjQsMHgwMiwweDAwLDB4MDgsMHgxMCwweDgyLDB4MDAsMHgwMywweDMyLDB4MDIsMHgwMCwweDIwLAorMHgwOCwweDAwLDB4MTIsMHhhNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MTcsMHgzYywweDAyLDB4YjAsMHgwNiwKKzB4MzQsMHg0MiwweDgwLDB4MjQsMHg4YywweDQzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg2NywweDAwLDB4ZmYsCisweDEwLDB4ZTAsMHgwMCwweDIzLDB4MDAsMHgwMCwweDg4LDB4MjEsMHg4ZiwweDg1LDB4OGYsMHhkMCwweDAwLDB4NDAsMHgzMCwweDIxLAorMHg5NCwweGEyLDB4MDAsMHgwOCwweDhjLDB4YzMsMHgwMCwweDAwLDB4MjYsMHgzMSwweDAwLDB4MDEsMHgyNCwweDQyLDB4MDAsMHgwMiwKKzB4MzAsMHg0MiwweDAxLDB4ZmYsMHgzNCwweDYzLDB4MDEsMHgwMCwweDAyLDB4MjcsMHgyMCwweDJhLDB4YTQsMHhhMiwweDAwLDB4MDgsCisweDE0LDB4ODAsMHhmZiwweGY3LDB4YWMsMHhjMywweDAwLDB4MDAsMHg4NCwweGEzLDB4MDAsMHgwOCwweDNjLDB4MDIsMHhiMCwweDAzLAorMHgzNCwweDQyLDB4MDAsMHgzMCwweGFjLDB4NDMsMHgwMCwweDAwLDB4MjcsMHg5MiwweGIzLDB4ZjAsMHgyNCwweDExLDB4MDAsMHgxMiwKKzB4OGUsMHg0NCwweDAwLDB4MDAsMHgyNiwweDMxLDB4ZmYsMHhmZiwweDkwLDB4ODIsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4NDAsMHgwMCwweDAzLDB4MjYsMHg1MiwweDAwLDB4MDQsMHgwYywweDAwLDB4MjAsMHhkMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwNiwweDIxLDB4ZmYsMHhmNywweDI0LDB4MDIsMHhmZiwweGRmLDB4MDIsMHgwMiwweDgwLDB4MjQsMHgzYywweDAxLDB4YjAsMHgwMywKKzB4MGMsMHgwMCwweDEzLDB4MTgsMHhhYywweDMwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxMiwweGE0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhmLDB4ODUsMHg4ZiwweGQwLDB4MDgsMHgwMCwweDEyLDB4YmEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHhmZiwweDk1LAorMHgzYywweDAzLDB4YjAsMHgwMywweDAyLDB4MDIsMHg4MCwweDI0LDB4MzQsMHg2MywweDAwLDB4MzAsMHgzYywweDAxLDB4YjAsMHgwMywKKzB4YWMsMHgzMCwweDAwLDB4MDAsMHgwYywweDAwLDB4MTIsMHhlMSwweGFjLDB4NjAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDEyLDB4YTQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzNCwweDQyLDB4MDAsMHg1MCwweDA4LDB4MDAsMHgxMiwweGE0LAorMHhhYywweDQ2LDB4MDAsMHgwMCwweDNjLDB4MGEsMHg4MCwweDAwLDB4MjUsMHg0YSwweDRiLDB4ODQsMHgzYywweDBiLDB4YjAsMHgwMywKKzB4YWQsMHg2YSwweDAwLDB4MjAsMHgzYywweDA4LDB4ODAsMHgwMSwweDI1LDB4MDgsMHgwMCwweDAwLDB4M2MsMHgwOSwweDgwLDB4MDEsCisweDI1LDB4MjksMHgwMywweDFjLDB4MTEsMHgwOSwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MGEsMHg4MCwweDAwLAorMHgyNSwweDRhLDB4NGIsMHhhYywweDNjLDB4MGIsMHhiMCwweDAzLDB4YWQsMHg2YSwweDAwLDB4MjAsMHgzYywweDA4LDB4YjAsMHgwNiwKKzB4MzUsMHgwOCwweDgwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGQsMHgwOSwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzEsMHgyOSwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDEsMHgwMCwweDAxLAorMHgxNSwweDIxLDB4ZmYsMHhmMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwYSwweDgwLDB4MDAsMHgyNSwweDRhLDB4NGIsMHhlOCwKKzB4M2MsMHgwYiwweGIwLDB4MDMsMHhhZCwweDZhLDB4MDAsMHgyMCwweDNjLDB4MDIsMHhiMCwweDAzLDB4OGMsMHg0MywweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzQsMHg2MywweDAwLDB4NDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGFjLDB4NDMsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MGEsMHg4MCwweDAwLDB4MjUsMHg0YSwweDRjLDB4MTQsMHgzYywweDBiLDB4YjAsMHgwMywKKzB4YWQsMHg2YSwweDAwLDB4MjAsMHgzYywweDAyLDB4ODAsMHgwMSwweDI0LDB4NDIsMHgwMCwweDAwLDB4M2MsMHgwMywweDgwLDB4MDEsCisweDI0LDB4NjMsMHgwMywweDFjLDB4M2MsMHgwNCwweGIwLDB4MDAsMHg4YywweDg1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHhhYywweDQ1LDB4MDAsMHgwMCwweDI0LDB4NDIsMHgwMCwweDA0LDB4MjQsMHg4NCwweDAwLDB4MDQsMHgwMCwweDQzLDB4MDgsMHgyYSwKKzB4MTQsMHgyMCwweGZmLDB4ZjksMHgwMCwweDAwLDB4MDAsMHgwMCwweDBjLDB4MDAsMHgxMywweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MGEsMHg4MCwweDAwLDB4MjUsMHg0YSwweDRjLDB4NjAsMHgzYywweDBiLDB4YjAsMHgwMywweGFkLDB4NmEsMHgwMCwweDIwLAorMHgzYywweDAyLDB4ODAsMHgwMSwweDI0LDB4NDIsMHgwMywweDIwLDB4M2MsMHgwMywweDgwLDB4MDEsMHgyNCwweDYzLDB4M2YsMHgxNCwKKzB4YWMsMHg0MCwweDAwLDB4MDAsMHhhYywweDQwLDB4MDAsMHgwNCwweGFjLDB4NDAsMHgwMCwweDA4LDB4YWMsMHg0MCwweDAwLDB4MGMsCisweDI0LDB4NDIsMHgwMCwweDEwLDB4MDAsMHg0MywweDA4LDB4MmEsMHgxNCwweDIwLDB4ZmYsMHhmOSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzYywweDBhLDB4ODAsMHgwMCwweDI1LDB4NGEsMHg0YywweGEwLDB4M2MsMHgwYiwweGIwLDB4MDMsMHhhZCwweDZhLDB4MDAsMHgyMCwKKzB4M2MsMHgxYywweDgwLDB4MDEsMHgyNywweDljLDB4N2YsMHhmMCwweDI3LDB4OWQsMHg4YiwweGQwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI3LDB4OWQsMHg4ZiwweGI4LDB4M2MsMHgwYSwweDgwLDB4MDAsMHgyNSwweDRhLDB4NGMsMHhjNCwweDNjLDB4MGIsMHhiMCwweDAzLAorMHhhZCwweDZhLDB4MDAsMHgyMCwweDQwLDB4ODAsMHg2OCwweDAwLDB4NDAsMHgwOCwweDYwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzUsMHgwOCwweGZmLDB4MDEsMHg0MCwweDg4LDB4NjAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDE1LDB4NjUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHg4NCwweGY4LDB4MDAsMHgzMCwweDg3LDB4MDAsMHgwMywweDAwLDB4MDQsMHgzMCwweDQwLAorMHgwMCwweGM3LDB4MjAsMHgyMywweDNjLDB4MDIsMHhiMCwweDBhLDB4MjcsMHhiZCwweGZmLDB4ZTAsMHgyNCwweDAzLDB4ZmYsMHhmZiwKKzB4MDAsMHg4MiwweDIwLDB4MjEsMHhhZiwweGIxLDB4MDAsMHgxNCwweGFjLDB4ODMsMHgxMCwweDAwLDB4YWYsMHhiZiwweDAwLDB4MTgsCisweGFmLDB4YjAsMHgwMCwweDEwLDB4MDAsMHhhMCwweDg4LDB4MjEsMHgyNCwweDAzLDB4MDAsMHgwMSwweDhjLDB4ODIsMHgxMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDMsMHhmZiwweGZkLDB4MDAsMHhjNywweDEwLDB4MjMsMHgzYywweDAzLDB4YjAsMHgwYSwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHg4YywweDUwLDB4MDAsMHgwMCwweDBjLDB4MDAsMHgxMywweDk1LDB4MDIsMHgyMCwweDIwLDB4MjEsCisweDAyLDB4MTEsMHg4MCwweDI0LDB4MDAsMHg1MCwweDgwLDB4MDYsMHgwMiwweDAwLDB4MTAsMHgyMSwweDhmLDB4YmYsMHgwMCwweDE4LAorMHg3YiwweGIwLDB4MDAsMHhiYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MjAsMHgyNywweGJkLDB4ZmYsMHhkOCwKKzB4YWYsMHhiMiwweDAwLDB4MTgsMHgwMCwweGEwLDB4OTAsMHgyMSwweDI0LDB4MDUsMHhmZiwweGZmLDB4YWYsMHhiMywweDAwLDB4MWMsCisweGFmLDB4YmYsMHgwMCwweDIwLDB4YWYsMHhiMSwweDAwLDB4MTQsMHhhZiwweGIwLDB4MDAsMHgxMCwweDAwLDB4YzAsMHg5OCwweDIxLAorMHgxMiwweDQ1LDB4MDAsMHgyMywweDI0LDB4ODQsMHhmOCwweDAwLDB4MzAsMHg4MywweDAwLDB4MDMsMHgwMCwweDA0LDB4MTAsMHg0MCwKKzB4MDAsMHg0MCwweDg4LDB4MjEsMHgwMCwweDYwLDB4MjAsMHgyMSwweDAwLDB4NDMsMHgxMCwweDIzLDB4M2MsMHgwMywweGIwLDB4MGEsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4YWMsMHg0NSwweDEwLDB4MDAsMHgwMCwweDQwLDB4MTgsMHgyMSwweDI0LDB4MDUsMHgwMCwweDAxLAorMHg4YywweDYyLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0NSwweGZmLDB4ZmQsMHgzYywweDAyLDB4YjAsMHgwYSwKKzB4MDIsMHgyNCwweDg4LDB4MjMsMHgwMiwweDIyLDB4ODgsMHgyMSwweDhlLDB4MzAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDEzLDB4OTUsCisweDAyLDB4NDAsMHgyMCwweDIxLDB4MDAsMHgxMiwweDE4LDB4MjcsMHgwMiwweDAzLDB4ODAsMHgyNCwweDAwLDB4NTMsMHgxMCwweDA0LAorMHgwMiwweDAyLDB4ODAsMHgyNSwweGFlLDB4MzAsMHgwMCwweDAwLDB4MjQsMHgwMywweDAwLDB4MDEsMHg4ZSwweDIyLDB4MTAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQzLDB4ZmYsMHhmZCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHhiZiwweDAwLDB4MjAsCisweDdiLDB4YjIsMHgwMCwweGZjLDB4N2IsMHhiMCwweDAwLDB4YmMsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDI4LAorMHgzMCwweDgyLDB4MDAsMHgwMywweDAwLDB4MDQsMHgxOCwweDQwLDB4MDAsMHg2MiwweDE4LDB4MjMsMHgzYywweDA0LDB4YjAsMHgwYSwKKzB4MDAsMHg2NCwweDE4LDB4MjEsMHhhYywweDY2LDB4MDAsMHgwMCwweDI0LDB4MDQsMHgwMCwweDAxLDB4OGMsMHg2MiwweDEwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0NCwweGZmLDB4ZmQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxMywweDgzLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxOCwweDIxLDB4MDAsMHg2NCwweDEwLDB4MDYsMHgzMCwweDQyLDB4MDAsMHgwMSwKKzB4MTQsMHg0MCwweDAwLDB4MDUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NjMsMHgwMCwweDAxLDB4MmMsMHg2MiwweDAwLDB4MjAsCisweDE0LDB4NDAsMHhmZiwweGY5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4NjAsMHgxMCwweDIxLAorMHgyNywweGJkLDB4ZmYsMHhlMCwweDNjLDB4MDMsMHhiMCwweDA1LDB4YWYsMHhiMiwweDAwLDB4MTgsMHhhZiwweGIxLDB4MDAsMHgxNCwKKzB4YWYsMHhiMCwweDAwLDB4MTAsMHhhZiwweGJmLDB4MDAsMHgxYywweDAwLDB4ODAsMHg5MCwweDIxLDB4MDAsMHhhMCwweDgwLDB4MjEsCisweDAwLDB4YzAsMHg4OCwweDIxLDB4MzQsMHg2MywweDAyLDB4MmUsMHg5MCwweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzMCwweDQyLDB4MDAsMHgwMSwweDE0LDB4NDAsMHhmZiwweGZjLDB4MjQsMHgwNCwweDA4LDB4MjQsMHgzYywweDA1LDB4MDAsMHhjMCwKKzB4MGMsMHgwMCwweDEzLDB4NWIsMHgyNCwweDA2LDB4MDAsMHgwMywweDI0LDB4MDQsMHgwOCwweDM0LDB4M2MsMHgwNSwweDAwLDB4YzAsCisweDBjLDB4MDAsMHgxMywweDViLDB4MjQsMHgwNiwweDAwLDB4MDMsMHgzYywweDAyLDB4YzAsMHgwMCwweDAwLDB4MTAsMHgxYywweDAwLAorMHgzNCwweDQyLDB4MDQsMHgwMCwweDNjLDB4MDQsMHhiMCwweDA1LDB4M2MsMHgwNSwweGIwLDB4MDUsMHgyNCwweDYzLDB4MTYsMHgwOSwKKzB4MDIsMHgyMiwweDEwLDB4MjEsMHgzNCwweDg0LDB4MDQsMHgyMCwweDM0LDB4YTUsMHgwNCwweDI0LDB4M2MsMHgwNiwweGIwLDB4MDUsCisweGFjLDB4ODMsMHgwMCwweDAwLDB4MjQsMHgwNywweDAwLDB4MDEsMHhhYywweGEyLDB4MDAsMHgwMCwweDM0LDB4YzYsMHgwMiwweDI4LAorMHgyNCwweDAyLDB4MDAsMHgyMCwweGFlLDB4NDcsMHgwMCwweDNjLDB4MjQsMHgwNCwweDA4LDB4MjQsMHhhMCwweGMyLDB4MDAsMHgwMCwKKzB4M2MsMHgwNSwweDAwLDB4YzAsMHhhMiwweDQ3LDB4MDAsMHgxMSwweDBjLDB4MDAsMHgxMywweDViLDB4MjQsMHgwNiwweDAwLDB4MDEsCisweDI0LDB4MDQsMHgwOCwweDM0LDB4M2MsMHgwNSwweDAwLDB4YzAsMHgwYywweDAwLDB4MTMsMHg1YiwweDI0LDB4MDYsMHgwMCwweDAxLAorMHg4ZiwweGJmLDB4MDAsMHgxYywweDhmLDB4YjIsMHgwMCwweDE4LDB4N2IsMHhiMCwweDAwLDB4YmMsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4MjcsMHhiZCwweDAwLDB4MjAsMHgyNCwweDAyLDB4MDAsMHgwNiwweGFjLDB4ODIsMHgwMCwweDBjLDB4YTAsMHg4MCwweDAwLDB4NTAsCisweGFjLDB4ODAsMHgwMCwweDAwLDB4YWMsMHg4MCwweDAwLDB4MDQsMHhhYywweDgwLDB4MDAsMHgwOCwweGFjLDB4ODAsMHgwMCwweDE0LAorMHhhYywweDgwLDB4MDAsMHgxOCwweGFjLDB4ODAsMHgwMCwweDFjLDB4YTQsMHg4MCwweDAwLDB4MjAsMHhhYywweDgwLDB4MDAsMHgyNCwKKzB4YWMsMHg4MCwweDAwLDB4MjgsMHhhYywweDgwLDB4MDAsMHgyYywweGEwLDB4ODAsMHgwMCwweDMwLDB4YTAsMHg4MCwweDAwLDB4MzEsCisweGFjLDB4ODAsMHgwMCwweDM0LDB4YWMsMHg4MCwweDAwLDB4MzgsMHhhMCwweDgwLDB4MDAsMHgzYywweGFjLDB4ODIsMHgwMCwweDEwLAorMHhhMCwweDgwLDB4MDAsMHg0NCwweGFjLDB4ODAsMHgwMCwweDQ4LDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhYywweDgwLDB4MDAsMHg0YywKKzB4M2MsMHgwNCwweGIwLDB4MDYsMHgzNCwweDg0LDB4ODAsMHgwMCwweDhjLDB4ODMsMHgwMCwweDAwLDB4M2MsMHgwMiwweDEyLDB4MDAsCisweDNjLDB4MDUsMHhiMCwweDAzLDB4MDAsMHg2MiwweDE4LDB4MjUsMHgzNCwweGE1LDB4MDAsMHg4YiwweDI0LDB4MDIsMHhmZiwweDgwLAorMHhhYywweDgzLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4YTAsMHhhMiwweDAwLDB4MDAsMHgzYywweDA0LDB4YjAsMHgwMywKKzB4MzQsMHg4NCwweDAwLDB4MGIsMHgyNCwweDAyLDB4MDAsMHgyMiwweDNjLDB4MDUsMHhiMCwweDAxLDB4M2MsMHgwNiwweDQ1LDB4NjcsCisweDNjLDB4MGEsMHhiMCwweDA5LDB4YTAsMHg4MiwweDAwLDB4MDAsMHgzNCwweGE1LDB4MDAsMHgwNCwweDM0LDB4YzYsMHg4OSwweGFhLAorMHgzNSwweDRhLDB4MDAsMHgwNCwweDI0LDB4MDIsMHgwMSwweDIzLDB4M2MsMHgwYiwweGIwLDB4MDksMHgzYywweDA3LDB4MDEsMHgyMywKKzB4M2MsMHgwYywweGIwLDB4MDksMHgzYywweDAxLDB4YjAsMHgwMSwweGFjLDB4MjAsMHgwMCwweDAwLDB4MjcsMHhiZCwweGZmLDB4ZTAsCisweGFjLDB4YTAsMHgwMCwweDAwLDB4MzUsMHg2YiwweDAwLDB4MDgsMHgzYywweDAxLDB4YjAsMHgwOSwweGFjLDB4MjYsMHgwMCwweDAwLAorMHgzNCwweGU3LDB4NDUsMHg2NiwweGE1LDB4NDIsMHgwMCwweDAwLDB4MzUsMHg4YywweDAwLDB4MGMsMHgyNCwweDAyLDB4Y2QsMHhlZiwKKzB4M2MsMHgwZCwweGIwLDB4MDksMHgzYywweDA4LDB4Y2QsMHhlZiwweDNjLDB4MGUsMHhiMCwweDA5LDB4YWQsMHg2NywweDAwLDB4MDAsCisweGFmLDB4YjcsMHgwMCwweDFjLDB4YTUsMHg4MiwweDAwLDB4MDAsMHhhZiwweGI2LDB4MDAsMHgxOCwweGFmLDB4YjUsMHgwMCwweDE0LAorMHhhZiwweGI0LDB4MDAsMHgxMCwweGFmLDB4YjMsMHgwMCwweDBjLDB4YWYsMHhiMiwweDAwLDB4MDgsMHhhZiwweGIxLDB4MDAsMHgwNCwKKzB4YWYsMHhiMCwweDAwLDB4MDAsMHgzNSwweGFkLDB4MDAsMHgxMCwweDM1LDB4MDgsMHgwMSwweDIyLDB4MzUsMHhjZSwweDAwLDB4MTQsCisweDI0LDB4MDIsMHg4OSwweGFiLDB4M2MsMHgwZiwweGIwLDB4MDksMHgzYywweDA5LDB4ODksMHhhYiwweDNjLDB4MTAsMHhiMCwweDA5LAorMHgzYywweDExLDB4YjAsMHgwOSwweDNjLDB4MTIsMHhiMCwweDA5LDB4M2MsMHgxMywweGIwLDB4MDksMHgzYywweDE0LDB4YjAsMHgwOSwKKzB4M2MsMHgxNSwweGIwLDB4MDksMHgzYywweDE2LDB4YjAsMHgwOSwweDNjLDB4MTcsMHhiMCwweDA5LDB4YWQsMHhhOCwweDAwLDB4MDAsCisweDI0LDB4MDMsMHhmZiwweGZmLDB4YTUsMHhjMiwweDAwLDB4MDAsMHgzNSwweGVmLDB4MDAsMHgxOCwweDM1LDB4MjksMHhjZCwweGVlLAorMHgzNiwweDEwLDB4MDAsMHgxYywweDM2LDB4MzEsMHgwMCwweDIwLDB4MzYsMHg1MiwweDAwLDB4MjQsMHgzNiwweDczLDB4MDAsMHgyOCwKKzB4MzYsMHg5NCwweDAwLDB4MmMsMHgzNiwweGI1LDB4MDAsMHgzMCwweDM2LDB4ZDYsMHgwMCwweDM0LDB4MzYsMHhmNywweDAwLDB4MzgsCisweDI0LDB4MDIsMHg0NSwweDY3LDB4YWQsMHhlOSwweDAwLDB4MDAsMHhhNiwweDAyLDB4MDAsMHgwMCwweGFlLDB4MjMsMHgwMCwweDAwLAorMHg4ZiwweGIwLDB4MDAsMHgwMCwweGE2LDB4NDMsMHgwMCwweDAwLDB4OGYsMHhiMSwweDAwLDB4MDQsMHhhZSwweDYzLDB4MDAsMHgwMCwKKzB4OGYsMHhiMiwweDAwLDB4MDgsMHhhNiwweDgzLDB4MDAsMHgwMCwweDhmLDB4YjMsMHgwMCwweDBjLDB4YWUsMHhhMywweDAwLDB4MDAsCisweDhmLDB4YjQsMHgwMCwweDEwLDB4YTYsMHhjMywweDAwLDB4MDAsMHg4ZiwweGI1LDB4MDAsMHgxNCwweGFlLDB4ZTMsMHgwMCwweDAwLAorMHg3YiwweGI2LDB4MDAsMHhmYywweDNjLDB4MTgsMHhiMCwweDA5LDB4MzcsMHgxOCwweDAwLDB4M2MsMHhhNywweDAzLDB4MDAsMHgwMCwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgyMCwweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsCisweDM0LDB4NjMsMHgwMCwweDIwLDB4MjQsMHg0MiwweDUxLDB4MzgsMHhhYywweDYyLDB4MDAsMHgwMCwweDhjLDB4ODMsMHgwMCwweDM0LAorMHgzNCwweDAyLDB4ZmYsMHhmZiwweDAwLDB4NDMsMHgxMCwweDJhLDB4MTQsMHg0MCwweDAxLDB4MGIsMHgwMCwweDgwLDB4MzAsMHgyMSwKKzB4OGMsMHg4NCwweDAwLDB4MDgsMHgyNCwweDAyLDB4MDAsMHgwMywweDEwLDB4ODIsMHgwMCwweGZlLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhjLDB4YzIsMHgwMCwweDJjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHg0NywweDI0LDB4MDIsMHgwMCwweDA2LAorMHgzYywweDAzLDB4YjAsMHgwNSwweDM0LDB4NjMsMHgwNCwweDUwLDB4OTAsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg0MiwweDAwLDB4ZmYsMHgxNCwweDQwLDB4MDAsMHhlNCwweGFjLDB4YzIsMHgwMCwweDJjLDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDEwLDB4ODIsMHgwMCwweGUzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4ODIsMHgwMCwweGQxLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDhjLDB4YzcsMHgwMCwweDA0LDB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweGUyLDB4MDAsMHhjNywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg4YywweGMyLDB4MDAsMHgxNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweDAwLDB4MDksCisweDI0LDB4MDIsMHgwMCwweDAxLDB4M2MsMHgwMywweGIwLDB4MDksMHgzNCwweDYzLDB4MDEsMHg2MCwweDkwLDB4NjIsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweGZmLDB4MTAsMHg0MCwweDAwLDB4MDUsMHhhYywweGMyLDB4MDAsMHgxNCwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHhhYywweGMyLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4YWMsMHhjMCwweDAwLDB4MTQsCisweDNjLDB4MDIsMHhiMCwweDAzLDB4MzQsMHg0MiwweDAwLDB4ZDAsMHg4YywweDQzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwNCwweDYxLDB4MDAsMHgxNiwweDNjLDB4MDMsMHhiMCwweDA1LDB4MzQsMHg2MywweDAyLDB4MmUsMHg5MCwweDYyLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHgwMSwweDE0LDB4NDAsMHgwMCwweDEwLDB4M2MsMHgwMiwweGIwLDB4MDUsCisweDM0LDB4NDIsMHgwMiwweDQyLDB4OTAsMHg0MywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NjAsMHgwMCwweDBiLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDgwLDB4YzIsMHgwMCwweDUwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgwNywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDgwLDB4MDAsMHgwNSwweDI0LDB4MDIsMHgwMCwweDBlLDB4MjQsMHgwMywweDAwLDB4MDEsCisweGFjLDB4YzIsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhMCwweGMzLDB4MDAsMHg1MCwweDgwLDB4YzIsMHgwMCwweDMxLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDBhLDB4M2MsMHgwMiwweGIwLDB4MDYsMHgzNCwweDQyLDB4ODAsMHgxOCwKKzB4OGMsMHg0MywweDAwLDB4MDAsMHgzYywweDA0LDB4ZjAsMHgwMCwweDNjLDB4MDIsMHg4MCwweDAwLDB4MDAsMHg2NCwweDE4LDB4MjQsCisweDEwLDB4NjIsMHgwMCwweDAzLDB4MjQsMHgwMiwweDAwLDB4MDksMHgwMywweGUwLDB4MDAsMHgwOCwweGFjLDB4YzIsMHgwMCwweDAwLAorMHg4YywweGMyLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGMsMHg0MywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTAsMHg2MCwweDAwLDB4MDksMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHhiMCwweDA1LDB4MzQsMHg0MiwweDAyLDB4MmMsCisweDhjLDB4NDMsMHgwMCwweDAwLDB4M2MsMHgwNCwweDAwLDB4MDIsMHgwMCwweDY0LDB4MTgsMHgyNCwweDE0LDB4NjAsMHhmZiwweGYyLAorMHgyNCwweDAyLDB4MDAsMHgxMCwweDNjLDB4MDMsMHhiMCwweDAzLDB4MzQsMHg2MywweDAyLDB4MDEsMHg5MCwweDYyLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHg4MCwweDEwLDB4NDAsMHgwMCwweDBlLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhjLDB4YzMsMHgwMCwweDBjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhhYywweGMzLDB4MDAsMHgxMCwweDNjLDB4MDIsMHhiMCwweDAzLAorMHg5MCwweDQyLDB4MDIsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4MGYsMHhhYywweGMyLDB4MDAsMHgwYywKKzB4OTAsMHhjMywweDAwLDB4MGYsMHgyNCwweDAyLDB4MDAsMHgwZCwweDNjLDB4MDEsMHhiMCwweDAzLDB4MDgsMHgwMCwweDE0LDB4YTYsCisweGEwLDB4MjMsMHgwMiwweDAxLDB4M2MsMHgwMiwweGIwLDB4MDksMHgzNCwweDQyLDB4MDEsMHg4MCwweDkwLDB4NDQsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgxZSwweDAwLDB4MDAsMHgwMywweDFlLDB4MDMsMHgxMCwweDYwLDB4MDAsMHgxNSwKKzB4YTAsMHhjNCwweDAwLDB4NDQsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4NjIsMHgwMCwweDBiLDB4MjQsMHgwMiwweDAwLDB4MDIsCisweDEwLDB4NjIsMHgwMCwweDAzLDB4MjQsMHgwMywweDAwLDB4MGQsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4YywweGMyLDB4MDAsMHgwYywweGFjLDB4YzMsMHgwMCwweDAwLDB4MjQsMHgwMywweDAwLDB4MDQsMHhhYywweGMyLDB4MDAsMHgxMCwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHhhYywweGMzLDB4MDAsMHgwYywweDI0LDB4MDIsMHgwMCwweDBkLDB4YWMsMHhjMiwweDAwLDB4MDAsCisweDI0LDB4MDMsMHgwMCwweDA0LDB4MjQsMHgwMiwweDAwLDB4MDYsMHhhYywweGMzLDB4MDAsMHgxMCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHhhYywweGMyLDB4MDAsMHgwYywweDhjLDB4YzMsMHgwMCwweDM4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyYywweDYyLDB4MDAsMHgwNiwKKzB4MTAsMHg0MCwweDAwLDB4MmUsMHgwMCwweDAzLDB4MTAsMHg4MCwweDNjLDB4MDMsMHg4MCwweDAxLDB4MjQsMHg2MywweDAyLDB4MDAsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4OGMsMHg0NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODAsMHgwMCwweDA4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhlMiwweDAwLDB4MDYsMHgyNCwweDAyLDB4MDAsMHgwMywKKzB4OGMsMHhhMiwweDAyLDB4YmMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDA2LDB4M2MsMHgwMywweGIwLDB4MDYsCisweDI0LDB4MDIsMHgwMCwweDAyLDB4YWMsMHhjMiwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHhhYywweGMyLDB4MDAsMHgzOCwweDM0LDB4NjMsMHg4MCwweDI0LDB4OGMsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg0MiwweDAwLDB4ZmYsMHgxMCwweDQwLDB4MDAsMHgwNSwweGFjLDB4YzIsMHgwMCwweDE4LDB4MjQsMHgwMiwweDAwLDB4MDIsCisweGFjLDB4YzIsMHgwMCwweDAwLDB4MDgsMHgwMCwweDE0LDB4ZmEsMHhhYywweGMwLDB4MDAsMHgxOCwweDA4LDB4MDAsMHgxNCwweGZhLAorMHhhYywweGMwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLDB4MjQsMHgwMywweDAwLDB4MGIsMHhhYywweGMyLDB4MDAsMHgzOCwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHhhYywweGMzLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhlMiwweDAwLDB4MDUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MGMsMHhhYywweGMyLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxNCwweGZiLAorMHgyNCwweDAyLDB4MDAsMHgwNCwweDA4LDB4MDAsMHgxNSwweDEyLDB4MjQsMHgwMiwweDAwLDB4MDMsMHhhYywweGMwLDB4MDAsMHgzOCwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHhhYywweGMwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhlMiwweDAwLDB4MDUsCisweDI0LDB4MDIsMHgwMCwweDAzLDB4ODAsMHhjMiwweDAwLDB4MzAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDA4LAorMHgyNCwweDAyLDB4MDAsMHgwNCwweGFjLDB4YzIsMHgwMCwweDAwLDB4OTMsMHg4MiwweDg2LDB4M2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTQsMHg0MCwweGZmLDB4ZDYsMHgyNCwweDAyLDB4MDAsMHgwNSwweDAzLDB4ZTAsMHgwMCwweDA4LDB4YWMsMHhjMCwweDAwLDB4MzgsCisweDA4LDB4MDAsMHgxNSwweDIyLDB4YWMsMHhjMCwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwNiwweDM0LDB4NDIsMHg4MCwweDE4LAorMHg4YywweDQzLDB4MDAsMHgwMCwweDNjLDB4MDQsMHhmMCwweDAwLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgwMCwweDY0LDB4MTgsMHgyNCwKKzB4MTAsMHg2MiwweDAwLDB4MDMsMHgyNCwweDAyLDB4MDAsMHgwOSwweDA4LDB4MDAsMHgxNSwweDI2LDB4YWMsMHhjMiwweDAwLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDA1LDB4MDgsMHgwMCwweDE1LDB4MTgsMHhhYywweGMyLDB4MDAsMHgzOCwweDgwLDB4YzIsMHgwMCwweDMwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHhmZiwweDM3LDB4MjQsMHgwMiwweDAwLDB4MDQsMHgwOCwweDAwLDB4MTQsMHhhNiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg4NCwweGMyLDB4MDAsMHgyMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweGZmLDB4NjYsCisweDI0LDB4MDIsMHgwMCwweDA2LDB4M2MsMHgwMiwweGIwLDB4MDUsMHgzNCwweDQyLDB4MDIsMHgyZSwweDkwLDB4NDMsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NjMsMHgwMCwweDAxLDB4MzAsMHg2MywweDAwLDB4ZmYsMHgwMCwweDYwLDB4MTAsMHgyMSwKKzB4MTQsMHg0MCwweGZmLDB4MjQsMHhhNCwweGMzLDB4MDAsMHgyMCwweDA4LDB4MDAsMHgxNCwweGE2LDB4MjQsMHgwMiwweDAwLDB4MDYsCisweDhjLDB4YzIsMHgwMCwweDFjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4ZmYsMHg1NywweDI0LDB4MDIsMHgwMCwweDA1LAorMHgzYywweDAzLDB4YjAsMHgwNSwweDM0LDB4NjMsMHgwMiwweDJjLDB4OGMsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg0MiwweDAwLDB4ZmYsMHgxMCwweDQwLDB4ZmYsMHgxNCwweGFjLDB4YzIsMHgwMCwweDFjLDB4MDgsMHgwMCwweDE0LDB4YTYsCisweDI0LDB4MDIsMHgwMCwweDA1LDB4M2MsMHgwMiwweGIwLDB4MDUsMHg4YywweDQyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAyLDB4MTcsMHg0MiwweDMwLDB4NDIsMHgwMCwweDAxLDB4MTQsMHg0MCwweGZmLDB4NDcsMHgyNCwweDAyLDB4MDAsMHgwNiwKKzB4MDgsMHgwMCwweDE0LDB4NWMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDBhLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweGFjLDB4ODIsMHgwMCwweDAwLDB4MjcsMHhiZCwweGZmLDB4ZDgsMHhhZiwweGIwLDB4MDAsMHgxMCwweDI3LDB4OTAsMHg4NiwweDQ4LAorMHhhZiwweGJmLDB4MDAsMHgyMCwweGFmLDB4YjMsMHgwMCwweDFjLDB4YWYsMHhiMiwweDAwLDB4MTgsMHgwYywweDAwLDB4MmIsMHhlOCwKKzB4YWYsMHhiMSwweDAwLDB4MTQsMHhhZiwweDkwLDB4OGYsMHhkMCwweDQ4LDB4MDIsMHgwMCwweDAwLDB4MGMsMHgwMCwweDEzLDB4ZWMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDE4LDB4NGUsMHgwMiwweDAwLDB4MjAsMHgyMSwweDBjLDB4MDAsMHgwMCwweDM0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDBjLDB4MDAsMHgxMywweGY3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDg0LDB4ODQsMHg2OCwKKzB4MGMsMHgwMCwweDI3LDB4YzEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDkzLDB4ODQsMHg4MCwweDEwLDB4MGMsMHgwMCwweDIxLDB4OWEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsMHg4NCwweDg5LDB4MDgsMHgwYywweDAwLDB4MDYsMHhlMSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwYywweDAwLDB4MDEsMHgzYiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsMHg4NCwweDg0LDB4MTAsMHgwYywweDAwLDB4MTMsMHhkNSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDgyLDB4ODksMHgzYywweGFmLDB4ODIsMHg4NCwweDUwLDB4MGMsMHgwMCwweDAwLDB4NjEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzNCwweDYzLDB4MDEsMHgwOCwweDNjLDB4MDQsMHhiMCwweDA5LAorMHgzYywweDA1LDB4YjAsMHgwOSwweDhjLDB4NjYsMHgwMCwweDAwLDB4MzQsMHg4NCwweDAxLDB4NjgsMHgyNCwweDAyLDB4YzgsMHg4MCwKKzB4MzQsMHhhNSwweDAxLDB4NDAsMHgyNCwweDAzLDB4MDAsMHgwYSwweGE0LDB4ODIsMHgwMCwweDAwLDB4YTQsMHhhMywweDAwLDB4MDAsCisweDNjLDB4MDQsMHhiMCwweDAzLDB4OGMsMHg4MiwweDAwLDB4MDAsMHg4ZiwweDg3LDB4ODQsMHgxMCwweGFmLDB4ODYsMHg4NCwweDA4LAorMHgzNCwweDQyLDB4MDAsMHgyMCwweGFjLDB4ODIsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzNCwweDQyLDB4MDAsMHg1OCwKKzB4OGMsMHg0MywweDAwLDB4MDAsMHgyYywweGU0LDB4MDAsMHgxMSwweDM0LDB4NjMsMHgwMSwweDAwLDB4YWMsMHg0MywweDAwLDB4MDAsCisweDEwLDB4ODAsMHhmZiwweGZhLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzYywweDAzLDB4ODAsMHgwMSwweDAwLDB4MDcsMHgxMCwweDgwLAorMHgyNCwweDYzLDB4MDIsMHgxOCwweDAwLDB4NDMsMHgxMCwweDIxLDB4OGMsMHg0NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHg4MCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4ODQsMHg4NCwweDY4LDB4MGMsMHgwMCwweDI2LDB4ZTUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsMHg4NCwweDg0LDB4MTAsMHgyNywweDg1LDB4ODYsMHg0OCwweDBjLDB4MDAsMHgxNCwweDRlLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDIsMHhiMCwweDA5LDB4MzQsMHg0MiwweDAwLDB4MDcsMHgzYywweDAzLDB4YjAsMHgwNiwKKzB4OTAsMHg0NCwweDAwLDB4MDAsMHgzNCwweDYzLDB4ODAsMHgxOCwweDhjLDB4NjUsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDM0LDB4NDIsMHgwMCwweGVjLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzMCwweDg2LDB4MDAsMHhmZiwweGEwLDB4NDYsMHgwMCwweDAwLAorMHgwMCwweDA1LDB4MmYsMHgwMiwweDM0LDB4NjMsMHgwMCwweGVkLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweGMyLDB4MDAsMHgyYywKKzB4YTAsMHg2NSwweDAwLDB4MDAsMHhhMywweDgwLDB4ODEsMHg1OCwweDkzLDB4ODMsMHg4MSwweGYxLDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDEwLDB4NjIsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweDg3LDB4ODQsMHgxMCwweDhmLDB4ODIsMHg4NCwweDQ0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NDIsMHgwMCwweDAxLDB4YWYsMHg4MiwweDg0LDB4NDQsMHgwOCwweDAwLDB4MTUsMHg5YiwKKzB4M2MsMHgwMiwweGIwLDB4MDMsMHg4ZiwweDg3LDB4ODQsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHhlMiwweGZmLDB4ZmMsCisweDJjLDB4NDIsMHgwMCwweDAzLDB4MTQsMHg0MCwweDAwLDB4MGEsMHgzYywweDAzLDB4YjAsMHgwNiwweDkzLDB4ODIsMHg4NiwweDNjLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDA3LDB4MzQsMHg2MywweDgwLDB4MTgsMHgyNywweDg0LDB4ODQsMHg2OCwKKzB4MGMsMHgwMCwweDI3LDB4NzUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4ODcsMHg4NCwweDEwLDB4M2MsMHgwMywweGIwLDB4MDYsCisweDM0LDB4NjMsMHg4MCwweDE4LDB4OGMsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgxNywweDAyLAorMHgxMCwweDQwLDB4ZmYsMHhlNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHg4MiwweGJjLDB4MTAsMHg4ZiwweDg0LDB4YmMsMHgxOCwKKzB4M2MsMHgwNSwweGIwLDB4MDEsMHgwMCwweDQ1LDB4MTAsMHgyMSwweGFjLDB4NDQsMHgwMCwweDAwLDB4OGYsMHg4MywweGJjLDB4MTAsCisweDhmLDB4ODIsMHhiYywweDE0LDB4MDAsMHg2NSwweDE4LDB4MjEsMHgwOCwweDAwLDB4MTUsMHhjNywweGFjLDB4NjIsMHgwMCwweDA0LAorMHgxNCwweGEwLDB4ZmYsMHhkNCwweDNjLDB4MDIsMHhiMCwweDAzLDB4OTMsMHg4MywweDgxLDB4NTgsMHgzNCwweDQyLDB4MDAsMHhlZSwKKzB4MjQsMHg2MywweDAwLDB4MDEsMHgzMCwweDY0LDB4MDAsMHhmZiwweDJjLDB4ODQsMHgwMCwweGYxLDB4YTAsMHg0MywweDAwLDB4MDAsCisweGEzLDB4ODMsMHg4MSwweDU4LDB4MTQsMHg4MCwweGZmLDB4Y2MsMHgwMCwweDAwLDB4MDAsMHgwMCwweGFmLDB4ODYsMHg4NCwweDI0LAorMHhhMywweDg2LDB4ODYsMHgyMywweDA4LDB4MDAsMHgxNSwweGMxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDg0LDB4ODQsMHg2OCwKKzB4MGMsMHgwMCwweDI5LDB4NmUsMHgwMCwweDAwLDB4MDAsMHgwMCwweGEzLDB4ODIsMHg4NCwweDQxLDB4OGYsMHg4MiwweDg0LDB4NDQsCisweGFmLDB4ODAsMHg4NCwweDEwLDB4MjQsMHg0MiwweDAwLDB4MDEsMHhhZiwweDgyLDB4ODQsMHg0NCwweDA4LDB4MDAsMHgxNSwweDlhLAorMHgwMCwweDAwLDB4MzgsMHgyMSwweDI3LDB4ODQsMHg4NiwweDQ4LDB4MGMsMHgwMCwweDE5LDB4MTksMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg0MiwweDAwLDB4ZmYsMHgxNCwweDQwLDB4MDAsMHgwNSwweDNjLDB4MDMsMHhiMCwweDA1LDB4YWYsMHg4MCwweDg0LDB4MTAsCisweGFmLDB4ODAsMHg4NCwweDE0LDB4MDgsMHgwMCwweDE1LDB4YzYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDM0LDB4NjMsMHgwNCwweDUwLAorMHg5MCwweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4ZmYsMHhhZiwweDgyLDB4ODQsMHgzYywKKzB4MTQsMHg0MCwweDAwLDB4MjAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDhmLDB4ODQsMHg4NCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4ODIsMHgwMCwweDIwLDB4M2MsMHgwMywweGIwLDB4MDksMHgzNCwweDYzLDB4MDEsMHg2MCwweDkwLDB4NjIsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweGZmLDB4YWYsMHg4MiwweDg0LDB4MjQsMHgxNCwweDQwLDB4MDAsMHgxNSwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4ODIsMHgwMCwweDA3LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4MDcsMHgwMCwweDAzLDB4MjQsMHgwMiwweDAwLDB4MDEsMHhhZiwweDgyLDB4ODQsMHgxNCwweGFmLDB4ODcsMHg4NCwweDEwLAorMHgwOCwweDAwLDB4MTUsMHhjNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDUsMHgzNCwweDQyLDB4MDIsMHgyZSwKKzB4OTAsMHg0MywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NjMsMHgwMCwweDAxLDB4MzAsMHg2MywweDAwLDB4ZmYsCisweDAwLDB4NjAsMHgxMCwweDIxLDB4YTcsMHg4MywweDg0LDB4MzAsMHgxNCwweDQwLDB4ZmYsMHhmMSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweGFmLDB4ODIsMHg4NCwweDE0LDB4YWYsMHg4MCwweDg0LDB4MTAsMHgwOCwweDAwLDB4MTUsMHhjNiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwNSwweDM0LDB4NjMsMHgwMiwweDJjLDB4OGMsMHg2MiwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4ZmYsMHhhZiwweDgyLDB4ODQsMHgyYywweDE0LDB4NDAsMHhmZiwweGY1LAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDA4LDB4MDAsMHgxNiwweDFhLDB4M2MsMHgwMywweGIwLDB4MDksMHgyNywweDg0LDB4ODYsMHg0OCwKKzB4MGMsMHgwMCwweDFhLDB4ZGUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDgzLDB4ODIsMHg4NCwweDQwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDE0LDB4NDAsMHhmZiwweGVjLDB4MjQsMHgwMiwweDAwLDB4MDIsMHgzYywweDAzLDB4YjAsMHgwNSwweDM0LDB4NjMsMHgwNCwweDUwLAorMHg5MCwweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4ZmYsMHhhZiwweDgyLDB4ODQsMHgzYywKKzB4MTQsMHg0MCwweGZmLDB4ZTQsMHgyNCwweDAyLDB4MDAsMHgwMiwweDhmLDB4ODQsMHg4NCwweDE4LDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDEwLDB4ODIsMHgwMCwweDEyLDB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweDgyLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDA3LDB4MDAsMHgwNCwweDA4LDB4MDAsMHgxNiwweDI2LDB4MjQsMHgwMiwweDAwLDB4MDIsMHgzYywweDAyLDB4YjAsMHgwNSwKKzB4MzQsMHg0MiwweDAyLDB4MmUsMHg5MCwweDQzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg2MywweDAwLDB4MDEsCisweDMwLDB4NjMsMHgwMCwweGZmLDB4MDAsMHg2MCwweDEwLDB4MjEsMHhhNywweDgzLDB4ODQsMHgzMCwweDE0LDB4NDAsMHhmZiwweGY0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxNiwweDM1LDB4MjQsMHgwMiwweDAwLDB4MDIsMHgzYywweDAzLDB4YjAsMHgwNSwKKzB4MzQsMHg2MywweDAyLDB4MmMsMHg4YywweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4ZmYsCisweGFmLDB4ODIsMHg4NCwweDJjLDB4MTQsMHg0MCwweGZmLDB4ZjcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxNiwweDU2LAorMHgyNCwweDAyLDB4MDAsMHgwMiwweDI3LDB4ODQsMHg4OSwweDA4LDB4MGMsMHgwMCwweDBiLDB4NTEsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGYsMHg4MywweDg0LDB4MTQsMHhhZiwweDgyLDB4ODQsMHgyYywweDM4LDB4NjQsMHgwMCwweDAyLDB4MDAsMHgwNCwweDE4LDB4MGEsCisweGFmLDB4ODMsMHg4NCwweDE0LDB4MTQsMHg0MCwweGZmLDB4YWQsMHgyNCwweDA3LDB4MDAsMHgwNSwweDhmLDB4ODIsMHg4OSwweDQ4LAorMHhhZiwweDgwLDB4ODQsMHgxMCwweDEwLDB4NDAsMHgwMCwweDAyLDB4MjQsMHgwNCwweDAwLDB4MDEsMHhhZiwweDg0LDB4ODQsMHgxOCwKKzB4OTMsMHg4MiwweDg5LDB4NTYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHhmZiwweDQzLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MDIsMHhiMCwweDA1LDB4MzQsMHg0MiwweDAwLDB4MDgsMHg4YywweDQzLDB4MDAsMHgwMCwweDNjLDB4MDQsMHgyMCwweDAwLAorMHgwMCwweDY0LDB4MTgsMHgyNCwweDEwLDB4NjAsMHhmZiwweDNjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4MzQsMHg0MiwweDAwLDB4YTAsMHg4YywweDQzLDB4MDAsMHgwMCwweDNjLDB4MDQsMHg4MCwweDAwLDB4YWYsMHg4MCwweDg5LDB4MzAsCisweDI0LDB4NjMsMHgwMCwweDAxLDB4YWMsMHg0MywweDAwLDB4MDAsMHgzYywweDAxLDB4YjAsMHgwNSwweGFjLDB4MjQsMHgwMCwweDA4LAorMHhhZiwweDgwLDB4ODksMHgyYywweGFmLDB4ODAsMHg4OSwweDM0LDB4YWYsMHg4MCwweDg5LDB4MzgsMHhhZiwweDgwLDB4ODksMHg0NCwKKzB4YWYsMHg4MCwweDg5LDB4M2MsMHgwOCwweDAwLDB4MTUsMHhjNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODMsMHg4MiwweDg0LDB4NjAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MDIsMHgyNCwweDAyLDB4MDAsMHgyMCwweGFmLDB4ODIsMHg4NCwweDJjLAorMHg4ZiwweDg1LDB4ODQsMHgyYywweDI3LDB4ODQsMHg4OSwweDA4LDB4MGMsMHgwMCwweDBkLDB4MmMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMiwweDFlLDB4MDAsMHhhMywweDgyLDB4ODQsMHg0MCwweGFmLDB4ODAsMHg4NCwweDJjLDB4MTAsMHg2MCwweGZmLDB4OGUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDUsMHgzNCwweDQyLDB4MDIsMHgyZSwweDkwLDB4NDMsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NjMsMHgwMCwweDAxLDB4MzAsMHg2MywweDAwLDB4ZmYsMHgwMCwweDYwLDB4MTAsMHgyMSwKKzB4YTcsMHg4MywweDg0LDB4MzAsMHgxMCwweDQwLDB4MDAsMHgwNCwweDI0LDB4MDQsMHgwMCwweDAyLDB4YWYsMHg4NCwweDg0LDB4MTgsCisweDA4LDB4MDAsMHgxNiwweDM2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MTYsMHgyNywweDI0LDB4MDcsMHgwMCwweDA2LAorMHgyNywweDg0LDB4ODQsMHgxMCwweDI3LDB4ODUsMHg4OSwweDA4LDB4MGMsMHgwMCwweDBkLDB4ZjksMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGYsMHg4MiwweDg0LDB4MzQsMHhhZiwweDgwLDB4ODQsMHgzYywweDE0LDB4NDAsMHgwMCwweDE5LDB4MDAsMHg0MCwweDE4LDB4MjEsCisweDhmLDB4ODIsMHg4NCwweDM4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgxNSwweDI0LDB4MDIsMHgwMCwweDAyLAorMHg4ZiwweDgzLDB4ODQsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg2MiwweDAwLDB4MGIsMHgzYywweDAyLDB4NDAsMHgwMCwKKzB4OGYsMHg4MywweDg0LDB4MTQsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4NjIsMHgwMCwweDAyLDB4MjQsMHgwNywweDAwLDB4MDMsCisweDI0LDB4MDcsMHgwMCwweDA2LDB4YWYsMHg4NywweDg0LDB4MTAsMHgyNCwweDA0LDB4MDAsMHgwMywweGFmLDB4ODQsMHg4NCwweDE4LAorMHgwOCwweDAwLDB4MTUsMHhjNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzQsMHg0MiwweDAwLDB4MTQsMHgzYywweDAxLDB4YjAsMHgwNSwKKzB4YWMsMHgyMiwweDAwLDB4MDAsMHhhZiwweDgwLDB4ODQsMHgxMCwweDA4LDB4MDAsMHgxNiwweGNmLDB4MjQsMHgwNCwweDAwLDB4MDMsCisweDEwLDB4NjAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDg0LDB4ODQsMHgxMCwweDI3LDB4ODUsMHg4OSwweDA4LAorMHgwYywweDAwLDB4MGUsMHgxZCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHg4MywweDg0LDB4MTQsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4YTMsMHg4MCwweDg0LDB4NDAsMHhhZiwweDgwLDB4ODQsMHgxOCwweDEwLDB4NjIsMHgwMCwweDAyLDB4MjQsMHgwNywweDAwLDB4MDMsCisweDI0LDB4MDcsMHgwMCwweDA0LDB4YWYsMHg4NywweDg0LDB4MTAsMHhhZiwweDgwLDB4ODQsMHgzNCwweDA4LDB4MDAsMHgxNSwweGM2LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDgzLDB4ODIsMHg4NCwweDYwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgwNCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDg0LDB4ODksMHgwOCwweDBjLDB4MDAsMHgxMCwweDY1LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhmLDB4ODIsMHg4NCwweDE0LDB4YTMsMHg4MCwweDg0LDB4NDAsMHhhZiwweDgwLDB4ODQsMHgxMCwweGFmLDB4ODAsMHg4NCwweDE4LAorMHgxNCwweDQwLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDIsMHhhZiwweDgyLDB4ODQsMHgxNCwKKzB4YWYsMHg4MCwweDg0LDB4MzgsMHgwOCwweDAwLDB4MTUsMHhjNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsMHg4NCwweDg0LDB4MTAsCisweDI3LDB4ODUsMHg4OSwweDA4LDB4MGMsMHgwMCwweDBlLDB4MWQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4ODIsMHg4NCwweDE0LAorMHhhMywweDgwLDB4ODQsMHg0MCwweGFmLDB4ODAsMHg4NCwweDEwLDB4YWYsMHg4MCwweDg0LDB4MTgsMHgxNCwweDQwLDB4ZmUsMHhjMiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwweGFmLDB4ODIsMHg4NCwweDE0LDB4MDgsMHgwMCwweDE1LDB4YzYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsMHg4NCwweDg5LDB4MDgsMHgwYywweDAwLDB4MTAsMHg2NSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MTYsMHhmZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsMHg4NCwweDg0LDB4NjgsMHgwYywweDAwLDB4MmEsMHg5NiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MTUsMHhmZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDI0LDB4NjYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDI3LDB4NTYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDBjLDB4MDAsMHgxOCwweDQwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4ODQsMHg4NCwweDY4LDB4MGMsMHgwMCwweDI3LDB4NjQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OTMsMHg4MywweGJjLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NjAsMHgwMCwweDJiLDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDM0LDB4NDIsMHgwMSwweDA4LDB4OGMsMHg0NCwweDAwLDB4MDAsMHg4ZiwweDgzLDB4YmMsMHgwMCwweDhmLDB4ODIsMHhiYywweDA0LAorMHgwMCwweDgzLDB4MTgsMHgyMywweDAwLDB4NDMsMHgxMCwweDJiLDB4MTAsMHg0MCwweDAwLDB4MjMsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4MjQsMHgwNCwweDA1LDB4YTAsMHgzNCwweDQyLDB4MDEsMHgxOCwweDhjLDB4NDIsMHgwMCwweDAwLDB4MGMsMHgwMCwweDA2LDB4Y2UsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwNCwweDA1LDB4YTQsMHgwYywweDAwLDB4MDYsMHhjZSwweDAwLDB4MDIsMHg4NCwweDAyLAorMHgzMCwweDUxLDB4ZmYsMHhmZiwweDI0LDB4MDQsMHgwNSwweGE4LDB4MDAsMHgwMiwweDk0LDB4MDIsMHgwYywweDAwLDB4MDYsMHhjZSwKKzB4M2EsMHgxMCwweGZmLDB4ZmYsMHgzYSwweDMxLDB4ZmYsMHhmZiwweDMwLDB4NDIsMHhmZiwweGZmLDB4MmUsMHgxMCwweDAwLDB4MDEsCisweDJlLDB4MzEsMHgwMCwweDAxLDB4M2EsMHg1MiwweGZmLDB4ZmYsMHgwMiwweDExLDB4ODAsMHgyNSwweDJlLDB4NTIsMHgwMCwweDAxLAorMHgzOCwweDQyLDB4ZmYsMHhmZiwweDAyLDB4MTIsMHg4MCwweDI1LDB4MmMsMHg0MiwweDAwLDB4MDEsMHgwMiwweDAyLDB4ODAsMHgyNSwKKzB4MTYsMHgwMCwweDAwLDB4MDIsMHgyNCwweDA0LDB4MDAsMHgwMiwweDAwLDB4MDAsMHgyMCwweDIxLDB4MGMsMHgwMCwweDA1LDB4NzAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzNCwweDQyLDB4MDEsMHgwOCwweDhjLDB4NDMsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweGFmLDB4ODMsMHhiYywweDAwLDB4MGMsMHgwMCwweDAxLDB4ZWIsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4YWYsMHg4MCwweDg0LDB4MTAsMHhhZiwweDgwLDB4ODQsMHg0NCwweDA4LDB4MDAsMHgxNSwweDlhLDB4MDAsMHgwMCwweDM4LDB4MjEsCisweDI3LDB4OTAsMHhiMywweGYwLDB4MjQsMHgxMSwweDAwLDB4MTIsMHg4ZSwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg5MCwweDgyLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MGMsMHgwMCwweDIwLDB4ZDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI2LDB4MzEsMHhmZiwweGZmLDB4MDYsMHgyMSwweGZmLDB4ZjYsCisweDI2LDB4MTAsMHgwMCwweDA0LDB4YWYsMHg4MCwweDg0LDB4MTAsMHgwOCwweDAwLDB4MTUsMHhjNywweDAwLDB4MDAsMHgzOCwweDIxLAorMHgzYywweDAyLDB4YjAsMHgwMywweDM0LDB4NDIsMHgwMSwweDA4LDB4OGMsMHg0NCwweDAwLDB4MDAsMHg4ZiwweDgyLDB4ODQsMHgwOCwKKzB4MDAsMHgwNCwweDE5LDB4YzIsMHgwMCwweDAyLDB4MTEsMHhjMiwweDEwLDB4NjIsMHhmZiwweGY2LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MDIsMHhiMCwweDAzLDB4MzQsMHg0MiwweDAxLDB4MDIsMHg5MCwweDQzLDB4MDAsMHgwMCwweDNjLDB4MTIsMHhiMCwweDA1LAorMHhhZiwweDg0LDB4ODQsMHgwOCwweDMwLDB4NjMsMHgwMCwweGZmLDB4MDAsMHgwMywweDExLDB4NDAsMHgwMCwweDQzLDB4MTAsMHgyMywKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHg5OSwweDAwLDB4MDAsMHgwMCwweDg4LDB4MjEsCisweDM2LDB4NTIsMHgwMiwweDJjLDB4MjcsMHg5MCwweGIzLDB4ZjAsMHg4ZSwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg5MCwweDgzLDB4MDAsMHgxNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg2MiwweDAwLDB4MDMsMHgxMCwweDQwLDB4MDAsMHgwNiwKKzB4MzAsMHg2MiwweDAwLDB4MWMsMHgxNCwweDQwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHg4NSwweDg0LDB4MDgsCisweDBjLDB4MDAsMHgxZSwweGIyLDB4MDIsMHg2MCwweDMwLDB4MjEsMHg4ZSwweDQyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzMCwweDQyLDB4MDAsMHhmZiwweDE0LDB4NDAsMHhmZiwweGQ3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNiwweDMxLDB4MDAsMHgwMSwKKzB4MmEsMHgyMiwweDAwLDB4MTMsMHgxNCwweDQwLDB4ZmYsMHhlYywweDI2LDB4MTAsMHgwMCwweDA0LDB4MDgsMHgwMCwweDE3LDB4NWQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHg4NCwweDg0LDB4MWMsMHgyNywweDg1LDB4ODksMHgwOCwweDBjLDB4MDAsMHgxNywweGQzLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4ODMsMHg4NCwweDFjLDB4MjQsMHgwMiwweDAwLDB4MDQsMHgxNCwweDYyLDB4ZmUsMHhhMiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MTYsMHgyNywweDI0LDB4MDcsMHgwMCwweDA1LDB4MjcsMHg4NCwweDg5LDB4MDgsCisweDBjLDB4MDAsMHgyNCwweDhkLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDA3LDB4MDAsMHgwNSwweGFmLDB4ODcsMHg4NCwweDEwLAorMHgwOCwweDAwLDB4MTUsMHhjNywweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHg4MiwweDg5LDB4M2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTAsMHg0MCwweDAwLDB4MGQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4ODQsMHhiNCwweDMwLDB4YWYsMHg4MCwweDg5LDB4M2MsCisweDk0LDB4ODUsMHgwMCwweDE0LDB4MGMsMHgwMCwweDFiLDB4ODQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDkzLDB4ODIsMHg4YiwweDYxLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweDAyLDB4MTAsMHg0MCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MGMsMHgwMCwweDAxLDB4NTksMHgwMCwweDAwLDB4MjAsMHgyMSwweDhmLDB4ODQsMHhiNCwweDMwLDB4MGMsMHgwMCwweDIwLDB4ZDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDE3LDB4NWQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDIsMHhmZiwweDkwLAorMHgyNywweGJkLDB4ZmYsMHhlOCwweDAwLDB4ODAsMHgxOCwweDIxLDB4MzQsMHg0MiwweDAwLDB4MDEsMHgyNywweDg0LDB4ODksMHgwOCwKKzB4MTAsMHg2MiwweDAwLDB4MDUsMHhhZiwweGJmLDB4MDAsMHgxMCwweDhmLDB4YmYsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MTgsMHgwYywweDAwLDB4MDYsMHhlMSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNywweDg0LDB4ODYsMHg0OCwweDBjLDB4MDAsMHgxOCwweDRlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDg0LDB4ODQsMHgxMCwKKzB4MGMsMHgwMCwweDEzLDB4ZDUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxNywweGJhLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhmLDB4ODIsMHg4OSwweDQ4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgxOCwweDIxLAorMHg4ZiwweDgyLDB4ODQsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHgwMywweDAwLDB4MDEsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4NjAsMHgxMCwweDIxLDB4MjcsMHhiZCwweGZmLDB4ZTAsCisweDNjLDB4MDYsMHhiMCwweDAzLDB4YWYsMHhiMSwweDAwLDB4MTQsMHhhZiwweGIwLDB4MDAsMHgxMCwweDM0LDB4YzYsMHgwMCwweDVmLAorMHhhZiwweGJmLDB4MDAsMHgxOCwweDkwLDB4YzMsMHgwMCwweDAwLDB4M2MsMHgwNywweGIwLDB4MDMsMHgzNCwweGU3LDB4MDAsMHg1ZCwKKzB4MzQsMHg2MywweDAwLDB4MDEsMHgzYywweDA5LDB4YjAsMHgwMywweDI0LDB4MDIsMHgwMCwweDAxLDB4YTAsMHhjMywweDAwLDB4MDAsCisweDAwLDB4ODAsMHg4MCwweDIxLDB4YTAsMHhlMiwweDAwLDB4MDAsMHgwMCwweGEwLDB4ODgsMHgyMSwweDM1LDB4MjksMHgwMCwweDVlLAorMHgwMCwweGUwLDB4NDAsMHgyMSwweDI0LDB4MDQsMHgwMCwweDAxLDB4OTEsMHgyMiwweDAwLDB4MDAsMHg5MSwweDAzLDB4MDAsMHgwMCwKKzB4MzAsMHg0MiwweDAwLDB4MDEsMHgxNCwweDgzLDB4MDAsMHgwMywweDMwLDB4NDIsMHgwMCwweDAxLDB4MTQsMHg0MCwweGZmLDB4ZmEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDQsMHgxMiwweDAyLDB4MDAsMHgyYywweDI0LDB4MDUsMHgwZiwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwNiwweDEyLDB4MDIsMHgwMCwweDA4LDB4MjQsMHgwNSwweDAwLDB4MGYsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4MzQsMHg0MiwweDAyLDB4MDAsMHhhMCwweDUwLDB4MDAsMHgwMCwweDhmLDB4YmYsMHgwMCwweDE4LDB4N2IsMHhiMCwweDAwLDB4YmMsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MjAsMHgyNCwweDA0LDB4MGMsMHgwNCwweDBjLDB4MDAsMHgxMywweDViLAorMHgyNCwweDA2LDB4MDAsMHgwZiwweDI0LDB4MDQsMHgwZCwweDA0LDB4MjQsMHgwNSwweDAwLDB4MGYsMHgwYywweDAwLDB4MTMsMHg1YiwKKzB4MjQsMHgwNiwweDAwLDB4MGYsMHgyNCwweDA0LDB4MDgsMHg4MCwweDI0LDB4MDUsMHgxZSwweDAwLDB4MGMsMHgwMCwweDEzLDB4NWIsCisweDI0LDB4MDYsMHgwMCwweDBmLDB4MjQsMHgwNCwweDA4LDB4OGMsMHgyNCwweDA1LDB4MGYsMHgwMCwweDBjLDB4MDAsMHgxMywweDViLAorMHgyNCwweDA2LDB4MDAsMHgwZiwweDI0LDB4MDQsMHgwOCwweDI0LDB4M2MsMHgwNSwweDAwLDB4MzAsMHgwYywweDAwLDB4MTMsMHg1YiwKKzB4MjQsMHgwNiwweDAwLDB4MDIsMHgyNCwweDA0LDB4MDgsMHgyYywweDNjLDB4MDUsMHgwMCwweDMwLDB4MGMsMHgwMCwweDEzLDB4NWIsCisweDI0LDB4MDYsMHgwMCwweDAyLDB4MjQsMHgwNCwweDA4LDB4MzQsMHgzYywweDA1LDB4MDAsMHgzMCwweDBjLDB4MDAsMHgxMywweDViLAorMHgyNCwweDA2LDB4MDAsMHgwMiwweDI0LDB4MDQsMHgwOCwweDNjLDB4M2MsMHgwNSwweDAwLDB4MzAsMHgwYywweDAwLDB4MTMsMHg1YiwKKzB4MjQsMHgwNiwweDAwLDB4MDIsMHgwOCwweDAwLDB4MTcsMHhmNCwweDNjLDB4MDIsMHhiMCwweDAzLDB4MjQsMHgwNCwweDA4LDB4OGMsCisweDBjLDB4MDAsMHgxMywweDViLDB4MjQsMHgwNiwweDAwLDB4MDQsMHgyNCwweDA0LDB4MDgsMHg4MCwweDI0LDB4MDUsMHgxZSwweDAwLAorMHgwYywweDAwLDB4MTMsMHg1YiwweDI0LDB4MDYsMHgwMCwweDA0LDB4MjQsMHgwNCwweDBjLDB4MDQsMHgyNCwweDA1LDB4MDAsMHgwZiwKKzB4MGMsMHgwMCwweDEzLDB4NWIsMHgyNCwweDA2LDB4MDAsMHgwNCwweDI0LDB4MDQsMHgwZCwweDA0LDB4MjQsMHgwNSwweDAwLDB4MGYsCisweDBjLDB4MDAsMHgxMywweDViLDB4MjQsMHgwNiwweDAwLDB4MDQsMHgyNCwweDA0LDB4MDgsMHgyNCwweDNjLDB4MDUsMHgwMCwweDMwLAorMHgwYywweDAwLDB4MTMsMHg1YiwweDI0LDB4MDYsMHgwMCwweDAzLDB4MjQsMHgwNCwweDA4LDB4MmMsMHgzYywweDA1LDB4MDAsMHgzMCwKKzB4MGMsMHgwMCwweDEzLDB4NWIsMHgyNCwweDA2LDB4MDAsMHgwMywweDI0LDB4MDQsMHgwOCwweDM0LDB4M2MsMHgwNSwweDAwLDB4MzAsCisweDBjLDB4MDAsMHgxMywweDViLDB4MjQsMHgwNiwweDAwLDB4MDIsMHgzYywweDA1LDB4MDAsMHgzMCwweDI0LDB4MDYsMHgwMCwweDAzLAorMHgwYywweDAwLDB4MTMsMHg1YiwweDI0LDB4MDQsMHgwOCwweDNjLDB4MDIsMHgyMCwweDIwLDB4MjEsMHgyNCwweDA1LDB4MDAsMHgxNCwKKzB4MGMsMHgwMCwweDEzLDB4YTAsMHgyNCwweDA2LDB4MDEsMHgwNywweDA4LDB4MDAsMHgxNywweGY0LDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDNjLDB4MDMsMHhiMCwweDAzLDB4MzQsMHg2MywweDAwLDB4NzMsMHg5MCwweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzMCwweDQyLDB4MDAsMHgwMiwweDE0LDB4NDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHhhMywweDgwLDB4ODEsMHg1OSwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4YTMsMHg4MiwweDgxLDB4NTksCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLAorMHgwMCwweDgwLDB4NzAsMHgyMSwweDM0LDB4NjMsMHgwMCwweDIwLDB4MjQsMHg0MiwweDYxLDB4MzgsMHgzYywweDA0LDB4YjAsMHgwMywKKzB4YWMsMHg2MiwweDAwLDB4MDAsMHgzNCwweDg0LDB4MDAsMHgzMCwweGFkLDB4YzAsMHgwMiwweGJjLDB4YWQsMHhjMCwweDAyLDB4YjgsCisweDhjLDB4ODMsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4ZmYsMHhhNSwweGMwLDB4MDAsMHgwYSwweDAwLDB4MDAsMHgzMCwweDIxLAorMHhhNywweDgyLDB4OGYsMHhlMCwweDI3LDB4ODgsMHg4ZiwweGYwLDB4YTUsMHhjMywweDAwLDB4MDgsMHgzYywweDA3LDB4YjAsMHgwOCwKKzB4MzAsMHhjMiwweGZmLDB4ZmYsMHgwMCwweDAyLDB4MjAsMHhjMCwweDI0LDB4YzMsMHgwMCwweDAxLDB4MDAsMHg4MiwweDEwLDB4MjEsCisweDAwLDB4NjAsMHgzMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgzMCwweDYzLDB4ZmYsMHhmZiwweDAwLDB4NDgsMHgxMCwweDIxLAorMHgwMCwweDg3LDB4MjAsMHgyMSwweDI4LDB4YzUsMHgwMCwweGZmLDB4YWMsMHg4MywweDAwLDB4MDAsMHgxNCwweGEwLDB4ZmYsMHhmNCwKKzB4YTQsMHg0MywweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwOCwweDM0LDB4MDMsMHhmZiwweGZmLDB4MjUsMHhjNCwweDAwLDB4MGMsCisweDI0LDB4MGEsMHgwMCwweDAyLDB4MzQsMHg0MiwweDA3LDB4ZjgsMHgzYywweDA2LDB4YjAsMHgwMywweGE3LDB4ODMsMHhiMywweGNjLAorMHhhYywweDQzLDB4MDAsMHgwMCwweGFmLDB4ODQsMHhiMywweGYwLDB4MzQsMHhjNiwweDAwLDB4NjQsMHhhMCwweDhhLDB4MDAsMHgxOCwKKzB4OTQsMHhjNSwweDAwLDB4MDAsMHg4ZiwweDgyLDB4YjMsMHhmMCwweDI1LDB4YzQsMHgwMCwweDMwLDB4MjQsMHgwOCwweDAwLDB4MDMsCisweDNjLDB4MDMsMHhiMCwweDAzLDB4YTAsMHg0NSwweDAwLDB4MjEsMHgzNCwweDYzLDB4MDAsMHg2NiwweGFmLDB4ODQsMHhiMywweGY0LAorMHhhMCwweDg4LDB4MDAsMHgxOCwweDk0LDB4NjUsMHgwMCwweDAwLDB4OGYsMHg4MiwweGIzLDB4ZjQsMHgyNSwweGM0LDB4MDAsMHg1NCwKKzB4MjUsMHhjNywweDAwLDB4NzgsMHhhMCwweDQ1LDB4MDAsMHgyMSwweGFmLDB4ODQsMHhiMywweGY4LDB4YTAsMHg4OCwweDAwLDB4MTgsCisweDk0LDB4NjUsMHgwMCwweDAwLDB4OGYsMHg4MiwweGIzLDB4ZjgsMHgyNSwweGM4LDB4MDAsMHg5YywweDI0LDB4MDksMHgwMCwweDAxLAorMHhhMCwweDQ1LDB4MDAsMHgyMSwweGFmLDB4ODcsMHhiMywweGZjLDB4YTAsMHhlYSwweDAwLDB4MTgsMHg5NCwweGM0LDB4MDAsMHgwMCwKKzB4OGYsMHg4MiwweGIzLDB4ZmMsMHgzYywweDAzLDB4YjAsMHgwMywweDM0LDB4NjMsMHgwMCwweDYyLDB4YTAsMHg0NCwweDAwLDB4MjEsCisweGFmLDB4ODgsMHhiNCwweDAwLDB4YTEsMHgwOSwweDAwLDB4MTgsMHg5NCwweDY1LDB4MDAsMHgwMCwweDhmLDB4ODIsMHhiNCwweDAwLAorMHgyNSwweGM0LDB4MDAsMHhjMCwweDNjLDB4MDYsMHhiMCwweDAzLDB4YTAsMHg0NSwweDAwLDB4MjEsMHhhZiwweDg0LDB4YjQsMHgwNCwKKzB4YTAsMHg4OSwweDAwLDB4MTgsMHg5NCwweDY1LDB4MDAsMHgwMCwweDhmLDB4ODIsMHhiNCwweDA0LDB4MjUsMHhjNCwweDAwLDB4ZTQsCisweDM0LDB4YzYsMHgwMCwweDYwLDB4YTAsMHg0NSwweDAwLDB4MjEsMHhhZiwweDg0LDB4YjQsMHgwOCwweGEwLDB4ODAsMHgwMCwweDE4LAorMHg5NCwweGM1LDB4MDAsMHgwMCwweDhmLDB4ODIsMHhiNCwweDA4LDB4MjUsMHhjMywweDAxLDB4MDgsMHgyNSwweGM3LDB4MDEsMHgyYywKKzB4YTAsMHg0NSwweDAwLDB4MjEsMHhhZiwweDgzLDB4YjQsMHgwYywweGEwLDB4NjAsMHgwMCwweDE4LDB4OTQsMHhjOCwweDAwLDB4MDAsCisweDhmLDB4ODIsMHhiNCwweDBjLDB4MjUsMHhjNCwweDAxLDB4NTAsMHgyNSwweGM1LDB4MDEsMHg3NCwweGEwLDB4NDgsMHgwMCwweDIxLAorMHgyNSwweGM2LDB4MDEsMHg5OCwweDI1LDB4YzksMHgwMSwweGJjLDB4MjUsMHhjYSwweDAxLDB4ZTAsMHgyNSwweGNiLDB4MDIsMHgwNCwKKzB4MjUsMHhjYywweDAyLDB4MjgsMHgyNSwweGNkLDB4MDIsMHg0YywweDI0LDB4MDIsMHgwMCwweDEwLDB4M2MsMHgwMywweGIwLDB4MDMsCisweGFmLDB4ODcsMHhiNCwweDEwLDB4MzQsMHg2MywweDAwLDB4MzgsMHhhMCwweGUwLDB4MDAsMHgxOCwweGFmLDB4ODQsMHhiNCwweDE0LAorMHhhMCwweDgwLDB4MDAsMHgxOCwweGFmLDB4ODUsMHhiNCwweDE4LDB4YTAsMHhhMCwweDAwLDB4MTgsMHhhZiwweDg2LDB4YjQsMHgxYywKKzB4YTAsMHhjMCwweDAwLDB4MTgsMHhhZiwweDg5LDB4YjQsMHgyMCwweGExLDB4MjAsMHgwMCwweDE4LDB4YWYsMHg4YSwweGI0LDB4MjQsCisweGExLDB4NDAsMHgwMCwweDE4LDB4YWYsMHg4YiwweGI0LDB4MjgsMHhhMSwweDYwLDB4MDAsMHgxOCwweGFmLDB4OGMsMHhiNCwweDJjLAorMHhhMSwweDgwLDB4MDAsMHgxOCwweGFmLDB4OGQsMHhiNCwweDMwLDB4YTEsMHhhMiwweDAwLDB4MTgsMHg5NCwweDY0LDB4MDAsMHgwMCwKKzB4OGYsMHg4MiwweGI0LDB4MzAsMHgyNSwweGM1LDB4MDIsMHg3MCwweDNjLDB4MDMsMHhiMCwweDAzLDB4YTAsMHg0NCwweDAwLDB4MjEsCisweDI0LDB4MDIsMHgwMCwweDExLDB4YWYsMHg4NSwweGI0LDB4MzQsMHgzNCwweDYzLDB4MDAsMHg2ZSwweGEwLDB4YTIsMHgwMCwweDE4LAorMHg5NCwweDY0LDB4MDAsMHgwMCwweDhmLDB4ODIsMHhiNCwweDM0LDB4MjUsMHhjNSwweDAyLDB4OTQsMHgzYywweDAzLDB4YjAsMHgwMywKKzB4YTAsMHg0NCwweDAwLDB4MjEsMHgyNCwweDAyLDB4MDAsMHgxMiwweGFmLDB4ODUsMHhiNCwweDM4LDB4MzQsMHg2MywweDAwLDB4NmMsCisweGEwLDB4YTIsMHgwMCwweDE4LDB4OTQsMHg2NCwweDAwLDB4MDAsMHg4ZiwweDgyLDB4YjQsMHgzOCwweDI0LDB4MDUsMHhmZiwweGZmLAorMHgyNCwweDA3LDB4MDAsMHgwMSwweGEwLDB4NDQsMHgwMCwweDIxLDB4MjQsMHgwNiwweDAwLDB4MTIsMHgyNywweDg0LDB4YjMsMHhmMCwKKzB4OGMsMHg4MiwweDAwLDB4MDAsMHgyNCwweGM2LDB4ZmYsMHhmZiwweGEwLDB4NDAsMHgwMCwweDA0LDB4OGMsMHg4MywweDAwLDB4MDAsCisweGE0LDB4NDUsMHgwMCwweDAwLDB4YTQsMHg0NSwweDAwLDB4MDIsMHhhMCwweDYwLDB4MDAsMHgwYSwweDhjLDB4ODIsMHgwMCwweDAwLAorMHhhNCwweDY1LDB4MDAsMHgwNiwweGE0LDB4NjUsMHgwMCwweDA4LDB4YTAsMHg0MCwweDAwLDB4MTAsMHg4YywweDgzLDB4MDAsMHgwMCwKKzB4YTQsMHg0NSwweDAwLDB4MGMsMHhhNCwweDQ1LDB4MDAsMHgwZSwweGEwLDB4NjAsMHgwMCwweDEyLDB4OGMsMHg4MiwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4YTAsMHg0MCwweDAwLDB4MTYsMHg4YywweDgzLDB4MDAsMHgwMCwweGE0LDB4NDUsMHgwMCwweDE0LAorMHhhMCwweDY3LDB4MDAsMHgxNywweDhjLDB4ODIsMHgwMCwweDAwLDB4MjQsMHg4NCwweDAwLDB4MDQsMHhhMCwweDQwLDB4MDAsMHgyMCwKKzB4MDQsMHhjMSwweGZmLDB4ZTcsMHhhYywweDQwLDB4MDAsMHgxYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgzNCwweDYzLDB4MDAsMHgyMCwweDI0LDB4NDIsMHg2NCwweDAwLAorMHgwMCwweDA1LDB4MjgsMHg0MCwweGFjLDB4NjIsMHgwMCwweDAwLDB4MDAsMHhhNiwweDI4LDB4MjEsMHgyYywweGUyLDB4MDAsMHgxMCwKKzB4MTQsMHg4MCwweDAwLDB4MDYsMHgwMCwweDAwLDB4MTgsMHgyMSwweDEwLDB4NDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4ZTAsMHgxOCwweDIxLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDYwLDB4MTAsMHgyMSwweDI0LDB4MDIsMHgwMCwweDIwLAorMHgxMCwweGUyLDB4MDAsMHgwNiwweDJjLDB4ZTQsMHgwMCwweDEwLDB4MjQsMHhhMiwweDAwLDB4MDEsMHgxMCwweDgwLDB4ZmYsMHhmOSwKKzB4MDAsMHgwMiwweDExLDB4MDAsMHgwOCwweDAwLDB4MTksMHgwZCwweDAwLDB4NDcsMHgxOCwweDIxLDB4MDgsMHgwMCwweDE5LDB4MGQsCisweDI0LDB4YTMsMHgwMCwweDUwLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwweDI3LDB4YmQsMHhmZiwweGM4LAorMHgzNCwweDYzLDB4MDAsMHgyMCwweDI0LDB4NDIsMHg2NCwweDY0LDB4YWYsMHhiMiwweDAwLDB4MTgsMHhhZiwweGJmLDB4MDAsMHgzNCwKKzB4YWYsMHhiZSwweDAwLDB4MzAsMHhhZiwweGI3LDB4MDAsMHgyYywweGFmLDB4YjYsMHgwMCwweDI4LDB4YWYsMHhiNSwweDAwLDB4MjQsCisweGFmLDB4YjQsMHgwMCwweDIwLDB4YWYsMHhiMywweDAwLDB4MWMsMHhhZiwweGIxLDB4MDAsMHgxNCwweGFmLDB4YjAsMHgwMCwweDEwLAorMHhhYywweDYyLDB4MDAsMHgwMCwweDhjLDB4ODYsMHgwMiwweGJjLDB4MDAsMHg4MCwweDkwLDB4MjEsMHgxNCwweGMwLDB4MDEsMHg2NiwKKzB4MDAsMHhjMCwweDM4LDB4MjEsMHg4NCwweDgyLDB4MDAsMHgwOCwweDNjLDB4MDMsMHhiMCwweDA2LDB4OTQsMHg4NCwweDAwLDB4MDgsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0MywweDEwLDB4MjEsMHg4YywweDQ1LDB4MDAsMHgwMCwweDhjLDB4NDMsMHgwMCwweDAwLAorMHgyNCwweDg0LDB4MDAsMHgwMiwweDMwLDB4ODQsMHgwMSwweGZmLDB4MzAsMHhiMSwweGZmLDB4ZmYsMHgwMCwweDAzLDB4NDQsMHgwMiwKKzB4YTYsMHg0NCwweDAwLDB4MDgsMHgxNCwweGUwLDB4MDAsMHgwOCwweDNjLDB4MDMsMHhiMCwweDA2LDB4MzQsMHg2MywweDgwLDB4MjQsCisweDhjLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzNCwweDQyLDB4MDEsMHgwMCwweGFjLDB4NjIsMHgwMCwweDAwLAorMHg4ZSwweDQ2LDB4MDIsMHhiYywweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHhjMCwweDAxLDB4NGMsMHgwMCwweDExLDB4OTgsMHhjMCwKKzB4MDAsMHgxMSwweDNhLDB4MDAsMHgzYywweDA0LDB4YjAsMHgwMCwweDAwLDB4ZTQsMHgyMCwweDIxLDB4OGMsMHg4MywweDAwLDB4MGMsCisweDAwLDB4MTEsMHg5OCwweGMwLDB4MDIsMHg3MSwweDEwLDB4MjEsMHgwMCwweDAzLDB4MWIsMHg4MiwweDMwLDB4NjMsMHgwMCwweDFmLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDI3LDB4OWUsMHg4ZiwweGY0LDB4MDAsMHg1ZSwweDEwLDB4MjEsMHgwMCwweDYwLDB4MzAsMHgyMSwKKzB4YWMsMHg0NCwweDAwLDB4MTgsMHhhZSwweDQzLDB4MDIsMHhiYywweDE0LDB4YzAsMHgwMCwweDEwLDB4M2MsMHgwMiwweGIwLDB4MDAsCisweDAwLDB4MDgsMHgxMCwweGMwLDB4MDAsMHg0OCwweDEwLDB4MjEsMHgyNywweDg0LDB4OGYsMHhmMCwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDQ0LDB4MTAsMHgyMSwweDk0LDB4NDUsMHgwMCwweDAwLDB4MDIsMHg3MSwweDE4LDB4MjEsMHgwMCwweDAzLDB4MTgsMHg4MCwKKzB4MDAsMHg2NCwweDE4LDB4MjEsMHgyNCwweDAyLDB4ZmYsMHhmZiwweGE0LDB4NjIsMHgwMCwweDAyLDB4YTQsMHg2OCwweDAwLDB4MDQsCisweGFlLDB4NTEsMHgwMiwweGI4LDB4YTYsMHg0NSwweDAwLDB4MGEsMHgzYywweDAyLDB4YjAsMHgwMCwweDAwLDB4ZTIsMHg0MCwweDIxLAorMHg4ZCwweDE2LDB4MDAsMHgwMCwweDhkLDB4MTQsMHgwMCwweDA0LDB4MDIsMHg3MSwweDEwLDB4MjEsMHgwMCwweDAyLDB4MzgsMHg4MCwKKzB4MDAsMHgxNCwweDFhLDB4MDIsMHgyNywweDg0LDB4OTAsMHgwMCwweDMwLDB4NjMsMHgwMCwweDFmLDB4MjQsMHgwMiwweDAwLDB4MTAsCisweDAwLDB4ZTQsMHgyMCwweDIxLDB4YTYsMHg0MywweDAwLDB4MDYsMHg4ZCwweDEwLDB4MDAsMHgwOCwweGEwLDB4ODIsMHgwMCwweDA2LAorMHg4NiwweDQ1LDB4MDAsMHgwNiwweDAwLDB4ZmUsMHgxMCwweDIxLDB4MjQsMHgwMywweDAwLDB4MTMsMHgxMCwweGEzLDB4MDEsMHgxNSwKKzB4YWMsMHg0OCwweDAwLDB4MTgsMHgzYywweDAzLDB4YjAsMHgwMywweDM0LDB4NjMsMHgwMSwweDAwLDB4YTYsMHg0MCwweDAwLDB4MDIsCisweDNjLDB4MDIsMHhiMCwweDAzLDB4OTAsMHg2NCwweDAwLDB4MDAsMHgzNCwweDQyLDB4MDEsMHgwOCwweDhjLDB4NDUsMHgwMCwweDAwLAorMHgwMCwweDEwLDB4MWIsMHhjMiwweDI3LDB4ODIsMHg4ZiwweGYwLDB4MDAsMHgwNCwweDIwLDB4ODIsMHgwMCwweGUyLDB4MTAsMHgyMSwKKzB4MzAsMHg2MywweDAwLDB4MDEsMHhhYywweDQ1LDB4MDAsMHgwOCwweDEwLDB4NjAsMHgwMCwweGVjLDB4MzAsMHg5NywweDAwLDB4MDEsCisweDAwLDB4MTAsMHgxNiwweDgyLDB4MzAsMHg0NiwweDAwLDB4MDEsMHgwMCwweDEwLDB4MTIsMHgwMiwweDAwLDB4MTAsMHgxOSwweGMyLAorMHgwMCwweDEwLDB4MjYsMHgwMiwweDAwLDB4MTAsMHgyZSwweDQyLDB4MzAsMHg0NywweDAwLDB4N2YsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4MzAsMHg3NSwweDAwLDB4MDEsMHgzMCwweDg0LDB4MDAsMHgwMSwweDEwLDB4YzIsMHgwMCwweGQ5LDB4MzAsMHhhMywweDAwLDB4MDEsCisweDBjLDB4MDAsMHgxOSwweDAwLDB4MDAsMHg2MCwweDI4LDB4MjEsMHgwMiwweDcxLDB4MTgsMHgyMSwweDAwLDB4MDMsMHgxOCwweDgwLAorMHgyYywweDQ2LDB4MDAsMHg1NCwweDI3LDB4ODUsMHg5MCwweDAwLDB4MjcsMHg4NCwweDhmLDB4ZjgsMHgwMCwweDA2LDB4MTAsMHgwYSwKKzB4MDAsMHg2NSwweDI4LDB4MjEsMHgyNiwweGE2LDB4MDAsMHgwMiwweDAwLDB4NjQsMHgxOCwweDIxLDB4YTAsMHhhMiwweDAwLDB4MDIsCisweGEwLDB4NjYsMHgwMCwweDA2LDB4YTAsMHg2MiwweDAwLDB4MDcsMHhhMCwweGEyLDB4MDAsMHgwMSwweDAyLDB4NzEsMHgyMCwweDIxLAorMHgwMCwweDA0LDB4MjAsMHg4MCwweDAwLDB4OWUsMHg2MCwweDIxLDB4OGQsMHg4NSwweDAwLDB4MTgsMHgwMCwweDEwLDB4MTUsMHhjMiwKKzB4MzAsMHg0MiwweDAwLDB4MDEsMHg4YywweGEzLDB4MDAsMHgwYywweGE2LDB4NDIsMHgwMCwweDAwLDB4MjcsMHg4MiwweDkwLDB4MTAsCisweDAwLDB4ODIsMHg1MCwweDIxLDB4YTYsMHg1NiwweDAwLDB4MDQsMHg4ZCwweDQ1LDB4MDAsMHgwMCwweDAwLDB4MDMsMHgxOSwweDQyLAorMHgzYywweDAyLDB4ZmYsMHhlZiwweDM0LDB4NDIsMHhmZiwweGZmLDB4MzAsMHg2MywweDAwLDB4MDEsMHgwMCwweGEyLDB4NDgsMHgyNCwKKzB4MDAsMHgwMywweDFkLDB4MDAsMHgwMSwweDIzLDB4NDgsMHgyNSwweDAwLDB4MDksMHgxNSwweDAyLDB4MjYsMHhjNSwweDAwLDB4MTAsCisweDAwLDB4MTQsMHgxOSwweDgyLDB4MDAsMHgxNCwweDI1LDB4ODIsMHgwMCwweDEwLDB4MzQsMHgwMiwweDAwLDB4MTAsMHgzYywweDQyLAorMHgwMCwweDEwLDB4NDQsMHg4MiwweDMwLDB4NDIsMHgwMCwweDAxLDB4MzAsMHhiNSwweGZmLDB4ZmYsMHgzMCwweGNlLDB4MDAsMHgwMSwKKzB4MzAsMHhlNSwweDAwLDB4MDEsMHgzMCwweDZkLDB4MDAsMHgwMSwweDMwLDB4OGIsMHgwMCwweDAzLDB4MzIsMHg5NCwweDAwLDB4MDcsCisweDMxLDB4MDYsMHgwMCwweDAxLDB4YWQsMHg0OSwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgwYiwweDMyLDB4MDcsMHgwMCwweDdmLAorMHg4ZCwweDg0LDB4MDAsMHgxOCwweDNjLDB4MDMsMHhmZiwweGYwLDB4MzQsMHg2MywweGZmLDB4ZmYsMHg4YywweDgyLDB4MDAsMHgwYywKKzB4MDEsMHgyMywweDE4LDB4MjQsMHgwMCwweDAyLDB4MTMsMHg4MiwweDMwLDB4NDIsMHgwMCwweDBmLDB4MDAsMHgwMiwweDE0LDB4MDAsCisweDAwLDB4NjIsMHgxOCwweDI1LDB4YWQsMHg0MywweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YzIsMHgwMCwweDkwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDE1LDB4YTAsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNSwweDYwLDB4MDAsMHg4MSwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHg5NiwweDQyLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4MDQsCisweGE2LDB4NDIsMHgwMCwweDA0LDB4MGMsMHgwMCwweDE5LDB4MDAsMHgwMSwweGMwLDB4MjAsMHgyMSwweDAyLDB4NzEsMHgxOCwweDIxLAorMHgwMCwweDAzLDB4MzgsMHg4MCwweDJjLDB4NDUsMHgwMCwweDU0LDB4MjcsMHg4NCwweDkwLDB4MDAsMHgwMCwweGU0LDB4MjAsMHgyMSwKKzB4MDAsMHgwNSwweDEwLDB4MGEsMHhhMCwweDgyLDB4MDAsMHgwMCwweGEwLDB4ODAsMHgwMCwweDA0LDB4YTAsMHg4MCwweDAwLDB4MDUsCisweDk2LDB4NDUsMHgwMCwweDA0LDB4MjcsMHg4MiwweDhmLDB4ZjAsMHgwMCwweGUyLDB4MTAsMHgyMSwweGE0LDB4NDUsMHgwMCwweDA2LAorMHgwMCwweGZlLDB4MTgsMHgyMSwweDkyLDB4NDUsMHgwMCwweDAxLDB4OGMsMHg2NiwweDAwLDB4MTgsMHgyNywweDgyLDB4OTAsMHgxMCwKKzB4MDAsMHhlMiwweDEwLDB4MjEsMHhhMCwweDQwLDB4MDAsMHgwMCwweGEwLDB4ODUsMHgwMCwweDA3LDB4OTQsMHhjMywweDAwLDB4MTAsCisweDI0LDB4MDIsMHgwMCwweDA0LDB4MzAsMHg2MywweDAwLDB4MGYsMHgxMCwweDYyLDB4MDAsMHg1ZSwweDI0LDB4YzYsMHgwMCwweDEwLAorMHg5NCwweGMzLDB4MDAsMHgxNiwweDI3LDB4ODUsMHg5MCwweDA4LDB4MDAsMHhlNSwweDEwLDB4MjEsMHhhNCwweDQzLDB4MDAsMHgwMiwKKzB4OTQsMHhjMiwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweDAxLDB4MTQsMHg0MCwweDAwLDB4NGMsCisweDAyLDB4NzEsMHgyMCwweDIxLDB4OTQsMHhjMiwweDAwLDB4MDAsMHgyNCwweDAzLDB4MDAsMHhhNCwweDMwLDB4NDIsMHgwMCwweGZmLAorMHgxMCwweDQzLDB4MDAsMHg0NywweDAwLDB4MDAsMHgwMCwweDAwLDB4OTQsMHhjMiwweDAwLDB4MDAsMHgyNCwweDAzLDB4MDAsMHg4OCwKKzB4MzAsMHg0MiwweDAwLDB4ODgsMHgxMCwweDQzLDB4MDAsMHgzYywweDAyLDB4NzEsMHgxOCwweDIxLDB4MjcsMHg4NCwweDkwLDB4MTAsCisweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHg2NCwweDE4LDB4MjEsMHg4YywweDYyLDB4MDAsMHgwMCwweDNjLDB4MDQsMHgwMCwweDgwLAorMHgwMCwweDQ0LDB4MTAsMHgyNSwweGFjLDB4NjIsMHgwMCwweDAwLDB4MDIsMHg3MSwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwKKzB4MDAsMHg0NSwweDEwLDB4MjEsMHhhMCwweDU0LDB4MDAsMHgwMCwweDkyLDB4NDMsMHgwMiwweGJmLDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDM0LDB4NDIsMHgwMCwweGMzLDB4YTAsMHg0MywweDAwLDB4MDAsMHg4ZSwweDRiLDB4MDIsMHhiYywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxMSwweDYwLDB4MDAsMHgxYywweDMyLDB4YTIsMHgwMCwweGZmLDB4MDAsMHgxNSwweDFhLDB4MDIsMHgzMCwweDY0LDB4ZmYsMHhmZiwKKzB4MzgsMHg0MiwweDAwLDB4MDAsMHgyNCwweDY1LDB4MDAsMHgwMSwweDAwLDB4ODIsMHgyOCwweDBhLDB4MDIsMHgyMCwweDMwLDB4MjEsCisweDEwLDB4YTAsMHgwMCwweDEyLDB4MDAsMHgwMCwweDM4LDB4MjEsMHgwMiwweDcxLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgyNywweDgzLDB4OGYsMHhmMCwweDAwLDB4NDMsMHgyMCwweDIxLDB4MjQsMHhhOSwweGZmLDB4ZmYsMHgzYywweDBhLDB4YjAsMHgwOCwKKzB4MjQsMHgwYywweGZmLDB4ZmYsMHgwMCwweDA2LDB4MTAsMHhjMCwweDAwLDB4NGEsMHgxMCwweDIxLDB4OGMsMHg0MywweDAwLDB4MDAsCisweDI0LDB4ZTgsMHgwMCwweDAxLDB4MTAsMHhlOSwweDAwLDB4MGYsMHgzMCwweDYzLDB4MDAsMHhmZiwweDMxLDB4MDcsMHhmZiwweGZmLAorMHgwMCwweGU1LDB4MTAsMHgyYiwweDE0LDB4NDAsMHhmZiwweGY3LDB4MDAsMHg2MCwweDMwLDB4MjEsMHgyNSwweDYyLDB4ZmYsMHhmZiwKKzB4YWUsMHg0MiwweDAyLDB4YmMsMHg3YiwweGJlLDB4MDEsMHhiYywweDdiLDB4YjYsMHgwMSwweDdjLDB4N2IsMHhiNCwweDAxLDB4M2MsCisweDdiLDB4YjIsMHgwMCwweGZjLDB4N2IsMHhiMCwweDAwLDB4YmMsMHgyNCwweDAyLDB4MDAsMHgwMSwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHgzOCwweGE0LDB4ODYsMHgwMCwweDA0LDB4YTQsMHg4YywweDAwLDB4MDIsMHhhZSwweDUxLDB4MDIsMHhiOCwKKzB4MDgsMHgwMCwweDFhLDB4MmYsMHhhNiwweDQzLDB4MDAsMHgwYSwweDk0LDB4YzIsMHgwMCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDMwLDB4NDIsMHgwMCwweDYwLDB4MTAsMHg0MCwweGZmLDB4YzEsMHgwMiwweDcxLDB4MTgsMHgyMSwweDAyLDB4NzEsMHgyMCwweDIxLAorMHgyNywweDgyLDB4OTAsMHgxMCwweDAwLDB4MDQsMHgyMCwweDgwLDB4MDAsMHg4MiwweDIwLDB4MjEsMHg4YywweDgzLDB4MDAsMHgwMCwKKzB4M2MsMHgwMiwweGZmLDB4N2YsMHgzNCwweDQyLDB4ZmYsMHhmZiwweDAwLDB4NjIsMHgxOCwweDI0LDB4MDgsMHgwMCwweDFhLDB4MGUsCisweGFjLDB4ODMsMHgwMCwweDAwLDB4MjcsMHg4NSwweDkwLDB4MDgsMHgwMCwweGU1LDB4MTAsMHgyMSwweDA4LDB4MDAsMHgxOSwweGY4LAorMHhhNCwweDQwLDB4MDAsMHgwMiwweDExLDB4NjIsMHgwMCwweDA3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyZCwweDYyLDB4MDAsMHgwMiwKKzB4MTQsMHg0MCwweGZmLDB4ODAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDk2LDB4NDIsMHgwMCwweDA0LDB4MDgsMHgwMCwweDE5LDB4ZDgsCisweDI0LDB4NDIsMHgwMCwweDBjLDB4OTYsMHg0MiwweDAwLDB4MDQsMHgwOCwweDAwLDB4MTksMHhkOCwweDI0LDB4NDIsMHgwMCwweDA4LAorMHgxNiwweGU2LDB4ZmYsMHg3MCwweDNjLDB4MDIsMHhmZiwweGZiLDB4OGQsMHg4MywweDAwLDB4MTgsMHgzNCwweDQyLDB4ZmYsMHhmZiwKKzB4MDIsMHgwMiwweDEwLDB4MjQsMHhhYywweDYyLDB4MDAsMHgwOCwweDA4LDB4MDAsMHgxOSwweGQxLDB4MDAsMHgwMCwweDMwLDB4MjEsCisweDE2LDB4ZTYsMHhmZiwweDI3LDB4M2MsMHgwMiwweGZiLDB4ZmYsMHgzNCwweDQyLDB4ZmYsMHhmZiwweDAyLDB4MDIsMHgxMCwweDI0LAorMHhhZCwweDAyLDB4MDAsMHgwOCwweDA4LDB4MDAsMHgxOSwweDkwLDB4MDAsMHgwMCwweDMwLDB4MjEsMHg5MywweDg4LDB4YmIsMHgwNCwKKzB4MDAsMHgxMCwweDFlLDB4NDIsMHgwMCwweDEwLDB4MjYsMHg4MiwweDI3LDB4ODIsMHg4ZiwweGY4LDB4MmQsMHgwNSwweDAwLDB4MGMsCisweDAwLDB4ZTIsMHg0OCwweDIxLDB4MzAsMHg2MywweDAwLDB4MDEsMHgzMCwweDg2LDB4MDAsMHgwMSwweDE0LDB4YTAsMHgwMCwweDA2LAorMHgwMSwweDAwLDB4MzgsMHgyMSwweDAwLDB4MDMsMHgxMCwweDQwLDB4MDAsMHg0NiwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTEsMHgwMCwKKzB4MDEsMHgwMiwweDEwLDB4MjEsMHgyNCwweDQ3LDB4MDAsMHgwNCwweDAyLDB4NzEsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDI3LDB4ODQsMHg5MCwweDAwLDB4MjcsMHg4MywweDhmLDB4ZjgsMHgwMCwweDQ0LDB4MjAsMHgyMSwweDAwLDB4NDMsMHgxMCwweDIxLAorMHhhMSwweDI3LDB4MDAsMHgwNywweGEwLDB4NDAsMHgwMCwweDA2LDB4YTAsMHg4MCwweDAwLDB4MDIsMHgwOCwweDAwLDB4MTksMHg5ZiwKKzB4YTAsMHg4MCwweDAwLDB4MDEsMHgyNCwweDAyLDB4MDAsMHgwMSwweGE2LDB4NDIsMHgwMCwweDAyLDB4MGMsMHgwMCwweDAxLDB4YzQsCisweDAxLDB4MDAsMHgyMCwweDIxLDB4MDgsMHgwMCwweDFhLDB4MzUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4OWUsMHg4ZiwweGY0LAorMHgwOCwweDAwLDB4MTksMHg1MiwweDAwLDB4MTEsMHgzYSwweDAwLDB4OTQsMHg5MSwweDAwLDB4MGEsMHgwOCwweDAwLDB4MTksMHgzOSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweGE5LDB4ZmYsMHhmZiwweDAwLDB4MDksMHgxOCwweGMwLDB4MDAsMHg2OSwweDE4LDB4MjEsCisweDNjLDB4MDYsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgyNCwweDQyLDB4NmEsMHg1NCwweDAwLDB4MDMsMHgxOCwweDgwLAorMHgzNCwweGM2LDB4MDAsMHgyMCwweDI3LDB4ODUsMHg5MCwweDAwLDB4YWMsMHhjMiwweDAwLDB4MDAsMHgwMCwweDY1LDB4MTgsMHgyMSwKKzB4ODAsMHg2MiwweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDMyLDB4MjQsMHg4OCwweDAwLDB4MDYsCisweDkwLDB4ODIsMHgwMCwweDE2LDB4MDAsMHg4MCwweDQwLDB4MjEsMHgzNCwweDQyLDB4MDAsMHgwMiwweDMwLDB4NDMsMHgwMCwweDAxLAorMHgxNCwweDYwLDB4MDAsMHgwMiwweGEwLDB4ODIsMHgwMCwweDE2LDB4YTAsMHg4MCwweDAwLDB4MTcsMHg5NSwweDAzLDB4MDAsMHgwMiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDY5LDB4MDAsMHgyMiwweDNjLDB4MDIsMHgzNCwweDM0LDB4OTEsMHgwMiwweDAwLDB4MDQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweDAwLDB4MDYsMHgwMCwweDAzLDB4MjAsMHhjMCwweDI0LDB4MDIsMHgwMCwweDAxLAorMHhhMSwweDAyLDB4MDAsMHgwNCwweGE1LDB4MDksMHgwMCwweDAyLDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhNSwweDA5LDB4MDAsMHgwMCwKKzB4MDAsMHg4MywweDIwLDB4MjEsMHgyNywweDg3LDB4OGYsMHhmMCwweDAwLDB4MDQsMHgyMCwweDgwLDB4MDAsMHg4NywweDIwLDB4MjEsCisweDk0LDB4ODMsMHgwMCwweDA0LDB4M2MsMHgwMiwweGIwLDB4MDgsMHgzYywweDA2LDB4YjAsMHgwMywweDAwLDB4MDMsMHgyOCwweGMwLAorMHgwMCwweGEzLDB4MTgsMHgyMSwweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHhhMiwweDI4LDB4MjEsMHgzYywweDAyLDB4ODAsMHgwMSwKKzB4MjQsMHg0MiwweDgyLDB4ZTQsMHgwMCwweDY3LDB4MTgsMHgyMSwweDM0LDB4YzYsMHgwMCwweDIwLDB4YWMsMHhjMiwweDAwLDB4MDAsCisweGE0LDB4NjksMHgwMCwweDAwLDB4YTQsMHg4OSwweDAwLDB4MDIsMHhhYywweGE5LDB4MDAsMHgwMCwweDkxLDB4MDIsMHgwMCwweDA0LAorMHhhNSwweDA5LDB4MDAsMHgwMiwweDI0LDB4NDIsMHgwMCwweDAxLDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhMSwweDAyLDB4MDAsMHgwNCwKKzB4M2MsMHgwMywweGIwLDB4MDMsMHgzNCwweDYzLDB4MDAsMHhiMCwweDM0LDB4NDIsMHgzNCwweDM0LDB4MDMsMHhlMCwweDAwLDB4MDgsCisweGFjLDB4NjIsMHgwMCwweDAwLDB4OTAsMHg4MiwweDAwLDB4MTYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDM0LDB4NDIsMHgwMCwweDAxLAorMHgzMCwweDQzLDB4MDAsMHgwMiwweDE0LDB4NjAsMHhmZiwweGQxLDB4YTAsMHg4MiwweDAwLDB4MTYsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4MDgsMHgwMCwweDFhLDB4YWIsMHhhMCwweDgyLDB4MDAsMHgxNywweDI3LDB4YmQsMHhmZiwweGU4LDB4YWYsMHhiZiwweDAwLDB4MTAsCisweDAwLDB4ODAsMHgzOCwweDIxLDB4ODQsMHg4NCwweDAwLDB4MDIsMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLAorMHgzYywweDBhLDB4YjAsMHgwNiwweDM0LDB4NjMsMHgwMCwweDIwLDB4MjQsMHg0MiwweDZiLDB4NzgsMHgzYywweDBiLDB4YjAsMHgwOCwKKzB4MjcsMHg4OSwweDhmLDB4ZjAsMHgzNCwweDBjLDB4ZmYsMHhmZiwweDM1LDB4NGEsMHg4MCwweDIwLDB4MTAsMHg4MCwweDAwLDB4MzAsCisweGFjLDB4NjIsMHgwMCwweDAwLDB4OTcsMHg4MiwweDhmLDB4ZTAsMHg5NCwweGU2LDB4MDIsMHhiYSwweDAwLDB4MDIsMHgxOCwweGMwLAorMHgwMCwweDZiLDB4MjgsMHgyMSwweGFjLDB4YTYsMHgwMCwweDAwLDB4OGMsMHhlNCwweDAyLDB4YjgsMHgwMCwweDYyLDB4MTgsMHgyMSwKKzB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDA0LDB4MTAsMHhjMCwweDAwLDB4NDQsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDAwLDB4NDksMHgxMCwweDIxLDB4OTQsMHg0OCwweDAwLDB4MDQsMHgwMCwweDY5LDB4MTgsMHgyMSwweGE0LDB4NjYsMHgwMCwweDAwLAorMHgwMCwweDA4LDB4MjgsMHhjMCwweDAwLDB4YWIsMHgxMCwweDIxLDB4YWMsMHg0YywweDAwLDB4MDAsMHg4YywweGU0LDB4MDIsMHhiOCwKKzB4MjcsMHg4MiwweDhmLDB4ZjQsMHgwMCwweGE4LDB4MjgsMHgyMSwweDAwLDB4MDQsMHgxOCwweGMwLDB4MDAsMHg2NCwweDE4LDB4MjEsCisweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHg2MiwweDEwLDB4MjEsMHg4YywweDQ2LDB4MDAsMHgxOCwweDI3LDB4ODQsMHg5MCwweDAwLAorMHgwMCwweDY0LDB4MTgsMHgyMSwweDhjLDB4YzIsMHgwMCwweDAwLDB4ODAsMHg2NywweDAwLDB4MDYsMHgwMCwweDA1LDB4MjgsMHg4MCwKKzB4MzAsMHg0MiwweGZmLDB4ZmYsMHgwMCwweDQ3LDB4MTAsMHgyMSwweDMwLDB4NDMsMHgwMCwweGZmLDB4MDAsMHgwMywweDE4LDB4MmIsCisweDAwLDB4MDIsMHgxMiwweDAyLDB4MDAsMHg0MywweDEwLDB4MjEsMHgzYywweDA0LDB4MDAsMHgwNCwweDAwLDB4YTksMHgyOCwweDIxLAorMHgwMCwweDQ0LDB4MTAsMHgyNSwweGE0LDB4YWMsMHgwMCwweDAwLDB4YWQsMHg0MiwweDAwLDB4MDAsMHhhNywweDg4LDB4OGYsMHhlMCwKKzB4OGYsMHhiZiwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MTgsCisweDg0LDB4ZTMsMHgwMCwweDA2LDB4MjcsMHg4MiwweGIzLDB4ZjAsMHg5NCwweGU1LDB4MDIsMHhiYSwweDAwLDB4MDMsMHgxOCwweDgwLAorMHgwMCwweDYyLDB4MTgsMHgyMSwweDhjLDB4NjQsMHgwMCwweDAwLDB4MGMsMHgwMCwweDFhLDB4OTUsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDFiLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDk0LDB4ODgsMHgwMCwweDAwLDB4MDAsMHg4MCwweDU4LDB4MjEsCisweDI3LDB4OGEsMHg4ZiwweGYwLDB4MDAsMHgwOCwweDE4LDB4YzAsMHgwMCwweDY4LDB4MTgsMHgyMSwweDNjLDB4MDQsMHhiMCwweDAzLAorMHgwMCwweDAzLDB4MTgsMHg4MCwweDNjLDB4MDIsMHg4MCwweDAwLDB4MDAsMHg2YSwweDE4LDB4MjEsMHgzNCwweDg0LDB4MDAsMHgyMCwKKzB4MjQsMHg0MiwweDZjLDB4OTgsMHgzMCwweGE1LDB4ZmYsMHhmZiwweGFjLDB4ODIsMHgwMCwweDAwLDB4OTQsMHg2NywweDAwLDB4MDIsCisweDExLDB4MDUsMHgwMCwweDM1LDB4MjQsMHgwNCwweDAwLDB4MDEsMHg5MSwweDY2LDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDg2LDB4MTAsMHgyYSwweDEwLDB4NDAsMHgwMCwweDEwLDB4MDAsMHhjMCwweDQ4LDB4MjEsMHgzYywweDBkLDB4YjAsMHgwMywKKzB4MDEsMHg0MCwweDYwLDB4MjEsMHgzNSwweGFkLDB4MDAsMHgyMCwweDEwLDB4ZTUsMHgwMCwweDBkLDB4MjQsMHg4NCwweDAwLDB4MDEsCisweDAwLDB4MDcsMHgxMCwweGMwLDB4MDAsMHg0NywweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAxLDB4MjAsMHgzMCwweDIxLAorMHgwMCwweDRhLDB4MTAsMHgyMSwweDAwLDB4ODYsMHgxOCwweDJhLDB4MDAsMHhlMCwweDQwLDB4MjEsMHg5NCwweDQ3LDB4MDAsMHgwMiwKKzB4MTQsMHg2MCwweGZmLDB4ZjUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDEwLDB4MjEsCisweDAwLDB4MDgsMHgyMCwweGMwLDB4MDAsMHg4OCwweDIwLDB4MjEsMHgyNCwweGMyLDB4ZmYsMHhmZiwweDAwLDB4MDQsMHgyMCwweDgwLAorMHhhMSwweDYyLDB4MDAsMHgwNCwweDAwLDB4OGMsMHgyMCwweDIxLDB4OTQsMHg4MywweDAwLDB4MDQsMHgwMCwweDA3LDB4MTAsMHhjMCwKKzB4MDAsMHg0NywweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NGMsMHgxMCwweDIxLDB4MDAsMHgwMywweDI4LDB4YzAsCisweDk0LDB4NDYsMHgwMCwweDAyLDB4MDAsMHhhMywweDE4LDB4MjEsMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4NmMsMHgxOCwweDIxLAorMHhhNCwweDY2LDB4MDAsMHgwMCwweGE0LDB4ODYsMHgwMCwweDAyLDB4OTUsMHg2NCwweDAwLDB4MDIsMHgzYywweDAzLDB4YjAsMHgwOCwKKzB4M2MsMHgwMiwweDgwLDB4MDEsMHgwMCwweGEzLDB4MjgsMHgyMSwweDI0LDB4NDIsMHg4MiwweGU0LDB4YWQsMHhhMiwweDAwLDB4MDAsCisweDEwLDB4ODcsMHgwMCwweDAzLDB4YWMsMHhhNiwweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwweDI0LDB4MDIsMHgwMCwweDAxLAorMHgwOCwweDAwLDB4MWIsMHg2NiwweGE1LDB4NjgsMHgwMCwweDAyLDB4OTEsMHg2MiwweDAwLDB4MDQsMHhhNSwweDY3LDB4MDAsMHgwMCwKKzB4MjQsMHg0MiwweGZmLDB4ZmYsMHgzMCwweDQzLDB4MDAsMHhmZiwweDE0LDB4NjAsMHgwMCwweDAzLDB4YTEsMHg2MiwweDAwLDB4MDQsCisweDI0LDB4MDIsMHhmZiwweGZmLDB4YTUsMHg2MiwweDAwLDB4MDIsMHg5MSwweDY1LDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxMCwweGEwLDB4ZmYsMHhmMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTUsMHg2NiwweDAwLDB4MDAsMHgzNCwweDAyLDB4ZmYsMHhmZiwKKzB4MTQsMHhjMiwweGZmLDB4ZWQsMHgzYywweDAzLDB4YjAsMHgwMywweDk1LDB4NjQsMHgwMCwweDAyLDB4M2MsMHgwMiwweGVlLDB4ZWUsCisweDAwLDB4YTIsMHgxMCwweDI1LDB4MzQsMHg2MywweDAwLDB4YmMsMHhhYywweDYyLDB4MDAsMHgwMCwweDEwLDB4ODYsMHhmZiwweGU2LAorMHhhMSwweDYwLDB4MDAsMHgwNCwweDI0LDB4MDIsMHhmZiwweGZmLDB4MDgsMHgwMCwweDFiLDB4NjYsMHhhNSwweDYyLDB4MDAsMHgwMiwKKzB4MDAsMHgwNSwweDQwLDB4YzAsMHgwMSwweDA1LDB4MzAsMHgyMSwweDI3LDB4YmQsMHhmZiwweGQ4LDB4MDAsMHgwNiwweDMwLDB4ODAsCisweDI3LDB4ODIsMHg4ZiwweGY0LDB4YWYsMHhiMiwweDAwLDB4MTgsMHhhZiwweGIxLDB4MDAsMHgxNCwweGFmLDB4YmYsMHgwMCwweDIwLAorMHhhZiwweGIzLDB4MDAsMHgxYywweGFmLDB4YjAsMHgwMCwweDEwLDB4MDAsMHhjMiwweDEwLDB4MjEsMHg4YywweDQ3LDB4MDAsMHgxOCwKKzB4MDAsMHhhMCwweDkwLDB4MjEsMHgzYywweDAyLDB4ODAsMHgwMCwweDNjLDB4MDUsMHhiMCwweDAzLDB4MzQsMHhhNSwweDAwLDB4MjAsCisweDI0LDB4NDIsMHg2ZSwweDEwLDB4YWMsMHhhMiwweDAwLDB4MDAsMHgyNywweDgzLDB4OTAsMHgwMCwweDAwLDB4YzMsMHgzMCwweDIxLAorMHg4YywweGUyLDB4MDAsMHgwMCwweDgwLDB4YzUsMHgwMCwweDA2LDB4MDAsMHg4MCwweDg4LDB4MjEsMHgzMCwweDQyLDB4ZmYsMHhmZiwKKzB4MDAsMHg0NSwweDEwLDB4MjEsMHgzMCwweDQzLDB4MDAsMHhmZiwweDEwLDB4NjAsMHgwMCwweDAyLDB4MDAsMHgwMiwweDEyLDB4MDIsCisweDI0LDB4NDIsMHgwMCwweDAxLDB4MzAsMHg1MywweDAwLDB4ZmYsMHgwMSwweDEyLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgyNywweDgzLDB4OTAsMHgwMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4ODAsMHg0NCwweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTAsMHg4MCwweDAwLDB4NGIsMHgyNiwweDI0LDB4MDAsMHgwNiwweDMyLDB4NTAsMHhmZiwweGZmLDB4MDIsMHgyMCwweDIwLDB4MjEsCisweDBjLDB4MDAsMHgxYiwweDI2LDB4MDIsMHgwMCwweDI4LDB4MjEsMHg5MiwweDIyLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxNCwweDQwLDB4MDAsMHgyZSwweDNjLDB4MDMsMHhiMCwweDA4LDB4M2MsMHgwOSwweDgwLDB4MDEsMHgyNywweDg4LDB4OGYsMHhmMCwKKzB4YTYsMHgzMiwweDAwLDB4MGMsMHgwMCwweDEwLDB4MjAsMHhjMCwweDAwLDB4OTAsMHgyMCwweDIxLDB4MDAsMHgwNCwweDIwLDB4ODAsCisweDAwLDB4ODgsMHgyMCwweDIxLDB4OTQsMHg4MiwweDAwLDB4MDQsMHgzYywweDAzLDB4YjAsMHgwOCwweDNjLDB4MDcsMHhiMCwweDAzLAorMHgwMCwweDAyLDB4MjgsMHhjMCwweDAwLDB4YTIsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQ4LDB4MTAsMHgyMSwKKzB4MDAsMHhhMywweDI4LDB4MjEsMHgyNSwweDI2LDB4ODIsMHhlNCwweDM0LDB4MDMsMHhmZiwweGZmLDB4MzQsMHhlNywweDAwLDB4MjAsCisweGFjLDB4ZTYsMHgwMCwweDAwLDB4YTQsMHg4MywweDAwLDB4MDIsMHhhNCwweDQzLDB4MDAsMHgwMCwweGFjLDB4YTMsMHgwMCwweDAwLAorMHg5MiwweDIyLDB4MDAsMHgxMCwweDkyLDB4MjMsMHgwMCwweDBhLDB4YTYsMHgzMiwweDAwLDB4MGUsMHgwMiwweDYyLDB4MTAsMHgyMSwKKzB4MTQsMHg2MCwweDAwLDB4MDUsMHhhMiwweDIyLDB4MDAsMHgxMCwweDkyLDB4MjIsMHgwMCwweDE2LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDMwLDB4NDIsMHgwMCwweGZlLDB4YTIsMHgyMiwweDAwLDB4MTYsMHg5MiwweDIyLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxNCwweDQwLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTIsMHgyMiwweDAwLDB4MTYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg0MiwweDAwLDB4ZmQsMHhhMiwweDIyLDB4MDAsMHgxNiwweDhmLDB4YmYsMHgwMCwweDIwLDB4N2IsMHhiMiwweDAwLDB4ZmMsCisweDdiLDB4YjAsMHgwMCwweGJjLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgyOCwweDk2LDB4MjIsMHgwMCwweDBlLAorMHgyNywweDg4LDB4OGYsMHhmMCwweDAwLDB4MDIsMHgyMCwweGMwLDB4MDAsMHg4MiwweDIwLDB4MjEsMHgwMCwweDA0LDB4MjAsMHg4MCwKKzB4MDAsMHg4OCwweDIwLDB4MjEsMHg5NCwweDgyLDB4MDAsMHgwNCwweDNjLDB4MDYsMHhiMCwweDAzLDB4M2MsMHgwOSwweDgwLDB4MDEsCisweDAwLDB4MDIsMHgyOCwweGMwLDB4MDAsMHhhMiwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4YTMsMHgyOCwweDIxLAorMHgwMCwweDQ4LDB4MTAsMHgyMSwweDM0LDB4YzYsMHgwMCwweDIwLDB4MjUsMHgyMywweDgyLDB4ZTQsMHhhYywweGMzLDB4MDAsMHgwMCwKKzB4YTQsMHg1MCwweDAwLDB4MDAsMHhhYywweGIwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxYiwweGI1LDB4YTQsMHg5MCwweDAwLDB4MDIsCisweDA4LDB4MDAsMHgxYiwweGFjLDB4MzIsMHg1MCwweGZmLDB4ZmYsMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLAorMHgyNCwweDQyLDB4NmYsMHhkOCwweDM0LDB4NjMsMHgwMCwweDIwLDB4YWMsMHg2MiwweDAwLDB4MDAsMHg5MCwweDgyLDB4MDAsMHgwNCwKKzB4OTcsMHhhYSwweDAwLDB4MTIsMHgwMCwweDgwLDB4NjAsMHgyMSwweDMwLDB4YTgsMHhmZiwweGZmLDB4MDAsMHg0YSwweDIwLDB4MjMsCisweDM0LDB4MDksMHhmZiwweGZmLDB4MzAsMHhjZiwweGZmLDB4ZmYsMHgzMCwweGVlLDB4ZmYsMHhmZiwweDExLDB4MDksMHgwMCwweDczLAorMHhhMSwweDg0LDB4MDAsMHgwNCwweDAwLDB4MGUsMHhjMCwweGMwLDB4MDAsMHgwOCwweDEwLDB4YzAsMHgwMCwweDQ4LDB4MTAsMHgyMSwKKzB4MDMsMHgwZSwweDIwLDB4MjEsMHgyNywweDhkLDB4OGYsMHhmMCwweDAwLDB4MDQsMHgyMCwweDgwLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDAwLDB4NGQsMHgxMCwweDIxLDB4MDAsMHg4ZCwweDIwLDB4MjEsMHg5NCwweDg2LDB4MDAsMHgwMiwweDk0LDB4NDMsMHgwMCwweDA0LAorMHgzYywweDE5LDB4ODAsMHgwMSwweGE0LDB4NDYsMHgwMCwweDAyLDB4MDAsMHgwMywweDI4LDB4YzAsMHgwMCwweGEzLDB4MTgsMHgyMSwKKzB4OTQsMHg4NywweDAwLDB4MDIsMHgzYywweDAyLDB4YjAsMHgwOCwweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHhhMiwweDI4LDB4MjEsCisweDAwLDB4NmQsMHgxOCwweDIxLDB4MjcsMHgyMiwweDgyLDB4ZTQsMHgzYywweDAxLDB4YjAsMHgwMywweGFjLDB4MjIsMHgwMCwweDIwLAorMHhhNCwweDY2LDB4MDAsMHgwMCwweDEwLDB4ZTksMHgwMCwweDU3LDB4YWMsMHhhNiwweDAwLDB4MDAsMHgwMSwweGUwLDB4MzAsMHgyMSwKKzB4MTEsMHg0MCwweDAwLDB4MWQsMHgwMCwweDAwLDB4NDgsMHgyMSwweDAxLDB4NDAsMHgzOCwweDIxLDB4MjcsMHg4YiwweDhmLDB4ZjQsCisweDI3LDB4OGEsMHg5MCwweDAwLDB4MDAsMHgwNiwweDQwLDB4YzAsMHgwMSwweDA2LDB4MTgsMHgyMSwweDAwLDB4MDMsMHgxOCwweDgwLAorMHgwMCwweDZiLDB4MTAsMHgyMSwweDhjLDB4NDQsMHgwMCwweDE4LDB4MDAsMHg2YSwweDE4LDB4MjEsMHg4MCwweDY1LDB4MDAsMHgwNiwKKzB4OGMsMHg4MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHhmZiwweGZmLDB4MDAsMHg0NSwweDEwLDB4MjEsCisweDMwLDB4NDQsMHgwMCwweGZmLDB4MDAsMHgwMiwweDEyLDB4MDIsMHgwMSwweDIyLDB4MTgsMHgyMSwweDI0LDB4NjIsMHgwMCwweDAxLAorMHgxNCwweDgwLDB4MDAsMHgwMiwweDMwLDB4NDksMHgwMCwweGZmLDB4MzAsMHg2OSwweDAwLDB4ZmYsMHgwMSwweDA2LDB4MTAsMHgyMSwKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDRkLDB4MTAsMHgyMSwweDI0LDB4ZTcsMHhmZiwweGZmLDB4OTQsMHg0NiwweDAwLDB4MDIsCisweDE0LDB4ZTAsMHhmZiwweGU5LDB4MDAsMHgwNiwweDQwLDB4YzAsMHg5MSwweDgyLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxNCwweDQwLDB4MDAsMHgyMCwweDNjLDB4MDYsMHhiMCwweDAzLDB4YTUsMHg4ZiwweDAwLDB4MGMsMHgwMywweDBlLDB4MjAsMHgyMSwKKzB4MDAsMHgwNCwweDIwLDB4ODAsMHgwMCwweDhkLDB4MjAsMHgyMSwweDk0LDB4ODIsMHgwMCwweDA0LDB4M2MsMHgwMywweGIwLDB4MDgsCisweDNjLDB4MDcsMHhiMCwweDAzLDB4MDAsMHgwMiwweDI4LDB4YzAsMHgwMCwweGEyLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDRkLDB4MTAsMHgyMSwweDAwLDB4YTMsMHgyOCwweDIxLDB4MjcsMHgyNiwweDgyLDB4ZTQsMHgzNCwweDAzLDB4ZmYsMHhmZiwKKzB4MzQsMHhlNywweDAwLDB4MjAsMHhhYywweGU2LDB4MDAsMHgwMCwweGE0LDB4ODMsMHgwMCwweDAyLDB4YTQsMHg0MywweDAwLDB4MDAsCisweGFjLDB4YTMsMHgwMCwweDAwLDB4OTEsMHg4MiwweDAwLDB4MTAsMHg5MSwweDgzLDB4MDAsMHgwNCwweGE1LDB4OGUsMHgwMCwweDBlLAorMHgwMSwweDIyLDB4MTAsMHgyMSwweDE0LDB4NjAsMHgwMCwweDA1LDB4YTEsMHg4MiwweDAwLDB4MTAsMHg5MSwweDgyLDB4MDAsMHgxNiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHhmZCwweGExLDB4ODIsMHgwMCwweDE2LDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTUsMHg4MiwweDAwLDB4MGUsMHgzYywweDAzLDB4YjAsMHgwOCwweDAwLDB4MDIsMHgyMCwweGMwLAorMHgwMCwweDgyLDB4MjAsMHgyMSwweDAwLDB4MDQsMHgyMCwweDgwLDB4MDAsMHg4ZCwweDIwLDB4MjEsMHg5NCwweDgyLDB4MDAsMHgwNCwKKzB4MzQsMHhjNiwweDAwLDB4MjAsMHgyNywweDI3LDB4ODIsMHhlNCwweDAwLDB4MDIsMHgyOCwweGMwLDB4MDAsMHhhMiwweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHhhMywweDI4LDB4MjEsMHgwMCwweDRkLDB4MTAsMHgyMSwweGFjLDB4YzcsMHgwMCwweDAwLAorMHhhNCwweDhmLDB4MDAsMHgwMiwweGE0LDB4NGYsMHgwMCwweDAwLDB4YWMsMHhhZiwweDAwLDB4MDAsMHgwOCwweDAwLDB4MWMsMHg0NCwKKzB4MDMsMHgwZSwweDIwLDB4MjEsMHgwOCwweDAwLDB4MWMsMHgxZiwweGE1LDB4ODgsMHgwMCwweDAyLDB4MDAsMHgwZSwweGMwLDB4YzAsCisweDAzLDB4MGUsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgyNywweDhkLDB4OGYsMHhmMCwweDAwLDB4NGQsMHgxMCwweDIxLAorMHg5NCwweDQzLDB4MDAsMHgwMiwweDMwLDB4ODQsMHgwMCwweGZmLDB4MTQsMHg4MCwweDAwLDB4MDUsMHhhNSwweDgzLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweGZmLDB4ZmYsMHgzYywweDE5LDB4ODAsMHgwMSwweDA4LDB4MDAsMHgxYywweDFmLDB4YTUsMHg4MiwweDAwLDB4MDIsCisweDA4LDB4MDAsMHgxYywweDFmLDB4M2MsMHgxOSwweDgwLDB4MDEsMHgzYywweDA4LDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLAorMHgyNywweGJkLDB4ZmYsMHg3OCwweDM1LDB4MDgsMHgwMCwweDIwLDB4MjQsMHg0MiwweDcyLDB4MTgsMHhhZiwweGIyLDB4MDAsMHg2OCwKKzB4YWYsMHhiMSwweDAwLDB4NjQsMHhhZiwweGIwLDB4MDAsMHg2MCwweGFkLDB4MDIsMHgwMCwweDAwLDB4YWYsMHhiZiwweDAwLDB4ODQsCisweGFmLDB4YmUsMHgwMCwweDgwLDB4YWYsMHhiNywweDAwLDB4N2MsMHhhZiwweGI2LDB4MDAsMHg3OCwweGFmLDB4YjUsMHgwMCwweDc0LAorMHhhZiwweGI0LDB4MDAsMHg3MCwweGFmLDB4YjMsMHgwMCwweDZjLDB4YWYsMHhhNCwweDAwLDB4ODgsMHg5MCwweDgzLDB4MDAsMHgwYSwKKzB4MjcsMHg4MiwweGIzLDB4ZjAsMHhhZiwweGE2LDB4MDAsMHg5MCwweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHg2MiwweDE4LDB4MjEsCisweDhjLDB4NjMsMHgwMCwweDAwLDB4YWYsMHhhNywweDAwLDB4OTQsMHgyNywweDg2LDB4OGYsMHhmNCwweGFmLDB4YTMsMHgwMCwweDFjLAorMHg5NCwweDYzLDB4MDAsMHgxNCwweDMwLDB4YjEsMHhmZiwweGZmLDB4MjQsMHgwOCwweDAwLDB4MDEsMHgwMCwweDAzLDB4MjAsMHhjMCwKKzB4YWYsMHhhMywweDAwLDB4MTgsMHgwMCwweDgzLDB4MTgsMHgyMSwweGFmLDB4YTQsMHgwMCwweDU0LDB4MDAsMHgwMywweDE4LDB4ODAsCisweDI3LDB4ODQsMHg5MCwweDAwLDB4MDAsMHg2NCwweDIwLDB4MjEsMHg4MCwweDgyLDB4MDAsMHgwNiwweDAwLDB4NjYsMHgxOCwweDIxLAorMHg4YywweDY2LDB4MDAsMHgxOCwweDI0LDB4NDIsMHgwMCwweDAyLDB4MDAsMHgwMiwweDFmLDB4YzIsMHg4YywweGM0LDB4MDAsMHgwOCwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg0MywweDAwLDB4MDIsMHgxMCwweDQwLDB4MDAsMHgwNCwweDJmLDB4YzIsCisweDAwLDB4MDQsMHgxYywweDgyLDB4MDAsMHhjMiwweDM4LDB4MjEsMHgwMCwweDA0LDB4MjQsMHg0MiwweDhmLDB4YTIsMHgwMCwweDFjLAorMHgzMCwweDYzLDB4MDAsMHgwMSwweDMwLDB4ODQsMHgwMCwweDAxLDB4YWYsMHhhNSwweDAwLDB4M2MsMHhhZiwweGEzLDB4MDAsMHgzNCwKKzB4YWYsMHhhNCwweDAwLDB4MzgsMHhhZiwweGEwLDB4MDAsMHg0MCwweGFmLDB4YTAsMHgwMCwweDQ0LDB4YWYsMHhhMCwweDAwLDB4NTAsCisweGFmLDB4YTgsMHgwMCwweDIwLDB4ODAsMHg0MiwweDAwLDB4MTIsMHg4ZiwweGIyLDB4MDAsMHgxOCwweGFmLDB4YTIsMHgwMCwweDI4LAorMHg4YywweGQwLDB4MDAsMHgwYywweDE0LDB4YTAsMHgwMSwweGU0LDB4MDAsMHg2MCwweDMwLDB4MjEsMHgwMCwweDEwLDB4MTAsMHg4MiwKKzB4MzAsMHg0NSwweDAwLDB4MDcsMHgxMCwweGEwLDB4MDAsMHgxMSwweGFmLDB4YTAsMHgwMCwweDMwLDB4OGYsMHhhNCwweDAwLDB4OTgsCisweDI3LDB4ODIsMHg4MCwweDFjLDB4MDAsMHgwNCwweDE4LDB4NDAsMHgwMCwweDYyLDB4MTgsMHgyMSwweDI0LDB4YTIsMHgwMCwweDA2LAorMHg4ZiwweGE1LDB4MDAsMHgyMCwweDk0LDB4NjQsMHgwMCwweDAwLDB4MDAsMHg0NSwweDEwLDB4MDQsMHgwMCwweDQ0LDB4MDAsMHgxYSwKKzB4MTQsMHg4MCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDcsMHgwMCwweDBkLDB4MDAsMHgwMCwweDEwLDB4MTIsCisweDI0LDB4NDIsMHgwMCwweDIwLDB4MzAsMHg0MiwweGZmLDB4ZmMsMHhhZiwweGEyLDB4MDAsMHgzMCwweDhmLDB4YTMsMHgwMCwweDE4LAorMHg4ZiwweGE0LDB4MDAsMHgyOCwweDM0LDB4MDIsMHhmZiwweGZmLDB4YWYsMHhhMCwweDAwLDB4MmMsMHhhZiwweGEyLDB4MDAsMHg0OCwKKzB4YWYsMHhhMywweDAwLDB4NGMsMHgwMCwweDYwLDB4ZjAsMHgyMSwweDAwLDB4MDAsMHhiOCwweDIxLDB4MTgsMHg4MCwweDAwLDB4NDgsCisweGFmLDB4YTAsMHgwMCwweDI0LDB4MDAsMHgxMSwweDg5LDB4MDIsMHhhZiwweGIxLDB4MDAsMHg1OCwweDAwLDB4ODAsMHhhOCwweDIxLAorMHgwMCwweDEyLDB4MTAsMHhjMCwweDAwLDB4NTIsMHgxOCwweDIxLDB4MDAsMHgwMywweDgwLDB4ODAsMHgyNywweDg1LDB4OGYsMHhmMCwKKzB4MDIsMHg0MCwweDIwLDB4MjEsMHgwMCwweDQwLDB4YTAsMHgyMSwweDAyLDB4MDUsMHgxMCwweDIxLDB4OTQsMHg1NiwweDAwLDB4MDIsCisweDBjLDB4MDAsMHgxMiwweDg3LDB4MDAsMHgwMCwweDI4LDB4MjEsMHg5MCwweDQyLDB4MDAsMHgwMCwweDI0LDB4MDMsMHgwMCwweDA4LAorMHgzMCwweDQyLDB4MDAsMHgwYywweDEwLDB4NDMsMHgwMSwweDllLDB4MjQsMHgwNCwweDAwLDB4MDEsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4MTAsMHg4MiwweDAxLDB4N2MsMHgzYywweDAyLDB4YjAsMHgwMywweDhmLDB4YTYsMHgwMCwweDg4LDB4MzQsMHg0MiwweDAxLDB4MDQsCisweDg0LDB4YzUsMHgwMCwweDBjLDB4MDIsMHg5MiwweDE4LDB4MjEsMHg5NCwweDQ2LDB4MDAsMHgwMCwweDAwLDB4MDUsMHgyMCwweGMwLAorMHgwMCwweDg1LDB4MjAsMHgyMSwweDAwLDB4MDMsMHgxOCwweDgwLDB4MjcsMHg4MiwweDkwLDB4MDAsMHgyNywweDg1LDB4OGYsMHhmOCwKKzB4MDAsMHg2NSwweDI4LDB4MjEsMHgwMCwweDYyLDB4MTgsMHgyMSwweDgwLDB4NzEsMHgwMCwweDA1LDB4ODAsMHg3MywweDAwLDB4MDQsCisweDhmLDB4YTMsMHgwMCwweDg4LDB4MzAsMHhkMCwweGZmLDB4ZmYsMHgwMCwweDEwLDB4M2EsMHgwMywweDMyLDB4MDgsMHgwMCwweGZmLAorMHgyNywweDgyLDB4OTAsMHgxMCwweDAwLDB4MDQsMHgyMCwweDgwLDB4ODAsMHhhNiwweDAwLDB4MDYsMHgwMCwweDgyLDB4MjAsMHgyMSwKKzB4YTQsMHg2NywweDAwLDB4NDQsMHhhNCwweDY4LDB4MDAsMHg0NiwweDhjLDB4ODQsMHgwMCwweDAwLDB4MzgsMHhjNiwweDAwLDB4MDAsCisweDAxLDB4MDAsMHg4MCwweDIxLDB4MDAsMHgwNCwweDE1LDB4MDIsMHgzMCwweDQyLDB4MDAsMHgwMSwweDEwLDB4NDAsMHgwMCwweDAzLAorMHgwMCwweGU2LDB4ODAsMHgwYSwweDAwLDB4MDQsMHgxNCwweDAyLDB4MzAsMHg1MCwweDAwLDB4MGYsMHgxMiwweDIwLDB4MDEsMHg1MCwKKzB4MDIsMHg0MCwweDIwLDB4MjEsMHgwMiwweDcxLDB4MTAsMHgyMSwweDAwLDB4NTAsMHgxMCwweDJhLDB4MTQsMHg0MCwweDAwLDB4ZWQsCisweDAyLDB4OTIsMHgxMCwweDIxLDB4OTMsMHg4MiwweDhiLDB4NjEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweDAxLAorMHgxNCwweDQwLDB4MDAsMHhlMCwweDAyLDB4OTIsMHgyOCwweDIxLDB4MjYsMHhlMiwweDAwLDB4MDEsMHgzMCwweDU3LDB4ZmYsMHhmZiwKKzB4MDIsMHg0MCwweGYwLDB4MjEsMHgyNiwweGI1LDB4ZmYsMHhmZiwweDE2LDB4YTAsMHhmZiwweGJkLDB4MDIsMHhjMCwweDkwLDB4MjEsCisweDE2LDB4ZTAsMHgwMCwweGQwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweGEzLDB4MDAsMHg5OCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyYywweDYyLDB4MDAsMHgxMCwweDEwLDB4NDAsMHgwMCwweDJlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweGE0LDB4MDAsMHgyNCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxOCwweDgwLDB4MDAsMHgyYSwweDI0LDB4MDMsMHgwMCwweDAxLDB4OGYsMHhhNSwweDAwLDB4MWMsCisweDI3LDB4ODQsMHg4ZiwweGY0LDB4OTQsMHhiMiwweDAwLDB4MTQsMHhhMCwweGEzLDB4MDAsMHgxMiwweDhmLDB4YTYsMHgwMCwweDNjLAorMHgwMCwweDEyLDB4MTAsMHhjMCwweDAwLDB4NTIsMHgxMCwweDIxLDB4MDAsMHgwMiwweDgwLDB4ODAsMHgyNywweDgyLDB4OTAsMHgwMCwKKzB4MDIsMHgwMiwweDEwLDB4MjEsMHg4MCwweDQzLDB4MDAsMHgwNiwweDAyLDB4MDQsMHgyMCwweDIxLDB4OGMsMHg4NSwweDAwLDB4MTgsCisweDI0LDB4NjMsMHgwMCwweDAyLDB4MDAsMHgwMywweDE3LDB4YzIsMHgwMCwweDYyLDB4MTgsMHgyMSwweDAwLDB4MDMsMHgxOCwweDQzLAorMHgwMCwweDAzLDB4MTgsMHg0MCwweDE0LDB4YzAsMHgwMCwweDBlLDB4MDAsMHhhMywweDM4LDB4MjEsMHgyNywweDgyLDB4OGYsMHhmMCwKKzB4MDIsMHgwMiwweDEwLDB4MjEsMHg5NCwweDQzLDB4MDAsMHgwNiwweDhmLDB4YTgsMHgwMCwweDFjLDB4MjQsMHgwMiwweDAwLDB4MDEsCisweGE1LDB4MDMsMHgwMCwweDFhLDB4N2IsMHhiZSwweDA0LDB4M2MsMHg3YiwweGI2LDB4MDMsMHhmYywweDdiLDB4YjQsMHgwMywweGJjLAorMHg3YiwweGIyLDB4MDMsMHg3YywweDdiLDB4YjAsMHgwMywweDNjLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHg4OCwKKzB4OGYsMHhhNCwweDAwLDB4OTgsMHg4ZiwweGE1LDB4MDAsMHgzOCwweDhmLDB4YTYsMHgwMCwweDM0LDB4YWYsMHhhMCwweDAwLDB4MTAsCisweDBjLDB4MDAsMHgwOSwweDA2LDB4YWYsMHhhMCwweDAwLDB4MTQsMHgwOCwweDAwLDB4MWQsMHg0YiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4ZiwweGEzLDB4MDAsMHg0NCwweDkzLDB4ODIsMHg4MSwweDU5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHg2MSwKKzB4MzAsMHg2OSwweDAwLDB4MDMsMHg4ZiwweGE0LDB4MDAsMHgyNCwweDhmLDB4YTUsMHgwMCwweDI4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4ODUsMHgxMCwweDJhLDB4MTAsMHg0MCwweDAwLDB4OGYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4YTYsMHgwMCwweDFjLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDkwLDB4YzQsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDgzLDB4MDAsMHhmZiwKKzB4MDAsMHhhMywweDEwLDB4MmEsMHgxMCwweDQwLDB4MDAsMHg4NywweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHhhOCwweDAwLDB4MjQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTEsMHgwMCwweDAwLDB4ODMsMHgwMCwweDY1LDB4MTAsMHgyMywweDAwLDB4YTgsMHgxOCwweDIzLAorMHgwMCwweDYyLDB4MTAsMHgyYSwweDE0LDB4NDAsMHgwMCwweDdkLDB4MzAsMHg2MywweDAwLDB4ZmYsMHgwMCwweDg1LDB4MTAsMHgyMywKKzB4MzAsMHg0MiwweDAwLDB4ZmYsMHhhZiwweGEyLDB4MDAsMHg1MCwweDhmLDB4YTIsMHgwMCwweDUwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4NDAsMHgwMCwweDczLDB4MDAsMHgwMCwweGE4LDB4MjEsMHgyNywweDhjLDB4OGYsMHhmMCwweDNjLDB4MGIsMHg4MCwweGZmLAorMHgyNCwweDEwLDB4MDAsMHgwNCwweDI3LDB4OTEsMHg4ZiwweGY0LDB4MzUsMHg2YiwweGZmLDB4ZmYsMHgzYywweDBkLDB4N2YsMHgwMCwKKzB4MjcsMHg4ZSwweDkwLDB4MDAsMHgwMSwweDgwLDB4NzgsMHgyMSwweDAwLDB4MTIsMHgzMCwweGMwLDB4MDAsMHhkMiwweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0YywweDEwLDB4MjEsMHg5NCwweDQyLDB4MDAsMHgwNiwweDhmLDB4YTMsMHgwMCwweDJjLAorMHg4ZiwweGE0LDB4MDAsMHgzMCwweGFmLDB4YTIsMHgwMCwweDQ0LDB4OGYsMHhhNSwweDAwLDB4NDQsMHgzMCwweDQ5LDB4MDAsMHgwMywKKzB4MDIsMHgwOSwweDEwLDB4MjMsMHgzMCwweDQyLDB4MDAsMHgwMywweDAwLDB4YTIsMHgxMCwweDIxLDB4OGYsMHhhOCwweDAwLDB4MzAsCisweDI0LDB4NDIsMHgwMCwweDA0LDB4MzAsMHg0MiwweGZmLDB4ZmYsMHgwMCwweDY0LDB4MzgsMHgyMSwweDAxLDB4MDIsMHgyOCwweDIzLAorMHgwMCwweDYyLDB4MTgsMHgyMSwweDAwLDB4NDgsMHgxMCwweDJiLDB4MTAsMHg0MCwweDAwLDB4NTIsMHgwMCwweDAwLDB4MjAsMHgyMSwKKzB4MzAsMHhlNywweGZmLDB4ZmYsMHgzMCwweGE0LDB4ZmYsMHhmZiwweGFmLDB4YTcsMHgwMCwweDJjLDB4MDAsMHhkMiwweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg1MSwweDE4LDB4MjEsMHg4YywweDY1LDB4MDAsMHgxOCwweDAwLDB4MDQsMHgyNSwweDQwLAorMHgwMCwweDhkLDB4MjAsMHgyNCwweDhjLDB4YTgsMHgwMCwweDA0LDB4MDAsMHg0ZSwweDE4LDB4MjEsMHgwMCwweDRmLDB4NTAsMHgyMSwKKzB4MDEsMHgwYiwweDQwLDB4MjQsMHgwMSwweDA0LDB4NDAsMHgyNSwweGFjLDB4YTgsMHgwMCwweDA0LDB4OGYsMHhhNCwweDAwLDB4OTgsCisweDhmLDB4YTIsMHgwMCwweDUwLDB4MjYsMHhiNSwweDAwLDB4MDEsMHhhMCwweDY0LDB4MDAsMHgwMCwweDhjLDB4YTQsMHgwMCwweDA4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4ODEsMHgwMCwweDBjLDB4MDIsMHhhMiwweDMwLDB4MmEsMHg4MCwweDYyLDB4MDAsMHgwNiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDQyLDB4MDAsMHgwMiwweDAwLDB4MDIsMHgxZiwweGMyLDB4MDAsMHg0MywweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDQzLDB4MDAsMHgwMiwweDEwLDB4NDAsMHgwMCwweGEyLDB4MzgsMHgyMSwweDhmLDB4YTUsMHgwMCwweDQwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweGE0LDB4ZTUsMHgwMCwweDAwLDB4OTUsMHg1MiwweDAwLDB4MDIsMHgxNCwweGMwLDB4ZmYsMHhjNywKKzB4MDAsMHgxMiwweDMwLDB4YzAsMHg4ZiwweGE0LDB4MDAsMHgyNCwweDhmLDB4YTUsMHgwMCwweDUwLDB4OGYsMHhhNiwweDAwLDB4MWMsCisweDhmLDB4YTMsMHgwMCwweDJjLDB4MDAsMHg4NSwweDgwLDB4MjEsMHhhMCwweGQwLDB4MDAsMHgxMiwweDAwLDB4MDksMHgxMCwweDIzLAorMHgzMCwweDQyLDB4MDAsMHgwMywweDhmLDB4YTgsMHgwMCwweDg4LDB4MDAsMHg2MiwweDEwLDB4MjMsMHhhNCwweGMyLDB4MDAsMHgxYSwKKzB4ODUsMHgwMywweDAwLDB4MGMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgxMCwweGMwLDB4MDAsMHg0MywweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MjcsMHg4MywweDhmLDB4ZjQsMHgwMCwweDQzLDB4MTAsMHgyMSwweDhjLDB4NDQsMHgwMCwweDE4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDhjLDB4ODMsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDYzLDB4MDAsMHgxMCwKKzB4MTQsMHg2MCwweGZmLDB4NzQsMHgwMiwweDAwLDB4MTAsMHgyMSwweDhmLDB4YTMsMHgwMCwweDU0LDB4OGYsMHhhNCwweDAwLDB4MTgsCisweDhmLDB4YTUsMHgwMCwweDI0LDB4MDAsMHg2NCwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwweDI3LDB4ODMsMHg5MCwweDA4LAorMHgwMCwweDQzLDB4MTAsMHgyMSwweDkwLDB4NDQsMHgwMCwweDAwLDB4MTAsMHhhMCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MzAsMHgyMSwKKzB4MDgsMHgwMCwweDFkLDB4NTEsMHgwMiwweDAwLDB4MTAsMHgyMSwweDkzLDB4ODIsMHg4MCwweDEwLDB4MDAsMHgwMCwweDI4LDB4MjEsCisweDAwLDB4MDAsMHgzOCwweDIxLDB4MGMsMHgwMCwweDIxLDB4ZjUsMHhhZiwweGEyLDB4MDAsMHgxMCwweDA4LDB4MDAsMHgxZCwweDUxLAorMHgwMiwweDAwLDB4MTAsMHgyMSwweDMwLDB4NjMsMHhmZiwweGZmLDB4MDgsMHgwMCwweDFkLDB4YTMsMHhhZiwweGEzLDB4MDAsMHgyYywKKzB4OGYsMHhhOCwweDAwLDB4NDQsMHgwOCwweDAwLDB4MWQsMHhjNSwweDMxLDB4MDksMHgwMCwweDAzLDB4MDgsMHgwMCwweDFkLDB4N2UsCisweGFmLDB4YTMsMHgwMCwweDUwLDB4OGYsMHhhNiwweDAwLDB4NDQsMHhhZiwweGEwLDB4MDAsMHg1MCwweDA4LDB4MDAsMHgxZCwweGM1LAorMHgzMCwweGM5LDB4MDAsMHgwMywweDhmLDB4YTUsMHgwMCwweDQ4LDB4OGYsMHhhNiwweDAwLDB4NGMsMHg4ZiwweGE0LDB4MDAsMHgxYywKKzB4MDMsMHhjMCwweDM4LDB4MjEsMHgwYywweDAwLDB4MWIsMHhmNiwweGFmLDB4YjcsMHgwMCwweDEwLDB4MDgsMHgwMCwweDFkLDB4MmUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNSwweDI4LDB4ODAsMHgyNywweDgyLDB4OGYsMHhmMCwweDAwLDB4YTIsMHgyOCwweDIxLAorMHgwMCwweDAwLDB4MjAsMHgyMSwweDBjLDB4MDAsMHgwMSwweDRiLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MWQsMHgyNywKKzB4MjYsMHhlMiwweDAwLDB4MDEsMHgwMCwweDAyLDB4ODAsMHg4MCwweDI3LDB4ODMsMHg5MCwweDAwLDB4OGYsMHhhNCwweDAwLDB4MWMsCisweDAyLDB4MDMsMHgxOCwweDIxLDB4MjYsMHgzMSwweDAwLDB4MDEsMHgwMiwweDQwLDB4MjgsMHgyMSwweDBjLDB4MDAsMHgxZiwweDA4LAorMHhhMCwweDcxLDB4MDAsMHgwNSwweDE0LDB4NDAsMHhmZiwweDEzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNiwweGUwLDB4MDAsMHg0ZCwKKzB4MDMsMHhjMCwweDM4LDB4MjEsMHg4ZiwweGE0LDB4MDAsMHgyNCwweDhmLDB4YTUsMHgwMCwweDIwLDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDI0LDB4ODQsMHgwMCwweDAxLDB4YWYsMHhiMiwweDAwLDB4NDgsMHhhZiwweGI2LDB4MDAsMHg0YywweDAyLDB4YzAsMHhmMCwweDIxLAorMHgxMCwweGEyLDB4MDAsMHg0MSwweGFmLDB4YTQsMHgwMCwweDI0LDB4MjcsMHg4MiwweDhmLDB4ZjAsMHgwMiwweDAyLDB4MTAsMHgyMSwKKzB4OTQsMHg0MiwweDAwLDB4MDYsMHg4ZiwweGE0LDB4MDAsMHgzMCwweGFmLDB4YTAsMHgwMCwweDIwLDB4YWYsMHhhMiwweDAwLDB4NDQsCisweDMwLDB4NDksMHgwMCwweDAzLDB4OGYsMHhhOCwweDAwLDB4NDQsMHgwMCwweDA5LDB4MTAsMHgyMywweDMwLDB4NDIsMHgwMCwweDAzLAorMHgwMSwweDAyLDB4MTAsMHgyMSwweDI0LDB4NDIsMHgwMCwweDA0LDB4MzAsMHg0MiwweGZmLDB4ZmYsMHgwMCwweDQ0LDB4MTgsMHgyYiwKKzB4MTAsMHg2MCwweDAwLDB4MmIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4YTUsMHgwMCwweDJjLDB4MDAsMHg4MiwweDEwLDB4MjMsCisweDAwLDB4YTQsMHgxOCwweDIxLDB4MzAsMHg2MywweGZmLDB4ZmYsMHgzMCwweDQ0LDB4ZmYsMHhmZiwweGFmLDB4YTMsMHgwMCwweDJjLAorMHgwMiwweDkyLDB4MjgsMHgyMSwweDAwLDB4MDUsMHgyOCwweDgwLDB4MjcsMHg4MiwweDhmLDB4ZjQsMHgwMCwweGEyLDB4MTAsMHgyMSwKKzB4OGMsMHg0NiwweDAwLDB4MTgsMHgzYywweDAzLDB4ODAsMHhmZiwweDNjLDB4MDIsMHg3ZiwweDAwLDB4OGMsMHhjOCwweDAwLDB4MDQsCisweDAwLDB4MDQsMHgyNSwweDQwLDB4MzQsMHg2MywweGZmLDB4ZmYsMHgwMCwweDgyLDB4MjAsMHgyNCwweDAxLDB4MDMsMHg0MCwweDI0LAorMHgwMSwweDA0LDB4NDAsMHgyNSwweGFjLDB4YzgsMHgwMCwweDA0LDB4OGYsMHhhOCwweDAwLDB4OTgsMHgyNywweDgyLDB4OTAsMHgwMCwKKzB4MDAsMHhhMiwweDEwLDB4MjEsMHhhMCwweDQ4LDB4MDAsMHgwMCwweDhjLDB4YzQsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDQsMHgyNywweGMyLDB4MTAsMHg4MCwweGZlLDB4ZGIsMHhhZiwweGE0LDB4MDAsMHgzYywweDgwLDB4NDIsMHgwMCwweDA2LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NDIsMHgwMCwweDAyLDB4MDAsMHgwMiwweDFmLDB4YzIsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4MDAsMHgwMiwweDEwLDB4NDMsMHgwMCwweDAyLDB4MTAsMHg0MCwweDAwLDB4YzIsMHgzOCwweDIxLDB4OGYsMHhhMiwweDAwLDB4NDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4YTQsMHhlMiwweDAwLDB4MDAsMHgwOCwweDAwLDB4MWQsMHgyYSwweDI2LDB4YjUsMHhmZiwweGZmLAorMHg4ZiwweGE2LDB4MDAsMHgyYywweDAwLDB4MDAsMHgyMCwweDIxLDB4MDAsMHhjMiwweDEwLDB4MjEsMHgzMCwweDQyLDB4ZmYsMHhmZiwKKzB4MDgsMHgwMCwweDFlLDB4MzgsMHhhZiwweGEyLDB4MDAsMHgyYywweDhmLDB4YTYsMHgwMCwweDFjLDB4MDgsMHgwMCwweDFlLDB4MjIsCisweGE0LDB4ZDIsMHgwMCwweDE0LDB4OGYsMHhhNSwweDAwLDB4NDgsMHg4ZiwweGE2LDB4MDAsMHg0YywweDhmLDB4YTQsMHgwMCwweDFjLAorMHgwYywweDAwLDB4MWIsMHhmNiwweGFmLDB4YjcsMHgwMCwweDEwLDB4MDgsMHgwMCwweDFlLDB4MTksMHgwMCwweDAwLDB4YjgsMHgyMSwKKzB4MGMsMHgwMCwweDEyLDB4ODcsMHgwMCwweDAwLDB4MjgsMHgyMSwweDAwLDB4NDAsMHgxOCwweDIxLDB4OTQsMHg0MiwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzQsMHg0MiwweDA4LDB4MDAsMHhhNCwweDYyLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxZCwweDFlLAorMHgwMiwweDcxLDB4MTAsMHgyMSwweDAyLDB4OTIsMHgxOCwweDIxLDB4MDAsMHgwMywweDgwLDB4ODAsMHgyNywweDgyLDB4OGYsMHhmNCwKKzB4MDIsMHgwMiwweDEwLDB4MjEsMHg4YywweDQ0LDB4MDAsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGMsMHg4MywweDAwLDB4MDQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg2MywweDAwLDB4MTAsMHgxMCwweDYwLDB4MDAsMHgwOSwweDI0LDB4MDYsMHgwMCwweDAxLAorMHg5MywweDgyLDB4OGIsMHg2MSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4MDEsMHgxMCwweDQwLDB4ZmUsMHhhMiwKKzB4M2MsMHgwNCwweDAwLDB4ODAsMHgyNywweDg1LDB4OGYsMHhmMCwweDA4LDB4MDAsMHgxZSwweDA5LDB4MDIsMHgwNSwweDI4LDB4MjEsCisweDI3LDB4ODMsMHg5MCwweDA4LDB4MjcsMHg4MiwweDkwLDB4MDAsMHgwMiwweDAzLDB4MTgsMHgyMSwweDAyLDB4MDIsMHgxMCwweDIxLAorMHg5MCwweDY0LDB4MDAsMHgwMCwweDkwLDB4NDUsMHgwMCwweDA1LDB4OTMsMHg4MywweDgwLDB4MTAsMHgwMCwweDAwLDB4MzgsMHgyMSwKKzB4MGMsMHgwMCwweDIxLDB4ZjUsMHhhZiwweGEzLDB4MDAsMHgxMCwweDA4LDB4MDAsMHgxZSwweDgwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI3LDB4ODIsMHg5MCwweDA4LDB4MDIsMHgwMiwweDEwLDB4MjEsMHg5NCwweDQzLDB4MDAsMHgwMiwweDhmLDB4YTYsMHgwMCwweDU4LAorMHgwMCwweDAzLDB4MTksMHgwMiwweDAwLDB4NjYsMHgxOCwweDIzLDB4MzAsMHg2MywweDBmLDB4ZmYsMHgyOCwweDYyLDB4MDAsMHgyMCwKKzB4MTAsMHg0MCwweDAwLDB4MDYsMHgyOCwweDYyLDB4MDAsMHg0MCwweDhmLDB4YTgsMHgwMCwweDkwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4NjgsMHgxMCwweDA2LDB4MDgsMHgwMCwweDFjLDB4ZjcsMHgzMCwweDQ0LDB4MDAsMHgwMSwweDEwLDB4NDAsMHgwMCwweDA0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4YTQsMHgwMCwweDk0LDB4MDgsMHgwMCwweDFlLDB4YTEsMHgwMCwweDY0LDB4MTAsMHgwNiwKKzB4MDgsMHgwMCwweDFjLDB4ZjcsMHgwMCwweDAwLDB4MjAsMHgyMSwweDhmLDB4YTQsMHgwMCwweDk4LDB4OGYsMHhhNSwweDAwLDB4MzgsCisweGFmLDB4YTAsMHgwMCwweDEwLDB4MGMsMHgwMCwweDA5LDB4MDYsMHhhZiwweGE4LDB4MDAsMHgxNCwweDMwLDB4NDIsMHhmZiwweGZmLAorMHgwOCwweDAwLDB4MWMsMHhjNywweGFmLDB4YTIsMHgwMCwweDQwLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzYywweDAzLDB4ODAsMHgwMCwKKzB4MjcsMHhiZCwweGZmLDB4ZTAsMHgzNCwweDQyLDB4MDAsMHgyMCwweDI0LDB4NjMsMHg3YSwweGM4LDB4YWYsMHhiMSwweDAwLDB4MTQsCisweGFmLDB4YjAsMHgwMCwweDEwLDB4YWYsMHhiZiwweDAwLDB4MTgsMHhhYywweDQzLDB4MDAsMHgwMCwweDkwLDB4ODIsMHgwMCwweDBhLAorMHgwMCwweDgwLDB4ODAsMHgyMSwweDE0LDB4NDAsMHgwMCwweDQ1LDB4MDAsMHgwMCwweDg4LDB4MjEsMHg5MiwweDAyLDB4MDAsMHgwNCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgzYywweDAwLDB4MDAsMHgwMCwweDAwLDB4MTIsMHgyMCwweDAwLDB4MTgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTIsMHgwMiwweDAwLDB4MTYsMHg5MiwweDA1LDB4MDAsMHgwYSwweDMwLDB4NDIsMHgwMCwweGZjLAorMHgxMCwweGEwLDB4MDAsMHgwMywweGEyLDB4MDIsMHgwMCwweDE2LDB4MzQsMHg0MiwweDAwLDB4MDEsMHhhMiwweDAyLDB4MDAsMHgxNiwKKzB4OTIsMHgwNCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4ODMsMHgwMCwweGZmLDB4MTAsMHg2MCwweDAwLDB4MDUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTIsMHgwMiwweDAwLDB4MTYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDM0LDB4NDIsMHgwMCwweDAyLAorMHhhMiwweDAyLDB4MDAsMHgxNiwweDEwLDB4NjAsMHgwMCwweDBhLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweGEwLDB4MDAsMHgwOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg5NiwweDAyLDB4MDAsMHgwMCwweGEyLDB4MDAsMHgwMCwweDE3LDB4YTYsMHgwMiwweDAwLDB4MTQsCisweDhmLDB4YmYsMHgwMCwweDE4LDB4N2IsMHhiMCwweDAwLDB4YmMsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDIwLAorMHgxNCwweDgwLDB4MDAsMHgwNSwweDI0LDB4MDIsMHgwMCwweDAxLDB4OTYsMHgwMywweDAwLDB4MDYsMHhhMiwweDAyLDB4MDAsMHgxNywKKzB4MDgsMHgwMCwweDFlLDB4ZGMsMHhhNiwweDAzLDB4MDAsMHgxNCwweDk2LDB4MDQsMHgwMCwweDAwLDB4OTYsMHgwNSwweDAwLDB4MDYsCisweDI3LDB4ODYsMHg4ZiwweGYwLDB4MDAsMHgwNCwweDEwLDB4YzAsMHgwMCwweDA1LDB4MTgsMHhjMCwweDAwLDB4NDQsMHgxMCwweDIxLAorMHgwMCwweDY1LDB4MTgsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDY2LDB4MTgsMHgyMSwKKzB4MDAsMHg0NiwweDEwLDB4MjEsMHg4YywweDY1LDB4MDAsMHgwOCwweDhjLDB4NDQsMHgwMCwweDA4LDB4MGMsMHgwMCwweDEyLDB4NzgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MywweDAwLDB4ZmYsMHgxMCwweDYwLDB4MDAsMHgwNCwweGEyLDB4MDIsMHgwMCwweDE3LAorMHg5NiwweDAyLDB4MDAsMHgwNiwweDA4LDB4MDAsMHgxZSwweGRjLDB4YTYsMHgwMiwweDAwLDB4MTQsMHg5NiwweDAyLDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDFlLDB4ZGMsMHhhNiwweDAyLDB4MDAsMHgxNCwweDk2LDB4MDUsMHgwMCwweDAwLDB4MGMsMHgwMCwweDFmLDB4MDgsCisweDAyLDB4MDAsMHgyMCwweDIxLDB4MDgsMHgwMCwweDFlLDB4YzMsMHgwMiwweDIyLDB4ODgsMHgyMSwweDk0LDB4ODUsMHgwMCwweDA2LAorMHgwYywweDAwLDB4MWYsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDFlLDB4YmYsMHgwMCwweDQwLDB4ODgsMHgyMSwKKzB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwweDM0LDB4NjMsMHgwMCwweDIwLDB4MjQsMHg0MiwweDdjLDB4MjAsCisweDI3LDB4YmQsMHhmZiwweGYwLDB4YWMsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgyMSwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHgxMCwweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgzNCwweDYzLDB4MDAsMHgyMCwKKzB4MjQsMHg0MiwweDdjLDB4NDQsMHhhYywweDYyLDB4MDAsMHgwMCwweDkwLDB4ODksMHgwMCwweDBhLDB4MDAsMHg4MCwweDMwLDB4MjEsCisweDExLDB4MjAsMHgwMCwweDA1LDB4MDAsMHhhMCwweDUwLDB4MjEsMHg5MCwweDgyLDB4MDAsMHgxNywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxNCwweDQwLDB4MDAsMHgxYiwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTAsMHhjNywweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTAsMHhlMCwweDAwLDB4MWIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDk0LDB4YzgsMHgwMCwweDAwLDB4MjcsMHg4MywweDhmLDB4ZjAsCisweDkzLDB4ODUsMHg4YiwweDYwLDB4MDAsMHgwOCwweDEwLDB4YzAsMHgwMCwweDQ4LDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweDhjLDB4NDQsMHgwMCwweDA4LDB4MDAsMHhlNSwweDI4LDB4MmIsMHgxMCwweGEwLDB4MDAsMHgwNiwKKzB4MDEsMHg0NCwweDE4LDB4MjMsMHg4ZiwweDgyLDB4OGIsMHg3OCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MywweDEwLDB4MmIsCisweDEwLDB4NDAsMHgwMCwweDA1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAzLDB4MDAsMHgxMCwweGE0LDB4YzgsMHgwMCwweDE0LAorMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4NjAsMHgxMCwweDIxLDB4MTEsMHgyMCwweDAwLDB4MDUsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OTQsMHhjMiwweDAwLDB4MDYsMHgyNCwweDAzLDB4MDAsMHgwOCwweDA4LDB4MDAsMHgxZiwweDM0LDB4YTQsMHhjMiwweDAwLDB4MTQsCisweDA4LDB4MDAsMHgxZiwweDM0LDB4MDAsMHgwMCwweDE4LDB4MjEsMHgyNywweGJkLDB4ZmYsMHhjOCwweGFmLDB4YjUsMHgwMCwweDJjLAorMHhhZiwweGI0LDB4MDAsMHgyOCwweGFmLDB4YjMsMHgwMCwweDI0LDB4YWYsMHhiMCwweDAwLDB4MTgsMHhhZiwweGJmLDB4MDAsMHgzMCwKKzB4YWYsMHhiMiwweDAwLDB4MjAsMHhhZiwweGIxLDB4MDAsMHgxYywweDk0LDB4OTEsMHgwMCwweDA2LDB4MDAsMHg4MCwweGEwLDB4MjEsCisweDNjLDB4MDIsMHg4MCwweDAwLDB4M2MsMHgwNCwweGIwLDB4MDMsMHgwMCwweDExLDB4YTgsMHhjMCwweDM0LDB4ODQsMHgwMCwweDIwLAorMHgyNCwweDQyLDB4N2MsMHhmOCwweDAyLDB4YjEsMHg0OCwweDIxLDB4YWMsMHg4MiwweDAwLDB4MDAsMHgwMCwweDA5LDB4NDgsMHg4MCwKKzB4MjQsMHgwMywweDAwLDB4MDEsMHgyNywweDgyLDB4OTAsMHgwMCwweGEyLDB4ODMsMHgwMCwweDEyLDB4MDEsMHgyMiwweDEwLDB4MjEsCisweDI3LDB4ODQsMHg4ZiwweGY0LDB4MDEsMHgyNCwweDIwLDB4MjEsMHg4MCwweDQ4LDB4MDAsMHgwNiwweDhjLDB4OGEsMHgwMCwweDE4LAorMHgyNywweDgzLDB4OTAsMHgxMCwweDAxLDB4MjMsMHg0OCwweDIxLDB4OGQsMHgyNCwweDAwLDB4MDAsMHgyNSwweDA4LDB4MDAsMHgwMiwKKzB4OGQsMHg0MiwweDAwLDB4MDAsMHg4ZCwweDQ5LDB4MDAsMHgwNCwweDAwLDB4MDgsMHgxNywweGMyLDB4OGQsMHg0MywweDAwLDB4MDgsCisweDAxLDB4MDIsMHg0MCwweDIxLDB4MDAsMHgwNCwweDI1LDB4YzIsMHgwMCwweDA4LDB4NDAsMHg0MywweDMwLDB4ODQsMHgwMCwweDAxLAorMHgwMCwweDAzLDB4MWYsMHhjMiwweDAwLDB4MDgsMHg0MCwweDQwLDB4MDAsMHhlMCwweDgwLDB4MjEsMHgwMCwweDY0LDB4MTgsMHgyNCwKKzB4MDAsMHgwOSwweDQ5LDB4NDIsMHgwMSwweDQ4LDB4MTAsMHgyMSwweDAwLDB4YTAsMHg5OCwweDIxLDB4MDAsMHhhMCwweDIwLDB4MjEsCisweDAwLDB4NDAsMHgzOCwweDIxLDB4MDIsMHgwMCwweDI4LDB4MjEsMHgxNCwweDYwLDB4MDAsMHgxOSwweDMxLDB4MjksMHgwMCwweDAxLAorMHg5NCwweDQyLDB4MDAsMHgwMCwweDAyLDB4YjEsMHg4OCwweDIxLDB4MDIsMHgwMCwweDI4LDB4MjEsMHgwMCwweDExLDB4ODgsMHg4MCwKKzB4MjcsMHg5MCwweDhmLDB4ZjAsMHgwMiwweDMwLDB4ODAsMHgyMSwweDk2LDB4MDMsMHgwMCwweDA2LDB4MzAsMHg1MiwweGZmLDB4ZmYsCisweDAyLDB4NjAsMHgyMCwweDIxLDB4MDAsMHg2MCwweDMwLDB4MjEsMHhhNiwweDgzLDB4MDAsMHgxYSwweDI3LDB4ODIsMHg4ZiwweGY4LAorMHgwYywweDAwLDB4MDgsMHhkZiwweDAyLDB4MjIsMHg4OCwweDIxLDB4MDAsMHg1MiwweDEwLDB4MjEsMHg5NiwweDAzLDB4MDAsMHgwNiwKKzB4YTYsMHgyMiwweDAwLDB4MDQsMHg4ZiwweGJmLDB4MDAsMHgzMCwweDdiLDB4YjQsMHgwMSwweDdjLDB4N2IsMHhiMiwweDAxLDB4M2MsCisweDdiLDB4YjAsMHgwMCwweGZjLDB4MDAsMHg2MCwweDEwLDB4MjEsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDM4LAorMHhhZiwweGE5LDB4MDAsMHgxMCwweDBjLDB4MDAsMHgwOSwweDA2LDB4YWYsMHhhMCwweDAwLDB4MTQsMHgwOCwweDAwLDB4MWYsMHg3MiwKKzB4MDIsMHhiMSwweDg4LDB4MjEsMHgyNywweGJkLDB4ZmYsMHhjMCwweGFmLDB4YmUsMHgwMCwweDM4LDB4YWYsMHhiNywweDAwLDB4MzQsCisweGFmLDB4YjYsMHgwMCwweDMwLDB4YWYsMHhiNSwweDAwLDB4MmMsMHhhZiwweGIzLDB4MDAsMHgyNCwweGFmLDB4YjEsMHgwMCwweDFjLAorMHhhZiwweGJmLDB4MDAsMHgzYywweGFmLDB4YjQsMHgwMCwweDI4LDB4YWYsMHhiMiwweDAwLDB4MjAsMHhhZiwweGIwLDB4MDAsMHgxOCwKKzB4OTQsMHg5MCwweDAwLDB4MDAsMHgzYywweDA4LDB4YjAsMHgwMywweDM1LDB4MDgsMHgwMCwweDIwLDB4MDAsMHgxMCwweDEwLDB4YzAsCisweDAwLDB4NTAsMHgxOCwweDIxLDB4MDAsMHg0MCwweDg4LDB4MjEsMHgzYywweDAyLDB4ODAsMHgwMCwweDAwLDB4MDMsMHg0OCwweDgwLAorMHgyNCwweDQyLDB4N2UsMHgzNCwweDAwLDB4ODAsMHg5OCwweDIxLDB4MjcsMHg4NCwweDkwLDB4MDAsMHgwMSwweDI0LDB4MjAsMHgyMSwKKzB4OTMsMHhiNywweDAwLDB4NTMsMHhhZCwweDAyLDB4MDAsMHgwMCwweDgwLDB4ODMsMHgwMCwweDA2LDB4MjcsMHg4MiwweDhmLDB4ZjQsCisweDAxLDB4MjIsMHgxMCwweDIxLDB4OGMsMHg0NCwweDAwLDB4MTgsMHgyNCwweDYzLDB4MDAsMHgwMiwweDAwLDB4MDMsMHgxNywweGMyLAorMHg4YywweDg4LDB4MDAsMHgwOCwweDAwLDB4NjIsMHgxOCwweDIxLDB4MDAsMHgwMywweDE4LDB4NDMsMHgwMCwweDAzLDB4MTgsMHg0MCwKKzB4YWYsMHhhNywweDAwLDB4NGMsMHgyYywweGEyLDB4MDAsMHgxMCwweDAwLDB4YTAsMHhhOCwweDIxLDB4MDAsMHg4MywweDUwLDB4MjEsCisweDAwLDB4MDgsMHg0NywweGMyLDB4MDAsMHhjMCwweDU4LDB4MjEsMHgwMCwweDAwLDB4YjAsMHgyMSwweDhjLDB4OTIsMHgwMCwweDBjLAorMHgxNCwweDQwLDB4MDAsMHgxMywweDAwLDB4MDAsMHhmMCwweDIxLDB4OTIsMHg2NywweDAwLDB4MDQsMHgyNCwweDE0LDB4MDAsMHgwMSwKKzB4MTIsMHg4NywweDAwLDB4MTAsMHgwMiwweDMwLDB4MTAsMHgyMSwweDI3LDB4ODMsMHg5MCwweDA4LDB4MDEsMHgyMywweDE4LDB4MjEsCisweDgwLDB4NjQsMHgwMCwweDAwLDB4MjcsMHg4MywweGI1LDB4NjAsMHgwMCwweDA0LDB4MTEsMHgwMCwweDAwLDB4NDQsMHgxMCwweDIzLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDQsMHgxMCwweDIzLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4OTAsMHg0NCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4ODAsMHgwMCwweDIzLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAyLDB4MzAsMHgxMCwweDIxLDB4MDAsMHgwMiwweDgwLDB4ODAsMHgyNCwweDA0LDB4MDAsMHgwMSwweDI3LDB4ODMsMHg5MCwweDEwLAorMHhhMiwweDY0LDB4MDAsMHgxMiwweDAyLDB4MDMsMHgxOCwweDIxLDB4OGMsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMiwweDE1LDB4YzIsMHgzMCwweDQyLDB4MDAsMHgwMSwweDAxLDB4MDIsMHgxMCwweDI0LDB4MTQsMHg0MCwweDAwLDB4MGUsCisweDAyLDB4YTAsMHgyMCwweDIxLDB4MjcsMHg4MiwweDhmLDB4ZjAsMHgwMiwweDAyLDB4MTAsMHgyMSwweDk0LDB4NDMsMHgwMCwweDA2LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweGE2LDB4NjMsMHgwMCwweDFhLDB4OTQsMHg0MiwweDAwLDB4MDYsMHg3YiwweGJlLDB4MDEsMHhmYywKKzB4N2IsMHhiNiwweDAxLDB4YmMsMHg3YiwweGI0LDB4MDEsMHg3YywweDdiLDB4YjIsMHgwMSwweDNjLDB4N2IsMHhiMCwweDAwLDB4ZmMsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4NDAsMHg4ZiwweGE1LDB4MDAsMHg0YywweDAxLDB4NjAsMHgzMCwweDIxLAorMHgwMSwweDQwLDB4MzgsMHgyMSwweGFmLDB4YTAsMHgwMCwweDEwLDB4MGMsMHgwMCwweDA5LDB4MDYsMHhhZiwweGEwLDB4MDAsMHgxNCwKKzB4MDgsMHgwMCwweDFmLDB4ZDksMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4ODMsMHg5MCwweDEwLDB4MDEsMHgyMywweDE4LDB4MjEsCisweDhjLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MTUsMHhjMiwweDMwLDB4NDIsMHgwMCwweDAxLAorMHgwMSwweDAyLDB4MTAsMHgyNCwweDE0LDB4NDAsMHgwMCwweGFmLDB4MDAsMHhhMCwweDIwLDB4MjEsMHgzMiwweDRmLDB4MDAsMHgwMywKKzB4MDAsMHgxMiwweDEwLDB4ODIsMHgyNSwweGUzLDB4MDAsMHgwZCwweDMwLDB4NDUsMHgwMCwweDA3LDB4MDAsMHg3NCwweDc4LDB4MDQsCisweDEwLDB4YTAsMHgwMCwweDBlLDB4MDAsMHgwMCwweDkwLDB4MjEsMHgyNywweDgyLDB4ODAsMHgxYywweDAwLDB4MTUsMHgxOCwweDQwLAorMHgwMCwweDYyLDB4MTgsMHgyMSwweDk0LDB4NjQsMHgwMCwweDAwLDB4MjQsMHhhMiwweDAwLDB4MDYsMHgwMCwweDU0LDB4MTAsMHgwNCwKKzB4MDAsMHg0NCwweDAwLDB4MWEsMHgxNCwweDgwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNywweDAwLDB4MGQsCisweDAwLDB4MDAsMHgxMCwweDEyLDB4MjQsMHg0MiwweDAwLDB4MjAsMHgzMCwweDUyLDB4ZmYsMHhmYywweDAyLDB4MzAsMHgxMCwweDIxLAorMHgyNywweDgzLDB4OTAsMHgwMCwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0MywweDEwLDB4MjEsMHg5MCwweDQ0LDB4MDAsMHgwMywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDgzLDB4MDAsMHhmZiwweDJjLDB4NjIsMHgwMCwweDBjLDB4MTQsMHg0MCwweDAwLDB4MDQsCisweDJjLDB4NjIsMHgwMCwweDE5LDB4MzAsMHg4MiwweDAwLDB4MGYsMHgyNCwweDQzLDB4MDAsMHgwYywweDJjLDB4NjIsMHgwMCwweDE5LAorMHgxMCwweDQwLDB4MDAsMHgxOSwweDI0LDB4MGUsMHgwMCwweDIwLDB4MjQsMHg2MiwweGZmLDB4ZTksMHgyYywweDQyLDB4MDAsMHgwMiwKKzB4MTQsMHg0MCwweDAwLDB4MTUsMHgyNCwweDBlLDB4MDAsMHgxMCwweDI0LDB4NjIsMHhmZiwweGViLDB4MmMsMHg0MiwweDAwLDB4MDIsCisweDE0LDB4NDAsMHgwMCwweDExLDB4MjQsMHgwZSwweDAwLDB4MDgsMHgyNCwweDAyLDB4MDAsMHgxNCwweDEwLDB4NjIsMHgwMCwweDBlLAorMHgyNCwweDBlLDB4MDAsMHgwMiwweDI0LDB4NjIsMHhmZiwweGVmLDB4MmMsMHg0MiwweDAwLDB4MDMsMHgxNCwweDQwLDB4MDAsMHgwYSwKKzB4MjQsMHgwZSwweDAwLDB4MTAsMHgyNCwweDYyLDB4ZmYsMHhmMSwweDJjLDB4NDIsMHgwMCwweDAyLDB4MTQsMHg0MCwweDAwLDB4MDYsCisweDI0LDB4MGUsMHgwMCwweDA4LDB4MjQsMHg2MiwweGZmLDB4ZjMsMHgyYywweDQyLDB4MDAsMHgwMiwweDI0LDB4MGUsMHgwMCwweDA0LAorMHgyNCwweDAzLDB4MDAsMHgwMiwweDAwLDB4NjIsMHg3MCwweDBhLDB4MzAsMHhlMiwweDAwLDB4ZmYsMHgwMCwweDAwLDB4NDgsMHgyMSwKKzB4MDAsMHgwMCwweDY4LDB4MjEsMHgxMCwweDQwLDB4MDAsMHg2ZCwweDAwLDB4MDAsMHg1OCwweDIxLDB4M2MsMHgxNCwweDgwLDB4ZmYsCisweDI3LDB4OTksMHg4ZiwweGYwLDB4MDEsMHhmMiwweGMwLDB4MjMsMHgzNiwweDk0LDB4ZmYsMHhmZiwweDAxLDB4YzksMHgxMCwweDJhLAorMHgxNCwweDQwLDB4MDAsMHg2NCwweDI0LDB4MDMsMHgwMCwweDA0LDB4MDAsMHgxMCwweDI4LDB4YzAsMHgwMCwweGIwLDB4MTAsMHgyMSwKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDU5LDB4MTAsMHgyMSwweDk0LDB4NTYsMHgwMCwweDA2LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDMyLDB4Y2MsMHgwMCwweDAzLDB4MDAsMHg2YywweDEwLDB4MjMsMHgzMCwweDQyLDB4MDAsMHgwMywweDAyLDB4YzIsMHgxMCwweDIxLAorMHgyNCwweDQyLDB4MDAsMHgwNCwweDMwLDB4NTEsMHhmZiwweGZmLDB4MDIsMHgzMiwweDE4LDB4MmIsMHgxMCwweDYwLDB4MDAsMHg0ZCwKKzB4MDEsMHhmMSwweDEwLDB4MjMsMHgwMiwweDUxLDB4MTAsMHgyMywweDAxLDB4NzgsMHgxOCwweDJiLDB4MTAsMHg2MCwweDAwLDB4MzQsCisweDMwLDB4NDQsMHhmZiwweGZmLDB4MjksMHgyMiwweDAwLDB4NDAsMHgxMCwweDQwLDB4MDAsMHgzMSwweDAxLDB4NzIsMHgxOCwweDIxLAorMHgyNSwweDIyLDB4MDAsMHgwMSwweDAwLDB4MDIsMHgxNiwweDAwLDB4MDAsMHgwMiwweDRlLDB4MDMsMHgwMCwweGIwLDB4MTAsMHgyMSwKKzB4MDAsMHgwMiwweDMwLDB4ODAsMHgyNywweDgyLDB4OGYsMHhmNCwweDMwLDB4NmIsMHhmZiwweGZmLDB4MDAsMHhjMiwweDE4LDB4MjEsCisweDhjLDB4NjcsMHgwMCwweDE4LDB4MDAsMHgwNCwweDI1LDB4NDAsMHgzYywweDAzLDB4N2YsMHgwMCwweDhjLDB4ZTIsMHgwMCwweDA0LAorMHgwMCwweDgzLDB4MjAsMHgyNCwweDI3LDB4ODMsMHg5MCwweDAwLDB4MDAsMHg1NCwweDEwLDB4MjQsMHgwMCwweGMzLDB4MjgsMHgyMSwKKzB4MDAsMHg0NCwweDEwLDB4MjUsMHhhYywweGUyLDB4MDAsMHgwNCwweDE2LDB4ZTAsMHgwMCwweDAyLDB4YTAsMHhiNSwweDAwLDB4MDAsCisweGEwLDB4YjUsMHgwMCwweDAzLDB4MjcsMHg4NCwweDkwLDB4MTAsMHgwMCwweGM0LDB4MTgsMHgyMSwweDhjLDB4NjIsMHgwMCwweDAwLAorMHg4YywweGU4LDB4MDAsMHgwOCwweDAwLDB4MDIsMHgxNSwweGMyLDB4MDAsMHgwOCwweDQ3LDB4YzIsMHgzMCwweDQyLDB4MDAsMHgwMSwKKzB4MDEsMHgwMiwweDEwLDB4MjQsMHgxMCwweDQwLDB4MDAsMHgwYSwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODAsMHhhMiwweDAwLDB4MDYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4MDIsMHgwMCwweDAyLDB4MWYsMHhjMiwweDAwLDB4NDMsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MTAsMHg0MywweDAwLDB4MDIsMHgxMCwweDQwLDB4MDAsMHhlMiwweDUwLDB4MjEsMHhhNSwweDVlLDB4MDAsMHgwMCwKKzB4OTIsMHg2MiwweDAwLDB4MDQsMHgyNSwweGFkLDB4MDAsMHgwMSwweDI3LDB4ODQsMHg4ZiwweGYwLDB4MDAsMHhjNCwweDE4LDB4MjEsCisweDAxLDB4YTIsMHgxMCwweDJhLDB4OTQsMHg3MCwweDAwLDB4MDIsMHgxNCwweDQwLDB4ZmYsMHhiOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg5NiwweDYzLDB4MDAsMHgxNCwweDAwLDB4MGMsMHgxMCwweDIzLDB4YTIsMHg2OSwweDAwLDB4MTIsMHgzMCwweDQyLDB4MDAsMHgwMywKKzB4MDEsMHg2MiwweDEwLDB4MjMsMHgwMCwweDAzLDB4ODAsMHhjMCwweDhmLDB4YTUsMHgwMCwweDRjLDB4MzAsMHg0YiwweGZmLDB4ZmYsCisweDAyLDB4MDMsMHg4MCwweDIxLDB4MjcsMHg4MiwweDhmLDB4ZjgsMHgwMCwweDEwLDB4ODAsMHg4MCwweGE2LDB4NmIsMHgwMCwweDFhLAorMHgwMiwweGEwLDB4MjAsMHgyMSwweDAxLDB4NjAsMHgzMCwweDIxLDB4MDEsMHg2MCwweDg4LDB4MjEsMHgwYywweDAwLDB4MDgsMHhkZiwKKzB4MDIsMHgwMiwweDgwLDB4MjEsMHgwMCwweDVlLDB4MTAsMHgyMSwweGE2LDB4MDIsMHgwMCwweDA0LDB4MDgsMHgwMCwweDFmLDB4ZGYsCisweDAyLDB4MjAsMHgxMCwweDIxLDB4MDEsMHg2MiwweDEwLDB4MmIsMHgxMCwweDQwLDB4ZmYsMHhlOSwweDAwLDB4MDAsMHgyMCwweDIxLAorMHgyOSwweDIyLDB4MDAsMHg0MCwweDEwLDB4NDAsMHhmZiwweGU2LDB4MDEsMHg3MSwweDE4LDB4MjEsMHgwOCwweDAwLDB4MjAsMHg1NSwKKzB4MjUsMHgyMiwweDAwLDB4MDEsMHgwOCwweDAwLDB4MjAsMHg4NCwweDMyLDB4Y2MsMHgwMCwweDAzLDB4MDgsMHgwMCwweDIwLDB4ODQsCisweDAwLDB4MDAsMHg2MCwweDIxLDB4OGYsMHhhNSwweDAwLDB4NGMsMHgwMSwweDQwLDB4MzgsMHgyMSwweGFmLDB4YTAsMHgwMCwweDEwLAorMHgwYywweDAwLDB4MDksMHgwNiwweGFmLDB4YjQsMHgwMCwweDE0LDB4OTIsMHg2NywweDAwLDB4MDQsMHgwOCwweDAwLDB4MWYsMHhmNywKKzB4MzAsMHg1ZSwweGZmLDB4ZmYsMHgzMCwweDg0LDB4ZmYsMHhmZiwweDAwLDB4MDQsMHgzMCwweGMwLDB4MDAsMHhjNCwweDIwLDB4MjEsCisweDAwLDB4MDQsMHgyMCwweDgwLDB4MjcsMHg4MiwweDhmLDB4ZjAsMHgzYywweDAzLDB4YjAsMHgwOCwweDMwLDB4YTUsMHhmZiwweGZmLAorMHgwMCwweDgyLDB4MjAsMHgyMSwweDAwLDB4YzMsMHgzMCwweDIxLDB4YWMsMHhjNSwweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4YTQsMHg4NSwweDAwLDB4MDAsMHgzMCwweDg0LDB4ZmYsMHhmZiwweDAwLDB4MDQsMHgzMCwweGMwLDB4MDAsMHhjNCwweDMwLDB4MjEsCisweDI3LDB4ODgsMHg4ZiwweGYwLDB4MDAsMHgwNiwweDMwLDB4ODAsMHgwMCwweGM4LDB4MzAsMHgyMSwweDk0LDB4YzMsMHgwMCwweDA0LAorMHgzYywweDAyLDB4YjAsMHgwOCwweDNjLDB4MDcsMHhiMCwweDAzLDB4MDAsMHgwMywweDIwLDB4YzAsMHgwMCwweDgzLDB4MTgsMHgyMSwKKzB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDgyLDB4MjAsMHgyMSwweDNjLDB4MDIsMHg4MCwweDAxLDB4MzAsMHhhNSwweGZmLDB4ZmYsCisweDAwLDB4NjgsMHgxOCwweDIxLDB4MzQsMHhlNywweDAwLDB4MjAsMHgyNCwweDQyLDB4ODIsMHhlNCwweGFjLDB4ZTIsMHgwMCwweDAwLAorMHhhNCwweGM1LDB4MDAsMHgwMiwweGE0LDB4NjUsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhYywweDg1LDB4MDAsMHgwMCwKKzB4M2MsMHgwMiwweGIwLDB4MDMsMHgzYywweDAzLDB4ODAsMHgwMSwweDM0LDB4NDIsMHgwMCwweDIwLDB4MjQsMHg2MywweDgzLDB4NDAsCisweGFjLDB4NDMsMHgwMCwweDAwLDB4OTAsMHg4MiwweDAwLDB4MTAsMHgzYywweDA4LDB4YjAsMHgwMywweDNjLDB4MDksMHhiMCwweDA2LAorMHgyNywweDg3LDB4OGYsMHhmMCwweDNjLDB4MGQsMHhiMCwweDA4LDB4MzQsMHgwZSwweGZmLDB4ZmYsMHgzNSwweDA4LDB4MDAsMHg2MiwKKzB4MDAsMHg4MCwweDMwLDB4MjEsMHgyNCwweDBjLDB4ZmYsMHhmZiwweDEwLDB4NDAsMHgwMCwweDJjLDB4MzUsMHgyOSwweDgwLDB4MjAsCisweDk3LDB4ODIsMHg4ZiwweGUwLDB4OTQsMHg4NSwweDAwLDB4MGMsMHgzYywweDBiLDB4YjAsMHgwMywweDAwLDB4MDIsMHgxOCwweGMwLAorMHgwMCwweDYyLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0NywweDEwLDB4MjEsMHhhNCwweDQ1LDB4MDAsMHgwMCwKKzB4OTQsMHg4NCwweDAwLDB4MGUsMHgwMCwweDZkLDB4MTgsMHgyMSwweGFjLDB4NjUsMHgwMCwweDAwLDB4MDAsMHgwNCwweDEwLDB4YzAsCisweDAwLDB4NDQsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQ3LDB4MTAsMHgyMSwweDk0LDB4NDUsMHgwMCwweDA0LAorMHgzYywweDBhLDB4NzcsMHg3NywweDM1LDB4NmIsMHgwMCwweGI0LDB4MDAsMHgwNSwweDEwLDB4YzAsMHgwMCwweDQ1LDB4MTgsMHgyMSwKKzB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDY3LDB4MTgsMHgyMSwweDAwLDB4NGQsMHgxMCwweDIxLDB4YWMsMHg0ZSwweDAwLDB4MDAsCisweGE0LDB4NmUsMHgwMCwweDAwLDB4OTUsMHgwNCwweDAwLDB4MDAsMHg5MCwweGMzLDB4MDAsMHgxMCwweDI0LDB4MDIsMHgwMCwweGZmLAorMHgwMCwweDQ0LDB4MTAsMHgyMywweDAwLDB4NDMsMHgxMCwweDJhLDB4YTcsMHg4NSwweDhmLDB4ZTAsMHgxMCwweDQwLDB4MDAsMHgwNCwKKzB4MzUsMHg0YSwweDg4LDB4ODgsMHhhZCwweDZhLDB4MDAsMHgwMCwweDkwLDB4YzMsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDMwLDB4NjMsMHgwMCwweGZmLDB4M2MsMHgwMiwweDAwLDB4NDAsMHgwMCwweDYyLDB4MTgsMHgyNSwweGFkLDB4MjMsMHgwMCwweDAwLAorMHhhNCwweGNjLDB4MDAsMHgwZSwweGE0LDB4Y2MsMHgwMCwweDBjLDB4YTAsMHhjMCwweDAwLDB4MTAsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDg0LDB4ZmYsMHhmZiwweDAwLDB4MDQsMHgxMCwweGMwLDB4MDAsMHg0NCwweDEwLDB4MjEsCisweDI3LDB4ODksMHg4ZiwweGYwLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQ5LDB4MTAsMHgyMSwweDk3LDB4ODMsMHg4ZiwweGUwLAorMHg5NCwweDRhLDB4MDAsMHgwNCwweDNjLDB4MDIsMHhiMCwweDA4LDB4MDAsMHgwMywweDM4LDB4YzAsMHgwMCwweDBhLDB4NDAsMHhjMCwKKzB4MDAsMHhlMywweDE4LDB4MjEsMHgwMSwweDBhLDB4MjgsMHgyMSwweDAwLDB4ZTIsMHgzOCwweDIxLDB4MDEsMHgwMiwweDQwLDB4MjEsCisweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHgwNSwweDI4LDB4ODAsMHgzYywweDA2LDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAxLAorMHgwMCwweGE5LDB4MjgsMHgyMSwweDAwLDB4NjksMHgxOCwweDIxLDB4MzQsMHhjNiwweDAwLDB4MjAsMHgzNCwweDA5LDB4ZmYsMHhmZiwKKzB4MjQsMHg0MiwweDg0LDB4MzQsMHhhYywweGMyLDB4MDAsMHgwMCwweGE0LDB4NjQsMHgwMCwweDAwLDB4YWMsMHhlNCwweDAwLDB4MDAsCisweGE0LDB4YTksMHgwMCwweDAwLDB4YWQsMHgwOSwweDAwLDB4MDAsMHhhNywweDhhLDB4OGYsMHhlMCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDEsMHgzNCwweDYzLDB4MDAsMHgyMCwKKzB4MjQsMHg0MiwweDg0LDB4YjQsMHgzYywweDA0LDB4YjAsMHgwMywweGFjLDB4NjIsMHgwMCwweDAwLDB4MzQsMHg4NCwweDAxLDB4MTAsCisweDhjLDB4ODIsMHgwMCwweDAwLDB4OTcsMHg4MywweDgxLDB4NjAsMHgzMCwweDQyLDB4ZmYsMHhmZiwweDEwLDB4NjIsMHgwMCwweDE2LAorMHgyNCwweDBhLDB4MDAsMHgwMSwweGE3LDB4ODIsMHg4MSwweDYwLDB4YWYsMHg4MCwweGI0LDB4NDAsMHgwMCwweDQwLDB4MjgsMHgyMSwKKzB4MjQsMHgwNiwweDAwLDB4MDEsMHgyNywweDg0LDB4YjQsMHg0NCwweDI1LDB4NDMsMHhmZiwweGZmLDB4MDAsMHg2NiwweDEwLDB4MDQsCisweDAwLDB4YTIsMHgxMCwweDI0LDB4MTQsMHg0MCwweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhjLDB4ODMsMHhmZiwweGZjLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NjYsMHgxMCwweDA0LDB4MDAsMHhhMiwweDEwLDB4MjQsMHgzOCwweDQyLDB4MDAsMHgwMCwKKzB4MDEsMHg0MiwweDE4LDB4MGEsMHgyNSwweDRhLDB4MDAsMHgwMSwweDJkLDB4NDIsMHgwMCwweDE0LDB4YWMsMHg4MywweDAwLDB4MDAsCisweDE0LDB4NDAsMHhmZiwweGYxLDB4MjQsMHg4NCwweDAwLDB4MDQsMHgzYywweDBiLDB4YjAsMHgwMywweDAwLDB4MDAsMHg1MCwweDIxLAorMHgzYywweDBjLDB4ODAsMHgwMCwweDI3LDB4ODksMHhiNCwweDkwLDB4MzUsMHg2YiwweDAxLDB4MjAsMHg4ZCwweDY4LDB4MDAsMHgwMCwKKzB4OGQsMHgyMywweDAwLDB4MDQsMHgwMSwweDBjLDB4MTAsMHgyNCwweDAwLDB4MDIsMHgxNywweGMyLDB4MTEsMHgwMywweDAwLDB4MzcsCisweGExLDB4MjIsMHgwMCwweGRjLDB4YTEsMHgyMCwweDAwLDB4ZDUsMHhhMSwweDIwLDB4MDAsMHhkNiwweDAxLDB4MjAsMHgzMCwweDIxLAorMHgwMCwweDAwLDB4MzgsMHgyMSwweDAwLDB4MDAsMHgyOCwweDIxLDB4MDEsMHgyMCwweDIwLDB4MjEsMHgwMCwweGE4LDB4MTAsMHgwNiwKKzB4MzAsMHg0MiwweDAwLDB4MDEsMHgxMCwweGUwLDB4MDAsMHgxMCwweGEwLDB4ODIsMHgwMCwweDBhLDB4OTAsMHg4MiwweDAwLDB4MDcsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MzEsMHgyNCwweGEyLDB4ZmYsMHhmZiwweGEwLDB4ODIsMHgwMCwweDA4LAorMHg5MCwweDgyLDB4MDAsMHgwYSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MDksMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OTAsMHg4MywweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgxMCwweDQwLDB4MDAsMHg0MywweDEwLDB4MjEsCisweDAwLDB4NDYsMHgxMCwweDIxLDB4YTAsMHg0NSwweDAwLDB4MDksMHg5MCwweDgyLDB4MDAsMHgwYSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxMCwweDQwLDB4MDAsMHgwNywweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHhlMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4YTAsMHhjNSwweDAwLDB4ZDUsMHgyNCwweDA3LDB4MDAsMHgwMSwweGEwLDB4ODUsMHgwMCwweDA4LDB4YTAsMHhjNSwweDAwLDB4ZDYsCisweDI0LDB4YTUsMHgwMCwweDAxLDB4MmMsMHhhMiwweDAwLDB4MWMsMHgxNCwweDQwLDB4ZmYsMHhlMCwweDI0LDB4ODQsMHgwMCwweDAzLAorMHg5MCwweGM0LDB4MDAsMHhkNSwweDAwLDB4MDAsMHgyOCwweDIxLDB4MDAsMHhhNCwweDEwLDB4MmIsMHgxMCwweDQwLDB4MDAsMHgwYiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGMwLDB4MTgsMHgyMSwweGEwLDB4NjQsMHgwMCwweDA4LDB4OTAsMHhjMiwweDAwLDB4ZDUsCisweDI0LDB4YTUsMHgwMCwweDAxLDB4YTAsMHg2MiwweDAwLDB4MDksMHg5MCwweGM0LDB4MDAsMHhkNSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweGE0LDB4MTAsMHgyYiwweDE0LDB4NDAsMHhmZiwweGY4LDB4MjQsMHg2MywweDAwLDB4MDMsMHgyNSwweDRhLDB4MDAsMHgwMSwKKzB4MmQsMHg0MiwweDAwLDB4MDgsMHhhZCwweDI4LDB4MDAsMHgwNCwweDI1LDB4NmIsMHgwMCwweDA0LDB4MTQsMHg0MCwweGZmLDB4YmYsCisweDI1LDB4MjksMHgwMCwweGVjLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDkwLDB4ODIsMHgwMCwweDA1LAorMHgwOCwweDAwLDB4MjEsMHg2OCwweGEwLDB4ODIsMHgwMCwweDA4LDB4OTcsMHg4NSwweDhiLDB4NmEsMHgzYywweDAzLDB4YjAsMHgwMywKKzB4M2MsMHgwMiwweDgwLDB4MDEsMHgyNywweGJkLDB4ZmYsMHhlOCwweDM0LDB4NjMsMHgwMCwweDIwLDB4MjQsMHg0MiwweDg2LDB4NjgsCisweGFmLDB4YjAsMHgwMCwweDEwLDB4YWYsMHhiZiwweDAwLDB4MTQsMHhhYywweDYyLDB4MDAsMHgwMCwweDMwLDB4OTAsMHgwMCwweGZmLAorMHgwMCwweDA1LDB4MjgsMHg0MiwweDAwLDB4MDAsMHg0OCwweDIxLDB4MjcsMHg4ZiwweGI0LDB4OTQsMHgwMCwweDAwLDB4NTAsMHgyMSwKKzB4MDAsMHgwMCwweDU4LDB4MjEsMHgyNywweDk4LDB4YjUsMHg3NCwweDI3LDB4OTksMHhiNSwweDcwLDB4MjcsMHg4ZSwweGI1LDB4NmUsCisweDI3LDB4OGMsMHhiNCwweDk4LDB4MjcsMHg4ZCwweGI0LDB4ZjAsMHgyNywweDg4LDB4YjUsMHg2OCwweDAwLDB4MGEsMHgxOCwweDgwLAorMHgwMSwweDZmLDB4MTAsMHgyMSwweGFjLDB4NDAsMHgwMCwweDAwLDB4YWMsMHg0NSwweDAwLDB4NTgsMHgwMCwweDZlLDB4MjAsMHgyMSwKKzB4MDAsMHg3OCwweDEwLDB4MjEsMHhhMSwweDAwLDB4ZmYsMHhmYywweGFkLDB4MDAsMHgwMCwweDAwLDB4YTEsMHgwMCwweDAwLDB4MDQsCisweGExLDB4MDAsMHgwMCwweDA1LDB4YWQsMHgwMCwweGZmLDB4ZjgsMHgwMCwweDc5LDB4MTgsMHgyMSwweDI0LDB4MDYsMHgwMCwweDAxLAorMHgyNCwweGM2LDB4ZmYsMHhmZiwweGEwLDB4ODAsMHgwMCwweDAwLDB4YTQsMHg2MCwweDAwLDB4MDAsMHhhYywweDQwLDB4MDAsMHgwMCwKKzB4MjQsMHg2MywweDAwLDB4MDIsMHgyNCwweDQyLDB4MDAsMHgwNCwweDA0LDB4YzEsMHhmZiwweGY5LDB4MjQsMHg4NCwweDAwLDB4MDEsCisweDAwLDB4MGEsMHgxMCwweDgwLDB4MDAsMHg0ZCwweDIwLDB4MjEsMHgwMCwweDAwLDB4MzAsMHgyMSwweDAwLDB4NGMsMHgxOCwweDIxLAorMHgyNywweDg3LDB4ODEsMHg2NCwweDhjLDB4ZTIsMHgwMCwweDAwLDB4MjQsMHhlNywweDAwLDB4MDQsMHhhYywweDgyLDB4MDAsMHgwMCwKKzB4YTAsMHg2NiwweDAwLDB4MDAsMHhhMCwweDY2LDB4MDAsMHgwMSwweDI0LDB4YzYsMHgwMCwweDAxLDB4MjgsMHhjMiwweDAwLDB4MWMsCisweGEwLDB4NjAsMHgwMCwweDAyLDB4MjQsMHg4NCwweDAwLDB4MDQsMHgxNCwweDQwLDB4ZmYsMHhmNiwweDI0LDB4NjMsMHgwMCwweDAzLAorMHgyNSwweDI5LDB4MDAsMHgwMSwweDI5LDB4MjIsMHgwMCwweDA4LDB4MjUsMHg0YSwweDAwLDB4M2IsMHgyNSwweDA4LDB4MDAsMHhlYywKKzB4MTQsMHg0MCwweGZmLDB4ZDYsMHgyNSwweDZiLDB4MDAsMHhlYywweGE3LDB4ODAsMHg4MSwweDYwLDB4MDAsMHgwMCwweDQ4LDB4MjEsCisweDI3LDB4ODMsMHhiNCwweDQwLDB4YWMsMHg2OSwweDAwLDB4MDAsMHgyNSwweDI5LDB4MDAsMHgwMSwweDI5LDB4MjIsMHgwMCwweDBjLAorMHgxNCwweDQwLDB4ZmYsMHhmYywweDI0LDB4NjMsMHgwMCwweDA0LDB4MGMsMHgwMCwweDIxLDB4MmQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MmUsMHgwNCwweDAwLDB4MTQsMHgyNywweDgzLDB4YjQsMHg5MCwweDI0LDB4MDksMHgwMCwweDA3LDB4MTAsMHg4MCwweDAwLDB4MGEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTAsMHg2MiwweDAwLDB4ZDUsMHgyNSwweDI5LDB4ZmYsMHhmZiwweGEwLDB4NjIsMHgwMCwweDAwLAorMHgwNSwweDIxLDB4ZmYsMHhmYSwweDI0LDB4NjMsMHgwMCwweGVjLDB4OGYsMHhiZiwweDAwLDB4MTQsMHg4ZiwweGIwLDB4MDAsMHgxMCwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgxOCwweDkwLDB4NjIsMHgwMCwweGQ2LDB4MDgsMHgwMCwweDIxLDB4ZWIsCisweDI1LDB4MjksMHhmZiwweGZmLDB4MzAsMHg4NCwweDAwLDB4ZmYsMHgwMCwweDA0LDB4MTEsMHgwMCwweDAwLDB4NDQsMHgxMCwweDIzLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDQsMHgxMCwweDIzLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgyNywweDgzLDB4YjQsMHg5MCwKKzB4MDAsMHg0MywweDYwLDB4MjEsMHgzYywweDA0LDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAxLDB4MzQsMHg4NCwweDAwLDB4MjAsCisweDI0LDB4NDIsMHg4NywweGQ0LDB4MzAsMHhjNiwweDAwLDB4ZmYsMHg5MywweGE5LDB4MDAsMHgxMywweDMwLDB4YTUsMHgwMCwweGZmLAorMHgzMCwweGU3LDB4MDAsMHhmZiwweGFjLDB4ODIsMHgwMCwweDAwLDB4MTAsMHhjMCwweDAwLDB4ZWIsMHgyNSwweDhmLDB4MDAsMHhkMCwKKzB4OTEsMHg4MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NDIsMHhmZiwweGZjLDB4MmMsMHg0MywweDAwLDB4MTgsCisweDEwLDB4NjAsMHgwMCwweGNmLDB4M2MsMHgwMywweDgwLDB4MDEsMHgwMCwweDAyLDB4MTAsMHg4MCwweDI0LDB4NjMsMHgwMiwweDVjLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweDhjLDB4NDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDgwLDB4MDAsMHgwOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyZCwweDIyLDB4MDAsMHgyZCwweDEwLDB4NDAsMHgwMCwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4YTAsMHgwMCwweDBmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHgwMCwweDA5LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweDAwLDB4MDYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NDIsMHhmZiwweGQwLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweGFkLDB4ODIsMHgwMCwweGQwLDB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwOCwweDAwLDB4MjIsMHgyMywweDI0LDB4NDIsMHhmZiwweGUwLAorMHg4ZCwweDgyLDB4MDAsMHhkMCwweDA4LDB4MDAsMHgyMiwweDIzLDB4MjQsMHg0MiwweDAwLDB4MDEsMHgxMCwweGEwLDB4MDAsMHgwZiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweGY5LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAzLAorMHgxNCwweGEyLDB4ZmYsMHhmMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwOCwweDAwLDB4MjIsMHgyMywKKzB4MjQsMHg0MiwweGZmLDB4ZTgsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGQsMHg4MiwweDAwLDB4ZDAsCisweDA4LDB4MDAsMHgyMiwweDIzLDB4MjQsMHg0MiwweDAwLDB4MDIsMHgxMCwweGEwLDB4ZmYsMHhmYywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweGU2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4MTAsMHhhMiwweGZmLDB4ZjQsMHgyNCwweDAyLDB4MDAsMHgwMywweDE0LDB4YTIsMHhmZiwweGVmLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhkLDB4ODIsMHgwMCwweGQwLDB4MDgsMHgwMCwweDIyLDB4MjMsMHgyNCwweDQyLDB4ZmYsMHhmOCwweDJkLDB4MjIsMHgwMCwweDE5LAorMHgxNCwweDQwLDB4ZmYsMHhkZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHhhMCwweGZmLDB4ZWMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweGEyLDB4ZmYsMHhkNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDIsCisweDEwLDB4YTIsMHhmZiwweGU0LDB4MjQsMHgwMiwweDAwLDB4MDMsMHgxMCwweGEyLDB4ZmYsMHhmMSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4ZCwweDgyLDB4MDAsMHhkMCwweDA4LDB4MDAsMHgyMiwweDIzLDB4MjQsMHg0MiwweGZmLDB4ZjAsMHgyZCwweDIyLDB4MDAsMHgxYiwKKzB4MTAsMHg0MCwweGZmLDB4ZjEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4YTAsMHhmZiwweGRjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweGZmLDB4YzYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLAorMHgxNCwweGEyLDB4ZmYsMHhjZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwOCwweDAwLDB4MjIsMHgyMywKKzB4MjQsMHg0MiwweGZmLDB4ZjQsMHgyZCwweDIyLDB4MDAsMHgxZSwweDEwLDB4NDAsMHhmZiwweGUzLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4YTAsMHhmZiwweGNlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweGM5LAorMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHhmZiwweGQ2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjIsMHgzNCwKKzB4MjQsMHgwMiwweDAwLDB4MDMsMHgyZCwweDIyLDB4MDAsMHgyMywweDEwLDB4NDAsMHhmZiwweGQ3LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4YTAsMHhmZiwweGFmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweGJkLAorMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHhmZiwweGRhLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMywKKzB4MTQsMHhhMiwweGZmLDB4OWYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMiwweDI1LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDJkLDB4MjIsMHgwMCwweDI1LDB4MTAsMHg0MCwweGZmLDB4YzgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4YTAsMHhmZiwweGEwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweDAwLDB4MDYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweGEyLDB4ZmYsMHg5NywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDIyLDB4ODAsCisweDI0LDB4MDIsMHgwMCwweDAzLDB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwOCwweDAwLDB4MjIsMHgyMywweDI0LDB4NDIsMHhmZiwweGZjLAorMHgyZCwweDIyLDB4MDAsMHgxNiwweDE0LDB4NDAsMHgwMCwweDBlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweGEwLDB4ZmYsMHhhMywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweDhkLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweGZmLDB4OWIsMHgyNCwweDAyLDB4MDAsMHgwMywweDE0LDB4YTIsMHhmZiwweGE4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDhkLDB4ODIsMHgwMCwweGQwLDB4MDgsMHgwMCwweDIyLDB4MjMsMHgyNCwweDQyLDB4ZmYsMHhmYSwKKzB4MTAsMHhhMCwweGZmLDB4OTYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweGZmLDB4ODAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweGEyLDB4ZmYsMHg4ZSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MjIsMHg0OCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MmQsMHgyMiwweDAwLDB4MTcsMHgxNCwweDQwLDB4ZmYsMHg5ZSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjIsMHg5NywweDAwLDB4MDAsMHgwMCwweDAwLDB4MmQsMHgyMiwweDAwLDB4MTksCisweDEwLDB4NDAsMHhmZiwweGUyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweGEwLDB4ZmYsMHg4NCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweDZlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4MTAsMHhhMiwweGZmLDB4N2MsMHgyNCwweDAyLDB4MDAsMHgwMywweDEwLDB4YTIsMHhmZiwweDg5LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgyMiwweDI1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjIsMHhiNCwweDJkLDB4MjIsMHgwMCwweDFiLAorMHgyZCwweDIyLDB4MDAsMHgxZSwweDEwLDB4NDAsMHhmZiwweGRlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweGEwLDB4ZmYsMHg3MywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweDVkLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweGZmLDB4NmIsMHgyNCwweDAyLDB4MDAsMHgwMywweDEwLDB4YTIsMHhmZiwweDg4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMiwweDI1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyZCwweDIyLDB4MDAsMHgyMywKKzB4MTQsMHg0MCwweGZmLDB4ZjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMiwweDRlLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgyMiwweDRjLDB4MmQsMHgyMiwweDAwLDB4MjUsMHgwOCwweDAwLDB4MjIsMHg4NSwweDJkLDB4MjIsMHgwMCwweDI3LAorMHgxMCwweGEwLDB4ZmYsMHg1ZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweGEyLDB4ZmYsMHg0OCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHhmZiwweDU2LDB4MjQsMHgwMiwweDAwLDB4MDMsCisweDE0LDB4YTIsMHhmZiwweDYzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjIsMHg5MSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyZCwweDIyLDB4MDAsMHgyNywweDE0LDB4NDAsMHhmZiwweDhlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjIsMHgzZSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyZCwweDIyLDB4MDAsMHgyOSwweDE0LDB4NDAsMHhmZiwweDg5LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgyMiwweDJiLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MSwweDg2LDB4MDAsMHgwMCwweDkxLDB4ODMsMHgwMCwweGQ0LAorMHgyNSwweDhkLDB4MDAsMHg1YywweDMwLDB4YzQsMHgwMCwweGZmLDB4MDAsMHgwNCwweDEwLDB4NDAsMHgwMCwweDQ0LDB4MTAsMHgyMSwKKzB4MDAsMHgwNCwweDUwLDB4ODAsMHgwMSwweDgyLDB4NTgsMHgyMSwweDAxLDB4OGEsMHg0MCwweDIxLDB4MjUsMHg3OCwweDAwLDB4MDgsCisweDEwLDB4NjAsMHgwMCwweDM3LDB4MjUsMHgwZSwweDAwLDB4NjAsMHgyYywweGEyLDB4MDAsMHgwMywweDE0LDB4NDAsMHgwMCwweDI1LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDkxLDB4ODIsMHgwMCwweGRkLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgxZSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDg3LDB4ODEsMHg2NCwweDAxLDB4NDcsMHgxMCwweDIxLDB4OGMsMHg0MywweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4YWQsMHgwMywweDAwLDB4NjAsMHg5MSwweDYyLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDQwLDB4MzAsMHgyMSwweGExLDB4ODIsMHgwMCwweDAwLDB4MzAsMHhjMiwweDAwLDB4ZmYsMHgwMCwweDAyLDB4MTAsMHg4MCwKKzB4MDAsMHg0NywweDEwLDB4MjEsMHg4YywweDQzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweDE4LDB4NDIsCisweGFkLDB4YTMsMHgwMCwweDAwLDB4OTEsMHg4NCwweDAwLDB4MDAsMHg4ZCwweGM1LDB4MDAsMHgwMCwweDAwLDB4MDQsMHgyMCwweDgwLAorMHgwMCwweDg3LDB4MTAsMHgyMSwweDhjLDB4NDMsMHgwMCwweDAwLDB4MDAsMHgwNSwweDI4LDB4NDAsMHgwMCwweDhjLDB4MjAsMHgyMSwKKzB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweGEzLDB4MTAsMHgyYiwweDAwLDB4NjIsMHgyOCwweDBhLDB4YWMsMHg4NSwweDAwLDB4NjAsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4YTEsMHg4MCwweDAwLDB4ZDQsMHgyNywweDg3LDB4ODEsMHg2NCwweDA4LDB4MDAsMHgyMywweDBlLAorMHhhMSwweDgwLDB4MDAsMHhkZCwweDI3LDB4ODIsMHg4MSwweGQ0LDB4OGQsMHg4MywweDAwLDB4ZDgsMHgwMCwweDgyLDB4MTAsMHgyMSwKKzB4OTAsMHg0NCwweDAwLDB4MDAsMHgyNCwweDYzLDB4MDAsMHgwMSwweDAwLDB4NjQsMHgyMCwweDJiLDB4MTQsMHg4MCwweGZmLDB4MGQsCisweGFkLDB4ODMsMHgwMCwweGQ4LDB4OGQsMHgwMiwweDAwLDB4NjAsMHhhMSwweDgwLDB4MDAsMHhkNCwweDAwLDB4MDIsMHgxZiwweGMyLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDQzLDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhZCwweDgyLDB4MDAsMHg1YywKKzB4MTAsMHhlMCwweDAwLDB4MWEsMHgyNCwweDgzLDB4ZmYsMHhmYywweDJjLDB4NjIsMHgwMCwweDE4LDB4MTAsMHg0MCwweDAxLDB4MTgsCisweDAwLDB4MDMsMHgxMCwweDgwLDB4M2MsMHgwMywweDgwLDB4MDEsMHgyNCwweDYzLDB4MDIsMHhiYywweDAwLDB4NDMsMHgxMCwweDIxLAorMHg4YywweDQ0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MmQsMHgyMiwweDAwLDB4MmQsMHgxMCwweDQwLDB4MDAsMHg1ZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHhhMCwweDAwLDB4NWEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweGEyLDB4MDAsMHg1NCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHgwMCwweDUxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZCwweDgyLDB4MDAsMHhkMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDQyLDB4ZmYsMHhkMCwweGFkLDB4ODIsMHgwMCwweGQwLDB4OGQsMHhlMywweDAwLDB4MDAsCisweDhkLDB4YTIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQzLDB4MTAsMHgyMSwweGFkLDB4YTIsMHgwMCwweDAwLAorMHhhZCwweGUwLDB4MDAsMHgwMCwweDhkLDB4YTMsMHgwMCwweDAwLDB4OGQsMHhjNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHg4MywweDEwLDB4MmEsMHgxMCwweDQwLDB4MDAsMHgyMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTMsMHgwNSwweDAwLDB4MDEsCisweDkxLDB4ODIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQ1LDB4MDAsMHgwNSwweDI0LDB4MDIsMHgwMCwweDAxLAorMHhhMSwweDg1LDB4MDAsMHgwMCwweGExLDB4ODIsMHgwMCwweGQ0LDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhZCwweDgwLDB4MDAsMHhkOCwKKzB4OTEsMHg4MiwweDAwLDB4ZGQsMHgyNCwweDAzLDB4MDAsMHgwMSwweDEwLDB4NDMsMHgwMCwweDA1LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweGExLDB4ODMsMHgwMCwweGQ0LDB4YWQsMHg4MCwweDAwLDB4ZDgsMHgwMywweGUwLDB4MDAsMHgwOCwweGExLDB4ODMsMHgwMCwweGRkLAorMHgwMCwweDA0LDB4MTcsMHhjMiwweDAwLDB4ODIsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4NDMsMHhhZCwweGEyLDB4MDAsMHgwMCwKKzB4OTEsMHg4MywweDAwLDB4MDAsMHgyNywweDgyLDB4ODEsMHg2NCwweDhkLDB4YzUsMHgwMCwweDAwLDB4MDAsMHgwMywweDE4LDB4ODAsCisweDAwLDB4NjIsMHgxOCwweDIxLDB4OGMsMHg2NCwweDAwLDB4MDAsMHgwMCwweDA1LDB4MjgsMHg0MCwweDAwLDB4MDQsMHgxOCwweDgwLAorMHgwMCwweGEzLDB4MTAsMHgyYiwweDAwLDB4NjIsMHgyOCwweDBhLDB4MDgsMHgwMCwweDIzLDB4MjAsMHhhZCwweGM1LDB4MDAsMHgwMCwKKzB4OTcsMHg4MiwweDhiLDB4NmMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NjIsMHgxMCwweDJhLDB4MTAsMHg0MCwweGZlLDB4YjksCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTEsMHg4MiwweDAwLDB4ZGQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDE1LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDkxLDB4ODMsMHgwMCwweDAwLDB4MjcsMHg4MiwweDgxLDB4NjQsMHgwMCwweDAzLDB4MTgsMHg4MCwKKzB4MDAsMHg2MiwweDEwLDB4MjEsMHg4YywweDQ0LDB4MDAsMHgwMCwweDAwLDB4NmMsMHgxOCwweDIxLDB4YWMsMHg2NCwweDAwLDB4NjAsCisweDkzLDB4MDUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA1LDB4MTAsMHg4MCwweDAxLDB4ODIsMHgxMCwweDIxLAorMHgyNCwweDRlLDB4MDAsMHg2MCwweGExLDB4ODUsMHgwMCwweDAwLDB4OGQsMHhjMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMiwweDFmLDB4YzIsMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDQzLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweGFkLDB4YTIsMHgwMCwweDAwLDB4MDgsMHgwMCwweDIzLDB4OTIsMHhhMSwweDgwLDB4MDAsMHhkZCwweDhkLDB4ODIsMHgwMCwweGQwLAorMHgwOCwweDAwLDB4MjMsMHg0ZSwweDI0LDB4NDIsMHhmZiwweGUwLDB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwOCwweDAwLDB4MjMsMHg0ZSwKKzB4MjQsMHg0MiwweDAwLDB4MDEsMHgxMCwweGEwLDB4MDAsMHgwZCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDEwLDB4YTIsMHhmZiwweGY5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHhmZiwweGE3LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAzLDB4MTQsMHhhMiwweGZmLDB4ZjAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwOCwweDAwLDB4MjMsMHg0ZSwweDI0LDB4NDIsMHhmZiwweGU4LDB4OGQsMHg4MiwweDAwLDB4ZDAsCisweDA4LDB4MDAsMHgyMywweDRlLDB4MjQsMHg0MiwweDAwLDB4MDIsMHgxMCwweGEwLDB4ZmYsMHhmYywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweGU4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4MTAsMHhhMiwweGZmLDB4OTYsMHgyNCwweDAyLDB4MDAsMHgwMywweDE0LDB4YTIsMHhmZiwweGYxLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhkLDB4ODIsMHgwMCwweGQwLDB4MDgsMHgwMCwweDIzLDB4NGUsMHgyNCwweDQyLDB4ZmYsMHhmOCwweDJkLDB4MjIsMHgwMCwweDE5LAorMHgxNCwweDQwLDB4ZmYsMHhlMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHhhMCwweGZmLDB4ZWMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweGEyLDB4ZmYsMHhkOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDIsCisweDEwLDB4YTIsMHhmZiwweDg2LDB4MjQsMHgwMiwweDAwLDB4MDMsMHgxMCwweGEyLDB4ZmYsMHhmMSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4ZCwweDgyLDB4MDAsMHhkMCwweDA4LDB4MDAsMHgyMywweDRlLDB4MjQsMHg0MiwweGZmLDB4ZjAsMHgyZCwweDIyLDB4MDAsMHgxYiwKKzB4MTAsMHg0MCwweGZmLDB4ZjEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4YTAsMHhmZiwweGRjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweGZmLDB4YzgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLAorMHgxNCwweGEyLDB4ZmYsMHhkMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwOCwweDAwLDB4MjMsMHg0ZSwKKzB4MjQsMHg0MiwweGZmLDB4ZjQsMHgyZCwweDIyLDB4MDAsMHgxZSwweDEwLDB4NDAsMHhmZiwweGUzLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4YTAsMHhmZiwweGNlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweDZiLAorMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHhmZiwweGQ2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjMsMHhhYSwKKzB4MjQsMHgwMiwweDAwLDB4MDMsMHgyZCwweDIyLDB4MDAsMHgyMywweDEwLDB4NDAsMHhmZiwweGQ3LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4YTAsMHhmZiwweGIxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweDVmLAorMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHhmZiwweGRhLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMywKKzB4MTQsMHhhMiwweGZmLDB4NTYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMywweDliLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDJkLDB4MjIsMHgwMCwweDI1LDB4MTAsMHg0MCwweGZmLDB4YzgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4YTAsMHhmZiwweGEyLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweDAwLDB4MDYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweGEyLDB4ZmYsMHg5OSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDIzLDB4ZjQsCisweDI0LDB4MDIsMHgwMCwweDAzLDB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwOCwweDAwLDB4MjMsMHg0ZSwweDI0LDB4NDIsMHhmZiwweGZjLAorMHgyZCwweDIyLDB4MDAsMHgxNiwweDE0LDB4NDAsMHgwMCwweDBlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweGEwLDB4ZmYsMHhhMywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweDhmLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweGZmLDB4M2QsMHgyNCwweDAyLDB4MDAsMHgwMywweDE0LDB4YTIsMHhmZiwweGE4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDhkLDB4ODIsMHgwMCwweGQwLDB4MDgsMHgwMCwweDIzLDB4NGUsMHgyNCwweDQyLDB4ZmYsMHhmYSwKKzB4MTAsMHhhMCwweGZmLDB4OTYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweGZmLDB4ODIsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweGEyLDB4ZmYsMHgzMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MjMsMHhiYywweDAwLDB4MDAsMHgwMCwweDAwLDB4MmQsMHgyMiwweDAwLDB4MTcsMHgxNCwweDQwLDB4ZmYsMHg5ZSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjQsMHgwYiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MmQsMHgyMiwweDAwLDB4MTksCisweDEwLDB4NDAsMHhmZiwweGUyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweGEwLDB4ZmYsMHg4NCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweDcwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4MTAsMHhhMiwweGZmLDB4MWUsMHgyNCwweDAyLDB4MDAsMHgwMywweDEwLDB4YTIsMHhmZiwweDg5LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgyMywweDliLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjQsMHgyOCwweDJkLDB4MjIsMHgwMCwweDFiLAorMHgyZCwweDIyLDB4MDAsMHgxZSwweDEwLDB4NDAsMHhmZiwweGRlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweGEwLDB4ZmYsMHg3MywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweDVmLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweGZmLDB4MGQsMHgyNCwweDAyLDB4MDAsMHgwMywweDEwLDB4YTIsMHhmZiwweDg4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMywweDliLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyZCwweDIyLDB4MDAsMHgyMywKKzB4MTQsMHg0MCwweGZmLDB4ZjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMywweGMyLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgyMywweGMwLDB4MmQsMHgyMiwweDAwLDB4MjUsMHgwOCwweDAwLDB4MjMsMHhmOSwweDJkLDB4MjIsMHgwMCwweDI3LAorMHgxMCwweGEwLDB4ZmYsMHg1ZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweGEyLDB4ZmYsMHg0YSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHhmZSwweGY4LDB4MjQsMHgwMiwweDAwLDB4MDMsCisweDE0LDB4YTIsMHhmZiwweDYzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjQsMHgwNSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyZCwweDIyLDB4MDAsMHgyNywweDE0LDB4NDAsMHhmZiwweDhlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjMsMHhiMiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyZCwweDIyLDB4MDAsMHgyOSwweDE0LDB4NDAsMHhmZiwweDg5LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgyMywweGExLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweGJkLDB4ZmYsMHhlOCwweDNjLDB4MDIsMHhiMCwweDAzLAorMHhhZiwweGJmLDB4MDAsMHgxNCwweGFmLDB4YjAsMHgwMCwweDEwLDB4MzQsMHg0MiwweDAxLDB4MTgsMHgzYywweDAzLDB4YjAsMHgwMywKKzB4OGMsMHg1MCwweDAwLDB4MDAsMHgzNCwweDYzLDB4MDEsMHgyYywweDkwLDB4NjIsMHgwMCwweDAwLDB4MzIsMHgwNSwweDAwLDB4MDEsCisweGEzLDB4ODIsMHg4MCwweDEwLDB4MTQsMHhhMCwweDAwLDB4MTQsMHgzMCwweDQ0LDB4MDAsMHhmZiwweDMyLDB4MDIsMHgwMSwweDAwLAorMHgxNCwweDQwLDB4MDAsMHgwOSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzIsMHgwMiwweDA4LDB4MDAsMHgxMCwweDQwLDB4MDAsMHgwMiwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHhhMywweDgyLDB4YmMsMHgwOCwweDhmLDB4YmYsMHgwMCwweDE0LDB4OGYsMHhiMCwweDAwLDB4MTAsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MTgsMHgwYywweDAwLDB4MDUsMHgzOSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNiwweDAyLDB4ZmYsMHgwMCwweGEzLDB4ODAsMHhiYywweDA4LDB4M2MsMHgwMSwweGIwLDB4MDMsMHhhYywweDIyLDB4MDEsMHgxOCwKKzB4MDgsMHgwMCwweDI0LDB4NzcsMHgzMiwweDAyLDB4MDgsMHgwMCwweDBjLDB4MDAsMHgyMSwweDlhLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI2LDB4MDIsMHhmZiwweGZmLDB4M2MsMHgwMSwweGIwLDB4MDMsMHhhYywweDIyLDB4MDEsMHgxOCwweDA4LDB4MDAsMHgyNCwweDc0LAorMHgzMiwweDAyLDB4MDEsMHgwMCwweDI3LDB4YmQsMHhmZiwweGUwLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzNCwweDQyLDB4MDAsMHhkMCwKKzB4YWYsMHhiZiwweDAwLDB4MTgsMHg4YywweDQzLDB4MDAsMHgwMCwweDNjLDB4MDIsMHgwMCwweDQwLDB4MjQsMHgwNywweDBmLDB4ZmYsCisweDAwLDB4MDMsMHgzMywweDAyLDB4MDAsMHgwMywweDJkLDB4MDIsMHgwMCwweDAzLDB4NDMsMHgwMiwweDMwLDB4NjksMHgwZiwweGZmLAorMHgwMCwweDYyLDB4MTgsMHgyNCwweDMwLDB4YTUsMHgwMCwweDAzLDB4MzAsMHhjNiwweDAwLDB4ZmYsMHgxMCwweDYwLDB4MDAsMHgwOCwKKzB4MzEsMHgwOCwweDAwLDB4ZmYsMHgwMSwweDAwLDB4MzAsMHgyMSwweDBjLDB4MDAsMHgyNSwweDM4LDB4YWYsMHhhOSwweDAwLDB4MTAsCisweDhmLDB4YmYsMHgwMCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDIwLAorMHgwYywweDAwLDB4MjUsMHg4YSwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzNCwweDYzLDB4MDAsMHhkNCwKKzB4MDgsMHgwMCwweDI0LDB4YTAsMHhhYywweDYyLDB4MDAsMHgwMCwweDI3LDB4YmQsMHhmZiwweGMwLDB4YWYsMHhiNiwweDAwLDB4MzAsCisweGFmLDB4YjMsMHgwMCwweDI0LDB4YWYsMHhiMSwweDAwLDB4MWMsMHhhZiwweGIwLDB4MDAsMHgxOCwweGFmLDB4YmYsMHgwMCwweDNjLAorMHhhZiwweGJlLDB4MDAsMHgzOCwweGFmLDB4YjcsMHgwMCwweDM0LDB4YWYsMHhiNSwweDAwLDB4MmMsMHhhZiwweGI0LDB4MDAsMHgyOCwKKzB4YWYsMHhiMiwweDAwLDB4MjAsMHgwYywweDAwLDB4MTcsMHhjOCwweDAwLDB4ODAsMHg4MCwweDIxLDB4MDAsMHgwMCwweGIwLDB4MjEsCisweDAwLDB4MDAsMHg4OCwweDIxLDB4MTAsMHg0MCwweDAwLDB4MTIsMHgwMCwweDAwLDB4OTgsMHgyMSwweDNjLDB4MDIsMHhiMCwweDAzLAorMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDQsMHhiMCwweDAzLDB4MjQsMHgwNSwweDAwLDB4MDEsMHgzNCwweDQyLDB4MDAsMHhiYywKKzB4MzQsMHg2MywweDAwLDB4YmIsMHgzNCwweDg0LDB4MDAsMHhiYSwweGE0LDB4NDAsMHgwMCwweDAwLDB4YTAsMHg2NSwweDAwLDB4MDAsCisweGEwLDB4ODUsMHgwMCwweDAwLDB4N2IsMHhiZSwweDAxLDB4ZmMsMHg3YiwweGI2LDB4MDEsMHhiYywweDdiLDB4YjQsMHgwMSwweDdjLAorMHg3YiwweGIyLDB4MDEsMHgzYywweDdiLDB4YjAsMHgwMCwweGZjLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHg0MCwKKzB4M2MsMHgwMiwweGIwLDB4MDMsMHgzNCwweDQyLDB4MDEsMHg0NywweDkwLDB4NDQsMHgwMCwweDAwLDB4MDAsMHgxMCwweDFhLDB4MDIsCisweDNjLDB4MTUsMHhmZCwweGZmLDB4MzAsMHg4NCwweDAwLDB4ZmYsMHhhMCwweDUwLDB4MDAsMHgwMCwweDMwLDB4NzQsMHgwMCwweDBmLAorMHhhZiwweGE0LDB4MDAsMHgxMCwweDAwLDB4MDAsMHg5MCwweDIxLDB4M2MsMHgxNywweDAyLDB4MDAsMHgzNiwweGI1LDB4ZmYsMHhmZiwKKzB4M2MsMHgxZSwweGIwLDB4MDMsMHgwYywweDAwLDB4MDYsMHhjZSwweDI0LDB4MDQsMHgwNCwweDAwLDB4MDAsMHg1NywweDEwLDB4MjUsCisweDAwLDB4NDAsMHgyOCwweDIxLDB4MGMsMHgwMCwweDA2LDB4YzEsMHgyNCwweDA0LDB4MDQsMHgwMCwweDAwLDB4MDAsMHg4MCwweDIxLAorMHgwYywweDAwLDB4MjYsMHg1MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjYsMHgwMywweDAwLDB4MDEsMHgzMCwweDcwLDB4MDAsMHhmZiwKKzB4MTAsMHg0MCwweDAwLDB4NDcsMHgyZSwweDAzLDB4MDAsMHgwMiwweDE0LDB4NjAsMHhmZiwweGY5LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDBjLDB4MDAsMHgwNiwweGNlLDB4MjQsMHgwNCwweDA0LDB4MDAsMHgwMCwweDU1LDB4MTAsMHgyNCwweDAwLDB4NDAsMHgyOCwweDIxLAorMHgwYywweDAwLDB4MDYsMHhjMSwweDI0LDB4MDQsMHgwNCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMiwweDgyLDB4MDAsMHgzOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMiwweDgwLDB4MDAsMHgzNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzIsMHgyMiwweDAwLDB4NjAsCisweDMyLDB4MjMsMHgwYywweDAwLDB4MDAsMHgwMywweDFhLDB4MDIsMHgzYywweDA1LDB4MDAsMHg2MCwweDAwLDB4MDIsMHgxMSwweDQyLAorMHgwMiwweDI1LDB4MjAsMHgyNCwweDAwLDB4NDMsMHgxMCwweDI1LDB4M2MsMHgwMywweDA0LDB4MDAsMHgwMiwweDIzLDB4MjgsMHgyNCwKKzB4MDAsMHgwNCwweDI0LDB4NDIsMHgwMCwweDQ0LDB4MTAsMHgyNSwweDAwLDB4MDUsMHgyZCwweDAyLDB4MDAsMHg0NSwweDg4LDB4MjUsCisweDEyLDB4MjAsMHgwMCwweDA1LDB4MjYsMHg0MiwweDAwLDB4MDEsMHgyNiwweGMyLDB4MDAsMHgwMSwweDMwLDB4NTYsMHgwMCwweGZmLAorMHgwMiwweDcxLDB4OTgsMHgyMSwweDI2LDB4NDIsMHgwMCwweDAxLDB4MDIsMHg1ZSwweDIwLDB4MjEsMHgzMCwweDUyLDB4MDAsMHhmZiwKKzB4MmUsMHg0MywweDAwLDB4MDUsMHhhMCwweDkxLDB4MDAsMHhkOCwweDE0LDB4NjAsMHhmZiwweGNlLDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDhmLDB4YTUsMHgwMCwweDEwLDB4MzQsMHg0MiwweDAxLDB4NDcsMHhhMCwweDQ1LDB4MDAsMHgwMCwweDEyLDB4NjAsMHgwMCwweDBlLAorMHgzYywweDAyLDB4YjAsMHgwMywweDEyLDB4YzAsMHgwMCwweDBkLDB4MzQsMHg0MiwweDAwLDB4YmMsMHgwMCwweDEzLDB4MTAsMHg0MCwKKzB4MDAsMHg1MywweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHhjMCwweDAwLDB4NTMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDk4LDB4ODAsCisweDAyLDB4NzYsMHgwMCwweDFiLDB4MTYsMHhjMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDcsMHgwMCwweDBkLAorMHgwMCwweDAwLDB4OTgsMHgxMiwweDNjLDB4MDIsMHhiMCwweDAzLDB4MzQsMHg0MiwweDAwLDB4YmMsMHgzYywweDAzLDB4YjAsMHgwMywKKzB4M2MsMHgwNCwweGIwLDB4MDMsMHhhNCwweDUzLDB4MDAsMHgwMCwweDM0LDB4NjMsMHgwMCwweGJiLDB4MzQsMHg4NCwweDAwLDB4YmEsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4YTAsMHg2MCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjQsMHhjNSwweGEwLDB4ODIsMHgwMCwweDAwLAorMHgwYywweDAwLDB4MDYsMHhjZSwweDI0LDB4MDQsMHgwNCwweGZjLDB4MDgsMHgwMCwweDI0LDB4ZjMsMHgwMCwweDQwLDB4ODgsMHgyMSwKKzB4M2MsMHgwMywweGIwLDB4MDMsMHgzNCwweDYzLDB4MDAsMHhiYywweDNjLDB4MDQsMHhiMCwweDAzLDB4M2MsMHgwNSwweGIwLDB4MDMsCisweGE0LDB4NjAsMHgwMCwweDAwLDB4MzQsMHg4NCwweDAwLDB4YmIsMHgzNCwweGE1LDB4MDAsMHhiYSwweDI0LDB4MDIsMHgwMCwweDAyLAorMHgyNCwweDAzLDB4MDAsMHgwMSwweGEwLDB4ODIsMHgwMCwweDAwLDB4MDgsMHgwMCwweDI0LDB4YzUsMHhhMCwweGEzLDB4MDAsMHgwMCwKKzB4MjcsMHhiZCwweGZmLDB4ZDgsMHhhZiwweGIwLDB4MDAsMHgxMCwweDMwLDB4ZDAsMHgwMCwweGZmLDB4MmUsMHgwMiwweDAwLDB4MmUsCisweGFmLDB4YjIsMHgwMCwweDE4LDB4YWYsMHhiMSwweDAwLDB4MTQsMHhhZiwweGJmLDB4MDAsMHgyMCwweGFmLDB4YjMsMHgwMCwweDFjLAorMHgzMCwweGIxLDB4MDAsMHhmZiwweDE0LDB4NDAsMHgwMCwweDA2LDB4MDAsMHg4MCwweDkwLDB4MjEsMHg4ZiwweGJmLDB4MDAsMHgyMCwKKzB4N2IsMHhiMiwweDAwLDB4ZmMsMHg3YiwweGIwLDB4MDAsMHhiYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MjgsCisweDJlLDB4MTMsMHgwMCwweDEwLDB4MjQsMHgwNSwweDAwLDB4MTQsMHgwYywweDAwLDB4MTMsMHhhMCwweDI0LDB4MDYsMHgwMSwweDA3LAorMHgxMiwweDYwLDB4MDAsMHgzOCwweDAyLDB4MDAsMHgzMCwweDIxLDB4OGYsMHhhMiwweDAwLDB4MzgsMHgzMCwweGMzLDB4MDAsMHgzZiwKKzB4M2MsMHgwNCwweGIwLDB4MDksMHgwMCwweDAyLDB4MTQsMHgwMCwweDAwLDB4NDMsMHgzMCwweDI1LDB4MzQsMHg4NCwweDAxLDB4NjAsCisweDkwLDB4ODIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4ZmYsMHhmZCwweDI0LDB4MDIsMHgwMCwweDAxLAorMHgxMiwweDIyLDB4MDAsMHgyYSwweDJhLDB4MjIsMHgwMCwweDAyLDB4MTQsMHg0MCwweDAwLDB4MjQsMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4MTIsMHgyMiwweDAwLDB4MjAsMHgyNCwweDAyLDB4MDAsMHgwMywweDEyLDB4MjIsMHgwMCwweDE5LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDE2LDB4NjAsMHhmZiwweGUyLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMiwweDIyLDB4MDAsMHgxMywweDJhLDB4MjIsMHgwMCwweDAyLAorMHgxNCwweDQwLDB4MDAsMHgwZCwweDI0LDB4MDIsMHgwMCwweDAyLDB4MTIsMHgyMiwweDAwLDB4MDksMHgyNCwweDAyLDB4MDAsMHgwMywKKzB4MTYsMHgyMiwweGZmLDB4ZGEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDQsMHgwOCwweDRjLDB4MjQsMHgwNSwweGZmLDB4ZmYsCisweDBjLDB4MDAsMHgxMywweDViLDB4M2MsMHgwNiwweDBjLDB4YjgsMHgwOCwweDAwLDB4MjUsMHg0MywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MjUsMHg2YiwweDI0LDB4MDQsMHgwOCwweDQ4LDB4MTYsMHgyMCwweGZmLDB4ZDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDI1LDB4NmIsMHgyNCwweDA0LDB4MDgsMHg0MCwweDA4LDB4MDAsMHgyNSwweDZiLDB4MjQsMHgwNCwweDA4LDB4NDQsCisweDI0LDB4MDQsMHgwOCwweDRjLDB4MGMsMHgwMCwweDEzLDB4NWIsMHgyNCwweDA1LDB4ZmYsMHhmZiwweDA4LDB4MDAsMHgyNSwweDYwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyNSwweDc5LDB4MjQsMHgwNCwweDA4LDB4NDgsMHgxNiwweDIwLDB4ZmYsMHhlMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjUsMHg3OSwweDI0LDB4MDQsMHgwOCwweDQwLDB4MDgsMHgwMCwweDI1LDB4NzksCisweDI0LDB4MDQsMHgwOCwweDQ0LDB4MDIsMHg0MCwweDIwLDB4MjEsMHgwYywweDAwLDB4MjUsMHhjYSwweDAyLDB4MjAsMHgyOCwweDIxLAorMHgwOCwweDAwLDB4MjUsMHg0ZSwweDAwLDB4NDAsMHgzMCwweDIxLDB4MjcsMHhiZCwweGZmLDB4ZDgsMHgyYywweGMyLDB4MDAsMHgyZSwKKzB4YWYsMHhiMiwweDAwLDB4MTgsMHhhZiwweGIxLDB4MDAsMHgxNCwweGFmLDB4YjAsMHgwMCwweDEwLDB4YWYsMHhiZiwweDAwLDB4MjAsCisweGFmLDB4YjMsMHgwMCwweDFjLDB4MDAsMHhjMCwweDgwLDB4MjEsMHgzMCwweGIxLDB4MDAsMHhmZiwweDAwLDB4ODAsMHg5MCwweDIxLAorMHgxNCwweDQwLDB4MDAsMHgwNywweDAwLDB4MDAsMHgxOCwweDIxLDB4OGYsMHhiZiwweDAwLDB4MjAsMHg3YiwweGIyLDB4MDAsMHhmYywKKzB4N2IsMHhiMCwweDAwLDB4YmMsMHgwMCwweDYwLDB4MTAsMHgyMSwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MjgsCisweDJlLDB4MTMsMHgwMCwweDEwLDB4MjQsMHgwNSwweDAwLDB4MTQsMHgwYywweDAwLDB4MTMsMHhhMCwweDI0LDB4MDYsMHgwMSwweDA3LAorMHgxMiwweDYwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgzMCwweDIxLDB4M2MsMHgwMywweGIwLDB4MDksMHgzNCwweDYzLDB4MDEsMHg2MCwKKzB4OTAsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHhmZiwweGZkLDB4MzAsMHhjNSwweDAwLDB4M2YsCisweDBjLDB4MDAsMHgyNiwweDA3LDB4MDIsMHgyMCwweDIwLDB4MjEsMHgxNiwweDYwLDB4MDAsMHgwYSwweDAwLDB4NDAsMHg4MCwweDIxLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDEyLDB4MjIsMHgwMCwweDE1LDB4MmEsMHgyMiwweDAwLDB4MDIsMHgxNCwweDQwLDB4MDAsMHgwZiwKKzB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMiwweDIyLDB4MDAsMHgwYiwweDI0LDB4MDIsMHgwMCwweDAzLDB4MTIsMHgyMiwweDAwLDB4MDMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDI1LDB4OTYsMHgwMiwweDAwLDB4MTgsMHgyMSwweDI0LDB4MDQsMHgwOCwweDRjLAorMHgyNCwweDA1LDB4ZmYsMHhmZiwweDBjLDB4MDAsMHgxMywweDViLDB4M2MsMHgwNiwweDBjLDB4YjgsMHgwOCwweDAwLDB4MjUsMHg5NiwKKzB4MDIsMHgwMCwweDE4LDB4MjEsMHgwOCwweDAwLDB4MjUsMHhiOCwweDI0LDB4MDQsMHgwOCwweDQ4LDB4MTYsMHgyMCwweGZmLDB4ZjUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDI1LDB4YjgsMHgyNCwweDA0LDB4MDgsMHg0MCwweDA4LDB4MDAsMHgyNSwweGI4LAorMHgyNCwweDA0LDB4MDgsMHg0NCwweDAyLDB4NDAsMHgyMCwweDIxLDB4MGMsMHgwMCwweDI1LDB4Y2EsMHgwMiwweDIwLDB4MjgsMHgyMSwKKzB4MDgsMHgwMCwweDI1LDB4YTIsMHgwMCwweDQwLDB4MzAsMHgyMSwweDI3LDB4YmQsMHhmZiwweGU4LDB4MmMsMHhjMiwweDAwLDB4MWYsCisweGFmLDB4YjAsMHgwMCwweDEwLDB4YWYsMHhiZiwweDAwLDB4MTQsMHgwMCwweGMwLDB4ODAsMHgyMSwweDE0LDB4NDAsMHgwMCwweDFkLAorMHgzMCwweGE1LDB4MDAsMHhmZiwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweDAwLDB4MTgsMHgyOCwweGEyLDB4MDAsMHgwMiwKKzB4MTQsMHg0MCwweDAwLDB4MTIsMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHgwMCwweDBlLDB4MjQsMHgwMiwweDAwLDB4MDMsCisweDEwLDB4YTIsMHgwMCwweDA3LDB4MjQsMHgwNCwweDA4LDB4NGMsMHgyNiwweDEwLDB4ZmYsMHhlMiwweDAyLDB4MDAsMHgxMCwweDIxLAorMHg4ZiwweGJmLDB4MDAsMHgxNCwweDhmLDB4YjAsMHgwMCwweDEwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgxOCwKKzB4MjQsMHgwNSwweGZmLDB4ZmYsMHgwYywweDAwLDB4MTMsMHg1YiwweDNjLDB4MDYsMHgwZCwweGY4LDB4MDgsMHgwMCwweDI1LDB4ZGIsCisweDI2LDB4MTAsMHhmZiwweGUyLDB4MDgsMHgwMCwweDI1LDB4ZTAsMHgyNCwweDA0LDB4MDgsMHg0OCwweDE0LDB4YTAsMHhmZiwweGYyLAorMHgyNCwweDA0LDB4MDgsMHg0MCwweDA4LDB4MDAsMHgyNSwweGUxLDB4MjQsMHgwNSwweGZmLDB4ZmYsMHgwOCwweDAwLDB4MjUsMHhlMCwKKzB4MjQsMHgwNCwweDA4LDB4NDQsMHgyYywweGMyLDB4MDAsMHgxMCwweDE0LDB4NDAsMHhmZiwweGVjLDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDEwLDB4YTIsMHgwMCwweDE0LDB4MjgsMHhhMiwweDAwLDB4MDIsMHgxNCwweDQwLDB4MDAsMHgwZSwweDI0LDB4MDIsMHgwMCwweDAyLAorMHgxMCwweGEyLDB4MDAsMHgwYSwweDI0LDB4MDIsMHgwMCwweDAzLDB4MTAsMHhhMiwweDAwLDB4MDMsMHgyNCwweDA0LDB4MDgsMHg0YywKKzB4MDgsMHgwMCwweDI1LDB4ZGIsMHgyNiwweDEwLDB4ZmYsMHhmMSwweDI0LDB4MDUsMHhmZiwweGZmLDB4MGMsMHgwMCwweDEzLDB4NWIsCisweDNjLDB4MDYsMHgwZCwweGI4LDB4MDgsMHgwMCwweDI1LDB4ZGIsMHgyNiwweDEwLDB4ZmYsMHhmMSwweDA4LDB4MDAsMHgyNSwweGZhLAorMHgyNCwweDA0LDB4MDgsMHg0OCwweDE0LDB4YTAsMHhmZiwweGY2LDB4MjQsMHgwNCwweDA4LDB4NDAsMHgwOCwweDAwLDB4MjUsMHhmYiwKKzB4MjQsMHgwNSwweGZmLDB4ZmYsMHgwOCwweDAwLDB4MjUsMHhmYSwweDI0LDB4MDQsMHgwOCwweDQ0LDB4MjcsMHhiZCwweGZmLDB4ZTgsCisweDMwLDB4ODQsMHgwMCwweGZmLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweDgyLDB4MDAsMHgzOSwweGFmLDB4YmYsMHgwMCwweDEwLAorMHgyOCwweDgyLDB4MDAsMHgwMiwweDE0LDB4NDAsMHgwMCwweDI3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4MTAsMHg4MiwweDAwLDB4MTcsMHgwMCwweGEwLDB4MzAsMHgyMSwweDI0LDB4MDIsMHgwMCwweDAzLDB4MTAsMHg4MiwweDAwLDB4MDUsCisweDI0LDB4MDQsMHgwOCwweDNjLDB4OGYsMHhiZiwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHgxOCwweDBjLDB4MDAsMHgxMywweDViLDB4M2MsMHgwNSwweDNmLDB4MDAsMHgyNCwweDA0LDB4MDgsMHgzYywKKzB4M2MsMHgwNSwweDgwLDB4MDAsMHgwYywweDAwLDB4MTMsMHg1YiwweDAwLDB4MDAsMHgzMCwweDIxLDB4MjQsMHgwNCwweDA4LDB4M2MsCisweDNjLDB4MDUsMHg4MCwweDAwLDB4MGMsMHgwMCwweDEzLDB4NWIsMHgyNCwweDA2LDB4MDAsMHgwMSwweDI0LDB4MDQsMHgwOCwweGFjLAorMHgwYywweDAwLDB4MTMsMHgzZCwweDI0LDB4MDUsMHgwZiwweGZmLDB4MDgsMHgwMCwweDI2LDB4MTUsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHgwNCwweDA4LDB4MzQsMHgwYywweDAwLDB4MTMsMHg1YiwweDNjLDB4MDUsMHgzZiwweDAwLDB4MjQsMHgwNCwweDA4LDB4MzQsCisweDNjLDB4MDUsMHg4MCwweDAwLDB4MGMsMHgwMCwweDEzLDB4NWIsMHgwMCwweDAwLDB4MzAsMHgyMSwweDI0LDB4MDQsMHgwOCwweDM0LAorMHgzYywweDA1LDB4ODAsMHgwMCwweDBjLDB4MDAsMHgxMywweDViLDB4MjQsMHgwNiwweDAwLDB4MDEsMHgwOCwweDAwLDB4MjYsMHgyNCwKKzB4MjQsMHgwNCwweDA4LDB4YTgsMHgxNCwweDgwLDB4ZmYsMHhkZiwweDAwLDB4YTAsMHgzMCwweDIxLDB4MjQsMHgwNCwweDA4LDB4MjQsCisweDBjLDB4MDAsMHgxMywweDViLDB4M2MsMHgwNSwweDNmLDB4MDAsMHgyNCwweDA0LDB4MDgsMHgyNCwweDNjLDB4MDUsMHg4MCwweDAwLAorMHgwYywweDAwLDB4MTMsMHg1YiwweDAwLDB4MDAsMHgzMCwweDIxLDB4MjQsMHgwNCwweDA4LDB4MjQsMHgzYywweDA1LDB4ODAsMHgwMCwKKzB4MGMsMHgwMCwweDEzLDB4NWIsMHgyNCwweDA2LDB4MDAsMHgwMSwweDA4LDB4MDAsMHgyNiwweDI0LDB4MjQsMHgwNCwweDA4LDB4YTAsCisweDAwLDB4YTAsMHgzMCwweDIxLDB4MjQsMHgwNCwweDA4LDB4MmMsMHgwYywweDAwLDB4MTMsMHg1YiwweDNjLDB4MDUsMHgzZiwweDAwLAorMHgyNCwweDA0LDB4MDgsMHgyYywweDNjLDB4MDUsMHg4MCwweDAwLDB4MGMsMHgwMCwweDEzLDB4NWIsMHgwMCwweDAwLDB4MzAsMHgyMSwKKzB4MjQsMHgwNCwweDA4LDB4MmMsMHgzYywweDA1LDB4ODAsMHgwMCwweDBjLDB4MDAsMHgxMywweDViLDB4MjQsMHgwNiwweDAwLDB4MDEsCisweDA4LDB4MDAsMHgyNiwweDI0LDB4MjQsMHgwNCwweDA4LDB4YTQsMHgzYywweDA1LDB4MDAsMHgxNCwweDNjLDB4MDIsMHhiMCwweDA1LAorMHgzNCwweDQyLDB4MDQsMHgyMCwweDNjLDB4MDYsMHhjMCwweDAwLDB4M2MsMHgwMywweGIwLDB4MDUsMHgzYywweDA0LDB4YjAsMHgwNSwKKzB4MzQsMHhhNSwweDE3LDB4MDksMHhhYywweDQ1LDB4MDAsMHgwMCwweDM0LDB4YzYsMHgwNSwweDA3LDB4MzQsMHg2MywweDA0LDB4MjQsCisweDM0LDB4ODQsMHgwMiwweDI4LDB4M2MsMHgwNywweGIwLDB4MDUsMHgyNCwweDAyLDB4MDAsMHgyMCwweGFjLDB4NjYsMHgwMCwweDAwLAorMHgzNCwweGU3LDB4MDQsMHg1MCwweGEwLDB4ODIsMHgwMCwweDAwLDB4OTAsMHhlMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg0MiwweDAwLDB4MDMsMHgxMCwweDQwLDB4ZmYsMHhmYywweDI0LDB4MDIsMHgwMCwweDAxLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTMsMHg4NSwweDgxLDB4ZjEsMHgyNCwweDAyLDB4MDAsMHgwMSwweDE0LDB4YTIsMHgwMCwweDUxLAorMHgwMCwweDgwLDB4NDAsMHgyMSwweDhjLDB4ODksMHgwMCwweDA0LDB4M2MsMHgwMywweGIwLDB4MDEsMHgwMSwweDIzLDB4MzAsMHgyMSwKKzB4OGMsMHhjMiwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweDA4LDB4MTAsMHg0NSwweDAwLDB4NTksCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTQsMHhjMiwweDAwLDB4MzgsMHgyNCwweDAzLDB4MDAsMHhiNCwweDMwLDB4NDQsMHgwMCwweGZmLAorMHgxMCwweDgzLDB4MDAsMHg2MSwweDI0LDB4MDIsMHgwMCwweGM0LDB4MTAsMHg4MiwweDAwLDB4NTQsMHgyNCwweDAyLDB4MDAsMHg5NCwKKzB4MTAsMHg4MiwweDAwLDB4NDUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDk0LDB4YzIsMHgwMCwweDM4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDMwLDB4NDcsMHhmZiwweGZmLDB4MzAsMHhlMywweDQwLDB4ZmYsMHgyNCwweDAyLDB4NDAsMHg4OCwweDE0LDB4NjIsMHgwMCwweDM5LAorMHgzMCwweGUzLDB4MDMsMHgwMCwweDI0LDB4MDIsMHgwMywweDAwLDB4MTAsMHg2MiwweDAwLDB4MzgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OTQsMHhjMiwweDAwLDB4NTYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDcsMHhmZiwweGZmLDB4MzAsMHhlMiwweDAwLDB4ODAsCisweDE0LDB4NDAsMHgwMCwweDMwLDB4M2MsMHgwMiwweGIwLDB4MDEsMHgwMSwweDIyLDB4MzAsMHgyMSwweDk0LDB4YzMsMHgwMCwweDYwLAorMHgyNCwweDAyLDB4MDAsMHgwOCwweDE0LDB4NDMsMHgwMCwweDNiLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MCwweGMyLDB4MDAsMHg2MiwKKzB4MjQsMHgwMywweDAwLDB4MDQsMHgwMCwweDAyLDB4MzksMHgwMiwweDEwLDB4ZTMsMHgwMCwweDE1LDB4MjQsMHgwMiwweDAwLDB4MDYsCisweDE0LDB4ZTIsMHgwMCwweDM0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZCwweDA1LDB4MDEsMHhhYywweDk0LDB4YzQsMHgwMCwweDY2LAorMHgyNywweDgyLDB4ODksMHg1OCwweDAwLDB4MDUsMHgyOCwweDgwLDB4MzAsMHg4NywweGZmLDB4ZmYsMHgwMCwweGEyLDB4MjgsMHgyMSwKKzB4MDAsMHgwNywweDFhLDB4MDAsMHg4YywweGE0LDB4MDAsMHgwMCwweDAwLDB4MDcsMHgxMiwweDAyLDB4MDAsMHg0MywweDEwLDB4MjUsCisweDI0LDB4NDIsMHgwMCwweDVlLDB4MjQsMHgwMywweGMwLDB4MDAsMHgzMCwweDQ3LDB4ZmYsMHhmZiwweDAwLDB4ODMsMHgyMCwweDI0LAorMHgwMCwweDg3LDB4MjAsMHgyNSwweGFjLDB4YTQsMHgwMCwweDAwLDB4MDgsMHgwMCwweDI2LDB4Y2QsMHhhZCwweDA3LDB4MDAsMHgxMCwKKzB4OGQsMHgwNSwweDAxLDB4YWMsMHg5NCwweGM0LDB4MDAsMHg2NCwweDI3LDB4ODIsMHg4OSwweDU4LDB4MDAsMHgwNSwweDI4LDB4ODAsCisweDMwLDB4ODcsMHhmZiwweGZmLDB4MDAsMHhhMiwweDI4LDB4MjEsMHgwMCwweDA3LDB4MWEsMHgwMCwweDhjLDB4YTQsMHgwMCwweDAwLAorMHgwMCwweDA3LDB4MTIsMHgwMiwweDAwLDB4NDMsMHgxMCwweDI1LDB4MjQsMHg0MiwweDAwLDB4MzYsMHgzYywweDAzLDB4ZmYsMHhmZiwKKzB4MzAsMHg0NywweGZmLDB4ZmYsMHgwMCwweDgzLDB4MjAsMHgyNCwweDAwLDB4ODcsMHgyMCwweDI1LDB4YWMsMHhhNCwweDAwLDB4MDAsCisweGFkLDB4MDcsMHgwMCwweDEwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDk0LDB4YzIsMHgwMCwweDUwLAorMHgwOCwweDAwLDB4MjYsMHg4YiwweDMwLDB4NDcsMHhmZiwweGZmLDB4OGQsMHgwNCwweDAxLDB4YWMsMHgyNywweDgzLDB4ODksMHg1OCwKKzB4MDAsMHgwNCwweDIwLDB4ODAsMHgwMCwweDgzLDB4MjAsMHgyMSwweDhjLDB4ODIsMHgwMCwweDAwLDB4M2MsMHgwMywweGZmLDB4ZmYsCisweDAwLDB4NDMsMHgxMCwweDI0LDB4MzQsMHg0MiwweDAwLDB4MmUsMHhhYywweDgyLDB4MDAsMHgwMCwweDI0LDB4MDMsMHgwMCwweDJlLAorMHhhZCwweDAzLDB4MDAsMHgxMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZCwweDA0LDB4MDEsMHhhYywKKzB4MjcsMHg4MywweDg5LDB4NTgsMHgwMCwweDA0LDB4MjAsMHg4MCwweDAwLDB4ODMsMHgyMCwweDIxLDB4OGMsMHg4MiwweDAwLDB4MDAsCisweDNjLDB4MDMsMHhmZiwweGZmLDB4MDAsMHg0MywweDEwLDB4MjQsMHgzNCwweDQyLDB4MDAsMHgwZSwweDI0LDB4MDMsMHgwMCwweDBlLAorMHgwOCwweDAwLDB4MjYsMHhjYywweGFjLDB4ODIsMHgwMCwweDAwLDB4OGQsMHgwNCwweDAxLDB4YWMsMHgyNywweDgzLDB4ODksMHg1OCwKKzB4MDAsMHgwNCwweDIwLDB4ODAsMHgwMCwweDgzLDB4MjAsMHgyMSwweDhjLDB4ODIsMHgwMCwweDAwLDB4M2MsMHgwMywweGZmLDB4ZmYsCisweDAwLDB4NDMsMHgxMCwweDI0LDB4MzQsMHg0MiwweDAwLDB4MTQsMHgyNCwweDAzLDB4MDAsMHgxNCwweDA4LDB4MDAsMHgyNiwweGNjLAorMHhhYywweDgyLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweGM2LDB4MDAsMHhmZiwKKzB4MDAsMHgwNiwweDQ4LDB4NDAsMHgwMSwweDI2LDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MjcsMHg4YiwweGJjLDB4MjAsCisweDI3LDB4ODMsMHhiYywweDI2LDB4MDAsMHg0YiwweDQwLDB4MjEsMHgwMCwweDQzLDB4MTAsMHgyMSwweDk0LDB4NDcsMHgwMCwweDAwLAorMHgzMCwweGEyLDB4M2YsMHhmZiwweDEwLDB4ZTIsMHgwMCwweDI5LDB4MzAsMHg4YSwweGZmLDB4ZmYsMHg5NSwweDAyLDB4MDAsMHgwMiwKKzB4MjQsMHgwMywweDAwLDB4MDEsMHgwMCwweDAyLDB4MTEsMHg4MiwweDMwLDB4NDIsMHgwMCwweDAxLDB4MTAsMHg0MywweDAwLDB4MTgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgyNiwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NGIsMHgzMCwweDIxLAorMHg5NCwweGM0LDB4MDAsMHgwMiwweDI3LDB4ODMsMHhiYywweDI2LDB4MjcsMHg4NSwweGJjLDB4MjQsMHgwMCwweDQ1LDB4MjgsMHgyMSwKKzB4MzAsMHg4NCwweGZmLDB4ZGYsMHgwMCwweDQzLDB4MTAsMHgyMSwweGE0LDB4YzQsMHgwMCwweDAyLDB4YTQsMHg0MCwweDAwLDB4MDAsCisweGE0LDB4YTAsMHgwMCwweDAwLDB4OTQsMHhjMywweDAwLDB4MDIsMHgzYywweDA0LDB4YjAsMHgwMSwweDAxLDB4NDQsMHgyMCwweDIxLAorMHgzMCwweDYzLDB4ZmYsMHhiZiwweGE0LDB4YzMsMHgwMCwweDAyLDB4YTAsMHhjMCwweDAwLDB4MDAsMHg4YywweDgyLDB4MDAsMHgwNCwKKzB4MjQsMHgwMywweGYwLDB4ZmYsMHgwMCwweDQzLDB4MTAsMHgyNCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4YWMsMHg4MiwweDAwLDB4MDQsCisweDI0LDB4MDIsMHhjMCwweDAwLDB4OTEsMHgwNCwweDAwLDB4MDEsMHgwMCwweGEyLDB4MTAsMHgyNCwweDAwLDB4NDcsMHgyOCwweDI1LAorMHgzYywweDAzLDB4YjAsMHgwMSwweDI0LDB4MDIsMHgwMCwweDAyLDB4MTQsMHg4MiwweGZmLDB4ZTIsMHgwMSwweDQzLDB4MTgsMHgyMSwKKzB4YWMsMHg2NSwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjYsMHhmYSwweDAxLDB4MjYsMHgxMCwweDIxLDB4MDgsMHgwMCwweDI2LDB4ZmEsCisweDAxLDB4MjYsMHgxMCwweDIxLDB4OTMsMHg4MywweDgxLDB4ZjEsMHgyNCwweDAyLDB4MDAsMHgwMSwweDE0LDB4NjIsMHgwMCwweDBkLAorMHgzYywweDAyLDB4YjAsMHgwMSwweDhjLDB4ODQsMHgwMCwweDA0LDB4M2MsMHgwNiwweGIwLDB4MDksMHgwMCwweDgyLDB4MjAsMHgyMSwKKzB4OGMsMHg4NSwweDAwLDB4MDgsMHg4YywweDgzLDB4MDAsMHgwNCwweDNjLDB4MDIsMHgwMSwweDAwLDB4MzQsMHhjNiwweDAxLDB4MDAsCisweDAwLDB4NjIsMHgxOCwweDI0LDB4MTQsMHg2MCwweDAwLDB4MDUsMHgzMCwweGE1LDB4MjAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDA2LAorMHhhMCwweGMyLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwOSwKKzB4MTAsMHhhMCwweGZmLDB4ZmMsMHgzNCwweDYzLDB4MDEsMHgwMCwweDI0LDB4MDIsMHgwMCwweDBlLDB4MDgsMHgwMCwweDI3LDB4MmQsCisweGEwLDB4NjIsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDEsMHgzMCwweGE1LDB4ZmYsMHhmZiwweDAwLDB4YTIsMHgyOCwweDIxLAorMHg4YywweGEzLDB4MDAsMHgwMCwweDNjLDB4MDIsMHgxMCwweDAwLDB4MDAsMHg4MCwweDMwLDB4MjEsMHgwMCwweDYyLDB4MTgsMHgyNCwKKzB4OGMsMHhhMiwweDAwLDB4MDQsMHgxMCwweDYwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDgwLDB4MDAsCisweDEwLDB4NDAsMHgwMCwweDEzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4YywweGMyLDB4MDEsMHhhOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDQ0LDB4MDAsMHgwMSwweDI4LDB4ODMsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4NDAsMHgwMCwweDgzLDB4MTAsMHgwYSwKKzB4OTMsMHg4MywweDgxLDB4ZjAsMHgwMCwweDAyLDB4MTEsMHg4MywweDAwLDB4MDIsMHgxMSwweDgwLDB4MDAsMHg4MiwweDIwLDB4MjMsCisweDI0LDB4NjMsMHhmZiwweGZmLDB4YWMsMHhjNCwweDAxLDB4YTgsMHhhMywweDgzLDB4ODEsMHhmMCwweDhjLDB4YzQsMHgwMSwweGFjLAorMHg4YywweGMyLDB4MDEsMHhhOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0NCwweDEwLDB4MjYsMHgwMCwweDAyLDB4MTAsMHgyYiwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDMsMHhiMCwweDAzLDB4MzQsMHg2MywweDAwLDB4NzMsCisweDkwLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHgwMSwweDE0LDB4NDAsMHgwMCwweDA0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweGEzLDB4ODAsMHg4MSwweGYxLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHhhMywweDgyLDB4ODEsMHhmMSwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MDIsMHhiMCwweDAzLDB4MzQsMHg0MiwweDAwLDB4YTgsMHg4YywweDQzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzMCwweDYyLDB4MDAsMHhmZiwweDAwLDB4MDMsMHgyZSwweDAyLDB4MDAsMHgwMiwweDM5LDB4ODAsMHgyYywweGEyLDB4MDAsMHgwMiwKKzB4MDAsMHgwMywweDM0LDB4MDIsMHgxMCwweDQwLDB4MDAsMHgwNSwweDAwLDB4MDMsMHgxYSwweDAyLDB4YTQsMHg4NywweDAxLDB4ZDgsCisweGEwLDB4ODUsMHgwMSwweGQ0LDB4YTAsMHg4NiwweDAxLDB4ZDUsMHhhMCwweDgzLDB4MDEsMHhkNiwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDhjLDB4ODIsMHgwMCwweDA0LDB4M2MsMHgwNSwweGIwLDB4MDEsMHgwMCwweDgwLDB4NTAsMHgyMSwKKzB4MDAsMHg0NSwweDEwLDB4MjEsMHg4YywweDQzLDB4MDAsMHgwNCwweDI0LDB4MDIsMHgwMCwweDA1LDB4MDAsMHgwMywweDFhLDB4MDIsCisweDMwLDB4NjksMHgwMCwweDBmLDB4MTEsMHgyMiwweDAwLDB4MGIsMHgyNCwweDAyLDB4MDAsMHgwNywweDExLDB4MjIsMHgwMCwweDA5LAorMHgyNCwweDAyLDB4MDAsMHgwYSwweDExLDB4MjIsMHgwMCwweDA3LDB4MjQsMHgwMiwweDAwLDB4MGIsMHgxMSwweDIyLDB4MDAsMHgwNSwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHg5MywweDgzLDB4ODEsMHhmMCwweDNjLDB4MDQsMHhiMCwweDA2LDB4MTAsMHg2MiwweDAwLDB4MDMsCisweDM0LDB4ODQsMHg4MCwweDE4LDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhjLDB4ODIsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgxNywweDAyLDB4MTQsMHg0MCwweGZmLDB4ZmEsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGQsMHg0MywweDAxLDB4YTgsMHgyNywweDgyLDB4ODksMHg1OCwweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHg2YSwweDIwLDB4MjEsCisweDhjLDB4ODcsMHgwMCwweGE4LDB4MDAsMHg2MiwweDE4LDB4MjEsMHg4YywweDY4LDB4MDAsMHgwMCwweDAwLDB4ZTUsMHgyOCwweDIxLAorMHg4YywweGE5LDB4MDAsMHgwMCwweDNjLDB4MDIsMHhmZiwweGZmLDB4MjcsMHg4MywweDhhLDB4NTgsMHgwMSwweDIyLDB4MTAsMHgyNCwKKzB4MDAsMHg0OCwweDEwLDB4MjUsMHhhYywweGEyLDB4MDAsMHgwMCwweDhkLDB4NDQsMHgwMSwweGE4LDB4MDAsMHgwNywweDMwLDB4YzIsCisweDNjLDB4MDIsMHgwMCwweDgwLDB4MDAsMHgwNCwweDIwLDB4ODAsMHgwMCwweDgzLDB4MjAsMHgyMSwweDAwLDB4MDYsMHgzMiwweDAwLAorMHg4YywweGE5LDB4MDAsMHgwNCwweDAwLDB4YzIsMHgzMCwweDI1LDB4OGMsMHg4MiwweDAwLDB4MDAsMHgzYywweDAzLDB4ODAsMHgwMCwKKzB4MDEsMHgyMiwweDEwLDB4MjUsMHgwMCwweDQzLDB4MTAsMHgyNSwweGFjLDB4YTIsMHgwMCwweDA0LDB4YWYsMHg4NywweGJjLDB4MTAsCisweDhjLDB4YTIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhhZiwweDgyLDB4YmMsMHgxOCwweDhjLDB4YTMsMHgwMCwweDA0LAorMHgzYywweDAxLDB4YjAsMHgwNywweGFjLDB4MjYsMHg4MCwweDE4LDB4OGQsMHg0MiwweDAxLDB4YTgsMHhhZiwweDgzLDB4YmMsMHgxNCwKKzB4OTMsMHg4NSwweDgxLDB4ZjAsMHgyNCwweDQ0LDB4MDAsMHgwMSwweDI4LDB4ODMsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4NDAsCisweDAwLDB4ODMsMHgxMCwweDBhLDB4MDAsMHgwMiwweDExLDB4ODMsMHgwMCwweDAyLDB4MTEsMHg4MCwweDI0LDB4YTUsMHhmZiwweGZmLAorMHgwMCwweDgyLDB4MjAsMHgyMywweGFkLDB4NDQsMHgwMSwweGE4LDB4YTMsMHg4NSwweDgxLDB4ZjAsMHgwOCwweDAwLDB4MjcsMHg4OSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDA1LDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAxLDB4MjQsMHg0MiwweDlmLDB4MDQsCisweDM0LDB4YTUsMHgwMCwweDIwLDB4YWMsMHhhMiwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwweDI0LDB4MDMsMHgwMCwweDIwLAorMHhhYywweDgyLDB4MDAsMHg2NCwweDNjLDB4MDIsMHg4MCwweDAxLDB4YWMsMHg4MywweDAwLDB4NjAsMHgwMCwweDgwLDB4MzgsMHgyMSwKKzB4YWMsMHg4MCwweDAwLDB4MDAsMHhhYywweDgwLDB4MDAsMHgwNCwweGFjLDB4ODAsMHgwMCwweDA4LDB4YWMsMHg4MCwweDAwLDB4NGMsCisweGFjLDB4ODAsMHgwMCwweDUwLDB4YWMsMHg4MCwweDAwLDB4NTQsMHhhYywweDgwLDB4MDAsMHgwYywweGFjLDB4ODAsMHgwMCwweDU4LAorMHhhMCwweDgwLDB4MDAsMHg1YywweDI0LDB4ODMsMHgwMCwweDY4LDB4MjQsMHg0MiwweGEwLDB4MTQsMHgyNCwweDA0LDB4MDAsMHgwZiwKKzB4MjQsMHg4NCwweGZmLDB4ZmYsMHhhYywweDYyLDB4MDAsMHgwMCwweDA0LDB4ODEsMHhmZiwweGZkLDB4MjQsMHg2MywweDAwLDB4MDQsCisweDNjLDB4MDIsMHhiMCwweDAzLDB4MzQsMHg0MiwweDAwLDB4YTgsMHhhYywweGUwLDB4MDEsMHhhOCwweGFjLDB4ZTAsMHgwMSwweGFjLAorMHhhYywweGUwLDB4MDEsMHhiMCwweGFjLDB4ZTAsMHgwMSwweGI0LDB4YTAsMHhlMCwweDAxLDB4YjgsMHhhMCwweGUwLDB4MDEsMHhiOSwKKzB4YTAsMHhlMCwweDAxLDB4YmEsMHhhMCwweGUwLDB4MDEsMHhjMCwweGEwLDB4ZTAsMHgwMSwweGMxLDB4YWMsMHhlMCwweDAxLDB4YzQsCisweGFjLDB4ZTAsMHgwMSwweGM4LDB4YWMsMHhlMCwweDAxLDB4Y2MsMHhhYywweGUwLDB4MDEsMHhkMCwweDhjLDB4NDQsMHgwMCwweDAwLAorMHgzYywweDAyLDB4ODAsMHgwMSwweDI0LDB4NDIsMHhhMCwweGZjLDB4MzAsMHg4MywweDAwLDB4ZmYsMHgwMCwweDAzLDB4MTksMHg4MCwKKzB4YTQsMHhlMywweDAxLDB4ZDgsMHhhYywweGUyLDB4MDAsMHg3OCwweDNjLDB4MDMsMHg4MCwweDAxLDB4M2MsMHgwMiwweDgwLDB4MDEsCisweDI0LDB4NjMsMHhhMiwweDg4LDB4MjQsMHg0MiwweGExLDB4ZjQsMHhhYywweGUzLDB4MDAsMHg4OCwweGFjLDB4ZTIsMHgwMCwweDk4LAorMHgzYywweDAzLDB4ODAsMHgwMSwweDNjLDB4MDIsMHg4MCwweDAxLDB4MDAsMHgwNCwweDJlLDB4MDMsMHgwMCwweDA0LDB4MzQsMHgwMywKKzB4MjQsMHg2MywweGEzLDB4MzAsMHgwMCwweDA0LDB4MjIsMHgwMywweDI0LDB4NDIsMHhhNCwweDc0LDB4YWMsMHhlMywweDAwLDB4YTAsCisweGFjLDB4ZTIsMHgwMCwweGE0LDB4YTAsMHhlNSwweDAxLDB4ZDQsMHhhMCwweGU2LDB4MDEsMHhkNSwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHhhMCwweGU0LDB4MDEsMHhkNiwweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDEsMHgzNCwweDYzLDB4MDAsMHgyMCwKKzB4MjQsMHg0MiwweGEwLDB4MTQsMHgwMywweGUwLDB4MDAsMHgwOCwweGFjLDB4NjIsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDNjLDB4MDMsMHg4MCwweDAxLDB4MzQsMHg0MiwweDAwLDB4MjAsMHgyNCwweDYzLDB4YTAsMHgyYywweGFjLDB4NDMsMHgwMCwweDAwLAorMHg4YywweDgyLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MTEsMHgwMCwweDgwLDB4MjgsMHgyMSwKKzB4OGMsMHg4MiwweDAwLDB4MTQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDBkLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhjLDB4ODQsMHgwMCwweDEwLDB4OGMsMHhhMywweDAwLDB4MTQsMHg4YywweGEyLDB4MDAsMHgwNCwweDAwLDB4ODMsMHgyMCwweDIxLAorMHgwMCwweDQ0LDB4MTAsMHgyMSwweDMwLDB4NDMsMHgwMCwweGZmLDB4MDAsMHgwMywweDE4LDB4MmIsMHgwMCwweDAyLDB4MTIsMHgwMiwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDAyLDB4MTIsMHgwMCwweDMwLDB4NDIsMHgzZiwweGZmLDB4YWMsMHhhMiwweDAwLDB4MDQsCisweGFjLDB4YTAsMHgwMCwweDAwLDB4YWMsMHhhMCwweDAwLDB4NGMsMHhhYywweGEwLDB4MDAsMHg1MCwweGFjLDB4YTAsMHgwMCwweDU0LAorMHgwMywweGUwLDB4MDAsMHgwOCwweGFjLDB4YTAsMHgwMCwweDBjLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMSwKKzB4MzQsMHg2MywweDAwLDB4MjAsMHgyNCwweDQyLDB4YTAsMHhhOCwweGFjLDB4NjIsMHgwMCwweDAwLDB4OGMsMHg4NiwweDAwLDB4MDQsCisweDNjLDB4MDIsMHhiMCwweDAxLDB4MjQsMHgwMywweDAwLDB4MDEsMHgwMCwweGMyLDB4MTAsMHgyMSwweDhjLDB4NDUsMHgwMCwweDAwLAorMHhhYywweDgzLDB4MDAsMHg0YywweDAwLDB4MDUsMHgxNCwweDAyLDB4MzAsMHhhMywweDNmLDB4ZmYsMHgzMCwweDQyLDB4MDAsMHhmZiwKKzB4YWMsMHg4MywweDAwLDB4MTAsMHhhYywweDgyLDB4MDAsMHgxNCwweDhjLDB4ODMsMHgwMCwweDE0LDB4YWMsMHg4NSwweDAwLDB4NDAsCisweDAwLDB4YzMsMHgzMCwweDIxLDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhYywweDg2LDB4MDAsMHgwOCwweDNjLDB4MDIsMHhiMCwweDAzLAorMHgzYywweDAzLDB4ODAsMHgwMSwweDI3LDB4YmQsMHhmZiwweGU4LDB4MzQsMHg0MiwweDAwLDB4MjAsMHgyNCwweDYzLDB4YTAsMHhmYywKKzB4YWYsMHhiMCwweDAwLDB4MTAsMHhhZiwweGJmLDB4MDAsMHgxNCwweGFjLDB4NDMsMHgwMCwweDAwLDB4OGMsMHg4MiwweDAwLDB4NGMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MGEsMHgwMCwweDgwLDB4ODAsMHgyMSwweGFlLDB4MDAsMHgwMCwweDAwLAorMHhhZSwweDAwLDB4MDAsMHg0YywweGFlLDB4MDAsMHgwMCwweDUwLDB4YWUsMHgwMCwweDAwLDB4NTQsMHhhZSwweDAwLDB4MDAsMHgwYywKKzB4OGYsMHhiZiwweDAwLDB4MTQsMHg4ZiwweGIwLDB4MDAsMHgxMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MTgsCisweDBjLDB4MDAsMHgyOCwweDJhLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjgsMHg0YywweGFlLDB4MDAsMHgwMCwweDAwLAorMHgzYywweDAyLDB4YjAsMHgwMywweDNjLDB4MDMsMHg4MCwweDAxLDB4MjcsMHhiZCwweGZmLDB4ZTgsMHgzNCwweDQyLDB4MDAsMHgyMCwKKzB4MjQsMHg2MywweGExLDB4NjAsMHhhZiwweGIwLDB4MDAsMHgxMCwweGFmLDB4YmYsMHgwMCwweDE0LDB4YWMsMHg0MywweDAwLDB4MDAsCisweDhjLDB4ODIsMHgwMCwweDRjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgxNiwweDAwLDB4ODAsMHg4MCwweDIxLAorMHg4ZSwweDAzLDB4MDAsMHgwOCwweDNjLDB4MDIsMHhiMCwweDAxLDB4OGUsMHgwNCwweDAwLDB4NDQsMHgwMCwweDYyLDB4MTgsMHgyMSwKKzB4OTAsMHg2NSwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweGFlLDB4MDIsMHgwMCwweDUwLDB4MzAsMHhhMywweDAwLDB4ZmYsCisweDAwLDB4MDMsMHgxMCwweDgyLDB4MDAsMHgwNCwweDIzLDB4MDIsMHgzMCwweDg0LDB4MDAsMHgwZiwweDMwLDB4NDIsMHgwMCwweDAzLAorMHgwMCwweDAzLDB4MTksMHgwMiwweGFlLDB4MDQsMHgwMCwweDM0LDB4YWUsMHgwMiwweDAwLDB4MmMsMHhhZSwweDAzLDB4MDAsMHgzMCwKKzB4YTIsMHgwNSwweDAwLDB4NDgsMHg4ZiwweGJmLDB4MDAsMHgxNCwweDhmLDB4YjAsMHgwMCwweDEwLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDI3LDB4YmQsMHgwMCwweDE4LDB4MGMsMHgwMCwweDI4LDB4MmEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyOCwweDY0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDIsMHhiMCwweDAzLDB4M2MsMHgwMywweDgwLDB4MDEsMHgyNywweGJkLDB4ZmYsMHhlOCwKKzB4MzQsMHg0MiwweDAwLDB4MjAsMHgyNCwweDYzLDB4YTEsMHhmNCwweGFmLDB4YjAsMHgwMCwweDEwLDB4YWYsMHhiZiwweDAwLDB4MTQsCisweGFjLDB4NDMsMHgwMCwweDAwLDB4OGMsMHg4MiwweDAwLDB4NTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDE2LAorMHgwMCwweDgwLDB4ODAsMHgyMSwweDkyLDB4MDMsMHgwMCwweDQ0LDB4OGUsMHgwMiwweDAwLDB4NDAsMHg4MywweDg1LDB4OGIsMHhjNCwKKzB4OTIsMHgwNCwweDAwLDB4NDEsMHgzMCwweDYzLDB4MDAsMHgwMSwweDAwLDB4MDIsMHgxNiwweDAyLDB4YWUsMHgwNCwweDAwLDB4MTQsCisweDAwLDB4MDAsMHgzMCwweDIxLDB4YWUsMHgwMiwweDAwLDB4MTgsMHgxMCwweGEwLDB4MDAsMHgwNCwweGFlLDB4MDMsMHgwMCwweDNjLAorMHgxMCwweDYwLDB4MDAsMHgwMywweDI0LDB4MDIsMHgwMCwweDAxLDB4MjQsMHgwNiwweDAwLDB4MDEsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4YTMsMHg4NiwweDhiLDB4YzQsMHg4ZiwweGJmLDB4MDAsMHgxNCwweGFlLDB4MDIsMHgwMCwweDU0LDB4OGYsMHhiMCwweDAwLDB4MTAsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MTgsMHgwYywweDAwLDB4MjgsMHg1OCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MjgsMHg4OSwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzYywweDAzLDB4ODAsMHgwMSwKKzB4MjcsMHhiZCwweGZmLDB4ZTgsMHgzNCwweDQyLDB4MDAsMHgyMCwweDI0LDB4NjMsMHhhMiwweDg4LDB4YWYsMHhiMCwweDAwLDB4MTAsCisweGFmLDB4YmYsMHgwMCwweDE0LDB4YWMsMHg0MywweDAwLDB4MDAsMHg4YywweDgyLDB4MDAsMHg1MCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxMCwweDQwLDB4MDAsMHgxYiwweDAwLDB4ODAsMHg4MCwweDIxLDB4M2MsMHgwMiwweGIwLDB4MDMsMHg4YywweDQyLDB4MDAsMHgwMCwKKzB4OTIsMHgwNCwweDAwLDB4NDQsMHg4ZSwweDAzLDB4MDAsMHg0MCwweDgzLDB4ODYsMHg4YiwweGM0LDB4OTIsMHgwNSwweDAwLDB4NDEsCisweDMwLDB4NDIsMHgwOCwweDAwLDB4MzAsMHg4NCwweDAwLDB4MDEsMHgwMCwweDAyLDB4MTIsMHhjMiwweDAwLDB4MDMsMHgxZSwweDAyLAorMHgwMCwweDgyLDB4MjAsMHgyNSwweGFlLDB4MDUsMHgwMCwweDE0LDB4MDAsMHgwMCwweDM4LDB4MjEsMHhhZSwweDAzLDB4MDAsMHgxOCwKKzB4MTAsMHhjMCwweDAwLDB4MDQsMHhhZSwweDA0LDB4MDAsMHgzYywweDEwLDB4ODAsMHgwMCwweDAzLDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDI0LDB4MDcsMHgwMCwweDAxLDB4MjQsMHgwMiwweDAwLDB4MDEsMHhhMywweDg3LDB4OGIsMHhjNCwweDhmLDB4YmYsMHgwMCwweDE0LAorMHhhZSwweDAyLDB4MDAsMHg1NCwweDhmLDB4YjAsMHgwMCwweDEwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgxOCwKKzB4MGMsMHgwMCwweDI4LDB4NTgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyOCwweGFlLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MDIsMHhiMCwweDAzLDB4M2MsMHgwMywweDgwLDB4MDEsMHgyNywweGJkLDB4ZmYsMHhlOCwweDM0LDB4NDIsMHgwMCwweDIwLAorMHgyNCwweDYzLDB4YTMsMHgzMCwweGFmLDB4YjAsMHgwMCwweDEwLDB4YWYsMHhiZiwweDAwLDB4MTQsMHhhYywweDQzLDB4MDAsMHgwMCwKKzB4OGMsMHg4MiwweDAwLDB4NTQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDQyLDB4MDAsMHg4MCwweDgwLDB4MjEsCisweDhlLDB4MDQsMHgwMCwweDA0LDB4OGUsMHgwMywweDAwLDB4NDQsMHgzYywweDAyLDB4ODAsMHgwMCwweDNjLDB4MDgsMHhiMCwweDAxLAorMHgzNCwweDQyLDB4MDAsMHgxMCwweDAwLDB4ODgsMHgyMCwweDIxLDB4MDAsMHg2MiwweDE4LDB4MjUsMHhhYywweDgzLDB4MDAsMHgwNCwKKzB4OGUsMHgwMiwweDAwLDB4MDQsMHg4ZSwweDAzLDB4MDEsMHhhYywweDI3LDB4ODksMHg4OSwweDU4LDB4MDAsMHg0OCwweDEwLDB4MjEsCisweDhjLDB4NDUsMHgwMCwweDAwLDB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDY5LDB4MTgsMHgyMSwweGFjLDB4NjUsMHgwMCwweDAwLAorMHg4ZSwweDAyLDB4MDAsMHgwNCwweDhlLDB4MDMsMHgwMSwweGFjLDB4MjcsMHg4NywweDhhLDB4NTgsMHgwMCwweDQ4LDB4MTAsMHgyMSwKKzB4OGMsMHg0NSwweDAwLDB4MDQsMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4NjcsMHgxOCwweDIxLDB4YWMsMHg2NSwweDAwLDB4MDAsCisweDhlLDB4MDIsMHgwMSwweGFjLDB4OGUsMHgwNiwweDAwLDB4MDQsMHgwMiwweDAwLDB4MjAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDQ3LDB4MzgsMHgyMSwweDk0LDB4ZTMsMHgwMCwweDAyLDB4MDAsMHg0OSwweDEwLDB4MjEsMHg5MCwweDQ1LDB4MDAsMHgwMCwKKzB4MDAsMHgwMywweDFhLDB4MDAsMHgwMCwweGM4LDB4MzAsMHgyMSwweDAwLDB4YTMsMHgyOCwweDI1LDB4MGMsMHgwMCwweDI2LDB4NjksCisweGE0LDB4YzUsMHgwMCwweDJlLDB4OGUsMHgwMywweDAxLDB4YWMsMHg4ZSwweDA3LDB4MDAsMHgwNCwweDNjLDB4MDYsMHhiMCwweDAzLAorMHgyNCwweDY1LDB4MDAsMHgwMSwweDI4LDB4YTQsMHgwMCwweDAwLDB4MjQsMHg2MiwweDAwLDB4NDAsMHgwMCwweGE0LDB4MTAsMHgwYSwKKzB4MDAsMHgwMiwweDExLDB4ODMsMHgwMCwweDAyLDB4MTEsMHg4MCwweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHhhMiwweDI4LDB4MjMsCisweDAwLDB4NzAsMHgxOCwweDIxLDB4YWUsMHgwNSwweDAxLDB4YWMsMHhhYywweDY3LDB4MDAsMHhhOCwweDM0LDB4YzYsMHgwMCwweDMwLAorMHg4YywweGMzLDB4MDAsMHgwMCwweDkzLDB4ODIsMHg4MSwweGYwLDB4MDIsMHgwMCwweDIwLDB4MjEsMHgyNCwweDYzLDB4MDAsMHgwMSwKKzB4MjQsMHg0MiwweDAwLDB4MDEsMHhhYywweGMzLDB4MDAsMHgwMCwweGEzLDB4ODIsMHg4MSwweGYwLDB4MGMsMHgwMCwweDI4LDB4MGIsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHhiZiwweDAwLDB4MTQsMHg4ZiwweGIwLDB4MDAsMHgxMCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHgxOCwweDBjLDB4MDAsMHgyOCwweGEyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjgsMHhkOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwMywweDNjLDB4MDMsMHg4MCwweDAxLDB4MjcsMHhiZCwweGZmLDB4ZTgsCisweDM0LDB4NDIsMHgwMCwweDIwLDB4MjQsMHg2MywweGE0LDB4NzQsMHhhZiwweGIwLDB4MDAsMHgxMCwweGFmLDB4YmYsMHgwMCwweDE0LAorMHhhYywweDQzLDB4MDAsMHgwMCwweDhjLDB4ODIsMHgwMCwweDU0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHg0MiwKKzB4MDAsMHg4MCwweDgwLDB4MjEsMHg4ZSwweDA0LDB4MDAsMHgwNCwweDhlLDB4MDMsMHgwMCwweDQ0LDB4M2MsMHgwMiwweDgwLDB4MDAsCisweDNjLDB4MDgsMHhiMCwweDAxLDB4MzQsMHg0MiwweDAwLDB4MTAsMHgwMCwweDg4LDB4MjAsMHgyMSwweDAwLDB4NjIsMHgxOCwweDI1LAorMHhhYywweDgzLDB4MDAsMHgwNCwweDhlLDB4MDIsMHgwMCwweDA0LDB4OGUsMHgwMywweDAxLDB4YWMsMHgyNywweDg5LDB4ODksMHg1OCwKKzB4MDAsMHg0OCwweDEwLDB4MjEsMHg4YywweDQ1LDB4MDAsMHgwMCwweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHg2OSwweDE4LDB4MjEsCisweGFjLDB4NjUsMHgwMCwweDAwLDB4OGUsMHgwMiwweDAwLDB4MDQsMHg4ZSwweDAzLDB4MDEsMHhhYywweDI3LDB4ODcsMHg4YSwweDU4LAorMHgwMCwweDQ4LDB4MTAsMHgyMSwweDhjLDB4NDUsMHgwMCwweDA0LDB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDY3LDB4MTgsMHgyMSwKKzB4YWMsMHg2NSwweDAwLDB4MDAsMHg4ZSwweDAyLDB4MDEsMHhhYywweDhlLDB4MDYsMHgwMCwweDA0LDB4MDIsMHgwMCwweDIwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0NywweDM4LDB4MjEsMHg5NCwweGUzLDB4MDAsMHgwMiwweDAwLDB4NDksMHgxMCwweDIxLAorMHg5MCwweDQ1LDB4MDAsMHgwMCwweDAwLDB4MDMsMHgxYSwweDAwLDB4MDAsMHhjOCwweDMwLDB4MjEsMHgwMCwweGEzLDB4MjgsMHgyNSwKKzB4MGMsMHgwMCwweDI2LDB4NjksMHhhNCwweGM1LDB4MDAsMHgyZSwweDhlLDB4MDMsMHgwMSwweGFjLDB4OGUsMHgwNywweDAwLDB4MDQsCisweDNjLDB4MDYsMHhiMCwweDAzLDB4MjQsMHg2NSwweDAwLDB4MDEsMHgyOCwweGE0LDB4MDAsMHgwMCwweDI0LDB4NjIsMHgwMCwweDQwLAorMHgwMCwweGE0LDB4MTAsMHgwYSwweDAwLDB4MDIsMHgxMSwweDgzLDB4MDAsMHgwMiwweDExLDB4ODAsMHgwMCwweDAzLDB4MTgsMHg4MCwKKzB4MDAsMHhhMiwweDI4LDB4MjMsMHgwMCwweDcwLDB4MTgsMHgyMSwweGFlLDB4MDUsMHgwMSwweGFjLDB4YWMsMHg2NywweDAwLDB4YTgsCisweDM0LDB4YzYsMHgwMCwweDMwLDB4OGMsMHhjMywweDAwLDB4MDAsMHg5MywweDgyLDB4ODEsMHhmMCwweDAyLDB4MDAsMHgyMCwweDIxLAorMHgyNCwweDYzLDB4MDAsMHgwMSwweDI0LDB4NDIsMHgwMCwweDAxLDB4YWMsMHhjMywweDAwLDB4MDAsMHhhMywweDgyLDB4ODEsMHhmMCwKKzB4MGMsMHgwMCwweDI4LDB4MGIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4YmYsMHgwMCwweDE0LDB4OGYsMHhiMCwweDAwLDB4MTAsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MTgsMHgwYywweDAwLDB4MjgsMHhhMiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MjksMHgyOSwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzYywweDAzLDB4ODAsMHgwMSwKKzB4MjcsMHhiZCwweGZmLDB4ZDgsMHgzNCwweDQyLDB4MDAsMHgyMCwweDI0LDB4NjMsMHhhNSwweGI4LDB4YWYsMHhiMiwweDAwLDB4MTgsCisweGFjLDB4NDMsMHgwMCwweDAwLDB4M2MsMHgxMiwweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMSwweGFmLDB4YjQsMHgwMCwweDIwLAorMHhhZiwweGIzLDB4MDAsMHgxYywweGFmLDB4YjEsMHgwMCwweDE0LDB4YWYsMHhiMCwweDAwLDB4MTAsMHhhZiwweGJmLDB4MDAsMHgyNCwKKzB4MDAsMHg4MCwweDgwLDB4MjEsMHgyNCwweDU0LDB4YTAsMHgxNCwweDAwLDB4MDAsMHg4OCwweDIxLDB4M2MsMHgxMywweGIwLDB4MDEsCisweDM2LDB4NTIsMHgwMCwweGVmLDB4M2MsMHgwMiwweGIwLDB4MDksMHgzNCwweDQyLDB4MDAsMHgwNiwweDkwLDB4NDMsMHgwMCwweDAwLAorMHg4ZSwweDA0LDB4MDAsMHgwNCwweDkyLDB4MDIsMHgwMSwweGJiLDB4MzAsMHg2OSwweDAwLDB4ZmYsMHgwMCwweDA0LDB4NDIsMHgwMiwKKzB4MTAsMHg0MCwweDAwLDB4MWUsMHgwMCwweDAwLDB4MzgsMHgyMSwweDhlLDB4MDMsMHgwMSwweGE4LDB4M2MsMHgwNiwweDI4LDB4MzgsCisweDM0LDB4YzYsMHgwMCwweDIwLDB4MjQsMHg2NCwweDAwLDB4M2QsMHgyOCwweDgyLDB4MDAsMHgwMCwweDI0LDB4NjMsMHgwMCwweDdjLAorMHgwMCwweDgyLDB4MTgsMHgwYSwweDAwLDB4MDMsMHgxOSwweDgzLDB4MDAsMHgwMywweDE5LDB4ODAsMHgwMCwweDgzLDB4MjAsMHgyMywKKzB4MDAsMHgwNCwweDEwLDB4ODAsMHgwMCwweDUwLDB4MTAsMHgyMSwweDhjLDB4NDUsMHgwMCwweGE4LDB4YWUsMHgwNCwweDAxLDB4YWMsCisweGFlLDB4MDQsMHgwMSwweGE4LDB4MDAsMHhiMywweDE4LDB4MjEsMHhhZSwweDA1LDB4MDAsMHgwNCwweGFjLDB4NjYsMHgwMCwweDAwLAorMHg4ZSwweDAyLDB4MDAsMHgwNCwweDNjLDB4MDMsMHg4MCwweDAwLDB4MzQsMHg2MywweDRlLDB4MDAsMHgwMCwweDUzLDB4MTAsMHgyMSwKKzB4YWMsMHg0MywweDAwLDB4MDQsMHhhMiwweDAwLDB4MDEsMHhiYiwweDkzLDB4ODMsMHg4MSwweGY3LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4NjIsMHgwMCwweDAxLDB4YTMsMHg4MiwweDgxLDB4ZjcsMHhhMiwweDQzLDB4MDAsMHgwMCwweDAxLDB4MjgsMHgxMCwweDIzLAorMHgyNCwweDQ0LDB4MDAsMHg0MCwweDI4LDB4ODMsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4N2YsMHgwMCwweDgzLDB4MTAsMHgwYSwKKzB4MDAsMHgwMiwweDExLDB4ODMsMHgwMCwweDAyLDB4MTEsMHg4MCwweDI0LDB4ODQsMHhmZiwweGZmLDB4MTAsMHg0NCwweDAwLDB4NmIsCisweDNjLDB4MDIsMHhiMCwweDAxLDB4OGUsMHgwMywweDAwLDB4MDQsMHgzYywweDA0LDB4N2MsMHgwMCwweDAwLDB4NjIsMHgxOCwweDIxLAorMHg4YywweDY1LDB4MDAsMHgwNCwweDM0LDB4ODQsMHgwMCwweGYwLDB4MDAsMHgwMCwweDMwLDB4MjEsMHhhZSwweDA1LDB4MDAsMHg0NCwKKzB4MDAsMHhhNCwweDIwLDB4MjQsMHg4YywweDYzLDB4MDAsMHgwMCwweDEwLDB4ODAsMHgwMCwweDZiLDB4M2MsMHgwMiwweGZmLDB4ZmYsCisweDNjLDB4MDksMHhiMCwweDAzLDB4M2MsMHgwNSwweDdjLDB4MDAsMHgzNSwweDI5LDB4MDAsMHg5OSwweDNjLDB4MGEsMHhiMCwweDAxLAorMHgyNCwweDA4LDB4MDAsMHg0MCwweDM0LDB4YTUsMHgwMCwweGYwLDB4M2MsMHgwYiwweGZmLDB4ZmYsMHgzYywweDBjLDB4MjgsMHgzOCwKKzB4MTYsMHgyMCwweDAwLDB4MDYsMHgyNCwweGU3LDB4MDAsMHgwMSwweDkzLDB4ODIsMHg4MSwweGY2LDB4MjQsMHgxMSwweDAwLDB4MDEsCisweDI0LDB4NDIsMHgwMCwweDAxLDB4YTEsMHgyMiwweDAwLDB4MDAsMHhhMywweDgyLDB4ODEsMHhmNiwweDhlLDB4MDIsMHgwMCwweDA0LAorMHgyNCwweDA2LDB4MDAsMHgwMSwweDI0LDB4NDIsMHgwMSwweDAwLDB4MzAsMHg0MiwweDNmLDB4ZmYsMHhhZSwweDAyLDB4MDAsMHgwNCwKKzB4MDAsMHg0YSwweDEwLDB4MjEsMHg4YywweDQzLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4YWUsMHgwMywweDAwLDB4NDQsCisweDAwLDB4NjUsMHgyMCwweDI0LDB4OGMsMHg0MywweDAwLDB4MDAsMHgxMCwweGU4LDB4MDAsMHgyZCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxNCwweDgwLDB4ZmYsMHhlYiwweDAwLDB4NmIsMHgxMCwweDI0LDB4MTQsMHg0YywweGZmLDB4ZTksMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4MTAsMHhjMiwweDAwLDB4MzAsMHgzYywweDAzLDB4YjAsMHgwOSwweDhlLDB4MDIsMHgwMCwweDQ0LDB4OGUsMHgwNCwweDAwLDB4NjAsCisweDAwLDB4MDIsMHgxZSwweDQyLDB4MDAsMHgwMiwweDEyLDB4MDIsMHgzMCwweDQyLDB4MDAsMHgwZiwweDMwLDB4NjMsMHgwMCwweDAxLAorMHhhZSwweDAyLDB4MDAsMHgwMCwweDEwLDB4NDQsMHgwMCwweDFhLDB4YWUsMHgwMywweDAwLDB4NTgsMHg4ZSwweDAyLDB4MDAsMHg2NCwKKzB4OGUsMHgwNCwweDAwLDB4NTgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4ODIsMHgwMCwweDA1LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweGFlLDB4MDAsMHgwMCwweDRjLDB4YWUsMHgwMCwweDAwLDB4NTAsMHhhZSwweDAwLDB4MDAsMHg1NCwweGFlLDB4MDAsMHgwMCwweDBjLAorMHg4ZSwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweDEwLDB4ODAsMHgwMCwweDUwLDB4MTAsMHgyMSwKKzB4OGMsMHg0MiwweDAwLDB4NjgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NTQsMHgwMCwweDA2LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4NDAsMHhmOCwweDA5LDB4MDIsMHgwMCwweDIwLDB4MjEsMHg4ZSwweDA0LDB4MDAsMHg1OCwweDhlLDB4MDMsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweGFlLDB4MDMsMHgwMCwweDYwLDB4MDgsMHgwMCwweDI5LDB4ODEsMHhhZSwweDA0LDB4MDAsMHg2NCwKKzB4OGUsMHgwMiwweDAwLDB4NjQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NjIsMHhmZiwweGU1LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDdhLDB4MDIsMHgwZCwweDdjLDB4OGYsMHhiZiwweDAwLDB4MjQsMHg4ZiwweGI0LDB4MDAsMHgyMCwweDdiLDB4YjIsMHgwMCwweGZjLAorMHg3YiwweGIwLDB4MDAsMHhiYywweDAwLDB4NDMsMHgxMCwweDI2LDB4MDAsMHgwMiwweDEwLDB4MmIsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4MjcsMHhiZCwweDAwLDB4MjgsMHg4ZSwweDA0LDB4MDAsMHgwNCwweDM0LDB4NjMsMHgwMCwweDA2LDB4OTAsMHg2MiwweDAwLDB4MDAsCisweDAwLDB4MDQsMHg0MiwweDAyLDB4MDAsMHg0OCwweDEwLDB4MjMsMHgyNCwweDQ0LDB4MDAsMHg0MCwweDI4LDB4ODMsMHgwMCwweDAwLAorMHgyNCwweDQyLDB4MDAsMHg3ZiwweDAwLDB4ODMsMHgxMCwweDBhLDB4MDAsMHgwMiwweDExLDB4ODMsMHgwMCwweDAyLDB4MTEsMHg4MCwKKzB4MDAsMHg4MiwweDIwLDB4MjMsMHgxNCwweDg2LDB4ZmYsMHhjNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGUsMHgwMywweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MmMsMHg2MiwweDAwLDB4MDMsMHgxNCwweDQwLDB4MDAsMHgwNSwweDI0LDB4MDIsMHgwMCwweDBkLAorMHgxMCwweDYyLDB4MDAsMHgwMywweDI0LDB4MDIsMHgwMCwweDAxLDB4MDgsMHgwMCwweDJhLDB4MDQsMHhhMiwweDAyLDB4MDAsMHg1YywKKzB4MDgsMHgwMCwweDJhLDB4MDQsMHhhMiwweDAwLDB4MDAsMHg1YywweDAwLDB4NjIsMHgxMCwweDI0LDB4M2MsMHgwMywweDI4LDB4MzgsCisweDE0LDB4NDMsMHhmZiwweDkzLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgwOCwweDAwLDB4MjksMHhkYywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzYywweDAyLDB4YjAsMHgwMSwweDAwLDB4YTIsMHg0MCwweDIxLDB4MDAsMHhhMCwweDQ4LDB4MjEsMHg4ZCwweDA1LDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweGMwLDB4MDAsMHgwMCwweDA5LDB4MzgsMHhjMiwweDAwLDB4YTIsMHgyOCwweDI0LDB4MjQsMHhjMiwweGZmLDB4ZmYsCisweDAwLDB4MDcsMHgzYSwweDAwLDB4M2MsMHgwYSwweGIwLDB4MDYsMHgzYywweDAzLDB4MDAsMHg4MCwweDAwLDB4YTYsMHgyOCwweDI1LAorMHgyYywweDQyLDB4MWYsMHhmZiwweDAwLDB4ZTMsMHgzOCwweDI1LDB4MzUsMHg0YSwweDgwLDB4MTgsMHgxMCwweDQwLDB4MDAsMHgwZSwKKzB4YWQsMHgwNSwweDAwLDB4MDAsMHhhZiwweDg5LDB4YmMsMHgxMCwweDhkLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweGFmLDB4ODIsMHhiYywweDE4LDB4OGQsMHgwMywweDAwLDB4MDQsMHhhZCwweDQ3LDB4MDAsMHgwMCwweGFmLDB4ODMsMHhiYywweDE0LAorMHhhYywweDgwLDB4MDEsMHhkMCwweGFjLDB4ODAsMHgwMSwweGM0LDB4YTAsMHg4MCwweDAxLDB4YzAsMHhhMCwweDgwLDB4MDEsMHhjMSwKKzB4YWMsMHg4MCwweDAxLDB4YzgsMHhhYywweDgwLDB4MDEsMHhjYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI3LDB4YmQsMHhmZiwweGU4LDB4YWYsMHhiZiwweDAwLDB4MTAsMHg4YywweDgzLDB4MDEsMHhjNCwweDAwLDB4ODAsMHgzOCwweDIxLAorMHg5MCwweDg0LDB4MDEsMHhjMCwweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHg2NywweDE4LDB4MjEsMHg4YywweDY1LDB4MDAsMHhhOCwKKzB4M2MsMHgwMiwweGIwLDB4MDEsMHgyNCwweDAzLDB4MDAsMHgwMSwweDAwLDB4YTIsMHgxMCwweDIxLDB4OGMsMHg0MiwweDAwLDB4MDAsCisweDEwLDB4ODMsMHgwMCwweDE4LDB4MDAsMHgwMiwweDE0LDB4MDIsMHg4YywweGU5LDB4MDEsMHhjYywweDhjLDB4ZWEsMHgwMSwweGM4LAorMHgzMCwweDQ2LDB4MDAsMHhmZiwweDAxLDB4MmEsMHgxOCwweDIxLDB4MzAsMHg2NCwweDAwLDB4ZmYsMHgwMCwweDAzLDB4MWEsMHgwMiwKKzB4MjQsMHg2MiwweDAwLDB4MDEsMHgxNCwweDgwLDB4MDAsMHgwMiwweDMwLDB4NDgsMHgwMCwweGZmLDB4MzAsMHg2OCwweDAwLDB4ZmYsCisweDkwLDB4ZTIsMHgwMSwweGMxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQ4LDB4MTAsMHgyMywweDAwLDB4MDIsMHgxMiwweDAwLAorMHgwMCwweDQ5LDB4MTAsMHgyMSwweDAwLDB4NGEsMHgxMCwweDIxLDB4MDAsMHg0NiwweDMwLDB4MjMsMHgwYywweDAwLDB4MmEsMHgyYywKKzB4MDAsMHhlMCwweDIwLDB4MjEsMHg4ZiwweGJmLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDI3LDB4YmQsMHgwMCwweDE4LDB4OGMsMHhlNiwweDAxLDB4YzgsMHgwOCwweDAwLDB4MmEsMHg2YiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNywweGJkLDB4ZmYsMHhlOCwweGFmLDB4YmYsMHgwMCwweDE0LDB4YWYsMHhiMCwweDAwLDB4MTAsMHg4YywweDgyLDB4MDEsMHhjNCwKKzB4OTAsMHg4NywweDAxLDB4YzEsMHgwMCwweDgwLDB4ODAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0NCwweDEwLDB4MjEsCisweDhjLDB4NDgsMHgwMCwweGE4LDB4M2MsMHgwMiwweGIwLDB4MDEsMHgwMCwweDA3LDB4M2EsMHgwMCwweDAxLDB4MDIsMHgxMCwweDIxLAorMHg4YywweDQzLDB4MDAsMHgwMCwweDAwLDB4ZTUsMHgzOCwweDIxLDB4MDAsMHhlNiwweDM4LDB4MjEsMHgwMCwweDAzLDB4MWMsMHgwMiwKKzB4MzAsMHg2MywweDAwLDB4ZmYsMHgwMCwweGUzLDB4MzgsMHgyMywweDAxLDB4MDAsMHgyOCwweDIxLDB4MGMsMHgwMCwweDJhLDB4MmMsCisweDAwLDB4ZTAsMHgzMCwweDIxLDB4OGUsMHgwMiwweDAxLDB4YTgsMHg4ZiwweGJmLDB4MDAsMHgxNCwweDI0LDB4NDQsMHgwMCwweDAxLAorMHgyOCwweDgzLDB4MDAsMHgwMCwweDI0LDB4NDIsMHgwMCwweDQwLDB4MDAsMHg4MywweDEwLDB4MGEsMHgwMCwweDAyLDB4MTEsMHg4MywKKzB4MDAsMHgwMiwweDExLDB4ODAsMHgwMCwweDgyLDB4MjAsMHgyMywweGFlLDB4MDQsMHgwMSwweGE4LDB4OGYsMHhiMCwweDAwLDB4MTAsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MTgsMHgzYywweDAyLDB4YjAsMHgwMywweDNjLDB4MDMsMHg4MCwweDAxLAorMHgyNywweGJkLDB4ZmYsMHhlOCwweDM0LDB4NDIsMHgwMCwweDIwLDB4MjQsMHg2MywweGFhLDB4NTgsMHhhZiwweGIwLDB4MDAsMHgxMCwKKzB4YWYsMHhiZiwweDAwLDB4MTQsMHhhYywweDQzLDB4MDAsMHgwMCwweDkwLDB4ODIsMHgwMSwweGQ0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDE0LDB4NDAsMHgwMCwweDZhLDB4MDAsMHg4MCwweDgwLDB4MjEsMHg5MCwweDgyLDB4MDEsMHhjMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxNCwweDQwLDB4MDAsMHg2MSwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGMsMHg4MywweDAxLDB4YTgsMHg4YywweDgyLDB4MDEsMHhhYywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDYyLDB4MDAsMHgyMiwweDAwLDB4MDAsMHgyOCwweDIxLDB4OTMsMHg4MiwweDgxLDB4ZjEsCisweDAwLDB4MDMsMHgzMCwweDgwLDB4MDAsMHhjNCwweDE4LDB4MjEsMHgyNCwweDA0LDB4MDAsMHgwMSwweDhjLDB4NjcsMHgwMCwweGE4LAorMHgxMCwweDQ0LDB4MDAsMHgyMCwweDNjLDB4MDQsMHhiMCwweDAxLDB4YWYsMHg4NywweGJjLDB4MTAsMHgwMCwweGU0LDB4MjAsMHgyMSwKKzB4OGMsMHg4NiwweDAwLDB4MDAsMHgwMCwweDA3LDB4MTgsMHhjMiwweDNjLDB4MDIsMHgwMCwweDgwLDB4YWYsMHg4NiwweGJjLDB4MTgsCisweDhjLDB4ODYsMHgwMCwweDA0LDB4MDAsMHgwMywweDFhLDB4MDAsMHgzYywweDA1LDB4YjAsMHgwNiwweDAwLDB4NjIsMHgxOCwweDI1LAorMHgzNCwweGE1LDB4ODAsMHgxOCwweGFjLDB4YTMsMHgwMCwweDAwLDB4OGUsMHgwMiwweDAxLDB4YTgsMHg4ZSwweDA5LDB4MDEsMHhhYywKKzB4YWYsMHg4NiwweGJjLDB4MTQsMHgyNCwweDQ0LDB4MDAsMHgwMSwweDI4LDB4ODMsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4NDAsCisweDAwLDB4ODMsMHgxMCwweDBhLDB4MDAsMHgwMiwweDExLDB4ODMsMHgwMCwweDAyLDB4MTEsMHg4MCwweDAwLDB4ODIsMHgyMCwweDIzLAorMHgwMCwweDgwLDB4MzAsMHgyMSwweGFlLDB4MDQsMHgwMSwweGE4LDB4MDAsMHhjOSwweDEwLDB4MjYsMHgwMCwweDAyLDB4MjgsMHgyYiwKKzB4OGYsMHhiZiwweDAwLDB4MTQsMHg4ZiwweGIwLDB4MDAsMHgxMCwweDAwLDB4YTAsMHgxMCwweDIxLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDI3LDB4YmQsMHgwMCwweDE4LDB4OTMsMHg4MiwweDgxLDB4ZjAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDJjLDB4NDIsMHgwMCwweDAyLAorMHgxNCwweDQwLDB4ZmYsMHhmNywweDAwLDB4MDAsMHgyOCwweDIxLDB4M2MsMHgwNSwweGIwLDB4MDEsMHgwMCwweGU1LDB4MjgsMHgyMSwKKzB4MjcsMHg4MywweDg5LDB4NTgsMHgwMCwweGMzLDB4MTgsMHgyMSwweDhjLDB4YTYsMHgwMCwweDAwLDB4OGMsMHg2NCwweDAwLDB4MDAsCisweDI0LDB4MDIsMHhjMCwweDAwLDB4MDAsMHhjMiwweDEwLDB4MjQsMHgwMCwweDQ0LDB4MTAsMHgyNSwweGFjLDB4YTIsMHgwMCwweDAwLAorMHg4ZSwweDAzLDB4MDEsMHhhOCwweDI3LDB4ODQsMHg4YSwweDU4LDB4OGMsMHhhNiwweDAwLDB4MDQsMHgwMCwweDAzLDB4MTgsMHg4MCwKKzB4MDAsMHg2NCwweDE4LDB4MjEsMHg4YywweDYyLDB4MDAsMHgwMCwweDNjLDB4MDMsMHg4MCwweDAwLDB4MDAsMHgwNywweDIwLDB4YzIsCisweDAwLDB4YzIsMHgxMCwweDI1LDB4MDAsMHg0MywweDEwLDB4MjUsMHhhYywweGEyLDB4MDAsMHgwNCwweGFmLDB4ODcsMHhiYywweDEwLAorMHg4YywweGE2LDB4MDAsMHgwMCwweDNjLDB4MDIsMHgwMCwweDgwLDB4MDAsMHgwNCwweDIyLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwNiwKKzB4YWYsMHg4NiwweGJjLDB4MTgsMHgwMCwweDgyLDB4MjAsMHgyNSwweDM0LDB4NjMsMHg4MCwweDE4LDB4OGMsMHhhNiwweDAwLDB4MDQsCisweGFjLDB4NjQsMHgwMCwweDAwLDB4OGUsMHgwMiwweDAxLDB4YTgsMHhhZiwweDg2LDB4YmMsMHgxNCwweDI0LDB4NDQsMHgwMCwweDAxLAorMHgyOCwweDgzLDB4MDAsMHgwMCwweDI0LDB4NDIsMHgwMCwweDQwLDB4MDAsMHg4MywweDEwLDB4MGEsMHg5MywweDgzLDB4ODEsMHhmMCwKKzB4MDAsMHgwMiwweDExLDB4ODMsMHgwMCwweDAyLDB4MTEsMHg4MCwweDAwLDB4ODIsMHgyMCwweDIzLDB4MjQsMHg2MywweGZmLDB4ZmYsCisweGFlLDB4MDQsMHgwMSwweGE4LDB4YTMsMHg4MywweDgxLDB4ZjAsMHg4ZSwweDA0LDB4MDEsMHhhYywweDhlLDB4MDIsMHgwMSwweGE4LAorMHgwOCwweDAwLDB4MmEsMHhjYiwweDAwLDB4NDQsMHgxMCwweDI2LDB4MGMsMHgwMCwweDJhLDB4NGMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4N2EsMHgwMiwweDBkLDB4N2MsMHgwOCwweDAwLDB4MmEsMHhjYiwweDAwLDB4NDMsMHgxMCwweDI2LDB4OGMsMHg4NiwweDAxLDB4YTgsCisweDhjLDB4ODksMHgwMSwweGFjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweGM5LDB4MDAsMHhiNCwweDAwLDB4YzAsMHg2OCwweDIxLAorMHgwMCwweDA2LDB4MTAsMHg4MCwweDI3LDB4ODMsMHg4OSwweDU4LDB4MDAsMHg0MywweDE4LDB4MjEsMHgwMCwweDQ0LDB4MTAsMHgyMSwKKzB4OGMsMHg0NywweDAwLDB4YTgsMHg5NCwweDY1LDB4MDAsMHgwMiwweDNjLDB4MDIsMHhiMCwweDAxLDB4MDAsMHhlMiwweDEwLDB4MjEsCisweDMwLDB4YTUsMHgzZiwweGZmLDB4YTQsMHg0NSwweDAwLDB4MmMsMHg5MCwweDhhLDB4MDEsMHhjMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxMSwweDQwLDB4MDAsMHgwYywweDAwLDB4MDcsMHgzMiwweDAyLDB4OGMsMHg4MywweDAxLDB4YzQsMHg5MCwweDg1LDB4MDEsMHhjMSwKKzB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDY0LDB4MTgsMHgyMSwweDhjLDB4NjIsMHgwMCwweGE4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDIsMHgxMiwweDAyLDB4MDAsMHg0NSwweDEwLDB4MjEsMHgzMCwweDQyLDB4MDAsMHgzZiwweDE0LDB4YzIsMHhmZiwweGRlLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDQsMHhiMCwweDAxLDB4MDAsMHhlNCwweDQwLDB4MjEsMHg4ZCwweDA2LDB4MDAsMHgwMCwKKzB4MDAsMHgwZCwweDI4LDB4ODAsMHgwMCwweDA2LDB4MTQsMHgwMiwweDMwLDB4NGIsMHgwMCwweGZmLDB4MDAsMHhlYiwweDcwLDB4MjEsCisweDAxLDB4YzQsMHgyMCwweDIxLDB4OTAsMHg4MywweDAwLDB4MDAsMHgyNywweDgyLDB4ODksMHg1OCwweDAwLDB4YTIsMHgyOCwweDIxLAorMHg4YywweGE0LDB4MDAsMHgwMCwweDAwLDB4MDMsMHgxOCwweDgyLDB4MzAsMHg2MywweDAwLDB4MDMsMHgyYywweDYyLDB4MDAsMHgwMiwKKzB4MTQsMHg0MCwweDAwLDB4NjYsMHgzMCwweDhjLDB4M2YsMHhmZiwweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHg2MiwweDAwLDB4NjEsCisweDJkLDB4ODIsMHgwOCwweDAwLDB4MTUsMHg0MCwweDAwLDB4MzYsMHgwMSwweDZjLDB4MTAsMHgyMSwweDAxLDB4NmMsMHgxOCwweDIxLAorMHgzMCwweDYyLDB4MDAsMHhmZiwweDAwLDB4MDIsMHgxMCwweDJiLDB4MDAsMHgwMywweDFhLDB4MDIsMHgzYywweDA0LDB4YjAsMHgwMSwKKzB4MDAsMHg2MiwweDE4LDB4MjEsMHgwMCwweGU0LDB4MjAsMHgyMSwweDI0LDB4MDIsMHgwMCwweDAxLDB4YTIsMHgwMywweDAxLDB4YzEsCisweGEwLDB4ODIsMHgwMCwweDA4LDB4OGUsMHgwNiwweDAxLDB4YTgsMHgzYywweDAzLDB4YjAsMHgwMCwweDM0LDB4NjMsMHhmZiwweGY0LAorMHgyNCwweGM1LDB4MDAsMHgwMSwweDI4LDB4YTQsMHgwMCwweDAwLDB4MjQsMHhjMiwweDAwLDB4NDAsMHgwMCwweGE0LDB4MTAsMHgwYSwKKzB4MDEsMHhjMywweDE4LDB4MjEsMHhhNCwweDZjLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgxMSwweDgzLDB4MDAsMHgwMiwweDExLDB4ODAsCisweDkyLDB4MDQsMHgwMSwweGMwLDB4MDAsMHhhMiwweDM4LDB4MjMsMHgzYywweDAzLDB4YjAsMHgwMywweGFlLDB4MGIsMHgwMSwweGNjLAorMHhhZSwweDBjLDB4MDEsMHhjOCwweGFlLDB4MDYsMHgwMSwweGM0LDB4YWUsMHgwNywweDAxLDB4YTgsMHgzNCwweDYzLDB4MDEsMHgwOCwKKzB4OTIsMHgwNSwweDAxLDB4ZDYsMHg4YywweDY2LDB4MDAsMHgwMCwweDI0LDB4ODQsMHgwMCwweDAxLDB4MzAsMHg4MiwweDAwLDB4ZmYsCisweDAwLDB4NDUsMHgxMCwweDJiLDB4YWUsMHgwNiwweDAxLDB4ZDAsMHgxMCwweDQwLDB4MDAsMHgwNywweGEyLDB4MDQsMHgwMSwweGMwLAorMHg5MiwweDAyLDB4MDEsMHhkNSwweDkyLDB4MDMsMHgwMSwweGMxLDB4MjQsMHg0MiwweGZmLDB4ZmMsMHgwMCwweDYyLDB4MTgsMHgyYSwKKzB4MTQsMHg2MCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgyMCwweDIxLDB4MGMsMHgwMCwweDJhLDB4NGMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGUsMHgwOSwweDAxLDB4YWMsMHg4ZSwweDA2LDB4MDEsMHhhOCwweDA4LDB4MDAsMHgyYSwweGNiLAorMHgwMCwweGM5LDB4MTAsMHgyNiwweDhlLDB4MDksMHgwMSwweGFjLDB4MDgsMHgwMCwweDJhLDB4Y2EsMHgwMCwweGUwLDB4MzAsMHgyMSwKKzB4MzAsMHg0MywweDAwLDB4ZmYsMHg5MiwweDA3LDB4MDEsMHhjMSwweDAwLDB4MDIsMHgxMiwweDAyLDB4MzAsMHg0NCwweDAwLDB4ZmYsCisweDM4LDB4NjMsMHgwMCwweDAwLDB4MjQsMHg0NiwweDAwLDB4MDEsMHg5MiwweDA1LDB4MDEsMHhkNSwweDAwLDB4ODMsMHgzMCwweDBhLAorMHgwMCwweGM3LDB4MTgsMHgyMSwweDAwLDB4YTMsMHgxMCwweDJhLDB4MTQsMHg0MCwweGZmLDB4ZWIsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHhhMiwweGZmLDB4ZmMsMHgwMCwweDYyLDB4MTAsMHgyYSwweDEwLDB4NDAsMHgwMCwweDA3LDB4MDEsMHg4MCwweDI4LDB4MjEsCisweDkyLDB4MDMsMHgwMSwweGQ2LDB4MjUsMHg0MiwweDAwLDB4MDEsMHgwMCwweDQzLDB4MTAsMHgyYSwweDE0LDB4NDAsMHgwMCwweDA3LAorMHgyNSwweGE0LDB4MDAsMHgwMSwweDAxLDB4ODAsMHgyOCwweDIxLDB4MDEsMHg2MCwweDMwLDB4MjEsMHgwYywweDAwLDB4MmEsMHg3NCwKKzB4MDIsMHgwMCwweDIwLDB4MjEsMHgwOCwweDAwLDB4MmIsMHg2ZCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjgsMHg4MywweDAwLDB4MDAsCisweDI1LDB4YTIsMHgwMCwweDQwLDB4MDAsMHg4MywweDEwLDB4MGEsMHgwMCwweDAyLDB4MTEsMHg4MywweDAwLDB4MDIsMHgxMSwweDgwLAorMHgwMCwweDgyLDB4MjAsMHgyMywweDAwLDB4YzcsMHgxOCwweDIxLDB4MjUsMHg0MiwweDAwLDB4MDEsMHgwMCwweDgwLDB4MzAsMHgyMSwKKzB4YTIsMHgwMywweDAxLDB4YzEsMHhhZSwweDBiLDB4MDEsMHhjYywweGFlLDB4MGMsMHgwMSwweGM4LDB4MDgsMHgwMCwweDJhLDB4YzksCisweGEyLDB4MDIsMHgwMSwweGMwLDB4MTQsMHg0MCwweGZmLDB4OWYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE1LDB4NDAsMHgwMCwweDE0LAorMHgyNCwweDAyLDB4YzAsMHgwMCwweDAwLDB4YzIsMHgxMCwweDI0LDB4MDAsMHg0YywweDEwLDB4MjUsMHhhZCwweDAyLDB4MDAsMHgwMCwKKzB4YWYsMHg4NywweGJjLDB4MTAsMHg4ZCwweDA1LDB4MDAsMHgwMCwweDAwLDB4MDcsMHgxOCwweGMyLDB4M2MsMHgwMiwweDAwLDB4ODAsCisweDAwLDB4MDMsMHgxYSwweDAwLDB4M2MsMHgwNCwweGIwLDB4MDYsMHhhZiwweDg1LDB4YmMsMHgxOCwweDAwLDB4NjIsMHgxOCwweDI1LAorMHgzNCwweDg0LDB4ODAsMHgxOCwweDhkLDB4MDUsMHgwMCwweDA0LDB4YWMsMHg4MywweDAwLDB4MDAsMHg4ZSwweDAyLDB4MDEsMHhhOCwKKzB4OGUsMHgwOSwweDAxLDB4YWMsMHhhZiwweDg1LDB4YmMsMHgxNCwweDA4LDB4MDAsMHgyYSwweGMyLDB4MjQsMHg0NCwweDAwLDB4MDEsCisweDAxLDB4NmMsMHgxMCwweDIxLDB4MzAsMHg0NSwweDAwLDB4ZmYsMHg5MiwweDA0LDB4MDEsMHhjMSwweDAwLDB4MDIsMHgxMiwweDAyLAorMHgzMCwweDQ2LDB4MDAsMHhmZiwweDM4LDB4YTUsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4MDEsMHg5MiwweDAzLDB4MDEsMHhkNSwKKzB4MDAsMHhjNSwweDEwLDB4MGEsMHgwMCwweDgyLDB4MjAsMHgyMSwweDAwLDB4NjQsMHgxOCwweDJhLDB4MTAsMHg2MCwweGZmLDB4Y2EsCisweDAxLDB4ODAsMHgyOCwweDIxLDB4MDgsMHgwMCwweDJiLDB4NmIsMHgwMiwweDAwLDB4MjAsMHgyMSwweDkwLDB4ODcsMHgwMSwweGMwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4ZTAsMHhmZiwweDA2LDB4MDAsMHgwMCwweDI4LDB4MjEsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4MzQsMHg0MiwweDAxLDB4MDgsMHg5NCwweDgzLDB4MDEsMHhkOCwweDhjLDB4ODgsMHgwMSwweGQwLDB4OGMsMHg0NSwweDAwLDB4MDAsCisweDAxLDB4MDMsMHgxOCwweDIxLDB4MDAsMHhhMywweDEwLDB4MmIsMHgxMCwweDQwLDB4MDAsMHgwYiwweDJjLDB4ZTIsMHgwMCwweDAyLAorMHgwMCwweGE4LDB4MTAsMHgyYiwweDEwLDB4NDAsMHhmZSwweGY5LDB4MDAsMHhjOSwweDEwLDB4MjYsMHgzYywweDAyLDB4ODAsMHgwMCwKKzB4MDAsMHg2MiwweDE4LDB4MjEsMHgwMCwweGEyLDB4MTAsMHgyMSwweDAwLDB4NDMsMHgxMCwweDJiLDB4MTQsMHg0MCwweGZlLDB4ZjMsCisweDAwLDB4YzksMHgxMCwweDI2LDB4MmMsMHhlMiwweDAwLDB4MDIsMHgxMCwweDQwLDB4ZmYsMHg5MCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDE0LDB4ZTIsMHhmZSwweGVkLDB4MDAsMHhjOSwweDEwLDB4MjYsMHgzYywweDAzLDB4YjAsMHgwNiwKKzB4MzQsMHg2MywweDgwLDB4MTgsMHg4YywweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDE3LDB4MDIsCisweDE0LDB4NDAsMHhmZSwweGU1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MmIsMHg2YiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzYywweDA0LDB4YjAsMHgwMywweDNjLDB4MDYsMHhiMCwweDA3LDB4M2MsMHgwMiwweDgwLDB4MDEsMHgzNCwweGM2LDB4MDAsMHgxOCwKKzB4MzQsMHg4NCwweDAwLDB4MjAsMHgyNCwweDQyLDB4YWYsMHhhMCwweDI0LDB4MDMsMHhmZiwweDgzLDB4YWMsMHg4MiwweDAwLDB4MDAsCisweGEwLDB4YzMsMHgwMCwweDAwLDB4OTAsMHhjNCwweDAwLDB4MDAsMHgyNywweGJkLDB4ZmYsMHhmOCwweDNjLDB4MDMsMHhiMCwweDA3LAorMHgyNCwweDAyLDB4ZmYsMHg4MiwweGEzLDB4YTQsMHgwMCwweDAwLDB4YTAsMHg2MiwweDAwLDB4MDAsMHg5MCwweDY0LDB4MDAsMHgwMCwKKzB4M2MsMHgwMiwweGIwLDB4MDcsMHgzNCwweDQyLDB4MDAsMHgwOCwweGEzLDB4YTQsMHgwMCwweDAxLDB4YTAsMHg0MCwweDAwLDB4MDAsCisweDkwLDB4NDMsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDMsMHgzYywweDA1LDB4YjAsMHgwNywweGEzLDB4YTMsMHgwMCwweDAwLAorMHhhMCwweGMyLDB4MDAsMHgwMCwweDkwLDB4YzQsMHgwMCwweDAwLDB4MzQsMHhhNSwweDAwLDB4MTAsMHgyNCwweDAyLDB4MDAsMHgwNiwKKzB4M2MsMHgwMywweGIwLDB4MDcsMHhhMywweGE0LDB4MDAsMHgwMCwweDM0LDB4NjMsMHgwMCwweDM4LDB4YTAsMHhhMiwweDAwLDB4MDAsCisweDkwLDB4NjQsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDcsMHgzNCwweDQyLDB4MDAsMHgyMCwweGEzLDB4YTQsMHgwMCwweDAwLAorMHhhMCwweGEwLDB4MDAsMHgwMCwweDkwLDB4YTMsMHgwMCwweDAwLDB4YWYsMHg4MiwweGJmLDB4MjAsMHhhMywweGEzLDB4MDAsMHgwMCwKKzB4YTAsMHg0MCwweDAwLDB4MDAsMHg5MCwweDQzLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MDgsCit9OworCit1OCBydGw4MTkwX2Z3ZGF0YV9hcnJheVtdID17CisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwOCwweDAwLAorMHgwMiwweGU5LDB4MDEsMHg3NCwweDAyLDB4YWIsMHgwMSwweGM3LDB4MDEsMHg1NSwweDAwLDB4ZTQsMHgwMCwweGFiLDB4MDAsMHg3MiwKKzB4MDAsMHg1NSwweDAwLDB4NGMsMHgwMCwweDRjLDB4MDAsMHg0YywweDAwLDB4NGMsMHgwMCwweDRjLDB4MDIsMHg3NiwweDAxLDB4M2IsCisweDAwLDB4ZDIsMHgwMCwweDllLDB4MDAsMHg2OSwweDAwLDB4NGYsMHgwMCwweDQ2LDB4MDAsMHgzZiwweDAxLDB4M2IsMHgwMCwweDllLAorMHgwMCwweDY5LDB4MDAsMHg0ZiwweDAwLDB4MzUsMHgwMCwweDI3LDB4MDAsMHgyMywweDAwLDB4MjAsMHgwMSwweDJmLDB4MDAsMHg5OCwKKzB4MDAsMHg2NSwweDAwLDB4NGMsMHgwMCwweDMzLDB4MDAsMHgyNiwweDAwLDB4MjIsMHgwMCwweDFlLDB4MDAsMHg5OCwweDAwLDB4NGMsCisweDAwLDB4MzMsMHgwMCwweDI2LDB4MDAsMHgxOSwweDAwLDB4MTMsMHgwMCwweDExLDB4MDAsMHgwZiwweDAyLDB4MzksMHgwMSwweDFjLAorMHgwMCwweGJkLDB4MDAsMHg4ZSwweDAwLDB4NWYsMHgwMCwweDQ3LDB4MDAsMHgzZiwweDAwLDB4MzksMHgwMSwweDFjLDB4MDAsMHg4ZSwKKzB4MDAsMHg1ZiwweDAwLDB4NDcsMHgwMCwweDJmLDB4MDAsMHgyMywweDAwLDB4MjAsMHgwMCwweDFjLDB4MDEsMHgxMSwweDAwLDB4ODksCisweDAwLDB4NWIsMHgwMCwweDQ0LDB4MDAsMHgyZSwweDAwLDB4MjIsMHgwMCwweDFlLDB4MDAsMHgxYiwweDAwLDB4ODksMHgwMCwweDQ0LAorMHgwMCwweDJlLDB4MDAsMHgyMiwweDAwLDB4MTcsMHgwMCwweDExLDB4MDAsMHgwZiwweDAwLDB4MGUsMHgwMiwweGFiLDB4MDIsMHhhYiwKKzB4MDIsMHg2NiwweDAyLDB4NjYsMHgwNywweDA2LDB4MDYsMHgwNiwweDA1LDB4MDYsMHgwNywweDA4LDB4MDQsMHgwNiwweDA3LDB4MDgsCisweDA5LDB4MGEsMHgwYiwweDBiLDB4NDksMHg2ZSwweDc0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1NCwweDRjLAorMHg0MiwweDRkLDB4NGYsMHg0NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NTQsMHg0YywweDQyLDB4NGMsMHg1ZiwweDY0LDB4NjEsMHg3NCwKKzB4NjEsMHgwMCwweDU0LDB4NGMsMHg0MiwweDUzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDEsMHg2NCwweDQ1LDB4NGMsCisweDVmLDB4NjQsMHg2MSwweDc0LDB4NjEsMHgwMCwweDQxLDB4NjQsMHg0NSwweDUzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg0NSwweDc4LDB4NjMsMHg0MywweDZmLDB4NjQsMHg2NSwweDM2LDB4MDAsMHgwMCwweDQ1LDB4NzgsMHg2MywweDQzLDB4NmYsMHg2NCwKKzB4NjUsMHgzNywweDAwLDB4MDAsMHg1MywweDc5LDB4NzMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQyLDB4NzAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1MiwweDQ5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4NDMsMHg3MCwweDU1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0ZiwweDc2LDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODAsMHgwMSwweDBiLDB4NTMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDJjLAorMHgwMCwweDAwLDB4MDAsMHg1OCwweDAwLDB4MDAsMHgwMCwweDMwLDB4MDAsMHgwMCwweDAwLDB4NDgsMHgwMCwweDAwLDB4MDAsMHg2MCwKKzB4MDAsMHgwMCwweDAwLDB4OTAsMHgwMCwweDAwLDB4MDAsMHhjMCwweDAwLDB4MDAsMHgwMSwweDIwLDB4MDAsMHgwMCwweDAxLDB4ODAsCisweDAwLDB4MDAsMHgwMSwweGIwLDB4MDAsMHgwMCwweDAwLDB4MzQsMHgwMCwweDAwLDB4MDAsMHg2OCwweDAwLDB4MDAsMHgwMCwweDljLAorMHgwMCwweDAwLDB4MDAsMHhkMCwweDAwLDB4MDAsMHgwMSwweDM4LDB4MDAsMHgwMCwweDAxLDB4YTAsMHgwMCwweDAwLDB4MDEsMHhkNCwKKzB4MDAsMHgwMCwweDAyLDB4MDgsMHgwMCwweDAwLDB4MDAsMHg2OCwweDAwLDB4MDAsMHgwMCwweGQwLDB4MDAsMHgwMCwweDAxLDB4MzgsCisweDAwLDB4MDAsMHgwMSwweGEwLDB4MDAsMHgwMCwweDAyLDB4NmYsMHgwMCwweDAwLDB4MDMsMHg0MCwweDAwLDB4MDAsMHgwMywweGE4LAorMHgwMCwweDAwLDB4MDQsMHgxMCwweDAxLDB4MDEsMHgwMSwweDAyLDB4MDEsMHgwMSwweDAyLDB4MDIsMHgwMywweDAzLDB4MDQsMHgwNCwKKzB4MDEsMHgwMSwweDAyLDB4MDIsMHgwMywweDAzLDB4MDQsMHgwNCwweDAyLDB4MDMsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MCwweDAwLDB4MDcsMHg3NCwweDgwLDB4MDAsMHgwNywweDg4LAorMHg4MCwweDAwLDB4MDcsMHg4OCwweDgwLDB4MDAsMHgwNywweDc4LDB4ODAsMHgwMCwweDA3LDB4NzgsMHg4MCwweDAwLDB4MDcsMHg5YywKKzB4ODAsMHgwMCwweDUzLDB4YzQsMHg4MCwweDAwLDB4NTQsMHgyNCwweDgwLDB4MDAsMHg1NCwweDM4LDB4ODAsMHgwMCwweDU0LDB4NWMsCisweDgwLDB4MDAsMHg1NCwweDY4LDB4ODAsMHgwMCwweDU0LDB4YTgsMHg4MCwweDAwLDB4NTYsMHhhOCwweDgwLDB4MDAsMHg1NywweGVjLAorMHg4MCwweDAwLDB4NTgsMHgxNCwweDgwLDB4MDAsMHg1OSwweDBjLDB4ODAsMHgwMCwweDU5LDB4YzQsMHg4MCwweDAwLDB4NWEsMHg2YywKKzB4ODAsMHgwMCwweDVhLDB4ZTAsMHg4MCwweDAwLDB4NWIsMHhlYywweDgwLDB4MDAsMHg1YywweDI0LDB4ODAsMHgwMCwweDVjLDB4MzgsCisweDgwLDB4MDAsMHg1YywweDRjLDB4ODAsMHgwMCwweDVkLDB4NDAsMHg4MCwweDAwLDB4NWQsMHg4MCwweDgwLDB4MDAsMHg1ZSwweDM0LAorMHg4MCwweDAwLDB4NWUsMHg1YywweDgwLDB4MDAsMHg1NiwweDY4LDB4ODAsMHgwMCwweDVlLDB4NzgsMHg4MCwweDAwLDB4ODgsMHhmOCwKKzB4ODAsMHgwMCwweDg4LDB4ZjgsMHg4MCwweDAwLDB4ODgsMHhmOCwweDgwLDB4MDAsMHg4OSwweDJjLDB4ODAsMHgwMCwweDg5LDB4NmMsCisweDgwLDB4MDAsMHg4OSwweGE0LDB4ODAsMHgwMCwweDg5LDB4ZDQsMHg4MCwweDAwLDB4OGEsMHgxMCwweDgwLDB4MDAsMHg4YSwweDUwLAorMHg4MCwweDAwLDB4OGEsMHhiOCwweDgwLDB4MDAsMHg4YSwweGNjLDB4ODAsMHgwMCwweDhiLDB4MDgsMHg4MCwweDAwLDB4OGIsMHgxMCwKKzB4ODAsMHgwMCwweDhiLDB4NGMsMHg4MCwweDAwLDB4OGIsMHg2MCwweDgwLDB4MDAsMHg4YiwweDY4LDB4ODAsMHgwMCwweDhiLDB4NzAsCisweDgwLDB4MDAsMHg4YiwweDcwLDB4ODAsMHgwMCwweDhiLDB4NzAsMHg4MCwweDAwLDB4OGIsMHg3MCwweDgwLDB4MDAsMHg4YSwweDkwLAorMHg4MCwweDAwLDB4OGIsMHhhMCwweDgwLDB4MDAsMHg4YiwweGI0LDB4ODAsMHgwMCwweDg4LDB4NTQsMHg4MCwweDAwLDB4OGUsMHhjOCwKKzB4ODAsMHgwMCwweDhlLDB4YzgsMHg4MCwweDAwLDB4OGUsMHhjOCwweDgwLDB4MDAsMHg4ZSwweGZjLDB4ODAsMHgwMCwweDhmLDB4M2MsCisweDgwLDB4MDAsMHg4ZiwweDc0LDB4ODAsMHgwMCwweDhmLDB4YTQsMHg4MCwweDAwLDB4OGYsMHhlMCwweDgwLDB4MDAsMHg5MCwweDIwLAorMHg4MCwweDAwLDB4OTAsMHg4OCwweDgwLDB4MDAsMHg5MCwweDljLDB4ODAsMHgwMCwweDkwLDB4ZDgsMHg4MCwweDAwLDB4OTAsMHhlMCwKKzB4ODAsMHgwMCwweDkxLDB4MWMsMHg4MCwweDAwLDB4OTEsMHgzMCwweDgwLDB4MDAsMHg5MSwweDM4LDB4ODAsMHgwMCwweDkxLDB4NDAsCisweDgwLDB4MDAsMHg5MSwweDQwLDB4ODAsMHgwMCwweDkxLDB4NDAsMHg4MCwweDAwLDB4OTEsMHg0MCwweDgwLDB4MDAsMHg5MCwweDYwLAorMHg4MCwweDAwLDB4OTEsMHg3MCwweDgwLDB4MDAsMHg5MSwweDg0LDB4ODAsMHgwMCwweDhkLDB4MDAsfTsKKwordTMyIFJ0bDgxOTJVc2JQSFlfUkVHQXJyYXlbXSA9IHsKKzB4MCwgfTsKKwordTMyIFJ0bDgxOTJVc2JQSFlfUkVHXzFUMlJBcnJheVtdID0geworMHg4MDAsMHgwMDAwMDAwMCwKKzB4ODA0LDB4MDAwMDAwMDEsCisweDgwOCwweDAwMDBmYzAwLAorMHg4MGMsMHgwMDAwMDAxYywKKzB4ODEwLDB4ODAxMDEwYWEsCisweDgxNCwweDAwODUxNGQwLAorMHg4MTgsMHgwMDAwMDA0MCwKKzB4ODFjLDB4MDAwMDAwMDAsCisweDgyMCwweDAwMDAwMDA0LAorMHg4MjQsMHgwMDY5MDAwMCwKKzB4ODI4LDB4MDAwMDAwMDQsCisweDgyYywweDAwZTkwMDAwLAorMHg4MzAsMHgwMDAwMDAwNCwKKzB4ODM0LDB4MDA2OTAwMDAsCisweDgzOCwweDAwMDAwMDA0LAorMHg4M2MsMHgwMGU5MDAwMCwKKzB4ODQwLDB4MDAwMDAwMDAsCisweDg0NCwweDAwMDAwMDAwLAorMHg4NDgsMHgwMDAwMDAwMCwKKzB4ODRjLDB4MDAwMDAwMDAsCisweDg1MCwweDAwMDAwMDAwLAorMHg4NTQsMHgwMDAwMDAwMCwKKzB4ODU4LDB4NjVhOTY1YTksCisweDg1YywweDY1YTk2NWE5LAorMHg4NjAsMHgwMDFmMDAxMCwKKzB4ODY0LDB4MDA3ZjAwMTAsCisweDg2OCwweDAwMWYwMDEwLAorMHg4NmMsMHgwMDdmMDAxMCwKKzB4ODcwLDB4MGYxMDBmNzAsCisweDg3NCwweDBmMTAwZjcwLAorMHg4NzgsMHgwMDAwMDAwMCwKKzB4ODdjLDB4MDAwMDAwMDAsCisweDg4MCwweDY4NzBlMzZjLAorMHg4ODQsMHhlMzU3MzYwMCwKKzB4ODg4LDB4NDI2MGMzNDAsCisweDg4YywweDAwMDBmZjAwLAorMHg4OTAsMHgwMDAwMDAwMCwKKzB4ODk0LDB4ZmZmZmZmZmUsCisweDg5OCwweDRjNDIzODJmLAorMHg4OWMsMHgwMDY1NjA1NiwKKzB4OGIwLDB4MDAwMDAwMDAsCisweDhlMCwweDAwMDAwMDAwLAorMHg4ZTQsMHgwMDAwMDAwMCwKKzB4OTAwLDB4MDAwMDAwMDAsCisweDkwNCwweDAwMDAwMDIzLAorMHg5MDgsMHgwMDAwMDAwMCwKKzB4OTBjLDB4MzExMjEzMTEsCisweGEwMCwweDAwZDBjN2Q4LAorMHhhMDQsMHg4MTFmMDAwOCwKKzB4YTA4LDB4ODBjZDgzMDAsCisweGEwYywweDJlNjI3NDBmLAorMHhhMTAsMHg5NTAwOWI3OCwKKzB4YTE0LDB4MTExNDUwMDgsCisweGExOCwweDAwODgxMTE3LAorMHhhMWMsMHg4OTE0MGZhMCwKKzB4YTIwLDB4MWExYjAwMDAsCisweGEyNCwweDA5MGUxMzE3LAorMHhhMjgsMHgwMDAwMDIwNCwKKzB4YTJjLDB4MDAwMDAwMDAsCisweGMwMCwweDAwMDAwMDQwLAorMHhjMDQsMHgwMDAwNTQzMywKKzB4YzA4LDB4MDAwMDAwZTQsCisweGMwYywweDZjNmM2YzZjLAorMHhjMTAsMHgwODgwMDAwMCwKKzB4YzE0LDB4NDAwMDAxMDAsCisweGMxOCwweDA4MDAwMDAwLAorMHhjMWMsMHg0MDAwMDEwMCwKKzB4YzIwLDB4MDgwMDAwMDAsCisweGMyNCwweDQwMDAwMTAwLAorMHhjMjgsMHgwODAwMDAwMCwKKzB4YzJjLDB4NDAwMDAxMDAsCisweGMzMCwweDZkZTlhYzQ0LAorMHhjMzQsMHg0NjVjNTJjZCwKKzB4YzM4LDB4NDk3ZjU5OTQsCisweGMzYywweDBhOTY5NzY0LAorMHhjNDAsMHgxZjdjNDAzZiwKKzB4YzQ0LDB4MDAwMTAwYjcsCisweGM0OCwweGVjMDIwMDAwLAorMHhjNGMsMHgwMDAwMDMwMCwKKzB4YzUwLDB4Njk1NDM0MjAsCisweGM1NCwweDQzM2MwMDk0LAorMHhjNTgsMHg2OTU0MzQyMCwKKzB4YzVjLDB4NDMzYzAwOTQsCisweGM2MCwweDY5NTQzNDIwLAorMHhjNjQsMHg0MzNjMDA5NCwKKzB4YzY4LDB4Njk1NDM0MjAsCisweGM2YywweDQzM2MwMDk0LAorMHhjNzAsMHgyYzdmMDAwZCwKKzB4Yzc0LDB4MDE4NjE3NWIsCisweGM3OCwweDAwMDAwMDFmLAorMHhjN2MsMHgwMGI5MTYxMiwKKzB4YzgwLDB4NDAwMDAxMDAsCisweGM4NCwweDIwMDAwMDAwLAorMHhjODgsMHg0MDAwMDEwMCwKKzB4YzhjLDB4MjAyMDAwMDAsCisweGM5MCwweDQwMDAwMTAwLAorMHhjOTQsMHgwMDAwMDAwMCwKKzB4Yzk4LDB4NDAwMDAxMDAsCisweGM5YywweDAwMDAwMDAwLAorMHhjYTAsMHgwMDQ5MjQ5MiwKKzB4Y2E0LDB4MDAwMDAwMDAsCisweGNhOCwweDAwMDAwMDAwLAorMHhjYWMsMHgwMDAwMDAwMCwKKzB4Y2IwLDB4MDAwMDAwMDAsCisweGNiNCwweDAwMDAwMDAwLAorMHhjYjgsMHgwMDAwMDAwMCwKKzB4Y2JjLDB4MDA0OTI0OTIsCisweGNjMCwweDAwMDAwMDAwLAorMHhjYzQsMHgwMDAwMDAwMCwKKzB4Y2M4LDB4MDAwMDAwMDAsCisweGNjYywweDAwMDAwMDAwLAorMHhjZDAsMHgwMDAwMDAwMCwKKzB4Y2Q0LDB4MDAwMDAwMDAsCisweGNkOCwweDY0YjIyNDI3LAorMHhjZGMsMHgwMDc2NjkzMiwKKzB4Y2UwLDB4MDAyMjIyMjIsCisweGQwMCwweDAwMDAwNzUwLAorMHhkMDQsMHgwMDAwMDQwMywKKzB4ZDA4LDB4MDAwMDkwN2YsCisweGQwYywweDAwMDAwMDAxLAorMHhkMTAsMHhhMDYzMzMzMywKKzB4ZDE0LDB4MzMzMzNjNjMsCisweGQxOCwweDZhOGY1YjZiLAorMHhkMWMsMHgwMDAwMDAwMCwKKzB4ZDIwLDB4MDAwMDAwMDAsCisweGQyNCwweDAwMDAwMDAwLAorMHhkMjgsMHgwMDAwMDAwMCwKKzB4ZDJjLDB4Y2M5Nzk5NzUsCisweGQzMCwweDAwMDAwMDAwLAorMHhkMzQsMHgwMDAwMDAwMCwKKzB4ZDM4LDB4MDAwMDAwMDAsCisweGQzYywweDAwMDI3MjkzLAorMHhkNDAsMHgwMDAwMDAwMCwKKzB4ZDQ0LDB4MDAwMDAwMDAsCisweGQ0OCwweDAwMDAwMDAwLAorMHhkNGMsMHgwMDAwMDAwMCwKKzB4ZDUwLDB4NjQzNzE0MGEsCisweGQ1NCwweDAyNGRiZDAyLAorMHhkNTgsMHgwMDAwMDAwMCwKKzB4ZDVjLDB4MDQwMzIwNjQsCisweGUwMCwweDE2MWExYTFhLAorMHhlMDQsMHgxMjEyMTQxNiwKKzB4ZTA4LDB4MDAwMDE4MDAsCisweGUwYywweDAwMDAwMDAwLAorMHhlMTAsMHgxNjFhMWExYSwKKzB4ZTE0LDB4MTIxMjE0MTYsCisweGUxOCwweDE2MWExYTFhLAorMHhlMWMsMHgxMjEyMTQxNiwKK307CisKK3UzMiBSdGw4MTkyVXNiUmFkaW9BX0FycmF5W10gPSB7CisweDAxOSwweDAwMDAwMDAzLAorMHgwMDAsMHgwMDAwMDBiZiwKKzB4MDAxLDB4MDAwMDBlZTAsCisweDAwMiwweDAwMDAwMDRjLAorMHgwMDMsMHgwMDAwMDdmMSwKKzB4MDA0LDB4MDAwMDA5NzUsCisweDAwNSwweDAwMDAwYzU4LAorMHgwMDYsMHgwMDAwMGFlNiwKKzB4MDA3LDB4MDAwMDAwY2EsCisweDAwOCwweDAwMDAwZTFjLAorMHgwMDksMHgwMDAwMDdmMCwKKzB4MDBhLDB4MDAwMDA5ZDAsCisweDAwYiwweDAwMDAwMWJhLAorMHgwMGMsMHgwMDAwMDI0MCwKKzB4MDBlLDB4MDAwMDAwMjAsCisweDAwZiwweDAwMDAwOTkwLAorMHgwMTIsMHgwMDAwMDgwNiwKKzB4MDE0LDB4MDAwMDA1YWIsCisweDAxNSwweDAwMDAwZjgwLAorMHgwMTYsMHgwMDAwMDAyMCwKKzB4MDE3LDB4MDAwMDA1OTcsCisweDAxOCwweDAwMDAwNTBhLAorMHgwMWEsMHgwMDAwMGY4MCwKKzB4MDFiLDB4MDAwMDBmNWUsCisweDAxYywweDAwMDAwMDA4LAorMHgwMWQsMHgwMDAwMDYwNywKKzB4MDFlLDB4MDAwMDA2Y2MsCisweDAxZiwweDAwMDAwMDAwLAorMHgwMjAsMHgwMDAwMDFhNSwKKzB4MDFmLDB4MDAwMDAwMDEsCisweDAyMCwweDAwMDAwMTY1LAorMHgwMWYsMHgwMDAwMDAwMiwKKzB4MDIwLDB4MDAwMDAwYzYsCisweDAxZiwweDAwMDAwMDAzLAorMHgwMjAsMHgwMDAwMDA4NiwKKzB4MDFmLDB4MDAwMDAwMDQsCisweDAyMCwweDAwMDAwMDQ2LAorMHgwMWYsMHgwMDAwMDAwNSwKKzB4MDIwLDB4MDAwMDAxZTYsCisweDAxZiwweDAwMDAwMDA2LAorMHgwMjAsMHgwMDAwMDFhNiwKKzB4MDFmLDB4MDAwMDAwMDcsCisweDAyMCwweDAwMDAwMTY2LAorMHgwMWYsMHgwMDAwMDAwOCwKKzB4MDIwLDB4MDAwMDAwYzcsCisweDAxZiwweDAwMDAwMDA5LAorMHgwMjAsMHgwMDAwMDA4NywKKzB4MDFmLDB4MDAwMDAwMGEsCisweDAyMCwweDAwMDAwMGY3LAorMHgwMWYsMHgwMDAwMDAwYiwKKzB4MDIwLDB4MDAwMDAwZDcsCisweDAxZiwweDAwMDAwMDBjLAorMHgwMjAsMHgwMDAwMDBiNywKKzB4MDFmLDB4MDAwMDAwMGQsCisweDAyMCwweDAwMDAwMDk3LAorMHgwMWYsMHgwMDAwMDAwZSwKKzB4MDIwLDB4MDAwMDAwNzcsCisweDAxZiwweDAwMDAwMDBmLAorMHgwMjAsMHgwMDAwMDA1NywKKzB4MDFmLDB4MDAwMDAwMTAsCisweDAyMCwweDAwMDAwMDM3LAorMHgwMWYsMHgwMDAwMDAxMSwKKzB4MDIwLDB4MDAwMDAwZmIsCisweDAxZiwweDAwMDAwMDEyLAorMHgwMjAsMHgwMDAwMDBkYiwKKzB4MDFmLDB4MDAwMDAwMTMsCisweDAyMCwweDAwMDAwMGJiLAorMHgwMWYsMHgwMDAwMDAxNCwKKzB4MDIwLDB4MDAwMDAwZmYsCisweDAxZiwweDAwMDAwMDE1LAorMHgwMjAsMHgwMDAwMDBlMywKKzB4MDFmLDB4MDAwMDAwMTYsCisweDAyMCwweDAwMDAwMGMzLAorMHgwMWYsMHgwMDAwMDAxNywKKzB4MDIwLDB4MDAwMDAwYTMsCisweDAxZiwweDAwMDAwMDE4LAorMHgwMjAsMHgwMDAwMDA4MywKKzB4MDFmLDB4MDAwMDAwMTksCisweDAyMCwweDAwMDAwMDYzLAorMHgwMWYsMHgwMDAwMDAxYSwKKzB4MDIwLDB4MDAwMDAwNDMsCisweDAxZiwweDAwMDAwMDFiLAorMHgwMjAsMHgwMDAwMDAyMywKKzB4MDFmLDB4MDAwMDAwMWMsCisweDAyMCwweDAwMDAwMDAzLAorMHgwMWYsMHgwMDAwMDAxZCwKKzB4MDIwLDB4MDAwMDAxZTMsCisweDAxZiwweDAwMDAwMDFlLAorMHgwMjAsMHgwMDAwMDFjMywKKzB4MDFmLDB4MDAwMDAwMWYsCisweDAyMCwweDAwMDAwMWEzLAorMHgwMWYsMHgwMDAwMDAyMCwKKzB4MDIwLDB4MDAwMDAxODMsCisweDAxZiwweDAwMDAwMDIxLAorMHgwMjAsMHgwMDAwMDE2MywKKzB4MDFmLDB4MDAwMDAwMjIsCisweDAyMCwweDAwMDAwMTQzLAorMHgwMWYsMHgwMDAwMDAyMywKKzB4MDIwLDB4MDAwMDAxMjMsCisweDAxZiwweDAwMDAwMDI0LAorMHgwMjAsMHgwMDAwMDEwMywKKzB4MDIzLDB4MDAwMDAyMDMsCisweDAyNCwweDAwMDAwMjAwLAorMHgwMGIsMHgwMDAwMDFiYSwKKzB4MDJjLDB4MDAwMDAzZDcsCisweDAyZCwweDAwMDAwZmYwLAorMHgwMDAsMHgwMDAwMDAzNywKKzB4MDA0LDB4MDAwMDAxNjAsCisweDAwNywweDAwMDAwMDgwLAorMHgwMDIsMHgwMDAwMDg4ZCwKKzB4MGZlLDB4MDAwMDAwMDAsCisweDBmZSwweDAwMDAwMDAwLAorMHgwMTYsMHgwMDAwMDIwMCwKKzB4MDE2LDB4MDAwMDAzODAsCisweDAxNiwweDAwMDAwMDIwLAorMHgwMTYsMHgwMDAwMDFhMCwKKzB4MDAwLDB4MDAwMDAwYmYsCisweDAwZCwweDAwMDAwMDFmLAorMHgwMGQsMHgwMDAwMGM5ZiwKKzB4MDAyLDB4MDAwMDAwNGQsCisweDAwMCwweDAwMDAwY2JmLAorMHgwMDQsMHgwMDAwMDk3NSwKKzB4MDA3LDB4MDAwMDA3MDAsCit9OworCit1MzIgUnRsODE5MlVzYlJhZGlvQl9BcnJheVtdID0geworMHgwMTksMHgwMDAwMDAwMywKKzB4MDAwLDB4MDAwMDAwYmYsCisweDAwMSwweDAwMDAwNmUwLAorMHgwMDIsMHgwMDAwMDA0YywKKzB4MDAzLDB4MDAwMDA3ZjEsCisweDAwNCwweDAwMDAwOTc1LAorMHgwMDUsMHgwMDAwMGM1OCwKKzB4MDA2LDB4MDAwMDBhZTYsCisweDAwNywweDAwMDAwMGNhLAorMHgwMDgsMHgwMDAwMGUxYywKKzB4MDAwLDB4MDAwMDAwYjcsCisweDAwYSwweDAwMDAwODUwLAorMHgwMDAsMHgwMDAwMDBiZiwKKzB4MDBiLDB4MDAwMDAxYmEsCisweDAwYywweDAwMDAwMjQwLAorMHgwMGUsMHgwMDAwMDAyMCwKKzB4MDE1LDB4MDAwMDBmODAsCisweDAxNiwweDAwMDAwMDIwLAorMHgwMTcsMHgwMDAwMDU5NywKKzB4MDE4LDB4MDAwMDA1MGEsCisweDAxYSwweDAwMDAwZTAwLAorMHgwMWIsMHgwMDAwMGY1ZSwKKzB4MDFkLDB4MDAwMDA2MDcsCisweDAxZSwweDAwMDAwNmNjLAorMHgwMGIsMHgwMDAwMDFiYSwKKzB4MDIzLDB4MDAwMDAyMDMsCisweDAyNCwweDAwMDAwMjAwLAorMHgwMDAsMHgwMDAwMDAzNywKKzB4MDA0LDB4MDAwMDAxNjAsCisweDAxNiwweDAwMDAwMjAwLAorMHgwMTYsMHgwMDAwMDM4MCwKKzB4MDE2LDB4MDAwMDAwMjAsCisweDAxNiwweDAwMDAwMWEwLAorMHgwMGQsMHgwMDAwMGNjYywKKzB4MDAwLDB4MDAwMDAwYmYsCisweDAwMiwweDAwMDAwMDRkLAorMHgwMDAsMHgwMDAwMGNiZiwKKzB4MDA0LDB4MDAwMDA5NzUsCisweDAwNywweDAwMDAwNzAwLAorfTsKKwordTMyIFJ0bDgxOTJVc2JSYWRpb0NfQXJyYXlbXSA9IHsKKzB4MCwgfTsKKwordTMyIFJ0bDgxOTJVc2JSYWRpb0RfQXJyYXlbXSA9IHsKKzB4MCwgfTsKKwordTMyIFJ0bDgxOTJVc2JNQUNQSFlfQXJyYXlbXSA9IHsKKzB4MDNjLDB4ZmZmZjAwMDAsMHgwMDAwMGYwZiwKKzB4MzQwLDB4ZmZmZmZmZmYsMHgxNjFhMWExYSwKKzB4MzQ0LDB4ZmZmZmZmZmYsMHgxMjEyMTQxNiwKKzB4MzQ4LDB4MDAwMGZmZmYsMHgwMDAwMTgxOCwKKzB4MTJjLDB4ZmZmZmZmZmYsMHgwNDAwMDgwMiwKKzB4MzE4LDB4MDAwMDBmZmYsMHgwMDAwMDEwMCwKK307CisKK3UzMiBSdGw4MTkyVXNiTUFDUEhZX0FycmF5X1BHW10gPSB7CisweDAzYywweGZmZmYwMDAwLDB4MDAwMDBmMGYsCisweGUwMCwweGZmZmZmZmZmLDB4MDYwOTA5MDksCisweGUwNCwweGZmZmZmZmZmLDB4MDAwMzAzMDYsCisweGUwOCwweDAwMDBmZjAwLDB4MDAwMDAwMDAsCisweGUxMCwweGZmZmZmZmZmLDB4MGEwYzBkMGYsCisweGUxNCwweGZmZmZmZmZmLDB4MDYwNzA4MDksCisweGUxOCwweGZmZmZmZmZmLDB4MGEwYzBkMGYsCisweGUxYywweGZmZmZmZmZmLDB4MDYwNzA4MDksCisweDEyYywweGZmZmZmZmZmLDB4MDQwMDA4MDIsCisweDMxOCwweDAwMDAwZmZmLDB4MDAwMDA4MDAsCit9OworCit1MzIgUnRsODE5MlVzYkFHQ1RBQl9BcnJheVtdID0geworMHhjNzgsMHg3ZDAwMDAwMSwKKzB4Yzc4LDB4N2QwMTAwMDEsCisweGM3OCwweDdkMDIwMDAxLAorMHhjNzgsMHg3ZDAzMDAwMSwKKzB4Yzc4LDB4N2QwNDAwMDEsCisweGM3OCwweDdkMDUwMDAxLAorMHhjNzgsMHg3YzA2MDAwMSwKKzB4Yzc4LDB4N2IwNzAwMDEsCisweGM3OCwweDdhMDgwMDAxLAorMHhjNzgsMHg3OTA5MDAwMSwKKzB4Yzc4LDB4NzgwYTAwMDEsCisweGM3OCwweDc3MGIwMDAxLAorMHhjNzgsMHg3NjBjMDAwMSwKKzB4Yzc4LDB4NzUwZDAwMDEsCisweGM3OCwweDc0MGUwMDAxLAorMHhjNzgsMHg3MzBmMDAwMSwKKzB4Yzc4LDB4NzIxMDAwMDEsCisweGM3OCwweDcxMTEwMDAxLAorMHhjNzgsMHg3MDEyMDAwMSwKKzB4Yzc4LDB4NmYxMzAwMDEsCisweGM3OCwweDZlMTQwMDAxLAorMHhjNzgsMHg2ZDE1MDAwMSwKKzB4Yzc4LDB4NmMxNjAwMDEsCisweGM3OCwweDZiMTcwMDAxLAorMHhjNzgsMHg2YTE4MDAwMSwKKzB4Yzc4LDB4NjkxOTAwMDEsCisweGM3OCwweDY4MWEwMDAxLAorMHhjNzgsMHg2NzFiMDAwMSwKKzB4Yzc4LDB4NjYxYzAwMDEsCisweGM3OCwweDY1MWQwMDAxLAorMHhjNzgsMHg2NDFlMDAwMSwKKzB4Yzc4LDB4NDkxZjAwMDEsCisweGM3OCwweDQ4MjAwMDAxLAorMHhjNzgsMHg0NzIxMDAwMSwKKzB4Yzc4LDB4NDYyMjAwMDEsCisweGM3OCwweDQ1MjMwMDAxLAorMHhjNzgsMHg0NDI0MDAwMSwKKzB4Yzc4LDB4NDMyNTAwMDEsCisweGM3OCwweDI4MjYwMDAxLAorMHhjNzgsMHgyNzI3MDAwMSwKKzB4Yzc4LDB4MjYyODAwMDEsCisweGM3OCwweDI1MjkwMDAxLAorMHhjNzgsMHgyNDJhMDAwMSwKKzB4Yzc4LDB4MjMyYjAwMDEsCisweGM3OCwweDIyMmMwMDAxLAorMHhjNzgsMHgyMTJkMDAwMSwKKzB4Yzc4LDB4MjAyZTAwMDEsCisweGM3OCwweDBhMmYwMDAxLAorMHhjNzgsMHgwODMwMDAwMSwKKzB4Yzc4LDB4MDYzMTAwMDEsCisweGM3OCwweDA1MzIwMDAxLAorMHhjNzgsMHgwNDMzMDAwMSwKKzB4Yzc4LDB4MDMzNDAwMDEsCisweGM3OCwweDAyMzUwMDAxLAorMHhjNzgsMHgwMTM2MDAwMSwKKzB4Yzc4LDB4MDAzNzAwMDEsCisweGM3OCwweDAwMzgwMDAxLAorMHhjNzgsMHgwMDM5MDAwMSwKKzB4Yzc4LDB4MDAzYTAwMDEsCisweGM3OCwweDAwM2IwMDAxLAorMHhjNzgsMHgwMDNjMDAwMSwKKzB4Yzc4LDB4MDAzZDAwMDEsCisweGM3OCwweDAwM2UwMDAxLAorMHhjNzgsMHgwMDNmMDAwMSwKKzB4Yzc4LDB4N2Q0MDAwMDEsCisweGM3OCwweDdkNDEwMDAxLAorMHhjNzgsMHg3ZDQyMDAwMSwKKzB4Yzc4LDB4N2Q0MzAwMDEsCisweGM3OCwweDdkNDQwMDAxLAorMHhjNzgsMHg3ZDQ1MDAwMSwKKzB4Yzc4LDB4N2M0NjAwMDEsCisweGM3OCwweDdiNDcwMDAxLAorMHhjNzgsMHg3YTQ4MDAwMSwKKzB4Yzc4LDB4Nzk0OTAwMDEsCisweGM3OCwweDc4NGEwMDAxLAorMHhjNzgsMHg3NzRiMDAwMSwKKzB4Yzc4LDB4NzY0YzAwMDEsCisweGM3OCwweDc1NGQwMDAxLAorMHhjNzgsMHg3NDRlMDAwMSwKKzB4Yzc4LDB4NzM0ZjAwMDEsCisweGM3OCwweDcyNTAwMDAxLAorMHhjNzgsMHg3MTUxMDAwMSwKKzB4Yzc4LDB4NzA1MjAwMDEsCisweGM3OCwweDZmNTMwMDAxLAorMHhjNzgsMHg2ZTU0MDAwMSwKKzB4Yzc4LDB4NmQ1NTAwMDEsCisweGM3OCwweDZjNTYwMDAxLAorMHhjNzgsMHg2YjU3MDAwMSwKKzB4Yzc4LDB4NmE1ODAwMDEsCisweGM3OCwweDY5NTkwMDAxLAorMHhjNzgsMHg2ODVhMDAwMSwKKzB4Yzc4LDB4Njc1YjAwMDEsCisweGM3OCwweDY2NWMwMDAxLAorMHhjNzgsMHg2NTVkMDAwMSwKKzB4Yzc4LDB4NjQ1ZTAwMDEsCisweGM3OCwweDQ5NWYwMDAxLAorMHhjNzgsMHg0ODYwMDAwMSwKKzB4Yzc4LDB4NDc2MTAwMDEsCisweGM3OCwweDQ2NjIwMDAxLAorMHhjNzgsMHg0NTYzMDAwMSwKKzB4Yzc4LDB4NDQ2NDAwMDEsCisweGM3OCwweDQzNjUwMDAxLAorMHhjNzgsMHgyODY2MDAwMSwKKzB4Yzc4LDB4Mjc2NzAwMDEsCisweGM3OCwweDI2NjgwMDAxLAorMHhjNzgsMHgyNTY5MDAwMSwKKzB4Yzc4LDB4MjQ2YTAwMDEsCisweGM3OCwweDIzNmIwMDAxLAorMHhjNzgsMHgyMjZjMDAwMSwKKzB4Yzc4LDB4MjE2ZDAwMDEsCisweGM3OCwweDIwNmUwMDAxLAorMHhjNzgsMHgwYTZmMDAwMSwKKzB4Yzc4LDB4MDg3MDAwMDEsCisweGM3OCwweDA2NzEwMDAxLAorMHhjNzgsMHgwNTcyMDAwMSwKKzB4Yzc4LDB4MDQ3MzAwMDEsCisweGM3OCwweDAzNzQwMDAxLAorMHhjNzgsMHgwMjc1MDAwMSwKKzB4Yzc4LDB4MDE3NjAwMDEsCisweGM3OCwweDAwNzcwMDAxLAorMHhjNzgsMHgwMDc4MDAwMSwKKzB4Yzc4LDB4MDA3OTAwMDEsCisweGM3OCwweDAwN2EwMDAxLAorMHhjNzgsMHgwMDdiMDAwMSwKKzB4Yzc4LDB4MDA3YzAwMDEsCisweGM3OCwweDAwN2QwMDAxLAorMHhjNzgsMHgwMDdlMDAwMSwKKzB4Yzc4LDB4MDA3ZjAwMDEsCisweGM3OCwweDJlMDAwMDFlLAorMHhjNzgsMHgyZTAxMDAxZSwKKzB4Yzc4LDB4MmUwMjAwMWUsCisweGM3OCwweDJlMDMwMDFlLAorMHhjNzgsMHgyZTA0MDAxZSwKKzB4Yzc4LDB4MmUwNTAwMWUsCisweGM3OCwweDMwMDYwMDFlLAorMHhjNzgsMHgzNDA3MDAxZSwKKzB4Yzc4LDB4MzkwODAwMWUsCisweGM3OCwweDNjMDkwMDFlLAorMHhjNzgsMHgzZjBhMDAxZSwKKzB4Yzc4LDB4NDIwYjAwMWUsCisweGM3OCwweDQ0MGMwMDFlLAorMHhjNzgsMHg0NTBkMDAxZSwKKzB4Yzc4LDB4NDYwZTAwMWUsCisweGM3OCwweDQ2MGYwMDFlLAorMHhjNzgsMHg0NzEwMDAxZSwKKzB4Yzc4LDB4NDgxMTAwMWUsCisweGM3OCwweDQ5MTIwMDFlLAorMHhjNzgsMHg0YTEzMDAxZSwKKzB4Yzc4LDB4NGIxNDAwMWUsCisweGM3OCwweDRiMTUwMDFlLAorMHhjNzgsMHg0YzE2MDAxZSwKKzB4Yzc4LDB4NGQxNzAwMWUsCisweGM3OCwweDRlMTgwMDFlLAorMHhjNzgsMHg0ZjE5MDAxZSwKKzB4Yzc4LDB4NGYxYTAwMWUsCisweGM3OCwweDUwMWIwMDFlLAorMHhjNzgsMHg1MTFjMDAxZSwKKzB4Yzc4LDB4NTIxZDAwMWUsCisweGM3OCwweDUyMWUwMDFlLAorMHhjNzgsMHg1MzFmMDAxZSwKKzB4Yzc4LDB4NTMyMDAwMWUsCisweGM3OCwweDU0MjEwMDFlLAorMHhjNzgsMHg1NTIyMDAxZSwKKzB4Yzc4LDB4NTUyMzAwMWUsCisweGM3OCwweDU2MjQwMDFlLAorMHhjNzgsMHg1NzI1MDAxZSwKKzB4Yzc4LDB4NTcyNjAwMWUsCisweGM3OCwweDU4MjcwMDFlLAorMHhjNzgsMHg1ODI4MDAxZSwKKzB4Yzc4LDB4NTkyOTAwMWUsCisweGM3OCwweDU5MmEwMDFlLAorMHhjNzgsMHg1YTJiMDAxZSwKKzB4Yzc4LDB4NWIyYzAwMWUsCisweGM3OCwweDVjMmQwMDFlLAorMHhjNzgsMHg1YzJlMDAxZSwKKzB4Yzc4LDB4NWQyZjAwMWUsCisweGM3OCwweDVlMzAwMDFlLAorMHhjNzgsMHg1ZjMxMDAxZSwKKzB4Yzc4LDB4NjAzMjAwMWUsCisweGM3OCwweDYwMzMwMDFlLAorMHhjNzgsMHg2MTM0MDAxZSwKKzB4Yzc4LDB4NjIzNTAwMWUsCisweGM3OCwweDYzMzYwMDFlLAorMHhjNzgsMHg2NDM3MDAxZSwKKzB4Yzc4LDB4NjQzODAwMWUsCisweGM3OCwweDY1MzkwMDFlLAorMHhjNzgsMHg2NjNhMDAxZSwKKzB4Yzc4LDB4NjczYjAwMWUsCisweGM3OCwweDY3M2MwMDFlLAorMHhjNzgsMHg2ODNkMDAxZSwKKzB4Yzc4LDB4NjkzZTAwMWUsCisweGM3OCwweDZhM2YwMDFlLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfZmlybXdhcmVfaW1nLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlX2ltZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZDk1MTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlX2ltZy5oCkBAIC0wLDAgKzEsMzUgQEAKKyNpZm5kZWYgSU1HX0gKKyNkZWZpbmUgSU1HX0gKKworI2RlZmluZSBCT09UX0FSUl9MRU4gMzQ0CisjZGVmaW5lIE1BSU5fQVJSX0xFTiA0NTEzNgorI2RlZmluZSBEQVRBX0FSUl9MRU4gNzk2CisjZGVmaW5lIE1BQ1BIWV9BcnJheV9QR0xlbmd0aCAzMAorI2RlZmluZSBQSFlfUkVHXzFUMlJBcnJheUxlbmd0aCAyOTYKKyNkZWZpbmUgQUdDVEFCX0FycmF5TGVuZ3RoIDM4NAorI2RlZmluZSBNQUNQSFlfQXJyYXlMZW5ndGggMTgKKworI2RlZmluZSBSYWRpb0FfQXJyYXlMZW5ndGggMjQ2CisjZGVmaW5lIFJhZGlvQl9BcnJheUxlbmd0aCA3OAorI2RlZmluZSBSYWRpb0NfQXJyYXlMZW5ndGggMQorI2RlZmluZSBSYWRpb0RfQXJyYXlMZW5ndGggMQorI2RlZmluZSBQSFlfUkVHQXJyYXlMZW5ndGggMQorCisKK2V4dGVybiB1OCBydGw4MTkwX2Z3Ym9vdF9hcnJheVtCT09UX0FSUl9MRU5dOworZXh0ZXJuIHU4IHJ0bDgxOTBfZndtYWluX2FycmF5W01BSU5fQVJSX0xFTl07CitleHRlcm4gdTggcnRsODE5MF9md2RhdGFfYXJyYXlbREFUQV9BUlJfTEVOXTsKKworZXh0ZXJuIHUzMiBSdGw4MTkyVXNiUEhZX1JFR0FycmF5W107CitleHRlcm4gdTMyIFJ0bDgxOTJVc2JQSFlfUkVHXzFUMlJBcnJheVtdOworZXh0ZXJuIHUzMiBSdGw4MTkyVXNiUmFkaW9BX0FycmF5W107CitleHRlcm4gdTMyIFJ0bDgxOTJVc2JSYWRpb0JfQXJyYXlbXTsKK2V4dGVybiB1MzIgUnRsODE5MlVzYlJhZGlvQ19BcnJheVtdOworZXh0ZXJuIHUzMiBSdGw4MTkyVXNiUmFkaW9EX0FycmF5W107CitleHRlcm4gdTMyIFJ0bDgxOTJVc2JNQUNQSFlfQXJyYXlbXTsKK2V4dGVybiB1MzIgUnRsODE5MlVzYk1BQ1BIWV9BcnJheV9QR1tdOworZXh0ZXJuIHUzMiBSdGw4MTkyVXNiQUdDVEFCX0FycmF5W107CisKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfcGh5LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX3BoeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYWRhZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX3BoeS5jCkBAIC0wLDAgKzEsMTc3NyBAQAorI2luY2x1ZGUgInI4MTkyVS5oIgorI2luY2x1ZGUgInI4MTkyVV9ody5oIgorI2luY2x1ZGUgInI4MTl4VV9waHkuaCIKKyNpbmNsdWRlICJyODE5eFVfcGh5cmVnLmgiCisjaW5jbHVkZSAicjgxOTBfcnRsODI1Ni5oIgorI2luY2x1ZGUgInI4MTkyVV9kbS5oIgorI2luY2x1ZGUgInI4MTl4VV9maXJtd2FyZV9pbWcuaCIKKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKyNpbmNsdWRlICJkb3QxMWQuaCIKKyNlbmRpZgorc3RhdGljIHUzMiBSRl9DSEFOTkVMX1RBQkxFX1pFQlJBW10gPSB7CisJMCwKKwkweDA4NWMsIC8vMjQxMiAxCisJMHgwOGRjLCAvLzI0MTcgMgorCTB4MDk1YywgLy8yNDIyIDMKKwkweDA5ZGMsIC8vMjQyNyA0CisJMHgwYTVjLCAvLzI0MzIgNQorCTB4MGFkYywgLy8yNDM3IDYKKwkweDBiNWMsIC8vMjQ0MiA3CisJMHgwYmRjLCAvLzI0NDcgOAorCTB4MGM1YywgLy8yNDUyIDkKKwkweDBjZGMsIC8vMjQ1NyAxMAorCTB4MGQ1YywgLy8yNDYyIDExCisJMHgwZGRjLCAvLzI0NjcgMTIKKwkweDBlNWMsIC8vMjQ3MiAxMworCTB4MGY3MiwgLy8yNDg0Cit9OworCisKKyNkZWZpbmUgcnRsODE5WFBIWV9SRUdfMVQyUkFycmF5IFJ0bDgxOTJVc2JQSFlfUkVHXzFUMlJBcnJheQorI2RlZmluZSBydGw4MTlYTUFDUEhZX0FycmF5X1BHIFJ0bDgxOTJVc2JNQUNQSFlfQXJyYXlfUEcKKyNkZWZpbmUgcnRsODE5WE1BQ1BIWV9BcnJheSBSdGw4MTkyVXNiTUFDUEhZX0FycmF5CisjZGVmaW5lIHJ0bDgxOVhSYWRpb0FfQXJyYXkgIFJ0bDgxOTJVc2JSYWRpb0FfQXJyYXkKKyNkZWZpbmUgcnRsODE5WFJhZGlvQl9BcnJheSBSdGw4MTkyVXNiUmFkaW9CX0FycmF5CisjZGVmaW5lIHJ0bDgxOVhSYWRpb0NfQXJyYXkgUnRsODE5MlVzYlJhZGlvQ19BcnJheQorI2RlZmluZSBydGw4MTlYUmFkaW9EX0FycmF5IFJ0bDgxOTJVc2JSYWRpb0RfQXJyYXkKKyNkZWZpbmUgcnRsODE5WEFHQ1RBQl9BcnJheSBSdGw4MTkyVXNiQUdDVEFCX0FycmF5CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIHJlYWQgQkIgcGFyYW1ldGVycyBmcm9tIEhlYWRlciBmaWxlIHdlIGdlbiwKKyAqCSAgICAgYW5kIGRvIHJlZ2lzdGVyIHJlYWQvd3JpdGUKKyAqICAgaW5wdXQ6ICB1MzIJZHdCaXRNYXNrICAvL3RhZ2V0IGJpdCBwb3MgaW4gdGhlIGFkZHIgdG8gYmUgbW9kaWZpZWQKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgdTMyCXJldHVybiB0aGUgc2hpZnQgYml0IGJpdCBwb3NpdGlvbiBvZiB0aGUgbWFzaworICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBydGw4MTkyX0NhbGN1bGF0ZUJpdFNoaWZ0KHUzMiBkd0JpdE1hc2spCit7CisJdTMyIGk7CisJZm9yIChpPTA7IGk8PTMxOyBpKyspCisJeworCQlpZiAoKChkd0JpdE1hc2s+PmkpJjB4MSkgPT0gMSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gaTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIGNoZWNrIGRpZmZlcmVudCBSRiB0eXBlIHRvIGV4ZWN1dGUgbGVnYWwganVkZ2VtZW50LiBJZiBSRiBQYXRoIGlzIGlsbGVnYWwsIHdlIHdpbGwgcmV0dXJuIGZhbHNlLgorICogICBpbnB1dDogIG5vbmUKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgMChpbGxlZ2FsLCBmYWxzZSksIDEobGVnYWwsdHJ1ZSkKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IHJ0bDgxOTJfcGh5X0NoZWNrSXNMZWdhbFJGUGF0aChzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1MzIgZVJGUGF0aCkKK3sKKwl1OCByZXQgPSAxOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpZiAocHJpdi0+cmZfdHlwZSA9PSBSRl8yVDRSKQorCQlyZXQgPSAwOworCWVsc2UgaWYgKHByaXYtPnJmX3R5cGUgPT0gUkZfMVQyUikKKwl7CisJCWlmIChlUkZQYXRoID09IFJGOTBfUEFUSF9BIHx8IGVSRlBhdGggPT0gUkY5MF9QQVRIX0IpCisJCQlyZXQgPSAxOworCQllbHNlIGlmIChlUkZQYXRoID09IFJGOTBfUEFUSF9DIHx8IGVSRlBhdGggPT0gUkY5MF9QQVRIX0QpCisJCQlyZXQgPSAwOworCX0KKwlyZXR1cm4gcmV0OworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gc2V0IHNwZWNpZmljIGJpdHMgdG8gQkIgcmVnaXN0ZXIKKyAqICAgaW5wdXQ6ICBuZXRfZGV2aWNlIGRldgorICogICAgICAgICAgIHUzMglkd1JlZ0FkZHIgIC8vdGFyZ2V0IGFkZHIgdG8gYmUgbW9kaWZpZWQKKyAqICAgICAgICAgICB1MzIJZHdCaXRNYXNrICAvL3RhZ2V0IGJpdCBwb3MgaW4gdGhlIGFkZHIgdG8gYmUgbW9kaWZpZWQKKyAqICAgICAgICAgICB1MzIJZHdEYXRhICAgICAvL3ZhbHVlIHRvIGJlIHdyaXRlCisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIG5vbmUKKyAqICBub3RpY2U6CisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBydGw4MTkyX3NldEJCcmVnKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHUzMiBkd1JlZ0FkZHIsIHUzMiBkd0JpdE1hc2ssIHUzMiBkd0RhdGEpCit7CisKKwl1MzIgT3JpZ2luYWxWYWx1ZSwgQml0U2hpZnQsIE5ld1ZhbHVlOworCisJaWYoZHdCaXRNYXNrIT0gYk1hc2tEV29yZCkKKwl7Ly9pZiBub3QgImRvdWJsZSB3b3JkIiB3cml0ZQorCQlPcmlnaW5hbFZhbHVlID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBkd1JlZ0FkZHIpOworCQlCaXRTaGlmdCA9IHJ0bDgxOTJfQ2FsY3VsYXRlQml0U2hpZnQoZHdCaXRNYXNrKTsKKwkJTmV3VmFsdWUgPSAoKChPcmlnaW5hbFZhbHVlKSAmICh+ZHdCaXRNYXNrKSkgfCAoZHdEYXRhIDw8IEJpdFNoaWZ0KSk7CisJCXdyaXRlX25pY19kd29yZChkZXYsIGR3UmVnQWRkciwgTmV3VmFsdWUpOworCX1lbHNlCisJCXdyaXRlX25pY19kd29yZChkZXYsIGR3UmVnQWRkciwgZHdEYXRhKTsKKwlyZXR1cm47Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiByZWFkcyBzcGVjaWZpYyBiaXRzIGZyb20gQkIgcmVnaXN0ZXIKKyAqICAgaW5wdXQ6ICBuZXRfZGV2aWNlIGRldgorICogICAgICAgICAgIHUzMglkd1JlZ0FkZHIgIC8vdGFyZ2V0IGFkZHIgdG8gYmUgcmVhZGJhY2sKKyAqICAgICAgICAgICB1MzIJZHdCaXRNYXNrICAvL3RhZ2V0IGJpdCBwb3MgaW4gdGhlIGFkZHIgdG8gYmUgcmVhZGJhY2sKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgdTMyCURhdGEJLy90aGUgcmVhZGJhY2sgcmVnaXN0ZXIgdmFsdWUKKyAqICBub3RpY2U6CisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHJ0bDgxOTJfUXVlcnlCQlJlZyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1MzIgZHdSZWdBZGRyLCB1MzIgZHdCaXRNYXNrKQoreworCXUzMiBSZXQgPSAwLCBPcmlnaW5hbFZhbHVlLCBCaXRTaGlmdDsKKworCU9yaWdpbmFsVmFsdWUgPSByZWFkX25pY19kd29yZChkZXYsIGR3UmVnQWRkcik7CisJQml0U2hpZnQgPSBydGw4MTkyX0NhbGN1bGF0ZUJpdFNoaWZ0KGR3Qml0TWFzayk7CisJUmV0ID0oT3JpZ2luYWxWYWx1ZSAmIGR3Qml0TWFzaykgPj4gQml0U2hpZnQ7CisKKwlyZXR1cm4gKFJldCk7Cit9CitzdGF0aWMgIHUzMiBwaHlfRndSRlNlcmlhbFJlYWQoIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIFJGOTBfUkFESU9fUEFUSF9FICAgICAgIGVSRlBhdGgsIHUzMiBPZmZzZXQgICk7CisKK3N0YXRpYyB2b2lkIHBoeV9Gd1JGU2VyaWFsV3JpdGUoIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIFJGOTBfUkFESU9fUEFUSF9FICAgICAgIGVSRlBhdGgsIHUzMiAgT2Zmc2V0LCB1MzIgIERhdGEpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiByZWFkIHJlZ2lzdGVyIGZyb20gUkYgY2hpcAorICogICBpbnB1dDogIG5ldF9kZXZpY2UgZGV2CisgKiAgIAkgICAgIFJGOTBfUkFESU9fUEFUSF9FIGVSRlBhdGggLy9yYWRpbyBwYXRoIG9mIEEvQi9DL0QKKyAqICAgICAgICAgICB1MzIJT2Zmc2V0ICAgICAvL3RhcmdldCBhZGRyZXNzIHRvIGJlIHJlYWQKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgdTMyIAlyZWFkYmFjayB2YWx1ZQorICogIG5vdGljZTogIFRoZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiBzZXJpYWwgb3BlcmF0aW9uczooMSkgU29mdHdhcmUgc2VyaWFsIHdyaXRlLigyKUhhcmR3YXJlIExTU0ktTG93IFNwZWVkIFNlcmlhbCBJbnRlcmZhY2UuKDMpSGFyZHdhcmUgSFNTSS1IaWdoIHNwZWVkIHNlcmlhbCB3cml0ZS4gRHJpdmVyIGhlcmUgbmVlZCB0byBpbXBsZW1lbnQgKDEpIGFuZCAoMiktLS1uZWVkIG1vcmUgc3BlYyBmb3IgdGhpcyBpbmZvcm1hdGlvbi4KKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgcnRsODE5Ml9waHlfUkZTZXJpYWxSZWFkKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIFJGOTBfUkFESU9fUEFUSF9FIGVSRlBhdGgsIHUzMiBPZmZzZXQpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMiByZXQgPSAwOworCXUzMiBOZXdPZmZzZXQgPSAwOworCUJCX1JFR0lTVEVSX0RFRklOSVRJT05fVCogcFBoeVJlZyA9ICZwcml2LT5QSFlSZWdEZWZbZVJGUGF0aF07CisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHBQaHlSZWctPnJmTFNTSVJlYWRCYWNrLCBiTFNTSVJlYWRCYWNrRGF0YSwgMCk7CisJLy9tYWtlIHN1cmUgUkYgcmVnaXN0ZXIgb2Zmc2V0IGlzIGNvcnJlY3QKKwlPZmZzZXQgJj0gMHgzZjsKKworCS8vc3dpdGNoIHBhZ2UgZm9yIDgyNTYgUkYgSUMKKwlpZiAocHJpdi0+cmZfY2hpcCA9PSBSRl84MjU2KQorCXsKKwkJaWYgKE9mZnNldCA+PSAzMSkKKwkJeworCQkJcHJpdi0+UmZSZWcwVmFsdWVbZVJGUGF0aF0gfD0gMHgxNDA7CisJCQkvL1N3aXRjaCB0byBSZWdfTW9kZTIgZm9yIFJlZyAzMS00NQorCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHBQaHlSZWctPnJmM3dpcmVPZmZzZXQsIGJNYXNrRFdvcmQsIChwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXTw8MTYpICk7CisJCQkvL21vZGlmeSBvZmZzZXQKKwkJCU5ld09mZnNldCA9IE9mZnNldCAtMzA7CisJCX0KKwkJZWxzZSBpZiAoT2Zmc2V0ID49IDE2KQorCQl7CisJCQlwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXSB8PSAweDEwMDsKKwkJCXByaXYtPlJmUmVnMFZhbHVlW2VSRlBhdGhdICY9ICh+MHg0MCk7CisJCQkvL1N3aXRjaCB0byBSZWdfTW9kZSAxIGZvciBSZWcxNi0zMAorCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHBQaHlSZWctPnJmM3dpcmVPZmZzZXQsIGJNYXNrRFdvcmQsIChwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXTw8MTYpICk7CisKKwkJCU5ld09mZnNldCA9IE9mZnNldCAtIDE1OworCQl9CisJCWVsc2UKKwkJCU5ld09mZnNldCA9IE9mZnNldDsKKwl9CisJZWxzZQorCXsKKwkJUlRfVFJBQ0UoKENPTVBfUEhZfENPTVBfRVJSKSwgImNoZWNrIFJGIHR5cGUgaGVyZSwgbmVlZCB0byBiZSA4MjU2XG4iKTsKKwkJTmV3T2Zmc2V0ID0gT2Zmc2V0OworCX0KKwkvL3B1dCBkZXNpcmVkIHJlYWQgYWRkciB0byBMU1NJIGNvbnRyb2wgUmVnaXN0ZXIKKwlydGw4MTkyX3NldEJCcmVnKGRldiwgcFBoeVJlZy0+cmZIU1NJUGFyYTIsIGJMU1NJUmVhZEFkZHJlc3MsIE5ld09mZnNldCk7CisJLy9Jc3N1ZSBhIHBvc2VkZ2UgdHJpZ2dlcgorCS8vCisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHBQaHlSZWctPnJmSFNTSVBhcmEyLCAgYkxTU0lSZWFkRWRnZSwgMHgwKTsKKwlydGw4MTkyX3NldEJCcmVnKGRldiwgcFBoeVJlZy0+cmZIU1NJUGFyYTIsICBiTFNTSVJlYWRFZGdlLCAweDEpOworCisKKwkvLyBUT0RPOiB3ZSBzaG91bGQgbm90IGRlbGF5IHN1Y2ggYSAgbG9uZyB0aW1lLiBBc2sgaGVscCBmcm9tIFNEMworCW1zbGVlcCgxKTsKKworCXJldCA9IHJ0bDgxOTJfUXVlcnlCQlJlZyhkZXYsIHBQaHlSZWctPnJmTFNTSVJlYWRCYWNrLCBiTFNTSVJlYWRCYWNrRGF0YSk7CisKKworCS8vIFN3aXRjaCBiYWNrIHRvIFJlZ19Nb2RlMDsKKwlpZihwcml2LT5yZl9jaGlwID09IFJGXzgyNTYpCisJeworCQlwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXSAmPSAweGViZjsKKworCQlydGw4MTkyX3NldEJCcmVnKAorCQkJZGV2LAorCQkJcFBoeVJlZy0+cmYzd2lyZU9mZnNldCwKKwkJCWJNYXNrRFdvcmQsCisJCQkocHJpdi0+UmZSZWcwVmFsdWVbZVJGUGF0aF0gPDwgMTYpKTsKKwl9CisKKwlyZXR1cm4gcmV0OworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIHdyaXRlIGRhdGEgdG8gUkYgcmVnaXN0ZXIKKyAqICAgaW5wdXQ6ICBuZXRfZGV2aWNlIGRldgorICogICAJICAgICBSRjkwX1JBRElPX1BBVEhfRSBlUkZQYXRoIC8vcmFkaW8gcGF0aCBvZiBBL0IvQy9ECisgKiAgICAgICAgICAgdTMyCU9mZnNldCAgICAgLy90YXJnZXQgYWRkcmVzcyB0byBiZSB3cml0dGVuCisgKiAgICAgICAgICAgdTMyCURhdGEJLy9UaGUgbmV3IHJlZ2lzdGVyIGRhdGEgdG8gYmUgd3JpdHRlbgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgbm90aWNlOiAgRm9yIFJGODI1NiBvbmx5LgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICpSZWcgTW9kZQlSZWdDVExbMV0JUmVnQ1RMWzBdCQlOb3RlCisgKgkJKFJlZzAwWzEyXSkJKFJlZzAwWzEwXSkKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqUmVnX01vZGUwCTAJCXgJCQlSZWcgMCB+MTUoMHgwIH4gMHhmKQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqUmVnX01vZGUxCTEJCTAJCQlSZWcgMTYgfjMwKDB4MSB+IDB4ZikKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZWdfTW9kZTIJMQkJMQkJCVJlZyAzMSB+IDQ1KDB4MSB+IDB4ZikKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBydGw4MTkyX3BoeV9SRlNlcmlhbFdyaXRlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIFJGOTBfUkFESU9fUEFUSF9FIGVSRlBhdGgsIHUzMiBPZmZzZXQsIHUzMiBEYXRhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgRGF0YUFuZEFkZHIgPSAwLCBOZXdPZmZzZXQgPSAwOworCUJCX1JFR0lTVEVSX0RFRklOSVRJT05fVAkqcFBoeVJlZyA9ICZwcml2LT5QSFlSZWdEZWZbZVJGUGF0aF07CisKKwlPZmZzZXQgJj0gMHgzZjsKKwkvL3NwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yZl9sb2NrLCBmbGFncyk7CisvLwlkb3duKCZwcml2LT5yZl9zZW0pOworCWlmIChwcml2LT5yZl9jaGlwID09IFJGXzgyNTYpCisJeworCisJCWlmIChPZmZzZXQgPj0gMzEpCisJCXsKKwkJCXByaXYtPlJmUmVnMFZhbHVlW2VSRlBhdGhdIHw9IDB4MTQwOworCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHBQaHlSZWctPnJmM3dpcmVPZmZzZXQsIGJNYXNrRFdvcmQsIChwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXSA8PCAxNikpOworCQkJTmV3T2Zmc2V0ID0gT2Zmc2V0IC0gMzA7CisJCX0KKwkJZWxzZSBpZiAoT2Zmc2V0ID49IDE2KQorCQl7CisJCQlwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXSB8PSAweDEwMDsKKwkJCXByaXYtPlJmUmVnMFZhbHVlW2VSRlBhdGhdICY9ICh+MHg0MCk7CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgcFBoeVJlZy0+cmYzd2lyZU9mZnNldCwgYk1hc2tEV29yZCwgKHByaXYtPlJmUmVnMFZhbHVlW2VSRlBhdGhdPDwxNikpOworCQkJTmV3T2Zmc2V0ID0gT2Zmc2V0IC0gMTU7CisJCX0KKwkJZWxzZQorCQkJTmV3T2Zmc2V0ID0gT2Zmc2V0OworCX0KKwllbHNlCisJeworCQlSVF9UUkFDRSgoQ09NUF9QSFl8Q09NUF9FUlIpLCAiY2hlY2sgUkYgdHlwZSBoZXJlLCBuZWVkIHRvIGJlIDgyNTZcbiIpOworCQlOZXdPZmZzZXQgPSBPZmZzZXQ7CisJfQorCisJLy8gUHV0IHdyaXRlIGFkZHIgaW4gWzU6MF0gIGFuZCB3cml0ZSBkYXRhIGluIFszMToxNl0KKwlEYXRhQW5kQWRkciA9IChEYXRhPDwxNikgfCAoTmV3T2Zmc2V0JjB4M2YpOworCisJLy8gV3JpdGUgT3BlcmF0aW9uCisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHBQaHlSZWctPnJmM3dpcmVPZmZzZXQsIGJNYXNrRFdvcmQsIERhdGFBbmRBZGRyKTsKKworCisJaWYoT2Zmc2V0PT0weDApCisJCXByaXYtPlJmUmVnMFZhbHVlW2VSRlBhdGhdID0gRGF0YTsKKworCS8vIFN3aXRjaCBiYWNrIHRvIFJlZ19Nb2RlMDsKKwlpZihwcml2LT5yZl9jaGlwID09IFJGXzgyNTYpCisJeworCQlpZihPZmZzZXQgIT0gMCkKKwkJeworCQkJcHJpdi0+UmZSZWcwVmFsdWVbZVJGUGF0aF0gJj0gMHhlYmY7CisJCQlydGw4MTkyX3NldEJCcmVnKAorCQkJCWRldiwKKwkJCQlwUGh5UmVnLT5yZjN3aXJlT2Zmc2V0LAorCQkJCWJNYXNrRFdvcmQsCisJCQkJKHByaXYtPlJmUmVnMFZhbHVlW2VSRlBhdGhdIDw8IDE2KSk7CisJCX0KKwl9CisJLy9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZl9sb2NrLCBmbGFncyk7CisvLwl1cCgmcHJpdi0+cmZfc2VtKTsKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIHNldCBzcGVjaWZpYyBiaXRzIHRvIFJGIHJlZ2lzdGVyCisgKiAgIGlucHV0OiAgbmV0X2RldmljZSBkZXYKKyAqICAgCSAgICAgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCAvL3JhZGlvIHBhdGggb2YgQS9CL0MvRAorICogICAgICAgICAgIHUzMglSZWdBZGRyICAvL3RhcmdldCBhZGRyIHRvIGJlIG1vZGlmaWVkCisgKiAgICAgICAgICAgdTMyCUJpdE1hc2sgIC8vdGFnZXQgYml0IHBvcyBpbiB0aGUgYWRkciB0byBiZSBtb2RpZmllZAorICogICAgICAgICAgIHUzMglEYXRhICAgICAvL3ZhbHVlIHRvIGJlIHdyaXRlCisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIG5vbmUKKyAqICBub3RpY2U6CisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBydGw4MTkyX3BoeV9TZXRSRlJlZyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCBSRjkwX1JBRElPX1BBVEhfRSBlUkZQYXRoLCB1MzIgUmVnQWRkciwgdTMyIEJpdE1hc2ssIHUzMiBEYXRhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgT3JpZ2luYWxfVmFsdWUsIEJpdFNoaWZ0LCBOZXdfVmFsdWU7CisvLwl1OAl0aW1lID0gMDsKKworCWlmICghcnRsODE5Ml9waHlfQ2hlY2tJc0xlZ2FsUkZQYXRoKGRldiwgZVJGUGF0aCkpCisJCXJldHVybjsKKworCWlmIChwcml2LT5SZl9Nb2RlID09IFJGX09QX0J5X0ZXKQorCXsKKwkJaWYgKEJpdE1hc2sgIT0gYk1hc2sxMkJpdHMpIC8vIFJGIGRhdGEgaXMgMTIgYml0cyBvbmx5CisJCXsKKwkJCU9yaWdpbmFsX1ZhbHVlID0gcGh5X0Z3UkZTZXJpYWxSZWFkKGRldiwgZVJGUGF0aCwgUmVnQWRkcik7CisJCQlCaXRTaGlmdCA9ICBydGw4MTkyX0NhbGN1bGF0ZUJpdFNoaWZ0KEJpdE1hc2spOworCQkJTmV3X1ZhbHVlID0gKChPcmlnaW5hbF9WYWx1ZSkgJiAofkJpdE1hc2spKSB8IChEYXRhPDwgQml0U2hpZnQpOworCisJCQlwaHlfRndSRlNlcmlhbFdyaXRlKGRldiwgZVJGUGF0aCwgUmVnQWRkciwgTmV3X1ZhbHVlKTsKKwkJfWVsc2UKKwkJCXBoeV9Gd1JGU2VyaWFsV3JpdGUoZGV2LCBlUkZQYXRoLCBSZWdBZGRyLCBEYXRhKTsKKworCQl1ZGVsYXkoMjAwKTsKKworCX0KKwllbHNlCisJeworCQlpZiAoQml0TWFzayAhPSBiTWFzazEyQml0cykgLy8gUkYgZGF0YSBpcyAxMiBiaXRzIG9ubHkKKwkJeworCQkJT3JpZ2luYWxfVmFsdWUgPSBydGw4MTkyX3BoeV9SRlNlcmlhbFJlYWQoZGV2LCBlUkZQYXRoLCBSZWdBZGRyKTsKKwkJCUJpdFNoaWZ0ID0gIHJ0bDgxOTJfQ2FsY3VsYXRlQml0U2hpZnQoQml0TWFzayk7CisJCQlOZXdfVmFsdWUgPSAoKChPcmlnaW5hbF9WYWx1ZSkgJiAofkJpdE1hc2spKSB8IChEYXRhPDwgQml0U2hpZnQpKTsKKworCQkJcnRsODE5Ml9waHlfUkZTZXJpYWxXcml0ZShkZXYsIGVSRlBhdGgsIFJlZ0FkZHIsIE5ld19WYWx1ZSk7CisJCX1lbHNlCisJCQlydGw4MTkyX3BoeV9SRlNlcmlhbFdyaXRlKGRldiwgZVJGUGF0aCwgUmVnQWRkciwgRGF0YSk7CisJfQorCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gcmVhZHMgc3BlY2lmaWMgYml0cyBmcm9tIFJGIHJlZ2lzdGVyCisgKiAgIGlucHV0OiAgbmV0X2RldmljZSBkZXYKKyAqICAgICAgICAgICB1MzIJUmVnQWRkciAgLy90YXJnZXQgYWRkciB0byBiZSByZWFkYmFjaworICogICAgICAgICAgIHUzMglCaXRNYXNrICAvL3RhZ2V0IGJpdCBwb3MgaW4gdGhlIGFkZHIgdG8gYmUgcmVhZGJhY2sKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgdTMyCURhdGEJLy90aGUgcmVhZGJhY2sgcmVnaXN0ZXIgdmFsdWUKKyAqICBub3RpY2U6CisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHJ0bDgxOTJfcGh5X1F1ZXJ5UkZSZWcoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCwgdTMyIFJlZ0FkZHIsIHUzMiBCaXRNYXNrKQoreworCXUzMiBPcmlnaW5hbF9WYWx1ZSwgUmVhZGJhY2tfVmFsdWUsIEJpdFNoaWZ0OworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCisJaWYgKCFydGw4MTkyX3BoeV9DaGVja0lzTGVnYWxSRlBhdGgoZGV2LCBlUkZQYXRoKSkKKwkJcmV0dXJuIDA7CisJaWYgKHByaXYtPlJmX01vZGUgPT0gUkZfT1BfQnlfRlcpCisJeworCQlPcmlnaW5hbF9WYWx1ZSA9IHBoeV9Gd1JGU2VyaWFsUmVhZChkZXYsIGVSRlBhdGgsIFJlZ0FkZHIpOworCQlCaXRTaGlmdCA9ICBydGw4MTkyX0NhbGN1bGF0ZUJpdFNoaWZ0KEJpdE1hc2spOworCQlSZWFkYmFja19WYWx1ZSA9IChPcmlnaW5hbF9WYWx1ZSAmIEJpdE1hc2spID4+IEJpdFNoaWZ0OworCQl1ZGVsYXkoMjAwKTsKKwkJcmV0dXJuIChSZWFkYmFja19WYWx1ZSk7CisJfQorCWVsc2UKKwl7CisJCU9yaWdpbmFsX1ZhbHVlID0gcnRsODE5Ml9waHlfUkZTZXJpYWxSZWFkKGRldiwgZVJGUGF0aCwgUmVnQWRkcik7CisJCUJpdFNoaWZ0ID0gIHJ0bDgxOTJfQ2FsY3VsYXRlQml0U2hpZnQoQml0TWFzayk7CisJCVJlYWRiYWNrX1ZhbHVlID0gKE9yaWdpbmFsX1ZhbHVlICYgQml0TWFzaykgPj4gQml0U2hpZnQ7CisJCXJldHVybiAoUmVhZGJhY2tfVmFsdWUpOworCX0KK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBXZSBzdXBwb3J0IGZpcm13YXJlIHRvIGV4ZWN1dGUgUkYtUi9XLgorICogICBpbnB1dDogIGRldgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgbm90aWNlOgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljCXUzMgorcGh5X0Z3UkZTZXJpYWxSZWFkKAorCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJUkY5MF9SQURJT19QQVRIX0UJZVJGUGF0aCwKKwl1MzIJCQkJT2Zmc2V0CSkKK3sKKwl1MzIJCXJldFZhbHVlID0gMDsKKwl1MzIJCURhdGEgPSAwOworCXU4CQl0aW1lID0gMDsKKwkvL0RiZ1ByaW50KCJGVyBSRiBDVFJMXG5cciIpOworCS8qIDIwMDcvMTEvMDIgTUggRmlybXdhcmUgUkYgV3JpdGUgY29udHJvbC4gQnkgRnJhbmNpcycgc3VnZ2VzdGlvbiwgd2UgY2FuCisJICAgbm90IGV4ZWN1dGUgdGhlIHNjaGVtZSBpbiB0aGUgaW5pdGlhbCBzdGVwLiBPdGhlcndpc2UsIFJGLVIvVyB3aWxsIHdhc3RlCisJICAgbXVjaCB0aW1lLiBUaGlzIGlzIG9ubHkgZm9yIHNpdGUgc3VydmV5LiAqLworCS8vIDEuIFJlYWQgb3BlcmF0aW9uIG5lZWQgbm90IGluc2VydCBkYXRhLiBiaXQgMC0xMQorCS8vRGF0YSAmPSBiTWFzazEyQml0czsKKwkvLyAyLiBXcml0ZSBSRiByZWdpc3RlciBhZGRyZXNzLiBCaXQgMTItMTkKKwlEYXRhIHw9ICgoT2Zmc2V0JjB4RkYpPDwxMik7CisJLy8gMy4gV3JpdGUgUkYgcGF0aC4gIGJpdCAyMC0yMQorCURhdGEgfD0gKChlUkZQYXRoJjB4Myk8PDIwKTsKKwkvLyA0LiBTZXQgUkYgcmVhZCBpbmRpY2F0b3IuIGJpdCAyMj0wCisJLy9EYXRhIHw9IDB4MDAwMDA7CisJLy8gNS4gVHJpZ2dlciBGdyB0byBvcGVyYXRlIHRoZSBjb21tYW5kLiBiaXQgMzEKKwlEYXRhIHw9IDB4ODAwMDAwMDA7CisJLy8gNi4gV2UgY2FuIG5vdCBleGVjdXRlIHJlYWQgb3BlcmF0aW9uIGlmIGJpdCAzMSBpcyAxLgorCXdoaWxlIChyZWFkX25pY19kd29yZChkZXYsIFFQTlIpJjB4ODAwMDAwMDApCisJeworCQkvLyBJZiBGVyBjYW4gbm90IGZpbmlzaCBSRi1SL1cgZm9yIG1vcmUgdGhhbiA/PyB0aW1lcy4gV2UgbXVzdCByZXNldCBGVy4KKwkJaWYgKHRpbWUrKyA8IDEwMCkKKwkJeworCQkJLy9EYmdQcmludCgiRlcgbm90IGZpbmlzaCBSRi1SIFRpbWU9JWRcblxyIiwgdGltZSk7CisJCQl1ZGVsYXkoMTApOworCQl9CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKwkvLyA3LiBFeGVjdXRlIHJlYWQgb3BlcmF0aW9uLgorCXdyaXRlX25pY19kd29yZChkZXYsIFFQTlIsIERhdGEpOworCS8vIDguIENoZWNrIGlmIGZpcm1hd3JlIHNlbmQgYmFjayBSRiBjb250ZW50LgorCXdoaWxlIChyZWFkX25pY19kd29yZChkZXYsIFFQTlIpJjB4ODAwMDAwMDApCisJeworCQkvLyBJZiBGVyBjYW4gbm90IGZpbmlzaCBSRi1SL1cgZm9yIG1vcmUgdGhhbiA/PyB0aW1lcy4gV2UgbXVzdCByZXNldCBGVy4KKwkJaWYgKHRpbWUrKyA8IDEwMCkKKwkJeworCQkJLy9EYmdQcmludCgiRlcgbm90IGZpbmlzaCBSRi1XIFRpbWU9JWRcblxyIiwgdGltZSk7CisJCQl1ZGVsYXkoMTApOworCQl9CisJCWVsc2UKKwkJCXJldHVybgkoMCk7CisJfQorCXJldFZhbHVlID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBSRl9EQVRBKTsKKworCXJldHVybgkocmV0VmFsdWUpOworCit9CS8qIHBoeV9Gd1JGU2VyaWFsUmVhZCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgV2Ugc3VwcG9ydCBmaXJtd2FyZSB0byBleGVjdXRlIFJGLVIvVy4KKyAqICAgaW5wdXQ6ICBkZXYKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgbm9uZQorICogIG5vdGljZToKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitwaHlfRndSRlNlcmlhbFdyaXRlKAorCQlzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorCQlSRjkwX1JBRElPX1BBVEhfRQllUkZQYXRoLAorCQl1MzIJCQkJT2Zmc2V0LAorCQl1MzIJCQkJRGF0YQkpCit7CisJdTgJdGltZSA9IDA7CisKKwkvL0RiZ1ByaW50KCJOIEZXIFJGIENUUkwgUkYtJWQgT0YlMDJ4IERBVEE9JTAzeFxuXHIiLCBlUkZQYXRoLCBPZmZzZXQsIERhdGEpOworCS8qIDIwMDcvMTEvMDIgTUggRmlybXdhcmUgUkYgV3JpdGUgY29udHJvbC4gQnkgRnJhbmNpcycgc3VnZ2VzdGlvbiwgd2UgY2FuCisJICAgbm90IGV4ZWN1dGUgdGhlIHNjaGVtZSBpbiB0aGUgaW5pdGlhbCBzdGVwLiBPdGhlcndpc2UsIFJGLVIvVyB3aWxsIHdhc3RlCisJICAgbXVjaCB0aW1lLiBUaGlzIGlzIG9ubHkgZm9yIHNpdGUgc3VydmV5LiAqLworCisJLy8gMS4gU2V0IGRyaXZlciB3cml0ZSBiaXQgYW5kIDEyIGJpdCBkYXRhLiBiaXQgMC0xMQorCS8vRGF0YSAmPSBiTWFzazEyQml0czsJLy8gRG9uZSBieSB1cGVyIGxheWVyLgorCS8vIDIuIFdyaXRlIFJGIHJlZ2lzdGVyIGFkZHJlc3MuIGJpdCAxMi0xOQorCURhdGEgfD0gKChPZmZzZXQmMHhGRik8PDEyKTsKKwkvLyAzLiBXcml0ZSBSRiBwYXRoLiAgYml0IDIwLTIxCisJRGF0YSB8PSAoKGVSRlBhdGgmMHgzKTw8MjApOworCS8vIDQuIFNldCBSRiB3cml0ZSBpbmRpY2F0b3IuIGJpdCAyMj0xCisJRGF0YSB8PSAweDQwMDAwMDsKKwkvLyA1LiBUcmlnZ2VyIEZ3IHRvIG9wZXJhdGUgdGhlIGNvbW1hbmQuIGJpdCAzMT0xCisJRGF0YSB8PSAweDgwMDAwMDAwOworCisJLy8gNi4gV3JpdGUgb3BlcmF0aW9uLiBXZSBjYW4gbm90IHdyaXRlIGlmIGJpdCAzMSBpcyAxLgorCXdoaWxlIChyZWFkX25pY19kd29yZChkZXYsIFFQTlIpJjB4ODAwMDAwMDApCisJeworCQkvLyBJZiBGVyBjYW4gbm90IGZpbmlzaCBSRi1SL1cgZm9yIG1vcmUgdGhhbiA/PyB0aW1lcy4gV2UgbXVzdCByZXNldCBGVy4KKwkJaWYgKHRpbWUrKyA8IDEwMCkKKwkJeworCQkJLy9EYmdQcmludCgiRlcgbm90IGZpbmlzaCBSRi1XIFRpbWU9JWRcblxyIiwgdGltZSk7CisJCQl1ZGVsYXkoMTApOworCQl9CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKwkvLyA3LiBObyBtYXR0ZXIgY2hlY2sgYml0LiBXZSBhbHdheXMgZm9yY2UgdGhlIHdyaXRlLiBCZWNhdXNlIEZXIHdpbGwKKwkvLyAgICBub3QgYWNjZXB0IHRoZSBjb21tYW5kLgorCXdyaXRlX25pY19kd29yZChkZXYsIFFQTlIsIERhdGEpOworCS8qIDIwMDcvMTEvMDIgTUggQWNvb3JkaW5nIHRvIHRlc3QsIHdlIG11c3QgZGVsYXkgMjB1cyB0byB3YWl0IGZpcm13YXJlCisJICAgdG8gZmluaXNoIFJGIHdyaXRlIG9wZXJhdGlvbi4gKi8KKwkvKiAyMDA4LzAxLzE3IE1IIFdlIHN1cHBvcnQgZGVsYXkgaW4gZmlybXdhcmUgc2lkZSBub3cuICovCisJLy9kZWxheV91cygyMCk7CisKK30JLyogcGh5X0Z3UkZTZXJpYWxXcml0ZSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIHJlYWQgQkIgcGFyYW1ldGVycyBmcm9tIEhlYWRlciBmaWxlIHdlIGdlbiwKKyAqCSAgICAgYW5kIGRvIHJlZ2lzdGVyIHJlYWQvd3JpdGUKKyAqICAgaW5wdXQ6ICBkZXYKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgbm9uZQorICogIG5vdGljZTogIEJCIHBhcmFtZXRlcnMgbWF5IGNoYW5nZSBhbGwgdGhlIHRpbWUsIHNvIHBsZWFzZSBtYWtlCisgKiAgICAgICAgICAgc3VyZSBpdCBoYXMgYmVlbiBzeW5jZWQgd2l0aCB0aGUgbmV3ZXN0LgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBydGw4MTkyX3BoeV9jb25maWdtYWMoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwl1MzIgZHdBcnJheUxlbiA9IDAsIGk7CisJdTMyKiBwZHdBcnJheSA9IE5VTEw7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJaWYocHJpdi0+YnR4cG93ZXJkYXRhX3JlYWRmcm9tRUVQT1JNKQorCXsKKwkJUlRfVFJBQ0UoQ09NUF9QSFksICJSdGw4MTlYTUFDUEhZX0FycmF5X1BHXG4iKTsKKwkJZHdBcnJheUxlbiA9IE1BQ1BIWV9BcnJheV9QR0xlbmd0aDsKKwkJcGR3QXJyYXkgPSBydGw4MTlYTUFDUEhZX0FycmF5X1BHOworCisJfQorCWVsc2UKKwl7CisJCVJUX1RSQUNFKENPTVBfUEhZLCAiUnRsODE5WE1BQ1BIWV9BcnJheVxuIik7CisJCWR3QXJyYXlMZW4gPSBNQUNQSFlfQXJyYXlMZW5ndGg7CisJCXBkd0FycmF5ID0gcnRsODE5WE1BQ1BIWV9BcnJheTsKKwl9CisJZm9yKGkgPSAwOyBpPGR3QXJyYXlMZW47IGk9aSszKXsKKwkJaWYocGR3QXJyYXlbaV0gPT0gMHgzMTgpCisJCXsKKwkJCXBkd0FycmF5W2krMl0gPSAweDAwMDAwODAwOworCQkJLy9EYmdQcmludCgicHRyQXJyYXlbaV0sIHB0ckFycmF5W2krMV0sIHB0ckFycmF5W2krMl0gPSAleCwgJXgsICV4XG4iLAorCQkJLy8JcHRyQXJyYXlbaV0sIHB0ckFycmF5W2krMV0sIHB0ckFycmF5W2krMl0pOworCQl9CisKKwkJUlRfVFJBQ0UoQ09NUF9EQkcsICJUaGUgUnRsODE5ME1BQ1BIWV9BcnJheVswXSBpcyAleCBSdGw4MTkwTUFDUEhZX0FycmF5WzFdIGlzICV4IFJ0bDgxOTBNQUNQSFlfQXJyYXlbMl0gaXMgJXhcbiIsCisJCQkJcGR3QXJyYXlbaV0sIHBkd0FycmF5W2krMV0sIHBkd0FycmF5W2krMl0pOworCQlydGw4MTkyX3NldEJCcmVnKGRldiwgcGR3QXJyYXlbaV0sIHBkd0FycmF5W2krMV0sIHBkd0FycmF5W2krMl0pOworCX0KKwlyZXR1cm47CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gZG8gZGlydHkgd29yaworICogICBpbnB1dDogIGRldgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgbm90aWNlOiAgQkIgcGFyYW1ldGVycyBtYXkgY2hhbmdlIGFsbCB0aGUgdGltZSwgc28gcGxlYXNlIG1ha2UKKyAqICAgICAgICAgICBzdXJlIGl0IGhhcyBiZWVuIHN5bmNlZCB3aXRoIHRoZSBuZXdlc3QuCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgcnRsODE5Ml9waHlDb25maWdCQihzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1OCBDb25maWdUeXBlKQoreworCXUzMiBpOworCisjaWZkZWYgVE9fRE9fTElTVAorCXUzMiAqcnRsODE5MlBoeVJlZ0FycmF5VGFibGUgPSBOVUxMLCAqcnRsODE5MkFnY1RhYkFycmF5VGFibGUgPSBOVUxMOworCWlmKEFkYXB0ZXItPmJJbkhjdFRlc3QpCisJeworCQlQSFlfUkVHQXJyYXlMZW4gPSBQSFlfUkVHQXJyYXlMZW5ndGhEVE07CisJCUFHQ1RBQl9BcnJheUxlbiA9IEFHQ1RBQl9BcnJheUxlbmd0aERUTTsKKwkJUnRsODE5MFBIWV9SRUdBcnJheV9UYWJsZSA9IFJ0bDgxOVhQSFlfUkVHQXJyYXlEVE07CisJCVJ0bDgxOTBBR0NUQUJfQXJyYXlfVGFibGUgPSBSdGw4MTlYQUdDVEFCX0FycmF5RFRNOworCX0KKyNlbmRpZgorCWlmIChDb25maWdUeXBlID09IEJhc2VCYW5kX0NvbmZpZ19QSFlfUkVHKQorCXsKKwkJZm9yIChpPTA7IGk8UEhZX1JFR18xVDJSQXJyYXlMZW5ndGg7IGkrPTIpCisJCXsKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBydGw4MTlYUEhZX1JFR18xVDJSQXJyYXlbaV0sIGJNYXNrRFdvcmQsIHJ0bDgxOVhQSFlfUkVHXzFUMlJBcnJheVtpKzFdKTsKKwkJCVJUX1RSQUNFKENPTVBfREJHLCAiaTogJXgsIFRoZSBSdGw4MTl4VXNiUEhZX1JFR0FycmF5WzBdIGlzICV4IFJ0bDgxOXhVc2JQSFlfUkVHQXJyYXlbMV0gaXMgJXggXG4iLGksIHJ0bDgxOVhQSFlfUkVHXzFUMlJBcnJheVtpXSwgcnRsODE5WFBIWV9SRUdfMVQyUkFycmF5W2krMV0pOworCQl9CisJfQorCWVsc2UgaWYgKENvbmZpZ1R5cGUgPT0gQmFzZUJhbmRfQ29uZmlnX0FHQ19UQUIpCisJeworCQlmb3IgKGk9MDsgaTxBR0NUQUJfQXJyYXlMZW5ndGg7IGkrPTIpCisJCXsKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBydGw4MTlYQUdDVEFCX0FycmF5W2ldLCBiTWFza0RXb3JkLCBydGw4MTlYQUdDVEFCX0FycmF5W2krMV0pOworCQkJUlRfVFJBQ0UoQ09NUF9EQkcsICJpOiV4LCBUaGUgcnRsODE5WEFHQ1RBQl9BcnJheVswXSBpcyAleCBydGw4MTlYQUdDVEFCX0FycmF5WzFdIGlzICV4IFxuIixpLCBydGw4MTlYQUdDVEFCX0FycmF5W2ldLCBydGw4MTlYQUdDVEFCX0FycmF5W2krMV0pOworCQl9CisJfQorCXJldHVybjsKKworCit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplIFJlZ2lzdGVyIGRlZmluaXRpb24gb2Zmc2V0IGZvciBSYWRpbyBQYXRoCisgKgkgICAgIEEvQi9DL0QKKyAqICAgaW5wdXQ6ICBuZXRfZGV2aWNlIGRldgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgbm90aWNlOiAgSW5pdGlhbGl6YXRpb24gdmFsdWUgaGVyZSBpcyBjb25zdGFudCBhbmQgaXQgc2hvdWxkIG5ldmVyIGJlIGNoYW5nZWQKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcnRsODE5Ml9Jbml0QkJSRlJlZ0RlZihzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKy8vIFJGIEludGVyZmFjZSBTb3dydHdhcmUgQ29udHJvbAorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmZpbnRmcyA9IHJGUEdBMF9YQUJfUkZJbnRlcmZhY2VTVzsgLy8gMTYgTFNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4ODcwCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZmludGZzID0gckZQR0EwX1hBQl9SRkludGVyZmFjZVNXOyAvLyAxNiBNU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NzAgKDE2LWJpdCBmb3IgMHg4NzIpCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZmludGZzID0gckZQR0EwX1hDRF9SRkludGVyZmFjZVNXOy8vIDE2IExTQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDg3NAorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfRF0ucmZpbnRmcyA9IHJGUEdBMF9YQ0RfUkZJbnRlcmZhY2VTVzsvLyAxNiBNU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NzQgKDE2LWJpdCBmb3IgMHg4NzYpCisKKwkvLyBSRiBJbnRlcmZhY2UgUmVhZGJhY2sgVmFsdWUKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0FdLnJmaW50ZmkgPSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlUkI7IC8vIDE2IExTQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDhFMAorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmZpbnRmaSA9IHJGUEdBMF9YQUJfUkZJbnRlcmZhY2VSQjsvLyAxNiBNU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4RTAgKDE2LWJpdCBmb3IgMHg4RTIpCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZmludGZpID0gckZQR0EwX1hDRF9SRkludGVyZmFjZVJCOy8vIDE2IExTQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDhFNAorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfRF0ucmZpbnRmaSA9IHJGUEdBMF9YQ0RfUkZJbnRlcmZhY2VSQjsvLyAxNiBNU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4RTQgKDE2LWJpdCBmb3IgMHg4RTYpCisKKwkvLyBSRiBJbnRlcmZhY2UgT3V0cHV0IChhbmQgRW5hYmxlKQorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmZpbnRmbyA9IHJGUEdBMF9YQV9SRkludGVyZmFjZU9FOyAvLyAxNiBMU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NjAKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0JdLnJmaW50Zm8gPSByRlBHQTBfWEJfUkZJbnRlcmZhY2VPRTsgLy8gMTYgTFNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4ODY0CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZmludGZvID0gckZQR0EwX1hDX1JGSW50ZXJmYWNlT0U7Ly8gMTYgTFNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4ODY4CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZmludGZvID0gckZQR0EwX1hEX1JGSW50ZXJmYWNlT0U7Ly8gMTYgTFNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4ODZDCisKKwkvLyBSRiBJbnRlcmZhY2UgKE91dHB1dCBhbmQpICBFbmFibGUKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0FdLnJmaW50ZmUgPSByRlBHQTBfWEFfUkZJbnRlcmZhY2VPRTsgLy8gMTYgTVNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4ODYwICgxNi1iaXQgZm9yIDB4ODYyKQorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmZpbnRmZSA9IHJGUEdBMF9YQl9SRkludGVyZmFjZU9FOyAvLyAxNiBNU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NjQgKDE2LWJpdCBmb3IgMHg4NjYpCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZmludGZlID0gckZQR0EwX1hDX1JGSW50ZXJmYWNlT0U7Ly8gMTYgTVNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4ODZBICgxNi1iaXQgZm9yIDB4ODZBKQorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfRF0ucmZpbnRmZSA9IHJGUEdBMF9YRF9SRkludGVyZmFjZU9FOy8vIDE2IE1TQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDg2QyAoMTYtYml0IGZvciAweDg2RSkKKworCS8vQWRkciBvZiBMU1NJLiBXaXJ0ZSBSRiByZWdpc3RlciBieSBkcml2ZXIKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0FdLnJmM3dpcmVPZmZzZXQgPSByRlBHQTBfWEFfTFNTSVBhcmFtZXRlcjsgLy9MU1NJIFBhcmFtZXRlcgorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmYzd2lyZU9mZnNldCA9IHJGUEdBMF9YQl9MU1NJUGFyYW1ldGVyOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQ10ucmYzd2lyZU9mZnNldCA9IHJGUEdBMF9YQ19MU1NJUGFyYW1ldGVyOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfRF0ucmYzd2lyZU9mZnNldCA9IHJGUEdBMF9YRF9MU1NJUGFyYW1ldGVyOworCisJLy8gUkYgcGFyYW1ldGVyCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZkxTU0lfU2VsZWN0ID0gckZQR0EwX1hBQl9SRlBhcmFtZXRlcjsgIC8vQkIgQmFuZCBTZWxlY3QKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0JdLnJmTFNTSV9TZWxlY3QgPSByRlBHQTBfWEFCX1JGUGFyYW1ldGVyOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQ10ucmZMU1NJX1NlbGVjdCA9IHJGUEdBMF9YQ0RfUkZQYXJhbWV0ZXI7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZkxTU0lfU2VsZWN0ID0gckZQR0EwX1hDRF9SRlBhcmFtZXRlcjsKKworCS8vIFR4IEFHQyBHYWluIFN0YWdlIChzYW1lIGZvciBhbGwgcGF0aC4gU2hvdWxkIHdlIHJlbW92ZSB0aGlzPykKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0FdLnJmVHhHYWluU3RhZ2UgPSByRlBHQTBfVHhHYWluU3RhZ2U7IC8vVHggZ2FpbiBzdGFnZQorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmZUeEdhaW5TdGFnZSA9IHJGUEdBMF9UeEdhaW5TdGFnZTsgLy9UeCBnYWluIHN0YWdlCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZlR4R2FpblN0YWdlID0gckZQR0EwX1R4R2FpblN0YWdlOyAvL1R4IGdhaW4gc3RhZ2UKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0RdLnJmVHhHYWluU3RhZ2UgPSByRlBHQTBfVHhHYWluU3RhZ2U7IC8vVHggZ2FpbiBzdGFnZQorCisJLy8gVHJhbmNlaXZlciBBfkQgSFNTSSBQYXJhbWV0ZXItMQorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmZIU1NJUGFyYTEgPSByRlBHQTBfWEFfSFNTSVBhcmFtZXRlcjE7ICAvL3dpcmUgY29udHJvbCBwYXJhbWV0ZXIxCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZkhTU0lQYXJhMSA9IHJGUEdBMF9YQl9IU1NJUGFyYW1ldGVyMTsgIC8vd2lyZSBjb250cm9sIHBhcmFtZXRlcjEKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmSFNTSVBhcmExID0gckZQR0EwX1hDX0hTU0lQYXJhbWV0ZXIxOyAgLy93aXJlIGNvbnRyb2wgcGFyYW1ldGVyMQorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfRF0ucmZIU1NJUGFyYTEgPSByRlBHQTBfWERfSFNTSVBhcmFtZXRlcjE7ICAvL3dpcmUgY29udHJvbCBwYXJhbWV0ZXIxCisKKwkvLyBUcmFuY2VpdmVyIEF+RCBIU1NJIFBhcmFtZXRlci0yCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZkhTU0lQYXJhMiA9IHJGUEdBMF9YQV9IU1NJUGFyYW1ldGVyMjsgIC8vd2lyZSBjb250cm9sIHBhcmFtZXRlcjIKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0JdLnJmSFNTSVBhcmEyID0gckZQR0EwX1hCX0hTU0lQYXJhbWV0ZXIyOyAgLy93aXJlIGNvbnRyb2wgcGFyYW1ldGVyMgorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQ10ucmZIU1NJUGFyYTIgPSByRlBHQTBfWENfSFNTSVBhcmFtZXRlcjI7ICAvL3dpcmUgY29udHJvbCBwYXJhbWV0ZXIyCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZkhTU0lQYXJhMiA9IHJGUEdBMF9YRF9IU1NJUGFyYW1ldGVyMjsgIC8vd2lyZSBjb250cm9sIHBhcmFtZXRlcjEKKworCS8vIFJGIHN3aXRjaCBDb250cm9sCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZlN3aXRjaENvbnRyb2wgPSByRlBHQTBfWEFCX1N3aXRjaENvbnRyb2w7IC8vVFIvQW50IHN3aXRjaCBjb250cm9sCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZlN3aXRjaENvbnRyb2wgPSByRlBHQTBfWEFCX1N3aXRjaENvbnRyb2w7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZlN3aXRjaENvbnRyb2wgPSByRlBHQTBfWENEX1N3aXRjaENvbnRyb2w7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZlN3aXRjaENvbnRyb2wgPSByRlBHQTBfWENEX1N3aXRjaENvbnRyb2w7CisKKwkvLyBBR0MgY29udHJvbCAxCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZkFHQ0NvbnRyb2wxID0gck9GRE0wX1hBQUdDQ29yZTE7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZkFHQ0NvbnRyb2wxID0gck9GRE0wX1hCQUdDQ29yZTE7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZkFHQ0NvbnRyb2wxID0gck9GRE0wX1hDQUdDQ29yZTE7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZkFHQ0NvbnRyb2wxID0gck9GRE0wX1hEQUdDQ29yZTE7CisKKwkvLyBBR0MgY29udHJvbCAyCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZkFHQ0NvbnRyb2wyID0gck9GRE0wX1hBQUdDQ29yZTI7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZkFHQ0NvbnRyb2wyID0gck9GRE0wX1hCQUdDQ29yZTI7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZkFHQ0NvbnRyb2wyID0gck9GRE0wX1hDQUdDQ29yZTI7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZkFHQ0NvbnRyb2wyID0gck9GRE0wX1hEQUdDQ29yZTI7CisKKwkvLyBSWCBBRkUgY29udHJvbCAxCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZlJ4SVFJbWJhbGFuY2UgPSByT0ZETTBfWEFSeElRSW1iYWxhbmNlOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmZSeElRSW1iYWxhbmNlID0gck9GRE0wX1hCUnhJUUltYmFsYW5jZTsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmUnhJUUltYmFsYW5jZSA9IHJPRkRNMF9YQ1J4SVFJbWJhbGFuY2U7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZlJ4SVFJbWJhbGFuY2UgPSByT0ZETTBfWERSeElRSW1iYWxhbmNlOworCisJLy8gUlggQUZFIGNvbnRyb2wgMQorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmZSeEFGRSA9IHJPRkRNMF9YQVJ4QUZFOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmZSeEFGRSA9IHJPRkRNMF9YQlJ4QUZFOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQ10ucmZSeEFGRSA9IHJPRkRNMF9YQ1J4QUZFOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfRF0ucmZSeEFGRSA9IHJPRkRNMF9YRFJ4QUZFOworCisJLy8gVHggQUZFIGNvbnRyb2wgMQorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmZUeElRSW1iYWxhbmNlID0gck9GRE0wX1hBVHhJUUltYmFsYW5jZTsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0JdLnJmVHhJUUltYmFsYW5jZSA9IHJPRkRNMF9YQlR4SVFJbWJhbGFuY2U7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZlR4SVFJbWJhbGFuY2UgPSByT0ZETTBfWENUeElRSW1iYWxhbmNlOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfRF0ucmZUeElRSW1iYWxhbmNlID0gck9GRE0wX1hEVHhJUUltYmFsYW5jZTsKKworCS8vIFR4IEFGRSBjb250cm9sIDIKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0FdLnJmVHhBRkUgPSByT0ZETTBfWEFUeEFGRTsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0JdLnJmVHhBRkUgPSByT0ZETTBfWEJUeEFGRTsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmVHhBRkUgPSByT0ZETTBfWENUeEFGRTsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0RdLnJmVHhBRkUgPSByT0ZETTBfWERUeEFGRTsKKworCS8vIFRyYW5jZWl2ZXIgTFNTSSBSZWFkYmFjaworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmZMU1NJUmVhZEJhY2sgPSByRlBHQTBfWEFfTFNTSVJlYWRCYWNrOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmZMU1NJUmVhZEJhY2sgPSByRlBHQTBfWEJfTFNTSVJlYWRCYWNrOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQ10ucmZMU1NJUmVhZEJhY2sgPSByRlBHQTBfWENfTFNTSVJlYWRCYWNrOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfRF0ucmZMU1NJUmVhZEJhY2sgPSByRlBHQTBfWERfTFNTSVJlYWRCYWNrOworCit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBpcyB0byB3cml0ZSByZWdpc3RlciBhbmQgdGhlbiByZWFkYmFjayB0byBtYWtlIHN1cmUgd2hldGhlciBCQiBhbmQgUkYgaXMgT0sKKyAqICAgaW5wdXQ6ICBuZXRfZGV2aWNlIGRldgorICogICAJICAgICBIVzkwX0JMT0NLX0UgQ2hlY2tCbG9jaworICogICAJICAgICBSRjkwX1JBRElPX1BBVEhfRSBlUkZQYXRoICAvL29ubHkgdXNlZCB3aGVuIGNoZWNrYmxvY2sgaXMgSFc5MF9CTE9DS19SRgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICByZXR1cm4gd2hldGhlciBCQiBhbmQgUkYgaXMgb2soMDpPSzsgMTpGYWlsKQorICogIG5vdGljZTogIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHJlbW92ZWQgaW4gdGhlIEFTSUMKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IHJ0bDgxOTJfcGh5X2NoZWNrQkJBbmRSRihzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCBIVzkwX0JMT0NLX0UgQ2hlY2tCbG9jaywgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCkKK3sKKy8vCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKy8vCUJCX1JFR0lTVEVSX0RFRklOSVRJT05fVCAqcFBoeVJlZyA9ICZwcml2LT5QSFlSZWdEZWZbZVJGUGF0aF07CisJdTggcmV0ID0gMDsKKwl1MzIgaSwgQ2hlY2tUaW1lcyA9IDQsIGR3UmVnUmVhZCA9IDA7CisJdTMyIFdyaXRlQWRkcls0XTsKKwl1MzIgV3JpdGVEYXRhW10gPSB7MHhmZmZmZjAyNywgMHhhYTU1YTAyZiwgMHgwMDAwMDAyNywgMHg1NWFhNTAyZn07CisJLy8gSW5pdGlhbGl6ZSByZWdpc3RlciBhZGRyZXNzIG9mZnNldCB0byBiZSBjaGVja2VkCisJV3JpdGVBZGRyW0hXOTBfQkxPQ0tfTUFDXSA9IDB4MTAwOworCVdyaXRlQWRkcltIVzkwX0JMT0NLX1BIWTBdID0gMHg5MDA7CisJV3JpdGVBZGRyW0hXOTBfQkxPQ0tfUEhZMV0gPSAweDgwMDsKKwlXcml0ZUFkZHJbSFc5MF9CTE9DS19SRl0gPSAweDM7CisJUlRfVFJBQ0UoQ09NUF9QSFksICI9PT09PT09PiVzKCksIENoZWNrQmxvY2s6JWRcbiIsIF9fRlVOQ1RJT05fXywgQ2hlY2tCbG9jayk7CisJZm9yKGk9MCA7IGkgPCBDaGVja1RpbWVzIDsgaSsrKQorCXsKKworCQkvLworCQkvLyBXcml0ZSBEYXRhIHRvIHJlZ2lzdGVyIGFuZCByZWFkYmFjaworCQkvLworCQlzd2l0Y2goQ2hlY2tCbG9jaykKKwkJeworCQljYXNlIEhXOTBfQkxPQ0tfTUFDOgorCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJQSFlfQ2hlY2tCQlJGT0soKTogTmV2ZXIgV3JpdGUgMHgxMDAgaGVyZSEiKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSFc5MF9CTE9DS19QSFkwOgorCQljYXNlIEhXOTBfQkxPQ0tfUEhZMToKKwkJCXdyaXRlX25pY19kd29yZChkZXYsIFdyaXRlQWRkcltDaGVja0Jsb2NrXSwgV3JpdGVEYXRhW2ldKTsKKwkJCWR3UmVnUmVhZCA9IHJlYWRfbmljX2R3b3JkKGRldiwgV3JpdGVBZGRyW0NoZWNrQmxvY2tdKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSFc5MF9CTE9DS19SRjoKKwkJCVdyaXRlRGF0YVtpXSAmPSAweGZmZjsKKwkJCXJ0bDgxOTJfcGh5X1NldFJGUmVnKGRldiwgZVJGUGF0aCwgV3JpdGVBZGRyW0hXOTBfQkxPQ0tfUkZdLCBiTWFzazEyQml0cywgV3JpdGVEYXRhW2ldKTsKKwkJCS8vIFRPRE86IHdlIHNob3VsZCBub3QgZGVsYXkgZm9yIHN1Y2ggYSBsb25nIHRpbWUuIEFzayBTRDMKKwkJCW1zbGVlcCgxKTsKKwkJCWR3UmVnUmVhZCA9IHJ0bDgxOTJfcGh5X1F1ZXJ5UkZSZWcoZGV2LCBlUkZQYXRoLCBXcml0ZUFkZHJbSFc5MF9CTE9DS19SRl0sIGJNYXNrMTJCaXRzKTsKKwkJCW1zbGVlcCgxKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXQgPSAxOworCQkJYnJlYWs7CisJCX0KKworCisJCS8vCisJCS8vIENoZWNrIHdoZXRoZXIgcmVhZGJhY2sgZGF0YSBpcyBjb3JyZWN0CisJCS8vCisJCWlmKGR3UmVnUmVhZCAhPSBXcml0ZURhdGFbaV0pCisJCXsKKwkJCVJUX1RSQUNFKChDT01QX1BIWXxDT01QX0VSUiksICI9PT09PmVycm9yPT09PT1kd1JlZ1JlYWQ6ICV4LCBXcml0ZURhdGE6ICV4IFxuIiwgZHdSZWdSZWFkLCBXcml0ZURhdGFbaV0pOworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplIEJCJlJGCisgKiAgIGlucHV0OiAgbmV0X2RldmljZSBkZXYKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgbm9uZQorICogIG5vdGljZTogIEluaXRpYWxpemF0aW9uIHZhbHVlIG1heSBjaGFuZ2UgYWxsIHRoZSB0aW1lLCBzbyBwbGVhc2UgbWFrZQorICogICAgICAgICAgIHN1cmUgaXQgaGFzIGJlZW4gc3luY2VkIHdpdGggdGhlIG5ld2VzdC4KKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcnRsODE5Ml9CQl9Db25maWdfUGFyYUZpbGUoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTggYlJlZ1ZhbHVlID0gMCwgZUNoZWNrSXRlbSA9IDAsIHJ0U3RhdHVzID0gMDsKKwl1MzIgZHdSZWdWYWx1ZSA9IDA7CisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJLy88MT5Jbml0aWFsaXplIEJhc2VCYW5kCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkvKi0tc2V0IEJCIEdsb2JhbCBSZXNldC0tKi8KKwliUmVnVmFsdWUgPSByZWFkX25pY19ieXRlKGRldiwgQkJfR0xPQkFMX1JFU0VUKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIEJCX0dMT0JBTF9SRVNFVCwoYlJlZ1ZhbHVlfEJCX0dMT0JBTF9SRVNFVF9CSVQpKTsKKwltZGVsYXkoNTApOworCS8qLS0tc2V0IEJCIHJlc2V0IEFjdGl2ZS0tLSovCisJZHdSZWdWYWx1ZSA9IHJlYWRfbmljX2R3b3JkKGRldiwgQ1BVX0dFTik7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgQ1BVX0dFTiwgKGR3UmVnVmFsdWUmKH5DUFVfR0VOX0JCX1JTVCkpKTsKKworCS8qLS0tLUNrZWNrIEZQR0FQSFkwIGFuZCBQSFkxIGJvYXJkIGlzIE9LLS0tLSovCisJLy8gVE9ETzogdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgcmVtb3ZlZCBvbiBBU0lDICwgRW1pbHkgMjAwNy4yLjIKKwlmb3IoZUNoZWNrSXRlbT0oSFc5MF9CTE9DS19FKUhXOTBfQkxPQ0tfUEhZMDsgZUNoZWNrSXRlbTw9SFc5MF9CTE9DS19QSFkxOyBlQ2hlY2tJdGVtKyspCisJeworCQlydFN0YXR1cyAgPSBydGw4MTkyX3BoeV9jaGVja0JCQW5kUkYoZGV2LCAoSFc5MF9CTE9DS19FKWVDaGVja0l0ZW0sIChSRjkwX1JBRElPX1BBVEhfRSkwKTsgLy9kb24ndCBjYXJlIFJGIHBhdGgKKwkJaWYocnRTdGF0dXMgIT0gMCkKKwkJeworCQkJUlRfVFJBQ0UoKENPTVBfRVJSIHwgQ09NUF9QSFkpLCAiUEhZX1JGODI1Nl9Db25maWcoKTpDaGVjayBQSFklZCBGYWlsISFcbiIsIGVDaGVja0l0ZW0tMSk7CisJCQlyZXR1cm4gOworCQl9CisJfQorCS8qLS0tLSBTZXQgQ0NLIGFuZCBPRkRNIEJsb2NrICJPRkYiLS0tLSovCisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9SRk1PRCwgYkNDS0VufGJPRkRNRW4sIDB4MCk7CisJLyotLS0tQkIgUmVnaXN0ZXIgSW5pdGlsYXphdGlvbi0tLS0qLworCS8vPT1tPT0+U2V0IFBIWSBSRUcgRnJvbSBIZWFkZXI8PT1tPT0KKwlydGw4MTkyX3BoeUNvbmZpZ0JCKGRldiwgQmFzZUJhbmRfQ29uZmlnX1BIWV9SRUcpOworCisJLyotLS0tU2V0IEJCIHJlc2V0IGRlLUFjdGl2ZS0tLS0qLworCWR3UmVnVmFsdWUgPSByZWFkX25pY19kd29yZChkZXYsIENQVV9HRU4pOworCXdyaXRlX25pY19kd29yZChkZXYsIENQVV9HRU4sIChkd1JlZ1ZhbHVlfENQVV9HRU5fQkJfUlNUKSk7CisKKwkvKi0tLS1CQiBBR0MgdGFibGUgSW5pdGlhbGl6YXRpb24tLS0tKi8KKwkvLz09bT09PlNldCBQSFkgUkVHIEZyb20gSGVhZGVyPD09bT09CisJcnRsODE5Ml9waHlDb25maWdCQihkZXYsIEJhc2VCYW5kX0NvbmZpZ19BR0NfVEFCKTsKKworCS8qLS0tLUVuYWJsZSBYU1RBTCAtLS0tKi8KKwl3cml0ZV9uaWNfYnl0ZV9FKGRldiwgMHg1ZSwgMHgwMCk7CisJaWYgKHByaXYtPmNhcmRfODE5Ml92ZXJzaW9uID09ICh1OClWRVJTSU9OXzgxOXhVX0EpCisJeworCQkvL0FudGVubmEgZ2FpbiBvZmZzZXQgZnJvbSBCL0MvRCB0byBBCisJCWR3UmVnVmFsdWUgPSAocHJpdi0+QW50ZW5uYVR4UHdEaWZmWzFdPDw0IHwgcHJpdi0+QW50ZW5uYVR4UHdEaWZmWzBdKTsKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9UeEdhaW5TdGFnZSwgKGJYQlR4QUdDfGJYQ1R4QUdDKSwgZHdSZWdWYWx1ZSk7CisKKwkJLy9YU1RBTExDYXAKKwkJZHdSZWdWYWx1ZSA9IHByaXYtPkNyeXN0YWxDYXAgJiAweGY7CisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMSwgYlh0YWxDYXAsIGR3UmVnVmFsdWUpOworCX0KKworCS8vIENoZWNrIGlmIHRoZSBDQ0sgSGlnaFBvd2VyIGlzIHR1cm5lZCBPTi4KKwkvLyBUaGlzIGlzIHVzZWQgdG8gY2FsY3VsYXRlIFBXREIuCisJcHJpdi0+YkNja0hpZ2hQb3dlciA9ICh1OCkocnRsODE5Ml9RdWVyeUJCUmVnKGRldiwgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIyLCAweDIwMCkpOworCXJldHVybjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemUgQkImUkYKKyAqICAgaW5wdXQ6ICBuZXRfZGV2aWNlIGRldgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgbm90aWNlOiAgSW5pdGlhbGl6YXRpb24gdmFsdWUgbWF5IGNoYW5nZSBhbGwgdGhlIHRpbWUsIHNvIHBsZWFzZSBtYWtlCisgKiAgICAgICAgICAgc3VyZSBpdCBoYXMgYmVlbiBzeW5jZWQgd2l0aCB0aGUgbmV3ZXN0LgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBydGw4MTkyX0JCQ29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJcnRsODE5Ml9Jbml0QkJSRlJlZ0RlZihkZXYpOworCS8vY29uZmlnIEJCJlJGLiBBcyBoYXJkQ29kZSBiYXNlZCBpbml0aWFsaXphdGlvbiBoYXMgbm90IGJlZW4gd2VsbAorCS8vaW1wbGVtZW50ZWQsIHNvIHVzZSBmaWxlIGZpcnN0LkZJWE1FOnNob3VsZCBpbXBsZW1lbnQgaXQgZm9yIGhhcmRjb2RlPworCXJ0bDgxOTJfQkJfQ29uZmlnX1BhcmFGaWxlKGRldik7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBvYnRhaW5zIHRoZSBpbml0aWFsaXphdGlvbiB2YWx1ZSBvZiBUeCBwb3dlciBMZXZlbCBvZmZzZXQKKyAqICAgaW5wdXQ6ICBuZXRfZGV2aWNlIGRldgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHJ0bDgxOTJfcGh5X2dldFR4UG93ZXIoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJcHJpdi0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbMF0gPQorCQlyZWFkX25pY19kd29yZChkZXYsIHJUeEFHQ19SYXRlMThfMDYpOworCXByaXYtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WzFdID0KKwkJcmVhZF9uaWNfZHdvcmQoZGV2LCByVHhBR0NfUmF0ZTU0XzI0KTsKKwlwcml2LT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFsyXSA9CisJCXJlYWRfbmljX2R3b3JkKGRldiwgclR4QUdDX01jczAzX01jczAwKTsKKwlwcml2LT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFszXSA9CisJCXJlYWRfbmljX2R3b3JkKGRldiwgclR4QUdDX01jczA3X01jczA0KTsKKwlwcml2LT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFs0XSA9CisJCXJlYWRfbmljX2R3b3JkKGRldiwgclR4QUdDX01jczExX01jczA4KTsKKwlwcml2LT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFs1XSA9CisJCXJlYWRfbmljX2R3b3JkKGRldiwgclR4QUdDX01jczE1X01jczEyKTsKKworCS8vIHJlYWQgcnggaW5pdGlhbCBnYWluCisJcHJpdi0+RGVmYXVsdEluaXRpYWxHYWluWzBdID0gcmVhZF9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQUFHQ0NvcmUxKTsKKwlwcml2LT5EZWZhdWx0SW5pdGlhbEdhaW5bMV0gPSByZWFkX25pY19ieXRlKGRldiwgck9GRE0wX1hCQUdDQ29yZTEpOworCXByaXYtPkRlZmF1bHRJbml0aWFsR2FpblsyXSA9IHJlYWRfbmljX2J5dGUoZGV2LCByT0ZETTBfWENBR0NDb3JlMSk7CisJcHJpdi0+RGVmYXVsdEluaXRpYWxHYWluWzNdID0gcmVhZF9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YREFHQ0NvcmUxKTsKKwlSVF9UUkFDRShDT01QX0lOSVQsICJEZWZhdWx0IGluaXRpYWwgZ2FpbiAoYzUwPTB4JXgsIGM1OD0weCV4LCBjNjA9MHgleCwgYzY4PTB4JXgpIFxuIiwKKwkJcHJpdi0+RGVmYXVsdEluaXRpYWxHYWluWzBdLCBwcml2LT5EZWZhdWx0SW5pdGlhbEdhaW5bMV0sCisJCXByaXYtPkRlZmF1bHRJbml0aWFsR2FpblsyXSwgcHJpdi0+RGVmYXVsdEluaXRpYWxHYWluWzNdKTsKKworCS8vIHJlYWQgZnJhbWVzeW5jCisJcHJpdi0+ZnJhbWVzeW5jID0gcmVhZF9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMyk7CisJcHJpdi0+ZnJhbWVzeW5jQzM0ID0gcmVhZF9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMik7CisJUlRfVFJBQ0UoQ09NUF9JTklULCAiRGVmYXVsdCBmcmFtZXN5bmMgKDB4JXgpID0gMHgleCBcbiIsCisJCXJPRkRNMF9SeERldGVjdG9yMywgcHJpdi0+ZnJhbWVzeW5jKTsKKworCS8vIHJlYWQgU0lGUyAoc2F2ZSB0aGUgdmFsdWUgcmVhZCBmb21lIE1BQ1BIWV9SRUcudHh0KQorCXByaXYtPlNpZnNUaW1lID0gcmVhZF9uaWNfd29yZChkZXYsIFNJRlMpOworCisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBvYnRhaW5zIHRoZSBpbml0aWFsaXphdGlvbiB2YWx1ZSBvZiBUeCBwb3dlciBMZXZlbCBvZmZzZXQKKyAqICAgaW5wdXQ6ICBuZXRfZGV2aWNlIGRldgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHJ0bDgxOTJfcGh5X3NldFR4UG93ZXIoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdTggY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTgJcG93ZXJsZXZlbCA9IHByaXYtPlR4UG93ZXJMZXZlbENDS1tjaGFubmVsLTFdOworCXU4CXBvd2VybGV2ZWxPRkRNMjRHID0gcHJpdi0+VHhQb3dlckxldmVsT0ZETTI0R1tjaGFubmVsLTFdOworCisJc3dpdGNoKHByaXYtPnJmX2NoaXApCisJeworCWNhc2UgUkZfODI1NjoKKwkJUEhZX1NldFJGODI1NkNDS1R4UG93ZXIoZGV2LCBwb3dlcmxldmVsKTsgLy9uZWVkIGZ1cnRoZXIgaW1wbGVtZW50CisJCVBIWV9TZXRSRjgyNTZPRkRNVHhQb3dlcihkZXYsIHBvd2VybGV2ZWxPRkRNMjRHKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKy8vCWNhc2UgUkZfODIyNToKKy8vCWNhc2UgUkZfODI1ODoKKwkJUlRfVFJBQ0UoKENPTVBfUEhZfENPTVBfRVJSKSwgImVycm9yIFJGIGNoaXBJRCg4MjI1IG9yIDgyNTgpIGluIGZ1bmN0aW9uICVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWJyZWFrOworCX0KKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIGNoZWNrIFJmIGNoaXAgdG8gZG8gUkYgY29uZmlnCisgKiAgIGlucHV0OiAgbmV0X2RldmljZSBkZXYKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgb25seSA4MjU2IGlzIHN1cHBvcnRlZAorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBydGw4MTkyX3BoeV9SRkNvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXN3aXRjaChwcml2LT5yZl9jaGlwKQorCXsKKwkJY2FzZSBSRl84MjU2OgorCQkJUEhZX1JGODI1Nl9Db25maWcoZGV2KTsKKwkJCWJyZWFrOworCS8vCWNhc2UgUkZfODIyNToKKwkvLwljYXNlIFJGXzgyNTg6CisJCWRlZmF1bHQ6CisJCQlSVF9UUkFDRShDT01QX0VSUiwgImVycm9yIGNoaXAgaWRcbiIpOworCQkJYnJlYWs7CisJfQorCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gdXBkYXRlIEluaXRpYWwgZ2FpbgorICogICBpbnB1dDogIG5ldF9kZXZpY2UgZGV2CisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIEFzIFdpbmRvd3MgaGFzIG5vdCBpbXBsZW1lbnRlZCB0aGlzLCB3YWl0IGZvciBjb21wbGVtZW50CisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHJ0bDgxOTJfcGh5X3VwZGF0ZUluaXRHYWluKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiByZWFkIFJGIHBhcmFtZXRlcnMgZnJvbSBnZW5lcmFsIGhlYWQgZmlsZSwgYW5kIGRvIFJGIDMtd2lyZQorICogICBpbnB1dDogIG5ldF9kZXZpY2UgZGV2CisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIHJldHVybiBjb2RlIHNob3cgaWYgUkYgY29uZmlndXJhdGlvbiBpcyBzdWNjZXNzZnVsKDA6cGFzcywgMTpmYWlsKQorICogICAgTm90ZTogIERlbGF5IG1heSBiZSByZXF1aXJlZCBmb3IgUkYgY29uZmlndXJhdGlvbgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggcnRsODE5Ml9waHlfQ29uZmlnUkZXaXRoSGVhZGVyRmlsZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCBSRjkwX1JBRElPX1BBVEhfRQllUkZQYXRoKQoreworCisJaW50IGk7CisJLy91MzIqIHBSRkFycmF5OworCXU4IHJldCA9IDA7CisKKwlzd2l0Y2goZVJGUGF0aCl7CisJCWNhc2UgUkY5MF9QQVRIX0E6CisJCQlmb3IoaSA9IDA7aTxSYWRpb0FfQXJyYXlMZW5ndGg7IGk9aSsyKXsKKworCQkJCWlmKHJ0bDgxOVhSYWRpb0FfQXJyYXlbaV0gPT0gMHhmZSl7CisJCQkJCQltZGVsYXkoMTAwKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIGVSRlBhdGgsIHJ0bDgxOVhSYWRpb0FfQXJyYXlbaV0sIGJNYXNrMTJCaXRzLCBydGw4MTlYUmFkaW9BX0FycmF5W2krMV0pOworCQkJCW1kZWxheSgxKTsKKworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUkY5MF9QQVRIX0I6CisJCQlmb3IoaSA9IDA7aTxSYWRpb0JfQXJyYXlMZW5ndGg7IGk9aSsyKXsKKworCQkJCWlmKHJ0bDgxOVhSYWRpb0JfQXJyYXlbaV0gPT0gMHhmZSl7CisJCQkJCQltZGVsYXkoMTAwKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIGVSRlBhdGgsIHJ0bDgxOVhSYWRpb0JfQXJyYXlbaV0sIGJNYXNrMTJCaXRzLCBydGw4MTlYUmFkaW9CX0FycmF5W2krMV0pOworCQkJCW1kZWxheSgxKTsKKworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUkY5MF9QQVRIX0M6CisJCQlmb3IoaSA9IDA7aTxSYWRpb0NfQXJyYXlMZW5ndGg7IGk9aSsyKXsKKworCQkJCWlmKHJ0bDgxOVhSYWRpb0NfQXJyYXlbaV0gPT0gMHhmZSl7CisJCQkJCQltZGVsYXkoMTAwKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIGVSRlBhdGgsIHJ0bDgxOVhSYWRpb0NfQXJyYXlbaV0sIGJNYXNrMTJCaXRzLCBydGw4MTlYUmFkaW9DX0FycmF5W2krMV0pOworCQkJCW1kZWxheSgxKTsKKworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUkY5MF9QQVRIX0Q6CisJCQlmb3IoaSA9IDA7aTxSYWRpb0RfQXJyYXlMZW5ndGg7IGk9aSsyKXsKKworCQkJCWlmKHJ0bDgxOVhSYWRpb0RfQXJyYXlbaV0gPT0gMHhmZSl7CisJCQkJCQltZGVsYXkoMTAwKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIGVSRlBhdGgsIHJ0bDgxOVhSYWRpb0RfQXJyYXlbaV0sIGJNYXNrMTJCaXRzLCBydGw4MTlYUmFkaW9EX0FycmF5W2krMV0pOworCQkJCW1kZWxheSgxKTsKKworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OzsKKworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gc2V0IFR4IFBvd2VyIG9mIHRoZSBjaGFubmVsCisgKiAgIGlucHV0OiAgc3RydWN0IG5ldF9kZXZpY2UgKmRldgorICogICAJICAgICB1OCAJCWNoYW5uZWwKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgbm9uZQorICogICAgTm90ZToKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcnRsODE5Ml9TZXRUeFBvd2VyTGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTgJcG93ZXJsZXZlbCA9IHByaXYtPlR4UG93ZXJMZXZlbENDS1tjaGFubmVsLTFdOworCXU4CXBvd2VybGV2ZWxPRkRNMjRHID0gcHJpdi0+VHhQb3dlckxldmVsT0ZETTI0R1tjaGFubmVsLTFdOworCisJc3dpdGNoKHByaXYtPnJmX2NoaXApCisJeworCWNhc2UgUkZfODIyNToKKyNpZmRlZiBUT19ET19MSVNUCisJCVBIWV9TZXRSRjgyMjVDY2tUeFBvd2VyKEFkYXB0ZXIsIHBvd2VybGV2ZWwpOworCQlQSFlfU2V0UkY4MjI1T2ZkbVR4UG93ZXIoQWRhcHRlciwgcG93ZXJsZXZlbE9GRE0yNEcpOworI2VuZGlmCisJCWJyZWFrOworCisJY2FzZSBSRl84MjU2OgorCQlQSFlfU2V0UkY4MjU2Q0NLVHhQb3dlcihkZXYsIHBvd2VybGV2ZWwpOworCQlQSFlfU2V0UkY4MjU2T0ZETVR4UG93ZXIoZGV2LCBwb3dlcmxldmVsT0ZETTI0Ryk7CisJCWJyZWFrOworCisJY2FzZSBSRl84MjU4OgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlSVF9UUkFDRShDT01QX0VSUiwgInVua25vd24gcmYgY2hpcCBJRCBpbiBydGw4MTkyX1NldFR4UG93ZXJMZXZlbCgpXG4iKTsKKwkJYnJlYWs7CisJfQorCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gc2V0IFJGIHN0YXRlIG9uIG9yIG9mZgorICogICBpbnB1dDogIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKyAqICAgCSAgICAgUlRfUkZfUE9XRVJfU1RBVEUgZVJGUG93ZXJTdGF0ZSAgLy9Qb3dlciBTdGF0ZSB0byBzZXQKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgbm9uZQorICogICAgTm90ZToKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Jvb2wgcnRsODE5Ml9TZXRSRlBvd2VyU3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgUlRfUkZfUE9XRVJfU1RBVEUgZVJGUG93ZXJTdGF0ZSkKK3sKKwlib29sCQkJCWJSZXN1bHQgPSB0cnVlOworLy8JdTgJCQkJCWVSRlBhdGg7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJaWYoZVJGUG93ZXJTdGF0ZSA9PSBwcml2LT5pZWVlODAyMTEtPmVSRlBvd2VyU3RhdGUpCisJCXJldHVybiBmYWxzZTsKKworCWlmKHByaXYtPlNldFJGUG93ZXJTdGF0ZUluUHJvZ3Jlc3MgPT0gdHJ1ZSkKKwkJcmV0dXJuIGZhbHNlOworCisJcHJpdi0+U2V0UkZQb3dlclN0YXRlSW5Qcm9ncmVzcyA9IHRydWU7CisKKwlzd2l0Y2gocHJpdi0+cmZfY2hpcCkKKwl7CisJCWNhc2UgUkZfODI1NjoKKwkJc3dpdGNoKCBlUkZQb3dlclN0YXRlICkKKwkJeworCQkJY2FzZSBlUmZPbjoKKwkvL1JGLUEsIFJGLUIKKwkJCQkJLy9lbmFibGUgUkYtQ2hpcCBBL0IKKwkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9YQV9SRkludGVyZmFjZU9FLCBCSVQ0LCAweDEpOwkvLyAweDg2MFs0XQorCQkJCQkvL2FuYWxvZyB0byBkaWdpdGFsIG9uCisJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyNCwgMHgzMDAsIDB4Myk7Ly8gMHg4OGNbOTo4XQorCQkJCQkvL2RpZ2l0YWwgdG8gYW5hbG9nIG9uCisJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMSwgMHgxOCwgMHgzKTsgLy8gMHg4ODBbNDozXQorCQkJCQkvL3J4IGFudGVubmEgb24KKwkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9UUnhQYXRoRW5hYmxlLCAweDMsIDB4Myk7Ly8gMHhjMDRbMTowXQorCQkJCQkvL3J4IGFudGVubmEgb24KKwkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMV9UUnhQYXRoRW5hYmxlLCAweDMsIDB4Myk7Ly8gMHhkMDRbMTowXQorCQkJCQkvL2FuYWxvZyB0byBkaWdpdGFsIHBhcnQyIG9uCisJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMSwgMHg2MCwgMHgzKTsgLy8gMHg4ODBbNjo1XQorCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgZVJmU2xlZXA6CisKKwkJCQlicmVhazsKKworCQkJY2FzZSBlUmZPZmY6CisJCQkJCS8vUkYtQSwgUkYtQgorCQkJCQkvL2Rpc2FibGUgUkYtQ2hpcCBBL0IKKwkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9YQV9SRkludGVyZmFjZU9FLCBCSVQ0LCAweDApOwkvLyAweDg2MFs0XQorCQkJCQkvL2FuYWxvZyB0byBkaWdpdGFsIG9mZiwgZm9yIHBvd2VyIHNhdmUKKwkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXI0LCAweGYwMCwgMHgwKTsvLyAweDg4Y1sxMTo4XQorCQkJCQkvL2RpZ2l0YWwgdG8gYW5hbG9nIG9mZiwgZm9yIHBvd2VyIHNhdmUKKwkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXIxLCAweDE4LCAweDApOyAvLyAweDg4MFs0OjNdCisJCQkJCS8vcnggYW50ZW5uYSBvZmYKKwkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9UUnhQYXRoRW5hYmxlLCAweGYsIDB4MCk7Ly8gMHhjMDRbMzowXQorCQkJCQkvL3J4IGFudGVubmEgb2ZmCisJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTFfVFJ4UGF0aEVuYWJsZSwgMHhmLCAweDApOy8vIDB4ZDA0WzM6MF0KKwkJCQkJLy9hbmFsb2cgdG8gZGlnaXRhbCBwYXJ0MiBvZmYsIGZvciBwb3dlciBzYXZlCisJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMSwgMHg2MCwgMHgwKTsgLy8gMHg4ODBbNjo1XQorCisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYlJlc3VsdCA9IGZhbHNlOworCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiU2V0UkZQb3dlclN0YXRlODE5eFVzYigpOiB1bmtub3cgc3RhdGUgdG8gc2V0OiAweCVYISEhXG4iLCBlUkZQb3dlclN0YXRlKTsKKwkJCQlicmVhazsKKwkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlSVF9UUkFDRShDT01QX0VSUiwgIk5vdCBzdXBwb3J0IHJmX2NoaXAoJXgpXG4iLCBwcml2LT5yZl9jaGlwKTsKKwkJCWJyZWFrOworCX0KKyNpZmRlZiBUT19ET19MSVNUCisJaWYoYlJlc3VsdCkKKwl7CisJCS8vIFVwZGF0ZSBjdXJyZW50IFJGIHN0YXRlIHZhcmlhYmxlLgorCQlwSGFsRGF0YS0+ZVJGUG93ZXJTdGF0ZSA9IGVSRlBvd2VyU3RhdGU7CisJCXN3aXRjaChwSGFsRGF0YS0+UkZDaGlwSUQgKQorCQl7CisJCQljYXNlIFJGXzgyNTY6CisJCXN3aXRjaChwSGFsRGF0YS0+ZVJGUG93ZXJTdGF0ZSkKKwkJCQl7CisJCQkJY2FzZSBlUmZPZmY6CisJCQkJCS8vCisJCQkJCS8vSWYgUmYgb2ZmIHJlYXNvbiBpcyBmcm9tIElQUywgTGVkIHNob3VsZCBibGluayB3aXRoIG5vIGxpbmssIGJ5IE1hZGRlc3QgMDcxMDE1CisJCQkJCS8vCisJCQkJCWlmKHBNZ250SW5mby0+UmZPZmZSZWFzb249PVJGX0NIQU5HRV9CWV9JUFMgKQorCQkJCQl7CisJCQkJCQlBZGFwdGVyLT5IYWxGdW5jLkxlZENvbnRyb2xIYW5kbGVyKEFkYXB0ZXIsTEVEX0NUTF9OT19MSU5LKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCS8vIFR1cm4gb2ZmIExFRCBpZiBSRiBpcyBub3QgT04uCisJCQkJCQlBZGFwdGVyLT5IYWxGdW5jLkxlZENvbnRyb2xIYW5kbGVyKEFkYXB0ZXIsIExFRF9DVExfUE9XRVJfT0ZGKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWNhc2UgZVJmT246CisJCQkJCS8vIFR1cm4gb24gUkYgd2UgYXJlIHN0aWxsIGxpbmtlZCwgd2hpY2ggbWlnaHQgaGFwcGVuIHdoZW4KKwkJCQkJLy8gd2UgcXVpY2tseSB0dXJuIG9mZiBhbmQgb24gSFcgUkYuIDIwMDYuMDUuMTIsIGJ5IHJjbmprby4KKwkJCQkJaWYoIHBNZ250SW5mby0+Yk1lZGlhQ29ubmVjdCA9PSBUUlVFICkKKwkJCQkJeworCQkJCQkJQWRhcHRlci0+SGFsRnVuYy5MZWRDb250cm9sSGFuZGxlcihBZGFwdGVyLCBMRURfQ1RMX0xJTkspOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJLy8gVHVybiBvZmYgTEVEIGlmIFJGIGlzIG5vdCBPTi4KKwkJCQkJCUFkYXB0ZXItPkhhbEZ1bmMuTGVkQ29udHJvbEhhbmRsZXIoQWRhcHRlciwgTEVEX0NUTF9OT19MSU5LKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCS8vIGRvIG5vdGhpbmcuCisJCQkJCWJyZWFrOworCQkJCX0vLyBTd2l0Y2ggUkYgc3RhdGUKKwkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCVJUX1RSQUNFKENPTVBfUkYsIERCR19MT1VELCAoIlNldFJGUG93ZXJTdGF0ZTgxOTAoKTogVW5rbm93biBSRiB0eXBlXG4iKSk7CisJCQkJCWJyZWFrOworCQkJfQorCisJfQorI2VuZGlmCisJcHJpdi0+U2V0UkZQb3dlclN0YXRlSW5Qcm9ncmVzcyA9IGZhbHNlOworCisJcmV0dXJuIGJSZXN1bHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBzZXQgY29tbWFuZCB0YWJsZSB2YXJpYWJsZShzdHJ1Y3QgU3dDaG5sQ21kKS4KKyAqICAgaW5wdXQ6ICBTd0NobmxDbWQqCQlDbWRUYWJsZSAJLy90YWJsZSB0byBiZSBzZXQuCisgKiAgIAkgICAgIHUzMgkJQ21kVGFibGVJZHggCS8vdmFyaWFibGUgaW5kZXggaW4gdGFibGUgdG8gYmUgc2V0CisgKiAgIAkgICAgIHUzMgkJQ21kVGFibGVTegkvL3RhYmxlIHNpemUuCisgKiAgIAkgICAgIFN3Q2hubENtZElECUNtZElECQkvL2NvbW1hbmQgSUQgdG8gc2V0LgorICoJICAgICB1MzIJCVBhcmExCisgKgkgICAgIHUzMgkJUGFyYTIKKyAqCSAgICAgdTMyCQltc0RlbGF5CisgKiAgb3V0cHV0OgorICogIHJldHVybjogIHRydWUgaWYgZmluaXNoZWQsIGZhbHNlIG90aGVyd2lzZQorICogICAgTm90ZToKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IHJ0bDgxOTJfcGh5X1NldFN3Q2hubENtZEFycmF5KAorCVN3Q2hubENtZCoJCUNtZFRhYmxlLAorCXUzMgkJCUNtZFRhYmxlSWR4LAorCXUzMgkJCUNtZFRhYmxlU3osCisJU3dDaG5sQ21kSUQJCUNtZElELAorCXUzMgkJCVBhcmExLAorCXUzMgkJCVBhcmEyLAorCXUzMgkJCW1zRGVsYXkKKwkpCit7CisJU3dDaG5sQ21kKiBwQ21kOworCisJaWYoQ21kVGFibGUgPT0gTlVMTCkKKwl7CisJCVJUX1RSQUNFKENPTVBfRVJSLCAicGh5X1NldFN3Q2hubENtZEFycmF5KCk6IENtZFRhYmxlIGNhbm5vdCBiZSBOVUxMLlxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYoQ21kVGFibGVJZHggPj0gQ21kVGFibGVTeikKKwl7CisJCVJUX1RSQUNFKENPTVBfRVJSLCAicGh5X1NldFN3Q2hubENtZEFycmF5KCk6IEFjY2VzcyBpbnZhbGlkIGluZGV4LCBwbGVhc2UgY2hlY2sgc2l6ZSBvZiB0aGUgdGFibGUsIENtZFRhYmxlSWR4OiVkLCBDbWRUYWJsZVN6OiVkXG4iLAorCQkJCUNtZFRhYmxlSWR4LCBDbWRUYWJsZVN6KTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXBDbWQgPSBDbWRUYWJsZSArIENtZFRhYmxlSWR4OworCXBDbWQtPkNtZElEID0gQ21kSUQ7CisJcENtZC0+UGFyYTEgPSBQYXJhMTsKKwlwQ21kLT5QYXJhMiA9IFBhcmEyOworCXBDbWQtPm1zRGVsYXkgPSBtc0RlbGF5OworCisJcmV0dXJuIHRydWU7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBzZXQgY2hhbm5lbCBzdGVwIGJ5IHN0ZXAKKyAqICAgaW5wdXQ6ICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CisgKiAgIAkgICAgIHU4IAkJY2hhbm5lbAorICogICAJICAgICB1OCogCQlzdGFnZSAvLzMgc3RhZ2VzCisgKiAgIAkgICAgIHU4KiAJCXN0ZXAgIC8vCisgKiAgIAkgICAgIHUzMiogCQlkZWxheSAvL3doZXRoZXIgbmVlZCB0byBkZWxheQorICogIG91dHB1dDogIHN0b3JlIG5ldyBzdGFnZSwgc3RlcCBhbmQgZGVsYXkgZm9yIG5leHQgc3RlcChjb21iaW5lIHdpdGggZnVuY3Rpb24gYWJvdmUpCisgKiAgcmV0dXJuOiAgdHJ1ZSBpZiBmaW5pc2hlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgKiAgICBOb3RlOiAgV2FpdCBmb3Igc2ltcGxlciBmdW5jdGlvbiB0byByZXBsYWNlIGl0IC8vd2IKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IHJ0bDgxOTJfcGh5X1N3Q2hubFN0ZXBCeVN0ZXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggY2hhbm5lbCwgdTgqIHN0YWdlLCB1OCogc3RlcCwgdTMyKiBkZWxheSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisvLwlQQ0hBTk5FTF9BQ0NFU1NfU0VUVElORwlwQ2hubEFjY2Vzc1NldHRpbmc7CisJU3dDaG5sQ21kCQkJCVByZUNvbW1vbkNtZFtNQVhfUFJFQ01EX0NOVF07CisJdTMyCQkJCQlQcmVDb21tb25DbWRDbnQ7CisJU3dDaG5sQ21kCQkJCVBvc3RDb21tb25DbWRbTUFYX1BPU1RDTURfQ05UXTsKKwl1MzIJCQkJCVBvc3RDb21tb25DbWRDbnQ7CisJU3dDaG5sQ21kCQkJCVJmRGVwZW5kQ21kW01BWF9SRkRFUEVORENNRF9DTlRdOworCXUzMgkJCQkJUmZEZXBlbmRDbWRDbnQ7CisJU3dDaG5sQ21kCQkJCSpDdXJyZW50Q21kID0gTlVMTDsKKwkvL1JGOTBfUkFESU9fUEFUSF9FCQllUkZQYXRoOworCXU4CQllUkZQYXRoOworLy8JdTMyCQlSZlJldFZhbDsKKy8vCXU4CQlSZXRyeUNudDsKKworCVJUX1RSQUNFKENPTVBfQ0gsICI9PT09PiVzKCk9PT09c3RhZ2U6JWQsIHN0ZXA6JWQsIGNoYW5uZWw6JWRcbiIsIF9fRlVOQ1RJT05fXywgKnN0YWdlLCAqc3RlcCwgY2hhbm5lbCk7CisvLwlSVF9BU1NFUlQoSXNMZWdhbENoYW5uZWwoQWRhcHRlciwgY2hhbm5lbCksICgiaWxsZWdhbCBjaGFubmVsOiAlZFxuIiwgY2hhbm5lbCkpOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwlpZiAoIUlzTGVnYWxDaGFubmVsKHByaXYtPmllZWU4MDIxMSwgY2hhbm5lbCkpCisJeworCQlSVF9UUkFDRShDT01QX0VSUiwgIj09PT09PT09PT09PT0+c2V0IHRvIGlsbGVnYWwgY2hhbm5lbDolZFxuIiwgY2hhbm5lbCk7CisJCXJldHVybiB0cnVlOyAvL3JldHVybiB0cnVlIHRvIHRlbGwgdXBwZXIgY2FsbGVyIGZ1bmN0aW9uIHRoaXMgY2hhbm5lbCBzZXR0aW5nIGlzIGZpbmlzaGVkISBPciBpdCB3aWxsIGluIHdoaWxlIGxvb3AuCisJfQorI2VuZGlmCisvL0ZJWE1FOm5lZWQgdG8gY2hlY2sgd2hldGhlciBjaGFubmVsIGlzIGxlZ2FsIG9yIG5vdCBoZXJlLldCCisKKworCS8vZm9yKGVSRlBhdGggPSBSRjkwX1BBVEhfQTsgZVJGUGF0aCA8cEhhbERhdGEtPk51bVRvdGFsUkZQYXRoOyBlUkZQYXRoKyspCisvLwlmb3IoZVJGUGF0aCA9IDA7IGVSRlBhdGggPFJGOTBfUEFUSF9NQVg7IGVSRlBhdGgrKykKKy8vCXsKKy8vCQlpZiAoIXJ0bDgxOTJfcGh5X0NoZWNrSXNMZWdhbFJGUGF0aChkZXYsIGVSRlBhdGgpKQorLy8JCQljb250aW51ZTsKKwkJLy8gPDE+IEZpbGwgdXAgcHJlIGNvbW1vbiBjb21tYW5kLgorCQlQcmVDb21tb25DbWRDbnQgPSAwOworCQlydGw4MTkyX3BoeV9TZXRTd0NobmxDbWRBcnJheShQcmVDb21tb25DbWQsIFByZUNvbW1vbkNtZENudCsrLCBNQVhfUFJFQ01EX0NOVCwKKwkJCQkJQ21kSURfU2V0VHhQb3dlckxldmVsLCAwLCAwLCAwKTsKKwkJcnRsODE5Ml9waHlfU2V0U3dDaG5sQ21kQXJyYXkoUHJlQ29tbW9uQ21kLCBQcmVDb21tb25DbWRDbnQrKywgTUFYX1BSRUNNRF9DTlQsCisJCQkJCUNtZElEX0VuZCwgMCwgMCwgMCk7CisKKwkJLy8gPDI+IEZpbGwgdXAgcG9zdCBjb21tb24gY29tbWFuZC4KKwkJUG9zdENvbW1vbkNtZENudCA9IDA7CisKKwkJcnRsODE5Ml9waHlfU2V0U3dDaG5sQ21kQXJyYXkoUG9zdENvbW1vbkNtZCwgUG9zdENvbW1vbkNtZENudCsrLCBNQVhfUE9TVENNRF9DTlQsCisJCQkJCUNtZElEX0VuZCwgMCwgMCwgMCk7CisKKwkJLy8gPDM+IEZpbGwgdXAgUkYgZGVwZW5kZW50IGNvbW1hbmQuCisJCVJmRGVwZW5kQ21kQ250ID0gMDsKKwkJc3dpdGNoKCBwcml2LT5yZl9jaGlwICkKKwkJeworCQljYXNlIFJGXzgyMjU6CisJCQlpZiAoIShjaGFubmVsID49IDEgJiYgY2hhbm5lbCA8PSAxNCkpCisJCQl7CisJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJpbGxlZ2FsIGNoYW5uZWwgZm9yIFplYnJhIDgyMjU6ICVkXG4iLCBjaGFubmVsKTsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCXJ0bDgxOTJfcGh5X1NldFN3Q2hubENtZEFycmF5KFJmRGVwZW5kQ21kLCBSZkRlcGVuZENtZENudCsrLCBNQVhfUkZERVBFTkRDTURfQ05ULAorCQkJCUNtZElEX1JGX1dyaXRlUmVnLCByWmVicmExX0NoYW5uZWwsIFJGX0NIQU5ORUxfVEFCTEVfWkVCUkFbY2hhbm5lbF0sIDEwKTsKKwkJCXJ0bDgxOTJfcGh5X1NldFN3Q2hubENtZEFycmF5KFJmRGVwZW5kQ21kLCBSZkRlcGVuZENtZENudCsrLCBNQVhfUkZERVBFTkRDTURfQ05ULAorCQkJCUNtZElEX0VuZCwgMCwgMCwgMCk7CisJCQlicmVhazsKKworCQljYXNlIFJGXzgyNTY6CisJCQkvLyBURVNUISEgVGhpcyBpcyBub3QgdGhlIHRhYmxlIGZvciA4MjU2ISEKKwkJCWlmICghKGNoYW5uZWwgPj0gMSAmJiBjaGFubmVsIDw9IDE0KSkKKwkJCXsKKwkJCQlSVF9UUkFDRShDT01QX0VSUiwgImlsbGVnYWwgY2hhbm5lbCBmb3IgWmVicmEgODI1NjogJWRcbiIsIGNoYW5uZWwpOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJcnRsODE5Ml9waHlfU2V0U3dDaG5sQ21kQXJyYXkoUmZEZXBlbmRDbWQsIFJmRGVwZW5kQ21kQ250KyssIE1BWF9SRkRFUEVORENNRF9DTlQsCisJCQkJQ21kSURfUkZfV3JpdGVSZWcsIHJaZWJyYTFfQ2hhbm5lbCwgY2hhbm5lbCwgMTApOworCQkJcnRsODE5Ml9waHlfU2V0U3dDaG5sQ21kQXJyYXkoUmZEZXBlbmRDbWQsIFJmRGVwZW5kQ21kQ250KyssIE1BWF9SRkRFUEVORENNRF9DTlQsCisJCQlDbWRJRF9FbmQsIDAsIDAsIDApOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRl84MjU4OgorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCAiVW5rbm93biBSRkNoaXBJRDogJWRcbiIsIHByaXYtPnJmX2NoaXApOworCQkJcmV0dXJuIHRydWU7CisJCQlicmVhazsKKwkJfQorCisKKwkJZG97CisJCQlzd2l0Y2goKnN0YWdlKQorCQkJeworCQkJY2FzZSAwOgorCQkJCUN1cnJlbnRDbWQ9JlByZUNvbW1vbkNtZFsqc3RlcF07CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJQ3VycmVudENtZD0mUmZEZXBlbmRDbWRbKnN0ZXBdOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCUN1cnJlbnRDbWQ9JlBvc3RDb21tb25DbWRbKnN0ZXBdOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZihDdXJyZW50Q21kLT5DbWRJRD09Q21kSURfRW5kKQorCQkJeworCQkJCWlmKCgqc3RhZ2UpPT0yKQorCQkJCXsKKwkJCQkJKCpkZWxheSk9Q3VycmVudENtZC0+bXNEZWxheTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCSgqc3RhZ2UpKys7CisJCQkJCSgqc3RlcCk9MDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCisJCQlzd2l0Y2goQ3VycmVudENtZC0+Q21kSUQpCisJCQl7CisJCQljYXNlIENtZElEX1NldFR4UG93ZXJMZXZlbDoKKwkJCQlpZihwcml2LT5jYXJkXzgxOTJfdmVyc2lvbiA9PSAodTgpVkVSU0lPTl84MTl4VV9BKSAvL3hpb25nOiBjb25zaWRlciBpdCBsYXRlciEKKwkJCQkJcnRsODE5Ml9TZXRUeFBvd2VyTGV2ZWwoZGV2LGNoYW5uZWwpOworCQkJCWJyZWFrOworCQkJY2FzZSBDbWRJRF9Xcml0ZVBvcnRVbG9uZzoKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBDdXJyZW50Q21kLT5QYXJhMSwgQ3VycmVudENtZC0+UGFyYTIpOworCQkJCWJyZWFrOworCQkJY2FzZSBDbWRJRF9Xcml0ZVBvcnRVc2hvcnQ6CisJCQkJd3JpdGVfbmljX3dvcmQoZGV2LCBDdXJyZW50Q21kLT5QYXJhMSwgKHUxNilDdXJyZW50Q21kLT5QYXJhMik7CisJCQkJYnJlYWs7CisJCQljYXNlIENtZElEX1dyaXRlUG9ydFVjaGFyOgorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgQ3VycmVudENtZC0+UGFyYTEsICh1OClDdXJyZW50Q21kLT5QYXJhMik7CisJCQkJYnJlYWs7CisJCQljYXNlIENtZElEX1JGX1dyaXRlUmVnOgorCQkJCWZvcihlUkZQYXRoID0gMDsgZVJGUGF0aCA8IFJGOTBfUEFUSF9NQVg7IGVSRlBhdGgrKykKKwkJCQl7CisJCQkJcnRsODE5Ml9waHlfU2V0UkZSZWcoZGV2LCAoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCwgQ3VycmVudENtZC0+UGFyYTEsIGJaZWJyYTFfQ2hhbm5lbE51bSwgQ3VycmVudENtZC0+UGFyYTIpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWJyZWFrOworCQl9d2hpbGUodHJ1ZSk7CisvLwl9Lypmb3IoTnVtYmVyIG9mIFJGIHBhdGhzKSovCisKKwkoKmRlbGF5KT1DdXJyZW50Q21kLT5tc0RlbGF5OworCSgqc3RlcCkrKzsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIGRvZXMgYWN0dXJhbGx5IHNldCBjaGFubmVsIHdvcmsKKyAqICAgaW5wdXQ6ICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CisgKiAgIAkgICAgIHU4IAkJY2hhbm5lbAorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub2luCisgKiAgICBOb3RlOiAgV2Ugc2hvdWxkIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcnRsODE5Ml9waHlfRmluaXNoU3dDaG5sTm93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGNoYW5uZWwpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMglkZWxheSA9IDA7CisKKwl3aGlsZSghcnRsODE5Ml9waHlfU3dDaG5sU3RlcEJ5U3RlcChkZXYsY2hhbm5lbCwmcHJpdi0+U3dDaG5sU3RhZ2UsJnByaXYtPlN3Q2hubFN0ZXAsJmRlbGF5KSkKKwl7CisJLy8JaWYoZGVsYXk+MCkKKwkvLwkJbXNsZWVwKGRlbGF5KTsvL29yIG1kZWxheT8gbmVlZCBmdXJ0aGVyIGNvbnNpZGVyYXRpb24KKwkJaWYoIXByaXYtPnVwKQorCQkJYnJlYWs7CisJfQorfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIENhbGxiYWNrIHJvdXRpbmUgb2YgdGhlIHdvcmsgaXRlbSBmb3Igc3dpdGNoIGNoYW5uZWwuCisgKiAgIGlucHV0OgorICoKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgbm9pbgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBydGw4MTkyX1N3Q2hubF9Xb3JrSXRlbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJUlRfVFJBQ0UoQ09NUF9DSCwgIj09PiBTd0NobmxDYWxsYmFjazgxOXhVc2JXb3JrSXRlbSgpLCBjaGFuOiVkXG4iLCBwcml2LT5jaGFuKTsKKworCisJcnRsODE5Ml9waHlfRmluaXNoU3dDaG5sTm93KGRldiAsIHByaXYtPmNoYW4pOworCisJUlRfVFJBQ0UoQ09NUF9DSCwgIjw9PSBTd0NobmxDYWxsYmFjazgxOXhVc2JXb3JrSXRlbSgpXG4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gc2NoZWR1bGVkIGFjdHVyYWwgd29ya2l0ZW0gdG8gc2V0IGNoYW5uZWwKKyAqICAgaW5wdXQ6ICBuZXRfZGV2aWNlIGRldgorICogICAJICAgICB1OAkJY2hhbm5lbCAvL2NoYW5uZWwgdG8gc2V0CisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIHJldHVybiBjb2RlIHNob3cgaWYgd29ya2l0ZW0gaXMgc2NoZWR1bGVkKDE6cGFzcywgMDpmYWlsKQorICogICAgTm90ZTogIERlbGF5IG1heSBiZSByZXF1aXJlZCBmb3IgUkYgY29uZmlndXJhdGlvbgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggcnRsODE5Ml9waHlfU3dDaG5sKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHU4IGNoYW5uZWwpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCVJUX1RSQUNFKENPTVBfQ0gsICI9PT09PT4lcygpLCBTd0NobmxJblByb2dyZXNzOiVkXG4iLCBfX0ZVTkNUSU9OX18sIHByaXYtPlN3Q2hubEluUHJvZ3Jlc3MpOworCWlmKCFwcml2LT51cCkKKwkJcmV0dXJuIGZhbHNlOworCWlmKHByaXYtPlN3Q2hubEluUHJvZ3Jlc3MpCisJCXJldHVybiBmYWxzZTsKKworLy8JaWYocEhhbERhdGEtPlNldEJXTW9kZUluUHJvZ3Jlc3MpCisvLwkJcmV0dXJuOworaWYgKDApIC8vdG8gdGVzdCBjdXJyZW50IGNoYW5uZWwgZnJvbSBSRiByZWcgMHg3LgoreworCXU4CQllUkZQYXRoOworCWZvcihlUkZQYXRoID0gMDsgZVJGUGF0aCA8IDI7IGVSRlBhdGgrKyl7CisJcHJpbnRrKCI9PT09PnNldCBjaGFubmVsOiV4XG4iLHJ0bDgxOTJfcGh5X1F1ZXJ5UkZSZWcoZGV2LCAoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCwgMHg3LCBiWmVicmExX0NoYW5uZWxOdW0pKTsKKwl1ZGVsYXkoMTApOworCX0KK30KKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJc3dpdGNoKHByaXYtPmllZWU4MDIxMS0+bW9kZSkKKwl7CisJY2FzZSBXSVJFTEVTU19NT0RFX0E6CisJY2FzZSBXSVJFTEVTU19NT0RFX05fNUc6CisJCWlmIChjaGFubmVsPD0xNCl7CisJCQlSVF9UUkFDRShDT01QX0VSUiwgIldJUkVMRVNTX01PREVfQSBidXQgY2hhbm5lbDw9MTQiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlicmVhazsKKwljYXNlIFdJUkVMRVNTX01PREVfQjoKKwkJaWYgKGNoYW5uZWw+MTQpeworCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJXSVJFTEVTU19NT0RFX0IgYnV0IGNoYW5uZWw+MTQiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlicmVhazsKKwljYXNlIFdJUkVMRVNTX01PREVfRzoKKwljYXNlIFdJUkVMRVNTX01PREVfTl8yNEc6CisJCWlmIChjaGFubmVsPjE0KXsKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCAiV0lSRUxFU1NfTU9ERV9HIGJ1dCBjaGFubmVsPjE0Iik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJYnJlYWs7CisJfQorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCXByaXYtPlN3Q2hubEluUHJvZ3Jlc3MgPSB0cnVlOworCWlmKGNoYW5uZWwgPT0gMCkKKwkJY2hhbm5lbCA9IDE7CisKKwlwcml2LT5jaGFuPWNoYW5uZWw7CisKKwlwcml2LT5Td0NobmxTdGFnZT0wOworCXByaXYtPlN3Q2hubFN0ZXA9MDsKKy8vCXNjaGVkdWxlX3dvcmsoJihwcml2LT5Td0NobmxXb3JrSXRlbSkpOworLy8JcnRsODE5Ml9Td0NobmxfV29ya0l0ZW0oZGV2KTsKKwlpZihwcml2LT51cCkgeworLy8JCXF1ZXVlX3dvcmsocHJpdi0+cHJpdl93cSwmKHByaXYtPlN3Q2hubFdvcmtJdGVtKSk7CisJcnRsODE5Ml9Td0NobmxfV29ya0l0ZW0oZGV2KTsKKwl9CisKKwlwcml2LT5Td0NobmxJblByb2dyZXNzID0gZmFsc2U7CisJcmV0dXJuIHRydWU7Cit9CisKKworLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBDYWxsYmFjayByb3V0aW5lIG9mIHRoZSB3b3JrIGl0ZW0gZm9yIHNldCBiYW5kd2lkdGggbW9kZS4KKyAqICAgaW5wdXQ6ICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CisgKiAgIAkgICAgIEhUX0NIQU5ORUxfV0lEVEgJQmFuZHdpZHRoICAvLzIwTSBvciA0ME0KKyAqICAgCSAgICAgSFRfRVhUQ0hOTF9PRkZTRVQgT2Zmc2V0IAkgICAvL1VwcGVyLCBMb3dlciwgb3IgRG9uJ3QgY2FyZQorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgICBOb3RlOiAgSSBkb3VidCB3aGV0aGVyIFNldEJXTW9kZUluUHJvZ3Jlc3MgZmxhZyBpcyBuZWNlc3NhcnkgYXMgd2UgY2FuCisgKiAgICAJICAgICB0ZXN0IHdoZXRoZXIgY3VycmVudCB3b3JrIGluIHRoZSBxdWV1ZSBvciBub3QuLy9kbyBJPworICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBydGw4MTkyX1NldEJXTW9kZVdvcmtJdGVtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTggcmVnQndPcE1vZGU7CisKKwlSVF9UUkFDRShDT01QX1NXQlcsICI9PT5ydGw4MTkyX1NldEJXTW9kZVdvcmtJdGVtKCkgIFN3aXRjaCB0byAlcyBiYW5kd2lkdGhcbiIsIFwKKwkJCQkJcHJpdi0+Q3VycmVudENoYW5uZWxCVyA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwPyIyME1IeiI6IjQwTUh6IikKKworCisJaWYocHJpdi0+cmZfY2hpcCA9PSBSRl9QU0VVRE9fMTFOKQorCXsKKwkJcHJpdi0+U2V0QldNb2RlSW5Qcm9ncmVzcz0gZmFsc2U7CisJCXJldHVybjsKKwl9CisKKwkvLzwxPlNldCBNQUMgcmVnaXN0ZXIKKwlyZWdCd09wTW9kZSA9IHJlYWRfbmljX2J5dGUoZGV2LCBCV19PUE1PREUpOworCisJc3dpdGNoKHByaXYtPkN1cnJlbnRDaGFubmVsQlcpCisJeworCQljYXNlIEhUX0NIQU5ORUxfV0lEVEhfMjA6CisJCQlyZWdCd09wTW9kZSB8PSBCV19PUE1PREVfMjBNSFo7CisJCSAgICAgICAvLyAyMDA3LzAyLzA3IE1hcmsgYnkgRW1pbHkgYmVjYXN1ZSB3ZSBoYXZlIG5vdCB2ZXJpZnkgd2hldGhlciB0aGlzIHJlZ2lzdGVyIHdvcmtzCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEJXX09QTU9ERSwgcmVnQndPcE1vZGUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBIVF9DSEFOTkVMX1dJRFRIXzIwXzQwOgorCQkJcmVnQndPcE1vZGUgJj0gfkJXX09QTU9ERV8yME1IWjsKKwkJCS8vIDIwMDcvMDIvMDcgTWFyayBieSBFbWlseSBiZWNhc3VlIHdlIGhhdmUgbm90IHZlcmlmeSB3aGV0aGVyIHRoaXMgcmVnaXN0ZXIgd29ya3MKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgQldfT1BNT0RFLCByZWdCd09wTW9kZSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJTZXRDaGFubmVsQmFuZHdpZHRoODE5eFVzYigpOiB1bmtub3duIEJhbmR3aWR0aDogJSNYXG4iLHByaXYtPkN1cnJlbnRDaGFubmVsQlcpOworCQkJYnJlYWs7CisJfQorCisJLy88Mj5TZXQgUEhZIHJlbGF0ZWQgcmVnaXN0ZXIKKwlzd2l0Y2gocHJpdi0+Q3VycmVudENoYW5uZWxCVykKKwl7CisJCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF8yMDoKKwkJCS8vIEFkZCBieSBWaXZpIDIwMDcxMTE5CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0EwX1JGTU9ELCBiUkZNT0QsIDB4MCk7CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0ExX1JGTU9ELCBiUkZNT0QsIDB4MCk7CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjEsIDB4MDAxMDAwMDAsIDEpOworCisJCQkvLyBDb3JyZWN0IHRoZSB0eCBwb3dlciBmb3IgQ0NLIHJhdGUgaW4gMjBNLiBTdWdnZXN0IGJ5IFlOLCAyMDA3MTIwNworCQkJcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uID0KKwkJCQlwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25fMjBNZGVmYXVsdCArIHByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl9kaWZmZXJlbmNlOworCisJCQlpZihwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb24gPiAyMikKKwkJCQlwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb249IDIyOworCQkJaWYocHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uPCAwKQorCQkJCXByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbiA9IDA7CisJCQlSVF9UUkFDRShDT01QX0lOSVQsICIyME0sIHBIYWxEYXRhLT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uID0gJWRcbiIsIHByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbik7CisKKwkJCWlmKHByaXYtPmNoYW4gPT0gMTQgJiYgIXByaXYtPmJjY2tfaW5fY2gxNCkKKwkJCXsKKwkJCQlwcml2LT5iY2NrX2luX2NoMTQgPSBUUlVFOworCQkJCWRtX2Nja190eHBvd2VyX2FkanVzdChkZXYscHJpdi0+YmNja19pbl9jaDE0KTsKKwkJCX0KKwkJCWVsc2UgaWYocHJpdi0+Y2hhbiAhPSAxNCAmJiBwcml2LT5iY2NrX2luX2NoMTQpCisJCQl7CisJCQkJcHJpdi0+YmNja19pbl9jaDE0ID0gRkFMU0U7CisJCQkJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KGRldixwcml2LT5iY2NrX2luX2NoMTQpOworCQkJfQorCQkJZWxzZQorCQkJCWRtX2Nja190eHBvd2VyX2FkanVzdChkZXYscHJpdi0+YmNja19pbl9jaDE0KTsKKworCQkJYnJlYWs7CisJCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF8yMF80MDoKKwkJCS8vIEFkZCBieSBWaXZpIDIwMDcxMTE5CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0EwX1JGTU9ELCBiUkZNT0QsIDB4MSk7CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0ExX1JGTU9ELCBiUkZNT0QsIDB4MSk7CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfU3lzdGVtLCBiQ0NLU2lkZUJhbmQsIChwcml2LT5uQ3VyNDBNaHpQcmltZVNDPj4xKSk7CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjEsIDB4MDAxMDAwMDAsIDApOworCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMV9MU1RGLCAweEMwMCwgcHJpdi0+bkN1cjQwTWh6UHJpbWVTQyk7CisJCQlwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb24gPQorCQkJCXByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl80ME1kZWZhdWx0ICsgcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uX2RpZmZlcmVuY2U7CisKKwkJCWlmKHByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbiA+IDIyKQorCQkJCXByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbiA9IDIyOworCQkJaWYocHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uIDwgMCkKKwkJCQlwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb24gPSAwOworCisJCQlSVF9UUkFDRShDT01QX0lOSVQsICI0ME0sIHBIYWxEYXRhLT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uID0gJWRcbiIsIHByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbik7CisJCQlpZihwcml2LT5jaGFuID09IDE0ICYmICFwcml2LT5iY2NrX2luX2NoMTQpCisJCQl7CisJCQkJcHJpdi0+YmNja19pbl9jaDE0ID0gdHJ1ZTsKKwkJCQlkbV9jY2tfdHhwb3dlcl9hZGp1c3QoZGV2LHByaXYtPmJjY2tfaW5fY2gxNCk7CisJCQl9CisJCQllbHNlIGlmKHByaXYtPmNoYW4hPSAxNCAmJiBwcml2LT5iY2NrX2luX2NoMTQpCisJCQl7CisJCQkJcHJpdi0+YmNja19pbl9jaDE0ID0gZmFsc2U7CisJCQkJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KGRldixwcml2LT5iY2NrX2luX2NoMTQpOworCQkJfQorCQkJZWxzZQorCQkJCWRtX2Nja190eHBvd2VyX2FkanVzdChkZXYscHJpdi0+YmNja19pbl9jaDE0KTsKKworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlSVF9UUkFDRShDT01QX0VSUiwgIlNldENoYW5uZWxCYW5kd2lkdGg4MTl4VXNiKCk6IHVua25vd24gQmFuZHdpZHRoOiAlI1hcbiIgLHByaXYtPkN1cnJlbnRDaGFubmVsQlcpOworCQkJYnJlYWs7CisKKwl9CisJLy9Ta2lwIG92ZXIgc2V0dGluZyBvZiBKLW1vZGUgaW4gQkIgcmVnaXN0ZXIgaGVyZS4gRGVmYXVsdCB2YWx1ZSBpcyAiTm9uZSBKIG1vZGUiLiBFbWlseSAyMDA3MDMxNQorCisJLy88Mz5TZXQgUkYgcmVsYXRlZCByZWdpc3RlcgorCXN3aXRjaCggcHJpdi0+cmZfY2hpcCApCisJeworCQljYXNlIFJGXzgyMjU6CisjaWZkZWYgVE9fRE9fTElTVAorCQkJUEhZX1NldFJGODIyNUJhbmR3aWR0aChBZGFwdGVyLCBwSGFsRGF0YS0+Q3VycmVudENoYW5uZWxCVyk7CisjZW5kaWYKKwkJCWJyZWFrOworCisJCWNhc2UgUkZfODI1NjoKKwkJCVBIWV9TZXRSRjgyNTZCYW5kd2lkdGgoZGV2LCBwcml2LT5DdXJyZW50Q2hhbm5lbEJXKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUkZfODI1ODoKKwkJCS8vIFBIWV9TZXRSRjgyNThCYW5kd2lkdGgoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUkZfUFNFVURPXzExTjoKKwkJCS8vIERvIE5vdGhpbmcKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlSVF9UUkFDRShDT01QX0VSUiwgIlVua25vd24gUkZDaGlwSUQ6ICVkXG4iLCBwcml2LT5yZl9jaGlwKTsKKwkJCWJyZWFrOworCX0KKwlwcml2LT5TZXRCV01vZGVJblByb2dyZXNzPSBmYWxzZTsKKworCVJUX1RSQUNFKENPTVBfU1dCVywgIjw9PVNldEJXTW9kZTgxOXhVc2IoKSwgJWQiLCBhdG9taWNfcmVhZCgmKHByaXYtPmllZWU4MDIxMS0+YXRtX3N3YncpKSApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBzY2hlZHVsZXMgYmFuZHdpdGggc3dpdGNoIHdvcmsuCisgKiAgIGlucHV0OiAgc3RydWN0IG5ldF9kZXZpY2UgKmRldgorICogICAJICAgICBIVF9DSEFOTkVMX1dJRFRICUJhbmR3aWR0aCAgLy8yME0gb3IgNDBNCisgKiAgIAkgICAgIEhUX0VYVENITkxfT0ZGU0VUIE9mZnNldCAJICAgLy9VcHBlciwgTG93ZXIsIG9yIERvbid0IGNhcmUKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgbm9uZQorICogICAgTm90ZTogIEkgZG91YnQgd2hldGhlciBTZXRCV01vZGVJblByb2dyZXNzIGZsYWcgaXMgbmVjZXNzYXJ5IGFzIHdlIGNhbgorICogICAgCSAgICAgdGVzdCB3aGV0aGVyIGN1cnJlbnQgd29yayBpbiB0aGUgcXVldWUgb3Igbm90Li8vZG8gST8KKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcnRsODE5Ml9TZXRCV01vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgSFRfQ0hBTk5FTF9XSURUSAlCYW5kd2lkdGgsIEhUX0VYVENITkxfT0ZGU0VUIE9mZnNldCkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZihwcml2LT5TZXRCV01vZGVJblByb2dyZXNzKQorCQlyZXR1cm47CisJcHJpdi0+U2V0QldNb2RlSW5Qcm9ncmVzcz0gdHJ1ZTsKKworCXByaXYtPkN1cnJlbnRDaGFubmVsQlcgPSBCYW5kd2lkdGg7CisKKwlpZihPZmZzZXQ9PUhUX0VYVENITkxfT0ZGU0VUX0xPV0VSKQorCQlwcml2LT5uQ3VyNDBNaHpQcmltZVNDID0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX1VQUEVSOworCWVsc2UgaWYoT2Zmc2V0PT1IVF9FWFRDSE5MX09GRlNFVF9VUFBFUikKKwkJcHJpdi0+bkN1cjQwTWh6UHJpbWVTQyA9IEhBTF9QUklNRV9DSE5MX09GRlNFVF9MT1dFUjsKKwllbHNlCisJCXByaXYtPm5DdXI0ME1oelByaW1lU0MgPSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFOworCisJLy9xdWV1ZV93b3JrKHByaXYtPnByaXZfd3EsICYocHJpdi0+U2V0QldNb2RlV29ya0l0ZW0pKTsKKwkvLwlzY2hlZHVsZV93b3JrKCYocHJpdi0+U2V0QldNb2RlV29ya0l0ZW0pKTsKKwlydGw4MTkyX1NldEJXTW9kZVdvcmtJdGVtKGRldik7CisKK30KKwordm9pZCBJbml0aWFsR2FpbjgxOXhVc2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwJdTggT3BlcmF0aW9uKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXByaXYtPkluaXRpYWxHYWluT3BlcmF0ZVR5cGUgPSBPcGVyYXRpb247CisKKwlpZihwcml2LT51cCkKKwl7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT5wcml2X3dxLCZwcml2LT5pbml0aWFsZ2Fpbl9vcGVyYXRlX3dxLDApOworCX0KK30KKworZXh0ZXJuIHZvaWQgSW5pdGlhbEdhaW5PcGVyYXRlV29ya0l0ZW1DYWxsQmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yayxzdHJ1Y3QgZGVsYXllZF93b3JrLHdvcmspOworICAgICAgIHN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGR3b3JrLHN0cnVjdCByODE5Ml9wcml2LGluaXRpYWxnYWluX29wZXJhdGVfd3EpOworICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5pZWVlODAyMTEtPmRldjsKKyNkZWZpbmUgU0NBTl9SWF9JTklUSUFMX0dBSU4JMHgxNworI2RlZmluZSBQT1dFUl9ERVRFQ1RJT05fVEgJMHgwOAorCXUzMglCaXRNYXNrOworCXU4CWluaXRpYWxfZ2FpbjsKKwl1OAlPcGVyYXRpb247CisKKwlPcGVyYXRpb24gPSBwcml2LT5Jbml0aWFsR2Fpbk9wZXJhdGVUeXBlOworCisJc3dpdGNoKE9wZXJhdGlvbikKKwl7CisJCWNhc2UgSUdfQmFja3VwOgorCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiSUdfQmFja3VwLCBiYWNrdXAgdGhlIGluaXRpYWwgZ2Fpbi5cbiIpOworCQkJaW5pdGlhbF9nYWluID0gU0NBTl9SWF9JTklUSUFMX0dBSU47Ly9wcml2LT5EZWZhdWx0SW5pdGlhbEdhaW5bMF07Ly8KKwkJCUJpdE1hc2sgPSBiTWFza0J5dGUwOworCQkJaWYoZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobSA9PSBESUdfQUxHT19CWV9GQUxTRV9BTEFSTSkKKwkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgVUZXUCwgYk1hc2tCeXRlMSwgMHg4KTsJLy8gRlcgRElHIE9GRgorCQkJcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhhYWdjY29yZTEgPSAodTgpcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwgck9GRE0wX1hBQUdDQ29yZTEsIEJpdE1hc2spOworCQkJcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhiYWdjY29yZTEgPSAodTgpcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwgck9GRE0wX1hCQUdDQ29yZTEsIEJpdE1hc2spOworCQkJcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhjYWdjY29yZTEgPSAodTgpcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwgck9GRE0wX1hDQUdDQ29yZTEsIEJpdE1hc2spOworCQkJcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhkYWdjY29yZTEgPSAodTgpcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwgck9GRE0wX1hEQUdDQ29yZTEsIEJpdE1hc2spOworCQkJQml0TWFzayAgPSBiTWFza0J5dGUyOworCQkJcHJpdi0+aW5pdGdhaW5fYmFja3VwLmNjYQkJPSAodTgpcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwgckNDSzBfQ0NBLCBCaXRNYXNrKTsKKworCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiU2NhbiBJbml0aWFsR2FpbkJhY2t1cCAweGM1MCBpcyAleFxuIixwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGFhZ2Njb3JlMSk7CisJCQlSVF9UUkFDRShDT01QX1NDQU4sICJTY2FuIEluaXRpYWxHYWluQmFja3VwIDB4YzU4IGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC54YmFnY2NvcmUxKTsKKwkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIlNjYW4gSW5pdGlhbEdhaW5CYWNrdXAgMHhjNjAgaXMgJXhcbiIscHJpdi0+aW5pdGdhaW5fYmFja3VwLnhjYWdjY29yZTEpOworCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiU2NhbiBJbml0aWFsR2FpbkJhY2t1cCAweGM2OCBpcyAleFxuIixwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGRhZ2Njb3JlMSk7CisJCQlSVF9UUkFDRShDT01QX1NDQU4sICJTY2FuIEluaXRpYWxHYWluQmFja3VwIDB4YTBhIGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC5jY2EpOworCisJCQlSVF9UUkFDRShDT01QX1NDQU4sICJXcml0ZSBzY2FuIGluaXRpYWwgZ2FpbiA9IDB4JXggXG4iLCBpbml0aWFsX2dhaW4pOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWEFBR0NDb3JlMSwgaW5pdGlhbF9nYWluKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hCQUdDQ29yZTEsIGluaXRpYWxfZ2Fpbik7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQ0FHQ0NvcmUxLCBpbml0aWFsX2dhaW4pOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWERBR0NDb3JlMSwgaW5pdGlhbF9nYWluKTsKKwkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIldyaXRlIHNjYW4gMHhhMGEgPSAweCV4IFxuIiwgUE9XRVJfREVURUNUSU9OX1RIKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgMHhhMGEsIFBPV0VSX0RFVEVDVElPTl9USCk7CisJCQlicmVhazsKKwkJY2FzZSBJR19SZXN0b3JlOgorCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiSUdfUmVzdG9yZSwgcmVzdG9yZSB0aGUgaW5pdGlhbCBnYWluLlxuIik7CisJCQlCaXRNYXNrID0gMHg3ZjsgLy9CaXQwfiBCaXQ2CisJCQlpZihkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtID09IERJR19BTEdPX0JZX0ZBTFNFX0FMQVJNKQorCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBVRldQLCBiTWFza0J5dGUxLCAweDgpOwkvLyBGVyBESUcgT0ZGCisKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWEFBR0NDb3JlMSwgQml0TWFzaywgKHUzMilwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGFhZ2Njb3JlMSk7CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1hCQUdDQ29yZTEsIEJpdE1hc2ssICh1MzIpcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhiYWdjY29yZTEpOworCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQ0FHQ0NvcmUxLCBCaXRNYXNrLCAodTMyKXByaXYtPmluaXRnYWluX2JhY2t1cC54Y2FnY2NvcmUxKTsKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWERBR0NDb3JlMSwgQml0TWFzaywgKHUzMilwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGRhZ2Njb3JlMSk7CisJCQlCaXRNYXNrICA9IGJNYXNrQnl0ZTI7CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfQ0NBLCBCaXRNYXNrLCAodTMyKXByaXYtPmluaXRnYWluX2JhY2t1cC5jY2EpOworCisJCQlSVF9UUkFDRShDT01QX1NDQU4sICJTY2FuIEJCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YzUwIGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC54YWFnY2NvcmUxKTsKKwkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIlNjYW4gQkJJbml0aWFsR2FpblJlc3RvcmUgMHhjNTggaXMgJXhcbiIscHJpdi0+aW5pdGdhaW5fYmFja3VwLnhiYWdjY29yZTEpOworCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiU2NhbiBCQkluaXRpYWxHYWluUmVzdG9yZSAweGM2MCBpcyAleFxuIixwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGNhZ2Njb3JlMSk7CisJCQlSVF9UUkFDRShDT01QX1NDQU4sICJTY2FuIEJCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YzY4IGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC54ZGFnY2NvcmUxKTsKKwkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIlNjYW4gQkJJbml0aWFsR2FpblJlc3RvcmUgMHhhMGEgaXMgJXhcbiIscHJpdi0+aW5pdGdhaW5fYmFja3VwLmNjYSk7CisKKyNpZmRlZiBSVEw4MTkwUAorCQkJU2V0VHhQb3dlckxldmVsODE5MChBZGFwdGVyLHByaXYtPkN1cnJlbnRDaGFubmVsKTsKKyNlbmRpZgorI2lmZGVmIFJUTDgxOTJFCisJCQlTZXRUeFBvd2VyTGV2ZWw4MTkwKEFkYXB0ZXIscHJpdi0+Q3VycmVudENoYW5uZWwpOworI2VuZGlmCisvLyNpZmRlZiBSVEw4MTkyVQorCQkJcnRsODE5Ml9waHlfc2V0VHhQb3dlcihkZXYscHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisvLyNlbmRpZgorCisJCQlpZihkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtID09IERJR19BTEdPX0JZX0ZBTFNFX0FMQVJNKQorCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBVRldQLCBiTWFza0J5dGUxLCAweDEpOwkvLyBGVyBESUcgT04KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiVW5rbm93biBJRyBPcGVyYXRpb24uIFxuIik7CisJCQlicmVhazsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfcGh5LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX3BoeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlM2JjNTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX3BoeS5oCkBAIC0wLDAgKzEsOTAgQEAKKyNpZm5kZWYgX1I4MTlYVV9QSFlfSAorI2RlZmluZSBfUjgxOVhVX1BIWV9ICisKKy8qIENoYW5uZWwgc3dpdGNoOlRoZSBzaXplIG9mIGNvbW1hbmQgdGFibGVzIGZvciBzd2l0Y2ggY2hhbm5lbCovCisjZGVmaW5lIE1BWF9QUkVDTURfQ05UIDE2CisjZGVmaW5lIE1BWF9SRkRFUEVORENNRF9DTlQgMTYKKyNkZWZpbmUgTUFYX1BPU1RDTURfQ05UIDE2CisKK3R5cGVkZWYgZW51bSBfU3dDaG5sQ21kSUR7CisJQ21kSURfRW5kLAorCUNtZElEX1NldFR4UG93ZXJMZXZlbCwKKwlDbWRJRF9CQlJlZ1dyaXRlMTAsCisJQ21kSURfV3JpdGVQb3J0VWxvbmcsCisJQ21kSURfV3JpdGVQb3J0VXNob3J0LAorCUNtZElEX1dyaXRlUG9ydFVjaGFyLAorCUNtZElEX1JGX1dyaXRlUmVnLAorfVN3Q2hubENtZElEOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIHN0cnVjdHVyZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIDEuIFN3aXRjaCBjaGFubmVsIHJlbGF0ZWQgKi8KK3R5cGVkZWYgc3RydWN0IF9Td0NobmxDbWR7CisJU3dDaG5sQ21kSUQJQ21kSUQ7CisJdTMyCQkJUGFyYTE7CisJdTMyCQkJUGFyYTI7CisJdTMyCQkJbXNEZWxheTsKK31fX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgU3dDaG5sQ21kOworCitleHRlcm4gdTMyIHJ0bDgxOVhNQUNQSFlfQXJyYXlfUEdbXTsKK2V4dGVybiB1MzIgcnRsODE5WFBIWV9SRUdfMVQyUkFycmF5W107CitleHRlcm4gdTMyIHJ0bDgxOVhBR0NUQUJfQXJyYXlbXTsKK2V4dGVybiB1MzIgcnRsODE5WFJhZGlvQV9BcnJheVtdOworZXh0ZXJuIHUzMiBydGw4MTlYUmFkaW9CX0FycmF5W107CitleHRlcm4gdTMyIHJ0bDgxOVhSYWRpb0NfQXJyYXlbXTsKK2V4dGVybiB1MzIgcnRsODE5WFJhZGlvRF9BcnJheVtdOworCit0eXBlZGVmIGVudW0gX0hXOTBfQkxPQ0t7CisJSFc5MF9CTE9DS19NQUMgPSAwLAorCUhXOTBfQkxPQ0tfUEhZMCA9IDEsCisJSFc5MF9CTE9DS19QSFkxID0gMiwKKwlIVzkwX0JMT0NLX1JGID0gMywKKwlIVzkwX0JMT0NLX01BWElNVU0gPSA0LCAvLyBOZXZlciB1c2UgdGhpcworfUhXOTBfQkxPQ0tfRSwgKlBIVzkwX0JMT0NLX0U7CisKK3R5cGVkZWYgZW51bSBfUkY5MF9SQURJT19QQVRIeworCVJGOTBfUEFUSF9BID0gMCwJCQkvL1JhZGlvIFBhdGggQQorCVJGOTBfUEFUSF9CID0gMSwJCQkvL1JhZGlvIFBhdGggQgorCVJGOTBfUEFUSF9DID0gMiwJCQkvL1JhZGlvIFBhdGggQworCVJGOTBfUEFUSF9EID0gMywJCQkvL1JhZGlvIFBhdGggRAorCVJGOTBfUEFUSF9NQVgJCQkJLy9NYXggUkYgbnVtYmVyIDkyIHN1cHBvcnQKK31SRjkwX1JBRElPX1BBVEhfRSwgKlBSRjkwX1JBRElPX1BBVEhfRTsKKworI2RlZmluZSBiTWFza0J5dGUwICAgICAgICAgICAgICAgIDB4ZmYKKyNkZWZpbmUgYk1hc2tCeXRlMSAgICAgICAgICAgICAgICAweGZmMDAKKyNkZWZpbmUgYk1hc2tCeXRlMiAgICAgICAgICAgICAgICAweGZmMDAwMAorI2RlZmluZSBiTWFza0J5dGUzICAgICAgICAgICAgICAgIDB4ZmYwMDAwMDAKKyNkZWZpbmUgYk1hc2tIV29yZCAgICAgICAgICAgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIGJNYXNrTFdvcmQgICAgICAgICAgICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBiTWFza0RXb3JkICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKworLy9leHRlcm4gdTMyIHJ0bDgxOTJfQ2FsY3VsYXRlQml0U2hpZnQodTMyIGR3Qml0TWFzayk7CitleHRlcm4gdTggcnRsODE5Ml9waHlfQ2hlY2tJc0xlZ2FsUkZQYXRoKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHUzMiBlUkZQYXRoKTsKK2V4dGVybiB2b2lkIHJ0bDgxOTJfc2V0QkJyZWcoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdTMyIGR3UmVnQWRkciwgdTMyIGR3Qml0TWFzaywgdTMyIGR3RGF0YSk7CitleHRlcm4gdTMyIHJ0bDgxOTJfUXVlcnlCQlJlZyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1MzIgZHdSZWdBZGRyLCB1MzIgZHdCaXRNYXNrKTsKKy8vZXh0ZXJuIHUzMiBydGw4MTkyX3BoeV9SRlNlcmlhbFJlYWQoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCwgdTMyIE9mZnNldCk7CisvL2V4dGVybiB2b2lkIHJ0bDgxOTJfcGh5X1JGU2VyaWFsV3JpdGUoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCwgdTMyIE9mZnNldCwgdTMyIERhdGEpOworZXh0ZXJuIHZvaWQgcnRsODE5Ml9waHlfU2V0UkZSZWcoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCwgdTMyIFJlZ0FkZHIsIHUzMiBCaXRNYXNrLCB1MzIgRGF0YSk7CitleHRlcm4gdTMyIHJ0bDgxOTJfcGh5X1F1ZXJ5UkZSZWcoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCwgdTMyIFJlZ0FkZHIsIHUzMiBCaXRNYXNrKTsKK2V4dGVybiB2b2lkIHJ0bDgxOTJfcGh5X2NvbmZpZ21hYyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK2V4dGVybiB2b2lkIHJ0bDgxOTJfcGh5Q29uZmlnQkIoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdTggQ29uZmlnVHlwZSk7CisvL2V4dGVybiB2b2lkIHJ0bDgxOTJfSW5pdEJCUkZSZWdEZWYoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitleHRlcm4gdTggcnRsODE5Ml9waHlfY2hlY2tCQkFuZFJGKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIEhXOTBfQkxPQ0tfRSBDaGVja0Jsb2NrLCBSRjkwX1JBRElPX1BBVEhfRSBlUkZQYXRoKTsKKy8vZXh0ZXJuIHZvaWQgcnRsODE5Ml9CQl9Db25maWdfUGFyYUZpbGUoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitleHRlcm4gdm9pZCBydGw4MTkyX0JCQ29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworZXh0ZXJuIHZvaWQgcnRsODE5Ml9waHlfZ2V0VHhQb3dlcihzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK2V4dGVybiB2b2lkIHJ0bDgxOTJfcGh5X3NldFR4UG93ZXIoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdTggY2hhbm5lbCk7CitleHRlcm4gdm9pZCBydGw4MTkyX3BoeV9SRkNvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK2V4dGVybiB2b2lkIHJ0bDgxOTJfcGh5X3VwZGF0ZUluaXRHYWluKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworZXh0ZXJuIHU4IHJ0bDgxOTJfcGh5X0NvbmZpZ1JGV2l0aEhlYWRlckZpbGUoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgUkY5MF9SQURJT19QQVRIX0UJZVJGUGF0aCk7CisKK2V4dGVybiB1OCBydGw4MTkyX3BoeV9Td0Nobmwoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdTggY2hhbm5lbCk7CitleHRlcm4gdm9pZCBydGw4MTkyX1NldEJXTW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBIVF9DSEFOTkVMX1dJRFRICUJhbmR3aWR0aCwgSFRfRVhUQ0hOTF9PRkZTRVQgT2Zmc2V0KTsKK2V4dGVybiB2b2lkIHJ0bDgxOTJfU3dDaG5sX1dvcmtJdGVtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTkyX1NldEJXTW9kZVdvcmtJdGVtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGJvb2wgcnRsODE5Ml9TZXRSRlBvd2VyU3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgUlRfUkZfUE9XRVJfU1RBVEUgZVJGUG93ZXJTdGF0ZSk7CisvL2FkZGVkIGJ5IGFteQorZXh0ZXJuIHZvaWQgSW5pdGlhbEdhaW44MTl4VXNiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCXU4IE9wZXJhdGlvbik7CisKK2V4dGVybiB2b2lkIEluaXRpYWxHYWluT3BlcmF0ZVdvcmtJdGVtQ2FsbEJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX3BoeXJlZy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9waHlyZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmIwYjUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9waHlyZWcuaApAQCAtMCwwICsxLDg3MSBAQAorI2lmbmRlZiBfUjgxOVhVX1BIWVJFR19ICisjZGVmaW5lIF9SODE5WFVfUEhZUkVHX0gKKworCisjZGVmaW5lICAgUkZfREFUQQkJCQkweDFkNAkJCQkJLy8gRlcgd2lsbCB3cml0ZSBSRiBkYXRhIGluIHRoZSByZWdpc3Rlci4KKworLy9SZWdpc3RlciAgIC8vZHVwbGljYXRlIHJlZ2lzdGVyIGR1ZSB0byBjb25uZWN0aW9uOiBSRl9Nb2RlLCBUUnhSTiwgTnVtT2YgTC1TVEYKKy8vcGFnZSAxCisjZGVmaW5lIHJQTUFDX1Jlc2V0ICAgICAgICAgICAgICAgCQkweDEwMAorI2RlZmluZSByUE1BQ19UeFN0YXJ0ICAgICAgICAgICAgIAkJMHgxMDQKKyNkZWZpbmUgclBNQUNfVHhMZWdhY3lTSUcgICAgICAgICAJCTB4MTA4CisjZGVmaW5lIHJQTUFDX1R4SFRTSUcxICAgICAgICAgICAgCQkweDEwYworI2RlZmluZSByUE1BQ19UeEhUU0lHMiAgICAgICAgICAgIAkJMHgxMTAKKyNkZWZpbmUgclBNQUNfUEhZRGVidWcgICAgICAgICAgICAJCTB4MTE0CisjZGVmaW5lIHJQTUFDX1R4UGFja2V0TnVtICAgICAgICAgCQkweDExOAorI2RlZmluZSByUE1BQ19UeElkbGUgICAgICAgICAgICAgIAkJMHgxMWMKKyNkZWZpbmUgclBNQUNfVHhNQUNIZWFkZXIwICAgICAgIAkweDEyMAorI2RlZmluZSByUE1BQ19UeE1BQ0hlYWRlcjEgICAgICAgCTB4MTI0CisjZGVmaW5lIHJQTUFDX1R4TUFDSGVhZGVyMiAgICAgICAJMHgxMjgKKyNkZWZpbmUgclBNQUNfVHhNQUNIZWFkZXIzICAgICAgIAkweDEyYworI2RlZmluZSByUE1BQ19UeE1BQ0hlYWRlcjQgICAgICAgCTB4MTMwCisjZGVmaW5lIHJQTUFDX1R4TUFDSGVhZGVyNSAgICAgICAJMHgxMzQKKyNkZWZpbmUgclBNQUNfVHhEYXRhVHlwZSAgICAgICAgICAJCTB4MTM4CisjZGVmaW5lIHJQTUFDX1R4UmFuZG9tU2VlZCAgICAgIAkJMHgxM2MKKyNkZWZpbmUgclBNQUNfQ0NLUExDUFByZWFtYmxlICAJCTB4MTQwCisjZGVmaW5lIHJQTUFDX0NDS1BMQ1BIZWFkZXIgICAgIAkJMHgxNDQKKyNkZWZpbmUgclBNQUNfQ0NLQ1JDMTYgICAgICAgICAgICAJCTB4MTQ4CisjZGVmaW5lIHJQTUFDX09GRE1SeENSQzMyT0sgIAkJMHgxNzAKKyNkZWZpbmUgclBNQUNfT0ZETVJ4Q1JDMzJFciAgIAkJMHgxNzQKKyNkZWZpbmUgclBNQUNfT0ZETVJ4UGFyaXR5RXIgICAgCQkweDE3OAorI2RlZmluZSByUE1BQ19PRkRNUnhDUkM4RXIgICAgIAkJMHgxN2MKKyNkZWZpbmUgclBNQUNfQ0NLQ1J4UkMxNkVyICAgICAgIAkJMHgxODAKKyNkZWZpbmUgclBNQUNfQ0NLQ1J4UkMzMkVyICAgICAgIAkJMHgxODQKKyNkZWZpbmUgclBNQUNfQ0NLQ1J4UkMzMk9LICAgICAgCQkweDE4OAorI2RlZmluZSByUE1BQ19UeFN0YXR1cyAgICAgICAgICAgIAkJMHgxOGMKKworLy9wYWdlOAorI2RlZmluZSByRlBHQTBfUkZNT0QgICAgICAgICAgICAgIAkJMHg4MDAgIC8vUkYgbW9kZSAmIENDSyBUeFNDCisjZGVmaW5lIHJGUEdBMF9UeEluZm8gICAgICAgICAgICAgCQkweDgwNAorI2RlZmluZSByRlBHQTBfUFNERnVuY3Rpb24gICAgICAgIAkJMHg4MDgKKyNkZWZpbmUgckZQR0EwX1R4R2FpblN0YWdlICAgICAgICAJCTB4ODBjCisjZGVmaW5lIHJGUEdBMF9SRlRpbWluZzEgICAgICAgICAgCQkweDgxMAorI2RlZmluZSByRlBHQTBfUkZUaW1pbmcyICAgICAgICAgIAkJMHg4MTQKKy8vI2RlZmluZSByRlBHQTBfWENfUkZUaW1pbmcgICAgICAgIAkJMHg4MTgKKy8vI2RlZmluZSByRlBHQTBfWERfUkZUaW1pbmcgICAgICAgIAkJMHg4MWMKKyNkZWZpbmUgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIxICAJMHg4MjAKKyNkZWZpbmUgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIyICAJMHg4MjQKKyNkZWZpbmUgckZQR0EwX1hCX0hTU0lQYXJhbWV0ZXIxICAJMHg4MjgKKyNkZWZpbmUgckZQR0EwX1hCX0hTU0lQYXJhbWV0ZXIyICAJMHg4MmMKKyNkZWZpbmUgckZQR0EwX1hDX0hTU0lQYXJhbWV0ZXIxICAJMHg4MzAKKyNkZWZpbmUgckZQR0EwX1hDX0hTU0lQYXJhbWV0ZXIyICAJMHg4MzQKKyNkZWZpbmUgckZQR0EwX1hEX0hTU0lQYXJhbWV0ZXIxICAJMHg4MzgKKyNkZWZpbmUgckZQR0EwX1hEX0hTU0lQYXJhbWV0ZXIyICAJMHg4M2MKKyNkZWZpbmUgckZQR0EwX1hBX0xTU0lQYXJhbWV0ZXIgICAJMHg4NDAKKyNkZWZpbmUgckZQR0EwX1hCX0xTU0lQYXJhbWV0ZXIgICAJMHg4NDQKKyNkZWZpbmUgckZQR0EwX1hDX0xTU0lQYXJhbWV0ZXIgICAJMHg4NDgKKyNkZWZpbmUgckZQR0EwX1hEX0xTU0lQYXJhbWV0ZXIgICAJMHg4NGMKKyNkZWZpbmUgckZQR0EwX1JGV2FrZVVwUGFyYW1ldGVyICAJMHg4NTAKKyNkZWZpbmUgckZQR0EwX1JGU2xlZXBVcFBhcmFtZXRlciAJMHg4NTQKKyNkZWZpbmUgckZQR0EwX1hBQl9Td2l0Y2hDb250cm9sICAJMHg4NTgKKyNkZWZpbmUgckZQR0EwX1hDRF9Td2l0Y2hDb250cm9sICAJMHg4NWMKKyNkZWZpbmUgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UgICAJMHg4NjAKKyNkZWZpbmUgckZQR0EwX1hCX1JGSW50ZXJmYWNlT0UgICAJMHg4NjQKKyNkZWZpbmUgckZQR0EwX1hDX1JGSW50ZXJmYWNlT0UgICAJMHg4NjgKKyNkZWZpbmUgckZQR0EwX1hEX1JGSW50ZXJmYWNlT0UgICAJMHg4NmMKKyNkZWZpbmUgckZQR0EwX1hBQl9SRkludGVyZmFjZVNXICAJMHg4NzAKKyNkZWZpbmUgckZQR0EwX1hDRF9SRkludGVyZmFjZVNXICAJMHg4NzQKKyNkZWZpbmUgckZQR0EwX1hBQl9SRlBhcmFtZXRlciAgICAJMHg4NzgKKyNkZWZpbmUgckZQR0EwX1hDRF9SRlBhcmFtZXRlciAgICAJMHg4N2MKKyNkZWZpbmUgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjEgICAJMHg4ODAKKyNkZWZpbmUgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjIgICAJMHg4ODQKKyNkZWZpbmUgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjMgICAJMHg4ODgKKyNkZWZpbmUgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjQgICAJMHg4OGMKKyNkZWZpbmUgckZQR0EwX1hBX0xTU0lSZWFkQmFjayAgICAJMHg4YTAKKyNkZWZpbmUgckZQR0EwX1hCX0xTU0lSZWFkQmFjayAgICAJMHg4YTQKKyNkZWZpbmUgckZQR0EwX1hDX0xTU0lSZWFkQmFjayAgICAJMHg4YTgKKyNkZWZpbmUgckZQR0EwX1hEX0xTU0lSZWFkQmFjayAgICAJMHg4YWMKKyNkZWZpbmUgckZQR0EwX1BTRFJlcG9ydCAgICAgICAgICAJCTB4OGI0CisjZGVmaW5lIHJGUEdBMF9YQUJfUkZJbnRlcmZhY2VSQiAgCTB4OGUwCisjZGVmaW5lIHJGUEdBMF9YQ0RfUkZJbnRlcmZhY2VSQiAgCTB4OGU0CisKKy8vcGFnZSA5CisjZGVmaW5lIHJGUEdBMV9SRk1PRCAgICAgICAgICAgICAgCQkweDkwMCAgLy9SRiBtb2RlICYgT0ZETSBUeFNDCisjZGVmaW5lIHJGUEdBMV9UeEJsb2NrICAgICAgICAgICAgCQkweDkwNAorI2RlZmluZSByRlBHQTFfRGVidWdTZWxlY3QgICAgICAgIAkJMHg5MDgKKyNkZWZpbmUgckZQR0ExX1R4SW5mbyAgICAgICAgICAgICAJCTB4OTBjCisKKy8vcGFnZSBhCisjZGVmaW5lIHJDQ0swX1N5c3RlbSAgICAgICAgICAgICAgCQkweGEwMAorI2RlZmluZSByQ0NLMF9BRkVTZXR0aW5nICAgICAgICAgIAkJMHhhMDQKKyNkZWZpbmUgckNDSzBfQ0NBICAgICAgICAgICAgICAgICAJCQkweGEwOAorI2RlZmluZSByQ0NLMF9SeEFHQzEgICAgICAgICAgICAgIAkJMHhhMGMgIC8vQUdDIGRlZmF1bHQgdmFsdWUsIHNhdHVyYXRpb24gbGV2ZWwKKyNkZWZpbmUgckNDSzBfUnhBR0MyICAgICAgICAgICAgICAJCTB4YTEwICAvL0FHQyAmIERBR0MKKyNkZWZpbmUgckNDSzBfUnhIUCAgICAgICAgICAgICAgICAJCTB4YTE0CisjZGVmaW5lIHJDQ0swX0RTUFBhcmFtZXRlcjEgICAgICAgCTB4YTE4ICAvL1RpbWluZyByZWNvdmVyeSAmIENoYW5uZWwgZXN0aW1hdGlvbiB0aHJlc2hvbGQKKyNkZWZpbmUgckNDSzBfRFNQUGFyYW1ldGVyMiAgICAgICAJMHhhMWMgIC8vU1EgdGhyZXNob2xkCisjZGVmaW5lIHJDQ0swX1R4RmlsdGVyMSAgICAgICAgICAgCQkweGEyMAorI2RlZmluZSByQ0NLMF9UeEZpbHRlcjIgICAgICAgICAgIAkJMHhhMjQKKyNkZWZpbmUgckNDSzBfRGVidWdQb3J0ICAgICAgICAgICAJCTB4YTI4ICAvL2RlYnVnIHBvcnQgYW5kIFR4IGZpbHRlcjMKKyNkZWZpbmUgckNDSzBfRmFsc2VBbGFybVJlcG9ydCAgICAJMHhhMmMgIC8vMHhhMmQKKyNkZWZpbmUgckNDSzBfVFJTU0lSZXBvcnQgICAgICAgICAJCTB4YTUwCisjZGVmaW5lIHJDQ0swX1J4UmVwb3J0ICAgICAgICAgICAgCQkweGE1NCAgLy8weGE1NworI2RlZmluZSByQ0NLMF9GQUNvdW50ZXJMb3dlciAgICAgIAkweGE1YyAgLy8weGE1YgorI2RlZmluZSByQ0NLMF9GQUNvdW50ZXJVcHBlciAgICAgIAkweGE1OCAgLy8weGE1YworCisvL3BhZ2UgYworI2RlZmluZSByT0ZETTBfTFNURiAgICAgICAgICAgICAgIAkJMHhjMDAKKyNkZWZpbmUgck9GRE0wX1RSeFBhdGhFbmFibGUgICAgICAJMHhjMDQKKyNkZWZpbmUgck9GRE0wX1RSTXV4UGFyICAgICAgICAgICAJCTB4YzA4CisjZGVmaW5lIHJPRkRNMF9UUlNXSXNvbGF0aW9uICAgICAgCQkweGMwYworI2RlZmluZSByT0ZETTBfWEFSeEFGRSAgICAgICAgICAgIAkJMHhjMTAgIC8vUnhJUSBEQyBvZmZzZXQsIFJ4IGRpZ2l0YWwgZmlsdGVyLCBEQyBub3RjaCBmaWx0ZXIKKyNkZWZpbmUgck9GRE0wX1hBUnhJUUltYmFsYW5jZSAgICAJMHhjMTQgIC8vUnhJUSBpbWJsYW5jZSBtYXRyaXgKKyNkZWZpbmUgck9GRE0wX1hCUnhBRkUgICAgICAgICAgICAJCTB4YzE4CisjZGVmaW5lIHJPRkRNMF9YQlJ4SVFJbWJhbGFuY2UgICAgCTB4YzFjCisjZGVmaW5lIHJPRkRNMF9YQ1J4QUZFICAgICAgICAgICAgCQkweGMyMAorI2RlZmluZSByT0ZETTBfWENSeElRSW1iYWxhbmNlICAgIAkweGMyNAorI2RlZmluZSByT0ZETTBfWERSeEFGRSAgICAgICAgICAgIAkJMHhjMjgKKyNkZWZpbmUgck9GRE0wX1hEUnhJUUltYmFsYW5jZSAgICAJMHhjMmMKKyNkZWZpbmUgck9GRE0wX1J4RGV0ZWN0b3IxICAgICAgICAJCTB4YzMwICAvL1BELEJXICYgU0JECisjZGVmaW5lIHJPRkRNMF9SeERldGVjdG9yMiAgICAgICAgCQkweGMzNCAgLy9TQkQgJiBGYW1lIFN5bmMuCisjZGVmaW5lIHJPRkRNMF9SeERldGVjdG9yMyAgICAgICAgCQkweGMzOCAgLy9GcmFtZSBTeW5jLgorI2RlZmluZSByT0ZETTBfUnhEZXRlY3RvcjQgICAgICAgIAkJMHhjM2MgIC8vUEQsIFNCRCwgRnJhbWUgU3luYyAmIFNob3J0LUdJCisjZGVmaW5lIHJPRkRNMF9SeERTUCAgICAgICAgICAgICAgCQkweGM0MCAgLy9SeCBTeW5jIFBhdGgKKyNkZWZpbmUgck9GRE0wX0NGT2FuZERBR0MgICAgICAgICAJMHhjNDQgIC8vQ0ZPICYgREFHQworI2RlZmluZSByT0ZETTBfQ0NBRHJvcFRocmVzaG9sZCAgIAkweGM0OCAvL0NDQSBEcm9wIHRocmVzaG9sZAorI2RlZmluZSByT0ZETTBfRUNDQVRocmVzaG9sZCAgICAgIAkweGM0YyAvLyBlbmVyZ3kgQ0NBCisjZGVmaW5lIHJPRkRNMF9YQUFHQ0NvcmUxICAgICAgICAgCTB4YzUwCisjZGVmaW5lIHJPRkRNMF9YQUFHQ0NvcmUyICAgICAgICAgCTB4YzU0CisjZGVmaW5lIHJPRkRNMF9YQkFHQ0NvcmUxICAgICAgICAgCTB4YzU4CisjZGVmaW5lIHJPRkRNMF9YQkFHQ0NvcmUyICAgICAgICAgCTB4YzVjCisjZGVmaW5lIHJPRkRNMF9YQ0FHQ0NvcmUxICAgICAgICAgCTB4YzYwCisjZGVmaW5lIHJPRkRNMF9YQ0FHQ0NvcmUyICAgICAgICAgCTB4YzY0CisjZGVmaW5lIHJPRkRNMF9YREFHQ0NvcmUxICAgICAgICAgCTB4YzY4CisjZGVmaW5lIHJPRkRNMF9YREFHQ0NvcmUyICAgICAgICAgCTB4YzZjCisjZGVmaW5lIHJPRkRNMF9BR0NQYXJhbWV0ZXIxICAgICAgCTB4YzcwCisjZGVmaW5lIHJPRkRNMF9BR0NQYXJhbWV0ZXIyICAgICAgCTB4Yzc0CisjZGVmaW5lIHJPRkRNMF9BR0NSU1NJVGFibGUgICAgICAgCTB4Yzc4CisjZGVmaW5lIHJPRkRNMF9IVFNURkFHQyAgICAgICAgICAgCQkweGM3YworI2RlZmluZSByT0ZETTBfWEFUeElRSW1iYWxhbmNlICAgCTB4YzgwCisjZGVmaW5lIHJPRkRNMF9YQVR4QUZFICAgICAgICAgICAgCQkweGM4NAorI2RlZmluZSByT0ZETTBfWEJUeElRSW1iYWxhbmNlICAgIAkweGM4OAorI2RlZmluZSByT0ZETTBfWEJUeEFGRSAgICAgICAgICAgIAkJMHhjOGMKKyNkZWZpbmUgck9GRE0wX1hDVHhJUUltYmFsYW5jZSAgICAJMHhjOTAKKyNkZWZpbmUgck9GRE0wX1hDVHhBRkUgICAgICAgICAgICAJCTB4Yzk0CisjZGVmaW5lIHJPRkRNMF9YRFR4SVFJbWJhbGFuY2UgICAgCTB4Yzk4CisjZGVmaW5lIHJPRkRNMF9YRFR4QUZFICAgICAgICAgICAgCQkweGM5YworI2RlZmluZSByT0ZETTBfUnhIUFBhcmFtZXRlciAgICAgIAkweGNlMAorI2RlZmluZSByT0ZETTBfVHhQc2V1ZG9Ob2lzZVdndCAgIAkweGNlNAorI2RlZmluZSByT0ZETTBfRnJhbWVTeW5jICAgICAgICAgIAkJMHhjZjAKKyNkZWZpbmUgck9GRE0wX0RGU1JlcG9ydCAgICAgICAgICAJCTB4Y2Y0CisjZGVmaW5lIHJPRkRNMF9UeENvZWZmMSAgICAgICAgICAgCQkweGNhNAorI2RlZmluZSByT0ZETTBfVHhDb2VmZjIgICAgICAgICAgIAkJMHhjYTgKKyNkZWZpbmUgck9GRE0wX1R4Q29lZmYzICAgICAgICAgICAJCTB4Y2FjCisjZGVmaW5lIHJPRkRNMF9UeENvZWZmNCAgICAgICAgICAgCQkweGNiMAorI2RlZmluZSByT0ZETTBfVHhDb2VmZjUgICAgICAgICAgIAkJMHhjYjQKKyNkZWZpbmUgck9GRE0wX1R4Q29lZmY2ICAgICAgICAgICAJCTB4Y2I4CisKKworLy9wYWdlIGQKKyNkZWZpbmUgck9GRE0xX0xTVEYgICAgICAgICAgICAgICAJCTB4ZDAwCisjZGVmaW5lIHJPRkRNMV9UUnhQYXRoRW5hYmxlICAgICAgCTB4ZDA0CisjZGVmaW5lIHJPRkRNMV9DRk8gICAgICAgICAgICAgICAgCQkweGQwOAorI2RlZmluZSByT0ZETTFfQ1NJMSAgICAgICAgICAgICAgIAkJMHhkMTAKKyNkZWZpbmUgck9GRE0xX1NCRCAgICAgICAgICAgICAgICAJCTB4ZDE0CisjZGVmaW5lIHJPRkRNMV9DU0kyICAgICAgICAgICAgICAgCQkweGQxOAorI2RlZmluZSByT0ZETTFfQ0ZPVHJhY2tpbmcgICAgICAgIAkJMHhkMmMKKyNkZWZpbmUgck9GRE0xX1RSeE1lc2F1cmUxICAgICAgICAJMHhkMzQKKyNkZWZpbmUgck9GRE0xX0ludGZEZXQgICAgICAgICAgICAJCTB4ZDNjCisjZGVmaW5lIHJPRkRNMV9Qc2V1ZG9Ob2lzZVN0YXRlQUIgMHhkNTAKKyNkZWZpbmUgck9GRE0xX1BzZXVkb05vaXNlU3RhdGVDRCAweGQ1NAorI2RlZmluZSByT0ZETTFfUnhQc2V1ZG9Ob2lzZVdndCAgIDB4ZDU4CisjZGVmaW5lIHJPRkRNX1BIWUNvdW50ZXIxICAgICAgICAgCQkweGRhMCAgLy9jY2EsIHBhcml0eSBmYWlsCisjZGVmaW5lIHJPRkRNX1BIWUNvdW50ZXIyICAgICAgICAgCQkweGRhNCAgLy9yYXRlIGlsbGVnYWwsIGNyYzggZmFpbAorI2RlZmluZSByT0ZETV9QSFlDb3VudGVyMyAgICAgICAgIAkJMHhkYTggIC8vTUNTIG5vdCBzdXBwb3J0CisjZGVmaW5lIHJPRkRNX1Nob3J0Q0ZPQUIgICAgICAgICAgCQkweGRhYworI2RlZmluZSByT0ZETV9TaG9ydENGT0NEICAgICAgICAgIAkJMHhkYjAKKyNkZWZpbmUgck9GRE1fTG9uZ0NGT0FCICAgICAgICAgICAJCTB4ZGI0CisjZGVmaW5lIHJPRkRNX0xvbmdDRk9DRCAgICAgICAgICAgCQkweGRiOAorI2RlZmluZSByT0ZETV9UYWlsQ0ZPQUIgICAgICAgICAgIAkJMHhkYmMKKyNkZWZpbmUgck9GRE1fVGFpbENGT0NEICAgICAgICAgICAJCTB4ZGMwCisjZGVmaW5lIHJPRkRNX1BXTWVhc3VyZTEgICAgICAgICAgCTB4ZGM0CisjZGVmaW5lIHJPRkRNX1BXTWVhc3VyZTIgICAgICAgICAgCTB4ZGM4CisjZGVmaW5lIHJPRkRNX0JXUmVwb3J0ICAgICAgICAgICAgCQkweGRjYworI2RlZmluZSByT0ZETV9BR0NSZXBvcnQgICAgICAgICAgIAkJMHhkZDAKKyNkZWZpbmUgck9GRE1fUnhTTlIgICAgICAgICAgICAgICAJCTB4ZGQ0CisjZGVmaW5lIHJPRkRNX1J4RVZNQ1NJICAgICAgICAgICAgCQkweGRkOAorI2RlZmluZSByT0ZETV9TSUdSZXBvcnQgICAgICAgICAgIAkJMHhkZGMKKworLy9wYWdlIGUKKyNkZWZpbmUgclR4QUdDX1JhdGUxOF8wNgkJCTB4ZTAwCisjZGVmaW5lIHJUeEFHQ19SYXRlNTRfMjQJCQkweGUwNAorI2RlZmluZSByVHhBR0NfQ0NLX01jczMyCQkJMHhlMDgKKyNkZWZpbmUgclR4QUdDX01jczAzX01jczAwCQkJMHhlMTAKKyNkZWZpbmUgclR4QUdDX01jczA3X01jczA0CQkJMHhlMTQKKyNkZWZpbmUgclR4QUdDX01jczExX01jczA4CQkJMHhlMTgKKyNkZWZpbmUgclR4QUdDX01jczE1X01jczEyCQkJMHhlMWMKKworCisvL1JGCisvL1plYnJhMQorI2RlZmluZSByWmVicmExX0hTU0lFbmFibGUgICAgICAgICAgICAJMHgwCisjZGVmaW5lIHJaZWJyYTFfVFJ4RW5hYmxlMSAgICAgICAgICAgIAkweDEKKyNkZWZpbmUgclplYnJhMV9UUnhFbmFibGUyICAgICAgICAgICAJMHgyCisjZGVmaW5lIHJaZWJyYTFfQUdDICAgICAgICAgICAgICAgICAgIAkJMHg0CisjZGVmaW5lIHJaZWJyYTFfQ2hhcmdlUHVtcCAgICAgICAgICAgIAkweDUKKyNkZWZpbmUgclplYnJhMV9DaGFubmVsICAgICAgICAgICAgICAgCQkweDcKKyNkZWZpbmUgclplYnJhMV9UeEdhaW4gICAgICAgICAgICAgICAJCTB4OAorI2RlZmluZSByWmVicmExX1R4TFBGICAgICAgICAgICAgICAgICAJCTB4OQorI2RlZmluZSByWmVicmExX1J4TFBGICAgICAgICAgICAgICAgICAJCTB4YgorI2RlZmluZSByWmVicmExX1J4SFBGQ29ybmVyICAgICAgICAgICAJMHhjCisKKy8vWmVicmE0CisjZGVmaW5lIHJHbG9iYWxDdHJsICAgICAgICAgICAgICAgICAgIAkJMAorI2RlZmluZSByUlRMODI1Nl9UeExQRiAgICAgICAgICAgICAgICAJCTE5CisjZGVmaW5lIHJSVEw4MjU2X1J4TFBGICAgICAgICAgICAgICAgIAkJMTEKKworLy9SVEw4MjU4CisjZGVmaW5lIHJSVEw4MjU4X1R4TFBGICAgICAgICAgICAgICAgIAkJMHgxMQorI2RlZmluZSByUlRMODI1OF9SeExQRiAgICAgICAgICAgICAgICAJCTB4MTMKKyNkZWZpbmUgclJUTDgyNThfUlNTSUxQRiAgICAgICAgICAgICAgCTB4YQorCisvL0JpdCBNYXNrCisvL3BhZ2UtMQorI2RlZmluZSBiQkJSZXNldEIgICAgICAgICAgICAgICAgIAkJCTB4MTAwCisjZGVmaW5lIGJHbG9iYWxSZXNldEIgICAgICAgICAgICAgCQkweDIwMAorI2RlZmluZSBiT0ZETVR4U3RhcnQgICAgICAgICAgICAgIAkJMHg0CisjZGVmaW5lIGJDQ0tUeFN0YXJ0ICAgICAgICAgICAgICAgCQkJMHg4CisjZGVmaW5lIGJDUkMzMkRlYnVnICAgICAgICAgICAgICAgCQkweDEwMAorI2RlZmluZSBiUE1BQ0xvb3BiYWNrICAgICAgICAgICAgIAkJMHgxMAorI2RlZmluZSBiVHhMU0lHICAgICAgICAgICAgICAgICAgIAkJCTB4ZmZmZmZmCisjZGVmaW5lIGJPRkRNVHhSYXRlICAgICAgICAgICAgICAgCQkweGYKKyNkZWZpbmUgYk9GRE1UeFJlc2VydmVkICAgICAgICAgICAJCTB4MTAKKyNkZWZpbmUgYk9GRE1UeExlbmd0aCAgICAgICAgICAgICAJCTB4MWZmZTAKKyNkZWZpbmUgYk9GRE1UeFBhcml0eSAgICAgICAgICAgICAJCTB4MjAwMDAKKyNkZWZpbmUgYlR4SFRTSUcxICAgICAgICAgICAgICAgICAJCQkweGZmZmZmZgorI2RlZmluZSBiVHhIVE1DU1JhdGUgICAgICAgICAgICAgIAkJMHg3ZgorI2RlZmluZSBiVHhIVEJXICAgICAgICAgICAgICAgICAgIAkJCTB4ODAKKyNkZWZpbmUgYlR4SFRMZW5ndGggICAgICAgICAgICAgICAJCTB4ZmZmZjAwCisjZGVmaW5lIGJUeEhUU0lHMiAgICAgICAgICAgICAgICAgCQkJMHhmZmZmZmYKKyNkZWZpbmUgYlR4SFRTbW9vdGhpbmcgICAgICAgICAgICAJCTB4MQorI2RlZmluZSBiVHhIVFNvdW5kaW5nICAgICAgICAgICAgIAkJMHgyCisjZGVmaW5lIGJUeEhUUmVzZXJ2ZWQgICAgICAgICAgICAgCQkweDQKKyNkZWZpbmUgYlR4SFRBZ2dyZWF0aW9uICAgICAgICAgICAJCTB4OAorI2RlZmluZSBiVHhIVFNUQkMgICAgICAgICAgICAgICAgIAkJCTB4MzAKKyNkZWZpbmUgYlR4SFRBZHZhbmNlQ29kaW5nICAgICAgICAJCTB4NDAKKyNkZWZpbmUgYlR4SFRTaG9ydEdJICAgICAgICAgICAgICAJCTB4ODAKKyNkZWZpbmUgYlR4SFROdW1iZXJIVF9MVEYgICAgICAgICAJCTB4MzAwCisjZGVmaW5lIGJUeEhUQ1JDOCAgICAgICAgICAgICAgICAgCQkJMHgzZmMwMAorI2RlZmluZSBiQ291bnRlclJlc2V0ICAgICAgICAgICAgIAkJMHgxMDAwMAorI2RlZmluZSBiTnVtT2ZPRkRNVHggICAgICAgICAgICAgIAkJMHhmZmZmCisjZGVmaW5lIGJOdW1PZkNDS1R4ICAgICAgICAgICAgICAgCQkweGZmZmYwMDAwCisjZGVmaW5lIGJUeElkbGVJbnRlcnZhbCAgICAgICAgICAgCQkJMHhmZmZmCisjZGVmaW5lIGJPRkRNU2VydmljZSAgICAgICAgICAgICAgCQkweGZmZmYwMDAwCisjZGVmaW5lIGJUeE1BQ0hlYWRlciAgICAgICAgICAgICAgCQkweGZmZmZmZmZmCisjZGVmaW5lIGJUeERhdGFJbml0ICAgICAgICAgICAgICAgCQkJMHhmZgorI2RlZmluZSBiVHhIVE1vZGUgICAgICAgICAgICAgICAgIAkJMHgxMDAKKyNkZWZpbmUgYlR4RGF0YVR5cGUgICAgICAgICAgICAgICAJCTB4MzAwMDAKKyNkZWZpbmUgYlR4UmFuZG9tU2VlZCAgICAgICAgICAgICAJCTB4ZmZmZmZmZmYKKyNkZWZpbmUgYkNDS1R4UHJlYW1ibGUgICAgICAgICAgIAkJMHgxCisjZGVmaW5lIGJDQ0tUeFNGRCAgICAgICAgICAgICAgICAgCQkJMHhmZmZmMDAwMAorI2RlZmluZSBiQ0NLVHhTSUcgICAgICAgICAgICAgICAgIAkJCTB4ZmYKKyNkZWZpbmUgYkNDS1R4U2VydmljZSAgICAgICAgICAgICAJCTB4ZmYwMAorI2RlZmluZSBiQ0NLTGVuZ3RoRXh0ICAgICAgICAgICAgIAkJMHg4MDAwCisjZGVmaW5lIGJDQ0tUeExlbmd0aCAgICAgICAgICAgICAgCQkweGZmZmYwMDAwCisjZGVmaW5lIGJDQ0tUeENSQzE2ICAgICAgICAgICAgICAgCQkweGZmZmYKKyNkZWZpbmUgYkNDS1R4U3RhdHVzICAgICAgICAgICAgICAJCTB4MQorI2RlZmluZSBiT0ZETVR4U3RhdHVzICAgICAgICAgICAgIAkJMHgyCisKKy8vcGFnZS04CisjZGVmaW5lIGJSRk1PRCAgICAgICAgICAgICAgICAgICAgCQkJMHgxCisjZGVmaW5lIGJKYXBhbk1vZGUgICAgICAgICAgICAgICAgCQkweDIKKyNkZWZpbmUgYkNDS1R4U0MgICAgICAgICAgICAgICAgICAJCQkweDMwCisjZGVmaW5lIGJDQ0tFbiAgICAgICAgICAgICAgICAgICAgCQkJMHgxMDAwMDAwCisjZGVmaW5lIGJPRkRNRW4gICAgICAgICAgICAgICAgICAgCQkJMHgyMDAwMDAwCisjZGVmaW5lIGJPRkRNUnhBRENQaGFzZSAgICAgICAgICAgCQkweDEwMDAwCisjZGVmaW5lIGJPRkRNVHhEQUNQaGFzZSAgICAgICAgICAgCQkweDQwMDAwCisjZGVmaW5lIGJYQVR4QUdDICAgICAgICAgICAgICAgICAgCQkJMHgzZgorI2RlZmluZSBiWEJUeEFHQyAgICAgICAgICAgICAgICAgIAkJCTB4ZjAwCisjZGVmaW5lIGJYQ1R4QUdDICAgICAgICAgICAgICAgICAgCQkJMHhmMDAwCisjZGVmaW5lIGJYRFR4QUdDICAgICAgICAgICAgICAgICAgCQkJMHhmMDAwMAorI2RlZmluZSBiUEFTdGFydCAgICAgICAgICAgICAgICAgIAkJCTB4ZjAwMDAwMDAKKyNkZWZpbmUgYlRSU3RhcnQgICAgICAgICAgICAgICAgICAJCQkweDAwZjAwMDAwCisjZGVmaW5lIGJSRlN0YXJ0ICAgICAgICAgICAgICAgICAgCQkJMHgwMDAwZjAwMAorI2RlZmluZSBiQkJTdGFydCAgICAgICAgICAgICAgICAgIAkJCTB4MDAwMDAwZjAKKyNkZWZpbmUgYkJCQ0NLU3RhcnQgICAgICAgICAgICAgICAJCTB4MDAwMDAwMGYKKyNkZWZpbmUgYlBBRW5kICAgICAgICAgICAgICAgICAgICAJCQkweGYgICAgICAgICAgLy9SZWcweDgxNAorI2RlZmluZSBiVFJFbmQgICAgICAgICAgICAgICAgICAgIAkJCTB4MGYwMDAwMDAKKyNkZWZpbmUgYlJGRW5kICAgICAgICAgICAgICAgICAgICAJCQkweDAwMGYwMDAwCisjZGVmaW5lIGJDQ0FNYXNrICAgICAgICAgICAgICAgICAgCQkJMHgwMDAwMDBmMCAgIC8vVDJSCisjZGVmaW5lIGJSMlJDQ0FNYXNrICAgICAgICAgICAgICAgCQkweDAwMDAwZjAwCisjZGVmaW5lIGJIU1NJX1IyVERlbGF5ICAgICAgICAgICAgCQkweGY4MDAwMDAwCisjZGVmaW5lIGJIU1NJX1QyUkRlbGF5ICAgICAgICAgICAgCQkweGY4MDAwMAorI2RlZmluZSBiQ29udFR4SFNTSSAgICAgICAgICAgICAgIAkJMHg0MDAgICAgIC8vY2hhbmUgZ2FpbiBhdCBjb250aW51ZSBUeAorI2RlZmluZSBiSUdGcm9tQ0NLICAgICAgICAgICAgICAgIAkJMHgyMDAKKyNkZWZpbmUgYkFHQ0FkZHJlc3MgICAgICAgICAgICAgICAJCTB4M2YKKyNkZWZpbmUgYlJ4SFBUeCAgICAgICAgICAgICAgICAgICAJCQkweDcwMDAKKyNkZWZpbmUgYlJ4SFBUMlIgICAgICAgICAgICAgICAgICAJCQkweDM4MDAwCisjZGVmaW5lIGJSeEhQQ0NLSW5pICAgICAgICAgICAgICAgCQkweGMwMDAwCisjZGVmaW5lIGJBR0NUeENvZGUgICAgICAgICAgICAgICAgCQkweGMwMDAwMAorI2RlZmluZSBiQUdDUnhDb2RlICAgICAgICAgICAgICAgIAkJMHgzMDAwMDAKKyNkZWZpbmUgYjNXaXJlRGF0YUxlbmd0aCAgICAgICAgICAJCTB4ODAwCisjZGVmaW5lIGIzV2lyZUFkZHJlc3NMZW5ndGggICAgICAgCQkweDQwMAorI2RlZmluZSBiM1dpcmVSRlBvd2VyRG93biAgICAgICAgIAkJMHgxCisvLyNkZWZpbmUgYkhXU0lTZWxlY3QgICAgICAgICAgICAgICAJCTB4OAorI2RlZmluZSBiNUdQQVBFUG9sYXJpdHkgICAgICAgICAgIAkJMHg0MDAwMDAwMAorI2RlZmluZSBiMkdQQVBFUG9sYXJpdHkgICAgICAgICAgIAkJMHg4MDAwMDAwMAorI2RlZmluZSBiUkZTV19UeERlZmF1bHRBbnQgICAgICAgIAkJMHgzCisjZGVmaW5lIGJSRlNXX1R4T3B0aW9uQW50ICAgICAgICAgCQkweDMwCisjZGVmaW5lIGJSRlNXX1J4RGVmYXVsdEFudCAgICAgICAgCQkweDMwMAorI2RlZmluZSBiUkZTV19SeE9wdGlvbkFudCAgICAgICAgIAkJMHgzMDAwCisjZGVmaW5lIGJSRlNJXzNXaXJlRGF0YSAgICAgICAgICAgCQkweDEKKyNkZWZpbmUgYlJGU0lfM1dpcmVDbG9jayAgICAgICAgICAJCTB4MgorI2RlZmluZSBiUkZTSV8zV2lyZUxvYWQgICAgICAgICAgIAkJMHg0CisjZGVmaW5lIGJSRlNJXzNXaXJlUlcgICAgICAgICAgICAgCQkweDgKKyNkZWZpbmUgYlJGU0lfM1dpcmUgICAgICAgICAgICAgICAJCQkweGYgIC8vMy13aXJlIHRvdGFsIGNvbnRyb2wKKyNkZWZpbmUgYlJGU0lfUkZFTlYgICAgICAgICAgICAgICAJCTB4MTAKKyNkZWZpbmUgYlJGU0lfVFJTVyAgICAgICAgICAgICAgICAJCTB4MjAKKyNkZWZpbmUgYlJGU0lfVFJTV0IgICAgICAgICAgICAgICAJCTB4NDAKKyNkZWZpbmUgYlJGU0lfQU5UU1cgICAgICAgICAgICAgICAJCTB4MTAwCisjZGVmaW5lIGJSRlNJX0FOVFNXQiAgICAgICAgICAgICAgCQkweDIwMAorI2RlZmluZSBiUkZTSV9QQVBFICAgICAgICAgICAgICAgIAkJCTB4NDAwCisjZGVmaW5lIGJSRlNJX1BBUEU1RyAgICAgICAgICAgICAgCQkweDgwMAorI2RlZmluZSBiQmFuZFNlbGVjdCAgICAgICAgICAgICAgIAkJCTB4MQorI2RlZmluZSBiSFRTSUcyX0dJICAgICAgICAgICAgICAgIAkJCTB4ODAKKyNkZWZpbmUgYkhUU0lHMl9TbW9vdGhpbmcgICAgICAgICAJCTB4MDEKKyNkZWZpbmUgYkhUU0lHMl9Tb3VuZGluZyAgICAgICAgICAJCTB4MDIKKyNkZWZpbmUgYkhUU0lHMl9BZ2dyZWF0b24gICAgICAgICAJCTB4MDgKKyNkZWZpbmUgYkhUU0lHMl9TVEJDICAgICAgICAgICAgICAJCTB4MzAKKyNkZWZpbmUgYkhUU0lHMl9BZHZDb2RpbmcgICAgICAgICAJCTB4NDAKKyNkZWZpbmUgYkhUU0lHMl9OdW1PZkhUTFRGICAgICAgICAJMHgzMDAKKyNkZWZpbmUgYkhUU0lHMl9DUkM4ICAgICAgICAgICAgICAJCTB4M2ZjCisjZGVmaW5lIGJIVFNJRzFfTUNTICAgICAgICAgICAgICAgCQkweDdmCisjZGVmaW5lIGJIVFNJRzFfQmFuZFdpZHRoICAgICAgICAgCQkweDgwCisjZGVmaW5lIGJIVFNJRzFfSFRMZW5ndGggICAgICAgICAgCQkweGZmZmYKKyNkZWZpbmUgYkxTSUdfUmF0ZSAgICAgICAgICAgICAgICAJCQkweGYKKyNkZWZpbmUgYkxTSUdfUmVzZXJ2ZWQgICAgICAgICAgICAJCTB4MTAKKyNkZWZpbmUgYkxTSUdfTGVuZ3RoICAgICAgICAgICAgICAJCTB4MWZmZmUKKyNkZWZpbmUgYkxTSUdfUGFyaXR5ICAgICAgICAgICAgICAJCQkweDIwCisjZGVmaW5lIGJDQ0tSeFBoYXNlICAgICAgICAgICAgICAgCQkweDQKKyNkZWZpbmUgYkxTU0lSZWFkQWRkcmVzcyAgICAgICAgICAJCTB4M2YwMDAwMDAgICAvL0xTU0kgIlJlYWQiIEFkZHJlc3MKKyNkZWZpbmUgYkxTU0lSZWFkRWRnZSAgICAgICAgICAgICAJCTB4ODAwMDAwMDAgICAvL0xTU0kgIlJlYWQiIGVkZ2Ugc2lnbmFsCisjZGVmaW5lIGJMU1NJUmVhZEJhY2tEYXRhICAgICAgICAgCQkweGZmZgorI2RlZmluZSBiTFNTSVJlYWRPS0ZsYWcgICAgICAgICAgIAkJMHgxMDAwCisjZGVmaW5lIGJDQ0tTYW1wbGVSYXRlICAgICAgICAgICAgCQkweDggICAgICAgLy8wOiA0NE1IeiwgMTo4OE1IegorCisjZGVmaW5lIGJSZWd1bGF0b3IwU3RhbmRieSAgICAgICAgCQkweDEKKyNkZWZpbmUgYlJlZ3VsYXRvclBMTFN0YW5kYnkgICAgICAJCTB4MgorI2RlZmluZSBiUmVndWxhdG9yMVN0YW5kYnkgICAgICAgIAkJMHg0CisjZGVmaW5lIGJQTExQb3dlclVwICAgICAgICAgICAgICAgCQkweDgKKyNkZWZpbmUgYkRQTExQb3dlclVwICAgICAgICAgICAgICAJCTB4MTAKKyNkZWZpbmUgYkRBMTBQb3dlclVwICAgICAgICAgICAgICAJCTB4MjAKKyNkZWZpbmUgYkFEN1Bvd2VyVXAgICAgICAgICAgICAgICAJCTB4MjAwCisjZGVmaW5lIGJEQTZQb3dlclVwICAgICAgICAgICAgICAgCQkweDIwMDAKKyNkZWZpbmUgYlh0YWxQb3dlclVwICAgICAgICAgICAgICAJCTB4NDAwMAorI2RlZmluZSBiNDBNRENsa1Bvd2VyVVAgICAgICAgICAgIAkJMHg4MDAwCisjZGVmaW5lIGJEQTZEZWJ1Z01vZGUgICAgICAgICAgICAgCQkweDIwMDAwCisjZGVmaW5lIGJEQTZTd2luZyAgICAgICAgICAgICAgICAgCQkJMHgzODAwMDAKKyNkZWZpbmUgYkFEQ2xrUGhhc2UgICAgICAgICAgICAgICAJCTB4NDAwMDAwMAorI2RlZmluZSBiODBNQ2xrRGVsYXkgICAgICAgICAgICAgIAkJMHgxODAwMDAwMAorI2RlZmluZSBiQUZFV2F0Y2hEb2dFbmFibGUgICAgICAgIAkJMHgyMDAwMDAwMAorI2RlZmluZSBiWHRhbENhcCAgICAgICAgICAgICAgICAJCQkweDBmMDAwMDAwCisjZGVmaW5lIGJJbnREaWZDbGtFbmFibGUgICAgICAgICAgCQkweDQwMAorI2RlZmluZSBiRXh0U2lnQ2xrRW5hYmxlICAgICAgICAgCQkweDgwMAorI2RlZmluZSBiQmFuZGdhcE1iaWFzUG93ZXJVcCAgICAgIAkweDEwMDAwCisjZGVmaW5lIGJBRDExU0hHYWluICAgICAgICAgICAgICAgCQkweGMwMDAwCisjZGVmaW5lIGJBRDExSW5wdXRSYW5nZSAgICAgICAgICAgCQkweDcwMDAwMAorI2RlZmluZSBiQUQxMU9QQ3VycmVudCAgICAgICAgICAgIAkJMHgzODAwMDAwCisjZGVmaW5lIGJJUGF0aExvb3BiYWNrICAgICAgICAgICAgCQkweDQwMDAwMDAKKyNkZWZpbmUgYlFQYXRoTG9vcGJhY2sgICAgICAgICAgICAJCTB4ODAwMDAwMAorI2RlZmluZSBiQUZFTG9vcGJhY2sgICAgICAgICAgICAgIAkJMHgxMDAwMDAwMAorI2RlZmluZSBiREExMFN3aW5nICAgICAgICAgICAgICAgIAkJMHg3ZTAKKyNkZWZpbmUgYkRBMTBSZXZlcnNlICAgICAgICAgICAgICAJCTB4ODAwCisjZGVmaW5lIGJEQUNsa1NvdXJjZSAgICAgICAgICAgICAgCQkweDEwMDAKKyNkZWZpbmUgYkFEN0lucHV0UmFuZ2UgICAgICAgICAgICAJCTB4NjAwMAorI2RlZmluZSBiQUQ3R2FpbiAgICAgICAgICAgICAgICAgIAkJCTB4MzgwMDAKKyNkZWZpbmUgYkFEN091dHB1dENNTW9kZSAgICAgICAgICAJCTB4NDAwMDAKKyNkZWZpbmUgYkFEN0lucHV0Q01Nb2RlICAgICAgICAgICAJCTB4MzgwMDAwCisjZGVmaW5lIGJBRDdDdXJyZW50ICAgICAgICAgICAgICAgCQkJMHhjMDAwMDAKKyNkZWZpbmUgYlJlZ3VsYXRvckFkanVzdCAgICAgICAgICAJCTB4NzAwMDAwMAorI2RlZmluZSBiQUQxMVBvd2VyVXBBdFR4ICAgICAgICAgIAkJMHgxCisjZGVmaW5lIGJEQTEwUFNBdFR4ICAgICAgICAgICAgICAgCQkweDEwCisjZGVmaW5lIGJBRDExUG93ZXJVcEF0UnggICAgICAgICAgCQkweDEwMAorI2RlZmluZSBiREExMFBTQXRSeCAgICAgICAgICAgICAgIAkJMHgxMDAwCisKKyNkZWZpbmUgYkNDS1J4QUdDRm9ybWF0ICAgICAgICAgICAJCTB4MjAwCisKKyNkZWZpbmUgYlBTREZGVFNhbXBsZXBQb2ludCAgICAgICAJCTB4YzAwMAorI2RlZmluZSBiUFNEQXZlcmFnZU51bSAgICAgICAgICAgIAkJMHgzMDAwCisjZGVmaW5lIGJJUVBhdGhDb250cm9sICAgICAgICAgICAgCQkweGMwMAorI2RlZmluZSBiUFNERnJlcSAgICAgICAgICAgICAgICAgIAkJCTB4M2ZmCisjZGVmaW5lIGJQU0RBbnRlbm5hUGF0aCAgICAgICAgICAgCQkweDMwCisjZGVmaW5lIGJQU0RJUVN3aXRjaCAgICAgICAgICAgICAgCQkweDQwCisjZGVmaW5lIGJQU0RSeFRyaWdnZXIgICAgICAgICAgICAgCQkweDQwMDAwMAorI2RlZmluZSBiUFNEVHhUcmlnZ2VyICAgICAgICAgICAgIAkJMHg4MDAwMDAwMAorI2RlZmluZSBiUFNEU2luZVRvbmVTY2FsZSAgICAgICAgCQkweDdmMDAwMDAwCisjZGVmaW5lIGJQU0RSZXBvcnQgICAgICAgICAgICAgICAgCQkJMHhmZmZmCisKKy8vcGFnZS05CisjZGVmaW5lIGJPRkRNVHhTQyAgICAgICAgICAgICAgICAgCQkweDMwMDAwMDAwCisjZGVmaW5lIGJDQ0tUeE9uICAgICAgICAgICAgICAgICAgCQkJMHgxCisjZGVmaW5lIGJPRkRNVHhPbiAgICAgICAgICAgICAgICAgCQkweDIKKyNkZWZpbmUgYkRlYnVnUGFnZSAgICAgICAgICAgICAgICAJCTB4ZmZmICAvL3Jlc2V0IGRlYnVnIHBhZ2UgYW5kIGFsc28gSFdvcmQsIExXb3JkCisjZGVmaW5lIGJEZWJ1Z0l0ZW0gICAgICAgICAgICAgICAgCQkweGZmICAgLy9yZXNldCBkZWJ1ZyBwYWdlIGFuZCBMV29yZAorI2RlZmluZSBiQW50TCAgICAgICAgICAgICAgCQkJMHgxMAorI2RlZmluZSBiQW50Tm9uSFQgICAgICAgICAgIAkJCQkweDEwMAorI2RlZmluZSBiQW50SFQxICAgICAgICAgICAgICAgCQkJMHgxMDAwCisjZGVmaW5lIGJBbnRIVDIgICAgICAgICAgICAgICAgICAgCQkJMHgxMDAwMAorI2RlZmluZSBiQW50SFQxUzEgICAgICAgICAgICAgICAgIAkJCTB4MTAwMDAwCisjZGVmaW5lIGJBbnROb25IVFMxICAgICAgICAgICAgICAgCQkweDEwMDAwMDAKKworLy9wYWdlLWEKKyNkZWZpbmUgYkNDS0JCTW9kZSAgICAgICAgICAgICAgICAJCTB4MworI2RlZmluZSBiQ0NLVHhQb3dlclNhdmluZyAgICAgICAgIAkJMHg4MAorI2RlZmluZSBiQ0NLUnhQb3dlclNhdmluZyAgICAgICAgIAkJMHg0MAorI2RlZmluZSBiQ0NLU2lkZUJhbmQgICAgICAgICAgICAgIAkJMHgxMAorI2RlZmluZSBiQ0NLU2NyYW1ibGUgICAgICAgICAgICAgIAkJMHg4CisjZGVmaW5lIGJDQ0tBbnREaXZlcnNpdHkgICAgCQkJMHg4MDAwCisjZGVmaW5lIGJDQ0tDYXJyaWVyUmVjb3ZlcnkgICAJCTB4NDAwMAorI2RlZmluZSBiQ0NLVHhSYXRlICAgICAgICAgICAJCQkweDMwMDAKKyNkZWZpbmUgYkNDS0RDQ2FuY2VsICAgICAgICAgICAgIAkJMHgwODAwCisjZGVmaW5lIGJDQ0tJU0lDYW5jZWwgICAgICAgICAgICAgCQkweDA0MDAKKyNkZWZpbmUgYkNDS01hdGNoRmlsdGVyICAgICAgICAgICAJCTB4MDIwMAorI2RlZmluZSBiQ0NLRXF1YWxpemVyICAgICAgICAgICAgIAkJMHgwMTAwCisjZGVmaW5lIGJDQ0tQcmVhbWJsZURldGVjdCAgICAgICAJCTB4ODAwMDAwCisjZGVmaW5lIGJDQ0tGYXN0RmFsc2VDQ0EgICAgICAgICAgCQkweDQwMDAwMAorI2RlZmluZSBiQ0NLQ2hFc3RTdGFydCAgICAgICAgICAgIAkJMHgzMDAwMDAKKyNkZWZpbmUgYkNDS0NDQUNvdW50ICAgICAgICAgICAgICAJCTB4MDgwMDAwCisjZGVmaW5lIGJDQ0tjc19saW0gICAgICAgICAgICAgICAgCQkJMHgwNzAwMDAKKyNkZWZpbmUgYkNDS0Jpc3RNb2RlICAgICAgICAgICAgICAJCTB4ODAwMDAwMDAKKyNkZWZpbmUgYkNDS0NDQU1hc2sgICAgICAgICAgICAgCQkweDQwMDAwMDAwCisjZGVmaW5lIGJDQ0tUeERBQ1BoYXNlICAgICAgICAgCQkweDQKKyNkZWZpbmUgYkNDS1J4QURDUGhhc2UgICAgICAgICAJCTB4MjAwMDAwMDAgICAvL3JfcnhfY2xrCisjZGVmaW5lIGJDQ0tyX2NwX21vZGUwICAgICAgICAgCQkweDAxMDAKKyNkZWZpbmUgYkNDS1R4RENPZmZzZXQgICAgICAgICAgIAkJMHhmMAorI2RlZmluZSBiQ0NLUnhEQ09mZnNldCAgICAgICAgICAgCQkweGYKKyNkZWZpbmUgYkNDS0NDQU1vZGUgICAgICAgICAgICAgIAkJMHhjMDAwCisjZGVmaW5lIGJDQ0tGYWxzZUNTX2xpbSAgICAgICAgICAgCQkweDNmMDAKKyNkZWZpbmUgYkNDS0NTX3JhdGlvICAgICAgICAgICAgICAJCTB4YzAwMDAwCisjZGVmaW5lIGJDQ0tDb3JnQml0X3NlbCAgICAgICAgICAgCQkweDMwMDAwMAorI2RlZmluZSBiQ0NLUERfbGltICAgICAgICAgICAgICAgIAkJCTB4MGYwMDAwCisjZGVmaW5lIGJDQ0tOZXdDQ0EgICAgICAgICAgICAgICAgCQkweDgwMDAwMDAwCisjZGVmaW5lIGJDQ0tSeEhQb2ZJRyAgICAgICAgICAgICAgCQkweDgwMDAKKyNkZWZpbmUgYkNDS1J4SUcgICAgICAgICAgICAgICAgICAJCQkweDdmMDAKKyNkZWZpbmUgYkNDS0xOQVBvbGFyaXR5ICAgICAgICAgICAJCTB4ODAwMDAwCisjZGVmaW5lIGJDQ0tSeDFzdEdhaW4gICAgICAgICAgICAgCQkweDdmMDAwMAorI2RlZmluZSBiQ0NLUkZFeHRlbmQgICAgICAgICAgICAgIAkJMHgyMDAwMDAwMCAvL0NDSyBSeCBJaW5pdGFsIGdhaW4gcG9sYXJpdHkKKyNkZWZpbmUgYkNDS1J4QUdDU2F0TGV2ZWwgICAgICAgIAkJMHgxZjAwMDAwMAorI2RlZmluZSBiQ0NLUnhBR0NTYXRDb3VudCAgICAgICAJCTB4ZTAKKyNkZWZpbmUgYkNDS1J4UkZTZXR0bGUgICAgICAgICAgICAJCTB4MWYgICAgICAgLy9BR0NzYW1wX2RseQorI2RlZmluZSBiQ0NLRml4ZWRSeEFHQyAgICAgICAgICAgCQkweDgwMDAKKy8vI2RlZmluZSBiQ0NLUnhBR0NGb3JtYXQgICAgICAgICAJCTB4NDAwMCAgIC8vcmVtb3ZlIHRvIEhTU0kgcmVnaXN0ZXIgMHg4MjQKKyNkZWZpbmUgYkNDS0FudGVubmFQb2xhcml0eSAgICAgIAkJMHgyMDAwCisjZGVmaW5lIGJDQ0tUeEZpbHRlclR5cGUgICAgICAgICAgCQkweDBjMDAKKyNkZWZpbmUgYkNDS1J4QUdDUmVwb3J0VHlwZSAgIAkJMHgwMzAwCisjZGVmaW5lIGJDQ0tSeERBR0NFbiAgICAgICAgICAgICAgCQkweDgwMDAwMDAwCisjZGVmaW5lIGJDQ0tSeERBR0NQZXJpb2QgICAgICAgIAkJMHgyMDAwMDAwMAorI2RlZmluZSBiQ0NLUnhEQUdDU2F0TGV2ZWwgICAgIAkJMHgxZjAwMDAwMAorI2RlZmluZSBiQ0NLVGltaW5nUmVjb3ZlcnkgICAgICAgCQkweDgwMDAwMAorI2RlZmluZSBiQ0NLVHhDMCAgICAgICAgICAgICAgICAgIAkJCTB4M2YwMDAwCisjZGVmaW5lIGJDQ0tUeEMxICAgICAgICAgICAgICAgICAgCQkJMHgzZjAwMDAwMAorI2RlZmluZSBiQ0NLVHhDMiAgICAgICAgICAgICAgICAgIAkJCTB4M2YKKyNkZWZpbmUgYkNDS1R4QzMgICAgICAgICAgICAgICAgICAJCQkweDNmMDAKKyNkZWZpbmUgYkNDS1R4QzQgICAgICAgICAgICAgICAgICAJCQkweDNmMDAwMAorI2RlZmluZSBiQ0NLVHhDNSAgICAgICAgICAgICAgICAgIAkJCTB4M2YwMDAwMDAKKyNkZWZpbmUgYkNDS1R4QzYgICAgICAgICAgICAgICAgICAJCQkweDNmCisjZGVmaW5lIGJDQ0tUeEM3ICAgICAgICAgICAgICAgICAgCQkJMHgzZjAwCisjZGVmaW5lIGJDQ0tEZWJ1Z1BvcnQgICAgICAgICAgICAgCQkweGZmMDAwMAorI2RlZmluZSBiQ0NLREFDRGVidWcgICAgICAgICAgICAgIAkJMHgwZjAwMDAwMAorI2RlZmluZSBiQ0NLRmFsc2VBbGFybUVuYWJsZSAgICAgIAkJMHg4MDAwCisjZGVmaW5lIGJDQ0tGYWxzZUFsYXJtUmVhZCAgICAgICAgCQkweDQwMDAKKyNkZWZpbmUgYkNDS1RSU1NJICAgICAgICAgICAgICAgICAJCQkweDdmCisjZGVmaW5lIGJDQ0tSeEFHQ1JlcG9ydCAgICAgICAgICAgCQkweGZlCisjZGVmaW5lIGJDQ0tSeFJlcG9ydF9BbnRTZWwgICAgICAgCQkweDgwMDAwMDAwCisjZGVmaW5lIGJDQ0tSeFJlcG9ydF9NRk9mZiAgICAgICAgCQkweDQwMDAwMDAwCisjZGVmaW5lIGJDQ0tSeFJ4UmVwb3J0X1NRTG9zcyAgICAgCTB4MjAwMDAwMDAKKyNkZWZpbmUgYkNDS1J4UmVwb3J0X1BrdGxvc3MgICAgICAJCTB4MTAwMDAwMDAKKyNkZWZpbmUgYkNDS1J4UmVwb3J0X0xvY2tlZGJpdCAgICAJMHgwODAwMDAwMAorI2RlZmluZSBiQ0NLUnhSZXBvcnRfUmF0ZUVycm9yICAgIAkweDA0MDAwMDAwCisjZGVmaW5lIGJDQ0tSeFJlcG9ydF9SeFJhdGUgICAgICAgCQkweDAzMDAwMDAwCisjZGVmaW5lIGJDQ0tSeEZBQ291bnRlckxvd2VyICAgICAgCTB4ZmYKKyNkZWZpbmUgYkNDS1J4RkFDb3VudGVyVXBwZXIgICAgICAJMHhmZjAwMDAwMAorI2RlZmluZSBiQ0NLUnhIUEFHQ1N0YXJ0ICAgICAgICAgIAkJMHhlMDAwCisjZGVmaW5lIGJDQ0tSeEhQQUdDRmluYWwgICAgICAgICAgCQkweDFjMDAKKworI2RlZmluZSBiQ0NLUnhGYWxzZUFsYXJtRW5hYmxlICAgIAkweDgwMDAKKyNkZWZpbmUgYkNDS0ZBQ291bnRlckZyZWV6ZSAgICAgICAJCTB4NDAwMAorCisjZGVmaW5lIGJDQ0tUeFBhdGhTZWwgICAgICAgICAgICAgCQkweDEwMDAwMDAwCisjZGVmaW5lIGJDQ0tEZWZhdWx0UnhQYXRoICAgICAgICAgCQkweGMwMDAwMDAKKyNkZWZpbmUgYkNDS09wdGlvblJ4UGF0aCAgICAgICAgICAJCTB4MzAwMDAwMAorCisvL3BhZ2UgYworI2RlZmluZSBiTnVtT2ZTVEYgICAgICAgICAgICAgICAgCQkJMHgzCisjZGVmaW5lIGJTaGlmdF9MICAgICAgICAgICAgICAgICAJCQkweGMwCisjZGVmaW5lIGJHSV9USCAgICAgICAgICAgICAgICAgICAJCQkweGMKKyNkZWZpbmUgYlJ4UGF0aEEgICAgICAgICAgICAgICAgIAkJCTB4MQorI2RlZmluZSBiUnhQYXRoQiAgICAgICAgICAgICAgICAgCQkJMHgyCisjZGVmaW5lIGJSeFBhdGhDICAgICAgICAgICAgICAgICAJCQkweDQKKyNkZWZpbmUgYlJ4UGF0aEQgICAgICAgICAgICAgICAgIAkJCTB4OAorI2RlZmluZSBiVHhQYXRoQSAgICAgICAgICAgICAgICAgCQkJMHgxCisjZGVmaW5lIGJUeFBhdGhCICAgICAgICAgICAgICAgICAJCQkweDIKKyNkZWZpbmUgYlR4UGF0aEMgICAgICAgICAgICAgICAgIAkJCTB4NAorI2RlZmluZSBiVHhQYXRoRCAgICAgICAgICAgICAgICAgCQkJMHg4CisjZGVmaW5lIGJUUlNTSUZyZXEgICAgICAgICAgICAgICAJCQkweDIwMAorI2RlZmluZSBiQURDQmFja29mZiAgICAgICAgICAgICAgCQkJMHgzMDAwCisjZGVmaW5lIGJERklSQmFja29mZiAgICAgICAgICAgICAJCQkweGMwMDAKKyNkZWZpbmUgYlRSU1NJTGF0Y2hQaGFzZSAgICAgICAgIAkJMHgxMDAwMAorI2RlZmluZSBiUnhJRENPZmZzZXQgICAgICAgICAgICAgCQkJMHhmZgorI2RlZmluZSBiUnhRRENPZmZzZXQgICAgICAgICAgICAgCQkJMHhmZjAwCisjZGVmaW5lIGJSeERGSVJNb2RlICAgICAgICAgICAgICAJCTB4MTgwMDAwMAorI2RlZmluZSBiUnhEQ05GVHlwZSAgICAgICAgICAgICAgCQkweGUwMDAwMDAKKyNkZWZpbmUgYlJYSVFJbWJfQSAgICAgICAgICAgICAgIAkJCTB4M2ZmCisjZGVmaW5lIGJSWElRSW1iX0IgICAgICAgICAgICAgICAJCQkweGZjMDAKKyNkZWZpbmUgYlJYSVFJbWJfQyAgICAgICAgICAgICAgIAkJCTB4M2YwMDAwCisjZGVmaW5lIGJSWElRSW1iX0QgICAgICAgICAgICAgICAJCQkweGZmYzAwMDAwCisjZGVmaW5lIGJEQ19kY19Ob3RjaCAgICAgICAgICAgICAJCTB4NjAwMDAKKyNkZWZpbmUgYlJ4TkJJTm90Y2ggICAgICAgICAgICAgIAkJCTB4MWYwMDAwMDAKKyNkZWZpbmUgYlBEX1RIICAgICAgICAgICAgICAgICAgIAkJCTB4ZgorI2RlZmluZSBiUERfVEhfT3B0MiAgICAgICAgICAgICAgCQkweGMwMDAKKyNkZWZpbmUgYlBXRURfVEggICAgICAgICAgICAgICAgIAkJCTB4NzAwCisjZGVmaW5lIGJJZk1GX1dpbl9MICAgICAgICAgICAgICAJCQkweDgwMAorI2RlZmluZSBiUERfT3B0aW9uICAgICAgICAgICAgICAgCQkJMHgxMDAwCisjZGVmaW5lIGJNRl9XaW5fTCAgICAgICAgICAgICAgICAJCQkweGUwMDAKKyNkZWZpbmUgYkJXX1NlYXJjaF9MICAgICAgICAgICAgIAkJMHgzMDAwMAorI2RlZmluZSBid2luX2VuaF9MICAgICAgICAgICAgICAgCQkJMHhjMDAwMAorI2RlZmluZSBiQldfVEggICAgICAgICAgICAgICAgICAgCQkJMHg3MDAwMDAKKyNkZWZpbmUgYkVEX1RIMiAgICAgICAgICAgICAgICAgIAkJCTB4MzgwMDAwMAorI2RlZmluZSBiQldfb3B0aW9uICAgICAgICAgICAgICAgCQkJMHg0MDAwMDAwCisjZGVmaW5lIGJSYXRpb19USCAgICAgICAgICAgICAgICAJCQkweDE4MDAwMDAwCisjZGVmaW5lIGJXaW5kb3dfTCAgICAgICAgICAgICAgICAJCQkweGUwMDAwMDAwCisjZGVmaW5lIGJTQkRfT3B0aW9uICAgICAgICAgICAgICAJCQkweDEKKyNkZWZpbmUgYkZyYW1lX1RIICAgICAgICAgICAgICAgIAkJCTB4MWMKKyNkZWZpbmUgYkZTX09wdGlvbiAgICAgICAgICAgICAgIAkJCTB4NjAKKyNkZWZpbmUgYkRDX1Nsb3BlX2NoZWNrICAgICAgICAgIAkJMHg4MAorI2RlZmluZSBiRkd1YXJkX0NvdW50ZXJfRENfTCAgICAgCQkweGUwMAorI2RlZmluZSBiRnJhbWVfV2VpZ2h0X1Nob3J0ICAgICAgCQkweDcwMDAKKyNkZWZpbmUgYlN1Yl9UdW5lICAgICAgICAgICAgICAgIAkJCTB4ZTAwMDAwCisjZGVmaW5lIGJGcmFtZV9EQ19MZW5ndGggICAgICAgICAJCTB4ZTAwMDAwMAorI2RlZmluZSBiU0JEX3N0YXJ0X29mZnNldCAgICAgICAgCQkweDMwMDAwMDAwCisjZGVmaW5lIGJGcmFtZV9USF8yICAgICAgICAgICAgICAJCTB4NworI2RlZmluZSBiRnJhbWVfR0kyX1RIICAgICAgICAgICAgCQkweDM4CisjZGVmaW5lIGJHSTJfU3luY19lbiAgICAgICAgICAgICAJCTB4NDAKKyNkZWZpbmUgYlNhcmNoX1Nob3J0X0Vhcmx5ICAgICAgIAkJMHgzMDAKKyNkZWZpbmUgYlNhcmNoX1Nob3J0X0xhdGUgICAgICAgIAkJMHhjMDAKKyNkZWZpbmUgYlNhcmNoX0dJMl9MYXRlICAgICAgICAgIAkJMHg3MDAwMAorI2RlZmluZSBiQ0ZPQW50U3VtICAgICAgICAgICAgICAgCQkweDEKKyNkZWZpbmUgYkNGT0FjYyAgICAgICAgICAgICAgICAgIAkJCTB4MgorI2RlZmluZSBiQ0ZPU3RhcnRPZmZzZXQgICAgICAgICAgCQkweGMKKyNkZWZpbmUgYkNGT0xvb2tCYWNrICAgICAgICAgICAgIAkJMHg3MAorI2RlZmluZSBiQ0ZPU3VtV2VpZ2h0ICAgICAgICAgICAgCQkweDgwCisjZGVmaW5lIGJEQUdDRW5hYmxlICAgICAgICAgICAgICAJCQkweDEwMDAwCisjZGVmaW5lIGJUWElRSW1iX0EgICAgICAgICAgICAgICAJCQkweDNmZgorI2RlZmluZSBiVFhJUUltYl9CICAgICAgICAgICAgICAgCQkJMHhmYzAwCisjZGVmaW5lIGJUWElRSW1iX0MgICAgICAgICAgICAgICAJCQkweDNmMDAwMAorI2RlZmluZSBiVFhJUUltYl9EICAgICAgICAgICAgICAgCQkJMHhmZmMwMDAwMAorI2RlZmluZSBiVHhJRENPZmZzZXQgICAgICAgICAgICAgCQkJMHhmZgorI2RlZmluZSBiVHhRRENPZmZzZXQgICAgICAgICAgICAgCQkJMHhmZjAwCisjZGVmaW5lIGJUeERGSVJNb2RlICAgICAgICAgICAgICAJCTB4MTAwMDAKKyNkZWZpbmUgYlR4UGVzdWRvTm9pc2VPbiAgICAgICAgIAkJMHg0MDAwMDAwCisjZGVmaW5lIGJUeFBlc3Vkb05vaXNlX0EgICAgICAgICAJCTB4ZmYKKyNkZWZpbmUgYlR4UGVzdWRvTm9pc2VfQiAgICAgICAgIAkJMHhmZjAwCisjZGVmaW5lIGJUeFBlc3Vkb05vaXNlX0MgICAgICAgICAJCTB4ZmYwMDAwCisjZGVmaW5lIGJUeFBlc3Vkb05vaXNlX0QgICAgICAgICAJCTB4ZmYwMDAwMDAKKyNkZWZpbmUgYkNDQURyb3BPcHRpb24gICAgICAgICAgIAkJMHgyMDAwMAorI2RlZmluZSBiQ0NBRHJvcFRocmVzICAgICAgICAgICAgCQkweGZmZjAwMDAwCisjZGVmaW5lIGJFRENDQV9IICAgICAgICAgICAgICAgICAJCQkweGYKKyNkZWZpbmUgYkVEQ0NBX0wgICAgICAgICAgICAgICAgIAkJCTB4ZjAKKyNkZWZpbmUgYkxhbWJkYV9FRCAgICAgICAgICAgICAgIDB4MzAwCisjZGVmaW5lIGJSeEluaXRpYWxHYWluICAgICAgICAgICAweDdmCisjZGVmaW5lIGJSeEFudERpdkVuICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIGJSeEFHQ0FkZHJlc3NGb3JMTkEgICAgICAweDdmMDAKKyNkZWZpbmUgYlJ4SGlnaFBvd2VyRmxvdyAgICAgICAgIDB4ODAwMAorI2RlZmluZSBiUnhBR0NGcmVlemVUaHJlcyAgICAgICAgMHhjMDAwMAorI2RlZmluZSBiUnhGcmVlemVTdGVwX0FHQzEgICAgICAgMHgzMDAwMDAKKyNkZWZpbmUgYlJ4RnJlZXplU3RlcF9BR0MyICAgICAgIDB4YzAwMDAwCisjZGVmaW5lIGJSeEZyZWV6ZVN0ZXBfQUdDMyAgICAgICAweDMwMDAwMDAKKyNkZWZpbmUgYlJ4RnJlZXplU3RlcF9BR0MwICAgICAgIDB4YzAwMDAwMAorI2RlZmluZSBiUnhSc3NpX0NtcF9FbiAgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBiUnhRdWlja0FHQ0VuICAgICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBiUnhBR0NGcmVlemVUaHJlc01vZGUgICAgMHg0MDAwMDAwMAorI2RlZmluZSBiUnhPdmVyRmxvd0NoZWNrVHlwZSAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBiUnhBR0NTaGlmdCAgICAgICAgICAgICAgMHg3ZgorI2RlZmluZSBiVFJTV19UcmlfT25seSAgICAgICAgICAgMHg4MAorI2RlZmluZSBiUG93ZXJUaHJlcyAgICAgICAgICAgICAgMHgzMDAKKyNkZWZpbmUgYlJ4QUdDRW4gICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBiUnhBR0NUb2dldGhlckVuICAgICAgICAgMHgyCisjZGVmaW5lIGJSeEFHQ01pbiAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgYlJ4SFBfSW5pICAgICAgICAgICAgICAgIDB4NworI2RlZmluZSBiUnhIUF9UUkxOQSAgICAgICAgICAgICAgMHg3MAorI2RlZmluZSBiUnhIUF9SU1NJICAgICAgICAgICAgICAgMHg3MDAKKyNkZWZpbmUgYlJ4SFBfQkJQMSAgICAgICAgICAgICAgIDB4NzAwMAorI2RlZmluZSBiUnhIUF9CQlAyICAgICAgICAgICAgICAgMHg3MDAwMAorI2RlZmluZSBiUnhIUF9CQlAzICAgICAgICAgICAgICAgMHg3MDAwMDAKKyNkZWZpbmUgYlJTU0lfSCAgICAgICAgICAgICAgICAgIDB4N2YwMDAwICAgICAvL3RoZSB0aHJlc2hvbGQgZm9yIGhpZ2ggcG93ZXIKKyNkZWZpbmUgYlJTU0lfR2VuICAgICAgICAgICAgICAgIDB4N2YwMDAwMDAgICAvL3RoZSB0aHJlc2hvbGQgZm9yIGFudCBkaXZlcnNpdHkKKyNkZWZpbmUgYlJ4U2V0dGxlX1RSU1cgICAgICAgICAgIDB4NworI2RlZmluZSBiUnhTZXR0bGVfTE5BICAgICAgICAgICAgMHgzOAorI2RlZmluZSBiUnhTZXR0bGVfUlNTSSAgICAgICAgICAgMHgxYzAKKyNkZWZpbmUgYlJ4U2V0dGxlX0JCUCAgICAgICAgICAgIDB4ZTAwCisjZGVmaW5lIGJSeFNldHRsZV9SeEhQICAgICAgICAgICAweDcwMDAKKyNkZWZpbmUgYlJ4U2V0dGxlX0FudFNXX1JTU0kgICAgIDB4MzgwMDAKKyNkZWZpbmUgYlJ4U2V0dGxlX0FudFNXICAgICAgICAgIDB4YzAwMDAKKyNkZWZpbmUgYlJ4UHJvY2Vzc1RpbWVfREFHQyAgICAgIDB4MzAwMDAwCisjZGVmaW5lIGJSeFNldHRsZV9IU1NJICAgICAgICAgICAweDQwMDAwMAorI2RlZmluZSBiUnhQcm9jZXNzVGltZV9CQlBQVyAgICAgMHg4MDAwMDAKKyNkZWZpbmUgYlJ4QW50ZW5uYVBvd2VyU2hpZnQgICAgIDB4MzAwMDAwMAorI2RlZmluZSBiUlNTSVRhYmxlU2VsZWN0ICAgICAgICAgMHhjMDAwMDAwCisjZGVmaW5lIGJSeEhQX0ZpbmFsICAgICAgICAgICAgICAweDcwMDAwMDAKKyNkZWZpbmUgYlJ4SFRTZXR0bGVfQkJQICAgICAgICAgIDB4NworI2RlZmluZSBiUnhIVFNldHRsZV9IU1NJICAgICAgICAgMHg4CisjZGVmaW5lIGJSeEhUU2V0dGxlX1J4SFAgICAgICAgICAweDcwCisjZGVmaW5lIGJSeEhUU2V0dGxlX0JCUFBXICAgICAgICAweDgwCisjZGVmaW5lIGJSeEhUU2V0dGxlX0lkbGUgICAgICAgICAweDMwMAorI2RlZmluZSBiUnhIVFNldHRsZV9SZXNlcnZlZCAgICAgMHgxYzAwCisjZGVmaW5lIGJSeEhUUnhIUEVuICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgYlJ4SFRBR0NGcmVlemVUaHJlcyAgICAgIDB4MzAwMDAKKyNkZWZpbmUgYlJ4SFRBR0NUb2dldGhlckVuICAgICAgIDB4NDAwMDAKKyNkZWZpbmUgYlJ4SFRBR0NNaW4gICAgICAgICAgICAgIDB4ODAwMDAKKyNkZWZpbmUgYlJ4SFRBR0NFbiAgICAgICAgICAgICAgIDB4MTAwMDAwCisjZGVmaW5lIGJSeEhUREFHQ0VuICAgICAgICAgICAgICAweDIwMDAwMAorI2RlZmluZSBiUnhIVFJ4SFBfQkJQICAgICAgICAgICAgMHgxYzAwMDAwCisjZGVmaW5lIGJSeEhUUnhIUF9GaW5hbCAgICAgICAgICAweGUwMDAwMDAwCisjZGVmaW5lIGJSeFBXUmF0aW9USCAgICAgICAgICAgICAweDMKKyNkZWZpbmUgYlJ4UFdSYXRpb0VuICAgICAgICAgICAgIDB4NAorI2RlZmluZSBiUnhNRkhvbGQgICAgICAgICAgICAgICAgMHgzODAwCisjZGVmaW5lIGJSeFBEX0RlbGF5X1RIMSAgICAgICAgICAweDM4CisjZGVmaW5lIGJSeFBEX0RlbGF5X1RIMiAgICAgICAgICAweDFjMAorI2RlZmluZSBiUnhQRF9EQ19DT1VOVF9NQVggICAgICAgMHg2MDAKKy8vI2RlZmluZSBiUnhNRl9Ib2xkICAgICAgICAgICAgICAgMHgzODAwCisjZGVmaW5lIGJSeFBEX0RlbGF5X1RIICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgYlJ4UHJvY2Vzc19EZWxheSAgICAgICAgIDB4ZjAwMDAKKyNkZWZpbmUgYlJ4U2VhcmNocmFuZ2VfR0kyX0Vhcmx5IDB4NzAwMDAwCisjZGVmaW5lIGJSeEZyYW1lX0d1YXJkX0NvdW50ZXJfTCAweDM4MDAwMDAKKyNkZWZpbmUgYlJ4U0dJX0d1YXJkX0wgICAgICAgICAgIDB4YzAwMDAwMAorI2RlZmluZSBiUnhTR0lfU2VhcmNoX0wgICAgICAgICAgMHgzMDAwMDAwMAorI2RlZmluZSBiUnhTR0lfVEggICAgICAgICAgICAgICAgMHhjMDAwMDAwMAorI2RlZmluZSBiREZTQ250MCAgICAgICAgICAgICAgICAgMHhmZgorI2RlZmluZSBiREZTQ250MSAgICAgICAgICAgICAgICAgMHhmZjAwCisjZGVmaW5lIGJERlNGbGFnICAgICAgICAgICAgICAgICAweGYwMDAwCisKKyNkZWZpbmUgYk1GV2VpZ2h0U3VtICAgICAgICAgICAgIDB4MzAwMDAwCisjZGVmaW5lIGJNaW5JZHhUSCAgICAgICAgICAgICAgICAweDdmMDAwMDAwCisKKyNkZWZpbmUgYkRBRm9ybWF0ICAgICAgICAgICAgICAgIDB4NDAwMDAKKworI2RlZmluZSBiVHhDaEVtdUVuYWJsZSAgICAgICAgICAgMHgwMTAwMDAwMAorCisjZGVmaW5lIGJUUlNXSXNvbGF0aW9uX0EgICAgICAgICAweDdmCisjZGVmaW5lIGJUUlNXSXNvbGF0aW9uX0IgICAgICAgICAweDdmMDAKKyNkZWZpbmUgYlRSU1dJc29sYXRpb25fQyAgICAgICAgIDB4N2YwMDAwCisjZGVmaW5lIGJUUlNXSXNvbGF0aW9uX0QgICAgICAgICAweDdmMDAwMDAwCisKKyNkZWZpbmUgYkV4dExOQUdhaW4gICAgICAgICAgICAgIDB4N2MwMAorCisvL3BhZ2UgZAorI2RlZmluZSBiU1RCQ0VuICAgICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lIGJBbnRlbm5hTWFwcGluZyAgICAgICAgICAweDEwCisjZGVmaW5lIGJOc3MgICAgICAgICAgICAgICAgICAgICAweDIwCisjZGVmaW5lIGJDRk9BbnRTdW1EICAgICAgICAgICAgICAweDIwMAorI2RlZmluZSBiUEhZQ291bnRlclJlc2V0ICAgICAgICAgMHg4MDAwMDAwCisjZGVmaW5lIGJDRk9SZXBvcnRHZXQgICAgICAgICAgICAweDQwMDAwMDAKKyNkZWZpbmUgYk9GRE1Db250aW51ZVR4ICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgYk9GRE1TaW5nbGVDYXJyaWVyICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgYk9GRE1TaW5nbGVUb25lICAgICAgICAgIDB4NDAwMDAwMDAKKy8vI2RlZmluZSBiUnhQYXRoMSAgICAgICAgICAgICAgICAgMHgwMQorLy8jZGVmaW5lIGJSeFBhdGgyICAgICAgICAgICAgICAgICAweDAyCisvLyNkZWZpbmUgYlJ4UGF0aDMgICAgICAgICAgICAgICAgIDB4MDQKKy8vI2RlZmluZSBiUnhQYXRoNCAgICAgICAgICAgICAgICAgMHgwOAorLy8jZGVmaW5lIGJUeFBhdGgxICAgICAgICAgICAgICAgICAweDEwCisvLyNkZWZpbmUgYlR4UGF0aDIgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgYkhURGV0ZWN0ICAgICAgICAgICAgICAgIDB4MTAwCisjZGVmaW5lIGJDRk9FbiAgICAgICAgICAgICAgICAgICAweDEwMDAwCisjZGVmaW5lIGJDRk9WYWx1ZSAgICAgICAgICAgICAgICAweGZmZjAwMDAwCisjZGVmaW5lIGJTaWdUb25lX1JlICAgICAgICAgICAgICAweDNmCisjZGVmaW5lIGJTaWdUb25lX0ltICAgICAgICAgICAgICAweDdmMDAKKyNkZWZpbmUgYkNvdW50ZXJfQ0NBICAgICAgICAgICAgIDB4ZmZmZgorI2RlZmluZSBiQ291bnRlcl9QYXJpdHlGYWlsICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBiQ291bnRlcl9SYXRlSWxsZWdhbCAgICAgMHhmZmZmCisjZGVmaW5lIGJDb3VudGVyX0NSQzhGYWlsICAgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIGJDb3VudGVyX01DU05vU3VwcG9ydCAgICAweGZmZmYKKyNkZWZpbmUgYkNvdW50ZXJfRmFzdFN5bmMgICAgICAgIDB4ZmZmZgorI2RlZmluZSBiU2hvcnRDRk8gICAgICAgICAgICAgICAgMHhmZmYKKyNkZWZpbmUgYlNob3J0Q0ZPVExlbmd0aCAgICAgICAgIDEyICAgLy90b3RhbAorI2RlZmluZSBiU2hvcnRDRk9GTGVuZ3RoICAgICAgICAgMTEgICAvL2ZyYWN0aW9uCisjZGVmaW5lIGJMb25nQ0ZPICAgICAgICAgICAgICAgICAweDdmZgorI2RlZmluZSBiTG9uZ0NGT1RMZW5ndGggICAgICAgICAgMTEKKyNkZWZpbmUgYkxvbmdDRk9GTGVuZ3RoICAgICAgICAgIDExCisjZGVmaW5lIGJUYWlsQ0ZPICAgICAgICAgICAgICAgICAweDFmZmYKKyNkZWZpbmUgYlRhaWxDRk9UTGVuZ3RoICAgICAgICAgIDEzCisjZGVmaW5lIGJUYWlsQ0ZPRkxlbmd0aCAgICAgICAgICAxMgorCisjZGVmaW5lIGJtYXhfZW5fcHdkQiAgICAgICAgICAgICAweGZmZmYKKyNkZWZpbmUgYkNDX3Bvd2VyX2RCICAgICAgICAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgYm5vaXNlX3B3ZEIgICAgICAgICAgICAgIDB4ZmZmZgorI2RlZmluZSBiUG93ZXJNZWFzVExlbmd0aCAgICAgICAgMTAKKyNkZWZpbmUgYlBvd2VyTWVhc0ZMZW5ndGggICAgICAgIDMKKyNkZWZpbmUgYlJ4X0hUX0JXICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBiUnhTQyAgICAgICAgICAgICAgICAgICAgMHg2CisjZGVmaW5lIGJSeF9IVCAgICAgICAgICAgICAgICAgICAweDgKKworI2RlZmluZSBiTkJfaW50Zl9kZXRfb24gICAgICAgICAgMHgxCisjZGVmaW5lIGJJbnRmX3dpbl9sZW5fY2ZnICAgICAgICAweDMwCisjZGVmaW5lIGJOQl9JbnRmX1RIX2NmZyAgICAgICAgICAweDFjMAorCisjZGVmaW5lIGJSRkdhaW4gICAgICAgICAgICAgICAgICAweDNmCisjZGVmaW5lIGJUYWJsZVNlbCAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIGJUUlNXICAgICAgICAgICAgICAgICAgICAweDgwCisKKyNkZWZpbmUgYlJ4U05SX0EgICAgICAgICAgICAgICAgIDB4ZmYKKyNkZWZpbmUgYlJ4U05SX0IgICAgICAgICAgICAgICAgIDB4ZmYwMAorI2RlZmluZSBiUnhTTlJfQyAgICAgICAgICAgICAgICAgMHhmZjAwMDAKKyNkZWZpbmUgYlJ4U05SX0QgICAgICAgICAgICAgICAgIDB4ZmYwMDAwMDAKKyNkZWZpbmUgYlNOUkVWTVRMZW5ndGggICAgICAgICAgIDgKKyNkZWZpbmUgYlNOUkVWTUZMZW5ndGggICAgICAgICAgIDEKKworI2RlZmluZSBiQ1NJMXN0ICAgICAgICAgICAgICAgICAgMHhmZgorI2RlZmluZSBiQ1NJMm5kICAgICAgICAgICAgICAgICAgMHhmZjAwCisjZGVmaW5lIGJSeEVWTTFzdCAgICAgICAgICAgICAgICAweGZmMDAwMAorI2RlZmluZSBiUnhFVk0ybmQgICAgICAgICAgICAgICAgMHhmZjAwMDAwMAorCisjZGVmaW5lIGJTSUdFVk0gICAgICAgICAgICAgICAgICAweGZmCisjZGVmaW5lIGJQV0RCICAgICAgICAgICAgICAgICAgICAweGZmMDAKKyNkZWZpbmUgYlNHSUVOICAgICAgICAgICAgICAgICAgIDB4MTAwMDAKKworI2RlZmluZSBiU0ZhY3RvclFBTTEgICAgICAgICAgICAgMHhmCisjZGVmaW5lIGJTRmFjdG9yUUFNMiAgICAgICAgICAgICAweGYwCisjZGVmaW5lIGJTRmFjdG9yUUFNMyAgICAgICAgICAgICAweGYwMAorI2RlZmluZSBiU0ZhY3RvclFBTTQgICAgICAgICAgICAgMHhmMDAwCisjZGVmaW5lIGJTRmFjdG9yUUFNNSAgICAgICAgICAgICAweGYwMDAwCisjZGVmaW5lIGJTRmFjdG9yUUFNNiAgICAgICAgICAgICAweGYwMDAwCisjZGVmaW5lIGJTRmFjdG9yUUFNNyAgICAgICAgICAgICAweGYwMDAwMAorI2RlZmluZSBiU0ZhY3RvclFBTTggICAgICAgICAgICAgMHhmMDAwMDAwCisjZGVmaW5lIGJTRmFjdG9yUUFNOSAgICAgICAgICAgICAweGYwMDAwMDAwCisjZGVmaW5lIGJDU0lTY2hlbWUgICAgICAgICAgICAgICAweDEwMDAwMAorCisjZGVmaW5lIGJOb2lzZUx2bFRvcFNldCAgICAgICAgICAweDMKKyNkZWZpbmUgYkNoU21vb3RoICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBiQ2hTbW9vdGhDZmcxICAgICAgICAgICAgMHgzOAorI2RlZmluZSBiQ2hTbW9vdGhDZmcyICAgICAgICAgICAgMHgxYzAKKyNkZWZpbmUgYkNoU21vb3RoQ2ZnMyAgICAgICAgICAgIDB4ZTAwCisjZGVmaW5lIGJDaFNtb290aENmZzQgICAgICAgICAgICAweDcwMDAKKyNkZWZpbmUgYk1SQ01vZGUgICAgICAgICAgICAgICAgIDB4ODAwMDAwCisjZGVmaW5lIGJUSEVWTUNmZyAgICAgICAgICAgICAgICAweDcwMDAwMDAKKworI2RlZmluZSBiTG9vcEZpdFR5cGUgICAgICAgICAgICAgMHgxCisjZGVmaW5lIGJVcGRDRk8gICAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIGJVcGRDRk9PZmZEYXRhICAgICAgICAgICAweDgwCisjZGVmaW5lIGJBZHZVcGRDRk8gICAgICAgICAgICAgICAweDEwMAorI2RlZmluZSBiQWR2VGltZUN0cmwgICAgICAgICAgICAgMHg4MDAKKyNkZWZpbmUgYlVwZENsa28gICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBiRkMgICAgICAgICAgICAgICAgICAgICAgMHg2MDAwCisjZGVmaW5lIGJUcmFja2luZ01vZGUgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgYlBoQ21wRW5hYmxlICAgICAgICAgICAgIDB4MTAwMDAKKyNkZWZpbmUgYlVwZENsa29MVEYgICAgICAgICAgICAgIDB4MjAwMDAKKyNkZWZpbmUgYkNvbUNoQ0ZPICAgICAgICAgICAgICAgIDB4NDAwMDAKKyNkZWZpbmUgYkNTSUVzdGlNb2RlICAgICAgICAgICAgIDB4ODAwMDAKKyNkZWZpbmUgYkFkdlVwZEVxeiAgICAgICAgICAgICAgIDB4MTAwMDAwCisjZGVmaW5lIGJVQ2hDZmcgICAgICAgICAgICAgICAgICAweDcwMDAwMDAKKyNkZWZpbmUgYlVwZEVxeiAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMAorCisvL3BhZ2UgZQorI2RlZmluZSBiVHhBR0NSYXRlMThfMDYJCQkweDdmN2Y3ZjdmCisjZGVmaW5lIGJUeEFHQ1JhdGU1NF8yNAkJCTB4N2Y3ZjdmN2YKKyNkZWZpbmUgYlR4QUdDUmF0ZU1DUzMyCQkweDdmCisjZGVmaW5lIGJUeEFHQ1JhdGVDQ0sJCQkweDdmMDAKKyNkZWZpbmUgYlR4QUdDUmF0ZU1DUzNfTUNTMAkweDdmN2Y3ZjdmCisjZGVmaW5lIGJUeEFHQ1JhdGVNQ1M3X01DUzQJMHg3ZjdmN2Y3ZgorI2RlZmluZSBiVHhBR0NSYXRlTUNTMTFfTUNTOAkweDdmN2Y3ZjdmCisjZGVmaW5lIGJUeEFHQ1JhdGVNQ1MxNV9NQ1MxMgkweDdmN2Y3ZjdmCisKKworLy9SeCBQc2VkdW8gbm9pc2UKKyNkZWZpbmUgYlJ4UGVzdWRvTm9pc2VPbiAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgYlJ4UGVzdWRvTm9pc2VfQSAgICAgICAgIDB4ZmYKKyNkZWZpbmUgYlJ4UGVzdWRvTm9pc2VfQiAgICAgICAgIDB4ZmYwMAorI2RlZmluZSBiUnhQZXN1ZG9Ob2lzZV9DICAgICAgICAgMHhmZjAwMDAKKyNkZWZpbmUgYlJ4UGVzdWRvTm9pc2VfRCAgICAgICAgIDB4ZmYwMDAwMDAKKyNkZWZpbmUgYlBlc3Vkb05vaXNlU3RhdGVfQSAgICAgIDB4ZmZmZgorI2RlZmluZSBiUGVzdWRvTm9pc2VTdGF0ZV9CICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBiUGVzdWRvTm9pc2VTdGF0ZV9DICAgICAgMHhmZmZmCisjZGVmaW5lIGJQZXN1ZG9Ob2lzZVN0YXRlX0QgICAgICAweGZmZmYwMDAwCisKKy8vUkYKKy8vWmVicmExCisjZGVmaW5lIGJaZWJyYTFfSFNTSUVuYWJsZSAgICAgICAgMHg4CisjZGVmaW5lIGJaZWJyYTFfVFJ4Q29udHJvbCAgICAgICAgMHhjMDAKKyNkZWZpbmUgYlplYnJhMV9UUnhHYWluU2V0dGluZyAgICAweDA3ZgorI2RlZmluZSBiWmVicmExX1J4Q29ybmVyICAgICAgICAgIDB4YzAwCisjZGVmaW5lIGJaZWJyYTFfVHhDaGFyZ2VQdW1wICAgICAgMHgzOAorI2RlZmluZSBiWmVicmExX1J4Q2hhcmdlUHVtcCAgICAgIDB4NworI2RlZmluZSBiWmVicmExX0NoYW5uZWxOdW0gICAgICAgIDB4ZjgwCisjZGVmaW5lIGJaZWJyYTFfVHhMUEZCVyAgICAgICAgICAgMHg0MDAKKyNkZWZpbmUgYlplYnJhMV9SeExQRkJXICAgICAgICAgICAweDYwMAorCisvL1plYnJhNAorI2RlZmluZSBiUlRMODI1NlJlZ01vZGVDdHJsMSAgICAgIDB4MTAwCisjZGVmaW5lIGJSVEw4MjU2UmVnTW9kZUN0cmwwICAgICAgMHg0MAorI2RlZmluZSBiUlRMODI1Nl9UeExQRkJXICAgICAgICAgIDB4MTgKKyNkZWZpbmUgYlJUTDgyNTZfUnhMUEZCVyAgICAgICAgICAweDYwMAorCisvL1JUTDgyNTgKKyNkZWZpbmUgYlJUTDgyNThfVHhMUEZCVyAgICAgICAgICAweGMKKyNkZWZpbmUgYlJUTDgyNThfUnhMUEZCVyAgICAgICAgICAweGMwMAorI2RlZmluZSBiUlRMODI1OF9SU1NJTFBGQlcgICAgICAgIDB4YzAKKworLy9ieXRlIGVuZGFibGUgZm9yIHNiX3dyaXRlCisjZGVmaW5lIGJCeXRlMCAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIGJCeXRlMSAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lIGJCeXRlMiAgICAgICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lIGJCeXRlMyAgICAgICAgICAgICAgICAgICAgMHg4CisjZGVmaW5lIGJXb3JkMCAgICAgICAgICAgICAgICAgICAgMHgzCisjZGVmaW5lIGJXb3JkMSAgICAgICAgICAgICAgICAgICAgMHhjCisjZGVmaW5lIGJEV29yZCAgICAgICAgICAgICAgICAgICAgMHhmCisKKy8vZm9yIFB1dFJlZ3NldHRpbmcgJiBHZXRSZWdTZXR0aW5nIEJpdE1hc2sKKyNkZWZpbmUgYk1hc2tCeXRlMCAgICAgICAgICAgICAgICAweGZmCisjZGVmaW5lIGJNYXNrQnl0ZTEgICAgICAgICAgICAgICAgMHhmZjAwCisjZGVmaW5lIGJNYXNrQnl0ZTIgICAgICAgICAgICAgICAgMHhmZjAwMDAKKyNkZWZpbmUgYk1hc2tCeXRlMyAgICAgICAgICAgICAgICAweGZmMDAwMDAwCisjZGVmaW5lIGJNYXNrSFdvcmQgICAgICAgICAgICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBiTWFza0xXb3JkICAgICAgICAgICAgICAgIDB4MDAwMGZmZmYKKyNkZWZpbmUgYk1hc2tEV29yZCAgICAgICAgICAgICAgICAweGZmZmZmZmZmCisKKy8vZm9yIFB1dFJGUmVnc2V0dGluZyAmIEdldFJGUmVnU2V0dGluZyBCaXRNYXNrCisjZGVmaW5lIGJNYXNrMTJCaXRzICAgICAgICAgICAgICAgMHhmZmYKKworI2RlZmluZSBiRW5hYmxlICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBiRGlzYWJsZSAgICAgICAgICAgICAgICAgIDB4MAorCisjZGVmaW5lIExlZnRBbnRlbm5hICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIFJpZ2h0QW50ZW5uYSAgICAgICAgICAgICAgMHgxCisKKyNkZWZpbmUgdENoZWNrVHhTdGF0dXMgICAgICAgICAgICA1MDAgICAvLzUwMG1zCisjZGVmaW5lIHRVcGRhdGVSeENvdW50ZXIgICAgICAgICAgMTAwICAgLy8xMDBtcworCisjZGVmaW5lIHJhdGVDQ0sgICAgIDAKKyNkZWZpbmUgcmF0ZU9GRE0gICAgMQorI2RlZmluZSByYXRlSFQgICAgICAyCisKKy8vZGVmaW5lIFJlZ2lzdGVyLUVuZAorI2RlZmluZSBiUE1BQ19FbmQgICAgICAgICAgICAgICAgIDB4MWZmCisjZGVmaW5lIGJGUEdBUEhZMF9FbmQgICAgICAgICAgICAgMHg4ZmYKKyNkZWZpbmUgYkZQR0FQSFkxX0VuZCAgICAgICAgICAgICAweDlmZgorI2RlZmluZSBiQ0NLUEhZMF9FbmQgICAgICAgICAgICAgIDB4YWZmCisjZGVmaW5lIGJPRkRNUEhZMF9FbmQgICAgICAgICAgICAgMHhjZmYKKyNkZWZpbmUgYk9GRE1QSFkxX0VuZCAgICAgICAgICAgICAweGRmZgorCisvL2RlZmluZSBtYXggZGVidWcgaXRlbSBpbiBlYWNoIGRlYnVnIHBhZ2UKKy8vI2RlZmluZSBiTWF4SXRlbV9GUEdBX1BIWTAgICAgICAgIDB4OQorLy8jZGVmaW5lIGJNYXhJdGVtX0ZQR0FfUEhZMSAgICAgICAgMHgzCisvLyNkZWZpbmUgYk1heEl0ZW1fUEhZXzExQiAgICAgICAgICAweDE2CisvLyNkZWZpbmUgYk1heEl0ZW1fT0ZETV9QSFkwICAgICAgICAweDI5CisvLyNkZWZpbmUgYk1heEl0ZW1fT0ZETV9QSFkxICAgICAgICAweDAKKworI2RlZmluZSBiUE1BQ0NvbnRyb2wgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBiV01BQ0NvbnRyb2wgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBiV05JQ0NvbnRyb2wgICAgICAgICAgICAgIDB4MgorCisjZGVmaW5lIFBhdGhBICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIFBhdGhCICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFBhdGhDICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lIFBhdGhEICAgICAgICAgICAgICAgICAgICAgMHgzCisKKyNkZWZpbmUJclJUTDgyNTZSeE1peGVyUG9sZQkJMHhiCisjZGVmaW5lIAliWmVicmFSeE1peGVyUG9sZQkJMHg2CisjZGVmaW5lIAlyUlRMODI1NlR4QkJPUEJpYXMgICAgICAgIDB4OQorI2RlZmluZSAJYlJUTDgyNTZUeEJCT1BCaWFzICAgICAgIDB4NDAwCisjZGVmaW5lIAlyUlRMODI1NlR4QkJCVyAgICAgICAgICAgICAxOQorI2RlZmluZSAJYlJUTDgyNTZUeEJCQlcgICAgICAgICAgICAJMHgxOAorCisjZW5kaWYJLy9fX0lOQ19IQUw4MTkwUENJUEhZUkVHX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zYW1zdW5nLWxhcHRvcC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3NhbXN1bmctbGFwdG9wL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI3YzYwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zYW1zdW5nLWxhcHRvcC9LY29uZmlnCkBAIC0wLDAgKzEsMTAgQEAKK2NvbmZpZyBTQU1TVU5HX0xBUFRPUAorCXRyaXN0YXRlICJTYW1zdW5nIExhcHRvcCBkcml2ZXIiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBSRktJTEwgJiYgQkFDS0xJR0hUX0NMQVNTX0RFVklDRSAmJiBYODYKKwloZWxwCisJICBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIGEgZHJpdmVyIGZvciB0aGUgTjEyOCBTYW1zdW5nIExhcHRvcAorCSAgcHJvdmlkaW5nIGNvbnRyb2wgb3ZlciB0aGUgV2lyZWxlc3MgTEVEIGFuZCB0aGUgTENEIGJhY2tsaWdodAorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UKKwkgIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzYW1zdW5nLWxhcHRvcC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zYW1zdW5nLWxhcHRvcC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9zYW1zdW5nLWxhcHRvcC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzZmNDIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NhbXN1bmctbGFwdG9wL01ha2VmaWxlCkBAIC0wLDAgKzEgQEAKK29iai0kKENPTkZJR19TQU1TVU5HX0xBUFRPUCkJKz0gc2Ftc3VuZy1sYXB0b3AubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NhbXN1bmctbGFwdG9wL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvc2Ftc3VuZy1sYXB0b3AvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2E2ZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NhbXN1bmctbGFwdG9wL1RPRE8KQEAgLTAsMCArMSw1IEBACitUT0RPOgorCS0gcmV2aWV3IGZyb20gb3RoZXIgZGV2ZWxvcGVycworCS0gZmlndXJlIG91dCBBQ1BJIHZpZGVvIGlzc3VlcworCitQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQHN1c2UuZGU+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2Ftc3VuZy1sYXB0b3Avc2Ftc3VuZy1sYXB0b3AuYyBiL2RyaXZlcnMvc3RhZ2luZy9zYW1zdW5nLWxhcHRvcC9zYW1zdW5nLWxhcHRvcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NzcxMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc2Ftc3VuZy1sYXB0b3Avc2Ftc3VuZy1sYXB0b3AuYwpAQCAtMCwwICsxLDU0MiBAQAorLyoKKyAqIFNhbXN1bmcgTjEzMCBMYXB0b3AgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdyZWcgS3JvYWgtSGFydG1hbiAoZ3JlZ2toQHN1c2UuZGUpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTm92ZWxsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmZraWxsLmg+CisKKy8qCisgKiBUaGlzIGRyaXZlciBpcyBuZWVkZWQgYmVjYXVzZSBhIG51bWJlciBvZiBTYW1zdW5nIGxhcHRvcHMgZG8gbm90IGhvb2sKKyAqIHRoZWlyIGNvbnRyb2wgc2V0dGluZ3MgdGhyb3VnaCBBQ1BJLiAgU28gd2UgaGF2ZSB0byBwb2tlIGFyb3VuZCBpbiB0aGUKKyAqIEJJT1MgdG8gZG8gdGhpbmdzIGxpa2UgYnJpZ2h0bmVzcyB2YWx1ZXMsIGFuZCAic3BlY2lhbCIga2V5IGNvbnRyb2xzLgorICovCisKKy8qCisgKiBXZSBoYXZlIDAgLSA4IGFzIHZhbGlkIGJyaWdodG5lc3MgbGV2ZWxzLiAgVGhlIHNwZWNzIHNheSB0aGF0IGxldmVsIDAgc2hvdWxkCisgKiBiZSByZXNlcnZlZCBieSB0aGUgQklPUyAod2hpY2ggcmVhbGx5IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlKSwgd2UgdGVsbAorICogdXNlcnNwYWNlIHRoYXQgdGhlIHZhbHVlIGlzIDAgLSA3IGFuZCB0aGVuIGp1c3QgdGVsbCB0aGUgaGFyZHdhcmUgMSAtIDgKKyAqLworI2RlZmluZSBNQVhfQlJJR0hUCTB4MDcKKworLyogQnJpZ2h0bmVzcyBpcyAwIC0gOCwgYXMgZGVzY3JpYmVkIGFib3ZlLiAgVmFsdWUgMCBpcyBmb3IgdGhlIEJJT1MgdG8gdXNlICovCisjZGVmaW5lIEdFVF9CUklHSFRORVNTCQkJMHgwMAorI2RlZmluZSBTRVRfQlJJR0hUTkVTUwkJCTB4MDEKKworLyogZmlyc3QgYnl0ZToKKyAqIDB4MDAgLSB3aXJlbGVzcyBpcyBvZmYKKyAqIDB4MDEgLSB3aXJlbGVzcyBpcyBvbgorICogc2Vjb25kIGJ5dGU6CisgKiAweDAyIC0gM0cgaXMgb2ZmCisgKiAweDAzIC0gM0cgaXMgb24KKyAqIFRPRE8sIHZlcmlmeSAzRyBpcyBjb3JyZWN0LCB0aGF0IGRvZXNuJ3Qgc2VlbSByaWdodC4uLgorICovCisjZGVmaW5lIEdFVF9XSVJFTEVTU19CVVRUT04JCTB4MDIKKyNkZWZpbmUgU0VUX1dJUkVMRVNTX0JVVFRPTgkJMHgwMworCisvKiAwIGlzIG9mZiwgMSBpcyBvbiAqLworI2RlZmluZSBHRVRfQkFDS0xJR0hUCQkJMHgwNAorI2RlZmluZSBTRVRfQkFDS0xJR0hUCQkJMHgwNQorCisvKgorICogMHg4MCBvciAweDAwIC0gbm8gYWN0aW9uCisgKiAweDgxIC0gcmVjb3Zlcnkga2V5IHByZXNzZWQKKyAqLworI2RlZmluZSBHRVRfUkVDT1ZFUllfTUVUSE9ECQkweDA2CisjZGVmaW5lIFNFVF9SRUNPVkVSWV9NRVRIT0QJCTB4MDcKKworLyogMCBpcyBsb3csIDEgaXMgaGlnaCAqLworI2RlZmluZSBHRVRfUEVSRk9STUFOQ0VfTEVWRUwJCTB4MDgKKyNkZWZpbmUgU0VUX1BFUkZPUk1BTkNFX0xFVkVMCQkweDA5CisKKy8qCisgKiBUZWxsIHRoZSBCSU9TIHRoYXQgTGludXggaXMgcnVubmluZyBvbiB0aGlzIG1hY2hpbmUuCisgKiA4MSBpcyBvbiwgODAgaXMgb2ZmCisgKi8KKyNkZWZpbmUgU0VUX0xJTlVYCQkJMHgwYQorCisKKyNkZWZpbmUgTUFJTl9GVU5DVElPTgkJCTB4NGM0OQorCisjZGVmaW5lIFNBQklfSEVBREVSX1BPUlQJCTB4MDAKKyNkZWZpbmUgU0FCSV9IRUFERVJfUkVfTUVNCQkweDAyCisjZGVmaW5lIFNBQklfSEVBREVSX0lGQUNFRlVOQwkJMHgwMworI2RlZmluZSBTQUJJX0hFQURFUl9FTl9NRU0JCTB4MDQKKyNkZWZpbmUgU0FCSV9IRUFERVJfREFUQV9PRkZTRVQJCTB4MDUKKyNkZWZpbmUgU0FCSV9IRUFERVJfREFUQV9TRUdNRU5UCTB4MDcKKworI2RlZmluZSBTQUJJX0lGQUNFX01BSU4JCQkweDAwCisjZGVmaW5lIFNBQklfSUZBQ0VfU1VCCQkJMHgwMgorI2RlZmluZSBTQUJJX0lGQUNFX0NPTVBMRVRFCQkweDA0CisjZGVmaW5lIFNBQklfSUZBQ0VfREFUQQkJCTB4MDUKKworLyogU3RydWN0dXJlIHRvIGdldCBkYXRhIGJhY2sgdG8gdGhlIGNhbGxpbmcgZnVuY3Rpb24gKi8KK3N0cnVjdCBzYWJpX3JldHZhbCB7CisJdTggcmV0dmFsWzIwXTsKK307CisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnNhYmk7CitzdGF0aWMgdm9pZCBfX2lvbWVtICpzYWJpX2lmYWNlOworc3RhdGljIHZvaWQgX19pb21lbSAqZjAwMDBfc2VnbWVudDsKK3N0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmFja2xpZ2h0X2RldmljZTsKK3N0YXRpYyBzdHJ1Y3QgbXV0ZXggc2FiaV9tdXRleDsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzZGV2Oworc3RhdGljIHN0cnVjdCByZmtpbGwgKnJmazsKKworc3RhdGljIGludCBmb3JjZTsKK21vZHVsZV9wYXJhbShmb3JjZSwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlLCAiRGlzYWJsZSB0aGUgRE1JIGNoZWNrIGFuZCBmb3JjZXMgdGhlIGRyaXZlciB0byBiZSBsb2FkZWQiKTsKKworc3RhdGljIGludCBkZWJ1ZzsKK21vZHVsZV9wYXJhbShkZWJ1ZywgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGVuYWJsZWQgb3Igbm90Iik7CisKK3N0YXRpYyBpbnQgc2FiaV9nZXRfY29tbWFuZCh1OCBjb21tYW5kLCBzdHJ1Y3Qgc2FiaV9yZXR2YWwgKnNyZXR2YWwpCit7CisJaW50IHJldHZhbCA9IDA7CisJdTE2IHBvcnQgPSByZWFkdyhzYWJpICsgU0FCSV9IRUFERVJfUE9SVCk7CisKKwltdXRleF9sb2NrKCZzYWJpX211dGV4KTsKKworCS8qIGVuYWJsZSBtZW1vcnkgdG8gYmUgYWJsZSB0byB3cml0ZSB0byBpdCAqLworCW91dGIocmVhZGIoc2FiaSArIFNBQklfSEVBREVSX0VOX01FTSksIHBvcnQpOworCisJLyogd3JpdGUgb3V0IHRoZSBjb21tYW5kICovCisJd3JpdGV3KE1BSU5fRlVOQ1RJT04sIHNhYmlfaWZhY2UgKyBTQUJJX0lGQUNFX01BSU4pOworCXdyaXRldyhjb21tYW5kLCBzYWJpX2lmYWNlICsgU0FCSV9JRkFDRV9TVUIpOworCXdyaXRlYigwLCBzYWJpX2lmYWNlICsgU0FCSV9JRkFDRV9DT01QTEVURSk7CisJb3V0YihyZWFkYihzYWJpICsgU0FCSV9IRUFERVJfSUZBQ0VGVU5DKSwgcG9ydCk7CisKKwkvKiB3cml0ZSBwcm90ZWN0IG1lbW9yeSB0byBtYWtlIGl0IHNhZmUgKi8KKwlvdXRiKHJlYWRiKHNhYmkgKyBTQUJJX0hFQURFUl9SRV9NRU0pLCBwb3J0KTsKKworCS8qIHNlZSBpZiB0aGUgY29tbWFuZCBhY3R1YWxseSBzdWNjZWVkZWQgKi8KKwlpZiAocmVhZGIoc2FiaV9pZmFjZSArIFNBQklfSUZBQ0VfQ09NUExFVEUpID09IDB4YWEgJiYKKwkgICAgcmVhZGIoc2FiaV9pZmFjZSArIFNBQklfSUZBQ0VfREFUQSkgIT0gMHhmZikgeworCQkvKgorCQkgKiBJdCBkaWQhCisJCSAqIFNhdmUgb2ZmIHRoZSBkYXRhIGludG8gYSBzdHJ1Y3R1cmUgc28gdGhlIGNhbGxlciB1c2UgaXQuCisJCSAqIFJpZ2h0IG5vdyB3ZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGZpcnN0IDQgYnl0ZXMsCisJCSAqIEkgc3VwcG9zZSB0aGVyZSBhcmUgY29tbWFuZHMgdGhhdCBuZWVkIG1vcmUsIGJ1dCBJIGRvbid0CisJCSAqIGtub3cgYWJvdXQgdGhlbS4KKwkJICovCisJCXNyZXR2YWwtPnJldHZhbFswXSA9IHJlYWRiKHNhYmlfaWZhY2UgKyBTQUJJX0lGQUNFX0RBVEEpOworCQlzcmV0dmFsLT5yZXR2YWxbMV0gPSByZWFkYihzYWJpX2lmYWNlICsgU0FCSV9JRkFDRV9EQVRBICsgMSk7CisJCXNyZXR2YWwtPnJldHZhbFsyXSA9IHJlYWRiKHNhYmlfaWZhY2UgKyBTQUJJX0lGQUNFX0RBVEEgKyAyKTsKKwkJc3JldHZhbC0+cmV0dmFsWzNdID0gcmVhZGIoc2FiaV9pZmFjZSArIFNBQklfSUZBQ0VfREFUQSArIDMpOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogU29tZXRoaW5nIGJhZCBoYXBwZW5lZCwgc28gcmVwb3J0IGl0IGFuZCBlcnJvciBvdXQgKi8KKwlwcmludGsoS0VSTl9XQVJOSU5HICJTQUJJIGNvbW1hbmQgMHglMDJ4IGZhaWxlZCB3aXRoIGNvbXBsZXRpb24gZmxhZyAweCUwMnggYW5kIG91dHB1dCAweCUwMnhcbiIsCisJCWNvbW1hbmQsIHJlYWRiKHNhYmlfaWZhY2UgKyBTQUJJX0lGQUNFX0NPTVBMRVRFKSwKKwkJcmVhZGIoc2FiaV9pZmFjZSArIFNBQklfSUZBQ0VfREFUQSkpOworCXJldHZhbCA9IC1FSU5WQUw7CitleGl0OgorCW11dGV4X3VubG9jaygmc2FiaV9tdXRleCk7CisJcmV0dXJuIHJldHZhbDsKKworfQorCitzdGF0aWMgaW50IHNhYmlfc2V0X2NvbW1hbmQodTggY29tbWFuZCwgdTggZGF0YSkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwl1MTYgcG9ydCA9IHJlYWR3KHNhYmkgKyBTQUJJX0hFQURFUl9QT1JUKTsKKworCW11dGV4X2xvY2soJnNhYmlfbXV0ZXgpOworCisJLyogZW5hYmxlIG1lbW9yeSB0byBiZSBhYmxlIHRvIHdyaXRlIHRvIGl0ICovCisJb3V0YihyZWFkYihzYWJpICsgU0FCSV9IRUFERVJfRU5fTUVNKSwgcG9ydCk7CisKKwkvKiB3cml0ZSBvdXQgdGhlIGNvbW1hbmQgKi8KKwl3cml0ZXcoTUFJTl9GVU5DVElPTiwgc2FiaV9pZmFjZSArIFNBQklfSUZBQ0VfTUFJTik7CisJd3JpdGV3KGNvbW1hbmQsIHNhYmlfaWZhY2UgKyBTQUJJX0lGQUNFX1NVQik7CisJd3JpdGViKDAsIHNhYmlfaWZhY2UgKyBTQUJJX0lGQUNFX0NPTVBMRVRFKTsKKwl3cml0ZWIoZGF0YSwgc2FiaV9pZmFjZSArIFNBQklfSUZBQ0VfREFUQSk7CisJb3V0YihyZWFkYihzYWJpICsgU0FCSV9IRUFERVJfSUZBQ0VGVU5DKSwgcG9ydCk7CisKKwkvKiB3cml0ZSBwcm90ZWN0IG1lbW9yeSB0byBtYWtlIGl0IHNhZmUgKi8KKwlvdXRiKHJlYWRiKHNhYmkgKyBTQUJJX0hFQURFUl9SRV9NRU0pLCBwb3J0KTsKKworCS8qIHNlZSBpZiB0aGUgY29tbWFuZCBhY3R1YWxseSBzdWNjZWVkZWQgKi8KKwlpZiAocmVhZGIoc2FiaV9pZmFjZSArIFNBQklfSUZBQ0VfQ09NUExFVEUpID09IDB4YWEgJiYKKwkgICAgcmVhZGIoc2FiaV9pZmFjZSArIFNBQklfSUZBQ0VfREFUQSkgIT0gMHhmZikgeworCQkvKiBpdCBkaWQhICovCisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBTb21ldGhpbmcgYmFkIGhhcHBlbmVkLCBzbyByZXBvcnQgaXQgYW5kIGVycm9yIG91dCAqLworCXByaW50ayhLRVJOX1dBUk5JTkcgIlNBQkkgY29tbWFuZCAweCUwMnggZmFpbGVkIHdpdGggY29tcGxldGlvbiBmbGFnIDB4JTAyeCBhbmQgb3V0cHV0IDB4JTAyeFxuIiwKKwkJY29tbWFuZCwgcmVhZGIoc2FiaV9pZmFjZSArIFNBQklfSUZBQ0VfQ09NUExFVEUpLAorCQlyZWFkYihzYWJpX2lmYWNlICsgU0FCSV9JRkFDRV9EQVRBKSk7CisJcmV0dmFsID0gLUVJTlZBTDsKK2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZzYWJpX211dGV4KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2JhY2tsaWdodCh2b2lkKQoreworCXN0cnVjdCBzYWJpX3JldHZhbCBzcmV0dmFsOworCisJc2FiaV9nZXRfY29tbWFuZChHRVRfQkFDS0xJR0hULCAmc3JldHZhbCk7CisJcHJpbnRrKEtFUk5fREVCVUcgImJhY2tsaWdodCA9IDB4JTAyeFxuIiwgc3JldHZhbC5yZXR2YWxbMF0pOworCisJc2FiaV9zZXRfY29tbWFuZChTRVRfQkFDS0xJR0hULCAwKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiYmFja2xpZ2h0IHNob3VsZCBiZSBvZmZcbiIpOworCisJc2FiaV9nZXRfY29tbWFuZChHRVRfQkFDS0xJR0hULCAmc3JldHZhbCk7CisJcHJpbnRrKEtFUk5fREVCVUcgImJhY2tsaWdodCA9IDB4JTAyeFxuIiwgc3JldHZhbC5yZXR2YWxbMF0pOworCisJbXNsZWVwKDEwMDApOworCisJc2FiaV9zZXRfY29tbWFuZChTRVRfQkFDS0xJR0hULCAxKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiYmFja2xpZ2h0IHNob3VsZCBiZSBvblxuIik7CisKKwlzYWJpX2dldF9jb21tYW5kKEdFVF9CQUNLTElHSFQsICZzcmV0dmFsKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiYmFja2xpZ2h0ID0gMHglMDJ4XG4iLCBzcmV0dmFsLnJldHZhbFswXSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfd2lyZWxlc3Modm9pZCkKK3sKKwlzdHJ1Y3Qgc2FiaV9yZXR2YWwgc3JldHZhbDsKKworCXNhYmlfZ2V0X2NvbW1hbmQoR0VUX1dJUkVMRVNTX0JVVFRPTiwgJnNyZXR2YWwpOworCXByaW50ayhLRVJOX0RFQlVHICJ3aXJlbGVzcyBsZWQgPSAweCUwMnhcbiIsIHNyZXR2YWwucmV0dmFsWzBdKTsKKworCXNhYmlfc2V0X2NvbW1hbmQoU0VUX1dJUkVMRVNTX0JVVFRPTiwgMCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIndpcmVsZXNzIGxlZCBzaG91bGQgYmUgb2ZmXG4iKTsKKworCXNhYmlfZ2V0X2NvbW1hbmQoR0VUX1dJUkVMRVNTX0JVVFRPTiwgJnNyZXR2YWwpOworCXByaW50ayhLRVJOX0RFQlVHICJ3aXJlbGVzcyBsZWQgPSAweCUwMnhcbiIsIHNyZXR2YWwucmV0dmFsWzBdKTsKKworCW1zbGVlcCgxMDAwKTsKKworCXNhYmlfc2V0X2NvbW1hbmQoU0VUX1dJUkVMRVNTX0JVVFRPTiwgMSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIndpcmVsZXNzIGxlZCBzaG91bGQgYmUgb25cbiIpOworCisJc2FiaV9nZXRfY29tbWFuZChHRVRfV0lSRUxFU1NfQlVUVE9OLCAmc3JldHZhbCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIndpcmVsZXNzIGxlZCA9IDB4JTAyeFxuIiwgc3JldHZhbC5yZXR2YWxbMF0pOworfQorCitzdGF0aWMgdTggcmVhZF9icmlnaHRuZXNzKHZvaWQpCit7CisJc3RydWN0IHNhYmlfcmV0dmFsIHNyZXR2YWw7CisJaW50IHVzZXJfYnJpZ2h0bmVzcyA9IDA7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IHNhYmlfZ2V0X2NvbW1hbmQoR0VUX0JSSUdIVE5FU1MsICZzcmV0dmFsKTsKKwlpZiAoIXJldHZhbCkKKwkJdXNlcl9icmlnaHRuZXNzID0gc3JldHZhbC5yZXR2YWxbMF07CisJCWlmICh1c2VyX2JyaWdodG5lc3MgIT0gMCkKKwkJCS0tdXNlcl9icmlnaHRuZXNzOworCXJldHVybiB1c2VyX2JyaWdodG5lc3M7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9icmlnaHRuZXNzKHU4IHVzZXJfYnJpZ2h0bmVzcykKK3sKKwlzYWJpX3NldF9jb21tYW5kKFNFVF9CUklHSFRORVNTLCB1c2VyX2JyaWdodG5lc3MgKyAxKTsKK30KKworc3RhdGljIGludCBnZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJcmV0dXJuIChpbnQpcmVhZF9icmlnaHRuZXNzKCk7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJc2V0X2JyaWdodG5lc3MoYmQtPnByb3BzLmJyaWdodG5lc3MpOworCisJaWYgKGJkLT5wcm9wcy5wb3dlciA9PSBGQl9CTEFOS19VTkJMQU5LKQorCQlzYWJpX3NldF9jb21tYW5kKFNFVF9CQUNLTElHSFQsIDEpOworCWVsc2UKKwkJc2FiaV9zZXRfY29tbWFuZChTRVRfQkFDS0xJR0hULCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfb3BzIGJhY2tsaWdodF9vcHMgPSB7CisJLmdldF9icmlnaHRuZXNzCT0gZ2V0X2JyaWdodG5lc3MsCisJLnVwZGF0ZV9zdGF0dXMJPSB1cGRhdGVfc3RhdHVzLAorfTsKKworc3RhdGljIGludCByZmtpbGxfc2V0KHZvaWQgKmRhdGEsIGJvb2wgYmxvY2tlZCkKK3sKKwkvKiBEbyBzb21ldGhpbmcgd2l0aCBibG9ja2VkLi4uKi8KKwkvKgorCSAqIGJsb2NrZWQgPT0gZmFsc2UgaXMgb24KKwkgKiBibG9ja2VkID09IHRydWUgaXMgb2ZmCisJICovCisJaWYgKGJsb2NrZWQpCisJCXNhYmlfc2V0X2NvbW1hbmQoU0VUX1dJUkVMRVNTX0JVVFRPTiwgMCk7CisJZWxzZQorCQlzYWJpX3NldF9jb21tYW5kKFNFVF9XSVJFTEVTU19CVVRUT04sIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmZraWxsX29wcyByZmtpbGxfb3BzID0geworCS5zZXRfYmxvY2sgPSByZmtpbGxfc2V0LAorfTsKKworc3RhdGljIGludCBpbml0X3dpcmVsZXNzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNkZXYpCit7CisJaW50IHJldHZhbDsKKworCXJmayA9IHJma2lsbF9hbGxvYygic2Ftc3VuZy13aWZpIiwgJnNkZXYtPmRldiwgUkZLSUxMX1RZUEVfV0xBTiwKKwkJCSAgICZyZmtpbGxfb3BzLCBOVUxMKTsKKwlpZiAoIXJmaykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR2YWwgPSByZmtpbGxfcmVnaXN0ZXIocmZrKTsKKwlpZiAocmV0dmFsKSB7CisJCXJma2lsbF9kZXN0cm95KHJmayk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X3dpcmVsZXNzKHZvaWQpCit7CisJcmZraWxsX3VucmVnaXN0ZXIocmZrKTsKKwlyZmtpbGxfZGVzdHJveShyZmspOworfQorCitzdGF0aWMgc3NpemVfdCBnZXRfc2lsZW50X3N0YXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzYWJpX3JldHZhbCBzcmV0dmFsOworCWludCByZXR2YWw7CisKKwkvKiBSZWFkIHRoZSBzdGF0ZSAqLworCXJldHZhbCA9IHNhYmlfZ2V0X2NvbW1hbmQoR0VUX1BFUkZPUk1BTkNFX0xFVkVMLCAmc3JldHZhbCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCS8qIFRoZSBsb2dpYyBpcyBiYWNrd2FyZHMsIHllYWgsIGxvdHMgb2YgZnVuLi4uICovCisJaWYgKHNyZXR2YWwucmV0dmFsWzBdID09IDApCisJCXJldHZhbCA9IDE7CisJZWxzZQorCQlyZXR2YWwgPSAwOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCByZXR2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfc2lsZW50X3N0YXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAorCQkJCXNpemVfdCBjb3VudCkKK3sKKwljaGFyIHZhbHVlOworCisJaWYgKGNvdW50ID49IDEpIHsKKwkJdmFsdWUgPSBidWZbMF07CisJCWlmICgodmFsdWUgPT0gJzAnKSB8fCAodmFsdWUgPT0gJ24nKSB8fCAodmFsdWUgPT0gJ04nKSkgeworCQkJLyogVHVybiBzcGVlZCB1cCAqLworCQkJc2FiaV9zZXRfY29tbWFuZChTRVRfUEVSRk9STUFOQ0VfTEVWRUwsIDB4MDEpOworCQl9IGVsc2UgaWYgKCh2YWx1ZSA9PSAnMScpIHx8ICh2YWx1ZSA9PSAneScpIHx8ICh2YWx1ZSA9PSAnWScpKSB7CisJCQkvKiBUdXJuIHNwZWVkIGRvd24gKi8KKwkJCXNhYmlfc2V0X2NvbW1hbmQoU0VUX1BFUkZPUk1BTkNFX0xFVkVMLCAweDAwKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihzaWxlbnQsIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICBnZXRfc2lsZW50X3N0YXRlLCBzZXRfc2lsZW50X3N0YXRlKTsKKworCitzdGF0aWMgaW50IF9faW5pdCBkbWlfY2hlY2tfY2IoY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmlkKQoreworCXByaW50ayhLRVJOX0lORk8gS0JVSUxEX01PRE5BTUUgIjogZm91bmQgbGFwdG9wIG1vZGVsICclcydcbiIsCisJCWlkLT5pZGVudCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2luaXRkYXRhIHNhbXN1bmdfZG1pX3RhYmxlW10gPSB7CisJeworCQkuaWRlbnQgPSAiTjEyOCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU0FNU1VORyBFTEVDVFJPTklDUyBDTy4sIExURC4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTjEyOCIpLAorCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiTjEyOCIpLAorCQl9LAorCQkuY2FsbGJhY2sgPSBkbWlfY2hlY2tfY2IsCisJfSwKKwl7CisJCS5pZGVudCA9ICJOMTMwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJTQU1TVU5HIEVMRUNUUk9OSUNTIENPLiwgTFRELiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJOMTMwIiksCisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJOMTMwIiksCisJCX0sCisJCS5jYWxsYmFjayA9IGRtaV9jaGVja19jYiwKKwl9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGRtaSwgc2Ftc3VuZ19kbWlfdGFibGUpOworCitzdGF0aWMgaW50IF9faW5pdCBzYW1zdW5nX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc2FiaV9yZXR2YWwgc3JldHZhbDsKKwljb25zdCBjaGFyICp0ZXN0U3RyID0gIlNFQ0xJTlVYIjsKKwl2b2lkIF9faW9tZW0gKm1lbWNoZWNrOworCXVuc2lnbmVkIGludCBpZmFjZVA7CisJaW50IHBTdHI7CisJaW50IGxvY2E7CisJaW50IHJldHZhbDsKKworCW11dGV4X2luaXQoJnNhYmlfbXV0ZXgpOworCisJaWYgKCFmb3JjZSAmJiAhZG1pX2NoZWNrX3N5c3RlbShzYW1zdW5nX2RtaV90YWJsZSkpCisJCXJldHVybiAtRU5PREVWOworCisJZjAwMDBfc2VnbWVudCA9IGlvcmVtYXAoMHhmMDAwMCwgMHhmZmZmKTsKKwlpZiAoIWYwMDAwX3NlZ21lbnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBtYXAgdGhlIHNlZ21lbnQgYXQgMHhmMDAwMFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFRyeSB0byBmaW5kIHRoZSBzaWduYXR1cmUgIlNFQ0xJTlVYIiBpbiBtZW1vcnkgdG8gZmluZCB0aGUgaGVhZGVyICovCisJcFN0ciA9IDA7CisJbWVtY2hlY2sgPSBmMDAwMF9zZWdtZW50OworCWZvciAobG9jYSA9IDA7IGxvY2EgPCAweGZmZmY7IGxvY2ErKykgeworCQljaGFyIHRlbXAgPSByZWFkYihtZW1jaGVjayArIGxvY2EpOworCisJCWlmICh0ZW1wID09IHRlc3RTdHJbcFN0cl0pIHsKKwkJCWlmIChwU3RyID09IHN0cmxlbih0ZXN0U3RyKS0xKQorCQkJCWJyZWFrOworCQkJKytwU3RyOworCQl9IGVsc2UgeworCQkJcFN0ciA9IDA7CisJCX0KKwl9CisJaWYgKGxvY2EgPT0gMHhmZmZmKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVGhpcyBjb21wdXRlciBkb2VzIG5vdCBzdXBwb3J0IFNBQklcbiIpOworCQlnb3RvIGVycm9yX25vX3NpZ25hdHVyZTsKKwkJfQorCisJLyogcG9pbnQgdG8gdGhlIFNNSSBwb3J0IE51bWJlciAqLworCWxvY2EgKz0gMTsKKwlzYWJpID0gKG1lbWNoZWNrICsgbG9jYSk7CisKKwlpZiAoZGVidWcpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlRoaXMgY29tcHV0ZXIgc3VwcG9ydHMgU0FCST09JXhcbiIsCisJCQlsb2NhICsgMHhmMDAwMCAtIDYpOworCQlwcmludGsoS0VSTl9ERUJVRyAiU0FCSSBoZWFkZXI6XG4iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiBTTUkgUG9ydCBOdW1iZXIgPSAweCUwNHhcbiIsCisJCQlyZWFkdyhzYWJpICsgU0FCSV9IRUFERVJfUE9SVCkpOworCQlwcmludGsoS0VSTl9ERUJVRyAiIFNNSSBJbnRlcmZhY2UgRnVuY3Rpb24gPSAweCUwMnhcbiIsCisJCQlyZWFkYihzYWJpICsgU0FCSV9IRUFERVJfSUZBQ0VGVU5DKSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIgU01JIGVuYWJsZSBtZW1vcnkgYnVmZmVyID0gMHglMDJ4XG4iLAorCQkJcmVhZGIoc2FiaSArIFNBQklfSEVBREVSX0VOX01FTSkpOworCQlwcmludGsoS0VSTl9ERUJVRyAiIFNNSSByZXN0b3JlIG1lbW9yeSBidWZmZXIgPSAweCUwMnhcbiIsCisJCQlyZWFkYihzYWJpICsgU0FCSV9IRUFERVJfUkVfTUVNKSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIgU0FCSSBkYXRhIG9mZnNldCA9IDB4JTA0eFxuIiwKKwkJCXJlYWR3KHNhYmkgKyBTQUJJX0hFQURFUl9EQVRBX09GRlNFVCkpOworCQlwcmludGsoS0VSTl9ERUJVRyAiIFNBQkkgZGF0YSBzZWdtZW50ID0gMHglMDR4XG4iLAorCQkJcmVhZHcoc2FiaSArIFNBQklfSEVBREVSX0RBVEFfU0VHTUVOVCkpOworCX0KKworCS8qIEdldCBhIHBvaW50ZXIgdG8gdGhlIFNBQkkgSW50ZXJmYWNlICovCisJaWZhY2VQID0gKHJlYWR3KHNhYmkgKyBTQUJJX0hFQURFUl9EQVRBX1NFR01FTlQpICYgMHgwZmZmZikgPDwgNDsKKwlpZmFjZVAgKz0gcmVhZHcoc2FiaSArIFNBQklfSEVBREVSX0RBVEFfT0ZGU0VUKSAmIDB4MGZmZmY7CisJc2FiaV9pZmFjZSA9IGlvcmVtYXAoaWZhY2VQLCAxNik7CisJaWYgKCFzYWJpX2lmYWNlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgcmVtYXAgJXhcbiIsIGlmYWNlUCk7CisJCWdvdG8gZXhpdDsKKwl9CisJaWYgKGRlYnVnKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZmFjZVAgPSAweCUwOHhcbiIsIGlmYWNlUCk7CisJCXByaW50ayhLRVJOX0RFQlVHICJzYWJpX2lmYWNlID0gJXBcbiIsIHNhYmlfaWZhY2UpOworCisJCXRlc3RfYmFja2xpZ2h0KCk7CisJCXRlc3Rfd2lyZWxlc3MoKTsKKworCQlyZXR2YWwgPSBzYWJpX2dldF9jb21tYW5kKEdFVF9CUklHSFRORVNTLCAmc3JldHZhbCk7CisJCXByaW50ayhLRVJOX0RFQlVHICJicmlnaHRuZXNzID0gMHglMDJ4XG4iLCBzcmV0dmFsLnJldHZhbFswXSk7CisJfQorCisJLyogVHVybiBvbiAiTGludXgiIG1vZGUgaW4gdGhlIEJJT1MgKi8KKwlyZXR2YWwgPSBzYWJpX3NldF9jb21tYW5kKFNFVF9MSU5VWCwgMHg4MSk7CisJaWYgKHJldHZhbCkgeworCQlwcmludGsoS0VSTl9FUlIgS0JVSUxEX01PRE5BTUUgIjogTGludXggbW9kZSB3YXMgbm90IHNldCFcbiIpOworCQlnb3RvIGVycm9yX25vX3BsYXRmb3JtOworCX0KKworCS8qIGtub2NrIHVwIGEgcGxhdGZvcm0gZGV2aWNlIHRvIGhhbmcgc3R1ZmYgb2ZmIG9mICovCisJc2RldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoInNhbXN1bmciLCAtMSwgTlVMTCwgMCk7CisJaWYgKElTX0VSUihzZGV2KSkKKwkJZ290byBlcnJvcl9ub19wbGF0Zm9ybTsKKworCS8qIGNyZWF0ZSBhIGJhY2tsaWdodCBkZXZpY2UgdG8gdGFsayB0byB0aGlzIG9uZSAqLworCWJhY2tsaWdodF9kZXZpY2UgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKCJzYW1zdW5nIiwgJnNkZXYtPmRldiwKKwkJCQkJCSAgICAgTlVMTCwgJmJhY2tsaWdodF9vcHMpOworCWlmIChJU19FUlIoYmFja2xpZ2h0X2RldmljZSkpCisJCWdvdG8gZXJyb3Jfbm9fYmFja2xpZ2h0OworCisJYmFja2xpZ2h0X2RldmljZS0+cHJvcHMubWF4X2JyaWdodG5lc3MgPSBNQVhfQlJJR0hUOworCWJhY2tsaWdodF9kZXZpY2UtPnByb3BzLmJyaWdodG5lc3MgPSByZWFkX2JyaWdodG5lc3MoKTsKKwliYWNrbGlnaHRfZGV2aWNlLT5wcm9wcy5wb3dlciA9IEZCX0JMQU5LX1VOQkxBTks7CisJYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMoYmFja2xpZ2h0X2RldmljZSk7CisKKwlyZXR2YWwgPSBpbml0X3dpcmVsZXNzKHNkZXYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3Jfbm9fcmZrOworCisJcmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZzZGV2LT5kZXYsICZkZXZfYXR0cl9zaWxlbnQpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3JfZmlsZV9jcmVhdGU7CisKK2V4aXQ6CisJcmV0dXJuIDA7CisKK2Vycm9yX2ZpbGVfY3JlYXRlOgorCWRlc3Ryb3lfd2lyZWxlc3MoKTsKKworZXJyb3Jfbm9fcmZrOgorCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihiYWNrbGlnaHRfZGV2aWNlKTsKKworZXJyb3Jfbm9fYmFja2xpZ2h0OgorCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNkZXYpOworCitlcnJvcl9ub19wbGF0Zm9ybToKKwlpb3VubWFwKHNhYmlfaWZhY2UpOworCitlcnJvcl9ub19zaWduYXR1cmU6CisJaW91bm1hcChmMDAwMF9zZWdtZW50KTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNhbXN1bmdfZXhpdCh2b2lkKQoreworCS8qIFR1cm4gb2ZmICJMaW51eCIgbW9kZSBpbiB0aGUgQklPUyAqLworCXNhYmlfc2V0X2NvbW1hbmQoU0VUX0xJTlVYLCAweDgwKTsKKworCWRldmljZV9yZW1vdmVfZmlsZSgmc2Rldi0+ZGV2LCAmZGV2X2F0dHJfc2lsZW50KTsKKwliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoYmFja2xpZ2h0X2RldmljZSk7CisJZGVzdHJveV93aXJlbGVzcygpOworCWlvdW5tYXAoc2FiaV9pZmFjZSk7CisJaW91bm1hcChmMDAwMF9zZWdtZW50KTsKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihzZGV2KTsKK30KKworbW9kdWxlX2luaXQoc2Ftc3VuZ19pbml0KTsKK21vZHVsZV9leGl0KHNhbXN1bmdfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQHN1c2UuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNhbXN1bmcgQmFja2xpZ2h0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NlcC9zZXBfZHJpdmVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kcml2ZXIuYwppbmRleCBmODkwYTE2Li5lN2JjOWVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kcml2ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kcml2ZXIuYwpAQCAtMjczLDcgKzI3Myw4IEBACiAJCQkJCQl2b2lkICp2aXJ0X2FkZHJlc3MpCiB7CiAJZG1hX2FkZHJfdCBwYSA9IHNlcC0+c2hhcmVkX2J1cyArICh2aXJ0X2FkZHJlc3MgLSBzZXAtPnNoYXJlZF9hZGRyKTsKLQllZGJnKCJzZXA6IHZpcnQgdG8gYnVzIGIgJTA4bGx4IHYgJXBcbiIsIHBhLCB2aXJ0X2FkZHJlc3MpOworCWVkYmcoInNlcDogdmlydCB0byBidXMgYiAlMDhsbHggdiAlcFxuIiwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylwYSwgdmlydF9hZGRyZXNzKTsKIAlyZXR1cm4gcGE7CiB9CiAKQEAgLTE3ODgsNiArMTc4OSw3IEBACiAJZmlyc3RfdGFibGVfZGF0YS5waHlzaWNhbF9hZGRyZXNzID0gMHhmZmZmZmZmZjsKIAogCS8qIGZpbmQgdGhlIGZyZWUgc3RydWN0dXJlIGZvciBmbG93IGRhdGEgKi8KKwllcnJvciA9IC1FSU5WQUw7CiAJZmxvd19jb250ZXh0X3B0ciA9IHNlcF9maW5kX2Zsb3dfY29udGV4dChzZXAsIFNFUF9GUkVFX0ZMT1dfSUQpOwogCWlmIChmbG93X2NvbnRleHRfcHRyID09IE5VTEwpCiAJCWdvdG8gZW5kX2Z1bmN0aW9uOwpAQCAtMjQ0Nyw3ICsyNDQ5LDcgQEAKICNlbmRpZgogCiAvKgotICBGdW5jdGlvbiB0aGF0IGlzIGFjdGl2YWVkIG9uIHRoZSBzdWNjZXNmdWwgcHJvYmUgb2YgdGhlIFNFUCBkZXZpY2UKKyAgRnVuY3Rpb24gdGhhdCBpcyBhY3RpdmF0ZWQgb24gdGhlIHN1Y2Nlc3NmdWwgcHJvYmUgb2YgdGhlIFNFUCBkZXZpY2UKICovCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzZXBfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2VycXRfdXNiMi9zZXJxdF91c2IyLmMgYi9kcml2ZXJzL3N0YWdpbmcvc2VycXRfdXNiMi9zZXJxdF91c2IyLmMKaW5kZXggNTJhZjQ0Yy4uMDYwZTlkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NlcnF0X3VzYjIvc2VycXRfdXNiMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zZXJxdF91c2IyL3NlcnF0X3VzYjIuYwpAQCAtOTI5LDcgKzkyOSw3IEBACiAJZGJnKF9fRklMRV9fICJxdF9zZXR1YXJ0IGNvbXBsZXRlZC5cbiIpOwogCiAJLyoKLQkgKiBQdXQgdGhpcyBoZXJlIHRvIG1ha2UgaXQgcmVzcG9uc2l2ZSB0byBzdHR5IGFuZCBkZWZhdWxzIHNldCBieQorCSAqIFB1dCB0aGlzIGhlcmUgdG8gbWFrZSBpdCByZXNwb25zaXZlIHRvIHN0dHkgYW5kIGRlZmF1bHRzIHNldCBieQogCSAqIHRoZSB0dHkgbGF5ZXIKIAkgKi8KIAkvKiBGSVhNRTogaXMgdGhpcyBuZWVkZWQ/ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljb3NzLmMgYi9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljb3NzLmMKaW5kZXggZTY3YTEzMC4uNWIxOTFhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpY29zcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWNvc3MuYwpAQCAtMzU0LDcgKzM1NCw2IEBACiAJLm5kb19nZXRfc3RhdHMJCT0gc2xpY19nZXRfc3RhdHMsCiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QJPSBzbGljX21jYXN0X3NldF9saXN0LAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAotCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZXRoX21hY19hZGRyLAogCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC92aGNpX2hjZC5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfaGNkLmMKaW5kZXggNmU5MWZjMi4uZWY0MzcxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfaGNkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfaGNkLmMKQEAgLTU2LDcgKzU2LDcgQEAKIHN0YXRpYyBpbnQgdmhjaV9nZXRfZnJhbWVfbnVtYmVyKHN0cnVjdCB1c2JfaGNkICpoY2QpOwogCiBzdGF0aWMgY29uc3QgY2hhciBkcml2ZXJfbmFtZVtdID0gInZoY2lfaGNkIjsKLXN0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl9kZXNjW10gPSAiVVNCL0lQIFZpcnR1YWwgSG9zdCBDb250b3JvbGxlciI7CitzdGF0aWMgY29uc3QgY2hhciBkcml2ZXJfZGVzY1tdID0gIlVTQi9JUCBWaXJ0dWFsIEhvc3QgQ29udHJvbGxlciI7CiAKIHN0cnVjdCB2aGNpX2hjZCAqdGhlX2NvbnRyb2xsZXI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92bWUvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvVE9ETwppbmRleCBhZGM1ZmNhLi4yMjAxZmY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdm1lL1RPRE8KKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9UT0RPCkBAIC0xMSw3ICsxMSw3IEBACiBzdWl0YWJpbGl0eSBvZiBhIERNQSBjb250cm9sbGVyIGJhc2VkIG9uIGl0J3Mgc3VwcG9ydGVkIG1vZGVzIG9mIG9wZXJhdGlvbiwgYXMKIG9wcG9zZWQgdG8gdGhlIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtcyBmb3IgbWFzdGVyIGFuZCBzbGF2ZSB3aW5kb3dzOgogCi0Jc3RydWN0IHZtZV9yZXNvdXJjZSAqdm1lX3JlcXVlc3RfZG1hKHN0cnVjdCBkZXZpY2UgKmRldik7CisJc3RydWN0IHZtZV9yZXNvdXJjZSAqdm1lX2RtYV9yZXF1ZXN0KHN0cnVjdCBkZXZpY2UgKmRldik7CiAKIEFzIG9wcG9zZWQgdG86CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfY2E5MWN4NDIuYyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfY2E5MWN4NDIuYwppbmRleCBlMTM5ZWFlLi4xY2YzZTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX2NhOTFjeDQyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV9jYTkxY3g0Mi5jCkBAIC0xNSw3ICsxNSw2IEBACiAgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtNTQsOSArNTMsNiBAQAogCQkJICogT25seSBvbmUgVk1FIGludGVycnVwdCBjYW4gYmUKIAkJCSAqIGdlbmVyYXRlZCBhdCBhIHRpbWUsIHByb3ZpZGUgbG9ja2luZwogCQkJICovCi1zdHJ1Y3QgbXV0ZXggdm1lX2lycTsgICAvKiBMb2NraW5nIGZvciBWTUUgaXJxIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24gKi8KLQotCiAKIHN0YXRpYyBjaGFyIGRyaXZlcl9uYW1lW10gPSAidm1lX2NhOTFjeDQyIjsKIApAQCAtMTU4LDIzICsxNTQsMTMgQEAKIHN0YXRpYyB1MzIgY2E5MWN4NDJfVklSUV9pcnFoYW5kbGVyKGludCBzdGF0KQogewogCWludCB2ZWMsIGksIHNlcnZpY2VkID0gMDsKLQl2b2lkICgqY2FsbCkoaW50LCBpbnQsIHZvaWQgKik7Ci0Jdm9pZCAqcHJpdl9kYXRhOwogCiAJZm9yIChpID0gNzsgaSA+IDA7IGktLSkgewogCQlpZiAoc3RhdCAmICgxIDw8IGkpKSB7CiAJCQl2ZWMgPSBpb3JlYWQzMihjYTkxY3g0Ml9icmlkZ2UtPmJhc2UgKwogCQkJCUNBOTFDWDQyX1ZfU1RBVElEW2ldKSAmIDB4ZmY7CiAKLQkJCWNhbGwgPSBjYTkxY3g0Ml9icmlkZ2UtPmlycVtpIC0gMV0uY2FsbGJhY2tbdmVjXS5mdW5jOwotCQkJcHJpdl9kYXRhID0KLQkJCWNhOTFjeDQyX2JyaWRnZS0+aXJxW2kgLSAxXS5jYWxsYmFja1t2ZWNdLnByaXZfZGF0YTsKLQotCQkJaWYgKGNhbGwgIT0gTlVMTCkKLQkJCQljYWxsKGksIHZlYywgcHJpdl9kYXRhKTsKLQkJCWVsc2UKLQkJCQlwcmludGsoIlNwdXJpbG91cyBWTUUgaW50ZXJydXB0LCBsZXZlbDoleCwgIgotCQkJCQkidmVjdG9yOiV4XG4iLCBpLCB2ZWMpOworCQkJdm1lX2lycV9oYW5kbGVyKGNhOTFjeDQyX2JyaWRnZSwgaSwgdmVjKTsKIAogCQkJc2VydmljZWQgfD0gKDEgPDwgaSk7CiAJCX0KQEAgLTIzNSw2ICsyMjEsOCBAQAogCS8qIEluaXRpYWxpc2UgbGlzdCBmb3IgVk1FIGJ1cyBlcnJvcnMgKi8KIAlJTklUX0xJU1RfSEVBRCgmKGJyaWRnZS0+dm1lX2Vycm9ycykpOwogCisJbXV0ZXhfaW5pdCgmKGJyaWRnZS0+aXJxX210eCkpOworCiAJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGZyb20gUENJIHRvIFZNRSAqLwogCWlvd3JpdGUzMigwLCBicmlkZ2UtPmJhc2UgKyBWSU5UX0VOKTsKIApAQCAtMjgyLDY2ICsyNzAsMzEgQEAKIC8qCiAgKiBTZXQgdXAgYW4gVk1FIGludGVycnVwdAogICovCi1pbnQgY2E5MWN4NDJfcmVxdWVzdF9pcnEoaW50IGxldmVsLCBpbnQgc3RhdGlkLAotCXZvaWQgKCpjYWxsYmFjaykoaW50IGxldmVsLCBpbnQgdmVjdG9yLCB2b2lkICpwcml2X2RhdGEpLAotCXZvaWQgKnByaXZfZGF0YSkKK3ZvaWQgY2E5MWN4NDJfaXJxX3NldChpbnQgbGV2ZWwsIGludCBzdGF0ZSwgaW50IHN5bmMpCisKIHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKIAl1MzIgdG1wOwogCi0JbXV0ZXhfbG9jaygmKHZtZV9pcnEpKTsKLQotCWlmIChjYTkxY3g0Ml9icmlkZ2UtPmlycVtsZXZlbCAtIDFdLmNhbGxiYWNrW3N0YXRpZF0uZnVuYykgewotCQltdXRleF91bmxvY2soJih2bWVfaXJxKSk7Ci0JCXByaW50aygiVk1FIEludGVycnVwdCBhbHJlYWR5IHRha2VuXG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQotCWNhOTFjeDQyX2JyaWRnZS0+aXJxW2xldmVsIC0gMV0uY291bnQrKzsKLQljYTkxY3g0Ml9icmlkZ2UtPmlycVtsZXZlbCAtIDFdLmNhbGxiYWNrW3N0YXRpZF0ucHJpdl9kYXRhID0gcHJpdl9kYXRhOwotCWNhOTFjeDQyX2JyaWRnZS0+aXJxW2xldmVsIC0gMV0uY2FsbGJhY2tbc3RhdGlkXS5mdW5jID0gY2FsbGJhY2s7Ci0KIAkvKiBFbmFibGUgSVJRIGxldmVsICovCiAJdG1wID0gaW9yZWFkMzIoY2E5MWN4NDJfYnJpZGdlLT5iYXNlICsgTElOVF9FTik7Ci0JdG1wIHw9IENBOTFDWDQyX0xJTlRfVklSUVtsZXZlbF07CisKKwlpZiAoc3RhdGUgPT0gMCkKKwkJdG1wICY9IH5DQTkxQ1g0Ml9MSU5UX1ZJUlFbbGV2ZWxdOworCWVsc2UKKwkJdG1wIHw9IENBOTFDWDQyX0xJTlRfVklSUVtsZXZlbF07CisKIAlpb3dyaXRlMzIodG1wLCBjYTkxY3g0Ml9icmlkZ2UtPmJhc2UgKyBMSU5UX0VOKTsKIAotCW11dGV4X3VubG9jaygmKHZtZV9pcnEpKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogRnJlZSBWTUUgaW50ZXJydXB0Ci0gKi8KLXZvaWQgY2E5MWN4NDJfZnJlZV9pcnEoaW50IGxldmVsLCBpbnQgc3RhdGlkKQotewotCXUzMiB0bXA7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXY7Ci0KLQltdXRleF9sb2NrKCYodm1lX2lycSkpOwotCi0JY2E5MWN4NDJfYnJpZGdlLT5pcnFbbGV2ZWwgLSAxXS5jb3VudC0tOwotCi0JLyogRGlzYWJsZSBJUlEgbGV2ZWwgaWYgbm8gbW9yZSBpbnRlcnJ1cHRzIGF0dGFjaGVkIGF0IHRoaXMgbGV2ZWwqLwotCWlmIChjYTkxY3g0Ml9icmlkZ2UtPmlycVtsZXZlbCAtIDFdLmNvdW50ID09IDApIHsKLQkJdG1wID0gaW9yZWFkMzIoY2E5MWN4NDJfYnJpZGdlLT5iYXNlICsgTElOVF9FTik7Ci0JCXRtcCAmPSB+Q0E5MUNYNDJfTElOVF9WSVJRW2xldmVsXTsKLQkJaW93cml0ZTMyKHRtcCwgY2E5MWN4NDJfYnJpZGdlLT5iYXNlICsgTElOVF9FTik7Ci0KKwlpZiAoKHN0YXRlID09IDApICYmIChzeW5jICE9IDApKSB7CiAJCXBkZXYgPSBjb250YWluZXJfb2YoY2E5MWN4NDJfYnJpZGdlLT5wYXJlbnQsIHN0cnVjdCBwY2lfZGV2LAogCQkJZGV2KTsKIAogCQlzeW5jaHJvbml6ZV9pcnEocGRldi0+aXJxKTsKIAl9Ci0KLQljYTkxY3g0Ml9icmlkZ2UtPmlycVtsZXZlbCAtIDFdLmNhbGxiYWNrW3N0YXRpZF0uZnVuYyA9IE5VTEw7Ci0JY2E5MWN4NDJfYnJpZGdlLT5pcnFbbGV2ZWwgLSAxXS5jYWxsYmFja1tzdGF0aWRdLnByaXZfZGF0YSA9IE5VTEw7Ci0KLQltdXRleF91bmxvY2soJih2bWVfaXJxKSk7CiB9CiAKLWludCBjYTkxY3g0Ml9nZW5lcmF0ZV9pcnEoaW50IGxldmVsLCBpbnQgc3RhdGlkKQoraW50IGNhOTFjeDQyX2lycV9nZW5lcmF0ZShpbnQgbGV2ZWwsIGludCBzdGF0aWQpCiB7CiAJdTMyIHRtcDsKIApAQCAtMTA2NSw3ICsxMDE4LDYgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkbWFfcXVldWUpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmlhY2tfcXVldWUpOwogCW11dGV4X2luaXQoJih2bWVfaW50KSk7Ci0JbXV0ZXhfaW5pdCgmKHZtZV9pcnEpKTsKIAltdXRleF9pbml0KCYodm1lX3JtdykpOwogCiAJY2E5MWN4NDJfYnJpZGdlLT5wYXJlbnQgPSAmKHBkZXYtPmRldik7CkBAIC0xMTgyLDkgKzExMzQsOCBAQAogCWNhOTFjeDQyX2JyaWRnZS0+ZG1hX2xpc3RfZXhlYyA9IGNhOTFjeDQyX2RtYV9saXN0X2V4ZWM7CiAJY2E5MWN4NDJfYnJpZGdlLT5kbWFfbGlzdF9lbXB0eSA9IGNhOTFjeDQyX2RtYV9saXN0X2VtcHR5OwogI2VuZGlmCi0JY2E5MWN4NDJfYnJpZGdlLT5yZXF1ZXN0X2lycSA9IGNhOTFjeDQyX3JlcXVlc3RfaXJxOwotCWNhOTFjeDQyX2JyaWRnZS0+ZnJlZV9pcnEgPSBjYTkxY3g0Ml9mcmVlX2lycTsKLQljYTkxY3g0Ml9icmlkZ2UtPmdlbmVyYXRlX2lycSA9IGNhOTFjeDQyX2dlbmVyYXRlX2lycTsKKwljYTkxY3g0Ml9icmlkZ2UtPmlycV9zZXQgPSBjYTkxY3g0Ml9pcnFfc2V0OworCWNhOTFjeDQyX2JyaWRnZS0+aXJxX2dlbmVyYXRlID0gY2E5MWN4NDJfaXJxX2dlbmVyYXRlOwogI2lmIDAKIAljYTkxY3g0Ml9icmlkZ2UtPmxtX3NldCA9IGNhOTFjeDQyX2xtX3NldDsKIAljYTkxY3g0Ml9icmlkZ2UtPmxtX2dldCA9IGNhOTFjeDQyX2xtX2dldDsKQEAgLTEyMjAsNyArMTE3MSw5IEBACiAJdm1lX3VucmVnaXN0ZXJfYnJpZGdlKGNhOTFjeDQyX2JyaWRnZSk7CiBlcnJfcmVnOgogCWNhOTFjeDQyX2NyY3NyX2V4aXQocGRldik7CisjaWYgMAogZXJyX2NyY3NyOgorI2VuZGlmCiBlcnJfbG06CiAJLyogcmVzb3VyY2VzIGFyZSBzdG9yZWQgaW4gbGluayBsaXN0ICovCiAJbGlzdF9mb3JfZWFjaChwb3MsICYoY2E5MWN4NDJfYnJpZGdlLT5sbV9yZXNvdXJjZXMpKSB7CkBAIC0xMjc1LDcgKzEyMjgsNiBAQAogCXN0cnVjdCB2bWVfc2xhdmVfcmVzb3VyY2UgKnNsYXZlX2ltYWdlOwogCXN0cnVjdCB2bWVfZG1hX3Jlc291cmNlICpkbWFfY3RybHI7CiAJc3RydWN0IHZtZV9sbV9yZXNvdXJjZSAqbG07Ci0JaW50IGk7CiAKIAkvKiBUdXJuIG9mZiBJbnRzICovCiAJaW93cml0ZTMyKDAsIGNhOTFjeDQyX2JyaWRnZS0+YmFzZSArIExJTlRfRU4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguYyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmMKaW5kZXggMDBmZTA4MC4uODlhN2RjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX3RzaTE0OC5jCkBAIC0xMyw3ICsxMyw2IEBACiAgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgpAQCAtNzgsOCArNzcsNiBAQAogCQkJCSAqIE9ubHkgb25lIFZNRSBpbnRlcnJ1cHQgY2FuIGJlCiAJCQkJICogZ2VuZXJhdGVkIGF0IGEgdGltZSwgcHJvdmlkZSBsb2NraW5nCiAJCQkJICovCi1zdHJ1Y3QgbXV0ZXggdm1lX2lycTsJLyogTG9ja2luZyBmb3IgVk1FIGlycSBjYWxsYmFjayBjb25maWd1cmF0aW9uICovCi0KIAogc3RhdGljIGNoYXIgZHJpdmVyX25hbWVbXSA9ICJ2bWVfdHNpMTQ4IjsKIApAQCAtMjQwLDcgKzIzNyw2IEBACiAgKi8KIHN0YXRpYyB1MzIgdHNpMTQ4X0lBQ0tfaXJxaGFuZGxlcih2b2lkKQogewotCXByaW50aygidHNpMTQ4X0lBQ0tfaXJxaGFuZGxlclxuIik7CiAJd2FrZV91cCgmaWFja19xdWV1ZSk7CiAKIAlyZXR1cm4gVFNJMTQ4X0xDU1JfSU5UQ19JQUNLQzsKQEAgLTI1Miw4ICsyNDgsNiBAQAogc3RhdGljIHUzMiB0c2kxNDhfVklSUV9pcnFoYW5kbGVyKHUzMiBzdGF0KQogewogCWludCB2ZWMsIGksIHNlcnZpY2VkID0gMDsKLQl2b2lkICgqY2FsbCkoaW50LCBpbnQsIHZvaWQgKik7Ci0Jdm9pZCAqcHJpdl9kYXRhOwogCiAJZm9yIChpID0gNzsgaSA+IDA7IGktLSkgewogCQlpZiAoc3RhdCAmICgxIDw8IGkpKSB7CkBAIC0yNjYsMTUgKzI2MCw3IEBACiAJCQl2ZWMgPSBpb3JlYWQ4KHRzaTE0OF9icmlkZ2UtPmJhc2UgKwogCQkJCVRTSTE0OF9MQ1NSX1ZJQUNLW2ldICsgMyk7CiAKLQkJCWNhbGwgPSB0c2kxNDhfYnJpZGdlLT5pcnFbaSAtIDFdLmNhbGxiYWNrW3ZlY10uZnVuYzsKLQkJCXByaXZfZGF0YSA9Ci0JCQkJdHNpMTQ4X2JyaWRnZS0+aXJxW2ktMV0uY2FsbGJhY2tbdmVjXS5wcml2X2RhdGE7Ci0KLQkJCWlmIChjYWxsICE9IE5VTEwpCi0JCQkJY2FsbChpLCB2ZWMsIHByaXZfZGF0YSk7Ci0JCQllbHNlCi0JCQkJcHJpbnRrKCJTcHVyaWxvdXMgVk1FIGludGVycnVwdCwgbGV2ZWw6JXgsICIKLQkJCQkJInZlY3RvcjoleFxuIiwgaSwgdmVjKTsKKwkJCXZtZV9pcnFfaGFuZGxlcih0c2kxNDhfYnJpZGdlLCBpLCB2ZWMpOwogCiAJCQlzZXJ2aWNlZCB8PSAoMSA8PCBpKTsKIAkJfQpAQCAtMzU0LDYgKzM0MCw4IEBACiAJLyogSW5pdGlhbGlzZSBsaXN0IGZvciBWTUUgYnVzIGVycm9ycyAqLwogCUlOSVRfTElTVF9IRUFEKCYoYnJpZGdlLT52bWVfZXJyb3JzKSk7CiAKKwltdXRleF9pbml0KCYoYnJpZGdlLT5pcnFfbXR4KSk7CisKIAlyZXN1bHQgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsCiAJCQkgICAgIHRzaTE0OF9pcnFoYW5kbGVyLAogCQkJICAgICBJUlFGX1NIQVJFRCwKQEAgLTQzMyw1NSArNDIxLDE1IEBACiB9CiAKIC8qCi0gKiBTZXQgdXAgYW4gVk1FIGludGVycnVwdAorICogQ29uZmlndXJlIFZNRSBpbnRlcnJ1cHQKICAqLwotaW50IHRzaTE0OF9yZXF1ZXN0X2lycShpbnQgbGV2ZWwsIGludCBzdGF0aWQsCi0Jdm9pZCAoKmNhbGxiYWNrKShpbnQgbGV2ZWwsIGludCB2ZWN0b3IsIHZvaWQgKnByaXZfZGF0YSksCi0gICAgICAgIHZvaWQgKnByaXZfZGF0YSkKK3ZvaWQgdHNpMTQ4X2lycV9zZXQoaW50IGxldmVsLCBpbnQgc3RhdGUsIGludCBzeW5jKQogewotCXUzMiB0bXA7Ci0KLQltdXRleF9sb2NrKCYodm1lX2lycSkpOwotCi0JaWYodHNpMTQ4X2JyaWRnZS0+aXJxW2xldmVsIC0gMV0uY2FsbGJhY2tbc3RhdGlkXS5mdW5jKSB7Ci0JCW11dGV4X3VubG9jaygmKHZtZV9pcnEpKTsKLQkJcHJpbnRrKCJWTUUgSW50ZXJydXB0IGFscmVhZHkgdGFrZW5cbiIpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCi0JdHNpMTQ4X2JyaWRnZS0+aXJxW2xldmVsIC0gMV0uY291bnQrKzsKLQl0c2kxNDhfYnJpZGdlLT5pcnFbbGV2ZWwgLSAxXS5jYWxsYmFja1tzdGF0aWRdLnByaXZfZGF0YSA9IHByaXZfZGF0YTsKLQl0c2kxNDhfYnJpZGdlLT5pcnFbbGV2ZWwgLSAxXS5jYWxsYmFja1tzdGF0aWRdLmZ1bmMgPSBjYWxsYmFjazsKLQotCS8qIEVuYWJsZSBJUlEgbGV2ZWwgKi8KLQl0bXAgPSBpb3JlYWQzMmJlKHRzaTE0OF9icmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9JTlRFTyk7Ci0JdG1wIHw9IFRTSTE0OF9MQ1NSX0lOVEVPX0lSUUVPW2xldmVsIC0gMV07Ci0JaW93cml0ZTMyYmUodG1wLCB0c2kxNDhfYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5URU8pOwotCi0JdG1wID0gaW9yZWFkMzJiZSh0c2kxNDhfYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5URU4pOwotCXRtcCB8PSBUU0kxNDhfTENTUl9JTlRFTl9JUlFFTltsZXZlbCAtIDFdOwotCWlvd3JpdGUzMmJlKHRtcCwgdHNpMTQ4X2JyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0lOVEVOKTsKLQotCW11dGV4X3VubG9jaygmKHZtZV9pcnEpKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogRnJlZSBWTUUgaW50ZXJydXB0Ci0gKi8KLXZvaWQgdHNpMTQ4X2ZyZWVfaXJxKGludCBsZXZlbCwgaW50IHN0YXRpZCkKLXsKLQl1MzIgdG1wOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXUzMiB0bXA7CiAKLQltdXRleF9sb2NrKCYodm1lX2lycSkpOwotCi0JdHNpMTQ4X2JyaWRnZS0+aXJxW2xldmVsIC0gMV0uY291bnQtLTsKLQotCS8qIERpc2FibGUgSVJRIGxldmVsIGlmIG5vIG1vcmUgaW50ZXJydXB0cyBhdHRhY2hlZCBhdCB0aGlzIGxldmVsKi8KLQlpZiAodHNpMTQ4X2JyaWRnZS0+aXJxW2xldmVsIC0gMV0uY291bnQgPT0gMCkgeworCS8qIFdlIG5lZWQgdG8gZG8gdGhlIG9yZGVyaW5nIGRpZmZlcmVudGx5IGZvciBlbmFibGluZyBhbmQgZGlzYWJsaW5nICovCisJaWYgKHN0YXRlID09IDApIHsKIAkJdG1wID0gaW9yZWFkMzJiZSh0c2kxNDhfYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5URU4pOwogCQl0bXAgJj0gflRTSTE0OF9MQ1NSX0lOVEVOX0lSUUVOW2xldmVsIC0gMV07CiAJCWlvd3JpdGUzMmJlKHRtcCwgdHNpMTQ4X2JyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0lOVEVOKTsKQEAgLTQ5MCwyMiArNDM4LDI4IEBACiAJCXRtcCAmPSB+VFNJMTQ4X0xDU1JfSU5URU9fSVJRRU9bbGV2ZWwgLSAxXTsKIAkJaW93cml0ZTMyYmUodG1wLCB0c2kxNDhfYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5URU8pOwogCi0JCXBkZXYgPSBjb250YWluZXJfb2YodHNpMTQ4X2JyaWRnZS0+cGFyZW50LCBzdHJ1Y3QgcGNpX2RldiwgZGV2KTsKKwkJaWYgKHN5bmMgIT0gMCkgeworCQkJcGRldiA9IGNvbnRhaW5lcl9vZih0c2kxNDhfYnJpZGdlLT5wYXJlbnQsCisJCQkJc3RydWN0IHBjaV9kZXYsIGRldik7CiAKLQkJc3luY2hyb25pemVfaXJxKHBkZXYtPmlycSk7CisJCQlzeW5jaHJvbml6ZV9pcnEocGRldi0+aXJxKTsKKwkJfQorCX0gZWxzZSB7CisJCXRtcCA9IGlvcmVhZDMyYmUodHNpMTQ4X2JyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0lOVEVPKTsKKwkJdG1wIHw9IFRTSTE0OF9MQ1NSX0lOVEVPX0lSUUVPW2xldmVsIC0gMV07CisJCWlvd3JpdGUzMmJlKHRtcCwgdHNpMTQ4X2JyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0lOVEVPKTsKKworCQl0bXAgPSBpb3JlYWQzMmJlKHRzaTE0OF9icmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9JTlRFTik7CisJCXRtcCB8PSBUU0kxNDhfTENTUl9JTlRFTl9JUlFFTltsZXZlbCAtIDFdOworCQlpb3dyaXRlMzJiZSh0bXAsIHRzaTE0OF9icmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9JTlRFTik7CiAJfQotCi0JdHNpMTQ4X2JyaWRnZS0+aXJxW2xldmVsIC0gMV0uY2FsbGJhY2tbc3RhdGlkXS5mdW5jID0gTlVMTDsKLQl0c2kxNDhfYnJpZGdlLT5pcnFbbGV2ZWwgLSAxXS5jYWxsYmFja1tzdGF0aWRdLnByaXZfZGF0YSA9IE5VTEw7Ci0KLQltdXRleF91bmxvY2soJih2bWVfaXJxKSk7CiB9CiAKIC8qCiAgKiBHZW5lcmF0ZSBhIFZNRSBidXMgaW50ZXJydXB0IGF0IHRoZSByZXF1ZXN0ZWQgbGV2ZWwgJiB2ZWN0b3IuIFdhaXQgZm9yCiAgKiBpbnRlcnJ1cHQgdG8gYmUgYWNrZWQuCiAgKi8KLWludCB0c2kxNDhfZ2VuZXJhdGVfaXJxKGludCBsZXZlbCwgaW50IHN0YXRpZCkKK2ludCB0c2kxNDhfaXJxX2dlbmVyYXRlKGludCBsZXZlbCwgaW50IHN0YXRpZCkKIHsKIAl1MzIgdG1wOwogCkBAIC04OTEsNyArODQ1LDcgQEAKIAkJaW1hZ2UtPnBjaV9yZXNvdXJjZS5zdGFydCk7CiAKIAkvKiBJZiB0aGUgZXhpc3Rpbmcgc2l6ZSBpcyBPSywgcmV0dXJuICovCi0JaWYgKGV4aXN0aW5nX3NpemUgPT0gKHNpemUgLSAxKSkKKwlpZiAoKHNpemUgIT0gMCkgJiYgKGV4aXN0aW5nX3NpemUgPT0gKHNpemUgLSAxKSkpCiAJCXJldHVybiAwOwogCiAJaWYgKGV4aXN0aW5nX3NpemUgIT0gMCkgewpAQCAtOTAzLDYgKzg1NywxMSBAQAogCQltZW1zZXQoJihpbWFnZS0+cGNpX3Jlc291cmNlKSwgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOwogCX0KIAorCS8qIEV4aXQgaGVyZSBpZiBzaXplIGlzIHplcm8gKi8KKwlpZiAoc2l6ZSA9PSAwKSB7CisJCXJldHVybiAwOworCX0KKwogCWlmIChpbWFnZS0+cGNpX3Jlc291cmNlLm5hbWUgPT0gTlVMTCkgewogCQlpbWFnZS0+cGNpX3Jlc291cmNlLm5hbWUgPSBrbWFsbG9jKFZNRU5BTVNJWiszLCBHRlBfS0VSTkVMKTsKIAkJaWYgKGltYWdlLT5wY2lfcmVzb3VyY2UubmFtZSA9PSBOVUxMKSB7CkBAIC05ODEsMTIgKzk0MCwxMyBAQAogCiAJLyogVmVyaWZ5IGlucHV0IGRhdGEgKi8KIAlpZiAodm1lX2Jhc2UgJiAweEZGRkYpIHsKLQkJcHJpbnRrKCJJbnZhbGlkIFZNRSBXaW5kb3cgYWxpZ25tZW50XG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIFZNRSBXaW5kb3cgYWxpZ25tZW50XG4iKTsKIAkJcmV0dmFsID0gLUVJTlZBTDsKIAkJZ290byBlcnJfd2luZG93OwogCX0KLQlpZiAoc2l6ZSA8IDB4MTAwMDApIHsKLQkJcHJpbnRrKCJJbnZhbGlkIFZNRSBXaW5kb3cgc2l6ZVxuIik7CisKKwlpZiAoKHNpemUgPT0gMCkgJiYgKGVuYWJsZWQgIT0gMCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTaXplIG11c3QgYmUgbm9uLXplcm8gZm9yIGVuYWJsZWQgd2luZG93c1xuIik7CiAJCXJldHZhbCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX3dpbmRvdzsKIAl9CkBAIC05OTQsMjYgKzk1NCwzMSBAQAogCXNwaW5fbG9jaygmKGltYWdlLT5sb2NrKSk7CiAKIAkvKiBMZXQncyBhbGxvY2F0ZSB0aGUgcmVzb3VyY2UgaGVyZSByYXRoZXIgdGhhbiBmdXJ0aGVyIHVwIHRoZSBzdGFjayBhcwotCSAqIGl0IGF2b2lkcyBwdXNoaW5nIGxvYWRzIG9mIGJ1cyBkZXBlbmRhbnQgc3R1ZmYgdXAgdGhlIHN0YWNrCisJICogaXQgYXZvaWRzIHB1c2hpbmcgbG9hZHMgb2YgYnVzIGRlcGVuZGFudCBzdHVmZiB1cCB0aGUgc3RhY2suIElmIHNpemUKKwkgKiBpcyB6ZXJvLCBhbnkgZXhpc3RpbmcgcmVzb3VyY2Ugd2lsbCBiZSBmcmVlZC4KIAkgKi8KIAlyZXR2YWwgPSB0c2kxNDhfYWxsb2NfcmVzb3VyY2UoaW1hZ2UsIHNpemUpOwogCWlmIChyZXR2YWwpIHsKIAkJc3Bpbl91bmxvY2soJihpbWFnZS0+bG9jaykpOwotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlc291cmNlICIKLQkJCSJuYW1lXG4iKTsKLQkJcmV0dmFsID0gLUVOT01FTTsKKwkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciAiCisJCQkicmVzb3VyY2VcbiIpOwogCQlnb3RvIGVycl9yZXM7CiAJfQogCi0JcGNpX2Jhc2UgPSAodW5zaWduZWQgbG9uZyBsb25nKWltYWdlLT5wY2lfcmVzb3VyY2Uuc3RhcnQ7CisJaWYgKHNpemUgPT0gMCkgeworCQlwY2lfYmFzZSA9IDA7CisJCXBjaV9ib3VuZCA9IDA7CisJCXZtZV9vZmZzZXQgPSAwOworCX0gZWxzZSB7CisJCXBjaV9iYXNlID0gKHVuc2lnbmVkIGxvbmcgbG9uZylpbWFnZS0+cGNpX3Jlc291cmNlLnN0YXJ0OwogCi0KLQkvKgotCSAqIEJvdW5kIGFkZHJlc3MgaXMgYSB2YWxpZCBhZGRyZXNzIGZvciB0aGUgd2luZG93LCBhZGp1c3QKLQkgKiBhY2NvcmRpbmcgdG8gd2luZG93IGdyYW51bGFyaXR5LgotCSAqLwotCXBjaV9ib3VuZCA9IHBjaV9iYXNlICsgKHNpemUgLSAweDEwMDAwKTsKLQl2bWVfb2Zmc2V0ID0gdm1lX2Jhc2UgLSBwY2lfYmFzZTsKKwkJLyoKKwkJICogQm91bmQgYWRkcmVzcyBpcyBhIHZhbGlkIGFkZHJlc3MgZm9yIHRoZSB3aW5kb3csIGFkanVzdAorCQkgKiBhY2NvcmRpbmcgdG8gd2luZG93IGdyYW51bGFyaXR5LgorCQkgKi8KKwkJcGNpX2JvdW5kID0gcGNpX2Jhc2UgKyAoc2l6ZSAtIDB4MTAwMDApOworCQl2bWVfb2Zmc2V0ID0gdm1lX2Jhc2UgLSBwY2lfYmFzZTsKKwl9CiAKIAkvKiBDb252ZXJ0IDY0LWJpdCB2YXJpYWJsZXMgdG8gMnggMzItYml0IHZhcmlhYmxlcyAqLwogCXJlZ19zcGxpdChwY2lfYmFzZSwgJnBjaV9iYXNlX2hpZ2gsICZwY2lfYmFzZV9sb3cpOwpAQCAtMTAyMiwxOSArOTg3LDE5IEBACiAKIAlpZiAocGNpX2Jhc2VfbG93ICYgMHhGRkZGKSB7CiAJCXNwaW5fdW5sb2NrKCYoaW1hZ2UtPmxvY2spKTsKLQkJcHJpbnRrKCJJbnZhbGlkIFBDSSBiYXNlIGFsaWdubWVudFxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBQQ0kgYmFzZSBhbGlnbm1lbnRcbiIpOwogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlnb3RvIGVycl9ncmFuOwogCX0KIAlpZiAocGNpX2JvdW5kX2xvdyAmIDB4RkZGRikgewogCQlzcGluX3VubG9jaygmKGltYWdlLT5sb2NrKSk7Ci0JCXByaW50aygiSW52YWxpZCBQQ0kgYm91bmQgYWxpZ25tZW50XG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIFBDSSBib3VuZCBhbGlnbm1lbnRcbiIpOwogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlnb3RvIGVycl9ncmFuOwogCX0KIAlpZiAodm1lX29mZnNldF9sb3cgJiAweEZGRkYpIHsKIAkJc3Bpbl91bmxvY2soJihpbWFnZS0+bG9jaykpOwotCQlwcmludGsoIkludmFsaWQgVk1FIE9mZnNldCBhbGlnbm1lbnRcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgVk1FIE9mZnNldCBhbGlnbm1lbnRcbiIpOwogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlnb3RvIGVycl9ncmFuOwogCX0KQEAgLTEwOTQsNyArMTA1OSw4IEBACiAJCXRlbXBfY3RsIHw9IFRTSTE0OF9MQ1NSX09UQVRfVE1fMmVTU1Q7CiAJfQogCWlmIChjeWNsZSAmIFZNRV8yZVNTVEIpIHsKLQkJcHJpbnRrKCJDdXJyZW50bHkgbm90IHNldHRpbmcgQnJvYWRjYXN0IFNlbGVjdCBSZWdpc3RlcnNcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJDdXJyZW50bHkgbm90IHNldHRpbmcgQnJvYWRjYXN0IFNlbGVjdCAiCisJCQkiUmVnaXN0ZXJzXG4iKTsKIAkJdGVtcF9jdGwgJj0gflRTSTE0OF9MQ1NSX09UQVRfVE1fTTsKIAkJdGVtcF9jdGwgfD0gVFNJMTQ4X0xDU1JfT1RBVF9UTV8yZVNTVEI7CiAJfQpAQCAtMTExMCw3ICsxMDc2LDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJc3Bpbl91bmxvY2soJihpbWFnZS0+bG9jaykpOwotCQlwcmludGsoIkludmFsaWQgZGF0YSB3aWR0aFxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBkYXRhIHdpZHRoXG4iKTsKIAkJcmV0dmFsID0gLUVJTlZBTDsKIAkJZ290byBlcnJfZHdpZHRoOwogCX0KQEAgLTExNDcsNyArMTExMyw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXNwaW5fdW5sb2NrKCYoaW1hZ2UtPmxvY2spKTsKLQkJcHJpbnRrKCJJbnZhbGlkIGFkZHJlc3Mgc3BhY2VcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgYWRkcmVzcyBzcGFjZVxuIik7CiAJCXJldHZhbCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX2FzcGFjZTsKIAkJYnJlYWs7CkBAIC0yMTU0LDcgKzIxMjAsNyBAQAogCWlvd3JpdGUzMmJlKHRtcCwgdHNpMTQ4X2JyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0lOVEVPKTsKIAogCWlvd3JpdGUzMmJlKFRTSTE0OF9MQ1NSX0lOVENfTE1DW21vbml0b3JdLAotCQkgdHNpMTQ4X2JyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0lOVEVPKTsKKwkJIHRzaTE0OF9icmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9JTlRDKTsKIAogCS8qIERldGFjaCBjYWxsYmFjayAqLwogCWxtX2NhbGxiYWNrW21vbml0b3JdID0gTlVMTDsKQEAgLTIzMzQsNyArMjMwMCw2IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZG1hX3F1ZXVlWzFdKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpYWNrX3F1ZXVlKTsKIAltdXRleF9pbml0KCYodm1lX2ludCkpOwotCW11dGV4X2luaXQoJih2bWVfaXJxKSk7CiAJbXV0ZXhfaW5pdCgmKHZtZV9ybXcpKTsKIAogCXRzaTE0OF9icmlkZ2UtPnBhcmVudCA9ICYocGRldi0+ZGV2KTsKQEAgLTI0ODIsOSArMjQ0Nyw4IEBACiAJdHNpMTQ4X2JyaWRnZS0+ZG1hX2xpc3RfYWRkID0gdHNpMTQ4X2RtYV9saXN0X2FkZDsKIAl0c2kxNDhfYnJpZGdlLT5kbWFfbGlzdF9leGVjID0gdHNpMTQ4X2RtYV9saXN0X2V4ZWM7CiAJdHNpMTQ4X2JyaWRnZS0+ZG1hX2xpc3RfZW1wdHkgPSB0c2kxNDhfZG1hX2xpc3RfZW1wdHk7Ci0JdHNpMTQ4X2JyaWRnZS0+cmVxdWVzdF9pcnEgPSB0c2kxNDhfcmVxdWVzdF9pcnE7Ci0JdHNpMTQ4X2JyaWRnZS0+ZnJlZV9pcnEgPSB0c2kxNDhfZnJlZV9pcnE7Ci0JdHNpMTQ4X2JyaWRnZS0+Z2VuZXJhdGVfaXJxID0gdHNpMTQ4X2dlbmVyYXRlX2lycTsKKwl0c2kxNDhfYnJpZGdlLT5pcnFfc2V0ID0gdHNpMTQ4X2lycV9zZXQ7CisJdHNpMTQ4X2JyaWRnZS0+aXJxX2dlbmVyYXRlID0gdHNpMTQ4X2lycV9nZW5lcmF0ZTsKIAl0c2kxNDhfYnJpZGdlLT5sbV9zZXQgPSB0c2kxNDhfbG1fc2V0OwogCXRzaTE0OF9icmlkZ2UtPmxtX2dldCA9IHRzaTE0OF9sbV9nZXQ7CiAJdHNpMTQ4X2JyaWRnZS0+bG1fYXR0YWNoID0gdHNpMTQ4X2xtX2F0dGFjaDsKQEAgLTI2MTcsMTMgKzI1ODEsNiBAQAogCX0KIAogCS8qCi0JICogIERpc2FibGUgYW5kIGNsZWFyIGFsbCBpbnRlcnJ1cHRzLgotCSAqLwotCWlvd3JpdGUzMmJlKDB4MCwgdHNpMTQ4X2JyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0lOVEVPKTsKLQlpb3dyaXRlMzJiZSgweEZGRkZGRkZGLCB0c2kxNDhfYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5UQyk7Ci0JaW93cml0ZTMyYmUoMHhGRkZGRkZGRiwgdHNpMTQ4X2JyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0lOVEVOKTsKLQotCS8qCiAJICogIE1hcCBhbGwgSW50ZXJydXB0cyB0byBQQ0kgSU5UQQogCSAqLwogCWlvd3JpdGUzMmJlKDB4MCwgdHNpMTQ4X2JyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0lOVE0xKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92bWUvZGV2aWNlcy92bWVfdXNlci5jIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV91c2VyLmMKaW5kZXggNzg5MTI4OC4uZTIyODk0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV91c2VyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV91c2VyLmMKQEAgLTMxLDcgKzMxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNjI1LDcgKzYyNCw3IEBACiBzdGF0aWMgaW50IF9faW5pdCB2bWVfdXNlcl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBjdXJfYnVzLCBpbnQgY3VyX3Nsb3QpCiB7CiAJaW50IGksIGVycjsKLQljaGFyIG5hbWVbOF07CisJY2hhciBuYW1lWzEyXTsKIAogCS8qIFNhdmUgcG9pbnRlciB0byB0aGUgYnJpZGdlIGRldmljZSAqLwogCWlmICh2bWVfdXNlcl9icmlkZ2UgIT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWUuYyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lLmMKaW5kZXggNDc3YTFhZC4uOTk0ZmRiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZS5jCkBAIC0xMyw3ICsxMyw2IEBACiAgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgpAQCAtNjQ0LDcgKzY0Myw3IEBACiAgKiBSZXF1ZXN0IGEgRE1BIGNvbnRyb2xsZXIgd2l0aCBzcGVjaWZpYyBhdHRyaWJ1dGVzLCByZXR1cm4gc29tZSB1bmlxdWUKICAqIGlkZW50aWZpZXIuCiAgKi8KLXN0cnVjdCB2bWVfcmVzb3VyY2UgKnZtZV9yZXF1ZXN0X2RtYShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdHJ1Y3Qgdm1lX3Jlc291cmNlICp2bWVfZG1hX3JlcXVlc3Qoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCB2bWVfYnJpZGdlICpicmlkZ2U7CiAJc3RydWN0IGxpc3RfaGVhZCAqZG1hX3BvcyA9IE5VTEw7CkBAIC03MDUsNyArNzA0LDcgQEAKIGVycl9idXM6CiAJcmV0dXJuIE5VTEw7CiB9Ci1FWFBPUlRfU1lNQk9MKHZtZV9yZXF1ZXN0X2RtYSk7CitFWFBPUlRfU1lNQk9MKHZtZV9kbWFfcmVxdWVzdCk7CiAKIC8qCiAgKiBTdGFydCBuZXcgbGlzdApAQCAtODgwLDcgKzg3OSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChtdXRleF90cnlsb2NrKCYobGlzdC0+bXR4KSkpIHsKKwlpZiAoIW11dGV4X3RyeWxvY2soJihsaXN0LT5tdHgpKSkgewogCQlwcmludGsoIkxpbmsgTGlzdCBhbHJlYWR5IHN1Ym1pdHRlZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTkyMyw3ICs5MjIsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAobXV0ZXhfdHJ5bG9jaygmKGxpc3QtPm10eCkpKSB7CisJaWYgKCFtdXRleF90cnlsb2NrKCYobGlzdC0+bXR4KSkpIHsKIAkJcHJpbnRrKCJMaW5rIExpc3QgaW4gdXNlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtOTU2LDcgKzk1NSw3IEBACiAKIAljdHJsciA9IGxpc3RfZW50cnkocmVzb3VyY2UtPmVudHJ5LCBzdHJ1Y3Qgdm1lX2RtYV9yZXNvdXJjZSwgbGlzdCk7CiAKLQlpZiAobXV0ZXhfdHJ5bG9jaygmKGN0cmxyLT5tdHgpKSkgeworCWlmICghbXV0ZXhfdHJ5bG9jaygmKGN0cmxyLT5tdHgpKSkgewogCQlwcmludGsoIlJlc291cmNlIGJ1c3ksIGNhbid0IGZyZWVcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTk3NSw3ICs5NzQsMjMgQEAKIH0KIEVYUE9SVF9TWU1CT0wodm1lX2RtYV9mcmVlKTsKIAotaW50IHZtZV9yZXF1ZXN0X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBsZXZlbCwgaW50IHN0YXRpZCwKK3ZvaWQgdm1lX2lycV9oYW5kbGVyKHN0cnVjdCB2bWVfYnJpZGdlICpicmlkZ2UsIGludCBsZXZlbCwgaW50IHN0YXRpZCkKK3sKKwl2b2lkICgqY2FsbCkoaW50LCBpbnQsIHZvaWQgKik7CisJdm9pZCAqcHJpdl9kYXRhOworCisJY2FsbCA9IGJyaWRnZS0+aXJxW2xldmVsIC0gMV0uY2FsbGJhY2tbc3RhdGlkXS5mdW5jOworCXByaXZfZGF0YSA9IGJyaWRnZS0+aXJxW2xldmVsIC0gMV0uY2FsbGJhY2tbc3RhdGlkXS5wcml2X2RhdGE7CisKKwlpZiAoY2FsbCAhPSBOVUxMKQorCQljYWxsKGxldmVsLCBzdGF0aWQsIHByaXZfZGF0YSk7CisJZWxzZQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJTcHVyaWxvdXMgVk1FIGludGVycnVwdCwgbGV2ZWw6JXgsICIKKwkJCSJ2ZWN0b3I6JXhcbiIsIGxldmVsLCBzdGF0aWQpOworfQorRVhQT1JUX1NZTUJPTCh2bWVfaXJxX2hhbmRsZXIpOworCitpbnQgdm1lX2lycV9yZXF1ZXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGxldmVsLCBpbnQgc3RhdGlkLAogCXZvaWQgKCpjYWxsYmFjaykoaW50IGxldmVsLCBpbnQgdmVjdG9yLCB2b2lkICpwcml2X2RhdGEpLAogCXZvaWQgKnByaXZfZGF0YSkKIHsKQEAgLTk4OCwyMCArMTAwMywzNyBAQAogCX0KIAogCWlmKChsZXZlbCA8IDEpIHx8IChsZXZlbCA+IDcpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkludmFsaWQgaW50ZXJydXB0IGxldmVsXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIGludGVycnVwdCBsZXZlbFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChicmlkZ2UtPnJlcXVlc3RfaXJxID09IE5VTEwpIHsKLQkJcHJpbnRrKCJSZWdpc3RlcmluZyBpbnRlcnJ1cHRzIG5vdCBzdXBwb3J0ZWRcbiIpOworCWlmIChicmlkZ2UtPmlycV9zZXQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIkNvbmZpZ3VyaW5nIGludGVycnVwdHMgbm90IHN1cHBvcnRlZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJldHVybiBicmlkZ2UtPnJlcXVlc3RfaXJxKGxldmVsLCBzdGF0aWQsIGNhbGxiYWNrLCBwcml2X2RhdGEpOworCW11dGV4X2xvY2soJihicmlkZ2UtPmlycV9tdHgpKTsKKworCWlmIChicmlkZ2UtPmlycVtsZXZlbCAtIDFdLmNhbGxiYWNrW3N0YXRpZF0uZnVuYykgeworCQltdXRleF91bmxvY2soJihicmlkZ2UtPmlycV9tdHgpKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVk1FIEludGVycnVwdCBhbHJlYWR5IHRha2VuXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlicmlkZ2UtPmlycVtsZXZlbCAtIDFdLmNvdW50Kys7CisJYnJpZGdlLT5pcnFbbGV2ZWwgLSAxXS5jYWxsYmFja1tzdGF0aWRdLnByaXZfZGF0YSA9IHByaXZfZGF0YTsKKwlicmlkZ2UtPmlycVtsZXZlbCAtIDFdLmNhbGxiYWNrW3N0YXRpZF0uZnVuYyA9IGNhbGxiYWNrOworCisJLyogRW5hYmxlIElSUSBsZXZlbCAqLworCWJyaWRnZS0+aXJxX3NldChsZXZlbCwgMSwgMSk7CisKKwltdXRleF91bmxvY2soJihicmlkZ2UtPmlycV9tdHgpKTsKKworCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTCh2bWVfcmVxdWVzdF9pcnEpOworRVhQT1JUX1NZTUJPTCh2bWVfaXJxX3JlcXVlc3QpOwogCi12b2lkIHZtZV9mcmVlX2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBsZXZlbCwgaW50IHN0YXRpZCkKK3ZvaWQgdm1lX2lycV9mcmVlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGxldmVsLCBpbnQgc3RhdGlkKQogewogCXN0cnVjdCB2bWVfYnJpZGdlICpicmlkZ2U7CiAKQEAgLTEwMTIsMjAgKzEwNDQsMzEgQEAKIAl9CiAKIAlpZigobGV2ZWwgPCAxKSB8fCAobGV2ZWwgPiA3KSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJJbnZhbGlkIGludGVycnVwdCBsZXZlbFxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBpbnRlcnJ1cHQgbGV2ZWxcbiIpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKGJyaWRnZS0+ZnJlZV9pcnEgPT0gTlVMTCkgewotCQlwcmludGsoIkZyZWVpbmcgaW50ZXJydXB0cyBub3Qgc3VwcG9ydGVkXG4iKTsKKwlpZiAoYnJpZGdlLT5pcnFfc2V0ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDb25maWd1cmluZyBpbnRlcnJ1cHRzIG5vdCBzdXBwb3J0ZWRcbiIpOwogCQlyZXR1cm47CiAJfQogCi0JYnJpZGdlLT5mcmVlX2lycShsZXZlbCwgc3RhdGlkKTsKKwltdXRleF9sb2NrKCYoYnJpZGdlLT5pcnFfbXR4KSk7CisKKwlicmlkZ2UtPmlycVtsZXZlbCAtIDFdLmNvdW50LS07CisKKwkvKiBEaXNhYmxlIElSUSBsZXZlbCBpZiBubyBtb3JlIGludGVycnVwdHMgYXR0YWNoZWQgYXQgdGhpcyBsZXZlbCovCisJaWYgKGJyaWRnZS0+aXJxW2xldmVsIC0gMV0uY291bnQgPT0gMCkKKwkJYnJpZGdlLT5pcnFfc2V0KGxldmVsLCAwLCAxKTsKKworCWJyaWRnZS0+aXJxW2xldmVsIC0gMV0uY2FsbGJhY2tbc3RhdGlkXS5mdW5jID0gTlVMTDsKKwlicmlkZ2UtPmlycVtsZXZlbCAtIDFdLmNhbGxiYWNrW3N0YXRpZF0ucHJpdl9kYXRhID0gTlVMTDsKKworCW11dGV4X3VubG9jaygmKGJyaWRnZS0+aXJxX210eCkpOwogfQotRVhQT1JUX1NZTUJPTCh2bWVfZnJlZV9pcnEpOworRVhQT1JUX1NZTUJPTCh2bWVfaXJxX2ZyZWUpOwogCi1pbnQgdm1lX2dlbmVyYXRlX2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBsZXZlbCwgaW50IHN0YXRpZCkKK2ludCB2bWVfaXJxX2dlbmVyYXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGxldmVsLCBpbnQgc3RhdGlkKQogewogCXN0cnVjdCB2bWVfYnJpZGdlICpicmlkZ2U7CiAKQEAgLTEwNDAsMTQgKzEwODMsMTQgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKGJyaWRnZS0+Z2VuZXJhdGVfaXJxID09IE5VTEwpIHsKKwlpZiAoYnJpZGdlLT5pcnFfZ2VuZXJhdGUgPT0gTlVMTCkgewogCQlwcmludGsoIkludGVycnVwdCBnZW5lcmF0aW9uIG5vdCBzdXBwb3J0ZWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyZXR1cm4gYnJpZGdlLT5nZW5lcmF0ZV9pcnEobGV2ZWwsIHN0YXRpZCk7CisJcmV0dXJuIGJyaWRnZS0+aXJxX2dlbmVyYXRlKGxldmVsLCBzdGF0aWQpOwogfQotRVhQT1JUX1NZTUJPTCh2bWVfZ2VuZXJhdGVfaXJxKTsKK0VYUE9SVF9TWU1CT0wodm1lX2lycV9nZW5lcmF0ZSk7CiAKIC8qCiAgKiBSZXF1ZXN0IHRoZSBsb2NhdGlvbiBtb25pdG9yLCByZXR1cm4gcmVzb3VyY2Ugb3IgTlVMTApAQCAtMTE0OCw3ICsxMTkxLDcgQEAKIAogCS8qIFhYWCBDaGVjayBwYXJhbWV0ZXJzICovCiAKLQlyZXR1cm4gbG0tPnBhcmVudC0+bG1fc2V0KGxtLCBsbV9iYXNlLCBhc3BhY2UsIGN5Y2xlKTsKKwlyZXR1cm4gYnJpZGdlLT5sbV9zZXQobG0sIGxtX2Jhc2UsIGFzcGFjZSwgY3ljbGUpOwogfQogRVhQT1JUX1NZTUJPTCh2bWVfbG1fc2V0KTsKIApAQCAtMTIyOCwxNiArMTI3MSwxOCBAQAogCiAJbG0gPSBsaXN0X2VudHJ5KHJlc291cmNlLT5lbnRyeSwgc3RydWN0IHZtZV9sbV9yZXNvdXJjZSwgbGlzdCk7CiAKLQlpZiAobXV0ZXhfdHJ5bG9jaygmKGxtLT5tdHgpKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlJlc291cmNlIGJ1c3ksIGNhbid0IGZyZWVcbiIpOwotCQlyZXR1cm47Ci0JfQorCW11dGV4X2xvY2soJihsbS0+bXR4KSk7CiAKLQkvKiBYWFggQ2hlY2sgdG8gc2VlIHRoYXQgdGhlcmUgYXJlbid0IGFueSBjYWxsYmFja3Mgc3RpbGwgYXR0YWNoZWQgKi8KKwkvKiBYWFgKKwkgKiBDaGVjayB0byBzZWUgdGhhdCB0aGVyZSBhcmVuJ3QgYW55IGNhbGxiYWNrcyBzdGlsbCBhdHRhY2hlZCwgaWYKKwkgKiB0aGVyZSBhcmUgd2Ugc2hvdWxkIHByb2JhYmx5IGJlIGRldGFjaGluZyB0aGVtIQorCSAqLwogCiAJbG0tPmxvY2tlZCA9IDA7CiAKIAltdXRleF91bmxvY2soJihsbS0+bXR4KSk7CisKKwlrZnJlZShyZXNvdXJjZSk7CiB9CiBFWFBPUlRfU1lNQk9MKHZtZV9sbV9mcmVlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWUuaCBiL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lLmgKaW5kZXggNjIwNmU5MS4uOTdkYzIyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZS5oCkBAIC0xMjMsNyArMTIzLDcgQEAKIAl1bnNpZ25lZCBpbnQsIGxvZmZfdCk7CiB2b2lkIHZtZV9tYXN0ZXJfZnJlZShzdHJ1Y3Qgdm1lX3Jlc291cmNlICopOwogCi1zdHJ1Y3Qgdm1lX3Jlc291cmNlICp2bWVfcmVxdWVzdF9kbWEoc3RydWN0IGRldmljZSAqKTsKK3N0cnVjdCB2bWVfcmVzb3VyY2UgKnZtZV9kbWFfcmVxdWVzdChzdHJ1Y3QgZGV2aWNlICopOwogc3RydWN0IHZtZV9kbWFfbGlzdCAqdm1lX25ld19kbWFfbGlzdChzdHJ1Y3Qgdm1lX3Jlc291cmNlICopOwogc3RydWN0IHZtZV9kbWFfYXR0ciAqdm1lX2RtYV9wYXR0ZXJuX2F0dHJpYnV0ZSh1MzIsIHZtZV9wYXR0ZXJuX3QpOwogc3RydWN0IHZtZV9kbWFfYXR0ciAqdm1lX2RtYV9wY2lfYXR0cmlidXRlKGRtYV9hZGRyX3QpOwpAQCAtMTM2LDEwICsxMzYsMTAgQEAKIGludCB2bWVfZG1hX2xpc3RfZnJlZShzdHJ1Y3Qgdm1lX2RtYV9saXN0ICopOwogaW50IHZtZV9kbWFfZnJlZShzdHJ1Y3Qgdm1lX3Jlc291cmNlICopOwogCi1pbnQgdm1lX3JlcXVlc3RfaXJxKHN0cnVjdCBkZXZpY2UgKiwgaW50LCBpbnQsCitpbnQgdm1lX2lycV9yZXF1ZXN0KHN0cnVjdCBkZXZpY2UgKiwgaW50LCBpbnQsCiAJdm9pZCAoKmNhbGxiYWNrKShpbnQsIGludCwgdm9pZCAqKSwgdm9pZCAqKTsKLXZvaWQgdm1lX2ZyZWVfaXJxKHN0cnVjdCBkZXZpY2UgKiwgaW50LCBpbnQpOwotaW50IHZtZV9nZW5lcmF0ZV9pcnEoc3RydWN0IGRldmljZSAqLCBpbnQsIGludCk7Cit2b2lkIHZtZV9pcnFfZnJlZShzdHJ1Y3QgZGV2aWNlICosIGludCwgaW50KTsKK2ludCB2bWVfaXJxX2dlbmVyYXRlKHN0cnVjdCBkZXZpY2UgKiwgaW50LCBpbnQpOwogCiBzdHJ1Y3Qgdm1lX3Jlc291cmNlICogdm1lX2xtX3JlcXVlc3Qoc3RydWN0IGRldmljZSAqKTsKIGludCB2bWVfbG1fY291bnQoc3RydWN0IHZtZV9yZXNvdXJjZSAqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lX2FwaS50eHQgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZV9hcGkudHh0CmluZGV4IDU5MWViYTUuLmE1YzFiMWNkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWVfYXBpLnR4dAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZV9hcGkudHh0CkBAIC03Nyw3ICs3Nyw3IEBACiAJc3RydWN0IHZtZV9yZXNvdXJjZSAqIHZtZV9zbGF2ZV9yZXF1ZXN0KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJdm1lX2FkZHJlc3NfdCBhc3BhY2UsIHZtZV9jeWNsZV90IGN5Y2xlKTsKIAotCXN0cnVjdCB2bWVfcmVzb3VyY2UgKnZtZV9yZXF1ZXN0X2RtYShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCXN0cnVjdCB2bWVfcmVzb3VyY2UgKnZtZV9kbWFfcmVxdWVzdChzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCiBGb3Igc2xhdmUgd2luZG93cyB0aGVzZSBhdHRyaWJ1dGVzIGFyZSBzcGxpdCBpbnRvIHRob3NlIG9mIHR5cGUgJ3ZtZV9hZGRyZXNzX3QnCiBhbmQgJ3ZtZV9jeWNsZV90Jy4gTWFzdGVyIHdpbmRvd3MgYWRkIGEgZnVydGhlciBzZXQgb2YgYXR0cmlidXRlcyAndm1lX2N5Y2xlX3QnLgpAQCAtMjkwLDEwICsyOTAsMTAgQEAKIGNhbGxiYWNrIGZ1bmN0aW9uLiBBIHZvaWQgcG9pbnRlciBwYXJhbWV0ZXIgaXMgcHJvdmlkZWQsIHRoZSB2YWx1ZSBvZiB3aGljaCBpcwogcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbiwgdGhlIHVzZSBvZiB0aGlzIHBvaW50ZXIgaXMgdXNlciB1bmRlZmluZWQ6CiAKLQlpbnQgdm1lX3JlcXVlc3RfaXJxKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGxldmVsLCBpbnQgc3RhdGlkLAorCWludCB2bWVfaXJxX3JlcXVlc3Qoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgbGV2ZWwsIGludCBzdGF0aWQsCiAJCXZvaWQgKCpjYWxsYmFjaykoaW50LCBpbnQsIHZvaWQgKiksIHZvaWQgKnByaXYpOwogCi0Jdm9pZCB2bWVfZnJlZV9pcnEoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgbGV2ZWwsIGludCBzdGF0aWQpOworCXZvaWQgdm1lX2lycV9mcmVlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGxldmVsLCBpbnQgc3RhdGlkKTsKIAogVGhlIGNhbGxiYWNrIHBhcmFtZXRlcnMgYXJlIGFzIGZvbGxvd3MuIENhcmUgbXVzdCBiZSB0YWtlbiBpbiB3cml0aW5nIGEgY2FsbGJhY2sKIGZ1bmN0aW9uLCBjYWxsYmFjayBmdW5jdGlvbnMgcnVuIGluIGludGVycnVwdCBjb250ZXh0OgpAQCAtMzA3LDcgKzMwNyw3IEBACiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgVk1FIGludGVycnVwdCBhdCBhIGdpdmVuIFZNRQogbGV2ZWwgYW5kIFZNRSBzdGF0dXMgSUQ6CiAKLQlpbnQgdm1lX2dlbmVyYXRlX2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBsZXZlbCwgaW50IHN0YXRpZCk7CisJaW50IHZtZV9pcnFfZ2VuZXJhdGUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgbGV2ZWwsIGludCBzdGF0aWQpOwogCiAKIExvY2F0aW9uIG1vbml0b3JzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZV9icmlkZ2UuaCBiL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lX2JyaWRnZS5oCmluZGV4IGU0M2NjMTkuLjg1MWZhOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lX2JyaWRnZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lX2JyaWRnZS5oCkBAIC0xMjAsNiArMTIwLDggQEAKIAogCS8qIEludGVycnVwdCBjYWxsYmFja3MgKi8KIAlzdHJ1Y3Qgdm1lX2lycSBpcnFbN107CisJLyogTG9ja2luZyBmb3IgVk1FIGlycSBjYWxsYmFjayBjb25maWd1cmF0aW9uICovCisJc3RydWN0IG11dGV4IGlycV9tdHg7CiAKIAkvKiBTbGF2ZSBGdW5jdGlvbnMgKi8KIAlpbnQgKCpzbGF2ZV9nZXQpIChzdHJ1Y3Qgdm1lX3NsYXZlX3Jlc291cmNlICosIGludCAqLApAQCAtMTQ5LDkgKzE1MSw4IEBACiAJaW50ICgqZG1hX2xpc3RfZW1wdHkpIChzdHJ1Y3Qgdm1lX2RtYV9saXN0ICopOwogCiAJLyogSW50ZXJydXB0IEZ1bmN0aW9ucyAqLwotCWludCAoKnJlcXVlc3RfaXJxKSAoaW50LCBpbnQsIHZvaWQgKCpjYmFjaykoaW50LCBpbnQsIHZvaWQqKSwgdm9pZCAqKTsKLQl2b2lkICgqZnJlZV9pcnEpIChpbnQsIGludCk7Ci0JaW50ICgqZ2VuZXJhdGVfaXJxKSAoaW50LCBpbnQpOworCXZvaWQgKCppcnFfc2V0KSAoaW50LCBpbnQsIGludCk7CisJaW50ICgqaXJxX2dlbmVyYXRlKSAoaW50LCBpbnQpOwogCiAJLyogTG9jYXRpb24gbW9uaXRvciBmdW5jdGlvbnMgKi8KIAlpbnQgKCpsbV9zZXQpIChzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICosIHVuc2lnbmVkIGxvbmcgbG9uZywKQEAgLTE3NSw2ICsxNzYsOCBAQAogI2VuZGlmCiB9OwogCit2b2lkIHZtZV9pcnFfaGFuZGxlcihzdHJ1Y3Qgdm1lX2JyaWRnZSAqLCBpbnQsIGludCk7CisKIGludCB2bWVfcmVnaXN0ZXJfYnJpZGdlIChzdHJ1Y3Qgdm1lX2JyaWRnZSAqKTsKIHZvaWQgdm1lX3VucmVnaXN0ZXJfYnJpZGdlIChzdHJ1Y3Qgdm1lX2JyaWRnZSAqKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kZXZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGV2aWNlLmgKaW5kZXggZmE3ZjBmYy4uY2RlNDRkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kZXZpY2UuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RldmljZS5oCkBAIC00NCw3ICs0NCw2IEBACiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KQEAgLTc5LDcgKzc4LDYgQEAKIC8vIGRldmljZSBzcGVjaWZpYwogLy8KIAotI2luY2x1ZGUgImtjb21wYXQuaCIKICNpbmNsdWRlICJkZXZpY2VfY2ZnLmgiCiAjaW5jbHVkZSAidHR5cGUuaCIKICNpbmNsdWRlICI4MDIxMWhkci5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kZXZpY2VfbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kZXZpY2VfbWFpbi5jCmluZGV4IDUzNDUwYjQuLjBkYjhkN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGV2aWNlX21haW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RldmljZV9tYWluLmMKQEAgLTY2MSw3ICs2NjEsNyBAQAogICAgaWYoem9uZXR5cGUhPXBEZXZpY2UtPmFieUVFUFJPTVtFRVBfT0ZTX1pPTkVUWVBFXSkKICAgICAgIHByaW50aygiem9uZXR5cGUgaW4gZmlsZVslMDJ4XSBtaXNtYXRjaCB3aXRoIGluIEVFUFJPTVslMDJ4XVxuIix6b25ldHlwZSxwRGV2aWNlLT5hYnlFRVBST01bRUVQX09GU19aT05FVFlQRV0pOwogICAgZWxzZQotICAgICAgcHJpbnRrKCJSZWFkIFpvbmV0eXBlIGZpbGUgc3VjZXNzLHVzZSBkZWZhdWx0IHpvbmV0eXBlIHNldHRpbmdbJTAyeF1cbiIsem9uZXR5cGUpOworICAgICAgcHJpbnRrKCJSZWFkIFpvbmV0eXBlIGZpbGUgc3VjY2Vzcyx1c2UgZGVmYXVsdCB6b25ldHlwZSBzZXR0aW5nWyUwMnhdXG4iLHpvbmV0eXBlKTsKICB9CiAgCX0KICAgZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9pb2N0bC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9pb2N0bC5jCmluZGV4IGZjOWNiZTAuLmQ5YTVmZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvaW9jdGwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2lvY3RsLmMKQEAgLTE1OSw3ICsxNTksNyBAQAogCSBlbHNlIGlmKHpvbmV0eXBlID09IDB4MDIpIHsgLy9FdXJvcGUKICAgICAgICAgICAgICBzWm9uZVR5cGVDbWQuWm9uZVR5cGUgPSBab25lVHlwZV9FdXJvcGU7CiAJIH0KLQkgZWxzZSB7IC8vVW5rbm93IFpvbmVUeXBlCisJIGVsc2UgeyAvL1Vua25vd24gWm9uZVR5cGUKIAkgICAgICAgIHByaW50aygiRXJyb3I6Wm9uZVR5cGVbJXhdIFVua25vd24gPz8/XG4iLHpvbmV0eXBlKTsKIAkgICAgICAgICByZXN1bHQgPSAtRUZBVUxUOwogCQlicmVhazsKQEAgLTY5Miw3ICs2OTIsNyBAQAogICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBEZXZpY2UtPmRldiwgSVdFVkNVU1RPTSwgJndycXUsIHBJdGVtU1NJRC0+YWJ5U1NJRCk7CiAgICB9CiAgICAjZW5kaWYKLSAgICAgICAgIHBEZXZpY2UtPmZXUEFfQXV0aGVuZWQgPSBUUlVFOyAgICAgICAgICAgLy9pcyBzdWNlc3NmdWwgcGVlciB0byB3cGFfUmVzdWx0LmF1dGhlbnRpY2F0ZWQ/CisgICAgICAgICBwRGV2aWNlLT5mV1BBX0F1dGhlbmVkID0gVFJVRTsgICAgICAgICAgIC8vaXMgc3VjY2Vzc2Z1bCBwZWVyIHRvIHdwYV9SZXN1bHQuYXV0aGVudGljYXRlZD8KIH0KIAogICAgICAgICAvL3ByaW50aygiZ2V0IHByaXZhdGUgd3BhX3N1cHBsaWNhbnQgYW5ub3VuY2UgV1BBIFNNXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUva2NvbXBhdC5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9rY29tcGF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZjYzNGMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9rY29tcGF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk2LCAyMDAzIFZJQSBOZXR3b3JraW5nLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKgotICogRmlsZToga2NvbXBhdC5oCi0gKgotICogUHVycG9zZTogZGVmaW5lIGtlcm5lbCBjb21wYXRpYmlsaXR5IGhlYWRlcgotICoKLSAqIEF1dGhvcjogTHluZG9uIENoZW4KLSAqCi0gKiBEYXRlOiBBcHIgOCwgMjAwMgotICoKLSAqLwotCi0jaWZuZGVmIF9LQ09NUEFUX0gKLSNkZWZpbmUgX0tDT01QQVRfSAotCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotCi0jaWZuZGVmIEhBVkVfTkVUREVWX1BSSVYKLSNkZWZpbmUgbmV0ZGV2X3ByaXYoZGV2KSAoZGV2LT5wcml2KQotI2VuZGlmCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21pYi5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9taWIuaAppbmRleCA2OWUwNGY3Li4yYWEyYjkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21pYi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWliLmgKQEAgLTMyNSwxMCArMzI1LDEwIEBACiAgICAjaWZkZWYgQ2FsY3VfTGlua1F1YWwKICAgICAgICAvL1R4IGNvdW50OgogICAgIFVMT05HIFR4Tm9SZXRyeU9rQ291bnQ7ICAgICAgICAgLy9zdWNjZXNzIHR4IG5vIHJldHJ5ICEKLSAgICBVTE9ORyBUeFJldHJ5T2tDb3VudDsgICAgICAgICAgICAgIC8vc3VjZXNzIHR4IGJ1dCByZXRyeSAhCisgICAgVUxPTkcgVHhSZXRyeU9rQ291bnQ7ICAgICAgICAgICAgICAvL3N1Y2Nlc3MgdHggYnV0IHJldHJ5ICEKICAgICBVTE9ORyBUeEZhaWxDb3VudDsgICAgICAgICAgICAgICAgICAgICAgLy9mYWlsIHR4ID8KICAgICAgIC8vUnggY291bnQ6Ci0gICAgVUxPTkcgUnhPa0NudDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc3VjZXNzIHJ4ICEKKyAgICBVTE9ORyBSeE9rQ250OyAgICAgICAgICAgICAgICAgICAgICAgICAgLy9zdWNjZXNzIHJ4ICEKICAgICBVTE9ORyBSeEZjc0VyckNudDsgICAgICAgICAgICAgICAgICAgIC8vZmFpbCByeCA/CiAgICAgICAvL3N0YXRpc3RpYwogICAgIFVMT05HIFNpZ25hbFN0cmVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9yeHR4LmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3J4dHguaAppbmRleCAxN2JkMWIxLi41ZGE4MTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3J4dHguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3J4dHguaApAQCAtMzUsMTcgKzM1LDEwIEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgRGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgQ2xhc3NlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgVmFyaWFibGVzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgRnVuY3Rpb25zICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXNzdW1lIEMgZGVjbGFyYXRpb25zIGZvciBDKysgKi8KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCiAvKgogVk9JRCB2R2VuZXJhdGVNQUNIZWFkZXIoCiAgICAgSU4gUFNEZXZpY2UgcERldmljZSwKQEAgLTExMSwxNCArMTA0LDQgQEAKIENNRF9TVEFUVVMgY3NNZ210X3htaXQoUFNEZXZpY2UgcERldmljZSwgUFNUeE1nbXRQYWNrZXQgcFBhY2tldCk7CiBDTURfU1RBVFVTIGNzQmVhY29uX3htaXQoUFNEZXZpY2UgcERldmljZSwgUFNUeE1nbXRQYWNrZXQgcFBhY2tldCk7CiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBleHRlcm4gIkMiIHsgKi8KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLQotCiAjZW5kaWYgLy8gX19SWFRYX0hfXwotCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93Y21kLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3djbWQuYwppbmRleCBkODFmNWI3Li5jOWVhYmY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3djbWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3djbWQuYwpAQCAtNDgsNyArNDgsNiBAQAogI2luY2x1ZGUgIndtZ3IuaCIKICNpbmNsdWRlICJwb3dlci5oIgogI2luY2x1ZGUgIndjdGwuaCIKLSNpbmNsdWRlICJjYXJkLmgiCiAjaW5jbHVkZSAiYmFzZWJhbmQuaCIKICNpbmNsdWRlICJyeHR4LmgiCiAjaW5jbHVkZSAicmYuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd3BhLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dwYS5jCmluZGV4IGY5MmQzM2YuLjVkYTY3MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd3BhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93cGEuYwpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAgICAgICAgIGlmIChwUlNOLT5sZW4gPj0gMTIpIC8vb3VpMSg0KSt2ZXIoMikrR0tTKDQpK1BLU0NudCgyKQogICAgICAgICB7CiAgICAgICAgICAgICBqID0gMDsKLSAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8id1BLQ291bnQ6ICVkLCBzaXplb2YocEJTU0xpc3QtPmFieVBLVHlwZSk6ICVsZFxuIiwgcFJTTi0+d1BLQ291bnQsIHNpemVvZihwQlNTTGlzdC0+YWJ5UEtUeXBlKSk7CisgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIndQS0NvdW50OiAlZCwgc2l6ZW9mKHBCU1NMaXN0LT5hYnlQS1R5cGUpOiAlenVcbiIsIHBSU04tPndQS0NvdW50LCBzaXplb2YocEJTU0xpc3QtPmFieVBLVHlwZSkpOwogICAgICAgICAgICAgZm9yKGkgPSAwOyAoaSA8IHBSU04tPndQS0NvdW50KSAmJiAoaiA8IHNpemVvZihwQlNTTGlzdC0+YWJ5UEtUeXBlKS9zaXplb2YoQllURSkpOyBpKyspIHsKICAgICAgICAgICAgICAgICBpZihwUlNOLT5sZW4gPj0gMTIraSo0KzQpIHsgLy9vdWkxKDQpK3ZlcigyKStHS1MoNCkrUEtTQ250KDIpK1BLUyg0KmkpCiAgICAgICAgICAgICAgICAgICAgIGlmICggIW1lbWNtcChwUlNOLT5QS1NMaXN0W2ldLmFieU9VSSwgYWJ5T1VJMDAsIDQpKQpAQCAtMTc4LDcgKzE3OCw3IEBACiAgICAgICAgICAgICAvLyBvdmVybGF5IElFX1JTTl9BdXRoIHN0cnVjdHVyZSBpbnRvIGNvcnJlY3QgcGxhY2UKICAgICAgICAgICAgIHBJRV9SU05fQXV0aCA9IChQV0xBTl9JRV9SU05fQVVUSCkgcFJTTi0+UEtTTGlzdFttXS5hYnlPVUk7CiAgICAgICAgICAgICBqID0gMDsKLSAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8id0F1dGhDb3VudDogJWQsIHNpemVvZihwQlNTTGlzdC0+YWJ5QXV0aFR5cGUpOiAlbGRcbiIsCisgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIndBdXRoQ291bnQ6ICVkLCBzaXplb2YocEJTU0xpc3QtPmFieUF1dGhUeXBlKTogJXp1XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwSUVfUlNOX0F1dGgtPndBdXRoQ291bnQsIHNpemVvZihwQlNTTGlzdC0+YWJ5QXV0aFR5cGUpKTsKICAgICAgICAgICAgIGZvcihpID0gMDsgKGkgPCBwSUVfUlNOX0F1dGgtPndBdXRoQ291bnQpICYmIChqIDwgc2l6ZW9mKHBCU1NMaXN0LT5hYnlBdXRoVHlwZSkvc2l6ZW9mKEJZVEUpKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYocFJTTi0+bGVuID49IDE0KzQrKG0raSkqNCkgeyAvL291aTEoNCkrdmVyKDIpK0dLUyg0KStQS1NDbnQoMikrUEtTKDQqbSkrQUtDKDIpK0FLUyg0KmkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dyb3V0ZS5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93cm91dGUuYwppbmRleCBhYjk5MTYxLi4xZDAyMDQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dyb3V0ZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd3JvdXRlLmMKQEAgLTExMyw3ICsxMTMsNyBAQAogICAgIH0KIAogICAgIGlmIChwRGV2aWNlLT5iRW5hYmxlSG9zdFdFUCkgewotICAgICAgICBpZiAodU5vZGVJbmRleCA+PSAwKSB7CisJaWYgKHVOb2RlSW5kZXggPCBNQVhfTk9ERV9OVU0gKyAxKSB7CiAgICAgICAgICAgICBwVHJhbnNtaXRLZXkgPSAmU1RlbXBLZXk7CiAgICAgICAgICAgICBwVHJhbnNtaXRLZXktPmJ5Q2lwaGVyU3VpdGUgPSBwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLmJ5Q2lwaGVyU3VpdGU7CiAgICAgICAgICAgICBwVHJhbnNtaXRLZXktPmR3S2V5SW5kZXggPSBwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLmR3S2V5SW5kZXg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Jhc2ViYW5kLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Jhc2ViYW5kLmMKaW5kZXggODIwYTdiOC4uN2RjMDFkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9iYXNlYmFuZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvYmFzZWJhbmQuYwpAQCAtNDYsNyArNDYsNiBAQAogI2luY2x1ZGUgImNvbnRyb2wuaCIKICNpbmNsdWRlICJkYXRhcmF0ZS5oIgogI2luY2x1ZGUgInJuZGlzLmgiCi0jaW5jbHVkZSAiY29udHJvbC5oIgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgU3RhdGljIERlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIGludCAgICAgICAgICBtc2dsZXZlbCAgICAgICAgICAgICAgICA9TVNHX0xFVkVMX0lORk87CkBAIC0xMDQxLDcgKzEwNDAsNyBAQAogICAgaWYocERldmljZS0+Y29uZmlnX2ZpbGUuWm9uZVR5cGUgIT1wRGV2aWNlLT5hYnlFRVBST01bRUVQX09GU19aT05FVFlQRV0pCiAgICAgICBwcmludGsoInpvbmV0eXBlIGluIGZpbGVbJTAyeF0gbWlzbWF0Y2ggd2l0aCBpbiBFRVBST01bJTAyeF1cbiIscERldmljZS0+Y29uZmlnX2ZpbGUuWm9uZVR5cGUscERldmljZS0+YWJ5RUVQUk9NW0VFUF9PRlNfWk9ORVRZUEVdKTsKICAgIGVsc2UKLSAgICAgIHByaW50aygiUmVhZCBab25ldHlwZSBmaWxlIHN1Y2Vzcyx1c2UgZGVmYXVsdCB6b25ldHlwZSBzZXR0aW5nWyUwMnhdXG4iLHBEZXZpY2UtPmNvbmZpZ19maWxlLlpvbmVUeXBlKTsKKyAgICAgIHByaW50aygiUmVhZCBab25ldHlwZSBmaWxlIHN1Y2Nlc3MsdXNlIGRlZmF1bHQgem9uZXR5cGUgc2V0dGluZ1slMDJ4XVxuIixwRGV2aWNlLT5jb25maWdfZmlsZS5ab25lVHlwZSk7CiAgfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2NoYW5uZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY2hhbm5lbC5jCmluZGV4IGU0OTc5NmYuLmY3MTM2YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY2hhbm5lbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY2hhbm5lbC5jCkBAIC0xOSw3ICsxOSw3IEBACiAgKgogICogRmlsZTogY2hhbm5lbC5jCiAgKgotICogUHVycG9zZTogQ2hhbm5lbCBudW1iZXIgbWFwaW5nCisgKiBQdXJwb3NlOiBDaGFubmVsIG51bWJlciBtYXBwaW5nCiAgKgogICogQXV0aG9yOiBMdWNhcyBMaW4KICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kZXZpY2UuaAppbmRleCBiMDJjYTJkLi44YjU0MWQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RldmljZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZGV2aWNlLmgKQEAgLTQ0LDcgKzQ0LDYgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgpAQCAtODgsNyArODcsNiBAQAogLy8gZGV2aWNlIHNwZWNpZmljCiAvLwogCi0jaW5jbHVkZSAia2NvbXBhdC5oIgogI2luY2x1ZGUgImRldmljZV9jZmcuaCIKICNpbmNsdWRlICJ0dHlwZS5oIgogI2luY2x1ZGUgIjgwMjExaGRyLmgiCkBAIC0xMDMsNyArMTAxLDcgQEAKICNpbmNsdWRlICJjYXJkLmgiCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgRGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIFZOVF9VU0JfVkVORE9SX0lEICAgICAgICAgICAgICAgICAgICAgMHgxNjBBCisjZGVmaW5lIFZOVF9VU0JfVkVORE9SX0lEICAgICAgICAgICAgICAgICAgICAgMHgxNjBhCiAjZGVmaW5lIFZOVF9VU0JfUFJPRFVDVF9JRCAgICAgICAgICAgICAgICAgICAgMHgzMTg0CiAKICNkZWZpbmUgTUFDX01BWF9DT05URVhUX1JFRyAgICAgKDI1NisxMjgpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Zpcm13YXJlLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Zpcm13YXJlLmMKaW5kZXggNTJkYWEzYi4uNTg1YjZiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9maXJtd2FyZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZmlybXdhcmUuYwpAQCAtODAxLDcgKzgwMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocEJ1ZmZlcltpaV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAKLSAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iRG93bmxvYWQgZmlybXdhcmUuLi4lZCAlbGRcbiIsIGlpLCBzaXplb2YoYWJ5RmlybXdhcmUpKTsKKyAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iRG93bmxvYWQgZmlybXdhcmUuLi4lZCAlenVcbiIsIGlpLCBzaXplb2YoYWJ5RmlybXdhcmUpKTsKICAgICAgICAgICAgIGlmIChOZGlzU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKSB7CiAgICAgICAgICAgICAgICAgaWYgKHBCdWZmZXIpCiAgICAgICAgICAgICAgICAgICAgIGtmcmVlKHBCdWZmZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9ob3N0YXAuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaG9zdGFwLmMKaW5kZXggMGM4MjY3YS4uMTA3OGQ2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9ob3N0YXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2hvc3RhcC5jCkBAIC0zNyw3ICszNyw2IEBACiAjaW5jbHVkZSAiYmFzZWJhbmQuaCIKICNpbmNsdWRlICJ3cGFjdGwuaCIKICNpbmNsdWRlICJrZXkuaCIKLSNpbmNsdWRlICJtYWMuaCIKICNpbmNsdWRlICJkYXRhcmF0ZS5oIgogCiAjZGVmaW5lIFZJQVdHRVRfSE9TVEFQRF9NQVhfQlVGX1NJWkUgMTAyNApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pb2N0bC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pb2N0bC5jCmluZGV4IGQ5NDEzMWYuLjZmMzMwMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaW9jdGwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2lvY3RsLmMKQEAgLTE1Miw3ICsxNTIsNyBAQAogCSBlbHNlIGlmKHpvbmV0eXBlID09IDB4MDIpIHsgLy9FdXJvcGUKICAgICAgICAgICAgICBzWm9uZVR5cGVDbWQuWm9uZVR5cGUgPSBab25lVHlwZV9FdXJvcGU7CiAJIH0KLQkgZWxzZSB7IC8vVW5rbm93IFpvbmVUeXBlCisJIGVsc2UgeyAvL1Vua25vd24gWm9uZVR5cGUKIAkgICAgICAgIHByaW50aygiRXJyb3I6Wm9uZVR5cGVbJXhdIFVua25vd24gPz8/XG4iLHpvbmV0eXBlKTsKIAkgICAgICAgICByZXN1bHQgPSAtRUZBVUxUOwogCQlicmVhazsKQEAgLTY3OSw3ICs2NzksNyBAQAogICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBEZXZpY2UtPmRldiwgSVdFVkNVU1RPTSwgJndycXUsIHBJdGVtU1NJRC0+YWJ5U1NJRCk7CiAgICB9CiAgICAjZW5kaWYKLSAgICAgICAgIHBEZXZpY2UtPmZXUEFfQXV0aGVuZWQgPSBUUlVFOyAgICAgICAgICAgLy9pcyBzdWNlc3NmdWwgcGVlciB0byB3cGFfUmVzdWx0LmF1dGhlbnRpY2F0ZWQ/CisgICAgICAgICBwRGV2aWNlLT5mV1BBX0F1dGhlbmVkID0gVFJVRTsgICAgICAgICAgIC8vaXMgc3VjY2Vzc2Z1bCBwZWVyIHRvIHdwYV9SZXN1bHQuYXV0aGVudGljYXRlZD8KIH0KIAogICAgICAgICAvL3ByaW50aygiZ2V0IHByaXZhdGUgd3BhX3N1cHBsaWNhbnQgYW5ub3VuY2UgV1BBIFNNXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaXdjdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaXdjdGwuYwppbmRleCBhYThkMWEyLi5iN2M2YTIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2l3Y3RsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pd2N0bC5jCkBAIC0xNzI0LDcgKzE3MjQsNyBAQAogCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKIAkJLy9wRGV2aWNlLT5iV1BBREVWVXAgPSAhISB3cnEtPnZhbHVlOwogCQkvL2lmKHBEZXZpY2UtPmJXUEFERVZVcD09VFJVRSkKLQkJICAvLyBwcmludGsoIml3Y3RsX3Npd2F1dGg6c2V0IFdQQURFViB0byBlbmFibGUgc3VjZXNzZnVsKioqKioqKlxuIik7CisJCSAgLy8gcHJpbnRrKCJpd2N0bF9zaXdhdXRoOnNldCBXUEFERVYgdG8gZW5hYmxlIHN1Y2Nlc3NmdWwqKioqKioqXG4iKTsKIAkJLy9lbHNlCiAJCSAvLyAgcHJpbnRrKCJpd2N0bF9zaXdhdXRoOnNldCBXUEFERVYgdG8gZW5hYmxlIGZhaWw/Pz8/P1xuIik7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9rY29tcGF0LmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2tjb21wYXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNmNjM0Yy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2tjb21wYXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsIDIwMDMgVklBIE5ldHdvcmtpbmcsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqCi0gKiBGaWxlOiBrY29tcGF0LmgKLSAqCi0gKiBQdXJwb3NlOiBkZWZpbmUga2VybmVsIGNvbXBhdGliaWxpdHkgaGVhZGVyCi0gKgotICogQXV0aG9yOiBMeW5kb24gQ2hlbgotICoKLSAqIERhdGU6IEFwciA4LCAyMDAyCi0gKgotICovCi0KLSNpZm5kZWYgX0tDT01QQVRfSAotI2RlZmluZSBfS0NPTVBBVF9ICi0KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0KLSNpZm5kZWYgSEFWRV9ORVRERVZfUFJJVgotI2RlZmluZSBuZXRkZXZfcHJpdihkZXYpIChkZXYtPnByaXYpCi0jZW5kaWYKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFpbl91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFpbl91c2IuYwppbmRleCAwNTE4NjExLi5lZjE3YzQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21haW5fdXNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9tYWluX3VzYi5jCkBAIC02NCwxMSArNjQsOSBAQAogI2luY2x1ZGUgImlvY3RsLmgiCiAjaW5jbHVkZSAiaXdjdGwuaCIKICNpbmNsdWRlICJkcGMuaCIKLSNpbmNsdWRlICJpb2NtZC5oIgogI2luY2x1ZGUgImRhdGFyYXRlLmgiCiAjaW5jbHVkZSAicmYuaCIKICNpbmNsdWRlICJmaXJtd2FyZS5oIgotI2luY2x1ZGUgIm1hYy5oIgogI2luY2x1ZGUgInJuZGlzLmgiCiAjaW5jbHVkZSAiY29udHJvbC5oIgogI2luY2x1ZGUgImNoYW5uZWwuaCIKQEAgLTgwOSwxMiArODA3LDYgQEAKICAgICAgICAga2ZyZWUocERldmljZSk7CiAgICAgICAgIHJldHVybiAtRU5PREVWOwogICAgIH0KLQkvLzIwMDgtMDYyMy0wMjxSZW1hcms+YnkgTWlrZUxpdQotICAgICAgICAvLzIwMDctMDgyMS0wMTxBZGQ+YnkgTWlrZUxpdQotICAgICAgIC8vI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkKLSAgCS8vdXNiX3NldF9pbnRmZGF0YShpbnRmLCBwRGV2aWNlKTsKLQkvL1NFVF9ORVRERVZfREVWKG5ldGRldiwgJmludGYtPmRldik7Ci0gICAgICAgLy8jZW5kaWYKIAogLy8yMDA4LTA3LTIxLTAxPEFkZD5ieSBNaWtlTGl1CiAvL3JlZ2lzdGVyIHdwYWRldgpAQCAtMTU0NSw3ICsxNTM3LDcgQEAKICAgcmV0dXJuIGJ1ZmZlcjsKIH0KIAotLy9yZXR1cm4gLS0tPi0xOmZhaWw7ICA+PTA6c3VjZXNzZnVsCisvL3JldHVybiAtLS0+LTE6ZmFpbDsgID49MDpzdWNjZXNzZnVsCiBzdGF0aWMgaW50IFJlYWRfY29uZmlnX2ZpbGUoUFNEZXZpY2UgcERldmljZSkgewogICBpbnQgcmVzdWx0PTA7CiAgIFVDSEFSICAgICAgdG1wYnVmZmVyWzEwMF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21pYi5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9taWIuaAppbmRleCBiODA2YjRkLi5hYzk5NmQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21pYi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWliLmgKQEAgLTM1NywxMCArMzU3LDEwIEBACiAgICAjaWZkZWYgQ2FsY3VfTGlua1F1YWwKICAgICAgICAvL1R4IGNvdW50OgogICAgIFVMT05HIFR4Tm9SZXRyeU9rQ291bnQ7ICAgICAgICAgLy9zdWNjZXNzIHR4IG5vIHJldHJ5ICEKLSAgICBVTE9ORyBUeFJldHJ5T2tDb3VudDsgICAgICAgICAgICAgIC8vc3VjZXNzIHR4IGJ1dCByZXRyeSAhCisgICAgVUxPTkcgVHhSZXRyeU9rQ291bnQ7ICAgICAgICAgICAgICAvL3N1Y2Nlc3MgdHggYnV0IHJldHJ5ICEKICAgICBVTE9ORyBUeEZhaWxDb3VudDsgICAgICAgICAgICAgICAgICAgICAgLy9mYWlsIHR4ID8KICAgICAgIC8vUnggY291bnQ6Ci0gICAgVUxPTkcgUnhPa0NudDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc3VjZXNzIHJ4ICEKKyAgICBVTE9ORyBSeE9rQ250OyAgICAgICAgICAgICAgICAgICAgICAgICAgLy9zdWNjZXNzIHJ4ICEKICAgICBVTE9ORyBSeEZjc0VyckNudDsgICAgICAgICAgICAgICAgICAgIC8vZmFpbCByeCA/CiAgICAgICAvL3N0YXRpc3RpYwogICAgIFVMT05HIFNpZ25hbFN0cmVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9yeHR4LmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3J4dHguYwppbmRleCA5NGRkZjhiLi5kOWZhMzZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3J4dHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3J4dHguYwpAQCAtMzE1Myw3ICszMTUzLDcgQEAKICAgICB9CiAKICAgICBpZiAocERldmljZS0+YkVuYWJsZUhvc3RXRVApIHsKLSAgICAgICAgaWYgKHVOb2RlSW5kZXggPj0gMCkgeworICAgICAgICBpZiAodU5vZGVJbmRleCA8IE1BWF9OT0RFX05VTSArIDEpIHsKICAgICAgICAgICAgIHBUcmFuc21pdEtleSA9ICZTVGVtcEtleTsKICAgICAgICAgICAgIHBUcmFuc21pdEtleS0+YnlDaXBoZXJTdWl0ZSA9IHBNZ210LT5zTm9kZURCVGFibGVbdU5vZGVJbmRleF0uYnlDaXBoZXJTdWl0ZTsKICAgICAgICAgICAgIHBUcmFuc21pdEtleS0+ZHdLZXlJbmRleCA9IHBNZ210LT5zTm9kZURCVGFibGVbdU5vZGVJbmRleF0uZHdLZXlJbmRleDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd2NtZC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93Y21kLmMKaW5kZXggNjkxMjM0NC4uNTFiMmRjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93Y21kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93Y21kLmMKQEAgLTQ4LDcgKzQ4LDYgQEAKICNpbmNsdWRlICJ3bWdyLmgiCiAjaW5jbHVkZSAicG93ZXIuaCIKICNpbmNsdWRlICJ3Y3RsLmgiCi0jaW5jbHVkZSAiY2FyZC5oIgogI2luY2x1ZGUgImJhc2ViYW5kLmgiCiAjaW5jbHVkZSAiY29udHJvbC5oIgogI2luY2x1ZGUgInJ4dHguaCIKQEAgLTEzMzIsNyArMTMzMSw3IEBACiAgICAgfQogCiAgIHNwaW5fbG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwotICAvL2lzIHdhcF9zdXBwbGljYW50IHJ1bm5pbmcgc3VjZXNzZnVsIE9SIG9ubHkgb3BlbiAmJiBzaGFyZWtleSBtb2RlIQorICAvL2lzIHdhcF9zdXBwbGljYW50IHJ1bm5pbmcgc3VjY2Vzc2Z1bCBPUiBvbmx5IG9wZW4gJiYgc2hhcmVrZXkgbW9kZSEKICAgI2lmIDEKICAgaWYoKChwRGV2aWNlLT5iTGlua1Bhc3MgPT1UUlVFKSYmKHBNZ210LT5lQXV0aGVuTW9kZSA8IFdNQUNfQVVUSF9XUEEpKSB8fCAgLy9vcGVuICYmIHNoYXJla2V5IGxpbmtpbmcKICAgICAgIChwRGV2aWNlLT5mV1BBX0F1dGhlbmVkID09IFRSVUUpKSB7ICAgLy93cGEgbGlua2luZwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93cGEuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd3BhLmMKaW5kZXggZjkyZDMzZi4uNWRhNjcxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93cGEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3dwYS5jCkBAIC0xNDcsNyArMTQ3LDcgQEAKICAgICAgICAgaWYgKHBSU04tPmxlbiA+PSAxMikgLy9vdWkxKDQpK3ZlcigyKStHS1MoNCkrUEtTQ250KDIpCiAgICAgICAgIHsKICAgICAgICAgICAgIGogPSAwOwotICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJ3UEtDb3VudDogJWQsIHNpemVvZihwQlNTTGlzdC0+YWJ5UEtUeXBlKTogJWxkXG4iLCBwUlNOLT53UEtDb3VudCwgc2l6ZW9mKHBCU1NMaXN0LT5hYnlQS1R5cGUpKTsKKyAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8id1BLQ291bnQ6ICVkLCBzaXplb2YocEJTU0xpc3QtPmFieVBLVHlwZSk6ICV6dVxuIiwgcFJTTi0+d1BLQ291bnQsIHNpemVvZihwQlNTTGlzdC0+YWJ5UEtUeXBlKSk7CiAgICAgICAgICAgICBmb3IoaSA9IDA7IChpIDwgcFJTTi0+d1BLQ291bnQpICYmIChqIDwgc2l6ZW9mKHBCU1NMaXN0LT5hYnlQS1R5cGUpL3NpemVvZihCWVRFKSk7IGkrKykgewogICAgICAgICAgICAgICAgIGlmKHBSU04tPmxlbiA+PSAxMitpKjQrNCkgeyAvL291aTEoNCkrdmVyKDIpK0dLUyg0KStQS1NDbnQoMikrUEtTKDQqaSkKICAgICAgICAgICAgICAgICAgICAgaWYgKCAhbWVtY21wKHBSU04tPlBLU0xpc3RbaV0uYWJ5T1VJLCBhYnlPVUkwMCwgNCkpCkBAIC0xNzgsNyArMTc4LDcgQEAKICAgICAgICAgICAgIC8vIG92ZXJsYXkgSUVfUlNOX0F1dGggc3RydWN0dXJlIGludG8gY29ycmVjdCBwbGFjZQogICAgICAgICAgICAgcElFX1JTTl9BdXRoID0gKFBXTEFOX0lFX1JTTl9BVVRIKSBwUlNOLT5QS1NMaXN0W21dLmFieU9VSTsKICAgICAgICAgICAgIGogPSAwOwotICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJ3QXV0aENvdW50OiAlZCwgc2l6ZW9mKHBCU1NMaXN0LT5hYnlBdXRoVHlwZSk6ICVsZFxuIiwKKyAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8id0F1dGhDb3VudDogJWQsIHNpemVvZihwQlNTTGlzdC0+YWJ5QXV0aFR5cGUpOiAlenVcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJRV9SU05fQXV0aC0+d0F1dGhDb3VudCwgc2l6ZW9mKHBCU1NMaXN0LT5hYnlBdXRoVHlwZSkpOwogICAgICAgICAgICAgZm9yKGkgPSAwOyAoaSA8IHBJRV9SU05fQXV0aC0+d0F1dGhDb3VudCkgJiYgKGogPCBzaXplb2YocEJTU0xpc3QtPmFieUF1dGhUeXBlKS9zaXplb2YoQllURSkpOyBpKyspIHsKICAgICAgICAgICAgICAgICBpZihwUlNOLT5sZW4gPj0gMTQrNCsobStpKSo0KSB7IC8vb3VpMSg0KSt2ZXIoMikrR0tTKDQpK1BLU0NudCgyKStQS1MoNCptKStBS0MoMikrQUtTKDQqaSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMDUzZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9LY29uZmlnCkBAIC0wLDAgKzEsOSBAQAorY29uZmlnIFdMQUdTNDlfSDIKKwl0cmlzdGF0ZSAiQWdlcmUgU3lzdGVtcyBIRVJNRVMgSUkgV2lyZWxlc3MgUEMgQ2FyZCBNb2RlbCAwMTEwIgorCWRlcGVuZHMgb24gV0xBTl84MDIxMSAmJiBXSVJFTEVTU19FWFQgJiYgUENNQ0lBCisJc2VsZWN0IFdFWFRfU1BZCisJLS0taGVscC0tLQorCSAgRHJpdmVyIGZvciB3aXJlbGVzcyBjYXJkcyB1c2luZyBBZ2VyZSdzIEhFUk1FUyBJSSBjaGlwc2V0CisJICB3aGljaCBhcmUgaWRlbnRpZmllZCB3aXRoIE1hbnVmYWN0dXJlIElEOiAwMTU2LDAwMDMKKwkgIFRoZSBzb2Z0d2FyZSBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2Ygd2xfbGttXzcyMl9hYmcudGFyLmd6CisJICBmcm9tIHRoZSBBZ2VyZSBTeXN0ZW1zIHdlYnNpdGUsIGFkZGFwdGVkIGZvciBVYnVudHUgOS4wNC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVkMGE4YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL01ha2VmaWxlCkBAIC0wLDAgKzEsODEgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHdsYWdzNDlfaDJfY3Mua28gYW5kIHdsYWdzNDlfaDI1X2NzLmtvCisjCisjIERlZmF1bHQgYnVpbGQgZm9yIEhlcm1lcy1JSSBiYXNlIGNhcmRzIChwb3NzaWJseSBpZGVudGlmaWVkIHdpdGgKKyMgIm1hbmZpZDogMHgwMTU2LCAweDAwMDMiIGluICJwY2NhcmRjdGwgaWRlbnQiIG91dHB1dCksIGNvbW1lbnQKKyMgLURIRVJNRVMyNSBiZWxvdworIworIyBJZiB5b3Ugd2FudCB0byBidWlsZCBmb3IgSGVybWVzLUlJLjUgYmFzZSBjYXJkcyAocG9zc2libHkgaWRlbnRpZmllZCB3aXRoCisjICJtYW5maWQ6IDB4MDE1NiwgMHgwMDA0IiBpbiAicGNjYXJkY3RsIGlkZW50IiBvdXRwdXQpLCB1bmNvbW1lbnQKKyMgLURIRVJNRVMyNSBiZWxvdworIworIyAgSWYgeW91IHdhbnQgdG8gYnVpbGQgQVAgc3VwcG9ydCAodW50ZXN0ZWQpLCBjb21tZW50IG91dCAtRFNUQV9PTkxZCisKK0lOU1RBTExESVIgOj0gL2xpYi9tb2R1bGVzLyQoc2hlbGwgdW5hbWUgLXIpL2tlcm5lbC9kcml2ZXJzL25ldC93aXJlbGVzcworRVhUUkFfQ0ZMQUdTICs9IC1JJChLRVJORUxESVIpL2luY2x1ZGUKK0VYVFJBX0NGTEFHUyArPSAtSSQoc3JjKSBcCisJCS1EQlVTX1BDTUNJQSBcCisJCS1EVVNFX1dQQSBcCisJCS1EVVNFX1dFWFQgXAorCQktRFNUQV9PTkxZIFwKKwkJLURXVkxBTl80OSBcCisjCQktREhFUk1FUzI1IFwKKyMJCS1EREJHIFwKKyMJCS1EREJHX0xWTD01IFwKKyMJCS1EVVNFX1VJTCBcCisjCQktRFVTRV9QUk9GSUxFIFwKKworaWZlcSAoJChmaW5kc3RyaW5nIEhFUk1FUzI1LCQoRVhUUkFfQ0ZMQUdTKSksKQorV0xOQU1FIDo9IHdsYWdzNDlfaDJfY3MKKyQoV0xOQU1FKS15IDo9IHN0YV9oMi5vCitpZmVxICgkKGZpbmRzdHJpbmcgU1RBX09OTFksJChFWFRSQV9DRkxBR1MpKSwpCiskKFdMTkFNRSkteSArPSBhcF9oMi5vCitlbmRpZgorZWxzZQorV0xOQU1FPXdsYWdzNDlfaDI1X2NzCiskKFdMTkFNRSkteSA6PSBzdGFfaDI1Lm8KK2lmZXEgKCQoZmluZHN0cmluZyBTVEFfT05MWSwkKEVYVFJBX0NGTEFHUykpLCkKKyQoV0xOQU1FKS15ICs9IGFwX2gyNS5vCitlbmRpZgorZW5kaWYKKworIyBJZiBLRVJORUxSRUxFQVNFIGlzIGRlZmluZWQsIHdlJ3ZlIGJlZW4gaW52b2tlZCBmcm9tIHRoZQorIyBrZXJuZWwgYnVpbGQgc3lzdGVtIGFuZCBjYW4gdXNlIGl0cyBsYW5ndWFnZS4KK2lmbmVxICgkKEtFUk5FTFJFTEVBU0UpLCkKKworb2JqLW0JCSs9ICQoV0xOQU1FKS5vCisKKyQoV0xOQU1FKS15ICs9CXdsX3Byb2ZpbGUubyBcCisJCXdsX3dleHQubyBcCisJCXdsX3ByaXYubyBcCisJCXdsX21haW4ubyBcCisJCXdsX2VuYy5vIFwKKwkJd2xfdXRpbC5vIFwKKwkJd2xfbmV0ZGV2Lm8gXAorCQl3bF9jcy5vIFwKKwkJbW1kLm8gXAorCQloY2YubyBcCisJCWRoZi5vCisKKyQoV0xOQU1FKS0kKENPTkZJR19TWVNGUykJKz0gd2xfc3lzZnMubworCisjIE90aGVyd2lzZSB3ZSB3ZXJlIGNhbGxlZCBkaXJlY3RseSBmcm9tIHRoZSBjb21tYW5kCisjIGxpbmU7IGludm9rZSB0aGUga2VybmVsIGJ1aWxkIHN5c3RlbS4KK2Vsc2UKKwlLRVJORUxESVIgPz0gL2xpYi9tb2R1bGVzLyQoc2hlbGwgdW5hbWUgLXIpL2J1aWxkCisJUFdEIDo9ICQoc2hlbGwgcHdkKQorCitkZWZhdWx0OgorCSQoTUFLRSkgLUMgJChLRVJORUxESVIpIE09JChQV0QpIG1vZHVsZXMKK2VuZGlmCisKK2NsZWFuOgorCXJtIC1mciAqLm8gKi5rbyAqLm1vZC5jICoubW9kLm8gLiouKi5jbWQgTW9kdWxlLnN5bXZlcnMgXAorCQlNb2R1bGUubWFya2VycyBtb2R1bGVzLm9yZGVyIC50bXBfdmVyc2lvbnMKKworaW5zdGFsbDogZGVmYXVsdAorCS1ybW1vZCAkKFdMTkFNRSkKKwlpbnN0YWxsIC1kICQoSU5TVEFMTERJUikKKwlpbnN0YWxsIC1tIDA2NDQgLW8gcm9vdCAtZyByb290ICQoV0xOQU1FKS5rbyAkKElOU1RBTExESVIpCisJL3NiaW4vZGVwbW9kIC1hcQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9SRUFETUUudWJ1bnR1IGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvUkVBRE1FLnVidW50dQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2JlYWVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvUkVBRE1FLnVidW50dQpAQCAtMCwwICsxLDE4MCBAQAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1dMQU4gZHJpdmVyIGZvciBjYXJkcyB1c2luZyB0aGUgSEVSTUVTIElJIGFuZCBIRVJNRVMgSUkuNSBjaGlwc2V0CisKK0hFUk1FUyBJSSBDYXJkCisKK1BDTUNJQSBJbmZvOiAiQWdlcmUgU3lzdGVtcyIgIldpcmVsZXNzIFBDIENhcmQgTW9kZWwgMDExMCIKKyAgICAgICAgICAgICBNYW51ZmFjdHVyZSBJRDogMDE1NiwwMDAzCisKK0hFUk1FUyBJSS41IENhcmQKKworUENNQ0lBIEluZm86ICJMaW5rc3lzIiAiV0NGNTRHX1dpcmVsZXNzLUdfQ29tcGFjdEZsYXNoX0NhcmQiCisgICAgICAgICAgICAgTWFudWZhY3R1cmUgSUQ6IDAxNTYsMDAwNAorCitCYXNlZCBvbiBBZ2VyZSBTeXN0ZW1zIExpbnV4IExLTSBXaXJlbGVzcyBEcml2ZXIgU291cmNlIENvZGUsCitWZXJzaW9uIDcuMjI7IGNvbXBsaWVzIHdpdGggT3BlbiBTb3VyY2UgQlNEIExpY2Vuc2UuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitERVNDUklQVElPTgorCitUaGUgc29mdHdhcmUgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHdsX2xrbV83MjJfYWJnLnRhci5neiBmcm9tIHRoZQorQWdlcmUgU3lzdGVtcyB3ZWJzaXRlLCBhZGRhcHRlZCBmb3IgVWJ1bnR1IDkuMDQuCisKK01vZGlmaWVkIGZvciBrZXJuZWwgMi42IGJ5IEhlbmsgZGUgR3Jvb3QgPHBlMWRubkBhbXNhdC5vcmc+CitCYXNlZCBvbiA3LjE4IHZlcnNpb24gYnkgQW5kcmV5IEJvcnplbmtvdiA8YXJ2aWRqYWFyQG1haWwucnU+ICRSZXZpc2lvbjogMzkgJAorCitJTlNUQUxMQVRJT04KKworVW5wYWNrIGluIGEgbmV3IGRpcmVjdG9yeS4KKworT3BlbiBhIHRlcm1pbmFsIHNjcmVlbi4KKworQ2hhbmdlIGRpcmVjdG9yeSB0byB0aGUgc291cmNlIGRpcmVjdG9yeQorCitUeXBlIGNvbW1hbmQKKworbWFrZQorCithbmQgd2FpdCB1bnRpbCBpdCBpcyBmaW5zaGVkLiBOb3cgeW91IGhhdmUgYnVpbGQgdGhlIG1vZHVsZQord2xhZ3M0OV9oMl9jczsgdGhpcyBtb2R1bGUgaXMgbWVhbnQgZm9yIGEgSEVSTUVTIElJIGNhcmQuCisKK1RoZSBkcml2ZXIgaXMgdGVzdGVkIHdpdGggYSBUaG9tc29uIFNwZWVkVG91Y2ggMTEwIFdpcmVsZXNzIFBDIENhcmQuCitGb3IgdGhlIHRlc3QgU3RhdGlvbiBtb2RlIHdhcyB1c2VkIHdpdGggV0VQLiBUaGUgZHJpdmVyIGlzIHN1cHBvc2VkCit0byBzdXBwb3J0IFdBUCBhbmQgYXMgYWNjZXNzcG9pbnQgdGhhdCBpcyBOT1QgdGVzdGVkLgorCitJZiB5b3UgaGF2ZSBhIGNhcmQgdXNpbmcgdGhlIEhFUk1FUyBJSS41IGNoaXAgeW91IGhhdmUgdG8gbWFrZQorY2hhbmdlcyB0byB0aGUgTWFrZWZpbGUgYW5kIHVuY29tbWVudCAtREhFUk1FUzI1LiBUaGlzIHdpbGwgYnVpbGQKK2RyaXZlciB3bGFnczQ5X2gyNV9jcy4KKworTm90ZTogWW91IGNhbiBkZXRlbWluZSB0aGUgdHlwZSB3aXRoIGNvbW1hbmQgInBjY2FyZGN0cmwgaW5mbyIKKyAgICAgICAgTUFOSUZJRDogMDE1NiwwMDAyID0gSEVSTUVTIC0gbm90IHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlcgorICAgICAgICBNQU5JRklEOiAwMTU2LDAwMDMgPSBIRVJNRVMgSUkgICAoV2lyZWxlc3MgQikKKyAgICAgICAgTUFOSUZJRDogMDE1NiwwMDA0ID0gSEVSTUVTIElJLjUgKFdpcmVsZXNzIEIvRykKKworQWZ0ZXIgc3VjY2VzZnVsbCBjb21waWxlIHR5cGUgY29tbWFuZAorCitzdWRvIG1ha2UgaW5zdGFsbAorCit0byBpbnN0YWxsIHRoZSBtb2R1bGUuCisKK05vdyB0aGUgY2FyZCBzaG91bGQgYmUgcmVjb2duaXplZC4gSXQgc2hvdWxkIGJlIGFibGUgdG8gY29uZmlndXJlCithbmQgdXNlIHRoZSBjYXJkIHdpdGggTmV0d29ya01hbmFnZXIuIFdwYV9zdXBwbGljYW50IGFsc28gd29ya3MsIGFzIGRvZXMKK21hbnVhbCBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSBpd2NvbmZpZy9pd2xpc3QgcHJvZ3JhbXMuCisKK05vdGU6IEkgb25seSB0ZXN0ZWQgU3RhdGlvbiBtb2RlIHdpdGggV0VQIGJ1dCBpZiBJIGRpZG4ndCBicmVhayBhbnl0aGluZworV1BBIGFuZCBBUCBtb2RlIHNob3VsZCBhbHNvIHdvcms7IG5vdGUgaG93ZXZlciB0aGF0IFdQQSB3YXMgZXhwZXJpbWVudGFsCitpbiB0aGUgb3JpZ2luYWwgQWdlcmUgZHJpdmVyIQorCitOb3RlOiB0byBjb21waWxlIGFzIEFQIGNoYW5nZSB0aGUgbWFrZWZpbGUgYW5kIHJlbW92ZSB0aGUgbGluZQorLURTVEFfT05MWSBcCisKKyhvciBjb21tZW50IGl0LCBidXQgaW4gdGhhdCBjYXNlIG1ha2Ugc3VyZSB0byBtb3ZlIGl0IGFmdGVyIGFsbCB0aGUKKyBmbGFncyB5b3Ugd2FudCB0byB1c2UpCisKK0NIQU5HRVMKKworVGhlIEhDRiBmdW5jdGlvbnMgdG8gY29udHJvbCB0aGUgY2FyZCBhcmUgdmlydHVhbGx5IHVuY2hhbmdlZCwgdGhlIG9ubHkKK2NoYW5nZXMgYXJlIG1lYW50IHRvIGZpeCBjb21waWxlciB3YXJuaW5ncy4gVGhlIG9ubHkgcmVhbCBjaGFuZ2UgaXMgaW4KK0hDRl9XQUlUX1dISUxFIHdoaWNoIG5vdyBoYXMgYSB1ZGVsYXkoMikgYWRkZWQgdG8gZ2l2ZSBhIHNtYWxsIGRlbGF5LgorCitUaGUgbGludXggZHJpdmVyIGZpbGVzICh3bF94eHh4LmMpIGFyZSBjaGFuZ2VkIGluIHRoZSBmb2xsb3dpbmcgd2F5czoKKy0gQWRkYXB0YXRpb25zIG9mIEFuZHJleSBCb3J6ZW5rb3YgYXBwbGllZCB0byA3LjIyIHNvdXJjZQorLSBBbHRlcmF0aW9ucyB0byBhdm9pZCBtb3N0IEhDRl9BU1NFUlRzCistLSBTd2l0Y2hpbmcgaW50ZXJydXB0cyBvZmYgYW5kIG9uIGluIHRoZSBIQ0YKKy0tIEJ1Z2ZpeGVzLCB0aGluZ3MgdGhhdCB3ZXJlIGFwYXJlbnRseSB3cm9uZyBsaWtlIHJlcG9ydGluZyBsaW5rIHN0YXR1cworICAgY2hhbmdlIHdoaWNoIGNoZWNrZWQgYSB2YXJpYWJsZSB0aGF0IHdhcyBub3QgY2hhbmdlZCBpbiBIQ0YgYW55bW9yZS4KKy0tIFVzZWQgb24gV0VQIGJ1dCBzZXR0aW5nIGtleXMgdmlhIFNJT0NTSVdFTkNPREVFWFQgd2FzIG5vdCBzdXBwb3J0ZWQKKy0tIFJlY292ZXJ5IGFjdGlvbnMgYWRkZWQKKworVGhlIG1ham9yIHByb2JsZW0gd2FzIHRoZSBvcmRlciBpbiB3aGljaCBjYWxscyBjYW4gYmUgbWFkZS4gVGhlIG9yaWdpbmFsCitsb29rcyBsaWtlIGEgdHJhZGl0b25hbCBVTklYIGRyaXZlci4gVG8gY2FsbCBhbiAiaW9jdGwiIGZ1bmN0aW9uIHlvdQoraGF2ZSB0byAib3BlbiIgdGhlIGRldmljZSBmaXJzdCB0byBnZXQgYSBoYW5kbGUgYW5kIGFmdGVyICJjbG9zZSIgbm8KKyJpb2N0bCIgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBhbnltb3JlLiBXaXRoIHRoZSAyLjYgZHJpdmVyIHRoaXMgYWxsCitjaGFuZ2VkOyB0aGUgZm9ybWVyIGlvY3RsIGZ1bmN0aW9ucyBhcmUgbm93IGNhbGxlZCBiZWZvcmUgIm9wZW4iIGFuZAorYWZ0ZXIgImNsb3NlIiwgd2hpY2ggd2FzIG5vdCBleHBlY3RlZC4gT25lIG9mIHRoZSBwcm9ibGVtcyB3YXMgZW5hYmxlLworZGlzYWJsZSBvZiBpbnRlcnJ1cHRzIGluIHRoZSBIQ0YuIEludGVycnVwdCBoYW5kbGluZyBzdGFydHMgYXQgIm9wZW4iCitzbyBpZiBhIGZvcm1lciAiaW9jdGwiIHJvdXRpbmdlIGlzIGNhbGxlZCBiZWZvcmUgIm9wZW4iIG9yIGFmdGVyICJjbG9zZSIKK3RoZW4gbm90aGluZyBzaG91bGQgYmUgZG9uZSB3aXRoIGludGVycnVwdCBzd2l0Y2hpbmcgaW4gdGhlIEhDRi4gT25jZQordGhpcyB3YXMgc29sdmVkIG1vc3QgSENGX0FTU0VSVFMgd2VudCBhd2F5LgorCitUaGUgbGFzdCBwb2ludCwgcmVjb3ZlcnkgYWN0aW9ucyBhZGRlZCwgbmVlZHMgc29tZSBjbGFyaWZpY2F0aW9uLgorU3RhcnRpbmcgdGhlIGNhcmQgd29ya3MgbW9zdCBvZiB0aGUgdGltZSwgYnV0IHVuZm9ydHVuYXRlbHkgbm90IGFsd2F5cy4KK0F0IGEgZmV3IHRpbWVzIHJlY292ZXJ5IGNvZGUgd2FzIGFkZGVkOyB3aGVuIHRoZSBjYXJkIHN0YXJ0cyB0bworbWlzYmVoYXZlIG9yIHRoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIEhDRiBhbmQgdGhlIGNhcmQgaXMKK291dCBvZiBzeW5jIGFuZCB0aGUgSENGIGVudGVycyBERUZVTkNUIG1vZGUgZXZlcnl0aGluZyBpcyByZXNldCBhbmQKK3JlaW5pdGlhbGl6ZWQuIE5vdGUsIGhjZi5jIGNvbnRhaW5zIGEgbG90IG9mIGRvY3VtZW50YXRpb24uIEl0IHRha2VzCitzb21lIHRpbWUgYnV0IHNsb3dseSBzb21lIHRoaW5ncyBiZWNvbWUgY2xlYXIuIEFsc28gc29tZSB1bnJlc29sdmVkCitpc3N1ZXMgYXJlIG1lbnRpb25lZCBpbiBoY2YuYywgc28gdGhlcmUgYXJlIHN0aWxsIHVua25vd24gYnVncy4KKworVGhlIGNhcmQgcHJvYmxlbXMgYXJlIGFsbW9zdCBpbiBhbGwgY2FzZXMgd2hlbiBzdGFydGluZyB1cCBhbmQgYmVmb3JlCit0aGUgZmlyc3QgYXNzb2NpYXRpb24gd2l0aCBhbiBBUCwgb25jZSB0aGUgY2FyZCBpcyBpbiBvcGVyYXRpb24gaXQKK3NlZW1zIHRvIHN0YXkgdGhhdCB3YXk7IHdoZW4gZGVidWdnaW5nIG5vIEhDRl9BU1NFUlRTIGFwcGVhciBhbnltb3JlLgorTm90ZTogc29tZSBIQ0ZfQVNTRVJUUyBzdGlsbCBhcHBlYXIsIGluIGEgbnVtYmVyIG9mIGNhc2VzIGl0IGlzIGEgcmVhbAorZXJyb3IsIGZvciBleGFtcGxlIGF0IGNhcmQgcmVtb3ZhbCB0aGUgbWlzc2luZyBjYXJkIGlzIGRldGVjdGVkLgorCitMSUNFTlNFCisKK1RoZSBBZ2VyZSBTeXN0ZW1zIGxpY2Vuc2UgYXBwbGllcy4gVGhpcyBpcyB3aHkgSSBpbmNsdWRlIHRoZSBvcmlnaW5hbAorUkVBRE1FLndsYWdzNDkuIFRoZSBpbnN0cnVjdGlvbnMgaW4gdGhhdCBmaWxlIGFyZSBib2d1cyBub3cuIEkgYWxzbworaW5jbHVkZSB0aGUgbWFuIHBhZ2UuIEV2ZW50aG91Z2ggc2V0dGluZyBwYXJhbWV0ZXJzIG9uIHRoZSBtb2R1bGUKK2RvZXMgbm90IHdvcmsgYW55bW9yZSBidXQgaXQgcHJvdmlkZXMgc29tZSBpbmZvcm1hdGlvbiBhYm91dCBhbGwgdGhlCitzZXR0aW5ncy4KKworSSBoYXZlIG5vdCBoYXZlIHBlcnNvbmFsIGNvbnRhY3Qgd2l0aCBBZ2VyZSwgYnV0IG90aGVycyBoYXZlLiBBZ2VyZQorYWdyZWVkIHRvIG1ha2UgdGhlaXIgc29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSBCU0QgbGljZW5jZS4KK1RoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIHRoZSA3LjIyIHZlcnNpb24uCisKK1RoZSBmb2xsb3dpbmcgd2FzIG1haWxlZCBieSBBZ2VyZSB0byBBbmRyZXkgQm9yemVua292IGFib3V0IHRoaXM6CisKKyAgICAtLS0gQmVnaW4gTWVzc2FnZSAtLS0KKworICAgICAgICAqIEZyb206IFRKIDx0akB4eHh4eHh4eHh4eD4KKyAgICAgICAgKiBEYXRlOiBNb24sIDA1IEZlYiAyMDA3IDE5OjI4OjU5ICswMDAwCisKKyAgICBIaSBBbmRyZXksCisKKyAgICBJJ3ZlIGdvdCBzb21lIGdvb2QgbmV3cyBmb3IgeW91L3VzL3RoZSB3b3JsZCBvZiBIZXJtZXMgOikKKworICAgIEkgZ290IGEgcmVwbHkgZnJvbSB0aGUgbGVnYWwgcmVwcmVzZW50YXRpdmUgYXQgQWdlcmUgY29uZmlybWluZyB0aGF0CisgICAgdGhlaXIgc291cmNlLWNvZGUgaXMgQlNEIGxpY2Vuc2VkLCBhbmQgSSd2ZSBpbmNsdWRlZCB0aGUgY29udGVudHMgb2YgdGhlCisgICAgZW1haWwgaGVyZS4KKworICAgIEkgaG9wZSB0aGlzIHJlLWFzc3VyZXMgeW91IHNvIHRoYXQgeW91ciBleGNlbGxlbnQgd29yayBvbiB0aGUgZHJpdmVycworICAgIGNhbiBiZSBtYWRlIHdpZGVseSBhdmFpbGFibGUgZm9yIG90aGVyIGhhY2tlcnMgdG8gd29yayB3aXRoLgorCisgICAgUmVnYXJkcywKKworICAgIFRKLgorCisgICAgLS0tLS0tLS0tCisgICAgT24gTW9uLCAyMDA3LTAyLTA1IGF0IDEzOjU0IC0wNTAwLCBQYXRoYXJlLCBWaXJlbiBNIChWaXJlbikgd3JvdGU6CisKKworICAgICJJIHdvdWxkIGxpa2UgdG8gY29uZmlybSB0aGF0IHRoZSB0d28gZHJpdmVyczsgTGludXggTEtNIFdpcmVsZXNzIERyaXZlcgorICAgIFNvdXJjZSBDb2RlLCBWZXJzaW9uIDcuMTggYW5kIExpbnV4IExLTSBXaXJlbGVzcyBEcml2ZXIgU291cmNlIENvZGUsCisgICAgVmVyc2lvbiA3LjIyIGNvbXBseSB3aXRoIE9wZW4gU291cmNlIEJTRCBMaWNlbnNlLiBUaGVyZWZvcmUgdGhlIHNvdXJjZQorICAgIGNvZGUgY2FuIGJlIGRpc3RyaWJ1dGVkIGluIHVubW9kaWZpZWQgb3IgbW9kaWZpZWQgZm9ybSBjb25zaXN0ZW50IHdpdGgKKyAgICB0aGUgdGVybXMgb2YgdGhlIGxpY2Vuc2UuCisKKyAgICBUaGUgTGludXggZHJpdmVyIGFyY2hpdGVjdHVyZSB3YXMgYmFzZWQgb24gdHdvIG1vZHVsZXMsIHRoZSBNU0YgKE1vZHVsZQorICAgIHNwZWNpZmljIGZ1bmN0aW9ucykgYW5kIHRoZSBIQ0YgKEhhcmR3YXJlIENvbnRyb2wgRnVuY3Rpb25zKS4gSW5jbHVkZWQKKyAgICBpbiB0aGUgSENGIGlzIHJ1bi10aW1lIGZpcm13YXJlIChiaW5hcnkgZm9ybWF0KSB3aGljaCBpcyBkb3dubG9hZGVkIGludG8KKyAgICB0aGUgUkFNIG9mIHRoZSBIZXJtZXMgMS8yLzIuNSBXTUFDLgorCisgICAgVGhpcyBoZXggY29kZWQgZmlybXdhcmUgaXMgbm90IGJhc2VkIG9uIGFueSBvcGVuIHNvdXJjZSBzb2Z0d2FyZSBhbmQKKyAgICBoZW5jZSBpdCBpcyBub3Qgc3ViamVjdCB0byBhbnkgT3BlbiBTb3VyY2UgTGljZW5zZS4gVGhlIGZpcm13YXJlIHdhcworICAgIGRldmVsb3BlZCBieSBBZ2VyZSBhbmQgcnVucyBvbiB0aGUgRElTQyBwcm9jZXNzb3IgZW1iZWRkZWQgd2l0aGluIHRoZQorICAgIEhlcm1lcyAxLzIvMi41IFdpcmVsZXNzIE1BQyBkZXZpY2VzLgorCisgICAgSG9wZSB0aGlzIGhlbHBzLgorCisgICAgU2luY2VyZWx5LAorCisgICAgVmlyZW4gUGF0aGFyZQorICAgIEludGVsbGVjdHVhbCBQcm9wZXJ0eSBMaWNlbnNpbmcgTWFuYWdlcgorICAgIEFnZXJlIgorCisKKworICAgIC0tLSBFbmQgTWVzc2FnZSAtLS0KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvUkVBRE1FLndsYWdzNDkgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9SRUFETUUud2xhZ3M0OQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTg2ZmQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvUkVBRE1FLndsYWdzNDkKQEAgLTAsMCArMSw2NDEgQEAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQWdlcmUgU3lzdGVtcyBJbmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnVseSAyMDA0CitSZWFkbWUgZm9yIExpbnV4IERyaXZlciBTb3VyY2UgZm9yIFdhdmVsYW4gICAgICAgICAgICAgICAgICAgVmVyc2lvbjogNy4yMi1hYmcKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIHRleHQgZmlsZSBpbmNsdWRlcyB1cGRhdGUgaW5mb3JtYXRpb24sIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMsCitsaW1pdGF0aW9ucyB0byB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBwcm9kdWN0LCBhbmQgc3VnZ2VzdGlvbnMgdG8gc29sdmUKK2tub3duIGlzc3VlcyBvciBwcm9ibGVtcy4KKworCitUQUJMRSBPRiBDT05URU5UUy4KKworMS4gIERFU0NSSVBUSU9OCisyLiAgU1lTVEVNIFJFUVVJUkVNRU5UUworMy4gIE5FVyBJTiBUSElTIFJFTEVBU0UKKzQuICBJTlNUQUxMQVRJT04gTk9URVMKKzUuICBURUNITklDQUwgQ09OU1RSQUlOVFMKKzYuICBLTk9XTiBJU1NVRVMKKzcuICBURUNITklDQUwgU1VQUE9SVAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzEuICBERVNDUklQVElPTgorCisgICAgV2l0aCB0aGlzIHBhY2thZ2UsIHlvdSBjYW4gYnVpbGQgYW5kIGluc3RhbGwgYSBXaXJlbGVzcyBkcml2ZXIgZm9yIGEKKyAgICBzcGVjaWZpYyBMaW51eCBrZXJuZWwuCisKKyAgICBUaGUgZHJpdmVyIGluIHRoaXMgcGFja2FnZSBzdXBwb3J0cyB0aGUgbmV0d29yayBpbnRlcmZhY2UgY2FyZHMgYmFzZWQgb246CisgICAgIC0gV0w2MDAxMCwgYS5rLmEuIEhlcm1lcy1JSQorICAgICAtIFdMNjAwNDAsIGEuay5hLiBIZXJtZXMtSUkuNQorCisgICAgQWx0aG91Z2ggZGVyaXZlZCBmcm9tIHRoZSBIZXJtZXMtSS9JSSBMaW51eCBkcml2ZXIsIHRoaXMgcmVsZWFzZSBPTkxZCisgICAgU3VwcG9ydHMgSGVybWVzLUlJL0lJLjUgY2hpcHNldHMuICBIZXJtZXMtSSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLgorCisgICAgVGhlIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIGEgY29tcHJlc3NlZCBzb3VyY2UgZmlsZSBhcmNoaXZlOgorICAgICAtIHdsX2xrbV83XzIyX2FiZy50YXIuZ3oKKworICAgIEJlY2F1c2UgdGhpcyByZWxlYXNlIHN1cHBvcnRzIG1vcmUgdGhhbiBvbmUgSGVybWVzIENQVSBhbmQgYnVzCisgICAgYXJjaGl0ZWN0dXJlLCBhIG5hbWluZyBjb252ZW50aW9uIGlzIHVzZWQgZm9yIHRoZSByZXN1bHRpbmcgYmluYXJpZXMgdGhhdAorICAgIGNhbiBiZSBidWlsdCBmcm9tIHRoaXMgc291cmNlIGNvZGUuIERyaXZlciBiaW5hcmllcyBhcmUgbmFtZWQgYXMgZm9sbG93czoKKworICAgIHdsYWdzNDlfPGhlcm1lc190eXBlPl88YnVzX2FyY2g+Lm8KKworICAgIHdoZXJlICd3bGFnczQ5JyBkZW5vdGVzIGFuIEFnZXJlIFdhdmVMYW4gTGludXggYnVpbGQsCisKKyAgICA8aGVybWVzX3R5cGU+IGlzOiAnaDInIGZvciBIZXJtZXMtSUksICdoMjUnIGZvciBIZXJtZXMtSUkuNQorCisgICAgPGJ1c19hcmNoPiBpczogJ2NzJyBmb3IgQ2FyZCBTZXJ2aWNlcyAoUENNQ0lBLCBDb21wYWN0IEZsYXNoKSwgUENJIGZvcgorICAgIFBDSSBvciBNaW5pUENJLgorCisgICAgRm9yIGV4YW1wbGUsIGEgZHJpdmVyIGJ1aWx0IGZvciBIZXJtZXMtSUkgQ2FyZCBTZXJ2aWNlcyAoUENNQ0lBL0NvbXBhY3QKKyAgICBGbGFzaCkgaXMgbmFtZWQgd2xhZ3M0OV9oMl9jcy5vLCB3aGVyZWFzIGEgZHJpdmVyIGJ1aWx0IGZvciBIZXJtZXMtSUkKKyAgICBNaW5pUENJIGlzIG5hbWVkIHdsYWdzNDlfaDJfcGNpLm8uCisgICAgVGhlIGZvbGxvd2luZyBzb2Z0d2FyZSBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uOgorCisgICAgR2VuZXJhbCBpbmZvcm1hdGlvbjoKKyAgICAqIFJFQURNRS53bGFnczQ5ICAgICAgICAgICAgICBUaGlzIGZpbGUKKyAgICAqIExJQ0VOU0Uud2xhZ3M0OSAgICAgICAgICAgICBMaWNlbnNlCisgICAgKiB3bGFnczQ5Lm1rICAgICAgICAgICAgICAgICAgVG9wIGxldmVsIE1ha2VmaWxlCisgICAgKiBCdWlsZCAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0IHRvIGJ1aWxkIGRyaXZlcgorICAgICogSW5zdGFsbCAgICAgICAgICAgICAgICAgICAgIFNjcmlwdCB0byBpbnN0YWxsIGRyaXZlcgorCisgICAgRHJpdmVyIHNvdXJjZToKKyAgICAqIHdpcmVsZXNzLyAgICAgICAgICAgICAgICAgICBNU0Ygc291cmNlCisgICAgKiBoY2YvICAgICAgICAgICAgICAgICAgICAgICAgSENGIGFuZCBGL1cgc291cmNlCisgICAgKiB3aXJlbGVzcy93bGFnczQ5X2NzLm1rICAgICAgRHJpdmVyIE1ha2VmaWxlLCBQQyBDYXJkCisgICAgKiB3aXJlbGVzcy93bGFnczQ5X3BjaS5tayAgICAgRHJpdmVyIE1ha2VmaWxlLCBQQ0kKKyAgICAqIGluY2x1ZGUvaGNmL2RlYnVnLmggICAgICAgICBEcml2ZXIgZGVidWcgc3VwcG9ydAorICAgICogaW5jbHVkZS9oY2YvaGNmY2ZnLmggICAgICAgIEhlYWRlciB0byBjb25maWd1cmUgSENGCisgICAgKiBpbmNsdWRlL3dpcmVsZXNzLyouaCAgICAgICAgRHJpdmVyIHNvdXJjZSBoZWFkZXJzCisKKyAgICBEcml2ZXIgb25saW5lIG1hbnVhbCBwYWdlOgorICAgICogbWFuL3dsYWdzNDkuNCAgICAgICAgICAgICAgIERyaXZlciBtYW51YWwgcGFnZQorCisgICAgUENNQ0lBIGNvbmZpZ3VyYXRpb24gdXBkYXRlOgorICAgICogZXRjL3dsYWdzNDkuY29uZiAgICAgICAgICAgIEFkZC1vbiBjb25maWcgZmlsZQorICAgICogZXRjL3dsYWdzNDkubWsgICAgICAgICAgICAgIGNvbmZpZyB1cGRhdGUgTWFrZWZpbGUKKyAgICAqIGV0Yy93bGFnczQ5LnBhdGNoICAgICAgICAgICBjb25maWcgdXBkYXRlIHBhdGNoIGZpbGUKKworICAgIFRoZSBkcml2ZXIgaXMgYnVpbGQgdXAgb2YgMiBtb2R1bGVzOgorICAgICAtIGEgaGlnaGVyIG1vZHVsZSBjYWxsZWQgTW9kdWxlIFNwZWNpZmljIEZ1bmN0aW9ucyAoTVNGKSwgd2hpY2ggY29udGFpbnMKKyAgICAgICB0aGUgZnVuY3Rpb25zIG9mIHRoZSBkcml2ZXIgdGhhdCBhcmUgbmV0d29yayBkcml2ZXIgaW50ZXJmYWNlIGFuZAorICAgICAgIE9wZXJhdGluZyBTeXN0ZW0gc3BlY2lmaWMuCisgICAgIC0gYSBsb3dlciBtb2R1bGUgY2FsbGVkIEhhcmR3YXJlIENvbnRyb2wgRnVuY3Rpb25zIChIQ0YpLCB3aGljaCBjb250YWlucworICAgICAgIHRoZSBmdW5jdGlvbnMgdG8gaW50ZXJmYWNlIHRvIHRoZSBOZXR3b3JrIEludGVyZmFjZSBDYXJkIChOSUMpLiAgVGhlIEhDRgorICAgICAgIHByb3ZpZGVzIGZvciBhbGwgV2F2ZUxBTiBOSUMgdHlwZXMgb25lIHN0YW5kYXJkIGludGVyZmFjZSB0byB0aGUgTVNGLgorICAgICAgIFRoaXMgSS9GIGlzIGNhbGxlZCB0aGUgV2lyZWxlc3MgQ29ubmVjdGlvbiBJbnRlcmZhY2UgKFdDSSkgYW5kIGlzIHRoZQorICAgICAgIHN1YmplY3Qgb2YgYSBzZXBlcmF0ZSBkb2N1bWVudCAoMDI1NzI2KS4KKworICAgIFRoZSBIQ0YgZGlyZWN0b3J5IGNvbnRhaW5zIGZpcm13YXJlIGltYWdlcyB0byBhbGxvdyB0aGUgY2FyZCB0byBvcGVyYXRlIGluCisgICAgZWl0aGVyIHN0YXRpb24gKFNUQSkgb3IgQWNjZXNzIFBvaW50IChBUCkgbW9kZS4gSW4gdGhlIGJ1aWxkIHByb2Nlc3MsIHRoZQorICAgIGZpbGVzIGZ3X2gyLmMgYW5kIGZ3X2gyNS5jIGFyZSB1c2VkIGZvciBIZXJtZXMtSUkgYW5kIEhlcm1lcy1JSS41CisgICAgcmVzcGVjdGl2ZWx5LiBUaGUgZmlybXdhcmUgaW1hZ2VzIGluIHRoaXMgcmVsZWFzZSBhcmUgaWRlbnRpZmllZCBhczoKKwkgLSBISUkgU3RhdGlvbiBGL1c6ICAgICAgZndfaDIuYy5zdGEKKwkgLSBISUkuNSBTdGF0aW9uIEYvVzogICAgZndfaDI1LmMuc3RhCisJIC0gSElJIEFjY2VzUG9pbnQgRi9XOiAgIGZ3X2gyLmMuYXAKKwkgLSBISUkuNSBBY2Nlc1BvaW50IEYvVzogZndfaDI1LmMuYXAKKwlUbyBidWlsZCBhIFNUQSBvciBBUCBtb2RlIGRyaXZlciwgdGhlIHN1ZmZpeCAuc3RhIG9yIC5hcCBtdXN0IGJlIHJlbW92ZWQuCisJVGhlIGZpbGVzIGFzIGRpc3RyaWJ1dGVkIGJ5IHRoaXMgcmVsZWFzZSBidWlsZCBTVEEgZHJpdmVycyBieSBkZWZhdWx0LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzIuICBTWVNURU0gUkVRVUlSRU1FTlRTCisKKzIuMSBPcGVyYXRpbmcgU3lzdGVtCisKKyAgICBUaGlzIHNvZnR3YXJlIGNhbiBiZSBjb21waWxlZCBhbmQgaW5zdGFsbGVkIHdpdGggTGludXgga2VybmVsIHZlcnNpb25zCisgICAgMi40LnguIEFsdGhvdWdoIHRoaXMgZHJpdmVyIHNob3VsZCBjb21waWxlIGZvciBvdGhlciBDUFVzIGFzIHdlbGwsIGFzIG9mCisgICAgdGhlIGRhdGUgb2YgdGhpcyByZWxlYXNlLCBubyBDUFUgYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHg4NiBoYXZlIGJlZW4KKyAgICB2ZXJpZmllZC4KKworICAgIHdsX2xrbV83XzIyX2FiZyBpcyB0ZXN0ZWQgd2l0aCB0aGUgZm9sbG93aW5nIExpbnV4IERpc3RyaWJ1dGlvbnM6CisgICAgKiBSZWQgSGF0IHZlcnNpb24gOS4wCisgICAgKiBTdXNlICAgIHZlcnNpb24gOS4wCisKKyAgICBJZiB5b3UncmUgYnVpbGRpbmcgZm9yIFBDIENhcmQgb3IgQ29tcGFjdCBGbGFzaCwgeW91IG5lZWQgdGhlIENhcmQgU2VydmljZXMKKyAgICBmcm9tIERhdmlkIEhpbmRzLgorCisgICAgd2xfbGttXzdfMjJfYWJnIGlzIHRlc3RlZCB3aXRoOgorICAgICogcGNtY2lhLWNzLTMuMi43LnRhci5negorCisyLjIgRnJlZSBEaXNrIFNwYWNlCisKKyAgICBUbyBjb21waWxlIHRoZSBzb2Z0d2FyZSB5b3UgbmVlZCB0byBoYXZlIHRoZSBmdWxsIHNldCBvZiBMaW51eCBrZXJuZWwKKyAgICBzb3VyY2UgZmlsZXMgaW5zdGFsbGVkLCBhcyB3ZWxsIGFzIGEgc2FuZSBidWlsZCBlbnZpcm9ubWVudCB3aGljaCBpbmNsdWRlcworICAgIGFsbCB0b29scyBuZWNlc3NhcnkgZm9yIGNvbXBpbGluZyBhbmQgbGlua2luZyBjb2RlLiBEZXBlbmRpbmcgb24gdGhlIGV4YWN0CisgICAgdmVyc2lvbiBvZiB0aGUga2VybmVsLCB5b3UgbmVlZCBhcHByb3hpbWF0ZWx5IDE1MCBNQiBvZiBmcmVlIGRpc2sgc3BhY2UuCisgICAgT25jZSBjb21waWxlZCwgdGhlIGRyaXZlciB1c2VzIGFib3V0IDE1MC0yMDAgS0IuICBQbGVhc2Ugbm90ZSwgdGhpcyBzaXplIGlzCisgICAgYXBwcm94aW1hdGUgYW5kIGNhbiB2YXJ5IGRlcGVuZGluZyBvbiB3aGljaCB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgaXMgYnVpbHQuCisgICAgSW4gYWRkaXRpb24sIGFkZGluZyBkZWJ1ZyB0cmFjaW5nIHN1cHBvcnQgaW5jcmVhc2VzIHRoaXMgc2l6ZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiszLiAgTkVXIElOIFRISVMgUkVMRUFTRQorCitWZXJzaW9uIDcuMjIgYWJnIC0gSnVseSAyOCwgMjAwNAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzQuICBJTlNUQUxMQVRJT04gTk9URVMKKworICAgIFRoZSBkcml2ZXIgZmlsZXMgZm9yIHRoZSBMaW51eCBkcml2ZXIgYXJlIG5vdCAicmVhZHkiIGZvciBkaXJlY3QKKyAgICBpbnN0YWxsYXRpb24gb250byBhbnkgTGludXggY29tcHV0ZXIuICBUbyBidWlsZCBhbmQgaW5zdGFsbCB0aGUgZHJpdmVyIHlvdQorICAgIG5lZWQgc29tZSBleHBlcnRpc2Ugb24gdGhlIExpbnV4IG9wZXJhdGluZyBzeXN0ZW0gaW4gZ2VuZXJhbCBhbmQgdGhlIHR5cGUKKyAgICBhbmQgdmVyc2lvbiBpbnN0YWxsZWQgb2YgdGhlIGtlcm5lbCBpbnN0YWxsZWQgb24geW91ciBjb21wdXRlci4gIFdpdGggdGhpcworICAgIGtub3dsZWRnZSB5b3UgY2FuIHVzZSB0aGUgZHJpdmVyIHNvdXJjZSBmaWxlcyBwcm92aWRlZCB0byBidWlsZCB5b3VyIG93bgorICAgIExpbnV4IGRyaXZlciBmb3IgeW91ciBzcGVjaWZpYyBjb21wdXRlciBhbmQga2VybmVsLgorCis0LjEgQmVmb3JlIHlvdSBzdGFydAorCisgICAgMSkgRGV0ZXJtaW5lIHRoZSB0eXBlIGFuZCB2ZXJzaW9uIG9mIHRoZSBMaW51eCBrZXJuZWwgb2YgeW91ciBjb21wdXRlciBhbmQKKyAgICBjaGVjayB3aGV0aGVyIGl0IG1lZXRzIHRoZSBzeXN0ZW0gcmVxdWlyZW1lbnRzIGxpc3RlZCBpbiBzZWN0aW9uIDIgb2YgdGhpcworICAgIFJFQURNRS4KKworICAgIDIpIElmIHlvdSdyZSBidWlsZGluZyBmb3IgUEMgQ2FyZCBvciBDb21wYWN0IEZsYXNoLCByZWFkIHRoZSBMaW51eAorICAgIFBDTUNJQS1IT1dUTyBieSBEYXZpZCBIaW5kcy4gVGhpcyBkb2N1bWVudCBpcyBwcm9iYWJseSBwcm92aWRlZCBvbiB0aGUKKyAgICBDRC1ST00gb2YgeW91ciBMaW51eCBkaXN0cmlidXRpb24uIFlvdSBjYW4gZG93bmxvYWQgdGhlIGxhdGVzdCB2ZXJzaW9uCisgICAgZnJvbToKKworICAgICAgICBodHRwOi8vcGNtY2lhLWNzLnNvdXJjZWZvcmdlLm5ldAorCisgICBQbGVhc2UgcmVhZCB0aGUgc2VjdGlvbiB0aXRsZWQgIlByZXJlcXVpc2l0ZXMgYW5kIGtlcm5lbCBzZXR1cCIgb2YgdGhlCisgICBQQ01DSUEtSE9XVE8uCisKKzQuMiBCdWlsZCB0aGUgZHJpdmVyIGZvciBQQyBDYXJkIC8gQ29tcGFjdCBGbGFzaAorCisgICAgMSkgT2J0YWluIGEgY29weSBvZiB0aGUgTGludXggUENNQ0lBIHBhY2thZ2UgZnJvbSBhIENELVJPTSBvZiB5b3VyIExpbnV4CisgICAgZGlzdHJpYnV0aW9uIG9yIGRvd25sb2FkIHRoZSBsYXRlc3QgdmVyc2lvbi4KKyAgICBGb3IgeW91ciBjb252ZW5pZW5jZSwgdGhlIEFnZXJlIFN5c3RlbXMgV2lyZWxlc3MgQ0QtUk9NIGNvbnRhaW5zIGEgY29weSBvZgorICAgIHRoZSBQQ01DSUEgcGFja2FnZSBpbiBzdWItZGlyZWN0b3J5OiBYdHJhcy9MaW51eC9QQ01DSUEKKworICAgIDIpIFRvIHVucGFjayB0aGUgTGludXggUENNQ0lBIHBhY2thZ2UsIGNvcHkgaXQgdG8gdGhlIGN1cnJlbnQgd29ya2luZworICAgIGRpcmVjdG9yeSBhbmQgdHlwZToKKyAgICAgICAlIHRhciB4enZmIHBjbWNpYS1jcy14Lnkuei50YXIuZ3oKKyAgICAgICAlIG12IHBjbWNpYS1jcy14LnkueiBwY21jaWEtY3MKKworICAgIE5vdGU6IElmIHlvdSB1c2UgdGhlIGFyY2hpdmUgc3VwcGxpZWQgb24gdGhlIENEUk9NLCB1c2UgYXJjaGl2ZSBuYW1lCisgICAgInBjM18yXzEudGd6IiBpbnN0ZWFkIG9mICJwY21jaWEtY3MtMy4yLjcudGFyLmd6Ii4KKworICAgIE5vdGU6IGV2ZW4gdGhvdWdoIFBDTUNJQSBjb2RlIGV4aXN0cyBpbiB0aGUga2VybmVsIHNvdXJjZSB0cmVlLCB0aGUgUENNQ0lBCisgICAgQ2FyZCBTZXJ2aWNlcyBwYWNrYWdlIG5lZWRzIHRvIGJlIHVucGFja2VkIGxvY2FsbHkgdG8gYnVpbGQgZHJpdmVycyBiYXNlZAorICAgIG9uIGl0LgorCisgICAgMykgRXh0cmFjdCB0aGUgd2xhZ3M0OSBkaXN0cmlidXRpb24gYXJjaGl2ZSBvbiB0b3Agb2YgdGhlIExpbnV4IFBDTUNJQQorICAgIHBhY2thZ2UuCisgICAgICAgJSBjZCBwY21jaWEtY3MKKyAgICAgICAlIHRhciB4enZmIC4uL3dsX2xrbV83XzIyX2FiZy50YXIuZ3oKKworICAgIDQpIFRvIGJ1aWxkIGFuZCBpbnN0YWxsIHRoZSBkcml2ZXIsIGZvbGxvdyB0aGUgcHJvY2VkdXJlIGJlbG93OgorICAgICAgICUgLi9Db25maWd1cmUKKworICAgIEFuc3dlciB0aGUgcHJlc2VudGVkIHF1ZXN0aW9ucy4gVXN1YWxseSB0aGUgZGVmYXVsdCBhbnN3ZXJzIGFyZSBPSyBhbmQKKyAgICBwcmVzc2luZyAiRW50ZXIiIGlzIGVub3VnaC4KKyAgICBPbiBuZXdlciBSZWRIYXQgc3lzdGVtcywgaG93ZXZlciwgeW91IHNob3VsZCBzcGVjaWZ5ICIvdXNyL3NyYy9saW51eC0yLjQiCisgICAgYXMgdGhlIExpbnV4IHNvdXJjZSBkaXJlY3RvcnkgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCAiL3Vzci9zcmMvbGludXgiLgorCisgICAgRm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gY29uZmlndXJhdGlvbiwgYnVpbGRpbmcgYW5kIGluc3RhbGxpbmcsCisgICAgc2VlIHRoZSBQQ01DSUEtSE9XVE8uCisKKyAgICBUbyBidWlsZCB0aGUgZGVmYXVsdCBkcml2ZXJzLCB3aGljaCBzdXBwb3J0IEhlcm1lcy1JSSBpbiBzdGF0aW9uIG1vZGUsIHJ1bgorICAgIHRoZSBCdWlsZCBzY3JpcHQ6CisgICAgICAgJSAuL0J1aWxkCisKKyAgICBUaGlzIHNjcmlwdCBkZXRlcm1pbmVzIHdoZXRoZXIgeW91ciBzeXN0ZW0gdXNlcyBpbi1rZXJuZWwgUENNQ0lBIGFuZCBlaXRoZXIKKyAgICBidWlsZHMgdGhlIGZ1bGwgUENNQ0lBIHBhY2thZ2Ugb3IganVzdCB0aGUgZHJpdmVyLgorCisgICAgQmVmb3JlIGluc3RhbGxpbmcgdGhlIGRyaXZlciB3aXRoIHRoZSBJbnN0YWxsIHNjcmlwdCwgeW91IG11c3QgYmVjb21lCisgICAgJ3Jvb3QnOgorICAgICAgICUgc3UKKyAgICAgICAuLgorICAgICAgICUgLi9JbnN0YWxsCisKKyAgICBUaGlzIHNjcmlwdCBkZXRlcm1pbmVzIHdoZXRoZXIgeW91ciBzeXN0ZW0gdXNlcyBpbi1rZXJuZWwgUENNQ0lBIGFuZCBlaXRoZXIKKyAgICBpbnN0YWxscyB0aGUgZnVsbCBQQ01DSUEgcGFja2FnZSBvciBqdXN0IHRoZSBkcml2ZXIuCisKKyAgICA1KSBJZiBpdCBiZWNvbWVzIG5lY2Vzc2FyeSB0byBjbGVhbiB0aGUgYnVpbGQsIGlzc3VlIHRoZSBmb2xsb3dpbmcKKyAgICBjb21tYW5kczoKKyAgICAgICAlIG1ha2UgY2xlYW4KKyAgICAgICAlIG1ha2UgLUMgbGliIGNsZWFuCisKKzQuMyBCdWlsZCB0aGUgZHJpdmVyIGZvciBQQ0kKKworICAgIDEpIEV4dHJhY3QgdGhlIHdsYWdzNDkgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCisgICAgICAgJSB0YXIgeHp2ZiB3bF9sa21fN18yMi50YXIuZ3oKKworICAgIE5vdGU6IHRoZXJlIGlzIG5vIG5lZWQgdG8gdW5wYWNrIHRoZSBkcml2ZXIgc291cmNlIGludG8gYSBQQ01DSUEgYnVpbGQKKyAgICBkaXJlY3RvcnkuCisKKyAgICAyKSBUbyBidWlsZCB0aGUgUENJIGRyaXZlcjoKKyAgICAgICAlIG1ha2UgLWYgd2xhZ3M0OS5tayB3bGFnczQ5X2gyX3BjaQorICAgICAgIG9yCisgICAgICAgJSBtYWtlIC1mIHdsYWdzNDkubWsgd2xhZ3M0OV9oMjVfcGNpCisKKyAgICAzKSBJbnN0YWxsIHRoZSBkcml2ZXIuCisgICAgICAgJSBpbnNtb2QgLi93aXJlbGVzcy93bGFnczQ5X2gyNS5vCisKKyAgICA0KSBJZiBpdCBiZWNvbWVzIG5lY2Vzc2FyeSB0byBjbGVhbiB0aGUgYnVpbGQuCisgICAgICAgJSBtYWtlIC1mIHdsYWdzNDkubWsgcGNpX2NsZWFuCisKKzQuNCBDb25maWd1cmUgeW91ciBXaXJlbGVzcyBQQyBDYXJkCisKKyAgICBUaGVyZSBhcmUgMyB3YXlzIHRvIGNvbmZpZ3VyZSB0aGUgZHJpdmVyCisgICAgLSBtb2R1bGUgcGFyYW1ldGVycyAoL2V0Yy9wY21jaWEvY29uZmlnLm9wdHMpCisgICAgLSB3aXJlbGVzcyBleHRlbnNpb24gKC9ldGMvcGNtY2lhL3dpcmVsZXNzLm9wdHMpCisgICAgLSBBZ2VyZSBjb25maWd1cmF0aW9uIGZpbGUgKC9ldGMvYWdlcmUvaXdjb25maWctZXRoIykKKworCis0LjQuMSBDb25maWd1cmUgdGhyb3VnaCAvZXRjL3BjbWNpYS9jb25maWcub3B0cworCisgICAgVG8gdXNlIHRoaXMgbWV0aG9kLCBtYWtlIHN1cmUgdGhhdCAvZXRjL3BjbWNpYS93aXJlbGVzcy5vcHRzIGZpbGUgaXMgZWl0aGVyCisgICAgYWJzZW50IG9yIGNvbnRhaW5zIGJsYW5rIHBhcmFtZXRlciB2YWx1ZXMgYXMgc2hvd24gYmVsb3cuCisKKyAgICAqLCosKiwwMDo2MDoxRDoqfCosKiwqLDAwOjAyOjJEOiopCisgICAgICAgIElORk89IiIKKyAgICAgICAgRVNTSUQ9IiIKKyAgICAgICAgTU9ERT0iIgorICAgICAgICBLRVk9IiIKKyAgICA7OworCisgICAgMSkgVG8gY29uZmlndXJlIHRoZSBXaXJlbGVzcyBQQyBDYXJkLCBwbGVhc2UgcmVmZXIgdG86CisgICAgICAgKiBUaGUgb25saW5lIG1hbnVhbCBwYWdlICh3bGFnczQ5LjQpCisgICAgICAgICAlIG1hbiB3bGFnczQ5CisgICAgICAgKiBUaGUgbmV0d29yayBhZGFwdGVyIHNlY3Rpb25zIG9mIHRoZSBQQ01DSUEgZG9jdW1lbnRhdGlvbi4KKyAgICAgICAgICUgbW9yZSBQQ01DSUEtSE9XVE8KKworICAgIDIpIFVzZSBhbiBlZGl0b3IgdG8gY29uZmlndXJlIHRoZSBtb2R1bGUgcGFyYW1ldGVyczoKKyAgICAgICAjIHZpIC9ldGMvcGNtY2lhL2NvbmZpZy5vcHRzCisKKyAgICAgICBhKSBUbyBjb25uZWN0IHlvdXIgY29tcHV0ZXIgdG8gYSB3aXJlbGVzcyBpbmZyYXN0cnVjdHVyZSB0aGF0IGluY2x1ZGVzCisgICAgICAgYWNjZXNzIHBvaW50cyBzdWNoIGFzIHRoZSBBUC0xMDAwIG9yIEFQLTUwMCwgeW91IG5lZWQgdG8gaWRlbnRpZnkgdGhlCisgICAgICAgbmV0d29yayBuYW1lIG9mIHRoZSB3aXJlbGVzcyBpbmZyYXN0cnVjdHVyZS4KKworICAgICAgIEZvciBleGFtcGxlIGlmIHlvdXIgaW5mcmFzdHJ1Y3R1cmUgdXNlcyB0aGUgbmV0d29yayBuYW1lICJNeSBOZXR3b3JrIiwKKyAgICAgICBlZGl0IHRoZSBjb25maWcub3B0cyBmaWxlIHRvIGluY2x1ZGUgdGhlIGZvbGxvd2luZzoKKworICAgICAgIG1vZHVsZSAiPGRyaXZlcl9uYW1lPiIgb3B0cyAibmV0d29ya19uYW1lPU15XCBOZXR3b3JrIgorCisgICAgICAgTm90aWNlIHRoYXQgdGhlIHNwYWNlIGNoYXJhY3RlciBuZWVkcyB0byBiZSBlc2NhcGVkIHdpdGggYSBiYWNrc2xhc2guCisKKyAgICAgICBiKSBUbyBjb25uZWN0IHlvdXIgY29tcHV0ZXIgdG8gYSBSZXNpZGVudGlhbCBHYXRld2F5IFJHLTEwMDAsIHlvdSBuZWVkCisgICAgICAgdG8ga25vdyB0aGUgUkcgSUQgKD1uZXR3b3JrX25hbWUpIGFuZCB0aGUgZW5jcnlwdGlvbiBrZXkuICBZb3UgY2FuIGZpbmQKKyAgICAgICB0aGUgUkcgSUQgb24gYSBzbWFsbCBsYWJlbCBvbiB0aGUgcmVhciBvZiB0aGUgdW5pdC4KKworICAgICAgIEZvciBleGFtcGxlIGlmIHlvdXIgUkctMTAwMCBoYXMgSUQgMjI1Y2NmIGFuZCB5b3UgZGlkIG5vdCBjaGFuZ2UgdGhlCisgICAgICAgZW5jcnlwdGlvbiBrZXkgeWV0LCBlZGl0IHRoZSBjb25maWcub3B0cyBmaWxlIHRvIGluY2x1ZGUgdGhlIGZvbGxvd2luZzoKKworICAgICAgIG1vZHVsZSAiPGRyaXZlcl9uYW1lPiIgb3B0cyAibmV0d29ya19uYW1lPVwiMjI1Y2NmXCIga2V5XzE9XCIyNWNjZlwiCisgICAgICAgZW5hYmxlX2VuY3J5cHRpb249WSIKKworICAgICAgIElmIHlvdSBjaGFuZ2VkIHlvdXIgZW5jcnlwdGlvbiBrZXksIHlvdSBzaG91bGQgc3BlY2lmeSB0aGlzIGtleSBhcyBrZXlfMQorICAgICAgIG9uIHRoZSBwYXJhbWV0ZXIgbGluZS4KKworICAgICAgIGMpIFRvIGNvbm5lY3QgeW91ciBjb21wdXRlciB0byBhIHBlZXItdG8tcGVlciBuZXR3b3JrLCBpbiBhbiBlbnZpcm9ubWVudAorICAgICAgIHdpdGhvdXQgYWNjZXNzIHBvaW50cywgdGhlIElCU1MgbW9kZSBpcyByZWNvbW1lbmRlZC4KKworICAgICAgIEZvciBleGFtcGxlIHRvIGNvbm5lY3QgdG8gYSBwZWVyLXRvLXBlZXIgbmV0d29yayBjYWxsZWQgIk15IE5ldHdvcmsiLAorICAgICAgIGVudGVyIHRoZSBmb2xsb3dpbmcgaW4gdGhlIGNvbmZpZy5vcHRzIGZpbGU6CisKKyAgICAgICBtb2R1bGUgIjxkcml2ZXJfbmFtZT4iIG9wdHMgImNyZWF0ZV9pYnNzPVkgbmV0d29ya19uYW1lPU15XCBOZXR3b3JrIgorCisgICAgICAgZCkgT3B0aW9uYWxseSB5b3UgY2FuIGFsc28gaW5jbHVkZSBhICJTdGF0aW9uIE5hbWUiIHZhbHVlIHRoYXQgY2FuIGJlCisgICAgICAgdXNlZCB0byBpbmRlbnRpZnkgeW91ciBjb21wdXRlciBvbiB0aGUgd2lyZWxlc3MgbmV0d29yay4KKworICAgICAgIEZvciBleGFtcGxlIGlmIHlvdSB3aXNoIHRvIG5hbWUgeW91ciBjb21wdXRlciAiV2F2ZTEiIHdoZW4gY29ubmVjdGluZyBpdAorICAgICAgIHRvIGEgd2lyZWxlc3MgaW5mcmFzdHJ1Y3R1cmUsICBlZGl0IHRoZSBjb25maWcub3B0cyBmaWxlIHRvIGluY2x1ZGUgdGhlCisgICAgICAgZm9sbG93aW5nOgorCisgICAgICAgbW9kdWxlICI8ZHJpdmVyX25hbWU+IiBvcHRzICJuZXR3b3JrX25hbWU9T2NlYW4gc3RhdGlvbl9uYW1lPVdhdmUxIgorCisgICAgICAgZSkgVG8gY29ubmVjdCB5b3VyIGNvbXB1dGVyIHRvIGFuIEFkLUhvYyB3b3JrZ3JvdXAgb2Ygd2lyZWxlc3MKKyAgICAgICBjb21wdXRlcnMsIGVudGVyIHRoZSBmb2xsb3dpbmcgaW4gdGhlIGNvbmZpZy5vcHRzIGZpbGU6CisKKyAgICAgICBtb2R1bGUgIjxkcml2ZXJfbmFtZT4iIG9wdHMgInBvcnRfdHlwZT0zIgorCisgICAgICAgTm90ZSB0aGF0IHRoZSAiQWQtSG9jIERlbW8gTW9kZSIgaXMgbm90IHRoZSByZWNvbW1lbmRlZCBtb2RlIGZvciBhCisgICAgICAgcGVlci10by1wZWVyIG5ldHdvcmsuICBUaGUgY29uZmlndXJhdGlvbiBvZiB0aGlzICBub24taW50ZXJvcGVyYWJsZSBtb2RlCisgICAgICAgaXMgb25seSBleHBsYWluZWQgaGVyZSBmb3Igc3BlY2lhbCBhcHBsaWNhdGlvbnMgKGUuZy4gcmVzZWFyY2gsIG9yCisgICAgICAgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIC8gcHJldmlvdXMgV2F2ZUxBTi9JRUVFIHByb2R1Y3RzKS4KKworICAgICAgIFRoZSBJQlNTIG1vZGUgZGVzY3JpYmVkIGluIGMpIGlzIHRoZSBwcmVmZXJyZWQgYW5kIGludGVyb3BlcmFibGUgbW9kZQorICAgICAgIGZvciBjcmVhdGluZyBhIHBlZXItdG8tcGVlciBuZXR3b3JrLgorCisgICAgMykgVXNlIGFuIGVkaXRvciB0byBtb2RpZnkgdGhlIG5ldHdvcmsgb3B0aW9ucyBmb3IgeW91ciBhZGFwdGVyLgorICAgICAgICMgdmkgL2V0Yy9wY21jaWEvbmV0d29yay5vcHRzCisKKyAgICAgICBUaGUgcGFyYW1ldGVycyBuZWVkIHRvIGJlIGNvcnJlY3QgZm9yIHRoZSBjb25uZWN0ZWQgbmV0d29yay4gQ2hlY2sgd2l0aAorICAgICAgIHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IgZm9yIHRoZSBjb3JyZWN0IG5ldHdvcmsgaW5mb3JtYXRpb24uICBSZWZlciB0bworICAgICAgIHRoZSBQQ01DSUEtSE9XVE8gZm9yIG1vcmUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKworICAgICAgIEZvciBleGFtcGxlOgorICAgICAgICAgICAgKiwqLCosKikKKyAgICAgICAgICAgICAgICBJRl9QT1JUPSIiCisgICAgICAgICAgICAgICAgQk9PVFA9Im4iCisgICAgICAgICAgICAgICAgSVBBRERSPSIxMC4wLjAuNSIKKyAgICAgICAgICAgICAgICBORVRNQVNLPSIyNTUuMjU1LjI1NS4wIgorICAgICAgICAgICAgICAgIE5FVFdPUks9IjEwLjAuMC4wIgorICAgICAgICAgICAgICAgIEJST0FEQ0FTVD0iMTAuMC4wLjI1NSIKKyAgICAgICAgICAgICAgICBHQVRFV0FZPSIxMC4wLjAuMSIKKyAgICAgICAgICAgICAgICBET01BSU49ImRvbWFpbi5vcmciCisgICAgICAgICAgICAgICAgRE5TXzE9ImRuczEuZG9tYWluLm9yZyIKKyAgICAgICAgICAgICAgICA7OworCisgICAgICAgUmVkSGF0IGFuZCBTdXNlIGRvIG5vdCB1c2UgdGhlIG5ldHdvcmsub3B0cyB0byBjb25maWd1cmUgdGhlIGRyaXZlci4KKyAgICAgICBJbnN0ZWFkIFJlZEhhdCB1c2VzIGEgR1VJLWJhc2VkIHRvb2wgY2FsbGVkICduZWF0JyAoJ25ldC5jZmcnIGluIG9sZGVyCisgICAgICAgdmVyc2lvbnMpIGFuZCBTdVNFIExpbnV4IHVzZXMgJ1lhU1QnLiBUaGVzZSB0b29scyBjcmVhdGVzIHNjcmlwdHMsIGxpa2UKKyAgICAgICBpZmNmZy1ldGgwLCBpbiB0aGUgZGlyZWN0b3J5IC9ldGMvc3lzY29uZmlnL25ldHdvcmstc2NyaXB0cy4gVXNpbmcgdGhlCisgICAgICAgZGVmYXVsdCBHTk9NRSBtZW51LCB5b3UgY2FuIHN0YXJ0IG5ldGNmZyBmcm9tOiBQcm9ncmFtcy0+U3lzdGVtLT5OZXR3b3JrCisgICAgICAgQ29uZmlndXJhdGlvbi4KKworICAgIDQpIFJlc3RhcnQgdGhlIFBDTUNJQSBzZXJ2aWNlcy4KKyAgICAgICAjIC9ldGMvcmMuZC9yYy5wY21jaWEgcmVzdGFydAorICAgICAgICAgb3IKKyAgICAgICAjIC9ldGMvcmMuZC9pbml0LmQvcGNtY2lhIHJlc3RhcnQKKworCisgICAgRm9yIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBhYm91dCB0aGUgdmFyaW91cyBjb25maWd1cmF0aW9uIG9wdGlvbnMgYW5kCisgICAgZGVmaW5pdGlvbnMsIHBsZWFzZSBjb25zdWx0IHRoZSBXaXJlbGVzcyBkb2N1bWVudGF0aW9uLgorCis0LjQuMiBDb25maWd1cmUgdGhyb3VnaCAvZXRjL3BjbWNpYS93aXJlbGVzcy5vcHRzCisKKyAgICBUaGlzIGRyaXZlciBoYXMgc3VwcG9ydCBmb3IgdGhlICJXaXJlbGVzcyBFeHRlbnNpb25zIi4gIFRoaXMgaW50ZXJmYWNlCisgICAgYWxsb3dzIHRoZSAiV2lyZWxlc3MgVG9vbHMiIHRvIGdldCBzdGF0aXN0aWNzIGZyb20gdGhlIGRyaXZlciBhbmQgYWxsb3dzIHRvCisgICAgY2hhbmdlIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBkcml2ZXIgb24gdGhlIGZseS4KKworICAgIFRoZSBsYXRlc3QgdmVyc2lvbnMgb2YgdGhlIFBDTUNJQSBwYWNrYWdlIGNvbnRhaW4gc2NyaXB0cyB0aGF0IHVzZSB0aGUKKyAgICB3aXJlbGVzcyBleHRlbnNpb24gdG8gY29uZmlndXJlIHRoZSBkcml2ZXIgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlCisgICAgY29uZmlndXJhdGlvbiB0aHJvdWdoIG1vZHVsZSBwYXJhbWV0ZXJzIGFzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDQuNC4xLgorICAgIFJlYWQgdGhlIC9ldGMvcGNtY2lhL3dpcmVsZXNzLm9wdHMgZmlsZSBmb3IgdGhlIHRoZW9yeSBvZiBvcGVyYXRpb24uICBXaGVuCisgICAgdGhlIGRyaXZlciBpcyBjb25maWd1cmVkLCBnbyB0byBzZWN0aW9uIDQuNC4xIHN0ZXAgMyB0byBjb25maWd1cmUgdGhlCisgICAgbmV0d29yayBwYXJhbWV0ZXJzLgorCisgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBmb2xsb3dpbmcgV0VCIHBhZ2VzOgorICAgIGh0dHA6Ly93d3cuaHBsLmhwLmNvbS9wZXJzb25hbC9KZWFuX1RvdXJyaWxoZXMvTGludXgvTGludXguV2lyZWxlc3MuRXh0ZW5zaW9ucy5odG1sCisgICAgaHR0cDovL3d3dy5ocGwuaHAuY29tL3BlcnNvbmFsL0plYW5fVG91cnJpbGhlcy9MaW51eC9Ub29scy5odG1sCisKKzQuNC4zIENvbmZpZ3VyZSB0aHJvdWdoIC9ldGMvYWdlcmUvaXdjb25maWctZXRoIworCisgICAgSW4gYWRkaXRpb24gdG8gdXNpbmcgZWl0aGVyIHRoZSBtb2R1bGUgb3B0aW9ucyBvciB0aGUgd2lyZWxlc3MgZXh0ZW5zaW9ucworICAgIG1ldGhvZHMgdG8gY29uZmlndXJlIGEgd2lyZWxlc3MgZGV2aWNlLCB0aGlzIHZlcnNpb24gb2YgdGhlIHNvZnR3YXJlIGFsc28KKyAgICBzdXBwb3J0cyBhbiBBZ2VyZSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4gVGhpcyB3YXMgZG9uZSBiZWNhdXNlOgorICAgICogTW9kdWxlIG9wdGlvbnMgY29uZmlndXJlcyBtdWx0aXBsZSBkZXZpY2VzIHRoZSBzYW1lLgorICAgICogV2lyZWxlc3MgZXh0ZW5zaW9ucyBwYXJhbWV0ZXJzIGRvIG5vdCBjb3ZlciBhbGwgb2YgdGhlIGF2YWlsYWJsZSBvcHRpb25zCisgICAgICBpbiB0aGUgZHJpdmVyLgorCisgICAgRm9yIGVhY2ggd2lyZWxlc3MgZXRoZXJuZXQgZGV2aWNlIChpZGVudGlmaWVkIGJ5IGV0aDxuPiwgd2hlcmUgbiBpcyBhCisgICAgcG9zaXRpdmUgaW50ZWdlciksIGEgZmlsZSAvZXRjL2FnZXJlL2l3Y29uZmlnLWV0aDxuPiBjYW4gYmUgY3JlYXRlZCB3aGljaAorICAgIGNvbnRhaW5zIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIGEgd2lyZWxlc3MgZGV2aWNlLiBGb3IgZXhhbXBsZSwgdGhlCisgICAgZmlsZSAvZXRjL2FnZXJlL2l3Y29uZmlnLWV0aDEgaXMgdGhlIGNvbmZpZyBmaWxlIGZvciBldGgxLiBUaGlzIGZpbGUgc2hvdWxkCisgICAgY29udGFpbiBLZXkvVmFsdWUgcGFpcnMgaW4gdGhlIGZvcm1hdDoKKworICAgIDxLZXk+PTxWYWx1ZT4KKworICAgIHdoZXJlIDxLZXk+IGlzIHRoZSBwYXJhbWV0ZXIgdG8gY29uZmlndXJlIGFuZCA8VmFsdWU+IGlzIHRoZSB2YWx1ZSB0bworICAgIGFzc2lnbiBpdC4gRm9yIGV4YW1wbGUsIGlmIHRoZSBjb25maWcgZmlsZSAvZXRjL2FnZXJlL2l3Y29uZmlnLWV0aDEKKyAgICBkZXNjcmliZWQgYWJvdmUgY29udGFpbnMgdGhlIGZvbGxvd2luZzoKKworICAgIERlc2lyZWRTU0lEPXNvbWVfbmV0d29yaworICAgIEVuYWJsZUVuY3J5cHRpb249WQorICAgIEtleTE9bmV0MDEKKyAgICBUeEtleT0xCisKKyAgICB0aGlzIGNvbmZpZ3VyZXMgZXRoMSB0byBhc3NvY2lhdGUgdG8gdGhlIEVTU0lEICdzb21lX25ldHdvcmsnIHdpdGgKKyAgICBlbmNyeXB0aW9uIG9uLCB3aGVyZSB0aGUgdGhlIGZpcnN0IGVuY3J5cHRpb24ga2V5IGlzICduZXQwMScgYW5kIHRoZSBrZXkgdG8KKyAgICB1c2UgZm9yIGVuY3J5cHRpb24gaXMgS2V5IDEuCisKKyAgICBOb3RlIHRoYXQgdGhpcyBvbmx5IHdvcmtzIG9uIEFnZXJlIGhhcmR3YXJlIHdoaWNoIHVzZXMgdGhpcyBkcml2ZXIuIEZvcgorICAgIG90aGVyIHdpcmVsZXNzIGRyaXZlcnMsIG9yIG5vbi13aXJlbGVzcyBkZXZpY2VzLCB0aGlzIGZpbGUgY2FuIGJlIHByZXNlbnQsCisgICAgYnV0IGhhcyBubyBlZmZlY3QuCisKKyAgICBQbGVhc2UgcmVmZXIgdG8gdGhlIG1hbiBwYWdlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgY29uZmlndXJhdGlvbgorICAgIGZpbGUgYW5kIHRoZSBwYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHNldC4KKworCis0LjUgQ29uZmlndXJpbmcgeW91ciBXaXJlbGVzcyBQQ0kgY2FyZAorCisgICAgTm90ZSB0aGF0IHRoZSBhYm92ZSBtZXRob2Qgb2YgY29uZmlndXJpbmcgdGhlIGNhcmQgdXNpbmcKKyAgICAvZXRjL3BjbWNpYS9jb25maWcub3B0cyBpcyBvbmx5IHZhbGlkIGZvciBQQ01DSUEvQ0YgY2FyZHMuIEZvciBbbWluaV1QQ0kKKyAgICBhbmQgQ2FyZEJ1cyBjYXJkcywgcmVmZXIgdG8geW91ciBzeXN0ZW0ncyBkb2N1bWVudGF0aW9uIG9uIG1vZHVsZXMuY29uZiB0bworICAgIGxvYWQgdGhlIGRyaXZlciB3aXRoIHRoZSBwcm9wZXIgb3B0aW9ucyBmb3IgYSBnaXZlbiB3aXJlbGVzcyBldGhlcm5ldAorICAgIGludGVyZmFjZS4gSW4gYWRkaXRpb24sIG5ldHdvcmsgY29uZmlndXJhdGlvbiB0b29scyBsaWtlICduZXRjZmcnLCAnbmVhdCcsCisgICAgb3IgJ1lhU1QnIChzZWUgU2VjdGlvbiA0LjQuMSwgU3RlcCAzKSBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIG1pbmlQQ0kKKyAgICBjYXJkLiBMYXN0bHksIHRoZSBBZ2VyZSBjb25maWd1cmF0aW9uIGZpbGUgZGVzY3JpYmVkIGluIFNlY3Rpb24gNC40LjMgbWF5CisgICAgYWxzbyBiZSB1c2VkIGZvciBbbWluaV1QQ0kgYW5kIENhcmRCdXMgZGV2aWNlcy4KKworNC42IFRyb3VibGVzaG9vdGluZworCisgICAgV2hlbiB0aGUgV2lyZWxlc3MgUEMgQ2FyZCBpcyBpbnNlcnRlZCwgdGhlIGNhcmQgbWFuYWdlciBlbWl0IGJlZXBzIGluCisgICAgZGlmZmVyZW50IHRvbmVzIHRvIGluZGljYXRlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiBwYXJ0aWN1bGFyIGNvbmZpZ3VyYXRpb24KKyAgICBzdGVwcy4KKyAgICAgIGEpIFR3byBoaWdoIGJlZXBzCisgICAgICAgICAtIFRoZSBjYXJkIHdhcyBpZGVudGlmaWVkIGFuZCBjb25maWd1cmVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgIGIpIE9uZSBoaWdoIGJlZXAgZm9sbG93ZWQgYnkgYSBsb3cgYmVlcAorICAgICAgICAgLSBUaGUgY2FyZCB3YXMgaWRlbnRpZmllZCwgYnV0IGNvdWxkIG5vdCBiZSBjb25maWd1cmVkLgorICAgICAgICAgLSBFeGFtaW5lIHRoZSBzeXN0ZW0gbG9nIChkbWVzZykgZm9yIFBDTUNJQSBlcnJvciBvciB3YXJuaW5nIG1lc3NhZ2VzLgorICAgICAgYykgT25lIGxvdyBiZWVwCisgICAgICAgICAtIFRoZSBjYXJkIGNvdWxkIG5vdCBiZSBpZGVudGlmaWVkLgorICAgICAgICAgLSBFeGVjdXRlICJjYXJkY3RsIGlkZW50IiB0byBkaXNwbGF5IHRoZSBhZGFwdGVyIFBuUCBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgVmVyaWZ5IHRoZSBQblAgaW5mb3JtYXRpb24gbWF0Y2hlcyBhbiBlbnRyeSBpbiB0aGUgUENNQ0lBCisgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZSAoL2V0Yy9wY21jaWEvY29uZmlnKS4KKyAgICAgICAgIC0gRXhhbWluZSB0aGUgc3lzdGVtIGxvZyAoZG1lc2cpIGZvciBQQ01DSUEgZXJyb3Igb3Igd2FybmluZyBtZXNzYWdlcy4KKworICAgIFRoZSBXaXJlbGVzcyBQQyBDYXJkIGhhcyB0d28gTEVEcyB0aGF0IGluZGljYXRlIHRoZSBzdGF0ZSBvZiB0aGUgYWRhcHRlcgorICAgIGFuZCBuZXR3b3JrLgorICAgICAgKiBQb3dlciBMRUQgKHRvd2FyZCB0aGUgbWlkZGxlIG9mIHRoZSBhZGFwdGVyKQorICAgIAktIFRoaXMgTEVEIGluZGljYXRlcyBwb3dlciBoYXMgYmVlbiBhcHBsaWVkLCBhbmQgdGhlIGNhcmQgaXMKKyAgICAJICBmdW5jdGlvbmFsLiBJbiBub3JtYWwgb3BlcmF0aW9uIG1vZGUgd2l0aCBDYXJkIFBvd2VyIE1hbmFnZW1lbnQKKyAgICAJICBkaXNhYmxlZCwgaXQgaXMgc3RlYWR5LW9uLiBXaXRoIENhcmQgUG93ZXIgTWFuYWdlbWVudCBlbmFibGVkLCBpdAorICAgIAkgIGJsaW5rcyByYXBpZGx5IChzZXZlcmFsIHRpbWVzIHBlciBzZWNvbmQpLgorICAgICAgKiBUcmFuc21pdC9SZWNlaXZlIExFRCAoY2xvc2VyIHRvIHRoZSBlZGdlIG9mIHRoZSBhZGFwdGVyKQorICAgICAgICAtIFRoaXMgTEVEIGZsYXNoZXMgd2hlbiBpdCBkZXRlY3RzIHRyYW5zbWl0IG9yIHJlY2VpdmUgcGFja2V0cy4KKworICAgICAgKiBCb3RoIExFRHMgYmxpbmsgYXQgdGhlIHNhbWUgdGltZSBldmVyeSAxMCBzZWNvbmRzLgorICAgIAktIFRoZSBhZGFwdGVyIHdhcyB1bmFibGUgdG8gbWFrZSBjb250YWN0IHdpdGggdGhlIG5hbWVkIHdpcmVsZXNzCisgICAgCSAgbmV0d29yay4gVmVyaWZ5IHRoZSBuZXR3b3JrX25hbWUsIGluIHRoZSBjb25maWcub3B0cyBmaWxlIG1hdGNoZXMgdGhlCisgICAgCSAgbmV0d29yayBuYW1lIG9mIHRoZSBhY2Nlc3MgcG9pbnQuCisgICAgICAqIExFRHMgaW5kaWNhdGUgbm9ybWFsIG9wZXJhdGlvbiB3aXRoIHRoZSBQb3dlciBMRUQKKyAgICAJc3RlYWR5LW9uIG9yIGJsaW5raW5nIHJhcGlkbHkgYW5kIFRyYW5zbWl0L1JlY2VpdmUgTEVEIGZsYXNoaW5nLCBidXQgbm8KKyAgICAJdHJhZmZpYy4KKyAgICAJLSBJZiB0aGUgbmV0d29yayBpcyBvcGVyYXRpbmcgaW4gbm9ybWFsIG1vZGUgKGllLiAgcG9ydF90eXBlID0gMCBvciBub3QKKyAgICAJICBzcGVjaWZpZWQpLCBhbmQgYSBuZXR3b3JrX25hbWUgaGFzIGJlZW4gc3BlY2lmaWVkLCB2ZXJpZnkgdGhlCisgICAgCSAgd29ya3N0YXRpb24gbmV0d29yayBwYXJhbWV0ZXJzIChpZmNvbmZpZywgcm91dGUsIGV0Yy4pIGFyZSBjb3JyZWN0CisgICAgCSAgZm9yIHRoZSB3aXJlbGVzcyBuZXR3b3JrLgorICAgIAktIElmIHRoZSBuZXR3b3JrIGlzIG9wZXJhdGluZyBpbiBBZC1Ib2MgKHBlZXItdG8tcGVlcikgbW9kZSAoaWUuCisgICAgCSAgcG9ydF90eXBlID0gMyksIHRoZSBhZGFwdGVyIG5lZWRzIGFub3RoZXIgd29ya3N0YXRpb24vYWRhcHRlciB0bworICAgIAkgIGNvbW11bmljYXRlIHdpdGguICBWZXJpZnkgdGhlIG5ldHdvcmsgcGFyYW1ldGVycyBvbiBib3RoIG9mIHRoZQorICAgIAkgIHdvcmtzdGF0aW9ucyAoaWZjb25maWcsIHJvdXRlLCBldGMuKSBhcmUgY29ycmVjdC4KKworICAgIFJlZmVyIHRvIHRoZSBvbmxpbmUgbWFudWFsIHBhZ2UgZm9yIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiwgZmVhdHVyZSBhbmQKKyAgICBzdXBwb3J0IGluZm9ybWF0aW9uLgorICAgICAgICUgbWFuIHdsYWdzNDkKKyAgICAgICAgIG9yCisgICAgICAgJSBtYW4gNCB3bGFnczQ5CisgICAgICAgICBvcgorICAgICAgICUgbnJvZmYgLW1hbiB3bGFnczQ5LjQgfCBtb3JlCisKKzQuNyBJZGVudGlmeWluZyB0aGUgc29mdHdhcmUKKworICAgIFRoaXMgc2VjdGlvbiBleHBsYWlucyBob3cgdG8gaWRlbnRpZnkgdGhlIHZlcnNpb24gb2YgdGhpcyBzb2Z0d2FyZSBvbmNlIGl0CisgICAgaXMgdW5wYWNrZWQgb3IgaW5zdGFsbGVkLgorCisgICAgVGhlIExpbnV4IERyaXZlciBTb3VyY2UvTGlicmFyeSBkaXN0cmlidXRpb24gY29uc2lzdCBvZiB0d28gbWFpbgorICAgIGNvbXBvbmVudHMsIHRoZSBkcml2ZXIgc291cmNlIGFuZCB0aGUgSENGIG1vZHVsZS4KKworICAgICogVG8gcXVpY2tseSBpZGVudGlmeSB0aGUgdmVyc2lvbiBvZiB0aGUgc291cmNlLCB0eXBlOgorICAgICAgJSBncmVwIERSVi4qVkVSU0lPTiBpbmNsdWRlL3dpcmVsZXNzL3dsX3ZlcnNpb24uaAorICAgICAgI2RlZmluZSBEUlZfTUFKT1JfVkVSU0lPTiAgIDcKKyAgICAgICNkZWZpbmUgRFJWX01JTk9SX1ZFUlNJT04gICAyMgorCisgICAgKiBUbyBpZGVudGlmeSB0aGUgcmV2aXNpb24gb2YgdGhlIEhDRiBsaWJyYXJ5IGNvbnRhaW5lZCBpbiB0aGUgZHJpdmVyLAorICAgICAgdHlwZToKKyAgICAgICUgZ3JlcCBIQ0YuUmV2aXNpb24gaGNmL2hjZi5jCisgICAgICAjZGVmaW5lIEhDRl9WRVJTSU9OICBURVhUKCAiSENGJFJldmlzaW9uOiAxLjggJCIgKQorCisgICAgVG8gaWRlbnRpZnkgYSBjb21waWxlZCB3bGFnczQ5IGRyaXZlciwgZ28gdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgZHJpdmVyCisgICAgaXMgbG9jYXRlZC4gQ2FyZCBTZXJ2aWNlcyBkcml2ZXJzICh3bGFnczQ5X2gyX2NzLm8gYW5kIHdsYWdzNDlfaDI1X2NzLm8pCisgICAgYXJlIGxvY2F0ZWQgaW46CisgICAgL2xpYi9tb2R1bGVzLzxrZXJuZWwtdmVyc2lvbj4vcGNtY2lhCisKKyAgICBQQ0kgZHJpdmVycyAod2xhZ3M0OV9oMi5vKSBhcmUgbG9jYXRlZCBpbjoKKyAgICAvbGliL21vZHVsZXMvPGtlcm5lbC12ZXJzaW9uPi9rZXJuZWwvZHJpdmVycy9uZXQKKworICAgICogVG8gcmV0cmlldmUgdGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSB1c2VkIHRvIGNvbXBpbGUgdGhlIGRyaXZlciwgdHlwZToKKyAgICAgICUgc3RyaW5ncyA8ZHJpdmVyX25hbWU+Lm8gfCBncmVwIEFnZXJlCisgICAgICA8ZHJpdmVyX25hbWU+IHY3LjIyLWFiZy1CZXRhIGZvciBQQ01DSUEKKyAgICAgIDxkcml2ZXJfbmFtZT4gdjcuMjItYWJnLUJldGEgZm9yIFBDSQorCisgICAgKiBMaWtld2lzZSwgdG8gcmV0cmlldmUgdGhlIHJldmlzaW9uIG9mIHRoZSBIQ0YgdXNlZCB0byBjb21waWxlIHRoZSBkcml2ZXIsCisgICAgICB0eXBlOgorICAgICAgJSBzdHJpbmdzIDxkcml2ZXJfbmFtZT4ubyB8IGdyZXAgUmV2aXNpb24KKyAgICAgIEhDRiRSZXZpc2lvbjogNS4xNQorCisgICAgQXQgc3RhcnR1cCB0aGUgd2xhZ3M0OSBkcml2ZXIgcmVwb3J0cyBpdHMgdmVyc2lvbiBpbiB0aGUgc3lzdGVtIGxvZyBmaWxlCisgICAgKC92YXIvbG9nL21lc3NhZ2VzKS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis1LiAgVEVDSE5JQ0FMIENPTlNUUkFJTlRTCisKKyAgICBBdCB0aGUgdGltZSBvZiByZWxlYXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoZSBmb2xsb3dpbmcgY29uc3RyYWludHMgYXJlCisgICAgaWRlbnRpZmllZDoKKworNS4xIFVzaW5nIHRoZSBJU0EgYWRhcHRlcgorCisgICAgRGVzY3JpcHRpb246IFRvIGFsbG93IG9wZXJhdGlvbiBpbiBkZXNrdG9wIGNvbXB1dGVycyBBZ2VyZSBhbHNvIHByb3ZpZGVzIGFuCisgICAgb3B0aW9uYWwgSVNBIGJ1cyB0byBQQyBDYXJkIGFkYXB0ZXIgKGFsc28gcmVmZXJyZWQgdG8gYXMgInN3YXBib3giKS4KKworICAgIFRoaXMgSVNBIEFkYXB0ZXIgY2FuIGJlIGNvbmZpZ3VyZWQgZm9yIHR3byBkaWZmZXJlbnQgSS9PIEFkZHJlc3MgdmFsdWVzOgorICAgICAgKiAzRTIgKGZhY3Rvcnktc2V0IGRlZmF1bHQpCisgICAgICAqIDNFMAorCisgICAgSW1wYWN0OiBCeSBkZWZhdWx0IHRoZSBpODIzNjUgbW9kdWxlIG9mIHRoZSBMaW51eCBwY21jaWEgcGFja2FnZSBvbmx5CisgICAgcHJvYmVzIGF0IDNFMC4KKworICAgIEFjdGlvbnM6CisgICAgMSkgUmVhZCB0aGUgbWFudWFsIHBhZ2Ugb24gdGhlIHByb2Jpbmcgb2YgdGhlIGk4MjM2NSBtb2R1bGUsIGJ5IHR5cGluZyB0aGUKKyAgICBjb21tYW5kOgorICAgICAgICBtYW4gaTgyMzY1CisKKyAgICAyKSBBcHBseSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmcgb3B0aW9uczoKKyAgICAgICBhKSBDaGFuZ2UgdGhlIEkvTyBhZGRyZXNzIHN0cmFwcGluZyBvZiB0aGUgSVNBIGFkYXB0ZXIgYnkgcmVwbGFjaW5nIHRoZQorICAgICAgICAgIGp1bXBlciBvbiB0aGUgSVNBIGFkYXB0ZXIuICBUaGUgY29ycmVjdCBqdW1wZXIgc2V0dGluZyBpcyBwaWN0dXJlZCBpbgorICAgICAgICAgIHRoZSBlbGVjdHJvbmljICJXaXJlbGVzcyBJU0EgQWRhcHRlciwgR2V0dGluZyBTdGFydGVkIEd1aWRlIiBwcm92aWRlZAorICAgICAgICAgIG9uIHRoZSBXaXJlbGVzcyBTb2Z0d2FyZSBDRC1ST00uIFRoaXMgZ3VpZGUgaXMgcHJvdmlkZWQgaW4gQWRvYmUncworICAgICAgICAgIEFjcm9iYXQgUERGIGZvcm1hdC4KKworICAgICAgIGIpIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gbG9hZCB0aGUgaTgyMzY1IG1vZHVsZSB3aXRoIHRoZQorICAgICAgICAgICJleHRyYV9zb2NrZXRzIiBwYXJhbWV0ZXIgc2V0IHRvIDEuCisKKyAgICAgICAgICBPbiBhIFJlZEhhdCA1LnggdGhydSA3LngsIHN5c3RlbSwgcHV0IHRoaXMgaW4gdGhlIGZpbGUKKyAgICAgICAgICAiL2V0Yy9zeXNjb25maWcvcGNtY2lhIjoKKyAgICAgICAgICAgICBQQ01DSUE9eWVzCisgICAgICAgICAgICAgUENJQz1pODIzNjUKKyAgICAgICAgICAgICBQQ0lDX09QVFM9ImV4dHJhX3NvY2tldHM9MSIKKyAgICAgICAgICAgICBDT1JFX09QVFM9CisgICAgICAgICAgICAgQ0FSRE1HUl9PUFRTPQorCisgICAgICAgICAgRm9yIG90aGVyIExpbnV4IGRpc3RyaWJ1dGlvbnMsIHlvdSBhcmUgYWR2aXNlZCB0byBjb25zdWx0IHRoZQorICAgICAgICAgICJQQ01DSUEtSE9XVE8iIG5vdGVzIGZvciBpbmZvcm1hdGlvbiBhYm91dCBjaGFuZ2luZyB0aGUgSS9PIEFkZHJlc3MKKyAgICAgICAgICBwcm9iaW5nLgorCis1LjIgVXNpbmcgdGhlIFBDSSBBZGFwdGVyCisKKyAgICBEZXNjcmlwdGlvbjogVG8gYWxsb3cgb3BlcmF0aW9uIGluIGRlc2t0b3AgY29tcHV0ZXJzIEFnZXJlIGFsc28gcHJvdmlkZXMgYW4KKyAgICBvcHRpb25hbCBQQ0kgYnVzIHRvIFBDIENhcmQgYWRhcHRlciAoYWxzbyByZWZlcnJlZCB0byBhcyAic3dhcGJveCIpLgorCisgICAgRm9yIGNvcnJlY3QgaW50ZXJydXB0IGFzc2lnbm1lbnQsIHRoZSBzeXN0ZW0gc2hvdWxkIHN1cHBvcnQgUENJQklPUyAyLjIuCisgICAgSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIFBDTUNJQSBwYWNrYWdlIHZlcnNpb24gMy4yLjcgb3IgaGlnaGVyLgorCisgICAgVGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB0aGUgaW50ZXJydXB0IHJvdXRpbmcgbWV0aG9kIG9mIHRoZSBQQ0kKKyAgICBBZGFwdGVyJ3MgVEkgQ2FyZEJ1cyBDb250cm9sbGVyIGlzIGluY29ycmVjdC4KKworICAgIEFjdGlvbnM6CisgICAgMSkgUmVhZCB0aGUgbWFudWFsIHBhZ2Ugb24gdGhlICJPcHRpb25zIHNwZWNpZmljIGZvciBUSSBDYXJkQnVzCisgICAgQ29udHJvbGxlcnMiIG9mIHRoZSBpODIzNjUgbW9kdWxlLCBieSB0eXBpbmcgdGhlIGNvbW1hbmQ6CisgICAgICAgIG1hbiBpODIzNjUKKworICAgIDIpIExvYWQgdGhlIGk4MjM2NSBtb2R1bGUgd2l0aCB0aGUgImlycV9tb2RlIiBwYXJhbWV0ZXIgc2V0IHRvIDAuCisgICAgICAgT24gYSBSZWRIYXQgNS54IHRocnUgNy54IHN5c3RlbSwgcHV0IHRoaXMgaW4gdGhlIGZpbGUKKyAgICAgICAiL2V0Yy9zeXNjb25maWcvcGNtY2lhIjoKKyAgICAgICAgICAgUENNQ0lBPXllcworICAgICAgICAgICBQQ0lDPWk4MjM2NQorICAgICAgICAgICBQQ0lDX09QVFM9ImlycV9tb2RlPTAiCisgICAgICAgICAgIENPUkVfT1BUUz0KKyAgICAgICAgICAgQ0FSRE1HUl9PUFRTPQorCisgICBGb3IgdGhlIGxvY2F0aW9uIG9mIHRoZSBQQ01DSUEgc2NyaXB0cyBvbiBvdGhlciBMaW51eCBkaXN0cmlidXRpb25zLCB5b3UKKyAgIGFyZSBhZHZpc2VkIHRvIGNvbnN1bHQgdGhlICJQQ01DSUEtSE9XVE8iLCAiTm90ZXMgYWJvdXQgc3BlY2lmaWMgTGludXgKKyAgIGRpc3RyaWJ1dGlvbnMiLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzYuICBLTk9XTiBJU1NVRVMKKworICAgIFRoaXMgaXMgdGhlIGN1cnJlbnQgbGlzdCBvZiBrbm93biBpc3N1ZXMgZm9yIHRoaXMgcmVsZWFzZSwgYW5kIHdpbGwgYmUKKyAgICBhZGRyZXNzZWQgaW4gdGhlIG5lYXIgZnV0dXJlOgorCisgICAgMS4gVGhpcyBkcml2ZXIgcmVsZWFzZSBjb250YWlucyBhIHZlcnNpb24gb2YgSGVybWVzLUlJLjUgZmlybXdhcmUgd2hpY2gKKyAgICBSRVFVSVJFUyBjYWxpYnJhdGVkIGNhcmRzLiBJZiB0aGVyZSBpcyBubyBjYWxpYnJhdGlvbiBkYXRhIHByZXNlbnQgaW4gdGhlCisgICAgUERBIG9mIHRoZSBoYXJkd2FyZSwgdGhlIGZpcm13YXJlIGRvZXMgbm90IG9wZXJhdGUuCisKKyAgICAyLiBXRFMgaXMgbm90IHlldCBzdXBwb3J0ZWQuCisKKyAgICAzLiBETUEgaXMgbm90IHlldCBzdXBwb3J0ZWQuCisKKyAgICA0LiBXUEEgaXMgbm90IHlldCBzdXBwb3J0ZWQuCisKKyAgICA1LiAzMi1iaXRzIEkvTyBpcyBub3QgeWV0IHN1cHBvcnRlZC4KKworICAgIDYuIFRoZSBjdXJyZW50IEJ1aWxkIHNjcmlwdCBhbHNvIGJ1aWxkcyB0aGUgUENJIGRyaXZlcnMuCisKKyAgICA3LiBUaGUgY3VycmVudCBJbnN0YWxsIHNjcmlwdCBhbHNvIGNvcGllcyB0aGUgUENJIGRyaXZlcnMgdG8gdGhlIGxpYgorICAgIGRpcmVjdG9yeS4KKworCTguIElmIEYvVyBmaWxlcyBhcmUgcmVxdWlyZWQgZnJvbSBvdXRzaWRlIHRoaXMgcmVsZWFzZSwgdGhlIGVudHJ5IHBvaW50cworCWluc2lkZSB0aGVzZSBGL1cgZmlsZXMgaGF2ZSB0byBiZSByZW5hbWVkIGZyb20gImFwIiBhbmQgInN0YXRpb24iIHRvCisJImZ3X2ltYWdlIiBhbmQgdGhleSBoYXZlIHRvIGJlIHJlbmFtZWQgdG8gZndfaDIuYyBhbmQgZndfaDI1LmMgZm9yCisJSGVybWVzLUlJIGFuZCBIZXJtZXMtSUkuNS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis3LiAgVEVDSE5JQ0FMIFNVUFBPUlQKKworNy4xIEZpbmRpbmcgSW5mb3JtYXRpb24KKworICAgIE9uIHRoZSBBZ2VyZSBTeXN0ZW1zIFdlYiBTaXRlIHlvdSBjYW4gZmluZCB0aGUgbW9zdCByZWNlbnQgZGV2aWNlIGRyaXZlcnMsCisgICAgc29mdHdhcmUgdXBkYXRlcyBhbmQgdXNlciBkb2N1bWVudGF0aW9uLgorCisgICAgV29ybGQgV2lkZSBXZWI6ICAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCisKKzcuMiBDb250YWN0IFRlY2huaWNhbCBTdXBwb3J0CisKKyAgICBJZiB5b3UgZW5jb3VudGVyIHByb2JsZW1zIHdoZW4gaW5zdGFsbGluZyBvciB1c2luZyB0aGlzIHByb2R1Y3QsIG9yIHdvdWxkCisgICAgbGlrZSBpbmZvcm1hdGlvbiBhYm91dCBvdXIgb3RoZXIgIldpcmVsZXNzIiBwcm9kdWN0cywgcGxlYXNlIGNvbnRhY3QgeW91cgorICAgIGxvY2FsIEF1dGhvcml6ZWQgIldpcmVsZXNzIiBSZXNlbGxlciBvciBBZ2VyZSBTeXN0ZW1zIHNhbGVzIG9mZmljZS4KKworICAgIEFkZHJlc3NlcyBhbmQgdGVsZXBob25lIG51bWJlcnMgb2YgdGhlIEFnZXJlIFN5c3RlbXMgc2FsZXMgb2ZmaWNlcyBhcmUKKyAgICBsaXN0ZWQgb24gb3VyIEFnZXJlIFN5c3RlbXMgd2ViIHNpdGUuCisKKyAgICBXaGVuIGNvbnRhY3RpbmcgVGVjaG5pY2FsIFN1cHBvcnQsIHBsZWFzZSB1c2UgdGhlIFByb2JsZW0gUmVwb3J0IEZvcm0gYW5kCisgICAgc2VuZCBpdCB0byB1cyBieSBGYXggb3IgRS1NYWlsLiAgVGhlIFByb2JsZW0gUmVwb3J0IEZvcm0gJ1JFUE9SVC5UWFQnCisgICAgKFBsYWluIHRleHQgZm9ybWF0KSBpcyBpbmNsdWRlZCBvbiB0aGUgZGlzay4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbgorICAgIGRvd25sb2FkIHRoZSBQcm9ibGVtIFJlcG9ydCBGb3JtIGZyb20gdGhlIEFnZXJlIFN5c3RlbXMgd2ViIHNpdGUuCisKKyAgICBJbmNsdWRlIFByb2R1Y3QgTmFtZSwgU2VyaWFsIE51bWJlciBhbmQgc29mdHdhcmUgdmVyc2lvbiBudW1iZXIgd2l0aCBlYWNoCisgICAgcmVxdWVzdCB0byBoZWxwIHRoZSBTdXBwb3J0IEdyb3VwIGhlbHBpbmcgeW91LgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YWE0MTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9UT0RPCkBAIC0wLDAgKzEsMzMgQEAKK0ZpcnN0IG9mIGFsbCwgdGhlIGJlc3QgdGhpbmcgd291bGQgYmUgdGhhdCB0aGlzIGRyaXZlciBiZWNvbWVzIG9ic29sdGUgYnkKK2FkZGluZyBzdXBwb3J0IGZvciBIZXJtZXMgSUkgYW5kIEhlcm1lcyBJSS41IGNhcmRzIHRvIHRoZSBleGlzdGluZyBvcmlub2NvCitkcml2ZXIuIFRoZSBvcmlub2NvIGRyaXZlciBjdXJyZW50bHkgb25seSBzdXBwb3J0cyBIZXJtZXMgSSBiYXNlZCBjYXJkcy4KK1NpbmNlIHRoaXMgd2lsbCBub3QgaGFwcGVuIGJ5IG1hZ2ljIGFuZCBoYXMgbm90IGhhcHBlbmQgdW50aWwgbm93IHRoaXMKK2RyaXZlciBwcm92aWRlcyBhIHN0b3AtZ2FwIHNvbHV0aW9uIGZvciB0aGVzZSB0eXBlIG9mIGNhcmRzLgorCitIYXZpbmcgc2FpZCB0aGF0LCB0aGUgZm9sbG93aW5nIHdpc2hsaXN0IGNvbWVzIHRvIG1pbmQgdG8gbWFrZSB0aGUgZHJpdmVyCitzdWl0YWJsZSBhcyBmdWxseSBzdXBwb3J0ZWQga2VybmVsIGRyaXZlci4gRmVlbCBmcmVlIHRvIGV4cGFuZC9lbmhhbmNlIHRoZQorbGlzdC4KKworVE9ETzoKKwktIHZlcmlmeSBhZ2FpbnN0IGEgSGVybWVzIElJLjUgY2FyZAorCS0gdmVyaWZ5IHdpdGggV1BBIGVuY3JpcHRpb24gKGJvdGggd2l0aCBIMiBhbmQgSDIuNSBjYXJkcykKKwktIHNvbWV0aW1lcyB0aGUgY2FyZCBkb2VzIG5vdCBpbml0aWFsaXplIGNvcnJlY3RseSwgcmV0cnkgbWVjaGFuaXNtcworCSAgYXJlIGJ1aWxkIGluIHRvIGNhdGNoIG1vc3QgY2FzZXMgYnV0IG5vdCBhbGwKKwktIG9uY2UgdGhlIGRyaXZlciBydW5zIGl0IGlzIHZlcnkgc3RhYmxlLCBidXQgSSBoYXZlIHRoZSBpbXByZXNzaW9uCisJICBzb21lIHRoZSBjcml0dGljYWwgc2VjdGlvbnMgdGFrZSB0byBsb25nCisJLSB0aGUgZHJpdmVyIGlzIHNwbGl0IGludG8gYSBIZXJtZXMgSUkgYW5kIGEgSGVybWVzIElJLjUgcGFydCwgaXQKKwkgIHdvdWxkIGJlIG5pY2UgdG8gaGFuZGxlIGJvdGggd2l0aCBvbmUgbW9kdWxlIGluc3RlYWQgb2YgdHdvCisJLSByZXZpZXcgYnkgdGhlIHdpcmVsZXNzIGRldmVsb3BlciBjb21tdW5pdHkKKwktIHZlcmlmeSB0aGUgY29kZSBhZ2FpbnN0IHRoZSBjb2Rpbmcgc3RhbmRhcmRzIGZvciBhIHByb3BwZXIgbGludXgKKwkgIGRyaXZlcgorCS0gcmVzb2x2ZSBsaWNlbnNlIGlzc3VlcyAoPykKKworRE9ORToKKwktIHZlcmlmaWVkIGFnYWluc3QgYSBIZXJtZXMgSUkgY2FyZCAoVGhvbXNvbiBTcGVlZHRvdWNoIDExMCBQQ01DSUEKKwkgIGNhcmQpCisJLSB2ZXJpZmllZCB3aXRoIFdFUCBlbmNyaXB0aW9uCisKK1BsZWFzZSBzZW5kIGFueSBwYXRjaGVzIG9yIGNvbXBsYWludHMgYWJvdXQgdGhpcyBkcml2ZXIgdG8gR3JlZworS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IGFuZCBDYzogSGVuayBkZSBHcm9vdCA8cGUxZG5uQGFtc2F0Lm9yZz4KK0Rvbid0IGJvdGhlciB0aGUgdXBzdHJlYW0gd2lyZWxlc3Mga2VybmVsIGRldmVsb3BlcnMgYWJvdXQgaXQsIHRoZXkKK3dhbnQgbm90aGluZyB0byBkbyB3aXRoIGl0LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvV0FSTklORy50eHQgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9XQVJOSU5HLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDEyOTczCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvV0FSTklORy50eHQKQEAgLTAsMCArMSwzIEBACitUaGVzZSBzb3VyY2VzIGFyZSBzaGFyZWQgd2l0aCB0aGUgd2xhZ3M0OV9oMjUgZHJpdmVyLiBTb21lIGZpbGVzIGFyZSBldmVuCitleGNsdXNpdmVseSB1c2VkIGJ5IHRoYXQgZHJpdmVyLiBEbyBub3QgZGVsZXRlIHRoZW0gaGVyZSB3aXRob3V0IGxvb2tpbmcKK2F0IHRoYXQgb3RoZXIgZHJpdmVyLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvYXBfaDIuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2FwX2gyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUxMjNkMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2FwX2gyLmMKQEAgLTAsMCArMSwzMzM3IEBACisvKgorICogRmlsZToJYXBfaDI0LjIzNgorICoKKyAqIEFic3RyYWN0OglUaGlzIGZpbGUgY29udGFpbnMgbWVtb3J5IGltYWdlICdmd19pbWFnZScuCisgKgorICogQ29udGVudHM6CVRvdGFsIHNpemUgb2YgdGhlIG1lbW9yeSBpbWFnZTogNTEwMTAgYnl0ZXMuCisgKgkJVG90YWwgbnVtYmVyIG9mIGJsb2NrczogNCBibG9ja3MuCisgKgkJQmxvY2sgIDEgOiBsb2FkIGFkZHJlc3MgMDAwMDAwNjAsIDMyNiBieXRlcy4KKyAqCQlCbG9jayAgMiA6IGxvYWQgYWRkcmVzcyAwMDAwMEMxNiwgNjQyNCBieXRlcy4KKyAqCQlCbG9jayAgMyA6IGxvYWQgYWRkcmVzcyAwMDFFMjUyRSwgNDQ0IGJ5dGVzLgorICoJCUJsb2NrICA0IDogbG9hZCBhZGRyZXNzIDAwMUY0MDAwLCA0MzgxNiBieXRlcy4KKyAqCisgKiBJZGVudGl0eToJY29tcG9uZW50IGlkOiAzMiAodmFyaWFudCAyKSB2ZXJzaW9uIDIuMzYKKyAqCisgKiBDb21wYXRpYmlsaXR5OgorICoJCXN1cHBseWluZyBpbnRlcmZhY2UgOCAodmFyaWFudCAyKSA6IDIgLSA0CisgKgkJYWN0aW5nIG9uIGludGVyZmFjZSAxICh2YXJpYW50IDQpIDogNiAtIDcKKyAqCQlhY3Rpbmcgb24gaW50ZXJmYWNlIDEgKHZhcmlhbnQgNSkgOiA2IC0gNworICoJCWFjdGluZyBvbiBpbnRlcmZhY2UgMSAodmFyaWFudCA2KSA6IDYgLSA3CisgKgkJYWN0aW5nIG9uIGludGVyZmFjZSAyICh2YXJpYW50IDIpIDogMSAtIDIKKyAqCisgKiBHZW5lcmF0ZWQ6CWJ5IGc6XGZ3XGZ1cHUzLmV4ZSB2ZXJzaW9uIDQuMjYKKyAqCisgKiBDb21tYW5kbGluZToJZzpcZndcZnVwdTMuZXhlIC9mPTQgL249ZndfaW1hZ2UgL2k9dDIwMjM2MDAuaGV4CisgKi8KKworCisjaW5jbHVkZSAiaGNmY2ZnLmgiCQkJCS8vIHRvIGdldCBoY2ZfMTYgZXRjIGRlZmluZWQgYXMgd2VsbCBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NzaWJsZSBzZXR0aW5ncyB3aGljaCBpbmx1ZW5jZSBtZGQuaCBvciBkaGYuaAorI2luY2x1ZGUgIm1kZC5oIiAgIAkJCQkvL3RvIGdldCBDT01QX0lEX1NUQSBldGMgZGVmaW5lZAorI2luY2x1ZGUgImRoZi5oIiAgIAkJCQkvL3VzZWQgdG8gYmUgImZoZm1lbS5oIiwgdG8gZ2V0IG1lbWJsb2NrLHBsdWdyZWNvcmQsCisKK3N0YXRpYyBjb25zdCBoY2ZfOCBmd19pbWFnZV8xX2RhdGFbXSA9IHsKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxQywgMHgwRCwgMHgwMCwgMHgwMCwKKwkgMHgzQSwgMHgwQywgMHgwMCwgMHgwMCwgMHgzQSwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgxQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDOCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQSwgMHgwMCwKKwkgMHgwQSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHhFQSwgMHgwMCwgMHgwMCwgMHhGRiwgMHgwNywgMHgwMiwgMHgwMCwgMHg2NCwgMHgwMCwgMHg2NCwgMHgwMCwgMHgxMCwgMHgyNywgMHgxMCwgMHgyNywKKwkgMHgxNCwgMHgwMCwgMHhEMCwgMHgwNywgMHhEMCwgMHgwNywgMHgxMCwgMHgyNywgMHgyRiwgMHgwMCwgMHgzMiwgMHgwMCwgMHgzMiwgMHgwMCwgMHgwNSwgMHgwMCwKKwkgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgxMCwgMHgyNywgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgxMywgMHgwMCwgMHgwQSwgMHgwMCwKKwkgMHgwNywgMHgwMCwgMHgwMywgMHgwMCwgMHgzMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQSwgMHgwOSwgMHgyQiwgMHgwOSwgMHgyQiwgMHgwOSwKKwkgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2RSwgMHgwMCwgMHgxNCwgMHgwMSwgMHgwMCwgMHg0MCwgMHgwMCwgMHgzMiwgMHgwMCwgMHgzMiwgMHgwMCwKKwkgMHgwQSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKworfTsgIC8qIGZ3X2ltYWdlXzFfZGF0YSAqLworCitzdGF0aWMgY29uc3QgaGNmXzggZndfaW1hZ2VfMl9kYXRhW10gPSB7CisJIDB4OUIsIDB4QTcsIDB4MDAsIDB4MEEsIDB4MTAsIDB4MDEsIDB4NjgsIDB4QTQsIDB4QjAsIDB4MDEsIDB4ODQsIDB4MDEsIDB4MzAsIDB4MzMsIDB4MzEsIDB4MzMsCisJIDB4NDQsIDB4NDQsIDB4MzAsIDB4MzMsIDB4MzEsIDB4MzMsIDB4MzAsIDB4MzMsIDB4MzEsIDB4MzMsIDB4MzIsIDB4MzMsIDB4MzIsIDB4MzMsIDB4OTAsIDB4MDAsCisJIDB4NzgsIDB4MDQsIDB4QUUsIDB4RTQsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsCisJIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTUsIDB4QzYsIDB4ODQsIDB4RjgsIDB4OTksIDB4RUUsCisJIDB4OEQsIDB4RjYsIDB4MEQsIDB4RkYsIDB4QkQsIDB4RDYsIDB4QjEsIDB4REUsIDB4NTQsIDB4OTEsIDB4NTAsIDB4NjAsIDB4MDMsIDB4MDIsIDB4QTksIDB4Q0UsCisJIDB4N0QsIDB4NTYsIDB4MTksIDB4RTcsIDB4NjIsIDB4QjUsIDB4RTYsIDB4NEQsIDB4OUEsIDB4RUMsIDB4NDUsIDB4OEYsIDB4OUQsIDB4MUYsIDB4NDAsIDB4ODksCisJIDB4ODcsIDB4RkEsIDB4MTUsIDB4RUYsIDB4RUIsIDB4QjIsIDB4QzksIDB4OEUsIDB4MEIsIDB4RkIsIDB4RUMsIDB4NDEsIDB4NjcsIDB4QjMsIDB4RkQsIDB4NUYsCisJIDB4RUEsIDB4NDUsIDB4QkYsIDB4MjMsIDB4RjcsIDB4NTMsIDB4OTYsIDB4RTQsIDB4NUIsIDB4OUIsIDB4QzIsIDB4NzUsIDB4MUMsIDB4RTEsIDB4QUUsIDB4M0QsCisJIDB4NkEsIDB4NEMsIDB4NUEsIDB4NkMsIDB4NDEsIDB4N0UsIDB4MDIsIDB4RjUsIDB4NEYsIDB4ODMsIDB4NUMsIDB4NjgsIDB4RjQsIDB4NTEsIDB4MzQsIDB4RDEsCisJIDB4MDgsIDB4RjksIDB4OTMsIDB4RTIsIDB4NzMsIDB4QUIsIDB4NTMsIDB4NjIsIDB4M0YsIDB4MkEsIDB4MEMsIDB4MDgsIDB4NTIsIDB4OTUsIDB4NjUsIDB4NDYsCisJIDB4NUUsIDB4OUQsIDB4MjgsIDB4MzAsIDB4QTEsIDB4MzcsIDB4MEYsIDB4MEEsIDB4QjUsIDB4MkYsIDB4MDksIDB4MEUsIDB4MzYsIDB4MjQsIDB4OUIsIDB4MUIsCisJIDB4M0QsIDB4REYsIDB4MjYsIDB4Q0QsIDB4NjksIDB4NEUsIDB4Q0QsIDB4N0YsIDB4OUYsIDB4RUEsIDB4MUIsIDB4MTIsIDB4OUUsIDB4MUQsIDB4NzQsIDB4NTgsCisJIDB4MkUsIDB4MzQsIDB4MkQsIDB4MzYsIDB4QjIsIDB4REMsIDB4RUUsIDB4QjQsIDB4RkIsIDB4NUIsIDB4RjYsIDB4QTQsIDB4NEQsIDB4NzYsIDB4NjEsIDB4QjcsCisJIDB4Q0UsIDB4N0QsIDB4N0IsIDB4NTIsIDB4M0UsIDB4REQsIDB4NzEsIDB4NUUsIDB4OTcsIDB4MTMsIDB4RjUsIDB4QTYsIDB4NjgsIDB4QjksIDB4MDAsIDB4MDAsCisJIDB4MkMsIDB4QzEsIDB4NjAsIDB4NDAsIDB4MUYsIDB4RTMsIDB4QzgsIDB4NzksIDB4RUQsIDB4QjYsIDB4QkUsIDB4RDQsIDB4NDYsIDB4OEQsIDB4RDksIDB4NjcsCisJIDB4NEIsIDB4NzIsIDB4REUsIDB4OTQsIDB4RDQsIDB4OTgsIDB4RTgsIDB4QjAsIDB4NEEsIDB4ODUsIDB4NkIsIDB4QkIsIDB4MkEsIDB4QzUsIDB4RTUsIDB4NEYsCisJIDB4MTYsIDB4RUQsIDB4QzUsIDB4ODYsIDB4RDcsIDB4OUEsIDB4NTUsIDB4NjYsIDB4OTQsIDB4MTEsIDB4Q0YsIDB4OEEsIDB4MTAsIDB4RTksIDB4MDYsIDB4MDQsCisJIDB4ODEsIDB4RkUsIDB4RjAsIDB4QTAsIDB4NDQsIDB4NzgsIDB4QkEsIDB4MjUsIDB4RTMsIDB4NEIsIDB4RjMsIDB4QTIsIDB4RkUsIDB4NUQsIDB4QzAsIDB4ODAsCisJIDB4OEEsIDB4MDUsIDB4QUQsIDB4M0YsIDB4QkMsIDB4MjEsIDB4NDgsIDB4NzAsIDB4MDQsIDB4RjEsIDB4REYsIDB4NjMsIDB4QzEsIDB4NzcsIDB4NzUsIDB4QUYsCisJIDB4NjMsIDB4NDIsIDB4MzAsIDB4MjAsIDB4MUEsIDB4RTUsIDB4MEUsIDB4RkQsIDB4NkQsIDB4QkYsIDB4NEMsIDB4ODEsIDB4MTQsIDB4MTgsIDB4MzUsIDB4MjYsCisJIDB4MkYsIDB4QzMsIDB4RTEsIDB4QkUsIDB4QTIsIDB4MzUsIDB4Q0MsIDB4ODgsIDB4MzksIDB4MkUsIDB4NTcsIDB4OTMsIDB4RjIsIDB4NTUsIDB4ODIsIDB4RkMsCisJIDB4NDcsIDB4N0EsIDB4QUMsIDB4QzgsIDB4RTcsIDB4QkEsIDB4MkIsIDB4MzIsIDB4OTUsIDB4RTYsIDB4QTAsIDB4QzAsIDB4OTgsIDB4MTksIDB4RDEsIDB4OUUsCisJIDB4N0YsIDB4QTMsIDB4NjYsIDB4NDQsIDB4N0UsIDB4NTQsIDB4QUIsIDB4M0IsIDB4ODMsIDB4MEIsIDB4Q0EsIDB4OEMsIDB4MjksIDB4QzcsIDB4RDMsIDB4NkIsCisJIDB4M0MsIDB4MjgsIDB4NzksIDB4QTcsIDB4RTIsIDB4QkMsIDB4MUQsIDB4MTYsIDB4NzYsIDB4QUQsIDB4M0IsIDB4REIsIDB4NTYsIDB4NjQsIDB4NEUsIDB4NzQsCisJIDB4MUUsIDB4MTQsIDB4REIsIDB4OTIsIDB4MEEsIDB4MEMsIDB4NkMsIDB4NDgsIDB4RTQsIDB4QjgsIDB4NUQsIDB4OUYsIDB4NkUsIDB4QkQsIDB4RUYsIDB4NDMsCisJIDB4QTYsIDB4QzQsIDB4QTgsIDB4MzksIDB4QTQsIDB4MzEsIDB4MzcsIDB4RDMsIDB4OEIsIDB4RjIsIDB4MzIsIDB4RDUsIDB4NDMsIDB4OEIsIDB4NTksIDB4NkUsCisJIDB4QjcsIDB4REEsIDB4OEMsIDB4MDEsIDB4NjQsIDB4QjEsIDB4RDIsIDB4OUMsIDB4RTAsIDB4NDksIDB4QjQsIDB4RDgsIDB4RkEsIDB4QUMsIDB4MDcsIDB4RjMsCisJIDB4MjUsIDB4Q0YsIDB4QUYsIDB4Q0EsIDB4OEUsIDB4RjQsIDB4RTksIDB4NDcsIDB4MTgsIDB4MTAsIDB4RDUsIDB4NkYsIDB4ODgsIDB4RjAsIDB4NkYsIDB4NEEsCisJIDB4NzIsIDB4NUMsIDB4MjQsIDB4MzgsIDB4RjEsIDB4NTcsIDB4QzcsIDB4NzMsIDB4NTEsIDB4OTcsIDB4MjMsIDB4Q0IsIDB4N0MsIDB4QTEsIDB4OUMsIDB4RTgsCisJIDB4MjEsIDB4M0UsIDB4REQsIDB4OTYsIDB4REMsIDB4NjEsIDB4ODYsIDB4MEQsIDB4ODUsIDB4MEYsIDB4OTAsIDB4RTAsIDB4NDIsIDB4N0MsIDB4QzQsIDB4NzEsCisJIDB4QUEsIDB4Q0MsIDB4RDgsIDB4OTAsIDB4MDUsIDB4MDYsIDB4MDEsIDB4RjcsIDB4MTIsIDB4MUMsIDB4QTMsIDB4QzIsIDB4NUYsIDB4NkEsIDB4RjksIDB4QUUsCisJIDB4RDAsIDB4NjksIDB4OTEsIDB4MTcsIDB4NTgsIDB4OTksIDB4MjcsIDB4M0EsIDB4QjksIDB4MjcsIDB4MzgsIDB4RDksIDB4MTMsIDB4RUIsIDB4QjMsIDB4MkIsCisJIDB4MzMsIDB4MjIsIDB4QkIsIDB4RDIsIDB4NzAsIDB4QTksIDB4ODksIDB4MDcsIDB4QTcsIDB4MzMsIDB4QjYsIDB4MkQsIDB4MjIsIDB4M0MsIDB4OTIsIDB4MTUsCisJIDB4MjAsIDB4QzksIDB4NDksIDB4ODcsIDB4RkYsIDB4QUEsIDB4NzgsIDB4NTAsIDB4N0EsIDB4QTUsIDB4OEYsIDB4MDMsIDB4RjgsIDB4NTksIDB4ODAsIDB4MDksCisJIDB4MTcsIDB4MUEsIDB4REEsIDB4NjUsIDB4MzEsIDB4RDcsIDB4QzYsIDB4ODQsIDB4QjgsIDB4RDAsIDB4QzMsIDB4ODIsIDB4QjAsIDB4MjksIDB4NzcsIDB4NUEsCisJIDB4MTEsIDB4MUUsIDB4Q0IsIDB4N0IsIDB4RkMsIDB4QTgsIDB4RDYsIDB4NkQsIDB4M0EsIDB4MkMsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MzEsIDB4MDAsIDB4MzMsCisJIDB4MDAsIDB4MzQsIDB4MDAsIDB4MzUsIDB4MDAsIDB4MzYsIDB4MDAsIDB4MzcsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MzgsIDB4MDAsIDB4M0EsIDB4MDAsIDB4M0IsCisJIDB4MDAsIDB4M0MsIDB4MDAsIDB4M0QsIDB4MDAsIDB4M0UsIDB4MDAsIDB4M0YsIDB4MDAsIDB4M0YsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MEEsIDB4MDIsIDB4MTQsCisJIDB4MDUsIDB4MzIsIDB4MEIsIDB4MzcsIDB4MDgsIDB4NTAsIDB4MEIsIDB4NkUsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4M0YsIDB4MDAsCisJIDB4MEMsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MEYsIDB4MDAsIDB4M0UsIDB4MDAsIDB4M0MsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDQsIDB4MDAsCisJIDB4MEEsIDB4MDAsIDB4MEIsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NjMsIDB4MDAsIDB4NjMsIDB4MDAsIDB4MjAsIDB4MDAsIDB4NjMsIDB4MDAsIDB4NjMsIDB4MDAsIDB4MjAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MEEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTAsIDB4MTAsCisJIDB4OUUsIDB4MTAsIDB4NTYsIDB4MTAsIDB4OTgsIDB4MTAsIDB4NUMsIDB4MTAsIDB4OTIsIDB4MTAsIDB4NjIsIDB4MTAsIDB4OEMsIDB4MTAsIDB4NjgsIDB4MTAsCisJIDB4ODYsIDB4MTAsIDB4NkUsIDB4MTAsIDB4ODAsIDB4MTAsIDB4NzQsIDB4MTAsIDB4N0EsIDB4MTAsIDB4MDcsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MjIsCisJIDB4MDAsIDB4MDQsIDB4MDgsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MjYsIDB4MDAsIDB4MDQsIDB4MDksIDB4MDEsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MkEsCisJIDB4MDAsIDB4MDQsIDB4MEEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MkUsIDB4MDAsIDB4MDQsIDB4MEIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MjQsCisJIDB4MDQsIDB4MDQsIDB4MEMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MjgsIDB4MDQsIDB4MDQsIDB4MEQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MkMsCisJIDB4MDQsIDB4MDQsIDB4MEUsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MzAsIDB4MDQsIDB4MDQsIDB4MEYsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTYsIDB4MzQsCisJIDB4MDgsIDB4MDQsIDB4MTAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTYsIDB4MzgsIDB4MDgsIDB4MDQsIDB4MTEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTYsIDB4M0MsCisJIDB4MDgsIDB4MDQsIDB4MTIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTYsIDB4NDAsIDB4MDgsIDB4MDQsIDB4MTMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NjQsCisJIDB4MEMsIDB4MEIsIDB4MTQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NjgsIDB4MEMsIDB4MEIsIDB4MTUsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NkMsCisJIDB4MEMsIDB4MEIsIDB4MTYsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NzAsIDB4MEMsIDB4MEIsIDB4MTcsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NzQsCisJIDB4MEMsIDB4MEIsIDB4MTgsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NzgsIDB4MEMsIDB4MEIsIDB4MTksIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4N0MsCisJIDB4MEMsIDB4MEIsIDB4MUEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4ODAsIDB4MEMsIDB4MEIsIDB4MUIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4ODQsCisJIDB4MEMsIDB4MEIsIDB4MUMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4ODgsIDB4MEMsIDB4MEIsIDB4MUQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4OEMsCisJIDB4MEMsIDB4MEIsIDB4MUUsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MUQsIDB4OTUsIDB4MTcsIDB4MDQsIDB4MUYsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MUQsIDB4OTksCisJIDB4MTcsIDB4MDQsIDB4MjAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MUQsIDB4OUQsIDB4MTcsIDB4MDQsIDB4MjEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MUQsIDB4QTEsCisJIDB4MTcsIDB4MDQsIDB4MjIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MEUsIDB4QTUsIDB4MDAsIDB4MDAsIDB4QzAsIDB4MTAsIDB4RTAsIDB4MTAsIDB4MDAsIDB4MTEsCisJIDB4MjAsIDB4MTEsIDB4NzgsIDB4MTEsIDB4QzgsIDB4MTAsIDB4RTgsIDB4MTAsIDB4MDgsIDB4MTEsIDB4MjgsIDB4MTEsIDB4ODAsIDB4MTEsIDB4RDAsIDB4MTAsCisJIDB4RjAsIDB4MTAsIDB4MTAsIDB4MTEsIDB4MzAsIDB4MTEsIDB4ODgsIDB4MTEsIDB4RDgsIDB4MTAsIDB4RjgsIDB4MTAsIDB4MTgsIDB4MTEsIDB4MzgsIDB4MTEsCisJIDB4OTAsIDB4MTEsIDB4NDAsIDB4MTEsIDB4NDgsIDB4MTEsIDB4NTAsIDB4MTEsIDB4NTgsIDB4MTEsIDB4NjAsIDB4MTEsIDB4NjgsIDB4MTEsIDB4NzAsIDB4MTEsCisJIDB4OTgsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDIsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4RUIsIDB4QkEsIDB4RUIsCisJIDB4REYsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsCisJIDB4NTcsIDB4RUIsIDB4OTAsIDB4RjEsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4RDYsIDB4RUQsCisJIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsCisJIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4MkYsIDB4RUUsCisJIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsCisJIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4QTQsIDB4RUQsIDB4QkUsIDB4RUQsCisJIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4N0YsIDB4RjQsIDB4MTksIDB4RUMsCisJIDB4MkMsIDB4RUMsIDB4REMsIDB4RUMsIDB4RTAsIDB4RUMsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4OEYsIDB4RUQsIDB4ODQsIDB4RTMsIDB4NTksIDB4RTMsCisJIDB4RDcsIDB4RTMsIDB4MjgsIDB4RTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4RUIsIDB4RjYsIDB4RUIsIDB4NzIsIDB4RjAsIDB4NzIsIDB4RjAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RkMsIDB4ODksIDB4RUUsIDB4NDUsIDB4RjAsIDB4NUEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RjksIDB4RkYsCisJIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4Q0MsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RjcsIDB4RkYsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4QjYsIDB4MUYsCisJIDB4MDYsIDB4MDAsIDB4RjAsIDB4RkYsIDB4ODksIDB4RUUsIDB4NzMsIDB4RUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4RjYsIDB4RkYsIDB4ODksIDB4RUUsCisJIDB4OUYsIDB4RUUsIDB4NkMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RjQsIDB4RkYsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4NkEsIDB4MDEsIDB4MDIsIDB4MDAsCisJIDB4RjUsIDB4RkYsIDB4ODksIDB4RUUsIDB4NEUsIDB4RjAsIDB4QTgsIDB4MUYsIDB4MDIsIDB4MDAsIDB4RTAsIDB4RkYsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsCisJIDB4RUUsIDB4MjEsIDB4MDIsIDB4MDAsIDB4RTEsIDB4RkYsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4RjAsIDB4MjEsIDB4MDIsIDB4MDAsIDB4RTIsIDB4RkYsCisJIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4RjIsIDB4MjEsIDB4MDIsIDB4MDAsIDB4RTMsIDB4RkYsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4RUEsIDB4MjEsCisJIDB4MDIsIDB4MDAsIDB4MDMsIDB4RkMsIDB4ODksIDB4RUUsIDB4RTUsIDB4RUYsIDB4N0MsIDB4MjEsIDB4MDIsIDB4MDAsIDB4MDQsIDB4RkMsIDB4ODksIDB4RUUsCisJIDB4OTksIDB4RUUsIDB4QkUsIDB4MUYsIDB4MjIsIDB4MDAsIDB4MDYsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4QTYsIDB4MUYsIDB4MDIsIDB4MDAsCisJIDB4MDcsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4MDIsIDB4MjAsIDB4MDIsIDB4MDAsIDB4MEUsIDB4RkMsIDB4ODksIDB4RUUsIDB4RjcsIDB4RUYsCisJIDB4MEMsIDB4MjAsIDB4MjIsIDB4MDAsIDB4QjEsIDB4RkMsIDB4ODksIDB4RUUsIDB4NTgsIDB4RjIsIDB4MkMsIDB4MjEsIDB4MDIsIDB4MDAsIDB4MjAsIDB4RkMsCisJIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4MzIsIDB4MjAsIDB4MDIsIDB4MDAsIDB4MjUsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4M0MsIDB4MjAsCisJIDB4MDIsIDB4MDAsIDB4MjYsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4M0UsIDB4MjAsIDB4MDIsIDB4MDAsIDB4MjcsIDB4RkMsIDB4ODksIDB4RUUsCisJIDB4OUYsIDB4RUUsIDB4NDAsIDB4MjAsIDB4MDIsIDB4MDAsIDB4QjIsIDB4RkMsIDB4ODksIDB4RUUsIDB4OTksIDB4RUUsIDB4NTAsIDB4MjEsIDB4MjIsIDB4MDAsCisJIDB4QzEsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4OTgsIDB4MjEsIDB4MjAsIDB4MDAsIDB4QjAsIDB4RkMsIDB4NjksIDB4RUUsIDB4NUQsIDB4RjIsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzQsIDB4RkMsIDB4NjksIDB4RUUsIDB4NjgsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4QzgsIDB4RkMsCisJIDB4NjksIDB4RUUsIDB4NjMsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4QjQsIDB4RkMsIDB4NjksIDB4RUUsIDB4OUIsIDB4RjIsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4QjYsIDB4RkMsIDB4NjksIDB4RUUsIDB4NEUsIDB4RjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjcsIDB4RkMsIDB4NjksIDB4RUUsCisJIDB4OTAsIDB4RjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjgsIDB4RkMsIDB4NjksIDB4RUUsIDB4RUQsIDB4RjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4QjUsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4RTYsIDB4MjEsIDB4MDIsIDB4MDAsIDB4QjksIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsCisJIDB4RTgsIDB4MjEsIDB4MDIsIDB4MDAsIDB4OTAsIDB4RkQsIDB4ODksIDB4RUUsIDB4NzMsIDB4RUUsIDB4RUMsIDB4MjEsIDB4MDIsIDB4MDAsIDB4MjMsIDB4RkMsCisJIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4MzgsIDB4MjAsIDB4MDIsIDB4MDAsIDB4MjksIDB4RkMsIDB4NDgsIDB4RUYsIDB4RjUsIDB4RUUsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4QzIsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4NzQsIDB4MjEsIDB4MDIsIDB4MDAsIDB4MzIsIDB4RkMsIDB4ODksIDB4RUUsCisJIDB4OUYsIDB4RUUsIDB4NjAsIDB4MDEsIDB4MDIsIDB4MDAsIDB4MzMsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4NjIsIDB4MDEsIDB4MDIsIDB4MDAsCisJIDB4MTAsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4QUUsIDB4MUYsIDB4MDIsIDB4MDAsIDB4MTEsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsCisJIDB4NDYsIDB4MjAsIDB4MDYsIDB4MDAsIDB4MTIsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4NEMsIDB4MjAsIDB4MDYsIDB4MDAsIDB4MTMsIDB4RkMsCisJIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4NTIsIDB4MjAsIDB4MDYsIDB4MDAsIDB4MTQsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4NTgsIDB4MjAsCisJIDB4MDYsIDB4MDAsIDB4MTUsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4NUUsIDB4MjAsIDB4MDYsIDB4MDAsIDB4MTYsIDB4RkMsIDB4ODksIDB4RUUsCisJIDB4OUYsIDB4RUUsIDB4NjQsIDB4MjAsIDB4MDYsIDB4MDAsIDB4MTcsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4MkUsIDB4MjAsIDB4MDIsIDB4MDAsCisJIDB4ODMsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4NkUsIDB4MDEsIDB4MDIsIDB4MDAsIDB4OTcsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsCisJIDB4NkMsIDB4MDEsIDB4MDIsIDB4MDAsIDB4OTgsIDB4RkMsIDB4MzEsIDB4RjAsIDB4MUYsIDB4RjAsIDB4RTQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4OTksIDB4RkMsCisJIDB4MzEsIDB4RjAsIDB4MUYsIDB4RjAsIDB4RTQsIDB4MDIsIDB4MDIsIDB4MDAsIDB4OUEsIDB4RkMsIDB4MzEsIDB4RjAsIDB4MUYsIDB4RjAsIDB4RTQsIDB4MDQsCisJIDB4MDIsIDB4MDAsIDB4OUIsIDB4RkMsIDB4MzEsIDB4RjAsIDB4MUYsIDB4RjAsIDB4RTQsIDB4MDYsIDB4MDIsIDB4MDAsIDB4OUMsIDB4RkMsIDB4MzEsIDB4RjAsCisJIDB4MUYsIDB4RjAsIDB4RTQsIDB4MDgsIDB4MDIsIDB4MDAsIDB4OUQsIDB4RkMsIDB4MzEsIDB4RjAsIDB4MUYsIDB4RjAsIDB4RTQsIDB4MEEsIDB4MDIsIDB4MDAsCisJIDB4MTgsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4MzAsIDB4MjAsIDB4MDIsIDB4MDAsIDB4MjIsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsCisJIDB4MzYsIDB4MjAsIDB4MDIsIDB4MDAsIDB4MjQsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4M0EsIDB4MjAsIDB4MDIsIDB4MDAsIDB4QzAsIDB4RkMsCisJIDB4NjksIDB4RUUsIDB4NjEsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4OUUsIDB4RkMsIDB4ODksIDB4RUUsIDB4MTcsIDB4RjAsIDB4NzAsIDB4MDEsCisJIDB4MDIsIDB4MDAsIDB4OUYsIDB4RkMsIDB4MzEsIDB4RjAsIDB4MUYsIDB4RjAsIDB4RTYsIDB4MDAsIDB4MDIsIDB4MDAsIDB4QTAsIDB4RkMsIDB4MzEsIDB4RjAsCisJIDB4MUYsIDB4RjAsIDB4RTYsIDB4MDIsIDB4MDIsIDB4MDAsIDB4QTEsIDB4RkMsIDB4MzEsIDB4RjAsIDB4MUYsIDB4RjAsIDB4RTYsIDB4MDQsIDB4MDIsIDB4MDAsCisJIDB4QTIsIDB4RkMsIDB4MzEsIDB4RjAsIDB4MUYsIDB4RjAsIDB4RTYsIDB4MDYsIDB4MDIsIDB4MDAsIDB4QTMsIDB4RkMsIDB4MzEsIDB4RjAsIDB4MUYsIDB4RjAsCisJIDB4RTYsIDB4MDgsIDB4MDIsIDB4MDAsIDB4QTQsIDB4RkMsIDB4MzEsIDB4RjAsIDB4MUYsIDB4RjAsIDB4RTYsIDB4MEEsIDB4MDIsIDB4MDAsIDB4MjAsIDB4RkQsCisJIDB4QkEsIDB4RUUsIDB4NzMsIDB4RUUsIDB4NTMsIDB4RjUsIDB4MDgsIDB4MDAsIDB4MjEsIDB4RkQsIDB4QkEsIDB4RUUsIDB4NzMsIDB4RUUsIDB4NTcsIDB4RjUsCisJIDB4MEEsIDB4MDAsIDB4MjIsIDB4RkQsIDB4QkEsIDB4RUUsIDB4NzMsIDB4RUUsIDB4NUMsIDB4RjUsIDB4MTYsIDB4MDAsIDB4MjMsIDB4RkQsIDB4QkEsIDB4RUUsCisJIDB4NzMsIDB4RUUsIDB4NjcsIDB4RjUsIDB4MEEsIDB4MDAsIDB4MTAsIDB4RkQsIDB4ODksIDB4RUUsIDB4NzMsIDB4RUUsIDB4MzQsIDB4MDEsIDB4MDIsIDB4MDAsCisJIDB4NDUsIDB4RkQsIDB4ODksIDB4RUUsIDB4NzMsIDB4RUUsIDB4Q0MsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NDcsIDB4RkQsIDB4ODksIDB4RUUsIDB4NzMsIDB4RUUsCisJIDB4MzgsIDB4MDEsIDB4MDIsIDB4MDAsIDB4NDgsIDB4RkQsIDB4OUUsIDB4RUYsIDB4NzMsIDB4RUUsIDB4NjAsIDB4MDEsIDB4MDIsIDB4MDAsIDB4NDksIDB4RkQsCisJIDB4OUUsIDB4RUYsIDB4NzMsIDB4RUUsIDB4NjIsIDB4MDEsIDB4MDIsIDB4MDAsIDB4NEEsIDB4RkQsIDB4ODksIDB4RUUsIDB4NzMsIDB4RUUsIDB4NTgsIDB4MDEsCisJIDB4MDIsIDB4MDAsIDB4NEIsIDB4RkQsIDB4ODksIDB4RUUsIDB4NzMsIDB4RUUsIDB4NUEsIDB4MDEsIDB4MDIsIDB4MDAsIDB4NEQsIDB4RkQsIDB4QkEsIDB4RUUsCisJIDB4NzMsIDB4RUUsIDB4NkMsIDB4RjUsIDB4MDQsIDB4MDAsIDB4NEYsIDB4RkQsIDB4QjIsIDB4RUYsIDB4NzMsIDB4RUUsIDB4ODAsIDB4MjEsIDB4MDIsIDB4MDAsCisJIDB4QzAsIDB4RkQsIDB4QkEsIDB4RUUsIDB4NzMsIDB4RUUsIDB4NkUsIDB4RjUsIDB4MDIsIDB4MDAsIDB4QzIsIDB4RkQsIDB4QTgsIDB4RUYsIDB4NzMsIDB4RUUsCisJIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4QzMsIDB4RkQsIDB4QkEsIDB4RUUsIDB4NzMsIDB4RUUsIDB4NkYsIDB4RjUsIDB4MDIsIDB4MDAsIDB4NDAsIDB4RkQsCisJIDB4QjIsIDB4RUUsIDB4NzMsIDB4RUUsIDB4NzgsIDB4MDEsIDB4MDIsIDB4MDAsIDB4MjQsIDB4RkQsIDB4RDgsIDB4RUYsIDB4NzMsIDB4RUUsIDB4MDAsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4OTEsIDB4RkQsIDB4ODksIDB4RUUsIDB4NzMsIDB4RUUsIDB4ODYsIDB4MUIsIDB4MDIsIDB4MDAsIDB4OTMsIDB4RkQsIDB4ODksIDB4RUUsCisJIDB4NzMsIDB4RUUsIDB4OEMsIDB4MUIsIDB4MDIsIDB4MDAsIDB4QzEsIDB4RkQsIDB4ODksIDB4RUUsIDB4NzMsIDB4RUUsIDB4Q0EsIDB4MDAsIDB4MDIsIDB4MDAsCisJIDB4QzYsIDB4RkQsIDB4RTcsIDB4RUUsIDB4NzMsIDB4RUUsIDB4OEUsIDB4MjEsIDB4MEEsIDB4MDAsIDB4ODksIDB4RkQsIDB4NUYsIDB4RUYsIDB4NzMsIDB4RUUsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4RkQsIDB4RDcsIDB4RUUsIDB4NzMsIDB4RUUsIDB4QzAsIDB4MjEsIDB4MjQsIDB4MDAsIDB4NDYsIDB4RkQsCisJIDB4ODksIDB4RUUsIDB4NzMsIDB4RUUsIDB4N0EsIDB4MDEsIDB4MDYsIDB4MDAsIDB4ODYsIDB4RkQsIDB4ODksIDB4RUUsIDB4NzMsIDB4RUUsIDB4QjYsIDB4MUYsCisJIDB4MDYsIDB4MDAsIDB4ODcsIDB4RkQsIDB4ODksIDB4RUUsIDB4NzMsIDB4RUUsIDB4QjgsIDB4MjEsIDB4MDYsIDB4MDAsIDB4OEIsIDB4RkQsIDB4N0EsIDB4RjMsCisJIDB4NzMsIDB4RUUsIDB4MDAsIDB4MDAsIDB4MTIsIDB4MDAsIDB4OEUsIDB4RkQsIDB4ODksIDB4RUUsIDB4NzMsIDB4RUUsIDB4QjgsIDB4MTIsIDB4MDIsIDB4MDAsCisJIDB4ODAsIDB4RkQsIDB4QkMsIDB4RUYsIDB4NzMsIDB4RUUsIDB4MUMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4ODEsIDB4RkQsIDB4QkMsIDB4RUYsIDB4NzMsIDB4RUUsCisJIDB4MUMsIDB4MDIsIDB4MDIsIDB4MDAsIDB4ODIsIDB4RkQsIDB4QkMsIDB4RUYsIDB4NzMsIDB4RUUsIDB4MUMsIDB4MDQsIDB4MDIsIDB4MDAsIDB4ODMsIDB4RkQsCisJIDB4QkMsIDB4RUYsIDB4NzMsIDB4RUUsIDB4MUMsIDB4MDYsIDB4MDIsIDB4MDAsIDB4ODQsIDB4RkQsIDB4QkMsIDB4RUYsIDB4NzMsIDB4RUUsIDB4MUMsIDB4MDgsCisJIDB4MDIsIDB4MDAsIDB4ODUsIDB4RkQsIDB4QkMsIDB4RUYsIDB4NzMsIDB4RUUsIDB4MUMsIDB4MEEsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjEsIDB4NDYsIDB4MDAsCisJIDB4MkQsIDB4RUUsIDB4RjgsIDB4MDAsIDB4MDAsIDB4MDMsIDB4OEEsIDB4RUEsIDB4MUYsIDB4MDAsIDB4MzYsIDB4MDEsIDB4Q0EsIDB4MDAsIDB4OTYsIDB4MDEsCisJIDB4Q0UsIDB4MDAsIDB4RkMsIDB4MDAsIDB4NzgsIDB4MDEsIDB4REEsIDB4MUUsIDB4MUEsIDB4MDEsIDB4ODYsIDB4MUIsIDB4QzgsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4Q0UsIDB4MTIsIDB4MDAsIDB4MDAsIDB4RDIsIDB4MTQsIDB4MTQsIDB4MDEsIDB4MDMsIDB4MDAsIDB4QUUsIDB4MDAsIDB4RTQsIDB4MDAsIDB4M0MsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4NzcsIDB4QjQsIDB4RUEsIDB4QjMsIDB4MjYsIDB4QjUsIDB4MkYsIDB4QjUsIDB4RkIsIDB4QjMsIDB4QTQsIDB4QjQsIDB4NjksIDB4QjQsIDB4RTcsIDB4QzUsCisJIDB4NEEsIDB4QzUsIDB4RTcsIDB4QzUsIDB4QkUsIDB4QzUsIDB4NTQsIDB4QzUsIDB4NDgsIDB4QzUsIDB4MDYsIDB4QzYsIDB4MTcsIDB4QzYsIDB4MTcsIDB4QzYsCisJIDB4MTcsIDB4QzYsIDB4MjAsIDB4QzYsIDB4M0IsIDB4QzYsIDB4OTgsIDB4QzYsIDB4QjQsIDB4QzYsIDB4QkYsIDB4QzUsIDB4RDIsIDB4QzUsIDB4QTYsIDB4QzUsCisJIDB4MTAsIDB4MDAsIDB4MTIsIDB4MDAsIDB4MTMsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MjEsIDB4MDAsIDB4MjIsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MzEsIDB4MDAsCisJIDB4MzIsIDB4MDAsIDB4MzMsIDB4MDAsIDB4MzQsIDB4MDAsIDB4MzUsIDB4MDAsIDB4MzYsIDB4MDAsIDB4MzcsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MzksIDB4MDAsCisJIDB4M0EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsCisJIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsIDB4RjMsIDB4MDIsIDB4QUQsIDB4MDMsIDB4NjAsIDB4MDQsIDB4MDQsIDB4MDUsIDB4MDcsIDB4MDYsIDB4MDgsIDB4MDcsCisJIDB4MEEsIDB4MDgsIDB4MTYsIDB4MDksIDB4NDQsIDB4MEEsIDB4MDQsIDB4MEIsIDB4NDAsIDB4MEMsIDB4ODAsIDB4MEQsIDB4MDAsIDB4MEUsIDB4ODQsIDB4MEYsCisJIDB4MDEsIDB4MTAsIDB4MTAsIDB4MTEsIDB4MDIsIDB4MTQsIDB4NDAsIDB4MjAsIDB4MzIsIDB4MjEsIDB4MzIsIDB4MjIsIDB4MDQsIDB4MjMsIDB4MDEsIDB4MjQsCisJIDB4MEYsIDB4MjUsIDB4MDAsIDB4MjYsIDB4MDAsIDB4MjcsIDB4MDAsIDB4MjgsIDB4MDAsIDB4MjksIDB4MDAsIDB4MkEsIDB4MDEsIDB4MkIsIDB4MDYsIDB4MkMsCisJIDB4MDAsIDB4MzgsIDB4MDAsIDB4MzksIDB4RDYsIDB4M0EsIDB4MDAsIDB4M0IsIDB4MDAsIDB4M0MsIDB4MTQsIDB4M0QsIDB4N0YsIDB4M0UsIDB4MDAsIDB4M0YsCisJIDB4NjgsIDB4NDAsIDB4NzUsIDB4NDEsIDB4MDcsIDB4NDIsIDB4MDcsIDB4NDMsIDB4MDAsIDB4NDUsIDB4M0IsIDB4NEEsIDB4MDAsIDB4NEIsIDB4MDAsIDB4NEMsCisJIDB4MEYsIDB4NEQsIDB4MDIsIDB4NzUsIDB4MDAsIDB4NzYsIDB4ODAsIDB4MDAsIDB4MDgsIDB4MDEsIDB4MDksIDB4MDEsIDB4MDksIDB4MDEsIDB4MEEsIDB4MDEsCisJIDB4MEEsIDB4MDEsIDB4MEIsIDB4MDEsIDB4MEIsIDB4MDEsIDB4MEMsIDB4MDEsIDB4MEMsIDB4MDEsIDB4MEQsIDB4MDEsIDB4MEQsIDB4MDEsIDB4MEUsIDB4MDEsCisJIDB4MEUsIDB4MDEsIDB4MEYsIDB4MDEsIDB4MEYsIDB4MDEsIDB4MTAsIDB4MDEsIDB4MTAsIDB4MDEsIDB4MTEsIDB4MDEsIDB4MTEsIDB4MDEsIDB4MTIsIDB4MDEsCisJIDB4MTIsIDB4MDEsIDB4MTMsIDB4MDEsIDB4MTMsIDB4MDEsIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsIDB4MTUsIDB4MDEsIDB4MTUsIDB4MDEsIDB4MTYsIDB4MDEsCisJIDB4MTYsIDB4MDEsIDB4MTcsIDB4MDEsIDB4MTcsIDB4MDEsIDB4MTgsIDB4MDEsIDB4MTgsIDB4MDEsIDB4MTksIDB4MDEsIDB4MTksIDB4MDEsIDB4NEQsIDB4MDEsCisJIDB4NEQsIDB4MDEsIDB4NEUsIDB4MDEsIDB4NEUsIDB4MDEsIDB4NEYsIDB4MDEsIDB4NEYsIDB4MDEsIDB4NTAsIDB4MDEsIDB4NTAsIDB4MDEsIDB4NTEsIDB4MDEsCisJIDB4NTEsIDB4MDEsIDB4NTIsIDB4MDEsIDB4NTIsIDB4MDEsIDB4NTMsIDB4MDEsIDB4NTMsIDB4MDEsIDB4NTQsIDB4MDEsIDB4NTQsIDB4MDEsIDB4NjUsIDB4MDEsCisJIDB4NjUsIDB4MDEsIDB4NjYsIDB4MDEsIDB4NjYsIDB4MDEsIDB4NjcsIDB4MDEsIDB4NjcsIDB4MDEsIDB4NjgsIDB4MDEsIDB4NjgsIDB4MDEsIDB4NjksIDB4MDEsCisJIDB4NjksIDB4MDEsIDB4NkEsIDB4MDEsIDB4NkEsIDB4MDEsIDB4NkIsIDB4MDEsIDB4NkIsIDB4MDEsIDB4NkMsIDB4MDEsIDB4NkMsIDB4MDEsIDB4NkQsIDB4MDEsCisJIDB4NkQsIDB4MDEsIDB4NkUsIDB4MDEsIDB4NkUsIDB4MDEsIDB4NkYsIDB4MDEsIDB4NkYsIDB4MDEsIDB4NzAsIDB4MDEsIDB4NzAsIDB4MDEsIDB4NzEsIDB4MDEsCisJIDB4NzEsIDB4MDEsIDB4NzIsIDB4MDEsIDB4NzIsIDB4MDEsIDB4NzMsIDB4MDEsIDB4NzMsIDB4MDEsIDB4NzQsIDB4MDEsIDB4NzQsIDB4MDEsIDB4NzUsIDB4MDEsCisJIDB4NzUsIDB4MDEsIDB4NzYsIDB4MDEsIDB4NzYsIDB4MDEsIDB4NzcsIDB4MDEsIDB4NzcsIDB4MDEsIDB4NzgsIDB4MDEsIDB4NzgsIDB4MDEsIDB4NzksIDB4MDEsCisJIDB4NzksIDB4MDEsIDB4N0EsIDB4MDEsIDB4N0EsIDB4MDEsIDB4N0IsIDB4MDEsIDB4N0IsIDB4MDEsIDB4N0MsIDB4MDEsIDB4N0MsIDB4MDEsIDB4N0QsIDB4MDEsCisJIDB4N0QsIDB4MDEsIDB4N0UsIDB4MDEsIDB4N0UsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsCisJIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsCisJIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsCisJIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsCisJIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsCisJIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsCisJIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsCisJIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsCisJIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsCisJIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsCisJIDB4MjIsIDB4NDYsIDB4MjMsIDB4NDYsIDB4MjMsIDB4NDYsIDB4MjMsIDB4NDYsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsCisJIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsCisJIDB4MUMsIDB4NDcsIDB4MUQsIDB4NDcsIDB4OUEsIDB4NDgsIDB4REEsIDB4NDgsIDB4MUEsIDB4NDgsIDB4NUEsIDB4NDgsIDB4OUEsIDB4NDgsIDB4REEsIDB4NDgsCisJIDB4MUEsIDB4NDgsIDB4NUEsIDB4NDgsIDB4OUEsIDB4NDgsIDB4REEsIDB4NDgsIDB4MUEsIDB4NDgsIDB4NUEsIDB4NDgsIDB4OUEsIDB4NDgsIDB4MzMsIDB4NDgsCisJIDB4NzgsIDB4NDksIDB4NzgsIDB4NDksIDB4NzksIDB4NDksIDB4NzksIDB4NDksIDB4NzksIDB4NDksIDB4NzksIDB4NDksIDB4N0EsIDB4NDksIDB4N0EsIDB4NDksCisJIDB4N0EsIDB4NDksIDB4N0EsIDB4NDksIDB4N0IsIDB4NDksIDB4N0IsIDB4NDksIDB4N0IsIDB4NDksIDB4N0MsIDB4NDksIDB4MzIsIDB4MDAsIDB4NDYsIDB4MDAsCisJIDB4NUEsIDB4MDAsIDB4NkUsIDB4MDAsIDB4ODIsIDB4MDAsIDB4OTYsIDB4MDAsIDB4QUEsIDB4MDAsIDB4QkUsIDB4MDAsIDB4RDIsIDB4MDAsIDB4RTYsIDB4MDAsCisJIDB4RkEsIDB4MDAsIDB4MEUsIDB4MDEsIDB4MjIsIDB4MDEsIDB4NTIsIDB4MDEsIDB4MDUsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MDAsCisJIDB4MDQsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MTUsIDB4MDAsIDB4NkUsIDB4NkYsIDB4NkUsIDB4MkQsIDB4NzMsIDB4NzAsCisJIDB4NjUsIDB4NjMsIDB4NjksIDB4NjYsIDB4NjksIDB4NjUsIDB4NjQsIDB4MjAsIDB4NTMsIDB4NTMsIDB4NDksIDB4NDQsIDB4MjAsIDB4MjEsIDB4MjEsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDksIDB4MDAsIDB4MDAsCisJIDB4MDEsIDB4MDAsIDB4NjQsIDB4MDAsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDgsIDB4NDUsIDB4NTIsIDB4NEQsIDB4NDUsIDB4NTMsIDB4MjAsIDB4MzIsCisJIDB4MDAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsCisJIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MTUsIDB4MDAsIDB4NkUsIDB4NkYsIDB4NkUsIDB4MkQsIDB4NzMsIDB4NzAsCisJIDB4NjUsIDB4NjMsIDB4NjksIDB4NjYsIDB4NjksIDB4NjUsIDB4NjQsIDB4MjAsIDB4NTMsIDB4NTMsIDB4NDksIDB4NDQsIDB4MjAsIDB4MjEsIDB4MjEsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MDEsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDksIDB4MDAsIDB4MDAsCisJIDB4MDEsIDB4MDAsIDB4NjQsIDB4MDAsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDgsIDB4NDUsIDB4NTIsIDB4NEQsIDB4NDUsIDB4NTMsIDB4MjAsIDB4MzIsCisJIDB4MDAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsCisJIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDYsIDB4NjksIDB4NzIsIDB4NzMsIDB4NzQsIDB4MjAsCisJIDB4NTcsIDB4NjEsIDB4NzYsIDB4NjUsIDB4NEMsIDB4NDEsIDB4NEUsIDB4MjAsIDB4NDksIDB4NDksIDB4MjAsIDB4NTMsIDB4NTMsIDB4NDksIDB4NDQsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTksIDB4MDAsIDB4MDIsIDB4MDEsIDB4ODIsIDB4ODQsIDB4OEIsIDB4OTYsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsCisJIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4REQsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDEsCisJIDB4MDEsIDB4MDAsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDUsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDIsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDQsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDAsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDEsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDQsIDB4MDAsCisJIDB4MTUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDIsIDB4MDAsCisJIDB4MDEsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MTUsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MTEsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MUUsIDB4MUYsIDB4OEUsIDB4MjEsCisJIDB4MDAsIDB4MjMsIDB4REEsIDB4MjIsIDB4MDQsIDB4MjMsIDB4QzAsIDB4MjEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzQsIDB4MjMsIDB4MDAsIDB4MDAsCisJIDB4NTAsIDB4MjEsIDB4OEUsIDB4MjEsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MUUsIDB4MUYsIDB4OEUsIDB4MjEsIDB4MDAsIDB4MjMsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4MjMsIDB4QzAsIDB4MjEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzQsIDB4MjMsIDB4MDAsIDB4MDAsIDB4OEUsIDB4MjEsIDB4M0MsIDB4MjMsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDMsIDB4MDAsIDB4MDYsIDB4MDcsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4ODAsCisJIDB4MDAsIDB4NjAsIDB4MUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsIDB4ODEsIDB4MDAsIDB4NjAsIDB4MUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisKK307ICAvKiBmd19pbWFnZV8yX2RhdGEgKi8KKworc3RhdGljIGNvbnN0IGhjZl84IGZ3X2ltYWdlXzNfZGF0YVtdID0geworCSAweDNGLCAweDQxLCAweEE1LCAweDRDLCAweDUwLCAweDM3LCAweDA0LCAweDAwLCAweDAxLCAweEI5LCAweDQxLCAweDVGLCAweEI1LCAweDYwLCAweDU1LCAweEUwLAorCSAweDBDLCAweDYwLCAweDEwLCAweDYyLCAweEEyLCAweEQzLCAweDAxLCAweDYwLCAweDAxLCAweDY1LCAweEQ0LCAweDgwLCAweDVBLCAweEQxLCAweDBGLCAweDAyLAorCSAweDVBLCAweEQzLCAweDNFLCAweDYwLCAweDAwLCAweDY2LCAweEUwLCAweDg3LCAweDQwLCAweDRBLCAweEVBLCAweDYwLCAweDg4LCAweDYxLCAweDY0LCAweDQ0LAorCSAweEM4LCAweDg0LCAweDBDLCAweDYzLCAweEFBLCAweDQ2LCAweDU4LCAweEQwLCAweEFBLCAweDQ2LCAweDU5LCAweEQ4LCAweEZCLCAweDFGLCAweDA4LCAweDYwLAorCSAweDAwLCAweDYzLCAweEZBLCAweDYwLCAweDAwLCAweDY1LCAweEJELCAweEQzLCAweEEzLCAweEQzLCAweDAyLCAweEE4LCAweEQ0LCAweDgwLCAweDYxLCAweDAyLAorCSAweDYwLCAweDAyLCAweDI2LCAweDYwLCAweDZBLCAweDYxLCAweDNDLCAweDYwLCAweDAwLCAweDY2LCAweDQxLCAweDRCLCAweDJCLCAweDQxLCAweDI2LCAweDYwLAorCSAweEIyLCAweDdDLCAweEQxLCAweDgwLCAweEExLCAweEQyLCAweDI1LCAweDA1LCAweDU5LCAweEQwLCAweDYwLCAweDQ1LCAweDU5LCAweEQyLCAweDQ0LCAweDQ3LAorCSAweEUwLCAweDg3LCAweDQwLCAweDRBLCAweDU5LCAweEQyLCAweDU5LCAweDhCLCAweDQwLCAweDRDLCAweDA4LCAweDYwLCAweDAwLCAweDYzLCAweEJFLCAweEQzLAorCSAweEJELCAweEQxLCAweEVDLCAweDE4LCAweEQ0LCAweDgwLCAweEVBLCAweDE4LCAweDAzLCAweDAzLCAweEMzLCAweDgzLCAweEMzLCAweDgzLCAweEY3LCAweDAxLAorCSAweDY3LCAweDQ0LCAweEMwLCAweDg0LCAweEUwLCAweDg1LCAweDJDLCAweDQ0LCAweEQ0LCAweDgwLCAweDYzLCAweDQxLCAweDAxLCAweDA2LCAweDY1LCAweDQ0LAorCSAweEM4LCAweDgzLCAweEFBLCAweDQ2LCAweDU5LCAweEQxLCAweDI3LCAweEQ4LCAweDVBLCAweDg3LCAweEZDLCAweDFGLCAweEFBLCAweDQ2LCAweDJCLCAweDQxLAorCSAweEQ1LCAweDAxLCAweDI2LCAweDYwLCAweEIyLCAweDYxLCAweDQxLCAweDRCLCAweDJCLCAweDQxLCAweDI2LCAweDYwLCAweEVBLCAweDdDLCAweEQxLCAweDgwLAorCSAweEExLCAweEQyLCAweDI3LCAweDA1LCAweDU5LCAweEQwLCAweDYwLCAweDQ1LCAweDU5LCAweEQyLCAweDQ0LCAweDQ3LCAweEUwLCAweDg3LCAweDQwLCAweDRBLAorCSAweDU5LCAweEQyLCAweDU5LCAweDhCLCAweDQwLCAweDRDLCAweDA4LCAweDYwLCAweDAwLCAweDYzLCAweEJFLCAweEQzLCAweEJELCAweEQxLCAweEVDLCAweDE4LAorCSAweEQ0LCAweDgwLCAweEVBLCAweDE4LCAweDAzLCAweDAzLCAweEMzLCAweDgzLCAweEMzLCAweDgzLCAweEY3LCAweDAxLCAweDA0LCAweEEzLCAweEEzLCAweEQxLAorCSAweDVBLCAweDg4LCAweDJDLCAweDQzLCAweEQzLCAweDgwLCAweEZGLCAweEZGLCAweDAxLCAweDA2LCAweDY0LCAweDQzLCAweENGLCAweDgzLCAweEFBLCAweDQ2LAorCSAweDYwLCAweEZFLCAweDI4LCAweEQxLCAweDVFLCAweDg4LCAweDI3LCAweEQ4LCAweDVBLCAweDg3LCAweEZCLCAweDFGLCAweDIwLCAweEZFLCAweEFBLCAweDQ2LAorCSAweEQzLCAweDAxLCAweEI4LCAweEZFLCAweEI5LCAweEZFLCAweEJBLCAweEZFLCAweEJCLCAweEZFLCAweEJELCAweEZFLCAweEJGLCAweEZFLCAweDIxLCAweDYwLAorCSAweDgwLCAweDYyLCAweEEyLCAweEQzLCAweDEyLCAweDYzLCAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDA1LCAweDAwLCAweDBCLCAweDYwLCAweEVBLCAweDYyLAorCSAweDAwLCAweDY0LCAweDVBLCAweERCLCAweEZFLCAweDFGLCAweEEyLCAweDYwLCAweDQ5LCAweDc4LCAweEZGLCAweEZGLCAweEYxLCAweEZGLCAweDk0LCAweDQ4LAorCSAweDFGLCAweDAwLCAweDA0LCAweDAwLCAweEYyLCAweEZGLCAweDk4LCAweDQ4LCAweDFGLCAweDAwLCAweDA0LCAweDAwLCAweEZCLCAweEZGLCAweEEwLCAweDQ4LAorCSAweDFGLCAweDAwLCAweDA0LCAweDAwLCAweEYxLCAweEZGLCAweEYyLCAweDRELCAweDFGLCAweDAwLCAweDA0LCAweDAwLCAweEYyLCAweEZGLCAweEY2LCAweDRELAorCSAweDFGLCAweDAwLCAweDA0LCAweDAwLCAweEZCLCAweEZGLCAweEZFLCAweDRELCAweDFGLCAweDAwLCAweDA0LCAweDAwLCAweDg2LCAweEZELCAweEI2LCAweDFGLAorCSAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDEwLCAweEZELCAweDM0LCAweDAxLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDE0LCAweEZELCAweDdFLCAweDIxLAorCSAweDAwLCAweDAwLCAweDBBLCAweDAwLCAweDIwLCAweEZBLCAweEZBLCAweDFELCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweDIxLCAweEZBLCAweERFLCAweDFELAorCSAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweDIyLCAweEZBLCAweDE2LCAweDFFLCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweDIzLCAweEZBLCAweENBLCAweDFDLAorCSAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDI0LCAweEZBLCAweEJFLCAweDFFLCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweDI1LCAweEZBLCAweERFLCAweDFDLAorCSAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDI2LCAweEZBLCAweEM0LCAweDFDLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAorCit9OyAgLyogZndfaW1hZ2VfM19kYXRhICovCisKK3N0YXRpYyBjb25zdCBoY2ZfOCBmd19pbWFnZV80X2RhdGFbXSA9IHsKKwkgMHhBNiwgMHg2MCwgMHgyNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBNiwgMHg2MCwgMHgwQiwgMHg3OCwgMHg0MSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBNiwgMHg2MCwgMHgxMSwgMHg3OCwgMHhDNCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBNSwgMHg2MCwgMHg2MSwgMHg3OCwgMHg0MywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg0NCwgMHhGRiwgMHgyMCwgMHg1NCwgMHhDRCwgMHhFMiwgMHhBNiwgMHg2MCwgMHgyMywgMHg3OCwgMHgwOCwgMHhFMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBNiwgMHg2MCwgMHgyNSwgMHg3OCwgMHg0NCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBNiwgMHg2MCwgMHgyNSwgMHg3OCwgMHg0NiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBNiwgMHg2MCwgMHgyNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBQywgMHg2MCwgMHg4MSwgMHg3OCwgMHg0QywgMHg0RSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBQywgMHg2MCwgMHgxOCwgMHg3OCwgMHg0QywgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhDNCwgMHhFMiwgMHg4NCwgMHhGRiwgMHgyMiwgMHg1OCwgMHg4MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBNywgMHg2MCwgMHhDNCwgMHg3OCwgMHg0MywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhFNCwgMHhFMiwgMHhBQywgMHg2MCwgMHgzMSwgMHg3OCwgMHg5NSwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCRiwgMHg2MCwgMHg3NiwgMHg3OCwgMHg2NCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBQywgMHg2MCwgMHg4QywgMHg3OCwgMHhBNCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBQywgMHg2MCwgMHg3MiwgMHg3OCwgMHg0NywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCMiwgMHg2MCwgMHhEMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCMiwgMHg2MCwgMHhGRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCMSwgMHg2MCwgMHg5MCwgMHg3OCwgMHg0MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCMSwgMHg2MCwgMHhDMCwgMHg3OCwgMHg0MywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCMSwgMHg2MCwgMHhDMCwgMHg3OCwgMHg0NCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCNCwgMHg2MCwgMHg3MywgMHg3OCwgMHg0NSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCMSwgMHg2MCwgMHhDMywgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2MCwgMHg4MywgMHg2NCwgMHg4MCwgMHgyOSwgMHgwOSwgMHhGQiwgMHhCMiwgMHg2MCwgMHg5OSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhDMCwgMHg2MCwgMHgyOSwgMHg3OCwgMHg0MCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCRiwgMHg2MCwgMHhCNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCRSwgMHg2MCwgMHg3OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCRCwgMHg2MCwgMHhFOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCNSwgMHg2MCwgMHg5NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MywgMHgzRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhDMCwgMHg2MCwgMHg5RiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHg0MSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHg0MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHhCMCwgMHhGRiwgMHhCMSwgMHhGRiwgMHg0MCwgMHhGRiwgMHg0MywgMHhGRiwgMHhDMCwgMHg2MCwgMHg5QSwgMHg3OCwgMHg0NCwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHhDMCwgMHg2MCwgMHg5RiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHhDNiwgMHg2MCwgMHg2NiwgMHg3OCwgMHg0NSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHhDMCwgMHg2MCwgMHg5QSwgMHg3OCwgMHg4NCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHhDMCwgMHg2MCwgMHg5OSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHhDNywgMHg2MCwgMHgyNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhFNSwgMHg2MCwgMHgwRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwgMHg0MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwgMHgyNCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhFMywgMHg2MCwgMHg0NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwgMHg0NCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwgMHg4NCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwgMHg0NywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhFQiwgMHg2MCwgMHg1QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhFQiwgMHg2MCwgMHg4NywgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhFQiwgMHg2MCwgMHhBMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHgyOCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHg0NCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHg0NSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHg0NiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2MCwgMHg4NywgMHg2NCwgMHg4MCwgMHgyOSwgMHgwOSwgMHhGQiwgMHg0NywgMHhGRiwgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHg4NywgMHhGMywgMHg4OCwgMHhGMywgMHhEQywgMHg4MSwgMHgwMCwgMHg3QywgMHgwMSwgMHgwMCwgMHgwMCwgMHhGQSwgMHg2MCwgMHg0NiwgMHhGRSwgMHg2MywKKwkgMHhBMywgMHhEOCwgMHhGRSwgMHgxRiwgMHhDRCwgMHg4MSwgMHhEOCwgMHg4NCwgMHhGOCwgMHgwMiwgMHg4NywgMHhGMywgMHg4OCwgMHhGNSwgMHhEQywgMHg4MSwKKwkgMHg4MCwgMHg2NywgMHg0MCwgMHg0QSwgMHgxNCwgMHg2MCwgMHgwMiwgMHg2NSwgMHgwMSwgMHg3QywgMHgwNywgMHgxOCwgMHgyQSwgMHg0MywgMHgwMiwgMHhGQywKKwkgMHg1RiwgMHg4QSwgMHg4RSwgMHhGOCwgMHg3MCwgMHhGOCwgMHgwMCwgMHhGNCwgMHhGOCwgMHgwMSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHg4OSwgMHhGNSwKKwkgMHgwNiwgMHg2NCwgMHg2NiwgMHg0MywgMHgwMCwgMHg3QywgMHg2MywgMHg0NiwgMHhGRSwgMHg2MywgMHhBMywgMHhEOCwgMHhGRSwgMHgxRiwgMHhDQywgMHg4NCwKKwkgMHg2NiwgMHg0MywgMHhEQiwgMHg4MywgMHhGOCwgMHgwMiwgMHgxNCwgMHg2MCwgMHgwMiwgMHg2NSwgMHgwOSwgMHg2MCwgMHgyQiwgMHg3QywgMHg4OSwgMHhGMywKKwkgMHgwNiwgMHg2MSwgMHg2MCwgMHg0NiwgMHgwMSwgMHg2MywgMHg3MiwgMHhGOCwgMHgwMCwgMHhGQywgMHg2MywgMHg0NywgMHgwNiwgMHhGQSwgMHg3MiwgMHhGOCwKKwkgMHg4RSwgMHhGOCwgMHhERiwgMHg4MywgMHg2NiwgMHg0NCwgMHhDRCwgMHg4MSwgMHgwMiwgMHhBNiwgMHhGNSwgMHgwMiwgMHg4OSwgMHhGMywgMHgwNiwgMHg2MSwKKwkgMHg2MCwgMHg0NiwgMHgwMywgMHg3QywgMHg3MywgMHhGOCwgMHg2NiwgMHg0NCwgMHhDRCwgMHg4MSwgMHgwMiwgMHhBNiwgMHhGQiwgMHgwMiwgMHgyRSwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgzRiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgwQSwgMHgwMCwgMHg0MiwgMHg2MCwgMHgwOSwgMHhFMCwgMHgzRiwgMHg0MCwgMHgwMSwgMHgyQSwKKwkgMHgwMywgMHgwMCwgMHg2MCwgMHg2MCwgMHgxQywgMHhFMCwgMHgwMiwgMHgwMCwgMHg4MCwgMHg2MCwgMHgxQywgMHhFMCwgMHg0MCwgMHhFQywgMHgwMCwgMHhFRCwKKwkgMHgwMiwgMHhFRSwgMHg4MCwgMHg2MCwgMHg1OCwgMHhFQywgMHg4MCwgMHg2MCwgMHgwMCwgMHhFRCwgMHg4MCwgMHg2MCwgMHg4MiwgMHhFRSwgMHhDMCwgMHg2MCwKKwkgMHg1OSwgMHhFQywgMHhDMCwgMHg2MCwgMHgwNywgMHhFRCwgMHhBRCwgMHg0RiwgMHhGRSwgMHhCNCwgMHhBMCwgMHg1RCwgMHgwMCwgMHhGMywgMHgyOCwgMHhGQiwKKwkgMHg0MCwgMHg0NCwgMHhBNCwgMHg2MCwgMHg1RCwgMHg3QywgMHgyMCwgMHhGOSwgMHhBNSwgMHg2MCwgMHg0OCwgMHg3QywgMHgyMSwgMHhGOSwgMHhBNywgMHg2MCwKKwkgMHgzMCwgMHg3QywgMHgyMiwgMHhGOSwgMHhCMCwgMHg2MCwgMHhDRCwgMHg3QywgMHgyMywgMHhGOSwgMHhCNSwgMHg2MCwgMHg2QywgMHg3QywgMHgyNCwgMHhGOSwKKwkgMHhDMCwgMHg2MCwgMHg4OCwgMHg3QywgMHgyNSwgMHhGOSwgMHhDNiwgMHg2MCwgMHhFMCwgMHg3QywgMHgyNiwgMHhGOSwgMHg5MSwgMHg2MCwgMHgwMCwgMHhFOCwKKwkgMHgyOCwgMHhFOCwgMHg0NCwgMHg2MCwgMHgwMiwgMHhFNiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg1MiwgMHgxMCwgMHg2MCwgMHgwNCwgMHhFNiwgMHgwOCwgMHg2MCwKKwkgMHgwMCwgMHg2MywgMHhGQSwgMHg2MCwgMHgwMCwgMHg2NSwgMHhCRCwgMHhEMywgMHhCRCwgMHhEMywgMHgwMiwgMHhBOCwgMHhENCwgMHg4MCwgMHg0NywgMHgwMiwKKwkgMHg0NiwgMHgwMiwgMHhEQiwgMHg4MywgMHhGQSwgMHg2MCwgMHgyNywgMHg2NSwgMHg1QiwgMHhEMywgMHhCRiwgMHhEMSwgMHgxQSwgMHgxOCwgMHhDMywgMHg4MywKKwkgMHhENCwgMHg4MCwgMHhDMywgMHg4MywgMHhGOSwgMHgwMiwgMHhEQiwgMHg4MywgMHhEMywgMHg4MywgMHhEMywgMHg4NiwgMHg2NCwgMHg0MSwgMHhDRCwgMHg4MSwKKwkgMHhBNiwgMHhEMSwgMHhEQSwgMHg4NiwgMHgxQywgMHg2MCwgMHg2OCwgMHg2NSwgMHgwMCwgMHg2MCwgMHg3MiwgMHg2MywgMHhBNSwgMHhEMywgMHhEQSwgMHg4NSwKKwkgMHg5MCwgMHg4NCwgMHhGRiwgMHgyNywgMHgwMiwgMHgwMCwgMHhBMiwgMHhEOSwgMHgwMSwgMHgwMCwgMHhGOCwgMHgxRiwgMHhDRCwgMHg4MSwgMHhGRiwgMHhGRiwKKwkgMHhFRiwgMHgwMiwgMHgwOCwgMHg2MCwgMHgwNiwgMHg2MywgMHhGQSwgMHg2MCwgMHgyOCwgMHg2NSwgMHg1QiwgMHhEMywgMHhCRiwgMHhEMSwgMHgwQiwgMHgxOCwKKwkgMHhDMywgMHg4MywgMHhENCwgMHg4MCwgMHhDMywgMHg4MywgMHhGOSwgMHgwMiwgMHhCRiwgMHhEMywgMHgyMSwgMHg2MCwgMHg3MiwgMHg2MiwgMHgwRSwgMHhCNCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwOCwgMHg2MCwgMHgwNiwgMHg2MywgMHhGRCwgMHg2MCwgMHgwQywgMHg2NSwgMHg1QiwgMHhEMywKKwkgMHhCRiwgMHhEMSwgMHgwRCwgMHgxOCwgMHhDMywgMHg4MywgMHhENCwgMHg4MCwgMHhDMywgMHg4MywgMHhGOSwgMHgwMiwgMHhGQSwgMHhBMywgMHhBMywgMHhEMywKKwkgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NSwgMHhGNywgMHhBMCwgMHhGQywgMHhBMCwgMHgwQSwgMHgwNSwgMHgwMSwgMHgwNSwgMHgwMCwgMHgwMCwgMHgyMSwgMHg2MCwKKwkgMHgwMCwgMHg2NSwgMHgzRiwgMHg0MywgMHgzRiwgMHg0MywgMHgyMSwgMHg2MCwgMHgwMCwgMHg2NSwgMHhDMCwgMHg2MCwgMHg4RiwgMHhFRSwgMHhCNywgMHg4NCwKKwkgMHg0MCwgMHg1RiwgMHgwMCwgMHg2MCwgMHgzMCwgMHhFMiwgMHgwMCwgMHg2MCwgMHg1MCwgMHhFMiwgMHgwMCwgMHg2MCwgMHg3OSwgMHhFMiwgMHgwMCwgMHg2MCwKKwkgMHg5MCwgMHhFMiwgMHgwMSwgMHg2MCwgMHhEMCwgMHhFMiwgMHgwMSwgMHg2MCwgMHhGMCwgMHhFMiwgMHgwMSwgMHg2MCwgMHhCMCwgMHhFMiwgMHgyNiwgMHg2NCwKKwkgMHgzNSwgMHhGQiwgMHgwMSwgMHg2MCwgMHgzMCwgMHg2NCwgMHgwQSwgMHhBNCwgMHgzOCwgMHhGQiwgMHg2MCwgMHg0NSwgMHgwMCwgMHg2MCwgMHhGOCwgMHg2NCwKKwkgMHgwQSwgMHhBNCwgMHgzOSwgMHhGQiwgMHgzNSwgMHhGMSwgMHgwQSwgMHg2NCwgMHhDNCwgMHg4NCwgMHgzNiwgMHhGQiwgMHhDMCwgMHg4NCwgMHgwQSwgMHhBNCwKKwkgMHgzNywgMHhGQiwgMHgwOSwgMHg2MCwgMHgyQSwgMHg2NCwgMHg5OSwgMHhGQiwgMHg4MiwgMHhGRiwgMHg5MiwgMHhGRiwgMHg1QywgMHg0MSwgMHg1QywgMHg0NiwKKwkgMHg1QywgMHg0NywgMHgwMCwgMHhFMSwgMHhBNywgMHg2MCwgMHg5QiwgMHg2MywgMHgwQywgMHg2MCwgMHgxNiwgMHg2NCwgMHhBMCwgMHhERCwgMHg4NywgMHhGRiwKKwkgMHg5NywgMHhGRiwgMHgwQywgMHg2MCwgMHgwMiwgMHg2NCwgMHg0MCwgMHg1QSwgMHgwNiwgMHhBNCwgMHg0MCwgMHg1QiwgMHg1QywgMHg1RSwgMHg1QywgMHg1MSwKKwkgMHgxRiwgMHg2MCwgMHhBQSwgMHg2MiwgMHhBMiwgMHhEMywgMHg2NSwgMHhGQiwgMHgyMSwgMHg2MCwgMHhFQywgMHg2MSwgMHgyNywgMHg3QywgMHhBMSwgMHhEOSwKKwkgMHgyNSwgMHg2MCwgMHgyRSwgMHg2MywgMHg3RiwgMHhBMywgMHhFMywgMHg4NywgMHgwMCwgMHg3RiwgMHg4QSwgMHhGQiwgMHgwMiwgMHg2MCwgMHg4MCwgMHg2NiwKKwkgMHgyMiwgMHg2MCwgMHgyMiwgMHg2NCwgMHg3NywgMHg2MCwgMHg3NywgMHg2MywgMHgwMCwgMHhGQSwgMHgwMSwgMHhGQywgMHgwMCwgMHhGMCwgMHgwMSwgMHhGMCwKKwkgMHhEMCwgMHg4MCwgMHhEMywgMHg4MCwgMHgxRSwgMHgwMiwgMHgxRCwgMHgwMiwgMHgwNiwgMHg2MCwgMHg4MCwgMHg2NSwgMHg0NSwgMHg0QSwgMHhBQSwgMHg0NiwKKwkgMHgwMCwgMHhGQywgMHgwMSwgMHhGQSwgMHhBQSwgMHg0NiwgMHgwMCwgMHhGMCwgMHgyQSwgMHg0MSwgMHg1MCwgMHg2NSwgMHhEMywgMHg4MCwgMHhDRCwgMHg4NCwKKwkgMHgxMywgMHgwMywgMHgwQSwgMHg2MCwgMHg4MCwgMHg2NSwgMHg0NSwgMHg0QSwgMHhBQSwgMHg0NiwgMHgwMCwgMHhGQywgMHgwMSwgMHhGQSwgMHhBQSwgMHg0NiwKKwkgMHgwMCwgMHhGMCwgMHg2NSwgMHg0MSwgMHhDOCwgMHg2NSwgMHhEMywgMHg4MCwgMHhDRCwgMHg4NCwgMHgwNiwgMHgwMywgMHgxMiwgMHg2MCwgMHg3RiwgMHg2NCwKKwkgMHgwMywgMHgwMCwgMHgxMCwgMHg2NSwgMHgwMiwgMHg2MCwgMHg3RiwgMHg2NCwgMHg2NSwgMHg0MywgMHg4NywgMHhGRCwgMHgxQiwgMHg2MCwgMHg3MiwgMHg2MiwKKwkgMHhBMiwgMHhERCwgMHgwNywgMHg2MSwgMHhDNSwgMHg4MSwgMHhFMSwgMHg4NSwgMHhENCwgMHg4NCwgMHg4QiwgMHhGQiwgMHhEQywgMHg4NCwgMHg4OSwgMHhGQiwKKwkgMHgwQywgMHhBNCwgMHg4OCwgMHhGQiwgMHgxQiwgMHg2MCwgMHg3NCwgMHg2MiwgMHhBMiwgMHhEQiwgMHhBMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHgxRiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhBMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHgwMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4QiwgMHhGMSwgMHg4QSwgMHhGMywgMHg3QywgMHg2MywKKwkgMHg4RCwgMHhGQiwgMHg2MCwgMHg0NiwgMHgwMSwgMHhGQywgMHhEQywgMHg4NCwgMHhEMCwgMHg4MCwgMHgwMCwgMHhGQSwgMHhGQSwgMHgwNCwgMHg4RSwgMHhGQiwKKwkgMHg2MCwgMHg0NiwgMHgwMCwgMHg2NCwgMHgwMCwgMHhGQSwgMHg2MywgMHg0NCwgMHg4MCwgMHg3RiwgMHgwMSwgMHhGQSwgMHg4QiwgMHhGMywgMHg4QSwgMHhGMSwKKwkgMHhEQywgMHg4NCwgMHhEMCwgMHg4NCwgMHg4QywgMHhGQiwgMHgwMywgMHg2MCwgMHgyNiwgMHg2MSwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwgMHg2NCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHgyRSwgMHhGQiwgMHg4MiwgMHhGRiwgMHg0MCwgMHg0MiwgMHg4NywgMHhGRiwgMHg4QywgMHhGMywgMHg5NCwgMHhGQiwKKwkgMHgwMCwgMHg2NCwgMHgxMiwgMHg2MCwgMHhDOCwgMHg2MywgMHhBMywgMHhEQiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg1MCwgMHg2MywgMHhGRiwgMHg2NiwgMHhGRiwKKwkgMHg2NSwgMHhGRiwgMHg2NCwgMHhGRiwgMHg2MSwgMHhGRiwgMHg2MiwgMHhGRiwgMHg0OSwgMHg2MCwgMHgwMiwgMHhFMSwgMHg1MiwgMHg2MCwgMHgwMiwgMHhFMSwKKwkgMHg1QiwgMHg2MCwgMHgwMiwgMHhFMSwgMHg2NSwgMHg2MCwgMHgwMiwgMHhFMSwgMHg2QywgMHg2MCwgMHgwMiwgMHhFMSwgMHg3NiwgMHg2MCwgMHgwMiwgMHhFMSwKKwkgMHg0MSwgMHg2MCwgMHgwMiwgMHhFMSwgMHgwNCwgMHg2NSwgMHgyMSwgMHg2MCwgMHg3RSwgMHg2NCwgMHg0NCwgMHhEMywgMHhFQSwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHg3OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHgwNCwgMHg2NSwgMHgwQywgMHg2NCwgMHhBNSwgMHhEQiwgMHhBMywgMHg2MCwgMHhFRCwgMHg2NCwKKwkgMHg4MCwgMHhGQiwgMHgyRCwgMHhGRiwgMHgwQSwgMHg2MSwgMHg0MSwgMHg0QiwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2MSwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHg2NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGMCwgMHg2NywgMHgwRSwgMHhGQSwgMHgxQiwgMHg2MCwgMHhFMCwgMHg2MiwgMHgxQiwgMHg2MCwgMHhDNCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgyQiwgMHg0MSwKKwkgMHg0RCwgMHg4QiwgMHhGRiwgMHhGRiwgMHhFOSwgMHgwMiwgMHgwQSwgMHg2MSwgMHg0MSwgMHg0QiwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2MSwgMHhCMywgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHg2NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwgMHhFMCwgMHg2MiwgMHgxQiwgMHg2MCwgMHhCOCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgyQiwgMHg0MSwgMHg0RCwgMHg4QiwKKwkgMHhGRiwgMHhGRiwgMHhFQiwgMHgwMiwgMHhFQiwgMHg2MCwgMHg0RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhFQSwgMHgwMCwgMHhFQiwgMHg1MCwgMHg2MCwKKwkgMHgwMywgMHhFQSwgMHg1MSwgMHg2MCwgMHgxMywgMHhFQSwgMHg1MiwgMHg2MCwgMHgzMCwgMHhFQSwgMHg1MywgMHg2MCwgMHg0MCwgMHhFQSwgMHg1NCwgMHg2MCwKKwkgMHg1MiwgMHhFQSwgMHg1NSwgMHg2MCwgMHg2RCwgMHhFQSwgMHg1NiwgMHg2MCwgMHg3MSwgMHhFQSwgMHg1NywgMHg2MCwgMHg4QiwgMHhFQSwgMHg1OCwgMHg2MCwKKwkgMHg0NywgMHhFQSwgMHg1OSwgMHg2MCwgMHhBMCwgMHhFQSwgMHg1QSwgMHg2MCwgMHhCMiwgMHhFQSwgMHg1QiwgMHg2MCwgMHhDMSwgMHhFQSwgMHg1QywgMHg2MCwKKwkgMHhENywgMHhFQSwgMHg1RCwgMHg2MCwgMHhFQiwgMHhFQSwgMHg1RSwgMHg2MCwgMHhBMCwgMHhFQSwgMHg1MCwgMHg2MCwgMHgzNiwgMHhFQiwgMHg1MSwgMHg2MCwKKwkgMHgzNywgMHhFQiwgMHg1MiwgMHg2MCwgMHgyMCwgMHhFQiwgMHg1MywgMHg2MCwgMHhFNCwgMHhFQiwgMHg1NCwgMHg2MCwgMHgzNCwgMHhFQiwgMHg1NSwgMHg2MCwKKwkgMHg1OCwgMHhFQiwgMHg1NiwgMHg2MCwgMHg0OCwgMHhFQiwgMHg1NywgMHg2MCwgMHhEMCwgMHhFQiwgMHg1OCwgMHg2MCwgMHhDMywgMHhFQiwgMHg1OSwgMHg2MCwKKwkgMHhGQywgMHhFQiwgMHg1QSwgMHg2MCwgMHgzNCwgMHhFQiwgMHg1QiwgMHg2MCwgMHg1OCwgMHhFQiwgMHg1QywgMHg2MCwgMHhDMCwgMHhFQiwgMHg1RCwgMHg2MCwKKwkgMHhEMCwgMHhFQiwgMHg1RSwgMHg2MCwgMHg5MSwgMHhFQiwgMHgwMCwgMHhFQSwgMHgwMCwgMHhFQiwgMHhFMCwgMHg2MCwgMHgwMiwgMHhFQSwgMHhFMCwgMHg2MCwKKwkgMHgwMywgMHhFQiwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQiwgMHhCMCwgMHg2MCwgMHgwMCwgMHhFQiwgMHhBQiwgMHg0OCwgMHg0MCwgMHgzQiwgMHgwMSwgMHgwMCwKKwkgMHhGQywgMHgwMSwgMHgwMCwgMHhFQiwgMHgwMywgMHg2MCwgMHgwMiwgMHg2MiwgMHg2MiwgMHg0NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2NCwgMHg2MCwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQSwgMHgzRiwgMHg0MCwKKwkgMHg0MCwgMHgyNiwgMHgwOCwgMHgwMCwgMHgwMCwgMHg2MCwgMHgxOCwgMHg2NCwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2NSwgMHg5NCwgMHg4NCwgMHhBMCwgMHg1MCwKKwkgMHgxRCwgMHg2MCwgMHgxOSwgMHhFMiwgMHgyNCwgMHg0NCwgMHhGRiwgMHhCNCwgMHgwNCwgMHhGQiwgMHg1MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwNSwgMHhGQiwKKwkgMHgxMCwgMHg2MCwgMHgxMCwgMHg3NSwgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4MCwgMHhGRiwgMHg5MCwgMHhGRiwgMHg5OCwgMHhGRiwKKwkgMHgyMywgMHg2MCwgMHg1QywgMHg2MywgMHgyMCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMiwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgyMywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNiwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgyNywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyOCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyOSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyQSwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgyQiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyQywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyRCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyRSwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgyRiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMywgMHg2MCwgMHg1MCwgMHg2NCwgMHhBMCwgMHhERCwgMHgyNCwgMHg2MCwgMHg3QywgMHg2MywgMHgyMywgMHg2MCwKKwkgMHg1MiwgMHg2NCwgMHhBMCwgMHhERCwgMHgyMywgMHg2MCwgMHg1NCwgMHg2MywgMHgzMCwgMHg0NCwgMHhBMywgMHhEQiwgMHgyMywgMHg2MCwgMHg1NiwgMHg2MywKKwkgMHgzMSwgMHg0NCwgMHhBMywgMHhEQiwgMHgyMywgMHg2MCwgMHg1OCwgMHg2MywgMHgzMiwgMHg0NCwgMHhBMywgMHhEQiwgMHgyMywgMHg2MCwgMHg1QSwgMHg2MywKKwkgMHgzMywgMHg0NCwgMHhBMywgMHhEQiwgMHg4MSwgMHhGRiwgMHg5MSwgMHhGRiwgMHg1OCwgMHg1MSwgMHg0OCwgMHgwMCwgMHg4MiwgMHhGRiwgMHg5MiwgMHhGRiwKKwkgMHg1OCwgMHg1MSwgMHg0NCwgMHgwMCwgMHg4MywgMHhGRiwgMHg5MywgMHhGRiwgMHg1OCwgMHg1MSwgMHg0MCwgMHgwMCwgMHg4NCwgMHhGRiwgMHg5NCwgMHhGRiwKKwkgMHg1OCwgMHg1MSwgMHgzQywgMHgwMCwgMHg4NSwgMHhGRiwgMHg5NSwgMHhGRiwgMHg1OCwgMHg1MSwgMHgzOCwgMHgwMCwgMHg4NiwgMHhGRiwgMHg5NiwgMHhGRiwKKwkgMHg1OCwgMHg1MSwgMHgzNCwgMHgwMCwgMHg4NywgMHhGRiwgMHg5NywgMHhGRiwgMHg1OCwgMHg1MSwgMHgzMCwgMHgwMCwgMHg4MCwgMHhGRiwgMHg5MCwgMHhGRiwKKwkgMHg5OSwgMHhGRiwgMHgyMywgMHg2MCwgMHg1MCwgMHg2NCwgMHhBMCwgMHhEMSwgMHgzMCwgMHg0NCwgMHg2NCwgMHg0MywgMHhCRCwgMHhEQiwgMHgzMSwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgzMiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzMywgMHg0NCwgMHhCRCwgMHhEQiwgMHgzNCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzNSwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgzNiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzNywgMHg0NCwgMHhCRCwgMHhEQiwgMHgzOCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzOSwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgzQSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzQiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzQywgMHg0NCwgMHhCRCwgMHhEQiwgMHgzRCwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgzRSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzRiwgMHg0NCwgMHhCRCwgMHhEQiwgMHhFMywgMHg2MCwgMHg1MCwgMHg2NCwgMHgwQSwgMHhGQiwKKwkgMHg0MCwgMHgyMSwgMHhGRSwgMHgwMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3OCwgMHgwMSwgMHhGRiwgMHhGRiwgMHg0MiwgMHg1MCwgMHg0MCwgMHg1MywKKwkgMHgyMywgMHg2MCwgMHg1MiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg0MCwgMHg1MiwgMHgzMywgMHg0NCwgMHgzMiwgMHg0MiwgMHhBMiwgMHhEQiwKKwkgMHhEQSwgMHg4MiwgMHhBMiwgMHhERCwgMHhEQSwgMHg4MywgMHg2NSwgMHg0NCwgMHhCRCwgMHhEQiwgMHg2MSwgMHg0NCwgMHhCRCwgMHhEQiwgMHg2NiwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHhCRCwgMHhEOSwgMHgzMCwgMHg0NCwgMHhCRCwgMHhEQiwgMHg5OSwgMHhGRiwgMHhBNCwgMHg0QywgMHhCRCwgMHhEQiwgMHhBNSwgMHg0QywKKwkgMHhCRCwgMHhEQiwgMHhBMCwgMHg0QywgMHhCRCwgMHhEQiwgMHhBMSwgMHg0QywgMHhCRCwgMHhEQiwgMHg5OCwgMHhGRiwgMHgyMywgMHg2MCwgMHg1MiwgMHg2NCwKKwkgMHhBMCwgMHhERCwgMHgyMywgMHg2MCwgMHg1NCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg0MCwgMHg1MCwgMHgyMywgMHg2MCwgMHg1OCwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg0MCwgMHg1MiwgMHgyMywgMHg2MCwgMHg1QSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg0MCwgMHg1MywKKwkgMHgzMSwgMHg0MSwgMHgyMywgMHg2MCwgMHg1NiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg0MCwgMHg1MSwgMHgyMywgMHg2MCwgMHg1MCwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MywgMHgyMCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMiwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgyMywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNiwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgyNywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyOCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyOSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyQSwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgyQiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyQywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyRCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyRSwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgyRiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMywgMHg2MCwgMHg1MCwgMHg2NCwgMHhBMCwgMHhERCwgMHg2MSwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwNywgMHgwMiwgMHg2MiwgMHhGRiwgMHg2MywgMHhGRiwgMHg2NCwgMHhGRiwgMHg2NSwgMHhGRiwKKwkgMHg2NiwgMHhGRiwgMHhCRiwgMHhGRSwgMHhBMSwgMHhGRiwgMHg4MiwgMHhGRiwgMHg4OCwgMHhGRiwgMHg2QywgMHg0MCwgMHg0MSwgMHhGRiwgMHhDNCwgMHhFMiwKKwkgMHg0MywgMHhGRiwgMHg1QywgMHg0OSwgMHgwOCwgMHhFMSwgMHhBNSwgMHg2MCwgMHg1RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMSwgMHhGRiwgMHg5OCwgMHhGRiwKKwkgMHg4MCwgMHgzRSwgMHg5RiwgMHhGRSwgMHgwMywgMHgwNCwgMHhBNiwgMHg2MCwgMHgyOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFMiwgMHhGRSwgMHg0MCwgMHgwNSwKKwkgMHhFMCwgMHhGRSwgMHg1QiwgMHgwNSwgMHhFMSwgMHhGRSwgMHhGMiwgMHgwNCwgMHgyOSwgMHg0MCwgMHgwOCwgMHgyNiwgMHhFRiwgMHgwMSwgMHg3MiwgMHg0NCwKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHg5NSwgMHhGMywgMHhFOCwgMHg4NSwgMHhGRiwgMHhCNywKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhCNCwgMHg4NSwgMHg3MywgMHg0NCwgMHhENCwgMHg4NCwgMHgxMCwgMHg2NSwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgyNiwgMHgwNCwgMHgzRiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgxMywgMHgwMCwgMHgwQiwgMHg2MCwgMHhGOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwKKwkgMHgxMCwgMHg2NCwgMHg5MCwgMHg4NCwgMHhBMCwgMHg1MCwgMHhGOCwgMHhBMiwgMHhBMiwgMHhEMSwgMHgwQSwgMHg2MCwgMHgxOSwgMHg2NCwgMHg5MCwgMHg4NCwKKwkgMHhBMCwgMHg1MiwgMHgwNiwgMHhBMiwgMHhBMiwgMHhEMSwgMHg0NiwgMHg2MCwgMHgwOSwgMHg2NCwgMHg5MCwgMHg4NCwgMHhBMCwgMHg1MCwgMHhEMiwgMHhGNCwKKwkgMHgyNSwgMHg2MCwgMHgxNiwgMHg3QywgMHg2MywgMHg0MCwgMHgwMSwgMHgyNiwgMHgwOCwgMHgwMCwgMHhBNCwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhCNCwKKwkgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwgMHhBRCwgMHg0RiwgMHhGRSwgMHhCNCwgMHhBMCwgMHg1RCwgMHgwMiwgMHhFRSwgMHhCRCwgMHhGRSwgMHhCRSwgMHgwMSwKKwkgMHgyMSwgMHg0NiwgMHg1RSwgMHg2MiwgMHg5QSwgMHhGRiwgMHgwNywgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwNiwgMHgyNSwgMHgxMCwgMHgwMCwKKwkgMHhBMiwgMHhEQywgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHg2MiwgMHg2MiwgMHgwMSwgMHg1RCwgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywKKwkgMHg3QSwgMHhEQywgMHg0NCwgMHhGRiwgMHgwNiwgMHgyNSwgMHgwNCwgMHgwMCwgMHgwRSwgMHhFMSwgMHgwMiwgMHg2MCwgMHgwMSwgMHhFMSwgMHg5RSwgMHgwMSwKKwkgMHg2MiwgMHhGRiwgMHhDNCwgMHhFMiwgMHg0MSwgMHhGRiwgMHgwQSwgMHhFMSwgMHg5OSwgMHgwMSwgMHhDOCwgMHg3NCwgMHhDRCwgMHhFMiwgMHgyOSwgMHg0NCwKKwkgMHgwOCwgMHhCQywgMHg0MCwgMHg0OSwgMHgwNSwgMHhFMSwgMHgyNSwgMHg2MCwgMHgxOCwgMHg2MywgMHhBMywgMHhEMywgMHhEMiwgMHhGMywgMHgwNiwgMHgxOCwKKwkgMHgyOCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwNSwgMHgwMCwgMHgyOCwgMHg0MCwgMHg0OCwgMHgzNiwgMHgwMiwgMHgwMCwgMHgwMiwgMHhCQywgMHhEMiwgMHhGQiwKKwkgMHgzRiwgMHg0MCwgMHgwMSwgMHgyQiwgMHhGRiwgMHhGRiwgMHhBMSwgMHhGRiwgMHg2NywgMHg0QywgMHgwNiwgMHg2MSwgMHhDRCwgMHg4MSwgMHgwNCwgMHgyNSwKKwkgMHgzMCwgMHgwMCwgMHg4NywgMHg0QywgMHhGQiwgMHgwMiwgMHgyOCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwMiwgMHgwMCwgMHgxNSwgMHg2MCwgMHg2RiwgMHg2QiwKKwkgMHhGMywgMHg2MCwgMHhBMCwgMHg2NCwgMHgwNCwgMHgyNSwgMHgyNSwgMHgwMCwgMHg4MCwgMHg0QywgMHgzMCwgMHg2NCwgMHgzQSwgMHhEQiwgMHg0NCwgMHhGRiwKKwkgMHgwNCwgMHgyNSwgMHgxRiwgMHgwMCwgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyNSwgMHg0NCwgMHgzNywgMHgzNiwgMHhCNCwgMHg4NCwgMHg2RSwgMHgzNiwKKwkgMHhCNCwgMHg4NCwgMHg4MCwgMHg0RSwgMHgyNCwgMHg0MSwgMHgwNCwgMHgyNSwgMHgxNCwgMHgwMCwgMHg2MSwgMHg0QywgMHg2NCwgMHhBMSwgMHg2MSwgMHg1NCwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwNCwgMHgyNSwgMHgwRCwgMHgwMCwgMHg2NywgMHg0RSwgMHgwNywgMHg2NCwgMHgxQywgMHhGQiwgMHgwMCwgMHhFMSwKKwkgMHgwMiwgMHg2MCwgMHgwMSwgMHhFMSwgMHg1MywgMHgwMSwgMHgzMywgMHhGMywgMHhGRCwgMHgxMSwgMHhGQywgMHgxOCwgMHg0MCwgMHg2NCwgMHgzQSwgMHhEQiwKKwkgMHgwQSwgMHgwMCwgMHhDNCwgMHhFMiwgMHgyNywgMHg0NCwgMHgyMCwgMHgyQSwgMHgwNCwgMHgwMCwgMHg0MiwgMHg2NCwgMHgzQSwgMHhEQiwgMHg2NywgMHg0QywKKwkgMHgwMiwgMHgwMCwgMHg0MSwgMHg2NCwgMHgzQSwgMHhEQiwgMHg2MiwgMHhGRiwgMHgwOCwgMHhFMSwgMHhFMiwgMHhGRSwgMHg3MiwgMHg1MiwgMHg1QywgMHg0OSwKKwkgMHgzMiwgMHg3QiwgMHg0RCwgMHhFMiwgMHgzQiwgMHgwMSwgMHgwOCwgMHhFMSwgMHgzOSwgMHgwMSwgMHhBMSwgMHhGRiwgMHg5OCwgMHhGRiwgMHg4MCwgMHgzRSwKKwkgMHgwMCwgMHg2MCwgMHg0NiwgMHg3NCwgMHhDRCwgMHhFMiwgMHgwNCwgMHhFMSwgMHgwMiwgMHg2MCwgMHgwMCwgMHhFMSwgMHgzRiwgMHg0NCwgMHg0MCwgMHgyNiwKKwkgMHgwQiwgMHgwMCwgMHgwMSwgMHgyQSwgMHgwNSwgMHgwMCwgMHg0MiwgMHg2MCwgMHgwOSwgMHhFMCwgMHg2MCwgMHg2MCwgMHgxQywgMHhFMCwgMHgwNCwgMHgwMCwKKwkgMHg0MiwgMHg2MCwgMHgwOSwgMHhFMCwgMHg4MCwgMHg2MCwgMHgxQywgMHhFMCwgMHgwNCwgMHgyOSwgMHhGRSwgMHgwMSwgMHhDNCwgMHhFMiwgMHg0MywgMHg2NCwKKwkgMHgzQSwgMHhEQiwgMHg4MywgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgzRiwgMHg0NCwgMHgwMiwgMHgyNywgMHg4NCwgMHgwMCwgMHgyMCwgMHgyQiwKKwkgMHhGRiwgMHgwMSwgMHg4MCwgMHhFMSwgMHg5NSwgMHg2MCwgMHg4MCwgMHhFNywgMHg2MSwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwRCwgMHgwMCwgMHgwNSwgMHg2MywKKwkgMHhBNywgMHg2MCwgMHg1OCwgMHg0RiwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyOCwgMHg2MywgMHhGRiwgMHhGRiwgMHhGRSwgMHgxRiwgMHgwMSwgMHg2MywKKwkgMHhBNywgMHg2MCwgMHg1OCwgMHg0RiwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCMSwgMHhDRCwgMHg4MSwgMHhFMSwgMHg4NSwgMHgxRSwgMHg2MCwKKwkgMHhBMiwgMHg2NCwgMHg0NCwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MywgMHhBNywgMHg2MCwgMHg1OCwgMHg0RiwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2MCwgMHgwMCwgMHg2MywgMHhBNywgMHg2MCwgMHg1OCwgMHg0RiwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRSwgMHg2MCwgMHhCRSwgMHg2MSwKKwkgMHgyMSwgMHg2MCwgMHg3MiwgMHg2MiwgMHhBMiwgMHhEMywgMHg0NSwgMHhEMSwgMHg0NywgMHhCQywgMHhFMCwgMHg4NCwgMHg2MiwgMHg0NSwgMHg2NCwgMHg1RiwKKwkgMHhFOCwgMHg4MywgMHhBNywgMHg2MCwgMHg1OCwgMHg0RiwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4MiwgMHhGMywgMHhDRCwgMHhFMiwgMHg2MCwgMHg1NCwKKwkgMHgwNCwgMHhFMSwgMHgwNCwgMHgyOSwgMHhGRSwgMHgwMSwgMHhDNCwgMHhFMiwgMHgxNSwgMHg2MCwgMHhBMiwgMHhFNywgMHgzOCwgMHg2OSwgMHhGRiwgMHhGRiwKKwkgMHg2OCwgMHg0NCwgMHgwMSwgMHgxNiwgMHhGRCwgMHgwMSwgMHgwMSwgMHgyQSwgMHgzNiwgMHgwMCwgMHgwMywgMHg2MCwgMHg4MCwgMHg3QywgMHhBMywgMHg4MywKKwkgMHgyMSwgMHg2MCwgMHg3MiwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MywgMHhCQiwgMHhCMywgMHg4MywgMHg5NSwgMHg2MCwgMHg4MCwgMHhFNywgMHhBNywgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFMywgMHg4MywgMHgxNSwgMHg2MCwgMHhBMiwgMHhFNywgMHgzOCwgMHg2OSwgMHhGRiwgMHhGRiwKKwkgMHg2OCwgMHg0MSwgMHgwMSwgMHgxNiwgMHhGRCwgMHgwMSwgMHg2MywgMHg0NywgMHg2MSwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMCwgMHgzQSwKKwkgMHhDQywgMHg4NCwgMHgwMiwgMHgwMCwgMHgwNywgMHgzQSwgMHhEQywgMHg4NCwgMHhGRiwgMHhCNCwgMHhBNSwgMHhEQiwgMHg2MCwgMHg0NywgMHhFOCwgMHg4NCwKKwkgMHg0NywgMHg2NSwgMHgyMSwgMHg2MCwgMHg3MiwgMHg2MiwgMHhBMiwgMHhEMywgMHhCNCwgMHg4NSwgMHhCNCwgMHg4MywgMHg4MCwgMHhFMSwgMHg5NSwgMHg2MCwKKwkgMHg4MCwgMHhFNywgMHhBNywgMHg2MCwgMHg1OCwgMHg0RiwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4MiwgMHhGMywgMHhDRCwgMHhFMiwgMHg2MCwgMHg1NCwKKwkgMHgwNCwgMHgyOSwgMHhGRSwgMHgwMSwgMHhDNCwgMHhFMiwgMHg4MywgMHhGMywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MCwgMHgyQiwgMHgwNCwgMHgwMCwKKwkgMHhBNiwgMHg2MCwgMHhGNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwgMHg4MywgMHhGMywgMHg4MCwgMHhFMSwgMHhDQywgMHg4NCwgMHhFMCwgMHg4NSwKKwkgMHgxNSwgMHg2MCwgMHhBMiwgMHhFNywgMHgxRCwgMHg2MCwgMHhERSwgMHg2NCwgMHg1OCwgMHg0RiwgMHg0RiwgMHgwMCwgMHgxRCwgMHg2MCwgMHhGQSwgMHg2NCwKKwkgMHg1OCwgMHg0RiwgMHg0QiwgMHgwMCwgMHgxRSwgMHg2MCwgMHgxNiwgMHg2NCwgMHg1OCwgMHg0RiwgMHg0NywgMHgwMCwgMHgxRSwgMHg2MCwgMHgzMiwgMHg2NCwKKwkgMHg1OCwgMHg0RiwgMHg0MywgMHgwMCwgMHgxRSwgMHg2MCwgMHg0RSwgMHg2NCwgMHg1OCwgMHg0RiwgMHgzRiwgMHgwMCwgMHgxRSwgMHg2MCwgMHg2QSwgMHg2NCwKKwkgMHg1OCwgMHg0RiwgMHgzQiwgMHgwMCwgMHgxRSwgMHg2MCwgMHg4NiwgMHg2NCwgMHg1OCwgMHg0RiwgMHgzNywgMHgwMCwgMHgwMSwgMHg2OCwgMHhGRiwgMHg2QSwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgzRiwgMHg0NCwgMHgyMCwgMHgyNywgMHgwMCwgMHgwMCwgMHgzRiwgMHg0MCwgMHg0MCwgMHgyNiwKKwkgMHgwOCwgMHgwMCwgMHgwMCwgMHg2MCwgMHgxOCwgMHg2NCwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2NSwgMHg5NCwgMHg4NCwgMHhBMCwgMHg1MCwgMHgxRCwgMHg2MCwKKwkgMHgxOSwgMHhFMiwgMHhDNCwgMHhFMiwgMHgwMCwgMHg2MywgMHg4MiwgMHhGRCwgMHgzMiwgMHg3QiwgMHg0RCwgMHhFMiwgMHhCRiwgMHhGRSwgMHhDNCwgMHhFMiwKKwkgMHg0MSwgMHhGRiwgMHhFMCwgMHhGRSwgMHhFMSwgMHhGRSwgMHhFMiwgMHhGRSwgMHg0MywgMHhGRiwgMHg0NCwgMHhGRiwgMHg0NiwgMHhGRiwgMHg4NCwgMHhGMywKKwkgMHg2MiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwNSwgMHgzNiwgMHgyRCwgMHhGRiwgMHgwNywgMHgzNiwgMHhENSwgMHhGRSwgMHgwOCwgMHhFMSwgMHg4OCwgMHg2MCwKKwkgMHg4NSwgMHg3MSwgMHg4RCwgMHhFMiwgMHhBNSwgMHg2MCwgMHg1RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1MCwgMHhFQywgMHg2MywgMHg0QSwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg0MCwgMHhFQywgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg0NCwgMHhEMywgMHg4MCwgMHg3QywgMHg2MCwgMHg0OCwKKwkgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhCMCwgMHg4QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwMiwgMHgwMiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MiwgMHhGRiwgMHg4OCwgMHhGRiwKKwkgMHg0OCwgMHhFMiwgMHgwMSwgMHg3MCwgMHhBRSwgMHhGMSwgMHgwMCwgMHg2QiwgMHg4OSwgMHhGRiwgMHg2NCwgMHg1NCwgMHg4OCwgMHhGRiwgMHg5RiwgMHhGRSwKKwkgMHgwMiwgMHgwNSwgMHg2NCwgMHg0NCwgMHg2MCwgMHg1NCwgMHhDRCwgMHhFMiwgMHhDMiwgMHg2NCwgMHgzQSwgMHhEQiwgMHhCQywgMHhGRiwgMHhCNSwgMHhGRiwKKwkgMHgxRCwgMHhGRiwgMHgyNiwgMHg0NCwgMHgwMiwgMHhCNCwgMHg0MCwgMHg0NiwgMHgzQywgMHg0NCwgMHgwMCwgMHhCQywgMHhGRiwgMHhGRiwgMHgwNiwgMHgwMywKKwkgMHgyNywgMHg0MCwgMHgyNiwgMHgyMiwgMHgwMywgMHgwMCwgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHgyNywgMHg0NCwgMHgyMCwgMHgyQSwKKwkgMHgwNCwgMHgwMCwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhCMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHg1QywgMHg0RCwgMHgyNywgMHg0NCwgMHgxOCwgMHhCNCwKKwkgMHg0MCwgMHg0NywgMHgwMCwgMHhFMSwgMHg2QywgMHg0MCwgMHg0NCwgMHhFMiwgMHhDNCwgMHhFMiwgMHg0NywgMHhGRiwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwKKwkgMHgzMiwgMHhGMSwgMHgwOCwgMHgyOSwgMHgwOSwgMHgwMCwgMHg2NCwgMHg0MCwgMHgwNywgMHgyMiwgMHgwNiwgMHgwMCwgMHg0MywgMHhGRiwgMHgyNywgMHg0NCwKKwkgMHgxMCwgMHhCQywgMHg0MCwgMHg0NywgMHgwMCwgMHg2NCwgMHgzMiwgMHhGQiwgMHgzMSwgMHg0MSwgMHgzQywgMHg0NCwgMHgwMSwgMHhCMSwgMHgwMCwgMHhCQywKKwkgMHgwQSwgMHgwMiwgMHgwOSwgMHgwMywgMHgzMiwgMHhGMywgMHgwMCwgMHg3QywgMHgwMSwgMHhCNCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMywgMHgzMiwgMHhGOSwKKwkgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwgMHgwMCwgMHg2NCwKKwkgMHgzMywgMHhGQiwgMHgwQywgMHg2MCwgMHgxNiwgMHg2NCwgMHhBMCwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMiwgMHhGMywgMHgwOCwgMHgyOSwKKwkgMHgwQSwgMHgwMCwgMHg2MCwgMHg0MCwgMHgwNywgMHgyMiwgMHgwNywgMHgwMCwgMHhGRSwgMHhCNCwgMHgzMiwgMHhGQiwgMHgyNywgMHg0NCwgMHgxMCwgMHhCQywKKwkgMHhGNywgMHhCNCwgMHg0MCwgMHg0NywgMHg0MywgMHhGRiwgMHgwMCwgMHg2NCwgMHgzQSwgMHhEQiwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHgzMSwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwMCwgMHg2NCwgMHgzMywgMHhGQiwgMHgwMSwgMHg2MCwgMHgwQSwgMHhFMSwgMHhFNSwgMHhGRSwgMHgxMywgMHgwNSwKKwkgMHgyNywgMHg0NCwgMHgxMCwgMHgyNiwgMHgxMywgMHgwMCwgMHg5RiwgMHhGRSwgMHgwMiwgMHgwNCwgMHgwMiwgMHhFMSwgMHgwNiwgMHgwMCwgMHgzRSwgMHhFMSwKKwkgMHgzMSwgMHg0NCwgMHgwMSwgMHgyQSwgMHgwMiwgMHgwMCwgMHgwNCwgMHgwQSwgMHhCRiwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwKKwkgMHhBRiwgMHg2MCwgMHgxOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBOCwgMHg2MCwgMHgwOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg0NCwgMHgwOCwgMHgyNiwKKwkgMHhGRiwgMHhGRiwgMHhCRiwgMHg2MCwgMHgyQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0OCwgMHhGMywgMHgzMiwgMHhGMSwgMHgwMCwgMHg2MywgMHg2NCwgMHg0MCwKKwkgMHgwMywgMHgyMiwgMHgzRCwgMHgwMCwgMHgzMSwgMHg0MCwgMHgwOCwgMHgyNiwgMHhGNCwgMHgwMSwgMHhDRCwgMHhFMiwgMHg4NCwgMHhFMSwgMHg3MCwgMHg0MSwKKwkgMHhBRCwgMHg4MCwgMHg3MSwgMHg0MCwgMHg4MCwgMHgyNywgMHhFRCwgMHgxMiwgMHgwMywgMHgwMywgMHhCRiwgMHg2MCwgMHg3QywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDNCwgMHhFMiwgMHgzMiwgMHhGRCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHhERiwgMHgwMSwgMHgwMCwgMHg2MywKKwkgMHgzMiwgMHhGRCwgMHg2QywgMHg0MCwgMHgzQywgMHg0NiwgMHgzRSwgMHhGMiwgMHgyQSwgMHhGMCwgMHgyNywgMHg0MSwgMHg0NCwgMHg0OCwgMHgyMCwgMHhCOSwKKwkgMHgwMSwgMHhCNCwgMHhGNywgMHhCMSwgMHgwQSwgMHgwMywgMHg2NCwgMHg0MCwgMHgwOCwgMHgyNywgMHgwNywgMHgwMCwgMHgwRiwgMHg2MCwgMHg5MiwgMHg2MywKKwkgMHgwMCwgMHg2NCwgMHg0NSwgMHhGQiwgMHg0NiwgMHhGQiwgMHhCRCwgMHhEQiwgMHhBMywgMHhEQiwgMHhDQiwgMHgwQSwgMHg0MSwgMHg0NywgMHgzRiwgMHg0MCwKKwkgMHgwMSwgMHgyQiwgMHgwNCwgMHgwMCwgMHhGNiwgMHhGRSwgMHg2NywgMHg0QywgMHgwNSwgMHg2MCwgMHg2OSwgMHg2QiwgMHgwMiwgMHhFMSwgMHgwMSwgMHg2MCwKKwkgMHgwOCwgMHhFMSwgMHhGMCwgMHhGRSwgMHg4NCwgMHhGRiwgMHhCRiwgMHg2MCwgMHhBRCwgMHg2NCwgMHg0MCwgMHg0MiwgMHg4MiwgMHhGRiwgMHhFNSwgMHhGRSwKKwkgMHgwMywgMHgwNCwgMHhBQywgMHg2MCwgMHg0MSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFNCwgMHhGRSwgMHgwQSwgMHgwNCwgMHgxRCwgMHhGRiwgMHgwMCwgMHhFQiwKKwkgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQSwKKwkgMHg0MywgMHhGRiwgMHhFNiwgMHhGRSwgMHgwMywgMHgwNSwgMHhBNywgMHg2MCwgMHg5QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzQywgMHg0NCwgMHg2MCwgMHg0NiwKKwkgMHgwRiwgMHhGMCwgMHg0MCwgMHg0MiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwgMHhBQiwgMHg2MCwgMHgwMywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwQiwgMHg2NCwgMHgzQSwgMHhEQiwgMHgxQywgMHg0MiwgMHgyMiwgMHg0NiwgMHgxMywgMHhGMiwgMHhGRiwgMHg2NSwgMHg2MCwgMHg0NywgMHgyQSwgMHhGMiwKKwkgMHg0MCwgMHg0NSwgMHg0MCwgMHg0OCwgMHgwNCwgMHgyQiwgMHgxNywgMHgwMCwgMHgxNiwgMHhGMiwgMHgxRCwgMHhGMiwgMHg0MCwgMHg0MywgMHgwRiwgMHhGMiwKKwkgMHg0MCwgMHg0NCwgMHgyNSwgMHg1RSwgMHgzRiwgMHg0MCwgMHgwMSwgMHgyNywgMHg0MCwgMHg0NSwgMHgwRiwgMHg2NCwgMHgxNCwgMHhGMCwgMHgzNSwgMHhGMiwKKwkgMHhBMCwgMHg4MiwgMHgwRiwgMHhCNCwgMHhDQSwgMHg4NSwgMHhENCwgMHg4MCwgMHgxMCwgMHhGMiwgMHgwMSwgMHgwMiwgMHgyQiwgMHhGQSwgMHgyNywgMHg0NCwKKwkgMHg0MCwgMHhCQywgMHg0MCwgMHg0NywgMHgxMywgMHgwMCwgMHgxNywgMHhGMiwgMHgyQywgMHhGMCwgMHg0MCwgMHg0MywgMHgxQiwgMHhGMiwgMHgxRCwgMHhGQSwKKwkgMHg0MCwgMHg0NCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMiwgMHgwMCwgMHhBQiwgMHhGQywgMHgwNSwgMHgwMCwgMHgyOCwgMHg0MCwgMHhBNCwgMHgzNiwKKwkgMHgwMiwgMHgwMCwgMHgxMSwgMHhGMiwgMHgyQiwgMHhGQSwgMHgyNywgMHg0NCwgMHhCRiwgMHhCNCwgMHg0MCwgMHg0NywgMHgyOCwgMHg0MCwgMHg0MCwgMHgyQiwKKwkgMHhGRiwgMHhGRiwgMHhBRiwgMHg2MCwgMHgyRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMiwgMHg0NiwgMHgyQywgMHhGMCwgMHgyNywgMHg0NCwgMHhERiwgMHhCNCwKKwkgMHg0MCwgMHg0NywgMHhCNSwgMHhGRiwgMHhCQywgMHhGRiwgMHg0NywgMHhGRiwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwKKwkgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMSwgMHgwMCwgMHgxMywgMHgwMCwgMHgyQSwgMHhGMCwgMHgwMSwgMHg2NSwKKwkgMHg2NCwgMHg0MCwgMHhBNCwgMHgzQSwgMHgwNCwgMHg2NSwgMHgyNywgMHg0NCwgMHgzNCwgMHg4NywgMHgzNiwgMHhGMywgMHhCNCwgMHhGRiwgMHg2MCwgMHg1QiwKKwkgMHg0RCwgMHhFMiwgMHgwNCwgMHg2NCwgMHgzQSwgMHhEQiwgMHgwMSwgMHg2MCwgMHgwQSwgMHhFMSwgMHgyQiwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg4MSwgMHgzRSwgMHgwNiwgMHg2NCwgMHgzQSwgMHhEQiwgMHgyMiwgMHg0NiwgMHgwMSwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhCRiwgMHg2MCwKKwkgMHg4NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCNSwgMHhGRiwgMHhBMSwgMHhGRiwgMHg2QywgMHg0MCwgMHgzRiwgMHg0MCwgMHgwMSwgMHgyQiwgMHgwMywgMHgwMCwKKwkgMHg2NywgMHg0QywgMHgwNSwgMHg2MCwgMHg2OSwgMHg2QiwgMHgwMiwgMHhFMSwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHhDNCwgMHhFMiwgMHgwOCwgMHg2NCwKKwkgMHgzQSwgMHhEQiwgMHhGMCwgMHhGRSwgMHgyNSwgMHg0NiwgMHgwMSwgMHhGMiwgMHg2MSwgMHg0NSwgMHhENCwgMHg5RSwgMHgyMSwgMHg0NiwgMHgxNiwgMHhGQSwKKwkgMHgyQSwgMHg0NCwgMHg3MiwgMHg0NSwgMHgyNCwgMHhGQSwgMHg5NSwgMHhGMywgMHgwNiwgMHgwNCwgMHhFNCwgMHhFMiwgMHhEQywgMHg5QywgMHgyOSwgMHg0MCwKKwkgMHgwMSwgMHgyNiwgMHg2NCwgMHg0NCwgMHg5NSwgMHhGOSwgMHgyNSwgMHhGQSwgMHg5NiwgMHhGMywgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHg5NiwgMHhGQiwKKwkgMHgyOCwgMHhGQSwgMHg5NywgMHhGMywgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHg5NywgMHhGQiwgMHgyOSwgMHhGQSwgMHgyRCwgMHg0NCwgMHgwNCwgMHgyQSwKKwkgMHgwNiwgMHgwMCwgMHgyOCwgMHg0MCwgMHhBNCwgMHgzNiwgMHgwMywgMHgwMCwgMHhBOSwgMHg2MCwgMHhDOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg5NCwgMHhGQywKKwkgMHgxRiwgMHg2MCwgMHg5QSwgMHg2NSwgMHhBNSwgMHhEMSwgMHgyOCwgMHg0NCwgMHgwOCwgMHgyQSwgMHg1MSwgMHgwMCwgMHgwMywgMHgyQiwgMHgwMSwgMHgwMCwKKwkgMHg0RSwgMHgwMCwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwgMHg0QiwgMHgwMCwgMHgzMiwgMHhGMiwgMHgyRiwgMHhGMCwgMHg1MCwgMHhGRSwgMHgwMSwgMHgyQSwKKwkgMHgwMywgMHgwMCwgMHgwMSwgMHg2MSwgMHg4RiwgMHhGMywgMHgzMSwgMHgwMCwgMHhEMCwgMHg4MCwgMHgzMywgMHhGMiwgMHgzMCwgMHhGMCwgMHgzNCwgMHhGMiwKKwkgMHhEMCwgMHg4MCwgMHgzMSwgMHhGMCwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHg2MCwgMHg0NywgMHgzNCwgMHgwQywgMHhGRiwgMHhCNCwgMHgxMiwgMHg2MCwKKwkgMHhDRSwgMHg2NSwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHhGRiwgMHhGRiwgMHgzMSwgMHgxOCwgMHg2MCwgMHg0MywgMHg1MCwgMHhGRSwKKwkgMHg2NiwgMHg0MSwgMHgzMiwgMHhGMCwgMHg2MywgMHg0NiwgMHgwMywgMHhGMiwgMHg2MSwgMHg0NiwgMHhEMCwgMHg4MCwgMHgzMywgMHhGMCwgMHg2MywgMHg0NiwKKwkgMHgwNCwgMHhGMiwgMHg2MSwgMHg0NiwgMHhEMCwgMHg4MCwgMHgzNCwgMHhGMCwgMHg2MywgMHg0NiwgMHgwNSwgMHhGMiwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHgwQywgMHgwMCwgMHhGMiwgMHg2MSwgMHg0NiwgMHgxQSwgMHgxOCwgMHhFOCwgMHgwMSwgMHgwNiwgMHhGMCwgMHg4RiwgMHhGMywKKwkgMHg2MSwgMHg0NiwgMHgwMiwgMHg2MSwgMHg2NCwgMHg0MCwgMHgwMiwgMHgyQSwgMHgxMiwgMHgwMCwgMHhGQywgMHhBMCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwRSwKKwkgMHg2MSwgMHg0NCwgMHgxNCwgMHhGQSwgMHgxMSwgMHhGQywgMHgwQiwgMHgwMCwgMHgyQywgMHhGMiwgMHgyRiwgMHhGQSwgMHgyRCwgMHhGMiwgMHgzMCwgMHhGQSwKKwkgMHgyRSwgMHhGMiwgMHgzMSwgMHhGQSwgMHgxRCwgMHhGRiwgMHgyNiwgMHg0NCwgMHgwMiwgMHhCQywgMHg0MCwgMHg0NiwgMHgyMCwgMHgwMCwgMHgyNiwgMHg0MywKKwkgMHg4NCwgMHhCQiwgMHhGQywgMHhCMywgMHgyMSwgMHg0NiwgMHgwMSwgMHg1RCwgMHgwRiwgMHhGQywgMHg1QywgMHg0NiwgMHgyNSwgMHg0NCwgMHgwNiwgMHhGQSwKKwkgMHgwNSwgMHhGRiwgMHgyNywgMHg0NCwgMHgwMSwgMHgyQSwgMHgxMywgMHgwMCwgMHg1MCwgMHhGRSwgMHgyOCwgMHg0MCwgMHgwOCwgMHgzQSwgMHgxMiwgMHgwMCwKKwkgMHgyRiwgMHhGMiwgMHgzMCwgMHhGMCwgMHg2MCwgMHg0MywgMHgzMSwgMHhGMiwgMHgyMiwgMHg0NiwgMHg2NCwgMHg0MSwgMHgyQywgMHhGMCwgMHgyRCwgMHhGMCwKKwkgMHhEMywgMHg4MCwgMHgyRSwgMHhGMCwgMHhEMSwgMHg4MCwgMHhEMCwgMHg4MCwgMHgyNywgMHg0NCwgMHgwOSwgMHgwQywgMHgwMywgMHgwMCwgMHgyNywgMHg0NCwKKwkgMHgwNiwgMHgyMiwgMHgwNSwgMHgwMCwgMHhCOCwgMHhCNCwgMHg0MCwgMHg0NywgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhENCwgMHg2NCwKKwkgMHg0MCwgMHg0OCwgMHgwRCwgMHg2NCwgMHgzQSwgMHhEQiwgMHgyMSwgMHg0NiwgMHgxQywgMHhGMiwgMHg2MiwgMHhGMSwgMHhGRiwgMHhCNCwgMHhEMCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgwNiwgMHg2NCwgMHg0NCwgMHg0MCwgMHg0NSwgMHgwQSwgMHgzNiwgMHg3MCwgMHg2NCwgMHgxNCwgMHgzNiwgMHgzOCwgMHg2NCwKKwkgMHgzNywgMHgzQSwgMHgwMywgMHgwMCwgMHgwNCwgMHg3RiwgMHg0MCwgMHg0NSwgMHgxNSwgMHg2NCwgMHg2RSwgMHgzQSwgMHgwMywgMHgwMCwgMHg4NCwgMHg3RiwKKwkgMHg0MCwgMHg0NSwgMHgwQiwgMHg2NCwgMHg0MCwgMHg0NCwgMHgwMCwgMHg2MywgMHgyOCwgMHg0NCwgMHhBNCwgMHgzNiwgMHgwNywgMHgwMCwgMHgwNCwgMHgyQiwKKwkgMHgwNSwgMHgwMCwgMHgzMCwgMHhGMywgMHgyNCwgMHg0NSwgMHhENCwgMHg4NCwgMHhDQSwgMHg2NSwgMHhENCwgMHg4MywgMHhENCwgMHg2NCwgMHgxQSwgMHgwMCwKKwkgMHgwRiwgMHg2NCwgMHgzQSwgMHhEQiwgMHgyMSwgMHg0NiwgMHg3MCwgMHg2MywgMHgxQywgMHhGMiwgMHhDQSwgMHg2NSwgMHg0MCwgMHg0NSwgMHgwQSwgMHgzNiwKKwkgMHg3MCwgMHg2NCwgMHgxNCwgMHgzNiwgMHgzOCwgMHg2NCwgMHgzNywgMHgzQSwgMHgwMywgMHgwMCwgMHgwNCwgMHg3RiwgMHg0MCwgMHg0NSwgMHgxNSwgMHg2NCwKKwkgMHg2RSwgMHgzQSwgMHgwMywgMHgwMCwgMHg4NCwgMHg3RiwgMHg0MCwgMHg0NSwgMHgwQiwgMHg2NCwgMHg0MCwgMHg0NCwgMHgyQiwgMHhGMiwgMHhDNCwgMHg4NSwKKwkgMHhENCwgMHg4MywgMHhDNCwgMHg2NCwgMHg0MCwgMHg0OCwgMHgyRiwgMHhGMCwgMHhCMCwgMHhGMCwgMHhCMSwgMHhGMiwgMHgwMCwgMHhFMSwgMHhBMSwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHg4MCwgMHg0RSwgMHg4MywgMHg0QywgMHg5QSwgMHhGRiwgMHg4NCwgMHg0QywgMHg4NSwgMHg0QywgMHg4MSwgMHg0QywgMHhBMSwgMHhGRiwKKwkgMHg5OCwgMHhGRiwgMHg4NywgMHg0RiwgMHg4NywgMHg0QywgMHg4NywgMHg0RiwgMHg4NywgMHg0RCwgMHg4NywgMHg0QywgMHgwMSwgMHgwOCwgMHgwMSwgMHgwMCwKKwkgMHhGRiwgMHhGRiwgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2QSwgMHg0NCwKKwkgMHhCQywgMHhGRiwgMHhDNCwgMHhFMiwgMHgwQywgMHg3NCwgMHgwNCwgMHhFMSwgMHhBMSwgMHhGRiwgMHgzNSwgMHhGMywgMHhDNCwgMHhFMiwgMHg2MCwgMHg1NCwKKwkgMHg4OSwgMHhGRiwgMHgxMywgMHg3NCwgMHg4OCwgMHhGRiwgMHhCNSwgMHhGRiwgMHg0NywgMHhGRiwgMHgyOSwgMHg0NCwgMHhGNywgMHhCNCwgMHg0MCwgMHg0OSwKKwkgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwgMHgyNywgMHg0NCwgMHgwMSwgMHgyQSwKKwkgMHgwNSwgMHgwMCwgMHhGRSwgMHhCNCwgMHg0MCwgMHg0NywgMHhBOCwgMHg2MCwgMHg4OSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBNywgMHg2MCwgMHg4RSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyOCwgMHg0MCwgMHhCNCwgMHgzQSwgMHgwOSwgMHgwMCwgMHgyNywgMHg0NCwgMHgwNywgMHgyMiwgMHgwNSwgMHgwMCwgMHhGOCwgMHhCNCwKKwkgMHg0MCwgMHg0NywgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHg5QiwgMHgwMSwgMHgyOCwgMHg0NCwgMHhENCwgMHgzNiwgMHgwMywgMHgwMCwKKwkgMHhBQSwgMHg2MCwgMHhFQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0OCwgMHhFMiwgMHgyNywgMHg0NCwgMHhGQiwgMHhCNCwgMHg0MCwgMHg0NywgMHgyMSwgMHg2MCwKKwkgMHg5OCwgMHg2MywgMHhBMywgMHhEMywgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhFMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgzNCwgMHhGQiwgMHgxQywgMHg0MiwKKwkgMHgyMiwgMHg0NiwgMHgyQSwgMHhGMCwgMHhGNywgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyQiwKKwkgMHhDQywgMHgwMCwgMHgyMiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgyMiwgMHgyNiwgMHg0MiwgMHgwMCwgMHgwMSwgMHgyNiwgMHgwMywgMHgwMCwKKwkgMHgwNCwgMHgyNiwgMHgwNywgMHgwMCwgMHhDMiwgMHgwMCwgMHgwNCwgMHgyQiwgMHhDMCwgMHgwMCwgMHg4OCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NiwKKwkgMHgwMSwgMHgwMCwgMHgwNywgMHhGNCwgMHg0NywgMHhGMiwgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHg0NywgMHhGQSwgMHgwRCwgMHg2MCwgMHgzRSwgMHg2MiwKKwkgMHg4MCwgMHhGRiwgMHhDNCwgMHg2MCwgMHg3OCwgMHg0NCwgMHgwMiwgMHhBNCwgMHhBMiwgMHhEQiwgMHg3RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4MiwgMHhGRiwKKwkgMHg4OCwgMHhGMywgMHg2NiwgMHg1QywgMHhEMCwgMHg4MCwgMHgwMCwgMHg3QywgMHgwNywgMHgwMywgMHg2NiwgMHg0MywgMHgyMiwgMHg0NiwgMHgyMiwgMHhGMiwKKwkgMHg2MywgMHg0NiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMSwgMHgwMCwgMHgzQywgMHhGMSwgMHg0NywgMHhGMCwgMHg2NCwgMHg0MSwgMHg2NCwgMHg0NywKKwkgMHhGRiwgMHhCNCwgMHg2MCwgMHg1RiwgMHgyMCwgMHhCQywgMHg4MCwgMHgyNiwgMHg4MCwgMHhBQywgMHg2MCwgMHg0NywgMHgyMiwgMHg0NiwgMHgzQSwgMHhGQSwKKwkgMHg2NCwgMHg0NCwgMHgyMCwgMHg3RiwgMHgzNCwgMHg5NCwgMHgzQiwgMHhGQSwgMHgwOCwgMHg2MCwgMHgwMCwgMHhFQSwgMHgwRiwgMHg2NCwgMHg2MCwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQSwgMHg4NSwgMHgwMCwKKwkgMHgyQSwgMHhGMiwgMHgwMCwgMHg2MCwgMHg3QywgMHg2MiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgyNywgMHgwMCwgMHhBMiwgMHhEMywgMHgwMCwgMHg2MSwKKwkgMHg2MCwgMHhGRSwgMHhBMCwgMHhEMywgMHhERSwgMHg4MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHg2NCwgMHg1RiwgMHhEQywgMHg4NCwKKwkgMHhGMSwgMHg4MSwgMHhDMCwgMHgyQiwgMHgwNCwgMHgwMCwgMHg4MCwgMHgyQSwgMHgwMiwgMHgwMCwgMHg3RiwgMHhBNCwgMHhEQywgMHg4NCwgMHhGRiwgMHgzQiwKKwkgMHgwMywgMHgwMCwgMHg2MCwgMHg0NywgMHhEQywgMHg4NywgMHgwMSwgMHg2MSwgMHhDMCwgMHg4MCwgMHgwMCwgMHgzNiwgMHhEQywgMHg4NCwgMHg0RSwgMHhEQiwKKwkgMHg2MCwgMHhGRSwgMHhEQSwgMHg4MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwgMHhDMSwgMHg4NCwgMHhGMCwgMHgyMiwgMHgxMCwgMHhBNCwgMHhGMCwgMHgyQSwKKwkgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHgwMCwgMHg2MCwgMHg3QywgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhBMCwgMHhEMywgMHg1QSwgMHhEMSwgMHgzQSwgMHhGQSwgMHgzQiwgMHhGOCwgMHg3NCwgMHg2MiwgMHhBMiwgMHhEMCwgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHg0NCwgMHhFMCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFMSwgMHg3RiwgMHg1QSwgMHhEMCwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwKKwkgMHhFMiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgwMCwgMHg2MCwgMHg4MCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhBMCwgMHhEMSwgMHg1QSwgMHhEMSwKKwkgMHg2NCwgMHg0NSwgMHg2NCwgMHg0NCwgMHhFMywgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFNCwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwKKwkgMHg2NCwgMHg0NCwgMHhFNSwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFNiwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwKKwkgMHhFNywgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NSwgMHg0MCwgMHgwRCwgMHgzQSwgMHgxQywgMHgwMCwgMHg2NCwgMHg0NywgMHhFOCwgMHg3RiwgMHg1QSwgMHhEMSwKKwkgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFOSwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFQSwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwKKwkgMHg2NCwgMHg0NCwgMHhFQiwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFQywgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwKKwkgMHhFRCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFRSwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFRiwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHgwOCwgMHg2MCwgMHgwMCwgMHhFQSwgMHg2NSwgMHg0NCwgMHgwMiwgMHhBNCwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg4MCwgMHg2MCwKKwkgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQSwgMHgwQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg3RiwgMHhCNCwKKwkgMHgwQywgMHhGMCwgMHgwNCwgMHgwMiwgMHg2NCwgMHg0NiwgMHgwMCwgMHhGMCwgMHgwNCwgMHg2NCwgMHgyMiwgMHg0NiwgMHgwMywgMHhGQSwgMHg2MCwgMHg0MSwKKwkgMHg2NCwgMHg0NiwgMHgwMSwgMHhGMiwgMHhGQywgMHhBMSwgMHg2MSwgMHg0NSwgMHhENCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMiwgMHgwMCwgMHhGMCwKKwkgMHgwNCwgMHg2MywgMHg2NCwgMHg0NiwgMHgwMSwgMHhGMiwgMHgyMiwgMHg0NiwgMHgxQSwgMHhGQSwgMHgwMywgMHhGQywgMHgwMiwgMHgwMCwgMHgyMiwgMHg0NiwKKwkgMHgxQSwgMHhGQSwgMHgzNSwgMHhGMiwgMHgwNCwgMHhGOCwgMHhEQywgMHg4NCwgMHgzNSwgMHhGQSwgMHgxNCwgMHhGMiwgMHgwRiwgMHhCNSwgMHgwRiwgMHhCNCwKKwkgMHhDQywgMHg4NCwgMHg5NCwgMHg4MCwgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyQSwgMHhGMiwgMHgwMSwgMHgwMiwgMHg5NCwgMHg4NCwgMHgyQSwgMHhGQSwKKwkgMHg5NSwgMHhGQywgMHgwNiwgMHgwMCwgMHhDNCwgMHgzQSwgMHgwNywgMHgwMCwgMHgyNywgMHg0NCwgMHhGRCwgMHhCNCwgMHg0MCwgMHg0NywgMHg0OCwgMHhFMiwKKwkgMHhBOCwgMHg2MCwgMHgyOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyOCwgMHg0NCwgMHgwNCwgMHgyNiwgMHgwNSwgMHgwMCwgMHg2OCwgMHgzQSwgMHgwMywgMHgwMCwKKwkgMHgzMiwgMHg0NCwgMHgwMCwgMHgyNywgMHgwMywgMHgwMCwgMHhBNywgMHg2MCwgMHg5QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQSwgMHg2NCwgMHgzQSwgMHhEQiwKKwkgMHhBNywgMHg2MCwgMHg5QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg2NCwgMHgzQSwgMHhEQiwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgzQywgMHg0NiwKKwkgMHgyQSwgMHhGMiwgMHgxMywgMHhGMCwgMHhBNCwgMHg4NCwgMHhCNCwgMHhCQywgMHg0MCwgMHg0OCwgMHg2MiwgMHhGMSwgMHg2NCwgMHg0NywgMHhGRiwgMHhCNCwKKwkgMHg2MCwgMHg0NSwgMHhEMCwgMHg4MCwgMHg3MCwgMHg2MSwgMHgwMSwgMHgwNiwgMHg2NCwgMHg0NCwgMHgwQSwgMHgzNiwgMHg3MCwgMHg2NCwgMHgxNCwgMHgzNiwKKwkgMHgzOCwgMHg2NCwgMHgzNywgMHgzNiwgMHgxNSwgMHg2NCwgMHg2RSwgMHgzNiwgMHgwQiwgMHg2NCwgMHg0MCwgMHg0RSwgMHhBMCwgMHg2MywgMHgwQSwgMHg2NCwKKwkgMHg2NSwgMHg0MCwgMHgwQSwgMHgzNiwgMHgwMywgMHgwMCwgMHgzOCwgMHg2MSwgMHgxNCwgMHg2NCwgMHhFQiwgMHg4MywgMHg0MCwgMHg0NSwgMHg0MywgMHg0NCwKKwkgMHgwMiwgMHg2MCwgMHg1RSwgMHg2NSwgMHgyQSwgMHhGMiwgMHgyQiwgMHhGMiwgMHg2MCwgMHg0MCwgMHgwNCwgMHgyQiwgMHgwNCwgMHgwMCwgMHgyRSwgMHg0NSwKKwkgMHhENCwgMHg4NSwgMHhDNSwgMHg4NCwgMHgwNSwgMHgwMCwgMHgxQiwgMHhGMCwgMHhDNSwgMHg4NCwgMHhDMCwgMHg4NCwgMHgyRSwgMHg0NSwgMHhDNCwgMHg4NCwKKwkgMHg2MCwgMHg0MywgMHgyOCwgMHg0NCwgMHgwMCwgMHhFMSwgMHhBMSwgMHhGRiwgMHg4MCwgMHg0RSwgMHg4MywgMHg0QywgMHg5QSwgMHhGRiwgMHg1NiwgMHg2MiwKKwkgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg1QywgMHg2MiwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHhBMSwgMHhGRiwKKwkgMHg5OCwgMHhGRiwgMHg4NywgMHg0RiwgMHg4NywgMHg0QywgMHg4NywgMHg0RiwgMHg4NywgMHg0RCwgMHg4NywgMHg0QywgMHgwMSwgMHgwOCwgMHgwMSwgMHgwMCwKKwkgMHhGRiwgMHhGRiwgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2QSwgMHg0NCwKKwkgMHhCQywgMHhGRiwgMHhCNSwgMHhGRiwgMHg0NywgMHhGRiwgMHgyNywgMHg0NCwgMHgwMiwgMHhCQywgMHg0MCwgMHg0NywgMHgzNiwgMHhGMywgMHhCNywgMHhGRiwKKwkgMHhCNCwgMHhGRiwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwgMHg2MCwgMHg1QiwgMHg0RCwgMHhFMiwgMHhBOCwgMHg2MCwKKwkgMHg4MSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMSwgMHg0NiwgMHhCNSwgMHhGRiwgMHhCQywgMHhGRiwgMHg0NywgMHhGRiwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwKKwkgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwgMHgyNiwgMHg0MywgMHgyNSwgMHg0NCwgMHgwNiwgMHhGQSwgMHgyQSwgMHg0NCwKKwkgMHg3MiwgMHg0NSwgMHgyNCwgMHhGQSwgMHg5NSwgMHhGMywgMHgwNiwgMHgwNCwgMHhFNCwgMHhFMiwgMHhEQywgMHg5QywgMHgyOSwgMHg0MCwgMHgwMSwgMHgyNiwKKwkgMHg2NCwgMHg0NCwgMHg5NSwgMHhGOSwgMHgyNSwgMHhGQSwgMHg5NiwgMHhGMywgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHg5NiwgMHhGQiwgMHgyOCwgMHhGQSwKKwkgMHg5NywgMHhGMywgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHg5NywgMHhGQiwgMHgyOSwgMHhGQSwgMHgyRCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwRSwgMHgwMCwKKwkgMHgxRCwgMHhGRiwgMHgyNiwgMHg0NCwgMHgwMiwgMHhCQywgMHg0MCwgMHg0NiwgMHgyNywgMHg0NCwgMHgwNywgMHgyMiwgMHgwNSwgMHgwMCwgMHhGOCwgMHhCNCwKKwkgMHg0MCwgMHg0NywgMHgwNiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHgzMCwgMHhGMSwgMHg1MCwgMHgwMCwgMHhGQywgMHhCMywgMHgzMiwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgwNiwgMHgwMCwgMHgwQSwgMHhCQiwgMHgwRiwgMHhGQywgMHhDQiwgMHhGRSwgMHhBNywgMHg2MCwgMHg5QiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyRCwgMHg0NCwgMHgwNCwgMHgyNiwgMHgwMiwgMHgwMCwgMHgwRiwgMHhGQywgMHgwNSwgMHhGRiwgMHgzMCwgMHhGMSwgMHgyNywgMHg0NCwgMHgwNSwgMHgyMiwKKwkgMHgyRCwgMHgwMCwgMHhGQSwgMHhCNCwgMHg0MCwgMHg0NywgMHgyRCwgMHg0NCwgMHgxMCwgMHgyQSwgMHgyNCwgMHgwMCwgMHgyOCwgMHg0MCwgMHhENCwgMHgzQSwKKwkgMHgyMSwgMHgwMCwgMHgzMSwgMHg0MCwgMHgwOCwgMHgyNiwgMHgwMCwgMHg3QywgMHgyQiwgMHg0NCwgMHhEMCwgMHg4MCwgMHg3MCwgMHg0NSwgMHgwMiwgMHgyOCwKKwkgMHg2NCwgMHg0NCwgMHhDNCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgyNCwgMHgwMCwgMHhCNCwgMHg2MCwgMHg1MCwgMHgwOCwgMHgyOCwgMHgwMSwgMHgwMCwKKwkgMHgyMCwgMHgyOSwgMHg2RCwgMHhFMiwgMHgxMiwgMHg2MCwgMHhDMCwgMHg2MywgMHgxRCwgMHhGMCwgMHhDMCwgMHg2NCwgMHhDMCwgMHg4NCwgMHhBMywgMHhEMSwKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhDMCwgMHg4NCwgMHhBMywgMHhEQiwgMHhBOCwgMHg2MCwKKwkgMHg4OSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMiwgMHgyQSwgMHgwNSwgMHgwMCwKKwkgMHhGRCwgMHhCNCwgMHg0MCwgMHg0NywgMHgwNiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHgwNSwgMHg2NCwgMHgzQSwgMHhEQiwgMHgyOCwgMHg0NCwKKwkgMHhBNCwgMHgzQSwgMHgwNCwgMHgwMCwgMHgzOSwgMHhGMSwgMHgyNSwgMHg0NCwgMHgwQSwgMHgzNiwgMHgzOCwgMHhGMSwgMHgzMSwgMHg0MCwgMHgwOCwgMHgyNiwKKwkgMHgwMCwgMHg3QywgMHgyQiwgMHg0NCwgMHhEMCwgMHg4MCwgMHg3MCwgMHg0NSwgMHgwMiwgMHgyOCwgMHg2NCwgMHg0NCwgMHhDNCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgyNCwgMHgwMCwgMHhCNCwgMHgyOCwgMHg0MCwgMHhFNCwgMHgzNiwgMHgwMCwgMHhCNCwgMHg2MCwgMHg1MCwgMHgwOCwgMHgyOCwgMHgwMSwgMHgwMCwKKwkgMHgyMCwgMHgyOSwgMHg2RCwgMHhFMiwgMHhBNywgMHg2MCwgMHg4RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMSwgMHg0NiwgMHhCNSwgMHhGRiwgMHhCQywgMHhGRiwKKwkgMHg0NywgMHhGRiwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwgMHgyNywgMHg0NCwKKwkgMHgwNywgMHgyMiwgMHgwNSwgMHgwMCwgMHhGOCwgMHhCNCwgMHg0MCwgMHg0NywgMHgwNiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhFQSwgMHgwMSwKKwkgMHgyNywgMHg0NCwgMHgwNSwgMHgyMiwgMHgwOSwgMHgwMCwgMHhCQSwgMHhCNCwgMHg0MCwgMHg0NywgMHgzQywgMHg0NiwgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwKKwkgMHhDMCwgMHhGRSwgMHhBNywgMHg2MCwgMHg5QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg0NCwgMHgwMiwgMHgyQSwgMHgwNiwgMHgwMCwgMHhGRCwgMHhCNCwKKwkgMHg0MCwgMHg0NywgMHgwNiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhGNCwgMHgwMSwgMHhGMywgMHgwQSwgMHg3QywgMHg1MCwgMHg2RCwgMHhFMiwKKwkgMHhGMCwgMHgwMSwgMHg3MiwgMHg0NSwgMHhEQywgMHg4NCwgMHg5NSwgMHhGQiwgMHgxMSwgMHg2NCwgMHgzQSwgMHhEQiwgMHg5NiwgMHhGMywgMHgwNiwgMHgwNCwKKwkgMHhEQywgMHg4NCwgMHg5NiwgMHhGQiwgMHg5NywgMHhGMywgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHg5NywgMHhGQiwgMHhBNywgMHg2MCwgMHhBNiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MSwgMHgxMiwgMHg2NCwgMHgzQSwgMHhEQiwgMHgxNiwgMHg2MCwgMHhCQSwgMHg2MywgMHhCRCwgMHhEMywgMHg3MiwgMHg0NSwKKwkgMHg0NCwgMHg4QSwgMHgwMiwgMHgyOCwgMHgwMiwgMHgwMCwgMHhFNCwgMHhFMiwgMHhERCwgMHg4MSwgMHgwMiwgMHgyOCwgMHgwMiwgMHgwMCwgMHhFNCwgMHhFMiwKKwkgMHhERCwgMHg4MSwgMHhCRCwgMHhEMywgMHg5NSwgMHhGMSwgMHg2MSwgMHg0NSwgMHhDMCwgMHg4NCwgMHgwMCwgMHg2MSwgMHgwMiwgMHgyNCwgMHgwMSwgMHhCOSwKKwkgMHhDNCwgMHg4NCwgMHg2MCwgMHg1NSwgMHgyQSwgMHg1MiwgMHg5NSwgMHhGQiwgMHgwMiwgMHgyNCwgMHgwMSwgMHhCOSwgMHhCRCwgMHhEMywgMHg5NiwgMHhGMSwKKwkgMHg2MSwgMHg0NSwgMHhDMCwgMHg4NCwgMHgwMCwgMHg2MSwgMHgwMiwgMHgyNCwgMHgwMSwgMHhCOSwgMHhDNCwgMHg4NCwgMHg5NiwgMHhGQiwgMHgwMiwgMHgyNCwKKwkgMHgwMSwgMHhCOSwgMHhCRCwgMHhEMywgMHg5NywgMHhGMSwgMHg2MSwgMHg0NSwgMHhDMCwgMHg4NCwgMHhDNCwgMHg4NCwgMHg5NywgMHhGQiwgMHhBOCwgMHg2MCwKKwkgMHgwQywgMHg3OCwgMHhGRiwgMHhGRiwgMHhBRSwgMHgwMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwgMHgyNSwgMHgwOSwgMHgwMCwgMHgwNCwgMHgyNSwKKwkgMHgwMywgMHgwMCwgMHg0NywgMHhGRiwgMHgzMiwgMHg3NCwgMHhBNSwgMHgwMSwgMHhDNCwgMHhFMiwgMHhBRiwgMHg2MCwgMHgxOSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg0QywgMHg0RSwgMHg0NywgMHhGRiwgMHgzMiwgMHg3NCwgMHhDRCwgMHhFMiwgMHhBQywgMHg2MCwgMHg4RiwgMHg3OCwgMHgwMCwgMHg2MSwgMHgxMCwgMHg2NCwKKwkgMHgzQSwgMHhEQiwgMHhBNywgMHg2MCwgMHg5QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBNywgMHg2MCwgMHg5QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1QywgMHg0RCwKKwkgMHgyNiwgMHg0NCwgMHgwMiwgMHgyNiwgMHgwQywgMHgwMCwgMHgzRSwgMHg0NiwgMHgwOSwgMHhGMiwgMHgxRSwgMHg0MSwgMHgwMywgMHgxQiwgMHhBRSwgMHg2MCwKKwkgMHhDQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0MCwgMHg1RSwgMHhGRCwgMHhGQiwgMHgyMSwgMHg0NCwgMHgwMiwgMHg2NCwgMHg0MCwgMHg0NiwgMHg0MSwgMHg1RCwKKwkgMHgyMSwgMHg0NiwgMHgwMCwgMHhGMiwgMHg0NiwgMHg0NSwgMHg4NywgMHhGQywgMHg0QywgMHhFMiwgMHgwMSwgMHg2NCwgMHgzMywgMHhGQiwgMHgwMSwgMHg2MCwKKwkgMHgwRSwgMHhFMSwgMHgwMywgMHhFMSwgMHgzRiwgMHg0MCwgMHgwMSwgMHgyNywgMHgwMCwgMHgwMCwgMHgyMSwgMHg2OSwgMHhCNiwgMHhGRiwgMHhBMSwgMHhGRiwKKwkgMHg2QywgMHg1RSwgMHhCNiwgMHhGRiwgMHhCNywgMHhGRiwgMHg2MCwgMHg1QywgMHgyMCwgMHg2NCwgMHgzQSwgMHhEQiwgMHg2OCwgMHg0MywgMHgyNiwgMHhGQywKKwkgMHgyMiwgMHg2OSwgMHg2NCwgMHg0NCwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2QywgMHg1RiwgMHg2MCwgMHg0MywgMHgyNiwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHg2OCwgMHg1RiwgMHgyNiwgMHhGQSwgMHgzQSwgMHg2OSwgMHgxRCwgMHhGQywgMHgyRSwgMHg0NCwgMHgzNiwgMHhGMSwgMHgxQywgMHhGQSwgMHhDMywgMHg5NCwKKwkgMHhDRCwgMHhFMiwgMHgyRSwgMHg0NCwgMHgxNCwgMHgzNiwgMHgxMiwgMHgwMCwgMHgwQSwgMHgzNiwgMHgwRiwgMHgwMCwgMHg2MywgMHg0NSwgMHhFMywgMHg4MywKKwkgMHhFMywgMHg4MywgMHhDNywgMHg4MywgMHhFMywgMHg4MywgMHhDNywgMHg4MywgMHhGRiwgMHhGRiwgMHgzNywgMHgzNiwgMHgwNSwgMHgwMCwgMHg2RSwgMHgzNiwKKwkgMHgwNCwgMHgwMCwgMHhBRSwgMHg2MCwgMHhFMywgMHg3OCwgMHhGRiwgMHhGRiwgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywKKwkgMHhGRiwgMHhGRiwgMHg4MCwgMHgyNywgMHhDRiwgMHg4MywgMHgxQiwgMHhGQywgMHgwMSwgMHg2NCwgMHg0RiwgMHhGQiwgMHhBMSwgMHhGRiwgMHgxQywgMHhGMiwKKwkgMHgyOSwgMHg0MSwgMHhGOSwgMHg4MSwgMHg1MiwgMHg0QSwgMHg3MSwgMHg4OSwgMHg2OCwgMHg1RiwgMHgyNywgMHhGQSwgMHg2QywgMHg0MCwgMHgwMywgMHgxNSwKKwkgMHhBRSwgMHg2MCwgMHhGNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4OCwgMHg2MCwgMHg4NSwgMHg3MSwgMHg4RCwgMHhFMiwgMHg5OSwgMHhGMSwgMHhGQywgMHhBMywKKwkgMHhEMywgMHg4MCwgMHg0MywgMHg0MywgMHgwMywgMHgwNCwgMHhBRSwgMHg2MCwgMHhFQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMiwgMHg0MCwgMHgwMSwgMHgyQSwKKwkgMHg0QywgMHgwMCwgMHg5QSwgMHhGRiwgMHgyMywgMHg0MywgMHgxOCwgMHg2MSwgMHhBMSwgMHhGRiwgMHg4QywgMHg0NCwgMHhDQiwgMHg4MywgMHgyQSwgMHhGQSwKKwkgMHg0MCwgMHg0OCwgMHg0MCwgMHgyNywgMHgwNCwgMHhBMSwgMHg2MCwgMHg0MCwgMHgwMywgMHgyQiwgMHgwMSwgMHgwMCwgMHgwNiwgMHhBMSwgMHg4OCwgMHhCMCwKKwkgMHg4OCwgMHgzNiwgMHhEOSwgMHg4MSwgMHg2MiwgMHg0NSwgMHgyMywgMHg0NCwgMHg1NCwgMHg5NCwgMHgyOCwgMHg0MCwgMHgwNCwgMHgyNiwgMHgwMCwgMHg2NCwKKwkgMHgzRiwgMHhGQSwgMHhDOSwgMHg4MSwgMHg2NSwgMHg0MiwgMHg3QSwgMHhEQywgMHgwMCwgMHhCOSwgMHhGRCwgMHgxQywgMHgwMCwgMHhGNCwgMHg2RSwgMHg2MSwKKwkgMHgxMCwgMHg2MiwgMHgxNCwgMHgwMiwgMHgwNSwgMHgxRCwgMHgxMiwgMHgxRSwgMHgwQywgMHgwMCwgMHgwMCwgMHhGNCwgMHg3QywgMHg2MSwgMHgwMiwgMHg2MiwKKwkgMHg3QSwgMHhEQywgMHg2MywgMHg0MCwgMHhGRCwgMHgxQywgMHhGOSwgMHgxRCwgMHhGRiwgMHhCMSwgMHgwOCwgMHgxRSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwKKwkgMHgwMiwgMHg2MiwgMHhCNiwgMHhGRiwgMHhCNywgMHhGRiwgMHhBMSwgMHhGRiwgMHg2QywgMHg0NCwgMHg1QSwgMHhEQSwgMHg5OCwgMHhGRiwgMHgwMSwgMHg2MCwKKwkgMHgwOCwgMHhFMSwgMHg4MSwgMHhFMSwgMHhBMSwgMHhGRiwgMHg2QywgMHg0MCwgMHhBMSwgMHhGRiwgMHg0NywgMHhGRiwgMHgyNiwgMHg0NCwgMHhGRCwgMHhCNCwKKwkgMHg4NCwgMHhCQywgMHgwMSwgMHgxNSwgMHg3RiwgMHhCNCwgMHg0MCwgMHg0NiwgMHhBMSwgMHhGRiwgMHg2QywgMHg0MCwgMHgxNCwgMHg2MywgMHgwMSwgMHgxMSwKKwkgMHgwMSwgMHgwMCwgMHhGRCwgMHgxRiwgMHhBRSwgMHg2MCwgMHg2MSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg5QSwgMHhGRiwgMHg1NCwgMHg2MywgMHgxMiwgMHg2NCwKKwkgMHg0MCwgMHg0NiwgMHgwMCwgMHg2NCwgMHgwRiwgMHhGQSwgMHhBMSwgMHhGRiwgMHhDQiwgMHhGMSwgMHgxMiwgMHg2MSwgMHg1MCwgMHhGRSwgMHg4QywgMHg0NCwKKwkgMHhDQywgMHhGMCwgMHhCRCwgMHhEQSwgMHg0MCwgMHg0OCwgMHgwNCwgMHgyNiwgMHg0MCwgMHgwMCwgMHhBMSwgMHhGRiwgMHg4QywgMHg0NCwgMHhCRCwgMHhEQSwKKwkgMHgzMCwgMHhGQiwgMHg2QywgMHg0NCwgMHhCRCwgMHhEQSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgyNiwgMHgyNCwgMHgwMCwgMHhEMCwgMHg4MCwgMHhBMSwgMHhGRiwKKwkgMHg4QywgMHg0NCwgMHg2QywgMHg1QywgMHhGMiwgMHhGRSwgMHhCRCwgMHhEQSwgMHhDRCwgMHhGMywgMHhENCwgMHg4MCwgMHhEMCwgMHg4MCwgMHhCRCwgMHhEOCwKKwkgMHgyRCwgMHg0NCwgMHgxNSwgMHgwQywgMHgzMiwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwNywgMHgwMCwgMHgyOCwgMHg0MiwgMHgwQywgMHhCMiwgMHgwOCwgMHgzQSwKKwkgMHgwMywgMHgwMCwgMHgxMCwgMHhCQywgMHg0MCwgMHg0RCwgMHg0RCwgMHgwMCwgMHgwMywgMHgwQSwgMHhBRSwgMHg2MCwgMHhGOSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxMSwgMHhCQywgMHg0MCwgMHg0RCwgMHgyOCwgMHg0NSwgMHhCRiwgMHg2MCwgMHhGRiwgMHg2NCwgMHgyNCwgMHg4OCwgMHg0MiwgMHgwMCwgMHgzMCwgMHhCQywKKwkgMHg0MCwgMHg0RCwgMHgzRiwgMHgwMCwgMHgyMCwgMHhCOSwgMHg1QywgMHg4RSwgMHhBMSwgMHhGRiwgMHg4QywgMHg0NCwgMHhCRCwgMHhEQSwgMHhEQywgMHg5QywKKwkgMHg2QywgMHg0NCwgMHhGMiwgMHhGRSwgMHhCRCwgMHhEQSwgMHgwOCwgMHgyOCwgMHg0NCwgMHg0RSwgMHhEQywgMHg4NCwgMHgyRSwgMHg1QywgMHhCMCwgMHg4NCwKKwkgMHhFRiwgMHhCMSwgMHgwOCwgMHgyNCwgMHg0MCwgMHhCOSwgMHg0MSwgMHg0NiwgMHgyQywgMHgwMCwgMHg4QywgMHg0NCwgMHgwNCwgMHg2MSwgMHhCRCwgMHhEQSwKKwkgMHg1MCwgMHhGRSwgMHg4MCwgMHgyNywgMHgwMCwgMHg2NCwgMHgzMCwgMHhGQiwgMHg4QywgMHg0NCwgMHhCRCwgMHhEQSwgMHhEMCwgMHg4MCwgMHg4QywgMHg0NCwKKwkgMHhCRCwgMHhEQSwgMHhENCwgMHg4MCwgMHgwMCwgMHg2NSwgMHg4QywgMHg0NCwgMHhDRCwgMHhGMSwgMHhCRCwgMHhEQSwgMHhEMCwgMHg4MCwgMHgyOCwgMHg0NCwKKwkgMHgwMywgMHgwQywgMHhBMCwgMHgyQSwgMHgwQSwgMHgwMCwgMHgxMSwgMHgwMCwgMHgxMCwgMHg2NSwgMHg2MCwgMHg0MCwgMHhDNCwgMHgzNiwgMHgwNCwgMHgwMCwKKwkgMHhENCwgMHgzQSwgMHgwOCwgMHgwMCwgMHgyNywgMHg0MCwgMHg0MCwgMHgyNiwgMHgzMCwgMHg2NSwgMHgwMCwgMHg2NCwgMHgzRiwgMHhGQSwgMHg0NiwgMHg0RSwKKwkgMHgzNSwgMHg4RCwgMHg1RiwgMHgwMCwgMHg0MCwgMHgyNiwgMHhGOSwgMHgwMSwgMHgzMCwgMHg2NSwgMHg5RCwgMHhEQywgMHg5RCwgMHhEQywgMHg5RCwgMHhEQywKKwkgMHhGNCwgMHgwMSwgMHgwMCwgMHhFMSwgMHgyMywgMHg0MywgMHhFOCwgMHhBMywgMHg2QSwgMHg2MiwgMHg5QSwgMHhGRiwgMHhBMSwgMHhGRiwgMHgyOCwgMHg0NCwKKwkgMHgwMywgMHgyQiwgMHgwNCwgMHgwMCwgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHgyOCwgMHg0NCwgMHg4OCwgMHhCMCwgMHg4OCwgMHgyQSwKKwkgMHgwMywgMHgwMCwgMHg3MCwgMHg2MiwgMHg3QSwgMHhEQywgMHgyOCwgMHg0NCwgMHg0MCwgMHgyQiwgMHgxMywgMHgwMCwgMHg3MiwgMHg2MiwgMHg3QSwgMHhEQywKKwkgMHgwNCwgMHhFNiwgMHg3QSwgMHhEQywgMHgzQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyMCwgMHgyQiwgMHgwMiwgMHgwMCwgMHg3QSwgMHhEQywKKwkgMHg3QSwgMHhEQywgMHgwOCwgMHg2MCwgMHgwMCwgMHhFQiwgMHhGQywgMHhBMywgMHgyNSwgMHhGRiwgMHgzRiwgMHhGQywgMHgwNCwgMHhBMywgMHhCMCwgMHhGRiwKKwkgMHgwMSwgMHgwMCwgMHgzRiwgMHhGQywgMHhDRiwgMHg4MywgMHhERiwgMHg4MywgMHgwNCwgMHgwMiwgMHgwMCwgMHhGNCwgMHgxMCwgMHg2MiwgMHg2QywgMHg2MSwKKwkgMHgxRiwgMHgwMCwgMHgyNywgMHgwMywgMHhDQiwgMHg4MywgMHhGRiwgMHg2MCwgMHhGRSwgMHg2NSwgMHgwRSwgMHhBMywgMHhBNywgMHg4NCwgMHhGMiwgMHhBMywKKwkgMHgwMCwgMHhGNCwgMHgxMCwgMHg2MiwgMHg2QywgMHg2MSwgMHg3QSwgMHhEQywgMHhGRSwgMHgxQywgMHgwMywgMHgxRCwgMHg3QywgMHhBOCwgMHhEOSwgMHg4MSwKKwkgMHgwQSwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MiwgMHhBNywgMHg4NCwgMHg3QSwgMHg2MSwgMHg3QSwgMHhEQywgMHhGRSwgMHgxQywgMHhGOSwgMHgxRCwKKwkgMHg3QywgMHhBOCwgMHhEOSwgMHg4MSwgMHhGNiwgMHgwMywgMHhGRiwgMHhCMSwgMHgwQywgMHgxRSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MiwKKwkgMHhBMSwgMHhGRiwgMHgwMSwgMHg2MCwgMHgwQywgMHhFMSwgMHhCNiwgMHhGRiwgMHhCNywgMHhGRiwgMHhBMSwgMHhGRiwgMHhDRCwgMHg4MSwgMHg2QywgMHg0NCwKKwkgMHg1QSwgMHhEQSwgMHg5OCwgMHhGRiwgMHgwMCwgMHhFNiwgMHg3QywgMHg0NCwgMHgzMywgMHhGQiwgMHgwMSwgMHg2MCwgMHgwQywgMHhFMSwgMHg4MywgMHhFMSwKKwkgMHhBMSwgMHhGRiwgMHg4QywgMHg0NCwgMHg0NiwgMHg0NSwgMHhBMSwgMHhGRiwgMHgxNCwgMHg2MywgMHgwMSwgMHgxMCwgMHhGRSwgMHgxRiwgMHgwMSwgMHg2MCwKKwkgMHgwOCwgMHhFMSwgMHgwQSwgMHg2NCwgMHg2MCwgMHg1NCwgMHg0NywgMHhGRiwgMHg1MCwgMHg0QiwgMHg2NywgMHg1MCwgMHg2OSwgMHhFMiwgMHg2QSwgMHg0MCwKKwkgMHg0MCwgMHgyQiwgMHgwMSwgMHgxNSwgMHgyOSwgMHgwMCwgMHg2QywgMHg0MCwgMHgyOCwgMHg0MCwgMHgwMywgMHgyNiwgMHgxNSwgMHgwMCwgMHgzMSwgMHg0MCwKKwkgMHgyMCwgMHgyQSwgMHgwMywgMHgwMCwgMHgyOCwgMHg0MCwgMHg1MCwgMHgzQSwgMHgwRiwgMHgwMCwgMHgyRCwgMHg0NCwgMHgyMCwgMHgyQSwgMHgwQywgMHgwMCwKKwkgMHgyQiwgMHg0NCwgMHhBQywgMHg4MCwgMHgyOCwgMHg0MCwgMHhCNCwgMHgzQSwgMHgwMywgMHgwMCwgMHgwMiwgMHgwMywgMHgzMCwgMHhGQiwgMHgwNCwgMHgwMCwKKwkgMHgyQiwgMHg1MCwgMHhBOCwgMHg2MCwgMHg5MiwgMHg3OCwgMHgwNCwgMHhFMSwgMHgwNCwgMHhFMSwgMHhBMSwgMHhGRiwgMHgzNSwgMHhGMSwgMHgyNiwgMHg0NCwKKwkgMHg2NCwgMHg1NCwgMHhDRCwgMHhFMiwgMHg4NCwgMHhCQywgMHgyRCwgMHg0MCwgMHgwQywgMHgyMiwgMHhGRCwgMHhCNCwgMHg0MCwgMHg0NiwgMHgyMywgMHg2NCwKKwkgMHgzQSwgMHhEQiwgMHhBQiwgMHg2MCwgMHg2QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg0MCwgMHgyNiwgMHgyMiwgMHgwNCwgMHgwMCwgMHgwMiwgMHg2NCwKKwkgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHg2QywgMHg0MCwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwKKwkgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwgMHgzNywgMHhGMywgMHgyQiwgMHg0NSwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgyOCwgMHg2NSwgMHg0NCwKKwkgMHg2MCwgMHg1MCwgMHhBMCwgMHg0QywgMHgyMCwgMHhCQywgMHhGRiwgMHhCNCwgMHhBMCwgMHg1MSwgMHgzNSwgMHhGMSwgMHg3NCwgMHg0NCwgMHhDMCwgMHg5NCwKKwkgMHgzMiwgMHg0MCwgMHgwMiwgMHgyQSwgMHgxOCwgMHgwMCwgMHgyOCwgMHg0NCwgMHhBNCwgMHgzNiwgMHgwNCwgMHgwMCwgMHgwQywgMHhCNCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgzNiwgMHgxMSwgMHgwMCwgMHgyNiwgMHg0MywgMHhGRCwgMHhCMywgMHgwNCwgMHhCQiwgMHg0MywgMHg0NiwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwKKwkgMHgyOCwgMHg0NywgMHg0MCwgMHhCRiwgMHg0MCwgMHg0OCwgMHgwQSwgMHhCQiwgMHgwRiwgMHhGQywgMHg1MCwgMHg0QiwgMHg2NywgMHg1MCwgMHgwMCwgMHg2NCwKKwkgMHgzMCwgMHhGQiwgMHgwNSwgMHhGRiwgMHhDNiwgMHgwMSwgMHgyNCwgMHg2NCwgMHgzQSwgMHhEQiwgMHgyOCwgMHg0NCwgMHgwNCwgMHgyQSwgMHgwMywgMHgwMCwKKwkgMHhBNywgMHg2MCwgMHg4RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRCwgMHhGRiwgMHg0OCwgMHhFMiwgMHgyNywgMHg0NCwgMHgwNiwgMHgyMiwgMHgwNSwgMHgwMCwKKwkgMHhGOSwgMHhCNCwgMHg0MCwgMHg0NywgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHgyNiwgMHg0MCwgMHgxMCwgMHgyQSwgMHgxOCwgMHgwMCwKKwkgMHgyNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwgMHhDMCwgMHhBMCwgMHhGRiwgMHhGRiwgMHgxMSwgMHgwRSwgMHg5OCwgMHhGMSwKKwkgMHgxRSwgMHg2MCwgMHhGOCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywKKwkgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwKKwkgMHhBQywgMHg2MCwgMHgwNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhGQSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwKKwkgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgyQSwgMHg2NCwgMHgzQSwgMHhEQiwgMHg1QywgMHg0MSwgMHg4NywgMHhFMSwKKwkgMHhBMSwgMHhGRiwgMHg2QywgMHg0MCwgMHgwMiwgMHgwMCwgMHgyOSwgMHg2NCwgMHgzQSwgMHhEQiwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHg4NywgMHhFMSwKKwkgMHhBMSwgMHhGRiwgMHg2QywgMHg0MCwgMHgxMSwgMHgwMCwgMHgxRiwgMHg2MCwgMHgwQywgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHhGMSwgMHgwMSwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHgyMSwgMHg2NCwgMHgzQSwgMHhEQiwKKwkgMHgwMywgMHgwMCwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHg2QywgMHg0MCwgMHgwMCwgMHg2NCwgMHgzMywgMHhGQiwgMHgzMiwgMHg3NCwgMHg0MCwgMHg2MywKKwkgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgwMSwgMHg2OCwgMHgwMSwgMHgxMSwgMHgwOSwgMHgwMCwgMHhBNywgMHg2QSwgMHgyMiwgMHg2NCwgMHgzQSwgMHhEQiwKKwkgMHgwMywgMHg2MCwgMHhDOSwgMHg2MywgMHgwMSwgMHgxMSwgMHgwMiwgMHgwMCwgMHg2QywgMHg0MCwgMHhGQywgMHgxRiwgMHg2QywgMHg0MCwgMHhCNSwgMHhGRiwKKwkgMHg2QywgMHg0MCwgMHhCQywgMHhGRiwgMHg2QywgMHg0MCwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwgMHgwOCwgMHg2MCwKKwkgMHgwMCwgMHg2QiwgMHgwMywgMHgwQSwgMHhBNywgMHg2MCwgMHg5QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2NCwgMHg0RiwgMHhGQiwgMHgyNywgMHg0NCwKKwkgMHgwNiwgMHgyMiwgMHgwNiwgMHgwMCwgMHhGOSwgMHhCNCwgMHg0MCwgMHg0NywgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHg0OCwgMHhFMiwKKwkgMHgyNywgMHg2NCwgMHgzQSwgMHhEQiwgMHhCMywgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwgMHg1NCwgMHg2MiwgMHgyMiwgMHg0NiwKKwkgMHhBMiwgMHhEMCwgMHgxNiwgMHg2MywgMHg3QywgMHg0MSwgMHg0NCwgMHg0OCwgMHg4MCwgMHgzNiwgMHgwNCwgMHg2MSwgMHgyOCwgMHg0MCwgMHg1MCwgMHgzNiwKKwkgMHgwNCwgMHg2MSwgMHg0MSwgMHg0RSwgMHgyOCwgMHg0NCwgMHhBNCwgMHgzNiwgMHgwRSwgMHg2MywgMHgxMiwgMHg2MCwgMHhDMiwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHgyNCwgMHg0NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhDMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHg5QSwgMHhGRiwgMHhBMSwgMHhGRiwgMHg1NCwgMHg2MiwgMHhBMiwgMHhEMiwgMHhGRiwgMHhGRiwgMHg2QSwgMHg0MCwgMHg4MCwgMHg0RSwgMHg3QSwgMHhENCwKKwkgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxRCwKKwkgMHg3OCwgMHgwMCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHgyOCwgMHg0MCwgMHgwMywgMHgyQiwgMHgwNCwgMHgwMCwKKwkgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg2QSwgMHg0MCwgMHg3MCwgMHg2MiwgMHgyOCwgMHg0NCwgMHg4OCwgMHhCMCwgMHg4OCwgMHgzNiwKKwkgMHg3QSwgMHhENCwgMHgyOCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwQiwgMHgwMCwgMHg3MiwgMHg2MiwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHhBMiwgMHhEMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgwMiwgMHgwMCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg0NiwgMHgwMCwgMHgyMywgMHg0MywKKwkgMHhDRiwgMHg4MywgMHhERiwgMHg4MywgMHgwMiwgMHgwMywgMHg1NSwgMHgwMywgMHgwNCwgMHgwMCwgMHgwMywgMHhGMCwgMHgwNCwgMHhGNCwgMHg2NCwgMHg0MiwKKwkgMHgzNywgMHgwMCwgMHgyRSwgMHg0MCwgMHgwNCwgMHgyQSwgMHgyMSwgMHgwMCwgMHhBMSwgMHhGRiwgMHgwMiwgMHhGRSwgMHgxMCwgMHgyNSwgMHg0MiwgMHhGRSwKKwkgMHg3MiwgMHg0NSwgMHg2NSwgMHg0QywgMHg5NSwgMHhGMywgMHgwMywgMHgwNCwgMHhFNCwgMHhFMiwgMHhEQywgMHg4NCwgMHg5NSwgMHhGQiwgMHhBMSwgMHhGRiwKKwkgMHg4MCwgMHg0QywgMHg5NiwgMHhGMywgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHg5NiwgMHhGQiwgMHg4MCwgMHg0QywgMHg5NywgMHhGMywgMHgwMiwgMHgwNCwKKwkgMHhEQywgMHg4NCwgMHg5NywgMHhGQiwgMHg4MCwgMHg0QywgMHg1QywgMHg0RSwgMHhGOCwgMHhBMywgMHgwMywgMHhGMiwgMHg5QSwgMHhGMiwgMHgwNCwgMHhGNCwKKwkgMHhGRiwgMHhCMSwgMHhGOCwgMHhBMSwgMHgwNiwgMHhBNCwgMHg2MCwgMHg0MiwgMHgwOSwgMHgwMCwgMHgwMywgMHhGMiwgMHg5QSwgMHhGMiwgMHgwNCwgMHhGNCwKKwkgMHhDOCwgMHg4MiwgMHhGRiwgMHhCMSwgMHgwMywgMHgwMCwgMHgwMCwgMHhGNCwgMHg4MSwgMHhGMiwgMHhGRiwgMHhCMSwgMHg3QSwgMHhENCwgMHhGRiwgMHhGRiwKKwkgMHhGRCwgMHgxQywgMHhGOSwgMHgxRCwgMHhGRiwgMHhCMSwgMHgxNywgMHgxRSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHhEQSwgMHg4MiwgMHhEQSwgMHg4MiwKKwkgMHhBMiwgMHhEMiwgMHhBMSwgMHhGRiwgMHgwOSwgMHg3NCwgMHg4MCwgMHg0RCwgMHgwRSwgMHgwMCwgMHgwMywgMHhGMiwgMHg5QSwgMHhGMiwgMHgwNCwgMHhGNCwKKwkgMHgyMywgMHg0MywgMHhBMSwgMHhGRiwgMHhBMCwgMHhEMiwgMHhGRSwgMHhBMSwgMHhDQiwgMHg4MywgMHg4MCwgMHg0RSwgMHhBRiwgMHg4MywgMHgwMiwgMHgxRCwKKwkgMHgwMiwgMHgwMywgMHhFRCwgMHgwMSwgMHhFMywgMHgwMSwgMHhBMSwgMHhGRiwgMHgyOCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwMiwgMHgwMCwgMHg5QywgMHg0RSwKKwkgMHg5QywgMHg0QywgMHhBMSwgMHhGRiwgMHhEQSwgMHg4MywgMHg2NiwgMHg0NCwgMHgyMiwgMHg0NiwgMHgwQywgMHhGQSwgMHgwQiwgMHhGQywgMHg4NywgMHg0RiwKKwkgMHg4NywgMHg0QywgMHg4NywgMHg0RiwgMHg4NywgMHg0RCwgMHg4NywgMHg0QywgMHgwMSwgMHgwOCwgMHgwMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHg4NywgMHg0QywKKwkgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2QSwgMHg0NCwgMHhCQywgMHhGRiwgMHgwMSwgMHg2MCwKKwkgMHgwOCwgMHhFMSwgMHgwQywgMHg3NCwgMHgwNCwgMHhFMSwgMHhBMSwgMHhGRiwgMHgzNSwgMHhGMywgMHhDNCwgMHhFMiwgMHg2MCwgMHg1NCwgMHg4OSwgMHhGRiwKKwkgMHgxMywgMHg3NCwgMHg4OCwgMHhGRiwgMHgyOSwgMHg0NCwgMHhGNywgMHhCNCwgMHg0MCwgMHg0OSwgMHgzNCwgMHg2NCwgMHgzQSwgMHhEQiwgMHgwNiwgMHhFMSwKKwkgMHg0NywgMHhGRiwgMHhBOCwgMHg2MCwgMHg2NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwOCwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg0MywgMHhGRiwgMHgwMSwgMHg2MCwgMHgwMCwgMHhFMSwgMHgyOCwgMHhGMywgMHg0NywgMHhGRiwgMHg2MCwgMHg0MCwgMHgwNywgMHgzNywgMHg0QiwgMHgwMCwKKwkgMHgwNSwgMHgzQiwgMHgwNCwgMHgwMCwgMHhGRiwgMHgwQSwgMHg4MCwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyOSwgMHhGNSwgMHgyQSwgMHhGMywKKwkgMHg0NywgMHhGRiwgMHgzRiwgMHhGMCwgMHgwMSwgMHgxQiwgMHgwMSwgMHg2NCwgMHg2MCwgMHg1NiwgMHhBRCwgMHhFMiwgMHhCNSwgMHhGRiwgMHg2QywgMHg0MCwKKwkgMHg0MCwgMHhFMSwgMHhBMSwgMHhGRiwgMHgwMCwgMHhGNCwgMHg2RSwgMHg2MSwgMHgxMiwgMHg2MiwgMHg2NCwgMHg0MywgMHgwMSwgMHhFMSwgMHgwMywgMHg2NCwKKwkgMHhFMiwgMHhEMCwgMHhDOSwgMHg4MSwgMHg2NCwgMHg0QywgMHhDQywgMHg4NCwgMHhEQSwgMHg4MiwgMHhGQSwgMHgwMiwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2QiwKKwkgMHg5QSwgMHhGRiwgMHhDQSwgMHg4MiwgMHgwMywgMHgwMCwgMHgwMCwgMHhGNCwgMHg4MSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg3QSwgMHhEMCwgMHhBMSwgMHhGRiwKKwkgMHg2NCwgMHg0QywgMHhGQywgMHgxQywgMHhGOCwgMHgxRCwgMHgwMCwgMHhCOSwgMHgwNiwgMHgxRSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHhEQSwgMHg4MiwKKwkgMHg1QSwgMHhEMiwgMHhBMSwgMHhGRiwgMHg2MCwgMHg0RCwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyQiwgMHgwOCwgMHgwMCwgMHgyOCwgMHhGMywgMHhBNSwgMHg2MCwKKwkgMHhDNCwgMHg2NSwgMHg2MCwgMHg0MCwgMHgwRSwgMHgzQiwgMHgwMiwgMHgwMCwgMHg4MCwgMHg0QywgMHhGRSwgMHgwMSwgMHhBMSwgMHhGRiwgMHg4NywgMHg0RSwKKwkgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg2NywgMHg0QywgMHhGRiwgMHhGRiwgMHhCQywgMHhGRiwgMHgwMCwgMHhFMSwKKwkgMHhENSwgMHhGRSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg0NiwgMHg2MCwgMHg0MSwgMHhCNSwgMHhGRiwgMHhCNywgMHhGRiwKKwkgMHhCNCwgMHhGRiwgMHgyOSwgMHhGNSwgMHgzRiwgMHhGMCwgMHgyNCwgMHhGMiwgMHg0NCwgMHg0MywgMHg0MCwgMHg0NCwgMHgwMCwgMHhGNCwgMHhGMywgMHg2MCwKKwkgMHhBMCwgMHg2NSwgMHgxMCwgMHg2MiwgMHg1QSwgMHhEMiwgMHhEOSwgMHg4MSwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQiwgMHgwMiwgMHg2MSwgMHg0NSwKKwkgMHgyNCwgMHg0NCwgMHhENCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhGRCwgMHhBNSwgMHg0OCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhDNCwgMHg5RCwgMHgwRCwgMHg2MCwgMHgwMCwgMHg2QiwgMHgyNCwgMHg0NCwgMHhDMCwgMHg4MywgMHhCQiwgMHhGRiwgMHgyOSwgMHhGNSwgMHgwMSwgMHhFMSwKKwkgMHgwMCwgMHhGNCwgMHg2QywgMHg2MSwgMHgxMCwgMHg2MiwgMHgwNSwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwMSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwKKwkgMHgwNCwgMHg2MiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxMCwgMHgxQSwgMHgwMCwgMHgyNiwgMHg0NCwgMHgwMSwgMHgyNiwgMHgwQywgMHgwMCwKKwkgMHgyNCwgMHg0NCwgMHhDOCwgMHg4NCwgMHg0MCwgMHg0NCwgMHgwMiwgMHgwMywgMHg2QywgMHg0NSwgMHhGMywgMHgwMSwgMHgwMywgMHgxNSwgMHgwMSwgMHg2NCwKKwkgMHgwNSwgMHhGQSwgMHgxNSwgMHgwMCwgMHg2QywgMHg0NSwgMHhFRCwgMHgwMSwgMHgyMywgMHg0NCwgMHhDOCwgMHg4NCwgMHg0MCwgMHg0MywgMHgwMiwgMHgwMywKKwkgMHg2QywgMHg0NSwgMHhFNywgMHgwMSwgMHgwMCwgMHg2NCwgMHgwMSwgMHgxNSwgMHgwMSwgMHg2NCwgMHg2QywgMHg0NSwgMHgwNSwgMHhGQiwgMHhFMiwgMHhEMiwKKwkgMHhEQSwgMHg4MiwgMHhDOSwgMHg4MSwgMHg2MCwgMHg0QywgMHhERCwgMHgxQywgMHhENywgMHgwMywgMHhCQywgMHhGRiwgMHhEQSwgMHgwMSwgMHgwMCwgMHhFMSwKKwkgMHhENSwgMHhGRSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwOCwgMHhFMSwgMHhBMSwgMHhGRiwgMHg2NywgMHg0QywgMHg0MywgMHhGRiwgMHhBRCwgMHg0RiwKKwkgMHgwMiwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1RCwgMHgwMSwgMHhFMSwgMHgwMSwgMHg2MCwgMHg2OSwgMHg2QiwgMHhBNSwgMHg2MCwgMHhDNCwgMHg2NCwKKwkgMHg2MCwgMHg0QywgMHhCQiwgMHhGRiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0QywgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0QywKKwkgMHhGQywgMHgwMSwgMHgyOSwgMHhGMywgMHgyQSwgMHhGMSwgMHgwNywgMHhCNSwgMHgwNCwgMHhFMSwgMHg2NSwgMHg0MSwgMHg2NCwgMHg1NCwgMHhDRCwgMHhFMiwKKwkgMHg5NSwgMHg4MSwgMHhBMSwgMHg1RCwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGOSwgMHgwMSwgMHgwMCwgMHhFMSwgMHgzMCwgMHg0MCwgMHgwMiwgMHgzNiwKKwkgMHhBMSwgMHhGRiwgMHg4MywgMHhGRiwgMHg4RCwgMHhGRiwgMHg1QywgMHg0NCwgMHg1QywgMHg0MywgMHg1QywgMHg0MiwgMHg1QywgMHg0MSwgMHg1QywgMHg0MCwKKwkgMHhBQywgMHhGRiwgMHhBRCwgMHhGRiwgMHhFNywgMHhFMSwgMHhCMSwgMHg2MCwgMHhDMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MSwgMHg3RiwgMHg2MCwKKwkgMHhDMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MywgMHgyNiwgMHgwMiwgMHg5OCwgMHhGRSwgMHgxQSwgMHgwNSwgMHgxQiwgMHg2MCwKKwkgMHhCOCwgMHg2MiwgMHhBMiwgMHhENSwgMHgwRSwgMHhGMiwgMHgxNSwgMHgxOCwgMHgwMiwgMHgxOCwgMHgwOSwgMHhGNCwgMHhGQiwgMHgwMSwgMHgyMywgMHg0NCwKKwkgMHgwMCwgMHhBOCwgMHgwOCwgMHg3RSwgMHgwQSwgMHgwMiwgMHg2NiwgMHg0NCwgMHgxMSwgMHhGQiwgMHg0NiwgMHg0MywgMHgyMywgMHg0NywgMHg4MCwgMHhCRiwKKwkgMHgzQiwgMHg0MiwgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwgMHgwOCwgMHhCOSwgMHgxMCwgMHg3RSwgMHgwMCwgMHg3RiwgMHgwRSwgMHhGQSwgMHgwMCwgMHg2NywKKwkgMHgwQSwgMHgwMCwgMHgyMCwgMHg0NCwgMHhEQywgMHg4NSwgMHgwRiwgMHhCNCwgMHhGNiwgMHhBMCwgMHg3RiwgMHg2NywgMHgwNywgMHg2MywgMHgwMywgMHgwNSwKKwkgMHg0NSwgMHg0MCwgMHgwMCwgMHg2NywgMHhEOCwgMHhGRSwgMHhGRiwgMHgyNywgMHgwNSwgMHhGRCwgMHgwQSwgMHg3RSwgMHgwNCwgMHhGQiwgMHg2MSwgMHg1NSwKKwkgMHg0QSwgMHgwMCwgMHgyOCwgMHhGQiwgMHgwMSwgMHhGMywgMHgyOSwgMHhGQiwgMHg0NCwgMHg0NiwgMHg0MCwgMHg0NSwgMHgxMCwgMHg2MSwgMHg3RSwgMHg2MCwKKwkgMHhDMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MywgMHgzMSwgMHgwMiwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RiwgMHgyMiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg3RiwgMHg2NywgMHgwMywgMHg2MywgMHgyQSwgMHgwMiwgMHgyNiwgMHg0MCwgMHgwMSwgMHgyQiwgMHgyNCwgMHgwMCwgMHg5OCwgMHhGRSwKKwkgMHgxOSwgMHgwNSwgMHgxQiwgMHg2MCwgMHhCOCwgMHg2MiwgMHhBMiwgMHhENSwgMHgwRSwgMHhGMiwgMHgxNCwgMHgxOCwgMHgwMiwgMHgxOCwgMHgwOSwgMHhGNCwKKwkgMHhGQiwgMHgwMSwgMHgyMywgMHg0NCwgMHgwMCwgMHhBOCwgMHgwOCwgMHg3RSwgMHgwQSwgMHgwMiwgMHg2NiwgMHg0NCwgMHgxMSwgMHhGQiwgMHg0NiwgMHg0MywKKwkgMHgyMywgMHg0NywgMHg4MCwgMHhCRiwgMHgzQiwgMHg0MiwgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwgMHgwOCwgMHhCOSwgMHgxMCwgMHg3RSwgMHgwMCwgMHg3RiwKKwkgMHgwRSwgMHhGQSwgMHgwOSwgMHgwMCwgMHgyMCwgMHg0NCwgMHhEQywgMHg4NSwgMHgwRiwgMHhCNCwgMHhGNiwgMHhBMCwgMHg3RiwgMHg2NywgMHgwNywgMHg2MywKKwkgMHgwNSwgMHgwNSwgMHg0NSwgMHg0MCwgMHhEOCwgMHhGRSwgMHgwMCwgMHg2NywgMHhEMCwgMHhGRSwgMHhEOSwgMHhGRSwgMHhGRiwgMHgyNywgMHgwNSwgMHhGRCwKKwkgMHgwQiwgMHg3RSwgMHgwNCwgMHhGQiwgMHgxMiwgMHg2MCwgMHhDOCwgMHg2MywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgyMCwgMHhCMCwgMHg4MCwgMHhCQywKKwkgMHgwOCwgMHgyOCwgMHhBMywgMHhEQiwgMHg2MSwgMHg1NSwgMHg2MywgMHgwMCwgMHgwNCwgMHhCNSwgMHg4MiwgMHhCNSwgMHgyNSwgMHgwMiwgMHgwNCwgMHgwMywKKwkgMHgyMCwgMHg0NCwgMHg3RiwgMHhCNCwgMHg0MCwgMHg0MCwgMHhBMywgMHhEMywgMHg5OSwgMHhGRSwgMHgwNCwgMHgwNCwgMHgwMiwgMHhCQywgMHhGRSwgMHhCNCwKKwkgMHhBMywgMHhEQiwgMHg1NiwgMHgwMCwgMHhCQywgMHhGMywgMHgyMCwgMHg0MCwgMHg4MCwgMHgyNiwgMHg1MiwgMHgwMCwgMHhBMywgMHhEMywgMHhGRiwgMHhBMCwKKwkgMHhGOCwgMHhCNCwgMHgwMiwgMHgwMiwgMHhBMywgMHhEQiwgMHgxQywgMHgwMCwgMHgwNCwgMHhCQywgMHhCRiwgMHhCNCwgMHhBMywgMHhEQiwgMHgwOCwgMHhCMCwKKwkgMHgwMSwgMHg2NCwgMHgwOCwgMHgyNCwgMHgwMiwgMHg2NCwgMHgyOCwgMHhGQiwgMHgyMCwgMHg0NCwgMHg4MCwgMHhCQywgMHg0MCwgMHg0MCwgMHhEMCwgMHhGRSwKKwkgMHgzRiwgMHgwMCwgMHhCRiwgMHhCNCwgMHhBMywgMHhEQiwgMHgzQywgMHgwMCwgMHg0MCwgMHhCMCwgMHhGRiwgMHhGRiwgMHhGQSwgMHgwMiwgMHhGOCwgMHhCNCwKKwkgMHhBMywgMHhEQiwgMHgwOCwgMHhCNSwgMHgwNywgMHg3QywgMHgwMSwgMHgwMiwgMHhCQywgMHhGOSwgMHgyMCwgMHg0NCwgMHg3RiwgMHhCNCwgMHg0MCwgMHg0MCwKKwkgMHgxMiwgMHg2MCwgMHhDOCwgMHg2MywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgyMCwgMHhCNSwgMHgwNywgMHhCNSwgMHgwOCwgMHgyOCwgMHhDNCwgMHgwMiwKKwkgMHg5OSwgMHhGRSwgMHgyNiwgMHgwNSwgMHgyMCwgMHg0NCwgMHg4MCwgMHgyNiwgMHgyMywgMHgwMCwgMHgyMCwgMHgyQSwgMHgwMCwgMHgwMCwgMHg0MCwgMHgyQSwKKwkgMHgxRiwgMHgwMCwgMHhCRiwgMHhCNCwgMHg0MCwgMHg0MCwgMHgwOSwgMHgwMCwgMHhBOCwgMHhGRiwgMHgyMCwgMHg0NCwgMHg5OSwgMHhGRSwgMHgwMiwgMHgwNSwKKwkgMHg4MCwgMHgyQSwgMHgwMywgMHgwMCwgMHg0MCwgMHhCQywgMHg0MCwgMHg0MCwgMHgxMywgMHgwMCwgMHgwMCwgMHhGMSwgMHg4MCwgMHhCQywgMHg0MCwgMHg0MCwKKwkgMHg2NCwgMHg0NCwgMHhFMCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgwQSwgMHgzNiwgMHgyOSwgMHgwMSwgMHgwQiwgMHgzNiwgMHg1QSwgMHgwMSwgMHgyOCwgMHhGQiwKKwkgMHgwMSwgMHhGMSwgMHgyOSwgMHhGOSwgMHgwMiwgMHhGMSwgMHgyQSwgMHhGOSwgMHgwMywgMHhGMSwgMHgyQiwgMHhGOSwgMHhEMCwgMHhGRSwgMHhBRSwgMHhGRiwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MiwgMHgzRSwgMHg3NSwgMHg0NCwgMHgwMiwgMHhCMCwgMHgwMSwgMHhCMCwgMHgyOCwgMHgwMiwgMHhEQywgMHgwMiwKKwkgMHgwNCwgMHhCMCwgMHgwOCwgMHhCMCwgMHgwQiwgMHgwMiwgMHgyMCwgMHgwMiwgMHg0MCwgMHgyNiwgMHhBNywgMHhGRiwgMHg4QywgMHhGRiwgMHg3NSwgMHg0MCwKKwkgMHg4MCwgMHgyQiwgMHgwMSwgMHgwMCwgMHhBQiwgMHhGRiwgMHg3NSwgMHg0NCwgMHg4RCwgMHhGRiwgMHhFQSwgMHgwMSwgMHgwQSwgMHhGMywgMHhBQSwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgwMiwgMHgwMCwgMHg2MCwgMHhGRiwgMHgwRCwgMHgwMCwgMHgwMSwgMHgyNiwgMHgwQywgMHgwMCwgMHhDMCwgMHg2MCwKKwkgMHgwMCwgMHg3QywgMHhBMCwgMHg4NCwgMHg4MCwgMHgzQiwgMHgwMiwgMHgwMCwgMHhDMCwgMHg2NywgMHgwMywgMHgwMCwgMHg0MCwgMHgzQiwgMHgwMiwgMHgwMCwKKwkgMHgwMCwgMHg2NywgMHgwQSwgMHhGQiwgMHhENSwgMHgwMSwgMHhENCwgMHgwMSwgMHhBQiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhEMSwgMHgwMSwgMHg3OSwgMHg2MywKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHgxRiwgMHhBOSwgMHhGRiwgMHg3NywgMHg0NCwgMHg2MCwgMHg1NywgMHgxMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg0MCwgMHg0QSwKKwkgMHgwMSwgMHgyQSwgMHgxQywgMHgwMCwgMHgyNCwgMHg0NCwgMHhBQywgMHg4NiwgMHgwOCwgMHhGMiwgMHgxOCwgMHgwMywgMHgxQiwgMHg2MCwgMHhCRSwgMHg2NSwKKwkgMHhENCwgMHg4MCwgMHgwRSwgMHhGMiwgMHgwMiwgMHgwMywgMHhBNSwgMHhENSwgMHgwNCwgMHgwMCwgMHgwMSwgMHhCQywgMHgwRSwgMHhGQSwgMHgwOSwgMHhGNCwKKwkgMHhEMSwgMHhGRSwgMHg0NiwgMHg0NCwgMHgwQiwgMHgxOCwgMHg2NiwgMHg0NCwgMHgxMCwgMHhGQiwgMHg2NiwgMHg0NywgMHgyMCwgMHhCRiwgMHgzQiwgMHg0MiwKKwkgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwgMHgwRSwgMHhGMiwgMHgwMSwgMHg3NSwgMHgxMCwgMHhCQywgMHgwRSwgMHhGQSwgMHgyQSwgMHg0NCwgMHgwOCwgMHgyQSwKKwkgMHgxOCwgMHgwMCwgMHgyMywgMHg0NCwgMHgwMCwgMHhBOCwgMHg1QywgMHg0MywgMHgxNCwgMHgwMywgMHgxQiwgMHg2MCwgMHhCOCwgMHg2MiwgMHhBMiwgMHhENSwKKwkgMHgwMSwgMHgwMCwgMHgwOSwgMHhGNCwgMHgwRSwgMHhGMiwgMHgwRCwgMHgxOCwgMHgwOCwgMHhCMCwgMHgxOCwgMHhBQywgMHhGQSwgMHgwMywgMHgwRSwgMHhGQSwKKwkgMHg2NiwgMHg0MywgMHgxMSwgMHhGRCwgMHg0NiwgMHg0MywgMHgyMywgMHg0NywgMHg4MCwgMHhCRiwgMHgzQiwgMHg0MiwgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwKKwkgMHgwOCwgMHg3NSwgMHgyQSwgMHg0NCwgMHgwNiwgMHgyMiwgMHgyRCwgMHgwMCwgMHgyMiwgMHg0NCwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgwRSwgMHhGMiwKKwkgMHgyOCwgMHgwMywgMHgxMCwgMHhCMCwgMHgwMSwgMHhCQywgMHgwMywgMHgwMiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg0MiwgMHgyMiwgMHgwMCwgMHgwRSwgMHhGQSwKKwkgMHhEMSwgMHhGRSwgMHgxQiwgMHg2MCwgMHhCMiwgMHg2NCwgMHg0MCwgMHg0NywgMHg1OCwgMHg0RiwgMHg4MCwgMHgwMCwgMHg0NiwgMHg0MiwgMHgxOSwgMHgwMiwKKwkgMHgyMiwgMHg0NywgMHg0MCwgMHhCRiwgMHgzQiwgMHg0MiwgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwgMHgyMywgMHhGMiwgMHg2NiwgMHg0MywgMHgwMCwgMHhBOCwKKwkgMHgwRSwgMHhGMiwgMHgwOCwgMHgwMiwgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQSwgMHhFNCwgMHgwMSwgMHgxMiwgMHhGRCwgMHgxMCwgMHg2NCwgMHgwRSwgMHhGQSwKKwkgMHgwMiwgMHg3NSwgMHgwNywgMHgwMCwgMHg2MCwgMHg0MCwgMHgwNCwgMHgyQSwgMHhEQywgMHgwMSwgMHgxMiwgMHhGRCwgMHgxMCwgMHg2NCwgMHgwRSwgMHhGQSwKKwkgMHgwNCwgMHg3NSwgMHgyQSwgMHg0NCwgMHg4MCwgMHgyQSwgMHgxOSwgMHgwMCwgMHgyMSwgMHg0NCwgMHhBQywgMHg4NiwgMHgwRSwgMHhGMiwgMHgxNSwgMHgwMywKKwkgMHgwMSwgMHhCQywgMHgwRSwgMHhGQSwgMHhEMSwgMHhGRSwgMHgxQiwgMHg2MCwgMHhDQSwgMHg2NCwgMHg0MCwgMHg0NywgMHg1OCwgMHg0RiwgMHg1NiwgMHgwMCwKKwkgMHg0NiwgMHg0MSwgMHgwQiwgMHgwMiwgMHgyMSwgMHg0NywgMHgxMCwgMHhCRiwgMHgzQiwgMHg0MiwgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwgMHgwRSwgMHhGMiwKKwkgMHg2NiwgMHg0MywgMHgwOCwgMHhGRCwgMHgxMCwgMHhCQywgMHgwRSwgMHhGQSwgMHg4MCwgMHg3NSwgMHgyQSwgMHg0NCwgMHgxMCwgMHhCMCwgMHgyMCwgMHg0NCwKKwkgMHgxNSwgMHgwMywgMHg3RiwgMHhCNCwgMHg0MCwgMHg0MCwgMHgxMiwgMHg2MCwgMHhDOCwgMHg2MywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgyMCwgMHhCMCwKKwkgMHg4MCwgMHhCMCwgMHgwOSwgMHgwMywgMHgwOCwgMHgwMywgMHg0MCwgMHhCQywgMHg3RiwgMHhCNCwgMHgwNCwgMHhCMCwgMHhBMywgMHhEQiwgMHgwMywgMHgwMywKKwkgMHgyMCwgMHg0NCwgMHg4MCwgMHhCQywgMHg0MCwgMHg0MCwgMHhCMSwgMHg2MCwgMHg5MCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCMSwgMHg2MCwgMHhDMCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhFOCwgMHhGRSwgMHgxNCwgMHgwNSwgMHhFQSwgMHhGRSwgMHgyNCwgMHgwNSwgMHhFOSwgMHhGRSwgMHgxQywgMHgwNSwgMHhFNywgMHhGRSwKKwkgMHgwOSwgMHgwNSwgMHg0NywgMHhGRiwgMHgyMCwgMHg0NCwgMHgwRiwgMHgyMiwgMHgwMywgMHgwMCwgMHhDQywgMHg4NCwgMHg0MCwgMHg0MCwgMHgwRiwgMHgyMiwKKwkgMHhCOCwgMHhGRSwgMHhFQywgMHgwMSwgMHgyMywgMHg0MSwgMHgwMCwgMHhCOSwgMHg1QywgMHg0QSwgMHhFOCwgMHgwMiwgMHg2RSwgMHgwMSwgMHgyNCwgMHg0MSwKKwkgMHgwMCwgMHhCOSwgMHgxQiwgMHg2MCwgMHhCRSwgMHg2NSwgMHg0NSwgMHg0NywgMHhFMSwgMHgwMiwgMHg1OCwgMHg0RiwgMHgwRiwgMHgwMCwgMHhERSwgMHgwMiwKKwkgMHg1QywgMHg0QSwgMHg0NiwgMHg0NCwgMHg1MCwgMHgwMSwgMHgyMiwgMHg0MSwgMHgwMCwgMHhCOSwgMHg1QywgMHg0QSwgMHgwOCwgMHgyNCwgMHg4MSwgMHgwMSwKKwkgMHhENSwgMHgwMSwgMHgyMSwgMHg0MSwgMHgwMCwgMHhCOSwgMHg1QywgMHg0QSwgMHhBNiwgMHgwMywgMHhEMCwgMHgwMSwgMHgyNywgMHhEMywgMHgwMywgMHgwMCwKKwkgMHgxMCwgMHhCMCwgMHgwOSwgMHhGMiwgMHgwNCwgMHgwMywgMHhBQywgMHg4NiwgMHgwRSwgMHhGMiwgMHhGQSwgMHgwMiwgMHgwOCwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwRSwgMHhGMywgMHgwRiwgMHg2MCwgMHhGRSwgMHg2NSwgMHgwQywgMHhGMywgMHgyNCwgMHg4NiwgMHgyNCwgMHg0NiwgMHg2MCwgMHg0MCwKKwkgMHhGQiwgMHgzQiwgMHgwNywgMHgwMCwgMHg4MCwgMHgyNiwgMHgwMiwgMHgwMCwgMHgyMywgMHg0NiwgMHgwMywgMHg0QywgMHg0NiwgMHg2MSwgMHgzQSwgMHg2NSwKKwkgMHgwQywgMHgwMCwgMHgyRSwgMHhGMywgMHg0MCwgMHg0NSwgMHhGOCwgMHgyQiwgMHgwMiwgMHgwMCwgMHg0MCwgMHg0NSwgMHgwMywgMHgwMCwgMHg1OCwgMHg0RiwKKwkgMHgzOSwgMHgwMCwgMHgwNywgMHgwMiwgMHg1OCwgMHg0RiwgMHg0NSwgMHgwMCwgMHgwNCwgMHgwNSwgMHg2NiwgMHg1MCwgMHg2NSwgMHg1MiwgMHg2MSwgMHg1MSwKKwkgMHgwOSwgMHgwMCwgMHgyNiwgMHg0NywgMHgwMCwgMHhCRiwgMHgwRSwgMHhGQiwgMHgyRSwgMHhGNSwgMHgwNSwgMHhGMCwgMHg4MCwgMHg2MCwgMHg2NCwgMHg1MCwKKwkgMHgwMCwgMHg3MiwgMHg3RSwgMHg3MSwgMHhBQywgMHhGRiwgMHhCMSwgMHg2MCwgMHhDMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4RSwgMHhGRiwgMHgwRiwgMHhGMywKKwkgMHgwRiwgMHg2MCwgMHhGRSwgMHg2NSwgMHgyNCwgMHg4NiwgMHgwRCwgMHhGMywgMHgyRSwgMHhGMywgMHg0MCwgMHg0NSwgMHhGOCwgMHgyQiwgMHgwMiwgMHgwMCwKKwkgMHg0MCwgMHg0NSwgMHgwMywgMHgwMCwgMHg1OCwgMHg0RiwgMHgxNiwgMHgwMCwgMHgwNywgMHgwMiwgMHg1OCwgMHg0RiwgMHgyMiwgMHgwMCwgMHgwNCwgMHgwNSwKKwkgMHg2NiwgMHg1MCwgMHg2NSwgMHg1MiwgMHg2MSwgMHg1MSwgMHgwOSwgMHgwMCwgMHgyNiwgMHg0NywgMHgwMCwgMHhCRiwgMHgwRiwgMHhGQiwgMHgyRSwgMHhGNSwKKwkgMHgwNSwgMHhGMCwgMHg4MCwgMHg2MCwgMHg2NCwgMHg1MCwgMHgwMCwgMHg3MiwgMHg3RSwgMHg3MSwgMHg4RCwgMHhGRiwgMHhBRCwgMHhGRiwgMHhCMSwgMHg2MCwKKwkgMHhDMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg0NCwgMHg4QSwgMHhGMSwgMHg4QiwgMHhGMSwgMHhEMCwgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNywgMHgwNCwKKwkgMHgwMSwgMHgwNiwgMHgwNSwgMHgwMCwgMHgyNSwgMHg0NiwgMHgwMSwgMHhGMCwgMHgwMywgMHg2NywgMHhBMCwgMHg4NSwgMHg5NCwgMHg4MCwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyNSwgMHg0NiwgMHgyNiwgMHg0MSwgMHg0NiwgMHg2MywgMHgwMSwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCNSwgMHhENSwgMHg4MSwKKwkgMHgwMCwgMHhGMiwgMHgwNSwgMHgwNCwgMHgwNCwgMHg2MywgMHg2MCwgMHg0NiwgMHhGNywgMHgxQiwgMHg0MiwgMHhGRSwgMHgwRCwgMHgwMCwgMHg2MSwgMHg0NCwKKwkgMHhDNSwgMHg4MSwgMHg2MywgMHg0NSwgMHhDNSwgMHg4MSwgMHg5QywgMHg4NCwgMHhEQywgMHg4NCwgMHgwMSwgMHhGMiwgMHhGMCwgMHg4NSwgMHhGMCwgMHg4MCwKKwkgMHg2NSwgMHg0NCwgMHhGOCwgMHg4NSwgMHhGRiwgMHhGRiwgMHgwMiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhBMiwgMHhGRiwgMHgxQiwgMHg2MCwKKwkgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhBQywgMHg4NiwgMHgwRSwgMHhGMiwgMHgwNywgMHgwMywgMHgwMCwgMHhBOCwgMHgwOSwgMHhGMiwKKwkgMHhGQSwgMHgwMiwgMHgwMSwgMHg2NywgMHgwRSwgMHhGQSwgMHgwOCwgMHhGRSwgMHgxNywgMHgwMCwgMHg4QywgMHhGMywgMHhGRiwgMHhGRiwgMHhEOCwgMHhBMCwKKwkgMHgwMCwgMHhCNCwgMHgxMiwgMHgwNiwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2MSwgMHg0MSwgMHg0QSwgMHg3QywgMHhBMSwgMHgwRSwgMHhBMSwgMHhBMiwgMHhGRiwKKwkgMHhCMywgMHg2MCwgMHg1OCwgMHg0RSwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHhGRiwgMHgwNiwgMHgwMywgMHgyQSwgMHg0MywgMHhCMywgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHhCOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHhGRSwgMHhBMywgMHhGRiwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg0MSwgMHg0QSwKKwkgMHg3QywgMHhBMSwgMHgwRSwgMHhBMSwgMHhBMiwgMHhGRiwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RSwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywKKwkgMHgyQSwgMHg0MywgMHhCMywgMHg2MCwgMHg1OCwgMHg0RSwgMHhCOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHhGRSwgMHgwRCwgMHgwMCwgMHgxQiwgMHg2MCwKKwkgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhBQywgMHg4NiwgMHgwRSwgMHhGMiwgMHgwNiwgMHgwMywgMHgwMCwgMHhBOCwgMHgwOSwgMHhGMiwKKwkgMHhGQSwgMHgwMiwgMHgwMSwgMHg2NywgMHgwRSwgMHhGQSwgMHgwOCwgMHhGRSwgMHhBMywgMHhGRiwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg4RCwgMHhGMywKKwkgMHg3QywgMHg2MywgMHgwMCwgMHhCRSwgMHg0MCwgMHg0NSwgMHgxQSwgMHgwMywgMHgwMCwgMHg2NSwgMHg2NSwgMHg0NCwgMHhEQywgMHg4NSwgMHg4NCwgMHhBMSwKKwkgMHgwMCwgMHhGMiwgMHgwNiwgMHgwNiwgMHgwMSwgMHhGQywgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHhGNywgMHgwMiwgMHg0MCwgMHg0NSwgMHgwRSwgMHgwMCwKKwkgMHg4QywgMHhGMywgMHgwMCwgMHg2MywgMHhENCwgMHg4NCwgMHg4QywgMHhGQiwgMHg4MCwgMHg2MCwgMHg3QywgMHg2NCwgMHgwMSwgMHhGQSwgMHgwMCwgMHhGMCwKKwkgMHgwMCwgMHhGQywgMHhEMywgMHg4MCwgMHg4RCwgMHhGOSwgMHgwMiwgMHgwMiwgMHg4RSwgMHhGOSwgMHgwOCwgMHhGRSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHg2NiwgMHg0NCwgMHgyNSwgMHg0NiwgMHgwNSwgMHhGQSwgMHgwNiwgMHhGQSwgMHgwMSwgMHhGMCwgMHgwMywgMHg2NywgMHgwMiwgMHhGQywgMHhCMCwgMHg4NCwKKwkgMHgzQSwgMHg3RSwgMHgwMSwgMHhGQSwgMHgxMiwgMHg2NCwgMHgwMywgMHhGQSwgMHgwMCwgMHhGMCwgMHgwNCwgMHhGOCwgMHgwMCwgMHg2NCwgMHgwQywgMHg2MSwKKwkgMHgxMCwgMHg2MywgMHg1OSwgMHhEQSwgMHhGRSwgMHgxRiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg0MywgMHhFMywgMHg4MSwgMHhFOSwgMHg4MSwKKwkgMHgwMywgMHgwNSwgMHgxNiwgMHgwMywgMHgwMCwgMHg2MSwgMHgwMSwgMHgwMCwgMHhFNCwgMHg2MywgMHg2MSwgMHg0NiwgMHhCRiwgMHhEMiwgMHgyNywgMHg0NSwKKwkgMHhEQywgMHg4NCwgMHhBMiwgMHhEQSwgMHhCRSwgMHhEMiwgMHgyNSwgMHg0NiwgMHg4OCwgMHhGOCwgMHgwNCwgMHgxQiwgMHgyNSwgMHg0NCwgMHg2MSwgMHg0NiwKKwkgMHhBMywgMHhEQSwgMHgwNCwgMHgwMCwgMHgwQSwgMHhGQSwgMHg2MCwgMHg0NiwgMHgyNSwgMHg0NCwgMHgwOSwgMHhGQSwgMHg2MSwgMHg0NiwgMHhCRSwgMHhEQSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg0NCwgMHgwMCwgMHhBOCwgMHgwNywgMHg0QiwgMHgwQywgMHgwMywgMHg1OCwgMHg0RiwgMHgzMywgMHgwMCwKKwkgMHgwQiwgMHg0NywgMHgxQiwgMHg2MCwgMHhDNCwgMHg2NSwgMHgyNywgMHg0NCwgMHhENCwgMHg4MCwgMHgwMCwgMHg2NCwgMHgwMSwgMHgwMiwgMHgwRiwgMHhGQSwKKwkgMHg1OCwgMHg0RiwgMHhEMywgMHgwMSwgMHg3MCwgMHgwMCwgMHgyNSwgMHg0MywgMHhFMywgMHg4NCwgMHg3QywgMHg0MSwgMHgwMiwgMHgwNCwgMHhFOCwgMHg4MSwKKwkgMHhFNCwgMHg2MywgMHg2MSwgMHg0NiwgMHhBMywgMHhEMiwgMHgwMCwgMHg3QywgMHg0MCwgMHg0NSwgMHhCRiwgMHhEOCwgMHhBMywgMHhEOCwgMHhCRSwgMHhEOCwKKwkgMHgyNywgMHg0MiwgMHg1QSwgMHhEMywgMHgyNSwgMHg1QywgMHg2MCwgMHg0MSwgMHgwMiwgMHgxQiwgMHgyNywgMHhEOSwgMHgwNSwgMHgwMCwgMHgyNSwgMHg0NiwKKwkgMHgwQSwgMHhGQSwgMHg2MSwgMHg0NiwgMHgyNSwgMHg0NCwgMHgwOSwgMHhGQSwgMHgyNSwgMHg0NCwgMHgyNywgMHg0MywgMHgwMCwgMHg2MSwgMHg2MCwgMHg0NiwKKwkgMHgwOSwgMHhGMiwgMHgwOCwgMHhGQywgMHgwMCwgMHhBOCwgMHhERCwgMHg4MSwgMHhGQSwgMHgwMiwgMHhCRiwgMHhEMSwgMHg2NiwgMHg0NCwgMHhCRSwgMHhEQiwKKwkgMHhDMSwgMHg4NCwgMHhCRiwgMHhEQiwgMHg0OCwgMHgwMCwgMHgyNSwgMHg0NiwgMHhFNCwgMHg2MywgMHgwOCwgMHhGMiwgMHg4OSwgMHhGMiwgMHgxRSwgMHgxOCwKKwkgMHg0MCwgMHg0NywgMHhFMCwgMHg4NCwgMHhFOCwgMHg4NSwgMHgwMiwgMHgwNSwgMHhFOCwgMHg4MywgMHgwMCwgMHg2NSwgMHg2NSwgMHg0NiwgMHhCRiwgMHhEMiwKKwkgMHg2MSwgMHg1QywgMHhDQywgMHg4NCwgMHhBMiwgMHhEQSwgMHgyNSwgMHg0NiwgMHgwQSwgMHhGMiwgMHgwMCwgMHhCOSwgMHg2NSwgMHg0NiwgMHgwOCwgMHgyNCwKKwkgMHhCRSwgMHhEQSwgMHgwMiwgMHgxQiwgMHhBMywgMHhEOCwgMHgwMiwgMHgwMCwgMHg2MCwgMHg0NiwgMHg4OSwgMHhGQSwgMHgwMCwgMHhCOSwgMHg2MSwgMHg0NiwKKwkgMHgwOCwgMHgyOCwgMHgwQSwgMHhGQSwgMHgyNSwgMHg0NiwgMHg4OSwgMHhGQywgMHg4QSwgMHhGQywgMHg4OCwgMHhGQywgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2MSwgMHgyOCwgMHg2NSwgMHgyNSwgMHg0MywgMHg4RSwgMHhGMywgMHhBRiwgMHg4MywgMHgwMCwgMHhCRSwgMHgxOCwgMHgwMywgMHgwMiwgMHgwMywKKwkgMHgwMCwgMHhGQywgMHgwMSwgMHgwMCwgMHg4RCwgMHhGRCwgMHg2MywgMHg0NiwgMHg2NSwgMHg0NCwgMHhDQywgMHg4NSwgMHgwMCwgMHhGMiwgMHgwNywgMHgwMiwKKwkgMHg4RSwgMHhGNSwgMHgwMCwgMHg2NCwgMHgwMCwgMHhGQSwgMHhERSwgMHg2MCwgMHhBRiwgMHg2NCwgMHgwOSwgMHhGQiwgMHgwOCwgMHgwMCwgMHg2NiwgMHg0MywKKwkgMHgwMCwgMHhCRSwgMHhERCwgMHg4MSwgMHhGMSwgMHgwMiwgMHg4QywgMHhGMSwgMHg4RSwgMHhGRCwgMHhDMSwgMHg4NCwgMHg4QywgMHhGQiwgMHgyRSwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NSwgMHgyOSwgMHg0MywgMHhGQywgMHhBMywgMHg2NiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNSwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgwMCwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwMywgMHg2MSwgMHgwRSwgMHg2NSwgMHgxQiwgMHg2MCwgMHhEOCwgMHg2MywgMHg0MywgMHg0OSwKKwkgMHhBMywgMHhEMywgMHgwNiwgMHhBMywgMHgwMCwgMHhBOCwgMHhDRCwgMHg4MSwgMHgwNCwgMHgwMiwgMHhGOSwgMHgwMiwgMHhCMSwgMHg2MCwgMHhDMCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgyNiwgMHhFNiwgMHgwMSwgMHhENCwgMHg4MCwgMHg2MCwgMHg0NSwgMHhFMywgMHgwNSwgMHhGNiwgMHhBMywgMHhCRCwgMHhEMSwKKwkgMHhCRCwgMHhEMSwgMHg0NCwgMHg0NywgMHg0NCwgMHg0OCwgMHg0NCwgMHg0NSwgMHgxQywgMHg2MCwgMHgxNiwgMHg2NCwgMHg0NCwgMHhENywgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHg0OCwgMHhGRSwgMHg4RCwgMHhGNSwgMHg4QywgMHhGMywgMHgwRCwgMHgxOCwgMHhDQywgMHg4NCwgMHg4QywgMHhGQiwgMHg4MCwgMHg2MCwKKwkgMHg3QywgMHg2NCwgMHgwMSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgwMCwgMHhGMCwgMHgwMCwgMHhGQSwgMHhEMCwgMHg4MCwgMHg4RCwgMHhGOSwgMHgwMiwgMHgwMiwKKwkgMHg4RSwgMHhGOSwgMHgwOCwgMHhGRSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwgMHg4OCwgMHg2MywgMHgwRCwgMHg2NSwgMHgwMCwgMHg2MSwKKwkgMHg0MSwgMHg0OCwgMHhBMywgMHhEMywgMHgwNiwgMHhBMywgMHhBQywgMHg4NiwgMHgwMCwgMHg2MSwgMHgwOSwgMHgwMywgMHgwMCwgMHhGMiwgMHgwOSwgMHhGMCwKKwkgMHhBQywgMHg4NiwgMHgwMCwgMHhGMiwgMHhERCwgMHg4MSwgMHhGQywgMHgwMiwgMHg2NCwgMHg0NCwgMHhBQywgMHg4NiwgMHhGNiwgMHgwMSwgMHg2MSwgMHg0NCwKKwkgMHgyNSwgMHg0NiwgMHgyNywgMHhEQSwgMHg2NSwgMHg0NCwgMHgyOCwgMHg0NSwgMHg0NSwgMHg4OCwgMHhDQywgMHg4NSwgMHg1QSwgMHg4NywgMHhFOSwgMHgwMiwKKwkgMHgwMCwgMHg2NCwgMHgyNywgMHhEQSwgMHg1QSwgMHhEQSwgMHg1QSwgMHg4NywgMHg4OCwgMHhGMywgMHg4NywgMHhGMSwgMHgwMiwgMHhBNCwgMHg2MCwgMHg0NiwKKwkgMHg2MCwgMHg0NSwgMHgwMCwgMHg2MSwgMHgxRSwgMHhGMiwgMHhGRiwgMHhGRiwgMHhBQywgMHg4NiwgMHgwMCwgMHhGMiwgMHgwNCwgMHgwMywgMHhBQywgMHg4NiwKKwkgMHgwMCwgMHhGMiwgMHhERCwgMHg4MSwgMHhGQywgMHgwMiwgMHg2NSwgMHg0NCwgMHgwMiwgMHhBNSwgMHg2NSwgMHg0NiwgMHg2NCwgMHg0NCwgMHhDQywgMHg5QywKKwkgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMiwgMHg2MSwgMHg0NCwgMHgyNSwgMHg0NiwgMHgyNywgMHhEQSwgMHg1QSwgMHg4NywgMHgyOCwgMHg0NSwgMHg0NSwgMHg4OCwKKwkgMHg4OCwgMHhGMywgMHg4NywgMHhGMSwgMHgwMiwgMHhBNCwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0NSwgMHgwMCwgMHg2MSwgMHg3MiwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHhBQywgMHg4NiwgMHgwMCwgMHhGMiwgMHgwOSwgMHgwMywgMHgwMCwgMHhGMiwgMHgwOSwgMHhGMCwgMHhBQywgMHg4NiwgMHgwMCwgMHhGMiwgMHhERCwgMHg4MSwKKwkgMHhGQywgMHgwMiwgMHg2NCwgMHg0NCwgMHhBQywgMHg4NiwgMHhGNiwgMHgwMSwgMHg2NSwgMHg0NCwgMHgwMiwgMHhBNSwgMHg2NSwgMHg0NiwgMHg2NCwgMHg0NCwKKwkgMHhDQywgMHg5QywgMHg2MSwgMHg0NCwgMHhFQiwgMHgwMiwgMHgyNSwgMHg0NiwgMHgyNywgMHhEQSwgMHg1QSwgMHg4NywgMHgyOCwgMHg0NSwgMHg0NSwgMHg4OCwKKwkgMHgwNiwgMHg2MCwgMHg0MCwgMHg2NSwgMHg4RCwgMHhGMywgMHgwMSwgMHg2MSwgMHhBQywgMHg4NiwgMHgwMCwgMHhGMiwgMHgwMywgMHgwMywgMHhENSwgMHg4MCwKKwkgMHhERCwgMHg4MSwgMHhGQSwgMHgwNCwgMHhDRCwgMHg4NCwgMHgyNSwgMHg0NiwgMHgyNywgMHhEQSwgMHgyOCwgMHg0NSwgMHhDNCwgMHg4NCwgMHg1QSwgMHhEQSwKKwkgMHhEQSwgMHg4MSwgMHg4QywgMHhGMSwgMHg1OSwgMHhEOCwgMHgxQiwgMHg2MCwgMHg4NiwgMHg2NCwgMHgxOCwgMHg2MywgMHhBMCwgMHhEMSwgMHgwNiwgMHhBNCwKKwkgMHg1OSwgMHhEOCwgMHhGQywgMHgxRiwgMHgwMCwgMHg2NCwgMHg1OSwgMHhEQSwgMHg1OSwgMHhEQSwgMHgwMSwgMHg2MCwgMHgxQywgMHg2NCwgMHgwQSwgMHg2MywKKwkgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOCwgMHhGRCwgMHgxRiwgMHg3RSwgMHhGMSwgMHg1OSwgMHhEOCwgMHg0NSwgMHgwMSwgMHgwNywgMHg0QiwgMHhCNCwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHgyMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQiwgMHg0NywgMHg1OCwgMHg0RiwgMHgyMSwgMHgwMCwgMHgzQywgMHgwMSwgMHgwNywgMHg0QiwKKwkgMHhCNCwgMHg2MCwgMHg1OCwgMHg0RiwgMHgyMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQiwgMHg0NywgMHgyNywgMHg0NCwgMHgwMCwgMHhCRSwgMHgwOCwgMHhGMCwKKwkgMHgxNSwgMHgwMywgMHg2NCwgMHg0MiwgMHg0QSwgMHhEMywgMHgwOSwgMHhGMiwgMHhEQywgMHg4MywgMHhBMiwgMHhERCwgMHgyNSwgMHg0MywgMHgwOSwgMHhGQywKKwkgMHg2MywgMHg0NiwgMHgyNywgMHg0MywgMHgwQSwgMHhGQywgMHgwOSwgMHhGQSwgMHgwOCwgMHhGOCwgMHgwMCwgMHhBOCwgMHg2NiwgMHg0MywgMHgwMywgMHgwMiwKKwkgMHg2NCwgMHg0NCwgMHg1OCwgMHhERCwgMHgwMywgMHgwMCwgMHg2MCwgMHg0NiwgMHgyNSwgMHg0NCwgMHgwQSwgMHhGQSwgMHgxQywgMHgwMSwgMHgyNywgMHg0MywKKwkgMHhFMywgMHg4MSwgMHhFOSwgMHg4MSwgMHgwMywgMHgwNSwgMHgxNiwgMHgwMywgMHgwMCwgMHg2MSwgMHgwMSwgMHgwMCwgMHhFNCwgMHg2MywgMHg2MSwgMHg0NiwKKwkgMHhCRiwgMHhEMiwgMHgyNywgMHg0NSwgMHhEQywgMHg4NCwgMHhBMiwgMHhEQSwgMHhBMywgMHhEMiwgMHgyNSwgMHg0NiwgMHg4OCwgMHhGOCwgMHgwNCwgMHgxQiwKKwkgMHgyNSwgMHg0NCwgMHg2MSwgMHg0NiwgMHhCRSwgMHhEQSwgMHgwNCwgMHgwMCwgMHgwOSwgMHhGQSwgMHg2MCwgMHg0NiwgMHgyNSwgMHg0NCwgMHgwQSwgMHhGQSwKKwkgMHg2MSwgMHg0NiwgMHhBMywgMHhEQSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwMywgMHgwMiwKKwkgMHgyOCwgMHhFMiwgMHg0MCwgMHhGRiwgMHhBMSwgMHhGRiwgMHg4NCwgMHhGRiwgMHhCRiwgMHg2MCwgMHhBRCwgMHg2NCwgMHg0MCwgMHg0MiwgMHhCNSwgMHg2MCwKKwkgMHhBMiwgMHg2NCwgMHg0MCwgMHg0MCwgMHg5RCwgMHhGMywgMHg2NiwgMHhGQiwgMHgwRiwgMHg2MCwgMHg5QSwgMHg2MywgMHhBQSwgMHhGMywgMHhCRCwgMHhEQiwKKwkgMHgwMCwgMHg2MCwgMHg5QSwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwMiwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwNCwgMHg2NCwgMHhBMywgMHhEQiwgMHg1QywgMHg0OSwKKwkgMHgwQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHg1QywgMHg1QywgMHgwMSwgMHg2MCwgMHgzOSwgMHhFMiwgMHgwNCwgMHg2MCwgMHgwMCwgMHg3QSwgMHg4OSwgMHhGRiwKKwkgMHgwMywgMHg2MCwgMHhGRiwgMHg3MywgMHg4OCwgMHhGRiwgMHhCNSwgMHg2MCwgMHhBMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMCwgMHhGRSwgMHgwNywgMHgwNSwKKwkgMHhBMywgMHhGRSwgMHgwNywgMHgwNSwgMHhBMSwgMHhGRSwgMHg1MCwgMHgwNSwgMHg2MCwgMHg2NCwgMHgzQiwgMHhEQiwgMHgxMCwgMHgwMCwgMHgyMCwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhGQSwgMHgwMSwgMHgxMiwgMHg2MCwgMHhDQywgMHg2MywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHhGQiwgMHhCNCwgMHhBMywgMHhEQiwKKwkgMHhBMCwgMHg0QywgMHg1OSwgMHhCQywgMHhGRiwgMHhCNCwgMHhBMCwgMHg1MSwgMHhBMCwgMHg0QywgMHg3RCwgMHhCNCwgMHhBMCwgMHg1MSwgMHhBMSwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHg4MywgMHgzRSwgMHg0MCwgMHg2MCwgMHgwQiwgMHg2NSwgMHgyQiwgMHg0NCwgMHgwMCwgMHg2MywgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwKKwkgMHgwMiwgMHgyNCwgMHg5NCwgMHg4NCwgMHhGMywgMHg4MywgMHhDRCwgMHg4MSwgMHhGRiwgMHhGRiwgMHhGOCwgMHgwMiwgMHhERiwgMHg4MywgMHgyRiwgMHg1OCwKKwkgMHg0MCwgMHg0QiwgMHgwMCwgMHg2MiwgMHgwMSwgMHg2NCwgMHhENCwgMHg4MCwgMHhFMCwgMHg4NCwgMHgxQSwgMHgwMywgMHhENCwgMHg4MCwgMHhFMCwgMHg4NCwKKwkgMHgxNSwgMHgwMywgMHg2MSwgMHg0NCwgMHgxMSwgMHg2MSwgMHhFMCwgMHg4NCwgMHhDRCwgMHg4MSwgMHhGRCwgMHgwNCwgMHgwMSwgMHgwMCwgMHhFMCwgMHg4NCwKKwkgMHhGMiwgMHg4MiwgMHhGRiwgMHhGRiwgMHgwMiwgMHgyNCwgMHhDNiwgMHg4MiwgMHgwMiwgMHgyOCwgMHhENiwgMHg4MiwgMHhFMiwgMHg4MCwgMHhDRCwgMHg4MSwKKwkgMHgwMiwgMHgyOCwgMHgwMSwgMHhCQywgMHhGNCwgMHgwMiwgMHgwMSwgMHgyQSwgMHhDNiwgMHg4MiwgMHgwMywgMHgwMCwgMHhFOSwgMHg4MSwgMHhGMiwgMHg4MiwKKwkgMHg2MSwgMHg0NCwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHgxMCwgMHg2MSwgMHgwNCwgMHgwMywgMHhGMCwgMHg4NCwgMHhDRCwgMHg4MSwKKwkgMHhGRCwgMHgwNCwgMHg2MSwgMHg0NCwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHgzQiwgMHhEQiwgMHgxNiwgMHg2MCwgMHhBOCwgMHg2MywKKwkgMHhCRCwgMHhEMywgMHhBMywgMHhEMSwgMHg2MCwgMHg0MCwgMHgwNCwgMHgzQSwgMHgyRCwgMHgwMCwgMHgwMCwgMHg2NCwgMHg0QSwgMHhEQiwgMHgxQiwgMHg2MCwKKwkgMHg4OCwgMHg2MywgMHhBMywgMHhEMywgMHg0NiwgMHg0MywgMHhBQywgMHg4NiwgMHgzQywgMHg0NSwgMHgyMywgMHgwMywgMHhENCwgMHg4MCwgMHgwNywgMHhGMiwKKwkgMHgwMiwgMHgwMiwgMHgwOSwgMHhGMiwgMHhGOCwgMHgwMSwgMHhEMCwgMHg4MCwgMHgwOSwgMHhGMiwgMHhGNSwgMHgwMiwgMHg2MCwgMHg0MywgMHg4MCwgMHg2NywKKwkgMHhCMCwgMHg4MSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHg2MSwgMHg0NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2NSwgMHgwRSwgMHhGMiwgMHgwMiwgMHhGMiwgMHg2MCwgMHg0MCwKKwkgMHhGMCwgMHgzNywgMHgwNSwgMHgwMCwgMHg5MCwgMHhGMywgMHhENCwgMHg4MCwgMHhDQywgMHg4NCwgMHgwMSwgMHgwMiwgMHg5MCwgMHhGQiwgMHg2MywgMHg0NCwKKwkgMHhEQSwgMHgwMSwgMHgyMywgMHg0NiwgMHgzQywgMHg0NCwgMHhBQywgMHg4MCwgMHhGRiwgMHhGRiwgMHg4OSwgMHgwMiwgMHg2QSwgMHhGMywgMHg2QiwgMHhGMywKKwkgMHgwMiwgMHhBOCwgMHgwMiwgMHhBOCwgMHgwOCwgMHgwMiwgMHgwMCwgMHg2NCwgMHg2QywgMHhGQiwgMHg2QSwgMHhGQiwgMHg2QiwgMHhGQiwgMHgwMCwgMHg2NCwKKwkgMHg2RCwgMHhGQiwgMHhDQSwgMHhGRSwgMHg5NywgMHgwMCwgMHgwMywgMHgwMiwgMHgwMCwgMHg2NCwgMHg2QiwgMHhGQiwgMHhDQSwgMHhGRSwgMHgwMSwgMHg2NCwKKwkgMHgzQiwgMHhEQiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgzNSwgMHgwMywKKwkgMHgyQywgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHg4QSwgMHgwMCwgMHgyRSwgMHhGMiwgMHgxMiwgMHg2MCwgMHhDRSwgMHg2NSwKKwkgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwKKwkgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgyRSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwKKwkgMHgyRCwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwgMHgyQywgMHhGMCwgMHg2MywgMHg0NiwKKwkgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwgMHg4OCwgMHhGMywKKwkgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHg2MywgMHgwMiwgMHg2NiwgMHg0NSwgMHg2MywgMHg0NiwgMHgwNiwgMHhGMiwgMHg2NSwgMHg0NiwKKwkgMHg4MCwgMHhCMCwgMHgwOSwgMHhGMiwgMHg1QywgMHgwMywgMHhBQywgMHg4NiwgMHhDQSwgMHgwMSwgMHg2QiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhBOCwKKwkgMHhGRiwgMHhGRiwgMHg1MCwgMHgwMiwgMHgxQiwgMHg2MCwgMHhBMCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwKKwkgMHgwRiwgMHgwMywgMHg3NywgMHhGMSwgMHgwNywgMHhGMiwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHgwOSwgMHhGMiwgMHgwMywgMHgwMiwgMHhBQywgMHg4NiwKKwkgMHgwNywgMHhGMiwgMHhGQSwgMHgwMiwgMHgwMywgMHgwMiwgMHgwMCwgMHg2NCwgMHg3NywgMHhGQiwgMHhFQywgMHgwMSwgMHg0NiwgMHg1QywgMHgzRiwgMHgwMCwKKwkgMHgxQiwgMHg2MCwgMHhBNiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgwMSwgMHgwMywgMHgzNywgMHgwMiwKKwkgMHg2QywgMHhGMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhBOCwgMHhGRiwgMHhGRiwgMHgxNCwgMHgwMiwgMHgxQiwgMHg2MCwgMHg5NCwgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgwQiwgMHgwMywgMHgyQSwgMHhGMCwgMHgyMCwgMHg2NywgMHgwOSwgMHhGMiwgMHhCMCwgMHg4MywKKwkgMHgwMCwgMHhBOCwgMHgwMCwgMHg2NCwgMHgwMiwgMHgwMywgMHgyQSwgMHhGQywgMHgwMSwgMHgwMCwgMHg2QywgMHhGQiwgMHgyMCwgMHgwMCwgMHgwMCwgMHg2NCwKKwkgMHg2QywgMHhGQiwgMHgxQiwgMHg2MCwgMHg4OCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgxMiwgMHgwMywKKwkgMHgyQSwgMHhGMCwgMHgwOCwgMHg2NywgMHhBMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxMiwgMHgwMywgMHg3NywgMHhGMSwgMHgwNywgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHhEMCwgMHg4MCwgMHgwOSwgMHhGMiwgMHgwMywgMHgwMiwgMHhBQywgMHg4NiwgMHgwNywgMHhGMiwgMHhGQSwgMHgwMiwgMHgwOCwgMHgwMiwgMHgwMCwgMHg2NCwKKwkgMHg3NywgMHhGQiwgMHhFNywgMHgwMSwgMHgwMCwgMHg2NCwgMHg3NywgMHhGQiwgMHhCNSwgMHg2MCwgMHhBMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwKKwkgMHhGQywgMHhGQiwgMHg0NiwgMHg1QywgMHgyMSwgMHg2MCwgMHg5OCwgMHg2MywgMHhBMywgMHhEMywgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhFMywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwRCwgMHhGMiwgMHg2MCwgMHg1QywgMHg2NCwgMHg1RiwgMHgwRCwgMHhGQSwgMHgwNywgMHhGMCwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHg3NywgMHhGOSwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyQiwgMHgwNSwgMHgwMCwgMHgwMCwgMHg2NCwgMHg0OCwgMHhGQiwgMHhCOCwgMHg2MCwgMHgyRCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHhEMCwgMHg4MCwgMHg4OCwgMHhGMywgMHgwNywgMHgwMiwgMHgyMywgMHhGMCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQSwgMHhCRCwgMHg2MCwgMHgyOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhCOCwgMHhGMywgMHgwMywgMHgwMywgMHg2MCwgMHg0MCwKKwkgMHgwMywgMHgzQSwgMHgwMCwgMHgwMCwgMHgyQSwgMHhGMiwgMHgwMCwgMHg2MywgMHg0MCwgMHg0NywgMHg1MCwgMHgzNiwgMHgwMSwgMHgwMCwgMHgwMSwgMHg2MywKKwkgMHg0OCwgMHhGRCwgMHg0QSwgMHhGMywgMHgzNSwgMHhGQSwgMHgxMCwgMHhBNCwgMHg0QSwgMHhGQiwgMHgwMCwgMHg2NCwgMHgxNSwgMHhGQSwgMHgxNiwgMHhGQSwKKwkgMHgwRiwgMHhGQSwgMHhGRiwgMHhGRiwgMHgwNywgMHhGMCwgMHg2NiwgMHg0MywgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMCwgMHg2MywgMHg0NiwgMHgwMCwgMHg3RiwKKwkgMHg2NCwgMHg1RSwgMHg0QiwgMHhGQiwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RSwgMHhCQiwgMHhGQiwgMHgwNywgMHhGMCwgMHg4OCwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHhCQiwgMHhGMywgMHhCQSwgMHhGQiwgMHg2MCwgMHg0MSwgMHgwMywgMHhGMiwgMHgwMCwgMHhGNCwKKwkgMHgwMSwgMHhGMiwgMHhGQywgMHhBNSwgMHgwMCwgMHg3RiwgMHhENCwgMHg4NCwgMHgyNywgMHg0NSwgMHgzQywgMHg0NiwgMHgxQSwgMHhGQSwgMHgyMiwgMHg2MywKKwkgMHg3QiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBNCwgMHg4NCwgMHgwMywgMHgyQiwgMHgxQywgMHg2MywgMHgyQSwgMHhGQSwgMHg2MCwgMHg0MCwgMHhBNCwgMHgzNiwKKwkgMHgxNCwgMHg2MywgMHg0MywgMHg0QywgMHgwMCwgMHg3QywgMHgyMiwgMHhGOCwgMHg2NCwgMHg0MSwgMHgwNywgMHhGMCwgMHg2NiwgMHg0MywgMHg2NCwgMHg0NiwKKwkgMHgzNiwgMHhGMiwgMHg2MywgMHg0NiwgMHhGRiwgMHhCNCwgMHgyMiwgMHhGQSwgMHg2MCwgMHg0MCwgMHgwMCwgMHgzNiwgMHg4RSwgMHgwMCwgMHgyQSwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgzQSwgMHg4OSwgMHgwMCwgMHgwMywgMHhGMiwgMHgwMCwgMHhGNCwgMHhBMCwgMHhEMiwgMHhBQSwgMHg2MCwKKwkgMHhBQSwgMHg2NSwgMHg1QSwgMHhEMCwgMHhENCwgMHg4MCwgMHgwMywgMHg2NCwgMHgwQSwgMHgwMiwgMHhEMCwgMHg4MCwgMHgwMCwgMHg2NCwgMHg1QSwgMHhEMCwKKwkgMHgwNiwgMHgwMiwgMHhEMCwgMHg4MCwgMHhGOCwgMHg3RiwgMHhEMCwgMHg4MCwgMHgwMSwgMHgwMywgMHgwMSwgMHgwMiwgMHgwMSwgMHg2MSwgMHg2MiwgMHg0MywKKwkgMHg0NiwgMHg0MywgMHgzQywgMHg0NiwgMHgwNywgMHhGNCwgMHgzNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHhBMywgMHg0NiwgMHg2MCwgMHg0MCwgMHgyMiwgMHgyNiwKKwkgMHg0NSwgMHgwMCwgMHg2MCwgMHg0NSwgMHg2MywgMHg0MiwgMHg1QSwgMHhEMCwgMHhDRCwgMHg4MSwgMHgzQywgMHg0NiwgMHgxNCwgMHgwMiwgMHg2NCwgMHg0NCwKKwkgMHg4OCwgMHgzQSwgMHgxMSwgMHgwMCwgMHg4RSwgMHgzQiwgMHgwRiwgMHgwMCwgMHg2NSwgMHg0NCwgMHgwMSwgMHgyNiwgMHg1RSwgMHgwMCwgMHgwNCwgMHgyNiwKKwkgMHgwMywgMHgwMCwgMHgxMCwgMHgyNiwgMHgwMSwgMHgwMCwgMHgyRCwgMHgwMCwgMHhBMywgMHg0NiwgMHgzNywgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwKKwkgMHg4MCwgMHgyQiwgMHg1MywgMHgwMCwgMHgzQSwgMHgwMCwgMHhBMywgMHg0NiwgMHg2NSwgMHg0NCwgMHgwMSwgMHgyNiwgMHgwQiwgMHgwMCwgMHgwNCwgMHgyNiwKKwkgMHgwMywgMHgwMCwgMHgxMCwgMHgyNiwgMHgwMSwgMHgwMCwgMHgxRCwgMHgwMCwgMHgzNywgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyNywKKwkgMHgyQywgMHgwMCwgMHgxNywgMHgwMCwgMHg4OCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NiwgMHgzNiwgMHhGMiwgMHg2NiwgMHg0MywgMHhGRiwgMHhCNCwKKwkgMHgzQywgMHg0NiwgMHgyMiwgMHhGMCwgMHg2MCwgMHg0NywgMHhCMCwgMHg4NCwgMHgyMiwgMHhGQSwgMHg2MywgMHg0NiwgMHgzNywgMHhGMCwgMHg2MCwgMHg0MCwKKwkgMHgwNCwgMHgyNywgMHgwMywgMHgwMCwgMHgxMCwgMHgyNywgMHgwMSwgMHgwMCwgMHgwNCwgMHgwMCwgMHg2NCwgMHg0MCwgMHg4MCwgMHgyNywgMHgxNSwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgzQywgMHg0NiwgMHgwMiwgMHg2NSwgMHhCQywgMHg2MCwgMHg1OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDRCwgMHg4MSwgMHg2MywgMHg0MiwKKwkgMHg1QSwgMHhEMCwgMHgzQywgMHg0NiwgMHgwQSwgMHgwMiwgMHg2NCwgMHg0NCwgMHg4OCwgMHgzQSwgMHgwNywgMHgwMCwgMHg3NywgMHgzNywgMHgxRCwgMHgwMCwKKwkgMHg3OCwgMHgzNywgMHgxQiwgMHgwMCwgMHg4RSwgMHgzNywgMHgxOSwgMHgwMCwgMHhGMSwgMHgwMSwgMHgzQywgMHg0NiwgMHgyMiwgMHhGMCwgMHg4MCwgMHg2NywKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHhGRiwgMHhGRiwgMHgzRiwgMHhGMiwgMHgzRSwgMHhGMCwgMHgwOCwgMHhBNCwgMHg2MCwgMHg0MSwgMHgyMiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwMywgMHgwMCwgMHgwNCwgMHgyNiwgMHgwMywgMHgwMCwgMHgwNiwgMHgwMCwgMHgwNCwgMHgyQiwKKwkgMHgwNCwgMHgwMCwgMHg2MSwgMHg0NCwgMHg2NCwgMHg0MCwgMHgxMCwgMHgyNiwgMHgzRiwgMHhGQSwgMHgzQywgMHg0NiwgMHgyQywgMHhGMiwgMHgyNywgMHg0MCwKKwkgMHgwMSwgMHgyNywgMHgzMiwgMHhGMiwgMHhCNSwgMHhGMSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHg1MywgMHgwMCwgMHgwOSwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhEMCwgMHg4MCwgMHgzRiwgMHhGMiwgMHgwOSwgMHgwNiwgMHgyQywgMHg0NSwgMHhDNCwgMHg4NCwgMHhEMCwgMHg4MCwgMHg0MCwgMHg0QSwgMHg0MCwgMHgwNiwKKwkgMHg2MCwgMHg0MywgMHg2NCwgMHg0NCwgMHg1NCwgMHg4OCwgMHgxOCwgMHgwMCwgMHg2MCwgMHg0NSwgMHgxRiwgMHg2MCwgMHg5QywgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhCQiwgMHhGMywgMHgwMCwgMHhCQywgMHg2MCwgMHg0NywgMHhFQywgMHhBMCwgMHgzMywgMHgwMywgMHgzMiwgMHgwNywgMHgyQywgMHg0NCwgMHhDNCwgMHg4MSwKKwkgMHgwMiwgMHg2MCwgMHgxQywgMHg2NSwgMHg0NSwgMHg0QSwgMHhENSwgMHg4MCwgMHgyQywgMHg0NSwgMHgyQSwgMHgwNiwgMHgyNywgMHg0MCwgMHgwNCwgMHgyNywKKwkgMHgzMCwgMHgwMCwgMHgyQSwgMHg0MywgMHhENywgMHg4NSwgMHg0NSwgMHg0OCwgMHhCNiwgMHhGMSwgMHgwRiwgMHhGMiwgMHhEMywgMHg4MCwgMHgwMSwgMHg2NSwKKwkgMHgwMSwgMHgwNywgMHgwMCwgMHg2NSwgMHhCNCwgMHg4NCwgMHgwRiwgMHhGQSwgMHgwMCwgMHg2MywgMHgzRiwgMHhGMiwgMHgyOCwgMHg0NSwgMHg2MCwgMHg0MSwKKwkgMHhENCwgMHg4NCwgMHhERiwgMHg4MywgMHhGQywgMHgwNywgMHgxNCwgMHhGQywgMHg2MSwgMHg0NCwgMHgwMSwgMHgzNiwgMHgwMiwgMHgwMCwgMHgwOSwgMHgzQSwKKwkgMHgwNiwgMHgwMCwgMHgyOCwgMHg0NCwgMHg0OCwgMHg4OCwgMHgyQSwgMHg0NCwgMHhDOCwgMHg4MywgMHg0MywgMHg0QSwgMHhFNSwgMHgwMSwgMHgxNywgMHhGQSwKKwkgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgyNywgMHg0NSwgMHhCNCwgMHg4NCwgMHgyQSwgMHhGQSwgMHgyOCwgMHg0MywgMHgxNiwgMHhGQywgMHgwRCwgMHgwMCwKKwkgMHgzRiwgMHhGMiwgMHgyQywgMHg0NSwgMHhCNiwgMHhGMSwgMHhDNCwgMHg4MSwgMHhEMSwgMHg4MCwgMHgwRiwgMHhGMiwgMHgwMSwgMHgwNiwgMHgwMSwgMHhCQywKKwkgMHgwRiwgMHhGQSwgMHgzRiwgMHhGMiwgMHgxNywgMHhGQSwgMHgwMSwgMHg2NCwgMHgxNCwgMHhGQSwgMHgwNywgMHhGMCwgMHg2NiwgMHg0MywgMHg2NCwgMHg0NiwKKwkgMHgwRSwgMHhGMCwgMHg2MywgMHg0NiwgMHgwMCwgMHg3RiwgMHg2NCwgMHg1RSwgMHg0QiwgMHhGQiwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RSwgMHhCQiwgMHhGQiwKKwkgMHg2MiwgMHhGMSwgMHg2MCwgMHg0MywgMHg2MCwgMHg0NywgMHhEMCwgMHg4MCwgMHhDMCwgMHg2NSwgMHgwMSwgMHgwNiwgMHg2NCwgMHg0NCwgMHgwQSwgMHgzNiwKKwkgMHg3MCwgMHg2NCwgMHgxNCwgMHgzNiwgMHgzOCwgMHg2NCwgMHgzNywgMHgzNiwgMHgxNSwgMHg2NCwgMHg2RSwgMHgzNiwgMHgwQiwgMHg2NCwgMHg0NCwgMHg4NiwKKwkgMHgyQSwgMHhGMiwgMHgwNywgMHhGMCwgMHg2MCwgMHg0MCwgMHhCMCwgMHgzQSwgMHgwMywgMHgwMCwgMHg0MCwgMHgzQiwgMHgwMSwgMHgwMCwgMHgxMiwgMHgwMCwKKwkgMHgwQywgMHhCNCwgMHgwOCwgMHgzQSwgMHg1NSwgMHgwMCwgMHgyMiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyQiwgMHg1MCwgMHgwMCwKKwkgMHgxNywgMHhGMiwgMHgyMiwgMHhGMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgyMiwgMHgyMiwgMHgwNCwgMHgwMCwgMHgwMCwgMHhBOCwgMHgwMSwgMHhBOCwKKwkgMHg0NywgMHgwMywgMHg0NiwgMHgwMywgMHgzQywgMHg0NiwgMHgyQSwgMHhGMCwgMHg0MCwgMHg2NywgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHg2MCwgMHg0NSwKKwkgMHgyMiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MywgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwMywgMHgwMCwgMHgwNCwgMHgyNiwgMHgwQSwgMHgwMCwKKwkgMHgwMiwgMHgwMCwgMHgwNCwgMHgyNywgMHgwNywgMHgwMCwgMHg2NSwgMHg0NCwgMHgyQSwgMHg2NSwgMHg2MCwgMHg0MCwgMHgwMywgMHgyQiwgMHgyNCwgMHg2NSwKKwkgMHg0NSwgMHg0QywgMHgyRSwgMHgwMCwgMHg2NSwgMHg0NCwgMHgyRSwgMHg2NSwgMHg2MCwgMHg0MCwgMHgwMywgMHgyQiwgMHgyOCwgMHg2NSwgMHg0NSwgMHg0QywKKwkgMHgwNywgMHhGMCwgMHg4OCwgMHhGMywgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHgwMCwgMHg3QywgMHgwMywgMHgwMywgMHg2MywgMHg0MCwgMHgwMSwgMHgyQSwKKwkgMHgwMSwgMHgwMCwgMHgzRCwgMHhGMSwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwOCwgMHhCMCwgMHgzRSwgMHhGMiwgMHgxOSwgMHgwMywgMHg2MCwgMHg0NywKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgwMywgMHhCNCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxMSwgMHgwMywgMHgxQiwgMHg2MCwKKwkgMHhENCwgMHg2MiwgMHgxQiwgMHg2MCwgMHhBQywgMHg2NCwgMHhBMiwgMHhEQiwgMHgzQywgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHg1QywgMHg1QywgMHhGQywgMHhGQywgMHhDRSwgMHhGRSwgMHhCNSwgMHg2MCwgMHhFQywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhCQiwgMHhGMSwgMHgyQywgMHg0NSwgMHg2NCwgMHg0MywgMHgxNywgMHhGMiwgMHg0QiwgMHhGMSwgMHhDNCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4MSwgMHg2MywgMHg0MCwgMHgzNywgMHgzNywgMHhFMSwgMHg4MSwgMHg2NCwgMHg0NSwgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDMSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhBRSwgMHg4MiwgMHhGQywgMHhBMiwgMHgwQSwgMHgwMywgMHg2MywgMHg0MCwgMHg2RSwgMHgzQiwgMHgwNiwgMHgwMCwgMHg2MCwgMHg0MSwKKwkgMHgwNCwgMHgwRCwgMHg2MywgMHg0NCwgMHg4MCwgMHg3RSwgMHhCQiwgMHhGQiwgMHg2MSwgMHg0NCwgMHhEQywgMHg4NCwgMHgyQiwgMHhGMCwgMHgxQiwgMHhGQSwKKwkgMHg2NCwgMHg0NCwgMHg4MCwgMHgyNywgMHgzNCwgMHgwMCwgMHgxNiwgMHhGMiwgMHgwRiwgMHhGMCwgMHhBQywgMHg4NCwgMHgyQywgMHg0NSwgMHgyOSwgMHgwMywKKwkgMHg0QiwgMHhGMSwgMHhDNCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4MSwgMHg2MywgMHg0MCwgMHgzNywgMHgzNywgMHhFMSwgMHg4MSwKKwkgMHg2NCwgMHg0NSwgMHgwRiwgMHhGMCwgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBRSwgMHg4MiwgMHhGQywgMHhBMiwKKwkgMHgwQSwgMHgwMywgMHg2MywgMHg0MCwgMHg2RSwgMHgzQiwgMHgwNiwgMHgwMCwgMHg2MCwgMHg0MSwgMHgwNCwgMHgwRCwgMHg4MCwgMHg2NywgMHhCMCwgMHg4NCwKKwkgMHgwRiwgMHhGQSwgMHg2MSwgMHg0NCwgMHhEQywgMHg4NCwgMHgxRCwgMHhGQSwgMHhERSwgMHg2NSwgMHhDNCwgMHg4NSwgMHgyNiwgMHg0MSwgMHhFMSwgMHg4MSwKKwkgMHhDNSwgMHg4NCwgMHgyQiwgMHhGQSwgMHgxQiwgMHhGMCwgMHhERSwgMHg2NCwgMHhDMCwgMHg4NSwgMHgyNiwgMHg0NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NCwKKwkgMHgxMCwgMHhGQSwgMHgyNiwgMHg0NCwgMHgyQywgMHhGMCwgMHgwQSwgMHhBNCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwMCwgMHg2NCwgMHgxMSwgMHhGQSwKKwkgMHhCQiwgMHhGMywgMHgxMywgMHhGQSwgMHhGRiwgMHhGRiwgMHgwRCwgMHhGMiwgMHgzRSwgMHhGMCwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwgMHg2NCwgMHg0MSwKKwkgMHgwMSwgMHhCMSwgMHgwMSwgMHg2MywgMHgxRCwgMHgwMiwgMHg2MCwgMHg0MSwgMHhGRiwgMHgyMiwgMHgwNCwgMHgwMCwgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHhCMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHg5MiwgMHg2NCwgMHhBMCwgMHhERCwgMHgyMSwgMHg2MCwgMHg5OCwgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhFMywgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgwMSwgMHg2MywgMHg2MSwgMHg0MCwgMHhGRiwgMHgyMiwKKwkgMHgwNCwgMHgwMCwgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RiwgMHhCMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHg5NCwgMHg2NCwgMHhBMCwgMHhERCwKKwkgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyNywgMHgwMywgMHgwMCwgMHhCQSwgMHg2MCwgMHg0QSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyMiwgMHhGMiwgMHg0NiwgMHg0MywgMHg2MCwgMHg0MCwgMHgyMiwgMHgyNiwgMHg4QiwgMHgwMCwgMHgwMSwgMHgyNiwgMHgwNSwgMHgwMCwgMHgwNCwgMHgyNiwKKwkgMHgwQywgMHgwMCwgMHhCQSwgMHg2MCwgMHg0QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgyNywgMHgwMywgMHgwMCwgMHhCQSwgMHg2MCwgMHg0QSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg4OCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NiwgMHgwMiwgMHgwMCwgMHgwNywgMHhGNCwgMHhGRiwgMHhGRiwgMHhBMywgMHg0NiwKKwkgMHgyQSwgMHhGMiwgMHhBMywgMHg0NiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyNywgMHgzQiwgMHgwMCwgMHg4OCwgMHhGMywgMHg2NiwgMHg1QywgMHhEMCwgMHg4MCwKKwkgMHgzNywgMHhGMCwgMHgwOCwgMHgwMywgMHg2NCwgMHg0MCwgMHgxMCwgMHgyQSwgMHgxMiwgMHgwMCwgMHhGRiwgMHg2MCwgMHhFRiwgMHg2NCwgMHhBMCwgMHg4NCwKKwkgMHgzNywgMHhGQSwgMHgyNCwgMHgwMCwgMHgzRCwgMHhGMywgMHgwMSwgMHg2MSwgMHg2MCwgMHg0MywgMHhDRiwgMHg4MywgMHhFMSwgMHg4MSwgMHhGRCwgMHgwRCwKKwkgMHhFOSwgMHg4MSwgMHhBMSwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHg5MSwgMHg4NCwgMHgzNywgMHhGQSwgMHgxNywgMHgwMCwgMHg0NywgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHgxMCwgMHhBMCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNCwgMHhGRiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhEQywgMHg4NCwgMHg0NywgMHhGQSwKKwkgMHg0NiwgMHhGMiwgMHgxNiwgMHgwNCwgMHhEQywgMHg4NCwgMHg0NiwgMHhGQSwgMHg0NSwgMHhGMiwgMHgwOCwgMHgwNCwgMHhEQywgMHg4NCwgMHg0NSwgMHhGQSwKKwkgMHgwNSwgMHgwNCwgMHgzNywgMHhGMiwgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgzNywgMHhGQSwgMHgwRCwgMHg2MCwgMHgzRSwgMHg2MiwKKwkgMHg4MCwgMHhGRiwgMHg3OCwgMHg0NCwgMHgwMywgMHhBNCwgMHhBMiwgMHhEQiwgMHhDNCwgMHg2MCwgMHgwNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4NCwgMHhGRiwKKwkgMHgwRCwgMHg2MCwgMHgzRSwgMHg2MiwgMHg4MCwgMHhGRiwgMHg3OCwgMHg0NCwgMHgwMywgMHhBNCwgMHhBMiwgMHhEQiwgMHhDNCwgMHg2MCwgMHg3RCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg4NCwgMHhGRiwgMHg4OCwgMHhGMywgMHg2NiwgMHg1QywgMHhEMCwgMHg4MCwgMHgwMCwgMHg3QywgMHgwNywgMHgwMywgMHg2NiwgMHg0MywKKwkgMHgzQywgMHg0NiwgMHgyMiwgMHhGMiwgMHg2MywgMHg0NiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMSwgMHgwMCwgMHgzQywgMHhGMSwgMHg0NywgMHhGMCwKKwkgMHg2NCwgMHg0MSwgMHg2NCwgMHg0NywgMHhGRiwgMHhCNCwgMHg2MCwgMHg1RiwgMHgyMCwgMHhCQywgMHg4MCwgMHgyNiwgMHg4MCwgMHhBQywgMHg2MCwgMHg0NywKKwkgMHhBMywgMHg0NiwgMHgzQSwgMHhGQSwgMHg2NCwgMHg0NCwgMHgyMCwgMHg3RiwgMHgzNCwgMHg5NCwgMHgzQiwgMHhGQSwgMHhBMywgMHg0NiwgMHg0NiwgMHhGMiwKKwkgMHg0NSwgMHhGMCwgMHhBMywgMHg0NiwgMHgzQywgMHhGQSwgMHgzRCwgMHhGOCwgMHgwOCwgMHg2MCwgMHgwMCwgMHhFQSwgMHgwRiwgMHg2NCwgMHg2MCwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQSwgMHg4QSwgMHgwMCwKKwkgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyNywgMHgzNSwgMHgwMCwgMHgyQSwgMHhGMiwgMHgwMCwgMHg2MCwgMHg3QywgMHg2MiwKKwkgMHg2MCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgyNywgMHgwMCwgMHhBMiwgMHhEMywgMHgwMCwgMHg2MSwgMHg2MCwgMHhGRSwgMHhBMCwgMHhEMywgMHhERSwgMHg4MiwKKwkgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHg2NCwgMHg1RiwgMHhEQywgMHg4NCwgMHhGMSwgMHg4MSwgMHhDMCwgMHgyQiwgMHgwNCwgMHgwMCwKKwkgMHg4MCwgMHgyQSwgMHgwMiwgMHgwMCwgMHg3RiwgMHhBNCwgMHhEQywgMHg4NCwgMHhGRiwgMHgzQiwgMHgwMywgMHgwMCwgMHg2MCwgMHg0NywgMHhEQywgMHg4NywKKwkgMHgwMSwgMHg2MSwgMHhDMCwgMHg4MCwgMHgwMCwgMHgzNiwgMHhEQywgMHg4NCwgMHg0RSwgMHhEQiwgMHg2MCwgMHhGRSwgMHhEQSwgMHg4MiwgMHhBMiwgMHhEMSwKKwkgMHhGRiwgMHhGRiwgMHhDMSwgMHg4NCwgMHhGMCwgMHgyMiwgMHgxMCwgMHhBNCwgMHhGMCwgMHgyQSwgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHgwMCwgMHg2MCwgMHg3QywgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhBMCwgMHhEMywgMHg1QSwgMHhEMSwKKwkgMHgzQSwgMHhGQSwgMHgzQiwgMHhGOCwgMHg3NCwgMHg2MiwgMHhBMiwgMHhEMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NCwgMHhFMCwgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHg2NCwgMHg0NywgMHhFMSwgMHg3RiwgMHg1QSwgMHhEMCwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFMiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgwMCwgMHg2MCwKKwkgMHg4MCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhBMCwgMHhEMSwgMHg1QSwgMHhEMSwgMHg2NCwgMHg0NSwgMHg2NCwgMHg0NCwgMHhFMywgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFNCwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFNSwgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHg2NCwgMHg0NywgMHhFNiwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFNywgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NSwgMHg0MCwKKwkgMHgwRCwgMHgzQSwgMHgxQywgMHgwMCwgMHg2NCwgMHg0NywgMHhFOCwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFOSwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFQSwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFQiwgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHg2NCwgMHg0NywgMHhFQywgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFRCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywKKwkgMHhFRSwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFRiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgwOCwgMHg2MCwgMHgwMCwgMHhFQSwKKwkgMHg2NSwgMHg0NCwgMHgwMiwgMHhBNCwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwKKwkgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQSwgMHgwMiwgMHg2NCwgMHgzQiwgMHhEQiwgMHhCRCwgMHg2MCwgMHhFQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwKKwkgMHhGQywgMHhGQiwgMHgwNywgMHhGMCwgMHgwMCwgMHg2NCwgMHhEMCwgMHg4MCwgMHg4OCwgMHhGMywgMHgxNywgMHgwMywgMHhEMCwgMHg4MCwgMHg2NiwgMHg0MSwKKwkgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHg2MSwgMHg0NiwgMHg2RCwgMHgwMywgMHg2MCwgMHg0MCwgMHgwMCwgMHgzNiwgMHg2QSwgMHgwMCwgMHg0NywgMHhGMSwKKwkgMHgwNywgMHhGMCwgMHg2NCwgMHg0MCwgMHgwMiwgMHgyNiwgMHgwMSwgMHgwMCwgMHgwQiwgMHgwMCwgMHgwMywgMHgxMiwgMHhCQiwgMHg2MCwgMHg0RSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhGQywgMHgwQSwgMHhCQywgMHg2MCwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCQywgMHg2MCwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgzRSwgMHhGMiwgMHg2MCwgMHg0NSwgMHg2MCwgMHg0NywgMHgwNywgMHhCMCwgMHgwMCwgMHgzQSwgMHgwMSwgMHgwMCwgMHhBNiwgMHgwMCwgMHg2NSwgMHg0NCwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHg0RSwgMHgwMCwgMHgwMiwgMHgzNiwgMHg0RiwgMHgwMCwgMHgwMywgMHgzNiwgMHgyRCwgMHgwMCwgMHgwNCwgMHgzNiwKKwkgMHgzRSwgMHgwMCwgMHg1MiwgMHgwMCwgMHgwMCwgMHg2NCwgMHg0QywgMHhGQiwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHgwNSwgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgwMCwgMHg2NSwgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwKKwkgMHg4QywgMHhGQSwgMHgwMCwgMHhBOCwgMHg2RiwgMHhGMiwgMHgxNSwgMHgwMywgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHgwMCwgMHhCQiwKKwkgMHhGRiwgMHhBMCwgMHgwNywgMHgwMywgMHgwRSwgMHgwNiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwKKwkgMHgwOCwgMHgwMCwgMHhCOSwgMHg4MSwgMHhFOCwgMHg4NCwgMHhEOSwgMHg4MSwgMHhGRCwgMHgwNCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywKKwkgMHgwRSwgMHhGQSwgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwgMHgxRCwgMHgwMCwgMHg0QywgMHhGMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHg0QywgMHhGQiwKKwkgMHhBQiwgMHhGMywgMHg2MCwgMHg0NSwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxNCwgMHgwMiwgMHgxQywgMHg2MCwgMHgwQywgMHg2MiwgMHgwRiwgMHg2MCwKKwkgMHg5NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHhDMywgMHgwMSwgMHg0QywgMHhGMywKKwkgMHg2NiwgMHg0MSwgMHhEQywgMHg4NCwgMHg0QywgMHhGQiwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMywgMHg3RSwgMHg2RiwgMHhGQSwKKwkgMHg2MSwgMHg0NiwgMHhCQywgMHg2MCwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwgMHhGNSwgMHgwMSwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHg4QywgMHhGQSwKKwkgMHg2MCwgMHg0NywgMHg3MCwgMHhGMiwgMHhGRiwgMHhCNSwgMHgwOCwgMHgxOCwgMHhFNCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwKKwkgMHhGQiwgMHgwNCwgMHgwMSwgMHg2NCwgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwQywgMHhGNCwgMHgwMCwgMHhBOCwgMHhGRiwgMHhGRiwgMHhFNCwgMHgwMiwKKwkgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHg3MCwgMHhGMiwgMHhGRiwgMHhCNSwgMHg2MSwgMHg0NiwKKwkgMHgwMCwgMHhBOCwgMHhGRiwgMHhGRiwgMHgyOSwgMHgwMywgMHhFMCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHg2NiwgMHg0MSwKKwkgMHg2NCwgMHg0NiwgMHg3MCwgMHhGQSwgMHg2MSwgMHg0NiwgMHgwMSwgMHg2NSwgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwKKwkgMHg4QywgMHhGQSwgMHgwMCwgMHhBOCwgMHg2RiwgMHhGMiwgMHgxNSwgMHgwMywgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHgwMCwgMHhCQiwKKwkgMHhGRiwgMHhBMCwgMHgwNywgMHgwMywgMHgwRSwgMHgwNiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwKKwkgMHgwOCwgMHgwMCwgMHhCOSwgMHg4MSwgMHhFOCwgMHg4NCwgMHhEOSwgMHg4MSwgMHhGRCwgMHgwNCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywKKwkgMHgwRSwgMHhGQSwgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwgMHhBMywgMHgwMSwgMHhBMiwgMHgwMSwgMHg2NSwgMHg0NCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwKKwkgMHhBOCwgMHgwMSwgMHgwMiwgMHgzNiwgMHgwMSwgMHgwMCwgMHhBNSwgMHgwMSwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgwMCwgMHg2NSwgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwKKwkgMHg4QywgMHhGQSwgMHgwMCwgMHhBOCwgMHg2RiwgMHhGMiwgMHgxNSwgMHgwMywgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHgwMCwgMHhCQiwKKwkgMHhGRiwgMHhBMCwgMHgwNywgMHgwMywgMHgwRSwgMHgwNiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwKKwkgMHgwOCwgMHgwMCwgMHhCOSwgMHg4MSwgMHhFOCwgMHg4NCwgMHhEOSwgMHg4MSwgMHhGRCwgMHgwNCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywKKwkgMHgwRSwgMHhGQSwgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwgMHhCQywgMHg2MCwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzRSwgMHhGMiwgMHg2MCwgMHg0NSwKKwkgMHg2MCwgMHg0NywgMHgwNywgMHhCMCwgMHgwMCwgMHgzQSwgMHgwMSwgMHgwMCwgMHhBMywgMHgwMCwgMHg2NSwgMHg0NCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwKKwkgMHgwQiwgMHgwMCwgMHgwMiwgMHgzNiwgMHgxNCwgMHgwMCwgMHgwMywgMHgzNiwgMHg0NywgMHgwMCwgMHgwNCwgMHgzNiwgMHg1RSwgMHgwMCwgMHgwNSwgMHgzNiwKKwkgMHgwRSwgMHgwMCwgMHhCQywgMHg2MCwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHhGMCwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHgwMiwgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwgMHhCQywgMHg2MCwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHhGMCwKKwkgMHgwMSwgMHg2NSwgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwgMHg4QywgMHhGQSwgMHgwMCwgMHhBOCwgMHg2RiwgMHhGMiwKKwkgMHgxNSwgMHgwMywgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHgwMCwgMHhCQiwgMHhGRiwgMHhBMCwgMHgwNywgMHgwMywgMHgwRSwgMHgwNiwKKwkgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwgMHgwOCwgMHgwMCwgMHhCOSwgMHg4MSwgMHhFOCwgMHg4NCwKKwkgMHhEOSwgMHg4MSwgMHhGRCwgMHgwNCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwKKwkgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHgwMCwgMHg2MywgMHgwMywgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwgMHg0QywgMHhGRCwKKwkgMHgxQywgMHg2MCwgMHgwQywgMHg2MiwgMHgwRiwgMHg2MCwgMHg5NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHhCQywgMHg2MCwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwgMHg0QywgMHhGMywKKwkgMHgwMiwgMHhCMCwgMHg2MSwgMHg0NiwgMHhDQywgMHg4NCwgMHgwNSwgMHgwMywgMHgwNCwgMHgyOCwgMHg0QywgMHhGQiwgMHhCQywgMHg2MCwgMHg0OCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHgyOCwgMHg0QywgMHhGQiwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwNCwgMHg3RSwKKwkgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwgMHhCQywgMHg2MCwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHg2MSwgMHg0NiwgMHhGRiwgMHhBMCwgMHhGRiwgMHhGRiwgMHgyRiwgMHgwNiwKKwkgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwgMHgyOSwgMHgwMCwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGQSwKKwkgMHgwMSwgMHg2NSwgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwgMHg4QywgMHhGQSwgMHgwMCwgMHhBOCwgMHg2RiwgMHhGMiwKKwkgMHgxNSwgMHgwMywgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHgwMCwgMHhCQiwgMHhGRiwgMHhBMCwgMHgwNywgMHgwMywgMHgwRSwgMHgwNiwKKwkgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwgMHgwOCwgMHgwMCwgMHhCOSwgMHg4MSwgMHhFOCwgMHg4NCwKKwkgMHhEOSwgMHg4MSwgMHhGRCwgMHgwNCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwKKwkgMHg2RiwgMHhGMiwgMHgwMCwgMHg2MywgMHgwMywgMHg3RSwgMHg2RiwgMHhGQSwgMHgzQywgMHg0NiwgMHg0QywgMHhGRCwgMHg1MSwgMHgwMCwgMHg1MCwgMHgwMCwKKwkgMHg2NSwgMHg0NCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwMywgMHgwMCwgMHgwMiwgMHgzNiwgMHgxMiwgMHgwMCwgMHg0OSwgMHgwMCwgMHg2NiwgMHg0MSwKKwkgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwgMHg2MSwgMHg0NiwgMHgwMSwgMHhCMCwgMHhGRiwgMHhGRiwgMHg0MiwgMHgwMiwgMHgwNywgMHhGMCwgMHg2NiwgMHg0MSwKKwkgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMiwgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgzOSwgMHgwMCwgMHgzOCwgMHgwMCwKKwkgMHgwNywgMHhGMCwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMSwgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MCwgMHg0NywKKwkgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHg2MSwgMHg0NiwgMHhGRiwgMHhBMCwgMHhGRiwgMHhGRiwgMHhGMSwgMHgwNiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwgMHhFQiwgMHgwMSwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGQSwgMHg2MSwgMHg0NiwKKwkgMHgwMCwgMHg2NSwgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwgMHg4QywgMHhGQSwgMHgwMCwgMHhBOCwgMHg2RiwgMHhGMiwKKwkgMHgxNSwgMHgwMywgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHgwMCwgMHhCQiwgMHhGRiwgMHhBMCwgMHgwNywgMHgwMywgMHgwRSwgMHgwNiwKKwkgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwgMHgwOCwgMHgwMCwgMHhCOSwgMHg4MSwgMHhFOCwgMHg4NCwKKwkgMHhEOSwgMHg4MSwgMHhGRCwgMHgwNCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwKKwkgMHgwMywgMHg2NCwgMHgzQiwgMHhEQiwgMHhDQSwgMHhGRSwgMHg0NywgMHhGMSwgMHgwMSwgMHg2NSwgMHgzMiwgMHg0MCwgMHgwNCwgMHgyNywgMHgwOCwgMHgwMCwKKwkgMHgyQywgMHhGMiwgMHg2NCwgMHg0NSwgMHgwMiwgMHgyMiwgMHgwNCwgMHgwMCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwMSwgMHgwMCwgMHhFQywgMHgwMCwKKwkgMHgxNCwgMHhGMiwgMHg2NSwgMHg0MCwgMHgwMSwgMHgyNiwgMHgxRCwgMHgwMCwgMHg2MCwgMHg0NSwgMHgwNSwgMHg2NCwgMHgzQiwgMHhEQiwgMHg2NSwgMHg0NCwKKwkgMHhDQywgMHg4NSwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhERSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwKKwkgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwKKwkgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwKKwkgMHhBRiwgMHgwMCwgMHg2MCwgMHg0MSwgMHgyQSwgMHhGMCwgMHgwMCwgMHg2MCwgMHgwQywgMHg2NCwgMHhBMCwgMHg4NCwgMHgwNCwgMHgzNiwgMHgwMiwgMHgwMCwKKwkgMHgwQywgMHgzQSwgMHgwMSwgMHgwMCwgMHhBNSwgMHgwMCwgMHg2MSwgMHg0NSwgMHg2MCwgMHg0MSwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhERSwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwKKwkgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHg2MSwgMHg0MCwgMHgwOCwgMHgzNiwgMHgwMSwgMHgwMCwgMHg4OCwgMHgwMCwKKwkgMHgxNCwgMHhGMiwgMHgxQywgMHg2NSwgMHg2MCwgMHg0MSwgMHgwMCwgMHg2MywgMHhDRCwgMHg4MSwgMHhDNywgMHg4MywgMHhGRCwgMHgwMiwgMHgzRiwgMHhGMCwKKwkgMHgyQywgMHhGMiwgMHhDMywgMHg4MywgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgyOSwgMHgwMCwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhEQywgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwKKwkgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwKKwkgMHhFMiwgMHg2NCwgMHhBMCwgMHhEMywgMHg2MywgMHg0NSwgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwgMHhEQywgMHg4MCwKKwkgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwgMHhCOCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHg1MiwgMHgwMCwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwKKwkgMHhEQSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwKKwkgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHg5OCwgMHhGMSwKKwkgMHgxRSwgMHg2MCwgMHhFMCwgMHg2NCwgMHhBMCwgMHhEMywgMHg2MywgMHg0NSwgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwKKwkgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwKKwkgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgxNSwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHgwRiwgMHhCNCwgMHgwMCwgMHhBOCwgMHgwMSwgMHhBOCwgMHgyNCwgMHgwMywgMHgxMiwgMHgwMywgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhFOCwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwKKwkgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgxMSwgMHgwMCwgMHg5OCwgMHhGMSwKKwkgMHgxRSwgMHg2MCwgMHhFNiwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywKKwkgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwKKwkgMHgwNCwgMHg2NCwgMHgzQiwgMHhEQiwgMHgwNywgMHhGMCwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgwNiwgMHhGMCwgMHhGRiwgMHg2MCwgMHg1RiwgMHg2NCwKKwkgMHhBMCwgMHg4NCwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgxQiwgMHg2MCwgMHhENCwgMHg2MiwgMHgxQiwgMHg2MCwgMHhBQywgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgzQywgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHg1QywgMHg1QywgMHhGQywgMHhGQywKKwkgMHhDRSwgMHhGRSwgMHhCNSwgMHg2MCwgMHhFQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwgMHg2NCwgMHg2MiwgMHhBMiwgMHhEMywgMHgwNywgMHhGNCwKKwkgMHgwNiwgMHhGMiwgMHgwMiwgMHhBOCwgMHgzQywgMHg0NiwgMHgxMCwgMHgwMywgMHgxMCwgMHhCMCwgMHgyQSwgMHhGMiwgMHgwRCwgMHgwMywgMHgwRSwgMHhGMiwKKwkgMHgwQywgMHhCMCwgMHg2MCwgMHg0MCwgMHhGMCwgMHgzNywgMHgyMCwgMHhCQywgMHgwMiwgMHgwMywgMHhGRSwgMHg3RiwgMHgwRSwgMHhGQSwgMHgyMywgMHhGMCwKKwkgMHgxMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHhDQywgMHgwMSwgMHgwRiwgMHhGMCwgMHgxNSwgMHhGMiwgMHg2NCwgMHg0MSwgMHgwMSwgMHgyQSwKKwkgMHgwMiwgMHgwMCwgMHhCMSwgMHhGMSwgMHgwOSwgMHgwMCwgMHgwMywgMHg2NSwgMHgwNywgMHhGMCwgMHg2NiwgMHg0MywgMHg2NCwgMHg0NiwgMHgwNiwgMHhGMCwKKwkgMHg2MywgMHg0NiwgMHhCMCwgMHhGMSwgMHg2NCwgMHg0MCwgMHgxMCwgMHgyQSwgMHg2NCwgMHg0NSwgMHhEQywgMHg4NCwgMHhENCwgMHg4MCwgMHgxNSwgMHhGQSwKKwkgMHgzQiwgMHgwNywgMHg2MSwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwOSwgMHgwMCwgMHgxRiwgMHg2MCwgMHgwRSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHgwOCwgMHgwMCwgMHgxRiwgMHg2MCwgMHgxMCwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHgyQSwgMHhGMCwgMHgwOCwgMHg2NywgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQSwgMHgwOCwgMHhGMCwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2NCwgMHhEMCwgMHg4MCwgMHgwNywgMHhGMiwgMHg0NiwgMHg0MywgMHg4OCwgMHhGMSwKKwkgMHgwNiwgMHgwMywgMHg2MCwgMHg0NiwgMHg4NiwgMHhGNCwgMHhEMCwgMHg4MCwgMHg4MCwgMHhCQiwgMHgwMSwgMHgwMywgMHgwNiwgMHhGQywgMHgyMywgMHg0NiwKKwkgMHgzRSwgMHhGMiwgMHgwMCwgMHg2MywgMHgwMSwgMHhCMCwgMHg0MywgMHg1QywgMHhGQywgMHhGQywgMHgwQiwgMHgwMywgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwKKwkgMHgxQiwgMHg2MCwgMHhBNiwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHhCNSwgMHg2MCwgMHhFQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHg0OSwgMHhGQiwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwKKwkgMHhFOCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwKKwkgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHg5OCwgMHhGMSwKKwkgMHgxRSwgMHg2MCwgMHhFQSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywKKwkgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwKKwkgMHgyMSwgMHg2MCwgMHg5OCwgMHg2MywgMHhBMywgMHhEMywgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhFMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRCwgMHhGMiwKKwkgMHg2MCwgMHg1QywgMHg2NCwgMHg1RiwgMHgwRCwgMHhGQSwgMHgyMywgMHhGMCwgMHgwMSwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHgwNywgMHhGMCwKKwkgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgwNiwgMHhGMiwgMHg3RiwgMHg2NSwgMHhBNCwgMHg5RSwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHg0MCwgMHgwMSwKKwkgMHhCRSwgMHg2MCwgMHg3MCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMSwgMHg2NCwgMHgzQiwgMHhEQiwgMHgzMSwgMHhGMywgMHgwMSwgMHg2MywgMHhDNCwgMHhCNCwKKwkgMHgzMSwgMHhGQiwgMHgzMiwgMHhGRCwgMHhCRSwgMHg2MCwgMHgxQywgMHg2MiwgMHg0MiwgMHg0MCwgMHhBMCwgMHg0QywgMHg0MCwgMHhCQywgMHg3RCwgMHhCNCwKKwkgMHhBMCwgMHg1MSwgMHhBMCwgMHhGRSwgMHgxQSwgMHhGRiwgMHgxQiwgMHg2MCwgMHhBMCwgMHg2NCwgMHgwOCwgMHhGMCwgMHgwNywgMHhGMCwgMHhEMCwgMHg4MCwKKwkgMHgxQiwgMHg2MCwgMHhBNiwgMHg2MiwgMHgxNCwgMHgwMiwgMHhBMiwgMHhEMywgMHgwMSwgMHg2MywgMHhBQywgMHg4NiwgMHgwNywgMHhGMiwgMHgwRiwgMHgwMywKKwkgMHhEMCwgMHg4MCwgMHgwOSwgMHhGMiwgMHhGQSwgMHgwMiwgMHgyMywgMHhGQywgMHgxQiwgMHg2MCwgMHhENCwgMHg2MiwgMHgxQiwgMHg2MCwgMHhBQywgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgzQywgMHg0NiwKKwkgMHgwNiwgMHg2NCwgMHhBMSwgMHhGRiwgMHg0OSwgMHhGQiwgMHg4MywgMHgzRSwgMHgzMSwgMHhGMywgMHg4NywgMHg2MCwgMHg4MCwgMHg2MSwgMHgxRCwgMHhGMCwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgxNSwgMHgwMCwgMHhGRSwgMHhCNCwgMHgzMSwgMHhGQiwgMHgwMCwgMHg2NCwgMHg0OSwgMHhGQiwgMHgwMSwgMHg2NCwKKwkgMHg0NywgMHhGQiwgMHgyMSwgMHg2MCwgMHg5OCwgMHg2MywgMHhBMywgMHhEMywgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhFMywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg3MSwgMHg2NCwgMHg1RiwgMHgwRCwgMHhGQSwgMHg0MCwgMHg2NCwgMHgzQiwgMHhEQiwgMHhCRSwgMHg2MCwgMHg3MCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHgyQSwgMHgxQiwgMHgwMCwgMHhEMSwgMHg5MSwgMHg4RCwgMHhFMiwgMHg0MSwgMHg2NCwgMHgzQiwgMHhEQiwgMHgzMSwgMHhGMywgMHgyMSwgMHg2MCwKKwkgMHhBMCwgMHg2MywgMHhGRCwgMHhCNCwgMHgzMSwgMHhGQiwgMHhBMywgMHhEMywgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhFMywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHg2MywgMHg2MCwgMHg1QywgMHgwRCwgMHhGMiwgMHg0NywgMHhGRCwgMHhGRiwgMHhCNSwgMHg2MCwgMHg0NywgMHhEMCwgMHg4MCwgMHhEQywgMHg4NCwKKwkgMHgxRiwgMHgwMywgMHg2MCwgMHg0NywgMHhCNCwgMHg4NCwgMHgwRCwgMHhGQSwgMHgxQiwgMHgwMCwgMHgwOCwgMHgyQSwgMHgwNywgMHgwMCwgMHg0MiwgMHg2NCwKKwkgMHgzQiwgMHhEQiwgMHgzMSwgMHhGMywgMHhGRiwgMHhGRiwgMHhGNywgMHhCNCwgMHgzMSwgMHhGQiwgMHgxMiwgMHgwMCwgMHgxMCwgMHgyQSwgMHgwOSwgMHgwMCwKKwkgMHg0MywgMHg2NCwgMHgzQiwgMHhEQiwgMHgzMSwgMHhGMywgMHhGRiwgMHhGRiwgMHhFRiwgMHhCNCwgMHgzMSwgMHhGQiwgMHhCRCwgMHg2MCwgMHhFQiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg0NCwgMHg2NCwgMHgzQiwgMHhEQiwgMHgzMSwgMHhGMywgMHhGRiwgMHhGRiwgMHhERiwgMHhCNCwgMHgzMSwgMHhGQiwgMHgwMCwgMHgwMCwKKwkgMHgyQSwgMHg2NCwgMHgzQiwgMHhEQiwgMHhCNSwgMHg2MCwgMHhBMiwgMHg2NCwgMHg0MCwgMHg0MCwgMHhCQSwgMHg2MCwgMHg0RiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxMiwgMHg2MCwgMHhDQywgMHg2MywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCNSwgMHgwNCwgMHhCNSwgMHgwNCwgMHgwMywgMHgwMywgMHgwMywKKwkgMHhCRSwgMHg2MCwgMHhGNywgMHg3OCwgMHhGRiwgMHhGRiwgMHhFQiwgMHg2MCwgMHg1OCwgMHg0RSwgMHgyNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMSwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgyOSwgMHgwMCwgMHg5RCwgMHhGRSwgMHgyNywgMHgwNCwgMHgyNiwgMHgwQSwgMHg5RiwgMHhGRSwgMHgyNCwgMHgwNSwgMHg4NSwgMHhGRiwKKwkgMHgyMCwgMHg0NCwgMHg4NCwgMHhGRiwgMHg0MCwgMHgyNiwgMHgxRiwgMHgwMCwgMHgzRiwgMHg0MCwgMHgyMCwgMHgyQiwgMHgxQywgMHgwMCwgMHgzOCwgMHg2OSwKKwkgMHhGRiwgMHhGRiwgMHg2OCwgMHg0NCwgMHgwMSwgMHgxNiwgMHhGRCwgMHgwMSwgMHgwMSwgMHgyQSwgMHgxNSwgMHgwMCwgMHgxRiwgMHg2MCwgMHgxQSwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHg2NSwgMHhGMSwgMHgwMiwgMHg2MCwKKwkgMHhFRSwgMHg2NCwgMHg4MiwgMHhGQiwgMHhGRiwgMHhGRiwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHg4MywgMHhGQiwgMHgwNCwgMHg2NCwKKwkgMHg4NCwgMHhGQiwgMHhERiwgMHhGRSwgMHgxOSwgMHhGRiwgMHgxMCwgMHg2NCwgMHgzQiwgMHhEQiwgMHg2NiwgMHhGMywgMHg3MywgMHg0NSwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg5MywgMHg3NSwgMHhGMSwgMHhDOSwgMHhGRSwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgzRCwgMHgwMCwKKwkgMHg0OSwgMHhGMywgMHgzQywgMHg0NiwgMHgzMywgMHgxOCwgMHhDQywgMHg4NCwgMHg0OSwgMHhGQiwgMHgzMCwgMHgwMiwgMHhCRiwgMHg2MCwgMHhBRCwgMHg2NCwKKwkgMHg0MCwgMHg0MiwgMHhGQywgMHhGQywgMHgwMCwgMHg2NCwgMHg1QywgMHg1QywgMHgzMiwgMHhGQiwgMHg4MiwgMHhGRiwgMHg1QywgMHg0NywgMHg4NCwgMHhGRiwKKwkgMHg2MiwgMHhGRiwgMHgxRiwgMHg2MCwgMHgwQSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwKKwkgMHhBMiwgMHhEQiwgMHgyQSwgMHhGMiwgMHgwNywgMHhGMCwgMHgwQywgMHhCNCwgMHgwOCwgMHgzQSwgMHgwNywgMHgwMCwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwKKwkgMHgwNiwgMHhGMCwgMHhGRiwgMHg2MCwgMHhERiwgMHg2NCwgMHhBMCwgMHg4NCwgMHgwNiwgMHhGQSwgMHgyMywgMHhGMCwgMHgwMSwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQSwgMHgxQiwgMHg2MCwgMHhENCwgMHg2MiwgMHgxQiwgMHg2MCwgMHhBQywgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHhDRSwgMHhGRSwgMHgwNiwgMHgwMCwgMHg2NiwgMHhGMywKKwkgMHg3MywgMHg0NSwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg5MywgMHgxMiwgMHg2MCwgMHhDOCwgMHg2MywgMHhBMywgMHhEMywKKwkgMHhBRCwgMHg0OSwgMHgyMCwgMHhCNSwgMHgwOCwgMHhCMSwgMHgyMywgMHgwMywgMHhFMSwgMHg4MSwgMHgxMCwgMHhCNSwgMHg5NSwgMHg4MSwgMHg2MCwgMHg0MSwKKwkgMHgxOCwgMHgwMiwgMHgxMiwgMHg2MCwgMHhDQSwgMHg3QywgMHhBNCwgMHhEMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4NCwgMHhBNCwgMHhEQiwgMHgxNywgMHgwMiwKKwkgMHgwQSwgMHg2NCwgMHhBNCwgMHhEQiwgMHg2MSwgMHg0NCwgMHgwNywgMHhCNCwgMHhGRiwgMHhGRiwgMHgxMSwgMHgwMiwgMHgwOCwgMHhCMSwgMHhFMSwgMHg4MSwKKwkgMHg5NSwgMHg4MSwgMHhBMywgMHhEMywgMHgwQywgMHgwMywgMHgwOCwgMHhBQywgMHgwMSwgMHhCQywgMHhBMywgMHhEQiwgMHhGRiwgMHhGRiwgMHgxMywgMHhGRiwKKwkgMHgwNiwgMHgwMCwgMHgxMCwgMHhBQywgMHhBMywgMHhEQiwgMHgxMiwgMHg2MCwgMHhDQSwgMHg2MywgMHgwQSwgMHg3QywgMHhBMywgMHhEOSwgMHhCNSwgMHg2MCwKKwkgMHhBRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0NiwgMHhGMywgMHg0NSwgMHhGMSwgMHgwNSwgMHgxQiwgMHg2NCwgMHg0NCwgMHgwMywgMHgxQiwgMHgwRiwgMHg2MCwKKwkgMHg5MiwgMHg2MiwgMHhBMiwgMHhEMywgMHg0NSwgMHhGQiwgMHgwMCwgMHg2MywgMHg0NiwgMHhGRCwgMHg2MCwgMHg0MSwgMHgyNSwgMHg2NCwgMHgzQiwgMHhEQiwKKwkgMHgyNywgMHg0NCwgMHhFRiwgMHhCNCwgMHg0MCwgMHg0NywgMHgwMCwgMHhCOSwgMHg3MSwgMHg0MCwgMHg4MCwgMHgyNywgMHgwMSwgMHgxMiwgMHgxOSwgMHgwMywKKwkgMHhCRiwgMHg2MCwgMHg0RCwgMHg2MiwgMHg4NCwgMHhGRiwgMHg0MiwgMHg0MiwgMHg4MiwgMHhGRiwgMHhBMCwgMHg0QywgMHgxNCwgMHhCQywgMHhGRiwgMHhCNCwKKwkgMHhBMCwgMHg1MSwgMHgxRiwgMHgwQSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwgMHg3MCwgMHg0NCwgMHhBQywgMHg4MCwgMHgxOSwgMHgwQSwKKwkgMHg3MSwgMHg0MCwgMHg4MCwgMHgyNywgMHhGNywgMHgxMiwgMHg0NSwgMHhGMywgMHgyNywgMHgwMiwgMHgwMywgMHgxOCwgMHhDQywgMHg4NCwgMHg0NSwgMHhGQiwKKwkgMHhGMSwgMHgwMiwgMHgwNiwgMHgwQSwgMHhBMCwgMHg0QywgMHhGQiwgMHhCNCwgMHhBMCwgMHg1MSwgMHhBNywgMHg2MCwgMHhERiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg4NCwgMHhGRiwgMHhCRiwgMHg2MCwgMHgyQSwgMHg2NCwgMHg0MCwgMHg0MiwgMHg4MiwgMHhGRiwgMHhBMCwgMHg0QywgMHgxNCwgMHhCQywgMHhGRiwgMHhCNCwKKwkgMHhBMCwgMHg1MSwgMHhBRiwgMHg2MCwgMHgxOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzQywgMHg0NCwgMHhBQywgMHg4MCwgMHgzMiwgMHhGMSwgMHgxMiwgMHgwMywKKwkgMHg2NCwgMHg0MCwgMHgwNywgMHgyMiwgMHgwRiwgMHgwMCwgMHhBNywgMHg2MCwgMHhDMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMCwgMHg0QywgMHgxQywgMHhCQywKKwkgMHhERiwgMHhCNCwgMHhBMCwgMHg1MSwgMHhGMSwgMHgwMSwgMHgwNiwgMHgwMCwgMHgyOCwgMHg2NCwgMHgzQSwgMHhEQiwgMHhBMCwgMHg0QywgMHgzMCwgMHhCQywKKwkgMHhGMywgMHhCNCwgMHhBMCwgMHg1MSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwgMHgyOCwgMHg2NCwgMHgzQiwgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHg5NCwgMHg2MiwgMHhBMiwgMHhEMywgMHgzMiwgMHg0MCwgMHgwMiwgMHgyNywgMHgxNiwgMHgwMCwgMHg0NiwgMHhGQiwgMHgxNCwgMHgxOCwgMHhCRiwgMHg2MCwKKwkgMHg5QiwgMHg2NCwgMHg4NCwgMHhGRiwgMHg0MCwgMHg0MiwgMHg4MiwgMHhGRiwgMHhBMCwgMHg0QywgMHgxNCwgMHhCQywgMHhGNywgMHhCNCwgMHhBMCwgMHg1MSwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwgMHg3MCwgMHg0NCwgMHhBQywgMHg4MCwgMHg0NiwgMHhGMywgMHhDQSwgMHgwQSwgMHhEQywgMHgwMiwKKwkgMHhDQywgMHg4NCwgMHg0NiwgMHhGQiwgMHhGNSwgMHgwMiwgMHg4NCwgMHhGRiwgMHhCRiwgMHg2MCwgMHhBRCwgMHg2NCwgMHg0MCwgMHg0MiwgMHg4MiwgMHhGRiwKKwkgMHgyNywgMHg0NCwgMHgwOCwgMHhCQywgMHg0MCwgMHg0NywgMHhCQiwgMHhFMSwgMHgwNCwgMHgwMCwgMHgzQSwgMHhFMSwgMHgzMSwgMHg0MCwgMHgwMSwgMHgyNiwKKwkgMHhCQiwgMHhFMSwgMHhBNywgMHg2MCwgMHhCNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHhFMiwgMHgyRCwgMHhGMywgMHgyQywgMHhGMywgMHgwMCwgMHhCRCwKKwkgMHhDQywgMHg4NCwgMHgwOCwgMHgwMywgMHgyQywgMHhGQiwgMHgwNiwgMHgwMiwgMHg2NSwgMHg0NCwgMHgyQywgMHhGQiwgMHg4QSwgMHhGRiwgMHg4MCwgMHg2MCwKKwkgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHhEMiwgMHhGMywgMHgzMSwgMHg0MCwgMHgwMSwgMHgyQSwgMHg0NCwgMHgwMCwgMHg2MCwgMHg0MywgMHgwNCwgMHhCMCwKKwkgMHgwMiwgMHhCMCwgMHgwOCwgMHgyNCwgMHgxNiwgMHgwMiwgMHgyOSwgMHg0NCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHhDQywgMHg4MSwgMHgwRSwgMHgwMywKKwkgMHg0MSwgMHg0OSwgMHgzNywgMHgwMiwgMHg2MywgMHg0MCwgMHgwOCwgMHgyQSwgMHgwOSwgMHgwMCwgMHhGNywgMHhCMywgMHgyNSwgMHg2MCwgMHgxQywgMHg3QywKKwkgMHhBNCwgMHhEMSwgMHhBRCwgMHg0RiwgMHhGRCwgMHhCNCwgMHhBMCwgMHg1RCwgMHg0NCwgMHg0OSwgMHgyQiwgMHgwMCwgMHg2MywgMHg0MCwgMHgwMiwgMHgyQSwKKwkgMHgxNCwgMHgwMCwgMHgyNSwgMHg2MCwgMHgxRSwgMHg2NCwgMHhBMCwgMHhEMywgMHgyNSwgMHg2MCwgMHgxQSwgMHg3QywgMHhBNCwgMHhEQiwgMHg0MCwgMHg0OSwKKwkgMHgyNSwgMHg2MCwgMHgyMCwgMHg2NCwgMHhBMCwgMHhEMywgMHgyNSwgMHg2MCwgMHgxQywgMHg3QywgMHhBNCwgMHhEQiwgMHgwQywgMHhCQiwgMHhGRCwgMHhCMywKKwkgMHhBRCwgMHg0RiwgMHgwMiwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1RCwgMHgxNCwgMHgwMCwgMHgyNSwgMHg2MCwgMHgyMiwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHgyNSwgMHg2MCwgMHgxQSwgMHg3QywgMHgwRSwgMHgxOCwgMHhBNCwgMHhEQiwgMHg0MCwgMHg0OSwgMHgyNSwgMHg2MCwgMHgyNCwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHgyNSwgMHg2MCwgMHgxQywgMHg3QywgMHhBNCwgMHhEQiwgMHgwOCwgMHhCQiwgMHhGQiwgMHhCMywgMHhBRCwgMHg0RiwgMHgwMiwgMHhCQywgMHgwMCwgMHg3RiwKKwkgMHhBMCwgMHg1RCwgMHhEMiwgMHhGRCwgMHgwMSwgMHg2MCwgMHgwQywgMHg2MSwgMHhBMSwgMHhEMywgMHg2MSwgMHg0MywgMHgxNywgMHgxOCwgMHg1OCwgMHhEMywKKwkgMHg2MiwgMHg0MSwgMHgwMywgMHgxOCwgMHhDQywgMHg4NCwgMHhBMSwgMHhEQiwgMHgxMSwgMHgwMCwgMHg0OSwgMHhEMywgMHhBMywgMHhEQiwgMHgwNiwgMHhBMSwKKwkgMHhBMSwgMHhEMywgMHg1OSwgMHhEMSwgMHg2MCwgMHg0NSwgMHhBNSwgMHhEMywgMHg1OSwgMHhEMSwgMHhCMCwgMHg4NCwgMHhBNSwgMHhEQiwgMHg2NCwgMHg0NCwKKwkgMHgwNiwgMHgzNiwgMHhDRCwgMHhGRSwgMHgwNywgMHgzNiwgMHhENiwgMHhGRSwgMHhFNSwgMHgwMSwgMHgyMywgMHg0NiwgMHhCNSwgMHg2MCwgMHhBRiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg0NiwgMHg0MywgMHgxQywgMHg2MCwgMHgwQSwgMHg2MSwgMHhBMSwgMHhEMywgMHg1OSwgMHhEMSwgMHgwNiwgMHgxQiwgMHg1OSwgMHhEMywKKwkgMHg1OSwgMHhEMSwgMHgwMywgMHgxQiwgMHg1OSwgMHhEMywgMHg1OSwgMHhEMSwgMHhGMCwgMHgxOCwgMHgwMCwgMHg2MywgMHg0OSwgMHhERCwgMHg2MCwgMHg0MCwKKwkgMHgwMiwgMHgzNiwgMHgxMSwgMHgwMCwgMHgwMywgMHgzNiwgMHgzMiwgMHgwMCwgMHgwMSwgMHgzNiwgMHgwOCwgMHgwMCwgMHgwNSwgMHgzQSwgMHhFQSwgMHgwMSwKKwkgMHhBNCwgMHhEMywgMHg1QSwgMHhEMywgMHg5QywgMHg4NSwgMHhBNCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhFNCwgMHgwMSwgMHgwMSwgMHg2MCwgMHgwQywgMHg2MSwKKwkgMHgwMCwgMHg2NCwgMHhBMSwgMHhEQiwgMHhERiwgMHgwMSwgMHhDMCwgMHg2MCwgMHg0RiwgMHg2NCwgMHg0MCwgMHg0NSwgMHgyMiwgMHgwMCwgMHgwMSwgMHg2MCwKKwkgMHgwQywgMHg2NiwgMHhBNiwgMHhEMywgMHgwNCwgMHhBMSwgMHg2MCwgMHg0MywgMHhBMSwgMHhEMywgMHhDOSwgMHg4MSwgMHg2MCwgMHg0NSwgMHgwMCwgMHhCQiwKKwkgMHhBMSwgMHhEQiwgMHhCRSwgMHhEMywgMHgwOSwgMHgwMywgMHhENCwgMHg4NCwgMHg5QywgMHg4NCwgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwRSwKKwkgMHhBMywgMHhEMSwgMHg2MywgMHg0NiwgMHg2NCwgMHg0MywgMHhGMiwgMHgwMSwgMHg5QywgMHg4NCwgMHhEQywgMHg4NSwgMHg0OSwgMHhERCwgMHg2MSwgMHg0NCwKKwkgMHgwMCwgMHhCQiwgMHhBNiwgMHhEQiwgMHgwMiwgMHgwMywgMHg2NSwgMHg0NCwgMHhCRSwgMHhEQiwgMHhCQywgMHgwMSwgMHhDMCwgMHg2MCwgMHgyQSwgMHg2NCwKKwkgMHg0MCwgMHg0NSwgMHgwMSwgMHg2MCwgMHgwQywgMHg2NiwgMHhBNiwgMHhEMywgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHgwRiwgMHgxOCwgMHgwMiwgMHgwMywKKwkgMHg2MCwgMHg0NiwgMHhGOSwgMHgwMSwgMHg1OCwgMHhEMywgMHhBNCwgMHhEMywgMHg2MCwgMHg0NSwgMHgwMCwgMHg2MywgMHhBNCwgMHhERCwgMHgwNSwgMHgxOCwKKwkgMHg1OCwgMHhEMywgMHhGRiwgMHhGRiwgMHhDNCwgMHg4MywgMHhBMiwgMHhERCwgMHhDQSwgMHg4NCwgMHhBNiwgMHhEQiwgMHgyNSwgMHg1OCwgMHg2NCwgMHg0MSwKKwkgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwNiwgMHgwMiwgMHg0MCwgMHhGRiwgMHg0MiwgMHhGRiwgMHg0MywgMHhGRiwgMHg0NCwgMHhGRiwKKwkgMHg0NSwgMHhGRiwgMHhBMSwgMHhGRiwgMHg4OCwgMHhGRiwgMHg4NSwgMHhGRiwgMHgyMSwgMHhFMSwgMHg1QywgMHg0MCwgMHhDMCwgMHg2MCwgMHg5QSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg0MywgMHhGRiwgMHgzOSwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4NCwgMHgzRSwgMHhGQiwgMHgwMSwgMHhBMCwgMHg0QywKKwkgMHgzRCwgMHg0NiwgMHgyQSwgMHhGMiwgMHg0NiwgMHg0RCwgMHgxMCwgMHgyNSwgMHgwRSwgMHgwMCwgMHgwOSwgMHhFMSwgMHhBMSwgMHhGRiwgMHg2NiwgMHg0MCwKKwkgMHgwRiwgMHhGMiwgMHgwMSwgMHgyOSwgMHgwMiwgMHgwMCwgMHg0MCwgMHhGRiwgMHgwQSwgMHhCQywgMHhBMiwgMHhEQSwgMHgwOCwgMHgyNSwgMHhFOSwgMHgwMSwKKwkgMHhDQiwgMHhGRSwgMHg1QywgMHg1RCwgMHhFNywgMHgwMSwgMHg0NCwgMHhGRiwgMHgwMywgMHgyQiwgMHgyMSwgMHgwMCwgMHg4OSwgMHhGMywgMHgwNiwgMHg2MSwKKwkgMHg2MCwgMHg0MywgMHg2NiwgMHg0NSwgMHgzMSwgMHhGMCwgMHg2MywgMHg0NiwgMHgwNSwgMHhGMiwgMHg2NSwgMHg0NiwgMHhEMCwgMHg4MCwgMHgzMCwgMHhGMCwKKwkgMHgwRiwgMHgwMiwgMHg2MywgMHg0NiwgMHgwNCwgMHhGMiwgMHg2NSwgMHg0NiwgMHhEMCwgMHg4MCwgMHgyRiwgMHhGMCwgMHgwOSwgMHgwMiwgMHg2MywgMHg0NiwKKwkgMHgwMywgMHhGMiwgMHg2NSwgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwgMHhGRiwgMHhGRiwgMHg0OCwgMHhGRSwgMHgwNiwgMHgwMCwKKwkgMHhDRCwgMHg4MSwgMHgwMiwgMHhBMywgMHhFNywgMHgwMiwgMHg4OCwgMHhGMSwgMHgwOCwgMHhGRSwgMHg2NCwgMHg0MywgMHgyNiwgMHgwMywgMHgzMSwgMHhGMiwKKwkgMHgxMiwgMHg2MCwgMHhDRSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwKKwkgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgzMSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwKKwkgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgzMCwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwKKwkgMHgyRiwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwKKwkgMHhFOCwgMHgxQiwgMHg4OCwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHgwNywgMHhGQywgMHgzRiwgMHhGMiwgMHgwOSwgMHg2MCwKKwkgMHhCMCwgMHg2NSwgMHhENCwgMHg4MCwgMHgyQSwgMHhGMiwgMHhBMSwgMHgwNSwgMHgwOCwgMHgyNSwgMHg5MywgMHgwMSwgMHgwMCwgMHg2NCwgMHgwRCwgMHg2MCwKKwkgMHgyQywgMHg2MSwgMHg0MCwgMHg0QiwgMHhBMSwgMHhEQiwgMHgyRCwgMHg0NiwgMHgzQiwgMHhGMiwgMHg4OCwgMHhGMSwgMHg4NywgMHhGNCwgMHg2MCwgMHg0MCwKKwkgMHgyMCwgMHgyQiwgMHgxMiwgMHgwMCwgMHhEMywgMHg4MCwgMHgyQywgMHhGMCwgMHg5MCwgMHgwMywgMHgwNywgMHhGNCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNiwKKwkgMHg4OCwgMHhGNSwgMHhCNiwgMHhGNCwgMHgyRCwgMHg0NiwgMHgwNCwgMHg2NCwgMHgwNCwgMHhCMywgMHgyMiwgMHhGQSwgMHgwNCwgMHgwMywgMHhDMiwgMHg2MCwKKwkgMHgxMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMCwgMHhFMCwgMHgwMCwgMHg3NCwgMHg2MiwgMHhBMiwgMHhEMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NCwKKwkgMHhFMCwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFMSwgMHg3RiwgMHg1QSwgMHhEMCwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFMiwgMHg3RiwKKwkgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHg3QywgMHg1RiwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NSwgMHgwQywgMHg2MCwgMHgzQSwgMHg2NCwgMHg0NCwgMHhEMywKKwkgMHg1QSwgMHhEMSwgMHgwMywgMHgxQiwgMHhDMiwgMHg2MCwgMHgwNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwgMHg2NCwgMHg0NCwgMHhFMywgMHg3RiwKKwkgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFNCwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFNSwgMHg3RiwgMHhBMCwgMHg1QiwKKwkgMHg2NCwgMHg0NywgMHhFNiwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFNywgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NSwgMHg0MCwKKwkgMHgwRCwgMHgzQSwgMHgxQywgMHgwMCwgMHg2NCwgMHg0NywgMHhFOCwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFOSwgMHg3RiwKKwkgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFQSwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFQiwgMHg3RiwgMHhBMCwgMHg1QiwKKwkgMHg2NCwgMHg0NywgMHhFQywgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFRCwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywKKwkgMHhFRSwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFRiwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NSwgMHg0NCwgMHhEOCwgMHg4NCwKKwkgMHgwOCwgMHgyNSwgMHg3OCwgMHgwMCwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QiwgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQiwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQiwKKwkgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQiwgMHgzRiwgMHhGMiwgMHgwNCwgMHg2NSwgMHhDNCwgMHg4MywgMHgwQSwgMHhFMSwgMHhCMywgMHhGRiwgMHg5QSwgMHhGRiwKKwkgMHhDQiwgMHg4MywgMHgwMCwgMHhGNCwgMHgxMCwgMHg2MiwgMHg2QywgMHg2MSwgMHgwRSwgMHhBMywgMHhBQiwgMHg4NCwgMHhGMiwgMHhBMywgMHhBMSwgMHhGRiwKKwkgMHgwOCwgMHgwMCwgMHgwMCwgMHhGNCwgMHg4MSwgMHhGMiwgMHgwMiwgMHg2MiwgMHhDOSwgMHg4MSwgMHhBQiwgMHg4NCwgMHhBMSwgMHhGRiwgMHgwMSwgMHgwMCwKKwkgMHhBMiwgMHhEQywgMHg3QSwgMHhENCwgMHhGRCwgMHgxQywgMHhBMiwgMHhEQywgMHgwOCwgMHgyNSwgMHg1NCwgMHgwMCwgMHhGMiwgMHgxRCwgMHg3QywgMHhBOCwKKwkgMHhEOSwgMHg4MSwgMHhFRiwgMHgwMywgMHhGRiwgMHhCMSwgMHgwOSwgMHgxRSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MiwgMHg1QSwgMHhEMiwKKwkgMHg4OSwgMHhGRiwgMHg4MCwgMHg0RiwgMHg2RiwgMHg0NCwgMHhBMiwgMHhEQSwgMHg4OCwgMHhGRiwgMHg5OCwgMHhGRiwgMHgwOSwgMHhFMSwgMHhBMSwgMHhGRiwKKwkgMHgzRCwgMHg0NiwgMHgwOCwgMHgyNSwgMHgzRiwgMHgwMCwgMHg0MCwgMHhGRiwgMHgwRiwgMHhGMCwgMHgwQSwgMHg2NCwgMHhCMCwgMHg4NCwgMHgxOCwgMHgxNCwKKwkgMHhGNywgMHhCNCwgMHhBMiwgMHhEQSwgMHgwRCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwKKwkgMHgwQywgMHgwMCwgMHhEMSwgMHhGNSwgMHhEMCwgMHhGNCwgMHgwRCwgMHg2MCwgMHgyQywgMHg2MSwgMHg1OSwgMHhEMSwgMHgzNywgMHhGOCwgMHgwNSwgMHg2NCwKKwkgMHg1OSwgMHhEMSwgMHhDQywgMHg4NCwgMHhCRCwgMHhEOCwgMHhGQywgMHgwMiwgMHgyRCwgMHg0NiwgMHhDMCwgMHg2MCwgMHhCMCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhBMiwgMHhEQSwgMHgyRCwgMHg0NiwgMHgzQiwgMHhGMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgxOCwgMHgwMCwgMHhEMSwgMHhGNSwKKwkgMHhCNywgMHhGMCwgMHgyQSwgMHg0NCwgMHhBNCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgyRiwgMHgyNiwgMHgxMCwgMHgwMCwgMHgyRCwgMHg0NiwgMHg2NCwgMHg0NCwKKwkgMHgzQSwgMHhGMCwgMHhCQywgMHhGMCwgMHg2NCwgMHg1RiwgMHgzRCwgMHhGMCwgMHgwNywgMHhGNCwgMHhEMCwgMHhGNCwgMHhGRiwgMHhGRiwgMHgwOCwgMHhBMywKKwkgMHg1QiwgMHhEOCwgMHg2NSwgMHg1QywgMHg1QiwgMHhEOCwgMHg1QiwgMHhEQSwgMHgyRCwgMHg0NiwgMHgwMSwgMHgwMCwgMHgyRCwgMHg0NiwgMHhDMCwgMHg2MCwKKwkgMHhCMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg5OCwgMHhGRiwgMHg0MywgMHhGRiwgMHg0MCwgMHhGRiwgMHhCMCwgMHhGRiwgMHhCMSwgMHhGRiwgMHgyRCwgMHg0NiwKKwkgMHgwRCwgMHg2MCwgMHgyQywgMHg2MSwgMHhBMSwgMHhEMywgMHgyRCwgMHg0NiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwQSwgMHgwMCwgMHhEMSwgMHhGNSwKKwkgMHhEMCwgMHhGNCwgMHg1OSwgMHhEMSwgMHgzNywgMHhGOCwgMHgwNSwgMHg2NCwgMHg1OSwgMHhEMSwgMHhDQywgMHg4NCwgMHhCRCwgMHhEOCwgMHhGQywgMHgwMiwKKwkgMHgyRCwgMHg0NiwgMHhDMCwgMHg2MCwgMHg5QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg5OCwgMHhGRiwgMHgwOSwgMHhFMSwgMHhBMSwgMHhGRiwgMHgzRCwgMHg0NiwKKwkgMHgwOCwgMHgyNSwgMHhFMCwgMHgwMSwgMHgwRiwgMHhGMiwgMHg0MCwgMHhGRiwgMHgwMiwgMHhCQywgMHhBMiwgMHhEQSwgMHhDMCwgMHg2MCwgMHhCMCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHgwRCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEQiwgMHgwNCwgMHg2NCwgMHgyMiwgMHhGQSwgMHg4NywgMHhGNCwKKwkgMHg4OCwgMHhGMSwgMHhGRiwgMHhGRiwgMHhEMywgMHg4MCwgMHgzQiwgMHhGMiwgMHhFNywgMHgwMywgMHg2MCwgMHg0NywgMHhDMCwgMHhCNywgMHgwMiwgMHhGRSwKKwkgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwgMHgwMCwgMHhBOCwgMHg0MCwgMHg0QSwgMHgxNiwgMHgwMywgMHhFMCwgMHg4MSwgMHg2MSwgMHg0MywKKwkgMHg0MiwgMHhGRSwgMHgwMCwgMHg2NCwgMHhGMCwgMHg4NCwgMHhGRSwgMHgxRiwgMHg0MCwgMHg0QSwgMHhFMSwgMHg4NCwgMHhFMCwgMHg4NCwgMHgyRCwgMHg0NiwKKwkgMHgwNywgMHhGNCwgMHhFMCwgMHg4MSwgMHgzNywgMHhGMCwgMHgyQSwgMHg0NywgMHgwQywgMHg2MCwgMHg3QSwgMHg2MywgMHhBMCwgMHg4NCwgMHg0NywgMHg5QywKKwkgMHgxMCwgMHgwMywgMHg3QywgMHg0NCwgMHhBMCwgMHg2MywgMHgxMSwgMHgwMCwgMHgyMCwgMHg2NCwgMHg0MCwgMHg0QSwgMHg2MywgMHg0NiwgMHgzNywgMHhGMCwKKwkgMHg2NiwgMHg0NCwgMHg2NCwgMHg0MCwgMHg4MCwgMHgyQiwgMHgwNSwgMHgwMCwgMHgwMCwgMHg2MCwgMHg3MCwgMHg3QywgMHgwMCwgMHg2MCwgMHg5MCwgMHg2MywKKwkgMHgwNCwgMHgwMCwgMHgyRCwgMHg0NiwgMHhDMiwgMHg2MCwgMHgwNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyRCwgMHg0NiwgMHhDRSwgMHhGQiwgMHhDRiwgMHhGOSwKKwkgMHhEMCwgMHhGRCwgMHgwNywgMHhGMiwgMHhEMSwgMHhGQiwgMHg2MCwgMHg0NiwgMHgzNywgMHhGMCwgMHgyQSwgMHg0NCwgMHgwRCwgMHg2MCwgMHgyQywgMHg2MiwKKwkgMHg1QSwgMHhEOSwgMHgwMCwgMHg2NSwgMHg0NSwgMHg0QiwgMHhBMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgzRiwgMHgyMiwgMHgwNSwgMHgwMCwgMHg5MCwgMHg4NCwKKwkgMHgzNywgMHhGQSwgMHgwMSwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyMSwgMHgwMCwgMHhBRCwgMHg0NiwgMHgwQSwgMHhBMywgMHgzRCwgMHhGMiwgMHhBRCwgMHg0NiwKKwkgMHhBMywgMHhEMCwgMHhBRCwgMHg0NiwgMHhEMCwgMHg4MCwgMHgzQywgMHhGMiwgMHhBRCwgMHg0NiwgMHgwMiwgMHgwMywgMHgxNiwgMHgwNywgMHgxNCwgMHgwNCwKKwkgMHg1QiwgMHhEMCwgMHhBRCwgMHg0NiwgMHhEMCwgMHg4MCwgMHgzQiwgMHhGMiwgMHgwMywgMHgwMywgMHhBRCwgMHg0NiwgMHgwRSwgMHgwNywgMHgwQywgMHgwNCwKKwkgMHgzQSwgMHhGMCwgMHhBRCwgMHg0NiwgMHg1QiwgMHhEMCwgMHg2NCwgMHg1RiwgMHhEMCwgMHg4MCwgMHgyQiwgMHg0NCwgMHgxOCwgMHgwNywgMHgwNCwgMHgwMywKKwkgMHhEMCwgMHg4NCwgMHgxMCwgMHhBNCwgMHhGRiwgMHhGRiwgMHgxMywgMHgwNywgMHg3RiwgMHgwMSwgMHgwMSwgMHg2NCwgMHgwRCwgMHg2MCwgMHgyQywgMHg2MiwKKwkgMHhBMiwgMHhEQiwgMHgyRCwgMHg0NiwgMHgwRCwgMHg2MCwgMHgzQywgMHg2MiwgMHg4MCwgMHhGRiwgMHg3OCwgMHg0NCwgMHgwMywgMHhBNCwgMHhBMiwgMHhEQiwKKwkgMHhDMiwgMHg2MCwgMHhBQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4NSwgMHhGRiwgMHgyRCwgMHg0NiwgMHgwOCwgMHgyNSwgMHg1MywgMHgwMSwgMHgyRCwgMHg0NiwKKwkgMHgwRCwgMHg2MCwgMHgzQywgMHg2MiwgMHg4MCwgMHhGRiwgMHg3OCwgMHg0NCwgMHgwMywgMHhBNCwgMHhBMiwgMHhEQiwgMHhDMywgMHg2MCwgMHgzMywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg4NSwgMHhGRiwgMHgyRCwgMHg0NiwgMHgwOCwgMHgyNSwgMHg0NSwgMHgwMSwgMHgwMCwgMHg2MCwgMHgwRiwgMHg2NCwgMHhDMSwgMHg2MCwKKwkgMHg3MCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHhGNCwgMHg2NiwgMHg0MSwgMHgwMywgMHhGMiwgMHgwNCwgMHhGMiwgMHg0MCwgMHg0MiwgMHgwNSwgMHhGMiwKKwkgMHg0MCwgMHg0MywgMHg0MCwgMHg0NCwgMHg2MSwgMHg0NiwgMHgzQywgMHhGMiwgMHgzRCwgMHhGMiwgMHg0MCwgMHg0MCwgMHg0MCwgMHg0MSwgMHgwRCwgMHg2MCwKKwkgMHg3MCwgMHg2NSwgMHgwMCwgMHg2MSwgMHhDRiwgMHhGMSwgMHhDRSwgMHhGNSwgMHg0NCwgMHg0QywgMHgyQywgMHg1QywgMHhFOSwgMHg4MCwgMHgwMCwgMHg2NCwKKwkgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwgMHhDMCwgMHg4MywgMHhCRCwgMHhEMiwgMHgyNCwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyMCwgMHg0NCwgMHg0MCwgMHg4MCwgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyMCwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyMSwgMHg0NCwgMHg0MCwgMHg4MSwgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyMSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyMiwgMHg0NCwgMHg0MCwgMHg4MiwgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyMiwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyMywgMHg0NCwgMHg0MCwgMHg4MywgMHhGMiwgMHhBMywgMHhCRCwgMHhEMiwgMHgyMywgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyNCwgMHg0NCwgMHhDMCwgMHg5QywgMHg0MSwgMHg4NCwgMHhERCwgMHg4MSwgMHgwOCwgMHgyQSwgMHhBNywgMHgwMSwgMHgwRCwgMHg2MCwgMHgyRSwgMHg2MSwKKwkgMHgwNSwgMHg2NCwgMHhEMCwgMHhGNCwgMHhEMSwgMHhGNSwgMHhGRSwgMHhBMywgMHg1QiwgMHhEMCwgMHhDQywgMHg4NCwgMHg1OSwgMHhEOSwgMHhGQywgMHgwMiwKKwkgMHhEMCwgMHhGMywgMHhEMSwgMHhGNSwgMHg2MCwgMHg0MiwgMHgyMCwgMHg0NCwgMHhBMiwgMHhEQSwgMHgyMSwgMHg0NCwgMHg1QSwgMHhEQSwgMHgyMiwgMHg0NCwKKwkgMHg1QSwgMHhEQSwgMHgyMywgMHg0NCwgMHg1QSwgMHhEQSwgMHgyNCwgMHg0NCwgMHg1QSwgMHhEQSwgMHg2MSwgMHg0NiwgMHgwRCwgMHg2MCwgMHgzQywgMHg2MiwKKwkgMHhBMiwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0MSwgMHhEMCwgMHhGMywgMHhEMSwgMHhGNSwgMHhBMCwgMHhEMiwgMHg1QSwgMHhEMCwKKwkgMHg0MCwgMHg0MCwgMHg0NCwgMHg0MSwgMHg1QSwgMHhEMiwgMHg1QSwgMHhEMCwgMHg0MCwgMHg0MiwgMHg1QSwgMHhEMCwgMHg0NCwgMHg0MywgMHg2MSwgMHg0NiwKKwkgMHhCQSwgMHhGMCwgMHgzQiwgMHhGMiwgMHg0NCwgMHg0NCwgMHg2NSwgMHg1RiwgMHg0MCwgMHg4NSwgMHhDRiwgMHhGNCwgMHhDRSwgMHhGNSwgMHg0MywgMHg0QywKKwkgMHgwRCwgMHg2MCwgMHg3MCwgMHg2NSwgMHhCRCwgMHhEMiwgMHgyNSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyMCwgMHg0NCwKKwkgMHg0MCwgMHg4MCwgMHhCRCwgMHhEMiwgMHgyMCwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwKKwkgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyMSwgMHg0NCwgMHg0MCwgMHg4MSwKKwkgMHhCRCwgMHhEMiwgMHgyMSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyMiwgMHg0NCwgMHg0MCwgMHg4MiwgMHhCRCwgMHhEMiwKKwkgMHgyMiwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyMywgMHg0NCwgMHg0MCwgMHg4MywgMHhCRCwgMHhEMiwgMHgyMywgMHg1QywKKwkgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyNCwgMHg0NCwgMHg0MCwgMHg4NCwgMHhCRCwgMHhEMiwgMHgyNCwgMHg1QywgMHg5MCwgMHg5QywKKwkgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwKKwkgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyNSwgMHg0NCwgMHg0MCwgMHg4NSwgMHg2MSwgMHg0NiwgMHgzQSwgMHhGMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NCwKKwkgMHhFMCwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFMSwgMHg3RiwgMHg1QSwgMHhEMCwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFMiwgMHg3RiwKKwkgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhDRSwgMHhGNSwgMHhCRCwgMHhEMiwgMHgyNSwgMHg1QywgMHg5MCwgMHg4NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwKKwkgMHgyMCwgMHg1QywgMHg0MCwgMHg4MCwgMHgyMCwgMHg0NCwgMHhFNCwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyMCwgMHg0NywgMHhFNSwgMHg3RiwgMHhBMCwgMHg1QiwKKwkgMHhCRCwgMHhEMiwgMHgyMCwgMHg1QywgMHg5MCwgMHg4NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyMSwgMHg1QywgMHg0MCwgMHg4MSwgMHgyMSwgMHg0NCwKKwkgMHhFNiwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyMSwgMHg0NywgMHhFNywgMHg3RiwgMHhBMCwgMHg1QiwgMHgyMSwgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwKKwkgMHgyMiwgMHg1QywgMHg0MCwgMHg4MiwgMHgyMiwgMHg0NCwgMHhFOCwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyMiwgMHg0NywgMHhFOSwgMHg3RiwgMHhBMCwgMHg1QiwKKwkgMHgyMiwgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyMywgMHg1QywgMHg0MCwgMHg4MywgMHgyMywgMHg0NCwgMHhFQSwgMHg3RiwgMHhBMCwgMHg1QiwKKwkgMHgyMywgMHg0NywgMHhFQiwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyMywgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyNCwgMHg1QywgMHg0MCwgMHg4NCwKKwkgMHgyNCwgMHg0NCwgMHhFQywgMHg3RiwgMHhBMCwgMHg1QiwgMHgyNCwgMHg0NywgMHhFRCwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyNCwgMHg0NCwgMHhFOCwgMHg4MCwKKwkgMHhGOCwgMHg4NCwgMHgyNSwgMHg1QywgMHg0MCwgMHg4NSwgMHgyNSwgMHg0NCwgMHhFRSwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyNSwgMHg0NywgMHhFRiwgMHg3RiwKKwkgMHhBMCwgMHg1QiwgMHgyQywgMHg0MywgMHhBMywgMHhEMiwgMHgyNSwgMHg1QywgMHg5MCwgMHg4MSwgMHhFOSwgMHg4NCwgMHhFMywgMHg3RiwgMHhBMCwgMHg1QiwKKwkgMHgwRCwgMHg2MCwgMHgzQywgMHg2MiwgMHhBMiwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDQiwgMHhGMywgMHg1QSwgMHhEMywgMHg0MCwgMHg0OCwKKwkgMHg1QSwgMHhEMywgMHg0MCwgMHg0OSwgMHg0MCwgMHg0QSwgMHgwMCwgMHg2MCwgMHg3MCwgMHg3QywgMHg0NCwgMHg0RCwgMHg0NSwgMHhGMiwgMHg0NiwgMHhGMiwKKwkgMHg0MCwgMHg0NywgMHg0MCwgMHg0NiwgMHgwRCwgMHg2MCwgMHg3MCwgMHg2NSwgMHgwMCwgMHg2MSwgMHgyRCwgMHg1QywgMHhFOSwgMHg4MCwgMHgwMCwgMHg2NCwKKwkgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwgMHhDMCwgMHg4MywgMHhCRCwgMHhEMiwgMHgyQSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyNiwgMHg0NCwgMHg0MCwgMHg4NiwgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyNiwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyNywgMHg0NCwgMHg0MCwgMHg4NywgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyNywgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyOCwgMHg0NCwgMHg0MCwgMHg4OCwgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyOCwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyOSwgMHg0NCwgMHg0MCwgMHg4OSwgMHhGMiwgMHhBMywgMHhCRCwgMHhEMiwgMHgyOSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyQSwgMHg0NCwgMHhDMCwgMHg5QywgMHg0MSwgMHg4QSwgMHhERCwgMHg4MSwgMHgwOCwgMHgyQSwgMHhBNywgMHgwMSwgMHgyNiwgMHg0NCwgMHg0MCwgMHhGQSwKKwkgMHgyNywgMHg0NCwgMHg0MSwgMHhGQSwgMHgyOCwgMHg0NCwgMHg0MiwgMHhGQSwgMHgyOSwgMHg0NCwgMHg0MywgMHhGQSwgMHgyQSwgMHg0NCwgMHg0NCwgMHhGQSwKKwkgMHgwRCwgMHg2MCwgMHgzRSwgMHg2MiwgMHhBMiwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHg4MCwgMHg3QywgMHg0NCwgMHg0RCwKKwkgMHgyRCwgMHg0MiwgMHhBMiwgMHhEMiwgMHg1QSwgMHhEMCwgMHg0MCwgMHg0NiwgMHg0NCwgMHg0NywgMHg1QSwgMHhEMiwgMHg1QSwgMHhEMCwgMHg0MCwgMHg0OCwKKwkgMHg1QSwgMHhEMCwgMHg0NCwgMHg0OSwgMHg0NywgMHhGMiwgMHg0NCwgMHg0QSwgMHg0MCwgMHg4QiwgMHg2MCwgMHg1QywgMHg2NCwgMHg0NywgMHhFMCwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHhGRiwgMHhCNCwgMHgyMCwgMHhCQywgMHg3RiwgMHhCNCwgMHhFMSwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFMiwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHgwMCwgMHg2MCwgMHg3MCwgMHg2MywgMHgwRCwgMHg2MCwgMHg3MCwgMHg2NSwgMHhCRCwgMHhEMiwgMHgyQiwgMHg1QywgMHg5MCwgMHg5QywKKwkgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwKKwkgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyNiwgMHg0NCwgMHg0MCwgMHg4NiwgMHhCRCwgMHhEMiwgMHgyNiwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywKKwkgMHg5MCwgMHg5QywgMHgyNywgMHg0NCwgMHg0MCwgMHg4NywgMHhCRCwgMHhEMiwgMHgyNywgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyOCwgMHg0NCwgMHg0MCwgMHg4OCwgMHhCRCwgMHhEMiwgMHgyOCwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyOSwgMHg0NCwKKwkgMHg0MCwgMHg4OSwgMHhCRCwgMHhEMiwgMHgyOSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwKKwkgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyQSwgMHg0NCwgMHg0MCwgMHg4QSwKKwkgMHhCRCwgMHhEMiwgMHgyQSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyQiwgMHg0NCwgMHg0MCwgMHg4QiwgMHhCRCwgMHhEMiwKKwkgMHgyQiwgMHg1QywgMHg5MCwgMHg4NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyNiwgMHg1QywgMHg0MCwgMHg4NiwgMHgyNiwgMHg0NCwgMHhFNCwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHgyNiwgMHg0NywgMHhFNSwgMHg3RiwgMHhBMCwgMHg1QSwgMHhCRCwgMHhEMiwgMHgyNiwgMHg1QywgMHg5MCwgMHg4NCwgMHhFOCwgMHg4MCwKKwkgMHhGOCwgMHg4NCwgMHgyNywgMHg1QywgMHg0MCwgMHg4NywgMHgyNywgMHg0NCwgMHhFNiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyNywgMHg0NywgMHhFNywgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHgyNywgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyOCwgMHg1QywgMHg0MCwgMHg4OCwgMHgyOCwgMHg0NCwgMHhFOCwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHgyOCwgMHg0NywgMHhFOSwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyOCwgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyOSwgMHg1QywKKwkgMHg0MCwgMHg4OSwgMHgyOSwgMHg0NCwgMHhFQSwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyOSwgMHg0NywgMHhFQiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyOSwgMHg0NCwKKwkgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyQSwgMHg1QywgMHg0MCwgMHg4QSwgMHgyQSwgMHg0NCwgMHhFQywgMHg3RiwgMHhBMCwgMHg1QSwgMHgyQSwgMHg0NywKKwkgMHhFRCwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyQSwgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyQiwgMHg1QywgMHg0MCwgMHg4QiwgMHgyQiwgMHg0NCwKKwkgMHhFRSwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyQiwgMHg0NywgMHhFRiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgzOCwgMHhGMCwgMHgyQiwgMHg0NCwgMHg5MCwgMHg4NCwKKwkgMHhFOCwgMHg4NCwgMHhFMywgMHg3RiwgMHhBMCwgMHg1QSwgMHgwRCwgMHg2MCwgMHgzRSwgMHg2MiwgMHhBMiwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg0MiwgMHhGRiwgMHg0MCwgMHhGRiwgMHhERCwgMHhGRSwgMHhBRCwgMHg0RiwgMHgwMCwgMHg3RiwgMHgwMSwgMHhCQywgMHhBMCwgMHg1RCwgMHgwMCwgMHhFRSwKKwkgMHgxOSwgMHg2MSwgMHhDRCwgMHg4MSwgMHhGRiwgMHhGRiwgMHhGRCwgMHgwMiwgMHg0MywgMHg0NSwgMHgyMCwgMHg0NCwgMHg2MCwgMHhCQywgMHg0MCwgMHg0MCwKKwkgMHgwMiwgMHg2MCwgMHhFRSwgMHg2MywgMHg2NSwgMHhGMywgMHg4MiwgMHhGRCwgMHg0MCwgMHg3RiwgMHg4MywgMHhGQiwgMHgwNSwgMHg2NCwgMHg4NCwgMHhGQiwKKwkgMHhERiwgMHhGRSwgMHgxOSwgMHhGRiwgMHhDNSwgMHg2MCwgMHg2RCwgMHg2NCwgMHgzRiwgMHg0MCwgMHgwMSwgMHgyQiwgMHgwMiwgMHgwMCwgMHhDNSwgMHg2MCwKKwkgMHg2RCwgMHg2NCwgMHg4NSwgMHhGQiwgMHhDMCwgMHg2MCwgMHg5QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHhFRSwgMHhBRCwgMHg0RiwgMHgwMCwgMHg3RiwKKwkgMHgwMSwgMHhCQywgMHhBMCwgMHg1RCwgMHgxOSwgMHg2MSwgMHhDRCwgMHg4MSwgMHhGRiwgMHhGRiwgMHhGRCwgMHgwMiwgMHhBRCwgMHg0RiwgMHgwMCwgMHg3RiwKKwkgMHgwMSwgMHhCQywgMHhBMCwgMHg1RCwgMHgwMCwgMHhFRSwgMHgxNSwgMHg2MCwgMHhBMiwgMHhFNywgMHgxQywgMHg2MCwgMHg2OCwgMHg2MywgMHgxQywgMHg2MCwKKwkgMHhEQywgMHg2NSwgMHhERiwgMHhGRSwgMHg4MCwgMHhFMSwgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0OCwgMHg2MCwgMHg0NywgMHg4MCwgMHhCQywKKwkgMHgwMCwgMHg3RiwgMHg2MCwgMHg0QSwgMHhENywgMHg4MCwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNSwgMHgwMiwgMHgxQywgMHg2MCwgMHhEQywgMHg2MywKKwkgMHgxRCwgMHg2MCwgMHhERSwgMHg2NSwgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0OCwgMHg2MCwgMHg0NywgMHg4MCwgMHhCQywgMHgwMCwgMHg3RiwKKwkgMHg2MCwgMHg0QSwgMHhENywgMHg4MCwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNSwgMHgwMiwgMHgzRiwgMHg0MCwgMHgyMCwgMHgyQiwgMHgwMCwgMHgwMCwKKwkgMHgwMSwgMHg2OCwgMHhGRiwgMHg2QSwgMHhCRiwgMHhGRSwgMHhDNiwgMHg2MCwgMHg1NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHg0MCwgMHgyMCwgMHgyQiwKKwkgMHhBRCwgMHgwMCwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgzOCwgMHg2OSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2OCwgMHg0NCwgMHgwMSwgMHgyQSwKKwkgMHhBNSwgMHgwMCwgMHgxRiwgMHg2MCwgMHgxQSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwKKwkgMHhBMiwgMHhEQiwgMHg2NSwgMHhGMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg5QywgMHgwMSwgMHgwMCwgMHg2NSwgMHhGMSwgMHhERCwgMHhGRSwKKwkgMHhBRCwgMHg0RiwgMHgwMCwgMHg3RiwgMHgwMSwgMHhCQywgMHhBMCwgMHg1RCwgMHgwMCwgMHhFRSwgMHg0MywgMHg0NSwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywKKwkgMHg0MCwgMHg0MCwgMHgwMiwgMHg2MCwgMHhFRSwgMHg2NCwgMHg4MiwgMHhGQiwgMHg4MywgMHhGOSwgMHgwNSwgMHg2NCwgMHg4NCwgMHhGQiwgMHhERiwgMHhGRSwKKwkgMHgxOSwgMHhGRiwgMHg4MywgMHgwMCwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwgMHg0MywgMHg0NSwgMHhBNCwgMHhEMSwgMHhEQSwgMHg4MywKKwkgMHhDMywgMHg4NSwgMHg4MCwgMHhFMSwgMHhERiwgMHhGRSwgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0OCwgMHg2MCwgMHg0NywgMHg4MCwgMHhCQywKKwkgMHgwMCwgMHg3RiwgMHg2MCwgMHg0QSwgMHhENywgMHg4MCwgMHhBMSwgMHhGRiwgMHhGNiwgMHgwMiwgMHhCRiwgMHhGRSwgMHg2RSwgMHgwMCwgMHgzRiwgMHg0MCwKKwkgMHg0MCwgMHgyNiwgMHgxMywgMHgwMCwgMHgwQiwgMHg2MCwgMHhGOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHg5MCwgMHg4NCwKKwkgMHhBMCwgMHg1MCwgMHhGOCwgMHhBMiwgMHhBMiwgMHhEMSwgMHgwQSwgMHg2MCwgMHgxOSwgMHg2NCwgMHg5MCwgMHg4NCwgMHhBMCwgMHg1MiwgMHgwNiwgMHhBMiwKKwkgMHhBMiwgMHhEMSwgMHg0NiwgMHg2MCwgMHgwOSwgMHg2NCwgMHg5MCwgMHg4NCwgMHhBMCwgMHg1MCwgMHhBRCwgMHg0RiwgMHhGRSwgMHhCNCwgMHhBMCwgMHg1RCwKKwkgMHhBRCwgMHg0RiwgMHhGRCwgMHhCNCwgMHhBMCwgMHg1RCwgMHgwMiwgMHhFRSwgMHhCRCwgMHhGRSwgMHg1MCwgMHgwMCwgMHg4MCwgMHhFMSwgMHgwMSwgMHgxNiwKKwkgMHhGRSwgMHgwMSwgMHg2NCwgMHg0OCwgMHg5MiwgMHg2QSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2OCwgMHg0MCwgMHgxRiwgMHg2MCwgMHgwOCwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHgzRiwgMHgwMCwgMHg4MCwgMHhFMSwKKwkgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgwMSwgMHg2OCwgMHhBNywgMHg2QSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2OCwgMHg0MCwgMHgzNiwgMHgwMCwKKwkgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwgMHg4MCwgMHhFMSwgMHg2NCwgMHg0NiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgyMSwgMHg2OSwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2OCwgMHg1RSwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgyMiwgMHg2OSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg2OCwgMHg1RiwgMHgyNiwgMHhGQSwgMHgxQywgMHhGMiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgzQSwgMHg2OSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg2OCwgMHg1RiwgMHgyNywgMHhGQSwgMHgxQiwgMHgwMCwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwgMHg0MywgMHg0NSwgMHhCRSwgMHhENSwKKwkgMHhBNCwgMHhEMiwgMHg1QSwgMHg4NiwgMHhFRiwgMHhBMCwgMHgxMSwgMHg2MSwgMHgwMSwgMHgwNiwgMHg2MCwgMHg0MSwgMHgxQywgMHg2MCwgMHg0NiwgMHg2MywKKwkgMHg4MCwgMHhFMSwgMHhCRCwgMHhEMywgMHgyNiwgMHg0MiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg2MCwgMHg0OSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg2OCwgMHg0NCwgMHhDRCwgMHg4MSwgMHhBMiwgMHhEQSwgMHg1QSwgMHg4NiwgMHhGNCwgMHgwMiwgMHgyNSwgMHg0MywgMHgyMSwgMHhFMSwgMHgwMCwgMHg2NCwKKwkgMHhCRiwgMHhEQiwgMHgyMCwgMHg0NCwgMHgyMCwgMHgyQSwgMHgwNywgMHgwMCwgMHgwNywgMHhCNCwgMHgwNCwgMHgzNiwgMHhDMywgMHhGRSwgMHgwNiwgMHgzNiwKKwkgMHhDQywgMHhGRSwgMHgwNywgMHgzNiwgMHhENSwgMHhGRSwgMHgyMCwgMHg0NCwgMHhEOCwgMHhCNCwgMHg0MCwgMHg0MCwgMHgyMCwgMHg0NCwgMHg0MCwgMHgyQSwKKwkgMHgwNywgMHgwMCwgMHg5RiwgMHhGRSwgMHgxRSwgMHgwNSwgMHhCRiwgMHhCNCwgMHg0MCwgMHg0MCwgMHg4NSwgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgxQiwgMHg2MCwgMHhFNiwgMHg2MywgMHhCRCwgMHhEMywgMHgwMiwgMHg2MSwgMHgxNywgMHgxQiwgMHgwNCwgMHhBMywgMHhCRCwgMHhEMywgMHgwMiwgMHg2MSwKKwkgMHgxMywgMHgxQiwgMHgwNCwgMHhBMywgMHhCRCwgMHhEMywgMHgwMiwgMHg2MSwgMHgwRiwgMHgxQiwgMHgwNCwgMHhBMywgMHhCRCwgMHhEMywgMHgwNCwgMHg2MSwKKwkgMHgwQiwgMHgxQiwgMHgwNCwgMHhBMywgMHhCRCwgMHhEMywgMHgwNiwgMHg2MSwgMHgwNywgMHgxQiwgMHgwNCwgMHhBMywgMHhCRCwgMHhEMywgMHgwNywgMHg2MSwKKwkgMHgwMywgMHgxQiwgMHhDMCwgMHg2MCwgMHg5QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHhEMSwgMHg0MCwgMHg0NCwgMHgyMCwgMHg0NCwgMHgwNywgMHhCNSwKKwkgMHhENCwgMHg4NSwgMHgzNSwgMHg4MCwgMHgyNCwgMHg0NSwgMHgxQywgMHg2MCwgMHgyMiwgMHg2NCwgMHg0NCwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg4MCwgMHhFMSwgMHg0MywgMHg0NSwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwgMHg2NCwgMHg0MywgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwKKwkgMHg0MCwgMHg0NCwgMHgxMCwgMHgyNywgMHgxMCwgMHgwMCwgMHhGRiwgMHg2MCwgMHg3RiwgMHg2NSwgMHgxNSwgMHg2MCwgMHhBMiwgMHg2NCwgMHgyNCwgMHg0MCwKKwkgMHgwOCwgMHgyQiwgMHhBNCwgMHg4NCwgMHhBMCwgMHg1NywgMHhGRiwgMHhGRiwgMHg2NCwgMHg0OSwgMHhGRiwgMHhGRiwgMHg2OCwgMHg0NCwgMHgwMSwgMHgxNiwKKwkgMHhGRCwgMHgwMSwgMHgwMCwgMHg3RiwgMHhBMywgMHhEQiwgMHhBMSwgMHgwMSwgMHg4MCwgMHhFMSwgMHg0MywgMHg0NSwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywKKwkgMHg0MCwgMHg0MCwgMHg2NCwgMHg0MywgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwgMHg0MCwgMHg0NCwgMHgxMCwgMHgyQiwgMHgxMSwgMHgwMCwgMHhBMywgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgxNSwgMHg2MCwgMHg4MCwgMHhFNywgMHgyNCwgMHg0MCwgMHgwNywgMHgyNywgMHgwMiwgMHgwMCwgMHg1MCwgMHhFQywgMHgwMCwgMHgwMCwKKwkgMHg2MCwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgyNCwgMHg0MCwgMHgyMCwgMHgyQiwgMHg0MCwgMHhFQywgMHgwRiwgMHgwMCwKKwkgMHgxNSwgMHg2MCwgMHgyMiwgMHg2NCwgMHgyNCwgMHg0MCwgMHgwOCwgMHgyNywgMHg4MCwgMHhCQywgMHhBMywgMHhEMywgMHhBMCwgMHg1NywgMHg2MCwgMHg0OCwKKwkgMHg2NCwgMHg0NCwgMHg4MCwgMHhCQywgMHhGRiwgMHhCNCwgMHg2MCwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg3NSwgMHgwMSwKKwkgMHhBMiwgMHhGRiwgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwMSwgMHgwMiwgMHhBMSwgMHhGRiwgMHg4NiwgMHhGRiwgMHg4OCwgMHhGRiwKKwkgMHg1QywgMHg0NiwgMHg1QywgMHg0OSwgMHg1QywgMHg0MCwgMHhERSwgMHg2MCwgMHg1OCwgMHg0RiwgMHhFMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDRSwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHgwMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFNywgMHg2MCwgMHg1OCwgMHg0RiwgMHhCRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEQiwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHgzQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMywgMHhFMSwgMHhBMywgMHhGRiwgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhEQywgMHg2MCwgMHg4NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhDRSwgMHg2MiwgMHhBMiwgMHhEMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyMiwgMHgwMCwgMHg3NSwgMHhGMywgMHgzMSwgMHg0MCwgMHgwMSwgMHgyQSwgMHgxRSwgMHgwMCwKKwkgMHhEQywgMHg4NCwgMHgwMSwgMHhCNCwgMHg3NSwgMHhGQiwgMHgwOSwgMHgwMiwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwKKwkgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxMSwgMHgwMCwgMHgwRiwgMHg2MCwgMHhEQywgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwOCwgMHgwMCwgMHhBOSwgMHhGRSwgMHhFNCwgMHgwNSwKKwkgMHhBQiwgMHhGRSwgMHgwNywgMHgwNSwgMHhBOCwgMHhGRSwgMHhENCwgMHgwNSwgMHhBQSwgMHhGRSwgMHhENSwgMHgwNSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg4NSwgMHgzRSwgMHgxQiwgMHg2MCwgMHhDNCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgwMywgMHgwMiwKKwkgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NSwgMHhENCwgMHg4MCwgMHgwRiwgMHhGMCwgMHhGOSwgMHgwMywgMHg2NCwgMHg0NCwKKwkgMHg3MCwgMHhCMCwgMHg3MCwgMHgyQSwgMHgxNCwgMHgwMCwgMHgxRiwgMHg2MCwgMHgxOCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHhBMiwgMHhGRiwgMHg4RiwgMHhGMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4NCwgMHhGRSwgMHhBMCwKKwkgMHg4RiwgMHhGQiwgMHgwMSwgMHgwNywgMHhENCwgMHhGRSwgMHhBMywgMHhGRiwgMHhDQiwgMHg2MCwgMHhCQywgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwKKwkgMHgwMiwgMHgyNiwgMHgwOSwgMHgwMCwgMHg2NiwgMHg0NSwgMHgwOSwgMHhGNCwgMHgwRiwgMHhGMiwgMHgwMiwgMHgxOCwgMHg2NSwgMHg0NiwgMHhFMywgMHgxQiwKKwkgMHgwMCwgMHg2NCwgMHg0MCwgMHg0NiwgMHhDQiwgMHgwMSwgMHhBMiwgMHhGRiwgMHg4RiwgMHhGMywgMHg0NiwgMHg0NiwgMHhDQywgMHg4NCwgMHhGRSwgMHhBMCwKKwkgMHg4RiwgMHhGQiwgMHgwMSwgMHgwNywgMHhENCwgMHhGRSwgMHhBMywgMHhGRiwgMHgwRiwgMHhGMCwgMHhBMywgMHhGQywgMHg2NCwgMHg0NCwgMHg4MCwgMHgyNiwKKwkgMHgyMiwgMHgwMCwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhGOCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwKKwkgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgzMiwgMHg0NCwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwgMHgwNywgMHg2MCwgMHgwMSwgMHg2NCwgMHgwNCwgMHgwMCwKKwkgMHgwMiwgMHgyQSwgMHgwNiwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHgyMywgMHhGQSwgMHhDQiwgMHg2MCwgMHhDOCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhDQiwgMHg2MCwgMHhCQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyNiwgMHgzRiwgMHgwMCwgMHgyQSwgMHhGMiwgMHg2MCwgMHg2MywgMHg2MCwgMHg0MCwKKwkgMHgwMiwgMHgyQiwgMHg2NiwgMHg2MywgMHhCRSwgMHhEMiwgMHg2OSwgMHhGMSwgMHhBMywgMHhEMiwgMHhEMCwgMHg4MCwgMHg2OCwgMHhGMSwgMHgxOCwgMHgwMiwKKwkgMHhCRiwgMHhEMiwgMHhEMCwgMHg4MCwgMHg2NywgMHhGMSwgMHgxNCwgMHgwMiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxMSwgMHgwMiwgMHg5OCwgMHhGMSwKKwkgMHgxRiwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywKKwkgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwKKwkgMHgzMiwgMHg0NCwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwgMHgwNywgMHg2MCwgMHgwMiwgMHg2NCwgMHgwNCwgMHgwMCwgMHgwMiwgMHgyQSwgMHgwNiwgMHgwMCwKKwkgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHgyMywgMHhGQSwgMHhDQiwgMHg2MCwgMHhDOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHhCMCwgMHgzQSwgMHgwNiwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHgyMywgMHhGQSwgMHhDOCwgMHg2MCwgMHg2RCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhDQiwgMHg2MCwgMHhCQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMiwgMHg0NCwgMHgwMSwgMHgyQSwgMHg0QSwgMHgwMCwgMHgyMCwgMHg2MCwKKwkgMHg2QywgMHg2MywgMHhCRiwgMHhEMywgMHgwMCwgMHg2NSwgMHhCNCwgMHg4MSwgMHhEQiwgMHg4MywgMHgzRCwgMHgwMywgMHhCRiwgMHhEMywgMHhBMywgMHhEMywKKwkgMHg0MCwgMHg0OCwgMHhCRSwgMHhEMywgMHg0MCwgMHg0QSwgMHgyRSwgMHhGMCwgMHg0MCwgMHg0QywgMHhEMCwgMHg4MCwgMHgyRCwgMHhGMCwgMHgwOCwgMHgwMiwKKwkgMHgyQSwgMHg0NCwgMHhEMCwgMHg4MCwgMHgyQywgMHhGMCwgMHgwNCwgMHgwMiwgMHgyOCwgMHg0NCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgyQiwgMHgwMywKKwkgMHgzMSwgMHhGMCwgMHgyQywgMHg0NCwgMHhEMCwgMHg4MCwgMHgzMCwgMHhGMCwgMHgwOCwgMHgwMiwgMHgyQSwgMHg0NCwgMHhEMCwgMHg4MCwgMHgyRiwgMHhGMCwKKwkgMHgwNCwgMHgwMiwgMHgyOCwgMHg0NCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxRSwgMHgwMywgMHgzNCwgMHhGMCwgMHgyQywgMHg0NCwgMHhEMCwgMHg4MCwKKwkgMHgzMywgMHhGMCwgMHgwOCwgMHgwMiwgMHgyQSwgMHg0NCwgMHhEMCwgMHg4MCwgMHgzMiwgMHhGMCwgMHgwNCwgMHgwMiwgMHgyOCwgMHg0NCwgMHhEMCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgxMSwgMHgwMywgMHgzOCwgMHhGMCwgMHgyQywgMHg0NCwgMHhEMCwgMHg4MCwgMHgzNywgMHhGMCwgMHgwOCwgMHgwMiwgMHgyQSwgMHg0NCwKKwkgMHhEMCwgMHg4MCwgMHgzNiwgMHhGMCwgMHgwNCwgMHgwMiwgMHgyOCwgMHg0NCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMywgMHhGQSwgMHhBMSwKKwkgMHgwNiwgMHhBMywgMHhCNywgMHgwMywgMHhDMywgMHgwMSwgMHgwNywgMHg2MCwgMHgwMCwgMHg2NCwgMHgyMywgMHhGQSwgMHhDQiwgMHg2MCwgMHhDOCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHgwRiwgMHhGMCwgMHg2MCwgMHg0NSwgMHhBNCwgMHgzNiwgMHgwOCwgMHgwMCwgMHgwQywgMHhCNCwgMHgwNCwgMHgzNiwKKwkgMHgwMiwgMHgwMCwgMHgwQywgMHgzQSwgMHgwNiwgMHgwMCwgMHhDQiwgMHg2MCwgMHhCQywgMHg3OCwgMHhGRiwgMHhGRiwgMHhDOSwgMHg2MCwgMHg0MiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyNiwgMHhGMiwgMHg1MCwgMHhGMSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RSwgMHhEMCwgMHg4NCwgMHgxRiwgMHhBNCwgMHgwNiwgMHgwRSwKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgwNywgMHgwMCwgMHhDMiwgMHhBNCwgMHhFOCwgMHg4NCwKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NywgMHhGOCwgMHhCRiwgMHhDMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHhGMCwKKwkgMHg2NSwgMHg0MCwgMHg0MCwgMHgyQiwgMHgyMiwgMHgwMCwgMHgzMiwgMHg0MCwgMHgwOCwgMHgyNiwgMHgxRiwgMHgwMCwgMHgwNywgMHhGNCwgMHgzNiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHgzNywgMHhCNCwgMHgyNiwgMHg0NiwgMHgxOSwgMHgwMiwgMHgyQywgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwKKwkgMHgxMSwgMHgwMCwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhGRSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwKKwkgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHhDQiwgMHg2MCwgMHhCQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHg2NCwgMHg0MCwgMHg2MCwgMHgyNiwKKwkgMHgwMywgMHgwMCwgMHhDOSwgMHg2MCwgMHgxQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgzQSwgMHhGMywgMHgwMSwgMHg5OCwgMHhGMSwKKwkgMHgxRSwgMHg2MCwgMHhGMiwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywKKwkgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwKKwkgMHgyNywgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzQiwgMHgxMiwgMHgwMCwgMHg5OCwgMHhGMSwgMHgxRiwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwKKwkgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgxMywgMHgwMCwgMHgwMiwgMHgzQiwKKwkgMHgxMSwgMHgwMCwgMHg5OCwgMHhGMSwgMHgxRiwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwKKwkgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgyQSwgMHhGMiwgMHgyOCwgMHg0MSwgMHg0MCwgMHhBOCwgMHgwMSwgMHhCMSwgMHgwMiwgMHgwMiwgMHg1RiwgMHgwMiwKKwkgMHg4OSwgMHgwMCwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgyQiwgMHgwMCwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhGMCwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwKKwkgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgxQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwKKwkgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhGNiwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywKKwkgMHgwNywgMHgwNSwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwKKwkgMHgwMCwgMHg2NCwgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgwRiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyNiwgMHgyOCwgMHgwMCwgMHgzMiwgMHg0NCwgMHgwMiwgMHgyNiwgMHgyNSwgMHgwMCwgMHgxMCwgMHgyQiwKKwkgMHgyNiwgMHgwMCwgMHgyMCwgMHg2MCwgMHg2QywgMHg2MywgMHhCRiwgMHhEMywgMHgyQywgMHhGMCwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0MSwgMHgwRCwgMHgwMywKKwkgMHg1MCwgMHhGRSwgMHhCRCwgMHhEMywgMHgyRCwgMHhGMCwgMHhEMCwgMHg4MCwgMHhCRCwgMHhEMywgMHgyRSwgMHhGMCwgMHhEMCwgMHg4MCwgMHhCRCwgMHhEMywKKwkgMHgyQywgMHhGMCwgMHhEMCwgMHg4MCwgMHhGQSwgMHhBMSwgMHgxMCwgMHgwQywgMHhGMywgMHgwMiwgMHg1MCwgMHhGRSwgMHg2MCwgMHg2MCwgMHgwMSwgMHg2NCwKKwkgMHhEMCwgMHg4MCwgMHgyRCwgMHhGMCwgMHgxRCwgMHg2NCwgMHhEMCwgMHg4MCwgMHgyRSwgMHhGMCwgMHgwMSwgMHg2NCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwMywgMHgwQywgMHhDQiwgMHg2MCwgMHhCQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMiwgMHg0MCwgMHg0MCwgMHgyQSwgMHgwMCwgMHgwMCwgMHhDQiwgMHg2MCwKKwkgMHhCNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMiwgMHg0MCwgMHg0MCwgMHgyNiwgMHhGQSwgMHgwMSwgMHgyQSwgMHhGMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwKKwkgMHgwOCwgMHgyQSwgMHgyMCwgMHgwMCwgMHgzMiwgMHg0MCwgMHgwMiwgMHgyQSwgMHgxRCwgMHgwMCwgMHgwMywgMHg2NywgMHhBMCwgMHg4NCwgMHgwMCwgMHgzNywKKwkgMHg2NCwgMHg2MywgMHg2MCwgMHg0MCwgMHgwMiwgMHgzNywgMHg1RSwgMHg2MywgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNywgMHg1OCwgMHg2MywgMHg2MCwgMHg0MCwKKwkgMHgwMywgMHgzNywgMHgwRCwgMHgwMCwgMHhCRCwgMHhEMiwgMHg2NywgMHhGMSwgMHhCRCwgMHhEMiwgMHhEMCwgMHg4MCwgMHg2OCwgMHhGMSwgMHgwNywgMHgwMiwKKwkgMHhEMCwgMHg4MCwgMHhCRCwgMHhEMiwgMHg2OSwgMHhGMSwgMHgwMywgMHgwMiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHhDQiwgMHg2MCwKKwkgMHhCQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHg4NywgMHhGNCwgMHg2MCwgMHg0MCwgMHgwMywgMHgyQiwgMHgzMSwgMHgwMCwgMHg4OSwgMHhGMywKKwkgMHgwNiwgMHg2MSwgMHg2MCwgMHg0MywgMHg2NiwgMHg0NSwgMHgzMSwgMHhGMCwgMHg2MywgMHg0NiwgMHgwNSwgMHhGMiwgMHg2NSwgMHg0NiwgMHhEMCwgMHg4MCwKKwkgMHgzMCwgMHhGMCwgMHgwRiwgMHgwMiwgMHg2MywgMHg0NiwgMHgwNCwgMHhGMiwgMHg2NSwgMHg0NiwgMHhEMCwgMHg4MCwgMHgyRiwgMHhGMCwgMHgwOSwgMHgwMiwKKwkgMHg2MywgMHg0NiwgMHgwMywgMHhGMiwgMHg2NSwgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwgMHhGRiwgMHhGRiwgMHg0OCwgMHhGRSwKKwkgMHgwNiwgMHgwMCwgMHhDRCwgMHg4MSwgMHgwMiwgMHhBMywgMHhFNywgMHgwMiwgMHg4OCwgMHhGMSwgMHgwOCwgMHhGRSwgMHg2NCwgMHg0MywgMHgwMywgMHgwMywKKwkgMHhDQiwgMHg2MCwgMHhCQywgMHg3OCwgMHhGRiwgMHhGRiwgMHg0MywgMHg0MywgMHgyMywgMHg0NiwgMHgwNiwgMHhGMCwgMHgyNiwgMHg0NiwgMHgwNywgMHg2NywKKwkgMHhBMCwgMHg4NCwgMHgyMywgMHhGQSwgMHg2NCwgMHg0MCwgMHgwMiwgMHgyNiwgMHgyQiwgMHgwMCwgMHhDQiwgMHg2MCwgMHhCQywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyNiwgMHgxQiwgMHgzMSwgMHhGMiwgMHgxMiwgMHg2MCwgMHhDRSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywKKwkgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgzMSwgMHhGMCwgMHg2MywgMHg0NiwKKwkgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgzMCwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwKKwkgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwgMHgyRiwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwKKwkgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwgMHg4OCwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHg0MywgMHg0MywKKwkgMHgwNywgMHhGQywgMHg0MywgMHg0MywgMHgwMiwgMHhGRSwgMHgxRCwgMHhGMCwgMHgxMiwgMHg2MCwgMHhDMCwgMHg2MiwgMHhDMCwgMHg2NCwgMHhDMCwgMHg4NCwKKwkgMHhBMiwgMHhEMSwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhDMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHg2MywgMHg0NSwgMHgyQSwgMHhGMiwgMHgzNSwgMHhGMCwgMHg2MCwgMHg0MCwgMHhBNCwgMHgzNiwgMHgwQiwgMHgwMCwgMHgwOCwgMHgyQiwgMHgwQywgMHgwMCwKKwkgMHgyMywgMHg0NiwgMHgyMiwgMHhGMiwgMHgyNiwgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNiwgMHgwMiwgMHhDQiwgMHg2MCwgMHhCQywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhDQiwgMHg2MCwgMHhCNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMywgMHg0NiwgMHgxRSwgMHhGMiwgMHgyNiwgMHg0NiwgMHg0NCwgMHg0QywKKwkgMHgwRiwgMHgyNiwgMHgxOSwgMHgwMCwgMHgwMCwgMHhCQywgMHg0MCwgMHg0NSwgMHgwQiwgMHgwMywgMHgwMCwgMHg2NCwgMHgyMywgMHg0NiwgMHgxRSwgMHhGQSwKKwkgMHgyNiwgMHg0NiwgMHhBMiwgMHhGRiwgMHhCNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHhGRiwgMHgyNiwgMHg0NiwKKwkgMHgyQSwgMHhGMCwgMHgyQywgMHg0NCwgMHg2NCwgMHg0MCwgMHgwNCwgMHgyNywgMHgwNiwgMHgwMCwgMHgyMywgMHg0NiwgMHgyMiwgMHhGQSwgMHgyNiwgMHg0NiwKKwkgMHhDQSwgMHg2MCwgMHhCNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHhGMiwgMHgwMiwgMHhGQSwgMHhBMiwgMHhGRiwgMHgxNiwgMHhGMCwgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHg0NCwgMHgwMSwgMHgyNiwgMHhEQywgMHg5QywgMHg5MywgMHhGMywgMHgyQSwgMHhGMiwgMHhEQywgMHg4MywgMHg5MywgMHhGRCwgMHgwNiwgMHhGNCwKKwkgMHgwMSwgMHhGOCwgMHgyNiwgMHg0NiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgxOCwgMHgwMCwgMHg2NCwgMHg0NCwgMHgwMCwgMHg2NSwgMHhGRiwgMHhCNCwKKwkgMHhGQywgMHhBNCwgMHgwNiwgMHhGMCwgMHgwMywgMHgwMywgMHg2NCwgMHg0NiwgMHgwQywgMHgwRCwgMHgwMiwgMHg2NSwgMHgyNiwgMHg0NiwgMHgwMCwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywgMHg2MCwgMHg0NiwgMHhGOSwgMHgwMSwgMHgwMSwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHhENCwgMHg4NCwgMHgwMSwgMHhGQSwgMHg2NiwgMHg0NCwgMHgyNiwgMHg0NiwgMHgwNiwgMHhGQSwgMHgwNiwgMHhGNCwgMHgwMCwgMHhGMiwgMHg4MCwgMHhGQywKKwkgMHg0MCwgMHg0NSwgMHhCNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHhGRiwgMHgyNiwgMHg0NiwgMHgyQywgMHg0NCwKKwkgMHgwRiwgMHgyNiwgMHgxMCwgMHgwMCwgMHgyMywgMHg0NiwgMHgyMiwgMHhGQSwgMHgyNiwgMHg0NCwgMHgxRSwgMHhGQSwgMHgyNiwgMHg0NiwgMHgxQiwgMHg2MCwKKwkgMHhEQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHg2RiwgMHgwMCwgMHhBMywgMHg0NiwgMHgyMiwgMHhGMiwgMHg2MCwgMHg0NSwgMHhEQywgMHg4NCwgMHhENCwgMHg4MCwgMHgyMiwgMHhGQSwKKwkgMHhBMywgMHg0NiwgMHg2QywgMHgwMiwgMHgyQSwgMHhGMCwgMHhBMywgMHg0NiwgMHgxRSwgMHhGMiwgMHhBMywgMHg0NiwgMHgwMCwgMHhCQywgMHgwMCwgMHhGMiwKKwkgMHgwMSwgMHgwMiwgMHg2NCwgMHgwMCwgMHg0NCwgMHg0QywgMHgzRiwgMHhGMCwgMHg2MCwgMHg0MywgMHgyMywgMHg0NiwgMHgxRSwgMHhGNCwgMHgwOSwgMHg2MCwKKwkgMHgwMCwgMHg2NSwgMHgzRiwgMHhGMiwgMHgyNiwgMHg0NiwgMHhDMCwgMHg4NCwgMHhENCwgMHg4MCwgMHg2MCwgMHg0NSwgMHg1NywgMHgwNywgMHg4MCwgMHhGQywKKwkgMHgxQiwgMHhGMiwgMHgwNiwgMHhGMiwgMHg2MCwgMHg0MSwgMHgyMywgMHg0NiwgMHgxRSwgMHhGNCwgMHgxQiwgMHhGMCwgMHgwNiwgMHhGMCwgMHhDMSwgMHg4MSwKKwkgMHgwNiwgMHhGQSwgMHgwNSwgMHhGQSwgMHg5QiwgMHhGQSwgMHg2NSwgMHg0NCwgMHgzRiwgMHhGQSwgMHg2NCwgMHg0NiwgMHgwMCwgMHhGQywgMHg2MywgMHg0NiwKKwkgMHgwMSwgMHhGMiwgMHgxMCwgMHg2MSwgMHhGMiwgMHhBNCwgMHgwMSwgMHhGQSwgMHhDOCwgMHg4MywgMHgwMiwgMHg2NCwgMHg1OSwgMHhEMCwgMHg1OCwgMHhEOCwKKwkgMHhGRCwgMHgxRiwgMHgwNiwgMHg0NSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNSwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhBMiwgMHhGRiwgMHgwMCwgMHhGNCwgMHgwMSwgMHhGMCwgMHgwQSwgMHgxOCwKKwkgMHg3MCwgMHg2NywgMHhBMCwgMHg4MCwgMHhGMCwgMHg2NywgMHgwNiwgMHgwMywgMHhDMCwgMHg4NCwgMHgwMSwgMHhGQSwgMHgyNSwgMHg0NiwgMHgyNSwgMHg0NCwKKwkgMHg4MCwgMHhGQywgMHgwNSwgMHhGQSwgMHhCNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhENCwgMHhGRSwgMHhBMywgMHhGRiwKKwkgMHgyQywgMHg0NCwgMHgwNCwgMHgyNywgMHgxNiwgMHgwMCwgMHgyMywgMHg0NiwgMHgxRSwgMHhGMiwgMHg5RSwgMHhGQywgMHg2MCwgMHg0NiwgMHg0NiwgMHg0NiwKKwkgMHgzRiwgMHhGMiwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0NywgMHgwOCwgMHhGQSwgMHgyNiwgMHg0NiwgMHgyQywgMHg0MywgMHgyQSwgMHhGQywgMHgwNiwgMHhGNCwKKwkgMHgwMCwgMHg2NCwgMHgwMCwgMHhGQSwgMHgwMSwgMHhGMCwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHgwMSwgMHhGQSwgMHgyNiwgMHg0NiwKKwkgMHgxRCwgMHgwMCwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhDNywgMHg2MCwgMHgzMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHg0NiwgMHgxRSwgMHhGMCwKKwkgMHg5RSwgMHhGQywgMHgwMCwgMHg2MywgMHgzMywgMHg4NSwgMHhBMywgMHg0NiwgMHgwRCwgMHgwMywgMHhBMywgMHg0NiwgMHgyMiwgMHhGMiwgMHgwRiwgMHg2NSwKKwkgMHhBNCwgMHg4NSwgMHhENCwgMHg4NCwgMHgyMiwgMHhGQSwgMHhBMywgMHg0NiwgMHhBMiwgMHhGRiwgMHhCNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg0OCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhBMywgMHhGRiwgMHgyNiwgMHg0NiwgMHhDQiwgMHg2MCwgMHhCQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHhGMCwgMHg4OCwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHgyNiwgMHg0NiwgMHg1MCwgMHgwMywgMHg2MCwgMHg0MCwgMHgwMCwgMHgzNiwKKwkgMHg0RCwgMHgwMCwgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMiwgMHgyNiwgMHg0NiwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHgyNywgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhCNCwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHg0MiwgMHgwNiwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHgyNiwgMHg0NiwgMHg2MCwgMHg0NywKKwkgMHhGRiwgMHhCNSwgMHg2NSwgMHg0MSwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHgwMCwgMHg2NCwgMHhFOSwgMHg4MSwgMHhEOCwgMHg4NCwgMHhGRCwgMHgwMiwKKwkgMHhDOCwgMHg4NCwgMHg2MCwgMHg0MywgMHg0NCwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NywgMHhGRiwgMHhCNSwgMHgyNywgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhCNCwgMHhENCwgMHg4MCwgMHg2NCwgMHg0NCwgMHgwNiwgMHgwNiwgMHgwNywgMHhGMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NiwgMHgwRSwgMHhGQSwKKwkgMHgyNiwgMHg0NiwgMHgxOSwgMHgwMCwgMHgwMCwgMHg2MSwgMHgyNywgMHhGMCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg2MSwgMHg0MywgMHg0NSwgMHhEMywKKwkgMHg2NCwgMHg0MSwgMHhGRiwgMHhCMSwgMHg2MSwgMHg0NSwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwgMHhEQiwgMHg4MywgMHhENCwgMHg4MCwgMHg2MywgMHg0MSwKKwkgMHhGMywgMHgwMiwgMHhDQiwgMHg4MywgMHg2MywgMHg0MSwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwNywgMHhGMCwgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHg0NiwgMHgwRSwgMHhGQSwgMHgyNiwgMHg0NiwgMHhBRiwgMHg4NCwgMHhFOCwgMHg4MSwgMHgwNSwgMHgwMywgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwKKwkgMHhDRCwgMHg4MSwgMHhFMCwgMHg4NCwgMHhGRCwgMHgwMiwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGQSwgMHgyNiwgMHg0NiwgMHgyQSwgMHhGMiwgMHgzMiwgMHhGMCwKKwkgMHg2MCwgMHg0MCwgMHgwOCwgMHgyQSwgMHg1QywgMHgwMCwgMHgwMSwgMHgyQiwgMHgyRiwgMHgwMCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgyQywgMHgwMCwKKwkgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhGMCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwKKwkgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwKKwkgMHg4OCwgMHhGRiwgMHgxQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhGNiwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywKKwkgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QSwgMHhGRiwKKwkgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgyQiwgMHgwMCwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhFRSwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwKKwkgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgxQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwKKwkgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhGNCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywKKwkgMHgwNywgMHgwNSwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwKKwkgMHgwMCwgMHg2NCwgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgwNywgMHhGNCwKKwkgMHhGRiwgMHhGRiwgMHgyMiwgMHhGMiwgMHgyNiwgMHg0NiwgMHgwRiwgMHhCNCwgMHhEQywgMHg4NSwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhGMiwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwKKwkgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgyNywgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzQiwKKwkgMHgxMiwgMHgwMCwgMHg5OCwgMHhGMSwgMHgxRiwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwKKwkgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgxMywgMHgwMCwgMHgwMiwgMHgzQiwgMHgxMSwgMHgwMCwgMHg5OCwgMHhGMSwgMHgxRiwgMHg2MCwgMHgwMiwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwKKwkgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHhDQywgMHg2MCwgMHgwNiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhDNywgMHg2MCwgMHgzMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHhGMCwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHg3NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhDNywgMHg2MCwgMHgzMSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHhCRSwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGOCwgMHhGRSwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhDNywgMHg2MCwgMHgzMSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHg1OCwgMHg2MywgMHg2MCwgMHg0NywgMHgwMSwgMHgyNywgMHg2NCwgMHg2MywgMHgyNSwgMHg2MCwgMHgyNiwgMHg2MiwKKwkgMHg2MSwgMHg1QywgMHhBMiwgMHhEOSwgMHhCRCwgMHhEMCwgMHhCRCwgMHhEMCwgMHg2NCwgMHg0NSwgMHg2NCwgMHg0MSwgMHhCRCwgMHhEMCwgMHgwMCwgMHhGNCwKKwkgMHgwNCwgMHhGOCwgMHg4MywgMHhGQSwgMHg4MiwgMHhGOCwgMHhBNiwgMHg0NiwgMHgwMiwgMHhCMCwgMHg1RSwgMHg2MywgMHgwNCwgMHgwMywgMHg2NCwgMHg2MywKKwkgMHgwMywgMHhCMCwgMHgwMiwgMHgzQSwgMHg2QywgMHg2MywgMHgzRiwgMHhGMiwgMHhCRCwgMHhEMCwgMHhCRCwgMHhEMCwgMHg2NCwgMHg0NSwgMHg2NCwgMHg0MSwKKwkgMHhCRCwgMHhEMCwgMHhBNiwgMHg0NiwgMHgwNywgMHhGOCwgMHg4NiwgMHhGQSwgMHg4NSwgMHhGOCwgMHg2MCwgMHg0NywgMHgwOCwgMHhGQSwgMHgyNSwgMHg2MCwKKwkgMHgyNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgyNiwgMHg0NiwgMHg2NCwgMHg0MSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHgyQywgMHhGMCwKKwkgMHgzMSwgMHg0MCwgMHgyMCwgMHgyNiwgMHgwOSwgMHgwMCwgMHg2MCwgMHg0MCwgMHhBNCwgMHgzNiwgMHgyMSwgMHgwMCwgMHgwOCwgMHgyNiwgMHgwNywgMHgwMCwKKwkgMHg3RSwgMHhGMSwgMHhDQywgMHg2MCwgMHhDRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDQywgMHg2MCwgMHhGRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwKKwkgMHgwMSwgMHgyNiwgMHgxMiwgMHgwMCwgMHgzRiwgMHhGMCwgMHgzMiwgMHg0MCwgMHgxMCwgMHgyQSwgMHgwQSwgMHgwMCwgMHg2NCwgMHg0MSwgMHg2MCwgMHg0MCwKKwkgMHg0MCwgMHgyNywgMHgwNiwgMHgwMCwgMHhDRCwgMHg4MSwgMHhERCwgMHg4MSwgMHgwMywgMHgwMywgMHgwMiwgMHgwMywgMHgwMSwgMHg2MSwgMHgwMSwgMHgwMCwKKwkgMHgwMCwgMHg2MSwgMHg2MCwgMHg0MCwgMHgxOCwgMHgzQSwgMHgwMywgMHgwMCwgMHhDRCwgMHg2MCwgMHgzQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHhGMiwKKwkgMHg4OCwgMHhGMSwgMHg2NiwgMHg0NSwgMHhEMCwgMHg4MCwgMHg2MCwgMHg0NiwgMHgwNiwgMHhGMiwgMHg2NSwgMHg0NiwgMHgwMywgMHgwMywgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHgyNiwgMHgwNywgMHgwMCwgMHhEQSwgMHg2MCwgMHg1OCwgMHg0RiwgMHhEQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDRCwgMHg2MCwgMHgzNywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHhBNCwgMHgzQSwgMHgwNywgMHgwMCwgMHhERCwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHg0NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDRCwgMHg2MCwgMHgzNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHhDQiwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHhEOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHhGMiwgMHgwNiwgMHg2NSwgMHhENCwgMHg4MCwgMHg2MCwgMHg0MywgMHg1MiwgMHgwNCwgMHgwMCwgMHhGNCwKKwkgMHhBQSwgMHg2MCwgMHhBQSwgMHg2NSwgMHgwOSwgMHhGMiwgMHgwQSwgMHhGMCwgMHhENCwgMHg4MCwgMHgwMywgMHg2NCwgMHg0QSwgMHgwMiwgMHhEMCwgMHg4MCwKKwkgMHgwMCwgMHg2NCwgMHgwQiwgMHhGMCwgMHg0NiwgMHgwMiwgMHg2NCwgMHg0NSwgMHhENCwgMHg4MCwgMHhGOCwgMHg3RiwgMHgwOCwgMHgwMiwgMHgwQywgMHhGMCwKKwkgMHgyNiwgMHg0NiwgMHg2NCwgMHg0NSwgMHgyMywgMHhGMCwgMHgyMCwgMHg2NywgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHgwQiwgMHgwMCwgMHhENCwgMHg4MCwKKwkgMHgxRCwgMHg2MCwgMHg2MCwgMHg2NCwgMHgxMSwgMHgwMiwgMHgwQywgMHhGMCwgMHgyNiwgMHg0NiwgMHg2NCwgMHg0NSwgMHgyMywgMHhGMCwgMHg0MCwgMHg2NywKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHg2NSwgMHg0NCwgMHg4OCwgMHgzQSwgMHgyQywgMHgwMCwgMHg3NywgMHgzNywgMHgwMywgMHgwMCwgMHg3OCwgMHgzNywKKwkgMHgwMSwgMHgwMCwgMHg4RSwgMHgzNywgMHgwMCwgMHg2MSwgMHgyNSwgMHgwMCwgMHhENCwgMHg4MCwgMHgwOCwgMHg2NSwgMHgyMiwgMHgwMiwgMHhENywgMHg4MCwKKwkgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwQywgMHhGMCwgMHgxRCwgMHgwNCwgMHhEMCwgMHg4MCwgMHgwRCwgMHhGMCwgMHgxQSwgMHgwMiwgMHgyNiwgMHg0NiwKKwkgMHgxNCwgMHhGMiwgMHgwMSwgMHg2MywgMHgwMiwgMHhBOCwgMHg2NCwgMHg0NywgMHgxNCwgMHgwMywgMHg3RiwgMHhCNCwgMHhGRCwgMHhBMCwgMHgwNiwgMHgwMywKKwkgMHgxMCwgMHgwNywgMHgyMywgMHhGMCwgMHg2MCwgMHg2NywgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHg2QSwgMHgwMCwgMHhEMiwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHhCQywgMHhEMiwgMHhGQiwgMHhFNSwgMHg2MCwgMHg1OCwgMHg0RiwgMHg5NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDRCwgMHg2MCwgMHgzNywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHg2MSwgMHg0MCwgMHgwMSwgMHgyQSwgMHgxMiwgMHgwMCwgMHg5OCwgMHhGMSwgMHgxRiwgMHg2MCwgMHgwNiwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwKKwkgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHg3QywgMHgwMCwgMHhERCwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHg0NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg0OCwgMHgzNiwgMHg3MywgMHgwMCwKKwkgMHhDRCwgMHg2MCwgMHg1OCwgMHg0RiwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDRCwgMHg2MCwgMHgzNywgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwKKwkgMHgwQywgMHgyNiwgMHg2OSwgMHgwMCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHg2NiwgMHgwMCwgMHhCMCwgMHgzQSwgMHgwNSwgMHgwMCwgMHhEMSwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHg4MCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1QiwgMHgwMCwgMHgwMCwgMHgzQSwgMHgwNSwgMHgwMCwgMHhENCwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHhGMywgMHg3OCwgMHhGRiwgMHhGRiwgMHg1NCwgMHgwMCwgMHgyMCwgMHgzQSwgMHgwNSwgMHgwMCwgMHhENCwgMHg2MCwgMHg1OCwgMHg0RiwgMHhGMywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg0RCwgMHgwMCwgMHhDMCwgMHgzQSwgMHgwNSwgMHgwMCwgMHhEQSwgMHg2MCwgMHg1OCwgMHg0RiwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg0NiwgMHgwMCwgMHhBMCwgMHgzQSwgMHgwNSwgMHgwMCwgMHhEQSwgMHg2MCwgMHg1OCwgMHg0RiwgMHhBNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHgwMCwKKwkgMHg0MCwgMHgzQSwgMHgwRCwgMHgwMCwgMHhFMSwgMHg2MCwgMHg1OCwgMHg0RiwgMHgxMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzOCwgMHgwMCwgMHg2MCwgMHg0MCwKKwkgMHg1MCwgMHgzQSwgMHgwNSwgMHgwMCwgMHhFQSwgMHg2MCwgMHg1OCwgMHg0RiwgMHhGNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMCwgMHgwMCwgMHgzMywgMHgwMCwKKwkgMHhEMiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCQywgMHhEMiwgMHhGQiwgMHgyQSwgMHhGMiwgMHgzQiwgMHhGMCwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyQiwKKwkgMHgxOSwgMHgwMCwgMHgyMiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhCNCwgMHhGRiwgMHhGRiwgMHgxNCwgMHgwMywgMHhDMCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHg2NCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgwRiwgMHgwMCwgMHhBMCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgyMywgMHhGMiwKKwkgMHgxMCwgMHhCRCwgMHhCNCwgMHg5QywgMHgzRiwgMHhGMiwgMHgyMywgMHhGOCwgMHhGOCwgMHhBNCwgMHgzRiwgMHhGQSwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0NywKKwkgMHgwOCwgMHhGQSwgMHgyNiwgMHg0NiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHhCRSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGOCwgMHhGRSwgMHgwQywgMHgwMCwgMHg2NiwgMHg0NCwKKwkgMHgwMCwgMHhBOCwgMHhGRiwgMHhGRiwgMHgwQSwgMHgwMywgMHgyNiwgMHg0NiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHhGMCwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHg3NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhDQiwgMHg2MCwgMHhCOSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxNCwgMHhGMiwgMHgwMCwgMHg3QywgMHgzRSwgMHhGOCwgMHhDQywgMHg4NCwgMHhDQywgMHg4NCwgMHgxOSwgMHgwMywgMHg2MCwgMHgwMiwgMHgxMSwgMHhGMiwKKwkgMHgwNywgMHhGQSwgMHhBQywgMHhGMywgMHgxOSwgMHhGQSwgMHhDRCwgMHg2MCwgMHg1OCwgMHg0RSwgMHhFNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwKKwkgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg5QSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDOCwgMHhGRSwgMHhGMiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg0QSwgMHhEQiwgMHg3OSwgMHgwMCwgMHhBMiwgMHhGRiwKKwkgMHg0NiwgMHg0NSwgMHhCNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5MSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHhGRiwgMHgxMSwgMHgwMywgMHg3RSwgMHg2MywKKwkgMHg0NiwgMHg0QiwgMHgyNSwgMHg0NiwgMHhBMywgMHhEMCwgMHgyQiwgMHg0NiwgMHhBMywgMHhEOCwgMHhGQiwgMHgxRiwgMHg4OSwgMHhGQywgMHg4QSwgMHhGQywKKwkgMHg4OCwgMHhGQywgMHgwNSwgMHgxOCwgMHg2NCwgMHg0NiwgMHgwMSwgMHhGMCwgMHgxMCwgMHg2NywgMHhDMCwgMHg4NCwgMHgwMSwgMHhGQSwgMHgwOCwgMHhGRSwKKwkgMHgyQiwgMHg0NiwgMHg0NiwgMHg0NiwgMHgyNSwgMHg0NiwgMHhDRCwgMHg2MCwgMHg1OCwgMHg0RSwgMHhFNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwKKwkgMHg4RSwgMHg2MiwgMHhBMiwgMHhEMywgMHg4OCwgMHhGMywgMHgwMCwgMHhBOCwgMHgwNywgMHhGQSwgMHgwRiwgMHgwMywgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwKKwkgMHgxQiwgMHg2MCwgMHg5NCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNSwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHhGMywgMHg2NCwgMHgzQiwgMHg0MiwgMHg0QSwgMHhEQiwgMHgwRSwgMHgwMCwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwKKwkgMHg4OCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNSwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHhGNCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg0QSwgMHhEQiwgMHgyNiwgMHg0NCwgMHgwMCwgMHhBOCwgMHhDMSwgMHhGRSwgMHgzMSwgMHgwMywgMHhEMiwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgwMiwgMHhCQywgMHhEMiwgMHhGQiwgMHgyNiwgMHg0NiwgMHgyQSwgMHhGMiwgMHgzQiwgMHhGMCwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyQiwKKwkgMHgxOCwgMHgwMCwgMHg2NCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgxNSwgMHgwMCwgMHgyMiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhCNCwgMHhGRiwgMHhGRiwKKwkgMHgxMCwgMHgwMywgMHhDMCwgMHg2NywgMHhBMCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgyMywgMHhGMiwgMHgxMCwgMHhCRCwKKwkgMHhCNCwgMHg5QywgMHgzRiwgMHhGMiwgMHgyMywgMHhGOCwgMHhGOCwgMHhBNCwgMHgzRiwgMHhGQSwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0NywgMHgwOCwgMHhGQSwKKwkgMHgyNiwgMHg0NiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHhCRSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGOCwgMHhGRSwgMHhGMSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg0QSwgMHhEQiwKKwkgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHg4MiwgMHg2MCwgMHhGRiwgMHg2NSwgMHhBNCwgMHg4NywKKwkgMHgwMiwgMHhCRiwgMHgyQSwgMHhGQSwgMHgxQywgMHhGMiwgMHgxMywgMHhGQSwgMHgzMiwgMHhGMiwgMHgyQywgMHhGQSwgMHgzMywgMHhGMiwgMHgyRCwgMHhGQSwKKwkgMHgzNCwgMHhGMiwgMHgyRSwgMHhGQSwgMHgyRiwgMHhGMiwgMHgzMiwgMHhGQSwgMHgzMCwgMHhGMiwgMHgzMywgMHhGQSwgMHgzMSwgMHhGMiwgMHgzNCwgMHhGQSwKKwkgMHg2NywgMHhGMywgMHgyRiwgMHhGQSwgMHg2OCwgMHhGMywgMHgzMCwgMHhGQSwgMHg2OSwgMHhGMywgMHgzMSwgMHhGQSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhGOCwgMHg2MiwgMHhEMCwgMHg2MCwgMHg3QiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwKKwkgMHg2MiwgMHg2MywgMHgyMCwgMHg2MCwgMHgwMiwgMHg2MiwgMHhBMiwgMHhEMywgMHhBMywgMHhEQiwgMHgxRSwgMHg2MywgMHgxRiwgMHg2MCwgMHg2QywgMHg2MSwKKwkgMHgyMCwgMHg2MCwgMHgwQywgMHg2NCwgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHgxRiwgMHg2MCwgMHg4RSwgMHg2MywgMHgyMCwgMHg2MCwKKwkgMHgyRSwgMHg2MiwgMHhBMiwgMHhEMywgMHhBMywgMHhEQiwgMHgxRiwgMHg2MCwgMHg5MCwgMHg2MywgMHgyMCwgMHg2MCwgMHgzMCwgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHhBMywgMHhEQiwgMHgxRiwgMHg2MCwgMHg5QSwgMHg2MywgMHgyMCwgMHg2MCwgMHgzQSwgMHg2MiwgMHhBMiwgMHhEMywgMHhBMywgMHhEQiwgMHgxRiwgMHg2MCwKKwkgMHg5QywgMHg2MywgMHgyMCwgMHg2MCwgMHgzQywgMHg2MiwgMHhBMiwgMHhEMywgMHhBMywgMHhEQiwgMHgxRiwgMHg2MCwgMHg5RSwgMHg2MywgMHgyMCwgMHg2MCwKKwkgMHgzRSwgMHg2MiwgMHhBMiwgMHhEMywgMHhBMywgMHhEQiwgMHgxRiwgMHg2MCwgMHhBMCwgMHg2MywgMHgyMCwgMHg2MCwgMHg0MCwgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHhBMywgMHhEQiwgMHgxRiwgMHg2MCwgMHg5MiwgMHg2MywgMHgyMCwgMHg2MCwgMHgzMiwgMHg2MiwgMHhBMiwgMHhEMywgMHhBMywgMHhEQiwgMHgxRiwgMHg2MCwKKwkgMHg5NCwgMHg2MywgMHgyMCwgMHg2MCwgMHgzNCwgMHg2MiwgMHhBMiwgMHhEMywgMHhBMywgMHhEQiwgMHgxRiwgMHg2MCwgMHg5NiwgMHg2MywgMHgyMCwgMHg2MCwKKwkgMHgzNiwgMHg2MiwgMHhBMiwgMHhEMywgMHhBMywgMHhEQiwgMHgxRiwgMHg2MCwgMHhCNiwgMHg2MywgMHhCRCwgMHhEMSwgMHhDQiwgMHhGOSwgMHg2NywgMHhGOSwKKwkgMHhCRCwgMHhEMSwgMHhDQywgMHhGOSwgMHg2OCwgMHhGOSwgMHhBMywgMHhEMSwgMHhDRCwgMHhGOSwgMHg2OSwgMHhGOSwgMHgwMSwgMHg2NCwgMHg2QiwgMHhGQiwKKwkgMHgxRiwgMHg2MCwgMHhBOCwgMHg2MiwgMHhBMiwgMHhEMywgMHhDNCwgMHhGQiwgMHgwMCwgMHg2MywgMHg0QSwgMHhGRCwgMHg1QSwgMHhGRCwgMHg2QywgMHhGRCwKKwkgMHg2RCwgMHhGRCwgMHgyMSwgMHg2MCwgMHg4MiwgMHg2NCwgMHhBMCwgMHhEMywgMHhFQSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3OCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyMSwgMHg2MCwgMHg4MCwgMHg2NCwgMHhBMCwgMHhEMSwgMHgxRiwgMHg2MCwgMHg5MiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHg2MCwgMHhFNywgMHg2NSwKKwkgMHgzMiwgMHg0MSwgMHhBNSwgMHg4MSwgMHhGRiwgMHhBMCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHgwQiwgMHgwMCwgMHgwOCwgMHg2NSwgMHhCNSwgMHg4MSwKKwkgMHgxRiwgMHg2MCwgMHg5NiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMiwgMHgwMCwgMHgxMCwgMHg2NSwKKwkgMHhCNSwgMHg4MSwgMHg0MSwgMHg1MiwgMHg4OCwgMHhGNSwgMHgzMiwgMHg0NCwgMHgxMCwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwQiwgMHgwMywgMHgyMSwgMHg2MCwKKwkgMHgyQywgMHg2MiwgMHhBMiwgMHhEMywgMHgwNiwgMHhGMCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHg4MCwgMHhCRiwKKwkgMHhCMCwgMHg4NCwgMHgwNiwgMHhGQSwgMHgxRiwgMHg2MCwgMHg5MiwgMHg2MiwgMHhBMiwgMHhEMywgMHgyMiwgMHg3QywgMHhGRiwgMHhBMCwgMHhGRCwgMHhBMCwKKwkgMHgwNSwgMHgwNiwgMHgwMywgMHgwMywgMHhGRSwgMHhBMCwgMHgwNCwgMHg3QywgMHgwMSwgMHgwMiwgMHgzNiwgMHhGOCwgMHgwRSwgMHhGMCwgMHgwRiwgMHg2MCwKKwkgMHhBMiwgMHg2NSwgMHgyMCwgMHg2MCwgMHgzOCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhBMCwgMHgwMywgMHhBOCwgMHgxMSwgMHgwNiwKKwkgMHg1RiwgMHhGMSwgMHgwNiwgMHgwMiwgMHg2NCwgMHg0NCwgMHgwOCwgMHgyQSwgMHgwOSwgMHgwMCwgMHgwNiwgMHg2NCwgMHg0NCwgMHhEMywgMHgwRCwgMHgwMCwKKwkgMHg2NCwgMHg0NCwgMHgyMCwgMHgyQSwgMHgwMywgMHgwMCwgMHgwQSwgMHg2NCwgMHg0NCwgMHhEMywgMHgwNywgMHgwMCwgMHgwMSwgMHg2NCwgMHg0NCwgMHhEMywKKwkgMHgwNCwgMHgwMCwgMHhFOCwgMHg4NCwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHgwMCwgMHgwMCwgMHgwRSwgMHhGQSwgMHgxRiwgMHg2MCwgMHg5RSwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCNSwgMHg2NCwgMHg0MSwgMHgwMCwgMHhCOSwgMHhENCwgMHg4NCwgMHgwOCwgMHgyOCwgMHgyMCwgMHhCQywKKwkgMHg0MCwgMHg0MCwgMHgxMSwgMHg2MCwgMHhGMCwgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhCOCwgMHgxMCwgMHg2MCwgMHgwQywgMHg2NSwKKwkgMHgwRCwgMHgwMywgMHgxMSwgMHg2MCwgMHhGOCwgMHg2MywgMHhDNSwgMHhGMywgMHhBMywgMHhEMSwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NCwgMHhBMCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhDNSwgMHhGOSwgMHg2NSwgMHhGOSwgMHhDNSwgMHhGMywgMHgwMSwgMHg2MSwKKwkgMHhDQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywgMHhFMSwgMHg4MSwgMHhGQiwgMHgwMSwgMHg5QSwgMHhGMywgMHg2MSwgMHg0NSwgMHhBNCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwQiwgMHgwMiwgMHgwMCwgMHhCOCwgMHgwMSwgMHg2MywgMHgwOCwgMHgwMywgMHhFOCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgyNCwKKwkgMHgwMiwgMHgwMCwgMHhERiwgMHg4MywgMHhGQSwgMHgwMSwgMHhDNSwgMHhGRCwgMHg2NSwgMHhGRCwgMHgwQSwgMHg2NCwgMHgyNSwgMHg2MCwgMHgxRSwgMHg2MywKKwkgMHhBMywgMHhEQiwgMHgwMSwgMHg2NCwgMHgyNSwgMHg2MCwgMHgyMCwgMHg2MywgMHhBMywgMHhEQiwgMHhCNiwgMHhGMSwgMHgwOSwgMHg2MCwgMHgyQSwgMHg2NCwKKwkgMHhEMCwgMHg4MCwgMHgwMywgMHg2NCwgMHgwMSwgMHgwNiwgMHgwNiwgMHg2NCwgMHhCMCwgMHhGQiwgMHgwRiwgMHg2MCwgMHhENiwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHg2MCwgMHgwNSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhENiwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NSwgMHhGMSwgMHgxQywgMHg2MCwgMHgwMCwgMHg2MiwgMHhBMiwgMHhEOSwgMHgwOCwgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHg2MCwKKwkgMHgyRCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhENiwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhDRSwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyMCwgMHg0NCwgMHgwMSwgMHg2NSwgMHgzNCwgMHg4MCwgMHgxRiwgMHg2MCwgMHhBNiwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhDMywgMHhGQiwgMHg2MCwgMHg0MCwgMHgwNSwgMHgzQSwgMHgwMywgMHgwMCwgMHhFQiwgMHg2MCwgMHgxQSwgMHg2MSwgMHgxMSwgMHgwMCwgMHgwNCwgMHgzQSwKKwkgMHgwMywgMHgwMCwgMHhFQiwgMHg2MCwgMHgwRSwgMHg2MSwgMHgwQywgMHgwMCwgMHgwMywgMHgzQSwgMHgwMywgMHgwMCwgMHhFQiwgMHg2MCwgMHgwMiwgMHg2MSwKKwkgMHgwNywgMHgwMCwgMHgwMiwgMHgzQSwgMHgwMywgMHgwMCwgMHhFQSwgMHg2MCwgMHhGNiwgMHg2MSwgMHgwMiwgMHgwMCwgMHhFQSwgMHg2MCwgMHhFQSwgMHg2MSwKKwkgMHgzRSwgMHg2MCwgMHgwMCwgMHg2NiwgMHgwMSwgMHg2MCwgMHg3OCwgMHg2NCwgMHgwQSwgMHg2MywgMHg1OSwgMHhEMCwgMHg1OCwgMHhEOSwgMHhGRCwgMHgxRiwKKwkgMHgwMCwgMHg2NiwgMHhDNCwgMHhGMywgMHg2MCwgMHg0MSwgMHgwMCwgMHhBOCwgMHhGQSwgMHhBMSwgMHgwMSwgMHgwMywgMHhBMSwgMHhEQiwgMHgwMSwgMHg2MCwKKwkgMHg3QSwgMHg2MywgMHgxNiwgMHg2MCwgMHhDNCwgMHg2MSwgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMCwgMHg3RiwgMHhBMSwgMHhEQiwgMHhCRCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgyMSwgMHg3RiwgMHg1OSwgMHhEQiwgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgyMiwgMHg3RiwgMHg1OSwgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHhENiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHg0MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHg2MCwgMHg3NywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgxQywgMHg2MCwgMHgwMCwgMHg2MiwgMHgxNiwgMHg2MCwgMHhDMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHg2MCwgMHg5QywgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhENiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHg2NSwgMHhGMSwgMHgxQywgMHg2MCwgMHgwMCwgMHg2MiwgMHhBMiwgMHhEOSwgMHgwOCwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHg2MCwgMHhCMywgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhENiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhCRSwgMHhGRSwKKwkgMHgwRiwgMHg2MCwgMHhDRSwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyMCwgMHg0MCwgMHgyMCwgMHgyQSwgMHgwNCwgMHgwMCwgMHhFQiwgMHg2MCwgMHg1OCwgMHg0RSwgMHgxNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhENiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg0RSwgMHhGMywgMHhGRiwgMHhGRiwgMHgxMywgMHgxQiwgMHgxRiwgMHg2MCwgMHhBRSwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHhDNywgMHhGQiwgMHgxRiwgMHg2MCwgMHgxRSwgMHg2NSwgMHgxRiwgMHg2MCwgMHhCQywgMHg2MSwgMHgxRiwgMHg2MCwgMHgxQywgMHg2NCwKKwkgMHgyMCwgMHg2MywgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOSwgMHhBNSwgMHhEOSwgMHhEQSwgMHg4NSwgMHhGQiwgMHgxRiwgMHhEMCwgMHg2MCwgMHg2MiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyMCwgMHg2MCwgMHg0MCwgMHg2MywgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NSwgMHhDNCwgMHg4NSwgMHhDNywgMHg4MywgMHhGRSwgMHhBNSwKKwkgMHg4OSwgMHhGMywgMHhGRiwgMHhGRiwgMHhDNCwgMHg4NCwgMHg2NiwgMHg0NSwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MSwgMHhCRCwgMHhEMSwgMHgwMywgMHhGOCwKKwkgMHhCRCwgMHhEMSwgMHgwNCwgMHhGOCwgMHhBMywgMHhEMSwgMHgwNSwgMHhGOCwgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMiwgMHg3RSwgMHgwNiwgMHhGQSwKKwkgMHg1RiwgMHhGMywgMHg2MCwgMHhGQiwgMHg3MywgMHhGMCwgMHg2MywgMHhGOSwgMHg2NiwgMHg0MywgMHgyMSwgMHg2MCwgMHgyQywgMHg2MiwgMHgzMiwgMHg0MCwKKwkgMHgwOCwgMHgyQSwgMHgwOSwgMHgwMCwgMHhBMiwgMHhEMywgMHgwNiwgMHhGMCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwKKwkgMHg4MCwgMHhCRiwgMHhCMCwgMHg4NCwgMHgwNiwgMHhGQSwgMHg2MywgMHg0NCwgMHg2MywgMHhGMywgMHg2MCwgMHg0NSwgMHg2NiwgMHg0MSwgMHg2NSwgMHg0NiwKKwkgMHg4QywgMHhGQSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwNiwgMHgwMCwgMHgwMiwgMHgzNiwgMHgwNCwgMHgwMCwgMHgwNCwgMHgzNiwgMHgwMiwgMHgwMCwKKwkgMHgwNSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwMSwgMHgwMCwgMHgwMSwgMHg2NCwgMHg2RiwgMHhGQSwgMHg1RiwgMHhGMywgMHg2MCwgMHhGMSwKKwkgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwgMHg2NSwgMHg0MywgMHgwMiwgMHgwMiwgMHg1RiwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgwRiwgMHg2MCwKKwkgMHhBRSwgMHg2NSwgMHg2MywgMHhGMywgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2MSwgMHg0NSwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgwMiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwgMHg2MSwgMHhGQiwgMHg2RiwgMHhGMCwKKwkgMHg2MCwgMHg0NywgMHg5MCwgMHg4NCwgMHg2RiwgMHhGQSwgMHg2MCwgMHg0NywgMHg2MCwgMHg0NSwgMHg4MCwgMHg2NCwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwgMHg3MCwgMHhGMCwgMHg3MCwgMHhGQSwgMHgwMCwgMHg2MSwgMHhFOCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHgwNSwgMHhERCwgMHg4MSwgMHhGQiwgMHgwMSwgMHhFMSwgMHg4MSwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwKKwkgMHg2NiwgMHg0MywgMHgwQywgMHhGNCwgMHhDNSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhENiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHhEOCwgMHg2MiwgMHgwMCwgMHg2MCwgMHgzMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHg2MCwgMHhDNywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg0RSwgMHhERiwgMHg2MCwgMHg1OCwgMHg0RiwgMHgxMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwKKwkgMHgwRiwgMHg0RSwgMHhEQywgMHg2MCwgMHg1OCwgMHg0RiwgMHg2QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwgMHgwRiwgMHg0RSwgMHhEQiwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHhFOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwgMHgwRiwgMHg0RSwgMHhEQiwgMHg2MCwgMHg1OCwgMHg0RiwgMHg0MiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwgMHhENywgMHgwMSwgMHg0RSwgMHhGMywgMHg3RSwgMHhGNSwgMHg2MCwgMHg0MCwgMHhGRiwgMHgyMiwgMHgwQSwgMHgwMCwKKwkgMHg4OSwgMHhGMSwgMHhDQywgMHg4NCwgMHhFMCwgMHg4NCwgMHhDMCwgMHg4NiwgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RSwgMHgwNiwgMHhGQSwKKwkgMHg3RSwgMHhGNSwgMHgwOCwgMHgwMCwgMHgwRiwgMHg2MCwgMHhGNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgxMSwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHg0RSwgMHhGMywgMHg2NiwgMHg0MCwgMHhGRiwgMHgyMiwgMHgwNSwgMHgwMCwgMHhGRiwgMHgyMiwgMHgzNywgMHgwMCwKKwkgMHhEMSwgMHg2MCwgMHgzMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2NCwgMHg2QSwgMHhGQiwgMHhGRiwgMHhGRiwgMHhDMSwgMHhGRSwgMHg2QSwgMHhGMywKKwkgMHgwMCwgMHg2NSwgMHhENCwgMHg4MCwgMHg0RSwgMHhGMywgMHgwRiwgMHgwMywgMHgwRiwgMHg2MCwgMHhENiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhEMCwgMHg2MCwgMHg5RiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhENiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwKKwkgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhEMCwgMHg2MCwgMHhCMywgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHgwMCwgMHg2MiwgMHgwNiwgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgyMCwgMHg0NCwgMHgwMSwgMHhCNSwgMHg1NCwgMHg4MCwgMHhEQSwgMHhGRSwgMHhCRSwgMHhGRSwgMHg4OCwgMHhGMSwKKwkgMHgwMiwgMHg2NCwgMHg4NywgMHhGMywgMHhDMCwgMHg4MywgMHg0MCwgMHg0OCwgMHg3NiwgMHhGRCwgMHhFNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5RCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyOCwgMHg0NCwgMHg0QywgMHg4OCwgMHg3NiwgMHhGMywgMHgwMiwgMHg2NSwgMHhDNCwgMHg4MywgMHhGNSwgMHgwMiwgMHhBMiwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHgwMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxNCwgMHg2MCwgMHhEMCwgMHg2MiwgMHgxNCwgMHg2MCwgMHhEMiwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwMCwgMHg2NCwgMHg0QSwgMHhEQiwgMHgwMSwgMHg2MCwgMHhGRSwgMHg2MywgMHgxMiwgMHg2MCwgMHhDQywgMHg2MSwgMHgwMCwgMHg2NCwgMHg1OSwgMHhEQiwKKwkgMHhGRSwgMHgxRiwgMHg3RSwgMHhGMSwgMHgxQiwgMHg2MCwgMHg5QSwgMHg2MSwgMHg2NCwgMHg0MCwgMHhGRiwgMHgyNiwgMHgzOSwgMHgwMCwgMHhEMSwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHgzMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwgMHg4OCwgMHg2MSwgMHhEMSwgMHg2MCwgMHg1OCwgMHg0RSwgMHgzMywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2MSwgMHhEMSwgMHg2MCwgMHg1OCwgMHg0RSwgMHgzMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwKKwkgMHhBMCwgMHg2MSwgMHhEMSwgMHg2MCwgMHg1OCwgMHg0RSwgMHgzMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwgMHhBNiwgMHg2MSwgMHhEMSwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHgzMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwgMHhCMiwgMHg2MSwgMHhEMSwgMHg2MCwgMHg1OCwgMHg0RSwgMHgzMywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwgMHhCRSwgMHg2MSwgMHhEMSwgMHg2MCwgMHg1OCwgMHg0RSwgMHgzMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwKKwkgMHhBQywgMHg2MSwgMHhEMSwgMHg2MCwgMHg1OCwgMHg0RSwgMHgzMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwgMHg5NCwgMHg2MSwgMHhEMSwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHg1RiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhENiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwKKwkgMHhDNSwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhBMSwgMHhEMywgMHgwRSwgMHg1NywgMHgyNCwgMHgwMCwgMHgwRSwgMHhGMiwgMHg0NCwgMHg0QywKKwkgMHg4MCwgMHhCMCwgMHgxMCwgMHhCMCwgMHgwQiwgMHgwMywgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgxMywgMHgwMCwgMHgxMiwgMHgwMiwgMHhGMCwgMHgzNywKKwkgMHgwOSwgMHgwMCwgMHgwMiwgMHhGMCwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2NCwgMHhEMCwgMHg4MCwgMHhBMiwgMHhGRiwgMHg5MCwgMHhGMywgMHgwMiwgMHgwMiwKKwkgMHhDQywgMHg4NCwgMHg5MCwgMHhGQiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHhGMCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyQywgMHg0NCwgMHhBQywgMHg4NiwgMHgwOSwgMHhGMCwgMHhEOSwgMHgwMiwgMHgzNywgMHg1OCwgMHhGRiwgMHhGRiwgMHhBMSwgMHhEMywKKwkgMHgwRSwgMHg1NywgMHgxOSwgMHgwMCwgMHgwRSwgMHhGMiwgMHg0NCwgMHg0QywgMHg4MCwgMHhCMCwgMHgxMCwgMHhCMCwgMHgwQiwgMHgwMywgMHgxQiwgMHg2MCwKKwkgMHhEQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHgwOCwgMHgwMCwgMHgwNywgMHgwMiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHhGMCwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHg3NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQywgMHg0NCwgMHhBQywgMHg4NiwgMHgwOSwgMHhGMCwgMHhFNCwgMHgwMiwgMHgzNywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHhCMCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgyRiwgMHhGMiwgMHgyQywgMHhGQSwgMHgzMCwgMHhGMiwKKwkgMHgyRCwgMHhGQSwgMHgzMSwgMHhGMiwgMHgyRSwgMHhGQSwgMHhDQiwgMHhGMywgMHgyRiwgMHhGQSwgMHhDQywgMHhGMywgMHgzMCwgMHhGQSwgMHhDRCwgMHhGMywKKwkgMHgzMSwgMHhGQSwgMHg2NywgMHhGMywgMHgzMiwgMHhGQSwgMHg2OCwgMHhGMywgMHgzMywgMHhGQSwgMHg2OSwgMHhGMywgMHgzNCwgMHhGQSwgMHhBQywgMHhGMSwKKwkgMHgxOSwgMHhGOCwgMHgwNiwgMHg2MywgMHgzRiwgMHhGQywgMHgxQywgMHhGMiwgMHgxMywgMHhGQSwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgwNywgMHhGMiwKKwkgMHg4OCwgMHhGMSwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwQywgMHgwMywgMHg2MCwgMHg0NiwgMHgwNiwgMHhGMiwgMHgyNiwgMHg0NiwKKwkgMHgwMSwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwgMHhEMywgMHg2MCwgMHg2NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhENCwgMHg2MCwgMHhCQSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHhGNCwgMHgwQSwgMHhGMiwgMHgwOSwgMHhGMiwgMHhGRiwgMHhBMCwgMHgwMCwgMHhBMCwgMHgxMywgMHgwMiwgMHhGRiwgMHhBMCwKKwkgMHgwNCwgMHgwMywgMHgwOCwgMHgwMywgMHhEMSwgMHg2MCwgMHhENSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2NCwgMHg1NSwgMHhGQiwgMHhEMSwgMHg2MCwKKwkgMHhFMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2MywgMHgzMiwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwRiwgMHgwMCwgMHg1NSwgMHhGRCwgMHhEMSwgMHg2MCwKKwkgMHhFMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgwMCwgMHhGNCwgMHgwQSwgMHhGMiwgMHgwRSwgMHg2MywgMHgwMSwgMHhBNCwgMHgwQSwgMHhGQSwKKwkgMHgwQiwgMHhGQywgMHg0MywgMHg1OSwgMHhENCwgMHg2MCwgMHg5MywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgwMCwgMHhGNCwgMHgwQSwgMHhGMiwKKwkgMHgwRCwgMHg2MywgMHgwMSwgMHhBNCwgMHgwQSwgMHhGQSwgMHgwQiwgMHhGQywgMHg0MywgMHg1OSwgMHhENCwgMHg2MCwgMHg5MywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg4OCwgMHhGNSwgMHgwMCwgMHhGMiwgMHgyNiwgMHg0NiwgMHgwMCwgMHhBMCwgMHgyRSwgMHhGMCwgMHgzNywgMHgwMywgMHg2NiwgMHg0MSwgMHgxMiwgMHg2MCwKKwkgMHhDRSwgMHg2NSwgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHg4OCwgMHhGMSwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NCwgMHg0MywgMHgxMSwgMHgxOCwKKwkgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGQywgMHgxQiwgMHg2NiwgMHg0NCwgMHg2NCwgMHg0NiwgMHg4MCwgMHhGMCwgMHg2MCwgMHg0NiwKKwkgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHg2NSwgMHg0MywgMHg4MCwgMHhGMCwgMHgwMSwgMHhGQSwgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwKKwkgMHgwQiwgMHgwMCwgMHg2NCwgMHg0NiwgMHg2MiwgMHg0MywgMHgwMCwgMHhGMiwgMHhBMywgMHhEQiwgMHg2MCwgMHg0NiwgMHg4MCwgMHhGMCwgMHg4MSwgMHhGQywKKwkgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHg4NywgMHhGMSwgMHgxNCwgMHg2MCwgMHhDRSwgMHg2MSwKKwkgMHhBMSwgMHhEMywgMHhEQSwgMHg4MSwgMHhEMCwgMHg4MCwgMHhEQywgMHg5QywgMHgwNSwgMHgwNSwgMHhBMSwgMHhEMywgMHg0QSwgMHhEOSwgMHhBMCwgMHhERCwKKwkgMHhEQSwgMHg5QywgMHhBMSwgMHhEOSwgMHhEMywgMHg2MCwgMHgyRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxNCwgMHg2MCwgMHhDRSwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHg2MiwgMHgxOCwgMHgxNCwgMHg2MCwgMHhDRSwgMHg2NCwgMHgwNCwgMHhBNSwgMHhBMCwgMHhEMSwgMHg3MiwgMHg0NCwgMHhGRiwgMHhCNCwKKwkgMHg2NCwgMHg0MCwgMHhFMCwgMHgyMiwgMHgxRiwgMHhCNCwgMHg2NCwgMHg0MCwgMHhGOCwgMHgyMiwgMHgwNywgMHhCNCwgMHgwMiwgMHgwMCwgMHgwMywgMHgwNCwKKwkgMHhEMCwgMHg4NCwgMHhEMCwgMHg4MCwgMHhGQywgMHgwMSwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MywgMHg2NiwgMHg0MSwKKwkgMHg2MywgMHg0NiwgMHgwNSwgMHhGMiwgMHgwMCwgMHhGMCwgMHg4MSwgMHhGMCwgMHgwMiwgMHgxOCwgMHg2NCwgMHg0NiwgMHg4MSwgMHhGOCwgMHgwNywgMHgxQiwKKwkgMHgxMiwgMHg2MCwgMHhDRSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEOSwgMHgwMiwgMHgwMCwgMHg2NSwgMHg0NiwKKwkgMHgwMCwgMHhGOCwgMHg4OCwgMHhGMywgMHg2MywgMHg0NSwgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhENCwgMHg4MCwgMHgwMSwgMHgxOCwKKwkgMHhGQSwgMHgwNCwgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGQSwgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RSwgMHgwNiwgMHhGQSwKKwkgMHg2MSwgMHg0NiwgMHgyRSwgMHhGMCwgMHg2NiwgMHg0MSwgMHgxMiwgMHg2MCwgMHhDRSwgMHg2NSwgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHg4OCwgMHhGMSwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NCwgMHg0MywgMHgxMSwgMHgxOCwgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGQywgMHgxQiwKKwkgMHg2NiwgMHg0NCwgMHg2NCwgMHg0NiwgMHg4MCwgMHhGMCwgMHg2MCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHg2NSwgMHg0MywgMHg4MCwgMHhGMCwKKwkgMHgwMSwgMHhGQSwgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwgMHgwQiwgMHgwMCwgMHg2NCwgMHg0NiwgMHg2MiwgMHg0MywgMHgwMCwgMHhGMiwKKwkgMHhBMywgMHhEQiwgMHg2MCwgMHg0NiwgMHg4MCwgMHhGMCwgMHg4MSwgMHhGQywgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2MCwgMHg0MywKKwkgMHg2MSwgMHg0NiwgMHhEMywgMHg2MCwgMHgyRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2MSwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwgMHg4NywgMHhGMSwgMHg3MiwgMHg0NCwgMHhGRiwgMHhCNCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNCwKKwkgMHhEMCwgMHg4NCwgMHhGQiwgMHgwMSwgMHhFMCwgMHg4MywgMHg4OCwgMHhGMywgMHgwMiwgMHhBMywgMHg0MywgMHg5MywgMHg2NiwgMHg0NCwgMHgwMCwgMHhBOCwKKwkgMHg1NiwgMHhGRCwgMHgzNywgMHgwMywgMHgwMCwgMHg2NCwgMHgyQiwgMHhGQSwgMHgwMCwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyQSwgMHhGQSwgMHg2NiwgMHg0NSwKKwkgMHg2MywgMHg0NiwgMHgwMywgMHhGMiwgMHgwNCwgMHhGMCwgMHg4NSwgMHhGMiwgMHg2NSwgMHg0NiwgMHgyQywgMHhGQSwgMHgyRCwgMHhGOCwgMHhBRSwgMHhGQSwKKwkgMHhDQiwgMHhGMywgMHgyRiwgMHhGQSwgMHgzMiwgMHhGQSwgMHhDQywgMHhGMywgMHgzMCwgMHhGQSwgMHgzMywgMHhGQSwgMHhDRCwgMHhGMywgMHgzMSwgMHhGQSwKKwkgMHgzNCwgMHhGQSwgMHhBQywgMHhGMSwgMHgxOSwgMHhGOCwgMHhGRiwgMHg2NywgMHgwRSwgMHhGQSwgMHg2NiwgMHg0NSwgMHg2MywgMHg0NiwgMHgwRSwgMHhGMiwKKwkgMHg2NSwgMHg0NiwgMHgwMiwgMHg2MywgMHgwMCwgMHg3RSwgMHgxMywgMHhGQSwgMHgzRiwgMHhGQywgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHg4OCwgMHhGMywKKwkgMHgwNywgMHhGQSwgMHg2NiwgMHg0MSwgMHgwMCwgMHhGNCwgMHgwNSwgMHg2NCwgMHgwOSwgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwKKwkgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2MSwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHhDMSwgMHhGRSwgMHg1NiwgMHhGMywgMHhBMywgMHhGRiwgMHg2MCwgMHg0MywgMHhFNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5RCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg1NiwgMHhGMywgMHhGRiwgMHhGRiwgMHg0MCwgMHg1OCwgMHgwMywgMHg2NSwgMHhFMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg4NiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg1NiwgMHhGMywgMHgyNiwgMHg0NiwgMHg2MCwgMHg0MywgMHg2NiwgMHg0MSwgMHg2MywgMHg0NiwgMHgwNSwgMHhGMiwgMHgwMCwgMHhGMCwgMHg4MSwgMHhGMCwKKwkgMHgwMiwgMHgxOCwgMHg2NCwgMHg0NiwgMHg4MSwgMHhGOCwgMHgwNywgMHgxQiwgMHgxMiwgMHg2MCwgMHhDRSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEOSwgMHgwMiwgMHgwMCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGOCwgMHg4OCwgMHhGMywgMHg2MywgMHg0NSwgMHg2MCwgMHg0NiwKKwkgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhENCwgMHg4MCwgMHgwMSwgMHgxOCwgMHhGQSwgMHgwNCwgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGQSwKKwkgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RSwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgyRSwgMHhGMCwgMHg2NiwgMHg0MSwgMHgxMiwgMHg2MCwKKwkgMHhDRSwgMHg2NSwgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHg4OCwgMHhGMSwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NCwgMHg0MywgMHgxMSwgMHgxOCwKKwkgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGQywgMHgxQiwgMHg2NiwgMHg0NCwgMHg2NCwgMHg0NiwgMHg4MCwgMHhGMCwgMHg2MCwgMHg0NiwKKwkgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHg2NSwgMHg0MywgMHg4MCwgMHhGMCwgMHgwMSwgMHhGQSwgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwKKwkgMHgwQiwgMHgwMCwgMHg2NCwgMHg0NiwgMHg2MiwgMHg0MywgMHgwMCwgMHhGMiwgMHhBMywgMHhEQiwgMHg2MCwgMHg0NiwgMHg4MCwgMHhGMCwgMHg4MSwgMHhGQywKKwkgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHgyQywgMHhGMiwgMHgyRCwgMHhGMCwgMHhBRSwgMHhGMiwKKwkgMHg2NiwgMHg0NSwgMHg2MywgMHg0NiwgMHgwMywgMHhGQSwgMHgwNCwgMHhGOCwgMHg1NSwgMHhGMywgMHg4NSwgMHhGQSwgMHhGRiwgMHhBMCwgMHg2NSwgMHg0NiwKKwkgMHgwMywgMHgwMywgMHhENCwgMHg2MCwgMHhENiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg5NSwgMHhGMywgMHg2NiwgMHg0NSwgMHg2MywgMHg0NiwgMHgxQiwgMHhGQSwKKwkgMHg2NSwgMHg0NiwgMHhCQSwgMHg2NSwgMHg2MCwgMHg0NCwgMHhDNCwgMHg4NSwgMHgwMSwgMHg2MCwgMHhGRSwgMHg2MSwgMHgwMCwgMHg2NCwgMHg4MCwgMHg2MywKKwkgMHhDNywgMHg4NSwgMHg5NCwgMHg4NCwgMHg1OSwgMHhEQiwgMHhGQywgMHgxRiwgMHgwMCwgMHg2MCwgMHg4OCwgMHg2NCwgMHgzRiwgMHhGQSwgMHgwMCwgMHhGNCwKKwkgMHgwMiwgMHg2NCwgMHgwQSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgwQiwgMHhGQSwgMHg4MCwgMHg3RiwgMHgxMCwgMHg3RSwgMHgwQywgMHhGQSwgMHgxQSwgMHg2NSwKKwkgMHg4MCwgMHg2MSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHgwRiwgMHg0RSwgMHhGMiwgMHg2MCwgMHg1OCwgMHg0RiwgMHg0QSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwRSwgMHg0RiwgMHhENCwgMHg2MCwgMHhBNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgyMywgMHhGMCwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHgwMCwgMHhGNCwgMHgwMywgMHgwMywgMHhENCwgMHg2MCwgMHg1MCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOSwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhBMCwgMHgwMCwgMHhBMCwgMHgwQywgMHgwMywgMHgwMywgMHgwMywgMHhEMywgMHg2MCwgMHhDQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQSwgMHhGMiwKKwkgMHgyNiwgMHg0NiwgMHhGRiwgMHhBMCwgMHg4NywgMHhGNCwgMHgxMCwgMHgwMiwgMHhENCwgMHg2MCwgMHhENiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQSwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHhBMCwgMHhGRCwgMHhBMCwgMHgwMiwgMHgwMywgMHgwNCwgMHgwMywgMHgwNiwgMHgwMCwgMHhENCwgMHg2MCwgMHgwQywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhENCwgMHg2MCwgMHgxNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHg4NywgMHhGNCwgMHg2NiwgMHg0MSwgMHg2MywgMHg0NiwKKwkgMHgwNSwgMHhGMiwgMHgwMCwgMHhGMCwgMHg4MSwgMHhGMCwgMHgwMiwgMHgxOCwgMHg2NCwgMHg0NiwgMHg4MSwgMHhGOCwgMHgwNywgMHgxQiwgMHgxMiwgMHg2MCwKKwkgMHhDRSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEOSwgMHgwMiwgMHgwMCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGOCwKKwkgMHg4OCwgMHhGMywgMHg2MywgMHg0NSwgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhENCwgMHg4MCwgMHgwMSwgMHgxOCwgMHhGQSwgMHgwNCwKKwkgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGQSwgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RSwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwKKwkgMHgxNCwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMywgMHhEQSwgMHg4MSwgMHg2MCwgMHg0NSwgMHhENSwgMHg4MCwgMHhBMSwgMHhEMSwgMHgxMSwgMHgwMywKKwkgMHhEMywgMHg4MCwgMHhEOSwgMHg4MSwgMHhGQSwgMHgwMiwgMHhDOSwgMHg4MSwgMHhDOCwgMHg4NSwgMHhENSwgMHg4MCwgMHhBNSwgMHhEMywgMHgwOCwgMHgyOCwKKwkgMHhBMSwgMHhEQiwgMHgxNCwgMHg2MCwgMHhEMCwgMHg2MiwgMHg2NSwgMHg0NCwgMHhBMiwgMHhEQiwgMHg0QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhEMSwgMHg2MCwgMHhDQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHg4NywgMHhGNCwgMHg2NiwgMHg0MSwgMHg2MywgMHg0NiwKKwkgMHgwNSwgMHhGMiwgMHgwMCwgMHhGMCwgMHg4MSwgMHhGMCwgMHgwMiwgMHgxOCwgMHg2NCwgMHg0NiwgMHg4MSwgMHhGOCwgMHgwNywgMHgxQiwgMHgxMiwgMHg2MCwKKwkgMHhDRSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEOSwgMHgwMiwgMHgwMCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGOCwKKwkgMHg4OCwgMHhGMywgMHg2MywgMHg0NSwgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhENCwgMHg4MCwgMHgwMSwgMHgxOCwgMHhGQSwgMHgwNCwKKwkgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGQSwgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RSwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwKKwkgMHgxNCwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMywgMHhEQSwgMHg4MSwgMHg2MCwgMHg0NSwgMHhENSwgMHg4MCwgMHhBMSwgMHhEMSwgMHgxMSwgMHgwMywKKwkgMHhEMywgMHg4MCwgMHhEOSwgMHg4MSwgMHhGQSwgMHgwMiwgMHhDOSwgMHg4MSwgMHhDOCwgMHg4NSwgMHhENSwgMHg4MCwgMHhBNSwgMHhEMywgMHgwOCwgMHgyOCwKKwkgMHhBMSwgMHhEQiwgMHgxNCwgMHg2MCwgMHhEMCwgMHg2MiwgMHg2NSwgMHg0NCwgMHhBMiwgMHhEQiwgMHg0QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhEMSwgMHg2MCwgMHhENSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgzMiwgMHg0NCwgMHgwOCwgMHhCMCwgMHg4NywgMHhGNCwKKwkgMHgwMywgMHgwMiwgMHhEMSwgMHg2MCwgMHhENSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEMywgMHg2MCwgMHgzQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMiwgMHg0NCwKKwkgMHgyNiwgMHg0NiwgMHgwOCwgMHhCMCwgMHgwNywgMHhGMiwgMHgwMywgMHgwMiwgMHhEMSwgMHg2MCwgMHhENSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NiwKKwkgMHgxQiwgMHhGMiwgMHgyNiwgMHg0NiwgMHhCQSwgMHg2NSwgMHg2MCwgMHg0NCwgMHhDNCwgMHg4NSwgMHgwMSwgMHg2MCwgMHhGRSwgMHg2MSwgMHgwMCwgMHg2NCwKKwkgMHg4MCwgMHg2MywgMHhDNywgMHg4NSwgMHg5NCwgMHg4NCwgMHg1OSwgMHhEQiwgMHhGQywgMHgxRiwgMHgwMCwgMHhGNCwgMHgwMSwgMHg2MCwgMHhGRSwgMHg2MSwKKwkgMHg3RSwgMHg2NSwgMHgxOCwgMHg2MywgMHg1QiwgMHhEMiwgMHg1OSwgMHhEMSwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhENywgMHg4MCwgMHgxOCwgMHgwMiwKKwkgMHhGOSwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MywgMHgwRSwgMHg2NSwgMHg1QiwgMHhEMiwgMHg1OSwgMHhEMSwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwKKwkgMHhENywgMHg4MCwgMHgwRSwgMHgwMiwgMHhGOSwgMHgwMiwgMHgyNiwgMHg0NiwgMHgwNywgMHhGNCwgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMSwgMHg3RSwKKwkgMHgwNiwgMHhGQSwgMHgyNiwgMHg0NiwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NCwgMHgwQSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgwQiwgMHhGQSwgMHg1NywgMHgwMCwKKwkgMHgyNiwgMHg0NiwgMHg4NywgMHhGNCwgMHg2NiwgMHg0MSwgMHg2MywgMHg0NiwgMHgwNSwgMHhGMiwgMHgwMCwgMHhGMCwgMHg4MSwgMHhGMCwgMHgwMiwgMHgxOCwKKwkgMHg2NCwgMHg0NiwgMHg4MSwgMHhGOCwgMHgwNywgMHgxQiwgMHgxMiwgMHg2MCwgMHhDRSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEOSwgMHgwMiwgMHgwMCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGOCwgMHg4OCwgMHhGMywgMHg2MywgMHg0NSwgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHhENCwgMHg4MCwgMHgwMSwgMHgxOCwgMHhGQSwgMHgwNCwgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGQSwgMHgwNiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RSwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgxNCwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMywgMHhEQSwgMHg4MSwKKwkgMHg2MCwgMHg0NSwgMHhENSwgMHg4MCwgMHhBMSwgMHhEMSwgMHgxMSwgMHgwMywgMHhEMywgMHg4MCwgMHhEOSwgMHg4MSwgMHhGQSwgMHgwMiwgMHhDOSwgMHg4MSwKKwkgMHhDOCwgMHg4NSwgMHhENSwgMHg4MCwgMHhBNSwgMHhEMywgMHgwOCwgMHgyOCwgMHhBMSwgMHhEQiwgMHgxNCwgMHg2MCwgMHhEMCwgMHg2MiwgMHg2NSwgMHg0NCwKKwkgMHhBMiwgMHhEQiwgMHg0QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NCwgMHgwQSwgMHhGQSwKKwkgMHgwRiwgMHg2NCwgMHgwQiwgMHhGQSwgMHg0MCwgMHg1OSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MSwgMHg0MSwgMHg1OCwgMHgyNiwgMHg0NiwgMHgyQywgMHhGMiwKKwkgMHhBMSwgMHhEQiwgMHgyRCwgMHhGMiwgMHg1OSwgMHhEQiwgMHgyRSwgMHhGMiwgMHg1OSwgMHhEQiwgMHgwMywgMHg2NSwgMHhFMiwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHg1QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMywgMHg2NSwgMHhFMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg4NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwKKwkgMHg4OCwgMHhGMywgMHgwNywgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhGNCwgMHgwQSwgMHhGMiwgMHgwOSwgMHhGMiwgMHhGRiwgMHhBMCwgMHgwMCwgMHhBMCwgMHgwNiwgMHgwMiwKKwkgMHhGRiwgMHhBMCwgMHgwNywgMHgwMywgMHgwOSwgMHgwMywgMHhEMywgMHg2MCwgMHhDQywgMHg3OCwgMHhGRiwgMHhGRiwgMHhEMywgMHg2MCwgMHg4QywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhENCwgMHg2MCwgMHhEQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgwNywgMHhGNCwgMHgwNiwgMHhGMiwgMHg2NiwgMHg0MywKKwkgMHgwMCwgMHg3RSwgMHgwNiwgMHhGQSwgMHgyNiwgMHg0NiwgMHhEMywgMHg2MCwgMHgzQywgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwgMHgwNiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHg3RSwgMHgwNiwgMHhGQSwgMHgyNiwgMHg0NiwgMHg4OCwgMHhGMywgMHgwNywgMHhGQSwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2NCwKKwkgMHgwQSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgwQiwgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgwMCwgMHg2NiwKKwkgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxNiwgMHg2MCwgMHhBQywgMHg3QywgMHgyQSwgMHhGMiwgMHhBNCwgMHhEQiwgMHgyMiwgMHg2MCwKKwkgMHgyQSwgMHg2MywgMHhGRiwgMHhCNCwgMHgwMSwgMHg2MSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg3QywgMHhBMywgMHhEQiwgMHg2MCwgMHg0MCwgMHgwMCwgMHgzNiwKKwkgMHgwMywgMHgwMCwgMHgwMiwgMHg2MSwgMHgwMCwgMHg2MCwgMHgzMCwgMHg3QywgMHg0MSwgMHg0NywgMHgyQSwgMHhGOCwgMHgyRiwgMHhGMiwgMHgyQywgMHhGQSwKKwkgMHgzMCwgMHhGMiwgMHgyRCwgMHhGQSwgMHgzMSwgMHhGMiwgMHgyRSwgMHhGQSwgMHhDQiwgMHhGMywgMHgyRiwgMHhGQSwgMHhDQywgMHhGMywgMHgzMCwgMHhGQSwKKwkgMHhDRCwgMHhGMywgMHgzMSwgMHhGQSwgMHg2NywgMHhGMywgMHgzMiwgMHhGQSwgMHg2OCwgMHhGMywgMHgzMywgMHhGQSwgMHg2OSwgMHhGMywgMHgzNCwgMHhGQSwKKwkgMHhBQywgMHhGMSwgMHgxOSwgMHhGOCwgMHgwMCwgMHg3QywgMHgzRSwgMHhGOCwgMHgxQywgMHhGMCwgMHgxMywgMHhGOCwgMHgwNywgMHhGMiwgMHg4OCwgMHhGMSwKKwkgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwgMHhEOSwgMHg2MCwgMHhBMywgMHg3OCwgMHhGRiwgMHhGRiwgMHg0MCwgMHg0QiwKKwkgMHhBQiwgMHg0NiwgMHgwNiwgMHhGMiwgMHhBQiwgMHg0NiwgMHgwMCwgMHhGNCwgMHgwMSwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwgMHhEOSwgMHg2MCwKKwkgMHhBMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMiwgMHg2MCwgMHgyQywgMHg2MywgMHgwOSwgMHhGMiwgMHhCRCwgMHhEQiwgMHg0MywgMHg0NCwgMHgxMCwgMHhCMCwKKwkgMHg4MCwgMHg2MCwgMHgwMCwgMHg2MywgMHgwRCwgMHgwMywgMHgxRiwgMHg2MCwgMHg5MiwgMHg2MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NCwKKwkgMHhGRSwgMHgyNiwgMHgwOCwgMHgwMCwgMHgzMiwgMHg0MCwgMHgwOCwgMHgyNiwgMHgwNiwgMHgwMCwgMHhEQSwgMHg2MCwgMHgwMiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgzMiwgMHg0MCwgMHgxMCwgMHgyQSwgMHgwMCwgMHg2MywgMHhBQiwgMHg0NiwgMHgwNiwgMHhGMCwgMHg3RiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwKKwkgMHg2MywgMHg0NSwgMHhCNCwgMHg4NCwgMHgwNiwgMHhGQSwgMHhBQiwgMHg0NiwgMHgwQSwgMHhGMCwgMHg1NiwgMHhGOSwgMHgyNCwgMHg0MywgMHhCRCwgMHhEOSwKKwkgMHg0MywgMHg0NCwgMHgwMSwgMHg2MywgMHgzMiwgMHg0MCwgMHgxMCwgMHgyNiwgMHgxMCwgMHhCQiwgMHgxRiwgMHg2MCwgMHg5MiwgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHhGRSwgMHgyNiwgMHgxMCwgMHhCQiwgMHgwOSwgMHhGQywgMHgyNywgMHg0NCwgMHhGRSwgMHhBMCwgMHhGRiwgMHhGRiwKKwkgMHgwMywgMHgwMywgMHhENSwgMHg2MCwgMHhGRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxNiwgMHg2MCwgMHhBMiwgMHg2NCwgMHgyNCwgMHg0MywgMHgwQiwgMHhGMCwKKwkgMHhBMCwgMHhEOSwgMHhCRCwgMHhEOSwgMHgwQywgMHhGMCwgMHg1OCwgMHhEOSwgMHhCRCwgMHhEOSwgMHgwRCwgMHhGMCwgMHg1OCwgMHhEOSwgMHhCRCwgMHhEOSwKKwkgMHg0MywgMHg0NCwgMHgxQywgMHg2NSwgMHgyRCwgMHg2MSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHhBNSwgMHhEMCwgMHhEQSwgMHg4NSwgMHg2NCwgMHg0NCwKKwkgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHgwNSwgMHgwMywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwKKwkgMHhGNCwgMHgwMiwgMHgwMiwgMHg2MCwgMHgwMiwgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NCwgMHgwNCwgMHhBNSwgMHhDNSwgMHg4MSwKKwkgMHhBMSwgMHhEMywgMHgwMCwgMHg2NSwgMHg2MCwgMHg0MywgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHg3RiwgMHhCNCwgMHgwMiwgMHgzQSwgMHgwMiwgMHgwMCwKKwkgMHgwMSwgMHg2NCwgMHgxNSwgMHgwMCwgMHgwNCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMiwgMHg2NCwgMHgxMSwgMHgwMCwgMHgwQSwgMHgzQSwgMHgwMiwgMHgwMCwKKwkgMHgwNCwgMHg2NCwgMHgwRCwgMHgwMCwgMHgwQiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwOCwgMHg2NCwgMHgwOSwgMHgwMCwgMHgxMCwgMHgzQSwgMHgwMiwgMHgwMCwKKwkgMHgxMCwgMHg2NCwgMHgwNSwgMHgwMCwgMHgxNiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgyMCwgMHg2NCwgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NCwgMHhDRiwgMHg4MywKKwkgMHhCNCwgMHg4NSwgMHhFMSwgMHgwMiwgMHg2NSwgMHg0NCwgMHg2MCwgMHhGQiwgMHhCOCwgMHhGMywgMHgyQiwgMHg0NSwgMHg2NiwgMHg0MSwgMHg2NSwgMHg0NiwKKwkgMHg4QywgMHhGQSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwNiwgMHgwMCwgMHgwMiwgMHgzNiwgMHgwNCwgMHgwMCwgMHgwNCwgMHgzNiwgMHgwMiwgMHgwMCwKKwkgMHgwNSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwMSwgMHgwMCwgMHgwMSwgMHg2NCwgMHg2RiwgMHhGQSwgMHg1RiwgMHhGMywgMHg2MCwgMHhGMSwKKwkgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwgMHg2NSwgMHg0MywgMHgwMiwgMHgwMiwgMHg1RiwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgwRiwgMHg2MCwKKwkgMHhBRSwgMHg2NSwgMHhCOCwgMHhGMywgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2MSwgMHg0NSwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgwMiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwgMHg2MSwgMHhGQiwgMHg2RiwgMHhGMCwKKwkgMHg2MCwgMHg0NywgMHg5MCwgMHg4NCwgMHg2RiwgMHhGQSwgMHg2MCwgMHg0NywgMHg2MCwgMHg0NSwgMHg4MCwgMHg2NCwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwgMHg3MCwgMHhGMCwgMHg3MCwgMHhGQSwgMHgwMCwgMHg2MSwgMHhFOCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHgwNSwgMHhERCwgMHg4MSwgMHhGQiwgMHgwMSwgMHhFMSwgMHg4MSwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwKKwkgMHg2NiwgMHg0MywgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwgMHhENiwgMHg2MCwgMHg4MCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxNiwgMHg2NSwgMHgyRCwgMHg2MSwKKwkgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHhBNSwgMHhEMCwgMHhEQSwgMHg4NSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwKKwkgMHgwNSwgMHgwMywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHhGNCwgMHgwMiwgMHgwMiwgMHg2MCwgMHgwMiwgMHg2MSwKKwkgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NCwgMHgwNCwgMHhBNSwgMHhDNSwgMHg4MSwgMHhBMSwgMHhEMywgMHgwMCwgMHg2NSwgMHg2MCwgMHg0MywKKwkgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHg3RiwgMHhCNCwgMHgwMiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMSwgMHg2NCwgMHgxNSwgMHgwMCwgMHgwNCwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwMiwgMHg2NCwgMHgxMSwgMHgwMCwgMHgwQSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwNCwgMHg2NCwgMHgwRCwgMHgwMCwgMHgwQiwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwOCwgMHg2NCwgMHgwOSwgMHgwMCwgMHgxMCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgxMCwgMHg2NCwgMHgwNSwgMHgwMCwgMHgxNiwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgyMCwgMHg2NCwgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NCwgMHhDRiwgMHg4MywgMHhCNCwgMHg4NSwgMHhFMSwgMHgwMiwgMHg2NSwgMHg0NCwKKwkgMHg2MCwgMHhGQiwgMHhCOCwgMHhGMywgMHgyQiwgMHg0NSwgMHg2NiwgMHg0MSwgMHg2NSwgMHg0NiwgMHg4QywgMHhGQSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwKKwkgMHgwNiwgMHgwMCwgMHgwMiwgMHgzNiwgMHgwNCwgMHgwMCwgMHgwNCwgMHgzNiwgMHgwMiwgMHgwMCwgMHgwNSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwKKwkgMHgwMSwgMHgwMCwgMHgwMSwgMHg2NCwgMHg2RiwgMHhGQSwgMHg1RiwgMHhGMywgMHg2MCwgMHhGMSwgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwgMHg2NSwgMHg0MywKKwkgMHgwMiwgMHgwMiwgMHg1RiwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgwRiwgMHg2MCwgMHhBRSwgMHg2NSwgMHhCOCwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2MSwgMHg0NSwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwgMHg2MSwgMHhGQiwgMHg2RiwgMHhGMCwgMHg2MCwgMHg0NywgMHg5MCwgMHg4NCwgMHg2RiwgMHhGQSwKKwkgMHg2MCwgMHg0NywgMHg2MCwgMHg0NSwgMHg4MCwgMHg2NCwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwKKwkgMHg3MCwgMHhGMCwgMHg3MCwgMHhGQSwgMHgwMCwgMHg2MSwgMHhFOCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNSwgMHhERCwgMHg4MSwgMHhGQiwgMHgwMSwKKwkgMHhFMSwgMHg4MSwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHg2NiwgMHg0MywgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwKKwkgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMiwgMHgwMCwgMHhGNCwgMHgxNiwgMHg2NSwgMHgyNywgMHg0MCwgMHgwMiwgMHgzQSwgMHgwMywgMHgwMCwgMHgxQywgMHg2NSwKKwkgMHhGNiwgMHhBNCwgMHgwMSwgMHgwMCwgMHhGQywgMHhBNCwgMHgyNCwgMHg0MywgMHgyMiwgMHg2MCwgMHg4MiwgMHg2MSwgMHg1RCwgMHg5MSwgMHg1MSwgMHg5MCwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHgyOCwgMHg2MCwgMHg0MSwgMHhDRCwgMHg4NCwgMHg0QywgMHg5MSwgMHg2MCwgMHg0MywgMHg2MCwgMHhGRSwgMHhBNSwgMHhEMiwKKwkgMHhERSwgMHg4NSwgMHg3RiwgMHgyNiwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHg1RCwgMHg5MywgMHhBMywgMHhEQiwgMHg1RCwgMHg5MywKKwkgMHhBNSwgMHhEMiwgMHhGNiwgMHgxRiwgMHg1RCwgMHg5MywgMHgyMCwgMHhGRSwgMHhERiwgMHg4MywgMHgyMiwgMHg2MCwgMHgyOCwgMHg3QywgMHgwMywgMHgxRSwKKwkgMHg2MCwgMHhGRSwgMHhCRCwgMHhERiwgMHgyMCwgMHhGRSwgMHgyMiwgMHg2MCwgMHgyQywgMHg2NCwgMHg1MywgMHg5MywgMHhBNCwgMHhERCwgMHgyNiwgMHg0NiwKKwkgMHgwMCwgMHhGNCwgMHgxRiwgMHg2MCwgMHg5MCwgMHg2NCwgMHhBMCwgMHhEMywgMHgwMCwgMHg2MywgMHgwMCwgMHhCOCwgMHgwQSwgMHhGQywgMHgwMywgMHgwMiwKKwkgMHhENywgMHg2MCwgMHgxNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQiwgMHhGMiwgMHgyNywgMHg0MCwgMHgwMiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwRSwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwMCwgMHgzQSwgMHgyNiwgMHgwMCwgMHg2MCwgMHg0MSwgMHgwMCwgMHgzNiwgMHgyMywgMHgwMCwgMHhFMCwgMHhBMCwKKwkgMHhEQSwgMHg4NSwgMHgyMCwgMHgwNywgMHgxRiwgMHg2MCwgMHgxRSwgMHg2MywgMHhBMywgMHhEMSwgMHg2NSwgMHg0MiwgMHhEMSwgMHg4MCwgMHgxRiwgMHg2MCwKKwkgMHgyMCwgMHg2MywgMHgxOCwgMHgwMiwgMHg1MCwgMHhGRSwgMHg2MSwgMHg0MCwgMHhGRSwgMHgyMiwgMHgwOCwgMHgwMCwgMHg2MiwgMHg0NSwgMHhCRCwgMHhEMywKKwkgMHhBNSwgMHhEMCwgMHhEQSwgMHg4MiwgMHhEMCwgMHg4MCwgMHhDOSwgMHg4MSwgMHhGNiwgMHgwQywgMHgwQywgMHgwMCwgMHg2MSwgMHg0MCwgMHgwMCwgMHgzNiwKKwkgMHgzMywgMHgwMCwgMHg2MiwgMHg0NSwgMHhBMywgMHhEMywgMHhBNSwgMHhEMCwgMHhGRiwgMHhGRiwgMHg5MCwgMHg4MCwgMHhGRiwgMHgyNiwgMHgwMiwgMHgwMCwKKwkgMHhERSwgMHg4MiwgMHgyQSwgMHgwMCwgMHgwQywgMHg2MywgMHgwQSwgMHhGQywgMHgwMCwgMHg2NCwgMHgwOSwgMHhGQSwgMHgwQiwgMHhGQSwgMHgwMSwgMHg3RSwKKwkgMHgwQywgMHhGQSwgMHgyNiwgMHg0NiwgMHgwOCwgMHg2NCwgMHgzRiwgMHhGQSwgMHgwNywgMHhGMiwgMHg4OCwgMHhGMSwgMHg0MCwgMHg1OCwgMHgwNywgMHhGOCwKKwkgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHhEQSwgMHg2MCwgMHgxRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwKKwkgMHgyMSwgMHg2MCwgMHhFMiwgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMiwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHhEOCwgMHg2MCwKKwkgMHg5RiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2MywgMHhENywgMHgwMSwgMHgxRiwgMHg2MCwgMHg5MiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhBNCwgMHhGRiwgMHhGRiwgMHgwQywgMHgyMCwgMHgwRCwgMHgwMCwgMHhEOCwgMHg2MCwgMHg5RiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwKKwkgMHgyOCwgMHg0NiwgMHgyQSwgMHg0MSwgMHhGRiwgMHhCMSwgMHg2MCwgMHhGRSwgMHg4MiwgMHg2NCwgMHhBMSwgMHhEQSwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwKKwkgMHgxNSwgMHgwMCwgMHgyMSwgMHg2MCwgMHhFRSwgMHg2MSwgMHhBMSwgMHhERiwgMHhEOSwgMHg4MSwgMHhBMSwgMHhERiwgMHhEOSwgMHg4MSwgMHhBMSwgMHhERiwKKwkgMHgwNCwgMHhBMSwgMHhBMSwgMHhERiwgMHhEOSwgMHg4MSwgMHhBMSwgMHhERiwgMHhEOSwgMHg4MSwgMHhBMSwgMHhERiwgMHhEOSwgMHg4MSwgMHhBMSwgMHhERiwKKwkgMHgyQiwgMHg0NiwgMHgzNywgMHhGMiwgMHg3RiwgMHg2MCwgMHhDRiwgMHg2NSwgMHhBNCwgMHg4NCwgMHhBMiwgMHhEQSwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMiwKKwkgMHgwMCwgMHhGNCwgMHgyNywgMHg0MCwgMHgwMiwgMHgzQSwgMHg0MCwgMHgwMCwgMHg2MCwgMHg0MywgMHhGNiwgMHhBMywgMHgwMCwgMHg2MCwgMHgxQiwgMHg2MSwKKwkgMHgwMCwgMHg2MCwgMHhERCwgMHg2NSwgMHg2MCwgMHhGRSwgMHg4MSwgMHhBMSwgMHg3RiwgMHhBMSwgMHgwMiwgMHgwNiwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwKKwkgMHhERCwgMHg4MSwgMHhBMSwgMHhEMiwgMHhDRiwgMHg4MywgMHhENCwgMHg4MCwgMHgyRCwgMHgwMywgMHgxNywgMHgwMywgMHhDRiwgMHg4MywgMHg2MSwgMHg0NCwKKwkgMHg4MCwgMHhBMCwgMHgyOCwgMHgwMywgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMiwgMHhDRiwgMHg4MywKKwkgMHg4MSwgMHhBMSwgMHgyMCwgMHgwMywgMHgwNSwgMHgwNywgMHg3RiwgMHhBMSwgMHhDQywgMHg4NCwgMHhERCwgMHg4MSwgMHhFNCwgMHgwMywgMHhGNywgMHgwMSwKKwkgMHgwMCwgMHhGNCwgMHgwMCwgMHhCOCwgMHgwNCwgMHg2MSwgMHhFNCwgMHgwMywgMHhGMiwgMHgwMSwgMHgwMSwgMHg2MCwgMHhGRiwgMHg2MywgMHg0NiwgMHg0OCwKKwkgMHg0MSwgMHg0QSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwgMHhERiwgMHg4MywgMHhBMywgMHhEOSwgMHg2NCwgMHg0NCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwKKwkgMHhERiwgMHg4MywgMHhBMywgMHhEOSwgMHhDQywgMHg4NCwgMHg4MSwgMHhBMSwgMHgwNSwgMHgwMywgMHg3RiwgMHhBMSwgMHhGNywgMHgwNCwgMHgwMCwgMHhGNCwKKwkgMHgwMywgMHg2MSwgMHhGNCwgMHgwMSwgMHgyMCwgMHhGRSwgMHgzRiwgMHgwMCwgMHg2MCwgMHg0MywgMHhGQywgMHhBMywgMHgwMCwgMHg2MCwgMHgxNSwgMHg2MSwKKwkgMHgwMCwgMHg2MCwgMHhERCwgMHg2NSwgMHg2MCwgMHhGRSwgMHg4MSwgMHhBMSwgMHg3RiwgMHhBMSwgMHgwMiwgMHgwNiwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwKKwkgMHhERCwgMHg4MSwgMHhBMSwgMHhEMiwgMHhDRiwgMHg4MywgMHhENCwgMHg4MCwgMHgyRCwgMHgwMywgMHgxNywgMHgwMywgMHhDRiwgMHg4MywgMHg2MSwgMHg0NCwKKwkgMHg4MCwgMHhBMCwgMHgyOCwgMHgwMywgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMiwgMHhDRiwgMHg4MywKKwkgMHg4MSwgMHhBMSwgMHgyMCwgMHgwMywgMHgwNSwgMHgwNywgMHg3RiwgMHhBMSwgMHhDQywgMHg4NCwgMHhERCwgMHg4MSwgMHhFNCwgMHgwMywgMHhGNywgMHgwMSwKKwkgMHgwMCwgMHhGNCwgMHgwMCwgMHhCOCwgMHgwNCwgMHg2MSwgMHhFNCwgMHgwMywgMHhGMiwgMHgwMSwgMHgwMSwgMHg2MCwgMHhGRiwgMHg2MywgMHg0NiwgMHg0OCwKKwkgMHg0MSwgMHg0QSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwgMHhERiwgMHg4MywgMHhBMywgMHhEOSwgMHg2NCwgMHg0NCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwKKwkgMHhERiwgMHg4MywgMHhBMywgMHhEOSwgMHhDQywgMHg4NCwgMHg4MSwgMHhBMSwgMHgwNSwgMHgwMywgMHg3RiwgMHhBMSwgMHhGNywgMHgwNCwgMHgwMCwgMHhGNCwKKwkgMHgwMywgMHg2MSwgMHhGNCwgMHgwMSwgMHgyMCwgMHhGRSwgMHgwMCwgMHhCQiwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MSwgMHgwOCwgMHgyNCwgMHhENywgMHgwMCwKKwkgMHg2MCwgMHhGRSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHhGQSwgMHhBNCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwNSwgMHg1MCwgMHgwMSwgMHhERCwgMHg4MSwKKwkgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzQSwgMHg0QSwgMHgwMSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHg0MCwgMHg1MCwgMHgzQSwgMHg0NCwgMHgwMSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHhGMiwgMHgzQSwKKwkgMHgzRSwgMHgwMSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzQSwgMHgyMCwgMHgwMSwgMHhERCwgMHg4MSwKKwkgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzQSwgMHgxQSwgMHgwMSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHg0MCwgMHgwMCwgMHgzQSwgMHgxNCwgMHgwMSwgMHg2MCwgMHg1QywgMHgwMCwgMHgzNiwgMHgzMCwgMHgwMCwgMHgwMCwgMHg2NCwgMHhEOCwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMSwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEQiwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwKKwkgMHgyQiwgMHgwMCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMywgMHhERCwgMHg4MSwgMHhEOCwgMHg2MCwgMHg1OCwgMHg0RSwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyMSwgMHg2MCwgMHhGOCwgMHg2MiwgMHhBMiwgMHhEQiwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwgMHgyNCwgMHgwMCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMywKKwkgMHhERCwgMHg4MSwgMHhEOCwgMHg2MCwgMHg1OCwgMHg0RSwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMSwgMHg2MCwgMHhGQSwgMHg2MiwgMHhBMiwgMHhEQiwKKwkgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwgMHgxRCwgMHgwMCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHgyMSwgMHg2MCwgMHhGQywgMHg2MiwgMHhBMiwgMHhEOSwKKwkgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHgyMSwgMHg2MCwgMHhGRCwgMHg2MiwgMHhBMiwgMHhEOSwgMHgxOSwgMHgwMCwgMHgyMCwgMHhGRSwgMHgyMSwgMHg2MCwKKwkgMHhGNiwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHhGRSwgMHgyMSwgMHg2MCwgMHhGOCwgMHg2MiwgMHgwMCwgMHg2MCwKKwkgMHgwNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHhGRSwgMHgyMSwgMHg2MCwgMHhGQSwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgyMCwgMHhGRSwgMHgyMSwgMHg2MCwgMHhGQywgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHgwMCwgMHgyMCwgMHhGRSwKKwkgMHgyMSwgMHg2MCwgMHhFMiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgyMSwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHgxMCwgMHgyNiwgMHgwOSwgMHgwMCwgMHgwNCwgMHgyNiwgMHgwOSwgMHgwMCwgMHgyMCwgMHgyNiwgMHgwOSwgMHgwMCwgMHgwMiwgMHgyNiwKKwkgMHgwOSwgMHgwMCwgMHhENywgMHg2MCwgMHgwNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg3QywgMHgwNSwgMHgwMCwgMHgwNCwgMHg3QywgMHgwMywgMHgwMCwKKwkgMHgyMCwgMHg3QywgMHgwMSwgMHgwMCwgMHgwMiwgMHg3QywgMHgyMSwgMHg2MCwgMHhFRSwgMHg2MSwgMHhBMSwgMHhEOSwgMHgyMSwgMHg2MCwgMHhFNCwgMHg2MSwKKwkgMHhBMSwgMHhEMSwgMHgyMSwgMHg2MCwgMHhGOCwgMHg2MSwgMHhBMSwgMHhEMywgMHgyMSwgMHg2MCwgMHhFRSwgMHg2MSwgMHhBMCwgMHg4NCwgMHhBMSwgMHhEMSwKKwkgMHhGRiwgMHhGRiwgMHgxMCwgMHgyNiwgMHgwNywgMHgwMCwgMHgwNCwgMHgyNiwgMHgwNywgMHgwMCwgMHgwMSwgMHgyNiwgMHgwRCwgMHgwMCwgMHhENywgMHg2MCwKKwkgMHgwNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg3QywgMHgwOSwgMHgwMCwgMHg2NCwgMHg0MCwgMHgxMCwgMHgyMiwgMHgwMywgMHgwMCwgMHhENywgMHg2MCwKKwkgMHgwNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHg3QywgMHgwMSwgMHgwMCwgMHgwMSwgMHg3QywgMHgyMSwgMHg2MCwgMHhGMCwgMHg2MSwgMHhBMSwgMHhEOSwKKwkgMHgyMSwgMHg2MCwgMHhFNiwgMHg2MSwgMHhBMSwgMHhEMSwgMHgyMSwgMHg2MCwgMHhGQSwgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwKKwkgMHgwMiwgMHgyNiwgMHgwNywgMHgwMCwgMHgwNCwgMHgyNiwgMHgwNywgMHgwMCwgMHgwMSwgMHgyNiwgMHgwNywgMHgwMCwgMHhENywgMHg2MCwgMHgwNywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMiwgMHg3QywgMHgwMywgMHgwMCwgMHgwNCwgMHg3QywgMHgwMSwgMHgwMCwgMHgyMCwgMHg3QywgMHgyMSwgMHg2MCwgMHhGMiwgMHg2MSwKKwkgMHhBMSwgMHhEOSwgMHgyMSwgMHg2MCwgMHhGQywgMHg2MSwgMHhBMSwgMHhEMSwgMHgyMSwgMHg2MCwgMHhGNCwgMHg2MSwgMHhBMSwgMHhEOSwgMHgyMSwgMHg2MCwKKwkgMHhGMiwgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgyMSwgMHg2MCwgMHhGMCwgMHg2MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwKKwkgMHhCMCwgMHg4NCwgMHgxRiwgMHg2MCwgMHg5MiwgMHg2MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgyMiwgMHhCQywKKwkgMHhBQiwgMHg0NiwgMHgzNiwgMHhGQSwgMHhBQiwgMHg0NiwgMHgyMSwgMHg2MCwgMHhFRSwgMHg2MSwgMHhBMSwgMHhEMywgMHgxRiwgMHg2MCwgMHg5MiwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgyMiwgMHhCQywgMHg4OCwgMHhGMSwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwKKwkgMHgzNiwgMHhGQSwgMHhGRiwgMHhGRiwgMHg2MSwgMHg0NiwgMHg1MCwgMHgwMCwgMHgyMSwgMHg2MCwgMHhGRSwgMHg2MiwgMHhBMiwgMHhEQiwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHgwMywgMHgwMiwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHgwMiwgMHhBNSwgMHg2NCwgMHg0NCwgMHhENCwgMHg5QywKKwkgMHgyMiwgMHg2MCwgMHgwMCwgMHg2MiwgMHhBMiwgMHhEOSwgMHgyMiwgMHg2MCwgMHgwMiwgMHg2MiwgMHhBMiwgMHhERiwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwKKwkgMHgwMCwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzQSwgMHgwMSwgMHg2NSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwKKwkgMHg1MCwgMHgzQSwgMHgwMSwgMHg2NSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHhGMiwgMHgzQSwgMHgwMSwgMHg2NSwKKwkgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHg2NSwgMHg0MCwgMHgwMCwgMHgzQSwgMHgxOCwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2NSwgMHg2NCwgMHg0MCwKKwkgMHgwMCwgMHgzNiwgMHgwMSwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwMiwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwMiwgMHgzNiwgMHgwNCwgMHg2NSwKKwkgMHg2NCwgMHg0MCwgMHgwNCwgMHgzNiwgMHgxMCwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwNSwgMHgzNiwgMHgyMCwgMHg2NSwgMHg2NSwgMHg1QywgMHgyMiwgMHg2MCwKKwkgMHgwMiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyMSwgMHg2MCwgMHhGRSwgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHhBNCwgMHhBMiwgMHhEQiwgMHhDQSwgMHgwMiwgMHgyMiwgMHg2MCwgMHgwMiwgMHg2MiwgMHhBMiwgMHhEMywgMHgyMiwgMHg2MCwKKwkgMHgwMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHhBQiwgMHg0NiwgMHg4MiwgMHhGMCwgMHhDMCwgMHg2NywgMHhCNCwgMHg4NCwKKwkgMHhBQiwgMHg0NiwgMHgwQiwgMHhGQSwgMHgxRiwgMHg2MCwgMHhBMCwgMHg2NCwgMHhBMCwgMHhEMSwgMHgyMiwgMHg2MCwgMHhENCwgMHg3QywgMHgwNCwgMHgxQiwKKwkgMHhGRiwgMHg2MCwgMHhGRiwgMHg2MywgMHhBNCwgMHhERCwgMHgyOSwgMHgwMCwgMHgyMywgMHg2MCwgMHgzQywgMHg2MywgMHhBNCwgMHhERCwgMHhEQiwgMHg4MywKKwkgMHg2MCwgMHhGRSwgMHgwMCwgMHg2NCwgMHhCRCwgMHhEQiwgMHg2MCwgMHg2NCwgMHhCRCwgMHhEQiwgMHgxRCwgMHg2NCwgMHhCRCwgMHhEQiwgMHhDMywgMHhGMywKKwkgMHhCRCwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHgwMSwgMHg2MCwgMHg3OCwgMHg2NCwgMHgwNiwgMHg2MSwgMHg1OCwgMHhEMSwgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHhGRSwgMHhCRCwgMHhEOSwgMHgyMCwgMHhGRSwgMHhDRCwgMHg4MSwgMHg2MSwgMHg0MCwgMHgwOCwgMHgyOCwgMHhGNywgMHgwMSwgMHhCNywgMHhGMSwKKwkgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NywgMHg2MCwgMHhGRSwgMHhCRCwgMHhEOSwgMHhCRCwgMHhEQiwgMHgyMCwgMHhGRSwgMHgxRiwgMHg2MCwgMHg5QywgMHg2NCwKKwkgMHhBMCwgMHhEMSwgMHg2MCwgMHhGRSwgMHhCRCwgMHhEOSwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHgyMiwgMHg2MCwgMHhEMiwgMHg2NCwgMHg0MCwgMHg0OCwKKwkgMHgxOCwgMHg2MSwgMHgyNiwgMHg0NiwgMHgwMCwgMHhGNCwgMHhGRiwgMHg2MCwgMHhGMiwgMHg2NCwgMHhFMSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhFNSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGQywgMHgyQiwgMHg0NiwgMHg1NiwgMHhGMSwgMHgxNiwgMHg2MCwgMHhBQywgMHg2MSwgMHgxQiwgMHhGOCwKKwkgMHhBMSwgMHhEMSwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHgwNiwgMHhGMiwgMHgwQywgMHgwMywgMHgxMCwgMHhCQywgMHgwNiwgMHhGQSwKKwkgMHg4NywgMHhGMywgMHgwMCwgMHg2MCwgMHhFMiwgMHg2MiwgMHhBMiwgMHhEMywgMHg2MCwgMHg0NSwgMHhENCwgMHg4MCwgMHhEQywgMHg4NCwgMHgwNywgMHgwNywKKwkgMHhBMiwgMHhEQiwgMHgwNSwgMHgwMCwgMHgxMCwgMHhCNSwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywgMHhENCwgMHg4NCwgMHgwNiwgMHhGQSwgMHgwNywgMHhGMiwKKwkgMHg2NiwgMHg0NSwgMHg2MCwgMHg0NiwgMHgwNiwgMHhGMiwgMHg2NSwgMHg0NiwgMHgwMiwgMHhCMCwgMHhGRiwgMHhGRiwgMHgxMiwgMHgwMywgMHgyNiwgMHg0NiwKKwkgMHg4OCwgMHhGMywgMHgwNywgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwKKwkgMHg0QywgMHgwMCwgMHgyNiwgMHg0NiwgMHg4OCwgMHhGMywgMHgwNywgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwKKwkgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgxQSwgMHgwMCwgMHgwMCwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgwMiwgMHg2NCwgMHgzRiwgMHhGQSwKKwkgMHg4OCwgMHhGMywgMHgwNywgMHhGQSwgMHgwMCwgMHhGNCwgMHgwOSwgMHg2NCwgMHgwOSwgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwKKwkgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHhDMSwgMHhGRSwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyQiwgMHg0MywgMHgxNCwgMHg2MCwgMHhEMCwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHhEQSwgMHg4MSwgMHg2MCwgMHg0NSwgMHhENSwgMHg4MCwgMHhBMSwgMHhEMSwgMHgxMSwgMHgwMywgMHhEMywgMHg4MCwgMHhEOSwgMHg4MSwKKwkgMHhGQSwgMHgwMiwgMHhDOSwgMHg4MSwgMHhDOCwgMHg4NSwgMHhENSwgMHg4MCwgMHhBNSwgMHhEMywgMHgwOCwgMHgyOCwgMHhBMSwgMHhEQiwgMHgxNCwgMHg2MCwKKwkgMHhEMCwgMHg2MiwgMHg2NSwgMHg0NCwgMHhBMiwgMHhEQiwgMHg0QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4NCwgMHhBMiwgMHhEQiwgMHhBQiwgMHg0NiwKKwkgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMiwgMHhCQywgMHgwNiwgMHhGQSwgMHhBQiwgMHg0NiwgMHhBQiwgMHg0NiwgMHgwRiwgMHg2MCwgMHhGRiwgMHg2NCwKKwkgMHgwMiwgMHhGMCwgMHg3MiwgMHhGMSwgMHhBMCwgMHg4NCwgMHhEMCwgMHg4MCwgMHgwMiwgMHhGQSwgMHhBQiwgMHg0NiwgMHgwMSwgMHgwNiwgMHg3MiwgMHhGQiwKKwkgMHgyNywgMHg0MSwgMHgwMSwgMHhCMSwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMywgMHgyQiwgMHg0NiwgMHgwQiwgMHg1OCwgMHgwMSwgMHg2NSwgMHhFMiwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHg4NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQSwgMHgwMCwgMHgyQiwgMHg0NiwgMHgwQiwgMHg1OCwgMHgxNiwgMHg2MCwgMHhBMiwgMHg2NCwKKwkgMHg0MCwgMHg1OSwgMHgwMiwgMHg2NSwgMHhFMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg4NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgwMCwgMHhGNCwgMHgwMCwgMHg2NCwgMHgwOSwgMHhGQSwgMHgwQiwgMHhGQSwgMHgwMSwgMHg3RSwKKwkgMHgwQywgMHhGQSwgMHgwQSwgMHg2NCwgMHgwQSwgMHhGQSwgMHgyNiwgMHg0NiwgMHgwOCwgMHg2NCwgMHgzRiwgMHhGQSwgMHgwNywgMHhGMiwgMHg4OCwgMHhGMSwKKwkgMHg0MCwgMHg1OCwgMHgwNywgMHhGOCwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHhGRiwgMHg2MCwgMHhGRCwgMHg2NSwKKwkgMHgzOCwgMHg0NiwgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHhBNCwgMHg4MywgMHgwNiwgMHhGQywgMHgwMiwgMHhCMCwgMHgyNiwgMHg0NiwgMHgxQywgMHgwMywKKwkgMHgzOCwgMHg0MywgMHg4NywgMHhGMSwgMHgxNCwgMHg2MCwgMHhDRSwgMHg2MSwgMHhBMSwgMHhEMywgMHhEQSwgMHg4MSwgMHhEMCwgMHg4MCwgMHhEQywgMHg5QywKKwkgMHgwNSwgMHgwNSwgMHhBMSwgMHhEMywgMHg0QSwgMHhEOSwgMHhBMCwgMHhERCwgMHhEQSwgMHg5QywgMHhBMSwgMHhEOSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MSwKKwkgMHgyQywgMHhGMiwgMHhBMSwgMHhEQiwgMHgyRCwgMHhGMiwgMHg0MSwgMHg1OCwgMHg1OSwgMHhEQiwgMHgyRSwgMHhGMiwgMHg1OSwgMHhEQiwgMHgwMywgMHg2NSwKKwkgMHhFMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg4NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwNywgMHhGMiwgMHg4OCwgMHhGMSwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHg0MCwgMHg0NywgMHgwNywgMHhGMiwgMHg2NiwgMHg0NSwgMHg2MCwgMHg0NiwgMHgwNiwgMHhGMiwgMHg2NSwgMHg0NiwgMHgwMiwgMHhCMCwgMHhGRiwgMHhGRiwKKwkgMHgxQiwgMHgwMiwgMHgyNywgMHg0MywgMHgxNCwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMywgMHhEQSwgMHg4MSwgMHg2MCwgMHg0NSwgMHhENSwgMHg4MCwKKwkgMHhBMSwgMHhEMSwgMHgxMSwgMHgwMywgMHhEMywgMHg4MCwgMHhEOSwgMHg4MSwgMHhGQSwgMHgwMiwgMHhDOSwgMHg4MSwgMHhDOCwgMHg4NSwgMHhENSwgMHg4MCwKKwkgMHhBNSwgMHhEMywgMHgwOCwgMHgyOCwgMHhBMSwgMHhEQiwgMHgxNCwgMHg2MCwgMHhEMCwgMHg2MiwgMHg2NSwgMHg0NCwgMHhBMiwgMHhEQiwgMHg0QSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhDQywgMHg4NCwgMHhBMiwgMHhEQiwgMHgwQywgMHgwMCwgMHgyNywgMHg0NCwgMHg0MCwgMHg1OCwgMHgwMywgMHg2NSwgMHhFMiwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHg4NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg0MywgMHhFNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5RCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyNiwgMHg0NiwgMHg4NywgMHhGNCwgMHg2NiwgMHg0MSwgMHg2MywgMHg0NiwgMHgwNSwgMHhGMiwgMHgwMCwgMHhGMCwgMHg4MSwgMHhGMCwgMHgwMiwgMHgxOCwKKwkgMHg2NCwgMHg0NiwgMHg4MSwgMHhGOCwgMHgwNywgMHgxQiwgMHgxMiwgMHg2MCwgMHhDRSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEOSwgMHgwMiwgMHgwMCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGOCwgMHg4OCwgMHhGMywgMHg2MywgMHg0NSwgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHhENCwgMHg4MCwgMHgwMSwgMHgxOCwgMHhGQSwgMHgwNCwgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGQSwgMHgwNiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RSwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwNywgMHhGMiwgMHg4OCwgMHhGMSwKKwkgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg0MCwgMHg0NywgMHgwNywgMHhGMiwKKwkgMHg2NiwgMHg0NSwgMHg2MCwgMHg0NiwgMHgwNiwgMHhGMiwgMHg2NSwgMHg0NiwgMHgwMiwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyNywgMHg0NiwgMHgwNiwgMHhGMCwgMHhGRiwgMHg2MCwgMHhFRCwgMHg2NCwgMHhBMCwgMHg4NCwgMHgwNiwgMHhGQSwgMHgyNywgMHg0MywKKwkgMHg4NywgMHhGMSwgMHgxNCwgMHg2MCwgMHhDRSwgMHg2MSwgMHhBMSwgMHhEMywgMHhEQSwgMHg4MSwgMHhEMCwgMHg4MCwgMHhEQywgMHg5QywgMHgwNSwgMHgwNSwKKwkgMHhBMSwgMHhEMywgMHg0QSwgMHhEOSwgMHhBMCwgMHhERCwgMHhEQSwgMHg5QywgMHhBMSwgMHhEOSwgMHgwNywgMHg1OCwgMHgwMywgMHg2NSwgMHhFMiwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHg4NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg0MywgMHhFNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5RCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyNiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgyRiwgMHhGMiwgMHgyQywgMHhGQSwgMHgzMCwgMHhGMiwgMHgyRCwgMHhGQSwKKwkgMHgzMSwgMHhGMiwgMHgyRSwgMHhGQSwgMHhDQiwgMHhGMywgMHgyRiwgMHhGQSwgMHhDQywgMHhGMywgMHgzMCwgMHhGQSwgMHhDRCwgMHhGMywgMHgzMSwgMHhGQSwKKwkgMHg2NywgMHhGMywgMHgzMiwgMHhGQSwgMHg2OCwgMHhGMywgMHgzMywgMHhGQSwgMHg2OSwgMHhGMywgMHgzNCwgMHhGQSwgMHhBQywgMHhGMSwgMHgxOSwgMHhGOCwKKwkgMHgxQywgMHhGMiwgMHgxMywgMHhGQSwgMHgwMiwgMHg2MywgMHgzRiwgMHhGQywgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MSwKKwkgMHgyQywgMHhGMiwgMHhBMSwgMHhEQiwgMHgyRCwgMHhGMiwgMHg0MSwgMHg1OCwgMHg1OSwgMHhEQiwgMHgyRSwgMHhGMiwgMHg1OSwgMHhEQiwgMHgwNiwgMHg2MywKKwkgMHgwNywgMHhGMiwgMHg4OCwgMHhGMSwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwRCwgMHgwMiwgMHg0MywgMHg1OSwgMHgwMiwgMHg2NSwKKwkgMHhFMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg1QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHhDMCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgwMCwgMHhGNCwKKwkgMHgwNiwgMHg2NCwgMHgwOSwgMHhGQSwgMHgxNSwgMHgwMCwgMHgwNywgMHhGMiwgMHg2NiwgMHg0NSwgMHg2MCwgMHg0NiwgMHgwNiwgMHhGMiwgMHg2NSwgMHg0NiwKKwkgMHgwMiwgMHhCMCwgMHhGRiwgMHhGRiwgMHgxRSwgMHgwMiwgMHgwNywgMHg2MywgMHg0MywgMHg1OSwgMHgwMSwgMHg2NSwgMHhFMiwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHg1QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHhBMCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgwMCwgMHhGNCwgMHgwNywgMHg2NCwgMHgwOSwgMHhGQSwKKwkgMHgyNiwgMHg0NiwgMHg4OCwgMHhGMywgMHgwNywgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgwMCwgMHg2NiwKKwkgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGRSwgMHg2MiwgMHhEQiwgMHg2MCwgMHhCMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMywgMHg2NCwgMHhBMiwgMHhEQiwgMHhEQiwgMHg2MCwKKwkgMHg0RCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFOCwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHg1QSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg3MiwgMHhGMywKKwkgMHg4OCwgMHhGNSwgMHhEQywgMHg4MSwgMHg2NiwgMHg0MywgMHgwMiwgMHhBMywgMHg2MywgMHg0NiwgMHhDRCwgMHg4MSwgMHgwNiwgMHhGMiwgMHhFRCwgMHgwMywKKwkgMHg2MCwgMHg0MCwgMHgwOCwgMHgyQSwgMHhGNywgMHgwMSwgMHgwQywgMHhBQywgMHgwNiwgMHhGQSwgMHg0NiwgMHg0OSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2MSwKKwkgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwgMHhFMCwgMHgwMywgMHgyNSwgMHg2MCwgMHgyQywgMHg2MSwgMHhBMSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgwMywgMHgxQiwgMHgwMCwgMHg2MCwgMHhBMCwgMHg2NCwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyQSwgMHhGQSwKKwkgMHhBQiwgMHhGQywgMHg2NiwgMHg0NSwgMHgyOSwgMHg0NCwgMHgwNywgMHhGQSwgMHgyOSwgMHg0NiwgMHgwMywgMHhGMiwgMHgwNCwgMHhGMCwgMHg4NSwgMHhGMiwKKwkgMHg2NSwgMHg0NiwgMHgyQywgMHhGQSwgMHgyRCwgMHhGOCwgMHhBRSwgMHhGQSwgMHhDQiwgMHhGMywgMHgyRiwgMHhGQSwgMHgzMiwgMHhGQSwgMHhDQywgMHhGMywKKwkgMHgzMCwgMHhGQSwgMHgzMywgMHhGQSwgMHhDRCwgMHhGMywgMHgzMSwgMHhGQSwgMHgzNCwgMHhGQSwgMHhBQywgMHhGMSwgMHgxOSwgMHhGOCwgMHgxOCwgMHg2NywKKwkgMHgwRSwgMHhGQSwgMHg2NiwgMHg0NSwgMHg2MywgMHg0NiwgMHgwRSwgMHhGMiwgMHg2NSwgMHg0NiwgMHgwMCwgMHg3RSwgMHgxMywgMHhGQSwgMHgwMiwgMHg2MywKKwkgMHgzRiwgMHhGQywgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHg2NiwgMHg0MSwgMHgwMCwgMHhGNCwgMHgyNSwgMHg2MCwgMHgyOCwgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgwOSwgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg5QSwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2MSwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDOCwgMHhGRSwgMHg5RSwgMHgwMSwgMHg5MiwgMHgwMSwKKwkgMHgwRiwgMHg2MCwgMHhFOCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwNywgMHhGMCwKKwkgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MywgMHgxNCwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMywgMHhEQSwgMHg4MSwgMHg2MCwgMHg0NSwgMHhENSwgMHg4MCwKKwkgMHhBMSwgMHhEMSwgMHgwNCwgMHgwMywgMHhEMywgMHg4MCwgMHhEOSwgMHg4MSwgMHhGQSwgMHgwMiwgMHgwOSwgMHgwMCwgMHhBMSwgMHhERCwgMHgxNCwgMHg2MCwKKwkgMHhEMCwgMHg2MiwgMHhEOSwgMHg4NCwgMHhBMiwgMHhEQiwgMHg0QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NSwKKwkgMHg2MywgMHg0NiwgMHgwNiwgMHhGMiwgMHhGRiwgMHg2MCwgMHgwMSwgMHg3QywgMHhBMCwgMHg5QywgMHgwNiwgMHhGOCwgMHg2NSwgMHg0NiwgMHg3MSwgMHhGMywKKwkgMHg2MCwgMHg0MCwgMHgxMCwgMHgyQSwgMHgwMywgMHgwMCwgMHhDQywgMHg4NCwgMHg4MCwgMHgyQiwgMHg3MSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFOCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhEQywgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhERSwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhEQiwgMHg2MCwgMHhGNywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg3MSwgMHhGMywKKwkgMHg3MiwgMHhGMywgMHgwMCwgMHhBOCwgMHg2MCwgMHg4OCwgMHg1MCwgMHgwMywgMHhFMCwgMHg4MywgMHg2QywgMHgwMywgMHhDQiwgMHg4MywgMHg4OCwgMHhGMywKKwkgMHg3MywgMHhGMSwgMHgwMiwgMHhBNCwgMHg0MCwgMHg0NywgMHg2NCwgMHg0NSwgMHgyNywgMHg0NiwgMHg3MiwgMHhGNCwgMHgxMiwgMHhGMiwgMHg0MCwgMHgxOCwKKwkgMHhENCwgMHg4MCwgMHgwMiwgMHg2NCwgMHgzRCwgMHgwNywgMHgyMywgMHhGQSwgMHgyQSwgMHhGMiwgMHgwRSwgMHhGMiwgMHgwQywgMHhCMCwgMHgwMiwgMHhGMCwKKwkgMHgwRCwgMHgwMiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHhFNiwgMHgwMSwgMHg2MCwgMHg0MCwgMHhGMCwgMHgzNywKKwkgMHgwOCwgMHgwMCwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2NCwgMHhEMCwgMHg4MCwgMHhBMiwgMHhGRiwgMHg5MCwgMHhGMywgMHgwMiwgMHgwMiwgMHhEQywgMHg4NCwKKwkgMHg5MCwgMHhGQiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHhBQywgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhBMywgMHhGRiwgMHhDRSwgMHhGRSwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwKKwkgMHhFQywgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwKKwkgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHhCQywgMHgwMSwKKwkgMHgyNywgMHg0NCwgMHgwMiwgMHhBNCwgMHg0MCwgMHg0NywgMHhCOCwgMHgxRiwgMHgyOCwgMHg0MywgMHhDQiwgMHg4MywgMHg4OCwgMHhGMywgMHgxQSwgMHgwRSwKKwkgMHgwMiwgMHhBNCwgMHg0MCwgMHg0QywgMHg0MywgMHg0OCwgMHgyQywgMHg0NiwgMHgxRSwgMHhGMiwgMHg3MywgMHhGMSwgMHhBQywgMHg4NiwgMHgxMiwgMHhGMiwKKwkgMHgwQywgMHgwMywgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwOSwgMHgwNywgMHgxQiwgMHg2MCwgMHhEQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHhGMCwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHg3NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQywgMHg0NiwgMHg5RSwgMHhGQywgMHgyQywgMHg0NCwgMHgwMiwgMHhBNCwgMHgyOCwgMHg0MywKKwkgMHg0MCwgMHg0QywgMHhFOCwgMHgxRiwgMHg3RCwgMHgwMSwgMHgwMSwgMHg2MywgMHg2NiwgMHhGMywgMHhBQywgMHhGMywgMHgwMCwgMHhCRCwgMHhBQywgMHg4MSwKKwkgMHgwNiwgMHgwMywgMHgwNSwgMHgwMywgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MywgMHg1QiwgMHhGRCwKKwkgMHgzRSwgMHg2MywgMHgxNiwgMHg2MCwgMHg2MCwgMHg2MSwgMHgwMCwgMHg2NCwgMHg1OSwgMHhEQiwgMHhGRSwgMHgxRiwgMHg3MSwgMHhGQiwgMHg3MiwgMHhGQiwKKwkgMHgxNiwgMHg2MCwgMHhBOCwgMHg2NSwgMHgwMCwgMHg2NCwgMHhBNSwgMHhEQiwgMHg1QSwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwKKwkgMHg5QSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgwMywgMHgwMiwgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwNywgMHhGMCwgMHg2NiwgMHg0NSwgMHg2NCwgMHg0NiwgMHgxQiwgMHhGMiwgMHg2NSwgMHg0NiwgMHg2NCwgMHg0NSwgMHg1QiwgMHhGMSwKKwkgMHhFMCwgMHg4NCwgMHg3MywgMHhGMSwgMHhDMCwgMHg4NCwgMHhDMCwgMHg4NCwgMHgxMiwgMHhGQSwgMHgyQywgMHhGMiwgMHg3MSwgMHhGMywgMHg2MCwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgzNiwgMHgwMCwgMHgwMCwgMHhBOCwgMHgxRiwgMHg2MCwgMHg4RSwgMHg2MiwgMHhBMiwgMHhEMywgMHgzNywgMHgwMywgMHgwMCwgMHhBOCwKKwkgMHhGRiwgMHhGRiwgMHgzNCwgMHgwMywgMHhERSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg2QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg0NiwgMHgwOSwgMHg2MCwKKwkgMHgwOCwgMHg2MSwgMHhBMiwgMHhGRiwgMHgwRSwgMHhGMiwgMHgwMiwgMHhGMCwgMHg2MCwgMHg0MCwgMHhGMCwgMHgzNywgMHgwRCwgMHgwMCwgMHg5MiwgMHhGMywKKwkgMHg5MCwgMHhGMywgMHhEQywgMHg4MywgMHhEMSwgMHg4MCwgMHg5MiwgMHhGRCwgMHgwQywgMHgwMywgMHg4QywgMHhGMywgMHhDQywgMHg4MywgMHhEOCwgMHhBMCwKKwkgMHg5MCwgMHhGRCwgMHgwNywgMHgwNCwgMHhENCwgMHhGRSwgMHgwNSwgMHgwMCwgMHhEMSwgMHg4MCwgMHg5MywgMHhGMywgMHgwMiwgMHgwMywgMHhEQywgMHg4NCwKKwkgMHg5MywgMHhGQiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg5NCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNSwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhBMywgMHhGRiwgMHhEQywgMHg2MCwgMHg4NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg2NiwgMHg0MSwgMHg2NSwgMHg0NiwgMHgwNiwgMHhGMiwgMHg2MSwgMHg0NiwgMHg2MCwgMHg0MCwgMHgxMCwgMHgyQSwgMHg0QywgMHgwMCwgMHg4MCwgMHg2NywKKwkgMHhCNCwgMHg4MSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHg2MSwgMHg0NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhERSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg2QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg0NiwKKwkgMHgyQSwgMHhGMiwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2MSwgMHgwQywgMHhCMCwgMHhBMiwgMHhGRiwgMHgxNywgMHgwMywgMHgwRSwgMHhGMiwgMHgwMiwgMHhGMCwKKwkgMHg2MCwgMHg0MCwgMHhGMCwgMHgzNywgMHgwRCwgMHgwMCwgMHg5MCwgMHhGMywgMHg5MiwgMHhGMywgMHhDQywgMHg4MywgMHhEMSwgMHg4MCwgMHg5MCwgMHhGRCwKKwkgMHgwQywgMHgwMywgMHg4QywgMHhGMywgMHhEQywgMHg4MywgMHhEOCwgMHhBMCwgMHg5MiwgMHhGRCwgMHgwNywgMHgwNCwgMHhENCwgMHhGRSwgMHgwNSwgMHgwMCwKKwkgMHhEMSwgMHg4MCwgMHg5MywgMHhGMywgMHgwMiwgMHgwMywgMHhEQywgMHg4NCwgMHg5MywgMHhGQiwgMHgwNywgMHhGMCwgMHgwQSwgMHhGMiwgMHhBMywgMHhGRiwKKwkgMHg2NCwgMHg0NSwgMHgzMCwgMHgxQiwgMHg2NiwgMHg0MSwgMHg2NSwgMHg0NiwgMHgwMiwgMHhGMCwgMHg2MSwgMHg0NiwgMHgwRiwgMHg2MCwgMHhGRiwgMHg2MSwKKwkgMHhBMSwgMHg4NCwgMHg2MCwgMHg0MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFMSwgMHg4MiwgMHgwNywgMHhCNCwgMHgwMSwgMHg2MSwKKwkgMHgwMywgMHgwMywgMHhDQywgMHg4NCwgMHhFMSwgMHg4MSwgMHhGRCwgMHgwMiwgMHgxNiwgMHg2MCwgMHg2MiwgMHg2NSwgMHg0NiwgMHhEMSwgMHg2MSwgMHg0NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxNywgMHgwMCwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2MSwgMHgyQSwgMHhGMiwgMHgzRSwgMHhGMiwgMHgwQywgMHhCMCwKKwkgMHgwMSwgMHhCMCwgMHgwNSwgMHgwMywgMHgxQiwgMHg2MCwgMHhBMCwgMHg2MSwgMHgwMiwgMHgwMiwgMHgxQiwgMHg2MCwgMHg4OCwgMHg2MSwgMHgxQiwgMHg2MCwKKwkgMHhEQSwgMHg2MiwgMHg2MSwgMHg0NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHhEQywgMHg2MCwgMHg4NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHhGMCwgMHgyQiwgMHhGMiwgMHgyQSwgMHhGMiwKKwkgMHg2MCwgMHg0MSwgMHg0NCwgMHg0OSwgMHg2MCwgMHg0NSwgMHhBNCwgMHgzQSwgMHgwRCwgMHgwMCwgMHg2MSwgMHg0MCwgMHhDMCwgMHgzQiwgMHg3QiwgMHgwMCwKKwkgMHhBOSwgMHg0NiwgMHgwNiwgMHhGMiwgMHhBOSwgMHg0NiwgMHg2MCwgMHg0MCwgMHgyMCwgMHgyNiwgMHg3NSwgMHgwMCwgMHgyMCwgMHhCQywgMHhBOSwgMHg0NiwKKwkgMHgwNiwgMHhGQSwgMHhBOSwgMHg0NiwgMHhBOSwgMHg0NiwgMHgwNiwgMHhGMCwgMHhBOSwgMHg0NiwgMHg2NSwgMHg0MCwgMHgxMCwgMHgyQiwgMHg2RSwgMHgwMCwKKwkgMHg2NCwgMHg0MCwgMHgxMCwgMHgyQSwgMHgzNiwgMHgwMCwgMHg2NSwgMHg0MCwgMHhBNCwgMHgzQSwgMHg2NSwgMHgwMCwgMHgyOSwgMHg0NSwgMHg2NSwgMHg0NiwKKwkgMHg3MiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgwNCwgMHgwMiwgMHg3OCwgMHgwMCwgMHhERSwgMHg2MCwgMHg1MSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwOSwgMHhGMiwgMHgyQSwgMHhGMCwgMHgwMCwgMHhBOCwgMHgyMCwgMHg2NywgMHgwMiwgMHgwMywgMHhCMCwgMHg4NCwgMHgyQSwgMHhGQSwKKwkgMHgwRSwgMHhGMiwgMHgwMiwgMHhGMCwgMHg2MCwgMHg0MCwgMHhGMCwgMHgzNywgMHgwOCwgMHgwMCwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2NCwgMHhEMCwgMHg4MCwKKwkgMHhBMiwgMHhGRiwgMHg5MCwgMHhGMywgMHgwMiwgMHgwMiwgMHhEQywgMHg4NCwgMHg5MCwgMHhGQiwgMHgzRSwgMHhGMiwgMHhBMywgMHhGRiwgMHgwMSwgMHhCMCwKKwkgMHgxQiwgMHg2MCwgMHhBMCwgMHg2MSwgMHgwMiwgMHgwMiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2MSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHg2MSwgMHg0NCwKKwkgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwKKwkgMHgxNywgMHgwMCwgMHgxMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhERiwgMHg2NSwgMHhBNCwgMHg5RSwgMHhBOSwgMHg0NiwgMHgwNiwgMHhGQSwgMHhBOSwgMHg0NiwKKwkgMHhBMiwgMHhGRiwgMHgxNiwgMHg2MCwgMHhBOCwgMHg2MiwgMHgwNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyOSwgMHg0NCwgMHg1QSwgMHhEQiwgMHg3MSwgMHhGMywKKwkgMHhDMSwgMHhGRSwgMHhENCwgMHhGRSwgMHg4NywgMHhGMSwgMHhBMywgMHhGRiwgMHhEMCwgMHg4MCwgMHhEQywgMHg4NCwgMHgwMSwgMHgwNywgMHg3MSwgMHhGQiwKKwkgMHhBOSwgMHg0NiwgMHg3MiwgMHhGMiwgMHhBOSwgMHg0NiwgMHg2NSwgMHgxOCwgMHhBOSwgMHg0NiwgMHgwMiwgMHhGMCwgMHhBOSwgMHg0NiwgMHgwRiwgMHg2MCwKKwkgMHhGRiwgMHg2MSwgMHhBMSwgMHg4NCwgMHg2MCwgMHg0MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFMSwgMHg4MiwgMHgwNywgMHhCNCwKKwkgMHgwMSwgMHg2MSwgMHgwMywgMHgwMywgMHhDQywgMHg4NCwgMHhFMSwgMHg4MSwgMHhGRCwgMHgwMiwgMHgxNiwgMHg2MCwgMHg2MiwgMHg2NSwgMHg0NiwgMHhEMSwKKwkgMHhGRiwgMHhGRiwgMHhCMSwgMHg4NCwgMHhBMiwgMHhEQiwgMHhERSwgMHg2MCwgMHg2OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgxMCwgMHgyQSwKKwkgMHhGQSwgMHgwMSwgMHhGRiwgMHg2MCwgMHhFRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBOSwgMHg0NiwgMHgwNiwgMHhGQSwgMHhBOSwgMHg0NiwgMHg2NSwgMHg0MSwKKwkgMHg3MSwgMHhGMywgMHgyOSwgMHg0NSwgMHhDQywgMHg4NCwgMHg4MCwgMHgyQiwgMHg3MSwgMHhGQiwgMHg2NSwgMHg0NiwgMHg3MiwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgzNywgMHgwMiwgMHg2MSwgMHg0MCwgMHhBNCwgMHgzQSwgMHhFNSwgMHgwMSwgMHgwMCwgMHg2MCwgMHgzQSwgMHg2MSwKKwkgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwgMHg4MSwgMHgwMywgMHgwMiwgMHg2MCwgMHg0OCwgMHg2NCwgMHgyQSwgMHhGQSwKKwkgMHhDQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhDQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhDRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHg2NywgMHhGMSwgMHgzMiwgMHhGOCwKKwkgMHg2OCwgMHhGMSwgMHgzMywgMHhGOCwgMHg2OSwgMHhGMSwgMHgzNCwgMHhGOCwgMHhBOSwgMHg0NiwgMHgwMywgMHhGMiwgMHgwNCwgMHhGMCwgMHg4NSwgMHhGMCwKKwkgMHhBOSwgMHg0NiwgMHgyQywgMHhGQSwgMHgyRCwgMHhGOCwgMHhBRSwgMHhGOCwgMHhBQywgMHhGMSwgMHgxOSwgMHhGOCwgMHhGRiwgMHg2NywgMHgwRSwgMHhGQSwKKwkgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgzRiwgMHhGQSwgMHgyOSwgMHg0NCwgMHgwNywgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwKKwkgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHhDMSwgMHhGRSwgMHgzNywgMHgwMCwgMHg4MCwgMHg2NywgMHhCNCwgMHg4MywgMHgyQSwgMHhGMiwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2NSwgMHgwQywgMHhCMCwKKwkgMHgwOSwgMHhGMCwgMHgwRCwgMHgwMiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHg5RCwgMHgxOCwgMHg2NCwgMHg0NiwgMHgzRSwgMHhGMiwKKwkgMHhBMiwgMHhGRiwgMHgwMSwgMHhCMCwgMHgxQiwgMHg2MCwgMHhBMCwgMHg2MSwgMHgwMiwgMHgwMiwgMHgxQiwgMHg2MCwgMHg4OCwgMHg2MSwgMHgwMiwgMHhGMiwKKwkgMHgwRSwgMHhGMCwgMHhENCwgMHg4MCwgMHgwOSwgMHhGNCwgMHgwNiwgMHgwMiwgMHg5MCwgMHhGMywgMHg2NCwgMHg0MCwgMHhGMCwgMHgzNywgMHgwMiwgMHgwMCwKKwkgMHhEQywgMHg4NCwgMHg5MCwgMHhGQiwgMHg2NiwgMHg0NCwgMHgwMCwgMHhBOCwgMHhGRiwgMHhGRiwgMHhGMSwgMHgwMiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwKKwkgMHg2MSwgMHg0NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhERCwgMHgwOCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwKKwkgMHhBMywgMHhGRiwgMHhBOSwgMHg0NiwgMHgwMiwgMHhGMCwgMHhBOSwgMHg0NiwgMHgwRiwgMHg2MCwgMHhGRiwgMHg2MSwgMHhBMSwgMHg4NCwgMHg2MCwgMHg0MSwKKwkgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFMSwgMHg4MiwgMHgwNywgMHhCNCwgMHgwMSwgMHg2MSwgMHgwMywgMHgwMywgMHhDQywgMHg4NCwKKwkgMHhFMSwgMHg4MSwgMHhGRCwgMHgwMiwgMHgxNiwgMHg2MCwgMHg2MiwgMHg2NSwgMHg0NiwgMHhEMywgMHg5RCwgMHg4NSwgMHhBNCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHgyNiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg0NiwgMHg0NSwgMHgzRiwgMHhGMiwgMHgwNSwgMHg0OCwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0MSwKKwkgMHg2NiwgMHg0NCwgMHgwQiwgMHgwMywgMHgwRSwgMHhBMSwgMHgwMCwgMHhGMiwgMHg0MiwgMHhGRSwgMHhBQywgMHg4NiwgMHgwMSwgMHhGMiwgMHgxRiwgMHgwMywKKwkgMHg3RiwgMHhCNSwgMHhENSwgMHg4MSwgMHg2NiwgMHg0NCwgMHhGNywgMHgwNywgMHgyNSwgMHg0NiwgMHgwNSwgMHhGMCwgMHgwNiwgMHhGQSwgMHgwNSwgMHhGQSwKKwkgMHhEMCwgMHg4MCwgMHg2NCwgMHg0MywgMHgxMywgMHgwMywgMHg2MCwgMHg0NiwgMHgwMSwgMHhGMCwgMHg4MCwgMHg2NywgMHhCMCwgMHg4NCwgMHgwMSwgMHhGQSwKKwkgMHgwMCwgMHhGMCwgMHgwMCwgMHg2NCwgMHgwMCwgMHhGQSwgMHg0NCwgMHg0NSwgMHhBMiwgMHhGRiwgMHhCNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg0OCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhBMywgMHhGRiwgMHgwOCwgMHg0NSwgMHgyNSwgMHg0NiwgMHgwMSwgMHg2NCwgMHgwMiwgMHhGQSwgMHgwMiwgMHhGRSwgMHgyRCwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyMywgMHhGMiwgMHgwNywgMHhGMCwgMHgxMCwgMHhCMCwgMHgxMCwgMHhBQywgMHgzQiwgMHgwMywgMHgyMywgMHhGQSwgMHg4MCwgMHg2NywKKwkgMHhCMCwgMHg4MSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHg2MSwgMHg0NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwNCwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHg0NiwgMHg0NSwgMHg2NCwgMHg0NiwgMHgwMiwgMHhGMCwgMHgwRiwgMHg2MCwgMHhGRiwgMHg2MSwKKwkgMHhBMSwgMHg4NCwgMHg2MCwgMHg0MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFMSwgMHg4MiwgMHgwNywgMHhCNCwgMHgwMSwgMHg2MSwKKwkgMHgwMywgMHgwMywgMHhDQywgMHg4NCwgMHhFMSwgMHg4MSwgMHhGRCwgMHgwMiwgMHgxNiwgMHg2MCwgMHg2MiwgMHg2NSwgMHg0NiwgMHhEMSwgMHhGRiwgMHhGRiwKKwkgMHhCMSwgMHg4NCwgMHhBMiwgMHhEQiwgMHg5QiwgMHhGMiwgMHgyNSwgMHg0NiwgMHhFMSwgMHg4MSwgMHg1QiwgMHhGMSwgMHg3MywgMHhGMSwgMHhDMSwgMHg4MSwKKwkgMHhDMSwgMHg4MSwgMHg5MiwgMHhGQSwgMHhBMiwgMHhGRiwgMHgwMiwgMHhGMCwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2MSwgMHhEMSwgMHg4MCwgMHgwRSwgMHhGMiwKKwkgMHgwNSwgMHgwMiwgMHg5MCwgMHhGMywgMHgyMCwgMHhCMCwgMHhDQywgMHg4NCwgMHgwMSwgMHgwMiwgMHg5MCwgMHhGQiwgMHhBMywgMHhGRiwgMHg0OCwgMHhGRSwKKwkgMHgwNywgMHgwMCwgMHgwRSwgMHhGMiwgMHgwOCwgMHhGRSwgMHhGMCwgMHg3RiwgMHg2MCwgMHg0MCwgMHgyMCwgMHgyQSwgMHgwMCwgMHg3RiwgMHgwRSwgMHhGQSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHhBMCwgMHg2MSwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg2NiwgMHg0NCwgMHg1NywgMHhGQiwgMHgwNCwgMHg2NCwgMHgwMywgMHhGQSwgMHg4MCwgMHg2NCwgMHgyQSwgMHhGQSwgMHhBQywgMHhGMSwgMHgxOSwgMHhGOCwKKwkgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NCwgMHgwRSwgMHhGQSwgMHg4OCwgMHhGMSwgMHgwNywgMHhGOCwgMHg2NywgMHg0NCwKKwkgMHgyQywgMHhGQSwgMHgyRCwgMHhGQSwgMHgyRSwgMHhGQSwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhFMSwgMHg2MCwgMHg5RSwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgxMCwgMHg2MCwgMHgwMiwgMHg2MiwgMHhFMCwgMHg2MCwgMHgwRCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxNiwgMHg2MCwgMHhCMiwgMHg2MywgMHg2NSwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgxMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwMiwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwNiwgMHg2NCwgMHhBMywgMHhEQiwKKwkgMHhFNiwgMHg2MCwgMHg1QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFNiwgMHg2MCwgMHg1OCwgMHg0RCwgMHg2NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1NywgMHhGNSwKKwkgMHhDQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhDQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhDRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHg2NywgMHhGMSwgMHgzMiwgMHhGOCwKKwkgMHg2OCwgMHhGMSwgMHgzMywgMHhGOCwgMHg2OSwgMHhGMSwgMHgzNCwgMHhGOCwgMHgxRiwgMHg2MCwgMHg5MiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMSwgMHg2NCwKKwkgMHg2NCwgMHg0MCwgMHhGRSwgMHgyNiwgMHgxMCwgMHhCQywgMHgzMiwgMHg0MCwgMHgxMCwgMHgyNiwgMHgxMCwgMHhCQywgMHgyMywgMHg2MCwgMHg0QywgMHg2MiwKKwkgMHhBMiwgMHhEQiwgMHgxRiwgMHg2MCwgMHg5MCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgxRiwgMHg2MCwgMHgxRSwgMHg2NCwgMHgwMiwgMHgxOCwgMHgxRiwgMHg2MCwKKwkgMHg0MCwgMHg2NCwgMHgyMiwgMHg2MCwgMHhBMiwgMHg2MiwgMHhBMiwgMHhEQiwgMHgyMiwgMHg2MCwgMHhCRSwgMHg2MiwgMHhBMiwgMHhEQiwgMHgyMSwgMHg2MCwKKwkgMHhDNiwgMHg2MSwgMHgyMCwgMHg2MCwgMHgzMiwgMHg2MiwgMHhBMiwgMHhEMywgMHgyMiwgMHg2MCwgMHg4MiwgMHg2NSwgMHhGRSwgMHhBNCwgMHhFMCwgMHg4NCwKKwkgMHgwMiwgMHgwNSwgMHg2NywgMHg0NCwgMHg5OSwgMHgwMCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NSwgMHgyMSwgMHg2MCwgMHhFQywgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHhBNSwgMHhEMSwgMHhEQSwgMHg4NSwgMHgyMSwgMHg2MCwgMHhFNCwgMHg2MiwgMHhBMCwgMHg4MywgMHhBMiwgMHhERCwgMHhBNSwgMHhEMSwgMHgyMSwgMHg2MCwKKwkgMHhFMiwgMHg2MiwgMHhBMCwgMHg4MywgMHhBMiwgMHhERCwgMHgyMSwgMHg2MCwgMHhDMCwgMHg2MSwgMHhERCwgMHg2MCwgMHgwNiwgMHg2NCwgMHhBMSwgMHhEQiwKKwkgMHgwNiwgMHhBMSwgMHgyMSwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMywgMHgyMSwgMHg2MCwgMHhFMiwgMHg2MiwgMHg2MCwgMHg0MCwgMHhGRCwgMHhBMCwKKwkgMHhBMiwgMHhEMywgMHg3NCwgMHgwMywgMHg1MCwgMHg2MCwgMHgwMCwgMHg3QywgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMSwgMHg2MCwKKwkgMHhGMiwgMHg2MywgMHgwRSwgMHgwMCwgMHgwNCwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMiwgMHg2MCwgMHhGMiwgMHg2MywgMHgwOSwgMHgwMCwgMHgxMCwgMHgyQSwKKwkgMHgwMywgMHgwMCwgMHgwNCwgMHg2MCwgMHhGMiwgMHg2MywgMHgwNCwgMHgwMCwgMHgyMCwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwNSwgMHg2MCwgMHhGMiwgMHg2MywKKwkgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHgyMSwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMywgMHgyMSwgMHg2MCwgMHhFNCwgMHg2MiwgMHhGRSwgMHhBMCwKKwkgMHhBMiwgMHhEMywgMHg1NCwgMHgwMywgMHgwMCwgMHg2MCwgMHgwMCwgMHg2MywgMHg1OSwgMHhERCwgMHg2MSwgMHg0NSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwKKwkgMHgwNCwgMHgwMCwgMHgwMCwgMHg2MCwgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwNCwgMHgwMCwKKwkgMHgwMSwgMHg2MCwgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHg2MCwgMHg0MCwgMHgwNCwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwMiwgMHg2MCwKKwkgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHg2MCwgMHg0MCwgMHgxMCwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwNCwgMHg2MCwgMHhGMiwgMHg2MywKKwkgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHg2MCwgMHg0MCwgMHgyMCwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwNSwgMHg2MCwgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwKKwkgMHg1OSwgMHhERCwgMHhENSwgMHg4MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhBNSwgMHhERCwgMHgyMSwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHgyMSwgMHg2MCwgMHhFNiwgMHg2MiwgMHhGRiwgMHhBMCwgMHhBMiwgMHhEMywgMHgyMSwgMHgwMywgMHgwMCwgMHg2MCwgMHgwMCwgMHg2MywgMHg1OSwgMHhERCwKKwkgMHg2MSwgMHg0NSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwMCwgMHg2MCwgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwKKwkgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwMSwgMHg2MCwgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHg2MCwgMHg0MCwKKwkgMHgwNCwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwMiwgMHg2MCwgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHhENSwgMHg4MywgMHhFQiwgMHg4MywKKwkgMHhFQiwgMHg4MywgMHhBNSwgMHhERCwgMHgyMSwgMHg2MCwgMHhFOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg1OSwgMHhEOSwgMHgyMSwgMHg2MCwgMHhDMCwgMHg2NSwKKwkgMHhENSwgMHg4NCwgMHhERCwgMHg3RiwgMHhBNSwgMHhEQiwgMHg2NSwgMHg0NCwgMHgyMiwgMHg2MCwgMHhBQywgMHg2MiwgMHhBMiwgMHhEQiwgMHgyMiwgMHg2MCwKKwkgMHhDOCwgMHg2MiwgMHhBMiwgMHhEQiwgMHg1NywgMHhGNSwgMHhDQiwgMHhGMywgMHhDQywgMHhGMSwgMHgwMCwgMHg2MywgMHhDMCwgMHg4NywgMHhDRCwgMHhGMSwKKwkgMHg1QSwgMHhGRCwgMHhDMCwgMHg4NSwgMHg2NSwgMHg0NywgMHhDNCwgMHg4NCwgMHgwNywgMHhCNSwgMHgxQywgMHg2MCwgMHgxMCwgMHg2MiwgMHgxNiwgMHg2MCwKKwkgMHhBRSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhEMiwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFMCwgMHg2MCwKKwkgMHgxNywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhEMCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1NywgMHhGNSwgMHgwMCwgMHg2NCwgMHg5NSwgMHhGQiwgMHg5NiwgMHhGQiwgMHg5NywgMHhGQiwKKwkgMHg3NSwgMHhGQiwgMHg2NiwgMHhGMywgMHgwMCwgMHg3NSwgMHgwMCwgMHg3MiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg5MywgMHhDNywgMHhGMywKKwkgMHhFRCwgMHhFMiwgMHhDQywgMHg4NCwgMHg1QSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhEMiwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhFMCwgMHg2MCwgMHgzNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NSwgMHhGMSwgMHgyMywgMHg2MCwgMHgwMiwgMHg2MiwgMHhBMiwgMHhEOSwgMHgyMiwgMHg2MCwgMHhBQSwgMHg2NSwKKwkgMHhFMiwgMHg2MCwgMHg1OCwgMHg0RCwgMHgyRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFMSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhBOCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhFMiwgMHg2MCwgMHg1OCwgMHg0RCwgMHg0OSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1NywgMHhGNSwgMHgwMCwgMHhGNCwgMHg2NiwgMHhGMSwgMHgwNiwgMHhGOCwKKwkgMHgyMywgMHg2MCwgMHg0QywgMHg2MiwgMHhBMiwgMHhEMywgMHgwNywgMHhGQSwgMHgyMiwgMHg2MCwgMHhBMiwgMHg2NCwgMHg0MCwgMHg0OCwgMHgxMCwgMHg2MSwKKwkgMHgwMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhFMSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhFNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1NywgMHhGNSwgMHgzRiwgMHhGQywKKwkgMHg1QSwgMHhGMywgMHhDNywgMHhGMSwgMHhBQywgMHg4MywgMHgwMSwgMHg2NCwgMHgwMiwgMHgwMiwgMHg2QywgMHhGQiwgMHg2NCwgMHg0MywgMHgxQiwgMHg2MCwKKwkgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwNCwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHhDRiwgMHg4MywgMHg3MywgMHhGMywgMHg1QSwgMHhGRCwgMHhEQywgMHg4NCwgMHg3MywgMHhGQiwKKwkgMHg1QywgMHhGMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4NCwgMHg1QywgMHhGQiwgMHgwMywgMHgwMywgMHhFMSwgMHg2MCwgMHgwQSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwQSwgMHg2NCwgMHg1QywgMHhGQiwgMHhBMiwgMHg0QywgMHgyMCwgMHgyNywgMHhGOCwgMHgwMSwgMHg0NiwgMHg2MCwgMHg1MCwgMHg2NSwgMHg3MiwgMHg0NCwKKwkgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGMiwgMHgwNCwgMHg1RCwgMHhGQiwgMHg0MCwgMHg0OCwgMHg5NSwgMHhGMywgMHg1RSwgMHhGQiwgMHg0MCwgMHg0QSwKKwkgMHg5NiwgMHhGMywgMHg5NywgMHhGMywgMHg0MCwgMHg0QywgMHg2MCwgMHg0MSwgMHg2NiwgMHhGMSwgMHg0MCwgMHg2MywgMHhBRCwgMHg4MCwgMHhGMCwgMHhBMywKKwkgMHgwOSwgMHgwMiwgMHgzQywgMHgwMywgMHgyQywgMHg0MSwgMHgyQSwgMHg0NCwgMHg0MCwgMHg0QywgMHgyOCwgMHg0NCwgMHg0MCwgMHg0QSwgMHgwMCwgMHg2NCwKKwkgMHg0MCwgMHg0OCwgMHhGNCwgMHgwMSwgMHhEMSwgMHg4MCwgMHgwMSwgMHgwMiwgMHgzMSwgMHgwNCwgMHgxMCwgMHhBMywgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NSwKKwkgMHhBNSwgMHg4MCwgMHhDRiwgMHg4MywgMHgwOCwgMHgwMiwgMHgyOCwgMHg0NCwgMHg2MCwgMHg4OCwgMHgyQSwgMHg0NCwgMHg3MCwgMHg4QSwgMHgyQywgMHg0NCwKKwkgMHg3MCwgMHg4QywgMHhGMSwgMHg4MSwgMHhGNSwgMHgwMSwgMHhFNywgMHhBMywgMHg2NCwgMHg0NCwgMHgwMCwgMHhBMCwgMHgwMCwgMHg2MiwgMHgwMiwgMHgwMiwKKwkgMHgwMCwgMHg2MSwgMHgxQywgMHgwMCwgMHhFMCwgMHg4NCwgMHhERSwgMHg4MiwgMHhGRCwgMHgwNCwgMHg0MiwgMHhGRSwgMHhGOCwgMHg4NCwgMHg2MiwgMHg0NSwKKwkgMHhDNywgMHg4MywgMHg2MCwgMHg0NSwgMHgwMiwgMHhGRSwgMHhENSwgMHg4NCwgMHgwMiwgMHgwNSwgMHgwMSwgMHgwNSwgMHg2MSwgMHg0NCwgMHhDRiwgMHg4MywKKwkgMHg2MCwgMHg0MSwgMHgwOCwgMHgwMywgMHgyOCwgMHg0NCwgMHg2MCwgMHg4OCwgMHgyQSwgMHg0NCwgMHg3MCwgMHg4QSwgMHgyQywgMHg0NCwgMHg3MCwgMHg4QywKKwkgMHhGMSwgMHg4MSwgMHhGMSwgMHgwMSwgMHhDRSwgMHg4MiwgMHhFOSwgMHg4MSwgMHhGRCwgMHgwMiwgMHhGMSwgMHg4MSwgMHg2MSwgMHg0NCwgMHgwMCwgMHhBOCwKKwkgMHhGRiwgMHhGRiwgMHgzMCwgMHgwMywgMHg3MywgMHg0MCwgMHg1RCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwKKwkgMHg1RSwgMHhGMywgMHgzRiwgMHhCNSwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwKKwkgMHhCNCwgMHg4NCwgMHg2MSwgMHg0NSwgMHhENCwgMHg4NCwgMHhDMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4MSwKKwkgMHg2NCwgMHg0NCwgMHg3MywgMHg0NSwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NSwgMHg2MSwgMHg0NCwgMHhENCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgxMCwgMHgwMywgMHg2MCwgMHg1MywgMHhENCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg3NSwgMHhGMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwKKwkgMHgwMSwgMHhCNCwgMHg3NSwgMHhGQiwgMHgxRiwgMHg2MCwgMHgxNCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHhFNiwgMHg2MCwgMHhBMywgMHg3OCwgMHhGRiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHg2NCwgMHgwMywgMHhGQSwgMHgwMCwgMHhGNCwgMHgwOSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwMCwgMHgzQSwgMHgxQywgMHgwMCwKKwkgMHg2MCwgMHg0MywgMHgwMCwgMHgzNiwgMHgxQywgMHgwMCwgMHhFMCwgMHhBMCwgMHhEQSwgMHg4NSwgMHgxNiwgMHgwNywgMHgxRiwgMHg2MCwgMHgxRSwgMHg2MSwKKwkgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHhEMywgMHg4MCwgMHhDQiwgMHg4MywgMHgwRiwgMHgwMiwgMHgwNywgMHgwRSwgMHg1OSwgMHhEMywgMHhBNSwgMHhEMCwKKwkgMHhEQSwgMHg4NSwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMiwgMHhGOSwgMHgxRiwgMHgxMywgMHgxRSwgMHhBNSwgMHhEMCwgMHg1OSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHg5MCwgMHg4MCwgMHhGRiwgMHgyMiwgMHgwRCwgMHgwMCwgMHhFMSwgMHg2MCwgMHg5QywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwKKwkgMHg5MCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwgMHgxRiwgMHg2MCwgMHg0MCwgMHg2NCwKKwkgMHgwMiwgMHgwMCwgMHgxRiwgMHg2MCwgMHgxRSwgMHg2NCwgMHgyMiwgMHg2MCwgMHhCRSwgMHg2MiwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NiwgMHgyRiwgMHhGMiwKKwkgMHgyQywgMHhGQSwgMHgzMCwgMHhGMiwgMHgyRCwgMHhGQSwgMHgzMSwgMHhGMiwgMHgyRSwgMHhGQSwgMHhDQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhDQywgMHhGMSwKKwkgMHgzMCwgMHhGOCwgMHhDRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHg2NywgMHhGMSwgMHgzMiwgMHhGOCwgMHg2OCwgMHhGMSwgMHgzMywgMHhGOCwgMHg2OSwgMHhGMSwKKwkgMHgzNCwgMHhGOCwgMHg1MCwgMHg2MywgMHgyQSwgMHhGQywgMHhBQywgMHhGMywgMHgxOSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHg4OCwgMHhGMywKKwkgMHgwNywgMHhGQSwgMHgwMCwgMHhGNCwgMHg2NiwgMHhGMSwgMHgwNiwgMHhGOCwgMHgyMywgMHg2MCwgMHg0QywgMHg2MiwgMHhBMiwgMHhEMywgMHgwNywgMHhGQSwKKwkgMHgyMiwgMHg2MCwgMHhDNiwgMHg2NSwgMHhFMiwgMHg2MCwgMHg1OCwgMHg0RCwgMHgyRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMiwgMHg2MCwgMHhCRSwgMHg2NCwKKwkgMHg0MCwgMHg0OCwgMHgxMCwgMHg2MSwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhFMSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhFNSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyNiwgMHg0NiwgMHgzRiwgMHhGQywgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgyMCwgMHg0NCwgMHg4MCwgMHgyNiwKKwkgMHgxMSwgMHgwMCwgMHg4MCwgMHhCQywgMHg0MCwgMHg0MCwgMHgwMCwgMHg2NCwgMHg5NSwgMHhGQiwgMHg5NiwgMHhGQiwgMHg5NywgMHhGQiwgMHg3NSwgMHhGQiwKKwkgMHg2NiwgMHhGMywgMHgwMCwgMHg3NSwgMHgwMCwgMHg3MiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg5MywgMHhDNywgMHhGMywgMHhFRCwgMHhFMiwKKwkgMHhDQywgMHg4NCwgMHg1QSwgMHhGQiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwgMHgwMCwgMHg2NCwgMHg3MywgMHhGQiwgMHg3NSwgMHhGQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgzRSwgMHg2MywgMHgxNiwgMHg2MCwgMHg2MCwgMHg2MSwgMHg1OSwgMHhEMSwgMHg2MSwgMHg0NiwgMHgwOCwgMHgxQiwgMHhGQywgMHgxRiwgMHgyMiwgMHg2MCwKKwkgMHhERSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMSwgMHg2NSwgMHgwMCwgMHg2MSwgMHgxNywgMHgwMCwgMHgxNiwgMHg2MCwgMHhBMiwgMHg2MSwKKwkgMHg0OSwgMHhEMSwgMHhDQiwgMHg4MywgMHhGRCwgMHgxOCwgMHg2MywgMHg0MSwgMHgwNCwgMHhBMSwgMHg2MSwgMHg0NSwgMHg2NiwgMHg0MywgMHgyMiwgMHg2MCwKKwkgMHhERSwgMHg2NCwgMHhEQywgMHg4NCwgMHg2MCwgMHhGRSwgMHhBMywgMHhEMSwgMHhERiwgMHg4MywgMHhBMCwgMHhEOSwgMHhDRCwgMHg4MSwgMHgyMCwgMHhGRSwKKwkgMHhGOCwgMHgwMiwgMHg2NiwgMHg0NCwgMHgxNiwgMHg2MCwgMHg2MiwgMHg3QywgMHhEMCwgMHg4MSwgMHg1QSwgMHhGMywgMHhDNywgMHhGMSwgMHgyMiwgMHg2MCwKKwkgMHhEQywgMHg2MywgMHgwMCwgMHhBMCwgMHg2NCwgMHg1RiwgMHhCRCwgMHhEQiwgMHgxQiwgMHg2MCwgMHg5NCwgMHg2NiwgMHhBNiwgMHhEMSwgMHgwMiwgMHgwMiwKKwkgMHgwMSwgMHgxOCwgMHgwMSwgMHhCOSwgMHg2MSwgMHg0NCwgMHg2MCwgMHhGRSwgMHhBMywgMHhEQiwgMHhGQywgMHhBMywgMHg2NSwgMHg0NCwgMHgwMywgMHhBNCwKKwkgMHhBMywgMHhEQiwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMywgMHg2MCwgMHg0RSwgMHg2MiwgMHhBMiwgMHhEQiwKKwkgMHhDRCwgMHg4MSwgMHgyOCwgMHhEMywgMHg1QSwgMHg4OCwgMHhEQywgMHg4MywgMHgzOSwgMHgxOCwgMHhGQiwgMHgwMywgMHg2MSwgMHg0MCwgMHg3RiwgMHgzQSwKKwkgMHgwNywgMHgwMCwgMHgyMywgMHg2MCwgMHg0RSwgMHg2MiwgMHhBMiwgMHhEMywgMHgwMywgMHg2MSwgMHg3QywgMHhBNCwgMHhBMiwgMHhEQiwgMHgwMCwgMHhGNCwKKwkgMHg2MCwgMHhGRSwgMHhBMywgMHhEMSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEOCwgMHg2MSwgMHg0MCwgMHg3RiwgMHgzQSwgMHgwOSwgMHgwMCwgMHgyMCwgMHhGRSwKKwkgMHgyMywgMHg2MCwgMHg0RSwgMHg2MiwgMHhBMiwgMHhEMywgMHgwMywgMHg2MSwgMHg3QywgMHhBNCwgMHhBMiwgMHhEQiwgMHgwMCwgMHhGNCwgMHg2MCwgMHhGRSwKKwkgMHhDRiwgMHg4MywgMHhBMywgMHhEMywgMHhERCwgMHg4MSwgMHhBMSwgMHhEQSwgMHhGRiwgMHhCNCwgMHgwMCwgMHg3RiwgMHgxNSwgMHgwMywgMHhEQiwgMHg4MywKKwkgMHg2MSwgMHg0MCwgMHg3RiwgMHgzQSwgMHgwQiwgMHgwMCwgMHgyMCwgMHhGRSwgMHg2MCwgMHg0NSwgMHgyMywgMHg2MCwgMHg0RSwgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHgwMywgMHg2MSwgMHg3QywgMHhBNCwgMHhBMiwgMHhEQiwgMHg2NSwgMHg0NCwgMHgwMCwgMHhGNCwgMHg2MCwgMHhGRSwgMHhBMywgMHhEMSwgMHhERiwgMHg4MywKKwkgMHhERCwgMHg4MSwgMHhDQywgMHg4NCwgMHhBMSwgMHhEOCwgMHhFQywgMHgwMiwgMHgyMCwgMHhGRSwgMHhDMywgMHgwMSwgMHgyMywgMHg2MCwgMHg0RSwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHhGRCwgMHhBMSwgMHhGRiwgMHhCMSwgMHhDMSwgMHg4MywgMHhBMiwgMHhERCwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2NywgMHg1QywKKwkgMHgxMSwgMHg2MCwgMHhGMCwgMHg2MSwgMHhBMSwgMHhEMywgMHhBNSwgMHhEOSwgMHgxMiwgMHgxOCwgMHg2MCwgMHg0MywgMHgyMywgMHg2MCwgMHgwNCwgMHg2NCwKKwkgMHhBNSwgMHhEQiwgMHg2MCwgMHhGRSwgMHhBMCwgMHhERCwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHhEQywgMHg4NCwgMHhDRiwgMHg4MywgMHhFMywgMHg4MywKKwkgMHg1OSwgMHhEMSwgMHhEQywgMHg4NCwgMHg2MCwgMHhGRSwgMHhBMCwgMHhEOSwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHhGOSwgMHgxRiwgMHgyRCwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyMCwgMHg0MCwgMHgyMCwgMHgyQSwgMHgwRCwgMHgwMCwgMHgxMiwgMHg2MCwgMHhCOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg1MCwgMHhGMywKKwkgMHgyMywgMHg2MCwgMHgzOSwgMHg2MywgMHg2MCwgMHhGRSwgMHhBMywgMHhEOSwgMHhERiwgMHg4MywgMHg2MCwgMHg0NywgMHhBMywgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyMCwgMHhGRSwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg1NywgMHgzMiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgyNSwgMHgwMCwgMHg0NSwgMHg0OCwKKwkgMHgwMCwgMHg2MCwgMHgxMCwgMHg2MSwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRCwgMHgwMywgMHhGMiwgMHg2MCwKKwkgMHgwMiwgMHg2NCwgMHgyNCwgMHhGQSwgMHgwMCwgMHg2MCwgMHg0OCwgMHg2MSwgMHgyOCwgMHg0NCwgMHg1OSwgMHhEQSwgMHgwMywgMHg2NCwgMHgzOCwgMHg0MywKKwkgMHhCRCwgMHhEMSwgMHhDQywgMHg4NCwgMHg1OSwgMHhEOCwgMHhGQywgMHgwMiwgMHgzOSwgMHg0NCwgMHg1OSwgMHhEQSwgMHgwNiwgMHg2NCwgMHgyMywgMHhGQSwKKwkgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHhDQSwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGQSwgMHhGRSwgMHgzNywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg1NywgMHgzMiwgMHg0MCwKKwkgMHg0MCwgMHgyNiwgMHg1MSwgMHgwMCwgMHg0NSwgMHg0OCwgMHgwMCwgMHg2MCwgMHg2OCwgMHg2MSwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg0OSwgMHgwMywgMHhGMiwgMHg2MCwgMHgwMSwgMHg2NCwgMHgyNCwgMHhGQSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MSwgMHg0NiwgMHg0QSwKKwkgMHgzOCwgMHg0NCwgMHg1NCwgMHg5NCwgMHgwMywgMHg2NCwgMHgwMSwgMHgwMiwgMHgwOSwgMHgwMCwgMHgwNiwgMHg2MywgMHg0QSwgMHg2MSwgMHgzOCwgMHg0NiwKKwkgMHhCRCwgMHhEMCwgMHhDQywgMHg4NCwgMHgyQSwgMHg0NiwgMHg1OSwgMHhEOCwgMHhGQSwgMHgwMiwgMHgwNiwgMHgwMCwgMHhEQSwgMHg4MSwgMHgzOCwgMHg0MywKKwkgMHhCRCwgMHhEMSwgMHhDQywgMHg4NCwgMHg1OSwgMHhEOCwgMHhGQywgMHgwMiwgMHgwNSwgMHg2MywgMHgyOCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgyNSwgMHhGQSwKKwkgMHgwNywgMHgwMiwgMHgwMywgMHg2NCwgMHgzOSwgMHg0MywgMHhCRCwgMHhEMSwgMHhDQywgMHg4NCwgMHg1OSwgMHhEOCwgMHhGQywgMHgwMiwgMHgwOCwgMHg2MywKKwkgMHgyMiwgMHg2MCwgMHgyOCwgMHg3QywgMHgyOCwgMHg0NCwgMHgwMywgMHhBOCwgMHhBNCwgMHhEMywgMHgwRiwgMHgwMywgMHhFOCwgMHg4NSwgMHhDNywgMHg4NSwKKwkgMHg2MCwgMHg0MywgMHhGRSwgMHhBMywgMHgyMiwgMHg2MCwgMHgyQSwgMHg2NCwgMHg1OCwgMHhEMSwgMHhEOSwgMHg4MSwgMHhBMSwgMHhEOCwgMHg3RSwgMHgyQSwKKwkgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MSwgMHhGOCwgMHgxRiwgMHg2NSwgMHg0MywgMHgyQSwgMHg0NiwgMHgyMywgMHhGQywgMHgxQiwgMHg2MCwKKwkgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHhDQSwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGQSwgMHhGRSwgMHgzNywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg1NywgMHgzMiwgMHg0MCwgMHg0MCwgMHgyNiwKKwkgMHgxQywgMHgwMCwgMHg0NSwgMHg0OCwgMHgwMCwgMHg2MCwgMHgwNiwgMHg2MSwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxNCwgMHgwMywgMHgwMiwgMHg2NCwgMHgyMywgMHhGQSwgMHhGMiwgMHg2MCwgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQSwgMHgyOCwgMHg0NCwgMHg1QSwgMHhEQSwKKwkgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHhDQSwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGQSwgMHhGRSwgMHgzNywgMHg1OCwgMHhGRiwgMHhGRiwgMHhBMiwgMHhGRiwKKwkgMHgzMiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgzRSwgMHgwMCwgMHg3QywgMHhGMywgMHg2NywgMHg0MywgMHhEQywgMHg4NCwgMHhDQywgMHg4NCwgMHgzOSwgMHgwMywKKwkgMHg2MCwgMHg0NiwgMHgwQSwgMHgwMiwgMHg3QywgMHhGRCwgMHgwMCwgMHg2MCwgMHg0NiwgMHg2MSwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg3QywgMHhGQiwgMHgyRSwgMHgwMywgMHg0NiwgMHg0QiwgMHgxRSwgMHg2MCwgMHhEOCwgMHg2MSwgMHgxOCwgMHg2NCwKKwkgMHgyMywgMHhGQSwgMHhGMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHgyNCwgMHhGQSwgMHg0QSwgMHg2NSwgMHhBMiwgMHhGRiwgMHgyQywgMHg2MywgMHgwMCwgMHg2NCwKKwkgMHg1OSwgMHhEMSwgMHhBMiwgMHhEQiwgMHhBNSwgMHhEOCwgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwKKwkgMHhGNywgMHgxRiwgMHgxMiwgMHg2MywgMHg1OSwgMHhEMSwgMHhBNSwgMHhEOCwgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwKKwkgMHgwNCwgMHg2NSwgMHhGOCwgMHgxRiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHhDQSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyQiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGQSwgMHhGRSwgMHhBNiwgMHhGRSwgMHgwMCwgMHg2NCwKKwkgMHg3QywgMHhGQiwgMHhBMywgMHhGRiwgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBNiwgMHhGRSwgMHhCOCwgMHgwNSwgMHhBNywgMHhGRSwKKwkgMHgwQSwgMHgwNSwgMHhBNSwgMHhGRSwgMHgwMywgMHgwNCwgMHhFMywgMHg2MCwgMHhEMywgMHg3OCwgMHhGRiwgMHhGRiwgMHhBNCwgMHhGRSwgMHhGMiwgMHgwNCwKKwkgMHhFNCwgMHg2MCwgMHg2OSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzNiwgMHg0NSwgMHgxNywgMHg2MCwgMHg1MiwgMHg2NCwgMHg0NCwgMHhENywgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHgyOCwgMHhGMywgMHg3RSwgMHhGMSwgMHg2MCwgMHg0NywgMHgwNywgMHhCNCwgMHg0RSwgMHhGQiwgMHgwMSwgMHg2MSwgMHgwMywgMHgwMywKKwkgMHhDQywgMHg4NCwgMHhFMSwgMHg4MSwgMHhGRCwgMHgwMiwgMHg5RCwgMHg4NCwgMHhBMSwgMHg4MCwgMHhBMCwgMHg4MywgMHgxQSwgMHgwMywgMHg3RSwgMHhGRCwKKwkgMHgwRiwgMHg2MCwgMHhGNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHg3RSwgMHhGMSwgMHgzMSwgMHg0NCwgMHg2NCwgMHg0MCwgMHhGRiwgMHgyNiwgMHgwOSwgMHgwMCwgMHhGRSwgMHhCNCwgMHg0MCwgMHg1MSwgMHgwMSwgMHg3QywKKwkgMHhCQywgMHhGOSwgMHg0OSwgMHhGMywgMHgwMSwgMHg2MywgMHg2MCwgMHg0MCwgMHhGRiwgMHgyNiwgMHg0OSwgMHhGRCwgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhFMywgMHg2MCwgMHhEMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwgMHhCNiwgMHg2MywgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwKKwkgMHhCRCwgMHhEMSwgMHhCMCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMiwgMHg2QiwgMHhGQiwgMHgzMSwgMHg0NCwgMHhGRSwgMHhCNCwKKwkgMHg0MCwgMHg1MSwgMHgwRCwgMHg2NCwgMHgwNSwgMHhGQiwgMHgzRiwgMHgwMCwgMHgyOCwgMHhGMywgMHg3RSwgMHhGMSwgMHg2MCwgMHg0NywgMHg2NCwgMHg0MSwKKwkgMHgwNywgMHhCMSwgMHgwNywgMHhCNCwgMHgwOCwgMHgyNCwgMHg2NywgMHg0QywgMHg0RSwgMHhGQiwgMHgwMSwgMHg2MSwgMHgwMywgMHgwMywgMHhDQywgMHg4NCwKKwkgMHhFMSwgMHg4MSwgMHhGRCwgMHgwMiwgMHhBMSwgMHg4MCwgMHhCMSwgMHg4MywgMHgyRSwgMHgwMiwgMHg3RSwgMHhGRCwgMHgxRiwgMHg2MCwgMHhBQSwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHhDNSwgMHhGQiwgMHg2NSwgMHhGQiwgMHg3RSwgMHhGMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4NSwgMHhBNCwgMHg4MCwgMHg3RSwgMHhGQiwKKwkgMHgxNywgMHgwMiwgMHgxQiwgMHg2MCwgMHhDNCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHg0NiwgMHg1RSwKKwkgMHgzMSwgMHg0NCwgMHgwMSwgMHhCQywgMHg0MCwgMHg1MSwgMHhFRCwgMHhFMiwgMHgwRiwgMHg0RSwgMHhDRSwgMHg2MCwgMHg1OCwgMHg0RiwgMHgwNywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwgMHgwMSwgMHg2NSwgMHhFMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHhERCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMCwKKwkgMHgwRiwgMHg2MCwgMHhENiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHhFNSwgMHg2MCwgMHgxNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhENywgMHhGRSwgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyRSwgMHhGNSwKKwkgMHgyNywgMHhGMiwgMHgxMiwgMHg2MCwgMHhDRSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwKKwkgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgyNywgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwKKwkgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgyNiwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwKKwkgMHg2MSwgMHg0NiwgMHgyNSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwKKwkgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwgMHg4OCwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHgyOCwgMHgwMiwgMHgxNCwgMHg2MCwKKwkgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMywgMHhEQSwgMHg4MSwgMHg2MCwgMHg0NSwgMHhENSwgMHg4MCwgMHhBMSwgMHhEMSwgMHgwNCwgMHgwMywgMHhEMywgMHg4MCwKKwkgMHhEOSwgMHg4MSwgMHhGQSwgMHgwMiwgMHgwOSwgMHgwMCwgMHhBMSwgMHhERCwgMHgxNCwgMHg2MCwgMHhEMCwgMHg2MiwgMHhEOSwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHg0QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NSwgMHg2MywgMHg0NiwgMHgwNiwgMHhGMiwgMHhGRiwgMHg2MCwKKwkgMHgwMSwgMHg3QywgMHhBMCwgMHg5QywgMHgwNiwgMHhGOCwgMHg2NSwgMHg0NiwgMHg3MSwgMHhGMywgMHg2MCwgMHg0MCwgMHgxMCwgMHgyQSwgMHgwMywgMHgwMCwKKwkgMHhDQywgMHg4NCwgMHg4MCwgMHgyQiwgMHg3MSwgMHhGQiwgMHhFNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBQiwgMHgwMSwKKwkgMHgyRSwgMHhGNSwgMHgyNSwgMHg2MCwgMHgyOCwgMHg2MSwgMHgyOCwgMHhGMCwgMHhGRiwgMHhGRiwgMHhBMSwgMHhEOSwgMHgyNywgMHhGMiwgMHgxMiwgMHg2MCwKKwkgMHhDRSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywKKwkgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgyNywgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwKKwkgMHg2MSwgMHg0NiwgMHgyNiwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwgMHgyNSwgMHhGMCwKKwkgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwKKwkgMHg4OCwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHgxMywgMHgwMiwgMHg2MywgMHg0NiwgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHhCMCwgMHgwOCwgMHhCQywgMHgwRCwgMHgwMywgMHgwNiwgMHhGQSwgMHhFNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5RCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhFOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHg2QSwgMHgwMSwgMHg3RSwgMHhGMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MSwgMHgwNywgMHhCMSwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyNCwgMHg2NywgMHg0QywKKwkgMHgxQiwgMHg2MCwgMHhDNCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHg0NiwgMHg1RSwgMHgxRiwgMHg2MCwKKwkgMHhBQSwgMHg2MiwgMHhBMiwgMHhEMywgMHhDNSwgMHhGQiwgMHg2NSwgMHhGQiwgMHgxRiwgMHg2MCwgMHhCNiwgMHg2MywgMHhCRCwgMHhEMSwgMHhDQiwgMHhGOSwKKwkgMHg2NywgMHhGOSwgMHhCRCwgMHhEMSwgMHhDQywgMHhGOSwgMHg2OCwgMHhGOSwgMHhBMywgMHhEMSwgMHhDRCwgMHhGOSwgMHg2OSwgMHhGOSwgMHgwMSwgMHg2NCwKKwkgMHg2QiwgMHhGQiwgMHgzMSwgMHg0NCwgMHgyMSwgMHhCQywgMHg0MCwgMHg1MSwgMHgyMCwgMHg0NCwgMHgwMSwgMHg2NSwgMHgzNCwgMHg4MCwgMHgwMSwgMHg2NCwKKwkgMHg1MSwgMHhGQiwgMHgyMSwgMHg2MCwgMHg1MCwgMHg2NCwgMHg1MiwgMHhGQiwgMHgwRiwgMHg0RSwgMHhFOCwgMHg2MCwgMHg1OCwgMHg0RiwgMHgwMiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg1NywgMHg2MywgMHg0NiwgMHg0MywgMHg0NywKKwkgMHgxRSwgMHhGMiwgMHg3MiwgMHhGMiwgMHgwMiwgMHgxQiwgMHgwMSwgMHgxQiwgMHgwQywgMHgwMCwgMHg2MCwgMHg0NiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2NCwKKwkgMHg0MCwgMHg0QiwgMHhGMCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg0NiwgMHg3MiwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHhGNCwgMHgxQiwgMHgzNywgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwgMHhBQywgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwKKwkgMHg2MCwgMHg0NiwgMHgwRSwgMHhGMiwgMHg1QiwgMHgwMywgMHg2MCwgMHg0MCwgMHhGMCwgMHgzNywgMHg0OCwgMHgwMCwgMHhGRiwgMHgzNywgMHgzRCwgMHgwMCwKKwkgMHhGRCwgMHgzNywgMHgzNSwgMHgwMCwgMHgxOCwgMHgzNywgMHgyOSwgMHgwMCwgMHhGRSwgMHgzNywgMHgyQywgMHgwMCwgMHhGOCwgMHgzNywgMHgwQSwgMHgwMCwKKwkgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHg0NiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhENiwgMHgwMSwgMHgwNiwgMHhCNCwgMHhGRCwgMHg3RiwgMHgwRSwgMHhGQSwKKwkgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHhCMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGOSwgMHhGRSwgMHhDNiwgMHgwMSwgMHhEQiwgMHg2MCwgMHg1OCwgMHg0RiwgMHhCNywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgxNCwgMHgwMCwgMHhERSwgMHg2MCwgMHg1OCwgMHg0RiwgMHg5OSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCQywgMHgwMywgMHgyMywgMHhGMCwKKwkgMHg2MCwgMHg0MCwgMHgwNCwgMHgyNiwgMHhFMiwgMHgxQiwgMHgwMiwgMHgyNiwgMHhFMCwgMHgxOCwgMHhBMiwgMHhGRiwgMHgwMiwgMHhGMCwgMHgwOSwgMHg2MCwKKwkgMHgwOCwgMHg2NCwgMHhEMCwgMHg4MCwgMHg5MCwgMHhGMywgMHgwMiwgMHgwMiwgMHhDQywgMHg4NCwgMHg5MCwgMHhGQiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2NCwKKwkgMHg0MCwgMHg0QiwgMHhGMCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBNSwgMHgwMSwgMHhBQywgMHhGRSwgMHgwOSwgMHgwNSwKKwkgMHhBRCwgMHhGRSwgMHgxMCwgMHgwNSwgMHhBRSwgMHhGRSwgMHg5RiwgMHgwNSwgMHhBRiwgMHhGRSwgMHgzQSwgMHgwNSwgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhDRSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHhGNCwgMHgwMSwgMHgxMCwgMHg2MCwgMHgwMiwgMHg2NSwgMHgwMywgMHg2MSwgMHgwNywgMHgwMCwgMHhBMiwgMHhERCwgMHg1OCwgMHg0RiwKKwkgMHg2NCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhCOSwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMywgMHgwMCwgMHg2MywgMHhBNSwgMHhEMSwgMHg1QSwgMHhEMywKKwkgMHhEQSwgMHg4NSwgMHgwMCwgMHhBOCwgMHhDRCwgMHg4MSwgMHhGMiwgMHgwMiwgMHhGOCwgMHgwMiwgMHhFMCwgMHgwMSwgMHgwRiwgMHg2MCwgMHhDQywgMHg2MiwKKwkgMHgwRiwgMHg2MCwgMHhGMiwgMHg2NSwgMHhFNSwgMHg2MCwgMHg0RSwgMHg2MywgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhENiwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgwMywgMHg1QSwgMHhEQiwgMHg1QSwgMHhEQiwgMHg1QSwgMHhERCwgMHhGOSwgMHgwMSwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgwMCwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhENiwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywgMHg1QSwgMHhERCwgMHhGQiwgMHgwMSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhEMCwgMHg2NCwgMHg0MCwgMHg0MSwgMHgwRiwgMHg2MCwgMHhDRSwgMHg2MywgMHhBMywgMHhEMSwgMHgwMCwgMHg2NCwgMHhEMCwgMHg4MCwKKwkgMHgwNiwgMHg2MSwgMHgwOCwgMHgwMywgMHhCRCwgMHhEQiwgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHhCMCwgMHg4NCwgMHhDRCwgMHg4MSwgMHhBMywgMHhEQiwKKwkgMHgwNiwgMHhBMywgMHhGOSwgMHgwMiwgMHgwRiwgMHg2MCwgMHhGNCwgMHg2MywgMHhBMywgMHhEMSwgMHgwMCwgMHg2NCwgMHhEMCwgMHg4MCwgMHgwNywgMHg2MSwKKwkgMHgxOSwgMHgwMywgMHhCRCwgMHhEQiwgMHg2NCwgMHg0NCwgMHhGRSwgMHhBMywgMHgwMiwgMHhBMywgMHhDRCwgMHg4MSwgMHhFOCwgMHg4NCwgMHhFMywgMHgwMywKKwkgMHgwMiwgMHgwNSwgMHhFMSwgMHgwMywgMHhGOSwgMHgwMSwgMHg3OCwgMHhGQiwgMHg3QSwgMHhGRCwgMHg2MSwgMHg1QywgMHhBMywgMHhEMywgMHg3OSwgMHhGOSwKKwkgMHgwMywgMHgxOCwgMHg1OCwgMHg0RiwgMHg2MCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg3QSwgMHhGMywgMHg3OSwgMHhGMSwgMHg2MCwgMHg0MywgMHg3OCwgMHhGMywKKwkgMHg2NCwgMHg0MSwgMHhFQSwgMHgwMSwgMHgyMSwgMHg0MywgMHgwRiwgMHg2MCwgMHhGNCwgMHg2NSwgMHhENywgMHg4MCwgMHhCRCwgMHhEMSwgMHhCRCwgMHhEMywKKwkgMHgwMywgMHgwMiwgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwgMHhCRCwgMHhEMSwgMHg0MywgMHg0MSwgMHhGNSwgMHgwMywKKwkgMHhFNSwgMHg2MCwgMHg1MywgMHg2NCwgMHg2NCwgMHg1OCwgMHg0MCwgMHg0RiwgMHgyQSwgMHhGMCwgMHg4MywgMHg2MCwgMHhGRiwgMHg2NSwgMHg2NCwgMHg0NywKKwkgMHgwMywgMHgyQiwgMHgwMSwgMHgwMCwgMHgxNywgMHgwMCwgMHgwMywgMHgyNiwgMHgwMywgMHhBQywgMHg2MCwgMHg0NywgMHhBNCwgMHg4NCwgMHgyQSwgMHhGQSwKKwkgMHgyRiwgMHhGMiwgMHgyQywgMHhGQSwgMHgzMCwgMHhGMiwgMHgyRCwgMHhGQSwgMHgzMSwgMHhGMiwgMHgyRSwgMHhGQSwgMHg2NCwgMHg0MSwgMHhDQiwgMHhGMywKKwkgMHgyRiwgMHhGQSwgMHg2MCwgMHg0MywgMHhDQywgMHhGMywgMHgzMCwgMHhGQSwgMHhDRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHgzMiwgMHhGQywgMHgzMywgMHhGQSwKKwkgMHgzNCwgMHhGOCwgMHgxOSwgMHgwMCwgMHg2MCwgMHg0NywgMHhBNCwgMHg4NCwgMHgyQSwgMHhGQSwgMHgyRiwgMHhGMiwgMHgyQywgMHhGQSwgMHgzMCwgMHhGMiwKKwkgMHgyRCwgMHhGQSwgMHgzMSwgMHhGMiwgMHgyRSwgMHhGQSwgMHgzNiwgMHhGMiwgMHgzMiwgMHhGQSwgMHgzNywgMHhGMiwgMHgzMywgMHhGQSwgMHgzOCwgMHhGMiwKKwkgMHgzNCwgMHhGQSwgMHhDQiwgMHhGMywgMHgyRiwgMHhGQSwgMHgzNiwgMHhGQSwgMHhDQywgMHhGMywgMHgzMCwgMHhGQSwgMHgzNywgMHhGQSwgMHhDRCwgMHhGMywKKwkgMHgzMSwgMHhGQSwgMHgzOCwgMHhGQSwgMHg2NCwgMHg0MSwgMHgxQywgMHhGMiwgMHgxMywgMHhGQSwgMHgwMCwgMHhGNCwgMHgwRCwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHg4MCwgMHgyQiwgMHgyOSwgMHgwMCwgMHgyNiwgMHg0NiwgMHgwNCwgMHg2MywgMHgwMywgMHhGQywgMHgwMCwgMHhGNCwgMHgwRCwgMHhGMiwKKwkgMHgwNiwgMHhGQSwgMHhFNiwgMHg2MCwgMHg1OCwgMHg0RSwgMHhGNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBMCwgMHg1OSwgMHhGNSwgMHgxQSwgMHgwMiwKKwkgMHgzOSwgMHhGMiwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGQSwgMHgwMCwgMHhGNCwgMHgwMCwgMHg2MCwgMHg4MSwgMHg2NywgMHgwRCwgMHhGQSwgMHg3QywgMHg2NCwKKwkgMHgwMSwgMHhGQSwgMHgyNiwgMHg0NiwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg5QSwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDOCwgMHhGRSwKKwkgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMCwgMHg0MiwgMHg2NCwgMHhEMCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgwNCwgMHgzRiwgMHhGQSwgMHgxQywgMHhGMiwgMHgxMywgMHhGQSwgMHgyNiwgMHhGMiwgMHgyNywgMHhGMCwgMHg2MCwgMHg0NywKKwkgMHgwMCwgMHhGNCwgMHgxRiwgMHhGQSwgMHg2NCwgMHg0NywgMHgyMCwgMHhGQSwgMHg2MSwgMHg0NCwgMHgyMSwgMHhGQSwgMHgwMSwgMHg2NywgMHgwRCwgMHhGQSwKKwkgMHgxMCwgMHg2MSwgMHgxRiwgMHg2MCwgMHg2QywgMHg2NCwgMHgxRSwgMHg2MywgMHg1OCwgMHhEMSwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEOCwgMHhGQywgMHgwMiwKKwkgMHg5QiwgMHhGMSwgMHhCOCwgMHhGMSwgMHg2NCwgMHg1RSwgMHg2NCwgMHg1RiwgMHg0NCwgMHg2MywgMHhCRCwgMHhEQSwgMHgxRiwgMHg2MCwgMHg2NiwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHgwOSwgMHhCQywgMHg0QSwgMHhEMywgMHg2MCwgMHg0NSwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwMywgMHg2NCwgMHgwMiwgMHgzNiwgMHgwMSwgMHg2NCwgMHhCNCwgMHg4NCwgMHgwNiwgMHhBMiwgMHhBMiwgMHhEMSwKKwkgMHhCRCwgMHhEQSwgMHg2NCwgMHg0NywgMHhCRCwgMHhEQSwgMHhCNSwgMHhGMywgMHhCNiwgMHhGMSwgMHg2MCwgMHg0NywgMHhCRCwgMHhEQSwgMHg2NCwgMHg0NywKKwkgMHhDMywgMHhGMSwgMHhCRCwgMHhEQSwgMHg2NCwgMHg0NCwgMHhCRCwgMHhEQSwgMHgyNiwgMHg0NiwgMHgwMCwgMHg2NCwgMHgyMywgMHhGMCwgMHgzQiwgMHhGMCwKKwkgMHg2NCwgMHg0MCwgMHgxMCwgMHgyQSwgMHgwNiwgMHgwMCwgMHhDMCwgMHg2NywgMHhBMCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwKKwkgMHgxMCwgMHhCQywgMHgzRSwgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg5QSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDOCwgMHhGRSwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHg2MCwgMHg1QywgMHg2MSwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg2NiwgMHg0NCwgMHg1OSwgMHhGQiwgMHgwNCwgMHg2NCwgMHgwMywgMHhGQSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg1OSwgMHhGNSwgMHhBQywgMHhGMSwKKwkgMHgxOSwgMHhGOCwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgwOCwgMHg2NCwgMHgyQSwgMHhGQSwgMHg4MCwgMHg3RSwgMHhGOCwgMHg3RiwgMHgwRSwgMHhGQSwKKwkgMHg4OCwgMHhGMSwgMHgwNywgMHhGOCwgMHgwMSwgMHg2MCwgMHg2MCwgMHg2NywgMHgyQywgMHhGQSwgMHgxRCwgMHg2MCwgMHgwMCwgMHg2NywgMHgyRCwgMHhGQSwKKwkgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NywgMHgyRSwgMHhGQSwgMHhDQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHgzMiwgMHhGOCwgMHhDQywgMHhGMSwgMHgzMCwgMHhGOCwKKwkgMHgzMywgMHhGOCwgMHhDRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHgzNCwgMHhGOCwgMHgwMCwgMHg2MywgMHgzQiwgMHhGQywgMHgzRCwgMHhGQywgMHgwMSwgMHg2NCwKKwkgMHgzQSwgMHhGQSwgMHg2NiwgMHg2NCwgMHgzOSwgMHhGQSwgMHgzQywgMHhGQywgMHhBQSwgMHg2MCwgMHhBQSwgMHg2NCwgMHgwMCwgMHhGNCwgMHgwMiwgMHhGQSwKKwkgMHgwMCwgMHg2MCwgMHgwMywgMHg2NCwgMHg1QSwgMHhEQSwgMHgxRCwgMHg2MCwgMHg2MCwgMHg2NCwgMHg1QSwgMHhEQSwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHg1QSwgMHhEQSwgMHg4MiwgMHg3RiwgMHgyNCwgMHg3RSwgMHgwOCwgMHhGQSwgMHgwMSwgMHg2MCwgMHgwMSwgMHg2NCwgMHgwQSwgMHhGQSwgMHgwMCwgMHg2NCwKKwkgMHgwRSwgMHhGQSwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg1OSwgMHhGNSwgMHgzRCwgMHhGMiwgMHgzQywgMHhGMiwgMHhDQywgMHg4MywgMHgwMCwgMHhBOCwKKwkgMHgwMywgMHgwMywgMHgwOCwgMHgyOCwgMHgzRCwgMHhGQywgMHg0NSwgMHgwMCwgMHgzRCwgMHhGQSwgMHgzQSwgMHhGMiwgMHgzQiwgMHhGMCwgMHgwMCwgMHg2MywKKwkgMHgwMCwgMHhGNCwgMHgwNywgMHhGQywgMHgwMSwgMHhCMCwgMHgwQiwgMHhGQSwgMHgxQSwgMHgwMywgMHgxRiwgMHhGOCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwKKwkgMHhEQSwgMHg2MiwgMHgxOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwQSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHgxRiwgMHhGMiwgMHgxRSwgMHhGMCwgMHg1OSwgMHhGNSwgMHgwMCwgMHhBOCwgMHgzQiwgMHhGOCwgMHhEMCwgMHg4MCwgMHgwNiwgMHgwMywKKwkgMHgwNSwgMHgwMywgMHgwNCwgMHg2MCwgMHg1QywgMHg2MywgMHgwRiwgMHg2NCwgMHgzQSwgMHhGQSwgMHgzOSwgMHhGQywgMHgwMCwgMHhGNCwgMHgwMCwgMHg2NCwKKwkgMHgwNiwgMHhGQSwgMHhFNiwgMHg2MCwgMHg1OCwgMHg0RSwgMHhGNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1OSwgMHhGNSwgMHgwMCwgMHhGNCwgMHg4MSwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHgwNiwgMHhGQSwgMHgzMiwgMHg0NywgMHgwNCwgMHhCQywgMHgwNywgMHhGQSwgMHhCOCwgMHhGMSwgMHgwMCwgMHg3RiwgMHg2NCwgMHg1RSwKKwkgMHgwOSwgMHhGQSwgMHg1OSwgMHhGNSwgMHgwMCwgMHg2NCwgMHgxNSwgMHhGQSwgMHgzOSwgMHhGMiwgMHgzRiwgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwKKwkgMHgxQiwgMHg2MCwgMHg4OCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHhFMSwgMHg2MCwgMHgwRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NSwgMHgwRSwgMHhGMiwgMHgwRiwgMHhGMCwgMHgxMCwgMHhGMCwKKwkgMHg2NCwgMHg0MSwgMHgwMSwgMHhBOCwgMHg1OSwgMHhGNSwgMHgwOSwgMHgwMiwgMHhBRCwgMHg4MywgMHg2NCwgMHg0NCwgMHhBQywgMHg4NCwgMHgwOCwgMHgyNCwKKwkgMHgwQSwgMHg2MywgMHgzQywgMHhGQywgMHgzRCwgMHhGQywgMHgxQSwgMHgwMiwgMHgyRCwgMHgwMCwgMHgwMywgMHgzQSwgMHgwMywgMHgwMCwgMHgwMCwgMHg2NCwKKwkgMHgzQywgMHhGQSwgMHgyOSwgMHgwMCwgMHgwNCwgMHgzQSwgMHgwOSwgMHgwMCwgMHgwQSwgMHg2NCwgMHgzQywgMHhGQSwgMHgwMSwgMHg2NCwgMHgzQSwgMHhGQSwKKwkgMHgwMCwgMHhGNCwgMHgwMCwgMHg2NCwgMHgxRiwgMHhGQSwgMHgxRSwgMHhGQSwgMHgxRSwgMHgwMCwgMHgwMiwgMHgzQSwgMHgxRSwgMHgwMCwgMHg2NCwgMHg0NCwKKwkgMHhBRCwgMHg4MywgMHhBQywgMHg4NCwgMHgwMiwgMHgwMywgMHgzQywgMHhGQywgMHgzRCwgMHhGQywgMHgxNSwgMHgwMywgMHgzQSwgMHhGQSwgMHhGOCwgMHg2NSwKKwkgMHg1MiwgMHg2MywgMHg2NCwgMHg0NCwgMHgwMSwgMHgzNiwgMHgwRCwgMHgwMCwgMHgxMiwgMHhBMywgMHg2NCwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwMiwgMHgwMCwKKwkgMHhDNywgMHg4MywgMHhDNywgMHg4MywgMHg2NCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwMSwgMHgwMCwgMHhDNywgMHg4MywgMHg2NCwgMHg0MCwgMHgwNCwgMHgyNiwKKwkgMHhDNywgMHg4MywgMHgzOSwgMHhGQywgMHgwMCwgMHg2NCwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgzQiwgMHhGMCwgMHgzQSwgMHhGMiwgMHg2NSwgMHg0NiwKKwkgMHgwNiwgMHhGMiwgMHg0MCwgMHg0NywgMHgxRCwgMHgxOCwgMHgzMiwgMHg0NywgMHgwNywgMHhGQSwgMHgyNCwgMHg3RSwgMHg4MiwgMHg3RiwgMHgwOCwgMHhGQSwKKwkgMHgwMSwgMHg2MCwgMHgwMSwgMHg2MywgMHhCOCwgMHhGMywgMHgwQSwgMHhGQywgMHgwMCwgMHg3RiwgMHgwOSwgMHhGQSwgMHgyNywgMHg0MCwgMHgwMSwgMHgyQSwKKwkgMHgwRiwgMHgwMCwgMHgxRiwgMHhGOCwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwQSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgxRSwgMHhGMCwgMHg1OSwgMHhGNSwgMHgzQiwgMHhGOCwgMHg2NSwgMHg0NiwKKwkgMHgyNywgMHg0MCwgMHgwMiwgMHgyNiwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgxMywgMHgwMCwgMHg2RSwgMHg2MSwgMHhGRiwgMHg2MCwgMHhGRSwgMHg2NCwKKwkgMHgwMCwgMHg2MCwgMHgwRSwgMHg2MywgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOCwgMHhGRCwgMHgxRiwgMHgwMSwgMHg2MCwgMHhFRSwgMHg2MywgMHgwMCwgMHhGNCwKKwkgMHgwMiwgMHg2MSwgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOCwgMHg3RSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MSwgMHhGOSwgMHgxRiwKKwkgMHgyNywgMHg0MCwgMHgwNCwgMHgyNiwgMHgxQiwgMHgwMCwgMHg0NiwgMHg0QiwgMHgxQiwgMHg2MCwgMHg4OCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgwRSwgMHgwMywgMHg4OSwgMHhGMCwgMHhFNywgMHg2MCwgMHg1OCwgMHg0RCwgMHhBRSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg2NSwgMHg0NCwgMHhBQywgMHg4NiwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMywgMHhFNywgMHg2MCwgMHg1OCwgMHg0RCwgMHhBRSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgwMCwgMHgyQiwgMHg0NiwgMHg4MiwgMHhGQywgMHgwMCwgMHhGNCwgMHg4MiwgMHhGQywgMHgwMCwgMHhGNCwgMHgyNywgMHg0MCwgMHgwOCwgMHgyNiwKKwkgMHgxQSwgMHgwMCwgMHg0NiwgMHg0QiwgMHgxQiwgMHg2MCwgMHhDNCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwKKwkgMHgwRSwgMHgwMywgMHg4OSwgMHhGMCwgMHhFNywgMHg2MCwgMHg1OCwgMHg0RCwgMHhBRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NSwgMHg0NCwgMHhBQywgMHg4NiwKKwkgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMywgMHhFNywgMHg2MCwgMHg1OCwgMHg0RCwgMHhBRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMCwgMHg2NSwgMHg0NiwKKwkgMHgwMiwgMHhGQSwgMHgwMCwgMHhGNCwgMHg4MiwgMHhGQywgMHgwMSwgMHg2NCwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2MSwgMHgwMiwgMHg2NCwKKwkgMHg3QSwgMHg2MywgMHg1OCwgMHhEMCwgMHhBQiwgMHg0NiwgMHhBMCwgMHhEOCwgMHhBQiwgMHg0NiwgMHhGQiwgMHgxRiwgMHhBQiwgMHg0NiwgMHgwMCwgMHhGNCwKKwkgMHhDRCwgMHg4MSwgMHhBQiwgMHg0NiwgMHgwMCwgMHhGNCwgMHhGMywgMHgwMiwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgyQSwgMHg2MSwKKwkgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg1OCwgMHhGQiwgMHgwNCwgMHg2NCwgMHgwMywgMHhGQSwKKwkgMHg2NywgMHg0NCwgMHgyQywgMHhGQSwgMHgyRCwgMHhGQSwgMHgyRSwgMHhGQSwgMHgzMiwgMHhGQSwgMHgzMywgMHhGQSwgMHgzNCwgMHhGQSwgMHgxMiwgMHg2MCwKKwkgMHg4MCwgMHg2NCwgMHg4OCwgMHhGMSwgMHgwRSwgMHhGQSwgMHgwNywgMHhGOCwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgxMSwgMHg2MCwgMHhEOCwgMHg2MywKKwkgMHhBMywgMHhEQiwgMHgwNiwgMHhBMywgMHgxMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwNCwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwNiwgMHg2NCwKKwkgMHhBMywgMHhEQiwgMHgxMCwgMHg2MCwgMHgwNiwgMHg2MiwgMHhFQSwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwgMHhFNCwgMHg2MywKKwkgMHgwMCwgMHg2NCwgMHhBMywgMHhEQiwgMHgwNiwgMHhBMywgMHgxMCwgMHg2MCwgMHgwQywgMHg2NCwgMHhCRCwgMHhEQiwgMHgwOCwgMHg2NCwgMHhCRCwgMHhEQiwKKwkgMHgwNiwgMHg2NCwgMHhBMywgMHhEQiwgMHgxMCwgMHg2MCwgMHgwQSwgMHg2MiwgMHhFQSwgMHg2MCwgMHgxMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHhGQywgMHg2MiwgMHhFOSwgMHg2MCwgMHhGMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2NCwgMHgyNSwgMHg2MCwgMHgyQSwgMHg2MiwgMHhBMiwgMHhEQiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg1OCwgMHhGNSwgMHhDQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhDQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhDRCwgMHhGMSwKKwkgMHgzMSwgMHhGOCwgMHhBQywgMHhGMSwgMHgxOSwgMHhGOCwgMHhFQSwgMHg2MCwgMHg1OCwgMHg0RSwgMHgxQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMCwgMHg2NCwKKwkgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFMiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxNiwgMHg2MCwgMHhDQywgMHg2MSwKKwkgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHg1OSwgMHgxOCwgMHg1OCwgMHhGNSwgMHg0MCwgMHg2NCwgMHgyQSwgMHhGQSwgMHg1MiwgMHhGMywgMHgwMCwgMHhGNCwKKwkgMHg2MCwgMHg0MywgMHhCRCwgMHhEMSwgMHgwNCwgMHg2NSwgMHg2NCwgMHg0NywgMHhBNSwgMHhEQSwgMHg2NCwgMHg0MSwgMHhERCwgMHg4MSwgMHhFOSwgMHg4MSwKKwkgMHg2MiwgMHg0NCwgMHgwNCwgMHgwMywgMHhCRCwgMHhEMSwgMHhDRCwgMHg4MSwgMHg1OCwgMHhEOCwgMHhGQywgMHgwMiwgMHg1OCwgMHg4QiwgMHgyMSwgMHg2MCwKKwkgMHg4RSwgMHg2MywgMHhBMywgMHhEMSwgMHgyQiwgMHg0NCwgMHhDOCwgMHg4NCwgMHg2NCwgMHg0MSwgMHhGRiwgMHhCMSwgMHg2MSwgMHg0NSwgMHgwMywgMHhBMSwKKwkgMHhFOSwgMHg4MSwgMHg0MSwgMHg0QywgMHhCRCwgMHhEMSwgMHhDRCwgMHg4MSwgMHg1OCwgMHhEOCwgMHhGQywgMHgwMiwgMHgyQiwgMHhEMiwgMHgyQiwgMHg0MywKKwkgMHg2MCwgMHg0NywgMHgwMSwgMHg3RSwgMHg1MiwgMHhGMSwgMHhBMywgMHhEQSwgMHhBNCwgMHhEMywgMHhDQiwgMHg4MywgMHg0NCwgMHg4QiwgMHhGOCwgMHg4NCwKKwkgMHgyQywgMHg0MSwgMHgwQywgMHgwNCwgMHhCRSwgMHhEMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHhCRSwgMHhEQSwgMHgwMCwgMHg3RSwgMHhBMywgMHhEMiwKKwkgMHg2MCwgMHg0NSwgMHgwMCwgMHg3RiwgMHhCNCwgMHg4NCwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQSwgMHhGNCwgMHgwMiwgMHg1OCwgMHhGNSwgMHgyQiwgMHg0NCwKKwkgMHgwNCwgMHhBNCwgMHgzRiwgMHhGQSwgMHg2NSwgMHhGMywgMHg2NCwgMHhGQiwgMHgxNiwgMHg2MCwgMHhDRSwgMHg2MSwgMHgwMSwgMHg2NCwgMHg1MiwgMHhGMSwKKwkgMHhBMSwgMHhEQiwgMHg2NSwgMHhGQiwgMHhBNCwgMHhEMywgMHgwNCwgMHg2NSwgMHg1MSwgMHhGMywgMHgwMSwgMHgxOCwgMHgwQywgMHg2NSwgMHhGMywgMHhCNCwKKwkgMHhCNCwgMHg4NCwgMHg1MSwgMHhGQiwgMHgwMiwgMHhCMCwgMHhGRiwgMHhGRiwgMHgxNiwgMHgwMywgMHg2NSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywKKwkgMHgwRiwgMHhCNCwgMHg2NSwgMHhGQiwgMHgwMSwgMHgwMywgMHgwRiwgMHgwMCwgMHhFOSwgMHg2MCwgMHg3NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1MSwgMHhGMSwKKwkgMHg2NSwgMHhGMywgMHg2NCwgMHg0MCwgMHgwMiwgMHgyNiwgMHhGOCwgMHgwMSwgMHhGMywgMHhBMCwgMHgwNCwgMHhBNCwgMHgwMSwgMHgwNCwgMHhGMSwgMHhBNCwKKwkgMHgxMCwgMHgzNiwgMHhGMiwgMHgwMSwgMHg2NSwgMHhGQiwgMHg2NSwgMHhGMywgMHgxNiwgMHg2MCwgMHhDQywgMHg2MSwgMHhBMSwgMHhEMSwgMHhDQywgMHg4NCwKKwkgMHgwMSwgMHg2MSwgMHgwOCwgMHgyNCwgMHgwMywgMHgwMCwgMHhFMSwgMHg4MSwgMHhDQywgMHg4NCwgMHhGQiwgMHgwMSwgMHhBMSwgMHg4NCwgMHg1MSwgMHhGMSwKKwkgMHhFNywgMHgwMywgMHgxNiwgMHg2MCwgMHhDRSwgMHg2MSwgMHhBMSwgMHhEQiwgMHgwMCwgMHgwMCwgMHg2NSwgMHhGMywgMHgwMSwgMHg2MSwgMHhDQywgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywgMHhFMSwgMHg4MSwgMHhGQiwgMHgwMSwgMHg5QSwgMHhGMywgMHg2MSwgMHg0NSwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHhENywgMHgwMywgMHgzMSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFMiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFOCwgMHg2MCwKKwkgMHg5NSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2NSwgMHhGMSwgMHgxQywgMHg2MCwgMHgwMCwgMHg2MiwKKwkgMHhBMiwgMHhEOSwgMHgxRSwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFOCwgMHg2MCwgMHhDOCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhDRSwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhFMiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1OCwgMHhGNSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwKKwkgMHgxQiwgMHg2MCwgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHgwMCwgMHg2NCwgMHg0RiwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhFOCwgMHg2MCwgMHhGMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHhDMSwgMHhGRSwgMHgzMywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgzNCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFMiwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhBNiwgMHhGMSwgMHgxMSwgMHg2MCwgMHhEQywgMHg2MiwgMHhBMiwgMHhEOSwgMHgxQywgMHg2MCwgMHgxMCwgMHg2MiwgMHgxMSwgMHg2MCwKKwkgMHhEOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHhBNywgMHhGMSwgMHgxMSwgMHg2MCwKKwkgMHhFOCwgMHg2MiwgMHhBMiwgMHhEOSwgMHgxQywgMHg2MCwgMHgwRSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhGRCwgMHgxQiwgMHgxQywgMHg2MCwKKwkgMHgxMCwgMHg2MiwgMHgxMSwgMHg2MCwgMHhFNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFOSwgMHg2MCwgMHgyMywgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg0RiwgMHhGMSwgMHgwRiwgMHg2MCwgMHhFMiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHg2NCwgMHg0MCwgMHhGRiwgMHgyNiwgMHgwMywgMHgwMCwgMHhFOCwgMHg2MCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwQSwgMHgwMCwgMHg2NCwKKwkgMHg0RiwgMHhGQiwgMHhBOCwgMHhGMSwgMHgxMSwgMHg2MCwgMHhFOCwgMHg2MiwgMHhBMiwgMHhEOSwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHgwMCwgMHg2MCwKKwkgMHgwQywgMHg2NCwgMHhBMiwgMHhEQiwgMHhFOSwgMHg2MCwgMHg0OSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxQywgMHg2MCwgMHgxMCwgMHg2MiwKKwkgMHgxMSwgMHg2MCwgMHhFNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFMiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwKKwkgMHgwQywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxQywgMHg2MCwgMHgxMCwgMHg2MiwgMHgxMSwgMHg2MCwgMHhFNCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgxNCwgMHgwMCwgMHhGRiwgMHg2MCwgMHhGNywgMHg2NCwgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHg0RiwgMHhGMywgMHhEQiwgMHgwQSwgMHgwMCwgMHhBMCwgMHgwMCwgMHg2NCwgMHgwMiwgMHgwMywgMHg0RiwgMHhGQiwgMHhENiwgMHgwMSwKKwkgMHgxQywgMHg2MCwgMHgxMCwgMHg2MiwgMHgxMSwgMHg2MCwgMHhEOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHhFOCwgMHg2MCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgzNSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgxQywgMHg2MCwKKwkgMHgxMCwgMHg2MiwgMHgxMSwgMHg2MCwgMHhEOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwKKwkgMHg1MSwgMHhGMywgMHhGRiwgMHhGRiwgMHhFMywgMHhCNCwgMHg1MSwgMHhGQiwgMHgxNiwgMHg2MCwgMHhDQSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhGRSwgMHhCNCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2NCwgMHgyNSwgMHg2MCwgMHgyQSwgMHg2MiwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFMiwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwRSwgMHgwNCwgMHgzMiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHhFNCwgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFOSwgMHg2MCwgMHg4RSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2NCwgMHhGMSwgMHg2NSwgMHhGOSwgMHgxQywgMHg2MCwgMHgwMCwgMHg2MiwgMHhBMiwgMHhEOSwgMHgxRSwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhFOSwgMHg2MCwgMHhCNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwKKwkgMHhDRSwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwKKwkgMHhDRSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMCwgMHg2MCwKKwkgMHgwNCwgMHg2MSwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2NCwgMHgyMywgMHhGQSwgMHhGMSwgMHg2MCwKKwkgMHgwMiwgMHg2NCwgMHgyNCwgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHhDQSwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGQSwgMHhGRSwgMHhFQSwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHgyRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg0NCwgMHgwMSwgMHhCNSwgMHg1NCwgMHg4MCwgMHgzMSwgMHg0NCwgMHhERSwgMHhCNCwgMHg0MCwgMHg1MSwKKwkgMHgwRiwgMHg2MCwgMHhFMiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwgMHgzRSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgxQywgMHg2MCwgMHgxMCwgMHg2MiwgMHgxMSwgMHg2MCwKKwkgMHhEOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwMCwgMHg2NCwgMHg1MSwgMHhGQiwKKwkgMHgwRiwgMHg2MCwgMHhFMiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwgMHhCRSwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhFMiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFMiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHgwMSwgMHg2MCwgMHg3QSwgMHg2MSwgMHgxNiwgMHg2MCwKKwkgMHhDNCwgMHg2MywgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMCwgMHg3RiwgMHhCRCwgMHhEQiwgMHgyMSwgMHg2MCwgMHgzMiwgMHg2NCwgMHhCRCwgMHhEQiwKKwkgMHgwNCwgMHhBMSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMiwgMHg3RiwgMHhBMywgMHhEQiwgMHgxMCwgMHgwMCwgMHgwMSwgMHg2MCwgMHg3QSwgMHg2MSwKKwkgMHgxNiwgMHg2MCwgMHhDNCwgMHg2MywgMHhBMSwgMHhEMywgMHgwMCwgMHg2NiwgMHgyMCwgMHg3RiwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgyMSwgMHg3RiwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMiwgMHg3RiwgMHhBMywgMHhEQiwgMHgwRiwgMHg2MCwgMHhFMiwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHg5RiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwKKwkgMHhFNCwgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFQSwgMHg2MCwgMHgzRSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHgwMCwgMHg2MiwgMHgxNiwgMHg2MCwgMHhDMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhFQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFMiwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHg5RiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhDRSwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHg1RiwgMHhGQiwgMHhBQywgMHg4NSwgMHg2MCwgMHg0MSwgMHgyMCwgMHgwMywgMHgwMSwgMHg2MCwgMHgwMCwgMHg2MywgMHgwOCwgMHg2NCwgMHhFOSwgMHg4MSwKKwkgMHhDQywgMHg4NCwgMHgwMiwgMHgyNCwgMHhERiwgMHg4MywgMHhGQiwgMHgwMiwgMHgyMSwgMHg2MCwgMHg4RSwgMHg2NCwgMHhBMCwgMHhERCwgMHg2NSwgMHg0MSwKKwkgMHgyMSwgMHg2MCwgMHg5MCwgMHg2MywgMHgwRiwgMHg2MCwgMHhDMCwgMHg2NCwgMHhFOSwgMHg4MSwgMHg1OCwgMHhEMSwgMHhGRCwgMHgwNCwgMHhBMywgMHhEOSwKKwkgMHgwQiwgMHgwMywgMHg1OCwgMHhEMSwgMHhFOSwgMHg4MSwgMHg2MCwgMHg0NSwgMHhGQywgMHgwNCwgMHhBMywgMHhEMSwgMHg2NCwgMHg0NywgMHhCMCwgMHg4NCwKKwkgMHhCRCwgMHhEQiwgMHgwMCwgMHhCOSwgMHg2NSwgMHg0NCwgMHhGMCwgMHgwMiwgMHgyMCwgMHg2MCwgMHgzOCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHhBOCwgMHgwMSwgMHg2MCwgMHg3MCwgMHg2MiwgMHgwNiwgMHgwMiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhBOCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgwMywgMHgwMiwgMHg2NCwgMHg2MCwgMHg0MSwgMHgyMSwgMHg2MCwgMHg4RSwgMHg2MywgMHhCRCwgMHhEMywgMHhBMywgMHhEMywgMHhGRiwgMHhCNSwKKwkgMHg4MCwgMHhCRiwgMHhDRCwgMHg4MSwgMHg2NSwgMHg1QywgMHgwRiwgMHgwMywgMHg4MCwgMHhCRiwgMHhCRCwgMHhEQiwgMHg2NSwgMHg0NCwgMHhDOCwgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHgwQywgMHgwMywgMHg2MCwgMHg0NSwgMHhDRCwgMHg4MSwgMHhBMywgMHhEMywgMHgwOCwgMHgwMywgMHg4MCwgMHhCRiwgMHhDRCwgMHg4MSwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHg4MCwgMHhCQywgMHg2MCwgMHg0NywgMHhCRCwgMHhEQiwgMHgwMCwgMHg2NSwgMHg2NCwgMHg0MSwgMHgyMSwgMHg2MCwKKwkgMHg5MCwgMHg2MywgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHg4MCwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHg2MCwgMHg0NSwgMHg2MCwgMHg0NywKKwkgMHg4MCwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHg2MCwgMHg0NSwgMHhDRCwgMHg4MSwgMHhGRiwgMHhGRiwgMHhGMiwgMHgwMiwgMHg2NSwgMHg0NCwKKwkgMHg3RiwgMHhCNCwgMHgwMiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwQSwgMHg2NCwgMHgxNSwgMHgwMCwgMHgwNCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgxNCwgMHg2NCwKKwkgMHgxMSwgMHgwMCwgMHgwQSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgzMiwgMHg2NCwgMHgwRCwgMHgwMCwgMHgwQiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgzNywgMHg2NCwKKwkgMHgwOSwgMHgwMCwgMHgxMCwgMHgzQSwgMHgwMiwgMHgwMCwgMHg1MCwgMHg2NCwgMHgwNSwgMHgwMCwgMHgxNiwgMHgzQSwgMHgwMiwgMHgwMCwgMHg2RSwgMHg2NCwKKwkgMHgwMSwgMHgwMCwgMHgxNCwgMHg2NCwgMHg2MiwgMHhGQiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgzQywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgzMSwgMHg0MCwgMHgyMCwgMHgyQSwgMHgxOCwgMHgwMCwgMHgzRiwgMHhGMiwgMHg0NywgMHg2NSwgMHhDNCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgyMywgMHhGQSwKKwkgMHhGMSwgMHg2MCwgMHgwMiwgMHg2NCwgMHgyNCwgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHhDQSwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGQSwgMHhGRSwgMHgwMCwgMHg2NiwKKwkgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwQywgMHg2MywgMHgxMiwgMHg2MCwKKwkgMHhCNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRSwgMHgxRiwgMHg1MywgMHhGQiwgMHg1NCwgMHhGQiwgMHgxMiwgMHg2MCwgMHhCQSwgMHg2MywKKwkgMHgwMiwgMHg2NCwgMHhBMywgMHhEQiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMiwgMHg2MCwgMHhCRSwgMHg2MiwgMHhBMiwgMHhEMywgMHgwMCwgMHg2MywKKwkgMHhGMCwgMHhBMCwgMHgwMSwgMHhBNCwgMHgwMywgMHgwMywgMHhBMiwgMHhEQiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHhBMiwgMHhERCwgMHgxMiwgMHg2MCwKKwkgMHhDMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHhBMiwgMHhERCwgMHg1QSwgMHhEMywgMHhBMiwgMHhERCwgMHhDMCwgMHg4MSwgMHg2MSwgMHg0NCwgMHgwMiwgMHgyNCwKKwkgMHhGRiwgMHhGRiwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHg1QSwgMHhEMywgMHhFOSwgMHg4MSwgMHhFOCwgMHg4MywKKwkgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4NSwgMHhENCwgMHg4NSwgMHhDNSwgMHg4MywgMHhBMiwgMHhERCwgMHgxMiwgMHg2MCwKKwkgMHhCOCwgMHg2MiwgMHg2MywgMHg0NywgMHgwMCwgMHg3RiwgMHhBMiwgMHhEQiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMywgMHhFMSwgMHhBMywgMHhGRiwKKwkgMHgxQiwgMHg2MCwgMHg1QSwgMHg2MywgMHgxNywgMHhGRCwgMHhBRSwgMHhGRiwgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg3RiwgMHg2NywKKwkgMHgwMSwgMHg2MSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHhCMSwgMHhGRSwgMHgwNSwgMHgwNSwgMHhCMCwgMHhGRSwgMHgwNiwgMHgwNSwgMHhCMiwgMHhGRSwKKwkgMHhCMywgMHhGRSwgMHgyMiwgMHgwMCwgMHhGMCwgMHg2MCwgMHhGQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyOCwgMHhGMywgMHgyOSwgMHhGMSwgMHg0MCwgMHg0NCwKKwkgMHg0NCwgMHg0NSwgMHgyQSwgMHhGMSwgMHgyQiwgMHhGMSwgMHg0NCwgMHg0NiwgMHg0NCwgMHg0NywgMHgzRiwgMHhCNCwgMHhFMCwgMHg4NSwgMHgxNiwgMHg2MCwKKwkgMHhEMiwgMHg2NCwgMHg0NCwgMHhENywgMHg1OCwgMHg0MywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwgMHgxMiwgMHg2MCwgMHhDOCwgMHg3QywgMHhBNCwgMHhEMywKKwkgMHg2MSwgMHg0MywgMHgwNCwgMHhCNCwgMHgyNCwgMHg0NCwgMHgwMiwgMHgwMywgMHgxMywgMHhGRiwgMHgwNiwgMHgwMCwgMHgzRiwgMHhCNCwgMHhCNCwgMHg4NCwKKwkgMHhGRiwgMHgyNywgMHgwNSwgMHhGRCwgMHgwNCwgMHhGQiwgMHgxMCwgMHg3NSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4NiwgMHgzRSwgMHhCNCwgMHhGRSwKKwkgMHgwOSwgMHgwNSwgMHhCNSwgMHhGRSwgMHgwMiwgMHgyNCwgMHg4MCwgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCNywgMHhGRSwgMHgwNSwgMHgwNSwKKwkgMHhCNiwgMHhGRSwgMHhGMiwgMHgwMSwgMHhGMSwgMHg2MCwgMHgzNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzNiwgMHg0NCwgMHgwMCwgMHg3RiwgMHhGNCwgMHhBMCwKKwkgMHg2MCwgMHg0NSwgMHgwNSwgMHgwNSwgMHgxNywgMHg2MCwgMHg1RSwgMHg2NCwgMHg0NCwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFNCwgMHgwMSwKKwkgMHhFMywgMHgwMSwgMHg3RiwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MSwgMHgxMCwgMHgwMiwKKwkgMHgxMCwgMHg2NCwgMHg0MCwgMHg0MCwgMHgwMiwgMHg2NCwgMHg0MCwgMHg1MCwgMHg2MSwgMHhGRiwgMHgzRiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgwNCwgMHgwMCwKKwkgMHgxMCwgMHhFMCwgMHg0NiwgMHg2MCwgMHgwOSwgMHhFMCwgMHgwMCwgMHgwMCwgMHgyNywgMHhGMSwgMHgwMCwgMHg2NiwgMHgyMCwgMHg3OCwgMHg0MiwgMHhGRSwKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg3OCwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MSwKKwkgMHgxQywgMHgwMiwgMHgxMiwgMHg2MCwgMHhDOCwgMHg2MywgMHhBMywgMHhEMywgMHgwNywgMHg3QywgMHgyMCwgMHhCNSwgMHgwQywgMHhCNSwgMHgwNCwgMHgwMywKKwkgMHgwMywgMHgwMiwgMHhCQywgMHhGOSwgMHgwMCwgMHg2NywgMHgxMSwgMHgwMCwgMHgwMCwgMHg2MSwgMHg0MSwgMHg1NiwgMHhDNywgMHhGRSwgMHhCNCwgMHgwMSwKKwkgMHgzNiwgMHg0NywgMHhGRiwgMHgyMywgMHgwNCwgMHgwMCwgMHgwMCwgMHg3RiwgMHg2MCwgMHg0MSwgMHg3RiwgMHg2NywgMHgwNiwgMHgwMCwgMHgwNCwgMHg3QywKKwkgMHhCQywgMHhGOSwgMHgyMCwgMHg0NCwgMHg4MCwgMHhCQywgMHg0MCwgMHg0MCwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg3OCwgMHg2MCwKKwkgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MSwgMHgzMSwgMHgwMiwgMHgxMiwgMHg2MCwgMHhDOCwgMHg2MywKKwkgMHhBMywgMHhEMywgMHgwMSwgMHg3QywgMHgyMCwgMHhCNSwgMHgwQywgMHhCNSwgMHgwMywgMHgwMywgMHgwMiwgMHgwMiwgMHhCQywgMHhGOSwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHg2MSwgMHg0MSwgMHg1NiwgMHhDNywgMHhGRSwgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg3RSwgMHhGMSwgMHgyMCwgMHg0NCwKKwkgMHg2NCwgMHg0MCwgMHhGRiwgMHgyNiwgMHgxQiwgMHgwMCwgMHg3RiwgMHhCNCwgMHg0MCwgMHg0MCwgMHg1QywgMHg1RSwgMHg4MiwgMHhGRiwgMHgyNiwgMHg0NCwKKwkgMHhGRCwgMHhCNCwgMHg0MCwgMHg0NiwgMHg1QywgMHg0MSwgMHg4NywgMHhGRiwgMHg2MiwgMHhGRiwgMHgwMCwgMHg2MywgMHgxQiwgMHg2MCwgMHhDNCwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgwNCwgMHgwMywgMHgwOSwgMHhGMiwgMHgwRiwgMHhGQywgMHhBQywgMHg4NiwKKwkgMHhGQiwgMHgwMSwgMHgxQywgMHg2MCwgMHgwNCwgMHg2MiwgMHgwNiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyRCwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyNSwgMHg0NiwgMHgwMSwgMHhGMiwgMHgwOCwgMHhGMCwgMHg2MCwgMHg0NywgMHgwMywgMHhCNCwgMHgwMywgMHhBQywgMHg3RiwgMHg2NywKKwkgMHgwMywgMHg2MSwgMHgwOCwgMHgwMiwgMHgxQiwgMHg2MCwgMHhFMCwgMHg2NCwgMHg0MCwgMHg0QiwgMHhGMCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg0MCwgMHgwMSwgMHgyQiwgMHg0OSwgMHgwMCwgMHgyNSwgMHg0NCwKKwkgMHgxRiwgMHhCNCwgMHhFMCwgMHg4NSwgMHhFQywgMHg2MCwgMHgzNiwgMHg2NCwgMHhDNCwgMHg5OCwgMHhGRiwgMHhGRiwgMHhDMCwgMHhGRSwgMHgzRCwgMHgwMCwKKwkgMHhDMSwgMHhGRSwgMHgzQiwgMHgwMCwgMHhDMiwgMHhGRSwgMHgzOSwgMHgwMCwgMHhDMywgMHhGRSwgMHgzNywgMHgwMCwgMHhDNCwgMHhGRSwgMHgzNSwgMHgwMCwKKwkgMHhDNSwgMHhGRSwgMHgzMywgMHgwMCwgMHhDNiwgMHhGRSwgMHgzMSwgMHgwMCwgMHhDNywgMHhGRSwgMHgyRiwgMHgwMCwgMHhDOCwgMHhGRSwgMHgyRCwgMHgwMCwKKwkgMHhDOSwgMHhGRSwgMHgyQiwgMHgwMCwgMHhDQSwgMHhGRSwgMHgyOSwgMHgwMCwgMHhDQiwgMHhGRSwgMHgyNywgMHgwMCwgMHhDQywgMHhGRSwgMHgyNSwgMHgwMCwKKwkgMHhDRCwgMHhGRSwgMHgyMywgMHgwMCwgMHhDRSwgMHhGRSwgMHgyMSwgMHgwMCwgMHhDRiwgMHhGRSwgMHgxRiwgMHgwMCwgMHhEMCwgMHhGRSwgMHgxRCwgMHgwMCwKKwkgMHhEMSwgMHhGRSwgMHgxQiwgMHgwMCwgMHhEMiwgMHhGRSwgMHgxOSwgMHgwMCwgMHhEMywgMHhGRSwgMHgxNywgMHgwMCwgMHhENCwgMHhGRSwgMHgxNSwgMHgwMCwKKwkgMHhENSwgMHhGRSwgMHgxMywgMHgwMCwgMHhENiwgMHhGRSwgMHgxMSwgMHgwMCwgMHhENywgMHhGRSwgMHgwRiwgMHgwMCwgMHhEOCwgMHhGRSwgMHgwRCwgMHgwMCwKKwkgMHhEOSwgMHhGRSwgMHgwQiwgMHgwMCwgMHhEQSwgMHhGRSwgMHgwOSwgMHgwMCwgMHhEQiwgMHhGRSwgMHgwNywgMHgwMCwgMHhEQywgMHhGRSwgMHgwNSwgMHgwMCwKKwkgMHhERCwgMHhGRSwgMHgwMywgMHgwMCwgMHhERSwgMHhGRSwgMHgwMSwgMHgwMCwgMHhERiwgMHhGRSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2NCwgMHg5RiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5RSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5RCwgMHhGRSwKKwkgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5QywgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5QiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHg5QSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5OSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5OCwgMHhGRSwgMHhGMCwgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHg5NywgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5NiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5NSwgMHhGRSwKKwkgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5NCwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5MywgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHg5MiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5MSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5MCwgMHhGRSwgMHhGMCwgMHg4NCwKKwkgMHgwNiwgMHhGQiwgMHg4RiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4RSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4RCwgMHhGRSwKKwkgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4QywgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4QiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHg4QSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4OSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4OCwgMHhGRSwgMHhGMCwgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHg4NywgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4NiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4NSwgMHhGRSwKKwkgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4NCwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4MywgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHg4MiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4MSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4MCwgMHhGRSwgMHhGMCwgMHg4NCwKKwkgMHgwNSwgMHhGQiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg1QywgMHg1QywgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyNCwgMHg0MCwgMHgwMSwgMHgyNywgMHg1NSwgMHgwMCwgMHgwNSwgMHg2MCwgMHgwMCwgMHg2MywgMHgwNSwgMHhGRCwgMHgzMCwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgzMSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzMiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzMywgMHg0NCwgMHhCRCwgMHhEQiwgMHgzNCwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgzNSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzNiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzNywgMHg0NCwgMHhCRCwgMHhEQiwgMHgzOCwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgzOSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzQSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzQiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzQywgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgzRCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzRSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzRiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgwMiwgMHg2MSwgMHg2MSwgMHg0NCwKKwkgMHgwMiwgMHgzNiwgMHg4MiwgMHhGRiwgMHgwMywgMHgzNiwgMHg4MywgMHhGRiwgMHgwNCwgMHgzNiwgMHg4NCwgMHhGRiwgMHgwNSwgMHgzNiwgMHg4NSwgMHhGRiwKKwkgMHgwNiwgMHgzNiwgMHg4NiwgMHhGRiwgMHgwNywgMHgzNiwgMHg4NywgMHhGRiwgMHgyMCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMSwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgyMiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNSwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgyNiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyOCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyOSwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgyQSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyQiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyQywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyRCwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgyRSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyRiwgMHg0NCwgMHhCRCwgMHhEQiwgMHhERCwgMHg4MSwgMHgwOCwgMHgzQSwgMHhEMCwgMHgwMSwgMHg1NCwgMHgwMCwKKwkgMHgyNywgMHg0MCwgMHgxMCwgMHgyNiwgMHgzMCwgMHgwMCwgMHgyNiwgMHg0NCwgMHgwMSwgMHgzNiwgMHgyRCwgMHgwMCwgMHgwMiwgMHgzNiwgMHg4MiwgMHhGRiwKKwkgMHgwMywgMHgzNiwgMHg4MywgMHhGRiwgMHgwNCwgMHgzNiwgMHg4NCwgMHhGRiwgMHgwNSwgMHgzNiwgMHg4NSwgMHhGRiwgMHgwNiwgMHgzNiwgMHg4NiwgMHhGRiwKKwkgMHgyNSwgMHg0NCwgMHgwMCwgMHgzNiwgMHg0NCwgMHg0MCwgMHgwMSwgMHgzNiwgMHg0NCwgMHg0MSwgMHgwMiwgMHgzNiwgMHg0NCwgMHg0MiwgMHgwMywgMHgzNiwKKwkgMHg0NCwgMHg0MywgMHgwNCwgMHgzNiwgMHg0NCwgMHg0NCwgMHgwNSwgMHgzNiwgMHg0NCwgMHg0NSwgMHgwNiwgMHgzNiwgMHg0NCwgMHg0NiwgMHgwNywgMHgzNiwKKwkgMHg0NCwgMHg0NywgMHgwOCwgMHgzNiwgMHg0NCwgMHg0OCwgMHgwOSwgMHgzNiwgMHg0NCwgMHg0OSwgMHgwQSwgMHgzNiwgMHg0NCwgMHg0QSwgMHgwQiwgMHgzNiwKKwkgMHg0NCwgMHg0QiwgMHgwQywgMHgzNiwgMHg0NCwgMHg0QywgMHgwRCwgMHgzNiwgMHg0NCwgMHg0RCwgMHgwRSwgMHgzNiwgMHg0NCwgMHg0RSwgMHgwRiwgMHgzNiwKKwkgMHg0NCwgMHg0RiwgMHg4NywgMHhGRiwgMHgyMSwgMHgwMCwgMHgyNSwgMHg0NCwgMHgxMCwgMHgzNiwgMHg0NCwgMHg1MCwgMHgxMSwgMHgzNiwgMHg0NCwgMHg1MSwKKwkgMHgxMiwgMHgzNiwgMHg0NCwgMHg1MiwgMHgxMywgMHgzNiwgMHg0NCwgMHg1MywgMHgxNCwgMHgzNiwgMHg0NCwgMHg1NCwgMHgxNSwgMHgzNiwgMHg0NCwgMHg1NSwKKwkgMHgxNiwgMHgzNiwgMHg0NCwgMHg1NiwgMHgxNywgMHgzNiwgMHg0NCwgMHg1NywgMHgxOCwgMHgzNiwgMHg0NCwgMHg1OCwgMHgxOSwgMHgzNiwgMHg0NCwgMHg1OSwKKwkgMHgxQSwgMHgzNiwgMHg0NCwgMHg1QSwgMHgxQiwgMHgzNiwgMHg0NCwgMHg1QiwgMHgxQywgMHgzNiwgMHg0NCwgMHg1QywgMHgxRCwgMHgzNiwgMHg0NCwgMHg1RCwKKwkgMHgxRSwgMHgzNiwgMHg0NCwgMHg1RSwgMHgxRiwgMHgzNiwgMHg0NCwgMHg1RiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg0NiwKKwkgMHhCMywgMHg2MCwgMHg1OCwgMHg0RiwgMHgyMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMywgMHg2MSwgMHg3RiwgMHg2NywgMHgwQiwgMHgwMiwgMHgwMCwgMHhGMCwKKwkgMHgxQiwgMHg2MCwgMHhFMCwgMHg2MiwgMHgwNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEOSwgMHgwQSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg0MCwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwKKwkgMHg3RiwgMHg2NywgMHgwMiwgMHg2MSwgMHgxMSwgMHgwMiwgMHgxQywgMHg2MCwgMHgwNCwgMHg2MiwgMHgxQSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2MCwKKwkgMHg1MCwgMHg2MywgMHg1QSwgMHhERCwgMHhFRCwgMHg2MCwgMHhCOSwgMHg2NCwgMHg4MCwgMHhGQiwgMHgyRCwgMHhGRiwgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMywgMHgwNSwgMHhGQiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg0MCwgMHg2MCwgMHhDMCwgMHg2NCwKKwkgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MSwgMHgwRiwgMHgwMiwgMHgxQywgMHg2MCwgMHgwNCwgMHg2MiwgMHgxQywgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwMCwgMHg2MCwgMHg1MCwgMHg2MywgMHg1QSwgMHhERCwgMHhFRCwgMHg2MCwgMHhEMywgMHg2NCwgMHg4MCwgMHhGQiwgMHgyRCwgMHhGRiwKKwkgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg3RiwgMHg2MCwgMHhDMCwgMHg2NCwKKwkgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwgMHgwMiwgMHg2MSwgMHgzNCwgMHgwMiwgMHgyNSwgMHg0NSwgMHgyMCwgMHg0NCwgMHg4MCwgMHgyQSwgMHgzNSwgMHgwMCwKKwkgMHhGMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHgyOSwgMHgwMCwgMHgyMSwgMHg2MCwgMHg3NCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHg5QSwgMHhGMywgMHgxNiwgMHg2MCwgMHhDQywgMHg2MSwgMHhBMCwgMHg4NCwgMHhBMSwgMHhEQiwgMHgyNSwgMHg0NSwgMHgxQiwgMHg2MCwKKwkgMHg1MiwgMHg2MywgMHgwMSwgMHg2MSwgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwgMHhENCwgMHg4MCwgMHhCRCwgMHhEMywgMHhCRCwgMHhENSwgMHhDRCwgMHg4MSwKKwkgMHgwMiwgMHgwMywgMHgxNSwgMHgwMywgMHhGNywgMHgwMSwgMHhBMiwgMHhGRiwgMHhBNiwgMHhEMywgMHg0MCwgMHg0QywgMHgwMCwgMHhBOCwgMHg2NywgMHg0MywKKwkgMHgwQywgMHgwMiwgMHhBMiwgMHhERCwgMHg0MiwgMHg0OCwgMHg2NCwgMHg0MSwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg2NiwgMHg0NCwgMHgyOCwgMHhEQiwgMHgwMiwgMHgwMywgMHgyQywgMHg1OCwgMHhBMywgMHhGRiwgMHgwQywgMHg2MSwgMHgwMywgMHgwMCwgMHgwNCwgMHg2MSwKKwkgMHg3RiwgMHg2NywgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHhGMSwgMHg2MCwgMHgwMiwgMHg2NCwgMHhENCwgMHg4MCwKKwkgMHg3RiwgMHg2NywgMHgwNiwgMHg2MywgMHhGOCwgMHgwMiwgMHgzMSwgMHg0MCwgMHgyMCwgMHgyNiwgMHhGNSwgMHgwMSwgMHgyMSwgMHg2MCwgMHg3NCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHg5QSwgMHhGMywgMHgxNiwgMHg2MCwgMHhDQywgMHg2MSwgMHhBMCwgMHg4NCwgMHhBMSwgMHhEQiwgMHgxNiwgMHg2MCwgMHhEMCwgMHg2MSwKKwkgMHgwMSwgMHg2NCwgMHhBMSwgMHhEQiwgMHhGRiwgMHhGRiwgMHhDNCwgMHhGRSwgMHhFNSwgMHgwMSwgMHhDNiwgMHhGRSwgMHhFMywgMHgwMSwgMHg3RSwgMHg2MCwKKwkgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwgMHgwMiwgMHg2MSwgMHgzRiwgMHgwMiwgMHgyNSwgMHg0NSwgMHhGOCwgMHgyQiwgMHgzQiwgMHgwMCwKKwkgMHgyRSwgMHhGNSwgMHg2NywgMHg0NCwgMHhENCwgMHg4MCwgMHgxNywgMHg2MCwgMHg2QSwgMHg2MywgMHgzOSwgMHgwMywgMHg2NCwgMHg2MSwgMHgyNCwgMHg0NCwKKwkgMHgwMSwgMHgyNywgMHgyOSwgMHgwMCwgMHhBMywgMHhGQywgMHhBNCwgMHhGOCwgMHhCRCwgMHhEMywgMHhBMywgMHhEMSwgMHhENCwgMHg4MCwgMHhDRCwgMHg4MSwKKwkgMHgwOCwgMHgyNCwgMHg2NCwgMHg1OCwgMHgwOCwgMHhBMywgMHhGOCwgMHgwMiwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2MywgMHhCRCwgMHhEMywgMHhBMywgMHhEMSwKKwkgMHhGRSwgMHhBMCwgMHhGQSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhEMCwgMHg4MCwgMHgxNCwgMHgwMiwgMHgxMywgMHgwMiwgMHgwNCwgMHhBMywgMHhCRSwgMHhEMywKKwkgMHhCRCwgMHhEMSwgMHgwRiwgMHgxOCwgMHhENCwgMHg4MCwgMHgwRCwgMHgxOCwgMHgwMywgMHgwMywgMHhDMywgMHg4MywgMHhDMywgMHg4MywgMHhGNywgMHgwMSwKKwkgMHg2NCwgMHg0MSwgMHhERCwgMHg4MSwgMHhFMSwgMHg4MSwgMHhDQiwgMHg4MywgMHg0NiwgMHg2NSwgMHhGMiwgMHg2MCwgMHg1OCwgMHg0RiwgMHg0QSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywgMHgwQSwgMHgwMCwgMHhCRCwgMHhEMywgMHhCRSwgMHhEMSwgMHhENCwgMHg4MCwgMHhDRCwgMHg4MSwgMHgwOCwgMHgyNCwKKwkgMHg2NCwgMHg1OCwgMHgwOCwgMHhBMywgMHhGOCwgMHgwMiwgMHgwNCwgMHg2MSwgMHg3RiwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2NCwKKwkgMHgyMywgMHhGQSwgMHg2NywgMHg0NCwgMHgyNCwgMHhGQSwgMHg2MiwgMHg0MSwgMHgzRSwgMHg2MCwgMHgwMCwgMHg2NSwgMHgxQSwgMHg2MywgMHhFQSwgMHg2MCwKKwkgMHg4OCwgMHg2NCwgMHg2NSwgMHg0NiwgMHg1OCwgMHhEMCwgMHgyRSwgMHhGNSwgMHg1OSwgMHhEOCwgMHhGQiwgMHgxRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHg0QiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHhFOCwgMHg4NCwgMHhEQywgMHg4NCwgMHgyMywgMHhGQSwgMHhCRiwgMHhEMSwKKwkgMHg0QSwgMHg2NSwgMHg2NCwgMHg0MywgMHhGMiwgMHg2MCwgMHg1OCwgMHg0RiwgMHg0QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyNSwgMHhGMiwgMHhGRiwgMHhGRiwgMHhFMCwgMHhBMCwgMHgyMCwgMHg2NCwgMHgwMSwgMHgwNiwgMHgyNSwgMHhGQSwgMHgyMywgMHhGMiwKKwkgMHhERiwgMHhEMSwgMHhDQywgMHg4NCwgMHhFMCwgMHg4NSwgMHgwQiwgMHgwNiwgMHhCRiwgMHhEMSwgMHg2NCwgMHg0MSwgMHhENSwgMHg4MCwgMHg2NCwgMHg0MywKKwkgMHgwMSwgMHgwNiwgMHg2NSwgMHg0MSwgMHg0QSwgMHg2NSwgMHhFRiwgMHg2MCwgMHg1OCwgMHg0RiwgMHg4NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHhCQywgMHhGMywgMHgwMiwgMHg2MywgMHgyMywgMHhGQywgMHgwNywgMHhCNCwgMHgyNSwgMHhGQSwgMHgwMCwgMHg2NywKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg0QiwgMHhEMywgMHhCRiwgMHhEMywgMHg2MCwgMHg0MSwgMHhDOSwgMHg4MywgMHhFOSwgMHg4MSwgMHhERCwgMHg4MSwKKwkgMHhBMywgMHhGQSwgMHhFMCwgMHg4MSwgMHgzQywgMHg2MCwgMHgwMCwgMHg2NywgMHgwMiwgMHgyNCwgMHgwMiwgMHhBNCwgMHg2MCwgMHg0NywgMHg0MCwgMHg0QiwKKwkgMHhDOSwgMHg4MSwgMHg0QSwgMHg2NSwgMHhBQiwgMHg0NiwgMHg1OSwgMHhEMCwgMHhBQiwgMHg0NiwgMHhBNSwgMHhEOCwgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHhGNiwgMHgxRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHhGQywgMHhBMywKKwkgMHhBMywgMHhEMSwgMHg0QywgMHg2NSwgMHhBNCwgMHhEMywgMHhEQSwgMHg4MywgMHg2MCwgMHg0NywgMHgyNSwgMHhGQSwgMHgwMCwgMHg3RSwgMHg2MCwgMHg0NywKKwkgMHgwMSwgMHgyNiwgMHhEQywgMHg4NCwgMHg2MCwgMHg0MSwgMHhFOCwgMHg4NCwgMHhEOCwgMHg4NCwgMHgyMywgMHhGQSwgMHhBQiwgMHgwMSwgMHhGQywgMHhBMywKKwkgMHhBMywgMHhEMSwgMHg0QywgMHg2NSwgMHhBNCwgMHhEMywgMHhEQSwgMHg4MywgMHgwMCwgMHg3RiwgMHgyNSwgMHhGQSwgMHg2MCwgMHg0MSwgMHgwMSwgMHgyNiwKKwkgMHhERCwgMHg4MSwgMHhFOSwgMHg4NCwgMHhEOCwgMHg4NCwgMHgyMywgMHhGQSwgMHg5RCwgMHgwMSwgMHgyMywgMHhGMiwgMHgxMiwgMHg2MCwgMHhCOCwgMHg2NSwKKwkgMHg2MCwgMHg0MSwgMHgxMiwgMHg2MCwgMHg1NCwgMHg2MywgMHhBMywgMHhEQiwgMHhGRiwgMHhBMSwgMHg0OCwgMHg2NCwgMHg1OCwgMHhEMCwgMHg3RSwgMHhBOCwKKwkgMHg1QiwgMHhEOSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2NCwgMHhGRiwgMHhBMSwgMHhENywgMHg4MCwgMHgwMiwgMHgwMywgMHgwMSwgMHgwMywKKwkgMHhGNSwgMHgwMSwgMHgyRSwgMHhGNSwgMHgwMCwgMHg2MCwgMHgyRiwgMHg2NSwgMHgyNSwgMHhGMiwgMHgwMCwgMHg2MywgMHhDQywgMHg4NCwgMHgwMywgMHhBMywKKwkgMHhGRCwgMHgwNSwgMHg0QSwgMHg2NCwgMHhENywgMHg4MCwgMHgxMSwgMHg2MCwgMHhGMCwgMHg2MSwgMHgyRiwgMHgwNSwgMHhBMSwgMHhERCwgMHhFMywgMHg4MywKKwkgMHhGRSwgMHhBMywgMHg1OCwgMHhEMCwgMHg3RSwgMHhBOCwgMHg1OSwgMHhEOSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2NCwgMHhGOSwgMHgxRiwKKwkgMHgwMCwgMHg2MywgMHg1OSwgMHhERCwgMHgyRSwgMHhGNSwgMHgxMSwgMHg2MCwgMHhGMCwgMHg2NCwgMHgyNSwgMHhGMCwgMHhBMCwgMHhEMywgMHhEMywgMHg4MCwKKwkgMHgwMSwgMHhCMCwgMHgwNCwgMHgwMywgMHgwMSwgMHhBNCwgMHgwMywgMHgwMywgMHhBMiwgMHhEQiwgMHgwMSwgMHgwMCwgMHhBMiwgMHhERCwgMHgxMSwgMHg2MCwKKwkgMHhGOCwgMHg2MywgMHgxMCwgMHg2MCwgMHgwQSwgMHg2NSwgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4MiwgMHgxMCwgMHg2MCwKKwkgMHgyQSwgMHg2NSwgMHgwNywgMHg2NCwgMHg2NCwgMHg0MSwgMHg1QSwgMHhEQiwgMHhENiwgMHg4MCwgMHhDRCwgMHg4MSwgMHgwNiwgMHgwMywgMHhGQiwgMHgwMiwKKwkgMHgyNSwgMHhGMiwgMHgwMiwgMHhBMywgMHhDQywgMHg4NCwgMHhBMiwgMHhEQSwgMHhFQywgMHgwMiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgxMiwgMHg2MCwgMHg1NCwgMHg2MSwgMHhBMSwgMHhEMywgMHgyMywgMHhGQSwgMHhFMCwgMHg4MywgMHg0QSwgMHg2NSwgMHgwNCwgMHgwMiwgMHgwMiwgMHg2MywKKwkgMHgyMywgMHhGQywgMHhBNSwgMHhGQywgMHgwOSwgMHgwMCwgMHhEQiwgMHg4MywgMHg1OSwgMHhEMSwgMHhBNSwgMHhEOCwgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHhGOCwgMHgxRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMSwgMHg2MCwKKwkgMHhGMCwgMHg2MiwgMHhBMiwgMHhEMywgMHgwMCwgMHg2MSwgMHgwMiwgMHhBNCwgMHhGRSwgMHhBMCwgMHgyMywgMHhGQSwgMHgxQiwgMHgwMywgMHhGQSwgMHhBNCwKKwkgMHhGRCwgMHhBNCwgMHgwMSwgMHhBMSwgMHhGRCwgMHgwNywgMHg2MSwgMHg0MywgMHgyMywgMHhGMiwgMHgyNSwgMHhGQywgMHhFMCwgMHg4MywgMHgwMiwgMHhBMywKKwkgMHgxMSwgMHg2MCwgMHhGMCwgMHg2MSwgMHgwMCwgMHg2MCwgMHg0QSwgMHg2NCwgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOCwgMHg3RSwgMHgzQSwgMHgwMiwgMHgwMCwKKwkgMHgwMCwgMHhGNCwgMHgwMiwgMHg2NCwgMHhGOSwgMHgxRiwgMHgyNSwgMHhGMiwgMHgyMywgMHhGMiwgMHgwMSwgMHhCMCwgMHhDQywgMHg4NCwgMHgwNCwgMHgwMiwKKwkgMHgyMywgMHhGQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwgMHgyNSwgMHhGQSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg0MSwgMHg0QiwKKwkgMHg2NSwgMHg0MiwgMHg4MCwgMHg2NCwgMHhENCwgMHg4NSwgMHgyQiwgMHg0MSwgMHgwMCwgMHhBMSwgMHg1NSwgMHg4QiwgMHgwRCwgMHgwMywgMHgwMiwgMHgwNCwKKwkgMHg2NSwgMHg0MSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwgMHg0MCwgMHg0QiwgMHhDQSwgMHg4NCwgMHg1OCwgMHhEMCwgMHhDOSwgMHg4MSwgMHhCRCwgMHhEOSwKKwkgMHhGQywgMHgwMiwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHhFQywgMHgwMSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhGQywgMHhBMywgMHhBMywgMHhEMywKKwkgMHgwMiwgMHg3QywgMHhBMCwgMHhEMywgMHgyMywgMHhGOCwgMHhEQywgMHg4NCwgMHgyNSwgMHhGQSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHg2NCwgMHgyMywgMHhGQSwgMHgwMSwgMHg2NCwgMHg5RCwgMHhGRSwgMHgwMiwgMHgyOCwgMHgwMiwgMHg2NCwgMHgyNSwgMHhGQSwgMHgwMCwgMHg2NywKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMSwgMHg2MCwgMHg4MCwgMHg2MiwgMHhBMiwgMHhEMywgMHgwMiwgMHg3QywgMHgyMywgMHhGOCwgMHgwMSwgMHhCNCwKKwkgMHgyNSwgMHhGQSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHhGQywgMHhBMywgMHhBMywgMHhEMSwgMHgwMiwgMHg2NCwgMHgyMywgMHhGQSwKKwkgMHg2NCwgMHg0NCwgMHg3QywgMHg1RiwgMHg2MCwgMHg0NSwgMHg2NCwgMHg0NywgMHg3QywgMHg1RiwgMHg4OSwgMHhGMSwgMHg2NiwgMHg0MSwgMHhDMCwgMHg4NiwKKwkgMHhBNSwgMHhEMiwgMHg2MSwgMHg0NiwgMHgwMCwgMHg2MywgMHg2MCwgMHg0MCwgMHgwQSwgMHgzNywgMHgwMSwgMHg2MywgMHgxNCwgMHgzNywgMHgwMiwgMHg2MywKKwkgMHgzNywgMHgzNywgMHgwNiwgMHg2MywgMHg2RSwgMHgzNywgMHgwQiwgMHg2MywgMHgyNSwgMHhGQywgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHg2NCwgMHgyMywgMHhGQSwgMHg4OCwgMHhGRiwgMHg3NSwgMHg0NCwgMHg4RCwgMHhGRiwgMHhFOCwgMHg4NywgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwKKwkgMHgwMywgMHhCNCwgMHgyNSwgMHhGQSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHhGMCwgMHgyMSwgMHg2MCwgMHg3QywgMHg2NSwKKwkgMHgyMywgMHhGMiwgMHhBNSwgMHhEOSwgMHgwMiwgMHhBOCwgMHg2NCwgMHg0NCwgMHgwNywgMHgwMiwgMHgwMCwgMHhCQywgMHhGMiwgMHhBNCwgMHgwNCwgMHgwMywKKwkgMHgwMywgMHgwNywgMHgxRiwgMHg2MCwgMHhBQSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg2MywKKwkgMHgyMCwgMHg2MCwgMHgwQSwgMHg2MSwgMHg0OCwgMHg2NCwgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHgyNSwgMHhGMCwgMHgyMCwgMHg2NCwKKwkgMHhEMCwgMHg4MSwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNywgMHgyNSwgMHhGQSwgMHgwRiwgMHgwMCwgMHgyMCwgMHg2MCwgMHgwRSwgMHg2MywgMHhDMywgMHg4MywKKwkgMHgwMSwgMHgyQSwgMHgwNiwgMHgwMCwgMHhDRiwgMHg4MywgMHhBMywgMHhEMywgMHhDRCwgMHg4MSwgMHgwMCwgMHg3RiwgMHhCRCwgMHhEQiwgMHgwNCwgMHgwMywKKwkgMHgwMCwgMHg2NCwgMHhDOSwgMHg4MSwgMHhCRCwgMHhEQiwgMHhGRCwgMHgwMiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMywgMHhGMiwKKwkgMHgyNSwgMHhGMCwgMHgwMSwgMHg2MCwgMHg3MCwgMHg2MywgMHhBMywgMHhEOSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHhGQywgMHhBMywKKwkgMHhBNSwgMHhGMCwgMHhBMywgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg1RSwgMHgwMCwgMHg3RiwgMHg2MCwgMHg0MSwgMHg2NCwgMHg0NywgMHg3QywgMHg1RiwKKwkgMHg4OSwgMHhGMSwgMHg2NiwgMHg0MywgMHhDMCwgMHg4NiwgMHg2NSwgMHg0NCwgMHhBMSwgMHhEQSwgMHg2MywgMHg0NiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhGQywgMHhBMywgMHhBMywgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg1RSwgMHgwMCwgMHg3RiwgMHg2MCwgMHg0NSwgMHg2NCwgMHg0NywKKwkgMHg3QywgMHg1RiwgMHg4OSwgMHhGMSwgMHg2NiwgMHg0MSwgMHhDMCwgMHg4NiwgMHg2NSwgMHg0NCwgMHhBMCwgMHhEMiwgMHg2MSwgMHg0NiwgMHgyNSwgMHhGQSwKKwkgMHgwMiwgMHg2NCwgMHgyMywgMHhGQSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMywgMHhGMiwgMHgyNSwgMHhGMCwgMHgwMiwgMHhBOCwKKwkgMHgwMCwgMHg2NywgMHgwMiwgMHgwMiwgMHgyRCwgMHhGOSwgMHgyQywgMHhGOSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwgMHhBOCwgMHg2MSwKKwkgMHgyMywgMHhGMiwgMHgyNSwgMHhGMiwgMHgwMiwgMHhBOCwgMHgwMCwgMHhBOCwgMHgwOSwgMHgwMiwgMHgwNywgMHgwMywgMHhEMCwgMHhBMCwgMHgzMCwgMHg2NSwKKwkgMHgwMywgMHgwNCwgMHhBNywgMHhBMCwgMHg1OSwgMHg2NSwgMHgwMSwgMHgwNiwgMHg2NSwgMHg0NCwgMHhBMSwgMHhEQiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHg2MSwgMHgwQSwgMHgwMCwgMHgyNSwgMHg2MCwgMHgyQywgMHg2MSwgMHgwMSwgMHg2NCwgMHhBMSwgMHhEQiwgMHgwNCwgMHgwMCwKKwkgMHgyNSwgMHg2MCwgMHgyQywgMHg2MSwgMHgwMCwgMHg2NCwgMHhBMSwgMHhEQiwgMHgwNiwgMHg2MSwgMHg0MSwgMHg1NiwgMHhDNywgMHhGRSwgMHhFQiwgMHg2MCwKKwkgMHg4NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHhBMiwgMHhGRiwgMHg0NiwgMHg0NSwgMHgwMiwgMHhGMCwKKwkgMHgwOSwgMHg2MCwgMHgwOCwgMHg2NCwgMHhEMCwgMHg4MCwgMHgwMCwgMHhGNCwgMHgwMSwgMHhGMiwgMHg2NiwgMHg1QywgMHgyNSwgMHg0NiwgMHg1NiwgMHgwMiwKKwkgMHg3MCwgMHgyNywgMHg1NCwgMHgwMCwgMHgxMiwgMHg2NCwgMHgwMywgMHhGQSwgMHgwNCwgMHhGOCwgMHgwRSwgMHhGMiwgMHg4NywgMHhGQywgMHg4RCwgMHhGQywKKwkgMHg4RSwgMHhGQywgMHhEQSwgMHg4MiwgMHgxNiwgMHg2MSwgMHgwMCwgMHg2MywgMHhDOSwgMHg4MSwgMHg1QSwgMHhEQywgMHhGRCwgMHgwMiwgMHg2MCwgMHg0MCwKKwkgMHhGMCwgMHgzQiwgMHgxNiwgMHgwMCwgMHgzMiwgMHg0NCwgMHg4RiwgMHhGMywgMHgwMSwgMHhCMCwgMHhGNiwgMHhBMCwgMHgwOCwgMHgyNCwgMHgyQywgMHgwNSwKKwkgMHhEQywgMHg4MywgMHhGMCwgMHg2NywgMHgwRSwgMHhGQSwgMHgxQiwgMHg2MCwgMHhDNCwgMHg2NCwgMHgyQiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHg4RiwgMHhGRCwgMHgyQiwgMHhGRiwgMHhGRSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg0QSwgMHhEQiwgMHg0RiwgMHgwMCwKKwkgMHg5MCwgMHhGMywgMHgwQSwgMHg2NSwgMHhENCwgMHg4MCwgMHhEQywgMHg4MywgMHgxNywgMHgwNSwgMHg5MCwgMHhGRCwgMHg5OCwgMHhGRSwgMHgwNCwgMHgwNCwKKwkgMHgwMCwgMHg3RiwgMHgwOCwgMHg3RSwgMHgwRSwgMHhGQSwgMHgzQiwgMHhGRiwgMHgxQiwgMHg2MCwgMHhCOCwgMHg2NCwgMHgyQiwgMHhEQiwgMHg2NiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHgwRSwgMHhGMiwgMHgyQiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyNiwgMHhGNywgMHhGRSwKKwkgMHhGRCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg0QSwgMHhEQiwgMHgzMiwgMHgwMCwgMHg4QywgMHhGMywgMHhGRiwgMHhGRiwgMHhEOCwgMHhBMCwgMHhGRiwgMHhGRiwKKwkgMHgwRCwgMHgwNCwgMHgxQiwgMHg2MCwgMHhEMCwgMHg2NCwgMHgyQiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGQywgMHg2NCwgMHgzQiwgMHg0MiwgMHg0QSwgMHhEQiwgMHgyMSwgMHgwMCwgMHg0NiwgMHg0NSwgMHgwMCwgMHg2NCwKKwkgMHgyQiwgMHhEQiwgMHgyNSwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhBMiwgMHhGRiwKKwkgMHgwMCwgMHhGNCwgMHgwMSwgMHhGMCwgMHgwQSwgMHgxOCwgMHg3MCwgMHg2NywgMHhBMCwgMHg4MCwgMHhGMCwgMHg2NywgMHgwNiwgMHgwMywgMHhDMCwgMHg4NCwKKwkgMHgwMSwgMHhGQSwgMHgyNSwgMHg0NiwgMHgyNSwgMHg0NCwgMHg4MCwgMHhGQywgMHgwNSwgMHhGQSwgMHhCNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg0OCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhENCwgMHhGRSwgMHhBMywgMHhGRiwgMHhGRiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg0QSwgMHhEQiwgMHhENCwgMHhGRSwgMHhBMywgMHhGRiwKKwkgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwgMHhCRSwgMHg2NCwgMHg0MCwgMHg0NywgMHg1OCwgMHg0RiwgMHgwRCwgMHgwMCwgMHgxQiwgMHg2MCwKKwkgMHhCMiwgMHg2NCwgMHg0MCwgMHg0NywgMHg1OCwgMHg0RiwgMHgxOCwgMHgwMCwgMHgxQiwgMHg2MCwgMHhDQSwgMHg2NCwgMHg0MCwgMHg0NywgMHg1OCwgMHg0RiwKKwkgMHgwMywgMHgwMCwgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHhENSwgMHgwRSwgMHhGMiwgMHgwQiwgMHgxOCwgMHg2MCwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgwOCwgMHgwMCwgMHgxQiwgMHg2MCwgMHhFMCwgMHg2NCwgMHg0MCwgMHg0QiwgMHhGMCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhGMiwgMHgwMSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNywgMHhENSwgMHgwRSwgMHhGMiwgMHgxNCwgMHgxOCwgMHg2MCwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgxMSwgMHgwMCwgMHgwMiwgMHhGMCwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2NCwgMHhEMCwgMHg4MCwgMHhBMiwgMHhGRiwgMHg5MCwgMHhGMywKKwkgMHgwMiwgMHgwMiwgMHhDQywgMHg4NCwgMHg5MCwgMHhGQiwgMHgxQiwgMHg2MCwgMHhFMCwgMHg2NCwgMHg0MCwgMHg0QiwgMHhGMCwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHg3NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFOSwgMHgwMSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhGQiwgMHg2NCwgMHgzQSwgMHg0MiwgMHg0QSwgMHhEQiwKKwkgMHhBMiwgMHhGRiwgMHg5MywgMHhGMywgMHg4RiwgMHhGMywgMHhDQywgMHg4MCwgMHhGQSwgMHhBMCwgMHgwMSwgMHgxNCwgMHgxRSwgMHgwNSwgMHhCMywgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHg0RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMiwgMHhGRiwgMHgxOCwgMHgwMywgMHhGMCwgMHg2NywgMHgwRSwgMHhGQSwgMHgxQiwgMHg2MCwKKwkgMHhFMCwgMHg2MiwgMHgxQiwgMHg2MCwgMHhDNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGNiwgMHg2NCwgMHgzQSwgMHg0MiwgMHg0QSwgMHhEQiwgMHg5MywgMHhGMywgMHg4RiwgMHhGMywgMHhDQywgMHg4MywKKwkgMHhEQywgMHg4NCwgMHgwMSwgMHgxNSwgMHg5MywgMHhGRCwgMHg4RiwgMHhGQiwgMHhENCwgMHhGRSwgMHg5MiwgMHhGMywgMHg5MCwgMHhGMywgMHgwMCwgMHhBOCwKKwkgMHg5MSwgMHhGMSwgMHgwMywgMHgwMiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgyNywgMHgwNSwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwgMHg0RSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhBMiwgMHhGRiwgMHgyMSwgMHgwMywgMHgwMCwgMHg2MywgMHg5MiwgMHhGMywgMHgwRSwgMHhGQywgMHhDQywgMHg4NCwgMHhGRiwgMHgzQSwKKwkgMHg5MiwgMHhGQiwgMHg5OCwgMHhGRSwgMHgwMywgMHgwNCwgMHgwOCwgMHhCQiwgMHgwRSwgMHhGQywgMHgzQiwgMHhGRiwgMHgxQiwgMHg2MCwgMHhFMCwgMHg2MiwKKwkgMHgxQiwgMHg2MCwgMHhCOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHhGNywgMHg2NCwgMHgzQSwgMHg0MiwgMHg0QSwgMHhEQiwgMHg5MCwgMHhGMywgMHgwRSwgMHhGMiwgMHhEQywgMHg4MywgMHgwOCwgMHhCMCwKKwkgMHg5MCwgMHhGRCwgMHgwOCwgMHgyOCwgMHhGNywgMHhGRSwgMHhENCwgMHhGRSwgMHhBMywgMHhGRiwgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhCOSwgMHhGRSwgMHgxMywgMHhGRiwgMHgyNCwgMHg0MCwgMHg4MCwgMHgyQiwgMHgwQiwgMHgwMCwgMHhBMiwgMHhGRiwgMHgyNSwgMHg0NiwgMHgwOSwgMHhGNCwKKwkgMHgwRSwgMHhGMiwgMHgwNSwgMHgxOCwgMHgwOCwgMHhCQywgMHgwRSwgMHhGQSwgMHhGRiwgMHhGRiwgMHhGNywgMHhGRSwgMHgwMSwgMHgwMCwgMHhEOCwgMHhGRSwKKwkgMHhBMywgMHhGRiwgMHgyNSwgMHg0NiwgMHgzRSwgMHhGMiwgMHgwMCwgMHhGNCwgMHgwOCwgMHhGMCwgMHgyNSwgMHg0NiwgMHgwNiwgMHhCNCwgMHhGRiwgMHg3RiwKKwkgMHgxMCwgMHhCQywgMHgwNiwgMHgyNiwgMHhGRCwgMHg3RiwgMHgwRSwgMHhGQSwgMHgzRSwgMHhGMiwgMHgzRiwgMHhGMiwgMHg2MCwgMHg0MSwgMHgwOCwgMHgyQSwKKwkgMHg2NCwgMHg0NywgMHgzRiwgMHhGQSwgMHg2MCwgMHg0NSwgMHgxRiwgMHg2MCwgMHg2MiwgMHg2MiwgMHhBMiwgMHhEMywgMHhBMywgMHhGQywgMHhBQiwgMHhGQywKKwkgMHg5MSwgMHhGQywgMHhENCwgMHg4MCwgMHhFMCwgMHg2MCwgMHhDMSwgMHg2NSwgMHhBNSwgMHg4MCwgMHgwMSwgMHgwNCwgMHgwNywgMHgwMywgMHgyMywgMHhGMCwKKwkgMHgwOCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHhGMiwgMHg2MCwgMHgyNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGNCwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHgyRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxNCwgMHgwNCwgMHgyMywgMHhGMCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHg5OCwgMHhGMSwKKwkgMHgxRSwgMHg2MCwgMHhGQywgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywKKwkgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwMiwgMHgwMCwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg0NiwgMHgwMCwgMHgzRSwgMHhGMCwKKwkgMHg4OSwgMHhGMSwgMHg2NCwgMHg0NywgMHgwNywgMHhCNCwgMHgwNywgMHgzNiwgMHgzQiwgMHgwMCwgMHgwNCwgMHgwMywgMHhDQywgMHg4NCwgMHhFMCwgMHg4NCwKKwkgMHhDMCwgMHg4MywgMHgyRCwgMHgwMCwgMHgyQywgMHhGMiwgMHg4OCwgMHhGMSwgMHgwMSwgMHhCMCwgMHg2NCwgMHg0MywgMHgzNSwgMHgwMiwgMHgyRSwgMHhGMiwKKwkgMHgxMiwgMHg2MCwgMHhDRSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwKKwkgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgyRSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwKKwkgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgyRCwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwKKwkgMHgyQywgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwKKwkgMHhFOCwgMHgxQiwgMHg4OCwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHgwMSwgMHgwMywgMHgwOSwgMHgwMCwgMHg2NiwgMHg0NSwKKwkgMHg2MywgMHg0NiwgMHgwNiwgMHhGMCwgMHg2NSwgMHg0NiwgMHg2NCwgMHg0NCwgMHgwQywgMHgyNiwgMHgwMiwgMHgwMCwgMHgwMiwgMHgyNiwgMHgwNCwgMHgwMCwKKwkgMHgyMywgMHhGMCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHgwNywgMHhGQywgMHgyMywgMHhGMiwgMHhGRiwgMHhGRiwgMHgxMCwgMHgxQiwKKwkgMHgxQiwgMHg2MCwgMHhFMCwgMHg2MiwgMHgxQiwgMHg2MCwgMHg5QSwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwRSwgMHhGMiwgMHhDOCwgMHhGRSwgMHgxMCwgMHhBQywgMHgwRSwgMHhGQSwgMHgwRiwgMHgwMCwKKwkgMHgxQiwgMHg2MCwgMHhFMCwgMHg2MiwgMHgxQiwgMHg2MCwgMHhBQywgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwRSwgMHhGMiwgMHhDRSwgMHhGRSwgMHgxMCwgMHhBQywgMHgwRSwgMHhGQSwgMHhFQiwgMHg2MCwKKwkgMHg4NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDQiwgMHg4NCwgMHhDOSwgMHg4MywgMHhGRiwgMHhGRiwgMHgwOCwgMHgwNCwgMHg1OCwgMHhEMSwgMHhBNSwgMHhEOCwKKwkgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHhGOCwgMHgxRiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyNSwgMHhGMCwgMHgyMSwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEOSwgMHgxOSwgMHgwMCwgMHgyMSwgMHg2MCwgMHg4MCwgMHg2NCwgMHhBMCwgMHhEMSwKKwkgMHg3RiwgMHhGOSwgMHgwQywgMHg2MCwgMHgzOCwgMHg2MiwgMHg0MCwgMHg2MywgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRSwgMHgxRiwgMHg2NCwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgwQywgMHgwMCwgMHgwNCwgMHg2NSwgMHgwQywgMHg2MCwgMHgzOCwgMHg2MSwgMHg0OCwgMHg2NCwgMHgzRSwgMHg2MywgMHg3QywgMHhBOCwKKwkgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2NCwgMHhGOSwgMHgxRiwgMHgyMSwgMHg2MCwgMHgyQywgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwRCwgMHg2MCwgMHgxQywgMHg2NSwgMHgwMiwgMHhGRSwgMHg2NCwgMHg0NCwgMHhGOCwgMHg4NCwgMHhGOCwgMHg4NCwgMHhGOCwgMHg4NywKKwkgMHg2MCwgMHg0MSwgMHg2NCwgMHg0NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NCwgMHgzRSwgMHhGQiwgMHg2MCwgMHg0MiwgMHg2MSwgMHg0NCwKKwkgMHgwMywgMHhBMiwgMHg2MCwgMHhGRSwgMHhBMiwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHg2NCwgMHg0NCwgMHgwQywgMHg2MCwgMHgzQSwgMHg2NSwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NCwgMHg0MCwgMHhGQiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywKKwkgMHgwMCwgMHg2MSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMSwgMHg2MCwgMHg4MCwgMHg2NCwgMHhBMCwgMHhEMSwgMHg3RiwgMHhGOSwgMHgwMCwgMHg2NCwKKwkgMHg0MCwgMHg0MSwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHhBNiwgMHgwMCwgMHg0QSwgMHg2NCwgMHhBMCwgMHhEMiwgMHhGRiwgMHhGRiwgMHg0MCwgMHg0MiwKKwkgMHg4MCwgMHgyQiwgMHgwNCwgMHgwMCwgMHhGRiwgMHhCNCwgMHg0MCwgMHg0MiwgMHgwMSwgMHg2NCwgMHg0MCwgMHg0MSwgMHg4OCwgMHhGMywgMHg0NiwgMHg0QiwKKwkgMHg4NywgMHhGMywgMHg2MCwgMHg0NiwgMHhFMCwgMHg4MywgMHhBQiwgMHg0NiwgMHgyNiwgMHhGMCwgMHhBQiwgMHg0NiwgMHg1NSwgMHhGOCwgMHhBQiwgMHg0NiwKKwkgMHgyNywgMHhGMCwgMHhBQiwgMHg0NiwgMHg1NiwgMHhGOCwgMHhBQiwgMHg0NiwgMHgyOCwgMHhGMCwgMHhBQiwgMHg0NiwgMHg1NywgMHhGOCwgMHg2NiwgMHg0NCwKKwkgMHgwMiwgMHhBNiwgMHhGMSwgMHgxRiwgMHg4OCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NiwgMHhBQiwgMHg0NiwgMHgwQywgMHg2MCwgMHg3QSwgMHg2NSwKKwkgMHgyMiwgMHg0NCwgMHhGRiwgMHhCNCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4MSwgMHhDOSwgMHg4MSwKKwkgMHg1MiwgMHg2NCwgMHgwRSwgMHg2MywgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHgyMSwgMHg0NCwgMHgwMSwgMHgyQSwgMHgwOCwgMHgwMCwKKwkgMHhBQiwgMHg0NiwgMHhGMCwgMHhBMSwgMHg2RSwgMHg2NCwgMHgwRSwgMHg2MywgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOCwgMHhGRCwgMHgxRiwgMHhBQiwgMHg0NiwKKwkgMHgyMiwgMHg0NCwgMHhGRiwgMHhCNCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHgwQywgMHg2MCwgMHhEQywgMHg2NSwgMHhDNCwgMHg4MSwKKwkgMHg2MCwgMHg0NSwgMHhDOSwgMHg4MSwgMHg2MiwgMHg2NCwgMHgwNiwgMHg2MywgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHgyMSwgMHg0NCwKKwkgMHgwMSwgMHgyQSwgMHgwOCwgMHgwMCwgMHhBQiwgMHg0NiwgMHhGOCwgMHhBMSwgMHhBRSwgMHg2NCwgMHgwNiwgMHg2MywgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOCwKKwkgMHhGRCwgMHgxRiwgMHhBQiwgMHg0NiwgMHg2NSwgMHg0NCwgMHgwQywgMHg2MCwgMHhGQywgMHg2NSwgMHhDNCwgMHg4MSwgMHhDOSwgMHg4MSwgMHg2QSwgMHg2NCwKKwkgMHgwNiwgMHg2MywgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHgyMiwgMHg0NCwgMHhGRiwgMHhCNCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NSwKKwkgMHhDNCwgMHg4NCwgMHgwQywgMHg2MCwgMHhDMiwgMHg2NSwgMHhDNCwgMHg4MSwgMHg3MiwgMHg2NCwgMHgwNCwgMHg2MywgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwKKwkgMHhGRCwgMHgxRiwgMHhBQiwgMHg0NiwgMHgyMSwgMHg0NCwgMHgwMSwgMHgyQSwgMHgwNiwgMHgwMCwgMHhGQSwgMHhBMSwgMHg4OCwgMHg2NCwgMHgwNCwgMHg2MywKKwkgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOCwgMHhGRCwgMHgxRiwgMHgzNywgMHhGMCwgMHgyMSwgMHg0NCwgMHgwMSwgMHgyQSwgMHgxMywgMHgwMCwgMHgyMiwgMHg0NCwKKwkgMHgzRCwgMHhGQiwgMHg2MCwgMHg0MSwgMHgwMiwgMHhGRSwgMHhGOCwgMHg4NCwgMHhGOCwgMHg4NCwgMHhGOCwgMHg4NCwgMHgzQywgMHhGQiwgMHgwQywgMHg2MCwKKwkgMHhCRSwgMHg2MywgMHg4OCwgMHhGRiwgMHhDRCwgMHg4MSwgMHgwNiwgMHhBMywgMHhGRCwgMHgwRCwgMHg4RCwgMHhGRiwgMHgzQiwgMHhGRCwgMHg2NCwgMHg0NywKKwkgMHg4MCwgMHhCRiwgMHg2MCwgMHg1QywgMHgyMiwgMHg0MywgMHg4MCwgMHg2MSwgMHg4OCwgMHhGRiwgMHhDRiwgMHg4MywgMHhFMSwgMHg4MSwgMHhGRCwgMHgwRCwKKwkgMHg4RCwgMHhGRiwgMHg2MSwgMHg0NywgMHgzMSwgMHg5MSwgMHhCMSwgMHg4NCwgMHgzNywgMHhGQSwgMHg4NywgMHhGMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4MywKKwkgMHhFMywgMHg4MywgMHg2NiwgMHg0NCwgMHgwMiwgMHhBNiwgMHgzNywgMHhGMCwgMHg2NiwgMHg0NCwgMHhCMSwgMHg5QywgMHgzNywgMHhGOCwgMHgwMiwgMHhBNiwKKwkgMHhGQSwgMHgxRiwgMHhBQiwgMHg0NiwgMHgwMCwgMHg2NywgMHgwMCwgMHg2MSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMywgMHhGMiwgMHgyNSwgMHhGMCwKKwkgMHgwMiwgMHhBOCwgMHgwMCwgMHg2NywgMHgyNCwgMHgwMiwgMHgzRCwgMHhGMSwgMHg2NCwgMHg0NCwgMHgwMywgMHhCNCwgMHg0MCwgMHg0MiwgMHhEMCwgMHg4MCwKKwkgMHg4OCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NiwgMHhCNywgMHhGNCwgMHg4MCwgMHg2MSwgMHgwMiwgMHgwMiwgMHhFMywgMHg4MywgMHhFQiwgMHg4MywKKwkgMHgyMiwgMHg0NCwgMHg4OCwgMHhGRiwgMHhDQywgMHg4NCwgMHhFMSwgMHg4MSwgMHhGRCwgMHgwRCwgMHg4RCwgMHhGRiwgMHg2MSwgMHg0NywgMHgzMSwgMHg5MSwKKwkgMHg5RCwgMHg4NSwgMHhBNywgMHg4MywgMHgzNywgMHhGQywgMHg4NywgMHhGMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4MywgMHhFMywgMHg4MywgMHg2NiwgMHg0NCwKKwkgMHgwMiwgMHhBNiwgMHhCNywgMHhGMiwgMHg2NiwgMHg0NCwgMHhBNSwgMHg4MSwgMHhCNywgMHhGQSwgMHgwMiwgMHhBNiwgMHhGQSwgMHgxRiwgMHgwMCwgMHg2NywKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMSwgMHg2NCwgMHgyMywgMHhGQSwgMHgyNSwgMHg0NCwgMHgyNCwgMHhGQSwgMHgwNCwgMHg2NCwgMHg0MCwgMHg0QiwKKwkgMHg2MiwgMHg0MSwgMHgwQywgMHg2MCwgMHhDMiwgMHg2NCwgMHgwNCwgMHg2MywgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOCwgMHhGRCwgMHgxRiwgMHgyQiwgMHg0MywKKwkgMHgwMCwgMHg3QywgMHg1OSwgMHhEOCwgMHg0RiwgMHg4QiwgMHgwNiwgMHhBNCwgMHhGNiwgMHgwMiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyMSwgMHg2MCwgMHg4MCwgMHg2NCwgMHhBMCwgMHhEMSwgMHg3RiwgMHhGOSwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHg0RSwgMHgwMCwgMHgyNywgMHhGMiwKKwkgMHgxMiwgMHg2MCwgMHhDRSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwKKwkgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgyNywgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwKKwkgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgyNiwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwKKwkgMHgyNSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwKKwkgMHhFOCwgMHgxQiwgMHg4OCwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHgwMSwgMHgwMywgMHgyQSwgMHgwMCwgMHg0MywgMHg0QiwKKwkgMHhBQiwgMHg0NiwgMHgzNywgMHhGMiwgMHg4MCwgMHg2MCwgMHgzMCwgMHg3QywgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHg0RSwgMHg2MSwgMHg2RSwgMHg2NCwKKwkgMHgwRSwgMHg2MywgMHhBQiwgMHg0NiwgMHg1OSwgMHhEMCwgMHhBQiwgMHg0NiwgMHg1OCwgMHhEOCwgMHhGQiwgMHgxRiwgMHg4OCwgMHg2NCwgMHgwNCwgMHg2MywKKwkgMHhBQiwgMHg0NiwgMHg1OSwgMHhEMCwgMHhBQiwgMHg0NiwgMHg1OCwgMHhEOCwgMHhGQiwgMHgxRiwgMHhEOSwgMHg4MSwgMHg5OCwgMHg2NCwgMHgwNCwgMHg2MywKKwkgMHhBQiwgMHg0NiwgMHg1OSwgMHhEMCwgMHhBQiwgMHg0NiwgMHg1OCwgMHhEOCwgMHhGQiwgMHgxRiwgMHhEOSwgMHg4MSwgMHhBRSwgMHg2NCwgMHgwRSwgMHg2MywKKwkgMHhBQiwgMHg0NiwgMHg1OSwgMHhEMCwgMHhBQiwgMHg0NiwgMHg1OCwgMHhEOCwgMHhGQiwgMHgxRiwgMHgwMCwgMHg2NywgMHgwMCwgMHg2MSwgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHg2NywgMHgyMCwgMHg2MSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMSwgMHg2MCwgMHg4MCwgMHg2NCwgMHhBMCwgMHhEMSwKKwkgMHg3RiwgMHhGOSwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgzMSwgMHgwMCwgMHgyNywgMHhGMiwgMHgxMiwgMHg2MCwgMHhDRSwgMHg2NSwgMHg2MCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwKKwkgMHg2MSwgMHg0NiwgMHgyNywgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgyNiwgMHhGMCwKKwkgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwgMHgyNSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwgMHg4OCwgMHhGMywgMHgwOCwgMHhGRSwKKwkgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHgwMSwgMHgwMywgMHgwRCwgMHgwMCwgMHg0MywgMHg0QiwgMHhBQiwgMHg0NiwgMHgzNywgMHhGMiwgMHg4MCwgMHg2MCwKKwkgMHgzMCwgMHg2MSwgMHg5RCwgMHg4NSwgMHhBNCwgMHg4NCwgMHhBMiwgMHhEQSwgMHhBQiwgMHg0NiwgMHgwMCwgMHg2NywgMHgwMCwgMHg2MSwgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHg2NywgMHgyMCwgMHg2MSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgzRSwgMHhGMiwgMHhBQywgMHhGMSwgMHgwOCwgMHhCMCwKKwkgMHgxOSwgMHhGOCwgMHg0QSwgMHgwMiwgMHgwNywgMHgyMywgMHgyQiwgMHgwMCwgMHg2MCwgMHg0NywgMHgwNywgMHhCNCwgMHg4OSwgMHhGMSwgMHhDQywgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHg0MCwgMHg4QSwgMHhBQSwgMHg0NiwgMHgwMywgMHhGMiwgMHgwNCwgMHhGMCwgMHgwNSwgMHhGMiwgMHg2MCwgMHg0MywgMHhBQSwgMHg0NiwKKwkgMHgyQywgMHhGQywgMHgyRCwgMHhGOCwgMHgyRSwgMHhGQSwgMHhDQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhDQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhDRCwgMHhGMSwKKwkgMHgzMSwgMHhGOCwgMHg0NiwgMHg0QSwgMHgwMCwgMHhGNCwgMHgwMiwgMHhGMiwgMHgwMywgMHhGMCwgMHgwNCwgMHhGMiwgMHg2MCwgMHg0MywgMHhBQSwgMHg0NiwKKwkgMHgzMiwgMHhGQywgMHgzMywgMHhGOCwgMHgzNCwgMHhGQSwgMHhBQSwgMHg0NiwgMHgwNSwgMHhGMiwgMHgwNiwgMHhGMCwgMHgwNywgMHhGMiwgMHg2MCwgMHg0MywKKwkgMHhBQSwgMHg0NiwgMHgzNiwgMHhGQywgMHgzNywgMHhGOCwgMHgzOCwgMHhGQSwgMHgwMywgMHg2MCwgMHgwOCwgMHg2NCwgMHgxQywgMHgwMCwgMHg2NywgMHhGMSwKKwkgMHgyRiwgMHhGOCwgMHg2OCwgMHhGMSwgMHgzMCwgMHhGOCwgMHg2OSwgMHhGMSwgMHgzMSwgMHhGOCwgMHg0NiwgMHg0QSwgMHgwMCwgMHhGNCwgMHgwMiwgMHhGMiwKKwkgMHgwMywgMHhGMCwgMHgwNCwgMHhGMiwgMHg2MCwgMHg0MywgMHhBQSwgMHg0NiwgMHgyQywgMHhGQywgMHgyRCwgMHhGOCwgMHgyRSwgMHhGQSwgMHhBQSwgMHg0NiwKKwkgMHgwNSwgMHhGMiwgMHgwNiwgMHhGMCwgMHgwNywgMHhGMiwgMHg2MCwgMHg0MywgMHhBQSwgMHg0NiwgMHgzMiwgMHhGQywgMHgzMywgMHhGOCwgMHgzNCwgMHhGQSwKKwkgMHgwMiwgMHg2MCwgMHgwOCwgMHg2NCwgMHgwMCwgMHgwMCwgMHgyQSwgMHhGQSwgMHgwMiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyOCwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwRiwgMHhCNCwgMHg1OSwgMHgwMCwgMHhGRiwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwKKwkgMHgwNCwgMHg2NSwgMHgwNCwgMHg2NCwgMHhBNSwgMHhEQiwgMHgxMiwgMHgwMCwgMHgxQywgMHg2MCwgMHgwNCwgMHg2NSwgMHgwQywgMHg2NCwgMHhBNSwgMHhEQiwKKwkgMHgwRCwgMHgwMCwgMHgxQywgMHg2MCwgMHgwNCwgMHg2NSwgMHgwNiwgMHg2NCwgMHhBNSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwMCwgMHg2NywKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHgwNCwgMHg2NSwgMHgwOCwgMHg2NCwgMHhBNSwgMHhEQiwgMHhGNCwgMHg2MCwgMHhEOSwgMHg2NCwKKwkgMHg4MCwgMHhGQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyOSwgMHhGMywgMHg2NSwgMHhGQiwKKwkgMHg4MywgMHhGQiwgMHgwMiwgMHg2MCwgMHhFRSwgMHg2NCwgMHg4MiwgMHhGQiwgMHgwNywgMHg2NCwgMHg4NCwgMHhGQiwgMHhGNCwgMHg2MCwgMHhEOSwgMHg2NCwKKwkgMHg4MCwgMHhGQiwgMHhGRiwgMHhGRiwgMHhERiwgMHhGRSwgMHgwMCwgMHg2NCwgMHgxOSwgMHhGRiwgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhBRiwgMHg2MCwgMHhGRCwgMHg2MywgMHgwQywgMHg2MCwgMHgxNiwgMHg2NCwgMHhBMCwgMHhERCwgMHg2MiwgMHhGRiwgMHhGNCwgMHg2MCwgMHhDNiwgMHg2MywKKwkgMHg4MCwgMHhGRCwgMHhGRiwgMHhGRiwgMHgxQSwgMHhGRiwgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBNywgMHg2MCwgMHg5QiwgMHg2MywKKwkgMHgwQywgMHg2MCwgMHgxNiwgMHg2NCwgMHhBMCwgMHhERCwgMHg2MiwgMHhGRiwgMHgyOSwgMHhGNSwgMHgxQiwgMHg2MCwgMHhFMCwgMHg2MywgMHgxQiwgMHg2MCwKKwkgMHhCMiwgMHg2NCwgMHhCRCwgMHhEQiwgMHg2NiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgwMiwgMHg2NCwgMHhBMywgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHhGOSwgMHhGRSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHhBNywgMHgwMSwgMHgwMCwgMHgzNiwgMHhBOCwgMHgwMSwgMHgwMSwgMHgzNiwKKwkgMHhBQiwgMHgwMSwgMHgwMiwgMHgzNiwgMHhBRSwgMHgwMSwgMHgwMywgMHgzNiwgMHhCNSwgMHgwMSwgMHgwNCwgMHgzNiwgMHhEMSwgMHgwMSwgMHgwNSwgMHgzNiwKKwkgMHhDRiwgMHgwMSwgMHgwNiwgMHgzNiwgMHhGMSwgMHgwMSwgMHgwNywgMHgzNiwgMHhDQiwgMHgwMSwgMHgwOCwgMHgzNiwgMHhCNywgMHgwMSwgMHgwOSwgMHgzNiwKKwkgMHgwQywgMHgwMCwgMHgwQSwgMHgzNiwgMHgwRCwgMHgwMCwgMHgwQiwgMHgzNiwgMHgwRSwgMHgwMCwgMHgwQywgMHgzNiwgMHgxNywgMHgwMCwgMHgwRCwgMHgzNiwKKwkgMHgwRCwgMHgwMCwgMHgwRSwgMHgzNiwgMHgxRSwgMHgwMCwgMHgwRiwgMHgzNiwgMHgzMiwgMHgwMCwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHgwMCwKKwkgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwNSwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHgwMiwgMHgwMCwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHgzMiwgMHg0NSwgMHhCNCwgMHg4NSwgMHg0NSwgMHg1MiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHhCMCwgMHg2MCwgMHhDMSwgMHg2MywKKwkgMHgwQywgMHg2MCwgMHgxNiwgMHg2NCwgMHhBMCwgMHhERCwgMHg2MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxQSwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyQiwgMHgwNSwgMHgwMCwgMHg5MCwgMHg2MCwgMHgwMCwgMHhFOCwgMHhBRiwgMHg2MCwgMHhGRCwgMHg2MywKKwkgMHgwNCwgMHgwMCwgMHg5MSwgMHg2MCwgMHgwMCwgMHhFOCwgMHhCMCwgMHg2MCwgMHhBQiwgMHg2MywgMHgyOCwgMHhFOCwgMHgwQywgMHg2MCwgMHgxNiwgMHg2NCwKKwkgMHhBMCwgMHhERCwgMHg2MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxQSwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg5MSwgMHg2MCwKKwkgMHgwMCwgMHhFOCwgMHgyOCwgMHhFOCwgMHhEOSwgMHg2MCwgMHhGRSwgMHg2NCwgMHgzMiwgMHg0NSwgMHhBNCwgMHg4NSwgMHg0NSwgMHg1MiwgMHg5OSwgMHhGRiwKKwkgMHhBNSwgMHg0RiwgMHhGRiwgMHhCNCwgMHgwNywgMHhGQiwgMHg5OCwgMHhGRiwgMHhBNywgMHg2MCwgMHg5QiwgMHg2MywgMHgwQywgMHg2MCwgMHgxNiwgMHg2NCwKKwkgMHhBMCwgMHhERCwgMHg2MiwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg0MiwgMHg2RiwgMHg2RiwgMHg3NCwgMHg2MywgMHg2RiwKKwkgMHg2NCwgMHg2NSwgMHgyMCwgMHgyMSwgMHgyMSwgMHgyMCwgMHgyMCwgMHgwMCwgMHg1MywgMHg1NCwgMHg0MSwgMHgyRiwgMHg0MSwgMHg1MCwgMHgyMCwgMHg0NiwKKwkgMHg3NSwgMHg2RSwgMHg2MywgMHgyNywgMHg3MywgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgyNCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwOCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwNiwgMHgwMCwKKwkgMHgwNywgMHgwMCwgMHgwNSwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwNywgMHgwMCwgMHgwNiwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMSwgMHgwMCwKKwkgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwKKwkgMHg0MCwgMHgwMCwgMHgzMiwgMHgwMCwgMHgzMiwgMHgwMCwgMHgwQSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg0MCwgMHgwMCwgMHgzMiwgMHgwMCwKKwkgMHgzNiwgMHgwMCwgMHgwQSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg0MCwgMHgwMCwgMHgzQiwgMHgwMCwgMHg0MCwgMHgwMCwgMHgxNywgMHgwMCwKKwkgMHgwNywgMHgwMCwgMHgwNywgMHgwMCwgMHg0QSwgMHgwMCwgMHg0MCwgMHgwMCwgMHg0QSwgMHgwMCwgMHgxRSwgMHgwMCwgMHgwQywgMHgwMCwgMHgwOCwgMHgwMCwKKwkgMHg1NywgMHgwMCwgMHg0RCwgMHgwMCwgMHg1NywgMHgwMCwgMHgyQiwgMHgwMCwgMHgxOSwgMHgwMCwgMHgwOCwgMHgwMCwgMHg1RCwgMHgwMCwgMHg1MywgMHgwMCwKKwkgMHg1RCwgMHgwMCwgMHgzMSwgMHgwMCwgMHgxRiwgMHgwMCwgMHgwOCwgMHgwMCwKKworfTsgIC8qIGZ3X2ltYWdlXzRfZGF0YSAqLworCitzdGF0aWMgY29uc3QgQ0ZHX0lERU5USVRZX1NUUkNUIGZ3X2ltYWdlX2luZm9pZGVudGl0eVtdID0geworCXsKKwkJc2l6ZW9mKCBDRkdfSURFTlRJVFlfU1RSQ1QgKSAvIHNpemVvZihoY2ZfMTYpIC0gMSwKKwkJQ0ZHX0ZXX0lERU5USVRZLAorCQlDT01QX0lEX0ZXX0FQLAorCQkyLAkJCQkJCQkvL1ZhcmlhbnQKKwkJMiwJCQkJCQkJLy9NYWpvcgorCQkzNgkJCQkJCQkvL01pbm9yCisJfSwKKwl7IDAwMDAsIDAwMDAsIDAwMDAsIDAwMDAsIDAwMDAsIDAwMDAgfQkJLy9lbmRzZW50aW5lbAorfTsKKworc3RhdGljIGNvbnN0IENGR19QUk9HX1NUUkNUIGZ3X2ltYWdlX2NvZGVbXSA9IHsKKwl7CisJCTgsCisJCUNGR19QUk9HLAorCQlDRkdfUFJPR19WT0xBVElMRSwJCQkvLyBtb2RlCisJCTB4MDE0NiwJCS8vIHNpemVvZihmd19pbWFnZV8xX2RhdGEpLAorCQkweDAwMDAwMDYwLAkJCQkJLy8gVGFyZ2V0IGFkZHJlc3MgaW4gTklDIE1lbW9yeQorCQkweDAwMDAsCQkJCQkJLy8gQ1JDOiB5ZXMvbm8JVFlQRTogcHJpbWFyeS9zdGF0aW9uL3RlcnRpYXJ5CisJCShoY2ZfOCBGQVIgICAqKSBmd19pbWFnZV8xX2RhdGEKKwl9LAorCXsKKwkJOCwKKwkJQ0ZHX1BST0csCisJCUNGR19QUk9HX1ZPTEFUSUxFLAkJCS8vIG1vZGUKKwkJMHgxOTE4LAkJLy8gc2l6ZW9mKGZ3X2ltYWdlXzJfZGF0YSksCisJCTB4MDAwMDBDMTYsCQkJCQkvLyBUYXJnZXQgYWRkcmVzcyBpbiBOSUMgTWVtb3J5CisJCTB4MDAwMCwJCQkJCQkvLyBDUkM6IHllcy9ubwlUWVBFOiBwcmltYXJ5L3N0YXRpb24vdGVydGlhcnkKKwkJKGhjZl84IEZBUiAgICopIGZ3X2ltYWdlXzJfZGF0YQorCX0sCisJeworCQk4LAorCQlDRkdfUFJPRywKKwkJQ0ZHX1BST0dfVk9MQVRJTEUsCQkJLy8gbW9kZQorCQkweDAxYmMsCQkvLyBzaXplb2YoZndfaW1hZ2VfM19kYXRhKSwKKwkJMHgwMDFFMjUyRSwJCQkJCS8vIFRhcmdldCBhZGRyZXNzIGluIE5JQyBNZW1vcnkKKwkJMHgwMDAwLAkJCQkJCS8vIENSQzogeWVzL25vCVRZUEU6IHByaW1hcnkvc3RhdGlvbi90ZXJ0aWFyeQorCQkoaGNmXzggRkFSICAgKikgZndfaW1hZ2VfM19kYXRhCisJfSwKKwl7CisJCTgsCisJCUNGR19QUk9HLAorCQlDRkdfUFJPR19WT0xBVElMRSwJCQkvLyBtb2RlCisJCTB4YWIyOCwJCS8vIHNpemVvZihmd19pbWFnZV80X2RhdGEpLAorCQkweDAwMUY0MDAwLAkJCQkJLy8gVGFyZ2V0IGFkZHJlc3MgaW4gTklDIE1lbW9yeQorCQkweDAwMDAsCQkJCQkJLy8gQ1JDOiB5ZXMvbm8JVFlQRTogcHJpbWFyeS9zdGF0aW9uL3RlcnRpYXJ5CisJCShoY2ZfOCBGQVIgICAqKSBmd19pbWFnZV80X2RhdGEKKwl9LAorCXsKKwkJNSwKKwkJQ0ZHX1BST0csCisJCUNGR19QUk9HX1NUT1AsCQkJCS8vIG1vZGUKKwkJMDAwMCwKKyAJMHgwMDBGMTI5NywJCQkJCS8vIFN0YXJ0IGV4ZWN1dGlvbiBhZGRyZXNzCisJfSwKKwl7IDAwMDAsIDAwMDAsIDAwMDAsIDAwMDAsIDAwMDAwMDAwLCAwMDAwLCAwMDAwMDAwMH0KK307CisKK3N0YXRpYyBjb25zdCBDRkdfUkFOR0UyMF9TVFJDVCBmd19pbWFnZV9pbmZvY29tcGF0W10gPSB7CisJewkzICsgKCgyMCAqIHNpemVvZihDRkdfUkFOR0VfU1BFQ19TVFJDVCkpIC8gc2l6ZW9mKGhjZl8xNikpLAorCQlDRkdfRldfU1VQX1JBTkdFLAorCQlDT01QX1JPTEVfU1VQTCwKKwkJQ09NUF9JRF9BUEYsCisJCXsKKwkJCXsgMiwgMiwgNCB9ICAJCQkJLy92YXJpYW50LCBib3R0b20sIHRvcAorCQl9CisJfSwKKwl7CTMgKyAoKDIwICogc2l6ZW9mKENGR19SQU5HRV9TUEVDX1NUUkNUKSkgLyBzaXplb2YoaGNmXzE2KSksCisJCUNGR19NRklfQUNUX1JBTkdFU19TVEEsCisJCUNPTVBfUk9MRV9BQ1QsCisJCUNPTVBfSURfTUZJLAorCQl7CisJCQl7IDQsIDYsIDcgfSwgCQkJCS8vdmFyaWFudCwgYm90dG9tLCB0b3AKKwkJCXsgNSwgNiwgNyB9LCAJCQkJLy92YXJpYW50LCBib3R0b20sIHRvcAorCQkJeyA2LCA2LCA3IH0gIAkJCQkvL3ZhcmlhbnQsIGJvdHRvbSwgdG9wCisJCX0KKwl9LAorCXsJMyArICgoMjAgKiBzaXplb2YoQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QpKSAvIHNpemVvZihoY2ZfMTYpKSwKKwkJQ0ZHX0NGSV9BQ1RfUkFOR0VTX1NUQSwKKwkJQ09NUF9ST0xFX0FDVCwKKwkJQ09NUF9JRF9DRkksCisJCXsKKwkJCXsgMiwgMSwgMiB9ICAJCQkJLy92YXJpYW50LCBib3R0b20sIHRvcAorCQl9CisJfSwKKwl7IDAwMDAsIDAwMDAsIDAwMDAsIDAwMDAsIHsgeyAwMDAwLCAwMDAwLCAwMDAwIH0gfSB9CQkJLy9lbmRzZW50aW5lbAorfTsKKworbWVtaW1hZ2UgZndfaW1hZ2UgPSB7CisJIkZVUFU3RDM3ZGhmd2NpXDAwMUMiLAkJCS8vc2lnbmF0dXJlLCA8Zm9ybWF0IG51bWJlcj4sIEMvQmluIHR5cGUKKwkoQ0ZHX1BST0dfU1RSQ1QgKikgZndfaW1hZ2VfY29kZSwKKwkweDAwMEYxMjk3LAorCTAwMDAwMDAwLAkJCQkJLy8oZHVtbXkpIHBkYXBsdWcKKwkwMDAwMDAwMCwJCQkJCS8vKGR1bW15KSBwcmlwbHVnCisJKENGR19SQU5HRTIwX1NUUkNUICopIGZ3X2ltYWdlX2luZm9jb21wYXQsCisJKENGR19JREVOVElUWV9TVFJDVCAqKSBmd19pbWFnZV9pbmZvaWRlbnRpdHksCit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9hcF9oMjUuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2FwX2gyNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NDkxY2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9hcF9oMjUuYwpAQCAtMCwwICsxLDQwOTQgQEAKKy8qCisgKiBGaWxlOglhcF9oNTQuMTI0CisgKgorICogQWJzdHJhY3Q6CVRoaXMgZmlsZSBjb250YWlucyBtZW1vcnkgaW1hZ2UgJ2Z3X2ltYWdlJy4KKyAqCisgKiBDb250ZW50czoJVG90YWwgc2l6ZSBvZiB0aGUgbWVtb3J5IGltYWdlOiA2MzE0NiBieXRlcy4KKyAqCQlUb3RhbCBudW1iZXIgb2YgYmxvY2tzOiA0IGJsb2Nrcy4KKyAqCQlCbG9jayAgMSA6IGxvYWQgYWRkcmVzcyAwMDAwMDA2MCwgMzI4IGJ5dGVzLgorICoJCUJsb2NrICAyIDogbG9hZCBhZGRyZXNzIDAwMDAwQzE2LCA5MjY2IGJ5dGVzLgorICoJCUJsb2NrICAzIDogbG9hZCBhZGRyZXNzIDAwMUUzMDQ4LCA2NDc2IGJ5dGVzLgorICoJCUJsb2NrICA0IDogbG9hZCBhZGRyZXNzIDAwMUY0MDAwLCA0NzA3NiBieXRlcy4KKyAqCisgKiBJZGVudGl0eToJY29tcG9uZW50IGlkOiAzMiAodmFyaWFudCAzKSB2ZXJzaW9uIDEuMjQKKyAqCisgKiBDb21wYXRpYmlsaXR5OgorICoJCXN1cHBseWluZyBpbnRlcmZhY2UgOCAodmFyaWFudCA0KSA6IDEgLSAxCisgKgkJYWN0aW5nIG9uIGludGVyZmFjZSAxICh2YXJpYW50IDcpIDogMyAtIDMKKyAqCQlhY3Rpbmcgb24gaW50ZXJmYWNlIDEgKHZhcmlhbnQgOCkgOiAxIC0gMQorICoJCWFjdGluZyBvbiBpbnRlcmZhY2UgMiAodmFyaWFudCA0KSA6IDEgLSAyCisgKgorICogR2VuZXJhdGVkOglieSBnOlxmd1xmdXB1My5leGUgdmVyc2lvbiA0LjI2CisgKgorICogQ29tbWFuZGxpbmU6CWc6XGZ3XGZ1cHUzLmV4ZSAvZj00IC9uPWZ3X2ltYWdlIC9pPXQzMDEyNDAwLmhleAorICovCisKKworI2luY2x1ZGUgImhjZmNmZy5oIgkJCQkvLyB0byBnZXQgaGNmXzE2IGV0YyBkZWZpbmVkIGFzIHdlbGwgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9zc2libGUgc2V0dGluZ3Mgd2hpY2ggaW5sdWVuY2UgbWRkLmggb3IgZGhmLmgKKyNpbmNsdWRlICJtZGQuaCIgICAJCQkJLy90byBnZXQgQ09NUF9JRF9TVEEgZXRjIGRlZmluZWQKKyNpbmNsdWRlICJkaGYuaCIgICAJCQkJLy91c2VkIHRvIGJlICJmaGZtZW0uaCIsIHRvIGdldCBtZW1ibG9jayxwbHVncmVjb3JkLAorCitzdGF0aWMgY29uc3QgaGNmXzggZndfaW1hZ2VfMV9kYXRhW10gPSB7CisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REMsIDB4MEMsIDB4MDAsIDB4MDAsCisJIDB4MDIsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MEQsIDB4RDYsIDB4QTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzgsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MDAsIDB4MDksIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsCisJIDB4MDAsIDB4MDAsIDB4RkYsIDB4MDcsIDB4MDIsIDB4MDAsIDB4NjQsIDB4MDAsIDB4NjQsIDB4MDAsIDB4MTAsIDB4MjcsIDB4MTAsIDB4MjcsIDB4MTQsIDB4MDAsCisJIDB4RDAsIDB4MDcsIDB4RDAsIDB4MDcsIDB4MTAsIDB4MjcsIDB4MkYsIDB4MDAsIDB4MzIsIDB4MDAsIDB4MzIsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDIsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4MTAsIDB4MjcsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDMsIDB4MDAsCisJIDB4MzIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkEsIDB4MDksIDB4MkIsIDB4MDksIDB4MkIsIDB4MDksIDB4RkYsIDB4MEYsCisJIDB4RjAsIDB4MEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDEsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MzIsIDB4MDAsIDB4MzIsIDB4MDAsCisJIDB4MEEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisKK307ICAvKiBmd19pbWFnZV8xX2RhdGEgKi8KKworc3RhdGljIGNvbnN0IGhjZl84IGZ3X2ltYWdlXzJfZGF0YVtdID0geworCSAweDdDLCAweEE0LCAweDAwLCAweDE2LCAweDA4LCAweDQwLCAweDBGLCAweEQyLCAweEUxLCAweDI4LCAweEE1LCAweDdDLCAweDUwLCAweDMwLCAweEYxLCAweDg0LAorCSAweDQ0LCAweDA4LCAweEFCLCAweEFFLCAweEE1LCAweEI4LCAweEZDLCAweEJBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLAorCSAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE1LCAweEM2LCAweDg0LCAweEY4LAorCSAweDk5LCAweEVFLCAweDhELCAweEY2LCAweDBELCAweEZGLCAweEJELCAweEQ2LCAweEIxLCAweERFLCAweDU0LCAweDkxLCAweDUwLCAweDYwLCAweDAzLCAweDAyLAorCSAweEE5LCAweENFLCAweDdELCAweDU2LCAweDE5LCAweEU3LCAweDYyLCAweEI1LCAweEU2LCAweDRELCAweDlBLCAweEVDLCAweDQ1LCAweDhGLCAweDlELCAweDFGLAorCSAweDQwLCAweDg5LCAweDg3LCAweEZBLCAweDE1LCAweEVGLCAweEVCLCAweEIyLCAweEM5LCAweDhFLCAweDBCLCAweEZCLCAweEVDLCAweDQxLCAweDY3LCAweEIzLAorCSAweEZELCAweDVGLCAweEVBLCAweDQ1LCAweEJGLCAweDIzLCAweEY3LCAweDUzLCAweDk2LCAweEU0LCAweDVCLCAweDlCLCAweEMyLCAweDc1LCAweDFDLCAweEUxLAorCSAweEFFLCAweDNELCAweDZBLCAweDRDLCAweDVBLCAweDZDLCAweDQxLCAweDdFLCAweDAyLCAweEY1LCAweDRGLCAweDgzLCAweDVDLCAweDY4LCAweEY0LCAweDUxLAorCSAweDM0LCAweEQxLCAweDA4LCAweEY5LCAweDkzLCAweEUyLCAweDczLCAweEFCLCAweDUzLCAweDYyLCAweDNGLCAweDJBLCAweDBDLCAweDA4LCAweDUyLCAweDk1LAorCSAweDY1LCAweDQ2LCAweDVFLCAweDlELCAweDI4LCAweDMwLCAweEExLCAweDM3LCAweDBGLCAweDBBLCAweEI1LCAweDJGLCAweDA5LCAweDBFLCAweDM2LCAweDI0LAorCSAweDlCLCAweDFCLCAweDNELCAweERGLCAweDI2LCAweENELCAweDY5LCAweDRFLCAweENELCAweDdGLCAweDlGLCAweEVBLCAweDFCLCAweDEyLCAweDlFLCAweDFELAorCSAweDc0LCAweDU4LCAweDJFLCAweDM0LCAweDJELCAweDM2LCAweEIyLCAweERDLCAweEVFLCAweEI0LCAweEZCLCAweDVCLCAweEY2LCAweEE0LCAweDRELCAweDc2LAorCSAweDYxLCAweEI3LCAweENFLCAweDdELCAweDdCLCAweDUyLCAweDNFLCAweERELCAweDcxLCAweDVFLCAweDk3LCAweDEzLCAweEY1LCAweEE2LCAweDY4LCAweEI5LAorCSAweDAwLCAweDAwLCAweDJDLCAweEMxLCAweDYwLCAweDQwLCAweDFGLCAweEUzLCAweEM4LCAweDc5LCAweEVELCAweEI2LCAweEJFLCAweEQ0LCAweDQ2LCAweDhELAorCSAweEQ5LCAweDY3LCAweDRCLCAweDcyLCAweERFLCAweDk0LCAweEQ0LCAweDk4LCAweEU4LCAweEIwLCAweDRBLCAweDg1LCAweDZCLCAweEJCLCAweDJBLCAweEM1LAorCSAweEU1LCAweDRGLCAweDE2LCAweEVELCAweEM1LCAweDg2LCAweEQ3LCAweDlBLCAweDU1LCAweDY2LCAweDk0LCAweDExLCAweENGLCAweDhBLCAweDEwLCAweEU5LAorCSAweDA2LCAweDA0LCAweDgxLCAweEZFLCAweEYwLCAweEEwLCAweDQ0LCAweDc4LCAweEJBLCAweDI1LCAweEUzLCAweDRCLCAweEYzLCAweEEyLCAweEZFLCAweDVELAorCSAweEMwLCAweDgwLCAweDhBLCAweDA1LCAweEFELCAweDNGLCAweEJDLCAweDIxLCAweDQ4LCAweDcwLCAweDA0LCAweEYxLCAweERGLCAweDYzLCAweEMxLCAweDc3LAorCSAweDc1LCAweEFGLCAweDYzLCAweDQyLCAweDMwLCAweDIwLCAweDFBLCAweEU1LCAweDBFLCAweEZELCAweDZELCAweEJGLCAweDRDLCAweDgxLCAweDE0LCAweDE4LAorCSAweDM1LCAweDI2LCAweDJGLCAweEMzLCAweEUxLCAweEJFLCAweEEyLCAweDM1LCAweENDLCAweDg4LCAweDM5LCAweDJFLCAweDU3LCAweDkzLCAweEYyLCAweDU1LAorCSAweDgyLCAweEZDLCAweDQ3LCAweDdBLCAweEFDLCAweEM4LCAweEU3LCAweEJBLCAweDJCLCAweDMyLCAweDk1LCAweEU2LCAweEEwLCAweEMwLCAweDk4LCAweDE5LAorCSAweEQxLCAweDlFLCAweDdGLCAweEEzLCAweDY2LCAweDQ0LCAweDdFLCAweDU0LCAweEFCLCAweDNCLCAweDgzLCAweDBCLCAweENBLCAweDhDLCAweDI5LCAweEM3LAorCSAweEQzLCAweDZCLCAweDNDLCAweDI4LCAweDc5LCAweEE3LCAweEUyLCAweEJDLCAweDFELCAweDE2LCAweDc2LCAweEFELCAweDNCLCAweERCLCAweDU2LCAweDY0LAorCSAweDRFLCAweDc0LCAweDFFLCAweDE0LCAweERCLCAweDkyLCAweDBBLCAweDBDLCAweDZDLCAweDQ4LCAweEU0LCAweEI4LCAweDVELCAweDlGLCAweDZFLCAweEJELAorCSAweEVGLCAweDQzLCAweEE2LCAweEM0LCAweEE4LCAweDM5LCAweEE0LCAweDMxLCAweDM3LCAweEQzLCAweDhCLCAweEYyLCAweDMyLCAweEQ1LCAweDQzLCAweDhCLAorCSAweDU5LCAweDZFLCAweEI3LCAweERBLCAweDhDLCAweDAxLCAweDY0LCAweEIxLCAweEQyLCAweDlDLCAweEUwLCAweDQ5LCAweEI0LCAweEQ4LCAweEZBLCAweEFDLAorCSAweDA3LCAweEYzLCAweDI1LCAweENGLCAweEFGLCAweENBLCAweDhFLCAweEY0LCAweEU5LCAweDQ3LCAweDE4LCAweDEwLCAweEQ1LCAweDZGLCAweDg4LCAweEYwLAorCSAweDZGLCAweDRBLCAweDcyLCAweDVDLCAweDI0LCAweDM4LCAweEYxLCAweDU3LCAweEM3LCAweDczLCAweDUxLCAweDk3LCAweDIzLCAweENCLCAweDdDLCAweEExLAorCSAweDlDLCAweEU4LCAweDIxLCAweDNFLCAweERELCAweDk2LCAweERDLCAweDYxLCAweDg2LCAweDBELCAweDg1LCAweDBGLCAweDkwLCAweEUwLCAweDQyLCAweDdDLAorCSAweEM0LCAweDcxLCAweEFBLCAweENDLCAweEQ4LCAweDkwLCAweDA1LCAweDA2LCAweDAxLCAweEY3LCAweDEyLCAweDFDLCAweEEzLCAweEMyLCAweDVGLCAweDZBLAorCSAweEY5LCAweEFFLCAweEQwLCAweDY5LCAweDkxLCAweDE3LCAweDU4LCAweDk5LCAweDI3LCAweDNBLCAweEI5LCAweDI3LCAweDM4LCAweEQ5LCAweDEzLCAweEVCLAorCSAweEIzLCAweDJCLCAweDMzLCAweDIyLCAweEJCLCAweEQyLCAweDcwLCAweEE5LCAweDg5LCAweDA3LCAweEE3LCAweDMzLCAweEI2LCAweDJELCAweDIyLCAweDNDLAorCSAweDkyLCAweDE1LCAweDIwLCAweEM5LCAweDQ5LCAweDg3LCAweEZGLCAweEFBLCAweDc4LCAweDUwLCAweDdBLCAweEE1LCAweDhGLCAweDAzLCAweEY4LCAweDU5LAorCSAweDgwLCAweDA5LCAweDE3LCAweDFBLCAweERBLCAweDY1LCAweDMxLCAweEQ3LCAweEM2LCAweDg0LCAweEI4LCAweEQwLCAweEMzLCAweDgyLCAweEIwLCAweDI5LAorCSAweDc3LCAweDVBLCAweDExLCAweDFFLCAweENCLCAweDdCLCAweEZDLCAweEE4LCAweEQ2LCAweDZELCAweDNBLCAweDJDLCAweDAwLCAweDMwLCAweDAwLCAweDMxLAorCSAweDAwLCAweDMzLCAweDAwLCAweDM0LCAweDAwLCAweDM1LCAweDAwLCAweDM2LCAweDAwLCAweDM3LCAweDAwLCAweDM4LCAweDAwLCAweDM4LCAweDAwLCAweDNBLAorCSAweDAwLCAweDNCLCAweDAwLCAweDNDLCAweDAwLCAweDNELCAweDAwLCAweDNFLCAweDAwLCAweDNGLCAweDAwLCAweDNGLCAweDU5LCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDU5LCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweDIxLCAweDEwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBBLCAweDAwLCAweDIwLCAweDAzLCAweEUwLCAweDAxLCAweDQwLCAweDAxLCAweDIwLCAweDAzLCAweEUwLCAweDAxLAorCSAweDQwLCAweDAxLCAweDE4LCAweDA4LCAweEYwLCAweDNGLCAweEZDLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDBBLCAweDAyLCAweDE0LCAweDA1LCAweDMyLCAweDBCLCAweDM3LAorCSAweDA4LCAweDUwLCAweDBCLCAweDZFLCAweDAyLCAweDAwLCAweDA0LCAweDAwLCAweDBCLCAweDAwLCAweDE2LCAweDAwLCAweDBDLCAweDAwLCAweDEyLCAweDAwLAorCSAweDE4LCAweDAwLCAweDI0LCAweDAwLCAweDMwLCAweDAwLCAweDQ4LCAweDAwLCAweDYwLCAweDAwLCAweDZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDM5LCAweDAwLCAweDM5LCAweDAwLCAweDIwLCAweDAwLCAweDM5LCAweDAwLAorCSAweDM5LCAweDAwLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA5LCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweEE0LCAweDEwLCAweEYyLCAweDEwLCAweEFBLCAweDEwLCAweEVDLCAweDEwLCAweEIwLCAweDEwLCAweEU2LCAweDEwLCAweEI2LCAweDEwLAorCSAweEUwLCAweDEwLCAweEJDLCAweDEwLCAweERBLCAweDEwLCAweEMyLCAweDEwLCAweEQ0LCAweDEwLCAweEM4LCAweDEwLCAweENFLCAweDEwLCAweDA3LCAweDAxLAorCSAweDAwLCAweDAwLCAweDE2LCAweDIyLCAweDAwLCAweDA0LCAweDA4LCAweDAxLCAweDAwLCAweDAwLCAweDE2LCAweDI2LCAweDAwLCAweDA0LCAweDA5LCAweDAxLAorCSAweDAwLCAweDAwLCAweDE2LCAweDJBLCAweDAwLCAweDA0LCAweDBBLCAweDAxLCAweDAwLCAweDAwLCAweDE2LCAweDJFLCAweDAwLCAweDA0LCAweDBCLCAweDAxLAorCSAweDAwLCAweDAwLCAweDEwLCAweDI0LCAweDA0LCAweDA0LCAweDBDLCAweDAxLCAweDAwLCAweDAwLCAweDEwLCAweDI4LCAweDA0LCAweDA0LCAweDBELCAweDAxLAorCSAweDAwLCAweDAwLCAweDEwLCAweDJDLCAweDA0LCAweDA0LCAweDBFLCAweDAxLCAweDAwLCAweDAwLCAweDEwLCAweDMwLCAweDA0LCAweDA0LCAweDBGLCAweDAxLAorCSAweDAwLCAweDAwLCAweDE0LCAweDM0LCAweDA4LCAweDg0LCAweDEwLCAweDAxLCAweDAwLCAweDAwLCAweDE0LCAweDM4LCAweDA4LCAweDg0LCAweDExLCAweDAxLAorCSAweDAwLCAweDAwLCAweDE0LCAweDNDLCAweDA4LCAweDg0LCAweDEyLCAweDAxLCAweDAwLCAweDAwLCAweDE0LCAweDQwLCAweDA4LCAweDg0LCAweDEzLCAweDAxLAorCSAweDAwLCAweDAwLCAweDE3LCAweDY0LCAweDBDLCAweDhCLCAweDE0LCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDY4LCAweDBDLCAweDhCLCAweDE1LCAweDAxLAorCSAweDAwLCAweDAwLCAweDE3LCAweDZDLCAweDBDLCAweDhCLCAweDE2LCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDcwLCAweDBDLCAweDhCLCAweDE3LCAweDAxLAorCSAweDAwLCAweDAwLCAweDE3LCAweDc0LCAweDBDLCAweDhCLCAweDE4LCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDc4LCAweDBDLCAweDhCLCAweDE5LCAweDAxLAorCSAweDAwLCAweDAwLCAweDE3LCAweDdDLCAweDBDLCAweDhCLCAweDFBLCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDgwLCAweDBDLCAweDhCLCAweDFCLCAweDAxLAorCSAweDAwLCAweDAwLCAweDE3LCAweDg0LCAweDBDLCAweDhCLCAweDFDLCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDg4LCAweDBDLCAweDhCLCAweDFELCAweDAxLAorCSAweDAwLCAweDAwLCAweDE3LCAweDhDLCAweDBDLCAweDhCLCAweDFFLCAweDAxLCAweDAwLCAweDAwLCAweDBFLCAweDk1LCAweDE3LCAweDA0LCAweDFGLCAweDAxLAorCSAweDAwLCAweDAwLCAweDBFLCAweDk5LCAweDE3LCAweDA0LCAweDIwLCAweDAxLCAweDAwLCAweDAwLCAweDBFLCAweDlELCAweDE3LCAweDA0LCAweDIxLCAweDAxLAorCSAweDAwLCAweDAwLCAweDBFLCAweEExLCAweDE3LCAweDA0LCAweDIyLCAweDAxLCAweDAwLCAweDAwLCAweDBFLCAweEE1LCAweDAwLCAweDAwLCAweDE0LCAweDExLAorCSAweDM0LCAweDExLCAweDU0LCAweDExLCAweDc0LCAweDExLCAweENDLCAweDExLCAweDFDLCAweDExLCAweDNDLCAweDExLCAweDVDLCAweDExLCAweDdDLCAweDExLAorCSAweEQ0LCAweDExLCAweDI0LCAweDExLCAweDQ0LCAweDExLCAweDY0LCAweDExLCAweDg0LCAweDExLCAweERDLCAweDExLCAweDJDLCAweDExLCAweDRDLCAweDExLAorCSAweDZDLCAweDExLCAweDhDLCAweDExLCAweEU0LCAweDExLCAweDk0LCAweDExLCAweDlDLCAweDExLCAweEE0LCAweDExLCAweEFDLCAweDExLCAweEI0LCAweDExLAorCSAweEJDLCAweDExLCAweEM0LCAweDExLCAweEVDLCAweDExLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLAorCSAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLAorCSAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLAorCSAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDBBLCAweDBBLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLAorCSAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDBBLCAweDBBLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCSAweDE3LCAweDE3LCAweDE3LCAweDE3LCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDE0LAorCSAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LAorCSAweDE0LCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDExLCAweDExLCAweDExLCAweDExLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDBFLCAweDBFLCAweDBFLCAweDBFLCAweDBFLCAweDE0LCAweDE0LAorCSAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE2LCAweDE2LCAweDE2LCAweDE2LAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDBBLAorCSAweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDBBLCAweDBBLCAweDBBLAorCSAweDBBLCAweDdGLCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDdGLCAweDE0LCAweDE0LCAweDE0LCAweDE0LAorCSAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDBBLCAweDBBLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LAorCSAweDE0LCAweDE0LCAweDE0LCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDlELCAweDlELCAweEExLCAweEFBLCAweDEwLCAweDEwLAorCSAweDlELCAweDlELCAweDA4LCAweDAyLCAweDA2LCAweDAwLCAweEE1LCAweEE1LCAweEFBLCAweEFBLCAweDE3LCAweDE3LCAweEEyLCAweEEyLCAweDE1LCAweDA1LAorCSAweDA3LCAweDAwLCAweEFBLCAweEFBLCAweEI0LCAweEI0LCAweDFDLCAweDFDLCAweEE3LCAweEE3LCAweDFDLCAweDBBLCAweDA4LCAweDAwLCAweEI3LCAweEI3LAorCSAweEMxLCAweEMxLCAweDA5LCAweDA5LCAweEI0LCAweEI0LCAweDI5LCAweDE3LCAweDA4LCAweDAwLCAweEJELCAweEJELCAweEM3LCAweEM3LCAweDBGLCAweDBGLAorCSAweEJBLCAweEJBLCAweDJGLCAweDFELCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDE3LAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweEU0LCAweEYwLCAweEZELCAweEYwLCAweDFGLCAweEYxLCAweDYwLCAweEY2LCAweDlCLCAweEYwLCAweDc5LCAweEY2LCAweDlCLCAweEYwLCAweDlCLCAweEYwLAorCSAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweENDLCAweEY3LCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLAorCSAweDlCLCAweEYwLCAweDE1LCAweEYzLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLAorCSAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLAorCSAweDlCLCAweEYwLCAweDY2LCAweEYzLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLAorCSAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLAorCSAweEUzLCAweEYyLCAweEZFLCAweEYyLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLAorCSAweEI0LCAweDFDLCAweDU5LCAweEYxLCAweDZDLCAweEYxLCAweDFDLCAweEYyLCAweDIwLCAweEYyLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweENGLCAweEYyLAorCSAweDY0LCAweEU2LCAweDNFLCAweEU2LCAweDkyLCAweEU2LCAweEUxLCAweEU2LCAweEE5LCAweEU3LCAweENGLCAweEU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDEyLCAweEYxLCAweDM1LCAweEYxLCAweDVELCAweEY2LCAweDVELCAweEY2LCAweDZELCAweEY2LCAweDg2LCAweEY2LCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEZDLCAweEMwLCAweEYzLCAweEYyLCAweEY1LCAweDVBLCAweDAwLCAweDAyLCAweDAwLCAweEY5LCAweEZGLAorCSAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweENBLCAweDAwLCAweDAyLCAweDAwLCAweEY3LCAweEZGLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweEIwLCAweDI2LAorCSAweDA2LCAweDAwLCAweEYwLCAweEZGLCAweEMwLCAweEYzLCAweEFBLCAweEYzLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweEY2LCAweEZGLCAweEMwLCAweEYzLAorCSAweEQ2LCAweEYzLCAweDZDLCAweDAwLCAweDAyLCAweDAwLCAweEY0LCAweEZGLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDY4LCAweDAxLCAweDAyLCAweDAwLAorCSAweEY1LCAweEZGLCAweEMwLCAweEYzLCAweEZCLCAweEY1LCAweEEyLCAweDI2LCAweDAyLCAweDAwLCAweEVELCAweEZGLCAweEMwLCAweEYzLCAweDBELCAweEY2LAorCSAweDlFLCAweDJCLCAweDAyLCAweDAwLCAweEVDLCAweEZGLCAweEMwLCAweEYzLCAweDNCLCAweEY2LCAweEEwLCAweDJCLCAweDAyLCAweDAwLCAweEVCLCAweEZGLAorCSAweEMwLCAweEYzLCAweDQxLCAweEY2LCAweEEyLCAweDJCLCAweDAyLCAweDAwLCAweEVFLCAweEZGLCAweEMwLCAweEYzLCAweDQ3LCAweEY2LCAweEQ2LCAweDJCLAorCSAweDAyLCAweDAwLCAweERBLCAweEZGLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweEQwLCAweDEzLCAweDBDLCAweDAwLCAweEVBLCAweEZGLCAweEMwLCAweEYzLAorCSAweEFBLCAweEYzLCAweEVDLCAweDJCLCAweDA2LCAweDAwLCAweEU5LCAweEZGLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweEYyLCAweDJCLCAweDAyLCAweDAwLAorCSAweEU4LCAweEZGLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweEY0LCAweDJCLCAweDAyLCAweDAwLCAweEU3LCAweEZGLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLAorCSAweEY2LCAweDJCLCAweDAyLCAweDAwLCAweEU2LCAweEZGLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweEY4LCAweDJCLCAweDAyLCAweDAwLCAweEU1LCAweEZGLAorCSAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweEZBLCAweDJCLCAweDEwLCAweDAwLCAweEU0LCAweEZGLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDBBLCAweDJDLAorCSAweDE4LCAweDAwLCAweERCLCAweEZGLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDIyLCAweDJDLCAweDAyLCAweDAwLCAweERDLCAweEZGLCAweEMwLCAweEYzLAorCSAweEQ2LCAweEYzLCAweDI0LCAweDJDLCAweDAyLCAweDAwLCAweEUxLCAweEZGLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweEM2LCAweDJDLCAweDAyLCAweDAwLAorCSAweEUwLCAweEZGLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweEM0LCAweDJDLCAweDAyLCAweDAwLCAweEUzLCAweEZGLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLAorCSAweEE4LCAweDJDLCAweDAyLCAweDAwLCAweEUyLCAweEZGLCAweDBFLCAweEY0LCAweEFBLCAweEYzLCAweDdFLCAweDJDLCAweDI0LCAweDAwLCAweDAzLCAweEZDLAorCSAweEMwLCAweEYzLCAweDNBLCAweEY1LCAweDkyLCAweDJCLCAweDAyLCAweDAwLCAweDA0LCAweEZDLCAweEMwLCAweEYzLCAweEQwLCAweEYzLCAweEJBLCAweDI2LAorCSAweDIyLCAweDAwLCAweDA2LCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweEEwLCAweDI2LCAweDAyLCAweDAwLCAweDA3LCAweEZDLCAweEMwLCAweEYzLAorCSAweEQ2LCAweEYzLCAweEZFLCAweDI2LCAweDAyLCAweDAwLCAweDBFLCAweEZDLCAweEMwLCAweEYzLCAweDYzLCAweEY1LCAweDA4LCAweDI3LCAweDIyLCAweDAwLAorCSAweEIxLCAweEZDLCAweEMwLCAweEYzLCAweDg4LCAweEY4LCAweDJBLCAweDI4LCAweDAyLCAweDAwLCAweDIwLCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLAorCSAweDJFLCAweDI3LCAweDAyLCAweDAwLCAweDI1LCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDNBLCAweDI3LCAweDAyLCAweDAwLCAweDI2LCAweEZDLAorCSAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDNDLCAweDI3LCAweDAyLCAweDAwLCAweDI3LCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDNFLCAweDI3LAorCSAweDAyLCAweDAwLCAweEIyLCAweEZDLCAweEMwLCAweEYzLCAweEQwLCAweEYzLCAweDRFLCAweDI4LCAweDIyLCAweDAwLCAweEMxLCAweEZDLCAweEMwLCAweEYzLAorCSAweEQ2LCAweEYzLCAweDU2LCAweDJDLCAweDIwLCAweDAwLCAweEIwLCAweEZDLCAweEEwLCAweEYzLCAweDhDLCAweEY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweEM0LCAweEZDLCAweEEwLCAweEYzLCAweDU0LCAweEY2LCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweEM4LCAweEZDLCAweEEwLCAweEYzLCAweDUyLCAweEY2LAorCSAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweEI0LCAweEZDLCAweEEwLCAweEYzLCAweEMwLCAweEY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI2LCAweEZDLAorCSAweEEwLCAweEYzLCAweDZBLCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI3LCAweEZDLCAweEEwLCAweEYzLCAweEFDLCAweEY5LCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweEI4LCAweEZDLCAweEEwLCAweEYzLCAweDAyLCAweEZBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJDLCAweEZDLCAweEEwLCAweEYzLAorCSAweDNCLCAweEZBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJELCAweEZDLCAweEEwLCAweEYzLCAweEMzLCAweEZBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweEJFLCAweEZDLCAweEEwLCAweEYzLCAweEVGLCAweEZBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJGLCAweEZDLCAweEEwLCAweEYzLCAweDNDLCAweEZCLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIzLCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweEEyLCAweDBGLCAweDEwLCAweDAwLCAweEI1LCAweEZDLAorCSAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweEE0LCAweDJDLCAweDAyLCAweDAwLCAweEI5LCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweEE2LCAweDJDLAorCSAweDAyLCAweDAwLCAweDkwLCAweEZELCAweEMwLCAweEYzLCAweEFBLCAweEYzLCAweEFBLCAweDJDLCAweDAyLCAweDAwLCAweDg4LCAweEZDLCAweEMwLCAweEYzLAorCSAweEQ2LCAweEYzLCAweDc4LCAweDJCLCAweDA0LCAweDAwLCAweDg5LCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDdDLCAweDJCLCAweDA0LCAweDAwLAorCSAweEM1LCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDgwLCAweDJCLCAweDA0LCAweDAwLCAweDIzLCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLAorCSAweDM0LCAweDI3LCAweDA0LCAweDAwLCAweDJBLCAweEZDLCAweEMwLCAweEYzLCAweDJDLCAweEY0LCAweEI2LCAweDI2LCAweDAyLCAweDAwLCAweEM3LCAweEZELAorCSAweEMwLCAweEYzLCAweEFBLCAweEYzLCAweEE2LCAweDJCLCAweDBBLCAweDAwLCAweDI5LCAweEZDLCAweDdGLCAweEY0LCAweDQzLCAweEY0LCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweEMyLCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDg2LCAweDJCLCAweDA4LCAweDAwLCAweDMyLCAweEZDLCAweEMwLCAweEYzLAorCSAweEQ2LCAweEYzLCAweDVDLCAweDAxLCAweDAyLCAweDAwLCAweDMzLCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDVFLCAweDAxLCAweDAyLCAweDAwLAorCSAweDM1LCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDhFLCAweDJCLCAweDAyLCAweDAwLCAweEM3LCAweEZDLCAweEMwLCAweEYzLCAweEVCLCAweEY1LAorCSAweDkwLCAweDJCLCAweDAyLCAweDAwLCAweDEwLCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweEE4LCAweDI2LCAweDAyLCAweDAwLCAweDExLCAweEZDLAorCSAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDQ0LCAweDI3LCAweDA2LCAweDAwLCAweDEyLCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDRBLCAweDI3LAorCSAweDA2LCAweDAwLCAweDEzLCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDUwLCAweDI3LCAweDA2LCAweDAwLCAweDE0LCAweEZDLCAweEMwLCAweEYzLAorCSAweEQ2LCAweEYzLCAweDU2LCAweDI3LCAweDA2LCAweDAwLCAweDE1LCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDVDLCAweDI3LCAweDA2LCAweDAwLAorCSAweDE2LCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDYyLCAweDI3LCAweDA2LCAweDAwLCAweDE3LCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLAorCSAweDJBLCAweDI3LCAweDAyLCAweDAwLCAweDgzLCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDZDLCAweDAxLCAweDAyLCAweDAwLCAweDk3LCAweEZDLAorCSAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDZBLCAweDAxLCAweDAyLCAweDAwLCAweDk4LCAweEZDLCAweEQ3LCAweEY1LCAweEM1LCAweEY1LCAweEVDLCAweDAwLAorCSAweDAyLCAweDAwLCAweDk5LCAweEZDLCAweEQ3LCAweEY1LCAweEM1LCAweEY1LCAweEVDLCAweDAyLCAweDAyLCAweDAwLCAweDlBLCAweEZDLCAweEQ3LCAweEY1LAorCSAweEM1LCAweEY1LCAweEVDLCAweDA0LCAweDAyLCAweDAwLCAweDlCLCAweEZDLCAweEQ3LCAweEY1LCAweEM1LCAweEY1LCAweEVDLCAweDA2LCAweDAyLCAweDAwLAorCSAweDlDLCAweEZDLCAweEQ3LCAweEY1LCAweEM1LCAweEY1LCAweEVDLCAweDA4LCAweDAyLCAweDAwLCAweDlELCAweEZDLCAweEQ3LCAweEY1LCAweEM1LCAweEY1LAorCSAweEVDLCAweDBBLCAweDAyLCAweDAwLCAweDE4LCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDJDLCAweDI3LCAweDAyLCAweDAwLCAweDIyLCAweEZDLAorCSAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDMyLCAweDI3LCAweDAyLCAweDAwLCAweDI0LCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDM4LCAweDI3LAorCSAweDAyLCAweDAwLCAweEMwLCAweEZDLCAweEEwLCAweEYzLCAweDUwLCAweEY2LCAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDlFLCAweEZDLCAweEMwLCAweEYzLAorCSAweDgzLCAweEY1LCAweDZFLCAweDAxLCAweDA0LCAweDAwLCAweDlGLCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDNFLCAweDJDLCAweDA0LCAweDAwLAorCSAweEEwLCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDQyLCAweDJDLCAweDA0LCAweDAwLCAweEExLCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLAorCSAweDQ2LCAweDJDLCAweDA0LCAweDAwLCAweEEyLCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDRBLCAweDJDLCAweDA0LCAweDAwLCAweEEzLCAweEZDLAorCSAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDRFLCAweDJDLCAweDA0LCAweDAwLCAweEE0LCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDUyLCAweDJDLAorCSAweDA0LCAweDAwLCAweDIwLCAweEZELCAweEYxLCAweEYzLCAweEFBLCAweEYzLCAweEQ1LCAweEZCLCAweDA4LCAweDAwLCAweDIxLCAweEZELCAweEYxLCAweEYzLAorCSAweEFBLCAweEYzLCAweEQ5LCAweEZCLCAweDBBLCAweDAwLCAweDIyLCAweEZELCAweEYxLCAweEYzLCAweEFBLCAweEYzLCAweERFLCAweEZCLCAweDE2LCAweDAwLAorCSAweDIzLCAweEZELCAweEYxLCAweEYzLCAweEFBLCAweEYzLCAweEU5LCAweEZCLCAweDBBLCAweDAwLCAweDQ1LCAweEZELCAweEMwLCAweEYzLCAweEFBLCAweEYzLAorCSAweENBLCAweDAwLCAweDAyLCAweDAwLCAweDQ3LCAweEZELCAweEMwLCAweEYzLCAweEFBLCAweEYzLCAweDM2LCAweDAxLCAweDAyLCAweDAwLCAweDQ4LCAweEZELAorCSAweEQ0LCAweEY0LCAweEFBLCAweEYzLCAweDVDLCAweDAxLCAweDAyLCAweDAwLCAweDQ5LCAweEZELCAweEQ0LCAweEY0LCAweEFBLCAweEYzLCAweDVFLCAweDAxLAorCSAweDAyLCAweDAwLCAweDRBLCAweEZELCAweEMwLCAweEYzLCAweEFBLCAweEYzLCAweDU2LCAweDAxLCAweDAyLCAweDAwLCAweDRCLCAweEZELCAweEMwLCAweEYzLAorCSAweEFBLCAweEYzLCAweDU4LCAweDAxLCAweDAyLCAweDAwLCAweDRELCAweEZELCAweEYxLCAweEYzLCAweEFBLCAweEYzLCAweEVFLCAweEZCLCAweDA4LCAweDAwLAorCSAweDRGLCAweEZELCAweEU4LCAweEY0LCAweEFBLCAweEYzLCAweDk2LCAweDJCLCAweDAyLCAweDAwLCAweEMyLCAweEZELCAweERFLCAweEY0LCAweEFBLCAweEYzLAorCSAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDQwLCAweEZELCAweEU5LCAweEYzLCAweEFBLCAweEYzLCAweDc4LCAweDAxLCAweDAyLCAweDAwLCAweDI0LCAweEZELAorCSAweDAxLCAweEY1LCAweEFBLCAweEYzLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDkxLCAweEZELCAweEMwLCAweEYzLCAweEFBLCAweEYzLCAweENDLCAweDFFLAorCSAweDAyLCAweDAwLCAweDkzLCAweEZELCAweEMwLCAweEYzLCAweEFBLCAweEYzLCAweEQyLCAweDFFLCAweDAyLCAweDAwLCAweDhGLCAweEZELCAweDBFLCAweEY1LAorCSAweEFBLCAweEYzLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweEMxLCAweEZELCAweDkyLCAweEY2LCAweEFBLCAweEYzLCAweEM4LCAweDAwLCAweDAyLCAweDAwLAorCSAweEM2LCAweEZELCAweEMwLCAweEYzLCAweEFBLCAweEYzLCAweDIwLCAweDMwLCAweDA0LCAweDAwLCAweDI1LCAweEZELCAweEMwLCAweEYzLCAweEFBLCAweEYzLAorCSAweDYyLCAweDAxLCAweDAyLCAweDAwLCAweDg5LCAweEZELCAweDk2LCAweEY0LCAweEFBLCAweEYzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweEZELAorCSAweDBFLCAweEY0LCAweEFBLCAweEYzLCAweDdFLCAweDJDLCAweDI0LCAweDAwLCAweDQ2LCAweEZELCAweEMwLCAweEYzLCAweEFBLCAweEYzLCAweDdBLCAweDAxLAorCSAweDA2LCAweDAwLCAweDg2LCAweEZELCAweEMwLCAweEYzLCAweEFBLCAweEYzLCAweEIwLCAweDI2LCAweDA2LCAweDAwLCAweDg3LCAweEZELCAweEMwLCAweEYzLAorCSAweEFBLCAweEYzLCAweDc2LCAweDJDLCAweDA2LCAweDAwLCAweDhCLCAweEZELCAweDk2LCAweEY5LCAweEFBLCAweEYzLCAweDAwLCAweDAwLCAweDEyLCAweDAwLAorCSAweDhCLCAweEZELCAweDk2LCAweEY5LCAweEFBLCAweEYzLCAweDAwLCAweDAwLCAweDEyLCAweDAwLCAweDhFLCAweEZELCAweEMwLCAweEYzLCAweEFBLCAweEYzLAorCSAweEVFLCAweDE0LCAweDAyLCAweDAwLCAweDgwLCAweEZELCAweEVGLCAweEY0LCAweEFBLCAweEYzLCAweDIyLCAweDAwLCAweDAyLCAweDAwLCAweDgxLCAweEZELAorCSAweEVGLCAweEY0LCAweEFBLCAweEYzLCAweDIyLCAweDAyLCAweDAyLCAweDAwLCAweDgyLCAweEZELCAweEVGLCAweEY0LCAweEFBLCAweEYzLCAweDIyLCAweDA0LAorCSAweDAyLCAweDAwLCAweDgzLCAweEZELCAweEVGLCAweEY0LCAweEFBLCAweEYzLCAweDIyLCAweDA2LCAweDAyLCAweDAwLCAweDg0LCAweEZELCAweEVGLCAweEY0LAorCSAweEFBLCAweEYzLCAweDIyLCAweDA4LCAweDAyLCAweDAwLCAweDg1LCAweEZELCAweEVGLCAweEY0LCAweEFBLCAweEYzLCAweDIyLCAweDBBLCAweDAyLCAweDAwLAorCSAweDAwLCAweEYxLCAweDQ2LCAweDAwLCAweDY0LCAweEYzLCAweEY2LCAweDAwLCAweDAwLCAweDAzLCAweDhFLCAweEY3LCAweDFGLCAweDAwLCAweDM0LCAweDAxLAorCSAweEM4LCAweDAwLCAweDk2LCAweDAxLCAweENDLCAweDAwLCAweEZBLCAweDAwLCAweDc4LCAweDAxLCAweEQyLCAweDI1LCAweDE4LCAweDAxLCAweENDLCAweDFFLAorCSAweEM4LCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDE1LCAweDAwLCAweDAwLCAweDA2LCAweDE3LCAweDEyLCAweDAxLCAweDAzLCAweDAwLCAweEFFLCAweDAwLAorCSAweEVDLCAweDAwLCAweDQ0LCAweDAwLCAweERDLCAweDBGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDFDLCAweDA5LCAweDA4LCAweDI0LCAweDI4LCAweDA2LAorCSAweDBDLCAweDE4LCAweDA4LCAweDMwLCAweDE0LCAweDBDLCAweDA4LCAweDM2LCAweDEwLCAweDEyLCAweEExLCAweEI2LCAweDE0LCAweEI2LCAweDUwLCAweEI3LAorCSAweDU5LCAweEI3LCAweDI1LCAweEI2LCAweENFLCAweEI2LCAweDkzLCAweEI2LCAweDE1LCAweDFDLCAweEQwLCAweDFBLCAweDE1LCAweDFDLCAweDhCLCAweDFCLAorCSAweEVFLCAweDFBLCAweENCLCAweDFBLCAweEQyLCAweDFCLCAweEYxLCAweDFCLCAweDA2LCAweDFDLCAweDQ4LCAweDFDLCAweDc0LCAweDFDLCAweDc0LCAweDFCLAorCSAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LAorCSAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIzLCAweDQ2LCAweDIzLCAweDQ2LCAweDIzLCAweDQ2LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LAorCSAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LAorCSAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFELCAweDQ3LCAweDlBLCAweDQ4LCAweERBLCAweDQ4LCAweDFBLCAweDQ4LCAweDVBLCAweDQ4LAorCSAweDlBLCAweDQ4LCAweERBLCAweDQ4LCAweDFBLCAweDQ4LCAweDVBLCAweDQ4LCAweDlBLCAweDQ4LCAweERBLCAweDQ4LCAweDFBLCAweDQ4LCAweDVBLCAweDQ4LAorCSAweDlBLCAweDQ4LCAweDMzLCAweDQ4LCAweDc4LCAweDQ5LCAweDc4LCAweDQ5LCAweDc5LCAweDQ5LCAweDc5LCAweDQ5LCAweDc5LCAweDQ5LCAweDc5LCAweDQ5LAorCSAweDdBLCAweDQ5LCAweDdBLCAweDQ5LCAweDdBLCAweDQ5LCAweDdBLCAweDQ5LCAweDdCLCAweDQ5LCAweDdCLCAweDQ5LCAweDdCLCAweDQ5LCAweDdDLCAweDQ5LAorCSAweEQ4LCAweDAzLCAweERDLCAweDAzLCAweEUwLCAweDAzLCAweEU0LCAweDAzLCAweEYwLCAweDAzLCAweEY0LCAweDAzLCAweEY4LCAweDAzLCAweDBBLCAweDA0LAorCSAweDBFLCAweDA0LCAweDEyLCAweDA0LCAweDE2LCAweDA0LCAweDBDLCAweDA0LCAweDEwLCAweDA0LCAweDE0LCAweDA0LCAweDE4LCAweDA0LCAweDFDLCAweDA0LAorCSAweDIwLCAweDA0LCAweDI0LCAweDA0LCAweDI4LCAweDA0LCAweDRDLCAweDA0LCAweDUwLCAweDA0LCAweDU0LCAweDA0LCAweDU4LCAweDA0LCAweDVDLCAweDA0LAorCSAweDYwLCAweDA0LCAweDY0LCAweDA0LCAweDY4LCAweDA0LCAweDZDLCAweDA0LCAweDcwLCAweDA0LCAweDc0LCAweDA0LCAweDdELCAweDA0LCAweDgxLCAweDA0LAorCSAweDg1LCAweDA0LCAweDg5LCAweDA0LCAweDhELCAweDA0LCAweDEwLCAweDAwLCAweDhFLCAweDE5LCAweEFDLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDgwLCAweDNDLCAweDBDLCAweDAwLCAweDAwLCAweEZGLCAweDNGLCAweDQ0LCAweDA0LCAweDAwLCAweDAwLCAweEQzLCAweDIyLCAweDQ0LCAweDA0LAorCSAweDlDLCAweDAyLCAweENCLCAweDU0LCAweDQ0LCAweDA0LCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDQ0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAzLAorCSAweDAwLCAweDBDLCAweDcxLCAweDAwLCAweDMwLCAweDUwLCAweDIwLCAweDAwLCAweDgwLCAweEJGLCAweDFGLCAweEE2LCAweDI4LCAweDAwLCAweDBCLCAweDAyLAorCSAweDYwLCAweDg0LCAweDRDLCAweDAwLCAweDAyLCAweDAwLCAweDRCLCAweDFDLCAweDk4LCAweDAwLCAweDAwLCAweDAwLCAweDIwLCAweDBCLCAweDM0LCAweDA0LAorCSAweEZELCAweDM0LCAweDM0LCAweDAwLCAweDM4LCAweDA0LCAweEZELCAweDM0LCAweDM0LCAweDAwLCAweDNDLCAweDA0LCAweDAxLCAweDAwLCAweDEwLCAweDAwLAorCSAweDAwLCAweDA4LCAweDAwLCAweDUyLCAweDE0LCAweDAwLCAweDA0LCAweDA4LCAweDBFLCAweDMyLCAweDAwLCAweEE2LCAweDEwLCAweDA4LCAweEM0LCAweDAzLAorCSAweDUwLCAweDYwLCAweDE4LCAweDA4LCAweEYwLCAweDNGLCAweEZDLCAweDAxLCAweDEwLCAweDBDLCAweDAwLCAweDAwLCAweDgwLCAweDA0LCAweDE0LCAweDBDLAorCSAweDAwLCAweDAwLCAweDAwLCAweDQxLCAweDIwLCAweDBDLCAweEIwLCAweDAwLCAweEIwLCAweEI4LCAweDI0LCAweDBDLCAweDAwLCAweDAwLCAweEFCLCAweDA1LAorCSAweDJDLCAweDBDLCAweDgwLCAweDA1LCAweDAwLCAweEZGLCAweDMwLCAweDBDLCAweDAwLCAweDAwLCAweEIwLCAweDA0LCAweDM0LCAweDBDLCAweDAzLCAweDAwLAorCSAweDAwLCAweEU4LCAweDQ0LCAweDBDLCAweDA0LCAweDAwLCAweEZGLCAweDBGLCAweDAwLCAweDEwLCAweDJFLCAweDAwLCAweDBDLCAweEUzLCAweDQ0LCAweDA0LAorCSAweDAwLCAweDAwLCAweDAxLCAweDA0LCAweDQ0LCAweDA0LCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDQ0LCAweDA0LCAweDAwLCAweDAwLCAweDAxLCAweDAwLAorCSAweDQ0LCAweDA0LCAweDAwLCAweDAwLCAweDAxLCAweDA0LCAweDQ0LCAweDA0LCAweDAwLCAweDAwLCAweDgwLCAweDAzLCAweDQ4LCAweDBDLCAweDAwLCAweDAwLAorCSAweDdGLCAweDAwLCAweDA0LCAweDA0LCAweDA4LCAweDQ4LCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDA4LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDBDLAorCSAweDcxLCAweDAwLCAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDVFLCAweDQwLCAweDAxLCAweDAwLCAweDE4LCAweDAwLCAweDM2LCAweEMwLCAweEU4LCAweDBFLAorCSAweDFDLCAweDAwLCAweDc4LCAweEM4LCAweEE1LCAweDQwLCAweDI0LCAweDAwLCAweDlFLCAweEIwLCAweEI5LCAweDk1LCAweDA4LCAweDA4LCAweDAwLCAweEVBLAorCSAweDQwLCAweDAxLCAweDBDLCAweDA4LCAweDAwLCAweEVBLCAweDAwLCAweDAwLCAweDFDLCAweDA4LCAweDAwLCAweDAwLCAweDQyLCAweDA3LCAweDIwLCAweDA4LAorCSAweDdCLCAweDAwLCAweEQ0LCAweDA5LCAweDJDLCAweDA0LCAweDE0LCAweDAwLCAweDUwLCAweDE0LCAweDMwLCAweDA0LCAweDI4LCAweDBGLCAweDI4LCAweDdGLAorCSAweDE4LCAweDA4LCAweDIwLCAweDAwLCAweEZDLCAweDAxLCAweDA0LCAweDEwLCAweDY5LCAweDAwLCAweEZELCAweEMzLCAweDA4LCAweDEwLCAweDY5LCAweDAwLAorCSAweEZELCAweEMzLCAweDA4LCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDBDLAorCSAweDAwLCAweDAwLCAweDdGLCAweDAwLCAweDA0LCAweDA0LCAweDA4LCAweDQ4LCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDVFLCAweDQ4LCAweDAwLCAweDAwLAorCSAweDA0LCAweDA0LCAweDA4LCAweDQwLCAweDAyLCAweDAwLCAweDAwLCAweDBDLCAweDcxLCAweDAwLCAweDMwLCAweDUwLCAweDAwLCAweDAwLCAweDVFLCAweDQ4LAorCSAweDAxLCAweDAwLCAweDE4LCAweDAwLCAweDNBLCAweEMwLCAweEU4LCAweDA0LCAweDFDLCAweDAwLCAweDc4LCAweEQwLCAweEE1LCAweDQwLCAweDI0LCAweDAwLAorCSAweDlFLCAweEIwLCAweEI5LCAweDg1LCAweDJDLCAweDA0LCAweDE0LCAweDAwLCAweDUwLCAweDE0LCAweDMwLCAweDA0LCAweDI4LCAweDBGLCAweDI4LCAweDdGLAorCSAweDA4LCAweDA4LCAweDAwLCAweEVBLCAweDQwLCAweDAxLCAweDBDLCAweDA4LCAweDAwLCAweEVBLCAweDAwLCAweDAwLCAweDFDLCAweDA4LCAweDAwLCAweDAwLAorCSAweDQyLCAweDA3LCAweDIwLCAweDA4LCAweDdCLCAweDAwLCAweEQ0LCAweDA5LCAweDE4LCAweDA4LCAweEYwLCAweDNGLCAweEZDLCAweDAxLCAweDA0LCAweDEwLAorCSAweDY5LCAweDAwLCAweERELCAweENELCAweDA4LCAweDEwLCAweDY5LCAweDAwLCAweERELCAweENELCAweDA4LCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDQ4LCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDA0LCAweDQwLCAweDAxLCAweDQxLCAweDAxLCAweDBDLCAweDA0LCAweDQwLCAweDA0LAorCSAweDQxLCAweDA0LCAweDEwLCAweDA0LCAweEQ2LCAweDA4LCAweDU2LCAweDBBLCAweDE0LCAweDA0LCAweDQyLCAweDAyLCAweDU2LCAweDBBLCAweDE4LCAweDA0LAorCSAweDU2LCAweDBBLCAweDQwLCAweDAyLCAweDFDLCAweDA0LCAweDQyLCAweDBBLCAweDQyLCAweDJBLCAweDIwLCAweDA0LCAweEMyLCAweDAwLCAweEQ2LCAweDA4LAorCSAweDI0LCAweDA0LCAweEQ2LCAweDA4LCAweEMwLCAweDAwLCAweDI4LCAweDA0LCAweEMyLCAweDA4LCAweEMyLCAweDI4LCAweDA4LCAweDA0LCAweDQwLCAweDAxLAorCSAweDQxLCAweDAxLCAweDBDLCAweDA0LCAweDAwLCAweDAxLCAweDAxLCAweDAxLCAweDEwLCAweDA0LCAweDU2LCAweDBBLCAweDU2LCAweDBBLCAweDE0LCAweDA0LAorCSAweDQyLCAweDAyLCAweDU2LCAweDBBLCAweDE4LCAweDA0LCAweDU2LCAweDBBLCAweDQwLCAweDAyLCAweDFDLCAweDA0LCAweDQyLCAweDBBLCAweDQyLCAweDJBLAorCSAweDIwLCAweDA0LCAweDQyLCAweDAyLCAweDU2LCAweDBBLCAweDI0LCAweDA0LCAweDU2LCAweDBBLCAweDQwLCAweDAyLCAweDI4LCAweDA0LCAweDQyLCAweDBBLAorCSAweDQyLCAweDJBLCAweDA4LCAweDA0LCAweDQwLCAweDAxLCAweDQxLCAweDAxLCAweDBDLCAweDA0LCAweDQwLCAweDA0LCAweDQxLCAweDA0LCAweDEwLCAweDA0LAorCSAweENFLCAweDA4LCAweDRFLCAweDBBLCAweDE0LCAweDA0LCAweDQyLCAweDAyLCAweDRFLCAweDBBLCAweDE4LCAweDA0LCAweDRFLCAweDBBLCAweDQwLCAweDAyLAorCSAweDFDLCAweDA0LCAweDQyLCAweDBBLCAweDQyLCAweDJBLCAweDIwLCAweDA0LCAweEMyLCAweDAwLCAweENFLCAweDA4LCAweDI0LCAweDA0LCAweENFLCAweDA4LAorCSAweEMwLCAweDAwLCAweDI4LCAweDA0LCAweEMyLCAweDA4LCAweEMyLCAweDI4LCAweDA4LCAweDA0LCAweDQwLCAweDAxLCAweDQxLCAweDAxLCAweDBDLCAweDA0LAorCSAweDAwLCAweDAxLCAweDAxLCAweDAxLCAweDEwLCAweDA0LCAweDRFLCAweDBBLCAweDRFLCAweDBBLCAweDE0LCAweDA0LCAweDQyLCAweDAyLCAweDRFLCAweDBBLAorCSAweDE4LCAweDA0LCAweDRFLCAweDBBLCAweDQwLCAweDAyLCAweDFDLCAweDA0LCAweDQyLCAweDBBLCAweDQyLCAweDJBLCAweDIwLCAweDA0LCAweDQyLCAweDAyLAorCSAweDRFLCAweDBBLCAweDI0LCAweDA0LCAweDRFLCAweDBBLCAweDQwLCAweDAyLCAweDI4LCAweDA0LCAweDQyLCAweDBBLCAweDQyLCAweDJBLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAzLCAweDAwLAorCSAweDA1LCAweDAwLCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LAorCSAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LAorCSAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LAorCSAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE3LCAweEEwLCAweDE3LCAweEEwLCAweDE3LAorCSAweEEwLCAweDE4LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LAorCSAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LAorCSAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LAorCSAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LAorCSAweEZGLCAweDA2LCAweDAwLCAweDAwLCAweDY1LCAweDAwLCAweDY1LCAweDAwLCAweDY1LCAweDAwLCAweDY1LCAweDAwLCAweDVELCAweDAwLCAweDUyLCAweDAwLAorCSAweDQ4LCAweDAwLCAweDQwLCAweDAwLCAweDM4LCAweDAwLCAweDMxLCAweDAwLCAweDJDLCAweDAwLCAweDI3LCAweDAwLCAweDIzLCAweDAwLCAweDFGLCAweDAwLAorCSAweDAwLCAweDAwLCAweDY1LCAweDAwLCAweDY1LCAweDAwLCAweDY1LCAweDAwLCAweDY1LCAweDAwLCAweDVELCAweDAwLCAweDUyLCAweDAwLCAweDQ4LCAweDAwLAorCSAweDQwLCAweDAwLCAweDM4LCAweDAwLCAweDMxLCAweDAwLCAweDJDLCAweDAwLCAweDI3LCAweDAwLCAweDIzLCAweDAwLCAweDFGLCAweDAwLCAweDAwLCAweDAwLAorCSAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLAorCSAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBDLCAweDAwLCAweDBDLCAweDAwLCAweDBDLCAweDAwLCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLAorCSAweDE1LCAweDAwLCAweDZFLCAweDZGLCAweDZFLCAweDJELCAweDczLCAweDcwLCAweDY1LCAweDYzLCAweDY5LCAweDY2LCAweDY5LCAweDY1LCAweDY0LCAweDIwLAorCSAweDUzLCAweDUzLCAweDQ5LCAweDQ0LCAweDIwLCAweDIxLCAweDIxLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDAxLCAweDAwLCAweDAwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAwLCAweDA5LCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDY0LCAweDAwLCAweDY0LCAweDAwLCAweDAwLCAweDAwLAorCSAweDQ4LCAweDQ1LCAweDUyLCAweDRELCAweDQ1LCAweDUzLCAweDIwLCAweDMyLCAweDAwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDA0LCAweDAwLCAweDEwLCAweDAwLCAweDAxLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorCSAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDE0LCAweDAwLCAweDAzLCAweDAwLCAweDE1LCAweDAwLCAweDZFLCAweDZGLCAweDZFLCAweDJELCAweDczLCAweDcwLCAweDY1LCAweDYzLCAweDY5LCAweDY2LAorCSAweDY5LCAweDY1LCAweDY0LCAweDIwLCAweDUzLCAweDUzLCAweDQ5LCAweDQ0LCAweDIwLCAweDIxLCAweDIxLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAxLCAweDAwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAwLCAweDA5LCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDY0LCAweDAwLAorCSAweDY0LCAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDQ1LCAweDUyLCAweDRELCAweDQ1LCAweDUzLCAweDIwLCAweDMyLCAweDAwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDA0LCAweDAwLAorCSAweDEwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ2LCAweDY5LCAweDcyLCAweDczLCAweDc0LCAweDIwLCAweDU3LCAweDYxLAorCSAweDc2LCAweDY1LCAweDRDLCAweDQxLCAweDRFLCAweDIwLCAweDQ5LCAweDQ5LCAweDIwLCAweDUzLCAweDUzLCAweDQ5LCAweDQ0LCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAwLCAweDAwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweEZGLCAweDBGLCAweEYwLCAweDBGLCAweDBGLCAweDAwLCAweDUwLCAweDAxLCAweDAyLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE5LCAweDAwLCAweDE0LCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDMwLCAweDAwLCAweEZGLCAweDAwLCAweDA5LCAweDAwLCAweDA5LCAweDAwLCAweDA5LCAweDAwLCAweDA5LCAweDAwLAorCSAweDBBLCAweDAwLCAweDBBLCAweDAwLCAweDBCLCAweDAwLCAweDBCLCAweDAwLCAweDE0LCAweDAwLCAweDE0LCAweDAwLCAweDE0LCAweDAwLCAweDBBLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAyLCAweDAxLCAweDAyLCAweDA0LCAweDBCLCAweDE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAxLCAweDgyLCAweDg0LAorCSAweDhCLCAweDk2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDAxLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDIwLCAweDAwLCAweDFCLCAweDAwLCAweDE3LCAweDAwLCAweDExLCAweDAwLCAweDEwLCAweDAwLCAweDBCLCAweDAwLAorCSAweDBCLCAweDAwLCAweDA5LCAweDAwLCAweDE3LCAweDAwLCAweDE0LCAweDAwLCAweDEwLCAweDAwLCAweDBELCAweDAwLCAweDBCLCAweDAwLCAweDA5LCAweDAwLAorCSAweDA4LCAweDAwLCAweDA3LCAweDAwLCAweDBELCAweDAwLCAweDBBLCAweDAwLCAweDA5LCAweDAwLCAweDA4LCAweDAwLCAweDA1LCAweDAwLCAweDA1LCAweDAwLAorCSAweEQ4LCAweDBDLCAweEMwLCAweDA4LCAweDkwLCAweDBELCAweDYwLCAweDA5LCAweDQ4LCAweDBFLCAweDMwLCAweDBBLCAweDI0LCAweDBGLCAweDE4LCAweDBCLAorCSAweDBCLCAweDZFLCAweDBCLCAweDM3LCAweDAyLCAweDE0LCAweDAxLCAweDBBLCAweEZGLCAweDBGLCAweEYwLCAweDBGLCAweEZGLCAweDBGLCAweEYwLCAweDBGLAorCSAweEZGLCAweDBGLCAweEYwLCAweDBGLCAweEZGLCAweDBGLCAweEYwLCAweDBGLCAweEZGLCAweDBGLCAweEYwLCAweDBGLCAweEZGLCAweDBGLCAweEYwLCAweDBGLAorCSAweDA0LCAweDAwLCAweDA0LCAweDAwLCAweDA0LCAweDAwLCAweDAzLCAweDAwLCAweDA3LCAweDAwLCAweDA3LCAweDAwLCAweDA3LCAweDAwLCAweDA3LCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweERELCAweDAwLCAweDUwLCAweEYyLCAweDAxLCAweDAxLCAweDAwLAorCSAweDAwLCAweDUwLCAweEYyLCAweDA1LCAweDAyLCAweDAwLCAweDAwLCAweDUwLCAweEYyLCAweDAyLCAweDAwLCAweDUwLCAweEYyLCAweDA0LCAweDAyLCAweDAwLAorCSAweDAwLCAweDUwLCAweEYyLCAweDAwLCAweDAwLCAweDUwLCAweEYyLCAweDAxLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDA0LCAweDAwLCAweDE1LCAweDAwLCAweDAyLCAweDAwLAorCSAweDEwLCAweDAwLCAweDEwLCAweDAwLCAweDEwLCAweDAwLCAweDA0LCAweDAwLCAweDEwLCAweDAwLCAweDAyLCAweDAwLCAweDA0LCAweDAwLCAweDA0LCAweDAwLAorCSAweDE1LCAweDAwLCAweDIwLCAweDAwLCAweDExLCAweDAwLCAweDIwLCAweDAwLCAweDE2LCAweDI2LCAweEUyLCAweDJCLCAweEVBLCAweDJELCAweEM0LCAweDJELAorCSAweEVFLCAweDJELCAweDdFLCAweDJDLCAweDFFLCAweDJFLCAweDIyLCAweDJFLCAweEZGLCAweEZGLCAweDJDLCAweDJFLCAweDAwLCAweDAwLCAweDRFLCAweDI4LAorCSAweEQ4LCAweDJCLCAweDIyLCAweDJFLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDE2LCAweDI2LCAweEUyLCAweDJCLCAweEVBLCAweDJELCAweEZGLCAweEZGLAorCSAweEVFLCAweDJELCAweDdFLCAweDJDLCAweDFFLCAweDJFLCAweDIyLCAweDJFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEZGLCAweEZGLCAweDJDLCAweDJFLCAweDAwLCAweDAwLCAweEUyLCAweDJCLCAweDM0LCAweDJFLCAweDIyLCAweDJFLCAweDAwLCAweDAwLCAweDAwLCAweDA1LAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAzLCAweDAzLCAweDAwLCAweDA2LCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDJBLCAweDAwLCAweDAwLCAweDA4LCAweDMyLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDgwLCAweDAwLCAweDYwLCAweDFELCAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDgxLAorCSAweDAwLCAweDYwLCAweDFELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorCSAweDAwLCAweDAwLCAweERELCAweDAwLCAweEZGLCAweEZGLCAweDk3LCAweERBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDE5LCAweDBBLCAweDA5LCAweDQ2LCAweDFDLCAweDYwLCAweDE4LCAweDAwLCAweDE5LCAweDFELCAweDA5LCAweDQyLAorCSAweDFDLCAweDYwLAorCit9OyAgLyogZndfaW1hZ2VfMl9kYXRhICovCisKK3N0YXRpYyBjb25zdCBoY2ZfOCBmd19pbWFnZV8zX2RhdGFbXSA9IHsKKwkgMHgwMCwgMHg2MCwgMHg0NiwgMHg3NCwgMHhDRCwgMHhFMiwgMHgwNCwgMHhFMSwgMHgwMiwgMHg2MCwgMHgwMCwgMHhFMSwgMHg4MiwgMHhGMywgMHgyMSwgMHg2MCwKKwkgMHhDRSwgMHg2MSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQiwgMHgwMiwgMHgwMCwgMHgyMSwgMHg2MCwgMHg1NiwgMHg2MSwgMHgwRiwgMHg2MCwgMHhFOCwgMHg2NCwKKwkgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOSwgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOSwgMHgzRiwgMHg0NCwgMHg0MCwgMHgyNiwgMHgwNSwgMHgwMCwgMHgxOCwgMHg2MCwKKwkgMHgyMiwgMHhGMywgMHg1QSwgMHhEMSwgMHhBMCwgMHg1MCwgMHhBNCwgMHg1MCwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyQiwgMHgwMywgMHgwMCwgMHgxOCwgMHg2MCwKKwkgMHg3NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgyOSwgMHhGRSwgMHgwMSwgMHhDNCwgMHhFMiwgMHg0MywgMHg2NCwgMHgzQSwgMHhEQiwgMHg4MiwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgzRiwgMHg0NCwgMHhGRiwgMHgwMSwgMHgzRiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgwNSwgMHgwMCwgMHgxOCwgMHg2MCwKKwkgMHgyMCwgMHhGMywgMHg1QSwgMHhEMSwgMHhBMCwgMHg1MCwgMHhBNCwgMHg1MiwgMHhDNCwgMHhFMiwgMHgwMCwgMHg2MywgMHg4MSwgMHhGRCwgMHgzMiwgMHg3QiwKKwkgMHg0RCwgMHhFMiwgMHhCRiwgMHhGRSwgMHhDNCwgMHhFMiwgMHg0MSwgMHhGRiwgMHhFMCwgMHhGRSwgMHhFMSwgMHhGRSwgMHhFMiwgMHhGRSwgMHg0MywgMHhGRiwKKwkgMHg0NCwgMHhGRiwgMHg0NiwgMHhGRiwgMHg4MywgMHhGMywgMHg2MiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwNSwgMHgzNiwgMHgyRCwgMHhGRiwgMHgwNywgMHgzNiwKKwkgMHhENSwgMHhGRSwgMHgwOCwgMHhFMSwgMHg4OCwgMHg2MCwgMHg4NSwgMHg3MSwgMHg4RCwgMHhFMiwgMHhBMywgMHg2MCwgMHgzMCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2MCwgMHgxMCwgMHg2MiwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhCNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MSwgMHhBOSwgMHg5QywKKwkgMHg2MCwgMHg0NSwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg4OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4MiwgMHhGMSwgMHgwOSwgMHg2MCwgMHhCNCwgMHg2MSwKKwkgMHg2NCwgMHg0NCwgMHgwMSwgMHgyNywgMHgyNCwgMHgwMCwgMHg2MCwgMHg0MCwgMHgwRSwgMHgzQSwgMHgwRCwgMHgwMCwgMHgwMSwgMHg3QywgMHgxMCwgMHg2MCwKKwkgMHhGMiwgMHhGOSwgMHg0NCwgMHg2MCwgMHgwOCwgMHg3QywgMHgxMCwgMHg2MCwgMHhDNCwgMHhGOSwgMHgxMiwgMHg2MCwgMHhFNSwgMHhGMSwgMHgwMiwgMHg2MCwKKwkgMHhCMCwgMHg2MSwgMHhCMSwgMHg5QywgMHgyNiwgMHgwMCwgMHgwMCwgMHg3QywgMHgxMCwgMHg2MCwgMHhGMiwgMHhGOSwgMHg0MCwgMHg2MCwgMHgwOCwgMHg3QywKKwkgMHgxMCwgMHg2MCwgMHhDNCwgMHhGOSwgMHgxMiwgMHg2MCwgMHhFNSwgMHhGMSwgMHgwMiwgMHg2MCwgMHg5MCwgMHg2MSwgMHhCMSwgMHg5QywgMHgwOSwgMHg2MCwKKwkgMHg2NywgMHg2NSwgMHhGRiwgMHhCNCwgMHhDNCwgMHg4NSwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4MSwgMHgxMiwgMHgwMCwgMHhGRiwgMHhCNCwKKwkgMHhFRCwgMHhBMCwgMHgyNSwgMHg2MCwgMHhDQywgMHg2MSwgMHgwNCwgMHgwNCwgMHhFMiwgMHhBMCwgMHhEOSwgMHg4MSwgMHgwMSwgMHgwNCwgMHhEOSwgMHg4MSwKKwkgMHhBMSwgMHhEMSwgMHgwMiwgMHg2MCwgMHg1MCwgMHg2MSwgMHgxRiwgMHg2MCwgMHhGNiwgMHg2NSwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHhCMSwgMHg5QywKKwkgMHhDOCwgMHg4MSwgMHg2MSwgMHg0NywgMHgwMCwgMHg3RSwgMHhFOSwgMHg4MSwgMHgwNywgMHg2MCwgMHhGMCwgMHg2NSwgMHhBNSwgMHg4MSwgMHgwQiwgMHhCOSwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NSwgMHhCNSwgMHg4NSwgMHgwNCwgMHg2MCwgMHg0NCwgMHg2MiwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHg4OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4MiwgMHhGMywgMHhDOCwgMHg2MSwgMHg2MSwgMHg1NCwgMHhDRCwgMHhFMiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywKKwkgMHgyRSwgMHgwMCwgMHhDQywgMHg4NCwgMHhFMCwgMHg4NSwgMHgxNSwgMHg2MCwgMHhBMiwgMHhFNywgMHgxRiwgMHg2MCwgMHg4NiwgMHg2NCwgMHgxQSwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHg3RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwgMHhBMiwgMHg2NCwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RiwgMHg3RCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwgMHhCRSwgMHg2NCwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RiwgMHg3RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwKKwkgMHhEQSwgMHg2NCwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RiwgMHg3RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg3NSwgMHg2NCwgMHgwNiwgMHg2MSwgMHg2MSwgMHg0OCwKKwkgMHg2MCwgMHg0NCwgMHg4MCwgMHhCQywgMHhGRiwgMHhCNCwgMHg2MCwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgyMSwgMHg2MCwKKwkgMHhFQywgMHg3QywgMHgwNywgMHg2MCwgMHhFOSwgMHhGOSwgMHgyMSwgMHg2MCwgMHg3NCwgMHg2MywgMHgxNCwgMHg2MSwgMHgyMSwgMHgwMCwgMHgxMSwgMHg2MCwKKwkgMHg2MiwgMHhGMSwgMHhGRiwgMHhCNCwgMHhFRCwgMHhBMCwgMHg2NCwgMHg0MSwgMHgwNCwgMHgwNCwgMHhFMiwgMHhBMCwgMHhEOSwgMHg4MSwgMHgwMSwgMHgwNCwKKwkgMHhEOSwgMHg4MSwgMHhBMSwgMHhEMSwgMHgxMCwgMHg2MCwgMHg5MSwgMHhGMywgMHg2NCwgMHg0MSwgMHhGRiwgMHhCMSwgMHhGRiwgMHg2MCwgMHgwMCwgMHg2NSwKKwkgMHhBNCwgMHg4NCwgMHgzNCwgMHg5NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHg2NCwgMHg0MSwgMHhBNSwgMHg4MSwgMHhGRiwgMHhCNCwgMHgzNCwgMHg5NCwKKwkgMHhBMiwgMHhEQiwgMHgyMiwgMHg2MCwgMHg1OCwgMHg3QywgMHgwNywgMHg2MCwgMHhFOSwgMHhGOSwgMHgyMSwgMHg2MCwgMHgwMiwgMHg2MywgMHgxMywgMHg2MSwKKwkgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5QywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHg2MCwgMHhFOSwgMHhGMywgMHgzMSwgMHg0MCwgMHg4MCwgMHgyNiwKKwkgMHgzNiwgMHhBNCwgMHgwNywgMHg2MCwgMHhFOSwgMHhGQiwgMHg2MCwgMHg0MywgMHgwOSwgMHg2MSwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5QywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg4MiwgMHhGMywgMHgyMiwgMHg2MCwgMHhDNCwgMHg2MSwgMHgwMCwgMHg3QywgMHg3RSwgMHg2MywgMHg1OSwgMHhEOSwgMHhGRSwgMHgxRiwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHgwMywgMHgwMCwgMHgyMywgMHg2MCwgMHg0NiwgMHg2NSwgMHgxNSwgMHgwMCwgMHhGRiwgMHhCNCwgMHhGOSwgMHhBMCwKKwkgMHgyMywgMHg2MCwgMHg2OCwgMHg2NSwgMHgwMSwgMHg3QywgMHgwRCwgMHgwNCwgMHhFRCwgMHhBMCwgMHgyMywgMHg2MCwgMHg4QSwgMHg2NSwgMHgxMSwgMHg3QywKKwkgMHgwOCwgMHgwNCwgMHhFMiwgMHhBMCwgMHgyMywgMHg2MCwgMHhBQywgMHg2NSwgMHgyMSwgMHg3QywgMHgwMywgMHgwNCwgMHgyMywgMHg2MCwgMHhDRSwgMHg2NSwKKwkgMHgzMSwgMHg3QywgMHg2NCwgMHg1RiwgMHg2NCwgMHhGQiwgMHhBNSwgMHhEMywgMHhEQSwgMHg4NSwgMHhGMCwgMHhBMCwgMHgyMiwgMHg2MCwgMHhDNCwgMHg2MSwKKwkgMHgwOCwgMHgwNiwgMHg0MCwgMHg1NCwgMHg1OCwgMHg1MywgMHgwOCwgMHhGRiwgMHhBMiwgMHg2MCwgMHhFNywgMHg2NCwgMHg0MywgMHhGQiwgMHgwOCwgMHhGRiwKKwkgMHhGRiwgMHgwMSwgMHg2MCwgMHg0MywgMHg2MCwgMHg0NiwgMHhBNSwgMHhEMSwgMHhEQSwgMHg4NSwgMHhBNSwgMHhEMywgMHhEQSwgMHg4NSwgMHg1OSwgMHhEOSwKKwkgMHg1OSwgMHhEQiwgMHg1OSwgMHhEOSwgMHg1OSwgMHhEQiwgMHhGQiwgMHgxRiwgMHgwQywgMHg2MywgMHhBNSwgMHhEMSwgMHhEQSwgMHg4NSwgMHhBNSwgMHhEMywKKwkgMHhEQSwgMHg4NSwgMHg1OSwgMHhEOSwgMHg1OSwgMHhEQiwgMHg1OSwgMHhEOSwgMHg1OSwgMHhEQiwgMHhGNywgMHgxRiwgMHg2NiwgMHg0NCwgMHgwRSwgMHg2MywKKwkgMHg1MywgMHg5MywgMHg2MCwgMHg0MCwgMHgxMCwgMHgzNiwgMHgwNywgMHgwMCwgMHg2NSwgMHg0NCwgMHg0OCwgMHhEMywgMHg1OSwgMHhEOSwgMHg1OSwgMHhEQiwKKwkgMHg1OSwgMHhEOSwgMHg1OSwgMHhEQiwgMHhGQiwgMHgxRiwgMHgxMiwgMHg2MCwgMHhCQywgMHhGMSwgMHg2NCwgMHhGMywgMHg2NCwgMHg0MywgMHhEQiwgMHg4MSwKKwkgMHgyNSwgMHg2MCwgMHg1QSwgMHg2NSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNywgMHgxMiwgMHgwMCwgMHgxMSwgMHgzNywgMHgxNywgMHgwMCwgMHgyMSwgMHgzNywKKwkgMHgxRCwgMHgwMCwgMHgzMSwgMHgzNywgMHgyMiwgMHgwMCwgMHhBMywgMHhEMSwgMHgxMiwgMHg2MCwgMHhCNywgMHhGNSwgMHg2NCwgMHg0NCwgMHhGRiwgMHhCNCwKKwkgMHgxMiwgMHg2MCwgMHhCNiwgMHhGQiwgMHg2NCwgMHg0NywgMHhGRiwgMHhCNCwgMHgxMiwgMHg2MCwgMHhBRCwgMHhGMSwgMHgxRCwgMHgwMCwgMHhBMSwgMHhEMywKKwkgMHgxMiwgMHg2MCwgMHhCOCwgMHhGNSwgMHhGRiwgMHhCNCwgMHgxMiwgMHg2MCwgMHhBRSwgMHhGMSwgMHgxNiwgMHgwMCwgMHhBMSwgMHhEMywgMHgxMiwgMHg2MCwKKwkgMHhCOSwgMHhGNSwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwgMHgxMiwgMHg2MCwgMHhBRiwgMHhGMSwgMHgwRSwgMHgwMCwgMHg1OSwgMHhEMywgMHgxMiwgMHg2MCwKKwkgMHhCQSwgMHhGNSwgMHhGRiwgMHhCNCwgMHgxMiwgMHg2MCwgMHhCMCwgMHhGMSwgMHgwNywgMHgwMCwgMHg1OSwgMHhEMywgMHgxMiwgMHg2MCwgMHhCQiwgMHhGNSwKKwkgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwgMHgxMiwgMHg2MCwgMHhCMSwgMHhGMSwgMHgxMiwgMHg2MCwgMHhCNSwgMHhGQiwgMHgxMiwgMHg2MCwgMHhCMiwgMHhGOSwKKwkgMHg2NiwgMHg0MiwgMHhGQywgMHhBMiwgMHhBMiwgMHhEMywgMHgyNCwgMHg2MCwgMHg0OCwgMHg2MywgMHhDQywgMHg4NCwgMHhFOCwgMHg4NCwgMHhDQywgMHg4MSwKKwkgMHg2MywgMHg0NSwgMHhBNiwgMHhEMywgMHhEQSwgMHg4MiwgMHhGRiwgMHhCNCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHg2MCwgMHg0MCwgMHg4MCwgMHgyQiwKKwkgMHgwMywgMHgwMCwgMHhEQSwgMHg4NiwgMHhDRCwgMHg4MSwgMHhGNSwgMHgwMSwgMHgwMCwgMHhCOSwgMHhBNiwgMHhEMywgMHgwQiwgMHgwMywgMHg1QSwgMHhEMSwKKwkgMHhEQSwgMHg4NiwgMHhGRiwgMHhCNCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NCwgMHg1QywgMHg5MCwgMHhCRCwgMHhEOSwgMHhGRCwgMHgwMiwgMHhDRCwgMHg4MSwKKwkgMHg2NiwgMHg0MiwgMHhGMiwgMHgwMiwgMHg1QSwgMHhEMywgMHgyNCwgMHg2MCwgMHg4NiwgMHg2NSwgMHhENywgMHg4MCwgMHhCRCwgMHhEQiwgMHhGRCwgMHgwMiwKKwkgMHg2NCwgMHhGMywgMHgxNSwgMHg2MCwgMHhERCwgMHhGMSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHgwOSwgMHgwMCwgMHg2NCwgMHg0MCwgMHgxMCwgMHgyNiwKKwkgMHgwNiwgMHgwMCwgMHgxMywgMHg2NCwgMHhBRCwgMHhGQiwgMHgwMSwgMHg2MCwgMHg2NywgMHg2NCwgMHgzNywgMHhGQiwgMHgwOSwgMHgwMCwgMHgwOCwgMHg2NCwKKwkgMHhBRCwgMHhGQiwgMHg4MiwgMHhGMywgMHgwMSwgMHg2MCwgMHg2NywgMHg3QywgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHg1QiwgMHg3QywgMHgzNywgMHhGOSwKKwkgMHgxMywgMHg2MCwgMHg1QiwgMHhGMSwgMHg2NCwgMHhGMywgMHgxNSwgMHg2MCwgMHhEMiwgMHhGOSwgMHgxNSwgMHg2MCwgMHhENiwgMHhGOSwgMHg2MCwgMHg0MCwKKwkgMHgwMSwgMHgyNywgMHgwQSwgMHgwMCwgMHhGRiwgMHhCNSwgMHgxMCwgMHg2MCwgMHhBOCwgMHg2MywgMHg2NSwgMHg0MSwgMHhDRCwgMHg4MSwgMHgwNiwgMHhBMywKKwkgMHhGRCwgMHgwMiwgMHhGQSwgMHhBMywgMHhBMywgMHhEMywgMHgwRiwgMHgwMCwgMHgwMSwgMHg2MCwgMHhGRiwgMHg2NSwgMHhBNCwgMHg4NCwgMHgxMSwgMHg2MCwKKwkgMHgxNCwgMHg2MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHgwOCwgMHhBMSwgMHhGQiwgMHgwMiwgMHhGQywgMHhBMSwgMHhBMSwgMHhEMywKKwkgMHgxNSwgMHg2MCwgMHhEMiwgMHhGMSwgMHhGRiwgMHhCNCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwNywgMHgxNSwgMHg2MCwgMHhEMiwgMHhGQiwKKwkgMHgxNSwgMHg2MCwgMHhENiwgMHhGQiwgMHgyNSwgMHg2MCwgMHg3QSwgMHg2MywgMHgyNCwgMHg2MCwgMHgwOCwgMHg2NSwgMHgxMiwgMHg2MCwgMHhCNiwgMHhGMSwKKwkgMHgyMywgMHg2MCwgMHhGMCwgMHg2MSwgMHgyNSwgMHg2MCwgMHg2OCwgMHg2NCwgMHg0MCwgMHg0RiwgMHgwNCwgMHg2NCwgMHhDMywgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHgyNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg2MCwgMHg4MiwgMHg2MywgMHgxMiwgMHg2MCwgMHhCNSwgMHhGMSwgMHgyNCwgMHg2MCwgMHg0OCwgMHg2NSwKKwkgMHgyNSwgMHg2MCwgMHg2NiwgMHg2NCwgMHg0MCwgMHg0RiwgMHgwOCwgMHg2NCwgMHhDMywgMHg2MCwgMHg1OCwgMHg0RCwgMHgyNSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHhGMywgMHgwOCwgMHg3QywgMHgzOCwgMHhGOSwgMHgyNCwgMHg2MCwgMHhFMCwgMHg2MSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQiwgMHgwRSwgMHgwMCwKKwkgMHgwMSwgMHgzNywgMHgwNiwgMHgwMCwgMHgxMSwgMHgzNywgMHgwMywgMHgwMCwgMHgyMSwgMHgzQiwgMHgxRSwgMHhBMSwgMHgxRSwgMHhBMSwgMHgxRSwgMHhBMSwKKwkgMHgxQywgMHg2MywgMHgyNCwgMHg2MCwgMHhDMiwgMHg2NCwgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOSwgMHhGRCwgMHgxRiwgMHgxMiwgMHg2MCwgMHhCMiwgMHhGMywKKwkgMHgwMCwgMHg3QywgMHg2MCwgMHg0NSwgMHg3MCwgMHg2MiwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg4OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgyOSwKKwkgMHhGRSwgMHgwMSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2MiwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhCNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2MSwKKwkgMHhCMSwgMHg5QywgMHg2MCwgMHg0NSwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg4OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxOCwgMHg2MCwgMHg1MCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg0NCwgMHhEMywgMHg4MCwgMHg3QywgMHg2MCwgMHg0OCwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhCMCwgMHg4QSwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhENSwgMHg2MCwgMHg4NCwgMHhFNywgMHg2MiwgMHg0NywgMHg4MCwgMHhCRiwKKwkgMHg2MCwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg2NCwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwKKwkgMHg2NSwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg5NSwgMHg2MCwgMHg4NCwgMHhFNywgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg3QywgMHhCRCwgMHhEMywgMHhENSwgMHg2MCwgMHg4NCwgMHhFNywgMHg2MCwgMHg0NywgMHg4MCwgMHhCRiwgMHg2MCwgMHg0QSwgMHhCRCwgMHhEMywKKwkgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg5MCwgMHg4QSwgMHhCRCwgMHhEMywgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg5MCwgMHg4QSwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHhDRCwgMHg4MSwgMHg5NSwgMHg2MCwgMHg4NCwgMHhFNywgMHhFQiwgMHgwMiwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHhENSwgMHg2MCwgMHg4NCwgMHhFNywgMHg2MiwgMHg0QSwgMHgwMiwgMHg2NCwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHhDQywgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHhGRCwgMHgwMiwgMHg3QywgMHg0OSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg2OCwgMHg1QywgMHg3QywgMHg0OSwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg2OCwgMHg0NCwgMHg5NSwgMHg2MCwgMHg4NCwgMHhFNywgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg0MiwgMHhGRiwKKwkgMHg0MCwgMHhGRiwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyNywgMHgzMywgMHgwMCwgMHg0MywgMHg0NSwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwKKwkgMHgzRiwgMHg0MCwgMHgwMiwgMHgyNywgMHgxQiwgMHgwMCwgMHg2MCwgMHhCQywgMHg0MCwgMHg0MCwgMHhERCwgMHhGRSwgMHgxOCwgMHg2MCwgMHgwNywgMHhGMSwKKwkgMHhBRCwgMHg0RiwgMHgwMCwgMHg3RiwgMHhGQSwgMHhCNCwgMHg2NCwgMHg0MSwgMHg2NCwgMHhGMSwgMHgwMiwgMHhCMSwgMHgwNCwgMHg2NSwgMHgwMiwgMHgwMiwKKwkgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQiwgMHgwMSwgMHg2NSwgMHhCNCwgMHg4NCwgMHhBMCwgMHg1RCwgMHgwMCwgMHhFRSwgMHgxOSwgMHg2MSwgMHhDRCwgMHg4MSwKKwkgMHhGRiwgMHhGRiwgMHhGRCwgMHgwMiwgMHg0MywgMHg0NSwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyNywgMHgxMSwgMHgwMCwgMHhBRSwgMHg0RiwgMHhGRCwgMHhCNCwKKwkgMHgwNCwgMHhCQywgMHhBMCwgMHg1RSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg3MSwgMHg4RCwgMHhFMiwgMHg0MCwgMHhFMSwgMHhBMSwgMHhGRiwgMHgwNCwgMHhBQywKKwkgMHhBMCwgMHg1RSwgMHgwRiwgMHg2MCwgMHhBMCwgMHg3MSwgMHg4RCwgMHhFMiwgMHhBMSwgMHhGRiwgMHhERCwgMHhGRSwgMHgxRSwgMHgwMCwgMHg0MywgMHg0NSwKKwkgMHgyMCwgMHg0NCwgMHg2MCwgMHhCQywgMHg0MCwgMHg0MCwgMHhBRSwgMHg0RiwgMHhGRCwgMHhCNCwgMHgwNCwgMHhCQywgMHhBMCwgMHg1RSwgMHhERCwgMHhGRSwKKwkgMHgwMCwgMHg2MCwgMHgwMiwgMHg3MSwgMHg4RCwgMHhFMiwgMHg0MCwgMHhFMSwgMHhBMSwgMHhGRiwgMHgwNCwgMHhBQywgMHhBMCwgMHg1RSwgMHgwMCwgMHg2MCwKKwkgMHhDOCwgMHg3MSwgMHg4RCwgMHhFMiwgMHhBMSwgMHhGRiwgMHgwQywgMHg2MCwgMHgwMCwgMHg2MiwgMHgwMCwgMHg2MCwgMHg3MSwgMHg3QywgMHgxMCwgMHg2MCwKKwkgMHgwMCwgMHg2NSwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg4OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg2MCwgMHgzQywgMHg2MywgMHgxRSwgMHg2MSwKKwkgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5QywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgxNCwgMHg3MSwgMHg4RCwgMHhFMiwgMHhBMSwgMHhGRiwKKwkgMHgzMSwgMHg0NCwgMHg0MCwgMHgyNiwgMHgwMiwgMHgwMCwgMHg4MCwgMHgyNiwgMHgxNywgMHgwMCwgMHgyMSwgMHg2MCwgMHhFQywgMHg2MywgMHgwNywgMHg2MCwKKwkgMHhFOSwgMHhGRCwgMHgwOSwgMHg2MSwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5QywgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMSwgMHg0NCwgMHg0MCwgMHgyQSwKKwkgMHgxNCwgMHgwMCwgMHgzMSwgMHg0NCwgMHg3RiwgMHhCNCwgMHg0MCwgMHg1MSwgMHhBRSwgMHg0QywgMHgxMCwgMHgyNiwgMHgwRSwgMHgwMCwgMHgwNywgMHg2MCwKKwkgMHhFQSwgMHhGQiwgMHgzMSwgMHg0NCwgMHg4MCwgMHhCQywgMHg0MCwgMHg1MSwgMHgyMiwgMHg2MCwgMHgyMiwgMHg2MywgMHgwNywgMHg2MCwgMHhFOSwgMHhGRCwKKwkgMHgwOSwgMHg2MSwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5QywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg2MCwgMHhGMCwgMHg2MywgMHgwMywgMHg2MSwKKwkgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5QywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2MiwgMHgxOSwgMHg2MCwgMHg4RiwgMHg3QywKKwkgMHgwMCwgMHg2MCwgMHhBQywgMHg2NSwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg4OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4MCwgMHhFMSwgMHhCRiwgMHhGRSwKKwkgMHhBMSwgMHg0RiwgMHg3MCwgMHhCNCwgMHg1MCwgMHgzNiwgMHhBRiwgMHgwMCwgMHgyMCwgMHgzNiwgMHgwMywgMHgwMCwgMHgxOCwgMHg2MCwgMHgyNCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHg2MCwgMHgxQSwgMHhFMSwgMHhERiwgMHhGRSwgMHgxOSwgMHhGRiwgMHgwMCwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgzRiwgMHg0MCwgMHgyMCwgMHgyQiwgMHhBMSwgMHgwMCwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgzOCwgMHg2OSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg2OCwgMHg0NCwgMHgwMSwgMHgyQSwgMHg5OSwgMHgwMCwgMHgxMywgMHg2MCwgMHgwOSwgMHhGMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHgwMCwgMHgzNiwKKwkgMHgwMCwgMHgzQiwgMHhBMiwgMHhEQiwgMHg2NCwgMHhGMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg5QywgMHg0NywgMHgwMCwgMHg0MywgMHg0NSwKKwkgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwgMHgxOCwgMHg2MCwgMHgyMiwgMHhGMywgMHgzRiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgwMSwgMHgwMCwKKwkgMHhBMCwgMHg1MCwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyQiwgMHgyOSwgMHgwMCwgMHhBRSwgMHg0RiwgMHhGRCwgMHhCNCwgMHhBMCwgMHg1RSwgMHhERCwgMHhGRSwKKwkgMHhBQywgMHg0RiwgMHgxMCwgMHhCQywgMHhBMCwgMHg1QywgMHhGRiwgMHhGRiwgMHgxMCwgMHhBQywgMHhBMCwgMHg1QywgMHgwMCwgMHg2MCwgMHhDOCwgMHg3MSwKKwkgMHg4RCwgMHhFMiwgMHg0MCwgMHhFMSwgMHg0MCwgMHgyOSwgMHhGRSwgMHgwMSwgMHgwQywgMHg2MCwgMHgwMCwgMHg2MiwgMHgwMCwgMHg2MCwgMHg3MSwgMHg3QywKKwkgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg4OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHhDOCwgMHg3MSwKKwkgMHg4RCwgMHhFMiwgMHg0MCwgMHhFMSwgMHg0MCwgMHgyOSwgMHhGRSwgMHgwMSwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHg2NCwgMHhGMSwgMHg4MiwgMHhGOSwKKwkgMHgwNSwgMHg3QywgMHg4MywgMHhGOSwgMHhERiwgMHhGRSwgMHgxOSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxOCwgMHg2MCwgMHgwNywgMHhGMSwgMHhBRCwgMHg0RiwKKwkgMHgwMCwgMHg3RiwgMHhGQSwgMHhCNCwgMHg2NCwgMHg0MSwgMHg2NCwgMHhGMSwgMHgwMiwgMHhCMSwgMHgwNCwgMHg2NSwgMHgwMiwgMHgwMiwgMHg2NCwgMHg0MCwKKwkgMHgwMSwgMHgyQiwgMHgwMSwgMHg2NSwgMHhCNCwgMHg4NCwgMHhBMCwgMHg1RCwgMHhCRiwgMHhGRSwgMHg0NSwgMHgwMCwgMHgxOCwgMHg2MCwgMHgwNywgMHhGMSwKKwkgMHhBRCwgMHg0RiwgMHgwMCwgMHg3RiwgMHhGQSwgMHhCNCwgMHg2NCwgMHg0MSwgMHg2NCwgMHhGMSwgMHgwMiwgMHhCMSwgMHgwNCwgMHg2NSwgMHgwMiwgMHgwMiwKKwkgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQiwgMHgwMSwgMHg2NSwgMHhCNCwgMHg4NCwgMHhBMCwgMHg1RCwgMHg0MywgMHg0NSwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywKKwkgMHg0MCwgMHg0MCwgMHgwMiwgMHg2MCwgMHhFRSwgMHg2NCwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyNywgMHhDOCwgMHg2NCwgMHg4MSwgMHhGQiwgMHg4MiwgMHhGOSwKKwkgMHgwNSwgMHg2NCwgMHg4MywgMHhGQiwgMHhERiwgMHhGRSwgMHgxOSwgMHhGRiwgMHgyNiwgMHgwMCwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwKKwkgMHg0MywgMHg0NSwgMHhBNCwgMHhEMSwgMHhEQSwgMHg4MywgMHhDMywgMHg4NSwgMHg4MCwgMHhFMSwgMHhERiwgMHhGRSwgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0OCwgMHg2MCwgMHg0NywgMHg4MCwgMHhCQywgMHgwMCwgMHg3RiwgMHg2MCwgMHg0QSwgMHhENywgMHg4MCwgMHhBMSwgMHhGRiwgMHhGNiwgMHgwMiwKKwkgMHhCRiwgMHhGRSwgMHgxMSwgMHgwMCwgMHg0MywgMHg0NSwgMHhBNCwgMHhEMSwgMHhEQSwgMHg4MywgMHgwRCwgMHgxOCwgMHg2NCwgMHg0NCwgMHgwMCwgMHg2MSwKKwkgMHhGQSwgMHhBNCwgMHhERCwgMHg4MSwgMHhGRCwgMHgwMiwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5QywgMHg3OCwgMHhGRiwgMHhGRiwgMHhCRiwgMHhGRSwKKwkgMHgwMiwgMHgwMCwgMHhGMSwgMHhGRSwgMHgwMSwgMHgwMCwgMHgyNSwgMHg0MywgMHgyMSwgMHhFMSwgMHgwMCwgMHg2NCwgMHhCRiwgMHhEQiwgMHgyMCwgMHg0NCwKKwkgMHgyMCwgMHgyQSwgMHgwNywgMHgwMCwgMHgwNywgMHhCNCwgMHgwNCwgMHgzNiwgMHhDMywgMHhGRSwgMHgwNiwgMHgzNiwgMHhDQywgMHhGRSwgMHgwNywgMHgzNiwKKwkgMHhENSwgMHhGRSwgMHgyMCwgMHg0NCwgMHhEOCwgMHhCNCwgMHg0MCwgMHg0MCwgMHgxRiwgMHg2MCwgMHgyQywgMHg2MywgMHhCRCwgMHhEMywgMHgwMywgMHg2MSwKKwkgMHgwRiwgMHgxQiwgMHgwNCwgMHhBMywgMHhCRCwgMHhEMywgMHgwNCwgMHg2MSwgMHgwQiwgMHgxQiwgMHgwNCwgMHhBMywgMHhCRCwgMHhEMywgMHgwNiwgMHg2MSwKKwkgMHgwNywgMHgxQiwgMHgwNCwgMHhBMywgMHhCRCwgMHhEMywgMHgwNywgMHg2MSwgMHgwMywgMHgxQiwgMHhDMywgMHg2MCwgMHg1MywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhBMywgMHhEMSwgMHg0MCwgMHg0NCwgMHgyMCwgMHg0NCwgMHgwNywgMHhCNSwgMHhENCwgMHg4NSwgMHgzNSwgMHg4MCwgMHgyNCwgMHg0NSwgMHgxRiwgMHg2MCwKKwkgMHg2QywgMHg2NCwgMHg0NCwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg0MywgMHg0NSwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwKKwkgMHg2NCwgMHg0MywgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwgMHg0MCwgMHg0NCwgMHgxMCwgMHgyNywgMHgxOSwgMHgwMCwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyQiwKKwkgMHgwNiwgMHgwMCwgMHgyNCwgMHg0NywgMHgwOCwgMHgyQiwgMHgxMywgMHgwMCwgMHgwNywgMHhCNCwgMHgwMSwgMHgzNiwgMHgxMSwgMHgwMCwgMHhGRiwgMHg2MCwKKwkgMHg3RiwgMHg2NSwgMHgxNSwgMHg2MCwgMHhBMiwgMHg2NCwgMHgyNCwgMHg0MCwgMHgwOCwgMHgyQiwgMHhBNCwgMHg4NCwgMHhBMCwgMHg1NywgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHg0OSwgMHhGRiwgMHhGRiwgMHg2OCwgMHg0NCwgMHgwMSwgMHgxNiwgMHhGRCwgMHgwMSwgMHgwMCwgMHg3RiwgMHhBMywgMHhEQiwgMHhBQiwgMHgwMSwKKwkgMHg2NCwgMHg0MiwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhCNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCRCwgMHhEOSwgMHhBMywgMHhEQiwgMHhBMywgMHgwMSwKKwkgMHg0MywgMHg0NSwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwgMHg2NCwgMHg0MywgMHhCRCwgMHhEMywgMHhBMywgMHhEMSwgMHg0MCwgMHg0NCwKKwkgMHgxMCwgMHgyQiwgMHgxNiwgMHgwMCwgMHhCRSwgMHhEMSwgMHhGRiwgMHhGRiwgMHgxNSwgMHg2MCwgMHg4MCwgMHhFNywgMHgyNCwgMHg0MCwgMHgwNywgMHgyNywKKwkgMHgwNCwgMHgwMCwgMHhBQywgMHg0RiwgMHgxMCwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1QywgMHg2NCwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwKKwkgMHhGRSwgMHgwMSwgMHgyNCwgMHg0MCwgMHgyMCwgMHgyNywgMHgxRCwgMHgwMCwgMHhBQywgMHg0RiwgMHhFRiwgMHhCNCwgMHhBMCwgMHg1QywgMHgxOSwgMHgwMCwKKwkgMHgzRiwgMHg0MCwgMHgwMiwgMHgyQiwgMHgwNiwgMHgwMCwgMHgyNCwgMHg0NywgMHgwOCwgMHgyQiwgMHgxMywgMHgwMCwgMHgwNywgMHhCNCwgMHgwMSwgMHgzNiwKKwkgMHgxMSwgMHgwMCwgMHgxNSwgMHg2MCwgMHgyMiwgMHg2NCwgMHgyNCwgMHg0MCwgMHgwOCwgMHgyNywgMHg4MCwgMHhCQywgMHg3QywgMHg0OCwgMHhCRSwgMHhEMywKKwkgMHhBMCwgMHg1NywgMHg2MCwgMHg0OCwgMHg2NCwgMHg0NCwgMHg4MCwgMHhCQywgMHhGRiwgMHhCNCwgMHg2MCwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwKKwkgMHhGRSwgMHgwMSwgMHg2OSwgMHgwMSwgMHgwMSwgMHg2MSwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5QywgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MywgMHgwMSwKKwkgMHgyOCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwRiwgMHhCNCwgMHg5QSwgMHgwMCwgMHhGRiwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHg2NCwgMHgwRiwgMHg2MCwgMHg5RiwgMHhGQiwgMHgyNywgMHgwMCwgMHgwQywgMHg2NCwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyQiwgMHgyMywgMHgwMCwKKwkgMHgyOSwgMHhGMSwgMHgwRiwgMHg2MCwgMHg5RiwgMHhGQiwgMHg1QSwgMHhEOSwgMHgxQywgMHg2MCwgMHhEMCwgMHg2NCwgMHg3RiwgMHhGQiwgMHhGRiwgMHhGRiwKKwkgMHgyRCwgMHhGRiwgMHhGMCwgMHg2MCwgMHhDNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMiwgMHg2MCwgMHgyMiwgMHg2MywgMHgwOSwgMHg2MSwgMHgxQSwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHg5QywgMHg3OCwgMHhGRiwgMHhGRiwgMHg3NywgMHgwMCwgMHhEMywgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHhEMywgMHhGQiwKKwkgMHgwNiwgMHg2NCwgMHgwRiwgMHg2MCwgMHg5RiwgMHhGQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHg2NCwgMHgwRiwgMHg2MCwgMHg5RiwgMHhGQiwgMHgxRCwgMHg2MCwgMHg0RiwgMHg2NCwgMHg3RiwgMHhGQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwKKwkgMHhGMCwgMHg2MCwgMHhDNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyOSwgMHhGMywgMHgxMSwgMHg2MCwgMHhGOSwgMHg2NSwgMHg2MCwgMHg1QywgMHgzRiwgMHg0MCwKKwkgMHgwMiwgMHgyQiwgMHgxMywgMHgwMCwgMHgwMCwgMHgzNywgMHgxMSwgMHgwMCwgMHgwMSwgMHgzQiwgMHg1NSwgMHgwMCwgMHgxMSwgMHg2MCwgMHgxOSwgMHg2MywKKwkgMHhGRiwgMHhCNywgMHg2MCwgMHg1QywgMHhBMywgMHhEMywgMHgwOCwgMHhBMywgMHgwMCwgMHg3RSwgMHhEMCwgMHg4MCwgMHhENywgMHg4MCwgMHgwMiwgMHgwMywKKwkgMHhGOSwgMHgwMiwgMHg0OSwgMHgwMCwgMHhGNCwgMHhBMywgMHhBMywgMHhEMywgMHgwNSwgMHgwMCwgMHgwMCwgMHhCQywgMHhGMiwgMHhBNCwgMHg0MywgMHgwMywKKwkgMHg0MiwgMHgwNywgMHg2NCwgMHg0NCwgMHg2NCwgMHhGQiwgMHg4MiwgMHhGQiwgMHhDOCwgMHg2NCwgMHg4MSwgMHhGQiwgMHgwNywgMHg2NCwgMHg4MywgMHhGQiwKKwkgMHgxRCwgMHg2MCwgMHg0RiwgMHg2NCwgMHg3RiwgMHhGQiwgMHhGRiwgMHhGRiwgMHhERiwgMHhGRSwgMHgwMCwgMHg2NCwgMHgxOSwgMHhGRiwgMHhGMCwgMHg2MCwKKwkgMHhDNywgMHg3OCwgMHhGRiwgMHhGRiwgMHg4OCwgMHhGRiwgMHhCQSwgMHg2MCwgMHg5OCwgMHg3MSwgMHg4RCwgMHhFMiwgMHgwMSwgMHgxMSwgMHgwOSwgMHgwMCwKKwkgMHg3MSwgMHg0MCwgMHg4MCwgMHgyNywgMHhGQiwgMHgwMSwgMHg4OCwgMHhFMiwgMHhCQSwgMHg2MCwgMHhEMCwgMHg2NCwgMHgwMywgMHhGQiwgMHg4RCwgMHhGRiwKKwkgMHgxNSwgMHgwMCwgMHg4RCwgMHhGRiwgMHhCMSwgMHg2MCwgMHhFRCwgMHg2MywgMHgwNiwgMHg2MCwgMHgwQiwgMHhGRCwgMHhGRiwgMHhGRiwgMHg2MiwgMHhGRiwKKwkgMHgxRCwgMHg2MCwgMHgzQywgMHg2MywgMHg3RiwgMHhGRCwgMHhGRiwgMHhGRiwgMHgxQSwgMHhGRiwgMHhGMCwgMHg2MCwgMHhDNywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhBNCwgMHg2MCwgMHg3QywgMHg2MywgMHgwNiwgMHg2MCwgMHgwQiwgMHhGRCwgMHhGRiwgMHhGRiwgMHg2MiwgMHhGRiwgMHgyOSwgMHhGNSwgMHgxRiwgMHg2MCwKKwkgMHgyNiwgMHg2MywgMHgxRSwgMHg2MCwgMHhGOCwgMHg2NCwgMHhCRCwgMHhEQiwgMHg2NiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgwMiwgMHg2NCwgMHhBMywgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGOSwgMHhGRSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHgwMSwgMHgwMCwgMHgzNiwKKwkgMHg2NywgMHgwMSwgMHgwMSwgMHgzNiwgMHg2OSwgMHgwMSwgMHgwMiwgMHgzNiwgMHg3RiwgMHgwMSwgMHgwMywgMHgzNiwgMHg4OSwgMHgwMSwgMHgwNCwgMHgzNiwKKwkgMHhDMSwgMHgwMSwgMHgwNSwgMHgzNiwgMHhCRiwgMHgwMSwgMHgwNiwgMHgzNiwgMHhGMSwgMHgwMSwgMHgwNywgMHgzNiwgMHhCQiwgMHgwMSwgMHgwOCwgMHgzNiwKKwkgMHg4QSwgMHgwMSwgMHgwOSwgMHgzNiwgMHgwQywgMHgwMCwgMHgwQSwgMHgzNiwgMHgwRCwgMHgwMCwgMHgwQiwgMHgzNiwgMHgwRSwgMHgwMCwgMHgwQywgMHgzNiwKKwkgMHgxNywgMHgwMCwgMHgwRCwgMHgzNiwgMHgwRCwgMHgwMCwgMHgwRSwgMHgzNiwgMHgxRCwgMHgwMCwgMHgwRiwgMHgzNiwgMHg0MSwgMHgwMCwgMHgwMiwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHgwOCwgMHgwMCwgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwNSwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHgwMiwgMHgwMCwKKwkgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgzMiwgMHg0NSwgMHhCNCwgMHg4NSwgMHg0NSwgMHg1MiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHhCMiwgMHg2MCwgMHhEMCwgMHg2MywgMHgwNiwgMHg2MCwgMHgwQiwgMHhGRCwgMHg2MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxQSwgMHhGRiwgMHgwMCwgMHg2NywKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyQiwgMHgxNSwgMHgwMCwgMHg4OCwgMHhGRiwgMHhCQSwgMHg2MCwgMHg5OCwgMHg3MSwKKwkgMHg4RCwgMHhFMiwgMHgwMSwgMHgxMSwgMHgwOSwgMHgwMCwgMHg3MSwgMHg0MCwgMHg4MCwgMHgyNywgMHhGQiwgMHgwMSwgMHg4OCwgMHhFMiwgMHhCQSwgMHg2MCwKKwkgMHhEMCwgMHg2NCwgMHgwMywgMHhGQiwgMHg4RCwgMHhGRiwgMHgxMSwgMHgwMCwgMHg4RCwgMHhGRiwgMHg5MCwgMHg2MCwgMHgwMCwgMHhFOCwgMHhCMSwgMHg2MCwKKwkgMHhFRCwgMHg2MywgMHgwNCwgMHgwMCwgMHg5MSwgMHg2MCwgMHgwMCwgMHhFOCwgMHhCMiwgMHg2MCwgMHhCNiwgMHg2MywgMHgyQSwgMHhFOCwgMHgwNiwgMHg2MCwKKwkgMHgwQiwgMHhGRCwgMHhGRiwgMHhGRiwgMHg2MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxQSwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHhEMiwgMHhGMywgMHhGRiwgMHhGRiwgMHhFRiwgMHhCNCwgMHhEMiwgMHhGQiwgMHhBRCwgMHg0RiwgMHhGRCwgMHhCNCwgMHhBMCwgMHg1RCwgMHhEMCwgMHg2MCwKKwkgMHgwMCwgMHhFOCwgMHgyQSwgMHhFOCwgMHhEOSwgMHg2MCwgMHhGRSwgMHg2NCwgMHgzMiwgMHg0NSwgMHhBNCwgMHg4NSwgMHg0NSwgMHg1MiwgMHg5OSwgMHhGRiwKKwkgMHhBNSwgMHg0RiwgMHhGRiwgMHhCNCwgMHgwNywgMHhGQiwgMHg5OCwgMHhGRiwgMHhBNCwgMHg2MCwgMHg3QywgMHg2MywgMHgwNiwgMHg2MCwgMHgwQiwgMHhGRCwKKwkgMHg2MiwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwNywgMHgwMiwKKwkgMHg2MiwgMHhGRiwgMHg2MywgMHhGRiwgMHg2NCwgMHhGRiwgMHg2NSwgMHhGRiwgMHg2NiwgMHhGRiwgMHhCRiwgMHhGRSwgMHhBMSwgMHhGRiwgMHg4MiwgMHhGRiwKKwkgMHg4OCwgMHhGRiwgMHg2QywgMHg0MCwgMHg0MSwgMHhGRiwgMHhDNCwgMHhFMiwgMHg0MywgMHhGRiwgMHg1QywgMHg0OSwgMHgwOCwgMHhFMSwgMHhBMywgMHg2MCwKKwkgMHgzMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwMiwgMHgwMiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg4MiwgMHhGRiwgMHg4OCwgMHhGRiwgMHhBOCwgMHhFMiwgMHgwMSwgMHg3MCwgMHhBRCwgMHhGMSwgMHgwMCwgMHg2QiwgMHg4OSwgMHhGRiwgMHg2NCwgMHg1NCwKKwkgMHg4OCwgMHhGRiwgMHg5RiwgMHhGRSwgMHgwMiwgMHgwNSwgMHg2NCwgMHg0NCwgMHg2MCwgMHg1NCwgMHhDRCwgMHhFMiwgMHhDMiwgMHg2NCwgMHgzQSwgMHhEQiwKKwkgMHhCQywgMHhGRiwgMHhCNSwgMHhGRiwgMHgxRCwgMHhGRiwgMHgyNiwgMHg0NCwgMHgwMiwgMHhCNCwgMHg0MCwgMHg0NiwgMHgzQywgMHg0NCwgMHgwMCwgMHhCQywKKwkgMHhGRiwgMHhGRiwgMHgwNiwgMHgwMywgMHgyNywgMHg0MCwgMHgyNiwgMHgyMiwgMHgwMywgMHgwMCwgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwKKwkgMHgyNywgMHg0NCwgMHgyMCwgMHgyQSwgMHgwNCwgMHgwMCwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhCMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHg1QywgMHg0NCwKKwkgMHgyNywgMHg0NCwgMHgxOCwgMHhCNCwgMHg0MCwgMHg0NywgMHgwMCwgMHhFMSwgMHhBNCwgMHhFMiwgMHhDNCwgMHhFMiwgMHg0NywgMHhGRiwgMHhCNiwgMHhGRiwKKwkgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHgzMiwgMHhGMSwgMHgwOCwgMHgyOSwgMHgwOSwgMHgwMCwgMHg2NCwgMHg0MCwgMHgwNywgMHgyMiwgMHgwNiwgMHgwMCwKKwkgMHg0MywgMHhGRiwgMHgyNywgMHg0NCwgMHgxMCwgMHhCQywgMHg0MCwgMHg0NywgMHgwMCwgMHg2NCwgMHgzMiwgMHhGQiwgMHgzMSwgMHg0MSwgMHgzQywgMHg0NCwKKwkgMHgwMSwgMHhCMSwgMHgwMCwgMHhCQywgMHgwQSwgMHgwMiwgMHgwOSwgMHgwMywgMHgzMiwgMHhGMywgMHgwMCwgMHg3QywgMHgwMSwgMHhCNCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgwMywgMHgzMiwgMHhGOSwgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhDOCwgMHg2MCwgMHgwOSwgMHg3RCwgMHgwMCwgMHg2MCwKKwkgMHgwMCwgMHg2QiwgMHgwMCwgMHg2NCwgMHgzMywgMHhGQiwgMHgwQywgMHg2MCwgMHgxNiwgMHg2NCwgMHhBMCwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHhFMSwgMHgzMCwgMHg0MCwgMHgwMiwgMHgzNiwgMHhBMSwgMHhGRiwgMHg4MywgMHhGRiwgMHg4RCwgMHhGRiwgMHg1QywgMHg0NCwgMHg1QywgMHg0MywKKwkgMHg1QywgMHg0MiwgMHg1QywgMHg0MSwgMHg1QywgMHg0MCwgMHhBQywgMHhGRiwgMHhBRCwgMHhGRiwgMHhFNywgMHhFMSwgMHhCMywgMHg2MCwgMHhCRSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwMywgMHgwMiwgMHgyOCwgMHhFMiwgMHg0MCwgMHhGRiwgMHhBMSwgMHhGRiwKKwkgMHg4NCwgMHhGRiwgMHhDMSwgMHg2MCwgMHg2QiwgMHg2NCwgMHg0MCwgMHg0MiwgMHhCNywgMHg2MCwgMHhBMiwgMHg2NCwgMHg0MCwgMHg0MCwgMHg5QywgMHhGMywKKwkgMHg2NSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MywgMHhBOSwgMHhGMywgMHhCRCwgMHhEQiwgMHgwMCwgMHg2MCwgMHg5QSwgMHg2NCwgMHhCRCwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwNCwgMHg2NCwgMHhBMywgMHhEQiwgMHg1QywgMHg0OSwgMHgwQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHg1QywgMHg1QywKKwkgMHgwMSwgMHg2MCwgMHgzOSwgMHhFMiwgMHgwNCwgMHg2MCwgMHgwMCwgMHg3QSwgMHg4OSwgMHhGRiwgMHgwMywgMHg2MCwgMHhGRiwgMHg3MywgMHg4OCwgMHhGRiwKKwkgMHhCNywgMHg2MCwgMHhBMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwNiwgMHgwMiwgMHg0MCwgMHhGRiwKKwkgMHg0MiwgMHhGRiwgMHg0MywgMHhGRiwgMHg0NCwgMHhGRiwgMHg0NSwgMHhGRiwgMHhBMSwgMHhGRiwgMHg4OCwgMHhGRiwgMHg4NSwgMHhGRiwgMHgyMSwgMHhFMSwKKwkgMHg1QywgMHg0MCwgMHhDMywgMHg2MCwgMHg1MywgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMiwgMHhGRiwgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwKKwkgMHgwMSwgMHgwMiwgMHhBMSwgMHhGRiwgMHg4NiwgMHhGRiwgMHg4OCwgMHhGRiwgMHg1QywgMHg0NiwgMHg1QywgMHg0OSwgMHg1QywgMHg0MCwgMHhFMSwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHg3QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEMCwgMHg2MCwgMHg1OCwgMHg0RiwgMHhBMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFQiwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHgxMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhERCwgMHg2MCwgMHg1OCwgMHg0RiwgMHhGNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHhFMSwKKwkgMHhBMywgMHhGRiwgMHhDQSwgMHg2MCwgMHg3RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMywgMHhFMSwgMHhBMywgMHhGRiwgMHgxRSwgMHg2MCwgMHg5RSwgMHg2MywKKwkgMHgxNywgMHhGRCwgMHhBRSwgMHhGRiwgMHhGMCwgMHg2MCwgMHhDNywgMHg3OCwgMHhGRiwgMHhGRiwgMHg4NiwgMHhGMywgMHg4NywgMHhGMywgMHhEQywgMHg4MSwKKwkgMHgwMCwgMHg3QywgMHgwMSwgMHgwMCwgMHgwMCwgMHhGQSwgMHg2MCwgMHg0NiwgMHhGRSwgMHg2MywgMHhBMywgMHhEOCwgMHhGRSwgMHgxRiwgMHhDRCwgMHg4MSwKKwkgMHhEOCwgMHg4NCwgMHhGOCwgMHgwMiwgMHg4NiwgMHhGMywgMHg4NywgMHhGNSwgMHhEQywgMHg4MSwgMHg4MCwgMHg2NywgMHg0MCwgMHg0QSwgMHgwNSwgMHgxOCwKKwkgMHgyQSwgMHg0MywgMHgwMiwgMHhGQywgMHg1RiwgMHg4QSwgMHgwMCwgMHhGNCwgMHhGQSwgMHgwMSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHg4OCwgMHhGMywKKwkgMHgwNiwgMHg2MSwgMHgwMCwgMHg3QywgMHg2MCwgMHg0NiwgMHhGRSwgMHg2MywgMHhBMywgMHhEOCwgMHhGRSwgMHgxRiwgMHhDRCwgMHg4MSwgMHg2NiwgMHg0NCwKKwkgMHhEOCwgMHg4NCwgMHhGOCwgMHgwMiwgMHgwOSwgMHg2MCwgMHgyQiwgMHg3QywgMHg4OCwgMHhGMywgMHgwNiwgMHg2MSwgMHg2MCwgMHg0NiwgMHgwMSwgMHg2MywKKwkgMHg3NiwgMHhGOCwgMHgwMCwgMHhGQywgMHg2MywgMHg0NywgMHgwNiwgMHhGQSwgMHg3NiwgMHhGOCwgMHgwMywgMHg2NCwgMHg3NywgMHhGQSwgMHhERiwgMHg4MywKKwkgMHg2NiwgMHg0NCwgMHhDRCwgMHg4MSwgMHgwMiwgMHhBNiwgMHhGNCwgMHgwMiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHg4QSwgMHhGMSwgMHg4OSwgMHhGMywKKwkgMHg3QywgMHg2MywgMHg4QywgMHhGQiwgMHg2MCwgMHg0NiwgMHgwMSwgMHhGQywgMHhEQywgMHg4NCwgMHhEMCwgMHg4MCwgMHgwMCwgMHhGQSwgMHhGQSwgMHgwNCwKKwkgMHg4RCwgMHhGQiwgMHg2MCwgMHg0NiwgMHgwMCwgMHg2NCwgMHgwMCwgMHhGQSwgMHg2MywgMHg0NCwgMHg4MCwgMHg3RiwgMHgwMSwgMHhGQSwgMHg4QSwgMHhGMywKKwkgMHg4OSwgMHhGMSwgMHhEQywgMHg4NCwgMHhEMCwgMHg4NCwgMHg4QiwgMHhGQiwgMHgwMywgMHg2MCwgMHgyNiwgMHg2MSwgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHg4QywgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHgyRSwgMHhGQiwgMHg4MiwgMHhGRiwgMHg0MCwgMHg0MiwgMHg4NywgMHhGRiwgMHg4QiwgMHhGMywKKwkgMHg5MywgMHhGQiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg1MCwgMHg2MywgMHhGRiwgMHg2MCwgMHhGRiwgMHg2NiwgMHhGRiwgMHg2NSwgMHhGRiwgMHg2NCwgMHhGRiwKKwkgMHg2MSwgMHhGRiwgMHg2MiwgMHhGRiwgMHg0OSwgMHg2MCwgMHgwMiwgMHhFMSwgMHg1MiwgMHg2MCwgMHgwMiwgMHhFMSwgMHg1QywgMHg2MCwgMHgwMiwgMHhFMSwKKwkgMHg2NSwgMHg2MCwgMHgwMiwgMHhFMSwgMHg2QiwgMHg2MCwgMHgwMiwgMHhFMSwgMHg3NiwgMHg2MCwgMHgwMiwgMHhFMSwgMHg0MSwgMHg2MCwgMHgwMiwgMHhFMSwKKwkgMHgwNCwgMHg2NCwgMHgwRiwgMHg2MCwgMHg5RiwgMHhGQiwgMHgxRiwgMHg2MCwgMHg2NCwgMHg2NCwgMHg3RiwgMHhGQiwgMHgyRCwgMHhGRiwgMHgwQSwgMHg2MSwKKwkgMHg0MSwgMHg0QiwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2MSwgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg4QywgMHg3OCwgMHhGRiwgMHhGRiwgMHhGMCwgMHg2NywKKwkgMHgwRSwgMHhGQSwgMHgxRiwgMHg2MCwgMHgwQSwgMHg2NCwgMHgwRiwgMHg2MCwgMHg5MywgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgyQiwgMHg0MSwgMHg0RCwgMHg4QiwgMHhGRiwgMHhGRiwgMHhFQSwgMHgwMiwgMHgwOSwgMHg2MSwKKwkgMHg0MSwgMHg0QiwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2MSwgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg4QywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRSwgMHg2MCwKKwkgMHhGRSwgMHg2NCwgMHgwRiwgMHg2MCwgMHg5MywgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHgyQiwgMHg0MSwgMHg0RCwgMHg4QiwgMHhGRiwgMHhGRiwgMHhFQywgMHgwMiwgMHgxRSwgMHg2MCwgMHhCMCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHhFQSwgMHgwMCwgMHhFQiwgMHg1MCwgMHg2MCwgMHgwMywgMHhFQSwgMHg1MSwgMHg2MCwgMHgxMywgMHhFQSwgMHg1MiwgMHg2MCwgMHgzMCwgMHhFQSwKKwkgMHg1MywgMHg2MCwgMHg0MCwgMHhFQSwgMHg1NCwgMHg2MCwgMHg1MiwgMHhFQSwgMHg1NSwgMHg2MCwgMHg2RCwgMHhFQSwgMHg1NiwgMHg2MCwgMHg3MSwgMHhFQSwKKwkgMHg1NywgMHg2MCwgMHg4QiwgMHhFQSwgMHg1OCwgMHg2MCwgMHg0NywgMHhFQSwgMHg1OSwgMHg2MCwgMHhBMCwgMHhFQSwgMHg1QSwgMHg2MCwgMHhCMiwgMHhFQSwKKwkgMHg1QiwgMHg2MCwgMHhDMSwgMHhFQSwgMHg1QywgMHg2MCwgMHhENywgMHhFQSwgMHg1RCwgMHg2MCwgMHhFQiwgMHhFQSwgMHg1RSwgMHg2MCwgMHhBMCwgMHhFQSwKKwkgMHg1MCwgMHg2MCwgMHgzNiwgMHhFQiwgMHg1MSwgMHg2MCwgMHgzNywgMHhFQiwgMHg1MiwgMHg2MCwgMHgyMCwgMHhFQiwgMHg1MywgMHg2MCwgMHhFNCwgMHhFQiwKKwkgMHg1NCwgMHg2MCwgMHgzNCwgMHhFQiwgMHg1NSwgMHg2MCwgMHg1OCwgMHhFQiwgMHg1NiwgMHg2MCwgMHg0OCwgMHhFQiwgMHg1NywgMHg2MCwgMHhEMCwgMHhFQiwKKwkgMHg1OCwgMHg2MCwgMHhDMywgMHhFQiwgMHg1OSwgMHg2MCwgMHhGQywgMHhFQiwgMHg1QSwgMHg2MCwgMHgzNCwgMHhFQiwgMHg1QiwgMHg2MCwgMHg1OCwgMHhFQiwKKwkgMHg1QywgMHg2MCwgMHhDMCwgMHhFQiwgMHg1RCwgMHg2MCwgMHhEMCwgMHhFQiwgMHg1RSwgMHg2MCwgMHg5MSwgMHhFQiwgMHgwMCwgMHhFQSwgMHgwMCwgMHhFQiwKKwkgMHhFMCwgMHg2MCwgMHgwMiwgMHhFQSwgMHhFMCwgMHg2MCwgMHgwMywgMHhFQiwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQiwgMHhCMCwgMHg2MCwgMHgwMCwgMHhFQiwKKwkgMHhBQiwgMHg0OCwgMHg0MCwgMHgzQiwgMHgwMSwgMHgwMCwgMHhGQywgMHgwMSwgMHgwMCwgMHhFQiwgMHgwMywgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMCwgMHhEQiwKKwkgMHgwRiwgMHg2NCwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhEMSwgMHg2MCwKKwkgMHgwMCwgMHhFQSwgMHgyNCwgMHg0NCwgMHhGRiwgMHhCNCwgMHgwNCwgMHhGQiwgMHg1MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwNSwgMHhGQiwgMHgxMCwgMHg2MCwKKwkgMHgxMCwgMHg3NSwgMHhGMCwgMHg2MCwgMHhDNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHg0MCwgMHg0MCwgMHgyNiwgMHg0MCwgMHgwMCwgMHgwNSwgMHg2MCwKKwkgMHhGOSwgMHhGMSwgMHg0MiwgMHg2MCwgMHgwOCwgMHg2NCwgMHgwOSwgMHg2MCwgMHgxOSwgMHg2MywgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQiwgMHgwNCwgMHgwMCwKKwkgMHg0MiwgMHg2MCwgMHgwOSwgMHg2NCwgMHgwQSwgMHg2MCwgMHgxOSwgMHg2MywgMHgxOCwgMHg2MCwgMHgyMiwgMHhGQiwgMHgwNCwgMHg2MCwgMHgwMCwgMHhCQywKKwkgMHgxOCwgMHg2MCwgMHgxRSwgMHhGQiwgMHgxOCwgMHg2MCwgMHgxRCwgMHhGRCwgMHgxRCwgMHg2MCwgMHgxOSwgMHg2MywgMHgxOCwgMHg2MCwgMHgyMSwgMHhGRCwKKwkgMHg4MCwgMHg2MCwgMHgxQywgMHg2NCwgMHgzRiwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMiwgMHgwMCwgMHg2MCwgMHg2MCwgMHgxQywgMHg2NCwgMHgxOCwgMHg2MCwKKwkgMHgyMywgMHhGQiwgMHgxOCwgMHg2MCwgMHgxRiwgMHhGQiwgMHgxOCwgMHg2MCwgMHgyMiwgMHhGMywgMHhBMCwgMHg1MCwgMHhBMCwgMHg1MCwgMHgwQiwgMHg2MCwKKwkgMHhGOCwgMHg2MywgMHhBMywgMHhEMSwgMHgzMCwgMHg2MCwgMHgzOCwgMHg2MSwgMHhBMSwgMHhEMywgMHhGOCwgMHhBMywgMHg5MCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhBMywgMHhEMSwgMHg1OSwgMHhEMywgMHgwNiwgMHhBMywgMHg5MCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhBMywgMHhEMSwgMHg1OSwgMHhEMywgMHhGRSwgMHhBMywKKwkgMHg5MCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhBMywgMHhEMSwgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHg5MCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4MCwgMHg2MCwKKwkgMHg1OCwgMHhFQywgMHg4MCwgMHg2MCwgMHgwMCwgMHhFRCwgMHg4MCwgMHg2MCwgMHg4MCwgMHhFRSwgMHg0MCwgMHhFQywgMHgwMCwgMHhFRCwgMHgwMCwgMHhFRSwKKwkgMHhDMCwgMHg2MCwgMHg1OSwgMHhFQywgMHhDMCwgMHg2MCwgMHgwNywgMHhFRCwgMHhDMCwgMHg2MCwgMHg4RiwgMHhFRSwgMHhBRCwgMHg0RiwgMHhGQSwgMHhCNCwKKwkgMHhBMCwgMHg1RCwgMHgwMCwgMHhGMywgMHgyOCwgMHhGQiwgMHg0MCwgMHg0NCwgMHhBMiwgMHg2MCwgMHhFOCwgMHg3QywgMHgyMCwgMHhGOSwgMHgxRCwgMHg2MCwKKwkgMHhEMCwgMHg3QywgMHgyMSwgMHhGOSwgMHgxRCwgMHg2MCwgMHhFNiwgMHg3QywgMHgyMiwgMHhGOSwgMHgxRSwgMHg2MCwgMHg0NCwgMHg3QywgMHgyMywgMHhGOSwKKwkgMHgxRSwgMHg2MCwgMHg1NSwgMHg3QywgMHgyNCwgMHhGOSwgMHgxRSwgMHg2MCwgMHg3RiwgMHg3QywgMHgyNSwgMHhGOSwgMHgxRSwgMHg2MCwgMHg5MCwgMHg3QywKKwkgMHgyNiwgMHhGOSwgMHhEMCwgMHg2MCwgMHgwMCwgMHhFOCwgMHgyOCwgMHhFOCwgMHg0NCwgMHg2MCwgMHgwMSwgMHhFNiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg1MiwKKwkgMHgxMCwgMHg2MCwgMHgwNCwgMHhFNiwgMHgwOCwgMHg2MCwgMHgwNiwgMHg2MywgMHhGRCwgMHg2MCwgMHgwQywgMHg2NSwgMHg1QiwgMHhEMywgMHhCRiwgMHhEMSwKKwkgMHgwQywgMHgxOCwgMHhDMywgMHg4MywgMHhENCwgMHg4MCwgMHhDMywgMHg4MywgMHhGOSwgMHgwMiwgMHhGQSwgMHhBMywgMHhBMywgMHhEMywgMHgwMiwgMHg2MCwKKwkgMHgwMCwgMHg2NSwgMHhGOSwgMHhBMCwgMHhGQywgMHhBMCwgMHgwOSwgMHgwNSwgMHgwMCwgMHgwNSwgMHgyMSwgMHg2MCwgMHgwMCwgMHg2NSwgMHgzRiwgMHg0MywKKwkgMHgyMSwgMHg2MCwgMHgwMCwgMHg2NSwgMHhDMCwgMHg2MCwgMHg4RiwgMHhFRSwgMHgwOCwgMHgwMCwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NSwgMHgwMCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHgxOCwgMHhGQiwgMHgzRiwgMHg0MywgMHgxMSwgMHg2MCwgMHgxMCwgMHhFNiwgMHhCNywgMHg4NCwgMHg0MCwgMHg1RiwgMHgzMCwgMHg2MCwKKwkgMHgyMCwgMHg2MywgMHgzRiwgMHg0MCwgMHgyMCwgMHgyNywgMHgwNiwgMHgwMCwgMHgwRiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHhGMCwgMHg2NCwgMHgwMywgMHgwMCwgMHgwRiwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwMCwgMHg2NCwgMHhBMywgMHhEQiwgMHgwMCwgMHg2MCwgMHgzMCwgMHhFMiwKKwkgMHgwMCwgMHg2MCwgMHg1MCwgMHhFMiwgMHgwMCwgMHg2MCwgMHg3OSwgMHhFMiwgMHgwMCwgMHg2MCwgMHg5MCwgMHhFMiwgMHgwMSwgMHg2MCwgMHhEMCwgMHhFMiwKKwkgMHgwMSwgMHg2MCwgMHhGMCwgMHhFMiwgMHgwMSwgMHg2MCwgMHhCMCwgMHhFMiwgMHgxMywgMHg2NCwgMHhBRCwgMHhGQiwgMHgwMSwgMHg2MCwgMHg2NywgMHg2NCwKKwkgMHgzNywgMHhGQiwgMHgwMCwgMHg2MCwgMHg1MCwgMHg2NCwgMHgzNiwgMHhGQiwgMHgwOSwgMHg2MCwgMHgyQSwgMHg2NCwgMHg5OCwgMHhGQiwgMHg4MiwgMHhGRiwKKwkgMHg5MiwgMHhGRiwgMHg1QywgMHg0MSwgMHg1QywgMHg0NiwgMHg1QywgMHg0NywgMHgwMCwgMHhFMSwgMHhBNCwgMHg2MCwgMHg3QywgMHg2MywgMHgwQywgMHg2MCwKKwkgMHgxNiwgMHg2NCwgMHhBMCwgMHhERCwgMHg4NywgMHhGRiwgMHg5NywgMHhGRiwgMHgwQywgMHg2MCwgMHgwMiwgMHg2NCwgMHg0MCwgMHg1QSwgMHgwNiwgMHhBNCwKKwkgMHg0MCwgMHg1QiwgMHg1QywgMHg1RSwgMHgxMywgMHg2MCwgMHg1MiwgMHhGMywgMHg2NCwgMHhGQiwgMHgzRiwgMHg0MCwgMHgwMSwgMHgyMiwgMHgwMywgMHgwMCwKKwkgMHg4MCwgMHg2MCwgMHgzNywgMHg3QywgMHgwMiwgMHgwMCwgMHg4MCwgMHg2MCwgMHgyNywgMHg3QywgMHgxNiwgMHg2MCwgMHg1NSwgMHhGOSwgMHgwMCwgMHg2MCwKKwkgMHg4MCwgMHg2NCwgMHg4OSwgMHhGQiwgMHgwMiwgMHg2MCwgMHg4MCwgMHg2NiwgMHgyMiwgMHg2MCwgMHgyMiwgMHg2NCwgMHg3NywgMHg2MCwgMHg3NywgMHg2MywKKwkgMHgwMCwgMHhGQSwgMHgwMSwgMHhGQywgMHgwMCwgMHhGMCwgMHgwMSwgMHhGMCwgMHhEMCwgMHg4MCwgMHhEMywgMHg4MCwgMHgxRSwgMHgwMiwgMHgxRCwgMHgwMiwKKwkgMHgwNiwgMHg2MCwgMHg4MCwgMHg2NSwgMHg0NSwgMHg0QSwgMHhBQSwgMHg0NiwgMHgwMCwgMHhGQywgMHgwMSwgMHhGQSwgMHhBQSwgMHg0NiwgMHgwMCwgMHhGMCwKKwkgMHgyQSwgMHg0MSwgMHg1MCwgMHg2NSwgMHhEMywgMHg4MCwgMHhDRCwgMHg4NCwgMHgxMywgMHgwMywgMHgwQSwgMHg2MCwgMHg4MCwgMHg2NSwgMHg0NSwgMHg0QSwKKwkgMHhBQSwgMHg0NiwgMHgwMCwgMHhGQywgMHgwMSwgMHhGQSwgMHhBQSwgMHg0NiwgMHgwMCwgMHhGMCwgMHg2NSwgMHg0MSwgMHhDOCwgMHg2NSwgMHhEMywgMHg4MCwKKwkgMHhDRCwgMHg4NCwgMHgwNiwgMHgwMywgMHgxMiwgMHg2MCwgMHg3RiwgMHg2NCwgMHgwMywgMHgwMCwgMHgxMCwgMHg2NSwgMHgwMiwgMHg2MCwgMHg3RiwgMHg2NCwKKwkgMHg2NSwgMHg0MywgMHg4NiwgMHhGRCwgMHgwRiwgMHg2MCwgMHg1QiwgMHhGRCwgMHgwNywgMHg2MSwgMHhDNSwgMHg4MSwgMHhFMSwgMHg4NSwgMHhENCwgMHg4NCwKKwkgMHg4QSwgMHhGQiwgMHhEQywgMHg4NCwgMHg4OCwgMHhGQiwgMHgwQywgMHhBNCwgMHg4NywgMHhGQiwgMHgwRiwgMHg2MCwgMHg1QywgMHhGQiwgMHgxRSwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHhEMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRSwgMHg2MCwgMHg1OCwgMHg0RSwgMHhCOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHg0MCwKKwkgMHg0MCwgMHgyNiwgMHgwNSwgMHgwMCwgMHgxOCwgMHg2MCwgMHgyMCwgMHhGMywgMHg1QSwgMHhEMSwgMHhBMCwgMHg1MCwgMHhBNCwgMHg1MiwgMHgwMCwgMHg2NCwKKwkgMHgwQSwgMHg2MCwgMHg3RSwgMHhGQiwgMHgxRSwgMHg2MCwgMHhGMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1QywgMHg1MSwgMHgzRiwgMHg0MSwgMHhBNSwgMHg0QywKKwkgMHg1MCwgMHgzNywgMHgwQiwgMHgwMCwgMHgwMSwgMHhCOSwgMHg0MSwgMHg1RiwgMHhCNSwgMHg2MCwgMHg1NSwgMHhFMCwgMHgwNSwgMHg2MCwgMHhGOSwgMHhGMSwKKwkgMHhDMCwgMHg2NywgMHg5MCwgMHg4NCwgMHgzRiwgMHg0MCwgMHgwMSwgMHgyNiwgMHhBMCwgMHg1MCwgMHgwNiwgMHg2MCwgMHgwOCwgMHhGMywgMHgwMSwgMHg2MCwKKwkgMHgwMSwgMHg2NSwgMHgwMSwgMHg2MCwgMHgwMiwgMHg3QywgMHhENCwgMHg4MCwgMHhEMCwgMHg4MCwgMHgwMSwgMHgwMywgMHgxMCwgMHgwMiwgMHg1QSwgMHhEMSwKKwkgMHg1QSwgMHhEMywgMHgzRSwgMHg2MCwgMHgwMCwgMHg2NiwgMHhFMCwgMHg4NywgMHg0MCwgMHg0QSwgMHhGNywgMHg2MCwgMHg4QywgMHg2MSwgMHg2NCwgMHg0NCwKKwkgMHhDOCwgMHg4NCwgMHgwQywgMHg2MywgMHhBQSwgMHg0NiwgMHg1OCwgMHhEMCwgMHhBQSwgMHg0NiwgMHg1OSwgMHhEOCwgMHhGQiwgMHgxRiwgMHgwOCwgMHg2MCwKKwkgMHgwMCwgMHg2MywgMHhGQSwgMHg2MCwgMHgwMCwgMHg2NSwgMHhCRCwgMHhEMywgMHhBMywgMHhEMywgMHgwMiwgMHhBOCwgMHhENCwgMHg4MCwgMHgwNywgMHgwMiwKKwkgMHgwNiwgMHgwMiwgMHg0OSwgMHg2MCwgMHg0QywgMHg2MSwgMHgzQywgMHg2MCwgMHgwMCwgMHg2NiwgMHg0MSwgMHg0QiwgMHgwMywgMHgwMCwgMHgyNCwgMHg2MCwKKwkgMHg4NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQiwgMHg0MSwgMHg0OSwgMHg2MCwgMHg5NCwgMHg3QywgMHhEMSwgMHg4MCwgMHhBMSwgMHhEMiwgMHgyNSwgMHgwNSwKKwkgMHg1OSwgMHhEMCwgMHg2MCwgMHg0NSwgMHg1OSwgMHhEMiwgMHg0NCwgMHg0NywgMHhFMCwgMHg4NywgMHg0MCwgMHg0QSwgMHg1OSwgMHhEMiwgMHg1OSwgMHg4QiwKKwkgMHg0MCwgMHg0QywgMHgwOCwgMHg2MCwgMHgwMCwgMHg2MywgMHhCRSwgMHhEMywgMHhCRCwgMHhEMSwgMHhFQywgMHgxOCwgMHhENCwgMHg4MCwgMHhFQSwgMHgxOCwKKwkgMHgwMywgMHgwMywgMHhDMywgMHg4MywgMHhDMywgMHg4MywgMHhGNywgMHgwMSwgMHg2NywgMHg0NCwgMHhDMCwgMHg4NCwgMHhFMCwgMHg4NSwgMHgyQywgMHg0NCwKKwkgMHhENCwgMHg4MCwgMHg2MywgMHg0MSwgMHgwMSwgMHgwNiwgMHg2NSwgMHg0NCwgMHhDOCwgMHg4MywgMHhBQSwgMHg0NiwgMHg1OSwgMHhEMSwgMHgyNywgMHhEOCwKKwkgMHg1QSwgMHg4NywgMHhGQywgMHgxRiwgMHhBQSwgMHg0NiwgMHgyQiwgMHg0MSwgMHhENSwgMHgwMSwgMHg0OSwgMHg2MCwgMHg5NCwgMHg2MSwgMHg0MSwgMHg0QiwKKwkgMHgyQiwgMHg0MSwgMHg0OSwgMHg2MCwgMHg5NCwgMHg3QywgMHhEMSwgMHg4MCwgMHhBMSwgMHhEMiwgMHgyNywgMHgwNSwgMHg1OSwgMHhEMCwgMHg2MCwgMHg0NSwKKwkgMHg1OSwgMHhEMiwgMHg0NCwgMHg0NywgMHhFMCwgMHg4NywgMHg0MCwgMHg0QSwgMHg1OSwgMHhEMiwgMHg1OSwgMHg4QiwgMHg0MCwgMHg0QywgMHgwOCwgMHg2MCwKKwkgMHgwMCwgMHg2MywgMHhCRSwgMHhEMywgMHhCRCwgMHhEMSwgMHhFQywgMHgxOCwgMHhENCwgMHg4MCwgMHhFQSwgMHgxOCwgMHgwMywgMHgwMywgMHhDMywgMHg4MywKKwkgMHhDMywgMHg4MywgMHhGNywgMHgwMSwgMHgwNCwgMHhBMywgMHhBMywgMHhEMSwgMHg1QSwgMHg4OCwgMHgyQywgMHg0MywgMHhEMywgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgwNiwgMHg2NCwgMHg0MywgMHhDRiwgMHg4MywgMHhBQSwgMHg0NiwgMHg2MCwgMHhGRSwgMHgyOCwgMHhEMSwgMHg1RSwgMHg4OCwgMHgyNywgMHhEOCwKKwkgMHg1QSwgMHg4NywgMHhGQiwgMHgxRiwgMHgyMCwgMHhGRSwgMHhBQSwgMHg0NiwgMHhEMywgMHgwMSwgMHhGQSwgMHg2MCwgMHgzOSwgMHg2NSwgMHgyNCwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHhCRSwgMHhEMSwgMHgwNywgMHg2MCwgMHhFRCwgMHhGOSwgMHgwNywgMHg2MCwKKwkgMHhFRCwgMHhGMywgMHgyMCwgMHg2MCwgMHgwMCwgMHg3QywgMHg2MCwgMHg0MCwgMHgxMCwgMHgyQSwgMHgwNSwgMHgwMCwgMHgwNywgMHg2MCwgMHhFQywgMHhGOSwKKwkgMHgwNywgMHg2MCwgMHhFQiwgMHhGOSwgMHgxMiwgMHgwMCwgMHgwNCwgMHhCMCwgMHgxMCwgMHg2MCwgMHg1NSwgMHhGMywgMHgwRSwgMHgwMywgMHgwMiwgMHhCQywKKwkgMHhBMiwgMHhEQiwgMHgwNywgMHg2MCwgMHhGNSwgMHhGQiwgMHgxMCwgMHg2MCwgMHhFOCwgMHhGMywgMHgxMCwgMHg2MCwgMHhBQywgMHhGMywgMHgwMiwgMHhCRCwKKwkgMHgwMiwgMHhCQywgMHhBMiwgMHhEQiwgMHg2NSwgMHg0NCwgMHgxMCwgMHg2MCwgMHhFOCwgMHhGQiwgMHgwNywgMHg2MCwgMHhFRCwgMHhGMywgMHgzMSwgMHg0MSwKKwkgMHg2MCwgMHg0MCwgMHgyMCwgMHgyQSwgMHg0MCwgMHhCOSwgMHg0MCwgMHgyNiwgMHgwMywgMHgwMCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHg4MCwgMHhCOSwKKwkgMHg0MSwgMHg1MSwgMHhGQSwgMHg2MCwgMHgzQSwgMHg2NSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwKKwkgMHgyMywgMHg2MCwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1QiwgMHhEMywgMHhGOCwgMHg2MCwgMHgzRiwgMHg2NSwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHgxMCwgMHg2MCwgMHhGNywgMHhGMywgMHhFMCwgMHg5QywgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHgxMCwgMHg2MCwgMHhGQSwgMHhGMywgMHhFMCwgMHg5QywgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyMSwgMHg2MCwgMHhGQSwgMHg2MSwgMHhBMywgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhBMSwgMHhEMywgMHhFMCwgMHg5QywgMHhBNCwgMHg4NCwKKwkgMHhCMCwgMHg4NCwgMHhBMSwgMHhEQiwgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHg1OSwgMHhEMywKKwkgMHhFMCwgMHg5QywgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMSwgMHhEQiwgMHgxMSwgMHg2MCwgMHgwMCwgMHhGMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwKKwkgMHgwMywgMHhGMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwgMHgwNiwgMHhGMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHgxMSwgMHg2MCwgMHgwOSwgMHhGMywgMHhFMCwgMHg5QywgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwgMHgwQywgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwgMHgwRiwgMHhGMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHhBMywgMHhBMywgMHhEMywgMHhGOCwgMHg2MCwgMHgzRiwgMHg2NSwKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHgxMSwgMHg2MCwgMHgxMiwgMHhGMywgMHhFMCwgMHg5QywgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHgxMSwgMHg2MCwgMHgxNSwgMHhGMywgMHhFMCwgMHg5QywgMHhBNCwgMHg4NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyMiwgMHg2MCwKKwkgMHgzMCwgMHg2MSwgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhBMSwgMHhEMywKKwkgMHhFMCwgMHg5QywgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMSwgMHhEQiwgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHg1OSwgMHhEMywgMHhFMCwgMHg5QywgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMSwgMHhEQiwgMHgxMSwgMHg2MCwgMHgxQiwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwgMHgxRSwgMHhGMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwgMHgyMSwgMHhGMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhBMywgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHgxMSwgMHg2MCwgMHgyNCwgMHhGMywgMHhFMCwgMHg5QywKKwkgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHgxMSwgMHg2MCwgMHgyNywgMHhGMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwgMHgyQSwgMHhGMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2MCwgMHg2QSwgMHg2MywKKwkgMHgyMiwgMHg2MCwgMHg1NiwgMHg2MSwgMHgyMSwgMHg2MCwgMHhFQSwgMHg2NCwgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHgxMSwgMHg2MCwKKwkgMHgzMywgMHhGMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwKKwkgMHgxMSwgMHg2MCwgMHgzNywgMHhGMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwgMHgzOSwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwgMHg0MCwgMHhGMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwKKwkgMHg0MiwgMHhGMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwgMHg0RSwgMHhGMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywKKwkgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwgMHg1MiwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwgMHg1NCwgMHhGMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwKKwkgMHg1QiwgMHhGMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwgMHg1RCwgMHhGMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywKKwkgMHhBMiwgMHhEQiwgMHhGQSwgMHg2MCwgMHgyQywgMHg2NSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHgwMywKKwkgMHg2MywgMHg0NSwgMHgyMywgMHg2MCwgMHhGMCwgMHg2MywgMHgwNiwgMHg2MSwgMHhBNSwgMHhEMSwgMHhEQSwgMHg4NSwgMHg2NCwgMHg0NCwgMHgwRiwgMHhCNCwKKwkgMHhCRCwgMHhEQiwgMHg2NCwgMHg0NywgMHgwRiwgMHhCNCwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHhGNiwgMHgwMiwgMHhGQSwgMHg2MCwgMHgzMCwgMHg2NSwKKwkgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxNCwgMHgwMywgMHhCRCwgMHhEMywgMHg2MywgMHg0NiwgMHgyNCwgMHg2MCwKKwkgMHg4OCwgMHg2MywgMHgxMiwgMHg2MCwgMHg1MywgMHhGQiwgMHhEQSwgMHg4NSwgMHhCRCwgMHhEQiwgMHgwRSwgMHg2MSwgMHhBNiwgMHhEMSwgMHhEQSwgMHg4NiwKKwkgMHg2NCwgMHg0NCwgMHhGRiwgMHhCNCwgMHhBNSwgMHhEQiwgMHhEQSwgMHg4NSwgMHg2NCwgMHg0NywgMHhGRiwgMHhCNCwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwKKwkgMHhGNSwgMHgwMiwgMHhGQSwgMHg2MCwgMHgzMSwgMHg2NSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMiwgMHgwMywKKwkgMHhCRCwgMHhEMywgMHgxMiwgMHg2MCwgMHg3MSwgMHhGQiwgMHg1QSwgMHg4MSwgMHgxMiwgMHg2MCwgMHg4MCwgMHhGQiwgMHg1QSwgMHg4MiwgMHgxMiwgMHg2MCwKKwkgMHg4RiwgMHhGQiwgMHg1QSwgMHg4MywgMHgxMiwgMHg2MCwgMHg5RSwgMHhGQiwgMHg1QSwgMHg4NCwgMHgwRSwgMHg2MSwgMHhCRCwgMHhEMSwgMHhCRCwgMHhENSwKKwkgMHg2NCwgMHg0NCwgMHhGRiwgMHhCNCwgMHgyMSwgMHhEQiwgMHg1QSwgMHg4MSwgMHg2NCwgMHg0NywgMHhGRiwgMHhCNCwgMHgyMiwgMHhEQiwgMHg1QSwgMHg4MiwKKwkgMHg2NiwgMHg0NCwgMHhGRiwgMHhCNCwgMHgyMywgMHhEQiwgMHg1QSwgMHg4MywgMHg2NiwgMHg0NywgMHhGRiwgMHhCNCwgMHgyNCwgMHhEQiwgMHhDRCwgMHg4MSwKKwkgMHg1QSwgMHg4NCwgMHhFQywgMHgwMiwgMHhGQSwgMHg2MCwgMHg0NywgMHg2NSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxMSwgMHgwMywgMHg2MywgMHg0NSwgMHgyNSwgMHg2MCwgMHg1QSwgMHg2MywgMHhBNSwgMHhEMSwgMHhEQSwgMHg4NSwgMHhCRCwgMHhEOSwgMHgwMiwgMHg2MSwKKwkgMHhBNSwgMHhEMSwgMHhEQSwgMHg4NSwgMHg2NCwgMHg0NywgMHgwMCwgMHg3RSwgMHhCRCwgMHhEQiwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RSwgMHhDRCwgMHg4MSwKKwkgMHhCRCwgMHhEQiwgMHhGNiwgMHgwMiwgMHhGQSwgMHg2MCwgMHgyRSwgMHg2NSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxRiwgMHgwMywgMHg2MywgMHg0NiwgMHhGQywgMHhBMywgMHhBMywgMHhEMywgMHgyNCwgMHg2MCwgMHgwOCwgMHg2MywgMHhDQywgMHg4NCwgMHhFOCwgMHg4NCwKKwkgMHhDQywgMHg4MSwgMHgwMCwgMHgzNiwgMHgwRCwgMHgwMCwgMHg2MywgMHg0NSwgMHhBNiwgMHhEMywgMHg1QSwgMHhEMSwgMHhEQSwgMHg4NiwgMHhGRiwgMHhCNCwKKwkgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NCwgMHg1QywgMHg5MCwgMHhCRCwgMHhEOSwgMHhGRCwgMHgwMiwgMHhDRCwgMHg4MSwgMHg2NiwgMHg0MiwgMHhGNCwgMHgwMiwKKwkgMHg2NiwgMHg0MiwgMHg1QSwgMHhEMywgMHgyNCwgMHg2MCwgMHg0OCwgMHg2NSwgMHhCRCwgMHhEQiwgMHhENywgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMiwKKwkgMHgyNSwgMHg2MCwgMHg2RSwgMHg2MSwgMHhGQSwgMHg2MCwgMHg0NiwgMHg2NSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgwMywgMHhBMSwgMHhERCwgMHhEOSwgMHg4MSwgMHhGQSwgMHg2MCwgMHgyRiwgMHg2NSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHhBMSwgMHhERCwgMHhEOSwgMHg4MSwgMHhGQSwgMHg2MCwgMHgzRSwgMHg2NSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHhBMSwgMHhERCwgMHhEOSwgMHg4MSwgMHhGQSwgMHg2MCwgMHgzRiwgMHg2NSwgMHgyNCwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHhBMSwgMHhERCwgMHhEOSwgMHg4MSwgMHhGQSwgMHg2MCwgMHg0MCwgMHg2NSwKKwkgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHhBMSwgMHhERCwgMHhEOSwgMHg4MSwgMHhGQSwgMHg2MCwKKwkgMHgzQiwgMHg2NSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHhBMSwgMHhERCwgMHhGQSwgMHg2MCwKKwkgMHg0OCwgMHg2NSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHgwMywgMHhCRCwgMHhEMywgMHgyNSwgMHg2MCwKKwkgMHhDQSwgMHg2MSwgMHgwRSwgMHhCNCwgMHhCRCwgMHhEMSwgMHhBMSwgMHhEQiwgMHg2NCwgMHg0NywgMHgwRSwgMHhCNCwgMHhBMywgMHhEMSwgMHg1OSwgMHhEQiwKKwkgMHg2NCwgMHg0NCwgMHgwRSwgMHhCNCwgMHg1OSwgMHhEQiwgMHg2NCwgMHg0NywgMHgwRSwgMHhCNCwgMHg1OSwgMHhEQiwgMHhGQSwgMHg2MCwgMHgyOSwgMHg2NSwKKwkgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHgwNCwgMHhBMywgMHhBMywgMHhEMywgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg2NSwgMHhCNCwgMHg4NCwgMHgxMCwgMHg2MCwgMHgyOSwgMHhGQiwgMHhGQSwgMHg2MCwgMHgyQSwgMHg2NSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgzOSwgMHgwMywgMHgwNCwgMHhBMywgMHhCRCwgMHhEMSwgMHgxMCwgMHg2MCwgMHhDRCwgMHhGMywgMHg2NCwgMHg0MSwKKwkgMHg2NCwgMHg1RSwgMHhBMiwgMHhEQiwgMHg2NCwgMHg0NywgMHg1QSwgMHhEMywgMHg2MCwgMHg1QywgMHg2NCwgMHg1RiwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwKKwkgMHhFMywgMHhGMywgMHhGRiwgMHg2MCwgMHhDMCwgMHhCNSwgMHg2MSwgMHg0MCwgMHg4MCwgMHgyNywgMHgwNSwgMHgwMCwgMHhFOSwgMHg4NywgMHgzRiwgMHhCNCwKKwkgMHhCNCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxRSwgMHgwMCwgMHg2NSwgMHg0NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHhEQywgMHhGMSwgMHhFMSwgMHg4MCwKKwkgMHhGOSwgMHg4MSwgMHhFMSwgMHg4MCwgMHhGOSwgMHg4NCwgMHhGRiwgMHg2MCwgMHg4MCwgMHhCNCwgMHhDMCwgMHg5QywgMHhBMiwgMHhEOSwgMHgxMCwgMHg2MCwKKwkgMHhERiwgMHhGMSwgMHhGRiwgMHhGRiwgMHhDMCwgMHg5QywgMHhBMiwgMHhEOSwgMHgxMCwgMHg2MCwgMHhFNiwgMHhGMSwgMHgwMSwgMHg3RSwgMHg2MCwgMHg0NywKKwkgMHg2MCwgMHg0MSwgMHg2NCwgMHg0NCwgMHhGRSwgMHg2MCwgMHgwMCwgMHhCNSwgMHhDMSwgMHg4NCwgMHgwMSwgMHg2MCwgMHhGRiwgMHhCNCwgMHhCNCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhEQiwgMHg4MywgMHgxMSwgMHg2MCwgMHg2MiwgMHhGRCwgMHhGQSwgMHg2MCwgMHgyQiwgMHg2NSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHgwNCwgMHhBMywgMHhCRCwgMHhEMywgMHgxMCwgMHg2MCwgMHhEMCwgMHhGQiwgMHhBMywgMHhEMywKKwkgMHgxMCwgMHg2MCwgMHg5NCwgMHhGQiwgMHhGQSwgMHg2MCwgMHgzQywgMHg2NSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxRiwgMHgwMywgMHhBMywgMHhEMywgMHhGQywgMHg2MCwgMHhGQywgMHg2NSwgMHhBNCwgMHg4NCwgMHg2MCwgMHg1QywgMHgwMCwgMHg3RSwgMHhDMCwgMHg2MCwKKwkgMHgwMCwgMHhBMCwgMHg2MCwgMHg0MywgMHgwNywgMHgwNCwgMHgxMCwgMHg2MCwgMHhENCwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMywgMHg2MCwgMHhGRiwgMHhCNCwKKwkgMHgzQywgMHg5NCwgMHhBMiwgMHhEQiwgMHgyMSwgMHg2MCwgMHgzMCwgMHg2MSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhDMCwgMHhBMCwgMHg2MCwgMHg0NywKKwkgMHgwNywgMHgwNCwgMHg2MCwgMHg0MywgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMywgMHg2MCwgMHhGRiwgMHhCNCwgMHgzQywgMHg5NCwgMHhBMSwgMHhEQiwKKwkgMHhCOCwgMHhGRSwgMHhCOSwgMHhGRSwgMHhCQSwgMHhGRSwgMHhCQiwgMHhGRSwgMHhCRCwgMHhGRSwgMHhCRiwgMHhGRSwgMHgxNSwgMHg2MCwgMHhDQiwgMHhGMywKKwkgMHgxMiwgMHg2MywgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHgwNCwgMHgwMCwgMHgwQiwgMHg2MCwgMHhFQSwgMHg2MiwgMHg1QSwgMHhERiwgMHhGRSwgMHgxRiwKKwkgMHgxRiwgMHg2MCwgMHhDOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgwNiwgMHg2MywgMHhCRSwgMHhEMywgMHhCRCwgMHhEMSwgMHgwNywgMHgxOCwKKwkgMHhENCwgMHg4MCwgMHgwNSwgMHgxOCwgMHgwMywgMHgwMywgMHhDMywgMHg4MywgMHhDMywgMHg4MywgMHhGNywgMHgwMSwgMHhEQiwgMHg4MywgMHgwMCwgMHhCQywKKwkgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg4NiwgMHhGRCwgMHhCMCwgMHgyNiwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgxMCwgMHhGRCwgMHgzMiwgMHgwMSwKKwkgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgxNCwgMHhGRCwgMHg5NCwgMHgyQiwgMHgwMCwgMHgwMCwgMHgwQSwgMHgwMCwgMHg0MSwgMHhGQSwgMHg0NiwgMHgyMywKKwkgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg0MiwgMHhGQSwgMHg2OCwgMHgyMywgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg0MywgMHhGQSwgMHg4QSwgMHgyMywKKwkgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg0NCwgMHhGQSwgMHhBQywgMHgyMywgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg0NSwgMHhGQSwgMHhDRSwgMHgyMywKKwkgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHgyNSwgMHhGRCwgMHg2MiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwKKworfTsgIC8qIGZ3X2ltYWdlXzNfZGF0YSAqLworCitzdGF0aWMgY29uc3QgaGNmXzggZndfaW1hZ2VfNF9kYXRhW10gPSB7CisJIDB4NkMsIDB4NDAsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODAsIDB4M0UsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4NDEsIDB4RkYsIDB4MzMsIDB4RjMsIDB4MzIsIDB4MTEsIDB4MzEsIDB4MTgsIDB4NDAsIDB4NjQsIDB4M0EsIDB4REIsIDB4MUMsIDB4MDAsIDB4RkYsIDB4RkYsCisJIDB4QzQsIDB4RTIsIDB4MjcsIDB4NDQsIDB4MjAsIDB4MkEsIDB4MDEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4NDIsIDB4NjQsIDB4M0EsIDB4REIsIDB4MjMsIDB4MDAsCisJIDB4NDEsIDB4RkYsIDB4QTMsIDB4NjAsIDB4MzQsIDB4NzgsIDB4RTIsIDB4RkUsIDB4NDAsIDB4NDksIDB4MDIsIDB4NjAsIDB4MDEsIDB4RTEsIDB4MUQsIDB4MDAsCisJIDB4NDQsIDB4RkYsIDB4MUIsIDB4MDksIDB4MjksIDB4NDQsIDB4MTAsIDB4MkEsIDB4MDQsIDB4NzQsIDB4Q0QsIDB4RTIsIDB4MTAsIDB4NjUsIDB4MEIsIDB4MDAsCisJIDB4QTQsIDB4NjAsIDB4NDksIDB4NzgsIDB4QTQsIDB4RTIsIDB4MjksIDB4NDQsIDB4MjAsIDB4MkEsIDB4MEQsIDB4MDAsIDB4MjAsIDB4QUMsIDB4RUMsIDB4MDEsCisJIDB4QTQsIDB4NjAsIDB4NDksIDB4NzgsIDB4NDYsIDB4RkYsIDB4QjQsIDB4ODQsIDB4NDAsIDB4NDksIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODAsIDB4M0UsCisJIDB4QTQsIDB4NjAsIDB4NDksIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjIsIDB4RkYsIDB4MDgsIDB4RTEsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODAsIDB4M0UsCisJIDB4QUEsIDB4NjAsIDB4RjQsIDB4NzgsIDB4NEMsIDB4NEUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QUEsIDB4NjAsIDB4RkIsIDB4NzgsIDB4NDQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QzQsIDB4RTIsIDB4ODQsIDB4RkYsIDB4MjIsIDB4NTgsIDB4ODIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QTQsIDB4NjAsIDB4QjksIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RTEsIDB4MDEsIDB4RkYsIDB4RkYsCisJIDB4MTAsIDB4MjksIDB4RkEsIDB4MDEsIDB4RTQsIDB4RTIsIDB4QUEsIDB4NjAsIDB4QjAsIDB4NzgsIDB4OTQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QzEsIDB4NjAsIDB4MzUsIDB4NzgsIDB4NjQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QUEsIDB4NjAsIDB4OTcsIDB4NzgsIDB4QUMsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4ODAsIDB4MjksIDB4RTIsIDB4MDEsIDB4QUEsIDB4NjAsIDB4RjMsIDB4NzgsIDB4NDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjQsIDB4NjAsIDB4RUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjUsIDB4NjAsIDB4MUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjMsIDB4NjAsIDB4OEIsIDB4NzgsIDB4NDIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjMsIDB4NjAsIDB4QkUsIDB4NzgsIDB4NDMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjMsIDB4NjAsIDB4QkUsIDB4NzgsIDB4NDQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjYsIDB4NjAsIDB4OUQsIDB4NzgsIDB4NDUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjMsIDB4NjAsIDB4QzEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjAsIDB4ODMsIDB4NjQsIDB4ODAsIDB4MjksIDB4MDksIDB4RkIsIDB4QjQsIDB4NjAsIDB4QjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4OTgsIDB4RkYsIDB4QzIsIDB4NjAsIDB4NjksIDB4NzgsIDB4NDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QzEsIDB4NjAsIDB4RTAsIDB4NzgsIDB4OTgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QzAsIDB4NjAsIDB4M0QsIDB4NzgsIDB4OTgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QkYsIDB4NjAsIDB4QjgsIDB4NzgsIDB4OTgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjcsIDB4NjAsIDB4OTYsIDB4NzgsIDB4OTgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODMsIDB4M0UsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QzMsIDB4NjAsIDB4NTgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4NDEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4NDIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4QjAsIDB4RkYsIDB4QjEsIDB4RkYsIDB4NDAsIDB4RkYsIDB4NDMsIDB4RkYsIDB4QzMsIDB4NjAsIDB4NTMsIDB4NzgsIDB4NDQsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4QzMsIDB4NjAsIDB4NTgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4MUMsIDB4NjAsIDB4MjgsIDB4NzgsIDB4NDUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4QzMsIDB4NjAsIDB4NTMsIDB4NzgsIDB4ODQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4QzMsIDB4NjAsIDB4NTIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4Q0EsIDB4NjAsIDB4NzYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RTgsIDB4NjAsIDB4NkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4NDIsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODUsIDB4M0UsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4Q0EsIDB4NjAsIDB4N0UsIDB4NzgsIDB4MjQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RTYsIDB4NjAsIDB4MkEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4Q0EsIDB4NjAsIDB4N0UsIDB4NzgsIDB4NDQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4Q0EsIDB4NjAsIDB4N0UsIDB4NzgsIDB4ODQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4Q0EsIDB4NjAsIDB4N0UsIDB4NzgsIDB4NDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RjAsIDB4NjAsIDB4OUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RjAsIDB4NjAsIDB4Q0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RjAsIDB4NjAsIDB4RTMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RjAsIDB4NjAsIDB4QzcsIDB4NzgsIDB4MjgsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RjAsIDB4NjAsIDB4QzcsIDB4NzgsIDB4NDQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RjAsIDB4NjAsIDB4QzcsIDB4NzgsIDB4NDUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RjAsIDB4NjAsIDB4QzcsIDB4NzgsIDB4NDYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjAsIDB4ODcsIDB4NjQsIDB4ODAsIDB4MjksIDB4MDksIDB4RkIsIDB4NDcsIDB4RkYsIDB4RjAsIDB4NjAsIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4NDMsIDB4RjcsIDB4QTcsIDB4RkYsIDB4NDEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4QTIsIDB4NjAsIDB4MDAsIDB4NzgsIDB4NDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MkUsIDB4NjAsIDB4NTQsIDB4NjMsIDB4MjAsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjEsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjIsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MjMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjQsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjYsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MjcsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjgsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjksIDB4NDQsIDB4QkQsIDB4REIsIDB4MkEsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MkIsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkQsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkUsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MkYsIDB4NDQsIDB4QkQsIDB4REIsIDB4MTcsIDB4NjAsIDB4MjQsIDB4RkQsIDB4MkYsIDB4NjAsIDB4NzQsIDB4NjMsIDB4MTcsIDB4NjAsIDB4MjUsIDB4RkQsCisJIDB4MzAsIDB4NDQsIDB4MTcsIDB4NjAsIDB4MjYsIDB4RkIsIDB4MzEsIDB4NDQsIDB4MTcsIDB4NjAsIDB4MjcsIDB4RkIsIDB4MzIsIDB4NDQsIDB4MTcsIDB4NjAsCisJIDB4MjgsIDB4RkIsIDB4MzMsIDB4NDQsIDB4MTcsIDB4NjAsIDB4MjksIDB4RkIsIDB4ODEsIDB4RkYsIDB4OTEsIDB4RkYsIDB4NTgsIDB4NTEsIDB4NDQsIDB4MDAsCisJIDB4ODIsIDB4RkYsIDB4OTIsIDB4RkYsIDB4NTgsIDB4NTEsIDB4NDAsIDB4MDAsIDB4ODMsIDB4RkYsIDB4OTMsIDB4RkYsIDB4NTgsIDB4NTEsIDB4M0MsIDB4MDAsCisJIDB4ODQsIDB4RkYsIDB4OTQsIDB4RkYsIDB4NTgsIDB4NTEsIDB4MzgsIDB4MDAsIDB4ODUsIDB4RkYsIDB4OTUsIDB4RkYsIDB4NTgsIDB4NTEsIDB4MzQsIDB4MDAsCisJIDB4ODYsIDB4RkYsIDB4OTYsIDB4RkYsIDB4NTgsIDB4NTEsIDB4MzAsIDB4MDAsIDB4ODcsIDB4RkYsIDB4OTcsIDB4RkYsIDB4NTgsIDB4NTEsIDB4MkMsIDB4MDAsCisJIDB4ODAsIDB4RkYsIDB4OTAsIDB4RkYsIDB4OTksIDB4RkYsIDB4MTcsIDB4NjAsIDB4MjQsIDB4RjEsIDB4MzAsIDB4NDQsIDB4NjQsIDB4NDMsIDB4QkQsIDB4REIsCisJIDB4MzEsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzIsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzQsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MzUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzYsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzcsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzgsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MzksIDB4NDQsIDB4QkQsIDB4REIsIDB4M0EsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0IsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0MsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4M0QsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0UsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0YsIDB4NDQsIDB4QkQsIDB4REIsIDB4RUUsIDB4NjAsIDB4NDgsIDB4NjQsCisJIDB4MEEsIDB4RkIsIDB4NDAsIDB4MjEsIDB4RkUsIDB4MDEsIDB4NzAsIDB4MDAsIDB4NDIsIDB4NTAsIDB4NDAsIDB4NTMsIDB4MTcsIDB4NjAsIDB4MjUsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4NDAsIDB4NTIsIDB4MzMsIDB4NDQsIDB4MzIsIDB4NDIsIDB4QTIsIDB4REIsIDB4REEsIDB4ODIsIDB4QTIsIDB4REQsIDB4REEsIDB4ODMsCisJIDB4NjUsIDB4NDQsIDB4QkQsIDB4REIsIDB4NjEsIDB4NDQsIDB4QkQsIDB4REIsIDB4NjYsIDB4NDQsIDB4QkQsIDB4REIsIDB4QkQsIDB4RDksIDB4MzAsIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4OTksIDB4RkYsIDB4QTQsIDB4NEMsIDB4QkQsIDB4REIsIDB4QTUsIDB4NEMsIDB4QkQsIDB4REIsIDB4QTAsIDB4NEMsIDB4QkQsIDB4REIsCisJIDB4QTEsIDB4NEMsIDB4QkQsIDB4REIsIDB4OTgsIDB4RkYsIDB4MTcsIDB4NjAsIDB4MjUsIDB4RkQsIDB4MTcsIDB4NjAsIDB4MjYsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4NDAsIDB4NTAsIDB4MTcsIDB4NjAsIDB4MjgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NTIsIDB4MTcsIDB4NjAsIDB4MjksIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4NDAsIDB4NTMsIDB4MzEsIDB4NDEsIDB4MTcsIDB4NjAsIDB4MjcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NTEsIDB4MTcsIDB4NjAsIDB4MjQsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDMsIDB4MjAsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjEsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjIsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MjMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjQsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjYsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MjcsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjgsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjksIDB4NDQsIDB4QkQsIDB4REIsIDB4MkEsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MkIsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkQsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkUsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MkYsIDB4NDQsIDB4QkQsIDB4REIsIDB4MTcsIDB4NjAsIDB4MjQsIDB4RkQsIDB4NjEsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4NjAsIDB4NzYsIDB4NjMsCisJIDB4QTMsIDB4RDMsIDB4MzMsIDB4NUMsIDB4MDIsIDB4QTQsIDB4QkQsIDB4REIsIDB4RkUsIDB4QjQsIDB4RTAsIDB4ODUsIDB4QzQsIDB4ODUsIDB4NDcsIDB4RDksCisJIDB4MzQsIDB4NDQsIDB4NUIsIDB4REIsIDB4NDQsIDB4RjMsIDB4NUIsIDB4REIsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODcsIDB4M0UsIDB4RkYsIDB4MDEsCisJIDB4ODIsIDB4RTEsIDB4ODAsIDB4RkYsIDB4OTAsIDB4RkYsIDB4ODgsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODcsIDB4M0UsIDB4NDEsIDB4RkYsCisJIDB4MDAsIDB4NjAsIDB4MDMsIDB4RTEsIDB4MjEsIDB4NDYsIDB4NjYsIDB4NDUsIDB4MDAsIDB4RjQsIDB4MkUsIDB4NDQsIDB4MDksIDB4RkEsIDB4NkEsIDB4NjEsCisJIDB4N0YsIDB4NjAsIDB4RkUsIDB4NjMsIDB4QTEsIDB4RkYsIDB4OUEsIDB4RkYsIDB4MDUsIDB4MTEsIDB4MEEsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDEsIDB4RjIsCisJIDB4MTcsIDB4MTgsIDB4N0EsIDB4NjEsIDB4MDIsIDB4MjUsIDB4MDQsIDB4MDAsIDB4NkMsIDB4NDQsIDB4N0EsIDB4REEsIDB4RkIsIDB4MUMsIDB4RjYsIDB4MTEsCisJIDB4RDksIDB4ODEsIDB4NDEsIDB4RkYsIDB4MDIsIDB4MUMsIDB4MDAsIDB4RjQsIDB4REEsIDB4ODIsIDB4NDEsIDB4RkYsIDB4QzksIDB4ODEsIDB4Q0IsIDB4ODMsCisJIDB4NkMsIDB4NDQsIDB4NUEsIDB4REEsIDB4MDIsIDB4MUMsIDB4MDAsIDB4RjQsIDB4ODEsIDB4RjIsIDB4NkMsIDB4NDQsIDB4NUEsIDB4REEsIDB4Q0IsIDB4ODMsCisJIDB4MDIsIDB4NzQsIDB4MDIsIDB4NjAsIDB4MDQsIDB4RTEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjEsIDB4NUQsIDB4OTMsIDB4QjUsIDB4RkYsIDB4OTgsIDB4RkYsCisJIDB4MjYsIDB4NDQsIDB4RkQsIDB4QjQsIDB4ODQsIDB4QkMsIDB4NDAsIDB4NDYsIDB4NjUsIDB4NDYsIDB4MDAsIDB4NjQsIDB4MjMsIDB4RkEsIDB4M0YsIDB4RkMsCisJIDB4NjMsIDB4NDcsIDB4MEEsIDB4NjMsIDB4MEYsIDB4RkMsIDB4MDAsIDB4RjQsIDB4MDgsIDB4RkEsIDB4Q0IsIDB4RkUsIDB4MTgsIDB4RTEsIDB4NDQsIDB4RkYsCisJIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODAsIDB4M0UsIDB4RTIsIDB4RkUsIDB4MDMsIDB4MDQsIDB4QTMsIDB4NjAsIDB4OTksIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4RTAsIDB4RkUsIDB4MDMsIDB4MDQsIDB4QTMsIDB4NjAsIDB4QUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTEsIDB4RkUsIDB4MDcsIDB4MDUsIDB4OUYsIDB4RkUsCisJIDB4MDMsIDB4MDQsIDB4MTgsIDB4NjAsIDB4MjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDMsIDB4RkYsIDB4QTksIDB4MDEsIDB4RDMsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4QjQsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjQsIDB4MTUsIDB4MDAsIDB4MjksIDB4NDQsIDB4MDgsIDB4MjYsIDB4RTEsIDB4MDEsIDB4NzIsIDB4NDQsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4OTQsIDB4RjMsIDB4RTgsIDB4ODUsIDB4RkYsIDB4QjcsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QjQsIDB4ODUsIDB4NzMsIDB4NDQsIDB4RDQsIDB4ODQsIDB4MTAsIDB4NjUsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MzcsIDB4MDQsIDB4M0YsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MDksIDB4MDAsIDB4MTgsIDB4NjAsIDB4MUMsIDB4RjMsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NTAsCisJIDB4QTQsIDB4NTIsIDB4NUEsIDB4RDMsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NTAsIDB4QTQsIDB4NTAsIDB4QkMsIDB4RjMsIDB4RDIsIDB4RjEsIDB4MDEsIDB4QTgsCisJIDB4MDcsIDB4QTgsIDB4MEEsIDB4MDMsIDB4MDksIDB4MDMsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDksIDB4MDAsIDB4MTgsIDB4NjAsIDB4MDcsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4QjQsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDIsIDB4QUQsIDB4NEYsIDB4RkEsIDB4QjQsIDB4QTAsIDB4NUQsIDB4QUUsIDB4NEYsCisJIDB4MDIsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUUsIDB4M0YsIDB4NDAsIDB4MDIsIDB4MkIsIDB4MTEsIDB4MDAsIDB4MEMsIDB4NjAsIDB4MDAsIDB4NjIsCisJIDB4MDAsIDB4NjAsIDB4NzEsIDB4N0MsIDB4MDAsIDB4NjAsIDB4QjEsIDB4NjUsIDB4MUEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4ODgsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4RTEsIDB4NjIsIDB4RkYsIDB4QTMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTIsIDB4RkYsIDB4MDIsIDB4NjAsIDB4MDgsIDB4RTEsIDB4QkQsIDB4RkUsCisJIDB4OTcsIDB4MDEsIDB4MjEsIDB4NDYsIDB4MDEsIDB4NUQsIDB4NUMsIDB4NjIsIDB4MDMsIDB4RTEsIDB4NDQsIDB4RkYsIDB4QTEsIDB4RkYsIDB4OUEsIDB4RkYsCisJIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4NjIsIDB4NjIsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4QTEsIDB4RkYsCisJIDB4NUEsIDB4REMsIDB4MTIsIDB4RTEsIDB4MDIsIDB4NjAsIDB4MDEsIDB4RTEsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODAsIDB4M0UsIDB4MjgsIDB4NDAsCisJIDB4NDAsIDB4MkIsIDB4MDMsIDB4MDAsIDB4MjksIDB4NDAsIDB4MjAsIDB4MjcsIDB4OTcsIDB4MDAsIDB4QzgsIDB4NzQsIDB4Q0QsIDB4RTIsIDB4MjksIDB4NDQsCisJIDB4MDgsIDB4QkMsIDB4NDAsIDB4NDksIDB4NDQsIDB4RkYsIDB4MDUsIDB4RTEsIDB4MjgsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDcsIDB4MDAsIDB4MjgsIDB4NDAsCisJIDB4NDgsIDB4MzYsIDB4MDQsIDB4MDAsIDB4RDIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsIDB4RDIsIDB4RkIsIDB4MjksIDB4NDQsIDB4RkYsIDB4NjAsCisJIDB4RUYsIDB4NjUsIDB4MjQsIDB4ODksIDB4NDAsIDB4MjcsIDB4M0YsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjksIDB4NDAsIDB4ODAsIDB4MjcsIDB4MEIsIDB4MDAsCisJIDB4MDcsIDB4NjEsIDB4QTEsIDB4RkYsIDB4Q0QsIDB4ODEsIDB4MDQsIDB4MjUsIDB4NjEsIDB4MDAsIDB4ODcsIDB4NEMsIDB4RkIsIDB4MDIsIDB4RjMsIDB4NjAsCisJIDB4QTAsIDB4NjQsIDB4ODAsIDB4NEMsIDB4MDcsIDB4MDAsIDB4QTEsIDB4RkYsIDB4OUMsIDB4NEMsIDB4OUMsIDB4NEMsIDB4OUMsIDB4NEQsIDB4MDUsIDB4NjAsCisJIDB4Q0YsIDB4NjQsIDB4ODAsIDB4NEMsIDB4MjgsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDUsIDB4MDAsIDB4MjksIDB4NDAsIDB4MjAsIDB4MjcsIDB4MDIsIDB4MDAsCisJIDB4MTUsIDB4NjAsIDB4NkYsIDB4NkIsIDB4MDQsIDB4MjUsIDB4NEEsIDB4MDAsIDB4MzAsIDB4NjQsIDB4M0EsIDB4REIsIDB4NDQsIDB4RkYsIDB4MDQsIDB4MjUsCisJIDB4NDUsIDB4MDAsIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MjUsIDB4NDQsIDB4QjQsIDB4ODQsIDB4ODAsIDB4NEUsIDB4MkQsIDB4NDEsIDB4MDQsIDB4MjUsCisJIDB4M0QsIDB4MDAsIDB4NjEsIDB4NEMsIDB4MDAsIDB4NjAsIDB4OEEsIDB4NjUsIDB4QzUsIDB4ODEsIDB4NjEsIDB4NTQsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4MjUsIDB4MzQsIDB4MDAsIDB4NjcsIDB4NEUsIDB4MDcsIDB4NjQsIDB4MUMsIDB4RkIsIDB4MDAsIDB4RTEsIDB4MDIsIDB4NjAsIDB4MDUsIDB4RTEsCisJIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODAsIDB4M0UsIDB4MjgsIDB4NDAsIDB4NDAsIDB4MjcsIDB4MEEsIDB4MDAsIDB4MUMsIDB4NjUsIDB4MjgsIDB4NDAsCisJIDB4QTQsIDB4MzYsIDB4MTQsIDB4NjUsIDB4MjMsIDB4NDQsIDB4QzQsIDB4ODQsIDB4MjgsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MEMsIDB4MDAsIDB4MDcsIDB4MDAsCisJIDB4MjMsIDB4NDQsIDB4MUMsIDB4QTQsIDB4MjksIDB4NDAsIDB4MjAsIDB4MjcsIDB4MDIsIDB4MDAsIDB4MTEsIDB4NjAsIDB4MEYsIDB4NkIsIDB4M0MsIDB4NDYsCisJIDB4OTgsIDB4RjAsIDB4MjMsIDB4NDQsIDB4QzQsIDB4ODQsIDB4MDYsIDB4NzQsIDB4MjUsIDB4NUMsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4QjAsIDB4ODQsIDB4ODAsIDB4NEMsIDB4OUMsIDB4NEMsIDB4NDQsIDB4RkYsIDB4MTgsIDB4RTEsIDB4MEEsIDB4NjQsIDB4MUUsIDB4NzQsCisJIDB4MDIsIDB4NjAsIDB4MDUsIDB4RTEsIDB4NDAsIDB4NDAsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODAsIDB4M0UsIDB4QzQsIDB4RTIsIDB4MjcsIDB4NDQsCisJIDB4MjAsIDB4MkEsIDB4MDYsIDB4MDAsIDB4NDIsIDB4NjQsIDB4M0EsIDB4REIsIDB4NjcsIDB4NEMsIDB4QjAsIDB4NjAsIDB4ODAsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NDEsIDB4NjQsIDB4M0EsIDB4REIsIDB4NjIsIDB4RkYsIDB4MDgsIDB4RTEsIDB4RTIsIDB4RkUsIDB4NzIsIDB4NTIsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsCisJIDB4ODAsIDB4M0UsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODAsIDB4M0UsIDB4MjgsIDB4NDAsIDB4MDgsIDB4MjcsIDB4NjYsIDB4MDEsIDB4M0MsIDB4NDYsCisJIDB4OEIsIDB4RkYsIDB4ODQsIDB4NjAsIDB4MDAsIDB4RTQsIDB4MEYsIDB4NjAsIDB4OTIsIDB4NjQsIDB4QzksIDB4NjAsIDB4NTgsIDB4NEYsIDB4MTAsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4M0YsIDB4RjIsIDB4MDAsIDB4NjAsIDB4MTgsIDB4NzAsIDB4MTgsIDB4NzEsIDB4MjAsIDB4NzIsIDB4MDAsIDB4RjIsIDB4NjAsIDB4NTMsCisJIDB4MjAsIDB4RTEsIDB4QTEsIDB4RkYsIDB4ODgsIDB4NzUsIDB4MDAsIDB4RTEsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NTAsIDB4NzUsIDB4NDQsIDB4MTIsIDB4NzEsCisJIDB4NkUsIDB4NzIsIDB4ODEsIDB4NzUsIDB4RkYsIDB4RkYsIDB4ODgsIDB4RkYsIDB4QTMsIDB4NjAsIDB4QjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzIsIDB4RjMsCisJIDB4MDgsIDB4MjksIDB4MEEsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDcsIDB4MjIsIDB4MDcsIDB4MDAsIDB4RkUsIDB4QjQsIDB4MzIsIDB4RkIsIDB4MjcsIDB4NDQsCisJIDB4MTAsIDB4QkMsIDB4RjcsIDB4QjQsIDB4NDAsIDB4NDcsIDB4NDMsIDB4RkYsIDB4MDAsIDB4NjQsIDB4M0EsIDB4REIsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsCisJIDB4MzEsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MzMsIDB4RkIsIDB4MDEsIDB4NjAsIDB4MEEsIDB4RTEsIDB4RTUsIDB4RkUsCisJIDB4MjcsIDB4MDUsIDB4OUYsIDB4RkUsIDB4MTIsIDB4MDUsIDB4MzEsIDB4NDEsIDB4NDAsIDB4MkEsIDB4MEYsIDB4MDAsIDB4MDcsIDB4NjAsIDB4RUEsIDB4RjEsCisJIDB4QUUsIDB4NEMsIDB4OTAsIDB4ODAsIDB4MTAsIDB4MkEsIDB4MDksIDB4MDAsIDB4N0YsIDB4QjEsIDB4MDcsIDB4NjAsIDB4RUEsIDB4RkIsIDB4NjAsIDB4NDAsCisJIDB4MTAsIDB4MkEsIDB4ODAsIDB4QjksIDB4NDEsIDB4NTEsIDB4REYsIDB4RkUsIDB4MTksIDB4RkYsIDB4MjcsIDB4NDQsIDB4MTAsIDB4MjYsIDB4MTMsIDB4MDAsCisJIDB4OUYsIDB4RkUsIDB4MDIsIDB4MDQsIDB4NDAsIDB4RTEsIDB4MDYsIDB4MDAsIDB4N0MsIDB4RTEsIDB4MzEsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDIsIDB4MDAsCisJIDB4MDQsIDB4MEEsIDB4RkQsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODEsIDB4M0UsIDB4QUYsIDB4NjAsIDB4N0IsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4QUEsIDB4NjAsIDB4QzAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDQsIDB4MDgsIDB4MjYsIDB4RkYsIDB4RkYsIDB4QzAsIDB4NjAsIDB4RUEsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NDgsIDB4RjMsIDB4MzIsIDB4RjEsIDB4MDAsIDB4NjMsIDB4NjQsIDB4NDAsIDB4MDcsIDB4MjYsIDB4MDMsIDB4MDAsIDB4QTUsIDB4NjAsCisJIDB4NkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzEsIDB4NDAsIDB4MDgsIDB4MjYsIDB4RjEsIDB4MDEsIDB4Q0QsIDB4RTIsIDB4ODQsIDB4RTEsIDB4NzAsIDB4NDEsCisJIDB4QUQsIDB4ODAsIDB4NzEsIDB4NDAsIDB4ODAsIDB4MjcsIDB4RUEsIDB4MTIsIDB4MDMsIDB4MDMsIDB4QzEsIDB4NjAsIDB4M0IsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QzQsIDB4RTIsIDB4MzIsIDB4RkQsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4REMsIDB4MDEsIDB4M0MsIDB4NDYsCisJIDB4M0UsIDB4RjIsIDB4MkEsIDB4RjAsIDB4MjcsIDB4NDEsIDB4NDQsIDB4NDgsIDB4MjAsIDB4QjksIDB4MDEsIDB4QjQsIDB4RjcsIDB4QjEsIDB4MEEsIDB4MDMsCisJIDB4NjQsIDB4NDAsIDB4MDgsIDB4MjcsIDB4MDcsIDB4MDAsIDB4MEYsIDB4NjAsIDB4RUUsIDB4NjMsIDB4MDAsIDB4NjQsIDB4NDUsIDB4RkIsIDB4NDYsIDB4RkIsCisJIDB4QkQsIDB4REIsIDB4QTMsIDB4REIsIDB4Q0IsIDB4MEEsIDB4Q0EsIDB4MTEsIDB4NDEsIDB4NDcsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsCisJIDB4MTAsIDB4MjYsIDB4MDQsIDB4MDAsIDB4MDEsIDB4MkEsIDB4MDUsIDB4MDAsIDB4MTAsIDB4MkIsIDB4MDMsIDB4MDAsIDB4MjksIDB4NDcsIDB4MjAsIDB4QkYsCisJIDB4NDAsIDB4NDksIDB4MDUsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4MkEsIDB4RTgsIDB4M0MsIDB4NDYsIDB4MDAsIDB4NjMsIDB4MzIsIDB4RkQsCisJIDB4NDMsIDB4RkYsIDB4MEYsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NzYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NjQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MEUsIDB4MDAsIDB4MUYsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDksIDB4MDAsIDB4MTUsIDB4NjAsIDB4REQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkEsCisJIDB4MDMsIDB4MDAsIDB4QTksIDB4NjAsIDB4ODEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4RjIsIDB4QzAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4QTQsIDB4OUMsCisJIDB4M0YsIDB4NjAsIDB4Q0YsIDB4NjUsIDB4MjksIDB4NDQsIDB4QTQsIDB4ODQsIDB4MzAsIDB4ODksIDB4MTUsIDB4NjAsIDB4RDksIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MTUsIDB4NjAsIDB4RDgsIDB4RkIsIDB4MUYsIDB4RjIsIDB4MzksIDB4RjEsIDB4RTAsIDB4NjAsIDB4RkYsIDB4QjUsIDB4MEEsIDB4MTgsIDB4NjAsIDB4NDcsCisJIDB4MUYsIDB4QjQsIDB4RDAsIDB4ODQsIDB4RTAsIDB4QTAsIDB4MDIsIDB4MEQsIDB4MDAsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDQsIDB4MUYsIDB4NjQsCisJIDB4NjAsIDB4NDcsIDB4QjQsIDB4ODEsIDB4MDcsIDB4NjAsIDB4RUIsIDB4RjEsIDB4RkYsIDB4RkYsIDB4QjEsIDB4OEMsIDB4MjksIDB4NDAsIDB4NDAsIDB4MkIsCisJIDB4MTAsIDB4MDAsIDB4MjIsIDB4NjAsIDB4QzYsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MUYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsCisJIDB4NUEsIDB4RDEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MDksIDB4NkIsIDB4NjAsIDB4NEMsIDB4QjUsIDB4RkYsIDB4NjQsIDB4NEMsCisJIDB4MTQsIDB4MDAsIDB4MjIsIDB4NjAsIDB4QzYsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MUYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsCisJIDB4NUEsIDB4RDEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4RTEsIDB4MDUsIDB4NjAsIDB4NjksIDB4NkIsIDB4NjAsIDB4NEMsIDB4QjUsIDB4RkYsIDB4NjQsIDB4NEMsCisJIDB4N0MsIDB4NDQsIDB4MjksIDB4NDAsIDB4ODAsIDB4MkIsIDB4NjcsIDB4NDQsIDB4NjAsIDB4NEMsIDB4MDAsIDB4RTEsIDB4ODQsIDB4RkYsIDB4QzEsIDB4NjAsCisJIDB4NkIsIDB4NjQsIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsIDB4MEQsIDB4MDAsIDB4RTUsIDB4RkUsIDB4MDMsIDB4MDQsIDB4QUEsIDB4NjAsIDB4QzAsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MzIsIDB4RjEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDcsIDB4MjIsIDB4NDMsIDB4RkYsIDB4QTQsIDB4NjAsIDB4N0MsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4M0MsIDB4NDQsIDB4MEIsIDB4NjQsIDB4M0EsIDB4REIsIDB4MDEsIDB4NjAsIDB4MEEsIDB4RTEsIDB4MUMsIDB4NDIsIDB4MjIsIDB4NDYsCisJIDB4MTMsIDB4RjIsIDB4RkYsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MkEsIDB4RjIsIDB4NDAsIDB4NDUsIDB4NDAsIDB4NDgsIDB4MDQsIDB4MkIsIDB4MTMsIDB4MDAsCisJIDB4MTYsIDB4RjIsIDB4MUQsIDB4RjIsIDB4NDAsIDB4NDMsIDB4MEYsIDB4RjIsIDB4NDAsIDB4NEQsIDB4MEYsIDB4NjQsIDB4MTQsIDB4RjAsIDB4MzUsIDB4RjIsCisJIDB4QTAsIDB4ODIsIDB4MEYsIDB4QjQsIDB4Q0EsIDB4ODUsIDB4RDQsIDB4ODAsIDB4MTAsIDB4RjIsIDB4MDEsIDB4MDIsIDB4MkIsIDB4RkEsIDB4MjcsIDB4NDQsCisJIDB4NDAsIDB4QkMsIDB4NDAsIDB4NDcsIDB4MTMsIDB4MDAsIDB4MTcsIDB4RjIsIDB4MkMsIDB4RjAsIDB4NDAsIDB4NDMsIDB4MUIsIDB4RjIsIDB4MUQsIDB4RkEsCisJIDB4NDAsIDB4NEQsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDIsIDB4MDAsIDB4QUIsIDB4RkMsIDB4MDUsIDB4MDAsIDB4MjgsIDB4NDAsIDB4QTQsIDB4MzYsCisJIDB4MDIsIDB4MDAsIDB4MTEsIDB4RjIsIDB4MkIsIDB4RkEsIDB4MjcsIDB4NDQsIDB4QkYsIDB4QjQsIDB4NDAsIDB4NDcsIDB4RjAsIDB4RkUsIDB4QUYsIDB4NjAsCisJIDB4ODUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjIsIDB4NDYsIDB4MkMsIDB4RjAsIDB4MjcsIDB4NDQsIDB4REYsIDB4QjQsIDB4NDAsIDB4NDcsIDB4NjQsIDB4NDAsCisJIDB4MDEsIDB4MjYsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MTEsIDB4MDAsIDB4MkEsIDB4RjAsIDB4MDEsIDB4NjUsIDB4NjQsIDB4NDAsIDB4QTQsIDB4M0EsCisJIDB4MDQsIDB4NjUsIDB4MjcsIDB4NDQsIDB4MzQsIDB4ODcsIDB4MzYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NTYsIDB4QUQsIDB4RTIsIDB4MDQsIDB4NjQsCisJIDB4M0EsIDB4REIsIDB4NjksIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODEsIDB4M0UsIDB4MDYsIDB4NjQsIDB4M0EsIDB4REIsIDB4MjIsIDB4NDYsCisJIDB4MDEsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4QzEsIDB4NjAsIDB4NDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4NDAsIDB4QzQsIDB4M0EsCisJIDB4MEMsIDB4MDAsIDB4MjcsIDB4NDQsIDB4RkQsIDB4QjQsIDB4NDAsIDB4NDcsIDB4QTgsIDB4RTIsIDB4MDUsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsCisJIDB4MkEsIDB4RTgsIDB4M0MsIDB4NDYsIDB4QTUsIDB4NjAsIDB4MUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0YsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MDUsIDB4MDAsCisJIDB4NjcsIDB4NEMsIDB4MDEsIDB4NjAsIDB4MDAsIDB4RTEsIDB4MDUsIDB4NjAsIDB4NjksIDB4NkIsIDB4MDcsIDB4NjAsIDB4RUMsIDB4RjEsIDB4MUYsIDB4RjIsCisJIDB4MkEsIDB4RTgsIDB4QjAsIDB4ODEsIDB4MjksIDB4NDAsIDB4NDAsIDB4MkIsIDB4MTQsIDB4MDAsIDB4NjEsIDB4NEMsIDB4MjIsIDB4NjAsIDB4QzYsIDB4NjUsCisJIDB4NjEsIDB4NDcsIDB4MUYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NUEsIDB4RDEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4RTEsCisJIDB4MDEsIDB4NjAsIDB4MDksIDB4NkIsIDB4NjAsIDB4NEMsIDB4QjUsIDB4RkYsIDB4RkYsIDB4NjAsIDB4RjIsIDB4NjQsIDB4NjQsIDB4NEMsIDB4NDAsIDB4NDMsCisJIDB4MTgsIDB4MDAsIDB4MjksIDB4NDcsIDB4ODAsIDB4QjcsIDB4MzQsIDB4OTQsIDB4NjAsIDB4NEMsIDB4MjIsIDB4NjAsIDB4QzYsIDB4NjUsIDB4NjEsIDB4NDcsCisJIDB4MUYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NUEsIDB4RDEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4RTEsIDB4MDUsIDB4NjAsCisJIDB4NjksIDB4NkIsIDB4NjAsIDB4NEMsIDB4QjUsIDB4RkYsIDB4NjQsIDB4NEMsIDB4N0MsIDB4NDQsIDB4MjksIDB4NDAsIDB4ODAsIDB4MkIsIDB4NjcsIDB4NDQsCisJIDB4NjAsIDB4NEMsIDB4NDAsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4MjgsIDB4NDUsIDB4QkYsIDB4NjAsIDB4RkYsIDB4NjQsIDB4MjQsIDB4ODgsCisJIDB4QzQsIDB4RTIsIDB4MDgsIDB4NjQsIDB4M0EsIDB4REIsIDB4MjEsIDB4NDYsIDB4MkEsIDB4NDQsIDB4NzIsIDB4NDUsIDB4MjQsIDB4RkEsIDB4OTQsIDB4RjMsCisJIDB4MDYsIDB4MDQsIDB4RTQsIDB4RTIsIDB4REMsIDB4OUMsIDB4MjksIDB4NDAsIDB4MDEsIDB4MjYsIDB4NjQsIDB4NDQsIDB4OTQsIDB4RjksIDB4MjUsIDB4RkEsCisJIDB4OTUsIDB4RjMsIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4OTUsIDB4RkIsIDB4MjgsIDB4RkEsIDB4OTYsIDB4RjMsIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsCisJIDB4OTYsIDB4RkIsIDB4MjksIDB4RkEsIDB4MjQsIDB4NDQsIDB4MDQsIDB4MkEsIDB4MDYsIDB4MDAsIDB4MjgsIDB4NDAsIDB4QTQsIDB4MzYsIDB4MDMsIDB4MDAsCisJIDB4QTcsIDB4NjAsIDB4NDYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OTQsIDB4RkMsIDB4MTMsIDB4NjAsIDB4NEEsIDB4RjEsIDB4MjgsIDB4NDQsIDB4MDgsIDB4MkEsCisJIDB4NTEsIDB4MDAsIDB4MDMsIDB4MkIsIDB4MDEsIDB4MDAsIDB4NEUsIDB4MDAsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4NEIsIDB4MDAsIDB4MzIsIDB4RjIsCisJIDB4MkYsIDB4RjAsIDB4NTAsIDB4RkUsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDEsIDB4NjEsIDB4OEUsIDB4RjMsIDB4MzEsIDB4MDAsIDB4RDAsIDB4ODAsCisJIDB4MzMsIDB4RjIsIDB4MzAsIDB4RjAsIDB4MzQsIDB4RjIsIDB4RDAsIDB4ODAsIDB4MzEsIDB4RjAsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4NjAsIDB4NDcsCisJIDB4MzQsIDB4MEMsIDB4RkYsIDB4QjQsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4MzEsIDB4MTgsIDB4NjAsIDB4NDMsIDB4NTAsIDB4RkUsIDB4NjYsIDB4NDEsIDB4MzIsIDB4RjAsIDB4NjMsIDB4NDYsIDB4MDMsIDB4RjIsIDB4NjEsIDB4NDYsCisJIDB4RDAsIDB4ODAsIDB4MzMsIDB4RjAsIDB4NjMsIDB4NDYsIDB4MDQsIDB4RjIsIDB4NjEsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MzQsIDB4RjAsIDB4NjMsIDB4NDYsCisJIDB4MDUsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MEMsIDB4MDAsIDB4RjIsIDB4NjEsIDB4NDYsIDB4MUEsIDB4MTgsCisJIDB4RTgsIDB4MDEsIDB4MDYsIDB4RjAsIDB4OEUsIDB4RjMsIDB4NjEsIDB4NDYsIDB4MDIsIDB4NjEsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MTIsIDB4MDAsCisJIDB4RkMsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MEUsIDB4NjEsIDB4NDQsIDB4MTQsIDB4RkEsIDB4MTEsIDB4RkMsIDB4MEIsIDB4MDAsIDB4MkMsIDB4RjIsCisJIDB4MkYsIDB4RkEsIDB4MkQsIDB4RjIsIDB4MzAsIDB4RkEsIDB4MkUsIDB4RjIsIDB4MzEsIDB4RkEsIDB4MUQsIDB4RkYsIDB4MjYsIDB4NDQsIDB4MDIsIDB4QkMsCisJIDB4NDAsIDB4NDYsIDB4MUUsIDB4MDAsIDB4MjYsIDB4NDMsIDB4ODQsIDB4QkIsIDB4RkMsIDB4QjMsIDB4MjEsIDB4NDYsIDB4MDEsIDB4NUQsIDB4MEYsIDB4RkMsCisJIDB4NUMsIDB4NDYsIDB4MDUsIDB4RkYsIDB4MjcsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MTMsIDB4MDAsIDB4NTAsIDB4RkUsIDB4MjgsIDB4NDAsIDB4MDgsIDB4M0EsCisJIDB4MTIsIDB4MDAsIDB4MkYsIDB4RjIsIDB4MzAsIDB4RjAsIDB4NjAsIDB4NDMsIDB4MzEsIDB4RjIsIDB4MjIsIDB4NDYsIDB4NjQsIDB4NDEsIDB4MkMsIDB4RjAsCisJIDB4MkQsIDB4RjAsIDB4RDMsIDB4ODAsIDB4MkUsIDB4RjAsIDB4RDEsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MjcsIDB4NDQsIDB4MDksIDB4MEMsIDB4MDMsIDB4MDAsCisJIDB4MjcsIDB4NDQsIDB4MDYsIDB4MjIsIDB4MDUsIDB4MDAsIDB4QjgsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsCisJIDB4RDQsIDB4NjQsIDB4NDAsIDB4NDgsIDB4MEQsIDB4NjQsIDB4M0EsIDB4REIsIDB4MjEsIDB4NDYsIDB4MUMsIDB4RjIsIDB4MDAsIDB4RTEsIDB4RjAsIDB4RkUsCisJIDB4MDAsIDB4NjMsIDB4MjgsIDB4NDQsIDB4QTQsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MDQsIDB4MkIsIDB4MDUsIDB4MDAsIDB4MzAsIDB4RjMsIDB4MkQsIDB4NDUsCisJIDB4RDQsIDB4ODQsIDB4Q0EsIDB4NjUsIDB4RDQsIDB4ODMsIDB4RDQsIDB4NjQsIDB4MzUsIDB4MDAsIDB4MEYsIDB4NjQsIDB4M0EsIDB4REIsIDB4MjEsIDB4NDYsCisJIDB4MjksIDB4NDAsIDB4NDAsIDB4MjcsIDB4MTUsIDB4MDAsIDB4ODAsIDB4MjcsIDB4MDIsIDB4MDAsIDB4Q0EsIDB4NjUsIDB4MDEsIDB4MDAsIDB4NkEsIDB4NjUsCisJIDB4MUMsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4N0YsIDB4NDAsIDB4NDUsIDB4MEEsIDB4MzYsIDB4NzAsIDB4NjQsIDB4MTQsIDB4MzYsIDB4MzgsIDB4NjQsCisJIDB4MzcsIDB4MzYsIDB4MTUsIDB4NjQsIDB4NkUsIDB4M0EsIDB4MTcsIDB4MDAsIDB4ODQsIDB4N0YsIDB4NDAsIDB4NDUsIDB4MEIsIDB4NjQsIDB4MTMsIDB4MDAsCisJIDB4MUMsIDB4RjIsIDB4MUUsIDB4NjUsIDB4NDAsIDB4NDUsIDB4MEIsIDB4MzYsIDB4MUUsIDB4NjQsIDB4MEYsIDB4MzYsIDB4MTYsIDB4NjQsIDB4MEEsIDB4MzYsCisJIDB4MTIsIDB4NjQsIDB4MEUsIDB4MzYsIDB4MEUsIDB4NjQsIDB4MDksIDB4MzYsIDB4MEUsIDB4NjQsIDB4MEQsIDB4MzYsIDB4MEEsIDB4NjQsIDB4MDgsIDB4MzYsCisJIDB4MEEsIDB4NjQsIDB4MEMsIDB4MzYsIDB4MEEsIDB4NjQsIDB4NDAsIDB4NEQsIDB4MDAsIDB4RTEsIDB4RjAsIDB4RkUsIDB4MkIsIDB4RjIsIDB4QzQsIDB4ODUsCisJIDB4RDQsIDB4ODMsIDB4QzQsIDB4NjQsIDB4NDAsIDB4NDgsIDB4MkYsIDB4RjAsIDB4QjAsIDB4RjAsIDB4QjEsIDB4RjIsIDB4QTEsIDB4RkYsIDB4MTIsIDB4NzQsCisJIDB4Q0QsIDB4RTIsIDB4ODAsIDB4NEUsIDB4MTIsIDB4NzQsIDB4ODMsIDB4NEMsIDB4MTIsIDB4NzQsIDB4OUEsIDB4RkYsIDB4ODQsIDB4NEMsIDB4MTIsIDB4NzQsCisJIDB4ODUsIDB4NEMsIDB4MTIsIDB4NzQsIDB4ODEsIDB4NEMsIDB4MTIsIDB4NzQsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4QjEsIDB4NjAsIDB4NTgsIDB4NEYsCisJIDB4MDAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4NzgsIDB4NDQsIDB4MDMsIDB4QTQsIDB4MzUsIDB4RkIsIDB4QjEsIDB4NjAsCisJIDB4NDMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjksIDB4NDQsIDB4RjcsIDB4QjQsIDB4NDAsIDB4NDksIDB4MjcsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDUsIDB4MDAsCisJIDB4RkUsIDB4QjQsIDB4NDAsIDB4NDcsIDB4QTUsIDB4NjAsIDB4Q0QsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTMsIDB4NjAsIDB4MkUsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4MDIsIDB4MzYsIDB4QzEsIDB4RkUsIDB4QTQsIDB4NjAsIDB4NkYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4NDAsIDB4QjQsIDB4M0EsCisJIDB4MEIsIDB4MDAsIDB4MjcsIDB4NDQsIDB4MDcsIDB4MjIsIDB4MDUsIDB4MDAsIDB4RjgsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsCisJIDB4QzAsIDB4RkUsIDB4QTYsIDB4NjAsIDB4REQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4NDQsIDB4RDQsIDB4MzYsIDB4MDMsIDB4MDAsIDB4QTgsIDB4NjAsCisJIDB4NUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTgsIDB4RTIsIDB4MjcsIDB4NDQsIDB4RkIsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MUMsIDB4NDIsIDB4MjIsIDB4NDYsCisJIDB4MTYsIDB4NjAsIDB4MkIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MzQsIDB4RkIsIDB4MkEsIDB4RjAsIDB4RjcsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTAsIDB4ODQsCisJIDB4QTIsIDB4REEsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsIDB4QzQsIDB4MDAsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MjIsIDB4MjYsCisJIDB4M0YsIDB4MDAsIDB4MDEsIDB4MjYsIDB4MDMsIDB4MDAsIDB4MDQsIDB4MjYsIDB4MDUsIDB4MDAsIDB4QkEsIDB4MDAsIDB4MDQsIDB4MkIsIDB4QjgsIDB4MDAsCisJIDB4ODcsIDB4RjUsIDB4MDEsIDB4MDAsIDB4MDcsIDB4RjQsIDB4NEIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4NEIsIDB4RkEsIDB4MEMsIDB4NjAsCisJIDB4RkUsIDB4NjIsIDB4ODAsIDB4RkYsIDB4QzgsIDB4NjAsIDB4NzgsIDB4NDQsIDB4MDIsIDB4QTQsIDB4QTIsIDB4REIsIDB4NDYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4ODIsIDB4RkYsIDB4ODcsIDB4RjMsIDB4NjYsIDB4NUMsIDB4RDAsIDB4ODAsIDB4MDAsIDB4N0MsIDB4MDcsIDB4MDMsIDB4NjYsIDB4NDMsIDB4MjIsIDB4NDYsCisJIDB4MjIsIDB4RjIsIDB4NjMsIDB4NDYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDEsIDB4MDAsIDB4M0MsIDB4RjEsIDB4NEIsIDB4RjAsIDB4NjQsIDB4NDEsCisJIDB4NjQsIDB4NDcsIDB4NjAsIDB4NUYsIDB4MjAsIDB4QkMsIDB4ODAsIDB4MjYsIDB4ODAsIDB4QUMsIDB4NjAsIDB4NDcsIDB4MjIsIDB4NDYsIDB4M0EsIDB4RkEsCisJIDB4NjQsIDB4NDQsIDB4MjAsIDB4N0YsIDB4MzQsIDB4OTQsIDB4M0IsIDB4RkEsIDB4MDgsIDB4NjAsIDB4MDAsIDB4RUEsIDB4MEYsIDB4NjQsIDB4NjAsIDB4N0YsCisJIDB4QTAsIDB4NUEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUEsIDB4ODAsIDB4MDAsCisJIDB4MkEsIDB4RjIsIDB4MDAsIDB4NjAsIDB4N0MsIDB4NjIsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MjQsIDB4MDAsIDB4QTIsIDB4RDMsIDB4MDAsIDB4NjEsCisJIDB4NjAsIDB4RkUsIDB4QTAsIDB4RDMsIDB4NUUsIDB4RDEsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4NjQsIDB4NUYsIDB4REMsIDB4ODQsIDB4RjEsIDB4ODEsCisJIDB4QzAsIDB4MkIsIDB4MDQsIDB4MDAsIDB4ODAsIDB4MkEsIDB4MDIsIDB4MDAsIDB4N0YsIDB4QTQsIDB4REMsIDB4ODQsIDB4RkYsIDB4M0IsIDB4MDMsIDB4MDAsCisJIDB4NjAsIDB4NDcsIDB4REMsIDB4ODcsIDB4MDEsIDB4NjEsIDB4QzAsIDB4ODAsIDB4MDAsIDB4MzYsIDB4REMsIDB4ODQsIDB4NEUsIDB4REIsIDB4NjAsIDB4RkUsCisJIDB4NUEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4QzEsIDB4ODQsIDB4RjAsIDB4MjIsIDB4MTAsIDB4QTQsIDB4RjAsIDB4MkEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjAsIDB4M0UsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RDMsIDB4NUEsIDB4RDEsIDB4M0EsIDB4RkEsCisJIDB4M0IsIDB4RjgsIDB4NzQsIDB4NjIsIDB4QTIsIDB4RDAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDQsIDB4RTAsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsCisJIDB4RTEsIDB4N0YsIDB4NUEsIDB4RDAsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTIsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MDAsIDB4NjAsIDB4NDAsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4QTAsIDB4RDEsIDB4NUEsIDB4RDEsIDB4NjQsIDB4NDUsIDB4NjQsIDB4NDQsIDB4RTMsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsCisJIDB4RTQsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTUsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RTYsIDB4N0YsCisJIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTcsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjUsIDB4NDAsIDB4MEQsIDB4M0EsIDB4MUMsIDB4MDAsCisJIDB4NjQsIDB4NDcsIDB4RTgsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTksIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsCisJIDB4RUEsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RUIsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RUMsIDB4N0YsCisJIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RUQsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RUUsIDB4N0YsIDB4NUEsIDB4RDEsCisJIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RUYsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MDgsIDB4NjAsIDB4MDAsIDB4RUEsIDB4NjUsIDB4NDQsIDB4MDIsIDB4QTQsCisJIDB4NjAsIDB4N0YsIDB4QTAsIDB4NUEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUEsCisJIDB4MEIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4N0YsIDB4QjQsIDB4MEMsIDB4RjAsIDB4MDQsIDB4MDIsIDB4NjQsIDB4NDYsIDB4MDAsIDB4RjAsIDB4MDQsIDB4NjQsCisJIDB4MjIsIDB4NDYsIDB4MDMsIDB4RkEsIDB4NjAsIDB4NDEsIDB4NjQsIDB4NDYsIDB4MDEsIDB4RjIsIDB4RkMsIDB4QTEsIDB4NjEsIDB4NDUsIDB4RDQsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDIsIDB4MDAsIDB4RjAsIDB4MDQsIDB4NjMsIDB4NjQsIDB4NDYsIDB4MDEsIDB4RjIsIDB4MjIsIDB4NDYsIDB4MUEsIDB4RkEsCisJIDB4MDMsIDB4RkMsIDB4MDIsIDB4MDAsIDB4MjIsIDB4NDYsIDB4MUEsIDB4RkEsIDB4MzUsIDB4RjIsIDB4MDQsIDB4RjgsIDB4REMsIDB4ODQsIDB4MzUsIDB4RkEsCisJIDB4MTQsIDB4RjIsIDB4MEYsIDB4QjUsIDB4MEYsIDB4QjQsIDB4Q0MsIDB4ODQsIDB4OTQsIDB4ODAsIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MkEsIDB4RjIsCisJIDB4MDEsIDB4MDIsIDB4OTQsIDB4ODQsIDB4MkEsIDB4RkEsIDB4OTUsIDB4RkMsIDB4MDYsIDB4MDAsIDB4QzQsIDB4M0EsIDB4MDcsIDB4MDAsIDB4MjcsIDB4NDQsCisJIDB4RkQsIDB4QjQsIDB4NDAsIDB4NDcsIDB4QTgsIDB4RTIsIDB4QTUsIDB4NjAsIDB4N0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4NDQsIDB4MDQsIDB4MjYsCisJIDB4MDUsIDB4MDAsIDB4NjgsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MzIsIDB4NDQsIDB4MDAsIDB4MjcsIDB4MDMsIDB4MDAsIDB4QTQsIDB4NjAsIDB4N0MsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEEsIDB4NjQsIDB4M0EsIDB4REIsIDB4QTQsIDB4NjAsIDB4N0MsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NjQsIDB4M0EsIDB4REIsCisJIDB4M0MsIDB4NDQsIDB4NjAsIDB4NDYsIDB4MUUsIDB4RjAsIDB4NDAsIDB4NDIsIDB4NjQsIDB4NDAsIDB4NDAsIDB4MjcsIDB4NDgsIDB4MDAsIDB4MUYsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MjcsIDB4M0MsIDB4MDAsIDB4ODAsIDB4MkIsIDB4MEIsIDB4MDAsIDB4QkYsIDB4NjAsIDB4RkYsIDB4NjUsCisJIDB4MjksIDB4NDQsIDB4MjQsIDB4ODksIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MjksIDB4NDQsIDB4MzQsIDB4ODksIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjMsCisJIDB4MDUsIDB4MDAsIDB4M0YsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjksIDB4NDQsIDB4MjQsIDB4ODksIDB4MDAsIDB4NjMsIDB4MUUsIDB4RjIsIDB4MzksIDB4RjEsCisJIDB4QzAsIDB4NjAsIDB4RkYsIDB4QjUsIDB4MEEsIDB4MTgsIDB4NjAsIDB4NDcsIDB4MUYsIDB4QjQsIDB4RDAsIDB4ODQsIDB4RTAsIDB4QTAsIDB4MDIsIDB4MEQsCisJIDB4MDAsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDQsIDB4MUYsIDB4NjQsIDB4NjAsIDB4NDcsIDB4QjQsIDB4ODQsIDB4MDcsIDB4NjAsIDB4RUIsIDB4RjEsCisJIDB4M0MsIDB4OTQsIDB4QjAsIDB4ODQsIDB4NjAsIDB4NEMsIDB4MjIsIDB4NjAsIDB4QzYsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MUYsIDB4QjQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NUEsIDB4RDEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4RTEsIDB4MDUsIDB4NjAsIDB4NjksIDB4NkIsIDB4NjAsIDB4NEMsCisJIDB4QjUsIDB4RkYsIDB4NjQsIDB4NEMsIDB4N0MsIDB4NDQsIDB4MjksIDB4NDAsIDB4ODAsIDB4MkIsIDB4NjcsIDB4NDQsIDB4NjAsIDB4NEMsIDB4MzIsIDB4MDAsCisJIDB4MTUsIDB4NjAsIDB4REQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MjYsIDB4Q0IsIDB4MDEsIDB4QkYsIDB4MDEsIDB4NDAsIDB4NjAsCisJIDB4MDAsIDB4NjUsIDB4MjksIDB4NDQsIDB4MzQsIDB4ODksIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjMsIDB4OUYsIDB4RjIsIDB4MUUsIDB4RjIsIDB4MzksIDB4RjEsCisJIDB4QzAsIDB4NjAsIDB4RkYsIDB4QjUsIDB4MEEsIDB4MTgsIDB4NjAsIDB4NDcsIDB4MUYsIDB4QjQsIDB4RDAsIDB4ODQsIDB4RTAsIDB4QTAsIDB4MDIsIDB4MEQsCisJIDB4MDAsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDQsIDB4MUYsIDB4NjQsIDB4NjAsIDB4NDcsIDB4QjQsIDB4ODQsIDB4MDcsIDB4NjAsIDB4RUIsIDB4RjEsCisJIDB4M0MsIDB4OTQsIDB4QjAsIDB4ODEsIDB4NjEsIDB4NEMsIDB4MjIsIDB4NjAsIDB4QzYsIDB4NjUsIDB4NjEsIDB4NDcsIDB4MUYsIDB4QjQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NUEsIDB4RDEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MDksIDB4NkIsIDB4NjAsIDB4NEMsCisJIDB4QjUsIDB4RkYsIDB4NjQsIDB4NEMsIDB4NDAsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4ODQsIDB4RkYsIDB4QzEsIDB4NjAsIDB4NkIsIDB4NjQsCisJIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsIDB4MkEsIDB4RjIsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4QTQsIDB4ODQsIDB4QjQsIDB4QkMsIDB4MUUsIDB4RjAsCisJIDB4NDAsIDB4NDgsIDB4NjQsIDB4NDAsIDB4NDAsIDB4MjcsIDB4MTcsIDB4MDAsIDB4MUMsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MEEsIDB4MzYsCisJIDB4MDYsIDB4MDAsIDB4MTQsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MzcsIDB4MzYsIDB4MDgsIDB4MDAsIDB4NkUsIDB4MzYsIDB4MDksIDB4MDAsIDB4NzAsIDB4N0MsCisJIDB4QTAsIDB4NjMsIDB4MEYsIDB4MDAsIDB4MzgsIDB4N0MsIDB4NTAsIDB4NjMsIDB4MEMsIDB4MDAsIDB4MTUsIDB4N0MsIDB4MUUsIDB4NjMsIDB4MDksIDB4MDAsCisJIDB4MEIsIDB4N0MsIDB4MEYsIDB4NjMsIDB4MDYsIDB4MDAsIDB4OUMsIDB4RjQsIDB4RkYsIDB4NjUsIDB4NjMsIDB4NDcsIDB4QTQsIDB4OUMsIDB4QTcsIDB4ODQsCisJIDB4MjMsIDB4MDAsIDB4NDAsIDB4NDUsIDB4NDMsIDB4NEQsIDB4MDAsIDB4RTEsIDB4RjAsIDB4RkUsIDB4MjksIDB4NDAsIDB4ODAsIDB4MkIsIDB4MDMsIDB4MDAsCisJIDB4MDAsIDB4NjAsIDB4NkEsIDB4NjUsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjAsIDB4Q0EsIDB4NjUsIDB4MUYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsCisJIDB4NDAsIDB4MjcsIDB4MEUsIDB4MDAsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MjcsIDB4MDMsIDB4MDAsIDB4NjUsIDB4NDQsCisJIDB4RTAsIDB4ODUsIDB4MTIsIDB4MDAsIDB4MkIsIDB4RjIsIDB4MTEsIDB4RjAsIDB4QzAsIDB4ODQsIDB4RDAsIDB4ODQsIDB4QzQsIDB4ODMsIDB4MTEsIDB4MDAsCisJIDB4MUUsIDB4NjQsIDB4QzQsIDB4ODQsIDB4NjAsIDB4NDUsIDB4MDgsIDB4MDAsIDB4NDAsIDB4NDUsIDB4RkYsIDB4NjAsIDB4RjgsIDB4NjQsIDB4NDAsIDB4NDMsCisJIDB4MDAsIDB4RTEsIDB4RjAsIDB4RkUsIDB4MDAsIDB4NjAsIDB4M0MsIDB4NjUsIDB4OTEsIDB4RjQsIDB4MUIsIDB4RjAsIDB4QzMsIDB4ODQsIDB4QzQsIDB4ODQsCisJIDB4QzAsIDB4ODMsIDB4MjgsIDB4NDQsIDB4QTEsIDB4RkYsIDB4MTIsIDB4NzQsIDB4ODAsIDB4NEUsIDB4MTIsIDB4NzQsIDB4ODMsIDB4NEMsIDB4OUEsIDB4RkYsCisJIDB4MTIsIDB4NzQsIDB4NTYsIDB4NjIsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsCisJIDB4NUMsIDB4NjIsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4QTEsIDB4RkYsCisJIDB4OTgsIDB4RkYsIDB4QjEsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MDAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QkMsIDB4RkYsIDB4QjUsIDB4RkYsIDB4MDEsIDB4NjAsCisJIDB4MTgsIDB4RTEsIDB4NDcsIDB4RkYsIDB4MjcsIDB4NDQsIDB4MDIsIDB4QkMsIDB4NDAsIDB4NDcsIDB4MzYsIDB4RjMsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsCisJIDB4QjQsIDB4RkYsIDB4QzgsIDB4NjAsIDB4MDksIDB4N0QsIDB4N0MsIDB4NEIsIDB4NjAsIDB4NTYsIDB4QUQsIDB4RTIsIDB4QTUsIDB4NjAsIDB4QzcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4REQsIDB4RjMsIDB4MTUsIDB4NjAsIDB4QkUsIDB4RjMsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MjYsIDB4MEIsIDB4MDAsCisJIDB4MDcsIDB4QjQsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MjksIDB4NDQsIDB4QkYsIDB4NjAsIDB4RkYsIDB4QjcsIDB4ODAsIDB4QkYsCisJIDB4NDAsIDB4NDksIDB4ODAsIDB4NjcsIDB4MDUsIDB4MDAsIDB4M0YsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjksIDB4NDQsIDB4MjQsIDB4ODksIDB4MDAsIDB4NjQsCisJIDB4MTIsIDB4NjAsIDB4RDMsIDB4RjEsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4RDgsIDB4RjksIDB4MzksIDB4RjEsIDB4MTIsIDB4NjAsIDB4QkYsIDB4RjEsCisJIDB4NjQsIDB4NDEsIDB4NjQsIDB4NUUsIDB4NjAsIDB4NDUsIDB4NjQsIDB4NDcsIDB4MUYsIDB4QjQsIDB4NTQsIDB4OTQsIDB4RTAsIDB4QTAsIDB4MDIsIDB4MEQsCisJIDB4MDAsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDQsIDB4MUYsIDB4NjQsIDB4NjAsIDB4NDcsIDB4MDcsIDB4NjAsIDB4RUIsIDB4RjEsIDB4QjQsIDB4ODQsCisJIDB4QjAsIDB4OEMsIDB4MjIsIDB4NjAsIDB4QzYsIDB4N0MsIDB4NjAsIDB4NDcsIDB4MUYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4NDAsIDB4RDMsCisJIDB4NUEsIDB4RDEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4RTEsIDB4MDUsIDB4NjAsIDB4NjksIDB4NkIsIDB4NjAsIDB4NEMsIDB4QjUsIDB4RkYsIDB4NjQsIDB4NEMsCisJIDB4N0MsIDB4NDQsIDB4MjksIDB4NDAsIDB4ODAsIDB4MkIsIDB4NjcsIDB4NDQsIDB4NjAsIDB4NEMsIDB4NDAsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsCisJIDB4ODQsIDB4RkYsIDB4QzEsIDB4NjAsIDB4NkIsIDB4NjQsIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsIDB4M0MsIDB4NDQsIDB4NjAsIDB4NDYsIDB4NDAsIDB4NDIsCisJIDB4MTMsIDB4NjQsIDB4M0EsIDB4REIsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4M0MsIDB4NDYsIDB4MkEsIDB4RjIsIDB4MTUsIDB4NjAsIDB4QkUsIDB4RjEsCisJIDB4QTQsIDB4ODQsIDB4QzQsIDB4QkMsIDB4NDAsIDB4NDgsIDB4NjQsIDB4NDQsIDB4MDQsIDB4MjYsIDB4MDksIDB4MDAsIDB4MDIsIDB4MjYsIDB4MEEsIDB4MDAsCisJIDB4MDEsIDB4MjYsIDB4MEIsIDB4MDAsIDB4MDgsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MEIsIDB4NjMsIDB4NkUsIDB4NjQsIDB4MDgsIDB4MDAsIDB4MTUsIDB4NjMsCisJIDB4MzcsIDB4NjQsIDB4MDUsIDB4MDAsIDB4MzgsIDB4NjMsIDB4MTQsIDB4NjQsIDB4MDIsIDB4MDAsIDB4NzAsIDB4NjMsIDB4MEEsIDB4NjQsIDB4NDMsIDB4NEQsCisJIDB4NDAsIDB4NDUsIDB4MDAsIDB4RTEsIDB4RjAsIDB4RkUsIDB4MDAsIDB4NjAsIDB4MUUsIDB4NjQsIDB4MUIsIDB4RjAsIDB4MTEsIDB4RjAsIDB4QzAsIDB4ODQsCisJIDB4QzAsIDB4ODQsIDB4NjAsIDB4NDMsIDB4MjgsIDB4NDQsIDB4QTEsIDB4RkYsIDB4MTIsIDB4NzQsIDB4ODAsIDB4NEUsIDB4MTIsIDB4NzQsIDB4ODMsIDB4NEMsCisJIDB4OUEsIDB4RkYsIDB4MTIsIDB4NzQsIDB4NUMsIDB4NjIsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsCisJIDB4MTIsIDB4NzQsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4QjEsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MDAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjAsCisJIDB4MTgsIDB4RTEsIDB4NzgsIDB4NDQsIDB4MDMsIDB4QTQsIDB4MzUsIDB4RkIsIDB4QjEsIDB4NjAsIDB4NDMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QzQsIDB4RTIsCisJIDB4MDgsIDB4NjQsIDB4M0EsIDB4REIsIDB4QTUsIDB4NjAsIDB4MUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MEUsIDB4MDAsCisJIDB4MUQsIDB4RkYsIDB4MjYsIDB4NDQsIDB4MDIsIDB4QkMsIDB4NDAsIDB4NDYsIDB4MjcsIDB4NDQsIDB4MDcsIDB4MjIsIDB4MDUsIDB4MDAsIDB4RjgsIDB4QjQsCisJIDB4NDAsIDB4NDcsIDB4MDYsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4MzAsIDB4RjEsIDB4NTIsIDB4MDAsIDB4RkMsIDB4QjMsIDB4MzIsIDB4NDAsCisJIDB4MDEsIDB4MkEsIDB4MDYsIDB4MDAsIDB4MEEsIDB4QkIsIDB4MEYsIDB4RkMsIDB4Q0IsIDB4RkUsIDB4QTQsIDB4NjAsIDB4N0MsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjQsIDB4NDQsIDB4MDQsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MEYsIDB4RkMsIDB4MDUsIDB4RkYsIDB4MzAsIDB4RjEsIDB4MjcsIDB4NDQsIDB4MDUsIDB4MjIsCisJIDB4MkMsIDB4MDAsIDB4RkEsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MjQsIDB4NDQsIDB4MTAsIDB4MkEsIDB4MjMsIDB4MDAsIDB4MjgsIDB4NDAsIDB4RDQsIDB4M0EsCisJIDB4MjAsIDB4MDAsIDB4MzEsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MDAsIDB4N0MsIDB4MkIsIDB4NDQsIDB4RDAsIDB4ODAsIDB4NzAsIDB4NDUsIDB4MDIsIDB4MjgsCisJIDB4NjQsIDB4NDQsIDB4QzQsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjQsIDB4MDAsIDB4QjQsIDB4NjAsIDB4NTAsIDB4MDgsIDB4MjgsIDB4MDEsIDB4MDAsCisJIDB4MjAsIDB4MjksIDB4NkQsIDB4RTIsIDB4MUQsIDB4RjAsIDB4QzAsIDB4NjQsIDB4QzAsIDB4ODQsIDB4MEEsIDB4NjAsIDB4N0IsIDB4RjEsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4QzAsIDB4ODQsIDB4QTIsIDB4REIsIDB4QTUsIDB4NjAsIDB4Q0QsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4MDcsIDB4MDAsIDB4MDIsIDB4MkEsIDB4MDUsIDB4MDAsIDB4RkQsIDB4QjQsCisJIDB4NDAsIDB4NDcsIDB4MDYsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4MDUsIDB4NjQsIDB4M0EsIDB4REIsIDB4MjgsIDB4NDQsIDB4QTQsIDB4M0EsCisJIDB4MDcsIDB4MDAsIDB4MDEsIDB4NjAsIDB4MDIsIDB4N0MsIDB4MjUsIDB4NDQsIDB4MEEsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDEsIDB4NjAsIDB4M0EsIDB4N0MsCisJIDB4MzEsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MDAsIDB4N0MsIDB4MkIsIDB4NDQsIDB4RDAsIDB4ODAsIDB4NzAsIDB4NDUsIDB4MDIsIDB4MjgsIDB4NjQsIDB4NDQsCisJIDB4QzQsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjQsIDB4MDAsIDB4QjQsIDB4MjgsIDB4NDAsIDB4RTQsIDB4MzYsIDB4MDAsIDB4QjQsIDB4NjAsIDB4NTAsCisJIDB4MDgsIDB4MjgsIDB4MDEsIDB4MDAsIDB4MjAsIDB4MjksIDB4NkQsIDB4RTIsIDB4QTQsIDB4NjAsIDB4NkYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDQsCisJIDB4MDUsIDB4MjIsIDB4MDksIDB4MDAsIDB4QkEsIDB4QjQsIDB4NDAsIDB4NDcsIDB4M0MsIDB4NDYsIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsCisJIDB4QTQsIDB4NjAsIDB4N0MsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDQsIDB4MDIsIDB4MkEsIDB4MDYsIDB4MDAsIDB4RkQsIDB4QjQsIDB4NDAsIDB4NDcsCisJIDB4MDYsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4RjQsIDB4MDEsIDB4RjMsIDB4MEEsIDB4N0MsIDB4NTAsIDB4NkQsIDB4RTIsIDB4RjAsIDB4MDEsCisJIDB4NzIsIDB4NDUsIDB4REMsIDB4ODQsIDB4OTQsIDB4RkIsIDB4MTEsIDB4NjQsIDB4M0EsIDB4REIsIDB4OTUsIDB4RjMsIDB4MDYsIDB4MDQsIDB4REMsIDB4ODQsCisJIDB4OTUsIDB4RkIsIDB4OTYsIDB4RjMsIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4OTYsIDB4RkIsIDB4QTQsIDB4NjAsIDB4ODcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjEsIDB4MTIsIDB4NjQsIDB4M0EsIDB4REIsIDB4MTgsIDB4NjAsIDB4RUUsIDB4NjMsIDB4QkQsIDB4RDMsIDB4NzIsIDB4NDUsIDB4NDQsIDB4OEEsCisJIDB4MDIsIDB4MjgsIDB4MDMsIDB4MDAsIDB4RTQsIDB4RTIsIDB4REQsIDB4ODEsIDB4MDQsIDB4MDAsIDB4MDIsIDB4MjgsIDB4MDIsIDB4MDAsIDB4RTQsIDB4RTIsCisJIDB4REQsIDB4ODEsIDB4QkQsIDB4RDMsIDB4OTQsIDB4RjEsIDB4NjEsIDB4NDUsIDB4QzAsIDB4ODQsIDB4MDAsIDB4NjEsIDB4MDIsIDB4MjQsIDB4MDEsIDB4QjksCisJIDB4QzQsIDB4ODQsIDB4NjAsIDB4NTUsIDB4MkEsIDB4NTIsIDB4RTQsIDB4RTIsIDB4OTQsIDB4RkIsIDB4MDIsIDB4MjQsIDB4MDEsIDB4QjksIDB4QkQsIDB4RDMsCisJIDB4OTUsIDB4RjEsIDB4NjEsIDB4NDUsIDB4QzAsIDB4ODQsIDB4MDAsIDB4NjEsIDB4MDIsIDB4MjQsIDB4MDEsIDB4QjksIDB4QzQsIDB4ODQsIDB4OTUsIDB4RkIsCisJIDB4MDIsIDB4MjQsIDB4MDEsIDB4QjksIDB4QkQsIDB4RDMsIDB4OTYsIDB4RjEsIDB4NjEsIDB4NDUsIDB4QzAsIDB4ODQsIDB4QzQsIDB4ODQsIDB4OTYsIDB4RkIsCisJIDB4QTUsIDB4NjAsIDB4NzEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QUMsIDB4MDEsIDB4NDcsIDB4RkYsIDB4NDQsIDB4RkYsIDB4QzgsIDB4NzQsIDB4Q0QsIDB4RTIsCisJIDB4QUEsIDB4NjAsIDB4RkUsIDB4NzgsIDB4MDAsIDB4NjEsIDB4QTQsIDB4NjAsIDB4N0MsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NUMsIDB4NDQsIDB4MjYsIDB4NDQsCisJIDB4MDIsIDB4MjYsIDB4MEMsIDB4MDAsIDB4M0UsIDB4NDYsIDB4MDksIDB4RjIsIDB4MUUsIDB4NDEsIDB4MDMsIDB4MUIsIDB4QUMsIDB4NjAsIDB4MTQsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NDAsIDB4NUUsIDB4RkQsIDB4RkIsIDB4MjEsIDB4NDQsIDB4MDIsIDB4NjQsIDB4NDAsIDB4NDYsIDB4NDEsIDB4NUQsIDB4MjEsIDB4NDYsCisJIDB4MDAsIDB4NjQsIDB4MzEsIDB4RkEsIDB4MDAsIDB4RjIsIDB4NDYsIDB4NDUsIDB4ODcsIDB4RkMsIDB4QUMsIDB4RTIsIDB4MDEsIDB4NjQsIDB4MzMsIDB4RkIsCisJIDB4MzIsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MjEsIDB4MDAsIDB4MTksIDB4RjMsIDB4MDEsIDB4NjAsIDB4MUUsIDB4RTEsIDB4MUQsIDB4MTgsIDB4ODAsIDB4NjQsCisJIDB4NDAsIDB4NDksIDB4MDAsIDB4RTEsIDB4MTksIDB4RkYsIDB4MDgsIDB4NjQsIDB4MkEsIDB4RkEsIDB4NUEsIDB4REEsIDB4MkMsIDB4RkEsIDB4NUEsIDB4REEsCisJIDB4NUEsIDB4REEsIDB4RDIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsIDB4RDIsIDB4RkIsIDB4NzIsIDB4NDQsIDB4MjQsIDB4RkEsIDB4OTQsIDB4RjMsCisJIDB4MjUsIDB4RkEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4QzgsIDB4NjAsIDB4MDksIDB4N0QsCisJIDB4N0MsIDB4NEIsIDB4QTQsIDB4NjAsIDB4N0MsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MUEsIDB4RTEsIDB4M0YsIDB4NjAsCisJIDB4Q0YsIDB4NjUsIDB4MjksIDB4NDQsIDB4MjQsIDB4ODksIDB4MkUsIDB4NDQsIDB4MDAsIDB4MzYsIDB4NDEsIDB4MDAsIDB4MDEsIDB4M0EsIDB4QzksIDB4MDAsCisJIDB4ODgsIDB4RkYsIDB4NDAsIDB4NjcsIDB4MjksIDB4NDUsIDB4MzQsIDB4ODksIDB4MDQsIDB4NjQsIDB4ODksIDB4RkYsIDB4NjAsIDB4NTQsIDB4ODgsIDB4RkYsCisJIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDUsIDB4NjUsIDB4NDQsIDB4MEYsIDB4QjQsIDB4NDAsIDB4NDUsIDB4MUMsIDB4RkEsIDB4NjUsIDB4NDQsIDB4MjksIDB4NDEsCisJIDB4RjksIDB4ODEsIDB4NTIsIDB4NEEsIDB4NzEsIDB4ODksIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODMsIDB4MUQsIDB4RkMsCisJIDB4MUIsIDB4RkMsIDB4OTgsIDB4RjEsIDB4RkMsIDB4QTMsIDB4RDMsIDB4ODAsIDB4NDMsIDB4NDMsIDB4MDMsIDB4MDQsIDB4QUMsIDB4NjAsIDB4MEEsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDksIDB4N0MsIDB4RDMsIDB4ODAsIDB4OUEsIDB4RkYsIDB4MDMsIDB4MDcsIDB4QUMsIDB4NjAsIDB4MEEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjUsIDB4NDQsIDB4MDEsIDB4MjYsIDB4MEYsIDB4QUMsIDB4MUYsIDB4NjAsIDB4NTAsIDB4NjUsIDB4NDQsIDB4RDMsIDB4MTIsIDB4NjUsIDB4NDUsIDB4NDYsCisJIDB4NjAsIDB4NDcsIDB4NDAsIDB4N0YsIDB4MjcsIDB4RkEsIDB4OEYsIDB4RkMsIDB4MTgsIDB4NjEsIDB4Q0IsIDB4RjEsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDQsCisJIDB4REMsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MjEsIDB4MDMsIDB4NTAsIDB4RkUsIDB4QUMsIDB4NjAsIDB4MjAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QzgsIDB4NjAsCisJIDB4MEIsIDB4N0QsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NkIsIDB4QjUsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4QUEsIDB4NzQsIDB4Q0QsIDB4RTIsCisJIDB4MDIsIDB4NjQsIDB4ODksIDB4RkYsIDB4NjAsIDB4NTQsIDB4ODgsIDB4RkYsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4MDUsIDB4RTEsIDB4QTEsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjUsIDB4NzYsIDB4MDAsIDB4NkMsIDB4NDQsIDB4MEEsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MTQsIDB4MzYsIDB4MDUsIDB4MDAsCisJIDB4MzcsIDB4MzYsIDB4MDMsIDB4MDAsIDB4NkUsIDB4MzYsIDB4MDEsIDB4MDAsIDB4NkMsIDB4MDAsIDB4NDAsIDB4NDUsIDB4MzIsIDB4NzQsIDB4QTEsIDB4RkYsCisJIDB4MUMsIDB4RkEsIDB4NDAsIDB4NEUsIDB4OEMsIDB4NDQsIDB4NjAsIDB4NDMsIDB4MUQsIDB4RkEsIDB4MDEsIDB4RTEsIDB4MjAsIDB4NjQsIDB4M0EsIDB4REIsCisJIDB4MkUsIDB4NDQsIDB4MTQsIDB4MzYsIDB4MTIsIDB4MDAsIDB4MEEsIDB4MzYsIDB4MEYsIDB4MDAsIDB4NjMsIDB4NDUsIDB4RTMsIDB4ODMsIDB4RTMsIDB4ODMsCisJIDB4QzcsIDB4ODMsIDB4RTMsIDB4ODMsIDB4QzcsIDB4ODMsIDB4RkYsIDB4RkYsIDB4MzcsIDB4MzYsIDB4MDUsIDB4MDAsIDB4NkUsIDB4MzYsIDB4MDQsIDB4MDAsCisJIDB4QUMsIDB4NjAsIDB4MUUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4RkYsIDB4RkYsCisJIDB4ODAsIDB4MjcsIDB4Q0YsIDB4ODMsIDB4MUIsIDB4RkMsIDB4MDEsIDB4NjQsIDB4NEYsIDB4RkIsIDB4QTEsIDB4RkYsIDB4MjksIDB4NDEsIDB4RjksIDB4ODEsCisJIDB4NTIsIDB4NEEsIDB4NzEsIDB4ODksIDB4MkUsIDB4NDQsIDB4MjcsIDB4RkEsIDB4OTgsIDB4RjEsIDB4RkMsIDB4QTMsIDB4RDMsIDB4ODAsIDB4NDMsIDB4NDMsCisJIDB4MDMsIDB4MDQsIDB4QUMsIDB4NjAsIDB4MEEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OUEsIDB4RkYsIDB4NTQsIDB4NjMsIDB4MTIsIDB4NjQsIDB4NDAsIDB4NDYsCisJIDB4OEYsIDB4RkMsIDB4MTgsIDB4NjEsIDB4Q0IsIDB4RjEsIDB4NTAsIDB4RkUsIDB4NkMsIDB4NDAsIDB4OUUsIDB4MTUsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsCisJIDB4ODAsIDB4RTEsIDB4MDAsIDB4NjQsIDB4MzMsIDB4RkIsIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4MDEsIDB4MTEsIDB4MEYsIDB4MDAsIDB4MjksIDB4NDQsCisJIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDksIDB4MDEsIDB4NjQsIDB4MzMsIDB4RkIsIDB4QjYsIDB4RkYsIDB4MDAsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MUEsIDB4RTEsCisJIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkMsIDB4NDAsIDB4RkMsIDB4MTEsIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4QjUsIDB4RkYsIDB4QjYsIDB4RkYsCisJIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4QzgsIDB4NjAsIDB4MDksIDB4N0QsIDB4N0MsIDB4NEIsIDB4MzUsIDB4RTEsIDB4QUMsIDB4RTIsIDB4QUEsIDB4NjAsCisJIDB4OTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTMsIDB4NjAsIDB4MDIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4MDAsIDB4MzYsIDB4MDAsIDB4M0IsCisJIDB4QTIsIDB4REIsIDB4MjEsIDB4NjQsIDB4M0EsIDB4REIsIDB4RDIsIDB4MDEsIDB4MjUsIDB4NjAsIDB4RjIsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsCisJIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MkEsIDB4NjQsIDB4M0EsIDB4REIsIDB4NUMsIDB4NDEsIDB4QzgsIDB4MDEsIDB4MjksIDB4NjQsIDB4M0EsIDB4REIsCisJIDB4ODgsIDB4NjAsIDB4ODUsIDB4NzEsIDB4OEQsIDB4RTIsIDB4QTIsIDB4RkMsIDB4MzIsIDB4NDAsIDB4MDEsIDB4MkEsIDB4QTgsIDB4MDAsIDB4MDEsIDB4NjAsCisJIDB4MUEsIDB4RTEsIDB4MjMsIDB4NDMsIDB4QTEsIDB4RkYsIDB4RUMsIDB4NDQsIDB4MkEsIDB4RkEsIDB4NDAsIDB4NDgsIDB4QTEsIDB4RkYsIDB4N0EsIDB4REMsCisJIDB4N0UsIDB4MzYsIDB4MDQsIDB4QTIsIDB4RkMsIDB4MUMsIDB4MDMsIDB4MUQsIDB4MDAsIDB4NjQsIDB4M0YsIDB4RkEsIDB4MkUsIDB4MDAsIDB4MDMsIDB4MkIsCisJIDB4MDQsIDB4MDAsIDB4QTEsIDB4RkYsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4OEYsIDB4QjAsIDB4ODgsIDB4M0EsIDB4MDMsIDB4MDAsCisJIDB4NzAsIDB4NjIsIDB4QTEsIDB4RkYsIDB4N0EsIDB4REMsIDB4MjgsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDYsIDB4MDAsIDB4NzIsIDB4NjIsIDB4QTEsIDB4RkYsCisJIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4M0YsIDB4RkMsIDB4MDAsIDB4RjQsIDB4MTAsIDB4NjIsIDB4NkUsIDB4NjEsCisJIDB4QTEsIDB4RkYsIDB4MDUsIDB4MUQsIDB4MTIsIDB4MUUsIDB4MEMsIDB4MDAsIDB4MDAsIDB4RjQsIDB4N0MsIDB4NjEsIDB4MDIsIDB4NjIsIDB4N0EsIDB4REMsCisJIDB4NjMsIDB4NDAsIDB4RkQsIDB4MUMsIDB4RjksIDB4MUQsIDB4RkYsIDB4QjEsIDB4MDgsIDB4MUUsIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjIsCisJIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDQsIDB4NUEsIDB4REEsIDB4OTgsIDB4RkYsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDAsCisJIDB4QTEsIDB4RkYsIDB4NDcsIDB4RkYsIDB4N0MsIDB4NDQsIDB4MzMsIDB4RkIsIDB4MjYsIDB4NDQsIDB4RkQsIDB4QjQsIDB4ODQsIDB4QkMsIDB4MDEsIDB4MTUsCisJIDB4N0YsIDB4QjQsIDB4NDAsIDB4NDYsIDB4NkMsIDB4NDAsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDUsIDB4QTEsIDB4RkYsCisJIDB4N0YsIDB4NjAsIDB4N0YsIDB4N0MsIDB4NkMsIDB4NDQsIDB4QTAsIDB4ODQsIDB4MTUsIDB4QTcsIDB4MTUsIDB4QTQsIDB4MjEsIDB4NDYsIDB4MjYsIDB4RkEsCisJIDB4MjksIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDcsIDB4MDAsIDB4QjYsIDB4RkYsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDQsCisJIDB4MUEsIDB4RkEsIDB4MDksIDB4MDAsIDB4NjUsIDB4NDQsIDB4MEYsIDB4QjQsIDB4MDYsIDB4QTgsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MDgsIDB4MjgsCisJIDB4N0MsIDB4NDUsIDB4MjksIDB4NDQsIDB4MzQsIDB4ODksIDB4MjcsIDB4RjAsIDB4NjUsIDB4NDQsIDB4NjQsIDB4NUUsIDB4MjcsIDB4RkEsIDB4ODEsIDB4RTEsCisJIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4MDEsIDB4MTEsIDB4MEYsIDB4MDAsIDB4MjksIDB4NDQsIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDksIDB4MDEsIDB4NjQsCisJIDB4MzMsIDB4RkIsIDB4QjYsIDB4RkYsIDB4MDAsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MUEsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkMsIDB4NDAsCisJIDB4RkMsIDB4MTEsIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4MjEsIDB4NDYsIDB4QjUsIDB4RkYsIDB4QkMsIDB4RkYsIDB4NDcsIDB4RkYsIDB4QjYsIDB4RkYsCisJIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4QzgsIDB4NjAsIDB4MDksIDB4N0QsIDB4N0MsIDB4NEIsIDB4MjYsIDB4NDMsIDB4MkEsIDB4NDQsIDB4NzIsIDB4NDUsCisJIDB4MjQsIDB4RkEsIDB4OTQsIDB4RjMsIDB4MDYsIDB4MDQsIDB4RTQsIDB4RTIsIDB4REMsIDB4OUMsIDB4MjksIDB4NDAsIDB4MDEsIDB4MjYsIDB4NjQsIDB4NDQsCisJIDB4OTQsIDB4RjksIDB4MjUsIDB4RkEsIDB4OTUsIDB4RjMsIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4OTUsIDB4RkIsIDB4MjgsIDB4RkEsIDB4OTYsIDB4RjMsCisJIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4OTYsIDB4RkIsIDB4MjksIDB4RkEsIDB4QUEsIDB4NjAsIDB4MUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsCisJIDB4MTIsIDB4NjEsIDB4OEMsIDB4NDQsIDB4Q0MsIDB4RjAsIDB4MkEsIDB4RkEsIDB4NDAsIDB4NDgsIDB4MDQsIDB4MjYsIDB4NDMsIDB4MDAsIDB4QTEsIDB4RkYsCisJIDB4OEMsIDB4NDQsIDB4NUEsIDB4REEsIDB4MzAsIDB4RkIsIDB4NkMsIDB4NDQsIDB4MkMsIDB4RkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MjYsIDB4MjYsIDB4MDAsCisJIDB4RDAsIDB4ODAsIDB4QTEsIDB4RkYsIDB4OEMsIDB4NDQsIDB4NkMsIDB4NUMsIDB4MDAsIDB4RTEsIDB4RjIsIDB4RkUsIDB4MkQsIDB4RkEsIDB4Q0QsIDB4RjMsCisJIDB4RDQsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MkUsIDB4RjgsIDB4MjQsIDB4NDQsIDB4MTYsIDB4MEMsIDB4MzIsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDcsIDB4MDAsCisJIDB4MjgsIDB4NDIsIDB4MEMsIDB4QjIsIDB4MDgsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MTAsIDB4QkMsIDB4NDAsIDB4NDQsIDB4NUMsIDB4MDAsIDB4MDQsIDB4MEEsCisJIDB4QTEsIDB4RkYsIDB4QUMsIDB4NjAsIDB4MTMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTEsIDB4QkMsIDB4NDAsIDB4NDQsIDB4MjgsIDB4NDUsIDB4QkYsIDB4NjAsCisJIDB4RkYsIDB4NjQsIDB4MjQsIDB4ODgsIDB4NTAsIDB4MDAsIDB4MzAsIDB4QkMsIDB4NDAsIDB4NDQsIDB4NEQsIDB4MDAsIDB4MjAsIDB4QjksIDB4NUMsIDB4OEUsCisJIDB4QTEsIDB4RkYsIDB4OEMsIDB4NDQsIDB4MkQsIDB4RkEsIDB4REMsIDB4OUMsIDB4NkMsIDB4NDQsIDB4MDAsIDB4RTEsIDB4RjIsIDB4RkUsIDB4MkUsIDB4RkEsCisJIDB4MDgsIDB4MjgsIDB4NDQsIDB4NEUsIDB4REMsIDB4ODQsIDB4MkUsIDB4NUMsIDB4QjAsIDB4ODQsIDB4RUYsIDB4QjEsIDB4MDgsIDB4MjQsIDB4NDAsIDB4QjksCisJIDB4NDEsIDB4NDYsIDB4MzksIDB4MDAsIDB4MjMsIDB4NDEsIDB4MTMsIDB4NjQsIDB4NTEsIDB4OTAsIDB4NTYsIDB4NjMsIDB4MDMsIDB4MDQsIDB4QUMsIDB4NjAsCisJIDB4MEEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OEMsIDB4NDQsIDB4MDQsIDB4NjEsIDB4MkIsIDB4RkEsIDB4NTAsIDB4RkUsIDB4ODAsIDB4MjcsIDB4MDAsIDB4NjQsCisJIDB4MzAsIDB4RkIsIDB4OEMsIDB4NDQsIDB4MkMsIDB4RkEsIDB4RDAsIDB4ODAsIDB4OEMsIDB4NDQsIDB4MkQsIDB4RkEsIDB4RDQsIDB4ODAsIDB4MDAsIDB4NjUsCisJIDB4OEMsIDB4NDQsIDB4Q0QsIDB4RjEsIDB4MkUsIDB4RkEsIDB4RDAsIDB4ODAsIDB4MjgsIDB4NDQsIDB4MDMsIDB4MEMsIDB4QTAsIDB4MkEsIDB4MEEsIDB4MDAsCisJIDB4MTEsIDB4MDAsIDB4MTAsIDB4NjUsIDB4NjAsIDB4NDAsIDB4QzQsIDB4MzYsIDB4MDQsIDB4MDAsIDB4RDQsIDB4M0EsIDB4MDgsIDB4MDAsIDB4MjcsIDB4NDAsCisJIDB4NDAsIDB4MjYsIDB4MzAsIDB4NjUsIDB4MDAsIDB4NjQsIDB4M0YsIDB4RkEsIDB4NDYsIDB4NEUsIDB4MzUsIDB4ODQsIDB4NjYsIDB4MDAsIDB4NDAsIDB4MjYsCisJIDB4RjksIDB4MDEsIDB4MzAsIDB4NjUsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4MDQsIDB4NjEsIDB4RjMsIDB4MDEsIDB4QTEsIDB4RkYsCisJIDB4QUIsIDB4NjAsIDB4RTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjAsIDB4RkUsIDB4NjUsIDB4MjMsIDB4NDMsIDB4RTgsIDB4QTMsIDB4ODAsIDB4MjcsCisJIDB4RjYsIDB4MDEsIDB4MjAsIDB4RTYsIDB4MDgsIDB4NjAsIDB4MDAsIDB4RUIsIDB4MjgsIDB4NDQsIDB4MDMsIDB4MkIsIDB4MDUsIDB4MDAsIDB4NkEsIDB4NjIsCisJIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4MjgsIDB4NDQsIDB4OEYsIDB4QjAsIDB4ODgsIDB4M0EsIDB4MDMsIDB4MDAsIDB4NzAsIDB4NjIsCisJIDB4N0EsIDB4REMsIDB4MjgsIDB4NDQsIDB4NDAsIDB4MkIsIDB4MEQsIDB4MDAsIDB4NzIsIDB4NjIsIDB4N0EsIDB4REMsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NUMsCisJIDB4NUEsIDB4RDgsIDB4RTQsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MDMsIDB4MDAsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4RjgsIDB4QTMsIDB4MjUsIDB4RkYsCisJIDB4QjAsIDB4RkYsIDB4M0YsIDB4RkMsIDB4MDAsIDB4RjQsIDB4MTAsIDB4NjIsIDB4MTAsIDB4NjEsIDB4NTcsIDB4OTAsIDB4NkMsIDB4NjEsIDB4QTEsIDB4RkYsCisJIDB4MDksIDB4MDcsIDB4MDIsIDB4MUQsIDB4MkEsIDB4MUUsIDB4MjEsIDB4MDAsIDB4Q0IsIDB4ODMsIDB4N0EsIDB4REMsIDB4RkUsIDB4MUMsIDB4RDksIDB4ODEsCisJIDB4MjQsIDB4MUUsIDB4MUIsIDB4MDAsIDB4Q0IsIDB4ODMsIDB4MEUsIDB4QTMsIDB4QTcsIDB4ODQsIDB4RjIsIDB4QTMsIDB4N0EsIDB4REMsIDB4RkUsIDB4MUMsCisJIDB4MDUsIDB4MUQsIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4N0MsIDB4QTgsIDB4RDksIDB4ODEsIDB4MEEsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjIsCisJIDB4QTcsIDB4ODQsIDB4N0EsIDB4NjEsIDB4N0EsIDB4REMsIDB4RkUsIDB4MUMsIDB4RjksIDB4MUQsIDB4N0MsIDB4QTgsIDB4RDksIDB4ODEsIDB4RjYsIDB4MDMsCisJIDB4RkYsIDB4QjEsIDB4MEIsIDB4MUUsIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjIsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QjYsIDB4RkYsCisJIDB4QjcsIDB4RkYsIDB4NkMsIDB4NDQsIDB4NUEsIDB4REEsIDB4Q0QsIDB4ODEsIDB4NjQsIDB4NDAsIDB4NDYsIDB4NDUsIDB4MjgsIDB4NDQsIDB4NDAsIDB4MkIsCisJIDB4MEUsIDB4MDAsIDB4NjQsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MEIsIDB4MDAsIDB4MDEsIDB4QTIsIDB4NjIsIDB4NDQsIDB4NDYsIDB4NDUsIDB4MjEsIDB4NDYsCisJIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjIsIDB4OUEsIDB4RkYsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4OTgsIDB4RkYsCisJIDB4MDAsIDB4RTYsIDB4MDEsIDB4RjIsIDB4NjEsIDB4NDUsIDB4RDQsIDB4OUUsIDB4MjEsIDB4NDYsIDB4MTYsIDB4RkEsIDB4MjUsIDB4NDQsIDB4MDYsIDB4RkEsCisJIDB4QTEsIDB4RkYsIDB4OEMsIDB4NDQsIDB4QTEsIDB4RkYsIDB4NDcsIDB4RkYsIDB4NTAsIDB4NEIsIDB4NjcsIDB4NTAsIDB4NjksIDB4RTIsIDB4MjUsIDB4NDYsCisJIDB4MDEsIDB4RjIsIDB4NjEsIDB4NDUsIDB4RDQsIDB4OUUsIDB4MjEsIDB4NDYsIDB4MTYsIDB4RkEsIDB4MjUsIDB4NDUsIDB4ODYsIDB4RjgsIDB4RkYsIDB4RkYsCisJIDB4NkEsIDB4NDQsIDB4NDAsIDB4MkIsIDB4MDMsIDB4MTUsIDB4QUYsIDB4NjAsIDB4MTAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjksIDB4NDAsIDB4MTAsIDB4MjYsCisJIDB4MDQsIDB4MDAsIDB4MDQsIDB4NzQsIDB4Q0QsIDB4RTIsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkMsIDB4NDQsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsCisJIDB4QzQsIDB4RTIsIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4MDUsIDB4NzYsIDB4QUQsIDB4RTIsIDB4NDEsIDB4RTEsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDUsCisJIDB4QTEsIDB4RkYsIDB4NjUsIDB4NDEsIDB4N0YsIDB4NjAsIDB4N0YsIDB4N0MsIDB4NkMsIDB4NDQsIDB4QTAsIDB4ODQsIDB4MTUsIDB4QTcsIDB4MTUsIDB4QTQsCisJIDB4MjEsIDB4NDYsIDB4MjYsIDB4RkEsIDB4MjIsIDB4NDYsIDB4MTAsIDB4RkEsIDB4MjEsIDB4NDYsIDB4MjksIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDcsIDB4MDAsCisJIDB4QjYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4NkMsIDB4NDQsIDB4MUEsIDB4RkEsIDB4MDksIDB4MDAsIDB4NjUsIDB4NDQsCisJIDB4MEYsIDB4QjQsIDB4MDYsIDB4QTgsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MDgsIDB4MjgsIDB4N0MsIDB4NDUsIDB4MjksIDB4NDQsIDB4MzQsIDB4ODksCisJIDB4MjcsIDB4RjAsIDB4NjUsIDB4NDcsIDB4MUYsIDB4QjEsIDB4MzQsIDB4OTcsIDB4NjQsIDB4NUUsIDB4MDcsIDB4NjAsIDB4RjUsIDB4RjEsIDB4MjksIDB4NDAsCisJIDB4NDAsIDB4MkIsIDB4MDQsIDB4MDAsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MjYsIDB4MTAsIDB4NjAsIDB4MDAsIDB4QkMsIDB4MjcsIDB4RkEsIDB4MDEsIDB4NjAsCisJIDB4MTgsIDB4RTEsIDB4MDAsIDB4NjQsIDB4MzMsIDB4RkIsIDB4QTgsIDB4RTIsIDB4MDUsIDB4RTEsIDB4MjgsIDB4NDAsIDB4MDMsIDB4MjYsIDB4Q0UsIDB4MDAsCisJIDB4MzEsIDB4NDAsIDB4MjAsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MjgsIDB4NDAsIDB4NTAsIDB4M0EsIDB4QzgsIDB4MDAsIDB4MjQsIDB4NDQsIDB4MjAsIDB4MkEsCisJIDB4QzUsIDB4MDAsIDB4MkIsIDB4NDQsIDB4QUMsIDB4ODAsIDB4MjgsIDB4NDAsIDB4QjQsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MDIsIDB4MDMsIDB4MzAsIDB4RkIsCisJIDB4QkQsIDB4MDAsIDB4MjgsIDB4NDQsIDB4QkYsIDB4NjAsIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsIDB4NDAsIDB4NDgsIDB4MkIsIDB4NTAsIDB4QTEsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4MUMsIDB4RjIsIDB4QzQsIDB4RTIsIDB4NDAsIDB4NDUsIDB4MjgsIDB4NDAsIDB4QzQsIDB4MzYsCisJIDB4OUQsIDB4MDAsIDB4MjksIDB4NDAsIDB4NDAsIDB4MkIsIDB4NDksIDB4MDAsIDB4MkIsIDB4NjAsIDB4QkUsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MEIsIDB4MzYsCisJIDB4MjAsIDB4MDAsIDB4MEYsIDB4MzYsIDB4MUIsIDB4MDAsIDB4MEEsIDB4MzYsIDB4MTYsIDB4MDAsIDB4MEUsIDB4MzYsIDB4MTEsIDB4MDAsIDB4MDksIDB4MzYsCisJIDB4MEMsIDB4MDAsIDB4MEQsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MDgsIDB4MzYsIDB4MDIsIDB4MDAsIDB4QTMsIDB4RDMsIDB4MTUsIDB4MDAsIDB4MDIsIDB4QTMsCisJIDB4QTMsIDB4RDMsIDB4MTIsIDB4MDAsIDB4MDQsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MEYsIDB4MDAsIDB4MDYsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MEMsIDB4MDAsCisJIDB4MDgsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MDksIDB4MDAsIDB4MEEsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MDYsIDB4MDAsIDB4MEMsIDB4QTMsIDB4QTMsIDB4RDMsCisJIDB4MDMsIDB4MDAsIDB4MEUsIDB4QTMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NjAsIDB4ODIsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MEMsIDB4MzYsCisJIDB4MTksIDB4MDAsIDB4MDgsIDB4MzYsIDB4MTUsIDB4MDAsIDB4MEQsIDB4MzYsIDB4MTEsIDB4MDAsIDB4MDksIDB4MzYsIDB4MEQsIDB4MDAsIDB4MEUsIDB4MzYsCisJIDB4MDksIDB4MDAsIDB4MEEsIDB4MzYsIDB4MDUsIDB4MDAsIDB4MEYsIDB4MzYsIDB4MDEsIDB4MDAsIDB4M0EsIDB4MDAsIDB4MDIsIDB4QTMsIDB4MzgsIDB4MDAsCisJIDB4MDQsIDB4QTMsIDB4MzYsIDB4MDAsIDB4MDYsIDB4QTMsIDB4MzQsIDB4MDAsIDB4MDgsIDB4QTMsIDB4MzIsIDB4MDAsIDB4MEEsIDB4QTMsIDB4MzAsIDB4MDAsCisJIDB4MEMsIDB4QTMsIDB4MkUsIDB4MDAsIDB4MEUsIDB4QTMsIDB4MkMsIDB4MDAsIDB4MkIsIDB4MDAsIDB4MkIsIDB4NjAsIDB4Q0UsIDB4NjMsIDB4MjUsIDB4NDQsCisJIDB4MEEsIDB4MzYsIDB4MEMsIDB4MDAsIDB4MTQsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MzcsIDB4MzYsIDB4MDIsIDB4MDAsIDB4QTMsIDB4RDMsIDB4MDksIDB4MDAsCisJIDB4MDIsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MDYsIDB4MDAsIDB4MDQsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MDMsIDB4MDAsIDB4MDYsIDB4QTMsIDB4QTMsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4NDAsIDB4NDUsIDB4MEEsIDB4MzYsIDB4MEQsIDB4MDAsIDB4MTQsIDB4MzYsIDB4MzgsIDB4NjQsIDB4MzcsIDB4M0EsIDB4MDMsIDB4MDAsCisJIDB4MDQsIDB4N0YsIDB4NDAsIDB4NDUsIDB4MTUsIDB4NjQsIDB4NkUsIDB4M0EsIDB4MDksIDB4MDAsIDB4ODQsIDB4N0YsIDB4NDAsIDB4NDUsIDB4MEIsIDB4NjQsCisJIDB4MDUsIDB4MDAsIDB4MjksIDB4NDQsIDB4N0YsIDB4NjAsIDB4RkYsIDB4QjQsIDB4NDAsIDB4NDksIDB4NzAsIDB4NjQsIDB4NDAsIDB4NEQsIDB4MDIsIDB4MDAsCisJIDB4NDAsIDB4NDUsIDB4MEEsIDB4MDAsIDB4MjUsIDB4NjAsIDB4N0EsIDB4NjMsIDB4MEEsIDB4MzYsIDB4MDYsIDB4MDAsIDB4MTQsIDB4MzYsIDB4MDIsIDB4QTMsCisJIDB4MzcsIDB4MzYsIDB4MDQsIDB4QTMsIDB4NkUsIDB4MzYsIDB4MDYsIDB4QTMsIDB4MjgsIDB4QTMsIDB4QTMsIDB4RDEsIDB4RDgsIDB4QTMsIDB4MTUsIDB4NjAsCisJIDB4RDgsIDB4RjksIDB4MzksIDB4RjEsIDB4QTMsIDB4RDEsIDB4NjQsIDB4NDEsIDB4NjQsIDB4NUUsIDB4NjAsIDB4NDUsIDB4NjQsIDB4NDcsIDB4MUYsIDB4QjQsCisJIDB4NTQsIDB4OTQsIDB4RTAsIDB4QTAsIDB4MDIsIDB4MEQsIDB4MDAsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDQsIDB4MUYsIDB4NjQsIDB4NjAsIDB4NDcsCisJIDB4QjQsIDB4ODUsIDB4MjksIDB4NDQsIDB4QzAsIDB4NjAsIDB4MDAsIDB4QjQsIDB4QjQsIDB4ODQsIDB4MUYsIDB4RkEsIDB4QjUsIDB4RkYsIDB4QTEsIDB4RkYsCisJIDB4QUQsIDB4RjMsIDB4QzQsIDB4RTIsIDB4ODksIDB4RkYsIDB4NjAsIDB4NTQsIDB4ODgsIDB4RkYsIDB4REMsIDB4ODQsIDB4RTAsIDB4OTQsIDB4RkYsIDB4NjAsCisJIDB4Q0YsIDB4NjUsIDB4MjksIDB4NDQsIDB4MjQsIDB4ODksIDB4QTUsIDB4NjAsIDB4RDYsIDB4NzgsIDB4MDQsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QzQsIDB4RTIsIDB4QTEsIDB4RkYsIDB4RkYsIDB4NjAsIDB4Q0YsIDB4NjUsIDB4MjksIDB4NDQsIDB4MjQsIDB4ODksIDB4QUQsIDB4RjMsIDB4QzQsIDB4RTIsCisJIDB4ODksIDB4RkYsIDB4NjAsIDB4NTQsIDB4ODgsIDB4RkYsIDB4REMsIDB4ODQsIDB4RTAsIDB4OTQsIDB4MjYsIDB4NDQsIDB4ODQsIDB4QkMsIDB4MjQsIDB4NDAsCisJIDB4MEMsIDB4MjIsIDB4RkQsIDB4QjQsIDB4NDAsIDB4NDYsIDB4MjMsIDB4NjQsIDB4M0EsIDB4REIsIDB4QUMsIDB4NjAsIDB4QUIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjcsIDB4NDAsIDB4MjYsIDB4MjIsIDB4MDUsIDB4MDAsIDB4RjgsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MDYsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsCisJIDB4MjksIDB4NDAsIDB4MTAsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MDQsIDB4NzQsIDB4Q0QsIDB4RTIsIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4MDEsIDB4NjAsCisJIDB4MTgsIDB4RTEsIDB4MDEsIDB4MTEsIDB4MEYsIDB4MDAsIDB4MjksIDB4NDQsIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDksIDB4MDEsIDB4NjQsIDB4MzMsIDB4RkIsCisJIDB4QjYsIDB4RkYsIDB4MDAsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MUEsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkMsIDB4NDAsIDB4RkMsIDB4MTEsCisJIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4QjUsIDB4RkYsIDB4NDcsIDB4RkYsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4QzgsIDB4NjAsCisJIDB4MDksIDB4N0QsIDB4N0MsIDB4NEIsIDB4MzcsIDB4RjMsIDB4MkIsIDB4NDUsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MjgsIDB4NjUsIDB4NDQsCisJIDB4NjAsIDB4NTAsIDB4QTAsIDB4NEMsIDB4MjAsIDB4QkMsIDB4RkYsIDB4QjQsIDB4QTAsIDB4NTEsIDB4MDAsIDB4NjAsIDB4MkUsIDB4N0MsIDB4NzQsIDB4NDQsCisJIDB4QzAsIDB4OTQsIDB4MzIsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MTksIDB4MDAsIDB4MjgsIDB4NDQsIDB4QTQsIDB4MzYsIDB4MDMsIDB4MDAsIDB4MEMsIDB4QjQsCisJIDB4MDQsIDB4MzYsIDB4MTMsIDB4MDAsIDB4MjYsIDB4NDMsIDB4RkQsIDB4QjMsIDB4MDQsIDB4QkIsIDB4NDMsIDB4NDYsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsCisJIDB4MjgsIDB4NDcsIDB4NDAsIDB4QkYsIDB4NDAsIDB4NDgsIDB4MEEsIDB4QkIsIDB4MEYsIDB4RkMsIDB4NTAsIDB4NEIsIDB4NjcsIDB4NTAsIDB4MDAsIDB4NjQsCisJIDB4MzAsIDB4RkIsIDB4MDUsIDB4RkYsIDB4QUMsIDB4NjAsIDB4QUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NjQsIDB4M0EsIDB4REIsIDB4MjgsIDB4NDQsCisJIDB4MDQsIDB4MkEsIDB4MDMsIDB4MDAsIDB4QTQsIDB4NjAsIDB4NkYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUQsIDB4RkYsIDB4QTgsIDB4RTIsIDB4MjYsIDB4NDAsCisJIDB4MTAsIDB4MkEsIDB4MDYsIDB4MDAsIDB4MjUsIDB4NjAsIDB4RjAsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsCisJIDB4QTQsIDB4NjAsIDB4NkYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MEEsIDB4QTQsIDB4NjAsIDB4N0MsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjQsCisJIDB4NEYsIDB4RkIsIDB4RTEsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODEsIDB4M0UsIDB4NTQsIDB4NjIsIDB4MjIsIDB4NDYsIDB4QTIsIDB4RDAsCisJIDB4MTYsIDB4NjMsIDB4N0MsIDB4NDEsIDB4NDQsIDB4NDgsIDB4ODAsIDB4MzYsIDB4MDQsIDB4NjEsIDB4MjgsIDB4NDAsIDB4NTAsIDB4MzYsIDB4MDQsIDB4NjEsCisJIDB4NDEsIDB4NEUsIDB4MjgsIDB4NDQsIDB4QTQsIDB4MzYsIDB4MEUsIDB4NjMsIDB4MEEsIDB4NjAsIDB4N0MsIDB4RjEsIDB4MkQsIDB4NDQsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4QzAsIDB4ODQsIDB4QTIsIDB4REIsIDB4OUEsIDB4RkYsIDB4QTEsIDB4RkYsCisJIDB4MTIsIDB4NzQsIDB4Q0QsIDB4RTIsIDB4NTQsIDB4NjIsIDB4QTIsIDB4RDIsIDB4RkYsIDB4RkYsIDB4NkEsIDB4NDAsIDB4ODAsIDB4NEUsIDB4MTIsIDB4NzQsCisJIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsCisJIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MUQsCisJIDB4QjIsIDB4MDAsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsCisJIDB4MTIsIDB4NzQsIDB4MjgsIDB4NDAsIDB4MDMsIDB4MkIsIDB4MDYsIDB4MDAsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsCisJIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4NzAsIDB4NjIsIDB4MjgsIDB4NDQsIDB4OEYsIDB4QjAsIDB4ODgsIDB4M0EsIDB4MDIsIDB4MDAsIDB4N0EsIDB4RDQsCisJIDB4MTIsIDB4NzQsIDB4MjgsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MTYsIDB4MDAsIDB4NzIsIDB4NjIsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDIsCisJIDB4MTIsIDB4NzQsIDB4ODAsIDB4NEMsIDB4MjAsIDB4MkIsIDB4MDUsIDB4MDAsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsCisJIDB4MTIsIDB4NzQsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MjYsIDB4MDQsIDB4MDAsIDB4MjYsIDB4MjYsIDB4NEQsIDB4MDAsCisJIDB4MjYsIDB4MjcsIDB4NEIsIDB4MDAsIDB4MjMsIDB4NDMsIDB4RkYsIDB4RkYsIDB4MDYsIDB4MUQsIDB4MkUsIDB4MUUsIDB4MDAsIDB4MDAsIDB4MDMsIDB4RjAsCisJIDB4MDQsIDB4RjQsIDB4NjQsIDB4NDIsIDB4M0QsIDB4MDAsIDB4MkUsIDB4NDAsIDB4MDQsIDB4MkEsIDB4MjcsIDB4MDAsIDB4QTEsIDB4RkYsIDB4MDIsIDB4RkUsCisJIDB4MTAsIDB4MjUsIDB4NDIsIDB4RkUsIDB4MTIsIDB4NzQsIDB4NzIsIDB4NDUsIDB4NjUsIDB4NEMsIDB4OTQsIDB4RjMsIDB4MDMsIDB4MDQsIDB4RTQsIDB4RTIsCisJIDB4REMsIDB4ODQsIDB4OTQsIDB4RkIsIDB4QTEsIDB4RkYsIDB4MTIsIDB4NzQsIDB4ODAsIDB4NEMsIDB4MTIsIDB4NzQsIDB4OTUsIDB4RjMsIDB4MDIsIDB4MDQsCisJIDB4REMsIDB4ODQsIDB4OTUsIDB4RkIsIDB4ODAsIDB4NEMsIDB4MTIsIDB4NzQsIDB4OTYsIDB4RjMsIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4OTYsIDB4RkIsCisJIDB4ODAsIDB4NEMsIDB4MTIsIDB4NzQsIDB4NUMsIDB4NEUsIDB4RjgsIDB4QTMsIDB4MDMsIDB4RjIsIDB4OUEsIDB4RjIsIDB4MDQsIDB4RjQsIDB4RkYsIDB4QjEsCisJIDB4RjgsIDB4QTEsIDB4MDYsIDB4QTQsIDB4NjAsIDB4NDIsIDB4MEEsIDB4MDAsIDB4NEUsIDB4MDAsIDB4MDMsIDB4RjIsIDB4OUEsIDB4RjIsIDB4MDQsIDB4RjQsCisJIDB4QzgsIDB4ODIsIDB4RkYsIDB4QjEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4RjQsIDB4ODEsIDB4RjIsIDB4RkYsIDB4QjEsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsCisJIDB4RkQsIDB4MUMsIDB4RjksIDB4MUQsIDB4RkYsIDB4QjEsIDB4MUIsIDB4MUUsIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4REEsIDB4ODIsIDB4REEsIDB4ODIsCisJIDB4QTIsIDB4RDIsIDB4QTEsIDB4RkYsIDB4MDksIDB4NzQsIDB4NjAsIDB4NEQsIDB4MTIsIDB4MDAsIDB4MDMsIDB4RjIsIDB4OUEsIDB4RjIsIDB4MDQsIDB4RjQsCisJIDB4MjMsIDB4NDMsIDB4QTEsIDB4RkYsIDB4MTIsIDB4NzQsIDB4QTAsIDB4RDIsIDB4RkUsIDB4QTEsIDB4Q0IsIDB4ODMsIDB4NjAsIDB4NEUsIDB4QUYsIDB4ODMsCisJIDB4MDMsIDB4MUQsIDB4MDUsIDB4MDMsIDB4MTIsIDB4NzQsIDB4RUIsIDB4MDEsIDB4QTEsIDB4RkYsIDB4MTIsIDB4NzQsIDB4REYsIDB4MDEsIDB4MTIsIDB4NzQsCisJIDB4REEsIDB4ODMsIDB4NjYsIDB4NDQsIDB4MjIsIDB4NDYsIDB4MEMsIDB4RkEsIDB4MjIsIDB4RjIsIDB4MEIsIDB4RkMsIDB4MjgsIDB4NDAsIDB4NDAsIDB4MkIsCisJIDB4MUEsIDB4MDAsIDB4MTAsIDB4MjYsIDB4MDQsIDB4MDAsIDB4MjYsIDB4MjYsIDB4MEYsIDB4MDAsIDB4MjYsIDB4MjcsIDB4MEQsIDB4MDAsIDB4MDAsIDB4RjQsCisJIDB4MDIsIDB4NjIsIDB4QTEsIDB4RkYsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsCisJIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4MDcsIDB4MDAsIDB4QTEsIDB4RkYsIDB4MTIsIDB4NzQsIDB4OUMsIDB4NEUsIDB4MTIsIDB4NzQsCisJIDB4OUMsIDB4NEMsIDB4MTIsIDB4NzQsIDB4MDAsIDB4MDAsIDB4ODgsIDB4RkYsIDB4QTEsIDB4RkYsIDB4QjEsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MDAsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4NzgsIDB4NDQsIDB4MDIsIDB4QTQsIDB4MzUsIDB4RkIsIDB4Q0MsIDB4MDAsIDB4MjksIDB4NDQsCisJIDB4RjcsIDB4QjQsIDB4NDAsIDB4NDksIDB4MzQsIDB4NjQsIDB4M0EsIDB4REIsIDB4NDQsIDB4RTEsIDB4QTUsIDB4NjAsIDB4QjIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NkIsIDB4QkMsIDB4RkYsIDB4MTUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4MTUsIDB4RkIsIDB4NzgsIDB4NUMsIDB4MDcsIDB4MDAsCisJIDB4NzgsIDB4NUMsIDB4MkYsIDB4MDAsIDB4NjIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODAsIDB4M0UsIDB4ODAsIDB4NjAsCisJIDB4MDEsIDB4RTAsIDB4RDUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4ODIsIDB4RjMsIDB4NDAsIDB4NjAsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjMsIDB4NDgsIDB4NjAsCisJIDB4NUUsIDB4NjUsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjUsIDB4NEEsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4ODAsIDB4NjAsCisJIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjUsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsCisJIDB4MDAsIDB4NjAsIDB4MDEsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4OTUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4NjQsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4ODAsIDB4NjAsIDB4MDEsIDB4RTAsIDB4RDUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4ODIsIDB4RjMsIDB4N0MsIDB4NDUsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MjMsIDB4MDIsIDB4NjUsIDB4OEMsIDB4NjAsIDB4NDgsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsCisJIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4N0YsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsCisJIDB4RkUsIDB4MDEsIDB4ODQsIDB4NjAsIDB4MDQsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NDgsIDB4NjAsIDB4MDgsIDB4NkEsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjUsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4ODQsIDB4NjAsCisJIDB4MDQsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NDAsIDB4NjAsIDB4MDgsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsCisJIDB4RkUsIDB4MDEsIDB4NjUsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4OEMsIDB4NjAsIDB4NDgsIDB4NkEsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsCisJIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4OTUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4NjQsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MTIsIDB4NzQsIDB4NkEsIDB4NDAsIDB4ODcsIDB4NEYsIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEMsIDB4MTIsIDB4NzQsIDB4MjksIDB4NDAsIDB4NDAsIDB4MkIsCisJIDB4MDgsIDB4MDAsIDB4MEEsIDB4NjQsIDB4ODksIDB4RkYsIDB4NjAsIDB4NTQsIDB4ODgsIDB4RkYsIDB4ODcsIDB4NEQsIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEQsCisJIDB4MDksIDB4MDAsIDB4MDMsIDB4NjQsIDB4ODksIDB4RkYsIDB4NjAsIDB4NTQsIDB4ODgsIDB4RkYsIDB4ODcsIDB4NEYsIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEQsCisJIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEQsIDB4N0MsIDB4NDQsIDB4MDEsIDB4MDgsIDB4MDEsIDB4MDAsIDB4NjcsIDB4NDQsIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEMsCisJIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEMsIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEMsIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEQsIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEQsCisJIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEQsIDB4MTIsIDB4NzQsIDB4MDQsIDB4MjEsIDB4MDQsIDB4MDAsIDB4RkYsIDB4MkEsIDB4MDEsIDB4MDAsIDB4MDQsIDB4MDAsCisJIDB4MDMsIDB4MDAsIDB4RkYsIDB4MkEsIDB4MEQsIDB4MDAsIDB4MEMsIDB4MDAsIDB4QkMsIDB4RkYsIDB4NjEsIDB4RkYsIDB4NzgsIDB4NUMsIDB4NTcsIDB4MDEsCisJIDB4NzgsIDB4NUMsIDB4N0YsIDB4MDEsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4QzgsIDB4NjAsIDB4MDksIDB4N0QsIDB4N0MsIDB4NEIsCisJIDB4NkEsIDB4NDQsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4NzQsIDB4QzQsIDB4RTIsIDB4MDQsIDB4RTEsIDB4MjksIDB4NDAsIDB4NDAsIDB4MkIsCisJIDB4MDUsIDB4MDAsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkMsIDB4RkYsIDB4MTQsIDB4NzQsIDB4MDEsIDB4MDAsIDB4MDQsIDB4NzQsIDB4QzQsIDB4RTIsCisJIDB4MDQsIDB4RTEsIDB4QkMsIDB4RkYsIDB4QjUsIDB4RkYsIDB4NDcsIDB4RkYsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4QzgsIDB4NjAsCisJIDB4MDksIDB4N0QsIDB4N0MsIDB4NEIsIDB4MjksIDB4NDAsIDB4NDAsIDB4MjcsIDB4MDQsIDB4MDAsIDB4QzIsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QzgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4MjksIDB4NDAsIDB4MTAsIDB4MjYsIDB4NkQsIDB4MDAsIDB4ODAsIDB4NjAsIDB4MDEsIDB4RTAsIDB4RDUsIDB4NjAsCisJIDB4ODQsIDB4RTcsIDB4ODIsIDB4RjMsIDB4NDAsIDB4NjAsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjMsIDB4NDgsIDB4NjAsIDB4NUUsIDB4NjUsIDB4ODAsIDB4NjAsCisJIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjUsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsCisJIDB4MDAsIDB4NjAsIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjUsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NkEsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4OTUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4ODAsIDB4NjAsIDB4MDEsIDB4RTAsIDB4RDUsIDB4NjAsCisJIDB4ODQsIDB4RTcsIDB4ODIsIDB4RjMsIDB4N0MsIDB4NDUsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjMsIDB4MDIsIDB4NjUsIDB4OEMsIDB4NjAsIDB4NDgsIDB4NkEsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsCisJIDB4MDAsIDB4NjAsIDB4N0YsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4ODQsIDB4NjAsIDB4MDQsIDB4NkEsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NDgsIDB4NjAsIDB4MDgsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjUsIDB4NEEsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4ODQsIDB4NjAsIDB4MDQsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsCisJIDB4NDAsIDB4NjAsIDB4MDgsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjUsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsCisJIDB4RkUsIDB4MDEsIDB4OEMsIDB4NjAsIDB4NDgsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NkEsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsCisJIDB4OTUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4RkYsIDB4RkYsIDB4QzQsIDB4RTIsIDB4MjksIDB4NDAsIDB4NDAsIDB4MkIsCisJIDB4MDQsIDB4MDAsIDB4QzIsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QzIsIDB4NjAsIDB4NTgsIDB4NEYsIDB4RDAsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4QUQsIDB4RjMsIDB4QzQsIDB4RTIsIDB4ODksIDB4RkYsIDB4NjAsIDB4NTQsIDB4ODgsIDB4RkYsIDB4REMsIDB4ODQsCisJIDB4RTAsIDB4OTQsIDB4MzUsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDgsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4NDMsIDB4RkYsIDB4MDEsIDB4NjAsIDB4MDAsIDB4RTEsIDB4MjgsIDB4RjMsIDB4NDcsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDcsIDB4MzcsIDB4NjYsIDB4MDAsCisJIDB4MDUsIDB4M0IsIDB4MDQsIDB4MDAsIDB4RkYsIDB4MEEsIDB4ODAsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MTgsIDB4NjAsIDB4MDcsIDB4RjEsCisJIDB4QUQsIDB4NEYsIDB4MDAsIDB4N0YsIDB4RkEsIDB4QjQsIDB4NjQsIDB4NDEsIDB4NjQsIDB4RjEsIDB4MDIsIDB4QjEsIDB4MDQsIDB4NjUsIDB4MDIsIDB4MDIsCisJIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MDEsIDB4NjUsIDB4QjQsIDB4ODQsIDB4QTAsIDB4NUQsIDB4MjksIDB4RjUsIDB4MkEsIDB4RjMsIDB4NDcsIDB4RkYsCisJIDB4M0YsIDB4RjAsIDB4MDEsIDB4MUIsIDB4MDEsIDB4NjQsIDB4NjAsIDB4NTYsIDB4QUQsIDB4RTIsIDB4QjUsIDB4RkYsIDB4NkMsIDB4NDAsIDB4NDAsIDB4RTEsCisJIDB4QTEsIDB4RkYsIDB4MDAsIDB4RjQsIDB4NkUsIDB4NjEsIDB4MTIsIDB4NjIsIDB4NjQsIDB4NDMsIDB4MDEsIDB4RTEsIDB4MDMsIDB4NjQsIDB4RTIsIDB4RDAsCisJIDB4QzksIDB4ODEsIDB4NjQsIDB4NEMsIDB4Q0MsIDB4ODQsIDB4REEsIDB4ODIsIDB4RkEsIDB4MDIsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NkIsIDB4OUEsIDB4RkYsCisJIDB4Q0EsIDB4ODIsIDB4MDMsIDB4MDAsIDB4MDAsIDB4RjQsIDB4ODEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4N0EsIDB4RDAsIDB4QTEsIDB4RkYsIDB4NjQsIDB4NEMsCisJIDB4RkMsIDB4MUMsIDB4RjgsIDB4MUQsIDB4MDAsIDB4QjksIDB4MDYsIDB4MUUsIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4REEsIDB4ODIsIDB4NUEsIDB4RDIsCisJIDB4QTEsIDB4RkYsIDB4NjAsIDB4NEQsIDB4M0YsIDB4NDAsIDB4MDIsIDB4MkIsIDB4MTAsIDB4MDAsIDB4MjgsIDB4RjMsIDB4QTUsIDB4NjAsIDB4QzQsIDB4NjUsCisJIDB4NjAsIDB4NDAsIDB4MEUsIDB4M0IsIDB4MEEsIDB4MDAsIDB4RDIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTAsIDB4QkMsIDB4RDIsIDB4RkIsIDB4QUQsIDB4NEYsCisJIDB4MDIsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUQsIDB4ODUsIDB4NEMsIDB4RkUsIDB4MDEsIDB4RDIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsCisJIDB4RDIsIDB4RkIsIDB4QTEsIDB4RkYsIDB4ODcsIDB4NEUsIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEMsIDB4NjcsIDB4NEMsCisJIDB4RkYsIDB4RkYsIDB4QkMsIDB4RkYsIDB4MDAsIDB4RTEsIDB4RDUsIDB4RkUsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NDYsCisJIDB4NjAsIDB4NDEsIDB4QjUsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4MjksIDB4RjUsIDB4M0YsIDB4RjAsIDB4MjQsIDB4RjIsIDB4NDQsIDB4NDMsCisJIDB4NDAsIDB4NEQsIDB4MDAsIDB4RjQsIDB4RjMsIDB4NjAsIDB4QTAsIDB4NjUsIDB4MTAsIDB4NjIsIDB4NUEsIDB4RDIsIDB4RDksIDB4ODEsIDB4RDQsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4RkIsIDB4MDIsIDB4NjEsIDB4NDUsIDB4MkQsIDB4NDQsIDB4RDQsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RkQsIDB4QTUsIDB4NDgsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QzQsIDB4OUQsIDB4MEQsIDB4NjAsIDB4MDAsIDB4NkIsIDB4MkQsIDB4NDQsIDB4QzAsIDB4ODMsCisJIDB4QkIsIDB4RkYsIDB4MjksIDB4RjUsIDB4MDEsIDB4RTEsIDB4MDAsIDB4RjQsIDB4NkMsIDB4NjEsIDB4MTAsIDB4NjIsIDB4MDUsIDB4MDAsIDB4MDAsIDB4RjQsCisJIDB4MDEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4MDQsIDB4NjIsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTAsIDB4MUEsIDB4MDAsCisJIDB4MjYsIDB4NDQsIDB4MDEsIDB4MjYsIDB4MEMsIDB4MDAsIDB4MkQsIDB4NDQsIDB4QzgsIDB4ODQsIDB4NDAsIDB4NEQsIDB4MDIsIDB4MDMsIDB4NkMsIDB4NDUsCisJIDB4RjMsIDB4MDEsIDB4MDMsIDB4MTUsIDB4MDEsIDB4NjQsIDB4MDUsIDB4RkEsIDB4MTUsIDB4MDAsIDB4NkMsIDB4NDUsIDB4RUQsIDB4MDEsIDB4MjMsIDB4NDQsCisJIDB4QzgsIDB4ODQsIDB4NDAsIDB4NDMsIDB4MDIsIDB4MDMsIDB4NkMsIDB4NDUsIDB4RTcsIDB4MDEsIDB4MDAsIDB4NjQsIDB4MDEsIDB4MTUsIDB4MDEsIDB4NjQsCisJIDB4NkMsIDB4NDUsIDB4MDUsIDB4RkIsIDB4RTIsIDB4RDIsIDB4REEsIDB4ODIsIDB4QzksIDB4ODEsIDB4NjAsIDB4NEMsIDB4REQsIDB4MUMsIDB4RDcsIDB4MDMsCisJIDB4QkMsIDB4RkYsIDB4REEsIDB4MDEsIDB4MDAsIDB4RTEsIDB4RDUsIDB4RkUsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDgsIDB4RTEsIDB4QTEsIDB4RkYsCisJIDB4NjcsIDB4NEMsIDB4NDMsIDB4RkYsIDB4RDIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTAsIDB4QkMsIDB4RDIsIDB4RkIsIDB4QUQsIDB4NEYsIDB4MDIsIDB4QkMsCisJIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUQsIDB4MDEsIDB4RTEsIDB4MDEsIDB4NjAsIDB4NjksIDB4NkIsIDB4QTUsIDB4NjAsIDB4QzQsIDB4NjQsIDB4NjAsIDB4NEMsCisJIDB4QkIsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NEMsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NEMsIDB4RkMsIDB4MDEsCisJIDB4MjksIDB4RjMsIDB4MkEsIDB4RjEsIDB4MDcsIDB4QjUsIDB4MDQsIDB4RTEsIDB4NjUsIDB4NDEsIDB4NjQsIDB4NTQsIDB4Q0QsIDB4RTIsIDB4OTUsIDB4ODEsCisJIDB4QTEsIDB4NUQsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjksIDB4MDEsIDB4MTAsIDB4NjEsIDB4N0YsIDB4NjAsIDB4QzAsIDB4NjQsIDB4QTAsIDB4ODAsCisJIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjMsIDB4MjUsIDB4MDIsIDB4OTgsIDB4RkUsIDB4MTksIDB4MDUsIDB4MEYsIDB4NjAsIDB4N0YsIDB4RjUsIDB4MEUsIDB4RjIsCisJIDB4MTUsIDB4MTgsIDB4MDIsIDB4MTgsIDB4MDksIDB4RjQsIDB4RkIsIDB4MDEsIDB4MjMsIDB4NDQsIDB4MDAsIDB4QTgsIDB4MDgsIDB4N0UsIDB4MEEsIDB4MDIsCisJIDB4NjYsIDB4NDQsIDB4MTEsIDB4RkIsIDB4NDYsIDB4NDMsIDB4MjMsIDB4NDcsIDB4ODAsIDB4QkYsIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsIDB4QTIsIDB4REIsCisJIDB4MjgsIDB4QjksIDB4MTAsIDB4N0UsIDB4MDAsIDB4N0YsIDB4MEUsIDB4RkEsIDB4MDAsIDB4NjcsIDB4MEEsIDB4MDAsIDB4MjAsIDB4NDQsIDB4REMsIDB4ODUsCisJIDB4MEYsIDB4QjQsIDB4RjcsIDB4QTAsIDB4N0YsIDB4NjcsIDB4MDcsIDB4NjMsIDB4MDMsIDB4MDUsIDB4NDUsIDB4NDAsIDB4MDAsIDB4NjcsIDB4RDgsIDB4RkUsCisJIDB4RkYsIDB4MjcsIDB4MDUsIDB4RkQsIDB4MEEsIDB4N0UsIDB4MDQsIDB4RkIsIDB4NjEsIDB4NTUsIDB4NDgsIDB4MDAsIDB4MjgsIDB4RkIsIDB4MDEsIDB4RjMsCisJIDB4MjksIDB4RkIsIDB4NDQsIDB4NDYsIDB4NDAsIDB4NDUsIDB4MTAsIDB4NjEsIDB4N0UsIDB4NjAsIDB4QzAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4N0YsIDB4NjcsCisJIDB4MDIsIDB4NjMsIDB4MzAsIDB4MDIsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NEIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4N0YsIDB4NjcsIDB4MDMsIDB4NjMsCisJIDB4MjksIDB4MDIsIDB4MjYsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MjMsIDB4MDAsIDB4OTgsIDB4RkUsIDB4MTgsIDB4MDUsIDB4MEYsIDB4NjAsIDB4N0YsIDB4RjUsCisJIDB4MEUsIDB4RjIsIDB4MTQsIDB4MTgsIDB4MDIsIDB4MTgsIDB4MDksIDB4RjQsIDB4RkIsIDB4MDEsIDB4MjMsIDB4NDQsIDB4MDAsIDB4QTgsIDB4MDgsIDB4N0UsCisJIDB4MEEsIDB4MDIsIDB4NjYsIDB4NDQsIDB4MTEsIDB4RkIsIDB4NDYsIDB4NDMsIDB4MjMsIDB4NDcsIDB4ODAsIDB4QkYsIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsCisJIDB4QTIsIDB4REIsIDB4MDgsIDB4QjksIDB4MTAsIDB4N0UsIDB4MDAsIDB4N0YsIDB4MEUsIDB4RkEsIDB4MDksIDB4MDAsIDB4MjAsIDB4NDQsIDB4REMsIDB4ODUsCisJIDB4MEYsIDB4QjQsIDB4RjcsIDB4QTAsIDB4N0YsIDB4NjcsIDB4MDcsIDB4NjMsIDB4MDUsIDB4MDUsIDB4NDUsIDB4NDAsIDB4RDgsIDB4RkUsIDB4MDAsIDB4NjcsCisJIDB4RDAsIDB4RkUsIDB4RDksIDB4RkUsIDB4RkYsIDB4MjcsIDB4MDUsIDB4RkQsIDB4MEIsIDB4N0UsIDB4MDQsIDB4RkIsIDB4MEEsIDB4NjAsIDB4N0UsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MjAsIDB4QjAsIDB4ODAsIDB4QkMsIDB4MDgsIDB4MjgsIDB4QTIsIDB4REIsIDB4NjEsIDB4NTUsIDB4NjYsIDB4MDAsIDB4MDQsIDB4QjUsCisJIDB4ODIsIDB4QjUsIDB4MjUsIDB4MDIsIDB4MDQsIDB4MDMsIDB4MjAsIDB4NDQsIDB4N0YsIDB4QjQsIDB4NDAsIDB4NDAsIDB4QTMsIDB4RDMsIDB4OTksIDB4RkUsCisJIDB4MDQsIDB4MDQsIDB4MDIsIDB4QkMsIDB4RkUsIDB4QjQsIDB4QTMsIDB4REIsIDB4NTksIDB4MDAsIDB4QkMsIDB4RjMsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MjYsCisJIDB4NTUsIDB4MDAsIDB4QTMsIDB4RDMsIDB4RkYsIDB4QTAsIDB4RjgsIDB4QjQsIDB4MDIsIDB4MDIsIDB4QTMsIDB4REIsIDB4MUMsIDB4MDAsIDB4MDQsIDB4QkMsCisJIDB4QkYsIDB4QjQsIDB4QTMsIDB4REIsIDB4MDgsIDB4QjAsIDB4MDEsIDB4NjQsIDB4MDgsIDB4MjQsIDB4MDIsIDB4NjQsIDB4MjgsIDB4RkIsIDB4MjAsIDB4NDQsCisJIDB4ODAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4RDAsIDB4RkUsIDB4NDIsIDB4MDAsIDB4QkYsIDB4QjQsIDB4QTMsIDB4REIsIDB4M0YsIDB4MDAsIDB4NDAsIDB4QjAsCisJIDB4RkYsIDB4RkYsIDB4RkEsIDB4MDIsIDB4RjgsIDB4QjQsIDB4QTMsIDB4REIsIDB4MDgsIDB4QjUsIDB4MDcsIDB4N0MsIDB4MDEsIDB4MDIsIDB4QkMsIDB4RjksCisJIDB4MjAsIDB4NDQsIDB4N0YsIDB4QjQsIDB4NDAsIDB4NDAsIDB4MTQsIDB4NjAsIDB4RkMsIDB4NjMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjAsIDB4QjUsCisJIDB4MDcsIDB4QjUsIDB4MDgsIDB4MjgsIDB4QzQsIDB4MDIsIDB4OTksIDB4RkUsIDB4MjksIDB4MDUsIDB4MjAsIDB4NDQsIDB4ODAsIDB4MjYsIDB4MjYsIDB4MDAsCisJIDB4MjAsIDB4MkEsIDB4MDMsIDB4MDAsIDB4REYsIDB4QjQsIDB4NDAsIDB4NDAsIDB4NkEsIDB4MDAsIDB4NDAsIDB4MkEsIDB4MUYsIDB4MDAsIDB4QkYsIDB4QjQsCisJIDB4NDAsIDB4NDAsIDB4MDksIDB4MDAsIDB4QTgsIDB4RkYsIDB4MjAsIDB4NDQsIDB4OTksIDB4RkUsIDB4MDIsIDB4MDUsIDB4ODAsIDB4MkEsIDB4MDMsIDB4MDAsCisJIDB4NDAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4MTMsIDB4MDAsIDB4MDAsIDB4RjEsIDB4ODAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4NjQsIDB4NDQsIDB4RTAsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4MEEsIDB4MzYsIDB4MjksIDB4MDEsIDB4MEIsIDB4MzYsIDB4NTksIDB4MDEsIDB4MjgsIDB4RkIsIDB4MDEsIDB4RjEsIDB4MjksIDB4RjksCisJIDB4MDIsIDB4RjEsIDB4MkEsIDB4RjksIDB4MDMsIDB4RjEsIDB4MkIsIDB4RjksIDB4RDAsIDB4RkUsIDB4QUUsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4ODIsIDB4M0UsIDB4NzUsIDB4NDQsIDB4MDIsIDB4QjAsIDB4MDEsIDB4QjAsIDB4NEEsIDB4MDIsIDB4REMsIDB4MDIsIDB4MDQsIDB4QjAsIDB4MDgsIDB4QjAsCisJIDB4MEIsIDB4MDIsIDB4MjAsIDB4MDIsIDB4NDAsIDB4MjYsIDB4QTcsIDB4RkYsIDB4OEMsIDB4RkYsIDB4NzUsIDB4NDAsIDB4ODAsIDB4MkIsIDB4MDEsIDB4MDAsCisJIDB4QUIsIDB4RkYsIDB4NzUsIDB4NDQsIDB4OEQsIDB4RkYsIDB4RUEsIDB4MDEsIDB4MEEsIDB4RjMsIDB4QUEsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MkIsCisJIDB4MDIsIDB4MDAsIDB4MzgsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDEsIDB4MjYsIDB4MEMsIDB4MDAsIDB4QzAsIDB4NjAsIDB4MDAsIDB4N0MsIDB4QTAsIDB4ODQsCisJIDB4ODAsIDB4M0IsIDB4MDIsIDB4MDAsIDB4QzAsIDB4NjcsIDB4MDMsIDB4MDAsIDB4NDAsIDB4M0IsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjcsIDB4MEEsIDB4RkIsCisJIDB4RDUsIDB4MDEsIDB4RDQsIDB4MDEsIDB4MEIsIDB4RjEsIDB4QUIsIDB4RkYsIDB4NjQsIDB4NDQsIDB4RkYsIDB4MjcsIDB4MUYsIDB4MDAsIDB4MjAsIDB4MjYsCisJIDB4MDMsIDB4MDAsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NzUsIDB4MUEsIDB4MDAsIDB4MTksIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MUIsIDB4MDQsIDB4NjAsCisJIDB4MDAsIDB4NzUsIDB4MEEsIDB4NjQsIDB4Q0MsIDB4ODQsIDB4MTksIDB4RkIsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NzUsIDB4NjQsIDB4NDAsIDB4MDMsIDB4MjIsCisJIDB4MEQsIDB4MDAsIDB4MjAsIDB4NDQsIDB4ODAsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4MDcsIDB4MDAsIDB4RDksIDB4RkUsCisJIDB4ODEsIDB4NjAsIDB4MEIsIDB4NjQsIDB4MjgsIDB4RkIsIDB4MkMsIDB4NDQsIDB4MjksIDB4RkIsIDB4RDAsIDB4RkUsIDB4QUYsIDB4MDEsIDB4QTksIDB4RkYsCisJIDB4NzcsIDB4NDQsIDB4NjAsIDB4NTcsIDB4NDAsIDB4NEEsIDB4MDEsIDB4MkEsIDB4MjAsIDB4MDAsIDB4MjQsIDB4NDQsIDB4QUMsIDB4ODYsIDB4MDgsIDB4RjIsCisJIDB4MUMsIDB4MDMsIDB4MUYsIDB4NjAsIDB4MDQsIDB4NjUsIDB4RDQsIDB4ODAsIDB4MEUsIDB4RjIsIDB4MDIsIDB4MDMsIDB4QTUsIDB4RDUsIDB4MDQsIDB4MDAsCisJIDB4MDEsIDB4QkMsIDB4MEUsIDB4RkEsIDB4MDksIDB4RjQsIDB4RDEsIDB4RkUsIDB4NDYsIDB4NDQsIDB4MEYsIDB4MTgsIDB4M0YsIDB4RjIsIDB4NDgsIDB4NjUsCisJIDB4QzQsIDB4ODQsIDB4MTMsIDB4RkIsIDB4NjYsIDB4NDQsIDB4MTAsIDB4RkIsIDB4NjYsIDB4NDcsIDB4MjAsIDB4QkYsIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsCisJIDB4QTIsIDB4REIsIDB4MEUsIDB4RjIsIDB4NDEsIDB4NzUsIDB4MTAsIDB4QkMsIDB4MEUsIDB4RkEsIDB4MkEsIDB4NDQsIDB4MDgsIDB4MkEsIDB4MTcsIDB4MDAsCisJIDB4MjMsIDB4NDQsIDB4MDAsIDB4QTgsIDB4NUMsIDB4NDMsIDB4MTMsIDB4MDMsIDB4MEYsIDB4NjAsIDB4N0YsIDB4RjUsIDB4MDEsIDB4MDAsIDB4MDksIDB4RjQsCisJIDB4MEUsIDB4RjIsIDB4MEQsIDB4MTgsIDB4MDgsIDB4QjAsIDB4MTgsIDB4QUMsIDB4RkEsIDB4MDMsIDB4MEUsIDB4RkEsIDB4NjYsIDB4NDMsIDB4MTEsIDB4RkQsCisJIDB4NDYsIDB4NDMsIDB4MjMsIDB4NDcsIDB4ODAsIDB4QkYsIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsIDB4QTIsIDB4REIsIDB4MjgsIDB4NzUsIDB4MkEsIDB4NDQsCisJIDB4MDYsIDB4MjIsIDB4MkQsIDB4MDAsIDB4MjIsIDB4NDQsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MEUsIDB4RjIsIDB4MjgsIDB4MDMsIDB4MTAsIDB4QjAsCisJIDB4MDEsIDB4QkMsIDB4MDMsIDB4MDIsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NDIsIDB4MjIsIDB4MDAsIDB4MEUsIDB4RkEsIDB4RDEsIDB4RkUsIDB4MUUsIDB4NjAsCisJIDB4RjgsIDB4NjQsIDB4NDAsIDB4NDcsIDB4NTgsIDB4NEYsIDB4ODAsIDB4MDAsIDB4NDYsIDB4NDIsIDB4MTksIDB4MDIsIDB4MjIsIDB4NDcsIDB4NDAsIDB4QkYsCisJIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsIDB4QTIsIDB4REIsIDB4MjMsIDB4RjIsIDB4NjYsIDB4NDMsIDB4MDAsIDB4QTgsIDB4MEUsIDB4RjIsIDB4MDgsIDB4MDIsCisJIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkEsIDB4RTQsIDB4MDEsIDB4MTIsIDB4RkQsIDB4MTAsIDB4NjQsIDB4MEUsIDB4RkEsIDB4MDIsIDB4NzUsIDB4MDcsIDB4MDAsCisJIDB4NjAsIDB4NDAsIDB4MDQsIDB4MkEsIDB4REMsIDB4MDEsIDB4MTIsIDB4RkQsIDB4MTAsIDB4NjQsIDB4MEUsIDB4RkEsIDB4MDQsIDB4NzUsIDB4MkEsIDB4NDQsCisJIDB4ODAsIDB4MkEsIDB4MTksIDB4MDAsIDB4MjEsIDB4NDQsIDB4QUMsIDB4ODYsIDB4MEUsIDB4RjIsIDB4MTUsIDB4MDMsIDB4MDEsIDB4QkMsIDB4MEUsIDB4RkEsCisJIDB4RDEsIDB4RkUsIDB4MUYsIDB4NjAsIDB4MTAsIDB4NjQsIDB4NDAsIDB4NDcsIDB4NTgsIDB4NEYsIDB4NTYsIDB4MDAsIDB4NDYsIDB4NDEsIDB4MEIsIDB4MDIsCisJIDB4MjEsIDB4NDcsIDB4MTAsIDB4QkYsIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsIDB4QTIsIDB4REIsIDB4MEUsIDB4RjIsIDB4NjYsIDB4NDMsIDB4MDgsIDB4RkQsCisJIDB4MTAsIDB4QkMsIDB4MEUsIDB4RkEsIDB4ODAsIDB4NzUsIDB4MkEsIDB4NDQsIDB4MTAsIDB4QjAsIDB4MjAsIDB4NDQsIDB4MTUsIDB4MDMsIDB4N0YsIDB4QjQsCisJIDB4NDAsIDB4NDAsIDB4MTQsIDB4NjAsIDB4RkMsIDB4NjMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjAsIDB4QjAsIDB4ODAsIDB4QjAsIDB4MDksIDB4MDMsCisJIDB4MDgsIDB4MDMsIDB4NDAsIDB4QkMsIDB4N0YsIDB4QjQsIDB4MDQsIDB4QjAsIDB4QTMsIDB4REIsIDB4MDMsIDB4MDMsIDB4MjAsIDB4NDQsIDB4ODAsIDB4QkMsCisJIDB4NDAsIDB4NDAsIDB4QjMsIDB4NjAsIDB4OEIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QjMsIDB4NjAsIDB4QkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTgsIDB4RkUsCisJIDB4MTQsIDB4MDUsIDB4RUEsIDB4RkUsIDB4MjQsIDB4MDUsIDB4RTksIDB4RkUsIDB4MUMsIDB4MDUsIDB4RTcsIDB4RkUsIDB4MDksIDB4MDUsIDB4NDcsIDB4RkYsCisJIDB4MjAsIDB4NDQsIDB4MEYsIDB4MjIsIDB4MDMsIDB4MDAsIDB4Q0MsIDB4ODQsIDB4NDAsIDB4NDAsIDB4MEYsIDB4MjIsIDB4QjgsIDB4RkUsIDB4RUMsIDB4MDEsCisJIDB4MjMsIDB4NDEsIDB4MDAsIDB4QjksIDB4NUMsIDB4NEEsIDB4RTgsIDB4MDIsIDB4NkYsIDB4MDEsIDB4MjQsIDB4NDEsIDB4MDAsIDB4QjksIDB4MUYsIDB4NjAsCisJIDB4MDQsIDB4NjUsIDB4NDUsIDB4NDcsIDB4RTEsIDB4MDIsIDB4NTgsIDB4NEYsIDB4MEYsIDB4MDAsIDB4REUsIDB4MDIsIDB4NUMsIDB4NEEsIDB4NDYsIDB4NDQsCisJIDB4NEQsIDB4MDEsIDB4MjIsIDB4NDEsIDB4MDAsIDB4QjksIDB4NUMsIDB4NEEsIDB4MDgsIDB4MjQsIDB4ODEsIDB4MDEsIDB4RDUsIDB4MDEsIDB4MjEsIDB4NDEsCisJIDB4MDAsIDB4QjksIDB4NUMsIDB4NEEsIDB4QTYsIDB4MDMsIDB4RDAsIDB4MDEsIDB4MjcsIDB4RDMsIDB4MDMsIDB4MDAsIDB4MTAsIDB4QjAsIDB4MDksIDB4RjIsCisJIDB4MDQsIDB4MDMsIDB4QUMsIDB4ODYsIDB4MEUsIDB4RjIsIDB4RkEsIDB4MDIsIDB4MDgsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4RjMsCisJIDB4MEYsIDB4NjAsIDB4RkUsIDB4NjUsIDB4MEMsIDB4RjMsIDB4MjQsIDB4ODYsIDB4MjQsIDB4NDYsIDB4NjAsIDB4NDAsIDB4RkIsIDB4M0IsIDB4MDcsIDB4MDAsCisJIDB4ODAsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MjMsIDB4NDYsIDB4MDMsIDB4NEMsIDB4NDYsIDB4NjEsIDB4M0EsIDB4NjUsIDB4MEMsIDB4MDAsIDB4MkUsIDB4RjMsCisJIDB4NDAsIDB4NDUsIDB4RjgsIDB4MkIsIDB4MDIsIDB4MDAsIDB4NDAsIDB4NDUsIDB4MDMsIDB4MDAsIDB4NTgsIDB4NEYsIDB4NDQsIDB4MDAsIDB4MDcsIDB4MDIsCisJIDB4NTgsIDB4NEYsIDB4NTAsIDB4MDAsIDB4MDQsIDB4MDUsIDB4NjYsIDB4NTAsIDB4NjUsIDB4NTIsIDB4NjEsIDB4NTEsIDB4MDksIDB4MDAsIDB4MjYsIDB4NDcsCisJIDB4MDAsIDB4QkYsIDB4MEUsIDB4RkIsIDB4MkUsIDB4RjUsIDB4MDUsIDB4RjAsIDB4ODAsIDB4NjAsIDB4NjQsIDB4NTAsIDB4MDAsIDB4NzIsIDB4N0UsIDB4NzEsCisJIDB4QUMsIDB4RkYsIDB4QjMsIDB4NjAsIDB4QkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OEUsIDB4RkYsIDB4MEYsIDB4RjMsIDB4MEYsIDB4NjAsIDB4RkUsIDB4NjUsCisJIDB4MjQsIDB4ODYsIDB4MEQsIDB4RjMsIDB4MjQsIDB4NDYsIDB4NjAsIDB4NDAsIDB4RkIsIDB4M0IsIDB4MDcsIDB4MDAsIDB4ODAsIDB4MjYsIDB4MDIsIDB4MDAsCisJIDB4MjMsIDB4NDYsIDB4MDMsIDB4NEMsIDB4NDYsIDB4NjEsIDB4M0EsIDB4NjUsIDB4MEMsIDB4MDAsIDB4MkUsIDB4RjMsIDB4NDAsIDB4NDUsIDB4RjgsIDB4MkIsCisJIDB4MDIsIDB4MDAsIDB4NDAsIDB4NDUsIDB4MDMsIDB4MDAsIDB4NTgsIDB4NEYsIDB4MTYsIDB4MDAsIDB4MDcsIDB4MDIsIDB4NTgsIDB4NEYsIDB4MjIsIDB4MDAsCisJIDB4MDQsIDB4MDUsIDB4NjYsIDB4NTAsIDB4NjUsIDB4NTIsIDB4NjEsIDB4NTEsIDB4MDksIDB4MDAsIDB4MjYsIDB4NDcsIDB4MDAsIDB4QkYsIDB4MEYsIDB4RkIsCisJIDB4MkUsIDB4RjUsIDB4MDUsIDB4RjAsIDB4ODAsIDB4NjAsIDB4NjQsIDB4NTAsIDB4MDAsIDB4NzIsIDB4N0UsIDB4NzEsIDB4OEQsIDB4RkYsIDB4QUQsIDB4RkYsCisJIDB4QjMsIDB4NjAsIDB4QkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDQsIDB4ODksIDB4RjEsIDB4OEEsIDB4RjEsIDB4RDAsIDB4ODAsIDB4RDAsIDB4ODAsCisJIDB4MDcsIDB4MDQsIDB4MDEsIDB4MDYsIDB4MDUsIDB4MDAsIDB4MjUsIDB4NDYsIDB4MDEsIDB4RjAsIDB4MDMsIDB4NjcsIDB4QTAsIDB4ODUsIDB4OTQsIDB4ODAsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDYsIDB4MjYsIDB4NDEsIDB4NDYsIDB4NjMsIDB4MDEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QjUsCisJIDB4RDUsIDB4ODEsIDB4MDAsIDB4RjIsIDB4MDUsIDB4MDQsIDB4MDQsIDB4NjMsIDB4NjAsIDB4NDYsIDB4RjcsIDB4MUIsIDB4NDIsIDB4RkUsIDB4MEQsIDB4MDAsCisJIDB4NjEsIDB4NDQsIDB4QzUsIDB4ODEsIDB4NjMsIDB4NDUsIDB4QzUsIDB4ODEsIDB4OUMsIDB4ODQsIDB4REMsIDB4ODQsIDB4MDEsIDB4RjIsIDB4RjAsIDB4ODUsCisJIDB4RjAsIDB4ODAsIDB4NjUsIDB4NDQsIDB4RjgsIDB4ODUsIDB4RkYsIDB4RkYsIDB4MDIsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTIsIDB4RkYsCisJIDB4MEYsIDB4NjAsIDB4OEIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QUMsIDB4ODYsIDB4MEUsIDB4RjIsIDB4MDcsIDB4MDMsIDB4MDAsIDB4QTgsIDB4MDksIDB4RjIsCisJIDB4RkEsIDB4MDIsIDB4MDEsIDB4NjcsIDB4MEUsIDB4RkEsIDB4MDgsIDB4RkUsIDB4MTcsIDB4MDAsIDB4OEIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RDgsIDB4QTAsCisJIDB4MDAsIDB4QjQsIDB4MTIsIDB4MDYsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjEsIDB4NDEsIDB4NEEsIDB4N0MsIDB4QTEsIDB4MEUsIDB4QTEsIDB4QTIsIDB4RkYsCisJIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QzEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4RkYsIDB4MDYsIDB4MDMsIDB4MkEsIDB4NDMsIDB4QjUsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4RTIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4RkUsIDB4QTMsIDB4RkYsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDEsIDB4NEEsCisJIDB4NDIsIDB4QTEsIDB4MDMsIDB4MDAsIDB4NDEsIDB4NEEsIDB4N0MsIDB4QTEsIDB4MEUsIDB4QTEsIDB4QTIsIDB4RkYsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4QzEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4MkEsIDB4NDMsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4RTIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4RkUsIDB4MEMsIDB4MDAsIDB4MEYsIDB4NjAsIDB4OEIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QUMsIDB4ODYsIDB4MEUsIDB4RjIsIDB4MDYsIDB4MDMsCisJIDB4MDAsIDB4QTgsIDB4MDksIDB4RjIsIDB4RkEsIDB4MDIsIDB4MDEsIDB4NjcsIDB4MEUsIDB4RkEsIDB4MDgsIDB4RkUsIDB4QTMsIDB4RkYsIDB4MkQsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4OEMsIDB4RjMsIDB4N0MsIDB4NjMsIDB4MDAsIDB4QkUsIDB4NDAsIDB4NDUsIDB4MUEsIDB4MDMsIDB4MDAsIDB4NjUsIDB4NjUsIDB4NDQsCisJIDB4REMsIDB4ODUsIDB4ODQsIDB4QTEsIDB4MDAsIDB4RjIsIDB4MDYsIDB4MDYsIDB4MDEsIDB4RkMsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4RjcsIDB4MDIsCisJIDB4NDAsIDB4NDUsIDB4MEUsIDB4MDAsIDB4OEIsIDB4RjMsIDB4MDAsIDB4NjMsIDB4RDQsIDB4ODQsIDB4OEIsIDB4RkIsIDB4ODAsIDB4NjAsIDB4N0MsIDB4NjQsCisJIDB4MDEsIDB4RkEsIDB4MDAsIDB4RjAsIDB4MDAsIDB4RkMsIDB4RDMsIDB4ODAsIDB4OEMsIDB4RjksIDB4MDIsIDB4MDIsIDB4OEQsIDB4RjksIDB4MDgsIDB4RkUsCisJIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4MjUsIDB4NDYsIDB4MDUsIDB4RkEsIDB4MDYsIDB4RkEsIDB4MDEsIDB4RjAsIDB4MDMsIDB4NjcsCisJIDB4MDIsIDB4RkMsIDB4QjAsIDB4ODQsIDB4M0EsIDB4N0UsIDB4MDEsIDB4RkEsIDB4MTIsIDB4NjQsIDB4MDMsIDB4RkEsIDB4MDAsIDB4RjAsIDB4MDQsIDB4RjgsCisJIDB4MDAsIDB4NjQsIDB4MEMsIDB4NjEsIDB4MTAsIDB4NjMsIDB4NTksIDB4REEsIDB4RkUsIDB4MUYsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDMsCisJIDB4RTMsIDB4ODEsIDB4RTksIDB4ODEsIDB4MDMsIDB4MDUsIDB4MTYsIDB4MDMsIDB4MDAsIDB4NjEsIDB4MDEsIDB4MDAsIDB4RUMsIDB4NjMsIDB4NjEsIDB4NDYsCisJIDB4QkYsIDB4RDIsIDB4MjcsIDB4NDUsIDB4REMsIDB4ODQsIDB4QTIsIDB4REEsIDB4QkUsIDB4RDIsIDB4MjUsIDB4NDYsIDB4ODgsIDB4RjgsIDB4MDQsIDB4MUIsCisJIDB4MjUsIDB4NDQsIDB4NjEsIDB4NDYsIDB4QTMsIDB4REEsIDB4MDQsIDB4MDAsIDB4MEEsIDB4RkEsIDB4NjAsIDB4NDYsIDB4MjUsIDB4NDQsIDB4MDksIDB4RkEsCisJIDB4NjEsIDB4NDYsIDB4QkUsIDB4REEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDQsIDB4MDAsIDB4QTgsIDB4MDcsIDB4NEIsIDB4MEMsIDB4MDMsCisJIDB4NTgsIDB4NEYsIDB4MzMsIDB4MDAsIDB4MEIsIDB4NDcsIDB4MUYsIDB4NjAsIDB4MEEsIDB4NjUsIDB4MjcsIDB4NDQsIDB4RDQsIDB4ODAsIDB4MDAsIDB4NjQsCisJIDB4MDEsIDB4MDIsIDB4MEYsIDB4RkEsIDB4NTgsIDB4NEYsIDB4RDMsIDB4MDEsIDB4NzAsIDB4MDAsIDB4MjUsIDB4NDMsIDB4RTMsIDB4ODQsIDB4N0MsIDB4NDEsCisJIDB4MDIsIDB4MDQsIDB4RTgsIDB4ODEsIDB4RUMsIDB4NjMsIDB4NjEsIDB4NDYsIDB4QTMsIDB4RDIsIDB4MDAsIDB4N0MsIDB4NDAsIDB4NDUsIDB4QkYsIDB4RDgsCisJIDB4QTMsIDB4RDgsIDB4QkUsIDB4RDgsIDB4MjcsIDB4NDIsIDB4NUEsIDB4RDMsIDB4MjUsIDB4NUMsIDB4NjAsIDB4NDEsIDB4MDIsIDB4MUIsIDB4MjcsIDB4RDksCisJIDB4MDUsIDB4MDAsIDB4MjUsIDB4NDYsIDB4MEEsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MjUsIDB4NDQsIDB4MDksIDB4RkEsIDB4MjUsIDB4NDQsIDB4MjcsIDB4NDMsCisJIDB4MDAsIDB4NjEsIDB4NjAsIDB4NDYsIDB4MDksIDB4RjIsIDB4MDgsIDB4RkMsIDB4MDAsIDB4QTgsIDB4REQsIDB4ODEsIDB4RkEsIDB4MDIsIDB4QkYsIDB4RDEsCisJIDB4NjYsIDB4NDQsIDB4QkUsIDB4REIsIDB4QzEsIDB4ODQsIDB4QkYsIDB4REIsIDB4NDgsIDB4MDAsIDB4MjUsIDB4NDYsIDB4RUMsIDB4NjMsIDB4MDgsIDB4RjIsCisJIDB4ODksIDB4RjIsIDB4MUUsIDB4MTgsIDB4NDAsIDB4NDcsIDB4RTAsIDB4ODQsIDB4RTgsIDB4ODUsIDB4MDIsIDB4MDUsIDB4RTgsIDB4ODMsIDB4MDAsIDB4NjUsCisJIDB4NjUsIDB4NDYsIDB4QkYsIDB4RDIsIDB4NjEsIDB4NUMsIDB4Q0MsIDB4ODQsIDB4QTIsIDB4REEsIDB4MjUsIDB4NDYsIDB4MEEsIDB4RjIsIDB4MDAsIDB4QjksCisJIDB4NjUsIDB4NDYsIDB4MDgsIDB4MjQsIDB4QkUsIDB4REEsIDB4MDIsIDB4MUIsIDB4QTMsIDB4RDgsIDB4MDIsIDB4MDAsIDB4NjAsIDB4NDYsIDB4ODksIDB4RkEsCisJIDB4MDAsIDB4QjksIDB4NjEsIDB4NDYsIDB4MDgsIDB4MjgsIDB4MEEsIDB4RkEsIDB4MjUsIDB4NDYsIDB4ODksIDB4RkMsIDB4OEEsIDB4RkMsIDB4ODgsIDB4RkMsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjEsIDB4MjgsIDB4NjUsIDB4MjUsIDB4NDMsIDB4OEQsIDB4RjMsIDB4QUYsIDB4ODMsIDB4MDAsIDB4QkUsCisJIDB4MTgsIDB4MDMsIDB4MDIsIDB4MDMsIDB4MDAsIDB4RkMsIDB4MDEsIDB4MDAsIDB4OEMsIDB4RkQsIDB4NjMsIDB4NDYsIDB4NjUsIDB4NDQsIDB4Q0MsIDB4ODUsCisJIDB4MDAsIDB4RjIsIDB4MDcsIDB4MDIsIDB4OEQsIDB4RjUsIDB4MDAsIDB4NjQsIDB4MDAsIDB4RkEsIDB4REUsIDB4NjAsIDB4QUYsIDB4NjQsIDB4MDksIDB4RkIsCisJIDB4MDgsIDB4MDAsIDB4NjYsIDB4NDMsIDB4MDAsIDB4QkUsIDB4REQsIDB4ODEsIDB4RjEsIDB4MDIsIDB4OEIsIDB4RjEsIDB4OEQsIDB4RkQsIDB4QzEsIDB4ODQsCisJIDB4OEIsIDB4RkIsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDUsIDB4MjksIDB4NDMsIDB4RkMsIDB4QTMsIDB4NjYsIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4MjUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MDAsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDMsIDB4NjEsIDB4MEUsIDB4NjUsIDB4MUYsIDB4NjAsCisJIDB4MUUsIDB4NjMsIDB4NDMsIDB4NDksIDB4QTMsIDB4RDMsIDB4MDYsIDB4QTMsIDB4MDAsIDB4QTgsIDB4Q0QsIDB4ODEsIDB4MDQsIDB4MDIsIDB4RjksIDB4MDIsCisJIDB4QjMsIDB4NjAsIDB4QkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MjYsIDB4RTYsIDB4MDEsIDB4RDQsIDB4ODAsIDB4NjAsIDB4NDUsIDB4RTMsIDB4MDUsCisJIDB4RjYsIDB4QTMsIDB4QkQsIDB4RDEsIDB4QkQsIDB4RDEsIDB4NDQsIDB4NDcsIDB4NDQsIDB4NDgsIDB4NDQsIDB4NDUsIDB4MUYsIDB4NjAsIDB4NjAsIDB4NjQsCisJIDB4NDQsIDB4RDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NDgsIDB4RkUsIDB4OEMsIDB4RjUsIDB4OEIsIDB4RjMsIDB4MEQsIDB4MTgsIDB4Q0MsIDB4ODQsCisJIDB4OEIsIDB4RkIsIDB4ODAsIDB4NjAsIDB4N0MsIDB4NjQsIDB4MDEsIDB4RkEsIDB4MDAsIDB4NjQsIDB4MDAsIDB4RjAsIDB4MDAsIDB4RkEsIDB4RDAsIDB4ODAsCisJIDB4OEMsIDB4RjksIDB4MDIsIDB4MDIsIDB4OEQsIDB4RjksIDB4MDgsIDB4RkUsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUUsIDB4NjAsIDB4Q0UsIDB4NjMsCisJIDB4MEQsIDB4NjUsIDB4MDAsIDB4NjEsIDB4NDEsIDB4NDgsIDB4QTMsIDB4RDMsIDB4MDYsIDB4QTMsIDB4QUMsIDB4ODYsIDB4MDAsIDB4NjEsIDB4MDksIDB4MDMsCisJIDB4MDAsIDB4RjIsIDB4MDksIDB4RjAsIDB4QUMsIDB4ODYsIDB4MDAsIDB4RjIsIDB4REQsIDB4ODEsIDB4RkMsIDB4MDIsIDB4NjQsIDB4NDQsIDB4QUMsIDB4ODYsCisJIDB4RjYsIDB4MDEsIDB4NjEsIDB4NDQsIDB4MjUsIDB4NDYsIDB4MjcsIDB4REEsIDB4NjUsIDB4NDQsIDB4MjgsIDB4NDUsIDB4NDUsIDB4ODgsIDB4Q0MsIDB4ODUsCisJIDB4NUEsIDB4ODcsIDB4RTksIDB4MDIsIDB4MDAsIDB4NjQsIDB4MjcsIDB4REEsIDB4NUEsIDB4REEsIDB4NUEsIDB4ODcsIDB4ODcsIDB4RjMsIDB4ODYsIDB4RjEsCisJIDB4MDIsIDB4QTQsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDUsIDB4MDAsIDB4NjEsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4QUMsIDB4ODYsIDB4MDAsIDB4RjIsCisJIDB4MDQsIDB4MDMsIDB4QUMsIDB4ODYsIDB4MDAsIDB4RjIsIDB4REQsIDB4ODEsIDB4RkMsIDB4MDIsIDB4NjUsIDB4NDQsIDB4MDIsIDB4QTUsIDB4NjUsIDB4NDYsCisJIDB4NjQsIDB4NDQsIDB4Q0MsIDB4OUMsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDIsIDB4NjEsIDB4NDQsIDB4MjUsIDB4NDYsIDB4MjcsIDB4REEsIDB4NUEsIDB4ODcsCisJIDB4MjgsIDB4NDUsIDB4NDUsIDB4ODgsIDB4ODcsIDB4RjMsIDB4ODYsIDB4RjEsIDB4MDIsIDB4QTQsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDUsIDB4MDAsIDB4NjEsCisJIDB4NzYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4QUMsIDB4ODYsIDB4MDAsIDB4RjIsIDB4MDksIDB4MDMsIDB4MDAsIDB4RjIsIDB4MDksIDB4RjAsIDB4QUMsIDB4ODYsCisJIDB4MDAsIDB4RjIsIDB4REQsIDB4ODEsIDB4RkMsIDB4MDIsIDB4NjQsIDB4NDQsIDB4QUMsIDB4ODYsIDB4RjYsIDB4MDEsIDB4NjUsIDB4NDQsIDB4MDIsIDB4QTUsCisJIDB4NjUsIDB4NDYsIDB4NjQsIDB4NDQsIDB4Q0MsIDB4OUMsIDB4NjEsIDB4NDQsIDB4RUIsIDB4MDIsIDB4MjUsIDB4NDYsIDB4MjcsIDB4REEsIDB4NUEsIDB4ODcsCisJIDB4MjgsIDB4NDUsIDB4NDUsIDB4ODgsIDB4MDYsIDB4NjAsIDB4NDAsIDB4NjUsIDB4OEMsIDB4RjMsIDB4MDEsIDB4NjEsIDB4QUMsIDB4ODYsIDB4MDAsIDB4RjIsCisJIDB4MDMsIDB4MDMsIDB4RDUsIDB4ODAsIDB4REQsIDB4ODEsIDB4RkEsIDB4MDQsIDB4Q0QsIDB4ODQsIDB4MjUsIDB4NDYsIDB4MjcsIDB4REEsIDB4MjgsIDB4NDUsCisJIDB4QzQsIDB4ODQsIDB4NUEsIDB4REEsIDB4REEsIDB4ODEsIDB4OEIsIDB4RjEsIDB4NTksIDB4RDgsIDB4MUUsIDB4NjAsIDB4Q0MsIDB4NjQsIDB4MTgsIDB4NjMsCisJIDB4QTAsIDB4RDEsIDB4MDYsIDB4QTQsIDB4NTksIDB4RDgsIDB4RkMsIDB4MUYsIDB4MDAsIDB4NjQsIDB4NTksIDB4REEsIDB4NTksIDB4REEsIDB4MDEsIDB4NjAsCisJIDB4MUEsIDB4NjQsIDB4MEEsIDB4NjMsIDB4NTgsIDB4RDEsIDB4NTksIDB4RDgsIDB4RkQsIDB4MUYsIDB4N0QsIDB4RjEsIDB4NTksIDB4RDgsIDB4NDUsIDB4MDEsCisJIDB4MDcsIDB4NEIsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NEQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEIsIDB4NDcsIDB4NTgsIDB4NEYsIDB4MjEsIDB4MDAsCisJIDB4M0MsIDB4MDEsIDB4MDcsIDB4NEIsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NEQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEIsIDB4NDcsIDB4MjcsIDB4NDQsCisJIDB4MDAsIDB4QkUsIDB4MDgsIDB4RjAsIDB4MTUsIDB4MDMsIDB4NjQsIDB4NDIsIDB4NEEsIDB4RDMsIDB4MDksIDB4RjIsIDB4REMsIDB4ODMsIDB4QTIsIDB4REQsCisJIDB4MjUsIDB4NDMsIDB4MDksIDB4RkMsIDB4NjMsIDB4NDYsIDB4MjcsIDB4NDMsIDB4MEEsIDB4RkMsIDB4MDksIDB4RkEsIDB4MDgsIDB4RjgsIDB4MDAsIDB4QTgsCisJIDB4NjYsIDB4NDMsIDB4MDMsIDB4MDIsIDB4NjQsIDB4NDQsIDB4NTgsIDB4REQsIDB4MDMsIDB4MDAsIDB4NjAsIDB4NDYsIDB4MjUsIDB4NDQsIDB4MEEsIDB4RkEsCisJIDB4MUMsIDB4MDEsIDB4MjcsIDB4NDMsIDB4RTMsIDB4ODEsIDB4RTksIDB4ODEsIDB4MDMsIDB4MDUsIDB4MTYsIDB4MDMsIDB4MDAsIDB4NjEsIDB4MDEsIDB4MDAsCisJIDB4RUMsIDB4NjMsIDB4NjEsIDB4NDYsIDB4QkYsIDB4RDIsIDB4MjcsIDB4NDUsIDB4REMsIDB4ODQsIDB4QTIsIDB4REEsIDB4QTMsIDB4RDIsIDB4MjUsIDB4NDYsCisJIDB4ODgsIDB4RjgsIDB4MDQsIDB4MUIsIDB4MjUsIDB4NDQsIDB4NjEsIDB4NDYsIDB4QkUsIDB4REEsIDB4MDQsIDB4MDAsIDB4MDksIDB4RkEsIDB4NjAsIDB4NDYsCisJIDB4MjUsIDB4NDQsIDB4MEEsIDB4RkEsIDB4NjEsIDB4NDYsIDB4QTMsIDB4REEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RkUsIDB4MDcsIDB4MDUsCisJIDB4QTMsIDB4RkUsIDB4MDcsIDB4MDUsIDB4QTEsIDB4RkUsIDB4NDYsIDB4MDUsIDB4NjAsIDB4NjQsIDB4M0IsIDB4REIsIDB4MEYsIDB4MDAsIDB4MjAsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4RkEsIDB4MDEsIDB4MEEsIDB4NjAsIDB4ODAsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkIsIDB4QjQsIDB4QTIsIDB4REIsIDB4QTAsIDB4NEMsCisJIDB4NTksIDB4QkMsIDB4RkYsIDB4QjQsIDB4QTAsIDB4NTEsIDB4QTAsIDB4NEMsIDB4N0QsIDB4QjQsIDB4QTAsIDB4NTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4ODMsIDB4M0UsIDB4NDAsIDB4NjAsIDB4MEIsIDB4NjUsIDB4MkIsIDB4NDQsIDB4MDAsIDB4NjMsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MDIsIDB4MjQsCisJIDB4OTQsIDB4ODQsIDB4RjMsIDB4ODMsIDB4Q0QsIDB4ODEsIDB4RkYsIDB4RkYsIDB4RjgsIDB4MDIsIDB4REYsIDB4ODMsIDB4MkYsIDB4NTgsIDB4NDAsIDB4NEIsCisJIDB4MDAsIDB4NjIsIDB4MDEsIDB4NjQsIDB4RDQsIDB4ODAsIDB4RTAsIDB4ODQsIDB4MUEsIDB4MDMsIDB4RDQsIDB4ODAsIDB4RTAsIDB4ODQsIDB4MTUsIDB4MDMsCisJIDB4NjEsIDB4NDQsIDB4MTEsIDB4NjEsIDB4RTAsIDB4ODQsIDB4Q0QsIDB4ODEsIDB4RkQsIDB4MDQsIDB4MDEsIDB4MDAsIDB4RTAsIDB4ODQsIDB4RjIsIDB4ODIsCisJIDB4RkYsIDB4RkYsIDB4MDIsIDB4MjQsIDB4QzYsIDB4ODIsIDB4MDIsIDB4MjgsIDB4RDYsIDB4ODIsIDB4RTIsIDB4ODAsIDB4Q0QsIDB4ODEsIDB4MDIsIDB4MjgsCisJIDB4MDEsIDB4QkMsIDB4RjQsIDB4MDIsIDB4MDEsIDB4MkEsIDB4QzYsIDB4ODIsIDB4MDMsIDB4MDAsIDB4RTksIDB4ODEsIDB4RjIsIDB4ODIsIDB4NjEsIDB4NDQsCisJIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4M0IsIDB4REIsIDB4MEMsIDB4NjAsIDB4NkUsIDB4RjMsIDB4NUEsIDB4RDEsIDB4NjAsIDB4NDAsCisJIDB4MDQsIDB4M0EsIDB4MkMsIDB4MDAsIDB4MDAsIDB4NjQsIDB4NEEsIDB4REIsIDB4MUUsIDB4NjAsIDB4Q0UsIDB4NjMsIDB4QTMsIDB4RDMsIDB4NDYsIDB4NDMsCisJIDB4QUMsIDB4ODYsIDB4M0MsIDB4NDUsIDB4MjIsIDB4MDMsIDB4RDQsIDB4ODAsIDB4MDcsIDB4RjIsIDB4MDIsIDB4MDIsIDB4MDksIDB4RjIsIDB4RjgsIDB4MDEsCisJIDB4RDAsIDB4ODAsIDB4MDksIDB4RjIsIDB4RjUsIDB4MDIsIDB4NjAsIDB4NDMsIDB4ODAsIDB4NjcsIDB4QjAsIDB4ODEsIDB4NjEsIDB4NDQsIDB4MEYsIDB4NjAsCisJIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MDksIDB4NjAsCisJIDB4MDgsIDB4NjUsIDB4MEUsIDB4RjIsIDB4MDIsIDB4RjIsIDB4NjAsIDB4NDAsIDB4RjAsIDB4MzcsIDB4MDUsIDB4MDAsIDB4OEYsIDB4RjMsIDB4RDQsIDB4ODAsCisJIDB4Q0MsIDB4ODQsIDB4MDEsIDB4MDIsIDB4OEYsIDB4RkIsIDB4NjMsIDB4NDQsIDB4REIsIDB4MDEsIDB4MjMsIDB4NDYsIDB4M0MsIDB4NDQsIDB4QUMsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4OTQsIDB4MDIsIDB4NjksIDB4RjMsIDB4NkEsIDB4RjMsIDB4MDIsIDB4QTgsIDB4MDIsIDB4QTgsIDB4MDgsIDB4MDIsIDB4MDAsIDB4NjQsCisJIDB4NkIsIDB4RkIsIDB4NjksIDB4RkIsIDB4NkEsIDB4RkIsIDB4MDAsIDB4NjQsIDB4NkMsIDB4RkIsIDB4Q0EsIDB4RkUsIDB4OTIsIDB4MDAsIDB4MDMsIDB4MDIsCisJIDB4MDAsIDB4NjQsIDB4NkEsIDB4RkIsIDB4Q0EsIDB4RkUsIDB4MDEsIDB4NjQsIDB4M0IsIDB4REIsIDB4MEYsIDB4NjAsIDB4NkEsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MzUsIDB4MDMsIDB4MkMsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4ODYsIDB4MDAsCisJIDB4MkUsIDB4RjIsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsCisJIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MkUsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsCisJIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MkQsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsCisJIDB4NjEsIDB4NDYsIDB4MkMsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsCisJIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4ODcsIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4NUYsIDB4MDIsIDB4NjYsIDB4NDUsCisJIDB4NjMsIDB4NDYsIDB4MDYsIDB4RjIsIDB4NjUsIDB4NDYsIDB4ODAsIDB4QjAsIDB4MDksIDB4RjIsIDB4NTgsIDB4MDMsIDB4QUMsIDB4ODYsIDB4Q0EsIDB4MDEsCisJIDB4NkEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QTgsIDB4RkYsIDB4RkYsIDB4NEMsIDB4MDIsIDB4MEYsIDB4NjAsIDB4NzMsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MEYsIDB4MDMsIDB4NzYsIDB4RjEsIDB4MDcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4MDksIDB4RjIsCisJIDB4MDMsIDB4MDIsIDB4QUMsIDB4ODYsIDB4MDcsIDB4RjIsIDB4RkEsIDB4MDIsIDB4MDMsIDB4MDIsIDB4MDAsIDB4NjQsIDB4NzYsIDB4RkIsIDB4RUQsIDB4MDEsCisJIDB4NDYsIDB4NUMsIDB4M0MsIDB4MDAsIDB4MEYsIDB4NjAsIDB4NzYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MDEsIDB4MDMsCisJIDB4MzUsIDB4MDIsIDB4NkIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QTgsIDB4RkYsIDB4RkYsIDB4MTMsIDB4MDIsIDB4MEYsIDB4NjAsIDB4NkQsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MEIsIDB4MDMsIDB4MkEsIDB4RjAsIDB4MjAsIDB4NjcsIDB4MDksIDB4RjIsIDB4QjAsIDB4ODMsCisJIDB4MDAsIDB4QTgsIDB4MDAsIDB4NjQsIDB4MDIsIDB4MDMsIDB4MkEsIDB4RkMsIDB4MDEsIDB4MDAsIDB4NkIsIDB4RkIsIDB4MUYsIDB4MDAsIDB4MDAsIDB4NjQsCisJIDB4NkIsIDB4RkIsIDB4MEYsIDB4NjAsIDB4NjcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MTIsIDB4MDMsIDB4MkEsIDB4RjAsCisJIDB4MDgsIDB4NjcsIDB4QTAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MTIsIDB4MDMsIDB4NzYsIDB4RjEsIDB4MDcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsCisJIDB4MDksIDB4RjIsIDB4MDMsIDB4MDIsIDB4QUMsIDB4ODYsIDB4MDcsIDB4RjIsIDB4RkEsIDB4MDIsIDB4MDgsIDB4MDIsIDB4MDAsIDB4NjQsIDB4NzYsIDB4RkIsCisJIDB4RTgsIDB4MDEsIDB4MDAsIDB4NjQsIDB4NzYsIDB4RkIsIDB4QjcsIDB4NjAsIDB4QTIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4RkMsIDB4RkIsCisJIDB4NDYsIDB4NUMsIDB4MTYsIDB4NjAsIDB4MkIsIDB4RjMsIDB4MEQsIDB4RjIsIDB4NjAsIDB4NUMsIDB4NjQsIDB4NUYsIDB4MEQsIDB4RkEsIDB4MDcsIDB4RjAsCisJIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NzYsIDB4RjksIDB4NjAsIDB4NDAsIDB4MDgsIDB4MkIsIDB4MDUsIDB4MDAsIDB4MDAsIDB4NjQsIDB4NDgsIDB4RkIsCisJIDB4QkEsIDB4NjAsIDB4MDMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDIsIDB4MjMsIDB4RjAsCisJIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4QkYsIDB4NjAsIDB4MTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4MDAsIDB4NjMsCisJIDB4NDAsIDB4NDcsIDB4NTAsIDB4MzYsIDB4MDEsIDB4MDAsIDB4MDEsIDB4NjMsIDB4NDgsIDB4RkQsIDB4NEEsIDB4RjMsIDB4MzUsIDB4RkEsIDB4MTAsIDB4QTQsCisJIDB4NEEsIDB4RkIsIDB4MDAsIDB4NjQsIDB4MTUsIDB4RkEsIDB4MTYsIDB4RkEsIDB4MEYsIDB4RkEsIDB4MDcsIDB4RjAsIDB4ODcsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDUsIDB4MDMsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4MTEsIDB4RjIsIDB4QkEsIDB4RkIsIDB4NjMsIDB4NDYsCisJIDB4MDMsIDB4RjIsIDB4MDAsIDB4RjQsIDB4MDEsIDB4RjIsIDB4RkMsIDB4QTUsIDB4MDAsIDB4N0YsIDB4RDQsIDB4ODQsIDB4MjcsIDB4NDUsIDB4M0MsIDB4NDYsCisJIDB4MUEsIDB4RkEsIDB4MjIsIDB4NjMsIDB4N0IsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTQsIDB4ODQsIDB4MDMsIDB4MkIsIDB4MUMsIDB4NjMsIDB4MkEsIDB4RkEsCisJIDB4OEYsIDB4QjAsIDB4ODgsIDB4MzYsIDB4MDIsIDB4QTMsIDB4NjAsIDB4NDAsIDB4QTQsIDB4MzYsIDB4MTQsIDB4NjMsIDB4NDMsIDB4NEMsIDB4MTgsIDB4RkMsCisJIDB4MDAsIDB4N0MsIDB4MjIsIDB4RjgsIDB4NjQsIDB4NDEsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4M0EsIDB4RjIsIDB4NjMsIDB4NDYsCisJIDB4RkYsIDB4QjQsIDB4MjIsIDB4RkEsIDB4NjAsIDB4NDAsIDB4MDAsIDB4MzYsIDB4OTIsIDB4MDAsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MEMsIDB4QjAsCisJIDB4MDgsIDB4M0EsIDB4OEQsIDB4MDAsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MjYsIDB4OEEsIDB4MDAsIDB4MDMsIDB4RjIsIDB4MDAsIDB4RjQsIDB4QTAsIDB4RDIsCisJIDB4QUEsIDB4NjAsIDB4QUEsIDB4NjUsIDB4NUEsIDB4RDAsIDB4RDQsIDB4ODAsIDB4MDMsIDB4NjQsIDB4MEEsIDB4MDIsIDB4RDAsIDB4ODAsIDB4MDAsIDB4NjQsCisJIDB4NUEsIDB4RDAsIDB4MDYsIDB4MDIsIDB4RDAsIDB4ODAsIDB4RjgsIDB4N0YsIDB4RDAsIDB4ODAsIDB4MDEsIDB4MDMsIDB4MDEsIDB4MDIsIDB4MDEsIDB4NjEsCisJIDB4NjIsIDB4NDMsIDB4NDYsIDB4NDMsIDB4M0MsIDB4NDYsIDB4MDcsIDB4RjQsIDB4M0EsIDB4RjIsIDB4RkYsIDB4RkYsIDB4QTMsIDB4NDYsIDB4NjAsIDB4NDAsCisJIDB4MjIsIDB4MjYsIDB4NDksIDB4MDAsIDB4NjAsIDB4NDUsIDB4NjMsIDB4NDIsIDB4NUEsIDB4RDAsIDB4Q0QsIDB4ODEsIDB4M0MsIDB4NDYsIDB4MTgsIDB4MDIsCisJIDB4NjQsIDB4NDQsIDB4ODgsIDB4M0EsIDB4MTUsIDB4MDAsIDB4OEUsIDB4MzcsIDB4MDAsIDB4MDAsIDB4NjUsIDB4NDQsIDB4MDEsIDB4MjYsIDB4NUYsIDB4MDAsCisJIDB4MDQsIDB4MjYsIDB4MDMsIDB4MDAsIDB4MTAsIDB4MjYsIDB4MDEsIDB4MDAsIDB4MzEsIDB4MDAsIDB4QTMsIDB4NDYsIDB4M0IsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4ODAsIDB4MjcsIDB4M0UsIDB4MDAsIDB4QTMsIDB4NDYsIDB4MDAsIDB4N0MsIDB4MjIsIDB4RjgsIDB4QTMsIDB4NDYsIDB4NEYsIDB4MDAsCisJIDB4QTMsIDB4NDYsIDB4NjUsIDB4NDQsIDB4MDEsIDB4MjYsIDB4MEIsIDB4MDAsIDB4MDQsIDB4MjYsIDB4MDMsIDB4MDAsIDB4MTAsIDB4MjYsIDB4MDEsIDB4MDAsCisJIDB4MUQsIDB4MDAsIDB4M0IsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4ODAsIDB4MjcsIDB4MkIsIDB4MDAsIDB4MTcsIDB4MDAsIDB4ODcsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDYsIDB4M0EsIDB4RjIsIDB4NjYsIDB4NDMsIDB4RkYsIDB4QjQsIDB4M0MsIDB4NDYsIDB4MjIsIDB4RjAsIDB4NjAsIDB4NDcsCisJIDB4QjAsIDB4ODQsIDB4MjIsIDB4RkEsIDB4NjMsIDB4NDYsIDB4M0IsIDB4RjAsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MjcsIDB4MDMsIDB4MDAsIDB4MTAsIDB4MjcsCisJIDB4MDEsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NjQsIDB4NDAsIDB4ODAsIDB4MjcsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4M0MsIDB4NDYsIDB4MDIsIDB4NjUsCisJIDB4QkUsIDB4NjAsIDB4QjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0QsIDB4ODEsIDB4NjMsIDB4NDIsIDB4NUEsIDB4RDAsIDB4M0MsIDB4NDYsIDB4MDksIDB4MDIsCisJIDB4NjQsIDB4NDQsIDB4ODgsIDB4M0EsIDB4MDYsIDB4MDAsIDB4NzcsIDB4MzcsIDB4MUEsIDB4MDAsIDB4NzgsIDB4MzcsIDB4MTgsIDB4MDAsIDB4OEUsIDB4MzcsCisJIDB4MTYsIDB4MDAsIDB4M0MsIDB4NDYsIDB4MjIsIDB4RjAsIDB4ODAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4RkYsIDB4RkYsIDB4M0YsIDB4RjIsCisJIDB4M0UsIDB4RjAsIDB4MDgsIDB4QTQsIDB4NjAsIDB4NDEsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDMsIDB4MDAsCisJIDB4MDQsIDB4MjYsIDB4MDMsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MkIsIDB4MDIsIDB4MDAsIDB4NjEsIDB4NDQsIDB4M0YsIDB4RkEsIDB4M0MsIDB4NDYsCisJIDB4MkMsIDB4RjIsIDB4MjcsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MzIsIDB4RjIsIDB4QjQsIDB4RjEsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4NDcsIDB4MDAsCisJIDB4MDksIDB4NjAsIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsIDB4M0YsIDB4RjIsIDB4MDksIDB4MDYsIDB4MkMsIDB4NDUsIDB4QzQsIDB4ODQsIDB4RDAsIDB4ODAsCisJIDB4NDAsIDB4NEEsIDB4MzQsIDB4MDYsIDB4NjAsIDB4NDMsIDB4NjQsIDB4NDQsIDB4NTQsIDB4ODgsIDB4MTcsIDB4MDAsIDB4NjAsIDB4NDUsIDB4MTMsIDB4NjAsCisJIDB4NEIsIDB4RjMsIDB4QkIsIDB4RjMsIDB4MDAsIDB4QkMsIDB4NjAsIDB4NDcsIDB4RUMsIDB4QTAsIDB4MjgsIDB4MDMsIDB4MjcsIDB4MDcsIDB4MkMsIDB4NDQsCisJIDB4QzQsIDB4ODEsIDB4MDIsIDB4NjAsIDB4MUMsIDB4NjUsIDB4NDUsIDB4NEEsIDB4RDUsIDB4ODAsIDB4MkMsIDB4NDUsIDB4MUYsIDB4MDYsIDB4MjcsIDB4NDAsCisJIDB4MDQsIDB4MjcsIDB4MjUsIDB4MDAsIDB4MkEsIDB4NDMsIDB4RDcsIDB4ODUsIDB4NDUsIDB4NDgsIDB4QjUsIDB4RjEsIDB4MEYsIDB4RjIsIDB4RDMsIDB4ODAsCisJIDB4MDEsIDB4NjUsIDB4MDEsIDB4MDcsIDB4MDAsIDB4NjUsIDB4QjQsIDB4ODQsIDB4MEYsIDB4RkEsIDB4MDAsIDB4NjMsIDB4M0YsIDB4RjIsIDB4MjgsIDB4NDUsCisJIDB4NjAsIDB4NDEsIDB4RDQsIDB4ODQsIDB4REYsIDB4ODMsIDB4RkMsIDB4MDcsIDB4MTQsIDB4RkMsIDB4MTcsIDB4RkEsIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4MjcsIDB4NDUsIDB4QjQsIDB4ODQsIDB4MkEsIDB4RkEsIDB4MjgsIDB4NDMsIDB4MTYsIDB4RkMsIDB4MEQsIDB4MDAsIDB4M0YsIDB4RjIsIDB4MkMsIDB4NDUsCisJIDB4QjUsIDB4RjEsIDB4QzQsIDB4ODEsIDB4RDEsIDB4ODAsIDB4MEYsIDB4RjIsIDB4MDEsIDB4MDYsIDB4MDEsIDB4QkMsIDB4MEYsIDB4RkEsIDB4M0YsIDB4RjIsCisJIDB4MTcsIDB4RkEsIDB4MDEsIDB4NjQsIDB4MTQsIDB4RkEsIDB4MEYsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4NkYsIDB4MDAsCisJIDB4NjQsIDB4RjEsIDB4MTUsIDB4NjAsIDB4REQsIDB4RjMsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MDMsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MjYsCisJIDB4MTQsIDB4MDAsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4MTIsIDB4RjAsIDB4MTUsIDB4NjAsIDB4REUsIDB4RjMsIDB4NjMsIDB4NDYsCisJIDB4NjQsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MjAsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MjYsIDB4MDcsIDB4MDAsIDB4MDEsIDB4MjYsIDB4MDgsIDB4MDAsCisJIDB4MDQsIDB4MjYsIDB4MDksIDB4MDAsIDB4MDYsIDB4NjEsIDB4NkUsIDB4NjMsIDB4MDgsIDB4MDAsIDB4MDIsIDB4NjEsIDB4MTQsIDB4NjMsIDB4MDUsIDB4MDAsCisJIDB4MDAsIDB4NjEsIDB4MEEsIDB4NjMsIDB4MDIsIDB4MDAsIDB4MDQsIDB4NjEsIDB4MzcsIDB4NjMsIDB4MDAsIDB4NjQsIDB4MjUsIDB4NjAsIDB4QTIsIDB4NjUsCisJIDB4NDUsIDB4RDEsIDB4RDUsIDB4ODEsIDB4MTUsIDB4NjAsIDB4REEsIDB4RjksIDB4MjUsIDB4NjAsIDB4N0EsIDB4NjUsIDB4NDUsIDB4RDEsIDB4MUMsIDB4RkMsCisJIDB4QjAsIDB4ODQsIDB4MUUsIDB4RkEsIDB4M0MsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MDgsIDB4NjEsIDB4MUUsIDB4NjAsCisJIDB4MEIsIDB4NjMsIDB4MjcsIDB4MDAsIDB4MjAsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MEEsIDB4NjEsIDB4MTYsIDB4NjAsIDB4MEYsIDB4NjMsIDB4MjEsIDB4MDAsCisJIDB4NDAsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MEMsIDB4NjEsIDB4MTIsIDB4NjAsIDB4MEEsIDB4NjMsIDB4MUIsIDB4MDAsIDB4ODAsIDB4MkEsIDB4MDQsIDB4MDAsCisJIDB4MEUsIDB4NjEsIDB4MEUsIDB4NjAsIDB4MEUsIDB4NjMsIDB4MTUsIDB4MDAsIDB4MDEsIDB4MkIsIDB4MDQsIDB4MDAsIDB4MTAsIDB4NjEsIDB4MEUsIDB4NjAsCisJIDB4MDksIDB4NjMsIDB4MEYsIDB4MDAsIDB4MDIsIDB4MkIsIDB4MDQsIDB4MDAsIDB4MTIsIDB4NjEsIDB4MEEsIDB4NjAsIDB4MEQsIDB4NjMsIDB4MDksIDB4MDAsCisJIDB4MDQsIDB4MkIsIDB4MDQsIDB4MDAsIDB4MTQsIDB4NjEsIDB4MEEsIDB4NjAsIDB4MDgsIDB4NjMsIDB4MDMsIDB4MDAsIDB4MTYsIDB4NjEsIDB4MEEsIDB4NjAsCisJIDB4MEMsIDB4NjMsIDB4MUUsIDB4RjAsIDB4NDAsIDB4NjcsIDB4MjUsIDB4NjAsIDB4QTIsIDB4NjUsIDB4NDUsIDB4RDEsIDB4RDUsIDB4ODEsIDB4MTUsIDB4NjAsCisJIDB4REEsIDB4RjksIDB4MjUsIDB4NjAsIDB4N0EsIDB4NjUsIDB4NDUsIDB4RDEsIDB4MUMsIDB4RkMsIDB4QjAsIDB4ODQsIDB4MUUsIDB4RkEsIDB4QUEsIDB4RjIsCisJIDB4MTUsIDB4NjAsIDB4QzIsIDB4RjMsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4NDQsIDB4NDQsIDB4NjEsIDB4NDAsIDB4MDgsIDB4MjYsCisJIDB4MDIsIDB4MDAsIDB4NjEsIDB4NDAsIDB4ODAsIDB4MzYsIDB4MTIsIDB4RjIsIDB4NjMsIDB4NDYsIDB4MkMsIDB4NjAsIDB4MjYsIDB4NjEsIDB4MDAsIDB4N0YsCisJIDB4NjAsIDB4NDUsIDB4NDUsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsIDB4MDAsIDB4N0YsIDB4NEIsIDB4RkIsIDB4NjUsIDB4NDQsIDB4MDAsIDB4N0UsCisJIDB4QkIsIDB4RkIsIDB4NjIsIDB4RjEsIDB4NjAsIDB4NDMsIDB4NjAsIDB4NDcsIDB4RDAsIDB4ODAsIDB4QzAsIDB4NjUsIDB4MDEsIDB4MDYsIDB4NjQsIDB4NDQsCisJIDB4MEEsIDB4MzYsIDB4NzAsIDB4NjQsIDB4MTQsIDB4MzYsIDB4MzgsIDB4NjQsIDB4MzcsIDB4MzYsIDB4MTUsIDB4NjQsIDB4NkUsIDB4MzYsIDB4MEIsIDB4NjQsCisJIDB4NDQsIDB4ODYsIDB4MkEsIDB4RjIsIDB4MDcsIDB4RjAsIDB4NjAsIDB4NDAsIDB4QjAsIDB4M0EsIDB4MDMsIDB4MDAsIDB4NDAsIDB4M0IsIDB4MDEsIDB4MDAsCisJIDB4MTIsIDB4MDAsIDB4MEMsIDB4QjQsIDB4MDgsIDB4M0EsIDB4NDQsIDB4MDAsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4ODAsIDB4MkIsCisJIDB4M0YsIDB4MDAsIDB4MTcsIDB4RjIsIDB4MjIsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MjIsIDB4MjIsIDB4MDQsIDB4MDAsIDB4MDAsIDB4QTgsCisJIDB4MDEsIDB4QTgsIDB4MzYsIDB4MDMsIDB4MzUsIDB4MDMsIDB4M0MsIDB4NDYsIDB4MkEsIDB4RjAsIDB4NDAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsCisJIDB4NjAsIDB4NDUsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDMsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDUsIDB4MDAsIDB4MDQsIDB4MjYsCisJIDB4MUQsIDB4MDAsIDB4MTAsIDB4MjYsIDB4MTAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MjcsIDB4MTgsIDB4MDAsIDB4MTAsIDB4MjcsIDB4MEIsIDB4MDAsCisJIDB4NjUsIDB4NDQsIDB4MkEsIDB4NjEsIDB4NjAsIDB4NDAsIDB4MDMsIDB4MkIsIDB4MjQsIDB4NjEsIDB4OEYsIDB4QjAsIDB4ODgsIDB4MzYsIDB4MDIsIDB4QTEsCisJIDB4NDEsIDB4NEMsIDB4OTgsIDB4RkEsIDB4MTUsIDB4MDAsIDB4NjUsIDB4NDQsIDB4MzIsIDB4NjEsIDB4NjAsIDB4NDAsIDB4MDMsIDB4MkIsIDB4MkMsIDB4NjEsCisJIDB4OEYsIDB4QjAsIDB4ODgsIDB4MzYsIDB4MDIsIDB4QTEsIDB4NDEsIDB4NEMsIDB4OTgsIDB4RkEsIDB4MEEsIDB4MDAsIDB4NjUsIDB4NDQsIDB4MkUsIDB4NjEsCisJIDB4NjAsIDB4NDAsIDB4MDMsIDB4MkIsIDB4MjgsIDB4NjEsIDB4OEYsIDB4QjAsIDB4ODgsIDB4MzYsIDB4MDIsIDB4QTEsIDB4NDEsIDB4NEMsIDB4OTgsIDB4RkEsCisJIDB4QkIsIDB4NjAsIDB4RkIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDUsIDB4QUEsIDB4RjIsIDB4MTUsIDB4NjAsIDB4QzIsIDB4RjMsIDB4MjQsIDB4NDYsCisJIDB4NjEsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MDIsIDB4MDAsIDB4NjEsIDB4NDAsIDB4ODAsIDB4MzYsIDB4MTIsIDB4RjIsIDB4NjUsIDB4NDYsIDB4NjAsIDB4NDAsCisJIDB4MTAsIDB4MjYsIDB4MzQsIDB4MDAsIDB4MkMsIDB4NDUsIDB4MTcsIDB4RjIsIDB4NEIsIDB4RjEsIDB4QzQsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODEsIDB4NjQsIDB4NDUsIDB4MTYsIDB4QTEsIDB4QjcsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QzAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjQsIDB4RjEsCisJIDB4MDEsIDB4QTQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MDYsIDB4QTQsIDB4MUIsIDB4RkEsIDB4QkIsIDB4RjMsCisJIDB4MjUsIDB4NjAsIDB4ODIsIDB4NjUsIDB4NjAsIDB4NDAsIDB4MEIsIDB4MzcsIDB4MDAsIDB4NjMsIDB4MEYsIDB4MzcsIDB4MDIsIDB4NjMsIDB4MEEsIDB4MzcsCisJIDB4MDQsIDB4NjMsIDB4MEUsIDB4MzcsIDB4MDYsIDB4NjMsIDB4MDksIDB4MzcsIDB4MDgsIDB4NjMsIDB4MEQsIDB4MzcsIDB4MEEsIDB4NjMsIDB4MDgsIDB4MzcsCisJIDB4MEMsIDB4NjMsIDB4MEMsIDB4MzcsIDB4MEUsIDB4NjMsIDB4MjgsIDB4QTMsIDB4NDcsIDB4RDEsIDB4RDgsIDB4QTMsIDB4RDcsIDB4ODMsIDB4MTUsIDB4NjAsCisJIDB4RDksIDB4RjksIDB4NDcsIDB4RDEsIDB4NDAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4MUYsIDB4RkEsIDB4NTYsIDB4MDAsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4ODAsIDB4MzYsIDB4MTcsIDB4MDAsIDB4NTAsIDB4MzYsIDB4MTUsIDB4MDAsIDB4MTAsIDB4MzYsIDB4MTMsIDB4MDAsIDB4MzAsIDB4MzYsCisJIDB4MTEsIDB4MDAsIDB4QTAsIDB4MzYsIDB4MEYsIDB4MDAsIDB4QjAsIDB4MzYsIDB4MEQsIDB4MDAsIDB4QzAsIDB4MzYsIDB4MEIsIDB4MDAsIDB4QkIsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MEEsIDB4MzcsIDB4MDYsIDB4MDAsIDB4MTUsIDB4NjAsIDB4REQsIDB4RjMsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjEsCisJIDB4NjAsIDB4NDAsIDB4MDQsIDB4MjYsIDB4MDAsIDB4NjEsIDB4QkIsIDB4RjMsIDB4MjUsIDB4NjAsIDB4N0EsIDB4NjUsIDB4NjAsIDB4NDAsIDB4MEEsIDB4MzcsCisJIDB4MDAsIDB4NjMsIDB4MTQsIDB4MzcsIDB4MDIsIDB4NjMsIDB4MzcsIDB4MzcsIDB4MDQsIDB4NjMsIDB4NkUsIDB4MzcsIDB4MDYsIDB4NjMsIDB4MjgsIDB4QTMsCisJIDB4NDcsIDB4RDEsIDB4RDgsIDB4QTMsIDB4RDcsIDB4ODMsIDB4MTUsIDB4NjAsIDB4RDksIDB4RjksIDB4NDcsIDB4RDEsIDB4RkYsIDB4RkYsIDB4QjEsIDB4ODQsCisJIDB4MUYsIDB4RkEsIDB4QkIsIDB4RjEsIDB4MkMsIDB4NDUsIDB4NjQsIDB4NDMsIDB4MTcsIDB4RjIsIDB4NEIsIDB4RjEsIDB4QzQsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODEsIDB4NjMsIDB4NDAsIDB4MzcsIDB4MzcsIDB4RTEsIDB4ODEsIDB4NjQsIDB4NDUsIDB4QjcsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4QzAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QUUsIDB4ODIsIDB4RkMsIDB4QTIsIDB4MEEsIDB4MDMsIDB4NjMsIDB4NDAsIDB4NkUsIDB4M0IsIDB4MDYsIDB4MDAsCisJIDB4NjAsIDB4NDEsIDB4MDQsIDB4MEQsIDB4NjMsIDB4NDQsIDB4ODAsIDB4N0UsIDB4QkIsIDB4RkIsIDB4NjEsIDB4NDQsIDB4REMsIDB4ODQsIDB4MkIsIDB4RjAsCisJIDB4MUIsIDB4RkEsIDB4NjQsIDB4NDQsIDB4ODAsIDB4MjcsIDB4NDcsIDB4MDAsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDUsIDB4NjQsIDB4NDYsIDB4MTIsIDB4RjIsCisJIDB4NjUsIDB4NDYsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MkUsIDB4MDAsIDB4MTYsIDB4RjIsIDB4MEYsIDB4RjAsIDB4QUMsIDB4ODQsIDB4MkMsIDB4NDUsCisJIDB4MjksIDB4MDMsIDB4NEIsIDB4RjEsIDB4QzQsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODEsIDB4NjMsIDB4NDAsIDB4MzcsIDB4MzcsCisJIDB4RTEsIDB4ODEsIDB4NjQsIDB4NDUsIDB4MEYsIDB4RjAsIDB4QjcsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QzAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QUUsIDB4ODIsCisJIDB4RkMsIDB4QTIsIDB4MEEsIDB4MDMsIDB4NjMsIDB4NDAsIDB4NkUsIDB4M0IsIDB4MDYsIDB4MDAsIDB4NjAsIDB4NDEsIDB4MDQsIDB4MEQsIDB4ODAsIDB4NjcsCisJIDB4QjAsIDB4ODQsIDB4MEYsIDB4RkEsIDB4NjEsIDB4NDQsIDB4REMsIDB4ODQsIDB4MUQsIDB4RkEsIDB4REUsIDB4NjUsIDB4QzQsIDB4ODUsIDB4MjYsIDB4NDEsCisJIDB4RTEsIDB4ODEsIDB4QzUsIDB4ODQsIDB4MkIsIDB4RkEsIDB4MUIsIDB4RjAsIDB4REUsIDB4NjQsIDB4QzAsIDB4ODUsIDB4MjYsIDB4NDQsIDB4RTAsIDB4ODQsCisJIDB4QzQsIDB4ODQsIDB4MTAsIDB4RkEsIDB4MjYsIDB4NDQsIDB4MkMsIDB4RjAsIDB4MEEsIDB4QTQsIDB4NjYsIDB4NDUsIDB4MjQsIDB4NDYsIDB4OTIsIDB4RjIsCisJIDB4NjUsIDB4NDYsIDB4OUYsIDB4RjAsIDB4NjEsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MDMsIDB4MDAsIDB4NjUsIDB4NDAsIDB4ODAsIDB4MjcsIDB4QTAsIDB4QTQsCisJIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDAsIDB4NjQsIDB4MTEsIDB4RkEsIDB4QkIsIDB4RjMsIDB4MTMsIDB4RkEsIDB4N0MsIDB4NDQsIDB4MUQsIDB4RkEsCisJIDB4RkYsIDB4RkYsIDB4MEQsIDB4RjIsIDB4M0UsIDB4RjAsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjQsIDB4NjQsIDB4NDEsIDB4MDEsIDB4QjEsIDB4MDEsIDB4NjMsCisJIDB4MTcsIDB4MDIsIDB4NjAsIDB4NDEsIDB4RkYsIDB4MjIsIDB4MDQsIDB4MDAsIDB4QjcsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QjEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDcsIDB4NjAsIDB4RjcsIDB4RkQsIDB4MTYsIDB4NjAsIDB4MkIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4MDEsIDB4NjMsIDB4NjEsIDB4NDAsCisJIDB4RkYsIDB4MjIsIDB4MDQsIDB4MDAsIDB4QjcsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QjEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4NjAsIDB4RjgsIDB4RkQsCisJIDB4QkQsIDB4NjAsIDB4N0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MjcsIDB4MDMsIDB4MDAsCisJIDB4QkQsIDB4NjAsIDB4NzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjIsIDB4RjIsIDB4NDYsIDB4NDMsIDB4NjAsIDB4NDAsIDB4MjIsIDB4MjYsIDB4MDksIDB4MDAsCisJIDB4MDEsIDB4MjYsIDB4MEEsIDB4MDAsIDB4MDQsIDB4MjYsIDB4NEIsIDB4MDAsIDB4MTAsIDB4MjYsIDB4MTAsIDB4MDAsIDB4QkQsIDB4NjAsIDB4NzUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4QkMsIDB4NjAsIDB4RjAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjcsIDB4M0QsIDB4MDAsIDB4MTAsIDB4MjcsIDB4MDMsIDB4MDAsCisJIDB4QkQsIDB4NjAsIDB4NzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODcsIDB4RjMsIDB4M0MsIDB4RjEsIDB4MDIsIDB4MDAsIDB4MDcsIDB4RjIsIDB4MDAsIDB4N0MsCisJIDB4NDAsIDB4NDMsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MjcsIDB4MjEsIDB4MDAsIDB4QTMsIDB4NDYsIDB4NEIsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4NEIsIDB4RkEsIDB4NEEsIDB4RjIsIDB4MDgsIDB4MDQsIDB4REMsIDB4ODQsIDB4NEEsIDB4RkEsIDB4NDksIDB4RjIsCisJIDB4MDQsIDB4MDQsIDB4REMsIDB4ODQsIDB4NDksIDB4RkEsIDB4MDEsIDB4MDQsIDB4RkYsIDB4RkYsIDB4ODcsIDB4RjMsIDB4NjYsIDB4NUMsIDB4RDAsIDB4ODAsCisJIDB4MDAsIDB4N0MsIDB4MDEsIDB4MDIsIDB4M0MsIDB4RjEsIDB4NEIsIDB4RjAsIDB4NjQsIDB4NDcsIDB4MjAsIDB4QkYsIDB4QTMsIDB4NDYsIDB4M0EsIDB4RjgsCisJIDB4M0IsIDB4RkEsIDB4QTMsIDB4NDYsIDB4NEEsIDB4RjIsIDB4NDksIDB4RjAsIDB4QTMsIDB4NDYsIDB4M0MsIDB4RkEsIDB4M0QsIDB4RjgsIDB4MEYsIDB4NjAsCisJIDB4QTAsIDB4NjQsIDB4QTMsIDB4NDYsIDB4NzYsIDB4NjEsIDB4MEUsIDB4NjMsIDB4NTksIDB4RDAsIDB4NTgsIDB4RDksIDB4RkQsIDB4MUYsIDB4QTMsIDB4NDYsCisJIDB4QkQsIDB4NjAsIDB4NzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDYsIDB4MDIsIDB4MDAsIDB4MDcsIDB4RjQsCisJIDB4RkYsIDB4RkYsIDB4QTMsIDB4NDYsIDB4MkEsIDB4RjIsIDB4QTMsIDB4NDYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MjcsIDB4NDgsIDB4MDAsIDB4ODcsIDB4RjMsCisJIDB4NjYsIDB4NUMsIDB4RDAsIDB4ODAsIDB4M0IsIDB4RjAsIDB4MDgsIDB4MDMsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MTIsIDB4MDAsIDB4RkYsIDB4NjAsCisJIDB4RUYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4M0IsIDB4RkEsIDB4MjQsIDB4MDAsIDB4M0QsIDB4RjMsIDB4MDEsIDB4NjEsIDB4NjAsIDB4NDMsIDB4Q0YsIDB4ODMsCisJIDB4RTEsIDB4ODEsIDB4RkQsIDB4MEQsIDB4RTksIDB4ODEsIDB4QTEsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4OTEsIDB4ODQsIDB4M0IsIDB4RkEsCisJIDB4MTcsIDB4MDAsIDB4NEIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MTAsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDQsIDB4RkYsIDB4NjAsIDB4RkYsIDB4NjQsCisJIDB4REMsIDB4ODQsIDB4NEIsIDB4RkEsIDB4NEEsIDB4RjIsIDB4MTYsIDB4MDQsIDB4REMsIDB4ODQsIDB4NEEsIDB4RkEsIDB4NDksIDB4RjIsIDB4MDgsIDB4MDQsCisJIDB4REMsIDB4ODQsIDB4NDksIDB4RkEsIDB4MDUsIDB4MDQsIDB4M0IsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RTAsIDB4ODQsIDB4RTgsIDB4ODQsIDB4M0IsIDB4RkEsCisJIDB4MEMsIDB4NjAsIDB4RkUsIDB4NjIsIDB4ODAsIDB4RkYsIDB4NzgsIDB4NDQsIDB4MDMsIDB4QTQsIDB4QTIsIDB4REIsIDB4QzcsIDB4NjAsIDB4Q0YsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4ODQsIDB4RkYsIDB4MDYsIDB4NjAsIDB4MTcsIDB4RTEsIDB4NzcsIDB4NDAsIDB4OEIsIDB4RkYsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NzUsCisJIDB4QzksIDB4NjAsIDB4NTgsIDB4NEYsIDB4NjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjQsIDB4MDYsIDB4NjAsIDB4ODAsIDB4RkIsIDB4MEMsIDB4NjAsCisJIDB4RkUsIDB4NjIsIDB4ODAsIDB4RkYsIDB4NzgsIDB4NDQsIDB4MDMsIDB4QTQsIDB4QTIsIDB4REIsIDB4QzgsIDB4NjAsIDB4NDYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4ODQsIDB4RkYsIDB4MDAsIDB4N0MsIDB4MDYsIDB4NjAsIDB4ODAsIDB4RjMsIDB4QTIsIDB4RDksIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDQsIDB4MDAsCisJIDB4QzksIDB4NjAsIDB4NTgsIDB4NEYsIDB4QUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0MsIDB4NDYsIDB4MDcsIDB4RjQsIDB4ODcsIDB4RjMsIDB4NjYsIDB4NUMsCisJIDB4RDAsIDB4ODAsIDB4MDAsIDB4N0MsIDB4MDcsIDB4MDMsIDB4NjYsIDB4NDMsIDB4M0MsIDB4NDYsIDB4MjIsIDB4RjIsIDB4NjMsIDB4NDYsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MkEsIDB4MDEsIDB4MDAsIDB4M0MsIDB4RjEsIDB4NEIsIDB4RjAsIDB4NjQsIDB4NDEsIDB4NjQsIDB4NDcsIDB4RkYsIDB4QjQsIDB4NjAsIDB4NUYsCisJIDB4MjAsIDB4QkMsIDB4ODAsIDB4MjYsIDB4ODAsIDB4QUMsIDB4NjAsIDB4NDcsIDB4QTMsIDB4NDYsIDB4M0EsIDB4RkEsIDB4NjQsIDB4NDQsIDB4MjAsIDB4N0YsCisJIDB4MzQsIDB4OTQsIDB4M0IsIDB4RkEsIDB4QTMsIDB4NDYsIDB4NEEsIDB4RjIsIDB4NDksIDB4RjAsIDB4QTMsIDB4NDYsIDB4M0MsIDB4RkEsIDB4M0QsIDB4RjgsCisJIDB4ODAsIDB4NjAsIDB4MTAsIDB4RTAsIDB4MDgsIDB4NjAsIDB4MDAsIDB4RUEsIDB4MEYsIDB4NjQsIDB4NjAsIDB4N0YsIDB4QTAsIDB4NUEsIDB4ODAsIDB4NjAsCisJIDB4MDAsIDB4RUEsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUEsIDB4QkQsIDB4NjAsIDB4NzUsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MjcsIDB4MzEsIDB4MDAsIDB4MkEsIDB4RjIsIDB4MDAsIDB4NjAsIDB4N0MsIDB4NjIsCisJIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MjQsIDB4MDAsIDB4QTIsIDB4RDMsIDB4MDAsIDB4NjEsIDB4NjAsIDB4RkUsIDB4QTAsIDB4RDMsIDB4NUUsIDB4RDEsCisJIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4NjQsIDB4NUYsIDB4REMsIDB4ODQsIDB4RjEsIDB4ODEsIDB4QzAsIDB4MkIsIDB4MDQsIDB4MDAsIDB4ODAsIDB4MkEsCisJIDB4MDIsIDB4MDAsIDB4N0YsIDB4QTQsIDB4REMsIDB4ODQsIDB4RkYsIDB4M0IsIDB4MDMsIDB4MDAsIDB4NjAsIDB4NDcsIDB4REMsIDB4ODcsIDB4MDEsIDB4NjEsCisJIDB4QzAsIDB4ODAsIDB4MDAsIDB4MzYsIDB4REMsIDB4ODQsIDB4NEUsIDB4REIsIDB4NjAsIDB4RkUsIDB4NUEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4QzEsIDB4ODQsCisJIDB4RjAsIDB4MjIsIDB4MTAsIDB4QTQsIDB4RjAsIDB4MkEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjAsCisJIDB4M0UsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RDMsIDB4NUEsIDB4RDEsIDB4M0EsIDB4RkEsIDB4M0IsIDB4RjgsIDB4NzQsIDB4NjIsIDB4QTIsIDB4RDAsCisJIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDQsIDB4RTAsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RTEsIDB4N0YsIDB4NUEsIDB4RDAsIDB4QTAsIDB4NUEsCisJIDB4NjQsIDB4NDQsIDB4RTIsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MDAsIDB4NjAsIDB4NDAsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RDEsIDB4NUEsIDB4RDEsCisJIDB4NjQsIDB4NDUsIDB4NjQsIDB4NDQsIDB4RTMsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RTQsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsCisJIDB4NjQsIDB4NDQsIDB4RTUsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RTYsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsCisJIDB4RTcsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjUsIDB4NDAsIDB4MEQsIDB4M0EsIDB4MUMsIDB4MDAsIDB4NjQsIDB4NDcsIDB4RTgsIDB4N0YsIDB4NUEsIDB4RDEsCisJIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTksIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RUEsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsCisJIDB4NjQsIDB4NDQsIDB4RUIsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RUMsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsCisJIDB4RUQsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RUUsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RUYsIDB4N0YsCisJIDB4QTAsIDB4NUEsIDB4MDgsIDB4NjAsIDB4MDAsIDB4RUEsIDB4NjUsIDB4NDQsIDB4MDIsIDB4QTQsIDB4NjAsIDB4N0YsIDB4QTAsIDB4NUEsIDB4ODAsIDB4NjAsCisJIDB4MDAsIDB4RUEsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUEsIDB4MDIsIDB4NjQsIDB4M0IsIDB4REIsIDB4QkEsIDB4NjAsCisJIDB4RjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QkYsIDB4NjAsIDB4QkIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4RkMsIDB4RkIsIDB4MDcsIDB4RjAsCisJIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsIDB4ODcsIDB4RjMsIDB4MEUsIDB4MDMsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MEIsIDB4MDMsIDB4NDcsIDB4RjEsCisJIDB4MDcsIDB4RjAsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MjYsIDB4MDEsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDMsIDB4MTIsIDB4QkUsIDB4NjAsIDB4NDYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4RkMsIDB4MEEsIDB4QkUsIDB4NjAsIDB4QTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODcsIDB4RjAsIDB4ODcsIDB4RjMsIDB4MTAsIDB4RjAsCisJIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4M0QsIDB4MDMsIDB4NjYsIDB4NDMsIDB4NjUsIDB4NDYsIDB4RkYsIDB4NjcsIDB4MjAsIDB4ODUsIDB4NjQsIDB4NUYsCisJIDB4NDAsIDB4NDQsIDB4MTUsIDB4RjAsIDB4MjUsIDB4NDQsIDB4RDAsIDB4ODQsIDB4MDMsIDB4QTQsIDB4MDMsIDB4MEUsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4MDQsIDB4MDAsIDB4RkEsIDB4QTQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODcsIDB4QzAsIDB4QkYsIDB4QzAsIDB4ODQsIDB4MTUsIDB4RkEsIDB4NDAsIDB4NDUsCisJIDB4MTQsIDB4RjAsIDB4MjQsIDB4NDQsIDB4RDAsIDB4ODQsIDB4MUYsIDB4QTQsIDB4MDYsIDB4MEUsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MDcsIDB4MDAsIDB4QzIsIDB4QTQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODcsIDB4RjgsIDB4QkYsIDB4QzAsIDB4ODQsIDB4MTQsIDB4RkEsIDB4NjAsIDB4NUMsIDB4MkYsIDB4NjcsIDB4RDAsIDB4ODAsIDB4NjAsIDB4NDUsCisJIDB4MDIsIDB4MjgsIDB4NjQsIDB4NDUsIDB4MjUsIDB4NUMsIDB4OEIsIDB4NjcsIDB4RDAsIDB4ODAsIDB4NjAsIDB4NDEsIDB4MDIsIDB4MjQsIDB4NjQsIDB4NDEsCisJIDB4RDUsIDB4ODQsIDB4ODAsIDB4NjUsIDB4QzQsIDB4ODcsIDB4MDEsIDB4MDUsIDB4MDAsIDB4NjQsIDB4RkYsIDB4QjQsIDB4MEUsIDB4RkEsIDB4NjMsIDB4NDYsCisJIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4MTcsIDB4RjIsIDB4NjMsIDB4NDYsIDB4NjAsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MkUsIDB4MDAsCisJIDB4MDEsIDB4MzYsIDB4MUUsIDB4MDAsIDB4MDMsIDB4M0EsIDB4MjUsIDB4MDAsIDB4NjQsIDB4NDYsIDB4MTAsIDB4RjIsIDB4MTEsIDB4RkEsIDB4MTIsIDB4RjIsCisJIDB4MDAsIDB4NjEsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4MTIsIDB4RkEsIDB4OTcsIDB4RkEsIDB4NDYsIDB4NDQsIDB4NjMsIDB4NDYsIDB4QzEsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4NzIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjUsIDB4NDAsIDB4MDAsIDB4M0EsIDB4MDQsIDB4MDAsIDB4QzEsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4QkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4OTYsIDB4RkMsIDB4NjMsIDB4NDYsIDB4NDMsIDB4MDAsCisJIDB4NjQsIDB4NDYsIDB4MTYsIDB4RjIsIDB4MDAsIDB4NjEsIDB4MjAsIDB4MjgsIDB4RkYsIDB4QTQsIDB4OTcsIDB4RkEsIDB4MTYsIDB4RkEsIDB4NjMsIDB4NDYsCisJIDB4M0EsIDB4MDAsIDB4NjQsIDB4NDYsIDB4MDAsIDB4NjEsIDB4OTcsIDB4RkEsIDB4NjMsIDB4NDYsIDB4MzUsIDB4MDAsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDEsCisJIDB4NjQsIDB4NDYsIDB4MTYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MjAsIDB4MjgsIDB4RkYsIDB4QTQsIDB4MTYsIDB4RkEsIDB4OTMsIDB4RjQsIDB4MTIsIDB4RjIsCisJIDB4MjAsIDB4MjgsIDB4RkYsIDB4QTMsIDB4MTMsIDB4RkMsIDB4NjEsIDB4NDYsIDB4NjMsIDB4NDAsIDB4MDAsIDB4M0EsIDB4MjQsIDB4MDAsIDB4QzEsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4OTMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjEsIDB4NDAsIDB4RkYsIDB4MzYsIDB4MUQsIDB4MDAsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsCisJIDB4MTIsIDB4RjIsIDB4OTMsIDB4RjQsIDB4NjEsIDB4NDYsIDB4MjAsIDB4MjgsIDB4MTYsIDB4MDAsIDB4NDQsIDB4NDQsIDB4QzEsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4NzIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NUMsIDB4NjUsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MDYsIDB4MDAsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsCisJIDB4MDEsIDB4NjQsIDB4MTcsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MDcsIDB4MDAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4QzEsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4QkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4QkUsIDB4NjAsIDB4QTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsCisJIDB4NjQsIDB4NDYsIDB4MTcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4RkYsIDB4MjcsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MzYsIDB4MDcsIDB4MDAsCisJIDB4MDEsIDB4MzYsIDB4MUMsIDB4MDAsIDB4MDIsIDB4MzYsIDB4MjQsIDB4MDAsIDB4MDMsIDB4MzYsIDB4NDMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsCisJIDB4RjksIDB4RjEsIDB4MTYsIDB4RjIsIDB4NDMsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MkMsIDB4NjAsIDB4MjQsIDB4NjEsIDB4MDksIDB4MDMsIDB4QTEsIDB4RDEsCisJIDB4MkMsIDB4NjAsIDB4MjIsIDB4NjMsIDB4QzAsIDB4ODQsIDB4MTYsIDB4RkEsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MTMsIDB4RkEsIDB4MzksIDB4MDAsCisJIDB4OTYsIDB4RkMsIDB4QzEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDMsIDB4NDQsIDB4QzEsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4QkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTYsIDB4NjAsIDB4MTEsIDB4RjMsIDB4OTYsIDB4RkMsIDB4MTMsIDB4RkEsIDB4MjksIDB4MDAsCisJIDB4NjMsIDB4NDYsIDB4MkIsIDB4NjAsIDB4RjQsIDB4NjMsIDB4QTMsIDB4RDMsIDB4MTUsIDB4RjIsIDB4NjAsIDB4NDUsIDB4RDQsIDB4ODAsIDB4MDcsIDB4RjAsCisJIDB4MEMsIDB4MDMsIDB4NjYsIDB4NDEsIDB4NDQsIDB4NDQsIDB4NjQsIDB4NDYsIDB4MTIsIDB4RjIsIDB4NjEsIDB4NDYsIDB4QzEsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4NzIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjUsIDB4NDAsIDB4MDAsIDB4M0EsIDB4MTksIDB4MDAsIDB4NjYsIDB4NDMsIDB4MjQsIDB4NDYsIDB4QzEsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4QkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTIsIDB4RjIsIDB4OTEsIDB4RjIsIDB4OTAsIDB4RkEsIDB4NjAsIDB4NUYsIDB4MTIsIDB4RkEsCisJIDB4MDQsIDB4MDAsIDB4QzEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDMsIDB4NjQsIDB4MTcsIDB4RkEsIDB4NjMsIDB4NDYsCisJIDB4MDUsIDB4MDAsIDB4MjQsIDB4NDMsIDB4MDIsIDB4NjQsIDB4MTcsIDB4RkEsIDB4NjMsIDB4NDYsIDB4MDAsIDB4MDAsIDB4MDMsIDB4NjQsIDB4M0IsIDB4REIsCisJIDB4Q0EsIDB4RkUsIDB4NDcsIDB4RjEsIDB4MDEsIDB4NjUsIDB4MzIsIDB4NDAsIDB4MDQsIDB4MjcsIDB4MDgsIDB4MDAsIDB4MkMsIDB4RjIsIDB4NjQsIDB4NDUsCisJIDB4MDIsIDB4MjIsIDB4MDQsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDEsIDB4MDAsIDB4N0IsIDB4MDAsIDB4MTQsIDB4RjIsIDB4NjUsIDB4NDAsCisJIDB4MDEsIDB4MjYsIDB4MEMsIDB4MDAsIDB4NjAsIDB4NDUsIDB4MDUsIDB4NjQsIDB4M0IsIDB4REIsIDB4NjUsIDB4NDQsIDB4Q0MsIDB4ODUsIDB4MjUsIDB4NjAsCisJIDB4RDYsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4RDMsIDB4NzgsIDB4OTcsIDB4RjEsIDB4NTAsIDB4MDAsIDB4NjAsIDB4NDEsIDB4MkEsIDB4RjAsCisJIDB4MDAsIDB4NjAsIDB4MEMsIDB4NjQsIDB4QTAsIDB4ODQsIDB4MDQsIDB4MzYsIDB4MDIsIDB4MDAsIDB4MEMsIDB4M0EsIDB4MDEsIDB4MDAsIDB4NDYsIDB4MDAsCisJIDB4NjEsIDB4NDUsIDB4NjAsIDB4NDMsIDB4MjUsIDB4NjAsIDB4RDYsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4RDMsIDB4NzgsIDB4OTcsIDB4RjEsCisJIDB4NjMsIDB4NDAsIDB4MDgsIDB4MzYsIDB4MDEsIDB4MDAsIDB4M0EsIDB4MDAsIDB4MTQsIDB4RjIsIDB4MUMsIDB4NjUsIDB4NjAsIDB4NDEsIDB4MDAsIDB4NjMsCisJIDB4Q0QsIDB4ODEsIDB4QzcsIDB4ODMsIDB4RkQsIDB4MDIsIDB4M0YsIDB4RjAsIDB4MkMsIDB4RjIsIDB4QzMsIDB4ODMsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsCisJIDB4MEQsIDB4MDAsIDB4MjUsIDB4NjAsIDB4RDQsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MjUsIDB4NjAsCisJIDB4REEsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4RDIsIDB4NzgsIDB4NjMsIDB4NDUsIDB4MjAsIDB4MDAsIDB4MjUsIDB4NjAsIDB4RDIsIDB4NjQsCisJIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MjUsIDB4NjAsIDB4RDgsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsCisJIDB4RDIsIDB4NzgsIDB4NjMsIDB4NDUsIDB4MTUsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MEYsIDB4QjQsIDB4MDAsIDB4QTgsIDB4MDEsIDB4QTgsIDB4MEUsIDB4MDMsCisJIDB4MDcsIDB4MDMsIDB4MjUsIDB4NjAsIDB4RTAsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MDYsIDB4MDAsCisJIDB4MjUsIDB4NjAsIDB4REUsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MDQsIDB4NjQsIDB4M0IsIDB4REIsCisJIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4MDYsIDB4RjAsIDB4RkYsIDB4NjAsIDB4NUYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4MDYsIDB4RkEsCisJIDB4NjEsIDB4NDYsIDB4MUUsIDB4NjAsIDB4RjIsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OEQsIDB4RkIsIDB4M0MsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4NUMsIDB4NUMsIDB4RkMsIDB4RkMsIDB4Q0UsIDB4RkUsIDB4QjcsIDB4NjAsIDB4RTIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MTMsIDB4NjAsIDB4MkUsIDB4RjMsIDB4MDcsIDB4RjQsIDB4MDYsIDB4RjIsIDB4MDIsIDB4QTgsIDB4M0MsIDB4NDYsIDB4MTAsIDB4MDMsCisJIDB4MTAsIDB4QjAsIDB4MkEsIDB4RjIsIDB4MEQsIDB4MDMsIDB4MEUsIDB4RjIsIDB4MEMsIDB4QjAsIDB4NjAsIDB4NDAsIDB4RjAsIDB4MzcsIDB4MjAsIDB4QkMsCisJIDB4MDIsIDB4MDMsIDB4RkUsIDB4N0YsIDB4MEUsIDB4RkEsIDB4MjMsIDB4RjAsIDB4MTAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4Q0UsIDB4MDEsCisJIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NTAsIDB4QTgsIDB4MDIsIDB4N0MsIDB4MTAsIDB4MDMsIDB4MEYsIDB4RjAsIDB4MTUsIDB4RjIsIDB4NjQsIDB4NDEsCisJIDB4MDEsIDB4MkEsIDB4MDIsIDB4MDAsIDB4QUYsIDB4RjEsIDB4MDksIDB4MDAsIDB4MDMsIDB4NjUsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsCisJIDB4MDYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4QUUsIDB4RjEsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MkEsIDB4NjQsIDB4NDUsIDB4REMsIDB4ODQsIDB4RDQsIDB4ODAsCisJIDB4MTUsIDB4RkEsIDB4MzgsIDB4MDcsIDB4NjEsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDgsIDB4MDAsIDB4MTMsIDB4NjAsIDB4MDMsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4REMsIDB4ODQsIDB4MDAsIDB4MzYsIDB4MDAsIDB4M0IsIDB4QTIsIDB4REIsIDB4MDcsIDB4MDAsIDB4MTMsIDB4NjAsIDB4MDQsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4REMsIDB4ODQsIDB4MDAsIDB4MzYsIDB4MDAsIDB4M0IsIDB4QTIsIDB4REIsIDB4MkEsIDB4RjAsIDB4MDgsIDB4NjcsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsCisJIDB4MDgsIDB4RjAsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsIDB4RDAsIDB4ODAsIDB4MDcsIDB4RjIsIDB4NDYsIDB4NDMsIDB4ODcsIDB4RjEsIDB4MDYsIDB4MDMsCisJIDB4NjAsIDB4NDYsIDB4ODYsIDB4RjQsIDB4RDAsIDB4ODAsIDB4ODAsIDB4QkIsIDB4MDEsIDB4MDMsIDB4MDYsIDB4RkMsIDB4MjMsIDB4NDYsIDB4M0UsIDB4RjIsCisJIDB4MDAsIDB4NjMsIDB4MDEsIDB4QjAsIDB4NDMsIDB4NUMsIDB4RkMsIDB4RkMsIDB4MEEsIDB4MDMsIDB4MUUsIDB4NjAsIDB4RUMsIDB4NjQsIDB4MEYsIDB4NjAsCisJIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QjcsIDB4NjAsCisJIDB4RTIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NDksIDB4RkIsIDB4MjUsIDB4NjAsIDB4RTAsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsCisJIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MjUsIDB4NjAsIDB4RTIsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsCisJIDB4MjcsIDB4NDQsIDB4RjcsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MjMsIDB4RjAsIDB4MDEsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4MDcsIDB4RjAsCisJIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4MDYsIDB4RjIsIDB4N0YsIDB4NjUsIDB4QTQsIDB4OUUsIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4NUUsIDB4MDEsCisJIDB4QzAsIDB4NjAsIDB4MzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjEsIDB4NjQsIDB4M0IsIDB4REIsIDB4MzEsIDB4RjMsIDB4MDEsIDB4NjMsIDB4QzQsIDB4QjQsCisJIDB4MzEsIDB4RkIsIDB4MzIsIDB4RkQsIDB4QkYsIDB4NjAsIDB4RUIsIDB4NjIsIDB4NDIsIDB4NDAsIDB4QTAsIDB4NEMsIDB4NDAsIDB4QkMsIDB4N0QsIDB4QjQsCisJIDB4QTAsIDB4NTEsIDB4QTAsIDB4RkUsIDB4MUEsIDB4RkYsIDB4MUUsIDB4NjAsIDB4RTYsIDB4NjQsIDB4MDgsIDB4RjAsIDB4MDcsIDB4RjAsIDB4RDAsIDB4ODAsCisJIDB4MUUsIDB4NjAsIDB4RUMsIDB4NjIsIDB4MTMsIDB4MDIsIDB4QTIsIDB4RDMsIDB4MDEsIDB4NjMsIDB4QUMsIDB4ODYsIDB4MDcsIDB4RjIsIDB4MEUsIDB4MDMsCisJIDB4RDAsIDB4ODAsIDB4MDksIDB4RjIsIDB4RkEsIDB4MDIsIDB4MjMsIDB4RkMsIDB4MUUsIDB4NjAsIDB4RjIsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OEQsIDB4RkIsCisJIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4M0MsIDB4NDYsIDB4MDYsIDB4NjQsCisJIDB4QTEsIDB4RkYsIDB4NDksIDB4RkIsIDB4ODMsIDB4M0UsIDB4MzEsIDB4RjMsIDB4ODcsIDB4NjAsIDB4ODAsIDB4NjEsIDB4MUQsIDB4RjAsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MkEsIDB4MEYsIDB4MDAsIDB4RkUsIDB4QjQsIDB4MzEsIDB4RkIsIDB4MDAsIDB4NjQsIDB4NDksIDB4RkIsIDB4MDEsIDB4NjQsIDB4NDcsIDB4RkIsCisJIDB4MDAsIDB4NzEsIDB4MDUsIDB4NjQsIDB4NjQsIDB4NUYsIDB4MEQsIDB4RkEsIDB4NDAsIDB4NjQsIDB4M0IsIDB4REIsIDB4QzAsIDB4NjAsIDB4MzUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDIsIDB4MkEsIDB4MTcsIDB4MDAsIDB4RDEsIDB4OTEsIDB4OEQsIDB4RTIsIDB4NDEsIDB4NjQsIDB4M0IsIDB4REIsIDB4MzEsIDB4RjMsCisJIDB4MkMsIDB4NjAsIDB4NUUsIDB4NjMsIDB4RkQsIDB4QjQsIDB4MzEsIDB4RkIsIDB4QTMsIDB4RDMsIDB4MDIsIDB4NjMsIDB4NjAsIDB4NUMsIDB4MEQsIDB4RjIsCisJIDB4NDcsIDB4RkQsIDB4RkYsIDB4QjUsIDB4NjAsIDB4NDcsIDB4RDAsIDB4ODAsIDB4REMsIDB4ODQsIDB4MUYsIDB4MDMsIDB4NjAsIDB4NDcsIDB4QjQsIDB4ODQsCisJIDB4MEQsIDB4RkEsIDB4MUIsIDB4MDAsIDB4MDgsIDB4MkEsIDB4MDcsIDB4MDAsIDB4NDIsIDB4NjQsIDB4M0IsIDB4REIsIDB4MzEsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4RjcsIDB4QjQsIDB4MzEsIDB4RkIsIDB4MTIsIDB4MDAsIDB4MTAsIDB4MkEsIDB4MDksIDB4MDAsIDB4NDMsIDB4NjQsIDB4M0IsIDB4REIsIDB4MzEsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4RUYsIDB4QjQsIDB4MzEsIDB4RkIsIDB4QkYsIDB4NjAsIDB4QkIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDQsIDB4NjQsIDB4M0IsIDB4REIsCisJIDB4MzEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4REYsIDB4QjQsIDB4MzEsIDB4RkIsIDB4MDAsIDB4MDAsIDB4MkEsIDB4NjQsIDB4M0IsIDB4REIsIDB4QjcsIDB4NjAsCisJIDB4QTIsIDB4NjQsIDB4NDAsIDB4NDAsIDB4QkQsIDB4NjAsIDB4N0QsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4NjAsIDB4ODAsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4QjUsIDB4MDQsIDB4QjUsIDB4MDQsIDB4MDMsIDB4MDMsIDB4MDMsIDB4QzAsIDB4NjAsIDB4QjgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RjAsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4NzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzEsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MjgsIDB4MDAsIDB4OUQsIDB4RkUsIDB4MjYsIDB4MDQsCisJIDB4MjUsIDB4MEEsIDB4OUYsIDB4RkUsIDB4MjMsIDB4MDUsIDB4ODUsIDB4RkYsIDB4MjAsIDB4NDQsIDB4ODQsIDB4RkYsIDB4NDAsIDB4MjYsIDB4MUUsIDB4MDAsCisJIDB4M0YsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MUIsIDB4MDAsIDB4MzgsIDB4NjksIDB4RkYsIDB4RkYsIDB4NjgsIDB4NDQsIDB4MDEsIDB4MTYsIDB4RkQsIDB4MDEsCisJIDB4MDEsIDB4MkEsIDB4MTQsIDB4MDAsIDB4MTMsIDB4NjAsIDB4MDksIDB4RjMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4MDAsIDB4MzYsIDB4MDAsIDB4M0IsCisJIDB4QTIsIDB4REIsIDB4NjQsIDB4RjEsIDB4MDIsIDB4NjAsIDB4RUUsIDB4NjQsIDB4ODEsIDB4RkIsIDB4RkYsIDB4RkYsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4ODIsIDB4RkIsIDB4MDQsIDB4NjQsIDB4ODMsIDB4RkIsIDB4REYsIDB4RkUsIDB4MTksIDB4RkYsIDB4MTAsIDB4NjQsIDB4M0IsIDB4REIsCisJIDB4NjUsIDB4RjMsIDB4NzMsIDB4NDUsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QzQsIDB4OTMsIDB4NzQsIDB4RjEsIDB4QzksIDB4RkUsCisJIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4M0IsIDB4MDAsIDB4NDksIDB4RjMsIDB4M0MsIDB4NDYsIDB4MzEsIDB4MTgsIDB4Q0MsIDB4ODQsIDB4NDksIDB4RkIsCisJIDB4MkUsIDB4MDIsIDB4QzEsIDB4NjAsIDB4NkIsIDB4NjQsIDB4NDAsIDB4NDIsIDB4RkMsIDB4RkMsIDB4MDAsIDB4NjQsIDB4NUMsIDB4NUMsIDB4MzIsIDB4RkIsCisJIDB4ODIsIDB4RkYsIDB4NUMsIDB4NDcsIDB4ODQsIDB4RkYsIDB4NjIsIDB4RkYsIDB4MTMsIDB4NjAsIDB4MDEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsCisJIDB4MDAsIDB4MzYsIDB4MDAsIDB4M0IsIDB4QTIsIDB4REIsIDB4MkEsIDB4RjIsIDB4MDcsIDB4RjAsIDB4MEMsIDB4QjQsIDB4MDgsIDB4M0EsIDB4MDcsIDB4MDAsCisJIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4MDYsIDB4RjAsIDB4RkYsIDB4NjAsIDB4REYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4MDYsIDB4RkEsIDB4MjMsIDB4RjAsCisJIDB4MDEsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4MUUsIDB4NjAsIDB4RjIsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OEQsIDB4RkIsIDB4NjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4Q0UsIDB4RkUsIDB4MDYsIDB4MDAsCisJIDB4NjUsIDB4RjMsIDB4NzMsIDB4NDUsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QzQsIDB4OTMsIDB4MTQsIDB4NjAsIDB4RkMsIDB4NjMsCisJIDB4QTMsIDB4RDMsIDB4QUQsIDB4NDksIDB4MjAsIDB4QjUsIDB4MDgsIDB4QjEsIDB4MjIsIDB4MDMsIDB4RTEsIDB4ODEsIDB4MTAsIDB4QjUsIDB4OTUsIDB4ODEsCisJIDB4NjAsIDB4NDEsIDB4MTgsIDB4MDIsIDB4MTQsIDB4NjAsIDB4RkUsIDB4N0MsIDB4QTQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4QTQsIDB4REIsCisJIDB4MTYsIDB4MDIsIDB4MEEsIDB4NjQsIDB4QTQsIDB4REIsIDB4NjEsIDB4NDQsIDB4MDcsIDB4QjQsIDB4RkYsIDB4RkYsIDB4MTAsIDB4MDIsIDB4MDgsIDB4QjEsCisJIDB4RTEsIDB4ODEsIDB4OTUsIDB4ODEsIDB4QTMsIDB4RDMsIDB4MEIsIDB4MDMsIDB4MDgsIDB4QUMsIDB4MDEsIDB4QkMsIDB4QTMsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MTMsIDB4RkYsIDB4MDUsIDB4MDAsIDB4MTAsIDB4QUMsIDB4QTMsIDB4REIsIDB4MEEsIDB4N0MsIDB4MEEsIDB4NjAsIDB4N0YsIDB4RjksIDB4QjcsIDB4NjAsCisJIDB4QUUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDYsIDB4RjMsIDB4NDUsIDB4RjEsIDB4MDQsIDB4MUIsIDB4NjQsIDB4NDQsIDB4MDIsIDB4MUIsIDB4MDcsIDB4NjAsCisJIDB4RjcsIDB4RjMsIDB4NDUsIDB4RkIsIDB4MDAsIDB4NjMsIDB4NDYsIDB4RkQsIDB4NjAsIDB4NDEsIDB4MjUsIDB4NjQsIDB4M0IsIDB4REIsIDB4MjcsIDB4NDQsCisJIDB4RUYsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MDAsIDB4QjksIDB4NzEsIDB4NDAsIDB4ODAsIDB4MjcsIDB4MDEsIDB4MTIsIDB4MTksIDB4MDMsIDB4QzEsIDB4NjAsCisJIDB4MEMsIDB4NjIsIDB4ODQsIDB4RkYsIDB4NDIsIDB4NDIsIDB4ODIsIDB4RkYsIDB4QTAsIDB4NEMsIDB4MTQsIDB4QkMsIDB4RkYsIDB4QjQsIDB4QTAsIDB4NTEsCisJIDB4MUYsIDB4MEEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODEsIDB4M0UsIDB4NzAsIDB4NDQsIDB4QUMsIDB4ODAsIDB4MTksIDB4MEEsIDB4NzEsIDB4NDAsCisJIDB4ODAsIDB4MjcsIDB4RjcsIDB4MTIsIDB4NDUsIDB4RjMsIDB4MjcsIDB4MDIsIDB4MDMsIDB4MTgsIDB4Q0MsIDB4ODQsIDB4NDUsIDB4RkIsIDB4RjEsIDB4MDIsCisJIDB4MDYsIDB4MEEsIDB4QTAsIDB4NEMsIDB4RkIsIDB4QjQsIDB4QTAsIDB4NTEsIDB4QTQsIDB4NjAsIDB4RDcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODQsIDB4RkYsCisJIDB4QzAsIDB4NjAsIDB4RUEsIDB4NjQsIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsIDB4QTAsIDB4NEMsIDB4MTQsIDB4QkMsIDB4RkYsIDB4QjQsIDB4QTAsIDB4NTEsCisJIDB4QUYsIDB4NjAsIDB4N0IsIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0MsIDB4NDQsIDB4QUMsIDB4ODAsIDB4MzIsIDB4RjEsIDB4MTIsIDB4MDMsIDB4NjQsIDB4NDAsCisJIDB4MDcsIDB4MjIsIDB4MEYsIDB4MDAsIDB4QTQsIDB4NjAsIDB4QjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTAsIDB4NEMsIDB4MUMsIDB4QkMsIDB4REYsIDB4QjQsCisJIDB4QTAsIDB4NTEsIDB4RjEsIDB4MDEsIDB4MDYsIDB4MDAsIDB4MjgsIDB4NjQsIDB4M0EsIDB4REIsIDB4QTAsIDB4NEMsIDB4MzAsIDB4QkMsIDB4RjMsIDB4QjQsCisJIDB4QTAsIDB4NTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODEsIDB4M0UsIDB4MjgsIDB4NjQsIDB4M0IsIDB4REIsIDB4MDcsIDB4NjAsIDB4RjgsIDB4RjMsCisJIDB4MzIsIDB4NDAsIDB4MDIsIDB4MjcsIDB4MTYsIDB4MDAsIDB4NDYsIDB4RkIsIDB4MTQsIDB4MTgsIDB4QzEsIDB4NjAsIDB4NTksIDB4NjQsIDB4ODQsIDB4RkYsCisJIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsIDB4QTAsIDB4NEMsIDB4MTUsIDB4QkMsIDB4RjcsIDB4QjQsIDB4QTAsIDB4NTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4ODEsIDB4M0UsIDB4NzAsIDB4NDQsIDB4QUMsIDB4ODAsIDB4NDYsIDB4RjMsIDB4Q0IsIDB4MEEsIDB4REQsIDB4MDIsIDB4Q0MsIDB4ODQsIDB4NDYsIDB4RkIsCisJIDB4RjUsIDB4MDIsIDB4ODQsIDB4RkYsIDB4QzEsIDB4NjAsIDB4NkIsIDB4NjQsIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsIDB4MjcsIDB4NDQsIDB4MDgsIDB4QkMsCisJIDB4NDAsIDB4NDcsIDB4RjksIDB4RTEsIDB4MDQsIDB4MDAsIDB4NzgsIDB4RTEsIDB4MzEsIDB4NDAsIDB4MDEsIDB4MjYsIDB4RjksIDB4RTEsIDB4QTQsIDB4NjAsCisJIDB4QUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4RkIsIDB4RjEsIDB4NjAsIDB4NDUsIDB4MkMsIDB4NjAsIDB4MEEsIDB4NjEsIDB4QzUsIDB4ODMsCisJIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4NjYsIDB4NDUsIDB4MjQsIDB4NDYsIDB4MEUsIDB4RjIsIDB4NjUsIDB4NDYsIDB4NjQsIDB4NDUsCisJIDB4RDUsIDB4ODEsIDB4NjEsIDB4NDUsIDB4MDAsIDB4N0YsIDB4RDQsIDB4ODAsIDB4NjQsIDB4NDMsIDB4MDgsIDB4MDQsIDB4RTMsIDB4ODMsIDB4NjMsIDB4NDUsCisJIDB4QzUsIDB4ODEsIDB4NjEsIDB4NDUsIDB4RDQsIDB4ODAsIDB4MDIsIDB4NjUsIDB4MDMsIDB4MDcsIDB4MDMsIDB4MDAsIDB4MDAsIDB4NjUsIDB4MDEsIDB4MDAsCisJIDB4MDEsIDB4NjUsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4OEYsIDB4RjAsIDB4MTIsIDB4RjIsIDB4OTEsIDB4RjIsCisJIDB4NjAsIDB4NDAsIDB4MTAsIDB4MzYsIDB4MDUsIDB4MDAsIDB4MTIsIDB4MzYsIDB4MDgsIDB4MDAsIDB4MEMsIDB4MzYsIDB4MEIsIDB4MDAsIDB4MEYsIDB4MDAsCisJIDB4NDAsIDB4NjEsIDB4QTUsIDB4ODAsIDB4MEEsIDB4NjQsIDB4MTMsIDB4MDIsIDB4RjMsIDB4MDEsIDB4MTAsIDB4NjEsIDB4QTUsIDB4ODAsIDB4MEUsIDB4NjQsCisJIDB4MEUsIDB4MDIsIDB4RUUsIDB4MDEsIDB4MDgsIDB4NjEsIDB4QTUsIDB4ODAsIDB4MTAsIDB4NjQsIDB4MDksIDB4MDIsIDB4RTksIDB4MDEsIDB4RTEsIDB4ODEsCisJIDB4QTUsIDB4ODAsIDB4MDMsIDB4MDUsIDB4QzgsIDB4ODQsIDB4MDMsIDB4MDIsIDB4RTMsIDB4MDEsIDB4RkYsIDB4NjEsIDB4MDIsIDB4MDAsIDB4MTIsIDB4RkEsCisJIDB4OTEsIDB4RkEsIDB4NjMsIDB4NDYsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4OEYsIDB4RjAsIDB4MTIsIDB4RjIsIDB4OTEsIDB4RjIsIDB4NjAsIDB4NDAsCisJIDB4MEEsIDB4MzYsIDB4MDUsIDB4MDAsIDB4MEUsIDB4MzYsIDB4MDgsIDB4MDAsIDB4MTAsIDB4MzYsIDB4MEIsIDB4MDAsIDB4MEYsIDB4MDAsIDB4MDgsIDB4NjEsCisJIDB4QTUsIDB4ODAsIDB4MTAsIDB4N0UsIDB4MTEsIDB4MDIsIDB4RjMsIDB4MDEsIDB4MDQsIDB4NjEsIDB4QTUsIDB4ODAsIDB4MTIsIDB4N0UsIDB4MEMsIDB4MDIsCisJIDB4RUUsIDB4MDEsIDB4MjAsIDB4NjEsIDB4QTUsIDB4ODAsIDB4MEMsIDB4N0UsIDB4MDcsIDB4MDIsIDB4RTksIDB4MDEsIDB4RTksIDB4ODEsIDB4QTUsIDB4ODAsCisJIDB4MDUsIDB4MDUsIDB4RDgsIDB4ODQsIDB4MDEsIDB4MDIsIDB4RTMsIDB4MDEsIDB4MTIsIDB4RkEsIDB4OTEsIDB4RkEsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MjQsIDB4RTIsIDB4MkQsIDB4RjMsIDB4MkMsIDB4RjMsIDB4MDAsIDB4QkQsIDB4Q0MsIDB4ODQsIDB4MDgsIDB4MDMsIDB4MkMsIDB4RkIsIDB4MDYsIDB4MDIsCisJIDB4NjUsIDB4NDQsIDB4MkMsIDB4RkIsIDB4OEEsIDB4RkYsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4NDQsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4REMsIDB4ODQsIDB4NDQsIDB4RkIsIDB4MjgsIDB4NjAsIDB4NzIsIDB4NjUsIDB4MjgsIDB4NjAsIDB4NzAsIDB4NjEsIDB4QTUsIDB4RDMsIDB4QTEsIDB4RDMsCisJIDB4MTEsIDB4MTgsIDB4Q0MsIDB4ODQsIDB4QTEsIDB4REIsIDB4MEUsIDB4MDIsIDB4QTUsIDB4RDMsIDB4QTEsIDB4REIsIDB4MTQsIDB4NjAsIDB4M0IsIDB4RjMsCisJIDB4MTQsIDB4NjAsIDB4M0EsIDB4RjEsIDB4QTIsIDB4REIsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDMsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsCisJIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4RDIsIDB4RjMsIDB4MzEsIDB4NDAsIDB4MDEsIDB4MkEsIDB4M0QsIDB4MDAsIDB4NjAsIDB4NDMsIDB4MDQsIDB4QjAsCisJIDB4MDIsIDB4QjAsIDB4MDgsIDB4MjQsIDB4MTYsIDB4MDIsIDB4MTAsIDB4QjAsIDB4MjksIDB4NDQsIDB4MzQsIDB4MDIsIDB4MDAsIDB4QTgsIDB4Q0MsIDB4ODEsCisJIDB4MEQsIDB4MDMsIDB4NDEsIDB4NDksIDB4MkYsIDB4MDIsIDB4NjMsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDgsIDB4MDAsIDB4RjcsIDB4QjMsIDB4MTgsIDB4NjAsCisJIDB4MEEsIDB4RjEsIDB4QUQsIDB4NEYsIDB4RkQsIDB4QjQsIDB4QTAsIDB4NUQsIDB4NDQsIDB4NDksIDB4MjQsIDB4MDAsIDB4NjMsIDB4NDAsIDB4MDIsIDB4MkEsCisJIDB4MTAsIDB4MDAsIDB4MTgsIDB4NjAsIDB4MEIsIDB4RjMsIDB4MTgsIDB4NjAsIDB4MDksIDB4RkIsIDB4NDAsIDB4NDksIDB4MTgsIDB4NjAsIDB4MEMsIDB4RjMsCisJIDB4MTgsIDB4NjAsIDB4MEEsIDB4RkIsIDB4MEMsIDB4QkIsIDB4RkQsIDB4QjMsIDB4QUQsIDB4NEYsIDB4MDIsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUQsCisJIDB4MTEsIDB4MDAsIDB4MTgsIDB4NjAsIDB4MEQsIDB4RjMsIDB4MzAsIDB4NjAsIDB4MTIsIDB4N0MsIDB4MEMsIDB4MTgsIDB4QTQsIDB4REIsIDB4NDAsIDB4NDksCisJIDB4MTgsIDB4NjAsIDB4MEUsIDB4RjMsIDB4MTgsIDB4NjAsIDB4MEEsIDB4RkIsIDB4MDgsIDB4QkIsIDB4RkIsIDB4QjMsIDB4QUQsIDB4NEYsIDB4MDIsIDB4QkMsCisJIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUQsIDB4RDIsIDB4RkQsIDB4MDAsIDB4NjAsIDB4ODUsIDB4RjMsIDB4NjIsIDB4NDMsIDB4MTcsIDB4MTgsIDB4NTgsIDB4RDMsCisJIDB4NjIsIDB4NDEsIDB4MDMsIDB4MTgsIDB4Q0MsIDB4ODQsIDB4QTEsIDB4REIsIDB4MTEsIDB4MDAsIDB4NDksIDB4RDMsIDB4QTMsIDB4REIsIDB4MDYsIDB4QTEsCisJIDB4QTEsIDB4RDMsIDB4NTksIDB4RDEsIDB4NjAsIDB4NDUsIDB4QTUsIDB4RDMsIDB4NTksIDB4RDEsIDB4QjAsIDB4ODQsIDB4QTUsIDB4REIsIDB4NjQsIDB4NDQsCisJIDB4MDYsIDB4MzYsIDB4Q0QsIDB4RkUsIDB4MDcsIDB4MzYsIDB4RDYsIDB4RkUsIDB4RTYsIDB4MDEsIDB4MjMsIDB4NDYsIDB4QjcsIDB4NjAsIDB4QUUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NDYsIDB4NDMsIDB4MUYsIDB4NjAsIDB4NDQsIDB4NjEsIDB4QTEsIDB4RDMsIDB4NTksIDB4RDEsIDB4MDYsIDB4MUIsIDB4NTksIDB4RDMsCisJIDB4NTksIDB4RDEsIDB4MDMsIDB4MUIsIDB4NTksIDB4RDMsIDB4NTksIDB4RDEsIDB4RjAsIDB4MTgsIDB4MDAsIDB4NjMsIDB4NDksIDB4REQsIDB4NjAsIDB4NDAsCisJIDB4MDIsIDB4MzYsIDB4MTEsIDB4MDAsIDB4MDMsIDB4MzYsIDB4MzIsIDB4MDAsIDB4MDEsIDB4MzYsIDB4MDgsIDB4MDAsIDB4MDUsIDB4M0EsIDB4RUEsIDB4MDEsCisJIDB4QTQsIDB4RDMsIDB4NUEsIDB4RDMsIDB4OUMsIDB4ODUsIDB4QTQsIDB4ODQsIDB4QTIsIDB4REIsIDB4RTQsIDB4MDEsIDB4MDEsIDB4NjAsIDB4MEEsIDB4NjEsCisJIDB4MDAsIDB4NjQsIDB4QTEsIDB4REIsIDB4REYsIDB4MDEsIDB4QzIsIDB4NjAsIDB4OEYsIDB4NjQsIDB4NDAsIDB4NDUsIDB4MjIsIDB4MDAsIDB4MDEsIDB4NjAsCisJIDB4MEEsIDB4NjYsIDB4QTYsIDB4RDMsIDB4MDQsIDB4QTEsIDB4NjAsIDB4NDMsIDB4QTEsIDB4RDMsIDB4QzksIDB4ODEsIDB4NjAsIDB4NDUsIDB4MDAsIDB4QkIsCisJIDB4QTEsIDB4REIsIDB4QkUsIDB4RDMsIDB4MDksIDB4MDMsIDB4RDQsIDB4ODQsIDB4OUMsIDB4ODQsIDB4REMsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MEUsCisJIDB4QTMsIDB4RDEsIDB4NjMsIDB4NDYsIDB4NjQsIDB4NDMsIDB4RjIsIDB4MDEsIDB4OUMsIDB4ODQsIDB4REMsIDB4ODUsIDB4NDksIDB4REQsIDB4NjEsIDB4NDQsCisJIDB4MDAsIDB4QkIsIDB4QTYsIDB4REIsIDB4MDIsIDB4MDMsIDB4NjUsIDB4NDQsIDB4QkUsIDB4REIsIDB4QkMsIDB4MDEsIDB4QzIsIDB4NjAsIDB4NkEsIDB4NjQsCisJIDB4NDAsIDB4NDUsIDB4MDEsIDB4NjAsIDB4MEEsIDB4NjYsIDB4QTYsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4MEYsIDB4MTgsIDB4MDIsIDB4MDMsCisJIDB4NjAsIDB4NDYsIDB4RjksIDB4MDEsIDB4NTgsIDB4RDMsIDB4QTQsIDB4RDMsIDB4NjAsIDB4NDUsIDB4MDAsIDB4NjMsIDB4QTQsIDB4REQsIDB4MDUsIDB4MTgsCisJIDB4NTgsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QzQsIDB4ODMsIDB4QTIsIDB4REQsIDB4Q0EsIDB4ODQsIDB4QTYsIDB4REIsIDB4MjUsIDB4NTgsIDB4NjQsIDB4NDEsCisJIDB4MDQsIDB4NjAsIDB4NDAsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkIsIDB4NTAsIDB4MDAsIDB4MjgsIDB4NDAsIDB4MDgsIDB4M0EsIDB4NEQsIDB4MDAsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MTUsIDB4NjAsIDB4RDUsIDB4RkIsIDB4NjQsIDB4RjEsIDB4MjQsIDB4NjAsIDB4ODgsIDB4NjMsIDB4NjQsIDB4NDAsCisJIDB4MDEsIDB4MjcsIDB4M0MsIDB4QTMsIDB4MjksIDB4NDAsIDB4NDAsIDB4MkIsIDB4MUUsIDB4QTMsIDB4QkQsIDB4RDEsIDB4NjMsIDB4NDUsIDB4NDQsIDB4NEUsCisJIDB4MEUsIDB4NjEsIDB4QkQsIDB4RDEsIDB4Q0QsIDB4ODEsIDB4RDAsIDB4ODAsIDB4MDEsIDB4MDMsIDB4RkIsIDB4MDQsIDB4Q0IsIDB4ODMsIDB4MTUsIDB4NjAsCisJIDB4RDgsIDB4RjMsIDB4MzksIDB4RjEsIDB4RDcsIDB4ODMsIDB4RUIsIDB4ODMsIDB4MkUsIDB4NDEsIDB4NUQsIDB4OTMsIDB4REYsIDB4ODMsIDB4MTUsIDB4NjAsCisJIDB4RDQsIDB4RkQsIDB4MTUsIDB4NjAsIDB4RDMsIDB4RkIsIDB4NTMsIDB4OTMsIDB4REYsIDB4ODAsIDB4MTAsIDB4MDMsIDB4MzgsIDB4RjMsIDB4Q0YsIDB4ODMsCisJIDB4MDgsIDB4MDMsIDB4REYsIDB4ODMsIDB4MEIsIDB4MDIsIDB4REYsIDB4ODMsIDB4REMsIDB4ODQsIDB4RjAsIDB4QTAsIDB4MzgsIDB4RkIsIDB4MDYsIDB4MDMsCisJIDB4MDMsIDB4MDAsIDB4Q0MsIDB4ODQsIDB4MzgsIDB4RkIsIDB4MDIsIDB4MDMsIDB4MDAsIDB4NjMsIDB4MDIsIDB4MDAsIDB4MDgsIDB4NjQsIDB4MzgsIDB4RkIsCisJIDB4RTMsIDB4ODAsIDB4RkIsIDB4ODMsIDB4QzMsIDB4ODMsIDB4NjMsIDB4NDQsIDB4RkMsIDB4QTAsIDB4MDIsIDB4MEUsIDB4MDgsIDB4MDcsIDB4MDgsIDB4MDAsCisJIDB4MDQsIDB4QTQsIDB4RkYsIDB4RkYsIDB4MDUsIDB4MEQsIDB4RkMsIDB4NjQsIDB4RkYsIDB4N0YsIDB4NjAsIDB4NDMsIDB4MDEsIDB4MDAsIDB4MDQsIDB4NjMsCisJIDB4MzksIDB4RkQsIDB4MTUsIDB4NjAsIDB4RDcsIDB4RkQsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4RDIsIDB4RjMsIDB4NDAsIDB4NEUsCisJIDB4NjAsIDB4NDYsIDB4MkYsIDB4REIsIDB4NDQsIDB4NDQsIDB4QTEsIDB4RDMsIDB4RDksIDB4ODEsIDB4NDgsIDB4OTQsIDB4MjQsIDB4NUMsIDB4RDAsIDB4OUMsCisJIDB4NjYsIDB4NDIsIDB4MDQsIDB4MDYsIDB4RDIsIDB4OUMsIDB4MkYsIDB4RDksIDB4NjQsIDB4NDYsIDB4MjQsIDB4NDQsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsCisJIDB4QTMsIDB4REIsIDB4RkYsIDB4QjQsIDB4NjAsIDB4NUMsIDB4NjYsIDB4NDQsIDB4MjIsIDB4QTQsIDB4RDAsIDB4ODQsIDB4RTAsIDB4QTAsIDB4MDIsIDB4MEQsCisJIDB4MDAsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDQsIDB4MUYsIDB4NjQsIDB4QTIsIDB4RDMsIDB4NjAsIDB4NUMsIDB4NjQsIDB4NUUsIDB4NjAsIDB4NDcsCisJIDB4MkYsIDB4RDEsIDB4MjgsIDB4QTMsIDB4QTMsIDB4RDksIDB4RDgsIDB4QTMsIDB4MkUsIDB4NDIsIDB4NEUsIDB4OEUsIDB4QkQsIDB4REIsIDB4REIsIDB4MDIsCisJIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDMsIDB4RkYsIDB4MzksIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODQsIDB4M0UsIDB4RkIsIDB4MDEsCisJIDB4M0QsIDB4NDQsIDB4MDAsIDB4QTgsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDIsIDB4NDAsIDB4RkYsIDB4NDQsIDB4RkYsIDB4RjQsIDB4MDEsIDB4QTAsIDB4NEMsCisJIDB4M0QsIDB4NDYsIDB4MkEsIDB4RjIsIDB4NDYsIDB4NEQsIDB4MTAsIDB4MjUsIDB4MTIsIDB4MDAsIDB4MDksIDB4RTEsIDB4QTEsIDB4RkYsIDB4MkQsIDB4NDYsCisJIDB4MEYsIDB4RjIsIDB4MDEsIDB4MjksIDB4MDYsIDB4MDAsIDB4MkEsIDB4RjAsIDB4NDAsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDgsIDB4QkMsCisJIDB4MDIsIDB4QkMsIDB4MEYsIDB4RkEsIDB4MDgsIDB4MjUsIDB4REUsIDB4MDEsIDB4Q0IsIDB4RkUsIDB4NUMsIDB4NUQsIDB4REMsIDB4MDEsIDB4NDQsIDB4RkYsCisJIDB4MDMsIDB4MkIsIDB4MjEsIDB4MDAsIDB4ODgsIDB4RjMsIDB4MDYsIDB4NjEsIDB4NjAsIDB4NDMsIDB4NjYsIDB4NDUsIDB4MzEsIDB4RjAsIDB4NjMsIDB4NDYsCisJIDB4MDUsIDB4RjIsIDB4NjUsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MzAsIDB4RjAsIDB4MEYsIDB4MDIsIDB4NjMsIDB4NDYsIDB4MDQsIDB4RjIsIDB4NjUsIDB4NDYsCisJIDB4RDAsIDB4ODAsIDB4MkYsIDB4RjAsIDB4MDksIDB4MDIsIDB4NjMsIDB4NDYsIDB4MDMsIDB4RjIsIDB4NjUsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDMsIDB4MDIsIDB4RkYsIDB4RkYsIDB4NDgsIDB4RkUsIDB4MDYsIDB4MDAsIDB4Q0QsIDB4ODEsIDB4MDIsIDB4QTMsIDB4RTcsIDB4MDIsIDB4ODcsIDB4RjEsCisJIDB4MDgsIDB4RkUsIDB4NjQsIDB4NDMsIDB4MjYsIDB4MDMsIDB4MzEsIDB4RjIsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsCisJIDB4MzEsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MzAsIDB4RjAsIDB4NjMsIDB4NDYsCisJIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MkYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4ODcsIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsCisJIDB4NjEsIDB4NDYsIDB4MDcsIDB4RkMsIDB4M0YsIDB4RjIsIDB4MDksIDB4NjAsIDB4QjAsIDB4NjUsIDB4RDQsIDB4ODAsIDB4MkEsIDB4RjIsIDB4OUQsIDB4MDUsCisJIDB4MDgsIDB4MjUsIDB4ODgsIDB4MDEsIDB4NUMsIDB4NEIsIDB4MEMsIDB4NjAsIDB4RUMsIDB4NjEsIDB4QTEsIDB4REYsIDB4MkQsIDB4NDYsIDB4M0IsIDB4RjIsCisJIDB4ODcsIDB4RjEsIDB4ODcsIDB4RjQsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MkIsIDB4QjcsIDB4MDAsIDB4RDMsIDB4ODAsIDB4MkMsIDB4RjAsIDB4OEQsIDB4MDMsCisJIDB4MDcsIDB4RjQsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4ODcsIDB4RjUsIDB4QkEsIDB4RjQsIDB4MkQsIDB4NDYsIDB4MDQsIDB4NjQsIDB4MDQsIDB4QjMsCisJIDB4MjIsIDB4RjAsIDB4MDQsIDB4MDMsIDB4QzUsIDB4NjAsIDB4QkQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTYsIDB4MDAsIDB4MTAsIDB4NjQsIDB4QjAsIDB4OUMsCisJIDB4M0IsIDB4RjIsIDB4MjIsIDB4RjgsIDB4NjAsIDB4NDcsIDB4QzAsIDB4QjcsIDB4MDIsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsCisJIDB4MDAsIDB4QTgsIDB4NDAsIDB4NEEsIDB4MTcsIDB4MDMsIDB4RTAsIDB4ODEsIDB4NjEsIDB4NDMsIDB4NDIsIDB4RkUsIDB4MDAsIDB4NjQsIDB4RjAsIDB4ODQsCisJIDB4RkUsIDB4MUYsIDB4NDAsIDB4NEEsIDB4RTEsIDB4ODQsIDB4RTAsIDB4ODQsIDB4MkQsIDB4NDYsIDB4MDcsIDB4RjQsIDB4RTAsIDB4ODEsIDB4M0IsIDB4RjAsCisJIDB4MkEsIDB4NDcsIDB4MEMsIDB4NjAsIDB4M0EsIDB4NjMsIDB4QTAsIDB4ODQsIDB4NDcsIDB4OUMsIDB4MTAsIDB4MDMsIDB4N0MsIDB4NDQsIDB4MDAsIDB4NjAsCisJIDB4QjIsIDB4NjMsIDB4MTQsIDB4MDAsIDB4MDcsIDB4RjQsIDB4M0IsIDB4RjAsIDB4NjYsIDB4NDQsIDB4NjQsIDB4NDAsIDB4ODAsIDB4MkIsIDB4MDYsIDB4MDAsCisJIDB4MDAsIDB4NjAsIDB4NzgsIDB4N0MsIDB4MDAsIDB4NjAsIDB4QTIsIDB4NjMsIDB4NDMsIDB4NEMsIDB4MDgsIDB4MDAsIDB4MkQsIDB4NDYsIDB4QzUsIDB4NjAsCisJIDB4QjAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkQsIDB4NDYsIDB4QzUsIDB4NjAsIDB4QjAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0UsIDB4RkIsIDB4Q0YsIDB4RjksCisJIDB4RDAsIDB4RkQsIDB4QUQsIDB4NDYsIDB4M0QsIDB4RjIsIDB4QUQsIDB4NDYsIDB4QTMsIDB4RDAsIDB4QUQsIDB4NDYsIDB4RDAsIDB4ODAsIDB4M0MsIDB4RjIsCisJIDB4QUQsIDB4NDYsIDB4MDIsIDB4MDMsIDB4MTUsIDB4MDcsIDB4RUUsIDB4MDQsIDB4NUIsIDB4RDAsIDB4QUQsIDB4NDYsIDB4RDAsIDB4ODAsIDB4M0EsIDB4RjIsCisJIDB4MDMsIDB4MDMsIDB4QUQsIDB4NDYsIDB4MEQsIDB4MDcsIDB4RTYsIDB4MDQsIDB4M0EsIDB4RjAsIDB4QUQsIDB4NDYsIDB4NUIsIDB4RDAsIDB4NjQsIDB4NDQsCisJIDB4RDAsIDB4ODAsIDB4MkIsIDB4NDQsIDB4MDUsIDB4MDcsIDB4REUsIDB4MDMsIDB4RDAsIDB4ODQsIDB4MTAsIDB4QTQsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDcsCisJIDB4Q0YsIDB4RjMsIDB4Q0UsIDB4RjUsIDB4RkUsIDB4QTQsIDB4MEYsIDB4NjAsIDB4QzAsIDB4NjEsIDB4MEUsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksCisJIDB4RkQsIDB4MUYsIDB4MkQsIDB4NDYsIDB4OEIsIDB4RkYsIDB4MkQsIDB4NDYsIDB4MEYsIDB4NjAsIDB4QjIsIDB4NjQsIDB4QzksIDB4NjAsIDB4NTgsIDB4NEYsCisJIDB4MTAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0YsIDB4RjIsIDB4MDAsIDB4NjAsIDB4MTgsIDB4NzAsIDB4MTgsIDB4NzEsIDB4MjAsIDB4NzIsIDB4NjAsIDB4NTMsCisJIDB4ODgsIDB4NzUsIDB4MDAsIDB4RjIsIDB4MDksIDB4RTEsIDB4NjAsIDB4NTAsIDB4MTIsIDB4NzEsIDB4NkUsIDB4NzIsIDB4ODMsIDB4NzUsIDB4QTEsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjUsIDB4MUYsIDB4MDAsIDB4NDAsIDB4RkYsIDB4MDIsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NzUsIDB4NDAsCisJIDB4MDMsIDB4MkEsIDB4MDMsIDB4MDAsIDB4ODAsIDB4NzUsIDB4MEEsIDB4NjQsIDB4MEIsIDB4MDAsIDB4ODAsIDB4NzUsIDB4MUIsIDB4RjMsIDB4OEIsIDB4RkYsCisJIDB4MDIsIDB4NjAsIDB4MDAsIDB4NzUsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NzUsIDB4REMsIDB4ODQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4OTgsIDB4RkYsIDB4MkQsIDB4NDYsIDB4MEYsIDB4RjAsIDB4RkYsIDB4RkYsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4ODgsIDB4RkYsIDB4QzMsIDB4NjAsCisJIDB4NzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OEIsIDB4RkYsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NzUsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NzUsCisJIDB4ODgsIDB4RkYsIDB4QzUsIDB4NjAsIDB4OTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjIsIDB4RjAsIDB4MjIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4MjIsIDB4RkEsCisJIDB4M0EsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDQsIDB4RTAsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RTEsIDB4N0YsIDB4NUEsIDB4RDAsCisJIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsIDB4RTIsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4N0MsIDB4NUYsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODUsCisJIDB4MEQsIDB4NjAsIDB4MDIsIDB4NjQsIDB4NDQsIDB4RDMsIDB4NUEsIDB4RDEsIDB4MDMsIDB4MUIsIDB4QzUsIDB4NjAsIDB4QjAsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDUsIDB4NjQsIDB4NDQsIDB4RTMsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RTQsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUIsCisJIDB4NjQsIDB4NDQsIDB4RTUsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RTYsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsCisJIDB4RTcsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjUsIDB4NDAsIDB4MEQsIDB4M0EsIDB4MUMsIDB4MDAsIDB4NjQsIDB4NDcsIDB4RTgsIDB4N0YsIDB4NUEsIDB4RDEsCisJIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsIDB4RTksIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RUEsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUIsCisJIDB4NjQsIDB4NDQsIDB4RUIsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RUMsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsCisJIDB4RUQsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RUUsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsIDB4RUYsIDB4N0YsCisJIDB4QTAsIDB4NUIsIDB4NjUsIDB4NDQsIDB4RDgsIDB4ODQsIDB4MDgsIDB4MjUsIDB4QjksIDB4MDAsIDB4NjAsIDB4N0YsIDB4QTAsIDB4NUIsIDB4ODAsIDB4NjAsCisJIDB4MDAsIDB4RUIsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUIsIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUIsIDB4M0YsIDB4RjIsIDB4M0IsIDB4RjAsIDB4NjAsIDB4NDMsCisJIDB4RkMsIDB4QTQsIDB4NjQsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MDMsIDB4MDAsIDB4MDgsIDB4QTQsIDB4M0YsIDB4RkEsIDB4MDgsIDB4QTMsIDB4RjgsIDB4QTMsCisJIDB4M0YsIDB4RkEsIDB4MEEsIDB4RTEsIDB4QjMsIDB4RkYsIDB4OUEsIDB4RkYsIDB4Q0IsIDB4ODMsIDB4MDAsIDB4RjQsIDB4MTAsIDB4NjIsIDB4NkMsIDB4NjEsCisJIDB4MEUsIDB4QTMsIDB4QUIsIDB4ODQsIDB4RjIsIDB4QTMsIDB4QTEsIDB4RkYsIDB4MDgsIDB4MDAsIDB4MDAsIDB4RjQsIDB4ODEsIDB4RjIsIDB4NkMsIDB4MTgsCisJIDB4MDIsIDB4NjIsIDB4QzksIDB4ODEsIDB4QUIsIDB4ODQsIDB4MDEsIDB4MDAsIDB4QTIsIDB4REMsIDB4N0EsIDB4RDQsIDB4RkQsIDB4MUMsIDB4QTIsIDB4REMsCisJIDB4MDgsIDB4MjUsIDB4OEMsIDB4MDAsIDB4RjIsIDB4MUQsIDB4NDEsIDB4NDQsIDB4N0MsIDB4QTgsIDB4RDksIDB4ODEsIDB4RUUsIDB4MDMsIDB4RkYsIDB4QjEsCisJIDB4OTgsIDB4RkYsIDB4MDksIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjUsIDB4ODAsIDB4MDAsIDB4NDAsIDB4RkYsIDB4NDIsIDB4NDIsCisJIDB4NDYsIDB4NDMsIDB4MDYsIDB4MUUsIDB4MDQsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjIsIDB4NDIsIDB4NDIsIDB4NDYsIDB4NDMsIDB4MDEsIDB4QTIsCisJIDB4NjMsIDB4NDUsIDB4MDEsIDB4QTIsIDB4NjIsIDB4NDMsIDB4NDYsIDB4NEMsIDB4QzYsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NEIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MEEsIDB4RTEsIDB4OUEsIDB4RkYsIDB4MjQsIDB4NDEsIDB4MDIsIDB4QTEsIDB4NjUsIDB4NDMsIDB4MDgsIDB4QTMsIDB4MjMsIDB4NDYsIDB4MjIsIDB4NDIsCisJIDB4N0UsIDB4M0EsIDB4MEEsIDB4MDAsIDB4MDAsIDB4RjQsIDB4ODEsIDB4RjIsIDB4MzcsIDB4MTgsIDB4MDIsIDB4NjIsIDB4QzksIDB4ODEsIDB4QUIsIDB4ODQsCisJIDB4MDMsIDB4MDAsIDB4QTIsIDB4REMsIDB4N0UsIDB4MzYsIDB4RjYsIDB4MDEsIDB4N0EsIDB4RDQsIDB4RkYsIDB4RkYsIDB4RkEsIDB4MUMsIDB4QTIsIDB4REMsCisJIDB4RjEsIDB4MUQsIDB4RDksIDB4ODEsIDB4RkYsIDB4QjEsIDB4MEIsIDB4MUUsIDB4NjIsIDB4NDAsIDB4N0UsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsCisJIDB4MDIsIDB4NjIsIDB4NUEsIDB4RDIsIDB4ODksIDB4RkYsIDB4ODAsIDB4NEYsIDB4NkYsIDB4NDQsIDB4QTIsIDB4REEsIDB4ODgsIDB4RkYsIDB4OTgsIDB4RkYsCisJIDB4M0QsIDB4NDYsIDB4MEYsIDB4RjAsIDB4MEEsIDB4NjQsIDB4QjAsIDB4ODQsIDB4MTgsIDB4MTQsIDB4RjcsIDB4QjQsIDB4QTIsIDB4REEsIDB4MDYsIDB4NjAsCisJIDB4NzYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MEMsIDB4MDAsIDB4RDEsIDB4RjUsIDB4RDAsIDB4RjQsIDB4MEMsIDB4NjAsCisJIDB4RUMsIDB4NjEsIDB4NTksIDB4RDEsIDB4M0IsIDB4RjgsIDB4MDUsIDB4NjQsIDB4NTksIDB4RDEsIDB4Q0MsIDB4ODQsIDB4QkQsIDB4RDgsIDB4RkMsIDB4MDIsCisJIDB4MkQsIDB4NDYsIDB4QzMsIDB4NjAsIDB4NzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4MDAsIDB4QTIsIDB4REEsIDB4MkQsIDB4NDYsIDB4M0IsIDB4RjAsCisJIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MUUsIDB4MDAsIDB4MDcsIDB4RjQsIDB4QkIsIDB4RjAsIDB4MkEsIDB4NDQsIDB4QTQsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4MkYsIDB4MjYsIDB4MTYsIDB4MDAsIDB4MkQsIDB4NDYsIDB4NjQsIDB4NDQsIDB4M0EsIDB4RjAsIDB4QkMsIDB4RjAsIDB4NjQsIDB4NUYsCisJIDB4M0QsIDB4RjAsIDB4MDcsIDB4RjQsIDB4RDAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4MDgsIDB4QTMsIDB4NUIsIDB4RDgsIDB4NjUsIDB4NUMsIDB4NUIsIDB4RDgsCisJIDB4NUIsIDB4REEsIDB4MkQsIDB4NDYsIDB4Q0UsIDB4RjMsIDB4M0MsIDB4RkEsIDB4Q0YsIDB4RjMsIDB4M0QsIDB4RkEsIDB4MkEsIDB4NDQsIDB4MjMsIDB4RkEsCisJIDB4MDEsIDB4MDAsIDB4MkQsIDB4NDYsIDB4QzMsIDB4NjAsIDB4NzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OTgsIDB4RkYsIDB4NDMsIDB4RkYsCisJIDB4NDAsIDB4RkYsIDB4QjAsIDB4RkYsIDB4QjEsIDB4RkYsIDB4MkQsIDB4NDYsIDB4MEMsIDB4NjAsIDB4RUMsIDB4NjEsIDB4QTEsIDB4RDMsIDB4MkQsIDB4NDYsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MEEsIDB4MDAsIDB4RDEsIDB4RjUsIDB4RDAsIDB4RjQsIDB4NTksIDB4RDEsIDB4M0IsIDB4RjgsIDB4MDUsIDB4NjQsCisJIDB4NTksIDB4RDEsIDB4Q0MsIDB4ODQsIDB4QkQsIDB4RDgsIDB4RkMsIDB4MDIsIDB4MkQsIDB4NDYsIDB4QzMsIDB4NjAsIDB4NTMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4OTgsIDB4RkYsIDB4MDksIDB4RTEsIDB4QTEsIDB4RkYsIDB4M0QsIDB4NDYsIDB4MDgsIDB4MjUsIDB4RTAsIDB4MDEsIDB4MEYsIDB4RjIsIDB4NDAsIDB4RkYsCisJIDB4MDIsIDB4QkMsIDB4QTIsIDB4REEsIDB4QzMsIDB4NjAsIDB4NzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QjAsIDB4ODQsIDB4MjIsIDB4RkEsIDB4MDAsIDB4NjMsCisJIDB4M0IsIDB4RjIsIDB4MDYsIDB4NjAsIDB4NzYsIDB4RkQsIDB4NjAsIDB4NDcsIDB4QzAsIDB4QjcsIDB4MDIsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsCisJIDB4RjAsIDB4ODQsIDB4MDAsIDB4QTgsIDB4NDAsIDB4NEEsIDB4MTYsIDB4MDMsIDB4RTAsIDB4ODEsIDB4NjEsIDB4NDMsIDB4NDIsIDB4RkUsIDB4MDAsIDB4NjQsCisJIDB4RjAsIDB4ODQsIDB4RkUsIDB4MUYsIDB4NDAsIDB4NEEsIDB4RTEsIDB4ODQsIDB4RTAsIDB4ODQsIDB4MkQsIDB4NDYsIDB4MDcsIDB4RjQsIDB4RTAsIDB4ODEsCisJIDB4M0IsIDB4RjAsIDB4MkEsIDB4NDcsIDB4MEMsIDB4NjAsIDB4M0EsIDB4NjMsIDB4QTAsIDB4ODQsIDB4NDcsIDB4OUMsIDB4MTAsIDB4MDMsIDB4N0MsIDB4NDQsCisJIDB4QTgsIDB4NjMsIDB4MEYsIDB4MDAsIDB4MDcsIDB4RjQsIDB4MjAsIDB4NjQsIDB4NDAsIDB4NEEsIDB4M0IsIDB4RjAsIDB4NjYsIDB4NDQsIDB4NjQsIDB4NDAsCisJIDB4ODAsIDB4MkIsIDB4MDUsIDB4MDAsIDB4MDAsIDB4NjAsIDB4NzgsIDB4N0MsIDB4MDAsIDB4NjAsIDB4OTgsIDB4NjMsIDB4MDIsIDB4MDAsIDB4MkQsIDB4NDYsCisJIDB4QkYsIDB4MDEsIDB4MkQsIDB4NDYsIDB4Q0UsIDB4RkIsIDB4Q0YsIDB4RjksIDB4RDAsIDB4RkQsIDB4MDcsIDB4RjIsIDB4RDEsIDB4RkIsIDB4NjAsIDB4NDYsCisJIDB4M0IsIDB4RjAsIDB4MkEsIDB4NDQsIDB4MDYsIDB4NjAsIDB4NzcsIDB4RjksIDB4NUMsIDB4NEIsIDB4QTAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4M0YsIDB4MjIsCisJIDB4MDUsIDB4MDAsIDB4OTAsIDB4ODQsIDB4M0IsIDB4RkEsIDB4MDEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MjEsIDB4MDAsIDB4QUQsIDB4NDYsIDB4MEEsIDB4QTMsCisJIDB4M0QsIDB4RjIsIDB4QUQsIDB4NDYsIDB4QTMsIDB4RDAsIDB4QUQsIDB4NDYsIDB4RDAsIDB4ODAsIDB4M0MsIDB4RjIsIDB4QUQsIDB4NDYsIDB4MDIsIDB4MDMsCisJIDB4MTYsIDB4MDcsIDB4MTQsIDB4MDQsIDB4NUIsIDB4RDAsIDB4QUQsIDB4NDYsIDB4RDAsIDB4ODAsIDB4M0IsIDB4RjIsIDB4MDMsIDB4MDMsIDB4QUQsIDB4NDYsCisJIDB4MEUsIDB4MDcsIDB4MEMsIDB4MDQsIDB4M0EsIDB4RjAsIDB4QUQsIDB4NDYsIDB4NUIsIDB4RDAsIDB4NjQsIDB4NUYsIDB4RDAsIDB4ODAsIDB4MkIsIDB4NDQsCisJIDB4MTcsIDB4MDcsIDB4MDQsIDB4MDMsIDB4RDAsIDB4ODQsIDB4MTAsIDB4QTQsIDB4RkYsIDB4RkYsIDB4MTIsIDB4MDcsIDB4ODksIDB4MDEsIDB4MDEsIDB4NjQsCisJIDB4MDYsIDB4NjAsIDB4NzYsIDB4RkIsIDB4MkQsIDB4NDYsIDB4MEMsIDB4NjAsIDB4RkMsIDB4NjIsIDB4ODAsIDB4RkYsIDB4NzgsIDB4NDQsIDB4MDMsIDB4QTQsCisJIDB4QTIsIDB4REIsIDB4QzYsIDB4NjAsIDB4NzYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODUsIDB4RkYsIDB4MkQsIDB4NDYsIDB4MDgsIDB4MjUsIDB4NUUsIDB4MDEsCisJIDB4MkQsIDB4NDYsIDB4MEMsIDB4NjAsIDB4RkMsIDB4NjIsIDB4ODAsIDB4RkYsIDB4NzgsIDB4NDQsIDB4MDMsIDB4QTQsIDB4QTIsIDB4REIsIDB4QzYsIDB4NjAsCisJIDB4RkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODUsIDB4RkYsIDB4MkQsIDB4NDYsIDB4MDgsIDB4MjUsIDB4NTAsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MEYsIDB4NjQsCisJIDB4QzQsIDB4NjAsIDB4REIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkQsIDB4NDYsIDB4M0IsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MkIsCisJIDB4MjMsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDgsIDB4NjEsIDB4MkQsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MEEsIDB4NjIsIDB4NTYsIDB4OTIsIDB4NUEsIDB4RDAsCisJIDB4MkMsIDB4NDYsIDB4NjQsIDB4NDcsIDB4NjMsIDB4NDAsIDB4N0YsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjMsIDB4NDYsIDB4NEMsCisJIDB4NjAsIDB4RkUsIDB4REUsIDB4RDgsIDB4N0YsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjMsIDB4NDYsIDB4NEMsIDB4REUsIDB4REEsCisJIDB4RkUsIDB4QTEsIDB4MjAsIDB4RkUsIDB4RTgsIDB4MDIsIDB4NjMsIDB4NDEsIDB4RkQsIDB4QTEsIDB4NDYsIDB4NEMsIDB4MDEsIDB4RjIsIDB4MkQsIDB4NDYsCisJIDB4NjEsIDB4NUUsIDB4MTYsIDB4RkEsIDB4MkMsIDB4NDQsIDB4MDYsIDB4RkEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjQsIDB4NjYsIDB4NDEsCisJIDB4MDMsIDB4RjIsIDB4MDQsIDB4RjIsIDB4NDAsIDB4NDIsIDB4MDUsIDB4RjIsIDB4NDAsIDB4NDMsIDB4NDAsIDB4NDQsIDB4NjEsIDB4NDYsIDB4M0MsIDB4RjIsCisJIDB4M0QsIDB4RjIsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDEsIDB4MEQsIDB4NjAsIDB4NzIsIDB4NjUsIDB4MDAsIDB4NjEsIDB4Q0YsIDB4RjEsIDB4Q0UsIDB4RjUsCisJIDB4NDQsIDB4NEMsIDB4MkMsIDB4NUMsIDB4RTksIDB4ODAsIDB4MDAsIDB4NjQsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsIDB4QzAsIDB4ODMsIDB4QkQsIDB4RDIsCisJIDB4MjQsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjAsIDB4NDQsIDB4NDAsIDB4ODAsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsCisJIDB4MjAsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjEsIDB4NDQsIDB4NDAsIDB4ODEsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsCisJIDB4MjEsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjIsIDB4NDQsIDB4NDAsIDB4ODIsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsCisJIDB4MjIsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjMsIDB4NDQsIDB4NDAsIDB4ODMsIDB4RjIsIDB4QTMsIDB4QkQsIDB4RDIsCisJIDB4MjMsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjQsIDB4NDQsIDB4QzAsIDB4OUMsIDB4NDEsIDB4ODQsIDB4REQsIDB4ODEsCisJIDB4MDgsIDB4MkEsIDB4QTcsIDB4MDEsIDB4MEMsIDB4NjAsIDB4RUUsIDB4NjEsIDB4MDUsIDB4NjQsIDB4RDAsIDB4RjQsIDB4RDEsIDB4RjUsIDB4RkUsIDB4QTMsCisJIDB4NUIsIDB4RDAsIDB4Q0MsIDB4ODQsIDB4NTksIDB4RDksIDB4RkMsIDB4MDIsIDB4RDAsIDB4RjMsIDB4RDEsIDB4RjUsIDB4NjAsIDB4NDIsIDB4MjAsIDB4NDQsCisJIDB4QTIsIDB4REEsIDB4MjEsIDB4NDQsIDB4NUEsIDB4REEsIDB4MjIsIDB4NDQsIDB4NUEsIDB4REEsIDB4MjMsIDB4NDQsIDB4NUEsIDB4REEsIDB4MjQsIDB4NDQsCisJIDB4NUEsIDB4REEsIDB4NjEsIDB4NDYsIDB4MDYsIDB4NjAsIDB4N0UsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDEsIDB4RDAsIDB4RjMsCisJIDB4RDEsIDB4RjUsIDB4QTAsIDB4RDIsIDB4NUEsIDB4RDAsIDB4NDAsIDB4NDAsIDB4NDQsIDB4NDEsIDB4NUEsIDB4RDIsIDB4NUEsIDB4RDAsIDB4NDAsIDB4NDIsCisJIDB4NUEsIDB4RDAsIDB4NDQsIDB4NDMsIDB4NjEsIDB4NDYsIDB4QkEsIDB4RjAsIDB4M0IsIDB4RjIsIDB4NDQsIDB4NDQsIDB4NjUsIDB4NUYsIDB4NDAsIDB4ODUsCisJIDB4Q0YsIDB4RjQsIDB4Q0UsIDB4RjUsIDB4NDMsIDB4NEMsIDB4MEQsIDB4NjAsIDB4NzIsIDB4NjUsIDB4QkQsIDB4RDIsIDB4MjUsIDB4NUMsIDB4OTAsIDB4OUMsCisJIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjAsIDB4NDQsIDB4NDAsIDB4ODAsIDB4QkQsIDB4RDIsIDB4MjAsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsCisJIDB4OTAsIDB4OUMsIDB4MjEsIDB4NDQsIDB4NDAsIDB4ODEsIDB4QkQsIDB4RDIsIDB4MjEsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsCisJIDB4MjIsIDB4NDQsIDB4NDAsIDB4ODIsIDB4QkQsIDB4RDIsIDB4MjIsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsCisJIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjMsIDB4NDQsCisJIDB4NDAsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjMsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjQsIDB4NDQsIDB4NDAsIDB4ODQsCisJIDB4QkQsIDB4RDIsIDB4MjQsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjUsIDB4NDQsIDB4NDAsIDB4ODUsIDB4NjEsIDB4NDYsCisJIDB4M0EsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDQsIDB4RTAsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RTEsIDB4N0YsIDB4NUEsIDB4RDAsCisJIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsIDB4RTIsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4Q0UsIDB4RjUsIDB4QkQsIDB4RDIsIDB4MjUsIDB4NUMsCisJIDB4OTAsIDB4ODQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjAsIDB4NUMsIDB4NDAsIDB4ODAsIDB4MjAsIDB4NDQsIDB4RTQsIDB4N0YsIDB4QTAsIDB4NUIsCisJIDB4MjAsIDB4NDcsIDB4RTUsIDB4N0YsIDB4QTAsIDB4NUIsIDB4QkQsIDB4RDIsIDB4MjAsIDB4NUMsIDB4OTAsIDB4ODQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsCisJIDB4MjEsIDB4NUMsIDB4NDAsIDB4ODEsIDB4MjEsIDB4NDQsIDB4RTYsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjEsIDB4NDcsIDB4RTcsIDB4N0YsIDB4QTAsIDB4NUIsCisJIDB4MjEsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjIsIDB4NUMsIDB4NDAsIDB4ODIsIDB4MjIsIDB4NDQsIDB4RTgsIDB4N0YsIDB4QTAsIDB4NUIsCisJIDB4MjIsIDB4NDcsIDB4RTksIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjIsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjMsIDB4NUMsIDB4NDAsIDB4ODMsCisJIDB4MjMsIDB4NDQsIDB4RUEsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjMsIDB4NDcsIDB4RUIsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjMsIDB4NDQsIDB4RTgsIDB4ODAsCisJIDB4RjgsIDB4ODQsIDB4MjQsIDB4NUMsIDB4NDAsIDB4ODQsIDB4MjQsIDB4NDQsIDB4RUMsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjQsIDB4NDcsIDB4RUQsIDB4N0YsCisJIDB4QTAsIDB4NUIsIDB4MjQsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjUsIDB4NUMsIDB4NDAsIDB4ODUsIDB4MjUsIDB4NDQsIDB4RUUsIDB4N0YsCisJIDB4QTAsIDB4NUIsIDB4MjUsIDB4NDcsIDB4RUYsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MkMsIDB4NDMsIDB4QTMsIDB4RDIsIDB4MjUsIDB4NUMsIDB4OTAsIDB4ODEsCisJIDB4RTksIDB4ODQsIDB4RTMsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MDYsIDB4NjAsIDB4N0UsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0IsIDB4RjMsCisJIDB4NUEsIDB4RDMsIDB4NDAsIDB4NDgsIDB4NUEsIDB4RDMsIDB4NDAsIDB4NDksIDB4NDAsIDB4NEEsIDB4MDAsIDB4NjAsIDB4NzgsIDB4N0MsIDB4NDQsIDB4NEQsCisJIDB4NDksIDB4RjIsIDB4NEEsIDB4RjIsIDB4NDAsIDB4NDcsIDB4NDAsIDB4NDYsIDB4MEQsIDB4NjAsIDB4NzIsIDB4NjUsIDB4MDAsIDB4NjEsIDB4MkQsIDB4NUMsCisJIDB4RTksIDB4ODAsIDB4MDAsIDB4NjQsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsIDB4QzAsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MkEsIDB4NUMsIDB4OTAsIDB4OUMsCisJIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjYsIDB4NDQsIDB4NDAsIDB4ODYsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjYsIDB4NUMsIDB4OTAsIDB4OUMsCisJIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjcsIDB4NDQsIDB4NDAsIDB4ODcsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjcsIDB4NUMsIDB4OTAsIDB4OUMsCisJIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjgsIDB4NDQsIDB4NDAsIDB4ODgsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjgsIDB4NUMsIDB4OTAsIDB4OUMsCisJIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjksIDB4NDQsIDB4NDAsIDB4ODksIDB4RjIsIDB4QTMsIDB4QkQsIDB4RDIsIDB4MjksIDB4NUMsIDB4OTAsIDB4OUMsCisJIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MkEsIDB4NDQsIDB4QzAsIDB4OUMsIDB4NDEsIDB4OEEsIDB4REQsIDB4ODEsIDB4MDgsIDB4MkEsIDB4QTcsIDB4MDEsCisJIDB4MjYsIDB4NDQsIDB4NDQsIDB4RkEsIDB4MjcsIDB4NDQsIDB4NDUsIDB4RkEsIDB4MjgsIDB4NDQsIDB4NDYsIDB4RkEsIDB4MjksIDB4NDQsIDB4NDcsIDB4RkEsCisJIDB4MkEsIDB4NDQsIDB4NDgsIDB4RkEsIDB4MDYsIDB4NjAsIDB4N0YsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4ODgsIDB4N0MsCisJIDB4NDQsIDB4NEQsIDB4MkQsIDB4NDIsIDB4QTIsIDB4RDIsIDB4NUEsIDB4RDAsIDB4NDAsIDB4NDYsIDB4NDQsIDB4NDcsIDB4NUEsIDB4RDIsIDB4NUEsIDB4RDAsCisJIDB4NDAsIDB4NDgsIDB4NUEsIDB4RDAsIDB4NDQsIDB4NDksIDB4NEIsIDB4RjIsIDB4NDQsIDB4NEEsIDB4NDAsIDB4OEIsIDB4NjAsIDB4NUMsIDB4NjQsIDB4NDcsCisJIDB4RTAsIDB4N0YsIDB4QTAsIDB4NUEsIDB4RkYsIDB4QjQsIDB4MjAsIDB4QkMsIDB4N0YsIDB4QjQsIDB4RTEsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsCisJIDB4RTIsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MDAsIDB4NjAsIDB4NzgsIDB4NjMsIDB4MEQsIDB4NjAsIDB4NzIsIDB4NjUsIDB4QkQsIDB4RDIsIDB4MkIsIDB4NUMsCisJIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsCisJIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjYsIDB4NDQsIDB4NDAsIDB4ODYsIDB4QkQsIDB4RDIsIDB4MjYsIDB4NUMsIDB4OTAsIDB4OUMsCisJIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjcsIDB4NDQsIDB4NDAsIDB4ODcsIDB4QkQsIDB4RDIsIDB4MjcsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsCisJIDB4OTAsIDB4OUMsIDB4MjgsIDB4NDQsIDB4NDAsIDB4ODgsIDB4QkQsIDB4RDIsIDB4MjgsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsCisJIDB4MjksIDB4NDQsIDB4NDAsIDB4ODksIDB4QkQsIDB4RDIsIDB4MjksIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsCisJIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MkEsIDB4NDQsCisJIDB4NDAsIDB4OEEsIDB4QkQsIDB4RDIsIDB4MkEsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MkIsIDB4NDQsIDB4NDAsIDB4OEIsCisJIDB4QkQsIDB4RDIsIDB4MkIsIDB4NUMsIDB4OTAsIDB4ODQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjYsIDB4NUMsIDB4NDAsIDB4ODYsIDB4MjYsIDB4NDQsCisJIDB4RTQsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MjYsIDB4NDcsIDB4RTUsIDB4N0YsIDB4QTAsIDB4NUEsIDB4QkQsIDB4RDIsIDB4MjYsIDB4NUMsIDB4OTAsIDB4ODQsCisJIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjcsIDB4NUMsIDB4NDAsIDB4ODcsIDB4MjcsIDB4NDQsIDB4RTYsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MjcsIDB4NDcsCisJIDB4RTcsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MjcsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjgsIDB4NUMsIDB4NDAsIDB4ODgsIDB4MjgsIDB4NDQsCisJIDB4RTgsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MjgsIDB4NDcsIDB4RTksIDB4N0YsIDB4QTAsIDB4NUEsIDB4MjgsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsCisJIDB4MjksIDB4NUMsIDB4NDAsIDB4ODksIDB4MjksIDB4NDQsIDB4RUEsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MjksIDB4NDcsIDB4RUIsIDB4N0YsIDB4QTAsIDB4NUEsCisJIDB4MjksIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MkEsIDB4NUMsIDB4NDAsIDB4OEEsIDB4MkEsIDB4NDQsIDB4RUMsIDB4N0YsIDB4QTAsIDB4NUEsCisJIDB4MkEsIDB4NDcsIDB4RUQsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MkEsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MkIsIDB4NUMsIDB4NDAsIDB4OEIsCisJIDB4MkIsIDB4NDQsIDB4RUUsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MkIsIDB4NDcsIDB4RUYsIDB4N0YsIDB4QTAsIDB4NUEsIDB4M0MsIDB4RjAsIDB4MkIsIDB4NDQsCisJIDB4OTAsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTMsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MDYsIDB4NjAsIDB4N0YsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDUsIDB4MDAsIDB4RjAsIDB4ODQsIDB4NjAsIDB4MDAsIDB4RTMsIDB4MDQsIDB4NzEsIDB4NjQsIDB4NTAsIDB4MDEsIDB4MkEsIDB4MDQsIDB4NzEsCisJIDB4NUMsIDB4NjEsIDB4MDQsIDB4NjMsIDB4NTksIDB4RDAsIDB4NTgsIDB4RDksIDB4RkQsIDB4MUYsIDB4M0QsIDB4RjIsIDB4NjAsIDB4NDMsIDB4NjAsIDB4NDcsCisJIDB4NUIsIDB4REIsIDB4M0MsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4NUIsIDB4REIsIDB4M0EsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsCisJIDB4NUIsIDB4REIsIDB4M0YsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4NUIsIDB4REIsIDB4ODEsIDB4NjAsIDB4MTgsIDB4RTMsIDB4NjUsIDB4NDMsCisJIDB4RTMsIDB4ODQsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4NjAsIDB4NTAsIDB4N0YsIDB4NjQsIDB4MjMsIDB4OTQsIDB4NjAsIDB4NTEsIDB4N0MsIDB4NzIsCisJIDB4MDQsIDB4NzUsIDB4MEMsIDB4NjAsIDB4MTYsIDB4NjEsIDB4MTYsIDB4NjAsIDB4MDAsIDB4NjMsIDB4NTksIDB4REQsIDB4MkEsIDB4RjIsIDB4ODcsIDB4NjAsCisJIDB4OEYsIDB4NjUsIDB4QTQsIDB4ODcsIDB4NDAsIDB4QkYsIDB4NTksIDB4REIsIDB4NTYsIDB4NjQsIDB4MEEsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksCisJIDB4RkQsIDB4MUYsIDB4NjIsIDB4NjQsIDB4MDQsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4MzUsIDB4RjIsIDB4MEYsIDB4NjUsCisJIDB4QTQsIDB4OUMsIDB4NTksIDB4RDksIDB4MDYsIDB4NjMsIDB4NTksIDB4REYsIDB4RkUsIDB4MUYsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsCisJIDB4MDMsIDB4MkIsIDB4MDUsIDB4MDAsIDB4NkEsIDB4NjQsIDB4MDQsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4NjUsIDB4NDAsCisJIDB4OEYsIDB4QjAsIDB4ODgsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MzksIDB4RjAsIDB4NTksIDB4RDksIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEMsIDB4NjAsCisJIDB4MTYsIDB4NjEsIDB4QTMsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjQsIDB4MEEsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsCisJIDB4NTksIDB4REYsIDB4NTksIDB4REYsIDB4QTAsIDB4NEMsIDB4MDQsIDB4QkMsIDB4RkYsIDB4QjQsIDB4QTAsIDB4NTEsIDB4MjMsIDB4NDQsIDB4MDEsIDB4QTcsCisJIDB4ODAsIDB4QkYsIDB4NjAsIDB4NTAsIDB4ODAsIDB4NjAsIDB4MzgsIDB4NzEsIDB4ODAsIDB4NjAsIDB4N0MsIDB4NzIsIDB4MDEsIDB4NzYsIDB4RkYsIDB4RkYsCisJIDB4NzYsIDB4NDQsIDB4MDEsIDB4M0EsIDB4RkQsIDB4MDEsIDB4NDAsIDB4NzYsIDB4NDIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NzYsIDB4ODAsIDB4NjAsCisJIDB4MTgsIDB4NzAsIDB4ODAsIDB4NjAsIDB4MTgsIDB4NzEsIDB4ODAsIDB4NjAsIDB4N0MsIDB4NzIsIDB4ODAsIDB4NjAsIDB4MTAsIDB4NzMsIDB4MDIsIDB4NzYsCisJIDB4NzYsIDB4NDQsIDB4RkYsIDB4RkYsIDB4NzYsIDB4NDQsIDB4MDIsIDB4M0EsIDB4RkQsIDB4MDEsIDB4NDAsIDB4NzYsIDB4NDIsIDB4RkYsIDB4M0MsIDB4NDYsCisJIDB4MDAsIDB4RjIsIDB4ODAsIDB4NjAsIDB4MDAsIDB4QkMsIDB4NjAsIDB4NTAsIDB4ODAsIDB4NjAsIDB4MTIsIDB4NzEsIDB4ODAsIDB4NjAsIDB4NkUsIDB4NzIsCisJIDB4M0YsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RjgsIDB4QTcsIDB4ODAsIDB4QkYsIDB4NjAsIDB4NTMsIDB4MDQsIDB4NzYsIDB4RkYsIDB4RkYsIDB4ODgsIDB4RkYsCisJIDB4M0MsIDB4NDYsIDB4MDcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NDMsIDB4QTMsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NzcsIDB4NDAsCisJIDB4OEIsIDB4RkYsIDB4QTAsIDB4NEMsIDB4MDQsIDB4RTEsIDB4RkYsIDB4RkYsIDB4NzYsIDB4NDQsIDB4MDQsIDB4M0EsIDB4RkQsIDB4MDEsIDB4NDAsIDB4NzYsCisJIDB4NDIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NzYsIDB4RkYsIDB4RkYsIDB4NzYsIDB4NDQsIDB4MjAsIDB4M0EsIDB4RkQsIDB4MDEsIDB4NDAsIDB4NzYsCisJIDB4NDIsIDB4RkYsIDB4QTAsIDB4NDgsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NTEsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4QTAsIDB4NEMsCisJIDB4RkIsIDB4QjQsIDB4QTAsIDB4NTEsIDB4MDYsIDB4NjAsIDB4MUYsIDB4RTEsIDB4MTYsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsCisJIDB4M0YsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RjgsIDB4QTQsIDB4M0YsIDB4RkEsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDcsIDB4MDgsIDB4RkEsIDB4QTAsIDB4NDgsCisJIDB4MDgsIDB4MjYsIDB4MDcsIDB4MDAsIDB4QTAsIDB4NEMsIDB4MDQsIDB4RTEsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0YsCisJIDB4QTAsIDB4NTEsIDB4NDIsIDB4RkYsIDB4MjYsIDB4NDYsIDB4OEIsIDB4RkYsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NzUsIDB4M0MsIDB4RjIsIDB4NDAsIDB4NzYsCisJIDB4MTQsIDB4MUIsIDB4MjYsIDB4NDYsIDB4M0IsIDB4RjIsIDB4MEMsIDB4NjAsIDB4QkMsIDB4NjMsIDB4NjAsIDB4NDcsIDB4QzAsIDB4QjQsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4NDMsIDB4OTMsIDB4RTMsIDB4OUMsIDB4NjQsIDB4NDcsIDB4ODAsIDB4N0MsIDB4NjQsIDB4NUYsIDB4NjAsIDB4NTAsCisJIDB4N0YsIDB4NjQsIDB4MjMsIDB4OTcsIDB4ODAsIDB4QkYsIDB4NjAsIDB4NTEsIDB4MDcsIDB4MDAsIDB4MDEsIDB4QTcsIDB4ODAsIDB4QkYsIDB4NjAsIDB4NTAsCisJIDB4ODAsIDB4NjAsIDB4NDAsIDB4NzEsIDB4ODAsIDB4NjAsIDB4N0MsIDB4NzIsIDB4MDEsIDB4NzYsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MEMsIDB4MjEsIDB4RkMsIDB4MDEsIDB4MDQsIDB4MjUsIDB4RDUsIDB4MDEsIDB4NDAsIDB4NzYsIDB4NDMsIDB4RkYsIDB4MEMsIDB4NjAsIDB4MjIsIDB4NjEsCisJIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjQsIDB4MEEsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4NTksIDB4REYsCisJIDB4NTksIDB4REYsIDB4ODAsIDB4NjAsIDB4MTgsIDB4NzAsIDB4ODAsIDB4NjAsIDB4MjQsIDB4NzEsIDB4ODAsIDB4NjAsIDB4N0MsIDB4NzIsIDB4ODAsIDB4NjAsCisJIDB4MTAsIDB4NzMsIDB4MDIsIDB4NzYsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MEMsIDB4MjEsIDB4RkMsIDB4MDEsIDB4MDQsIDB4MjUsCisJIDB4QjgsIDB4MDEsIDB4NDAsIDB4NzYsIDB4NDMsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4ODAsIDB4QkYsCisJIDB4NjAsIDB4NTAsIDB4ODAsIDB4NjAsIDB4MTIsIDB4NzEsIDB4M0YsIDB4RjIsIDB4ODAsIDB4NjAsIDB4NkUsIDB4NzIsIDB4NjAsIDB4NDcsIDB4ODAsIDB4QkYsCisJIDB4NjAsIDB4NTMsIDB4MDQsIDB4NzYsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MEMsIDB4MjEsIDB4RkMsIDB4MDEsIDB4MDQsIDB4MjUsCisJIDB4QTAsIDB4MDEsIDB4NDAsIDB4NzYsIDB4NDMsIDB4RkYsIDB4MDgsIDB4NzYsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MEMsIDB4MjEsCisJIDB4RkMsIDB4MDEsIDB4MDQsIDB4MjUsIDB4OTYsIDB4MDEsIDB4NzYsIDB4NUMsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NzYsIDB4NDMsIDB4RkYsIDB4ODgsIDB4RkYsCisJIDB4MjYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4REYsIDB4NjAsIDB4MkEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MTEsIDB4RjEsCisJIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MjAsIDB4MDAsIDB4NzQsIDB4RjMsIDB4MzEsIDB4NDAsCisJIDB4MDEsIDB4MkEsIDB4MUMsIDB4MDAsIDB4REMsIDB4ODQsIDB4MDEsIDB4QjQsIDB4NzQsIDB4RkIsIDB4MDgsIDB4MDIsIDB4MDgsIDB4NjAsIDB4MTIsIDB4RjEsCisJIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTAsIDB4MDAsIDB4MDgsIDB4NjAsIDB4MTgsIDB4RjEsCisJIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDgsIDB4MDAsIDB4QTksIDB4RkUsIDB4RTYsIDB4MDUsCisJIDB4QUIsIDB4RkUsIDB4MDcsIDB4MDUsIDB4QTgsIDB4RkUsIDB4RDcsIDB4MDUsIDB4QUEsIDB4RkUsIDB4RDgsIDB4MDUsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4ODUsIDB4M0UsIDB4MEYsIDB4NjAsIDB4ODUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MDMsIDB4MDIsIDB4Q0EsIDB4NjAsCisJIDB4N0UsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDUsIDB4RDQsIDB4ODAsIDB4MEYsIDB4RjAsIDB4RjksIDB4MDMsIDB4NjQsIDB4NDQsIDB4NzAsIDB4QjAsCisJIDB4NzAsIDB4MkEsIDB4MTMsIDB4MDAsIDB4MTMsIDB4NjAsIDB4MDgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4MDAsIDB4MzYsIDB4MDAsIDB4M0IsCisJIDB4QTIsIDB4REIsIDB4QTIsIDB4RkYsIDB4OEUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4RkUsIDB4QTAsIDB4OEUsIDB4RkIsIDB4MDEsIDB4MDcsCisJIDB4RDQsIDB4RkUsIDB4QTMsIDB4RkYsIDB4Q0UsIDB4NjAsIDB4MzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MjYsIDB4MDksIDB4MDAsCisJIDB4NjYsIDB4NDUsIDB4MDksIDB4RjQsIDB4MEYsIDB4RjIsIDB4MDIsIDB4MTgsIDB4NjUsIDB4NDYsIDB4RTQsIDB4MUIsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NDYsCisJIDB4Q0QsIDB4MDEsIDB4QTIsIDB4RkYsIDB4OEUsIDB4RjMsIDB4NDYsIDB4NDYsIDB4Q0MsIDB4ODQsIDB4RkUsIDB4QTAsIDB4OEUsIDB4RkIsIDB4MDEsIDB4MDcsCisJIDB4RDQsIDB4RkUsIDB4QTMsIDB4RkYsIDB4MEYsIDB4RjAsIDB4QTMsIDB4RkMsIDB4NjQsIDB4NDQsIDB4ODAsIDB4MjYsIDB4MTcsIDB4MDAsIDB4MjUsIDB4NjAsCisJIDB4RjAsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MzIsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsCisJIDB4MDcsIDB4NjAsIDB4MDEsIDB4NjQsIDB4MDQsIDB4MDAsIDB4MDIsIDB4MkEsIDB4MDYsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4MjMsIDB4RkEsCisJIDB4Q0UsIDB4NjAsIDB4NDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0UsIDB4NjAsIDB4MzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4RjAsIDB4RkYsIDB4RkYsCisJIDB4NjQsIDB4NDQsIDB4MDgsIDB4MjYsIDB4MzQsIDB4MDAsIDB4MkEsIDB4RjIsIDB4NjAsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkIsIDB4NjYsIDB4NjMsCisJIDB4QkUsIDB4RDIsIDB4NjgsIDB4RjEsIDB4QTMsIDB4RDIsIDB4RDAsIDB4ODAsIDB4NjcsIDB4RjEsIDB4MEQsIDB4MDIsIDB4QkYsIDB4RDIsIDB4RDAsIDB4ODAsCisJIDB4NjYsIDB4RjEsIDB4MDksIDB4MDIsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDYsIDB4MDIsIDB4MjUsIDB4NjAsIDB4RkMsIDB4NjQsIDB4RTUsIDB4NjAsCisJIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MzIsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDcsIDB4NjAsIDB4MDIsIDB4NjQsCisJIDB4MDQsIDB4MDAsIDB4MDIsIDB4MkEsIDB4MDYsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MjMsIDB4RkEsIDB4Q0UsIDB4NjAsIDB4NDQsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4QjAsIDB4M0EsIDB4MDYsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsCisJIDB4MjMsIDB4RkEsIDB4Q0IsIDB4NjAsIDB4OUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0UsIDB4NjAsIDB4MzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzIsIDB4NDQsCisJIDB4MDEsIDB4MkEsIDB4NEEsIDB4MDAsIDB4MjcsIDB4NjAsIDB4NkEsIDB4NjMsIDB4QkYsIDB4RDMsIDB4MDAsIDB4NjUsIDB4QjQsIDB4ODEsIDB4REIsIDB4ODMsCisJIDB4M0QsIDB4MDMsIDB4QkYsIDB4RDMsIDB4QTMsIDB4RDMsIDB4NDAsIDB4NDgsIDB4QkUsIDB4RDMsIDB4NDAsIDB4NEEsIDB4MkUsIDB4RjAsIDB4NDAsIDB4NEMsCisJIDB4RDAsIDB4ODAsIDB4MkQsIDB4RjAsIDB4MDgsIDB4MDIsIDB4MkEsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MkMsIDB4RjAsIDB4MDQsIDB4MDIsIDB4MjgsIDB4NDQsCisJIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MkIsIDB4MDMsIDB4MzEsIDB4RjAsIDB4MkMsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MzAsIDB4RjAsIDB4MDgsIDB4MDIsCisJIDB4MkEsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MkYsIDB4RjAsIDB4MDQsIDB4MDIsIDB4MjgsIDB4NDQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MUUsIDB4MDMsCisJIDB4MzQsIDB4RjAsIDB4MkMsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MzMsIDB4RjAsIDB4MDgsIDB4MDIsIDB4MkEsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MzIsIDB4RjAsCisJIDB4MDQsIDB4MDIsIDB4MjgsIDB4NDQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MTEsIDB4MDMsIDB4MzgsIDB4RjAsIDB4MkMsIDB4NDQsIDB4RDAsIDB4ODAsCisJIDB4MzcsIDB4RjAsIDB4MDgsIDB4MDIsIDB4MkEsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MzYsIDB4RjAsIDB4MDQsIDB4MDIsIDB4MjgsIDB4NDQsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDMsIDB4RkEsIDB4QTEsIDB4MDYsIDB4QTMsIDB4QjcsIDB4MDMsIDB4QzMsIDB4MDEsIDB4MDcsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4MjMsIDB4RkEsIDB4Q0UsIDB4NjAsIDB4NDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4MEYsIDB4RjAsIDB4NjAsIDB4NDUsIDB4QTQsIDB4MzYsCisJIDB4MDgsIDB4MDAsIDB4MEMsIDB4QjQsIDB4MDQsIDB4MzYsIDB4MDIsIDB4MDAsIDB4MEMsIDB4M0EsIDB4MDYsIDB4MDAsIDB4Q0UsIDB4NjAsIDB4MzgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4Q0MsIDB4NjAsIDB4MzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4RjIsIDB4NTAsIDB4RjEsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0UsCisJIDB4RDAsIDB4ODQsIDB4MUYsIDB4QTQsIDB4MDYsIDB4MEUsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4MDcsIDB4MDAsIDB4QzIsIDB4QTQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODcsIDB4RjgsIDB4QkYsCisJIDB4QzAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MEYsIDB4RjAsIDB4NjUsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MTcsIDB4MDAsIDB4MzIsIDB4NDAsIDB4MDgsIDB4MjYsCisJIDB4MTQsIDB4MDAsIDB4MDcsIDB4RjQsIDB4M0EsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MzcsIDB4QjQsIDB4MjYsIDB4NDYsIDB4MEUsIDB4MDIsIDB4MkMsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDYsIDB4MDAsIDB4MjUsIDB4NjAsIDB4RjYsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsCisJIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4Q0UsIDB4NjAsIDB4MzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4NjQsIDB4NDAsIDB4NjAsIDB4MjYsCisJIDB4MDMsIDB4MDAsIDB4Q0MsIDB4NjAsIDB4MEQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4NDAsIDB4M0EsIDB4RjMsIDB4MDEsIDB4MjUsIDB4NjAsCisJIDB4RUEsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MjcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4M0IsIDB4MDcsIDB4MDAsIDB4MjUsIDB4NjAsIDB4RjgsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsCisJIDB4MDgsIDB4MDAsIDB4MDIsIDB4M0IsIDB4MDYsIDB4MDAsIDB4MjUsIDB4NjAsIDB4RkEsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsCisJIDB4OTcsIDB4RjEsIDB4MkEsIDB4RjIsIDB4MjgsIDB4NDEsIDB4NDAsIDB4QTgsIDB4MDEsIDB4QjEsIDB4MDIsIDB4MDIsIDB4NDMsIDB4MDIsIDB4NkQsIDB4MDAsCisJIDB4NjAsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MEYsIDB4MDAsIDB4MjUsIDB4NjAsIDB4RTgsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsCisJIDB4OTcsIDB4RjEsIDB4MUIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsIDB4MjUsIDB4NjAsIDB4RUUsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsCisJIDB4RDMsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MEYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MjgsIDB4MDAsIDB4MzIsIDB4NDQsCisJIDB4MDIsIDB4MjYsIDB4MjUsIDB4MDAsIDB4MTAsIDB4MkIsIDB4MjYsIDB4MDAsIDB4MjcsIDB4NjAsIDB4NkEsIDB4NjMsIDB4QkYsIDB4RDMsIDB4MkMsIDB4RjAsCisJIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDEsIDB4MEQsIDB4MDMsIDB4NTAsIDB4RkUsIDB4QkQsIDB4RDMsIDB4MkQsIDB4RjAsIDB4RDAsIDB4ODAsIDB4QkQsIDB4RDMsCisJIDB4MkUsIDB4RjAsIDB4RDAsIDB4ODAsIDB4QkQsIDB4RDMsIDB4MkMsIDB4RjAsIDB4RDAsIDB4ODAsIDB4RkEsIDB4QTEsIDB4MTAsIDB4MEMsIDB4RjMsIDB4MDIsCisJIDB4NTAsIDB4RkUsIDB4NjAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4RDAsIDB4ODAsIDB4MkQsIDB4RjAsIDB4MUQsIDB4NjQsIDB4RDAsIDB4ODAsIDB4MkUsIDB4RjAsCisJIDB4MDEsIDB4NjQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MEMsIDB4Q0UsIDB4NjAsIDB4MzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzIsIDB4NDAsCisJIDB4NDAsIDB4MkEsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4NjAsIDB4RUUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzIsIDB4NDAsIDB4NDAsIDB4MjYsIDB4RkEsIDB4MDEsCisJIDB4MkEsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MjAsIDB4MDAsIDB4MzIsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MUQsIDB4MDAsCisJIDB4MDMsIDB4NjcsIDB4QTAsIDB4ODQsIDB4MDAsIDB4MzcsIDB4NjQsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MzcsIDB4NUUsIDB4NjMsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MzcsIDB4NTgsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MDMsIDB4MzcsIDB4MEQsIDB4MDAsIDB4QkQsIDB4RDIsIDB4NjYsIDB4RjEsIDB4QkQsIDB4RDIsCisJIDB4RDAsIDB4ODAsIDB4NjcsIDB4RjEsIDB4MDcsIDB4MDIsIDB4RDAsIDB4ODAsIDB4QkQsIDB4RDIsIDB4NjgsIDB4RjEsIDB4MDMsIDB4MDIsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4Q0UsIDB4NjAsIDB4MzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4ODcsIDB4RjQsIDB4NjAsIDB4NDAsCisJIDB4MDMsIDB4MkIsIDB4MzEsIDB4MDAsIDB4ODgsIDB4RjMsIDB4MDYsIDB4NjEsIDB4NjAsIDB4NDMsIDB4NjYsIDB4NDUsIDB4MzEsIDB4RjAsIDB4NjMsIDB4NDYsCisJIDB4MDUsIDB4RjIsIDB4NjUsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MzAsIDB4RjAsIDB4MEYsIDB4MDIsIDB4NjMsIDB4NDYsIDB4MDQsIDB4RjIsIDB4NjUsIDB4NDYsCisJIDB4RDAsIDB4ODAsIDB4MkYsIDB4RjAsIDB4MDksIDB4MDIsIDB4NjMsIDB4NDYsIDB4MDMsIDB4RjIsIDB4NjUsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDMsIDB4MDIsIDB4RkYsIDB4RkYsIDB4NDgsIDB4RkUsIDB4MDYsIDB4MDAsIDB4Q0QsIDB4ODEsIDB4MDIsIDB4QTMsIDB4RTcsIDB4MDIsIDB4ODcsIDB4RjEsCisJIDB4MDgsIDB4RkUsIDB4NjQsIDB4NDMsIDB4MDMsIDB4MDMsIDB4Q0UsIDB4NjAsIDB4MzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDMsIDB4NDMsIDB4MjMsIDB4NDYsCisJIDB4MDYsIDB4RjAsIDB4MjYsIDB4NDYsIDB4MDcsIDB4NjcsIDB4QTAsIDB4ODQsIDB4MjMsIDB4RkEsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MjYsIDB4MkIsIDB4MDAsCisJIDB4Q0UsIDB4NjAsIDB4MzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4MUIsIDB4MzEsIDB4RjIsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsCisJIDB4NjEsIDB4NDYsIDB4MzEsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MzAsIDB4RjAsCisJIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MkYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4ODcsIDB4RjMsIDB4MDgsIDB4RkUsCisJIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4NDMsIDB4NDMsIDB4MDcsIDB4RkMsIDB4NDMsIDB4NDMsIDB4MUQsIDB4RjAsIDB4QzAsIDB4NjQsIDB4QzAsIDB4ODQsCisJIDB4MEEsIDB4NjAsIDB4N0IsIDB4RjEsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4QzAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4NjMsIDB4NDUsIDB4MkEsIDB4RjIsIDB4MzUsIDB4RjAsIDB4NjAsIDB4NDAsIDB4QTQsIDB4MzYsIDB4MEIsIDB4MDAsIDB4MDgsIDB4MkIsCisJIDB4MEMsIDB4MDAsIDB4MjMsIDB4NDYsIDB4MjYsIDB4RjIsIDB4MjYsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDYsIDB4MDIsIDB4Q0UsIDB4NjAsCisJIDB4MzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0QsIDB4NjAsIDB4RUUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4NDYsIDB4MjIsIDB4RjIsIDB4MjYsIDB4NDYsCisJIDB4NDQsIDB4NEMsIDB4MEYsIDB4MjYsIDB4MTksIDB4MDAsIDB4MDAsIDB4QkMsIDB4NDAsIDB4NDUsIDB4MEIsIDB4MDMsIDB4MDAsIDB4NjQsIDB4MjMsIDB4NDYsCisJIDB4MjIsIDB4RkEsIDB4MjYsIDB4NDYsIDB4QTIsIDB4RkYsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NzIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4RkYsCisJIDB4MjYsIDB4NDYsIDB4MkEsIDB4RjAsIDB4MkMsIDB4NDQsIDB4NjQsIDB4NDAsIDB4MDQsIDB4MjcsIDB4MDYsIDB4MDAsIDB4MjMsIDB4NDYsIDB4MjYsIDB4RkEsCisJIDB4MjYsIDB4NDYsIDB4Q0QsIDB4NjAsIDB4QTUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0YsIDB4RjIsIDB4MDIsIDB4RkEsIDB4QTIsIDB4RkYsIDB4MTYsIDB4RjAsCisJIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDQsIDB4MDEsIDB4MjYsIDB4REMsIDB4OUMsIDB4OTIsIDB4RjMsIDB4MkEsIDB4RjIsIDB4REMsIDB4ODMsIDB4OTIsIDB4RkQsCisJIDB4MDYsIDB4RjQsIDB4MDEsIDB4RjgsIDB4MjYsIDB4NDYsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MTgsIDB4MDAsIDB4NjQsIDB4NDQsIDB4MDAsIDB4NjUsCisJIDB4RkYsIDB4QjQsIDB4RkMsIDB4QTQsIDB4MDYsIDB4RjAsIDB4MDMsIDB4MDMsIDB4NjQsIDB4NDYsIDB4MEMsIDB4MEQsIDB4MDIsIDB4NjUsIDB4MjYsIDB4NDYsCisJIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDMsIDB4NjAsIDB4NDYsIDB4RjksIDB4MDEsIDB4MDEsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4RDQsIDB4ODQsIDB4MDEsIDB4RkEsIDB4NjYsIDB4NDQsIDB4MjYsIDB4NDYsIDB4MDYsIDB4RkEsIDB4MDYsIDB4RjQsIDB4MDAsIDB4RjIsCisJIDB4ODAsIDB4RkMsIDB4NDAsIDB4NDUsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NzIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4RkYsIDB4MjYsIDB4NDYsCisJIDB4MkMsIDB4NDQsIDB4MEYsIDB4MjYsIDB4MEYsIDB4MDAsIDB4MjMsIDB4NDYsIDB4MjYsIDB4RkEsIDB4MjYsIDB4NDQsIDB4MjIsIDB4RkEsIDB4MjYsIDB4NDYsCisJIDB4MDAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4NkUsIDB4MDAsIDB4QTMsIDB4NDYsIDB4MjYsIDB4RjIsIDB4NjAsIDB4NDUsIDB4REMsIDB4ODQsIDB4RDQsIDB4ODAsIDB4MjYsIDB4RkEsCisJIDB4QTMsIDB4NDYsIDB4NkIsIDB4MDIsIDB4MkEsIDB4RjAsIDB4QTMsIDB4NDYsIDB4MjIsIDB4RjIsIDB4QTMsIDB4NDYsIDB4MDAsIDB4QkMsIDB4MDAsIDB4RjIsCisJIDB4MDEsIDB4MDIsIDB4NjMsIDB4MDAsIDB4NDQsIDB4NEMsIDB4M0YsIDB4RjAsIDB4NjAsIDB4NDMsIDB4MjMsIDB4NDYsIDB4MjIsIDB4RjQsIDB4MDksIDB4NjAsCisJIDB4MDAsIDB4NjUsIDB4M0YsIDB4RjIsIDB4MjYsIDB4NDYsIDB4QzAsIDB4ODQsIDB4RDQsIDB4ODAsIDB4NjAsIDB4NDUsIDB4NTYsIDB4MDcsIDB4ODAsIDB4RkMsCisJIDB4MUIsIDB4RjIsIDB4MDYsIDB4RjIsIDB4NjAsIDB4NDEsIDB4MjMsIDB4NDYsIDB4MjIsIDB4RjQsIDB4MUIsIDB4RjAsIDB4MDYsIDB4RjAsIDB4QzEsIDB4ODEsCisJIDB4MDYsIDB4RkEsIDB4MDUsIDB4RkEsIDB4OUIsIDB4RkEsIDB4NjUsIDB4NDQsIDB4M0YsIDB4RkEsIDB4NjQsIDB4NDYsIDB4MDAsIDB4RkMsIDB4NjMsIDB4NDYsCisJIDB4MDEsIDB4RjIsIDB4MTAsIDB4NjEsIDB4RjIsIDB4QTQsIDB4MDEsIDB4RkEsIDB4QzgsIDB4ODMsIDB4MDIsIDB4NjQsIDB4NTksIDB4RDAsIDB4NTgsIDB4RDgsCisJIDB4RkQsIDB4MUYsIDB4MDYsIDB4NDUsIDB4MDAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjUsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QTIsIDB4RkYsIDB4MDAsIDB4RjQsIDB4MDEsIDB4RjAsIDB4MEEsIDB4MTgsIDB4NzAsIDB4NjcsCisJIDB4QTAsIDB4ODAsIDB4RjAsIDB4NjcsIDB4MDYsIDB4MDMsIDB4QzAsIDB4ODQsIDB4MDEsIDB4RkEsIDB4MjUsIDB4NDYsIDB4MjUsIDB4NDQsIDB4ODAsIDB4RkMsCisJIDB4MDUsIDB4RkEsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NzIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDQsIDB4RkUsIDB4QTMsIDB4RkYsIDB4MkMsIDB4NDQsCisJIDB4MDQsIDB4MjcsIDB4MTYsIDB4MDAsIDB4MjMsIDB4NDYsIDB4MjIsIDB4RjIsIDB4QTIsIDB4RkMsIDB4NjAsIDB4NDYsIDB4NDYsIDB4NDYsIDB4M0YsIDB4RjIsCisJIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDcsIDB4MDgsIDB4RkEsIDB4MjYsIDB4NDYsIDB4MkMsIDB4NDMsIDB4MkEsIDB4RkMsIDB4MDYsIDB4RjQsIDB4MDAsIDB4NjQsCisJIDB4MDAsIDB4RkEsIDB4MDEsIDB4RjAsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4MDEsIDB4RkEsIDB4MjYsIDB4NDYsIDB4MUQsIDB4MDAsCisJIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4Q0EsIDB4NjAsIDB4ODEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4NDYsIDB4MjIsIDB4RjAsIDB4QTIsIDB4RkMsCisJIDB4MDAsIDB4NjMsIDB4MzMsIDB4ODUsIDB4QTMsIDB4NDYsIDB4MEQsIDB4MDMsIDB4QTMsIDB4NDYsIDB4MjYsIDB4RjIsIDB4MEYsIDB4NjUsIDB4QTQsIDB4ODUsCisJIDB4RDQsIDB4ODQsIDB4MjYsIDB4RkEsIDB4QTMsIDB4NDYsIDB4QTIsIDB4RkYsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NzIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4QTMsIDB4RkYsIDB4MjYsIDB4NDYsIDB4Q0UsIDB4NjAsIDB4MzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4MzIsIDB4RjAsIDB4NjAsIDB4NDAsCisJIDB4MDgsIDB4MkEsIDB4MjQsIDB4MDAsIDB4MDEsIDB4MkIsIDB4MTMsIDB4MDAsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MTAsIDB4MDAsIDB4MjUsIDB4NjAsCisJIDB4RTgsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MUIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsCisJIDB4MjUsIDB4NjAsIDB4RUUsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4RDMsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MEYsIDB4MDAsIDB4MjUsIDB4NjAsCisJIDB4RTYsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MUIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsCisJIDB4MjUsIDB4NjAsIDB4RUMsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4RDMsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MDcsIDB4RjQsIDB4RkYsIDB4RkYsCisJIDB4MjYsIDB4RjIsIDB4MjYsIDB4NDYsIDB4MEYsIDB4QjQsIDB4REMsIDB4ODUsIDB4MjUsIDB4NjAsIDB4RUEsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsCisJIDB4RDMsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MjcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4M0IsIDB4MDcsIDB4MDAsIDB4MjUsIDB4NjAsCisJIDB4RjgsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MDgsIDB4MDAsIDB4MDIsIDB4M0IsIDB4MDYsIDB4MDAsCisJIDB4MjUsIDB4NjAsIDB4RkEsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MDcsIDB4RjIsIDB4MjYsIDB4RjAsCisJIDB4NDEsIDB4MTgsIDB4NjAsIDB4NDYsIDB4RkYsIDB4NjcsIDB4MjAsIDB4ODgsIDB4NjQsIDB4NUYsIDB4NDAsIDB4NEEsIDB4MTUsIDB4RjAsIDB4MjgsIDB4NDQsCisJIDB4RDAsIDB4ODQsIDB4MDMsIDB4QTQsIDB4MDMsIDB4MEUsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MDQsIDB4MDAsIDB4RkEsIDB4QTQsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODcsIDB4QzAsIDB4QkYsIDB4QzAsIDB4ODQsIDB4MTUsIDB4RkEsIDB4NDAsIDB4NDgsIDB4MTQsIDB4RjAsIDB4MkEsIDB4NDQsIDB4RDAsIDB4ODQsCisJIDB4MUYsIDB4QTQsIDB4MDYsIDB4MEUsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MDcsIDB4MDAsCisJIDB4QzIsIDB4QTQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODcsIDB4RjgsIDB4QkYsIDB4QzAsIDB4ODQsCisJIDB4MTQsIDB4RkEsIDB4MkIsIDB4NjAsIDB4RUMsIDB4NjMsIDB4QkQsIDB4REIsIDB4NjAsIDB4NUMsIDB4MkYsIDB4NjcsIDB4RDAsIDB4ODAsIDB4NjAsIDB4NDUsCisJIDB4MDIsIDB4MjgsIDB4NjQsIDB4NDUsIDB4MjgsIDB4NUMsIDB4QkQsIDB4RDksIDB4OEIsIDB4NjcsIDB4RDAsIDB4ODAsIDB4NjAsIDB4NDEsIDB4MDIsIDB4MjQsCisJIDB4NjQsIDB4NDEsIDB4RDUsIDB4ODQsIDB4ODAsIDB4NjUsIDB4QzQsIDB4ODcsIDB4MDEsIDB4MDUsIDB4MDAsIDB4NjQsIDB4RkYsIDB4QjQsIDB4MEUsIDB4RkEsCisJIDB4QTMsIDB4REIsIDB4MjYsIDB4NDYsIDB4Q0UsIDB4NjAsIDB4N0YsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0EsIDB4NjAsIDB4ODEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MUYsIDB4NjAsIDB4MjAsIDB4NjQsIDB4NDAsIDB4NEIsIDB4RjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsCisJIDB4NDYsIDB4NDYsIDB4Q0EsIDB4NjAsIDB4ODEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsIDB4MDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsCisJIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RjgsIDB4RkUsIDB4MDAsIDB4NjYsCisJIDB4NDYsIDB4NDYsIDB4Q0EsIDB4NjAsIDB4ODEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4NTgsIDB4NjMsIDB4NjAsIDB4NDcsIDB4MDEsIDB4MjcsCisJIDB4NjQsIDB4NjMsIDB4NjEsIDB4NUMsIDB4MTgsIDB4NjAsIDB4MEYsIDB4RjksIDB4QkQsIDB4RDAsIDB4QkQsIDB4RDAsIDB4NjQsIDB4NDUsIDB4NjQsIDB4NDEsCisJIDB4QkQsIDB4RDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4RjgsIDB4ODMsIDB4RkEsIDB4ODIsIDB4RjgsIDB4QTYsIDB4NDYsIDB4MDIsIDB4QjAsIDB4NUUsIDB4NjMsCisJIDB4MDQsIDB4MDMsIDB4NjQsIDB4NjMsIDB4MDMsIDB4QjAsIDB4MDIsIDB4M0EsIDB4NkMsIDB4NjMsIDB4M0YsIDB4RjIsIDB4QkQsIDB4RDAsIDB4QkQsIDB4RDAsCisJIDB4NjQsIDB4NDUsIDB4NjQsIDB4NDEsIDB4QkQsIDB4RDAsIDB4QTYsIDB4NDYsIDB4MDcsIDB4RjgsIDB4ODYsIDB4RkEsIDB4ODUsIDB4RjgsIDB4NjAsIDB4NDcsCisJIDB4MDgsIDB4RkEsIDB4MTgsIDB4NjAsIDB4MEYsIDB4RjEsIDB4MjYsIDB4NDYsIDB4NjQsIDB4NDEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsCisJIDB4MkMsIDB4RjAsIDB4MzEsIDB4NDAsIDB4MjAsIDB4MjYsIDB4MDksIDB4MDAsIDB4NjAsIDB4NDAsIDB4QTQsIDB4MzYsIDB4MjEsIDB4MDAsIDB4MDgsIDB4MjYsCisJIDB4MDcsIDB4MDAsIDB4N0QsIDB4RjEsIDB4Q0YsIDB4NjAsIDB4NDcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4NjAsIDB4NzcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MTIsIDB4MDAsIDB4M0YsIDB4RjAsIDB4MzIsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MEEsIDB4MDAsIDB4NjQsIDB4NDEsCisJIDB4NjAsIDB4NDAsIDB4NDAsIDB4MjcsIDB4MDYsIDB4MDAsIDB4Q0QsIDB4ODEsIDB4REQsIDB4ODEsIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDMsIDB4MDEsIDB4NjEsCisJIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjEsIDB4NjAsIDB4NDAsIDB4MTgsIDB4M0EsIDB4MDMsIDB4MDAsIDB4Q0YsIDB4NjAsIDB4QzksIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDcsIDB4RjIsIDB4ODcsIDB4RjEsIDB4NjYsIDB4NDUsIDB4RDAsIDB4ODAsIDB4NjAsIDB4NDYsIDB4MDYsIDB4RjIsIDB4NjUsIDB4NDYsIDB4MDMsIDB4MDMsCisJIDB4RkYsIDB4RkYsIDB4MDIsIDB4MjYsIDB4MDcsIDB4MDAsIDB4REQsIDB4NjAsIDB4NTgsIDB4NEYsIDB4OTAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4NjAsCisJIDB4QzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4QTQsIDB4M0EsIDB4MDcsIDB4MDAsIDB4REYsIDB4NjAsCisJIDB4NTgsIDB4NEYsIDB4RTMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4NjAsIDB4QzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4Q0UsIDB4NjAsCisJIDB4NTgsIDB4NEYsIDB4NTQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0YsIDB4RjIsIDB4MDYsIDB4NjUsIDB4RDQsIDB4ODAsIDB4NjAsIDB4NDMsIDB4NUIsIDB4MDQsCisJIDB4MDAsIDB4RjQsIDB4QUEsIDB4NjAsIDB4QUEsIDB4NjUsIDB4MDksIDB4RjIsIDB4MEEsIDB4RjAsIDB4RDQsIDB4ODAsIDB4MDMsIDB4NjQsIDB4NTMsIDB4MDIsCisJIDB4RDAsIDB4ODAsIDB4MDAsIDB4NjQsIDB4MEIsIDB4RjAsIDB4NEYsIDB4MDIsIDB4NjQsIDB4NDUsIDB4RDQsIDB4ODAsIDB4RjgsIDB4N0YsIDB4MDgsIDB4MDIsCisJIDB4MEMsIDB4RjAsIDB4MjYsIDB4NDYsIDB4NjQsIDB4NDUsIDB4MjMsIDB4RjAsIDB4MjAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4MEIsIDB4MDAsCisJIDB4RDQsIDB4ODAsIDB4MUQsIDB4NjAsIDB4NjAsIDB4NjQsIDB4MTEsIDB4MDIsIDB4MEMsIDB4RjAsIDB4MjYsIDB4NDYsIDB4NjQsIDB4NDUsIDB4MjMsIDB4RjAsCisJIDB4NDAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4NjUsIDB4NDQsIDB4ODgsIDB4M0EsIDB4MzUsIDB4MDAsIDB4NzcsIDB4MzcsIDB4MDMsIDB4MDAsCisJIDB4NzgsIDB4MzcsIDB4MDEsIDB4MDAsIDB4OEUsIDB4MzcsIDB4MDAsIDB4NjEsIDB4MkUsIDB4MDAsIDB4RDQsIDB4ODAsIDB4MDgsIDB4NjUsIDB4MkIsIDB4MDIsCisJIDB4RDcsIDB4ODAsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MEMsIDB4RjAsIDB4MjYsIDB4MDQsIDB4RDAsIDB4ODAsIDB4MEQsIDB4RjAsIDB4MjMsIDB4MDIsCisJIDB4MjYsIDB4NDYsIDB4MTQsIDB4RjIsIDB4MDEsIDB4NjMsIDB4MDIsIDB4QTgsIDB4NjQsIDB4NDcsIDB4MUQsIDB4MDMsIDB4N0YsIDB4QjQsIDB4RkQsIDB4QTAsCisJIDB4MDYsIDB4MDMsIDB4MTksIDB4MDcsIDB4MjMsIDB4RjAsIDB4NjAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4NkIsIDB4MDAsIDB4MjYsIDB4NDYsCisJIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDcsIDB4MDAsIDB4NjAsIDB4NDAsIDB4NDgsIDB4MzYsIDB4MDQsIDB4MDAsCisJIDB4RDIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsIDB4RDIsIDB4RkIsIDB4RTgsIDB4NjAsIDB4NTgsIDB4NEYsIDB4RUYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4Q0YsIDB4NjAsIDB4QzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4NjEsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDksIDB4MDAsIDB4MjUsIDB4NjAsCisJIDB4RkUsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4Q0YsIDB4NjAsIDB4QzksIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4REYsIDB4NjAsIDB4NTgsIDB4NEYsIDB4RTMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NDgsIDB4MzYsCisJIDB4ODgsIDB4MDAsIDB4Q0YsIDB4NjAsIDB4RDYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4NjAsIDB4QzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsCisJIDB4MEMsIDB4MjYsIDB4N0YsIDB4MDAsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4N0MsIDB4MDAsIDB4QjAsIDB4M0EsIDB4MDUsIDB4MDAsIDB4RDQsIDB4NjAsCisJIDB4NTgsIDB4NEYsIDB4NUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NzEsIDB4MDAsIDB4MDAsIDB4M0EsIDB4MDUsIDB4MDAsIDB4RDcsIDB4NjAsIDB4NTgsIDB4NEYsCisJIDB4Q0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NkEsIDB4MDAsIDB4MjAsIDB4M0EsIDB4MDUsIDB4MDAsIDB4RDcsIDB4NjAsIDB4NTgsIDB4NEYsIDB4Q0EsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NjMsIDB4MDAsIDB4QzAsIDB4M0EsIDB4MDUsIDB4MDAsIDB4REMsIDB4NjAsIDB4NTgsIDB4NEYsIDB4RkUsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NUMsIDB4MDAsIDB4QTAsIDB4M0EsIDB4MDUsIDB4MDAsIDB4REQsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTUsIDB4MDAsCisJIDB4NDAsIDB4M0EsIDB4MEQsIDB4MDAsIDB4RTMsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NEUsIDB4MDAsIDB4NjAsIDB4NDAsCisJIDB4NTAsIDB4M0EsIDB4MDUsIDB4MDAsIDB4RUQsIDB4NjAsIDB4NTgsIDB4NEYsIDB4RUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDYsIDB4MDAsIDB4Q0YsIDB4NjAsCisJIDB4QzksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDcsIDB4MDAsCisJIDB4NjAsIDB4NDAsIDB4NDgsIDB4MzYsIDB4MDQsIDB4MDAsIDB4RDIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsIDB4RDIsIDB4RkIsIDB4MkEsIDB4RjIsCisJIDB4M0IsIDB4RjAsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDQsIDB4MDAsIDB4NjQsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MDEsIDB4MDAsIDB4MDMsIDB4MDAsCisJIDB4Q0YsIDB4NjAsIDB4QjksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4QjQsIDB4RkYsIDB4RkYsIDB4RjgsIDB4MDMsCisJIDB4MjMsIDB4RjIsIDB4MDcsIDB4RjQsIDB4QkIsIDB4RjAsIDB4MjYsIDB4NDYsIDB4QTQsIDB4ODQsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MkYsIDB4MjYsCisJIDB4MjAsIDB4MDAsIDB4QzksIDB4NjAsIDB4NTgsIDB4NEYsIDB4Q0YsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MTgsIDB4MzYsIDB4MDksIDB4MDAsCisJIDB4MDQsIDB4NjUsIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4Q0YsIDB4NjAsIDB4QzksIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsIDB4MDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RjgsIDB4RkUsIDB4MEMsIDB4MDAsIDB4NjYsIDB4NDQsIDB4MDAsIDB4QTgsIDB4RkYsIDB4RkYsCisJIDB4MEEsIDB4MDMsIDB4MjYsIDB4NDYsIDB4MUYsIDB4NjAsIDB4MjAsIDB4NjQsIDB4NDAsIDB4NEIsIDB4RjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4Q0UsIDB4NjAsIDB4MzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTQsIDB4RjIsIDB4MDAsIDB4N0MsCisJIDB4M0UsIDB4RjgsIDB4Q0MsIDB4ODQsIDB4Q0MsIDB4ODQsIDB4MTgsIDB4MDMsIDB4NUMsIDB4MDIsIDB4MTEsIDB4RjIsIDB4MDcsIDB4RkEsIDB4QUIsIDB4RjMsCisJIDB4MTksIDB4RkEsIDB4RDAsIDB4NjAsIDB4NTgsIDB4NEUsIDB4ODYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUUsIDB4NjAsIDB4RTAsIDB4NjQsIDB4MEYsIDB4NjAsCisJIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzgsIDB4RkUsCisJIDB4RjIsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NEEsIDB4REIsIDB4OEQsIDB4MDAsIDB4QTIsIDB4RkYsIDB4NDYsIDB4NDUsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4QkIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4RkYsIDB4MTEsIDB4MDMsIDB4N0UsIDB4NjMsIDB4NDYsIDB4NEIsIDB4MjUsIDB4NDYsIDB4QTMsIDB4RDAsCisJIDB4MkIsIDB4NDYsIDB4QTMsIDB4RDgsIDB4RkIsIDB4MUYsIDB4ODksIDB4RkMsIDB4OEEsIDB4RkMsIDB4ODgsIDB4RkMsIDB4MDUsIDB4MTgsIDB4NjQsIDB4NDYsCisJIDB4MDEsIDB4RjAsIDB4MTAsIDB4NjcsIDB4QzAsIDB4ODQsIDB4MDEsIDB4RkEsIDB4MDgsIDB4RkUsIDB4MkIsIDB4NDYsIDB4NDYsIDB4NDYsIDB4MjUsIDB4NDYsCisJIDB4RDAsIDB4NjAsIDB4NTgsIDB4NEUsIDB4ODYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTMsIDB4NjAsIDB4NDMsIDB4RjMsIDB4ODcsIDB4RjMsIDB4MDAsIDB4QTgsCisJIDB4MDcsIDB4RkEsIDB4MEUsIDB4MDMsIDB4MUUsIDB4NjAsIDB4REEsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjUsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RjMsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NEEsIDB4REIsIDB4MEQsIDB4MDAsCisJIDB4MUUsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjUsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RjQsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NEEsIDB4REIsIDB4MjYsIDB4NDQsIDB4MDAsIDB4QTgsIDB4QzEsIDB4RkUsCisJIDB4NDgsIDB4MDMsIDB4MjYsIDB4NDYsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDcsIDB4MDAsIDB4NjAsIDB4NDAsCisJIDB4NDgsIDB4MzYsIDB4MDQsIDB4MDAsIDB4RDIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsIDB4RDIsIDB4RkIsIDB4MjYsIDB4NDYsIDB4MkEsIDB4RjIsCisJIDB4M0IsIDB4RjAsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDYsIDB4MDAsIDB4QzAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4NjQsIDB4NDAsIDB4MjAsIDB4MkIsCisJIDB4MDEsIDB4MDAsIDB4MDMsIDB4MDAsIDB4RDAsIDB4NjAsIDB4NzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4QjQsCisJIDB4RkYsIDB4RkYsIDB4RjgsIDB4MDMsIDB4MjMsIDB4RjIsIDB4MDcsIDB4RjQsIDB4QkIsIDB4RjAsIDB4MjYsIDB4NDYsIDB4QTQsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4MkYsIDB4MjYsIDB4MDcsIDB4MDAsIDB4QzksIDB4NjAsIDB4NTgsIDB4NEYsIDB4Q0YsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsCisJIDB4MTgsIDB4MzYsIDB4MDksIDB4MDAsIDB4MDQsIDB4NjUsIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsCisJIDB4Q0YsIDB4NjAsIDB4QzksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsIDB4MDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RjgsIDB4RkUsIDB4RjEsIDB4NjQsIDB4M0IsIDB4NDIsCisJIDB4NEEsIDB4REIsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4Q0YsIDB4NjAsIDB4QzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4ODIsIDB4NjAsCisJIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODcsIDB4MDIsIDB4QkYsIDB4MkEsIDB4RkEsIDB4MUMsIDB4RjIsIDB4MTMsIDB4RkEsIDB4MzIsIDB4RjIsIDB4MkMsIDB4RkEsCisJIDB4MzMsIDB4RjIsIDB4MkQsIDB4RkEsIDB4MzQsIDB4RjIsIDB4MkUsIDB4RkEsIDB4MkYsIDB4RjIsIDB4MzIsIDB4RkEsIDB4MzAsIDB4RjIsIDB4MzMsIDB4RkEsCisJIDB4MzEsIDB4RjIsIDB4MzQsIDB4RkEsIDB4NjYsIDB4RjMsIDB4MkYsIDB4RkEsIDB4NjcsIDB4RjMsIDB4MzAsIDB4RkEsIDB4NjgsIDB4RjMsIDB4MzEsIDB4RkEsCisJIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RDMsIDB4NjAsIDB4NTksIDB4NjQsIDB4MDgsIDB4NjAsIDB4MjYsIDB4RkIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4QjEsIDB4RjMsIDB4MTIsIDB4NjAsIDB4MkMsIDB4NjMsIDB4RjcsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDYsIDB4MDAsIDB4NjQsIDB4QjEsIDB4RkIsCisJIDB4QjEsIDB4RjMsIDB4QjEsIDB4RkIsIDB4MDEsIDB4QTQsIDB4Q0MsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDMsIDB4MkEsIDB4QTMsIDB4RkIsIDB4MDEsCisJIDB4NjMsIDB4NDYsIDB4MTAsIDB4NjAsIDB4QTYsIDB4NjMsIDB4MEUsIDB4NjEsIDB4NjAsIDB4RkUsIDB4QTYsIDB4RDEsIDB4REUsIDB4ODYsIDB4MDEsIDB4NjQsCisJIDB4NjQsIDB4NDAsIDB4N0YsIDB4MzYsIDB4MDAsIDB4NjQsIDB4QTMsIDB4REIsIDB4REIsIDB4ODMsIDB4QTMsIDB4RDksIDB4Q0QsIDB4ODEsIDB4MDQsIDB4QTMsCisJIDB4RjQsIDB4MDIsIDB4MTEsIDB4NjAsIDB4MTYsIDB4NjMsIDB4MUMsIDB4NjEsIDB4QTYsIDB4RDEsIDB4REUsIDB4ODYsIDB4MDEsIDB4NjQsIDB4NjQsIDB4NDAsCisJIDB4N0YsIDB4MzYsIDB4MDAsIDB4NjQsIDB4QTMsIDB4REIsIDB4REIsIDB4ODMsIDB4QTMsIDB4RDksIDB4Q0QsIDB4ODEsIDB4MDYsIDB4QTMsIDB4RjQsIDB4MDIsCisJIDB4MjAsIDB4RkUsIDB4MTMsIDB4NjAsIDB4N0YsIDB4RjMsIDB4MTMsIDB4NjAsIDB4MkQsIDB4RkIsIDB4MUUsIDB4NjMsIDB4MjYsIDB4NjAsIDB4NjQsIDB4NjEsCisJIDB4MjcsIDB4NjAsIDB4MDgsIDB4NjQsIDB4NTgsIDB4RDEsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4MTMsIDB4NjAsIDB4OTUsIDB4RjMsIDB4MTMsIDB4NjAsCisJIDB4NDMsIDB4RkIsIDB4MTMsIDB4NjAsIDB4OTYsIDB4RjMsIDB4MTMsIDB4NjAsIDB4NDQsIDB4RkIsIDB4MTMsIDB4NjAsIDB4OUMsIDB4RjMsIDB4MTMsIDB4NjAsCisJIDB4NEEsIDB4RkIsIDB4MTMsIDB4NjAsIDB4OUQsIDB4RjMsIDB4MTMsIDB4NjAsIDB4NEIsIDB4RkIsIDB4MTMsIDB4NjAsIDB4OUUsIDB4RjMsIDB4MTMsIDB4NjAsCisJIDB4NEMsIDB4RkIsIDB4MTMsIDB4NjAsIDB4OUYsIDB4RjMsIDB4MTMsIDB4NjAsIDB4NEQsIDB4RkIsIDB4MTMsIDB4NjAsIDB4OTcsIDB4RjMsIDB4MTMsIDB4NjAsCisJIDB4NDUsIDB4RkIsIDB4MTMsIDB4NjAsIDB4OTgsIDB4RjMsIDB4MTMsIDB4NjAsIDB4NDYsIDB4RkIsIDB4MTMsIDB4NjAsIDB4OTksIDB4RjMsIDB4MTMsIDB4NjAsCisJIDB4NDcsIDB4RkIsIDB4MjYsIDB4NjAsIDB4QjAsIDB4NjMsIDB4QkQsIDB4RDEsIDB4Q0IsIDB4RjksIDB4NjYsIDB4RjksIDB4QkQsIDB4RDEsIDB4Q0MsIDB4RjksCisJIDB4NjcsIDB4RjksIDB4QTMsIDB4RDEsIDB4Q0QsIDB4RjksIDB4NjgsIDB4RjksIDB4MDEsIDB4NjQsIDB4NkEsIDB4RkIsIDB4MTMsIDB4NjAsIDB4NTEsIDB4RjMsCisJIDB4QzQsIDB4RkIsIDB4MDAsIDB4NjMsIDB4NEEsIDB4RkQsIDB4NUEsIDB4RkQsIDB4NkIsIDB4RkQsIDB4NkMsIDB4RkQsIDB4MTMsIDB4NjAsIDB4NDUsIDB4RjMsCisJIDB4MTUsIDB4NjAsIDB4Q0IsIDB4RjEsIDB4RkYsIDB4NjAsIDB4RTcsIDB4NjUsIDB4MzIsIDB4NDEsIDB4QTUsIDB4ODEsIDB4RkYsIDB4QTAsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MDMsIDB4MDYsIDB4MDAsIDB4MTMsIDB4NjAsIDB4NDcsIDB4RjMsIDB4MDgsIDB4QjksIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MTAsIDB4QjksCisJIDB4NDEsIDB4NTIsIDB4ODcsIDB4RjUsIDB4MzIsIDB4NDQsIDB4MTAsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MEEsIDB4MDMsIDB4MTQsIDB4NjAsIDB4MTUsIDB4RjMsCisJIDB4MDYsIDB4RjAsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4ODAsIDB4QkYsIDB4QjAsIDB4ODQsIDB4MDYsIDB4RkEsCisJIDB4MTMsIDB4NjAsIDB4NDUsIDB4RjMsIDB4MjIsIDB4N0MsIDB4RkYsIDB4QTAsIDB4RkQsIDB4QTAsIDB4MDUsIDB4MDYsIDB4MDMsIDB4MDMsIDB4RkUsIDB4QTAsCisJIDB4MDQsIDB4N0MsIDB4MDEsIDB4MDIsIDB4M0EsIDB4RjgsIDB4MTMsIDB4NjAsIDB4NEMsIDB4RjEsIDB4MjAsIDB4NDQsIDB4MjAsIDB4QjUsIDB4NjQsIDB4NDEsCisJIDB4MDAsIDB4QjksIDB4RDQsIDB4ODQsIDB4MDgsIDB4MjgsIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4MTUsIDB4NjAsIDB4Q0IsIDB4RjMsIDB4MzAsIDB4NjAsCisJIDB4MEUsIDB4NjMsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsIDB4MDIsIDB4QjUsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsIDB4MDMsIDB4QjQsCisJIDB4NjUsIDB4NUMsIDB4QTMsIDB4RDksIDB4MDIsIDB4QTgsIDB4MTgsIDB4NjAsIDB4MDgsIDB4RkIsIDB4MTUsIDB4MDIsIDB4MDAsIDB4NjAsIDB4QzgsIDB4NjQsCisJIDB4MTgsIDB4NjAsIDB4MDksIDB4RkIsIDB4MTgsIDB4NjAsIDB4MEQsIDB4RkIsIDB4MDcsIDB4NjAsIDB4RDAsIDB4NjQsIDB4MTgsIDB4NjAsIDB4MEEsIDB4RkIsCisJIDB4MTgsIDB4NjAsIDB4MEUsIDB4RkIsIDB4MDEsIDB4NjAsIDB4OTAsIDB4NjQsIDB4MTgsIDB4NjAsIDB4MEIsIDB4RkIsIDB4MDAsIDB4NjAsIDB4NjQsIDB4NjQsCisJIDB4MTgsIDB4NjAsIDB4MEMsIDB4RkIsIDB4MDYsIDB4MDAsIDB4NjQsIDB4NjQsIDB4MTgsIDB4NjAsIDB4MEIsIDB4RkIsIDB4NjQsIDB4NjQsIDB4MTgsIDB4NjAsCisJIDB4MEMsIDB4RkIsIDB4QjEsIDB4RjEsIDB4MTAsIDB4NjAsIDB4QTAsIDB4NjMsIDB4MkYsIDB4MTgsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MTIsIDB4MDAsCisJIDB4Q0MsIDB4ODQsIDB4MDYsIDB4QTMsIDB4RkQsIDB4MDIsIDB4QTMsIDB4RDMsIDB4MTAsIDB4NjAsIDB4QTYsIDB4NjMsIDB4MjUsIDB4MUIsIDB4MTAsIDB4NjAsCisJIDB4RjgsIDB4NjUsIDB4QTMsIDB4RDMsIDB4MDYsIDB4QTMsIDB4RDcsIDB4ODAsIDB4MDIsIDB4MUIsIDB4RkIsIDB4MDQsIDB4MUQsIDB4MDAsIDB4RjgsIDB4QTMsCisJIDB4QTMsIDB4RDMsIDB4MTgsIDB4MDAsIDB4MTEsIDB4NjAsIDB4MTQsIDB4NjMsIDB4MTEsIDB4NjAsIDB4RjQsIDB4NjUsIDB4QTMsIDB4RDEsIDB4MDgsIDB4QTMsCisJIDB4RDAsIDB4ODAsIDB4RDcsIDB4ODAsIDB4MDIsIDB4MDMsIDB4RkEsIDB4MDQsIDB4MEYsIDB4MDAsIDB4RkEsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MTEsIDB4NjAsCisJIDB4MTYsIDB4NjMsIDB4MEEsIDB4MUIsIDB4QTMsIDB4RDMsIDB4MDgsIDB4QTMsIDB4RDcsIDB4ODAsIDB4MDIsIDB4MUIsIDB4RkIsIDB4MDQsIDB4MDQsIDB4MDAsCisJIDB4RjYsIDB4QTMsIDB4QTMsIDB4RDMsIDB4QzUsIDB4RkIsIDB4NjQsIDB4RkIsIDB4MjcsIDB4NjAsIDB4MzQsIDB4NjQsIDB4MjYsIDB4NjAsIDB4OTAsIDB4NjMsCisJIDB4QTAsIDB4RDEsIDB4QTMsIDB4RDksIDB4NjQsIDB4NDEsIDB4NTgsIDB4RDEsIDB4NUIsIDB4RDksIDB4NjQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MkIsIDB4MDMsIDB4MDAsIDB4RDEsIDB4NjAsIDB4RTksIDB4NzgsIDB4RkYsIDB4RkYsIDB4OTEsIDB4RkEsIDB4NjEsIDB4NDQsIDB4RUYsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4QUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTIsIDB4RkEsIDB4MTUsIDB4NjAsIDB4QkMsIDB4RjMsIDB4M0YsIDB4NDAsIDB4MDEsIDB4MjcsCisJIDB4MDgsIDB4MDAsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsIDB4RUUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDYsIDB4MDAsIDB4MEYsIDB4NjUsIDB4QTQsIDB4ODQsIDB4RUUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjUsCisJIDB4RUUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QzYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MTAsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTUsIDB4MDAsIDB4MTEsIDB4RjgsIDB4NjQsIDB4NDQsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTIsIDB4RkEsCisJIDB4MTUsIDB4NjAsIDB4QkQsIDB4RjMsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsIDB4RUUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjUsIDB4RUUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QzYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QjUsIDB4RjEsIDB4MDksIDB4NjAsCisJIDB4MkEsIDB4NjQsIDB4RDAsIDB4ODAsIDB4MDMsIDB4NjQsIDB4MDEsIDB4MDYsIDB4MDYsIDB4NjQsIDB4QUUsIDB4RkIsIDB4NDYsIDB4NDgsIDB4QzMsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDUsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MTQsIDB4NjAsIDB4MDAsIDB4NjYsIDB4MTEsIDB4MDAsIDB4MDQsIDB4M0EsCisJIDB4MDMsIDB4MDAsIDB4MTMsIDB4NjAsIDB4RjQsIDB4NjYsIDB4MEMsIDB4MDAsIDB4MDMsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MTMsIDB4NjAsIDB4RTgsIDB4NjYsCisJIDB4MDcsIDB4MDAsIDB4MDIsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MTMsIDB4NjAsIDB4REMsIDB4NjYsIDB4MDIsIDB4MDAsIDB4MTMsIDB4NjAsIDB4RDAsIDB4NjYsCisJIDB4NjAsIDB4RkUsIDB4QTYsIDB4RDMsIDB4REUsIDB4ODYsIDB4MTAsIDB4NjAsIDB4NUYsIDB4RkIsIDB4QTYsIDB4RDMsIDB4REUsIDB4ODYsIDB4MjEsIDB4NjAsCisJIDB4MkYsIDB4NjMsIDB4QTMsIDB4REIsIDB4MjEsIDB4NjAsIDB4QTcsIDB4NjMsIDB4QTMsIDB4REIsIDB4QTYsIDB4RDMsIDB4REUsIDB4ODYsIDB4MTAsIDB4NjAsCisJIDB4NUUsIDB4RkIsIDB4QTYsIDB4RDMsIDB4REUsIDB4ODYsIDB4MjAsIDB4NjAsIDB4QkYsIDB4NjMsIDB4QTMsIDB4REIsIDB4MjAsIDB4RkUsIDB4QTYsIDB4RDMsCisJIDB4REEsIDB4ODYsIDB4NjAsIDB4NDMsIDB4MUYsIDB4QjMsIDB4NjMsIDB4NUMsIDB4MUYsIDB4NjAsIDB4MDAsIDB4QjQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4QjAsIDB4ODUsIDB4MTAsIDB4NjAsIDB4OTUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkMsIDB4NjAsIDB4MDAsIDB4QjQsIDB4QjQsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsIDB4RDEsIDB4RkIsIDB4MjEsIDB4NjAsIDB4Q0EsIDB4NjMsIDB4QTMsIDB4RDMsIDB4QTYsIDB4RDEsIDB4REUsIDB4ODYsCisJIDB4ODAsIDB4NjAsIDB4N0YsIDB4QjUsIDB4NjQsIDB4NDQsIDB4RTgsIDB4ODQsIDB4N0YsIDB4NjAsIDB4ODAsIDB4QjQsIDB4QjQsIDB4ODQsIDB4QTMsIDB4REIsCisJIDB4NjAsIDB4RkUsIDB4QTYsIDB4RDMsIDB4REUsIDB4ODYsIDB4MTAsIDB4NjAsIDB4NjIsIDB4RkIsIDB4MjAsIDB4RkUsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEEsIDB4MDQsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsCisJIDB4RDIsIDB4NjAsIDB4NUUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjQsIDB4RjEsIDB4MEYsIDB4NjAsCisJIDB4OUQsIDB4RjksIDB4MEMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MjAsIDB4NDQsIDB4MDEsIDB4NjUsIDB4MzQsIDB4ODAsCisJIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RDIsIDB4NjAsIDB4ODIsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjQsIDB4RjEsIDB4MEYsIDB4NjAsCisJIDB4OUQsIDB4RjksIDB4MEUsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MTYsIDB4RkIsIDB4RDIsIDB4NjAsIDB4OTcsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsCisJIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4QkUsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MTEsIDB4RjEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4QkUsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MTEsIDB4RjEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MjAsIDB4NDAsIDB4MjAsIDB4MkEsIDB4MDQsIDB4MDAsIDB4RjAsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4NjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzYsIDB4NDAsIDB4MDgsIDB4M0EsIDB4NkEsIDB4MDAsIDB4MzYsIDB4NDAsIDB4MDgsIDB4M0EsIDB4MDUsIDB4MDAsCisJIDB4MTAsIDB4NjAsIDB4NDIsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDQsIDB4MDAsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4NEUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MUQsIDB4MUIsIDB4MTMsIDB4NjAsIDB4NTQsIDB4RjMsIDB4QzcsIDB4RkIsIDB4MjYsIDB4NjAsCisJIDB4MTYsIDB4NjUsIDB4MjYsIDB4NjAsIDB4QjgsIDB4NjEsIDB4MjYsIDB4NjAsIDB4MTQsIDB4NjQsIDB4MjAsIDB4NjMsIDB4NTksIDB4RDEsIDB4NTgsIDB4RDksCisJIDB4QTUsIDB4RDksIDB4REEsIDB4ODUsIDB4RkIsIDB4MUYsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MjIsIDB4RkIsIDB4RDMsIDB4NjAsCisJIDB4M0MsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MzYsIDB4NDAsIDB4MDgsIDB4M0EsIDB4NDEsIDB4MDAsIDB4RTcsIDB4NjAsIDB4QzUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjcsIDB4NjAsIDB4M0UsIDB4NjMsIDB4NjAsIDB4NDEsIDB4MDAsIDB4NjIsIDB4Q0QsIDB4ODEsIDB4MDQsIDB4QTIsIDB4RkQsIDB4MDIsCisJIDB4MkMsIDB4NjAsIDB4M0UsIDB4NjEsIDB4RkMsIDB4QTIsIDB4NjIsIDB4NDUsIDB4QzUsIDB4ODEsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODUsIDB4QzQsIDB4ODUsCisJIDB4QzcsIDB4ODMsIDB4RkUsIDB4QTUsIDB4ODgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QzQsIDB4ODQsIDB4NjYsIDB4NDUsIDB4NjAsIDB4NDYsIDB4QkQsIDB4RDEsCisJIDB4MDMsIDB4RjgsIDB4QkQsIDB4RDEsIDB4MDQsIDB4RjgsIDB4QTMsIDB4RDEsIDB4MDUsIDB4RjgsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDIsIDB4N0UsCisJIDB4MDYsIDB4RkEsIDB4NjQsIDB4RjMsIDB4NjEsIDB4NDMsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MDIsIDB4QTMsIDB4QTMsIDB4RDEsIDB4MEYsIDB4RjgsCisJIDB4MTYsIDB4NjQsIDB4MTIsIDB4RkEsIDB4MDEsIDB4NjQsIDB4MTEsIDB4RkEsIDB4NjYsIDB4NUMsIDB4QzEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OTMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDMsIDB4MzIsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MEEsIDB4MDAsIDB4MTQsIDB4NjAsIDB4MTUsIDB4RjMsIDB4MDYsIDB4RjAsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4ODAsIDB4QkYsIDB4QjAsIDB4ODQsIDB4MDYsIDB4RkEsIDB4QzUsIDB4RkUsCisJIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjAsIDB4MzAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsCisJIDB4RDIsIDB4NjAsIDB4QjUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjAsIDB4MDMsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MjIsIDB4RkIsIDB4RDIsIDB4NjAsIDB4QjUsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4NDIsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MEYsIDB4NEUsIDB4RTEsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QTksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NEYsIDB4MEYsIDB4NEUsIDB4REYsIDB4NjAsCisJIDB4NTgsIDB4NEYsIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NEYsIDB4MEYsIDB4NEUsIDB4REUsIDB4NjAsIDB4NTgsIDB4NEYsIDB4OUEsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEUsIDB4NEYsIDB4MEYsIDB4NEUsIDB4REQsIDB4NjAsIDB4NTgsIDB4NEYsIDB4RkIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NEYsCisJIDB4RDUsIDB4MDEsIDB4NEUsIDB4RjMsIDB4N0QsIDB4RjUsIDB4NjAsIDB4NDAsIDB4RkYsIDB4MjIsIDB4MEEsIDB4MDAsIDB4ODgsIDB4RjEsIDB4Q0MsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4QzAsIDB4ODYsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsIDB4N0QsIDB4RjUsIDB4MDcsIDB4MDAsCisJIDB4MDgsIDB4NjAsIDB4MjQsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MTEsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4NEUsIDB4RjMsCisJIDB4NjYsIDB4NDAsIDB4RkYsIDB4MjIsIDB4MDUsIDB4MDAsIDB4RkYsIDB4MjIsIDB4MzksIDB4MDAsIDB4RDQsIDB4NjAsIDB4MEMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4NjQsIDB4NjksIDB4RkIsIDB4RkYsIDB4RkYsIDB4QzEsIDB4RkUsIDB4NjksIDB4RjMsIDB4MDAsIDB4NjUsIDB4RDQsIDB4ODAsIDB4NEUsIDB4RjMsCisJIDB4MEUsIDB4MDMsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MTYsIDB4RkIsIDB4RDMsIDB4NjAsIDB4N0MsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsCisJIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEEsIDB4MDQsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MTYsIDB4RkIsIDB4RDMsIDB4NjAsIDB4OEYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RDMsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4RkUsIDB4QjQsIDB4RDMsIDB4RkIsIDB4MUYsIDB4NjAsIDB4M0EsIDB4NjIsIDB4MDYsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkQsIDB4RkYsIDB4MjAsIDB4NDQsIDB4MDEsIDB4QjUsIDB4NTQsIDB4ODAsIDB4REEsIDB4RkUsIDB4QkUsIDB4RkUsIDB4ODcsIDB4RjEsIDB4MDIsIDB4NjQsCisJIDB4ODYsIDB4RjMsIDB4QzAsIDB4ODMsIDB4NDAsIDB4NDgsIDB4NzUsIDB4RkQsIDB4RTcsIDB4NjAsIDB4NTgsIDB4NEUsIDB4ODEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjgsIDB4NDQsIDB4NEMsIDB4ODgsIDB4NzUsIDB4RjMsIDB4MDIsIDB4NjUsIDB4QzQsIDB4ODMsIDB4RjUsIDB4MDIsIDB4MUUsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4QjksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTcsIDB4NjAsIDB4MDYsIDB4NjQsIDB4MEIsIDB4NjAsIDB4ODIsIDB4RkIsIDB4NEEsIDB4REYsIDB4MDEsIDB4NjAsCisJIDB4RkUsIDB4NjMsIDB4MTUsIDB4NjAsIDB4MDAsIDB4NjEsIDB4MDAsIDB4NjQsIDB4NTksIDB4REIsIDB4RkUsIDB4MUYsIDB4N0QsIDB4RjEsIDB4MUUsIDB4NjAsCisJIDB4RTAsIDB4NjEsIDB4NjQsIDB4NDAsIDB4RkYsIDB4MjYsIDB4MzgsIDB4MDAsIDB4RDQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MUUsIDB4NjAsIDB4Q0UsIDB4NjEsIDB4RDQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjEsCisJIDB4RDQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUUsIDB4NjAsIDB4RTYsIDB4NjEsIDB4RDQsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUUsIDB4NjAsIDB4RUMsIDB4NjEsIDB4RDQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MUUsIDB4NjAsIDB4RjgsIDB4NjEsIDB4RDQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsIDB4MDQsIDB4NjEsCisJIDB4RDQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUUsIDB4NjAsIDB4RjIsIDB4NjEsIDB4RDQsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUUsIDB4NjAsIDB4REEsIDB4NjEsIDB4RDQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4M0EsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTUsIDB4RkIsIDB4NUEsIDB4REIsIDB4QzUsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RDMsCisJIDB4MEUsIDB4NTcsIDB4MjMsIDB4MDAsIDB4MEUsIDB4RjIsIDB4NDQsIDB4NEMsIDB4ODAsIDB4QjAsIDB4MTAsIDB4QjAsIDB4MEEsIDB4MDMsIDB4MDAsIDB4NjQsCisJIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4MTMsIDB4MDAsIDB4MTIsIDB4MDIsIDB4RjAsIDB4MzcsIDB4MDksIDB4MDAsIDB4MDIsIDB4RjAsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjQsIDB4RDAsIDB4ODAsCisJIDB4QTIsIDB4RkYsIDB4OEYsIDB4RjMsIDB4MDIsIDB4MDIsIDB4Q0MsIDB4ODQsIDB4OEYsIDB4RkIsIDB4MUYsIDB4NjAsIDB4MjAsIDB4NjQsIDB4NDAsIDB4NEIsCisJIDB4RjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkMsIDB4NDQsIDB4QUMsIDB4ODYsIDB4MDksIDB4RjAsIDB4REEsIDB4MDIsCisJIDB4MzcsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RDMsIDB4MEUsIDB4NTcsIDB4MTgsIDB4MDAsIDB4MEUsIDB4RjIsIDB4NDQsIDB4NEMsIDB4ODAsIDB4QjAsCisJIDB4MTAsIDB4QjAsIDB4MEEsIDB4MDMsIDB4MDAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MDgsIDB4MDAsIDB4MDcsIDB4MDIsIDB4MUYsIDB4NjAsIDB4MjAsIDB4NjQsIDB4NDAsIDB4NEIsCisJIDB4RjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkMsIDB4NDQsIDB4QUMsIDB4ODYsIDB4MDksIDB4RjAsIDB4RTUsIDB4MDIsCisJIDB4MzcsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4QjAsIDB4NjQsIDB4MkEsIDB4RkEsIDB4MkYsIDB4RjIsCisJIDB4MkMsIDB4RkEsIDB4MzAsIDB4RjIsIDB4MkQsIDB4RkEsIDB4MzEsIDB4RjIsIDB4MkUsIDB4RkEsIDB4Q0IsIDB4RjMsIDB4MkYsIDB4RkEsIDB4Q0MsIDB4RjMsCisJIDB4MzAsIDB4RkEsIDB4Q0QsIDB4RjMsIDB4MzEsIDB4RkEsIDB4NjYsIDB4RjMsIDB4MzIsIDB4RkEsIDB4NjcsIDB4RjMsIDB4MzMsIDB4RkEsIDB4NjgsIDB4RjMsCisJIDB4MzQsIDB4RkEsIDB4QUIsIDB4RjEsIDB4MTksIDB4RjgsIDB4MDYsIDB4NjMsIDB4M0YsIDB4RkMsIDB4MUMsIDB4RjIsIDB4MTMsIDB4RkEsIDB4MDAsIDB4NjQsCisJIDB4M0UsIDB4RkEsIDB4MDcsIDB4RjIsIDB4ODcsIDB4RjEsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MEMsIDB4MDMsIDB4NjAsIDB4NDYsCisJIDB4MDYsIDB4RjIsIDB4MjYsIDB4NDYsIDB4MDEsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDIsIDB4RDYsIDB4NjAsIDB4NDAsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4RDcsIDB4NjAsIDB4OTIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4RjQsIDB4MEEsIDB4RjIsIDB4MDksIDB4RjIsIDB4RkYsIDB4QTAsIDB4MDAsIDB4QTAsCisJIDB4MTMsIDB4MDIsIDB4RkYsIDB4QTAsIDB4MDQsIDB4MDMsIDB4MDgsIDB4MDMsIDB4RDQsIDB4NjAsIDB4QUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjQsCisJIDB4NTUsIDB4RkIsIDB4RDQsIDB4NjAsIDB4QkEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjMsIDB4MzIsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MEYsIDB4MDAsCisJIDB4NTUsIDB4RkQsIDB4RDQsIDB4NjAsIDB4QkEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MEEsIDB4RjIsIDB4MEUsIDB4NjMsCisJIDB4MDEsIDB4QTQsIDB4MEEsIDB4RkEsIDB4MEIsIDB4RkMsIDB4NDMsIDB4NTksIDB4RDcsIDB4NjAsIDB4NkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsCisJIDB4MDAsIDB4RjQsIDB4MEEsIDB4RjIsIDB4MEQsIDB4NjMsIDB4MDEsIDB4QTQsIDB4MEEsIDB4RkEsIDB4MEIsIDB4RkMsIDB4NDMsIDB4NTksIDB4RDcsIDB4NjAsCisJIDB4NkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODcsIDB4RjUsIDB4MDAsIDB4RjIsIDB4MjYsIDB4NDYsIDB4MDAsIDB4QTAsIDB4MkUsIDB4RjAsIDB4MzcsIDB4MDMsCisJIDB4NjYsIDB4NDEsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4ODcsIDB4RjEsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsCisJIDB4NjQsIDB4NDMsIDB4MTEsIDB4MTgsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkMsIDB4MUIsIDB4NjYsIDB4NDQsIDB4NjQsIDB4NDYsCisJIDB4ODAsIDB4RjAsIDB4NjAsIDB4NDYsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4NjUsIDB4NDMsIDB4ODAsIDB4RjAsIDB4MDEsIDB4RkEsIDB4ODAsIDB4RkMsCisJIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsIDB4MEIsIDB4MDAsIDB4NjQsIDB4NDYsIDB4NjIsIDB4NDMsIDB4MDAsIDB4RjIsIDB4QTMsIDB4REIsIDB4NjAsIDB4NDYsCisJIDB4ODAsIDB4RjAsIDB4ODEsIDB4RkMsIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4ODYsIDB4RjEsCisJIDB4MTcsIDB4NjAsIDB4MDIsIDB4NjEsIDB4QTEsIDB4RDMsIDB4REEsIDB4ODEsIDB4RDAsIDB4ODAsIDB4REMsIDB4OUMsIDB4MDUsIDB4MDUsIDB4QTEsIDB4RDMsCisJIDB4NEEsIDB4RDksIDB4QTAsIDB4REQsIDB4REEsIDB4OUMsIDB4QTEsIDB4RDksIDB4RDYsIDB4NjAsIDB4MDksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEIsIDB4NjAsCisJIDB4ODEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjIsIDB4MTgsIDB4MTcsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MDQsIDB4QTUsIDB4QTAsIDB4RDEsIDB4NzIsIDB4NDQsCisJIDB4RkYsIDB4QjQsIDB4NjQsIDB4NDAsIDB4RTAsIDB4MjIsIDB4MUYsIDB4QjQsIDB4NjQsIDB4NDAsIDB4RjgsIDB4MjIsIDB4MDcsIDB4QjQsIDB4MDIsIDB4MDAsCisJIDB4MDMsIDB4MDQsIDB4RDAsIDB4ODQsIDB4RDAsIDB4ODAsIDB4RkMsIDB4MDEsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDMsCisJIDB4NjYsIDB4NDEsIDB4NjMsIDB4NDYsIDB4MDUsIDB4RjIsIDB4MDAsIDB4RjAsIDB4ODEsIDB4RjAsIDB4MDIsIDB4MTgsIDB4NjQsIDB4NDYsIDB4ODEsIDB4RjgsCisJIDB4MDcsIDB4MUIsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDksIDB4MDIsIDB4MDAsCisJIDB4NjUsIDB4NDYsIDB4MDAsIDB4RjgsIDB4ODcsIDB4RjMsIDB4NjMsIDB4NDUsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDQsIDB4ODAsCisJIDB4MDEsIDB4MTgsIDB4RkEsIDB4MDQsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RkEsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0UsCisJIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MkUsIDB4RjAsIDB4NjYsIDB4NDEsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4ODcsIDB4RjEsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjQsIDB4NDMsIDB4MTEsIDB4MTgsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4RkMsIDB4MUIsIDB4NjYsIDB4NDQsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjAsIDB4NjAsIDB4NDYsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4NjUsIDB4NDMsCisJIDB4ODAsIDB4RjAsIDB4MDEsIDB4RkEsIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsIDB4MEIsIDB4MDAsIDB4NjQsIDB4NDYsIDB4NjIsIDB4NDMsCisJIDB4MDAsIDB4RjIsIDB4QTMsIDB4REIsIDB4NjAsIDB4NDYsIDB4ODAsIDB4RjAsIDB4ODEsIDB4RkMsIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsCisJIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4RDYsIDB4NjAsIDB4MDksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjEsIDB4QjUsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4QTIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODYsIDB4RjEsIDB4NzIsIDB4NDQsIDB4RkYsIDB4QjQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4MDQsIDB4RDAsIDB4ODQsIDB4RkIsIDB4MDEsIDB4RTAsIDB4ODMsIDB4ODcsIDB4RjMsIDB4MDIsIDB4QTMsIDB4NDMsIDB4OTMsIDB4NjYsIDB4NDQsCisJIDB4MDAsIDB4QTgsIDB4NTYsIDB4RkQsIDB4M0EsIDB4MDMsIDB4MDAsIDB4NjQsIDB4MkIsIDB4RkEsIDB4MDAsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MkEsIDB4RkEsCisJIDB4NjYsIDB4NDUsIDB4NjMsIDB4NDYsIDB4MDMsIDB4RjIsIDB4MDQsIDB4RjAsIDB4ODUsIDB4RjIsIDB4NjUsIDB4NDYsIDB4MkMsIDB4RkEsIDB4MkQsIDB4RjgsCisJIDB4QUUsIDB4RkEsIDB4Q0IsIDB4RjMsIDB4MkYsIDB4RkEsIDB4MzIsIDB4RkEsIDB4Q0MsIDB4RjMsIDB4MzAsIDB4RkEsIDB4MzMsIDB4RkEsIDB4Q0QsIDB4RjMsCisJIDB4MzEsIDB4RkEsIDB4MzQsIDB4RkEsIDB4QUIsIDB4RjEsIDB4MTksIDB4RjgsIDB4RkYsIDB4NjcsIDB4MEUsIDB4RkEsIDB4NjYsIDB4NDEsIDB4NDMsIDB4NDksCisJIDB4MjksIDB4NDYsIDB4OTIsIDB4RjAsIDB4MkMsIDB4NjAsIDB4MjYsIDB4NjMsIDB4NDcsIDB4RDMsIDB4NjEsIDB4NDYsIDB4MDIsIDB4NjMsIDB4MDAsIDB4N0UsCisJIDB4MTMsIDB4RkEsIDB4M0YsIDB4RkMsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4ODcsIDB4RjMsIDB4MDcsIDB4RkEsIDB4NjYsIDB4NDEsIDB4MDAsIDB4RjQsCisJIDB4MDUsIDB4NjQsIDB4MDksIDB4RkEsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjEsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4NTYsIDB4RjMsIDB4QTMsIDB4RkYsIDB4NjAsIDB4NDMsCisJIDB4RTcsIDB4NjAsIDB4NTgsIDB4NEUsIDB4ODEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NTgsIDB4MDMsIDB4NjUsCisJIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NTEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTYsIDB4RjMsIDB4MjYsIDB4NDYsIDB4NjAsIDB4NDMsIDB4NjYsIDB4NDEsCisJIDB4NjMsIDB4NDYsIDB4MDUsIDB4RjIsIDB4MDAsIDB4RjAsIDB4ODEsIDB4RjAsIDB4MDIsIDB4MTgsIDB4NjQsIDB4NDYsIDB4ODEsIDB4RjgsIDB4MDcsIDB4MUIsCisJIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDksIDB4MDIsIDB4MDAsIDB4NjUsIDB4NDYsCisJIDB4MDAsIDB4RjgsIDB4ODcsIDB4RjMsIDB4NjMsIDB4NDUsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDQsIDB4ODAsIDB4MDEsIDB4MTgsCisJIDB4RkEsIDB4MDQsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RkEsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsCisJIDB4NjEsIDB4NDYsIDB4MkUsIDB4RjAsIDB4NjYsIDB4NDEsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4ODcsIDB4RjEsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjQsIDB4NDMsIDB4MTEsIDB4MTgsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkMsIDB4MUIsCisJIDB4NjYsIDB4NDQsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjAsIDB4NjAsIDB4NDYsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4NjUsIDB4NDMsIDB4ODAsIDB4RjAsCisJIDB4MDEsIDB4RkEsIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsIDB4MEIsIDB4MDAsIDB4NjQsIDB4NDYsIDB4NjIsIDB4NDMsIDB4MDAsIDB4RjIsCisJIDB4QTMsIDB4REIsIDB4NjAsIDB4NDYsIDB4ODAsIDB4RjAsIDB4ODEsIDB4RkMsIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsIDB4NjAsIDB4NDMsCisJIDB4NjEsIDB4NDYsIDB4MkMsIDB4RjIsIDB4MkQsIDB4RjAsIDB4QUUsIDB4RjIsIDB4NjYsIDB4NDUsIDB4NjMsIDB4NDYsIDB4MDMsIDB4RkEsIDB4MDQsIDB4RjgsCisJIDB4NTUsIDB4RjMsIDB4ODUsIDB4RkEsIDB4RkYsIDB4QTAsIDB4NjUsIDB4NDYsIDB4MDMsIDB4MDMsIDB4RDcsIDB4NjAsIDB4QUUsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4OTQsIDB4RjMsIDB4NjYsIDB4NDUsIDB4NjMsIDB4NDYsIDB4MUYsIDB4RkEsIDB4NjUsIDB4NDYsIDB4QkEsIDB4NjUsIDB4NjAsIDB4NDQsIDB4QzQsIDB4ODUsCisJIDB4MDEsIDB4NjAsIDB4RkUsIDB4NjEsIDB4MDAsIDB4NjQsIDB4ODAsIDB4NjMsIDB4QzcsIDB4ODUsIDB4OTQsIDB4ODQsIDB4NTksIDB4REIsIDB4RkMsIDB4MUYsCisJIDB4MDAsIDB4NjAsIDB4ODgsIDB4NjQsIDB4M0YsIDB4RkEsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjQsIDB4MEEsIDB4RkEsIDB4MDAsIDB4NjQsIDB4MEIsIDB4RkEsCisJIDB4ODAsIDB4N0YsIDB4MTAsIDB4N0UsIDB4MEMsIDB4RkEsIDB4MUEsIDB4NjUsIDB4ODAsIDB4NjEsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4MEYsIDB4NEUsCisJIDB4RjgsIDB4NjAsIDB4NTgsIDB4NEYsIDB4N0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NEYsIDB4RDcsIDB4NjAsIDB4ODAsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjYsIDB4NDYsIDB4MjMsIDB4RjAsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QTAsIDB4ODAsIDB4MDAsIDB4RjQsIDB4MDMsIDB4MDMsIDB4RDcsIDB4NjAsCisJIDB4MkEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDksIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTAsIDB4MDAsIDB4QTAsIDB4MEMsIDB4MDMsIDB4MDMsIDB4MDMsCisJIDB4RDYsIDB4NjAsIDB4QTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4RjIsIDB4MjYsIDB4NDYsIDB4RkYsIDB4QTAsIDB4ODcsIDB4RjQsIDB4MTAsIDB4MDIsCisJIDB4RDcsIDB4NjAsIDB4QUUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RkQsIDB4QTAsIDB4MDIsIDB4MDMsCisJIDB4MDQsIDB4MDMsIDB4MDYsIDB4MDAsIDB4RDYsIDB4NjAsIDB4RTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDYsIDB4NjAsIDB4RjEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjYsIDB4NDYsIDB4ODcsIDB4RjQsIDB4NjYsIDB4NDEsIDB4NjMsIDB4NDYsIDB4MDUsIDB4RjIsIDB4MDAsIDB4RjAsIDB4ODEsIDB4RjAsIDB4MDIsIDB4MTgsCisJIDB4NjQsIDB4NDYsIDB4ODEsIDB4RjgsIDB4MDcsIDB4MUIsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsCisJIDB4NDQsIDB4RDksIDB4MDIsIDB4MDAsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RjgsIDB4ODcsIDB4RjMsIDB4NjMsIDB4NDUsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4RDQsIDB4ODAsIDB4MDEsIDB4MTgsIDB4RkEsIDB4MDQsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RkEsIDB4MDYsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MEIsIDB4NjAsIDB4ODIsIDB4RjMsIDB4REEsIDB4ODEsIDB4NjAsIDB4NDUsCisJIDB4RDUsIDB4ODAsIDB4QTEsIDB4RDEsIDB4MTEsIDB4MDMsIDB4RDMsIDB4ODAsIDB4RDksIDB4ODEsIDB4RkEsIDB4MDIsIDB4QzksIDB4ODEsIDB4QzgsIDB4ODUsCisJIDB4RDUsIDB4ODAsIDB4QTUsIDB4RDMsIDB4MDgsIDB4MjgsIDB4QTEsIDB4REIsIDB4MTcsIDB4NjAsIDB4MDQsIDB4NjIsIDB4NjUsIDB4NDQsIDB4QTIsIDB4REIsCisJIDB4NEEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4QTIsIDB4REIsIDB4RDQsIDB4NjAsIDB4QTQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsCisJIDB4ODcsIDB4RjQsIDB4NjYsIDB4NDEsIDB4NjMsIDB4NDYsIDB4MDUsIDB4RjIsIDB4MDAsIDB4RjAsIDB4ODEsIDB4RjAsIDB4MDIsIDB4MTgsIDB4NjQsIDB4NDYsCisJIDB4ODEsIDB4RjgsIDB4MDcsIDB4MUIsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDksCisJIDB4MDIsIDB4MDAsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RjgsIDB4ODcsIDB4RjMsIDB4NjMsIDB4NDUsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4RDQsIDB4ODAsIDB4MDEsIDB4MTgsIDB4RkEsIDB4MDQsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RkEsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MEIsIDB4NjAsIDB4ODIsIDB4RjMsIDB4REEsIDB4ODEsIDB4NjAsIDB4NDUsIDB4RDUsIDB4ODAsCisJIDB4QTEsIDB4RDEsIDB4MTEsIDB4MDMsIDB4RDMsIDB4ODAsIDB4RDksIDB4ODEsIDB4RkEsIDB4MDIsIDB4QzksIDB4ODEsIDB4QzgsIDB4ODUsIDB4RDUsIDB4ODAsCisJIDB4QTUsIDB4RDMsIDB4MDgsIDB4MjgsIDB4QTEsIDB4REIsIDB4MTcsIDB4NjAsIDB4MDQsIDB4NjIsIDB4NjUsIDB4NDQsIDB4QTIsIDB4REIsIDB4NEEsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4QTIsIDB4REIsIDB4RDQsIDB4NjAsIDB4QUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MzIsIDB4NDQsCisJIDB4MDgsIDB4QjAsIDB4ODcsIDB4RjQsIDB4MDMsIDB4MDIsIDB4RDQsIDB4NjAsIDB4QUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDYsIDB4NjAsIDB4MTgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MzIsIDB4NDQsIDB4MjYsIDB4NDYsIDB4MDgsIDB4QjAsIDB4MDcsIDB4RjIsIDB4MDMsIDB4MDIsIDB4RDQsIDB4NjAsIDB4QUYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDYsIDB4MUYsIDB4RjIsIDB4MjYsIDB4NDYsIDB4QkEsIDB4NjUsIDB4NjAsIDB4NDQsIDB4QzQsIDB4ODUsIDB4MDEsIDB4NjAsCisJIDB4RkUsIDB4NjEsIDB4MDAsIDB4NjQsIDB4ODAsIDB4NjMsIDB4QzcsIDB4ODUsIDB4OTQsIDB4ODQsIDB4NTksIDB4REIsIDB4RkMsIDB4MUYsIDB4MDAsIDB4RjQsCisJIDB4MDEsIDB4NjAsIDB4RkUsIDB4NjEsIDB4N0UsIDB4NjUsIDB4MTgsIDB4NjMsIDB4NUIsIDB4RDIsIDB4NTksIDB4RDEsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsCisJIDB4RDcsIDB4ODAsIDB4MTgsIDB4MDIsIDB4RjksIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjMsIDB4MEUsIDB4NjUsIDB4NUIsIDB4RDIsIDB4NTksIDB4RDEsCisJIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RDcsIDB4ODAsIDB4MEUsIDB4MDIsIDB4RjksIDB4MDIsIDB4MjYsIDB4NDYsIDB4MDcsIDB4RjQsIDB4MDYsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4N0UsIDB4MDYsIDB4RkEsIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjQsIDB4MEEsIDB4RkEsIDB4MDAsIDB4NjQsCisJIDB4MEIsIDB4RkEsIDB4NTYsIDB4MDAsIDB4MjYsIDB4NDYsIDB4ODcsIDB4RjQsIDB4NjYsIDB4NDEsIDB4NjMsIDB4NDYsIDB4MDUsIDB4RjIsIDB4MDAsIDB4RjAsCisJIDB4ODEsIDB4RjAsIDB4MDIsIDB4MTgsIDB4NjQsIDB4NDYsIDB4ODEsIDB4RjgsIDB4MDcsIDB4MUIsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDksIDB4MDIsIDB4MDAsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RjgsIDB4ODcsIDB4RjMsIDB4NjMsIDB4NDUsCisJIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDQsIDB4ODAsIDB4MDEsIDB4MTgsIDB4RkEsIDB4MDQsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsCisJIDB4MDAsIDB4RkEsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MEIsIDB4NjAsIDB4ODIsIDB4RjMsCisJIDB4REEsIDB4ODEsIDB4NjAsIDB4NDUsIDB4RDUsIDB4ODAsIDB4QTEsIDB4RDEsIDB4MTEsIDB4MDMsIDB4RDMsIDB4ODAsIDB4RDksIDB4ODEsIDB4RkEsIDB4MDIsCisJIDB4QzksIDB4ODEsIDB4QzgsIDB4ODUsIDB4RDUsIDB4ODAsIDB4QTUsIDB4RDMsIDB4MDgsIDB4MjgsIDB4QTEsIDB4REIsIDB4MTcsIDB4NjAsIDB4MDQsIDB4NjIsCisJIDB4NjUsIDB4NDQsIDB4QTIsIDB4REIsIDB4NEEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4QTIsIDB4REIsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjQsCisJIDB4MEEsIDB4RkEsIDB4MEYsIDB4NjQsIDB4MEIsIDB4RkEsIDB4NDAsIDB4NTksIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjEsIDB4NDEsIDB4NTgsIDB4MjYsIDB4NDYsCisJIDB4MkMsIDB4RjIsIDB4QTEsIDB4REIsIDB4MkQsIDB4RjIsIDB4NTksIDB4REIsIDB4MkUsIDB4RjIsIDB4NTksIDB4REIsIDB4MDMsIDB4NjUsIDB4RTUsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4MjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDMsIDB4NjUsIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NTEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjYsIDB4NDYsIDB4ODcsIDB4RjMsIDB4MDcsIDB4RkEsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4RjQsIDB4MEEsIDB4RjIsIDB4MDksIDB4RjIsIDB4RkYsIDB4QTAsIDB4MDAsIDB4QTAsIDB4MDYsIDB4MDIsCisJIDB4RkYsIDB4QTAsIDB4MDcsIDB4MDMsIDB4MDksIDB4MDMsIDB4RDYsIDB4NjAsIDB4QTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDYsIDB4NjAsIDB4NjgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4RDcsIDB4NjAsIDB4QjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MDcsIDB4RjQsIDB4MDYsIDB4RjIsIDB4NjYsIDB4NDMsCisJIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsIDB4MjYsIDB4NDYsIDB4RDYsIDB4NjAsIDB4MTgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4MDYsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4N0UsIDB4MDYsIDB4RkEsIDB4MjYsIDB4NDYsIDB4ODcsIDB4RjMsIDB4MDcsIDB4RkEsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjQsCisJIDB4MEEsIDB4RkEsIDB4MDAsIDB4NjQsIDB4MEIsIDB4RkEsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MTAsIDB4N0MsIDB4MkEsIDB4RjIsIDB4MEMsIDB4NjAsIDB4NzAsIDB4RkIsCisJIDB4RkYsIDB4QjQsIDB4MTYsIDB4NjAsIDB4ODMsIDB4RkIsIDB4NjAsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MDMsIDB4MDAsIDB4MDIsIDB4NjEsIDB4MDAsIDB4NjAsCisJIDB4MzAsIDB4N0MsIDB4NDEsIDB4NDcsIDB4MkEsIDB4RjgsIDB4MkYsIDB4RjIsIDB4MkMsIDB4RkEsIDB4MzAsIDB4RjIsIDB4MkQsIDB4RkEsIDB4MzEsIDB4RjIsCisJIDB4MkUsIDB4RkEsIDB4Q0IsIDB4RjMsIDB4MkYsIDB4RkEsIDB4Q0MsIDB4RjMsIDB4MzAsIDB4RkEsIDB4Q0QsIDB4RjMsIDB4MzEsIDB4RkEsIDB4NjYsIDB4RjMsCisJIDB4MzIsIDB4RkEsIDB4NjcsIDB4RjMsIDB4MzMsIDB4RkEsIDB4NjgsIDB4RjMsIDB4MzQsIDB4RkEsIDB4QUIsIDB4RjEsIDB4MTksIDB4RjgsIDB4MDAsIDB4N0MsCisJIDB4M0UsIDB4RjgsIDB4MUMsIDB4RjAsIDB4MTMsIDB4RjgsIDB4MDcsIDB4RjIsIDB4ODcsIDB4RjEsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDMsIDB4MDIsIDB4REMsIDB4NjAsIDB4NTUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NEIsIDB4MDEsIDB4NjUsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4REMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QUIsIDB4NDYsIDB4MDYsIDB4RjIsIDB4QUIsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MDEsIDB4QjAsIDB4RkYsIDB4RkYsCisJIDB4MDMsIDB4MDIsIDB4REMsIDB4NjAsIDB4NTUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDksIDB4RjIsIDB4MTYsIDB4NjAsIDB4ODQsIDB4RkIsIDB4NUEsIDB4ODQsCisJIDB4MDAsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MjYsIDB4MDIsIDB4QkIsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MjcsIDB4MDQsIDB4QkIsIDB4QUIsIDB4NDYsCisJIDB4NzgsIDB4RkMsIDB4QUIsIDB4NDYsIDB4RkYsIDB4RkYsIDB4MTAsIDB4QjAsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjMsIDB4MEMsIDB4MDMsIDB4MTMsIDB4NjAsCisJIDB4NDUsIDB4RjEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDQsIDB4RkUsIDB4MjYsIDB4MDgsIDB4MDAsIDB4MzIsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MDYsIDB4MDAsCisJIDB4REMsIDB4NjAsIDB4QjksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzIsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MDAsIDB4NjMsIDB4QUIsIDB4NDYsIDB4MDYsIDB4RjAsCisJIDB4N0YsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4NjMsIDB4NDUsIDB4QjQsIDB4ODQsIDB4MDYsIDB4RkEsIDB4QUIsIDB4NDYsIDB4MEEsIDB4RjAsCisJIDB4NTYsIDB4RjksIDB4MjQsIDB4RDksIDB4NUEsIDB4ODQsIDB4MDEsIDB4NjMsIDB4MzIsIDB4NDAsIDB4MTAsIDB4MjYsIDB4MTAsIDB4QkIsIDB4MTMsIDB4NjAsCisJIDB4NDUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4RkUsIDB4MjYsIDB4MTAsIDB4QkIsIDB4MTUsIDB4NjAsIDB4REQsIDB4RjEsIDB4NjMsIDB4NDQsCisJIDB4MjAsIDB4QkMsIDB4RkIsIDB4NjAsIDB4RkYsIDB4QjcsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MjYsIDB4MDQsIDB4QkMsIDB4NjAsIDB4NDcsIDB4NjAsIDB4NDMsCisJIDB4MDksIDB4RkMsIDB4MjcsIDB4NDQsIDB4RkUsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4RDgsIDB4NjAsIDB4QzgsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTgsIDB4NjAsIDB4RDYsIDB4NjQsIDB4MjQsIDB4NDMsIDB4MEIsIDB4RjAsIDB4QTAsIDB4RDksIDB4QkQsIDB4RDksIDB4MEMsIDB4RjAsIDB4NTgsIDB4RDksCisJIDB4QkQsIDB4RDksIDB4MEQsIDB4RjAsIDB4NTgsIDB4RDksIDB4QkQsIDB4RDksIDB4NDMsIDB4NDQsIDB4MjYsIDB4NDYsIDB4ODcsIDB4RjIsIDB4M0YsIDB4RjIsCisJIDB4NDEsIDB4NEIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDMsIDB4RjYsIDB4QTMsIDB4MDAsIDB4NjAsIDB4MUIsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjUsCisJIDB4MDEsIDB4NjAsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NEMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NzksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QkIsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NEEsIDB4NjAsIDB4RkUsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4QkQsIDB4RDMsCisJIDB4QkQsIDB4RDMsIDB4NjAsIDB4NDEsIDB4RjAsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4MjYsIDB4NDYsCisJIDB4M0YsIDB4RjIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDMsIDB4RjYsIDB4QTMsIDB4MDAsIDB4NjAsIDB4MUIsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MzIsIDB4NjUsCisJIDB4MDEsIDB4NjAsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NEMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NzksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QkIsCisJIDB4RkYsIDB4RkYsIDB4MEIsIDB4MDMsIDB4NjAsIDB4RkUsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDMsIDB4NjAsIDB4NDEsCisJIDB4RjAsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjAsIDB4RkUsIDB4MzAsIDB4NjAsIDB4MjAsIDB4NjEsCisJIDB4QTEsIDB4RDEsIDB4ODIsIDB4RjMsIDB4MDEsIDB4NjAsIDB4NkUsIDB4NjMsIDB4NjAsIDB4NDUsIDB4MkEsIDB4NDQsIDB4NjAsIDB4RkIsIDB4QTMsIDB4RDUsCisJIDB4NjUsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NUIsIDB4RDUsIDB4NjUsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NTksIDB4RDEsIDB4NjYsIDB4NDEsIDB4QTAsIDB4ODQsCisJIDB4MjQsIDB4OTQsIDB4MkIsIDB4NDYsIDB4MEYsIDB4RkEsIDB4NjEsIDB4RkIsIDB4MTYsIDB4NjQsIDB4MTIsIDB4RkEsIDB4MDEsIDB4NjQsIDB4MTEsIDB4RkEsCisJIDB4NjYsIDB4NUMsIDB4QzEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OTMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDksIDB4NjAsIDB4MjgsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjYsIDB4NDYsIDB4ODcsIDB4RjIsIDB4M0YsIDB4RjIsIDB4NDEsIDB4NEIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDMsIDB4RkMsIDB4QTMsIDB4MDAsIDB4NjAsCisJIDB4MTUsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjUsIDB4MDEsIDB4NjAsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NEMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4NzksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QkIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NEEsIDB4NjAsIDB4RkUsCisJIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDMsIDB4NjAsIDB4NDEsIDB4RjAsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4MjYsIDB4NDYsIDB4M0YsIDB4RjIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDMsIDB4RkMsIDB4QTMsIDB4MDAsIDB4NjAsCisJIDB4MTUsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MzIsIDB4NjUsIDB4MDEsIDB4NjAsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NEMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4NzksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QkIsIDB4RkYsIDB4RkYsIDB4MEIsIDB4MDMsIDB4NjAsIDB4RkUsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsCisJIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDMsIDB4NjAsIDB4NDEsIDB4RjAsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCisJIDB4MjAsIDB4RkUsIDB4MzAsIDB4NjAsIDB4MjAsIDB4NjEsIDB4QTEsIDB4RDEsIDB4ODIsIDB4RjMsIDB4MDEsIDB4NjAsIDB4NkUsIDB4NjMsIDB4NjAsIDB4NDUsCisJIDB4MkEsIDB4NDQsIDB4NjAsIDB4RkIsIDB4QTMsIDB4RDUsIDB4NjUsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NUIsIDB4RDUsIDB4NjUsIDB4NDAsIDB4MDEsIDB4MjcsCisJIDB4NTksIDB4RDEsIDB4NjYsIDB4NDEsIDB4QTAsIDB4ODQsIDB4MjQsIDB4OTQsIDB4MkIsIDB4NDYsIDB4MEYsIDB4RkEsIDB4NjEsIDB4RkIsIDB4MTYsIDB4NjQsCisJIDB4MTIsIDB4RkEsIDB4MDEsIDB4NjQsIDB4MTEsIDB4RkEsIDB4NjYsIDB4NUMsIDB4QzEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OTMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4NDYsIDB4MEYsIDB4RjIsIDB4MTIsIDB4NjMsIDB4N0MsIDB4MTgsIDB4MjYsIDB4NDYsIDB4ODcsIDB4RjIsIDB4MDEsIDB4NjUsIDB4NDEsIDB4NEIsCisJIDB4QUIsIDB4NDYsIDB4MEYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RkYsIDB4MjIsCisJIDB4MDAsIDB4NjUsIDB4NzgsIDB4RjIsIDB4RkYsIDB4RkYsIDB4QjQsIDB4ODQsIDB4NzgsIDB4RkEsIDB4QUIsIDB4NDYsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsCisJIDB4M0YsIDB4RjIsIDB4MDAsIDB4RjQsIDB4MTYsIDB4NjUsIDB4MjcsIDB4NDAsIDB4MDIsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MUMsIDB4NjUsIDB4RjYsIDB4QTQsCisJIDB4MDEsIDB4MDAsIDB4RkMsIDB4QTQsIDB4MjQsIDB4NDMsIDB4MkQsIDB4NjAsIDB4NUUsIDB4NjEsIDB4NUQsIDB4OTEsIDB4NTEsIDB4OTAsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4MjgsIDB4NjAsIDB4NDEsIDB4Q0QsIDB4ODQsIDB4NEMsIDB4OTEsIDB4NjAsIDB4NDMsIDB4NjAsIDB4RkUsIDB4QTUsIDB4RDIsIDB4REUsIDB4ODUsCisJIDB4N0YsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4NUQsIDB4OTMsIDB4QTMsIDB4REIsIDB4NUQsIDB4OTMsIDB4QTUsIDB4RDIsCisJIDB4RjYsIDB4MUYsIDB4NUQsIDB4OTMsIDB4MjAsIDB4RkUsIDB4REYsIDB4ODMsIDB4MkQsIDB4NjAsIDB4MDQsIDB4N0MsIDB4MDMsIDB4MUUsIDB4NjAsIDB4RkUsCisJIDB4QkQsIDB4REYsIDB4MjAsIDB4RkUsIDB4MkQsIDB4NjAsIDB4MDgsIDB4NjQsIDB4NTMsIDB4OTMsIDB4QTQsIDB4REQsIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjQsCisJIDB4MTMsIDB4NjAsIDB4NDQsIDB4RjMsIDB4MDAsIDB4NjMsIDB4MDAsIDB4QjgsIDB4MEEsIDB4RkMsIDB4MDMsIDB4MDIsIDB4RDksIDB4NjAsIDB4Q0YsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEIsIDB4RjIsIDB4MjcsIDB4NDAsIDB4MDIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MEUsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsCisJIDB4MDAsIDB4M0EsIDB4MjUsIDB4MDAsIDB4NjAsIDB4NDEsIDB4MDAsIDB4MzYsIDB4MjIsIDB4MDAsIDB4RTAsIDB4QTAsIDB4REEsIDB4ODUsIDB4MUYsIDB4MDcsCisJIDB4MTMsIDB4NjAsIDB4MEIsIDB4RjEsIDB4NjUsIDB4NDIsIDB4RDEsIDB4ODAsIDB4MjYsIDB4NjAsIDB4MTgsIDB4NjMsIDB4MTgsIDB4MDIsIDB4NTAsIDB4RkUsCisJIDB4NjEsIDB4NDAsIDB4RkUsIDB4MjIsIDB4MDgsIDB4MDAsIDB4NjIsIDB4NDUsIDB4QkQsIDB4RDMsIDB4QTUsIDB4RDAsIDB4REEsIDB4ODIsIDB4RDAsIDB4ODAsCisJIDB4QzksIDB4ODEsIDB4RjYsIDB4MEMsIDB4MEMsIDB4MDAsIDB4NjEsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MzEsIDB4MDAsIDB4NjIsIDB4NDUsIDB4QTMsIDB4RDMsCisJIDB4QTUsIDB4RDAsIDB4RkYsIDB4RkYsIDB4OTAsIDB4ODAsIDB4RkYsIDB4MjYsIDB4MDIsIDB4MDAsIDB4REUsIDB4ODIsIDB4MjgsIDB4MDAsIDB4MEMsIDB4NjMsCisJIDB4MEEsIDB4RkMsIDB4MDAsIDB4NjQsIDB4MDksIDB4RkEsIDB4MEIsIDB4RkEsIDB4MDEsIDB4N0UsIDB4MEMsIDB4RkEsIDB4MjYsIDB4NDYsIDB4MDgsIDB4NjQsCisJIDB4M0YsIDB4RkEsIDB4MDcsIDB4RjIsIDB4ODcsIDB4RjEsIDB4NDAsIDB4NTgsIDB4MDcsIDB4RjgsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsIDB4MEYsIDB4NjAsCisJIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsCisJIDB4REMsIDB4NjAsIDB4RDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4MTYsIDB4NjAsIDB4NTAsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MjIsIDB4QjAsCisJIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4REIsIDB4NjAsIDB4QjEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjMsIDB4RDksIDB4MDEsIDB4MTMsIDB4NjAsCisJIDB4NDUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTQsIDB4RkYsIDB4RkYsIDB4MEMsIDB4MjAsIDB4MDMsIDB4MDAsIDB4REIsIDB4NjAsIDB4QjEsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4MTYsIDB4NjAsIDB4NTYsIDB4RkIsIDB4MTYsIDB4NjAsIDB4NTcsIDB4RkIsIDB4MTYsIDB4NjAsIDB4NTgsIDB4RkIsCisJIDB4MTYsIDB4NjAsIDB4NUEsIDB4RkIsIDB4MTYsIDB4NjAsIDB4NUIsIDB4RkIsIDB4MTYsIDB4NjAsIDB4NUMsIDB4RkIsIDB4MTYsIDB4NjAsIDB4NUQsIDB4RkIsCisJIDB4MTgsIDB4NjAsIDB4MTcsIDB4RkIsIDB4MkIsIDB4NDYsIDB4M0IsIDB4RjIsIDB4N0YsIDB4NjAsIDB4Q0YsIDB4NjUsIDB4QTQsIDB4ODQsIDB4QTIsIDB4REEsCisJIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MEIsIDB4RjIsIDB4MjcsIDB4NDAsIDB4MDIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MEUsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4Q0UsIDB4ODEsIDB4MjAsIDB4RkUsIDB4MzAsIDB4NjAsIDB4MjgsIDB4NjQsIDB4NDAsIDB4NEEsIDB4REEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NjIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4MTgsIDB4NjAsIDB4MTcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MTgsIDB4MTgsIDB4NjAsIDB4MTksIDB4RjMsCisJIDB4MTgsIDB4NjAsIDB4MUEsIDB4RjUsIDB4NjAsIDB4NDEsIDB4MzAsIDB4NjAsIDB4MkUsIDB4NjIsIDB4QTIsIDB4REYsIDB4MkEsIDB4RDEsIDB4REEsIDB4ODUsCisJIDB4NjQsIDB4NDQsIDB4MDEsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDIsIDB4NzUsIDB4MDAsIDB4NDUsIDB4NEEsIDB4N0MsIDB4NDQsIDB4NjAsIDB4RkUsCisJIDB4QTEsIDB4RDIsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4MjAsIDB4RkUsIDB4MDEsIDB4MDMsIDB4RTMsIDB4MDEsIDB4MzAsIDB4NjAsIDB4MkUsIDB4NjIsCisJIDB4QTIsIDB4REYsIDB4NjAsIDB4RkUsIDB4NUQsIDB4RDIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NUMsIDB4NDEsIDB4OTQsIDB4ODEsIDB4QTAsIDB4MjAsIDB4RkUsCisJIDB4MkQsIDB4MDQsIDB4MDEsIDB4NjQsIDB4MTgsIDB4NjAsIDB4MTcsIDB4RkIsIDB4QzEsIDB4ODQsIDB4ODQsIDB4QTQsIDB4MTgsIDB4NjAsIDB4MTksIDB4RkIsCisJIDB4MDAsIDB4RjIsIDB4MTgsIDB4NjAsIDB4MUEsIDB4RkIsIDB4MTgsIDB4NjAsIDB4MTgsIDB4RkQsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4Q0QsIDB4ODUsCisJIDB4NjQsIDB4NDQsIDB4RDgsIDB4ODEsIDB4Q0QsIDB4ODQsIDB4NEMsIDB4OTEsIDB4NjAsIDB4NDMsIDB4NjAsIDB4RkUsIDB4QTUsIDB4RDIsIDB4REUsIDB4ODUsCisJIDB4N0YsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4NUQsIDB4OTMsIDB4QTMsIDB4REIsIDB4NUQsIDB4OTMsIDB4QTUsIDB4RDIsCisJIDB4RjYsIDB4MUYsIDB4NUQsIDB4OTMsIDB4MjAsIDB4RkUsIDB4REYsIDB4ODMsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjEsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4RTAsIDB4ODcsIDB4NjAsIDB4NDYsIDB4MTgsIDB4NjAsIDB4MTgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDMsIDB4NjAsIDB4RkUsIDB4Q0QsIDB4ODEsCisJIDB4MjAsIDB4RkUsIDB4MkEsIDB4NDQsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NDQsIDB4RDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REIsIDB4NjAsCisJIDB4NUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTgsIDB4NjAsIDB4MTcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MTgsIDB4MTgsIDB4NjAsIDB4MTksIDB4RjMsCisJIDB4MTgsIDB4NjAsIDB4MUEsIDB4RjUsIDB4NjAsIDB4NDEsIDB4MzAsIDB4NjAsIDB4MkUsIDB4NjIsIDB4QTIsIDB4REYsIDB4NjYsIDB4NUMsIDB4MjYsIDB4NDYsCisJIDB4MDAsIDB4RjIsIDB4NjQsIDB4NDYsIDB4NTgsIDB4OTAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDIsIDB4NjEsIDB4NDQsIDB4MEIsIDB4QTUsIDB4MDQsIDB4MDAsCisJIDB4NjEsIDB4NDQsIDB4RkMsIDB4QTQsIDB4OEIsIDB4N0MsIDB4QzAsIDB4ODUsIDB4REQsIDB4ODEsIDB4NjYsIDB4NDQsIDB4MTgsIDB4NjAsIDB4MUEsIDB4RkIsCisJIDB4MjYsIDB4NDYsIDB4MUIsIDB4RjAsIDB4MTgsIDB4NjAsIDB4MUEsIDB4RjUsIDB4NjQsIDB4NDQsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4RDcsIDB4MDYsCisJIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjAsIDB4RkUsIDB4NUQsIDB4RDIsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4RkYsIDB4QjQsIDB4NDEsIDB4OTQsCisJIDB4ODEsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDQsIDB4MDAsIDB4RjQsIDB4ODQsIDB4QTQsIDB4NjAsIDB4NDEsIDB4NjIsIDB4MDEsIDB4NjAsIDB4RkUsCisJIDB4NUQsIDB4RDIsIDB4RkYsIDB4RkYsIDB4RkEsIDB4QTQsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjAsIDB4MDIsIDB4MDAsIDB4RkYsIDB4QTEsIDB4NjEsIDB4MDEsCisJIDB4NUQsIDB4RDAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MDIsIDB4MDAsIDB4QzksIDB4ODEsIDB4NUEsIDB4MDEsIDB4NUQsIDB4RDAsCisJIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NTAsIDB4MzYsIDB4MDIsIDB4MDAsIDB4RkQsIDB4QTEsIDB4NTMsIDB4MDEsIDB4NUQsIDB4RDAsIDB4RkYsIDB4RkYsCisJIDB4NjQsIDB4NDAsIDB4RjIsIDB4MzYsIDB4MDQsIDB4MDAsIDB4RkMsIDB4QTEsIDB4REEsIDB4NjAsIDB4MDEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NUQsIDB4RDAsCisJIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDQsIDB4MDAsIDB4RkIsIDB4QTEsIDB4REEsIDB4NjAsIDB4MDEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NUQsIDB4RDAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDQsIDB4MDAsIDB4RkEsIDB4QTEsIDB4REEsIDB4NjAsIDB4MDEsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NUQsIDB4RDAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MDQsIDB4MDAsIDB4RjksIDB4QTEsIDB4REEsIDB4NjAsCisJIDB4MDEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NUMsIDB4MDAsIDB4MzYsIDB4MkEsIDB4MDAsIDB4MDAsIDB4NjQsIDB4REIsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4MTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTYsIDB4NjAsIDB4NUEsIDB4RkIsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MjUsIDB4MDAsIDB4NUQsIDB4RDIsCisJIDB4REQsIDB4ODEsIDB4REIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTYsIDB4NjAsIDB4NUIsIDB4RkIsIDB4NjQsIDB4NDAsCisJIDB4MDAsIDB4MzYsIDB4MUYsIDB4MDAsIDB4NUQsIDB4RDIsIDB4REQsIDB4ODEsIDB4REIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MTYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTYsIDB4NjAsIDB4NUMsIDB4RkIsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MTksIDB4MDAsIDB4NUQsIDB4RDAsIDB4MTYsIDB4NjAsIDB4NUQsIDB4RjksCisJIDB4NUQsIDB4RDAsIDB4MkMsIDB4NjAsIDB4QkIsIDB4NjIsIDB4QTIsIDB4RDksIDB4RDksIDB4NjAsIDB4RjksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsCisJIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4MTYsIDB4NjAsIDB4NUEsIDB4RkIsIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4MTYsIDB4NjAsCisJIDB4NUIsIDB4RkIsIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MTYsIDB4NjAsIDB4NUMsIDB4RkIsIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4MTYsIDB4NjAsIDB4NUQsIDB4RkIsIDB4RDksIDB4NjAsIDB4RjksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTYsIDB4NjAsIDB4NUUsIDB4RkIsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4MDMsIDB4MDIsIDB4MDEsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsIDB4MDIsIDB4QTUsIDB4NjQsIDB4NDQsCisJIDB4RDQsIDB4OUMsIDB4MTYsIDB4NjAsIDB4NUYsIDB4RjksIDB4MkMsIDB4NjAsIDB4QzAsIDB4NjIsIDB4QTIsIDB4REYsIDB4NUQsIDB4RDAsIDB4MDAsIDB4NjUsCisJIDB4NjQsIDB4NDAsIDB4MDAsIDB4M0EsIDB4MDEsIDB4NjUsIDB4NUQsIDB4RDAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NTAsIDB4M0EsIDB4MDEsIDB4NjUsCisJIDB4NUQsIDB4RDAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4RjIsIDB4M0EsIDB4MDEsIDB4NjUsIDB4NUQsIDB4RDAsIDB4NjUsIDB4NDAsIDB4MDAsIDB4M0EsCisJIDB4MTcsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MDEsIDB4NjUsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MzYsCisJIDB4MDIsIDB4NjUsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MzYsIDB4MDQsIDB4NjUsIDB4NjQsIDB4NDAsIDB4MDQsIDB4MzYsIDB4MTAsIDB4NjUsIDB4NjQsIDB4NDAsCisJIDB4MDUsIDB4MzYsIDB4MjAsIDB4NjUsIDB4NjUsIDB4NUMsIDB4MTYsIDB4NjAsIDB4NjAsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4MTYsIDB4NjAsIDB4NUUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTQsIDB4QTIsIDB4REIsIDB4RDAsIDB4MDIsIDB4MTYsIDB4NjAsIDB4NjAsIDB4RjMsCisJIDB4MTYsIDB4NjAsIDB4NUYsIDB4RjEsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4MTYsIDB4NjAsIDB4NTAsIDB4RjEsIDB4MTYsIDB4NjAsCisJIDB4NUEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MTAsIDB4MjYsIDB4MDksIDB4MDAsIDB4MDQsIDB4MjYsIDB4MDksIDB4MDAsCisJIDB4MjAsIDB4MjYsIDB4MDksIDB4MDAsIDB4MDIsIDB4MjYsIDB4MDksIDB4MDAsIDB4RDksIDB4NjAsIDB4QzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4N0MsCisJIDB4MDUsIDB4MDAsIDB4MDQsIDB4N0MsIDB4MDMsIDB4MDAsIDB4MjAsIDB4N0MsIDB4MDEsIDB4MDAsIDB4MDIsIDB4N0MsIDB4MTYsIDB4NjAsIDB4NTYsIDB4RjksCisJIDB4MTYsIDB4NjAsIDB4NTEsIDB4RjEsIDB4MTYsIDB4NjAsIDB4NUIsIDB4RjMsIDB4MkMsIDB4NjAsIDB4QUMsIDB4NjIsIDB4QTAsIDB4ODQsIDB4QTIsIDB4RDEsCisJIDB4RkYsIDB4RkYsIDB4MTAsIDB4MjYsIDB4MDcsIDB4MDAsIDB4MDQsIDB4MjYsIDB4MDcsIDB4MDAsIDB4MDEsIDB4MjYsIDB4MEQsIDB4MDAsIDB4RDksIDB4NjAsCisJIDB4QzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4N0MsIDB4MDksIDB4MDAsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MjIsIDB4MDMsIDB4MDAsIDB4RDksIDB4NjAsCisJIDB4QzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4N0MsIDB4MDEsIDB4MDAsIDB4MDEsIDB4N0MsIDB4MTYsIDB4NjAsIDB4NTcsIDB4RjksIDB4MTYsIDB4NjAsCisJIDB4NTIsIDB4RjEsIDB4MTYsIDB4NjAsIDB4NUMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTAsIDB4ODQsIDB4MDIsIDB4MjYsIDB4MDcsIDB4MDAsIDB4MDQsIDB4MjYsCisJIDB4MDcsIDB4MDAsIDB4MDEsIDB4MjYsIDB4MDcsIDB4MDAsIDB4RDksIDB4NjAsIDB4QzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4N0MsIDB4MDMsIDB4MDAsCisJIDB4MDQsIDB4N0MsIDB4MDEsIDB4MDAsIDB4MjAsIDB4N0MsIDB4MTYsIDB4NjAsIDB4NTgsIDB4RjksIDB4MTYsIDB4NjAsIDB4NUQsIDB4RjEsIDB4MTYsIDB4NjAsCisJIDB4NTksIDB4RjksIDB4MTYsIDB4NjAsIDB4NTgsIDB4RjMsIDB4MTYsIDB4NjAsIDB4NTcsIDB4RjEsIDB4NjAsIDB4NDcsIDB4QjAsIDB4ODQsIDB4MTMsIDB4NjAsCisJIDB4NDUsIDB4RjEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MjIsIDB4QkMsIDB4QUIsIDB4NDYsIDB4M0EsIDB4RkEsIDB4QUIsIDB4NDYsCisJIDB4MTYsIDB4NjAsIDB4NTYsIDB4RjMsIDB4MTMsIDB4NjAsIDB4NDUsIDB4RjEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MjIsIDB4QkMsCisJIDB4ODcsIDB4RjEsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4M0EsIDB4RkEsIDB4RkYsIDB4RkYsIDB4NjEsIDB4NDYsIDB4QUIsIDB4NDYsIDB4ODIsIDB4RjAsCisJIDB4QzAsIDB4NjcsIDB4QjQsIDB4ODQsIDB4QUIsIDB4NDYsIDB4MEIsIDB4RkEsIDB4MTMsIDB4NjAsIDB4NEQsIDB4RjEsIDB4MkQsIDB4NjAsIDB4QkUsIDB4N0MsCisJIDB4MDQsIDB4MUIsIDB4RkYsIDB4NjAsIDB4RkYsIDB4NjMsIDB4QTQsIDB4REQsIDB4MjYsIDB4MDAsIDB4MkUsIDB4NjAsIDB4MzQsIDB4NjMsIDB4QTQsIDB4REQsCisJIDB4REIsIDB4ODMsIDB4NjAsIDB4RkUsIDB4MDAsIDB4NjQsIDB4QkQsIDB4REIsIDB4NjAsIDB4NjQsIDB4QkQsIDB4REIsIDB4MUQsIDB4NjQsIDB4QkQsIDB4REIsCisJIDB4QzMsIDB4RjMsIDB4QkQsIDB4REIsIDB4MjAsIDB4RkUsIDB4MDEsIDB4NjAsIDB4NzgsIDB4NjQsIDB4MDYsIDB4NjEsIDB4NTgsIDB4RDEsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4RkUsIDB4QkQsIDB4RDksIDB4MjAsIDB4RkUsIDB4Q0QsIDB4ODEsIDB4NjEsIDB4NDAsIDB4MDgsIDB4MjgsIDB4RjcsIDB4MDEsIDB4QjYsIDB4RjEsCisJIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDcsIDB4NjAsIDB4RkUsIDB4QkQsIDB4RDksIDB4QkQsIDB4REIsIDB4MjAsIDB4RkUsIDB4MTMsIDB4NjAsIDB4NEIsIDB4RjEsCisJIDB4NjAsIDB4RkUsIDB4QkQsIDB4RDksIDB4MjAsIDB4RkUsIDB4MkQsIDB4NjAsIDB4QkMsIDB4NjQsIDB4NDAsIDB4NDgsIDB4MTgsIDB4NjEsIDB4MjYsIDB4NDYsCisJIDB4MDAsIDB4RjQsIDB4RkYsIDB4NjAsIDB4RjIsIDB4NjQsIDB4RTQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsCisJIDB4M0YsIDB4RkMsIDB4MkIsIDB4NDYsIDB4NTYsIDB4RjEsIDB4MUYsIDB4RjgsIDB4MEMsIDB4NjAsIDB4NzAsIDB4RjEsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QTAsIDB4ODAsIDB4MDYsIDB4RjIsIDB4MEIsIDB4MDMsIDB4MTAsIDB4QkMsIDB4MDYsIDB4RkEsIDB4ODYsIDB4RjMsIDB4MDAsIDB4NjAsIDB4NzAsIDB4RjMsCisJIDB4NjAsIDB4NDUsIDB4RDQsIDB4ODAsIDB4REMsIDB4ODQsIDB4MDcsIDB4MDcsIDB4QTIsIDB4REIsIDB4MDUsIDB4MDAsIDB4MTAsIDB4QjUsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4MDMsIDB4RDQsIDB4ODQsIDB4MDYsIDB4RkEsIDB4MDcsIDB4RjIsIDB4NjYsIDB4NDUsIDB4NjAsIDB4NDYsIDB4MDYsIDB4RjIsIDB4NjUsIDB4NDYsCisJIDB4MDIsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MTEsIDB4MDMsIDB4MjYsIDB4NDYsIDB4ODcsIDB4RjMsIDB4MDcsIDB4RkEsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsCisJIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4QzEsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4NTAsIDB4MDAsIDB4MjYsIDB4NDYsIDB4ODcsIDB4RjMsIDB4MDcsIDB4RkEsIDB4MUUsIDB4NjAsCisJIDB4RDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MTksIDB4MDAsIDB4MDAsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MkEsIDB4RkEsCisJIDB4MDIsIDB4NjQsIDB4M0YsIDB4RkEsIDB4ODcsIDB4RjMsIDB4MDcsIDB4RkEsIDB4MDAsIDB4RjQsIDB4MDksIDB4NjQsIDB4MDksIDB4RkEsIDB4MUUsIDB4NjAsCisJIDB4RDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkIsIDB4NDMsIDB4MEIsIDB4NjAsCisJIDB4ODIsIDB4RjMsIDB4REEsIDB4ODEsIDB4NjAsIDB4NDUsIDB4RDUsIDB4ODAsIDB4QTEsIDB4RDEsIDB4MTEsIDB4MDMsIDB4RDMsIDB4ODAsIDB4RDksIDB4ODEsCisJIDB4RkEsIDB4MDIsIDB4QzksIDB4ODEsIDB4QzgsIDB4ODUsIDB4RDUsIDB4ODAsIDB4QTUsIDB4RDMsIDB4MDgsIDB4MjgsIDB4QTEsIDB4REIsIDB4MTcsIDB4NjAsCisJIDB4MDQsIDB4NjIsIDB4NjUsIDB4NDQsIDB4QTIsIDB4REIsIDB4NEEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4QTIsIDB4REIsIDB4QUIsIDB4NDYsCisJIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsIDB4MDYsIDB4RkEsIDB4NzgsIDB4RjIsIDB4MTUsIDB4NjAsIDB4REMsIDB4RjMsIDB4NjAsIDB4NDUsCisJIDB4QTQsIDB4ODQsIDB4MTUsIDB4NjAsIDB4REMsIDB4RkIsIDB4QUIsIDB4NDYsIDB4QUIsIDB4NDYsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjQsIDB4MDIsIDB4RjAsCisJIDB4NzEsIDB4RjEsIDB4QTAsIDB4ODQsIDB4RDAsIDB4ODAsIDB4MDIsIDB4RkEsIDB4QUIsIDB4NDYsIDB4MDEsIDB4MDYsIDB4NzEsIDB4RkIsIDB4MjcsIDB4NDEsCisJIDB4MDEsIDB4QjEsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDMsIDB4MkIsIDB4NDYsIDB4MEIsIDB4NTgsIDB4MDEsIDB4NjUsIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4NTEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MkIsIDB4NDYsIDB4MEIsIDB4NTgsIDB4MTgsIDB4NjAsIDB4RDYsIDB4NjQsIDB4NDAsIDB4NTksCisJIDB4MDIsIDB4NjUsIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NTEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MDAsIDB4NjQsIDB4MDksIDB4RkEsIDB4MEIsIDB4RkEsIDB4MDEsIDB4N0UsIDB4MEMsIDB4RkEsCisJIDB4MEEsIDB4NjQsIDB4MEEsIDB4RkEsIDB4MjYsIDB4NDYsIDB4MDgsIDB4NjQsIDB4M0YsIDB4RkEsIDB4MDcsIDB4RjIsIDB4ODcsIDB4RjEsIDB4NDAsIDB4NTgsCisJIDB4MDcsIDB4RjgsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4RkYsIDB4NjAsIDB4RkQsIDB4NjUsIDB4MzgsIDB4NDYsIDB4MDYsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODMsIDB4MDYsIDB4RkMsIDB4MDIsIDB4QjAsIDB4MjYsIDB4NDYsIDB4MUMsIDB4MDMsIDB4MzgsIDB4NDMsIDB4ODYsIDB4RjEsCisJIDB4MTcsIDB4NjAsIDB4MDIsIDB4NjEsIDB4QTEsIDB4RDMsIDB4REEsIDB4ODEsIDB4RDAsIDB4ODAsIDB4REMsIDB4OUMsIDB4MDUsIDB4MDUsIDB4QTEsIDB4RDMsCisJIDB4NEEsIDB4RDksIDB4QTAsIDB4REQsIDB4REEsIDB4OUMsIDB4QTEsIDB4RDksIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjEsIDB4MkMsIDB4RjIsIDB4QTEsIDB4REIsCisJIDB4MkQsIDB4RjIsIDB4NDEsIDB4NTgsIDB4NTksIDB4REIsIDB4MkUsIDB4RjIsIDB4NTksIDB4REIsIDB4MDMsIDB4NjUsIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4NTEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjIsIDB4ODcsIDB4RjEsCisJIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NDcsIDB4MDcsIDB4RjIsCisJIDB4NjYsIDB4NDUsIDB4NjAsIDB4NDYsIDB4MDYsIDB4RjIsIDB4NjUsIDB4NDYsIDB4MDIsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MUEsIDB4MDIsIDB4MjcsIDB4NDMsCisJIDB4MEIsIDB4NjAsIDB4ODIsIDB4RjMsIDB4REEsIDB4ODEsIDB4NjAsIDB4NDUsIDB4RDUsIDB4ODAsIDB4QTEsIDB4RDEsIDB4MTEsIDB4MDMsIDB4RDMsIDB4ODAsCisJIDB4RDksIDB4ODEsIDB4RkEsIDB4MDIsIDB4QzksIDB4ODEsIDB4QzgsIDB4ODUsIDB4RDUsIDB4ODAsIDB4QTUsIDB4RDMsIDB4MDgsIDB4MjgsIDB4QTEsIDB4REIsCisJIDB4MTcsIDB4NjAsIDB4MDQsIDB4NjIsIDB4NjUsIDB4NDQsIDB4QTIsIDB4REIsIDB4NEEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4MEMsIDB4MDAsIDB4MjcsIDB4NDQsIDB4NDAsIDB4NTgsIDB4MDMsIDB4NjUsIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NTEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjcsIDB4NDMsIDB4RTcsIDB4NjAsIDB4NTgsIDB4NEUsIDB4ODEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4ODcsIDB4RjQsIDB4NjYsIDB4NDEsCisJIDB4NjMsIDB4NDYsIDB4MDUsIDB4RjIsIDB4MDAsIDB4RjAsIDB4ODEsIDB4RjAsIDB4MDIsIDB4MTgsIDB4NjQsIDB4NDYsIDB4ODEsIDB4RjgsIDB4MDcsIDB4MUIsCisJIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDksIDB4MDIsIDB4MDAsIDB4NjUsIDB4NDYsCisJIDB4MDAsIDB4RjgsIDB4ODcsIDB4RjMsIDB4NjMsIDB4NDUsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDQsIDB4ODAsIDB4MDEsIDB4MTgsCisJIDB4RkEsIDB4MDQsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RkEsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsCisJIDB4NjEsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjIsIDB4ODcsIDB4RjEsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4MDIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NDcsIDB4MDcsIDB4RjIsIDB4NjYsIDB4NDUsIDB4NjAsIDB4NDYsIDB4MDYsIDB4RjIsCisJIDB4NjUsIDB4NDYsIDB4MDIsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDYsIDB4MDYsIDB4RjAsCisJIDB4RkYsIDB4NjAsIDB4RUQsIDB4NjQsIDB4QTAsIDB4ODQsIDB4MDYsIDB4RkEsIDB4MjcsIDB4NDMsIDB4ODYsIDB4RjEsIDB4MTcsIDB4NjAsIDB4MDIsIDB4NjEsCisJIDB4QTEsIDB4RDMsIDB4REEsIDB4ODEsIDB4RDAsIDB4ODAsIDB4REMsIDB4OUMsIDB4MDUsIDB4MDUsIDB4QTEsIDB4RDMsIDB4NEEsIDB4RDksIDB4QTAsIDB4REQsCisJIDB4REEsIDB4OUMsIDB4QTEsIDB4RDksIDB4MDcsIDB4NTgsIDB4MDMsIDB4NjUsIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NTEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjcsIDB4NDMsIDB4RTcsIDB4NjAsIDB4NTgsIDB4NEUsIDB4ODEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MjYsIDB4NDYsIDB4MkYsIDB4RjIsIDB4MkMsIDB4RkEsIDB4MzAsIDB4RjIsIDB4MkQsIDB4RkEsIDB4MzEsIDB4RjIsIDB4MkUsIDB4RkEsIDB4Q0IsIDB4RjMsCisJIDB4MkYsIDB4RkEsIDB4Q0MsIDB4RjMsIDB4MzAsIDB4RkEsIDB4Q0QsIDB4RjMsIDB4MzEsIDB4RkEsIDB4NjYsIDB4RjMsIDB4MzIsIDB4RkEsIDB4NjcsIDB4RjMsCisJIDB4MzMsIDB4RkEsIDB4NjgsIDB4RjMsIDB4MzQsIDB4RkEsIDB4QUIsIDB4RjEsIDB4MTksIDB4RjgsIDB4MDAsIDB4NjUsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4REMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjEsIDB4NDQsIDB4MTUsIDB4NjAsIDB4QzIsIDB4RkIsIDB4MDIsIDB4NjMsIDB4M0YsIDB4RkMsIDB4MDAsIDB4NjQsCisJIDB4M0UsIDB4RkEsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjEsIDB4MkMsIDB4RjIsIDB4QTEsIDB4REIsIDB4MkQsIDB4RjIsIDB4NDEsIDB4NTgsIDB4NTksIDB4REIsCisJIDB4MkUsIDB4RjIsIDB4NTksIDB4REIsIDB4MDYsIDB4NjMsIDB4MDcsIDB4RjIsIDB4ODcsIDB4RjEsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MEQsIDB4MDIsIDB4NDMsIDB4NTksIDB4MDIsIDB4NjUsIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsCisJIDB4QzAsIDB4NjQsIDB4MkEsIDB4RkEsIDB4MDAsIDB4RjQsIDB4MDYsIDB4NjQsIDB4MDksIDB4RkEsIDB4MTUsIDB4MDAsIDB4MDcsIDB4RjIsIDB4NjYsIDB4NDUsCisJIDB4NjAsIDB4NDYsIDB4MDYsIDB4RjIsIDB4NjUsIDB4NDYsIDB4MDIsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MUQsIDB4MDIsIDB4MDcsIDB4NjMsIDB4NDMsIDB4NTksCisJIDB4MDEsIDB4NjUsIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4QTAsIDB4NjQsIDB4MkEsIDB4RkEsCisJIDB4MDAsIDB4RjQsIDB4MDcsIDB4NjQsIDB4MDksIDB4RkEsIDB4MjYsIDB4NDYsIDB4ODcsIDB4RjMsIDB4MDcsIDB4RkEsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsCisJIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4QzEsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4REUsIDB4NjAsIDB4NjYsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MjksIDB4RkIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MDMsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUYsIDB4RkIsIDB4REUsIDB4NjAsCisJIDB4MDUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MUUsIDB4RjEsIDB4MDAsIDB4NjAsCisJIDB4MDIsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4NTksIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NzEsIDB4RjMsIDB4ODcsIDB4RjUsCisJIDB4REMsIDB4ODEsIDB4NjYsIDB4NDMsIDB4MDIsIDB4QTMsIDB4NjMsIDB4NDYsIDB4Q0QsIDB4ODEsIDB4MDYsIDB4RjIsIDB4RUUsIDB4MDMsIDB4NjAsIDB4NDAsCisJIDB4MDgsIDB4MkEsIDB4RjcsIDB4MDEsIDB4MEMsIDB4QUMsIDB4MDYsIDB4RkEsIDB4NDYsIDB4NDksIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjEsIDB4QjUsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4QTIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTEsIDB4MDMsIDB4MTgsIDB4NjAsIDB4MTMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MUIsCisJIDB4MDAsIDB4NjAsIDB4QTAsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MkEsIDB4RkEsIDB4QUIsIDB4RkMsIDB4NjYsIDB4NDUsCisJIDB4MjksIDB4NDQsIDB4MDcsIDB4RkEsIDB4MjksIDB4NDYsIDB4MDMsIDB4RjIsIDB4MDQsIDB4RjAsIDB4ODUsIDB4RjIsIDB4NjUsIDB4NDYsIDB4MkMsIDB4RkEsCisJIDB4MkQsIDB4RjgsIDB4QUUsIDB4RkEsIDB4Q0IsIDB4RjMsIDB4MkYsIDB4RkEsIDB4MzIsIDB4RkEsIDB4Q0MsIDB4RjMsIDB4MzAsIDB4RkEsIDB4MzMsIDB4RkEsCisJIDB4Q0QsIDB4RjMsIDB4MzEsIDB4RkEsIDB4MzQsIDB4RkEsIDB4QUIsIDB4RjEsIDB4MTksIDB4RjgsIDB4MTgsIDB4NjcsIDB4MEUsIDB4RkEsIDB4NjYsIDB4NDEsCisJIDB4MjksIDB4NDYsIDB4OTIsIDB4RjAsIDB4MkMsIDB4NjAsIDB4MjYsIDB4NjMsIDB4NDcsIDB4RDMsIDB4NjEsIDB4NDYsIDB4MDAsIDB4N0UsIDB4MTMsIDB4RkEsCisJIDB4MDIsIDB4NjMsIDB4M0YsIDB4RkMsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4NjYsIDB4NDEsIDB4MDAsIDB4RjQsIDB4MTgsIDB4NjAsIDB4MTIsIDB4RjMsCisJIDB4MDksIDB4RkEsIDB4MUUsIDB4NjAsIDB4RTAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjEsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzgsIDB4RkUsIDB4QTAsIDB4MDEsIDB4OTUsIDB4MDEsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MUUsIDB4RkIsIDB4NUEsIDB4REIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDMsIDB4MEIsIDB4NjAsCisJIDB4ODIsIDB4RjMsIDB4REEsIDB4ODEsIDB4NjAsIDB4NDUsIDB4RDUsIDB4ODAsIDB4QTEsIDB4RDEsIDB4MDQsIDB4MDMsIDB4RDMsIDB4ODAsIDB4RDksIDB4ODEsCisJIDB4RkEsIDB4MDIsIDB4MDgsIDB4MDAsIDB4QTEsIDB4REQsIDB4RDksIDB4ODQsIDB4MEIsIDB4NjAsIDB4ODIsIDB4RkIsIDB4NEEsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4REMsIDB4ODQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDUsIDB4NjMsIDB4NDYsIDB4MDYsIDB4RjIsIDB4RkYsIDB4NjAsIDB4MDEsIDB4N0MsIDB4QTAsIDB4OUMsCisJIDB4MDYsIDB4RjgsIDB4NjUsIDB4NDYsIDB4NzAsIDB4RjMsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MDMsIDB4MDAsIDB4Q0MsIDB4ODQsIDB4ODAsIDB4MkIsCisJIDB4NzAsIDB4RkIsIDB4MDgsIDB4NjAsIDB4MUUsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MzAsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MTksIDB4RkIsIDB4REUsIDB4NjAsIDB4QTgsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4NzAsIDB4RjMsIDB4NzEsIDB4RjMsIDB4MDAsIDB4QTgsIDB4NjAsIDB4ODgsIDB4NDMsIDB4MDMsIDB4RTAsIDB4ODMsIDB4NUYsIDB4MDMsIDB4Q0IsIDB4ODMsCisJIDB4ODcsIDB4RjMsIDB4NzIsIDB4RjEsIDB4MDIsIDB4QTQsIDB4NDAsIDB4NDcsIDB4NjQsIDB4NDUsIDB4MjcsIDB4NDYsIDB4NzYsIDB4RjQsIDB4MTIsIDB4RjIsCisJIDB4MzMsIDB4MTgsIDB4RDQsIDB4ODAsIDB4MDIsIDB4NjQsIDB4MzAsIDB4MDcsIDB4MjMsIDB4RkEsIDB4MkEsIDB4RjIsIDB4MEUsIDB4RjIsIDB4MEMsIDB4QjAsCisJIDB4MDIsIDB4RjAsIDB4MEMsIDB4MDIsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4RTcsIDB4MDEsIDB4NjAsIDB4NDAsIDB4RjAsIDB4MzcsCisJIDB4MDgsIDB4MDAsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjQsIDB4RDAsIDB4ODAsIDB4QTIsIDB4RkYsIDB4OEYsIDB4RjMsIDB4MDIsIDB4MDIsIDB4REMsIDB4ODQsCisJIDB4OEYsIDB4RkIsIDB4MUUsIDB4NjAsIDB4RjIsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QTMsIDB4RkYsIDB4Q0UsIDB4RkUsIDB4MjUsIDB4NjAsIDB4RTQsIDB4NjQsIDB4RTUsIDB4NjAsCisJIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4QzksIDB4MDEsIDB4MjcsIDB4NDQsIDB4MDIsIDB4QTQsIDB4NDAsIDB4NDcsIDB4QzUsIDB4MUYsCisJIDB4MjgsIDB4NDMsIDB4Q0IsIDB4ODMsIDB4ODcsIDB4RjMsIDB4MUEsIDB4MEUsIDB4MDIsIDB4QTQsIDB4NDAsIDB4NEMsIDB4NDMsIDB4NDgsIDB4MkMsIDB4NDYsCisJIDB4MjIsIDB4RjIsIDB4NzIsIDB4RjEsIDB4QUMsIDB4ODYsIDB4MTIsIDB4RjIsIDB4MEMsIDB4MDMsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDksIDB4MDcsCisJIDB4MUYsIDB4NjAsIDB4MjAsIDB4NjQsIDB4NDAsIDB4NEIsIDB4RjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkMsIDB4NDYsCisJIDB4QTIsIDB4RkMsIDB4MkMsIDB4NDQsIDB4MDIsIDB4QTQsIDB4MjgsIDB4NDMsIDB4NDAsIDB4NEMsIDB4RTgsIDB4MUYsIDB4OEIsIDB4MDEsIDB4MDEsIDB4NjMsCisJIDB4NjUsIDB4RjMsIDB4QUIsIDB4RjMsIDB4MDAsIDB4QkQsIDB4QUMsIDB4ODEsIDB4MDYsIDB4MDMsIDB4MDUsIDB4MDMsIDB4QjcsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4QzAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDMsIDB4NUIsIDB4RkQsIDB4M0UsIDB4NjMsIDB4MTgsIDB4NjAsIDB4OTQsIDB4NjEsIDB4MDAsIDB4NjQsCisJIDB4NTksIDB4REIsIDB4RkUsIDB4MUYsIDB4NzAsIDB4RkIsIDB4NzEsIDB4RkIsIDB4MTgsIDB4NjAsIDB4REMsIDB4NjUsIDB4QTUsIDB4REYsIDB4NUEsIDB4REYsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4NzAsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MDMsIDB4MDIsCisJIDB4Q0EsIDB4NjAsIDB4N0UsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDUsIDB4NjQsIDB4NDYsIDB4MUYsIDB4RjIsIDB4NjUsIDB4NDYsCisJIDB4NjQsIDB4NDUsIDB4NUIsIDB4RjEsIDB4RTAsIDB4ODQsIDB4NzIsIDB4RjEsIDB4QzAsIDB4ODQsIDB4QzAsIDB4ODQsIDB4MTIsIDB4RkEsIDB4MkMsIDB4RjIsCisJIDB4NzAsIDB4RjMsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MzQsIDB4MDAsIDB4MDAsIDB4QTgsIDB4MTMsIDB4NjAsIDB4NDMsIDB4RjMsIDB4MzYsIDB4MDMsCisJIDB4MDAsIDB4QTgsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDMsIDB4RTEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDYsCisJIDB4MDksIDB4NjAsIDB4MDgsIDB4NjEsIDB4QTIsIDB4RkYsIDB4MEUsIDB4RjIsIDB4MDIsIDB4RjAsIDB4NjAsIDB4NDAsIDB4RjAsIDB4MzcsIDB4MEQsIDB4MDAsCisJIDB4OTEsIDB4RjMsIDB4OEYsIDB4RjMsIDB4REMsIDB4ODMsIDB4RDEsIDB4ODAsIDB4OTEsIDB4RkQsIDB4MEMsIDB4MDMsIDB4OEIsIDB4RjMsIDB4Q0MsIDB4ODMsCisJIDB4RDgsIDB4QTAsIDB4OEYsIDB4RkQsIDB4MDcsIDB4MDQsIDB4RDQsIDB4RkUsIDB4MDUsIDB4MDAsIDB4RDEsIDB4ODAsIDB4OTIsIDB4RjMsIDB4MDIsIDB4MDMsCisJIDB4REMsIDB4ODQsIDB4OTIsIDB4RkIsIDB4MUUsIDB4NjAsIDB4REEsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjUsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QTMsIDB4RkYsIDB4REYsIDB4NjAsIDB4MkEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjYsIDB4NDEsIDB4NjUsIDB4NDYsIDB4MDYsIDB4RjIsIDB4NjEsIDB4NDYsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MkEsIDB4NEIsIDB4MDAsIDB4ODAsIDB4NjcsCisJIDB4QjQsIDB4ODEsIDB4NjEsIDB4NDQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RTEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDYsIDB4MkEsIDB4RjIsCisJIDB4MDksIDB4NjAsIDB4MDgsIDB4NjEsIDB4MEMsIDB4QjAsIDB4QTIsIDB4RkYsIDB4MTcsIDB4MDMsIDB4MEUsIDB4RjIsIDB4MDIsIDB4RjAsIDB4NjAsIDB4NDAsCisJIDB4RjAsIDB4MzcsIDB4MEQsIDB4MDAsIDB4OEYsIDB4RjMsIDB4OTEsIDB4RjMsIDB4Q0MsIDB4ODMsIDB4RDEsIDB4ODAsIDB4OEYsIDB4RkQsIDB4MEMsIDB4MDMsCisJIDB4OEIsIDB4RjMsIDB4REMsIDB4ODMsIDB4RDgsIDB4QTAsIDB4OTEsIDB4RkQsIDB4MDcsIDB4MDQsIDB4RDQsIDB4RkUsIDB4MDUsIDB4MDAsIDB4RDEsIDB4ODAsCisJIDB4OTIsIDB4RjMsIDB4MDIsIDB4MDMsIDB4REMsIDB4ODQsIDB4OTIsIDB4RkIsIDB4MDcsIDB4RjAsIDB4MEEsIDB4RjIsIDB4QTMsIDB4RkYsIDB4NjQsIDB4NDUsCisJIDB4MkYsIDB4MUIsIDB4NjYsIDB4NDEsIDB4NjUsIDB4NDYsIDB4MDIsIDB4RjAsIDB4NjEsIDB4NDYsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjEsIDB4QTEsIDB4ODQsCisJIDB4NjAsIDB4NDEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTEsIDB4ODIsIDB4MDcsIDB4QjQsIDB4MDEsIDB4NjEsIDB4MDMsIDB4MDMsCisJIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MDIsIDB4MTgsIDB4NjAsIDB4OTYsIDB4NjUsIDB4NDYsIDB4RDEsIDB4NjEsIDB4NDQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MTYsIDB4MDAsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjEsIDB4MkEsIDB4RjIsIDB4M0UsIDB4RjIsIDB4MEMsIDB4QjAsIDB4MDEsIDB4QjAsCisJIDB4MDUsIDB4MDMsIDB4MUUsIDB4NjAsIDB4RTYsIDB4NjEsIDB4MDIsIDB4MDIsIDB4MUUsIDB4NjAsIDB4Q0UsIDB4NjEsIDB4NjEsIDB4NDQsIDB4MEYsIDB4NjAsCisJIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsCisJIDB4REYsIDB4NjAsIDB4MkEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjAsIDB4MkIsIDB4RjIsIDB4MkEsIDB4RjIsIDB4NjAsIDB4NDEsIDB4NDQsIDB4NDksCisJIDB4NjAsIDB4NDUsIDB4QTQsIDB4M0EsIDB4MEQsIDB4MDAsIDB4NjEsIDB4NDAsIDB4QzAsIDB4M0IsIDB4NzksIDB4MDAsIDB4QTksIDB4NDYsIDB4MDYsIDB4RjIsCisJIDB4QTksIDB4NDYsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MjYsIDB4NzMsIDB4MDAsIDB4MjAsIDB4QkMsIDB4QTksIDB4NDYsIDB4MDYsIDB4RkEsIDB4QTksIDB4NDYsCisJIDB4QTksIDB4NDYsIDB4MDYsIDB4RjAsIDB4QTksIDB4NDYsIDB4NjUsIDB4NDAsIDB4MTAsIDB4MkIsIDB4NkMsIDB4MDAsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MkEsCisJIDB4MzUsIDB4MDAsIDB4NjUsIDB4NDAsIDB4QTQsIDB4M0EsIDB4NjMsIDB4MDAsIDB4MjksIDB4NDUsIDB4NjUsIDB4NDYsIDB4NzYsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MDQsIDB4MDIsIDB4NzYsIDB4MDAsIDB4RTAsIDB4NjAsIDB4RUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDksIDB4RjIsCisJIDB4MkEsIDB4RjAsIDB4MDAsIDB4QTgsIDB4MjAsIDB4NjcsIDB4MDIsIDB4MDMsIDB4QjAsIDB4ODQsIDB4MkEsIDB4RkEsIDB4MEUsIDB4RjIsIDB4MDIsIDB4RjAsCisJIDB4NjAsIDB4NDAsIDB4RjAsIDB4MzcsIDB4MDgsIDB4MDAsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjQsIDB4RDAsIDB4ODAsIDB4QTIsIDB4RkYsIDB4OEYsIDB4RjMsCisJIDB4MDIsIDB4MDIsIDB4REMsIDB4ODQsIDB4OEYsIDB4RkIsIDB4M0UsIDB4RjIsIDB4QTMsIDB4RkYsIDB4MDEsIDB4QjAsIDB4MUUsIDB4NjAsIDB4RTYsIDB4NjEsCisJIDB4MDIsIDB4MDIsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjEsIDB4NjEsIDB4NDQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MTYsIDB4MDAsIDB4MTAsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4REYsIDB4NjUsIDB4QTQsIDB4OUUsIDB4QTksIDB4NDYsIDB4MDYsIDB4RkEsIDB4QTksIDB4NDYsIDB4QTIsIDB4RkYsIDB4MDQsIDB4NjQsIDB4MEMsIDB4NjAsCisJIDB4NkUsIDB4RkIsIDB4MjksIDB4NDQsIDB4NUEsIDB4REIsIDB4NzAsIDB4RjMsIDB4QzEsIDB4RkUsIDB4RDQsIDB4RkUsIDB4ODYsIDB4RjEsIDB4QTMsIDB4RkYsCisJIDB4RDAsIDB4ODAsIDB4REMsIDB4ODQsIDB4MDEsIDB4MDcsIDB4NzAsIDB4RkIsIDB4QTksIDB4NDYsIDB4NzYsIDB4RjIsIDB4QTksIDB4NDYsIDB4NjQsIDB4MTgsCisJIDB4QTksIDB4NDYsIDB4MDIsIDB4RjAsIDB4QTksIDB4NDYsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjEsIDB4QTEsIDB4ODQsIDB4NjAsIDB4NDEsIDB4RTksIDB4ODEsCisJIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTEsIDB4ODIsIDB4MDcsIDB4QjQsIDB4MDEsIDB4NjEsIDB4MDMsIDB4MDMsIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsCisJIDB4RkQsIDB4MDIsIDB4MTgsIDB4NjAsIDB4OTYsIDB4NjUsIDB4NDYsIDB4RDEsIDB4RkYsIDB4RkYsIDB4QjEsIDB4ODQsIDB4QTIsIDB4REIsIDB4RTEsIDB4NjAsCisJIDB4MDEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MkEsIDB4RkEsIDB4MDEsIDB4RkYsIDB4NjAsIDB4RUYsIDB4NjQsIDB4QTAsIDB4ODQsCisJIDB4QTksIDB4NDYsIDB4MDYsIDB4RkEsIDB4QTksIDB4NDYsIDB4NjUsIDB4NDEsIDB4NzAsIDB4RjMsIDB4MjksIDB4NDUsIDB4Q0MsIDB4ODQsIDB4ODAsIDB4MkIsCisJIDB4NzAsIDB4RkIsIDB4NjUsIDB4NDYsIDB4NzYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MzYsIDB4MDIsIDB4NjEsIDB4NDAsCisJIDB4QTQsIDB4M0EsIDB4RTUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4M0EsIDB4NjEsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OUYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4ODMsIDB4MDMsIDB4MDIsIDB4NjAsIDB4NDgsIDB4NjQsIDB4MkEsIDB4RkEsIDB4Q0IsIDB4RjEsIDB4MkYsIDB4RjgsIDB4Q0MsIDB4RjEsIDB4MzAsIDB4RjgsCisJIDB4Q0QsIDB4RjEsIDB4MzEsIDB4RjgsIDB4NjYsIDB4RjEsIDB4MzIsIDB4RjgsIDB4NjcsIDB4RjEsIDB4MzMsIDB4RjgsIDB4NjgsIDB4RjEsIDB4MzQsIDB4RjgsCisJIDB4QTksIDB4NDYsIDB4MDMsIDB4RjIsIDB4MDQsIDB4RjAsIDB4ODUsIDB4RjAsIDB4QTksIDB4NDYsIDB4MkMsIDB4RkEsIDB4MkQsIDB4RjgsIDB4QUUsIDB4RjgsCisJIDB4QUIsIDB4RjEsIDB4MTksIDB4RjgsIDB4RkYsIDB4NjcsIDB4MEUsIDB4RkEsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4M0YsIDB4RkEsIDB4MjksIDB4NDQsCisJIDB4MDcsIDB4RkEsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MzUsIDB4MDAsIDB4ODAsIDB4NjcsIDB4QjQsIDB4ODMsIDB4MkEsIDB4RjIsCisJIDB4MDksIDB4NjAsIDB4MDgsIDB4NjUsIDB4MEMsIDB4QjAsIDB4MDksIDB4RjAsIDB4MEMsIDB4MDIsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsIDB4MEYsIDB4NjAsCisJIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4OUYsIDB4MTgsCisJIDB4NjQsIDB4NDYsIDB4M0UsIDB4RjIsIDB4QTIsIDB4RkYsIDB4MDEsIDB4QjAsIDB4MUUsIDB4NjAsIDB4RTYsIDB4NjEsIDB4MDIsIDB4MDIsIDB4MUUsIDB4NjAsCisJIDB4Q0UsIDB4NjEsIDB4MDIsIDB4RjIsIDB4MEUsIDB4RjAsIDB4RDQsIDB4ODAsIDB4MDksIDB4RjQsIDB4MDYsIDB4MDIsIDB4OEYsIDB4RjMsIDB4NjQsIDB4NDAsCisJIDB4RjAsIDB4MzcsIDB4MDIsIDB4MDAsIDB4REMsIDB4ODQsIDB4OEYsIDB4RkIsIDB4NjYsIDB4NDQsIDB4MDAsIDB4QTgsIDB4RkYsIDB4RkYsIDB4RjEsIDB4MDIsCisJIDB4NjEsIDB4NDQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NUEsIDB4REQsIDB4MDgsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4QzEsIDB4RkUsIDB4QTMsIDB4RkYsIDB4QTksIDB4NDYsIDB4MDIsIDB4RjAsIDB4QTksIDB4NDYsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjEsIDB4QTEsIDB4ODQsCisJIDB4NjAsIDB4NDEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTEsIDB4ODIsIDB4MDcsIDB4QjQsIDB4MDEsIDB4NjEsIDB4MDMsIDB4MDMsCisJIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MDIsIDB4MTgsIDB4NjAsIDB4OTYsIDB4NjUsIDB4NDYsIDB4RDMsIDB4OUQsIDB4ODUsIDB4QTQsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MjYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDYsIDB4NDUsIDB4M0YsIDB4RjIsIDB4MDUsIDB4NDgsIDB4MDAsIDB4QTgsCisJIDB4NjAsIDB4NDEsIDB4NjYsIDB4NDQsIDB4MEIsIDB4MDMsIDB4MEUsIDB4QTEsIDB4MDAsIDB4RjIsIDB4NDIsIDB4RkUsIDB4QUMsIDB4ODYsIDB4MDEsIDB4RjIsCisJIDB4MUYsIDB4MDMsIDB4N0YsIDB4QjUsIDB4RDUsIDB4ODEsIDB4NjYsIDB4NDQsIDB4RjcsIDB4MDcsIDB4MjUsIDB4NDYsIDB4MDUsIDB4RjAsIDB4MDYsIDB4RkEsCisJIDB4MDUsIDB4RkEsIDB4RDAsIDB4ODAsIDB4NjQsIDB4NDMsIDB4MTMsIDB4MDMsIDB4NjAsIDB4NDYsIDB4MDEsIDB4RjAsIDB4ODAsIDB4NjcsIDB4QjAsIDB4ODQsCisJIDB4MDEsIDB4RkEsIDB4MDAsIDB4RjAsIDB4MDAsIDB4NjQsIDB4MDAsIDB4RkEsIDB4NDQsIDB4NDUsIDB4QTIsIDB4RkYsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4NzIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4RkYsIDB4MDgsIDB4NDUsIDB4MjUsIDB4NDYsIDB4MDEsIDB4NjQsIDB4MDIsIDB4RkEsIDB4MDIsIDB4RkUsCisJIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4RjIsIDB4MDcsIDB4RjAsIDB4MTAsIDB4QjAsIDB4MTAsIDB4QUMsIDB4M0EsIDB4MDMsIDB4MjMsIDB4RkEsCisJIDB4ODAsIDB4NjcsIDB4QjAsIDB4ODEsIDB4NjEsIDB4NDQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDQsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4NDYsIDB4NDUsIDB4NjQsIDB4NDYsIDB4MDIsIDB4RjAsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjEsCisJIDB4QTEsIDB4ODQsIDB4NjAsIDB4NDEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTEsIDB4ODIsIDB4MDcsIDB4QjQsIDB4MDEsIDB4NjEsCisJIDB4MDMsIDB4MDMsIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MDIsIDB4MTgsIDB4NjAsIDB4OTYsIDB4NjUsIDB4NDYsIDB4RDEsIDB4RkYsIDB4RkYsCisJIDB4QjEsIDB4ODQsIDB4QTIsIDB4REIsIDB4OUYsIDB4RjIsIDB4MjUsIDB4NDYsIDB4RTEsIDB4ODEsIDB4NUIsIDB4RjEsIDB4NzIsIDB4RjEsIDB4QzEsIDB4ODEsCisJIDB4QzEsIDB4ODEsIDB4OTIsIDB4RkEsIDB4QTIsIDB4RkYsIDB4MDIsIDB4RjAsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjEsIDB4RDEsIDB4ODAsIDB4MEUsIDB4RjIsCisJIDB4MDUsIDB4MDIsIDB4OEYsIDB4RjMsIDB4MjAsIDB4QjAsIDB4Q0MsIDB4ODQsIDB4MDEsIDB4MDIsIDB4OEYsIDB4RkIsIDB4QTMsIDB4RkYsIDB4NDgsIDB4RkUsCisJIDB4MDcsIDB4MDAsIDB4MEUsIDB4RjIsIDB4MDgsIDB4RkUsIDB4RjAsIDB4N0YsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MkEsIDB4MDAsIDB4N0YsIDB4MEUsIDB4RkEsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4QzUsIDB4NjEsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QTIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjYsIDB4NDQsIDB4NTcsIDB4RkIsIDB4MDQsIDB4NjQsIDB4MDMsIDB4RkEsIDB4ODAsIDB4NjQsIDB4MkEsIDB4RkEsIDB4QUIsIDB4RjEsIDB4MTksIDB4RjgsCisJIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4MDAsIDB4NjAsIDB4ODAsIDB4NjQsIDB4MEUsIDB4RkEsIDB4ODcsIDB4RjEsIDB4MDcsIDB4RjgsIDB4NjcsIDB4NDQsCisJIDB4MkMsIDB4RkEsIDB4MkQsIDB4RkEsIDB4MkUsIDB4RkEsIDB4RTQsIDB4NjAsIDB4NjUsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MjUsIDB4RkIsIDB4RTIsIDB4NjAsCisJIDB4QTAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MkIsIDB4RkIsIDB4MTgsIDB4NjAsIDB4RTYsIDB4NjMsIDB4NjUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MTAsIDB4NjAsCisJIDB4NTgsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDIsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDYsIDB4NjQsIDB4QTMsIDB4REIsIDB4RTksIDB4NjAsIDB4QjIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4RTksIDB4NjAsIDB4NTgsIDB4NEQsIDB4QkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTcsIDB4RjUsIDB4Q0IsIDB4RjEsIDB4MkYsIDB4RjgsCisJIDB4Q0MsIDB4RjEsIDB4MzAsIDB4RjgsIDB4Q0QsIDB4RjEsIDB4MzEsIDB4RjgsIDB4NjYsIDB4RjEsIDB4MzIsIDB4RjgsIDB4NjcsIDB4RjEsIDB4MzMsIDB4RjgsCisJIDB4NjgsIDB4RjEsIDB4MzQsIDB4RjgsIDB4MTMsIDB4NjAsIDB4NDUsIDB4RjEsIDB4MDEsIDB4NjQsIDB4NjQsIDB4NDAsIDB4RkUsIDB4MjYsIDB4MTAsIDB4QkMsCisJIDB4MzIsIDB4NDAsIDB4MTAsIDB4MjYsIDB4MTAsIDB4QkMsIDB4MjAsIDB4QkMsIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjUsIDB4NjAsIDB4NDQsIDB4QjQsIDB4ODQsCisJIDB4MTcsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MTMsIDB4NjAsIDB4NDQsIDB4RjEsIDB4MjYsIDB4NjAsIDB4MTYsIDB4NjQsIDB4MDIsIDB4MTgsIDB4MjYsIDB4NjAsCisJIDB4MzgsIDB4NjQsIDB4MTYsIDB4NjAsIDB4QkYsIDB4RkIsIDB4MTYsIDB4NjAsIDB4Q0YsIDB4RkIsIDB4MkMsIDB4NjAsIDB4ODQsIDB4NjEsIDB4MTMsIDB4NjAsCisJIDB4OTcsIDB4RjMsIDB4MkQsIDB4NjAsIDB4NUUsIDB4NjUsIDB4RkUsIDB4QTQsIDB4RTAsIDB4ODQsIDB4MDIsIDB4MDUsIDB4NjcsIDB4NDQsIDB4MjEsIDB4MDAsCisJIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODUsIDB4MTYsIDB4NjAsIDB4NTUsIDB4RjMsIDB4QTUsIDB4RDEsIDB4REEsIDB4ODUsIDB4QTAsIDB4ODMsIDB4MTYsIDB4NjAsCisJIDB4NTEsIDB4RkQsIDB4QTUsIDB4RDEsIDB4MkMsIDB4NjAsIDB4QTAsIDB4NjIsIDB4QTAsIDB4ODMsIDB4QTIsIDB4REQsIDB4MkMsIDB4NjAsIDB4ODQsIDB4NjEsCisJIDB4NTAsIDB4NjAsIDB4MDAsIDB4N0MsIDB4MDAsIDB4NjAsIDB4RjIsIDB4NjUsIDB4RTIsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTYsIDB4NjAsIDB4NTMsIDB4RjEsIDB4NTksIDB4RDksIDB4MkMsIDB4NjAsIDB4N0UsIDB4NjUsIDB4RDUsIDB4ODQsIDB4REQsIDB4N0YsIDB4QTUsIDB4REIsCisJIDB4NjUsIDB4NDQsIDB4MTYsIDB4NjAsIDB4QzQsIDB4RkIsIDB4MTYsIDB4NjAsIDB4RDQsIDB4RkIsIDB4NzksIDB4MDAsIDB4MTYsIDB4NjAsIDB4NTQsIDB4RjMsCisJIDB4MkMsIDB4NjAsIDB4QTAsIDB4NjIsIDB4RkQsIDB4QTAsIDB4QTIsIDB4RDMsIDB4RUUsIDB4MDMsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDIsIDB4MDAsCisJIDB4MDEsIDB4NjMsIDB4MEIsIDB4MDAsIDB4MDQsIDB4MkEsIDB4MDIsIDB4MDAsIDB4MDIsIDB4NjMsIDB4MDcsIDB4MDAsIDB4MTAsIDB4MkEsIDB4MDIsIDB4MDAsCisJIDB4MDQsIDB4NjMsIDB4MDMsIDB4MDAsIDB4MjAsIDB4MkEsIDB4MDEsIDB4MDAsIDB4MDUsIDB4NjMsIDB4NjMsIDB4NDcsIDB4QjQsIDB4ODMsIDB4NTksIDB4RDksCisJIDB4NTksIDB4REQsIDB4MTYsIDB4NjAsIDB4NTQsIDB4RjMsIDB4MTYsIDB4NjAsIDB4NTEsIDB4RjMsIDB4RkUsIDB4QTAsIDB4NDAsIDB4NEMsIDB4RDMsIDB4MDMsCisJIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjMsIDB4NTksIDB4REQsIDB4NDEsIDB4NEEsIDB4MkMsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDUsIDB4MDAsIDB4MDAsIDB4NjMsCisJIDB4NjMsIDB4NDcsIDB4QjQsIDB4ODMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4MkMsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDEsIDB4NjMsCisJIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4MkMsIDB4NDAsIDB4MDQsIDB4MkEsIDB4MDUsIDB4MDAsIDB4MDIsIDB4NjMsIDB4NjMsIDB4NDcsIDB4QjQsIDB4ODMsCisJIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4MkMsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MDUsIDB4MDAsIDB4MDQsIDB4NjMsIDB4NjMsIDB4NDcsIDB4QjQsIDB4ODMsCisJIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4MkMsIDB4NDAsIDB4MjAsIDB4MkEsIDB4MDUsIDB4MDAsIDB4MDUsIDB4NjMsIDB4NjMsIDB4NDcsIDB4QjQsIDB4ODMsCisJIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4MkEsIDB4NDQsIDB4NTEsIDB4OTMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4QTAsIDB4REQsIDB4MTYsIDB4NjAsCisJIDB4NTQsIDB4RjMsIDB4MTYsIDB4NjAsIDB4NTIsIDB4RjMsIDB4RkYsIDB4QTAsIDB4NDAsIDB4NEMsIDB4OUQsIDB4MDMsIDB4NTksIDB4REYsIDB4NDEsIDB4NEEsCisJIDB4MkMsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDUsIDB4MDAsIDB4MDAsIDB4NjMsIDB4NjMsIDB4NDcsIDB4QjQsIDB4ODMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsCisJIDB4MkMsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDUsIDB4MDAsIDB4MDEsIDB4NjMsIDB4NjMsIDB4NDcsIDB4QjQsIDB4ODMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsCisJIDB4MkMsIDB4NDAsIDB4MDQsIDB4MkEsIDB4MDUsIDB4MDAsIDB4MDIsIDB4NjMsIDB4NjMsIDB4NDcsIDB4QjQsIDB4ODMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsCisJIDB4MkEsIDB4NDQsIDB4NTEsIDB4OTMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4QTAsIDB4REQsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NTcsIDB4RjUsCisJIDB4Q0IsIDB4RjMsIDB4Q0MsIDB4RjEsIDB4MDAsIDB4NjMsIDB4QzAsIDB4ODcsIDB4Q0QsIDB4RjEsIDB4NUEsIDB4RkQsIDB4QzAsIDB4ODUsIDB4NjUsIDB4NDcsCisJIDB4QzQsIDB4ODQsIDB4MDcsIDB4QjUsIDB4MTgsIDB4NjAsIDB4RTIsIDB4NjQsIDB4MEYsIDB4NjAsIDB4QTUsIDB4RkIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MjQsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MTMsIDB4RkIsIDB4RTIsIDB4NjAsIDB4QTksIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4NjAsIDB4MTIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MjQsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NTcsIDB4RjUsIDB4MDAsIDB4NjQsIDB4OTQsIDB4RkIsCisJIDB4OTUsIDB4RkIsIDB4OTYsIDB4RkIsIDB4NzQsIDB4RkIsIDB4NjUsIDB4RjMsIDB4MDAsIDB4NzUsIDB4MDAsIDB4NzIsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4OTMsIDB4QzcsIDB4RjMsIDB4RUQsIDB4RTIsIDB4Q0MsIDB4ODQsIDB4NUEsIDB4RkIsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MTMsIDB4RkIsIDB4RTIsIDB4NjAsIDB4QzcsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsCisJIDB4MjQsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjQsIDB4RjEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MDUsIDB4MDAsCisJIDB4NjcsIDB4NDQsIDB4MTYsIDB4NjAsIDB4QzEsIDB4RkIsIDB4MTYsIDB4NjAsIDB4RDEsIDB4RkIsIDB4MTYsIDB4NjAsIDB4RjYsIDB4RjksIDB4MkQsIDB4NjAsCisJIDB4ODYsIDB4NjUsIDB4RTQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MkIsIDB4MDUsIDB4MDAsIDB4RkYsIDB4NjAsIDB4RkYsIDB4NjMsIDB4MTYsIDB4NjAsIDB4QzUsIDB4RkQsIDB4MDgsIDB4MDAsIDB4MkUsIDB4NjAsCisJIDB4MUUsIDB4NjMsIDB4MTYsIDB4NjAsIDB4QzUsIDB4RkQsIDB4RTQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RkYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTQsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4NkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MTgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTcsIDB4RjUsCisJIDB4MDAsIDB4RjQsIDB4NjUsIDB4RjEsIDB4MDYsIDB4RjgsIDB4MTcsIDB4NjAsIDB4MjIsIDB4RjMsIDB4MTUsIDB4NjAsIDB4REQsIDB4RjEsIDB4RkIsIDB4NjAsCisJIDB4RkYsIDB4NjUsIDB4NjAsIDB4NDQsIDB4QTQsIDB4ODQsIDB4NjAsIDB4NDcsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MjYsIDB4MDQsIDB4QkMsIDB4NjAsIDB4NDcsCisJIDB4MDcsIDB4RkEsIDB4MkQsIDB4NjAsIDB4N0UsIDB4NjQsIDB4NDAsIDB4NDgsIDB4MTAsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4RTQsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4QTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTcsIDB4RjUsIDB4M0YsIDB4RkMsIDB4NUEsIDB4RjMsIDB4QzcsIDB4RjEsIDB4QUMsIDB4ODMsCisJIDB4MDEsIDB4NjQsIDB4MDIsIDB4MDIsIDB4NkIsIDB4RkIsIDB4NjQsIDB4NDMsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsCisJIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDQsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4Q0YsIDB4ODMsCisJIDB4NzIsIDB4RjMsIDB4NUEsIDB4RkQsIDB4REMsIDB4ODQsIDB4NzIsIDB4RkIsIDB4NUMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4NUMsIDB4RkIsCisJIDB4MDMsIDB4MDMsIDB4RTMsIDB4NjAsIDB4QkQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4NjQsIDB4NUMsIDB4RkIsIDB4QTIsIDB4NEMsIDB4MjAsIDB4MjcsCisJIDB4RjgsIDB4MDEsIDB4NDYsIDB4NjAsIDB4NTAsIDB4NjUsIDB4NzIsIDB4NDQsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4RjIsIDB4MDQsIDB4NUQsIDB4RkIsCisJIDB4NDAsIDB4NDgsIDB4OTQsIDB4RjMsIDB4NUUsIDB4RkIsIDB4NDAsIDB4NEEsIDB4OTUsIDB4RjMsIDB4OTYsIDB4RjMsIDB4NDAsIDB4NEMsIDB4NjAsIDB4NDEsCisJIDB4NjUsIDB4RjEsIDB4NDAsIDB4NjMsIDB4QUQsIDB4ODAsIDB4RjAsIDB4QTMsIDB4MDksIDB4MDIsIDB4M0MsIDB4MDMsIDB4MkMsIDB4NDEsIDB4MkEsIDB4NDQsCisJIDB4NDAsIDB4NEMsIDB4MjgsIDB4NDQsIDB4NDAsIDB4NEEsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NDgsIDB4RjQsIDB4MDEsIDB4RDEsIDB4ODAsIDB4MDEsIDB4MDIsCisJIDB4MzEsIDB4MDQsIDB4MTAsIDB4QTMsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4QTUsIDB4ODAsIDB4Q0YsIDB4ODMsIDB4MDgsIDB4MDIsIDB4MjgsIDB4NDQsCisJIDB4NjAsIDB4ODgsIDB4MkEsIDB4NDQsIDB4NzAsIDB4OEEsIDB4MkMsIDB4NDQsIDB4NzAsIDB4OEMsIDB4RjEsIDB4ODEsIDB4RjUsIDB4MDEsIDB4RTcsIDB4QTMsCisJIDB4NjQsIDB4NDQsIDB4MDAsIDB4QTAsIDB4MDAsIDB4NjIsIDB4MDIsIDB4MDIsIDB4MDAsIDB4NjEsIDB4MUMsIDB4MDAsIDB4RTAsIDB4ODQsIDB4REUsIDB4ODIsCisJIDB4RkQsIDB4MDQsIDB4NDIsIDB4RkUsIDB4RjgsIDB4ODQsIDB4NjIsIDB4NDUsIDB4QzcsIDB4ODMsIDB4NjAsIDB4NDUsIDB4MDIsIDB4RkUsIDB4RDUsIDB4ODQsCisJIDB4MDIsIDB4MDUsIDB4MDEsIDB4MDUsIDB4NjEsIDB4NDQsIDB4Q0YsIDB4ODMsIDB4NjAsIDB4NDEsIDB4MDgsIDB4MDMsIDB4MjgsIDB4NDQsIDB4NjAsIDB4ODgsCisJIDB4MkEsIDB4NDQsIDB4NzAsIDB4OEEsIDB4MkMsIDB4NDQsIDB4NzAsIDB4OEMsIDB4RjEsIDB4ODEsIDB4RjEsIDB4MDEsIDB4Q0UsIDB4ODIsIDB4RTksIDB4ODEsCisJIDB4RkQsIDB4MDIsIDB4RjEsIDB4ODEsIDB4NjEsIDB4NDQsIDB4MDAsIDB4QTgsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDMsIDB4NzMsIDB4NDAsIDB4NUQsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4NUUsIDB4RjMsIDB4M0YsIDB4QjUsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QjQsIDB4ODQsIDB4NjEsIDB4NDUsIDB4RDQsIDB4ODQsIDB4QzAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODEsIDB4NjQsIDB4NDQsIDB4NzMsIDB4NDUsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODUsIDB4NjEsIDB4NDQsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MEYsIDB4MDMsIDB4NjAsIDB4NTMsIDB4RDQsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4NzQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4MDEsIDB4QjQsIDB4NzQsIDB4RkIsIDB4MTMsIDB4NjAsIDB4MDYsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4MDAsIDB4MzYsIDB4MDAsIDB4M0IsIDB4QTIsIDB4REIsIDB4RTksIDB4NjAsIDB4RkIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4QzEsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4NjQsIDB4MDMsIDB4RkEsIDB4MDAsIDB4RjQsIDB4MDksIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDcsIDB4MDAsIDB4M0EsIDB4MUMsIDB4MDAsIDB4NjAsIDB4NDMsIDB4MDAsIDB4MzYsIDB4MUMsIDB4MDAsIDB4RTAsIDB4QTAsIDB4REEsIDB4ODUsCisJIDB4MTYsIDB4MDcsIDB4MjYsIDB4NjAsIDB4MTYsIDB4NjEsIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4RDMsIDB4ODAsIDB4Q0IsIDB4ODMsIDB4MEYsIDB4MDIsCisJIDB4MDcsIDB4MEUsIDB4NTksIDB4RDMsIDB4QTUsIDB4RDAsIDB4REEsIDB4ODUsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDIsIDB4RjksIDB4MUYsCisJIDB4MTIsIDB4MUUsIDB4QTUsIDB4RDAsIDB4NTksIDB4RDMsIDB4RkYsIDB4RkYsIDB4OTAsIDB4ODAsIDB4RkYsIDB4MjIsIDB4MEMsIDB4MDAsIDB4RTQsIDB4NjAsCisJIDB4NjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTMsIDB4NjAsIDB4NDQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsCisJIDB4MjYsIDB4NjAsIDB4MzgsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MjYsIDB4NjAsIDB4MTYsIDB4NjQsIDB4MTYsIDB4NjAsIDB4Q0YsIDB4RkIsIDB4MjYsIDB4NDYsCisJIDB4MkYsIDB4RjIsIDB4MkMsIDB4RkEsIDB4MzAsIDB4RjIsIDB4MkQsIDB4RkEsIDB4MzEsIDB4RjIsIDB4MkUsIDB4RkEsIDB4Q0IsIDB4RjEsIDB4MkYsIDB4RjgsCisJIDB4Q0MsIDB4RjEsIDB4MzAsIDB4RjgsIDB4Q0QsIDB4RjEsIDB4MzEsIDB4RjgsIDB4NjYsIDB4RjEsIDB4MzIsIDB4RjgsIDB4NjcsIDB4RjEsIDB4MzMsIDB4RjgsCisJIDB4NjgsIDB4RjEsIDB4MzQsIDB4RjgsIDB4MDAsIDB4NjUsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4REMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjEsIDB4NDQsCisJIDB4MTUsIDB4NjAsIDB4QzIsIDB4RkIsIDB4NTAsIDB4NjMsIDB4MkEsIDB4RkMsIDB4QUIsIDB4RjMsIDB4MTksIDB4RkEsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsCisJIDB4ODcsIDB4RjMsIDB4MDcsIDB4RkEsIDB4MDAsIDB4RjQsIDB4NjUsIDB4RjEsIDB4MDYsIDB4RjgsIDB4MTcsIDB4NjAsIDB4MjIsIDB4RjMsIDB4MTUsIDB4NjAsCisJIDB4REQsIDB4RjEsIDB4RkIsIDB4NjAsIDB4RkYsIDB4QjcsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MjYsIDB4MDQsIDB4QkMsIDB4NjAsIDB4NDcsIDB4MDcsIDB4RkEsCisJIDB4MkQsIDB4NjAsIDB4QTYsIDB4NjUsIDB4RTQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjQsIDB4RjMsIDB4MkUsIDB4NjAsCisJIDB4MUUsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NjcsIDB4NDMsIDB4MTYsIDB4NjAsIDB4RDUsIDB4RkQsIDB4MkQsIDB4NjAsIDB4OUUsIDB4NjQsCisJIDB4NDAsIDB4NDgsIDB4MTAsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4RTQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QTcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjYsIDB4NDYsIDB4M0YsIDB4RkMsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MjAsIDB4NDQsIDB4ODAsIDB4MjYsIDB4MTEsIDB4MDAsCisJIDB4ODAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4MDAsIDB4NjQsIDB4OTQsIDB4RkIsIDB4OTUsIDB4RkIsIDB4OTYsIDB4RkIsIDB4NzQsIDB4RkIsIDB4NjUsIDB4RjMsCisJIDB4MDAsIDB4NzUsIDB4MDAsIDB4NzIsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4OTMsIDB4QzcsIDB4RjMsIDB4RUQsIDB4RTIsIDB4Q0MsIDB4ODQsCisJIDB4NUEsIDB4RkIsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTIsIDB4RkIsCisJIDB4NUEsIDB4REIsIDB4MDAsIDB4NjQsIDB4NzIsIDB4RkIsIDB4NzQsIDB4RkIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4M0UsIDB4NjMsIDB4MTgsIDB4NjAsCisJIDB4OTQsIDB4NjEsIDB4NTksIDB4RDEsIDB4NjEsIDB4NDYsIDB4MDcsIDB4MUIsIDB4RkMsIDB4MUYsIDB4MkQsIDB4NjAsIDB4QzgsIDB4NjIsIDB4QTIsIDB4REYsCisJIDB4MDEsIDB4NjUsIDB4MDAsIDB4NjEsIDB4MTYsIDB4MDAsIDB4MTgsIDB4NjAsIDB4RDYsIDB4NjEsIDB4NDksIDB4RDEsIDB4Q0IsIDB4ODMsIDB4RkQsIDB4MTgsCisJIDB4NjMsIDB4NDEsIDB4MDQsIDB4QTEsIDB4NjEsIDB4NDUsIDB4NjYsIDB4NDMsIDB4MkQsIDB4NjAsIDB4QzgsIDB4NjQsIDB4REMsIDB4ODQsIDB4NjAsIDB4RkUsCisJIDB4QkQsIDB4RDEsIDB4QTAsIDB4RDksIDB4Q0QsIDB4ODEsIDB4MjAsIDB4RkUsIDB4RjksIDB4MDIsIDB4NjYsIDB4NDQsIDB4MTgsIDB4NjAsIDB4OTYsIDB4N0MsCisJIDB4RDAsIDB4ODEsIDB4NUEsIDB4RjMsIDB4QzcsIDB4RjEsIDB4MkQsIDB4NjAsIDB4QzYsIDB4NjMsIDB4MDAsIDB4QTAsIDB4NjQsIDB4NUYsIDB4QkQsIDB4REIsCisJIDB4MEYsIDB4NjAsIDB4NkQsIDB4RjEsIDB4MDIsIDB4MDIsIDB4MDEsIDB4MTgsIDB4MDEsIDB4QjksIDB4NjEsIDB4NDQsIDB4NjAsIDB4RkUsIDB4QTMsIDB4REIsCisJIDB4RkMsIDB4QTMsIDB4NjUsIDB4NDQsIDB4MDMsIDB4QTQsIDB4QTMsIDB4REIsIDB4MjAsIDB4RkUsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTcsIDB4NjAsCisJIDB4MjMsIDB4RkIsIDB4Q0QsIDB4ODEsIDB4MjgsIDB4RDMsIDB4NUEsIDB4ODgsIDB4REMsIDB4ODMsIDB4MzEsIDB4MTgsIDB4RkIsIDB4MDMsIDB4NjEsIDB4NDAsCisJIDB4N0YsIDB4M0EsIDB4MDYsIDB4MDAsIDB4MTcsIDB4NjAsIDB4MjMsIDB4RjMsIDB4MDMsIDB4NjEsIDB4N0MsIDB4QTQsIDB4QTIsIDB4REIsIDB4MDAsIDB4RjQsCisJIDB4NjAsIDB4RkUsIDB4QTMsIDB4RDEsIDB4NUQsIDB4RDgsIDB4NjEsIDB4NDAsIDB4N0YsIDB4M0EsIDB4MDgsIDB4MDAsIDB4MjAsIDB4RkUsIDB4MTcsIDB4NjAsCisJIDB4MjMsIDB4RjMsIDB4MDMsIDB4NjEsIDB4N0MsIDB4QTQsIDB4QTIsIDB4REIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4RkUsIDB4QkYsIDB4RDMsIDB4NUQsIDB4REEsCisJIDB4RkYsIDB4QjQsIDB4MDAsIDB4N0YsIDB4MTIsIDB4MDMsIDB4REYsIDB4ODMsIDB4NjEsIDB4NDAsIDB4N0YsIDB4M0EsIDB4MEEsIDB4MDAsIDB4MjAsIDB4RkUsCisJIDB4NjAsIDB4NDUsIDB4MTcsIDB4NjAsIDB4MjMsIDB4RjMsIDB4MDMsIDB4NjEsIDB4N0MsIDB4QTQsIDB4QTIsIDB4REIsIDB4NjUsIDB4NDQsIDB4MDAsIDB4RjQsCisJIDB4NjAsIDB4RkUsIDB4QkQsIDB4RDEsIDB4Q0MsIDB4ODQsIDB4NUQsIDB4RDgsIDB4RUYsIDB4MDIsIDB4MjAsIDB4RkUsIDB4Q0IsIDB4MDEsIDB4MTcsIDB4NjAsCisJIDB4MjMsIDB4RjEsIDB4RkQsIDB4QTEsIDB4RkYsIDB4QjEsIDB4QzEsIDB4ODMsIDB4QTIsIDB4REQsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjcsIDB4NUMsCisJIDB4MTQsIDB4NjAsIDB4MjYsIDB4NjEsIDB4QTEsIDB4RDMsIDB4QTUsIDB4RDksIDB4MTAsIDB4MTgsIDB4NjAsIDB4NDMsIDB4MkQsIDB4NjAsIDB4RUUsIDB4NjQsCisJIDB4QTUsIDB4REIsIDB4NjAsIDB4RkUsIDB4QTAsIDB4REQsIDB4MjAsIDB4RkUsIDB4REMsIDB4ODQsIDB4Q0YsIDB4ODMsIDB4RTMsIDB4ODMsIDB4NTksIDB4RDEsCisJIDB4REMsIDB4ODQsIDB4NjAsIDB4RkUsIDB4QTAsIDB4RDksIDB4MjAsIDB4RkUsIDB4RkEsIDB4MUYsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsCisJIDB4REMsIDB4RjEsIDB4MTUsIDB4NjAsIDB4REQsIDB4RjMsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDIsIDB4QkMsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MkEsCisJIDB4MDQsIDB4QkMsIDB4NjQsIDB4NDAsIDB4MDQsIDB4MkEsIDB4RUYsIDB4QjQsIDB4MTUsIDB4NjAsIDB4REQsIDB4RkIsIDB4MDcsIDB4QjQsIDB4NjAsIDB4RkUsCisJIDB4MTcsIDB4NjAsIDB4MTAsIDB4RkIsIDB4MjAsIDB4RkUsIDB4MDcsIDB4N0MsIDB4MTUsIDB4NjAsIDB4REMsIDB4RjksIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MjAsIDB4NDAsIDB4MjAsIDB4MkEsIDB4MEEsIDB4MDAsIDB4MEEsIDB4NjAsIDB4NzcsIDB4RjEsIDB4NTAsIDB4RjMsIDB4MkUsIDB4NjAsIDB4MzEsIDB4NjMsCisJIDB4NjAsIDB4RkUsIDB4QkQsIDB4RDksIDB4NjAsIDB4NDcsIDB4QTMsIDB4REIsIDB4MjAsIDB4RkUsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NTcsCisJIDB4MzIsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MjQsIDB4MDAsIDB4NDUsIDB4NDgsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjEsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4OUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUMsIDB4MDMsIDB4RjIsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MjQsIDB4RkEsIDB4MDAsIDB4NjAsIDB4NDgsIDB4NjEsCisJIDB4MjgsIDB4NDQsIDB4NTksIDB4REEsIDB4MDMsIDB4NjQsIDB4MzgsIDB4NDMsIDB4QkQsIDB4RDEsIDB4Q0MsIDB4ODQsIDB4NTksIDB4RDgsIDB4RkMsIDB4MDIsCisJIDB4MzksIDB4NDQsIDB4NTksIDB4REEsIDB4MDYsIDB4NjQsIDB4MjMsIDB4RkEsIDB4MUYsIDB4NjAsIDB4MTAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsCisJIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RkEsIDB4RkUsIDB4MzcsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MEUsIDB4NTcsIDB4MzIsIDB4NDAsIDB4NDAsIDB4MjYsIDB4NEYsIDB4MDAsIDB4NDUsIDB4NDgsIDB4MDAsIDB4NjAsIDB4NjgsIDB4NjEsCisJIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDcsIDB4MDMsIDB4RjIsIDB4NjAsIDB4MDEsIDB4NjQsIDB4MjQsIDB4RkEsCisJIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjEsIDB4NDYsIDB4NEEsIDB4MzgsIDB4NDQsIDB4NTQsIDB4OTQsIDB4MDMsIDB4NjQsIDB4MDEsIDB4MDIsIDB4MDksIDB4MDAsCisJIDB4MDYsIDB4NjMsIDB4NEEsIDB4NjEsIDB4MzgsIDB4NDYsIDB4QkQsIDB4RDAsIDB4Q0MsIDB4ODQsIDB4MkEsIDB4NDYsIDB4NTksIDB4RDgsIDB4RkEsIDB4MDIsCisJIDB4MDYsIDB4MDAsIDB4REEsIDB4ODEsIDB4MzgsIDB4NDMsIDB4QkQsIDB4RDEsIDB4Q0MsIDB4ODQsIDB4NTksIDB4RDgsIDB4RkMsIDB4MDIsIDB4MDUsIDB4NjMsCisJIDB4MjgsIDB4NDQsIDB4MDIsIDB4QTgsIDB4MjUsIDB4RkEsIDB4MDcsIDB4MDIsIDB4MDMsIDB4NjQsIDB4MzksIDB4NDMsIDB4QkQsIDB4RDEsIDB4Q0MsIDB4ODQsCisJIDB4NTksIDB4RDgsIDB4RkMsIDB4MDIsIDB4MDgsIDB4NjMsIDB4MjgsIDB4NDQsIDB4MDMsIDB4QTgsIDB4MTYsIDB4NjAsIDB4ODIsIDB4RjMsIDB4MEYsIDB4MDMsCisJIDB4RTgsIDB4ODUsIDB4QzcsIDB4ODUsIDB4NjAsIDB4NDMsIDB4RkUsIDB4QTMsIDB4MkQsIDB4NjAsIDB4MDYsIDB4NjQsIDB4NTgsIDB4RDEsIDB4RDksIDB4ODEsCisJIDB4QTEsIDB4RDgsIDB4N0UsIDB4MkEsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjEsIDB4RjgsIDB4MUYsIDB4NjUsIDB4NDMsIDB4MkEsIDB4NDYsCisJIDB4MjMsIDB4RkMsIDB4MUYsIDB4NjAsIDB4MTAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RkEsIDB4RkUsIDB4MzcsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NTcsIDB4MzIsIDB4NDAsCisJIDB4NDAsIDB4MjYsIDB4MUIsIDB4MDAsIDB4NDUsIDB4NDgsIDB4MDAsIDB4NjAsIDB4MDYsIDB4NjEsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OUYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MTMsIDB4MDMsIDB4MDIsIDB4NjQsIDB4MjMsIDB4RkEsIDB4RjIsIDB4NjAsIDB4MDAsIDB4NjQsIDB4NUEsIDB4REEsIDB4MjgsIDB4NDQsCisJIDB4NUEsIDB4REEsIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsIDB4MTAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RkEsIDB4RkUsIDB4MzcsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDMsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsCisJIDB4REQsIDB4OTgsIDB4RkYsIDB4RkYsIDB4OTcsIDB4RjEsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RDgsIDB4ODAsIDB4QzQsIDB4ODQsIDB4MEMsIDB4MDMsCisJIDB4MDgsIDB4MDUsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDUsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDIsIDB4MjQsIDB4QzYsIDB4RkUsIDB4REQsIDB4OTgsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjAsIDB4RkUsIDB4NjQsIDB4QTIsIDB4REIsIDB4REQsIDB4OTgsIDB4RkYsIDB4RkYsIDB4QTIsIDB4RkYsIDB4MzIsIDB4NDAsCisJIDB4NDAsIDB4MjYsIDB4M0MsIDB4MDAsIDB4N0IsIDB4RjMsIDB4NjcsIDB4NDMsIDB4REMsIDB4ODQsIDB4Q0MsIDB4ODQsIDB4MzcsIDB4MDMsIDB4NjAsIDB4NDYsCisJIDB4MEEsIDB4MDIsIDB4N0IsIDB4RkQsIDB4MDAsIDB4NjAsIDB4NDYsIDB4NjEsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OUYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjYsIDB4NDQsIDB4N0IsIDB4RkIsIDB4MkMsIDB4MDMsIDB4NDYsIDB4NEIsIDB4MjUsIDB4NjAsIDB4RDAsIDB4NjEsIDB4MTgsIDB4NjQsIDB4MjMsIDB4RkEsCisJIDB4RjEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MjQsIDB4RkEsIDB4NEEsIDB4NjUsIDB4QTIsIDB4RkYsIDB4MkMsIDB4NjMsIDB4NTksIDB4RDEsIDB4QTIsIDB4REYsCisJIDB4QTUsIDB4RDgsIDB4REEsIDB4ODUsIDB4ODAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4RjcsIDB4MUYsIDB4MTIsIDB4NjMsCisJIDB4NTksIDB4RDEsIDB4QTUsIDB4RDgsIDB4REEsIDB4ODUsIDB4ODAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4RjgsIDB4MUYsCisJIDB4MUYsIDB4NjAsIDB4MTAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MkIsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RkEsIDB4RkUsIDB4QTYsIDB4RkUsIDB4MDAsIDB4NjQsIDB4N0IsIDB4RkIsIDB4QTMsIDB4RkYsIDB4Q0EsIDB4NjAsCisJIDB4N0UsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTYsIDB4RkUsIDB4QkEsIDB4MDUsIDB4QTcsIDB4RkUsIDB4MEEsIDB4MDUsIDB4QTUsIDB4RkUsIDB4MDMsIDB4MDQsCisJIDB4RTYsIDB4NjAsIDB4OEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTQsIDB4RkUsIDB4RjIsIDB4MDQsIDB4RTcsIDB4NjAsIDB4MUYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MzYsIDB4NDUsIDB4MTksIDB4NjAsIDB4ODYsIDB4NjQsIDB4NDQsIDB4RDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MjgsIDB4RjMsIDB4N0QsIDB4RjEsCisJIDB4NjAsIDB4NDcsIDB4MDcsIDB4QjQsIDB4NEUsIDB4RkIsIDB4MDEsIDB4NjEsIDB4MDMsIDB4MDMsIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MDIsCisJIDB4OUQsIDB4ODQsIDB4QTEsIDB4ODAsIDB4QTAsIDB4ODMsIDB4MTUsIDB4MDMsIDB4N0QsIDB4RkQsIDB4MDgsIDB4NjAsIDB4MjQsIDB4RjEsIDB4MDAsIDB4NjAsCisJIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MzEsIDB4NDQsIDB4REUsIDB4QjQsIDB4NDAsIDB4NTEsIDB4MDEsIDB4N0MsCisJIDB4QkMsIDB4RjksIDB4NDksIDB4RjMsIDB4MDEsIDB4NjMsIDB4NjAsIDB4NDAsIDB4RkYsIDB4MjYsIDB4NDksIDB4RkQsIDB4Q0EsIDB4NjAsIDB4N0UsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4RTYsIDB4NjAsIDB4OEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NjAsIDB4QjAsIDB4NjMsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDEsCisJIDB4QkQsIDB4RDEsIDB4QjAsIDB4ODQsIDB4QjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDIsIDB4NkEsIDB4RkIsIDB4MzEsIDB4NDQsIDB4RkUsIDB4QjQsCisJIDB4NDAsIDB4NTEsIDB4MEQsIDB4NjQsIDB4MDUsIDB4RkIsIDB4MUEsIDB4MDAsIDB4MjgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTMsIDB4NjAsIDB4NTIsIDB4RjMsCisJIDB4QzUsIDB4RkIsIDB4NjQsIDB4RkIsIDB4MEYsIDB4NjAsIDB4ODUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4NDYsIDB4NUUsCisJIDB4MzEsIDB4NDQsIDB4MjEsIDB4QkMsIDB4NDAsIDB4NTEsIDB4RUQsIDB4RTIsIDB4MEYsIDB4NEUsIDB4RDAsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QTgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEUsIDB4NEYsIDB4MDAsIDB4MDAsIDB4RTgsIDB4NjAsIDB4NzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDcsIDB4RkUsIDB4Q0EsIDB4NjAsCisJIDB4N0UsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkUsIDB4RjUsIDB4MjcsIDB4RjIsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsCisJIDB4MjcsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjYsIDB4RjAsIDB4NjMsIDB4NDYsCisJIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjUsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4ODcsIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsCisJIDB4NjEsIDB4NDYsIDB4MjYsIDB4MDIsIDB4MEIsIDB4NjAsIDB4ODIsIDB4RjMsIDB4REEsIDB4ODEsIDB4NjAsIDB4NDUsIDB4RDUsIDB4ODAsIDB4QTEsIDB4RDEsCisJIDB4MDQsIDB4MDMsIDB4RDMsIDB4ODAsIDB4RDksIDB4ODEsIDB4RkEsIDB4MDIsIDB4MDgsIDB4MDAsIDB4QTEsIDB4REQsIDB4RDksIDB4ODQsIDB4MEIsIDB4NjAsCisJIDB4ODIsIDB4RkIsIDB4NEEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDUsIDB4NjMsIDB4NDYsIDB4MDYsIDB4RjIsCisJIDB4RkYsIDB4NjAsIDB4MDEsIDB4N0MsIDB4QTAsIDB4OUMsIDB4MDYsIDB4RjgsIDB4NjUsIDB4NDYsIDB4NzAsIDB4RjMsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MkEsCisJIDB4MDMsIDB4MDAsIDB4Q0MsIDB4ODQsIDB4ODAsIDB4MkIsIDB4NzAsIDB4RkIsIDB4RTcsIDB4NjAsIDB4NTgsIDB4NEUsIDB4ODEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4QUQsIDB4MDEsIDB4MkUsIDB4RjUsIDB4MjgsIDB4RjAsIDB4MTgsIDB4NjAsIDB4MTIsIDB4RjksIDB4MjcsIDB4RjIsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsCisJIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsCisJIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MjcsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsCisJIDB4MjYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjUsIDB4RjAsIDB4NjMsIDB4NDYsCisJIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4ODcsIDB4RjMsCisJIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4MTIsIDB4MDIsIDB4NjMsIDB4NDYsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QjAsCisJIDB4MDgsIDB4QkMsIDB4MEMsIDB4MDMsIDB4MDYsIDB4RkEsIDB4RTcsIDB4NjAsIDB4NTgsIDB4NEUsIDB4ODEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsCisJIDB4MUUsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4NkYsIDB4MDEsIDB4MDEsIDB4NjQsCisJIDB4NTEsIDB4RkIsIDB4MjgsIDB4NjAsIDB4NEUsIDB4NjQsIDB4NTIsIDB4RkIsIDB4MTUsIDB4NjAsIDB4QzMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTUsIDB4MTgsCisJIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RTcsIDB4NjAsCisJIDB4M0QsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkIsIDB4NjAsIDB4ODgsIDB4NjEsIDB4RkYsIDB4NjAsCisJIDB4ODAsIDB4NjUsIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODAsIDB4NTksIDB4RDMsIDB4MDUsIDB4MDIsIDB4MDQsIDB4MUIsIDB4NTksIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MUIsIDB4MTUsIDB4MDAsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDgsIDB4NjAsCisJIDB4MUIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MjAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RTcsIDB4NjAsIDB4NjAsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjEsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjQsIDB4MjMsIDB4RkEsCisJIDB4RjEsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MjQsIDB4RkEsIDB4MUYsIDB4NjAsIDB4MTAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RkEsIDB4RkUsIDB4MDAsIDB4NjAsIDB4MzAsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RDIsIDB4NjAsIDB4QjUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4Q0EsIDB4NjAsIDB4N0UsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEUsIDB4NTcsIDB4NjMsIDB4NDYsIDB4NDMsIDB4NDcsIDB4MjIsIDB4RjIsIDB4NzYsIDB4RjIsIDB4MDIsIDB4MUIsIDB4MDEsIDB4MUIsCisJIDB4MEMsIDB4MDAsIDB4NjAsIDB4NDYsIDB4MUYsIDB4NjAsIDB4MjAsIDB4NjQsIDB4NDAsIDB4NEIsIDB4RjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDYsIDB4NzYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RjQsIDB4MUIsIDB4MzcsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RTcsIDB4NjAsCisJIDB4OUYsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MkEsIDB4RkIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MjEsIDB4RkIsIDB4NUEsIDB4REIsIDB4MTAsIDB4NjAsIDB4NDIsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MjgsIDB4RjMsIDB4N0QsIDB4RjEsIDB4NjAsIDB4NDcsIDB4MDcsIDB4QjQsIDB4NEUsIDB4RkIsIDB4MDEsIDB4NjEsIDB4MDMsIDB4MDMsCisJIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MDIsIDB4QTEsIDB4ODAsIDB4QjEsIDB4ODMsIDB4MTYsIDB4MDIsIDB4Q0YsIDB4ODUsIDB4QTcsIDB4ODAsCisJIDB4N0QsIDB4RkQsIDB4MEIsIDB4MDIsIDB4MDEsIDB4NjUsIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzEsIDB4NDQsCisJIDB4REYsIDB4QjQsIDB4NDAsIDB4NTEsIDB4RDAsIDB4NjAsIDB4RDksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MjEsIDB4RjEsIDB4MDAsIDB4NjAsCisJIDB4MDEsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4RTYsIDB4NjAsIDB4OEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4RjMsCisJIDB4N0QsIDB4RjEsIDB4NjAsIDB4NDcsIDB4MDcsIDB4QjQsIDB4NEUsIDB4RkIsIDB4MDEsIDB4NjEsIDB4MDMsIDB4MDMsIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsCisJIDB4RkQsIDB4MDIsIDB4OUQsIDB4ODQsIDB4QTEsIDB4ODAsIDB4QTAsIDB4ODMsIDB4MTMsIDB4MDMsIDB4N0QsIDB4RkQsIDB4MDgsIDB4NjAsIDB4MjQsIDB4RjEsCisJIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4N0QsIDB4RjEsIDB4MzEsIDB4NDQsIDB4NjQsIDB4NDAsCisJIDB4RkYsIDB4MjYsIDB4MDMsIDB4MDAsIDB4MjEsIDB4QkMsIDB4NDAsIDB4NTEsIDB4MDMsIDB4MDAsIDB4Q0EsIDB4NjAsIDB4N0UsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4RTYsIDB4NjAsIDB4OEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NTcsIDB4MzIsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MUIsIDB4MDAsIDB4NDUsIDB4NDgsCisJIDB4MDAsIDB4NjAsIDB4MDYsIDB4NjEsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTMsIDB4MDMsIDB4MDIsIDB4NjQsCisJIDB4MjMsIDB4RkEsIDB4RjIsIDB4NjAsIDB4MDQsIDB4NjQsIDB4NUEsIDB4REEsIDB4MjgsIDB4NDQsIDB4NUEsIDB4REEsIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsCisJIDB4MTAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4RkEsIDB4RkUsIDB4MzcsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4NzksIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsCisJIDB4NjAsIDB4NDYsIDB4MEUsIDB4RjIsIDB4NTksIDB4MDMsIDB4NjAsIDB4NDAsIDB4RjAsIDB4MzcsIDB4NDYsIDB4MDAsIDB4RkYsIDB4MzcsIDB4M0IsIDB4MDAsCisJIDB4RkQsIDB4MzcsIDB4MzMsIDB4MDAsIDB4MTgsIDB4MzcsIDB4MjcsIDB4MDAsIDB4RkUsIDB4MzcsIDB4MkEsIDB4MDAsIDB4RjgsIDB4MzcsIDB4MEEsIDB4MDAsCisJIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjUsIDB4MTAsIDB4NjAsIDB4MjQsIDB4NjIsIDB4NDYsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RDgsIDB4MDEsIDB4MDYsIDB4QjQsIDB4RkQsIDB4N0YsIDB4MEUsIDB4RkEsIDB4MUUsIDB4NjAsCisJIDB4RjgsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4RjksIDB4RkUsIDB4QzksIDB4MDEsIDB4REUsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTQsIDB4MDAsCisJIDB4RTEsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MzIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QkYsIDB4MDMsIDB4MjMsIDB4RjAsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MjYsCisJIDB4RTMsIDB4MUIsIDB4MDIsIDB4MjYsIDB4RTEsIDB4MTgsIDB4QTIsIDB4RkYsIDB4MDIsIDB4RjAsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjQsIDB4RDAsIDB4ODAsCisJIDB4OEYsIDB4RjMsIDB4MDIsIDB4MDIsIDB4Q0MsIDB4ODQsIDB4OEYsIDB4RkIsIDB4MUYsIDB4NjAsIDB4MjAsIDB4NjQsIDB4NDAsIDB4NEIsIDB4RjYsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4QjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTgsIDB4MDEsIDB4QUMsIDB4RkUsIDB4MDksIDB4MDUsIDB4QUQsIDB4RkUsIDB4MEYsIDB4MDUsCisJIDB4QUUsIDB4RkUsIDB4QTIsIDB4MDUsIDB4QUYsIDB4RkUsIDB4MzcsIDB4MDUsIDB4Q0EsIDB4NjAsIDB4N0UsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsCisJIDB4MTEsIDB4RjEsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4RjUsIDB4MDEsIDB4MTAsIDB4NjAsCisJIDB4NTYsIDB4NjUsIDB4MDMsIDB4NjEsIDB4MDcsIDB4MDAsIDB4QTIsIDB4REQsIDB4NTgsIDB4NEYsIDB4NjQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QjksCisJIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDMsIDB4MDAsIDB4NjMsIDB4QTUsIDB4RDEsIDB4NUEsIDB4RDMsIDB4REEsIDB4ODUsIDB4MDAsIDB4QTgsIDB4Q0QsIDB4ODEsCisJIDB4RjIsIDB4MDIsIDB4RjgsIDB4MDIsIDB4RTEsIDB4MDEsIDB4MTAsIDB4NjAsIDB4MjAsIDB4NjIsIDB4MTAsIDB4NjAsIDB4NDYsIDB4NjUsIDB4RTgsIDB4NjAsCisJIDB4QTksIDB4NjMsIDB4NUEsIDB4REYsIDB4RDYsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDMsIDB4NUEsIDB4REYsIDB4NUEsIDB4REYsIDB4NUEsIDB4REQsCisJIDB4RjksIDB4MDEsIDB4MTAsIDB4NjAsIDB4NTQsIDB4NjUsIDB4NUEsIDB4REYsIDB4RDYsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDMsIDB4NUEsIDB4REQsCisJIDB4RkIsIDB4MDEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MjQsIDB4NjQsIDB4NDAsIDB4NDEsIDB4MTAsIDB4NjAsIDB4MjIsIDB4NjMsCisJIDB4QTMsIDB4RDEsIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsIDB4MDYsIDB4NjEsIDB4MDgsIDB4MDMsIDB4QkQsIDB4REIsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4QjAsIDB4ODQsIDB4Q0QsIDB4ODEsIDB4QTMsIDB4REIsIDB4MDYsIDB4QTMsIDB4RjksIDB4MDIsIDB4MTAsIDB4NjAsIDB4NDgsIDB4NjMsIDB4QTMsIDB4RDEsCisJIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsIDB4MDcsIDB4NjEsIDB4MTksIDB4MDMsIDB4QkQsIDB4REIsIDB4NjQsIDB4NDQsIDB4RkUsIDB4QTMsIDB4MDIsIDB4QTMsCisJIDB4Q0QsIDB4ODEsIDB4RTgsIDB4ODQsIDB4RTMsIDB4MDMsIDB4MDIsIDB4MDUsIDB4RTEsIDB4MDMsIDB4RjksIDB4MDEsIDB4NzcsIDB4RkIsIDB4NzksIDB4RkQsCisJIDB4NjEsIDB4NUMsIDB4QTMsIDB4RDMsIDB4NzgsIDB4RjksIDB4MDMsIDB4MTgsIDB4NTgsIDB4NEYsIDB4NjAsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NzksIDB4RjMsCisJIDB4NzgsIDB4RjEsIDB4NjAsIDB4NDMsIDB4NzcsIDB4RjMsIDB4NjQsIDB4NDEsIDB4RUEsIDB4MDEsIDB4MjEsIDB4NDMsIDB4MTAsIDB4NjAsIDB4NDgsIDB4NjUsCisJIDB4RDcsIDB4ODAsIDB4QkQsIDB4RDEsIDB4QkQsIDB4RDMsIDB4MDMsIDB4MDIsIDB4Q0EsIDB4NjAsIDB4N0UsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTAsIDB4ODQsCisJIDB4QkQsIDB4RDEsIDB4NDMsIDB4NDEsIDB4RjUsIDB4MDMsIDB4RTgsIDB4NjAsIDB4QUUsIDB4NjQsIDB4NjQsIDB4NTgsIDB4NDAsIDB4NEYsIDB4MkEsIDB4RjAsCisJIDB4ODMsIDB4NjAsIDB4RkYsIDB4NjUsIDB4NjQsIDB4NDcsIDB4MDMsIDB4MkIsIDB4MDEsIDB4MDAsIDB4MTcsIDB4MDAsIDB4MDMsIDB4MjYsIDB4MDMsIDB4QUMsCisJIDB4NjAsIDB4NDcsIDB4QTQsIDB4ODQsIDB4MkEsIDB4RkEsIDB4MkYsIDB4RjIsIDB4MkMsIDB4RkEsIDB4MzAsIDB4RjIsIDB4MkQsIDB4RkEsIDB4MzEsIDB4RjIsCisJIDB4MkUsIDB4RkEsIDB4NjQsIDB4NDEsIDB4Q0IsIDB4RjMsIDB4MkYsIDB4RkEsIDB4NjAsIDB4NDMsIDB4Q0MsIDB4RjMsIDB4MzAsIDB4RkEsIDB4Q0QsIDB4RjEsCisJIDB4MzEsIDB4RjgsIDB4MzIsIDB4RkMsIDB4MzMsIDB4RkEsIDB4MzQsIDB4RjgsIDB4MTksIDB4MDAsIDB4NjAsIDB4NDcsIDB4QTQsIDB4ODQsIDB4MkEsIDB4RkEsCisJIDB4MkYsIDB4RjIsIDB4MkMsIDB4RkEsIDB4MzAsIDB4RjIsIDB4MkQsIDB4RkEsIDB4MzEsIDB4RjIsIDB4MkUsIDB4RkEsIDB4MzYsIDB4RjIsIDB4MzIsIDB4RkEsCisJIDB4MzcsIDB4RjIsIDB4MzMsIDB4RkEsIDB4MzgsIDB4RjIsIDB4MzQsIDB4RkEsIDB4Q0IsIDB4RjMsIDB4MkYsIDB4RkEsIDB4MzYsIDB4RkEsIDB4Q0MsIDB4RjMsCisJIDB4MzAsIDB4RkEsIDB4MzcsIDB4RkEsIDB4Q0QsIDB4RjMsIDB4MzEsIDB4RkEsIDB4MzgsIDB4RkEsIDB4NjQsIDB4NDEsIDB4MUMsIDB4RjIsIDB4MTMsIDB4RkEsCisJIDB4MDAsIDB4RjQsIDB4MEQsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4ODAsIDB4MkIsIDB4MjgsIDB4MDAsIDB4MjYsIDB4NDYsIDB4MDQsIDB4NjMsCisJIDB4MDMsIDB4RkMsIDB4MDAsIDB4RjQsIDB4MEQsIDB4RjIsIDB4MDYsIDB4RkEsIDB4RUEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NDksIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4RkYsIDB4QTAsIDB4NTksIDB4RjUsIDB4MTksIDB4MDIsIDB4MzksIDB4RjIsIDB4MjYsIDB4NDYsIDB4M0YsIDB4RkEsIDB4MDAsIDB4RjQsIDB4MDAsIDB4NjAsCisJIDB4ODEsIDB4NjcsIDB4MEQsIDB4RkEsIDB4N0MsIDB4NjQsIDB4MDEsIDB4RkEsIDB4MjYsIDB4NDYsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4MUUsIDB4NjAsCisJIDB4RTAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4QzgsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4M0YsIDB4RjAsCisJIDB4NDIsIDB4NjQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDQsIDB4M0YsIDB4RkEsIDB4MUMsIDB4RjIsIDB4MTMsIDB4RkEsIDB4MjYsIDB4RjIsCisJIDB4MjcsIDB4RjAsIDB4NjAsIDB4NDcsIDB4MDAsIDB4RjQsIDB4MUYsIDB4RkEsIDB4NjQsIDB4NDcsIDB4MjAsIDB4RkEsIDB4NjEsIDB4NDQsIDB4MjEsIDB4RkEsCisJIDB4MDEsIDB4NjcsIDB4MEQsIDB4RkEsIDB4MTAsIDB4NjEsIDB4MjYsIDB4NjAsIDB4NjQsIDB4NjQsIDB4MUUsIDB4NjMsIDB4NTgsIDB4RDEsIDB4Q0QsIDB4ODEsCisJIDB4QkQsIDB4RDgsIDB4RkMsIDB4MDIsIDB4OUEsIDB4RjEsIDB4QjcsIDB4RjEsIDB4NjQsIDB4NUUsIDB4NjQsIDB4NUYsIDB4NDQsIDB4NjMsIDB4QkQsIDB4REEsCisJIDB4MTMsIDB4NjAsIDB4MkYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4MDksIDB4QkMsIDB4NEEsIDB4RDMsCisJIDB4NjAsIDB4NDUsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDMsIDB4NjQsIDB4MDIsIDB4MzYsIDB4MDEsIDB4NjQsIDB4QjQsIDB4ODQsIDB4MDYsIDB4QTIsCisJIDB4QTIsIDB4RDEsIDB4QkQsIDB4REEsIDB4NjQsIDB4NDcsIDB4QkQsIDB4REEsIDB4QjQsIDB4RjMsIDB4QjUsIDB4RjEsIDB4NjAsIDB4NDcsIDB4QkQsIDB4REEsCisJIDB4NjQsIDB4NDcsIDB4QzMsIDB4RjEsIDB4QkQsIDB4REEsIDB4NjQsIDB4NDQsIDB4QkQsIDB4REEsIDB4MjYsIDB4NDYsIDB4MDAsIDB4NjQsIDB4MjMsIDB4RjAsCisJIDB4M0IsIDB4RjAsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MDYsIDB4MDAsIDB4QzAsIDB4NjcsIDB4QTAsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4MTAsIDB4QkMsIDB4M0UsIDB4RkEsIDB4MUUsIDB4NjAsIDB4RTAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzgsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4NjAsIDB4NUMsIDB4NjEsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QTIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjYsIDB4NDQsIDB4NTksIDB4RkIsIDB4MDQsIDB4NjQsIDB4MDMsIDB4RkEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NTksIDB4RjUsIDB4QUIsIDB4RjEsCisJIDB4MTksIDB4RjgsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4MDgsIDB4NjQsIDB4MkEsIDB4RkEsIDB4ODAsIDB4N0UsIDB4RjgsIDB4N0YsIDB4MEUsIDB4RkEsCisJIDB4ODcsIDB4RjEsIDB4MDcsIDB4RjgsIDB4MDEsIDB4NjAsIDB4NjAsIDB4NjcsIDB4MkMsIDB4RkEsIDB4MUQsIDB4NjAsIDB4MDAsIDB4NjcsIDB4MkQsIDB4RkEsCisJIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjcsIDB4MkUsIDB4RkEsIDB4Q0IsIDB4RjEsIDB4MkYsIDB4RjgsIDB4MzIsIDB4RjgsIDB4Q0MsIDB4RjEsIDB4MzAsIDB4RjgsCisJIDB4MzMsIDB4RjgsIDB4Q0QsIDB4RjEsIDB4MzEsIDB4RjgsIDB4MzQsIDB4RjgsIDB4MDAsIDB4NjMsIDB4M0IsIDB4RkMsIDB4M0QsIDB4RkMsIDB4MDEsIDB4NjQsCisJIDB4M0EsIDB4RkEsIDB4NjYsIDB4NjQsIDB4MzksIDB4RkEsIDB4M0MsIDB4RkMsIDB4QUEsIDB4NjAsIDB4QUEsIDB4NjQsIDB4MDAsIDB4RjQsIDB4MDIsIDB4RkEsCisJIDB4MDAsIDB4NjAsIDB4MDMsIDB4NjQsIDB4NUEsIDB4REEsIDB4MUQsIDB4NjAsIDB4NjAsIDB4NjQsIDB4NUEsIDB4REEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4NUEsIDB4REEsIDB4ODEsIDB4N0YsIDB4MTgsIDB4N0UsIDB4MDgsIDB4RkEsIDB4MDEsIDB4NjAsIDB4MDEsIDB4NjQsIDB4MEEsIDB4RkEsIDB4MDAsIDB4NjQsCisJIDB4MEUsIDB4RkEsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NTksIDB4RjUsIDB4M0QsIDB4RjIsIDB4M0MsIDB4RjIsIDB4Q0MsIDB4ODMsIDB4MDAsIDB4QTgsCisJIDB4MDMsIDB4MDMsIDB4MDgsIDB4MjgsIDB4M0QsIDB4RkMsIDB4NDIsIDB4MDAsIDB4M0QsIDB4RkEsIDB4M0EsIDB4RjIsIDB4M0IsIDB4RjAsIDB4MDAsIDB4NjMsCisJIDB4MDAsIDB4RjQsIDB4MDcsIDB4RkMsIDB4MDEsIDB4QjAsIDB4MEIsIDB4RkEsIDB4MTksIDB4MDMsIDB4MUYsIDB4RjgsIDB4RkYsIDB4RkYsIDB4MTgsIDB4NjQsCisJIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MEEsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4MUYsIDB4RjIsIDB4MUUsIDB4RjAsIDB4NTksIDB4RjUsIDB4MDAsIDB4QTgsIDB4M0IsIDB4RjgsIDB4RDAsIDB4ODAsIDB4MDYsIDB4MDMsIDB4MDUsIDB4MDMsCisJIDB4MDQsIDB4NjAsIDB4NUMsIDB4NjMsIDB4MEYsIDB4NjQsIDB4M0EsIDB4RkEsIDB4MzksIDB4RkMsIDB4MDAsIDB4RjQsIDB4MDAsIDB4NjQsIDB4MDYsIDB4RkEsCisJIDB4RUEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NDksIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTksIDB4RjUsIDB4MDAsIDB4RjQsIDB4ODEsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4MDYsIDB4RkEsIDB4MzIsIDB4NDcsIDB4MDcsIDB4RkEsIDB4QjcsIDB4RjEsIDB4MDAsIDB4N0YsIDB4NjQsIDB4NUUsIDB4MDksIDB4RkEsIDB4NTksIDB4RjUsCisJIDB4MDAsIDB4NjQsIDB4MTUsIDB4RkEsIDB4MzksIDB4RjIsIDB4M0YsIDB4RkEsIDB4MUUsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsCisJIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RTMsIDB4NjAsIDB4QzAsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDUsIDB4MEUsIDB4RjIsIDB4MEYsIDB4RjAsIDB4MTAsIDB4RjAsIDB4NjQsIDB4NDEsIDB4MDEsIDB4QTgsIDB4NTksIDB4RjUsCisJIDB4MDksIDB4MDIsIDB4QUQsIDB4ODMsIDB4NjQsIDB4NDQsIDB4QUMsIDB4ODQsIDB4MDgsIDB4MjQsIDB4MEEsIDB4NjMsIDB4M0MsIDB4RkMsIDB4M0QsIDB4RkMsCisJIDB4MUEsIDB4MDIsIDB4MkQsIDB4MDAsIDB4MDMsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MDAsIDB4NjQsIDB4M0MsIDB4RkEsIDB4MjksIDB4MDAsIDB4MDQsIDB4M0EsCisJIDB4MDksIDB4MDAsIDB4MEEsIDB4NjQsIDB4M0MsIDB4RkEsIDB4MDEsIDB4NjQsIDB4M0EsIDB4RkEsIDB4MDAsIDB4RjQsIDB4MDAsIDB4NjQsIDB4MUYsIDB4RkEsCisJIDB4MUUsIDB4RkEsIDB4MUUsIDB4MDAsIDB4MDIsIDB4M0EsIDB4MUUsIDB4MDAsIDB4NjQsIDB4NDQsIDB4QUQsIDB4ODMsIDB4QUMsIDB4ODQsIDB4MDIsIDB4MDMsCisJIDB4M0MsIDB4RkMsIDB4M0QsIDB4RkMsIDB4MTUsIDB4MDMsIDB4M0EsIDB4RkEsIDB4RjgsIDB4NjUsIDB4NTIsIDB4NjMsIDB4NjQsIDB4NDQsIDB4MDEsIDB4MzYsCisJIDB4MEQsIDB4MDAsIDB4MTIsIDB4QTMsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDIsIDB4MDAsIDB4QzcsIDB4ODMsIDB4QzcsIDB4ODMsIDB4NjQsIDB4NDAsCisJIDB4MDgsIDB4MkEsIDB4MDEsIDB4MDAsIDB4QzcsIDB4ODMsIDB4NjQsIDB4NDAsIDB4MDQsIDB4MjYsIDB4QzcsIDB4ODMsIDB4MzksIDB4RkMsIDB4MDAsIDB4NjQsCisJIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4M0IsIDB4RjAsIDB4M0EsIDB4RjIsIDB4NjUsIDB4NDYsIDB4MDYsIDB4RjIsIDB4NDAsIDB4NDcsIDB4MUMsIDB4MTgsCisJIDB4MzIsIDB4NDcsIDB4MDcsIDB4RkEsIDB4MTgsIDB4N0UsIDB4ODEsIDB4N0YsIDB4MDgsIDB4RkEsIDB4MDEsIDB4NjAsIDB4MDEsIDB4NjMsIDB4QjcsIDB4RjMsCisJIDB4MEEsIDB4RkMsIDB4MDAsIDB4N0YsIDB4MDksIDB4RkEsIDB4MjcsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MEUsIDB4MDAsIDB4MUYsIDB4RjgsIDB4MTgsIDB4NjQsCisJIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MEEsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4MUUsIDB4RjAsIDB4NTksIDB4RjUsIDB4M0IsIDB4RjgsIDB4NjUsIDB4NDYsIDB4MjcsIDB4NDAsIDB4MDIsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsCisJIDB4MTMsIDB4MDAsIDB4NkUsIDB4NjEsIDB4RkYsIDB4NjAsIDB4RkUsIDB4NjQsIDB4MDAsIDB4NjAsIDB4MEUsIDB4NjMsIDB4NTgsIDB4RDEsIDB4NTksIDB4RDgsCisJIDB4RkQsIDB4MUYsIDB4MDEsIDB4NjAsIDB4RUUsIDB4NjMsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjEsIDB4NTgsIDB4RDEsIDB4NTksIDB4RDgsIDB4N0UsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjEsIDB4RjksIDB4MUYsIDB4MjcsIDB4NDAsIDB4MDQsIDB4MjYsIDB4MUEsIDB4MDAsIDB4NDYsIDB4NEIsCisJIDB4MEYsIDB4NjAsIDB4NjcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MEUsIDB4MDMsIDB4ODksIDB4RjAsIDB4RUIsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4MDAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjUsIDB4NDQsIDB4QUMsIDB4ODYsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDMsIDB4RUIsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4MDAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDAsIDB4MkIsIDB4NDYsIDB4ODIsIDB4RkMsIDB4MDAsIDB4RjQsIDB4ODIsIDB4RkMsCisJIDB4MDAsIDB4RjQsIDB4MjcsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MTksIDB4MDAsIDB4NDYsIDB4NEIsIDB4MEYsIDB4NjAsIDB4ODUsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MEUsIDB4MDMsIDB4ODksIDB4RjAsIDB4RUIsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDAsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjUsIDB4NDQsIDB4QUMsIDB4ODYsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDMsIDB4RUIsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDAsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4MDAsIDB4NjUsIDB4NDYsIDB4MDIsIDB4RkEsIDB4MDAsIDB4RjQsIDB4ODIsIDB4RkMsIDB4MDEsIDB4NjQsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4NjEsIDB4MDIsIDB4NjQsIDB4N0EsIDB4NjMsIDB4NTgsIDB4RDAsIDB4QUIsIDB4NDYsIDB4QTAsIDB4RDgsIDB4QUIsIDB4NDYsIDB4RkIsIDB4MUYsCisJIDB4QUIsIDB4NDYsIDB4MDAsIDB4RjQsIDB4Q0QsIDB4ODEsIDB4QUIsIDB4NDYsIDB4MDAsIDB4RjQsIDB4RjMsIDB4MDIsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjAsIDB4MkEsIDB4NjEsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QTIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4NTgsIDB4RkIsCisJIDB4MDQsIDB4NjQsIDB4MDMsIDB4RkEsIDB4NjcsIDB4NDQsIDB4MkMsIDB4RkEsIDB4MkQsIDB4RkEsIDB4MkUsIDB4RkEsIDB4MzIsIDB4RkEsIDB4MzMsIDB4RkEsCisJIDB4MzQsIDB4RkEsIDB4MTIsIDB4NjAsIDB4ODAsIDB4NjQsIDB4ODcsIDB4RjEsIDB4MEUsIDB4RkEsIDB4MDcsIDB4RjgsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsCisJIDB4MEEsIDB4NjAsIDB4MDcsIDB4RkIsIDB4MDYsIDB4QTIsIDB4MTAsIDB4NjAsIDB4NUMsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDQsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4MDYsIDB4NjQsIDB4NUEsIDB4REIsIDB4RUQsIDB4NjAsIDB4RDksIDB4NjQsIDB4MDgsIDB4NjAsIDB4MkQsIDB4RkIsIDB4MDAsIDB4NjQsIDB4MEEsIDB4NjAsCisJIDB4MEQsIDB4RkIsIDB4MDYsIDB4QTIsIDB4MTAsIDB4NjAsIDB4NjAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDgsIDB4NjQsIDB4NUEsIDB4REIsIDB4MDYsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RUQsIDB4NjAsIDB4RTIsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MkYsIDB4RkIsIDB4RUQsIDB4NjAsIDB4QkUsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MjgsIDB4RkIsIDB4MDAsIDB4NjAsIDB4MzAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUIsIDB4NjAsIDB4NTgsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RUQsIDB4NjAsIDB4NzAsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NTgsIDB4RjUsIDB4Q0IsIDB4RjEsIDB4MkYsIDB4RjgsIDB4Q0MsIDB4RjEsIDB4MzAsIDB4RjgsIDB4Q0QsIDB4RjEsIDB4MzEsIDB4RjgsIDB4QUIsIDB4RjEsCisJIDB4MTksIDB4RjgsIDB4NTgsIDB4RjUsIDB4NDAsIDB4NjQsIDB4MkEsIDB4RkEsIDB4NjQsIDB4RjMsIDB4NjMsIDB4RkIsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsCisJIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MDMsIDB4MDAsCisJIDB4RUMsIDB4NjAsIDB4Q0IsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4QzAsIDB4RjMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QUIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4QzIsIDB4RkIsIDB4MTUsIDB4NjAsIDB4QkMsIDB4RjMsIDB4M0YsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MDgsIDB4MDAsCisJIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsIDB4RUUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDUsIDB4MDAsCisJIDB4MEYsIDB4QjQsIDB4RUUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTgsIDB4RjUsIDB4MkQsIDB4NjAsIDB4OTQsIDB4NjQsCisJIDB4MDAsIDB4RjQsIDB4NDAsIDB4NDgsIDB4MjgsIDB4NjAsIDB4NEUsIDB4NjQsIDB4MjAsIDB4NDAsIDB4MTAsIDB4MjcsIDB4MDIsIDB4MDAsIDB4MjgsIDB4NjAsCisJIDB4MkMsIDB4NjQsIDB4MjgsIDB4REIsIDB4MDQsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4RTQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QTcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NTgsIDB4RjUsIDB4M0YsIDB4RkMsIDB4MDEsIDB4NjQsIDB4NTIsIDB4RjEsIDB4MEMsIDB4NjAsIDB4ODEsIDB4RkIsIDB4NjQsIDB4RkIsCisJIDB4QTQsIDB4RDMsIDB4MDQsIDB4NjUsIDB4NTEsIDB4RjMsIDB4MDEsIDB4MTgsIDB4MEMsIDB4NjUsIDB4RjMsIDB4QjQsIDB4QjQsIDB4ODQsIDB4NTEsIDB4RkIsCisJIDB4MEQsIDB4MDAsIDB4RUQsIDB4NjAsIDB4NzAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTEsIDB4RjEsIDB4NjQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RjMsIDB4QTAsCisJIDB4MDQsIDB4QTQsIDB4MDEsIDB4MDQsIDB4RjEsIDB4QTQsIDB4MTAsIDB4MzYsIDB4RjQsIDB4MDEsIDB4NjQsIDB4RkIsIDB4NjQsIDB4RjMsIDB4MTUsIDB4NjAsCisJIDB4QzMsIDB4RjEsIDB4Q0MsIDB4ODQsIDB4MDEsIDB4NjEsIDB4MDgsIDB4MjQsIDB4MDMsIDB4MDAsIDB4RTEsIDB4ODEsIDB4Q0MsIDB4ODQsIDB4RkIsIDB4MDEsCisJIDB4QTEsIDB4ODQsIDB4NTEsIDB4RjEsIDB4RUEsIDB4MDMsIDB4MEMsIDB4NjAsIDB4ODEsIDB4RkIsIDB4OUQsIDB4RkUsIDB4M0QsIDB4MDUsIDB4QkEsIDB4RkUsCisJIDB4MTAsIDB4NjAsIDB4MzYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEEsIDB4MDQsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUIsIDB4NjAsIDB4RDAsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MTAsIDB4NjAsIDB4MzYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjQsIDB4RjEsIDB4MEYsIDB4NjAsIDB4OUQsIDB4RjksIDB4MDgsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUIsIDB4NjAsCisJIDB4RjUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QkUsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MTEsIDB4RjEsCisJIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTgsIDB4NjAsIDB4MDcsIDB4RjEsIDB4QUQsIDB4NEYsCisJIDB4MDAsIDB4N0YsIDB4RkEsIDB4QjQsIDB4NjQsIDB4NDEsIDB4NjQsIDB4RjEsIDB4MDIsIDB4QjEsIDB4MDQsIDB4NjUsIDB4MDIsIDB4MDIsIDB4NjQsIDB4NDAsCisJIDB4MDEsIDB4MkIsIDB4MDEsIDB4NjUsIDB4QjQsIDB4ODQsIDB4QTAsIDB4NUQsIDB4MTAsIDB4NjAsIDB4MzYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4REUsIDB4RkUsIDB4MEEsIDB4MDQsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUIsIDB4NjAsIDB4Q0QsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjQsIDB4RjEsIDB4MEYsIDB4NjAsIDB4OUQsIDB4RjksIDB4MEUsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUMsIDB4NjAsCisJIDB4MkQsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QkUsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MTEsIDB4RjEsCisJIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTAsIDB4NjAsIDB4MzYsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4NTgsIDB4RjUsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NEYsIDB4RkIsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUMsIDB4NjAsIDB4NTEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4QzEsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MzYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4QTUsIDB4RjEsIDB4MEEsIDB4NjAsIDB4MDksIDB4RjksCisJIDB4MTQsIDB4NjAsIDB4MEUsIDB4NjQsIDB4MEYsIDB4NjAsIDB4QTUsIDB4RkIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsCisJIDB4QTYsIDB4RjEsIDB4MEEsIDB4NjAsIDB4MEYsIDB4RjksIDB4MUYsIDB4NjAsIDB4NDgsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RkQsIDB4MUIsCisJIDB4MTQsIDB4NjAsIDB4MUEsIDB4NjQsIDB4MEYsIDB4NjAsIDB4QTUsIDB4RkIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsCisJIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUMsIDB4NjAsIDB4N0EsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NEYsIDB4RjEsIDB4MTAsIDB4NjAsIDB4MzYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjQsIDB4NDAsCisJIDB4RkYsIDB4MjYsIDB4MEIsIDB4MDAsIDB4NTEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4ODAsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4RUQsIDB4NjAsCisJIDB4NkEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RUIsIDB4NjAsIDB4QjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MEEsIDB4MDAsIDB4NjQsIDB4NEYsIDB4RkIsCisJIDB4QTcsIDB4RjEsIDB4MEEsIDB4NjAsIDB4MEYsIDB4RjksIDB4MDAsIDB4NjAsIDB4MEMsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUMsIDB4NjAsCisJIDB4QTUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTQsIDB4NjAsIDB4MUEsIDB4NjQsIDB4MEYsIDB4NjAsIDB4QTUsIDB4RkIsIDB4MDIsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDAsIDB4NjAsCisJIDB4MDQsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MEIsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MTQsIDB4NjAsIDB4MUEsIDB4NjQsCisJIDB4MEYsIDB4NjAsIDB4QTUsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MTMsIDB4MDAsIDB4RkYsIDB4NjAsCisJIDB4RjcsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NEYsIDB4RjMsIDB4REUsIDB4MEEsIDB4MDAsIDB4QTAsIDB4MDAsIDB4NjQsIDB4MDIsIDB4MDMsCisJIDB4NEYsIDB4RkIsIDB4RDksIDB4MDEsIDB4MTQsIDB4NjAsIDB4MEUsIDB4NjQsIDB4MEYsIDB4NjAsIDB4QTUsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4QjcsIDB4MDEsIDB4MTUsIDB4NjAsIDB4QzEsIDB4RjMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QUIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4QzIsIDB4RkIsIDB4MTUsIDB4NjAsIDB4QkQsIDB4RjMsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsCisJIDB4RUUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTgsIDB4RjUsIDB4MkQsIDB4NjAsIDB4OTQsIDB4NjQsIDB4MDAsIDB4RjQsCisJIDB4NDAsIDB4NDgsIDB4MjgsIDB4NjAsIDB4NEUsIDB4NjQsIDB4MjAsIDB4NDAsIDB4MTAsIDB4MjcsIDB4MDIsIDB4MDAsIDB4MjgsIDB4NjAsIDB4MkMsIDB4NjQsCisJIDB4MjgsIDB4REIsIDB4MDQsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4RTQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QTcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NTgsIDB4RjUsIDB4M0YsIDB4RkMsIDB4NTEsIDB4RjMsIDB4MjAsIDB4NDAsIDB4MTAsIDB4MjMsIDB4MDIsIDB4MDAsIDB4MjAsIDB4QkMsIDB4MDQsIDB4MDAsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjIsIDB4NDAsIDB4QkMsIDB4MDQsIDB4QkMsIDB4ODAsIDB4QkMsIDB4NTEsIDB4RkIsIDB4MTEsIDB4NjAsIDB4MTYsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4NDYsIDB4RkIsIDB4MDYsIDB4NjQsIDB4MDgsIDB4NjAsIDB4NEQsIDB4RkIsIDB4MTUsIDB4NjAsIDB4QzYsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MDcsIDB4QjQsIDB4QTIsIDB4REIsIDB4NTEsIDB4RjMsIDB4MDgsIDB4NjAsIDB4NDYsIDB4RjEsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MjYsIDB4MDMsIDB4MDAsCisJIDB4MDEsIDB4MjYsIDB4MzIsIDB4MDAsIDB4NDUsIDB4MDAsIDB4MDgsIDB4NjAsIDB4NEQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4REQsIDB4QTAsIDB4MDEsIDB4QTQsCisJIDB4NTcsIDB4MDMsIDB4QTIsIDB4REIsIDB4MkIsIDB4NjAsIDB4ODgsIDB4NjEsIDB4RTAsIDB4QTAsIDB4RjAsIDB4QTAsIDB4MDUsIDB4MDUsIDB4MDEsIDB4MDUsCisJIDB4MDUsIDB4MDAsIDB4MDIsIDB4QTEsIDB4RjAsIDB4QTQsIDB4MDIsIDB4MDAsIDB4MDQsIDB4QTEsIDB4RTAsIDB4QTQsIDB4QTEsIDB4RDEsIDB4MDEsIDB4NjEsCisJIDB4REMsIDB4ODQsIDB4Q0MsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDMsIDB4RTEsIDB4ODEsIDB4RkIsIDB4MDEsIDB4QTEsIDB4ODAsIDB4MTAsIDB4NjAsCisJIDB4OUEsIDB4NjQsIDB4MDEsIDB4MDIsIDB4RTAsIDB4MDEsIDB4QTAsIDB4RDMsIDB4MTEsIDB4NjAsIDB4MEUsIDB4NjMsIDB4RkEsIDB4QTQsIDB4Q0MsIDB4ODQsCisJIDB4MDgsIDB4QTMsIDB4RkQsIDB4MDIsIDB4QjEsIDB4RjEsIDB4QTMsIDB4RDMsIDB4MDEsIDB4MTgsIDB4RDUsIDB4MTgsIDB4RkUsIDB4QTMsIDB4QTMsIDB4RDMsCisJIDB4NjQsIDB4RkIsIDB4RUIsIDB4NjAsIDB4Q0QsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTEsIDB4NjAsIDB4RjQsIDB4NjUsIDB4NjQsIDB4NDEsIDB4QTEsIDB4RDMsCisJIDB4RDUsIDB4ODAsIDB4MDAsIDB4QjgsIDB4MjUsIDB4MDcsIDB4MDIsIDB4MDIsIDB4MDgsIDB4QTEsIDB4RjksIDB4MDEsIDB4NjEsIDB4NDQsIDB4MDgsIDB4NjAsCisJIDB4NDYsIDB4RkIsIDB4MDEsIDB4NjQsIDB4QTEsIDB4REIsIDB4NDksIDB4RDMsIDB4NjQsIDB4RkIsIDB4RUIsIDB4NjAsIDB4Q0QsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTEsIDB4NjAsIDB4RjQsIDB4NjUsIDB4NjQsIDB4NDEsIDB4QTEsIDB4RDMsIDB4RDUsIDB4ODAsIDB4MDQsIDB4QjAsIDB4MTEsIDB4MDcsIDB4MDIsIDB4MDIsCisJIDB4MDgsIDB4QTEsIDB4RjksIDB4MDEsIDB4NjEsIDB4NDQsIDB4MDgsIDB4NjAsIDB4NDYsIDB4RkIsIDB4NDksIDB4RDMsIDB4NjQsIDB4RkIsIDB4RUIsIDB4NjAsCisJIDB4Q0QsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4NDYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDgsIDB4QTQsIDB4QTIsIDB4REIsIDB4OUEsIDB4MDEsCisJIDB4MTQsIDB4NjAsIDB4MEUsIDB4NjQsIDB4MEYsIDB4NjAsIDB4QTUsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsCisJIDB4NTEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RTMsIDB4QjQsIDB4NTEsIDB4RkIsIDB4MEMsIDB4NjAsIDB4N0YsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QjQsCisJIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsIDB4MzYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEEsIDB4MDQsIDB4NDAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUQsIDB4NjAsIDB4ODEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4NjMsIDB4RjEsIDB4NjQsIDB4RjksIDB4MEYsIDB4NjAsIDB4OUQsIDB4RjksIDB4MEUsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkQsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUQsIDB4NjAsIDB4QTMsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QkUsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MTEsIDB4RjEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MTEsIDB4RjEsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDAsIDB4NjAsIDB4MzAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUIsIDB4NjAsIDB4NTgsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTQsIDB4NjAsIDB4MEUsIDB4NjQsCisJIDB4MEYsIDB4NjAsIDB4QTUsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NTEsIDB4RkIsCisJIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RkIsIDB4NUEsIDB4REIsIDB4QkUsIDB4RkUsIDB4MDAsIDB4NjAsIDB4MzAsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MUMsIDB4RkIsIDB4RUIsIDB4NjAsIDB4NTgsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MzEsIDB4NDAsIDB4MjAsIDB4MkEsIDB4MzUsIDB4MDAsIDB4M0YsIDB4RjIsIDB4NDcsIDB4NjUsCisJIDB4QzQsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MjMsIDB4RkEsIDB4RjEsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MjQsIDB4RkEsIDB4NjQsIDB4RjMsIDB4MDEsIDB4NjAsCisJIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsIDB4MDEsIDB4MjMsIDB4MTQsIDB4MDAsIDB4MTEsIDB4NjAsIDB4MTQsIDB4NjEsIDB4MTEsIDB4NjAsIDB4RjQsIDB4NjUsCisJIDB4QTEsIDB4RDEsIDB4RDUsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MEIsIDB4MDMsIDB4MDIsIDB4MDMsIDB4MDgsIDB4QTEsIDB4RjksIDB4MDEsIDB4MDQsIDB4QTEsCisJIDB4QTEsIDB4RDMsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjUsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjQsIDB4QjQsIDB4ODQsIDB4MDEsIDB4MDAsIDB4MDEsIDB4NjQsCisJIDB4MDAsIDB4RjQsIDB4MDgsIDB4RkEsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MUYsIDB4NjAsIDB4MTAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsCisJIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RkEsIDB4RkUsIDB4MDAsIDB4NjYsCisJIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NUYsIDB4RkIsIDB4QUMsIDB4ODUsCisJIDB4NjAsIDB4NDEsIDB4MkUsIDB4NjAsIDB4MjIsIDB4NjMsIDB4MTYsIDB4NjAsIDB4QzYsIDB4RkQsIDB4MTYsIDB4NjAsIDB4Q0MsIDB4RkQsIDB4MTYsIDB4NjAsCisJIDB4RDYsIDB4RkQsIDB4MTYsIDB4NjAsIDB4RTAsIDB4RkQsIDB4NUMsIDB4MDMsIDB4NjEsIDB4NUMsIDB4MDAsIDB4NjMsIDB4RTksIDB4ODEsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4MjQsIDB4REYsIDB4ODMsIDB4RkIsIDB4MDIsIDB4MDgsIDB4NjQsIDB4NTMsIDB4OTAsIDB4NjQsIDB4NDEsIDB4MDMsIDB4MDQsIDB4MDEsIDB4NjAsCisJIDB4MDgsIDB4NjMsIDB4MEMsIDB4MDAsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjMsIDB4MTAsIDB4NjQsIDB4RTksIDB4ODEsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MjQsCisJIDB4REYsIDB4ODMsIDB4MDgsIDB4MzYsIDB4MDMsIDB4MDAsIDB4Q0MsIDB4ODQsIDB4RkYsIDB4RkYsIDB4RjcsIDB4MDIsIDB4MTUsIDB4NjAsIDB4RUMsIDB4RkQsCisJIDB4NDMsIDB4NDgsIDB4NjUsIDB4NDEsIDB4MkIsIDB4NjAsIDB4REEsIDB4NjMsIDB4MjgsIDB4NDQsIDB4RkYsIDB4QjUsIDB4MTAsIDB4NjAsIDB4MDgsIDB4NjQsCisJIDB4RTksIDB4ODEsIDB4NTgsIDB4RDEsIDB4RkQsIDB4MDQsIDB4QTMsIDB4RDksIDB4MEMsIDB4MDMsIDB4NTgsIDB4RDEsIDB4RTksIDB4ODEsIDB4NDAsIDB4NEEsCisJIDB4RkMsIDB4MDQsIDB4QTMsIDB4RDEsIDB4NjQsIDB4NDcsIDB4QjAsIDB4ODQsIDB4QkQsIDB4REIsIDB4NjUsIDB4NDQsIDB4QzgsIDB4ODUsIDB4MkEsIDB4NDQsCisJIDB4RUYsIDB4MDIsIDB4MjgsIDB4NDMsIDB4MDgsIDB4M0EsIDB4MjQsIDB4MDAsIDB4NjAsIDB4NDUsIDB4MDQsIDB4NjQsIDB4MzIsIDB4NjAsIDB4MDAsIDB4NjMsCisJIDB4NDEsIDB4NDgsIDB4RTksIDB4ODEsIDB4Q0MsIDB4ODQsIDB4MDIsIDB4MjQsIDB4REYsIDB4ODMsIDB4RkIsIDB4MDIsIDB4NjMsIDB4NDAsIDB4MDAsIDB4MzYsCisJIDB4MTcsIDB4MDAsIDB4MTcsIDB4NjAsIDB4MTEsIDB4RkQsIDB4MkUsIDB4NjAsIDB4MjQsIDB4NjMsIDB4NjUsIDB4NDQsIDB4MjgsIDB4NDEsIDB4RTksIDB4ODEsCisJIDB4NTgsIDB4RDEsIDB4RkQsIDB4MDQsIDB4QTMsIDB4RDksIDB4MTUsIDB4MDMsIDB4NTgsIDB4RDEsIDB4RTksIDB4ODEsIDB4NjAsIDB4NDUsIDB4RkMsIDB4MDQsCisJIDB4QTMsIDB4RDEsIDB4NjQsIDB4NDcsIDB4QjAsIDB4ODQsIDB4QkQsIDB4REIsIDB4MDAsIDB4QjksIDB4NjUsIDB4NDQsIDB4RjAsIDB4MDIsIDB4MDksIDB4MDAsCisJIDB4NjcsIDB4NDMsIDB4MTYsIDB4NjAsIDB4QzYsIDB4RkQsIDB4MTYsIDB4NjAsIDB4Q0MsIDB4RkQsIDB4MTYsIDB4NjAsIDB4RDYsIDB4RkQsIDB4MTYsIDB4NjAsCisJIDB4RTAsIDB4RkQsIDB4MjAsIDB4NDAsIDB4MTAsIDB4MjcsIDB4MEQsIDB4MDAsIDB4MkIsIDB4NjAsIDB4RTIsIDB4NjEsIDB4MTUsIDB4NjAsIDB4RUMsIDB4RjMsCisJIDB4QTEsIDB4REIsIDB4RkYsIDB4QjQsIDB4Q0MsIDB4ODQsIDB4QTgsIDB4ODMsIDB4MkIsIDB4NjAsIDB4RDgsIDB4NjQsIDB4NTgsIDB4RDEsIDB4NTksIDB4RDksCisJIDB4RkQsIDB4MUYsIDB4MkIsIDB4NjAsIDB4RTQsIDB4NjMsIDB4MTUsIDB4NjAsIDB4QkUsIDB4RjMsIDB4MDgsIDB4NjEsIDB4NjAsIDB4RkUsIDB4QTMsIDB4RDEsCisJIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4MDAsIDB4QTgsIDB4RTgsIDB4ODQsIDB4MEYsIDB4MDMsIDB4NjAsIDB4RkUsIDB4MDIsIDB4MjgsIDB4RjYsIDB4MDEsCisJIDB4ODAsIDB4NjIsIDB4QjIsIDB4OUMsIDB4QkQsIDB4RDksIDB4NjIsIDB4RjksIDB4Q0QsIDB4ODEsIDB4MDAsIDB4MzYsIDB4MDEsIDB4MDAsIDB4RUUsIDB4MDEsCisJIDB4MkUsIDB4NjAsIDB4MjQsIDB4NjMsIDB4MDgsIDB4NjEsIDB4RUEsIDB4MDEsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkIsIDB4NjAsIDB4N0MsIDB4NjMsCisJIDB4NjUsIDB4NDAsIDB4RkYsIDB4MzYsIDB4MDIsIDB4QTMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4NDAsIDB4MjYsIDB4N0YsIDB4QjQsIDB4MjAsIDB4MjYsIDB4M0YsIDB4QjQsIDB4NjAsIDB4NDUsIDB4ODAsIDB4NjMsIDB4RUYsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4MzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4REYsIDB4RkIsIDB4NDAsIDB4NjMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4MzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4RTAsIDB4RkIsIDB4MjAsIDB4NjMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MzMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4RTEsIDB4RkIsIDB4MTAsIDB4NjMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MzMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTUsIDB4NjAsIDB4RTIsIDB4RkIsIDB4MDgsIDB4NjMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsCisJIDB4RTMsIDB4RkIsIDB4MDQsIDB4NjMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4RTQsIDB4RkIsCisJIDB4MDIsIDB4NjMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4RTUsIDB4RkIsIDB4MDEsIDB4NjMsCisJIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4RTYsIDB4RkIsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MTUsIDB4NjAsIDB4QkUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MEYsIDB4QjQsIDB4NjAsIDB4NDUsIDB4MDgsIDB4NjMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4NUUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4RTcsIDB4RkIsIDB4MDQsIDB4NjMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NUUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4RTgsIDB4RkIsIDB4MDIsIDB4NjMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NUUsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTUsIDB4NjAsIDB4RTksIDB4RkIsIDB4MDEsIDB4NjMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NUUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsCisJIDB4RUEsIDB4RkIsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NUMsIDB4QTcsIDB4ODQsIDB4RUIsIDB4ODMsIDB4MTQsIDB4MDIsIDB4MDEsIDB4MDMsCisJIDB4RkIsIDB4MDEsIDB4NjQsIDB4NDQsIDB4MDEsIDB4MzYsIDB4MEIsIDB4NjQsIDB4MDIsIDB4MzYsIDB4MEIsIDB4NjQsIDB4MDQsIDB4MzYsIDB4MEEsIDB4NjQsCisJIDB4MDgsIDB4MzYsIDB4MEEsIDB4NjQsIDB4MTAsIDB4MzYsIDB4MDksIDB4NjQsIDB4MjAsIDB4MzYsIDB4MDksIDB4NjQsIDB4NDAsIDB4MzYsIDB4MDksIDB4NjQsCisJIDB4ODAsIDB4MzYsIDB4MDksIDB4NjQsIDB4MTEsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MEIsIDB4NjQsIDB4MDIsIDB4MzYsIDB4MEYsIDB4NjQsCisJIDB4MDQsIDB4MzYsIDB4MEEsIDB4NjQsIDB4MDgsIDB4MzYsIDB4MEUsIDB4NjQsIDB4MTAsIDB4MzYsIDB4MDksIDB4NjQsIDB4MjAsIDB4MzYsIDB4MEQsIDB4NjQsCisJIDB4NDAsIDB4MzYsIDB4MDgsIDB4NjQsIDB4ODAsIDB4MzYsIDB4MEMsIDB4NjQsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NUMsIDB4QTcsIDB4ODQsCisJIDB4RUIsIDB4ODMsIDB4MEMsIDB4MDIsIDB4MDEsIDB4MDMsIDB4RkIsIDB4MDEsIDB4NjQsIDB4NDQsIDB4MDEsIDB4MzYsIDB4MEEsIDB4NjQsIDB4MDIsIDB4MzYsCisJIDB4MTQsIDB4NjQsIDB4MDQsIDB4MzYsIDB4MzcsIDB4NjQsIDB4MDgsIDB4MzYsIDB4NkUsIDB4NjQsIDB4MDksIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsCisJIDB4MEEsIDB4NjQsIDB4MDIsIDB4MzYsIDB4MTQsIDB4NjQsIDB4MDQsIDB4MzYsIDB4MzcsIDB4NjQsIDB4MDgsIDB4MzYsIDB4NkUsIDB4NjQsIDB4MkQsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4RkUsIDB4ODEsIDB4QTEsIDB4N0YsIDB4QTEsIDB4MDIsIDB4MDYsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjEsIDB4NUQsIDB4RDIsCisJIDB4Q0YsIDB4ODMsIDB4RDQsIDB4ODAsIDB4MjUsIDB4MDMsIDB4MTYsIDB4MDMsIDB4Q0YsIDB4ODMsIDB4NjEsIDB4NDQsIDB4ODAsIDB4QTAsIDB4MjAsIDB4MDMsCisJIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjEsIDB4NUQsIDB4RDIsIDB4Q0YsIDB4ODMsIDB4ODEsIDB4QTEsIDB4MTksIDB4MDMsIDB4MDUsIDB4MDcsCisJIDB4N0YsIDB4QTEsIDB4Q0MsIDB4ODQsIDB4REQsIDB4ODEsIDB4RTYsIDB4MDMsIDB4RjcsIDB4MDEsIDB4MDAsIDB4RjQsIDB4MDAsIDB4QjgsIDB4MDQsIDB4NjEsCisJIDB4RTYsIDB4MDMsIDB4RjIsIDB4MDEsIDB4MkMsIDB4NDMsIDB4NUQsIDB4RDAsIDB4REUsIDB4RDksIDB4NjQsIDB4NDQsIDB4NUQsIDB4RDAsIDB4REUsIDB4RDksCisJIDB4Q0MsIDB4ODQsIDB4ODEsIDB4QTEsIDB4MDUsIDB4MDMsIDB4N0YsIDB4QTEsIDB4RjksIDB4MDQsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjEsIDB4RjYsIDB4MDEsCisJIDB4MjAsIDB4RkUsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MTYsIDB4NjQsIDB4MkIsIDB4MDAsIDB4MDIsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MTQsIDB4NjQsIDB4MjcsIDB4MDAsIDB4MDQsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MTIsIDB4NjQsIDB4MjMsIDB4MDAsIDB4MDgsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MTAsIDB4NjQsIDB4MUYsIDB4MDAsIDB4MTAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MEUsIDB4NjQsIDB4MUIsIDB4MDAsIDB4MjAsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MEMsIDB4NjQsIDB4MTcsIDB4MDAsIDB4NDAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MEEsIDB4NjQsIDB4MTMsIDB4MDAsIDB4ODAsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDgsIDB4NjQsIDB4MEYsIDB4MDAsIDB4MDEsIDB4M0IsIDB4MDIsIDB4MDAsIDB4MDYsIDB4NjQsIDB4MEIsIDB4MDAsIDB4MDIsIDB4M0IsCisJIDB4MDIsIDB4MDAsIDB4MDQsIDB4NjQsIDB4MDcsIDB4MDAsIDB4MDQsIDB4M0IsIDB4MDIsIDB4MDAsIDB4MDIsIDB4NjQsIDB4MDMsIDB4MDAsIDB4MDgsIDB4M0IsCisJIDB4RkYsIDB4MDEsIDB4MDAsIDB4NjQsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MzYsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjEsIDB4MkMsIDB4MDAsIDB4MzAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDIsIDB4NjEsIDB4MjgsIDB4MDAsIDB4MjQsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDQsIDB4NjEsIDB4MjQsIDB4MDAsIDB4MTgsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDYsIDB4NjEsIDB4MjAsIDB4MDAsIDB4MTIsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDgsIDB4NjEsIDB4MUMsIDB4MDAsIDB4MEMsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MEEsIDB4NjEsIDB4MTgsIDB4MDAsIDB4MDksIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MEMsIDB4NjEsIDB4MTQsIDB4MDAsIDB4MDYsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MEUsIDB4NjEsIDB4MTAsIDB4MDAsIDB4NkUsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MTAsIDB4NjEsIDB4MEMsIDB4MDAsIDB4MzcsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MTIsIDB4NjEsIDB4MDgsIDB4MDAsIDB4MTQsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MTQsIDB4NjEsIDB4MDQsIDB4MDAsIDB4MEEsIDB4M0EsIDB4RkYsIDB4RkYsIDB4MTYsIDB4NjEsIDB4MDAsIDB4MDAsIDB4NjUsIDB4NDAsCisJIDB4MDEsIDB4M0EsIDB4MTMsIDB4MDAsIDB4NjYsIDB4NDUsIDB4MkIsIDB4NDYsIDB4OTIsIDB4RkEsIDB4NjUsIDB4NDYsIDB4MjYsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDEsIDB4MDAsIDB4N0YsIDB4NjAsIDB4NDUsIDB4NjEsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RDQsIDB4ODQsIDB4NjYsIDB4NDEsIDB4MkIsIDB4NDYsCisJIDB4MEUsIDB4RjIsIDB4NjAsIDB4NDUsIDB4NjUsIDB4NUUsIDB4MEUsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4Q0QsIDB4ODEsCisJIDB4N0YsIDB4QjQsIDB4MDIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDEsIDB4NjQsIDB4MkUsIDB4MDAsIDB4MDQsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDIsIDB4NjQsCisJIDB4MkEsIDB4MDAsIDB4MEIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDQsIDB4NjQsIDB4MjYsIDB4MDAsIDB4MTYsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDgsIDB4NjQsCisJIDB4MjIsIDB4MDAsIDB4MEMsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MTAsIDB4NjQsIDB4MUUsIDB4MDAsIDB4MTIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MjAsIDB4NjQsCisJIDB4MUEsIDB4MDAsIDB4MTgsIDB4M0EsIDB4MDIsIDB4MDAsIDB4NDAsIDB4NjQsIDB4MTYsIDB4MDAsIDB4MjQsIDB4M0EsIDB4MDIsIDB4MDAsIDB4ODAsIDB4NjQsCisJIDB4MTIsIDB4MDAsIDB4MzAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDEsIDB4N0YsIDB4MEUsIDB4MDAsIDB4NDgsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDIsIDB4N0YsCisJIDB4MEEsIDB4MDAsIDB4NjAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDQsIDB4N0YsIDB4MDYsIDB4MDAsIDB4NkMsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDgsIDB4N0YsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MjAsIDB4RkUsIDB4MkEsIDB4NDUsIDB4MzQsIDB4OEEsIDB4NjAsIDB4RkUsIDB4NjEsIDB4NDAsCisJIDB4MDAsIDB4MzYsIDB4MDIsIDB4MDAsIDB4QkQsIDB4RDMsIDB4QzMsIDB4MDEsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NTMsIDB4RkIsIDB4NTQsIDB4RkIsCisJIDB4MDAsIDB4NjAsIDB4MEMsIDB4NjMsIDB4MTQsIDB4NjAsIDB4RUMsIDB4NjIsIDB4MDAsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkUsIDB4MUYsIDB4MDIsIDB4NjQsCisJIDB4MEEsIDB4NjAsIDB4NzgsIDB4RkIsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4NjAsIDB4N0EsIDB4RjMsIDB4MDAsIDB4NjMsIDB4RjAsIDB4QTAsCisJIDB4MDEsIDB4QTQsIDB4MDMsIDB4MDMsIDB4QTIsIDB4REIsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTIsIDB4REQsIDB4MEEsIDB4NjAsIDB4N0IsIDB4RjEsCisJIDB4QTIsIDB4REQsIDB4NUEsIDB4RDMsIDB4QTIsIDB4REQsIDB4QzAsIDB4ODEsIDB4NjEsIDB4NDQsIDB4MDIsIDB4MjQsIDB4RkYsIDB4RkYsIDB4RTksIDB4ODEsCisJIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4NUEsIDB4RDMsIDB4RTksIDB4ODEsIDB4RTgsIDB4ODMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsCisJIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODUsIDB4RDQsIDB4ODUsIDB4QzUsIDB4ODMsIDB4QTIsIDB4REQsIDB4NjMsIDB4NDcsIDB4MDAsIDB4N0YsIDB4MEEsIDB4NjAsCisJIDB4NzcsIDB4RkIsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4N0YsIDB4NjcsIDB4MDEsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QjEsIDB4RkUsCisJIDB4MDUsIDB4MDUsIDB4QjAsIDB4RkUsIDB4MDYsIDB4MDUsIDB4QjIsIDB4RkUsIDB4QjMsIDB4RkUsIDB4MjEsIDB4MDAsIDB4RjcsIDB4NjAsIDB4MzgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjgsIDB4RjMsIDB4MjksIDB4RjEsIDB4NDAsIDB4NDQsIDB4NDQsIDB4NDUsIDB4MkEsIDB4RjEsIDB4MkIsIDB4RjEsIDB4NDQsIDB4NDYsCisJIDB4NDQsIDB4NDcsIDB4M0YsIDB4QjQsIDB4RTAsIDB4ODUsIDB4MTksIDB4NjAsIDB4MDYsIDB4NjQsIDB4NDQsIDB4RDcsIDB4NTgsIDB4NDMsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDUsIDB4MEEsIDB4NjAsIDB4N0UsIDB4RjMsIDB4NjEsIDB4NDMsIDB4MDQsIDB4QjQsIDB4MjQsIDB4NDQsIDB4MDIsIDB4MDMsIDB4MTMsIDB4RkYsCisJIDB4MDYsIDB4MDAsIDB4M0YsIDB4QjQsIDB4QjQsIDB4ODQsIDB4RkYsIDB4MjcsIDB4MDUsIDB4RkQsIDB4MDQsIDB4RkIsIDB4MTAsIDB4NzUsIDB4QTEsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4ODYsIDB4M0UsIDB4QjQsIDB4RkUsIDB4MDksIDB4MDUsIDB4QjUsIDB4RkUsIDB4MDIsIDB4MjQsIDB4N0YsIDB4RjcsIDB4RkYsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4QjcsIDB4RkUsIDB4MDUsIDB4MDUsIDB4QjYsIDB4RkUsIDB4RjIsIDB4MDEsIDB4RjcsIDB4NjAsIDB4NzMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MzYsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RUUsIDB4QTAsIDB4NjAsIDB4NDUsIDB4MDUsIDB4MDUsIDB4MTksIDB4NjAsIDB4OTgsIDB4NjQsIDB4NDQsIDB4RDcsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RTQsIDB4MDEsIDB4RTMsIDB4MDEsIDB4N0YsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsCisJIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjEsIDB4MTAsIDB4MDIsIDB4MTAsIDB4NjQsIDB4NDAsIDB4NDAsIDB4MDIsIDB4NjQsIDB4NDAsIDB4NTAsIDB4NjEsIDB4RkYsCisJIDB4M0YsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MDQsIDB4MDAsIDB4MTAsIDB4RTAsIDB4NDYsIDB4NjAsIDB4MDksIDB4RTAsIDB4MDAsIDB4MDAsIDB4MjcsIDB4RjEsCisJIDB4MDAsIDB4NjYsIDB4MjAsIDB4NzgsIDB4NDIsIDB4RkUsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4N0YsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsCisJIDB4QTQsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjEsIDB4MTksIDB4MDIsIDB4MEEsIDB4NjAsIDB4N0UsIDB4RjMsIDB4MDcsIDB4N0MsIDB4MjAsIDB4QjUsCisJIDB4MEMsIDB4QjUsIDB4MDQsIDB4MDMsIDB4MDMsIDB4MDIsIDB4QkMsIDB4RjksIDB4MDAsIDB4NjcsIDB4MEYsIDB4MDAsIDB4MDAsIDB4NjEsIDB4NDEsIDB4NTYsCisJIDB4QzcsIDB4RkUsIDB4QjUsIDB4MDEsIDB4MzYsIDB4NDcsIDB4RkYsIDB4MjMsIDB4MDQsIDB4MDAsIDB4MDAsIDB4N0YsIDB4NjAsIDB4NDEsIDB4N0YsIDB4NjcsCisJIDB4MDQsIDB4MDAsIDB4MjAsIDB4NDQsIDB4ODAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4N0YsIDB4NjAsCisJIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjEsIDB4MzEsIDB4MDIsIDB4MEEsIDB4NjAsIDB4N0UsIDB4RjMsCisJIDB4MDEsIDB4N0MsIDB4MjAsIDB4QjUsIDB4MEMsIDB4QjUsIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDIsIDB4QkMsIDB4RjksIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjEsCisJIDB4NDEsIDB4NTYsIDB4QzcsIDB4RkUsIDB4RjAsIDB4NjAsIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4N0QsIDB4RjEsIDB4MjAsIDB4NDQsIDB4NjQsIDB4NDAsCisJIDB4RkYsIDB4MjYsIDB4MUMsIDB4MDAsIDB4N0YsIDB4QjQsIDB4NDAsIDB4NDAsIDB4NUMsIDB4NUUsIDB4ODIsIDB4RkYsIDB4MjYsIDB4NDQsIDB4RkQsIDB4QjQsCisJIDB4NDAsIDB4NDYsIDB4NUMsIDB4NDEsIDB4ODcsIDB4RkYsIDB4NjIsIDB4RkYsIDB4MEYsIDB4NjAsIDB4ODUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsCisJIDB4NjAsIDB4NDYsIDB4MDQsIDB4MDMsIDB4MDksIDB4RjIsIDB4OEYsIDB4RkMsIDB4QUMsIDB4ODYsIDB4RkIsIDB4MDEsIDB4RDMsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4RkUsIDB4QjQsIDB4RDMsIDB4RkIsIDB4MDYsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OUYsIDB4RkIsIDB4MkQsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDYsIDB4MDEsIDB4RjIsIDB4MDgsIDB4RjAsIDB4NjAsIDB4NDcsIDB4MDMsIDB4QjQsIDB4MDMsIDB4QUMsIDB4N0YsIDB4NjcsCisJIDB4MDMsIDB4NjEsIDB4MDgsIDB4MDIsIDB4MUYsIDB4NjAsIDB4MjYsIDB4NjQsIDB4NDAsIDB4NEIsIDB4RjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NDAsIDB4MDEsIDB4MkIsIDB4NDksIDB4MDAsIDB4MjUsIDB4NDQsCisJIDB4MUYsIDB4QjQsIDB4RTAsIDB4ODUsIDB4RjEsIDB4NjAsIDB4NzYsIDB4NjQsIDB4QzQsIDB4OTgsIDB4RkYsIDB4RkYsIDB4QzAsIDB4RkUsIDB4M0QsIDB4MDAsCisJIDB4QzEsIDB4RkUsIDB4M0IsIDB4MDAsIDB4QzIsIDB4RkUsIDB4MzksIDB4MDAsIDB4QzMsIDB4RkUsIDB4MzcsIDB4MDAsIDB4QzQsIDB4RkUsIDB4MzUsIDB4MDAsCisJIDB4QzUsIDB4RkUsIDB4MzMsIDB4MDAsIDB4QzYsIDB4RkUsIDB4MzEsIDB4MDAsIDB4QzcsIDB4RkUsIDB4MkYsIDB4MDAsIDB4QzgsIDB4RkUsIDB4MkQsIDB4MDAsCisJIDB4QzksIDB4RkUsIDB4MkIsIDB4MDAsIDB4Q0EsIDB4RkUsIDB4MjksIDB4MDAsIDB4Q0IsIDB4RkUsIDB4MjcsIDB4MDAsIDB4Q0MsIDB4RkUsIDB4MjUsIDB4MDAsCisJIDB4Q0QsIDB4RkUsIDB4MjMsIDB4MDAsIDB4Q0UsIDB4RkUsIDB4MjEsIDB4MDAsIDB4Q0YsIDB4RkUsIDB4MUYsIDB4MDAsIDB4RDAsIDB4RkUsIDB4MUQsIDB4MDAsCisJIDB4RDEsIDB4RkUsIDB4MUIsIDB4MDAsIDB4RDIsIDB4RkUsIDB4MTksIDB4MDAsIDB4RDMsIDB4RkUsIDB4MTcsIDB4MDAsIDB4RDQsIDB4RkUsIDB4MTUsIDB4MDAsCisJIDB4RDUsIDB4RkUsIDB4MTMsIDB4MDAsIDB4RDYsIDB4RkUsIDB4MTEsIDB4MDAsIDB4RDcsIDB4RkUsIDB4MEYsIDB4MDAsIDB4RDgsIDB4RkUsIDB4MEQsIDB4MDAsCisJIDB4RDksIDB4RkUsIDB4MEIsIDB4MDAsIDB4REEsIDB4RkUsIDB4MDksIDB4MDAsIDB4REIsIDB4RkUsIDB4MDcsIDB4MDAsIDB4REMsIDB4RkUsIDB4MDUsIDB4MDAsCisJIDB4REQsIDB4RkUsIDB4MDMsIDB4MDAsIDB4REUsIDB4RkUsIDB4MDEsIDB4MDAsIDB4REYsIDB4RkUsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjQsIDB4OUYsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OUUsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OUQsIDB4RkUsCisJIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OUMsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OUIsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4OUEsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTksIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTgsIDB4RkUsIDB4RjAsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4OTcsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTYsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTUsIDB4RkUsCisJIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTQsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTMsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4OTIsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTEsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTAsIDB4RkUsIDB4RjAsIDB4ODQsCisJIDB4MDYsIDB4RkIsIDB4OEYsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OEUsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OEQsIDB4RkUsCisJIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OEMsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OEIsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4OEEsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODksIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODgsIDB4RkUsIDB4RjAsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4ODcsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODYsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODUsIDB4RkUsCisJIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODQsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODMsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4ODIsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODEsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODAsIDB4RkUsIDB4RjAsIDB4ODQsCisJIDB4MDUsIDB4RkIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NUMsIDB4NUMsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MjQsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NTUsIDB4MDAsIDB4MDUsIDB4NjAsIDB4MDAsIDB4NjMsIDB4MDUsIDB4RkQsIDB4MzAsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MzEsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzIsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzQsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MzUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzYsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzcsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzgsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MzksIDB4NDQsIDB4QkQsIDB4REIsIDB4M0EsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0IsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0MsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4M0QsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0UsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0YsIDB4NDQsIDB4QkQsIDB4REIsIDB4MDIsIDB4NjEsIDB4NjEsIDB4NDQsCisJIDB4MDIsIDB4MzYsIDB4ODIsIDB4RkYsIDB4MDMsIDB4MzYsIDB4ODMsIDB4RkYsIDB4MDQsIDB4MzYsIDB4ODQsIDB4RkYsIDB4MDUsIDB4MzYsIDB4ODUsIDB4RkYsCisJIDB4MDYsIDB4MzYsIDB4ODYsIDB4RkYsIDB4MDcsIDB4MzYsIDB4ODcsIDB4RkYsIDB4MjAsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjEsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MjIsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjQsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjUsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MjYsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjcsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjgsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjksIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MkEsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkIsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkQsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MkUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkYsIDB4NDQsIDB4QkQsIDB4REIsIDB4REQsIDB4ODEsIDB4MDgsIDB4M0EsIDB4RDAsIDB4MDEsIDB4NTQsIDB4MDAsCisJIDB4MjcsIDB4NDAsIDB4MTAsIDB4MjYsIDB4MzAsIDB4MDAsIDB4MjYsIDB4NDQsIDB4MDEsIDB4MzYsIDB4MkQsIDB4MDAsIDB4MDIsIDB4MzYsIDB4ODIsIDB4RkYsCisJIDB4MDMsIDB4MzYsIDB4ODMsIDB4RkYsIDB4MDQsIDB4MzYsIDB4ODQsIDB4RkYsIDB4MDUsIDB4MzYsIDB4ODUsIDB4RkYsIDB4MDYsIDB4MzYsIDB4ODYsIDB4RkYsCisJIDB4MjUsIDB4NDQsIDB4MDAsIDB4MzYsIDB4NDQsIDB4NDAsIDB4MDEsIDB4MzYsIDB4NDQsIDB4NDEsIDB4MDIsIDB4MzYsIDB4NDQsIDB4NDIsIDB4MDMsIDB4MzYsCisJIDB4NDQsIDB4NDMsIDB4MDQsIDB4MzYsIDB4NDQsIDB4NDQsIDB4MDUsIDB4MzYsIDB4NDQsIDB4NDUsIDB4MDYsIDB4MzYsIDB4NDQsIDB4NDYsIDB4MDcsIDB4MzYsCisJIDB4NDQsIDB4NDcsIDB4MDgsIDB4MzYsIDB4NDQsIDB4NDgsIDB4MDksIDB4MzYsIDB4NDQsIDB4NDksIDB4MEEsIDB4MzYsIDB4NDQsIDB4NEEsIDB4MEIsIDB4MzYsCisJIDB4NDQsIDB4NEIsIDB4MEMsIDB4MzYsIDB4NDQsIDB4NEMsIDB4MEQsIDB4MzYsIDB4NDQsIDB4NEQsIDB4MEUsIDB4MzYsIDB4NDQsIDB4NEUsIDB4MEYsIDB4MzYsCisJIDB4NDQsIDB4NEYsIDB4ODcsIDB4RkYsIDB4MjEsIDB4MDAsIDB4MjUsIDB4NDQsIDB4MTAsIDB4MzYsIDB4NDQsIDB4NTAsIDB4MTEsIDB4MzYsIDB4NDQsIDB4NTEsCisJIDB4MTIsIDB4MzYsIDB4NDQsIDB4NTIsIDB4MTMsIDB4MzYsIDB4NDQsIDB4NTMsIDB4MTQsIDB4MzYsIDB4NDQsIDB4NTQsIDB4MTUsIDB4MzYsIDB4NDQsIDB4NTUsCisJIDB4MTYsIDB4MzYsIDB4NDQsIDB4NTYsIDB4MTcsIDB4MzYsIDB4NDQsIDB4NTcsIDB4MTgsIDB4MzYsIDB4NDQsIDB4NTgsIDB4MTksIDB4MzYsIDB4NDQsIDB4NTksCisJIDB4MUEsIDB4MzYsIDB4NDQsIDB4NUEsIDB4MUIsIDB4MzYsIDB4NDQsIDB4NUIsIDB4MUMsIDB4MzYsIDB4NDQsIDB4NUMsIDB4MUQsIDB4MzYsIDB4NDQsIDB4NUQsCisJIDB4MUUsIDB4MzYsIDB4NDQsIDB4NUUsIDB4MUYsIDB4MzYsIDB4NDQsIDB4NUYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDYsCisJIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NEIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDMsIDB4NjEsIDB4N0YsIDB4NjcsIDB4MEEsIDB4MDIsIDB4MDAsIDB4RjAsCisJIDB4MDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTMsIDB4RkIsIDB4NUEsIDB4RDksIDB4MEEsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsIDB4N0YsIDB4NjcsCisJIDB4MDIsIDB4NjEsIDB4MTIsIDB4MDIsIDB4MTQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OUYsIDB4RkIsIDB4MDAsIDB4NjAsIDB4NTAsIDB4NjMsIDB4NUEsIDB4REQsCisJIDB4RjIsIDB4NjAsIDB4RjcsIDB4NjQsIDB4N0YsIDB4RkIsIDB4MkQsIDB4RkYsIDB4RjAsIDB4NjAsIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjMsCisJIDB4MDUsIDB4RkIsIDB4MkIsIDB4RjMsIDB4MDYsIDB4RkIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NjAsIDB4QzAsIDB4NjQsCisJIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjEsIDB4MEUsIDB4MDIsIDB4MTYsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OUYsIDB4RkIsCisJIDB4MDAsIDB4NjAsIDB4NTAsIDB4NjMsIDB4NUEsIDB4REQsIDB4RjMsIDB4NjAsIDB4MTIsIDB4NjQsIDB4N0YsIDB4RkIsIDB4MkQsIDB4RkYsIDB4RjAsIDB4NjAsCisJIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4N0YsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsCisJIDB4QTQsIDB4ODAsIDB4MDIsIDB4NjEsIDB4MzUsIDB4MDIsIDB4MjUsIDB4NDUsIDB4RjEsIDB4NjAsIDB4MDIsIDB4NjQsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MzQsIDB4MDMsIDB4RjEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDMsIDB4MjgsIDB4MDAsIDB4MTUsIDB4NjAsCisJIDB4QzMsIDB4RjEsIDB4OTksIDB4RjMsIDB4MTksIDB4NjAsIDB4MDAsIDB4NjEsIDB4QTAsIDB4ODQsIDB4QTEsIDB4REIsIDB4MjUsIDB4NDUsIDB4MUUsIDB4NjAsCisJIDB4OTYsIDB4NjMsIDB4MDEsIDB4NjEsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDEsIDB4RDQsIDB4ODAsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDUsIDB4Q0QsIDB4ODEsCisJIDB4MDIsIDB4MDMsIDB4MTUsIDB4MDMsIDB4RjcsIDB4MDEsIDB4QTIsIDB4RkYsIDB4QTYsIDB4RDMsIDB4NDAsIDB4NEMsIDB4MDAsIDB4QTgsIDB4NjcsIDB4NDMsCisJIDB4MEMsIDB4MDIsIDB4QTIsIDB4REQsIDB4NDIsIDB4NDgsIDB4NjQsIDB4NDEsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QTIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjYsIDB4NDQsIDB4MjgsIDB4REIsIDB4MDIsIDB4MDMsIDB4MkMsIDB4NTgsIDB4QTMsIDB4RkYsIDB4MEMsIDB4NjEsIDB4MDMsIDB4MDAsIDB4MDQsIDB4NjEsCisJIDB4N0YsIDB4NjcsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RjEsIDB4NjAsIDB4MDIsIDB4NjQsIDB4RDQsIDB4ODAsCisJIDB4N0YsIDB4NjcsIDB4MDYsIDB4NjMsIDB4RjgsIDB4MDIsIDB4MzEsIDB4NDAsIDB4MjEsIDB4MkEsIDB4RjUsIDB4MDEsIDB4MDEsIDB4NjQsIDB4MEMsIDB4NjAsCisJIDB4ODIsIDB4RkIsIDB4RkYsIDB4RkYsIDB4QzQsIDB4RkUsIDB4RUUsIDB4MDEsIDB4QzYsIDB4RkUsIDB4RUMsIDB4MDEsIDB4N0UsIDB4NjAsIDB4QzAsIDB4NjQsCisJIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsIDB4MDIsIDB4NjEsIDB4M0YsIDB4MDIsIDB4MjUsIDB4NDUsIDB4RjgsIDB4MkIsIDB4M0IsIDB4MDAsIDB4MkUsIDB4RjUsCisJIDB4NjcsIDB4NDQsIDB4RDQsIDB4ODAsIDB4MTksIDB4NjAsIDB4QUEsIDB4NjMsIDB4MzksIDB4MDMsIDB4N0UsIDB4NjEsIDB4MjQsIDB4NDQsIDB4MDEsIDB4MjcsCisJIDB4MjksIDB4MDAsIDB4QTMsIDB4RkMsIDB4QTQsIDB4RjgsIDB4QkQsIDB4RDMsIDB4QTMsIDB4RDEsIDB4RDQsIDB4ODAsIDB4Q0QsIDB4ODEsIDB4MDgsIDB4MjQsCisJIDB4NjQsIDB4NTgsIDB4MDgsIDB4QTMsIDB4RjgsIDB4MDIsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NjMsIDB4QkQsIDB4RDMsIDB4QTMsIDB4RDEsIDB4RkUsIDB4QTAsCisJIDB4RkEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsIDB4MTQsIDB4MDIsIDB4MTMsIDB4MDIsIDB4MDQsIDB4QTMsIDB4QkUsIDB4RDMsIDB4QkQsIDB4RDEsCisJIDB4MEYsIDB4MTgsIDB4RDQsIDB4ODAsIDB4MEQsIDB4MTgsIDB4MDMsIDB4MDMsIDB4QzMsIDB4ODMsIDB4QzMsIDB4ODMsIDB4RjcsIDB4MDEsIDB4NjQsIDB4NDEsCisJIDB4REQsIDB4ODEsIDB4RTEsIDB4ODEsIDB4Q0IsIDB4ODMsIDB4NDYsIDB4NjUsIDB4RjgsIDB4NjAsIDB4NTgsIDB4NEYsIDB4N0EsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjcsIDB4MEEsIDB4MDAsIDB4QkQsIDB4RDMsIDB4QkUsIDB4RDEsIDB4RDQsIDB4ODAsIDB4Q0QsIDB4ODEsIDB4MDgsIDB4MjQsIDB4NjQsIDB4NTgsCisJIDB4MDgsIDB4QTMsIDB4RjgsIDB4MDIsIDB4MDQsIDB4NjEsIDB4N0YsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjQsIDB4MjMsIDB4RkEsCisJIDB4NjcsIDB4NDQsIDB4MjQsIDB4RkEsIDB4NjIsIDB4NDEsIDB4M0UsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MUEsIDB4NjMsIDB4RjcsIDB4NjAsIDB4OEMsIDB4NjQsCisJIDB4NjUsIDB4NDYsIDB4NTgsIDB4RDAsIDB4MkUsIDB4RjUsIDB4NTksIDB4RDgsIDB4RkIsIDB4MUYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4NEIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4RTgsIDB4ODQsIDB4REMsIDB4ODQsIDB4MjMsIDB4RkEsIDB4QkYsIDB4RDEsIDB4NEEsIDB4NjUsCisJIDB4NjQsIDB4NDMsIDB4RjgsIDB4NjAsIDB4NTgsIDB4NEYsIDB4N0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MjUsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RTAsIDB4QTAsIDB4MjAsIDB4NjQsIDB4MDEsIDB4MDYsIDB4MjUsIDB4RkEsIDB4MjMsIDB4RjIsIDB4REYsIDB4RDEsCisJIDB4Q0MsIDB4ODQsIDB4RTAsIDB4ODUsIDB4MEIsIDB4MDYsIDB4QkYsIDB4RDEsIDB4NjQsIDB4NDEsIDB4RDUsIDB4ODAsIDB4NjQsIDB4NDMsIDB4MDEsIDB4MDYsCisJIDB4NjUsIDB4NDEsIDB4NEEsIDB4NjUsIDB4RjQsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QkQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4QkMsIDB4RjMsIDB4MDIsIDB4NjMsIDB4MjMsIDB4RkMsIDB4MDcsIDB4QjQsIDB4MjUsIDB4RkEsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4NEIsIDB4RDMsIDB4QkYsIDB4RDMsIDB4NjAsIDB4NDEsIDB4QzksIDB4ODMsIDB4RTksIDB4ODEsIDB4REQsIDB4ODEsIDB4QTMsIDB4RkEsCisJIDB4RTAsIDB4ODEsIDB4M0MsIDB4NjAsIDB4MDAsIDB4NjcsIDB4MDIsIDB4MjQsIDB4MDIsIDB4QTQsIDB4NjAsIDB4NDcsIDB4NDAsIDB4NEIsIDB4QzksIDB4ODEsCisJIDB4NEEsIDB4NjUsIDB4QUIsIDB4NDYsIDB4NTksIDB4RDAsIDB4QUIsIDB4NDYsIDB4QTUsIDB4RDgsIDB4REEsIDB4ODUsIDB4ODAsIDB4M0EsIDB4MDIsIDB4MDAsCisJIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4RjYsIDB4MUYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QTMsIDB4QTMsIDB4RDEsCisJIDB4NEMsIDB4NjUsIDB4QTQsIDB4RDMsIDB4REEsIDB4ODMsIDB4NjAsIDB4NDcsIDB4MjUsIDB4RkEsIDB4MDAsIDB4N0UsIDB4NjAsIDB4NDcsIDB4MDEsIDB4MjYsCisJIDB4REMsIDB4ODQsIDB4NjAsIDB4NDEsIDB4RTgsIDB4ODQsIDB4RDgsIDB4ODQsIDB4MjMsIDB4RkEsIDB4QUIsIDB4MDEsIDB4RkMsIDB4QTMsIDB4QTMsIDB4RDEsCisJIDB4NEMsIDB4NjUsIDB4QTQsIDB4RDMsIDB4REEsIDB4ODMsIDB4MDAsIDB4N0YsIDB4MjUsIDB4RkEsIDB4NjAsIDB4NDEsIDB4MDEsIDB4MjYsIDB4REQsIDB4ODEsCisJIDB4RTksIDB4ODQsIDB4RDgsIDB4ODQsIDB4MjMsIDB4RkEsIDB4OUQsIDB4MDEsIDB4MjMsIDB4RjIsIDB4MjUsIDB4RjIsIDB4MDIsIDB4QTgsIDB4RjgsIDB4QTAsCisJIDB4MEYsIDB4MDIsIDB4RUMsIDB4QTAsIDB4MEQsIDB4MDQsIDB4MEMsIDB4MDcsIDB4MTUsIDB4NjAsIDB4RDIsIDB4RjEsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDcsIDB4MTUsIDB4NjAsIDB4RDIsIDB4RkIsIDB4MTUsIDB4NjAsIDB4RDYsIDB4RkIsIDB4MTMsIDB4NjAsIDB4NUIsIDB4RkIsCisJIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4RjIsIDB4MTQsIDB4NjAsIDB4RUUsIDB4NjUsIDB4NjAsIDB4NDEsIDB4MTQsIDB4NjAsCisJIDB4OEEsIDB4NjMsIDB4QTMsIDB4REIsIDB4RkYsIDB4QTEsIDB4NDgsIDB4NjQsIDB4NTgsIDB4RDAsIDB4N0UsIDB4QTgsIDB4NUIsIDB4RDksIDB4MDIsIDB4MDIsCisJIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjQsIDB4RkYsIDB4QTEsIDB4RDcsIDB4ODAsIDB4MDIsIDB4MDMsIDB4MDEsIDB4MDMsIDB4RjUsIDB4MDEsIDB4MkUsIDB4RjUsCisJIDB4MDAsIDB4NjAsIDB4MkYsIDB4NjUsIDB4MjUsIDB4RjIsIDB4MDAsIDB4NjMsIDB4Q0MsIDB4ODQsIDB4MDMsIDB4QTMsIDB4RkQsIDB4MDUsIDB4NEEsIDB4NjQsCisJIDB4RDcsIDB4ODAsIDB4MTQsIDB4NjAsIDB4MjYsIDB4NjEsIDB4MTgsIDB4MDUsIDB4QTEsIDB4REQsIDB4RTMsIDB4ODMsIDB4RkUsIDB4QTMsIDB4NTgsIDB4RDAsCisJIDB4N0UsIDB4QTgsIDB4NTksIDB4RDksIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjQsIDB4RjksIDB4MUYsIDB4MDAsIDB4NjMsIDB4NTksIDB4REQsCisJIDB4MkUsIDB4RjUsIDB4MjUsIDB4RjAsIDB4MEEsIDB4NjAsIDB4MTMsIDB4RjMsIDB4RDMsIDB4ODAsIDB4MDEsIDB4QjAsIDB4MDQsIDB4MDMsIDB4MDEsIDB4QTQsCisJIDB4MDMsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDEsIDB4MDAsIDB4QTIsIDB4REQsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTQsIDB4NjAsCisJIDB4OEEsIDB4NjEsIDB4QTEsIDB4RDMsIDB4MjMsIDB4RkEsIDB4RTAsIDB4ODMsIDB4NEEsIDB4NjUsIDB4MDQsIDB4MDIsIDB4MDIsIDB4NjMsIDB4MjMsIDB4RkMsCisJIDB4QTUsIDB4RkMsIDB4MDksIDB4MDAsIDB4REIsIDB4ODMsIDB4NTksIDB4RDEsIDB4QTUsIDB4RDgsIDB4REEsIDB4ODUsIDB4ODAsIDB4M0EsIDB4MDIsIDB4MDAsCisJIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4RjgsIDB4MUYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4NjAsIDB4MTMsIDB4RjMsCisJIDB4MDAsIDB4NjEsIDB4MDIsIDB4QTQsIDB4RkUsIDB4QTAsIDB4MjMsIDB4RkEsIDB4MUIsIDB4MDMsIDB4RkEsIDB4QTQsIDB4RkQsIDB4QTQsIDB4MDEsIDB4QTEsCisJIDB4RkQsIDB4MDcsIDB4NjEsIDB4NDMsIDB4MjMsIDB4RjIsIDB4MjUsIDB4RkMsIDB4RTAsIDB4ODMsIDB4MDIsIDB4QTMsIDB4MTQsIDB4NjAsIDB4MjYsIDB4NjEsCisJIDB4MDAsIDB4NjAsIDB4NEEsIDB4NjQsIDB4NTksIDB4RDEsIDB4NTgsIDB4RDgsIDB4N0UsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjQsCisJIDB4RjksIDB4MUYsIDB4MjUsIDB4RjIsIDB4MjMsIDB4RjIsIDB4MDEsIDB4QjAsIDB4Q0MsIDB4ODQsIDB4MDQsIDB4MDIsIDB4MjMsIDB4RkEsIDB4MDIsIDB4MDAsCisJIDB4MDAsIDB4NjQsIDB4MjUsIDB4RkEsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDEsIDB4NEIsIDB4NjUsIDB4NDIsIDB4ODAsIDB4NjQsCisJIDB4RDQsIDB4ODUsIDB4MkIsIDB4NDEsIDB4MDAsIDB4QTEsIDB4NTUsIDB4OEIsIDB4MEQsIDB4MDMsIDB4MDIsIDB4MDQsIDB4NjUsIDB4NDEsIDB4MDIsIDB4MDAsCisJIDB4MDAsIDB4NjQsIDB4NDAsIDB4NEIsIDB4Q0EsIDB4ODQsIDB4NTgsIDB4RDAsIDB4QzksIDB4ODEsIDB4QkQsIDB4RDksIDB4RkMsIDB4MDIsIDB4MDAsIDB4RjQsCisJIDB4MDQsIDB4NjUsIDB4RUMsIDB4MDEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MDIsIDB4N0MsIDB4QTAsIDB4RDMsCisJIDB4MjMsIDB4RjgsIDB4REMsIDB4ODQsIDB4MjUsIDB4RkEsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjQsIDB4MjMsIDB4RkEsCisJIDB4MDEsIDB4NjQsIDB4OUQsIDB4RkUsIDB4MDIsIDB4MjgsIDB4MDIsIDB4NjQsIDB4MjUsIDB4RkEsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4N0MsIDB4MjMsIDB4RjgsIDB4MDEsIDB4NjQsIDB4MjUsIDB4RkEsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QTMsCisJIDB4QTMsIDB4RDEsIDB4MDIsIDB4NjQsIDB4MjMsIDB4RkEsIDB4NjQsIDB4NDQsIDB4N0MsIDB4NUYsIDB4NjAsIDB4NDUsIDB4NjQsIDB4NDcsIDB4N0MsIDB4NUYsCisJIDB4ODgsIDB4RjEsIDB4NjYsIDB4NDEsIDB4QzAsIDB4ODYsIDB4QTUsIDB4RDIsIDB4NjEsIDB4NDYsIDB4MjUsIDB4RkEsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjQsIDB4MjMsIDB4RkEsIDB4ODgsIDB4RkYsIDB4NzUsIDB4NDQsIDB4OEQsIDB4RkYsIDB4RTgsIDB4ODcsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4MDMsIDB4QjQsIDB4MjUsIDB4RkEsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDUsIDB4NjQsIDB4MjMsIDB4RkEsCisJIDB4NTIsIDB4NjMsIDB4OTYsIDB4RjMsIDB4NEIsIDB4REEsIDB4OTUsIDB4RjMsIDB4NEIsIDB4REEsIDB4OTQsIDB4RjMsIDB4NEIsIDB4REEsIDB4NjAsIDB4NDEsCisJIDB4ODgsIDB4RkYsIDB4NzIsIDB4NUMsIDB4ODksIDB4RkYsIDB4NEEsIDB4RDgsIDB4QTIsIDB4NDgsIDB4MjAsIDB4MjMsIDB4MEUsIDB4MDAsIDB4NjQsIDB4NDAsCisJIDB4ODAsIDB4MjcsIDB4MTUsIDB4MDAsIDB4REMsIDB4ODQsIDB4QkQsIDB4REEsIDB4QkQsIDB4RDIsIDB4MTEsIDB4MDQsIDB4REMsIDB4ODQsIDB4QTIsIDB4REEsCisJIDB4QTMsIDB4RDIsIDB4MEQsIDB4MDQsIDB4REMsIDB4ODQsIDB4QTMsIDB4REEsIDB4MEEsIDB4MDAsIDB4NTIsIDB4NjMsIDB4OTYsIDB4RjMsIDB4NEIsIDB4REEsCisJIDB4OTUsIDB4RjMsIDB4NEIsIDB4REEsIDB4OTQsIDB4RjMsIDB4NEIsIDB4REEsIDB4NTQsIDB4OTAsIDB4NEMsIDB4NjMsIDB4RTAsIDB4MDIsIDB4MDAsIDB4NjcsCisJIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4RjAsIDB4MjMsIDB4RjIsIDB4MTUsIDB4NjAsIDB4QzksIDB4RjksIDB4MDIsIDB4QTgsIDB4NjQsIDB4NDQsCisJIDB4MUYsIDB4MDIsIDB4M0YsIDB4NDAsIDB4MDIsIDB4MkIsIDB4MTYsIDB4MDAsIDB4MDAsIDB4MzcsIDB4MTQsIDB4MDAsIDB4MDEsIDB4M0IsIDB4MTgsIDB4MDAsCisJIDB4MTEsIDB4NjAsIDB4RjksIDB4NjUsIDB4MTEsIDB4NjAsIDB4MTksIDB4NjMsIDB4RkYsIDB4QjcsIDB4NjAsIDB4NUMsIDB4QTMsIDB4RDMsIDB4MDgsIDB4QTMsCisJIDB4MDAsIDB4N0UsIDB4RDAsIDB4ODAsIDB4RDcsIDB4ODAsIDB4MDMsIDB4MDMsIDB4RjksIDB4MDIsIDB4N0YsIDB4NjcsIDB4MEEsIDB4MDAsIDB4RjQsIDB4QTMsCisJIDB4QTMsIDB4RDEsIDB4MDQsIDB4MDAsIDB4MDAsIDB4QkMsIDB4RjIsIDB4QTQsIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDcsIDB4MTMsIDB4NjAsIDB4NTIsIDB4RjksCisJIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4NjMsIDB4MjcsIDB4NjAsIDB4MDYsIDB4NjEsIDB4NDgsIDB4NjQsIDB4NTgsIDB4RDAsCisJIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4MjUsIDB4RjAsIDB4MjAsIDB4NjQsIDB4RDAsIDB4ODEsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDcsIDB4MjUsIDB4RkEsCisJIDB4MEYsIDB4MDAsIDB4MjcsIDB4NjAsIDB4MEEsIDB4NjMsIDB4QzMsIDB4ODMsIDB4MDEsIDB4MkEsIDB4MDYsIDB4MDAsIDB4Q0YsIDB4ODMsIDB4QTMsIDB4RDMsCisJIDB4Q0QsIDB4ODEsIDB4MDAsIDB4N0YsIDB4QkQsIDB4REIsIDB4MDQsIDB4MDMsIDB4MDAsIDB4NjQsIDB4QzksIDB4ODEsIDB4QkQsIDB4REIsIDB4RkQsIDB4MDIsCisJIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4RjIsIDB4MjUsIDB4RjAsIDB4MDEsIDB4NjAsIDB4NkUsIDB4NjMsIDB4N0YsIDB4NjcsCisJIDB4M0EsIDB4MTgsIDB4QTMsIDB4RDksIDB4MjYsIDB4RjAsIDB4N0YsIDB4NjcsIDB4MzYsIDB4MTgsIDB4NUIsIDB4RDksIDB4MTMsIDB4NjAsIDB4MEEsIDB4RjMsCisJIDB4MjUsIDB4RjAsIDB4NjAsIDB4NDAsIDB4MDMsIDB4M0EsIDB4MkUsIDB4MDAsIDB4ODYsIDB4RjMsIDB4ODcsIDB4RjMsIDB4NjAsIDB4NDMsIDB4RTMsIDB4ODMsCisJIDB4NjAsIDB4NDYsIDB4MEYsIDB4RjgsIDB4MzAsIDB4NjEsIDB4OTQsIDB4RkEsIDB4MDEsIDB4NjEsIDB4OTEsIDB4RkEsIDB4MTYsIDB4NjQsIDB4MTIsIDB4RkEsCisJIDB4NjAsIDB4NDAsIDB4MTAsIDB4MzYsIDB4MDUsIDB4MDAsIDB4MTIsIDB4MzYsIDB4MDgsIDB4MDAsIDB4MEMsIDB4MzYsIDB4MEIsIDB4MDAsIDB4MEYsIDB4MDAsCisJIDB4NDAsIDB4NjEsIDB4QTEsIDB4ODAsIDB4MEEsIDB4NjQsIDB4MTEsIDB4MDIsIDB4RjMsIDB4MDEsIDB4MTAsIDB4NjEsIDB4QTEsIDB4ODAsIDB4MEUsIDB4NjQsCisJIDB4MEMsIDB4MDIsIDB4RUUsIDB4MDEsIDB4MDgsIDB4NjEsIDB4QTEsIDB4ODAsIDB4MTAsIDB4NjQsIDB4MDcsIDB4MDIsIDB4RTksIDB4MDEsIDB4RTEsIDB4ODEsCisJIDB4QTEsIDB4ODAsIDB4MDUsIDB4MDUsIDB4QzgsIDB4ODQsIDB4MDEsIDB4MDIsIDB4RTMsIDB4MDEsIDB4MTIsIDB4RkEsIDB4OTEsIDB4RkEsIDB4NjYsIDB4NDQsCisJIDB4MDIsIDB4QTYsIDB4RDcsIDB4MUYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QTMsIDB4QTUsIDB4RjAsIDB4QTMsIDB4RDEsCisJIDB4RkYsIDB4RkYsIDB4NjQsIDB4NUUsIDB4MDAsIDB4N0YsIDB4NjAsIDB4NDEsIDB4NjQsIDB4NDcsIDB4N0MsIDB4NUYsIDB4ODgsIDB4RjEsIDB4NjYsIDB4NDMsCisJIDB4QzAsIDB4ODYsIDB4NjUsIDB4NDQsIDB4QTEsIDB4REEsIDB4NjMsIDB4NDYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QTMsCisJIDB4QTMsIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NUUsIDB4MDAsIDB4N0YsIDB4NjAsIDB4NDUsIDB4NjQsIDB4NDcsIDB4N0MsIDB4NUYsIDB4ODgsIDB4RjEsCisJIDB4NjYsIDB4NDEsIDB4QzAsIDB4ODYsIDB4NjUsIDB4NDQsIDB4QTAsIDB4RDIsIDB4NjEsIDB4NDYsIDB4MjUsIDB4RkEsIDB4MDIsIDB4NjQsIDB4MjMsIDB4RkEsCisJIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4RjIsIDB4MTUsIDB4NjAsIDB4QzgsIDB4RkIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsCisJIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4RjIsIDB4MjUsIDB4RjAsIDB4MDIsIDB4QTgsIDB4MDAsIDB4NjcsIDB4MDIsIDB4MDIsIDB4MkQsIDB4RjksCisJIDB4MkMsIDB4RjksIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4RjIsIDB4MjUsIDB4RjIsIDB4MDIsIDB4QTgsIDB4MDAsIDB4QTgsIDB4MEEsIDB4MDIsCisJIDB4MDcsIDB4MDMsIDB4RDAsIDB4QTAsIDB4MzAsIDB4NjUsIDB4MDMsIDB4MDQsIDB4QTcsIDB4QTAsIDB4NTksIDB4NjUsIDB4MDEsIDB4MDYsIDB4NjUsIDB4NDQsCisJIDB4MTMsIDB4NjAsIDB4NTEsIDB4RkIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4RjIsIDB4MTUsIDB4NjAsIDB4Q0YsIDB4RkIsCisJIDB4RkYsIDB4RkYsIDB4MDgsIDB4MkEsIDB4MjUsIDB4MDAsIDB4MTUsIDB4NjAsIDB4REQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RTksIDB4QjQsIDB4NjAsIDB4NDQsCisJIDB4MTUsIDB4NjAsIDB4Q0YsIDB4RjEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDIsIDB4QkMsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MkEsCisJIDB4MDQsIDB4QkMsIDB4NjQsIDB4NDAsIDB4MDQsIDB4MjYsIDB4MDgsIDB4MDAsIDB4MTUsIDB4NjAsIDB4REQsIDB4RkIsIDB4MTMsIDB4NjQsIDB4QUQsIDB4RkIsCisJIDB4MDEsIDB4NjAsIDB4NjcsIDB4NjQsIDB4MzcsIDB4RkIsIDB4MEMsIDB4MDAsIDB4MTAsIDB4QkMsIDB4MTUsIDB4NjAsIDB4REQsIDB4RkIsIDB4MDgsIDB4NjQsCisJIDB4QUQsIDB4RkIsIDB4ODIsIDB4RjMsIDB4MDEsIDB4NjAsIDB4NjcsIDB4N0MsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NUIsIDB4N0MsIDB4MzcsIDB4RjksCisJIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4RjIsIDB4MTUsIDB4NjAsIDB4RDAsIDB4RkIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MjUsIDB4RjIsIDB4MTUsIDB4NjAsIDB4RDEsIDB4RkIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4RjIsCisJIDB4MTUsIDB4NjAsIDB4RUIsIDB4RkIsIDB4RkYsIDB4RkYsIDB4MEYsIDB4MjIsIDB4NDEsIDB4NzUsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4NjEsIDB4MDYsIDB4MDAsIDB4MDEsIDB4NjQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MTgsIDB4NjAsIDB4MTMsIDB4RkIsIDB4MDYsIDB4NjEsCisJIDB4NDEsIDB4NTYsIDB4QzcsIDB4RkUsIDB4RjAsIDB4NjAsIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4NzgsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjEsIDB4MTAsIDB4MDIsIDB4MDgsIDB4NjEsCisJIDB4NDEsIDB4NTYsIDB4QzcsIDB4RkUsIDB4RjAsIDB4NjAsIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzYsIDB4NDcsIDB4RkYsIDB4MjMsIDB4MDQsIDB4MDAsCisJIDB4MDAsIDB4N0YsIDB4NjAsIDB4NDEsIDB4N0YsIDB4NjcsIDB4MDMsIDB4MDAsIDB4MDQsIDB4N0MsIDB4QkMsIDB4RjksIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4NzgsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjEsIDB4MTAsIDB4MDIsCisJIDB4MEEsIDB4NjEsIDB4NDEsIDB4NTYsIDB4QzcsIDB4RkUsIDB4RjAsIDB4NjAsIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzYsIDB4NDcsIDB4RkYsIDB4MjMsCisJIDB4MDQsIDB4MDAsIDB4MDAsIDB4N0YsIDB4NjAsIDB4NDEsIDB4N0YsIDB4NjcsIDB4MDMsIDB4MDAsIDB4MDEsIDB4N0MsIDB4QkMsIDB4RjksIDB4MDAsIDB4NjcsCisJIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjMsIDB4NjQsIDB4RjMsIDB4MjMsIDB4RkMsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjMsIDB4MTcsIDB4MDAsCisJIDB4MDEsIDB4NjAsIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsIDB4MTEsIDB4NjAsIDB4MTQsIDB4NjEsIDB4MTEsIDB4NjAsIDB4RjQsIDB4NjUsIDB4QTEsIDB4RDEsCisJIDB4RDUsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MEIsIDB4MDMsIDB4MDIsIDB4MDMsIDB4MDgsIDB4QTEsIDB4RjksIDB4MDEsIDB4MDQsIDB4QTEsIDB4QTEsIDB4RDMsCisJIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjUsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjQsIDB4QjQsIDB4ODQsIDB4MDEsIDB4MDAsIDB4RkYsIDB4NjQsIDB4MjUsIDB4RkEsCisJIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTIsIDB4RkYsIDB4NDYsIDB4NDUsIDB4MDIsIDB4RjAsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjQsCisJIDB4RDAsIDB4ODAsIDB4MDAsIDB4RjQsIDB4MDEsIDB4RjIsIDB4NjYsIDB4NUMsIDB4MjUsIDB4NDYsIDB4NTYsIDB4MDIsIDB4NzAsIDB4MjcsIDB4NTQsIDB4MDAsCisJIDB4MTIsIDB4NjQsIDB4MDMsIDB4RkEsIDB4MDQsIDB4RjgsIDB4MEUsIDB4RjIsIDB4ODcsIDB4RkMsIDB4OEQsIDB4RkMsIDB4OEUsIDB4RkMsIDB4REEsIDB4ODIsCisJIDB4MTYsIDB4NjEsIDB4MDAsIDB4NjMsIDB4QzksIDB4ODEsIDB4NUEsIDB4REMsIDB4RkQsIDB4MDIsIDB4NjAsIDB4NDAsIDB4RjAsIDB4M0IsIDB4MTYsIDB4MDAsCisJIDB4MzIsIDB4NDQsIDB4OEUsIDB4RjMsIDB4MDEsIDB4QjAsIDB4RjYsIDB4QTAsIDB4MDgsIDB4MjQsIDB4MkMsIDB4MDUsIDB4REMsIDB4ODMsIDB4RjAsIDB4NjcsCisJIDB4MEUsIDB4RkEsIDB4MUYsIDB4NjAsIDB4MEEsIDB4NjQsIDB4MkIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4OEUsIDB4RkQsIDB4MkIsIDB4RkYsIDB4RkUsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NEEsIDB4REIsIDB4NEYsIDB4MDAsIDB4OEYsIDB4RjMsIDB4MDksIDB4NjUsCisJIDB4RDQsIDB4ODAsIDB4REMsIDB4ODMsIDB4MTcsIDB4MDUsIDB4OEYsIDB4RkQsIDB4OTgsIDB4RkUsIDB4MDQsIDB4MDQsIDB4MDAsIDB4N0YsIDB4MDgsIDB4N0UsCisJIDB4MEUsIDB4RkEsIDB4M0IsIDB4RkYsIDB4MUUsIDB4NjAsIDB4RkUsIDB4NjQsIDB4MkIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4MEUsIDB4RjIsIDB4MkIsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MjYsIDB4RjcsIDB4RkUsIDB4RkQsIDB4NjQsIDB4M0IsIDB4NDIsCisJIDB4NEEsIDB4REIsIDB4MzIsIDB4MDAsIDB4OEIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RDgsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MEQsIDB4MDQsIDB4MUYsIDB4NjAsCisJIDB4MTYsIDB4NjQsIDB4MkIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4RkMsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NEEsIDB4REIsIDB4MjEsIDB4MDAsIDB4NDYsIDB4NDUsIDB4MDAsIDB4NjQsIDB4MkIsIDB4REIsIDB4MjUsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QTIsIDB4RkYsIDB4MDAsIDB4RjQsIDB4MDEsIDB4RjAsCisJIDB4MEEsIDB4MTgsIDB4NzAsIDB4NjcsIDB4QTAsIDB4ODAsIDB4RjAsIDB4NjcsIDB4MDYsIDB4MDMsIDB4QzAsIDB4ODQsIDB4MDEsIDB4RkEsIDB4MjUsIDB4NDYsCisJIDB4MjUsIDB4NDQsIDB4ODAsIDB4RkMsIDB4MDUsIDB4RkEsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NzIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDQsIDB4RkUsCisJIDB4QTMsIDB4RkYsIDB4RkYsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NEEsIDB4REIsIDB4RDQsIDB4RkUsIDB4QTMsIDB4RkYsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MUYsIDB4NjAsIDB4MDQsIDB4NjQsIDB4NDAsIDB4NDcsIDB4NTgsIDB4NEYsIDB4MEQsIDB4MDAsIDB4MUUsIDB4NjAsIDB4RjgsIDB4NjQsIDB4NDAsIDB4NDcsCisJIDB4NTgsIDB4NEYsIDB4MTgsIDB4MDAsIDB4MUYsIDB4NjAsIDB4MTAsIDB4NjQsIDB4NDAsIDB4NDcsIDB4NTgsIDB4NEYsIDB4MDMsIDB4MDAsIDB4RjAsIDB4NjAsCisJIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4RDUsIDB4MEUsIDB4RjIsIDB4MEIsIDB4MTgsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDgsIDB4MDAsCisJIDB4MUYsIDB4NjAsIDB4MjYsIDB4NjQsIDB4NDAsIDB4NEIsIDB4RjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RjIsIDB4MDEsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4RDUsIDB4MEUsIDB4RjIsIDB4MTQsIDB4MTgsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MTEsIDB4MDAsCisJIDB4MDIsIDB4RjAsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjQsIDB4RDAsIDB4ODAsIDB4QTIsIDB4RkYsIDB4OEYsIDB4RjMsIDB4MDIsIDB4MDIsIDB4Q0MsIDB4ODQsCisJIDB4OEYsIDB4RkIsIDB4MUYsIDB4NjAsIDB4MjYsIDB4NjQsIDB4NDAsIDB4NEIsIDB4RjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4RTksIDB4MDEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RkIsIDB4NjQsIDB4M0EsIDB4NDIsIDB4NEEsIDB4REIsIDB4QTIsIDB4RkYsIDB4OTIsIDB4RjMsCisJIDB4OEUsIDB4RjMsIDB4Q0MsIDB4ODAsIDB4RkEsIDB4QTAsIDB4MDEsIDB4MTQsIDB4MUQsIDB4MDUsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NzcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4QTIsIDB4RkYsIDB4MTcsIDB4MDMsIDB4RjAsIDB4NjcsIDB4MEUsIDB4RkEsIDB4MUYsIDB4NjAsIDB4MEEsIDB4NjQsIDB4MEYsIDB4NjAsCisJIDB4OTMsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RjYsIDB4NjQsCisJIDB4M0EsIDB4NDIsIDB4NEEsIDB4REIsIDB4OTIsIDB4RjMsIDB4OEUsIDB4RjMsIDB4Q0MsIDB4ODMsIDB4REMsIDB4ODQsIDB4MDEsIDB4MTUsIDB4OTIsIDB4RkQsCisJIDB4OEUsIDB4RkIsIDB4RDQsIDB4RkUsIDB4OTEsIDB4RjMsIDB4OEYsIDB4RjMsIDB4MDAsIDB4QTgsIDB4OTAsIDB4RjEsIDB4MDMsIDB4MDIsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MjYsIDB4MDUsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTIsIDB4RkYsIDB4MjAsIDB4MDMsCisJIDB4MDAsIDB4NjMsIDB4OTEsIDB4RjMsIDB4MEUsIDB4RkMsIDB4Q0MsIDB4ODQsIDB4RkYsIDB4M0EsIDB4OTEsIDB4RkIsIDB4OTgsIDB4RkUsIDB4MDMsIDB4MDQsCisJIDB4MDgsIDB4QkIsIDB4MEUsIDB4RkMsIDB4M0IsIDB4RkYsIDB4MUUsIDB4NjAsIDB4RkUsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTMsIDB4RkIsIDB4NjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RjcsIDB4NjQsIDB4M0EsIDB4NDIsIDB4NEEsIDB4REIsCisJIDB4OEYsIDB4RjMsIDB4MEUsIDB4RjIsIDB4REMsIDB4ODMsIDB4MDgsIDB4QjAsIDB4OEYsIDB4RkQsIDB4MDgsIDB4MjgsIDB4RjcsIDB4RkUsIDB4RDQsIDB4RkUsCisJIDB4QTMsIDB4RkYsIDB4RjAsIDB4NjAsIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QjksIDB4RkUsIDB4MTMsIDB4RkYsIDB4MjQsIDB4NDAsIDB4ODAsIDB4MkIsCisJIDB4MEIsIDB4MDAsIDB4QTIsIDB4RkYsIDB4MjUsIDB4NDYsIDB4MDksIDB4RjQsIDB4MEUsIDB4RjIsIDB4MDUsIDB4MTgsIDB4MDgsIDB4QkMsIDB4MEUsIDB4RkEsCisJIDB4RkYsIDB4RkYsIDB4RjcsIDB4RkUsIDB4MDEsIDB4MDAsIDB4RDgsIDB4RkUsIDB4QTMsIDB4RkYsIDB4MjUsIDB4NDYsIDB4M0UsIDB4RjIsIDB4MDAsIDB4RjQsCisJIDB4MDgsIDB4RjAsIDB4MjUsIDB4NDYsIDB4MDYsIDB4QjQsIDB4RkYsIDB4N0YsIDB4MTAsIDB4QkMsIDB4MDYsIDB4MjYsIDB4RkQsIDB4N0YsIDB4MEUsIDB4RkEsCisJIDB4M0UsIDB4RjIsIDB4M0YsIDB4RjIsIDB4NjAsIDB4NDEsIDB4MDgsIDB4MkEsIDB4NjQsIDB4NDcsIDB4M0YsIDB4RkEsIDB4NjAsIDB4NDUsIDB4MTMsIDB4NjAsCisJIDB4MkQsIDB4RjMsIDB4QTMsIDB4RkMsIDB4QUIsIDB4RkMsIDB4OTEsIDB4RkMsIDB4RDQsIDB4ODAsIDB4MzgsIDB4NjAsIDB4QzEsIDB4NjUsIDB4QTUsIDB4ODAsCisJIDB4MDEsIDB4MDQsIDB4MDcsIDB4MDMsIDB4MjMsIDB4RjAsIDB4MDgsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4RjgsIDB4NjAsIDB4NTcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4RkIsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEIsIDB4MDQsIDB4MjMsIDB4RjAsIDB4MDQsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4MjUsIDB4NjAsIDB4RjQsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsCisJIDB4NDYsIDB4MDAsIDB4M0UsIDB4RjAsIDB4ODgsIDB4RjEsIDB4NjQsIDB4NDcsIDB4MDcsIDB4QjQsIDB4MDcsIDB4MzYsIDB4M0IsIDB4MDAsIDB4MDQsIDB4MDMsCisJIDB4Q0MsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QzAsIDB4ODMsIDB4MkQsIDB4MDAsIDB4MkMsIDB4RjIsIDB4ODcsIDB4RjEsIDB4MDEsIDB4QjAsIDB4NjQsIDB4NDMsCisJIDB4MzUsIDB4MDIsIDB4MkUsIDB4RjIsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsCisJIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MkUsIDB4RjAsIDB4NjMsIDB4NDYsCisJIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MkQsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsCisJIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MkMsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsCisJIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4ODcsIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4MDEsIDB4MDMsCisJIDB4MDksIDB4MDAsIDB4NjYsIDB4NDUsIDB4NjMsIDB4NDYsIDB4MDYsIDB4RjAsIDB4NjUsIDB4NDYsIDB4NjQsIDB4NDQsIDB4MEMsIDB4MjYsIDB4MDIsIDB4MDAsCisJIDB4MDIsIDB4MjYsIDB4MDQsIDB4MDAsIDB4MjMsIDB4RjAsIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4MDcsIDB4RkMsIDB4MjMsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4MEYsIDB4MUIsIDB4MUUsIDB4NjAsIDB4RTAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTMsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MEUsIDB4RjIsIDB4QzgsIDB4RkUsIDB4MTAsIDB4QUMsIDB4MEUsIDB4RkEsCisJIDB4MEUsIDB4MDAsIDB4MUUsIDB4NjAsIDB4RjIsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTMsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MEUsIDB4RjIsIDB4Q0UsIDB4RkUsIDB4MTAsIDB4QUMsIDB4MEUsIDB4RkEsIDB4RjAsIDB4NjAsCisJIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0IsIDB4ODQsIDB4QzksIDB4ODMsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDQsIDB4NTgsIDB4RDEsIDB4QTUsIDB4RDgsCisJIDB4REEsIDB4ODUsIDB4ODAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4RjgsIDB4MUYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MjUsIDB4RjAsIDB4MTQsIDB4NjAsIDB4MTUsIDB4RjksIDB4MTEsIDB4MDAsIDB4MEQsIDB4NjAsIDB4MDAsIDB4NjIsIDB4NDAsIDB4NjMsIDB4NUEsIDB4REYsCisJIDB4RkUsIDB4MUYsIDB4MDQsIDB4NjUsIDB4MEQsIDB4NjAsIDB4MDAsIDB4NjEsIDB4NDgsIDB4NjQsIDB4M0UsIDB4NjMsIDB4N0MsIDB4QTgsIDB4NTgsIDB4RDAsCisJIDB4NTksIDB4RDksIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjQsIDB4RjksIDB4MUYsIDB4MTQsIDB4NjAsIDB4MTUsIDB4RjEsIDB4MEMsIDB4NjAsCisJIDB4REMsIDB4NjUsIDB4MDIsIDB4RkUsIDB4NjQsIDB4NDQsIDB4RjgsIDB4ODQsIDB4RjgsIDB4ODQsIDB4RjgsIDB4ODcsIDB4NjAsIDB4NDEsIDB4NjQsIDB4NDQsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODQsIDB4M0UsIDB4RkIsIDB4NjAsIDB4NDIsIDB4NjEsIDB4NDQsIDB4MDMsIDB4QTIsIDB4NjAsIDB4RkUsCisJIDB4QTIsIDB4REIsIDB4MjAsIDB4RkUsIDB4NjQsIDB4NDQsIDB4MEQsIDB4NjAsIDB4MDIsIDB4NjUsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODQsIDB4NDAsIDB4RkIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MDAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4NUMsIDB4NDEsIDB4MjUsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NDIsIDB4ODAsIDB4MkIsIDB4MDQsIDB4MDAsIDB4RkYsIDB4QjQsIDB4NDAsIDB4NDIsCisJIDB4MDEsIDB4NjQsIDB4NDAsIDB4NDEsIDB4ODcsIDB4RjMsIDB4NDYsIDB4NEIsIDB4ODYsIDB4RjMsIDB4NjAsIDB4NDYsIDB4RTAsIDB4ODMsIDB4QUIsIDB4NDYsCisJIDB4MjYsIDB4RjAsIDB4QUIsIDB4NDYsIDB4NTksIDB4RjgsIDB4QUIsIDB4NDYsIDB4MjcsIDB4RjAsIDB4QUIsIDB4NDYsIDB4NUEsIDB4RjgsIDB4QUIsIDB4NDYsCisJIDB4MjgsIDB4RjAsIDB4QUIsIDB4NDYsIDB4NUIsIDB4RjgsIDB4NjYsIDB4NDQsIDB4MDIsIDB4QTYsIDB4RjEsIDB4MUYsIDB4ODcsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDYsIDB4QUIsIDB4NDYsIDB4MEMsIDB4NjAsIDB4M0EsIDB4NjUsIDB4MjIsIDB4NDQsIDB4RkYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODEsIDB4QzksIDB4ODEsIDB4NTIsIDB4NjQsIDB4MEUsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksCisJIDB4RkQsIDB4MUYsIDB4MjEsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDgsIDB4MDAsIDB4QUIsIDB4NDYsIDB4RjAsIDB4QTEsIDB4NzYsIDB4NjQsIDB4MEUsIDB4NjMsCisJIDB4NTksIDB4RDEsIDB4NTgsIDB4RDgsIDB4RkQsIDB4MUYsIDB4QUIsIDB4NDYsIDB4MjIsIDB4NDQsIDB4RkYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4MEMsIDB4NjAsIDB4OUMsIDB4NjUsIDB4QzQsIDB4ODEsIDB4NjAsIDB4NDUsIDB4QzksIDB4ODEsIDB4NjIsIDB4NjQsIDB4MDYsIDB4NjMsCisJIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4MjEsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDgsIDB4MDAsIDB4QUIsIDB4NDYsIDB4RjgsIDB4QTEsCisJIDB4QjYsIDB4NjQsIDB4MDYsIDB4NjMsIDB4NTksIDB4RDEsIDB4NTgsIDB4RDgsIDB4RkQsIDB4MUYsIDB4QUIsIDB4NDYsIDB4NjUsIDB4NDQsIDB4MEMsIDB4NjAsCisJIDB4QkMsIDB4NjUsIDB4QzQsIDB4ODEsIDB4QzksIDB4ODEsIDB4NkEsIDB4NjQsIDB4MDYsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsCisJIDB4MjIsIDB4NDQsIDB4RkYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODUsIDB4QzQsIDB4ODQsIDB4MEMsIDB4NjAsIDB4ODIsIDB4NjUsIDB4QzQsIDB4ODEsCisJIDB4NzIsIDB4NjQsIDB4MDQsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4QUIsIDB4NDYsIDB4MjEsIDB4NDQsIDB4MDEsIDB4MkEsCisJIDB4MDYsIDB4MDAsIDB4RkEsIDB4QTEsIDB4OTAsIDB4NjQsIDB4MDQsIDB4NjMsIDB4NTksIDB4RDEsIDB4NTgsIDB4RDgsIDB4RkQsIDB4MUYsIDB4M0IsIDB4RjAsCisJIDB4MjEsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MTMsIDB4MDAsIDB4MjIsIDB4NDQsIDB4M0QsIDB4RkIsIDB4NjAsIDB4NDEsIDB4MDIsIDB4RkUsIDB4RjgsIDB4ODQsCisJIDB4RjgsIDB4ODQsIDB4RjgsIDB4ODQsIDB4M0MsIDB4RkIsIDB4MEMsIDB4NjAsIDB4N0UsIDB4NjMsIDB4ODgsIDB4RkYsIDB4Q0QsIDB4ODEsIDB4MDYsIDB4QTMsCisJIDB4RkQsIDB4MEQsIDB4OEQsIDB4RkYsIDB4M0IsIDB4RkQsIDB4NjQsIDB4NDcsIDB4ODAsIDB4QkYsIDB4NjAsIDB4NUMsIDB4MjIsIDB4NDMsIDB4ODAsIDB4NjEsCisJIDB4ODgsIDB4RkYsIDB4Q0YsIDB4ODMsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MEQsIDB4OEQsIDB4RkYsIDB4NjEsIDB4NDcsIDB4MzEsIDB4OTEsIDB4QjEsIDB4ODQsCisJIDB4M0IsIDB4RkEsIDB4ODYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODMsIDB4RTMsIDB4ODMsIDB4NjYsIDB4NDQsIDB4MDIsIDB4QTYsIDB4M0IsIDB4RjAsCisJIDB4NjYsIDB4NDQsIDB4QjEsIDB4OUMsIDB4M0IsIDB4RjgsIDB4MDIsIDB4QTYsIDB4RkEsIDB4MUYsIDB4QUIsIDB4NDYsIDB4MDAsIDB4NjcsIDB4MDAsIDB4NjEsCisJIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4RjIsIDB4MjUsIDB4RjAsIDB4MDIsIDB4QTgsIDB4MDAsIDB4NjcsIDB4MjQsIDB4MDIsIDB4M0QsIDB4RjEsCisJIDB4NjQsIDB4NDQsIDB4MDMsIDB4QjQsIDB4NDAsIDB4NDIsIDB4RDAsIDB4ODAsIDB4ODcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDYsIDB4QkIsIDB4RjQsCisJIDB4ODAsIDB4NjEsIDB4MDIsIDB4MDIsIDB4RTMsIDB4ODMsIDB4RUIsIDB4ODMsIDB4MjIsIDB4NDQsIDB4ODgsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsCisJIDB4RkQsIDB4MEQsIDB4OEQsIDB4RkYsIDB4NjEsIDB4NDcsIDB4MzEsIDB4OTEsIDB4OUQsIDB4ODUsIDB4QTcsIDB4ODMsIDB4M0IsIDB4RkMsIDB4ODYsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODMsIDB4RTMsIDB4ODMsIDB4NjYsIDB4NDQsIDB4MDIsIDB4QTYsIDB4QkIsIDB4RjIsIDB4NjYsIDB4NDQsIDB4QTUsIDB4ODEsCisJIDB4QkIsIDB4RkEsIDB4MDIsIDB4QTYsIDB4RkEsIDB4MUYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTEsIDB4NjQsIDB4MjMsIDB4RkEsCisJIDB4MjUsIDB4NDQsIDB4MjQsIDB4RkEsIDB4MDQsIDB4NjQsIDB4NDAsIDB4NEIsIDB4NjIsIDB4NDEsIDB4MEMsIDB4NjAsIDB4ODIsIDB4NjQsIDB4MDQsIDB4NjMsCisJIDB4NTgsIDB4RDEsIDB4NTksIDB4RDgsIDB4RkQsIDB4MUYsIDB4MkIsIDB4NDMsIDB4MDAsIDB4N0MsIDB4NTksIDB4RDgsIDB4NEYsIDB4OEIsIDB4MDYsIDB4QTQsCisJIDB4RjYsIDB4MDIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4RjIsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsCisJIDB4NjEsIDB4NDYsIDB4MjcsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjYsIDB4RjAsCisJIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjUsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4ODcsIDB4RjMsIDB4MDgsIDB4RkUsCisJIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4MDEsIDB4MDMsIDB4MkEsIDB4MDAsIDB4NDMsIDB4NEIsIDB4QUIsIDB4NDYsIDB4M0IsIDB4RjIsIDB4ODAsIDB4NjAsCisJIDB4MzAsIDB4N0MsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4NEUsIDB4NjEsIDB4NzYsIDB4NjQsIDB4MEUsIDB4NjMsIDB4QUIsIDB4NDYsIDB4NTksIDB4RDAsCisJIDB4QUIsIDB4NDYsIDB4NTgsIDB4RDgsIDB4RkIsIDB4MUYsIDB4OTAsIDB4NjQsIDB4MDQsIDB4NjMsIDB4QUIsIDB4NDYsIDB4NTksIDB4RDAsIDB4QUIsIDB4NDYsCisJIDB4NTgsIDB4RDgsIDB4RkIsIDB4MUYsIDB4RDksIDB4ODEsIDB4QTAsIDB4NjQsIDB4MDQsIDB4NjMsIDB4QUIsIDB4NDYsIDB4NTksIDB4RDAsIDB4QUIsIDB4NDYsCisJIDB4NTgsIDB4RDgsIDB4RkIsIDB4MUYsIDB4RDksIDB4ODEsIDB4QjYsIDB4NjQsIDB4MEUsIDB4NjMsIDB4QUIsIDB4NDYsIDB4NTksIDB4RDAsIDB4QUIsIDB4NDYsCisJIDB4NTgsIDB4RDgsIDB4RkIsIDB4MUYsIDB4MDAsIDB4NjcsIDB4MDAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjcsIDB4MjAsIDB4NjEsCisJIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4RjIsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsCisJIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MjcsIDB4RjAsCisJIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsCisJIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjUsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsCisJIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4ODcsIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsCisJIDB4MDEsIDB4MDMsIDB4MEQsIDB4MDAsIDB4NDMsIDB4NEIsIDB4QUIsIDB4NDYsIDB4M0IsIDB4RjIsIDB4ODAsIDB4NjAsIDB4MzAsIDB4NjEsIDB4OUQsIDB4ODUsCisJIDB4QTQsIDB4ODQsIDB4QTIsIDB4REEsIDB4QUIsIDB4NDYsIDB4MDAsIDB4NjcsIDB4MDAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjcsCisJIDB4MjAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NDEsIDB4NEEsIDB4NjQsIDB4QTAsIDB4RDIsIDB4RkYsIDB4RkYsCisJIDB4NDAsIDB4NDIsIDB4ODAsIDB4MkIsIDB4MDQsIDB4MDAsIDB4RkYsIDB4QjQsIDB4NDAsIDB4NDIsIDB4MDEsIDB4NjQsIDB4NDAsIDB4NDEsIDB4ODcsIDB4RjMsCisJIDB4NDYsIDB4NEIsIDB4ODYsIDB4RjMsIDB4NjAsIDB4NDYsIDB4RTAsIDB4ODMsIDB4QUIsIDB4NDYsIDB4MzIsIDB4RjAsIDB4QUIsIDB4NDYsIDB4NTksIDB4RjgsCisJIDB4QUIsIDB4NDYsIDB4MzMsIDB4RjAsIDB4QUIsIDB4NDYsIDB4NUEsIDB4RjgsIDB4QUIsIDB4NDYsIDB4MzQsIDB4RjAsIDB4QUIsIDB4NDYsIDB4NUIsIDB4RjgsCisJIDB4NjYsIDB4NDQsIDB4MDIsIDB4QTYsIDB4RjEsIDB4MUYsIDB4ODcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDYsIDB4QUIsIDB4NDYsIDB4MEMsIDB4NjAsCisJIDB4M0EsIDB4NjUsIDB4MjIsIDB4NDQsIDB4RkYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODEsCisJIDB4QzksIDB4ODEsIDB4NEEsIDB4NjQsIDB4MEUsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4MjEsIDB4NDQsIDB4MDEsIDB4MkEsCisJIDB4MDgsIDB4MDAsIDB4QUIsIDB4NDYsIDB4RjAsIDB4QTEsIDB4NzYsIDB4NjQsIDB4MEUsIDB4NjMsIDB4NTksIDB4RDEsIDB4NTgsIDB4RDgsIDB4RkQsIDB4MUYsCisJIDB4QUIsIDB4NDYsIDB4MjIsIDB4NDQsIDB4RkYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODUsIDB4QzQsIDB4ODQsIDB4MEMsIDB4NjAsIDB4ODIsIDB4NjUsCisJIDB4QzQsIDB4ODEsIDB4NUEsIDB4NjQsIDB4MDQsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4QUIsIDB4NDYsIDB4MjEsIDB4NDQsCisJIDB4MDEsIDB4MkEsIDB4MDYsIDB4MDAsIDB4RkEsIDB4QTEsIDB4OTAsIDB4NjQsIDB4MDQsIDB4NjMsIDB4NTksIDB4RDEsIDB4NTgsIDB4RDgsIDB4RkQsIDB4MUYsCisJIDB4M0IsIDB4RjAsIDB4MjEsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MTMsIDB4MDAsIDB4MjIsIDB4NDQsIDB4M0QsIDB4RkIsIDB4NjAsIDB4NDEsIDB4MDIsIDB4RkUsCisJIDB4RjgsIDB4ODQsIDB4RjgsIDB4ODQsIDB4RjgsIDB4ODQsIDB4M0MsIDB4RkIsIDB4MEMsIDB4NjAsIDB4N0UsIDB4NjMsIDB4ODgsIDB4RkYsIDB4Q0QsIDB4ODEsCisJIDB4MDYsIDB4QTMsIDB4RkQsIDB4MEQsIDB4OEQsIDB4RkYsIDB4M0IsIDB4RkQsIDB4NjQsIDB4NDcsIDB4ODAsIDB4QkYsIDB4NjAsIDB4NUMsIDB4MjIsIDB4NDMsCisJIDB4ODAsIDB4NjEsIDB4ODgsIDB4RkYsIDB4Q0YsIDB4ODMsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MEQsIDB4OEQsIDB4RkYsIDB4NjEsIDB4NDcsIDB4MzEsIDB4OTEsCisJIDB4QjEsIDB4ODQsIDB4M0IsIDB4RkEsIDB4ODYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODMsIDB4RTMsIDB4ODMsIDB4NjYsIDB4NDQsIDB4MDIsIDB4QTYsCisJIDB4M0IsIDB4RjAsIDB4NjYsIDB4NDQsIDB4QjEsIDB4OUMsIDB4M0IsIDB4RjgsIDB4MDIsIDB4QTYsIDB4RkEsIDB4MUYsIDB4QUIsIDB4NDYsIDB4MDAsIDB4NjcsCisJIDB4MDAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4RjIsIDB4MjUsIDB4RjAsIDB4MDIsIDB4QTgsIDB4MDAsIDB4NjcsIDB4MjQsIDB4MDIsCisJIDB4M0QsIDB4RjEsIDB4NjQsIDB4NDQsIDB4MDMsIDB4QjQsIDB4NDAsIDB4NDIsIDB4RDAsIDB4ODAsIDB4ODcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDYsCisJIDB4QkIsIDB4RjQsIDB4ODAsIDB4NjEsIDB4MDIsIDB4MDIsIDB4RTMsIDB4ODMsIDB4RUIsIDB4ODMsIDB4MjIsIDB4NDQsIDB4ODgsIDB4RkYsIDB4Q0MsIDB4ODQsCisJIDB4RTEsIDB4ODEsIDB4RkQsIDB4MEQsIDB4OEQsIDB4RkYsIDB4NjEsIDB4NDcsIDB4MzEsIDB4OTEsIDB4OUQsIDB4ODUsIDB4QTcsIDB4ODMsIDB4M0IsIDB4RkMsCisJIDB4ODYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODMsIDB4RTMsIDB4ODMsIDB4NjYsIDB4NDQsIDB4MDIsIDB4QTYsIDB4QkIsIDB4RjIsIDB4NjYsIDB4NDQsCisJIDB4QTUsIDB4ODEsIDB4QkIsIDB4RkEsIDB4MDIsIDB4QTYsIDB4RkEsIDB4MUYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4RjIsCisJIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsCisJIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MjcsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsCisJIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsCisJIDB4MjUsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsCisJIDB4RTgsIDB4MUIsIDB4ODcsIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4MDEsIDB4MDMsIDB4MjEsIDB4MDAsIDB4NDMsIDB4NEIsCisJIDB4QUIsIDB4NDYsIDB4M0IsIDB4RjIsIDB4ODAsIDB4NjAsIDB4MzAsIDB4N0MsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4NEUsIDB4NjEsIDB4NzYsIDB4NjQsCisJIDB4MEUsIDB4NjMsIDB4QUIsIDB4NDYsIDB4NTksIDB4RDAsIDB4QUIsIDB4NDYsIDB4NTgsIDB4RDgsIDB4RkIsIDB4MUYsIDB4OTAsIDB4NjQsIDB4MDQsIDB4NjMsCisJIDB4QUIsIDB4NDYsIDB4NTksIDB4RDAsIDB4QUIsIDB4NDYsIDB4NTgsIDB4RDgsIDB4RkIsIDB4MUYsIDB4QTAsIDB4NjQsIDB4MDQsIDB4NjMsIDB4QUIsIDB4NDYsCisJIDB4NTksIDB4RDAsIDB4QUIsIDB4NDYsIDB4NTgsIDB4RDgsIDB4RkIsIDB4MUYsIDB4MDAsIDB4NjcsIDB4MDAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4NjcsIDB4MjAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4RjIsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsCisJIDB4NjEsIDB4NDYsIDB4MjcsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjYsIDB4RjAsCisJIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjUsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4ODcsIDB4RjMsIDB4MDgsIDB4RkUsCisJIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4MDEsIDB4MDMsIDB4MEQsIDB4MDAsIDB4NDMsIDB4NEIsIDB4QUIsIDB4NDYsIDB4M0IsIDB4RjIsIDB4ODAsIDB4NjAsCisJIDB4MzAsIDB4NjEsIDB4OUQsIDB4ODUsIDB4QTQsIDB4ODQsIDB4QTIsIDB4REEsIDB4QUIsIDB4NDYsIDB4MDAsIDB4NjcsIDB4MDAsIDB4NjEsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjcsIDB4MjAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4M0UsIDB4RjIsIDB4QUIsIDB4RjEsIDB4MDgsIDB4QjAsCisJIDB4MTksIDB4RjgsIDB4NEEsIDB4MDIsIDB4MDcsIDB4MjMsIDB4MkIsIDB4MDAsIDB4NjAsIDB4NDcsIDB4MDcsIDB4QjQsIDB4ODgsIDB4RjEsIDB4Q0MsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4NDAsIDB4OEEsIDB4QUEsIDB4NDYsIDB4MDMsIDB4RjIsIDB4MDQsIDB4RjAsIDB4MDUsIDB4RjIsIDB4NjAsIDB4NDMsIDB4QUEsIDB4NDYsCisJIDB4MkMsIDB4RkMsIDB4MkQsIDB4RjgsIDB4MkUsIDB4RkEsIDB4Q0IsIDB4RjEsIDB4MkYsIDB4RjgsIDB4Q0MsIDB4RjEsIDB4MzAsIDB4RjgsIDB4Q0QsIDB4RjEsCisJIDB4MzEsIDB4RjgsIDB4NDYsIDB4NEEsIDB4MDAsIDB4RjQsIDB4MDIsIDB4RjIsIDB4MDMsIDB4RjAsIDB4MDQsIDB4RjIsIDB4NjAsIDB4NDMsIDB4QUEsIDB4NDYsCisJIDB4MzIsIDB4RkMsIDB4MzMsIDB4RjgsIDB4MzQsIDB4RkEsIDB4QUEsIDB4NDYsIDB4MDUsIDB4RjIsIDB4MDYsIDB4RjAsIDB4MDcsIDB4RjIsIDB4NjAsIDB4NDMsCisJIDB4QUEsIDB4NDYsIDB4MzYsIDB4RkMsIDB4MzcsIDB4RjgsIDB4MzgsIDB4RkEsIDB4MDMsIDB4NjAsIDB4MDgsIDB4NjQsIDB4MUMsIDB4MDAsIDB4NjYsIDB4RjEsCisJIDB4MkYsIDB4RjgsIDB4NjcsIDB4RjEsIDB4MzAsIDB4RjgsIDB4NjgsIDB4RjEsIDB4MzEsIDB4RjgsIDB4NDYsIDB4NEEsIDB4MDAsIDB4RjQsIDB4MDIsIDB4RjIsCisJIDB4MDMsIDB4RjAsIDB4MDQsIDB4RjIsIDB4NjAsIDB4NDMsIDB4QUEsIDB4NDYsIDB4MkMsIDB4RkMsIDB4MkQsIDB4RjgsIDB4MkUsIDB4RkEsIDB4QUEsIDB4NDYsCisJIDB4MDUsIDB4RjIsIDB4MDYsIDB4RjAsIDB4MDcsIDB4RjIsIDB4NjAsIDB4NDMsIDB4QUEsIDB4NDYsIDB4MzIsIDB4RkMsIDB4MzMsIDB4RjgsIDB4MzQsIDB4RkEsCisJIDB4MDIsIDB4NjAsIDB4MDgsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MkEsIDB4RkEsIDB4MDIsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDIsIDB4NkYsCisJIDB4NkYsIDB4NzQsIDB4NjMsIDB4NkYsIDB4NjQsIDB4NjUsIDB4MjAsIDB4MjEsIDB4MjEsIDB4MjAsIDB4MjAsIDB4MDAsIDB4NTMsIDB4NTQsIDB4NDEsIDB4MkYsCisJIDB4NDEsIDB4NTAsIDB4MjAsIDB4NDYsIDB4NzUsIDB4NkUsIDB4NjMsIDB4MjcsIDB4NzMsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDEsIDB4MDAsCisJIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsCisJIDB4MDQsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDYsIDB4MDAsCisJIDB4MDcsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsCisKK307ICAvKiBmd19pbWFnZV80X2RhdGEgKi8KKworc3RhdGljIGNvbnN0IENGR19JREVOVElUWV9TVFJDVCBmd19pbWFnZV9pbmZvaWRlbnRpdHlbXSA9IHsKKwl7CisJCXNpemVvZiggQ0ZHX0lERU5USVRZX1NUUkNUICkgLyBzaXplb2YoaGNmXzE2KSAtIDEsCisJCUNGR19GV19JREVOVElUWSwKKwkJQ09NUF9JRF9GV19BUCwKKwkJMywJCQkJCQkJLy9WYXJpYW50CisJCTEsCQkJCQkJCS8vTWFqb3IKKwkJMjQJCQkJCQkJLy9NaW5vcgorCX0sCisJeyAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwIH0JCS8vZW5kc2VudGluZWwKK307CisKK3N0YXRpYyBjb25zdCBDRkdfUFJPR19TVFJDVCBmd19pbWFnZV9jb2RlW10gPSB7CisJeworCQk4LAorCQlDRkdfUFJPRywKKwkJQ0ZHX1BST0dfVk9MQVRJTEUsCQkJLy8gbW9kZQorCQkweDAxNDgsCQkvLyBzaXplb2YoZndfaW1hZ2VfMV9kYXRhKSwKKwkJMHgwMDAwMDA2MCwJCQkJCS8vIFRhcmdldCBhZGRyZXNzIGluIE5JQyBNZW1vcnkKKwkJMHgwMDAwLAkJCQkJCS8vIENSQzogeWVzL25vCVRZUEU6IHByaW1hcnkvc3RhdGlvbi90ZXJ0aWFyeQorCQkoaGNmXzggRkFSICAgKikgZndfaW1hZ2VfMV9kYXRhCisJfSwKKwl7CisJCTgsCisJCUNGR19QUk9HLAorCQlDRkdfUFJPR19WT0xBVElMRSwJCQkvLyBtb2RlCisJCTB4MjQzMiwJCS8vIHNpemVvZihmd19pbWFnZV8yX2RhdGEpLAorCQkweDAwMDAwQzE2LAkJCQkJLy8gVGFyZ2V0IGFkZHJlc3MgaW4gTklDIE1lbW9yeQorCQkweDAwMDAsCQkJCQkJLy8gQ1JDOiB5ZXMvbm8JVFlQRTogcHJpbWFyeS9zdGF0aW9uL3RlcnRpYXJ5CisJCShoY2ZfOCBGQVIgICAqKSBmd19pbWFnZV8yX2RhdGEKKwl9LAorCXsKKwkJOCwKKwkJQ0ZHX1BST0csCisJCUNGR19QUk9HX1ZPTEFUSUxFLAkJCS8vIG1vZGUKKwkJMHgxOTRjLAkJLy8gc2l6ZW9mKGZ3X2ltYWdlXzNfZGF0YSksCisJCTB4MDAxRTMwNDgsCQkJCQkvLyBUYXJnZXQgYWRkcmVzcyBpbiBOSUMgTWVtb3J5CisJCTB4MDAwMCwJCQkJCQkvLyBDUkM6IHllcy9ubwlUWVBFOiBwcmltYXJ5L3N0YXRpb24vdGVydGlhcnkKKwkJKGhjZl84IEZBUiAgICopIGZ3X2ltYWdlXzNfZGF0YQorCX0sCisJeworCQk4LAorCQlDRkdfUFJPRywKKwkJQ0ZHX1BST0dfVk9MQVRJTEUsCQkJLy8gbW9kZQorCQkweGI3ZTQsCQkvLyBzaXplb2YoZndfaW1hZ2VfNF9kYXRhKSwKKwkJMHgwMDFGNDAwMCwJCQkJCS8vIFRhcmdldCBhZGRyZXNzIGluIE5JQyBNZW1vcnkKKwkJMHgwMDAwLAkJCQkJCS8vIENSQzogeWVzL25vCVRZUEU6IHByaW1hcnkvc3RhdGlvbi90ZXJ0aWFyeQorCQkoaGNmXzggRkFSICAgKikgZndfaW1hZ2VfNF9kYXRhCisJfSwKKwl7CisJCTUsCisJCUNGR19QUk9HLAorCQlDRkdfUFJPR19TVE9QLAkJCQkvLyBtb2RlCisJCTAwMDAsCisgCTB4MDAwRjIxMDEsCQkJCQkvLyBTdGFydCBleGVjdXRpb24gYWRkcmVzcworCX0sCisJeyAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwMDAwMCwgMDAwMCwgMDAwMDAwMDB9Cit9OworCitzdGF0aWMgY29uc3QgQ0ZHX1JBTkdFMjBfU1RSQ1QgZndfaW1hZ2VfaW5mb2NvbXBhdFtdID0geworCXsJMyArICgoMjAgKiBzaXplb2YoQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QpKSAvIHNpemVvZihoY2ZfMTYpKSwKKwkJQ0ZHX0ZXX1NVUF9SQU5HRSwKKwkJQ09NUF9ST0xFX1NVUEwsCisJCUNPTVBfSURfQVBGLAorCQl7CisJCQl7IDQsIDEsIDEgfSAgCQkJCS8vdmFyaWFudCwgYm90dG9tLCB0b3AKKwkJfQorCX0sCisJewkzICsgKCgyMCAqIHNpemVvZihDRkdfUkFOR0VfU1BFQ19TVFJDVCkpIC8gc2l6ZW9mKGhjZl8xNikpLAorCQlDRkdfTUZJX0FDVF9SQU5HRVNfU1RBLAorCQlDT01QX1JPTEVfQUNULAorCQlDT01QX0lEX01GSSwKKwkJeworCQkJeyA3LCAzLCAzIH0sIAkJCQkvL3ZhcmlhbnQsIGJvdHRvbSwgdG9wCisJCQl7IDgsIDEsIDEgfSAgCQkJCS8vdmFyaWFudCwgYm90dG9tLCB0b3AKKwkJfQorCX0sCisJewkzICsgKCgyMCAqIHNpemVvZihDRkdfUkFOR0VfU1BFQ19TVFJDVCkpIC8gc2l6ZW9mKGhjZl8xNikpLAorCQlDRkdfQ0ZJX0FDVF9SQU5HRVNfU1RBLAorCQlDT01QX1JPTEVfQUNULAorCQlDT01QX0lEX0NGSSwKKwkJeworCQkJeyA0LCAxLCAyIH0gIAkJCQkvL3ZhcmlhbnQsIGJvdHRvbSwgdG9wCisJCX0KKwl9LAorCXsgMDAwMCwgMDAwMCwgMDAwMCwgMDAwMCwgeyB7IDAwMDAsIDAwMDAsIDAwMDAgfSB9IH0JCQkvL2VuZHNlbnRpbmVsCit9OworCittZW1pbWFnZSBmd19pbWFnZSA9IHsKKwkiRlVQVTdEMzdkaGZ3Y2lcMDAxQyIsCQkJLy9zaWduYXR1cmUsIDxmb3JtYXQgbnVtYmVyPiwgQy9CaW4gdHlwZQorCShDRkdfUFJPR19TVFJDVCAqKSBmd19pbWFnZV9jb2RlLAorCTB4MDAwRjIxMDEsCisJMDAwMDAwMDAsCQkJCQkvLyhkdW1teSkgcGRhcGx1ZworCTAwMDAwMDAwLAkJCQkJLy8oZHVtbXkpIHByaXBsdWcKKwkoQ0ZHX1JBTkdFMjBfU1RSQ1QgKikgZndfaW1hZ2VfaW5mb2NvbXBhdCwKKwkoQ0ZHX0lERU5USVRZX1NUUkNUICopIGZ3X2ltYWdlX2luZm9pZGVudGl0eSwKK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2RlYnVnLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNTJlMTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9kZWJ1Zy5oCkBAIC0wLDAgKzEsMjEyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBXaXJlbGVzcyBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAod2xhZ3M0OSkuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBodHRwOi8vd3d3LmFnZXJlLmNvbQorICoKKyAqIEluaXRpYWxseSBkZXZlbG9wZWQgYnkgVHJpcGxlUG9pbnQsIEluYy4KKyAqICAgaHR0cDovL3d3dy50cmlwbGVwb2ludC5jb20KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIGRlYnVnZ2luZy4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNPRlRXQVJFIExJQ0VOU0UKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisgKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9ERUJVR19ICisjZGVmaW5lIF9ERUJVR19ICisKKworCisKKy8qIFR1cm4gb24gZGVidWdnaW5nIGhlcmUgaWYgbm90IGRvbmUgd2l0aCBhIHByZXByb2Nlc3NvciBkZWZpbmUgKi8KKyNpZm5kZWYgREJHCisjZGVmaW5lIERCRyAwCisjZWxzZQorI3VuZGVmCURCRworI2RlZmluZSBEQkcgMQorI2VuZGlmIC8vREJHCisKKworCisKKyNpZiBEQkcKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBTZXQgdGhlIGxldmVsIG9mIGRlYnVnZ2luZyBpZiBub3QgZG9uZSB3aXRoIGEgcHJlcHJvY2Vzc29yIGRlZmluZS4gU2VlCisgICB3bF9tYWluLmMsIGluaXRfbW9kdWxlKCkgZm9yIGhvdyB0aGUgZGVidWcgbGV2ZWwgdHJhbnNsYXRlcyBpbnRvIHRoZQorICAgdGhlIHR5cGVzIG9mIG1lc3NhZ2VzIGRpc3BsYXllZCAqLworI2lmbmRlZiBEQkdfTFZMCisjZGVmaW5lIERCR19MVkwgNQkJCS8qIHlpZWxkcyBub3RoaW5nIHZpYSBpbml0X21vZHVsZSwKKwkJCQkJCQkgICBvcmlnaW5hbCB2YWx1ZSBvZiA1IHlpZWxkcyBEQkdfVFJBQ0VfT04gYW5kIERCR19WRVJCT1NFX09OICovCisjZW5kaWYgIC8vIERCR19MVkwKKworCisjZGVmaW5lIERCR19FUlJPUl9PTiAgICAgICAgMHgwMDAwMDAwMUwKKyNkZWZpbmUgREJHX1dBUk5JTkdfT04gICAgICAweDAwMDAwMDAyTAorI2RlZmluZSBEQkdfTk9USUNFX09OICAgICAgIDB4MDAwMDAwMDRMCisjZGVmaW5lIERCR19UUkFDRV9PTiAgICAgICAgMHgwMDAwMDAwOEwKKyNkZWZpbmUgREJHX1ZFUkJPU0VfT04gICAgICAweDAwMDAwMDEwTAorI2RlZmluZSBEQkdfUEFSQU1fT04gICAgICAgIDB4MDAwMDAwMjBMCisjZGVmaW5lIERCR19CUkVBS19PTiAgICAgICAgMHgwMDAwMDA0MEwKKyNkZWZpbmUgREJHX1JYX09OICAgICAgICAgICAweDAwMDAwMTAwTAorI2RlZmluZSBEQkdfVFhfT04gICAgICAgICAgIDB4MDAwMDAyMDBMCisjZGVmaW5lIERCR19EU19PTiAgICAgICAgICAgMHgwMDAwMDQwMEwKKworI2RlZmluZSBEQkdfREVGQVVMVFMgICAgICAgIChEQkdfRVJST1JfT04gfCBEQkdfV0FSTklOR19PTiB8IERCR19CUkVBS19PTikKKworI2RlZmluZSBEQkdfRkxBR1MoQSkgICAgICAgIChBKS0+RGVidWdGbGFnCisjZGVmaW5lIERCR19OQU1FKEEpICAgICAgICAgKEEpLT5kYmdOYW1lCisjZGVmaW5lIERCR19MRVZFTChBKSAgICAgICAgKEEpLT5kYmdMZXZlbAorCisKKyNpZm5kZWYgUFJJTlRLCisjICAgZGVmaW5lIFBSSU5USyhTLi4uKSAgICAgcHJpbnRrKFMpCisjZW5kaWYgLy8gUFJJTlRLCisKKworI2lmbmRlZiBEQkdfUFJJTlQKKyMgICBkZWZpbmUgREJHX1BSSU5UKFMuLi4pICBQUklOVEsoS0VSTl9ERUJVRyBTKQorI2VuZGlmIC8vIERCR19QUklOVAorCisKKyNpZm5kZWYgREJHX1BSSU5UQworIyAgIGRlZmluZSBEQkdfUFJJTlRDKFMuLi4pIFBSSU5USyhTKQorI2VuZGlmIC8vIERCR19QUklOVEMKKworCisjaWZuZGVmIERCR19UUkFQCisjICAgZGVmaW5lIERCR19UUkFQICAgICAgICAge30KKyNlbmRpZiAvLyBEQkdfVFJBUAorCisKKyNkZWZpbmUgX0VOVEVSX1NUUiAgICAgICAgICAiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PiIKKyNkZWZpbmUgX0xFQVZFX1NUUiAgICAgICAgICAiPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PCIKKworCisjZGVmaW5lIF9EQkdfRU5URVIoQSkgICAgICAgREJHX1BSSU5UKCIlczolLipzOiVzXG4iLERCR19OQU1FKEEpLCsrREJHX0xFVkVMKEEpLF9FTlRFUl9TVFIsX19GVU5DX18pCisjZGVmaW5lIF9EQkdfTEVBVkUoQSkgICAgICAgREJHX1BSSU5UKCIlczolLipzOiVzXG4iLERCR19OQU1FKEEpLERCR19MRVZFTChBKS0tLF9MRUFWRV9TVFIsX19GVU5DX18pCisKKworI2RlZmluZSBEQkdfRlVOQyhGKSAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICpfX0ZVTkNfXyA9IEY7CisKKyNkZWZpbmUgREJHX0VOVEVSKEEpICAgICAgICB7aWYgKERCR19GTEFHUyhBKSAmIERCR19UUkFDRV9PTikgX0RCR19FTlRFUihBKTt9CisKKyNkZWZpbmUgREJHX0xFQVZFKEEpICAgICAgICB7aWYgKERCR19GTEFHUyhBKSAmIERCR19UUkFDRV9PTikgX0RCR19MRUFWRShBKTt9CisKKyNkZWZpbmUgREJHX1BBUkFNKEEsTixGLFMuLi4pICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfUEFSQU1fT04pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR19QUklOVCgiICAlcyAtLSAiRiJcbiIsTixTKTt9CisKKworI2RlZmluZSBEQkdfRVJST1IoQSxTLi4uKSAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX0VSUk9SX09OKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtEQkdfUFJJTlQoIiVzOkVSUk9SOiVzICIsREJHX05BTUUoQSksX19GVU5DX18pO0RCR19QUklOVEMoUyk7REJHX1RSQVA7fX0KKworCisjZGVmaW5lIERCR19XQVJOSU5HKEEsUy4uLikge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfV0FSTklOR19PTikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7REJHX1BSSU5UKCIlczpXQVJOSU5HOiVzICIsREJHX05BTUUoQSksX19GVU5DX18pO0RCR19QUklOVEMoUyk7fX0KKworCisjZGVmaW5lIERCR19OT1RJQ0UoQSxTLi4uKSAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfTk9USUNFX09OKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtEQkdfUFJJTlQoIiVzOk5PVElDRTolcyAiLERCR19OQU1FKEEpLF9fRlVOQ19fKTtEQkdfUFJJTlRDKFMpO319CisKKworI2RlZmluZSBEQkdfVFJBQ0UoQSxTLi4uKSAgIGRvIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1RSQUNFX09OKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtEQkdfUFJJTlQoIiVzOiVzICIsREJHX05BTUUoQSksX19GVU5DX18pO0RCR19QUklOVEMoUyk7fX0gd2hpbGUgKDApCisKKworI2RlZmluZSBEQkdfUlgoQSxTLi4uKSAgICAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1JYX09OKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtEQkdfUFJJTlQoUyk7fX0KKworCisjZGVmaW5lIERCR19UWChBLFMuLi4pICAgICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfVFhfT04pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0RCR19QUklOVChTKTt9fQorCisjZGVmaW5lIERCR19EUyhBLFMuLi4pICAgICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfRFNfT04pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0RCR19QUklOVChTKTt9fQorCisKKyNkZWZpbmUgREJHX0FTU0VSVChDKSAgICAgICB7aWYgKCEoQykpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0RCR19QUklOVCgiQVNTRVJUKCVzKSAtLSAlcyMlZCAoJXMpXG4iLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjQyxfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNfXyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHX1RSQVA7fX0KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIgICAgICAgICAgICpkYmdOYW1lOworICAgIGludCAgICAgICAgICAgICBkYmdMZXZlbDsKKyAgICB1bnNpZ25lZCBsb25nICAgRGVidWdGbGFnOworfSBkYmdfaW5mb190OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2Vsc2UgLy8gREJHCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBEQkdfREVGTgorI2RlZmluZSBEQkdfVFJBUAorI2RlZmluZSBEQkdfRlVOQyhGKQorI2RlZmluZSBEQkdfUFJJTlQoUy4uLikKKyNkZWZpbmUgREJHX0VOVEVSKEEpCisjZGVmaW5lIERCR19MRUFWRShBKQorI2RlZmluZSBEQkdfUEFSQU0oQSxOLEYsUy4uLikKKyNkZWZpbmUgREJHX0VSUk9SKEEsUy4uLikKKyNkZWZpbmUgREJHX1dBUk5JTkcoQSxTLi4uKQorI2RlZmluZSBEQkdfTk9USUNFKEEsUy4uLikKKyNkZWZpbmUgREJHX1RSQUNFKEEsUy4uLikKKyNkZWZpbmUgREJHX1JYKEEsUy4uLikKKyNkZWZpbmUgREJHX1RYKEEsUy4uLikKKyNkZWZpbmUgREJHX0RTKEEsUy4uLikKKyNkZWZpbmUgREJHX0FTU0VSVChDKQorCisjZW5kaWYgLy8gREJHCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKworI2VuZGlmIC8vIF9ERUJVR19ICisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2RoZi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvZGhmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZmNTgzNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2RoZi5jCkBAIC0wLDAgKzEsMzkwIEBACisKKy8vICAgdmltOnR3PTExMDp0cz00OgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZJTEUgICA6CURIRi5DCisqCisqIERBVEUJOgkkRGF0ZTogMjAwNC8wNy8xOSAwODoxNjoxNCAkICAgJFJldmlzaW9uOiAxLjIgJAorKiBPcmlnaW5hbAk6CTIwMDQvMDUvMjggMTQ6MDU6MzQgICAgUmV2aXNpb246IDEuMzYgICAgICBUYWc6IGhjZjdfdDIwMDQwNjAyXzAxCisqIE9yaWdpbmFsCToJMjAwNC8wNS8xMSAwNjoyMjo1NyAgICBSZXZpc2lvbjogMS4zMiAgICAgIFRhZzogaGNmN190N18yMDA0MDUxM18wMQorKiBPcmlnaW5hbAk6CTIwMDQvMDQvMTUgMDk6MjQ6NDIgICAgUmV2aXNpb246IDEuMjggICAgICBUYWc6IGhjZjdfdDdfMjAwNDA0MTVfMDEKKyogT3JpZ2luYWwJOgkyMDA0LzA0LzA4IDE1OjE4OjE2ICAgIFJldmlzaW9uOiAxLjI3ICAgICAgVGFnOiB0N18yMDA0MDQxM18wMQorKiBPcmlnaW5hbAk6CTIwMDQvMDQvMDEgMTU6MzI6NTUgICAgUmV2aXNpb246IDEuMjUgICAgICBUYWc6IHQ3XzIwMDQwNDAxXzAxCisqIE9yaWdpbmFsCToJMjAwNC8wMy8xMCAxNTozOToyOCAgICBSZXZpc2lvbjogMS4yMSAgICAgIFRhZzogdDIwMDQwMzEwXzAxCisqIE9yaWdpbmFsCToJMjAwNC8wMy8wNCAxMTowMzozNyAgICBSZXZpc2lvbjogMS4xOSAgICAgIFRhZzogdDIwMDQwMzA0XzAxCisqIE9yaWdpbmFsCToJMjAwNC8wMy8wMiAwOToyNzoxMSAgICBSZXZpc2lvbjogMS4xNyAgICAgIFRhZzogdDIwMDQwMzAyXzAzCisqIE9yaWdpbmFsCToJMjAwNC8wMi8yNCAxMzowMDoyOCAgICBSZXZpc2lvbjogMS4xNSAgICAgIFRhZzogdDIwMDQwMjI0XzAxCisqIE9yaWdpbmFsCToJMjAwNC8wMi8xOSAxMDo1NzoyOCAgICBSZXZpc2lvbjogMS4xNCAgICAgIFRhZzogdDIwMDQwMjE5XzAxCisqIE9yaWdpbmFsCToJMjAwMy8xMS8yNyAwOTowMDowOSAgICBSZXZpc2lvbjogMS4zICAgICAgVGFnOiB0MjAwMjEyMTZfMDEKKyoKKyogQVVUSE9SIDoJSm9obiBNZWVydGVucworKgkJCU5pY28gVmFsc3RlcgorKgorKiBTUEVDSUZJQ0FUSU9OOiAuLi4uLi4uLgorKgorKiBERVNDICAgOglnZW5lcmljIGZ1bmN0aW9ucyB0byBoYW5kbGUgdGhlIGRvd25sb2FkIG9mIE5JQyBmaXJtd2FyZQorKgkJCUxvY2FsIFN1cHBvcnQgUm91dGluZXMgZm9yIGFib3ZlIHByb2NlZHVyZXMKKyoKKyoJCQlDdXN0b21pemFibGUgdmlhIEhDRkNGRy5ILCB3aGljaCBpcyBpbmNsdWRlZCBieSBIQ0YuSAorKgorKgorKglESEYgaXMgKGludGVuZGVkIHRvIGJlKSBwbGF0Zm9ybS1pbmRlcGVuZGVudC4KKyoJREhGIGlzIGEgbW9kdWxlIHRoYXQgcHJvdmlkZXMgYSBudW1iZXIgb2Ygcm91dGluZXMgdG8gZG93bmxvYWQgZmlybXdhcmUKKyoJaW1hZ2VzICh0aGUgbmFtZXMgcHJpbWFyeSwgc3RhdGlvbiwgYWNjZXNzIHBvaW50LCBzZWNvbmRhcnkgYW5kIHRlcnRpYXJ5CisqCWFyZSB1c2VkIG9yIGhhdmUgYmVlbiB1c2VkKSB0byB2b2xhdGlsZSBvciBub252b2xhdGlsZSBtZW1vcnkKKyoJaW4gV2F2ZUxBTi9JRUVFIE5JQ3MuIFRvIGFjaGlldmUgdGhpcyBESEYgbWFrZXMgdXNlIG9mIHRoZSBXYXZlTEFOL0lFRUUKKyoJV0NJIGFzIGltcGxlbWVudGVkIGJ5IHRoZSBIQ0YtbW9kdWxlLgorKgorKglEb3dubG9hZCB0byBub24tdm9sYXRpbGUgbWVtb3J5IGlzIHVzZWQgdG8gdXBkYXRlIGEgV2F2ZUxBTi9JRUVFIE5JQyB0byBuZXcKKyoJZmlybXdhcmUuIE5vcm1hbGx5IHRoaXMgd2lsbCBiZSBhbiB1cGdyYWRlIHRvIG5ld2VyIGZpcm13YXJlLCBhbHRob3VnaAorKglkb3duZ3JhZGluZyB0byBvbGRlciBmaXJtd2FyZSBpcyBwb3NzaWJsZSB0b28uCisqCisqIE5vdGU6IHJlbGF0aXZlIHRvIEFzc2VydHMsIHRoZSBmb2xsb3dpbmcgY2FuIGJlIG9ic2VydmVkOgorKglTaW5jZSB0aGUgSUZCIGlzIG5vdCBrbm93biBpbnNpZGUgdGhlIHJvdXRpbmUsIHRoZSBtYWNybyBIQ0ZBU1NFUlQgaXMgcmVwbGFjZWQgd2l0aCBNTURBU1NFUlQuCisqCUFsc28gdGhlIGxpbmUgbnVtYmVyIHJlcG9ydGVkIGluIHRoZSBhc3NlcnQgaXMgcmFpc2VkIGJ5IEZJTEVfTkFNRV9PRkZTRVQgKDEwMDAwKSB0byBkaXNjcmltaW5hdGUgdGhlCisqCURIRiBBc3NlcnRzIGZyb20gSENGIGFuZCBNTUQgYXNzZXJ0cy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgorKiBTT0ZUV0FSRSBMSUNFTlNFCisqCisqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorKgorKiBDT1BZUklHSFQgqSAxOTk5IC0gMjAwMCBieSBMdWNlbnQgVGVjaG5vbG9naWVzLglBbGwgUmlnaHRzIFJlc2VydmVkCisqIENPUFlSSUdIVCCpIDIwMDEgLSAyMDA0CWJ5IEFnZXJlIFN5c3RlbXMgSW5jLglBbGwgUmlnaHRzIFJlc2VydmVkCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyoKKyogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisqICAgIGRpc3RyaWJ1dGlvbi4KKyoKKyogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqCisqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogRGlzY2xhaW1lcgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisqIERBTUFHRS4KKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiaGNmLmgiCisjaW5jbHVkZSAiaGNmZGVmLmgiCisjaW5jbHVkZSAiZGhmLmgiCisjaW5jbHVkZSAibW1kLmgiCisKKy8vdG8gZGlzdGluZ3Vpc2ggTU1EIGZyb20gSENGIGFzc2VydHMgYnkgbWVhbnMgb2YgbGluZSBudW1iZXIKKyN1bmRlZglGSUxFX05BTUVfT0ZGU0VUCisjZGVmaW5lIEZJTEVfTkFNRV9PRkZTRVQgTU1EX0ZJTEVfTkFNRV9PRkZTRVQKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBEZWZpbmVzLCBkYXRhIHN0cnVjdHVyZXMsIGFuZCBnbG9iYWwgdmFyaWFibGVzCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvLyAgICAgICAgICAgICAgICAgICAgMTIzNDU2Nzg5MDEyMzQKK2NoYXIgc2lnbmF0dXJlWzE0XSA9ICJGVVBVN0QzN2RoZndjaSI7CisKKy8vVGhlIGJpbmFyeSBkb3dubG9hZCBmdW5jdGlvbiAicmVsb2NhdGVzIiB0aGUgaW1hZ2UgdXNpbmcgY29uc3RydWN0aW9ucyBsaWtlOgorLy8JZnctPmlkZW50aXR5ID0gKENGR19JREVOVElUWV9TVFJDVCBGQVIgKikoKGNoYXIgRkFSICopZnctPmlkZW50aXR5ICsgKGhjZl8zMilmdyApOworLy91bmRlciBzb21lIG9mIHRoZSBtZW1vcnkgbW9kZWxzIHVuZGVyIE1TVkMgMS41MiB0aGVzZSBjb25zdHJ1Y3Rpb25zIGRlZ3JhZGUgdG8gMTYtYml0cyBwb2ludGVyIGFyaXRobWV0aWMuCisvL2Z3LT5pZGVudGl0eSBpcyBsaW1pdGVkLCBzdWNoIHRoYXQgYWRkaW5nIGl0IHRvIGZ3LCBkb2VzIG5vdCBuZWVkIHRvIGNhcnJ5IG92ZXIgZnJvbSBvZmZzZXQgdG8gc2VnbWVudC4KKy8vSG93ZXZlciB0aGUgc2VnbWVudCBpcyBub3Qgc2V0IGF0IGFsbC4KKy8vQXMgYSB3b3JrYXJvdW5kIHRoZSBQU0VVRE9fQ0hBUlAgbWFjcm8gaXMgaW50cm9kdWNlZCB3aGljaCBpcyBhIGNoYXIgcG9pbnRlciBleGNlcHQgZm9yIE1TVkMgMS41MiwgaW4KKy8vd2hpY2ggY2FzZSB3ZSBrbm93IHRoYXQgYSAzMi1iaXQgcXVhbnRpdHkgaXMgYWRlcXVhdGUgYXMgYSBwb2ludGVyLgorLy9Ob3RlIHRoYXQgb3RoZXIgcGxhdGZvcm1zIG1heSBleHBlcmllbmNlIGNvbXBhcmFibGUgcHJvYmxlbXMgd2hlbiB1c2luZyB0aGUgYmluYXJ5IGRvd25sb2FkIGZlYXR1cmUuCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPT0gIDgwMAkJCQkvLyBWaXN1YWwgQysrIDEuNQorI2RlZmluZSBQU0VVRE9fQ0hBUlAgaGNmXzMyCisjZWxzZQorI2RlZmluZSBQU0VVRE9fQ0hBUlAgaGNmXzgqCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIExUVi1yZWNvcmRzIHJldHJpZXZlZCBmcm9tIHRoZSBOSUMgdG86CisgKgktIGRldGVybWluZSBjb21wYXRpYmlsaXR5IGJldHdlZW4gTklDIGFuZCBpbWFnZQorICoJLSAoKHNldHVwIHRoZSBidWZmZXIgc2l6ZSBkeW5hbWljYWxseSBmb3Igbm9uLXZvbGF0aWxlIGRvd25sb2FkIChzZWUgbm90ZSBiZWxvdykgKSkKKyAqCS0gc3VwcGx5IHBsdWdnaW5nIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGUgUERBIChILUkgb25seSkKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8vIGZvciBVU0IvSDEgd2UgbmVlZGVkIGEgc21hbGxlciB2YWx1ZSB0aGFuIHRoZSBDRkdfRExfQlVGX1NUUkNUIHJlcG9ydGVkIDgxOTIKKy8vIGZvciB0aGUgdGltZSBiZWluZyBpdCBzZWVtcyBzaW1wbGVyIHRvIGFsd2F5cyB1c2UgMjAwMCBmb3IgVVNCL0gxIGFzIHdlbGwgYXMgYWxsIG90aGVyIGNhc2VzIHJhdGhlciB0aGFuCisvLyB1c2luZyB0aGUgImZpeGVkIGFueXdheSIgQ0ZHX0RMX0JVRl9TVFJDVC4KKyNkZWZpbmUgRExfU0laRSAyMDAwCisKKy8vQ0ZHX0lERU5USVRZX1NUUkNUICAgCXByaV9pZGVudGl0eQk9IHsgTE9GKENGR19JREVOVElUWV9TVFJDVCksIENGR19QUklfSURFTlRJVFkgfTsKK0NGR19TVVBfUkFOR0VfU1RSQ1QgCW1maV9zdXAgICAgICAgIAk9IHsgTE9GKENGR19TVVBfUkFOR0VfU1RSQ1QpLCBDRkdfTklDX01GSV9TVVBfUkFOR0UgfTsKK0NGR19TVVBfUkFOR0VfU1RSQ1QgCWNmaV9zdXAgICAgICAgIAk9IHsgTE9GKENGR19TVVBfUkFOR0VfU1RSQ1QpLCBDRkdfTklDX0NGSV9TVVBfUkFOR0UgfTsKKy8qIE5vdGU6IGNvdWxkIGJlIHVzZWQgcmF0aGVyIHRoYW4gdGhlIGFib3ZlIGV4cGxhaW5lZCBhbmQgZGVmaW5lZCBETF9TSVpFIGlmIG5lZWQgYXJpc2VzCisgKiBDRkdfRExfQlVGX1NUUkNUICAgIAlkbF9idWYgICAgICAgICAJPSB7IExPRihDRkdfRExfQlVGX1NUUkNUKSwgQ0ZHX0RMX0JVRiB9OworKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQXJyYXkgbHR2X2luZm8gc3RvcmVzIE5JQyBpbmZvcm1hdGlvbiAoaW4gdGhlIGZvcm0gb2YgTFRWLXJlY29yZHMpCisgKiBuZWVkZWQgZm9yIGRvd25sb2FkLiBBIE5VTEwgcmVjb3JkIGluZGljYXRlcyB0aGUgZW5kIG9mIHRoZSBhcnJheS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVGhlIExUVl9JTkZPX1NUUlVDVCBpcyBuZWVkZWQgdG8gc2F2ZSB0aGUgc2l6ZXMgb2YgdGhlIHN0cnVjdHMsIGJlY2F1c2UgYWZ0ZXIgYSBHRVRfSU5GTygpCisgKiB0aGUgbGVuIGZpZWxkIGlzIGNoYW5nZWQgdG8gdGhlIHJlYWwgbGVuIG9mIHRoZSBSSUQgYnkgdGhlIGNhbGxlZCByb3V0aW5lLgorICogVGhpcyBpcyBvbmx5IHJlbGV2YW50IGlmIHRoZSBESEYgdXNlZCB3aXRob3V0IHJlbG9hZGluZyB0aGUgZHJpdmVyL3V0aWxpdHkuCisgKi8KKworTFRWX0lORk9fU1RSVUNUIGx0dl9pbmZvW10gPSB7CisJeyAoTFRWUCkmbWZpX3N1cCwJCQlMT0YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCkgfSAsCisJeyAoTFRWUCkmY2ZpX3N1cCwJCQlMT0YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCkgfSAsCisJeyAoTFRWUCkgTlVMTCwgCQkJCTAgfQorfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBQUk9UT1RZUEVTICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CQkJCWNoZWNrX2NvbXBfZncoIG1lbWltYWdlICpmdyApOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyouU1VCTU9EVUxFCQlpbnQgY2hlY2tfY29tcF9mdyggbWVtaW1hZ2UgKmZ3ICkKKyouUFVSUE9TRQkJQ2hlY2tzIGNvbXBhdGliaWxpdHkgb2YgQ0ZJIGFuZCBNRkksIE5JQyBhcyBzdXBwbGllciwgc3RhdGlvbi9BUCBmaXJtd2FyZSBpbWFnZSBhcyBzdXBwbGllci4KKyoKKyouQVJHVU1FTlRTCisqICAgZncgICAgICAgICAJRi9XIGltYWdlIHRvIGJlIGRvd25sb2FkZWQKKyoKKyouUkVUVVJOUworKiAgIEhGQ19TVUNDRVNTICAgICAgCS0gZmlybXdhcmUgT0sKKyogICBESEZfRVJSX0lOQ09NUF9GVworKgorKi5ERVNDUklQVElPTgorKiAgIFRoaXMgZnVuY3Rpb24gdXNlcyBjb21wYXRpYmlsaXR5IGFuZCBpZGVudGl0eSBpbmZvcm1hdGlvbiB0aGF0IGhhcyBiZWVuCisqICAgcmV0cmlldmVkIGZyb20gdGhlIGNhcmQgd2hpY2ggaXMgY3VycmVudGx5IGluc2VydGVkIHRvIGNoZWNrIHdoZXRoZXIgdGhlCisqICAgc3RhdGlvbiBmaXJtd2FyZSBpbWFnZSB0byBiZSBkb3dubG9hZGVkIGlzIGNvbXBhdGlibGUuCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorY2hlY2tfY29tcF9mdyggbWVtaW1hZ2UgKmZ3ICkKK3sKK0NGR19SQU5HRTIwX1NUUkNUICAJCSpwOworaW50ICAgCQkJCQlyYyA9IEhDRl9TVUNDRVNTOworQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QqCWk7CisKKwlzd2l0Y2goIGZ3LT5pZGVudGl0eS0+dHlwICkgeworCSAgY2FzZSBDRkdfRldfSURFTlRJVFk6CQkJCS8vU3RhdGlvbiBGL1cKKwkgIGNhc2UgQ09NUF9JRF9GV19BUF9GQUtFOgkJCS8vOz9pcyB0aGlzIHVzZWZ1bCAodXNlZCB0byBiZTogIENGR19BUF9JREVOVElUWSkKKwkJYnJlYWs7CisJICBkZWZhdWx0OgorCQlNTURBU1NFUlQoIERPX0FTU0VSVCwgZnctPmlkZW50aXR5LT50eXAgKSAJLy91bmtub3duL3Vuc3VwcG9ydGVkIGZpcm13YXJlX3R5cGU6CisJCXJjID0gREhGX0VSUl9JTkNPTVBfRlc7CisJCXJldHVybiByYzsgLyogOz8gaG93IHVzZWZ1bCBpcyB0aGlzIGFueXdheSwKKwkJCQkJKiAgdGlsbCB0aGF0IGlzIHNvcnRlZCBvdXQgbWlnaHQgYXMgd2VsbCB2aW9sYXRlIG15IG93biBzaW5nbGUgZXhpdCBwcmluY2lwbGUKKwkJCQkJKi8KKwl9CisJcCA9IGZ3LT5jb21wYXQ7CisJaSA9IE5VTEw7CisJd2hpbGUoIHAtPmxlbiAmJiBpID09IE5VTEwgKSB7CQkJCQkvLyBjaGVjayB0aGUgTUZJIHJhbmdlcworCQlpZiAoIHAtPnR5cCAgPT0gQ0ZHX01GSV9BQ1RfUkFOR0VTX1NUQSApIHsKKwkJCWkgPSBtbWRfY2hlY2tfY29tcCggKHZvaWQqKXAsICZtZmlfc3VwICk7CisJCX0KKwkJcCsrOworCX0KKwlNTURBU1NFUlQoIGksIDAgKQkvL01GSTogTklDIFN1cHBsaWVyIG5vdCBjb21wYXRpYmxlIHdpdGggRi9XIGltYWdlIEFjdG9yCisJaWYgKCBpICkgeworCQlwID0gZnctPmNvbXBhdDsKKwkJaSA9IE5VTEw7CisJCXdoaWxlICggcC0+bGVuICYmIGkgPT0gTlVMTCApIHsJCQkvLyBjaGVjayB0aGUgQ0ZJIHJhbmdlcworCQkJaWYgKCBwLT50eXAgID09IENGR19DRklfQUNUX1JBTkdFU19TVEEgKSB7CisJCQkJIGkgPSBtbWRfY2hlY2tfY29tcCggKHZvaWQqKXAsICZjZmlfc3VwICk7CisJCQl9CisJCQlwKys7CisJCX0KKwkJTU1EQVNTRVJUKCBpLCAwICkJLy9DRkk6IE5JQyBTdXBwbGllciBub3QgY29tcGF0aWJsZSB3aXRoIEYvVyBpbWFnZSBBY3RvcgorCX0KKwlpZiAoIGkgPT0gTlVMTCApIHsKKwkJcmMgPSBESEZfRVJSX0lOQ09NUF9GVzsKKwl9CisJcmV0dXJuIHJjOworfSAvLyBjaGVja19jb21wX2Z3CisKKworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEV4cG9ydGVkIGZ1bmN0aW9ucworICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLk1PRFVMRSAJCWludCBkaGZfZG93bmxvYWRfYmluYXJ5KCB2b2lkICppZmJwLCBtZW1pbWFnZSAqZncgKQorKi5QVVJQT1NFCQlEb3dubG9hZHMgYSBjb21wbGV0ZSAocHJpbWFyeSwgc3RhdGlvbiwgb3IgYWNjZXNzIHBvaW50KSBmaXJtd2FyZSBpbWFnZSB0byB0aGUgTklDLgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqICAgZncgICAgICAgICAJRi9XIGltYWdlIHRvIGJlIGRvd25sb2FkZWQKKyoKKyouUkVUVVJOUworKiAgIEhDRl9TVUNDRVNTICAgICAgICAgCS0gZG93bmxvYWQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyogICBESEZfRVJSX0lOQ09NUF9GVwkJLSBmaXJtd2FyZSBub3QgY29tcGF0aWJsZQorKgorKi5ERVNDUklQVElPTgorKiAgIEluaXRpYWxpemUgZ2xvYmFsIHZhcmlhYmxlcworKiAgIENvbm5lY3QgdG8gdGhlIERIRgorKiAgIENoZWNrIHRoZSBjb21wYXRpYmlsaXR5IG9mIHRoZSBpbWFnZSAoRm9yIHByaW1hcnkgZmlybXdhcmUgaW1hZ2VzIGl0IGlzIGNoZWNrZWQgZmlyc3QKKyogCXdoZXRoZXIgZG93bmxvYWQgaXMgbmVjZXNzYXJ5KS4KKyogICBJZiBldmVyeXRoaW5nJ3MgZG93bmxvYWQgdGhlIGZpcm13YXJlLgorKiAgIERpc2Nvbm5lY3QgZnJvbSB0aGUgREhGLgorKgorKgorKi5ESUFHUkFNCisqCisqLk5PVElDRToKKwlNTURBU1NFUlQgaXMgdW5hY2NlcHRhYmxlIGJlY2F1c2Ugc29tZSBkcml2ZXJzIGNhbGwgZGhmX2Rvd25sb2FkX2JpbmFyeSBiZWZvcmUgaGNmX2Nvbm5lY3QKKworKiBUaGUgb2xkIGNvbW1lbnQgd2FzOgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK2RoZl9kb3dubG9hZF9iaW5hcnkoIG1lbWltYWdlICpmdyApCit7CitpbnQgCQkJcmMgPSBIQ0ZfU1VDQ0VTUzsKK0NGR19QUk9HX1NUUkNUIAkqcDsKK2ludAkJCQlpOworCisJLy92YWxpZGF0ZSB0aGUgaW1hZ2UKKwlmb3IgKCBpID0gMDsgaSA8IHNpemVvZihzaWduYXR1cmUpICYmIGZ3LT5zaWduYXR1cmVbaV0gPT0gc2lnbmF0dXJlW2ldOyBpKysgKSAvKk5PUCovOworCWlmICggaSAhPSBzaXplb2Yoc2lnbmF0dXJlKSAJCXx8CisJCSBmdy0+c2lnbmF0dXJlW2ldICE9IDB4MDEgICAJfHwKKwkJIC8vdGVzdCBmb3IgTGl0dGxlL0JpZyBFbmRpYW4gQmluYXJ5IGZsYWcKKwkJIGZ3LT5zaWduYXR1cmVbaSsxXSAhPSAoIC8qSENGX0JJR19FTkRJQU4gPyAnQicgOiAqLyAnTCcgKSApIHJjID0gREhGX0VSUl9JTkNPTVBfRlc7CisJZWxzZSB7CQkJCQkvL0xpdHRsZSBFbmRpYW4gQmluYXJ5IGZvcm1hdAorCQlmdy0+Y29kZXAgICAgPSAoQ0ZHX1BST0dfU1RSQ1QgRkFSICopKChQU0VVRE9fQ0hBUlApZnctPmNvZGVwICsgKGhjZl8zMilmdyApOworCQlmdy0+aWRlbnRpdHkgPSAoQ0ZHX0lERU5USVRZX1NUUkNUIEZBUiAqKSgoUFNFVURPX0NIQVJQKWZ3LT5pZGVudGl0eSArIChoY2ZfMzIpZncgKTsKKwkJZnctPmNvbXBhdCAgID0gKENGR19SQU5HRTIwX1NUUkNUIEZBUiAqKSgoUFNFVURPX0NIQVJQKWZ3LT5jb21wYXQgKyAoaGNmXzMyKWZ3ICk7CisJCWZvciAoIGkgPSAwOyBmdy0+cFtpXTsgaSsrICkgZnctPnBbaV0gPSAoKFBTRVVET19DSEFSUClmdy0+cFtpXSArIChoY2ZfMzIpZncgKTsKKwkJcCA9IGZ3LT5jb2RlcDsKKwkJd2hpbGUgKCBwLT5sZW4gKSB7CisJCQlwLT5ob3N0X2FkZHIgPSAoUFNFVURPX0NIQVJQKXAtPmhvc3RfYWRkciArIChoY2ZfMzIpZnc7CisJCQlwKys7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfSAgIC8vIGRoZl9kb3dubG9hZF9iaW5hcnkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5NT0RVTEUgCQlpbnQgZGhmX2Rvd25sb2FkX2Z3KCB2b2lkICppZmJwLCBtZW1pbWFnZSAqZncgKQorKi5QVVJQT1NFCQlEb3dubG9hZHMgYSBjb21wbGV0ZSAocHJpbWFyeSBvciB0ZXJ0aWFyeSkgZmlybXdhcmUgaW1hZ2UgdG8gdGhlIE5JQy4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKiAgIGZ3ICAgICAJCUYvVyBpbWFnZSB0byBiZSBkb3dubG9hZGVkCisqCisqLlJFVFVSTlMKKyoJSENGX1NVQ0NFU1MgICAgICAgIAktIGRvd25sb2FkIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisqCUhDRl9FUlJfTk9fTklDICAgICAJLSBubyBOSUMgcHJlc2VudAorKglESEZfRVJSX0lOQ09NUF9GVyAJLSBmaXJtd2FyZSBub3QgY29tcGF0aWJsZQorKgorKi5ERVNDUklQVElPTgorKiAtIGNoZWNrIHRoZSBzaWduYXR1cmUgb2YgdGhlIGltYWdlCisqIC0gZ2V0IHRoZSBjb21wYXRpYmlsaXR5IGluZm9ybWF0aW9uIGZyb20gdGhlIGNvbXBvbmVudHMgb24gdGhlIE5JQworKgkgIC0gUHJpbWFyeSBGaXJtd2FyZSBJZGVudGl0eQorKgkgIC0JTW9kZW0gLSBGaXJtd2FyZSBJL0YKKyoJICAtCUNvbnRyb2xsZXIgLSBGaXJtd2FyZSBJL0YKKyohISAtIGlmIG5lY2Vzc2FyeSAoIGkuZS4gSC1JKSBnZXQgdGhlIFBEQSBjb250ZW50cyBmcm9tIHRoZSBOSUMKKyogLSBjaGVjayB0aGUgY29tcGF0aWJpbGl0eSBvZiB0aGUgTUZJIGFuZCBDRkkgb2YgdGhlIE5JQyB3aXRoIHRoZSBGL1cgaW1hZ2UKKyoJTm90ZTogdGhlIFByaW1hcnkgRi9XIGNvbXBhdGliaWxpdHkgaXMgb25seSByZWxldmFudCBmb3IgdGhlICJydW5uaW5nIiBIQ0YgYW5kIGlzIGFscmVhZHkgdmVyaWZpZWQgaW4KKyoJaGNmX2Nvbm5lY3QKKyohISAtCWlmIG5lY2Vzc2FyeSAoIGkuZS4gSC1JKQorKiEhCSAgLQl2ZXJpZnkgdGhlIHN1bWNoZWNrIG9mIHRoZSBQREEKKyohIQkgIC0JcGx1ZyB0aGUgaW1hZ2UgKGJhc2VkIG9uIHRoZSBQREEgYW5kIHRoZSBkZWZhdWx0IHBsdWcgcmVjb3JkcykKKyogLSBsb29wIG92ZXIgYWxsIHRoZSBkb3dubG9hZCBMVFZzIGluIHRoZSBpbWFnZSB3aGljaCBjb25zaXN0cyBvZiBhIHNlcXVlbmNlIG9mCisqCSAgLSBDRkdfUFJPR19WT0xBVElMRS9DRkdfUFJPR19OT05fVk9MQVRJTEUKKyoJICAtIDEgb3IgbW9yZSBzZXF1ZW5jZXMgb2YgQ0ZHX1BST0dfQUREUiwgQ0ZHX1BST0dfREFUQSwuLi4uLENGR19QUk9HX0RBVEEKKyoJICAtCUNGR19QUk9HX1NUT1AKKyoKKyouRElBR1JBTQorKgorKi5OT1RJQ0UKKyogVGhlIG9sZCBjb21tZW50IHdhczoKKyoJLy8gRG93bmxvYWQgcHJpbWFyeSBmaXJtd2FyZSBpZiBuZWNlc3NhcnkgYW5kIGFsbG93ZWQuIFRoaXMgaXMgZG9uZSBzaWxlbnRseSAod2l0aG91dCB0ZWxsaW5nCisqCS8vIHRoZSB1c2VyKSBhbmQgb25seSBpZiB0aGUgZmlybXdhcmUgaW4gdGhlIGRvd25sb2FkIGltYWdlIGlzIG5ld2VyIHRoYW4gdGhlIGZpcm13YXJlIGluIHRoZQorKgkvLyBjYXJkLiAgSW4gTWFqb3IgdmVyc2lvbiA0IG9mIHRoZSBwcmltYXJ5IGZpcm13YXJlIGZ1bmN0aW9ucyBvZiBIZXJtZXMgYW5kIFNoYXJrIHdlcmUKKyoJLy8gY29tYmluZWQuIFByaW9yIHRvIHRoYXQgdHdvIHNlcGFyYXRlIHZlcnNpb25zIGV4aXN0ZWQuIFdlIG9ubHkgaGF2ZSB0byBkb3dubG9hZCBwcmltYXJ5CisqCS8vIGZpcm13YXJlIGlmIG1ham9yIHZlcnNpb24gb2YgcHJpbWFyeSBmaXJtd2FyZSBpbiB0aGUgTklDIDwgNC4KKyoJLy8JCWRvd25sb2FkID0gcHJpX2lkZW50aXR5LnZlcnNpb25fbWFqb3IgPCA0OworKgkvLwkJaWYgKCBkb3dubG9hZCApIHsKKyoJLy8JCQlyYyA9IGNoZWNrX2NvbXBfcHJpbWFyeSggZncgKTsKKyoJLy8JCX0KKyogSXQgaXMgbXkgdW5kZXJzdGFuZGluZyB0aGF0IFByaSBWYXJpYW50IDEgbXVzdCBiZSB1cGRhdGVkIGJ5IFByaSBWYXJpYW50IDIuIFRoZSB0ZXN0IG9uCisqIG1ham9yIHZlcnNpb24gPCA0IHNob3VsZCBhbW91bnQgdG8gdGhlIHNhbWUgcmVzdWx0IGJ1dCBiZSAicHJpbmNpcGFsbHkiIGxlc3MgY29ycmVjdAorKiBJbiBkZWxpYmVyYXRpb24gd2l0aCB0aGUgQXJjaGl0ZWN0dXJlIHRlYW0sIGl0IHdhcyBkZWNpZGVkIHRoYXQgdGhpcyB1cGdyYWRlIGZvciBvbGQgSC1JCisqIE5JQ3MsIGlzIGFuIGFzcGVjdCB3aGljaCBiZWxvbmdzIG9uIHRoZSBXU1UgbGV2ZWwgbm90IG9uIHRoZSBESEYgbGV2ZWwKKyoKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CitkaGZfZG93bmxvYWRfZncoIHZvaWQgKmlmYnAsIG1lbWltYWdlICpmdyApCit7CitpbnQgCQkJCXJjID0gSENGX1NVQ0NFU1M7CitMVFZfSU5GT19TVFJVQ1RfUFRSIHBwID0gbHR2X2luZm87CitDRkdfUFJPR19TVFJDVCAJCSpwID0gZnctPmNvZGVwOworTFRWUCAJCQkJbHR2cDsKK2ludAkJCQkJaTsKKworCU1NREFTU0VSVCggZncgIT0gTlVMTCwgMCApCisJLy92YWxpZGF0ZSB0aGUgaW1hZ2UKKwlmb3IgKCBpID0gMDsgaSA8IHNpemVvZihzaWduYXR1cmUpICYmIGZ3LT5zaWduYXR1cmVbaV0gPT0gc2lnbmF0dXJlW2ldOyBpKysgKSAvKk5PUCovOworCWlmICggaSAhPSBzaXplb2Yoc2lnbmF0dXJlKSAJCXx8CisJCSBmdy0+c2lnbmF0dXJlW2ldICE9IDB4MDEJCXx8CisJCSAvL2NoZWNrIGZvciBiaW5hcnkgaW1hZ2UKKwkJICggZnctPnNpZ25hdHVyZVtpKzFdICE9ICdDJyAmJiBmdy0+c2lnbmF0dXJlW2krMV0gIT0gKCAvKkhDRl9CSUdfRU5ESUFOID8gJ0InIDogKi8gJ0wnICkgKSApCisJCSByYyA9IERIRl9FUlJfSU5DT01QX0ZXOworCisvLwlSZXRyaWV2ZSBhbGwgaW5mb3JtYXRpb24gbmVlZGVkIGZvciBkb3dubG9hZCBmcm9tIHRoZSBOSUMKKwl3aGlsZSAoICggcmMgPT0gSENGX1NVQ0NFU1MgKSAmJiAoICggbHR2cCA9IHBwLT5sdHZwKSAhPSBOVUxMICkgKSB7CisJCWx0dnAtPmxlbiA9IHBwKystPmxlbjsJLy8gU2V0IGxlbiB0byBvcmlnaW5hbCBsZW4uIFRoaXMgbGVuIGlzIGNoYW5nZWQgdG8gcmVhbCBsZW4gYnkgR0VUX0lORk8oKQorCQlyYyA9IEdFVF9JTkZPKCBsdHZwICk7CisJCU1NREFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIHJjICkKKwkJTU1EQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgbHR2cC0+dHlwICkKKwkJTU1EQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgbHR2cC0+bGVuICkKKwl9CisJaWYgKCByYyA9PSBIQ0ZfU1VDQ0VTUyApIHJjID0gY2hlY2tfY29tcF9mdyggZncgKTsKKwlpZiAoIHJjID09IEhDRl9TVUNDRVNTICkgeworCQl3aGlsZSAoIHJjID09IEhDRl9TVUNDRVNTICYmIHAtPmxlbiApIHsKKwkJCXJjID0gUFVUX0lORk8oIHAgKTsKKwkJCXArKzsKKwkJfQorCX0KKwlNTURBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYyApCisJcmV0dXJuIHJjOworfSAgIC8vIGRoZl9kb3dubG9hZF9mdworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2RoZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvZGhmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA3MWYzNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2RoZi5oCkBAIC0wLDAgKzEsMjI2IEBACisKKy8vICAgdmltOnR3PTExMDp0cz00OgorI2lmbmRlZiBESEZfSAorI2RlZmluZSBESEZfSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRklMRSAgIDoJREhGLkgKKyoKKyogREFURQk6CSREYXRlOiAyMDA0LzA3LzE5IDA4OjE2OjE0ICQgICAkUmV2aXNpb246IDEuMiAkCisqIE9yaWdpbmFsCToJMjAwNC8wNS8xNyAwNzozMzoxMyAgICBSZXZpc2lvbjogMS4yNSAgICAgIFRhZzogaGNmN190MjAwNDA2MDJfMDEKKyogT3JpZ2luYWwJOgkyMDA0LzA1LzExIDA2OjAzOjE0ICAgIFJldmlzaW9uOiAxLjI0ICAgICAgVGFnOiBoY2Y3X3Q3XzIwMDQwNTEzXzAxCisqIE9yaWdpbmFsCToJMjAwNC8wNC8xNSAwOToyNDo0MiAgICBSZXZpc2lvbjogMS4yMiAgICAgIFRhZzogaGNmN190N18yMDA0MDQxNV8wMQorKiBPcmlnaW5hbAk6CTIwMDQvMDQvMDkgMTQ6MzU6NTIgICAgUmV2aXNpb246IDEuMjEgICAgICBUYWc6IHQ3XzIwMDQwNDEzXzAxCisqIE9yaWdpbmFsCToJMjAwNC8wNC8wMSAxNTozMjo1NSAgICBSZXZpc2lvbjogMS4xOCAgICAgIFRhZzogdDdfMjAwNDA0MDFfMDEKKyogT3JpZ2luYWwJOgkyMDA0LzAzLzEwIDE1OjM5OjI4ICAgIFJldmlzaW9uOiAxLjE1ICAgICAgVGFnOiB0MjAwNDAzMTBfMDEKKyogT3JpZ2luYWwJOgkyMDA0LzAzLzA0IDExOjAzOjM4ICAgIFJldmlzaW9uOiAxLjEzICAgICAgVGFnOiB0MjAwNDAzMDRfMDEKKyogT3JpZ2luYWwJOgkyMDA0LzAyLzI1IDE0OjE0OjM3ICAgIFJldmlzaW9uOiAxLjExICAgICAgVGFnOiB0MjAwNDAzMDJfMDMKKyogT3JpZ2luYWwJOgkyMDA0LzAyLzI0IDEzOjAwOjI4ICAgIFJldmlzaW9uOiAxLjEwICAgICAgVGFnOiB0MjAwNDAyMjRfMDEKKyogT3JpZ2luYWwJOgkyMDA0LzAyLzE5IDEwOjU3OjI4ICAgIFJldmlzaW9uOiAxLjggICAgICBUYWc6IHQyMDA0MDIxOV8wMQorKgorKiBBVVRIT1IgOglKb2huIE1lZXJ0ZW5zCisqCQkJTmljbyBWYWxzdGVyCisqCisqIFNQRUNJRklDQVRJT046IC4uLi4uLi4uLgorKgorKiBERVNDICAgOglzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgYW5kIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIHVuaXQgREhGLgorKgorKgkJCUN1c3RvbWl6YWJsZSB2aWEgSENGQ0ZHLkgsIHdoaWNoIGlzIGluY2x1ZGVkIGluZGlyZWN0bHkgdmlhIEhDRi5ICisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoKKyogU09GVFdBUkUgTElDRU5TRQorKgorKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyoKKyogQ09QWVJJR0hUIKkgMTk5NCAtIDE5OTUJYnkgQVQmVC4JCQkJQWxsIFJpZ2h0cyBSZXNlcnZlZAorKiBDT1BZUklHSFQgqSAxOTk5IC0gMjAwMCBieSBMdWNlbnQgVGVjaG5vbG9naWVzLglBbGwgUmlnaHRzIFJlc2VydmVkCisqIENPUFlSSUdIVCCpIDIwMDEgLSAyMDA0CWJ5IEFnZXJlIFN5c3RlbXMgSW5jLglBbGwgUmlnaHRzIFJlc2VydmVkCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyoKKyogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisqICAgIGRpc3RyaWJ1dGlvbi4KKyoKKyogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqCisqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogRGlzY2xhaW1lcgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisqIERBTUFHRS4KKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZmRlZiBfV0lOMzJfV0NFCisjaW5jbHVkZSA8d2luZGVmLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImhjZi5oIiAgIAkJIAkvLyBpbmNsdWRlcyBIQ0ZDRkcuSCB0b28KKworI2lmZGVmIERIRl9VSUwKKyNkZWZpbmUgR0VUX0lORk8oIHBwICkgIHVpbF9nZXRfaW5mbyggKExUVlApcHAgKQorI2RlZmluZSBQVVRfSU5GTyggcHAgKSAgdWlsX3B1dF9pbmZvKCAoTFRWUClwcCApCisjZWxzZQorI2RlZmluZSBHRVRfSU5GTyggcHAgKSAgaGNmX2dldF9pbmZvKCBpZmJwLCAoTFRWUClwcCApCisjZGVmaW5lIFBVVF9JTkZPKCBwcCApICBoY2ZfcHV0X2luZm8oIGlmYnAsIChMVFZQKXBwICkKKyNlbmRpZgorCisKKy8qLS0tLSBEZWZpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgQ09ERU1BU0sJCQkJMHgwMDAwRkZGRkwgICAgCS8vIENvZGVtYXNrIGZvciBwbHVnIHJlY29yZHMKKworLyotLS0tIEVycm9yIG51bWJlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIERIRl9FUlJfSU5DT01QX0ZXCQkweDQwCS8vSW1hZ2Ugbm90IGNvbXBhdGlibGUgd2l0aCBOSUMKKworLyotLS0tIFR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLy8qIG5lZWRlZCBieSBkaGZfd3JhcC5jCisvLwordHlwZWRlZiBzdHJ1Y3QgeworCUxUVlAgCWx0dnA7CisJaGNmXzE2CWxlbjsKK30gTFRWX0lORk9fU1RSVUNUICwgKkxUVl9JTkZPX1NUUlVDVF9QVFI7CisKKworLyoKKyAqIFR5cGU6IAlwbHVncmVjb3JkCisgKgorICogQWJzdHJhY3Q6IFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudHMgYSBQbHVnIERhdGEgUmVjb3JkLgorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBvdmVybGF5IHRoZSBwbHVnIHJlY29yZHMgaW4gdGhlIGZpcm13YXJlIG1lbW9yeSBpbWFnZS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJaGNmXzMyCWNvZGU7ICAgICAgCS8vIENvZGUgdG8gcGx1ZworCWhjZl8zMglhZGRyOyAgICAgIAkvLyBBZGRyZXNzIHdpdGhpbiB0aGUgbWVtb3J5IGltYWdlIHRvIHBsdWcgaXQgaW4KKwloY2ZfMzIJbGVuOyAgICAgICAJLy8gVGhlICMgb2YgYnl0ZXMgd2hpY2ggYXJlIGF2YWlsYWJsZSB0byBzdG9yZSBpdAorfSBwbHVncmVjb3JkOworCisvKgorICogVHlwZTogCXN0cmluZ3JlY29yZAorICoKKyAqIEFic3RyYWN0OiBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnRzIGEgRmlybXdhcmUgZGVidWcvYXNzZXJ0IHN0cmluZworICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBnZXQgYXNzZXJ0IGFuZCBkZWJ1ZyBvdXRwdXRzIGluIHRoZSBkcml2ZXIgYW5kL29yIHV0aWxpdHkgdG8gYmUKKyAqIGFibGUgdG8gZ2V0IG1vcmUgdmlzYWJpbGl0eSBvZiB0aGUgRlcuCisgKi8KKworI2RlZmluZSBNQVhfREVCVUdTVFJJTkdTIAkJMTAyNAorI2RlZmluZSBNQVhfREVCVUdTVFJJTkdfTEVOIAkgIDgyCisKK3R5cGVkZWYgc3RydWN0IHsKKwloY2ZfMzIJaWQ7CisJY2hhciAJc3RyW01BWF9ERUJVR1NUUklOR19MRU5dOworfSBzdHJpbmdyZWNvcmQ7CisKKy8qCisgKiBUeXBlOiAJZXhwb3J0cmVjb3JkCisgKgorICogQWJzdHJhY3Q6IFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudHMgYSBGaXJtd2FyZSBleHBvcnQgb2YgYSB2YXJpYWJsZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBnZXQgdGhlIGFkZHJlc3MgYW5kIG5hbWUgb2YgYSBGVyB2YXJpYWJsZS4KKyAqLworCisjZGVmaW5lIE1BWF9ERUJVR0VYUE9SVFMgCQkyMDQ4CisjZGVmaW5lIE1BWF9ERUJVR0VYUE9SVF9MRU4gCSAgMTIKKwordHlwZWRlZiBzdHJ1Y3QgeworCWhjZl8zMglpZDsKKwljaGFyIAlzdHJbTUFYX0RFQlVHRVhQT1JUX0xFTl07Cit9IGV4cG9ydHJlY29yZDsKKworLy8gT2Zmc2V0cyBpbiBtZW1pbWFnZSBhcnJheSBwW10KKyNkZWZpbmUgRldTVFJJTkdTX0ZVTkNUSU9OCQkwCisjZGVmaW5lIEZXRVhQT1JUU19GVU5DVElPTgkJMQorCisvKgorICogVHlwZTogbWVtaW1hZ2UKKyAqCisgKiBBYnN0cmFjdDogVGhlICJyb290IiBkZXNjcmlwdGlvbiBvZiBhIGNvbXBsZXRlIG1lbW9yeSBpbWFnZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyB0eXBlIHJlcHJlc2VudHMgYW4gZW50aXJlIG1lbW9yeSBpbWFnZS4gVGhlIGltYWdlIGlzIGJ1aWx0IHVwIG9mIHNldmVyYWwKKyAqIHNlZ21lbnRzLiBUaGVzZSBzZWdtZW50cyBuZWVkIG5vdCBiZSBjb250aWd1b3VzIGFyZWFzIGluIG1lbW9yeSwgaW4gb3RoZXIgd29yZHMKKyAqIHRoZSBpbWFnZSBtYXkgY29udGFpbiAnaG9sZXMnLgorICoKKyAqIFRoZSAnY29kZXAnIGZpZWxkIHBvaW50cyB0byBhbiBhcnJheSBvZiBzZWdtZW50X2Rlc2NyaXB0b3Igc3RydWN0dXJlcy4KKyAqIFRoZSBlbmQgb2YgdGhlIGFycmF5IGlzIGluZGljYXRlZCBieSBhIHNlZ21lbnRfZGVzY3JpcHRvciBvZiB3aGljaCBhbGwgZmllbGRzIGFyZSB6ZXJvLgorICogVGhlICdleGVjdXRpb24nIGZpZWxkIGlzIGEgMzItYml0IGFkZHJlc3MgcmVwcmVzZW50aW5nIHRoZSBleGVjdXRpb24gYWRkcmVzcworICoJb2YgdGhlIGZpcm13YXJlIHdpdGhpbiB0aGUgbWVtb3J5IGltYWdlLiBUaGlzIGFkZHJlc3MgaXMgemVybyBpbiBjYXNlIG9mIG5vbi12b2xhdGlsZQorICoJbWVtb3J5IGRvd25sb2FkLgorICogVGhlICdjb21wYXQnIGZpZWxkIHBvaW50cyB0byBhbiBhcnJheSBvZiBUT0RPCisgKiAJVGhlIGVuZCBvZiB0aGUgYXJyYXkgaXMgaW5kaWNhdGVkIGJ5IGEgcGx1ZyByZWNvcmQgb2Ygd2hpY2ggYWxsIGZpZWxkcyBhcmUgemVyby4KKyAqIFRoZSAnaWRlbnRpdHknIGZpZWxkIHBvaW50cyB0byBhbiBhcnJheSBvZiBUT0RPCisgKiAJVGhlIGVuZCBvZiB0aGUgYXJyYXkgaXMgaW5kaWNhdGVkIGJ5IGEgcGx1ZyByZWNvcmQgb2Ygd2hpY2ggYWxsIGZpZWxkcyBhcmUgemVyby4KKyAqIFRoZSBIZXJtZXMtSSBzcGVjaWZpYyAncGRhcGx1ZycgZmllbGQgcG9pbnRzIHRvIGFuIGFycmF5IG9mIFByb2R1Y3Rpb24gRGF0YSBQbHVnIHJlY29yZCBzdHJ1Y3R1cmVzLgorICogCVRoZSBlbmQgb2YgdGhlIGFycmF5IGlzIGluZGljYXRlZCBieSBhIHBsdWcgcmVjb3JkIG9mIHdoaWNoIGFsbCBmaWVsZHMgYXJlIHplcm8uCisgKiBUaGUgSGVybWVzLUkgc3BlY2lmaWMgJ3ByaXBsdWcnIGZpZWxkIHBvaW50cyB0byBhbiBhcnJheSBvZiBQcmltYXJ5IEluZm9ybWF0aW9uIFBsdWcgcmVjb3JkIHN0cnVjdHVyZXMuCisgKiAJVGhlIGVuZCBvZiB0aGUgYXJyYXkgaXMgaW5kaWNhdGVkIGJ5IGEgcGx1ZyByZWNvcmQgb2Ygd2hpY2ggYWxsIGZpZWxkcyBhcmUgemVyby4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWNoYXIJCQkJCXNpZ25hdHVyZVsxNCsxKzFdOwkvLyBzaWduYXR1cmUgKHNlZSBESEYuQykgKyBDL0xFLUJpbi9CRS1CaW4tZmxhZyArIGZvcm1hdCB2ZXJzaW9uCisJQ0ZHX1BST0dfU1RSQ1QgRkFSCQkqY29kZXA7CQkJCS8vCisJaGNmXzMyICAgICAgICAgICAJIAlleGVjdXRpb247ICAgIAkJLy8gRXhlY3V0aW9uIGFkZHJlc3Mgb2YgdGhlIGZpcm13YXJlCisJdm9pZCBGQVIgCQkgICAgICAJKnBsYWNlX2hvbGRlcl8xOworCXZvaWQgRkFSICAJCSAgICAgCSpwbGFjZV9ob2xkZXJfMjsKKwlDRkdfUkFOR0UyMF9TVFJDVCBGQVIgIAkqY29tcGF0OyAgICAgIAkJLy8gUG9pbnRlciB0byB0aGUgY29tcGF0aWJpbGl0eSBpbmZvIHJlY29yZHMKKwlDRkdfSURFTlRJVFlfU1RSQ1QgRkFSIAkqaWRlbnRpdHk7ICAgIAkJLy8gUG9pbnRlciB0byB0aGUgaWRlbnRpdHkgaW5mbyByZWNvcmRzCisJdm9pZCBGQVIJCQkJKnBbMl07CQkJCS8qIChVcCB0byA5KSBwb2ludGVycyBmb3IgKGZ1dHVyZSkgZXhwYW5zaW9uCisJCQkJCQkJCQkJCQkgKiBjdXJyZW50bHkgaW4gdXNlOgorCQkJCQkJCQkJCQkJICogIC0gRi9XIHByaW50ZiBpbmZvcm1hdGlvbgorCQkJCQkJCQkJCQkJICovCit9IG1lbWltYWdlOworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIERIRiBmdW5jdGlvbiBwcm90b3R5cGVzCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitFWFRFUk5fQyBpbnQgZGhmX2Rvd25sb2FkX2Z3KCB2b2lkICppZmJwLCBtZW1pbWFnZSAqZncgKTsJLy8JaWZicCwgaWdub3JlZCB3aGVuIHVzaW5nIHRoZSBVSUwKK0VYVEVSTl9DIGludCBkaGZfZG93bmxvYWRfYmluYXJ5KCBtZW1pbWFnZSAqZncgKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb25zIHRvIGJlIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIG9mIHRoZSBESEYgbW9kdWxlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLy8gZGVmaW5lZCBpbiBESEYuQzsgc2VlIHRoZXJlIGZvciBjb21tZW50cworRVhURVJOX0MgaGNmXzE2ICpmaW5kX3JlY29yZF9pbl9wZGEoIGhjZl8xNiAqcGRhcCwgaGNmXzE2IGNvZGUgKTsKKworI2VuZGlmICAvLyBESEZfSAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9kaGZjZmcuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2RoZmNmZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYzI2YzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9kaGZjZmcuaApAQCAtMCwwICsxLDE1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFnZXJlIFN5c3RlbXMgSW5jLgorICogV2lyZWxlc3MgZGV2aWNlIGRyaXZlciBmb3IgTGludXggKHdsYWdzNDkpLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KKyAqCisgKiBJbml0aWFsbHkgZGV2ZWxvcGVkIGJ5IFRyaXBsZVBvaW50LCBJbmMuCisgKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIFRoaXMgZmlsZSBjb250YWlucyBESEYgY29uZmlndXJhdGlvbiBpbmZvLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU09GVFdBUkUgTElDRU5TRQorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisgKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIERpc2NsYWltZXIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIJNBUyBJU5QgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisgKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgREhGQ0ZHX0gKKyNkZWZpbmUgREhGQ0ZHX0gKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZpbGUgREhGQ0ZHLkgKKyAqCisgKiBDb250ZW50czogI2RlZmluZXMgZm9yIHRoZSBESEYgbW9kdWxlCisgKgorICogQ29tbWVudHM6CisgKiAgIFNvbWUgY29tYmluYXRpb25zIG9mIHRoZSAjZGVmaW5lcyBpbiB0aGlzIGZpbGUgYXJlIGlsbGVnYWwgKGFzIG5vdGVkIGJlbG93KS4KKyAqICAgSWYgYW4gaWxsZWdhbCBjb21iaW5hdGlvbnMgb2YgI2RlZmluZXMgaXMgc3BlY2lmaWVkIGEgY29tcGlsZSBlcnJvciBpcworICogICBnZW5lcmF0ZWQuIFNlZSBkb2N1bWVudCBESEZVRy5ET0MgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKgorICogQXV0aG9yOiBKb2huIE1lZXJ0ZW5zCisgKiBEYXRlOiAgIDExLTAxLTIwMDAKKyAqCisgKiBDaGFuZ2UgaGlzdG9yeToKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvLyBEZWZpbmUgREhGX1dDSSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIFdDSSB0byBhY2Nlc3MgdGhlIE9SaU5PQ08gY2FyZC4KKy8vIERlZmluZSBESEZfVUlMIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgVUlMIHRvIGFjY2VzcyB0aGUgT1JpTk9DTyBjYXJkLgorLy8gWW91IG11c3QgZGVmaW5lIGVpdGhlciBESEZfV0NJIG9yIERIRl9VSUwuIElmIG5laXRoZXIgb2YgdGhlIHR3byBpcyBkZWZpbmVkCisvLyBvciBib3RoIGEgY29tcGlsZSBlcnJvciBpcyBnZW5lcmF0ZWQuCisjZGVmaW5lIERIRl9XQ0kKKy8vISEhI2RlZmluZSBESEZfVUlMCisKKy8vIERlZmluZSBESEZfQklHX0VORElBTiBpZiB5b3UgYXJlIHdvcmtpbmcgb24gYSBiaWcgZW5kaWFuIHBsYXRmb3JtLgorLy8gRGVmaW5lIERIRl9MSVRUTEVfRU5ESUFOIGlmIHlvdSBhcmUgd29ya2luZyBvbiBhIGxpdHRsZSBlbmRpYW4gcGxhdGZvcm0uCisvLyBZb3UgbXVzdCBkZWZpbmUgZWl0aGVyIERIRl9CSUdfRU5ESUFOIG9yIERIRl9MSVRUTEVfRU5ESUFOLiBJZiBuZWl0aGVyIG9mCisvLyB0aGUgdHdvIGlzIGRlZmluZWQgb3IgYm90aCBhIGNvbXBpbGUgZXJyb3IgaXMgZ2VuZXJhdGVkLgorI2lmZGVmIFVTRV9CSUdfRU5ESUFOCisjZGVmaW5lIERIRl9CSUdfRU5ESUFOCisjZWxzZQorI2RlZmluZSBESEZfTElUVExFX0VORElBTgorI2VuZGlmICAvKiBVU0VfQklHX0VORElBTiAqLworCisvLyBEZWZpbmUgREhGX1dJTiBpZiB5b3UgYXJlIHdvcmtpbmcgb24gV2luZG93cyBwbGF0Zm9ybS4KKy8vIERlZmluZSBESEZfRE9TIGlmIHlvdSBhcmUgd29ya2luZyBvbiBET1MuCisvLyBZb3UgbXVzdCBkZWZpbmUgZWl0aGVyIERIRl9XSU4gb3IgREhGX0RPUy4gSWYgbmVpdGhlciBvZgorLy8gdGhlIHR3byBpcyBkZWZpbmVkIG9yIGJvdGggYSBjb21waWxlIGVycm9yIGlzIGdlbmVyYXRlZC4KKy8vISEhI2RlZmluZSBESEZfV0lOCisvLyEhISNkZWZpbmUgREhGX0RPUworCisvLyBEZWZpbmUgaWYgeW91IHdhbnQgdGhlIERIRiB0byB1c2Vycy4gTm90IGRlZmluaW5nIERIRl9HRVRfUkVTX01TRworLy8gbGVhZHMgdG8gYSBkZWNyZWFzZSBpbiBjb2RlIHNpemUgYXMgbWVzc2FnZSBzdHJpbmdzIGFyZSBub3QgaW5jbHVkZWQuCisvLyEhISNkZWZpbmUgREhGX0dFVF9SRVNfTVNHCisKKy8vIExpbnV4IGRyaXZlciBzcGVjaWZpYworLy8gUHJldmVudCBpbmNsdXNpb24gb2Ygc3RkbGliLmggYW5kIHN0cmluZy5oCisjZGVmaW5lIF9JTkNfU1RETElCCisjZGVmaW5lIF9JTkNfU1RSSU5HCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlZmluZSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIERTRiAjZGVmaW5lcyBpZiB5b3Ugd2FudCB0byBpbXBsZW1lbnQKKy8vIHRoZSByZWxhdGVkIERTRi1mdW5jdGlvbi4gRnVuY3Rpb24gZHNmX2NhbGxiYWNrIG11c3QgYWxsd2F5cyBiZSBpbXBsZW1lbnRlZC4KKy8vIFNlZSBmaWxlIERIRi5IIGZvciBwcm90b3R5cGVzIG9mIHRoZSBmdW5jdGlvbnMuCisKKy8vIERlZmluZSBEU0ZfQUxMT0MgaWYgeW91IHdhbnQgdG8gbWFuYWdlIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBkZS1hbGxvY2F0aW9uCisvLyBmb3IgdGhlIERIRi4gSWYgRFNGX0FMTE9DIGlzIGRlZmluZWQgeW91IG11c3QgaW1wbGVtZW50IGRzZl9hbGxvYyBhbmQgZHNmX2ZyZWUuCisvLyEhISNkZWZpbmUgRFNGX0FMTE9DCisKKy8vIERlZmluZSBEU0ZfQ09ORklSTSBpZiB5b3Ugd2FudCB0aGUgREhGIHRvIGFzayB0aGUgdXNlciBmb3IgY29uZmlybWF0aW9uIGluIGEKKy8vIG51bWJlciBvZiBzaXR1YXRpb25zLiBJZiBEU0ZfQ09ORklSTSBpcyBkZWZpbmVkIHlvdSBtdXN0IGltcGxlbWVudCBkc2ZfY29uZmlybS4KKy8vIE5vdCBkZWZpbmluZyBEU0ZfQ09ORklSTSBsZWFkcyB0byBhIGRlY3JlYXNlIGluIGNvZGUgc2l6ZSBhcyBjb25maXJtYXRpb24KKy8vIHN0cmluZ3MgYXJlIG5vdCBpbmNsdWRlZC4KKy8vISEhI2RlZmluZSBEU0ZfQ09ORklSTQorCisvLyBEZWZpbmUgRFNGX0RFQlVHX01FU1NBR0UgaWYgeW91IHdhbnQgZGVidWcgbWVzc2FnZXMgYWRkZWQgdG8geW91ciBvdXRwdXQuCisvLyBJZiB5b3UgZGVmaW5lIERTRl9ERUJVR19NRVNTQUdFIHRoZW4geW91IG11c3QgaW1wbGVtZW50IGZ1bmN0aW9uCisvLyBkc2ZfZGVidWdfbWVzc2FnZS4KKy8vI2RlZmluZSBEU0ZfREVCVUdfTUVTU0FHRQorCisvLyBEZWZpbmUgRFNGX0FTU0VSVCBpZiB5b3Ugd2FudCBhc3NlcnRzIHRvIGJlIGFjdGl2YXRlZC4KKy8vIElmIHlvdSBkZWZpbmUgRFNGX0FTU0VSVCB0aGVuIHlvdSBtdXN0IGltcGxlbWVudCBmdW5jdGlvbiBkc2ZfYXNzZXJ0LgorLy8jZGVmaW5lIERCRyAxCisvLyNkZWZpbmUgRFNGX0FTU0VSVAorCisvLyBEZWZpbmUgRFNGX0RCV0lOIGlmIHlvdSB3YW50IGFzc2VydHMgYW5kIGRlYnVnIG1lc3NhZ2VzIHRvIGJlIHNlbmQgdG8gYSBkZWJ1ZworLy8gd2luZG93IGxpa2UgU09GVElDRSBvciBEZWJ1Z1ZpZXcgZnJvbSBTeXNJbnRlcm5hbHMuCisvLyEhISNkZWZpbmUgRFNGX0RCV0lOCisvLyEhISBOb3QgaW1wbGVtZW50ZWQgeWV0IQorCisvLyBEZWZpbmUgRFNGX1ZPTEFUSUxFX09OTFkgaWYgeW91IG9ubHkgd2FudHMgdG8gdXNlIHZhbGF0aWxlIGZ1bmN0aW9ucworLy8gVGhpcyBpcyBhIHR5cGljYWwgc2V0dGluZyBmb3IgYSBBUCBhbmQgYSBkcml2ZXIuCisjZGVmaW5lIERTRl9WT0xBVElMRV9PTkxZCisKKy8vIERlZmluZSBEU0ZfSEVSTUVTSUkgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBESEYgZm9yIHRoZSBIZXJtZXMtSUkKKyNpZmRlZiBIRVJNRVMyCisjZGVmaW5lIERTRl9IRVJNRVNJSQorI2Vsc2UKKyN1bmRlZiBEU0ZfSEVSTUVTSUkKKyNlbmRpZiAvLyBIRVJNRVMyCisKKy8vIERlZmluZSBEU0ZfQklOQVJZX0ZJTEUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBESEYgaW4gY29tYmluYXRpb24gd2l0aAorLy8gcmVhZGluZyB0aGUgRmlybXdhcmUgZnJvbSBhIHNlcGFyYXRlIGJpbmFyeSBmaWxlLgorLy8hISEjZGVmaW5lIERTRl9CSU5BUllfRklMRQorCisjZW5kaWYgLy8gREhGQ0ZHX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2hjZi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvaGNmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUzOWY1MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2hjZi5jCkBAIC0wLDAgKzEsNDg4MSBAQAorLy8gICB2aW06dHc9MTEwOnRzPTQ6CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZJTEUgICA6CUhDRi5DCisqCisqIERBVEUgICAgOgkkRGF0ZTogMjAwNC8wOC8wNSAxMTo0NzoxMCAkICAgJFJldmlzaW9uOiAxLjEwICQKKyogT3JpZ2luYWw6CTIwMDQvMDYvMDIgMTA6MjI6MjIgICAgUmV2aXNpb246IDEuODUgICAgICBUYWc6IGhjZjdfdDIwMDQwNjAyXzAxCisqIE9yaWdpbmFsOgkyMDA0LzA0LzE1IDA5OjI0OjQxICAgIFJldmlzaW9uOiAxLjYzICAgICAgVGFnOiBoY2Y3X3Q3XzIwMDQwNDE1XzAxCisqIE9yaWdpbmFsOgkyMDA0LzA0LzEzIDE0OjIyOjQ0ICAgIFJldmlzaW9uOiAxLjYyICAgICAgVGFnOiB0N18yMDA0MDQxM18wMQorKiBPcmlnaW5hbDoJMjAwNC8wNC8wMSAxNTozMjo1NSAgICBSZXZpc2lvbjogMS41OSAgICAgIFRhZzogdDdfMjAwNDA0MDFfMDEKKyogT3JpZ2luYWw6CTIwMDQvMDMvMTAgMTU6Mzk6MjcgICAgUmV2aXNpb246IDEuNTUgICAgICBUYWc6IHQyMDA0MDMxMF8wMQorKiBPcmlnaW5hbDoJMjAwNC8wMy8wNCAxMTowMzozNyAgICBSZXZpc2lvbjogMS41MyAgICAgIFRhZzogdDIwMDQwMzA0XzAxCisqIE9yaWdpbmFsOgkyMDA0LzAzLzAyIDE0OjUxOjIxICAgIFJldmlzaW9uOiAxLjUwICAgICAgVGFnOiB0MjAwNDAzMDJfMDMKKyogT3JpZ2luYWw6CTIwMDQvMDIvMjQgMTM6MDA6MjcgICAgUmV2aXNpb246IDEuNDMgICAgICBUYWc6IHQyMDA0MDIyNF8wMQorKiBPcmlnaW5hbDoJMjAwNC8wMi8xOSAxMDo1NzoyNSAgICBSZXZpc2lvbjogMS4zOSAgICAgIFRhZzogdDIwMDQwMjE5XzAxCisqCisqIEFVVEhPUiA6CU5pY28gVmFsc3RlcgorKgorKiBTUEVDSUZJQ0FUSU9OOiAuLi4uLi4uLgorKgorKiBERVNDUklQVElPTiA6CUhDRiBSb3V0aW5lcyBmb3IgSGVybWVzLUlJIChjYWxsYWJsZSB2aWEgdGhlIFdpcmVsZXNzIENvbm5lY3Rpb24gSS9GIG9yIFdDSSkKKyoJCQkJTG9jYWwgU3VwcG9ydCBSb3V0aW5lcyBmb3IgYWJvdmUgcHJvY2VkdXJlcworKgorKgkJCUN1c3RvbWl6YWJsZSB2aWEgSENGQ0ZHLkgsIHdoaWNoIGlzIGluY2x1ZGVkIGJ5IEhDRi5ICisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCisqIFNPRlRXQVJFIExJQ0VOU0UKKyoKKyogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisqCisqIENPUFlSSUdIVCCpIDE5OTQgLSAxOTk1CWJ5IEFUJlQuCQkJCUFsbCBSaWdodHMgUmVzZXJ2ZWQKKyogQ09QWVJJR0hUIKkgMTk5NiAtIDIwMDAgYnkgTHVjZW50IFRlY2hub2xvZ2llcy4JQWxsIFJpZ2h0cyBSZXNlcnZlZAorKiBDT1BZUklHSFQgqSAyMDAxIC0gMjAwNAlieSBBZ2VyZSBTeXN0ZW1zIEluYy4JQWxsIFJpZ2h0cyBSZXNlcnZlZAorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisqCisqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorKiAgICBkaXN0cmlidXRpb24uCisqCisqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorKgorKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisqCisqIERpc2NsYWltZXIKKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorKiBEQU1BR0UuCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEltcGxlbWVudGF0aW9uIE5vdGVzCisqKgorKiAtCWEgbGVhZGluZyBtYXJrZXIgb2YgLy8hIGlzIHVzZWQuIFRoZSBwdXJwb3NlIG9mIHN1Y2ggYSBzZXF1ZW5jZSBpcyB0byBoZWxwIHRvIHVuZGVyc3RhbmQgdGhlIGZsb3cKKyoJQW4gZXhhbXBsZSBpczoJLy8hcmMgPSBIQ0ZfU1VDQ0VTUzsKKyoJaWYgdGhpcyBpcyBzdXBlcmZsdW91cyBiZWNhdXNlIHJjIGlzIGFscmVhZHkgZ3VhcmFudGVlZCB0byBiZSAwIGJ1dCBpdCBzaG93cyB0byB0aGUgKG1haW50ZW5hbmNlKQorKglwcm9ncmFtbWVyIGl0IGlzIGFuIGludGVudGlvbmFsIG9taXNzaW9uIGF0IHRoZSBwbGFjZSB3aGVyZSBzb21lb25lIGNvdWxkIGNvbnNpZGVyIGl0IG1vc3QgYXBwcm9wcmlhdGUgYXQKKyoJZmlyc3QgZ2xhbmNlCisqIC0JdXNpbmcgbmVhciBwb2ludGVycyBpbiBhIG1vZGVsIHdoZXJlIHNzIT1kcyBpcyBhbiBpbnZpdGF0aW9uIGZvciBkaXNhc3Rlciwgc28gYmUgYXdhcmUgb2YgaG93IHlvdSBzcGVjaWZ5CisqCXlvdXIgbW9kZWwgYW5kIGhvdyB5b3UgZGVmaW5lIHZhcmlhYmxlcyB3aGljaCBhcmUgdXNlZCBhdCBpbnRlcnJ1cHQgdGltZQorKiAtCXJlbWVtYmVyIHRoYXQgc2lnbiBleHRlbnNpb24gb24gMzIgYml0IHBsYXRmb3JtcyBtYXkgY2F1c2UgcHJvYmxlbXMgdW5sZXNzIGNvZGUgaXMgY2FyZWZ1bGx5IGNvbnN0cnVjdGVkLAorKgllLmcuIHVzZSAiKGhjZl8xNil+Zm9vIiByYXRoZXIgdGhhbiAifmZvbyIKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImhjZi5oIgkJCQkvLyBIQ0YgYW5kIE1TRiBjb21tb24gaW5jbHVkZSBmaWxlCisjaW5jbHVkZSAiaGNmZGVmLmgiCQkJCS8vIEhDRiBzcGVjaWZpYyBpbmNsdWRlIGZpbGUKKyNpbmNsdWRlICJtbWQuaCIJCQkJLy8gTW9yZU1vZHVsYXJEcml2ZXIgY29tbW9uIGluY2x1ZGUgZmlsZQorCisjaWYgISBkZWZpbmVkIG9mZnNldG9mCisjZGVmaW5lIG9mZnNldG9mKHMsbSkgICAoKHVuc2lnbmVkIGludCkmKCgocyAqKTApLT5tKSkKKyNlbmRpZiAvLyBvZmZzZXRvZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFBST1RPVFlQRVMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hDRl9TVEFUSUMgaW50CQkJY21kX2V4ZSggSUZCUCBpZmJwLCBoY2ZfMTYgY21kX2NvZGUsIGhjZl8xNiBwYXJfMCApOworSENGX1NUQVRJQyBpbnQJCQlpbml0KCBJRkJQIGlmYnAgKTsKK0hDRl9TVEFUSUMgaW50CQkJcHV0X2luZm8oIElGQlAgaWZicCwgTFRWUCBsdHZwICk7CisjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9NQgorSENGX1NUQVRJQyBpbnQJCQlwdXRfaW5mb19tYiggSUZCUCBpZmJwLCBDRkdfTUJfSU5GT19TVFJDVCBGQVIgKiBsdHZwICk7CisjZW5kaWYgLy8gSENGX0VYVF9NQgorI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKK0hDRl9TVEFUSUMgdm9pZAkJCWNhbGNfbWljKCBoY2ZfMzIqIHAsIGhjZl8zMiBNICk7Cit2b2lkIAkJCQkJY2FsY19taWNfcnhfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBwLCBpbnQgbGVuICk7Cit2b2lkIAkJCQkJY2FsY19taWNfdHhfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBwLCBpbnQgbGVuICk7CitIQ0ZfU1RBVElDIGludAkJCWNoZWNrX21pYyggSUZCUCBpZmJwICk7CisjZW5kaWYgLy8gSENGX1RZUEVfV1BBCisKK0hDRl9TVEFUSUMgdm9pZAkJCWNhbGlicmF0ZSggSUZCUCBpZmJwICk7CitIQ0ZfU1RBVElDIGludAkJCWNtZF9jbXBsKCBJRkJQIGlmYnAgKTsKK0hDRl9TVEFUSUMgaGNmXzE2CQlnZXRfZmlkKCBJRkJQIGlmYnAgKTsKK0hDRl9TVEFUSUMgdm9pZAkJCWlzcl9pbmZvKCBJRkJQIGlmYnAgKTsKKyNpZiBIQ0ZfRE1BCitIQ0ZfU1RBVElDIERFU0NfU1RSQ1QqCWdldF9mcmFtZV9sc3QoSUZCUCBpZmJwLCBpbnQgdHhfcnhfZmxhZyk7CisjZW5kaWYgLy8gSENGX0RNQQorSENGX1NUQVRJQyB2b2lkCQkJZ2V0X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgYnVmcCwgaW50IGxlbiBCRV9QQVIoIGludCB3b3JkX2xlbiApICk7CS8vY2hhciosIGJ5dGUgY291bnQgKHVzdWFsbHkgZXZlbikKKyNpZiBIQ0ZfRE1BCitIQ0ZfU1RBVElDIHZvaWQJCQlwdXRfZnJhbWVfbHN0KCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCBpbnQgdHhfcnhfZmxhZyApOworI2VuZGlmIC8vIEhDRl9ETUEKK0hDRl9TVEFUSUMgdm9pZAkJCXB1dF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIGJ1ZnAsIGludCBsZW4gQkVfUEFSKCBpbnQgd29yZF9sZW4gKSApOworSENGX1NUQVRJQyB2b2lkCQkJcHV0X2ZyYWdfZmluYWxpemUoIElGQlAgaWZicCApOworSENGX1NUQVRJQyBpbnQJCQlzZXR1cF9iYXAoIElGQlAgaWZicCwgaGNmXzE2IGZpZCwgaW50IG9mZnNldCwgaW50IHR5cGUgKTsKKyNpZiAoSENGX0FTU0VSVCkgJiBIQ0ZfQVNTRVJUX1BSSU5URgorc3RhdGljIGludCBmd19wcmludGYoSUZCUCBpZmJwLCBDRkdfRldfUFJJTlRGX1NUUkNUIEZBUiAqbHR2cCk7CisjZW5kaWYgLy8gSENGX0FTU0VSVF9QUklOVEYKKworSENGX1NUQVRJQyBpbnQJCQlkb3dubG9hZCggSUZCUCBpZmJwLCBDRkdfUFJPR19TVFJDVCBGQVIgKmx0dnAgKTsKKyNpZiAoSENGX0VOQ0FQKSAmIEhDRl9FTkMKK0hDRl9TVEFUSUMgaGNmXzgJCWhjZl9lbmNhcCggd2NpX2J1ZnAgdHlwZSApOworI2VuZGlmIC8vIEhDRl9FTkNBUAorSENGX1NUQVRJQyBoY2ZfOAkJbnVsbF9hZGRyWzRdID0geyAwLCAwLCAwLCAwIH07CisjaWYgISBkZWZpbmVkIElOX1BPUlRfV09SRAkJCS8vcmVwbGFjZSBJL08gTWFjcm9zIHdpdGggbG9nZ2luZyBmYWNpbGl0eQorZXh0ZXJuIEZJTEUgKmxvZ19maWxlOworCisjZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQkJCWluX3BvcnRfd29yZCggKGhjZl9pbykocG9ydCkgKQorCitzdGF0aWMgaGNmXzE2IGluX3BvcnRfd29yZCggaGNmX2lvIHBvcnQgKSB7CitoY2ZfMTYgaSA9IChoY2ZfMTYpX2lucHcoIHBvcnQgKTsKKwlpZiAoIGxvZ19maWxlICkgeworCQlmcHJpbnRmKCBsb2dfZmlsZSwgIlxuUiAlMi4yeCAlNC40eCIsIChwb3J0KSYweEZGLCBpKTsKKwl9CisJcmV0dXJuIGk7Cit9IC8vIGluX3BvcnRfd29yZAorCisjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpCW91dF9wb3J0X3dvcmQoIChoY2ZfaW8pKHBvcnQpLCAoaGNmXzE2KSh2YWx1ZSkgKQorCitzdGF0aWMgdm9pZCBvdXRfcG9ydF93b3JkKCBoY2ZfaW8gcG9ydCwgaGNmXzE2IHZhbHVlICkgeworCV9vdXRwdyggcG9ydCwgdmFsdWUgKTsKKwlpZiAoIGxvZ19maWxlICkgeworCQlmcHJpbnRmKCBsb2dfZmlsZSwgIlxuVyAlMi4wMnggJTQuMDR4IiwgKHBvcnQpJjB4RkYsIHZhbHVlICk7CisJfQorfQorCit2b2lkIElOX1BPUlRfU1RSSU5HXzMyKCBoY2ZfaW8gcHJ0LCBoY2ZfMzIgRkFSICogZHN0LCBpbnQgbikJeworCWludCBpID0gMDsKKwloY2ZfMTYgRkFSICogcDsKKwlpZiAoIGxvZ19maWxlICkgeworCQlmcHJpbnRmKCBsb2dfZmlsZSwgIlxucmVhZCBzdHJpbmdfMzIgbGVuZ3RoICUwNHggKCUwNGQpIGF0IHBvcnQgJTAyLjJ4IHRvIGFkZHIgJWxwIiwKKwkJCQkgKGhjZl8xNiluLCAoaGNmXzE2KW4sIChoY2ZfMTYpKHBydCkmMHhGRiwgZHN0KTsKKwl9CisJd2hpbGUgKCBuLS0gKSB7CisJCXAgPSAoaGNmXzE2IEZBUiAqKWRzdDsKKwkJKnArKyA9IChoY2ZfMTYpX2lucHcoIHBydCApOworCQkqcCAgID0gKGhjZl8xNilfaW5wdyggcHJ0ICk7CisJCWlmICggbG9nX2ZpbGUgKSB7CisJCQlmcHJpbnRmKCBsb2dfZmlsZSwgIiVzJTA4bHggIiwgaSsrICUgMHgwOCA/ICIgIiA6ICJcbiIsICpkc3QpOworCQl9CisJCWRzdCsrOworCX0KK30gLy8gSU5fUE9SVF9TVFJJTkdfMzIKKwordm9pZCBJTl9QT1JUX1NUUklOR184XzE2KCBoY2ZfaW8gcHJ0LCBoY2ZfOCBGQVIgKiBkc3QsIGludCBuKSB7CS8vYWxzbyBoYW5kbGVzIGJ5dGUgYWxpZ25tZW50IHByb2JsZW1zCisJaGNmXzE2IEZBUiAqIHAgPSAoaGNmXzE2IEZBUiAqKWRzdDsJCQkJCQkJLy90aGlzIG5lZWRzIG1vcmUgZWxhYm9yYXRlIGNvZGUgaW4gbm9uLXg4NiBwbGF0Zm9ybXMKKwlpbnQgaSA9IDA7CisJaWYgKCBsb2dfZmlsZSApIHsKKwkJZnByaW50ZiggbG9nX2ZpbGUsICJcbnJlYWQgc3RyaW5nXzE2IGxlbmd0aCAlMDR4ICglMDRkKSBhdCBwb3J0ICUwMi4yeCB0byBhZGRyICVscCIsCisJCQkJIChoY2ZfMTYpbiwgKGhjZl8xNiluLCAoaGNmXzE2KShwcnQpJjB4RkYsIGRzdCApOworCX0KKwl3aGlsZSAoIG4tLSApIHsKKwkJKnAgPShoY2ZfMTYpX2lucHcoIHBydCk7CisJCWlmICggbG9nX2ZpbGUgKSB7CisJCQlpZiAoIGkrKyAlIDB4MTAgKSB7CisJCQkJZnByaW50ZiggbG9nX2ZpbGUsICIlMDR4ICIsICpwKTsKKwkJCX0gZWxzZSB7CisJCQkJZnByaW50ZiggbG9nX2ZpbGUsICJcbiUwNHggIiwgKnApOworCQkJfQorCQl9CisJCXArKzsKKwl9Cit9IC8vIElOX1BPUlRfU1RSSU5HXzhfMTYKKwordm9pZCBPVVRfUE9SVF9TVFJJTkdfMzIoIGhjZl9pbyBwcnQsIGhjZl8zMiBGQVIgKiBzcmMsIGludCBuKQl7CisJaW50IGkgPSAwOworCWhjZl8xNiBGQVIgKiBwOworCWlmICggbG9nX2ZpbGUgKSB7CisJCWZwcmludGYoIGxvZ19maWxlLCAiXG53cml0ZSBzdHJpbmdfMzIgbGVuZ3RoICUwNHggKCUwNGQpIGF0IHBvcnQgJTAyLjJ4IiwKKwkJCQkgKGhjZl8xNiluLCAoaGNmXzE2KW4sIChoY2ZfMTYpKHBydCkmMHhGRik7CisJfQorCXdoaWxlICggbi0tICkgeworCQlwID0gKGhjZl8xNiBGQVIgKilzcmM7CisJCV9vdXRwdyggcHJ0LCAqcCsrICk7CisJCV9vdXRwdyggcHJ0LCAqcCAgICk7CisJCWlmICggbG9nX2ZpbGUgKSB7CisJCQlmcHJpbnRmKCBsb2dfZmlsZSwgIiVzJTA4bHggIiwgaSsrICUgMHgwOCA/ICIgIiA6ICJcbiIsICpzcmMpOworCQl9CisJCXNyYysrOworCX0KK30gLy8gT1VUX1BPUlRfU1RSSU5HXzMyCisKK3ZvaWQgT1VUX1BPUlRfU1RSSU5HXzhfMTYoIGhjZl9pbyBwcnQsIGhjZl84IEZBUiAqIHNyYywgaW50IG4pCXsJLy9hbHNvIGhhbmRsZXMgYnl0ZSBhbGlnbm1lbnQgcHJvYmxlbXMKKwloY2ZfMTYgRkFSICogcCA9IChoY2ZfMTYgRkFSICopc3JjOwkJCQkJCQkJLy90aGlzIG5lZWRzIG1vcmUgZWxhYm9yYXRlIGNvZGUgaW4gbm9uLXg4NiBwbGF0Zm9ybXMKKwlpbnQgaSA9IDA7CisJaWYgKCBsb2dfZmlsZSApIHsKKwkJZnByaW50ZiggbG9nX2ZpbGUsICJcbndyaXRlIHN0cmluZ18xNiBsZW5ndGggJTA0eCAoJTA0ZCkgYXQgcG9ydCAlMDR4IiwgbiwgbiwgKGhjZl8xNilwcnQpOworCX0KKwl3aGlsZSAoIG4tLSApIHsKKwkJKHZvaWQpX291dHB3KCBwcnQsICpwKTsKKwkJaWYgKCBsb2dfZmlsZSApIHsKKwkJCWlmICggaSsrICUgMHgxMCApIHsKKwkJCQlmcHJpbnRmKCBsb2dfZmlsZSwgIiUwNHggIiwgKnApOworCQkJfSBlbHNlIHsKKwkJCQlmcHJpbnRmKCBsb2dfZmlsZSwgIlxuJTA0eCAiLCAqcCk7CisJCQl9CisJCX0KKwkJcCsrOworCX0KK30gLy8gT1VUX1BPUlRfU1RSSU5HXzhfMTYKKworI2VuZGlmIC8vIElOX1BPUlRfV09SRAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEQgQSBUIEEgICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBIQ0ZfQVNTRVJUCitJRkJQIEJBU0VEIGFzc2VydF9pZmJwID0gTlVMTDsJCQkvL3RvIG1ha2UgYXNzZXJ0cyBlYXNpbHkgd29yayB1bmRlciBNTUQgYW5kIERIRgorI2VuZGlmIC8vIEhDRl9BU1NFUlQKKworI2lmIEhDRl9FTkNBUAorLyogU05BUCBoZWFkZXIgdG8gYmUgaW5zZXJ0ZWQgaW4gRXRoZXJuZXQtSUkgZnJhbWVzICovCitIQ0ZfU1RBVElDICBoY2ZfOCBCQVNFRCBzbmFwX2hlYWRlcltdID0geyAweEFBLCAweEFBLCAweDAzLCAweDAwLCAweDAwLAkvLzUgYnl0ZXMgc2lnbmF0dXJlICsKKwkJCQkJCQkJCQkgIDAgfTsJCQkJCQkJLy8xIGJ5dGUgcHJvdG9jb2wgaWRlbnRpZmllcgorI2VuZGlmIC8vIEhDRl9FTkNBUAorCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQorSENGX1NUQVRJQyBoY2ZfOCBCQVNFRCBtaWNfcGFkWzhdID0geyAweDVBLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CQkvL01JQyBwYWRkaW5nIG9mIG1lc3NhZ2UKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKKworI2lmIGRlZmluZWQgTVNGX0NPTVBPTkVOVF9JRAorQ0ZHX0lERU5USVRZX1NUUkNUIEJBU0VEIGNmZ19kcnZfaWRlbnRpdHkgPSB7CisJc2l6ZW9mKGNmZ19kcnZfaWRlbnRpdHkpL3NpemVvZihoY2ZfMTYpIC0gMSwJLy9sZW5ndGggb2YgUklECisJQ0ZHX0RSVl9JREVOVElUWSwJCQkvLyAoMHgwODI2KQorCU1TRl9DT01QT05FTlRfSUQsCisJTVNGX0NPTVBPTkVOVF9WQVIsCisJTVNGX0NPTVBPTkVOVF9NQUpPUl9WRVIsCisJTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIKK30gOworCitDRkdfUkFOR0VTX1NUUkNUIEJBU0VEIGNmZ19kcnZfc3VwX3JhbmdlID0geworCXNpemVvZihjZmdfZHJ2X3N1cF9yYW5nZSkvc2l6ZW9mKGhjZl8xNikgLSAxLAkvL2xlbmd0aCBvZiBSSUQKKwlDRkdfRFJWX1NVUF9SQU5HRSwJCQkvLyAoMHgwODI3KQorCisJQ09NUF9ST0xFX1NVUEwsCisJQ09NUF9JRF9EVUksCisJe3sJRFVJX0NPTVBBVF9WQVIsCisJCURVSV9DT01QQVRfQk9ULAorCQlEVUlfQ09NUEFUX1RPUAorCX19Cit9IDsKKworc3RydWN0IENGR19SQU5HRTNfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9hY3RfcmFuZ2VzX3ByaSA9IHsKKwlzaXplb2YoY2ZnX2Rydl9hY3RfcmFuZ2VzX3ByaSkvc2l6ZW9mKGhjZl8xNikgLSAxLAkvL2xlbmd0aCBvZiBSSUQKKwlDRkdfRFJWX0FDVF9SQU5HRVNfUFJJLAkJLy8gKDB4MDgyOCkKKworCUNPTVBfUk9MRV9BQ1QsCisJQ09NUF9JRF9QUkksCisJeworCSB7IDAsIDAsIDAgfSwgCQkJCQkJCS8vIEhDRl9QUklfVkFSXzEgbm90IHN1cHBvcnRlZCBieSBIQ0YgNworCSB7IDAsIDAsIDAgfSwgCQkJCQkJCS8vIEhDRl9QUklfVkFSXzIgbm90IHN1cHBvcnRlZCBieSBIQ0YgNworCSB7CTMsCQkJCQkJCQkJLy92YXJfcmVjWzJdIC0gVmFyaWFudCBudW1iZXIKKwkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSV8zX0JPVFRPTSwJCS8vCQkgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQorCQlDRkdfRFJWX0FDVF9SQU5HRVNfUFJJXzNfVE9QCQkJLy8JCSAtIFRvcCBDb21wYXRpYmlsaXR5CisJIH0KKwl9Cit9IDsKKworCitzdHJ1Y3QgQ0ZHX1JBTkdFNF9TVFJDVCBCQVNFRCBjZmdfZHJ2X2FjdF9yYW5nZXNfc3RhID0geworCXNpemVvZihjZmdfZHJ2X2FjdF9yYW5nZXNfc3RhKS9zaXplb2YoaGNmXzE2KSAtIDEsCS8vbGVuZ3RoIG9mIFJJRAorCUNGR19EUlZfQUNUX1JBTkdFU19TVEEsCQkvLyAoMHgwODI5KQorCisJQ09NUF9ST0xFX0FDVCwKKwlDT01QX0lEX1NUQSwKKwl7CisjaWYgZGVmaW5lZCBIQ0ZfU1RBX1ZBUl8xCisJIHsJMSwJCQkJCQkJCQkvL3Zhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgorCQlDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzFfQk9UVE9NLAkJLy8JCSAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CisJCUNGR19EUlZfQUNUX1JBTkdFU19TVEFfMV9UT1AJCQkvLwkJIC0gVG9wIENvbXBhdGliaWxpdHkKKwkgfSwKKyNlbHNlCisJIHsgMCwgMCwgMCB9LAorI2VuZGlmIC8vIEhDRl9TVEFfVkFSXzEKKyNpZiBkZWZpbmVkIEhDRl9TVEFfVkFSXzIKKwkgewkyLAkJCQkJCQkJCS8vdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCisJCUNGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9CT1RUT00sCQkvLwkJIC0gQm90dG9tIENvbXBhdGliaWxpdHkKKwkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8yX1RPUAkJCS8vCQkgLSBUb3AgQ29tcGF0aWJpbGl0eQorCSB9LAorI2Vsc2UKKwkgeyAwLCAwLCAwIH0sCisjZW5kaWYgLy8gSENGX1NUQV9WQVJfMgorLy8gRm9yIE5hdGl2ZV9VU0IgKE5vdCB1c2VkISkKKyNpZiBkZWZpbmVkIEhDRl9TVEFfVkFSXzMKKwkgewkzLAkJCQkJCQkJCS8vdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCisJCUNGR19EUlZfQUNUX1JBTkdFU19TVEFfM19CT1RUT00sCQkvLwkJIC0gQm90dG9tIENvbXBhdGliaWxpdHkKKwkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8zX1RPUAkJCS8vCQkgLSBUb3AgQ29tcGF0aWJpbGl0eQorCSB9LAorI2Vsc2UKKwkgeyAwLCAwLCAwIH0sCisjZW5kaWYgLy8gSENGX1NUQV9WQVJfMworLy8gV2FycAorI2lmIGRlZmluZWQgSENGX1NUQV9WQVJfNAorCSB7CTQsCQkJCQkJCQkJLy92YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKKwkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV80X0JPVFRPTSwJCS8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CisJCUNGR19EUlZfQUNUX1JBTkdFU19TVEFfNF9UT1AJCQkvLyAgICAgICAgICAgLSBUb3AgQ29tcGF0aWJpbGl0eQorCSB9CisjZWxzZQorCSB7IDAsIDAsIDAgfQorI2VuZGlmIC8vIEhDRl9TVEFfVkFSXzQKKwl9Cit9IDsKKworCitzdHJ1Y3QgQ0ZHX1JBTkdFNl9TVFJDVCBCQVNFRCBjZmdfZHJ2X2FjdF9yYW5nZXNfaHNpID0geworCXNpemVvZihjZmdfZHJ2X2FjdF9yYW5nZXNfaHNpKS9zaXplb2YoaGNmXzE2KSAtIDEsCS8vbGVuZ3RoIG9mIFJJRAorCUNGR19EUlZfQUNUX1JBTkdFU19IU0ksCQkvLyAoMHgwODJBKQorCUNPTVBfUk9MRV9BQ1QsCisJQ09NUF9JRF9IU0ksCisJeworI2lmIGRlZmluZWQgSENGX0hTSV9WQVJfMAkJCQkJLy8gQ29udHJvbGxlZCBkZXBsb3ltZW50CisJIHsJMCwJCQkJCQkJCQkvLyB2YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKKwkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV8wX0JPVFRPTSwJCS8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CisJCUNGR19EUlZfQUNUX1JBTkdFU19IU0lfMF9UT1AJCQkvLyAgICAgICAgICAgLSBUb3AgQ29tcGF0aWJpbGl0eQorCSB9LAorI2Vsc2UKKwkgeyAwLCAwLCAwIH0sCisjZW5kaWYgLy8gSENGX0hTSV9WQVJfMAorCSB7IDAsIDAsIDAgfSwgCQkJCQkJCS8vIEhDRl9IU0lfVkFSXzEgbm90IHN1cHBvcnRlZCBieSBIQ0YgNworCSB7IDAsIDAsIDAgfSwgCQkJCQkJCS8vIEhDRl9IU0lfVkFSXzIgbm90IHN1cHBvcnRlZCBieSBIQ0YgNworCSB7IDAsIDAsIDAgfSwgCQkJCQkJCS8vIEhDRl9IU0lfVkFSXzMgbm90IHN1cHBvcnRlZCBieSBIQ0YgNworI2lmIGRlZmluZWQgSENGX0hTSV9WQVJfNAkJCQkJLy8gSGVybWVzLUlJIGFsbCB0eXBlcworCSB7CTQsCQkJCQkJCQkJLy8gdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCisJCUNGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9CT1RUT00sCQkvLyAgICAgICAgICAgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQorCQlDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzRfVE9QCQkJLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKKwkgfSwKKyNlbHNlCisJIHsgMCwgMCwgMCB9LAorI2VuZGlmIC8vIEhDRl9IU0lfVkFSXzQKKyNpZiBkZWZpbmVkIEhDRl9IU0lfVkFSXzUJCQkJCS8vIFdBUlAgSGVybWVzLTIuNQorCSB7CTUsCQkJCQkJCQkJLy8gdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCisJCUNGR19EUlZfQUNUX1JBTkdFU19IU0lfNV9CT1RUT00sCQkvLyAgICAgICAgICAgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQorCQlDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzVfVE9QCQkJLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKKwkgfQorI2Vsc2UKKwkgeyAwLCAwLCAwIH0KKyNlbmRpZiAvLyBIQ0ZfSFNJX1ZBUl81CisJfQorfSA7CisKKworQ0ZHX1JBTkdFNF9TVFJDVCBCQVNFRCBjZmdfZHJ2X2FjdF9yYW5nZXNfYXBmID0geworCXNpemVvZihjZmdfZHJ2X2FjdF9yYW5nZXNfYXBmKS9zaXplb2YoaGNmXzE2KSAtIDEsCS8vbGVuZ3RoIG9mIFJJRAorCUNGR19EUlZfQUNUX1JBTkdFU19BUEYsCQkvLyAoMHgwODJCKQorCisJQ09NUF9ST0xFX0FDVCwKKwlDT01QX0lEX0FQRiwKKwl7CisjaWYgZGVmaW5lZCBIQ0ZfQVBGX1ZBUl8xCQkJCS8vKEZha2UpIEhlcm1lcy1JCisJIHsJMSwJCQkJCQkJCQkvL3Zhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgorCQlDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzFfQk9UVE9NLAkJLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkKKwkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8xX1RPUAkJCS8vICAgICAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5CisJIH0sCisjZWxzZQorCSB7IDAsIDAsIDAgfSwKKyNlbmRpZiAvLyBIQ0ZfQVBGX1ZBUl8xCisjaWYgZGVmaW5lZCBIQ0ZfQVBGX1ZBUl8yCQkJCS8vSGVybWVzLUlJCisJIHsJMiwJCQkJCQkJCQkvLyB2YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKKwkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8yX0JPVFRPTSwJCS8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CisJCUNGR19EUlZfQUNUX1JBTkdFU19BUEZfMl9UT1AJCQkvLyAgICAgICAgICAgLSBUb3AgQ29tcGF0aWJpbGl0eQorCSB9LAorI2Vsc2UKKwkgeyAwLCAwLCAwIH0sCisjZW5kaWYgLy8gSENGX0FQRl9WQVJfMgorI2lmIGRlZmluZWQgSENGX0FQRl9WQVJfMwkJCQkJCS8vIE5hdGl2ZV9VU0IKKwkgewkzLAkJCQkJCQkJCQkvLyB2YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKKwkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8zX0JPVFRPTSwJCS8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CSEhISEhc2VlIG5vdGUgYmVsb3chISEhISEhCisJCUNGR19EUlZfQUNUX1JBTkdFU19BUEZfM19UT1AJCQkvLyAgICAgICAgICAgLSBUb3AgQ29tcGF0aWJpbGl0eQorCSB9LAorI2Vsc2UKKwkgeyAwLCAwLCAwIH0sCisjZW5kaWYgLy8gSENGX0FQRl9WQVJfMworI2lmIGRlZmluZWQgSENGX0FQRl9WQVJfNAkJCQkJCS8vIFdBUlAgSGVybWVzIDIuNQorCSB7CTQsCQkJCQkJCQkJCS8vIHZhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgorCQlDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzRfQk9UVE9NLAkJLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkJISEhISFzZWUgbm90ZSBiZWxvdyEhISEhISEKKwkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl80X1RPUAkJCS8vICAgICAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5CisJIH0KKyNlbHNlCisJIHsgMCwgMCwgMCB9CisjZW5kaWYgLy8gSENGX0FQRl9WQVJfNAorCX0KK30gOworI2RlZmluZSBIQ0ZfVkVSU0lPTiAgVEVYVCggIkhDRiRSZXZpc2lvbjogMS4xMCAkIiApCisKK3N0YXRpYyBzdHJ1Y3QgLypDRkdfSENGX09QVF9TVFJDVCovIHsKKwloY2ZfMTYJbGVuOwkJCQkJLy9sZW5ndGggb2YgY2ZnX2hjZl9vcHQgc3RydWN0CisJaGNmXzE2CXR5cDsJCQkJCS8vdHlwZSAweDA4MkMKKwloY2ZfMTYJIHYwOwkJCQkJCS8vb2Zmc2V0IEhDRl9WRVJTSU9OCisJaGNmXzE2CSB2MTsJCQkJCQkvLyBNU0ZfQ09NUE9ORU5UX0lECisJaGNmXzE2CSB2MjsJCQkJCQkvLyBIQ0ZfQUxJR04KKwloY2ZfMTYJIHYzOwkJCQkJCS8vIEhDRl9BU1NFUlQKKwloY2ZfMTYJIHY0OwkJCQkJCS8vIEhDRl9CSUdfRU5ESUFOCisJaGNmXzE2CSB2NTsJCQkJCQkvLyAvKiBIQ0ZfRExWIHwgSENGX0RMTlYgKi8KKwloY2ZfMTYJIHY2OwkJCQkJCS8vIEhDRl9ETUEKKwloY2ZfMTYJIHY3OwkJCQkJCS8vIEhDRl9FTkNBUAorCWhjZl8xNgkgdjg7CQkJCQkJLy8gSENGX0VYVAorCWhjZl8xNgkgdjk7CQkJCQkJLy8gSENGX0lOVF9PTgorCWhjZl8xNgl2MTA7CQkJCQkJLy8gSENGX0lPCisJaGNmXzE2CXYxMTsJCQkJCQkvLyBIQ0ZfTEVHQUNZCisJaGNmXzE2CXYxMjsJCQkJCQkvLyBIQ0ZfTUFYX0xUVgorCWhjZl8xNgl2MTM7CQkJCQkJLy8gSENGX1BST1RfVElNRQorCWhjZl8xNgl2MTQ7CQkJCQkJLy8gSENGX1NMRUVQCisJaGNmXzE2CXYxNTsJCQkJCQkvLyBIQ0ZfVEFMTElFUworCWhjZl8xNgl2MTY7CQkJCQkJLy8gSENGX1RZUEUKKwloY2ZfMTYJdjE3OwkJCQkJCS8vIEhDRl9OSUNfVEFMX0NOVAorCWhjZl8xNgl2MTg7CQkJCQkJLy8gSENGX0hDRl9UQUxfQ05UCisJaGNmXzE2CXYxOTsJCQkJCQkvLyBvZmZzZXQgdGFsbGllcworCVRDSEFSCXZhbFtzaXplb2YoSENGX1ZFUlNJT04pXTsKK30gQkFTRUQgY2ZnX2hjZl9vcHQgPSB7CisJc2l6ZW9mKGNmZ19oY2Zfb3B0KS9zaXplb2YoaGNmXzE2KSAtMSwKKwlDRkdfSENGX09QVCwJCQkJLy8gKDB4MDgyQykKKwkoIHNpemVvZihjZmdfaGNmX29wdCkgLSBzaXplb2YoSENGX1ZFUlNJT04pIC0gNCApL3NpemVvZihoY2ZfMTYpLAorI2lmIGRlZmluZWQgTVNGX0NPTVBPTkVOVF9JRAorCU1TRl9DT01QT05FTlRfSUQsCisjZWxzZQorCTAsCisjZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRAorCUhDRl9BTElHTiwKKwlIQ0ZfQVNTRVJULAorCUhDRl9CSUdfRU5ESUFOLAorCTAsCQkJCQkJCQkJLy8gLyogSENGX0RMViB8IEhDRl9ETE5WKi8sCisJSENGX0RNQSwKKwlIQ0ZfRU5DQVAsCisJSENGX0VYVCwKKwlIQ0ZfSU5UX09OLAorCUhDRl9JTywKKwlIQ0ZfTEVHQUNZLAorCUhDRl9NQVhfTFRWLAorCUhDRl9QUk9UX1RJTUUsCisJSENGX1NMRUVQLAorCUhDRl9UQUxMSUVTLAorCUhDRl9UWVBFLAorI2lmIChIQ0ZfVEFMTElFUykgJiAoIEhDRl9UQUxMSUVTX05JQyB8IEhDRl9UQUxMSUVTX0hDRiApCisJSENGX05JQ19UQUxfQ05ULAorCUhDRl9IQ0ZfVEFMX0NOVCwKKwlvZmZzZXRvZihJRkJfU1RSQ1QsIElGQl9UYWxseUxlbiApLAorI2Vsc2UKKwkwLCAwLCAwLAorI2VuZGlmIC8vIEhDRl9UQUxMSUVTX05JQyAvIEhDRl9UQUxMSUVTX0hDRgorCUhDRl9WRVJTSU9OCit9OyAvLyBjZmdfaGNmX29wdAorI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQKKworI2lmIGRlZmluZWQgSENGX1RBTExJRVNfRVhUUkEKKwlyZXBsYWNlZCBieSBIQ0ZfRVhUX1RBTExJRVNfRlcgOworI2VuZGlmIC8vIEhDRl9UQUxMSUVTX0VYVFJBCisKKyNpZiBkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQgfHwgKEhDRl9FWFQpICYgSENGX0VYVF9NQgorI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIKK0hDRl9TVEFUSUMgTFRWX1NUUkNUIEJBU0VEIGNmZ19udWxsID0geyAxLCBDRkdfTlVMTCwgezB9IH07CisjZW5kaWYgLy8gSENGX0VYVF9NQgorSENGX1NUQVRJQyBoY2ZfMTYqIEJBU0VEIHh4eHhbIF0gPSB7CisjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9NQgorCSZjZmdfbnVsbC5sZW4sCQkJCQkJCS8vQ0ZHX05VTEwJCQkJCQkweDA4MjAKKyNlbmRpZiAvLyBIQ0ZfRVhUX01CCisjaWYgZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lECisJJmNmZ19kcnZfaWRlbnRpdHkubGVuLAkJCQkJLy9DRkdfRFJWX0lERU5USVRZICAgICAgICAgICAgICAweDA4MjYKKwkmY2ZnX2Rydl9zdXBfcmFuZ2UubGVuLAkJCQkJLy9DRkdfRFJWX1NVUF9SQU5HRSAgICAgICAgICAgICAweDA4MjcKKwkmY2ZnX2Rydl9hY3RfcmFuZ2VzX3ByaS5sZW4sCQkJLy9DRkdfRFJWX0FDVF9SQU5HRVNfUFJJICAgICAgICAweDA4MjgKKwkmY2ZnX2Rydl9hY3RfcmFuZ2VzX3N0YS5sZW4sCQkJLy9DRkdfRFJWX0FDVF9SQU5HRVNfU1RBCQkweDA4MjkKKwkmY2ZnX2Rydl9hY3RfcmFuZ2VzX2hzaS5sZW4sCQkJLy9DRkdfRFJWX0FDVF9SQU5HRVNfSFNJCQkweDA4MkEKKwkmY2ZnX2Rydl9hY3RfcmFuZ2VzX2FwZi5sZW4sCQkJLy9DRkdfRFJWX0FDVF9SQU5HRVNfQVBGCQkweDA4MkIKKwkmY2ZnX2hjZl9vcHQubGVuLAkJCQkJCS8vQ0ZHX0hDRl9PUFQJCQkJCTB4MDgyQworCU5VTEwsCQkJCQkJCQkJLy9JRkJfUFJJSWRlbnRpdHkgcGxhY2Vob2xkZXIJMHhGRDAyCisJTlVMTCwJCQkJCQkJCQkvL0lGQl9QUklTdXAgcGxhY2Vob2xkZXIJCTB4RkQwMworI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQKKwlOVUxMCQkJCQkJCQkJLy9lbmRzZW50aW5lbAorICB9OworI2RlZmluZSB4eHh4X1BSSV9JREVOVElUWV9PRkZTRVQJKHNpemVvZih4eHh4KS9zaXplb2YoeHh4eFswXSkgLSAzKQorCisjZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRCAvIEhDRl9FWFRfTUIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKiBUIE8gUCAgIEwgRSBWIEUgTCAgIEggQyBGICAgUiBPIFUgVCBJIE4gRSBTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAoSENGX0RMX09OTFkpID09IDAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouTU9EVUxFCQlpbnQgaGNmX2FjdGlvbiggSUZCUCBpZmJwLCBoY2ZfMTYgYWN0aW9uICkKKyouUFVSUE9TRQkJQ2hhbmdlcyB0aGUgcnVuLXRpbWUgQ2FyZCBiZWhhdmlvci4KKyoJCQkJUGVyZm9ybXMgTWlzY2VsbGFudW91cyBhY3Rpb25zLgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJCQkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqCWFjdGlvbgkJCQkJbnVtYmVyIGlkZW50aWZ5aW5nIHRoZSB0eXBlIG9mIGNoYW5nZQorKgkgLSBIQ0ZfQUNUX0NDWF9PRkYJCWRpc2FibGUgQ0tJUAorKgkgLSBIQ0ZfQUNUX0NDWF9PTgkJZW5hYmxlIENLSVAKKyoJIC0gSENGX0FDVF9JTlRfRk9SQ0VfT04JZW5hYmxlIGludGVycnVwdCBnZW5lcmF0aW9uIGJ5IFdhdmVMQU4gTklDCisqCSAtIEhDRl9BQ1RfSU5UX09GRgkJZGlzYWJsZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBieSBXYXZlTEFOIE5JQworKgkgLSBIQ0ZfQUNUX0lOVF9PTgkJY29tcGVuc2F0ZSAxIEhDRl9BQ1RfSU5UX09GRiwgZW5hYmxlIGludGVycnVwdCBnZW5lcmF0aW9uIGlmIGJhbGFuY2UgcmVhY2hlZAorKgkgLSBIQ0ZfQUNUX1BSU19TQ0FOCQlIZXJtZXMgUHJvYmUgUmVzcG9ucyBTY2FuIChGMTAyKSBjb21tYW5kCisqCSAtIEhDRl9BQ1RfUlhfQUNLCQlhY2tub3dsZWRnZSBub24tRE1BIHJlY2VpdmVyIHRvIEhlcm1lcworKgkgLSBIQ0ZfQUNUX1NDQU4JCQlIZXJtZXMgSW5xdWlyZSBTY2FuIChGMTAxKSBjb21tYW5kIChub24tV0FSUCBvbmx5KQorKgkgLSBIQ0ZfQUNUX1NMRUVQCQlERFMgU2xlZXAgcmVxdWVzdAorKgkgLSBIQ0ZfQUNUX1RBTExJRVMJCUhlcm1lcyBJbnF1aXJlIFRhbGxpZXMgKEYxMDApIGNvbW1hbmQKKyoKKyouUkVUVVJOUworKglIQ0ZfU1VDQ0VTUwkJCQlhbGwgKGluY2x1ZGluZyBpbnZhbGlkKQorKglIQ0ZfSU5UX1BFTkRJTkcJCQlIQ0ZfQUNUX0lOVF9PRkYsIGludGVycnVwdCBwZW5kaW5nCisqCUhDRl9FUlJfTk9fTklDCQkJSENGX0FDVF9JTlRfT0ZGLCBOSUMgcHJlc2VuY2UgY2hlY2sgZmFpbHMKKyoKKyouQ09ORElUSU9OUworKiBFeGNlcHQgZm9yIGhjZl9hY3Rpb24gd2l0aCBIQ0ZfQUNUX0lOVF9GT1JDRV9PTiBvciBIQ0ZfQUNUX0lOVF9PRkYgYXMgcGFyYW1ldGVyIG9yIGhjZl9jb25uZWN0IHdpdGggYW4gSS9PCisqIGFkZHJlc3MgKGkuZS4gbm90IEhDRl9ESVNDT05ORUNUKSwgYWxsIGhjZi1mdW5jdGlvbiBjYWxscyBNVVNUIGJlIHByZWNlZWRlZCBieSBhIGNhbGwgb2YgaGNmX2FjdGlvbiB3aXRoCisqIEhDRl9BQ1RfSU5UX09GRiBhcyBwYXJhbWV0ZXIuCisqIE5vdGUgdGhhdCBoY2ZfY29ubmVjdCBkZWZhdWx0cyB0byBOSUMgaW50ZXJydXB0IGRpc2FibGVkIG1vZGUsIGkuZS4gYXMgaWYgaGNmX2FjdGlvbiggSENGX0FDVF9JTlRfT0ZGICkKKyogd2FzIGNhbGxlZC4KKyoKKyouREVTQ1JJUFRJT04KKyogaGNmX2FjdGlvbiBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIG1vZGUgY2hhbmdpbmcgYWN0aW9uLWNvZGUgcGFpcnMgdGhhdCBhcmUgYW50b255bXMKKyoJIC0gSENGX0FDVF9DQ1hfT0ZGIC8gSENGX0FDVF9DQ1hfT04KKyoJIC0gSENGX0FDVF9JTlRfW0ZPUkNFX11PTiAvIEhDRl9BQ1RfSU5UX09GRgorKgorKiBBZGRpdGlvbmFsbHkgaGNmX2FjdGlvbiBjYW4gc3RhcnQgdGhlIGZvbGxvd2luZyBhY3Rpb25zIGluIHRoZSBOSUM6CisqCSAtIEhDRl9BQ1RfUFJTX1NDQU4KKyoJIC0gSENGX0FDVF9SWF9BQ0sKKyoJIC0gSENGX0FDVF9TQ0FOCisqCSAtIEhDRl9BQ1RfU0xFRVAKKyoJIC0gSENGX0FDVF9UQUxMSUVTCisqCisqIG8gSENGX0FDVF9JTlRfT0ZGOiBTZXRzIE5JQyBJbnRlcnJ1cHRzIG1vZGUgRGlzYWJsZWQuCisqIFRoaXMgY29tbWFuZCwgYW5kIHRoZSBhc3NvY2lhdGVkIFtGb3JjZV0gRW5hYmxlIE5JQyBpbnRlcnJ1cHRzIGNvbW1hbmQsIGFyZSBvbmx5IGF2YWlsYWJsZSBpZiB0aGUgSENGX0lOVF9PTgorKiBjb21waWxlIHRpbWUgb3B0aW9uIGlzIG5vdCBzZXQgYXQgMHgwMDAwLgorKgorKiBvIEhDRl9BQ1RfSU5UX09OOiBTZXRzIE5JQyBJbnRlcnJ1cHRzIG1vZGUgRW5hYmxlZC4KKyogRW5hYmxlIE5JQyBJbnRlcnJ1cHRzLCBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBwcmVjZWRpbmcgRGlzYWJsZSBOSUMgSW50ZXJydXB0IGNhbGxzLgorKgorKiBvIEhDRl9BQ1RfSU5UX0ZPUkNFX09OOiBGb3JjZSBOSUMgSW50ZXJydXB0cyBtb2RlIEVuYWJsZWQuCisqIFNldHMgTklDIEludGVycnVwdHMgbW9kZSBFbmFibGVkLCByZWdhcmRsZXNzIG9mZiB0aGUgbnVtYmVyIG9mIHByZWNlZGluZyBEaXNhYmxlIE5JQyBJbnRlcnJ1cHQgY2FsbHMuCisqCisqIFRoZSBkaXNhYmxpbmcgYW5kIGVuYWJsaW5nIG9mIGludGVycnVwdHMgYXJlIGFudG9ueW1zLgorKiBUaGVzZSBhY3Rpb25zIG11c3QgYmUgYmFsYW5jZWQuCisqIEZvciBlYWNoICJkaXNhYmxlIGludGVycnVwdHMiIHRoZXJlIG11c3QgYmUgYSBtYXRjaGluZyAiZW5hYmxlIGludGVycnVwdHMiLgorKiBUaGUgZGlzYWJsZSBpbnRlcnJ1cHRzIG1heSBiZSBleGVjdXRlZCBtdWx0aXBsZSB0aW1lcyBpbiBhIHJvdyB3aXRob3V0IGludGVydmVuaW5nIGVuYWJsZSBpbnRlcnJ1cHRzLCBpbgorKiBvdGhlciB3b3JkcywgdGhlIGRpc2FibGUgaW50ZXJydXB0cyBtYXkgYmUgbmVzdGVkLgorKiBUaGUgaW50ZXJydXB0IGdlbmVyYXRpb24gbWVjaGFuaXNtIGlzIGRpc2FibGVkIGF0IHRoZSBmaXJzdCBjYWxsIHdpdGggSENGX0FDVF9JTlRfT0ZGLgorKiBUaGUgaW50ZXJydXB0IGdlbmVyYXRpb24gbWVjaGFuaXNtIGlzIHJlLWVuYWJsZWQgd2hlbiB0aGUgbnVtYmVyIG9mIGNhbGxzIHdpdGggSENGX0FDVF9JTlRfT04gbWF0Y2hlcyB0aGUKKyogbnVtYmVyIG9mIGNhbGxzIHdpdGggSU5UX09GRi4KKyoKKyogSXQgaXMgbm90IGFsbG93ZWQgdG8gaGF2ZSBtb3JlIEVuYWJsZSBOSUMgSW50ZXJydXB0cyBjYWxscyB0aGFuIERpc2FibGUgTklDIEludGVycnVwdHMgY2FsbHMuCisqIFRoZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBtZWNoYW5pc20gaXMgaW5pdGlhbGx5IChpLmUuIGFmdGVyIGhjZl9jb25uZWN0KSBkaXNhYmxlZC4KKyogQW4gTVNGIGJhc2VkIG9uIGEgaW50ZXJydXB0IHN0cmF0ZWd5IG11c3QgY2FsbCBoY2ZfYWN0aW9uIHdpdGggSU5UX09OIGluIGl0cyBpbml0aWFsaXphdGlvbiBsb2dpYy4KKyoKKyohCVRoZSBJTlRfT0ZGL0lOVF9PTiBob3VzZWtlZXBpbmcgaXMgaW5pdGlhbGl6ZWQgYXQgMHgwMDAwIGJ5IGhjZl9jb25uZWN0LCBjYXVzaW5nIHRoZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbgorKgltZWNoYW5pc20gdG8gYmUgZGlzYWJsZWQgYXQgZmlyc3QuIFRoaXMgc3VpdHMgTVNGIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIGEgcG9sbGluZyBzdHJhdGVneS4KKyoKKyogbyBIQ0ZfQUNUX0NDWF9PRkYgLyBIQ0ZfQUNUX0NDWF9PTgorKiEhIFRoaXMgY2FuIHVzZSBzb21lIG1vcmUgZXhwbGFuYXRpb247PworKiBEaXNhYmxlcyBhbmQgRW5hYmxlcyBzdXBwb3J0IGluIHRoZSBIQ0YgcnVudGltZSBjb2RlIGZvciB0aGUgQ0NYIGZlYXR1cmUuIEVhY2ggdGltZSBvbmUgb2YgdGhlc2UgYWN0aW9uCisqIGNvZGVzIGlzIHVzZWQsIHRoZSBlZmZlY3RzIG9mIHRoZSBwcmVjZWRpbmcgdXNlIGNlYXNlLgorKgorKiBvIEhDRl9BQ1RfU0xFRVA6IEluaXRpYXRlcyB0aGUgRGlzY29ubmVjdGVkIERlZXBTbGVlcCBwcm9jZXNzCisqIFRoaXMgY29tbWFuZCBpcyBvbmx5IGF2YWlsYWJsZSBpZiB0aGUgSENGX0REUyBjb21waWxlIHRpbWUgb3B0aW9uIGlzIHNldC4gSXQgdHJpZ2dlcnMgdGhlIEYvVyB0byBzdGFydCB0aGUKKyogc2xlZXAgaGFuZHNoYWtpbmcuIFJlZ2FyZGxlc3Mgd2hldGhlciB0aGUgSG9zdCBpbml0aWF0ZXMgYSBEaXNjb25uZWN0ZWQgRGVlcFNsZWVwIChERFMpIG9yIHRoZSBGL1cgaW5pdGlhdGVzCisqIGEgQ29ubmVjdGVkIERlZXBTbGVlcCAoQ0RTKSwgdGhlIEhvc3QtRi9XIHNsZWVwIGhhbmRzaGFraW5nIGlzIGNvbXBsZXRlZCB3aGVuIHRoZSBOSUMgSW50ZXJydXB0cyBtb2RlIGlzCisqIGVuYWJsZWQgKGJ5IG1lYW5zIG9mIHRoZSBiYWxhbmNpbmcgSENGX0FDVF9JTlRfT04pLCBpLmUuIGF0IHRoYXQgbW9tZW50IHRoZSBGL1cgcmVhbGx5IGdvZXMgaW50byBzbGVlcCBtb2RlLgorKiBUaGUgRi9XIGlzIHdva2VudXAgYnkgdGhlIEhDRiB3aGVuIHRoZSBOSUMgSW50ZXJydXB0cyBtb2RlIGFyZSBkaXNhYmxlZCwgaS5lLiBhdCB0aGUgZmlyc3QgSENGX0FDVF9JTlRfT0ZGCisqIGFmdGVyIGdvaW5nIGludG8gc2xlZXAuCisqCisqIFRoZSBmb2xsb3dpbmcgTWlzY2VsbGFudW91cyBhY3Rpb25zIGFyZSBkZWZpbmVkOgorKgorKiBvIEhDRl9BQ1RfUlhfQUNLOiBSZWNlaXZlciBBY2tub3dsZWRnZW1lbnQgKG5vbi1ETUEsIG5vbi1VU0IgbW9kZSBvbmx5KQorKiBBY2tpbmcgdGhlIHJlY2VpdmVyLCBmcmVlcyB0aGUgTklDIG1lbW9yeSB1c2VkIHRvIGhvbGQgdGhlIFJ4IGZyYW1lIGFuZCBhbGxvd3MgdGhlIEYvVyB0bworKiByZXBvcnQgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgbmV4dCBSeCBmcmFtZS4KKyogSWYgdGhlIE1TRiBkb2VzIG5vdCBuZWVkIGFjY2VzcyAoYW55IGxvbmdlcikgdG8gdGhlIGN1cnJlbnQgZnJhbWUsIGUuZy4gYmVjYXVzZSBpdCBpcyByZWplY3RlZCBiYXNlZCBvbiB0aGUKKyogbG9vayBhaGVhZCBvciBjb3BpZWQgdG8gYW5vdGhlciBidWZmZXIsIHRoZSByZWNlaXZlciBtYXkgYmUgYWNrZWQuIEFja2luZyBlYXJsaWVyIGlzIGFzc3VtZWQgdG8gaGF2ZSB0aGUKKyogcG90ZW50aWFsIG9mIGltcHJvdmluZyB0aGUgcGVyZm9ybWFuY2UuCisqIElmIHRoZSBNU0YgZG9lcyBub3QgZXhwbGl0bHkgYWNrIHRlIHJlY2VpdmVyLCB0aGUgYWNraW5nIGlzIGRvbmUgaW1wbGljaXRseSBpZjoKKyogLSB0aGUgcmVjZWl2ZWQgZnJhbWUgZml0cyBpbiB0aGUgbG9vayBhaGVhZCBidWZmZXIsIGJ5IHRoZSBoY2Zfc2VydmljZV9uaWMgY2FsbCB0aGF0IHJlcG9ydGVkIHRoZSBSeCBmcmFtZQorKiAtIGlmIG5vdCBpbiB0aGUgYWJvdmUgc3RlcCwgYnkgaGNmX3Jjdl9tc2cgKGFzc3VtaW5nIGhjZl9yY3ZfbXNnIGlzIGNhbGxlZCkKKyogLSBpZiBuZWl0aGVyIG9mIHRoZSBhYm92ZSBpbXBsaWNpdCBhY2tzIG5vciBhbiBleHBsaWNpdCBhY2sgYnkgdGhlIE1TRiwgYnkgdGhlIGZpcnN0IGhjZl9zZXJ2aWNlX25pYyBhZnRlcgorKgl0aGUgaGNmX3NlcnZpY2VfbmljIHRoYXQgcmVwb3J0ZWQgdGhlIFJ4IGZyYW1lLgorKiBOb3RlOiBJZiBhbiBSeCBmcmFtZSBpcyBhbHJlYWR5IGFja2VkLCBhbiBleHBsaWNpdCBBQ0sgYnkgdGhlIE1TRiBhY3RzIGFzIGEgTm9PcGVyYXRpb24uCisqCisqIG8gSENGX0FDVF9UQUxMSUVTOiBJbnF1aXJlIFRhbGxpZXMgY29tbWFuZAorKiBUaGlzIGNvbW1hbmQgaXMgb25seSBvcGVyYXRpb25hbCBpZiB0aGUgRi9XIGlzIGVuYWJsZWQuCisqIFRoZSBJbnF1aXJlIFRhbGxpZXMgY29tbWFuZCByZXF1ZXN0cyB0aGUgRi9XIHRvIHByb3ZpZGUgaXRzIGN1cnJlbnQgc2V0IG9mIHRhbGxpZXMuCisqIFNlZSBhbHNvIGhjZl9nZXRfaW5mbyB3aXRoIENGR19UQUxMSUVTIGFzIHBhcmFtZXRlci4KKyoKKyogbyBIQ0ZfQUNUX1BSU19TQ0FOOiBJbnF1aXJlIFByb2JlIFJlc3BvbnMgU2NhbiBjb21tYW5kCisqIFRoaXMgY29tbWFuZCBpcyBvbmx5IG9wZXJhdGlvbmFsIGlmIHRoZSBGL1cgaXMgZW5hYmxlZC4KKyogVGhlIFByb2JlIFJlc3BvbnMgU2NhbiBjb21tYW5kIHN0YXJ0cyBhIHNjYW4gc2VxdWVuY2UuCisqIFRoZSBIQ0YgcHV0cyB0aGUgcmVzdWx0IG9mIHRoaXMgYWN0aW9uIGluIGFuIE1TRiBkZWZpbmVkIGJ1ZmZlciAoc2VlIENGR19SSURfTE9HX1NUUkNUKS4KKyoKKyogbyBIQ0ZfQUNUX1NDQU46IElucXVpcmUgU2NhbiBjb21tYW5kCisqIFRoaXMgY29tbWFuZCBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgSElJIEYvVyAoaS5lLiBwcmUtV0FSUCkgYW5kIGl0IGlzIG9wZXJhdGlvbmFsIGlmIHRoZSBGL1cgaXMgZW5hYmxlZC4KKyogVGhlIElucXVpcmUgU2NhbiBjb21tYW5kIHN0YXJ0cyBhIHNjYW4gc2VxdWVuY2UuCisqIFRoZSBIQ0YgcHV0cyB0aGUgcmVzdWx0IG9mIHRoaXMgYWN0aW9uIGluIGFuIE1TRiBkZWZpbmVkIGJ1ZmZlciAoc2VlIENGR19SSURfTE9HX1NUUkNUKS4KKyoKKyogQXNzZXJ0IGZhaWxzIGlmCisqIC0gaWZicCBoYXMgYSByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlLgorKiAtIE5JQyBpbnRlcnJ1cHRzIGFyZSBub3QgZGlzYWJsZWQgd2hpbGUgcmVxdWlyZWQgYnkgcGFyYW1ldGVyIGFjdGlvbi4KKyogLSBhbiBpbnZhbGlkIGNvZGUgaXMgc3BlY2lmaWVkIGluIHBhcmFtZXRlciBhY3Rpb24uCisqIC0gSENGX0FDVF9JTlRfT04gY29tbWFuZHMgb3V0bnVtYmVyIHRoZSBIQ0ZfQUNUX0lOVF9PRkYgY29tbWFuZHMuCisqIC0gcmVlbnRyYW5jeSwgbWF5IGJlICBjYXVzZWQgYnkgY2FsbGluZyBoY2ZfZnVuY3Rpb25zIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbiBhZ2FpbnN0IE5JQyBpbnRlcnJ1cHRzIG9yCisqCW11bHRpLXRocmVhZGluZworKgorKiAtIFNpbmNlIHRoZSBIQ0YgZG9lcyBub3QgbWFpbnRhaW4gc3RhdHVzIGluZm9ybWF0aW9uIHJlbGF0aXZlIHRvIHRoZSBGL1cgZW5hYmxlZCBzdGF0ZSwgaXQgaXMgbm90IGFzc2VydGVkCisqCXdoZXRoZXIgSENGX0FDVF9TQ0FOLCBIQ0ZfQUNUX1BSU19TQ0FOIG9yIEhDRl9BQ1RfVEFMTElFUyBhcmUgb25seSB1c2VkIHdoaWxlIEYvVyBpcyBlbmFibGVkLgorKgorKi5ESUFHUkFNCisqIDA6IFRoZSBhc3NlcnQgZW1iZWRkZWQgaW4gSENGTE9HRU5UUlkgY2hlY2tzIGFnYWluc3QgcmUtZW50cmFuY3kuIFJlLWVudHJhbmN5IGNvdWxkIGJlIGNhdXNlZCBieSBhIE1TRiBsb2dpYworKglhdCB0YXNrLWxldmVsIGNhbGxpbmcgaGNmX2Z1bmN0aW9ucyB3aXRob3V0IHNoaWVsZGluZyB3aXRoIEhDRl9BQ1RfT04vX09GRi4gSG93ZXZlciB0aGUgSENGX0FDVF9JTlRfT0ZGCisqCWFjdGlvbiBpdHNlbGYgY2FuIHBlciBkZWZpbml0aW9uIG5vdCBiZSBwcm90ZWN0ZWQgdGhpcyB3YXkuIEJhc2VkIG9uIGNvZGUgaW5zcGVjdGlvbiwgaXQgY2FuIGJlIGNvbmNsdWRlZCwKKyoJdGhhdCB0aGVyZSBpcyBubyByZS1lbnRyYW5jeSBQUk9CTEVNIGluIHRoaXMgcGFydGljdWxhciBmbG93LiBJdCBkb2VzIG5vdCBzZWVtIHdvcnRoIHRoZSB0cm91YmxlIHRvCisqCWV4cGxpY2l0bHkgY2hlY2sgZm9yIHRoaXMgY29uZGl0aW9uIChhbHRob3VnaCB0aGVyZSB3YXMgYSByZXBvcnQgb2YgYW4gTVNGIHdoaWNoIHJhbiBpbnRvIHRoaXMgYXNzZXJ0LgorKiAyOklGQl9JbnRPZmZDbnQgaXMgdXNlZCB0byBiYWxhbmNlIHRoZSBJTlRfT0ZGIGFuZCBJTlRfT04gY2FsbHMuICBEaXNhYmxpbmcgb2YgdGhlIGludGVycnVwdHMgaXMgYWNoaWV2ZWQgYnkKKyoJd3JpdGluZyBhIHplcm8gdG8gdGhlIEhlcm1lcyBJbnRFbiByZWdpc3Rlci4gIEluIGEgc2hhcmVkIGludGVycnVwdCBlbnZpcm9ubWVudCAoZS5nLiB0aGUgbWluaS1QQ0kgTkRJUworKglkcml2ZXIpIGl0IGlzIGNvbnNpZGVyZWQgbW9yZSBjb3JyZWN0IHRvIHJldHVybiB0aGUgc3RhdHVzIEhDRl9JTlRfUEVORElORyBpZiBhbmQgb25seSBpZiwgdGhlIGN1cnJlbnQKKyoJaW52b2NhdGlvbiBvZiBoY2Zfc2VydmljZV9uaWMgaXMgKGFwcGFyZW50bHkpIGNhbGxlZCBpbiB0aGUgSVNSIHdoZW4gdGhlIElTUiB3YXMgYWN0aXZhdGVkIGFzIHJlc3VsdCBvZiBhCisqCWNoYW5nZSBpbiBIUkVHX0VWX1NUQVQgbWF0Y2hpbmcgYSBiaXQgaW4gSFJFR19JTlRfRU4sIGkuZS4gbm90IGlmIGludm9rZWQgYXMgcmVzdWx0IG9mIGFub3RoZXIgZGV2aWNlCisqCWdlbmVyYXRpbmcgYW4gaW50ZXJydXB0IG9uIHRoZSBzaGFyZWQgaW50ZXJydXB0IGxpbmUuCisqCU5vdGUgMTogaXQgaGFzIGJlZW4gb2JzZXJ2ZWQgdGhhdCB1bmRlciBjZXJ0YWluIGFkdmVyc2UgY29uZGl0aW9ucyBvbiBjZXJ0YWluIHBsYXRmb3JtcyB0aGUgd3JpdGluZyBvZgorKglIUkVHX0lOVF9FTiBjYW4gYXBwYXJlbnRseSBmYWlsLCB0aGVyZWZvciBpdCBpcyBwYXJhbW91bnQgdGhhdCBIUkVHX0lOVF9FTiBpcyB3cml0dGVuIGFnYWluIHdpdGggMCBmb3IKKyoJZWFjaCBhbmQgZXZlcnkgY2FsbCB0byBIQ0ZfQUNUX0lOVF9PRkYuCisqCU5vdGUgMjogaXQgaGFzIGJlZW4gb2JzZXJ2ZWQgdGhhdCB1bmRlciBjZXJ0YWluIEgvVyAmIFMvVyBhcmNoaXRlY3R1cmVzIHRoaXMgbG9naWMgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMKKyoJbm8gTklDIGF0IGFsbC4gVG8gY2F0ZXIgZm9yIHRoaXMsIHRoZSB2YWx1ZSBvZiBIUkVHX0lOVF9FTiBpcyB2YWxpZGF0ZWQuIElmIHRoZSB1bnVzZWQgYml0IDB4MDEwMCBpcyBzZXQsCisqCWl0IGlzIGFzc3VtZWQgdGhlcmUgaXMgbm8gTklDLgorKglOb3RlIDM6IER1cmluZyB0aGUgZG93bmxvYWQgcHJvY2Vzcywgc29tZSB2ZXJzaW9ucyBvZiB0aGUgRi9XIHJlc2V0IEhSRUdfU1dfMCwgaGVuY2UgY2hlY2tpbmcgdGhpcworKglyZWdpc3RlciBmb3IgSENGX01BR0lDICh0aGUgY2xhc3NpY2FsIE5JQyBwcmVzZW5jZSB0ZXN0KSB3aGVuIEhDRl9BQ1RfSU5UX09GRiBpcyBjYWxsZWQgZHVlIHRvIGFub3RoZXIKKyoJY2FyZCBpbnRlcnJ1cHRpbmcgdmlhIGEgc2hhcmVkIElSUSBkdXJpbmcgYSBkb3dubG9hZCwgZmFpbHMuCisqNDoJVGhlIGNvbnN0cnVjdGlvbiAiaWYgKCBpZmJwLT5JRkJfSW50T2ZmQ250LS0gPT0gMCApIiBpcyBvcHRpbWFsIChpbiB0aGUgc2Vuc2Ugb2Ygc2hvcnRlc3QvcXVpY2tlc3QKKyoJcGF0aCBpbiBlcnJvciBmcmVlIGZsb3dzKSBidXQgTk9UIGZhaWwgc2FmZSBpbiBjYXNlIG9mIHRvbyBtYW55IElOVF9PTiBpbnZvY2F0aW9ucyBjb21wYXJlZCB0byBJTlRfT0ZGKS4KKyoJRW5hYmxpbmcgb2YgdGhlIGludGVycnVwdHMgaXMgYWNoaWV2ZWQgYnkgd3JpdGluZyB0aGUgSGVybWVzIEludEVuIHJlZ2lzdGVyLgorKgkgLSBJZiB0aGUgSENGIGlzIGluIERlZnVuY3QgbW9kZSwgdGhlIGludGVycnVwdHMgc3RheSBkaXNhYmxlZC4KKyoJIC0gVW5kZXIgIm5vcm1hbCIgY29uZGl0aW9ucywgdGhlIEhDRiBpcyBvbmx5IGludGVyZXN0ZWQgaW4gSW5mbyBFdmVudHMsIFJ4IEV2ZW50cyBhbmQgTm90aWZ5IEV2ZW50cy4KKyoJIC0gV2hlbiB0aGUgSENGIGlzIG91dCBvZiBUeC9Ob3RpZnkgcmVzb3VyY2VzLCB0aGUgSENGIGlzIGFsc28gaW50ZXJlc3RlZCBpbiBBbGxvYyBFdmVudHMuCisqCSAtIHZpYSBIQ0ZfRVhULCB0aGUgTVNGIHByb2dyYW1tZXIgY2FuIGFsc28gcmVxdWVzdCBIUkVHX0VWX1RJQ0sgYW5kL29yIEhSRUdfRVZfVFhfRVhDIGludGVycnVwdHMuCisqCUZvciBETUEgb3BlcmF0aW9uLCB0aGUgRE1BIGhhcmR3YXJlIGhhbmRsZXMgdGhlIGFsbG9jIGV2ZW50cy4gVGhlIERNQSBlbmdpbmUgd2lsbCBnZW5lcmF0ZSBhICdUeERtYURvbmUnCisqCWV2ZW50IGFzIHNvb24gYXMgaXQgaGFzIHB1bXBlZCBhIGZyYW1lIGZyb20gaG9zdCByYW0gaW50byBOSUMtUkFNIChub3RlIHRoYXQgdGhlIGZyYW1lIGRvZXMgbm90IGhhdmUgdG8gYmUKKyoJdHJhbnNtaXR0ZWQgdGhlbiksIGFuZCBhICdSeERtYURvbmUnIGV2ZW50IGFzIHNvb24gYXMgYSByZWNlaXZlZCBmcmFtZSBoYXMgYmVlbiBwdW1wZWQgZnJvbSBOSUMtUkFNIGludG8KKyoJaG9zdCByYW0uICBOb3RlIHRoYXQgdGhlICdhbGxvYycgZXZlbnQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBldmVudC1tYXNrLCBiZWNhdXNlIHRoZSBETUEgZW5naW5lIHdpbGwKKyoJcmVhY3QgdG8gYW5kIGFja25vd2xlZGdlIHRoaXMgZXZlbnQuCisqNjoJYWNrIHRoZSAib2xkIiBSeC1ldmVudC4gU2VlICJSeCBCdWZmZXIgZnJlZSBzdHJhdGVneSIgaW4gaGNmX3NlcnZpY2VfbmljIGFib3ZlIGZvciBtb3JlIGV4cGxhbmF0aW9uLgorKglJRkJfUnhGSUQgYW5kIElGQl9SeExlbiBtdXN0IGJlIGNsZWFyZWQgdG8gYnJpbmcgYm90aCB0aGUgaW50ZXJuYWwgSENGIGhvdXNlIGtlZXBpbmcgYW5kIHRoZSBpbmZvcm1hdGlvbgorKglzdXBwbGllZCB0byB0aGUgTVNGIGluIHRoZSBzdGF0ZSAibm8gZnJhbWUgcmVjZWl2ZWQiLgorKjg6CVRoZSBIQ0ZfQUNUX1NDQU4sIEhDRl9BQ1RfUFJTX1NDQU4gYW5kIEhDRl9BQ1RfVEFMTElFUyBhY3Rpdml0eSBhcmUgbWVyZ2VkIGJ5ICJjbGV2ZXIiIGFsZ2VicmFpYworKgltYW5pcHVsYXRpb25zIG9mIHRoZSBSSUQtdmFsdWVzIGFuZCBhY3Rpb24gY29kZXMsIHNvIGZvcmVnb2luZyByb2J1c3RuZXNzIGFnYWluc3QgbWlncmF0aW9uIHByb2JsZW1zIGZvcgorKgllYXNlIG9mIGltcGxlbWVudGF0aW9uLiBUaGUgYXNzdW1wdGlvbnMgYWJvdXQgbnVtZXJpY2FsIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBDRkdfVEFMTElFUyBldGMgYW5kCisqCUhDRl9BQ1RfVEFMTElFUyBldGMgYXJlIGNoZWNrZWQgYnkgdGhlICIjaWYiIHN0YXRlbWVudHMganVzdCBwcmlvciB0byB0aGUgYm9keSBvZiB0aGlzIHJvdXRpbmUsIHJlc3VsdGluZworKglpbjogZXJyICJtYWludGVuYW5jZSIgZHVyaW5nIGNvbXBpbGF0aW9uIGlmIHRoZSBhc3N1bXB0aW9ucyBhcmUgbm8gbG9uZ2VyIG1ldC4gVGhlIHdyaXRpbmcgb2YgSFJFR19QQVJBTV8xCisqCXdpdGggMHgzRkZGIGluIGNhc2Ugb2YgYW4gUFJTIHNjYW4sIGlzIGEga2x1ZGdlIHRvIGdldCBhcm91bmQgbGFjayBvZiBzcGVjaWZpY2F0aW9uLCBoZW5jZSBkaWZmZXJlbnQKKyoJaW1wbGVtZW50YXRpb24gaW4gRi9XIGFuZCBIb3N0LgorKglXaGVuIHRoZXJlIGlzIG5vIE5JQyBSQU0gYXZhaWxhYmxlLCBzb21lIHZlcnNpb25zIG9mIHRoZSBIZXJtZXMgRi9XIGRvIHJlcG9ydCAweDdGMDAgYXMgZXJyb3IgaW4gdGhlCisqCVJlc3VsdCBmaWVsZCBvZiB0aGUgU3RhdHVzIHJlZ2lzdGVyIGFuZCBzb21lIEYvVyB2ZXJzaW9ucyBkb24ndC4gVG8gbWFzayB0aGlzIGRpZmZlcmVuY2UgdG8gdGhlIE1TRiBhbGwKKyoJcmV0dXJuIGNvZGVzIG9mIHRoZSBIZXJtZXMgYXJlIGlnbm9yZWQgKCJiZXN0IiBhbmQgIm1vc3Qgc2ltcGxlIiBzb2x1dGlvbiB0byB0aGVzZSB0eXBlcyBvZiBhbmFsb21pZXMgd2l0aAorKglhbiBhY2NlcHRhYmxlIGxvc3MgZHVlIHRvIGlnbm9yaW5nIGFsbCBlcnJvciBzaXR1YXRpb25zIGFzIHdlbGwpLgorKglUaGUgIk5vIGlucXVpcmUgc3BhY2UiIGlzIHJlcG9ydGVkIHZpYSB0aGUgSGVybWVzIHRhbGxpZXMuCisqMzA6IGRvIG5vdCBIQ0ZBU1NFUlQoIHJjLCByYyApIHNpbmNlIHJjID09IEhDRl9JTlRfUEVORElORyBpcyBubyBlcnJvcgorKgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9ISUk1ICkgPT0gMAorI2lmIENGR19TQ0FOICE9IENGR19UQUxMSUVTIC0gSENGX0FDVF9UQUxMSUVTICsgSENGX0FDVF9TQ0FOCitlcnI6ICJtYWludGVuYW5jZSIgYXBwYXJlbnRseSBpbnZpb2xhdGVkIHRoZSB1bmRlcmx5aW5nIGFzc3VtcHRpb24gYWJvdXQgdGhlIG51bWVyaWNhbCB2YWx1ZXMgb2YgdGhlc2UgbWFjcm9zCisjZW5kaWYKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9ISUk1CisjaWYgQ0ZHX1BSU19TQ0FOICE9IENGR19UQUxMSUVTIC0gSENGX0FDVF9UQUxMSUVTICsgSENGX0FDVF9QUlNfU0NBTgorZXJyOiAibWFpbnRlbmFuY2UiIGFwcGFyZW50bHkgaW52aW9sYXRlZCB0aGUgdW5kZXJseWluZyBhc3N1bXB0aW9uIGFib3V0IHRoZSBudW1lcmljYWwgdmFsdWVzIG9mIHRoZXNlIG1hY3JvcworI2VuZGlmCitpbnQKK2hjZl9hY3Rpb24oIElGQlAgaWZicCwgaGNmXzE2IGFjdGlvbiApCit7CitpbnQJcmMgPSBIQ0ZfU1VDQ0VTUzsKKworCUhDRkFTU0VSVCggaWZicC0+SUZCX01hZ2ljID09IEhDRl9NQUdJQywgaWZicC0+SUZCX01hZ2ljICkKKyNpZiBIQ0ZfSU5UX09OCisJSENGTE9HRU5UUlkoIGFjdGlvbiA9PSBIQ0ZfQUNUX0lOVF9GT1JDRV9PTiA/IEhDRl9UUkFDRV9BQ1RJT05fS0xVREdFIDogSENGX1RSQUNFX0FDVElPTiwgYWN0aW9uICkJCQkJCQkJCQkJCQkJCS8qIDAgKi8KKyNpZiAoSENGX1NMRUVQKQorCUhDRkFTU0VSVCggaWZicC0+SUZCX0ludE9mZkNudCAhPSAweEZGRkUgfHwgYWN0aW9uID09IEhDRl9BQ1RfSU5UX09GRiwKKwkJCSAgIE1FUkdFXzIoIGFjdGlvbiwgaWZicC0+SUZCX0ludE9mZkNudCApICkKKyNlbHNlCisJSENGQVNTRVJUKCBpZmJwLT5JRkJfSW50T2ZmQ250ICE9IDB4RkZGRSwgYWN0aW9uICkKKyNlbmRpZiAvLyBIQ0ZfU0xFRVAKKwlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9JbnRPZmZDbnQgIT0gMHhGRkZGIHx8CisJCQkgICBhY3Rpb24gPT0gSENGX0FDVF9JTlRfT0ZGIHx8IGFjdGlvbiA9PSBIQ0ZfQUNUX0lOVF9GT1JDRV9PTiwgIGFjdGlvbiApCisJSENGQVNTRVJUKCBpZmJwLT5JRkJfSW50T2ZmQ250IDw9IDE2IHx8IGlmYnAtPklGQl9JbnRPZmZDbnQgPj0gMHhGRkZFLAorCQkJICAgTUVSR0VfMiggYWN0aW9uLCBpZmJwLT5JRkJfSW50T2ZmQ250ICkgKQkvL25lc3RpbmcgbW9yZSB0aGFuIDE2IGRlZXAgc2VlbXMgdW5yZWFzb25hYmxlCisjZW5kaWYgLy8gSENGX0lOVF9PTgorCisJc3dpdGNoIChhY3Rpb24pIHsKKyNpZiBIQ0ZfSU5UX09OCitoY2ZfMTYJaTsKKwkgIGNhc2UgSENGX0FDVF9JTlRfT0ZGOgkJCQkJCS8vIERpc2FibGUgSW50ZXJydXB0IGdlbmVyYXRpb24KKyNpZiBIQ0ZfU0xFRVAKKwkJaWYgKCBpZmJwLT5JRkJfSW50T2ZmQ250ID09IDB4RkZGRSApIHsJLy8gV2FrZVVwIHRlc3QJOz90aWUgdGhpcyB0byB0aGUgIm5ldyIgc3VwZXItTGlua1N0YXQKKwkJCWlmYnAtPklGQl9JbnRPZmZDbnQrKzsJCQkJCQkvLyByZXN0b3JlIGNvbnZlbnRpb25hbCBJL0YKKwkJCU9QVyhIUkVHX0lPLCBIUkVHX0lPX1dBS0VVUF9BU1lOQyApOwkJLy8gc2V0IHdha2V1cCBiaXQKKwkJCU9QVyhIUkVHX0lPLCBIUkVHX0lPX1dBS0VVUF9BU1lOQyApOwkJLy8gc2V0IHdha2V1cCBiaXQgdG8gY291bnRlcmFjdCB0aGUgY2xlYXJpbmcgYnkgRi9XCisJCQkvLyA4MDAgdXMgbGF0ZW5jeSBiZWZvcmUgRlcgc3dpdGNoZXMgdG8gaGlnaCBwb3dlcgorCQkJTVNGX1dBSVQoODAwKTsJCQkJCQkJCS8vIE1TRi1kZWZpbmVkIGZ1bmN0aW9uIHRvIHdhaXQgbiBtaWNyb3NlY29uZHMuCisvL09PUgkJaWYgKCBpZmJwLT5JRkJfRFNMaW5rU3RhdCAmIENGR19MSU5LX1NUQVRfRFNfT09SICkgeyAvLyBPdXRPZlJhbmdlCisvLwkJCQlwcmludGsoICI8NT5BQ1RfSU5UX09GRjogRGVlcHNsZWVwIHBoYXNlIHRlcm1pbmF0ZWQsIGVuYWJsZSBhbmQgZ28gdG8gQXdhaXRDb25uZWN0aW9uXG4iICk7CQkvLzs/cmVtb3ZlIG1lIDEgZGF5CisvLwkJCQloY2ZfY250bCggaWZicCwgSENGX0NOVExfRU5BQkxFICk7CisvLwkJCX0KKy8vCQkJaWZicC0+SUZCX0RTTGlua1N0YXQgJj0gfiggQ0ZHX0xJTktfU1RBVF9EU19JUiB8IENGR19MSU5LX1NUQVRfRFNfT09SKTsJLy9jbGVhciBJUi9PT1Igc3RhdGUKKwkJfQorI2VuZGlmIC8vIEhDRl9TTEVFUAorLyoyKi8JaWZicC0+SUZCX0ludE9mZkNudCsrOworLy8hICAgICByYyA9IDA7CisJCWkgPSBJUFcoIEhSRUdfSU5UX0VOICk7CisJCU9QVyggSFJFR19JTlRfRU4sIDAgKTsKKwkJaWYgKCBpICYgMHgxMDAwICkgeworCQkJcmMgPSBIQ0ZfRVJSX05PX05JQzsKKwkJfSBlbHNlIHsKKwkJCWlmICggaSAmIElQVyggSFJFR19FVl9TVEFUICkgKSB7CisJCQkJcmMgPSBIQ0ZfSU5UX1BFTkRJTkc7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkgIGNhc2UgSENGX0FDVF9JTlRfRk9SQ0VfT046CQkJCS8vIEVuZm9yY2UgRW5hYmxlIEludGVycnVwdCBnZW5lcmF0aW9uCisJCWlmYnAtPklGQl9JbnRPZmZDbnQgPSAwOworCQkvL0ZhbGwgdGhyb3VnaCBpbiBIQ0ZfQUNUX0lOVF9PTgorCisJICBjYXNlIEhDRl9BQ1RfSU5UX09OOgkJCQkJCS8vIEVuYWJsZSBJbnRlcnJ1cHQgZ2VuZXJhdGlvbgorLyo0Ki8JaWYgKCBpZmJwLT5JRkJfSW50T2ZmQ250LS0gPT0gMCAmJiBpZmJwLT5JRkJfQ2FyZFN0YXQgPT0gMCApIHsKKwkJCQkJCQkJCQkJCS8vZGV0ZXJtaW5lIEludGVycnVwdCBFdmVudCBtYXNrCisjaWYgSENGX0RNQQorCQkJaWYgKCBpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEgKSB7CisJCQkJaSA9IEhSRUdfRVZfSU5GTyB8IEhSRUdfRVZfUkRNQUQgfCBIUkVHX0VWX1RETUFEIHwgSFJFR19FVl9UWF9FWFQ7CS8vbWFzayB3aGVuIERNQSBhY3RpdmUKKwkJCX0gZWxzZQorI2VuZGlmIC8vIEhDRl9ETUEKKwkJCXsKKwkJCQlpID0gSFJFR19FVl9JTkZPIHwgSFJFR19FVl9SWCB8IEhSRUdfRVZfVFhfRVhUOwkJCQkJCS8vbWFzayB3aGVuIERNQSBub3QgYWN0aXZlCisJCQkJaWYgKCBpZmJwLT5JRkJfUnNjSW5kID09IDAgKSB7CisJCQkJCWkgfD0gSFJFR19FVl9BTExPQzsJCQkJCQkJCQkJCQkvL21hc2sgd2hlbiBubyBUeEZJRCBhdmFpbGFibGUKKwkJCQl9CisJCQl9CisjaWYgSENGX1NMRUVQCisJCQlpZiAoICggSVBXKEhSRUdfRVZfU1RBVCkgJiAoIGkgfCBIUkVHX0VWX1NMRUVQX1JFUSApICkgPT0gSFJFR19FVl9TTEVFUF9SRVEgKSB7CisJCQkJLy8gZmlybXdhcmUgaW5kaWNhdGVzIGl0IHdvdWxkIGxpa2UgdG8gZ28gaW50byBzbGVlcCBtb2R1cworCQkJCS8vIG9ubHkgYWNrbm93bGVkZ2UgdGhpcyByZXF1ZXN0IGlmIG5vIG90aGVyIGV2ZW50cyB0aGF0IGNhbiBjYXVzZSBhbiBpbnRlcnJ1cHQgYXJlIHBlbmRpbmcKKwkJCQlpZmJwLT5JRkJfSW50T2ZmQ250LS07CQkJLy9iZWNvbWVzIDB4RkZGRQorICAgICAgICAgICAgCU9QVyggSFJFR19JTlRfRU4sIGkgfCBIUkVHX0VWX1RJQ0sgKTsKKwkJCQlPUFcoIEhSRUdfRVZfQUNLLCBIUkVHX0VWX1NMRUVQX1JFUSB8IEhSRUdfRVZfVElDSyB8IEhSRUdfRVZfQUNLX1JFR19SRUFEWSApOworCQkJfSBlbHNlCisjZW5kaWYgLy8gSENGX1NMRUVQCisJCQl7CisgICAgICAgICAgICAJT1BXKCBIUkVHX0lOVF9FTiwgaSB8IEhSRUdfRVZfU0xFRVBfUkVRICk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisjZW5kaWYgLy8gSENGX0lOVF9PTgorCisjaWYgKEhDRl9TTEVFUCkgJiBIQ0ZfRERTCisJICBjYXNlIEhDRl9BQ1RfU0xFRVA6CQkJCQkJLy8gRERTIFNsZWVwIHJlcXVlc3QKKwkJaGNmX2NudGwoIGlmYnAsIEhDRl9DTlRMX0RJU0FCTEUgKTsKKwkJY21kX2V4ZSggaWZicCwgSENNRF9TTEVFUCwgMCApOworCQlicmVhazsKKy8vIAkgIGNhc2UgSENGX0FDVF9XQUtFVVA6CQkJCQkJLy8gRERTIFdha2V1cCByZXF1ZXN0CisvLyAJCUhDRkFTU0VSVCggaWZicC0+SUZCX0ludE9mZkNudCA9PSAweEZGRkUsIGlmYnAtPklGQl9JbnRPZmZDbnQgKQorLy8gCQlpZmJwLT5JRkJfSW50T2ZmQ250Kys7CQkJCQkvLyByZXN0b3JlIGNvbnZlbnRpb25hbCBJL0YKKy8vIAkJT1BXKCBIUkVHX0lPLCBIUkVHX0lPX1dBS0VVUF9BU1lOQyApOworLy8gCQlNU0ZfV0FJVCg4MDApOwkJCQkJCQkvLyBNU0YtZGVmaW5lZCBmdW5jdGlvbiB0byB3YWl0IG4gbWljcm9zZWNvbmRzLgorLy8gCQlyYyA9IGhjZl9hY3Rpb24oIGlmYnAsIEhDRl9BQ1RfSU5UX09GRiApOwkvKmJvZ3VzLCBJRkJfSW50T2ZmQ250ID09IDB4RkZGRiwgc28gaWYgeW91IGNhcmVmdWxseSBsb29rCisvLyAJCQkJCQkJCQkJCQkJICphdCB0aGUgI2lmIEhDRl9ERFMgc3RhdGVtZW50cywgSENGX0FDVF9JTlRfT0ZGIGlzIGVtcHR5CisvLyAJCQkJCQkJCQkJCQkJICpmb3IgRERTLiAiTXVjaCIgYmV0dGVyIHdvdWxkIGJlIHRvIG1lcmdlIHRoZSBmbG93cyBmb3IKKy8vIAkJCQkJCQkJCQkJCQkgKkREUyBhbmQgREVFUF9TTEVFUAorLy8gCQkJCQkJCQkJCQkJCSAqLworLy8gCQlicmVhazsKKyNlbmRpZiAvLyBIQ0ZfRERTCisKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfQ0NYCisJICBjYXNlIEhDRl9BQ1RfQ0NYX09OOgkJCQkJCS8vIGVuYWJsZSBDS0lQCisJICBjYXNlIEhDRl9BQ1RfQ0NYX09GRjoJCQkJCQkvLyBkaXNhYmxlIENLSVAKKwkJaWZicC0+SUZCX0NLSVBTdGF0ID0gYWN0aW9uOworCQlicmVhazsKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9DQ1gKKworCSAgY2FzZSBIQ0ZfQUNUX1JYX0FDSzoJCQkJCQkvL1JlY2VpdmVyIEFDSworLyo2Ki8JaWYgKCBpZmJwLT5JRkJfUnhGSUQgKSB7CisJCQlEQVdBX0FDSyggSFJFR19FVl9SWCApOworCQl9CisJCWlmYnAtPklGQl9SeEZJRCA9IGlmYnAtPklGQl9SeExlbiA9IDA7CisJCWJyZWFrOworCisvKjgqLyBjYXNlCUhDRl9BQ1RfUFJTX1NDQU46CQkJCQkvLyBIZXJtZXMgUFJTIFNjYW4gKEYxMDIpCisJCU9QVyggSFJFR19QQVJBTV8xLCAweDNGRkYgKTsKKwkJCS8vRmFsbCB0aHJvdWdoIGluIEhDRl9BQ1RfVEFMTElFUworCSAgY2FzZSBIQ0ZfQUNUX1RBTExJRVM6CQkJCQkJLy8gSGVybWVzIElucXVpcmUgVGFsbGllcyAoRjEwMCkKKyNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9ISUk1ICkgPT0gMAorCSAgY2FzZSBIQ0ZfQUNUX1NDQU46CQkJCQkJLy8gSGVybWVzIElucXVpcmUgU2NhbiAoRjEwMSkKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9ISUk1CisJCS8qISEgdGhlIGFzc3VtcHRpb25zIGFib3V0IG51bWVyaWNhbCByZWxhdGlvbnNoaXBzIGJldHdlZW4gQ0ZHX1RBTExJRVMgZXRjIGFuZCBIQ0ZfQUNUX1RBTExJRVMgZXRjCisJCSAqICAgYXJlIGNoZWNrZWQgYnkgI2lmIHN0YXRlbWVudHMganVzdCBwcmlvciB0byB0aGlzIHJvdXRpbmUgcmVzdWx0aW5nIGluOiBlcnIgIm1haW50ZW5hbmNlIgkqLworCQljbWRfZXhlKCBpZmJwLCBIQ01EX0lOUVVJUkUsIGFjdGlvbiAtIEhDRl9BQ1RfVEFMTElFUyArIENGR19UQUxMSUVTICk7CisJCWJyZWFrOworCisJICBkZWZhdWx0OgorCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgYWN0aW9uICkKKwkJYnJlYWs7CisJfQorCS8vISBkbyBub3QgSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKQkJCQkJCQkJCQkJCQkJLyogMzAqLworCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9BQ1RJT04gKQorCXJldHVybiByYzsKK30gLy8gaGNmX2FjdGlvbgorI2VuZGlmIC8vIEhDRl9ETF9PTkxZCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5NT0RVTEUJCWludCBoY2ZfY250bCggSUZCUCBpZmJwLCBoY2ZfMTYgY21kICkKKyouUFVSUE9TRQkJQ29ubmVjdCBvciBkaXNjb25uZWN0IGEgc3BlY2lmaWMgcG9ydCB0byBhIHNwZWNpZmljIG5ldHdvcmsuCisqISEgIDs/Pz8/Pz8/Pz8/Pz8/Pz8/IGNvbnRpbnVlIG5lZWRzIG1vcmUgZXhwbGFuYXRpb24KKyoJCQkJcmVjb3ZlcnMgYnkgbWVhbnMgb2YgImNvbnRpbnVlIiB3aGVuIHRoZSBjb25uZWN0IHByb2NlcyBpbiBDQ1ggbW9kZSBmYWlscworKgkJCQlFbmFibGVzIG9yIGRpc2FibGVzIGRhdGEgdHJhbnNtaXNzaW9uIGFuZCByZWNlcHRpb24gZm9yIHRoZSBOSUMuCisqCQkJCUFjdGl2YXRlcyBzdGF0aWMgTklDIGNvbmZpZ3VyYXRpb24gZm9yIGEgc3BlY2lmaWMgcG9ydCBhdCBjb25uZWN0LgorKgkJCQlBY3RpdmF0ZXMgc3RhdGljIGNvbmZpZ3VyYXRpb24gZm9yIGFsbCBwb3J0cyBhdCBlbmFibGUuCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyoJY21kCQkJMHgwMDFGOglIZXJtZXMgY29tbWFuZCAoZGlzYWJsZSwgZW5hYmxlLCBjb25uZWN0LCBkaXNjb25uZWN0LCBjb250aW51ZSkKKyoJCQkJCUhDRl9DTlRMX0VOQUJMRQkJRW5hYmxlCisqCQkJCQlIQ0ZfQ05UTF9ESVNBQkxFICAgIERpc2FibGUKKyoJCQkJCUhDRl9DTlRMX0NPTlRJTlVFCUNvbnRpbnVlCisqCQkJCQlIQ0ZfQ05UTF9DT05ORUNUICAgIENvbm5lY3QKKyoJCQkJCUhDRl9DTlRMX0RJU0NPTk5FQ1QgRGlzY29ubmVjdAorKgkJCQkweDAxMDA6IGNvbW1hbmQgcXVhbGlmaWVyIChjb250aW51ZSkKKyoJCQkJCUhDTURfUkVUUlkJCQlyZXRyeSBmbGFnCisqCQkJCTB4MDcwMDogIHBvcnQgbnVtYmVyIChjb25uZWN0L2Rpc2Nvbm5lY3QpCisqCQkJCQlIQ0ZfUE9SVF8wICAgICAgICAgIE1BQyBQb3J0IDAKKyoJCQkJCUhDRl9QT1JUXzEgICAgICAgICAgTUFDIFBvcnQgMQorKgkJCQkJSENGX1BPUlRfMiAgICAgICAgICBNQUMgUG9ydCAyCisqCQkJCQlIQ0ZfUE9SVF8zICAgICAgICAgIE1BQyBQb3J0IDMKKyoJCQkJCUhDRl9QT1JUXzQgICAgICAgICAgTUFDIFBvcnQgNAorKgkJCQkJSENGX1BPUlRfNSAgICAgICAgICBNQUMgUG9ydCA1CisqCQkJCQlIQ0ZfUE9SVF82ICAgICAgICAgIE1BQyBQb3J0IDYKKyoKKyouUkVUVVJOUworKglIQ0ZfU1VDQ0VTUworKiEhCXZpYSBjbWRfZXhlCisqCUhDRl9FUlJfTk9fTklDCisqCUhDRl9FUlJfREVGVU5DVF8uLi4KKyoJSENGX0VSUl9USU1FX09VVAorKgorKi5ERVNDUklQVElPTgorKiBUaGUgcGFyYW1ldGVyIGNtZCBjb250YWlucyBhIG51bWJlciBvZiBzdWJmaWVsZHMuCisqIFRoZSBhY3R1YWwgdmFsdWUgZm9yIGNtZCBpcyBjcmVhdGVkIGJ5IGxvZ2ljYWwgb3ItaW5nIHRoZSBhcHByb3ByaWF0ZSBtbmVtb25pY3MgZm9yIHRoZSBzdWJmaWVsZHMuCisqIFRoZSBmaWVsZCAweDAwMUYgY29udGFpbnMgdGhlIGNvbW1hbmQgY29kZQorKiAgLSBIQ0ZfQ05UTF9FTkFCTEUKKyogIC0gSENGX0NOVExfRElTQUJMRQorKiAgLSBIQ0ZfQ05UTF9DT05ORUNUCisqICAtIEhDRl9DTlRMX0RJU0NPTk5FQ1QKKyogIC0gSENGX0NOVExfQ09OVElOVUUKKyoKKyogRm9yIEhDRl9DTlRMX0NPTlRJTlVFLCB0aGUgZmllbGQgMHgwMTAwIGNvbnRhaW5zIHRoZSByZXRyeSBmbGFnIEhDTURfUkVUUlkuCisqIEZvciBIQ0ZfQ05UTF9DT05ORUNUIGFuZCBIQ0ZfQ05UTF9ESVNDT05ORUNULCB0aGUgZmllbGQgMHgwNzAwIGNvbnRhaW5zIHRoZSBwb3J0IG51bWJlciBhcyBIQ0ZfUE9SVF8jLgorKiBGb3IgU3RhdGlvbiBhcyB3ZWxsIGFzIEFjY2Vzc1BvaW50IEYvVywgTUFDIFBvcnQgMCBpcyB0aGUgIm5vcm1hbCIgY29tbXVuaWNhdGlvbiBjaGFubmVsLgorKiBGb3IgQWNjZXNzUG9pbnQgRi9XLCBNQUMgUG9ydCAxIHRocm91Z2ggNiBjb250cm9sIHRoZSBXRFMgbGlua3MuCisqCisqIE5vdGUgdGhhdCBkZXNwaXRlIHRoZSBuYW1lcyBIQ0ZfQ05UTF9ESVNBQkxFIGFuZCBIQ0ZfQ05UTF9FTkFCTEUsIGhjZl9jbnRsIGRvZXMgbm90IGluZmx1ZW5jZSB0aGUgTklDCisqIEludGVycnVwdHMgbW9kZS4KKyoKKyogVGhlIENvbm5lY3QgaXMgdXNlZCBieSB0aGUgTVNGIHRvIGJyaW5nIGEgcGFydGljdWxhciBwb3J0IGluIGFuIGluYWN0aXZlIHN0YXRlIGFzIGZhciBhcyBkYXRhIHRyYW5zbWlzc2lvbgorKiBhbmQgcmVjZXB0aW9uIGFyZSBjb25jZXJuZWQuCisqIFdoZW4gYSBwYXJ0aWN1bGFyIHBvcnQgaXMgZGlzY29ubmVjdGVkOgorKiAtIHRoZSBGL1cgZGlzYWJsZXMgdGhlIHJlY2VpdmVyIGZvciB0aGF0IHBvcnQuCisqIC0gdGhlIEYvVyBpZ25vcmVzIHNlbmQgY29tbWFuZHMgZm9yIHRoYXQgcG9ydC4KKyogLSBhbGwgZnJhbWVzIChSZWNlaXZlIGFzIHdlbGwgYXMgcGVuZGluZyBUcmFuc21pdCkgZm9yIHRoYXQgcG9ydCBvbiB0aGUgTklDIGFyZSBkaXNjYXJkZWQuCisqCisqIFdoZW4gdGhlIE5JQyBpcyBkaXNhYmxlZCwgYWJvdmUgbGlzdCBhcHBsaWVzIHRvIGFsbCBwb3J0cywgaS5lLiB0aGUgcmVzdWx0IGlzIGxpa2UgYWxsIHBvcnRzIGFyZQorKiBkaXNjb25uZWN0ZWQuCisqCisqIFdoZW4gYSBwYXJ0aWN1bGFyIHBvcnQgaXMgY29ubmVjdGVkOgorKiAtIHRoZSBGL1cgZWZmZWN0dWF0ZXMgdGhlIHN0YXRpYyBjb25maWd1cmF0aW9uIGZvciB0aGF0IHBvcnQuCisqIC0gZW5hYmxlcyB0aGUgcmVjZWl2ZXIgZm9yIHRoYXQgcG9ydC4KKyogLSBhY2NlcHRzIHNlbmQgY29tbWFuZHMgZm9yIHRoYXQgcG9ydC4KKyoKKyogRW5hYmxpbmcgaGFzIHRoZSBmb2xsb3dpbmcgZWZmZWN0czoKKyogLSB0aGUgRi9XIGVmZmVjdHVhdGVzIHRoZSBzdGF0aWMgY29uZmlndXJhdGlvbiBmb3IgYWxsIHBvcnRzLgorKglUaGUgRi9XIG9ubHkgdXBkYXRlcyBpdHMgc3RhdGljIGNvbmZpZ3VyYXRpb24gYXQgYSB0cmFuc2l0aW9uIGZyb20gZGlzYWJsZWQgdG8gZW5hYmxlZCBvciBmcm9tCisqCWRpc2Nvbm5lY3RlZCB0byBjb25uZWN0ZWQuCisqCUluIG9yZGVyIHRvIGVuZm9yY2UgdGhlIHN0YXRpYyBjb25maWd1cmF0aW9uLCB0aGUgTVNGIG11c3QgYXNzdXJlIHRoYXQgc3VjaCBhIHRyYW5zaXRpb24gdGFrZXMgcGxhY2UuCisqCUR1ZSB0byBzdWNoIGEgZGlzYWJsZS9lbmFibGUgb3IgZGlzY29ubmVjdC9jb25uZWN0IHNlcXVlbmNlLCBSeC9UeCBmcmFtZXMgbWF5IGJlIGxvc3QsIGluIG90aGVyIHdvcmRzLAorKgljb25maWd1cmF0aW9uIG1heSBpbXBhY3QgY29tbXVuaWNhdGlvbi4KKyogLSBUaGUgRE1BIEVuZ2luZSAoaWYgYXBwbGljYWJsZSkgaXMgZW5hYmxlZC4KKyogTm90ZSB0aGF0IHRoZSBFbmFibGUgRnVuY3Rpb24gYnkgaXRzZWxmIG9ubHkgZW5hYmxlcyBkYXRhIHRyYW5zbWlzc2lvbiBhbmQgcmVjZXB0aW9uLCBpdAorKiBkb2VzIG5vdCBlbmFibGUgdGhlIEludGVycnVwdCBHZW5lcmF0aW9uIG1lY2hhbmlzbS4gVGhpcyBpcyBkb25lIGJ5IGhjZl9hY3Rpb24uCisqCisqIERpc2FibGluZyBoYXMgdGhlIGZvbGxvd2luZyBlZmZlY3RzOgorKiEhICA7Pz8/Pz9pcyB0aGUgZm9sbG93aW5nIHN0YXRlbWVudCByZWFsbHkgdHJ1ZQorKiAtIGl0IGFjdHMgYXMgYSBkaXNjb25uZWN0IG9uIGFsbCBwb3J0cy4KKyogLSBUaGUgRE1BIEVuZ2luZSAoaWYgYXBwbGljYWJsZSkgaXMgZGlzYWJsZWQuCisqCisqIEZvciBpbXBhY3Qgb2YgdGhlIGRpc2FibGUgY29tbWFuZCBvbiB0aGUgYmVoYXZpb3Igb2YgaGNmX2RtYV90eC9yeF9nZXQgc2VlIHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9ucy4KKyoKKyogQWx0aG91Z2ggdGhlIEVuYWJsZS9EaXNhYmxlIGFuZCBDb25uZWN0L0Rpc2Nvbm5lY3QgYXJlIGFudG9ueW1zLCB0aGVyZSBpcyBubyByZXN0cmljdGlvbiBvbiB0aGVpciBzZXF1ZW5jaW5nLAorKiBpbiBvdGhlciB3b3JkcywgdGhleSBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGluIGFyYml0cmFyeSBzZXF1ZW5jZSB3aXRob3V0IGJlaW5nIHBhaXJlZCBvciBiYWxhbmNlZC4KKyogRWFjaCB0aW1lIG9uZSBvZiB0aGVzZSBmdW5jdGlvbnMgaXMgY2FsbGVkLCB0aGUgZWZmZWN0cyBvZiB0aGUgcHJlY2VkaW5nIGNhbGxzIGNlYXNlLgorKgorKiBBc3NlcnQgZmFpbHMgaWYKKyogLSBpZmJwIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCisqIC0gTklDIGludGVycnVwdHMgYXJlIG5vdCBkaXNhYmxlZC4KKyogLSBBIGNvbW1hbmQgb3RoZXIgdGhhbiBDb250aW51ZSwgRW5hYmxlLCBEaXNhYmxlLCBDb25uZWN0IG9yIERpc2Nvbm5lY3QgaXMgZ2l2ZW4uCisqIC0gQW4gaW52YWxpZCBjb21iaW5hdGlvbiBvZiB0aGUgc3ViZmllbGRzIGlzIGdpdmVuIG9yIGEgYml0IG91dHNpZGUgdGhlIHN1YmZpZWxkcyBpcyBnaXZlbi4KKyogLSBhbnkgcmV0dXJuIGNvZGUgYmVzaWRlcyBIQ0ZfU1VDQ0VTUy4KKyogLSByZWVudHJhbmN5LCBtYXkgYmUgIGNhdXNlZCBieSBjYWxsaW5nIGEgaGNmX2Z1bmN0aW9uIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbiBhZ2FpbnN0IE5JQyBpbnRlcnJ1cHRzIG9yCisqCW11bHRpLXRocmVhZGluZworKgorKi5ESUFHUkFNCisqCWhjZl9jbnRsIHRha2VzIHN1Y2Nlc3NpdmVseSB0aGUgZm9sbG93aW5nIGFjdGlvbnM6CisqMjoJSWYgdGhlIEhDRiBpcyBpbiBEZWZ1bmN0IG1vZGUgb3IgaW5jb21wYXRpYmxlIHdpdGggdGhlIFByaW1hcnkgb3IgU3RhdGlvbiBTdXBwbGllciBpbiB0aGUgSGVybWVzLAorKgloY2ZfY250bCgpIHJldHVybnMgaW1tZWRpYXRlbHkgd2l0aCBIQ0ZfRVJSX05PX05JQzs/IGFzIHN0YXR1cy4KKyo4Ogl3aGVuIHRoZSBwb3J0IGlzIGRpc2FibGVkLCB0aGUgRE1BIGVuZ2luZSBuZWVkcyB0byBiZSBkZS1hY3RpdmF0ZWQsIHNvIHRoZSBob3N0IGNhbiBzYWZlbHkgcmVjbGFpbSB0eAorKglwYWNrZXRzIGZyb20gdGhlIHR4IGRlc2NyaXB0b3IgY2hhaW4uCisqCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CitoY2ZfY250bCggSUZCUCBpZmJwLCBoY2ZfMTYgY21kICkKK3sKK2ludAlyYyA9IEhDRl9FUlJfSU5DT01QX0ZXOworI2lmIEhDRl9BU1NFUlQKK3sJaW50IHggPSBjbWQgJiBIQ01EX0NNRF9DT0RFOworCWlmICggeCA9PSBIQ0ZfQ05UTF9DT05USU5VRSApIHggJj0gfkhDTURfUkVUUlk7CisJZWxzZSBpZiAoICh4ID09IEhDTURfRElTQUJMRSB8fCB4ID09IEhDTURfRU5BQkxFKSAmJiBpZmJwLT5JRkJfRldJZGVudGl0eS5jb21wX2lkID09IENPTVBfSURfRldfQVAgKSB7CisJCXggJj0gfkhGU19UWF9DTlRMX1BPUlQ7CisJfQorCUhDRkFTU0VSVCggeD09SENGX0NOVExfRU5BQkxFICB8fCB4PT1IQ0ZfQ05UTF9ESVNBQkxFICAgIHx8IEhDRl9DTlRMX0NPTlRJTlVFIHx8CisJCQkgICB4PT1IQ0ZfQ05UTF9DT05ORUNUIHx8IHg9PUhDRl9DTlRMX0RJU0NPTk5FQ1QsIGNtZCApCit9CisjZW5kaWYgLy8gSENGX0FTU0VSVAorLy8gI2lmIChIQ0ZfU0xFRVApICYgSENGX0REUworLy8gCUhDRkFTU0VSVCggaWZicC0+SUZCX0ludE9mZkNudCAhPSAweEZGRkUsIGNtZCApCisvLyAjZW5kaWYgLy8gSENGX0REUworCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfQ05UTCwgY21kICkKKwlpZiAoIGlmYnAtPklGQl9DYXJkU3RhdCA9PSAwICkgewkJCQkJCQkJCQkJCQkJCQkgLyoyKi8KKy8qNiovCXJjID0gY21kX2V4ZSggaWZicCwgY21kLCAwICk7CisjaWYgKEhDRl9TTEVFUCkgJiBIQ0ZfRERTCisJCWlmYnAtPklGQl9UaWNrQ250ID0gMDsJCQkJLy9zdGFydCAyIHNlY29uZCBwZXJpb2QgKHdpdGggMSB0aWNrIHVuY2VydGFudHkpCisjZW5kaWYgLy8gSENGX0REUworCX0KKyNpZiBIQ0ZfRE1BCisJLy8hcmxhdiA6IG5vdGUgdGhhdCB0aGlzIHBpZWNlIG9mIGNvZGUgaXMgYWx3YXlzIGV4ZWN1dGVkLCByZWdhcmRsZXNzIG9mIHRoZSBERUZVTkNUIGJpdCBpbiBJRkJfQ2FyZFN0YXQuCisJLy8gVGhlIHJlYXNvbiBiZWhpbmQgdGhpcyBpcyB0aGF0IHRoZSBNU0Ygc2hvdWxkIGJlIGFibGUgdG8gZ2V0IGFsbCBpdHMgRE1BIHJlc291cmNlcyBiYWNrIGZyb20gdGhlIEhDRiwKKwkvLyBldmVuIGlmIHRoZSBoYXJkd2FyZSBpcyBkaXNmdW5jdGlvbmFsLiBQcmFjdGljYWwgZXhhbXBsZSB1bmRlciBXaW5kb3dzIDogc3VycHJpc2UgcmVtb3ZhbC4KKwlpZiAoIGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFX0RNQSApIHsKKwkJaGNmX2lvIGlvX3BvcnQgPSBpZmJwLT5JRkJfSU9CYXNlOworCQlERVNDX1NUUkNUICpwOworCQlpZiAoIGNtZCA9PSBIQ0ZfQ05UTF9ESVNBQkxFIHx8IGNtZCA9PSBIQ0ZfQ05UTF9FTkFCTEUgKSB7CisJCQlPVVRfUE9SVF9EV09SRCggKGlvX3BvcnQgKyBIUkVHX0RNQV9DVFJMKSwgRE1BX0NUUkxTVEFUX1JFU0VUKTsJCQkJCQkvKjgqLworCQkJaWZicC0+SUZCX0NudGxPcHQgJj0gfkRNQV9FTkFCTEVEOworCQl9CisJCWlmICggY21kID09IEhDRl9DTlRMX0VOQUJMRSApIHsKKwkJCU9VVF9QT1JUX0RXT1JEKCAoaW9fcG9ydCArIEhSRUdfRE1BX0NUUkwpLCBETUFfQ1RSTFNUQVRfR08pOworCQkJLyogOz8gYnkgcmV3cml0aW5nIGhjZl9kbWFfcnhfcHV0IHlvdSBjYW4gcHJvYmFibHkganVzdCBjYWxsIGhjZl9kbWFfcnhfcHV0KCBpZmJwLT5JRkJfRmlyc3REZXNjW0RNQV9SWF0gKQorCQkJICogYXMgYWRkaXRpb25hbCBiZW5lZmljaWFyeSBzaWRlIGVmZmVjdCwgdGhlIFNPUCBhbmQgRU9QIGJpdHMgd2lsbCBhbHNvIGJlIGNsZWFyZWQKKwkJCSAqLworCQkJaWZicC0+SUZCX0NudGxPcHQgfD0gRE1BX0VOQUJMRUQ7CisJCQlIQ0ZBU1NFUlQoIE5UX0FTU0VSVCwgTkVWRVJfVEVTVEVEICkKKwkJCS8vIG1ha2UgdGhlIGVudGlyZSByeCBkZXNjcmlwdG9yIGNoYWluIERNQS1vd25lZCwgc28gdGhlIERNQSBlbmdpbmUgY2FuIChyZS0pdXNlIGl0LgorCQkJaWYgKCAoIHAgPSBpZmJwLT5JRkJfRmlyc3REZXNjW0RNQV9SWF0gKSAhPSBOVUxMICkgeyAgIC8vOz8gVGhpbmsgdGhpcyBvdmVyIGFnYWluIGluIHRoZSBsaWdodCBvZiB0aGUgbmV3IGNoYWluaW5nIHN0cmF0ZWd5CisJCQkJaWYgKCAxICkgCXsgLy9iZWdpbiBhbHRlcm5hdGl2ZQorCQkJCQlIQ0ZBU1NFUlQoIE5UX0FTU0VSVCwgTkVWRVJfVEVTVEVEICkKKwkJCQkJcHV0X2ZyYW1lX2xzdCggaWZicCwgaWZicC0+SUZCX0ZpcnN0RGVzY1tETUFfUlhdLCBETUFfUlggKTsKKwkJCQkJaWYgKCBpZmJwLT5JRkJfRmlyc3REZXNjW0RNQV9SWF0gKSB7CisJCQkJCQlwdXRfZnJhbWVfbHN0KCBpZmJwLCBpZmJwLT5JRkJfRmlyc3REZXNjW0RNQV9SWF0tPm5leHRfZGVzY19hZGRyLCBETUFfUlggKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXdoaWxlICggcCApIHsKKwkJCQkJCS8vcC0+YnVmX2NudGwuY250bF9zdGF0IHw9IERFU0NfRE1BX09XTkVEOworCQkJCQkJcC0+QlVGX0NOVCB8PSBERVNDX0RNQV9PV05FRDsKKwkJCQkJCXAgPSBwLT5uZXh0X2Rlc2NfYWRkcjsKKwkJCQkJfQorCQkJCQkvLyBhIHJ4IGNoYWluIGlzIGF2YWlsYWJsZSBzbyBoYW5kIGl0IG92ZXIgdG8gdGhlIERNQSBlbmdpbmUKKwkJCQkJcCA9IGlmYnAtPklGQl9GaXJzdERlc2NbRE1BX1JYXTsKKwkJCQkJT1VUX1BPUlRfRFdPUkQoIChpb19wb3J0ICsgSFJFR19SWERNQV9QVFIzMiksIHAtPmRlc2NfcGh5c19hZGRyKTsKKwkJCQl9ICAvL2VuZCBhbHRlcm5hdGl2ZQorCQkJfQorCQl9CisJfQorI2VuZGlmIC8vIEhDRl9ETUEKKwlIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYyApCisJSENGTE9HRVhJVCggSENGX1RSQUNFX0NOVEwgKQorCXJldHVybiByYzsKK30gLy8gaGNmX2NudGwKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLk1PRFVMRQkJaW50IGhjZl9jb25uZWN0KCBJRkJQIGlmYnAsIGhjZl9pbyBpb19iYXNlICkKKyouUFVSUE9TRQkJR3JhbnRzIGFjY2VzcyByaWdodCBmb3IgdGhlIEhDRiB0byB0aGUgSUZCLgorKgkJCQlJbml0aWFsaXplcyBDYXJkIGFuZCBIQ0YgaG91c2VrZWVwaW5nLgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJKG5lYXIpIGFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKglpb19iYXNlCQlub24tVVNCOiBJL08gQmFzZSBhZGRyZXNzIG9mIHRoZSBOSUMgKGNvbm5lY3QpCisqCQkJCW5vbi1VU0I6IEhDRl9ESVNDT05ORUNUCisqCQkJCVVTQjoJIEhDRl9DT05ORUNULCBIQ0ZfRElTQ09OTkVDVAorKgorKi5SRVRVUk5TCisqCUhDRl9TVUNDRVNTCisqCUhDRl9FUlJfSU5DT01QX1BSSQorKglIQ0ZfRVJSX0lOQ09NUF9GVworKglIQ0ZfRVJSX0RFRlVOQ1RfQ01EX1NFUQorKiEhCUhDRl9FUlJfTk9fTklDIHJlYWxseSByZXR1cm5lZCA7PworKglIQ0ZfRVJSX05PX05JQworKglIQ0ZfRVJSX1RJTUVfT1VUCisqCisqCU1TRi1hY2Nlc3NpYmxlIGZpZWxkcyBvZiBSZXN1bHQgQmxvY2s6CisqCUlGQl9JT0Jhc2UJCQkJZW50cnkgcGFyYW1ldGVyIGlvX2Jhc2UKKyoJSUZCX0lPUmFuZ2UJCQkJSFJFR19JT19SQU5HRSAoMHg0MC8weDgwKQorKglJRkJfVmVyc2lvbgkJCQl2ZXJzaW9uIG9mIHRoZSBJRkIgbGF5b3V0CisqCUlGQl9GV0lkZW50aXR5CQkJQ0ZHX0ZXX0lERU5USVRZX1NUUkNULCBzcGVjaWZpZXMgdGhlIGlkZW50aXR5IG9mIHRoZQorKgkJCQkJCQkicnVubmluZyIgRi9XLCBpLmUuIHRlcnRpYXJ5IEYvVyB1bmRlciBub3JtYWwgY29uZGl0aW9ucworKglJRkJfRldTdXAJCQkJQ0ZHX1NVUF9SQU5HRV9TVFJDVCwgc3BlY2lmaWVzIHRoZSBzdXBwbGllciByYW5nZSBvZgorKgkJCQkJCQl0aGUgInJ1bm5pbmciIEYvVywgaS5lLiB0ZXJ0aWFyeSBGL1cgdW5kZXIgbm9ybWFsIGNvbmRpdGlvbnMKKyoJSUZCX0hTSVN1cAkJCQlDRkdfU1VQX1JBTkdFX1NUUkNULCBzcGVjaWZpZXMgdGhlIEhXL1NXIEkvRiByYW5nZSBvZiB0aGUgTklDCisqCUlGQl9QUklJZGVudGl0eQkJCUNGR19QUklfSURFTlRJVFlfU1RSQ1QsIHNwZWNpZmllcyB0aGUgSWRlbnRpdHkgb2YgdGhlIFByaW1hcnkgRi9XCisqCUlGQl9QUklTdXAJCQkJQ0ZHX1NVUF9SQU5HRV9TVFJDVCwgc3BlY2lmaWVzIHRoZSBzdXBwbGllciByYW5nZSBvZiB0aGUgUHJpbWFyeSBGL1cKKyoJYWxsIG90aGVyCQkJCWFsbCBNU0YgYWNjZXNzaWJsZSBmaWVsZHMsIHdoaWNoIGFyZSBub3Qgc3BlY2lmaWVkIGFib3ZlLCBhcmUgemVyby1maWxsZWQKKyoKKyouQ09ORElUSU9OUworKiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIE1TRiB0byBhc3N1cmUgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBJL08gQmFzZSBhZGRyZXNzLgorKgorKiBOb3RlOiBoY2ZfY29ubmVjdCBkZWZhdWx0cyB0byBOSUMgaW50ZXJydXB0IGRpc2FibGVkIG1vZGUsIGkuZS4gYXMgaWYgaGNmX2FjdGlvbiggSENGX0FDVF9JTlRfT0ZGICkKKyogd2FzIGNhbGxlZC4KKyoKKyouREVTQ1JJUFRJT04KKyogaGNmX2Nvbm5lY3QgcGFzc2VzIHRoZSBNU0YtZGVmaW5lZCBsb2NhdGlvbiBvZiB0aGUgSUZCIHRvIHRoZSBIQ0YgYW5kIGdyYW50cyBvciByZXZva2VzIGFjY2VzcyByaWdodCBmb3IgdGhlCisqIEhDRiB0byB0aGUgSUZCLiBSZXZva2luZyBpcyBkb25lIGJ5IHNwZWNpZnlpbmcgSENGX0RJU0NPTk5FQ1QgcmF0aGVyIHRoYW4gYW4gSS9PIGFkZHJlc3MgZm9yIHRoZSBwYXJhbWV0ZXIKKyogaW9fYmFzZS4gIEV2ZXJ5IGNhbGwgb2YgaGNmX2Nvbm5lY3QgaW4gImNvbm5lY3QiIG1vZGUsIG11c3QgZXZlbnR1YWxseSBiZSBmb2xsb3dlZCBieSBhIGNhbGwgb2YgaGNmX2Nvbm5lY3QKKyogaW4gImRpc2Nvbm5lY3QiIG1vZGUuIENsYWxsaW5nIGhjZl9jb25uZWN0IGluICJjb25uZWN0Ii8iZGlzY29ubmVjdCIgbW9kZSBjYW4gbm90IGJlIG5lc3RlZC4KKyogVGhlIElGQiBhZGRyZXNzIG11c3QgYmUgdXNlZCBhcyBhIGhhbmRsZSB3aXRoIGFsbCBzdWJzZXF1ZW50IEhDRi1mdW5jdGlvbiBjYWxscyBhbmQgdGhlIEhDRiB1c2VzIHRoZSBJRkIKKyogYWRkcmVzcyBhcyBhIGhhbmRsZSB3aGVuIGl0IHBlcmZvcm1zIGEgY2FsbChiYWNrKSBvZiBhbiBNU0YtZnVuY3Rpb24gKGkuZS4gbXNmX2Fzc2VydCkuCisqCisqIE5vdGUgdGhhdCBub3Qgb25seSB0aGUgTVNGIGFjY2Vzc2libGUgZmllbGRzIGFyZSBjbGVhcmVkLCBidXQgYWxzbyBhbGwgaW50ZXJuYWwgaG91c2VrZWVwaW5nCisqIGluZm9ybWF0aW9uIGlzIHJlLWluaXRpYWxpemVkLgorKiBUaGlzIGltcGxpZXMgdGhhdCBhbGwgc2V0dGluZ3Mgd2hpY2ggYXJlIGRvbmUgdmlhIGhjZl9hY3Rpb24gYW5kIGhjZl9wdXRfaW5mbyAoZS5nLiBDRkdfTUJfQVNTRVJULCBDRkdfUkVHX01CLAorKiBDRkdfUkVHX0lORk9fTE9HKSBtdXN0IGJlIGRvbmUgYWdhaW4uIFRoZSBvbmx5IGZpZWxkIHdoaWNoIGlzIG5vdCBjbGVhcmVkLCBpcyBJRkJfTVNGU3VwLgorKgorKiBJZiBIQ0ZfSU5UX09OIGlzIHNlbGVjdGVkIGFzIGNvbXBpbGUgb3B0aW9uLCBOSUMgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQuCisqCisqIEFzc2VydCBmYWlscyBpZgorKiAtIGlmYnAgaXMgbm90IHByb3Blcmx5IGFsaWduZWQgKCByZWYgY2hhcHRlciBIQ0ZfQUxJR04gaW4gNC4xLjEpCisqIC0gSS9PIEJhc2UgQWRkcmVzcyBpcyBub3QgYSBtdWx0aXBsZSBvZiAweDQwIChub3RlOiAweDAwMDAgaXMgZXhwbGljaXRseSBhbGxvd2VkKS4KKyoKKyouRElBR1JBTQorKgorKjA6CVRocm91Z2hvdXQgaGNmX2Nvbm5lY3QgeW91IG5lZWQgdG8gZGlzdGluZ3Vpc2ggdGhlIGNvbm5lY3QgZnJvbSB0aGUgZGlzY29ubmVjdCBjYXNlLCB3aGljaCByZXF1aXJlcworKglzb21lIGF0dGVudGlvbiBhYm91dCB3aGF0IHRvIHVzZSBhcyAiSS9PIiBhZGRyZXNzIHdoZW4gZm9yIHdoaWNoIHB1cnBvc2UuCisqMjoKKyoyYTogUmVzZXQgSC1JSSBieSB0b2dnbGluZyByZXNldCBiaXQgaW4gSU8tcmVnaXN0ZXIgb24gYW5kIG9mZi4KKyoJVGhlIEhDRl9UWVBFX1BSRUxPQURFRCBjYXRlcnMgZm9yIHRoZSBET1MgZW52aXJvbm1lbnQgd2hlcmUgSC1JSSBpcyBsb2FkZWQgYnkgYSBzZXBhcmF0ZSBwcm9ncmFtIHRvCisqCW92ZXJjb21lIHRoZSA2NGsgc2l6ZSBsaW1pdCBwb3NlZCBvbiBET1MgZHJpdmVycy4KKyoJVGhlIG1hY3JvIE9QVyBpcyBub3QgeWV0IHVzZWFibGUgYmVjYXVzZSB0aGUgSUZCX0lPQmFzZSBmaWVsZCBpcyBub3Qgc2V0LgorKglOb3RlIDE6IGhvcGVmdWxseSB0aGUgY2xlYXJpbmcgYW5kIGluaXRpYWxpemluZyBvZiB0aGUgSUZCIChzZWUgYmVsb3cpIGFjdHMgYXMgYSBkZWxheSB3aGljaCBtZWV0cyB0aGUKKyoJc3BlY2lmaWNhdGlvbiBmb3IgUy9XIHJlc2V0CisqCU5vdGUgMjogaXQgdHVybnMgb3V0IHRoYXQgb24gc29tZSBIL1cgY29uc3RlbGxhdGlvbnMsIHRoZSBjbG9jayB0byBhY2Nlc3MgdGhlIEVFUHJvbSBpcyBub3QgbG93ZXJlZAorKgl0byBhbiBhcHByb3ByaWF0ZSBmcmVxdWVuY3kgYnkgSFJFR19JT19TUkVTRVQuIEJ5IGdpdmluZyBhbiBIQ01EX0lOSSBmaXJzdCwgdGhpcyBwcm9ibGVtIGlzIHdvcmtlZCBhcm91bmQuCisqMmI6IEV4cGVyaW1lbnRhbGx5IGl0IGlzIGRldGVybWluZWQgb3ZlciBhIHdpZGUgcmFuZ2Ugb2YgRi9XIHZlcnNpb25zIHRoYXQgd2FpdGluZyBmb3IgdGhlIGZvciBDbWQgYml0IGluCisqCUV2IHJlZ2lzdGVyIGdpdmVzIGEgd29ya2FibGUgc3RyYXRlZ3kuIFRoZSBhdmFpbGFibGUgZG9jdW1lbnRhdGlvbiBkb2VzIG5vdCBnaXZlIG11Y2ggY2x1ZXMuCisqNDoJY2xlYXIgYW5kIGluaXRpYWxpemUgdGhlIElGQgorKglUaGUgSENGIGhvdXNlIGtlZXBpbmcgaW5mbyBpcyBkZXNpZ25lZCBzdWNoIHRoYXQgemVybyBpcyB0aGUgYXBwcm9wcmlhdGUgaW5pdGlhbCB2YWx1ZSBmb3IgYXMgbXVjaCBhcworKglmZWFzaWJsZSBJRkItaXRlbXMuCisqCVRoZSByZWFkYWJsZSBmaWVsZHMgbWVudGlvbmVkIGluIHRoZSBkZXNjcmlwdGlvbiBzZWN0aW9uIGFuZCBzb21lIEhDRiBzcGVjaWZpYyBmaWVsZHMgYXJlIGdpdmVuIHRoZWlyCisqCWFjdHVhbCB2YWx1ZS4KKyoJSUZCX1RpY2tJbmkgaXMgaW5pdGlhbGl6ZWQgYXQgYmVzdCBndWVzcyBiZWZvcmUgY2FsaWJyYXRpb24KKyoJSGNmX2Nvbm5lY3QgZGVmYXVsdHMgdG8gIm5vIGludGVycnVwdCBnZW5lcmF0aW9uIiAoaW1wbGljaXRseSBhY2hpZXZlZCBieSB0aGUgemVyby1maWxsaW5nKS4KKyo2OglSZWdpc3RlciBjb21waWxlLXRpbWUgbGlua2VkIE1TRiBSb3V0aW5lIGFuZCBzZXQgZGVmYXVsdCBmaWx0ZXIgbGV2ZWwKKyoJY2FzdCBuZWVkZWQgdG8gZ2V0IGFyb3VuZCB0aGUgIm5lYXIiIHByb2JsZW0gaW4gRE9TIENPTSBtb2RlbAorKgllciBDMjQ0Njogbm8gY29udmVyc2lvbiBmcm9tIHZvaWQgKF9fbmVhciBfX2NkZWNsICopKHVuc2lnbmVkIGNoYXIgX19mYXIgKix1bnNpZ25lZCBpbnQsdW5zaWduZWQgc2hvcnQsaW50KQorKgkJCQkJCQl0byAgIHZvaWQgKF9fZmFyICBfX2NkZWNsICopKHVuc2lnbmVkIGNoYXIgX19mYXIgKix1bnNpZ25lZCBpbnQsdW5zaWduZWQgc2hvcnQsaW50KQorKjg6CUlmIGEgY29tbWFuZCBpcyBhcHBhcmVudGx5IHN0aWxsIGFjdGl2ZSAoYXMgaW5kaWNhdGVkIGJ5IHRoZSBCdXN5IGJpdCBpbiBDbWQgcmVnaXN0ZXIpIHRoaXMgbWF5IGluZGljYXRlIGEKKyoJYmxvY2tlZCBjbWQgcGlwZSBsaW5lLiAgVG8gdW5ibG9jayB0aGUgZm9sbG93aW5nIGFjdGlvbnMgYXJlIGRvbmU6CisqCSAtIEFjayBldmVyeXRoaW5nCisqCSAtIFdhaXQgZm9yIEJ1c3kgYml0IGRyb3AgIGluIENtZCByZWdpc3RlcgorKgkgLSBXYWl0IGZvciBDbWQgIGJpdCByYWlzZSBpbiBFdiAgcmVnaXN0ZXIKKyoJVGhlIHR3byB3YWl0cyBhcmUgY29tYmluZWQgaW4gYSBzaW5nbGUgSENGX1dBSVRfV0hJTEUgdG8gb3B0aW1pemUgbWVtb3J5IHNpemUuIElmIGVpdGhlciBvZiB0aGVzZSB3YWl0cworKglmYWlsIChwcm90X2NudCBiZWNvbWVzIDApLCB0aGVuIHNvbWV0aGluZyBpcyBzZXJpb3VzIHdyb25nLiBSYXRoZXIgdGhhbiBQQU5JQ0ssIHRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhlCisqCW5leHQgY21kX2V4ZSB3aWxsIGZhaWwsIGNhdXNpbmcgdGhlIEhDRiB0byBnbyBpbnRvIERFRlVOQ1QgbW9kZQorKjEwOglBY2sgZXZlcnl0aGluZyB0byB1bmJsb2NrIGEgKHBvc3NpYmx5IGJsb2NrZWQpIGNtZCBwaXBlIGxpbmUKKyoJTm90ZSAxOiBpdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IGFuIEFsbG9jIGV2ZW50IGlzIHBlbmRpbmcgYW5kIHZlcnkgd2VsbCBwb3NzaWJsZSB0aGF0IGEgKFNlbmQpIENtZCBldmVudCBpcworKglwZW5kaW5nIG9uIG5vbi1pbml0aWFsIGNhbGxzCisqCU5vdGUgMjogaXQgaXMgYXNzdW1lZCB0aGF0IHRoaXMgc3RyYXRlZ3kgdGFrZXMgYXdheSB0aGUgbmVlZCB0byBhY2sgZXZlcnkgY29uY2VpdmFibGUgZXZlbnQgYWZ0ZXIgYW4KKyoJSGVybWVzIEluaXRpYWxpemUKKyoxMjoJT25seSBILUlJIE5FRURTIHRoZSBIZXJtZXMgSW5pdGlhbGl6ZSBjb21tYW5kLiBEdWUgdG8gdGhlIGRpZmZlcmVudCBzZW1hbnRpY3MgZm9yIEgtSSBhbmQgSC1JSQorKglJbml0aWFsaXplIGNvbW1hbmQsIGluaXQoKSBkb2VzIG5vdCAoYW5kIGNhbiBub3QsIHNpbmNlIGl0IGlzIGNhbGxlZCBlLmcuIGFmdGVyIGEgZG93bmxvYWQpIGV4ZWN1dGUgdGhlCisqCUhlcm1lcyBJbml0aWFsaXplIGNvbW1hbmQuIEV4ZWN1dGluZyB0aGUgSGVybWVzIEluaXRpYWxpemUgY29tbWFuZCBmb3IgSC1JIHdvdWxkIG5vdCBoYXJtIGJ1dCBub3QgZG8KKyoJYW55dGhpbmcgdXNlZnVsIGVpdGhlciwgc28gaXQgaXMgc2tpcHBlZC4KKyoJVGhlIHJldHVybiBzdGF0dXMgb2YgY21kX2V4ZSBpcyBpZ25vcmVkLiBJdCBpcyBhc3N1bWVkIHRoYXQgaWYgY21kX2V4ZSBmYWlscywgaW5pdCBmYWlscyB0b28KKyoxNDoJdXNlIGlvX2Jhc2UgYXMgYSBmbGFnIHRvIG1lcmdlIGhjZl9jb25uZWN0IGFuZCBoY2ZfZGlzY29ubmVjdCBpbnRvIDEgcm91dGluZQorKgl0aGUgY2FsbCB0byBpbml0IGFuZCBpdHMgc3Vic2VxdWVudCBjYWxsIG9mIGNtZF9leGUgd2lsbCByZXR1cm4gSENGX0VSUl9OT19OSUMgaWYgYXBwcm9wcmlhdGUuIFRoaXMgc3RhdHVzCisqCWlzIChiYWRseSkgbmVlZGVkIGJ5IHNvbWUgbGVnYWN5IGNvbWJpbmF0aW9uIG9mIE5UNCBhbmQgY2FyZCBzZXJ2aWNlcyB3aGljaCBkbyBub3QgeWllbGQgYW4gSS9PIGFkZHJlc3MgaW4KKyoJdGltZS4KKyoKKyouTk9USUNFCisqCU9uIHBsYXRmb3JtcyB3aGVyZSB0aGUgTlVMTC1wb2ludGVyIGlzIG5vdCBhIGJpdC1wYXR0ZXJuIG9mIGFsbCB6ZXJvcywgdGhlIHplcm8tZmlsbGluZyBvZiB0aGUgSUZCIHJlc3VsdHMKKyoJaW4gYW4gaW5jb3JyZWN0IGluaXRpYWxpemF0aW9uIG9mIHBvaW50ZXJzLgorKglUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIE1haWxCb3ggbWFuaXB1bGF0aW9uIGluIHB1dF9tYl9pbmZvIHByb3RlY3RzIGFnYWluc3QgdGhlIGFic2VuY2Ugb2YgYSBNYWlsQm94CisqCWJhc2VkIG9uIElGQl9NQlNpemUsIElGQl9NQldwIGFuZCBpZmJwLT5JRkJfTUJScC4gVGhpcyBoYXMgcmFtaWZpY2F0aW9ucyBvbiB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlCisqCU1haWxCb3ggdmlhIGhjZl9wdXRfaW5mbyB3aXRoIHRoZSBDRkdfUkVHX01CIHR5cGUsIGJ1dCBpdCBwcmV2ZW50cyBkZXBlbmRlbmN5IG9uIHRoZSAiTlVMTC0ibmVzcyBvZgorKglJRkJfTUJwLgorKgorKi5OT1RJQ0UKKyoJVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHByb2JsZW1zIHdoZW4gYXNzZXJ0aW5nIGFuZCBsb2dnaW5nIGhjZl9jb25uZWN0LCBlLmcuCisqCSAtIEFzc2VydGluZyBvbiByZS1lbnRyYW5jeSBvZiBoY2ZfY29ubmVjdCBieSBtZWFucyBvZgorKgkgIkhDRkFTU0VSVCggKGlmYnAtPklGQl9Bc3NlcnRUcmFjZSAmIEhDRl9BU1NFUlRfQ09OTkVDVCkgPT0gMCwgMCApIiBpcyBub3QgdXNlZnVsIGJlY2F1c2UgSUZCIGNvbnRlbnRzCisqCSBhcmUgdW5kZWZpbmVkCisqCSAtIEFzc2VydGluZyBiZWZvcmUgdGhlIElGQiBpcyBjbGVhcmVkIHdpbGwgY2F1c2UgbWRkX2Fzc2VydCgpIHRvIGludGVycHJldCB0aGUgZ2FyYmFnZSBpbiBJRkJfQXNzZXJ0UnRuCisqCSBhcyBhIHJvdXRpbmUgYWRkcmVzcworKglUaGVyZWZvcmUgSENGVFJBQ0Ugbm9yIEhDRkxPR0VOVFJZIGlzIGNhbGxlZCBieSBoY2ZfY29ubmVjdC4KKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK2hjZl9jb25uZWN0KCBJRkJQIGlmYnAsIGhjZl9pbyBpb19iYXNlICkKK3sKK2ludAkJCXJjID0gSENGX1NVQ0NFU1M7CitoY2ZfaW8JCWlvX2FkZHI7CitoY2ZfMzIJCXByb3RfY250OworaGNmXzgJCSpxOworTFRWX1NUUkNUCXg7CisjaWYgSENGX0FTU0VSVAorCWhjZl8xNiB4YSA9IGlmYnAtPklGQl9GV0lkZW50aXR5LnR5cDsKKwkvKiBpcyBhc3N1bWVkIHRvIGNhdXNlIGFuIGFzc2VydCBsYXRlciBvbiBpZiBoY2ZfY29ubmVjdCBpcyBjYWxsZWQgd2l0aG91dCBpbnRlcnZlbmluZyBoY2ZfZGlzY29ubmVjdC4KKwkgKiB4YSA9PSBDRkdfRldfSURFTlRJVFkgaW4gc3Vic2VxdWVudCBjYWxscyB3aXRob3V0IHByZWNlZGluZyBoY2ZfZGlzY29ubmVjdCwKKwkgKiB4YSA9PSAwIGluIHN1YnNlcXVlbnQgY2FsbHMgd2l0aCBwcmVjZWRpbmcgaGNmX2Rpc2Nvbm5lY3QsCisJICogeGEgPT0gImdhcmJhZ2UiIChhbnkgdmFsdWUgZXhjZXB0IENGR19GV19JREVOVElUWSBpcyBhY2NlcHRhYmxlKSBpbiB0aGUgaW5pdGlhbCBjYWxsCisJICovCisjZW5kaWYgLy8gSENGX0FTU0VSVAorCisJaWYgKCBpb19iYXNlID09IEhDRl9ESVNDT05ORUNUICkgewkJCQkJLy9kaXNjb25uZWN0CisJCWlvX2FkZHIgPSBpZmJwLT5JRkJfSU9CYXNlOworCQlPUFcoIEhSRUdfSU5UX0VOLCAwICk7CQkvLzs/d29ya2Fyb3VuZCBhZ2FpbnN0IGR5aW5nIEYvVyBvbiBzdWJzZXF1ZW50IGhjZl9jb25uZWN0IGNhbGxzCisJfSBlbHNlIHsJCQkJCQkJCQkJCS8vY29ubmVjdAkJCQkJCQkJLyogMCAqLworCQlpb19hZGRyID0gaW9fYmFzZTsKKwl9CisKKyNpZiAwIC8vOz8gaWYgYSBzdWJzZXF1ZW50IGhjZl9jb25uZWN0IGlzIHByZWNlZWRlZCBieSBhbiBoY2ZfZGlzY29ubmVjdCB0aGUgd2FrZXVwIGlzIG5vdCBuZWVkZWQgISEKKyNpZiBIQ0ZfU0xFRVAKKyAgICBPVVRfUE9SVF9XT1JEKCAuLi4uLitIUkVHX0lPLCBIUkVHX0lPX1dBS0VVUF9BU1lOQyApOyAJICAgIC8vT1BXIG5vdCB5ZXQgdXNlYWJsZQorCU1TRl9XQUlUKDgwMCk7CQkJCQkJCQkvLyBNU0YtZGVmaW5lZCBmdW5jdGlvbiB0byB3YWl0IG4gbWljcm9zZWNvbmRzLgorCW5vdGUgdGhhdCBNU0ZfV0FJVCB1c2VzIG5vdCB5ZXQgZGVmaW5lZCEhISEgSUZCX0lPQmFzZSBhbmQgSUZCX1RpY2tJbmkgKHZpYSBQUk9UX0NOVF9JTkkpCisJc28gYmUgY2FyZWZ1bGwgaWYgdGhpcyBjb2RlIGlzIHJlc3RvcmVkCisjZW5kaWYgLy8gSENGX1NMRUVQCisjZW5kaWYgLy8gMAorCisjaWYgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfUFJFTE9BREVEICkgPT0gMAkvL3N3aXRjaCBjbG9jayBiYWNrIGZvciBTRUVQUk9NIGFjY2VzcyAgISEhCisJT1VUX1BPUlRfV09SRCggaW9fYWRkciArIEhSRUdfQ01ELCBIQ01EX0lOSSApOyAgCSAgICAvL09QVyBub3QgeWV0IHVzZWFibGUKKwlwcm90X2NudCA9IElOSV9USUNLX0lOSTsKKwlIQ0ZfV0FJVF9XSElMRSggKElOX1BPUlRfV09SRCggaW9fYWRkciArICBIUkVHX0VWX1NUQVQpICYgSFJFR19FVl9DTUQpID09IDAgKTsKKwlPVVRfUE9SVF9XT1JEKCAoaW9fYWRkciArIEhSRUdfSU8pLCBIUkVHX0lPX1NSRVNFVCApOwkvL09QVyBub3QgeWV0IHVzZWFibGUJCQkJCS8qIDJhKi8KKyNlbmRpZiAvLyBIQ0ZfVFlQRV9QUkVMT0FERUQKKwlmb3IgKCBxID0gKGhjZl84KikoJmlmYnAtPklGQl9NYWdpYyk7IHEgPiAoaGNmXzgqKWlmYnA7ICotLXEgPSAwICkgLypOT1AqLzsJCQkJCQkvKiA0ICovCisJaWZicC0+SUZCX01hZ2ljCQk9IEhDRl9NQUdJQzsKKwlpZmJwLT5JRkJfVmVyc2lvbgk9IElGQl9WRVJTSU9OOworI2lmIGRlZmluZWQgTVNGX0NPTVBPTkVOVF9JRCAvL2EgbmV3IElGQiBkZW1vbnN0cmF0ZXMgaG93IGRpcnR5IHRoZSBzb2x1dGlvbiBpcworCXh4eHhbeHh4eF9QUklfSURFTlRJVFlfT0ZGU0VUXSA9IE5VTEw7CQkvL0lGQl9QUklJZGVudGl0eSBwbGFjZWhvbGRlcgkweEZEMDIKKwl4eHh4W3h4eHhfUFJJX0lERU5USVRZX09GRlNFVCsxXSA9IE5VTEw7CS8vSUZCX1BSSVN1cCBwbGFjZWhvbGRlcgkJMHhGRDAzCisjZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRAorI2lmIChIQ0ZfVEFMTElFUykgJiAoIEhDRl9UQUxMSUVTX05JQyB8IEhDRl9UQUxMSUVTX0hDRiApCisJaWZicC0+SUZCX1RhbGx5TGVuID0gMSArIDIgKiAoSENGX05JQ19UQUxfQ05UICsgSENGX0hDRl9UQUxfQ05UKTsJLy9jb252ZXJ0ICMgb2YgVGFsbGllcyB0byBMIHZhbHVlIGZvciBMVFYKKwlpZmJwLT5JRkJfVGFsbHlUeXAgPSBDRkdfVEFMTElFUzsJCQkvL0lGQl9UYWxseVR5cDogc2V0IFQgdmFsdWUKKyNlbmRpZiAvLyBIQ0ZfVEFMTElFU19OSUMgLyBIQ0ZfVEFMTElFU19IQ0YKKwlpZmJwLT5JRkJfSU9CYXNlCT0gaW9fYWRkcjsJCQkJLy9zZXQgSU9fQmFzZSBhc2FwLCBzbyBhc3NlcnRzIHZpYSBIUkVHX1NXXzIgZG9uJ3QgaGFybQorCWlmYnAtPklGQl9JT1JhbmdlCT0gSFJFR19JT19SQU5HRTsKKwlpZmJwLT5JRkJfQ250bE9wdAk9IFVTRV8xNkJJVDsKKyNpZiBIQ0ZfQVNTRVJUCisJYXNzZXJ0X2lmYnAgPSBpZmJwOworCWlmYnAtPklGQl9Bc3NlcnRMdmwgPSAxOworI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4KKwlpZiAoIGlvX2Jhc2UgIT0gSENGX0RJU0NPTk5FQ1QgKSB7CisJCWlmYnAtPklGQl9Bc3NlcnRSdG4gPSAoTVNGX0FTU0VSVF9SVE5QKW1zZl9hc3NlcnQ7CQkJCQkJCQkJCQkvKiA2ICovCisJfQorI2VuZGlmIC8vIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4KKyNpZiAoSENGX0FTU0VSVCkgJiBIQ0ZfQVNTRVJUX01CCQkJCS8vYnVpbGQgdGhlIHN0cnVjdHVyZSB0byBwYXNzIHRoZSBhc3NlcnQgaW5mbyB0byBoY2ZfcHV0X2luZm8KKwlpZmJwLT5JRkJfQXNzZXJ0U3RyY3QubGVuID0gc2l6ZW9mKGlmYnAtPklGQl9Bc3NlcnRTdHJjdCkvc2l6ZW9mKGhjZl8xNikgLSAxOworCWlmYnAtPklGQl9Bc3NlcnRTdHJjdC50eXAgPSBDRkdfTUJfSU5GTzsKKwlpZmJwLT5JRkJfQXNzZXJ0U3RyY3QuYmFzZV90eXAgPSBDRkdfTUJfQVNTRVJUOworCWlmYnAtPklGQl9Bc3NlcnRTdHJjdC5mcmFnX2NudCA9IDE7CisJaWZicC0+SUZCX0Fzc2VydFN0cmN0LmZyYWdfYnVmWzBdLmZyYWdfbGVuID0KKwkJKCBvZmZzZXRvZihJRkJfU1RSQ1QsIElGQl9Bc3NlcnRMdmwpIC0gb2Zmc2V0b2YoSUZCX1NUUkNULCBJRkJfQXNzZXJ0TGluZSkgKSAvIHNpemVvZihoY2ZfMTYpOworCWlmYnAtPklGQl9Bc3NlcnRTdHJjdC5mcmFnX2J1ZlswXS5mcmFnX2FkZHIgPSAmaWZicC0+SUZCX0Fzc2VydExpbmU7CisjZW5kaWYgLy8gSENGX0FTU0VSVF9NQgorI2VuZGlmIC8vIEhDRl9BU1NFUlQKKwlJRl9QUk9UX1RJTUUoIHByb3RfY250ID0gaWZicC0+SUZCX1RpY2tJbmkgPSBJTklfVElDS19JTkk7ICkKKyNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9QUkVMT0FERUQgKSA9PSAwCisJLy8hISBObyBhc3NlcnRzIGJlZm9yZSBSZXNldC1iaXQgaW4gSFJFR19JTyBpcyBjbGVhcmVkCisJT1BXKCBIUkVHX0lPLCAweDAwMDAgKTsJCQkJCQkvL09QVyB1c2VhYmxlCQkJCQkJCQkJCS8qIDJiKi8KKwlIQ0ZfV0FJVF9XSElMRSggKElQVyggSFJFR19FVl9TVEFUKSAmIEhSRUdfRVZfQ01EKSA9PSAwICk7CisJSUZfUFJPVF9USU1FKCBIQ0ZBU1NFUlQoIHByb3RfY250LCBJUFcoIEhSRUdfRVZfU1RBVCkgKSApCisJSUZfUFJPVF9USU1FKCBpZiAoIHByb3RfY250ICkgcHJvdF9jbnQgPSBpZmJwLT5JRkJfVGlja0luaTsgKQorI2VuZGlmIC8vIEhDRl9UWVBFX1BSRUxPQURFRAorCS8vISEgTm8gYXNzZXJ0cyBiZWZvcmUgUmVzZXQtYml0IGluIEhSRUdfSU8gaXMgY2xlYXJlZAorCUhDRkFTU0VSVCggRE9fQVNTRVJULCBNRVJHRV8yKCBIQ0ZfQVNTRVJULCAweENBRjAgKQkpIC8vanVzdCB0byBwcm9vZiB0aGF0IHRoZSBjb21wbGV0ZSBhc3NlcnQgbWFjaGluZXJ5IGlzIHdvcmtpbmcKKwlIQ0ZBU1NFUlQoIHhhICE9IENGR19GV19JREVOVElUWSwgMCApCQkvLyBhc3NlcnQgaWYgaGNmX2Nvbm5lY3QgaXMgY2FsbGVkIHdpdGhvdXQgaW50ZXJ2ZW5pbmcgaGNmX2Rpc2Nvbm5lY3QuCisJSENGQVNTRVJUKCAoKGhjZl8zMikodm9pZCopaWZicCAmIChIQ0ZfQUxJR04tMSkgKSA9PSAwLCAoaGNmXzMyKSh2b2lkKilpZmJwICkKKwlIQ0ZBU1NFUlQoIChpb19hZGRyICYgMHgwMDNGKSA9PSAwLCBpb19hZGRyICkKKwkJCQkJCQkJCQkJCS8vaWYgQnVzeSBiaXQgaW4gQ21kIHJlZ2lzdGVyCisJaWYgKElQVyggSFJFR19DTUQgKSAmIEhDTURfQlVTWSApIHsJCQkJCQkJCQkJCQkJCQkJLyogOCAqLworCQkJCQkJCQkJCQkJLy8uICBBY2sgYWxsIHRvIHVuYmxvY2sgYSAocG9zc2libHkpIGJsb2NrZWQgY21kIHBpcGUgbGluZQorCQlPUFcoIEhSRUdfRVZfQUNLLCB+SFJFR19FVl9TTEVFUF9SRVEgKTsKKwkJCQkJCQkJCQkJCS8vLiAgV2FpdCBmb3IgQnVzeSBiaXQgZHJvcCAgaW4gQ21kIHJlZ2lzdGVyCisJCQkJCQkJCQkJCQkvLy4gIFdhaXQgZm9yIENtZCAgYml0IHJhaXNlIGluIEV2ICByZWdpc3RlcgorCQlIQ0ZfV0FJVF9XSElMRSggKCBJUFcoIEhSRUdfQ01EICkgJiBIQ01EX0JVU1kgKSAmJiAoSVBXKCBIUkVHX0VWX1NUQVQpICYgSFJFR19FVl9DTUQpID09IDAgKTsKKwkJSUZfUFJPVF9USU1FKCBIQ0ZBU1NFUlQoIHByb3RfY250LCBJUFcoIEhSRUdfRVZfU1RBVCkgKSApIC8qIGlmIHByb3RfY250ID09IDAsIGNtZF9leGUgd2lsbCBmYWlsLCBjYXVzaW5nIERFRlVOQ1QgKi8KKwl9CisJT1BXKCBIUkVHX0VWX0FDSywgfkhSRUdfRVZfU0xFRVBfUkVRICk7CisjaWYgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfUFJFTE9BREVEICkgPT0gMAkJCQkJCQkJCQkJCQkJLyoxMiovCisJKHZvaWQpY21kX2V4ZSggaWZicCwgSENNRF9JTkksIDAgKTsKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9QUkVMT0FERUQKK2lmICggaW9fYmFzZSAhPSBIQ0ZfRElTQ09OTkVDVCApIHsKKwkJcmMgPSBpbml0KCBpZmJwICk7CQkJCQkJCQkJCQkJCQkJCQkJCS8qMTQqLworCQlpZiAoIHJjID09IEhDRl9TVUNDRVNTICkgeworCQkJeC5sZW4gPSAyOworCQkJeC50eXAgPSBDRkdfTklDX0JVU19UWVBFOworCQkJKHZvaWQpaGNmX2dldF9pbmZvKCBpZmJwLCAmeCApOworCQkJaWZicC0+SUZCX0J1c1R5cGUgPSB4LnZhbFswXTsKKwkJCS8vQ0ZHX05JQ19CVVNfVFlQRSBub3Qgc3VwcG9ydGVkIC0+IGRlZmF1bHQgMzIgYml0cy9ETUEsIE1TRiBoYXMgdG8gb3ZlcnJ1bGUgdmlhIENGR19DTlRMX09QVAorCQkJaWYgKCB4LmxlbiA9PSAwIHx8IHgudmFsWzBdID09IDB4MDAwMiB8fCB4LnZhbFswXSA9PSAweDAwMDMgKSB7CisjaWYgKEhDRl9JTykgJiBIQ0ZfSU9fMzJCSVRTCisJCQkJaWZicC0+SUZCX0NudGxPcHQgJj0gflVTRV8xNkJJVDsJCQkvL3Jlc2V0IFVTRV8xNkJJVAorI2VuZGlmIC8vIEhDRl9JT18zMkJJVFMKKyNpZiBIQ0ZfRE1BCisJCQkJaWZicC0+SUZCX0NudGxPcHQgfD0gVVNFX0RNQTsJCQkJLy9TRVQgRE1BCisjZWxzZQorCQkJCWlmYnAtPklGQl9JT1JhbmdlID0gMHg0MCAvKmkucy5vLiBIUkVHX0lPX1JBTkdFKi87CisjZW5kaWYgLy8gSENGX0RNQQorCQkJfQorCQl9CisJfSBlbHNlIEhDRkFTU0VSVCggICggaWZicC0+SUZCX01hZ2ljIF49IEhDRl9NQUdJQyApID09IDAsIGlmYnAtPklGQl9NYWdpYyApIC8qTk9QKi87CisJLyogb2YgYWJvdmUgSENGQVNTRVJUIG9ubHkgdGhlIHNpZGUgZWZmZWN0IGlzIG5lZWRlZCwgTk9QIGluIGNhc2UgSENGQVNTRVJUIGlzIGR1bW15ICovCisJaWZicC0+SUZCX0lPQmFzZSA9IGlvX2Jhc2U7CQkJCQkJCQkJCQkJCQkJCQkJLyogMCovCisJcmV0dXJuIHJjOworfSAvLyBoY2ZfY29ubmVjdAorCisjaWYgSENGX0RNQQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBGdW5jdGlvbiBnZXRfZnJhbWVfbHN0CisqICAtIHJlc29sdmUgdGhlICJsYXN0IGhvc3Qtb3duZWQgZGVzY3JpcHRvciIgcHJvYmxlbXMgd2hlbiBhIGRlc2NyaXB0b3IgbGlzdCBpcyByZWNsYWltZWQgYnkgdGhlIE1TRi4KKyoKKyogVGhlIEZyYW1lTGlzdCB0byBiZSByZWNsYWltZWQgYXMgd2VsbCBhcyB0aGUgRGVzY3JpcHRvckxpc3QgYWx3YXlzIHN0YXJ0IGluIElGQl9GaXJzdERlc2NbdHhfcnhfZmxhZ10KKyogYW5kIHRoaXMgaXMgYWx3YXlzIHRoZSAiY3VycmVudCIgREVMV0EgRGVzY3JpcHRvci4KKyoKKyogSWYgYSBGcmFtZUxpc3QgaXMgYXZhaWxhYmxlLCB0aGUgbGFzdCBkZXNjcmlwdG9yIG9mIHRoZSBGcmFtZUxpc3QgdG8gdHVybmVkIGludG8gYSBuZXcgREVMV0EgRGVzY3JpcHRvcjoKKyogIC0gYSBjb3B5IGlzIG1hZGUgZnJvbSB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGxhc3QgZGVzY3JpcHRvciBvZiB0aGUgRnJhbWVMaXN0IGludG8gdGhlIGN1cnJlbnQKKyoJIERFTFdBIERlc2NyaXB0b3IKKyogIC0gdGhlIHJlbWFpbmRlciBvZiB0aGUgRGVzY3JpcHRvckxpc3QgaXMgZGV0YWNoZWQgZnJvbSB0aGUgY29weSBieSBzZXR0aW5nIHRoZSBuZXh0X2Rlc2NfYWRkciBhdCBOVUxMCisqICAtIHRoZSBETUEgY29udHJvbCBiaXRzIG9mIHRoZSBjb3B5IGFyZSBjbGVhcmVkIHRvIGRvIG5vdCBjb25mdXNlIHRoZSBNU0YKKyogIC0gdGhlIGNvcHkgb2YgdGhlIGxhc3QgZGVzY3JpcHRvciAoaS5lLiB0aGUgIm9sZCIgREVMV0EgRGVzY3JpcHRvcikgaXMgY2hhaW5lZCB0byB0aGUgcHJldiBEZXNjcmlwdG9yCisqCSBvZiB0aGUgRnJhbWVMaXN0LCB0aHVzIHJlcGxhY2luZyB0aGUgb3JpZ2luYWwgbGFzdCBEZXNjcmlwdG9yIG9mIHRoZSBGcmFtZUxpc3QuCisqICAtIElGQl9GaXJzdERlc2MgaXMgY2hhbmdlZCB0byB0aGUgYWRkcmVzcyBvZiB0aGF0IHJlcGxhY2VkIChvcmlnaW5hbCkgbGFzdCBkZXNjcmlwdG9yIG9mIHRoZSBGcmFtZUxpc3QsCisqCSBpLmUuIHRoZSAibmV3IiBERUxXQSBEZXNjcmlwdG9yLgorKgorKiBUaGlzIGZ1bmN0aW9uIG1ha2VzIGEgY29weSBvZiB0aGF0IGxhc3QgaG9zdC1vd25lZCBkZXNjcmlwdG9yLCBzbyB0aGUgTVNGIHdpbGwgZ2V0IGEgY29weSBvZiB0aGUgZGVzY3JpcHRvci4KKyogT24gdG9wIG9mIHRoYXQsIGl0IGFkanVzdHMgRE1BIHJlbGF0ZWQgZmllbGRzIGluIHRoZSBJRkIgc3RydWN0dXJlLgorCS8vIHBlcmZvcm0gYSBjb3B5aW5nLXNjaGVtZSB0byBjaXJjdW12ZW50IHRoZSAnbGFzdCBob3N0IG93bmVkIGRlc2NyaXB0b3IgY2Fubm90IGJlIHJlY2xhaW1lZCcgbGltaXRhdGlvbiBpbXBvc2VkIGJ5IEgyLjUncyBETUEgaGFyZHdhcmUgZGVzaWduCisJLy8gYSAncmVjbGFpbSBkZXNjcmlwdG9yJyBzaG91bGQgYmUgYXZhaWxhYmxlIGluIHRoZSBIQ0Y6CisqCisqIFJldHVybnM6IGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGRlc2NyaXB0b3Igb2YgdGhlIEZyYW1lTGlzdAorKgorIDg6IEJlIGNhcmVmdWwgb25jZSB5b3Ugc3RhcnQgcmUtb3JkZXJpbmcgdGhlIHN0ZXBzIGluIHRoZSBjb3B5IHByb2Nlc3MsIHRoYXQgaXQgc3RpbGwgd29ya3MgZm9yIGNhc2VzCisqIAlvZiBGcmFtZUxpc3RzIG9mIDEsIDIgYW5kIG1vcmUgdGhhbiAyIGRlc2NyaXB0b3JzCisqCisqIElucHV0IHBhcmFtZXRlcnM6CisqIHR4X3J4X2ZsYWcgICAgICA6IHNwZWNpZmllcyAndHJhbnNtaXQnIG9yICdyZWNlaXZlJyBkZXNjcmlwdG9yLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSENGX1NUQVRJQyBERVNDX1NUUkNUKgorZ2V0X2ZyYW1lX2xzdCggSUZCUCBpZmJwLCBpbnQgdHhfcnhfZmxhZyApCit7CisKK0RFU0NfU1RSQ1QgKmhlYWQgPSBpZmJwLT5JRkJfRmlyc3REZXNjW3R4X3J4X2ZsYWddOworREVTQ19TVFJDVCAqY29weSwgKnAsICpwcmV2OworCisJSENGQVNTRVJUKCB0eF9yeF9mbGFnID09IERNQV9SWCB8fCB0eF9yeF9mbGFnID09IERNQV9UWCwgdHhfcnhfZmxhZyApCisJCQkJCQkJCS8vaWYgRnJhbWVMaXN0CisJaWYgKCBoZWFkICkgeworCQkJCQkJCQkvLy4gIHNlYXJjaCBmb3IgbGFzdCBkZXNjcmlwdG9yIG9mIGZpcnN0IEZyYW1lTGlzdAorCQlwID0gcHJldiA9IGhlYWQ7CisJCXdoaWxlICggKCBwLT5CVUZfU0laRSAmIERFU0NfRU9QICkgPT0gMCAmJiBwLT5uZXh0X2Rlc2NfYWRkciApIHsKKwkJCWlmICggKCBpZmJwLT5JRkJfQ250bE9wdCAmIERNQV9FTkFCTEVEICkgPT0gMCApIHsJLy9jbGVhciBjb250cm9sIGJpdHMgd2hlbiBkaXNhYmxlZAorCQkJCXAtPkJVRl9DTlQgJj0gREVTQ19DTlRfTUFTSzsKKwkJCX0KKwkJCXByZXYgPSBwOworCQkJcCA9IHAtPm5leHRfZGVzY19hZGRyOworCQl9CisJCQkJCQkJCS8vLiAgaWYgRE1BIGVuYWJsZWQKKwkJaWYgKCBpZmJwLT5JRkJfQ250bE9wdCAmIERNQV9FTkFCTEVEICkgeworCQkJCQkJCQkvLy4gIC4gIGlmIGxhc3QgZGVzY3JpcHRvciBvZiBGcmFtZUxpc3QgaXMgRE1BIG93bmVkCisJCQkJCQkJCS8vLiAgLiAgb3IgaWYgRnJhbWVMaXN0IGlzIHNpbmdsZSAoREVMV0EpIERlc2NyaXB0b3IKKwkJCWlmICggcC0+QlVGX0NOVCAmIERFU0NfRE1BX09XTkVEIHx8IGhlYWQtPm5leHRfZGVzY19hZGRyID09IE5VTEwgKSB7CisJCQkJCQkJCS8vLiAgLiAgLiAgcmVmdXNlIHRvIHJldHVybiBGcmFtZUxpc3QgdG8gY2FsbGVyCisJCQkJaGVhZCA9IE5VTEw7CisJCQl9CisJCX0KKwl9CisJCQkJCQkJCS8vaWYgcmV0dXJuYWJsZSBGcmFtZUxpc3QgZm91bmQKKwlpZiAoIGhlYWQgKSB7CisJCQkJCQkJCS8vLiAgaWYgRnJhbWVMaXN0IGlzIHNpbmdsZSAoREVMV0EpIERlc2NyaXB0b3IgKGltcGxpZXMgRE1BIGRpc2FibGVkKQorIAkJaWYgKCBoZWFkLT5uZXh0X2Rlc2NfYWRkciA9PSBOVUxMICkgeworCQkJCQkJCQkvLy4gIC4gIGNsZWFyIERlc2NyaXB0b3JMaXN0CisJCQkvKjs/aWZicC0+SUZCX0xhc3REZXNjW3R4X3J4X2ZsYWddID0qLyBpZmJwLT5JRkJfRmlyc3REZXNjW3R4X3J4X2ZsYWddID0gTlVMTDsKKwkJCQkJCQkJLy8uICBlbHNlCisJCX0gZWxzZSB7CisJCQkJCQkJCS8vLiAgLiAgc3RyaXAgaGFyZHdhcmUtcmVsYXRlZCBiaXRzIGZyb20gbGFzdCBkZXNjcmlwdG9yCisJCQkJCQkJCS8vLiAgLiAgcmVtb3ZlIERFTFdBIERlc2NyaXB0b3IgZnJvbSBoZWFkIG9mIERlc2NyaXB0b3JMaXN0CisJCQljb3B5ID0gaGVhZDsKKwkgCQloZWFkID0gaGVhZC0+bmV4dF9kZXNjX2FkZHI7CisJCQkJCQkJCS8vLiAgIC4gIGV4Y2hhbmdlIGZpcnN0IChDb25maW5lZCkgYW5kIGxhc3QgKHBvc3NpYmx5IGltcHJpc29uZWQpIERlc2NyaXB0b3IKKwkJCWNvcHktPmJ1Zl9waHlzX2FkZHIgPSBwLT5idWZfcGh5c19hZGRyOworCQkJY29weS0+YnVmX2FkZHIgPSBwLT5idWZfYWRkcjsKKwkJCWNvcHktPkJVRl9TSVpFID0gcC0+QlVGX1NJWkUgJj0gREVTQ19DTlRfTUFTSzsJLy9nZXQgcmlkIG9mIERFU0NfRU9QIGFuZCBwb3NzaWJseSBERVNDX1NPUAorCQkJY29weS0+QlVGX0NOVCA9IHAtPkJVRl9DTlQgJj0gREVTQ19DTlRfTUFTSzsJLy9nZXQgcmlkIG9mIERFU0NfRE1BX09XTkVECisjaWYgKEhDRl9FWFQpICYgSENGX0RFU0NfU1RSQ1RfRVhUCisJCQljb3B5LT5ERVNDX01TRlN1cCA9IHAtPkRFU0NfTVNGU3VwOworI2VuZGlmIC8vIEhDRl9ERVNDX1NUUkNUX0VYVAorCQkJCQkJCQkvLy4gIC4gIHR1cm4gaW50byBhIERFTFdBIERlc2NyaXB0b3IKKwkJCXAtPmJ1Zl9hZGRyID0gTlVMTDsKKwkJCQkJCQkJLy8uICAuICBjaGFpbiBjb3B5IHRvIHByZXYJCQkJCQkJCQkJCS8qIDgqLworCQkJcHJldi0+bmV4dF9kZXNjX2FkZHIgPSBjb3B5OworCQkJCQkJCQkvLy4gIC4gIGRldGFjaCByZW1haW5kZXIgb2YgdGhlIERlc2NyaXB0b3JMaXN0IGZyb20gRnJhbWVMaXN0CisJCQljb3B5LT5uZXh0X2Rlc2NfYWRkciA9IE5VTEw7CisJCQljb3B5LT5uZXh0X2Rlc2NfcGh5c19hZGRyID0gMHhERUFEMDAwMDsgLy8hIGp1c3QgdG8gYmUgbmljZSwgbm90IHJlYWxseSBuZWVkZWQKKwkJCQkJCQkJLy8uICAuICBzYXZlIHRoZSBuZXcgc3RhcnQgKGkuZS4gREVMV0EgRGVzY3JpcHRvcikgaW4gSUZCX0ZpcnN0RGVzYworCQkJaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXSA9IHA7CisJCX0KKwkJCQkJCQkJLy8uICBzdHJpcCBERVNDX1NPUCBmcm9tIGZpcnN0IGRlc2NyaXB0b3IKKwkJaGVhZC0+QlVGX1NJWkUgJj0gREVTQ19DTlRfTUFTSzsKKwkJLy9oZWFkLT5CVUZfQ05UICY9IERFU0NfQ05UX01BU0s7ICBnZXQgcmlkIG9mIERFU0NfRE1BX09XTkVECisJCWhlYWQtPm5leHRfZGVzY19waHlzX2FkZHIgPSAweERFQUQwMDAwOyAvLyEganVzdCB0byBiZSBuaWNlLCBub3QgcmVhbGx5IG5lZWRlZAorCX0KKwkJCQkJCQkJLy9yZXR1cm4gdGhlIGp1c3QgZGV0YWNoZWQgRnJhbWVMaXN0IChpZiBhbnkpCisJcmV0dXJuIGhlYWQ7Cit9IC8vIGdldF9mcmFtZV9sc3QKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEZ1bmN0aW9uIHB1dF9mcmFtZV9sc3QKKyoKKyogVGhpcyBmdW5jdGlvbgorKgorKiBSZXR1cm5zOiBhZGRyZXNzIG9mIHRoZSBmaXJzdCBkZXNjcmlwdG9yIG9mIHRoZSBGcmFtZUxpc3QKKyoKKyogSW5wdXQgcGFyYW1ldGVyczoKKyogdHhfcnhfZmxhZyAgICAgIDogc3BlY2lmaWVzICd0cmFuc21pdCcgb3IgJ3JlY2VpdmUnIGRlc2NyaXB0b3IuCisqCisqIFRoZSBmb2xsb3dpbmcgbGlzdCBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggaGNmX2RtYV90eC9yeF9wdXQsIGluIG9yZGVyIHRvIGdldCB0aGVtIGluIHRoZSBXQ0ktc3BlYyAhISEhCisqIEFzc2VydCBmYWlscyBpZgorKiAtCURNQSBpcyBub3QgZW5hYmxlZAorKiAtCWRlc2NyaXB0b3IgbGlzdCBpcyBOVUxMCisqIC0JYSBkZXNjcmlwdG9yIGluIHRoZSBkZXNjcmlwdG9yIGxpc3QgaXMgbm90IGRvdWJsZSB3b3JkIGFsaWduZWQKKyogLQlhIGNvdW50IG9mIHNpemUgZmllbGQgb2YgYSBkZXNjcmlwdG9yIGNvbnRhaW5zIGNvbnRyb2wgYml0cywgaS5lLiBiaXRzIGluIHRoZSBoaWdoIG9yZGVyIG5pYmJsZS4KKyogLQl0aGUgREVMV0EgZGVzY3JpcHRvciBpcyBub3QgYSAic2luZ2xldG9uIiBEZXNjcmlwdG9yTGlzdC4KKyogLQl0aGUgREVMV0EgZGVzY3JpcHRvciBpcyBub3QgdGhlIGZpcnN0IERlc2NyaXB0b3Igc3VwcGxpZWQKKyogLQlhIG5vbl9ETUEgZGVzY3JpcHRvciBpcyBzdXBwbGllZCBiZWZvcmUgdGhlIERFTFdBIERlc2NyaXB0b3IgaXMgc3VwcGxpZWQKKyogLQlQb3NzaWJseSBtb3JlIGNoZWNrcyBjb3VsZCBiZSBhZGRlZCAhISEhISEhISEhISEhCisKKyouTk9USUNFCisqIFRoZSBhc3NlcnRzIG1hcmtlZCB3aXRoICpzYyogYXJlIHJlYWxseSBzYW5pdHkgY2hlY2tzIGZvciB0aGUgSENGLCB0aGV5IGNhbiAoc3VwcG9zZWRseSkgbm90IGJlIGluZmx1ZW5jZWQKKyogYnkgaW5jb3JyZWN0IE1TRiBiZWhhdmlvcgorCisJCS8vIFRoZSBNU0YgaXMgcmVxdWlyZWQgdG8gc3VwcGx5IHRoZSBIQ0Ygd2l0aCBhIHNpbmdsZSBkZXNjcmlwdG9yIGZvciBNU0YgdHggcmVjbGFpbSBwdXJwb3Nlcy4KKwkJLy8gVGhpcyAncmVjbGFpbSBkZXNjcmlwdG9yJyBjYW4gYmUgcmVjb2duaXplZCBieSB0aGUgZmFjdCB0aGF0IGl0cyBidWZfYWRkciBmaWVsZCBpcyB6ZXJvLgorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSogQWx0aG91Z2ggbm90IHJlcXVpcmVkIGZyb20gYSBoYXJkd2FyZSBwZXJzcGVjdGl2ZToKKwkqIC0gbWFrZSBlYWNoIGRlc2NyaXB0b3IgaW4gdGhpcyByeC1jaGFpbiBETUEtb3duZWQuCisJKiAtIEFsc28gc2V0IHRoZSBjb3VudCB0byB6ZXJvLiBFT1AgYW5kIFNPUCBiaXRzIGFyZSBhbHNvIGNsZWFyZWQuCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSENGX1NUQVRJQyB2b2lkCitwdXRfZnJhbWVfbHN0KCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCBpbnQgdHhfcnhfZmxhZyApCit7CisJREVTQ19TVFJDVAkqcCA9IGRlc2NwOworCWhjZl8xNiBwb3J0OworCisJSENGQVNTRVJUKCBpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEsIGlmYnAtPklGQl9DbnRsT3B0KSAvL29ubHkgaGNmX2RtYV90eF9wdXQgbXVzdCBhbHNvIGJlIERNQV9FTkFCTEVECisJSENGQVNTRVJUKCB0eF9yeF9mbGFnID09IERNQV9SWCB8fCB0eF9yeF9mbGFnID09IERNQV9UWCwgdHhfcnhfZmxhZyApCisJSENGQVNTRVJUKCBwICwgMCApCisKKwl3aGlsZSAoIHAgKSB7CisJCUhDRkFTU0VSVCggKChoY2ZfMzIpcCAmIDMgKSA9PSAwLCAoaGNmXzMyKXAgKQorCQlIQ0ZBU1NFUlQoIChwLT5CVUZfQ05UICYgfkRFU0NfQ05UX01BU0spID09IDAsIHAtPkJVRl9DTlQgKQorCQlIQ0ZBU1NFUlQoIChwLT5CVUZfU0laRSAmIH5ERVNDX0NOVF9NQVNLKSA9PSAwLCBwLT5CVUZfU0laRSApCisJCXAtPkJVRl9TSVpFICY9IERFU0NfQ05UX01BU0s7CQkJCQkvLyEhdGhpcyBTSE9VTEQgYmUgc3VwZXJmbHVvdXMgaW4gY2FzZSBvZiBjb3JyZWN0IE1TRgorCQlwLT5CVUZfQ05UICY9IHR4X3J4X2ZsYWcgPT0gRE1BX1JYID8gMCA6IERFU0NfQ05UX01BU0s7CS8vISF0aGlzIFNIT1VMRCBiZSBzdXBlcmZsdW91cyBpbiBjYXNlIG9mIGNvcnJlY3QgTVNGCisJCXAtPkJVRl9DTlQgfD0gREVTQ19ETUFfT1dORUQ7CisJCWlmICggcC0+bmV4dF9kZXNjX2FkZHIgKSB7CisvLwkJCUhDRkFTU0VSVCggcC0+YnVmX2FkZHIgJiYgcC0+YnVmX3BoeXNfYWRkciAgJiYgcC0+QlVGX1NJWkUgJiYgKy8tIHAtPkJVRl9TSVpFLCAuLi4gKQorCQkJSENGQVNTRVJUKCBwLT5uZXh0X2Rlc2NfYWRkci0+ZGVzY19waHlzX2FkZHIsIChoY2ZfMzIpcC0+bmV4dF9kZXNjX2FkZHIgKQorCQkJcC0+bmV4dF9kZXNjX3BoeXNfYWRkciA9IHAtPm5leHRfZGVzY19hZGRyLT5kZXNjX3BoeXNfYWRkcjsKKwkJfSBlbHNlIHsJCQkJCQkJCQkvLworCQkJcC0+bmV4dF9kZXNjX3BoeXNfYWRkciA9IDA7CisJCQlpZiAoIHAtPmJ1Zl9hZGRyID09IE5VTEwgKSB7CQkJLy8gREVMV0EgRGVzY3JpcHRvcgorCQkJCUhDRkFTU0VSVCggZGVzY3AgPT0gcCwgKGhjZl8zMilkZXNjcCApCS8vc2luZ2xldG9uIERlc2NyaXB0b3JMaXN0CisJCQkJSENGQVNTRVJUKCBpZmJwLT5JRkJfRmlyc3REZXNjW3R4X3J4X2ZsYWddID09IE5VTEwsIChoY2ZfMzIpaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXSkKKwkJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXSA9PSBOVUxMLCAoaGNmXzMyKWlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXSkKKwkJCQlkZXNjcC0+QlVGX0NOVCA9IDA7IC8vJj0gfkRFU0NfRE1BX09XTkVEOworCQkJCWlmYnAtPklGQl9GaXJzdERlc2NbdHhfcnhfZmxhZ10gPSBkZXNjcDsKKy8vIHBhcnQgb2YgYWx0ZXJuYXRpdmUgaWZicC0+SUZCX0xhc3REZXNjW3R4X3J4X2ZsYWddID0gaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXSA9IGRlc2NwOworCQkJCQkJCQkJCQkJCS8vIGlmICJyZWN5Y2xpbmciIGEgRnJhbWVMaXN0CisJCQkJCQkJCQkJCQkJLy8gKGUuZy4gY2FsbGVkIGZyb20gaGNmX2NudGwoIEhDRl9DTlRMX0VOQUJMRSApCisJCQkJCQkJCQkJCQkJLy8gLiAgcHJlcGFyZSBmb3IgYWN0aXZhdGlvbiBETUEgY29udHJvbGxlcgorLy8gcGFydCBvZiBhbHRlcm5hdGl2ZSBkZXNjcCA9IGRlc2NwLT5uZXh0X2Rlc2NfYWRkcjsKKwkJCX0gZWxzZSB7CQkJCQkJCQkvL2EgInJlYWwiIEZyYW1lTGlzdCwgaGFuZCBpdCBvdmVyIHRvIHRoZSBETUEgZW5naW5lCisJCQkJSENGQVNTRVJUKCBpZmJwLT5JRkJfRmlyc3REZXNjW3R4X3J4X2ZsYWddLCAoaGNmXzMyKWRlc2NwICkKKwkJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXSwgKGhjZl8zMilkZXNjcCApCisJCQkJSENGQVNTRVJUKCBpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10tPm5leHRfZGVzY19hZGRyID09IE5VTEwsCisJCQkJCQkgICAoaGNmXzMyKWlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXS0+bmV4dF9kZXNjX2FkZHIpCisvLwkJCQlwLT5idWZfY250bC5jbnRsX3N0YXQgfD0gREVTQ19ETUFfT1dORUQ7CisJCQkJaWZicC0+SUZCX0xhc3REZXNjW3R4X3J4X2ZsYWddLT5uZXh0X2Rlc2NfYWRkciA9IGRlc2NwOworCQkJCWlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXS0+bmV4dF9kZXNjX3BoeXNfYWRkciA9IGRlc2NwLT5kZXNjX3BoeXNfYWRkcjsKKwkJCQlwb3J0ID0gSFJFR19SWERNQV9QVFIzMjsKKwkJCQlpZiAoIHR4X3J4X2ZsYWcgKSB7CisJCQkJCXAtPkJVRl9TSVpFIHw9IERFU0NfRU9QOwkvLyBwIHBvaW50cyBhdCB0aGUgbGFzdCBkZXNjcmlwdG9yIGluIHRoZSBjYWxsZXItc3VwcGxpZWQgZGVzY3JpcHRvciBjaGFpbgorCQkJCQlkZXNjcC0+QlVGX1NJWkUgfD0gREVTQ19TT1A7CisJCQkJCXBvcnQgPSBIUkVHX1RYRE1BX1BUUjMyOworCQkJCX0KKwkJCQlPVVRfUE9SVF9EV09SRCggKGlmYnAtPklGQl9JT0Jhc2UgKyBwb3J0KSwgZGVzY3AtPmRlc2NfcGh5c19hZGRyICk7CisJCQl9CisJCQlpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10gPSBwOworCQl9CisJCXAgPSBwLT5uZXh0X2Rlc2NfYWRkcjsKKwl9Cit9IC8vIHB1dF9mcmFtZV9sc3QKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLk1PRFVMRQkJREVTQ19TVFJDVCogaGNmX2RtYV9yeF9nZXQoIElGQlAgaWZicCApCisqLlBVUlBPU0UJCWRlY2Fwc3VsYXRlIGEgbWVzc2FnZSBhbmQgcHJvdmlkZXMgdGhhdCBtZXNzYWdlIHRvIHRoZSBNU0YuCisqCQkJCXJlY2xhaW0gYWxsIGRlc2NyaXB0b3JzIGluIHRoZSByeCBkZXNjcmlwdG9yIGNoYWluLgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqCisqLlJFVFVSTlMKKyoJcG9pbnRlciB0byBhIEZyYW1lTGlzdAorKgorKi5ERVNDUklQVElPTgorKiBoY2ZfZG1hX3J4X2dldCBpcyBpbnRlbmRlZCB0byAgcmV0dXJuIGEgcmVjZWl2ZWQgZnJhbWUgd2hlbiBzdWNoIGEgZnJhbWUgaXMgZGVwb3NpdGVkIGluIEhvc3QgbWVtb3J5IGJ5IHRoZQorKiBETUEgZW5naW5lLiBJbiBhZGRpdGlvbiBoY2ZfZG1hX3J4X2dldCBjYW4gYmUgdXNlZCB0byByZWNsYWltIGFsbCBkZXNjcmlwdG9ycyBpbiB0aGUgcnggZGVzY3JpcHRvciBjaGFpbgorKiB3aGVuIHRoZSBETUEgRW5naW5lIGlzIGRpc2FibGVkLCBlLmcuIGFzIHBhcnQgb2YgYSBkcml2ZXIgdW5sb2FkaW5nIHN0cmF0ZWd5LgorKiBoY2ZfZG1hX3J4X2dldCBtdXN0IGJlIGNhbGxlZCByZXBlYXRlZGx5IGJ5IHRoZSBNU0Ygd2hlbiBoY2Zfc2VydmljZV9uaWMgc2lnbmFscyBhdmFpbGFiaWxpdHkgb2YgYSByeCBmcmFtZQorKiB0aHJvdWdoIHRoZSBIUkVHX0VWX1JETUFEIGZsYWcgb2YgSUZCX0RtYVBhY2tldHMuIFRoZSBjYWxsaW5nIG11c3Qgc3RvcCB3aGVuIGEgTlVMTCBwb2ludGVyIGlzIHJldHVybmVkLCBhdAorKiB3aGljaCB0aW1lIHRoZSBIUkVHX0VWX1JETUFEIGZsYWcgaXMgYWxzbyBjbGVhcmVkIGJ5IHRoZSBIQ0YgdG8gYXJtIHRoZSBtZWNoYW5pc20gZm9yIHRoZSBuZXh0IGZyYW1lCisqIHJlY2VwdGlvbi4KKyogUmVnYXJkbGVzcyB3aGV0aGVyIHRoZSBETUEgRW5naW5lIGlzIGN1cnJlbnRseSBlbmFibGVkIChhcyBjb250cm9sbGVkIHZpYSBoY2ZfY250bCksIGlmIHRoZSBETUEgY29udHJvbGxlcgorKiBkZXBvc2l0ZWQgYW4gUngtZnJhbWUgaW4gdGhlIFJ4LURlc2NyaXB0b3JMaXN0LCB0aGlzIGZyYW1lIGlzIGRldGFjaGVkIGZyb20gdGhlIFJ4LURlc2NyaXB0b3JMaXN0LAorKiB0cmFuc2Zvcm1lZCBpbnRvIGEgRnJhbWVMaXN0IChpLmUuICB1cGRhdGluZyB0aGUgaG91c2VrZWVwaW5nIGZpZWxkcyBpbiB0aGUgZGVzY3JpcHRvcnMpIGFuZCByZXR1cm5lZCB0byB0aGUKKyogY2FsbGVyLgorKiBJZiBubyBzdWNoIFJ4LWZyYW1lIGlzIGF2YWlsYWJsZSBpbiB0aGUgUngtRGVzY3JpcHRvckxpc3QsIHRoZSBiZWhhdmlvciBvZiBoY2ZfZG1hX3J4X2dldCBkZXBlbmRzIG9uIHRoZQorKiBzdGF0dXMgb2YgdGhlIERNQSBFbmdpbmUuCisqIElmIHRoZSBETUEgRW5naW5lIGlzIGVuYWJsZWQsIGEgTlVMTCBwb2ludGVyIGlzIHJldHVybmVkLgorKiBJZiB0aGUgRE1BIEVuZ2luZSBpcyBkaXNhYmxlZCwgdGhlIGZvbGxvd2luZyBzdHJhdGVneSBpcyB1c2VkOgorKiAtIHRoZSBjb21wbGV0ZSBSeC1EZXNjcmlwdG9yTGlzdCBpcyByZXR1cm5lZC4gVGhlIERFTFdBIERlc2NyaXB0b3IgaXMgbm90IHBhcnQgb2YgdGhlIFJ4LURlc2NyaXB0b3JMaXN0LgorKiAtIElmIHRoZXJlIGlzIG5vIFJ4LURlc2NyaXB0b3JMaXN0LCB0aGUgREVMV0EgRGVzY3JpcHRvciBpcyByZXR1cm5lZC4KKyogLSBJZiB0aGVyZSBpcyBubyBERUxXQSBEZXNjcmlwdG9yLCBhIE5VTEwgcG9pbnRlciBpcyByZXR1cm5lZC4KKyoKKyogSWYgdGhlIE1TRiBwZXJmb3JtcyBhbiBkaXNhYmxlL2VuYWJsZSBzZXF1ZW5jZSB3aXRob3V0IGV4aGF1c3RpbmcgdGhlIFJ4LURlc2NyaXB0b3JMaXN0IGFzIGRlc2NyaWJlZCBhYm92ZSwKKyogdGhlIGVuYWJsZSBjb21tYW5kIHdpbGwgcmVzZXQgYWxsIGhvdXNlIGtlZXBpbmcgaW5mb3JtYXRpb24sIGkuZS4gYWxyZWFkeSByZWNlaXZlZCBidXQgbm90IHlldCBieSB0aGUgTVNGCisqIHJldHJpZXZlZCBmcmFtZXMgYXJlIGxvc3QgYW5kIHRoZSBuZXh0IGZyYW1lIHdpbGwgYmUgcmVjZWl2ZWQgc3RhcnRpbmcgd2l0aCB0aGUgb2xkZXN0IGRlc2NyaXB0b3IuCisqCisqIFRoZSBIQ0YgY2FuIGJlIHVzZWQgaW4gMiBmYXNoaW9uczogd2l0aCBhbmQgd2l0aG91dCBkZWNhcHN1bGF0aW9uIGZvciBkYXRhIHRyYW5zZmVyLgorKiBUaGlzIGlzIGNvbnRyb2xsZWQgYXQgY29tcGlsZSB0aW1lIGJ5IHRoZSBIQ0ZfRU5DIGJpdCBvZiB0aGUgSENGX0VOQ0FQIHN5c3RlbSBjb25zdGFudC4KKyogSWYgYXBwcm9wcmlhdGUsIGRlY2Fwc3VsYXRpb24gaXMgZG9uZSBieSBtb3Zpbmcgc29tZSBkYXRhIGluc2lkZSB0aGUgYnVmZmVycyBhbmQgdXBkYXRpbmcgdGhlIGRlc2NyaXB0b3JzCisqIGFjY29yZGluZ2x5LgorKiEhIDs/Pz8/P3doZXJlIGRpZCBJIGRlc2NyaWJlIHdoeSBhIHNpbXBsZSBtYW5pcHVsYXRpb24gd2l0aCB0aGUgY291bnQgdmFsdWVzIGRvZXMgbm90IHN1ZmZpY2U/CisqCisqLkRJQUdSQU0KKyoKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0RFU0NfU1RSQ1QqCitoY2ZfZG1hX3J4X2dldCAoSUZCUCBpZmJwKQoreworREVTQ19TVFJDVCAqZGVzY3A7CS8vIHBvaW50ZXIgdG8gc3RhcnQgb2YgRnJhbWVMaXN0CisKKwlkZXNjcCA9IGdldF9mcmFtZV9sc3QoIGlmYnAsIERNQV9SWCApOworCWlmICggZGVzY3AgJiYgZGVzY3AtPmJ1Zl9hZGRyICkgIC8vIWJlIGF3YXJlIG9mIHRoZSBtaXNzaW5nIGN1cmx5IGJyYWNrZXQKKworCQkJCQkJCQkJCQkvL3NraXAgZGVjYXBzdWxhdGlvbiBhdCBjb25maW5lZCBkZXNjcmlwdG9yCisjaWYgKEhDRl9FTkNBUCkgPT0gSENGX0VOQworI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9DQ1gKKwlpZiAoIGlmYnAtPklGQl9DS0lQU3RhdCA9PSBIQ0ZfQUNUX0NDWF9PRkYgKQorI2VuZGlmIC8vIEhDRl9UWVBFX0NDWAorICAgIHsKK2ludCBpOworREVTQ19TVFJDVCAqcCA9IGRlc2NwLT5uZXh0X2Rlc2NfYWRkcjsJLy9wb2ludGVyIHRvIDJuZCBkZXNjcmlwdG9yIG9mIGZyYW1lCisJCUhDRkFTU0VSVChwLCAwKQorCQkvLyBUaGUgMm5kIGRlc2NyaXB0b3IgY29udGFpbnMgKG1heWJlKSBhIFNOQVAgaGVhZGVyIHBsdXMgcGFydCBvciB3aG9sZSBvZiB0aGUgcGF5bG9hZC4KKwkJLy9kZXRlcm1pbmUgZGVjYXBzdWxhdGlvbiBzdWItZmxhZyBpbiBSeEZTCisJCWkgPSAqKHdjaV9yZWNvcmRwKSZkZXNjcC0+YnVmX2FkZHJbSEZTX1NUQVRdICYgKCBIRlNfU1RBVF9NU0dfVFlQRSB8IEhGU19TVEFUX0VSUiApOworCQlpZiAoIGkgPT0gSEZTX1NUQVRfVFVOTkVMIHx8CisJCQkgKCBpID09IEhGU19TVEFUXzEwNDIgJiYgaGNmX2VuY2FwKCAod2NpX2J1ZnApJnAtPmJ1Zl9hZGRyW0hDRl9EQVNBX1NJWkVdICkgIT0gRU5DX1RVTk5FTCApKSB7CisJCQkvLyBUaGUgMm5kIGRlc2NyaXB0b3IgY29udGFpbnMgYSBTTkFQIGhlYWRlciBwbHVzIHBhcnQgb3Igd2hvbGUgb2YgdGhlIHBheWxvYWQuCisJCQlIQ0ZBU1NFUlQoIHAtPkJVRl9DTlQgPT0gKHAtPmJ1Zl9hZGRyWzVdICsgKHAtPmJ1Zl9hZGRyWzRdPDw4KSArIDIqNiArIDIgLSA4KSwgcC0+QlVGX0NOVCApCisJCQkvLyBwZXJmb3JtIGRlY2Fwc3VsYXRpb24KKwkJCUhDRkFTU0VSVChwLT5CVUZfU0laRSA+PTgsIHAtPkJVRl9TSVpFKQorCQkJLy8gbW92ZSBTQVsyOjVdIGluIHRoZSBzZWNvbmQgYnVmZmVyIHRvIHJlcGxhY2UgcGFydCBvZiB0aGUgU05BUCBoZWFkZXIKKwkJCWZvciAoIGk9MzsgaSA+PSAwOyBpLS0pIHAtPmJ1Zl9hZGRyW2krOF0gPSBwLT5idWZfYWRkcltpXTsKKwkJCS8vIGNvcHkgREFbMDo1XSwgU0FbMDoxXSBmcm9tIGZpcnN0IGJ1ZmZlciB0byBzZWNvbmQgYnVmZmVyCisJCQlmb3IgKCBpPTA7IGk8ODsgaSsrKSBwLT5idWZfYWRkcltpXSA9IGRlc2NwLT5idWZfYWRkcltIRlNfQUREUl9ERVNUICsgaV07CisJCQkvLyBtYWtlIGZpcnN0IGJ1ZmZlciBzaG9ydGVyIGluIGNvdW50CisJCQlkZXNjcC0+QlVGX0NOVCA9IEhGU19BRERSX0RFU1Q7CisJCX0KKwl9CisjZW5kaWYgLy8gSENGX0VOQworCWlmICggZGVzY3AgPT0gTlVMTCApIGlmYnAtPklGQl9EbWFQYWNrZXRzICY9IChoY2ZfMTYpfkhSRUdfRVZfUkRNQUQ7ICAvLzs/Y291bGQgYmUgaW50ZWdyYXRlZCBpbnRvIGdldF9mcmFtZV9sc3QKKwlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfRE1BX1JYX0dFVCApCisJcmV0dXJuIGRlc2NwOworfSAvLyBoY2ZfZG1hX3J4X2dldAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouTU9EVUxFCQl2b2lkIGhjZl9kbWFfcnhfcHV0KCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwICkKKyouUFVSUE9TRQkJc3VwcGx5IGJ1ZmZlcnMgZm9yIHJlY2VpdmUgcHVycG9zZXMuCisqCQkJCXN1cHBseSB0aGUgUngtREVMV0EgZGVzY3JpcHRvci4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKglkZXNjcAkJYWRkcmVzcyBvZiBhIERlc2NyaXB0b3JMaXN0CisqCisqLlJFVFVSTlMJCU4uQS4KKyoKKyouREVTQ1JJUFRJT04KKyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIE1TRiB0byBzdXBwbHkgdGhlIEhDRiB3aXRoIG5ldy9tb3JlIGJ1ZmZlcnMgZm9yIHJlY2VpdmUgcHVycG9zZXMuCisqIFRoZSBIQ0YgY2FuIGJlIHVzZWQgaW4gMiBmYXNoaW9uczogd2l0aCBhbmQgd2l0aG91dCBlbmNhcHN1bGF0aW9uIGZvciBkYXRhIHRyYW5zZmVyLgorKiBUaGlzIGlzIGNvbnRyb2xsZWQgYXQgY29tcGlsZSB0aW1lIGJ5IHRoZSBIQ0ZfRU5DIGJpdCBvZiB0aGUgSENGX0VOQ0FQIHN5c3RlbSBjb25zdGFudC4KKyogQXMgYSBjb25zZXF1ZW5jZSwgc29tZSBhZGRpdGlvbmFsIGNvbnN0YWludHMgYXBwbHkgdG8gdGhlIG51bWJlciBvZiBkZXNjcmlwdG9yIGFuZCB0aGUgYnVmZmVycyBhc3NvY2lhdGVkCisqIHdpdGggdGhlIGZpcnN0IDIgZGVzY3JpcHRvcnMuIEluZGVwZW5kZW50IG9mIHRoZSBlbmNhcHN1bGF0aW9uIGZlYXR1cmUsIHRoZSBDT1VOVCBmaWVsZHMgYXJlIGlnbm9yZWQuCisqIEEgc3BlY2lhbCBjYXNlIGlzIHRoZSBzdXBwbHlpbmcgb2YgdGhlIERFTFdBIGRlc2NyaXB0b3IsIHdoaWNoIG11c3QgYmUgc3VwcGxpZWQgYXMgdGhlIGZpcnN0IGRlc2NyaXB0b3IuCisqCisqIEFzc2VydCBmYWlscyBpZgorKiAtIGlmYnAgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZS4KKyogLSBOSUMgaW50ZXJydXB0cyBhcmUgbm90IGRpc2FibGVkIHdoaWxlIHJlcXVpcmVkIGJ5IHBhcmFtZXRlciBhY3Rpb24uCisqIC0gaW4gY2FzZSBkZWNhcHN1bGF0aW9uIGJ5IHRoZSBIQ0YgaXMgc2VsZWN0ZWQ6CisqCSAgLQlUaGUgZmlyc3QgZGF0YWJ1ZmZlciBkb2VzIG5vdCBoYXZlIHRoZSBleGFjdCBzaXplIGNvcnJlc3BvbmRpbmcgd2l0aCB0aGUgUnhGUyB1cCB0byB0aGUgODAyLjMgRGVzdEFkZHIKKyoJCWZpZWxkICg9PSAyOSB3b3JkcykuCisqCSAgLQlUaGUgRnJhbWVMaXN0IGRvZXMgbm90IGNvbnNpc3RzIG9mIGF0IGxlYXN0IDIgRGVzY3JpcHRvcnMuCisqCSAgLQlUaGUgc2Vjb25kIGRhdGFidWZmZXIgZG9lcyBub3QgaGF2ZSB0aGUgbWluaW11bSBzaXplIG9mIDggYnl0ZXMuCisqISEgVGhlIDJuZCBwYXJ0IG9mIHRoZSBsaXN0IG9mIGFzc2VydHMgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIHB1dF9mcmFtZV9sc3QsIGluIG9yZGVyIHRvIGdldAorKiEhIHRoZW0gaW4gdGhlIFdDSS1zcGVjICEhISEKKyogLSBETUEgaXMgbm90IGVuYWJsZWQKKyogLSBkZXNjcmlwdG9yIGxpc3QgaXMgTlVMTAorKiAtIGEgZGVzY3JpcHRvciBpbiB0aGUgZGVzY3JpcHRvciBsaXN0IGlzIG5vdCBkb3VibGUgd29yZCBhbGlnbmVkCisqIC0gYSBjb3VudCBvZiBzaXplIGZpZWxkIG9mIGEgZGVzY3JpcHRvciBjb250YWlucyBjb250cm9sIGJpdHMsIGkuZS4gYml0cyBpbiB0aGUgaGlnaCBvcmRlciBuaWJibGUuCisqIC0gdGhlIERFTFdBIGRlc2NyaXB0b3IgaXMgbm90IGEgInNpbmdsZXRvbiIgRGVzY3JpcHRvckxpc3QuCisqIC0gdGhlIERFTFdBIGRlc2NyaXB0b3IgaXMgbm90IHRoZSBmaXJzdCBEZXNjcmlwdG9yIHN1cHBsaWVkCisqIC0gYSBub25fRE1BIGRlc2NyaXB0b3IgaXMgc3VwcGxpZWQgYmVmb3JlIHRoZSBERUxXQSBEZXNjcmlwdG9yIGlzIHN1cHBsaWVkCisqISEgLSBQb3NzaWJseSBtb3JlIGNoZWNrcyBjb3VsZCBiZSBhZGRlZCAhISEhISEhISEhISEhCisqCisqLkRJQUdSQU0KKyoKKyoKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitoY2ZfZG1hX3J4X3B1dCggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCApCit7CisKKwlIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX0RNQV9SWF9QVVQsIDB4REEwMSApCisJSENGQVNTRVJUKCBpZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDLCBpZmJwLT5JRkJfTWFnaWMgKQorCUhDRkFTU0VSVF9JTlQKKworCXB1dF9mcmFtZV9sc3QoIGlmYnAsIGRlc2NwLCBETUFfUlggKTsKKyNpZiBIQ0ZfQVNTRVJUICYmIChIQ0ZfRU5DQVApID09IEhDRl9FTkMKKwlpZiAoIGRlc2NwLT5idWZfYWRkciApIHsKKwkJSENGQVNTRVJUKCBkZXNjcC0+QlVGX1NJWkUgPT0gSENGX0RNQV9SWF9CVUYxX1NJWkUsIGRlc2NwLT5CVUZfU0laRSApCisJCUhDRkFTU0VSVCggZGVzY3AtPm5leHRfZGVzY19hZGRyLCAwICkgLy8gZmlyc3QgZGVzY3JpcHRvciBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYW5vdGhlciBkZXNjcmlwdG9yCisJCS8vIFRoZSBzZWNvbmQgREIgaXMgZm9yIFNOQVAgYW5kIHBheWxvYWQgcHVycG9zZXMuIEl0IHNob3VsZCBiZSBhIG1pbmltdW0gb2YgMTIgYnl0ZXMgaW4gc2l6ZS4KKwkJSENGQVNTRVJUKCBkZXNjcC0+bmV4dF9kZXNjX2FkZHItPkJVRl9TSVpFID49IDEyLCBkZXNjcC0+bmV4dF9kZXNjX2FkZHItPkJVRl9TSVpFICkKKwl9CisjZW5kaWYgLy8gSENGQVNTRVJUIC8gSENGX0VOQworCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9ETUFfUlhfUFVUICkKK30gLy8gaGNmX2RtYV9yeF9wdXQKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLk1PRFVMRQkJREVTQ19TVFJDVCogaGNmX2RtYV90eF9nZXQoIElGQlAgaWZicCApCisqLlBVUlBPU0UJCURNQSBtb2RlOiByZWNsYWltcyBhbmQgZGVjYXBzdWxhdGVzIHBhY2tldHMgaW4gdGhlIHR4IGRlc2NyaXB0b3IgY2hhaW4gaWY6CisqCQkJCSAtIEEgVHggcGFja2V0IGhhcyBiZWVuIGNvcGllZCBmcm9tIGhvc3QtUkFNIGludG8gTklDLVJBTSBieSB0aGUgRE1BIGVuZ2luZQorKgkJCQkgLSBUaGUgSGVybWVzL0RNQWVuZ2luZSBoYXZlIGJlZW4gZGlzYWJsZWQKKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKgorKi5SRVRVUk5TCisqCXBvaW50ZXIgdG8gYSByZWNsYWltZWQgVHggcGFja2V0LgorKgorKi5ERVNDUklQVElPTgorKiBpbXBhY3Qgb2YgdGhlIGRpc2FibGUgY29tbWFuZDoKKyogV2hlbiBhIG5vbi1lbXB0eSBwb29sIG9mIFR4IGRlc2NyaXB0b3JzIGV4aXN0cyAoY3JlYXRlZCBieSBtZWFucyBvZiBoY2ZfZG1hX3B1dF90eCksIHRoZSBNU0YKKyogaXMgc3VwcG9zZWQgdG8gZW1wdHkgdGhhdCBwb29sIGJ5IG1lYW5zIG9mIGhjZl9kbWFfdHhfZ2V0IGNhbGxzIGFmdGVyIHRoZSBkaXNhYmxlIGluIGFuCisqIGRpc2FibGUvZW5hYmxlIHNlcXVlbmNlLgorKgorKi5ESUFHUkFNCisqCisqLk5PVElDRQorKgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0RFU0NfU1RSQ1QqCitoY2ZfZG1hX3R4X2dldCggSUZCUCBpZmJwICkKK3sKK0RFU0NfU1RSQ1QgKmRlc2NwOwkvLyBwb2ludGVyIHRvIHN0YXJ0IG9mIEZyYW1lTGlzdAorCisJZGVzY3AgPSBnZXRfZnJhbWVfbHN0KCBpZmJwLCBETUFfVFggKTsKKwlpZiAoIGRlc2NwICYmIGRlc2NwLT5idWZfYWRkciApICAvLyFiZSBhd2FyZSBvZiB0aGUgbWlzc2luZyBjdXJseSBicmFja2V0CisJCQkJCQkJCQkJCS8vc2tpcCBkZWNhcHN1bGF0aW9uIGF0IGNvbmZpbmVkIGRlc2NyaXB0b3IKKyNpZiAoSENGX0VOQ0FQKSA9PSBIQ0ZfRU5DCisJCWlmICggKCBkZXNjcC0+QlVGX0NOVCA9PSBIRlNfVFlQRSApCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0NDWAorCQkJIHx8ICggZGVzY3AtPkJVRl9DTlQgPT0gSEZTX0RBVCApCisjZW5kaWYgLy8gSENGX1RZUEVfQ0NYCisJCSkgeyAvLyBwZXJmb3JtIGRlY2Fwc3VsYXRpb24gaWYgbmVlZGVkCisJCQlkZXNjcC0+bmV4dF9kZXNjX2FkZHItPmJ1Zl9waHlzX2FkZHIgLT0gSENGX0RBU0FfU0laRTsKKwkJCWRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+QlVGX0NOVCAJCSArPSBIQ0ZfREFTQV9TSVpFOworCQl9CisjZW5kaWYgLy8gSENGX0VOQworCWlmICggZGVzY3AgPT0gTlVMTCApIHsgIC8vOz9jb3VsZCBiZSBpbnRlZ3JhdGVkIGludG8gZ2V0X2ZyYW1lX2xzdAorCQlpZmJwLT5JRkJfRG1hUGFja2V0cyAmPSAoaGNmXzE2KX5IUkVHX0VWX1RETUFEOworCX0KKwlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfRE1BX1RYX0dFVCApCisJcmV0dXJuIGRlc2NwOworfSAvLyBoY2ZfZG1hX3R4X2dldAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouTU9EVUxFCQl2b2lkIGhjZl9kbWFfdHhfcHV0KCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCBoY2ZfMTYgdHhfY250bCApCisqLlBVUlBPU0UJCXB1dHMgYSBwYWNrZXQgaW4gdGhlIFR4IERNQSBxdWV1ZSBpbiBob3N0IHJhbSBhbmQga2lja3Mgb2ZmIHRoZSBUeERtYSBlbmdpbmUuCisqCQkJCXN1cHBseSB0aGUgVHgtREVMV0EgZGVzY3JpcHRvci4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKglkZXNjcAkJYWRkcmVzcyBvZiBUeCBEZXNjcmlwdG9yIENoYWluIChpLmUuIGEgc2luZ2xlIFR4IGZyYW1lKQorKgl0eF9jbnRsCQlpbmRpY2F0ZXMgTUFDLXBvcnQgYW5kIChIZXJtZXMpIG9wdGlvbnMKKyoKKyouUkVUVVJOUwkJTi5BLgorKgorKi5ERVNDUklQVElPTgorKiBUaGUgSENGIGNhbiBiZSB1c2VkIGluIDIgZmFzaGlvbnM6IHdpdGggYW5kIHdpdGhvdXQgZW5jYXBzdWxhdGlvbiBmb3IgZGF0YSB0cmFuc2Zlci4KKyogVGhpcyBpcyBjb250cm9sbGVkIGF0IGNvbXBpbGUgdGltZSBieSB0aGUgSENGX0VOQyBiaXQgb2YgdGhlIEhDRl9FTkNBUCBzeXN0ZW0gY29uc3RhbnQuCisqCisqIFJlZ2FyZGxlc3Mgb2YgdGhlIEhDRl9FTkNBUCBzeXN0ZW0gY29uc3RhbnQsIHRoZSBkZXNjcmlwdG9yIGxpc3QgY3JlYXRlZCB0byBkZXNjcmliZSB0aGUgZnJhbWUgdG8gYmUKKyogdHJhbnNtaXR0ZWQsIG11c3Qgc3VwcGx5IHNwYWNlIHRvIGNvbnRhaW4gdGhlIDgwMi4xMSBoZWFkZXIsIHByZWNlZGluZyB0aGUgYWN0dWFsIGZyYW1lIHRvIGJlIHRyYW5zbWl0dGVkLgorKiBCYXNpY2FsbHksIHRoaXMgb25seSBzdXBwbGllcyB3b3JraW5nIHN0b3JhZ2UgdG8gdGhlIEhDRiB3aGljaCBwYXNzZXMgdGhpcyBvbiB0byB0aGUgRE1BIGVuZ2luZS4KKyogQXMgYSBjb25zZXF1ZW5jZSB0aGUgY29udGVudHMgb2YgdGhpcyBzcGFjZSBkbyBub3QgbWF0dGVyLgorKiBOZXZlcnRoZWxlc3MgQlVGX0NOVCBtdXN0IHRha2UgaW4gYWNjb3VudCB0aGlzIHN0b3JhZ2UuCisqIFRoaXMgd29ya2luZyBzcGFjZSB0byBjb250YWluIHRoZSA4MDIuMTEgaGVhZGVyIG1heSBub3QgYmUgZnJhZ21lbnRlZCwgdGhlIGZpcnN0IGJ1ZmZlciBtdXN0IGJlCisqIHN1ZmZpY2llbnRseSBsYXJnZSB0byBjb250YWluIGF0IGxlYXN0IHRoZSA4MDIuMTEgaGVhZGVyLCBpLmUuIEhGU19BRERSX0RFU1QgKDI5IHdvcmRzIG9yIDB4M0EgYnl0ZXMpLgorKiBUaGlzIHdheSwgdGhlIEhDRiBjYW4gc2ltcGx5LCByZWdhcmRsZXNzIHdoZXRoZXIgb3Igbm90IHRoZSBIQ0YgZW5jYXBzdWxhdGVzIHRoZSBmcmFtZSwgd3JpdGUgdGhlIHBhcmFtZXRlcgorKiB0eF9jbnRsIGF0IG9mZnNldCAweDM2IChIRlNfVFhfQ05UTCkgaW4gdGhlIGZpcnN0IGJ1ZmZlci4KKyogTm90ZSB0aGF0IGl0IGlzIGFsbG93ZWQgdG8gaGF2ZSBwYXJ0IG9yIGFsbCBvZiB0aGUgYWN0dWFsIGZyYW1lIHJlcHJlc2VudGVkIGJ5IHRoZSBmaXJzdCBkZXNjcmlwdG9yIGFzIGxvbmcKKyogYXMgdGhlIHJlcXVpcmVtZW50IGZvciBzdG9yYWdlIGZvciB0aGUgODAyLjExIGhlYWRlciBpcyBtZXQsIGkuZS4gdGhlIDgwMi4zIGZyYW1lIHN0YXJ0cyBhdCBvZmZzZXQKKyogSEZTX0FERFJfREVTVC4KKyogRXhjZXB0IGZvciB0aGUgQXNzZXJ0IG9uIHRoZSAxc3QgYnVmZmVyIGluIGNhc2Ugb2YgRW5jYXBzdWFsdGlvbiwgdGhlIFNJWkUgZmllbGRzIGFyZSBpZ25vcmVkLgorKgorKiBJbiBjYXNlIHRoZSBlbmNhcHN1bGF0aW9uIGZlYXR1cmUgaXMgY29tcGlsZWQgaW4sIHRoZXJlIGFyZSB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzLgorKiBvIFRoZSBCVUZfQ05UIG9mIHRoZSBmaXJzdCBidWZmZXIgY2hhbmdlcyBmcm9tIGEgbWluaW11bSBvZiAweDNBIGJ5dGVzIHRvIGV4YWN0bHkgMHgzQSwgaS5lLiB0aGUgd29ya3NwYWNlCisqCXRvIHN0b3JlIHRoZSA4MDIuMTEgaGVhZGVyCisqIG8gVGhlIEJVRl9TSVpFIG9mIHRoZSBmaXJzdCBidWZmZXIgaXMgYXQgbGVhc3QgdGhlIHNwYWNlIG5lZWRlZCB0byBzdG9yZSB0aGUKKyoJLSA4MDIuMTEgaGVhZGVyICgyOSB3b3JkcykKKyoJLSA4MDIuMyBoZWFkZXIsIGkuZS4gMTIgYnl0ZXMgYWRkcmVzc2luZyBpbmZvcm1hdGlvbiBhbmQgMiBieXRlcyBsZW5ndGggZmllbGQKKyoJLSA2IGJ5dGVzIFNOQVAtaGVhZGVyCisqICAgVGhpcyByZXN1bHRzIGluIDM5IHdvcmRzIG9yIDB4NEUgYnl0ZXMgb3IgSEZTX1RZUEUuCisqICAgTm90ZSB0aGF0IGlmIHRoZSBCVUZfU0laRSBpcyBsYXJnZXIgdGhhbiAweDRFLCB0aGlzIHN1cnBsdXMgaXMgbm90IHVzZWQuCisqIG8gVGhlIGFjdHVhbCBmcmFtZSBiZWdpbnMgaW4gdGhlIDJuZCBkZXNjcmlwdG9yICh3aGljaCBpcyBhbHJlYWR5IGltcGxpZWQgYnkgdGhlIEJVRl9DTlQgPT0gMHgzQSByZXF1aXJlbWVudCkgYW5kIHRoZSBhc3NvY2lhdGVkIGJ1ZmZlciBjb250YWlucyBhdCBsZWFzdCB0aGUgODAyLjMgaGVhZGVyLCBpLmUuIHRoZSAxNCBieXRlcyByZXByZXNlbnRpbmcgYWRkcmVzc2luZyBpbmZvcm1hdGlvbiBhbmQgbGVuZ3RoL3R5cGUgZmllbGQKKyoKKyogICBXaGVuIHRoZSBIQ0YgZG9lcyBub3QgZW5jYXBzdWxhdGVzIChpLmUuIGxlbmd0aC90eXBlIGZpZWxkIDw9IDE1MDApLCAgbm8gY2hhbmdlcyBhcmUgbWFkZSB0byBkZXNjcmlwdG9ycworKiAgIG9yIGJ1ZmZlcnMuCisqCisqICAgV2hlbiB0aGUgSENGIGFjdHVhbGx5IGVuY2Fwc3VsYXRlcyAoaS5lLiBsZW5ndGgvdHlwZSBmaWVsZCA+IDE1MDApLCBpdCBzdWNjZXNzaXZlbHkgd3JpdGVzLCBzdGFydGluZyBhdAorKiAgIG9mZnNldCBIRlNfQUREUl9ERVNUICgweDNBKSBpbiB0aGUgZmlyc3QgYnVmZmVyOgorKiAgICAgLSB0aGUgODAyLjMgYWRkcmVzc2luZyBpbmZvcm1hdGlvbiwgY29waWVkIGZyb20gdGhlIGJlZ2luIG9mIHRoZSBzZWNvbmQgYnVmZmVyCisqICAgICAtIHRoZSBmcmFtZSBsZW5ndGgsIGRlcml2ZWQgZnJvbSB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBpbmRpdmlkdWFsIGZyYWdtZW50cywgY29ycmVjdGVkIGZvciB0aGUgU05BUAorKiAgIAloZWFkZXIgbGVuZ3RoIGFuZCBUeXBlIGZpZWxkIGFuZCBpZ25vcmluZyB0aGUgRGVzdGluYXRpb24gQWRkcmVzcywgU291cmNlIEFkZHJlc3MgYW5kIExlbmd0aCBmaWVsZAorKiAJICAtIHRoZSBhcHByb3ByaWF0ZSBzbmFwIGhlYWRlciAoVHVubmVsIG9yIDEwNDIsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgdGhlIHR5cGUgZmllbGQpLgorKgorKiAJIFRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgZmlyc3QgdHdvIGRlc2NyaXB0b3JzIGlzIGFkanVzdGVkIGFjY29yZGluZ2x5OgorKiAJICAtIHRoZSBmaXJzdCBkZXNjcmlwdG9yIGNvdW50IGlzIGNoYW5nZWQgZnJvbSAweDNBIHRvIDB4NEUgKEhGU19UWVBFKSwgd2hpY2ggbWF0Y2hlcyAweDNBICsgMTIgKyAyICsgNgorKiAJICAtIHRoZSBzZWNvbmQgZGVzY3JpcHRvciBjb3VudCBpcyBkZWNyZWFzZWQgYnkgMTIsIGJlaW5nIHRoZSBtb3ZlZCBhZGRyZXNzaW5nIGluZm9ybWF0aW9uCisqIAkgIC0gdGhlIHNlY29uZCBkZXNjcmlwdG9yIChwaHlzaWNhbCkgYnVmZmVyIGFkZHJlc3MgaXMgaW5jcmVhc2VkIGJ5IDEyLgorKgorKiBXaGVuIHRoZSBkZXNjcmlwdG9ycyBhcmUgcmV0dXJuZWQgYnkgaGNmX2RtYV90eF9nZXQsIHRoZSB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgZmlyc3QgdHdvIGRlc2NyaXB0b3JzIGlzCisqIHVuZG9uZS4KKyoKKyogVW5kZXIgYW55IG9mIHRoZSBhYm92ZSBzY2VuYXJpb3MsIHRoZSBhc3NlcnQgQlVGX0NOVCA8PSBCVUZfU0laRSBtdXN0IGJlIHRydWUgZm9yIGFsbCBkZXNjcmlwdG9ycworKiBJbiBjYXNlIG9mIGVuY2Fwc3VsYXRpb24sIEJVRl9TSVpFIG9mIHRoZSAxc3QgZGVzY3JpcHRvciBpcyBhc3NlcnRlZCB0byBiZSBhdCBsZWFzdCBIRlNfVFlQRSAoMHg0RSksIHNvIGl0IGlzIE5PVCB0ZXN0ZWQuCisqCisqIEFzc2VydCBmYWlscyBpZgorKiAtIGlmYnAgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZS4KKyogLSB0eF9jbnRsIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCisqIC0gTklDIGludGVycnVwdHMgYXJlIG5vdCBkaXNhYmxlZCB3aGlsZSByZXF1aXJlZCBieSBwYXJhbWV0ZXIgYWN0aW9uLgorKiAtIGluIGNhc2UgZW5jYXBzdWxhdGlvbiBieSB0aGUgSENGIGlzIHNlbGVjdGVkOgorKgkgIC0JVGhlIEZyYW1lTGlzdCBkb2VzIG5vdCBjb25zaXN0cyBvZiBhdCBsZWFzdCAyIERlc2NyaXB0b3JzLgorKgkgIC0JVGhlIGZpcnN0IGRhdGFidWZmZXIgZG9lcyBub3QgY29udGFpbiBleGFjdGx5IHRoZSAoc3BhY2UgZm9yKSB0aGUgODAyLjExIGhlYWRlciAoPT0gMjggd29yZHMpCisqCSAgLQlUaGUgZmlyc3QgZGF0YWJ1ZmZlciBkb2VzIG5vdCBoYXZlIGEgc2l6ZSB0byBhZGRpdGlvbmFsbHkgYWNjb21vZGF0ZSB0aGUgODAyLjMgaGVhZGVyIGFuZCB0aGUKKyoJCVNOQVAgaGVhZGVyIG9mIHRoZSBmcmFtZSBhZnRlciBlbmNhcHN1bGF0aW9uICg9PSAzOSB3b3JkcykuCisqCSAgLQlUaGUgc2Vjb25kIGRhdGFidWZmZXIgZG9lcyBub3QgY29udGFpbiBhdCBsZWFzdCBEQSwgU0EgYW5kICd0eXBlL2xlbmd0aCcgKD09MTQgYnl0ZXMgb3IgNyB3b3JkcykKKyohISBUaGUgMm5kIHBhcnQgb2YgdGhlIGxpc3Qgb2YgYXNzZXJ0cyBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggcHV0X2ZyYW1lX2xzdCwgaW4gb3JkZXIgdG8gZ2V0CisqISEgdGhlbSBpbiB0aGUgV0NJLXNwZWMgISEhIQorKiAtIERNQSBpcyBub3QgZW5hYmxlZAorKiAtIGRlc2NyaXB0b3IgbGlzdCBpcyBOVUxMCisqIC0gYSBkZXNjcmlwdG9yIGluIHRoZSBkZXNjcmlwdG9yIGxpc3QgaXMgbm90IGRvdWJsZSB3b3JkIGFsaWduZWQKKyogLSBhIGNvdW50IG9mIHNpemUgZmllbGQgb2YgYSBkZXNjcmlwdG9yIGNvbnRhaW5zIGNvbnRyb2wgYml0cywgaS5lLiBiaXRzIGluIHRoZSBoaWdoIG9yZGVyIG5pYmJsZS4KKyogLSB0aGUgREVMV0EgZGVzY3JpcHRvciBpcyBub3QgYSAic2luZ2xldG9uIiBEZXNjcmlwdG9yTGlzdC4KKyogLSB0aGUgREVMV0EgZGVzY3JpcHRvciBpcyBub3QgdGhlIGZpcnN0IERlc2NyaXB0b3Igc3VwcGxpZWQKKyogLSBhIG5vbl9ETUEgZGVzY3JpcHRvciBpcyBzdXBwbGllZCBiZWZvcmUgdGhlIERFTFdBIERlc2NyaXB0b3IgaXMgc3VwcGxpZWQKKyohISAtIFBvc3NpYmx5IG1vcmUgY2hlY2tzIGNvdWxkIGJlIGFkZGVkICEhISEhISEhISEhISEKKyouRElBR1JBTQorKgorKi5OT1RJQ0UKKyoKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqCisqMToJV3JpdGUgdHhfY250bCBwYXJhbWV0ZXIgdG8gSEZTX1RYX0NOVEwgZmllbGQgaW50byB0aGUgSGVybWVzLXNwZWNpZmljIGhlYWRlciBpbiBidWZmZXIgMQorKjQ6CWRldGVybWluZSB3aGV0aGVyIGVuY2Fwc3VsYXRpb24gaXMgbmVlZGVkIGFuZCB3cml0ZSB0aGUgdHlwZSAodHVubmVsIG9yIDEwNDIpIGFscmVhZHkgYXQgdGhlIGFwcHJvcHJpYXRlCisqCW9mZnNldCBpbiB0aGUgMXN0IGJ1ZmZlcgorKjY6CUJ1aWxkIHRoZSBlbmNhcHN1YWx0aW9uIGVudmVsb3BwZSBpbiB0aGUgZnJlZSBzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSAxc3QgYnVmZmVyCisqCS0gQ29weSBEQS9TQSBmaWVsZHMgZnJvbSB0aGUgMm5kIGJ1ZmZlcgorKiAgIC0gQ2FsY3VsYXRlIHRvdGFsIGxlbmd0aCBvZiB0aGUgbWVzc2FnZSAoc25hcC1oZWFkZXIgKyB0eXBlLWZpZWxkICsgdGhlIGxlbmd0aCBvZiBhbGwgYnVmZmVyIGZyYWdtZW50cworKiAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSA4MDIuMyBmcmFtZSAoaS5lIGFsbCBkZXNjcmlwdG9ycyBleGNlcHQgdGhlIGZpcnN0KSwgYnV0IG5vdCB0aGUgRGVzdGluYXRpb25BZGRyZXNzLAorKiAgICAgU291cmNlQWRkcmVzcyBhbmQgbGVuZ2h0LWZpZWxkKQorKiAgICAgQXNzZXJ0IHRoZSBtZXNzYWdlIGxlbmd0aAorKgkgIFdyaXRlIGxlbmd0aC4gTm90ZSB0aGF0IHRoZSBtZXNzYWdlIGlzIGluIEJFIGZvcm1hdCwgaGVuY2Ugb24gTEUgcGxhdGZvcm1zIHRoZSBsZW5ndGggbXVzdCBiZSBjb252ZXJ0ZWQKKyoJICA7PyBUSElTIElTIE5PVCBXSEFUIENVUlJFTlRMWSBJUyBJTVBMRU1FTlRFRAorKgktIFdyaXRlIHNuYXAgaGVhZGVyLiBOb3RlIHRoYXQgdGhlIGxhc3QgYnl0ZSBvZiB0aGUgc25hcCBoZWFkZXIgaXMgTk9UIGNvcGllZCwgdGhhdCBieXRlIGlzIGFscmVhZHkgaW4KKyoJICBwbGFjZSBhcyByZXN1bHQgb2YgdGhlIGNhbGwgdG8gaGNmX2VuY2FwLgorKglOb3RlIHRoYXQgdGhlcmUgYXJlIG1hbnkgd2F5cyB0byBza2luIGEgY2F0LiBUbyBleHByZXNzIHRoZSBvZmZzZXRzIGluIHRoZSAxc3QgYnVmZmVyIHdoaWxlIHdyaXRpbmcKKyoJdGhlIHNuYXAgaGVhZGVyLCBIRlNfVFlQRSBpcyBjaG9vc2VuIGFzIGEgcmVmZXJlbmNlIHBvaW50IHRvIG1ha2UgaXQgZWFzaWVyIHRvIGdyYXNwIHRoYXQgdGhlIHNuYXAgaGVhZGVyCisqCWFuZCBlbmNhcHN1YWx0aW9uIHR5cGUgYXJlIGF0IGxlYXN0IHJlbGF0aXZlIGluIHRoZSByaWdodC4KKyo4Ogltb2RpZnkgMXN0IGRlc2NyaXB0b3IgdG8gcmVmbGVjdCBtb3ZlZCBwYXJ0IG9mIHRoZSA4MDIuMyBoZWFkZXIgKyBTbmFwLWhlYWRlcgorKgltb2RpZnkgMm5kIGRlc2NyaXB0b3IgdG8gc2tpcCB0aGUgbW92ZWQgcGFydCBvZiB0aGUgODAyLjMgaGVhZGVyIChEQS9TQQorKjEwOiBzZXQgZWFjaCBkZXNjcmlwdG9yIHRvICdETUEgb3duZWQnLCAgY2xlYXIgYWxsIG90aGVyIGNvbnRyb2wgYml0cy4KKyoJU2V0IFNPUCBiaXQgb24gZmlyc3QgZGVzY3JpcHRvci4gU2V0IEVPUCBiaXQgb24gbGFzdCBkZXNjcmlwdG9yLgorKjEyOiBFaXRoZXIgYXBwZW5kIHRoZSBjdXJyZW50IGZyYW1lIHRvIGFuIGV4aXN0aW5nIGRlc2NyaXB0b3IgbGlzdCBvcgorKjE0OiBjcmVhdGUgYSBsaXN0IGJlZ2lubmluZyB3aXRoIHRoZSBjdXJyZW50IGZyYW1lCisqMTY6IHJlbWVtYmVyIHRoZSBuZXcgZW5kIG9mIHRoZSBsaXN0CisqMjA6IGhhbmQgdGhlIGZyYW1lIG92ZXIgdG8gdGhlIERNQSBlbmdpbmUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2hjZl9kbWFfdHhfcHV0KCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCBoY2ZfMTYgdHhfY250bCApCit7CitERVNDX1NUUkNUCSpwID0gZGVzY3AtPm5leHRfZGVzY19hZGRyOworaW50CQkJaTsKKworI2lmIEhDRl9BU1NFUlQKKwlpbnQgeCA9IGlmYnAtPklGQl9GV0lkZW50aXR5LmNvbXBfaWQgPT0gQ09NUF9JRF9GV19BUCA/IHR4X2NudGwgJiB+SEZTX1RYX0NOVExfUE9SVCA6IHR4X2NudGw7CisJSENGQVNTRVJUKCAoeCAmIH5IQ0ZfVFhfQ05UTF9NQVNLICkgPT0gMCwgdHhfY250bCApCisjZW5kaWYgLy8gSENGX0FTU0VSVAorCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfRE1BX1RYX1BVVCwgMHhEQTAzICkKKwlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApCisJSENGQVNTRVJUX0lOVAorCUhDRkFTU0VSVCggKCBpZmJwLT5JRkJfQ250bE9wdCAmIChVU0VfRE1BfERNQV9FTkFCTEVEKSApID09IChVU0VfRE1BfERNQV9FTkFCTEVEKSwgaWZicC0+SUZCX0NudGxPcHQpCisKKwlpZiAoIGRlc2NwLT5idWZfYWRkciApIHsKKwkJKihoY2ZfMTYqKShkZXNjcC0+YnVmX2FkZHIgKyBIRlNfVFhfQ05UTCkgPSB0eF9jbnRsOwkJCQkJCQkJCQkJLyoxKi8KKyNpZiAoSENGX0VOQ0FQKSA9PSBIQ0ZfRU5DCisJCUhDRkFTU0VSVCggZGVzY3AtPm5leHRfZGVzY19hZGRyLCAwICkJCQkJCQkJCQkvL2F0IGxlYXN0IDIgZGVzY3JpcG9ycworCQlIQ0ZBU1NFUlQoIGRlc2NwLT5CVUZfQ05UID09IEhGU19BRERSX0RFU1QsIGRlc2NwLT5CVUZfQ05UICkJLy9leGFjdCBsZW5ndGggcmVxdWlyZWQgZm9yIDFzdCBidWZmZXIKKwkJSENGQVNTRVJUKCBkZXNjcC0+QlVGX1NJWkUgPj0gSENGX0RNQV9UWF9CVUYxX1NJWkUsIGRlc2NwLT5CVUZfU0laRSApCS8vbWluaW1hbCBzdG9yYWdlIGZvciBlbmNhcHN1bGF0aW9uCisJCUhDRkFTU0VSVCggcC0+QlVGX0NOVCA+PSAxNCwgcC0+QlVGX0NOVCApOwkJCQkJLy9hdCBsZWFzdCBEQSwgU0EgYW5kICd0eXBlJyBpbiAybmQgYnVmZmVyCisKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfQ0NYCisJCS8qIGlmIHdlIGFyZSBkb2luZyBQUEsgKy8tIENNSUMsIG9yIHdlIGFyZSBzZW5kaW5nIGEgRERQIGZyYW1lICovCisJCWlmICggKCBpZmJwLT5JRkJfQ0tJUFN0YXQgPT0gSENGX0FDVF9DQ1hfT04gKSB8fAorCQkJICggKCBwLT5CVUZfQ05UID49IDIwICkJCSAmJiAoIGlmYnAtPklGQl9DS0lQU3RhdCA9PSBIQ0ZfQUNUX0NDWF9PRkYgKSAmJgorCQkJICggcC0+YnVmX2FkZHJbMTJdID09IDB4QUEgKSAmJiAoIHAtPmJ1Zl9hZGRyWzEzXSA9PSAweEFBICkgJiYKKwkJCSAoIHAtPmJ1Zl9hZGRyWzE0XSA9PSAweDAzICkgJiYgKCBwLT5idWZfYWRkclsxNV0gPT0gMHgwMCApICYmCisJCQkgKCBwLT5idWZfYWRkclsxNl0gPT0gMHg0MCApICYmICggcC0+YnVmX2FkZHJbMTddID09IDB4OTYgKSAmJgorCQkJICggcC0+YnVmX2FkZHJbMThdID09IDB4MDAgKSAmJiAoIHAtPmJ1Zl9hZGRyWzE5XSA9PSAweDAwICkpKQorCQl7CisJCQkvKiBjb3B5IHRoZSBEQS9TQSB0byB0aGUgZmlyc3QgYnVmZmVyICovCisJCQlmb3IgKCBpID0gMDsgaSA8IEhDRl9EQVNBX1NJWkU7IGkrKyApIHsKKwkJCQlkZXNjcC0+YnVmX2FkZHJbaSArIEhGU19BRERSX0RFU1RdID0gcC0+YnVmX2FkZHJbaV07CisJCQl9CisJCQkvKiBjYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgc2Vjb25kIGZyYWdtZW50IG9ubHkgKi8KKwkJCWkgPSAwOworCQkJZG8geyBpICs9IHAtPkJVRl9DTlQ7IH0gd2hpbGUoIHAgPSBwLT5uZXh0X2Rlc2NfYWRkciApOworCQkJaSAtPSBIQ0ZfREFTQV9TSVpFIDsKKwkJCS8qIGNvbnZlcnQgdGhlIGxlbmd0aCBmaWVsZCB0byBiaWcgZW5kaWFuLCB1c2luZyB0aGUgZW5kaWFuIGZyaWVuZGx5IG1hY3JvcyAqLworCQkJaSA9IENOVl9TSE9SVF9UT19CSUcoaSk7CQkvLyEhIHRoaXMgY29udmVydHMgT05MWSBvbiBMRSBwbGF0Zm9ybXMsIGhvdyBkb2VzIHRoYXQgcmVsYXRlIHRvIHRoZSBub24tQ0NYIGNvZGUKKwkJCSooaGNmXzE2KikoJmRlc2NwLT5idWZfYWRkcltIRlNfTEVOXSkgPSAoaGNmXzE2KWk7CisJCQlkZXNjcC0+QlVGX0NOVCA9IEhGU19EQVQ7CisJCQkvLyBtb2RpZnkgMm5kIGRlc2NyaXB0b3IgdG8gc2tpcCB0aGUgJ0RhL1NhJyBmaWVsZHMKKwkJCWRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+YnVmX3BoeXNfYWRkciArPSBIQ0ZfREFTQV9TSVpFOworCQkJZGVzY3AtPm5leHRfZGVzY19hZGRyLT5CVUZfQ05UCQkgLT0gSENGX0RBU0FfU0laRTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gSENGX1RZUEVfQ0NYCisJCXsKKwkJCWRlc2NwLT5idWZfYWRkcltIRlNfVFlQRS0xXSA9IGhjZl9lbmNhcCgmZGVzY3AtPm5leHRfZGVzY19hZGRyLT5idWZfYWRkcltIQ0ZfREFTQV9TSVpFXSk7CQkvKjQqLworCQkJaWYgKCBkZXNjcC0+YnVmX2FkZHJbSEZTX1RZUEUtMV0gIT0gRU5DX05PTkUgKSB7CisJCQkJZm9yICggaT0wOyBpIDwgSENGX0RBU0FfU0laRTsgaSsrICkgewkJCQkJCQkJCQkJCQkJLyo2Ki8KKwkJCQkJZGVzY3AtPmJ1Zl9hZGRyW2kgKyBIRlNfQUREUl9ERVNUXSA9IGRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+YnVmX2FkZHJbaV07CisJCQkJfQorCQkJCWkgPSBzaXplb2Yoc25hcF9oZWFkZXIpICsgMiAtICggMio2ICsgMiApOworCQkJCWRvIHsgaSArPSBwLT5CVUZfQ05UOyB9IHdoaWxlICggKCBwID0gcC0+bmV4dF9kZXNjX2FkZHIgKSAhPSBOVUxMICk7CisJCQkJKihoY2ZfMTYqKSgmZGVzY3AtPmJ1Zl9hZGRyW0hGU19MRU5dKSA9IENOVl9FTkRfU0hPUlQoaSk7CS8vISEgdGhpcyBjb252ZXJ0cyBvbiBBTEwgcGxhdGZvcm1zLCBob3cgZG9lcyB0aGF0IHJlbGF0ZSB0byB0aGUgQ0NYIGNvZGUKKwkJCQlmb3IgKCBpPTA7IGkgPCBzaXplb2Yoc25hcF9oZWFkZXIpIC0gMTsgaSsrKSB7CisJCQkJCWRlc2NwLT5idWZfYWRkcltIRlNfVFlQRSAtIHNpemVvZihzbmFwX2hlYWRlcikgKyBpXSA9IHNuYXBfaGVhZGVyW2ldOworCQkJCX0KKwkJCQlkZXNjcC0+QlVGX0NOVCA9IEhGU19UWVBFOwkJCQkJCQkJCQkJCQkJCQkJLyo4Ki8KKwkJCQlkZXNjcC0+bmV4dF9kZXNjX2FkZHItPmJ1Zl9waHlzX2FkZHIJKz0gSENGX0RBU0FfU0laRTsKKwkJCQlkZXNjcC0+bmV4dF9kZXNjX2FkZHItPkJVRl9DTlQJCQktPSBIQ0ZfREFTQV9TSVpFOworCQkJfQorCQl9CisjZW5kaWYgLy8gSENGX0VOQworICAgIH0KKwlwdXRfZnJhbWVfbHN0KCBpZmJwLCBkZXNjcCwgRE1BX1RYICk7CisJSENGTE9HRVhJVCggSENGX1RSQUNFX0RNQV9UWF9QVVQgKQorfSAvLyBoY2ZfZG1hX3R4X3B1dAorCisjZW5kaWYgLy8gSENGX0RNQQorCisjaWYgKEhDRl9ETF9PTkxZKSA9PSAwCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLk1PRFVMRQkJaGNmXzggaGNmX2VuY2FwKCB3Y2lfYnVmcCB0eXBlICkKKyouUFVSUE9TRQkJdGVzdCB3aGV0aGVyIFJGQzEwNDIgb3IgQnJpZGdlLVR1bm5lbCBlbmNhcHN1bGF0aW9uIGlzIG5lZWRlZC4KKyoKKyouQVJHVU1FTlRTCisqCXR5cGUJCShGYXIpIHBvaW50ZXIgdG8gdGhlIChCaWcgRW5kaWFuKSBUeXBlL0xlbmd0aCBmaWVsZCBpbiB0aGUgbWVzc2FnZQorKgorKi5SRVRVUk5TCisqCUVOQ19OT05FCQlsZW4vdHlwZSBpcyAibGVuIiAoIChCSUdfRU5ESUFOKXR5cGUgPD0gMTUwMCApCisqCUVOQ19UVU5ORUwJCWxlbi90eXBlIGlzICJ0eXBlIiBhbmQgMHg4MEYzIG9yIDB4ODEzNworKglFTkNfMTA0MgkJbGVuL3R5cGUgaXMgInR5cGUiIGJ1dCBub3QgMHg4MEYzIG9yIDB4ODEzNworKgorKi5DT05ESVRJT05TCisqCU5JQyBJbnRlcnJ1cHRzCWQuYworKgorKi5ERVNDUklQVElPTgorKiBUeXBlIG11c3QgcG9pbnQgdG8gdGhlIExlbi9UeXBlIGZpZWxkIG9mIHRoZSBtZXNzYWdlLCB0aGlzIGlzIHRoZSAyLWJ5dGUgZmllbGQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIDYgYnl0ZQorKiBEZXN0aW5hdGlvbiBBZGRyZXNzIGFuZCA2IGJ5dGUgU291cmNlIEFkZHJlc3MuICBUaGUgMiBzdWNjZXNzaXZlIGJ5dGVzIGFkZHJlc3NlZCBieSB0eXBlIGFyZSBpbnRlcnByZXRlZCBhcworKiBhIEJpZyBFbmRpYW4gdmFsdWUuICBJZiB0aGF0IHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxNTAwLCB0aGUgbWVzc2FnZSBpcyBhc3N1bWVkIHRvIGJlIGluIDgwMi4zCisqIGZvcm1hdC4gIE90aGVyd2lzZSB0aGUgbWVzc2FnZSBpcyBhc3N1bWVkIHRvIGJlIGluIEV0aGVybmV0LUlJIGZvcm1hdC4gIERlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgTGVuL1R5cCwKKyogQnJpZGdlIFR1bm5lbCBvciBSRkMxMDQyIGVuY2Fwc3VsYXRpb24gaXMgbmVlZGVkLgorKgorKi5ESUFHUkFNCisqCisqICAxOglwcmVzdW1lIDgwMi4zLCBoZW5jZSBwcmVzZXQgcmV0dXJuIHZhbHVlIGF0IEVOQ19OT05FCisqICAyOgljb252ZXJ0IHR5cGUgZnJvbSAibmV0d29yayIgRW5kaWFuIGZvcm1hdCB0byBuYXRpdmUgRW5kaWFuCisqICA0Ogl0aGUgbGl0bXVzIHRlc3QgdG8gZGlzdGluZ3Vpc2ggdHlwZSBhbmQgbGVuLgorKglUaGUgaGFyZCBjb2RlICJtYWdpYyIgdmFsdWUgb2YgMTUwMCBpcyBpbnRlbnRpb25hbCBhbmQgc2hvdWxkIE5PVCBiZSByZXBsYWNlZCBieSBhIG1uZW1vbmljIGJlY2F1c2UgaXQgaXMKKyoJbm90IHJlbGF0ZWQgYXQgYWxsIHRvIHRoZSBtYXhpbXVtIGZyYW1lIHNpemUgc3VwcG9ydGVkICBieSB0aGUgSGVybWVzLgorKiAgNjoJY2hlY2sgdHlwZSBhZ2FpbnN0OgorKgkJMHg4MEYzCS8vQXBwbGVUYWxrIEFkZHJlc3MgUmVzb2x1dGlvbiBQcm90b2NvbCAoQUFSUCkKKyoJCTB4ODEzNwkvL0lQWAorKgl0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgZW5jYXBzdWxhdGlvbgorKgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBIQ0ZfRU5DQVAJLy9pLmUgSENGX0VOQyBvciBIQ0ZfRU5DX1NVUAorI2lmICEgKCAoSENGX0VOQ0FQKSAmIEhDRl9FTkNfU1VQICkKK0hDRl9TVEFUSUMKKyNlbmRpZiAvLyBIQ0ZfRU5DQVAKK2hjZl84CitoY2ZfZW5jYXAoIHdjaV9idWZwIHR5cGUgKQoreworCitoY2ZfOAlyYyA9IEVOQ19OT05FOwkJCQkJCQkJCQkJCQkJCQkJCQkJCS8qIDEgKi8KK2hjZl8xNgl0ID0gKGhjZl8xNikoKnR5cGU8PDgpICsgKih0eXBlKzEpOwkJCQkJCQkJCQkJCQkJCQkvKiAyICovCisKKwlpZiAoIHQgPiAxNTAwICkgewkJCQkJCQkJCQkJCQkJCQkJCQkJCS8qIDQgKi8KKwkJaWYgKCB0ID09IDB4ODEzNyB8fCB0ID09IDB4ODBGMyApIHsKKwkJCXJjID0gRU5DX1RVTk5FTDsJCQkJCQkJCQkJCQkJCQkJCQkJLyogNiAqLworCQl9IGVsc2UgeworCQkJcmMgPSBFTkNfMTA0MjsKKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9IC8vIGhjZl9lbmNhcAorI2VuZGlmIC8vIEhDRl9FTkNBUAorI2VuZGlmIC8vIEhDRl9ETF9PTkxZCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5NT0RVTEUJCWludCBoY2ZfZ2V0X2luZm8oIElGQlAgaWZicCwgTFRWUCBsdHZwICkKKyouUFVSUE9TRQkJT2J0YWlucyB0cmFuc2llbnQgYW5kIHBlcnNpc3RlbnQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBDYXJkIGFuZCBmcm9tIHRoZSBIQ0YuCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyoJbHR2cAkJYWRkcmVzcyBvZiBMZW5ndGhUeXBlVmFsdWUgc3RydWN0dXJlIHNwZWNpZnlpbmcgdGhlICJ3aGF0IiBhbmQgdGhlICJob3cgbXVjaCIgb2YgdGhlCisqCQkJCWluZm9ybWF0aW9uIHRvIGJlIGNvbGxlY3RlZCBmcm9tIHRoZSBIQ0Ygb3IgZnJvbSB0aGUgSGVybWVzCisqCisqLlJFVFVSTlMKKyoJSENGX0VSUl9MRU4JCQlUaGUgcHJvdmlkZWQgYnVmZmVyIHdhcyB0b28gc21hbGwKKyoJSENGX1NVQ0NFU1MJCQlTdWNjZXNzCisqISEJdmlhIGNtZF9leGUgKCB0eXBlID49IENGR19SSURfRldfTUlOICkKKyoJSENGX0VSUl9OT19OSUMJCU5JQyByZW1vdmVkIGR1cmluZyByZXRyaWV2YWwKKyoJSENGX0VSUl9USU1FX09VVAlFeHBlY3RlZCBIZXJtZXMgZXZlbnQgZGlkIG5vdCBvY2N1cmUgaW4gZXhwZWN0ZWQgdGltZQorKiEhCXZpYSBjbWRfZXhlIGFuZCBzZXR1cF9iYXAgKHR5cGUgPj0gQ0ZHX1JJRF9GV19NSU4gKQorKglIQ0ZfRVJSX0RFRlVOQ1RfLi4uCUhDRiBpcyBpbiBkZWZ1bmN0IG1vZGUgKGJpdHMgMHg3RiByZWZsZWN0IGNhdXNlKQorKgorKi5ERVNDUklQVElPTgorKiBUaGUgVC1maWVsZCBvZiB0aGUgTFRWLXJlY29yZCAocHJvdmlkZWQgYnkgdGhlIE1TRiBpbiBwYXJhbWV0ZXIgbHR2cCkgc3BlY2lmaWVzIHRoZSBSSUQgd2FudGVkLiBUaGUgUklECisqIGluZm9ybWF0aW9uIGlkZW50aWZpZWQgYnkgdGhlIFQtZmllbGQgaXMgY29waWVkIGludG8gdGhlIFYtZmllbGQuCisqIE9uIGVudHJ5LCB0aGUgTC1maWVsZCBzcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciwgYWxzbyBjYWxsZWQgdGhlICJJbml0aWFsIERhdGFMZW5ndGgiLiBUaGUgTC12YWx1ZQorKiBpbmNsdWRlcyB0aGUgc2l6ZSBvZiB0aGUgVC1maWVsZCwgYnV0IG5vdCB0aGUgc2l6ZSBvZiB0aGUgTC1maWVsZCBpdHNlbGYuCisqIE9uIHJldHVybiwgdGhlIEwtZmllbGQgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2Ygd29yZHMgYWN0dWFsbHkgY29udGFpbmVkIGJ5IHRoZSBUeXBlIGFuZCBWYWx1ZSBmaWVsZHMuCisqIEFzIHRoZSBzaXplIG9mIHRoZSBUeXBlIGZpZWxkIGluIHRoZSBMVFYtcmVjb3JkIGlzIGluY2x1ZGVkIGluIHRoZSAiSW5pdGlhbCBEYXRhTGVuZ3RoIiBvZiB0aGUgcmVjb3JkLCB0aGUKKyogVi1maWVsZCBjYW4gY29udGFpbiBhdCBtb3N0ICJJbml0aWFsIERhdGFMZW5ndGgiIC0gMSB3b3JkcyBvZiBkYXRhLgorKiBDb3B5aW5nIHN0b3BzIGlmIGVpdGhlciB0aGUgY29tcGxldGUgSW5mb3JtYXRpb24gaXMgY29waWVkIG9yIGlmIHRoZSBudW1iZXIgb2Ygd29yZHMgaW5kaWNhdGVkIGJ5IHRoZQorKiAiSW5pdGlhbCBEYXRhTGVuZ3RoIiB3ZXJlIGNvcGllZC4gIFRoZSAiSW5pdGlhbCBEYXRhTGVuZ3RoIiBhY3RzIGFzIGEgc2FmZSBndWFyZCBhZ2FpbnN0IENvbmZpZ3VyYXRpb24KKyogSW5mb3JtYXRpb24gYmxvY2tzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgc2l6ZXMgZm9yIGRpZmZlcmVudCBGL1cgdmVyc2lvbnMsIGUuZy4gd2hlbiBsYXRlciB2ZXJzaW9ucyBzdXBwb3J0CisqIG1vcmUgdGFsbGllcyB0aGFuIGVhcmxpZXIgdmVyc2lvbnMuCisqIElmIHRoZSBzaXplIG9mIFZhbHVlIGZpZWxkIG9mIHRoZSBSSUQgZXhjZWVkcyB0aGUgc2l6ZSBvZiB0aGUgIkluaXRpYWwgRGF0YUxlbmd0aCIgLTEsIGFzIG11Y2ggZGF0YQorKiBhcyBmaXRzIGlzIGNvcGllZCwgYW5kIGFuIGVycm9yIHN0YXR1cyBvZiBIQ0ZfRVJSX0xFTiBpcyByZXR1cm5lZC4KKyoKKyogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBNU0YgdG8gZGV0ZWN0IGNhcmQgcmVtb3ZhbCBhbmQgcmUtaW5zZXJ0aW9uIGFuZCBub3QgY2FsbCB0aGUgSENGIHdoZW4gdGhlCisqIE5JQyBpcyBhYnNlbnQuIFRoZSBNU0YgY2Fubm90LCBob3dldmVyLCB0aW1lbHkgZGV0ZWN0IGEgQ2FyZCByZW1vdmFsIGlmIHRoZSBDYXJkIGlzIHJlbW92ZWQgd2hpbGUKKyogaGNmX2dldF9pbmZvIGlzIGluIHByb2dyZXNzLiAgVGhlcmVmb3JlLCB0aGUgSENGIHBlcmZvcm1zIGl0cyBvd24gY2hlY2sgb24gQ2FyZCBwcmVzZW5jZSBhZnRlciB0aGUgcmVhZAorKiBvcGVyYXRpb24gb2YgdGhlIE5JQyBkYXRhLiAgSWYgdGhlIENhcmQgaXMgbm90IHByZXNlbnQgb3IgcmVtb3ZlZCBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiBoY2ZfZ2V0X2luZm8sCisqIEhDRl9FUlJfTk9fTklDIGlzIHJldHVybmVkIGFuZCB0aGUgY29udGVudCBvZiB0aGUgRGF0YSBCdWZmZXIgaXMgdW5wcmVkaWN0YWJsZS4gVGhpcyBjaGVjayBpcyBub3QgcGVyZm9ybWVkCisqIGluIGNhc2Ugb2YgdGhlICJIQ0YgZW1iZWRkZWQiIHBzZXVkbyBSSURzIGxpa2UgQ0ZHX1RBTExJRVMuCisqCisqIEFzc2VydCBmYWlscyBpZgorKiAtIGlmYnAgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZS4KKyogLSByZWVudHJhbmN5LCBtYXkgYmUgIGNhdXNlZCBieSBjYWxsaW5nIGhjZl9mdW5jdGlvbnMgd2l0aG91dCBhZGVxdWF0ZSBwcm90ZWN0aW9uCisqCWFnYWluc3QgTklDIGludGVycnVwdHMgb3IgbXVsdGktdGhyZWFkaW5nLgorKiAtIGx0dnAgaXMgYSBOVUxMIHBvaW50ZXIuCisqIC0gbGVuZ3RoIGZpZWxkIG9mIHRoZSBMVFYtcmVjb3JkIGF0IGVudHJ5IGlzIDAgb3IgMSBvciBoYXMgYW4gZXhjZXNzaXZlIHZhbHVlIChpLmUuIGV4Y2VlZHMgSENGX01BWF9MVFYpLgorKiAtIHR5cGUgZmllbGQgb2YgdGhlIExUVi1yZWNvcmQgaXMgaW52YWxpZC4KKyoKKyouRElBR1JBTQorKglIY2ZfZ2V0X21iX2luZm8gY29waWVzIHRoZSBjb250ZW50cyBvZiB0aGUgb2xkZXN0IE1haWxCb3ggSW5mbyBibG9jayBpbiB0aGUgTWFpbEJveCB0byBQQyBSQU0uIElmIGxlbiBpcworKglsZXNzIHRoYW4gdGhlIHNpemUgb2YgdGhlIE1haWxCb3ggSW5mbyBibG9jaywgb25seSBhcyBtdWNoIGFzIGZpdHMgaW4gdGhlIFBDIFJBTSBidWZmZXIgaXMgY29waWVkLiBBZnRlcgorKgl0aGUgY29weWluZyB0aGUgTWFpbEJveCBSZWFkIHBvaW50ZXIgaXMgdXBkYXRlZCB0byBwb2ludCB0byB0aGUgbmV4dCBNYWlsQm94IEluZm8gYmxvY2ssIGhlbmNlIHRoZQorKglyZW1haW5kZXIgb2YgYW4gIm92ZXJzaXplZCIgTWFpbEJveCBJbmZvIGJsb2NrIGlzIGxvc3QuIFRoZSB0cnVuY2F0aW9uIG9mIHRoZSBNYWlsQm94IEluZm8gYmxvY2sgaXMgTk9UCisqCXJlZmxlY3RlZCBpbiB0aGUgcmV0dXJuIHN0YXR1cy4gTm90ZSB0aGF0IGhjZl9nZXRfaW5mbyBndWFyYW50ZWVzIHRoZSBsZW5ndGggb2YgdGhlIFBDIFJBTSBidWZmZXIgbWVldHMKKyoJdGhlIG1pbmltdW0gcmVxdWlyZW1lbnRzIG9mIGF0IGxlYXN0IDIsIHNvIG5vIFBDIFJBTSBidWZmZXIgb3ZlcnJ1bi4KKyoKKyoJQ2FsbGluZyBoY2ZfZ2V0X21iX2luZm8gd2hlbiB0aGVpciBpcyBubyBNYWlsQm94IEluZm8gYmxvY2sgYXZhaWxhYmxlIG9yIHdoZW4gdGhlcmUgaXMgbm8gTWFpbEJveCBhdCBhbGwsCisqCXJlc3VsdHMgaW4gYSAiTlVMTCIgTWFpbEJveCBJbmZvIGJsb2NrLgorKgorKjEyOglzZWUgTk9USUNFCisqMTc6IFRoZSByZXR1cm4gc3RhdHVzIG9mIGNtZF93YWl0IGFuZCB0aGUgZmlyc3QgaGNmaW9faW5fc3RyaW5nIGNhbiBiZSBpZ25vcmVkLCBiZWNhdXNlIHdoZW4gb25lIGZhaWxzLCB0aGUKKyoJb3RoZXIgZmFpbHMgdmlhIHRoZSBJRkJfRGVmdW5jdFN0YXQgbWVjaGFuaXNtCisqMjA6ICJIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYyApIiBpcyBub3Qgc3VpdGFibGUgYmVjYXVzZSB0aGlzIHdpbGwgYWx3YXlzIHRyaWdnZXIgYXMgc2lkZSBlZmZlY3Qgb2YKKyoJdGhlIEhDRkFTU0VSVCBpbiBoY2ZfcHV0X2luZm8gd2hpY2ggY2FsbHMgaGNmX2dldF9pbmZvIHRvIGZpZ3VyZSBvdXQgd2hldGhlciB0aGUgUklEIGV4aXN0cyBhdCBhbGwuCisKKyouTk9USUNFCisqCisqCSJIQ0YgZW1iZWRkZWQiIHBzZXVkbyBSSURzOgorKglDRkdfTUJfSU5GTywgQ0ZHX1RBTExJRVMsIENGR19EUlZfSURFTlRJVFksIENGR19EUlZfU1VQX1JBTkdFLCBDRkdfRFJWX0FDVF9SQU5HRVNfUFJJLAorKglDRkdfRFJWX0FDVF9SQU5HRVNfU1RBLCBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJCisqCU5vdGUgdGhlIEhDRl9FUlJfTEVOIGlzIE5PVCBhZGVxdWF0ZWx5IHNldCwgd2hlbiBMID49IDIgYnV0IGxlc3MgdGhhbiBuZWVkZWQKKyoKKyoJUmVtYXJrczogVHJhbnNmZXJzIG9wZXJhdGlvbiBpbmZvcm1hdGlvbiBhbmQgdHJhbnNpZW50IGFuZCBwZXJzaXN0ZW50IGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUKKyoJQ2FyZCBhbmQgZnJvbSB0aGUgSENGIHRvIHRoZSBNU0YuCisqCVRoZSBleGFjdCBsYXlvdXQgb2YgdGhlIHByb3ZpZGVkIGRhdGEgc3RydWN0dXJlIGRlcGVuZHMgb24gdGhlIGFjdGlvbiBjb2RlLiBDb3B5aW5nIHN0b3BzIGlmIGVpdGhlciB0aGUKKyoJY29tcGxldGUgQ29uZmlndXJhdGlvbiBJbmZvcm1hdGlvbiBpcyBjb3BpZWQgb3IgaWYgdGhlIG51bWJlciBvZiBieXRlcyBpbmRpY2F0ZWQgYnkgbGVuIGlzIGNvcGllZC4gIExlbgorKglhY3RzIGFzIGEgc2FmZSBndWFyZCBhZ2FpbnN0IENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gYmxvY2tzIHdoaWNoIGhhdmUgZGlmZmVyZW50IHNpemVzIGZvciBkaWZmZXJlbnQKKyoJSGVybWVzIHZlcnNpb25zLCBlLmcuIHdoZW4gbGF0ZXIgdmVyc2lvbnMgc3VwcG9ydCBtb3JlIHRhbGxpZXMgdGhhbiBlYXJsaWVyIHZlcnNpb25zLiBJdCBpcyBhIGNvbnNjaW91cworKglkZWNpc2lvbiB0aGF0IHVudXNlZCBwYXJ0cyBvZiB0aGUgUEMgUkFNIGJ1ZmZlciBhcmUgbm90IGNsZWFyZWQuCisqCisqCVJlbWFya3M6IFRoZSBvbmx5IGVycm9yIGFnYWluc3Qgd2hpY2ggaXMgcHJvdGVjdGVkIGlzIHRoZSAiUmVhZCBlcnJvciIgYXMgcmVzdWx0IG9mIENhcmQgcmVtb3ZhbC4gT25seSB0aGUKKyoJbGFzdCBoY2ZfaW9fc3RyaW5nIG5lZWQgdG8gYmUgcHJvdGVjdGVkIGJlY2F1c2UgaWYgdGhlIGZpcnN0IGZhaWxzIHRoZSBzZWNvbmQgd2lsbCBmYWlsIGFzIHdlbGwuIENoZWNraW5nCisqCWZvciBjbWRfZXhlIGVycm9ycyBpcyBzdXBwb3NlZCBzdXBlcmZsdW91cyBiZWNhdXNlIHByb2JsZW1zIGluIGNtZF9leGUgYXJlIGFscmVhZHkgY2F1Z2h0IG9yIHdpbGwgYmUKKyoJY2F1Z2h0IGJ5IGhjZl9lbmFibGUuCisqCisqCUNGR19NQl9JTkZPOiBjb3B5IHRoZSBvbGRlc3QgTWFpbEJveCBJbmZvIEJsb2NrIG9yIHRoZSAibnVsbCIgYmxvY2sgaWYgbm9uZSBhdmFpbGFibGUuCisqCisqCVRoZSBtZWNoYW5pc20gdG8gSENGX0FTU0VSVCBvbiBpbnZhbGlkIHR5cC1jb2RlcyBpbiB0aGUgTFRWIHJlY29yZCBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHN0cmF0ZWd5OgorKgkgIC0gZHVyaW5nIHRoZSBwc2V1ZG8tYXN5bmNocm9ub3VzIEhlcm1lcyBjb21tYW5kcyAoZGlhZ25vc2UsIGRvd25sb2FkKQlvbmx5IENGR19NQl9JTkZPIGlzIGFjY2VwdGFibGUKKyoJICAtCXNvbWUgY29kZXMgKGUuZy4gQ0ZHX1RBTExJRVMpIGFyZSBleHBsaWNpdGx5IGhhbmRsZWQgYnkgdGhlIEhDRiB3aGljaCBpbXBsaWVzIHRoYXQgdGhlc2UgY29kZXMKKyoJCWFyZSB2YWxpZAorKgkgIC0gYWxsIG90aGVyIGNvZGVzIGluIHRoZSByYW5nZSAweEZDMDAgdGhyb3VnaCAweEZGRkYgYXJlIHBhc3NlZCB0byB0aGUgSGVybWVzLiAgVGhlIEhlcm1lcyByZXR1cm5zIGFuCisqCQlMVFYgcmVjb3JkIHdpdGggYSB6ZXJvIHZhbHVlIGluIHRoZSBMLWZpZWxkIGZvciBhbGwgVHlwLWNvZGVzIGl0IGRvZXMgbm90IHJlY29nbml6ZS4gVGhpcyBpcworKgkJZGVmaW5lZCBhbmQgaW50ZW5kZWQgYmVoYXZpb3IsIHNvIEhDRl9BU1NFUlQgZG9lcyBub3QgY2F0Y2ggb24gdGhpcyBwaGVub21lbmEuCisqCSAgLQlhbGwgcmVtYWluaW5nIGNvZGVzIGFyZSBpbnZhbGlkIGFuZCBjYXVzZSBhbiBBU1NFUlQuCisqCisqLkNPTkRJVElPTlMKKyogSW4gY2FzZSBvZiBVU0IsIEhDRl9NQVhfTVNHIDs/VVNFRDs/IHRvIGxpbWl0IHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgdmlhIGhjZl9nZXRfaW5mby4KKyoKKyoKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK2hjZl9nZXRfaW5mbyggSUZCUCBpZmJwLCBMVFZQIGx0dnAgKQoreworCitpbnQJCQlyYyA9IEhDRl9TVUNDRVNTOworaGNmXzE2CQlsZW4gPSBsdHZwLT5sZW47CitoY2ZfMTYJCXR5cGUgPSBsdHZwLT50eXA7Cit3Y2lfcmVjb3JkcAlwID0gJmx0dnAtPmxlbjsJCS8vZGVzdGluYXRpb24gd29yZCBwb2ludGVyIChpbiBMVFYgcmVjb3JkKQoraGNmXzE2CQkqcSA9IE5VTEw7CQkJCS8qIHNvdXJjZSB3b3JkIHBvaW50ZXIgIE5vdGUhISBET1MgQ09NIGNhbid0IGNvcGUgd2l0aCBGQVIKKwkJCQkJCQkJCSAqIGFzIGEgY29uc2VxdWVuY2UgTWFpbEJveCBtdXN0IGJlIG5lYXIgd2hpY2ggaXMgdXN1YWxseSB0cnVlIGFueXdheQorCQkJCQkJCQkJICovCitpbnQJCQlpOworCisJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9HRVRfSU5GTywgbHR2cC0+dHlwICkKKwlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApCisJSENGQVNTRVJUX0lOVAorCUhDRkFTU0VSVCggbHR2cCwgMCApCisJSENGQVNTRVJUKCAxIDwgbHR2cC0+bGVuICYmIGx0dnAtPmxlbiA8PSBIQ0ZfTUFYX0xUViArIDEsIE1FUkdFXzIoIGx0dnAtPnR5cCwgbHR2cC0+bGVuICkgKQorCisJbHR2cC0+bGVuID0gMDsJCQkJCQkJCS8vZGVmYXVsdCB0bzogTm8gSW5mbyBBdmFpbGFibGUKKyNpZiBkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQgfHwgKEhDRl9FWFQpICYgSENGX0VYVF9NQiAvL2ZpbHRlciBvdXQgYWxsIHNwZWNpYWxzCisJZm9yICggaSA9IDA7ICggcSA9IHh4eHhbaV0gKSAhPSBOVUxMICYmIHFbMV0gIT0gdHlwZTsgaSsrICkgLypOT1AqLzsKKyNlbmRpZiAvLyBNU0ZfQ09NUE9ORU5UX0lEIC8gSENGX0VYVF9NQgorI2lmIEhDRl9UQUxMSUVTCisJaWYgKCB0eXBlID09IENGR19UQUxMSUVTICkgewkJCQkJCQkJCQkJCQkvKjMqLworCQkodm9pZCloY2ZfYWN0aW9uKCBpZmJwLCBIQ0ZfQUNUX1RBTExJRVMgKTsKKwkJcSA9IChoY2ZfMTYqKSZpZmJwLT5JRkJfVGFsbHlMZW47CisJfQorI2VuZGlmIC8vIEhDRl9UQUxMSUVTCisjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9NQgorCWlmICggdHlwZSA9PSBDRkdfTUJfSU5GTyApIHsKKwkJaWYgKCBpZmJwLT5JRkJfTUJJbmZvTGVuICkgeworCQkJaWYgKCBpZmJwLT5JRkJfTUJwW2lmYnAtPklGQl9NQlJwXSA9PSAweEZGRkYgKSB7CisJCQkJaWZicC0+SUZCX01CUnAgPSAwOyAvLzs/UHJvYmFibHkgc3VwZXJmbHVvdXMKKwkJCX0KKwkJCXEgPSAmaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJScF07CisJCQlpZmJwLT5JRkJfTUJScCArPSAqcSArIDE7CS8vdXBkYXRlIHJlYWQgcG9pbnRlcgorCQkJaWYgKCBpZmJwLT5JRkJfTUJwW2lmYnAtPklGQl9NQlJwXSA9PSAweEZGRkYgKSB7CisJCQkJaWZicC0+SUZCX01CUnAgPSAwOworCQkJfQorCQkJaWZicC0+SUZCX01CSW5mb0xlbiA9IGlmYnAtPklGQl9NQnBbaWZicC0+SUZCX01CUnBdOworCQl9CisJfQorI2VuZGlmIC8vIEhDRl9FWFRfTUIKKwlpZiAoIHEgIT0gTlVMTCApIHsJCQkJCQkvL2Egc3BlY2lhbCBvciBDRkdfVEFMTElFUyBvciBDRkdfTUJfSU5GTworCQlpID0gbWluKCBsZW4sICpxICkgKyAxOwkJCQkvL3RvdGFsIHNpemUgb2YgZGVzdGluYXRpb24gKGluY2x1ZGluZyBULWZpZWxkKQorCQl3aGlsZSAoIGktLSApIHsKKwkJCSpwKysgPSAqcTsKKyNpZiAoSENGX1RBTExJRVMpICYgSENGX1RBTExJRVNfUkVTRVQKKwkJCWlmICggcSA+ICZpZmJwLT5JRkJfVGFsbHlUeXAgJiYgdHlwZSA9PSBDRkdfVEFMTElFUyApIHsKKwkJCQkqcSA9IDA7CisJCQl9CisjZW5kaWYgLy8gSENGX1RBTExJRVNfUkVTRVQKKwkJCXErKzsKKwkJfQorCX0gZWxzZSB7CQkJCQkJCQkvLyBub3QgYSBzcGVjaWFsIG5vciBDRkdfVEFMTElFUyBub3IgQ0ZHX01CX0lORk8KKwkJaWYgKCB0eXBlID09IENGR19DTlRMX09QVCApIHsJCQkJCQkJCQkJLy9yZWFkIGJhY2sgZWZmZWN0aXZlIG9wdGlvbnMKKwkJCWx0dnAtPmxlbiA9IDI7CisJCQlsdHZwLT52YWxbMF0gPSBpZmJwLT5JRkJfQ250bE9wdDsKKyNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX05JQ19BQ0NFU1MKKwkJfSBlbHNlIGlmICggdHlwZSA9PSBDRkdfUFJPRF9EQVRBICkgeyAgLy9vbmx5IG5lZWRlZCBmb3Igc29tZSB0ZXN0IHRvb2wgb24gdG9wIG9mIEgtSUkgTkRJUyBkcml2ZXIKK2hjZl9pbwkJaW9fcG9ydDsKK3djaV9idWZwCXB0OwkJCQkJLy9wb2ludGVyIHdpdGggdGhlICJyaWdodCIgdHlwZSwganVzdCB0byBoZWxwIGVhc2Ugd3JpdGluZyBtYWNyb3Mgd2l0aCBlbWJlZGRlZCBhc3NlbWJseQorCQkJT1BXKCBIUkVHX0FVWF9QQUdFLCAoaGNmXzE2KShQTFVHX0RBVEFfT0ZGU0VUID4+IDcpICk7CisJCQlPUFcoIEhSRUdfQVVYX09GRlNFVCwgKGhjZl8xNikoUExVR19EQVRBX09GRlNFVCAmIDB4N0UpICk7CisJCQlpb19wb3J0ID0gaWZicC0+SUZCX0lPQmFzZSArIEhSRUdfQVVYX0RBVEE7CQkvL3RvIHByZXZlbnQgc2lkZSBlZmZlY3RzIG9mIHRoZSBNU0YtZGVmaW5lZCBtYWNybworCQkJcCA9IGx0dnAtPnZhbDsJCQkJCS8vZGVzdGluYXRpb24gY2hhciBwb2ludGVyIChpbiBMVFYgcmVjb3JkKQorCQkJaWYgKCAoIGkgPSBsZW4gLSAxICkgPiAwICkgeworCQkJCXB0ID0gKHdjaV9idWZwKXA7CS8vanVzdCB0byBoZWxwIGVhc2Ugd3JpdGluZyBtYWNyb3Mgd2l0aCBlbWJlZGRlZCBhc3NlbWJseQorCQkJCUlOX1BPUlRfU1RSSU5HXzhfMTYoIGlvX3BvcnQsIHB0LCBpICk7IC8vc3BhY2UgdXNlZCBieSBUOiAtMQorCQkJfQorCQl9IGVsc2UgaWYgKCB0eXBlID09IENGR19DTURfSENGICkgeworI2RlZmluZSBQICgoQ0ZHX0NNRF9IQ0ZfU1RSQ1QgRkFSICopbHR2cCkKKwkJCUhDRkFTU0VSVCggUC0+Y21kID09IENGR19DTURfSENGX1JFR19BQ0NFU1MsIFAtPmNtZCApCQkvL29ubHkgSGVybWVzIHJlZ2lzdGVyIGFjY2VzcyBzdXBwb3J0ZWQKKwkJCWlmICggUC0+Y21kID09IENGR19DTURfSENGX1JFR19BQ0NFU1MgKSB7CisJCQkJSENGQVNTRVJUKCBQLT5tb2RlIDwgaWZicC0+SUZCX0lPQmFzZSwgUC0+bW9kZSApCQkvL0NoZWNrIFJlZ2lzdGVyIHNwYWNlCisJCQkJbHR2cC0+bGVuID0gbWluKCBsZW4sIDQgKTsJCQkJCQkJCS8vUkVTVE9SRSBsdHYgbGVuZ3RoCisJCQkJUC0+YWRkX2luZm8gPSBJUFcoIFAtPm1vZGUgKTsKKwkJCX0KKyN1bmRlZiBQCisjZW5kaWYgLy8gSENGX0VYVF9OSUNfQUNDRVNTCisjaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9QUklOVEYKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IENGR19GV19QUklOVEYpIHsKKyAgICAgICAgICAgcmMgPSBmd19wcmludGYoaWZicCwgKENGR19GV19QUklOVEZfU1RSQ1QqKWx0dnApOworI2VuZGlmIC8vIEhDRl9BU1NFUlRfUFJJTlRGCisJCX0gZWxzZSBpZiAoIHR5cGUgPj0gQ0ZHX1JJRF9GV19NSU4gKSB7CisvLzs/IGJ5IHVzaW5nIEhDTURfQlVTWSBvcHRpb24gd2hlbiBjYWxsaW5nIGNtZF9leGUsIHVzaW5nIGEgZ2V0X2ZyYWcgd2l0aCBsZW5ndGggMCBqdXN0IHRvIHNldCB1cCB0aGUKKy8vOz8gQkFQIGFuZCBjYWxsaW5nIGNtZF9jbXBsLCB5b3UgY291bGQgbWVyZ2UgdGhlIDIgQnVzeSB3YWl0cy4gV2hldGhlciB0aGlzIHJlYWxseSBoZWxwcyAoYW5kIHdoYXQKKy8vOz8gd291bGQgYmUgdGhlIG9wdGltYWwgc2VxdWVuY2UgaW4gY21kX2V4ZSBhbmQgZ2V0X2ZyYWcpIHdvdWxkIGhhdmUgdG8gYmUgTUVBU1VSRUQKKy8qMTcqLwkJaWYgKCAoIHJjID0gY21kX2V4ZSggaWZicCwgSENNRF9BQ0NFU1MsIHR5cGUgKSApID09IEhDRl9TVUNDRVNTICYmCisJCQkJICggcmMgPSBzZXR1cF9iYXAoIGlmYnAsIHR5cGUsIDAsIElPX0lOICkgKSA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwkJCQlnZXRfZnJhZyggaWZicCwgKHdjaV9idWZwKSZsdHZwLT5sZW4sIDIqbGVuKzIgQkVfUEFSKDIpICk7CisJCQkJaWYgKCBJUFcoIEhSRUdfU1RBVCApID09IDB4RkZGRiApIHsJCQkJCS8vTklDIHJlbW92YWwgdGVzdAorCQkJCQlsdHZwLT5sZW4gPSAwOworCQkJCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgdHlwZSApCisJCQkJfQorCQkJfQorLyoxMiovCX0gZWxzZSBIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgdHlwZSApIC8qTk9QKi87IC8vTk9QIGluIGNhc2UgSENGQVNTRVJUIGlzIGR1bW15CisJfQorCWlmICggbGVuIDwgbHR2cC0+bGVuICkgeworCQlsdHZwLT5sZW4gPSBsZW47CisJCWlmICggcmMgPT0gSENGX1NVQ0NFU1MgKSB7CisJCQlyYyA9IEhDRl9FUlJfTEVOOworCQl9CisJfQorCUhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MgfHwgKCByYyA9PSBIQ0ZfRVJSX0xFTiAmJiBpZmJwLT5JRkJfQXNzZXJ0VHJhY2UgJiAxPDxIQ0ZfVFJBQ0VfUFVUX0lORk8gKSwKKwkJCSAgIE1FUkdFXzIoIHR5cGUsIHJjICkgKQkJCQkJCQkJCQkJCQkJCQkvKjIwKi8KKwlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfR0VUX0lORk8gKQorCXJldHVybiByYzsKK30gLy8gaGNmX2dldF9pbmZvCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5NT0RVTEUJCWludCBoY2ZfcHV0X2luZm8oIElGQlAgaWZicCwgTFRWUCBsdHZwICkKKyouUFVSUE9TRQkJVHJhbnNmZXJzIG9wZXJhdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiB0byB0aGUgQ2FyZCBhbmQgdG8gdGhlIEhDRi4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKglsdHZwCQlzcGVjaWZpZXMgdGhlIFJJRCAoYXMgZGVmaW5lZCBieSBIZXJtZXMgSS9GKSBvciBwc2V1ZG8tUklEIChhcyBkZWZpbmVkIGJ5IFdDSSkKKyoKKyouUkVUVVJOUworKglIQ0ZfU1VDQ0VTUworKiEhCXZpYSBjbWRfZXhlCisqCUhDRl9FUlJfTk9fTklDIAkJTklDIHJlbW92ZWQgZHVyaW5nIGRhdGEgcmV0cmlldmFsCisqCUhDRl9FUlJfVElNRV9PVVQJRXhwZWN0ZWQgRi9XIGV2ZW50IGRpZCBub3Qgb2NjdXIgaW4gdGltZQorKglIQ0ZfRVJSX0RFRlVOQ1RfLi4uCisqISEJdmlhIGRvd25sb2FkCQkJCUNGR19ETE5WX1NUQVJUIDw9IHR5cGUgPD0gQ0ZHX0RMX1NUT1AKKyohIQl2aWEgcHV0X2luZm8JCQkJQ0ZHX1JJRF9DRkdfTUlOIDw9IHR5cGUgPD0gQ0ZHX1JJRF9DRkdfTUFYCisqISEJdmlhIHB1dF9mcmFnCisqCisqLkRFU0NSSVBUSU9OCisqIFRoZSBMLWZpZWxkIG9mIHRoZSBMVFYtcmVjb3JkIChwcm92aWRlZCBieSB0aGUgTVNGIGluIHBhcmFtZXRlciBsdHZwKSBzcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4KKyogVGhlIEwtdmFsdWUgaW5jbHVkZXMgdGhlIHNpemUgb2YgdGhlIFQtZmllbGQsIGJ1dCBub3QgdGhlIHNpemUgb2YgdGhlIEwtZmllbGQuCisqIFRoZSBULSBmaWVsZCBzcGVjaWZpZXMgdGhlIFJJRCBwbGFjZWQgaW4gdGhlIFYtZmllbGQgYnkgdGhlIE1TRi4KKyoKKyogTm90IGFsbCBDRkctY29kZXMgY2FuIGJlIHVzZWQgZm9yIGhjZl9wdXRfaW5mby4gIFRoZSBmb2xsb3dpbmcgQ0ZHLWNvZGVzIGFyZSB2YWxpZCBmb3IgaGNmX3B1dF9pbmZvOgorKiBvIE9uZSBvZiB0aGUgQ0ZHLWNvZGVzIGluIHRoZSBncm91cCAiTmV0d29yayBQYXJhbWV0ZXJzLCBTdGF0aWMgQ29uZmlndXJhdGlvbiBFbnRpdGllcyIKKyogQ2hhbmdlcyBtYWRlIGJ5IGhjZl9wdXRfaW5mbyB0byBDRkdfY29kZXMgaW4gdGhpcyBncm91cCB3aWxsIG5vdCBhZmZlY3QgdGhlIEYvVworKiBhbmQgSENGIGJlaGF2aW9yIHVudGlsIGhjZl9jbnRsX3BvcnQoIEhDRl9QT1JUX0VOQUJMRSkgaXMgY2FsbGVkLgorKiBvIE9uZSBvZiB0aGUgQ0ZHLWNvZGVzIGluIHRoZSBncm91cCAiTmV0d29yayBQYXJhbWV0ZXJzLCBEeW5hbWljIENvbmZpZ3VyYXRpb24gRW50aXRpZXMiCisqIENoYW5nZXMgbWFkZSBieSBoY2ZfcHV0X2luZm8gdG8gQ0ZHX2NvZGVzIHdpbGwgYWZmZWN0IHRoZSBGL1cgYW5kIEhDRiBiZWhhdmlvciBpbW1lZGlhdGVseS4KKyogbyBDRkdfUFJPRy4KKyogVGhpcyBjb2RlIGlzIHVzZWQgdG8gaW5pdGlhdGUgYW5kIHRlcm1pbmF0ZSB0aGUgcHJvY2VzcyB0byBkb3dubG9hZCBkYXRhIGVpdGhlciB0bworKiB2b2xhdGlsZSBvciB0byBub24tdm9sYXRpbGUgUkFNIG9uIHRoZSBOSUMgYXMgd2VsbCBhcyBmb3IgdGhlIGFjdHVhbCBkb3dubG9hZC4KKyogbyBDRkctY29kZXMgcmVsYXRlZCB0byB0aGUgSENGIGJlaGF2aW9yLgorKiBUaGUgcmVsYXRlZCBDRkctY29kZXMgYXJlOgorKiAgLSBDRkdfUkVHX01CCisqICAtIENGR19SRUdfQVNTRVJUX1JUTlAKKyogIC0gQ0ZHX1JFR19JTkZPX0xPRworKiAgLSBDRkdfQ01EX05JQworKiAgLSBDRkdfQ01EX0RPTkdMRQorKiAgLSBDRkdfQ01EX0hDRgorKiAgLSBDRkdfTk9USUZZCisqCisqIEFsbCBMVFYtcmVjb3JkcyAidW5rbm93biIgdG8gdGhlIEhDRiBhcmUgZm9yd2FyZGVkIHRvIHRoZSBGL1cuCisqCisqIEFzc2VydCBmYWlscyBpZgorKiAtIGlmYnAgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZS4KKyogLSBsdHZwIGlzIGEgTlVMTCBwb2ludGVyLgorKiAtIGhjZl9wdXRfaW5mbyB3YXMgY2FsbGVkIHdpdGhvdXQgcHJpb3IgY2FsbCB0byBoY2ZfY29ubmVjdAorKiAtIHR5cGUgZmllbGQgb2YgdGhlIExUVi1yZWNvcmQgaXMgaW52YWxpZCwgaS5lLiBuZWl0aGVyIEhDRiBub3IgRi9XIGNhbiBoYW5kbGUgdGhlIHZhbHVlLgorKiAtIGxlbmd0aCBmaWVsZCBvZiB0aGUgTFRWLXJlY29yZCBhdCBlbnRyeSBpcyBsZXNzIHRoYW4gMSBvciBleGNlZWRzIE1BWF9MVFZfU0laRS4KKyogLSByZWdpc3RlcmluZyBhIE1haWxCb3ggd2l0aCBzaXplIGxlc3MgdGhhbiA2MCBvciBhIG5vbi1hbGlnbmVkIGJ1ZmZlciBhZGRyZXNzIGlzIHVzZWQuCisqIC0gcmVlbnRyYW5jeSwgbWF5IGJlICBjYXVzZWQgYnkgY2FsbGluZyBoY2ZfZnVuY3Rpb25zIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbiBhZ2FpbnN0CisqCU5JQyBpbnRlcnJ1cHRzIG9yIG11bHRpLXRocmVhZGluZy4KKyoKKyouRElBR1JBTQorKgorKi5OT1RJQ0UKKyoJUmVtYXJrczogIEluIGNhc2Ugb2YgSGVybWVzIENvbmZpZ3VyYXRpb24gTFRWcywgdGhlIGNvZGVzIGZvciB0aGUgdHlwZSBhcmUgImNsZXZlcmx5IiBjaG9zZW4gdG8gYmUKKyoJaWRlbnRpY2FsIHRvIHRoZSBSSUQuIEhlcm1lcyBDb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGNvcGllZCBmcm9tIHRoZSBwcm92aWRlZCBkYXRhIHN0cnVjdHVyZSBpbnRvIHRoZQorKglDYXJkLgorKglJbiBjYXNlIG9mIEhDRiBDb25maWd1cmF0aW9uIExUVnMsIHRoZSB0eXBlIHZhbHVlcyBhcmUgY2hvc2VuIGluIGEgcmFuZ2Ugd2hpY2ggZG9lcyBub3Qgb3ZlcmxhcCB0aGUKKyoJUklELXJhbmdlLgorKgorKjIwOgorKgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50CitoY2ZfcHV0X2luZm8oIElGQlAgaWZicCwgTFRWUCBsdHZwICkKK3sKK2ludCByYyA9IEhDRl9TVUNDRVNTOworCisJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9QVVRfSU5GTywgbHR2cC0+dHlwICkKKwlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApCisJSENGQVNTRVJUX0lOVAorCUhDRkFTU0VSVCggbHR2cCwgMCApCisJSENGQVNTRVJUKCAxIDwgbHR2cC0+bGVuICYmIGx0dnAtPmxlbiA8PSBIQ0ZfTUFYX0xUViArIDEsIGx0dnAtPmxlbiApCisKKwkJCQkJCQkJCQkJLy9hbGwgY29kZXMgYmV0d2VlbiAweEZBMDAgYW5kIDB4RkNGRiBhcmUgcGFzc2VkIHRvIEhlcm1lcworI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKKyB7CWhjZl8xNiBpOworCWhjZl8zMiBGQVIgKiBrZXlfcDsKKworCWlmICggbHR2cC0+dHlwID09IENGR19BRERfVEtJUF9ERUZBVUxUX0tFWSB8fCBsdHZwLT50eXAgPT0gQ0ZHX0FERF9US0lQX01BUFBFRF9LRVkgKSB7CisJCWtleV9wID0gKGhjZl8zMiopKChDRkdfQUREX1RLSVBfTUFQUEVEX0tFWV9TVFJDVCBGQVIgKilsdHZwKS0+dHhfbWljX2tleTsKKwkJaSA9IFRYX0tFWTsJCS8vaS5lLiBUeEtleUluZGljYXRvciA9PSAxLCBLZXlJRCA9PSAwCisJCWlmICggbHR2cC0+dHlwID09IENGR19BRERfVEtJUF9ERUZBVUxUX0tFWSApIHsKKwkJCWtleV9wID0gKGhjZl8zMiopKChDRkdfQUREX1RLSVBfREVGQVVMVF9LRVlfU1RSQ1QgRkFSICopbHR2cCktPnR4X21pY19rZXk7CisJCQlpID0gQ05WX0xJVFRMRV9UT19TSE9SVCgoKENGR19BRERfVEtJUF9ERUZBVUxUX0tFWV9TVFJDVCBGQVIgKilsdHZwKS0+dGtpcF9rZXlfaWRfaW5mbyk7CisJCX0KKwkJaWYgKCBpICYgVFhfS0VZICkgewkvKiBUeEtleUluZGljYXRvciA9PSAxCisJCQkJCQkJICAgKGVpdGhlciByZWFsbHkgc2V0IGJ5IE1TRiBpbiBjYXNlIG9mIERFRkFVTFQgb3IgZmFrZWQgYnkgSENGIGluIGNhc2Ugb2YgTUFQUEVEICkgKi8KKwkJCWlmYnAtPklGQl9NSUNUeENudGwgPSAoaGNmXzE2KSggSEZTX1RYX0NOVExfTUlDIHwgKGkgJiBLRVlfSUQgKTw8OCApOworCQkJaWZicC0+SUZCX01JQ1R4S2V5WzBdID0gQ05WX0xPTkdQX1RPX0xJVFRMRSgga2V5X3AgKTsKKwkJCWlmYnAtPklGQl9NSUNUeEtleVsxXSA9IENOVl9MT05HUF9UT19MSVRUTEUoIChrZXlfcCsxKSApOworCQl9CisJCWkgPSAoIGkgJiBLRVlfSUQgKSAqIDI7CisJCWlmYnAtPklGQl9NSUNSeEtleVtpXSAgID0gQ05WX0xPTkdQX1RPX0xJVFRMRSggKGtleV9wKzIpICk7CisJCWlmYnAtPklGQl9NSUNSeEtleVtpKzFdID0gQ05WX0xPTkdQX1RPX0xJVFRMRSggKGtleV9wKzMpICk7CisJfQorI2RlZmluZSBQICgoQ0ZHX1JFTU9WRV9US0lQX0RFRkFVTFRfS0VZX1NUUkNUIEZBUiAqKWx0dnApCisJaWYgKCAoIGx0dnAtPnR5cCA9PSBDRkdfUkVNT1ZFX1RLSVBfTUFQUEVEX0tFWSApCXx8CisJCSAoIGx0dnAtPnR5cCA9PSBDRkdfUkVNT1ZFX1RLSVBfREVGQVVMVF9LRVkgJiYKKwkJICAgKCAoaWZicC0+SUZCX01JQ1R4Q250bCA+PiA4KSAmIEtFWV9JRCApID09IENOVl9TSE9SVF9UT19MSVRUTEUoUC0+dGtpcF9rZXlfaWQgKQorCQkgKQorCQkpIHsgaWZicC0+SUZCX01JQ1R4Q250bCA9IDA7IH0JCS8vZGlzYWJsZSBNSUMtZW5naW5lCisjdW5kZWYgUAorIH0KKyNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKKworCWlmICggbHR2cC0+dHlwID09IENGR19QUk9HICkgeworCQlyYyA9IGRvd25sb2FkKCBpZmJwLCAoQ0ZHX1BST0dfU1RSQ1QgRkFSICopbHR2cCApOworCX0gZWxzZSBzd2l0Y2ggKGx0dnAtPnR5cCkgeworI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfUlRfTVNGX1JUTgorCSAgY2FzZSBDRkdfUkVHX0FTU0VSVF9SVE5QOgkJCQkJCQkJCQkJLy9SZWdpc3RlciBNU0YgUm91dGluZXMKKyNkZWZpbmUgUCAoKENGR19SRUdfQVNTRVJUX1JUTlBfU1RSQ1QgRkFSICopbHR2cCkKKwkJaWZicC0+SUZCX0Fzc2VydFJ0biA9IFAtPnJ0bnA7CisvLwkJaWZicC0+SUZCX0Fzc2VydEx2bCA9IFAtPmx2bDsJCS8vVE9ETyBub3QgeWV0IHN1cHBvcnRlZCBzbyBkZWZhdWx0IGlzIHNldCBpbiBoY2ZfY29ubmVjdAorCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgTUVSR0VfMiggSENGX0FTU0VSVCwgMHhDQUYxICkgKQkvL2p1c3QgdG8gcHJvb2YgdGhhdCB0aGUgY29tcGxldGUgYXNzZXJ0IG1hY2hpbmVyeSBpcyB3b3JraW5nCisjdW5kZWYgUAorCQlicmVhazsKKyNlbmRpZiAvLyBIQ0ZfQVNTRVJUX1JUX01TRl9SVE4KKyNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX0lORk9fTE9HCisJICBjYXNlIENGR19SRUdfSU5GT19MT0c6CQkJCQkJCQkJCQkvL1JlZ2lzdGVyIExvZyBmaWx0ZXIKKwkJaWZicC0+SUZCX1JJRExvZ3AgPSAoKENGR19SSURfTE9HX1NUUkNUIEZBUiopbHR2cCktPnJlY29yZHA7CisJCWJyZWFrOworI2VuZGlmIC8vIEhDRl9FWFRfSU5GT19MT0cKKwkgIGNhc2UgQ0ZHX0NOVExfT1BUOgkJCQkJCQkJCQkJCS8vb3ZlcnJ1bGUgb3B0aW9uCisJCUhDRkFTU0VSVCggKCBsdHZwLT52YWxbMF0gJiB+KFVTRV9ETUEgfCBVU0VfMTZCSVQpICkgPT0gMCwgbHR2cC0+dmFsWzBdICkKKwkJaWYgKCAoIGx0dnAtPnZhbFswXSAmIFVTRV9ETUEgKSA9PSAwICkgaWZicC0+SUZCX0NudGxPcHQgJj0gflVTRV9ETUE7CisJCWlmYnAtPklGQl9DbnRsT3B0IHw9ICBsdHZwLT52YWxbMF0gJiBVU0VfMTZCSVQ7CisJCWJyZWFrOworI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIKKwkgIGNhc2UgQ0ZHX1JFR19NQjoJCQkJCQkJCQkJCQkJLy9SZWdpc3RlciBNYWlsQm94CisjZGVmaW5lIFAgKChDRkdfUkVHX01CX1NUUkNUIEZBUiAqKWx0dnApCisJCUhDRkFTU0VSVCggKCAoaGNmXzMyKVAtPm1iX2FkZHIgJiAweDAwMDEgKSA9PSAwLCAoaGNmXzMyKVAtPm1iX2FkZHIgKQorCQlIQ0ZBU1NFUlQoIChQKS0+bWJfc2l6ZSA+PSA2MCwgKFApLT5tYl9zaXplICkKKwkJaWZicC0+SUZCX01CcCA9IFAtPm1iX2FkZHI7CisJCS8qIGlmIG5vIE1CIHByZXNlbnQsIHNpemUgbXVzdCBiZSAwIGZvciA7P3RoZSBvbGQ7PyBwdXRfaW5mb19tYiB0byB3b3JrIGNvcnJlY3RseSAqLworCQlpZmJwLT5JRkJfTUJTaXplID0gaWZicC0+SUZCX01CcCA9PSBOVUxMID8gMCA6IFAtPm1iX3NpemU7CisJCWlmYnAtPklGQl9NQldwID0gaWZicC0+SUZCX01CUnAJPSAwOworCQlpZmJwLT5JRkJfTUJwWzBdID0gMDsJCQkJCQkJCQkJCS8vZmxhZyB0aGUgTWFpbEJveCBhcyBlbXB0eQorCQlpZmJwLT5JRkJfTUJJbmZvTGVuID0gMDsKKwkJSENGQVNTRVJUKCBpZmJwLT5JRkJfTUJTaXplID49IDYwIHx8IGlmYnAtPklGQl9NQnAgPT0gTlVMTCwgaWZicC0+SUZCX01CU2l6ZSApCisjdW5kZWYgUAorCQlicmVhazsKKwkgIGNhc2UgQ0ZHX01CX0lORk86CQkJCQkJCQkJCQkJCS8vc3RvcmUgTWFpbEJveEluZm9CbG9jaworCQlyYyA9IHB1dF9pbmZvX21iKCBpZmJwLCAoQ0ZHX01CX0lORk9fU1RSQ1QgRkFSICopbHR2cCApOworCQlicmVhazsKKyNlbmRpZiAvLyBIQ0ZfRVhUX01CCisKKyNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX05JQ19BQ0NFU1MKKwkgIGNhc2UgQ0ZHX0NNRF9OSUM6CisjZGVmaW5lIFAgKChDRkdfQ01EX05JQ19TVFJDVCBGQVIgKilsdHZwKQorCQlPUFcoIEhSRUdfUEFSQU1fMiwgUC0+cGFybTIgKTsKKwkJT1BXKCBIUkVHX1BBUkFNXzEsIFAtPnBhcm0xICk7CisJCXJjID0gY21kX2V4ZSggaWZicCwgUC0+Y21kLCBQLT5wYXJtMCApOworCQlQLT5oY2Zfc3RhdCA9IChoY2ZfMTYpcmM7CisJCVAtPnN0YXQgPSBJUFcoIEhSRUdfU1RBVCApOworCQlQLT5yZXNwMCA9IElQVyggSFJFR19SRVNQXzAgKTsKKwkJUC0+cmVzcDEgPSBJUFcoIEhSRUdfUkVTUF8xICk7CisJCVAtPnJlc3AyID0gSVBXKCBIUkVHX1JFU1BfMiApOworCQlQLT5pZmJfZXJyX2NtZCA9IGlmYnAtPklGQl9FcnJDbWQ7CisJCVAtPmlmYl9lcnJfcXVhbGlmaWVyID0gaWZicC0+SUZCX0VyclF1YWxpZmllcjsKKyN1bmRlZiBQCisJCWJyZWFrOworCSAgY2FzZSBDRkdfQ01EX0hDRjoKKyNkZWZpbmUgUCAoKENGR19DTURfSENGX1NUUkNUIEZBUiAqKWx0dnApCisJCUhDRkFTU0VSVCggUC0+Y21kID09IENGR19DTURfSENGX1JFR19BQ0NFU1MsIFAtPmNtZCApCQkvL29ubHkgSGVybWVzIHJlZ2lzdGVyIGFjY2VzcyBzdXBwb3J0ZWQKKwkJaWYgKCBQLT5jbWQgPT0gQ0ZHX0NNRF9IQ0ZfUkVHX0FDQ0VTUyApIHsKKwkJCUhDRkFTU0VSVCggUC0+bW9kZSA8IGlmYnAtPklGQl9JT0Jhc2UsIFAtPm1vZGUgKQkJLy9DaGVjayBSZWdpc3RlciBzcGFjZQorCQkJT1BXKCBQLT5tb2RlLCBQLT5hZGRfaW5mbyk7CisJCX0KKyN1bmRlZiBQCisJCWJyZWFrOworI2VuZGlmIC8vIEhDRl9FWFRfTklDX0FDQ0VTUworCisjaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9QUklOVEYKKyAgICAgIGNhc2UgQ0ZHX0ZXX1BSSU5URl9CVUZGRVJfTE9DQVRJT046CisgICAgICAgIGlmYnAtPklGQl9Gd1BmQnVmZiA9ICooQ0ZHX0ZXX1BSSU5URl9CVUZGRVJfTE9DQVRJT05fU1RSQ1QqKWx0dnA7CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIEhDRl9BU1NFUlRfUFJJTlRGCisKKwkgIGRlZmF1bHQ6CQkJCQkJLy9wYXNzIGV2ZXJ5dGhpbmcgdW5rbm93biBhYm92ZSB0aGUgIkZJRCIgcmFuZ2UgdG8gdGhlIEhlcm1lcyBvciBEb25nbGUKKwkJcmMgPSBwdXRfaW5mbyggaWZicCwgbHR2cCApOworCX0KKwkvL0RPIE5PVCAhISEgSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKQkJCQkJCQkJCQkJCS8qIDIwICovCisJSENGTE9HRVhJVCggSENGX1RSQUNFX1BVVF9JTkZPICkKKwlyZXR1cm4gcmM7Cit9IC8vIGhjZl9wdXRfaW5mbworCisKKyNpZiAoSENGX0RMX09OTFkpID09IDAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouTU9EVUxFCQlpbnQgaGNmX3Jjdl9tc2coIElGQlAgaWZicCwgREVTQ19TVFJDVCAqZGVzY3AsIHVuc2lnbmVkIGludCBvZmZzZXQgKQorKi5QVVJQT1NFCQlBbGw6IGRlY2Fwc3VsYXRlIGEgbWVzc2FnZS4KKyoJCQkJcHJlLUhlcm1lc0lJLjU6IHZlcmlmeSBNSUMuCisqCQkJCW5vbi1VU0IsIG5vbi1ETUEgbW9kZTogVHJhbnNmZXIgYSBtZXNzYWdlIGZyb20gdGhlIE5JQyB0byB0aGUgSG9zdCBhbmQgYWNrbm93bGVkZ2UgcmVjZXB0aW9uLgorKgkJCQlVU0I6IFRyYW5zZm9ybSBhIG1lc3NhZ2UgZnJvbSBwcm9wcmlldGFyeSBVU0IgZm9ybWF0IHRvIDgwMi4zIGZvcm1hdAorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqCWRlc2NwCQlQb2ludGVyIHRvIHRoZSBEZXNjcmlwdG9yIExpc3QgbG9jYXRpb24uCisqCW9mZnNldAkJVVNCOiBub3QgdXNlZAorKgkJCQlub24tVVNCOiBzcGVjaWZpZXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgZGF0YSB0byBiZSBvYnRhaW5lZCAoMCBjb3JyZXNwb25kcyB3aXRoIERlc3RBZGRyIGZpZWxkCisqCQkJCW9mIGZyYW1lKS4KKyoKKyouUkVUVVJOUworKglIQ0ZfU1VDQ0VTUwkJCU5vIFNTTiBlcnJvciAoIG9yIEhDRl9FUlJfTUlDIGFscmVhZHkgcmVwb3J0ZWQgYnkgaGNmX3NlcnZpY2VfbmljKQorKglIQ0ZfRVJSX01JQwkJCW1lc3NhZ2UgY29udGFpbnMgYW4gZXJyb25lb3VzIE1JQyAoIEhDRl9TVUNDRVNTIGlzIHJlcG9ydGVkIGlmIEhDRl9FUlJfTUlDIGlzIGFscmVhZHkKKyoJCQkJCQlyZXBvcnRlZCBieSBoY2Zfc2VydmljZV9uaWMpCisqIAlIQ0ZfRVJSX05PX05JQwkJTklDIHJlbW92ZWQgZHVyaW5nIGRhdGEgcmV0cmlldmFsCisqIAlIQ0ZfRVJSX0RFRlVOQ1QuLi4KKyoKKyouREVTQ1JJUFRJT04KKyogVGhlIFJlY2VpdmUgTWVzc2FnZSBGdW5jdGlvbiBjYW4gYmUgZXhlY3V0ZWQgYnkgdGhlIE1TRiB0byBvYnRhaW4gdGhlIERhdGEgSW5mbyBmaWVsZHMgb2YgdGhlIG1lc3NhZ2UgdGhhdAorKiBpcyByZXBvcnRlZCB0byBiZSBhdmFpbGFibGUgYnkgdGhlIFNlcnZpY2UgTklDIEZ1bmN0aW9uLgorKgorKiBUaGUgUmVjZWl2ZSBNZXNzYWdlIEZ1bmN0aW9uIGNvcGllcyB0aGUgbWVzc2FnZSBkYXRhIGF2YWlsYWJsZSBpbiB0aGUgQ2FyZCBtZW1vcnkgaW50byBhIGJ1ZmZlciBzdHJ1Y3R1cmUKKyogcHJvdmlkZWQgYnkgdGhlIE1TRi4KKyogT25seSBkYXRhIG9mIHRoZSBtZXNzYWdlIGluZGljYXRlZCBieSB0aGUgU2VydmljZSBOSUMgRnVuY3Rpb24gY2FuIGJlIG9idGFpbmVkLgorKiBFeGVjdXRpb24gb2YgdGhlIFNlcnZpY2UgTklDIGZ1bmN0aW9uIG1heSByZXN1bHQgaW4gdGhlIGF2YWlsYWJpbGl0eSBvZiBhIG5ldyBtZXNzYWdlLCBidXQgaXQgZGVmaW5pdGVseQorKiBtYWtlcyB0aGUgbWVzc2FnZSByZXBvcnRlZCBieSB0aGUgcHJlY2VkaW5nIFNlcnZpY2UgTklDIGZ1bmN0aW9uLCB1bmF2YWlsYWJsZS4KKyoKKyogaW4gbm9uLVVTQi9ub24tRE1BIG1vZGUsIGhjZl9yY3ZfbXNnIHN0YXJ0cyB0aGUgY29weSBwcm9jZXNzIGF0IHRoZSAobm9uLW5lZ2F0aXZlKSBvZmZzZXQgcmVxdWVzdGVkIGJ5IHRoZQorKiBwYXJhbWV0ZXIgb2Zmc2V0LCByZWxhdGl2ZSB0byBIRlNfQUREUl9ERVNULCBlLmcgb2Zmc2V0IDAgc3RhcnRzIGNvcHlpbmcgZnJvbSB0aGUgRGVzdGluYXRpb24gQWRkcmVzcywgdGhlCisqIHZlcnkgYmVnaW4gb2YgdGhlIDgwMi4zIGZyYW1lIG1lc3NhZ2UuIE9mZnNldCBtdXN0IGVpdGhlciBsYXkgd2l0aGluIHRoZSBwYXJ0IG9mIHRoZSA4MDIuMyBmcmFtZSBhcyBzdG9yZWQKKyogYnkgaGNmX3NlcnZpY2VfbmljIGluIHRoZSBsb29rYWhlYWQgYnVmZmVyIG9yIGJlIGp1c3QgYmVoaW5kIGl0LCBpLmUuIHRoZSBmaXJzdCBieXRlIG5vdCB5ZXQgcmVhZC4KKyogV2hlbiBvZmZzZXQgaXMgd2l0aGluIGxvb2thaGVhZCwgZGF0YSBpcyBjb3BpZWQgZnJvbSBsb29rYWhlYWQuCisqIFdoZW4gb2Zmc2V0IGlzIGJleW9uZCBsb29rYWhlYWQsIGRhdGEgaXMgcmVhZCBkaXJlY3RseSBmcm9tIFJ4RlMgaW4gTklDIHdpdGggZGlzcmVnYXJkIG9mIHRoZSBhY3R1YWwgdmFsdWUKKyogb2Ygb2Zmc2V0CisqCisqLk5PVElDRToKKyogbyBhdCBlbnRyeTogbG9vayBhaGVhZCBidWZmZXIgYXMgcGFzc2VkIHdpdGggaGNmX3NlcnZpY2VfbmljIGlzIHN0aWxsIGFjY2Vzc2libGUgYW5kIHVuY2hhbmdlZAorKiBvIGF0IGV4aXQ6IFJlY2VpdmUgRnJhbWUgaW4gTklDIG1lbW9yeSBpcyByZWxlYXNlZAorKgorKiBEZXNjcmlwdGlvbjoKKyogU3RhcnRpbmcgYXQgdGhlIGJ5dGUgaW5kaWNhdGVkIGJ5IHRoZSBPZmZzZXQgdmFsdWUsIHRoZSBieXRlcyBhcmUgY29waWVkIGZyb20gdGhlIERhdGEgSW5mbworKiBQYXJ0IG9mIHRoZSBjdXJyZW50IFJlY2VpdmUgRnJhbWUgU3RydWN0dXJlIHRvIHRoZSBIb3N0IG1lbW9yeSBkYXRhIGJ1ZmZlciBzdHJ1Y3R1cmUKKyogaWRlbnRpZmllZCBieSBkZXNjcC4KKyogVGhlIG1heGltdW0gdmFsdWUgZm9yIE9mZnNldCBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgb2YgdGhlIDgwMi4zIGZyYW1lIHJlYWQgaW50byB0aGUKKyogbG9vayBhaGVhZCBidWZmZXIgYnkgaGNmX3NlcnZpY2VfbmljIChpLmUuIHRoZSBsb29rIGFoZWFkIGJ1ZmZlciBzaXplIG1pbnVzCisqIENvbnRyb2wgYW5kIDgwMi4xMSBmaWVsZHMpCisqIElmIE9mZnNldCBpcyBsZXNzIHRoYW4gdGhlIG1heGltdW0gdmFsdWUsIGNvcHlpbmcgc3RhcnRzIGZyb20gdGhlIGxvb2sgYWhlYWQgYnVmZmVyIHRpbGwgdGhlCisqIGVuZCBvZiB0aGF0IGJ1ZmZlciBpcyByZWFjaGVkCisqIFRoZW4gKG9yIGlmIHRoZSBtYXhpbXVtIHZhbHVlIGlzIHNwZWNpZmllZCBmb3IgT2Zmc2V0KSwgdGhlCisqIG1lc3NhZ2UgaXMgZGlyZWN0bHkgY29waWVkIGZyb20gTklDIG1lbW9yeSB0byBIb3N0IG1lbW9yeS4KKyogSWYgYW4gaW52YWxpZCAoaS5lLiB0b28gbGFyZ2UpIG9mZnNldCBpcyBzcGVjaWZpZWQsIGFuIGFzc2VydCBjYXRjaGVzIGJ1dCB0aGUgYnVmZmVyIGNvbnRlbnRzIGFyZQorKiB1bmRlZmluZWQuCisqIENvcHlpbmcgc3RvcHMgaWYgZWl0aGVyOgorKiBvIHRoZSBlbmQgb2YgdGhlIDgwMi4zIGZyYW1lIGlzIHJlYWNoZWQKKyogbyB0aGUgRGVzY3JpcHRvciB3aXRoIGEgTlVMTCBwb2ludGVyIGluIHRoZSBuZXh0X2Rlc2NfYWRkciBmaWVsZCBpcyByZWFjaGVkCisqCisqIFdoZW4gdGhlIGNvcHlpbmcgc3RvcHMsIHRoZSByZWNlaXZlciBpcyBhY2snZWQsIHRodXMgZnJlZWluZyB0aGUgTklDIG1lbW9yeSB3aGVyZSB0aGUgZnJhbWUgaXMgc3RvcmVkCisqIEFzIGEgY29uc2VxdWVuY2UsIGhjZl9yY3ZfbXNnIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlIGZvciBhbnkgcGFydGljdWxhciBSeCBmcmFtZS4KKyoKKyogRm9yIHRoZSB0aW1lIGJlaW5nIChQQ0kgQnVzIG1hc3RlcmluZyBub3QgeWV0IHN1cHBvcnRlZCksIG9ubHkgdGhlIGZvbGxvd2luZyBmaWVsZHMgb2YgZWFjaAorKiBvZiB0aGUgZGVzY3JpcHRvcnMgaW4gdGhlIGRlc2NyaXB0b3IgbGlzdCBtdXN0IGJlIHNldCBieSB0aGUgTVNGOgorKiBvIGJ1Zl9jbnRsLmJ1Zl9kaW1bMV0KKyogbyAqbmV4dF9kZXNjX2FkZHIKKyogbyAqYnVmX2FkZHIKKyogQXQgcmV0dXJuIGZyb20gaGNmX3Jjdl9tc2csIHRoZSBmaWVsZCBidWZfY250bC5idWZfZGltWzBdIG9mIHRoZSB1c2VkIERlc2NyaXB0b3JzIHJlZmxlY3RzCisqIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlciBjb3JyZXNwb25kaW5nIHdpdGggdGhlIERlc2NyaXB0b3IuCisqIE9uIHRoZSBsYXN0IHVzZWQgRGVzY3JpcHRvciwgYnVmX2NudGwuYnVmX2RpbVswXSBpcyBsZXNzIG9yIGVxdWFsIHRvIGJ1Zl9jbnRsLmJ1Zl9kaW1bMV0uCisqIE9uIGFsbCBwcmVjZWRpbmcgRGVzY3JpcHRvcnMgYnVmX2NudGwuYnVmX2RpbVswXSBpcyBlcXVhbCB0byBidWZfY250bC5idWZfZGltWzFdLgorKiBPbiBhbGwgc3VjY2VlZGluZyAodW51c2VkKSBEZXNjcmlwdG9ycywgYnVmX2NudGwuYnVmX2RpbVswXSBpcyB6ZXJvLgorKiBOb3RlOiB0aGlzIEkvRiBpcyBiYXNlZCBvbiB0aGUgYXNzdW1wdGlvbnMgaG93IHRoZSBJL0YgbmVlZGVkIGZvciBQQ0kgQnVzIG1hc3RlcmluZyB3aWxsCisqIGJlLCBzbyBpdCBtYXkgY2hhbmdlLgorKgorKiBUaGUgbW9zdCBsaWtlbHkgaGFuZGxpbmcgb2YgSENGX0VSUl9OT19OSUMgYnkgdGhlIE1TRiBpcyB0byBkcm9wIHRoZSBhbHJlYWR5IGNvcGllZAorKiBkYXRhIGFzIGVsZWdhbnRseSBhcyBwb3NzaWJsZSB1bmRlciB0aGUgY29uc3RyYWludHMgYW5kIHJlcXVpcmVtZW50cyBwb3NlZCBieSB0aGUgKE4pT1MuCisqIElmIG5vIHJlY2VpdmVkIEZyYW1lIFN0cnVjdHVyZSBpcyBwZW5kaW5nLCAiU3VjY2VzcyIgcmF0aGVyIHRoYW4gIlJlYWQgZXJyb3IiIGlzIHJldHVybmVkLgorKiBUaGlzIGVycm9yIGNvbnN0aXR1dGVzIGEgbG9naWMgZmxhdyBpbiB0aGUgTVNGCisqIFRoZSBIQ0YgY2FuIG9ubHkgY2F0Y2ggYSBtaW5vcml0eSBvZiB0aGlzCisqIHR5cGUgb2YgZXJyb3JzCisqIEJhc2VkIG9uIGNvbnNpc3RlbmN5IGlkZWFzLCB0aGUgSENGIGNhdGNoZXMgbm9uZSBvZiB0aGVzZSBlcnJvcnMuCisqCisqIEFzc2VydCBmYWlscyBpZgorKiAtIGlmYnAgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZQorKiAtIHRoZXJlIGlzIG5vIHVuYWNrbm93bGVkZ2VkIFJ4LW1lc3NhZ2UgYXZhaWxhYmxlCisqIC0gb2Zmc2V0IGlzIG91dCBvZiByYW5nZSAob3V0c2lkZSBsb29rIGFoZWFkIGJ1ZmZlcikKKyogLSBkZXNjcCBpcyBhIE5VTEwgcG9pbnRlcgorKiAtIGFueSBvZiB0aGUgZGVzY3JpcHRvcnMgaXMgbm90IGRvdWJsZSB3b3JkIGFsaWduZWQKKyogLSByZWVudHJhbmN5LCBtYXkgYmUgIGNhdXNlZCBieSBjYWxsaW5nIGhjZl9mdW5jdGlvbnMgd2l0aG91dCBhZGVxdWF0ZSBwcm90ZWN0aW9uCisqIAlhZ2FpbnN0IE5JQyBpbnRlcnJ1cHRzIG9yIG11bHRpLXRocmVhZGluZy4KKyogLSBJbnRlcnJ1cHRzIGFyZSBlbmFibGVkLgorKgorKi5ESUFHUkFNCisqCisqLk5PVElDRQorKiAtIGJ5IHVzaW5nIHVuc2lnbmVkIGludCBhcyB0eXBlIGZvciBvZmZzZXQsIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgbmVnYXRpdmUgb2Zmc2V0cworKiAtIEFzc2VydGluZyBvbiBiZWluZyBlbmFibGVkL3ByZXNlbnQgaXMgc3VwZXJmbHVvdXMsIHNpbmNlIGEgbm9uLXplcm8gSUZCX2xhbCBpbXBsaWVzIHRoYXQgaGNmX3NlcnZpY2VfbmljCisqICAgd2FzIGNhbGxlZCBhbmQgZGV0ZWN0ZWQgYSBSeC1tZXNzYWdlLiBBIHplcm8gSUZCX2xhbCB3aWxsIHNldCB0aGUgQlVGX0NOVCBmaWVsZCBvZiBhdCBsZWFzdCB0aGUgZmlyc3QKKyogICBkZXNjcmlwdG9yIHRvIHplcm8uCisqCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CitoY2ZfcmN2X21zZyggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCwgdW5zaWduZWQgaW50IG9mZnNldCApCit7CitpbnQJCQlyYyA9IEhDRl9TVUNDRVNTOword2NpX2J1ZnAJY3A7CQkJCQkJCQkJCS8vY2hhciBvcmllbnRlZCB3b3JraW5nIHBvaW50ZXIKK2hjZl8xNgkJaTsKK2ludAkJCXRvdF9sZW4gPSBpZmJwLT5JRkJfUnhMZW4gLSBvZmZzZXQ7CQkvL3RvdGFsIGxlbmd0aAord2NpX2J1ZnAJbGFwID0gaWZicC0+SUZCX2xhcCArIG9mZnNldDsJCQkvL3N0YXJ0IGFkZHJlc3MgaW4gTG9va0FoZWFkIEJ1ZmZlcgoraGNmXzE2CQlsYWwgPSBpZmJwLT5JRkJfbGFsIC0gb2Zmc2V0OwkJCS8vYXZhaWxhYmxlIGRhdGEgd2l0aGluIExvb2tBaGVhZCBCdWZmZXIKK2hjZl8xNgkJajsKKworCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfUkNWX01TRywgb2Zmc2V0ICkKKwlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApCisJSENGQVNTRVJUX0lOVAorCUhDRkFTU0VSVCggZGVzY3AsIEhDRl9UUkFDRV9SQ1ZfTVNHICkKKwlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9SeExlbiwgSENGX1RSQUNFX1JDVl9NU0cgKQorCUhDRkFTU0VSVCggaWZicC0+SUZCX1J4TGVuID49IG9mZnNldCwgTUVSR0VfMiggb2Zmc2V0LCBpZmJwLT5JRkJfUnhMZW4gKSApCisJSENGQVNTRVJUKCBpZmJwLT5JRkJfbGFsID49IG9mZnNldCwgb2Zmc2V0ICkKKwlIQ0ZBU1NFUlQoIChpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEpID09IDAsIDB4REFEQSApCisKKwlpZiAoIHRvdF9sZW4gPCAwICkgeworCQlsYWwgPSAwOyB0b3RfbGVuID0gMDsJCQkJLy9zdXBwcmVzcyBhbGwgY29weWluZyBhY3Rpdml0eSBpbiB0aGUgZG8tLXdoaWxlIGxvb3AKKwl9CisJZG8gewkJCQkJCQkJCS8vbG9vcCBvdmVyIGFsbCBhdmFpbGFibGUgZnJhZ21lbnRzCisJCS8vIG9ibm94aW91cyBoY2YuYygxNDgwKSA6IHdhcm5pbmcgQzQ3Njk6IGNvbnZlcnNpb24gb2YgbmVhciBwb2ludGVyIHRvIGxvbmcgaW50ZWdlcgorCQlIQ0ZBU1NFUlQoICgoaGNmXzMyKWRlc2NwICYgMyApID09IDAsIChoY2ZfMzIpZGVzY3AgKQorCQljcCA9IGRlc2NwLT5idWZfYWRkcjsKKwkJaiA9IG1pbiggKGhjZl8xNil0b3RfbGVuLCBkZXNjcC0+QlVGX1NJWkUgKTsJLy9taW5pbXVtIG9mICJ3aGF0J3NgIGF2YWlsYWJsZSIgYW5kIGZyYWdtZW50IHNpemUKKwkJZGVzY3AtPkJVRl9DTlQgPSBqOworCQl0b3RfbGVuIC09IGo7CQkJCQkJLy9hZGp1c3QgbGVuZ3RoIHN0aWxsIHRvIGdvCisJCWlmICggbGFsICkgewkJCQkJCS8vaWYgbG9va2FoZWFkIEJ1ZmZlciBub3QgeWV0IGNvbXBsZXRlbHkgY29waWVkCisJCQlpID0gbWluKCBsYWwsIGogKTsJCQkJLy9taW5pbXVtIG9mICJ3aGF0J3MgYXZhaWxhYmxlIiBpbiBMb29rQWhlYWQgYW5kIGZyYWdtZW50IHNpemUKKwkJCWxhbCAtPSBpOwkJCQkJCS8vYWRqdXN0IGxlbmd0aCBzdGlsbCBhdmFpbGFibGUgaW4gTG9va0FoZWFkCisJCQlqIC09IGk7CQkJCQkJCS8vYWRqdXN0IGxlbmd0aCBzdGlsbCBhdmFpbGFibGUgaW4gY3VycmVudCBmcmFnbWVudAorCQkJLyo7PyB3aGlsZSBsb29wIGNvdWxkIGJlIGltcHJvdmVkIGJ5IG1vdmluZyB3b3JkcyBidXQgdGhhdCBpcyBjb21wbGljYXRlZCBvbiBwbGF0Zm9ybXMgd2l0aAorCQkJICogYWxpZ25tZW50IHJlcXVpcmVtZW50cyovCisJCQl3aGlsZSAoIGktLSApICpjcCsrID0gKmxhcCsrOworCQl9CisJCWlmICggaiApIHsJLy9pZiBMb29rQWhlYWQgQnVmZmVyIGV4aGF1c3RlZCBidXQgc3RpbGwgc3BhY2UgaW4gZnJhZ21lbnQsIGNvcHkgZGlyZWN0bHkgZnJvbSBOSUMgUkFNCisJCQlnZXRfZnJhZyggaWZicCwgY3AsIGogQkVfUEFSKDApICk7CisJCQlDQUxDX1JYX01JQyggY3AsIGogKTsKKwkJfQorCX0gd2hpbGUgKCAoIGRlc2NwID0gZGVzY3AtPm5leHRfZGVzY19hZGRyICkgIT0gTlVMTCApOworI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKKwlpZiAoIGlmYnAtPklGQl9SeEZJRCApIHsKKwkJcmMgPSBjaGVja19taWMoIGlmYnAgKTsJCQkJLy9wcmV2ZW50cyBNSUMgZXJyb3IgcmVwb3J0IGlmIGhjZl9zZXJ2aWNlX25pYyBhbHJlYWR5IGNvbnN1bWVkIGFsbAorCX0KKyNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKKwkodm9pZCloY2ZfYWN0aW9uKCBpZmJwLCBIQ0ZfQUNUX1JYX0FDSyApOwkJLy9vbmx5IDEgc2hvdCB0byBnZXQgdGhlIGRhdGEsIHNvIGZyZWUgdGhlIHJlc291cmNlcyBpbiB0aGUgTklDCisJSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKQorCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9SQ1ZfTVNHICkKKwlyZXR1cm4gcmM7Cit9IC8vIGhjZl9yY3ZfbXNnCisjZW5kaWYgLy8gSENGX0RMX09OTFkKKworCisjaWYgKEhDRl9ETF9PTkxZKSA9PSAwCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLk1PRFVMRQkJaW50IGhjZl9zZW5kX21zZyggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCwgaGNmXzE2IHR4X2NudGwgKQorKi5QVVJQT1NFCQlFbmNhcHN1bGF0ZSBhIG1lc3NhZ2UgYW5kIGFwcGVuZCBwYWRkaW5nIGFuZCBNSUMuCisqCQkJCW5vbi1VU0I6IFRyYW5zZmVycyB0aGUgcmVzdWx0aW5nIG1lc3NhZ2UgZnJvbSBIb3N0IHRvIE5JQyBhbmQgaW5pdGlhdGVzIHRyYW5zbWlzc2lvbi4KKyoJCQkJVVNCOiBUcmFuc2ZlciByZXN1bHRpbmcgbWVzc2FnZSBpbnRvIGEgZmxhdCBidWZmZXIuCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyoJZGVzY3AJCXBvaW50ZXIgdG8gdGhlIERlc2NyaXB0b3JMaXN0IG9yIE5VTEwKKyoJdHhfY250bAkJaW5kaWNhdGVzIE1BQy1wb3J0IGFuZCAoSGVybWVzKSBvcHRpb25zCisqCQkJCQlIRlNfVFhfQ05UTF9TUEVDVFJBTElOSworKgkJCQkJSEZTX1RYX0NOVExfUFJJTworKgkJCQkJSEZTX1RYX0NOVExfVFhfT0sKKyoJCQkJCUhGU19UWF9DTlRMX1RYX0VYCisqCQkJCQlIRlNfVFhfQ05UTF9UWF9ERUxBWQorKgkJCQkJSEZTX1RYX0NOVExfVFhfQ09OVAorKgkJCQkJSENGX1BPUlRfMAkJCQkgTUFDIFBvcnQgMCAoZGVmYXVsdCkKKyoJCQkJCUhDRl9QT1JUXzEgKEFQIG9ubHkpCSBNQUMgUG9ydCAxCisqCQkJCQlIQ0ZfUE9SVF8yIChBUCBvbmx5KQkgTUFDIFBvcnQgMgorKgkJCQkJSENGX1BPUlRfMyAoQVAgb25seSkJIE1BQyBQb3J0IDMKKyoJCQkJCUhDRl9QT1JUXzQgKEFQIG9ubHkpCSBNQUMgUG9ydCA0CisqCQkJCQlIQ0ZfUE9SVF81IChBUCBvbmx5KQkgTUFDIFBvcnQgNQorKgkJCQkJSENGX1BPUlRfNiAoQVAgb25seSkJIE1BQyBQb3J0IDYKKyoKKyouUkVUVVJOUworKglIQ0ZfU1VDQ0VTUworKglIQ0ZfRVJSX0RFRlVOQ1RfLi4KKyoJSENGX0VSUl9USU1FX09VVAorKgorKi5ERVNDUklQVElPTjoKKyogVGhlIFNlbmQgTWVzc2FnZSBGdW5jdGlvbiBlbWJvZGllcyAyIGZ1bmN0aW9uczoKKyogbyB0cmFuc2ZlcnMgYSBtZXNzYWdlIChpbmNsdWRpbmcgTUFDIGhlYWRlcikgZnJvbSB0aGUgcHJvdmlkZWQgYnVmZmVyIHN0cnVjdHVyZSBpbiBIb3N0IG1lbW9yeSB0byB0aGUgVHJhbnNtaXQKKyogRnJhbWUgU3RydWN0dXJlIChUeEZTKSBpbiBOSUMgbWVtb3J5LgorKiBvIElzc3VlIGEgc2VuZCBjb21tYW5kIHRvIHRoZSBGL1cgdG8gYWN0dWFsbHkgdHJhbnNtaXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBUeEZTLgorKgorKiBDb250cm9sIGlzIGJhc2VkIG9uIHRoZSBSZXNvdXJjZSBJbmRpY2F0b3IgSUZCX1JzY0luZC4KKyogVGhlIFJlc291cmNlIEluZGljYXRvciBpcyBtYWludGFpbmVkIGJ5IHRoZSBIQ0YgYW5kIHNob3VsZCBvbmx5IGJlIGludGVycHJldGVkIGJ1dCBub3QgY2hhbmdlZCBieSB0aGUgTVNGLgorKiBUaGUgTVNGIG11c3QgY2hlY2sgSUZCX1JzY0luZCB0byBiZSBub24temVybyBiZWZvcmUgZXhlY3V0aW5nIHRoZSBjYWxsIHRvIHRoZSBTZW5kIE1lc3NhZ2UgRnVuY3Rpb24uCisqIFdoZW4gbm8gcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUsIHRoZSBNU0YgbXVzdCBoYW5kbGUgdGhlIHF1ZXVpbmcgb2YgdGhlIFRyYW5zbWl0IGZyYW1lIGFuZCBjaGVjayB0aGUKKyogUmVzb3VyY2UgSW5kaWNhdG9yIHBlcmlvZGljYWxseSBhZnRlciBjYWxsaW5nIGhjZl9zZXJ2aWNlX25pYy4KKyoKKyogVGhlIFNlbmQgTWVzc2FnZSBGdW5jdGlvbnMgdHJhbnNmZXJzIGEgbWVzc2FnZSB0byBOSUMgbWVtb3J5IHdoZW4gaXQgaXMgY2FsbGVkIHdpdGggYSBub24tTlVMTCBkZXNjcC4KKyogQmVmb3JlIHRoZSBTZW5kIE1lc3NhZ2UgRnVuY3Rpb24gaXMgaW52b2tlZCB0aGlzIHdheSwgdGhlIFJlc291cmNlIEluZGljYXRvciAoSUZCX1JzY0luZCkgbXVzdCBiZSBjaGVja2VkLgorKiBJZiB0aGUgUmVzb3VyY2UgaXMgbm90IGF2YWlsYWJsZSwgU2VuZCBNZXNzYWdlIEZ1bmN0aW9uIGV4ZWN1dGlvbiBtdXN0IGJlIHBvc3Rwb25lZCB1bnRpbCBhZnRlciBwcm9jZXNzaW5nIG9mCisqIGEgbmV4dCBoY2Zfc2VydmljZV9uaWMgaXQgYXBwZWFycyB0aGF0IHRoZSBSZXNvdXJjZSBoYXMgYmVjb21lIGF2YWlsYWJsZS4KKyogVGhlIG1lc3NhZ2UgaXMgY29waWVkIGZyb20gdGhlIGJ1ZmZlciBzdHJ1Y3R1cmUgaWRlbnRpZmllZCBieSBkZXNjcCB0byB0aGUgTklDLgorKiBDb3B5aW5nIHN0b3BzIGlmIGEgTlVMTCBwb2ludGVyIGluIHRoZSBuZXh0X2Rlc2NfYWRkciBmaWVsZCBpcyByZWFjaGVkLgorKiBIY2Zfc2VuZF9tc2cgZG9lcyBub3QgY2hlY2sgZm9yIHRyYW5zbWl0IGJ1ZmZlciBvdmVyZmxvdywgYmVjYXVzZSB0aGUgRi9XIGRvZXMgdGhpcyBwcm90ZWN0aW9uLgorKiBJbiBjYXNlIG9mIGEgdHJhbnNtaXQgYnVmZmVyIG92ZXJmbG93LCB0aGUgc3VycGx1cyB3aGljaCBkb2VzIG5vdCBmaXQgaW4gdGhlIGJ1ZmZlciBpcyBzaW1wbHkgZHJvcHBlZC4KKyoKKyogVGhlIFNlbmQgTWVzc2FnZSBGdW5jdGlvbiBhY3RpdmF0ZXMgdGhlIEYvVyB0byBhY3R1YWxseSBzZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBtZWRpdW0gd2hlbiB0aGUKKyogSEZTX1RYX0NOVExfVFhfREVMQVkgYml0IG9mIHRoZSB0eF9jbnRsIHBhcmFtZXRlciBpcyBub3Qgc2V0LgorKiBJZiB0aGUgZGVzY3AgcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGNhbGwgaXMgbm9uLU5VTEwsIHRoZSBtZXNzYWdlIGFzIHJlcHJlc2VudGVkIGJ5IGRlc2NwIGlzIHNlbmQuCisqIElmIHRoZSBkZXNjcCBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgY2FsbCBpcyBOVUxMLCBhbmQgaWYgdGhlIHByZWNlZGluZyBjYWxsIG9mIHRoZSBTZW5kIE1lc3NhZ2UgRnVuY3Rpb24gaGFkCisqIGEgbm9uLU5VTEwgZGVzY3AgYW5kIHRoZSBwcmVjZWRpbmcgY2FsbCBoYWQgdGhlIEhGU19UWF9DTlRMX1RYX0RFTEFZIGJpdCBvZiB0eF9jbnRsIHNldCwgdGhlbiB0aGUgbWVzc2FnZSBhcworKiByZXByZXNlbnRlZCBieSB0aGUgZGVzY3Agb2YgdGhlIHByZWNlZGluZyBjYWxsIGlzIHNlbmQuCisqCisqIEhjZl9zZW5kX21zZyBzdXBwb3J0cyBlbmNhcHN1bGF0aW9uIChzZWUgSENGX0VOQ0FQKSBvZiBFdGhlcm5ldC1JSSBmcmFtZXMuCisqIEFuIEV0aGVybmV0LUlJIGZyYW1lIGlzIHRyYW5zZmVycmVkIHRvIHRoZSBUcmFuc21pdCBGcmFtZSBzdHJ1Y3R1cmUgYXMgYW4gODAyLjMgZnJhbWUuCisqIEhjZl9zZW5kX21zZyBkaXN0aW5ndWlzaGVzIGJldHdlZW4gYW4gODAyLjMgYW5kIGFuIEV0aGVybmV0LUlJIGZyYW1lIGJ5IGxvb2tpbmcgYXQgdGhlIGRhdGEgbGVuZ3RoL3R5cGUgZmllbGQKKyogb2YgdGhlIGZyYW1lLiBJZiB0aGlzIGZpZWxkIGNvbnRhaW5zIGEgdmFsdWUgbGFyZ2VyIHRoYW4gMTUxNCwgdGhlIGZyYW1lIGlzIGNvbnNpZGVyZWQgdG8gYmUgYW4gRXRoZXJuZXQtSUkKKyogZnJhbWUsIG90aGVyd2lzZSBpdCBpcyB0cmVhdGVkIGFzIGFuIDgwMi4zIGZyYW1lLgorKiBUbyBlYXNlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBIQ0YsIHRoaXMgdHlwZS90eXBlIGZpZWxkIG11c3QgYmUgbG9jYXRlZCBpbiB0aGUgZmlyc3QgZGVzY3JpcHRvciBzdHJ1Y3R1cmUsCisqIGkuZS4gdGhlIDFzdCBmcmFnbWVudCBtdXN0IGhhdmUgYSBzaXplIG9mIGF0IGxlYXN0IDE0ICh0byBjb250YWluIERlc3RBZGRyLCBTcmNBZGRyIGFuZCBMZW4vVHlwZSBmaWVsZCkuCisqIEFuIEV0aGVybmV0LUlJIGZyYW1lIGlzIGVuY2Fwc3VsYXRlZCBieSBpbnNlcnRpbmcgYSBTTkFQIGhlYWRlciBiZXR3ZWVuIHRoZSBhZGRyZXNzaW5nIGluZm9ybWF0aW9uIGFuZCB0aGUKKyogdHlwZSBmaWVsZC4gIFRoaXMgaW5zZXJ0aW9uIGlzIHRyYW5zcGFyZW50IGZvciB0aGUgTVNGLgorKiBUaGUgSENGIGNvbnRhaW5zIGEgZml4ZWQgdGFibGUgdGhhdCBzdG9yZXMgYSBudW1iZXIgb2YgdHlwZXMuIElmIHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgdGhlIHR5cGUvdHlwZSBmaWVsZAorKiBvY2N1cnMgaW4gdGhpcyB0YWJsZSwgQnJpZGdlIFR1bm5lbCBFbmNhcHN1bGF0aW9uIGlzIHVzZWQsIG90aGVyd2lzZSBSRkMxMDQyIGVuY2Fwc3VsYXRpb24gaXMgdXNlZC4KKyogQnJpZGdlIFR1bm5lbCB1c2VzCUFBIEFBIDAzIDAwIDAwIEY4IGFzIFNOQVAgaGVhZGVyLAorKiBSRkMxMDQyIHVzZXMJQUEgQUEgMDMgMDAgMDAgMDAgYXMgU05BUCBoZWFkZXIuCisqIFRoZSB0YWJsZSBjdXJyZW50bHkgY29udGFpbnM6CisqIDAgMHg4MEYzCUFwcGxlVGFsayBBZGRyZXNzIFJlc29sdXRpb24gUHJvdG9jb2wgKEFBUlApCisqIDAgMHg4MTM3CUlQWAorKgorKiBUaGUgYWxnb3JpdGhtIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gODAyLjMgYW5kIEV0aGVybmV0LUlJIGZyYW1lcyBsaW1pdHMgdGhlIG1heGltdW0gbGVuZ3RoIGZvciBmcmFtZXMgb2YKKyogODAyLjMgZnJhbWVzIHRvIDE1MTQgYnl0ZXMuCisqIEVuY2Fwc3VsYXRpb24gY2FuIGJlIHN1cHByZXNzZWQgYnkgbWVhbnMgb2YgdGhlIHN5c3RlbSBjb25zdGFudCBIQ0ZfRU5DQVAsIGUuZy4gdG8gc3VwcG9ydCBwcm9wcmlldGFyeQorKiBwcm90b2NvbHMgd2l0aCA4MDIuMyBsaWtlIGZyYW1lcyB3aXRoIGEgc2l6ZSBsYXJnZXIgdGhhbiAxNTE0IGJ5dGVzLgorKgorKiBJbiBjYXNlIHRoZSBIQ0YgZW5jYXBzdWxhdGVzIHRoZSBmcmFtZSwgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGlzIGFjdHVhbGx5IHRyYW5zbWl0dGVkIGlzIGRldGVybWluZWQgYnkgdGhlCisqIGN1bXVsYXRpdmUgdmFsdWUgb2YgdGhlIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0gZmllbGRzLgorKiBJbiBjYXNlIHRoZSBIQ0YgZG9lcyBub3QgZW5jYXBzdWxhdGUgdGhlIGZyYW1lLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgaXMgYWN0dWFsbHkgdHJhbnNtaXR0ZWQgaXMgbm90CisqIGRldGVybWluZWQgYnkgdGhlIGN1bXVsYXRpdmUgdmFsdWUgb2YgdGhlIGJ1Zl9jbnRsLmJ1Zl9kaW1bREVTQ19DTlRMX0NOVF0gZmllbGRzIG9mIHRoZSBkZXNjX3N0cmN0J3MgYnV0IGJ5CisqIHRoZSBMZW5ndGggZmllbGQgb2YgdGhlIDgwMi4zIGZyYW1lLgorKiBJZiB0aGVyZSBpcyBhIGNvbmZsaWN0IGJldHdlZW4gdGhlIGN1bXVsYXRpdmUgdmFsdWUgb2YgdGhlIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0gZmllbGRzIGFuZCB0aGUKKyogODAyLjMgTGVuZ3RoIGZpZWxkIHRoZSA4MDIuMyBMZW5ndGggZmllbGQgZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHRyYW5zbWl0dGVkIGJ5IHRoZSBOSUMgd2hpbGUKKyogdGhlIGN1bXVsYXRpdmUgdmFsdWUgb2YgdGhlIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0gZmllbGRzIGRldGVybWluZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBNSUMsIGhlbmNlIGEgbWlzbWF0Y2gKKyogd2lsbCByZXN1bHQgaW4gTUlDIGVycm9ycyBvbiB0aGUgUmVjZWl2aW5nIHNpZGUuCisqIEN1cnJlbnRseSB0aGlzIHByb2JsZW0gaXMgZmxhZ2dlZCBvbiB0aGUgVHJhbnNtaXQgc2lkZSBieSBhbiBBc3NlcnQuCisqIFRoZSBmb2xsb3dpbmcgZmllbGRzIG9mIGVhY2ggb2YgdGhlIGRlc2NyaXB0b3JzIGluIHRoZSBkZXNjcmlwdG9yIGxpc3QgbXVzdCBiZSBzZXQgYnkgdGhlIE1TRjoKKyogbyBidWZfY250bC5idWZfZGltWzBdCisqIG8gKm5leHRfZGVzY19hZGRyCisqIG8gKmJ1Zl9hZGRyCisqCisqIEFsbCBiaXRzIG9mIHRoZSB0eF9jbnRsIHBhcmFtZXRlciBleGNlcHQgSEZTX1RYX0NOVExfVFhfREVMQVkgYW5kIHRoZSBIQ0ZfUE9SVCMgYml0cyBhcmUgcGFzc2VkIHRvIHRoZSBGL1cgdmlhCisqIHRoZSBIRlNfVFhfQ05UTCBmaWVsZCBvZiB0aGUgVHhGUy4KKyoKKyogTm90ZSB0aGF0IGhjZl9zZW5kX21zZyBkb2VzIG5vdCBkZXRlY3QgTklDIGFic2VuY2UuICBUaGUgTVNGIGlzIHN1cHBvc2VkIHRvIGhhdmUgaXRzIG93biAtcGxhdGZvcm0gZGVwZW5kZW50LQorKiB3YXkgdG8gcmVjb2duaXplIGNhcmQgcmVtb3ZhbC9pbnNlcnRpb24uCisqIFRoZSB0b3RhbCBzeXN0ZW0gbXVzdCBiZSByb2J1c3QgYWdhaW5zdCBjYXJkIHJlbW92YWwgYW5kIHRoZXJlIGlzIG5vIHByaW5jaXBhbCBkaWZmZXJlbmNlIGJldHdlZW4gY2FyZCByZW1vdmFsCisqIGp1c3QgYWZ0ZXIgaGNmX3NlbmRfbXNnIHJldHVybnMgYnV0IGJlZm9yZSB0aGUgYWN0dWFsIHRyYW5zbWlzc2lvbiB0b29rIHBsYWNlIG9yIHNvbWV0aW1lIGVhcmxpZXIuCisqCisqIEFzc2VydCBmYWlscyBpZgorKiAtIGlmYnAgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZQorKiAtIGRlc2NwIGlzIGEgTlVMTCBwb2ludGVyCisqIC0gbm8gcmVzb3VyY2VzIGZvciBQSUYgYXZhaWxhYmxlLgorKiAtIEludGVycnVwdHMgYXJlIGVuYWJsZWQuCisqIC0gcmVlbnRyYW5jeSwgbWF5IGJlICBjYXVzZWQgYnkgY2FsbGluZyBoY2ZfZnVuY3Rpb25zIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbgorKglhZ2FpbnN0IE5JQyBpbnRlcnJ1cHRzIG9yIG11bHRpLXRocmVhZGluZy4KKyoKKyouRElBR1JBTQorKjQ6CWZvciB0aGUgbm9ybWFsIGNhc2UgKGkuZS4gbm8gSEZTX1RYX0NOVExfVFhfREVMQVkgb3B0aW9uIGFjdGl2ZSksIGEgZmlkIGlzIGFjcXVpcmVkIHZpYSB0aGUKKyoJcm91dGluZSBnZXRfZmlkLiAgSWYgbm8gRklEIGlzIGFjcXVpcmVkLCB0aGUgcmVtYWluZGVyIGlzIHNraXBwZWQgd2l0aG91dCBhbiBlcnJvciBub3RpZmljYXRpb24uICBBZnRlcgorKglhbGwsIHRoZSBNU0YgaXMgbm90IHN1cHBvc2VkIHRvIGNhbGwgaGNmX3NlbmRfbXNnIHdoZW4gbm8gUmVzb3VyY2UgaXMgYXZhaWxhYmxlLgorKjc6CVRoZSBDb250cm9sRmllbGQgb2YgdGhlIFR4RlMgaXMgd3JpdHRlbi4gIFNpbmNlIHB1dF9mcmFnIGNhbiBvbmx5IHJldHVybiB0aGUgZmF0YWwgRGVmdW5jdCBvciAiTm8gTklDIiwgdGhlCisqCXJldHVybiBzdGF0dXMgY2FuIGJlIGlnbm9yZWQgYmVjYXVzZSB3aGVuIGl0IGZhaWxzLCBjbWRfd2FpdCB3aWxsIGZhaWwgYXMgd2VsbC4gIChzZWUgYWxzbyB0aGUgbm90ZSBvbiB0aGUKKyoJbmVlZCBmb3IgYSByZXR1cm4gY29kZSBiZWxvdykuCisqCU5vdGUgdGhhdCBIRlNfVFhfQ05UTCBoYXMgZGlmZmVyZW50IHZhbHVlcyBmb3IgSC1JLCBILUkvU1NOIGFuZCBILUlJIGFuZCBIRlNfQUREUl9ERVNUIGhhcyBkaWZmZXJlbnQKKyoJdmFsdWVzIGZvciBILUkgKHJlZ2FyZGxlc3Mgb2YgU1NOKSBhbmQgSC1JSS4KKyoJQnkgd3JpdGluZyAxNywgMSBvciAyICggaW1wbHlpbmcgMTYsIDAgb3IgMSBnYXJiYWdlIHdvcmQgYWZ0ZXIgSEZTX1RYX0NOVEwpIHRoZSBCQVAganVzdCBnZXRzIHRvCisqCUhGU19BRERSX0RFU1QgZm9yIEgtSSwgSC1JL1NTTiBhbmQgSC1JSSByZXNwZWN0aXZlbHkuCisqMTA6IGlmIG5laXRoZXIgZW5jYXBzdWxhdGlvbiBub3IgTUlDIGNhbGN1bGF0aW9uIGlzIG5lZWRlZCwgc3BsaXR0aW5nIHRoZSBmaXJzdCBmcmFnbWVudCBpbiB0d28gZG9lcyBub3QKKyoJcmVhbGx5IGhlbHAgYnV0IGl0IG1ha2VzIHRoZSBmbG93IGVhc2llciB0byBmb2xsb3cgdG8gZG8gbm90IG9wdGltaXplIG9uIHRoaXMgZGlmZmVyZW5jZQorKgorKgloY2Zfc2VuZF9tc2cgY2hlY2tzIHdoZXRoZXIgdGhlIGZyYW1lIGlzIGFuIEV0aGVybmV0LUlJIHJhdGhlciB0aGFuIGFuICJvZmZpY2lhbCIgODAyLjMgZnJhbWUuCisqCVRoZSBFLUlJIGNoZWNrIGlzIGJhc2VkIG9uIHRoZSBsZW5ndGgvdHlwZSBmaWVsZCBpbiB0aGUgTUFDIGhlYWRlci4gSWYgdGhpcyBmaWVsZCBoYXMgYSB2YWx1ZSBsYXJnZXIgdGhhbgorKgkxNTAwLCBFLUlJIGlzIGFzc3VtZWQuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIHRlc3QgZmFpbHMgaWYgdGhlIGxlbmd0aC90eXBlIGZpZWxkIGlzIG5vdCBpbiB0aGUgZmlyc3QKKyoJZGVzY3JpcHRvci4gIElmIEUtSUkgaXMgcmVjb2duaXplZCwgYSBTTkFQIGhlYWRlciBpcyBpbnNlcnRlZC4gVGhpcyBTTkFQIGhlYWRlciByZXByZXNlbnRzIGVpdGhlciBSRkMxMDQyCisqCW9yIEJyaWRnZS1UdW5uZWwgZW5jYXBzdWxhdGlvbiwgZGVwZW5kaW5nIG9uIHRoZSByZXR1cm4gc3RhdHVzIG9mIHRoZSBzdXBwb3J0IHJvdXRpbmUgaGNmX2VuY2FwLgorKgorKi5OT1RJQ0UKKyoJaGNmX3NlbmRfbXNnIGxlYXZlcyB0aGUgcmVzcG9uc2liaWxpdHkgdG8gb25seSBzZW5kIG1lc3NhZ2VzIG9uIGVuYWJsZWQgcG9ydHMgYXQgdGhlIE1TRiBsZXZlbC4KKyoJVGhpcyBpcyBjb25zaWRlcmVkIHRoZSBzdHJhdGVneSB3aGljaCBpcyBzdWZmaWNpZW50bHkgYWRlcXVhdGUgZm9yIGFsbCAicm9idXN0IiBNU0ZzLCBoYXZlIHRoZSBsZWFzdAorKglwcm9jZXNzb3IgdXRpbGl6YXRpb24gYW5kIGJlaW5nIHN0aWxsIGFjY2VwdGFibGUgcm9idXN0IGF0IHRoZSBXQ0kgISEhISEKKyoKKyoJaGNmX3NlbmRfbXNnIGRvZXMgbm90IE5FRUQgYSByZXR1cm4gdmFsdWUgdG8gcmVwb3J0IE5JQyBhYnNlbmNlIG9yIHJlbW92YWwgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YKKyoJaGNmX3NlbmRfbXNnKCksIGJlY2F1c2UgdGhlIE1TRiBhbmQgaGlnaGVyIGxheWVycyBtdXN0IGJlIGFibGUgdG8gY29wZSBhbnl3YXkgd2l0aCB0aGUgTklDIGJlaW5nIHJlbW92ZWQKKyoJYWZ0ZXIgYSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgaGNmX3NlbmRfbXNnKCkgYnV0IGJlZm9yZSB0aGUgYWN0dWFsIHRyYW5zbWlzc2lvbiB0b29rIHBsYWNlLgorKglUbyBhY2NvbW1vZGF0ZSB1c2VyIGV4cGVjdGF0aW9ucyB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2VzIHJlcG9ydCBOSUMgYWJzZW5jZS4KKyoJRGVmdW5jdCBibG9ja3MgYWxsIE5JQyBhY2Nlc3MgYW5kIHdpbGwgKGFsc28pIGJlIHJlcG9ydGVkIG9uIGEgbnVtYmVyIG9mIG90aGVyIGNhbGxzLgorKgorKgloY2Zfc2VuZF9tc2cgZG9lcyBub3QgY2hlY2sgZm9yIHRyYW5zbWl0IGJ1ZmZlciBvdmVyZmxvdyBiZWNhdXNlIHRoZSBIZXJtZXMgZG9lcyB0aGlzIHByb3RlY3Rpb24uCisqCUluIGNhc2Ugb2YgYSB0cmFuc21pdCBidWZmZXIgb3ZlcmZsb3csIHRoZSBzdXJwbHVzIHdoaWNoIGRvZXMgbm90IGZpdCBpbiB0aGUgYnVmZmVyIGlzIHNpbXBseSBkcm9wcGVkLgorKglOb3RlIHRoYXQgdGhpcyBwb3NzaWJseSByZXN1bHRzIGluIHRoZSB0cmFuc21pc3Npb24gb2YgaW5jb21wbGV0ZSBmcmFtZXMuCisqCisqCUFmdGVyIHNvbWUgZGVsaWJlcmF0aW9uIHdpdGggRi9XIHRlYW0sIGl0IGlzIGRlY2lkZWQgdGhhdCAtIGJlaW5nIGluIHRoZSB0d2lsaWdodCB6b25lIG9mIG5vdCBrbm93aW5nCisqCXdoZXRoZXIgdGhlIHByb2JsZW0gYXQgaGFuZCBpcyBhbiBNU0YgYnVnLCBIQ0YgYnVmLCBGL1cgYnVnLCBIL1cgbWFsZnVuY3Rpb24gb3IgZXZlbiBzb21ldGhpbmcgZWxzZSAtIHRoZXJlCisqCWlzIG5vICJiZXN0IHRoaW5nIHRvIGRvIiBpbiBjYXNlIG9mIGEgZmFpbGluZyBzZW5kLCBoZW5jZSB0aGUgSENGIGNvbnNpZGVycyB0aGUgVHhGSUQgb3duZXJzaGlwIHRvIGJlIHRha2VuCisqCW92ZXIgYnkgdGhlIEYvVyBhbmQgaG9wZXMgZm9yIGFuIEFsbG9jYXRlIGV2ZW50IGluIGR1ZSB0aW1lCisqCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CitoY2Zfc2VuZF9tc2coIElGQlAgaWZicCwgREVTQ19TVFJDVCAqZGVzY3AsIGhjZl8xNiB0eF9jbnRsICkKK3sKK2ludAkJCXJjID0gSENGX1NVQ0NFU1M7CitERVNDX1NUUkNUCSpwIC8qID0gZGVzY3AqLzsJCS8vd29ya2luZyBwb2ludGVyCitoY2ZfMTYJCWxlbjsJCQkJCS8vIHRvdGFsIGJ5dGUgY291bnQKK2hjZl8xNgkJaTsKKworaGNmXzE2CQlmaWQgPSAwOworCisJSENGQVNTRVJUKCBpZmJwLT5JRkJfUnNjSW5kIHx8IGRlc2NwID09IE5VTEwsIGlmYnAtPklGQl9Sc2NJbmQgKQorCUhDRkFTU0VSVCggKGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFX0RNQSkgPT0gMCwgMHhEQURCICkKKworCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfU0VORF9NU0csIHR4X2NudGwgKQorCUhDRkFTU0VSVCggaWZicC0+SUZCX01hZ2ljID09IEhDRl9NQUdJQywgaWZicC0+SUZCX01hZ2ljICkKKwlIQ0ZBU1NFUlRfSU5UCisJLyogb2Jub3hpb3VzIGM6L2hjZi9oY2YuYygxNDgwKSA6IHdhcm5pbmcgQzQ3Njk6IGNvbnZlcnNpb24gb2YgbmVhciBwb2ludGVyIHRvIGxvbmcgaW50ZWdlciwKKwkgKiBzbyBza2lwICovCisJSENGQVNTRVJUKCAoKGhjZl8zMilkZXNjcCAmIDMgKSA9PSAwLCAoaGNmXzMyKWRlc2NwICkKKyNpZiBIQ0ZfQVNTRVJUCit7CWludCB4ID0gaWZicC0+SUZCX0ZXSWRlbnRpdHkuY29tcF9pZCA9PSBDT01QX0lEX0ZXX0FQID8gdHhfY250bCAmIH5IRlNfVFhfQ05UTF9QT1JUIDogdHhfY250bDsKKwlIQ0ZBU1NFUlQoICh4ICYgfkhDRl9UWF9DTlRMX01BU0sgKSA9PSAwLCB0eF9jbnRsICkKK30KKyNlbmRpZiAvLyBIQ0ZfQVNTRVJUCisKKwlpZiAoIGRlc2NwICkgaWZicC0+SUZCX1R4RklEID0gMDsJCQkJLy9jYW5jZWwgYSBwcmUtcHV0IG1lc3NhZ2UKKworI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfVFhfQ09OVAkJCQkvLyBDb250aW51b3VzIHRyYW5zbWl0IHRlc3QKKwlpZiAoIHR4X2NudGwgPT0gSEZTX1RYX0NOVExfVFhfQ09OVCApIHsKKwkgCWlmICggKCBmaWQgPSBnZXRfZmlkKCBpZmJwICkgKSAhPSAwICkgeworCQkJCQkJCQkJCQkvL3NldHVwIEJBUCB0byBiZWdpbiBvZiBUeEZTCisJCQkodm9pZClzZXR1cF9iYXAoIGlmYnAsIGZpZCwgMCwgSU9fT1VUICk7CisJCQkJCQkJCQkJCS8vY29weSBhbGwgdGhlIGZyYWdtZW50cyBpbiBhIHRyYW5zcGFyZW50IGZhc2hpb24KKwkJIAlmb3IgKCBwID0gZGVzY3A7IHA7IHAgPSBwLT5uZXh0X2Rlc2NfYWRkciApIHsKKwkJCS8qIG9ibm94aW91cyB3YXJuaW5nIEM0NzY5OiBjb252ZXJzaW9uIG9mIG5lYXIgcG9pbnRlciB0byBsb25nIGludGVnZXIgKi8KKwkJCQlIQ0ZBU1NFUlQoICgoaGNmXzMyKXAgJiAzICkgPT0gMCwgKGhjZl8zMilwICkKKwkJCQlwdXRfZnJhZyggaWZicCwgcC0+YnVmX2FkZHIsIHAtPkJVRl9DTlQgQkVfUEFSKDApICk7CisJCQl9CisJCQlyYyA9IGNtZF9leGUoIGlmYnAsIEhDTURfVEhFU0VVUyB8IEhDTURfQlVTWSB8IEhDTURfU1RBUlRQUkVBTUJMRSwgZmlkICk7CisJCQlpZiAoIGlmYnAtPklGQl9Sc2NJbmQgPT0gMCApIHsKKwkJCQlpZmJwLT5JRkJfUnNjSW5kID0gZ2V0X2ZpZCggaWZicCApOworCQkJfQorCQl9CisJCQkJCQkJCQkJCS8vIGVlbiBzbGVjaHQgdm9vcmJlZWxkIGRvZXQgZ29lZCB2b2xnZW4gOz8KKwkJSENGTE9HRVhJVCggSENGX1RSQUNFX1NFTkRfTVNHICkKKwkJcmV0dXJuIHJjOworCX0KKyNlbmRpZiAvLyBIQ0ZfRVhUX1RYX0NPTlQKKwkJCQkJCQkJCS8qIHRoZSBmb2xsb3dpbmcgaW5pdGlhbGl6YXRpb24gY29kZSBpcyByZWR1bmRhbnQgZm9yIGEgcHJlLXB1dCBtZXNzYWdlCisJCQkJCQkJCQkgKiBidXQgbW92aW5nIGl0IGluc2lkZSB0aGUgImlmIGZpZCIgbG9naWMgbWFrZXMgdGhlIG1lcmdpbmcgd2l0aCB0aGUKKwkJCQkJCQkJCSAqIFVTQiBmbG93IGF3a3dhcmQKKwkJCQkJCQkJCSAqLworI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKKwl0eF9jbnRsIHw9IGlmYnAtPklGQl9NSUNUeENudGw7CisjZW5kaWYgLy8gSENGX1RZUEVfV1BBCisJaWYgKCAoZmlkID0gaWZicC0+SUZCX1R4RklEKSA9PSAwICYmICggZmlkID0gZ2V0X2ZpZCggaWZicCApICkgIT0gMCApIAkJLyogNCAqLworCQkJLyogc2tpcCB0aGUgbmV4dCBjb21wb3VuZCBzdGF0ZW1lbnQgaWY6CisJCQkgICAtIHByZS1wdXQgbWVzc2FnZSBvcgorCQkJICAgLSBubyBmaWQgYXZhaWxhYmxlICh3aGljaCBzaG91bGQgbmV2ZXIgb2NjdXIgaWYgdGhlIE1TRiBhZGhlcmVzIHRvIHRoZSBXQ0kpCisJCQkgKi8KKwl7CQkvLyB0byBtYXRjaCB0aGUgY2xvc2luZyBjdXJseSBicmFja2V0IG9mIGFib3ZlICJpZiIgaW4gY2FzZSBvZiBIQ0ZfVFlQRV9VU0IKKwkJCQkJCQkJCQkJLy9jYWxjdWxhdGUgdG90YWwgbGVuZ3RoIDs/IHN1cGVyZmx1b3VzIHVubGVzcyBDQ1ggb3IgRW5jYXBzdWxhdGlvbgorCQlsZW4gPSAwOworCQlwID0gZGVzY3A7CisJCWRvIGxlbiArPSBwLT5CVUZfQ05UOyB3aGlsZSAoICggcCA9IHAtPm5leHRfZGVzY19hZGRyICkgIT0gTlVMTCApOworCQlwID0gZGVzY3A7CisvLzs/CUhDRkFTU0VSVCggbGVuIDw9IEhDRl9NQVhfTVNHLCBsZW4gKQorLyo3Ki8JKHZvaWQpc2V0dXBfYmFwKCBpZmJwLCBmaWQsIEhGU19UWF9DTlRMLCBJT19PVVQgKTsKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfVFhfREVMQVkKKwkJSENGQVNTRVJUKCAoIGRlc2NwICE9IE5VTEwgKSBeICggdHhfY250bCAmIEhGU19UWF9DTlRMX1RYX0RFTEFZICksIHR4X2NudGwgKQorCQlpZiAoIHR4X2NudGwgJiBIRlNfVFhfQ05UTF9UWF9ERUxBWSApIHsKKwkJCXR4X2NudGwgJj0gfkhGU19UWF9DTlRMX1RYX0RFTEFZOwkJLy8hIUhGU19UWF9DTlRMX1RYX0RFTEFZIG5vIGxvbmdlciBhdmFpbGFibGUKKwkJCWlmYnAtPklGQl9UeEZJRCA9IGZpZDsKKwkJCWZpZCA9IDA7CQkJCQkJCQkvLyEhZmlkIG5vIGxvbmdlciBhdmFpbGFibGUsIGJlIGNhcmVmdWwgd2hlbiBtb2RpZnlpbmcgY29kZQorCQl9CisjZW5kaWYgLy8gSENGX1RZUEVfVFhfREVMQVkKKwkJT1BXKCBIUkVHX0RBVEFfMSwgdHhfY250bCApIDsKKwkJT1BXKCBIUkVHX0RBVEFfMSwgMCApOworI2lmICEgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfQ0NYICkKKwkJSENGQVNTRVJUKCBwLT5CVUZfQ05UID49IDE0LCBwLT5CVUZfQ05UICkKKwkJCQkJCQkJCQkJLyogYXNzdW1lIERlc3RBZGRyL1NyY0FkZHIvTGVuL1R5cGUgQUxXQVlTIGNvbnRhaW5lZCBpbiAxc3QgZnJhZ21lbnQKKwkJCQkJCQkJCQkJICogb3RoZXJ3aXNlIGxpZmUgZ2V0cyB0b28gY3VtYmVyc29tZSBmb3IgTUlDIGFuZCBFbmNhcHN1bGF0aW9uICEhISEhISEhCisJCWlmICggcC0+QlVGX0NOVCA+PSAxNCApIHsJYWx0ZXJuYXRpdmVseTogYWRkIGEgc2FmZXR5IGVzY2FwZSAhISEhISEhISEhISEgfQkqLworI2VuZGlmIC8vIEhDRl9UWVBFX0NDWAorCQlDQUxDX1RYX01JQyggTlVMTCwgLTEgKTsJCS8vaW5pdGlhbGl6ZSBNSUMKKy8qMTAqLwlwdXRfZnJhZyggaWZicCwgcC0+YnVmX2FkZHIsIEhDRl9EQVNBX1NJWkUgQkVfUEFSKDApICk7CS8vd3JpdGUgREEsIFNBIHdpdGggTUlDIGNhbGN1bGF0aW9uCisJCUNBTENfVFhfTUlDKCBwLT5idWZfYWRkciwgSENGX0RBU0FfU0laRSApOwkJLy9NSUMgb3ZlciBEQSwgU0EKKwkJQ0FMQ19UWF9NSUMoIG51bGxfYWRkciwgNCApOwkJLy9NSUMgb3ZlciAodmlydHVhbCkgcHJpb3JpdHkgZmllbGQKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfQ0NYCisJCS8vISFiZSBjYXJlZnVsIGRvIG5vdCB1c2UgcG9zaXRpdmUgdGVzdCBvbiBIQ0ZfQUNUX0NDWF9PRkYsIGJlY2F1c2UgSUZCX0NLSVBTdGF0IGlzIGluaXRpYWxseSAwCisJCWlmKCggaWZicC0+SUZCX0NLSVBTdGF0ID09IEhDRl9BQ1RfQ0NYX09OICkgfHwKKyAgICAgICAgICAgKChHRVRfQlVGX0NOVChwKSA+PSAyMCApICAgJiYgKCBpZmJwLT5JRkJfQ0tJUFN0YXQgPT0gSENGX0FDVF9DQ1hfT0ZGICkgJiYKKyAgICAgICAgICAgIChwLT5idWZfYWRkclsxMl0gPT0gMHhBQSkgJiYgKHAtPmJ1Zl9hZGRyWzEzXSA9PSAweEFBKSAmJgorICAgICAgICAgICAgKHAtPmJ1Zl9hZGRyWzE0XSA9PSAweDAzKSAmJiAocC0+YnVmX2FkZHJbMTVdID09IDB4MDApICYmCisgICAgICAgICAgICAocC0+YnVmX2FkZHJbMTZdID09IDB4NDApICYmIChwLT5idWZfYWRkclsxN10gPT0gMHg5NikgJiYKKyAgICAgICAgICAgIChwLT5idWZfYWRkclsxOF0gPT0gMHgwMCkgJiYgKHAtPmJ1Zl9hZGRyWzE5XSA9PSAweDAwKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGkgPSBIQ0ZfREFTQV9TSVpFOworCisgICAgICAgICAgICBPUFcoIEhSRUdfREFUQV8xLCBDTlZfU0hPUlRfVE9fQklHKCBsZW4gLSBpICkpOworCisgICAgICAgICAgICAvKiBuZWVkIHRvIHNlbmQgb3V0IHRoZSByZW1haW5kZXIgb2YgdGhlIGZyYWdtZW50ICovCisJCQlwdXRfZnJhZyggaWZicCwgJnAtPmJ1Zl9hZGRyW2ldLCBHRVRfQlVGX0NOVChwKSAtIGkgQkVfUEFSKDApICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmIC8vIEhDRl9UWVBFX0NDWAorCQl7CisJCQkJCQkJCQkJCS8vaWYgZW5jYXBzdWxhdGlvbiBuZWVkZWQKKyNpZiAoSENGX0VOQ0FQKSA9PSBIQ0ZfRU5DCisJCQkJCQkJCQkJCS8vd3JpdGUgbGVuZ3RoICh3aXRoIFNOQVAtaGVhZGVyLFR5cGUsIHdpdGhvdXQgLy9EQSxTQSxMZW5ndGggKSBubyBNSUMgY2FsYy4KKwkJCWlmICggKCBzbmFwX2hlYWRlcltzaXplb2Yoc25hcF9oZWFkZXIpLTFdID0gaGNmX2VuY2FwKCAmcC0+YnVmX2FkZHJbSENGX0RBU0FfU0laRV0gKSApICE9IEVOQ19OT05FICkgeworCQkJCU9QVyggSFJFR19EQVRBXzEsIENOVl9FTkRfU0hPUlQoIGxlbiArIChzaXplb2Yoc25hcF9oZWFkZXIpICsgMikgLSAoIDIqNiArIDIgKSApICk7CisJCQkJCQkJCQkJCS8vd3JpdGUgc3BsaWNlIHdpdGggTUlDIGNhbGN1bGF0aW9uCisJCQkJcHV0X2ZyYWcoIGlmYnAsIHNuYXBfaGVhZGVyLCBzaXplb2Yoc25hcF9oZWFkZXIpIEJFX1BBUigwKSApOworCQkJCUNBTENfVFhfTUlDKCBzbmFwX2hlYWRlciwgc2l6ZW9mKHNuYXBfaGVhZGVyKSApOwkvL01JQyBvdmVyIDYgYnl0ZSBTTkFQCisJCQkJaSA9IEhDRl9EQVNBX1NJWkU7CisJCQl9IGVsc2UKKyNlbmRpZiAvLyBIQ0ZfRU5DCisJCQl7CisJCQkJT1BXKCBIUkVHX0RBVEFfMSwgKih3Y2lfcmVjb3JkcCkmcC0+YnVmX2FkZHJbSENGX0RBU0FfU0laRV0gKTsKKwkJCQlpID0gMTQ7CisJCQl9CisJCQkJCQkJCQkJCS8vY29tcGxldGUgMXN0IGZyYWdtZW50IHN0YXJ0aW5nIHdpdGggVHlwZSB3aXRoIE1JQyBjYWxjdWxhdGlvbgorCQkJcHV0X2ZyYWcoIGlmYnAsICZwLT5idWZfYWRkcltpXSwgcC0+QlVGX0NOVCAtIGkgQkVfUEFSKDApICk7CisJCQlDQUxDX1RYX01JQyggJnAtPmJ1Zl9hZGRyW2ldLCBwLT5CVUZfQ05UIC0gaSApOworCQl9CisJCQkJCQkJCQkJCS8vZG8gdGhlIHJlbWFpbmluZyBmcmFnbWVudHMgd2l0aCBNSUMgY2FsY3VsYXRpb24KKwkJd2hpbGUgKCAoIHAgPSBwLT5uZXh0X2Rlc2NfYWRkciApICE9IE5VTEwgKSB7CisJCQkvKiBvYm5veGlvdXMgYzovaGNmL2hjZi5jKDE0ODApIDogd2FybmluZyBDNDc2OTogY29udmVyc2lvbiBvZiBuZWFyIHBvaW50ZXIgdG8gbG9uZyBpbnRlZ2VyLAorCQkJICogc28gc2tpcCAqLworCQkJSENGQVNTRVJUKCAoKGhjZl8zMilwICYgMyApID09IDAsIChoY2ZfMzIpcCApCisJCQlwdXRfZnJhZyggaWZicCwgcC0+YnVmX2FkZHIsIHAtPkJVRl9DTlQgQkVfUEFSKDApICk7CisJCQlDQUxDX1RYX01JQyggcC0+YnVmX2FkZHIsIHAtPkJVRl9DTlQgKTsKKwkJfQorCQkJCQkJCQkJCQkvL3BhZCBtZXNzYWdlLCBmaW5hbGl6ZSBNSUMgY2FsY3VsYXRpb24gYW5kIHdyaXRlIE1JQyB0byBOSUMKKwkJcHV0X2ZyYWdfZmluYWxpemUoIGlmYnAgKTsKKwl9CisJaWYgKCBmaWQgKSB7CisvKjE2Ki8JcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX0JVU1kgfCBIQ01EX1RYIHwgSENNRF9SRUNMLCBmaWQgKTsKKwkJaWZicC0+SUZCX1R4RklEID0gMDsKKwkJCS8qIHByb2JhYmx5IHRoaXMgKGkuZS4gbm8gUnNjSW5kIEFORCAiSFJFR19FVl9BTExPQyIpIGF0IHRoaXMgcG9pbnQgaW4gdGltZSBvY2N1cnMgc28gaW5mcmVxdWVudCwKKwkJCSAqIHRoYXQgaXQgbWlnaHQganVzdCBhcyB3ZWxsIGJlIGFjY2VwdGFibGUgdG8gc2tpcCB0aGlzCisJCQkgKiAib3B0aW1pemF0aW9uIiBjb2RlIGFuZCBoYW5kbGUgdGhhdCBhZGRpdGlvbmFsIGludGVycnVwdCBvbmNlIGluIGEgd2hpbGUKKwkJCSAqLworLy8gMTgwIGRlZ3JlZSBlcnJvciBpbiBsb2dpYyA7PyAjaWYgQUxMT0NfMTUKKy8qMjAqLwlpZiAoIGlmYnAtPklGQl9Sc2NJbmQgPT0gMCApIHsKKwkJCWlmYnAtPklGQl9Sc2NJbmQgPSBnZXRfZmlkKCBpZmJwICk7CisJCX0KKy8vICNlbmRpZiAvLyBBTExPQ18xNQorCX0KKy8vCUhDRkFTU0VSVCggbGV2ZWw6OmlmYnAtPklGQl9Sc2NJbmQsIGlmYnAtPklGQl9Sc2NJbmQgKQorCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9TRU5EX01TRyApCisJcmV0dXJuIHJjOworfSAvLyBoY2Zfc2VuZF9tc2cKKyNlbmRpZiAvLyBIQ0ZfRExfT05MWQorCisKKyNpZiAoSENGX0RMX09OTFkpID09IDAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouTU9EVUxFCQlpbnQgaGNmX3NlcnZpY2VfbmljKCBJRkJQIGlmYnAsIHdjaV9idWZwIGJ1ZnAsIHVuc2lnbmVkIGludCBsZW4gKQorKi5QVVJQT1NFCQlTZXJ2aWNlcyAobW9zdCkgTklDIGV2ZW50cy4KKyoJCQkJUHJvdmlkZXMgcmVjZWl2ZWQgbWVzc2FnZQorKgkJCQlQcm92aWRlcyBzdGF0dXMgaW5mb3JtYXRpb24uCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyogIEluIG5vbi1ETUEgbW9kZToKKyoJYnVmcAkJYWRkcmVzcyBvZiBjaGFyIGJ1ZmZlciwgc3VmZmljaWVudGx5IGxhcmdlIHRvIGhvbGQgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIFJ4RlMgdXAgdGhyb3VnaCBIRlNfVFlQRQorKglsZW4JCQlsZW5ndGggaW4gYnl0ZXMgb2YgYnVmZmVyIHNwZWNpZmllZCBieSBidWZwCisqCQkJCXZhbHVlIGJldHdlZW4gSEZTX1RZUEUgKyAyIGFuZCBIRlNfQUREUl9ERVNUICsgSENGX01BWF9NU0cKKyoKKyouUkVUVVJOUworKglIQ0ZfU1VDQ0VTUworKglIQ0ZfRVJSX01JQwltZXNzYWdlIGNvbnRhaW5zIGFuIGVycm9uZW91cyBNSUMgKG9ubHkgaWYgZnJhbWUgZml0cyBjb21wbGV0ZWx5IGluIGJ1ZnApCisqCisqLkRFU0NSSVBUSU9OCisqCisqIE1TRi1hY2Nlc3NpYmxlIGZpZWxkcyBvZiBSZXN1bHQgQmxvY2sKKyogLSBJRkJfUnhMZW4JCQkwIG9yIEZyYW1lIHNpemUuCisqIC0gSUZCX01CSW5mb0xlbgkJMCBvciB0aGUgTC1maWVsZCBvZiB0aGUgb2xkZXN0IE1CSUIuCisqIC0gSUZCX1JzY0luZAorKiAtIElGQl9IQ0ZfVGFsbGllcwkJdXBkYXRlZCBpZiBhIGNvcnJlc3BvbmRpbmcgZXZlbnQgb2NjdXJyZWQuCisqIC0gSUZCX05JQ19UYWxsaWVzCQl1cGRhdGVkIGlmIGEgVGFsbHkgSW5mbyBmcmFtZSByZWNlaXZlZCBmcm9tIHRoZSBOSUMuCisqIC0gSUZCX0RtYVBhY2tldHMKKyogLSBJRkJfVHhGc1N0YXQKKyogLSBJRkJfVHhGc1N3U3VwCisqIC0gSUZCX0xpbmtTdGF0CQlyZWZsZWN0cyBuZXcgbGluayBzdGF0dXMgb3IgMHgwMDAwIGlmIG5vIGNoYW5nZSByZWxhdGl2ZSB0byBwcmV2aW91cyBoY2Zfc2VydmljZV9uaWMgY2FsbC4KK29yCisqIC0gSUZCX0xpbmtTdGF0CQlsaW5rIHN0YXR1cywgMHg4MDAwIHJlZmxlY3RzIGNoYW5nZSByZWxhdGl2ZSB0byBwcmV2aW91cyBoY2Zfc2VydmljZV9uaWMgY2FsbC4KKyoKKyogV2hlbiBJRkJfTUJJbmZvTGVuIGlzIG5vbi16ZXJvLCBhdCBsZWFzdCBvbmUgTUJJQiBpcyBhdmFpbGFibGUuCisqCisqIElGQl9SeExlbglyZWZsZWN0cyB0aGUgbnVtYmVyIG9mIHJlY2VpdmVkIGJ5dGVzIGluIDgwMi4zIHZpZXcgKEluY2x1ZGluZyBEZXN0QWRkciwgU3JjQWRkciBhbmQgTGVuZ3RoLAorKiBleGNsdWRpbmcgTUlDLXBhZGRpbmcsIE1JQyBhbmQgc3VtIGNoZWNrKSBvZiBhY3RpdmUgUnggRnJhbWUgU3RydWN0dXJlLiBJZiBubyBSeCBEYXRhIHMgYXZhaWxhYmxlLCBJRkJfUnhMZW4KKyogZXF1YWxzIDB4MDAwMC4KKyogUmVwZWF0ZWQgZXhlY3V0aW9uIGNhdXNlcyB0aGUgU2VydmljZSBOSUMgRnVuY3Rpb24gdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCBzdWJzZXF1ZW50bHkgcmVjZWl2ZWQKKyogbWVzc2FnZXMsIGlycmVzcGVjdGl2ZSB3aGV0aGVyIGEgaGNmX3Jjdl9tc2cgb3IgaGNmX2FjdGlvbihIQ0ZfQUNUX1JYKSBpcyBwZXJmb3JtZWQgaW4gYmV0d2Vlbi4KKyoKKyogV2hlbiBJRkJfUnhMZW4gaXMgbm9uLXplcm8sIGEgUmVjZWl2ZWQgRnJhbWUgU3RydWN0dXJlIGlzIGF2YWlsYWJsZSB0byBiZSByb3V0ZWQgdG8gdGhlIHByb3RvY29sIHN0YWNrLgorKiBXaGVuIE1vbml0b3IgTW9kZSBpcyBub3QgYWN0aXZlLCB0aGlzIGlzIGd1YXJhbnRlZWQgdG8gYmUgYW4gZXJyb3ItZnJlZSBub24tV01QIGZyYW1lLgorKiBJbiBjYXNlIG9mIE1vbml0b3IgTW9kZSwgaXQgbWF5IGFsc28gYmUgYSBmcmFtZSB3aXRoIGFuIGVycm9yIG9yIGEgV01QIGZyYW1lLgorKiBFcnJvbmVvdXMgZnJhbWVzIGhhdmUgYSBub24temVybyBlcnJvci1zdWIgZmllbGQgaW4gdGhlIEhGU19TVEFUIGZpZWxkIGluIHRoZSBsb29rIGFoZWFkIGJ1ZmZlci4KKyoKKyogSWYgYSBSZWNlaXZlIG1lc3NhZ2UgaXMgYXZhaWxhYmxlIGluIE5JQyBSQU0sIHRoZSBSZWNlaXZlIEZyYW1lIFN0cnVjdHVyZSBpcyAocGFydGx5KSBjb3BpZWQgZnJvbSB0aGUgTklDIHRvCisqIHRoZSBidWZmZXIgaWRlbnRpZmllZCBieSBidWZwLgorKiBDb3B5aW5nIHN0b3BzIGVpdGhlciBhZnRlciBsZW4gYnl0ZXMgb3Igd2hlbiB0aGUgY29tcGxldGUgODAyLjMgZnJhbWUgaXMgY29waWVkLgorKiBEdXJpbmcgdGhlIGNvcHlpbmcgdGhlIG1lc3NhZ2UgaXMgZGVjYXBzdWxhdGVkIChpZiBhcHByb3ByaWF0ZSkuCisqIElmIHRoZSBmcmFtZSBpcyByZWFkIGNvbXBsZXRlbHkgYnkgaGNmX3NlcnZpY2VfbmljIChpLmUuIHRoZSBmcmFtZSBmaXRzIGNvbXBsZXRlbHkgaW4gdGhlIGxvb2thaGVhZCBidWZmZXIpLAorKiB0aGUgZnJhbWUgaXMgYXV0b21hdGljYWxseSBBQ0snZWQgdG8gdGhlIEYvVyBhbmQgc3RpbGwgYXZhaWxhYmxlIHZpYSB0aGUgbG9vayBhaGVhZCBidWZmZXIgYW5kIGhjZl9yY3ZfbXNnLgorKiBPbmx5IGlmIHRoZSBmcmFtZSBpcyByZWFkIGNvbXBsZXRlbHkgYnkgaGNmX3NlcnZpY2VfbmljLCBoY2Zfc2VydmljZV9uaWMgY2hlY2tzIHRoZSBNSUMgYW5kIHNldHMgdGhlIHJldHVybgorKiBzdGF0dXMgYWNjb3JkaW5nbHkuICBJbiB0aGlzIGNhc2UsIGhjZl9yY3ZfbXNnIGRvZXMgbm90IGNoZWNrIHRoZSBNSUMuCisqCisqIFRoZSBNSUMgY2FsY3VsYXRpb24gYWxnb3JpdGhtIHdvcmtzIG1vcmUgZWZmaWNpZW50IGlmIHRoZSBsZW5ndGggb2YgdGhlIGxvb2sgYWhlYWQgYnVmZmVyIGlzCisqIHN1Y2ggdGhhdCBpdCBmaXRzIGV4YWN0bHkgNCBuIGJ5dGVzIG9mIHRoZSA4MDIuMyBmcmFtZSwgaS5lLiBsZW4gPT0gSEZTX0FERFJfREVTVCArIDQqbi4KKyoKKyogVGhlIFNlcnZpY2UgTklDIEZ1bmN0aW9uIHN1cHBvcnRzIHRoZSBOSUMgZXZlbnQgc2VydmljZSBoYW5kbGluZyBwcm9jZXNzLgorKiBJdCBwZXJmb3JtcyB0aGUgYXBwcm9wcmlhdGUgYWN0aW9ucyB0byBzZXJ2aWNlIHRoZSBOSUMsIHN1Y2ggdGhhdCB0aGUgZXZlbnQgY2F1c2UgaXMgZWxpbWluYXRlZCBhbmQgcmVsYXRlZAorKiBpbmZvcm1hdGlvbiBpcyBzYXZlZC4KKyogVGhlIFNlcnZpY2UgTklDIEZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGJ5IHRoZSBNU0YgSVNSIG9yIHBvbGxpbmcgcm91dGluZSBhcyBmaXJzdCBzdGVwIHRvIGRldGVybWluZSB0aGUgZXZlbnQKKyogY2F1c2UocykuICBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIE1TRiB0byBwZXJmb3JtIGFsbCBub3QgZGlyZWN0bHkgTklDIHJlbGF0ZWQgaW50ZXJydXB0IHNlcnZpY2UKKyogYWN0aW9ucywgZS5nLiBpbiBhIFBDIGVudmlyb25tZW50IHRoaXMgaW5jbHVkZXMgc2VydmljaW5nIHRoZSBQSUMsIGFuZCBtYW5hZ2luZyB0aGUgUHJvY2Vzc29yIEludGVycnVwdAorKiBFbmFibGluZy9EaXNhYmxpbmcuCisqIEluIGNhc2Ugb2YgYSBwb2xsZWQgYmFzZWQgc3lzdGVtLCB0aGUgU2VydmljZSBOSUMgRnVuY3Rpb24gbXVzdCBiZSBleGVjdXRlZCAiZnJlcXVlbnRseSIuCisqIFRoZSBTZXJ2aWNlIE5JQyBGdW5jdGlvbiBtYXkgaGF2ZSBzaWRlIGVmZmVjdHMgcmVsYXRlZCB0byB0aGUgTWFpbGJveCBhbmQgUmVzb3VyY2UgSW5kaWNhdG9yIChJRkJfUnNjSW5kKS4KKyoKKyogaGNmX3NlcnZpY2VfbmljIHJldHVybnM6CisqIC0gVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBpbiB0aGUgYXZhaWxhYmxlIE1CSUIgKElGQl9NQkluZm9MZW4pCisqIC0gQ2hhbmdlcyBpbiB0aGUgbGluayBzdGF0dXMgKElGQl9MaW5rU3RhdCkKKyogLSBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGluIHRoZSBhdmFpbGFibGUgUmVjZWl2ZSBGcmFtZSBTdHJ1Y3R1cmUgKElGQl9SeExlbikKKyogLSB1cGRhdGVkIElGQl9Sc2NJbmQKKyogLSBVcGRhdGVkIFRhbGxpZXMKKyoKKyogaGNmX3NlcnZpY2VfbmljIGlzIHByZXN1bWVkIHRvIG5laXRoZXIgaW50ZXJydXB0IG90aGVyIEhDRi10YXNrcyBub3IgdG8gYmUgaW50ZXJydXB0ZWQgYnkgb3RoZXIgSENGLXRhc2tzLgorKiBBIHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gcHJlY2VkZSBoY2Zfc2VydmljZV9uaWMgYXMgd2VsbCBhcyBhbGwgb3RoZXIgSENGLXRhc2tzIHdpdGggYSBjYWxsIHRvCisqIGhjZl9hY3Rpb24gdG8gZGlzYWJsZSB0aGUgY2FyZCBpbnRlcnJ1cHRzIGFuZCwgYWZ0ZXIgYWxsIHdvcmsgaXMgY29tcGxldGVkLCB3aXRoIGEgY2FsbCB0byBoY2ZfYWN0aW9uIHRvCisqIHJlc3RvcmUgKHdoaWNoIGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyBlbmFibGluZykgdGhlIGNhcmQgaW50ZXJydXB0cy4KKyogSW4gY2FzZSBvZiBhIHBvbGxlZCBlbnZpcm9ubWVudCwgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBNU0YgcHJvZ3JhbW1lciBpcyBzdWZmaWNpZW50bHkgZmFtaWxpYXIgd2l0aCB0aGUKKyogc3BlY2lmaWMgcmVxdWlyZW1lbnRzIG9mIHRoYXQgZW52aXJvbm1lbnQgdG8gdHJhbnNsYXRlIHRoZSBpbnRlcnJ1cHQgc3RyYXRlZ3kgdG8gYSBwb2xsZWQgc3RyYXRlZ3kuCisqCisqIGhjZl9zZXJ2aWNlX25pYyBzZXJ2aWNlcyB0aGUgZm9sbG93aW5nIEhlcm1lcyBldmVudHM6CisqIC0gSFJFR19FVl9JTkZPCQlBc3luY2hyb25vdXMgSW5mb3JtYXRpb24gRnJhbWUKKyogLSBIUkVHX0VWX0lORk9fRFJPUAlXTUFDIGRpZCBub3QgaGF2ZSBzdWZmaWNpZW50IFJBTSB0byBidWlsZCBVbnNvbGljaXRlZCBJbmZvcm1hdGlvbiBGcmFtZQorKiAtIEhSRUdfRVZfVFhfRVhDCQkoaWYgYXBwbGljYWJsZSwgaS5lLiBzZWxlY3RlZCB2aWEgSENGX0VYVF9JTlRfVFhfRVggYml0IG9mIEhDRl9FWFQpCisqIC0gSFJFR19FVl9TTEVFUF9SRVEJKGlmIGFwcGxpY2FibGUsIGkuZS4gc2VsZWN0ZWQgdmlhIEhDRl9ERFMvSENGX0NEUyBiaXQgb2YgSENGX1NMRUVQKQorKiAqKiBpbiBub25fRE1BIG1vZGUKKyogLSBIUkVHX0VWX0FMTE9DCQlBc3luY2hyb25vdXMgcGFydCBvZiBBbGxvY2F0aW9uL1JlY2xhaW0gY29tcGxldGVkIHdoaWxlIG91dCBvZiByZXNvdXJjZXMgYXQKKyogCQkJCQkJY29tcGxldGlvbiBvZiBoY2Zfc2VuZF9tc2cvbm90aWZ5CisqIC0gSFJFR19FVl9SWAkJCXRoZSBkZXRlY3Rpb24gb2YgdGhlIGF2YWlsYWJpbGl0eSBvZiByZWNlaXZlZCBtZXNzYWdlcworKiAJCQkJCQlpbmNsdWRpbmcgV2F2ZUxBTiBNYW5hZ2VtZW50IFByb3RvY29sIChXTVApIG1lc3NhZ2UgcHJvY2Vzc2luZworKiAqKiBpbiBETUEgbW9kZQorKiAtIEhSRUdfRVZfUkRNQUQKKyogLSBIUkVHX0VWX1RETUFECisqISEgaGNmX3NlcnZpY2VfbmljIGRvZXMgbm90IHNlcnZpY2UgdGhlIGZvbGxvd2luZyBIZXJtZXMgZXZlbnRzOgorKiEhIAlIUkVHX0VWX1RYIAkJCSh0aGUgIk9LIiBUeCBFdmVudCkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBieSB0aGUgV0NJLCBpZiBpdCBvY2N1cnMgaXQgaXMgdW5jbGVhcgorKiEhIAkJCQkJCXdoYXQgdGhlIGNhdXNlIGlzLCBzbyBubyBtZWFuaW5nZnVsIHN0cmF0ZWd5IGlzIGF2YWlsYWJsZS4gTm90IGFja2luZyB0aGUgYml0IGlzCisqISEgCQkJCQkJcHJvYmFibHkgdGhlIGJlc3QgaGVscCB0aGF0IGNhbiBiZSBnaXZlbiB0byB0aGUgZGVidWdnZXIuCisqISEgCUhSRUdfRVZfQ01ECQkJaGFuZGxlZCBpbiBjbWRfd2FpdC4KKyohISAJSFJFR19FVl9GV19ETUEgCQkoaS5lLiBIUkVHX0VWX1JYRE1BLCBIUkVHX0VWX1RYRE1BIGFuZF9FVl9MUEVTQykgYXJlIGVpdGhlciBub3QgdXNlZCBvciB1c2VkCisqISEgCQkJCQkJYmV0d2VlbiB0aGUgRi9XIGFuZCB0aGUgRE1BIGVuZ2luZS4KKyohISAJSFJFR19FVl9BQ0tfUkVHX1JFQURZIGlzIG9ubHkgYXBwbGljYWJsZSBmb3IgSC1JSSAoaS5lLiBub3QgSElJLjUgYW5kIHVwLCBzZWUgREFXQSkKKyoKKyoJSWYsIGluIG5vbi1ETUEgbW9kZSwgYSBSeCBtZXNzYWdlIGlzIGF2YWlsYWJsZSwgaXRzIGxlbmd0aCBpcyByZWZsZWN0ZWQgYnkgdGhlIElGQl9SeExlbiBmaWVsZCBvZiB0aGUgSUZCLgorKglUaGlzIGxlbmd0aCByZWZsZWN0cyB0aGUgZGF0YSBpdHNlbGYgYW5kIHRoZSBEZXN0aW5hdGlvbiBBZGRyZXNzLCBTb3VyY2UgQWRkcmVzcyBhbmQgRGF0YUxlbmd0aC9UeXBlIGZpZWxkCisqCWJ1dCBub3QgdGhlIFNOQVAtaGVhZGVyIGluIGNhc2Ugb2YgZGVjYXBzdWxhdGlvbiBieSB0aGUgSENGLiAgSWYgbm8gbWVzc2FnZSBpcyBhdmFpbGFibGUsIElGQl9SeExlbiBpcworKgl6ZXJvLiAgRm9ybWVyIHZlcnNpb25zIG9mIHRoZSBIQ0YgaGFuZGxlZCBXTVAgbWVzc2FnZXMgYW5kIHN1cHBvcnRlZCBhICJtb25pdG9yIiBtb2RlIGluIGhjZl9zZXJ2aWNlX25pYywKKyoJd2hpY2ggZGVwb3NpdGVkIGNlcnRhaW4gb3IgYWxsIFJ4IG1lc3NhZ2VzIGluIHRoZSBNYWlsQm94LiBUaGUgcmVzcG9uc2liaWxpdHkgdG8gaGFuZGxlIHRoZXNlIGZyYW1lcyBpcworKgltb3ZlZCB0byB0aGUgTVNGLiBUaGUgSENGIG9mZmVycyBhcyBzdXBwb3J0cyBoY2ZfcHV0X2luZm8gd2l0aCBDRkdfTUJfSU5GTyBhcyBwYXJhbWV0ZXIgdG8gZW11bGF0ZSB0aGUgb2xkCisqIAlpbXBsZW1lbnRhdGlvbiB1bmRlciBjb250cm9sIG9mIHRoZSBNU0YuCisqCisqICoqUnggQnVmZmVyIGZyZWUgc3RyYXRlZ3kKKyoJV2hlbiBoY2Zfc2VydmljZV9uaWMgcmVwb3J0cyB0aGUgYXZhaWxhYmlsaXR5IG9mIGEgbm9uLURNQSBtZXNzYWdlLCB0aGUgTVNGIGNhbiBhY2Nlc3MgdGhhdCBtZXNzYWdlIGJ5CisqCW1lYW5zIG9mIGhjZl9yY3ZfbXNnLiBJdCBtdXN0IGJlIHByZXZlbnRlZCB0aGF0IHRoZSBMQU4gQ29udHJvbGxlciB3cml0ZXMgbmV3IGRhdGEgaW4gdGhlIE5JQyBidWZmZXIKKyoJYmVmb3JlIHRoZSBNU0YgaXMgZmluaXNoZWQgd2l0aCB0aGUgY3VycmVudCBtZXNzYWdlLiBUaGUgTklDIGJ1ZmZlciBpcyByZXR1cm5lZCB0byB0aGUgTEFOIENvbnRyb2xsZXIKKyoJd2hlbjoKKyoJIC0gdGhlIGNvbXBsZXRlIGZyYW1lIGZpdHMgaW4gdGhlIGxvb2thaGVhZCBidWZmZXIgb3IKKyoJIC0gaGNmX3Jjdl9tc2cgaXMgY2FsbGVkIG9yCisqCSAtIGhjZl9hY3Rpb24gd2l0aCBIQ0ZfQUNUX1JYIGlzIGNhbGxlZCBvcgorKgkgLSBoY2Zfc2VydmljZV9uaWMgaXMgY2FsbGVkIGFnYWluCisqCUl0IGNhbiBiZSByZWFzb25lZCB0aGF0IGhjZl9hY3Rpb24oIElOVF9PTiApIHNob3VsZCBub3QgYmUgZ2l2ZW4gYmVmb3JlIHRoZSBNU0YgaGFzIGNvbXBsZXRlbHkgcHJvY2Vzc2VkCisqCWEgcmVwb3J0ZWQgUngtZnJhbWUuIFRoZSByZWFzb24gaXMgdGhhdCB0aGUgSU5UX09OIGFjdGlvbiBpcyBndWFyYW50ZWVkIHRvIGNhdXNlIGEgKFJ4LSlpbnRlcnJ1cHQgKHRoZQorKglNU0YgaXMgcHJvY2Vzc2luZyBhIFJ4LWZyYW1lLCBoZW5jZSB0aGUgUngtZXZlbnQgYml0IGluIHRoZSBIZXJtZXMgcmVnaXN0ZXIgbXVzdCBiZSBhY3RpdmUpLiBUaGlzCisqCWludGVycnVwdCB3aWxsIGNhdXNlIGhjZl9zZXJ2aWNlX25pYyB0byBiZSBjYWxsZWQsIHdoaWNoIHdpbGwgY2F1c2UgdGhlIGFjay1pbmcgb2YgdGhlICJsYXN0IiBSeC1ldmVudAorKgl0byB0aGUgSGVybWVzLCBjYXVzaW5nIHRoZSBIZXJtZXMgdG8gZGlzY2FyZCB0aGUgYXNzb2NpYXRlZCBOSUMgUkFNIGJ1ZmZlci4KKyogQXNzZXJ0IGZhaWxzIGlmCisqIC0gaWZicCBpcyB6ZXJvIG9yIG90aGVyIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCisqIC0gaGNmX3NlcnZpY2VfbmljIGlzIGNhbGxlZCB3aXRob3V0IGEgcHJpb3IgY2FsbCB0byBoY2ZfY29ubmVjdC4KKyogLSBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkLgorKiAtIHJlZW50cmFuY3ksIG1heSBiZSAgY2F1c2VkIGJ5IGNhbGxpbmcgaGNmX2Z1bmN0aW9ucyB3aXRob3V0IGFkZXF1YXRlIHByb3RlY3Rpb24KKyoJYWdhaW5zdCBOSUMgaW50ZXJydXB0cyBvciBtdWx0aS10aHJlYWRpbmcuCisqCisqCisqLkRJQUdSQU0KKyoxOglJRkJfTGlua1N0YXQgaXMgY2xlYXJlZCwgaWYgYSBMaW5rU3RhdHVzIGZyYW1lIGlzIHJlY2VpdmVkLCBJRkJfTGlua1N0YXQgd2lsbCBiZSB1cGRhdGVkIGFjY29yZGluZ2x5CisqCWJ5IGlzcl9pbmZvLgorb3IKKyoxOglJRkJfTGlua1N0YXQgY2hhbmdlIGluZGljYXRpb24gaXMgY2xlYXJlZC4gSWYgYSBMaW5rU3RhdHVzIGZyYW1lIGlzIHJlY2VpdmVkLCBJRkJfTGlua1N0YXQgd2lsbCBiZSB1cGRhdGVkCisqCWFjY29yZGluZ2x5IGJ5IGlzcl9pbmZvLgorKjI6IElGQl9SeExlbiBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHRoZSBOSUMgcHJlc2VuY2UgY2hlY2sgb3RoZXJ3aXNlOgorKgkgLQl0aGlzIHZhbHVlIG1heSBzdGF5IG5vbi16ZXJvIGlmIHRoZSBOSUMgaXMgcHVsbGVkIG91dCBhdCBhbiBpbmNvbnZlbmllbnQgbW9tZW50LgorKgkgLQl0aGUgUnhBY2sgb24gYSB6ZXJvLUZJRCBuZWVkcyBhIHplcm8tdmFsdWUgZm9yIElGQl9SeExlbiB0byB3b3JrCisqCSBOb3RlIHRoYXQgYXMgc2lkZS1lZmZlY3Qgb2YgdGhlIGhjZl9hY3Rpb24gY2FsbCwgdGhlIHJlbWFpbmRlciBvZiBSeCByZWxhdGVkIGluZm8gaXMgcmUtaW5pdGlhbGl6ZWQgYXMKKyoJIHdlbGwuCisqNDoJSW4gY2FzZSBvZiBEZWZ1bmN0IG1vZGUsIHRoZSBpbmZvcm1hdGlvbiBzdXBwbGllZCBieSBIZXJtZXMgaXMgdW5yZWxpYWJsZSwgc28gdGhlIGJvZHkgb2YKKyoJaGNmX3NlcnZpY2VfbmljIGlzIHNraXBwZWQuIFNpbmNlIGhjZl9jbnRsIHR1cm5zIGludG8gYSBOT1AgaWYgUHJpbWFyeSBvciBTdGF0aW9uIEYvVyBpcyBpbmNvbXBhdGlibGUsCisqCWhjZl9zZXJ2aWNlX25pYyBpcyBhbHNvIHNraXBwZWQgaW4gdGhvc2UgY2FzZXMuCisqCVRvIHByZXZlbnQgdGhhdCBoY2Zfc2VydmljZV9uaWMgcmVwb3J0cyBib2d1cyBpbmZvcm1hdGlvbiB0byB0aGUgTVNGIHdpdGggYWxsIC0gcG9zc2libHkgZGlmZmljdWx0IHRvCisqCWRlYnVnIC0gdW5kZXNpcmFibGUgc2lkZSBlZmZlY3RzLCBpdCBpcyBwYXJhbW91bnQgdG8gY2hlY2sgdGhlIE5JQyBwcmVzZW5jZS4gSW4gZm9ybWVyIGRheXMgdGhlIHByZXNlbmNlCisqCXRlc3Qgd2FzIGJhc2VkIG9uIHRoZSBIZXJtZXMgcmVnaXN0ZXIgSFJFR19TV18wLiBTaW5jZSBpbiBIQ0ZfQUNUX0lOVF9PRkYgaXMgY2hvb3NlbiBmb3Igc3RyYXRlZ3kgYmFzZWQgb24KKyoJSFJFR19FVl9TVEFULCB0aGlzIGlzIG5vdyBhbHNvIHVzZWQgaW4gaGNmX3NlcnZpY2VfbmljLiBUaGUgbW90aXZhdGlvbiB0byBjaGFuZ2Ugc3RyYXRlZ3kgaXMgcGFydGx5CisqCWR1ZSB0byBpbmNvbnNpc3RlbnQgRi9XIGltcGxlbWVudGF0aW9ucyB3aXRoIHJlc3BlY3QgdG8gSFJFR19TV18wIG1hbmlwdWxhdGlvbiBhcm91bmQgcmVzZXQgYW5kIGRvd25sb2FkLgorKglOb3RlIHRoYXQgaW4gcG9sbGVkIGVudmlyb25tZW50cyBDYXJkIFJlbW92YWwgaXMgbm90IGRldGVjdGVkIGJ5IElOVF9PRkYgd2hpY2ggbWFrZXMgdGhlIGNoZWNrIGluCisqCWhjZl9zZXJ2aWNlX25pYyBldmVuIG1vcmUgaW1wb3J0YW50LgorKjg6CVRoZSBldmVudCBzdGF0dXMgcmVnaXN0ZXIgb2YgdGhlIEhlcm1lcyBpcyBzYW1wbGVkCisqCVRoZSBhc3NlcnQgY2hlY2tzIGZvciB1bmV4cGVjdGVkIGV2ZW50cyA7Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Py4KKyoJIC0gSFJFR19FVl9JTkZPX0RST1AgaXMgZXhwbGljaXRseSBleGNsdWRlZCBmcm9tIHRoZSBhY2NlcHRhYmxlIEhSRUdfRVZfU1RBVCBiaXRzIGJlY2F1c2UgaXQgaW5kaWNhdGVzCisqCSAgIGEgdG9vIGhlYXZpbHkgbG9hZGVkIHN5c3RlbS4KKyoJIC0gSFJFR19FVl9BQ0tfUkVHX1JFQURZIGlzIDB4MDAwMCBmb3IgSC1JIChhbmQgaG9wZWZ1bGx5IEgtSUkuNSkKKyoKKyoKKyoJSFJFR19FVl9UWF9FWEMgaXMgYWNjZXB0ZWQgKHZpYSBIUkVHX0VWX1RYX0VYVCkgaWYgYW5kIG9ubHkgaWYgSENGX0VYVF9JTlRfVFhfRVggc2V0IGluIHRoZSBIQ0ZfRVhUCisqCWRlZmluaXRpb24gYXQgY29tcGlsZSB0aW1lLgorKglUaGUgZm9sbG93aW5nIGFjdGl2aXRpZXMgYXJlIGhhbmRsZWQ6CisqCSAtCUFsbG9jIGV2ZW50cyBhcmUgaGFuZGxlZCBieSBoY2Zfc2VuZF9tc2cgKGFuZCBub3RpZnkpLiBPbmx5IGlmIHRoZXJlIGlzIG5vICJzcGFyZSIgcmVzb3VyY2UsIHRoZQorKgkJYWxsb2MgZXZlbnQgaXMgc3VwZXJmaWNpYWxseSBzZXJ2aWNlZCBieSBoY2Zfc2VydmljZV9uaWMgdG8gY3JlYXRlIGEgcHNldWRvLXJlc291cmNlIHdpdGggdmFsdWUKKyoJCTB4MDAxLiBUaGlzIHZhbHVlIGlzIHJlY29nbml6ZWQgYnkgZ2V0X2ZpZCAoY2FsbGVkIGJ5IGhjZl9zZW5kX21zZyBhbmQgbm90aWZ5KSB3aGVyZSB0aGUgcmVhbAorKgkJVHhGaWQgaXMgcmV0cmlldmVkIGFuZCB0aGUgSGVybWVzIGlzIGFja2VkIGFuZCAtIGhvcGVmdWxseSAtIHRoZSAibm9ybWFsIiBjYXNlIHdpdGggYSBzcGFyZSBUeEZpZAorKgkJaW4gSUZCX1JzY0luZCBpcyByZXN0b3JlZC4KKyoJIC0JSW5mbyBkcm9wIGV2ZW50cyBhcmUgaGFuZGxlZCBieSBpbmNyZW1lbnRpbmcgYSB0YWxseQorKgkgLQlMaW5rRXZlbnQgKGluY2x1ZGluZyBzb2xpY2l0ZWQgYW5kIHVuc29saWNpdGVkIHRhbGxpZXMpIGFyZSBoYW5kbGVkIGJ5IHByb2NlZHVyZSBpc3JfaW5mby4KKyoJLQlUeEV4IChpZiBzZWxlY3RlZCBhdCBjb21waWxlIHRpbWUpIGlzIGhhbmRsZWQgYnkgY29weWluZyB0aGUgc2lnbmlmaWNhbnQgcGFydCBvZiB0aGUgVHhGUworKgkJaW50byB0aGUgSUZCIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcgYnkgdGhlIE1TRi4KKyoJCU5vdGUgdGhlIGNvbXBsaWNhdGlvbiBvZiB0aGUgemVyby1GSUQgcHJvdGVjdGlvbiBzdWItc2NoZW1lIGluIERBV0EuCisqCU5vdGUsIHRoZSBBY2sgb2YgYWxsIG9mIGFib3ZlIGV2ZW50cyBpcyBoYW5kbGVkIGF0IHRoZSBlbmQgb2YgaGNmX3NlcnZpY2VfbmljCisqMTY6IEluIGNhc2Ugb2YgIG5vbi1ETUEgKCBlaXRoZXIgbm90IGNvbXBpbGVkIGluIG9yIGR1ZSB0byBhIHJ1bi10aW1lIGNob2ljZSk6CisqCUlmIGFuIFJ4LWZyYW1lIGlzIGF2YWlsYWJsZSwgZmlyc3QgdGhlIEZJRCBvZiB0aGF0IGZyYW1lIGlzIHJlYWQsIGluY2x1ZGluZyB0aGUgY29tcGxpY2F0aW9uIG9mIHRoZQorKgl6ZXJvLUZJRCBwcm90ZWN0aW9uIHN1Yi1zY2hlbWUgaW4gREFXQS4gTm90ZSB0aGF0IHN1Y2ggYSB6ZXJvLUZJRCBpcyBhY2tub3dsZWRnZWQgYXQgdGhlIGVuZCBvZgorKgloY2Zfc2VydmljZV9uaWMgYW5kIHRoYXQgdGhpcyBkZXBlbmRzIG9uIHRoZSBJRkJfUnhMZW4gaW5pdGlhbGl6YXRpb24gaW4gdGhlIGJlZ2luIG9mIGhjZl9zZXJ2aWNlX25pYy4KKyoJVGhlIEFzc2VydCB2YWxpZGF0ZXMgdGhlIEhDRiBhc3N1bXB0aW9uIGFib3V0IEhlcm1lcyBpbXBsZW1lbnRhdGlvbiB1cG9uIHdoaWNoIHRoZSByYW5nZSBvZgorKglQc2V1ZG8tUklEcyBpcyBiYXNlZC4KKyoJVGhlbiB0aGUgY29udHJvbCBmaWVsZHMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSA4MDIuMyBmcmFtZSBhcmUgcmVhZCBmcm9tIHRoZSBOSUMgaW50byB0aGUgbG9va2FoZWFkIGJ1ZmZlci4KKyoJVGhlIHN0YXR1cyBmaWVsZCBpcyBjb252ZXJ0ZWQgdG8gbmF0aXZlIEVuZGlhbmVzcy4KKyoJVGhlIGxlbmd0aCBpcywgYWZ0ZXIgaW1wbGljaXQgRW5kaWFuZXNzIGNvbnZlcnNpb24gaWYgbmVlZGVkLCBhbmQgYWRqdXN0bWVudCBmb3IgdGhlIDE0IGJ5dGVzIG9mIHRoZQorKgk4MDIuMyBNQUMgaGVhZGVyLCBzdG9yZWQgaW4gSUZCX1J4TGVuLgorKglJbiBNQUMgTW9uaXRvciBtb2RlLCA4MDIuMTEgY29udHJvbCBmcmFtZXMgd2l0aCBhIFRPVEFMIGxlbmd0aCBvZiAxNCBhcmUgcmVjZWl2ZWQsIHNvIHdpdGhvdXQgdGhpcworKglsZW5ndGggYWRqdXN0bWVudCwgSUZCX1J4TGVuIGNvdWxkIG5vdCBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIHRoZXNlIGZyYW1lcyBmcm9tICJubyBmcmFtZSIuCisqCU5vIE1JQyBjYWxjdWxhdGlvbiBwcm9jZXNzZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVhZGluZyBvZiB0aGVzZSBDb250cm9sIGZpZWxkcy4KKyoyNjogVGhpcyBsZW5ndGggdGVzdCBmZWVscyBsaWtlIHN1cGVyZmx1b3VzIHJvYnVzdG5lc3MgYWdhaW5zdCBtYWxmb3JtZWQgZnJhbWVzLCBidXQgaXQgdHVybmVkIG91dCB0byBiZQorKgluZWVkZWQgaW4gdGhlIHJlYWwgKGhvc3RpbGUpIHdvcmxkLgorKglUaGUgZGVjYXBzdWxhdGlvbiBjaGVjayBuZWVkcyBzdWZmaWNpZW50IGRhdGEgdG8gcmVwcmVzZW50IERBLCBTQSwgTCwgU05BUCBhbmQgVHlwZSB3aGljaCBhbW91bnRzIHRvCisqCTIyIGJ5dGVzLiBJbiBNQUMgTW9uaXRvciBtb2RlLCA4MDIuMTEgY29udHJvbCBmcmFtZXMgd2l0aCBhIHNtYWxsZXIgbGVuZ3RoIGFyZSByZWNlaXZlZC4gVG8gcHJldmVudAorKgl0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBnb2VzIGhheXdpcmUsIGEgY2hlY2sgb24gdGhlIGxlbmd0aCBpcyBuZWVkZWQuCisqCVRoZSBhY3R1YWwgZGVjYXBzdWxhdGlvbiB0YWtlcyBwbGFjZSBvbiB0aGUgZmx5IGluIHRoZSBjb3B5aW5nIHByb2Nlc3MgYnkgb3ZlcndyaXRpbmcgdGhlIFNOQVAgaGVhZGVyLgorKglOb3RlIHRoYXQgaW4gY2FzZSBvZiBkZWNhcHN1bGF0aW9uIHRoZSBTTkFQIGhlYWRlciBpcyBub3QgcGFzc2VkIHRvIHRoZSBNU0YsIGhlbmNlIElGQl9SeExlbiBtdXN0IGJlCisqCWNvbXBlbnNhdGVkIGZvciB0aGUgU05BUCBoZWFkZXIgbGVuZ3RoLgorKglUaGUgMjIgYnl0ZXMgbmVlZGVkIGZvciBkZWNhcHN1bGF0aW9uIGFyZSAobW9yZSB0aGFuKSBzdWZmaWNpZW50IGZvciB0aGUgZXhjZXB0aW9uYWwgaGFuZGxpbmcgb2YgdGhlCisqCU1JQyBhbGdvcml0aG0gb2YgdGhlIEwtZmllbGQgKHJlcGxhY2luZyB0aGUgMiBieXRlIEwtZmllbGQgd2l0aCA0IDB4MDAgYnl0ZXMpLgorKjMwOiBUaGUgMTIgaW4gdGhlIG5vLVNTTiBicmFuY2ggY29ycmVzcG9uZHMgd2l0aCB0aGUgZ2V0X2ZyYWcsIHRoZSAyIHdpdGggdGhlIElQVyBvZiB0aGUgU1NOIGJyYW5jaAorKjMyOiBJZiBIZXJtZXMgcmVwb3J0ZWQgTUlDLXByZXNlbmNlLCB0aGFuIHRoZSBNSUMgZW5naW5lIGlzIGluaXRpYWxpemVkIHdpdGggdGhlIG5vbi1kdW1teSBNSUMgY2FsY3VsYXRpb24KKyoJcm91dGluZSBhZGRyZXNzIGFuZCBhcHByb3ByaWF0ZSBrZXkuCisqMzQ6IFRoZSA4IGJ5dGVzIGFmdGVyIHRoZSBEQSwgU0EsIEwgYXJlIHJlYWQgYW5kIGl0IGlzIGNoZWNrZWQgd2hldGhlciBkZWNhcHN1bGF0aW9uIGlzIG5lZWRlZCBpLmUuOgorKgkgIC0gdGhlIEhlcm1lcyByZXBvcnRlZCBUdW5uZWwgZW5jYXBzdWxhdGlvbiBvcgorKgkgIC0gdGhlIEhlcm1lcyByZXBvcnRlZCAxMDQyIEVuY2Fwc3VsYXRpb24gYW5kIGhjZl9lbmNhcCByZXBvcnRzIHRoYXQgdGhlIEhDRiB3b3VsZCBub3QgaGF2ZSB1c2VkCisqCQkxMDQyIGFzIHRoZSBlbmNhcHN1bGF0aW9uIG1lY2hhbmlzbQorKglOb3RlIHRoYXQgdGhlIGZpcnN0IGZpZWxkIG9mIHRoZSBSeEZTIGluIGJ1ZnAgaGFzIE5hdGl2ZSBFbmRpYW5lc3MgZHVlIHRvIHRoZSBjb252ZXJzaW9uIGRvbmUgYnkgdGhlCisqCUJFX1BBUiBpbiBnZXRfZnJhZy4KKyozNjogVGhlIFR5cGUgZmllbGQgaXMgdGhlIG9ubHkgd29yZCBrZXB0IChhZnRlciBtb3ZpbmcpIG9mIHRoZSBqdXN0IHJlYWQgOCBieXRlcywgaXQgaXMgbW92ZWQgdG8gdGhlCisqCUwtZmllbGQuICBUaGUgb3JpZ2luYWwgTC1maWVsZCBhbmQgNiBieXRlIFNOQVAgaGVhZGVyIGFyZSBkaXNjYXJkZWQsIHNvIElGQl9SeExlbiBhbmQgYnVmX2FkZHIgbXVzdAorKgliZSBhZGp1c3RlZCBieSA4LgorKjQwOiBEZXRlcm1pbmUgaG93IG11Y2ggb2YgdGhlIGZyYW1lIChzdGFydGluZyB3aXRoIERBKSBmaXRzIGluIHRoZSBMb29rYWhlYWQgYnVmZmVyLCB0aGVuIHJlYWQgdGhlIG5vdC15ZXQKKyoJcmVhZCBkYXRhIGludG8gdGhlIGxvb2thaGVhZCBidWZmZXIuCisqCUlmIHRoZSBsb29rYWhlYWQgYnVmZmVyIGNvbnRhaW5zIHRoZSBjb21wbGV0ZSBtZXNzYWdlLCBjaGVjayB0aGUgTUlDLiBUaGUgbWFqb3JpdHkgY29uc2lkZXJlZCB0aGlzCisqCUkvRiBtb3JlIGFwcHJvcHJpYXRlIHRoZW4gaGF2ZSB0aGUgTVNGIGNhbGwgaGNmX2dldF9kYXRhIG9ubHkgdG8gY2hlY2sgdGhlIE1JQy4KKyo0NDogU2luY2UgdGhlIGNvbXBsZXRlIG1lc3NhZ2UgaXMgY29waWVkIGZyb20gTklDIFJBTSB0byBQQyBSQU0sIHRoZSBSeCBjYW4gYmUgYWNrbm93bGVkZ2VkIHRvIHRoZSBIZXJtZXMKKyoJdG8gb3B0aW1pemUgdGhlIGZsb3cgKCBhIGJldHRlciBjaGFuY2UgdG8gZ2V0IG5ldyBSeCBkYXRhIGluIHRoZSBuZXh0IHBhc3MgdGhyb3VnaCBoY2Zfc2VydmljZV9uaWMgKS4KKyoJVGhpcyBhY2tub3dsZWRnZW1lbnQgY2FuIG5vdCBiZSBkb25lIHZpYSBoY2ZfYWN0aW9uKCBIQ0ZfQUNUX1JYX0FDSyApIGJlY2F1c2UgdGhpcyBhbHNvIGNsZWFycworKglJRkJfUnhMRU4gdGh1cyBjb3JydXB0aW5nIHRoZSBJL0YgdG8gdGhlIE1TRi4KKyo7PzogSW4gY2FzZSBvZiBETUEgKGNvbXBpbGVkIGluIGFuZCBhY3RpdmF0ZWQpOgorCisKKyo1NDogTGltaXRpbmcgdGhlIG51bWJlciBvZiBwbGFjZXMgd2hlcmUgdGhlIEYvVyBpcyBhY2tlZCAoZS5nLiB0aGUgbWVyZ2luZyBvZiB0aGUgUngtQUNLIHdpdGggdGhlIG90aGVyCisqCUFDS3MpLCBpcyBzdXBwb3NlZCB0byBkaW1pbmlzaCB0aGUgcG90ZW50aWFsIG9mIHJhY2UgY29uZGl0aW9ucyBpbiB0aGUgRi9XLgorKglOb3RlIDE6IFRoZSBDTUQgZXZlbnQgaXMgYWNrbm93bGVkZ2VkIGluIGNtZF9jbXBsCisqCU5vdGUgMjogSFJFR19FVl9BQ0tfUkVHX1JFQURZIGlzIDB4MDAwMCBmb3IgSC1JIChhbmQgaG9wZWZ1bGx5IEgtSUkuNSkKKyoJTm90ZSAzOiBUaGUgQUxMT0MgZXZlbnQgaXMgYWNrbm93bGVkZ2VkIGluIGdldF9maWQgKGV4Y2VwdCBmb3IgdGhlIGluaXRpYWxpemF0aW9uIGZsb3cpCisqCisqLk5PVElDRQorKiBUaGUgTm9uLURNQSBIUkVHX0VWX1JYIGlzIGhhbmRsZWQgZGlmZmVyZW50IGNvbXBhcmVkIHdpdGggdGhlIG90aGVyIEYvVyBldmVudHMuCisqIFRoZSBIUkVHX0VWX1JYIGV2ZW50IGlzIGFja25vd2xlZGdlZCBieSB0aGUgZmlyc3QgaGNmX3NlcnZpY2VfbmljIGNhbGwgYWZ0ZXIgdGhlCisqIGhjZl9zZXJ2aWNlX25pYyBjYWxsIHRoYXQgcmVwb3J0ZWQgdGhlIG9jY3VycmVuY2Ugb2YgdGhpcyBldmVudC4KKyogVGhpcyBhY2tub3dsZWRnbWVudAorKiBtYWtlcyB0aGUgbmV4dCBSZWNlaXZlIEZyYW1lIFN0cnVjdHVyZSAoaWYgYW55KSBhdmFpbGFibGUuCisqIEFuIHVwZGF0ZWQgSUZCX1J4TGVuCisqIGZpZWxkIHJlZmxlY3RzIHRoaXMgYXZhaWxhYmlsaXR5LgorKgorKi5OT1RJQ0UKKyogVGhlIG1pbmltdW0gc2l6ZSBmb3IgTGVuIG11c3Qgc3VwcGx5IHNwYWNlIGZvcjoKKyogLQlhbiBGL1cgZGVwZW5kZW50IG51bWJlciBvZiBieXRlcyBvZiBDb250cm9sIEluZm8gZmllbGQgaW5jbHVkaW5nIHRoZSA4MDIuMTEgSGVhZGVyIGZpZWxkCisqIC0JRGVzdGluYXRpb24gQWRkcmVzcworKiAtCVNvdXJjZSBBZGRyZXNzCisqIC0JTGVuZ3RoIGZpZWxkCisqIC0JWyBTTkFQIEhlYWRlcl0KKyogLQlbIEV0aGVybmV0LUlJIFR5cGVdCisqIFRoaXMgcmVzdWx0cyBpbiA2OCBmb3IgSGVybWVzLUkgYW5kIDgwIGZvciBIZXJtZXMtSUkKKyogVGhpcyB3YXkgdGhlIG1pbmltdW0gYW1vdW50IG9mIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBuZWVkZWQgYnkgdGhlIEhDRiB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZnJhbWUKKyogbXVzdCBiZSBkZWNhcHN1bGF0ZWQuCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CitoY2Zfc2VydmljZV9uaWMoIElGQlAgaWZicCwgd2NpX2J1ZnAgYnVmcCwgdW5zaWduZWQgaW50IGxlbiApCit7CisKK2ludAkJCXJjID0gSENGX1NVQ0NFU1M7CitoY2ZfMTYJCXN0YXQ7Cit3Y2lfYnVmcAlidWZfYWRkcjsKK2hjZl8xNiAJCWk7CisKKwlIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX1NFUlZJQ0VfTklDLCBpZmJwLT5JRkJfSW50T2ZmQ250ICkKKwlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApCisJSENGQVNTRVJUX0lOVAorCisJaWZicC0+SUZCX0xpbmtTdGF0ID0gMDsgLy8gOz8gdG8gYmUgb2Jzb2xldGVkIEFTQVAJCQkJCQkJCQkJCQkvKiAxKi8KKwlpZmJwLT5JRkJfRFNMaW5rU3RhdCAmPSB+Q0ZHX0xJTktfU1RBVF9DSEFOR0U7CQkJCQkJCQkJCQkJCS8qIDEqLworCSh2b2lkKWhjZl9hY3Rpb24oIGlmYnAsIEhDRl9BQ1RfUlhfQUNLICk7CQkJCQkJCQkJCQkJCQkvKiAyKi8KKwlpZiAoIGlmYnAtPklGQl9DYXJkU3RhdCA9PSAwICYmICggc3RhdCA9IElQVyggSFJFR19FVl9TVEFUICkgKSAhPSAweEZGRkYgKSB7CQkJCQkvKiA0Ki8KKy8qCQlJRl9OT1RfRE1BKCBIQ0ZBU1NFUlQoICEoIHN0YXQgJiB+SFJFR19FVl9CQVNJQ19NQVNLLCBzdGF0ICkgKQorICoJCUlGX05PVF9VU0VfRE1BKCBIQ0ZBU1NFUlQoICEoIHN0YXQgJiB+SFJFR19FVl9CQVNJQ19NQVNLLCBzdGF0ICkgKQorICoJCUlGX1VTRV9ETUEoIEhDRkFTU0VSVCggISggc3RhdCAmIH4oIEhSRUdfRVZfQkFTSUNfTUFTSyBeICggSFJFR19FVl8uLi5ETUEuLi4uICksIHN0YXQgKSApCisgKi8KKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvKiA4Ki8KKwkJaWYgKCBpZmJwLT5JRkJfUnNjSW5kID09IDAgJiYgc3RhdCAmIEhSRUdfRVZfQUxMT0MgKSB7IC8vTm90ZTogSUZCX1JzY0luZCBpcyBBTFdBWVMgMSBmb3IgRE1BCisJCQlpZmJwLT5JRkJfUnNjSW5kID0gMTsKKwkJfQorCQlJRl9UQUxMWSggaWYgKCBzdGF0ICYgSFJFR19FVl9JTkZPX0RST1AgKSBpZmJwLT5JRkJfSENGX1RhbGxpZXMuTm9CdWZJbmZvKys7ICkKKyNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX0lOVF9USUNLCisJCWlmICggc3RhdCAmIEhSRUdfRVZfVElDSyApIHsKKwkJCWlmYnAtPklGQl9UaWNrQ250Kys7CisJCX0KKyNpZiAwIC8vIChIQ0ZfU0xFRVApICYgSENGX0REUworCQlpZiAoIGlmYnAtPklGQl9UaWNrQ250ID09IDMgJiYgKCBpZmJwLT5JRkJfRFNMaW5rU3RhdCAmIENGR19MSU5LX1NUQVRfQ09OTkVDVEVEICkgPT0gMCApIHsKK0NGR19ERFNfVElDS19USU1FX1NUUkNUIGx0djsKKwkJCS8vIDIgc2Vjb25kIHBlcmlvZCAod2l0aCAxIHRpY2sgdW5jZXJ0YW50eSkgaW4gbm90LWNvbm5lY3RlZCBtb2RlIC0tPmdvIGludG8gRFNfT09SCisJCQloY2ZfYWN0aW9uKCBpZmJwLCBIQ0ZfQUNUX1NMRUVQICk7CisJCQlpZmJwLT5JRkJfRFNMaW5rU3RhdCB8PSBDRkdfTElOS19TVEFUX0RTX09PUjsgLy9zZXQgT3V0T2ZSYW5nZQorCQkJbHR2LmxlbiA9IDI7CisJCQlsdHYudHlwID0gQ0ZHX0REU19USUNLX1RJTUU7CisJCQlsdHYudGlja190aW1lID0gKCAoIGlmYnAtPklGQl9EU0xpbmtTdGF0ICYgQ0ZHX0xJTktfU1RBVF9USU1FUiApICsgMHgxMCApICo2NDsgLy83OCBpcyBtb3JlIHJpZ2h0CisJCQloY2ZfcHV0X2luZm8oIGlmYnAsIChMVFZQKSZsdHYgKTsKKwkJCXByaW50ayggIjw1PlByZXBhcmluZyBmb3Igc2xlZXAsIGxpbmtfc3RhdHVzOiAlMDRYLCB0aW1lciA6ICVkXG4iLAorCQkJCQlpZmJwLT5JRkJfRFNMaW5rU3RhdCwgbHR2LnRpY2tfdGltZSApOy8vOz9yZW1vdmUgbWUgMSBkYXkKKwkJCWlmYnAtPklGQl9UaWNrQ250Kys7IC8vOz9qdXN0IHRvIG1ha2Ugc3VyZSB3ZSBkbyBub3Qga2VlcCBvbiBwcmludGluZyBhYm92ZSBtZXNzYWdlCisJCQlpZiAoIGx0di50aWNrX3RpbWUgPCAzMDAgKiAxMjUgKSBpZmJwLT5JRkJfRFNMaW5rU3RhdCArPSAweDAwMTA7CisKKwkJfQorI2VuZGlmIC8vIEhDRl9ERFMKKyNlbmRpZiAvLyBIQ0ZfRVhUX0lOVF9USUNLCisJCWlmICggc3RhdCAmIEhSRUdfRVZfSU5GTyApIHsKKwkJCWlzcl9pbmZvKCBpZmJwICk7CisJCX0KKyNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX0lOVF9UWF9FWAorCQlpZiAoIHN0YXQgJiBIUkVHX0VWX1RYX0VYVCAmJiAoIGkgPSBJUFcoIEhSRUdfVFhfQ09NUExfRklEICkgKSAhPSAwIC8qREFXQSovICkgeworCQkJREFXQV9aRVJPX0ZJRCggSFJFR19UWF9DT01QTF9GSUQgKQorCQkJKHZvaWQpc2V0dXBfYmFwKCBpZmJwLCBpLCAwLCBJT19JTiApOworCQkJZ2V0X2ZyYWcoIGlmYnAsICZpZmJwLT5JRkJfVHhGc1N0YXQsIEhGU19TV1NVUCBCRV9QQVIoMSkgKTsKKwkJfQorI2VuZGlmIC8vIEhDRl9FWFRfSU5UX1RYX0VYCisvLyFybGF2IERNQSBlbmdpbmUgd2lsbCBoYW5kbGUgdGhlIHJ4IGV2ZW50LCBub3QgdGhlIGRyaXZlcgorI2lmIEhDRl9ETUEKKwkJaWYgKCAhKCBpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEgKSApIC8vISEgYmUgYXdhcmUgb2YgdGhlIGxvZ2ljYWwgaW5kZW50YXRpb25zCisjZW5kaWYgLy8gSENGX0RNQQorLyoxNiovCSAgaWYgKCBzdGF0ICYgSFJFR19FVl9SWCAmJiAoIGlmYnAtPklGQl9SeEZJRCA9IElQVyggSFJFR19SWF9GSUQgKSApICE9IDAgKSB7IC8vaWYgMCB0aGVuIERBV0FfQUNLCisJCQlIQ0ZBU1NFUlQoIGJ1ZnAsIGxlbiApCisJCQlIQ0ZBU1NFUlQoIGxlbiA+PSBIRlNfREFUICsgMiwgbGVuICkKKwkJCURBV0FfWkVST19GSUQoIEhSRUdfUlhfRklEICkKKwkJCUhDRkFTU0VSVCggaWZicC0+SUZCX1J4RklEIDwgQ0ZHX1BST0RfREFUQSwgaWZicC0+SUZCX1J4RklEKQorCQkJKHZvaWQpc2V0dXBfYmFwKCBpZmJwLCBpZmJwLT5JRkJfUnhGSUQsIDAsIElPX0lOICk7CisJCQlnZXRfZnJhZyggaWZicCwgYnVmcCwgSEZTX0FERFJfREVTVCBCRV9QQVIoMSkgKTsKKwkJCWlmYnAtPklGQl9sYXAgPSBidWZfYWRkciA9IGJ1ZnAgKyBIRlNfQUREUl9ERVNUOworCQkJaWZicC0+SUZCX1J4TGVuID0gKGhjZl8xNikoYnVmcFtIRlNfREFUX0xFTl0gKyAoYnVmcFtIRlNfREFUX0xFTisxXTw8OCkgKyAyKjYgKyAyKTsKKy8qMjYqLwkJaWYgKCBpZmJwLT5JRkJfUnhMZW4gPj0gMjIgKSB7CQkvLyBjb252ZW5pZW50IGZvciBNSUMgY2FsY3VsYXRpb24gKDUgRFdzICsgMSAic2tpcHBlZCIgVykKKwkJCQkJCQkJCQkJCS8vLiAgZ2V0IERBLFNBLExlbi9UeXBlIGFuZCAoU05BUCxUeXBlIG9yIDggZGF0YSBieXRlcykKKy8qMzAqLwkJCWdldF9mcmFnKCBpZmJwLCBidWZfYWRkciwgMjIgQkVfUEFSKDApICk7CisvKjMyKi8JCQlDQUxDX1JYX01JQyggYnVmcCwgLTEgKTsJCS8vLiAgaW5pdGlhbGl6ZSBNSUMKKwkJCQlDQUxDX1JYX01JQyggYnVmX2FkZHIsIEhDRl9EQVNBX1NJWkUgKTsJLy8uICBNSUMgb3ZlciBEQSwgU0EKKwkJCQlDQUxDX1JYX01JQyggbnVsbF9hZGRyLCA0ICk7CS8vLiAgTUlDIG92ZXIgKHZpcnR1YWwpIHByaW9yaXR5IGZpZWxkCisJCQkJQ0FMQ19SWF9NSUMoIGJ1Zl9hZGRyKzE0LCA4ICk7CS8vLiAgc2tpcCBMZW4sIE1JQyBvdmVyIFNOQVAsVHlwZSBvciA4IGRhdGEgYnl0ZXMpCisJCQkJYnVmX2FkZHIgKz0gMjI7CisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0NDWAorLy8hIWJlIGNhcmVmdWwgZG8gbm90IHVzZSBwb3NpdGl2ZSB0ZXN0IG9uIEhDRl9BQ1RfQ0NYX09GRiwgYmVjYXVzZSBJRkJfQ0tJUFN0YXQgaXMgaW5pdGlhbGx5IDAKKwkJCQlpZiggaWZicC0+SUZCX0NLSVBTdGF0ICE9IEhDRl9BQ1RfQ0NYX09OICApCisjZW5kaWYgLy8gSENGX1RZUEVfQ0NYCisJCQkJeworI2lmIChIQ0ZfRU5DQVApID09IEhDRl9FTkMKKwkJCQkJSENGQVNTRVJUKCBsZW4gPj0gSEZTX0RBVCArIDIgKyBzaXplb2Yoc25hcF9oZWFkZXIpLCBsZW4gKQorLyozNCovIAkJCQlpID0gKih3Y2lfcmVjb3JkcCkmYnVmcFtIRlNfU1RBVF0gJiAoIEhGU19TVEFUX01TR19UWVBFIHwgSEZTX1NUQVRfRVJSICk7CisJCQkJCWlmICggaSA9PSBIRlNfU1RBVF9UVU5ORUwgfHwKKwkJCQkJCSAoIGkgPT0gSEZTX1NUQVRfMTA0MiAmJiBoY2ZfZW5jYXAoICh3Y2lfYnVmcCkmYnVmcFtIRlNfVFlQRV0gKSAhPSBFTkNfVFVOTkVMICkgKSB7CisJCQkJCQkJCQkJCQkvLy4gIGNvcHkgRS1JSSBUeXBlIHRvIDgwMi4zIExFTiBmaWVsZAorLyozNiovCQkJCQlidWZwW0hGU19MRU4gIF0gPSBidWZwW0hGU19UWVBFICBdOworCQkJCQkJYnVmcFtIRlNfTEVOKzFdID0gYnVmcFtIRlNfVFlQRSsxXTsKKwkJCQkJCQkJCQkJCS8vLiAgZGlzY2FyZCBTbmFwIGJ5IG92ZXJ3cml0aW5nIHdpdGggZGF0YQorCQkJCQkJaWZicC0+SUZCX1J4TGVuIC09IChIRlNfVFlQRSAtIEhGU19MRU4pOworCQkJCQkJYnVmX2FkZHIgLT0gKCBIRlNfVFlQRSAtIEhGU19MRU4gKTsgLy8gdGhpcyBoYXBwZW5zIHRvIGJyaW5nIHVzIGF0IGEgRFcgYm91bmRhcnkgb2YgMzYKKwkJCQkJfQorI2VuZGlmIC8vIEhDRl9FTkMKKwkJCQl9CisJCQl9CisvKjQwKi8JCWlmYnAtPklGQl9sYWwgPSBtaW4oIChoY2ZfMTYpKGxlbiAtIEhGU19BRERSX0RFU1QpLCBpZmJwLT5JRkJfUnhMZW4gKTsKKwkJCWkgPSBpZmJwLT5JRkJfbGFsIC0gKCBidWZfYWRkciAtICggYnVmcCArIEhGU19BRERSX0RFU1QgKSApOworCQkJZ2V0X2ZyYWcoIGlmYnAsIGJ1Zl9hZGRyLCBpIEJFX1BBUigwKSApOworCQkJQ0FMQ19SWF9NSUMoIGJ1Zl9hZGRyLCBpICk7CisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQorCQkJaWYgKCBpZmJwLT5JRkJfbGFsID09IGlmYnAtPklGQl9SeExlbiApIHsKKwkJCQlyYyA9IGNoZWNrX21pYyggaWZicCApOworCQkJfQorI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQorLyo0NCovCQlpZiAoIGxlbiAtIEhGU19BRERSX0RFU1QgPj0gaWZicC0+SUZCX1J4TGVuICkgeworCQkJCWlmYnAtPklGQl9SeEZJRCA9IDA7CisJCQl9IGVsc2UgeyAvKiBJRkJfUnhGSUQgaXMgY2xlYXJlZCwgc28gIHlvdSBkbyBub3QgZ2V0IGFub3RoZXIgUnhfQWNrIGF0IG5leHQgZW50cnkgb2YgaGNmX3NlcnZpY2VfbmljICovCisJCQkJc3RhdCAmPSAoaGNmXzE2KX5IUkVHX0VWX1JYOwkvL2Rvbid0IGFjayBSeCBpZiBwcm9jZXNzaW5nIG5vdCB5ZXQgY29tcGxldGVkCisJCQl9CisJCX0KKwkJLy8gaW4gY2FzZSBvZiBETUE6IHNpZ25hbCBhdmFpbGFiaWxpdHkgb2YgcnggYW5kL29yIHR4IHBhY2tldHMgdG8gTVNGCisJCUlGX1VTRV9ETUEoIGlmYnAtPklGQl9EbWFQYWNrZXRzIHw9IHN0YXQgJiAoIEhSRUdfRVZfUkRNQUQgfCBIUkVHX0VWX1RETUFEICk7ICkKKwkJLy8gcmxhdiA6IHBlbmRpbmcgSFJFR19FVl9SRE1BRCBvciBIUkVHX0VWX1RETUFEIGV2ZW50cyBnZXQgYWNrbm93bGVkZ2VkIGhlcmUuCisvKjU0Ki8Jc3RhdCAmPSAoaGNmXzE2KX4oIEhSRUdfRVZfU0xFRVBfUkVRIHwgSFJFR19FVl9DTUQgfCBIUkVHX0VWX0FDS19SRUdfUkVBRFkgfCBIUkVHX0VWX0FMTE9DIHwgSFJFR19FVl9GV19ETUEgKTsKKy8vYSBwb3NpdGl2ZSBtYXNrIHdvdWxkIGJlIGVhc2llciB0byB1bmRlcnN0YW5kIC8qNTQqLwlzdGF0ICY9IChoY2ZfMTYpfiggSFJFR19FVl9TTEVFUF9SRVEgfCBIUkVHX0VWX0NNRCB8IEhSRUdfRVZfQUNLX1JFR19SRUFEWSB8IEhSRUdfRVZfQUxMT0MgfCBIUkVHX0VWX0ZXX0RNQSApOworCQlJRl9VU0VfRE1BKCBzdGF0ICY9IChoY2ZfMTYpfkhSRUdfRVZfUlg7ICkKKwkJaWYgKCBzdGF0ICkgeworCQkJREFXQV9BQ0soIHN0YXQgKTsJLypEQVdBKi8KKwkJfQorCX0KKwlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfU0VSVklDRV9OSUMgKQorCXJldHVybiByYzsKK30gLy8gaGNmX3NlcnZpY2VfbmljCisjZW5kaWYgLy8gSENGX0RMX09OTFkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKiBIIEMgRiAgIFMgVSBQIFAgTyBSIFQgICBSIE8gVSBUIEkgTiBFIFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5TVUJNT0RVTEUJCXZvaWQgY2FsY19taWMoIGhjZl8zMiogcCwgaGNmXzMyIG0gKQorKi5QVVJQT1NFCQljYWxjdWxhdGUgTUlDIG9uIGEgcXVhZCBieXRlLgorKgorKi5BUkdVTUVOVFMKKyoJcAkJCWFkZHJlc3Mgb2YgdGhlIE1JQworKgltCQkJMzIgYml0IHZhbHVlIHRvIGJlIHByb2Nlc3NlZCBieSB0aGUgTUlDIGNhbGN1bGF0aW9uIGVuZ2luZQorKgorKi5SRVRVUk5TCQlOLkEuCisqCisqLkRFU0NSSVBUSU9OCisqIGNhbGNfbWljIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTUlDIGFsZ29yaXRobS4gSXQgaXMgYSBtb25rZXktc2VlIG1vbmtleS1kbyBjb3B5IG9mCisqIE1pY2hhZWw6OmFwcGVuZEJ5dGUoKQorKiBvZiBBcHBlbmRpeCBDIG9mIC4uLi4uLi4uLi4KKyoKKyoKKyouRElBR1JBTQorKgorKi5OT1RJQ0UKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCisKKyNkZWZpbmUgUk9MMzIoIEEsIG4gKSAoICgoQSkgPDwgKG4pKSB8ICggKChBKT4+KDMyLShuKSkpICAmICggKDFVTCA8PCAobikpIC0gMSApICkgKQorI2RlZmluZSBST1IzMiggQSwgbiApIFJPTDMyKCAoQSksIDMyLShuKSApCisKKyNkZWZpbmUgTAkqcAorI2RlZmluZSBSCSoocCsxKQorCit2b2lkCitjYWxjX21pYyggaGNmXzMyKiBwLCBoY2ZfMzIgbSApCit7CisjaWYgSENGX0JJR19FTkRJQU4KKwltID0gKG0gPj4gMTYpIHwgKG0gPDwgMTYpOworI2VuZGlmIC8vIEhDRl9CSUdfRU5ESUFOCisJTCBePSBtOworCVIgXj0gUk9MMzIoIEwsIDE3ICk7CisJTCArPSBSOworCVIgXj0gKChMICYgMHhmZjAwZmYwMCkgPj4gOCkgfCAoKEwgJiAweDAwZmYwMGZmKSA8PCA4KTsKKwlMICs9IFI7CisJUiBePSBST0wzMiggTCwgMyApOworCUwgKz0gUjsKKwlSIF49IFJPUjMyKCBMLCAyICk7CisJTCArPSBSOworfSAvLyBjYWxjX21pYworI3VuZGVmIFIKKyN1bmRlZiBMCisjZW5kaWYgLy8gSENGX1RZUEVfV1BBCisKKworCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5TVUJNT0RVTEUJCXZvaWQgY2FsY19taWNfcnhfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBwLCBpbnQgbGVuICkKKyouUFVSUE9TRQkJY2FsY3VsYXRlIE1JQyBvbiBhIHNpbmdsZSBmcmFnbWVudC4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKglidWZwCQkoYnl0ZSkgYWRkcmVzcyBvZiBidWZmZXIKKyoJbGVuCQkJbGVuZ3RoIGluIGJ5dGVzIG9mIGJ1ZmZlciBzcGVjaWZpZWQgYnkgYnVmcAorKgorKi5SRVRVUk5TCQlOLkEuCisqCisqLkRFU0NSSVBUSU9OCisqIGNhbGNfbWljX3J4X2ZyYWcgLi4uLi4uLi4KKyoKKyogVGhlIE1JQyBpcyBsb2NhdGVkIGluIHRoZSBJRkIuCisqIFRoZSBNSUMgaXMgc2VwYXJhdGUgZm9yIFR4IGFuZCBSeCwgdGh1cyBhbGxvd2luZyBoY2Zfc2VuZF9tc2cgdG8gb2NjdXIgYmV0d2VlbiBoY2Zfc2VydmljZV9uaWMgYW5kCisqIGhjZl9yY3ZfbXNnLgorKgorKgorKi5ESUFHUkFNCisqCisqLk5PVElDRQorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2NhbGNfbWljX3J4X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgcCwgaW50IGxlbiApCit7CitzdGF0aWMgdW5pb24geyBoY2ZfMzIgeDMyOyBoY2ZfMTYgeDE2WzJdOyBoY2ZfOCB4OFs0XTsgfSB4OwkvLyogYXJlYSB0byBhY2N1bXVsYXRlIDQgYnl0ZXMgaW5wdXQgZm9yIE1JQyBlbmdpbmUKK2ludCBpOworCisJaWYgKCBsZW4gPT0gLTEgKSB7CQkJCQkJCQkvL2luaXRpYWxpemUgTUlDIGhvdXNla2VlcGluZworCQlpID0gKih3Y2lfcmVjb3JkcCkmcFtIRlNfU1RBVF07CisJCS8qIGkgPSBDTlZfU0hPUlRQX1RPX0xJVFRMRSgmcFtIRlNfU1RBVF0pOyBzaG91bGQgbm90IGJlIG5lZWRlIHRvIHByZXZlbnQgYWxpZ25tZW50IHBvcm9ibGVtcworCQkgKiBzaW5jZSBsZW4gPT0gLTEgaWYgYW5kIG9ubHkgaWYgcCBpcyBsb29rYWhhZWFkIGJ1ZmZlciB3aGljaCBNVVNUIGJlIHdvcmQgYWxpZ25lZAorCQkgKiB0byBiZSByZS1pbnZlc3RpZ2F0ZWQgYnkgTnZSCisJCSAqLworCisJCWlmICggKCBpICYgSEZTX1NUQVRfTUlDICkgPT0gMCApIHsKKwkJCWlmYnAtPklGQl9NSUNSeENhcnJ5ID0gMHhGRkZGOwkJCS8vc3VwcHJlc3MgTUlDIGNhbGN1bGF0aW9uCisJCX0gZWxzZSB7CisJCQlpZmJwLT5JRkJfTUlDUnhDYXJyeSA9IDA7CisvLyoJTm90ZSB0aGF0ICJjb2luY2lkZW50YWxseSIgdGhlIGJpdCBwb3NpdGlvbnMgdXNlZCBpbiBIRlNfU1RBVAorLy8qCWNvcnJlc3BvbmQgd2l0aCB0aGUgb2Zmc2V0IG9mIHRoZSBrZXkgaW4gSUZCX01JQ0tleQorCQkJaSA9ICggaSAmIEhGU19TVEFUX01JQ19LRVlfSUQgKSA+PiAxMDsJLyogY29pbmNpZGVudGFsbHkgbm8gc2hpZnQgbmVlZGVkIGZvciBpIGl0c2VsZiAqLworCQkJaWZicC0+SUZCX01JQ1J4WzBdID0gQ05WX0xPTkdfVE9fTElUVExFKGlmYnAtPklGQl9NSUNSeEtleVtpICBdKTsKKwkJCWlmYnAtPklGQl9NSUNSeFsxXSA9IENOVl9MT05HX1RPX0xJVFRMRShpZmJwLT5JRkJfTUlDUnhLZXlbaSsxXSk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIGlmYnAtPklGQl9NSUNSeENhcnJ5ID09IDAgKSB7CisJCQl4LngzMiA9IENOVl9MT05HUF9UT19MSVRUTEUocCk7CisJCQlwICs9IDQ7CisJCQlpZiAoIGxlbiA8IDQgKSB7CisJCQkJaWZicC0+SUZCX01JQ1J4Q2FycnkgPSAoaGNmXzE2KWxlbjsKKwkJCX0gZWxzZSB7CisJCQkJaWZicC0+SUZCX01JQ1J4Q2FycnkgPSA0OworCQkJCWxlbiAtPSA0OworCQkJfQorCQl9IGVsc2Ugd2hpbGUgKCBpZmJwLT5JRkJfTUlDUnhDYXJyeSA8IDQgJiYgbGVuICkgewkJLy9ub3RlIGZvciBoY2ZfMTYgYXBwbGllczogMHhGRkZGID4gNAorCQkJeC54OFtpZmJwLT5JRkJfTUlDUnhDYXJyeSsrXSA9ICpwKys7CisJCQlsZW4tLTsKKwkJfQorCQl3aGlsZSAoIGlmYnAtPklGQl9NSUNSeENhcnJ5ID09IDQgKSB7CS8vY29udHJpdmVkIHNvIHdlIGhhdmUgb25seSAxIGNhbGwgdG8gY2FsY19taWMgc28gd2UgY291bGQgYnJpbmcgaXQgaW4tbGluZQorCQkJY2FsY19taWMoIGlmYnAtPklGQl9NSUNSeCwgeC54MzIgKTsKKwkJCXgueDMyID0gQ05WX0xPTkdQX1RPX0xJVFRMRShwKTsKKwkJCXAgKz0gNDsKKwkJCWlmICggbGVuIDwgNCApIHsKKwkJCQlpZmJwLT5JRkJfTUlDUnhDYXJyeSA9IChoY2ZfMTYpbGVuOworCQkJfQorCQkJbGVuIC09IDQ7CisJCX0KKwl9Cit9IC8vIGNhbGNfbWljX3J4X2ZyYWcKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKKworCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5TVUJNT0RVTEUJCXZvaWQgY2FsY19taWNfdHhfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBwLCBpbnQgbGVuICkKKyouUFVSUE9TRQkJY2FsY3VsYXRlIE1JQyBvbiBhIHNpbmdsZSBmcmFnbWVudC4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKglidWZwCQkoYnl0ZSkgYWRkcmVzcyBvZiBidWZmZXIKKyoJbGVuCQkJbGVuZ3RoIGluIGJ5dGVzIG9mIGJ1ZmZlciBzcGVjaWZpZWQgYnkgYnVmcAorKgorKi5SRVRVUk5TCQlOLkEuCisqCisqLkRFU0NSSVBUSU9OCisqIGNhbGNfbWljX3R4X2ZyYWcgLi4uLi4uLi4KKyoKKyogVGhlIE1JQyBpcyBsb2NhdGVkIGluIHRoZSBJRkIuCisqIFRoZSBNSUMgaXMgc2VwYXJhdGUgZm9yIFR4IGFuZCBSeCwgdGh1cyBhbGxvd2luZyBoY2Zfc2VuZF9tc2cgdG8gb2NjdXIgYmV0d2VlbiBoY2Zfc2VydmljZV9uaWMgYW5kCisqIGhjZl9yY3ZfbXNnLgorKgorKgorKi5ESUFHUkFNCisqCisqLk5PVElDRQorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2NhbGNfbWljX3R4X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgcCwgaW50IGxlbiApCit7CitzdGF0aWMgdW5pb24geyBoY2ZfMzIgeDMyOyBoY2ZfMTYgeDE2WzJdOyBoY2ZfOCB4OFs0XTsgfSB4OwkvLyogYXJlYSB0byBhY2N1bXVsYXRlIDQgYnl0ZXMgaW5wdXQgZm9yIE1JQyBlbmdpbmUKKworCQkJCQkJCQkJCQkJCQkvL2lmIGluaXRpYWxpemF0aW9uIHJlcXVlc3QKKwlpZiAoIGxlbiA9PSAtMSApIHsKKwkJCQkJCQkJCQkJCQkJLy8uICBwcmVzdW1lIE1JQyBjYWxjdWxhdGlvbiBkaXNhYmxlZAorCQlpZmJwLT5JRkJfTUlDVHhDYXJyeSA9IDB4RkZGRjsKKwkJCQkJCQkJCQkJCQkJLy8uICBpZiBNSUMgY2FsY3VsYXRpb24gZW5hYmxlZAorCQlpZiAoIGlmYnAtPklGQl9NSUNUeENudGwgKSB7CisJCQkJCQkJCQkJCQkJCS8vLiAgLiAgY2xlYXIgTUlDIGNhcnJ5CisJCQlpZmJwLT5JRkJfTUlDVHhDYXJyeSA9IDA7CisJCQkJCQkJCQkJCQkJCS8vLiAgLiAgaW5pdGlhbGl6ZSBNSUMtZW5naW5lCisJCQlpZmJwLT5JRkJfTUlDVHhbMF0gPSBDTlZfTE9OR19UT19MSVRUTEUoaWZicC0+SUZCX01JQ1R4S2V5WzBdKTsJLypUeCBhbHdheXMgdXNlcyBLZXkgMCAqLworCQkJaWZicC0+SUZCX01JQ1R4WzFdID0gQ05WX0xPTkdfVE9fTElUVExFKGlmYnAtPklGQl9NSUNUeEtleVsxXSk7CisJCX0KKwkJCQkJCQkJCQkJCQkJLy9lbHNlCisJfSBlbHNlIHsKKwkJCQkJCQkJCQkJCQkJLy8uICBpZiBNSUMgZW5hYmxlZCAoVHgpIC8gaWYgTUlDIHByZXNlbnQgKFJ4KQorCQkJCQkJCQkJCQkJCQkvLy4gIGFuZCBubyBjYXJyeSBmcm9tIHByZXZpb3VzIGNhbGNfbWljX2ZyYWcKKwkJaWYgKCBpZmJwLT5JRkJfTUlDVHhDYXJyeSA9PSAwICkgeworCQkJCQkJCQkJCQkJCQkvLy4gIC4gIHByZXNldCBhY2N1IHdpdGggNCBieXRlcyBmcm9tIGJ1ZmZlcgorCQkJeC54MzIgPSBDTlZfTE9OR1BfVE9fTElUVExFKHApOworCQkJCQkJCQkJCQkJCQkvLy4gIC4gIGFkanVzdCBwb2ludGVyIGFjY29yZGluZ2x5CisJCQlwICs9IDQ7CisJCQkJCQkJCQkJCQkJCS8vLiAgLiAgaWYgYnVmZmVyIGNvbnRhaW5lZCBsZXNzIHRoZW4gNCBieXRlcworCQkJaWYgKCBsZW4gPCA0ICkgeworCQkJCQkJCQkJCQkJCQkvLy4gIC4gIC4gIHByb21vdGUgdmFsaWQgYnl0ZXMgaW4gYWNjdSB0byBjYXJyeQorCQkJCQkJCQkJCQkJCQkvLy4gIC4gIC4gIGZsYWcgYWNjdSB0byBjb250YWluIGluY29tcGxldGUgZG91YmxlIHdvcmQKKwkJCQlpZmJwLT5JRkJfTUlDVHhDYXJyeSA9IChoY2ZfMTYpbGVuOworCQkJCQkJCQkJCQkJCQkvLy4gIC4gIGVsc2UKKwkJCX0gZWxzZSB7CisJCQkJCQkJCQkJCQkJCS8vLiAgLiAgLiAgZmxhZyBhY2N1IHRvIGNvbnRhaW4gY29tcGxldGUgZG91YmxlIHdvcmQKKwkJCQlpZmJwLT5JRkJfTUlDVHhDYXJyeSA9IDQ7CisJCQkJCQkJCQkJCQkJCS8vLiAgLiAgYWRqdXN0IHJlbWFpbmluZyBidWZmZXIgbGVuZ3RoCisJCQkJbGVuIC09IDQ7CisJCQl9CisJCQkJCQkJCQkJCQkJCS8vLiAgZWxzZSBpZiBNSUMgZW5hYmxlZAorCQkJCQkJCQkJCQkJCQkvLy4gIGFuZCBpZiBjYXJyeSBieXRlcyBmcm9tIHByZXZpb3VzIGNhbGNfbWljX3R4X2ZyYWcKKwkJCQkJCQkJCQkJCQkJLy8uICAuICBtb3ZlICgxLTMpIGJ5dGVzIGZyb20gY2FycnkgaW50byBhY2N1CisJCX0gZWxzZSB3aGlsZSAoIGlmYnAtPklGQl9NSUNUeENhcnJ5IDwgNCAmJiBsZW4gKSB7CQkvKiBub3RlIGZvciBoY2ZfMTYgYXBwbGllczogMHhGRkZGID4gNCAqLworCQkJeC54OFtpZmJwLT5JRkJfTUlDVHhDYXJyeSsrXSA9ICpwKys7CisJCQlsZW4tLTsKKwkJfQorCQkJCQkJCQkJCQkJCQkvLy4gIHdoaWxlIGFjY3UgY29udGFpbnMgY29tcGxldGUgZG91YmxlIHdvcmQKKwkJCQkJCQkJCQkJCQkJLy8uICBhbmQgTUlDIGVuYWJsZWQKKwkJd2hpbGUgKCBpZmJwLT5JRkJfTUlDVHhDYXJyeSA9PSA0ICkgeworCQkJCQkJCQkJCQkJCQkvLy4gIC4gIHBhc3MgYWNjdSB0byBNSUMgZW5naW5lCisJCQljYWxjX21pYyggaWZicC0+SUZCX01JQ1R4LCB4LngzMiApOworCQkJCQkJCQkJCQkJCQkvLy4gIC4gIGNvcHkgbmV4dCA0IGJ5dGVzIGZyb20gYnVmZmVyIHRvIGFjY3UKKwkJCXgueDMyID0gQ05WX0xPTkdQX1RPX0xJVFRMRShwKTsKKwkJCQkJCQkJCQkJCQkJLy8uICAuICBhZGp1c3QgYnVmZmVyIHBvaW50ZXIKKwkJCXAgKz0gNDsKKwkJCQkJCQkJCQkJCQkJLy8uICAuICBpZiBidWZmZXIgY29udGFpbmVkIGxlc3MgdGhlbiA0IGJ5dGVzCisJCQkJCQkJCQkJCQkJCS8vLiAgLiAgLiAgcHJvbW90ZSB2YWxpZCBieXRlcyBpbiBhY2N1IHRvIGNhcnJ5CisJCQkJCQkJCQkJCQkJCS8vLiAgLiAgLiAgZmxhZyBhY2N1IHRvIGNvbnRhaW4gaW5jb21wbGV0ZSBkb3VibGUgd29yZAorCQkJaWYgKCBsZW4gPCA0ICkgeworCQkJCWlmYnAtPklGQl9NSUNUeENhcnJ5ID0gKGhjZl8xNilsZW47CisJCQl9CisJCQkJCQkJCQkJCQkJCS8vLiAgLiAgYWRqdXN0IHJlbWFpbmluZyBidWZmZXIgbGVuZ3RoCisJCQlsZW4gLT0gNDsKKwkJfQorCX0KK30gLy8gY2FsY19taWNfdHhfZnJhZworI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQorCisKKyNpZiBIQ0ZfUFJPVF9USU1FCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLlNVQk1PRFVMRQkJdm9pZCBjYWxpYnJhdGUoIElGQlAgaWZicCApCisqLlBVUlBPU0UJCWNhbGlicmF0ZXMgdGhlIFMvVyBwcm90ZWN0aW9uIGNvdW50ZXIgYWdhaW5zdCB0aGUgSGVybWVzIFRpbWVyIHRpY2suCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyoKKyouUkVUVVJOUwkJTi5BLgorKgorKi5ERVNDUklQVElPTgorKiBjYWxpYnJhdGVzIHRoZSBTL1cgcHJvdGVjdGlvbiBjb3VudGVyIGFnYWluc3QgdGhlIEhlcm1lcyBUaW1lciB0aWNrCisqIElGQl9UaWNrSW5pIGlzIHRoZSB2YWx1ZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIFMvVyBwcm90ZWN0aW9uIGNvdW50ZXIgc3VjaCB0aGF0IHRoZSBleHBpcmF0aW9uIHBlcmlvZAorKiBtb3JlIG9yIGxlc3MgaW5kZXBlbmRlbnQgb2YgdGhlIHByb2Nlc3NvciBzcGVlZC4gSWYgSUZCX1RpY2tJbmkgaXMgbm90IHlldCBjYWxpYnJhdGVkLCBpdCBpcyBkb25lIG5vdy4KKyogVGhpcyBjYWxpYnJhdGlvbiBpcyAicmVhc29uYWJseSIgYWNjdXJhdGUgYmVjYXVzZSB0aGUgSGVybWVzIGlzIGluIGEgcXVpZXQgc3RhdGUgYXMgYSByZXN1bHQgb2YgdGhlCisqIEluaXRpYWxpemUgY29tbWFuZC4KKyoKKyoKKyouRElBR1JBTQorKgorKjE6CUlGQl9UaWNrSW5pIGlzIGluaXRpYWxpemVkIGF0IElOSV9USUNLX0lOSSBieSBoY2ZfY29ubmVjdC4gSWYgY2FsaWJyYXRlIHN1Y2NlZWRzLCBJRkJfVGlja0luaSBpcworKglndWFyYW50ZWVkIHRvIGJlIGNoYW5nZWQuIEFzIGEgY29uc2VxdWVuY2UgdGhlcmUgd2lsbCBiZSBvbmx5IDEgc2hvdCBhdCBjYWxpYnJhdGlvbiAocmVnYXJkbGVzcyBvZiB0aGUKKyoJbnVtYmVyIG9mIGluaXQgY2FsbHMpIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLgorKjI6CUNhbGlicmF0aW9uIGlzIGRvbmUgSENGX1BST1RfVElNRV9DTlQgdGltZXMuIFRoaXMgZGltaW5pc2ggdGhlIGVmZmVjdHMgb2Ygaml0dGVyIGFuZCBpbnRlcmZlcmVuY2UsCisqCWVzcGVjaWFsbHkgaW4gYSBwcmUtZW1wdGl2ZSBlbnZpcm9ubWVudC4gSENGX1BST1RfVElNRV9DTlQgaXMgaW4gdGhlIHJhbmdlIG9mIDE2IHRocm91Z2ggMzIgYW5kIGRlcml2ZWQKKyoJZnJvbSB0aGUgSENGX1BST1RfVElNRSBzcGVjaWZpZWQgYnkgdGhlIE1TRiBwcm9ncmFtbWVyLiBUaGUgZGl2aXNvciBuZWVkZWQgdG8gc2NhbGUgSENGX1BST1RfVElNRSBpbnRvIHRoZQorKgkxNi0zMiByYW5nZSwgaXMgdXNlZCBhcyBhIG11bHRpcGxpY2F0b3IgYWZ0ZXIgdGhlIGNhbGlicmF0aW9uLCB0byBzY2FsZSB0aGUgZm91bmQgdmFsdWUgYmFjayB0byB0aGUKKyoJcmVxdWVzdGVkIHJhbmdlLiBUaGlzIHdheSBhIGNvbXByb21pc2UgaXMgYWNoaWV2ZWQgYmV0d2VlbiBhY2N1cmFjeSBhbmQgZHVyYXRpb24gb2YgdGhlIGNhbGlicmF0aW9uCisqCXByb2Nlc3MuCisqMzoJQWNrbm93bGVkZ2UgdGhlIFRpbWVyIFRpY2sgRXZlbnQuCisqCUVhY2ggY3ljbGUgaXMgbGltaXRlZCB0byBhdCBtb3N0IElOSV9USUNLX0lOSSBzYW1wbGVzIG9mIHRoZSBUaW1lclRpY2sgc3RhdHVzIG9mIHRoZSBIZXJtZXMuCisqCVNpbmNlIHRoZSBzdGFydCBvZiBjYWxpYnJhdGUgaXMgdW5yZWxhdGVkIHRvIHRoZSBIZXJtZXMgSW50ZXJuYWwgVGltZXIsIHRoZSBmaXJzdCBpbnRlcnZhbCBtYXkgbGFzdCBmcm9tIDAKKyoJdG8gdGhlIG5vcm1hbCBpbnRlcnZhbCwgYWxsIHN1YnNlcXVlbnQgaW50ZXJ2YWxzIHNob3VsZCBiZSB0aGUgZnVsbCBsZW5ndGggb2YgdGhlIEhlcm1lcyBUaWNrIGludGVydmFsLgorKglUaGUgSGVybWVzIFRpbWVyIFRpY2sgaXMgbm90IHJlcHJvZ3JhbW1lZCBieSB0aGUgSENGLCBoZW5jZSBpdCBpcyBydW5uaW5nIGF0IHRoZSBkZWZhdWx0IG9mIDEwIGsKKyoJbWljcm9zZWNvbmRzLgorKjQ6CUlmIHRoZSBUaW1lciBUaWNrIEV2ZW50IGlzIGNvbnRpbnVvdXNseSB1cCAocHJvdF9jbnQgc3RpbGwgaGFzIHRoZSB2YWx1ZSBJTklfVElDS19JTkkpIG9yIG5vIFRpbWVyIFRpY2sKKyoJRXZlbnQgb2NjdXJyZWQgYmVmb3JlIHRoZSBwcm90ZWN0aW9uIGNvdW50ZXIgZXhwaXJlZCwgcmVzZXQgSUZCX1RpY2tJbmkgdG8gSU5JX1RJQ0tfSU5JLAorKglzZXQgdGhlIGRlZnVuY3QgYml0IG9mIElGQl9DYXJkU3RhdCAodGh1cyByZW5kZXJpbmcgdGhlIEhlcm1lcyBpbm9wZXJhYmxlKSBhbmQgZXhpdCB0aGUgY2FsaWJyYXRlIHJvdXRpbmUuCisqODoJaWZicC0+SUZCX1RpY2tJbmkgaXMgbXVsdGlwbGllZCB0byBzY2FsZSB0aGUgZm91bmQgdmFsdWUgYmFjayB0byB0aGUgcmVxdWVzdGVkIHJhbmdlIGFzIGV4cGxhaW5lZCB1bmRlciAyLgorKgorKi5OT1RJQ0UKKyogbyBBbHRob3VnaCB0aGVyZSBhcmUgYSBudW1iZXIgb2Ygdmlld3BvaW50cyBwb3NzaWJsZSwgY2FsaWJyYXRlKCkgdXNlcyBhcyBlcnJvciBzdHJhdGVneSB0aGF0IGEgc2luZ2xlCisqCWZhaWx1cmUgb2YgdGhlIEhlcm1lcyBUaW1lclRpY2sgaXMgY29uc2lkZXJlZCBmYXRhbC4KKyogbyBUaGVyZSBpcyBubyBoYXJkIGFuZCBjb25jcmV0ZSB0aW1lLW91dCB2YWx1ZSBkZWZpbmVkIGZvciBIZXJtZXMgYWN0aXZpdGllcy4gVGhlIGRlZmF1bHQgMSBzZWNvbmRzIGlzCisqCWJlbGlldmVkIHRvIGJlIHN1ZmZpY2llbnRseSAicmVsYXhlZCIgZm9yIHJlYWwgbGlmZSBhbmQgdG8gYmUgc3VmZmljaWVudGx5IHNob3J0IHRvIGJlIHN0aWxsIHVzZWZ1bCBpbiBhbgorKgllbnZpcm9ubWVudCB3aXRoIGh1bWFucy4KKyogbyBOb3RlIHRoYXQgdmlhIElGQl9EZWZ1bmN0U3RhdCB0aW1lIG91dHMgaW4gY21kX3dhaXQgYW5kIGluIGhjZmlvX3N0cmluZyBibG9jayBhbGwgSGVybWVzIGFjY2VzcyB0aWxsIHRoZQorKgluZXh0IGluaXQgc28gZnVuY3Rpb25zIHdoaWNoIGNhbGwgYSBtaXggb2YgY21kX3dhaXQgYW5kIGhjZmlvX3N0cmluZyBvbmx5IG5lZWQgdG8gY2hlY2sgdGhlIHJldHVybiBzdGF0dXMKKyoJb2YgdGhlIGxhc3QgY2FsbAorKiBvIFRoZSByZXR1cm4gY29kZSBpcyBwcmVzZXQgYXQgVGltZSBvdXQuCisqCVRoZSBhZGRpdGlvbmFsIGNvbXBsaWNhdGlvbiB0aGF0IG5vIGNhbGlicmF0ZWQgdmFsdWUgZm9yIHRoZSBwcm90ZWN0aW9uIGNvdW50IGNhbiBiZSBhc3N1bWVkIHNpbmNlCisqCWNhbGlicmF0ZSgpIGRvZXMgbm90IHlldCBoYXZlIGRldGVybWluZWQgYSBjYWxpYnJhdGVkIHZhbHVlIChhIGNhdGNoIDIyKSwgaXMgaGFuZGxlZCBieSBzZXR0aW5nIHRoZQorKglpbml0aWFsIHZhbHVlIGF0IElOSV9USUNLX0lOSSAoYnkgaGNmX2Nvbm5lY3QpLiBUaGlzIGFwcHJvYWNoIGlzIGNvbnNpZGVyZWQgc2FmZSwgYmVjYXVzZToKKyoJICAtIHRoZSBIQ0YgZG9lcyBub3QgdXNlIHRoZSBwaXBlbGluZSBtZWNoYW5pc20gb2YgSGVybWVzIGNvbW1hbmRzLgorKgkgIC0gdGhlIGxpa2VsaWhvb2Qgb2YgZmFpbHVyZSAodGhlIG9ubHkgdGltZSB3aGVuIHByb3RlY3Rpb24gY291bnQgaXMgcmVsZXZhbnQpIGlzIHNtYWxsLgorKgkgIC0gdGhlIHRpbWUgd2lsbCBiZSBzdWZmaWNpZW50bHkgbGFyZ2Ugb24gYSBmYXN0IG1hY2hpbmUgKGJ1c3kgYml0IGRyb3BzIG9uIGdvb2QgTklDIGJlZm9yZSBjb3VudGVyCisqCQlleHBpcmVzKQorKgkgIC0gdGhlIHRpbWUgd2lsbCBiZSBzdWZmaWNpZW50bHkgc21hbGwgb24gYSBzbG93IG1hY2hpbmUgKGNvdW50ZXIgZXhwaXJlcyBvbiBiYWQgTklDIGJlZm9yZSB0aGUgZW5kIHVzZXIKKyoJICAJc3dpdGNoZXMgdGhlIHBvd2VyIG9mZiBpbiBkZXNwYWlyCisqCVRoZSB0aW1lIG5lZWRlZCB0byB3cmFwIGEgMzIgYml0IGNvdW50ZXIgYXJvdW5kIGlzIGxvbmdlciB0aGFuIG1hbnkgaHVtYW5zIHdhbnQgdG8gd2FpdCwgaGVuY2UgdGhlIG1vcmUgb3IKKyoJbGVzcyBhcmJpdHJhcnkgdmFsdWUgb2YgMHg0MDAwMEwgaXMgY2hvc2VuLCBhc3N1bWluZyBpdCBkb2VzIG5vdCB0YWtlIHRvbyBsb25nIG9uIGFuIFhUIGFuZCBpcyBub3QgdG9vCisqCXNob3J0IG9uIGEgc2NyZWFtLW1hY2hpbmUuCisqCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSENGX1NUQVRJQyB2b2lkCitjYWxpYnJhdGUoIElGQlAgaWZicCApCit7CitpbnQJCWNudCA9IEhDRl9QUk9UX1RJTUVfQ05UOworaGNmXzMyCXByb3RfY250OworCisJSENGVFJBQ0UoIGlmYnAsIEhDRl9UUkFDRV9DQUxJQlJBVEUgKTsKKwlpZiAoIGlmYnAtPklGQl9UaWNrSW5pID09IElOSV9USUNLX0lOSSApIHsJCQkJCQkJCQkJCQkJLyoxKi8KKwkJaWZicC0+SUZCX1RpY2tJbmkgPSAwOwkJCQkJCQkJCQkJCQkJCQkJLyoyKi8KKwkJCXdoaWxlICggY250LS0gKSB7CisJCQkJcHJvdF9jbnQgPSBJTklfVElDS19JTkk7CisJCQkJT1BXKCBIUkVHX0VWX0FDSywgSFJFR19FVl9USUNLICk7CQkJCQkJCQkJCQkJLyozKi8KKwkJCQl3aGlsZSAoIChJUFcoIEhSRUdfRVZfU1RBVCApICYgSFJFR19FVl9USUNLKSA9PSAwICYmIC0tcHJvdF9jbnQgKSB7CisJCQkJCWlmYnAtPklGQl9UaWNrSW5pKys7CisJCQkJfQorCQkJCWlmICggcHJvdF9jbnQgPT0gMCB8fCBwcm90X2NudCA9PSBJTklfVElDS19JTkkgKSB7CQkJCQkJCQkvKjQqLworCQkJCQlpZmJwLT5JRkJfVGlja0luaSA9IElOSV9USUNLX0lOSTsKKwkJCQkJaWZicC0+SUZCX0RlZnVuY3RTdGF0ID0gSENGX0VSUl9ERUZVTkNUX1RJTUVSOworCQkJCQlpZmJwLT5JRkJfQ2FyZFN0YXQgfD0gQ0FSRF9TVEFUX0RFRlVOQ1Q7CisJCQkJCUhDRkFTU0VSVCggRE9fQVNTRVJULCBwcm90X2NudCApCisJCQkJfQorCQkJfQorCQlpZmJwLT5JRkJfVGlja0luaSA8PD0gSENGX1BST1RfVElNRV9TSEZUOwkJCQkJCQkJCQkJCS8qOCovCisJfQorCUhDRlRSQUNFKCBpZmJwLCBIQ0ZfVFJBQ0VfQ0FMSUJSQVRFIHwgSENGX1RSQUNFX0VYSVQgKTsKK30gLy8gY2FsaWJyYXRlCisjZW5kaWYgLy8gSENGX1BST1RfVElNRQorCisKKyNpZiAoSENGX0RMX09OTFkpID09IDAKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLlNVQk1PRFVMRQkJaW50IGNoZWNrX21pYyggSUZCUCBpZmJwICkKKyouUFVSUE9TRQkJdmVyaWZpZXMgdGhlIE1JQyBvZiBhIHJlY2VpdmVkIG5vbi1VU0IgZnJhbWUuCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyoKKyouUkVUVVJOUworKglIQ0ZfU1VDQ0VTUworKglIQ0ZfRVJSX01JQworKgorKi5ERVNDUklQVElPTgorKgorKgorKi5ESUFHUkFNCisqCisqNDoJdGVzdCB3aGV0aGVyIG9yIG5vdCBhIE1JQyBpcyByZXBvcnRlZCBieSB0aGUgSGVybWVzCisqMTQ6IHRoZSBjYWxjdWxhdGVkIE1JQyBhbmQgdGhlIHJlY2VpdmVkIE1JQyBhcmUgY29tcGFyZWQsIHRoZSByZXR1cm4gc3RhdHVzIGlzIHNldCB3aGVuIHRoZXJlIGlzIGEgbWlzbWF0Y2gKKyoKKyouTk9USUNFCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CitjaGVja19taWMoIElGQlAgaWZicCApCit7CitpbnQJCXJjID0gSENGX1NVQ0NFU1M7CitoY2ZfMzIgeDMyWzJdOwkJCQkvLyogYXJlYSB0byBzYXZlIHJjdmQgOCBieXRlcyBNSUMKKworCQkJCQkJCQkJCQkJCS8vaWYgTUlDIHByZXNlbnQgaW4gUnhGUworCWlmICggKih3Y2lfcmVjb3JkcCkmaWZicC0+SUZCX2xhcFstSEZTX0FERFJfREVTVF0gJiBIRlNfU1RBVF9NSUMgKSB7CisJLy9vciBpZiAoIGlmYnAtPklGQl9NSUNSeENhcnJ5ICE9IDB4RkZGRiApCisJCUNBTENfUlhfTUlDKCBtaWNfcGFkLCA4ICk7CQkJCQkvLy4gIHByb2Nlc3MgdXAgdG8gMyByZW1haW5pbmcgYnl0ZXMgb2YgZGF0YSBhbmQgYXBwZW5kIDUgdG8gOCBieXRlcyBvZiBwYWRkaW5nIHRvIE1JQyBjYWxjdWxhdGlvbgorCQlnZXRfZnJhZyggaWZicCwgKHdjaV9idWZwKXgzMiwgOCBCRV9QQVIoMCkpOy8vLiAgZ2V0IDggYnl0ZSBNSUMgZnJvbSBOSUMKKwkJCQkJCQkJCQkJCQkvLy4gIGlmIGNhbGN1bGF0ZWQgYW5kIHJlY2VpdmVkIE1JQyBkbyBub3QgbWF0Y2gKKwkJCQkJCQkJCQkJCQkvLy4gIC4gIHNldCBzdGF0dXMgYXQgSENGX0VSUl9NSUMKKy8qMTQqLyAgaWYgKCB4MzJbMF0gIT0gQ05WX0xJVFRMRV9UT19MT05HKGlmYnAtPklGQl9NSUNSeFswXSkgfHwKKyAgICAgICAgCSB4MzJbMV0gIT0gQ05WX0xJVFRMRV9UT19MT05HKGlmYnAtPklGQl9NSUNSeFsxXSkJICApIHsKKwkJCXJjID0gSENGX0VSUl9NSUM7CisJCX0KKwl9CisJCQkJCQkJCQkJCQkJLy9yZXR1cm4gc3RhdHVzCisJcmV0dXJuIHJjOworfSAvLyBjaGVja19taWMKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKKyNlbmRpZiAvLyBIQ0ZfRExfT05MWQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouU1VCTU9EVUxFCQlpbnQgY21kX2NtcGwoIElGQlAgaWZicCApCisqLlBVUlBPU0UJCXdhaXRzIGZvciBIZXJtZXMgQ29tbWFuZCBDb21wbGV0aW9uLgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqCisqLlJFVFVSTlMKKyoJSUZCX0RlZnVuY3RTdGF0CisqCUhDRl9FUlJfVElNRV9PVVQKKyoJSENGX0VSUl9ERUZVTkNUX0NNRF9TRVEKKyoJSENGX1NVQ0NFU1MKKyoKKyouREVTQ1JJUFRJT04KKyoKKyoKKyouRElBR1JBTQorKgorKjI6CU9uY2UgY21kX2NtcGwgaXMgY2FsbGVkLCB0aGUgQnVzeSBvcHRpb24gYml0IGluIElGQl9DbWQgbXVzdCBiZSBjbGVhcmVkCisqNDoJSWYgU3RhdHVzIHJlZ2lzdGVyIGFuZCBjb21tYW5kIGNvZGUgZG9uJ3QgbWF0Y2ggZWl0aGVyOgorKgkgLSB0aGUgSGVybWVzIGFuZCBIb3N0IGFyZSBvdXQgb2Ygc3luYyAoIGEgZmF0YWwgZXJyb3IpCisqCSAtIGVycm9yIGJpdHMgYXJlIHJlcG9ydGVkIHZpYSB0aGUgU3RhdHVzIFJlZ2lzdGVyLgorKglPdXQgb2Ygc3luYyBpcyBjb25zaWRlcmVkIGZhdGFsIGFuZCBicmluZ3MgdGhlIEhDRiBpbiBEZWZ1bmN0IG1vZGUKKyoJRXJyb3JzIHJlcG9ydGVkIHZpYSB0aGUgU3RhdHVzIFJlZ2lzdGVyIHNob3VsZCBiZSBjYXVzZWQgYnkgc2VxdWVuY2UgdmlvbGF0aW9ucyBpbiBIZXJtZXMgY29tbWFuZAorKglzZXF1ZW5jZXMgYW5kIGhlbmNlIHRoZXNlIGJ1Z3Mgc2hvdWxkIGhhdmUgYmVlbiBmb3VuZCBkdXJpbmcgZW5naW5lZXJpbmcgdGVzdGluZy4gU2luY2UgdGhlcmUgaXMgbm8KKyoJc3RyYXRlZ3kgdG8gY29wZSB3aXRoIHRoaXMgcHJvYmxlbSwgaXQgbWlnaHQgYXMgd2VsbCBiZSBpZ25vcmVkIGF0IHJ1biB0aW1lLiBOb3RlIHRoYXQgZm9yIGFueSBwYXJ0aWN1bGFyCisqCXNpdHVhdGlvbiB3aGVyZSBhIHN0cmF0ZWd5IGlzIGZvcm11bGF0ZWQgdG8gaGFuZGxlIHRoZSBjb25zZXF1ZW5jZXMgb2YgYSBwYXJ0aWN1bGFyIGJ1ZyBjYXVzaW5nIGEKKyoJcGFydGljdWxhciBFcnJvciBzaXR1YXRpb24gcmVwb3J0ZWQgdmlhIHRoZSBTdGF0dXMgUmVnaXN0ZXIsIHRoZSBidWcgc2hvdWxkIGJlIHJlbW92ZWQgcmF0aGVyIHRoYW4gYWRkaW5nCisqCWxvZ2ljIHRvIGNvcGUgd2l0aCB0aGUgY29uc2VxdWVuY2VzIG9mIHRoZSBidWcuCisqCVRoZXJlIGhhdmUgYmVlbiBIQ0YgdmVyc2lvbnMgd2hlcmUgYW4gZXJyb3IgcmVwb3J0IHZpYSB0aGUgU3RhdHVzIFJlZ2lzdGVyIGV2ZW4gYnJvdWdodCB0aGUgSENGIGluIGRlZnVuY3QKKyoJbW9kZSAoYWx0aG91Z2ggaXQgd2FzIG5vdCB5ZXQgbmFtZWQgbGlrZSB0aGF0IGF0IHRoYXQgdGltZSkuIFRoaXMgaXMgcGFydGljdWxhciB1bmRlc2lyYWJsZSBiZWhhdmlvciBmb3IgYQorKglnZW5lcmFsIGxpYnJhcnkuCisqCVNpbXBseSByZXBvcnRpbmcgdGhlIGVycm9yIChhcyAiaW50ZXJlc3RpbmciKSBpcyBkZWJhdGFibGUuIFRoZXJlIGFsc28gaGF2ZSBiZWVuIEhDRiB2ZXJzaW9ucyB3aXRoIHRoaXMKKyoJc3RyYXRlZ3kgdXNpbmcgdGhlICJ2YWd1ZSIgSENGX0ZBSUxVUkUgY29kZS4KKyoJVGhlIGVycm9yIGlzIHJlcG9ydGVkIHZpYToKKyoJIC0gTWlzY0VyciB0YWxseSBvZiB0aGUgSENGIFRhbGx5IHNldAorKgkgLSB0aGUgKGluZm9ybWF0aXZlKSBmaWVsZHMgSUZCX0VyckNtZCBhbmQgSUZCX0VyclF1YWxpZmllcgorKgkgLSB0aGUgYXNzZXJ0IG1lY2hhbmlzbQorKjg6CUhlcmUgdGhlIERlZnVuY3QgY2FzZSBhbmQgdGhlIFN0YXR1cyBlcnJvciBhcmUgc2VwYXJhdGVseSB0cmVhdGVkCisqCisqCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSENGX1NUQVRJQyBpbnQKK2NtZF9jbXBsKCBJRkJQIGlmYnAgKQoreworCitQUk9UX0NOVF9JTkkKK2ludAkJcmMgPSBIQ0ZfU1VDQ0VTUzsKK2hjZl8xNglzdGF0OworCisJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9DTURfQ1BMLCBpZmJwLT5JRkJfQ21kICkKKwlpZmJwLT5JRkJfQ21kICY9IH5IQ01EX0JVU1k7CQkJCQkJCQkJCQkJLyogMiAqLworCUhDRl9XQUlUX1dISUxFKCAoSVBXKCBIUkVHX0VWX1NUQVQpICYgSFJFR19FVl9DTUQpID09IDAgKTsJCQkJCS8qIDQgKi8KKwlzdGF0ID0gSVBXKCBIUkVHX1NUQVQgKTsKKyNpZiBIQ0ZfUFJPVF9USU1FCisJaWYgKCBwcm90X2NudCA9PSAwICkgeworCQlJRl9UQUxMWSggaWZicC0+SUZCX0hDRl9UYWxsaWVzLk1pc2NFcnIrKzsgKQorCQlyYyA9IEhDRl9FUlJfVElNRV9PVVQ7CisJCUhDRkFTU0VSVCggRE9fQVNTRVJULCBpZmJwLT5JRkJfQ21kICkKKwl9IGVsc2UKKyNlbmRpZiAvLyBIQ0ZfUFJPVF9USU1FCisJeworCQlEQVdBX0FDSyggSFJFR19FVl9DTUQgKTsKKy8qNCovCWlmICggc3RhdCAhPSAoaWZicC0+SUZCX0NtZCAmIEhDTURfQ01EX0NPREUpICkgeworLyo4Ki8JCWlmICggKCAoc3RhdCBeIGlmYnAtPklGQl9DbWQgKSAmIEhDTURfQ01EX0NPREUpICE9IDAgKSB7CisJCQkJcmMgPSBpZmJwLT5JRkJfRGVmdW5jdFN0YXQgPSBIQ0ZfRVJSX0RFRlVOQ1RfQ01EX1NFUTsKKwkJCQlpZmJwLT5JRkJfQ2FyZFN0YXQgfD0gQ0FSRF9TVEFUX0RFRlVOQ1Q7CisJCQl9CisJCQlJRl9UQUxMWSggaWZicC0+SUZCX0hDRl9UYWxsaWVzLk1pc2NFcnIrKzsgKQorCQkJaWZicC0+SUZCX0VyckNtZCA9IHN0YXQ7CisJCQlpZmJwLT5JRkJfRXJyUXVhbGlmaWVyID0gSVBXKCBIUkVHX1JFU1BfMCApOworCQkJSENGQVNTRVJUKCBET19BU1NFUlQsIE1FUkdFXzIoIElQVyggSFJFR19QQVJBTV8wICksIGlmYnAtPklGQl9DbWQgKSApCisJCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgTUVSR0VfMiggaWZicC0+SUZCX0VyclF1YWxpZmllciwgaWZicC0+SUZCX0VyckNtZCApICkKKwkJfQorCX0KKwlIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYykKKwlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfQ01EX0NQTCApCisJcmV0dXJuIHJjOworfSAvLyBjbWRfY21wbAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouU1VCTU9EVUxFCQlpbnQgY21kX2V4ZSggSUZCUCBpZmJwLCBpbnQgY21kX2NvZGUsIGludCBwYXJfMCApCisqLlBVUlBPU0UJCUV4ZWN1dGVzIHN5bmNocm9ub3VzIHBhcnQgb2YgSGVybWVzIENvbW1hbmQgYW5kIC0gb3B0aW9uYWxseSAtIHdhaXRzIGZvciBDb21tYW5kIENvbXBsZXRpb24uCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyoJY21kX2NvZGUKKyoJcGFyXzAKKyoKKyouUkVUVVJOUworKglJRkJfRGVmdW5jdFN0YXQKKyoJSENGX0VSUl9ERUZVTkNUX0NNRF9TRVEKKyoJSENGX1NVQ0NFU1MKKyoJSENGX0VSUl9UT19CRV9BRERFRAk8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAorKgorKi5ERVNDUklQVElPTgorKiBFeGVjdXRlcyBzeW5jaHJvbm91cyBIZXJtZXMgQ29tbWFuZCBhbmQgd2FpdHMgZm9yIENvbW1hbmQgQ29tcGxldGlvbgorKgorKiBUaGUgZ2VuZXJhbCBIQ0Ygc3RyYXRlZ3kgaXMgdG8gd2FpdCBmb3IgY29tbWFuZCBjb21wbGV0aW9uLiBBcyBhIGNvbnNlcXVlbmNlOgorKiAtIHRoZSByZWFkIG9mIHRoZSBidXN5IGJpdCBiZWZvcmUgd3JpdGluZyB0aGUgY29tbWFuZCByZWdpc3RlciBpcyBzdXBlcmZsdW91cworKiAtIHRoZSBIZXJtZXMgcmVxdWlyZW1lbnQgdGhhdCBubyBJbnF1aXJ5IGNvbW1hbmQgbWF5IGJlIGV4ZWN1dGVkIGlmIHRoZXJlIGlzIHN0aWxsIGFuIHVuYWNrbm93bGVkZ2VkCisqCUlucXVpcnkgY29tbWFuZCBvdXRzdGFuZGluZywgaXMgYXV0b21hdGljYWxseSBtZXQuCisqIFRoZSBUeCBjb21tYW5kIHVzZXMgdGhlICJCdXN5IiBiaXQgaW4gdGhlIGNtZF9jb2RlIHBhcmFtZXRlciB0byBkZXZpYXRlIGZyb20gdGhpcyBnZW5lcmFsIEhDRiBzdHJhdGVneS4KKyogVGhlIGlkZWEgaXMgdGhhdCBieSBub3QgYnVzeS13YWl0aW5nIG9uIGNvbXBsZXRpb24gb2YgdGhpcyBmcmVxdWVudGx5IHVzZWQgY29tbWFuZCB0aGUgcHJvY2Vzc29yCisqIHV0aWxpemF0aW9uIGlzIGRpbWluaXNoZWQgd2hpbGUgdXNpbmcgdGhlIGJ1c3ktd2FpdCBvbiBhbGwgb3RoZXIgc2VsZG9tIHVzZWQgY29tbWFuZHMgdGhlIGZsb3cgaXMga2VwdAorKiBzaW1wbGUuCisqCisqCisqCisqLkRJQUdSQU0KKyoKKyoxOglza2lwIHRoZSBib2R5IG9mIGNtZF9leGUgd2hlbiBpbiBkZWZ1bmN0IG1vZGUgb3Igd2hlbiAtIGJhc2VkIG9uIHRoZSBTL1cgU3VwcG9ydCByZWdpc3RlciB3cml0ZSBhbmQKKyoJcmVhZCBiYWNrIHRlc3QgLSB0aGVyZSBpcyBhcHBhcmVudGx5IG5vIE5JQy4KKyoJTm90ZTogd2UgZ2F2ZSB1cCBvbiB0aGUgIm9sZCIgc3RyYXRlZ3kgdG8gd3JpdGUgdGhlIFMvVyBTdXBwb3J0IHJlZ2lzdGVyIGF0IG1hZ2ljIG9ubHkgd2hlbiBuZWVkZWQuIER1ZSB0bworKgl0aGUgaW50cmljYXRlbmVzcyBvZiBIZXJtZXMgRi9XIHZhcmlldGllcyAoIHdoaWNoIGJlaGF2ZSBkaWZmZXJlbnRseSBhcyBmYXIgYXMgY29ycnVwdGlvbiBvZiB0aGUgUy9XCisqCVN1cHBvcnQgcmVnaXN0ZXIgaXMgaW52b2x2ZWQpLCB0aGUgaW5jcmVhc2luZyBudW1iZXIgb2YgSGVybWVzIGNvbW1hbmRzIHdoaWNoIGRvIGFuIGltcGxpY2l0IGluaXRpYWxpemUKKyoJKHRodXMgbW9kaWZ5aW5nIHRoZSBTL1cgU3VwcG9ydCByZWdpc3RlcikgYW5kIHRoZSB3b3JrYXJvdW5kcyBvZiBzb21lIE9TL1N1cHBvcnQgUy9XIGluZHVjZWQgYXNwZWN0cyAoZS5nLgorKgl0aGUgU3lzdGVtIFNvZnQgbGlicmFyeSBhdCBXaW5OVCB3aGljaCBwb3N0cG9uZXMgdGhlIGFjdHVhbCBtYXBwaW5nIG9mIEkvTyBzcGFjZSB1cCB0byAzMCBzZWNvbmRzIGFmdGVyCisqCWdpdmluZyB0aGUgZ28tYWhlYWQpLCB0aGUgIm1hZ2ljIiBzdHJhdGVneSBpcyBub3cgcmVkdWNlZCB0byBhIHNpbXBsZSB3cml0ZSBhbmQgcmVhZCBiYWNrLiBUaGlzIG1lYW5zIHRoYXQKKyoJcHJvYmxlbXMgbGlrZSBhIGJ1ZyB0cmFtcGluZyBvdmVyIHRoZSBtZW1vcnkgbWFwcGVkIEhlcm1lcyByZWdpc3RlcnMgd2lsbCBubyBsb25nZXIgYmUgbm90aWNlZCBhcyBzaWRlCisqCWVmZmVjdCBvZiB0aGUgUy9XIFN1cHBvcnQgcmVnaXN0ZXIgY2hlY2suCisqMjoJY2hlY2sgd2hldGhlciB0aGUgcHJlY2VkaW5nIGNvbW1hbmQgc2tpcHBlZCB0aGUgYnVzeSB3YWl0IGFuZCBpZiBzbywgY2hlY2sgZm9yIGNvbW1hbmQgY29tcGxldGlvbgorKgorKi5OT1RJQ0UKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0hDRl9TVEFUSUMgaW50CitjbWRfZXhlKCBJRkJQIGlmYnAsIGhjZl8xNiBjbWRfY29kZSwgaGNmXzE2IHBhcl8wICkJLy9pZiBIQ01EX0JVU1kgb2YgY21kX2NvZGUgc2V0LCB0aGVuIGRvIE5PVCB3YWl0IGZvciBjb21wbGV0aW9uCit7CitpbnQgcmM7CisKKwlIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX0NNRF9FWEUsIGNtZF9jb2RlICkKKwlIQ0ZBU1NFUlQoIChjbWRfY29kZSAmIEhDTURfQ01EX0NPREUpICE9IEhDTURfVFggfHwgY21kX2NvZGUgJiBIQ01EX0JVU1ksIGNtZF9jb2RlICkgLy9UeCBtdXN0IGhhdmUgQnVzeSBiaXQgc2V0CisJT1BXKCBIUkVHX1NXXzAsIEhDRl9NQUdJQyApOworCWlmICggSVBXKCBIUkVHX1NXXzAgKSA9PSBIQ0ZfTUFHSUMgKSB7CQkJCQkJCQkJCQkJCQkvKiAxICovCisJCXJjID0gaWZicC0+SUZCX0RlZnVuY3RTdGF0OworCX0KKwllbHNlIHJjID0gSENGX0VSUl9OT19OSUM7CisJaWYgKCByYyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwkJLy87P2lzIHRoaXMgYSBob3QgaWRlYSwgYmV0dGVyIE1FQVNVUkUgcGVyZm9ybWFuY2UgaW1wYWN0CisvKjIqLwlpZiAoIGlmYnAtPklGQl9DbWQgJiBIQ01EX0JVU1kgKSB7CisJCQlyYyA9IGNtZF9jbXBsKCBpZmJwICk7CisJCX0KKwkJT1BXKCBIUkVHX1BBUkFNXzAsIHBhcl8wICk7CisJCU9QVyggSFJFR19DTUQsIGNtZF9jb2RlICZ+SENNRF9CVVNZICk7CisJCWlmYnAtPklGQl9DbWQgPSBjbWRfY29kZTsKKwkJaWYgKCAoY21kX2NvZGUgJiBIQ01EX0JVU1kpID09IDAgKSB7CS8vOz9pcyB0aGlzIGEgaG90IGlkZWEsIGJldHRlciBNRUFTVVJFIHBlcmZvcm1hbmNlIGltcGFjdAorCQkJcmMgPSBjbWRfY21wbCggaWZicCApOworCQl9CisJfQorCUhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIE1FUkdFXzIoIHJjLCBjbWRfY29kZSApICkKKwlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfQ01EX0VYRSApCisJcmV0dXJuIHJjOworfSAvLyBjbWRfZXhlCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5TVUJNT0RVTEUJCWludCBkb3dubG9hZCggSUZCUCBpZmJwLCBDRkdfUFJPR19TVFJDVCBGQVIgKmx0dnAgKQorKi5QVVJQT1NFCQlkb3dubG9hZHMgRi9XIGltYWdlIGludG8gTklDIGFuZCBpbml0aWF0ZXMgZXhlY3V0aW9uIG9mIHRoZSBkb3dubG9hZGVkIEYvVy4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKglsdHZwCQlzcGVjaWZpZXMgdGhlIHBzZXVkby1SSUQgKGFzIGRlZmluZWQgYnkgV0NJKQorKgorKi5SRVRVUk5TCisqCisqLkRFU0NSSVBUSU9OCisqCisqCisqLkRJQUdSQU0KKyoxOglGaXJzdCwgQWNrIGV2ZXJ5dGhpbmcgdG8gdW5ibG9jayBhIChwb3NzaWJseSkgYmxvY2tlZCBjbWQgcGlwZSBsaW5lCisqCU5vdGUgMTogaXQgaXMgdmVyeSBsaWtlbHkgdGhhdCBhbiBBbGxvYyBldmVudCBpcyBwZW5kaW5nIGFuZCB2ZXJ5IHdlbGwgcG9zc2libGUgdGhhdCBhIChTZW5kKSBDbWQgZXZlbnQgaXMKKyoJcGVuZGluZworKglOb3RlIDI6IGl0IGlzIGFzc3VtZWQgdGhhdCB0aGlzIHN0cmF0ZWd5IHRha2VzIGF3YXkgdGhlIG5lZWQgdG8gYWNrIGV2ZXJ5IGNvbmNlaXZhYmxlIGV2ZW50IGFmdGVyIGFuCisqCUhlcm1lcyBJbml0aWFsaXplCisqCisqCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSENGX1NUQVRJQyBpbnQKK2Rvd25sb2FkKCBJRkJQIGlmYnAsIENGR19QUk9HX1NUUkNUIEZBUiAqbHR2cCApCQkJCQkJLy9IZXJtZXMtSUkgZG93bmxvYWQgKHZvbGF0aWxlIG9ubHkpCit7CitoY2ZfMTYJCQkJaTsKK2ludAkJCQkJcmMgPSBIQ0ZfU1VDQ0VTUzsKK3djaV9idWZwCQkJY3A7CitoY2ZfaW8JCQkJaW9fcG9ydCA9IGlmYnAtPklGQl9JT0Jhc2UgKyBIUkVHX0FVWF9EQVRBOworCisJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9ETCwgbHR2cC0+dHlwICkKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfUFJFTE9BREVECisJSENGQVNTRVJUKCBET19BU1NFUlQsIGx0dnAtPm1vZGUgKQorI2Vsc2UKKwkJCQkJCQkJCQkJCQkvL2lmIGluaXRpYWwgInByb2dyYW0iIExUVgorCWlmICggaWZicC0+SUZCX0RMTW9kZSA9PSBDRkdfUFJPR19TVE9QICYmIGx0dnAtPm1vZGUgPT0gQ0ZHX1BST0dfVk9MQVRJTEUpIHsKKwkJCQkJCQkJCQkJCQkvLy4gIHN3aXRjaCBIZXJtZXMgdG8gaW5pdGlhbCBtb2RlCisvKjEqLwlPUFcoIEhSRUdfRVZfQUNLLCB+SFJFR19FVl9TTEVFUF9SRVEgKTsKKwkJcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX0lOSSwgMCApOwkvKiBIQ01EX0lOSSBjYW4gbm90IGJlIHBhcnQgb2YgaW5pdCgpIGJlY2F1c2UgdGhhdCBpcyBjYWxsZWQgb24KKwkJCQkJCQkJCQkJICogb3RoZXIgb2NjYXNpb25zIGFzIHdlbGwgKi8KKwkJcmMgPSBpbml0KCBpZmJwICk7CisJfQorCQkJCQkJCQkJCQkJCS8vaWYgZmluYWwgInByb2dyYW0iIExUVgorCWlmICggbHR2cC0+bW9kZSA9PSBDRkdfUFJPR19TVE9QICYmIGlmYnAtPklGQl9ETE1vZGUgPT0gQ0ZHX1BST0dfVk9MQVRJTEUpIHsKKwkJCQkJCQkJCQkJCQkvLy4gIHN0YXJ0IHRlcnRpYXJ5IChvciBzZWNvbmRhcnkpCisJCU9QVyggSFJFR19QQVJBTV8xLCAoaGNmXzE2KShsdHZwLT5uaWNfYWRkciA+PiAxNikgKTsKKwkJcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX0VYRUNVVEUsIChoY2ZfMTYpIGx0dnAtPm5pY19hZGRyICk7CisJCWlmIChyYyA9PSBIQ0ZfU1VDQ0VTUykgeworCQkJcmMgPSBpbml0KCBpZmJwICk7CS8qOz8gZG8gd2UgcmVhbGx5IHdhbnQgdG8gc2tpcCBpbml0IGlmIGNtZF9leGUgZmFpbGVkLCBpLmUuCisJCQkJCQkJCSAqCSBJRkJfRldfQ29tcF9JZCBpcyB0aGFuIHBvc3NpYmx5IGluY29ycmVjdCAqLworCSAgCX0KKwkJCQkJCQkJCQkJCQkvL2Vsc2UgKG5vbi1maW5hbCkKKwl9IGVsc2UgeworCQkJCQkJCQkJCQkJCS8vLiAgaWYgbW9kZSA9PSBSZWFkYmFjayBTRUVQUk9NCisjaWYgMAkvLzs/IGFzIGxvbmcgYXMgdGhlIG5leHQgaWYgY29udGFpbnMgYSBoYXJkIGNvZGVkIDAsIG1pZ2h0IGFzIHdlbGwgbGVhdmUgaXQgb3V0IGV2ZW4gbW9yZSBvYnZpb3VzCisJCWlmICggMCAvKmxlbiBpcyBkZWZpbml0ZWx5IG5vdCB3YW50IHdlIHdhbnQ7PyovICYmIGx0dnAtPm1vZGUgPT0gQ0ZHX1BST0dfU0VFUFJPTV9SRUFEQkFDSyApIHsKKwkJCU9QVyggSFJFR19QQVJBTV8xLCAoaGNmXzE2KShsdHZwLT5uaWNfYWRkciA+PiAxNikgKTsKKwkJCU9QVyggSFJFR19QQVJBTV8yLCBNVUxfQllfMihsdHZwLT5sZW4gLSA0KSk7CisJCQkJCQkJCQkJCQkJLy8uICAuICBwZXJmb3JtIEhlcm1lcyBwcm9nIGNtZCB3aXRoIGFwcHJvcHJpYXRlIG1vZGUgYml0cworCQkJcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX1BST0dSQU0gfCBsdHZwLT5tb2RlLCAoaGNmXzE2KWx0dnAtPm5pY19hZGRyICk7CisJCQkJCQkJCQkJCQkJLy8uICAuICBzZXQgdXAgTklDIFJBTSBhZGRyZXNzYWJpbGl0eSBhY2NvcmRpbmcgUmVzcDAtMQorCQkJT1BXKCBIUkVHX0FVWF9QQUdFLCAgIElQVyggSFJFR19SRVNQXzEpICk7CisJCQlPUFcoIEhSRUdfQVVYX09GRlNFVCwgSVBXKCBIUkVHX1JFU1BfMCkgKTsKKwkJCQkJCQkJCQkJCQkvLy4gIC4gIHNldCB1cCBMLWZpZWxkIG9mIExUViBhY2NvcmRpbmcgUmVzcDIKKwkJCWkgPSAoIElQVyggSFJFR19SRVNQXzIgKSArIDEgKSAvIDI7ICAvLyBpIGNvbnRhaW5zIG1heCBidWZmZXIgc2l6ZSBpbiB3b3JkcywgYSBwcm9iYWJseSBub3QgdmVyeSB1c2VmdWwgcGllY2Ugb2YgaW5mb3JtYXRpb24gOz8KKy8qTmljbydzIGNvZGUgYmFzZWQgb24gaSBpcyB0aGUgInJlYWwgYW1vdW50IG9mIGRhdGEgYXZhaWxhYmxlIgorCQkJaWYgKCBsdHZwLT5sZW4gLSA0IDwgaSApIHJjID0gSENGX0VSUl9MRU47CisJCQllbHNlIGx0dnAtPmxlbiA9IGkgKyA0OworKi8KKy8qIFJvbGFuZHMgY29kZSBiYXNlZCBvbiB0aGUgaWRlYSB0aGF0IGEgTVNGIHNob3VsZCBub3QgYXNrIGZvciBtb3JlIHRoYW4gaXMgYXZhaWxhYmxlCisJCQkvLyBjaGVjayBpZiBudW1iZXIgb2YgYnl0ZXMgcmVxdWVzdGVkIGV4Y2VlZHMgbWF4IGJ1ZmZlciBzaXplCisJCQlpZiAoIGx0dnAtPmxlbiAtIDQgPiBpICkgeworCQkJCXJjID0gSENGX0VSUl9MRU47CisJCQkJbHR2cC0+bGVuID0gaSArIDQ7CisJCQl9CisqLworCQkJCQkJCQkJCQkJCS8vLiAgLiAgY29weSBkYXRhIGZyb20gTklDIHZpYSBBVVggcG9ydCB0byBMVFYKKwkJCWNwID0gKHdjaV9idWZwKWx0dnAtPmhvc3RfYWRkcjsJCQkJCQkvKklOX1BPUlRfU1RSSU5HXzhfMTYgbWFjcm8gbWF5IG1vZGlmeSBpdHMgcGFyYW1ldGVycyovCisJCQlpID0gbHR2cC0+bGVuIC0gNDsKKwkJCUlOX1BPUlRfU1RSSU5HXzhfMTYoIGlvX3BvcnQsIGNwLCBpICk7CQkvLyEhIVdPUkQgbGVuZ3RoLCBjcCBNVVNUIGJlIGEgY2hhciBwb2ludGVyCS8vICQkIGNoYXIKKwkJCQkJCQkJCQkJCQkvLy4gIGVsc2UgKG5vbi1maW5hbCBwcm9ncmFtbWluZykKKwkJfSBlbHNlCisjZW5kaWYgLy87PyBhcyBsb25nIGFzIHRoZSBhYm92ZSBpZiBjb250YWlucyBhIGhhcmQgY29kZWQgMCwgbWlnaHQgYXMgd2VsbCBsZWF2ZSBpdCBvdXQgZXZlbiBtb3JlIG9idmlvdXMKKwkJewkJCQkJCQkJCQkJLy8uICAuICBnZXQgbnVtYmVyIG9mIHdvcmRzIHRvIHByb2dyYW0KKwkJCUhDRkFTU0VSVCggbHR2cC0+c2VnbWVudF9zaXplLCAqbHR2cC0+aG9zdF9hZGRyICkKKwkJCWkgPSBsdHZwLT5zZWdtZW50X3NpemUvMjsKKwkJCQkJCQkJCQkJCQkvLy4gIC4gIGNvcHkgZGF0YSAod29yZHMpIGZyb20gTFRWIHZpYSBBVVggcG9ydCB0byBOSUMKKwkJCWNwID0gKHdjaV9idWZwKWx0dnAtPmhvc3RfYWRkcjsJCQkJCQkvL09VVF9QT1JUX1NUUklOR184XzE2IG1hY3JvIG1heSBtb2RpZnkgaXRzIHBhcmFtZXRlcnMKKwkJCQkJCQkJCQkJCQkvLy4gIC4gIGlmIG1vZGUgPT0gdm9sYXRpbGUgcHJvZ3JhbW1pbmcKKwkJCWlmICggbHR2cC0+bW9kZSA9PSBDRkdfUFJPR19WT0xBVElMRSApIHsKKwkJCQkJCQkJCQkJCQkvLy4gIC4gIC4gIHNldCB1cCBOSUMgUkFNIGFkZHJlc3NhYmlsaXR5IHZpYSBBVVggcG9ydAorCQkJCU9QVyggSFJFR19BVVhfUEFHRSwgKGhjZl8xNikobHR2cC0+bmljX2FkZHIgPj4gMTYgPDwgOSB8IChsdHZwLT5uaWNfYWRkciAmIDB4RkZGRikgPj4gNyApICk7CisJCQkJT1BXKCBIUkVHX0FVWF9PRkZTRVQsIChoY2ZfMTYpKGx0dnAtPm5pY19hZGRyICYgMHgwMDdFKSApOworCQkJCU9VVF9QT1JUX1NUUklOR184XzE2KCBpb19wb3J0LCBjcCwgaSApOwkJLy8hISFXT1JEIGxlbmd0aCwgY3AgTVVTVCBiZSBhIGNoYXIgcG9pbnRlcgorCQkJfQorCQl9CisJfQorCWlmYnAtPklGQl9ETE1vZGUgPSBsdHZwLT5tb2RlOwkJCQkJLy9zYXZlIHN0YXRlIGluIElGQl9ETE1vZGUKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9QUkVMT0FERUQKKwlIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYyApCisJSENGTE9HRVhJVCggSENGX1RSQUNFX0RMICkKKwlyZXR1cm4gcmM7Cit9IC8vIGRvd25sb2FkCisKKworI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfUFJJTlRGCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ2VydGFpbiBIZXJtZXMtSUkgZmlybXdhcmUgdmVyc2lvbnMgY2FuIGdlbmVyYXRlCisqIGRlYnVnIGluZm9ybWF0aW9uLiBUaGlzIGRlYnVnIGluZm9ybWF0aW9uIGlzCisqIGNvbnRhaW5lZCBpbiBhIGJ1ZmZlciBpbiBuaWMtUkFNLCBhbmQgY2FuIGJlIHJlYWQKKyogdmlhIHRoZSBhdXggcG9ydC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSENGX1NUQVRJQyBpbnQKK2Z3X3ByaW50ZihJRkJQIGlmYnAsIENGR19GV19QUklOVEZfU1RSQ1QgRkFSICpsdHZwKQoreworICAgIGludCByYyA9IEhDRl9TVUNDRVNTOworICAgIGhjZl8xNiBmd19jbnQ7CisvLyAgICBoY2ZfMzIgRGJNc2dCdWZmZXIgPSAweDI5RDIsIERiTXNnQ291bnQ9IDB4MDAwMDI5RDA7CisvLyAgICBoY2ZfMTYgRGJNc2dTaXplPTB4MDAwMDAwODA7CisgICAgaGNmXzMyIERiTXNnQnVmZmVyOworICAgIENGR19GV19QUklOVEZfQlVGRkVSX0xPQ0FUSU9OX1NUUkNUICpwID0gJmlmYnAtPklGQl9Gd1BmQnVmZjsKKyAgICBsdHZwLT5sZW4gPSAxOworICAgIGlmICggcC0+RGJNc2dTaXplICE9IDAgKSB7CisgICAgICAgIC8vIGZpcnN0LCBjaGVjayB0aGUgY291bnRlciBpbiBuaWMtUkFNIGFuZCBjb21wYXJlIGl0IHRvIHRoZSBsYXRlc3QgY291bnRlciB2YWx1ZSBvZiB0aGUgSENGCisgICAgICAgIE9QVyggSFJFR19BVVhfUEFHRSwgKGhjZl8xNikocC0+RGJNc2dDb3VudCA+PiA3KSApOworICAgICAgICBPUFcoIEhSRUdfQVVYX09GRlNFVCwgKGhjZl8xNikocC0+RGJNc2dDb3VudCAmIDB4N0UpICk7CisgICAgICAgIGZ3X2NudCA9ICgoSVBXKCBIUkVHX0FVWF9EQVRBKSA+PjEgKSAmICgoaGNmXzE2KXAtPkRiTXNnU2l6ZSAtIDEpKTsKKyAgICAgICAgaWYgKCBmd19jbnQgIT0gaWZicC0+SUZCX0RiZ1ByaW50Rl9DbnQgKSB7CisvLyAgICBEYmdQcmludCgiZndfY250PSVkIElGQl9EYmdQcmludEZfQ250PSVkXG4iLCBmd19jbnQsIGlmYnAtPklGQl9EYmdQcmludEZfQ250KTsKKyAgICAgICAgICAgIERiTXNnQnVmZmVyID0gcC0+RGJNc2dCdWZmZXIgKyBpZmJwLT5JRkJfRGJnUHJpbnRGX0NudCAqIDY7IC8vIGVhY2ggZW50cnkgaXMgMyB3b3JkcworICAgICAgICAgICAgT1BXKCBIUkVHX0FVWF9QQUdFLCAoaGNmXzE2KShEYk1zZ0J1ZmZlciA+PiA3KSApOworICAgICAgICAgICAgT1BXKCBIUkVHX0FVWF9PRkZTRVQsIChoY2ZfMTYpKERiTXNnQnVmZmVyICYgMHg3RSkgKTsKKyAgICAgICAgICAgIGx0dnAtPm1zZ19pZCAgICAgPSBJUFcoSFJFR19BVVhfREFUQSk7CisgICAgICAgICAgICBsdHZwLT5tc2dfcGFyICAgID0gSVBXKEhSRUdfQVVYX0RBVEEpOworICAgICAgICAgICAgbHR2cC0+bXNnX3RzdGFtcCA9IElQVyhIUkVHX0FVWF9EQVRBKTsKKyAgICAgICAgICAgIGx0dnAtPmxlbiA9IDQ7CisgICAgICAgICAgICBpZmJwLT5JRkJfRGJnUHJpbnRGX0NudCsrOworICAgICAgICAgICAgaWZicC0+SUZCX0RiZ1ByaW50Rl9DbnQgJj0gKHAtPkRiTXNnU2l6ZSAtIDEpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByYzsKK307CisjZW5kaWYgLy8gSENGX0FTU0VSVF9QUklOVEYKKworCisjaWYgKEhDRl9ETF9PTkxZKSA9PSAwCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLlNVQk1PRFVMRQkJaGNmXzE2IGdldF9maWQoIElGQlAgaWZicCApCisqLlBVUlBPU0UJCWdldCBhbGxvY2F0ZWQgRklEIGZvciBlaXRoZXIgdHJhbnNtaXQgb3Igbm90aWZ5LgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqCisqLlJFVFVSTlMKKyoJMAlubyBGSUQgYXZhaWxhYmxlCisqCTw+MAlGSUQgbnVtYmVyCisqCisqLkRFU0NSSVBUSU9OCisqCisqCisqLkRJQUdSQU0KKyoJVGhlIHByZWZlcmVuY2UgaXMgdG8gdXNlIGEgInBlbmRpbmciIGFsbG9jLiBJZiBubyBhbGxvYyBpcyBwZW5kaW5nLCB0aGVuIC0gaWYgYXZhaWxhYmxlIC0gdGhlICJzcGFyZSIgRklECisqCWlzIHVzZWQuCisqCUlmIHRoZSBzcGFyZSBGSUQgaXMgdXNlZCwgSUZCX1JzY0luZCAocmVwcmVzZW50aW5nIHRoZSBzcGFyZSBGSUQpIG11c3QgYmUgY2xlYXJlZAorKglJZiB0aGUgcGVuZGluZyBhbGxvYyBpcyB1c2VkLCB0aGUgYWxsb2MgZXZlbnQgbXVzdCBiZSBhY2tub3dsZWRnZWQgdG8gdGhlIEhlcm1lcy4KKyoJSW4gY2FzZSB0aGUgc3BhcmUgRklEIHdhcyBkZXBsZXRlZCBhbmQgdGhlIElGQl9Sc2NJbmQgaGFzIGJlZW4gImZha2VkIiBhcyBwc2V1ZG8gcmVzb3VyY2Ugd2l0aCBhIDB4MDAwMQorKgl2YWx1ZSBieSBoY2Zfc2VydmljZV9uaWMsIElGQl9Sc2NJbmQgaGFzIHRvIGJlICJjb3JyZWN0ZWQiIGFnYWluIHRvIGl0cyAweDAwMDAgdmFsdWUuCisqCisqCU5vdGUgdGhhdCBkdWUgdG8gdGhlIEhlcm1lcy1JSSBIL1cgcHJvYmxlbXMgd2hpY2ggYXJlIGludGVuZGVkIHRvIGJlIHdvcmtlZCBhcm91bmQgYnkgREFXQSwgdGhlIEFsbG9jIGJpdAorKglpbiB0aGUgRXZlbnQgcmVnaXN0ZXIgaXMgbm8gbG9uZ2VyIGEgcmVsaWFibGUgaW5kaWNhdGlvbiBvZiB0aGUgcHJlc2VuY2UvYWJzZW5jZSBvZiBhIEZJRC4gVGhlICJDbGVhciBGSUQiCisqCXBhcnQgb2YgdGhlIERBV0EgbG9naWMsIHRvZ2V0aGVyIHdpdGggdGhlIGNob2ljZSBvZiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgcmV0dXJuIGluZm9ybWF0aW9uIGZyb20gZ2V0X2ZpZCwKKyoJaGFuZGxlIHRoaXMgYXV0b21hdGljYWxseSwgaS5lLiB3aXRob3V0IGFkZGl0aW9uYWwgY29kZSBpbiBnZXRfZmlkLgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hDRl9TVEFUSUMgaGNmXzE2CitnZXRfZmlkKCBJRkJQIGlmYnAgKQoreworCitoY2ZfMTYgZmlkID0gMDsKKyNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9ISUk1ICkgPT0gMAorUFJPVF9DTlRfSU5JCisjZW5kaWYgLy8gSENGX1RZUEVfSElJNQorCisJSUZfRE1BKCBIQ0ZBU1NFUlQoIShpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEpLCBpZmJwLT5JRkJfQ250bE9wdCkgKQorCisJaWYgKCBJUFcoIEhSRUdfRVZfU1RBVCkgJiBIUkVHX0VWX0FMTE9DKSB7CisJCWZpZCA9IElQVyggSFJFR19BTExPQ19GSUQgKTsKKwkJSENGQVNTRVJUKCBmaWQsIGlmYnAtPklGQl9Sc2NJbmQgKQorCQlEQVdBX1pFUk9fRklEKCBIUkVHX0FMTE9DX0ZJRCApCisjaWYgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfSElJNSApID09IDAKKwkJSENGX1dBSVRfV0hJTEUoICggSVBXKCBIUkVHX0VWX1NUQVQgKSAmIEhSRUdfRVZfQUNLX1JFR19SRUFEWSApID09IDAgKTsKKwkJSENGQVNTRVJUKCBwcm90X2NudCwgSVBXKCBIUkVHX0VWX1NUQVQgKSApCisjZW5kaWYgLy8gSENGX1RZUEVfSElJNQorCQlEQVdBX0FDSyggSFJFR19FVl9BTExPQyApOwkJCS8vISFub3RlIHRoYXQgSFJFR19FVl9BTExPQyBpcyB3cml0dGVuIG9ubHkgb25jZQorLy8gMTgwIGRlZ3JlZSBlcnJvciBpbiBsb2dpYyA7PyAjaWYgQUxMT0NfMTUKKwkJaWYgKCBpZmJwLT5JRkJfUnNjSW5kID09IDEgKSB7CisJCQlpZmJwLT5JRkJfUnNjSW5kID0gMDsKKwkJfQorLy8jZW5kaWYgLy8gQUxMT0NfMTUKKwl9IGVsc2UgeworLy8gMTgwIGRlZ3JlZSBlcnJvciBpbiBsb2dpYyA7PyAjaWYgQUxMT0NfMTUKKwkJZmlkID0gaWZicC0+SUZCX1JzY0luZDsKKy8vI2VuZGlmIC8vIEFMTE9DXzE1CisJCWlmYnAtPklGQl9Sc2NJbmQgPSAwOworCX0KKwlyZXR1cm4gZmlkOworfSAvLyBnZXRfZmlkCisjZW5kaWYgLy8gSENGX0RMX09OTFkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLlNVQk1PRFVMRQkJdm9pZCBnZXRfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCBpbnQgbGVuIEJFX1BBUiggaW50IHdvcmRfbGVuICkgKQorKi5QVVJQT1NFCQlyZWFkcyB3aXRoIDE2LzMyIGJpdCBJL08gdmlhIEJBUDEgcG9ydCBmcm9tIE5JQyBSQU0gdG8gSG9zdCBtZW1vcnkuCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyoJYnVmcAkJKGJ5dGUpIGFkZHJlc3Mgb2YgYnVmZmVyCisqCWxlbgkJCWxlbmd0aCBpbiBieXRlcyBvZiBidWZmZXIgc3BlY2lmaWVkIGJ5IGJ1ZnAKKyoJd29yZF9sZW4JQmlnIEVuZGlhbiBvbmx5OiBudW1iZXIgb2YgbGVhZGluZyBieXRlcyB0byBzd2FwIGluIHBhaXJzCisqCisqLlJFVFVSTlMJCU4uQS4KKyoKKyouREVTQ1JJUFRJT04KKyogcHJvY2VzcyB0aGUgc2luZ2xlIGJ5dGUgKGlmIGFwcGxpY2FibGUpIHJlYWQgYnkgdGhlIHByZXZpb3VzIGdldF9mcmFnIGFuZCBjb3B5IGxlbiAob3IgbGVuLTEpIGJ5dGVzIGZyb20KKyogTklDIHRvIGJ1ZnAuCisqIE9uIGEgQmlnIEVuZGlhbiBwbGF0Zm9ybSwgdGhlIHBhcmFtZXRlciB3b3JkX2xlbiBjb250cm9scyB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgYnl0ZXMgd2hvc2UgZW5kaWFuZXNzIGlzCisqIGNvbnZlcnRlZCAoaS5lLiBieXRlIHN3YXBwZWQpCisqCisqCisqLkRJQUdSQU0KKyoxMDogVGhlIFBDTUNJQSBjYXJkIGNhbiBiZSByZW1vdmVkIGluIHRoZSBtaWRkbGUgb2YgdGhlIHRyYW5zZmVyLiBCeSBkZXBvc2l0aW5nIGEgIm1hZ2ljIG51bWJlciIgaW4gdGhlCisqCUhSRUdfU1dfMCByZWdpc3RlciBvZiB0aGUgSGVybWVzIGF0IGluaXRpYWxpemF0aW9uIHRpbWUgYW5kIGJ5IHZlcmlmeWluZyB0aGlzIHJlZ2lzdGVyLCBpdCBjYW4gYmUKKyoJZGV0ZXJtaW5lZCB3aGV0aGVyIHRoZSBjYXJkIGlzIHN0aWxsIHByZXNlbnQuIFRoZSByZXR1cm4gc3RhdHVzIGlzIHNldCBhY2NvcmRpbmdseS4KKyoJQ2xlYXJpbmcgdGhlIGJ1ZmZlciBpcyBhIChyZWxhdGl2ZSkgY2hlYXAgd2F5IHRvIHByZXZlbnQgdGhhdCBmYWlsaW5nIEkvTyByZXN1bHRzIGluIHJ1bi1hd2F5IGJlaGF2aW9yCisqCWJlY2F1c2UgdGhlIGdhcmJhZ2UgaW4gdGhlIGJ1ZmZlciBpcyBpbnRlcnByZXRlZCBieSB0aGUgY2FsbGVyIGlycmVzcGVjdGl2ZSBvZiB0aGUgcmV0dXJuIHN0YXR1cyAoZS5nLgorKgloY2Zfc2VydmljZV9uaWMgaGFzIHRoaXMgYmVoYXZpb3IpLgorKgorKi5OT1RJQ0UKKyoJSXQgdHVybnMgb3V0IERPUyBPREkgdXNlcyB6ZXJvIGxlbmd0aCBmcmFnbWVudHMuIFRoZSBIQ0YgY29kZSBjYW4gY29wZSB3aXRoIGl0LCBidXQgYXMgYSBjb25zZXF1ZW5jZSwgbm8KKyoJQXNzZXJ0IG9uIGxlbiBpcyBwb3NzaWJsZQorKgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hDRl9TVEFUSUMgdm9pZAorZ2V0X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgYnVmcCwgaW50IGxlbiBCRV9QQVIoIGludCB3b3JkX2xlbiApICkKK3sKK2hjZl9pbwkJaW9fcG9ydCA9IGlmYnAtPklGQl9JT0Jhc2UgKyBIUkVHX0RBVEFfMTsJLy9CQVAgZGF0YSByZWdpc3Rlcgord2NpX2J1ZnAJcCA9IGJ1ZnA7CQkJCQkJCQkJLy93b3JraW5nIHBvaW50ZXIKK2ludAkJCWk7CQkJCQkJCQkJCQkvL3ByZXZlbnQgc2lkZSBlZmZlY3RzIGZyb20gbWFjcm8KK2ludAkJCWo7CisKKwlIQ0ZBU1NFUlQoICgoaGNmXzMyKWJ1ZnAgJiAoSENGX0FMSUdOLTEpICkgPT0gMCwgKGhjZl8zMilidWZwICkKKworLyoxOgloZXJlIHJlY292ZXJ5IGxvZ2ljIGZvciBpbnRlcnZlbmluZyBCQVAgYWNjZXNzIGJldHdlZW4gaGNmX3NlcnZpY2VfbmljIGFuZCBoY2ZfcmN2X21zZyBDT1VMRCBiZSBhZGRlZAorICogCWlmIGN1cnJlbnQgYWNjZXNzIGlzIFJ4SW5pdGlhbAorICogCS4gIHBlcnNpc3RlbnRfb2Zmc2V0ICs9IGxlbgorICovCisKKwlpID0gbGVuOworCQkJCQkJCQkJCQkJCS8vaWYgYnVmZmVyIGxlbmd0aCA+IDAgYW5kIGNhcnJ5IGZyb20gcHJldmlvdXMgZ2V0X2ZyYWcKKwlpZiAoIGkgJiYgaWZicC0+SUZCX0NhcnJ5SW4gKSB7CisJCQkJCQkJCQkJCQkJLy8uICBtb3ZlIGNhcnJ5IHRvIGJ1ZmZlcgorCQkJCQkJCQkJCQkJCS8vLiAgYWRqdXN0IGJ1ZmZlciBsZW5ndGggYW5kIHBvaW50ZXIgYWNjb3JkaW5nbHkKKwkJKnArKyA9IChoY2ZfOCkoaWZicC0+SUZCX0NhcnJ5SW4+PjgpOworCQlpLS07CisJCQkJCQkJCQkJCQkJLy8uICBjbGVhciBjYXJyeSBmbGFnCisJCWlmYnAtPklGQl9DYXJyeUluID0gMDsKKwl9CisjaWYgKEhDRl9JTykgJiBIQ0ZfSU9fMzJCSVRTCisJLy9za2lwIHplcm8tbGVuZ3RoIEkvTywgc2luZ2xlIGJ5dGUgSS9PIGFuZCBJL08gbm90IHdvcnRod2hpbGUgKGkuZS4gbGVzcyB0aGFuIDYgYnl0ZXMpZm9yIERXIGxvZ2ljCisJCQkJCQkJCQkJCQkJLy9pZiBidWZmZXIgbGVuZ3RoID49IDYgYW5kIDMyIGJpdHMgSS9PIHN1cHBvcnQKKwlpZiAoICEoaWZicC0+SUZCX0NudGxPcHQgJiBVU0VfMTZCSVQpICYmIGkgPj0gNiApIHsKK2hjZl8zMiBGQVIJKnA0OyAvL3ByZXZlbnQgc2lkZSBlZmZlY3RzIGZyb20gbWFjcm8KKwkJaWYgKCAoIChoY2ZfMzIpcCAmIDB4MSApID09IDAgKSB7CQkJLy8uICBpZiBidWZmZXIgYXQgbGVhc3Qgd29yZCBhbGlnbmVkCisJCQlpZiAoIChoY2ZfMzIpcCAmIDB4MiApIHsJCQkJLy8uICAuICBpZiBidWZmZXIgbm90IGRvdWJsZSB3b3JkIGFsaWduZWQKKwkJCQkJCQkJCQkJCQkvLy4gIC4gIC4gIHJlYWQgc2luZ2xlIHdvcmQgdG8gZ2V0IGRvdWJsZSB3b3JkIGFsaWduZWQKKwkJCQkqKHdjaV9yZWNvcmRwKXAgPSBJTl9QT1JUX1dPUkQoIGlvX3BvcnQgKTsKKwkJCQkJCQkJCQkJCQkvLy4gIC4gIC4gIGFkanVzdCBidWZmZXIgbGVuZ3RoIGFuZCBwb2ludGVyIGFjY29yZGluZ2x5CisJCQkJcCArPSAyOworCQkJCWkgLT0gMjsKKwkJCX0KKwkJCQkJCQkJCQkJCQkvLy4gIC4gIHJlYWQgYXMgbWFueSBkb3VibGUgd29yZCBhcyBwb3NzaWJsZQorCQkJcDQgPSAoaGNmXzMyIEZBUiAqKXA7CisJCQlqID0gaS80OworCQkJSU5fUE9SVF9TVFJJTkdfMzIoIGlvX3BvcnQsIHA0LCBqICk7CisJCQkJCQkJCQkJCQkJLy8uICAuICBhZGp1c3QgYnVmZmVyIGxlbmd0aCBhbmQgcG9pbnRlciBhY2NvcmRpbmdseQorCQkJcCArPSBpICYgfjB4MDAwMzsKKwkJCWkgJj0gMHgwMDAzOworCQl9CisJfQorI2VuZGlmIC8vIEhDRl9JT18zMkJJVFMKKwkJCQkJCQkJCQkJCQkvL2lmIG5vIDMyLWJpdCBzdXBwb3J0IE9SIGJ5dGUgYWxpZ25lZCBPUiAxLTMgYnl0ZXMgbGVmdAorCWlmICggaSApIHsKKwkJCQkJCQkJCQkJCQkvLy4gIHJlYWQgYXMgbWFueSB3b3JkIGFzIHBvc3NpYmxlIGluICJhbGlnbm1lbnQgc2FmZSIgd2F5CisJCWogPSBpLzI7CisJCUlOX1BPUlRfU1RSSU5HXzhfMTYoIGlvX3BvcnQsIHAsIGogKTsKKwkJCQkJCQkJCQkJCQkvLy4gIGlmIDEgYnl0ZSBsZWZ0CisJCWlmICggaSAmIDB4MDAwMSApIHsKKwkJCQkJCQkJCQkJCQkvLy4gIC4gIHJlYWQgMSB3b3JkCisJCQlpZmJwLT5JRkJfQ2FycnlJbiA9IElOX1BPUlRfV09SRCggaW9fcG9ydCApOworCQkJCQkJCQkJCQkJCS8vLiAgLiAgc3RvcmUgTFNCIGluIGxhc3QgY2hhciBvZiBidWZmZXIKKwkJCWJ1ZnBbbGVuLTFdID0gKGhjZl84KWlmYnAtPklGQl9DYXJyeUluOworCQkJCQkJCQkJCQkJCS8vLiAgLiAgc2F2ZSBNU0IgaW4gY2FycnksIHNldCBjYXJyeSBmbGFnCisJCQlpZmJwLT5JRkJfQ2FycnlJbiB8PSAweDE7CisJCX0KKwl9CisjaWYgSENGX0JJR19FTkRJQU4KKwlIQ0ZBU1NFUlQoIHdvcmRfbGVuID09IDAgfHwgd29yZF9sZW4gPT0gMiB8fCB3b3JkX2xlbiA9PSA0LCB3b3JkX2xlbiApCisJSENGQVNTRVJUKCB3b3JkX2xlbiA9PSAwIHx8ICgoaGNmXzMyKWJ1ZnAgJiAxICkgPT0gMCwgKGhjZl8zMilidWZwICkKKwlIQ0ZBU1NFUlQoIHdvcmRfbGVuIDw9IGxlbiwgTUVSR0UyKCB3b3JkX2xlbiwgbGVuICkgKQorCS8vc2VlIHB1dF9mcmFnIGZvciBhbiBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiwgYnV0IGJlIGNhcmVmdWxsIGFib3V0IHdoYXQgYXJlIGludCdzIGFuZCB3aGF0IGFyZQorCS8vaGNmXzE2J3MKKwlpZiAoIHdvcmRfbGVuICkgewkJCQkJCQkJLy8uICBpZiB0aGVyZSBpcyBhbnl0aGluZyB0byBjb252ZXJ0CitoY2ZfOCBjOworCQljID0gYnVmcFsxXTsJCQkJCQkJCS8vLiAgLiAgY29udmVydCB0aGUgMXN0IGhjZl8xNgorCQlidWZwWzFdID0gYnVmcFswXTsKKwkJYnVmcFswXSA9IGM7CisJCWlmICggd29yZF9sZW4gPiAxICkgewkJCQkJCS8vLiAgLiAgaWYgdGhlcmUgaXMgdG8gY29udmVydCBtb3JlIHRoYW4gMSB3b3JkICggaS5lIDIgKQorCQkJYyA9IGJ1ZnBbM107CQkJCQkJCS8vLiAgLiAgLiAgY29udmVydCB0aGUgMm5kIGhjZl8xNgorCQkJYnVmcFszXSA9IGJ1ZnBbMl07CisJCQlidWZwWzJdID0gYzsKKwkJfQorCX0KKyNlbmRpZiAvLyBIQ0ZfQklHX0VORElBTgorfSAvLyBnZXRfZnJhZworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLlNVQk1PRFVMRQkJaW50IGluaXQoIElGQlAgaWZicCApCisqLlBVUlBPU0UJCUhhbmRsZXMgY29tbW9uIGluaXRpYWxpemF0aW9uIGFzcGVjdHMgKEgtSSBpbml0LCBjYWxpYnJhdGlvbiwgY29uZmlnLm1uZ210LCBhbGxvY2F0aW9uKS4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKgorKi5SRVRVUk5TCisqCUhDRl9FUlJfSU5DT01QX1BSSQorKglIQ0ZfRVJSX0lOQ09NUF9GVworKglIQ0ZfRVJSX1RJTUVfT1VUCisqCT4+aGNmX2dldF9pbmZvCisqCQlIQ0ZfRVJSX05PX05JQworKgkJSENGX0VSUl9MRU4KKyoKKyouREVTQ1JJUFRJT04KKyogaW5pdCB3aWxsIHN1Y2Nlc3NpdmVseToKKyogLSBpbiBjYXNlIG9mIGEgKG5vbi1wcmVsb2FkZWQpIEgtSSwgaW5pdGlhbGl6ZSB0aGUgTklDCisqIC0gY2FsaWJyYXRlIHRoZSBTL1cgcHJvdGVjdGlvbiB0aW1lciBhZ2FpbnN0IHRoZSBIZXJtZXMgVGltZXIKKyogLSBjb2xsZWN0IEhTSSwgImFjdGl2ZSIgRi9XIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudCBJbmZvcm1hdGlvbgorKiAtIGluIGNhc2UgYWN0aXZlIEYvVyBpcyBQcmltYXJ5IEYvVzogY29sbGVjdCBQcmltYXJ5IEYvVyBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQgSW5mb3JtYXRpb24KKyogLSBjaGVjayBIU0kgYW5kIFByaW1hcnkgRi9XIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgSENGCisqIC0gaW4gY2FzZSBhY3RpdmUgRi9XIGlzIFN0YXRpb24gb3IgQVAgRi9XOiBjaGVjayBTdGF0aW9uIG9yIEFQIEYvVyBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEhDRgorKiAtIGluIGNhc2UgYWN0aXZlIEYvVyBpcyBub3QgUHJpbWFyeSBGL1c6IGFsbG9jYXRlIEZJRHMgdG8gYmUgdXNlZCBpbiB0cmFuc21pdC9ub3RpZnkgcHJvY2VzcworKgorKgorKi5ESUFHUkFNCisqMjoJZHJvcCBhbGwgZXJyb3Igc3RhdHVzIGJpdHMgaW4gSUZCX0NhcmRTdGF0IHNpbmNlIHRoZXkgYXJlIGV4cGVjdGVkIHRvIGJlIHJlLWV2YWx1YXRlZC4KKyo0OglBY2sgZXZlcnl0aGluZyBleGNlcHQgSFJFR19FVl9TTEVFUF9SRVEuIEl0IGlzIHZlcnkgbGlrZWx5IHRoYXQgYW4gQWxsb2MgZXZlbnQgaXMgcGVuZGluZyBhbmQKKyoJdmVyeSB3ZWxsIHBvc3NpYmxlIHRoYXQgYSBTZW5kIENtZCBldmVudCBpcyBwZW5kaW5nLiBBY2tpbmcgSFJFR19FVl9TTEVFUF9SRVEgaXMgaGFuZGxlZCBieSBoY2ZfYWN0aW9uKAorKglIQ0ZfQUNUX0lOVF9PTiApICEhIQorKjEwOiBDYWxpYnJhdGUgdGhlIFMvVyB0aW1lLW91dCBwcm90ZWN0aW9uIG1lY2hhbmlzbSBieSBjYWxsaW5nIGNhbGlicmF0ZSgpLiBOb3RlIHRoYXQgcG9zc2libGUgZXJyb3JzCisqCWluIHRoZSBjYWxpYnJhdGlvbiBwcm9jZXNzIGFyZSBub3IgcmVwb3J0ZWQgYnkgaW5pdCBidXQgd2lsbCBzaG93IHVwIHZpYSB0aGUgZGVmdW5jdCBtZWNoYW5pc20gaW4KKyoJc3Vic2VxdWVudCBoY2YtY2FsbHMuCisqMTQ6IHVzYl9jaGVja19jb21wKCkgaXMgY2FsbGVkIHRvIGhhdmUgdGhlIG1pbmltYWwgdmlzdWFsIGNsdXR0ZXIgZm9yIHRoZSBsZWdhY3kgSC1JIFVTQiBkb25nbGUKKyoJY29tcGF0aWJpbGl0eSBjaGVjay4KKyoxNjogVGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnQgcmVsYXRlZCBpbmZvcm1hdGlvbiBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgTklDOgorKgkgLSBIU0kgc3VwcGxpZXIKKyoJIC0gRi9XIElkZW50aXR5CisqCSAtIEYvVyBzdXBwbGllcgorKgkgaWYgYXBwcm9wcmlhdGU6CisqCSAtIFBSSSBJZGVudGl0eQorKgkgLSBQUkkgc3VwcGxpZXIKKyoJIGFwcHJvcHJpYXRlIG1lYW5zIG9uIEgtSTogYWx3YXlzCisqCSBhbmQgb24gSC1JSSBpZiBGL1cgc3VwcGxpZXIgcmVmbGVjdHMgYSBwcmltYXJ5IChpLmUuIG9ubHkgYWZ0ZXIgYW4gSGVybWVzIFJlc2V0IG9yIEluaXQKKyoJIGNvbW1hbmQpLgorKgkgUVVFU1RJT04gOz8gISEhISEhIHNob3VsZCwgRm9yIGVhY2ggb2YgdGhlIGFib3ZlIFJJRHMgdGhlIEVuZGlhbmVzcyBpcyBjb252ZXJ0ZWQgdG8gbmF0aXZlIEVuZGlhbmVzcy4KKyoJIE9ubHkgdGhlIHJldHVybiBjb2RlIG9mIHRoZSBmaXJzdCBoY2ZfZ2V0X2luZm8gaXMgdXNlZC4gQWxsIGhjZl9nZXRfaW5mbyBjYWxscyBhcmUgbWFkZSwgcmVnYXJkbGVzcyBvZgorKgkgdGhlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiB0aGUgMXN0IGhjZl9nZXRfaW5mby4gVGhlIGFzc3VtcHRpb25zIGFyZToKKyoJICAtIGlmIGFueSBjYWxsIGZhaWxzLCB0aGV5IGFsbCBmYWlsLCBzbyByZW1lbWJlcmluZyB0aGUgcmVzdWx0IG9mIHRoZSAxc3QgY2FsbCBpcyBhZGVxdWF0ZQorKgkgIC0gYSBmYWlsaW5nIGNhbGwgd2lsbCBvdmVyd3JpdGUgdGhlIEwtZmllbGQgd2l0aCBhIDB4MDAwMCB2YWx1ZSwgd2hpY2ggc2VydmljZXMgYm90aCBhcyBhbgorKgkJZXJyb3IgaW5kaWNhdGlvbiBmb3IgdGhlIHZhbHVlcyBjYWNoZWQgaW4gdGhlIElGQiBhcyBtYWtpbmcgbW1kX2NoZWNrX2NvbXAgZmFpbC4KKyoJIEluIGNhc2Ugb2YgSC1JLCB3aGVuIGdldHRpbmcgdGhlIEYvVyBpZGVudGl0eSBmYWlscywgdGhlIEYvVyBpcyBhc3N1bWVkIHRvIGJlIEgtSSBBUCBGL1cgcHJlLWRhdGluZworKgkgdmVyc2lvbiA5LjAgYW5kIHRoZSBGL1cgSWRlbnRpdHkgYW5kIFN1cHBsaWVyIGFyZSBmYWtlZCBhY2NvcmRpbmdseS4KKyoJIEluIGNhc2Ugb2YgSC1JSSwgdGhlIFByaW1hcnksIFN0YXRpb24gYW5kIEFQIElkZW50aXR5IGFyZSBtZXJnZWQgaW50byBhIHNpbmdsZSBGL1cgSWRlbnRpdHkuCisqCSBUaGUgc2FtZSBhcHBsaWVzIHRvIHRoZSBTdXBwbGllciBpbmZvcm1hdGlvbi4gQXMgYSBjb25zZXF1ZW5jZSB0aGUgUFJJIGluZm9ybWF0aW9uIGNhbiBubyBsb25nZXIgYmUKKyoJIHJldHJpZXZlZCB3aGVuIGEgVGVydGlhcnkgcnVucy4gVG8gYWNjb21tb2RhdGUgTVNGcyBhbmQgVXRpbGl0aWVzIHdobyBkZXBlbmQgb24gUFJJIGluZm9ybWF0aW9uIGJlaW5nCisqCSBhdmFpbGFibGUgYXQgYW55IHRpbWUsIHRoaXMgaW5mb3JtYXRpb24gaXMgY2FjaGVkIGluIHRoZSBJRkIuIEluIHRoaXMgY2FjaGUgdGhlIGdlbmVyaWMgIkYvVyIgdmFsdWUgb2YKKyoJIHRoZSB0eXAtZmllbGRzIGlzIG92ZXJ3cml0dGVuIHdpdGggdGhlIHNwZWNpZmljIChsZWdhY3kpICJQUkkiIHZhbHVlcy4gVG8gYWN0dWFsbHkgcmUtcm91dGUgdGhlIChsZWdhY3kpCisqCSBQUkkgcmVxdWVzdCB2aWEgaGNmX2dldF9pbmZvLCB0aGUgeHh4eC10YWJsZSBtdXN0IGJlIHNldC4gIEluIGNhc2Ugb2YgSC1JLCB0aGlzIGNhY2hpbmcsIG1vZGlmeWluZyBhbmQKKyoJIHJlLXJvdXRpbmcgaXMgbm90IG5lZWRlZCBiZWNhdXNlIFBSSSBpbmZvcm1hdGlvbiBpcyBhbHdheXMgYXZhaWxhYmxlIGRpcmVjdGx5IGZyb20gdGhlIE5JQy4gRm9yCisqCSBjb25zaXN0ZW5jeSB0aGUgY2FjaGluZyBmaWVsZHMgaW4gdGhlIElGQiBhcmUgZmlsbGVkIHdpdGggdGhlIFBSSSBpbmZvcm1hdGlvbiBhbnl3YXkuCisqMTg6IG1kZF9jaGVja19jb21wKCkgaXMgY2FsbGVkIHRvIGNoZWNrIHRoZSBTdXBwbGllciBWYXJpYW50IGFuZCBSYW5nZSBvZiB0aGUgSG9zdC1TL1cgSS9GIChIU0kpIGFuZCB0aGUKKyoJUHJpbWFyeSBGaXJtd2FyZSBWYXJpYW50IGFuZCBSYW5nZSBhZ2FpbnN0IHRoZSBUb3AgYW5kIEJvdHRvbSBsZXZlbCBzdXBwb3J0ZWQgYnkgdGhpcyBIQ0YuICBJZiBlaXRoZXIgb2YKKyoJdGhlc2UgdGVzdHMgZmFpbHMsIHRoZSBDQVJEX1NUQVRfSU5DT01QX1BSSSBiaXQgb2YgSUZCX0NhcmRTdGF0IGlzIHNldAorKglOb3RlOiBUaGVyZSBzaG91bGQgYWx3YXlzIGJlIGEgcHJpbWFyeSBleGNlcHQgZHVyaW5nIHByb2R1Y3Rpb24sIHNvIHRoaXMgbWFrZXMgdGhlIEhDRiBpbiBpdHMgY3VycmVudCBmb3JtCisqCXVuc3VpdGFibGUgZm9yIG1hbnVmYWN0dXJpbmcgdGVzdCBzeXN0ZW1zIGxpa2UgdGhlIEZUUy4gVGhpcyBjYW4gYmUgcmVtZWRpZWQgYnkgYW4gYWRkaW5nIGEgdGVzdCBsaWtlCisqCWlmYnAtPklGQl9QUklTdXAuaWQgPT0gQ09NUF9JRF9QUkkKKyoyMDogSW4gY2FzZSB0aGVyZSBpcyBUZXJ0aWFyeSBGL1cgYW5kIHRoaXMgRi9XIGlzIFN0YXRpb24gRi9XLCB0aGUgU3VwcGxpZXIgVmFyaWFudCBhbmQgUmFuZ2Ugb2YgdGhlIFN0YXRpb24KKyoJRmlybXdhcmUgZnVuY3Rpb24gYXMgcmV0cmlldmVkIGZyb20gdGhlIEhlcm1lcyBpcyBjaGVja2VkIGFnYWluc3QgdGhlIFRvcCBhbmQgQm90dG9tIGxldmVsIHN1cHBvcnRlZCBieQorKgl0aGlzIEhDRi4KKyoJTm90ZTogOz8gdGhlIHRlcnRpYXJ5IEYvVyBjb21wYXRpYmlsaXR5IGNoZWNrcyBjb3VsZCBiZSBtb3ZlZCB0byB0aGUgREhGLCB3aGljaCBhbHJlYWR5IGhhcyBjaGVja2VkIHRoZQorKglDRkkgYW5kIE1GSSBjb21wYXRpYmlsaXR5IG9mIHRoZSBpbWFnZSB3aXRoIHRoZSBOSUMgYmVmb3JlIHRoZSBpbWFnZSB3YXMgZG93bmxvYWRlZC4KKyoyODogSW4gY2FzZSBvZiBub24tUHJpbWFyeSBGL1c6IGFsbG9jYXRlcyBhbmQgYWNrbm93bGVkZ2UgYSAoVFggb3IgTm90aWZ5KSBGSUQgYW5kIGFsbG9jYXRlcyB3aXRob3V0CisqCWFja25vd2xlZGdlIGFub3RoZXIgKFRYIG9yIE5vdGlmeSkgRklEICh0aGUgc28tY2FsbGVkIDEuNSBhbGxvYyBzY2hlbWUpIHdpdGggdGhlIGZvbGxvd2luZyBzdGVwczoKKyoJLSBleGVjdXRlIHRoZSBhbGxvY2F0ZSBjb21tYW5kIGJ5IGNhbGxpbmcgY21kX2V4ZQorKgktIHdhaXQgdGlsbCBlaXRoZXIgdGhlIGFsbG9jIGV2ZW50IG9yIGEgdGltZS1vdXQgb2NjdXJzCisqCS0gcmVnYXJkbGVzcyB3aGV0aGVyIHRoZSBhbGxvYyBldmVudCBvY2N1cnMsIGNhbGwgZ2V0X2ZpZCB0bworKgkgIC0gcmVhZCB0aGUgRklEIGFuZCBzYXZlIGl0IGluIElGQl9Sc2NJbmQgdG8gYmUgdXNlZCBhcyAic3BhcmUgRklEIgorKgkgIC0gYWNrbm93bGVkZ2UgdGhlIGFsbG9jIGV2ZW50CisqCSAgLSBkbyBhbm90aGVyICJoYWxmIiBhbGxvY2F0ZSB0byBjb21wbGV0ZSB0aGUgIjEuNSBBbGxvYyBzY2hlbWUiCisqCSAgTm90ZSB0aGF0IGFib3ZlIDMgc3RlcHMgZG8gbm90IGhhcm0gYW5kIHRodXMgZ2l2ZSB0aGUgImNoZWFwZXN0IiBhY2NlcHRhYmxlIHN0cmF0ZWd5LgorKgkgIElmIGEgdGltZS1vdXQgb2NjdXJyZWQsIHRoZW4gcmVwb3J0IHRpbWUgb3V0IHN0YXR1cyAoYWZ0ZXIgYWxsKQorKgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hDRl9TVEFUSUMgaW50Citpbml0KCBJRkJQIGlmYnAgKQoreworCitpbnQJcmMgPSBIQ0ZfU1VDQ0VTUzsKKworCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfSU5JVCwgMCApCisKKwlpZmJwLT5JRkJfQ2FyZFN0YXQgPSAwOwkJCQkJCQkJCQkJCQkJCQkJCQkvKiAyKi8KKwlPUFcoIEhSRUdfRVZfQUNLLCB+SFJFR19FVl9TTEVFUF9SRVEgKTsgCQkJCQkJCQkJCQkvKiA0Ki8KKwlJRl9QUk9UX1RJTUUoIGNhbGlicmF0ZSggaWZicCApOyApIAkJCQkJCQkJCQkJCQkvKjEwKi8KKyNpZiAwIC8vIE9PUgorCWlmYnAtPklGQl9GV0lkZW50aXR5LmxlbiA9IDI7CQkJCQkJCS8vbWlzdXNlIHRoZSBJRkIgc3BhY2UgZm9yIGEgcHV0CisJaWZicC0+SUZCX0ZXSWRlbnRpdHkudHlwID0gQ0ZHX1RJQ0tfVElNRTsKKwlpZmJwLT5JRkJfRldJZGVudGl0eS5jb21wX2lkID0gKDEwMDAqMTAwMCkvMTAyNCArIDE7CS8vcm91Z2hseSAxIHNlY29uZAorCWhjZl9wdXRfaW5mbyggaWZicCwgKExUVlApJmlmYnAtPklGQl9GV0lkZW50aXR5LmxlbiApOworI2VuZGlmIC8vIE9PUgorCWlmYnAtPklGQl9GV0lkZW50aXR5LmxlbiA9IHNpemVvZihDRkdfRldfSURFTlRJVFlfU1RSQ1QpL3NpemVvZihoY2ZfMTYpIC0gMTsKKwlpZmJwLT5JRkJfRldJZGVudGl0eS50eXAgPSBDRkdfRldfSURFTlRJVFk7CisJcmMgPSBoY2ZfZ2V0X2luZm8oIGlmYnAsIChMVFZQKSZpZmJwLT5JRkJfRldJZGVudGl0eS5sZW4gKTsKKy8qIDs/IGNvbnZlcnNpb24gc2hvdWxkIG5vdCBiZSBuZWVkZWQgZm9yIG1tZF9jaGVja19jb21wICovCisjaWYgSENGX0JJR19FTkRJQU4KKwlpZmJwLT5JRkJfRldJZGVudGl0eS5jb21wX2lkICAgICAgID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApOworCWlmYnAtPklGQl9GV0lkZW50aXR5LnZhcmlhbnQgICAgICAgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfRldJZGVudGl0eS52YXJpYW50ICk7CisJaWZicC0+SUZCX0ZXSWRlbnRpdHkudmVyc2lvbl9tYWpvciA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9GV0lkZW50aXR5LnZlcnNpb25fbWFqb3IgKTsKKwlpZmJwLT5JRkJfRldJZGVudGl0eS52ZXJzaW9uX21pbm9yID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0ZXSWRlbnRpdHkudmVyc2lvbl9taW5vciApOworI2VuZGlmIC8vIEhDRl9CSUdfRU5ESUFOCisjaWYgZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lECQkJCQkJCQkJCQkJCQkJCQkJLyoxNCovCisJaWYgKCByYyA9PSBIQ0ZfU1VDQ0VTUyApIHsJCQkJCQkJCQkJCQkJCQkJCQkvKjE2Ki8KKwkJaWZicC0+SUZCX0hTSVN1cC5sZW4gPSBzaXplb2YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCkvc2l6ZW9mKGhjZl8xNikgLSAxOworCQlpZmJwLT5JRkJfSFNJU3VwLnR5cCA9IENGR19OSUNfSFNJX1NVUF9SQU5HRTsKKwkJcmMgPSBoY2ZfZ2V0X2luZm8oIGlmYnAsIChMVFZQKSZpZmJwLT5JRkJfSFNJU3VwLmxlbiApOworLyogOz8gY29udmVyc2lvbiBzaG91bGQgbm90IGJlIG5lZWRlZCBmb3IgbW1kX2NoZWNrX2NvbXAgLCBCVVQgYWNjb3JkaW5nIHRvIGEgcmVwb3J0IG9mIGEgQkUtdXNlciBpdCBpcworICogc2hvdWxkIGJlIHJlc29sdmVkIGluIHRoZSBXQVJQIHJlbGVhc2UKKyAqIHNpbmNlIHNvbWUgY29tcGlsZXJzIG1ha2UgdWdseSBidXQgdW5uZWNlc3NhcnkgY29kZSBvZiB0aGVzZSBpbnN0cnVjdGlvbnMgZXZlbiBmb3IgTEUsCisgKiBpdCBpcyBjb25kaXRpb25hbGx5IGNvbXBpbGVkICovCisjaWYgSENGX0JJR19FTkRJQU4KKwkJaWZicC0+SUZCX0hTSVN1cC5yb2xlICAgID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0hTSVN1cC5yb2xlICk7CisJCWlmYnAtPklGQl9IU0lTdXAuaWQgICAgICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9IU0lTdXAuaWQgKTsKKwkJaWZicC0+SUZCX0hTSVN1cC52YXJpYW50ID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0hTSVN1cC52YXJpYW50ICk7CisJCWlmYnAtPklGQl9IU0lTdXAuYm90dG9tICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9IU0lTdXAuYm90dG9tICk7CisJCWlmYnAtPklGQl9IU0lTdXAudG9wICAgICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9IU0lTdXAudG9wICk7CisjZW5kaWYgLy8gSENGX0JJR19FTkRJQU4KKwkJaWZicC0+SUZCX0ZXU3VwLmxlbiA9IHNpemVvZihDRkdfU1VQX1JBTkdFX1NUUkNUKS9zaXplb2YoaGNmXzE2KSAtIDE7CisJCWlmYnAtPklGQl9GV1N1cC50eXAgPSBDRkdfRldfU1VQX1JBTkdFOworCQkodm9pZCloY2ZfZ2V0X2luZm8oIGlmYnAsIChMVFZQKSZpZmJwLT5JRkJfRldTdXAubGVuICk7CisvKiA7PyBjb252ZXJzaW9uIHNob3VsZCBub3QgYmUgbmVlZGVkIGZvciBtbWRfY2hlY2tfY29tcCAqLworI2lmIEhDRl9CSUdfRU5ESUFOCisJCWlmYnAtPklGQl9GV1N1cC5yb2xlICAgID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0ZXU3VwLnJvbGUgKTsKKwkJaWZicC0+SUZCX0ZXU3VwLmlkICAgICAgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfRldTdXAuaWQgKTsKKwkJaWZicC0+SUZCX0ZXU3VwLnZhcmlhbnQgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfRldTdXAudmFyaWFudCApOworCQlpZmJwLT5JRkJfRldTdXAuYm90dG9tICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9GV1N1cC5ib3R0b20gKTsKKwkJaWZicC0+SUZCX0ZXU3VwLnRvcCAgICAgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfRldTdXAudG9wICk7CisjZW5kaWYgLy8gSENGX0JJR19FTkRJQU4KKworCQlpZiAoIGlmYnAtPklGQl9GV1N1cC5pZCA9PSBDT01QX0lEX1BSSSApIHsJCQkJCQkJCQkJCQkvKiAyMCovCitpbnQgaSA9IHNpemVvZiggQ0ZHX0ZXX0lERU5USVRZX1NUUkNUKSArIHNpemVvZihDRkdfU1VQX1JBTkdFX1NUUkNUICk7CisJCQl3aGlsZSAoIGktLSApICgoaGNmXzgqKSgmaWZicC0+SUZCX1BSSUlkZW50aXR5KSlbaV0gPSAoKGhjZl84KikoJmlmYnAtPklGQl9GV0lkZW50aXR5KSlbaV07CisJCQlpZmJwLT5JRkJfUFJJSWRlbnRpdHkudHlwID0gQ0ZHX1BSSV9JREVOVElUWTsKKwkJCWlmYnAtPklGQl9QUklTdXAudHlwID0gQ0ZHX1BSSV9TVVBfUkFOR0U7CisJCQl4eHh4W3h4eHhfUFJJX0lERU5USVRZX09GRlNFVF0gPSAmaWZicC0+SUZCX1BSSUlkZW50aXR5LmxlbjsKKwkJCXh4eHhbeHh4eF9QUklfSURFTlRJVFlfT0ZGU0VUKzFdID0gJmlmYnAtPklGQl9QUklTdXAubGVuOworCQl9CisJCWlmICggIW1tZF9jaGVja19jb21wKCAodm9pZCopJmNmZ19kcnZfYWN0X3Jhbmdlc19oc2ksICZpZmJwLT5JRkJfSFNJU3VwKQkJCQkgLyogMjIqLworI2lmICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1BSRUxPQURFRCApID09IDAKKy8vOz8gdGhlIFBSSSBjb21wYXRpYmlsaXR5IGNoZWNrIGlzIG9ubHkgcmVsZXZhbnQgZm9yIERIRgorCQkJIHx8ICFtbWRfY2hlY2tfY29tcCggKHZvaWQqKSZjZmdfZHJ2X2FjdF9yYW5nZXNfcHJpLCAmaWZicC0+SUZCX1BSSVN1cCkKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9QUkVMT0FERUQKKwkJICAgKSB7CisJCQlpZmJwLT5JRkJfQ2FyZFN0YXQgPSBDQVJEX1NUQVRfSU5DT01QX1BSSTsKKwkJCXJjID0gSENGX0VSUl9JTkNPTVBfUFJJOworCQl9CisJCWlmICggKCBpZmJwLT5JRkJfRldTdXAuaWQgPT0gQ09NUF9JRF9TVEEgJiYJIW1tZF9jaGVja19jb21wKCAodm9pZCopJmNmZ19kcnZfYWN0X3Jhbmdlc19zdGEsICZpZmJwLT5JRkJfRldTdXApICkgfHwKKwkJCSAoIGlmYnAtPklGQl9GV1N1cC5pZCA9PSBDT01QX0lEX0FQRiAmJiAhbW1kX2NoZWNrX2NvbXAoICh2b2lkKikmY2ZnX2Rydl9hY3RfcmFuZ2VzX2FwZiwgJmlmYnAtPklGQl9GV1N1cCkgKQorCQkgICApIHsJCQkJCQkJCQkJCQkJCQkJCQkJCQkvKiAyNCAqLworCQkJaWZicC0+SUZCX0NhcmRTdGF0IHw9IENBUkRfU1RBVF9JTkNPTVBfRlc7CisJCQlyYyA9IEhDRl9FUlJfSU5DT01QX0ZXOworCQl9CisJfQorI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQKKyNpZiAoSENGX0RMX09OTFkpID09IDAJCQkJCQkJCQkJCQkJCQkJCQkJLyogMjggKi8KKwlpZiAoIHJjID09IEhDRl9TVUNDRVNTICYmIGlmYnAtPklGQl9GV0lkZW50aXR5LmNvbXBfaWQgPj0gQ09NUF9JRF9GV19TVEEgKSB7CitQUk9UX0NOVF9JTkkKKwkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCSogcmxhdjogdGhlIERNQSBlbmdpbmUgbmVlZHMgdGhlIGhvc3QgdG8gY2F1c2UgYSAnaGFuZ2luZyBhbGxvYyBldmVudCcgZm9yIGl0IHRvIGNvbnN1bWUuCisJCSogbm90IHN1cmUgaWYgdGhpcyBpcyB0aGUgcmlnaHQgc3BvdCBpbiB0aGUgSENGLCB0aGlua2luZyBhYm91dCBoY2ZfZW5hYmxlLi4uCisJCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCQlyYyA9IGNtZF9leGUoIGlmYnAsIEhDTURfQUxMT0MsIDAgKTsKKy8vIDE4MCBkZWdyZWUgZXJyb3IgaW4gbG9naWMgOz8gI2lmIEFMTE9DXzE1CisvLwkJaWZicC0+SUZCX1JzY0luZCA9IDE7CS8vbGV0J3MgaG9wZSB0aGF0IGJ5IHRoZSB0aW1lIGhjZl9zZW5kX21zZyBpc2EgY2FsbGVkLCB0aGVyZSB3aWxsIGJlIGEgRklECisvLyNlbHNlCisJCWlmICggcmMgPT0gSENGX1NVQ0NFU1MgKSB7CisJCQlIQ0ZfV0FJVF9XSElMRSggKElQVyggSFJFR19FVl9TVEFUICkgJiBIUkVHX0VWX0FMTE9DKSA9PSAwICk7CisJCQlJRl9QUk9UX1RJTUUoIEhDRkFTU0VSVChwcm90X2NudCwgSVBXKCBIUkVHX0VWX1NUQVQgKSApIC8qTk9QKi87KQorI2lmIEhDRl9ETUEKKwkJCWlmICggISAoIGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFX0RNQSApICkKKyNlbmRpZiAvLyBIQ0ZfRE1BCisJCQl7CisJCQkJaWZicC0+SUZCX1JzY0luZCA9IGdldF9maWQoIGlmYnAgKTsKKwkJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9Sc2NJbmQsIDAgKQorCQkJCWNtZF9leGUoIGlmYnAsIEhDTURfQUxMT0MsIDAgKTsKKwkJCQlJRl9QUk9UX1RJTUUoIGlmICggcHJvdF9jbnQgPT0gMCApIHJjID0gSENGX0VSUl9USU1FX09VVDsgKQorCQkJfQorCQl9CisvLyNlbmRpZiAvLyBBTExPQ18xNQorCX0KKyNlbmRpZiAvLyBIQ0ZfRExfT05MWQorCUhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIHJjICkKKwlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfSU5JVCApCisJcmV0dXJuIHJjOworfSAvLyBpbml0CisKKyNpZiAoSENGX0RMX09OTFkpID09IDAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouU1VCTU9EVUxFCQl2b2lkIGlzcl9pbmZvKCBJRkJQIGlmYnAgKQorKi5QVVJQT1NFCQloYW5kbGVzIGxpbmsgZXZlbnRzLgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqCisqLlJFVFVSTlMJCU4uQS4KKyoKKyouREVTQ1JJUFRJT04KKyoKKyoKKyouRElBR1JBTQorKjE6CUZpcnN0IHRoZSBGSUQgbnVtYmVyIGNvcnJlc3BvbmRpbmcgd2l0aCB0aGUgSW5mb0V2ZW50IGlzIGRldGVybWluZWQuCisqCU5vdGUgdGhlIGNvbXBsaWNhdGlvbiBvZiB0aGUgemVyby1GSUQgcHJvdGVjdGlvbiBzdWItc2NoZW1lIGluIERBV0EuCisqCU5leHQgdGhlIEwtZmllbGQgYW5kIHRoZSBULWZpZWxkIGFyZSBmZXRjaGVkIGludG8gc2NyYXRjaCBidWZmZXIgaW5mby4KKyoyOglJbiBjYXNlIG9mIHRhbGxpZXMsIHRoZSAxNiBiaXRzIEhlcm1lcyB2YWx1ZXMgYXJlIGFjY3VtdWxhdGVkIGluIHRoZSBJRkIgaW50byAzMiBiaXRzIHZhbHVlcy4gSW5mb1swXQorKglpcyAoZXhwZWN0ZWQgdG8gYmUpIEhDRl9OSUNfVEFMX0NOVCArIDEuIFRoZSBjb250cmFwdGlvbiAid2hpbGUgKCBpbmZvWzBdLS0gPjEgKSIgcmF0aGVyIHRoYW4KKyoJIndoaWxlICggLS1pbmZvWzBdICkiIGlzIHVzZWQgYmVjYXVzZSBpdCBpcyBkYW5nZXJvdXMgdG8gZGV0ZXJtaW5lIHRoZSBsZW5ndGggb2YgdGhlIFZhbHVlIGZpZWxkIGJ5CisqCWRlY3JlbWVudGluZyBpbmZvWzBdLiBBcyBhIHJlc3VsdCBvZiBhIGJ1ZyBpbiBzb21lIHZlcnNpb24gb2YgdGhlIEYvVywgaW5mb1swXSBtYXkgYmUgMCwgcmVzdWx0aW5nCisqCWluIGEgdmVyeSBsb25nIGxvb3AgaW4gdGhlIHByZS1kZWNyZW1lbnQgbG9naWMuCisqNDoJSW4gY2FzZSBvZiBhIGxpbmsgc3RhdHVzIGZyYW1lLCB0aGUgaW5mb3JtYXRpb24gaXMgY29waWVkIHRvIHRoZSBJRkIgZmllbGQgSUZCX2xpbmtTdGF0CisqNjoJQWxsIG90aGVyIHRoYW4gVGFsbGllcyAoaW5jbHVkaW5nICJ1bmtub3duIiBvbmVzKSBhcmUgY2hlY2tlZCBhZ2FpbnN0IHRoZSBzZWxlY3Rpb24gc2V0IGJ5IHRoZSBNU0YKKyoJdmlhIENGR19SSURfTE9HLiBJZiBhIG1hdGNoIGlzIGZvdW5kIG9yIHRoZSBzZWxlY3Rpb24gc2V0IGhhcyB0aGUgd2lsZC1jYXJkIHR5cGUgKGkuZSBub24tTlVMTCBidWZmZXIKKyoJcG9pbnRlciBhdCB0aGUgdGVybWluYXRpbmcgemVyby10eXBlKSwgdGhlIGZyYW1lIGlzIGNvcGllZCB0byB0aGUgKHR5cGUtc3BlY2lmaWMpIGxvZyBidWZmZXIuCisqCU5vdGUgdGhhdCB0byBhY2N1bXVsYXRlIHRhbGxpZXMgaW50byBJRkIgQU5EIHRvIGxvZyB0aGVtIG9yIHRvIGxvZyBhIGZyYW1lIHdoZW4gYSBzcGVjaWZpYyBtYXRjaCBvY2N1cmVzCisqCUFORCBiYXNlZCBvbiB0aGUgd2lsZC1jYXJkIHNlbGVjdGlvbiwgeW91IGhhdmUgdG8gY2FsbCBzZXR1cF9iYXAgYWdhaW4gYWZ0ZXIgdGhlIDFzdCBjb3B5LgorKgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hDRl9TVEFUSUMgdm9pZAoraXNyX2luZm8oIElGQlAgaWZicCApCit7CitoY2ZfMTYJaW5mb1syXSwgZmlkOworI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfSU5GT19MT0cKK1JJRF9MT0dQCXJpZHAgPSBpZmJwLT5JRkJfUklETG9ncDsJLy9OVUxMIG9yIHBvaW50ZXIgdG8gYXJyYXkgb2YgUklEX0xPRyBzdHJ1Y3R1cmVzICh0ZXJtaW5hdGVkIGJ5IHplcm8gdHlwKQorI2VuZGlmIC8vIEhDRl9FWFRfSU5GT19MT0cKKworCUhDRlRSQUNFKCBpZmJwLCBIQ0ZfVFJBQ0VfSVNSX0lORk8gKTsJCQkJCQkJCQkJCQkJCQkJLyogMSAqLworCWZpZCA9IElQVyggSFJFR19JTkZPX0ZJRCApOworCURBV0FfWkVST19GSUQoIEhSRUdfSU5GT19GSUQgKQorCWlmICggZmlkICkgeworCQkodm9pZClzZXR1cF9iYXAoIGlmYnAsIGZpZCwgMCwgSU9fSU4gKTsKKwkJZ2V0X2ZyYWcoIGlmYnAsICh3Y2lfYnVmcClpbmZvLCA0IEJFX1BBUigyKSApOworCQlIQ0ZBU1NFUlQoIGluZm9bMF0gPD0gSENGX01BWF9MVFYgKyAxLCBNRVJHRV8yKCBpbmZvWzFdLCBpbmZvWzBdICkgKSAgLy87PyBhIHNtYWxsZXIgdmFsdWUgbWFrZXMgbW9yZSBzZW5zZQorI2lmIChIQ0ZfVEFMTElFUykgJiBIQ0ZfVEFMTElFU19OSUMJCS8vSGVybWVzIHRhbGx5IHN1cHBvcnQKKwkJaWYgKCBpbmZvWzFdID09IENGR19UQUxMSUVTICkgeworaGNmXzMyCSpwOworLyoyKi8JCWlmICggaW5mb1swXSA+IEhDRl9OSUNfVEFMX0NOVCApIHsKKwkJCQlpbmZvWzBdID0gSENGX05JQ19UQUxfQ05UICsgMTsKKwkJCX0KKwkJCXAgPSAoaGNmXzMyKikmaWZicC0+SUZCX05JQ19UYWxsaWVzOworCQkJd2hpbGUgKCBpbmZvWzBdLS0gPjEgKSAqcCsrICs9IElQVyggSFJFR19EQVRBXzEgKTsJLy9yZXF1ZXN0IG1heSByZXR1cm4gemVybyBsZW5ndGgKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gSENGX1RBTExJRVNfTklDCisJCXsKKy8qNCovCQlpZiAoIGluZm9bMV0gPT0gQ0ZHX0xJTktfU1RBVCApIHsKKwkJCQlpZmJwLT5JRkJfTGlua1N0YXQgPSBJUFcoIEhSRUdfREFUQV8xICk7CisJCQl9CisjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9JTkZPX0xPRworLyo2Ki8JCXdoaWxlICggMSApIHsKKwkJCQlpZiAoIHJpZHAtPnR5cCA9PSAwIHx8IHJpZHAtPnR5cCA9PSBpbmZvWzFdICkgeworCQkJCQlpZiAoIHJpZHAtPmJ1ZnAgKSB7CisJCQkJCQlIQ0ZBU1NFUlQoIHJpZHAtPmxlbiA+PSAyLCByaWRwLT50eXAgKQorCQkJCQkJcmlkcC0+YnVmcFswXSA9IG1pbigoaGNmXzE2KShyaWRwLT5sZW4gLSAxKSwgaW5mb1swXSApOyAJLy9zYXZlIEwKKwkJCQkJCXJpZHAtPmJ1ZnBbMV0gPSBpbmZvWzFdOwkJCQkJCS8vc2F2ZSBUCisJCQkJCQlnZXRfZnJhZyggaWZicCwgKHdjaV9idWZwKSZyaWRwLT5idWZwWzJdLCAocmlkcC0+YnVmcFswXSAtIDEpKjIgQkVfUEFSKDApICk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXJpZHArKzsKKwkJCX0KKyNlbmRpZiAvLyBIQ0ZfRVhUX0lORk9fTE9HCisJCX0KKwkJSENGVFJBQ0UoIGlmYnAsIEhDRl9UUkFDRV9JU1JfSU5GTyB8IEhDRl9UUkFDRV9FWElUICk7CisJfQorCXJldHVybjsKK30gLy8gaXNyX2luZm8KKyNlbmRpZiAvLyBIQ0ZfRExfT05MWQorCisvLworLy8KKy8vICNlbmRpZiAvLyBIQ0ZfVEFMTElFU19OSUMKKy8vIC8qNCovCWlmICggaW5mb1sxXSA9PSBDRkdfTElOS19TVEFUICkgeworLy8gCQkJaWZicC0+SUZCX0RTTGlua1N0YXQgPSBJUFcoIEhSRUdfREFUQV8xICkgfCBDRkdfTElOS19TVEFUX0NIQU5HRTsJLy9jb3JydXB0cyBCQVAgISEgOz8KKy8vIAkJCWlmYnAtPklGQl9MaW5rU3RhdCA9IGlmYnAtPklGQl9EU0xpbmtTdGF0ICYgQ0ZHX0xJTktfU1RBVF9GVzsgLy87PyB0byBiZSBvYnNvbGV0ZWQKKy8vIAkJCXByaW50ayggIjw0PmxpbmtzdGF0dXM6ICUwNHhcbiIsIGlmYnAtPklGQl9EU0xpbmtTdGF0ICk7CQkvLzs/cmVtb3ZlIG1lIDEgZGF5CisvLyAjaWYgKEhDRl9TTEVFUCkgJiBIQ0ZfRERTCisvLyAJCQlpZiAoICggaWZicC0+SUZCX0RTTGlua1N0YXQgJiBDRkdfTElOS19TVEFUX0NPTk5FQ1RFRCApID09IDAgKSB7IAkvL2V2ZW4gdmFsdWVzIGFyZSBkaXNjb25uZWN0ZWQgZXRjLgorLy8gCQkJCWlmYnAtPklGQl9UaWNrQ250ID0gMDsJCQkJLy9zdGFydCAyIHNlY29uZCBwZXJpb2QgKHdpdGggMSB0aWNrIHVuY2VydGFudHkpCisvLyAJCQkJcHJpbnRrKCAiPDU+aXNyX2luZm86IEF3YWl0Q29ubmVjdGlvbiBwaGFzZSBzdGFydGVkLCBJRkJfVGlja0NudCA9IDBcbiIgKTsJCS8vOz9yZW1vdmUgbWUgMSBkYXkKKy8vIAkJCX0KKy8vICNlbmRpZiAvLyBIQ0ZfRERTCisvLyAJCX0KKy8vICNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX0lORk9fTE9HCisvLyAvKjYqLwl3aGlsZSAoIDEgKSB7CisvLyAJCQlpZiAoIHJpZHAtPnR5cCA9PSAwIHx8IHJpZHAtPnR5cCA9PSBpbmZvWzFdICkgeworLy8gCQkJCWlmICggcmlkcC0+YnVmcCApIHsKKy8vIAkJCQkJSENGQVNTRVJUKCByaWRwLT5sZW4gPj0gMiwgcmlkcC0+dHlwICkKKy8vIAkJCQkJKHZvaWQpc2V0dXBfYmFwKCBpZmJwLCBmaWQsIDIsIElPX0lOICk7CQkJLy9yZXN0b3JlIEJBUCBmb3IgdGFsbGllcywgbGlua3N0YXQgYW5kIHNwZWNpZmljIHR5cGUgZm9sbG93ZWQgYnkgd2lsZCBjYXJkCisvLyAJCQkJCXJpZHAtPmJ1ZnBbMF0gPSBtaW4oIHJpZHAtPmxlbiAtIDEsIGluZm9bMF0gKTsgCS8vc2F2ZSBMCisvLyAJCQkJCWdldF9mcmFnKCBpZmJwLCAod2NpX2J1ZnApJnJpZHAtPmJ1ZnBbMV0sIHJpZHAtPmJ1ZnBbMF0qMiBCRV9QQVIoMCkgKTsKKy8vIAkJCQl9CisvLyAJCQkJYnJlYWs7IC8vOz90aGlzIGJyZWFrIGlzIG5vIGxvbmdlciBuZWVkZWQgZHVlIHRvIHNldHVwX2JhcCBidXQgbGV0cyBjb25jZW50cmF0ZSBvbiBERFMgZmlyc3QKKy8vIAkJCX0KKy8vIAkJCXJpZHArKzsKKy8vIAkJfQorLy8gI2VuZGlmIC8vIEhDRl9FWFRfSU5GT19MT0cKKy8vIAl9CisvLyAJSENGVFJBQ0UoIGlmYnAsIEhDRl9UUkFDRV9JU1JfSU5GTyB8IEhDRl9UUkFDRV9FWElUICk7CisvLworLy8KKy8vCisvLworLy8JcmV0dXJuOworLy99IC8vIGlzcl9pbmZvCisvLyNlbmRpZiAvLyBIQ0ZfRExfT05MWQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouU1VCTU9EVUxFCQl2b2lkIG1kZF9hc3NlcnQoIElGQlAgaWZicCwgdW5zaWduZWQgaW50IGxpbmVfbnVtYmVyLCBoY2ZfMzIgcSApCisqLlBVUlBPU0UJCWZpbHRlcnMgYXNzZXJ0IG9uIGxldmVsIGFuZCBpbnRlcmZhY2VzIHRvIHRoZSBNU0Ygc3VwcGxpZWQgbXNmX2Fzc2VydCByb3V0aW5lLgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqCWxpbmVfbnVtYmVyCWxpbmUgbnVtYmVyIG9mIHRoZSBsaW5lIHdoaWNoIGNhdXNlZCB0aGUgYXNzZXJ0CisqCXEJCQlxdWFsaWZpZXIsIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gd2hpY2ggbWF5IGdpdmUgYSBjbHVlIGFib3V0IHRoZSBwcm9ibGVtCisqCisqLlJFVFVSTlMJCU4uQS4KKyoKKyouREVTQ1JJUFRJT04KKyoKKyoKKyouRElBR1JBTQorKgorKi5OT1RJQ0UKKyogbWRkX2Fzc2VydCBoYXMgYmVlbiB0aHJvdWdoIGEgdHVybW9pbCwgcmVuYW1pbmcgaGNmX2Fzc2VydCB0byBhc3NlcnQgYW5kIGhjZl9hc3NlcnQgYWdhaW4gYW5kIHN1cHBvcnRpbmcgb2ZmCisqIGFuZCBvbiBiZWluZyBjYWxsZWQgZnJvbSB0aGUgTVNGIGxldmVsIGFuZCBvdGhlciAoIGltbWF0dXJlICkgTW9kdWxhckRyaXZlckRldmVsb3BtZW50IG1vZHVsZXMgbGlrZSBESEYgYW5kCisqIE1NRC4KKyAqICEhISEgVGhlIGFzc2VydCByb3V0aW5lIGlzIG5vdCBhbiBoY2ZfLi4uLi4gcm91dGluZSBpbiB0aGUgc2Vuc2UgdGhhdCBpdCBtYXkgYmUgY2FsbGVkIGJ5IHRoZSBNU0YsCisgKgkJaG93ZXZlciBpdCBpcyBjYWxsZWQgZnJvbSBtbWQuYyBhbmQgZGhmLmMsIHNvIGl0IG11c3QgYmUgZXh0ZXJuYWwuCisgKgkJVG8gcHJldmVudCBuYW1lc3BhY2UgcG9sbHV0aW9uIGl0IG5lZWRzIGEgcHJlZml4LCB0byBwcmV2ZW50IHRoYXQgTVNGIHByb2dyYW1tZXJzIHRoaW5rIHRoYXQKKyAqCQl0aGV5IGFyZSBhbGxvd2VkIHRvIGNhbGwgdGhlIGFzc2VydCBsb2dpYywgdGhlIHByZWZpeCBIQ0YgY2FuJ3QgYmUgdXNlZCwgc28gTUREIGlzIHNlbGVjdGVkISEhIQorICoKKyogV2hlbiBjYWxsZWQgZnJvbSB0aGUgREhGIG1vZHVsZSB0aGUgbGluZSBudW1iZXIgaXMgaW5jcmVtZW50ZWQgYnkgREhGX0ZJTEVfTkFNRV9PRkZTRVQgYW5kIHdoZW4gY2FsbGVkIGZyb20KKyogdGhlIE1NRCBtb2R1bGUgYnkgTU1EX0ZJTEVfTkFNRV9PRkZTRVQuCisqCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIEhDRl9BU1NFUlQKK3ZvaWQKK21kZF9hc3NlcnQoIElGQlAgaWZicCwgdW5zaWduZWQgaW50IGxpbmVfbnVtYmVyLCBoY2ZfMzIgcSApCit7CitoY2ZfMTYJcnVuX3RpbWVfZmxhZyA9IGlmYnAtPklGQl9Bc3NlcnRMdmw7CisKKwlpZiAoIHJ1bl90aW1lX2ZsYWcgLyogPiA7Pz8/Pz8/ICovICkgeyAvL3ByZXZlbnQgcmVjdXJzaXZlIGJlaGF2aW9yLCBsYXRlciB0byBiZSBleHRlbmRlZCB0byBsZXZlbCBmaWx0ZXJpbmcKKwkJaWZicC0+SUZCX0Fzc2VydFF1YWxpZmllciA9IHE7CisJCWlmYnAtPklGQl9Bc3NlcnRMaW5lID0gKGhjZl8xNilsaW5lX251bWJlcjsKKyNpZiAoSENGX0FTU0VSVCkgJiAoIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4gfCBIQ0ZfQVNTRVJUX1JUX01TRl9SVE4gKQorCQlpZiAoIGlmYnAtPklGQl9Bc3NlcnRSdG4gKSB7CisJCQlpZmJwLT5JRkJfQXNzZXJ0UnRuKCBsaW5lX251bWJlciwgaWZicC0+SUZCX0Fzc2VydFRyYWNlLCBxICk7CisJCX0KKyNlbmRpZiAvLyBIQ0ZfQVNTRVJUX0xOS19NU0ZfUlROIC8gSENGX0FTU0VSVF9SVF9NU0ZfUlROCisjaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9TV19TVVAKKwkJT1BXKCBIUkVHX1NXXzIsIGxpbmVfbnVtYmVyICk7CisJCU9QVyggSFJFR19TV18yLCBpZmJwLT5JRkJfQXNzZXJ0VHJhY2UgKTsKKwkJT1BXKCBIUkVHX1NXXzIsIChoY2ZfMTYpcSApOworCQlPUFcoIEhSRUdfU1dfMiwgKGhjZl8xNikocSA+PiAxNiApICk7CisjZW5kaWYgLy8gSENGX0FTU0VSVF9TV19TVVAKKworI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIgJiYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9NQgorCQlpZmJwLT5JRkJfQXNzZXJ0THZsID0gMDsJCQkJCQkJCQkvLyBwcmV2ZW50IHJlY3Vyc2l2ZSBiZWhhdmlvcgorCQloY2ZfcHV0X2luZm8oIGlmYnAsIChMVFZQKSZpZmJwLT5JRkJfQXNzZXJ0U3RyY3QgKTsKKwkJaWZicC0+SUZCX0Fzc2VydEx2bCA9IHJ1bl90aW1lX2ZsYWc7CQkJCQkJLy8gcmVzdG9yZSBhcHByb3ByaWF0ZSBmaWx0ZXIgbGV2ZWwKKyNlbmRpZiAvLyBIQ0ZfRVhUX01CIC8gSENGX0FTU0VSVF9NQgorCX0KK30gLy8gbWRkX2Fzc2VydAorI2VuZGlmIC8vIEhDRl9BU1NFUlQKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLlNVQk1PRFVMRQkJdm9pZCBwdXRfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCBpbnQgbGVuIEJFX1BBUiggaW50IHdvcmRfbGVuICkgKQorKi5QVVJQT1NFCQl3cml0ZXMgd2l0aCAxNi8zMiBiaXQgSS9PIHZpYSBCQVAxIHBvcnQgZnJvbSBIb3N0IG1lbW9yeSB0byBOSUMgUkFNLgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqCWJ1ZnAJCShieXRlKSBhZGRyZXNzIG9mIGJ1ZmZlcgorKglsZW4JCQlsZW5ndGggaW4gYnl0ZXMgb2YgYnVmZmVyIHNwZWNpZmllZCBieSBidWZwCisqCXdvcmRfbGVuCUJpZyBFbmRpYW4gb25seTogbnVtYmVyIG9mIGxlYWRpbmcgYnl0ZXMgdG8gc3dhcCBpbiBwYWlycworKgorKi5SRVRVUk5TCQlOLkEuCisqCisqLkRFU0NSSVBUSU9OCisqIHByb2Nlc3MgdGhlIHNpbmdsZSBieXRlIChpZiBhcHBsaWNhYmxlKSBub3QgeWV0IHdyaXR0ZW4gYnkgdGhlIHByZXZpb3VzIHB1dF9mcmFnIGFuZCBjb3B5IGxlbgorKiAob3IgbGVuLTEpIGJ5dGVzIGZyb20gYnVmcCB0byBOSUMuCisqCisqCisqLkRJQUdSQU0KKyoKKyouTk9USUNFCisqCUl0IHR1cm5zIG91dCBET1MgT0RJIHVzZXMgemVybyBsZW5ndGggZnJhZ21lbnRzLiBUaGUgSENGIGNvZGUgY2FuIGNvcGUgd2l0aCBpdCwgYnV0IGFzIGEgY29uc2VxdWVuY2UsIG5vCisqCUFzc2VydCBvbiBsZW4gaXMgcG9zc2libGUKKyoKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQ0ZfU1RBVElDIHZvaWQKK3B1dF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIGJ1ZnAsIGludCBsZW4gQkVfUEFSKCBpbnQgd29yZF9sZW4gKSApCit7CitoY2ZfaW8JCWlvX3BvcnQgPSBpZmJwLT5JRkJfSU9CYXNlICsgSFJFR19EQVRBXzE7CS8vQkFQIGRhdGEgcmVnaXN0ZXIKK2ludAkJCWk7CQkJCQkJCQkJCQkvL3ByZXZlbnQgc2lkZSBlZmZlY3RzIGZyb20gbWFjcm8KK2hjZl8xNgkJajsKKwlIQ0ZBU1NFUlQoICgoaGNmXzMyKWJ1ZnAgJiAoSENGX0FMSUdOLTEpICkgPT0gMCwgKGhjZl8zMilidWZwICkKKyNpZiBIQ0ZfQklHX0VORElBTgorCUhDRkFTU0VSVCggd29yZF9sZW4gPT0gMCB8fCB3b3JkX2xlbiA9PSAyIHx8IHdvcmRfbGVuID09IDQsIHdvcmRfbGVuICkKKwlIQ0ZBU1NFUlQoIHdvcmRfbGVuID09IDAgfHwgKChoY2ZfMzIpYnVmcCAmIDEgKSA9PSAwLCAoaGNmXzMyKWJ1ZnAgKQorCUhDRkFTU0VSVCggd29yZF9sZW4gPD0gbGVuLCBNRVJHRV8yKCB3b3JkX2xlbiwgbGVuICkgKQorCisJaWYgKCB3b3JkX2xlbiApIHsJCQkJCQkJCQkvL2lmIHRoZXJlIGlzIGFueXRoaW5nIHRvIGNvbnZlcnQKKyAJCQkJCQkJCQkJCQkJCS8vLiAgY29udmVydCBhbmQgd3JpdGUgdGhlIDFzdCBoY2ZfMTYKKwkJaiA9IGJ1ZnBbMV0gfCBidWZwWzBdPDw4OworCQlPVVRfUE9SVF9XT1JEKCBpb19wb3J0LCBqICk7CisJCQkJCQkJCQkJCQkJCS8vLiAgdXBkYXRlIHBvaW50ZXIgYW5kIGNvdW50ZXIgYWNjb3JkaW5nbHkKKwkJbGVuIC09IDI7CisJCWJ1ZnAgKz0gMjsKKwkJaWYgKCB3b3JkX2xlbiA+IDEgKSB7CQkJCQkJCS8vLiAgaWYgdGhlcmUgaXMgdG8gY29udmVydCBtb3JlIHRoYW4gMSB3b3JkICggaS5lIDIgKQorIAkJCQkJCQkJCQkJCQkJLy8uICAuICBjb252ZXJ0IGFuZCB3cml0ZSB0aGUgMm5kIGhjZl8xNgorCQkJaiA9IGJ1ZnBbMV0gfCBidWZwWzBdPDw4OwkvKmJ1ZnAgaXMgYWxyZWFkeSBpbmNyZW1lbnRlZCBieSAyKi8KKwkJCU9VVF9QT1JUX1dPUkQoIGlvX3BvcnQsIGogKTsKKwkJCQkJCQkJCQkJCQkJLy8uICAuICB1cGRhdGUgcG9pbnRlciBhbmQgY291bnRlciBhY2NvcmRpbmdseQorCQkJbGVuIC09IDI7CisJCQlidWZwICs9IDI7CisJCX0KKwl9CisjZW5kaWYgLy8gSENGX0JJR19FTkRJQU4KKwlpID0gbGVuOworCWlmICggaSAmJiBpZmJwLT5JRkJfQ2FycnlPdXQgKSB7CQkJCQkvL3NraXAgemVyby1sZW5ndGgKKwkJaiA9ICgoKmJ1ZnApPDw4KSArICggaWZicC0+SUZCX0NhcnJ5T3V0ICYgMHhGRiApOworCQlPVVRfUE9SVF9XT1JEKCBpb19wb3J0LCBqICk7CisJCWJ1ZnArKzsgaS0tOworCQlpZmJwLT5JRkJfQ2FycnlPdXQgPSAwOworCX0KKyNpZiAoSENGX0lPKSAmIEhDRl9JT18zMkJJVFMKKwkvL3NraXAgemVyby1sZW5ndGggSS9PLCBzaW5nbGUgYnl0ZSBJL08gYW5kIEkvTyBub3Qgd29ydGh3aGlsZSAoaS5lLiBsZXNzIHRoYW4gNiBieXRlcylmb3IgRFcgbG9naWMKKwkJCQkJCQkJCQkJCQkvL2lmIGJ1ZmZlciBsZW5ndGggPj0gNiBhbmQgMzIgYml0cyBJL08gc3VwcG9ydAorCWlmICggIShpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV8xNkJJVCkgJiYgaSA+PSA2ICkgeworaGNmXzMyIEZBUgkqcDQ7IC8vcHJldmVudCBzaWRlIGVmZmVjdHMgZnJvbSBtYWNybworCQlpZiAoICggKGhjZl8zMilidWZwICYgMHgxICkgPT0gMCApIHsJCQkvLy4gIGlmIGJ1ZmZlciBhdCBsZWFzdCB3b3JkIGFsaWduZWQKKwkJCWlmICggKGhjZl8zMilidWZwICYgMHgyICkgewkJCQkvLy4gIC4gIGlmIGJ1ZmZlciBub3QgZG91YmxlIHdvcmQgYWxpZ25lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvLy4gIC4gIC4gIHdyaXRlIGEgc2luZ2xlIHdvcmQgdG8gZ2V0IGRvdWJsZSB3b3JkIGFsaWduZWQKKwkJCQlqID0gKih3Y2lfcmVjb3JkcClidWZwOwkJLy9qdXN0IHRvIGhlbHAgZWFzZSB3cml0aW5nIG1hY3JvcyB3aXRoIGVtYmVkZGVkIGFzc2VtYmx5CisJCQkJT1VUX1BPUlRfV09SRCggaW9fcG9ydCwgaiApOworCQkJCQkJCQkJCQkJCS8vLiAgLiAgLiAgYWRqdXN0IGJ1ZmZlciBsZW5ndGggYW5kIHBvaW50ZXIgYWNjb3JkaW5nbHkKKwkJCQlidWZwICs9IDI7IGkgLT0gMjsKKwkJCX0KKwkJCQkJCQkJCQkJCQkvLy4gIC4gIHdyaXRlIGFzIG1hbnkgZG91YmxlIHdvcmQgYXMgcG9zc2libGUKKwkJCXA0ID0gKGhjZl8zMiBGQVIgKilidWZwOworCQkJaiA9IChoY2ZfMTYpaS80OworCQkJT1VUX1BPUlRfU1RSSU5HXzMyKCBpb19wb3J0LCBwNCwgaiApOworCQkJCQkJCQkJCQkJCS8vLiAgLiAgYWRqdXN0IGJ1ZmZlciBsZW5ndGggYW5kIHBvaW50ZXIgYWNjb3JkaW5nbHkKKwkJCWJ1ZnAgKz0gaSAmIH4weDAwMDM7CisJCQlpICY9IDB4MDAwMzsKKwkJfQorCX0KKyNlbmRpZiAvLyBIQ0ZfSU9fMzJCSVRTCisJCQkJCQkJCQkJCQkJLy9pZiBubyAzMi1iaXQgc3VwcG9ydCBPUiBieXRlIGFsaWduZWQgT1IgMSB3b3JkIGxlZnQKKwlpZiAoIGkgKSB7CisJCQkJCQkJCQkJCQkJLy8uICBpZiBvZGQgbnVtYmVyIG9mIGJ5dGVzIGxlZnQKKwkJaWYgKCBpICYgMHgwMDAxICkgeworCQkJCQkJCQkJCQkJCS8vLiAgLiAgc2F2ZSBsZWZ0IG92ZXIgYnl0ZSAoYmVmb3JlIGJ1ZnAgaXMgY29ycnVwdGVkKSBpbiBjYXJyeSwgc2V0IGNhcnJ5IGZsYWcKKwkJCWlmYnAtPklGQl9DYXJyeU91dCA9IChoY2ZfMTYpYnVmcFtpLTFdIHwgMHgwMTAwOwkvL25vdGUgdGhhdCBpIGFuZCBidWZwIGFyZSBhbHdheXMgc2ltdWx0YW5lb3VzbHkgbW9kaWZpZWQsICZidWZwW2ktMV0gaXMgaW52YXJpYW50CisJCX0KKwkJCQkJCQkJCQkJCQkvLy4gIHdyaXRlIGFzIG1hbnkgd29yZCBhcyBwb3NzaWJsZSBpbiAiYWxpZ25tZW50IHNhZmUiIHdheQorCQlqID0gKGhjZl8xNilpLzI7CisJCU9VVF9QT1JUX1NUUklOR184XzE2KCBpb19wb3J0LCBidWZwLCBqICk7CisJfQorfSAvLyBwdXRfZnJhZworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouU1VCTU9EVUxFCQl2b2lkIHB1dF9mcmFnX2ZpbmFsaXplKCBJRkJQIGlmYnAgKQorKi5QVVJQT1NFCQljbGVhbnVwIGFmdGVyIHB1dF9mcmFnIGZvciB0cmFpbGluZyBvZGQgYnl0ZSBhbmQgTUlDIHRyYW5zZmVyIHRvIE5JQy4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKgorKi5SRVRVUk5TCQlOLkEuCisqCisqLkRFU0NSSVBUSU9OCisqIGZpbmFsaXplIHRoZSBNSUMgY2FsY3VsYXRpb24gd2l0aCB0aGUgcGFkZGluZyBwYXR0ZXJuLCBvdXRwdXQgdGhlIGxhc3QgYnl0ZSAoaWYgYXBwbGljYWJsZSkKKyogb2YgdGhlIG1lc3NhZ2UgYW5kIHRoZSBNSUMgdG8gdGhlIFR4RlMKKyoKKyoKKyouRElBR1JBTQorKjI6CTEgYnl0ZSBvZiB0aGUgbGFzdCBwdXRfZnJhZyBtYXkgYmUgc3RpbGwgaW4gSUZCX0NhcnJ5T3V0ICggdGhlIHB1dF9mcmFnIGNhcnJ5IGhvbGRlciApLCBzbyAuLi4uLi4uLgorKgkxIC0gMyBieXRlcyBvZiB0aGUgbGFzdCBwdXRfZnJhZyBtYXkgYmUgc3RpbGwgaW4gSUZCX3R4XzMyICggdGhlIE1JQyBlbmdpbmUgY2FycnkgaG9sZGVyICksIHNvIC4uLi4uLi4uCisqCVRoZSBjYWxsIHRvIHRoZSBNSUMgY2FsY3VsYXRpb24gcm91dGluZSBmZWVkcyB0aGVzZSByZW1haW5pbmcgYnl0ZXMgKGlmIGFueSkgb2YgcHV0X2ZyYWcgYW5kIHRoZQorKglqdXN0IGFzIG1hbnkgYnl0ZXMgb2YgdGhlIHBhZGRpbmcgYXMgbmVlZGVkIHRvIHRoZSBNSUMgY2FsY3VsYXRpb24gZW5naW5lLiBOb3RlIHRoYXQgdGhlICJ1bm5lZWRlZCIgcGFkCisqCWJ5dGVzIHNpbXBseSBlbmQgdXAgaW4gdGhlIE1JQyBlbmdpbmUgY2FycnkgaG9sZGVyIGFuZCBhcmUgbmV2ZXIgdXNlZC4KKyo4Ogl3cml0ZSB0aGUgcmVtYWluZGVyIG9mIHRoZSBNSUMgYW5kIHBvc3NpYmxlIHNvbWUgZ2FyYmFnZSB0byBOSUMgUkFNCisqCU5vdGU6IGkgaXMgYWx3YXlzIDQgKGEgbG9vcC1pbnZhcmlhbnQgb2YgdGhlIHdoaWxlIGluIHBvaW50IDIpCisqCisqLk5PVElDRQorKgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hDRl9TVEFUSUMgdm9pZAorcHV0X2ZyYWdfZmluYWxpemUoIElGQlAgaWZicCApCit7CisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQorCWlmICggaWZicC0+SUZCX01JQ1R4Q2FycnkgIT0gMHhGRkZGKSB7CQkvL2lmIE1JQyBjYWxjdWxhdGlvbiBhY3RpdmUKKwkJQ0FMQ19UWF9NSUMoIG1pY19wYWQsIDgpOwkJCQkvLy4gIGZlZWQgKHVwIHRvIDggYnl0ZXMgb2YpIHZpcnR1YWwgcGFkZGluZyB0byBNSUMgZW5naW5lCisJCQkJCQkJCQkJCQkvLy4gIHdyaXRlIChwb3NzaWJseSkgdHJhaWxpbmcgYnl0ZSArIChtb3N0IG9mKSBNSUMKKwkJcHV0X2ZyYWcoIGlmYnAsICh3Y2lfYnVmcClpZmJwLT5JRkJfTUlDVHgsIDggQkVfUEFSKDApICk7CisJfQorI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQorCXB1dF9mcmFnKCBpZmJwLCBudWxsX2FkZHIsIDEgQkVfUEFSKDApICk7CS8vd3JpdGUgKHBvc3NpYmx5KSB0cmFpbGluZyBkYXRhIG9yIE1JQyBieXRlCit9IC8vIHB1dF9mcmFnX2ZpbmFsaXplCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5TVUJNT0RVTEUJCWludCBwdXRfaW5mbyggSUZCUCBpZmJwLCBMVFZQIGx0dnAgKQorKi5QVVJQT1NFCQlzdXBwb3J0IHJvdXRpbmUgdG8gaGFuZGxlIHRoZSAiYmFzaWMiIHRhc2sgb2YgaGNmX3B1dF9pbmZvIHRvIHBhc3MgUklEcyB0byB0aGUgTklDLgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqCWx0dnAJCWFkZHJlc3MgaW4gTklDIFJBTSB3aGVyZSBMVlQtcmVjb3JkcyBhcmUgbG9jYXRlZAorKgorKi5SRVRVUk5TCisqCUhDRl9TVUNDRVNTCisqCT4+cHV0X2ZyYWcKKyoJPj5jbWRfd2FpdAorKgorKi5ERVNDUklQVElPTgorKgorKgorKi5ESUFHUkFNCisqMjA6IGRvIG5vdCB3cml0ZSBSSURzIHRvIE5JQ3Mgd2hpY2ggaGF2ZSBpbmNvbXBhdGlibGUgRmlybXdhcmUKKyoyNDogSWYgdGhlIFJJRCBkb2VzIG5vdCBleGlzdCwgdGhlIEwtZmllbGQgaXMgc2V0IHRvIHplcm8uCisqCU5vdGUgdGhhdCBzb21lIFJJRHMgY2FuIG5vdCBiZSByZWFkLCBlLmcuIHRoZSBwc2V1ZG8gUklEcyBmb3IgZGlyZWN0IEhlcm1lcyBjb21tYW5kcyBhbmQgQ0ZHX0RFRkFVTFRfS0VZUworKjI4OiBJZiB0aGUgUklEIGlzIHdyaXR0ZW4gc3VjY2Vzc2Z1bCwgcGFzcyBpdCB0byB0aGUgTklDIGJ5IG1lYW5zIG9mIGFuIEFjY2VzcyBXcml0ZSBjb21tYW5kCisqCisqLk5PVElDRQorKglUaGUgbWVjaGFuaXNtIHRvIEhDRl9BU1NFUlQgb24gaW52YWxpZCB0eXAtY29kZXMgaW4gdGhlIExUViByZWNvcmQgaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBzdHJhdGVneToKKyoJICAtCXNvbWUgY29kZXMgKGUuZy4gQ0ZHX1JFR19NQikgYXJlIGV4cGxpY2l0bHkgaGFuZGxlZCBieSB0aGUgSENGIHdoaWNoIGltcGxpZXMgdGhhdCB0aGVzZSBjb2RlcworKgkJYXJlIHZhbGlkLiBUaGVzZSBjb2RlcyBhcmUgYWxyZWFkeSBjb25zdW1lZCBieSBoY2ZfcHV0X2luZm8uCisqCSAgLSBhbGwgb3RoZXIgY29kZXMgYXJlIHBhc3NlZCB0byB0aGUgSGVybWVzLiBCZWZvcmUgdGhlIHB1dCBhY3Rpb24gaXMgZXhlY3V0ZWQsIGhjZl9nZXRfaW5mbyBpcyBjYWxsZWQKKyoJCXdpdGggYW4gTFRWIHJlY29yZCB3aXRoIGEgdmFsdWUgb2YgMSBpbgl0aGUgTC1maWVsZCBhbmQgdGhlIGludGVuZGVkIHB1dCBhY3Rpb24gdHlwZSBpbiB0aGUgVHlwLWNvZGUKKyoJCWZpZWxkLiBJZiB0aGUgcHV0IGFjdGlvbiB0eXBlIGlzIHZhbGlkLCBpdCBpcyBhbHNvIHZhbGlkIGFzIGEgZ2V0IGFjdGlvbiB0eXBlIGNvZGUgLSBleGNlcHQKKyoJCWZvciBDRkdfREVGQVVMVF9LRVlTIGFuZCBDRkdfQUREX1RLSVBfREVGQVVMVF9LRVkgLSBzbyB0aGUgSENGX0FTU0VSVCBsb2dpYyBvZiBoY2ZfZ2V0X2luZm8gc2hvdWxkCisqCQlub3QgY2F0Y2guCisqCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSENGX1NUQVRJQyBpbnQKK3B1dF9pbmZvKCBJRkJQIGlmYnAsIExUVlAgbHR2cAkpCit7CisKK2ludCByYyA9IEhDRl9TVUNDRVNTOworCisJSENGQVNTRVJUKCBpZmJwLT5JRkJfQ2FyZFN0YXQgPT0gMCwgTUVSR0VfMiggbHR2cC0+dHlwLCBpZmJwLT5JRkJfQ2FyZFN0YXQgKSApCisJSENGQVNTRVJUKCBDRkdfUklEX0NGR19NSU4gPD0gbHR2cC0+dHlwICYmIGx0dnAtPnR5cCA8PSBDRkdfUklEX0NGR19NQVgsIGx0dnAtPnR5cCApCisKKwlpZiAoIGlmYnAtPklGQl9DYXJkU3RhdCA9PSAwICYmCQkJCQkJCQkJCQkJCQkJCS8qIDIwKi8KKwkJICggKCBDRkdfUklEX0NGR19NSU4gPD0gbHR2cC0+dHlwICAgICYmIGx0dnAtPnR5cCA8PSBDRkdfUklEX0NGR19NQVggKSB8fAorCQkgICAoIENGR19SSURfRU5HX01JTiA8PSBsdHZwLT50eXAgLyogJiYgbHR2cC0+dHlwIDw9IDB4RkZGRiAqLyAgICAgICApICAgICApICkgeworI2lmIEhDRl9BU1NFUlQgLy9GQ0M4LCBGQ0IwLCBGQ0I0LCBGQ0I2LCBGQ0I3LCBGQ0I4LCBGQ0MwLCBGQ0M0LCBGQ0JDLCBGQ0JELCBGQ0JFLCBGQ0JGCisgeworIGhjZl8xNgkJdCA9IGx0dnAtPnR5cDsKKyBMVFZfU1RSQ1QgCXggPSB7IDIsIHQsIHswfSB9OwkJCQkJCQkJCQkJCQkJCS8qMjQqLworCWhjZl9nZXRfaW5mbyggaWZicCwgKExUVlApJnggKTsKKwlpZiAoIHgubGVuID09IDAgJiYKKwkJICggdCAhPSBDRkdfREVGQVVMVF9LRVlTICYmIHQgIT0gQ0ZHX0FERF9US0lQX0RFRkFVTFRfS0VZICYmIHQgIT0gQ0ZHX1JFTU9WRV9US0lQX0RFRkFVTFRfS0VZICYmCisJCSAgIHQgIT0gQ0ZHX0FERF9US0lQX01BUFBFRF9LRVkgJiYgdCAhPSBDRkdfUkVNT1ZFX1RLSVBfTUFQUEVEX0tFWSAmJgorCQkgICB0ICE9IENGR19IQU5ET1ZFUl9BRERSICYmIHQgIT0gQ0ZHX0RJU0FTU09DSUFURV9BRERSICYmCisJCSAgIHQgIT0gQ0ZHX0ZDQkMgJiYgdCAhPSBDRkdfRkNCRCAmJiB0ICE9IENGR19GQ0JFICYmIHQgIT0gQ0ZHX0ZDQkYgJiYKKwkJICAgdCAhPSBDRkdfREVBVVRIRU5USUNBVEVfQUREUgorCQkgKQorCQkpIHsKKwkJSENGQVNTRVJUKCBET19BU1NFUlQsIGx0dnAtPnR5cCApCisJCX0KKyB9CisjZW5kaWYgLy8gSENGX0FTU0VSVAorCisJCXJjID0gc2V0dXBfYmFwKCBpZmJwLCBsdHZwLT50eXAsIDAsIElPX09VVCApOworCQlwdXRfZnJhZyggaWZicCwgKHdjaV9idWZwKWx0dnAsIDIqbHR2cC0+bGVuICsgMiBCRV9QQVIoMikgKTsKKy8qMjgqLwlpZiAoIHJjID09IEhDRl9TVUNDRVNTICkgeworCQkJcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX0FDQ0VTUyArIEhDTURfQUNDRVNTX1dSSVRFLCBsdHZwLT50eXAgKTsKKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9IC8vIHB1dF9pbmZvCisKKworI2lmIChIQ0ZfRExfT05MWSkgPT0gMAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5TVUJNT0RVTEUJCWludCBwdXRfaW5mb19tYiggSUZCUCBpZmJwLCBDRkdfTUJfSU5GT19TVFJDVCBGQVIgKiBsdHZwICkKKyouUFVSUE9TRQkgCWFjY3VtdWxhdGVzIGEgKCBzZXJpZXMgb2YpIGJ1ZmZlcnMgaW50byBhIHNpbmdsZSBJbmZvIGJsb2NrIGludG8gdGhlIE1haWxCb3guCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyoJbHR2cAkJYWRkcmVzcyBvZiBzdHJ1Y3R1cmUgc3BlY2lmeWluZyB0aGUgInR5cGUiIGFuZCB0aGUgZnJhZ21lbnRzIG9mIHRoZSBpbmZvcm1hdGlvbiB0byBiZSBzeW50aGVzaXplZAorKgkJCQlhcyBhbiBMVFYgaW50byB0aGUgTWFpbEJveAorKgorKi5SRVRVUk5TCisqCisqLkRFU0NSSVBUSU9OCisqIElmIHRoZSBkYXRhIGRvZXMgbm90IGZpdCAoaW5jbHVkaW5nIG5vIE1haWxCb3ggaXMgYXZhaWxhYmxlKSwgdGhlIElGQl9NQlRhbGx5IGlzIGluY3JlbWVudGVkIGFuZCBhbgorKiBlcnJvciBzdGF0dXMgaXMgcmV0dXJuZWQuCisqIEhDRl9BU1NFUlQgZG9lcyBub3QgY2F0Y2guCisqIENhbGxpbmcgcHV0X2luZm9fbWIgd2hlbiB0aGVpciBpcyBubyBNYWlsQm94IGF2YWlsYWJsZSwgaXMgY29uc2lkZXJlZCBhIGRlc2lnbiBlcnJvciBpbiB0aGUgTVNGLgorKgorKiBOb3RlIHRoYXQgdGhlcmUgaXMgYWx3YXlzIGF0IGxlYXN0IDEgd29yZCBvZiB1bnVzZWQgc3BhY2UgaW4gdGhlIG1haWwgYm94LgorKiBBcyBhIGNvbnNlcXVlbmNlOgorKiAtIG5vIHByb2JsZW0gaW4gcG9pbnRlciBhcml0aG1ldGljIChNQl9SUCA9PSBNQl9XUCBtZWFucyB1bmFtYmlndW91c2x5IG1haWwgYm94IGlzIGNvbXBsZXRlbHkgZW1wdHkKKyogLSBUaGVyZSBpcyBhbHdheXMgZnJlZSBzcGFjZSB0byB3cml0ZSBhbiBMIGZpZWxkIHdpdGggYSB2YWx1ZSBvZiB6ZXJvIGFmdGVyIGVhY2ggTUJfSW5mbyBibG9jay4gIFRoaXMKKyogICBhbGxvd3MgZm9yIGFuIGVhc3kgc2NhbiBtZWNoYW5pc20gaW4gdGhlICJnZXQgTUJfSW5mbyBibG9jayIgbG9naWMuCisqCisqCisqLkRJQUdSQU0KKyoxOglDYWxjdWxhdGUgTCBmaWVsZCBvZiB0aGUgTUJJQiwgaS5lLiAxIGZvciB0aGUgVC1maWVsZCArIHRoZSBjdW11bGF0aXZlIGxlbmd0aCBvZiB0aGUgZnJhZ21lbnRzLgorKjI6CVRoZSBmcmVlIHNwYWNlIGluIHRoZSBNYWlsQm94IGlzIGNhbGN1bGF0ZWQgKDJhOiBmcmVlIHBhcnQgZnJvbSBXcml0ZSBQdHIgdG8gUmVhZCBQdHIsIDJiOiBmcmVlIHBhcnQKKyoJdHVybnMgb3V0IHRvIHdyYXAgYXJvdW5kKSAuIElmIHRoaXMgc3BhY2Ugc3VmZmljZXMgdG8gc3RvcmUgdGhlIG51bWJlciBvZiB3b3JkcyByZWZsZWN0ZWQgYnkgbGVuIChULWZpZWxkCisqCSsgVmFsdWUtZmllbGQpIHBsdXMgdGhlIGFkZGl0aW9uYWwgTWFpbEJveCBJbmZvIEwtZmllbGQgKyBhIHRyYWlsaW5nIDAgdG8gYWN0IGFzIHRoZSBMLWZpZWxkIG9mIGEgdHJhaWxpbmcKKyoJZHVtbXkgb3IgZW1wdHkgTFRWIHJlY29yZCwgdGhlbiBhIE1haWxCb3ggSW5mbyBibG9jayBpcyBidWlsZCBpbiB0aGUgTWFpbEJveCBjb25zaXN0aW5nIG9mCisqCSAgLSB0aGUgdmFsdWUgbGVuIGluIHRoZSBmaXJzdCB3b3JkCisqCSAgLSB0eXBlIGluIHRoZSBzZWNvbmQgd29yZAorKgkgIC0gYSBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgZnJhZ21lbnRzIGluIHRoZSBzZWNvbmQgYW5kIGhpZ2hlciB3b3JkCisqCisqNDoJU2luY2UgcHV0X2luZm9fbWIoKSBjYW4gbW9yZSBvciBsZXNzIGRpcmVjdGx5IGJlIGNhbGxlZCBmcm9tIHRoZSBNU0YgbGV2ZWwsIHRoZSBJL0YgbXVzdCBiZSByb2J1c3QKKyoJYWdhaW5zdCBvdXQtb2YtcmFuZ2UgdmFyaWFibGVzLiBBcyBmYWlsc2FmZSBjb2RpbmcsIHRoZSBNQiB1cGRhdGUgaXMgc2tpcHBlZCBieSBjaGFuZ2luZyB0bGVuIHRvIDAgaWYKKyoJbGVuID09IDA7IFRoaXMgd2lsbCBpbmRpcmVjdGx5IGNhdXNlIGFuIGFzc2VydCBhcyByZXN1bHQgb2YgdGhlIHZpb2xhdGlvbiBvZiB0aGUgbmV4dCBpZiBjbGF1c2UuCisqNjoJQ2hlY2sgd2hldGhlciB0aGUgZnJlZSBzcGFjZSBpbiBNYWlsQm94IHN1ZmZpY2VzICh0aGlzIGNvdmVycyB0aGUgY29tcGxldGUgYWJzZW5jZSBvZiB0aGUgTWFpbEJveCkuCisqCU5vdGUgdGhhdCBsZW4gaXMgdW5zaWduZWQsIHNvIGV2ZW4gTVNGIEkvRiB2aW9sYXRpb24gd29ya3Mgb3V0IE8uSy4KKyoJVGhlICcyJyBpbiB0aGUgZXhwcmVzc2lvbiAibGVuKzIiIGlzIHVzZWQgYmVjYXVzZSAxIHdvcmQgaXMgbmVlZGVkIGZvciBMIGl0c2VsZiBhbmQgMSB3b3JkIGlzIG5lZWRlZAorKglmb3IgdGhlIHplcm8tc2VudGluZWwKKyo4Ogl1cGRhdGUgTWFpbEJveCBJbmZvIGxlbmd0aCByZXBvcnQgdG8gTVNGIHdpdGggIm9sZGVzdCIgTUIgSW5mbyBCbG9jayBzaXplLiBCZSBjYXJlZnVsbCBoZXJlLCBpZiB5b3UgZ2V0CisqCWhlcmUgYmVmb3JlIHRoZSBNYWlsQm94IGlzIHJlZ2lzdGVyZWQsIHlvdSBjYW4ndCByZWFkIGZyb20gdGhlIGJ1ZmZlciBhZGRyZXNzZWQgYnkgSUZCX01CcCAoaXQgaXMgdGhlCisqCU51bGwgYnVmZmVyKSBzbyBkb24ndCBtb3ZlIHRoaXMgY29kZSB0aWxsIHRoZSBlbmQgb2YgdGhpcyByb3V0aW5lIGJ1dCBrZWVwIGl0IHdoZXJlIHRoZXJlIGlzIGdhcnVhbnRlZWQKKyoJYSBidWZmZXIuCisqCisqLk5PVElDRQorKglib3VuZGFyeSB0ZXN0aW5nIGRlcGVuZHMgb24gdGhlIGZhY3QgdGhhdCBJRkJfTUJTaXplIGlzIGd1YXJhbnRlZWQgdG8gYmUgemVybyBpZiBubyBNYWlsQm94IGlzIHByZXNlbnQsCisqCWFuZCB0byBhIGxlc3NlciBkZWdyZWUsIHRoYXQgSUZCX01CV3AgPSBJRkJfTUJScCA9IDAKKyoKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9NQgorCitIQ0ZfU1RBVElDIGludAorcHV0X2luZm9fbWIoIElGQlAgaWZicCwgQ0ZHX01CX0lORk9fU1RSQ1QgRkFSICogbHR2cCApCit7CisKK2ludAkJCXJjID0gSENGX1NVQ0NFU1M7CitoY2ZfMTYJCWk7CQkJCQkJLy93b3JrIGNvdW50ZXIKK2hjZl8xNgkJKmRwOwkJCQkJLy9kZXN0aW5hdGlvbiBwb2ludGVyIChpbiBNYWlsQm94KQord2NpX3JlY29yZHAJc3A7CQkJCQkJLy9zb3VyY2UgcG9pbnRlcgoraGNmXzE2CQlsZW47CQkJCQkvL3RvdGFsIGxlbmd0aCB0byBjb3B5IHRvIE1haWxCb3gKK2hjZl8xNgkJdGxlbjsJCQkJCS8vZnJlZSBsZW5ndGgvd29ya2luZyBsZW5ndGgvb2Zmc2V0IGluIFdNUCBmcmFtZQorCisJaWYgKCBpZmJwLT5JRkJfTUJwID09IE5VTEwgKSByZXR1cm4gcmM7ICAvLzs/bm90IHN1ZmZpY2llbnQKKwlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NQnAgIT0gTlVMTCwgMCApCQkJCQkvLyEhIWJlIGNhcmVmdWwsIGRvbid0IGdldCBpbnRvIGFuIGVuZGxlc3MgcmVjdXJzaW9uCisJSENGQVNTRVJUKCBpZmJwLT5JRkJfTUJTaXplLCAwICkKKworCWxlbiA9IDE7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvKiAxICovCisJZm9yICggaSA9IDA7IGkgPCBsdHZwLT5mcmFnX2NudDsgaSsrICkgeworCQlsZW4gKz0gbHR2cC0+ZnJhZ19idWZbaV0uZnJhZ19sZW47CisJfQorCWlmICggaWZicC0+SUZCX01CUnAgPiBpZmJwLT5JRkJfTUJXcCApIHsKKwkJdGxlbiA9IGlmYnAtPklGQl9NQlJwIC0gaWZicC0+SUZCX01CV3A7CQkJCQkJCQkJCQkJCQkJLyogMmEqLworCX0gZWxzZSB7CisJCWlmICggaWZicC0+SUZCX01CUnAgPT0gaWZicC0+SUZCX01CV3AgKSB7CisJCQlpZmJwLT5JRkJfTUJScCA9IGlmYnAtPklGQl9NQldwID0gMDsJLy8gb3B0aW1pemUgV3JhcHBpbmcKKwkJfQorCQl0bGVuID0gaWZicC0+SUZCX01CU2l6ZSAtIGlmYnAtPklGQl9NQldwOwkJCQkJCQkJCQkJCQkJLyogMmIqLworCQlpZiAoICggdGxlbiA8PSBsZW4gKyAyICkgJiYgKCBsZW4gKyAyIDwgaWZicC0+SUZCX01CUnAgKSApIHsJLy9pZiB0cmFpbGluZyBzcGFjZSBpcyB0b28gc21hbGwgYnV0CisJCQkJCQkJCQkJCQkJCQkJCS8vCSBsZWFkaW5nIHNwYWNlIGlzIHN1ZmZpY2llbnRseSBsYXJnZQorCQkJaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJXcF0gPSAweEZGRkY7CQkJCQkvL2ZsYWcgZHVtbXkgTFRWIHRvIGZpbGwgdGhlIHRyYWlsaW5nIHNwYWNlCisJCQlpZmJwLT5JRkJfTUJXcCA9IDA7CQkJCQkJCQkJCS8vcmVzZXQgV3JpdGVQb2ludGVyIHRvIGJlZ2luIG9mIE1haWxCb3gKKwkJCXRsZW4gPSBpZmJwLT5JRkJfTUJScDsJCQkJCQkJCQkvL2dldCBuZXcgYXZhaWxhYmxlIHNwYWNlIHNpemUKKwkJfQorCX0KKwlkcCA9ICZpZmJwLT5JRkJfTUJwW2lmYnAtPklGQl9NQldwXTsKKwlpZiAoIGxlbiA9PSAwICkgeworCQl0bGVuID0gMDsgLy87PyB3aGF0IGlzIHRoaXMgZ29vZCBmb3IKKwl9CisJaWYgKCBsZW4gKyAyID49IHRsZW4gKXsJCQkJCQkJCQkJCQkJCQkJCQkJCS8qIDYgKi8KKwkJLy9EbyBOb3QgQVNTRVJULCB0aGlzIGlzIGEgbm9ybWFsIGNvbmRpdGlvbgorCQlJRl9UQUxMWSggaWZicC0+SUZCX0hDRl9UYWxsaWVzLk5vQnVmTUIrKzsgKSAvKk5PUCB0byBjb3ZlciBhZ2FpbnN0IGFuYWxvbWllcyB3aXRoIGVtcHR5IGNvbXBvdW5kKi87CisJCXJjID0gSENGX0VSUl9MRU47CisJfSBlbHNlIHsKKwkJKmRwKysgPSBsZW47CQkJCQkJCQkJLy93cml0ZSBMZW4gKD0gc2l6ZSBvZiBUK1YgaW4gd29yZHMgdG8gTUJfSW5mbyBibG9jaworCQkqZHArKyA9IGx0dnAtPmJhc2VfdHlwOwkJCQkJCQkvL3dyaXRlIFR5cGUgdG8gTUJfSW5mbyBibG9jaworCQlpZmJwLT5JRkJfTUJXcCArPSBsZW4gKyAxOwkJCQkJCS8vdXBkYXRlIFdyaXRlUG9pbnRlciBvZiBNYWlsQm94CisJCWZvciAoIGkgPSAwOyBpIDwgbHR2cC0+ZnJhZ19jbnQ7IGkrKyApIHsJCQkJLy8gcHJvY2VzcyBlYWNoIG9mIHRoZSBmcmFnbWVudHMKKwkJCXNwID0gbHR2cC0+ZnJhZ19idWZbaV0uZnJhZ19hZGRyOworCQkJbGVuID0gbHR2cC0+ZnJhZ19idWZbaV0uZnJhZ19sZW47CisJCQl3aGlsZSAoIGxlbi0tICkgKmRwKysgPSAqc3ArKzsKKwkJfQorCQlpZmJwLT5JRkJfTUJwW2lmYnAtPklGQl9NQldwXSA9IDA7CQkJCS8vdG8gYXNzdXJlIGdldF9pbmZvIGZvciBDRkdfTUJfSU5GTyBzdG9wcworCQlpZmJwLT5JRkJfTUJJbmZvTGVuID0gaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJScF07CQkJCQkJCQkJCQkvKiA4ICovCisJfQorCXJldHVybiByYzsKK30gLy8gcHV0X2luZm9fbWIKKworI2VuZGlmIC8vIEhDRl9FWFRfTUIKKyNlbmRpZiAvLyBIQ0ZfRExfT05MWQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouU1VCTU9EVUxFCQlpbnQgc2V0dXBfYmFwKCBJRkJQIGlmYnAsIGhjZl8xNiBmaWQsIGludCBvZmZzZXQsIGludCB0eXBlICkKKyouUFVSUE9TRQkJc2V0IHVwIGRhdGEgYWNjZXNzIHRvIE5JQyBSQU0gdmlhIEJBUF8xLgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJCWFkZHJlc3Mgb2YgSS9GIEJsb2NrCisqCWZpZAkJCQlGSUQvUklECisqCW9mZnNldAkJCSEhZXZlbiEhIG9mZnNldCBpbiBGSUQvUklECisqCXR5cGUJCQlJT19JTiwgSU9fT1VUCisqCisqLlJFVFVSTlMKKyoJSENGX1NVQ0NFU1MJCQkJCU8uSworKglIQ0ZfRVJSX05PX05JQwkJCQljYXJkIGlzIHJlbW92ZWQKKyoJSENGX0VSUl9ERUZVTkNUX1RJTUVfT1VUCUZhdGFsIG1hbGZ1bmN0aW9uIGRldGVjdGVkCisqCUhDRl9FUlJfREVGVU5DVF8uLi4uLgkJaWYgYW5kIG9ubHkgaWYgSUZCX0RlZnVuY3RTdGF0IDw+IDAKKyoKKyouREVTQ1JJUFRJT04KKyoKKyogQSBub24temVybyByZXR1cm4gc3RhdHVzIGluZGljYXRlczoKKyogLSB0aGUgTklDIGlzIGNvbnNpZGVyZWQgbm9ub3BlcmF0aW9uYWwsIGUuZy4gZHVlIHRvIGEgdGltZS1vdXQgb2Ygc29tZSBIZXJtZXMgYWN0aXZpdHkgaW4gdGhlIHBhc3QKKyogLSBCQVBfMSBjb3VsZCBub3QgcHJvcGVybHkgYmUgaW5pdGlhbGl6ZWQKKyogLSB0aGUgY2FyZCBpcyByZW1vdmVkIGJlZm9yZSBjb21wbGV0aW9uIG9mIHRoZSBkYXRhIHRyYW5zZmVyCisqIEluIGFsbCBvdGhlciBjYXNlcywgYSB6ZXJvIGlzIHJldHVybmVkLgorKiBCQVAgSW5pdGlhbGl6YXRpb24gZmFpbHVyZSBpbmRpY2F0ZXMgYW4gSC9XIGVycm9yIHdoaWNoIGlzIHZlcnkgbGlrZWx5IHRvIHNpZ25hbCBjb21wbGV0ZSBIL1cgZmFpbHVyZS4KKyogT25jZSBhIEJBUCBJbml0aWFsaXphdGlvbiBmYWlsdXJlIGhhcyBvY2N1cnJlZCBhbGwgc3Vic2VxdWVudCBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgSGVybWVzIHdpbGwgcmV0dXJuIGEKKyogImRlZnVuY3QiIHN0YXR1cyB0aWxsIHRoZSBIZXJtZXMgaXMgcmUtaW5pdGlhbGl6ZWQgYnkgbWVhbnMgb2YgYW4gaGNmX2Nvbm5lY3QuCisqCisqIEEgQkFQIGlzIGEgc2V0IG9mIHJlZ2lzdGVycyAoT2Zmc2V0LCBTZWxlY3QgYW5kIERhdGEpIG9mZmVyaW5nIHJlYWQvd3JpdGUgYWNjZXNzIHRvIGEgcGFydGljdWxhciBGSUQgb3IKKyogUklELiBUaGlzIGFjY2VzcyBpcyBiYXNlZCBvbiBhIGF1dG8taW5jcmVtZW50IGZlYXR1cmUuCisqIFRoZXJlIGFyZSB0d28gQkFQcyBidXQgdGhlc2UgZGF5cyB0aGUgSENGIHVzZXMgb25seSBCQVBfMSBhbmQgbGVhdmVzIEJBUF8wIHRvIHRoZSBQQ0kgQnVzbWFzdGVyaW5nIEgvVy4KKyoKKyogVGhlIEJBUC1tZWNoYW5pc20gaXMgYmFzZWQgb24gdGhlIEJ1c3kgYml0IGluIHRoZSBPZmZzZXQgcmVnaXN0ZXIgKHNlZSB0aGUgSGVybWVzIGRlZmluaXRpb24pLiBUaGUgd2FpdGluZworKiBmb3IgQnVzeSBtdXN0IG9jY3VyIGJldHdlZW4gd3JpdGluZyB0aGUgT2Zmc2V0IHJlZ2lzdGVyIGFuZCBhY2Nlc3NpbmcgdGhlIERhdGEgcmVnaXN0ZXIuIFRoZQorKiBpbXBsZW1lbnRhdGlvbiB0byB3YWl0IGZvciB0aGUgQnVzeSBiaXQgZHJvcCBhZnRlciBlYWNoIHdyaXRlIHRvIHRoZSBPZmZzZXQgcmVnaXN0ZXIsIGltcGxpZXMgdGhhdCB0aGUKKyogcmVxdWlyZW1lbnQgdGhhdCB0aGUgQnVzeSBiaXQgaXMgbG93ICBiZWZvcmUgdGhlIFNlbGVjdCByZWdpc3RlciBpcyB3cml0dGVuLCBpcyBhdXRvbWF0aWNhbGx5IG1ldC4KKyogQkFQLXNldHVwIG1heSBiZSB0aW1lIGNvbnN1bWluZyAoZS5nLiAzODAgdXNlYyBmb3IgbGFyZ2Ugb2Zmc2V0cyBvY2N1cnMgZnJlcXVlbnRseSkuIFRoZSB3YWl0IGZvciBCdXN5IGJpdAorKiBkcm9wIGlzIHByb3RlY3RlZCBieSBhIGxvb3AgY291bnRlciwgd2hpY2ggaXMgaW5pdGlhbGl6ZWQgd2l0aCBJRkJfVGlja0luaSwgd2hpY2ggaXMgY2FsaWJyYXRlZCBpbiBpbml0LgorKgorKiBUaGUgTklDIEkvRiBpcyBvcHRpbWl6ZWQgZm9yIHdvcmQgdHJhbnNmZXIgYW5kIGNhbiBvbmx5IGhhbmRsZSB3b3JkIHRyYW5zZmVyIGF0IGEgd29yZCBib3VuZGFyeSBpbiBOSUMKKyogUkFNLiBUaGUgaW50ZW5kZWQgc29sdXRpb24gZm9yIHRyYW5zZmVyIG9mIGEgc2luZ2xlIGJ5dGUgaGFzIG11bHRpcGxlIEgvVyBmbGF3cy4gVGhlcmUgaGF2ZSBiZWVuIGRpZmZlcmVudAorKiBTL1cgV29ya2Fyb3VuZCBzdHJhdGVnaWVzLiBSSUQgYWNjZXNzIGlzIGhjZl8xNiBiYXNlZCBieSAibmF0dXJlIiwgc28gbm8gYnl0ZSBhY2Nlc3MgcHJvYmxlbXMuICBGb3IgVHgvUngKKyogRklEIGFjY2VzcywgIHRoZSBieXRlIGxvZ2ljIGJlY2FtZSBvYnNvbGV0ZSBieSBhYnNvcmJpbmcgaXQgaW4gdGhlIGRvdWJsZSB3b3JkIG9yaWVudGVkIG5hdHVyZSBvZiB0aGUgTUlDCisqIGZlYXR1cmUuCisqCisqCisqLkRJQUdSQU0KKyoKKyoyOgl0aGUgdGVzdCBvbiByYyBjaGVja3Mgd2hldGhlciB0aGUgSENGIHdlbnQgaW50byAiZGVmdW5jdCIgbW9kZSAoIGUuZy4gQkFQIGluaXRpYWxpemF0aW9uIG9yIGEgY2FsbCB0bworKgljbWRfd2FpdCBkaWQgZXZlciBmYWlsKS4KKyo0Ogl0aGUgc2VsZWN0IHJlZ2lzdGVyIGFuZCBvZmZzZXQgcmVnaXN0ZXIgYXJlIHNldAorKgl0aGUgb2Zmc2V0IHJlZ2lzdGVyIGlzIG1vbml0b3JlZCB0aWxsIGEgc3VjY2Vzc2Z1bCBjb25kaXRpb24gKG5vIGJ1c3kgYml0KSBpcyBkZXRlY3RlZCBvciB0aWxsIHRoZQorKgkoY2FsaWJyYXRlZCkgcHJvdGVjdGlvbiBjb3VudGVyIGV4cGlyZXMKKyoJSWYgdGhlIGNvdW50ZXIgZXhwaXJlcywgdGhpcyBpcyByZWZsZWN0ZWQgaW4gSUZCX0RlZnVuY3RTdGF0LCBzbyBhbGwgc3Vic2VxdWVudCBjYWxscyB0byBzZXR1cF9iYXAgZmFpbAorKglpbW1lZGlhdGVseSAoIHNlZSAyKQorKjY6CWluaXRpYWxpemF0aW9uIG9mIHRoZSBjYXJyeSBhcyB1c2VkIGJ5IHBldC9nZXRfZnJhZworKjg6CUhSRUdfT0ZGU0VUX0VSUiBpcyBpZ25vcmVkIGFzIGVycm9yIGJlY2F1c2U6CisqCSBhOiB0aGUgSGVybWVzIGlzIHJvYnVzdCBhZ2FpbnN0IGl0CisqCSBiOiBpdCBpcyBub3Qga25vd24gd2hhdCBjYXVzZXMgaXQgKHByb2JhYmx5IGEgYnVnKSwgaGVuY2Ugbm8gc3RyYXRlZ3kgY2FuIGJlIHNwZWNpZmllZCB3aGljaCBsZXZlbCBpcworKgkJdG8gaGFuZGxlIHRoaXMgZXJyb3IgaW4gd2hpY2ggd2F5LiBJbiB0aGUgcGFzdCwgaXQgY291bGQgYmUgaW5kdWNlZCBieSB0aGUgTVNGIGxldmVsLCBlLmcuIGJ5IGNhbGxpbmcKKyoJCWhjZl9yY3ZfbXNnIHdoaWxlIHRoZXJlIHdhcyBubyBSeC1GSUQgYXZhaWxhYmxlLiBTaW5jZSB0aGlzIGlzIGFuIE1TRi1lcnJvciB3aGljaCBpcyBjYXVnaHQgYnkgQVNTRVJULAorKgkJdGhlcmUgaXMgbm8gcnVuLXRpbWUgYWN0aW9uIHJlcXVpcmVkIGJ5IHRoZSBIQ0YuCisqCUx1bXBpbmcgdGhlIE9mZnNldCBlcnJvciBpbiB3aXRoIHRoZSBCdXN5IGJpdCBlcnJvciwgYXMgaGFzIGJlZW4gZG9uZSBpbiB0aGUgcGFzdCB0dXJucyBvdXQgdG8gYmUgYQorKglkaXNhc3RlciBvciBhIGxpZmUgc2F2ZXIsIGp1c3QgZGVwZW5kaW5nIG9uIHdoYXQgdGhlIGNhdXNlIG9mIHRoZSBlcnJvciBpcy4gU2luY2Ugbm8gcHJlZGljdGlvbiBjYW4gYmUKKyoJZG9uZSBhYm91dCB0aGUgZnV0dXJlLCBpdCBpcyAiZmVsdCIgdG8gYmUgdGhlIGJlc3Qgc3RyYXRlZ3kgdG8gaWdub3JlIHRoaXMgZXJyb3IuIE9uZSBkYXkgdGhlIGNvZGUgd2FzCisqCWFjY29tcGFuaWVkIGJ5IHRoZSBmb2xsb3dpbmcgY29tbWVudDoKKyoJLy8JaWdub3JlIEhSRUdfT0ZGU0VUX0VSUiwgc29tZW9uZSwgc3VwcG9zZWRseSB0aGUgTVNGIHByb2dyYW1tZXIgOykgbWFkZSBhIGJ1Zy4gU2luY2Ugd2UgZG9uJ3Qga25vdworKgkvLwl3aGF0IGlzIGdvaW5nIG9uLCB3ZSBtaWdodCBhcyB3ZWxsIGdvIG9uIC0gdW5kZXIgbWFuYWdlbWVudCBwcmVzc3VyZSAtIGJ5IGlnbm9yaW5nIGl0CisqCisqLkVORERPQyAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hDRl9TVEFUSUMgaW50CitzZXR1cF9iYXAoIElGQlAgaWZicCwgaGNmXzE2IGZpZCwgaW50IG9mZnNldCwgaW50IHR5cGUgKQoreworUFJPVF9DTlRfSU5JCitpbnQJcmM7CisKKwlIQ0ZUUkFDRSggaWZicCwgSENGX1RSQUNFX1NUUklPICk7CisJaWYgKCAoIHJjID0gaWZicC0+SUZCX0RlZnVuY3RTdGF0ICkgPT0gSENGX1NVQ0NFU1MgKSB7CQkJCQkJCQkJCS8qMiovCisJCU9QVyggSFJFR19TRUxFQ1RfMSwgZmlkICk7CQkJCQkJCQkJCQkJCQkJCS8qNCovCisJCU9QVyggSFJFR19PRkZTRVRfMSwgb2Zmc2V0ICk7CisJCWlmICggdHlwZSA9PSBJT19JTiApIHsKKwkJCWlmYnAtPklGQl9DYXJyeUluID0gMDsKKwkJfQorCQllbHNlIGlmYnAtPklGQl9DYXJyeU91dCA9IDA7CisJCUhDRl9XQUlUX1dISUxFKCBJUFcoIEhSRUdfT0ZGU0VUXzEpICYgSENNRF9CVVNZICk7CisJCUhDRkFTU0VSVCggISggSVBXKCBIUkVHX09GRlNFVF8xKSAmIEhSRUdfT0ZGU0VUX0VSUiApLCBNRVJHRV8yKCBmaWQsIG9mZnNldCApICkJCQkvKjgqLworCQlpZiAoIHByb3RfY250ID09IDAgKSB7CisJCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgTUVSR0VfMiggZmlkLCBvZmZzZXQgKSApCisJCQlyYyA9IGlmYnAtPklGQl9EZWZ1bmN0U3RhdCA9IEhDRl9FUlJfREVGVU5DVF9USU1FX09VVDsKKwkJCWlmYnAtPklGQl9DYXJkU3RhdCB8PSBDQVJEX1NUQVRfREVGVU5DVDsKKwkJfQorCX0KKwlIQ0ZUUkFDRSggaWZicCwgSENGX1RSQUNFX1NUUklPIHwgSENGX1RSQUNFX0VYSVQgKTsKKwlyZXR1cm4gcmM7Cit9IC8vIHNldHVwX2JhcAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9oY2YuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2hjZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZDU3MzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9oY2YuaApAQCAtMCwwICsxLDQwNSBAQAorCisvLyAgIHZpbTp0dz0xMTA6dHM9NDoKKyNpZm5kZWYgSENGX0gKKyNkZWZpbmUgSENGX0ggMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZJTEUJIDogaGNmLmgKKyoKKyogREFURSAgIDogJERhdGU6IDIwMDQvMDgvMDUgMTE6NDc6MTAgJCAgICRSZXZpc2lvbjogMS43ICQKKyogT3JpZ2luYWw6IDIwMDQvMDUvMTkgMDc6MjY6MDEgICAgUmV2aXNpb246IDEuNTYgICAgICBUYWc6IGhjZjdfdDIwMDQwNjAyXzAxCisqIE9yaWdpbmFsOiAyMDA0LzA1LzEyIDA4OjQ3OjIzICAgIFJldmlzaW9uOiAxLjUzICAgICAgVGFnOiBoY2Y3X3Q3XzIwMDQwNTEzXzAxCisqIE9yaWdpbmFsOiAyMDA0LzA0LzE1IDA5OjI0OjQyICAgIFJldmlzaW9uOiAxLjQ2ICAgICAgVGFnOiBoY2Y3X3Q3XzIwMDQwNDE1XzAxCisqIE9yaWdpbmFsOiAyMDA0LzA0LzA4IDE1OjE4OjE2ICAgIFJldmlzaW9uOiAxLjQ1ICAgICAgVGFnOiB0N18yMDA0MDQxM18wMQorKiBPcmlnaW5hbDogMjAwNC8wNC8wMSAxNTozMjo1NSAgICBSZXZpc2lvbjogMS40MyAgICAgIFRhZzogdDdfMjAwNDA0MDFfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDMvMTAgMTU6Mzk6MjggICAgUmV2aXNpb246IDEuMzkgICAgICBUYWc6IHQyMDA0MDMxMF8wMQorKiBPcmlnaW5hbDogMjAwNC8wMy8wNCAxMTowMzozOCAgICBSZXZpc2lvbjogMS4zNyAgICAgIFRhZzogdDIwMDQwMzA0XzAxCisqIE9yaWdpbmFsOiAyMDA0LzAzLzAyIDE0OjUxOjIxICAgIFJldmlzaW9uOiAxLjM1ICAgICAgVGFnOiB0MjAwNDAzMDJfMDMKKyogT3JpZ2luYWw6IDIwMDQvMDIvMjQgMTM6MDA6MjggICAgUmV2aXNpb246IDEuMjggICAgICBUYWc6IHQyMDA0MDIyNF8wMQorKiBPcmlnaW5hbDogMjAwNC8wMi8wOSAxNDo1MDoxNCAgICBSZXZpc2lvbjogMS4yNiAgICAgIFRhZzogdDIwMDQwMjE5XzAxCisqCisqIEFVVEhPUiA6IE5pY28gVmFsc3RlcgorKgorKiBTUEVDSUZJQ0FUSU9OOiAuLi4uLi4uLi4uCisqCisqIERFU0MgICA6IERlZmluaXRpb25zIGFuZCBQcm90b3R5cGVzIGZvciBNU0YgYXMgd2VsbCBhcyBIQ0Ygc291cmNlcworKgorKgkJICAgQ3VzdG9taXphYmxlIHZpYSBIQ0ZDRkcuSAorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoKKyogU09GVFdBUkUgTElDRU5TRQorKgorKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyoKKyogQ09QWVJJR0hUIKkgMTk5NCAtIDE5OTUJYnkgQVQmVC4JCQkJQWxsIFJpZ2h0cyBSZXNlcnZlZAorKiBDT1BZUklHSFQgqSAxOTk2IC0gMjAwMCBieSBMdWNlbnQgVGVjaG5vbG9naWVzLglBbGwgUmlnaHRzIFJlc2VydmVkCisqIENPUFlSSUdIVCCpIDIwMDEgLSAyMDA0CWJ5IEFnZXJlIFN5c3RlbXMgSW5jLglBbGwgUmlnaHRzIFJlc2VydmVkCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyoKKyogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisqICAgIGRpc3RyaWJ1dGlvbi4KKyoKKyogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqCisqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogRGlzY2xhaW1lcgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisqIERBTUFHRS4KKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgImhjZmNmZy5oIgkvLyBTeXN0ZW0gQ29uc3RhbnRzIHRvIGJlIGRlZmluZWQgYnkgdGhlIE1TRi1wcm9ncmFtbWVyIHRvIHRhaWxvciB0aGUgSENGCisjaW5jbHVkZSAibWRkLmgiCS8vIEluY2x1ZGUgZmlsZSBjb21tb24gZm9yIEhDRiwgTVNGCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTUFDUk9TICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExPRih4KSAJCQkoc2l6ZW9mKHgpL3NpemVvZihoY2ZfMTYpLTEpCisKKy8qCUVuZGlhbmVzcworICoJTGl0dGxlIEVuZGlhbiAoYS5rLmEuIEludGVsKSwgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdAorICoJQmlnIEVuZGlhbiAoYS5rLmEuIE1vdG9yb2xhKSwgbW9zdCBzaWduaWZpY2FudCBieXRlIGZpcnN0CisgKgorICogVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIHN1cHBsaWVkCisgKiAgbyBDTlZfTElUVExFX1RPX1NIT1JUKHcpCQkJaW50ZXJwcmV0cyB0aGUgMTYtYml0cyBpbnB1dCB2YWx1ZSBhcyBMaXR0bGUgRW5kaWFuLCByZXR1cm5zIGFuIGhjZl8xNgorICogCW8gQ05WX0JJR19UT19TSE9SVCh3KQkJCQlpbnRlcnByZXRzIHRoZSAxNi1iaXRzIGlucHV0IHZhbHVlIGFzIEJpZyBFbmRpYW4sIHJldHVybnMgYW4gaGNmXzE2CisgKgorICovCisKKy8qIFRvIGluY3JlYXNlIHBvcnRhYmlsaXR5LCB1c2UgdW5zaWduZWQgY2hhciBhbmQgdW5zaWduZWQgY2hhciAqIHdoZW4gYWNjZXNzaW5nIHBhcnRzIG9mIGxhcmdlcgorICogdHlwZXMgdG8gY29udmVydCB0aGVpciBFbmRpYW5lc3MKKyAqLworCisjZGVmaW5lIENOVl9FTkRfU0hPUlQodykgIChoY2ZfMTYpKCAoKGhjZl8xNikodykgJiAweDAwRkYpIDw8IDggfCAoKGhjZl8xNikodykgJiAweEZGMDApID4+IDggKQorI2RlZmluZSBDTlZfRU5EX0xPTkcoZHcpICAoaGNmXzMyKSggKGR3ID4+IDI0KSB8ICgoZHcgPj4gOCkgJiAweGZmMDApIHwgKChkdyA8PCA4KSAmIDB4ZmYwMDAwKSB8IChkdyA8PCAyNCkgKQorCisjaWYgSENGX0JJR19FTkRJQU4KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQiBJIEcgICBFIE4gRCBJIEEgTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIENOVl9MSVRUTEVfVE9fU0hPUlQodykJQ05WX0VORF9TSE9SVCh3KQkvLyAgICBlbmRpYW5lc3MgY29udmVyc2lvbiBuZWVkZWQKKyNkZWZpbmUgQ05WX0JJR19UT19TSE9SVCh3KQkJKHcpCQkJCS8vIG5vIGVuZGlhbmVzcyBjb252ZXJzaW9uIG5lZWRlZAorI2RlZmluZSBDTlZfTElUVExFX1RPX0xPTkcoZHcpCUNOVl9FTkRfTE9ORyhkdykKKyNkZWZpbmUgQ05WX0xPTkdfVE9fTElUVExFKGR3KQlDTlZfRU5EX0xPTkcoZHcpCisjZWxzZQorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTCBJIFQgVCBMIEUgICBFIE4gRCBJIEEgTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIENOVl9MSVRUTEVfVE9fU0hPUlQodykgCSh3KQkJCQkvLyBubyBlbmRpYW5lc3MgY29udmVyc2lvbiBuZWVkZWQKKyNkZWZpbmUgQ05WX0JJR19UT19TSE9SVCh3KQkJQ05WX0VORF9TSE9SVCh3KQkvLyAgICBlbmRpYW5lc3MgY29udmVyc2lvbiBuZWVkZWQKKyNkZWZpbmUgQ05WX0xJVFRMRV9UT19MT05HKGR3KQkoZHcpCisjZGVmaW5lIENOVl9MT05HX1RPX0xJVFRMRShkdykJKGR3KQorCisjaWYgZGVmaW5lZCBIQ0ZfQUxJR04gJiYgSENGX0FMSUdOID4gMQorI2RlZmluZSBDTlZfU0hPUlRQX1RPX0xJVFRMRShwdykJKChoY2ZfMTYpKCooaGNmXzggKilwdykpIAkJCXwgKChoY2ZfMTYpKCooKGhjZl84ICopcHcrMSkpIDw8IDgpCisjZGVmaW5lIENOVl9MT05HUF9UT19MSVRUTEUocGR3KQkoKGhjZl8zMikoKihoY2ZfOCAqKXBkdykpIAkJCXwgKChoY2ZfMzIpKCooKGhjZl84ICopcGR3KzEpKSA8PCA4KSAJfCBcCisJCQkJCQkJCQkoKGhjZl8zMikoKigoaGNmXzggKilwZHcrMikpIDw8IDE2KSB8ICgoaGNmXzMyKSgqKChoY2ZfOCAqKXBkdyszKSkgPDwgMjQpCisjZWxzZQorI2RlZmluZSBDTlZfTE9OR1BfVE9fTElUVExFKHBkdykJKCooaGNmXzMyICopcGR3KQorI2RlZmluZSBDTlZfU0hPUlRQX1RPX0xJVFRMRShwdykJKCooaGNmXzE2ICopcHcpCisjZW5kaWYKKworI2VuZGlmIC8vIEhDRl9CSUdfRU5ESUFOCisKKy8vIGNvbnZlcnNpb24gbWFjcm9zIHdoaWNoIGNhbiBiZSBleHByZXNzZWQgaW4gb3RoZXIgbWFjcm9zCisjZGVmaW5lIENOVl9TSE9SVF9UT19MSVRUTEUodykJQ05WX0xJVFRMRV9UT19TSE9SVCh3KQorI2RlZmluZSBDTlZfU0hPUlRfVE9fQklHKHcpCQlDTlZfQklHX1RPX1NIT1JUKHcpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIEVORCBPRiBNQUNST1MgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBvZmZzZXRzIFRyYW5zbWl0L1JlY2VpdmUgRnJhbWUgU3RydWN0dXJlCisjZGVmaW5lIEhGU19TVEFUCQkJCTB4MDAwMAorI2RlZmluZSBIRlNfU1dTVVAJCQkJMHgwMDA2CQkJCQkvL1NXIFN1cHBvcnQKKyNkZWZpbmUgSEZTX1FfSU5GTwkJCQkweDAwMDYJCQkJCS8vU2lnbmFsL1NpbGVuY2UgbGV2ZWwKKyNkZWZpbmUgSEZTX1JBVEUJCQkJMHgwMDA4CQkJCQkvL1J4Rmxvdy9SYXRlCisjZGVmaW5lIAlIRlNfU1RBVF9FUlIJCVJYX1NUQVRfRVJSCQkJCS8vbGluayAibmF0dXJhbCIgSENGIG5hbWUgdG8gIm5hdHVyYWwiIE1TRiBuYW1lCisjZGVmaW5lIEhGU19UWF9DTlRMCQkJCTB4MDAzNgorCQkJCQkJCQkJCQkJCQkvLyBILUkgICAgIEgtSUkKKyNkZWZpbmUgSEZTX0RBVF9MRU4JCQkJKEhGU19BRERSX0RFU1QgLSAyKQkJLy8gMHgwMDJDICAweDAwMzgKKyNkZWZpbmUgSEZTX0FERFJfREVTVAkJCTB4MDAzQQkJCQkJLy8gMHgwMDJFICAweDAwM0EKKyNkZWZpbmUgSEZTX0FERFJfU1JDCQkJKEhGU19BRERSX0RFU1QgKyA2KQkJLy8gMHgwMDM0ICAweDAwNDAKKyNkZWZpbmUgSEZTX0xFTgkJCQkJKEhGU19BRERSX1NSQyAgKyA2KQkJLy8gMHgwMDNBICAweDAwNDYKKyNkZWZpbmUgSEZTX0RBVAkJCQkJKEhGU19MRU4gICAgICAgKyAyKQkJLy8gMHgwMDNDICAweDAwNDgKKyNkZWZpbmUgSEZTX1RZUEUJCQkJKEhGU19EQVQgICAgICAgKyA2KQkJLy8gMHgwMDQyICAweDAwNEUKKworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICBEIEUgUyBDIFIgSSBQIFQgTyBSICAgUyBUIFIgVSBDIFQgVSBSIEUgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy87P01ERC5IIHN0dWZmIDs/CisKKyNpZiBIQ0ZfQklHX0VORElBTgorI2RlZmluZSBERVNDX1NUUkNUX0NOVAkJMAorI2RlZmluZSBERVNDX1NUUkNUX1NJWkUJCTEKKyNlbHNlCisjZGVmaW5lIERFU0NfU1RSQ1RfQ05UCQkxCisjZGVmaW5lIERFU0NfU1RSQ1RfU0laRQkJMAorI2VuZGlmIC8vIEhDRl9CSUdfRU5ESUFOCisKKyNkZWZpbmUJQlVGX0NOVAkJCQlidWZfZGltW0RFU0NfU1RSQ1RfQ05UXQorI2RlZmluZQlCVUZfU0laRQkJCWJ1Zl9kaW1bREVTQ19TVFJDVF9TSVpFXQorCit0eXBlZGVmIHN0cnVjdCBERVNDX1NUUkNUIHsKKwloY2ZfMTYJCQkJCWJ1Zl9kaW1bMl07CisJaGNmXzMyCQkJCQlidWZfcGh5c19hZGRyOworCWhjZl8zMgkJCQkJbmV4dF9kZXNjX3BoeXNfYWRkcjsJLy8gcGh5c2ljYWwgYWRkcmVzcyBvZiBuZXh0IGRlc2NyaXB0b3IKKwloY2ZfMzIJCQkJCWRlc2NfcGh5c19hZGRyOwkJCS8vIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhpcyBkZXNjcmlwdG9yCisJc3RydWN0IERFU0NfU1RSQ1QgCQkqbmV4dF9kZXNjX2FkZHI7CisJaGNmXzgJRkFSCQkJCSpidWZfYWRkcjsKKyNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX0RFU0NfU1RSQ1QKKwl2b2lkIEZBUgkJCSAgICpERVNDX01TRlN1cDsJCQkvLyBwb2ludGVyIGZvciBhcmJpdHJhcnkgdXNlIGJ5IHRoZSBNU0YKKyNlbmRpZiAvLyBIQ0ZfREVTQ19TVFJDVF9FWFQKK30gREVTQ19TVFJDVDsKKworI2RlZmluZSBIQ0ZfREFTQV9TSVpFCQkJMTIJCQkJCQkJLy9zaXplIGluIGJ5dGVzIGZvciBEQS9TQQorCisjZGVmaW5lIERFU0NfQ05UX01BU0sgCQkJMHgwRkZGCisKKyNkZWZpbmUgR0VUX0JVRl9TSVpFKGRlc2NwKSAgICAgICAoKGRlc2NwKS0+QlVGX1NJWkUpCisjZGVmaW5lIEdFVF9CVUZfQ05UKGRlc2NwKSAgICAgICAgKChkZXNjcCktPkJVRl9DTlQpCisjZGVmaW5lIFNFVF9CVUZfU0laRShkZXNjcCwgc2l6ZSkgKGRlc2NwKS0+QlVGX1NJWkUgPSBzaXplOworI2RlZmluZSBTRVRfQlVGX0NOVChkZXNjcCwgY291bnQpIChkZXNjcCktPkJVRl9DTlQgPSBjb3VudDsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgVCBBIEwgTCBJIEUgUyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3R5cGVkZWYgc3RydWN0ICB7ICAvL0hlcm1lcyBUYWxsaWVzIChJRkIgc3Vic3RydWN0dXJlKQorICBoY2ZfMzIJVHhVbmljYXN0RnJhbWVzOworICBoY2ZfMzIJVHhNdWx0aWNhc3RGcmFtZXM7CisgIGhjZl8zMglUeEZyYWdtZW50czsKKyAgaGNmXzMyCVR4VW5pY2FzdE9jdGV0czsKKyAgaGNmXzMyCVR4TXVsdGljYXN0T2N0ZXRzOworICBoY2ZfMzIJVHhEZWZlcnJlZFRyYW5zbWlzc2lvbnM7CisgIGhjZl8zMglUeFNpbmdsZVJldHJ5RnJhbWVzOworICBoY2ZfMzIJVHhNdWx0aXBsZVJldHJ5RnJhbWVzOworICBoY2ZfMzIJVHhSZXRyeUxpbWl0RXhjZWVkZWQ7CisgIGhjZl8zMglUeERpc2NhcmRzOworICBoY2ZfMzIJUnhVbmljYXN0RnJhbWVzOworICBoY2ZfMzIJUnhNdWx0aWNhc3RGcmFtZXM7CisgIGhjZl8zMglSeEZyYWdtZW50czsKKyAgaGNmXzMyCVJ4VW5pY2FzdE9jdGV0czsKKyAgaGNmXzMyCVJ4TXVsdGljYXN0T2N0ZXRzOworICBoY2ZfMzIJUnhGQ1NFcnJvcnM7CisgIGhjZl8zMglSeERpc2NhcmRzTm9CdWZmZXI7CisgIGhjZl8zMglUeERpc2NhcmRzV3JvbmdTQTsKKyAgaGNmXzMyCVJ4V0VQVW5kZWNyeXB0YWJsZTsKKyAgaGNmXzMyCVJ4TXNnSW5Nc2dGcmFnbWVudHM7CisgIGhjZl8zMglSeE1zZ0luQmFkTXNnRnJhZ21lbnRzOworICBoY2ZfMzIJUnhEaXNjYXJkc1dFUElDVkVycm9yOworICBoY2ZfMzIJUnhEaXNjYXJkc1dFUEV4Y2x1ZGVkOworI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfVEFMTElFU19GVworICBoY2ZfMzIJVGFsbGllc0V4dHJhWzMyXTsKKyNlbmRpZiAvLyBIQ0ZfRVhUX1RBTExJRVNfRlcKK30gQ0ZHX0hFUk1FU19UQUxMSUVTX1NUUkNUOworCit0eXBlZGVmIHN0cnVjdCAgeyAgLy9IQ0YgVGFsbGllcyAoSUZCIHN1YnN0cnVjdHVyZSkKKyAgaGNmXzMyCU5vQnVmSW5mbzsgIAkJCQkvL05vIGJ1ZmZlciBhdmFpbGFibGUgZm9yIHVuc29saWNpdGVkIE5vdGlmeSBmcmFtZQorICBoY2ZfMzIJTm9CdWZNQjsJCQkJCS8vTm8gc3BhY2UgYXZhaWxhYmxlIGluIE1haWxCb3gKKyAgaGNmXzMyCU1pc2NFcnI7CQkJCQkvKiBDb21tYW5kIGVycm9ycworICAJCQkJCQkJCQkJICogIC0gdGltZSBvdXQgb24gY29tcGxldGlvbiBzeW5jaHJvbm91cyBwYXJ0IEhlcm1lcyBDb21tYW5kCisgIAkJCQkJCQkJCQkgKiAgLSBjb21wbGV0ZWQgSGVybWVzIENvbW1hbmQgZG9lc24ndCBtYXRjaCBvcmlnaW5hbCBjb21tYW5kCisgIAkJCQkJCQkJCQkgKiAgLSBzdGF0dXMgb2YgY29tcGxldGVkIEhlcm1lcyBDb21tYW5kIGNvbnRhaW5zIGVycm9yIGJpdHMKKyAgCQkJCQkJCQkJCSAqLworI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfVEFMTElFU19GVworICBoY2ZfMzIJRW5nQ250WzhdOworI2VuZGlmIC8vIEhDRl9FWFRfVEFMTElFU19GVworfSBDRkdfSENGX1RBTExJRVNfU1RSQ1Q7CisKKy8vTm90ZSB0aGlzIHdheSB0byBkZWZpbmUgLi4uX1RBTF9DTlQgaW1wbGllcyB0aGF0IGFsbCB0YWxsaWVzIG11c3Qga2VlcCB0aGUgc2FtZSAoaGNmXzMyKSBzaXplCisjaWYgKEhDRl9UQUxMSUVTKSAmICggSENGX1RBTExJRVNfTklDIHwgSENGX1RBTExJRVNfSENGICkKKyNpZiAoSENGX1RBTExJRVMpICYgSENGX1RBTExJRVNfTklDCS8vSGVybWVzIHRhbGx5IHN1cHBvcnQKKyNkZWZpbmUJCUhDRl9OSUNfVEFMX0NOVAkoc2l6ZW9mKENGR19IRVJNRVNfVEFMTElFU19TVFJDVCkvIHNpemVvZihoY2ZfMzIpKQorI2Vsc2UKKyNkZWZpbmUJCUhDRl9OSUNfVEFMX0NOVAkwCisjZW5kaWYgLy8gSENGX1RBTExJRVMKKyNpZiAoSENGX1RBTExJRVMpICYgSENGX1RBTExJRVNfSENGCS8vSENGIHRhbGx5IHN1cHBvcnQKKyNkZWZpbmUJCUhDRl9IQ0ZfVEFMX0NOVAkoc2l6ZW9mKENGR19IQ0ZfVEFMTElFU19TVFJDVCkgICAvIHNpemVvZihoY2ZfMzIpKQorI2Vsc2UKKyNkZWZpbmUJCUhDRl9IQ0ZfVEFMX0NOVAkwCisjZW5kaWYgLy8gSENGX1RBTExJRVMKKyNkZWZpbmUgSENGX1RPVF9UQUxfQ05UICggSENGX05JQ19UQUxfQ05UICsgSENGX05JQ19UQUxfQ05UICkKKyNlbmRpZiAvLyBIQ0ZfVEFMTElFU19OSUMgLyBIQ0ZfVEFMTElFU19IQ0YKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJIE4gVCBFIFIgRiBBIEMgRSAgIEIgTCBPIEMgSyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSUZCX1ZFUlNJT04gMHgwRQkgCQkJLy8gaW5pdGlhbGx5IDAsIHRvIGJlIGluY3JlbWVudGVkIGJ5IGV2ZXJ5IElGQiBsYXlvdXQgY2hhbmdlCisKK3R5cGVkZWYgc3RydWN0ICB7CisgIGhjZl9pbwkJSUZCX0lPQmFzZTsJCQkJLy8gSS9PIGFkZHJlc3Mgb2YgSGVybWVzIGNoaXAgYXMgcGFzc2VkIGJ5IE1TRiBhdCBoY2ZfY29ubmVjdCBjYWxsCisgIGhjZl8xNgkJSUZCX0lPUmFuZ2U7CQkJLy8gSS9PIFJhbmdlIHVzZWQgYnkgSGVybWVzIGNoaXAKKyAgaGNmXzE2CQlJRkJfRExNb2RlOwkJCQkvLyBEb3dubG9hZCBNb2RlIHN0YXRlCisgIGhjZl8xNgkJSUZCX0NtZDsJCQkJLy8gY21kIGluIHByb2dyZXNzIGZsYWcsIHRvIGJlIGFjay1lZCBiZWZvcmUgbmV4dCBjbWQgY2FuIGJlIGlzc3VlZAorICBoY2ZfMTYJCUlGQl9SeEZJRDsJCQkJLy8gRklEIG9mICJjdXJyZW50IiBSeEZTIChub24tRE1BIG1vZGUpCisvLzs/I2lmIHR4X2RlbGF5IG9wdGlvbgorICBoY2ZfMTYJCUlGQl9UeEZJRDsJCQkJLy8gZmlkIHN0b3JhZ2UgZHVyaW5nICJkZWxheWVkIiBzZW5kCisvLzs/I2VuZGlmIHR4X2RlbGF5IG9wdGlvbgorICBoY2ZfMTYJCUlGQl9SeExlbjsJCQkJLy8KKyAgaGNmXzE2CQlJRkJfRGVmdW5jdFN0YXQ7CQkvLyBCQVAgaW5pdGlhbGl6YXRpb24gb3IgQ21kIENvbXBsZXRpb24gZmFpbGVkCisgIGhjZl8xNgkJSUZCX0VyckNtZDsJCQkJLy8gY29udGVudHMgU3RhdHVzIHJlZyB3aGVuIGVycm9yIGJpdHMgYW5kL29yIG1pc21hdGNoIGluIGNtZF93YWl0CisgIGhjZl8xNgkJSUZCX0VyclF1YWxpZmllcjsJCS8vIGNvbnRlbnRzIFJlc3AwICByZWcgd2hlbiBlcnJvciBiaXRzIGFuZC9vciBtaXNtYXRjaCBpbiBjbWRfd2FpdAorICBoY2ZfMTYJCUlGQl9sYWw7CQkJCS8vIExvb2tBaGVhZCBMZW5ndGgKKyAgd2NpX2J1ZnAJCUlGQl9sYXA7CQkJCS8vIExvb2tBaGVhZCBCdWZmZXIgcG9pbnRlcgorICBoY2ZfMTYJCUlGQl9MaW5rU3RhdDsJCQkvLyBMaW5rIFN0YXR1cworICBoY2ZfMTYJCUlGQl9EU0xpbmtTdGF0OwkJCS8vIExpbmsgU3RhdHVzLCBuZXcgc3RyYXRlZ3kgaW50cm9kdWNlZCBmb3IgRGVlcFNsZWVwCisgIGhjZl8xNgkJSUZCX0NhcnJ5SW47CQkJLy8gY2FycnkgYW5kIGNhcnJ5LWZsYWcgdG8gbW92ZSAxIGJ5dGUgZnJvbSBvbmUgZ2V0X2ZyYWcgdG8gdGhlIG5leHQKKyAgaGNmXzE2CQlJRkJfQ2FycnlPdXQ7CQkJLy8gY2FycnkgYW5kIGNhcnJ5LWZsYWcgdG8gbW92ZSAxIGJ5dGUgZnJvbSBvbmUgcHV0X2ZyYWcgdG8gdGhlIG5leHQKKyAgaGNmXzE2CQlJRkJfVmVyc2lvbjsJCQkvLyBJRkJfVkVSU0lPTiwgaW5jcmVtZW50ZWQgYnkgZXZlcnkgU0lHTklGSUNBTlQgSUZCIGxheW91dCBjaGFuZ2UKKyAgaGNmXzE2CQlJRkJfQ2FyZFN0YXQ7CQkJLy8gTklDIGVycm9yIC8gRi9XIGluY29tcGF0aWJpbGl0eSBzdGF0dXMKKyAgaGNmXzE2ICAJCUlGQl9Sc2NJbmQ7CQkJCS8vIG5vbi1ETUE6IFR4RklEIGF2YWlsYWJsZSwgRE1BOiBhbHdheXMgMQorICBoY2ZfMTYJCUlGQl9DbnRsT3B0OwkJCS8vIGZsYWdzOiAzMiBiaXRzIEkvTywgRE1BIGF2YWlsYWJsZSwgRE1BIGVuYWJsZWQKKyAgaGNmXzE2CQlJRkJfQnVzVHlwZTsJCQkvLyBCdXNUeXBlLCBkZXJpdmVkIHZpYSBDRkdfTklDX0JVU19UWVBFCisgIENGR19GV19JREVOVElUWV9TVFJDVAkgSUZCX0ZXSWRlbnRpdHk7IC8qIGtlZXAgRldJZGVudGl0eS9TdXAgYW5kIFBSSUlkZW50aXR5L1N1cCBpbiBzZXF1ZW5jZQorCQkJCQkJCQkJCSAgKiBiZWNhdXNlIG9mIHRoZSAoZHVtYikgY29weSBpbiBpbml0KCkgKi8KKyNpZiBkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQKKyAgQ0ZHX1NVUF9SQU5HRV9TVFJDVAkgSUZCX0ZXU3VwOworICBDRkdfUFJJX0lERU5USVRZX1NUUkNUIElGQl9QUklJZGVudGl0eTsKKyAgQ0ZHX1NVUF9SQU5HRV9TVFJDVAkgSUZCX1BSSVN1cDsKKyAgQ0ZHX1NVUF9SQU5HRV9TVFJDVAkgSUZCX0hTSVN1cDsKKyNlbmRpZiAvLyBNU0ZfQ09NUE9ORU5UX0lECisjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9JTkZPX0xPRworICBSSURfTE9HUAkJSUZCX1JJRExvZ3A7CQkJLy8gcG9pbnRlciB0byBSSURfTE9HIHN0cnVjdHVyZQorI2VuZGlmIC8vIEhDRl9FWFRfSU5GT19MT0cKKyNpZiBIQ0ZfUFJPVF9USU1FCisgIGhjZl8zMgkgCUlGQl9UaWNrSW5pOwkJCS8vIGluaXRpYWxpemF0aW9uIG9mIFMvVyBjb3VudGVyIGJhc2VkIHByb3RlY3Rpb24gbG9vcAorI2VuZGlmIC8vIEhDRl9QUk9UX1RJTUUKKyNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX0lOVF9USUNLCisgIGludAkJCUlGQl9UaWNrQ250OwkJCS8vIEhlcm1lcyBUaW1lciBUaWNrIENvdW50ZXIKKyNlbmRpZiAvLyBIQ0ZfRVhUX0lOVF9USUNLCisjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9NQgorICBoY2ZfMTYgCSAgICpJRkJfTUJwOwkJCQkvLyBwb2ludGVyIHRvIHRoZSBNYWlsQm94CisgIGhjZl8xNgkJSUZCX01CU2l6ZTsJCQkJLy8gc2l6ZSBvZiB0aGUgTWFpbEJveAorICBoY2ZfMTYJCUlGQl9NQldwOwkJCQkvLyB6ZXJvLWJhc2VkIHdyaXRlIGluZGV4IGludG8gdGhlIE1haWxCb3gKKyAgaGNmXzE2CQlJRkJfTUJScDsJCQkJLy8gemVyby1iYXNlZCByZWFkICBpbmRleCBpbnRvIHRoZSBNYWlsQm94CisgIGhjZl8xNgkJSUZCX01CSW5mb0xlbjsJCQkvLyBjb250ZW50cyBvZiBMLWZpZWxkIG9mIHRoZSBvbGRlc3QgYXZhaWxhYmxlIE1haWxCb3hJbmZvQmxvY2sKKyNlbmRpZiAvLyBIQ0ZfRVhUX01CCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQorICBoY2ZfMTYJCUlGQl9NSUNUeENudGw7CQkJLy8gTUlDIGJpdCBhbmQgS2V5IGluZGV4IGluIFR4Q29udHJvbCBmaWVsZCBvZiBUeEZTCisgIGhjZl8zMgkJSUZCX01JQ1R4S2V5WzJdOwkJLy8gY2FsY3VsYXRpbmcga2V5CisgIGhjZl8zMgkJSUZCX01JQ1R4WzJdOyAgIAkgIAkvLyBUeCBNSUMgY2FsY3VsYXRpb24gRW5naW5lIHN0YXRlCisgIGhjZl8xNgkJSUZCX01JQ1R4Q2Fycnk7CQkJLy8gdGVtcCBsZW5ndGgsIGNhcnJpZXMgb3ZlciBmcm9tIG9uZSBUeCBmcmFnbWVudCB0byBhbm90aGVyCisgIGhjZl8xNgkJSUZCX01JQ1J4Q2Fycnk7CQkJLy8gdGVtcCBsZW5ndGgsIGNhcnJpZXMgb3ZlciBmcm9tIG9uZSBSeCBmcmFnbWVudCB0byBhbm90aGVyCisgIGhjZl8zMgkJSUZCX01JQ1J4S2V5WzQqMl07CQkvLyA0IGNoZWNraW5nIGtleXMKKyAgaGNmXzMyCQlJRkJfTUlDUnhbMl07IAkgCQkvLyBSeCBNSUMgY2FsY3VsYXRpb24gRW5naW5lIHN0YXRlCisjZW5kaWYgLy8gSENGX1RZUEVfV1BBCisjaWYgSENGX0FTU0VSVAorI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfTUIKKyAgQ0ZHX01CX0lORk9fUkFOR0UxX1NUUkNUCUlGQl9Bc3NlcnRTdHJjdDsgLy8gQWRkIHNvbWUgY29tcGxpY2F0aW9uIHRvIHRoZSBIQ0YgYXMgcHJpemUgZm9yIHRoZSBuZXcgTVNGIEkvRgorI2VuZGlmIC8vIEhDRl9BU1NFUlRfTUIKKyAgCQkJCQkJCQkJCS8vIHRhcmdldCBvZiBhYm92ZSBJRkJfQXNzZXJ0U3RyY3QKKyAgaGNmXzE2CQlJRkJfQXNzZXJ0TGluZTsJCQkvLyAgLSBsaW5lIG51bWJlciAoICsgZW5jb2RlZCBtb2R1bGUgbmFtZSApCisgIGhjZl8xNgkJSUZCX0Fzc2VydFRyYWNlOwkJLy8gIC0gYml0IGJhc2VkIHRyYWNlIG9mIGFsbCBoY2ZfLi4uLiBpbnZvY2F0aW9ucworICBoY2ZfMzIJCUlGQl9Bc3NlcnRRdWFsaWZpZXI7CS8vICAtIHF1YWxpZmllcgorICBoY2ZfMTYJCUlGQl9Bc3NlcnRMdmw7CQkJLy8gQXNzZXJ0IEZpbHRlcmluZywgTm90IHlldCBpbXBsZW1lbnRlZAorICBoY2ZfMTYJCUlGQl9Bc3NlcnRXaGVyZTsJCS8vIFdoZXJlIHBhcmFtZXRlciBvZiB0aGUgQXNzZXJ0IG1hY3JvCisjaWYgKEhDRl9BU1NFUlQpICYgKCBIQ0ZfQVNTRVJUX0xOS19NU0ZfUlROIHwgSENGX0FTU0VSVF9SVF9NU0ZfUlROICkKKyAgTVNGX0FTU0VSVF9SVE5QCUlGQl9Bc3NlcnRSdG47CQkvLyBNU0YgQXNzZXJ0IENhbGwgYmFjayByb3V0aW5lIChpbnNwaXJlZCBieSBHRUYsIERyRG9iYnMgTm92IDE5OTggKQorI2VuZGlmIC8vIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4KKyNpZiAoSENGX0FTU0VSVCkgJiBIQ0ZfQVNTRVJUX1BSSU5URgkvLyBlbmdpbmVlcmluZyBmYWNpbHR5IGludGVuZGVkIGFzIEYvVyBkZWJ1Z2dpbmcgYWlkCisgICBoY2ZfMTYgICAgICAgSUZCX0RiZ1ByaW50Rl9DbnQ7CisgICBDRkdfRldfUFJJTlRGX0JVRkZFUl9MT0NBVElPTl9TVFJDVCBJRkJfRndQZkJ1ZmY7CisjZW5kaWYgLy8gSENGX0FTU0VSVF9QUklOVEYKKyNlbmRpZiAvLyBIQ0ZfQVNTRVJUCisjaWYgISBkZWZpbmVkIEhDRl9JTlRfT0ZGCisgIGhjZl8xNiB2b2xhdGlsZSBJRkJfSW50T2ZmQ250OwkJLy8gMHhGRkZGIGJhc2VkIEhDRl9BQ1RfSU5UX09GRiBuZXN0aW5nIGNvdW50ZXIsIERlZXBTbGVlcCBmbGFnCisjZW5kaWYgLy8gSENGX0lOVF9PRkYKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfQ0NYCisgIGhjZl8xNiAgICAgICAgIElGQl9DS0lQU3RhdDsJCQkvLyBDS0lQIFN0YXR1cyBmbGFnCisjZW5kaWYgLy8gSENGX1RZUEVfQ0NYCisjaWYgKEhDRl9UQUxMSUVTKSAmICggSENGX1RBTExJRVNfTklDIHwgSENGX1RBTExJRVNfSENGICkJLy9IZXJtZXMgYW5kL29yIEhDRiB0YWxseSBzdXBwb3J0CisgIGhjZl8zMgkJSUZCX1NpbGx5X3lvdV9zaG91bGRfYWxpZ247CS8vOz8KKyAgaGNmXzE2CQlJRkJfVGFsbHlMZW47CQkJLy8gVGFsbHkgbGVuZ3RoICh0byBidWlsZCBhbiBMVFYpCisgIGhjZl8xNgkJSUZCX1RhbGx5VHlwOwkJCS8vIFRhbGx5IFR5cGUgKHRvIGJ1aWxkIGFuIExUVikKKyNlbmRpZiAvLyBIQ0ZfVEFMTElFU19OSUMgLyBIQ0ZfVEFMTElFU19IQ0YKKyNpZiAoSENGX1RBTExJRVMpICYgSENGX1RBTExJRVNfTklDCQkvL0hlcm1lcyB0YWxseSBzdXBwb3J0CisgIENGR19IRVJNRVNfVEFMTElFU19TVFJDVAlJRkJfTklDX1RhbGxpZXM7CisjZW5kaWYgLy8gSENGX1RBTExJRVNfTklDCisjaWYgKEhDRl9UQUxMSUVTKSAmIEhDRl9UQUxMSUVTX0hDRgkJLy9IQ0YgdGFsbHkgc3VwcG9ydAorICBDRkdfSENGX1RBTExJRVNfU1RSQ1QJCUlGQl9IQ0ZfVGFsbGllczsKKyNlbmRpZiAvLyBIQ0ZfVEFMTElFU19IQ0YKKyNpZiBIQ0ZfRE1BCisgIC8vdXNlZCBmb3IgYSBwb29sIG9mIGRlc3RpbmF0aW9uX2FkZHJlc3MgZGVzY3JpcHRvci9idWZmZXJzLCB1c2VkIGR1cmluZyB0eCBlbmNhcHN1bGF0aW9uIHBvaW50cyB0byB0aGUKKyAgLy9maXJzdC9sYXN0IGRlc2NyaXB0b3IgaW4gdGhlIGRlc2NyaXB0b3IgY2hhaW4sIHNvIHdlIGNhbiBlYXNpbHkgcmVtb3ZlIGFuZCBhcHBlbmQgYSBwYWNrZXQuCisgIERFU0NfU1RSQ1QJKklGQl9GaXJzdERlc2NbMl07CisgIERFU0NfU1RSQ1QJKklGQl9MYXN0RGVzY1syXTsKKyAgREVTQ19TVFJDVAkqSUZCX0NvbmZpbmVkRGVzY1syXTsJLy8gcG9pbnRlcnMgdG8gZGVzY3JpcHRvciB1c2VkIGZvciBob3N0IHJlY2xhaW0gcHVycG9zZXMuCisgIGhjZl8xNgkJSUZCX0RtYVBhY2tldHM7CQkJLy8gSFJFR19FVl9bVFgvUlhdRE1BX0RPTkUgZmxhZ3MsIHJlcG9ydHMgRE1BIEZyYW1lIGF2YWlsYWJpbGl0eSB0byBNU0YKKyNlbmRpZiAvLyBIQ0ZfRE1BCisjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9JTlRfVFhfRVgKKyAgaGNmXzE2CQlJRkJfVHhGc1N0YXQ7CQkJLy8gVHggbWVzc2FnZSBtb25pdG9yaW5nCisgIGhjZl8xNgkJSUZCX1R4RnNHYXBbMl07CQkJLy87P21ha2UgdGhpcyByb2J1c3QKKyAgaGNmXzE2CQlJRkJfVHhGc1N3U3VwOworI2VuZGlmIC8vIEhDRl9FWFRfSU5UX1RYX0VYCisgIGhjZl8xNgkJSUZCX01hZ2ljOwkJCQkvKiAiTWFnaWMiIHNpZ25hdHVyZSwgdG8gaGVscCB0aGUgZGVidWdnZXIgaW50ZXJwcmV0IGEgbWVtb3J5IGR1bXAKKwkJCQkJCQkJCQkgKiBhbHNvIHRoZSBsYXN0IGZpZWxkIGNsZWFyZWQgYXQgaGNmX2Nvbm5lY3QKKwkJCQkJCQkJCQkgKi8KKyNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX0lGQl9TVFJDVAkJLy8gZm9yIHVzYWdlIGJ5IHRoZSBNU0YKKyAgdm9pZCBGQVIJICAgKklGQl9NU0ZTdXA7CQkJCS8vIHBvaW50ZXIgZm9yIGFyYml0cmFyeSB1c2UgYnkgdGhlIE1TRgorI2VuZGlmIC8vIEhDRl9FWFRfSUZCX1NUUkNUX0VYVAorfSBJRkJfU1RSQ1Q7CisKK3R5cGVkZWYgSUZCX1NUUkNUKglJRkJQOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqICAgVyBDIEkgICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgUCBSIE8gVCBPIFQgWSBQIEUgUyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworRVhURVJOX0MgaW50CQkgaGNmX2FjdGlvbgkJCShJRkJQIGlmYnAsIGhjZl8xNiBjbWQgKTsKK0VYVEVSTl9DIGludAkJIGhjZl9jb25uZWN0CQkoSUZCUCBpZmJwLCBoY2ZfaW8gaW9fYmFzZSApOworI2lmIChIQ0ZfRU5DQVApICYgSENGX0VOQ19TVVAKK0VYVEVSTl9DIGhjZl84IAkJIGhjZl9lbmNhcAkJCSh3Y2lfYnVmcCB0eXBlICk7CisjZW5kaWYgLy8gSENGX0VOQ19TVVAKK0VYVEVSTl9DIGludAkJIGhjZl9nZXRfaW5mbwkJKElGQlAgaWZicCwgTFRWUCBsdHZwICk7CitFWFRFUk5fQyBpbnQJCSBoY2Zfc2VydmljZV9uaWMJKElGQlAgaWZicCwgd2NpX2J1ZnAgYnVmcCwgdW5zaWduZWQgaW50IGxlbiApOworRVhURVJOX0MgaW50CQkgaGNmX2NudGwJCQkoSUZCUCBpZmJwLCBoY2ZfMTYgY21kICk7CitFWFRFUk5fQyBpbnQJCSBoY2ZfcHV0X2luZm8JCShJRkJQIGlmYnAsIExUVlAgbHR2cCApOworRVhURVJOX0MgaW50CQkgaGNmX3Jjdl9tc2cJCShJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCB1bnNpZ25lZCBpbnQgb2Zmc2V0ICk7CitFWFRFUk5fQyBpbnQJCSBoY2Zfc2VuZF9tc2cgICAgICAgKElGQlAgaWZicCwgREVTQ19TVFJDVCAqZHAsIGhjZl8xNiB0eF9jbnRsICk7CisjaWYgSENGX0RNQQorRVhURVJOX0Mgdm9pZAkJIGhjZl9kbWFfdHhfcHV0IAkoSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkLCBoY2ZfMTYgdHhfY250bCApOworRVhURVJOX0MgREVTQ19TVFJDVCogaGNmX2RtYV90eF9nZXQJCShJRkJQIGlmYnAgKTsKK0VYVEVSTl9DIERFU0NfU1RSQ1QqIGhjZl9kbWFfcnhfZ2V0CQkoSUZCUCBpZmJwICk7CitFWFRFUk5fQyB2b2lkCQkgaGNmX2RtYV9yeF9wdXQJCShJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmQgKTsKKyNlbmRpZiAvLyBIQ0ZfRE1BCisjaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9MTktfTVNGX1JUTgorRVhURVJOX0Mgdm9pZAkJIG1zZl9hc3NlcnQJIAkJKHVuc2lnbmVkIGludCBsaW5lX251bWJlciwgaGNmXzE2IHRyYWNlLCBoY2ZfMzIgcXVhbCApOworI2VuZGlmIC8vIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4KKworI2VuZGlmICAvLyBIQ0ZfSAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9oY2ZjZmcuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2hjZmNmZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNDc1YjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9oY2ZjZmcuaApAQCAtMCwwICsxLDIzNDQgQEAKKworLy8gICB2aW06dHc9MTEwOnRzPTQ6CisjaWZuZGVmIEhDRkNGR19ICisjZGVmaW5lIEhDRkNGR19IIDEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRklMRQkgOiBoY2ZjZmcudHBsIC8vIGhjZmNmZy5oCisqCisqIERBVEUgICA6ICREYXRlOiAyMDA0LzA4LzA1IDExOjQ3OjEwICQgICAkUmV2aXNpb246IDEuNiAkCisqIE9yaWdpbmFsOiAyMDA0LzA0LzA4IDE1OjE4OjE2ICAgIFJldmlzaW9uOiAxLjQwICAgICAgVGFnOiB0MjAwNDA0MDhfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDQvMDEgMTU6MzI6NTUgICAgUmV2aXNpb246IDEuMzggICAgICBUYWc6IHQ3XzIwMDQwNDAxXzAxCisqIE9yaWdpbmFsOiAyMDA0LzAzLzEwIDE1OjM5OjI4ICAgIFJldmlzaW9uOiAxLjM0ICAgICAgVGFnOiB0MjAwNDAzMTBfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDMvMDMgMTQ6MTA6MTIgICAgUmV2aXNpb246IDEuMzIgICAgICBUYWc6IHQyMDA0MDMwNF8wMQorKiBPcmlnaW5hbDogMjAwNC8wMy8wMiAwOToyNzoxMiAgICBSZXZpc2lvbjogMS4zMCAgICAgIFRhZzogdDIwMDQwMzAyXzAzCisqIE9yaWdpbmFsOiAyMDA0LzAyLzI0IDEzOjAwOjI4ICAgIFJldmlzaW9uOiAxLjI1ICAgICAgVGFnOiB0MjAwNDAyMjRfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDIvMTggMTc6MTM6NTcgICAgUmV2aXNpb246IDEuMjMgICAgICBUYWc6IHQyMDA0MDIxOV8wMQorKgorKiBBVVRIT1IgOiBOaWNvIFZhbHN0ZXIKKyoKKyogREVTQyAgIDogSENGIEN1c3RvbWl6YXRpb24gTWFjcm9zCisqIGhjZmNmZy50cGwgbGlzdCBhbGwgI2RlZmluZXMgd2hpY2ggbXVzdCBiZSBzcGVjaWZpZWQgdG86CisqICAgYWRqdXN0IHRoZSBIQ0YgZnVuY3Rpb25zIGRlZmluZWQgaW4gSENGLkMgdG8gdGhlIGNoYXJhY3RlcmlzdGljcyBvZiBhIHNwZWNpZmljIGVudmlyb25tZW50CisqCQlvIG1heGltdW0gc2l6ZXMgZm9yIG1lc3NhZ2VzCisqCQlvIEVuZGlhbmVzcworKglDb21waWxlciBzcGVjaWZpYyBtYWNyb3MKKyoJCW8gcG9ydCBJL08gbWFjcm9zCisqCQlvIHR5cGUgZGVmaW5pdGlvbnMKKyoKKyogQnkgY29weWluZyBIQ0ZDRkcuVFBMIHRvIEhDRkNGRy5IIGFuZCAtaWYgbmVlZGVkLSBtb2RpZnlpbmcgdGhlICNkZWZpbmVzIHRoZSBXQ0kgZnVuY3Rpb25hbGl0eSBjYW4gYmUKKyogdGFpbG9yZWQKKyoKKyogU3VwcG9ydGVkIGVudmlyb25tZW50czoKKyogV1ZMQU5fNDEJTWluaXBvcnQJCQkJCQkJCU5ESVMgMy4xCisqIFdWTEFOXzQyCVBhY2tldAkJCQkJCQkJCU1pY3Jvc29mdCBWaXN1YWwgQyAxLjUKKyogV1ZMQU5fNDMJMTYgYml0cyBET1MgT0RJCQkJCQkJCU1pY3Jvc29mdCBWaXN1YWwgQyAxLjUKKyogV1ZMQU5fNDQJMzIgYml0cyBPREkgKF9fTkVUV0FSRV8zODZfXykJCQlXQVRDT00KKyogV1ZMQU5fNDUJTUFDX09TCQkJCQkJCQkJTVBXPywgU3ltYW50ZWM/CisqIFdWTEFOXzQ2CVdpbmRvd3MgQ0UgKF9XSU4zMl9XQ0UpCQkJCQlNaWNyb3NvZnQgPworKiBXVkxBTl80NwlMSU5VWCAgKF9fTElOVVhfXykJCQkJCQlHQ0MsIGRpc2NhcmRlZCwgYmFzZWQgb24gR1BMJ2VkIEhDRi1saWdodAorKiBXVkxBTl80OAlNaW5pcG9ydAkJCQkJCQkJTkRJUyA1CisqIFdWTEFOXzQ5CUxJTlVYICAoX19MSU5VWF9fKQkJCQkJCUdDQywgb3JpZ2luYWxseSBiYXNlZCBvbiBwcmUtY29tcGlsZWQgSENGX2xpYnJhcnkKKyogCQkJCQkJCQkJCQkJCW1pZ3JhdGVkIHRvIHVzZSB0aGUgSENGIHNvdXJjZXMgd2hlbiBMdWNlbnQgVGVjaG5vbG9naWVzCisqIAkJCQkJCQkJCQkJCQlicm91Z2h0IHRoZSBIQ0YgbW9kdWxlIHVuZGVyIEdQTAorKiBXVkxBTl81MQlNaW5pcG9ydCBVU0IJCQkJCQkJTkRJUyA1CisqIFdWTEFOXzUyCU1pbmlwb3J0CQkJCQkJCQlORElTIDQKKyogV1ZMQU5fNTMJVnhXb3JrcyBFTkQgU3RhdGlvbiBkcml2ZXIKKyogV1ZMQU5fNTQJVnhXb3JrcyBFTkQgQWNjZXNzIFBvaW50IGRyaXZlcgorKiBXVkxBTl84MQlXYXZlUG9pbnQJCQkJCQkJCUJPUkxBTkQgQworKiBXQ0lUU1QJSW5ob3VzZSB0ZXN0IHRvb2wJCQkJCQlNaWNyb3NvZnQgVmlzdWFsIEMgMS41CisqIFdTVQkJV2F2ZUxBTiBTdGF0aW9uIFVwZGF0ZQkJCQkJTWljcm9zb2Z0IFZpc3VhbCBDID8/CisqIFNDTyBVTklYCW5vdCB5ZXQgYWN0dWFsbHkgdXNlZCA/CQkJCQk/CisqIF9fcHBjCQlPRU0gc3VwcGxpZWQJCQkJCQkJPworKiBfQU0yOUsJT0VNIHN1cHBsaWVkCQkJCQkJCT8KKyogPwkJCU9FTSBzdXBwbGllZAkJCQkJCQlNaWNyb3RlYyBSZXNlYXJjaCA4MFg4NiBDb21waWxlcgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoKKyogU09GVFdBUkUgTElDRU5TRQorKgorKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyoKKyogQ09QWVJJR0hUIKkgMTk5NCAtIDE5OTUJYnkgQVQmVC4JCQkJQWxsIFJpZ2h0cyBSZXNlcnZlZAorKiBDT1BZUklHSFQgqSAxOTk2IC0gMjAwMCBieSBMdWNlbnQgVGVjaG5vbG9naWVzLglBbGwgUmlnaHRzIFJlc2VydmVkCisqIENPUFlSSUdIVCCpIDIwMDEgLSAyMDA0CWJ5IEFnZXJlIFN5c3RlbXMgSW5jLglBbGwgUmlnaHRzIFJlc2VydmVkCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyoKKyogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisqICAgIGRpc3RyaWJ1dGlvbi4KKyoKKyogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqCisqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogRGlzY2xhaW1lcgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisqIERBTUFHRS4KKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCUFsaWdubWVudAorKglTb21lIHBsYXRmb3JtcyBjYW4gYWNjZXNzIHdvcmRzIG9uIG9kZCBib3VuZGFyaWVzICh3aXRoIHBvc3NpYmx5IGFuIHBlcmZvcm1hbmNlIGltcGFjdCksIGF0IG90aGVyCisqCXBsYXRmb3JtcyBzdWNoIGFuIGFjY2VzcyBtYXkgcmVzdWx0IGluIGEgbWVtb3J5IGFjY2VzcyB2aW9sYXRpb24uCisqCUl0IGlzIGFzc3VtZWQgdGhhdCBldmVyeXdoZXJlIHdoZXJlIHRoZSBIQ0YgY2FzdHMgYSBjaGFyIHBvaW50ZXIgaW50byBhIHdvcmQgcG9pbnRlciwgdGhlIGFsaWdubWVudAorKgljcml0ZXJpYSBhcmUgbWV0LiBUaGlzIHB1dCBzb21lIHJlc3RyaWN0aW9ucyBvbiB0aGUgTVNGLCB3aGljaCBhcmUgYXNzdW1lZCB0byBiZSAiYXV0b21hdGljYWxseSIgZnVsZmlsbGVkCisqCWF0IHRoZSBhcHBsaWNhYmxlIHBsYXRmb3JtcworKglUbyBhc3NlcnQgdGhpcyBhc3N1bXB0aW9uLCB0aGUgbWFjcm8gSENGX0FMSUdOIGNhbiBiZSBkZWZpbmVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxLCBtZWFuaW5nIGJ5dGUKKyoJYWxpZ25tZW50IChvciBubyBhbGlnbm1lbnQpLCBhIHZhbHVlIG9mIDIgbWVhbnMgd29yZCBhbGlnbm1lbnQsIGEgdmFsdWUgb2YgNCBtZWFucyBkb3VibGUgd29yZCBhbGlnbm1lbnQKKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICBJTl9QT1JUX1NUUklOR184XzE2ICBTIGEgbSBwIGwgZSBzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwkJLy8gQyBpbXBsZW1lbnRhdGlvbiB3aGljaCBsZXQgdGhlIHByb2Nlc3NvciBoYW5kbGUgdGhlIHdvcmQtYXQtYnl0ZS1ib3VuZGFyeSBwcm9ibGVtCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzhfMTYoIHBvcnQsIGFkZHIsIG4pIHdoaWxlICggbi0tICkgCVwKKwl7ICooaGNmXzE2IEZBUiopYWRkciA9IElOX1BPUlRfV09SRCggcG9ydCApOyAoKGhjZl84IEZBUiopYWRkcikrPTI7IH0KKworCQkvLyBDIGltcGxlbWVudGF0aW9uIHdoaWNoIGhhbmRsZXMgdGhlIHdvcmQtYXQtYnl0ZS1ib3VuZGFyeSBwcm9ibGVtCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzhfMTYoIHBvcnQsIGFkZHIsIG4pCXdoaWxlICggbi0tICkJIFwKKwl7IGhjZl8xNiBpID0gSU5fUE9SVF9XT1JEKHBvcnQpOyAqKChoY2ZfOCBGQVIqKWFkZHIpKysgPSAoaGNmXzgpaTsgKigoaGNmXzggRkFSKilhZGRyKSsrID0gKGhjZl84KShpPj44KTt9CisKKwkJLy8gQXNzZW1ibGVyIGltcGxlbWVudGF0aW9uCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzhfMTYoIHBvcnQsIGFkZHIsIGxlbikgX19hc20JCVwKK3sJCQkJCQkJCQkJCQkJCVwKKwlfX2FzbSBwdXNoIGRpCQkJCQkJCQkJCVwKKwlfX2FzbSBwdXNoIGVzCQkJCQkJCQkJCVwKKwlfX2FzbSBtb3YgY3gsbGVuCQkJCQkJCQkJXAorCV9fYXNtIGxlcyBkaSxhZGRyCQkJCQkJCQkJXAorCV9fYXNtIG1vdiBkeCxwb3J0CQkJCQkJCQkJXAorCV9fYXNtIHJlcCBpbnN3CQkJCQkJCQkJCVwKKwlfX2FzbSBwb3AgZXMJCQkJCQkJCQkJXAorCV9fYXNtIHBvcCBkaQkJCQkJCQkJCQlcCit9CisKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBPVVRfUE9SVF9TVFJJTkdfOF8xNiAgUyBhIG0gcCBsIGUgcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCQkvLyBDIGltcGxlbWVudGF0aW9uIHdoaWNoIGxldCB0aGUgcHJvY2Vzc29yIGhhbmRsZSB0aGUgd29yZC1hdC1ieXRlLWJvdW5kYXJ5IHByb2JsZW0KKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzhfMTYoIHBvcnQsIGFkZHIsIG4pCXdoaWxlICggbi0tICkgXAorCXsgT1VUX1BPUlRfV09SRCggcG9ydCwgKihoY2ZfMTYgRkFSKilhZGRyICkgOyAoKGhjZl84IEZBUiopYWRkcikrPTI7IH0KKworCQkvLyBDIGltcGxlbWVudGF0aW9uIHdoaWNoIGhhbmRsZXMgdGhlIHdvcmQtYXQtYnl0ZS1ib3VuZGFyeSBwcm9ibGVtCisjZGVmaW5lIE9VVF9QT1JUX1NUUklOR184XzE2KCBwb3J0LCBhZGRyLCBuKQl3aGlsZSAoIG4tLSApIFwKKwl7IE9VVF9QT1JUX1dPUkQoIHBvcnQsICooKGhjZl84IEZBUiopYWRkcikgfCAqKCgoaGNmXzggRkFSKilhZGRyKSsxKTw8OCAgKTsgKGhjZl84IEZBUiopYWRkcis9MjsgfQorCisJCS8vIEFzc2VtYmxlciBpbXBsZW1lbnRhdGlvbgorI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfOF8xNiggcG9ydCwgYWRkciwgbGVuKSBfX2FzbQlcCit7CQkJCQkJCQkJCQkJCQlcCisJX19hc20gcHVzaCBzaQkJCQkJCQkJCQlcCisJX19hc20gcHVzaCBkcwkJCQkJCQkJCQlcCisJX19hc20gbW92IGN4LGxlbgkJCQkJCQkJCVwKKwlfX2FzbSBsZHMgc2ksYWRkcgkJCQkJCQkJCVwKKwlfX2FzbSBtb3YgZHgscG9ydAkJCQkJCQkJCVwKKwlfX2FzbSByZXAgb3V0c3cJCQkJCQkJCQkJXAorCV9fYXNtIHBvcCBkcwkJCQkJCQkJCQlcCisJX19hc20gcG9wIHNpCQkJCQkJCQkJCVwKK30KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKiAgQyBPIE0gUCBJIEwgRSBSICAgUyBQIEUgQyBJIEYgSSBDICAgTSBBIEMgUiBPIFMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgkJCSEhISEhISEhISEhISEhISEhISEhISEhISEgTm90ZSB0byB0aGUgSENGLWltcGxlbWVudG9yICEhISEhISEhISEhISEhISEhISEhISEhISEKKyoJCQkhISEhIERvIG5vdCBjYWxsIHRoZXNlIG1hY3JvcyB3aXRoIHBhcmFtZXRlcnMgd2hpY2ggaW50cm9kdWNlIHNpZGUgZWZmZWN0cyAhISEhCisqCQkJISEhISEhISEhISEhISEhISEhISEhISEhISBOb3RlIHRvIHRoZSBIQ0YtaW1wbGVtZW50b3IgISEhISEhISEhISEhISEhISEhISEhISEhIQorKgorKgorKiBCeSBzZWxlY3RpbmcgdGhlIGFwcHJvcHJpYXRlIE1hY3JvIGRlZmluaXRpb25zIGJ5IG1lYW5zIG9mIG1vZGlmeWluZyB0aGUgIiNpZmRlZiAwLzEiIGxpbmVzLCB0aGUgSENGIGNhbiBiZQorKiBhZGp1c3RlZCBmb3IgdGhlIEkvTyBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBzcGVjaWZpYyBjb21waWxlcgorKgorKiBJZiBuZWVkZWQgdGhlIG1hY3JvcyBjYW4gYmUgbW9kaWZpZWQgb3IgcmVwbGFjZWQgd2l0aCBkZWZpbml0aW9ucyBhcHByb3ByaWF0ZSBmb3IgeW91ciBwZXJzb25hbCBwbGF0Zm9ybS4KKyogSWYgeW91IG5lZWQgdG8gbWFrZSBzdWNoIGNoYW5nZXMgaXQgaXMgYXBwcmVjaWF0ZWQgaWYgeW91IGluZm9ybSBBZ2VyZSBTeXN0ZW1zCisqIFRoYXQgd2F5IHRoZSBjaGFuZ2VzIGNhbiBiZWNvbWUgcGFydCBvZiB0aGUgbmV4dCByZWxlYXNlIG9mIHRoZSBXQ0kKKyoKKyogRm9yIGNvbnZlbmllbmNlIG9mIHRoZSBNU0YtcHJvZ3JhbW1lciwgYWxsIG1hY3JvcyBhcmUgYWxsb3dlZCB0byBtb2RpZnkgdGhlaXIgcGFyYW1ldGVycyAoYWx0aG91Z2ggc29tZQorKiBtaWdodCBhcmd1ZSB0aGF0IHRoaXMgd291bGQgY29uc3RpdHV0ZSBiYWQgY29kaW5nIHByYWN0aWNlKS4gVGhpcyBoYXMgaXRzIGltcGxpY2F0aW9ucyBvbiB0aGUgSENGLCBlLmcuIGFzIGEKKyogY29uc2VxdWVuY2UgdGhlc2UgbWFjcm9zIHNob3VsZCBub3QgYmUgY2FsbGVkIHdpdGggcGFyYW1ldGVycyB3aGljaCBoYXZlIHNpZGUgZWZmZWN0cywgZS5nIGF1dG8taW5jcmVtZW50LgorKgorKiBpbiB0aGUgTWljcm9zb2Z0IGltcGxlbWVudGF0aW9uIG9mIGlubGluZSBhc3NlbWJseSBpdCBpcyBPLksuIHRvIGNvcnJ1cHQgYWxsIGZsYWdzIGV4Y2VwdCB0aGUgZGlyZWN0aW9uIGZsYWcKKyogYW5kIHRvIGNvcnJ1cHQgYWxsIHJlZ2lzdGVycyBleGNlcHQgdGhlIHNlZ21lbnQgcmVnaXN0ZXJzIGFuZCBFREksIEVTSSwgRVNQIGFuZCBFQlAgKG9yIHRoZWlyIDE2IGJpdHMKKyogZXF1aXZhbGVudHMpLiAgT3RoZXIgZW52aXJvbm1lbnRzIG1heSBoYXZlIG90aGVyIGNvbnN0cmFpbnRzCisqCisqIGluIHRoZSBJbnRlbCBlbnZpcm9ubWVudCBpdCBpcyBPLksgdG8gaGF2ZSBhIHdvcmQgKGFzIGEgMTYgYml0cyBxdWFudGl0eSkgYXQgYSBieXRlIGJvdW5kYXJ5LCBoZW5jZQorKiBJTl8vT1VUX1BPUlRfU1RSSU5HXzhfMTYgY2FuIG1vdmUgd29yZHMgYmV0d2VlbiBQQy1tZW1vcnkgYW5kIE5JQy1tZW1vcnkgd2l0aCBhcyBvbmx5IGNvbnN0cmFpbnQgdGhhdCB0aGUKKyogd29yZHMgYXJlIG9uIGEgd29yZCBib3VuZGFyeSBpbiBOSUMtbWVtb3J5LiBUaGlzIGRvZXMgbm90IGhvbGQgdHJ1ZSBmb3IgYWxsIGNvbmNlaXZhYmxlIGVudmlyb25tZW50cywgZS5nLgorKiBhbiBNb3Rvcm9sYSA2OHh4eCBkb2VzIG5vdCBhbGxvdyB0aGlzLiBQcm9iYWJseS9ob3BlZnVsbHkgdGhlIGJvdW5kYXJ5IGNvbmRpdGlvbnMgaW1wb3NlZCBieSB0aGVzZSB0eXBlIG9mCisqIHBsYXRmb3JtcyBwcmV2ZW50IHRoaXMgY2FzZSBmcm9tIG1hdGVyaWFsaXppbmcuICBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgT1VUX1BPUlRfU1RSSU5HXzhfMTYgbXVzdCBiZSBjb2RlZAorKiBieSBjb21iaW5pbmcgdHdvIEhvc3QgbWVtb3J5IGhjZl84IHZhbHVlcyBhdCBhIHRpbWUgdG8gYSBzaW5nbGUgaGNmXzE2IHZhbHVlIHRvIGJlIHBhc3NlZCB0byB0aGUgTklDIGFuZAorKiBJTl9QT1JUX1NUUklOR184XzE2IHRoZSBzaW5nbGUgaGNmXzE2IHJldHJpZXZlZCBmcm9tIHRoZSBOSUMgbXVzdCBiZSBzcGxpdCBpbiB0d28gaGNmXzggdmFsdWVzIHRvIGJlIHN0b3JlZAorKiBpbiBIb3N0IG1lbW9yeSAoc2VlIHRoZSBzYW1wbGUgY29kZSBhYm92ZSkKKyoKKyoJVGhlIHByb3RvdHlwZXMgYW5kIGZ1bmN0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIG1hY3JvcyBhcmU6CisqCisqCWhjZl8xNglJTl9QT1JUX1dPUkQoIGhjZl8xNiBwb3J0ICkKKyoJCQlSZWFkcyBhIHdvcmQgKDE2IGJpdHMpIGZyb20gdGhlIHNwZWNpZmllZCBwb3J0CisqCisqCXZvaWQJT1VUX1BPUlRfV09SRCggaGNmXzE2IHBvcnQsIGhjZl8xNiB2YWx1ZSkKKyoJCQlXcml0ZXMgYSB3b3JkICgxNiBiaXRzKSB0byB0aGUgc3BlY2lmaWVkIHBvcnQKKyoKKyoJaGNmXzE2CUlOX1BPUlRfRFdPUkQoIGhjZl8xNiBwb3J0ICkKKyoJCQlSZWFkcyBhIGR3b3JkICgzMiBiaXRzKSBmcm9tIHRoZSBzcGVjaWZpZWQgcG9ydAorKgorKgl2b2lkCU9VVF9QT1JUX0RXT1JEKCBoY2ZfMTYgcG9ydCwgaGNmXzMyIHZhbHVlKQorKgkJCVdyaXRlcyBhIGR3b3JkICgzMiBiaXRzKSB0byB0aGUgc3BlY2lmaWVkIHBvcnQKKyoKKyoJdm9pZAlJTl9QT1JUX1NUUklOR184XzE2KCBwb3J0LCBhZGRyLCBsZW4pCisqCQkJUmVhZHMgbGVuIG51bWJlciBvZiB3b3JkcyAoMTYgYml0cykgZnJvbSBOSUMgbWVtb3J5IHZpYSB0aGUgc3BlY2lmaWVkIHBvcnQgdG8gdGhlIChGQVIpCisqCQkJYnl0ZS1wb2ludGVyIGFkZHIgaW4gUEMtUkFNCisqCQkJTm90ZSB0aGF0IGxlbiBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB3b3JkcywgTk9UIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyoJCQkhISFOT1RFLCBhbHRob3VnaCBsZW4gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygd29yZHMsIGFkZHIgTVVTVCBiZSBhIGNoYXIgcG9pbnRlciBOT1RFISEhCisqCQkJU2VlIGFsc28gdGhlIGNvbW1vbiBub3RlcyBmb3IgSU5fUE9SVF9TVFJJTkdfOF8xNiBhbmQgT1VUX1BPUlRfU1RSSU5HXzhfMTYKKyoKKyoJdm9pZAlPVVRfUE9SVF9TVFJJTkdfOF8xNiggcG9ydCwgYWRkciwgbGVuKQorKgkJCVdyaXRlcyBsZW4gbnVtYmVyIG9mIHdvcmRzICgxNiBiaXRzKSBmcm9tIHRoZSAoRkFSKSBieXRlLXBvaW50ZXIgYWRkciBpbiBQQy1SQU0gdmlhIHRoZSBzcGVjaWZpZWQKKyoJCQlwb3J0IHRvIE5JQyBtZW1vcnkKKyoJCQlOb3RlIHRoYXQgbGVuIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHdvcmRzLCBOT1QgdGhlIG51bWJlciBvZiBieXRlcy4KKyoJCQkhISFOT1RFLCBhbHRob3VnaCBsZW4gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygd29yZHMsIGFkZHIgTVVTVCBiZSBhIGNoYXIgcG9pbnRlciBOT1RFISEhCisqCisqCQkJVGhlIHBlY3VsaWFyIGNvbWJpbmF0aW9uIG9mIHdvcmQtbGVuZ3RoIGFuZCBjaGFyIHBvaW50ZXJzIGZvciBJTl9QT1JUX1NUUklOR184XzE2IGFzIHdlbGwgYXMKKyoJCQlPVVRfUE9SVF9TVFJJTkdfOF8xNiBpcyBqdXN0aWZpZWQgYnkgdGhlIGFzc3VtcHRpb24gdGhhdCBpdCBvZmZlcnMgYSBtb3JlIG9wdGltYWwgYWxnb3JpdGhtCisqCisqCXZvaWQJSU5fUE9SVF9TVFJJTkdfMzIoIHBvcnQsIGFkZHIsIGxlbikKKyoJCQlSZWFkcyBsZW4gbnVtYmVyIG9mIGRvdWJsZS13b3JkcyAoMzIgYml0cykgZnJvbSBOSUMgbWVtb3J5IHZpYSB0aGUgc3BlY2lmaWVkIHBvcnQgdG8gdGhlIChGQVIpCisqCQkJZG91YmxlLXdvcmQgYWRkcmVzcyBhZGRyIGluIFBDLVJBTQorKgorKgl2b2lkCU9VVF9QT1JUX1NUUklOR18zMiggcG9ydCwgYWRkciwgbGVuKQorKgkJCVdyaXRlcyBsZW4gbnVtYmVyIG9mIGRvdWJsZS13b3JkcyAoMzIgYml0cykgZnJvbSB0aGUgKEZBUikgZG91YmxlLXdvcmQgYWRkcmVzcyBhZGRyIGluIFBDLVJBTSB2aWEKKyoJCQl0aGUgc3BlY2lmaWVkIHBvcnQgdG8gTklDIG1lbW9yeQorKgorKgkJCSEhISEhISEhISEhISEhISEhISEhISEhISEgTm90ZSB0byB0aGUgSENGLWltcGxlbWVudG9yICEhISEhISEhISEhISEhISEhISEhISEhISEKKyoJCQkhISEhIERvIG5vdCBjYWxsIHRoZXNlIG1hY3JvcyB3aXRoIHBhcmFtZXRlcnMgd2hpY2ggaW50cm9kdWNlIHNpZGUgZWZmZWN0cyAhISEhCisqCQkJISEhISEhISEhISEhISEhISEhISEhISEhISBOb3RlIHRvIHRoZSBIQ0YtaW1wbGVtZW50b3IgISEhISEhISEhISEhISEhISEhISEhISEhIQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogIGRlZmluZSBJTlQgVHlwZXMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJCWhjZl84OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJCWhjZl8xNjsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwkJCWhjZl8zMjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogIGRlZmluZSBJL08gVHlwZXMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSENGX0lPX01FTSAgICAgCQkJMHgwMDAxCS8vIG1lbW9yeSBtYXBwZWQgSS9PCSggMDogUG9ydCBJL08gKQorI2RlZmluZSBIQ0ZfSU9fMzJCSVRTICAgCSAgCTB4MDAwMiAJLy8gMzJCaXRzIHN1cHBvcnQJCSggMDogb25seSAxNiBCaXRzIEkvTykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAjZGVmaW5lIEhDRl9UWVBFICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBIQ0ZfVFlQRV9OT05FCQkJMHgwMDAwCS8vIE5vIHR5cGUKKyNkZWZpbmUgSENGX1RZUEVfV1BBCQkJMHgwMDAxCS8vIFdQQSBzdXBwb3J0CisjZGVmaW5lIEhDRl9UWVBFX1VTQgkJCTB4MDAwMgkvLyByZXNlcnZlZCAoVVNCIERvbmdsZSBkcml2ZXIgc3VwcG9ydCkKKy8vI2RlZmluZSBIQ0ZfVFlQRV9ISUkJCQkweDAwMDQJLy8gSGVybWVzLUlJLCB0byBkaXNjcmltaW5hdGUgSC1JIGFuZCBILUlJIENGR19IQ0ZfT1BUX1NUUkNUCisjZGVmaW5lIEhDRl9UWVBFX1dBUlAJCQkweDAwMDgJLy8gV0FSUCBGL1cKKyNkZWZpbmUgSENGX1RZUEVfUFJFTE9BREVECQkweDAwNDAJLy8gcHJlLWxvYWRlZCBGL1cKKyNkZWZpbmUgSENGX1RZUEVfSElJNQkJCTB4MDA4MAkvLyBIZXJtZXMtMi41IEgvVworI2RlZmluZSBIQ0ZfVFlQRV9DQ1gJCQkweDAxMDAJLy8gQ0tJUAorI2RlZmluZSBIQ0ZfVFlQRV9CRUFHTEVfSElJNQkweDAyMDAJLy8gQmVhZ2xlIEhlcm1lcy0yLjUgSC9XCisjZGVmaW5lIEhDRl9UWVBFX1RYX0RFTEFZCQkweDQwMDAJLy8gRGVsYXllZCB0cmFuc21pc3Npb24gKCBub24tRE1BIG9ubHkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogI2RlZmluZSBIQ0ZfQVNTRVJUICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSENGX0FTU0VSVF9OT05FCQkJMHgwMDAwCS8vIE5vIGFzc2VydCBzdXBwb3J0CisjZGVmaW5lIEhDRl9BU1NFUlRfUFJJTlRGCQkweDAwMDEJLy8gSGVybWVzIGdlbmVyYXRlZCBkZWJ1ZyBpbmZvCisjZGVmaW5lIEhDRl9BU1NFUlRfU1dfU1VQCQkweDAwMDIJLy8gbG9nZ2luZyB2aWEgSGVybWVzIHN1cHBvcnQgcmVnaXN0ZXIKKyNkZWZpbmUgSENGX0FTU0VSVF9NQgkJCTB4MDAwNAkvLyBsb2dnaW5nIHZpYSBNYWlsYm94CisjZGVmaW5lIEhDRl9BU1NFUlRfUlRfTVNGX1JUTgkweDQwMDAJLy8gZHluYW1pY2FsbHkgYmluZGluZyBvZiBtc2ZfYXNzZXJ0IHJvdXRpbmUKKyNkZWZpbmUgSENGX0FTU0VSVF9MTktfTVNGX1JUTgkweDgwMDAJLy8gc3RhdGljYWxseSBiaW5kaW5nIG9mIG1zZl9hc3NlcnQgcm91dGluZQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICNkZWZpbmUgSENGX0VOQ0FQICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEhDRl9FTkNfTk9ORQkJCTB4MDAwMAkvLyBObyBlbmNhcHN1bGF0aW9uIHN1cHBvcnQKKyNkZWZpbmUgSENGX0VOQwkJCQkJMHgwMDAxCS8vIEhDRiBoYW5kbGVzIEVuLS9EZWNhcHN1bGF0aW9uCisjZGVmaW5lIEhDRl9FTkNfU1VQCQkJCTB4MDAwMgkvLyBIQ0Ygc3VwcG9ydHMgTVNGIHRvIGhhbmRsZSBFbi0vRGVjYXBzdWxhdGlvbgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICNkZWZpbmUgSENGX0VYVCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEhDRl9FWFRfTk9ORQkJCTB4MDAwMAkvLyBObyBleHBhbmRlZCBmZWF0dXJlcworI2RlZmluZSBIQ0ZfRVhUX0lORk9fTE9HCQkweDAwMDEJLy8gbG9nZ2luZyBvZiBIZXJtZXMgSW5mbyBmcmFtZXMKKy8vI2RlZmluZSBIQ0ZfRVhUX0lOVF9UWF9PSwkJMHgwMDAyCS8vIFJFU0VSVkVEISEhIG1vbml0b3Jpbmcgc3VjY2Vzc2Z1bCBUeCBtZXNzYWdlCisjZGVmaW5lIEhDRl9FWFRfSU5UX1RYX0VYCQkweDAwMDQJLy8gbW9uaXRvcmluZyB1bnN1Y2Nlc3NmdWwgVHggbWVzc2FnZQorLy8jZGVmaW5lIEhDRl9FWFRfTU9OX01PREUJCTB4MDAwOAkvLyBMRUdBQ1kKKyNkZWZpbmUgSENGX0VYVF9UQUxMSUVTX0ZXCQkweDAwMTAJLy8gc3VwcG9ydCBmb3IgdXAgdG8gMzIgSGVybWVzIEVuZ2luZWVyaW5nIHRhbGxpZXMKKyNkZWZpbmUgSENGX0VYVF9UQUxMSUVTX0hDRgkJMHgwMDIwCS8vIHN1cHBvcnQgZm9yIHVwIHRvIDggSENGIEVuZ2luZWVyaW5nIHRhbGxpZXMKKyNkZWZpbmUgSENGX0VYVF9OSUNfQUNDRVNTCQkweDAwNDAJLy8gZGlyZWN0IGFjY2VzcyB2aWEgQXV4LXBvcnRzIGFuZCB0byBIZXJtZXMgcmVnaXN0ZXJzIGFuZCBjb21tYW5kcworI2RlZmluZSBIQ0ZfRVhUX01CCQkJCTB4MDA4MAkvLyBNYWlsQm94IGNvZGUgZXhwYW5kZWQKKyNkZWZpbmUgSENGX0VYVF9JRkJfU1RSQ1QgCQkweDAxMDAJLy8gTVNGIGN1c3RvbSBwb2ludGVyIGluIElGQgorI2RlZmluZSBIQ0ZfRVhUX0RFU0NfU1RSQ1QgCQkweDAyMDAJLy8gTVNGIGN1c3RvbSBwb2ludGVyIGluIERlc2NyaXB0b3IKKyNkZWZpbmUgSENGX0VYVF9UWF9DT05UCQkJMHg0MDAwCS8vIENvbnRpbnVvdXMgdHJhbnNtaXQgdGVzdAorI2RlZmluZSBIQ0ZfRVhUX0lOVF9USUNLCQkweDgwMDAJLy8gZW5hYmxlcyBUaW1lclRpY2sgaW50ZXJydXB0IGdlbmVyYXRpb24KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAjZGVmaW5lIEhDRl9TTEVFUCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBIQ0ZfRERTCQkJCQkweDAwMDEJLy8gRGlzY29ubmVjdGVkIERlZXAgU2xlZXAKKyNkZWZpbmUgSENGX0NEUwkJCQkJMHgwMDAyCS8vIENvbm5lY3RlZCBEZWVwIFNsZWVwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogI2RlZmluZSBIQ0ZfVEFMTElFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEhDRl9UQUxMSUVTX05PTkUJCTB4MDAwMAkvLyBObyB0YWxseSBzdXBwb3J0CisjZGVmaW5lIEhDRl9UQUxMSUVTX05JQwkJCTB4MDAwMQkvLyBIZXJtZXMgVGFsbGllcyBhY2N1bXVsYXRlZCBpbiBJRkIKKyNkZWZpbmUgSENGX1RBTExJRVNfSENGCQkJMHgwMDAyCS8vIEhDRiBUYWxsaWVzIGFjY3VtdWxhdGVkIGluIElGQgorI2RlZmluZSBIQ0ZfVEFMTElFU19SRVNFVAkJMHg4MDAwCS8vIFRhbGxpZXMgaW4gSUZCIGFyZSByZXNldCB3aGVuIHJlcG9ydGVkIHZpYSBoY2ZfZ2V0X2luZm8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTSBJIE4gSSBQIE8gUiBUICAgIE4gRCBJIFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkIFdWTEFOXzQxIHx8IGRlZmluZWQgV1ZMQU5fNDggfHwgZGVmaW5lZCBXVkxBTl81MiB8fCBkZWZpbmVkIF9XSU4zMl9XQ0UKKworI2lmbmRlZiBXVkxBTl80NgorI2RlZmluZSBIQ0ZfRVhUICAgKEhDRl9FWFRfSU5GT19MT0cgfCBIQ0ZfRVhUX01CIHwgSENGX0VYVF9OSUNfQUNDRVNTICkKKyNlbHNlCisjZGVmaW5lIEhDRl9FWFQgKCBIQ0ZfRVhUX1RYX0NPTlQgfCBIQ0ZfRVhUX0lORk9fTE9HIHwgSENGX0VYVF9NQiB8IEhDRl9FWFRfTklDX0FDQ0VTUyApCisjZW5kaWYKKyNkZWZpbmUgSENGX0RMViAxCQkJLy9ILUkgbGVnYWN5LCBzdXBlcmZsdW91cyBmb3IgSC1JSQorCisjaWZkZWYgX1dJTjMyX1dDRQorI2RlZmluZSBIQ0ZfSU8gICAgIEhDRl9JT19NRU0KKyNkZWZpbmUgSENGX0RNQQkJMAkJCS8vIFRvIGVuYWJsZSBETUEKKyNlbmRpZgorCisjaWYgX1ZBUklBTlQgPT0gNworI2RlZmluZSBIQ0ZfU0xFRVAgSENGX0NEUworI2VuZGlmIC8vIF9WQVJJQU5UID09IDcKKworI2lmIF9WQVJJQU5UID09IDUgfHwgX1ZBUklBTlQgPT0gNgorI2RlZmluZSBfV0FSUAorI2RlZmluZSBfQUVTCisjZGVmaW5lIEhDRl9TTEVFUCBIQ0ZfQ0RTCisjaWYgX1ZBUklBTlQgPT0gNgorLy8hICNkZWZpbmUgX1JTTgorI2VuZGlmIC8vIF9WQVJJQU5UID09IDYKKyNpZm5kZWYgX1dJTjMyX1dDRQorI2RlZmluZSBIQ0ZfSU8gICAgIEhDRl9JT18zMkJJVFMKKyNkZWZpbmUgSENGX0RNQQkJMQkJCS8vIFRvIGVuYWJsZSBETUEKKyNlbmRpZgorI2VuZGlmIC8vIF9WQVJJQU5UID09IDUgfHwgX1ZBUklBTlQgPT0gNgorCisKKy8vSFdpIGZvciBtaWdyYXRpb24gcHVycG9zZXMgSSBkZWZpbmVkIGEgZGVmaW5lIHdoaWNoIHdpbGwgYmUgVFJVRSBmb3IgQUxMIGRyaXZlcnMKKy8vTWVhbmluZyB0aGF0IF9DQ1ggZGVmaW5lZCBjb2RlIHdoaWNoIHdlIHRoaW5rIHdpbGwgZ2V0IGEgYWxsIGRyaXZlciBPSyBmbGFnIGNhbiBiZSBkZWZpbmVkIGZyb20gX0NDWCB0byBfQ0NYX09LCisjaWYgZGVmaW5lZCBXVkxBTl80OCAvLyAmJiAhZGVmaW5lZCBfV0lOMzJfV0NFCisjaWYgX1ZBUklBTlQgPT0gNCB8fCBfVkFSSUFOVCA9PSA2CisjZGVmaW5lIF9DQ1hfT0sJCTEKKyNlbmRpZiAvLyBfVkFSSUFOVCA9PSA0IHx8IF9WQVJJQU5UID09IDYKKyNlbmRpZiAvLyBXVkxBTl80OAorCisvLyNpZiAhZGVmaW5lZCBXVkxBTl80NgorI2lmIGRlZmluZWQgV1ZMQU5fNDgKKyNpZiBfVkFSSUFOVCA9PSA0IHx8IF9WQVJJQU5UID09IDYKKyNkZWZpbmUgX0NDWAorI2RlZmluZSBIQ0ZfTUFYX01TR19DS0lQX1BBRERJTkcgICAgODYgLy8sIHVzZSA4NiBmb3IgcnggZnJhZ21lbnRhdGlvbi4gMjggaXMgZW51ZiBmb3IgTUlDK1BQSyBlbmNhcHN1bGF0aW9uCisjZGVmaW5lIEhDRl9NQVhfTVNHCQkJCQkoIDE1MTQgKyBIQ0ZfTUFYX01TR19DS0lQX1BBRERJTkcgICkgLy8gbmVlZCBleHRyYSBwYWRkaW5nIGZvciBDS0lQIChuZWVkIHRvIHN1YnRyYWN0IDI4IGZvciBORElTKQorI2VuZGlmIC8vIF9WQVJJQU5UID09IDQgfHwgX1ZBUklBTlQgPT0gNgorI2VuZGlmIC8vIFdWTEFOXzQ4CisvLyNlbmRpZiAvLyBXVkxBTl80NgorCisjaWYgIWRlZmluZWQgV1ZMQU5fNDYKKyNkZWZpbmUgX1BFRUsKKyNlbmRpZgorCisjaWZuZGVmIF9XSU4zMl9XQ0UKKy8vIEFTU0VSVCBhbHJlYWR5IHVzZWQgYnkgV2luQ0UuLi4KKyNpZmRlZiBBU1NFUlQKKyN1bmRlZiBBU1NFUlQKKyNkZWZpbmUgIEFTU0VSVCh4KSBBU1NFUlRERUJVR01TRygoeCksIChURVhUKCJTSU1VTEFURSBBU1NFUlQ6IikpKQorI2VuZGlmCisjZW5kaWYKKworCisjaWYgZGVmaW5lZCBXVkxBTl80MQorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX0lECQkJQ09NUF9JRF9NSU5JUE9SVF9ORElTXzMxCisjZW5kaWYgLy8gV1ZMQU5fNDEKKyNpZiBkZWZpbmVkIFdWTEFOXzQ4ICYmICFkZWZpbmVkIF9XSU4zMl9XQ0UKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRAkJCUNPTVBfSURfTUlOSVBPUlRfTkRJU181MAorI2VuZGlmIC8vIFdWTEFOXzQ4IC8gX1dJTjMyX1dDRQorI2lmIGRlZmluZWQgV1ZMQU5fNTIgJiYgIWRlZmluZWQgX1dJTjMyX1dDRQorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX0lECQkJQ09NUF9JRF9NSU5JUE9SVF9ORElTXzQwCisjZW5kaWYgLy8gV1ZMQU5fNTIgLyBfV0lOMzJfV0NFCisjaWYgZGVmaW5lZCBXVkxBTl80NgorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX0lECQkJQ09NUF9JRF9XSU5fQ0UKKyNlbmRpZiAvLyBfV0lOMzJfV0NFCisKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9WQVIJCQlfVkFSSUFOVAorCisjZGVmaW5lCVQxX19IQ0ZfVFlQRQkJCQkJKEhDRl9UWVBFX05PTkUpCisKKyNkZWZpbmUgVDJfX0hDRl9UWVBFCQkJCQkoVDFfX0hDRl9UWVBFKQorCisjaWZkZWYgX1dBUlAKKyNkZWZpbmUgVDNfX0hDRl9UWVBFCQkJCQkoVDJfX0hDRl9UWVBFIHwgSENGX1RZUEVfSElJNSB8IEhDRl9UWVBFX1dBUlAgKQorI2Vsc2UKKyNpZiBfVkFSSUFOVCA9PSA3CisjZGVmaW5lIFQzX19IQ0ZfVFlQRQkJCQkJKFQyX19IQ0ZfVFlQRSB8IEhDRl9UWVBFX0hJSTUpCisjZWxzZSAvLyBfVkFSSUFOVCA9PSA3CisjZGVmaW5lIFQzX19IQ0ZfVFlQRQkJCQkJKFQyX19IQ0ZfVFlQRSkKKyNlbmRpZiAvLyBfVkFSSUFOVCA9PSA3CisjZW5kaWYgLy8gX1dBUlAKKworI2lmZGVmIF9DQ1hfT0sKKyNkZWZpbmUgVDRfX0hDRl9UWVBFCQkJCQkoVDNfX0hDRl9UWVBFIHwgSENGX1RZUEVfQ0NYKQorI2Vsc2UKKyNkZWZpbmUgVDRfX0hDRl9UWVBFCQkJCQkoVDNfX0hDRl9UWVBFKQorI2VuZGlmIC8vIF9DQ1hfT0sKKworLy9ub3Qgc3VpdGFibGUgZm9yIEgtSUkgI2RlZmluZSBIQ0ZfQ0ZHX1NUQV8xX0JPVFRPTSAgICAgICAgCTE2CisKKy8vIERlZmF1bHQgV1BBIGluIE9OIGZvciBhbGwgZHJpdmVycyBleGNlcHQgZm9yIFdBUlAgZHJpdmVyCisjaWZkZWYgX1dBUlAKKyNkZWZpbmUgVDVfX0hDRl9UWVBFCQkJCQkoVDRfX0hDRl9UWVBFKQorI2Vsc2UgLy8gX1dBUlAKKyNkZWZpbmUgVDVfX0hDRl9UWVBFCQkJCQkoVDRfX0hDRl9UWVBFIHwgSENGX1RZUEVfV1BBKQorI2VuZGlmIC8vIF9XQVJQCisKKyNkZWZpbmUgSENGX1RZUEUJCQkJCQkoVDVfX0hDRl9UWVBFKQorCisvLyBUaGlzIGlzIG5lZWRlZCB0byBnZXQgYXV4X2N0cmwoKSBmcm9tIHRoZSBIQ0YgZm9yIFdsRnJlZXplQW5kRHVtcCgpCisjaWYgKGRlZmluZWQgREJHICYmIERCRyAhPSAwKQorI2lmbmRlZiBTVEFUSUMKKyNkZWZpbmUgU1RBVElDCisjZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgU09GVFJPTklDU19DT0RFICYmICFkZWZpbmVkIF9BUElETEwgJiYgIWRlZmluZWQgX1dJTjMyX1dDRQorI2luY2x1ZGUgPG5kaXMuaD4KKyNlbmRpZiAvLyBTT0ZUUk9OSUNTX0NPREUgLyBfQVBJRExMIC8gX1dJTjMyX1dDRQorI2lmIGRlZmluZWQgX1dJTjMyX1dDRQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx3aW5udC5oPgorI2VuZGlmICAvLyBfV0lOMzJfV0NFCisjaW5jbHVkZSAidmVyc2lvbi5oIgorCisjZGVmaW5lCU1TRl9DT01QT05FTlRfTUFKT1JfVkVSCQlUUElfTUFKT1JfVkVSU0lPTgorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUgkJVFBJX01JTk9SX1ZFUlNJT04KKworI2lmICFkZWZpbmVkIF9BUElETEwgJiYgIWRlZmluZWQgX1dJTjMyX1dDRQorCitfX2lubGluZSBVQ0hBUiBORElTX0lOX0JZVEUoIFVMT05HIHBvcnQgKQoreworICAgIFVDSEFSIHZhbHVlOworICAgIE5kaXNSYXdSZWFkUG9ydFVjaGFyKHBvcnQgLCAmdmFsdWUpOworICAgIHJldHVybiAodmFsdWUpOworfQorCitfX2lubGluZSBVTE9ORyBORElTX0lOX0xPTkcoIFVMT05HIHBvcnQgKQoreworICAgIFVMT05HIHZhbHVlOworICAgIE5kaXNSYXdSZWFkUG9ydFVsb25nKHBvcnQgLCAmdmFsdWUpOworICAgIHJldHVybiAodmFsdWUpOworfQorX19pbmxpbmUgVVNIT1JUIE5ESVNfSU5fV09SRCggVUxPTkcgcG9ydCApCit7CisgICAgVVNIT1JUIHZhbHVlOworICAgIE5kaXNSYXdSZWFkUG9ydFVzaG9ydChwb3J0ICwgJnZhbHVlKTsKKyAgICByZXR1cm4gKHZhbHVlKTsKK30KKworI2RlZmluZSBJTl9QT1JUX0RXT1JEKHBvcnQpCQkJTkRJU19JTl9MT05HKCAoVUxPTkcpIChwb3J0KSApCisjZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQkJCU5ESVNfSU5fV09SRCggKFVMT05HKSAocG9ydCkgKQorI2RlZmluZSBPVVRfUE9SVF9EV09SRChwb3J0LCB2YWx1ZSkJTmRpc1Jhd1dyaXRlUG9ydFVsb25nKChVTE9ORykgKHBvcnQpICwgdmFsdWUpCisjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpCU5kaXNSYXdXcml0ZVBvcnRVc2hvcnQoKFVMT05HKSAocG9ydCkgLCAoVVNIT1JUKSAodmFsdWUpKQorCisjZGVmaW5lICBJTl9QT1JUX1NUUklOR184XzE2KHBvcnQsIGFkZHIsIGxlbikJSU5fUE9SVF9TVFJJTkdfMTYocG9ydCwgYWRkciwgbGVuKQorI2RlZmluZSAgT1VUX1BPUlRfU1RSSU5HXzhfMTYocG9ydCwgYWRkciwgbGVuKQlPVVRfUE9SVF9TVFJJTkdfMTYocG9ydCwgYWRkciwgbGVuKQorCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzMyKHBvcnQsIGFkZHIsIGxlbikJCXsJCQkJCVwKKwlOZGlzUmF3UmVhZFBvcnRCdWZmZXJVbG9uZyhwb3J0LCBhZGRyLCAobGVuKSk7CQkJCQlcCit9CisKKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzMyKHBvcnQsIGFkZHIsIGxlbikJewkJCQkJCVwKKwlOZGlzUmF3V3JpdGVQb3J0QnVmZmVyVWxvbmcocG9ydCwgYWRkciwgKGxlbikpOwkJCQkJXAorfQorCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KHBvcnQsIGFkZHIsIGxlbikJTmRpc1Jhd1JlYWRQb3J0QnVmZmVyVXNob3J0KHBvcnQsIGFkZHIsIChsZW4pKTsKKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KHBvcnQsIGFkZHIsIGxlbikJTmRpc1Jhd1dyaXRlUG9ydEJ1ZmZlclVzaG9ydChwb3J0LCBhZGRyLCAobGVuKSk7CisKKyNlbmRpZiAvLyAgX0FQSURMTCAvIF9XSU4zMl9XQ0UKKworI2lmIGRlZmluZWQgX1dJTjMyX1dDRQorCisjZGVmaW5lIEhDRl9BTElHTiAyCisjZGVmaW5lIEhDRl9NRU1fSU8JCQkJCTEgLy8gb3ZlcnJ1bGUgc3RhbmRhcmQgUG9ydCBJL08gd2l0aCBNZW1vcnkgbWFwcGVkIEkvTworI2RlZmluZSBIQ0ZfUFJPVF9USU1FCQkJCTQ5CisKKyNkZWZpbmUgIAkJSU5fUE9SVF9CWVRFCQkJQ0VfSU5fUE9SVF9CWVRFCisjZGVmaW5lICAJCU9VVF9QT1JUX0JZVEUJCQlDRV9PVVRfUE9SVF9CWVRFCisjZGVmaW5lICAJCUlOX1BPUlRfV09SRAkJCUNFX0lOX1BPUlRfV09SRAorI2RlZmluZSAgCQlPVVRfUE9SVF9XT1JECQkJQ0VfT1VUX1BPUlRfV09SRAorI2RlZmluZSAgCQlJTl9QT1JUX1NUUklOR18xNgkJQ0VfSU5fUE9SVF9TVFJJTkcKKyNkZWZpbmUgIAkJT1VUX1BPUlRfU1RSSU5HXzE2CQlDRV9PVVRfUE9SVF9TVFJJTkcKKworZXh0ZXJuIGhjZl84ICBDRV9JTl9QT1JUX0JZVEUoaGNmXzMyIHBvcnQpOworZXh0ZXJuIHZvaWQgICBDRV9PVVRfUE9SVF9CWVRFKGhjZl8zMiBwb3J0LCBoY2ZfOCB2YWx1ZSk7CitleHRlcm4gaGNmXzE2IENFX0lOX1BPUlRfV09SRChoY2ZfMzIgcG9ydCk7CitleHRlcm4gdm9pZCAgIENFX09VVF9QT1JUX1dPUkQoaGNmXzMyIHBvcnQsIGhjZl8xNiB2YWx1ZSk7CitleHRlcm4gdm9pZCAgIENFX0lOX1BPUlRfU1RSSU5HKGhjZl8zMiBwb3J0LCB2b2lkICphZGRyLCBoY2ZfMTYgbGVuKTsKK2V4dGVybiB2b2lkICAgQ0VfT1VUX1BPUlRfU1RSSU5HKGhjZl8zMiBwb3J0LCB2b2lkICphZGRyLCBoY2ZfMTYgbGVuKTsKKworCisjZW5kaWYKKworI2lmIGRlZmluZWQgX0RFQlVHIHx8IChkZWZpbmVkIERCRyAmJiBEQkcgIT0gMCkKKyNkZWZpbmUgSENGX0FTU0VSVCAoIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4gfCBIQ0ZfQVNTRVJUX1JUX01TRl9SVE4gfCBIQ0ZfQVNTRVJUX1BSSU5URiApIC8vMHhDMDAxCisvLyNkZWZpbmUgSENGX0FTU0VSVCAoIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4gfCBIQ0ZfQVNTRVJUX1JUX01TRl9SVE4gfCBIQ0ZfQVNTRVJUX1BSSU5URiB8IEhDRl9BU1NFUlRfTUIgKSAvL2p1c3QgdG8gdGVzdAorI2VuZGlmIC8vIF9ERUJVRyB8fCBEQkcKKworI2lmIGRlZmluZWQgREVCVUcgfHwgZGVmaW5lZCBfREVCVUcgfHwgKGRlZmluZWQgREJHICYmIERCRyAhPSAwKQorI2lmZGVmIF9XSU4zMl9XQ0UKKyNkZWZpbmUgREJHQTJXKERCR1NUUikJQ2VDb252ZXJ0QW5zaVRvVW5pY29kZUxlbigoY2hhciopREJHU1RSKQorI2RlZmluZSBPVVRQVVRERUJVR01TRyhkcHJpbnRmX2V4cCkJCQkoKHZvaWQpKCghIFpPTkVfREVCVUcpID8gMDpjZV9kZWJ1Z19vdXQgZHByaW50Zl9leHApKQorI2RlZmluZSBBU1NFUlRERUJVR01TRyhjb25kLCBkcHJpbnRmX2V4cCkJCQkoKHZvaWQpKChjb25kKSA/IDA6Y2VfZGVidWdfb3V0IGRwcmludGZfZXhwKSkKKworI2RlZmluZSBaT05FX0VSUk9SICAgICAgREVCVUdaT05FKDApCisjZGVmaW5lIFpPTkVfV0FSTiAgICAgICBERUJVR1pPTkUoMSkKKyNkZWZpbmUgWk9ORV9GVU5DVElPTiAgIERFQlVHWk9ORSgyKQorI2RlZmluZSBaT05FX0lOSVQgICAgICAgREVCVUdaT05FKDMpCisjZGVmaW5lIFpPTkVfSU5UUiAgICAgICBERUJVR1pPTkUoNCkKKyNkZWZpbmUgWk9ORV9SQ1YgICAgICAgIERFQlVHWk9ORSg1KQorI2RlZmluZSBaT05FX1hNSVQJCURFQlVHWk9ORSg2KQorI2RlZmluZSBaT05FX0FTU0VSVCAJREVCVUdaT05FKDcpCisjZGVmaW5lIFpPTkVfREVCVUcgCQlERUJVR1pPTkUoOCkKKyNkZWZpbmUgWk9ORV9PRU0gCQlERUJVR1pPTkUoOSkKKyNkZWZpbmUgWk9ORV9IQ0YJCURFQlVHWk9ORSgxMCkKKyNkZWZpbmUgWk9ORV9QT1JUSU8JCURFQlVHWk9ORSgxMSkKKyNkZWZpbmUgWk9ORV9MT0dUT0ZJTEUJREVCVUdaT05FKDE1KQorCisjZWxzZSAvLyAhKF9XSU4zMl9XQ0UpCisKKyNkZWZpbmUgT1VUUFVUREVCVUdNU0coZHByaW50Zl9leHApCQkJCQkoKHZvaWQpIChEYmdQcmludCBkcHJpbnRmX2V4cCkpCisvLyB0aGUgYXNzZXJ0ZGVidWdtc2cgbWFjcm8gd2lsbCBwcmludCBmaWxlbmFtZSwgbGluZSBmb2xsb3dlZCBieSBhIGNhbGxlci1kZWZpbmVkIHRleHQsIHdoZW4gY29uZCA9PSAwCisjZGVmaW5lIEFTU0VSVERFQlVHTVNHKGNvbmQsIHByaW50KQkoKHZvaWQpKChjb25kKSA/IDA6IChEYmdQcmludCgiJXMgJXM6JWQgLSAiLCBwcmludCwgX19GSUxFX18sIF9fTElORV9fKSkpKQorCisjZGVmaW5lIFpPTkVfRVJST1IgICAgICAxCisjZGVmaW5lIFpPTkVfV0FSTiAgICAgICAxCisjZGVmaW5lIFpPTkVfRlVOQ1RJT04gICAxCisjZGVmaW5lIFpPTkVfSU5JVCAgICAgICAxCisjZGVmaW5lIFpPTkVfSU5UUiAgICAgICAxCisjZGVmaW5lIFpPTkVfUkNWICAgICAgICAxCisjZGVmaW5lIFpPTkVfWE1JVAkJMQorI2RlZmluZSBaT05FX0FTU0VSVCAJMQorI2RlZmluZSBaT05FX0RFQlVHIAkJMQorI2RlZmluZSBaT05FX09FTSAJCTEKKyNkZWZpbmUgWk9ORV9IQ0YJCTEKKyNkZWZpbmUgWk9ORV9QT1JUSU8JCTEKKyNkZWZpbmUgWk9ORV9MT0dUT0ZJTEUJMQorCisjZW5kaWYgLy8gX1dJTjMyX1dDRQorI2lmbmRlZiBEQkdBMlcKKyNkZWZpbmUgREJHQTJXCisjZW5kaWYJLy8gREJHQTJXCisKKyNlbHNlIC8vICEoZGVmaW5lZCBERUJVRyB8fCBkZWZpbmVkIF9ERUJVRyB8fCAoZGVmaW5lZCBEQkcgJiYgREJHICE9IDApICkKKyNkZWZpbmUgT1VUUFVUREVCVUdNU0coZHByaW50Zl9leHApCisjZGVmaW5lIEFTU0VSVERFQlVHTVNHKGNvbmQsIGRwcmludGZfZXhwKQorI2VuZGlmIC8vIERFQlVHIC8gREJHCisKKyNpZiAhZGVmaW5lZCBIQ0ZfTUFYX01TR19DS0lQX1BBRERJTkcKKyNkZWZpbmUgSENGX01BWF9NU0dfQ0tJUF9QQURESU5HIDAKKyNlbmRpZiAvLyAJCUhDRl9NQVhfTVNHX0NLSVBfUEFERElORworCisjaWYgIWRlZmluZWQJSENGX01BWF9NU0cKKyNkZWZpbmUJCQlIQ0ZfTUFYX01TRwkJCQkxNTE0CisjZW5kaWYgLy8gCQlIQ0ZfTUFYX01TRworCisjZGVmaW5lCQkJSENGX0xFR0FDWQkJCTEJLy87P252IGplIG1vZXQgd2F0CisKKyNlbmRpZiAvL1dWTEFOXzQxIC8gV1ZMQU5fNDggLyBXVkxBTl81MiAvIF9XSU4zMl9XQ0UKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFAgQSBDIEsgRSBUICAgRCBSIEkgViBFIFIgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBEIE8gUyAgIE8gRCBJICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZCBXVkxBTl80MiB8fCBkZWZpbmVkIFdWTEFOXzQzCisKKyNwcmFnbWEgd2FybmluZyAoIGRpc2FibGU6IDQwMDEgKQorI2RlZmluZSBGQVIgIF9fZmFyCQkJCQkJCQkJCS8vc2VnbWVudGVkIDE2IGJpdHMgbW9kZQorI2RlZmluZSBCQVNFRCBfX2Jhc2VkKF9fc2VnbmFtZSgiX0NPREUiKSkJCQkJLy9mb3JjZSBhbGwgdGhlICJjb25zdCIgc3RydWN0dXJlcyBpbiB0aGUgQ09ERSBzZWdtZW50CisKKy8vI2RlZmluZSBIQ0ZfSU8gICAgIDAJCQkJCQkJCQkvL25vIERNQSwgbm8gMzIgYml0cworCisvL35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBUbyBlYXNlIHRlc3RpbmcgdGhlIGRpZmZlcmVudCBvcHRpb25zIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCisjZGVmaW5lCUhDRl9FWFQJCQkJCQlIQ0ZfRVhUX01CCisjZGVmaW5lIEhDRl9QUk9UX1RJTUUJCQkJNDkJCQkJCS8vNDkqMTAyNDAgbWljcm9zZWNvbmRzIEgvVyBmYWlsdXJlIHByb3RlY3Rpb24gdGltZXIKKworLy9+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gVG8gZWFzZSB0ZXN0aW5nIHRoZSBkaWZmZXJlbnQgb3B0aW9ucyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBDT05GSUdVUkFUSU9OIE1BTkFHRU1FTlQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgV1ZMQU5fNDIKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRAkJCUNPTVBfSURfUEFDS0VUCisjZGVmaW5lCU1TRl9DT01QT05FTlRfVkFSCQkJMQorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUgkJNgorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUgkJMTIKKyNlbmRpZiAvLyBXVkxBTl80MgorCisjaWZkZWYgV1ZMQU5fNDMKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRAkJCUNPTVBfSURfT0RJXzE2CisjZGVmaW5lCU1TRl9DT01QT05FTlRfVkFSCQkJMQorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUgkJNgorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUgkJMTAKKyNlbmRpZiAvLyBXVkxBTl80MworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIElOUFVUIC8gT1VUUFVUICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEhfMl9JTkMKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGNvbmlvLmg+CisjaWYgMSAvL3RlbW9yYXJ5IHVzZSBmdW5jdGlvbnMgZGVmaW5lZCBpbiBoY2YuYworI2lmbmRlZiBfREVCVUcKKyNwcmFnbWEgaW50cmluc2ljKCBfaW5wLCBfaW5wdywgX291dHAsIF9vdXRwdyApCisjZW5kaWYgLy8gX0RFQlVHCisKKyNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpCQkJKChoY2ZfMTYpX2lucHcoIChoY2ZfaW8pKHBvcnQpICkpCisjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpCSgodm9pZClfb3V0cHcoIChoY2ZfaW8pKHBvcnQpLCB2YWx1ZSApKQorCisjaWYgMQkJLy8gQyBpbXBsZW1lbnRhdGlvbiB3aGljaCBsZXQgdGhlIHByb2Nlc3NvciBoYW5kbGUgdGhlIHdvcmQtYXQtYnl0ZS1ib3VuZGFyeSBwcm9ibGVtCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzhfMTYoIHBvcnQsIGFkZHIsIG4pCQl3aGlsZSAobi0tKSBcCisJeyAqKGhjZl8xNiBGQVIqKWFkZHIgPSBJTl9QT1JUX1dPUkQoIHBvcnQgKTsgKChoY2ZfOCBGQVIqKWFkZHIpKz0yOyB9CisjZGVmaW5lIE9VVF9QT1JUX1NUUklOR184XzE2KCBwb3J0LCBhZGRyLCBuKQl3aGlsZSAobi0tKSBcCisJeyBPVVRfUE9SVF9XT1JEKCBwb3J0LCAqKGhjZl8xNiBGQVIqKWFkZHIgKSA7ICgoaGNmXzggRkFSKilhZGRyKSs9MjsgfQorI2VsaWYgMAkJLy8gQyBpbXBsZW1lbnRhdGlvbiB3aGljaCBoYW5kbGVzIHRoZSB3b3JkLWF0LWJ5dGUtYm91bmRhcnkgcHJvYmxlbQorI2RlZmluZSBJTl9QT1JUX1NUUklOR184XzE2KCBwb3J0LCBhZGRyLCBuKQkJd2hpbGUgKCBuLS0gKSBcCisJeyBoY2ZfMTYgaSA9IElOX1BPUlRfV09SRChwb3J0KTsgKigoaGNmXzggRkFSKilhZGRyKSsrID0gKGhjZl84KWk7ICooKGhjZl84IEZBUiopYWRkcikrKyA9IChoY2ZfOCkoaT4+OCk7fQorI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfOF8xNiggcG9ydCwgYWRkciwgbikJd2hpbGUgKCBuLS0gKSBcCisJeyBPVVRfUE9SVF9XT1JEKCBwb3J0LCAqKChoY2ZfOCBGQVIqKWFkZHIpIHwgKigoKGhjZl84IEZBUiopYWRkcikrMSk8PDggICk7IChoY2ZfOCBGQVIqKWFkZHIrPTI7IH0KKyNlbHNlCQkJCQkJCQkJCQkJLy8gQXNzZW1ibGVyIGltcGxlbWVudGF0aW9uCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzhfMTYoIHBvcnQsIGFkZHIsIG4pIF9fYXNtCVwKK3sJCQkJCQkJCQkJCQkJXAorCV9fYXNtIHB1c2ggZGkJCQkJCQkJCQlcCisJX19hc20gcHVzaCBlcwkJCQkJCQkJCVwKKwlfX2FzbSBtb3YgY3gsbgkJCQkJCQkJCVwKKwlfX2FzbSBsZXMgZGksYWRkcgkJCQkJCQkJXAorCV9fYXNtIG1vdiBkeCxwb3J0CQkJCQkJCQlcCisJX19hc20gcmVwIGluc3cJCQkJCQkJCQlcCisJX19hc20gcG9wIGVzCQkJCQkJCQkJXAorCV9fYXNtIHBvcCBkaQkJCQkJCQkJCVwKK30KKworI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfOF8xNiggcG9ydCwgYWRkciwgbikgX19hc20JXAorewkJCQkJCQkJCQkJCQlcCisJX19hc20gcHVzaCBzaQkJCQkJCQkJCVwKKwlfX2FzbSBwdXNoIGRzCQkJCQkJCQkJXAorCV9fYXNtIG1vdiBjeCxuCQkJCQkJCQkJXAorCV9fYXNtIGxkcyBzaSxhZGRyCQkJCQkJCQlcCisJX19hc20gbW92IGR4LHBvcnQJCQkJCQkJCVwKKwlfX2FzbSByZXAgb3V0c3cJCQkJCQkJCQlcCisJX19hc20gcG9wIGRzCQkJCQkJCQkJXAorCV9fYXNtIHBvcCBzaQkJCQkJCQkJCVwKK30KKworI2VuZGlmIC8vIEFzbSBvciBDIGltcGxlbWVudGF0aW9uCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzMyKCBwb3J0LCBhZGRyLCBuKQl7IGludCBuMiA9IDIqbjsgSU5fUE9SVF9TVFJJTkdfOF8xNihwb3J0LCBhZGRyLCBuMikgfQorI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMzIoIHBvcnQsIGFkZHIsIG4pCXsgaW50IG4yID0gMipuOyBPVVRfUE9SVF9TVFJJTkdfOF8xNihwb3J0LCBhZGRyLCBuMikgfQorI2VuZGlmIC8vIDAgLy90ZW1vcmFyeSB1c2UgZnVuY3Rpb25zIGRlZmluZWQgaW4gaGNmLmMKKyNlbmRpZiAvLyBIXzJfSU5DCisKKyNlbmRpZgkvLyBXVkxBTl80MiAvIFdWTEFOXzQzCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogIEQgTyBTICBIIC0gSSAvIElJICBMIE8gQSBEIEUgUiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkIEgwX0xEUiB8fCBkZWZpbmVkIEgxX0xEUiB8fCBkZWZpbmVkIEgyX0xEUiB8fCBkZWZpbmVkIEg1X0xEUgorCisjaWYgZGVmaW5lZCBIMF9MRFIJCQkJLy9pbXBsaWVzIEgtSQorI2RlZmluZSBIQ0ZfRExWCQkwCQkJLy9ILUkgbGVnYWN5LCBtZWFuaW5nbGVzcyB1bmRlciBILUlJCisjZGVmaW5lIEhDRl9ETE5WCTEJCQkvL0gtSSBsZWdhY3ksIG1lYW5pbmdsZXNzIHVuZGVyIEgtSUkKKyNlbmRpZiAvLyBIMF9MRFIKKworI2lmIGRlZmluZWQgSDFfTERSIAkJCQkvL2ltcGxpZXMgSC1JCisjZGVmaW5lIEhDRl9ETFYJCTEJCQkvL0gtSSBsZWdhY3ksIG1lYW5pbmdsZXNzIHVuZGVyIEgtSUkKKyNkZWZpbmUgSENGX0RMTlYJMAkJCS8vSC1JIGxlZ2FjeSwgbWVhbmluZ2xlc3MgdW5kZXIgSC1JSQorI2VuZGlmIC8vIEgxX0xEUiAvIEgyX0xEUgorCisvLyNpZiBkZWZpbmVkIEgyX0xEUiA6IG5vdCBuZWVkZWQsIEgtSUkgZGVmYXVsdHMgYXJlIE8uSyBmb3IgSDJfTERSCisKKyNpZmRlZiBINV9MRFIKKyNkZWZpbmUgSENGX1RZUEUJCQkoSENGX1RZUEVfSElJNSB8IEhDRl9UWVBFX1dBUlAgKQorLy87PyB3aHkgZG9lcyBvbmx5IHRoaXMgc3Vic2V0IG9mIHRoZSBIX0xEUnMgbmVlZCBIQ0ZfVFlQRSB0byBiZSBkZWZpbmVkIGhlcmUKKyNlbmRpZgorCisjZGVmaW5lIEhDRl9BU1NFUlQJCQlIQ0ZfQVNTRVJUX0xOS19NU0ZfUlROCS8vc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgb2YgbXNmX2Fzc2VydCByb3V0aW5lCisjZGVmaW5lIEhDRl9FTkNBUAkJCTAKKyNkZWZpbmUgSENGX0lOVF9PTgkJCTAKKyNkZWZpbmUgSENGX1RBTExJRVMJCQkwCisKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRAkJCUNPTVBfSURfT0RJXzE2IC8vOz9CeSBsYWNrIG9mIGFueSBiZXR0ZXIKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9WQVIJCQkxCisjZGVmaW5lCU1TRl9DT01QT05FTlRfTUFKT1JfVkVSCQkwCisjZGVmaW5lCU1TRl9DT01QT05FTlRfTUlOT1JfVkVSCQkwCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGNvbmlvLmg+CisjaWYgZGVmaW5lZCBOREVCVUcKKyNwcmFnbWEgaW50cmluc2ljKCBfaW5wLCBfaW5wdywgX291dHAsIF9vdXRwdyApCisjZW5kaWYgLy8gTkRFQlVHCisKKyNpZiAwCQkJCQkJLy91c2UgMCB0byByZXBsYWNlIEkvTyBNYWNyb3Mgd2l0aCBsb2dnaW5nIGZhY2lsaXR5CisjZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQkJCSgoaGNmXzE2KV9pbnB3KCAoaGNmX2lvKShwb3J0KSApKQorI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQkoKHZvaWQpX291dHB3KCAoaGNmX2lvKShwb3J0KSwgdmFsdWUgKSkKKyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIG4pCVwKKwkJd2hpbGUgKCBuLS0gKSB7ICooaGNmXzE2IEZBUiopYWRkciA9IElOX1BPUlRfV09SRCggcG9ydCApOyAoY2FzdClhZGRyICs9IDI7IH0KKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBuKQlcCisJCXdoaWxlICggbi0tICkgeyBPVVRfUE9SVF9XT1JEKCBwb3J0LCAqKGhjZl8xNiBGQVIqKWFkZHIgKSA7IChjYXN0KWFkZHIgICs9IDI7IH0KKyNlbmRpZgkJCQkJCS8vdXNlIDAgdG8gcmVwbGFjZSBJL08gTWFjcm9zIHdpdGggbG9nZ2luZyBmYWNpbGl0eQorCisjZW5kaWYJLy8gSDBfTERSIC8gSDFfTERSIC8gSDJfTERSCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogIEggQyBGICBEIEUgTSBPICBQIFIgTyBHIFIgQSBNICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkIEhDRl9ERU1PCisKKyNkZWZpbmUgSENGX0RMVgkJMQkJCQkvLzs/c2hvdWxkIGJlY29tZSB0aGUgZGVmYXVsdCAhZGVmYXVsdHMgdG8gMSBhbnl3YXkgZm9yIEgtSUkKKy8vI2RlZmluZSBIQ0ZfRExOVgkwCQkJCS8vZGVmYXVsdHMgdG8gMCBhbnl3YXkgZm9yIEgtSUkKKworI2RlZmluZSBIQ0ZfQVNTRVJUCUhDRl9BU1NFUlRfTE5LX01TRl9SVE4JCQkvL3N1cHBvcnQgZHluYW1pYyBsaW5raW5nIG9mIG1zZl9hc3NlcnQgcm91dGluZQorCisjZGVmaW5lIEhDRl9FTkNBUAkJCTAKKyNkZWZpbmUgSENGX0lOVF9PTgkJCTAKKyNkZWZpbmUgSENGX1RBTExJRVMJCQkoIEhDRl9UQUxMSUVTX05JQyB8IEhDRl9UQUxMSUVTX0hDRiApCisKKy8vI2RlZmluZQlNU0ZfQ09NUE9ORU5UX0lECQlOTyBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnQKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y29uaW8uaD4KKyNpZiBkZWZpbmVkIE5ERUJVRworI3ByYWdtYSBpbnRyaW5zaWMoIF9pbnAsIF9pbnB3LCBfb3V0cCwgX291dHB3ICkKKyNlbmRpZiAvLyBOREVCVUcKKworI2lmIDAJCQkJCQkvL3VzZSAwIHRvIHJlcGxhY2UgSS9PIE1hY3JvcyB3aXRoIGxvZ2dpbmcgZmFjaWxpdHkKKyNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpCQkJKChoY2ZfMTYpX2lucHcoIChoY2ZfaW8pKHBvcnQpICkpCisjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpCSgodm9pZClfb3V0cHcoIChoY2ZfaW8pKHBvcnQpLCB2YWx1ZSApKQorI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbikJXAorCQl3aGlsZSAoIG4tLSApIHsgKihoY2ZfMTYgRkFSKilhZGRyID0gSU5fUE9SVF9XT1JEKCBwb3J0ICk7IChjYXN0KWFkZHIgKz0gMjsgfQorI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIG4pCVwKKwkJd2hpbGUgKCBuLS0gKSB7IE9VVF9QT1JUX1dPUkQoIHBvcnQsICooaGNmXzE2IEZBUiopYWRkciApIDsgKGNhc3QpYWRkciAgKz0gMjsgfQorI2VuZGlmCQkJCQkJLy91c2UgMCB0byByZXBsYWNlIEkvTyBNYWNyb3Mgd2l0aCBsb2dnaW5nIGZhY2lsaXR5CisKKyNlbmRpZgkvLyBIQ0ZfREVNTworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTSBBIEMgIE8gUyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZCBXVkxBTl80NQorCisjaW5jbHVkZSAiVmVyc2lvbi5oIgorCisjZGVmaW5lIE1TRl9DT01QT05FTlRfSUQgICAgICAgICAgICBDT01QX0lEX01BQ19PUworI2RlZmluZSBNU0ZfQ09NUE9ORU5UX1ZBUiAgICAgICAgICAgVkFSSUFOVAorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUiAgICAgVkVSU0lPTl9NQUpPUgorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUiAgICAgVkVSU0lPTl9NSU5PUgorCisjZGVmaW5lIE1BQ19PUyAgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgSENGX0JJR19FTkRJQU4gMSAgICAgICAJCS8vIHNlbGVjdHMgQmlnIEVuZGlhbiAoYS5rLmEuIE1vdG9yb2xhKSwgbW9zdCBzaWduaWZpY2FudCBieXRlIGZpcnN0CisKKyNpZiBkZWZpbmVkIERFQlVHCisjZGVmaW5lIEhDRl9BU1NFUlQJSENGX0FTU0VSVF9NQgkvLyBsb2dnaW5nIHZpYSBNYWlsYm94CisjZW5kaWYgLy8gREVCVUcKKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLy8gX19jcGx1c3BsdXMKK2V4dGVybiB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpNYWNJT2FkZHI7CitleHRlcm4gaGNmXzE2IElOX1BPUlRfV09SRChoY2ZfMTYgcG9ydCk7CitleHRlcm4gdm9pZCAgIE9VVF9QT1JUX1dPUkQoaGNmXzE2IHBvcnQsIGhjZl8xNiB2YWx1ZSk7CitleHRlcm4gdm9pZCAgIElOX1BPUlRfU1RSSU5HXzE2KGhjZl8xNiBwb3J0LCB2b2lkICphZGRyLCBoY2ZfMTYgbGVuKTsKK2V4dGVybiB2b2lkICAgT1VUX1BPUlRfU1RSSU5HXzE2KGhjZl8xNiBwb3J0LCB2b2lkICphZGRyLCBoY2ZfMTYgbGVuKTsKKworI2RlZmluZSBTd2FwQnl0ZXModCkgICAgKCgodCkgPj4gOCkgKyAoKCh0KSAmIDB4ZmYpIDw8IDgpKQorCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmICAvLyBXVkxBTl80NQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIEwgSSBOIFUgWCAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgV1ZMQU5fNDkKKyNpbmNsdWRlIDxhc20vaW8uaD4KKy8vI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPHdsX3ZlcnNpb24uaD4KKworLyogVGhlIGZvbGxvd2luZyBtYWNybyBlbnN1cmVzIHRoYXQgbm8gc3ltYm9scyBhcmUgZXhwb3J0ZWQsIG1pbmltaXppbmcgdGhlIGNoYW5jZSBvZiBhIHN5bWJvbAorICAgY29sbGlzaW9uIGluIHRoZSBrZXJuZWwgKi8KKy8vRVhQT1JUX05PX1NZTUJPTFM7ICAvLzs/dGhpcyBwbGFjZSBzZWVtcyBub3QgYXBwcm9wcmlhdGVseSB0byBtZQorCisvLyNkZWZpbmUgSENGX1NMRUVQIChIQ0ZfQ0RTIHwgSENGX0REUyApCisjZGVmaW5lIEhDRl9TTEVFUCAoSENGX0NEUykKKworLy8jZGVmaW5lIEhDRl9UWVBFICAgIChIQ0ZfVFlQRV9ISUk1fEhDRl9UWVBFX1NUQXxIQ0ZfVFlQRV9BUCkKKyNpZmRlZiBIRVJNRVMyNQorI2lmZGVmIFdBUlAKKyNkZWZpbmUgSENGX1RZUEUgICAgKCBIQ0ZfVFlQRV9XQVJQIHwgSENGX1RZUEVfSElJNSApCisjZWxzZQorI2RlZmluZSBIQ0ZfVFlQRSAgICBIQ0ZfVFlQRV9ISUk1CisjZW5kaWYgLy8gV0FSUAorI2Vsc2UKKyNkZWZpbmUgSENGX1RZUEUgICAgSENGX1RZUEVfTk9ORQorI2VuZGlmIC8vIEhFUk1FUzI1CisKKyNpZmRlZiBFTkFCTEVfRE1BCisjZGVmaW5lIEhDRl9ETUEJCTEKKyNlbmRpZiAvLyBFTkFCTEVfRE1BCisKKy8qIFdlIG5vdyBuZWVkIGEgc3dpdGNoIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIE1haWxib3ggYW5kIG90aGVyIG5lY2Vzc2FyeSBleHRlbnNpb25zICovCisjZGVmaW5lIEhDRl9FWFQgKCBIQ0ZfRVhUX01CIHwgSENGX0VYVF9JTkZPX0xPRyB8IEhDRl9FWFRfSU5UX1RJQ0sgKS8vZ2V0IGRlZXBzbGVlcCBleGVyY2lzZSBnb2luZworCisvKiA7PyBUaGUgTGludXggTVNGIHN0aWxsIHVzZXMgdGhlc2UgZGVmaW5pdGlvbnM7IGRlZmluZSBpdCBoZXJlIHVudGlsIGl0J3MgcmVtb3ZlZCAqLworI2lmbmRlZiBIQ0ZfVFlQRV9ISUkKKyNkZWZpbmUgSENGX1RZUEVfSElJIDB4MDAwNAorI2VuZGlmCisKKyNpZm5kZWYgSENGX1RZUEVfQVAKKyNkZWZpbmUgSENGX1RZUEVfQVAgIDB4MDAxMAorI2VuZGlmCisKKyNpZm5kZWYgSENGX1RZUEVfU1RBCisjZGVmaW5lIEhDRl9UWVBFX1NUQSAweDAwMjAKKyNlbmRpZiAgLy8gSENGX1RZUEVfU1RBCisKKy8qIEd1YXJhbnRlZXMgd29yZCBhbGlnbm1lbnQgKi8KKyNkZWZpbmUgSENGX0FMSUdOCQkyCisKKy8qIEVuZGlhbiBtYWNyb3MgQ05WX0lOVF9UT19MSVRUTEUoKSBhbmQgQ05WX0xJVFRMRV9UT19JTlQoKSB3ZXJlIHJlbmFtZWQgdG8KKyAgIENOVl9TSE9SVF9UT19MSVRUTEUoKSBhbmQgQ05WX0xJVFRMRV9UT19TSE9SVCgpICovCisjaWZuZGVmIENOVl9JTlRfVE9fTElUVExFCisjZGVmaW5lIENOVl9JTlRfVE9fTElUVExFICAgQ05WX1NIT1JUX1RPX0xJVFRMRQorI2VuZGlmCisKKyNpZm5kZWYgQ05WX0xJVFRMRV9UT19JTlQKKyNkZWZpbmUgQ05WX0xJVFRMRV9UT19JTlQgICBDTlZfTElUVExFX1RPX1NIT1JUCisjZW5kaWYKKworI2RlZmluZQlIQ0ZfRVJSX0JVU1kJCQkweDA2CisKKy8qIFVJTCBkZWZpbmVzIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSBIQ0YgKi8KKyNkZWZpbmUgVUlMX1NVQ0NFU1MJCQkJCUhDRl9TVUNDRVNTCisjZGVmaW5lIFVJTF9FUlJfVElNRV9PVVQJCQlIQ0ZfRVJSX1RJTUVfT1VUCisjZGVmaW5lIFVJTF9FUlJfTk9fTklDCQkJCUhDRl9FUlJfTk9fTklDCisjZGVmaW5lIFVJTF9FUlJfTEVOCQkJCQlIQ0ZfRVJSX0xFTgorI2RlZmluZSBVSUxfRVJSX01JTgkJCQkJSENGX0VSUl9NQVgJLyplbmQgb2YgSENGIGVycm9ycyB3aGljaCBhcmUgcGFzc2VkIHRocm91Z2ggdG8gVUlMCisJCQkJCQkJCQkJCQkgICoqKiAqKiAqKiogKioqKioqICoqKioqICoqKiAqKioqKiogKioqKioqKiAqKiAqKiogICovCisjZGVmaW5lIFVJTF9FUlJfSU5fVVNFCQkJCTB4NDQKKyNkZWZpbmUgVUlMX0VSUl9XUk9OR19JRkIJCQkweDQ2CisjZGVmaW5lIFVJTF9FUlJfTUFYCQkJCQkweDdGCQkvKnVwcGVyIGJvdW5kYXJ5IG9mIFVJTCBlcnJvcnMgd2l0aG91dCBIQ0YtcGVuZGFudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKiAqKioqKioqKiAqKiAqKiogKioqKioqICoqKioqKiogKioqICoqKioqKiogICovCisjZGVmaW5lIFVJTF9FUlJfQlVTWQkJCSAgICBIQ0ZfRVJSX0JVU1kKKyNkZWZpbmUgVUlMX0VSUl9ESUFHXzEJCQkgICAgSENGX0VSUl9ESUFHXzEKKyNkZWZpbmUgVUlMX0ZBSUxVUkUJCQkJCTB4RkYJLyogMjAwMTA3MDUgbnYgdGhpcyByZWxpY2sgc2hvdWxkIGJlIGVyaWRpY2F0ZWQgKi8KKyNkZWZpbmUgVUlMX0VSUl9QSUZfQ09ORkxJQ1QJCTB4NDAJLy9vYnNvbGV0ZQorI2RlZmluZSBVSUxfRVJSX0lOQ09NUF9EUlYJCQkweDQxCS8vb2Jzb2xldGUKKyNkZWZpbmUgVUlMX0VSUl9ET1NfQ0FMTAkJCTB4NDMJLy9vYnNvbGV0ZQorI2RlZmluZSBVSUxfRVJSX05PX0RSVgkJCQkweDQyCS8vb2Jzb2xldGUKKyNkZWZpbmUgVUlMX0VSUl9OU1RMCQkJCTB4NDUJLy9vYnNvbGV0ZQorCisKKworI2lmIDAgIC8vOz8gI2lmZGVmIGdldCB0aGlzIGdvaW5nIExBVEVSIEhFUk1FUzI1CisjZGVmaW5lIEhDRl9JTyAgICAgICAgICAgICAgSENGX0lPXzMyQklUUworI2RlZmluZSBIQ0ZfRE1BICAgICAgICAgICAgIDEKKyNkZWZpbmUgSENGX0RFU0NfU1RSQ1RfRVhUICA0CisKKy8qIFN3aXRjaCBmb3IgQnVzTWFzdGVyIERNQSBzdXBwb3J0LiBOb3RlIHRoYXQgdGhlIGFib3ZlIGRlZmluZSBpbmNsdWRlcyB0aGUgRE1BLXNwZWNpZmljIEhDRgorICAgY29kZSBpbiB0aGUgYnVpbGQuIFRoaXMgZGVmaW5lIHNldHMgdGhlIE1TRiB0byB1c2UgRE1BOyBpZiBFTkFCTEVfRE1BIGlzIG5vdCBkZWZpbmVkLCB0aGVuCisgICBwb3J0IEkvTyB3aWxsIGJlIHVzZWQgaW4gdGhlIGJ1aWxkICovCisjaWZuZGVmIEJVU19QQ01DSUEKKyNkZWZpbmUgRU5BQkxFX0RNQQorI2VuZGlmICAvLyBVU0VfUENNQ0lBCisKKyNlbmRpZiAgLy8gSEVSTUVTMjUKKworCisvKiBPdmVycnVsZSBzdGFuZGFyZCBXYXZlTEFOIFBhY2tldCBTaXplIHdoZW4gaW4gRE1BIG1vZGUgKi8KKyNpZmRlZiBFTkFCTEVfRE1BCisjZGVmaW5lIEhDRl9NQVhfUEFDS0VUX1NJWkUgMjMwNAorI2Vsc2UKKyNkZWZpbmUgSENGX01BWF9QQUNLRVRfU0laRSAxNTE0CisjZW5kaWYgIC8vIEVOQUJMRV9ETUEKKworLyogVGhlIGZvbGxvd2luZyBzZXRzIHRoZSBjb21wb25lbnQgSUQsIGFzIHdlbGwgYXMgdGhlIHZlcnNpb25pbmcuIFNlZSBhbHNvIHdsX3ZlcnNpb24uaCAqLworI2RlZmluZQlNU0ZfQ09NUE9ORU5UX0lECUNPTVBfSURfTElOVVgKKworI2RlZmluZQlNU0ZfQ09NUE9ORU5UX1ZBUgkJCURSVl9WQVJJQU5UCisjZGVmaW5lIE1TRl9DT01QT05FTlRfTUFKT1JfVkVSICAgICBEUlZfTUFKT1JfVkVSU0lPTgorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUiAgICAgRFJWX01JTk9SX1ZFUlNJT04KKworLyogRGVmaW5lIHRoZSBmb2xsb3dpbmcgdG8gdHVybiBvbiBhc3NlcnRpb25zIGluIHRoZSBIQ0YgKi8KKy8vI2RlZmluZSBIQ0ZfQVNTRVJUICAweDgwMDAKKyNkZWZpbmUgSENGX0FTU0VSVAkJCUhDRl9BU1NFUlRfTE5LX01TRl9SVE4JLy8gc3RhdGljYWxseSBiaW5kaW5nIG9mIG1zZl9hc3NlcnQgcm91dGluZQorCisjaWZkZWYgVVNFX0JJR19FTkRJQU4KKyNkZWZpbmUgSENGX0JJR19FTkRJQU4gIDEKKyNlbHNlCisjZGVmaW5lIEhDRl9CSUdfRU5ESUFOICAwCisjZW5kaWYgIC8qIFVTRV9CSUdfRU5ESUFOICovCisKKy8qIERlZmluZSB0aGUgZm9sbG93aW5nIGlmIHlvdXIgc3lzdGVtIHVzZXMgbWVtb3J5LW1hcHBlZCBJTyAqLworLy8jZGVmaW5lIEhDRl9NRU1fSU8KKworLyogVGhlIGZvbGxvd2luZyBkZWZpbmVzIHRoZSBzdGFuZGFyZCBtYWNyb3MgcmVxdWlyZWQgYnkgdGhlIEhDRiB0byBtb3ZlIGRhdGEgdG8vZnJvbSB0aGUgY2FyZCAqLworI2RlZmluZSBJTl9QT1JUX0JZVEUocG9ydCkJCQkoKGhjZl84KWluYiggKGhjZl9pbykocG9ydCkgKSkKKyNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpCQkJKChoY2ZfMTYpaW53KCAoaGNmX2lvKShwb3J0KSApKQorI2RlZmluZSBPVVRfUE9SVF9CWVRFKHBvcnQsIHZhbHVlKQkob3V0YiggKGhjZl84KSAodmFsdWUpLCAoaGNmX2lvKShwb3J0KSApKQorI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQkob3V0dygoaGNmXzE2KSAodmFsdWUpLCAoaGNmX2lvKShwb3J0KSApKQorCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KHBvcnQsIGRzdCwgbikgICAgaW5zdygoaGNmX2lvKShwb3J0KSwgZHN0LCBuKQorI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYocG9ydCwgc3JjLCBuKSAgIG91dHN3KChoY2ZfaW8pKHBvcnQpLCBzcmMsIG4pCisvLyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdMKHBvcnQsIGRzdCwgbikgICBpbnNsKChwb3J0KSwgKGRzdCksIChuKSkKKy8vI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdMKHBvcnQsIHNyYywgbikgIG91dHNsKChwb3J0KSwgKHNyYyksIChuKSkKKyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMzIocG9ydCwgZHN0LCBuKSAgIGluc2woKHBvcnQpLCAoZHN0KSwgKG4pKQorI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMzIocG9ydCwgc3JjLCBuKSAgb3V0c2woKHBvcnQpLCAoc3JjKSwgKG4pKQorI2RlZmluZSBJTl9QT1JUX0hDRjMyKHBvcnQpICAgICAgICAgIGlubCggKGhjZl9pbykocG9ydCkgKQorI2RlZmluZSBPVVRfUE9SVF9IQ0YzMihwb3J0LCB2YWx1ZSkgIG91dGwoKGhjZl8zMikodmFsdWUpLCAoaGNmX2lvKShwb3J0KSApCisKKyNkZWZpbmUgSU5fUE9SVF9EV09SRChwb3J0KSAgICAgICAgICBJTl9QT1JUX0hDRjMyKHBvcnQpCisjZGVmaW5lIE9VVF9QT1JUX0RXT1JEKHBvcnQsIHZhbHVlKSAgT1VUX1BPUlRfSENGMzIocG9ydCwgdmFsdWUpCisKKyNkZWZpbmUgIElOX1BPUlRfU1RSSU5HXzhfMTYocG9ydCwgYWRkciwgbGVuKQlJTl9QT1JUX1NUUklOR18xNihwb3J0LCBhZGRyLCBsZW4pCisjZGVmaW5lICBPVVRfUE9SVF9TVFJJTkdfOF8xNihwb3J0LCBhZGRyLCBsZW4pCU9VVF9QT1JUX1NUUklOR18xNihwb3J0LCBhZGRyLCBsZW4pCisKKworI2lmbmRlZiBPVVRQVVRERUJVR01TRworI2RlZmluZSBPVVRQVVRERUJVR01TRyhkcHJpbnRmX2V4cCkKKyNlbmRpZgorCisKKyNpZm5kZWYgQVNTRVJUREVCVUdNU0cKKyNkZWZpbmUgQVNTRVJUREVCVUdNU0coY29uZCwgZHByaW50Zl9leHApCisjZW5kaWYKKworI2lmbmRlZiBDRkdfU0NBTl9DSEFOTkVMU18yR0haCisjZGVmaW5lIENGR19TQ0FOX0NIQU5ORUxTXzJHSFogMHhGQ0MyCisjZW5kaWYgLyogQ0ZHX1NDQU5fQ0hBTk5FTFNfMkdIWiAqLworCisjZGVmaW5lIEhDRl9NQVhfTVNHIDE2MDAgLy9nZXQgZ29pbmcgOz8KKyNlbmRpZgkvLyBXVkxBTl80OQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFEgTiBYICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZCAgX19RTlhfXyB8fCBkZWZpbmVkIFdWTEFOXzUwCisKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9JRAkJMCAgIC8vQWx0aG91Z2ggdGhlcmUgaXMgbm8gRFVJIHN1cHBvcnQsIHdlIG5lZWQgdGhpcyB0byBnZXQgLi4uCisjZGVmaW5lIE1TRl9DT01QT05FTlRfVkFSCQkwCS8vLi4uY29tcGF0aWJpbHR5IGNoZWNrIHRvIGZ1bmN0aW9uCisjZGVmaW5lIE1TRl9DT01QT05FTlRfTUFKT1JfVkVSCTAJLy8uLi47P3RoaXMgaXMgd29ydGggbG9va2luZyBpbnRvIHRvIG1ha2UgdGhpcyBhIG1vcmUKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIJMAkvLy4uLiJkZWZpbmVkIiBJL0Ygc28gT0VNZXJzIGNhbiBmaWd1cmUgb3V0IHdoYXQgdG8gZG8KKworI2luY2x1ZGUgPGNvbmlvLmg+CisKKyNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpCQkJKChoY2ZfMTYpaW5wdyggKGhjZl9pbykocG9ydCkgKSkKKyNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkJKG91dHB3KCAoaGNmX2lvKShwb3J0KSwgKGhjZl8xNikgKHZhbHVlKSApKQorLyoKKyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIG4pCVwKKwkJd2hpbGUgKCBuLS0gKSB7ICooaGNmXzE2KilhZGRyID0gSU5fUE9SVF9XT1JEKCBwb3J0ICk7IChjYXN0KWFkZHIgKz0gMjsgfQorI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIG4pCVwKKwkJd2hpbGUgKCBuLS0gKSB7IE9VVF9QT1JUX1dPUkQoIHBvcnQsICooaGNmXzE2KilhZGRyICkgOyAoY2FzdClhZGRyICArPSAyOyB9CisqLworCisjZW5kaWYJLy8gUU5YIC8gV1ZMQU5fNTAKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBCIEUgTyBTICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQgIF9fQkVPU19fCisKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9JRAkJMCAgIC8vQWx0aG91Z2ggdGhlcmUgaXMgbm8gRFVJIHN1cHBvcnQsIHdlIG5lZWQgdGhpcyB0byBnZXQgLi4uCisjZGVmaW5lIE1TRl9DT01QT05FTlRfVkFSCQkwCS8vLi4uY29tcGF0aWJpbHR5IGNoZWNrIHRvIGZ1bmN0aW9uCisjZGVmaW5lIE1TRl9DT01QT05FTlRfTUFKT1JfVkVSCTAJLy8uLi47P3RoaXMgaXMgd29ydGggbG9va2luZyBpbnRvIHRvIG1ha2UgdGhpcyBhIG1vcmUKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIJMAkvLy4uLiJkZWZpbmVkIiBJL0Ygc28gT0VNZXJzIGNhbiBmaWd1cmUgb3V0IHdoYXQgdG8gZG8KKworI2luY2x1ZGUgPGRyaXZlcnMvRHJpdmVycy5oPgorI2luY2x1ZGUgPGRyaXZlcnMvS2VybmVsRXhwb3J0Lmg+CisKK3VpbnQ4IHJlYWRfaW9fOCAoaW50KTsKK3ZvaWQgd3JpdGVfaW9fOCAoaW50LCB1aW50OCk7Cit1aW50MTYgcmVhZF9pb18xNiAoaW50KTsKK3ZvaWQgd3JpdGVfaW9fMTYgKGludCwgdWludDE2KTsKKworI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkJCQkoKGhjZl8xNilyZWFkX2lvXzE2KCAoaGNmX2lvKShwb3J0KSApKQorI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQkod3JpdGVfaW9fMTYoIChoY2ZfaW8pKHBvcnQpLCAoaGNmXzE2KSAodmFsdWUpICkpCisvKgorI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbikJXAorCQl3aGlsZSAoIG4tLSApIHsgKihoY2ZfMTYqKWFkZHIgPSBJTl9QT1JUX1dPUkQoIHBvcnQgKTsgKGNhc3QpYWRkciArPSAyOyB9CisjZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbikJXAorCQl3aGlsZSAoIG4tLSApIHsgT1VUX1BPUlRfV09SRCggcG9ydCwgKihoY2ZfMTYqKWFkZHIgKSA7IChjYXN0KWFkZHIgICs9IDI7IH0KKyovCisjZW5kaWYJLy8gX19CRU9TX18KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFUgUyBCICAgRCBPIE4gRyBMIEUgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQgVVNCCisjaW5jbHVkZSAiZ3BpZi5oIgorCisjZGVmaW5lCU1TRl9DT01QT05FTlRfTUFKT1JfVkVSCQkwCisjZGVmaW5lCU1TRl9DT01QT05FTlRfTUlOT1JfVkVSCQkxCisKKyNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpCQkJKEhlcm1lc19JT19SZWFkKCAoaGNmXzgpKHBvcnQpKSkKKyNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkJKEhlcm1lc19JT19Xcml0ZSggKGhjZl84KXBvcnQsIC8qKGhjZl8xNikqLyh2YWx1ZSkgKSApCisvKiAhISEhIE5PVEUgVVNCIHN1cHBvcnRzIG9ubHkgMTYtYml0cyBJL08gYW5kIG5vIDgtYml0cyBJL08KKyAqIGFzIGEgY29uc2VxdWVuY2UgdGhlIElOXy9PVVRfUE9SVF9TVFJJTkdfMTYgbWFjcm9zIHVzZSBoY2ZfMTYqIHJhdGhlciB0aGFuIGhjZl84IHBvaW50ZXJzCisgKiB0byBnZXQgbW9yZSBvcHRpbWFsIGNvZGUKKyAqIHRoZXJlZm9yZSB0aGUgcG9pbnRlcnMgYXJlIGluY3JlbWVudGVkIGJ5IDEgKHdoaWNoIG1lYW5zIHR3byAiYnl0ZXMiKSByYXRoZXIgdGhhbiBieSAyCisgKi8KKy8vI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbikJd2hpbGUgKCBuLS0gKSB7ICooKGhjZl8xNiopYWRkcikrKyA9IElOX1BPUlRfV09SRCggcG9ydCApOyB9CisvLyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBuKQl3aGlsZSAoIG4tLSApIHsgT1VUX1BPUlRfV09SRCggcG9ydCwgKigoaGNmXzE2KilhZGRyKSsrICk7IH0KKyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGRzdCwgbikJd2hpbGUgKCBuLS0gKSB7ICpkc3QrKyA9IElOX1BPUlRfV09SRCggcG9ydCApOyB9CisjZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNiggcG9ydCwgc3JjLCBuKQl3aGlsZSAoIG4tLSApIHsgT1VUX1BPUlRfV09SRCggcG9ydCwgKnNyYysrICk7IH0KKworLy8jZGVmaW5lIEhDRl9UWVBFCSggSENGX1RZUEVfQVAgfCBIQ0ZfVFlQRV9XUEEgKQorI2RlZmluZSBIQ0ZfVFlQRQlIQ0ZfVFlQRV9XUEEKKworI2VuZGlmCS8vIFVTQgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmVlQlNEICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQgX19GUkVFX0JTRF9fCisKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRAkJCUNPTVBfSURfRnJlZUJTRAorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX1ZBUgkJCTEKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9NQUpPUl9WRVIJCTEKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIJCTAKKworI2RlZmluZSBIQ0ZfSU8gCQkJCQkJSENGX0lPX01FTQkJLy8gb3ZlcnJ1bGUgc3RhbmRhcmQgUG9ydCBJL08gd2l0aCBNZW1vcnkgbWFwcGVkIEkvTworCisjaW5jbHVkZSA8bWFjaGluZS9jcHVmdW5jLmg+CisKKyNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpCQkJKChoY2ZfMTYpaW53KCAoaGNmX2lvKShwb3J0KSApKQorI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQkob3V0dygoaGNmX2lvKShwb3J0KSwgKGhjZl8xNikodmFsdWUpKSkKKworLyoKKyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIG4pCVwKKwkJd2hpbGUgKCBuLS0gKSB7ICooaGNmXzE2KilhZGRyID0gSU5fUE9SVF9XT1JEKCBwb3J0ICk7IChjYXN0KWFkZHIgKz0gMjsgfQorI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIG4pCVwKKwkJd2hpbGUgKCBuLS0gKSB7IE9VVF9QT1JUX1dPUkQoIHBvcnQsICooaGNmXzE2KilhZGRyICkgOyAoY2FzdClhZGRyICArPSAyOyB9CisqLworI2VuZGlmCS8vIF9fRlJFRV9CU0RfXworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFcgQSBWIEUgUCBPIEkgTiBUICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZCBXVkxBTl84MQkvKiBCT1JMQU5EQyAqLworCisjZGVmaW5lIEVYVEVSTl9DICBleHRlcm4JLy8gbmVlZGVkIGJlY2F1c2UgREhGIHVzZXMgdGhpcyBpbnN0ZWFkIG9mICdleHRlcm4nCisKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRAlDT01QX0lEX0FQMQorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX1ZBUgkJCTEKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9NQUpPUl9WRVIJCTQKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIJCTAKKworI2RlZmluZSBIQ0ZfUFJPVF9USU1FCQkJCTQ5CS8vNDkqMTAyNDAgbWljcm9zZWNvbmRzIEgvVyBmYWlsdXJlIHByb3RlY3Rpb24gdGltZXIKKworLy8jZGVmaW5lIEhDRl9BU1NFUlQJSENGX0FTU0VSVF9NQgkvLyBsb2dnaW5nIHZpYSBNYWlsYm94CS8qIGRlYnVnIGJ1aWxkIG9ubHkgKi8KKworI2lmICFkZWZpbmVkIEZBUgorI2RlZmluZSBGQVIgIGZhcgkJCQkJCS8vIHNlZ21lbnRlZCAxNiBiaXRzIG1vZGUKKyNlbmRpZiAvLyBGQVIKKworI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkJCQkJCShpbnBvcnQoIChoY2ZfaW8pKHBvcnQpICkpCisjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpCQkJKG91dHBvcnQoIChoY2ZfaW8pKHBvcnQpLCB2YWx1ZSApKQorCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KHBvcnQsIGFkZHIsIGxlbikJXAorCWFzbSB7IHB1c2ggZGk7IHB1c2ggZXM7IG1vdiBjeCxsZW47IGxlcyBkaSxhZGRyOyBtb3YgZHgscG9ydDsgcmVwIGluc3c7IHBvcCBlczsgcG9wIGRpIH0KKworI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYocG9ydCwgYWRkciwgbGVuKQlcCisJYXNtIHsgcHVzaCBzaTsgcHVzaCBkczsgbW92IGN4LGxlbjsgbGRzIHNpLGFkZHI7IG1vdiBkeCxwb3J0OyByZXAgb3V0c3c7IHBvcCBkczsgcG9wIHNpIH0KKworI2VuZGlmIC8vIFdWTEFOXzgxCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgVyBBIFYgRSBMIEEgVSBOIEMgSCAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZCBXVkxBVU5DSAorCisjaW5jbHVkZSAiRHJpdmVyWC5oIgorZXh0ZXJuIEhXREVWSUNFKglnX3BEZXZpY2U7CisKKy8vI2RlZmluZQlNU0ZfQ09NUE9ORU5UX0lECQkJMCAgLy87PyB0byBnZXQgYXJvdW5kIGJyb3dzZXIgcHJvYmxlbQorCisjZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQlId0lucHcoIGdfcERldmljZSwgcG9ydCApCisjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpCUh3T3V0cHcoIGdfcERldmljZSwgcG9ydCwgdmFsdWUgKQorCisKKy8vIEMgaW1wbGVtZW50YXRpb24gd2hpY2ggbGV0IHRoZSBwcm9jZXNzb3IgaGFuZGxlIHRoZSB3b3JkLWF0LWJ5dGUtYm91bmRhcnkgcHJvYmxlbQorLyoKKyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIG4pCVwKKwkJd2hpbGUgKCBuLS0gKSB7ICooaGNmXzE2IEZBUiopYWRkciA9IElOX1BPUlRfV09SRCggcG9ydCApOyAoY2FzdClhZGRyICs9IDI7IH0KKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBuKQlcCisJCXdoaWxlICggbi0tICkgeyBPVVRfUE9SVF9XT1JEKCBwb3J0LCAqKGhjZl8xNiBGQVIqKWFkZHIgKSA7IChjYXN0KWFkZHIgICs9IDI7IH0KKyovCisjZW5kaWYgLy8gV1ZMQVVOQ0gKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgVyBDIEkgVCBTIFQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQgV0NJVFNUCisjZGVmaW5lIE1TRl9DT01QT05FTlRfSUQJCTAgICAvL0FsdGhvdWdoIHRoZXJlIGlzIG5vIERVSSBzdXBwb3J0LCB3ZSBuZWVkIHRoaXMgdG8gZ2V0IC4uLgorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX1ZBUgkJMAkvLy4uLmNvbXBhdGliaWx0eSBjaGVjayB0byBmdW5jdGlvbgorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUgkwCS8vLi4uOz90aGlzIGlzIHdvcnRoIGxvb2tpbmcgaW50byB0byBtYWtlIHRoaXMgYSBtb3JlCisjZGVmaW5lIE1TRl9DT01QT05FTlRfTUlOT1JfVkVSCTAJLy8uLi4iZGVmaW5lZCIgSS9GIHNvIE9FTWVycyBjYW4gZmlndXJlIG91dCB3aGF0IHRvIGRvCisKKy8vI2RlZmluZSBIQ0ZfRU5DQVAJCQkJSENGX0VOQ19OT05FCS8vdG8gZ2V0IGdvaW5nCisvL35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBUbyBlYXNlIHRlc3RpbmcgdGhlIGRpZmZlcmVudCBvcHRpb25zIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorI2RlZmluZSBIQ0ZfVFlQRSAoSENGX1RZUEVfV1BBIHwgSENGX1RZUEVfUFJFTE9BREVEKSAvLyBIZXJtZXMtSSBmb3IgSENGNiwgSUkgZm9yIEhDRjcKKyNkZWZpbmUgCQlIQ0ZfRE1BCQkJCTEKKy8vI2RlZmluZSBMTEIJLy8hISEhTUlDIERlYnVnIE9ubHkKKyNpZiBkZWZpbmVkIExMQiAmJiAhKChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEpCitlcnI6IG5vIExMQiB1bmxlc3MgU1NOOworI2VuZGlmIC8vIExMQiAvIEhDRl9UWVBFX1dQQQorLy8jZGVmaW5lIEhDRl9BTElHTiAyCisjZGVmaW5lIEhDRl9ETFYJCTEJCQkvL2p1c3QgdG8gY2hhbmdlIG1lbW9yeSBsYXlvdXQgPz8/Pzs/CisvL35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBUbyBlYXNlIHRlc3RpbmcgdGhlIGRpZmZlcmVudCBvcHRpb25zIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCisjZGVmaW5lIEhDRl9BU1NFUlQJSENGX0FTU0VSVF9TV19TVVAJLy8gbG9nZ2luZyB2aWEgSGVybWVzIHN1cHBvcnQgcmVnaXN0ZXJyCisvLyNkZWZpbmUgSENGX0FTU0VSVAkJSENGX0FTU0VSVF9NQgkJLy8gbG9nZ2luZyB2aWEgTWFpbGJveAorCisjaWYgZGVmaW5lZCBfX0dOVUNfXworI2luY2x1ZGUgInN0ZGlvLmgiCisvLyNpbmNsdWRlICJ1bmlzdGQuaCIJLy9pb3Blcm0gICBsaWJjNQorI2luY2x1ZGUgInN5cy9pby5oIgkvL2lvcGVybSAgIGdsaWJjCisjZGVmaW5lIGV4dGVybgkJLy9zZWUgSU8gUG9ydCBQcm9ncmFtbWluZyBtaW5pLUhPV1RPCisvLyNpbmNsdWRlICJhc20vaW8uaCIJLy8KKyNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpCQkJaW53KCAoaGNmX2lvKShwb3J0KSApCisjZGVmaW5lIElOX1BPUlRfRFdPUkQocG9ydCkJCQlpbmwoIChoY2ZfaW8pKHBvcnQpICkKKyNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkJb3V0dyggKGhjZl9pbykocG9ydCksIChoY2ZfMTYpKHZhbHVlKSApCisjZGVmaW5lIE9VVF9QT1JUX0RXT1JEKHBvcnQsIHZhbHVlKQlvdXRsKCAoaGNmX2lvKShwb3J0KSwgKGhjZl8xNikodmFsdWUpICkKKyNlbHNlCisjcHJhZ21hIHdhcm5pbmcgKCBkaXNhYmxlOiA0MDAxICkKKyNkZWZpbmUgRkFSICBfX2ZhcgkJCQkJLy8gc2VnbWVudGVkIDE2IGJpdHMgbW9kZQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjb25pby5oPgorI2lmbmRlZiBfREVCVUcKKyNwcmFnbWEgaW50cmluc2ljKCBfaW5wLCBfaW5wdywgX291dHAsIF9vdXRwdyApCisjZW5kaWYgLy8gX0RFQlVHCisKKyNpZmRlZiBMT0cKK2V4dGVybiBGSUxFKiB1dG1fbG9nZmlsZTsKK2hjZl8xNglpcHcoIGhjZl8xNiBwb3J0ICk7CitoY2ZfOAlpcGIoIGhjZl8xNiBwb3J0ICk7Cit2b2lkCW9wdyggaGNmXzE2IHBvcnQsIGhjZl8xNiB2YWx1ZSApOwordm9pZAlvcGIoIGhjZl8xNiBwb3J0LCBoY2ZfOCB2YWx1ZSApOworCisjZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQkJCWlwdyggKGhjZl9pbykocG9ydCkgKQorI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQlvcHcoIChoY2ZfaW8pKHBvcnQpLCAoaGNmXzE2KSh2YWx1ZSkgKQorI2Vsc2UgLy8gTE9HCisjZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQkJCSgoaGNmXzE2KV9pbnB3KCAoaGNmX2lvKShwb3J0KSApKQorI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQkoKHZvaWQpX291dHB3KCAoaGNmX2lvKShwb3J0KSwgdmFsdWUgKSkKKyNlbmRpZiAvLyBMT0cKKworI2lmIDEgLy9BU00gZXhhbXBsZQorI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbGVuKSBfX2FzbQkJXAorewkJCQkJCQkJCQkJCQkJXAorCV9fYXNtIHB1c2ggZGkJCQkJCQkJCQkJXAorCV9fYXNtIHB1c2ggZXMJCQkJCQkJCQkJXAorCV9fYXNtIG1vdiBjeCxsZW4JCQkJCQkJCQlcCisJX19hc20gbGVzIGRpLGFkZHIJCQkJCQkJCQlcCisJX19hc20gbW92IGR4LHBvcnQJCQkJCQkJCQlcCisJX19hc20gcmVwIGluc3cJCQkJCQkJCQkJXAorCV9fYXNtIHBvcCBlcwkJCQkJCQkJCQlcCisJX19hc20gcG9wIGRpCQkJCQkJCQkJCVwKK30KKworI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIGxlbikgX19hc20JCVwKK3sJCQkJCQkJCQkJCQkJCVwKKwlfX2FzbSBwdXNoIHNpCQkJCQkJCQkJCVwKKwlfX2FzbSBwdXNoIGRzCQkJCQkJCQkJCVwKKwlfX2FzbSBtb3YgY3gsbGVuCQkJCQkJCQkJXAorCV9fYXNtIGxkcyBzaSxhZGRyCQkJCQkJCQkJXAorCV9fYXNtIG1vdiBkeCxwb3J0CQkJCQkJCQkJXAorCV9fYXNtIHJlcCBvdXRzdwkJCQkJCQkJCQlcCisJX19hc20gcG9wIGRzCQkJCQkJCQkJCVwKKwlfX2FzbSBwb3Agc2kJCQkJCQkJCQkJXAorfQorCisjZW5kaWYJLy8gYXNtIGV4YW1wbGUKKworI2VuZGlmIC8vIF9fR0NDX18KKworI2lmICEgZGVmaW5lZCBJTl9QT1JUX1NUUklOR18xNgorI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbikgIHdoaWxlIChuLS0pIFwKKwl7ICooaGNmXzE2IEZBUiopYWRkciA9IElOX1BPUlRfV09SRCggcG9ydCApOyAoKGhjZl8xNiBGQVIqKWFkZHIpKys7IH0KKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBuKSB3aGlsZSAobi0tKSBcCisJeyBPVVRfUE9SVF9XT1JEKCBwb3J0LCAqKGhjZl8xNiBGQVIqKWFkZHIgKTsgKChoY2ZfMTYgRkFSKilhZGRyKSsrOyB9CisjZW5kaWYgLy8gSU5fUE9SVF9TVFJJTkdfMTYKKworI2VuZGlmCS8vIFdDSVRTVAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTW90b3JvbGEgUG93ZXIgUEMgODAwIGZhbWlseSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGtub3duIHVzZXJzOiBMSEBJCisgKi8KKworI2lmIGRlZmluZWQgSV9NUEM4WFgKKworI2RlZmluZSBNU0ZfQ09NUE9ORU5UX1ZBUgkJMAorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX0lECQkwCisjZGVmaW5lIE1TRl9DT01QT05FTlRfTUFKT1JfVkVSCTEKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIJMAorCisjZGVmaW5lIEhDRl9IU0lfVkFSCQkJCTEKKworI2RlZmluZSBIQ0ZfQklHX0VORElBTgkJCTEKKyNkZWZpbmUgSENGX0lPIAkJCQkJSENGX0lPX01FTQkJLy8gb3ZlcnJ1bGUgc3RhbmRhcmQgUG9ydCBJL08gd2l0aCBNZW1vcnkgbWFwcGVkIEkvTworCisjaW5jbHVkZSAib19wb3J0YmwuaCIKKyNpbmNsdWRlICJpcGNtY2lhLmgiCit0eXBlZGVmIG9fdWludDhfdCAgaGNmXzg7Cit0eXBlZGVmIG9fdWludDE2X3QgaGNmXzE2OwordHlwZWRlZiBvX3VpbnQzMl90IGhjZl8zMjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZkZWYgX2xpbnQKKyNlbHNlCithc20gaGNmXzE2IElOX1BPUlRfV09SRChpbnQgcG9ydCkKK3sKKyUgcmVnIHBvcnQKKyAgICBsaGJyeCByMyxyMCxwb3J0CisgICAgZWllaW8KK30KKyNlbmRpZiAvLyBfbGludAorCisKKyNpZmRlZiBfbGludAorI2Vsc2UKK2FzbSB2b2lkIE9VVF9QT1JUX1dPUkQoaW50IHBvcnQsIGhjZl8xNiB2YWx1ZSkKK3sKKyUgcmVnIHBvcnQsIHZhbHVlCisgICAgc3RoYnJ4IHZhbHVlLHIwLHBvcnQKKyAgICBlaWVpbworfQorI2VuZGlmIC8vIF9saW50CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYocG9ydCwgYWRkciwgbGVuKSAgICAgICAgICAgICAgIFwKKyAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHVuc2lnbmVkIGwgPSAobGVuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGhjZl8xNiAqZCA9ICh2b2xhdGlsZSBoY2ZfMTYgKikoYWRkcik7ICAgICAgICAgIFwKKyAgICAgIHdoaWxlIChsLS0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICpkKysgPSAqKHZvbGF0aWxlIGhjZl8xNiAqKShwb3J0KTsgICAgICAgICAgIFwKKyAgICAgICAgIEVJRUlPKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIH0KKworI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYocG9ydCwgYWRkciwgbGVuKSAgICAgICAgICAgXAorICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdW5zaWduZWQgbCA9IChsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaGNmXzE2ICpzID0gKHZvbGF0aWxlIGhjZl8xNiAqKShhZGRyKTsgICAgICAgICAgXAorICAgICAgd2hpbGUgKGwtLSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgKih2b2xhdGlsZSBoY2ZfMTYgKikocG9ydCkgPSAqcysrOyAgICAgICAgICAgXAorICAgICAgICAgRUlFSU8oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfQorCisjZW5kaWYJLy8gSV9NUEM4WFgKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIERpYWIgb3IgSGlnaCBDIDI5SyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGtub3duIHVzZXJzOiBHS0BDCisgKi8KKworI2lmIGRlZmluZWQgX0FNMjlLCisKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9WQVIJCTAKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9JRAkJQ09NUF9JRF9BUDEKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9NQUpPUl9WRVIJMQorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUgkwCisKKyNkZWZpbmUgSENGX0JJR19FTkRJQU4JCQkxCisjZGVmaW5lIEhDRl9JTyAJCQkJCUhDRl9JT19NRU0JCS8vIG92ZXJydWxlIHN0YW5kYXJkIFBvcnQgSS9PIHdpdGggTWVtb3J5IG1hcHBlZCBJL08KKworI2RlZmluZSBTd2FwQnl0ZXModCkgICAgLypsaW50IC1lNTcyKi8oKCh0KSA+PiA4KSArICgoKHQpICYgMHhmZikgPDwgOCkpLypsaW50ICtlNTcyKi8KKworI2lmIGRlZmluZWQgX19wcGMKKyAgICAjaWZuZGVmIF9fR05VQ19fCisgICAgICAgICNkZWZpbmUgX19hc21fXyAgICAgYXNtCisgICAgI2VuZGlmCisKKyAgICAjaWYgISBkZWZpbmVkIF9saW50CisgICAgICAgICNkZWZpbmUgRUlFSU8oKSAgICAgX19hc21fXygiIGVpZWlvIikKKyAgICAjZWxzZQorICAgICAgICAjZGVmaW5lIEVJRUlPKCkKKyAgICAjZW5kaWYKKworICAgIHN0YXRpYyBoY2ZfMTYgSU5fUE9SVF9XT1JEKGludCBwb3J0KSB7CisgICAgICAgIGhjZl8xNiB2YWx1ZSA9ICoodm9sYXRpbGUgaGNmXzE2ICopKHBvcnQpOyBFSUVJTygpOworICAgICAgICB2YWx1ZSA9IFN3YXBCeXRlcyh2YWx1ZSk7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpICAgICAgXAorICAgICAgICAgICAgeyAqKHZvbGF0aWxlIGhjZl8xNiAqKShwb3J0KSA9IFN3YXBCeXRlcyh2YWx1ZSk7IEVJRUlPKCk7IH0KKyNlbHNlCisgICAgI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkgKCoodm9sYXRpbGUgaGNmXzE2ICopKHBvcnQpKQorICAgICNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkgKCoodm9sYXRpbGUgaGNmXzE2ICopKHBvcnQpID0gKHZhbHVlKSkKKyNlbmRpZiAvLyBfX3BwYworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBsZW4pICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsID0gKGxlbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBoY2ZfMTYgdCwgKmQgPSAodm9sYXRpbGUgaGNmXzE2ICopKGFkZHIpOyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobC0tKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IElOX1BPUlRfV09SRChwb3J0KTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmQrKyA9IFN3YXBCeXRlcyh0KTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBsZW4pICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsID0gKGxlbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBoY2ZfMTYgdCwgKnMgPSAodm9sYXRpbGUgaGNmXzE2ICopKGFkZHIpOyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGwtLSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAqcysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVF9QT1JUX1dPUkQocG9ydCwgU3dhcEJ5dGVzKHQpKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisjaWYgUFJPRFVDVCA9PSA5MTUwCisgICAgI2RlZmluZSBIQ0ZfQVNTRVJUCUhDRl9BU1NFUlRfTUIJLy8gbG9nZ2luZyB2aWEgTWFpbGJveAorICAgICN1bmRlZiBNU0ZfQ09NUE9ORU5UX0lECisjZW5kaWYgLy8gOTE1MAorCisjZW5kaWYJLy8gX0FNMjlLCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEM4NjAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBrbm93biB1c2VyczogUlIKKyAqLworCisjaWYgZGVmaW5lZCBDUFUKKyNpZiBDUFUgPT0gUFBDODYwCisKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9WQVIJCTAKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9JRAkJMAorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUgkxCisjZGVmaW5lIE1TRl9DT01QT05FTlRfTUlOT1JfVkVSCTAKKworI2RlZmluZSBIQ0ZfQklHX0VORElBTgkJCTEKKyNkZWZpbmUgSENGX0lPIAkJCQkJSENGX0lPX01FTQkJLy8gb3ZlcnJ1bGUgc3RhbmRhcmQgUG9ydCBJL08gd2l0aCBNZW1vcnkgbWFwcGVkIEkvTworCisjZGVmaW5lIFN3YXBCeXRlcyh0KSAgICAvKmxpbnQgLWU1NzIqLygoKHQpID4+IDgpICsgKCgodCkgJiAweGZmKSA8PCA4KSkvKmxpbnQgK2U1NzIqLworCisjaWZuZGVmIF9fR05VQ19fCisgICAgI2RlZmluZSBfX2FzbV9fICAgICBhc20KKyNlbmRpZgorCisjaWYgISBkZWZpbmVkIF9saW50CisgICAgI2RlZmluZSBFSUVJTygpICAgICBfX2FzbV9fKCIgZWllaW8iKQorI2Vsc2UKKyAgICAjZGVmaW5lIEVJRUlPKCkKKyNlbmRpZgorCitzdGF0aWMgaGNmXzE2IElOX1BPUlRfV09SRChpbnQgcG9ydCkgeworICAgIGhjZl8xNiB2YWx1ZSA9ICoodm9sYXRpbGUgaGNmXzE2ICopKHBvcnQpOyBFSUVJTygpOworICAgIHZhbHVlID0gU3dhcEJ5dGVzKHZhbHVlKTsKKyAgICByZXR1cm4gdmFsdWU7CisgICAgI2lmZGVmIF9fR05VQ19fCisgICAgICAgIC8qIHRoZSBmb2xsb3dpbmcgc2VydmVzIHRvIGF2b2lkIHRoZSBjb21waWxlciB3YXJuaW5ncyB0aGF0CisgICAgICAgICAqIElOX1BPUlRfV09SRCgpIGlzIG5vdCB1c2VkIGluIHNvbWUgZmlsZXMgKi8KKyAgICAgICAgKHZvaWQpSU5fUE9SVF9XT1JEOworICAgICNlbmRpZgorfQorCisjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpICAgICAgXAorICAgICAgICB7ICoodm9sYXRpbGUgaGNmXzE2ICopKHBvcnQpID0gU3dhcEJ5dGVzKHZhbHVlKTsgRUlFSU8oKTsgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBsZW4pICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsID0gKGxlbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBoY2ZfMTYgdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB2b2xhdGlsZSBoY2ZfMTYgKmQgPSAodm9sYXRpbGUgaGNmXzE2ICopKGFkZHIpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobC0tKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IElOX1BPUlRfV09SRChwb3J0KTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmQrKyA9IFN3YXBCeXRlcyh0KTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBsZW4pICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsID0gKGxlbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBoY2ZfMTYgdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB2b2xhdGlsZSBoY2ZfMTYgKnMgPSAodm9sYXRpbGUgaGNmXzE2ICopKGFkZHIpOyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGwtLSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAqcysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVF9QT1JUX1dPUkQocG9ydCwgU3dhcEJ5dGVzKHQpKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisjaWYgUFJPRFVDVCA9PSA5MTUwCisgICAgI2RlZmluZSBIQ0ZfQVNTRVJUCUhDRl9BU1NFUlRfTUIJLy8gbG9nZ2luZyB2aWEgTWFpbGJveAorICAgICN1bmRlZiBNU0ZfQ09NUE9ORU5UX0lECisjZW5kaWYKKworI2VuZGlmCS8qIFBQQzg2MCAqLworI2VuZGlmCS8qIENQVSAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNaWNyb3RlYyBSZXNlYXJjaCA4MFg4NiBDb21waWxlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgMAorCisvLyN1bmRlZiBIQ0ZfVFlQRQkJCQkJCQkJCS8vIEhlcm1lcy1JIFN0YXRpb24gRi9XIHdpdGhvdXQgU1NOIHN1cHBvcnQKKworI2RlZmluZSBNU0ZfQ09NUE9ORU5UX1ZBUiAgICAgICAwCisjZGVmaW5lIE1TRl9DT01QT05FTlRfSUQgICAgICAgIDAKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9NQUpPUl9WRVIgMQorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUiAwCisKK2V4dGVybiBpbnQgZmFyIGlucCggaW50ICk7CitleHRlcm4gdm9pZCBmYXIgb3V0cCggaW50LCBpbnQgKTsKK2V4dGVybiBpbnQgZmFyIGlucHcoIGludCApOworZXh0ZXJuIHZvaWQgZmFyIG91dHB3KCBpbnQsIGludCApOworCisjZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQkJKChoY2ZfMTYpaW5wdyggKGhjZl9pbykocG9ydCkgKSkKKyNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkJKCh2b2lkKW91dHB3KCAoaGNmX2lvKShwb3J0KSwgdmFsdWUgKSkKKworI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbGVuKSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbCA9IChsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgaGNmXzE2ICpkID0gKGhjZl8xNiAqKShhZGRyKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGwtLSkgKmQrKyA9ICBJTl9QT1JUX1dPUkQocG9ydCk7ICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisjZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbGVuKSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbCA9IChsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgaGNmXzE2ICpzID0gKGhjZl8xNiAqKShhZGRyKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsLS0pIE9VVF9QT1JUX1dPUkQocG9ydCwgKnMrKyk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgkvKiBNaWNyb3RlYyA4MFg4NiBDIENvbXBpbGVyICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgVyBBIFYgRSBMIEEgTiAgRSBDICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBrbm93biB1c2VyczogS00KKyAqLworCisjaWZkZWYgbWM2ODMwMgorCisjZGVmaW5lCU1TRl9DT01QT05FTlRfSUQJCQlDT01QX0lEX0VDCisKKyNpbmNsdWRlIDx2ZXJzaW9uLmg+CisKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9WQVIJCQkxCisjZGVmaW5lCU1TRl9DT01QT05FTlRfTUFKT1JfVkVSCQlNQUpPUl9WRVJTSU9OCisjZGVmaW5lCU1TRl9DT01QT05FTlRfTUlOT1JfVkVSCQlNSU5PUl9WRVJTSU9OCisKKyNkZWZpbmUgSENGX0JJR19FTkRJQU4JCQkJMQorI2RlZmluZSBIQ0ZfSU8gCQkJCQkJSENGX0lPX01FTQkJLy8gb3ZlcnJ1bGUgc3RhbmRhcmQgUG9ydCBJL08gd2l0aCBNZW1vcnkgbWFwcGVkIEkvTworCisjZGVmaW5lIFN3YXBCeXRlcyh0KQkvKmxpbnQgLWU1NzIqLygoKHQpID4+IDgpICsgKCgodCkgJiAweGZmKSA8PCA4KSkvKmxpbnQgK2U1NzIqLworCisjZGVmaW5lIFBDTUNJQV9BRERSRVNTIDB4YzgwMDAwVUwKKworI2RlZmluZSBJTl9QT1JUXzJCWVRFUyhwb3J0KQkJCSAoKihoY2ZfMTYgKikocG9ydCkpCisjaWYgMAorc3RhdGljIGhjZl8xNiBJTl9QT1JUX1dPUkQoaGNmXzMyIHBvcnQpIC8vIHNob3VsZCBiZSBoY2ZfaW8sIG5vdCBoY2ZfMzIKK3sKKyAgaGNmXzE2IHdvcmQgPSBJTl9QT1JUXzJCWVRFUyhwb3J0KTsKKyAgcmV0dXJuIFN3YXBCeXRlcyh3b3JkKTsKK30KKyNlbHNlCitzdGF0aWMgaGNmXzE2IHN3YXBfdmFyOworI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkgXAorICAoKChzd2FwX3ZhciA9IElOX1BPUlRfMkJZVEVTKHBvcnQpKSA+PiA4KSArICgoKHN3YXBfdmFyKSAmIDB4ZmYpIDw8IDgpKQorI2VuZGlmCisjZGVmaW5lIE9VVF9QT1JUXzJCWVRFUyhwb3J0LCB2YWx1ZSkJICgqKGhjZl8xNiAqKShwb3J0KSA9IChoY2ZfMTYpKHZhbHVlKSkKKyNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkJCSBPVVRfUE9SVF8yQllURVMocG9ydCwgU3dhcEJ5dGVzKHZhbHVlKSkKKworLyoKKyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYocG9ydCwgYWRkciwgbGVuKQkgIFwKKwl3aGlsZSAoKGxlbiktLSkgeyooaGNmXzE2ICopKGFkZHIpID0gSU5fUE9SVF8yQllURVMocG9ydCk7ICgoY2FzdClhZGRyKSArPSAyOyB9CisjZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNihwb3J0LCBhZGRyLCBsZW4pCSAgXAorCXdoaWxlICgobGVuKS0tKSB7T1VUX1BPUlRfMkJZVEVTKChwb3J0KSwgKihoY2ZfMTYgKikoYWRkcikpIDsgKChjYXN0KWFkZHIpICArPSAyOyB9CisqLworCisjZW5kaWYJLyogbWM2ODMwMiAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE5HQVAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZCBfX1ZYX1dPUktTX18JLyogVnhXb3JrcyAqLworCisjaWYgZGVmaW5lZCBXTENfU1RBVElPTgorLy8jdW5kZWYgSENGX1RZUEUgCQkJCS8qIEhlcm1lcy1JIFN0YXRpb24gRi9XIHdpdGhvdXQgU1NOIHN1cHBvcnQgKi8KKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9JRAlDT01QX0lEX1ZYX1dPUktTX0VORFNUQQorI2Vsc2UKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9JRAlDT01QX0lEX1ZYX1dPUktTX0VOREFQCisjZW5kaWYJLy8gV0xDX1NUQVRJT04KKworI2RlZmluZSBIQ0ZfWUlFTEQgKHRhc2tEZWxheSgwKSA9PSAwKQorCisjZGVmaW5lICAgIE1TRl9DT01QT05FTlRfVkFSICAgICAgICAgICAgICAxCisjZGVmaW5lICAgIE1TRl9DT01QT05FTlRfTUFKT1JfVkVSICAgICAgICAxCisjZGVmaW5lICAgIE1TRl9DT01QT05FTlRfTUlOT1JfVkVSICAgICAgICAwCisKKy8vICNkZWZpbmUgSENGX0FTU0VSVAlIQ0ZfQVNTRVJUX01CCS8vIGxvZ2dpbmcgdmlhIE1haWxib3gKKworI2lmIGRlZmluZWQgUEM0ODZCU1AKKworI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkgICAgICAgICAgICAoc3lzSW5Xb3JkICgoaGNmX2lvKShwb3J0KSkpCisjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpICAgICAgICAoc3lzT3V0V29yZCAoKGhjZl9pbykocG9ydCksIChoY2ZfMTYpICh2YWx1ZSkpKQorI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNihwb3J0LCBhZGRyLCBuKSAgICAgICAgKHN5c0luV29yZFN0cmluZyAoKGhjZl9pbykocG9ydCksIGFkZHIsIG4pKQorI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYocG9ydCwgYWRkciwgbikgICAgICAgIChzeXNPdXRXb3JkU3RyaW5nICgoaGNmX2lvKShwb3J0KSwgYWRkciwgbikpCisKKyNlbGlmIGRlZmluZWQgQVMyMDAwQlNQCisKKyNkZWZpbmUgSENGX0lPIAkJCQkJCUhDRl9JT19NRU0JCS8vIG92ZXJydWxlIHN0YW5kYXJkIFBvcnQgSS9PIHdpdGggTWVtb3J5IG1hcHBlZCBJL08KKworLyogRGVmaW5lIFBDSSBzdHVmZiBoZXJlLiAqLwordW5zaWduZWQgc2hvcnQgc3lzUmVhZDE2KCB1bnNpZ25lZCBzaG9ydCAqcG9ydCApOwordm9pZCBzeXNXcml0ZTE2KCB1bnNpZ25lZCBzaG9ydCAqcG9ydCwgdW5zaWduZWQgc2hvcnQgdmFsdWUgKTsKKworI2RlZmluZSBQQ0lfSU5fQllURSggcG9ydCApIFwKKwkqKHVuc2lnbmVkIGNoYXIgKikoIHBvcnQgKQorCisjZGVmaW5lIFBDSV9JTl9XT1JEKCBwb3J0ICkgXAorCXN5c1JlYWQxNiggKHVuc2lnbmVkIHNob3J0ICopKCBwb3J0ICkgKQorCisjZGVmaW5lIFBDSV9PVVRfQllURSggcG9ydCwgdmFsdWUgKSBcCisJKih1bnNpZ25lZCBjaGFyICopKCBwb3J0ICkgPSAodW5zaWduZWQgY2hhcikoIHZhbHVlICkKKworI2RlZmluZSBQQ0lfT1VUX1dPUkQoIHBvcnQsIHZhbHVlICkgXAorCXN5c1dyaXRlMTYoICh1bnNpZ25lZCBzaG9ydCAqKSggcG9ydCApLCAodW5zaWduZWQgc2hvcnQpKCB2YWx1ZSApICkKKworI2RlZmluZSBJTl9QT1JUX1dPUkQoIHBvcnQgKSBcCisJUENJX0lOX1dPUkQoIHBvcnQgKQorCisjZGVmaW5lIE9VVF9QT1JUX1dPUkQoIHBvcnQsIHZhbHVlICkgXAorCVBDSV9PVVRfV09SRCggcG9ydCwgdmFsdWUgKQorCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBidWYsIGxlbiApIFwKKwlkbyB7IFwKKwkJaGNmXzE2ICpwOyBcCisJIFwKKwkgCWZvciAoIHAgPSAoaGNmXzE2ICopKGJ1Zik7IHAgPCAmKCAoaGNmXzE2ICopKGJ1ZikgKVsgKGludClsZW4gXTsgcCsrICkgeyBcCisJCQkqcCA9IFBDSV9JTl9XT1JEKCBwb3J0ICk7IFwKKwkJfSBcCisJfSB3aGlsZSAoIDAgKQorCisjZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNiggcG9ydCwgYnVmLCBsZW4gKSBcCisJZG8geyBcCisJCWNvbnN0IGhjZl8xNiAqcDsgXAorCSBcCisJIAlmb3IgKCBwID0gKGNvbnN0IGhjZl8xNiAqKSggYnVmICk7IHAgPCAmKCAoY29uc3QgaGNmXzE2ICopKGJ1ZikgKVsgKGludClsZW4gXTsgcCsrICkgeyBcCisJCQlQQ0lfT1VUX1dPUkQoIHBvcnQsICpwICk7IFwKKwkJfSBcCisJfSB3aGlsZSAoIDAgKQorCisjZWxpZiBkZWZpbmVkIEZBRFM4NjBCU1AgLyogZWxpZiBkZWZpbmVkIEFTMjAwMEJTUCAqLworCisjZGVmaW5lIEhDRl9CSUdfRU5ESUFOIDEKKworI2RlZmluZSBIQ0ZfSU8gCQkJCQkJSENGX0lPX01FTQkJLy8gb3ZlcnJ1bGUgc3RhbmRhcmQgUG9ydCBJL08gd2l0aCBNZW1vcnkgbWFwcGVkIEkvTworCisjaWZuZGVmIF9fR05VQ19fCisgICAgI2RlZmluZSBfX2FzbV9fICAgICBhc20KKyNlbmRpZgorCisjaWYgISBkZWZpbmVkIF9saW50CisgICAgI2RlZmluZSBFSUVJTygpICAgICBfX2FzbV9fKCIgZWllaW8iKQorI2Vsc2UKKyAgICAjZGVmaW5lIEVJRUlPKCkKKyNlbmRpZgorCitzdGF0aWMgaGNmXzE2IElOX1BPUlRfV09SRChpbnQgcG9ydCkgeworICAgIGhjZl8xNiB2YWx1ZSA9ICoodm9sYXRpbGUgaGNmXzE2ICopKHBvcnQpOyBFSUVJTygpOworICAgIHZhbHVlID0gKCh2YWx1ZSAmIDB4ZmYwMCkgPj4gOCkgKyAoKHZhbHVlICYgMHgwMGZmKSA8PCA4KTsKKy8qICB2YWx1ZSA9IENOVl9MSVRUTEVfVE9fU0hPUlQodmFsdWUpOyAqLworICAgIHJldHVybiB2YWx1ZTsKKyAgICAjaWZkZWYgX19HTlVDX18KKyAgICAgICAgLyogdGhlIGZvbGxvd2luZyBzZXJ2ZXMgdG8gYXZvaWQgdGhlIGNvbXBpbGVyIHdhcm5pbmdzIHRoYXQKKyAgICAgICAgICogSU5fUE9SVF9XT1JEKCkgaXMgbm90IHVzZWQgaW4gc29tZSBmaWxlcyAqLworICAgICAgICAodm9pZClJTl9QT1JUX1dPUkQ7CisgICAgI2VuZGlmCit9CisKKyNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAqKHZvbGF0aWxlIGhjZl8xNiAqKShwb3J0KSA9IENOVl9TSE9SVF9UT19MSVRUTEUodmFsdWUpOyBFSUVJTygpOyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbGVuKSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbCA9IChsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGUgaGNmXzE2ICpkID0gKHZvbGF0aWxlIGhjZl8xNiAqKShhZGRyKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGwtLSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkKysgPSAqKHZvbGF0aWxlIGhjZl8xNiAqKShwb3J0KTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVJRUlPKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisjZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbGVuKSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbCA9IChsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGUgaGNmXzE2ICpzID0gKHZvbGF0aWxlIGhjZl8xNiAqKShhZGRyKTsgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsLS0pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHZvbGF0aWxlIGhjZl8xNiAqKShwb3J0KSA9ICpzKys7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFSUVJTygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworI2VsaWYgZGVmaW5lZCBEQVlUT05BQlNQCisKKyNkZWZpbmUgSENGX0JJR19FTkRJQU4gMQorCisjZGVmaW5lIEhDRl9JTyAJCQkJCQlIQ0ZfSU9fTUVNCQkvLyBvdmVycnVsZSBzdGFuZGFyZCBQb3J0IEkvTyB3aXRoIE1lbW9yeSBtYXBwZWQgSS9PCisKKyNpZm5kZWYgX19HTlVDX18KKyAgICAjZGVmaW5lIF9fYXNtX18gICAgIGFzbQorI2VuZGlmCisKKyNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpICAgICAgICAgICAgICAoc3lzT3Jpbm9jb0luV29yZCgodW5zaWduZWQgbG9uZykocG9ydCkpKQorI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsdmFsdWUpICAgICAgIChzeXNPcmlub2NvT3V0V29yZCgodW5zaWduZWQgbG9uZykocG9ydCksICh1bnNpZ25lZCBzaG9ydCkodmFsdWUpKSkKKworI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNihwb3J0LGFkZHIsbGVuKSAgIChzeXNPcmlub2NvSW5TdHJpbmcoKHBvcnQpLCAoYWRkciksIChsZW4pKSkKKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KHBvcnQsYWRkcixsZW4pICAgKHN5c09yaW5vY29PdXRTdHJpbmcoKHBvcnQpLCAoYWRkciksIChsZW4pKSkKKworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgICAgc3lzT3Jpbm9jb0luQnl0ZSAgICAodW5zaWduZWQgbG9uZyBwb3J0KTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCAgIHN5c09yaW5vY29JbldvcmQgICAgKHVuc2lnbmVkIGxvbmcgcG9ydCk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICBzeXNPcmlub2NvSW5TdHJpbmcgICh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIHNob3J0IGxlbik7CisKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHN5c09yaW5vY29PdXRCeXRlICAgKHVuc2lnbmVkIGxvbmcgcG9ydCwgdW5zaWduZWQgY2hhciB2YWx1ZSk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICBzeXNPcmlub2NvT3V0V29yZCAgICh1bnNpZ25lZCBsb25nIHBvcnQsIHVuc2lnbmVkIHNob3J0IHZhbHVlKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHN5c09yaW5vY29PdXRTdHJpbmcgKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuKTsKKworI2VsaWYgZGVmaW5lZCBBTFBIQV9CU1AKKworI2RlZmluZSBIQ0ZfQklHX0VORElBTiAxCisKKyNkZWZpbmUgSENGX0lPIAkJCQkJCUhDRl9JT19NRU0JCS8vIG92ZXJydWxlIHN0YW5kYXJkIFBvcnQgSS9PIHdpdGggTWVtb3J5IG1hcHBlZCBJL08KKworI2lmbmRlZiBfX0dOVUNfXworICAgICNkZWZpbmUgX19hc21fXyAgICAgYXNtCisjZW5kaWYKKworI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkgICAgICAgICAgICAgIChzeXNPcmlub2NvSW5Xb3JkKCh1bnNpZ25lZCBsb25nKShwb3J0KSkpCisjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCx2YWx1ZSkgICAgICAgKHN5c09yaW5vY29PdXRXb3JkKCh1bnNpZ25lZCBsb25nKShwb3J0KSwgKHVuc2lnbmVkIHNob3J0KSh2YWx1ZSkpKQorCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KHBvcnQsYWRkcixsZW4pICAgKHN5c09yaW5vY29JblN0cmluZygocG9ydCksIChhZGRyKSwgKGxlbikpKQorI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYocG9ydCxhZGRyLGxlbikgICAoc3lzT3Jpbm9jb091dFN0cmluZygocG9ydCksIChhZGRyKSwgKGxlbikpKQorCitleHRlcm4gdW5zaWduZWQgY2hhciAgICBzeXNPcmlub2NvSW5CeXRlICAgICh1bnNpZ25lZCBsb25nIHBvcnQpOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0ICAgc3lzT3Jpbm9jb0luV29yZCAgICAodW5zaWduZWQgbG9uZyBwb3J0KTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHN5c09yaW5vY29JblN0cmluZyAgKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuKTsKKworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgc3lzT3Jpbm9jb091dEJ5dGUgICAodW5zaWduZWQgbG9uZyBwb3J0LCB1bnNpZ25lZCBjaGFyIHZhbHVlKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHN5c09yaW5vY29PdXRXb3JkICAgKHVuc2lnbmVkIGxvbmcgcG9ydCwgdW5zaWduZWQgc2hvcnQgdmFsdWUpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgc3lzT3Jpbm9jb091dFN0cmluZyAodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBzaG9ydCBsZW4pOworCisjZWxzZQorCitlcnI6IC8qIGNvbW1lbnRlZCBoZXJlICovIC8qCSJCU1AgaXMgbm90IGRlZmluZWQuLi4iICovCisKKyNlbmRpZgkvKiBlbHNlIFBDNDg2QlNQICovCisKKyNlbmRpZgkvLyBfX1ZYX1dPUktTX18KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBWWFdPUktTLiBNb3Rvcm9sYSBTYW5kcG9pbnQgUG93ZXJQQyA4MjRYICoqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX1ZYX1dPUktTX1NBTkRQT0lOVF84MjRYX18KKworI2luY2x1ZGUgPHZ4V29ya3MuaD4KKyNpbmNsdWRlIDxzeXNMaWIuaD4KKyNpbmNsdWRlIDx0YXNrTGliLmg+CisKKyNpZmRlZiBXVkxBTl81MworI2RlZmluZQlNU0ZfQ09NUE9ORU5UX0lEICAgICAgICAgICAgQ09NUF9JRF9WWF9XT1JLU19FTkRTVEEKKyNlbmRpZiAvKiBXVkxBTl81MyAqLworCisjaWZkZWYgV1ZMQU5fNTQKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRCAgICAgICAgICAgIENPTVBfSURfVlhfV09SS1NfRU5EQVAKKyNlbmRpZiAvKiBXVkxBTl81NCAqLworCisjaWZkZWYgV1ZMQU5fNTYKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRCAgICAgICAgICAgIENPTVBfSURfVlhfV09SS1NfRU5ECisjZW5kaWYgLyogV1ZMQU5fNTYgKi8KKworI2lmICFkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQKKyNlcnJvciAieW91IG11c3QgZGVmaW5lIGFuIE1TRiBjb21wb25lbnQgSUQ6IFdWTEFOXzUzLCBXVkxBTl81NCwgV1ZMQU5fNTYiCisjZW5kaWYKKworI2RlZmluZQlNU0ZfQ09NUE9ORU5UX1ZBUgkJCTEKKworI2RlZmluZSBIQ0ZfRVhUICAgICAgICAgICAgICAgICAgICAgICAgIEhDRl9FWFRfSU5GT19MT0cKKyNkZWZpbmUgSENGX1NMRUVQICAgICAgICAgICAgICAgICAgICAgICAoIEhDRl9DRFMgfCBIQ0ZfRERTICkKKy8vI2RlZmluZSBIQ0ZfU0xFRVAgICAgICAgICAgICAgICAgICAgICAgICggSENGX0REUyApCisKKyNpZm5kZWYgSENGX0FDVF9XQUtFVVAKKyNkZWZpbmUgSENGX0FDVF9XQUtFVVAgICAgICAgICAgICAgICAgICAweDFECisjZW5kaWYgLy8gSENGX0FDVF9XQUtFVVAKKworI2lmIGRlZmluZWQgRkFUTklDIHwgZGVmaW5lZCBCRUFHTEVfSDI1MworI2RlZmluZSBUMV9fSENGX1RZUEUgICAgICAgICAgICAgICAgICAgIEhDRl9UWVBFX1NUQQorI2Vsc2UKKyNkZWZpbmUgVDFfX0hDRl9UWVBFICAgICAgICAgICAgICAgICAgICBIQ0ZfVFlQRV9BUCB8IEhDRl9UWVBFX1NUQQorI2VuZGlmCisKKyNpZmRlZiBIRVJNRVNfVVNCCisjZGVmaW5lIFQyX19IQ0ZfVFlQRQkJCQkJKFQxX19IQ0ZfVFlQRSB8IEhDRl9UWVBFX1VTQikKKyNlbHNlIC8vIEhFUk1FU19VU0IKKyNkZWZpbmUgVDJfX0hDRl9UWVBFCQkJCQkoVDFfX0hDRl9UWVBFKQorI2VuZGlmIC8vIEhFUk1FU19VU0IKKworI2lmZGVmIF9XQVJQCisjZGVmaW5lIFQzX19IQ0ZfVFlQRQkJCQkJKFQyX19IQ0ZfVFlQRSB8IEhDRl9UWVBFX0hJSTUpCisjZWxzZSAvLyBfV0FSUAorI2RlZmluZSBUM19fSENGX1RZUEUJCQkJCShUMl9fSENGX1RZUEUgfCBIQ0ZfVFlQRV9XUEEgfCBIQ0ZfVFlQRV9ISUkpCisjZW5kaWYgLy8gV0FSUAorCisjaWZkZWYgX0NDWAorI2RlZmluZSBUNF9fSENGX1RZUEUJCQkJCShUM19fSENGX1RZUEUgfCBIQ0ZfVFlQRV9DQ1gpCisjZWxzZSAvLyBfV0FSUAorI2RlZmluZSBUNF9fSENGX1RZUEUJCQkJCShUM19fSENGX1RZUEUpCisjZW5kaWYgLy8gX0NDWAorCisjZGVmaW5lIFQ1X19IQ0ZfVFlQRQkJCQkJKFQ0X19IQ0ZfVFlQRSkKKworLy8gRGVmYXVsdCB0byBUWVBFX0FQICsgU1NOIQorI2RlZmluZSBIQ0ZfVFlQRQkJCQkJCShUNV9fSENGX1RZUEUgKQorCisKKworI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUgkJMgorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUgkJMAorCisjZGVmaW5lIEhDRl9JTyAgICAgICAgICAgICAgICAgICAgICBIQ0ZfSU9fTUVNCisjZGVmaW5lIEhDRl9ETUEgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEhDRl9NRU1fSU8gICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEhDRl9CSUdfRU5ESUFOICAgICAgICAgICAgICAxCisKKy8vI2RlZmluZSBzdXBwb3J0XzMyYml0cyAxCisKKyNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpCQkJICAgICAgICAoc3lzSW5Xb3JkKCAoaGNmX2lvKShwb3J0KSApKQorI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQkgICAgICAgIChzeXNPdXRXb3JkKCAoaGNmX2lvKShwb3J0KSwgKGhjZl8xNikodmFsdWUpICkpCisjZGVmaW5lIElOX1BPUlRfRFdPUkQocG9ydCkJCQkgICAgICAgIChzeXNJbkxvbmcoIChoY2ZfaW8pKHBvcnQpICkpCisjZGVmaW5lIE9VVF9QT1JUX0RXT1JEKHBvcnQsIHZhbHVlKQkgICAgICAgIChzeXNPdXRMb25nKCAoaGNmX2lvKShwb3J0KSwgKGhjZl8xNikodmFsdWUpICkpCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KHBvcnQsIGRzdCwgbikJICAgIChzeXNJbldvcmRTdHJpbmcoKGhjZl9pbykocG9ydCksIChoY2ZfMTYgKilkc3QsIG4pKQorI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYocG9ydCwgc3JjLCBuKSAgICAoc3lzT3V0V29yZFN0cmluZygoaGNmX2lvKShwb3J0KSwgKGhjZl8xNiAqKXNyYywgbikpCisKKyNpZmRlZiBXVkxBTl9ERUJVRworI2RlZmluZSBEQkcgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBfREVCVUcgICAgICAgICAgICAgICAgICAgICAgMQorI2VuZGlmCisKKy8qIHdlJ2xsIG5lZWQgdG8gYWRkIHRoZXNlIHByaW50cyBzb21lZGF5ICovCisjZGVmaW5lIE9VVFBVVERFQlVHTVNHKGRwcmludGZfZXhwKQorI2RlZmluZSBBU1NFUlRERUJVR01TRyhjb25kLCBkcHJpbnRmX2V4cCkKKworI2RlZmluZSBIQ0ZfSU5URVJGQUNFX0NPTk5FQ1QoaWZicCkKKyNkZWZpbmUgSENGX0lOVEVSRkFDRV9ESVNDT05ORUNUKGlmYnApCisjZGVmaW5lIEhDRl9FTlRFUl9JTlRFUkZBQ0VfRlVOQ1QoaWJmYikKKyNkZWZpbmUgSENGX0xFQVZFX0lOVEVSRkFDRV9GVU5DVChpZmJwKQorCisjZGVmaW5lIENOVl9FTkRfSU5UKHcpICAgICggKChoY2ZfMTYpKHcpICYgMHgwMEZGKSA8PCA4IHwgKChoY2ZfMTYpKHcpICYgMHhGRjAwKSA+PiA4ICkKKyNkZWZpbmUgQ05WX0xJVFRMRV9UT19JTlQodykJQ05WX0VORF9JTlQodykKKyNkZWZpbmUgQ05WX0lOVF9UT19MSVRUTEUodykJQ05WX0xJVFRMRV9UT19JTlQodykKKworI2VuZGlmIC8qIF9fVlhfV09SS1NfU0FORFBPSU5UXzgyNFhfXyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFZYV09SS1MuIEFSTSBUODMwMCBJUFBob25lICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZCggSVBUX1Q4MzAwICkgfHwgZGVmaW5lZCggSVBUX1Q4MzA3ICkKKworI2luY2x1ZGUgPHZ4V29ya3MuaD4KKyNpbmNsdWRlIDxzeXNMaWIuaD4KKyNpbmNsdWRlIDx0YXNrTGliLmg+CisKKyNkZWZpbmUgSENGX0FMSUdOICAgICAgICAgICAgICAgICAgIDQgICAgICAgLyogZGVmYXVsdCB0byA0IGJ5dGUgYWxpZ25tZW50ICovCisKKyNkZWZpbmUgQkVBR0xFX0gyNTMJLyogSGVybWVzIDIuNS4zIGJ1aWxkLCBiZXR0ZXIgdG8gYmUgaW4gdGhlIHByb2plY3QgZmlsZSAqLworI2RlZmluZSBPT1JfRERTCQkvKiBIZXJtZXMgMi41LjMgYnVpbGQsIGJldHRlciB0byBiZSBpbiB0aGUgcHJvamVjdCBmaWxlICovCisjZGVmaW5lIEZBVE5JQworCisKKyNpZmRlZiBXVkxBTl81MworI2RlZmluZQlNU0ZfQ09NUE9ORU5UX0lEICAgICAgICAgICAgQ09NUF9JRF9WWF9XT1JLU19FTkRTVEEKKyNlbmRpZiAvKiBXVkxBTl81MyAqLworCisjaWZkZWYgV1ZMQU5fNTQKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRCAgICAgICAgICAgIENPTVBfSURfVlhfV09SS1NfRU5EQVAKKyNlbmRpZiAvKiBXVkxBTl81NCAqLworCisjaWZkZWYgV1ZMQU5fNTYKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRCAgICAgICAgICAgIENPTVBfSURfVlhfV09SS1NfRU5ECisjZW5kaWYgLyogV1ZMQU5fNTYgKi8KKworI2lmICFkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQKKyNlcnJvciAieW91IG11c3QgZGVmaW5lIGFuIE1TRiBjb21wb25lbnQgSUQ6IFdWTEFOXzUzLCBXVkxBTl81NCwgV1ZMQU5fNTYiCisjZW5kaWYKKworI2RlZmluZQlNU0ZfQ09NUE9ORU5UX1ZBUgkJCTEKKworI2RlZmluZSBIQ0ZfRVhUICAgICAgICAgICAgICAgICAgICAgICAgIEhDRl9FWFRfSU5GT19MT0cKKy8vI2RlZmluZSBIQ0ZfRVhUICAgICAgICAgICAgICAgICAgICAgICAgIEhDRl9FWFRfSU5GT19MT0cgfCBIQ0ZfRVhUX01CCisjZGVmaW5lIEhDRl9TTEVFUCAgICAgICAgICAgICAgICAgICAgICAgKCBIQ0ZfQ0RTIHwgSENGX0REUyApCisvLyNkZWZpbmUgSENGX1NMRUVQICAgICAgICAgICAgICAgICAgICAgICAoIEhDRl9ERFMgKQorCisjaWZuZGVmIEhDRl9BQ1RfV0FLRVVQCisjZGVmaW5lIEhDRl9BQ1RfV0FLRVVQICAgICAgICAgICAgICAgICAgMHgxRAorI2VuZGlmIC8vIEhDRl9BQ1RfV0FLRVVQCisKKyNpZiBkZWZpbmVkIEZBVE5JQyB8fCBkZWZpbmVkIEJFQUdMRV9IMjUzCisjZGVmaW5lIFQxX19IQ0ZfVFlQRSAgICAgICAgICAgICAgICAgICAgSENGX1RZUEVfU1RBCisjZWxzZQorLy8jZGVmaW5lIFQxX19IQ0ZfVFlQRSAgICAgICAgICAgICAgICAgICAgSENGX1RZUEVfQVAgfCBIQ0ZfVFlQRV9TVEEKKyNkZWZpbmUgVDFfX0hDRl9UWVBFICAgICAgICAgICAgICAgICAgICBIQ0ZfVFlQRV9TVEEJCS8qIGR6LCBTdGF0aW9uIGNvZGUgb25seSAqLworI2VuZGlmCisKKyNpZmRlZiBIRVJNRVNfVVNCCisjZGVmaW5lIFQyX19IQ0ZfVFlQRQkJCQkJKFQxX19IQ0ZfVFlQRSB8IEhDRl9UWVBFX1VTQikKKyNlbHNlIC8vIEhFUk1FU19VU0IKKyNkZWZpbmUgVDJfX0hDRl9UWVBFCQkJCQkoVDFfX0hDRl9UWVBFKQorI2VuZGlmIC8vIEhFUk1FU19VU0IKKworI2lmZGVmIF9XQVJQCisjZGVmaW5lIFQzX19IQ0ZfVFlQRQkJCQkJKFQyX19IQ0ZfVFlQRSB8IEhDRl9UWVBFX0hJSTUpCisjZWxzZSAvLyBfV0FSUAorI2RlZmluZSBUM19fSENGX1RZUEUJCQkJCShUMl9fSENGX1RZUEUgfCBIQ0ZfVFlQRV9XUEEgfCBIQ0ZfVFlQRV9ISUkpCisvLyNkZWZpbmUgVDNfX0hDRl9UWVBFCQkJCQkoVDJfX0hDRl9UWVBFIHwgSENGX1RZUEVfSElJKQkvKiBkei4gbm8gV1BBIHN1cHBvcnQgYXQgdGhpcyB0aW1lLCB0ZXN0IGNvZGUgKi8KKyNlbmRpZiAvLyBXQVJQCisKKyNpZmRlZiBfQ0NYCisjZGVmaW5lIFQ0X19IQ0ZfVFlQRQkJCQkJKFQzX19IQ0ZfVFlQRSB8IEhDRl9UWVBFX0NDWCkKKyNlbHNlIC8vIF9XQVJQCisjZGVmaW5lIFQ0X19IQ0ZfVFlQRQkJCQkJKFQzX19IQ0ZfVFlQRSkKKyNlbmRpZiAvLyBfQ0NYCisKKyNkZWZpbmUgVDVfX0hDRl9UWVBFCQkJCQkoVDRfX0hDRl9UWVBFKQorCisvLyBEZWZhdWx0IHRvIFRZUEVfQVAgKyBTU04hCisjZGVmaW5lIEhDRl9UWVBFCQkJCQkJKFQ1X19IQ0ZfVFlQRSApCisKKworI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUgkJMgorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUgkJMAorCisjZGVmaW5lIEhDRl9JTyAgICAgICAgICAgICAgICAgICAgICBIQ0ZfSU9fTUVNCisjZGVmaW5lIEhDRl9ETUEgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEhDRl9NRU1fSU8gICAgICAgICAgICAgICAgICAxCisKKworLyogRW5kaWFuIGlzIGRldGVybWluZWQgYnkgdnhXb3JrcyBwcm9qZWN0IGNvbXBpbGUgb3B0aW9uICovCisjaWYgKF9CWVRFX09SREVSID09IF9CSUdfRU5ESUFOKQorI3VuZGVmICBIQ0ZfTElUVExFX0VORElBTgorI2RlZmluZSBIQ0ZfQklHX0VORElBTiAgICAgICAgICAgICAgMQorI2VuZGlmCisKKworI2RlZmluZSBDTlZfRU5EKHcpICAgICggKChoY2ZfMTYpKHcpICYgMHgwMEZGKSA8PCA4IHwgKChoY2ZfMTYpKHcpICYgMHhGRjAwKSA+PiA4ICkKKyNpZiBkZWZpbmVkIEhDRl9CSUdfRU5ESUFOCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEIgSSBHICAgRSBOIEQgSSBBIE4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBDTlZfTElUVExFX1RPX0lOVCh3KSAgICBDTlZfRU5EKHcpCS8vICAgIGVuZGlhbmVzcyBjb252ZXJzaW9uIG5lZWRlZAorI2RlZmluZSBDTlZfQklHX1RPX0lOVCh3KQkJKHcpCQkJLy8gbm8gZW5kaWFuZXNzIGNvbnZlcnNpb24gbmVlZGVkCisjZWxzZQorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTCBJIFQgVCBMIEUgICBFIE4gRCBJIEEgTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIENOVl9MSVRUTEVfVE9fSU5UKHcpIAkodykJCQkvLyBubyBlbmRpYW5lc3MgY29udmVyc2lvbiBuZWVkZWQKKyNkZWZpbmUgQ05WX0JJR19UT19JTlQodykgICAgICAgQ05WX0VORCh3KQkvLyAgICBlbmRpYW5lc3MgY29udmVyc2lvbiBuZWVkZWQKKyNlbmRpZiAvLyBIQ0ZfQklHX0VORElBTgorCisvLyBjb252ZXJzaW9uIG1hY3JvcyB3aGljaCBjYW4gYmUgZXhwcmVzc2VkIGluIG90aGVyIG1hY3JvcworI2RlZmluZSBDTlZfSU5UX1RPX0xJVFRMRSh3KQlDTlZfTElUVExFX1RPX0lOVCh3KQorI2RlZmluZSBDTlZfSU5UX1RPX0JJRyh3KQkJQ05WX0JJR19UT19JTlQodykKKworCisKKyNkZWZpbmUgSU5fUE9SVF9XT1JEKCBwb3J0ICkgICAgICAgICAgICAqKCh2b2xhdGlsZSBoY2ZfMTYgKikoIHBvcnQgKSkKKyNkZWZpbmUgT1VUX1BPUlRfV09SRCggcG9ydCwgdmFsdWUgKSAgICAqKCh2b2xhdGlsZSBoY2ZfMTYgKikoIHBvcnQgKSkgPSAoKGhjZl8xNikoIHZhbHVlICkpCisvLyNkZWZpbmUgSU5fUE9SVF9CWVRFKCBwb3J0ICkgICAgICAgICAgICAqKCh2b2xhdGlsZSBoY2ZfOCAqKSggcG9ydCApKQorCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HKCBwb3J0LCBhZGRyLCBsZW4pIHsJCVwKKwl1bnNpZ25lZCBsID0gbGVuOwkJCQkJCQkJXAorCWhjZl8xNiAgKmQgPSAoaGNmXzE2ICopKGFkZHIpOwkJCQkJXAorCWhjZl8xNiAgIHQ7CQkJCQkJCQkJCVwKKwl3aGlsZSAobC0tKSB7CQkJCQkJCQkJXAorCQl0ID0gSU5fUE9SVF9XT1JEKHBvcnQpOwkJCQkJCVwKKwkJKmQrKyA9IENOVl9MSVRUTEVfVE9fSU5UKHQpOwkJCQlcCisJfQkJCQkJCQkJCQkJCVwKK30gLy8gSU5fUE9SVF9TVFJJTkcKKworI2RlZmluZSBPVVRfUE9SVF9TVFJJTkcoIHBvcnQsIGFkZHIsIGxlbikgewkJXAorCXVuc2lnbmVkIGwgPSAobGVuKTsJCQkJCQkJCVwKKwloY2ZfMTYgICpzID0gKGhjZl8xNiAqKShhZGRyKTsJCQkJCVwKKwloY2ZfMTYgICB0OwkJCQkJCQkJCQlcCisJd2hpbGUgKGwtLSkgewkJCQkJCQkJCVwKKwkJdCA9ICpzKys7CQkJCQkJCQkJXAorCQl0ID0gQ05WX0xJVFRMRV9UT19JTlQodCk7CQkJCQlcCisJCU9VVF9QT1JUX1dPUkQocG9ydCwgdCk7CQkJCQkJXAorCX0JCQkJCQkJCQkJCQlcCit9IC8vIE9VVF9QT1JUX1NUUklORworCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KHBvcnQsIGRzdCwgbikJICAgIHsJXAorCXVuc2lnbmVkIGwgPSAobik7CQkJCQkJCQlcCisJaGNmXzE2ICAqZCA9IChoY2ZfMTYgKikoZHN0KTsJCQkJCVwKKwl3aGlsZSAobC0tKSB7CQkJCQkJCQkJXAorCQkqZCsrID0gSU5fUE9SVF9XT1JEKHBvcnQpOwkJCQkJXAorCX0JCQkJCQkJCQkJCQlcCit9IC8vIElOX1BPUlRfU1RSSU5HXzE2CisKKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KHBvcnQsIHNyYywgbikJewlcCisJaGNmXzE2ICAgdDsJCQkJCQkJCQkJXAorCWludCBsID0gKG4pOwkJCQkJCQkJCVwKKwloY2ZfMTYgICpzID0gKGhjZl8xNiAqKShzcmMpOwkJCQkJXAorCXdoaWxlIChsLS0pIHsJCQkJCQkJCQlcCisJCXQgPSAqcysrOwkJCQkJCQkJCVwKKwkJT1VUX1BPUlRfV09SRChwb3J0LCB0KTsJCQkJCQlcCisJfQkJCQkJCQkJCQkJCVwKK30gLy8gT1VUX1BPUlRfU1RSSU5HXzE2CisKKy8qICNkZWZpbmUgSENGX1lJRUxEICAgICAgICAgICAgICAgICAgICAgICAodGFza0RlbGF5KDApID09IDApICovCisKKworCisjaWZkZWYgV1ZMQU5fREVCVUcKKyNkZWZpbmUgREJHICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgX0RFQlVHICAgICAgICAgICAgICAgICAgICAgIDEKKyNlbmRpZgorCisvKiB3ZSdsbCBuZWVkIHRvIGFkZCB0aGVzZSBwcmludHMgc29tZWRheSAqLworI2RlZmluZSBPVVRQVVRERUJVR01TRyhkcHJpbnRmX2V4cCkKKyNkZWZpbmUgQVNTRVJUREVCVUdNU0coY29uZCwgZHByaW50Zl9leHApCisKKyNkZWZpbmUgSENGX0lOVEVSRkFDRV9DT05ORUNUKGlmYnApCisjZGVmaW5lIEhDRl9JTlRFUkZBQ0VfRElTQ09OTkVDVChpZmJwKQorI2RlZmluZSBIQ0ZfRU5URVJfSU5URVJGQUNFX0ZVTkNUKGliZmIpCisjZGVmaW5lIEhDRl9MRUFWRV9JTlRFUkZBQ0VfRlVOQ1QoaWZicCkKKworI2RlZmluZSBzeXNJbldvcmQob2Zmc2V0QWRkcikgIElOX1BPUlRfV09SRChvZmZzZXRBZGRyKQorI2RlZmluZSBzeXNJbkJ5dGUob2Zmc2V0QWRkcikgIElOX1BPUlRfQllURShvZmZzZXRBZGRyKQorI2RlZmluZSBzeXNPdXRXb3JkKGFkZHIsIHZhbHVlKSBPVVRfUE9SVF9XT1JEKGFkZHIsIHZhbHVlKQorCisjZW5kaWYgLypJUFRfVDgzMDAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICEgZGVmaW5lZCAJSENGX0FMSUdOCisjZGVmaW5lIAkJSENGX0FMSUdOCQkJMQkJLy9kZWZhdWx0IHRvIG5vIGFsaWdubWVudAorI2VuZGlmIC8vIAkJSENGX0FMSUdOCisKKyNpZiAhIGRlZmluZWQgCUhDRl9BU1NFUlQKKyNkZWZpbmUgCQlIQ0ZfQVNTRVJUCQkJMAorI2VuZGlmIC8vCQlIQ0ZfQVNTRVJUCisKKyNpZiAhIGRlZmluZWQJSENGX0JJR19FTkRJQU4KKyNkZWZpbmUgCQlIQ0ZfQklHX0VORElBTgkJMAorI2VuZGlmIC8vIAkJSENGX0JJR19FTkRJQU4KKworI2lmICEgZGVmaW5lZAlIQ0ZfRExfT05MWQorI2RlZmluZSAJCUhDRl9ETF9PTkxZCQkJMAorI2VuZGlmIC8vIAkJSENGX0RMX09OTFkKKworI2lmICEgZGVmaW5lZAlIQ0ZfRE1BCisjZGVmaW5lIAkJSENGX0RNQQkJCQkwCisjZW5kaWYgLy8gCQlIQ0ZfRE1BCisKKyNpZiAhIGRlZmluZWQJSENGX0VOQ0FQCisjZGVmaW5lCQkJSENGX0VOQ0FQCQkJSENGX0VOQworI2VuZGlmIC8vCQlIQ0ZfRU5DQVAKKworI2lmICEgZGVmaW5lZAlIQ0ZfRU5UUlkKKyNkZWZpbmUJCQlIQ0ZfRU5UUlkoIGlmYnAgKQorI2VuZGlmIC8vCQlIQ0ZfRU5UUlkKKworI2lmICEgZGVmaW5lZAlIQ0ZfRVhJVAorI2RlZmluZQkJCUhDRl9FWElUKCBpZmJwICkKKyNlbmRpZiAvLwkJSENGX0VYSVQKKworI2lmICEgZGVmaW5lZAlIQ0ZfRVhUCisjZGVmaW5lCQkJSENGX0VYVAkJCQkwCisjZW5kaWYgLy8JCUhDRl9FWFQKKworI2lmICEgZGVmaW5lZAlIQ0ZfSU5UX09OCisjZGVmaW5lCQkJSENGX0lOVF9PTgkJCTEKKyNlbmRpZiAvLwkJSENGX0lOVF9PTgorCisjaWYgISBkZWZpbmVkCUhDRl9JTworI2RlZmluZQkJCUhDRl9JTwkJCQkwCQkvL2RlZmF1bHQgMTYgYml0cyBzdXBwb3J0IG9ubHksIHBvcnQgSS9PCisjZW5kaWYgLy8JCUhDRl9JTworCisjaWYgISBkZWZpbmVkCUhDRl9MRUdBQ1kKKyNkZWZpbmUJCQlIQ0ZfTEVHQUNZCQkJMAorI2VuZGlmIC8vCQlIQ0ZfTEVHQUNZCisKKyNpZiAhIGRlZmluZWQJSENGX01BWF9MVFYKKyNkZWZpbmUgCQlIQ0ZfTUFYX0xUVgkJCTEyMDAJLy8gc3VmZmljaWVudCBmb3IgYWxsIGtub3duIHB1cnBvc2VzCisjZW5kaWYgLy8JCUhDRl9NQVhfTFRWCisKKyNpZiAhIGRlZmluZWQJSENGX1BST1RfVElNRQorI2RlZmluZSAJCUhDRl9QUk9UX1RJTUUJCTEwMAkJLy8gbnVtYmVyIG9mIDEwSyBtaWNyb3NlYyBwcm90ZWN0aW9uIHRpbWVyIGFnYWluc3QgSC9XIG1hbGZ1bmN0aW9uCisjZW5kaWYgLy8gCQlIQ0ZfUFJPVF9USU1FCisKKyNpZiAhIGRlZmluZWQJSENGX1NMRUVQCisjZGVmaW5lCQkJSENGX1NMRUVQCQkJMAorI2VuZGlmIC8vCQlIQ0ZfU0xFRVAKKworI2lmICEgZGVmaW5lZAlIQ0ZfVEFMTElFUworI2RlZmluZQkJCUhDRl9UQUxMSUVTCQkJKCBIQ0ZfVEFMTElFU19OSUMgfCBIQ0ZfVEFMTElFU19IQ0YgKQorI2VuZGlmIC8vCQlIQ0ZfVEFMTElFUworCisjaWYgISBkZWZpbmVkIAlIQ0ZfVFlQRQorI2RlZmluZSAJCUhDRl9UWVBFIAkJCTAKKyNlbmRpZiAvLwkJSENGX1RZUEUKKworI2lmCQkJCUhDRl9CSUdfRU5ESUFOCisjdW5kZWYJCQlIQ0ZfQklHX0VORElBTgorI2RlZmluZQkJCUhDRl9CSUdfRU5ESUFOCQkxCQkvL2p1c3QgZm9yIGNvbnZlbmllbmNlIG9mIGdlbmVyYXRpbmcgY2ZnX2hjZl9vcHQKKyNlbmRpZiAvLwkgCUhDRl9CSUdfRU5ESUFOCisKKyNpZgkJCQlIQ0ZfRExfT05MWQorI3VuZGVmCQkJSENGX0RMX09OTFkKKyNkZWZpbmUJCQlIQ0ZfRExfT05MWQkJCTEJCS8vanVzdCBmb3IgY29udmVuaWVuY2Ugb2YgZ2VuZXJhdGluZyBjZmdfaGNmX29wdAorI2VuZGlmIC8vCQlIQ0ZfRExfT05MWQorCisjaWYJCQkJSENGX0RNQQorI3VuZGVmCQkJSENGX0RNQQorI2RlZmluZQkJCUhDRl9ETUEJCQkJMQkJLy9qdXN0IGZvciBjb252ZW5pZW5jZSBvZiBnZW5lcmF0aW5nIGNmZ19oY2Zfb3B0CisjZW5kaWYgLy8JCUhDRl9ETUEKKworI2lmCQkJCUhDRl9JTlRfT04KKyN1bmRlZgkJCUhDRl9JTlRfT04KKyNkZWZpbmUJCQlIQ0ZfSU5UX09OCQkJMQkJLy9qdXN0IGZvciBjb252ZW5pZW5jZSBvZiBnZW5lcmF0aW5nIGNmZ19oY2Zfb3B0CisjZW5kaWYgLy8JCUhDRl9JTlRfT04KKworCisjaWYgISBkZWZpbmVkIElOX1BPUlRfU1RSSU5HXzhfMTYKKyNkZWZpbmUgIElOX1BPUlRfU1RSSU5HXzhfMTYocG9ydCwgYWRkciwgbGVuKQlJTl9QT1JUX1NUUklOR18xNihwb3J0LCBhZGRyLCBsZW4pCisjZGVmaW5lICBPVVRfUE9SVF9TVFJJTkdfOF8xNihwb3J0LCBhZGRyLCBsZW4pCU9VVF9QT1JUX1NUUklOR18xNihwb3J0LCBhZGRyLCBsZW4pCisjZW5kaWYgLy8gSU5fUE9SVF9TVFJJTkdfOF8xNgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhIGRlZmluZWQJRkFSCisjZGVmaW5lIAkJRkFSCQkJCQkJLy8gZGVmYXVsdCB0byBmbGF0IDMyLWJpdHMgY29kZQorI2VuZGlmIC8vIAkJRkFSCisKK3R5cGVkZWYgaGNmXzggIEZBUiAqd2NpX2J1ZnA7CQkJLy8gc2VnbWVudGVkIDE2LWJpdHMgb3IgZmxhdCAzMi1iaXRzIHBvaW50ZXIgdG8gOCBiaXRzIHVuaXQKK3R5cGVkZWYgaGNmXzE2IEZBUiAqd2NpX3JlY29yZHA7CQkvLyBzZWdtZW50ZWQgMTYtYml0cyBvciBmbGF0IDMyLWJpdHMgcG9pbnRlciB0byAxNiBiaXRzIHVuaXQKKworLyoJSS9PIEFkZHJlc3Mgc2l6ZQorKglQbGF0Zm9ybXMgd2hpY2ggdXNlIHBvcnQgbWFwcGVkIEkvTyB3aWxsIChpbiBnZW5lcmFsKSBoYXZlIGEgNjRrIEkvTyBzcGFjZSwgY29udmVuaWVudGx5IGV4cHJlc3NlZCBpbiBhCisqCTE2LWJpdHMgcXVhbnRpdHkKKyoJUGxhdGZvcm1zIHdoaWNoIHVzZSBtZW1vcnkgbWFwcGVkIEkvTyB3aWxsIChpbiBnZW5lcmFsKSBoYXZlIGFuIEkvTyBzcGFjZSBtdWNoIGxhcmdlciB0aGFuIDY0aywgYW5kIG5lZWQgYQorKgkzMi1iaXRzIHF1YW50aXR5IHRvIGV4cHJlc3MgdGhlIEkvTyBiYXNlCisqLworCisjaWYgSENGX0lPICYgSENGX0lPX01FTQordHlwZWRlZiBoY2ZfMzIgaGNmX2lvOworI2Vsc2UKK3R5cGVkZWYgaGNmXzE2IGhjZl9pbzsKKyNlbmRpZiAvL0hDRl9JTworCisjaWYgCUhDRl9QUk9UX1RJTUUgPiAxMjgKKyNkZWZpbmUgSENGX1BST1RfVElNRV9TSEZUCTMKKyNkZWZpbmUgSENGX1BST1RfVElNRV9ESVYJOAorI2VsaWYgCUhDRl9QUk9UX1RJTUUgPiA2NAorI2RlZmluZSBIQ0ZfUFJPVF9USU1FX1NIRlQJMgorI2RlZmluZSBIQ0ZfUFJPVF9USU1FX0RJVgk0CisjZWxpZiAJSENGX1BST1RfVElNRSA+IDMyCisjZGVmaW5lIEhDRl9QUk9UX1RJTUVfU0hGVAkxCisjZGVmaW5lIEhDRl9QUk9UX1RJTUVfRElWCTIKKyNlbHNlIC8vSENGX1BST1RfVElNRSA+PSAxOQorI2RlZmluZSBIQ0ZfUFJPVF9USU1FX1NIRlQJMAorI2RlZmluZSBIQ0ZfUFJPVF9USU1FX0RJVgkxCisjZW5kaWYKKworI2RlZmluZSBIQ0ZfUFJPVF9USU1FX0NOVCAoSENGX1BST1RfVElNRSAvIEhDRl9QUk9UX1RJTUVfRElWKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAuIC4gLiAuIC4gLiAuIC4gLiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTVNGX0NPTVBPTkVOVF9JRCBpcyB1c2VkIHRvIGRlZmluZSB0aGUgQ0ZHX0lERU5USVRZX1NUUkNUIGluIEhDRi5DCisqIENGR19JREVOVElUWV9TVFJDVCBpcyBkZWZpbmVkIGluIEhDRi5DIHB1cmVseSBiYXNlZCBvbiBjb252ZW5pZW5jZSBhcmd1bWVudHMuCisqIFRoZSBIQ0YgY2FuIG5vdCBoYXZlIHRoZSBrbm93bGVkZ2UgdG8gZGV0ZXJtaW5lIHRoZSBDb21wb25lbnRJZCBmaWVsZCBvZiB0aGUgSWRlbnRpdHkgcmVjb3JkIChha2EgYXMKKyogVmVyc2lvbiBSZWNvcmQpLCB0aGVyZWZvcmUgdGhlIE1TRiBwYXJ0IG9mIHRoZSBEcml2ZXJzIG11c3Qgc3VwcGx5IHRoaXMgdmFsdWUgdmlhIHRoZSBTeXN0ZW0gQ29uc3RhbnQKKyogTVNGX0NPTVBPTkVOVF9JRC4KKyogVGhlcmUgaXMgYSBzZXQgb2YgdmFsdWVzIHByZWRlZmluZWQgaW4gTURELkggKGZvcm1hdCBDT01QX0lEXy4uLi4uKQorKgorKiBOb3RlIHRoYXQgdGFraW5nIE1TRl9DT01QT05FTlRfSUQgYXMgYSBkZWZhdWx0IHZhbHVlIGZvciBEVUlfQ09NUEFUX1ZBUiBpcyBwdXJlbHkgYW4gaW1wbGVtZW50YXRpb24KKyogY29udmVuaWVuY2UsIHRoZSBudW1lcmljYWwgdmFsdWVzIG9mIHRoZXNlIHR3byBxdWFudGl0aWVzIGhhdmUgbm9uZSBmdW5jdGlvbmFsIHJlbGF0aW9uc2hpcCB3aGF0c29ldmVyLgorKi8KKworI2lmIGRlZmluZWQJTVNGX0NPTVBPTkVOVF9JRAorCisjaWYgISBkZWZpbmVkCURVSV9DT01QQVRfVkFSCisjZGVmaW5lCQkJRFVJX0NPTVBBVF9WQVIJCU1TRl9DT01QT05FTlRfSUQKKyNlbmRpZiAvLwkJRFVJX0NPTVBBVF9WQVIKKworI2lmICEgZGVmaW5lZAlEVUlfQ09NUEFUX0JPVAkJLy87P3RoaXMgd2F5IHV0aWxpdGllcyBjYW4gbG93ZXIgYXMgd2VsbCByYWlzZSB0aGUgYm90dG9tCisjZGVmaW5lCQkJRFVJX0NPTVBBVF9CT1QJCTgKKyNlbmRpZiAvLwkJRFVJX0NPTVBBVF9CT1QKKworI2lmICEgZGVmaW5lZAlEVUlfQ09NUEFUX1RPUAkJLy87P3RoaXMgd2F5IHV0aWxpdGllcyBjYW4gbG93ZXIgYXMgd2VsbCByYWlzZSB0aGUgdG9wCisjZGVmaW5lCQkJRFVJX0NPTVBBVF9UT1AgICAgICAgOAorI2VuZGlmIC8vCQlEVUlfQ09NUEFUX1RPUAorCisjZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRAorCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0hJSTUKKworI2lmICEgZGVmaW5lZAlIQ0ZfSFNJX1ZBUl81CisjZGVmaW5lCQkJSENGX0hTSV9WQVJfNQorI2VuZGlmIC8vCQlIQ0ZfSFNJX1ZBUl81CisKKyNpZiAhIGRlZmluZWQJSENGX0FQRl9WQVJfNAorI2RlZmluZQkJCUhDRl9BUEZfVkFSXzQKKyNlbmRpZiAvLwkJSENGX0FQRl9WQVJfNAorCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dBUlAKKyNpZiAhIGRlZmluZWQJSENGX1NUQV9WQVJfNAorI2RlZmluZQkJCUhDRl9TVEFfVkFSXzQKKyNlbmRpZiAvLwkJSENGX1NUQV9WQVJfNAorI2Vsc2UKKyNpZiAhIGRlZmluZWQJSENGX1NUQV9WQVJfMgorI2RlZmluZQkJCUhDRl9TVEFfVkFSXzIKKyNlbmRpZiAvLwkJSENGX1NUQV9WQVJfMgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIEhDRl9IU0lfVkFSXzQKK2VycjogSFNJIHZhcmlhbnRzIDQgY29ycmVzcG9uZCB3aXRoIEhJSTsKKyNlbmRpZiAvLyBIQ0ZfSFNJX1ZBUl80CisKKyNlbHNlCisKKyNpZiAhIGRlZmluZWQJSENGX0hTSV9WQVJfNAorI2RlZmluZQkJCUhDRl9IU0lfVkFSXzQJCS8vSGVybWVzLUlJIGFsbCB0eXBlcyAoZm9yIHRoZSB0aW1lIGJlaW5nISkKKyNlbmRpZiAvLwkJSENGX0hTSV9WQVJfNAorCisjaWYgISBkZWZpbmVkCUhDRl9BUEZfVkFSXzIKKyNkZWZpbmUgCQlIQ0ZfQVBGX1ZBUl8yCisjZW5kaWYgLy8JCUhDRl9BUEZfVkFSXzIKKworI2lmICEgZGVmaW5lZAlIQ0ZfU1RBX1ZBUl8yCisjZGVmaW5lCQkJSENGX1NUQV9WQVJfMgorI2VuZGlmIC8vCQlIQ0ZfU1RBX1ZBUl8yCisKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9ISUk1CisKKyNpZiAhIGRlZmluZWQJSENGX1BSSV9WQVJfMworI2RlZmluZQkJSENGX1BSSV9WQVJfMworI2VuZGlmIC8vCQlIQ0ZfUFJJX1ZBUl8zCisKKyNpZiBkZWZpbmVkIEhDRl9IU0lfVkFSXzEgfHwgZGVmaW5lZCBIQ0ZfSFNJX1ZBUl8yIHx8IGRlZmluZWQgSENGX0hTSV9WQVJfMworZXJyOiBIU0kgdmFyaWFudHMgMSwgMiBhbmQgMyBjb3JyZXNwb25kIHdpdGggSC1JIG9ubHk7CisjZW5kaWYgLy8gSENGX0hTSV9WQVJfMSwgSENGX0hTSV9WQVJfMiwgSENGX0hTSV9WQVJfMworCisjaWYgZGVmaW5lZCBIQ0ZfUFJJX1ZBUl8xIHx8IGRlZmluZWQgSENGX1BSSV9WQVJfMgorZXJyOiBwcmltYXJ5IHZhcmlhbnRzIDEgYW5kIDIgY29ycmVzcG9uZCB3aXRoIEgtSSBvbmx5OworI2VuZGlmIC8vIEhDRl9QUklfVkFSXzEgLyBIQ0ZfUFJJX1ZBUl8yCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC4gLiAuIC4gLiAuIC4gLiAuICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qIFRoZSBCQVNFRCBjdXN0b21pemF0aW9uIG1hY3JvIGlzIHVzZWQgdG8gcmVzb2x2ZXMgdGhlIFNTIT1EUyBjb25mbGljdCBmb3IgdGhlIEludGVycnVwdCBTZXJ2aWNlIGxvZ2ljIGluCisgKiBET1MgRHJpdmVycy4gRHVlIHRvIHRoZSBjdW1iZXJzb21lbmVzcyBvZiBtaXhpbmcgQyBhbmQgYXNzZW1ibGVyIGxvY2FsIEJBU0VEIHZhcmlhYmxlcyBzdGlsbCBlbmQgdXAgaW4gdGhlCisgKiB3cm9uZyBzZWdtZW50LiBUaGUgd29ya2Fyb3VuZCBpcyB0aGF0IHRoZSBIQ0YgdXNlcyBvbmx5IGdsb2JhbCBCQVNFRCB2YXJpYWJsZXMgb3IgSUZCLWJhc2VkIHZhcmlhYmxlcy4KKyAqIFRoZSAiQkFTRUQiIGNvbnN0cnVjdGlvbiAoc3VwcG9zZWRseSkgb25seSBhbW91bnRzIHRvIHNvbWV0aGluZyBpbiB0aGUgc21hbGwgbWVtb3J5IG1vZGVsLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgd2hvbGUgQkFTRUQgcmlnbWFyb2xlIGlzIG5lZWRsZXNzbHkgY29tcGxpY2F0ZWQgYmVjYXVzZSBib3RoIHRoZSBNaWNyb3NvZnQgQ29tcGlsZXIgYW5kCisgKiBMaW5rZXIgYXJlIHVubmVjZXNzYXJ5IHJlc3RyaWN0aXZlIGluIHdoYXQgZmFyIHBvaW50ZXIgbWFuaXB1bGF0aW9uIHRoZXkgYWxsb3cKKyAqLworCisjaWYgISBkZWZpbmVkCUJBU0VECisjZGVmaW5lIAkJQkFTRUQKKyNlbmRpZiAvLwkJQkFTRUQKKworI2lmICEgZGVmaW5lZAlFWFRFUk5fQworI2lmZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lCQkJRVhURVJOX0MgZXh0ZXJuICJDIgorI2Vsc2UKKyNkZWZpbmUJCQlFWFRFUk5fQworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisjZW5kaWYgLy8JCUVYVEVSTl9DCisKKyNpZiAhIGRlZmluZWQJTlVMTAorI2RlZmluZQkJCU5VTEwJKCh2b2lkICopIDApCisjZW5kaWYgLy8JCU5VTEwKKworI2lmICEgZGVmaW5lZAlURVhUCisjZGVmaW5lCQkJVEVYVCh4KQl4CisjZW5kaWYgLy8JCVRFWFQKKworI2lmICFkZWZpbmVkCV9UQ0hBUl9ERUZJTkVECisjZGVmaW5lIAkJVENIQVIJY2hhcgorI2VuZGlmIC8vCQlfVENIQVJfREVGSU5FRAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqIEMgTyBOIEYgTCBJIEMgVCAgIEQgRSBUIEUgQyBUIEkgTyBOICAmICBSIEUgUyBPIEwgVSBUIEkgTyBOICoqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZCBIQ0ZfTElUVExFX0VORElBTgorZXJyOiBIQ0ZfTElUVExFX0VORElBTiBpcyBvYnNvbGV0ZTsKKyNlbmRpZiAvLyAJSENGX0xJVFRMRV9FTkRJQU4KKworI2lmIGRlZmluZWQgSENGX0lOVF9PRkYKK2VycjogSENGX0lOVF9PRkYgaXMgb2Jzb2xldGU7CisjZW5kaWYgLy9IQ0ZfSU5UX09GRgorCisjaWYgSENGX0FMSUdOICE9IDEgJiYgSENGX0FMSUdOICE9IDIgJiYgSENGX0FMSUdOICE9IDQgJiYgSENGX0FMSUdOICE9IDgKK2VycjogaW52YWxpZCB2YWx1ZSBmb3IgSENGX0FMSUdOOworI2VuZGlmIC8vIEhDRl9BTElHTgorCisjaWYgKEhDRl9BU1NFUlQpICYgfiggSENGX0FTU0VSVF9QUklOVEYgfCBIQ0ZfQVNTRVJUX1NXX1NVUCB8IEhDRl9BU1NFUlRfTUIgfCBIQ0ZfQVNTRVJUX1JUX01TRl9SVE4gfCBcCisJCQkJCSAgSENGX0FTU0VSVF9MTktfTVNGX1JUTiApCitlcnI6IGludmFsaWQgdmFsdWUgZm9yIEhDRl9BU1NFUlQ7CisjZW5kaWYgLy8gSENGX0FTU0VSVAorCisjaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9NQiAmJiAhICggKEhDRl9FWFQpICYgSENGX0VYVF9NQiApCQkvL2RldGVjdCBwb3RlbnRpYWwgY29uZmxpY3QKK2VycjogdGhlc2UgbWFjcm9zIGFyZSBub3QgdXNlZCBjb25zaXN0ZW50bHk7CisjZW5kaWYgLy8gSENGX0FTU0VSVF9NQiAvIEhDRl9FWFRfTUIKKworI2lmIEhDRl9CSUdfRU5ESUFOICE9IDAgJiYgSENGX0JJR19FTkRJQU4gIT0gMQorZXJyOiBpbnZhbGlkIHZhbHVlIGZvciBIQ0ZfQklHX0VORElBTjsKKyNlbmRpZiAvLyBIQ0ZfQklHX0VORElBTgorCisjaWYgSENGX0RMX09OTFkgIT0gMCAmJiBIQ0ZfRExfT05MWSAhPSAxCitlcnI6IGludmFsaWQgdmFsdWUgZm9yIEhDRl9ETF9PTkxZOworI2VuZGlmIC8vIEhDRl9ETF9PTkxZCisKKyNpZiBIQ0ZfRE1BICE9IDAgJiYgSENGX0RNQSAhPSAxCitlcnI6IGludmFsaWQgdmFsdWUgZm9yIEhDRl9ETUE7CisjZW5kaWYgLy8gSENGX0RNQQorCisjaWYgKEhDRl9FTkNBUCkgJiB+KCBIQ0ZfRU5DIHwgSENGX0VOQ19TVVAgKQorZXJyOiBpbnZhbGlkIHZhbHVlIGZvciBIQ0ZfRU5DQVA7CisjZW5kaWYgLy8gSENGX0VOQ0FQCisKKyNpZiAoSENGX0VYVCkgJiB+KCBIQ0ZfRVhUX0lORk9fTE9HIHwgSENGX0VYVF9JTlRfVFhfRVggfCBIQ0ZfRVhUX1RBTExJRVNfRlcgfCBIQ0ZfRVhUX1RBTExJRVNfSENGCXwgXAorCQkJCSAgIEhDRl9FWFRfTklDX0FDQ0VTUyB8IEhDRl9FWFRfTUIgfCBIQ0ZfRVhUX0lOVF9USUNLIHwgXAorCQkJCSAgIEhDRl9FWFRfSUZCX1NUUkNUIHwgSENGX0VYVF9ERVNDX1NUUkNUIHwgSENGX0VYVF9UWF9DT05UICkKK2VycjogaW52YWxpZCB2YWx1ZSBmb3IgSENGX0VYVDsKKyNlbmRpZiAvLyBIQ0ZfRVhUCisKKyNpZiBIQ0ZfSU5UX09OICE9IDAgJiYgSENGX0lOVF9PTiAhPSAxCitlcnI6IGludmFsaWQgdmFsdWUgZm9yIEhDRl9JTlRfT047CisjZW5kaWYgLy8gSENGX0lOVF9PTgorCisjaWYgKEhDRl9JTykgJiB+KCBIQ0ZfSU9fTUVNIHwgSENGX0lPXzMyQklUUyApCitlcnI6IGludmFsaWQgdmFsdWUgZm9yIEhDRl9JTzsKKyNlbmRpZiAvLyBIQ0ZfSU8KKworI2lmIEhDRl9MRUdBQ1kgIT0gMCAmJiBIQ0ZfTEVHQUNZICE9IDEKK2VycjogaW52YWxpZCB2YWx1ZSBmb3IgSENGX0xFR0FDWTsKKyNlbmRpZiAvLyBIQ0ZfTEVHQUNZCisKKyNpZiBIQ0ZfTUFYX0xUViA8IDE2IHx8IEhDRl9NQVhfTFRWID4gMjMwNAorZXJyOiBpbnZhbGlkIHZhbHVlIGZvciBIQ0ZfTUFYX0xUVjsKKyNlbmRpZiAvLyBIQ0ZfTUFYX0xUVgorCisjaWYgSENGX1BST1RfVElNRSAhPSAwICYmICggSENGX1BST1RfVElNRSA8IDE5IHx8IDI1NiA8IEhDRl9QUk9UX1RJTUUgKQorZXJyOiBiZWxvdyBtaW5pbXVtIC4wOCBzZWNvbmQgcmVxdWlyZWQgYnkgSGVybWVzIG9yIHBvc3NpYmx5IGFib3ZlIGhjZl8zMiBjYXBhY2l0eTsKKyNlbmRpZiAvLyBIQ0ZfUFJPVF9USU1FCisKKyNpZiAoSENGX1NMRUVQKSAmIH4oIEhDRl9DRFMgfCBIQ0ZfRERTICkKK2VycjogaW52YWxpZCB2YWx1ZSBmb3IgSENGX1NMRUVQOworI2VuZGlmIC8vIEhDRl9TTEVFUAorCisjaWYgKEhDRl9TTEVFUCkgJiYgISAoSENGX0lOVF9PTikKK2VycjogdGhlc2UgbWFjcm9zIGFyZSBub3QgdXNlZCBjb25zaXN0ZW50bHk7CisjZW5kaWYgLy8gSENGX1NMRUVQIC8gSENGX0lOVF9PTgorCisjaWYgKEhDRl9TTEVFUCkgJiYgISAoIChIQ0ZfRVhUKSAmIEhDRl9FWFRfSU5UX1RJQ0sgKQorLy87PyBlcnI6IHRoZXNlIG1hY3JvcyBhcmUgbm90IHVzZWQgY29uc2lzdGVudGx5OworI2VuZGlmIC8vIEhDRl9TTEVFUCAvIEhDRl9FWFRfSU5UX1RJQ0sKKworI2lmIChIQ0ZfVEFMTElFUykgJiB+KCBIQ0ZfVEFMTElFU19IQ0YgfCBIQ0ZfVEFMTElFU19OSUMgfCBIQ0ZfVEFMTElFU19SRVNFVCApIHx8IFwKKwkoSENGX1RBTExJRVMpID09IEhDRl9UQUxMSUVTX1JFU0VUCitlcnI6IGludmFsaWQgdmFsdWUgZm9yIEhDRl9UQUxMSUVTOworI2VuZGlmIC8vIEhDRl9UQUxMSUVTCisKKyNpZiAoSENGX1RZUEUpICYgfihIQ0ZfVFlQRV9XUEEgfCBIQ0ZfVFlQRV9VU0IgfCBIQ0ZfVFlQRV9QUkVMT0FERUQgfCBIQ0ZfVFlQRV9ISUk1IHwgSENGX1RZUEVfV0FSUCB8IFwKKwkJSENGX1RZUEVfQ0NYIC8qIHwgSENGX1RZUEVfVFhfREVMQVkgKi8gKQorZXJyOiBpbnZhbGlkIHZhbHVlIGZvciBIQ0ZfVFlQRTsKKyNlbmRpZiAvL0hDRl9UWVBFCisKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV0FSUCAmJiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCitlcnI6IGF0IG1vc3QgMSBvZiB0aGVzZSBtYWNyb3Mgc2hvdWxkIGJlIGRlZmluZWQ7CisjZW5kaWYgLy9IQ0ZfVFlQRV9XQVJQIC8gSENGX1RZUEVfV1BBCisKKyNlbmRpZiAvL0hDRkNGR19ICisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2hjZmRlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvaGNmZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdlNzRiZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2hjZmRlZi5oCkBAIC0wLDAgKzEsODA5IEBACisKKy8vICAgdmltOnR3PTExMDp0cz00OgorI2lmbmRlZiBIQ0ZERUZDX0gKKyNkZWZpbmUgSENGREVGQ19IIDEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRklMRQkgOiBIQ0ZERUYuSAorKgorKiBEQVRFICAgOiAkRGF0ZTogMjAwNC8wOC8wNSAxMTo0NzoxMCAkICAgJFJldmlzaW9uOiAxLjggJAorKiBPcmlnaW5hbDogMjAwNC8wNS8yOCAxNDowNTozNSAgICBSZXZpc2lvbjogMS41OSAgICAgIFRhZzogaGNmN190MjAwNDA2MDJfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDUvMTMgMTU6MzE6NDUgICAgUmV2aXNpb246IDEuNTMgICAgICBUYWc6IGhjZjdfdDdfMjAwNDA1MTNfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDQvMTUgMDk6MjQ6NDIgICAgUmV2aXNpb246IDEuNDQgICAgICBUYWc6IGhjZjdfdDdfMjAwNDA0MTVfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDQvMTMgMTQ6MjI6NDUgICAgUmV2aXNpb246IDEuNDMgICAgICBUYWc6IHQ3XzIwMDQwNDEzXzAxCisqIE9yaWdpbmFsOiAyMDA0LzA0LzAxIDE1OjMyOjU1ICAgIFJldmlzaW9uOiAxLjQwICAgICAgVGFnOiB0N18yMDA0MDQwMV8wMQorKiBPcmlnaW5hbDogMjAwNC8wMy8xMCAxNTozOToyOCAgICBSZXZpc2lvbjogMS4zNiAgICAgIFRhZzogdDIwMDQwMzEwXzAxCisqIE9yaWdpbmFsOiAyMDA0LzAzLzAzIDE0OjEwOjEyICAgIFJldmlzaW9uOiAxLjM0ICAgICAgVGFnOiB0MjAwNDAzMDRfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDMvMDIgMDk6Mjc6MTIgICAgUmV2aXNpb246IDEuMzIgICAgICBUYWc6IHQyMDA0MDMwMl8wMworKiBPcmlnaW5hbDogMjAwNC8wMi8yNCAxMzowMDoyOSAgICBSZXZpc2lvbjogMS4yOSAgICAgIFRhZzogdDIwMDQwMjI0XzAxCisqIE9yaWdpbmFsOiAyMDA0LzAyLzE4IDE3OjEzOjU3ICAgIFJldmlzaW9uOiAxLjI2ICAgICAgVGFnOiB0MjAwNDAyMTlfMDEKKyoKKyogQVVUSE9SIDogTmljbyBWYWxzdGVyCisqCisqIFNQRUNJRklDQVRJT046IC4uLi4uLi4uLi4uCisqCisqIERFU0MgICA6IERlZmluaXRpb25zIGFuZCBQcm90b3R5cGVzIGZvciBIQ0Ygb25seQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoKKyogU09GVFdBUkUgTElDRU5TRQorKgorKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyoKKyogQ09QWVJJR0hUIKkgMTk5NCAtIDE5OTUJYnkgQVQmVC4JCQkJQWxsIFJpZ2h0cyBSZXNlcnZlZAorKiBDT1BZUklHSFQgqSAxOTk2IC0gMjAwMCBieSBMdWNlbnQgVGVjaG5vbG9naWVzLglBbGwgUmlnaHRzIFJlc2VydmVkCisqIENPUFlSSUdIVCCpIDIwMDEgLSAyMDA0CWJ5IEFnZXJlIFN5c3RlbXMgSW5jLglBbGwgUmlnaHRzIFJlc2VydmVkCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyoKKyogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisqICAgIGRpc3RyaWJ1dGlvbi4KKyoKKyogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqCisqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogRGlzY2xhaW1lcgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisqIERBTUFHRS4KKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFAgUiBFIEYgSSBYIEUgUyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy9JRkJfCQlJbnRlcmZhY2UgQmxvY2sKKy8vSENNRF8JCUhlcm1lcyBDb21tYW5kCisvL0hGU18JCUhlcm1lcyAoVHJhbnNtaXQvUmVjZWl2ZSkgRnJhbWUgU3RydWN0dXJlCisvL0hSRUdfCQlIZXJtZXMgUmVnaXN0ZXIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAwIC8vCisjZGVmaW5lIEJJVDAgIDB4MDAwMQorI2RlZmluZSBCSVQxICAweDAwMDIKKyNkZWZpbmUgQklUMiAgMHgwMDA0CisjZGVmaW5lIEJJVDMgIDB4MDAwOAorI2RlZmluZSBCSVQ0ICAweDAwMTAKKyNkZWZpbmUgQklUNSAgMHgwMDIwCisjZGVmaW5lIEJJVDYgIDB4MDA0MAorI2RlZmluZSBCSVQ3ICAweDAwODAKKyNkZWZpbmUgQklUOCAgMHgwMTAwCisjZGVmaW5lIEJJVDkgIDB4MDIwMAorI2RlZmluZSBCSVQxMCAweDA0MDAKKyNkZWZpbmUgQklUMTEgMHgwODAwCisjZGVmaW5lIEJJVDEyIDB4MTAwMAorI2RlZmluZSBCSVQxMyAweDIwMDAKKyNkZWZpbmUgQklUMTQgMHg0MDAwCisjZGVmaW5lIEJJVDE1IDB4ODAwMAorI2RlZmluZSBCSVQxNiAweDAwMDEwMDAwCisjZGVmaW5lIEJJVDE3IDB4MDAwMjAwMDAKKyNkZWZpbmUgQklUMTggMHgwMDA0MDAwMAorI2RlZmluZSBCSVQxOSAweDAwMDgwMDAwCisjZGVmaW5lIEJJVDIwIDB4MDAxMDAwMDAKKyNkZWZpbmUgQklUMjEgMHgwMDIwMDAwMAorI2RlZmluZSBCSVQyMiAweDAwNDAwMDAwCisjZGVmaW5lIEJJVDIzIDB4MDA4MDAwMDAKKyNkZWZpbmUgQklUMjQgMHgwMTAwMDAwMAorI2RlZmluZSBCSVQyNSAweDAyMDAwMDAwCisjZGVmaW5lIEJJVDI2IDB4MDQwMDAwMDAKKyNkZWZpbmUgQklUMjcgMHgwODAwMDAwMAorI2RlZmluZSBCSVQyOCAweDEwMDAwMDAwCisjZGVmaW5lIEJJVDI5IDB4MjAwMDAwMDAKKyNkZWZpbmUgQklUMzAgMHg0MDAwMDAwMAorI2RlZmluZSBCSVQzMSAweDgwMDAwMDAwCisjZW5kaWYgLy8gMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBHRU5FUkFMIEVRVUFURVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2RlZmluZSBIQ0ZfTUFHSUMJCQkJMHg3RDM3CS8vICJ9NyIgSGFuZGxlIHZhbGlkYXRpb24KKworI2RlZmluZQlQTFVHX0RBVEFfT0ZGU0VUICAgICAgICAweDAwMDAwODAwCS8vbmVlZGVkIGJ5IHNvbWUgdGVzdCB0b29sIG9uIHRvcCBvZiBILUlJIE5ESVMgZHJpdmVyCisKKyNkZWZpbmUgSU5JX1RJQ0tfSU5JCQkJMHgwMDA0MDAwMEwKKworI2RlZmluZSBJT19JTgkJCQkJMAkJLy9oY2Zpb19pbl9zdHJpbmcKKyNkZWZpbmUgSU9fT1VUCQkJCQkxCQkvL2hjZmlvX291dF9zdHJpbmcKKworLy9ET19BU1NFUlQsIGNyZWF0ZSBhbiBhcnRpZmljaWFsIEZBTFNFIHRvIGZvcmNlIGFuIEFTU0VSVCB3aXRob3V0IHRoZSBuYXN0eSBjb21waWxlciB3YXJuaW5nCisjZGVmaW5lIERPX0FTU0VSVAkJCQkoIGFzc2VydF9pZmJwLT5JRkJfTWFnaWMgIT0gSENGX01BR0lDICYmIGFzc2VydF9pZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDICkKKyNkZWZpbmUgTlRfQVNTRVJUCQkJCTB4MDAwMAkJLy8sIE5FVkVSX1RFU1RFRAorI2RlZmluZSBORVZFUl9URVNURUQJCQlNRVJHRV8yKCAweEVGRkUsIDB4RkVFRiApCisjZGVmaW5lIFNFX0FTU0VSVAkJCQkweDVFRkYJCS8qIFNpZGUgRWZmZWN0LCBIQ0ZBU1NFUlQgaW52b2thdGlvbiB3aGljaCBhcmUgb25seSBjYWxsZWQgZm9yIHRoZQorCQkJCQkJCQkJCQkgKiBzaWRlIGVmZmVjdCBhbmQgd2hpY2ggc2hvdWxkIG5ldmVyIHRyaWdnZXIgKi8KKyNkZWZpbmUgREhGX0ZJTEVfTkFNRV9PRkZTRVQJMTAwMDAJCS8vdG8gZGlzdGluZ3Vpc2ggREhGIGZyb20gSENGIGFzc2VydHMgYnkgbWVhbnMgb2YgbGluZSBudW1iZXIKKyNkZWZpbmUgTU1EX0ZJTEVfTkFNRV9PRkZTRVQJMjAwMDAJCS8vdG8gZGlzdGluZ3Vpc2ggTU1EIGZyb20gSENGIGFzc2VydHMgYnkgbWVhbnMgb2YgbGluZSBudW1iZXIKKworLy8gdHJhY2UgY29kZXMgdXNlZCB0bworLy8gMTogcHJvZmlsZSBleGVjdXRpb24gdGltZXMgdmlhIEhDRl9UUkFDRSBhbmQgSENGX1RSQUNFX1ZBTFVFCisvLyAyOiBoaWVyYXJjaGljYWwgZmxvdyBpbmZvcm1hdGlvbiB2aWEgSENGTE9HRU5UUlkgLyBIQ0ZMT0dFWElUCisKKy8vI2RlZmluZSBIQ0ZfVFJBQ0VfQ09OTkVDVAkJdXNlbGVzcworLy8jZGVmaW5lIEhDRl9UUkFDRV9ESVNDT05ORUNUCXVzZWxlc3MKKyNkZWZpbmUgSENGX1RSQUNFX0FDVElPTgkJMHgwMDAwICAvLyAweDAwMDEKKyNkZWZpbmUgSENGX1RSQUNFX0NOVEwJCQkweDAwMDEgIC8vIDB4MDAwMgorI2RlZmluZSBIQ0ZfVFJBQ0VfRE1BX1JYX0dFVAkweDAwMDIgIC8vIDB4MDAwNAorI2RlZmluZSBIQ0ZfVFJBQ0VfRE1BX1JYX1BVVAkweDAwMDMgIC8vIDB4MDAwOAorI2RlZmluZSBIQ0ZfVFJBQ0VfRE1BX1RYX0dFVAkweDAwMDQgIC8vIDB4MDAxMAorI2RlZmluZSBIQ0ZfVFJBQ0VfRE1BX1RYX1BVVAkweDAwMDUgIC8vIDB4MDAyMAorI2RlZmluZSBIQ0ZfVFJBQ0VfR0VUX0lORk8JCTB4MDAwNiAgLy8gMHgwMDQwCisjZGVmaW5lIEhDRl9UUkFDRV9QVVRfSU5GTwkJMHgwMDA3ICAvLyAweDAwODAKKyNkZWZpbmUgSENGX1RSQUNFX1JDVl9NU0cJCTB4MDAwOCAgLy8gMHgwMTAwCisjZGVmaW5lIEhDRl9UUkFDRV9TRU5EX01TRwkJMHgwMDA5ICAvLyAweDAyMDAKKyNkZWZpbmUgSENGX1RSQUNFX1NFUlZJQ0VfTklDCTB4MDAwQSAgLy8gMHgwNDAwCisvLyAjZGVmaW5lIEhDRl9UUkFDRV8gICAgICAgICAgIDB4MDAwQyAgLy8gMHgxMDAwCisvLyAjZGVmaW5lIEhDRl9UUkFDRV8gICAgICAgICAgIDB4MDAwRCAgLy8gMHgyMDAwCisvLyAjZGVmaW5lIEhDRl9UUkFDRV8gICAgICAgICAgIDB4MDAwRSAgLy8gMHg0MDAwCisvLyAjZGVmaW5lIEhDRl9UUkFDRV8gICAgICAgICAgIDB4MDAwRiAgLy8gMHg4MDAwCisvLwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBIQ0ZfVFJBQ0VfLi4uIGNvZGVzIGJlbG93IDB4MDAxMCBhcmUgYXNzZXJ0ZWQgb24gcmUtZW50cnkKKyNkZWZpbmUgSENGX1RSQUNFX0FDVElPTl9LTFVER0UJMHgwMDEwICAvKiBvbmNlIHlvdSBzdGFydCBpbnRyb2R1Y2luZyBrbHVkZ2VzIHRoZXJlIGlzIG5vIGVuZCB0byBpdAorCQkJCQkJCQkJCSAqIHRoaXMgaXMgYW4gZXNjYXBlIHRvIGRvIG5vdCBhc3NlcnQgb24gcmUtZW50cmFuY3kgcHJvYmxlbSBjYXVzZWQKKwkJCQkJCQkJCQkgKiBieSBIQ0ZfQUNUX0lOVF9GT1JDRV9PTiB1c2VkIHRvIGdldCBNaWNyb3NvZnRzIE5ESVMgZHJpdmVycyBnb2luZworCQkJCQkJCQkJCSAqLworI2RlZmluZSBIQ0ZfVFJBQ0VfU1RSSU8JCQkweDAwMjAKKyNkZWZpbmUgSENGX1RSQUNFX0FMTE9DCQkJMFgwMDIxCisjZGVmaW5lIEhDRl9UUkFDRV9ETAkJCTBYMDAyMworI2RlZmluZSBIQ0ZfVFJBQ0VfSVNSX0lORk8JCTBYMDAyNAorI2RlZmluZSBIQ0ZfVFJBQ0VfQ0FMSUJSQVRFCQkweDAwMjYKKworI2RlZmluZSBIQ0ZfVFJBQ0VfQ01EX0NQTCAJCTB4MDA0MAorI2RlZmluZSBIQ0ZfVFJBQ0VfQ01EX0VYRQkJMHgwMDQxCisjZGVmaW5lIEhDRl9UUkFDRV9HRVRfRklECQkweDAwNDIKKyNkZWZpbmUgSENGX1RSQUNFX0dFVF9GUkFHCQkweDAwNDMKKyNkZWZpbmUgSENGX1RSQUNFX0lOSVQJCQkweDAwNDQKKyNkZWZpbmUgSENGX1RSQUNFX1BVVF9GUkFHCQkweDAwNDUKKyNkZWZpbmUgSENGX1RSQUNFX1NFVFVQX0JBUAkJMHgwMDQ2CisKKyNkZWZpbmUJSENGX1RSQUNFX0VYSVQgCQkJMHg4MDAwCS8vIEtlaWwgQyB3YXJucyAibG9uZyBjb25zdGFudCB0cnVuY2F0ZWQgdG8gaW50IgorCisvLyNkZWZpbmUgQkFQXzAJCQkJCUhSRUdfREFUQV8wCQkvL1VzZWQgYnkgRE1BIGNvbnRyb2xsZXIgdG8gYWNjZXNzIE5JQyBSQU0KKyNkZWZpbmUgQkFQXzEJCQkJCUhSRUdfREFUQV8xCQkvL1VzZWQgYnkgSENGIHRvIGFjY2VzcyBOSUMgUkFNCisKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqIEhlcm1lcyBSZWNlaXZlL1RyYW5zbWl0IEZyYW1lIFN0cnVjdHVyZXMKKy8vSEZTX1NUQVQKKy8vc2VlIE1NRC5IIGZvciBIRlNfU1RBVF9FUlIKKyNkZWZpbmUgCUhGU19TVEFUX01TR19UWVBFCTB4RTAwMAkvL0hlcm1lcyByZXBvcnRlZCBNZXNzYWdlIFR5cGUKKyNkZWZpbmUgCUhGU19TVEFUX01JQ19LRVlfSUQJMHgxODAwCS8vTUlDIGtleSB1c2VkIChpZiBhbnkpCisjZGVmaW5lIAlIRlNfU1RBVF8xMDQyCQkweDIwMDAJLy9SRkMxMDQyIEVuY29kZWQKKyNkZWZpbmUgCUhGU19TVEFUX1RVTk5FTAkJMHg0MDAwCS8vQnJpZGdlLVR1bm5lbCBFbmNvZGVkCisjZGVmaW5lIAlIRlNfU1RBVF9XTVBfTVNHCTB4NjAwMAkvL1dhdmVMQU4tSUkgTWFuYWdlbWVudCBQcm90b2NvbCBGcmFtZQorI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKKyNkZWZpbmUgCUhGU19TVEFUX01JQwkJMHgwMDEwCS8vRnJhbWUgY29udGFpbnMgTUlDICAvLzs/IHJlLWluc3RhdGUgd2hlbiBGL1cgcmVhZHkKKyNlbmRpZgorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKiogSGVybWVzIFJlZ2lzdGVyIE9mZnNldHMgYW5kIENvbW1hbmQgYml0cworI2RlZmluZSBIUkVHX0lPX1JBTkdFCQkJMHg4MAkJLy9JL08gUmFuZ2UgdXNlZCBieSBIZXJtZXMKKworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKiogQ29tbWFuZC9TdGF0dXMKKyNkZWZpbmUgSFJFR19DTUQJCQkJMHgwMAkJLy8KKyNkZWZpbmUgCUhDTURfQ01EX0NPREUJCQkweDNGCisjZGVmaW5lIEhSRUdfUEFSQU1fMAkJCTB4MDIJCS8vCisjZGVmaW5lIEhSRUdfUEFSQU1fMQkJCTB4MDQJCS8vCisjZGVmaW5lIEhSRUdfUEFSQU1fMgkJCTB4MDYJCS8vCisjZGVmaW5lIEhSRUdfU1RBVAkJCQkweDA4CQkvLworI2RlZmluZSAJSFJFR19TVEFUX0NNRF9DT0RFCQkweDAwM0YJLy8KKyNkZWZpbmUJCUhSRUdfU1RBVF9ESUFHX0VSUgkJMHgwMTAwCisjZGVmaW5lCQlIUkVHX1NUQVRfSU5RVUlSRV9FUlIJMHgwNTAwCisjZGVmaW5lIAlIUkVHX1NUQVRfQ01EX1JFU1VMVAkweDdGMDAJLy8KKyNkZWZpbmUgSFJFR19SRVNQXzAJCQkJMHgwQQkJLy8KKyNkZWZpbmUgSFJFR19SRVNQXzEJCQkJMHgwQwkJLy8KKyNkZWZpbmUgSFJFR19SRVNQXzIJCQkJMHgwRQkJLy8KKworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKiogRklEIE1hbmFnZW1lbnQKKyNkZWZpbmUgSFJFR19JTkZPX0ZJRAkJCTB4MTAJCS8vCisjZGVmaW5lIEhSRUdfUlhfRklECQkJCTB4MjAJCS8vCisjZGVmaW5lIEhSRUdfQUxMT0NfRklEICAJCTB4MjIJCS8vCisjZGVmaW5lIEhSRUdfVFhfQ09NUExfRklEICAJCTB4MjQJCS8vCisKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqIEJBUAorLy8yMDAzMTAzMCBIV2kgSW5zZXJ0ZWQgdGhpcyBhZ2FpbiBiZWNhdXNlIHRoZSBkb25nbGUgY29kZSB1c2VzIHRoaXMgKEdQSUYuQykKKy8vI2RlZmluZSBIUkVHX1NFTEVDVF8wCQkJMHgxOAkJLy8KKy8vI2RlZmluZSBIUkVHX09GRlNFVF8wCQkJMHgxQwkJLy8KKy8vI2RlZmluZSBIUkVHX0RBVEFfMAkJCTB4MzYJCS8vCisKKy8vI2RlZmluZSAJSFJFR19PRkZTRVRfQlVTWQkJMHg4MDAwCS8vIHVzZSBIQ01EX0JVU1kKKyNkZWZpbmUgCUhSRUdfT0ZGU0VUX0VSUgkJCTB4NDAwMAkvLworLy9yc3J2ZCAjZGVmaW5lIAlIUkVHX09GRlNFVF9EQVRBX09GRlNFVAkweDBGRkYJLy8KKworI2RlZmluZSBIUkVHX1NFTEVDVF8xCQkJMHgxQQkJLy8KKyNkZWZpbmUgSFJFR19PRkZTRVRfMQkJCTB4MUUJCS8vCisjZGVmaW5lIEhSRUdfREFUQV8xCQkJCTB4MzgJCS8vCisKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqIEV2ZW50CisjZGVmaW5lIEhSRUdfRVZfU1RBVAkJCTB4MzAJCS8vCisjZGVmaW5lIEhSRUdfSU5UX0VOCQkJCTB4MzIJCS8vCisjZGVmaW5lIEhSRUdfRVZfQUNLCQkJCTB4MzQJCS8vCisKKyNkZWZpbmUgICAgSFJFR19FVl9USUNLCQkJCTB4ODAwMAkvL0F1eGlsaWFyeSBUaW1lciBUaWNrCisvLyNkZWZpbmUgIEhSRUdfRVZfUkVTCQkJCTB4NDAwMAkvL0gtSSBvbmx5OiBIL1cgZXJyb3IgKFdhaXQgVGltZS1vdXQpCisjZGVmaW5lICAgIEhSRUdfRVZfSU5GT19EUk9QCQkweDIwMDAJLy9XTUFDIGRpZCBub3QgaGF2ZSBzdWZmaWNpZW50IFJBTSB0byBidWlsZCBVbnNvbGxpY2l0ZWQgRnJhbWUKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfSElJNQorI2RlZmluZSAgICBIUkVHX0VWX0FDS19SRUdfUkVBRFkJMHgwMDAwCisjZWxzZQorI2RlZmluZSAgICBIUkVHX0VWX0FDS19SRUdfUkVBRFkJMHgxMDAwCS8vV29ya2Fyb3VuZCBLbHVkZ2UgYml0IGZvciBILUlJIChub3QgSC1JSS41KQorI2VuZGlmIC8vIEhDRl9UWVBFX0hJSTUKKyNpZiAoSENGX1NMRUVQKSAmICggSENGX0NEUyB8IEhDRl9ERFMgKQorI2RlZmluZSAgICBIUkVHX0VWX1NMRUVQX1JFUQkJMHgwODAwCisjZWxzZQorI2RlZmluZSAgICBIUkVHX0VWX1NMRUVQX1JFUQkJMHgwMDAwCisjZW5kaWYgLy8gSENGX0NEUyAvIEhDRl9ERFMKKyNpZiBIQ0ZfRE1BCisvLyNkZWZpbmUgICAgSFJFR19FVl9MUEVTQwkJCTB4MDQwMCAvLyBmaXJtd2FyZSBzZXRzIHRoaXMgYml0IGFuZCBjbGVhcnMgaXQsIG5vdCBmb3IgaG9zdCB1c2FnZS4KKyNkZWZpbmUgICAgSFJFR19FVl9SRE1BRAkJCTB4MDIwMCAvLyByeCBmcmFtZSBpbiBob3N0IG1lbW9yeQorI2RlZmluZSAgICBIUkVHX0VWX1RETUFECQkJMHgwMTAwIC8vIHR4IGZyYW1lIGluIGhvc3QgbWVtb3J5IHByb2Nlc3NlZAorLy8jZGVmaW5lICAgIEhSRUdfRVZfUlhETUEJCQkweDAwNDAgLy8gZmlybXdhcmUga2lja3Mgb2ZmIERNQSBlbmdpbmUgKGJpdCBpcyBub3QgZm9yIGhvc3QgdXNhZ2UpCisvLyNkZWZpbmUgICAgSFJFR19FVl9UWERNQQkJCTB4MDAyMCAvLyBmaXJtd2FyZSBraWNrcyBvZmYgRE1BIGVuZ2luZSAoYml0IGlzIG5vdCBmb3IgaG9zdCB1c2FnZSkKKyNkZWZpbmUgICAgSFJFR19FVl9GV19ETUEJCQkweDA0NjAgLy8gZmlybXdhcmUgLyBETUEgZW5naW5lIEkvRiAoYml0cyBhcmUgbm90IGZvciBob3N0IHVzYWdlKQorI2Vsc2UKKyNkZWZpbmUgICAgSFJFR19FVl9GV19ETUEJCQkweDAwMDAKKyNlbmRpZiAvLyBIQ0ZfRE1BCisjZGVmaW5lICAgIEhSRUdfRVZfSU5GTwkJCQkweDAwODAJLy8gQXN5bmNocm9ub3VzIEluZm9ybWF0aW9uIEZyYW1lCisjZGVmaW5lICAgIEhSRUdfRVZfQ01ECQkJCTB4MDAxMAkvLyBDb21tYW5kIGNvbXBsZXRlZCwgU3RhdHVzIGFuZCBSZXNwb25zZSBhdmFpbGFibGUKKyNkZWZpbmUgICAgSFJFR19FVl9BTExPQwkJCTB4MDAwOAkvLyBBc3luY2hyb25vdXMgcGFydCBvZiBBbGxvY2F0aW9uL1JlY2xhaW0gY29tcGxldGVkCisjZGVmaW5lICAgIEhSRUdfRVZfVFhfRVhDCQkJMHgwMDA0CS8vIEFzeW5jaHJvbm91cyBUcmFuc21pc3Npb24gdW5zdWNjZXNzZnVsIGNvbXBsZXRlZAorI2RlZmluZSAgICBIUkVHX0VWX1RYCQkJCTB4MDAwMgkvLyBBc3luY2hyb25vdXMgVHJhbnNtaXNzaW9uIHN1Y2Nlc3NmdWwgY29tcGxldGVkCisjZGVmaW5lICAgIEhSRUdfRVZfUlgJCQkJMHgwMDAxCS8vIEFzeW5jaHJvbm91cyBSZWNlaXZlIEZyYW1lCisKKyNkZWZpbmUgICAgSFJFR19FVl9UWF9FWFQgCQkJKCAoSENGX0VYVCkgJiAoSENGX0VYVF9JTlRfVFhfRVggfCBIQ0ZfRVhUX0lOVF9USUNLICkgKQorCQkJCQkJCQkJLyogSFJFR19FVl9UWF9FWFQgOj0gMHgwMDAwIG9yIEhSRUdfRVZfVFhfRVhDIGFuZC9vciBIUkVHX0VWX1RJQ0sKKwkJCQkJCQkJCSAqIGNvdWxkIGJlIGV4dGVuZGVkIHdpdGggSFJFR19FVl9UWCAqLworI2lmIEhDRl9FWFRfSU5UX1RYX0VYICE9IEhSRUdfRVZfVFhfRVhDCitlcnI6IHRoZXNlIHZhbHVlcyBzaG91bGQgbWF0Y2g7CisjZW5kaWYgLy8gSENGX0VYVF9JTlRfVFhfRVggLyBIUkVHX0VWX1RYX0VYQworCisjaWYgSENGX0VYVF9JTlRfVElDSyAhPSBIUkVHX0VWX1RJQ0sKK2VycjogdGhlc2UgdmFsdWVzIHNob3VsZCBtYXRjaDsKKyNlbmRpZiAvLyBIQ0ZfRVhUX0lOVF9USUNLIC8gSFJFR19FVl9USUNLCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKiBIb3N0IFNvZnR3YXJlCisjZGVmaW5lIEhSRUdfU1dfMAkJCQkweDI4CQkvLworI2RlZmluZSBIUkVHX1NXXzEJCQkJMHgyQQkJLy8KKyNkZWZpbmUgSFJFR19TV18yCQkJCTB4MkMJCS8vCisvL3JzcnZkICNkZWZpbmUgSFJFR19TV18zCQkweDJFCQkvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqIENvbnRyb2wgYW5kIEF1eGlsaWFyeSBQb3J0CisKKyNkZWZpbmUgSFJFR19JTwkJCQkJMHgxMgorI2RlZmluZQkJSFJFR19JT19TUkVTRVQJCQkweDAwMDEKKyNkZWZpbmUJCUhSRUdfSU9fV0FLRVVQX0FTWU5DCTB4MDAwMgorI2RlZmluZQkJSFJFR19JT19XT0tFTl9VUAkJMHgwMDA0CisjZGVmaW5lIEhSRUdfQ05UTAkJCQkweDE0CQkvLworLy8jZGVmaW5lCQlIUkVHX0NOVExfV0FLRVVQX1NZTkMJMHgwMDAxCisjZGVmaW5lCQlIUkVHX0NOVExfQVVYX0VOQV9TVEFUCTB4QzAwMAorI2RlZmluZQkJSFJFR19DTlRMX0FVWF9ESVNfU1RBVAkweDAwMDAKKyNkZWZpbmUJCUhSRUdfQ05UTF9BVVhfRU5BX0NOVEwJMHg4MDAwCisjZGVmaW5lCQlIUkVHX0NOVExfQVVYX0RJU19DTlRMCTB4NDAwMAorI2RlZmluZQkJSFJFR19DTlRMX0FVWF9EU0QJCTB4MjAwMAorI2RlZmluZQkJSFJFR19DTlRMX0FVWF9FTkEJCShIUkVHX0NOVExfQVVYX0VOQV9DTlRMIHwgSFJFR19DTlRMX0FVWF9ESVNfQ05UTCApCisjZGVmaW5lIEhSRUdfU1BBUkUJCQkJMHgxNgkJLy8KKyNkZWZpbmUgSFJFR19BVVhfUEFHRQkJCTB4M0EJCS8vCisjZGVmaW5lIEhSRUdfQVVYX09GRlNFVAkJCTB4M0MJCS8vCisjZGVmaW5lIEhSRUdfQVVYX0RBVEEJCQkweDNFCQkvLworCisjaWYgSENGX0RNQQorLy8qKioqKioqKioqKioqKioqKioqKioqKioqIERNQSAoYnVzIG1hc3RlcmluZykKKwkvLyBCZSBjYXJlZnVsbCB0byB1c2UgdGhlc2UgcmVnaXN0ZXJzIG9ubHkgYXQgYSBnZW51aW5lIDMyIGJpdHMgTklDCisJLy8gT24gMTYgYml0cyBOSUNzLCB0aGVzZSBhZGRyZXNzZXMgYXJlIG1hcHBlZCBpbnRvIHRoZSByYW5nZSAweDAwIHRocm91Z2ggMHgzRiB3aXRoIGFsbCBjb25zZXF1ZW5jZXMKKwkvLyB0aGVyZW9mLCBlLmcuICBIUkVHX0RNQV9DVFJMIHJlZ2lzdGVyIG1hcHMgdG8gSFJFR19DTUQuCisjZGVmaW5lIEhSRUdfRE1BX0NUUkwJCQkJCQkweDAwNDAKKyNkZWZpbmUgSFJFR19UWERNQV9QVFIzMgkJCQkJMHgwMDQ0CisjZGVmaW5lIEhSRUdfVFhETUFfUFJJT19QVFIzMgkJCQkweDAwNDgKKyNkZWZpbmUgSFJFR19UWERNQV9ISVBSSU9fUFRSMzIJCQkJMHgwMDRDCisjZGVmaW5lIEhSRUdfUlhETUFfUFRSMzIJCQkJCTB4MDA1MAorI2RlZmluZSBIUkVHX0NBUkRERVRFQ1RfMQkJCQkJMHgwMDdDIC8vIGNvbnRhaW5zIDdEMzcKKyNkZWZpbmUgSFJFR19DQVJEREVURUNUXzIJCQkJCTB4MDA3RSAvLyBjb250YWlucyA3REU3CisjZGVmaW5lIEhSRUdfRlJFRVRJTUVSCQkJCQkJMHgwMDU4CisjZGVmaW5lIEhSRUdfRE1BX1JYX0NOVAkJCQkJCTB4MDAyNgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERlZmluZXMgZm9yIHRoZSBiaXRzIGluIHRoZSBEbWFDb250cm9sIHJlZ2lzdGVyIChANDBoKQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBIUkVHX0RNQV9DVFJMX1JYSFdFTgkJCQkweDgwMDAwMDAwIC8vIGhpZ2ggd29yZCBlbmFibGUgYml0CisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfUlhSRVNFVAkJCQkweDQwMDAwMDAwIC8vIHR4IGRtYSBpbml0IGJpdAorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1JYQkFQMQkJCQlCSVQyOQorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1JYX1NUQUxMRUQJCQlCSVQyOAorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1JYQVVUT0FDS19ETUFET05FCQlCSVQyNyAvLyBubyBob3N0IGludm9sdmVtZW50IHJlcS4gZm9yIFRETUFET05FIGV2ZW50CisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfUlhBVVRPQUNLX0lORk8JCUJJVDI2IC8vIG5vIGhvc3QgaW52b2x2ZW1lbnQgcmVxLiBmb3IgYWxsb2MgZXZlbnQKKyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9SWEFVVE9BQ0tfRE1BRU4JCTB4MDIwMDAwMDAgLy8gbm8gaG9zdCBpbnZvbHZlbWVudCByZXEuIGZvciBUeERNQWVuIGV2ZW50CisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfUlhBVVRPQUNLX1JYCQkJMHgwMTAwMDAwMCAvLyBubyBob3N0IGludm9sdmVtZW50IHJlcS4gZm9yIHR4IGV2ZW50CisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfUlhfQlVTWQkJCQlCSVQyMyAvLyByZWFkIG9ubHkgYml0CisvLyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9SWF9SQlVGQ09OVF9QTEFJTgkJMAkgIC8vIGJpdHMgMjEuLjIwCisvLyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9SWF9NT0RFX1BMQUlOX0RNQQkJMAkgIC8vIG1vZGUgMAorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1JYX01PREVfU0lOR0xFX1BBQ0tFVAkweDAwMDEwMDAwIC8vIG1vZGUgMQorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1JYX01PREVfTVVMVElfUEFDS0VUCTB4MDAwMjAwMDAgLy8gbW9kZSAyCisvLyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9SWF9NT0RFX0RJU0FCTEUJCSgweDAwMDIwMDAwfDB4MDAwMTAwMDApIC8vIGRpc2FibGUgdHggZG1hIGVuZ2luZQorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYSFdFTgkJCQkweDgwMDAgLy8gbG93IHdvcmQgZW5hYmxlIGJpdAorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYUkVTRVQJCQkJMHg0MDAwIC8vIHJ4IGRtYSBpbml0IGJpdAorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYQkFQMQkJCQlCSVQxMworI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYQVVUT0FDS19ETUFET05FCQlCSVQxMSAvLyBubyBob3N0IGludm9sdmVtZW50IHJlcS4gZm9yIFJ4RE1BRE9ORSBldmVudAorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYQVVUT0FDS19ETUFFTgkJMHgwMDAwMDQwMCAvLyBubyBob3N0IGludm9sdmVtZW50IHJlcS4gZm9yIFJ4RE1BZW4gZXZlbnQKKyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9UWEFVVE9BQ0tfRE1BQUxMT0MJMHgwMDAwMDIwMCAgLy8gbm8gaG9zdCBpbnZvbHZlbWVudCByZXEuIGZvciBpbmZvIGV2ZW50CisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfVFhBVVRPQUNLX1RYCQkJMHgwMDAwMDEwMCAgLy8gbm8gaG9zdCBpbnZvbHZlbWVudCByZXEuIGZvciByeCBldmVudAorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYX0JVU1kJCQkJQklUNyAgLy8gcmVhZCBvbmx5IGJpdAorLy8jZGVmaW5lIEhSRUdfRE1BX0NUUkxfVFhfVEJVRkNPTlRfUExBSU4JCTAJICAvLyBiaXRzIDYuLjUKKy8vI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYX01PREVfUExBSU5fRE1BCQkwCSAgLy8gbW9kZSAwCisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfVFhfTU9ERV9TSU5HTEVfUEFDS0VUCUJJVDAgLy8gbW9kZSAxCisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfVFhfTU9ERV9NVUxUSV9QQUNLRVQJMHgwMDAwMDAwMiAvLyBtb2RlIDIKKy8vI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYX01PREVfRElTQUJMRQkJKDB4MDAwMDAwMDF8MHgwMDAwMDAwMikgLy8gZGlzYWJsZSB0eCBkbWEgZW5naW5lCisKKy8vY29uZmlndXJhdGlvbiBEV09SRCB0byBjb25maWd1cmUgRE1BIGZvciBtb2RlMiBvcGVyYXRpb24sIHVzaW5nIEJBUDAgYXMgdGhlIERNQSBCQVAuCisjZGVmaW5lIERNQV9DVFJMU1RBVF9HTyAoSFJFR19ETUFfQ1RSTF9SWEhXRU4gfCBIUkVHX0RNQV9DVFJMX1JYX01PREVfTVVMVElfUEFDS0VUIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUdfRE1BX0NUUkxfUlhBVVRPQUNLX0RNQUVOIHwgSFJFR19ETUFfQ1RSTF9SWEFVVE9BQ0tfUlggfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgSFJFR19ETUFfQ1RSTF9UWEhXRU4gfCAvKjs/SFJFR19ETUFfQ1RSTF9UWF9UQlVGQ09OVF9QTEFJTiB8Ki8gXAorICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUdfRE1BX0NUUkxfVFhfTU9ERV9NVUxUSV9QQUNLRVQgfCBIUkVHX0RNQV9DVFJMX1RYQVVUT0FDS19ETUFFTiB8XAorICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUdfRE1BX0NUUkxfVFhBVVRPQUNLX0RNQUFMTE9DKQorCisvL2NvbmZpZ3VyYXRpb24gRFdPUkQgdG8gcmVzZXQgYm90aCB0aGUgVHggYW5kIFJ4IERNQSBlbmdpbmVzCisjZGVmaW5lIERNQV9DVFJMU1RBVF9SRVNFVCAoSFJFR19ETUFfQ1RSTF9SWEhXRU4gfCBIUkVHX0RNQV9DVFJMX1JYUkVTRVQgfCBIUkVHX0RNQV9DVFJMX1RYSFdFTiB8IEhSRUdfRE1BX0NUUkxfVFhSRVNFVCkKKworLy8jZGVmaW5lIERFU0NfRE1BX09XTkVEICAgICAJCTB4ODAwMDAwMDAgCQkJCQkvLyBCSVQzMQorI2RlZmluZSBERVNDX0RNQV9PV05FRCAgICAgCQkweDgwMDAJIAkJCQkJLy8gQklUMzEKKyNkZWZpbmUgREVTQ19TT1AgICAJCQkgCTB4ODAwMCAJCQkJCQkvLyBCSVQxNQorI2RlZmluZSBERVNDX0VPUCAgIAkJCSAJMHg0MDAwIAkJCQkJCS8vIEJJVDE0CisKKyNkZWZpbmUgRE1BX1JYCQkJCTAKKyNkZWZpbmUgRE1BX1RYCQkJCTEKKworLy8gI2RlZmluZSBJRkJfUnhGaXJzdERlc2MJCUlGQl9GaXJzdERlc2NbRE1BX1JYXQorLy8gI2RlZmluZSBJRkJfVHhGaXJzdERlc2MJCUlGQl9GaXJzdERlc2NbRE1BX1RYXQorLy8gI2RlZmluZSBJRkJfUnhMYXN0RGVzYwkJSUZCX0xhc3REZXNjW0RNQV9SWF0KKy8vICNkZWZpbmUgSUZCX1R4TGFzdERlc2MJCUlGQl9MYXN0RGVzY1tETUFfVFhdCisKKyNlbmRpZiAvLyBIQ0ZfRE1BCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBFUVVBVEVTICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8vIEhlcm1lcyBDb21tYW5kIENvZGVzIGFuZCBRdWFsaWZpZXIgYml0cworI2RlZmluZSAJSENNRF9CVVNZCQkJMHg4MDAwCS8vIEJ1c3kgYml0LCBhcHBsaWNhYmxlIGZvciBhbGwgY29tbWFuZHMKKyNkZWZpbmUgSENNRF9JTkkJCQkJMHgwMDAwCS8vCisjZGVmaW5lIEhDTURfRU5BQkxFCQkJCUhDRl9DTlRMX0VOQUJMRQkJLy8gMHgwMDAxCisjZGVmaW5lIEhDTURfRElTQUJMRQkJCUhDRl9DTlRMX0RJU0FCTEUJLy8gMHgwMDAyCisjZGVmaW5lIEhDTURfQ09OTkVDVAkJCUhDRl9DTlRMX0NPTk5FQ1QJLy8gMHgwMDAzCisjZGVmaW5lIEhDTURfRVhFQ1VURQkJCTB4MDAwNAkvLworI2RlZmluZSBIQ01EX0RJU0NPTk5FQ1QJCQlIQ0ZfQ05UTF9ESVNDT05ORUNUCS8vIDB4MDAwNQorI2RlZmluZSBIQ01EX1NMRUVQCQkJCTB4MDAwNgkvLworI2RlZmluZSBIQ01EX0NPTlRJTlVFCQkJSENGX0NOVExfQ09OVElOVUUJLy8gMHgwMDA3CisjZGVmaW5lIAlIQ01EX1JFVFJZCQkJMHgwMTAwCS8vIFJldHJ5IGJpdAorI2RlZmluZSBIQ01EX0FMTE9DCQkJCTB4MDAwQQkvLworI2RlZmluZSBIQ01EX1RYCQkJCQkweDAwMEIJLy8KKyNkZWZpbmUgCUhDTURfUkVDTAkJCTB4MDEwMAkvLyBSZWNsYWltIGJpdCwgYXBwbGljYWJsZSBmb3IgVHggYW5kIElucXVpcmUKKyNkZWZpbmUgSENNRF9JTlFVSVJFCQkJMHgwMDExCS8vCisjZGVmaW5lIEhDTURfQUNDRVNTCQkJCTB4MDAyMQkvLworI2RlZmluZSAJSENNRF9BQ0NFU1NfV1JJVEUJMHgwMTAwCS8vIFdyaXRlIGJpdAorI2RlZmluZSBIQ01EX1BST0dSQU0JCQkweDAwMjIJLy8KKyNkZWZpbmUgSENNRF9SRUFEX01JRgkJCTB4MDAzMAorI2RlZmluZSBIQ01EX1dSSVRFX01JRgkJCTB4MDAzMQorI2RlZmluZSBIQ01EX1RIRVNFVVMJCQkweDAwMzgKKyNkZWZpbmUgCUhDTURfU1RBUlRQUkVBTUJMRSAgMHgwRTAwCS8vIFN0YXJ0IGNvbnRpbnVvdXMgcHJlYW1ibGUgVHgKKyNkZWZpbmUgCUhDTURfU1RPUAkJCTB4MEYwMAkvLyBTdG9wIFRoZXNldXMgdGVzdCBtb2RlCisKKworLy9Db25maWd1cmF0aW9uIE1hbmFnZW1lbnQKKy8vCisKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSV8zX0JPVFRPTQkxCS8vIERlZmF1bHQgQm90dG9tIENvbXBhdGliaWxpdHkgZm9yIFByaW1hcnkgRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19QUklfM19UT1AJMQkvLyBEZWZhdWx0IFRvcCAgICBDb21wYXRpYmlsaXR5IGZvciBQcmltYXJ5IEZpcm13YXJlIC0gZHJpdmVyIEkvRgorCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9CT1RUT00JMQkvLyBEZWZhdWx0IEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBIL1cgLSBkcml2ZXIgSS9GCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9UT1AJMQkvLyBEZWZhdWx0IFRvcCAgICBDb21wYXRpYmlsaXR5IGZvciBIL1cgLSBkcml2ZXIgSS9GCisKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV81X0JPVFRPTQkxCS8vIERlZmF1bHQgQm90dG9tIENvbXBhdGliaWxpdHkgZm9yIEgvVyAtIGRyaXZlciBJL0YKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV81X1RPUAkxCS8vIERlZmF1bHQgVG9wICAgIENvbXBhdGliaWxpdHkgZm9yIEgvVyAtIGRyaXZlciBJL0YKKworI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8xX0JPVFRPTQkxNgkvLyBEZWZhdWx0IEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBBUCBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8xX1RPUCAgICAxNgkvLyBEZWZhdWx0IFRvcCAgICBDb21wYXRpYmlsaXR5IGZvciBBUCBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNlbHNlICAvLzs/IGlzIHRoaXMgUkVBTExZIE8uSy4KKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8xX0JPVFRPTQkxCS8vIERlZmF1bHQgQm90dG9tIENvbXBhdGliaWxpdHkgZm9yIEFQIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzFfVE9QICAgIDEJLy8gRGVmYXVsdCBUb3AgICAgQ29tcGF0aWJpbGl0eSBmb3IgQVAgRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjZW5kaWYgLy8gSENGX1RZUEVfV1BBCisKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8yX0JPVFRPTQkyCS8vIERlZmF1bHQgQm90dG9tIENvbXBhdGliaWxpdHkgZm9yIEFQIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzJfVE9QICAgIDIJLy8gRGVmYXVsdCBUb3AgICAgQ29tcGF0aWJpbGl0eSBmb3IgQVAgRmlybXdhcmUgLSBkcml2ZXIgSS9GCisKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8zX0JPVFRPTQkxCS8vIERlZmF1bHQgQm90dG9tIENvbXBhdGliaWxpdHkgZm9yIEFQIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzNfVE9QICAgIDEJLy8gRGVmYXVsdCBUb3AgICAgQ29tcGF0aWJpbGl0eSBmb3IgQVAgRmlybXdhcmUgLSBkcml2ZXIgSS9GCisKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl80X0JPVFRPTQkxCS8vIERlZmF1bHQgQm90dG9tIENvbXBhdGliaWxpdHkgZm9yIEFQIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzRfVE9QICAgIDEJLy8gRGVmYXVsdCBUb3AgICAgQ29tcGF0aWJpbGl0eSBmb3IgQVAgRmlybXdhcmUgLSBkcml2ZXIgSS9GCisKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfSElJNQorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzJfQk9UVE9NCTYJLy8gRGVmYXVsdCBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgU3RhdGlvbiBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8yX1RPUCAgICA2CS8vIERlZmF1bHQgVG9wICAgIENvbXBhdGliaWxpdHkgZm9yIFN0YXRpb24gRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjZWxzZSAvLyAoSENGX1RZUEUpICYgSENGX1RZUEVfSElJNQorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzJfQk9UVE9NCTEJLy8gRGVmYXVsdCBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgU3RhdGlvbiBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8yX1RPUCAgICAyCS8vIERlZmF1bHQgVG9wICAgIENvbXBhdGliaWxpdHkgZm9yIFN0YXRpb24gRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjZW5kaWYgLy8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0hJSTUKKworI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzNfQk9UVE9NCTEJLy8gRGVmYXVsdCBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgU3RhdGlvbiBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8zX1RPUCAgICAxCS8vIERlZmF1bHQgVG9wICAgIENvbXBhdGliaWxpdHkgZm9yIFN0YXRpb24gRmlybXdhcmUgLSBkcml2ZXIgSS9GCisKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV80X0JPVFRPTQkxCS8vIERlZmF1bHQgQm90dG9tIENvbXBhdGliaWxpdHkgZm9yIFN0YXRpb24gRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19TVEFfNF9UT1AgICAgMQkvLyBEZWZhdWx0IFRvcCAgICBDb21wYXRpYmlsaXR5IGZvciBTdGF0aW9uIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIGRlZmluZWQgSENGX0NGR19QUklfMV9UT1AgfHwgZGVmaW5lZCBIQ0ZfQ0ZHX1BSSV8xX0JPVFRPTQorZXJyOiBQUklfMSBub3Qgc3VwcG9ydGVkIGZvciBILUk7CS8vIENvbXBhdGliaWxpdHkgZm9yIFByaW1hcnkgRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjZW5kaWYgLy8gSENGX0NGR19QUklfMV9UT1AgLyBIQ0ZfQ0ZHX1BSSV8xX0JPVFRPTQorCisjaWYgZGVmaW5lZCBIQ0ZfQ0ZHX1BSSV8yX1RPUCB8fCBkZWZpbmVkIEhDRl9DRkdfUFJJXzJfQk9UVE9NCitlcnI6IFBSSV8yIG5vdCBzdXBwb3J0ZWQgZm9yIEgtSTsJLy8gQ29tcGF0aWJpbGl0eSBmb3IgUHJpbWFyeSBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNlbmRpZiAvLyBIQ0ZfQ0ZHX1BSSV8yX1RPUCAvIEhDRl9DRkdfUFJJXzJfQk9UVE9NCisKKyNpZmRlZiBIQ0ZfQ0ZHX1BSSV8zX1RPUAkJCQkJCQkJCS8vIFRvcCBDb21wYXRpYmlsaXR5IGZvciBQcmltYXJ5IEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2lmIEhDRl9DRkdfUFJJXzNfVE9QID09IDAgfHwgXAorCUNGR19EUlZfQUNUX1JBTkdFU19QUklfM19CT1RUT00gPD0gSENGX0NGR19QUklfM19UT1AgJiYgSENGX0NGR19QUklfM19UT1AgPD0gQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSV8zX1RPUAorI3VuZGVmIENGR19EUlZfQUNUX1JBTkdFU19QUklfM19UT1AKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSV8zX1RPUAlIQ0ZfQ0ZHX1BSSV8zX1RPUAorI2Vsc2UKK2VycjogOworI2VuZGlmCisjZW5kaWYgLy8gSENGX0NGR19QUklfM19UT1AKKworI2lmZGVmIEhDRl9DRkdfUFJJXzNfQk9UVE9NICAgICAgICAgICAgICAgICAgICAgICAJCQkvLyBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgUHJpbWFyeSBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNpZiBDRkdfRFJWX0FDVF9SQU5HRVNfUFJJXzNfQk9UVE9NIDw9IEhDRl9DRkdfUFJJXzNfQk9UVE9NICYmIEhDRl9DRkdfUFJJXzNfQk9UVE9NIDw9IENGR19EUlZfQUNUX1JBTkdFU19QUklfM19UT1AKKyN1bmRlZiBDRkdfRFJWX0FDVF9SQU5HRVNfUFJJXzNfQk9UVE9NCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19QUklfM19CT1RUT00JSENGX0NGR19QUklfM19CT1RUT00KKyNlbHNlCitlcnI6IDsKKyNlbmRpZgorI2VuZGlmIC8vIEhDRl9DRkdfUFJJXzNfQk9UVE9NCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiBkZWZpbmVkIEhDRl9DRkdfSFNJXzBfVE9QIHx8IGRlZmluZWQgSENGX0NGR19IU0lfMF9CT1RUT00KK2VycjogSFNJXzAgbm90IHN1cHBvcnRlZCBmb3IgSC1JOwkvLyBDb21wYXRpYmlsaXR5IGZvciBIU0kgSS9GCisjZW5kaWYgLy8gSENGX0NGR19IU0lfMF9UT1AgLyBIQ0ZfQ0ZHX0hTSV8wX0JPVFRPTQorCisjaWYgZGVmaW5lZCBIQ0ZfQ0ZHX0hTSV8xX1RPUCB8fCBkZWZpbmVkIEhDRl9DRkdfSFNJXzFfQk9UVE9NCitlcnI6IEhTSV8xIG5vdCBzdXBwb3J0ZWQgZm9yIEgtSTsJLy8gQ29tcGF0aWJpbGl0eSBmb3IgSFNJIEkvRgorI2VuZGlmIC8vIEhDRl9DRkdfSFNJXzFfVE9QIC8gSENGX0NGR19IU0lfMV9CT1RUT00KKworI2lmIGRlZmluZWQgSENGX0NGR19IU0lfMl9UT1AgfHwgZGVmaW5lZCBIQ0ZfQ0ZHX0hTSV8yX0JPVFRPTQorZXJyOiBIU0lfMiBub3Qgc3VwcG9ydGVkIGZvciBILUk7CS8vIENvbXBhdGliaWxpdHkgZm9yIEhTSSBJL0YKKyNlbmRpZiAvLyBIQ0ZfQ0ZHX0hTSV8yX1RPUCAvIEhDRl9DRkdfSFNJXzJfQk9UVE9NCisKKyNpZiBkZWZpbmVkIEhDRl9DRkdfSFNJXzNfVE9QIHx8IGRlZmluZWQgSENGX0NGR19IU0lfM19CT1RUT00KK2VycjogSFNJXzMgbm90IHN1cHBvcnRlZCBmb3IgSC1JOwkvLyBDb21wYXRpYmlsaXR5IGZvciBIU0kgSS9GCisjZW5kaWYgLy8gSENGX0NGR19IU0lfM19UT1AgLyBIQ0ZfQ0ZHX0hTSV8zX0JPVFRPTQorCisjaWZkZWYgSENGX0NGR19IU0lfNF9UT1AgCQkJCQkJCQkJLy8gVG9wIENvbXBhdGliaWxpdHkgZm9yIEhTSSBJL0YKKyNpZiBIQ0ZfQ0ZHX0hTSV80X1RPUCA9PSAwIHx8IFwKKwlDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzRfQk9UVE9NIDw9IENGX0NGR19IU0lfNF9UT1AgJiYgSENGX0NGR19IU0lfNF9UT1AgPD0gQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV80X1RPUAorI3VuZGVmIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9UT1AKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV80X1RPUAlIQ0ZfQ0ZHX0hTSV80X1RPUAorI2Vsc2UKK2VycjogOworI2VuZGlmCisjZW5kaWYgLy8gSENGX0NGR19IU0lfNF9UT1AKKworI2lmZGVmIEhDRl9DRkdfSFNJXzRfQk9UVE9NCQkJCQkJCQkvLyBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgSFNJIEkvRgorI2lmIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9CT1RUT00gPD0gSENGX0NGR19IU0lfNF9CT1RUT00gJiYgSENGX0NGR19IU0lfNF9CT1RUT00gPD0gQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV80X1RPUAorI3VuZGVmIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9CT1RUT00KKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV80X0JPVFRPTQlIQ0ZfQ0ZHX0hTSV80X0JPVFRPTQorI2Vsc2UKK2VycjogOworI2VuZGlmCisjZW5kaWYgLy8gSENGX0NGR19IU0lfNF9CT1RUT00KKworI2lmZGVmIEhDRl9DRkdfSFNJXzVfVE9QIAkJCQkJCQkJCS8vIFRvcCBDb21wYXRpYmlsaXR5IGZvciBIU0kgSS9GCisjaWYgSENGX0NGR19IU0lfNV9UT1AgPT0gMCB8fCBcCisJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV81X0JPVFRPTSA8PSBDRl9DRkdfSFNJXzVfVE9QICYmIEhDRl9DRkdfSFNJXzVfVE9QIDw9IENGR19EUlZfQUNUX1JBTkdFU19IU0lfNV9UT1AKKyN1bmRlZiBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzVfVE9QCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNV9UT1AJSENGX0NGR19IU0lfNV9UT1AKKyNlbHNlCitlcnI6IDsKKyNlbmRpZgorI2VuZGlmIC8vIEhDRl9DRkdfSFNJXzVfVE9QCisKKyNpZmRlZiBIQ0ZfQ0ZHX0hTSV81X0JPVFRPTQkJCQkJCQkJLy8gQm90dG9tIENvbXBhdGliaWxpdHkgZm9yIEhTSSBJL0YKKyNpZiBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzVfQk9UVE9NIDw9IEhDRl9DRkdfSFNJXzVfQk9UVE9NICYmIEhDRl9DRkdfSFNJXzVfQk9UVE9NIDw9IENGR19EUlZfQUNUX1JBTkdFU19IU0lfNV9UT1AKKyN1bmRlZiBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzVfQk9UVE9NCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNV9CT1RUT00JSENGX0NGR19IU0lfNV9CT1RUT00KKyNlbHNlCitlcnI6IDsKKyNlbmRpZgorI2VuZGlmIC8vIEhDRl9DRkdfSFNJXzVfQk9UVE9NCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIGRlZmluZWQgSENGX0NGR19BUEZfMV9UT1AgfHwgZGVmaW5lZCBIQ0ZfQ0ZHX0FQRl8xX0JPVFRPTQorZXJyOiBBUEZfMSBub3Qgc3VwcG9ydGVkIGZvciBILUk7CS8vIENvbXBhdGliaWxpdHkgZm9yIEFQIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2VuZGlmIC8vIEhDRl9DRkdfQVBGXzFfVE9QIC8gSENGX0NGR19BUEZfMV9CT1RUT00KKworI2lmZGVmIEhDRl9DRkdfQVBGXzJfVE9QICAgICAgICAgICAgICAgICAgCQkJCQkvLyBUb3AgQ29tcGF0aWJpbGl0eSBmb3IgQVAgRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjaWYgSENGX0NGR19BUEZfMl9UT1AgPT0gMCB8fCBcCisJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8yX0JPVFRPTSA8PSBIQ0ZfQ0ZHX0FQRl8yX1RPUCAmJiBIQ0ZfQ0ZHX0FQRl8yX1RPUCA8PSBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzJfVE9QCisjdW5kZWYgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8yX1RPUAorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzJfVE9QCUhDRl9DRkdfQVBGXzJfVE9QCisjZWxzZQorZXJyOiA7CisjZW5kaWYKKyNlbmRpZiAvLyBIQ0ZfQ0ZHX0FQRl9UT1AKKworI2lmZGVmIEhDRl9DRkdfQVBGXzJfQk9UVE9NICAgICAgICAgICAgICAgICAgICAgICAJCQkvLyBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgQVAgRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjaWYgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8yX0JPVFRPTSA8PSBIQ0ZfQ0ZHX0FQRl8yX0JPVFRPTSAmJiBIQ0ZfQ0ZHX0FQRl8yX0JPVFRPTSA8PSBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzJfVE9QCisjdW5kZWYgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8yX0JPVFRPTQorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzJfQk9UVE9NCUhDRl9DRkdfQVBGXzJfQk9UVE9NCisjZWxzZQorZXJyOiA7CisjZW5kaWYKKyNlbmRpZiAvLyBIQ0ZfQ0ZHX0FQRl9CT1RUT00KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiBkZWZpbmVkIEhDRl9DRkdfU1RBXzFfVE9QIHx8IGRlZmluZWQgSENGX0NGR19TVEFfMV9CT1RUT00KK2VycjogU1RBXzEgbm90IHN1cHBvcnRlZCBmb3IgSC1JOwkvLyBDb21wYXRpYmlsaXR5IGZvciBTdGF0aW9uIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2VuZGlmIC8vIEhDRl9DRkdfU1RBXzFfVE9QIC8gSENGX0NGR19TVEFfMV9CT1RUT00KKworI2lmZGVmIEhDRl9DRkdfU1RBXzJfVE9QICAgICAgICAgICAgICAgICAgCQkJCQkvLyBUb3AgQ29tcGF0aWJpbGl0eSBmb3IgU3RhdGlvbiBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNpZiBIQ0ZfQ0ZHX1NUQV8yX1RPUCA9PSAwIHx8IFwKKwlDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzJfQk9UVE9NIDw9IEhDRl9DRkdfU1RBXzJfVE9QICYmIEhDRl9DRkdfU1RBXzJfVE9QIDw9IENGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9UT1AKKyN1bmRlZiBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzJfVE9QCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9UT1AJSENGX0NGR19TVEFfMl9UT1AKKyNlbHNlCitlcnI6IDsKKyNlbmRpZgorI2VuZGlmIC8vIEhDRl9DRkdfU1RBX1RPUAorCisjaWZkZWYgSENGX0NGR19TVEFfMl9CT1RUT00gICAgICAgICAgICAgICAgICAgICAgIAkJCS8vIEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBTdGF0aW9uIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2lmIENGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9CT1RUT00gPD0gSENGX0NGR19TVEFfMl9CT1RUT00gJiYgSENGX0NGR19TVEFfMl9CT1RUT00gPD0gQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8yX1RPUAorI3VuZGVmIENGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9CT1RUT00KKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8yX0JPVFRPTQlIQ0ZfQ0ZHX1NUQV8yX0JPVFRPTQorI2Vsc2UKK2VycjogOworI2VuZGlmCisjZW5kaWYgLy8gSENGX0NGR19TVEFfQk9UVE9NCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTUFDUk9TICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBtaW4gYW5kIG1heCBtYWNyb3MgKi8KKyNpZiAhIGRlZmluZWQgbWF4CisjZGVmaW5lIG1heChhLGIpICAJCSgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKKyNlbmRpZgorI2lmICEgZGVmaW5lZCBtaW4KKyNkZWZpbmUgbWluKGEsYikgIAkJKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorI2VuZGlmCisKKyNpZmRlZiBIQ0ZfU0xFRVAKKyNpZiBkZWZpbmVkIE1TRl9XQUlUCitlcnI6IE1TRiBzaG91bGQgbm8gbG9uZ2VyIHN1cHBseSB0aGlzIG1hY3JvOworI2Vsc2UKKyNkZWZpbmUgTVNGX1dBSVQoeCkgCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwl7IFBST1RfQ05UX0lOSQkJCQkJCQkJCQkJCQkJXAorCQlIQ0ZfV0FJVF9XSElMRSggKCBJUFcoIEhSRUdfSU8gKSAmIEhSRUdfSU9fV09LRU5fVVAgKSA9PSAwICk7CQkJCQkJXAorCQlIQ0ZBU1NFUlQoIHByb3RfY250LCBJUFcoIEhSRUdfSU8gKSApCQkJCQkJCVwKKwl9CisjZW5kaWYgLy8gTVNGX1dBSVQKKyNlbHNlCisjZGVmaW5lIE1TRl9XQUlUKHgpCS8qTk9QKi8KKyNlbmRpZiAvLyBIQ0ZfU0xFRVAKKworI2RlZmluZSBMT0YoeCkgCQkJKHNpemVvZih4KS9zaXplb2YoaGNmXzE2KS0xKQorCisjZGVmaW5lIE1VTF9CWV8yKCB4ICkJKCAoeCkgPDwgMSApCQkJCQkJLy91c2VkIHRvIG11bHRpcGx5IGJ5IDIKKyNkZWZpbmUgRElWX0JZXzIoIHggKQkoICh4KSA+PiAxICkJCQkJCQkvL3VzZWQgdG8gZGl2aWRlIGJ5IDIKKworLy9yZXNvbHZlIHByb2JsZW1zIG9uIGZvciBzb21lIDE2IGJpdHMgY29tcGlsZXJzIHRvIGNyZWF0ZSAzMiBiaXQgdmFsdWVzCisjZGVmaW5lIE1FUkdFXzIoIGh3LCBsdyApCSggKCAoKGhjZl8zMikoaHcpKSA8PCAxNiApIHwgKChoY2ZfMTYpKGx3KSkgKQorCisjaWYgISBkZWZpbmVkIEhDRl9TVEFUSUMKKyNkZWZpbmUJCSAgSENGX1NUQVRJQwlzdGF0aWMKKyNlbmRpZiAvLwkgIEhDRl9TVEFUSUMKKworI2lmICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0hJSTUgKSA9PSAwCisjZGVmaW5lIERBV0FfQUNLKCBtYXNrKSB7CQkJCQkJCQkJCQkJCVwKKwlPUFcoIEhSRUdfRVZfQUNLLCBtYXNrIHwgSFJFR19FVl9BQ0tfUkVHX1JFQURZICk7CQkJCQkJXAorCU9QVyggSFJFR19FVl9BQ0ssIChtYXNrICYgfkhSRUdfRVZfQUxMT0MpIHwgSFJFR19FVl9BQ0tfUkVHX1JFQURZICk7IAl9CisjZGVmaW5lIERBV0FfWkVST19GSUQocmVnKSBPUFcoIHJlZywgMCApOworI2Vsc2UKKyNkZWZpbmUgREFXQV9BQ0soIG1hc2spICAgT1BXKCBIUkVHX0VWX0FDSywgbWFzayApOworI2RlZmluZSBEQVdBX1pFUk9fRklEKHJlZykKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9ISUk1CisKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCisjZGVmaW5lCUNBTENfUlhfTUlDKCBwLCBsZW4gKSBjYWxjX21pY19yeF9mcmFnKCBpZmJwLCBwLCBsZW4gKQorI2RlZmluZQlDQUxDX1RYX01JQyggcCwgbGVuICkgY2FsY19taWNfdHhfZnJhZyggaWZicCwgcCwgbGVuICkKKyNkZWZpbmUgSUZfU1NOKHgpICB4CisjZGVmaW5lIElGX05PVF9TU04oeCkKKyNlbHNlCisjZGVmaW5lCUNBTENfUlhfTUlDKCBwLCBsZW4gKQorI2RlZmluZQlDQUxDX1RYX01JQyggcCwgbGVuICkKKyNkZWZpbmUgTUlDX1JYX1JUTiggbWljLCBkdyApCisjZGVmaW5lIE1JQ19UWF9SVE4oIG1pYywgZHcgKQorI2RlZmluZSBJRl9TU04oeCkKKyNkZWZpbmUgSUZfTk9UX1NTTih4KSB4CisjZW5kaWYgLy8gSENGX1RZUEVfV1BBCisKKyNpZiBIQ0ZfVEFMTElFUyAmIEhDRl9UQUxMSUVTX0hDRgkJLy9IQ0YgdGFsbHkgc3VwcG9ydAorI2RlZmluZSBJRl9UQUxMWSh4KSAgeAorI2Vsc2UKKyNkZWZpbmUgSUZfVEFMTFkoeCkKKyNlbmRpZiAvLyBIQ0ZfVEFMTElFU19IQ0YKKworCisjaWYgSENGX0RNQQorI2RlZmluZSBJRl9ETUEoeCkJCQl4CisjZGVmaW5lIElGX05PVF9ETUEoeCkKKyNkZWZpbmUgSUZfVVNFX0RNQSh4KSAJCWlmICggICBpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEgICkgeAorI2RlZmluZSBJRl9OT1RfVVNFX0RNQSh4KQlpZiAoICEoaWZicC0+SUZCX0NudGxPcHQgJiBVU0VfRE1BKSApIHgKKyNlbHNlCisjZGVmaW5lIElGX0RNQSh4KQorI2RlZmluZSBJRl9OT1RfRE1BKHgpCQl4CisjZGVmaW5lIElGX1VTRV9ETUEoeCkKKyNkZWZpbmUgSUZfTk9UX1VTRV9ETUEoeCkgCXgKKyNlbmRpZiAvLyBIQ0ZfRE1BCisKKworI2RlZmluZSBJUFcoeCkgKChoY2ZfMTYpSU5fUE9SVF9XT1JEKCBpZmJwLT5JRkJfSU9CYXNlICsgKHgpICkgKQorI2RlZmluZSBPUFcoeCwgeSkgT1VUX1BPUlRfV09SRCggaWZicC0+SUZCX0lPQmFzZSArICh4KSwgeSApCisJLyogbWFrZSBzdXJlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBIQ0ZfV0FJVF9XSElMRSBpcyBzdWNoIHRoYXQgdGhlcmUgbWF5IGJlIG11bHRpcGxlIEhDRl9XQUlUX1dISUxFIGNhbGxzCisJICogaW4gYSByb3cgYW5kIHRoYXQgd2hlbiBvbmUgZmFpbHMgYWxsIHN1YnNlcXVlbnQgZmFpbCBpbW1lZGlhdGVseSB3aXRob3V0IHJlaW5pdGlhbGl6YXRpb24gb2YgcHJvdF9jbnQKKwkgKi8KKyNpZiBIQ0ZfUFJPVF9USU1FID09IDAKKyNkZWZpbmUgUFJPVF9DTlRfSU5JCisjZGVmaW5lIElGX1BST1RfVElNRSh4KQorI2lmIGRlZmluZWQgSENGX1lJRUxECisjZGVmaW5lIEhDRl9XQUlUX1dISUxFKCB4ICkgd2hpbGUgKCAoeCkgJiYgKEhDRl9ZSUVMRCkgKSAvKk5PUCovOworI2Vsc2UKKyNkZWZpbmUgSENGX1dBSVRfV0hJTEUoIHggKSB3aGlsZSAoIHggKSAvKk5PUCovOworI2VuZGlmIC8vIEhDRl9ZSUVMRAorI2Vsc2UKKyNkZWZpbmUgUFJPVF9DTlRfSU5JIAloY2ZfMzIgcHJvdF9jbnQgPSBpZmJwLT5JRkJfVGlja0luaTsKKyNkZWZpbmUgSUZfUFJPVF9USU1FKHgpCXgKKyNpZiBkZWZpbmVkIEhDRl9ZSUVMRAorI2RlZmluZSBIQ0ZfV0FJVF9XSElMRSggeCApIHdoaWxlICggcHJvdF9jbnQgJiYgKHgpICYmIChIQ0ZfWUlFTEQpICkgcHJvdF9jbnQtLTsKKyNlbHNlCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNkZWZpbmUgSENGX1dBSVRfV0hJTEUoIHggKSB3aGlsZSAoIHByb3RfY250ICYmICh4KSApIHsgdWRlbGF5KDIpOyBwcm90X2NudC0tOyB9CisjZW5kaWYgLy8gSENGX1lJRUxECisjZW5kaWYgLy8gSENGX1BST1RfVElNRQorCisjaWYgZGVmaW5lZCBIQ0ZfRVhfSU5UCisvLyNpZiBIQ0ZfRVhfSU5UICYgfiggSENGX0VYX0lOVF9UWF9FWCB8IEhDRl9FWF9JTlRfVFhfT0sgfCBIQ0ZfRVhfSU5UX1RJQ0sgKQorOz8gb3V0IGRhdGVkIGNoZWNraW5nCitlcnI6IHlvdSB1c2VkIGFuIGludmFsaWQgYml0bWFzazsKKy8vICNlbmRpZiAvLyBIQ0ZfRVhfSU5UIHZhbGlkYXRpb24KKy8vICNlbHNlCisvLyAjZGVmaW5lIEhDRl9FWF9JTlQgMHgwMDAKKyNlbmRpZiAvLyBIQ0ZfRVhfSU5UCisKKyNpZiAwIC8vZ2V0IGNvbXBpbGVyIGdvaW5nCisjaWYgSENGX0VYX0lOVF9USUNLCSE9IEhSRUdfRVZfVElDSworOz8gb3V0IGRhdGVkIGNoZWNraW5nCitlcnI6IHNvbWVvbmUgcmVkZWZpbmVkIHRoZXNlIG1hY3JvcyB3aGlsZSB0aGUgaW1wbGVtZW5hdGlvbiBhc3N1bWVzIHRoZXkgYXJlIGVxdWFsOworI2VuZGlmCisjaWYgSENGX0VYX0lOVF9UWF9PSyAhPSBIRlNfVFhfQ05UTF9UWF9PSyB8fCBIRlNfVFhfQ05UTF9UWF9PSyAhPSBIUkVHX0VWX1RYX09LCis7PyBvdXQgZGF0ZWQgY2hlY2tpbmcKK2Vycjogc29tZW9uZSByZWRlZmluZWQgdGhlc2UgbWFjcm9zIHdoaWxlIHRoZSBpbXBsZW1lbmF0aW9uIGFzc3VtZXMgdGhleSBhcmUgZXF1YWw7CisjZW5kaWYKKyNpZiBIQ0ZfRVhfSU5UX1RYX0VYICE9IEhGU19UWF9DTlRMX1RYX0VYIHx8IEhGU19UWF9DTlRMX1RYX0VYICE9IEhSRUdfRVZfVFhfRVgKKzs/IG91dCBkYXRlZCBjaGVja2luZworZXJyOiBzb21lb25lIHJlZGVmaW5lZCB0aGVzZSBtYWNyb3Mgd2hpbGUgdGhlIGltcGxlbWVuYXRpb24gYXNzdW1lcyB0aGV5IGFyZSBlcXVhbDsKKyNlbmRpZgorI2VuZGlmIC8vIDAgZ2V0IGNvbXBpbGVyIGdvaW5nCisKKworLyogVGhlIGFzc2VydCBpbiBIQ0ZMT0dFTlRSWSBjaGVja3MgYWdhaW5zdCByZS1lbnRyYW5jeS4gUmUtZW50cmFuY3kgY291bGQgYmUgY2F1c2VkIGJ5IE1TRiBsb2dpYyBhdAorICogdGFzay1sZXZlbCBjYWxsaW5nIGhjZl9mdW5jdGlvbnMgd2l0aG91dCBzaGllbGRpbmcgd2l0aCBIQ0ZfQUNUX09OL19PRkYuIFdoZW4gYW4gaW50ZXJydXB0IG9jY3VycywKKyAqIHRoZSBJU1IgY291bGQgKGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5KSBjYXVzZSByZS1lbnRlcmluZyBvZiB0aGUgaW50ZXJydXB0ZWQgSENGLXJvdXRpbmUuCisgKgorICogVGhlICIoaWZicC0+SUZCX0Fzc2VydFdoZXJlID0gd2hlcmUpIiB0ZXN0IGluIEhDRkxPR0VOVFJZIHNlcnZpY2VzIEFMU08gYXMgYSBzdGF0ZW1lbnQgdG8gZ2V0IGFyb3VuZDoKKyAqICNwcmFnbWEgd2FybmluZzogY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBjb25zdGFudAorICogb24gdGhlIGlmLXN0YXRlbWVudAorICovCisjaWYgSENGX0FTU0VSVAorI2RlZmluZSBIQ0ZBU1NFUlQoeCxxKSB7aWYgKCEoeCkpIHttZGRfYXNzZXJ0KCAgICAgICAgaWZicCwgX19MSU5FX18gICAgICAgICAgICAgICAgICAgLCBxICk7fX0KKyNkZWZpbmUgTU1EQVNTRVJUKHgscSkge2lmICghKHgpKSB7bWRkX2Fzc2VydCggYXNzZXJ0X2lmYnAsIF9fTElORV9fICsgRklMRV9OQU1FX09GRlNFVCwgcSApO319CisKKyNkZWZpbmUgSENGTE9HRU5UUlkoIHdoZXJlLCB3aGF0ICkgCQkJCQkJCQkJCQkJCQlcCit7aWYgKCAoaWZicC0+SUZCX0Fzc2VydFdoZXJlID0gd2hlcmUpIDw9IDE1ICkgewkJCQkJCQkJCQkJXAorCUhDRl9FTlRSWSggaWZicCApOyAJCQkJCQkJCQkJCQkJCQkJCVwKKwlIQ0ZBU1NFUlQoIChpZmJwLT5JRkJfQXNzZXJ0VHJhY2UgJiAxPDwoKHdoZXJlKSYweEYpKSA9PSAwLCBpZmJwLT5JRkJfQXNzZXJ0VHJhY2UgKTsJCVwKKwlpZmJwLT5JRkJfQXNzZXJ0VHJhY2UgfD0gMTw8KCh3aGVyZSkmMHhGKTsJCQkJCQkJCQkJCQlcCisJfQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKK0hDRlRSQUNFKGlmYnAsIHdoZXJlICkJCQkJCQkJCQkJCQkJCQkJCVwKK0hDRlRSQUNFVkFMVUUoaWZicCwgd2hhdCApCQkJCQkJCQkJCQkJCQkJCVwKK30KKworI2RlZmluZSBIQ0ZMT0dFWElUKCB3aGVyZSApIAkJCQkJCQkJCQkJCQkJCVwKK3tpZiAoIChpZmJwLT5JRkJfQXNzZXJ0V2hlcmUgPSB3aGVyZSkgPD0gMTUgKSB7CQkJCQkJCQkJCQlcCisgIAlIQ0ZfRVhJVCggaWZicCApOyAJCQkJCQkJCQkJCQkJCQkJCVwKKwlpZmJwLT5JRkJfQXNzZXJ0VHJhY2UgJj0gfigxPDwoKHdoZXJlKSYweEYpKTsJCQkJCQkJCQkJCQlcCisJfQkJCQkJCSAJCQkJCQkJCQkJCQkJCQlcCitIQ0ZUUkFDRShpZmJwLCAod2hlcmUpfEhDRl9UUkFDRV9FWElUICkJCQkJCQkJCQkJCQkJXAorfQorCisjZWxzZSAvLyBIQ0ZfQVNTRVJUCisjZGVmaW5lIEhDRkFTU0VSVCggeCwgcSApCisjZGVmaW5lIE1NREFTU0VSVCggeCwgcSApCisjZGVmaW5lIEhDRkxPR0VOVFJZKCB3aGVyZSwgd2hhdCApIAkgIAl7SENGX0VOVFJZKCBpZmJwICk7fQorI2RlZmluZSBIQ0ZMT0dFWElUKCB3aGVyZSApIAkJICAJe0hDRl9FWElUKCBpZmJwICk7fQorI2VuZGlmIC8vIEhDRl9BU1NFUlQKKworI2lmIEhDRl9JTlRfT04KKy8qIDs/IEhDRkFTU0VSVF9JTlQKKyAqICNpZiAoSENGX1NMRUVQKSAmIEhDRl9ERFMKKyAqICNkZWZpbmUgSENGQVNTRVJUX0lOVCBIQ0ZBU1NFUlQoIGlmYnAtPklGQl9JbnRPZmZDbnQgIT0gMHhGRkZGICYmIGlmYnAtPklGQl9JbnRPZmZDbnQgIT0gMHhGRkZFLCBcCisgKiAJCQkJCQkJCSBpZmJwLT5JRkJfSW50T2ZmQ250ICkKKyAqICNlbHNlCisgKi8KKyNkZWZpbmUgSENGQVNTRVJUX0lOVCBIQ0ZBU1NFUlQoIGlmYnAtPklGQl9JbnRPZmZDbnQgIT0gMHhGRkZGLCBpZmJwLT5JRkJfSW50T2ZmQ250ICkKKy8vICNlbmRpZiAvLyBIQ0ZfRERTCisjZWxzZQorI2RlZmluZSBIQ0ZBU1NFUlRfSU5UCisjZW5kaWYgLy8gSENGX0lOVF9PTgorCisKKyNpZiBkZWZpbmVkIEhDRl9UUkFDRQorI2RlZmluZSBIQ0ZUUkFDRShpZmJwLCB3aGVyZSApCSAgIHtPUFcoIEhSRUdfU1dfMSwgd2hlcmUgKTt9CisvLyNkZWZpbmUgSENGVFJBQ0UoaWZicCwgd2hlcmUgKQkgICB7SENGQVNTRVJUKCBET19BU1NFUlQsIHdoZXJlICk7fQorI2RlZmluZSBIQ0ZUUkFDRVZBTFVFKGlmYnAsIHdoYXQgKSB7T1BXKCBIUkVHX1NXXzIsIHdoYXQgICk7fQorLy8jZGVmaW5lIEhDRlRSQUNFVkFMVUUoaWZicCwgd2hhdCApIHtIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgd2hhdCAgKTt9CisjZWxzZQorI2RlZmluZSBIQ0ZUUkFDRShpZmJwLCB3aGVyZSApCisjZGVmaW5lIEhDRlRSQUNFVkFMVUUoaWZicCwgd2hhdCApCisjZW5kaWYgLy8gSENGX1RSQUNFCisKKworI2lmIEhDRl9CSUdfRU5ESUFOCisjZGVmaW5lIEJFX1BBUih4KQkJCQkseAorI2Vsc2UKKyNkZWZpbmUgQkVfUEFSKHgpCisjZW5kaWYgLy8gSENGX0JJR19FTkRJQU4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRU5EIE9GIE1BQ1JPUyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgUFJPVE9UWVBFUyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBIQ0ZfQVNTRVJUCitleHRlcm4gSUZCUCBCQVNFRCBhc3NlcnRfaWZicDsJCQkvL3RvIG1ha2UgYXNzZXJ0cyBlYXNpbHkgd29yayB1bmRlciBNTUQgYW5kIERIRgorRVhURVJOX0Mgdm9pZAkJIG1kZF9hc3NlcnQJCQkoSUZCUCBpZmJwLCB1bnNpZ25lZCBpbnQgbGluZV9udW1iZXIsIGhjZl8zMiBxICk7CisjZW5kaWYgLy9IQ0ZfQVNTRVJUCisKKyNpZiAhICggKEhDRl9JTykgJiBIQ0ZfSU9fMzJCSVRTICkJCQkJLy8gZGVmaW5lZCAxNiBiaXRzIG9ubHkKKyN1bmRlZiBPVVRfUE9SVF9TVFJJTkdfMzIKKyN1bmRlZiBJTl9QT1JUX1NUUklOR18zMgorI2VuZGlmIC8vIEhDRl9JTworI2VuZGlmCS8vSENGREVGQ19ICisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL21hbi93bGFnczQ5LjQgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9tYW4vd2xhZ3M0OS40Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNDU4ODUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9tYW4vd2xhZ3M0OS40CkBAIC0wLDAgKzEsNzM0IEBACisuXCIgdmltOnR3PTc4OgorLlwiIENvcHlyaWdodCAoYykgMTk5OS0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLiAtLSBodHRwOi8vd3d3LmFnZXJlLmNvbQorLlwiIHdsYWdzNDkuNCA3LjIwLWFiZyAwNC8yOC8yMDA0IDEzOjMwOjAwCisuXCIKKy5USCBXTEFHUzQ5IDQgIjA0LzI4LzIwMDQgMTM6MzA6MDAiICJwY21jaWEtY3MiCisuU0ggTkFNRQord2xhZ3M0OSBcLSBBZ2VyZSBTeXN0ZW1zIFdpcmVsZXNzIFBDIENhcmQgLyBQQ0kgZGV2aWNlIGRyaXZlcnMKKword2xhZ3M0OV9oMl9jcy5vIFwtIEhlcm1lcy1JSSBDYXJkIFNlcnZpY2VzIChQQ01DSUEvQ0YpIGRyaXZlcgorLmJyCit3bGFnczQ5X2gyLm8gICAgXC0gSGVybWVzLUlJIE1pbmlQQ0kgZHJpdmVyCisuYnIKK3dsYWdzNDlfaDI1Lm8gICBcLSBIZXJtZXMtSUkuNSBQQ0kvQ2FyZEJ1cyBkcml2ZXIKKy5icgord2xhZ3M0OV9oMjVfY3Mub1wtIEhlcm1lcy1JSS41IENhcmQgU2VydmljZXMgKFBDTUNJQS9DRikgZHJpdmVyCisKKy5TSCBTWU5PUFNJUworLm5oCisuZmkKKy5CIGluc21vZCB3bGFnczQ5X1toMSxoMl1fW2NzXS5vCisuYnIKKy5SQiBbIEF1dGhlbnRpY2F0aW9uPW4gXQorLlJCIFsgQXV0aEtleU1uZ210U3VpdGU9Pz8/PyBdCisuUkIgWyBCUlNDMkdIej1iIF1ccAorLlJCIFsgQlJTQzVHSHo9YiBdCisuUkIgWyBDb2V4aXN0ZW5jZT1uIF0KKy5SQiBbIENvbmZpZ3VyZWQ9Pz8/PyBdXHAKKy5SQiBbIENvbm5lY3Rpb25Db250cm9sPT8/Pz8gXQorLlJCIFsgQ3JlYXRlSUJTUz1zIF0KKy5SQiBbIERlYnVnRmxhZz1uIF1ccAorLlJCIFsgRGVzaXJlZFNTSUQ9cyBdCisuUkIgWyBEb3dubG9hZEZpcm13YXJlPW4gXQorLlJCIFsgRHJpdmVyRW5hYmxlPT8/Pz8gXVxwCisuUkIgWyBFbmFibGVFbmNyeXB0aW9uPXMgXQorLlJCIFsgRW5jcnlwdGlvbj0/Pz8/IF0KKy5SQiBbIEV4Y2x1ZGVVbmVuY3J5cHRlZD1zIF1ccAorLlJCIFsgSW50cmFCU1NSZWxheT1zIF0KKy5SQiBbIElycUxpc3Q9aSxqLC4uLiBdCisuUkIgWyBJcnFNYXNrPW4gXVxwCisuUkIgWyBLZXkxPXMgXQorLlJCIFsgS2V5Mj1zIF0KKy5SQiBbIEtleTM9cyBdCisuUkIgWyBLZXk0PXMgXVxwCisuUkIgWyBMb2FkQmFsYW5jaW5nPXMgXQorLlJCIFsgTWF4U2xlZXBEdXJhdGlvbj1uIF0KKy5SQiBbIE1lZGl1bURpc3RyaWJ1dGlvbj1zIF1ccAorLlJCIFsgTWljcm9XYXZlUm9idXN0bmVzcz1zIF0KKy5SQiBbIE11bHRpY2FzdFBNQnVmZmVyaW5nPXMgXQorLlJCIFsgTXVsdGljYXN0UmF0ZT1uIF1ccAorLlJCIFsgTXVsdGljYXN0UmVjZWl2ZT1zIF0KKy5SQiBbIE5ldHdvcmtBZGRyZXNzPW4sbixuLG4sbixuIF0KKy5SQiBbIE5ldHdvcmtUeXBlPT8/Pz8gXVxwCisuUkIgWyBPd25BVElNV2luZG93PW4gXQorLlJCIFsgT3duQmVhY29uSW50ZXJ2YWw9biBdCisuUkIgWyBPd25DaGFubmVsPW4gXVxwCisuUkIgWyBPd25EVElNUGVyaW9kPW4gXQorLlJCIFsgT3duTmFtZT1zIF0KKy5SQiBbIE93blNTSUQ9cyBdXHAKKy5SQiBbIHBjX2RlYnVnPW4gXQorLlJCIFsgUE1FbmFibGVkPWIgXQorLlJCIFsgUE1Ib2xkb3ZlckR1cmF0aW9uPW4gXVxwCisuUkIgWyBQb3J0VHlwZT1uIF0KKy5SQiBbIFBvd2VyTW9kZT0/Pz8/IF0KKy5SQiBbIFByb21pc2N1b3VzTW9kZT1zIF1ccAorLlJCIFsgUmVqZWN0QU5ZPXMgXQorLlJCIFsgUlRTVGhyZXNob2xkPW4gXVxwCisuUkIgWyBSVFNUaHJlc2hvbGQxPW4gXQorLlJCIFsgUlRTVGhyZXNob2xkMj1uIF0KKy5SQiBbIFJUU1RocmVzaG9sZDM9biBdXHAKKy5SQiBbIFJUU1RocmVzaG9sZDQ9biBdCisuUkIgWyBSVFNUaHJlc2hvbGQ1PW4gXQorLlJCIFsgUlRTVGhyZXNob2xkNj1uIF1ccAorLlJCIFsgU1JTQzJHSHo9YiBdCisuUkIgWyBTUlNDNUdIej1iIF0KKy5SQiBbIFN5c3RlbVNjYWxlPW4gXVxwCisuUkIgWyBUeEtleT1uIF0KKy5SQiBbIFR4UmF0ZUNvbnRyb2w9biBdXHAKKy5SQiBbIFR4UmF0ZUNvbnRyb2wxPW4gXQorLlJCIFsgVHhSYXRlQ29udHJvbDI9biBdCisuUkIgWyBUeFJhdGVDb250cm9sMz1uIF1ccAorLlJCIFsgVHhSYXRlQ29udHJvbDQ9biBdCisuUkIgWyBUeFJhdGVDb250cm9sNT1uIF0KKy5SQiBbIFR4UmF0ZUNvbnRyb2w2PW4gXVxwCisuUkIgWyBXRFNBZGRyZXNzPW4sbixuLG4sbixuIF1ccAorLlJCIFsgV0RTQWRkcmVzczE9bixuLG4sbixuLG4gXQorLlJCIFsgV0RTQWRkcmVzczI9bixuLG4sbixuLG4gXVxwCisuUkIgWyBXRFNBZGRyZXNzMz1uLG4sbixuLG4sbiBdCisuUkIgWyBXRFNBZGRyZXNzND1uLG4sbixuLG4sbiBdXHAKKy5SQiBbIFdEU0FkZHJlc3M1PW4sbixuLG4sbixuIF0KKy5SQiBbIFdEU0FkZHJlc3M2PW4sbixuLG4sbixuIF1ccAorLmZpCisKKworCisuU0ggREVTQ1JJUFRJT04KKy5JIHdsYWdzNDkKK2lzIHRoZSBsb3ctbGV2ZWwgQ2FyZCBTZXJ2aWNlcyAvIFBDSSBkcml2ZXIgZm9yIHRoZQorLkIgV2lyZWxlc3MgUEMgQ2FyZCwgV2lyZWxlc3MgSW50ZWdyYXRlZCBDYXJkLCBXaXJlbGVzcyBFbWJlZGRlZCBDYXJkCithbmQgb3RoZXIgd2lyZWxlc3MgYWRhcHRlcnMgYmFzZWQgb24gdGhlIEFnZXJlIFN5c3RlbXMgSGVybWVzLUlJLCBhbmQgSGVybWVzLUlJLjUgd2lyZWxlc3MgTUFDLiBXaGVuIHRoaXMgZHJpdmVyIGlzIGF0dGFjaGVkIHRvIGEgY2FyZCwgaXQKK2FsbG9jYXRlcyB0aGUgbmV4dCBhdmFpbGFibGUgZXRoZXJuZXQgZGV2aWNlIChldGgwLi5ldGgjKS4gVGhpcworZGV2aWNlIG5hbWUgd2lsbCBiZSBwYXNzZWQgb24gdG8KKy5JUiBjYXJkbWdyICg4KSwKK29yIHRoZSBQQ0kgc3Vic3lzdGVtLCBmb3IgdGhlIGNhcmQgY29uZmlndXJhdGlvbiwgYW5kIHJlcG9ydGVkIGluIHRoZSBrZXJuZWwgbG9nIGZpbGUKK3dpdGggdGhlIEkvTyBiYXNlIGFkZHJlc3MgYW5kIE1BQyBhZGRyZXNzIHVzZWQgYnkgdGhlIGNhcmQuCisuU0ggRkVBVFVSRVMKKyBcLSBIb3QgcGx1Zy91bnBsdWcKKyBcLSBBY2Nlc3MgUG9pbnQgYW5kIHBlZXItdG8tcGVlciBjb21tdW5pY2F0aW9uCisgXC0gQ2FyZCBwb3dlciBtYW5hZ2VtZW50CisgXC0gU3VwcG9ydCBmb3IgSGVybWVzLUlJICYgSGVybWVzLUlJLjUgYmFzZWQgUENNQ0lBLCBNaW5pIFBDSSwgYW5kIENhcmRCdXMgY2FyZHMKKyBcLSBXaXJlZCBFcXVpdmFsZW50IFByaXZhY3kgKFdFUCkKKyBcLSBXUEEtUFNLIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkKKyBcLSBEcml2ZXIgdXRpbGl0eSBpbnRlcmZhY2UgKFVJTCkKKyBcLSBXaXJlbGVzcyBFeHRlbnNpb25zCisgXC0gU29mdHdhcmUgQVAgbW9kZQorLlNIIFBBUkFNRVRFUlMKKy5UUAorLkIgQXV0aGVudGljYXRpb249bgorQWxnb3JpdGhtIHVzZWQgZm9yIEF1dGhlbnRpY2F0aW9uLgorLkJSCisgICAgMSBcLSBPcGVuIFN5c3RlbQorLkJSCisgICAgMiBcLSBTaGFyZWQgS2V5CisuQlIKKyAgICBEZWZhdWx0OiAxCisuVFAKKy5CIEF1dGhfa2V5X21nbXRfc3VpdGUKKz8/Pz8/Pz8/Pz8/Pz8/PworLlRQCisuQiBCUlNDMkdIej1iCitTZXRzIHRoZSBjYXJkXCdzIEJhc2ljIFJhdGUgU2V0IGluIHRoZSAyLjRHSHogYmFuZC4gU2VlIFNSU0MyR0h6Citmb3IgdGhlIHZhbHVlXCdzIGZvcm1hdC4KKy5CUgorICAgIERlZmF1bHQ6IDE1IChvciAweDAwMEYsIG9ubHkgMTFiIHJhdGVzIHRvIGFjY2VwdCBsZWdhY3kgMTFiIHN0YXRpb25zKQorLlRQCisuQiBCUlNDNUdIei1iCitTZXRzIHRoZSBjYXJkXCdzIEJhc2ljIFJhdGUgU2V0IGluIHRoZSA1LjBHSHogYmFuZC4gU2VlIFNSU0MyR0h6IGZvciB0aGUKK3ZhbHVlXCdzIGZvcm1hdAorLkJSCisgICAgRGVmYXVsdDogNDA4MCAob3IgMHgwRkYwLCBhbGwgMTFhIHJhdGVzKQorLlRQCisuQiBDb2V4aXN0ZW5jZT1uCitVc2VkIHRvIG1ha2UgdGhlIDgwMi4xMWEvYi9nIGNvZXhpc3RlbmNlIGJlaGF2aW9yIG1vcmUgc3RyaWN0LgorLkJSCisgICAgRGVmYXVsdCBcLSAwIChVc2Ugc3RhbmRhcmQgYmVoYXZpb3IpCisuVFAKKy5CIENvbm5lY3Rpb25Db250cm9sPW4KK0NvbmZpZ3VyZXMgdGhlIGNhcmRcJ3MgY29ubmVjdGlvbiBjb250cm9sIHByb2Nlc3MgaW4gZGVhbGluZyB3aXRoIG11bHRpcGxlCitiYW5kcyAoODAyLjExYi9nIHZzLiA4MDIuMTFhKS4KKy5CUgorICAgIDAgXC0gU2luZ2xlIEJhbmQgb3BlcmF0aW9uIGluIDJHSHoKKy5CUgorICAgIDEgXC0gU2luZ2xlIEJhbmQgb3BlcmF0aW9uIGluIDVHSHoKKy5CUgorICAgIDIgXC0gTXVsdGlwbGUgQmFuZCBvcGVyYXRpb24gc3RhcnRpbmcgd2l0aCAyR0h6CisuQlIKKyAgICAzIFwtIE11bHRpcGxlIEJhbmQgb3BlcmF0aW9uIHN0YXJ0aW5nIHdpdGggNUdIegorLkJSCisgICAgRGVmYXVsdCBcLSAyCisuVFAKKy5CIENvbmZpZ3VyZWQKKz8/Pz8/Pz8/Pz8/Pz8/PworLlRQCisuQiBDb25uZWN0aW9uQ29udHJvbAorPz8/Pz8/Pz8/Pz8/Pz8/CisuVFAKKy5CIENyZWF0ZUlCU1M9cworRW5hYmxlIG9yIGRpc2FibGUgSUJTUyBDcmVhdGlvbi4KK0ZvciBjb3JyZWN0IG9wZXJhdGlvbiwgc3BlY2lmaWNhdGlvbiBvZiBhIE93blNTSUQgaXMgcmVxdWlyZWQuCitUaGlzIG1vZGUgcmVxdWlyZXMgZmlybXdhcmUgNi4wNCBvciBoaWdoZXIuCisuQlIKKyAgICBOIFwtIERpc2FibGUKKy5CUgorICAgIFkgXC0gRW5hYmxlCisuQlIKKyAgICBEZWZhdWx0OiBOCisuVFAKKy5CIERlYnVnRmxhZz1uCitTZWxlY3RzIHRoZSBkcml2ZXIgZGVidWdnaW5nIGxldmVsLiBUaGlzIHBhcmFtZXRlciBpcyBvbmx5IGF2YWlsYWJsZQoraWYgdGhlIG1vZHVsZSBpcyBjb21waWxlZCB3aXRoIGRlYnVnZ2luZyBlbmFibGVkLiBSZWZlciB0byB0aGUKK2ZpbGUKKy5CIGRlYnVnLmgKK2luIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGZvciBpbmZvcm1hdGlvbiBvbiB0aGUgZmxhZyB2YWx1ZXMuCisuQlIKKyAgICAweDAwMDAwMDAxTCBcLSBEQkdfRVJST1JfT04KKy5CUgorICAgIDB4MDAwMDAwMDJMIFwtIERCR19XQVJOSU5HX09OCisuQlIKKyAgICAweDAwMDAwMDA0TCBcLSBEQkdfTk9USUNFX09OCisuQlIKKyAgICAweDAwMDAwMDA4TCBcLSBEQkdfVFJBQ0VfT04KKy5CUgorICAgIDB4MDAwMDAwMTBMIFwtIERCR19WRVJCT1NFX09OCisuQlIKKyAgICAweDAwMDAwMDIwTCBcLSBEQkdfUEFSQU1fT04KKy5CUgorICAgIDB4MDAwMDAwNDBMIFwtIERCR19CUkVBS19PTgorLkJSCisgICAgMHgwMDAwMDEwMEwgXC0gREJHX1JYX09OCisuQlIKKyAgICAweDAwMDAwMjAwTCBcLSBEQkdfVFhfT04KKy5CUgorICAgIDB4MDAwMDA0MDBMIFwtIERCR19EU19PTgorLkJSCitJZiB0aGUgbW9kdWxlIGlzIGNvbXBpbGVkIHdpdGggZGVidWdnaW5nIGVuYWJsZWQsIERlYnVnRmxhZworZGVmYXVsdHMgdG8gREJHX0VSUk9SX09OLCBEQkdfV0FSTklOR19PTiBhbmQgREJHX0JSRUFLX09OLgorRGVidWdGbGFnIG92ZXJydWxlcyBwY19kZWJ1Zy4KKy5UUAorLkIgRGVzaXJlZFNTSUQ9cworU2FtZSBhcyBPd25TU0lELgorLlRQCisuQiBEb3dubG9hZEZpcm13YXJlPW4KK1RoaXMgcmVsZWFzZSBvZiB0aGUgZHJpdmVyIGludHJvZHVjZXMgdGhlIGFiaWxpdHkgdG8gcGVyZm9ybSBkb3dubG9hZHMgb2YgdGhlIFNUQS9BUAorZmlybXdhcmUuIEluIGZhY3QsIHRoaXMgaXMgcmVxdWlyZWQgZm9yIEhlcm1lcy1JSSBiYXNlZCBjYXJkcy4gVGhpcyBwYXJhbWV0ZXIgdGVsbHMKK3RoZSBkcml2ZXIgd2hpY2ggdmVyc2lvbiBvZiB0aGUgZmlybXdhcmUgdG8gZG93bmxvYWQgdG8gdGhlIGNhcmQuCisuQlIKKyAgICAwIFwtIE5vIGRvd25sb2FkIHBlcmZvcm1lZCAoSGVybWVzLUkgb25seSkKKy5CUgorICAgIDEgXC0gRG93bmxvYWQgU1RBIGZpcm13YXJlCisuQlIKKyAgICAyIFwtIERvd25sb2FkIEFQIGZpcm13YXJlCisuQlIKKyAgICBEZWZhdWx0OiAxLCB3aGVuIFNUQSBtb2RlIGZ1bmN0aW9uYWxpdHkgaXMKKyAgICAgICAgICAgICAgICBpbmNsdWRlZCBpbiB0aGUgYnVpbGQKKyAgICAgICAgICAgICAyLCB3aGVuIGNvZGUgaXMgYnVpbHQgZXhjbHVzaXZlbHkgZm9yCisgICAgICAgICAgICAgICAgQVAgbW9kZQorLlRQCisuQiBEcml2ZXJFbmFibGUKKz8/Pz8/Pz8/Pz8/Pz8/PworLlRQCisuQiBFbmFibGVFbmNyeXB0aW9uPW4KK1NldCB0aGUgbWV0aG9kIG9mIERhdGEgZW5jcnlwdGlvbi4KKy5CUgorICAgIDAgXC0gRGlzYWJsZQorLkJSCisgICAgMSBcLSBFbmFibGUgV0VQIEVuY3J5cHRpb24KKy5CUgorICAgIDIgXC0gRW5hYmxlIFdQQSB3aXRoIFRLSVAgZW5jcnlwdGlvbgorLkJSCisgICAgRGVmYXVsdDogMAorLlRQCisuQiBFbmNyeXB0aW9uCis/Pz8/Pz8/Pz8/Pz8/Pz8KKy5UUAorLkIgRXhjbHVkZVVuZW5jcnlwdGVkPXMKK0NvbnRyb2xzIGhvdyB0aGUgc3RhdGlvbnMgbXVzdCBjb21tdW5pY2F0ZSB3aXRoIHRoZSBBUC4KKy5CUgorICAgIFkgXC0gU3RhdGlvbnMgbXVzdCBlbmFibGUgZW5jcnlwdGlvbiBhbmQgcHJvdmlkZQorICAgICAgICAgdGhlIHByb3BlciBlbmNyeXB0aW9uIGtleSB0byBjb21tdW5pY2F0ZQorICAgICAgICAgd2l0aCB0aGUgQVAuCisuQlIKKyAgICBOIFwtIFN0YXRpb25zIGRvIG5vdCBuZWVkIHRvIGVuYWJsZSBlbmNyeXB0aW9uCisgICAgICAgICB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBBUC4KKy5CUgorICAgIERlZmF1bHQ6IE4KKy5UUAorLkIgSW50cmFCU1NSZWxheT1zCitDb250cm9scyB0aGUgYXV0b21hdGljIHJlbGF5IG9mIHJlY2VpdmVkIG1lc3NhZ2VzIHRoYXQgYXJlIGRlc3RpbmVkIGZvciBvdGhlcgorc3RhdGlvbnMgaW4gdGhlIEJTUy4KKy5CUgorICAgIFkgXC0gTWVzc2FnZXMgYXJlIHJlbGF5ZWQgdG8gdGhlIGFwcHJvcHJpYXRlCisgICAgICAgICBzdGF0aW9uKHMpLgorLkJSCisgICAgTiBcLSBNZXNzYWdlcyBhcmUgcGFzc2VkIHVwIHRvIHRoZSBob3N0LgorLkJSCisgICAgRGVmYXVsdDogWQorLlRQCisuQiBJcnFMaXN0PWksaiwuLi4KK1NwZWNpZmllcyB0aGUgc2V0IG9mIGludGVycnVwdHMgKHVwIHRvIDQpIHRoYXQgbWF5IGJlIGFsbG9jYXRlZCBieQordGhpcyBkcml2ZXIuIFRoaXMgb3ZlcnJpZGVzIHRoZSB2YWx1ZXMgc2V0IGluIHRoZQorLkIgSXJxTWFzaworcGFyYW1ldGVyLiBOT1RFOiBUaGlzIHBhcmFtZXRlciBpcyBmb3IgUENNQ0lBIG9ubHkuCisuVFAKKy5CIElycU1hc2s9bgorU3BlY2lmaWVzIGEgbWFzayBvZiB2YWxpZCBpbnRlcnJ1cHRzIHRoYXQgbWF5IGJlIGFsbG9jYXRlZCBieSB0aGlzIGRyaXZlci4KK0lmCisuQiBJcnFMaXN0CitpcyBhbHNvIHNwZWNpZmllZCwgdGhlIHZhbHVlcyBpbgorLkIgSXJxTGlzdAorYXJlIHVzZWQgaW5zdGVhZC4gTk9URTogVGhpcyBwYXJhbWV0ZXIgaXMgZm9yIFBDTUNJQSBvbmx5LgorLkJSCisgICAgRGVmYXVsdDogMHhkZWI4IChJUlEgMyw0LDUsNyw5LDEwLDExLDEyLDE0LDE1KQorLlRQCisuQiBLZXkxPXMKK1NwZWNpZmllcyBvbmUgb2YgNCBwb3NzaWJsZSBrZXlzIGZvciB0aGUgRGF0YSBlbmNyeXB0aW9uLgorT25lIG9mIHRoZXNlIGtleXMsIGlkZW50aWZpZWQgYnkgVHhLZXksCitpcyB1c2VkIGZvciB0aGUgZW5jaXBoZXJpbmcgb2YgRGF0YSB0aGF0IGlzIHRyYW5zbWl0dGVkIGJ5IHRoaXMgc3RhdGlvbi4KK0FsbCBrZXlzIHNwZWNpZmllZCBjYW4gYmUgdXNlZCBmb3IgdGhlIGRlY2lwaGVyaW5nIG9mIERhdGEgdGhhdCBpcyByZWNlaXZlZC4KKy5CUgorVGhlIGtleSB2YWx1ZSBjYW4gYmUgYW4gQVNDSUkgY2hhcmFjdGVyIHN0cmluZyBvciBhIGhleGFkZWNpbWFsIHZhbHVlLgorVGhlIGxlbmd0aCBvZiB0aGUga2V5IHZhbHVlIGNhbiBiZSA1IGNoYXJhY3RlcnMgb3IgMTAgaGV4YWRlY2ltYWwgZGlnaXRzIGZvcgordGhlIHN0YW5kYXJkIGVuY3J5cHRpb24gKFNpbHZlciBvciBHb2xkIGNhcmQpLCBvciAxMyBjaGFyYWN0ZXJzIG9yIDI2CitoZXhhZGVjaW1hbCBkaWdpdHMgZm9yIHRoZSBlbmNyeXB0aW9uIHdpdGggZXh0ZW5kZWQga2V5cyAoR29sZCBjYXJkIG9ubHkpLgorVGhlIGtleXMgZGVmaW5lZCBpbiB0aGUgc3RhdGlvbiBtdXN0IG1hdGNoIHRoZSBrZXlzIGRlZmluZWQgaW4gdGhlIGFjY2VzcworcG9pbnRzOyBib3RoIG9uIHZhbHVlIGFuZCBudW1iZXIgKDEgdGhyb3VnaCA0KS4KKy5CUgorSW4gMi4wIHNlcmllcyBMaW51eCBrZXJuZWwgbW9kdWxlcywgdmFsdWVzIHRoYXQgYmVnaW4gd2l0aCBhIG51bWJlciBhcmUKK2NvbnNpZGVyZWQgaW50ZWdlcnMuIEluIHRoaXMgY2FzZSBhIGhleGFkZWNpbWFsIHZhbHVlIHN0cmluZyBvciBhIGNoYXJhY3Rlcgorc3RyaW5nIHN0YXJ0aW5nIHdpdGggYSBudW1iZXIsIHdpbGwgbmVlZCB0byBiZSBzdXJyb3VuZGVkIGJ5IGVzY2FwZWQKK2RvdWJsZSBxdW90ZXMgKGllLiBLZXkxPVxcIjB4MTEyMjMzNDQ1NVxcIiBLZXkyPVxcIjEyeHl6XFwiKS4KKy5CUgorICAgIDUgb3IgMTMsIHByaW50YWJsZSBjaGFyYWN0ZXIgc3RyaW5nLCBvcgorLkJSCisgICAgMTAgb3IgMjYgaGV4IGRpZ2l0cyBpZiBwcmVjZWRlZCBieSAiMHgiLgorLkJSCisgICAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgdGhlIGRlZmF1bHQgb2YgdGhlIE1BQyBpcyB1c2VkICggPSAwLWxlbmd0aCkuCisuVFAKKy5CIEtleTI9cworU2FtZSBhcyBLZXkxLgorLlRQCisuQiBLZXkzPXMKK1NhbWUgYXMgS2V5MS4KKy5UUAorLkIgS2V5ND1zCitTYW1lIGFzIEtleTEuCisuVFAKKy5CIExvYWRCYWxhbmNpbmc9cworQ29udHJvbCBmb3IgdGhlIExvYWQgQmFsYW5jaW5nIGFsZ29yaXRobSBmb3IgYm90aCBTVEFzIGFuZCBBUHMuIFRoZSBBUAoraW5jbHVkZXMgYSBsb2FkIGJhbGFuY2luZyBlbGVtZW50IGluIHRoZSBQcm9iZSBSZXNwb25zZSBhbmQgQmVhY29uIGZyYW1lcy4KK1RoZSBTVEEgdXNlcyB0aGlzIGluZm8gdG8gc2VsZWN0IGFuIEFQLCBub3Qgb25seSBiYXNlZCBvbiBjb21tcyBxdWFsaXR5LCBidXQKK2Fsc28gb24gdGhlIGxvYWQgb2YgdGhhdCBBUC4KKy5CUgorICAgIERlZmF1bHQ6IFkKKy5UUAorLkIgTWF4RGF0YUxlbmd0aAorPz8/Pz8/Pz8/Pz8/Pz8/CisuVFAKKy5CIE1heFNsZWVwRHVyYXRpb249bgorU2V0IHRoZSBtYXhpbXVtIFBvd2VyIE1hbmFnZW1lbnQgc2xlZXAgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLgorVmFsaWQgdmFsdWVzIGFyZSAwIHRvIDY1NTM1IG1pbGxpc2Vjb25kcy4KKy5CUgorICAgIERlZmF1bHQ6IDEwMAorLlRQCisuQiBNZWRpdW1EaXN0cmlidXRpb249cworQ29udHJvbCBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBvZiBtZWRpdW0gcGFyYW1ldGVycywgbGlrZSBjb21tdW5pY2F0aW9uCit0aHJlc2hvbGRzLCBtaWNyb3dhdmUgcm9idXN0bmVzcywgUlRTL0NUUyB0aHJlc2hvbGRzLCBieSBBUHMuIFRoZSBhc3NvY2lhdGVkCitzdGF0aW9ucyByZXBsYWNlIHRoZWlyIG93biB2YWx1ZXMgd2l0aCB0aGUgcmVjZWl2ZWQgdmFsdWVzLgorLkJSCisgICAgRGVmYXVsdD1ZCisuVFAKKy5CIE1pY3JvV2F2ZVJvYnVzdG5lc3M9cworRW5hYmxlIG9yIGRpc2FibGUgTWljcm93YXZlIE92ZW4gUm9idXN0bmVzcy4KKy5CUgorICAgIE4gXC0gRGlzYWJsZQorLkJSCisgICAgWSBcLSBFbmFibGUKKy5CUgorICAgIERlZmF1bHQ6IE4KKy5UUAorLkIgTXVsdGljYXN0UE1CdWZmZXJpbmc9cworQ29udHJvbHMgYnVmZmVyaW5nIG9mIG11bHRpY2FzdCBNQUMgZnJhbWVzIGZvciB0cmFuc21pc3Npb24gYWZ0ZXIgRFRJTS4gSWYgbm8sCittdWx0aWNhc3QgTUFDIGZyYW1lcyBhcmUgZGlyZWN0bHkgcGxhY2VkIGluIHRoZSBvdXRwdXQgcXVldWUuCisuQlIKKyAgICBEZWZhdWx0OiBZCisuVFAKKy5CIE11bHRpY2FzdFJhdGU9bgorU2V0cyB0aGUgZGF0YSByYXRlIGZvciBtdWx0aWNhc3QgbWVzc2FnZSB0cmFuc21pc3Npb24uCisuQlIKKyAgICAxIFwtIEZpeGVkIDFNYi9zCisgICAgMiBcLSBGaXhlZCAyTWIvcworICAgIDMgXC0gRml4ZWQgNS41TWIvcworICAgIDQgXC0gRml4ZWQgMTFNYi9zCisuQlIKKyAgICBEZWZhdWx0OiAyCisKK0ZvciBIZXJtZXMtSUkuNSwgYW4gSU5URUdFUiBDT05WRVJURUQgYml0IG1hc2sgcmVwcmVzZW50aW5nIHRoZQorcmF0ZSB0byBtdWx0aWNhc3QsIHdoZXJlIHRoZSByYXRlcyBzdXBwb3J0ZWQgYXJlIGFzIGZvbGxvd3M6CisKK0JpdCAgOiAxNXwxNHwxM3wxMnwxMXwxMHwwOXwwOHwwN3wwNnwwNXwwNHwwM3wwMnwwMXwwMAorLmJyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy5icgorUmF0ZSA6IFhYfFhYfFhYfFhYfDU0fDQ4fDM2fDI0fDE4fDEyfCA5fCA2fDExfDUuNXwyfCAxCisKKyAgICBEZWZhdWx0OiA0IChUcmFuc2xhdGVzIHRvIDB4MDAwNCA9IDUuNSBNYi9zZWMpCisKKy5UUAorLkIgTXVsdGljYXN0UmVjZWl2ZT1zCitFbmFibGUgb3IgZGlzYWJsZSByZWNlaXZpbmcgb2YgYWxsIG11bHRpY2FzdCBwYWNrZXRzIHdoZW4gQ2FyZCBQb3dlciBNYW5hZ2VtZW50CitpcyBlbmFibGVkLiBXaGVuIGVuYWJsZWQsIHRoZSBzdGF0aW9uIHdpbGwgd2FrZSB1cCBmcmVxdWVudGx5Cit0byByZWNlaXZlIHRoZSBtdWx0aWNhc3QgZnJhbWVzLiBUaGlzIGNhdXNlcyBsZXNzIG9wdGltYWwgcG93ZXIgc2F2aW5ncy4KKy5CUgorICAgIE4gXC0gRGlzYWJsZQorLkJSCisgICAgWSBcLSBFbmFibGUKKy5CUgorICAgIERlZmF1bHQ6IFkKKy5UUAorLkIgTmV0d29ya0FkZHJlc3M9bixuLG4sbixuLG4KK1NldHMgdGhlIGFkYXB0ZXIgaGFyZHdhcmUgZXRoZXJuZXQgYWRkcmVzcyAoTUFDIGFkZHJlc3MpIHRvIHRoZSB2YWx1ZQorc3BlY2lmaWVkLiBOb3RlIHRoYXQgdGhpcyBpcyB0byBiZSB1c2VkIHRvIHNwZWNpZnkgYSBMb2NhbCBNQUMgYWRkcmVzcy4gRG8KK25vdCBzcGVjaWZ5IHRoaXMgcGFyYW1ldGVyIGlmIHRoZSBjYXJkXCdzIHVuaXZlcnNhbCBhZGRyZXNzIGlzIHRvIGJlIHVzZWQuCitWYWxpZCB2YWx1ZXMgYXJlIHNpeCBoZXhhZGVjaW1hbCBkaWdpdC1wYWlycyAocHJlZml4ZWQgd2l0aCAweCkuCisuQlIKKyAgICBEZWZhdWx0OiA8ZmFjdG9yeSBhc3NpZ25lZCBhZGRyZXNzPgorLlRQCisuQiBOZXR3b3JrVHlwZQorPz8/Pz8/Pz8/Pz8/Pz8/CisuVFAKKy5CIE93bkFUSU1XaW5kb3c9bgorQVRJTSB3aW5kb3cgdGltZSB1c2VkIGZvciBjcmVhdGluZyBhbiBJQlNTLgorLkJSCisgICAgUmFuZ2U6IDAuLjEwMAorLkJSCisgICAgRGVmYXVsdDogMAorLlRQCisuQiBPd25CZWFjb25JbnRlcnZhbD1iCitCZWFjb24gSW50ZXJ2YWwgaW4gVFUKKy5CUgorICAgIFJhbmdlIDIwLi4yMDAKKy5CUgorICAgIERlZmF1bHQgXC0gMTAwCisuVFAKKy5CIGNoYW5uZWw9bgorU2FtZSBhcyBPd25DaGFubmVsLgorLlRQCisuQiBPd25DaGFubmVsPW4KK1NldHMgdGhlIGNoYW5uZWwgdGhlIEFkLUhvYyBvciBJQlNTIG1vZGUgd2lsbCB1c2UuCitUaGUgZGVmYXVsdCBjaGFubmVsIGZvciBBZC1Ib2MgbW9kZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBXaXJlbGVzcyBQQyBDYXJkLgorVGhlIGRlZmF1bHQgY2hhbm5lbCBmb3IgSUJTUyBpcyBzZXQgdG8gMTAgYnkgdGhlIGRyaXZlci4KK1RoaXMgdmFsdWUgaGFzIG5vIGVmZmVjdCB3aGVuIHRoZSBhZGFwdGVyIGlzIHVzZWQgd2l0aCBhbiBBY2Nlc3MgUG9pbnQKKyhCU1MgbmV0d29yaykgc2luY2UgdGhlIEFjY2VzcyBQb2ludCBhdXRvbWF0aWNhbGx5IGRldGVybWluZXMgdGhlIGNoYW5uZWwuCitWYWxpZCB2YWx1ZXMgYXJlIDAgdG8gMTQuIEhvd2V2ZXIgdGhlIGNoYW5uZWxzIGFsbG93ZWQgaW4KK3lvdXIgcmVnaW9uIGFyZSBzdWJqZWN0IHRvIGxvY2FsIHJlZ3VsYXRpb25zIGFuZCBhcmUgbGltaXRlZCBhdAorbWFudWZhY3R1cmluZyB0aW1lIG9mIHRoZSBXaXJlbGVzcyBQQyBDYXJkLiBXaGVuIHRoZSBwcm92aWRlZCB2YWx1ZSBpcworbm90IGFsbG93ZWQsIHRoZSB2YWx1ZSByZW1haW5zIHVuY2hhbmdlZC4KKy5CUgorICAgIDAgXC0gVXNlIGRlZmF1bHQgY2hhbm5lbAorLkJSCisgICAgRGVmYXVsdDogMAorLlRQCisuQiBPd25EVElNUGVyaW9kPW4KK1RoZSBudW1iZXIgb2YgYmVhY29uIGludGVydmFscyBiZXR3ZWVuIHN1Y2Nlc3NpdmUgRGVsaXZlcnkgVHJhZmZpYyBJZGVudGlmaWNhdGlvbgorTWFwcyAoRFRJTXMpLgorLkJSCisgICAgUmFuZ2U6IDEuLjY1NTM1CisuQlIKKyAgICBEZWZhdWx0OiAxCisuVFAKKy5CIE93bk5hbWU9cworU2V0cyB0aGUgc3RhdGlvbiBuYW1lIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHZhbHVlLiBUaGlzIHBhcmFtZXRlcgoraXMgdXNlZCBmb3IgZGlhZ25vc3RpYyBwdXJwb3NlcywgYXMgYSB1c2VyXC1mcmllbmRseSBpZGVudGlmaWNhdGlvbgorb2YgdGhpcyBzeXN0ZW0uIFRoaXMgcGFyYW1ldGVyIGFjY2VwdHMgYSBtYXhpbXVtIG9mIDMyIGNoYXJhY3RlcnMuCisuQlIKKyAgICBEZWZhdWx0OiBMaW51eAorLlRQCisuQiBPd25TU0lEPXMKK1NldHMgdGhlIGNhcmQgbmV0d29yayBuYW1lIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHZhbHVlLiBUaGlzIHBhcmFtZXRlcgorYWNjZXB0cyBhIG1heGltdW0gb2YgMzIgY2hhcmFjdGVycy4gV2hpdGVzcGFjZSBpbiB0aGUgbmV0d29yayBuYW1lCit3aWxsIG5lZWQgdG8gYmUgZXNjYXBlZCB3aXRoIGEgYmFja3NsYXNoIChpZS4gT3duU1NJRD1NeVxcIE5ldHdvcmspLgorLkJSCisgICAgRGVmYXVsdDogQU5ZCisuVFAKKy5CIHBjX2RlYnVnPW4KK1NlbGVjdHMgdGhlIFBDTUNJQSBkZWJ1Z2dpbmcgbGV2ZWwuIFRoaXMgcGFyYW1ldGVyIGlzIG9ubHkgYXZhaWxhYmxlCitpZiB0aGUgbW9kdWxlIGlzIGNvbXBpbGVkIHdpdGggZGVidWdnaW5nIGVuYWJsZWQuIEEgbm9uXC16ZXJvIHZhbHVlCitlbmFibGVzIGRlYnVnZ2luZy4gSGlnaGVyIHZhbHVlcyB5aWVsZCBtb3JlIGluZm9ybWF0aW9uLCBpLmUuIGZvciBhbnkgdmFsdWUgYWxsCitsb3dlciB2YWx1ZXMgYXJlIGltcGxpZWQuCisuQlIKKyAgICA4IFwtIERCR19EU19PTgorLkJSCisgICAgNyBcLSBEQkdfUlhfT04gfCBEQkdfVFhfT04KKy5CUgorICAgIDYgXC0gREJHX1BBUkFNX09OCisuQlIKKyAgICA1IFwtIERCR19UUkFDRV9PTgorLkJSCisgICAgNCBcLSBEQkdfVkVSQk9TRV9PTgorLkJSCitJZiB0aGUgbW9kdWxlIGlzIGNvbXBpbGVkIHdpdGggZGVidWdnaW5nIGVuYWJsZWQsIHBjX2RlYnVnIGRlZmF1bHRzIHRvIDUuCitEZWJ1Z0ZsYWcgb3ZlcnJ1bGVzIHBjX2RlYnVnLgorLkJSCitUaGUgbmFtZSBwY19kZWJ1ZyByYXRoZXIgdGhhbiBQY0RlYnVnLCBzaW5jZSBwY19kZWJ1ZyBpcyB1c2VkIGJ5IG1hbnkgUENNQ0lBIGRyaXZlci4KKy5UUAorLkIgUE1FbmFibGVkPWIKK1NldHMgdGhlIGNhcmRcJ3MgUG93ZXIgTWFuYWdlbWVudCBzdGF0ZS4KKy5CUgorICAgIDAgXC0gRGlzYWJsZQorLkJSCisgICAgMSBcLSBFbmFibGUgRW5oYW5jZWQgTW9kZQorLkJSCisgICAgMiBcLSBFbmFibGVkIFN0YW5kYXJkIE1vZGUKKy5CUgorICAgIDB4ODAwMCBcLSBFbmhhbmNlZD8/Pz8/PyBNb2RlICh0byBiZSBjb21iaW5lZCB3aXRoIDB4MDAwMSBvciAweDAwMDIpCisKKyAgICBEZWZhdWx0OiAwIChEaXNhYmxlZCkKKy5UUAorLkIgUE1Ib2xkb3ZlckR1cmF0aW9uPW4KK1RpbWUgdGhhdCB0aGUgc3RhdGlvbiByZW1haW5zIGluIGFuIGF3YWtlIHN0YXRlIGFmdGVyIGEgTUFDIGZyYW1lIHRyYW5zZmVyIGlmCitFbmhhbmNlZCBQb3dlciBTYXZlIGlzIGFjdGl2ZS4KKy5CUgorICAgIFJhbmdlOiAxLi4xMDAwCisuQlIKKyAgICBEZWZhdWx0OiAxMDAKKy5UUAorLkIgUG93ZXJNb2RlCis/Pz8/Pz8/Pz8/Pz8/Pz8KKy5UUAorLkIgUG9ydFR5cGU9bgorU2VsZWN0cyB0aGUgdHlwZSBvZiBuZXR3b3JrIG9wZXJhdGlvbi4KKy5CUgorICAgIDEgXC0gTm9ybWFsIE9wZXJhdGlvbiAoQlNTIG9yIElCU1MpCisuQlIKKyAgICAzIFwtIEFkLUhvYyBEZW1vIE1vZGUKKy5CUgorICAgIERlZmF1bHQ6IDEKKy5UUAorLkIgUHJvbWlzY3VvdXNNb2RlPXMKK1N3aXRjaCBmb3IgcHJvbWlzY3VvdXMgbW9kZSByZWNlcHRpb24uCisuQlIKKyAgICBEZWZhdWx0OiBOCisuVFAKKy5CIFJlamVjdEFOWT1zCitDb250cm9scyBob3cgc3RhdGlvbnMgYXNzb2NpYXRlIHRvIHRoZSBkZXZpY2UuCisuQlIKKyAgICBZIFwtIFN0YXRpb25zIG11c3QgcHJvdmlkZSB0aGUgY29ycmVjdCBTU0lEIHRvCisgICAgICAgICBhc3NvY2lhdGUgdG8gdGhlIEFQLgorLkJSCisgICAgTiBcLSBTdGF0aW9ucyBhcmUgbm90IHJlcXVpcmVkIHRvIHByb3ZpZGUgdGhlCisgICAgICAgICBjb3JyZWN0IFNTSUQgdG8gYXNzb2NpYXRlIHRvIHRoZSBBUC4KKyAgICAgICAgIEtub3duIGFzIGFuIFwnb3BlblwnIG5ldHdvcmsuCisuQlIKKyAgICBEZWZhdWx0IC0gTgorLlRQCisuQiBSVFNUaHJlc2hvbGQ9bgorQ29udHJvbHMgdGhlIFJUUy9DVFMgaGFuZHNoYWtlIHRocmVzaG9sZCBmb3IgdHJhbnNtaXNzaW9ucyBpbiBTdGF0aW9uIG1vZGUuCitWYWxpZCB2YWx1ZXMgYXJlIDAgdG8gMjM0Ny4KKy5CUgorICAgIDUwMCAgXC0gSGlkZGVuIFN0YXRpb25zCisuQlIKKyAgICAyMzQ3IFwtIE5vIFJUUy9DVFMKKy5CUgorICAgIERlZmF1bHQ6IDIzNDcKKy5UUAorLkIgUlRTVGhyZXNob2xkMT1uCitTYW1lIGFzIFJUU1RocmVzaG9sZCwgb25seSBmb3IgcG9ydCAxIG9mIGluIEFjY2Vzc1BvaW50IG1vZGUuCisuVFAKKy5CIFJUU1RocmVzaG9sZDI9bgorU2FtZSBhcyBSVFNUaHJlc2hvbGQxLCBvbmx5IGZvciBwb3J0IDIuCisuVFAKKy5CIFJUU1RocmVzaG9sZDM9bgorU2FtZSBhcyBSVFNUaHJlc2hvbGQxLCBvbmx5IGZvciBwb3J0IDMuCisuVFAKKy5CIFJUU1RocmVzaG9sZDQ9bgorU2FtZSBhcyBSVFNUaHJlc2hvbGQxLCBvbmx5IGZvciBwb3J0IDQuCisuVFAKKy5CIFJUU1RocmVzaG9sZDU9bgorU2FtZSBhcyBSVFNUaHJlc2hvbGQxLCBvbmx5IGZvciBwb3J0IDUuCisuVFAKKy5CIFJUU1RocmVzaG9sZDY9bgorU2FtZSBhcyBSVFNUaHJlc2hvbGQxLCBvbmx5IGZvciBwb3J0IDYuCisuVFAKKy5CIFNSU0MyR0h6PWIKK1NldHMgdGhlIGNhcmRcJ3MgU3VwcG9ydGVkIFJhdGUgU2V0IGluIHRoZSAyLjRHSHogYmFuZC4gVGhlIHZhbHVlCitpcyBhbiBJTlRFR0VSIENPTlZFUlRFRCBiaXQgbWFzayByZXByZXNlbnRpbmcgdGhlIHJhdGVzIHRvIHN1cHBvcnQsCit3aGVyZSB0aGUgcmF0ZXMgc3VwcG9ydGVkIGFyZSBhcyBmb2xsb3dzOgorCitCaXQgIDogMTV8MTR8MTN8MTJ8MTF8MTB8MDl8MDh8MDd8MDZ8MDV8MDR8MDN8MDJ8MDF8MDAKKy5icgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisuYnIKK1JhdGUgOiBYWHxYWHxYWHxYWHw1NHw0OHwzNnwyNHwxOHwxMnwgOXwgNnwxMXw1LjV8MnwgMQorLkJSCisgICAgRGVmYXVsdDogNDA5NSAob3IgMHgwRkZGLCBhbGwgMTFiIGFuZCAxMWcgcmF0ZXMpCisuVFAKKy5CIFNSU0M1R0h6PWIKK1NldHMgdGhlIGNhcmRcJ3MgU3VwcG9ydGVkIFJhdGUgU2V0IGluIHRoZSA1LjBHSHogYmFuZC4gU2VlIFNSU0MyR0h6Citmb3IgdGhlIHZhbHVlXCdzIGZvcm1hdC4KKy5CUgorICAgIERlZmF1bHQ6IDQwODAgKG9yIDB4MEZGMCwgYWxsIDExYSByYXRlcykKKy5UUAorLkIgU3lzdGVtU2NhbGU9bgorU2V0cyB0aGUgZGlzdGFuY2UgYmV0d2VlbiBBY2Nlc3MgUG9pbnRzIGluIHRoZSBuZXR3b3JrLiBUaGlzIHZhbHVlCitpbmZsdWVuY2VzIHRoZSBNb2RlbSBUaHJlc2hvbGRzIChFbmVyZ3lEZXRlY3RUaHJlc2hvbGQsCitDYXJyaWVyRGV0ZWN0VGhyZXNob2xkIGFuZCBEZWZlclRocmVzaG9sZCkgYW5kCit0aGUgUm9hbWluZyBUaHJlc2hvbGRzIChDZWxsU2VhcmNoVGhyZXNob2xkIGFuZCBPdXRPZlJhbmdlVGhyZXNob2xkKS4KKy5CUgorICAgIDEgXC0gTGFyZ2UKKy5CUgorICAgIDIgXC0gTWVkaXVtCisuQlIKKyAgICAzIFwtIFNtYWxsCisuQlIKKyAgICBEZWZhdWx0OiAxCisuVFAKKy5CIFR4UmF0ZUNvbnRyb2w9bgorU2V0cyB0aGUgZGF0YSByYXRlIHRvIGJlIHVzZWQgYnkgdGhlIHRyYW5zbWl0dGVyLiBGb3IgSGVybWVzLUlJOgorLkJSCisgICAgMSBcLSBGaXhlZCBMb3cgKDEgTWIvc2VjKQorLkJSCisgICAgMiBcLSBGaXhlZCBTdGFuZGFyZCAoMiBNYi9zZWMpCisuQlIKKyAgICAzIFwtIEF1dG8gUmF0ZSBTZWxlY3QgSGlnaCAoMTEsIDUuNSwgMiwgMSBNYi9zZWMpCisuQlIKKyAgICA0IFwtIEZpeGVkIE1lZGl1bSAoNS41IE1iL3NlYykKKy5CUgorICAgIDUgXC0gRml4ZWQgSGlnaCAoMTEgTWIvc2VjKQorLkJSCisgICAgNiBcLSBBdXRvIFJhdGUgU2VsZWN0IFN0YW5kYXJkICgyLCAxIE1iL3NlYykKKy5CUgorICAgIDcgXC0gQXV0byBSYXRlIFNlbGVjdCBNZWRpdW0gKDUuNSwgMiwgMSBNYi9zZWMpCisuQlIKKyAgICBEZWZhdWx0OiAzCisKK0ZvciBIZXJtZXMtSUkuNSwgYW4gSU5URUdFUiBDT05WRVJURUQgYml0IG1hc2sgcmVwcmVzZW50aW5nIGFsbCBvZiB0aGUKK3JhdGVzIHRvIHN1cHBvcnQsIHdoZXJlIHRoZSByYXRlcyBzdXBwb3J0ZWQgYXJlIGFzIGZvbGxvd3M6CisKK0JpdCAgOiAxNXwxNHwxM3wxMnwxMXwxMHwwOXwwOHwwN3wwNnwwNXwwNHwwM3wwMnwwMXwwMAorLmJyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy5icgorUmF0ZSA6IFhYfFhYfFhYfFhYfDU0fDQ4fDM2fDI0fDE4fDEyfCA5fCA2fDExfDUuNXwyfCAxCisuQlIKKyAgICBEZWZhdWx0OiA0MDk1IChUcmFuc2xhdGVzIHRvIDB4RkZGLCB3aGljaCBpcyBhbGwgcmF0ZXMpCisuVFAKKy5CIFJUU1RocmVzaG9sZD1uCitTZXRzIHRoZSBudW1iZXIgb2Ygb2N0ZXRzIGluIGEgbWVzc2FnZSBvciBmcmFnbWVudCBhYm92ZSB3aGljaCBhCitSVFMvQ1RTIGhhbmRzaGFrZSBpcyBwZXJmb3JtZWQuCitWYWxpZCB2YWx1ZXMgYXJlIDAgdG8gMjM0Ny4KKy5CUgorICAgIDUwMCAgXC0gSGlkZGVuIFN0YXRpb25zCisuQlIKKyAgICAyMzQ3IFwtIE5vIFJUUy9DVFMKKy5CUgorICAgIERlZmF1bHQ6IDIzNDcKKy5UUAorLkIgVHhLZXk9bgorRGVzaWduYXRlcyB3aGljaCBvZiB0aGUga2V5cyBpcyB0byBiZSB1c2VkIGZvciB0aGUgZW5jaXBoZXJpbmcgb2YgZGF0YSB0aGF0IGlzCit0cmFuc21pdHRlZCBieSB0aGlzIHN0YXRpb24uCisuQlIKKyAgICBJbnRlZ2VyIGluIHRoZSByYW5nZSAxLi40LgorLkJSCisgICAgRGVmYXVsdDogMQorLlRQCisuQiBUeFBvd0xldmVsCis/Pz8/Pz8/Pz8/Pz8/Pz8KKy5UUAorLkIgVHhSYXRlQ29udHJvbD1uCitTZXRzIHRoZSBkYXRhIHJhdGUgdG8gYmUgdXNlZCBieSB0aGUgdHJhbnNtaXR0ZXIgaW4gU3RhdGlvbiBtb2RlLgorLkJSCisgICAgMSBcLSBGaXhlZCBMb3cKKy5CUgorICAgIDIgXC0gRml4ZWQgU3RhbmRhcmQKKy5CUgorICAgIDMgXC0gQXV0byBSYXRlIFNlbGVjdCAoSGlnaCkKKy5CUgorICAgIDQgXC0gRml4ZWQgTWVkaXVtCisuQlIKKyAgICA1IFwtIEZpeGVkIEhpZ2gKKy5CUgorICAgIDYgXC0gQXV0byBSYXRlIFNlbGVjdCAoU3RhbmRhcmQpCisuQlIKKyAgICA3IFwtIEF1dG8gUmF0ZSBTZWxlY3QgKE1lZGl1bSkKKy5CUgorICAgIERlZmF1bHQ6IDMKKworRm9yIEhlcm1lcy1JSS41LCBhbiBJTlRFR0VSIENPTlZFUlRFRCBiaXQgbWFzayByZXByZXNlbnRpbmcgYWxsIG9mIHRoZQorcmF0ZXMgdG8gc3VwcG9ydCwgd2hlcmUgdGhlIHJhdGVzIHN1cHBvcnRlZCBhcmUgYXMgZm9sbG93czoKKworQml0ICA6IDE1fDE0fDEzfDEyfDExfDEwfDA5fDA4fDA3fDA2fDA1fDA0fDAzfDAyfDAxfDAwCisuYnIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLmJyCitSYXRlIDogWFh8WFh8WFh8WFh8NTR8NDh8MzZ8MjR8MTh8MTJ8IDl8IDZ8MTF8NS41fDJ8IDEKKy5CUgorICAgIERlZmF1bHQ6IDQwOTUgKFRyYW5zbGF0ZXMgdG8gMHhGRkYsIHdoaWNoIGlzIGFsbCByYXRlcykKKworLlRQCisuQiBUeFJhdGVDb250cm9sMT1uCitTYW1lIGFzIFR4UmF0ZUNvbnRyb2wsIG9ubHkgZm9yIHBvcnQgMSBpbiBBY2Nlc3NQb2ludCBtb2RlLgorLlRQCisuQiBUeFJhdGVDb250cm9sMj1uCitTYW1lIGFzIFR4UmF0ZUNvbnRyb2wxLCBvbmx5IGZvciBwb3J0IDIuCisuVFAKKy5CIFR4UmF0ZUNvbnRyb2wzPW4KK1NhbWUgYXMgVHhSYXRlQ29udHJvbDEsIG9ubHkgZm9yIHBvcnQgMy4KKy5UUAorLkIgVHhSYXRlQ29udHJvbDQ9bgorU2FtZSBhcyBUeFJhdGVDb250cm9sMSwgb25seSBmb3IgcG9ydCA0LgorLlRQCisuQiBUeFJhdGVDb250cm9sNT1uCitTYW1lIGFzIFR4UmF0ZUNvbnRyb2wxLCBvbmx5IGZvciBwb3J0IDUuCisuVFAKKy5CIFR4UmF0ZUNvbnRyb2w2PW4KK1NhbWUgYXMgVHhSYXRlQ29udHJvbDEsIG9ubHkgZm9yIHBvcnQgNi4KKy5UUAorLkIgVmVuZG9yRGVzY3JpcHRpb24KKz8/Pz8/Pz8/Pz8/Pz8/PworLlRQCisuQiBXRFNBZGRyZXNzPW4sbixuLG4sbixuCitNQUMgYWRkcmVzcyB0aGF0IGlkZW50aWZpZXMgdGhlIGNvcnJlc3BvbmRpbmcgbm9kZSBvZiB0aGUgV0RTIHBvcnQgaW4gU3RhdGlvbiBtb2RlLgorTm90ZSB0aGF0IGZvciBXRFMgdG8gd29yayBwcm9wZXJseSwgYSBicmlkZ2UgaW50ZXJmYWNlIG11c3QgYmUgc2V0dXAgYmV0d2VlbiB0aGUgZGV2aWNlIGFuZAordGhlIHdkcyBuZXR3b3JrIGRldmljZXMgY3JlYXRlZCBieSB0aGUgZHJpdmVyLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBicmlkZ2UKK2ludGVyZmFjZXMsIHBsZWFzZSByZWZlciB0byB0aGUgbWFuIHBhZ2UgZm9yIFwnYnJjdGxcJy4KKy5CUgorICAgIERlZmF1bHQ6IDAwOjAwOjAwOjAwOjAwOjAwCisuVFAKKy5CIFdEU0FkZHJlc3MxPW4sbixuLG4sbixuCitTYW1lIGFzIFdEU0FkZHJlc3MsIG9ubHkgZm9yIHBvcnQgMSBpbiBBY2Nlc3NQb2ludCBtb2RlLgorLlRQCisuQiBXRFNBZGRyZXNzMj1uLG4sbixuLG4sbgorU2FtZSBhcyBXRFNBZGRyZXNzMSwgb25seSBmb3IgcG9ydCAyLgorLlRQCisuQiBXRFNBZGRyZXNzMz1uLG4sbixuLG4sbgorU2FtZSBhcyBXRFNBZGRyZXNzMSwgb25seSBmb3IgcG9ydCAzLgorLlRQCisuQiBXRFNBZGRyZXNzND1uLG4sbixuLG4sbgorU2FtZSBhcyBXRFNBZGRyZXNzMSwgb25seSBmb3IgcG9ydCA0LgorLlRQCisuQiBXRFNBZGRyZXNzNT1uLG4sbixuLG4sbgorU2FtZSBhcyBXRFNBZGRyZXNzMSwgb25seSBmb3IgcG9ydCA1LgorLlRQCisuQiBXRFNBZGRyZXNzNj1uLG4sbixuLG4sbgorU2FtZSBhcyBXRFNBZGRyZXNzMSwgb25seSBmb3IgcG9ydCA2LgorLlNIIFNFQ1VSSVRZCitPbiBhIG11bHRpLXVzZXIgc3lzdGVtIG9ubHkgdGhlIHN5c3RlbSBhZG1pbmlzdHJhdG9yIG5lZWRzIGFjY2VzcyB0byB0aGUgV0VQCitlbmNyeXB0aW9uIGtleXMuIEluIHRoaXMgY2FzZSwgY29uc2lkZXIgcmVtb3ZpbmcgdGhlIHJlYWQgcGVybWlzc2lvbiBmb3IKK25vcm1hbCB1c2VycyBvZiB0aGUgUENNQ0lBIGNvbmZpZy5vcHRzIGZpbGUsIHRoZSBzeXN0ZW0gbG9nIGZpbGUsIGFuZCBhbnkKK0FnZXJlIHByb3ByaWV0YXJ5IGl3Y29uZmlnLWV0aDxuPiBzY3JpcHRzLgorLlNIIENPTlRBQ1QKK0lmIHlvdSBlbmNvdW50ZXIgcHJvYmxlbXMgd2hlbiBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoaXMgcHJvZHVjdCwgb3Igd291bGQgbGlrZQoraW5mb3JtYXRpb24gYWJvdXQgb3VyIG90aGVyICJXaXJlbGVzcyIgcHJvZHVjdHMsIHBsZWFzZSBjb250YWN0IHlvdXIgbG9jYWwKK0F1dGhvcml6ZWQgIldpcmVsZXNzIiBSZXNlbGxlciBvciBBZ2VyZSBTeXN0ZW1zIHNhbGVzIG9mZmljZS4KKworQWRkcmVzc2VzIGFuZCB0ZWxlcGhvbmUgbnVtYmVycyBvZiB0aGUgQWdlcmUgU3lzdGVtcyBzYWxlcyBvZmZpY2VzIGFyZQorbGlzdGVkIG9uIG91ciBBZ2VyZSBTeXN0ZW1zIHdlYiBzaXRlLgorLlRQCisuQiBXV1cKK2h0dHA6Ly93d3cuYWdlcmUuY29tCisuU0ggU0VFIEFMU08KKy5CUiBjYXJkbWdyICg4KSwKKy5CUiBwY21jaWEgKDUpLAorLkJSIGlmY29uZmlnICg4KSwKKy5CUiBpbnNtb2QgKDgpLAorLkJSIGJyY3RsICg4KS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL21kZC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvbWRkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ1YzdkZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL21kZC5oCkBAIC0wLDAgKzEsMTE1NiBAQAorCisvLyAgIHZpbTp0dz0xMTA6dHM9NDoKKyNpZm5kZWYgTUREX0gKKyNkZWZpbmUgTUREX0ggMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGSUxFCQk6IG1kZC5oCisqCisqIERBVEUJCTogJERhdGU6IDIwMDQvMDgvMDUgMTE6NDc6MTAgJCAgICRSZXZpc2lvbjogMS42ICQKKyogT3JpZ2luYWwJCTogMjAwNC8wNS8yNSAwNTo1OTozNyAgICBSZXZpc2lvbjogMS41NyAgICAgIFRhZzogaGNmN190MjAwNDA2MDJfMDEKKyogT3JpZ2luYWwJCTogMjAwNC8wNS8xMyAxNTozMTo0NSAgICBSZXZpc2lvbjogMS41NCAgICAgIFRhZzogaGNmN190N18yMDA0MDUxM18wMQorKiBPcmlnaW5hbAkJOiAyMDA0LzA0LzE1IDA5OjI0OjQxICAgIFJldmlzaW9uOiAxLjQ3ICAgICAgVGFnOiBoY2Y3X3Q3XzIwMDQwNDE1XzAxCisqIE9yaWdpbmFsCQk6IDIwMDQvMDQvMTMgMTQ6MjI6NDUgICAgUmV2aXNpb246IDEuNDYgICAgICBUYWc6IHQ3XzIwMDQwNDEzXzAxCisqIE9yaWdpbmFsCQk6IDIwMDQvMDQvMDEgMTU6MzI6NTUgICAgUmV2aXNpb246IDEuNDIgICAgICBUYWc6IHQ3XzIwMDQwNDAxXzAxCisqIE9yaWdpbmFsCQk6IDIwMDQvMDMvMTAgMTU6Mzk6MjggICAgUmV2aXNpb246IDEuMzggICAgICBUYWc6IHQyMDA0MDMxMF8wMQorKiBPcmlnaW5hbAkJOiAyMDA0LzAzLzA0IDExOjAzOjM3ICAgIFJldmlzaW9uOiAxLjM2ICAgICAgVGFnOiB0MjAwNDAzMDRfMDEKKyogT3JpZ2luYWwJCTogMjAwNC8wMy8wMiAwOToyNzoxMSAgICBSZXZpc2lvbjogMS4zNCAgICAgIFRhZzogdDIwMDQwMzAyXzAzCisqIE9yaWdpbmFsCQk6IDIwMDQvMDIvMjQgMTM6MDA6MjcgICAgUmV2aXNpb246IDEuMjkgICAgICBUYWc6IHQyMDA0MDIyNF8wMQorKiBPcmlnaW5hbAkJOiAyMDA0LzAyLzE4IDE3OjEzOjU3ICAgIFJldmlzaW9uOiAxLjI2ICAgICAgVGFnOiB0MjAwNDAyMTlfMDEKKyoKKyogQVVUSE9SCTogTmljbyBWYWxzdGVyCisqCisqIERFU0MJCTogRGVmaW5pdGlvbnMgYW5kIFByb3RvdHlwZXMgZm9yIEhDRiwgREhGLCBNTUQgYW5kIE1TRgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCisqIFNPRlRXQVJFIExJQ0VOU0UKKyoKKyogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisqCisqIENPUFlSSUdIVCCpIDE5OTQgLSAxOTk1CWJ5IEFUJlQuCQkJCUFsbCBSaWdodHMgUmVzZXJ2ZWQKKyogQ09QWVJJR0hUIKkgMTk5NiAtIDIwMDAgYnkgTHVjZW50IFRlY2hub2xvZ2llcy4JQWxsIFJpZ2h0cyBSZXNlcnZlZAorKiBDT1BZUklHSFQgqSAyMDAxIC0gMjAwNAlieSBBZ2VyZSBTeXN0ZW1zIEluYy4JQWxsIFJpZ2h0cyBSZXNlcnZlZAorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisqCisqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorKiAgICBkaXN0cmlidXRpb24uCisqCisqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorKgorKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisqCisqIERpc2NsYWltZXIKKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorKiBEQU1BR0UuCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBUaGUgbWFjcm9zIFhuKC4uLikgYW5kIFhYbiguLi4pIGFyZSB1c2VkIHRvIGRlZmluZSB0aGUgTFRWJ3MgKHNob3J0IGZvciBMZW5ndGggVHlwZSBWYWx1ZVsgXSkgLAorKiBha2EgUklEcywgcHJvY2Vzc2VkIGJ5IHRoZSBIZXJtZXMuCisqIFRoZSBuIGluIFhuIGFuZCBYWG4gcmVmbGVjdHMgdGhlIG51bWJlciBvZiAiVmFsdWUiIGZpZWxkcyBpbiB0aGVzZSBSSURzLgorKgorKiBYbiguLi4pIDogTWFjcm9zIHVzZWQgZm9yIFJJRHMgd2hpY2ggdXNlIG9ubHkgdHlwZSBoY2ZfMTYgZm9yIHRoZSAiViIgZmllbGRzIG9mIHRoZSBMVFYuCisqIFhuIHRha2VzIGFzIHBhcmFtZXRlcnMgYSBSSUQgbmFtZSBhbmQgIm4iIG5hbWUocyksIG9uZSBmb3IgZWFjaCBvZiB0aGUgIlYiIGZpZWxkcyBvZiB0aGUgTFRWLgorKgorKiBYWG4oLi4uKSA6IE1hY3JvcyB1c2VkIGZvciBSSURzIHdoaWNoIHVzZSBhdCBsZWFzdCBvbmUgb3RoZXIgdHlwZSB0aGVuIGhjZl8xNiBmb3IgYSAiViIgZmllbGQKKyogb2YgdGhlIExUVi4KKyogWFhuKC4uKSB0YWtlcyBhcyBwYXJhbWV0ZXJzIGEgUklEIG5hbWUgYW5kICJuIiBwYWlyKHMpIG9mIHR5cGUgYW5kIG5hbWUsIG9uZSBmb3IgZWFjaCAiViIgZmllbGQKKyogb2YgdGhlIExUVgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBlIHggYSBtIHAgbCBlIHMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyogWDEoUklEX05BTUUsIHBhcmFtZXRlcnMuLi4pIDogZXhwYW5kcyB0byA6CisqICAgIHR5cGVkZWYgc3RydWN0IFJJRF9OQU1FX1NUUkNUIHsKKyogICAgICAgICBoY2ZfMTYgIGxlbjsKKyogICAgICAgICBoY2ZfMTYgIHR5cDsKKyogICAgICAgICBoY2ZfMTYgIHBhcjE7CisqICAgIH0gUklEX05BTUVfU1RSQ1Q7CisKKyogWDIoUklEX05BTUUsIHBhcmFtZXRlcnMuLi4pIDogZXhwYW5kcyB0byA6CisqICAgIHR5cGVkZWYgc3RydWN0IFJJRF9OQU1FX1NUUkNUIHsKKyogICAgICAgICBoY2ZfMTYgIGxlbjsKKyogICAgICAgICBoY2ZfMTYgIHR5cDsKKyogICAgICAgICBoY2ZfMTYgIHBhcjE7CisqICAgICAgICAgaGNmXzE2ICBwYXIyOworKiAgICB9IFJJRF9OQU1FX1NUUkNUOworCisKKyogWFgxKFJJRF9OQU1FLCBwYXIxdHlwZSwgcGFyMW5hbWUsIC4uLikgOiBleHBhbmRzIHRvIDoKKyogICAgdHlwZWRlZiBzdHJ1Y3QgUklEX05BTUVfU1RSQ1QgeworKiAgICAgICBoY2ZfMTYgICAgbGVuOworKiAgICAgICBoY2ZfMTYgICAgdHlwOworKiAgICAgICBwYXIxdHlwZSAgcGFyMW5hbWU7CisqICAgIH0gUklEX05BTUVfU1RSQ1Q7CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogWFggU3ViLW1hY3JvIGRlZmluaXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFhYMSggbmFtZSwgdHlwZTEsIHBhcjEgKQlcCit0eXBlZGVmIHN0cnVjdCB7CQkJCSAgCVwKKwloY2ZfMTYJbGVuOyAgICAgICAgICAgICAgICAJXAorCWhjZl8xNgl0eXA7ICAgICAgICAgICAgICAgIAlcCisJdHlwZTEJcGFyMTsgICAgICAgICAgICAgICAJXAorfSBuYW1lIyNfU1RSQ1Q7CisKKyNkZWZpbmUgWFgyKCBuYW1lLCB0eXBlMSwgcGFyMSwgdHlwZTIsIHBhcjIgKQlcCit0eXBlZGVmIHN0cnVjdCB7CQkJCSAgIAlcCisJaGNmXzE2CWxlbjsgICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJdHlwOyAgICAgICAgICAgICAgICAJXAorCXR5cGUxCXBhcjE7ICAgICAgICAgICAgICAgCVwKKwl0eXBlMglwYXIyOyAgICAgICAgICAgICAgIAlcCit9IG5hbWUjI19TVFJDVDsKKworI2RlZmluZSBYWDMoIG5hbWUsIHR5cGUxLCBwYXIxLCB0eXBlMiwgcGFyMiwgdHlwZTMsIHBhcjMgKQlcCit0eXBlZGVmIHN0cnVjdCBuYW1lIyNfU1RSQ1QgeyAgIAlcCisJaGNmXzE2CWxlbjsgICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJdHlwOyAgICAgICAgICAgICAgICAJXAorCXR5cGUxCXBhcjE7ICAgICAgICAgICAgICAgCVwKKwl0eXBlMglwYXIyOyAgICAgICAgICAgICAgIAlcCisJdHlwZTMJcGFyMzsgICAgICAgICAgICAgICAJXAorfSBuYW1lIyNfU1RSQ1Q7CisKKyNkZWZpbmUgWFg0KCBuYW1lLCB0eXBlMSwgcGFyMSwgdHlwZTIsIHBhcjIsIHR5cGUzLCBwYXIzLCB0eXBlNCwgcGFyNCApCVwKK3R5cGVkZWYgc3RydWN0IHsJCQkJICAJXAorCWhjZl8xNglsZW47ICAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXR5cDsgICAgICAgICAgICAgICAgCVwKKwl0eXBlMQlwYXIxOyAgICAgICAgICAgICAgIAlcCisJdHlwZTIJcGFyMjsgICAgICAgICAgICAgICAJXAorCXR5cGUzCXBhcjM7ICAgICAgICAgICAgICAgCVwKKwl0eXBlNAlwYXI0OyAgICAgICAgICAgICAgIAlcCit9IG5hbWUjI19TVFJDVDsKKworI2RlZmluZSBYMSggbmFtZSwgcGFyMSApCVwKK3R5cGVkZWYgc3RydWN0IG5hbWUjI19TVFJDVCB7ICAgCVwKKwloY2ZfMTYJbGVuOyAgICAgICAgICAgICAgICAJXAorCWhjZl8xNgl0eXA7ICAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjE7ICAgICAgICAgICAgICAgCVwKK30gbmFtZSMjX1NUUkNUOworCisjZGVmaW5lIFgyKCBuYW1lLCBwYXIxLCBwYXIyICkJCVwKK3R5cGVkZWYgc3RydWN0IHsJCQkgICAgCVwKKwloY2ZfMTYJbGVuOyAgICAgICAgICAgICAgICAJXAorCWhjZl8xNgl0eXA7ICAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjE7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyMjsgICAgICAgICAgICAgICAJXAorfSBuYW1lIyNfU1RSQ1Q7CisKKyNkZWZpbmUgWDMoIG5hbWUsIHBhcjEsIHBhcjIsIHBhcjMgKQkJXAordHlwZWRlZiBzdHJ1Y3QgewkJCSAgICAJXAorCWhjZl8xNglsZW47ICAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXR5cDsgICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyMTsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXIyOyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjM7ICAgICAgICAgICAgICAgCVwKK30gbmFtZSMjX1NUUkNUOworCisjZGVmaW5lIFg0KCBuYW1lLCBwYXIxLCBwYXIyLCBwYXIzLCBwYXI0ICkJCVwKK3R5cGVkZWYgc3RydWN0IHsJCQkgICAgCVwKKwloY2ZfMTYJbGVuOyAgICAgICAgICAgICAgICAJXAorCWhjZl8xNgl0eXA7ICAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjE7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyMjsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXIzOyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjQ7ICAgICAgICAgICAgICAgCVwKK30gbmFtZSMjX1NUUkNUOworCisjZGVmaW5lIFg1KCBuYW1lLCBwYXIxLCBwYXIyLCBwYXIzLCBwYXI0LCBwYXI1ICkJCVwKK3R5cGVkZWYgc3RydWN0IHsJCQkgICAgCVwKKwloY2ZfMTYJbGVuOyAgICAgICAgICAgICAgICAJXAorCWhjZl8xNgl0eXA7ICAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjE7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyMjsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXIzOyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjQ7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyNTsgICAgICAgICAgICAgICAJXAorfSBuYW1lIyNfU1RSQ1Q7CisKKyNkZWZpbmUgWDYoIG5hbWUsIHBhcjEsIHBhcjIsIHBhcjMsIHBhcjQsIHBhcjUsIHBhcjYgKQkJXAordHlwZWRlZiBzdHJ1Y3QgewkJCSAgICAJXAorCWhjZl8xNglsZW47ICAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXR5cDsgICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyMTsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXIyOyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjM7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyNDsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXI1OyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjY7ICAgICAgICAgICAgICAgCVwKK30gbmFtZSMjX1NUUkNUOworCisjZGVmaW5lIFg4KCBuYW1lLCBwYXIxLCBwYXIyLCBwYXIzLCBwYXI0LCBwYXI1LCBwYXI2LCBwYXI3LCBwYXI4ICkJCVwKK3R5cGVkZWYgc3RydWN0IHsJCQkgICAgCVwKKwloY2ZfMTYJbGVuOyAgICAgICAgICAgICAgICAJXAorCWhjZl8xNgl0eXA7ICAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjE7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyMjsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXIzOyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjQ7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyNTsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXI2OyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjc7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyODsgICAgICAgICAgICAgICAJXAorfSBuYW1lIyNfU1RSQ1Q7CisKKyNkZWZpbmUgWDExKCBuYW1lLCBwYXIxLCBwYXIyLCBwYXIzLCBwYXI0LCBwYXI1LCBwYXI2LCBwYXI3LCBwYXI4LCBwYXI5LCBwYXIxMCwgcGFyMTEgKQkJXAordHlwZWRlZiBzdHJ1Y3QgewkJCSAgICAJXAorCWhjZl8xNglsZW47ICAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXR5cDsgICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyMTsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXIyOyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjM7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyNDsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXI1OyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjY7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyNzsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXI4OyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjk7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyMTA7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyMTE7ICAgICAgICAgICAgICAgCVwKK30gbmFtZSMjX1NUUkNUOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTdWJzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vYXBwYXJlbnRseSBub3QgbmVlZGVkIChDRkdfQ05GX0NPVU5UUlkpCit0eXBlZGVmIHN0cnVjdCBDSEFOTkVMX1NFVCB7CQkJCS8vY2hhbm5lbCBzZXQgc3RydWN0dXJlIHVzZWQgaW4gdGhlIENGR19DTkZfQ09VTlRSWSBMVFYKKwloY2ZfMTYJZmlyc3RfY2hhbm5lbDsKKwloY2ZfMTYJbnVtYmVyX29mX2NoYW5uZWxzOworCWhjZl8xNgltYXhfdHhfb3V0cHV0X2xldmVsOworfSBDSEFOTkVMX1NFVDsKKwordHlwZWRlZiBzdHJ1Y3QgS0VZX1NUUkNUIHsJCQkJCS8vIGtleSBzdHJ1Y3R1cmUgdXNlZCBpbiB0aGUgQ0ZHX0RFRkFVTFRfS0VZUyBMVFYKKyAgICBoY2ZfMTYgIGxlbjsJICAgICAgICAgICAgICAJCQkJLy9sZW5ndGggb2Yga2V5CisgICAgaGNmXzggICBrZXlbMTRdOwkJCQkJCQkvL2VuY3J5cHRpb24ga2V5Cit9IEtFWV9TVFJDVDsKKwordHlwZWRlZiBzdHJ1Y3QgU0NBTl9SU19TVFJDVCB7CQkJCS8vIFNjYW4gUmVzdWx0IHN0cnVjdHVyZSB1c2VkIGluIHRoZSBDRkdfU0NBTiBMVFYKKwloY2ZfMTYJY2hhbm5lbF9pZDsKKwloY2ZfMTYJbm9pc2VfbGV2ZWw7CisJaGNmXzE2CXNpZ25hbF9sZXZlbDsKKwloY2ZfOAlic3NpZFs2XTsKKwloY2ZfMTYJYmVhY29uX2ludGVydmFsX3RpbWU7CisJaGNmXzE2CWNhcGFiaWxpdHk7CisJaGNmXzE2CXNzaWRfbGVuOworCWhjZl84CXNzaWRfdmFsWzMyXTsKK30gU0NBTl9SU19TVFJDVDsKKwordHlwZWRlZiBzdHJ1Y3QgQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QgewkJLy8gcmFuZ2Ugc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgdXNlZCBpbiBDRkdfUkFOR0VTLCBDRkdfUkFOR0UxIGV0YworCWhjZl8xNgl2YXJpYW50OworCWhjZl8xNglib3R0b207CisJaGNmXzE2CXRvcDsKK30gQ0ZHX1JBTkdFX1NQRUNfU1RSQ1Q7CisKK3R5cGVkZWYgc3RydWN0IENGR19SQU5HRV9TUEVDX0JZVEVfU1RSQ1QgewkvLyBieXRlIG9yaWVudGVkIHJhbmdlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHVzZWQgaW4gQ0ZHX1JBTkdFX0IgTFRWCisJaGNmXzgJdmFyaWFudFsyXTsKKwloY2ZfOAlib3R0b21bMl07CisJaGNmXzgJdG9wWzJdOworfSBDRkdfUkFOR0VfU1BFQ19CWVRFX1NUUkNUOworCisvL3VzZWQgdG8gc2V0IHVwICJUIiBmdW5jdGlvbmFsaXR5IGZvciBJbmZvIGZyYW1lcywgaS5lLiBsb2cgaW5mbyBmcmFtZXMgaW4gTVNGIHN1cHBsaWVkIGJ1ZmZlciBhbmQgTWFpbEJveAorWFgxKCBSSURfTE9HLCB1bnNpZ25lZCBzaG9ydCBGQVIqLCBidWZwICkKK3R5cGVkZWYgUklEX0xPR19TVFJDVCAgRkFSICpSSURfTE9HUDsKK1hYMSggQ0ZHX1JJRF9MT0csIFJJRF9MT0dQLCByZWNvcmRwICkKKworIFgxKCBMVFYsCQl2YWxbMV0gKQkJCQkJCQkJCQkJCS8qbWluaW11bSBMVFYgcHJvdG8gdHlwCSovCisgWDEoIExUVl9NQVgsCXZhbFtIQ0ZfTUFYX0xUVl0gKQkJCQkJCQkJCQkvKm1heGltdW0gTFRWIHByb3RvIHR5cAkqLworWFgyKCBDRkdfUkVHX01CLCBoY2ZfMTYqICwgbWJfYWRkciwgaGNmXzE2LCBtYl9zaXplICkKKwordHlwZWRlZiBzdHJ1Y3QgQ0ZHX01CX0lORk9fRlJBRyB7CS8vIHNwZWNpZmljYXRpb24gb2YgYnVmZmVyIGZyYWdtZW50CisJdW5zaWduZWQgc2hvcnQgRkFSKglmcmFnX2FkZHI7CisJaGNmXzE2CQkJCWZyYWdfbGVuOworfSBDRkdfTUJfSU5GT19GUkFHOworCisvKiBNYWlsIEJveCBJbmZvIEJsb2NrIHN0cnVjdHVyZXMsCisgKiB0aGUgYmFzZSBmb3JtOiBDRkdfTUJfSU5GT19TVFJDVAorICogYW5kIHRoZSBkZXJpdmVkIGZvcm1zOiBDRkdfTUJfSU5GT19SQU5HRTxuPl9TVFJDVCB3aXRoIG4gaXMgMSwgMiwgMyBvciAyMAorICogcHJlZGVmaW5lZCBmb3IgYSBwYXlsb2FkIG9mIDEsIGFuZCB1cCB0byAyLCAzIGFuZCAyMCBDRkdfTUJfSU5GT19GUkFHIGVsZW1lbnRzICovCitYWDMoIENGR19NQl9JTkZPLAkJICBoY2ZfMTYsIGJhc2VfdHlwLCBoY2ZfMTYsIGZyYWdfY250LCBDRkdfTUJfSU5GT19GUkFHLCBmcmFnX2J1ZlsgMV0gKQorWFgzKCBDRkdfTUJfSU5GT19SQU5HRTEsICBoY2ZfMTYsIGJhc2VfdHlwLCBoY2ZfMTYsIGZyYWdfY250LCBDRkdfTUJfSU5GT19GUkFHLCBmcmFnX2J1ZlsgMV0gKQorWFgzKCBDRkdfTUJfSU5GT19SQU5HRTIsICBoY2ZfMTYsIGJhc2VfdHlwLCBoY2ZfMTYsIGZyYWdfY250LCBDRkdfTUJfSU5GT19GUkFHLCBmcmFnX2J1ZlsgMl0gKQorWFgzKCBDRkdfTUJfSU5GT19SQU5HRTMsICBoY2ZfMTYsIGJhc2VfdHlwLCBoY2ZfMTYsIGZyYWdfY250LCBDRkdfTUJfSU5GT19GUkFHLCBmcmFnX2J1ZlsgM10gKQorWFgzKCBDRkdfTUJfSU5GT19SQU5HRTIwLCBoY2ZfMTYsIGJhc2VfdHlwLCBoY2ZfMTYsIGZyYWdfY250LCBDRkdfTUJfSU5GT19GUkFHLCBmcmFnX2J1ZlsyMF0gKQorCitYWDMoIENGR19NQl9BU1NFUlQsIGhjZl8xNiwgbGluZSwgaGNmXzE2LCB0cmFjZSwgaGNmXzMyLCBxdWFsaWZpZXIgKQkvKk1CSW5mb0Jsb2NrIGZvciBhc3NlcnRzCSovCisjaWYgKEhDRl9BU1NFUlQpICYgKCBIQ0ZfQVNTRVJUX0xOS19NU0ZfUlROIHwgSENGX0FTU0VSVF9SVF9NU0ZfUlROICkKK3R5cGVkZWYgdm9pZCAoTVNGX0FTU0VSVF9SVE4pKCB1bnNpZ25lZCBpbnQgLCBoY2ZfMTYsIGhjZl8zMiApOwordHlwZWRlZiBNU0ZfQVNTRVJUX1JUTiAvKmNhbid0IGxpbmsgRkFSKi8gKiBNU0ZfQVNTRVJUX1JUTlA7CisvKiBDRkdfUkVHX0FTU0VSVF9SVE5QICgweDA4MzIpCShkZS0pcmVnaXN0ZXIgTVNGIENhbGxiYWNrIHJvdXRpbmVzCisgKiBsdmw6ICBBc3NlcnQgbGV2ZWwgZmlsdGVyaW5nIChub3QgeWV0IGltcGxlbWVudGVkKQorICogcnRucDogYWRkcmVzcyBvZiBNU0ZfQVNTRVJUX1JUTiAobmF0aXZlIEVuZGlhbiBmb3JtYXQpICovCitYWDIoIENGR19SRUdfQVNTRVJUX1JUTlAsIGhjZl8xNiwgbHZsLCBNU0ZfQVNTRVJUX1JUTlAsIHJ0bnAgKQorI2VuZGlmIC8vIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4gLyBIQ0ZfQVNTRVJUX1JUX01TRl9SVE4KKworIFgxKCBDRkdfSENGX09QVCwgdmFsWzIwXSApCQkJCQkJCQkJCQkgIAkvKihDb21waWxlIHRpbWUpIG9wdGlvbnMJKi8KKyBYMyggQ0ZHX0NNRF9IQ0YsIGNtZCwgbW9kZSwgYWRkX2luZm8gKQkJCQkJCQkJCS8qSENGIEVuZ2luZWVyaW5nIGNvbW1hbmQJKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCWhjZl8xNgkJbGVuOworCWhjZl8xNgkJdHlwOworCWhjZl8xNgkJbW9kZTsJCQkvLyBQUk9HX1NUT1AvVk9MQVRJTEUgW0ZMQVNIL1NFRVBST00vU0VFUFJPTV9SRUFEQkFDS10KKwloY2ZfMTYJCXNlZ21lbnRfc2l6ZTsgIAkvLyBzaXplIG9mIHRoZSBzZWdtZW50IGluIGJ5dGVzCisJaGNmXzMyCQluaWNfYWRkcjsgIAkJLy8gZGVzdGluYXRpb24gYWRkcmVzcyAoaW4gTklDIG1lbW9yeSkKKwloY2ZfMTYJCWZsYWdzOwkJCS8vIDB4MDAwMQk6IENSQyBZZXMvTm8KKy8vCWhjZl8zMgkJZmxhZ3M7CQkJLy8gMHgwMDAxCTogQ1JDIFllcy9ObworCS8qIDs/IHN0aWxsIG5vdCB0aGUgd2hvbGUgc3RvcnkKKwkgKiBmbGFncyBpcyBleHRlbmRlZCBmcm9tIDE2IHRvIDMyIGJpdHMgdG8gZm9yY2UgdGhhdCBjb21waWxpbmcgRlcuQyBwcm9kdWNlcyB0aGUgc2FtZSBzdHJ1Y3R1cmVzCisJICogaW4gbWVtb3J5IGFzIEZVUFU0IEJJTiBmaWxlcy4KKwkgKiBOb3RlIHRoYXQgdGhlIHByb2JsZW0gYXJpc2VzIGZyb20gdGhlIHZpb2xhdGlvbiBvZiB0aGUgY29uc3RyYWludCB0byB1c2UgcGFja2luZyBhdCBieXRlIGJvdW5kYXJpZXMKKwkgKiBhcyB3YXMgc3RpcHVsYXRlZCBpbiB0aGUgV0NJLXNwZWNpZmljYXRpb24KKwkgKiBUaGUgUGFjayBwcmFnbWEgY2FuJ3QgcmVzb2x2ZSB0aGlzIGlzc3VlLCBiZWNhdXNlIHRoYXQgaW1wYWN0cyBhbGwgbWVtYmVycyBvZiB0aGUgc3RydWN0dXJlIHdpdGgKKwkgKiBkaXNyZWdhcmQgb2YgdGhlaXIgYWN0dWFsIHNpemUsIHNvIGFsaWduaW5nIGhvc3RfYWRkciB1bmRlciBNU1ZDIDEuNSBhdCA0IGJ5dGVzLCBhbHNvIGFsaWducworCSAqIGxlbiwgdHlwIGV0YyBvbiA0IGJ5dGVzCisJICogKi8KKy8vCWhjZl8xNgkJcGFkOyAJIAkJLy8hISBiZSBjYXJlZnVsIGFsaWdubWVudCBwcm9ibGVtcyBmb3IgQmluIGRvd25sb2FkIHZlcnN1cyBDIGRvd25sb2FkCisJaGNmXzggRkFSICAgKmhvc3RfYWRkcjsgIAkvLyBzb3VyY2UgYWRkcmVzcyAoaW4gSG9zdCBtZW1vcnkpCit9IENGR19QUk9HX1NUUkNUOyAvLyBzZWdtZW50X2Rlc2NwOworCisvLyBhIHN0cnVjdHVyZSB1c2VkIGZvciB0cmFuc3BvcnRpbmcgZGVidWctcmVsYXRlZCBpbmZvcm1hdGlvbiBmcm9tIGZpcm13YXJlCisvLyB2aWEgdGhlIEhDRiwgaW50byB0aGUgTVNGCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaGNmXzE2ICAgICAgbGVuOworICAgIGhjZl8xNiAgICAgIHR5cDsKKyAgICBoY2ZfMTYgICAgICBtc2dfaWQsIG1zZ19wYXIsIG1zZ190c3RhbXA7Cit9IENGR19GV19QUklOVEZfU1RSQ1Q7CisKKy8vIGEgc3RydWN0dXJlIHVzZWQgdG8gZGVmaW5lIHRoZSBsb2NhdGlvbiBhbmQgc2l6ZSBvZiBhIGNlcnRhaW4gZGVidWctcmVsYXRlZAorLy8gYnVmZmVyIGluIG5pYy1yYW0uCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaGNmXzE2ICAgICAgbGVuOworICAgIGhjZl8xNiAgICAgIHR5cDsKKyAgICBoY2ZfMzIgICAgICBEYk1zZ0NvdW50LCAJLy8gZHMgKG5pY3JhbSkgYWRkcmVzcyBvZiBhIGNvdW50ZXIKKyAgICAgICAgICAgICAgICBEYk1zZ0J1ZmZlciwgCS8vIGRzIChuaWNyYW0pIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgIERiTXNnU2l6ZSwgCQkvLyBudW1iZXIgb2YgZW50cmllcyAoZWFjaCAzIHdvcmQgaW4gc2l6ZSkgaW4gdGhpcyBidWZmZXIKKyAgICAgICAgICAgICAgICBEYk1zZ0ludHJ2bDsJLy8gZHMgKG5pY3JhbSkgYWRkcmVzcyBvZiBpbnRlcnZhbCBmb3IgZ2VuZXJhdGluZyBJbmZEcm9wIGV2ZW50Cit9IENGR19GV19QUklOVEZfQlVGRkVSX0xPQ0FUSU9OX1NUUkNUOworCitYWDMoIENGR19SQU5HRVMsCWhjZl8xNiwgcm9sZSwgaGNmXzE2LCBpZCwgQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QsIHZhcl9yZWNbIDFdICkgLypBY3Rvci9TdXBwbGllciByYW5nZSAoMSB2YXJpYW50KSovCitYWDMoIENGR19SQU5HRTEsCWhjZl8xNiwgcm9sZSwgaGNmXzE2LCBpZCwgQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QsIHZhcl9yZWNbIDFdICkgLypBY3Rvci9TdXBwbGllciByYW5nZSAoMSB2YXJpYW50KSovCitYWDMoIENGR19SQU5HRTIsCWhjZl8xNiwgcm9sZSwgaGNmXzE2LCBpZCwgQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QsIHZhcl9yZWNbIDJdICkgLypBY3RvciByYW5nZSAoIDIgdmFyaWFudHMpCQkqLworWFgzKCBDRkdfUkFOR0UzLAloY2ZfMTYsIHJvbGUsIGhjZl8xNiwgaWQsIENGR19SQU5HRV9TUEVDX1NUUkNULCB2YXJfcmVjWyAzXSApIC8qQWN0b3IgcmFuZ2UgKCAzIHZhcmlhbnRzKQkJKi8KK1hYMyggQ0ZHX1JBTkdFNCwJaGNmXzE2LCByb2xlLCBoY2ZfMTYsIGlkLCBDRkdfUkFOR0VfU1BFQ19TVFJDVCwgdmFyX3JlY1sgNF0gKSAvKkFjdG9yIHJhbmdlICggNCB2YXJpYW50cykJCSovCitYWDMoIENGR19SQU5HRTUsCWhjZl8xNiwgcm9sZSwgaGNmXzE2LCBpZCwgQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QsIHZhcl9yZWNbIDVdICkgLypBY3RvciByYW5nZSAoIDUgdmFyaWFudHMpCQkqLworWFgzKCBDRkdfUkFOR0U2LAloY2ZfMTYsIHJvbGUsIGhjZl8xNiwgaWQsIENGR19SQU5HRV9TUEVDX1NUUkNULCB2YXJfcmVjWyA2XSApIC8qQWN0b3IgcmFuZ2UgKCA2IHZhcmlhbnRzKQkJKi8KK1hYMyggQ0ZHX1JBTkdFNywJaGNmXzE2LCByb2xlLCBoY2ZfMTYsIGlkLCBDRkdfUkFOR0VfU1BFQ19TVFJDVCwgdmFyX3JlY1sgN10gKSAvKkFjdG9yIHJhbmdlICggNyB2YXJpYW50cykJCSovCitYWDMoIENGR19SQU5HRTIwLAloY2ZfMTYsIHJvbGUsIGhjZl8xNiwgaWQsIENGR19SQU5HRV9TUEVDX1NUUkNULCB2YXJfcmVjWzIwXSApIC8qQWN0b3IgcmFuZ2UgKDIwIHZhcmlhbnRzKQkJKi8KKworLypGcmFtZXMgKi8KKyBYMyggQ0ZHX0FTU09DX1NUQVQsICBhc3NvY19zdGF0LCBzdGF0aW9uX2FkZHJbM10sIHZhbFs0Nl0gKSAJLypBc3NvY2lhdGlvbiBzdGF0dXMsIGJhc2ljCQkJCQkqLworIFgyKCBDRkdfQVNTT0NfU1RBVDMsIGFzc29jX3N0YXQsIHN0YXRpb25fYWRkclszXSApIAkJCQkJCQkJLyphc3NvY19zdGF0OjMJCQkqLworIFgzKCBDRkdfQVNTT0NfU1RBVDEsIGFzc29jX3N0YXQsIHN0YXRpb25fYWRkclszXSwgZnJhbWVfYm9keVs0M10gKQkJCQkJLyphc3NvY19zdGF0OjEJCQkqLworIFg0KCBDRkdfQVNTT0NfU1RBVDIsIGFzc29jX3N0YXQsIHN0YXRpb25fYWRkclszXSwgb2xkX2FwX2FkZHJbM10sIGZyYW1lX2JvZHlbNDNdICkJLyphc3NvY19zdGF0OjIJCQkqLworCisvKlN0YXRpYyBDb25maWd1cmF0aW9ucyAqLworIFgxKCBDRkdfQ05GX1BPUlRfVFlQRSwJCQkJcG9ydF90eXBlCQkJICkgLypbU1RBXSBDb25uZWN0aW9uIGNvbnRyb2wgY2hhcmFjdGVyaXN0aWNzCQkJCSovCisgWDEoIENGR19NQUNfQUREUiwJCQkJCW1hY19hZGRyWzNdIAkJICkgLypnZW5lcmFsOiBGQzAxLEZDMDgsRkMxMSxGQzEyLEZDMTMsRkMxNCxGQzE1LEZDMTYgCQkqLworIFgxKCBDRkdfQ05GX09XTl9NQUNfQUREUiwJCQltYWNfYWRkclszXQkJCSApCisgWDEoIENGR19JRCwJCQkJCQlzc2lkWzE3XQkJCSApIC8qMHhGQzAyLCAweEZDMDQsIDB4RkMwRSAJCQkJCQkJCSovCisvKglYMSggQ0ZHX0RFU0lSRURfU1NJRCwJCQlzc2lkWzE3XQkJCSApCXNlZSBEeW5hbWljIENvbmZpZ3VyYXRpb25zCQkJCQkJCQkqLworIFgxKCBDRkdfQ05GX09XTl9DSEFOTkVMLAkJCWNoYW5uZWwJCQkJICkgLypDb21tdW5pY2F0aW9uIGNoYW5uZWwgZm9yIEJTUyBjcmVhdGlvbgkJCQkJKi8KKyBYMSggQ0ZHX0NORl9PV05fU1NJRCwJCQkJc3NpZFsxN10JCQkgKQorIFgxKCBDRkdfQ05GX09XTl9BVElNX1dJTkRPVywJCWF0aW1fd2luZG93CQkJICkKKyBYMSggQ0ZHX0NORl9TWVNURU1fU0NBTEUsCQkJc3lzdGVtX3NjYWxlCQkgKQorIFgxKCBDRkdfQ05GX01BWF9EQVRBX0xFTiwJCQltYXhfZGF0YV9sZW4JCSApCisgWDEoIENGR19DTkZfV0RTX0FERFIsCQkJCW1hY19hZGRyWzNdCQkJICkgLypbU1RBXSBNQUMgQWRkcmVzcyBvZiBjb3JyZXNwb25kaW5nIFdEUyBMaW5rIG5vZGUJCSovCisgWDEoIENGR19DTkZfUE1fRU5BQkxFRCwJCQlwbV9lbmFibGVkCQkJICkgLypbU1RBXSBTd2l0Y2ggZm9yIEVTUyBQb3dlciBNYW5hZ2VtZW50IChQTSkgT24vT2ZmCQkqLworIFgxKCBDRkdfQ05GX1BNX0VQUywJCQkJcG1fZXBzCQkJCSApIC8qW1NUQV0gU3dpdGNoIGZvciBFU1MgUE0gRVBTL1BTIE1vZGUJCQkJCSovCisgWDEoIENGR19DTkZfTUNBU1RfUlgsCQkJCW1jYXN0X3J4CQkJICkgLypbU1RBXSBTd2l0Y2ggZm9yIEVTUyBQTSBNdWx0aWNhc3QgcmVjZXB0aW9uIE9uL09mZgkJKi8KKyBYMSggQ0ZHX0NORl9NQVhfU0xFRVBfRFVSQVRJT04sCWR1cmF0aW9uCQkJICkgLypbU1RBXSBNYXhpbXVtIHNsZWVwIHRpbWUgZm9yIEVTUyBQTQkJCQkJKi8KKyBYMSggQ0ZHX0NORl9QTV9IT0xET1ZFUl9EVVJBVElPTiwJZHVyYXRpb24JCQkgKSAvKltTVEFdIEhvbGRvdmVyIHRpbWUgZm9yIEVTUyBQTQkJCQkJCQkqLworIFgxKCBDRkdfQ05GX09XTl9OQU1FLAkJCQlzc2lkWzE3XQkJCSApIC8qSWRlbnRpZmljYXRpb24gdGV4dCBmb3IgZGlhZ25vc3RpYyBwdXJwb3NlcwkJCSovCisgWDEoIENGR19DTkZfT1dOX0RUSU1fUEVSSU9ELAkJcGVyaW9kCQkJCSApIC8qW0FQXSBCZWFjb24gaW50ZXJ2YWxzIGJldHdlZW4gc3VjY2Vzc2l2ZSBEVElNcwkJCSovCisgWDEoIENGR19DTkZfV0RTX0FERFIxLAkJCQltYWNfYWRkclszXQkJCSApIC8qW0FQXSBQb3J0IDEgTUFDIEFkcnMgb2YgY29ycmVzcG9uZGluZyBXRFMgTGluayBub2RlCSovCisgWDEoIENGR19DTkZfV0RTX0FERFIyLAkJCQltYWNfYWRkclszXQkJCSApIC8qW0FQXSBQb3J0IDIgTUFDIEFkcnMgb2YgY29ycmVzcG9uZGluZyBXRFMgTGluayBub2RlCSovCisgWDEoIENGR19DTkZfV0RTX0FERFIzLAkJCQltYWNfYWRkclszXQkJCSApIC8qW0FQXSBQb3J0IDMgTUFDIEFkcnMgb2YgY29ycmVzcG9uZGluZyBXRFMgTGluayBub2RlCSovCisgWDEoIENGR19DTkZfV0RTX0FERFI0LAkJCQltYWNfYWRkclszXQkJCSApIC8qW0FQXSBQb3J0IDQgTUFDIEFkcnMgb2YgY29ycmVzcG9uZGluZyBXRFMgTGluayBub2RlCSovCisgWDEoIENGR19DTkZfV0RTX0FERFI1LAkJCQltYWNfYWRkclszXQkJCSApIC8qW0FQXSBQb3J0IDUgTUFDIEFkcnMgb2YgY29ycmVzcG9uZGluZyBXRFMgTGluayBub2RlCSovCisgWDEoIENGR19DTkZfV0RTX0FERFI2LAkJCQltYWNfYWRkclszXQkJCSApIC8qW0FQXSBQb3J0IDYgTUFDIEFkcnMgb2YgY29ycmVzcG9uZGluZyBXRFMgTGluayBub2RlCSovCisgWDEoIENGR19DTkZfTUNBU1RfUE1fQlVGLAkJCW1jYXN0X3BtX2J1ZgkJICkgLypbQVBdIFN3aXRjaCBmb3IgUE0gYnVmZmVyaW5nIG9mIE11bHRpY2FzdCBNZXNzYWdlcwkqLworIFgxKCBDRkdfQ05GX1JFSkVDVF9BTlksCQkJcmVqZWN0X2FueQkJCSApIC8qW0FQXSBTd2l0Y2ggZm9yIFBNIGJ1ZmZlcmluZyBvZiBNdWx0aWNhc3QgTWVzc2FnZXMJKi8KKy8vWDEoIENGR19DTkZfRU5DUllQVElPTl9FTkFCTEVELAllbmNyeXB0aW9uCQkJICkgLypzcGVjaWZ5IGVuY3J5cHRpb24gdHlwZSBvZiBUeC9SeCBtZXNzYWdlcwkJCQkqLworIFgxKCBDRkdfQ05GX0VOQ1JZUFRJT04sCQkJZW5jcnlwdGlvbgkJCSApIC8qc3BlY2lmeSBlbmNyeXB0aW9uIHR5cGUgb2YgVHgvUnggbWVzc2FnZXMJCQkJKi8KKyBYMSggQ0ZHX0NORl9BVVRIRU5USUNBVElPTiwJCWF1dGhlbnRpY2F0aW9uCQkgKSAvKnNlbGVjdHMgQXV0aGVudGljYXRpb24gYWxnb3JpdGhtCQkJCQkJKi8KKyBYMSggQ0ZHX0NORl9FWENMX1VORU5DUllQVEVELAkJZXhjbHVkZV91bmVuY3J5cHRlZAkgKSAvKltBUF0gU3dpdGNoIGZvciAnY2xlYXItdGV4dCcgcnggbWVzc2FnZSBhY2NlcHRhbmNlCQkqLworIFgxKCBDRkdfQ05GX01DQVNUX1JBVEUsCQkJbWNhc3RfcmF0ZQkJCSApIC8qVHJhbnNtaXQgRGF0YSByYXRlIGZvciBNdWx0aWNhc3QgZnJhbWVzCQkJCSovCisgWDEoIENGR19DTkZfSU5UUkFfQlNTX1JFTEFZLAkJaW50cmFfYnNzX3JlbGF5CQkgKSAvKltBUF0gU3dpdGNoIGZvciBJbnRyYUJCUyByZWxheQkJCQkJCQkqLworIFgxKCBDRkdfQ05GX01JQ1JPX1dBVkUsCQkJbWljcm9fd2F2ZQkJCSApIC8qTWljcm9XYXZlIChSb2J1c3RuZXNzKQkJCQkJCQkJCSovCisgWDEoIENGR19DTkZfTE9BRF9CQUxBTkNJTkcsCQlsb2FkX2JhbGFuY2luZwkJICkgLypMb2FkIEJhbGFuY2luZwkgIChCb29sZWFuLCAwPU9GRiwgMT1PTiwgZGVmYXVsdD0xKQkJKi8KKyBYMSggQ0ZHX0NORl9NRURJVU1fRElTVFJJQlVUSU9OLAltZWRpdW1fZGlzdHJpYnV0aW9uCSApIC8qTWVkaXVtIERpc3RyaWJ1dGlvbiAoQm9vbGVhbiwgMD1PRkYsIDE9T04sIGRlZmF1bHQ9MSkJKi8KKyBYMSggQ0ZHX0NORl9HUk9VUF9BRERSX0ZJTFRFUiwJCWdyb3VwX2FkZHJfZmlsdGVyCSApIC8qR3JvdXAgQWRkcmVzcyBGaWx0ZXIJCQkJCQkJCSAgIAkqLworIFgxKCBDRkdfQ05GX1RYX1BPV19MVkwsCQkJdHhfcG93X2x2bAkJCSApIC8qVHggUG93ZXIgTGV2ZWwJCQkJCQkJCQkJICAgCSovCitYWDQoIENGR19DTkZfQ09VTlRSWV9JTkZPLAkJCQkJCQkJIFwKKwkJaGNmXzE2LCBuX2NoYW5uZWxfc2V0cywgaGNmXzE2LCBjb3VudHJ5X2NvZGVbMl0sIFwKKwkJaGNmXzE2LCBlbnZpcm9ubWVudCwgQ0hBTk5FTF9TRVQsIGNoYW5uZWxfc2V0WzFdICkgLypDdXJyZW50IENvdW50cnkgSW5mbyAgCQkJCQkJCQkJKi8KK1hYNCggQ0ZHX0NORl9DT1VOVFJZX0lORk9fTUFYLAkJCQkJCQkgXAorCQloY2ZfMTYsIG5fY2hhbm5lbF9zZXRzLCBoY2ZfMTYsIGNvdW50cnlfY29kZVsyXSwgXAorCQloY2ZfMTYsIGVudmlyb25tZW50LCBDSEFOTkVMX1NFVCwgY2hhbm5lbF9zZXRbMTRdKSAvKkN1cnJlbnQgQ291bnRyeSBJbmZvICAJCQkJCQkJCQkqLworCisvKkR5bmFtaWMgQ29uZmlndXJhdGlvbnMgKi8KKyBYMSggQ0ZHX0RFU0lSRURfU1NJRCwJCQlzc2lkWzE3XQkJCQkJICkJLypbU1RBXSBTZXJ2aWNlIFNldCBpZGVudGlmaWNhdGlvbiBmb3IgY29ubmVjdGlvbgkqLworI2RlZmluZSBHUk9VUF9BRERSX1NJWkUJCQkoMzIgKiA2KQkJCQkJCS8vMzIgNi1ieXRlIE1BQy1hZGRyZXNzZXMKKyBYMSggQ0ZHX0dST1VQX0FERFIsCQkJbWFjX2FkZHJbR1JPVVBfQUREUl9TSVpFLzJdCSApCS8qW1NUQV0gTXVsdGljYXN0IE1BQyBBZGRyZXNzZXMgZm9yIFJ4LW1lc3NhZ2UJCSovCisgWDEoIENGR19DUkVBVEVfSUJTUywJCQljcmVhdGVfaWJzcwkJCQkJICkJLypbU1RBXSBTd2l0Y2ggZm9yIElCU1MgY3JlYXRpb24gT24vT2ZmCQkJCSovCisgWDEoIENGR19SVFNfVEhSSCwJCQkJcnRzX3RocmgJCQkJCSApCS8qW1NUQV0gRnJhbWUgbGVuZ3RoIHVzZWQgZm9yIFJUUy9DVFMgaGFuZHNoYWtlCQkqLworIFgxKCBDRkdfVFhfUkFURV9DTlRMLAkJCXR4X3JhdGVfY250bAkJCQkgKQkvKltTVEFdIERhdGEgcmF0ZSBjb250cm9sIGZvciBtZXNzYWdlIHRyYW5zbWlzc2lvbgkqLworIFgxKCBDRkdfUFJPTUlTQ1VPVVNfTU9ERSwJCXByb21pc2N1b3VzX21vZGUJCQkgKQkvKltTVEFdIFN3aXRjaCBmb3IgUHJvbWlzY3VvdXMgbW9kZSByZWNlcHRpb24gT24vT2YJKi8KKyBYMSggQ0ZHX1dPTCwJCQkJCXdha2Vfb25fbGFuCQkJCQkgKQkvKltTVEFdIFN3aXRjaCBmb3IgV2FrZS1Pbi1MQU4gbW9kZQkJCQkJKi8KKyBYMSggQ0ZHX1JUU19USFJIMCwJCQkJcnRzX3RocmgJCQkJCSApCS8qW0FQXSBQb3J0IDAgZnJhbWUgbGVuZ3RoIGZvciBSVFMvQ1RTIGhhbmRzaGFrZQkqLworIFgxKCBDRkdfUlRTX1RIUkgxLAkJCQlydHNfdGhyaAkJCQkJICkJLypbQVBdIFBvcnQgMSBmcmFtZSBsZW5ndGggZm9yIFJUUy9DVFMgaGFuZHNoYWtlCSovCisgWDEoIENGR19SVFNfVEhSSDIsCQkJCXJ0c190aHJoCQkJCQkgKQkvKltBUF0gUG9ydCAyIGZyYW1lIGxlbmd0aCBmb3IgUlRTL0NUUyBoYW5kc2hha2UJKi8KKyBYMSggQ0ZHX1JUU19USFJIMywJCQkJcnRzX3RocmgJCQkJCSApCS8qW0FQXSBQb3J0IDMgZnJhbWUgbGVuZ3RoIGZvciBSVFMvQ1RTIGhhbmRzaGFrZQkqLworIFgxKCBDRkdfUlRTX1RIUkg0LAkJCQlydHNfdGhyaAkJCQkJICkJLypbQVBdIFBvcnQgNCBmcmFtZSBsZW5ndGggZm9yIFJUUy9DVFMgaGFuZHNoYWtlCSovCisgWDEoIENGR19SVFNfVEhSSDUsCQkJCXJ0c190aHJoCQkJCQkgKQkvKltBUF0gUG9ydCA1IGZyYW1lIGxlbmd0aCBmb3IgUlRTL0NUUyBoYW5kc2hha2UJKi8KKyBYMSggQ0ZHX1JUU19USFJINiwJCQkJcnRzX3RocmgJCQkJCSApCS8qW0FQXSBQb3J0IDYgZnJhbWUgbGVuZ3RoIGZvciBSVFMvQ1RTIGhhbmRzaGFrZQkqLworIFgxKCBDRkdfVFhfUkFURV9DTlRMMCwJCQlyYXRlX2NudGwgCQkJCQkgKQkvKltBUF0gUG9ydCAwIGRhdGEgcmF0ZSBjb250cm9sIGZvciB0cmFuc21pc3Npb24JKi8KKyBYMSggQ0ZHX1RYX1JBVEVfQ05UTDEsCQkJcmF0ZV9jbnRsCQkJCQkgKQkvKltBUF0gUG9ydCAxIGRhdGEgcmF0ZSBjb250cm9sIGZvciB0cmFuc21pc3Npb24JKi8KKyBYMSggQ0ZHX1RYX1JBVEVfQ05UTDIsCQkJcmF0ZV9jbnRsCQkJCQkgKQkvKltBUF0gUG9ydCAyIGRhdGEgcmF0ZSBjb250cm9sIGZvciB0cmFuc21pc3Npb24JKi8KKyBYMSggQ0ZHX1RYX1JBVEVfQ05UTDMsCQkJcmF0ZV9jbnRsCQkJCQkgKQkvKltBUF0gUG9ydCAzIGRhdGEgcmF0ZSBjb250cm9sIGZvciB0cmFuc21pc3Npb24JKi8KKyBYMSggQ0ZHX1RYX1JBVEVfQ05UTDQsCQkJcmF0ZV9jbnRsCQkJCQkgKQkvKltBUF0gUG9ydCA0IGRhdGEgcmF0ZSBjb250cm9sIGZvciB0cmFuc21pc3Npb24JKi8KKyBYMSggQ0ZHX1RYX1JBVEVfQ05UTDUsCQkJcmF0ZV9jbnRsCQkJCQkgKQkvKltBUF0gUG9ydCA1IGRhdGEgcmF0ZSBjb250cm9sIGZvciB0cmFuc21pc3Npb24JKi8KKyBYMSggQ0ZHX1RYX1JBVEVfQ05UTDYsCQkJcmF0ZV9jbnRsCQkJCQkgKQkvKltBUF0gUG9ydCA2IGRhdGEgcmF0ZSBjb250cm9sIGZvciB0cmFuc21pc3Npb24JKi8KK1hYMSggQ0ZHX0RFRkFVTFRfS0VZUywJCQlLRVlfU1RSQ1QsIGtleVs0XQkJCSApCS8qZGVmaW5lcyBzZXQgb2YgZW5jcnlwdGlvbiBrZXlzCQkJCQkqLworIFgxKCBDRkdfVFhfS0VZX0lELAkJCQl0eF9rZXlfaWQJCQkJCSApCS8qc2VsZWN0IGtleSBmb3IgZW5jcnlwdGlvbiBvZiBUeCBtZXNzYWdlcwkJCSovCisgWDEoIENGR19TQ0FOX1NTSUQsCQkJCXNzaWRbMTddCQkJCQkgKQkvKmlkZW50aWZpY2F0aW9uIGZvciBjb25uZWN0aW9uCQkJCQkJKi8KKyBYNSggQ0ZHX0FERF9US0lQX0RFRkFVTFRfS0VZLAkJCQkJCQkJIFwKKwkJIHRraXBfa2V5X2lkX2luZm8sIHRraXBfa2V5X2l2X2luZm9bNF0sIHRraXBfa2V5WzhdLCBcCisJCSB0eF9taWNfa2V5WzRdLCByeF9taWNfa2V5WzRdIAkJCQkJCSApCS8qCQkJCQkJCQkJCSAgICAgICAJCSovCisgWDYoIENGR19BRERfVEtJUF9NQVBQRURfS0VZLAlic3NpZFszXSwgdGtpcF9rZXlbOF0sIAkJIFwKKwkJIHRzY1s0XSwgcnNjWzRdLCB0eF9taWNfa2V5WzRdLCByeF9taWNfa2V5WzRdIAkJICkJLyoJCQkJCQkJCQkJICAgICAgIAkJKi8KKyBYMSggQ0ZHX1NFVF9TU05fQVVUSEVOVElDQVRJT05fU1VJVEUsIAkJCQkJCSBcCisJCSBzc25fYXV0aGVudGljYXRpb25fc3VpdGUJCQkJCQkJICkJLyoJCQkJCQkJCQkJCSAgIAkJKi8KKyBYMSggQ0ZHX1JFTU9WRV9US0lQX0RFRkFVTFRfS0VZLHRraXBfa2V5X2lkCQkJCSApCS8qCQkJCQkJCQkJCQkgICAJCSovCisgWDEoIENGR19USUNLX1RJTUUsCQkJCXRpY2tfdGltZQkJCQkJICkJLypBdXhpbGlhcnkgVGltZXIgdGljayBpbnRlcnZhbAkJCQkJCSovCisgWDEoIENGR19ERFNfVElDS19USU1FLAkJCXRpY2tfdGltZQkJCQkJICkJLypEaXNjb25uZWN0ZWQgRGVlcFNsZWVwIFRpbWVyIHRpY2sgaW50ZXJ2YWwJCSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEFkZGVkIGZvciBQYXR0ZXJuLW1hdGNoaW5nIFdha2VPbkxhbi4gKFNlZSBmaXJtd2FyZSBkZXNpZ24gbm90ZSBXTUROMjgxQykKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFdPTF9QQVRURVJOUwkJCQk1CQkvLyBtYXhpbXVtIG9mIDUgcGF0dGVybnMgaW4gZmlybXdhcmUKKyNkZWZpbmUgV09MX1BBVFRFUk5fTEVOCQkJCTEyNAkJLy8gbWF4aW11bSAxMjQgYnl0ZXMgcGF0dGVybiBsZW5ndGggcGVyIHBhdHRlcm4gaW4gZmlybXdhcmUKKyNkZWZpbmUgV09MX01BU0tfTEVOCQkJIAkzMAkJLy8gbWF4aW11bSAzMCBieXRlcyBtYXNrIGxlbmd0aCBwZXIgcGF0dGVybiBpbiBmaXJtd2FyZQorI2RlZmluZSBXT0xfQlVGX1NJWkUJKFdPTF9QQVRURVJOUyAqIChXT0xfUEFUVEVSTl9MRU4gKyBXT0xfTUFTS19MRU4gKyA2KSAvIDIpCitYMiggQ0ZHX1dPTF9QQVRURVJOUywgblBhdHRlcm5zLCBidWZmZXJbV09MX0JVRl9TSVpFXQkJICkgIC8qW1NUQV0gV2FrZU9uTGFuIHBhdHRlcm4gbWF0Y2gsIHJvb20gZm9yIDUgcGF0dGVybnMqLworCisgWDUoIENGR19TVVBfUkFOR0UsCQlyb2xlLCBpZCwgdmFyaWFudCwgYm90dG9tLCB0b3AJCQkJICAgKSAvKltQUkldIFByaW1hcnkgU3VwcGxpZXIgY29tcGF0aWJpbGl0eSByYW5nZQkJKi8KKy8qIE5JQyBJbmZvcm1hdGlvbiAqLworIFg0KCBDRkdfSURFTlRJVFksCQkJY29tcF9pZCwgdmFyaWFudCwgdmVyc2lvbl9tYWpvciwgdmVyc2lvbl9taW5vciApIC8qaWRlbnRpZmljYXRpb24gUHJvdG90eXBlCQkJCQkJCSovCisjZGVmaW5lIENGR19EUlZfSURFTlRJVFlfU1RSQ1QJQ0ZHX0lERU5USVRZX1NUUkNUCisjZGVmaW5lIENGR19QUklfSURFTlRJVFlfU1RSQ1QJQ0ZHX0lERU5USVRZX1NUUkNUCisjZGVmaW5lIENGR19OSUNfSURFTlRJVFlfU1RSQ1QJQ0ZHX0lERU5USVRZX1NUUkNUCisjZGVmaW5lIENGR19GV19JREVOVElUWV9TVFJDVAlDRkdfSURFTlRJVFlfU1RSQ1QKKyBYMSggQ0ZHX1JJRF9JTkZfTUlOLAkJeQkJCQkJCQkJCQkJICAgKSAvKmxvd2VzdCB2YWx1ZSByZXByZXNlbnRpbmcgYW4gSW5mb3JtYXRpb24gUklECQkqLworIFgxKCBDRkdfTUFYX0xPQURfVElNRSwJCW1heF9sb2FkX3RpbWUJCQkJCQkJCSAgICkgLypbUFJJXSBNYXggcmVzcG9uc2UgdGltZSBvZiB0aGUgRG93bmxvYWQgY29tbWFuZAkqLworIFgzKCBDRkdfRExfQlVGLAkJCWJ1Zl9wYWdlLCBidWZfb2Zmc2V0LCBidWZfbGVuCQkJCSAgICkgLypbUFJJXSBEb3dubG9hZCBidWZmZXIgbG9jYXRpb24gYW5kIHNpemUJCQkqLworLy8gWDUoIENGR19QUklfU1VQX1JBTkdFLAkJcm9sZSwgaWQsIHZhcmlhbnQsIGJvdHRvbSwgdG9wCQkJCSAgICkgLypbUFJJXSBQcmltYXJ5IFN1cHBsaWVyIGNvbXBhdGliaWxpdHkgcmFuZ2UJCSovCisgWDUoIENGR19DRklfQUNUX1JBTkdFU19QUkkscm9sZSwgaWQsIHZhcmlhbnQsIGJvdHRvbSwgdG9wCQkJCSAgICkgLypbUFJJXSBDb250cm9sbGVyIEFjdG9yIGNvbXBhdGliaWxpdHkgcmFuZ2VzCQkqLworLy8gWDUoIENGR19OSUNfSFNJX1NVUF9SQU5HRSwJcm9sZSwgaWQsIHZhcmlhbnQsIGJvdHRvbSwgdG9wCQkJCSAgICkgLypIL1cgLSBTL1cgSS9GIHN1cHBsaWVyIHJhbmdlCQkJCQkJKi8KKyBYMSggQ0ZHX05JQ19TRVJJQUxfTlVNQkVSLAlzZXJpYWxfbnVtYmVyWzE3XQkJCQkJCQkgICApIC8qW1BSSV0gTmV0d29yayBJL0YgQ2FyZCBzZXJpYWwgbnVtYmVyCQkJCSovCisgWDUoIENGR19OSUNfTUZJX1NVUF9SQU5HRSwJcm9sZSwgaWQsIHZhcmlhbnQsIGJvdHRvbSwgdG9wCQkJCSAgICkgLypbUFJJXSBNb2RlbSBJL0YgU3VwcGxpZXIgY29tcGF0aWJpbGl0eSByYW5nZQkJKi8KKyBYNSggQ0ZHX05JQ19DRklfU1VQX1JBTkdFLAlyb2xlLCBpZCwgdmFyaWFudCwgYm90dG9tLCB0b3AJCQkJICAgKSAvKltQUkldIENvbnRyb2xsZXIgSS9GIFN1cHBsaWVyIGNvbXBhdGliaWxpdHkgcmFuZ2UqLworLy9ILUkgWDEoIENGR19DSEFOTkVMX0xJU1QsCQljaGFubmVsX2xpc3QJCQkJCQkJCSAgICkgLypBbGxvd2VkIGNvbW11bmljYXRpb24gY2hhbm5lbHMJCQkJCSovCisvL0gtSSBYWDIoIENGR19SRUdfRE9NQUlOUywJCWhjZl8xNiwgbnVtX2RvbWFpbiwgaGNmXzgsIHJlZ19kb21haW5zWzEwXQkgICApIC8qTGlzdCBvZiBpbnRlbmRlZCByZWd1bGF0b3J5IGRvbWFpbnMJCQkJKi8KKyBYMSggQ0ZHX05JQ19URU1QX1RZUEUsCQl0ZW1wX3R5cGUJCQkJCQkJCQkgICApIC8qSGFyZHdhcmUgdGVtcGVyYXR1cmUgcmFuZ2UgY29kZQkJCQkJKi8KKy8vSC1JIFgxKCBDRkdfQ0lTLAkJCQljaXNbMjQwXQkJCQkJCQkJCSAgICkgLypQQyBDYXJkIFN0YW5kYXJkIENhcmQgSW5mb3JtYXRpb24gU3RydWN0dXJlCQkqLworIFg1KCBDRkdfTklDX1BST0ZJTEUsCQkJCQkJCQkJCQkJCSAgIFwKKwkJIHByb2ZpbGVfY29kZSwgY2FwYWJpbGl0eV9vcHRpb25zLCBhbGxvd2VkX2RhdGFfcmF0ZXMsIHZhbDQsIHZhbDUgICkgLypDYXJkIFByb2ZpbGUJCQkJCQkJCQkJKi8KKy8vIFg1KCBDRkdfRldfU1VQX1JBTkdFLAkJcm9sZSwgaWQsIHZhcmlhbnQsIGJvdHRvbSwgdG9wCQkJCSAgICkgLypbU1RBXSBTdGF0aW9uIEkvRiBTdXBwbGllciBjb21wYXRpYmlsaXR5IHJhbmdlCSovCisgWDUoIENGR19NRklfQUNUX1JBTkdFUywJcm9sZSwgaWQsIHZhcmlhbnQsIGJvdHRvbSwgdG9wCQkJCSAgICkgLypbU1RBXSBNb2RlbSBJL0YgQWN0b3IgY29tcGF0aWJpbGl0eSByYW5nZXMJCSovCisgWDUoIENGR19DRklfQUNUX1JBTkdFU19TVEEscm9sZSwgaWQsIHZhcmlhbnQsIGJvdHRvbSwgdG9wCQkJCSAgICkgLypbU1RBXSBDb250cm9sbGVyIEkvRiBBY3RvciBjb21wYXRpYmlsaXR5IHJhbmdlcwkqLworIFg1KCBDRkdfTUZJX0FDVF9SQU5HRVNfU1RBLHJvbGUsIGlkLCB2YXJpYW50LCBib3R0b20sIHRvcAkJCQkgICApIC8qW1NUQV0gQ29udHJvbGxlciBJL0YgQWN0b3IgY29tcGF0aWJpbGl0eSByYW5nZXMJKi8KKyBYMSggQ0ZHX05JQ19CVVNfVFlQRSwJCW5pY19idXNfdHlwZQkJCQkJCQkJICAgKSAvKk5JQyBidXN0eXBlIGRlcml2ZWQgZnJvbSBCVVNTRUwgaG9zdCBJL0Ygc2lnbmFscyAqLworCisvKglNQUMgSU5GT1JNQVRJT04JKi8KKyBYMSggQ0ZHX1BPUlRfU1RBVCwJCQkJcG9ydF9zdGF0CQkJCQkJCSApIC8qW1NUQV0gQWN0dWFsIE1BQyBQb3J0IGNvbm5lY3Rpb24gY29udHJvbCBzdGF0dXMJCSovCisgWDEoIENGR19DVVJfU1NJRCwJCQkJc3NpZFsxN10JCQkJCQkJICkgLypbU1RBXSBJZGVudGlmaWNhdGlvbiBvZiB0aGUgYWN0dWFsbHkgY29ubmVjdGVkIFNTCQkqLworIFgxKCBDRkdfQ1VSX0JTU0lELAkJCQltYWNfYWRkclszXQkJCQkJCQkgKSAvKltTVEFdIElkZW50aWZpY2F0aW9uIG9mIHRoZSBhY3R1YWxseSBjb25uZWN0ZWQgQlNTCQkqLworIFgzKCBDRkdfQ09NTVNfUVVBTElUWSwJCQljb21zX3F1YWwsIHNpZ25hbF9sdmwsIG5vaXNlX2x2bAkgKSAvKltTVEFdIFF1YWxpdHkgb2YgdGhlIEJhc2ljIFNlcnZpY2UgU2V0IGNvbm5lY3Rpb24JCSovCisgWDEoIENGR19DVVJfVFhfUkFURSwJCQlyYXRlCQkJCQkJCQkgKSAvKltTVEFdIEFjdHVhbCB0cmFuc21pdCBkYXRhIHJhdGUJCQkJCQkqLworIFgxKCBDRkdfQ1VSX0JFQUNPTl9JTlRFUlZBTCwJaW50ZXJ2YWwJCQkJCQkJICkgLypCZWFjb24gdHJhbnNtaXQgaW50ZXJ2YWwgdGltZSBmb3IgQlNTIGNyZWF0aW9uCQkJKi8KKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV0FSUAorIFgxMSggQ0ZHX0NVUl9TQ0FMRV9USFJILAkJCQkJCQkJCQkJIFwKKwkgY2Fycmllcl9kZXRlY3RfdGhyaF9jY2ssIGNhcnJpZXJfZGV0ZWN0X3Rocmhfb2ZkbSwgZGVmZXJfdGhyaCwJIFwKKwkgZW5lcmd5X2RldGVjdF90aHJoLCByc3NpX29uX3RocmhfZGV2aWF0aW9uLCAJCQkJCSBcCisJIHJzc2lfb2ZmX3RocmhfZGV2aWF0aW9uLCBjY2tfZHJvcF90aHJoLCBvZmRtX2Ryb3BfdGhyaCwgCQkgXAorCSBjZWxsX3NlYXJjaF90aHJoLCBvdXRfb2ZfcmFuZ2VfdGhyaCwgZGVsdGFfc25yCQkJCSApCisjZWxzZQorIFg2KCBDRkdfQ1VSX1NDQUxFX1RIUkgsCQkJCQkJCQkJCQkgXAorCSBlbmVyZ3lfZGV0ZWN0X3RocmgsIGNhcnJpZXJfZGV0ZWN0X3RocmgsIGRlZmVyX3RocmgsIAkJCSBcCisJIGNlbGxfc2VhcmNoX3RocmgsIG91dF9vZl9yYW5nZV90aHJoLCBkZWx0YV9zbnIJCQkJCSApIC8qQWN0dWFsIFN5c3RlbSBTY2FsZSB0aHJlc2hvbGRzIHNldHRpbmdzCQkJCSovCisjZW5kaWYgLy8gSENGX1RZUEVfV0FSUAorIFgxKCBDRkdfUFJPVE9DT0xfUlNQX1RJTUUsCQl0aW1lCQkJCQkJCQkgKSAvKk1heCB0aW1lIHRvIGF3YWl0IGEgcmVzcG9uc2UgdG8gYSByZXF1ZXN0IG1lc3NhZ2UJCSovCisgWDEoIENGR19DVVJfU0hPUlRfUkVUUllfTElNSVQsCWxpbWl0CQkJCQkJCQkgKSAvKk1heCBudW1iZXIgb2YgdHJhbnNtaXQgYXR0ZW1wdHMgZm9yIHNob3J0IGZyYW1lcwkJKi8KKyBYMSggQ0ZHX0NVUl9MT05HX1JFVFJZX0xJTUlULAlsaW1pdAkJCQkJCQkJICkgLypNYXggbnVtYmVyIG9mIHRyYW5zbWl0IGF0dGVtcHRzIGZvciBsb25nIGZyYW1lcwkJKi8KKyBYMSggQ0ZHX01BWF9UWF9MSUZFVElNRSwJCXRpbWUJCQkJCQkJCSApIC8qTWF4IHRyYW5zbWl0IGZyYW1lIGhhbmRsaW5nIGR1cmF0aW9uCQkJCQkqLworIFgxKCBDRkdfTUFYX1JYX0xJRkVUSU1FLAkJdGltZQkJCQkJCQkJICkgLypNYXggcmVjZWl2ZWQgZnJhbWUgaGFuZGxpbmcgZHVyYXRpb24JCQkJCSovCisgWDEoIENGR19DRl9QT0xMQUJMRSwJCQljZl9wb2xsYWJsZQkJCQkJCQkgKSAvKltTVEFdIENvbnRlbnRpb24gRnJlZSBwb2xsYWJsZSBjYXBhYmlsaXR5IGluZGljYXRpb24JKi8KKyBYMiggQ0ZHX0FVVEhFTlRJQ0FUSU9OX0FMR09SSVRITVMsYXV0aGVudGljYXRpb25fdHlwZSwgdHlwZV9lbmFibGVkICkgLypBdXRoZW50aWNhdGlvbiBBbGdvcml0aG0JCQkJCQkJCSovCisgWDEoIENGR19QUklWQUNZX09QVF9JTVBMRU1FTlRFRCxwcml2YWN5X29wdF9pbXBsZW1lbnRlZAkJCSApIC8qV0VQIE9wdGlvbiBhdmFpbGFiaWxpdHkgaW5kaWNhdGlvbgkJCQkJCSovCisgWDEoIENGR19DVVJfUkVNT1RFX1JBVEVTLAkJcmF0ZXMJCQkJCQkJCSApIC8qQ3VycmVudFJlbW90ZVJhdGVzCQkJCQkJCQkJCSovCisgWDEoIENGR19DVVJfVVNFRF9SQVRFUywJCXJhdGVzCQkJCQkJCQkgKSAvKkN1cnJlbnRVc2VkUmF0ZXMJCQkJCQkJCQkJKi8KKyBYMSggQ0ZHX0NVUl9TWVNURU1fU0NBTEUsCQljdXJyZW50X3N5c3RlbV9zY2FsZQkJCQkgKSAvKkN1cnJlbnRVc2VkUmF0ZXMJCQkJCQkJCQkJKi8KKyBYMSggQ0ZHX0NVUl9UWF9SQVRFMSwJCQlyYXRlIAkJCQkJCQkJICkgLypbQVBdIEFjdHVhbCBQb3J0IDEgdHJhbnNtaXQgZGF0YSByYXRlCQkJCQkqLworIFgxKCBDRkdfQ1VSX1RYX1JBVEUyLAkJCXJhdGUJCQkJCQkJCSApIC8qW0FQXSBBY3R1YWwgUG9ydCAyIHRyYW5zbWl0IGRhdGEgcmF0ZQkJCQkJKi8KKyBYMSggQ0ZHX0NVUl9UWF9SQVRFMywJCQlyYXRlCQkJCQkJCQkgKSAvKltBUF0gQWN0dWFsIFBvcnQgMyB0cmFuc21pdCBkYXRhIHJhdGUJCQkJCSovCisgWDEoIENGR19DVVJfVFhfUkFURTQsCQkJcmF0ZQkJCQkJCQkJICkgLypbQVBdIEFjdHVhbCBQb3J0IDQgdHJhbnNtaXQgZGF0YSByYXRlCQkJCQkqLworIFgxKCBDRkdfQ1VSX1RYX1JBVEU1LAkJCXJhdGUJCQkJCQkJCSApIC8qW0FQXSBBY3R1YWwgUG9ydCA1IHRyYW5zbWl0IGRhdGEgcmF0ZQkJCQkJKi8KKyBYMSggQ0ZHX0NVUl9UWF9SQVRFNiwJCQlyYXRlCQkJCQkJCQkgKSAvKltBUF0gQWN0dWFsIFBvcnQgNiB0cmFuc21pdCBkYXRhIHJhdGUJCQkJCSovCisgWDEoIENGR19PV05fTUFDX0FERFIsCQkJbWFjX2FkZHJbM10JCQkJCQkJICkgLypbQVBdIFVuaXF1ZSBsb2NhbCBub2RlIE1BQyBBZGRyZXNzCQkJCQkJKi8KKyBYMyggQ0ZHX1BDRl9JTkZPLAkJCQltZWRpdW1fb2NjdXBhbmN5X2xpbWl0LCAJCQkgXAorCQkgCQkJCQkJY2ZwX3BlcmlvZCwgY2ZwX21heF9kdXJhdGlvbiAJCSApIC8qW0FQXSBQb2ludCBDb29yZGluYXRpb24gRnVuY3Rpb24gY2FwYWJpbGl0eSBpbmZvCQkqLworIFgxKCBDRkdfQ1VSX1NTTl9JTkZPX0VMRU1FTlQsIHNzbl9pbmZvX2VsZW1lbnRbMV0JCQkJIAkgKSAvKiAgICAJCQkJCQkJCQkJCQkJKi8KKyBYNCggQ0ZHX0NVUl9US0lQX0lWX0lORk8sIAkJCQkJCQkJCQkJIFwKKwkJIHRraXBfc2VxX2NudDBbNF0sIHRraXBfc2VxX2NudDFbNF0sIAkJCQkJCSBcCisJCSB0a2lwX3NlcV9jbnQyWzRdLCB0a2lwX3NlcV9jbnQzWzRdICAJCQkJCQkgKSAvKiAgICAJCQkJCQkJCQkJCQkJKi8KKyBYMiggQ0ZHX0NVUl9BU1NPQ19SRVFfSU5GTywJZnJhbWVfdHlwZSwgZnJhbWVfYm9keVsxXQkJCSApIC8qCTB4RkQ4QwkJCQkJCQkJCQkJCSovCisgWDIoIENGR19DVVJfQVNTT0NfUkVTUF9JTkZPLAlmcmFtZV90eXBlLCBmcmFtZV9ib2R5WzFdCQkJICkgLyoJMHhGRDhECQkJCQkJCQkJCQkJKi8KKworCisvKglNb2RlbSBJTkZPUk1BVElPTiAqLworIFgxKCBDRkdfUEhZX1RZUEUsCQkJCXBoeV90eXBlIAkJCQkJCQkgKSAvKlBoeXNpY2FsIGxheWVyIHR5cGUgaW5kaWNhdGlvbgkJCQkJCQkqLworIFgxKCBDRkdfQ1VSX0NIQU5ORUwsCQkJY3VycmVudF9jaGFubmVsCQkJCQkJICkgLypBY3R1YWwgZnJlcXVlbmN5IGNoYW5uZWwgdXNlZCBmb3IgdHJhbnNtaXNzaW9uCQkJKi8KKyBYMSggQ0ZHX0NVUl9QT1dFUl9TVEFURSwJCWN1cnJlbnRfcG93ZXJfc3RhdGUJCQkJCSApIC8qQWN0dWFsIHBvd2VyIGNvbnN1bXB0aW9uIHN0YXR1cwkJCQkJCSovCisgWDEoIENGR19DQ0FNT0RFLAkJCQljY2FfbW9kZQkJCQkJCQkgKSAvKkNsZWFyIGNoYW5uZWwgYXNzZXNzbWVudCBtb2RlIGluZGljYXRpb24JCQkJKi8KKyBYMSggQ0ZHX1NVUFBPUlRFRF9EQVRBX1JBVEVTLAlyYXRlc1s1XQkJCQkJCQkgKSAvKkRhdGEgcmF0ZXMgY2FwYWJpbGl0eSBpbmZvcm1hdGlvbgkJCQkJCSovCisKKworLyogRlJBTUVTICovCitYWDEoIENGR19TQ0FOLAkJCQkJU0NBTl9SU19TVFJDVCwgc2Nhbl9yZXN1bHRbMzJdCQkgKSAvKlNjYW4gcmVzdWx0cwkJCQkJCQkJCQkJKi8KKworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFVJTCBtYW5hZ2VtZW50IGZ1bmN0aW9uIHRvIGJlIHBhc3NlZCB0byBXYXZlTEFOL0lFRUUgRHJpdmVycyBpbiBEVUlfU1RSQ1QgZmllbGQgZnVuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEhDRiBhbmQgVUlMIENvbW1vbgorI2RlZmluZSBNRERfQUNUX1NDQU4JCQkweDA2CQkJCQkvLyBIZXJtZXMgSW5xdWlyZSBTY2FuIChGMTAxKSBjb21tYW5kCisjZGVmaW5lIE1ERF9BQ1RfUFJTX1NDQU4gCQkweDA3CQkJCQkvLyBIZXJtZXMgUHJvYmUgUmVzcG9uc2UgU2NhbiAoRjEwMikgY29tbWFuZAorCisvLyBVSUwgU3BlY2lmaWMKKyNkZWZpbmUgVUlMX0ZVTl9DT05ORUNUCQkJMHgwMAkJCQkJLy8gUGVyZm9ybSBjb25uZWN0IGNvbW1hbmQKKyNkZWZpbmUgVUlMX0ZVTl9ESVNDT05ORUNUCQkweDAxCQkJCQkvLyBQZXJmb3JtIGRpc2Nvbm5lY3QgY29tbWFuZAorI2RlZmluZSBVSUxfRlVOX0FDVElPTgkJCTB4MDIJCQkJCS8vIFBlcmZvcm0gVUlMIEFjdGlvbiBjb21tYW5kLgorI2RlZmluZSBVSUxfRlVOX1NFTkRfRElBR19NU0cJMHgwMwkJCQkJLy8gU2VuZCBhIGRpYWdub3N0aWMgbWVzc2FnZS4KKyNkZWZpbmUgVUlMX0ZVTl9HRVRfSU5GTwkJMHgwNAkJCQkJLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSBOSUMuCisjZGVmaW5lIFVJTF9GVU5fUFVUX0lORk8JCTB4MDUJCQkJCS8vIFB1dCBpbmZvcm1hdGlvbiBvbiBOSUMuCisKKy8qCVVJTF9BQ1RfVEFMTElFUwkJCQkweDA1CQkgCQkJKiB0aGlzIHNob3VsZCBub3QgYmUgZXhwb3J0ZWQgdG8gdGhlIFVTRgorCQkJCQkJCQkJCQkgCQkJKiBpdCBpcyBzb2xlbHkgaW50ZW5kZWQgYXMgYSBzdHJhdGVnaWMgY2hvaWNlIGZvciB0aGUgTVNGIHRvIGVpdGhlcgorCQkJCQkJCQkJCQkgCQkJKiAtIHVzZSBIQ0ZfQUNUX1RBTExJRVMgYW5kIGRpcmVjdCBJRkIgYWNjZXNzCisJCQkJCQkJCQkJCQkJCSogLSB1c2UgQ0ZHX1RBTExJRVMKKwkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVUlMX0FDVF9TQ0FOCQkJTUREX0FDVF9TQ0FOCisjZGVmaW5lIFVJTF9BQ1RfUFJTX1NDQU4gCQlNRERfQUNUX1BSU19TQ0FOCisjZGVmaW5lIFVJTF9BQ1RfQkxPQ0sJIAkJMHgwQgorI2RlZmluZSBVSUxfQUNUX1VOQkxPQ0sJIAkJMHgwQworI2RlZmluZSBVSUxfQUNUX1JFU0VUCSAJCTB4ODAKKyNkZWZpbmUgVUlMX0FDVF9SRUJJTkQJIAkJMHg4MQorI2RlZmluZSBVSUxfQUNUX0FQUExZCSAJCTB4ODIKKyNkZWZpbmUgVUlMX0FDVF9ESVNDT05ORUNUCQkweDgzCS8vOz8wNDAxMDggcG9zc2libHkgb2Jzb2xldGUJLy9TcGVjaWFsIGZvciBXSU5DRQorCisvLyBIQ0YgU3BlY2lmaWMKKy8qIE5vdGUgdGhhdCBVSUxfQUNULWNvZGVzIG11c3QgbWF0Y2ggSENGX0FDVC1jb2RlcyBhY3Jvc3MgYSBydW4tdGltZSBib3VuZCBJL0YKKyAqIFRoZSBpbml0aWFsIG1hdGNoaW5nIGlzIGFjaGlldmVkIGJ5ICIjZGVmaW5lIEhDRl9BQ1RfeHh4IEhDRl9VSUxfQUNUX3h4eCIgd2hlcmUgYXBwcm9wcmlhdGUKKyAqIEluIG90aGVyIHdvcmRzLCB0aGVzZSBjb2RlcyBzaG91bGQgbmV2ZXIsIGV2ZXIgY2hhbmdlIHRvIG1pbmltaXplIG1pZ3JhdGlvbiBwcm9ibGVtcyBiZXR3ZWVuCisgKiBjb21iaW5hdGlvbnMgb2Ygb2xkIGRyaXZlcnMgYW5kIG5ldyB1dGlsaXRpZXMgYW5kIHZpY2UgdmVyc2EKKyAqLworI2RlZmluZSBIQ0ZfRElTQ09OTkVDVAkJCTB4MDEJCQkJCS8vZGlzY29ubmVjdCByZXF1ZXN0IGZvciBoY2ZfY29ubmVjdCAoaW52YWxpZCBhcyBJTyBBZGRyZXNzKQorI2RlZmluZSBIQ0ZfQUNUX1RBTExJRVMgCQkweDA1CQkJCQkvLyAhIFVJTF9BQ1RfVEFMTElFUyBkb2VzIG5vdCBleGlzdCAhIEhlcm1lcyBJbnF1aXJlIFRhbGxpZXMgKEYxMDApIGNtZAorI2lmICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dBUlAgKSA9PSAwCisjZGVmaW5lIEhDRl9BQ1RfU0NBTgkJCU1ERF9BQ1RfU0NBTgorI2VuZGlmIC8vIEhDRl9UWVBFX1dBUlAKKyNkZWZpbmUgSENGX0FDVF9QUlNfU0NBTgkJTUREX0FDVF9QUlNfU0NBTgorI2lmIEhDRl9JTlRfT04KKyNkZWZpbmUgSENGX0FDVF9JTlRfT0ZGIAkJMHgwRAkJCQkJLy8gRGlzYWJsZSBJbnRlcnJ1cHQgZ2VuZXJhdGlvbgorI2RlZmluZSBIQ0ZfQUNUX0lOVF9PTgkJCTB4MEUJCQkJCS8vIEVuYWJsZSBJbnRlcnJ1cHQgZ2VuZXJhdGlvbgorI2RlZmluZSBIQ0ZfQUNUX0lOVF9GT1JDRV9PTgkweDBGCQkJCQkvLyBFbmZvcmNlIEVuYWJsZSBJbnRlcnJ1cHQgZ2VuZXJhdGlvbgorI2VuZGlmIC8vIEhDRl9JTlRfT04KKyNkZWZpbmUgSENGX0FDVF9SWF9BQ0sJCQkweDE1CQkJCQkvLyBSZWNlaWV2ZXIgQUNLIChvcHRpbWl6YXRpb24pCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0NDWAorI2RlZmluZSBIQ0ZfQUNUX0NDWF9PTgkJCTB4MUEJCQkJCS8vIGVuYWJsZSBDS0lQCisjZGVmaW5lIEhDRl9BQ1RfQ0NYX09GRgkJCTB4MUIJCQkJCS8vIGRpc2FibGUgQ0tJUAorI2VuZGlmIC8vIEhDRl9UWVBFX0NDWAorI2lmIChIQ0ZfU0xFRVApICYgSENGX0REUworI2RlZmluZSBIQ0ZfQUNUX1NMRUVQCQkJMHgxQwkJCQkJLy8gRERTIFNsZWVwIHJlcXVlc3QKKy8vI2RlZmluZSBIQ0ZfQUNUX1dBS0VVUAkJMHgxRAkJCQkJLy8gRERTIFdha2V1cCByZXF1ZXN0CisjZW5kaWYgLy8gSENGX0REUworCisvKglIQ0ZfQUNUX01BWAkJCQkJCQkvLyB4eHh4OiBzdGFydCB2YWx1ZSBmb3IgVUlMLXJhbmdlLCBOT1QgdG8gYmUgcGFzc2VkIHRvIEhDRgorICoJCQkJCQkJCQkJVG9vIGJhZCwgdGhlcmUgd2FzIG9yaWdpbmFsbHkgbm8gc3BhcmUgcm9vbSBjcmVhdGVkIHRvIHVzZQorICoJCQkJCQkJCQkJSENGX0FDVF9NQVggYXMgYW4gZXF1aXZhbGVudCBvZiBIQ0ZfRVJSX01BWC4gU2luY2UgY3JlYXRpbmcKKyAqCQkJCQkJCQkJCXRoaXMgcm9vbSBpbiByZXRyb3NwZWN0IHdvdWxkIGNyZWF0ZSBhIGJhY2t3YXJkIGluY29tcGF0aWJpbGl0eQorICoJCQkJCQkJCQkJd2Ugd2lsbCBqdXN0IGhhdmUgdG8gbGl2ZSB3aXRoIHRoZSBoYXBoYXphcmQgc2VxdWVuY2Ugb2YKKyAqCQkJCQkJCQkJCVVJTC0gYW5kIEhDRiBzcGVjaWZpYyBjb2Rlcy4gVGhlb3JldGljYWxseSB0aGlzIGNvdWxkIGJlCisgKgkJCQkJCQkJCQljb3JyZWN0ZWQgd2hlbiBhbmQgaWYgdGhlcmUgd2lsbCBldmVyIGJlIGFuIG92ZXJhbGwKKyAqCQkJCQkJCQkJCWluY29tcGF0aWJpbGl0eSBpbnRyb2R1Y2VkIGZvciBhbm90aGVyIHJlYXNvbgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBIRVJNRVMgUkVDT1JEUwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgQ0ZHX1JJRF9GV19NSU4JCQkJCQkJMHhGQTAwCS8vbG93ZXN0IHZhbHVlIHJlcHJlc2VudGluZyBhIEhlcm1lcy1JSSBiYXNlZCBSSUQKKy8vICNkZWZpbmUgQ0ZHX1BEQV9CRUdJTgkJCQkJCTB4RkEJLy8KKy8vICNkZWZpbmUgQ0ZHX1BEQV9FTkQJCQkJCQkJMHhGQQkvLworLy8gI2RlZmluZSBDRkdfUERBX05JQ19UT1BfTFZMX0FTU0VNQkxZX05VTUJFUgkweEZBCS8vCisvLyAjZGVmaW5lIENGR19QREFfUENCX1RSQUNFUl9OVU1CRVIJCQkweEZBCS8vCisvLyAjZGVmaW5lIENGR19QREFfUk1NX1RSQUNFUl9OVU1CRVIJCQkweEZBCS8vCisvLyAjZGVmaW5lIENGR19QREFfUk1NX0NPTVBfSUQJCQkJCTB4RkEJLy8KKy8vICNkZWZpbmUgQ0ZHX1BEQV8JCQkJCQkJCTB4RkEJLy8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENPTkZJR1VSQVRJT04gUkVDT1JEUwk9PT09PT09PT09PT09PT09PT09PT0qLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IG1hc2sgMHhGQ3h4CQkJCT09PT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIENGR19SSURfQ0ZHX01JTgkJCQkJMHhGQzAwCQkvL2xvd2VzdCB2YWx1ZSByZXByZXNlbnRpbmcgYSBIZXJtZXMgY29uZmlndXJhdGlvbiAgUklECisKKy8vCU5FVFdPUksgUEFSQU1FVEVSUywgU1RBVElDIENPTkZJR1VSQVRJT04gRU5USVRJRVMKKy8vRkMwNSwgRkMwQiwgRkMwQywgRkMwRDogU0VFIFcyRE4xNDkKKworI2RlZmluZSBDRkdfQ05GX1BPUlRfVFlQRQkJCQkweEZDMDAJCS8vW1NUQV0gQ29ubmVjdGlvbiBjb250cm9sIGNoYXJhY3RlcmlzdGljcworI2RlZmluZSBDRkdfQ05GX09XTl9NQUNfQUREUgkJCTB4RkMwMQkJLy9bU1RBXSBNQUMgQWRkcmVzcyBvZiB0aGlzIG5vZGUKKy8vCQkJCQkJCQkJCTB4RkMwMgkJc2VlIERZTkFNSUMgQ09ORklHVVJBVElPTiBFTlRJVElFUworI2RlZmluZSBDRkdfQ05GX09XTl9DSEFOTkVMCQkJCTB4RkMwMwkJLy9Db21tdW5pY2F0aW9uIGNoYW5uZWwgZm9yIEJTUyBjcmVhdGlvbgorI2RlZmluZSBDRkdfQ05GX09XTl9TU0lECQkJCTB4RkMwNAkJLy9JQlNTIGNyZWF0aW9uIChTVEEpIG9yIEVTUyAoQVApIFNlcnZpY2UgU2V0IElkZW50CisjZGVmaW5lIENGR19DTkZfT1dOX0FUSU1fV0lORE9XCQkJMHhGQzA1CQkvL1tTVEFdIEFUSU0gV2luZG93IHRpbWUgZm9yIElCU1MgY3JlYXRpb24KKyNkZWZpbmUgQ0ZHX0NORl9TWVNURU1fU0NBTEUJCQkweEZDMDYJCS8vU3lzdGVtIFNjYWxlIHRoYXQgc3BlY2lmaWVzIHRoZSBBUCBkZW5zaXR5CisjZGVmaW5lIENGR19DTkZfTUFYX0RBVEFfTEVOCQkJMHhGQzA3CQkvL01heGltdW0gbGVuZ3RoIG9mIE1BQyBGcmFtZSBCb2R5IGRhdGEKKyNkZWZpbmUgQ0ZHX0NORl9QTV9FTkFCTEVECQkJCTB4RkMwOQkJLy9bU1RBXSBTd2l0Y2ggZm9yIEVTUyBQb3dlciBNYW5hZ2VtZW50IChQTSkKKyNkZWZpbmUgQ0ZHX0NORl9NQ0FTVF9SWAkJCQkweEZDMEIJCS8vW1NUQV0gU3dpdGNoIGZvciBFU1MgUE0gTXVsdGljYXN0IHJlY2VwdGlvbiBPbi9PZmYKKyNkZWZpbmUgQ0ZHX0NORl9NQVhfU0xFRVBfRFVSQVRJT04JCTB4RkMwQwkJLy9bU1RBXSBNYXhpbXVtIHNsZWVwIHRpbWUgZm9yIEVTUyBQTQorI2RlZmluZSBDRkdfQ05GX0hPTERPVkVSX0RVUkFUSU9OCQkweEZDMEQJCS8vW1NUQV0gSG9sZG92ZXIgdGltZSBmb3IgRVNTIFBNCisjZGVmaW5lIENGR19DTkZfT1dOX05BTUUJCQkJMHhGQzBFCQkvL0lkZW50aWZpY2F0aW9uIHRleHQgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMKKworI2RlZmluZSBDRkdfQ05GX09XTl9EVElNX1BFUklPRAkJCTB4RkMxMAkJLy9bQVBdIEJlYWNvbiBpbnRlcnZhbHMgYmV0d2VlbiBzdWNjZXNzaXZlIERUSU1zCisjZGVmaW5lIENGR19DTkZfV0RTX0FERFIxCQkJCTB4RkMxMQkJLy9bQVBdIFBvcnQgMSBNQUMgQWRycyBvZiBjb3JyZXNwb25kaW5nIFdEUyBMaW5rIG5vZGUKKyNkZWZpbmUgQ0ZHX0NORl9XRFNfQUREUjIJCQkJMHhGQzEyCQkvL1tBUF0gUG9ydCAyIE1BQyBBZHJzIG9mIGNvcnJlc3BvbmRpbmcgV0RTIExpbmsgbm9kZQorI2RlZmluZSBDRkdfQ05GX1dEU19BRERSMwkJCQkweEZDMTMJCS8vW0FQXSBQb3J0IDMgTUFDIEFkcnMgb2YgY29ycmVzcG9uZGluZyBXRFMgTGluayBub2RlCisjZGVmaW5lIENGR19DTkZfV0RTX0FERFI0CQkJCTB4RkMxNAkJLy9bQVBdIFBvcnQgNCBNQUMgQWRycyBvZiBjb3JyZXNwb25kaW5nIFdEUyBMaW5rIG5vZGUKKyNkZWZpbmUgQ0ZHX0NORl9XRFNfQUREUjUJCQkJMHhGQzE1CQkvL1tBUF0gUG9ydCA1IE1BQyBBZHJzIG9mIGNvcnJlc3BvbmRpbmcgV0RTIExpbmsgbm9kZQorI2RlZmluZSBDRkdfQ05GX1dEU19BRERSNgkJCQkweEZDMTYJCS8vW0FQXSBQb3J0IDYgTUFDIEFkcnMgb2YgY29ycmVzcG9uZGluZyBXRFMgTGluayBub2RlCisjZGVmaW5lIENGR19DTkZfUE1fTUNBU1RfQlVGCQkJMHhGQzE3CQkvL1tBUF0gU3dpdGNoIGZvciBQTSBidWZmZXJlaW5nIG9mIE11bHRpY2FzdCBNZXNzYWdlcworI2RlZmluZSBDRkdfQ05GX01DQVNUX1BNX0JVRgkJCUNGR19DTkZfUE1fTUNBU1RfQlVGCS8vbmFtZSBkb2VzIG5vdCBtYXRjaCBILUlJIHNwZWMKKyNkZWZpbmUgQ0ZHX0NORl9SRUpFQ1RfQU5ZCQkJCTB4RkMxOAkJLy9bQVBdIFN3aXRjaCBmb3IgUE0gYnVmZmVyZWluZyBvZiBNdWx0aWNhc3QgTWVzc2FnZXMKKworI2RlZmluZSBDRkdfQ05GX0VOQ1JZUFRJT04JCQkJMHhGQzIwCQkvL3NlbGVjdCBlbi9kZS1jcnlwdGlvbiBvZiBUeC9SeCBtZXNzYWdlcworI2RlZmluZSBDRkdfQ05GX0FVVEhFTlRJQ0FUSU9OCQkJMHhGQzIxCQkvL1tTVEFdIHNlbGVjdHMgQXV0aGVudGljYXRpb24gYWxnb3JpdGhtCisjZGVmaW5lIENGR19DTkZfRVhDTF9VTkVOQ1JZUFRFRAkJMHhGQzIyCQkvL1tBUF0gU3dpdGNoIGZvciAnY2xlYXItdGV4dCcgcnggbWVzc2FnZSBhY2NlcHRhbmNlCisjZGVmaW5lIENGR19DTkZfTUNBU1RfUkFURQkJCQkweEZDMjMJCS8vVHJhbnNtaXQgRGF0YSByYXRlIGZvciBNdWx0aWNhc3QgZnJhbWVzCisjZGVmaW5lIENGR19DTkZfSU5UUkFfQlNTX1JFTEFZCQkJMHhGQzI0CQkvL1tBUF0gU3dpdGNoIGZvciBJbnRyYUJCUyByZWxheQorI2RlZmluZSBDRkdfQ05GX01JQ1JPX1dBVkUJCQkJMHhGQzI1CQkvL01pY3JvV2F2ZSAoUm9idXN0bmVzcykKKyNkZWZpbmUgQ0ZHX0NORl9MT0FEX0JBTEFOQ0lORwkJIAkweEZDMjYJCS8vTG9hZCBCYWxhbmNpbmcJCSAoQm9vbGVhbiwgMD1PRkYsIDE9T04sIGRlZmF1bHQ9MSkKKyNkZWZpbmUgQ0ZHX0NORl9NRURJVU1fRElTVFJJQlVUSU9OCSAJMHhGQzI3CQkvL01lZGl1bSBEaXN0cmlidXRpb24JIChCb29sZWFuLCAwPU9GRiwgMT1PTiwgZGVmYXVsdD0xKQorI2RlZmluZSBDRkdfQ05GX1JYX0FMTF9HUk9VUF9BRERSCQkweEZDMjgJCS8vW1NUQV0gR3JvdXAgQWRkcmVzcyBGaWx0ZXIKKyNkZWZpbmUgQ0ZHX0NORl9DT1VOVFJZX0lORk8JCQkweEZDMjkJCS8vQ291bnRyeSBJbmZvCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dBUlAKKyNkZWZpbmUgQ0ZHX0NORl9UWF9QT1dfTFZMCQkJCTB4RkMyQQkJLy9UeFBvd2VyIExldmVsCisjZGVmaW5lIENGR19DTkZfQ09OTkVDVElPTl9DTlRMCQkJMHhGQzMwCQkvL1tTVEFdIENvbm5lY3Rpb24gQ29udHJvbAorI2RlZmluZSBDRkdfQ05GX09XTl9CRUFDT05fSU5URVJWQUwJCTB4RkMzMQkJLy9bQVBdCisjZGVmaW5lIENGR19DTkZfU0hPUlRfUkVUUllfTElNSVQJCTB4RkMzMgkJLy8KKyNkZWZpbmUgQ0ZHX0NORl9MT05HX1JFVFJZX0xJTUlUCQkweEZDMzMJCS8vCisjZGVmaW5lIENGR19DTkZfVFhfRVZFTlRfTU9ERQkJCTB4RkMzNAkJLy8KKyNkZWZpbmUgQ0ZHX0NORl9XSUZJX0NPTVBBVElCTEUJCQkweEZDMzUJCS8vW1NUQV0gV2lmaSBjb21wYXRpYmxlCisjZW5kaWYgLy8gSENGX1RZUEVfV0FSUAorI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9CRUFHTEVfSElJNQorI2RlZmluZSBDRkdfVk9JQ0VfUkVUUllfTElNSVQJCQkweEZDMzYJCS8qIFZvaWNlIGZyYW1lIHJldHJ5IGxpbWl0LiBSYW5nZTogMS0xNSwgZGVmYXVsdDogNCAqLworI2RlZmluZSBDRkdfVk9JQ0VfQ09OVEVOVElPTl9XSU5ET1cJCTB4RkMzNwkJLyogQ29udGVudGlvbiB3aW5kb3cgZm9yIHZvaWNlIGZyYW1lcy4gKi8KKyNlbmRpZgkvLyBCRUFHTEVfSElJNQorCisvLwlORVRXT1JLIFBBUkFNRVRFUlMsIERZTkFNSUMgQ09ORklHVVJBVElPTiBFTlRJVElFUworI2RlZmluZSBDRkdfREVTSVJFRF9TU0lECQkJCTB4RkMwMgkJLy9bU1RBXSBTZXJ2aWNlIFNldCBpZGVudGlmaWNhdGlvbiBmb3IgY29ubmVjdGlvbiBhbmQgc2NhbgorCisjZGVmaW5lIENGR19HUk9VUF9BRERSCQkJCQkweEZDODAJCS8vW1NUQV0gTXVsdGljYXN0IE1BQyBBZGRyZXNzZXMgZm9yIFJ4LW1lc3NhZ2UKKyNkZWZpbmUgQ0ZHX0NSRUFURV9JQlNTCQkJCQkweEZDODEJCS8vW1NUQV0gU3dpdGNoIGZvciBJQlNTIGNyZWF0aW9uIE9uL09mZgorI2RlZmluZSBDRkdfUlRTX1RIUkgJCQkJCTB4RkM4MwkJLy9GcmFtZSBsZW5ndGggdXNlZCBmb3IgUlRTL0NUUyBoYW5kc2hha2UKKyNkZWZpbmUgQ0ZHX1RYX1JBVEVfQ05UTAkJCQkweEZDODQJCS8vW1NUQV0gRGF0YSByYXRlIGNvbnRyb2wgZm9yIG1lc3NhZ2UgdHJhbnNtaXNzaW9uCisjZGVmaW5lIENGR19QUk9NSVNDVU9VU19NT0RFCQkJMHhGQzg1CQkvL1tTVEFdIFN3aXRjaCBmb3IgUHJvbWlzY3VvdXMgbW9kZSByZWNlcHRpb24gT24vT2ZmCisjZGVmaW5lIENGR19XT0wJCQkJCQkJMHhGQzg2CQkvL1tTVEFdIFN3aXRjaCBmb3IgV2FrZS1Pbi1MQU4gbW9kZQorI2RlZmluZSBDRkdfV09MX1BBVFRFUk5TCQkJCTB4RkM4NwkJLy9bU1RBXSBQYXR0ZXJucyBmb3IgV2FrZS1Pbi1MQU4KKyNkZWZpbmUgQ0ZHX1NVUFBPUlRFRF9SQVRFX1NFVF9DTlRMCQkweEZDODgJCS8vCisjZGVmaW5lIENGR19CQVNJQ19SQVRFX1NFVF9DTlRMCQkJMHhGQzg5CQkvLworCisjZGVmaW5lIENGR19TT0ZUV0FSRV9BQ0tfTU9ERQkJCTB4RkM5MAkJLy8KKyNkZWZpbmUgQ0ZHX1JUU19USFJIMAkJCQkJMHhGQzk3CQkvL1tBUF0gUG9ydCAwIGZyYW1lIGxlbmd0aCBmb3IgUlRTL0NUUyBoYW5kc2hha2UKKyNkZWZpbmUgQ0ZHX1JUU19USFJIMQkJCQkJMHhGQzk4CQkvL1tBUF0gUG9ydCAxIGZyYW1lIGxlbmd0aCBmb3IgUlRTL0NUUyBoYW5kc2hha2UKKyNkZWZpbmUgQ0ZHX1JUU19USFJIMgkJCQkJMHhGQzk5CQkvL1tBUF0gUG9ydCAyIGZyYW1lIGxlbmd0aCBmb3IgUlRTL0NUUyBoYW5kc2hha2UKKyNkZWZpbmUgQ0ZHX1JUU19USFJIMwkJCQkJMHhGQzlBCQkvL1tBUF0gUG9ydCAzIGZyYW1lIGxlbmd0aCBmb3IgUlRTL0NUUyBoYW5kc2hha2UKKyNkZWZpbmUgQ0ZHX1JUU19USFJINAkJCQkJMHhGQzlCCQkvL1tBUF0gUG9ydCA0IGZyYW1lIGxlbmd0aCBmb3IgUlRTL0NUUyBoYW5kc2hha2UKKyNkZWZpbmUgQ0ZHX1JUU19USFJINQkJCQkJMHhGQzlDCQkvL1tBUF0gUG9ydCA1IGZyYW1lIGxlbmd0aCBmb3IgUlRTL0NUUyBoYW5kc2hha2UKKyNkZWZpbmUgQ0ZHX1JUU19USFJINgkJCQkJMHhGQzlECQkvL1tBUF0gUG9ydCA2IGZyYW1lIGxlbmd0aCBmb3IgUlRTL0NUUyBoYW5kc2hha2UKKworI2RlZmluZSBDRkdfVFhfUkFURV9DTlRMMAkJCQkweEZDOUUJCS8vW0FQXSBQb3J0IDAgZGF0YSByYXRlIGNvbnRyb2wgZm9yIHRyYW5zbWlzc2lvbgorI2RlZmluZSBDRkdfVFhfUkFURV9DTlRMMQkJCQkweEZDOUYJCS8vW0FQXSBQb3J0IDEgZGF0YSByYXRlIGNvbnRyb2wgZm9yIHRyYW5zbWlzc2lvbgorI2RlZmluZSBDRkdfVFhfUkFURV9DTlRMMgkJCQkweEZDQTAJCS8vW0FQXSBQb3J0IDIgZGF0YSByYXRlIGNvbnRyb2wgZm9yIHRyYW5zbWlzc2lvbgorI2RlZmluZSBDRkdfVFhfUkFURV9DTlRMMwkJCQkweEZDQTEJCS8vW0FQXSBQb3J0IDMgZGF0YSByYXRlIGNvbnRyb2wgZm9yIHRyYW5zbWlzc2lvbgorI2RlZmluZSBDRkdfVFhfUkFURV9DTlRMNAkJCQkweEZDQTIJCS8vW0FQXSBQb3J0IDQgZGF0YSByYXRlIGNvbnRyb2wgZm9yIHRyYW5zbWlzc2lvbgorI2RlZmluZSBDRkdfVFhfUkFURV9DTlRMNQkJCQkweEZDQTMJCS8vW0FQXSBQb3J0IDUgZGF0YSByYXRlIGNvbnRyb2wgZm9yIHRyYW5zbWlzc2lvbgorI2RlZmluZSBDRkdfVFhfUkFURV9DTlRMNgkJCQkweEZDQTQJCS8vW0FQXSBQb3J0IDYgZGF0YSByYXRlIGNvbnRyb2wgZm9yIHRyYW5zbWlzc2lvbgorCisjZGVmaW5lIENGR19ERUZBVUxUX0tFWVMJCQkJMHhGQ0IwCQkvL2RlZmluZXMgc2V0IG9mIGVuY3J5cHRpb24ga2V5cworI2RlZmluZSBDRkdfVFhfS0VZX0lECQkJCQkweEZDQjEJCS8vc2VsZWN0IGtleSBmb3IgZW5jcnlwdGlvbiBvZiBUeCBtZXNzYWdlcworI2RlZmluZSBDRkdfU0NBTl9TU0lECQkJCQkweEZDQjIJCS8vU2NhbiBTU0lECisjZGVmaW5lIENGR19BRERfVEtJUF9ERUZBVUxUX0tFWQkJMHhGQ0I0CQkvL3NldCBLZXlJRCBhbmQgVHhLZXkgaW5kaWNhdGlvbgorI2RlZmluZSAJS0VZX0lECQkJCQkJCTB4MDAwMwkJLy9LZXlJRCBtYXNrIGZvciB0a2lwX2tleV9pZF9pbmZvIGZpZWxkCisjZGVmaW5lIAlUWF9LRVkJCQkJCQkJMHg4MDAwCQkvL0RlZmF1bHQgVHggS2V5IGZsYWcgb2YgdGtpcF9rZXlfaWRfaW5mbyBmaWVsZAorI2RlZmluZSBDRkdfU0VUX1dQQV9BVVRIX0tFWV9NR01UX1NVSVRFCTB4RkNCNQkJLy9BdXRoZW50aWNhdGVkIEtleSBNYW5hZ2VtZW50IFN1aXRlCisjZGVmaW5lIENGR19SRU1PVkVfVEtJUF9ERUZBVUxUX0tFWQkJMHhGQ0I2CQkvL2ludmFsaWRhdGUgS2V5SUQgYW5kIFR4S2V5IGluZGljYXRpb24KKyNkZWZpbmUgQ0ZHX0FERF9US0lQX01BUFBFRF9LRVkJCQkweEZDQjcJCS8vc2V0IE1BQyBhZGRyZXNzIHBhaXJ3aXNlIHN0YXRpb24KKyNkZWZpbmUgQ0ZHX1JFTU9WRV9US0lQX01BUFBFRF9LRVkJCTB4RkNCOAkJLy9pbnZhbGlkYXRlIE1BQyBhZGRyZXNzIHBhaXJ3aXNlIHN0YXRpb24KKyNkZWZpbmUgQ0ZHX1NFVF9XUEFfQ0FQQUJJTElUSUVTX0lORk8JMHhGQ0I5CQkvL1dQQSBDYXBhYmlsaXRpZXMKKyNkZWZpbmUgQ0ZHX0NBQ0hFRF9QTUtfQUREUgkJCQkweEZDQkEJCS8vc2V0IE1BQyBhZGRyZXNzIG9mIHByZS1hdXRoZW50aWNhdGVkIEFQCisjZGVmaW5lIENGR19SRU1PVkVfQ0FDSEVEX1BNS19BRERSCQkweEZDQkIJCS8vaW52YWxpZGF0ZSBNQUMgYWRkcmVzcyBvZiBwcmUtYXV0aGVudGljYXRlZCBBUAorI2RlZmluZSBDRkdfRkNCQwkweEZDQkMJLy9GVyBjb2RlcyBhaGVhZCBvZiBhdmFpbGFibGUgZG9jdW1lbnRhdGlvbiwgc28gPz8/Pz8/PworI2RlZmluZSBDRkdfRkNCRAkweEZDQkQJLy9GVyBjb2RlcyBhaGVhZCBvZiBhdmFpbGFibGUgZG9jdW1lbnRhdGlvbiwgc28gPz8/Pz8/PworI2RlZmluZSBDRkdfRkNCRQkweEZDQkUJLy9GVyBjb2RlcyBhaGVhZCBvZiBhdmFpbGFibGUgZG9jdW1lbnRhdGlvbiwgc28gPz8/Pz8/PworI2RlZmluZSBDRkdfRkNCRgkweEZDQkYJLy9GVyBjb2RlcyBhaGVhZCBvZiBhdmFpbGFibGUgZG9jdW1lbnRhdGlvbiwgc28gPz8/Pz8/PworCisjZGVmaW5lIENGR19IQU5ET1ZFUl9BRERSCQkJCTB4RkNDMAkJLy9bQVBdIFN0YXRpb24gTUFDIEFkcnJlc3MgcmUtYXNzb2NpYXRlZCB3aXRoIG90aGVyIEFQCisjZGVmaW5lIENGR19TQ0FOX0NIQU5ORUwJCQkJMHhGQ0MyCQkvL0NoYW5uZWwgc2V0IGZvciBob3N0IHJlcXVlc3RlZCBzY2FuCisvLzs/I2RlZmluZSBDRkdfU0NBTl9DSEFOTkVMX01BU0sJCQkweEZDQzIJCS8vIGNvbnRhaW5zCisjZGVmaW5lIENGR19ESVNBU1NPQ0lBVEVfQUREUgkJCTB4RkNDNAkJLy9bQVBdIFN0YXRpb24gTUFDIEFkcnJlc3MgdG8gYmUgZGlzYXNzb2NpYXRlZAorI2RlZmluZSBDRkdfUFJPQkVfREFUQV9SQVRFCQkJCTB4RkNDNQkJLy9XQVJQIGNvbm5lY3Rpb24gY29udHJvbAorI2RlZmluZSBDRkdfRlJBTUVfQlVSU1RfTElNSVQJCQkweEZDQzYJCS8vCisjZGVmaW5lIENGR19DT0VYSVNURU5TRV9CRUhBVklPVVIJCTB4RkNDNwkJLy9bQVBdCisjZGVmaW5lIENGR19ERUFVVEhFTlRJQ0FURV9BRERSCQkJMHhGQ0M4CQkvL01BQyBhZGRyZXNzIG9mIFN0YXRpb24gdG8gYmUgZGVhdXRoZW50aWNhdGVkCisKKy8vCUJFSEFWSU9SIFBBUkFNRVRFUlMKKyNkZWZpbmUgQ0ZHX1RJQ0tfVElNRQkJCQkJMHhGQ0UwCQkvL0F1eGlsaWFyeSBUaW1lciB0aWNrIGludGVydmFsCisjZGVmaW5lIENGR19ERFNfVElDS19USU1FCQkJCTB4RkNFMQkJLy9EaXNjb25uZWN0ZWQgRGVlcFNsZWVwIFRpbWVyIHRpY2sgaW50ZXJ2YWwKKy8vI2RlZmluZSBDRkdfQ05GX0NPVU5UUlkJCQkJCTB4RkNGRQlhcHBhcmVudGx5IG5vdCBuZWVkZWQgOz8KKyNkZWZpbmUgQ0ZHX1JJRF9DRkdfTUFYCQkJCQkweEZDRkYJCS8vaGlnaGVzdCB2YWx1ZSByZXByZXNlbnRpbmcgYW4gQ29uZmlndXJhdGlvbiBSSUQKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSU5GT1JNQVRJT04gUkVDT1JEUyAJPT09PT09PT09PT09PT09PT09PT09Ki8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBtYXNrIDB4RkR4eAkJCQk9PT09PT09PT09PT09PT09PT09PT0qLworLy8JTklDIElORk9STUFUSU9OCisjZGVmaW5lIENGR19SSURfSU5GX01JTgkJCQkJMHhGRDAwCS8vbG93ZXN0IHZhbHVlIHJlcHJlc2VudGluZyBhbiBJbmZvcm1hdGlvbiBSSUQKKyNkZWZpbmUgQ0ZHX01BWF9MT0FEX1RJTUUJCQkJMHhGRDAwCS8vW0lOVF0gTWF4aW11bSByZXNwb25zZSB0aW1lIG9mIHRoZSBEb3dubG9hZCBjb21tYW5kLgorI2RlZmluZSBDRkdfRExfQlVGCQkJCQkJMHhGRDAxCS8vW0lOVF0gRG93bmxvYWQgYnVmZmVyIGxvY2F0aW9uIGFuZCBzaXplLgorI2RlZmluZSBDRkdfUFJJX0lERU5USVRZCQkJCTB4RkQwMgkvL1tQUkldIFByaW1hcnkgRnVuY3Rpb25zIGZpcm13YXJlIGlkZW50aWZpY2F0aW9uLgorI2RlZmluZSBDRkdfUFJJX1NVUF9SQU5HRQkJCQkweEZEMDMJLy9bUFJJXSBQcmltYXJ5IEZ1bmN0aW9ucyBJL0YgU3VwcGxpZXIgY29tcGF0aWJpbGl0eSByYW5nZS4KKyNkZWZpbmUgQ0ZHX05JQ19IU0lfU1VQX1JBTkdFCQkJMHhGRDA5CS8vSC9XIC0gUy9XIEkvRiBzdXBwbGllciByYW5nZQorI2RlZmluZSBDRkdfTklDX1NFUklBTF9OVU1CRVIJCQkweEZEMEEJLy9bUFJJXSBOZXR3b3JrIEludGVyZmFjZSBDYXJkIHNlcmlhbCBudW1iZXIuCisjZGVmaW5lIENGR19OSUNfSURFTlRJVFkJCQkJMHhGRDBCCS8vW1BSSV0gTmV0d29yayBJbnRlcmZhY2UgQ2FyZCBpZGVudGlmaWNhdGlvbi4KKyNkZWZpbmUgQ0ZHX05JQ19NRklfU1VQX1JBTkdFCQkJMHhGRDBDCS8vW1BSSV0gTW9kZW0gSS9GIFN1cHBsaWVyIGNvbXBhdGliaWxpdHkgcmFuZ2UuCisjZGVmaW5lIENGR19OSUNfQ0ZJX1NVUF9SQU5HRQkJCTB4RkQwRAkvL1tQUkldIENvbnRyb2xsZXIgSS9GIFN1cHBsaWVyIGNvbXBhdGliaWxpdHkgcmFuZ2UuCisjZGVmaW5lIENGR19DSEFOTkVMX0xJU1QJCQkJMHhGRDEwCS8vQWxsb3dlZCBjb21tdW5pY2F0aW9uIGNoYW5uZWxzLgorI2RlZmluZSBDRkdfTklDX1RFTVBfVFlQRSAgCQkJCTB4RkQxMgkvL0hhcmR3YXJlIHRlbXBlcmF0dXJlIHJhbmdlIGNvZGUuCisjZGVmaW5lIENGR19DSVMJCQkJCQkJMHhGRDEzCS8vUEMgQ2FyZCBTdGFuZGFyZCBDYXJkIEluZm9ybWF0aW9uIFN0cnVjdHVyZQorI2RlZmluZSBDRkdfTklDX1BST0ZJTEUJCQkJCTB4RkQxNAkvL0NhcmQgUHJvZmlsZQorI2RlZmluZSBDRkdfRldfSURFTlRJVFkJCQkJCTB4RkQyMAkvL2Zpcm13YXJlIGlkZW50aWZpY2F0aW9uLgorI2RlZmluZSBDRkdfRldfU1VQX1JBTkdFCQkJCTB4RkQyMQkvL2Zpcm13YXJlIFN1cHBsaWVyIGNvbXBhdGliaWxpdHkgcmFuZ2UuCisjZGVmaW5lIENGR19NRklfQUNUX1JBTkdFU19TVEEJCQkweEZEMjIJLy9bU1RBXSBNb2RlbSBJL0YgQWN0b3IgY29tcGF0aWJpbGl0eSByYW5nZXMuCisjZGVmaW5lIENGR19DRklfQUNUX1JBTkdFU19TVEEJCQkweEZEMjMJLy9bU1RBXSBDb250cm9sbGVyIEkvRiBBY3RvciBjb21wYXRpYmlsaXR5IHJhbmdlcy4KKyNkZWZpbmUgQ0ZHX05JQ19CVVNfVFlQRQkJCQkweEZEMjQJLy9DYXJkIEJ1c3R5cGUKKyNkZWZpbmUgCUNGR19OSUNfQlVTX1RZUEVfUENDQVJEX0NGCQkweDAwMDAJLy8xNiBiaXQgUEMgQ2FyZCBvciBDb21wYWN0IEZsYXNoCisjZGVmaW5lIAlDRkdfTklDX0JVU19UWVBFX1VTQgkJCTB4MDAwMQkvL1VTQgorI2RlZmluZSAJQ0ZHX05JQ19CVVNfVFlQRV9DQVJEQlVTCQkweDAwMDIJLy9DYXJkQnVzCisjZGVmaW5lIAlDRkdfTklDX0JVU19UWVBFX1BDSQkJCTB4MDAwMwkvLyhtaW5pKVBDSQorI2RlZmluZSBDRkdfRE9NQUlOX0NPREUJCQkJCQkweEZEMjUKKworLy8JTUFDIElORk9STUFUSU9OCisjZGVmaW5lIENGR19QT1JUX1NUQVQJCQkJCTB4RkQ0MAkvL0FjdHVhbCBNQUMgUG9ydCBjb25uZWN0aW9uIGNvbnRyb2wgc3RhdHVzCisjZGVmaW5lIENGR19DVVJfU1NJRAkJCQkJMHhGRDQxCS8vW1NUQV0gSWRlbnRpZmljYXRpb24gb2YgdGhlIGFjdHVhbGx5IGNvbm5lY3RlZCBTUworI2RlZmluZSBDRkdfQ1VSX0JTU0lECQkJCQkweEZENDIJLy9bU1RBXSBJZGVudGlmaWNhdGlvbiBvZiB0aGUgYWN0dWFsbHkgY29ubmVjdGVkIEJTUworI2RlZmluZSBDRkdfQ09NTVNfUVVBTElUWQkJCQkweEZENDMJLy9bU1RBXSBRdWFsaXR5IG9mIHRoZSBCYXNpYyBTZXJ2aWNlIFNldCBjb25uZWN0aW9uCisjZGVmaW5lIENGR19DVVJfVFhfUkFURQkJCQkJMHhGRDQ0CS8vW1NUQV0gQWN0dWFsIHRyYW5zbWl0IGRhdGEgcmF0ZQorI2RlZmluZSBDRkdfQ1VSX0JFQUNPTl9JTlRFUlZBTAkJCTB4RkQ0NQkvL0JlYWNvbiB0cmFuc21pdCBpbnRlcnZhbCB0aW1lIGZvciBCU1MgY3JlYXRpb24KKyNkZWZpbmUgQ0ZHX0NVUl9TQ0FMRV9USFJICQkJCTB4RkQ0NgkvL0FjdHVhbCBTeXN0ZW0gU2NhbGUgdGhyZXNob2xkcyBzZXR0aW5ncworI2RlZmluZSBDRkdfUFJPVE9DT0xfUlNQX1RJTUUJCQkweEZENDcJLy9NYXggdGltZSB0byBhd2FpdCBhIHJlc3BvbnNlIHRvIGEgcmVxdWVzdCBtZXNzYWdlCisjZGVmaW5lIENGR19DVVJfU0hPUlRfUkVUUllfTElNSVQJCTB4RkQ0OAkvL01heCBudW1iZXIgb2YgdHJhbnNtaXQgYXR0ZW1wdHMgZm9yIHNob3J0IGZyYW1lcworI2RlZmluZSBDRkdfQ1VSX0xPTkdfUkVUUllfTElNSVQJCTB4RkQ0OQkvL01heCBudW1iZXIgb2YgdHJhbnNtaXQgYXR0ZW1wdHMgZm9yIGxvbmcgZnJhbWVzCisjZGVmaW5lIENGR19NQVhfVFhfTElGRVRJTUUJCQkJMHhGRDRBCS8vTWF4IHRyYW5zbWl0IGZyYW1lIGhhbmRsaW5nIGR1cmF0aW9uCisjZGVmaW5lIENGR19NQVhfUlhfTElGRVRJTUUJCQkJMHhGRDRCCS8vTWF4IHJlY2VpdmVkIGZyYW1lIGhhbmRsaW5nIGR1cmF0aW9uCisjZGVmaW5lIENGR19DRl9QT0xMQUJMRQkJCQkJMHhGRDRDCS8vW1NUQV0gQ29udGVudGlvbiBGcmVlIHBvbGxhYmxlIGNhcGFiaWxpdHkgaW5kaWNhdGlvbgorI2RlZmluZSBDRkdfQVVUSEVOVElDQVRJT05fQUxHT1JJVEhNUwkweEZENEQJLy9BdmFpbGFibGUgQXV0aGVudGljYXRpb24gQWxnb3JpdGhtcyBpbmRpY2F0aW9uCisjZGVmaW5lIENGR19QUklWQUNZX09QVF9JTVBMRU1FTlRFRAkJMHhGRDRGCS8vV0VQIE9wdGlvbiBhdmFpbGFiaWxpdHkgaW5kaWNhdGlvbgorCisjZGVmaW5lIENGR19DVVJfUkVNT1RFX1JBVEVTCQkJMHhGRDUwCS8vW1NUQV0gQ3VycmVudFJlbW90ZVJhdGVzCisjZGVmaW5lIENGR19DVVJfVVNFRF9SQVRFUwkJCQkweEZENTEJLy9bU1RBXSBDdXJyZW50VXNlZFJhdGVzCisjZGVmaW5lIENGR19DVVJfU1lTVEVNX1NDQUxFCQkJMHhGRDUyCS8vW1NUQV0gQ3VycmVudFN5c3RlbVNjYWxlCisKKyNkZWZpbmUgQ0ZHX0NVUl9UWF9SQVRFMQkJCQkweEZEODAJLy9bQVBdIEFjdHVhbCBQb3J0IDEgdHJhbnNtaXQgZGF0YSByYXRlCisjZGVmaW5lIENGR19DVVJfVFhfUkFURTIJCQkJMHhGRDgxCS8vW0FQXSBBY3R1YWwgUG9ydCAyIHRyYW5zbWl0IGRhdGEgcmF0ZQorI2RlZmluZSBDRkdfQ1VSX1RYX1JBVEUzCQkJCTB4RkQ4MgkvL1tBUF0gQWN0dWFsIFBvcnQgMyB0cmFuc21pdCBkYXRhIHJhdGUKKyNkZWZpbmUgQ0ZHX0NVUl9UWF9SQVRFNAkJCQkweEZEODMJLy9bQVBdIEFjdHVhbCBQb3J0IDQgdHJhbnNtaXQgZGF0YSByYXRlCisjZGVmaW5lIENGR19DVVJfVFhfUkFURTUJCQkJMHhGRDg0CS8vW0FQXSBBY3R1YWwgUG9ydCA1IHRyYW5zbWl0IGRhdGEgcmF0ZQorI2RlZmluZSBDRkdfQ1VSX1RYX1JBVEU2CQkJCTB4RkQ4NQkvL1tBUF0gQWN0dWFsIFBvcnQgNiB0cmFuc21pdCBkYXRhIHJhdGUKKyNkZWZpbmUgQ0ZHX05JQ19NQUNfQUREUgkJCQkweEZEODYJLy9VbmlxdWUgbG9jYWwgbm9kZSBNQUMgQWRkcmVzcworI2RlZmluZSBDRkdfUENGX0lORk8JCQkJCTB4RkQ4NwkvL1tBUF0gUG9pbnQgQ29vcmRpbmF0aW9uIEZ1bmN0aW9uIGNhcGFiaWxpdHkgaW5mbworLy8qUkVTRVJWRUQqICNkZWZpbmUgQ0ZHX0hJR0hFU1RfQkFTSUNfUkFURQkJCTB4RkQ4OAkvLworI2RlZmluZSBDRkdfQ1VSX0NPVU5UUllfSU5GTwkJCTB4RkQ4OQkvLworI2RlZmluZSBDRkdfQ1VSX1NTTl9JTkZPX0VMRU1FTlQJCTB4RkQ4QQkvLworI2RlZmluZSBDRkdfQ1VSX1RLSVBfSVZfSU5GTwkJCTB4RkQ4QgkvLworI2RlZmluZSBDRkdfQ1VSX0FTU09DX1JFUV9JTkZPCQkJMHhGRDhDCS8vCisjZGVmaW5lIENGR19DVVJfQVNTT0NfUkVTUF9JTkZPCQkJMHhGRDhECS8vCisjZGVmaW5lIENGR19DVVJfTE9BRAkJCQkJMHhGRDhFCS8vW0FQXSBjdXJyZW50IGxvYWQgb24gQVAncyBjaGFubmVsCisKKyNkZWZpbmUgQ0ZHX1NFQ1VSSVRZX0NBUEFCSUxJVElFUwkJMHhGRDkwCS8vQ29tYmluZWQgY2FwYWJpbGl0aWVzIGluZm9ybWF0aW9uCisKKy8vCU1PREVNIElORk9STUFUSU9OCisjZGVmaW5lIENGR19QSFlfVFlQRQkJCQkJMHhGREMwCS8vUGh5c2ljYWwgbGF5ZXIgdHlwZSBpbmRpY2F0aW9uCisjZGVmaW5lIENGR19DVVJfQ0hBTk5FTAkJCQkJMHhGREMxCS8vQWN0dWFsIGZyZXF1ZW5jeSBjaGFubmVsIHVzZWQgZm9yIHRyYW5zbWlzc2lvbgorI2RlZmluZSBDRkdfQ1VSX1BPV0VSX1NUQVRFCQkJCTB4RkRDMgkvL0FjdHVhbCBwb3dlciBjb25zdW1wdGlvbiBzdGF0dXMKKyNkZWZpbmUgQ0ZHX0NDQV9NT0RFCQkJCQkweEZEQzMJLy9DbGVhciBjaGFubmVsIGFzc2Vzc21lbnQgbW9kZSBpbmRpY2F0aW9uCisjZGVmaW5lIENGR19TVVBQT1JURURfREFUQV9SQVRFUwkJMHhGREM2CS8vRGF0YSByYXRlcyBjYXBhYmlsaXR5IGluZm9ybWF0aW9uCisKKyNkZWZpbmUgQ0ZHX1JJRF9JTkZfTUFYCQkJCQkweEZERkYJLy9oaWdoZXN0IHZhbHVlIHJlcHJlc2VudGluZyBhbiBJbmZvcm1hdGlvbiBSSUQKKworLy8JRU5HSU5FRVJJTkcgSU5GT1JNQVRJT04KKyNkZWZpbmUgQ0ZHX1JJRF9FTkdfTUlOCQkJCQkweEZGRTAJLy9sb3dlc3QgdmFsdWUgcmVwcmVzZW50aW5nIGEgSGVybWVzIGVuZ2luZWVyaW5nIFJJRAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogR2VuZXJhbCBkZWZpbmUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvL0lGQiBmaWVsZCByZWxhdGVkCisvLwkJSUZCX0NhcmRTdGF0CisjZGVmaW5lIENBUkRfU1RBVF9JTkNPTVBfUFJJCQkJMHgyMDAwVQkvLyBubyBjb21wYXRpYmxlIEhTSSAvIHByaW1hcnkgRi9XCisjZGVmaW5lIENBUkRfU1RBVF9JTkNPTVBfRlcJCQkJMHgxMDAwVQkvLyBubyBjb21wYXRpYmxlIHN0YXRpb24gLyB0ZXJ0aWFyeSBGL1cKKyNkZWZpbmUgQ0FSRF9TVEFUX0RFRlVOQ1QJCQkJMHgwMTAwVQkvLyBIQ0YgaXMgaW4gRGVmdW5jdCBtb2RlCisvLwkJSUZCX1J4U3RhdAorI2RlZmluZSBSWF9TVEFUX1BSSU8JCQkJCTB4MDBFMFUJLy9Qcmlvcml0eSBzdWJmaWVsZAorI2RlZmluZSBSWF9TVEFUX0VSUgkJCQkJCTB4MDAwRlUJLy9FcnJvciBtYXNrCisjZGVmaW5lIAlSWF9TVEFUX1VOREVDUgkJCQkweDAwMDJVCS8vTm9uLWRlY3J5cHRhYmxlIGVuY3J5cHRlZCBtZXNzYWdlCisjZGVmaW5lIAlSWF9TVEFUX0ZDU19FUlIJCQkJMHgwMDAxVQkvL0ZDUyBlcnJvcgorCisvLyBTTkFQIGhlYWRlciBmb3IgRS1JSSBFbmNhcHN1bGF0aW9uCisjZGVmaW5lIEVOQ19OT05FCQkJICAgICAgICAgICAgMHhGRgorI2RlZmluZSBFTkNfMTA0MiAgICAJCQkgICAgICAgIDB4MDAKKyNkZWZpbmUgRU5DX1RVTk5FTCAgICAgIAkgICAgCQkweEY4CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFh4eHh4eHh4ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2RlZmluZSBIQ0ZfU1VDQ0VTUwkJCQkJMHgwMAkvLyBPSworI2RlZmluZSBIQ0ZfRVJSX1RJTUVfT1VUCQkJMHgwNAkvLyBFeHBlY3RlZCBIZXJtZXMgZXZlbnQgZGlkIG5vdCBvY2N1cmUgaW4gZXhwZWN0ZWQgdGltZQorI2RlZmluZSBIQ0ZfRVJSX05PX05JQwkJCQkweDA1CS8qIGNhcmQgbm90IGZvdW5kICh1c3VhbGx5IHlhbmtlZCBhd2F5IGR1cmluZyBoY2Zpb19pbl9zdHJpbmcKKwkJCQkJCQkJCQkgIAkgKiBBbHNvOiBjYXJkIGlzIGVpdGhlciBhYnNlbnQgb3IgZGlzYWJsZWQgd2hpbGUgaXQgc2hvdWxkIGJlIG5laXRoZXIgKi8KKyNkZWZpbmUgSENGX0VSUl9MRU4JCQkJCTB4MDgJLyogYnVmZmVyIHNpemUgaW5zdWZmaWNpZW50CisJCSAJCQkJCQkJCSAgCSAqCQkgIC0JSUZCX0NvbmZpZ1RhYmxlIHRvbyBzbWFsbAorCQkgCQkJCQkJCQkgIAkgKgkJICAtCWhjZl9nZXRfaW5mbyBidWZmZXIgaGFzIGEgc2l6ZSBvZiAwIG9yIDEgb3IgbGVzcyB0aGFuIG5lZWRlZAorCQkgCQkJCQkJCSAgCQkgKgkJCXRvIGFjY29tb2RhdGUgYWxsIGRhdGEKKwkJIAkJCQkJCQkgIAkJICoJCSAgLQloY2ZfcHV0X2luZm86IENGR19ETE5WX0RBVEEgZXhjZWVkcyBpbnRlcm1lZGlhdGUKKwkJCQkJCQkJCQkJICoJCSAgYnVmZmVyIHNpemUgKi8KKyNkZWZpbmUgSENGX0VSUl9JTkNPTVBfUFJJCQkJMHgwOQkvLyBwcmltYXJ5IGZ1bmN0aW9ucyBhcmUgbm90IGNvbXBhdGlibGUKKyNkZWZpbmUgSENGX0VSUl9JTkNPTVBfRlcJCQkweDBBCS8vIHN0YXRpb24gZnVuY3Rpb25zIGFyZSBjb21wYXRpYmxlCisjZGVmaW5lIEhDRl9FUlJfTUlDCQkJCQkweDBECS8vIE1JQyBjaGVjayBmYWlscworI2RlZmluZSBIQ0ZfRVJSX1NMRUVQCQkJCTB4MEUJLy8gTklDIGluIHNsZWVwIG1vZGUKKyNkZWZpbmUgSENGX0VSUl9NQVgJCQkJCTB4M0YJLyogZW5kIG9mIEhDRiByYW5nZQorCQkJCQkJCQkJCQkgICAqKiogKiogKioqICoqKioqKiAqKiogKioqKioqKioqKioqKioqICovCisjZGVmaW5lIEhDRl9FUlJfREVGVU5DVAkJCQkweDgwCS8vIEJJVCwgcmVmbGVjdGluZyB0aGF0IHRoZSBIQ0YgaXMgaW4gZGVmdW5jdCBtb2RlIChiaXRzIDB4N0YgcmVmbGVjdCBjYXVzZSkKKyNkZWZpbmUgSENGX0VSUl9ERUZVTkNUX0FVWAkJCTB4ODIJLy8gVGltZW91dCBvbiBhY2tub3dsZWRnZW1lbnQgb24gZW4vZGlzYWJsaW5nIEFVWCByZWdpc3RlcnMKKyNkZWZpbmUgSENGX0VSUl9ERUZVTkNUX1RJTUVSCQkweDgzCS8vIFRpbWVvdXQgb24gdGltZXIgY2FsaWJyYXRpb24gZHVyaW5nIGluaXRpYWxpemF0aW9uIHByb2Nlc3MKKyNkZWZpbmUgSENGX0VSUl9ERUZVTkNUX1RJTUVfT1VUCTB4ODQJLy8gVGltZW91dCBvbiBCdXN5IGJpdCBkcm9wIGR1cmluZyBCQVAgc2V0dXAKKyNkZWZpbmUgSENGX0VSUl9ERUZVTkNUX0NNRF9TRVEJCTB4ODYJLy8gSGVybWVzIGFuZCBIQ0YgYXJlIG91dCBvZiBzeW5jIGluIGlzc3VpbmcvcHJvY2Vzc2luZyBjb21tYW5kcworCisjZGVmaW5lIEhDRl9JTlRfUEVORElORwkJCQkweDAxCS8vIHJldHVybiBzdGF0dXMgb2YgaGNmX2FjdCggSENGX0FDVF9JTlRfT0ZGICkKKworI2RlZmluZSBIQ0ZfUE9SVF8wIAkJCQkJMHgwMDAwCS8vIFN0YXRpb24gc3VwcG9ydHMgb25seSBzaW5nbGUgTUFDIFBvcnQKKyNkZWZpbmUgSENGX1BPUlRfMSAJCQkJCTB4MDEwMAkvLyBIQ0ZfUE9SVF8xIHRocm91Z2ggSENGX1BPUlRfNiBhcmUgb25seSBzdXBwb3J0ZWQgYnkgQVAgRi9XCisjZGVmaW5lIEhDRl9QT1JUXzIgCQkJCQkweDAyMDAKKyNkZWZpbmUgSENGX1BPUlRfMyAJCQkJCTB4MDMwMAorI2RlZmluZSBIQ0ZfUE9SVF80IAkJCQkJMHgwNDAwCisjZGVmaW5lIEhDRl9QT1JUXzUgCQkJCQkweDA1MDAKKyNkZWZpbmUgSENGX1BPUlRfNiAJCQkJCTB4MDYwMAorCisjZGVmaW5lIEhDRl9DTlRMX0VOQUJMRQkJCQkweDAxCisjZGVmaW5lIEhDRl9DTlRMX0RJU0FCTEUJCQkweDAyCisjZGVmaW5lIEhDRl9DTlRMX0NPTk5FQ1QJCQkweDAzCisjZGVmaW5lIEhDRl9DTlRMX0RJU0NPTk5FQ1QJCQkweDA1CisjZGVmaW5lIEhDRl9DTlRMX0NPTlRJTlVFCQkJMHgwNworCisjZGVmaW5lIFVTRV9ETUEgCQkJCQkweDAwMDEKKyNkZWZpbmUgVVNFXzE2QklUIAkJCQkJMHgwMDAyCisjZGVmaW5lIERNQV9FTkFCTEVECQkJCQkweDgwMDAJLy93ZWFrIG5hbWUsIGl0IHJlYWxseSBtZWFuczogRi9XIGVuYWJsZWQgYW5kIERNQSBzZWxlY3RlZAorCisvLyNkZWZpbmUgSENGX0RNQV9GRF9DTlQJIAkJKDIqMjkpIAkJCQkJCS8vc2l6ZSBpbiBieXRlcyBvZiBvbmUgVHgvUnhGUyBtaW51cyBEQS9TQQorLy87P3RoZSBNU0YgKCBIMlBDSS5DIHVzZXMgdGhlIG5leHQgMiBtbmVtb25pY3MgKQorI2RlZmluZSBIQ0ZfRE1BX1JYX0JVRjFfU0laRQkJKEhGU19BRERSX0RFU1QgKyA4KQkJCS8vZXh0cmEgYnl0ZXMgZm9yIExFTi9TTkFQIGlmIGRlY2Fwc3VsYXRpb24KKyNkZWZpbmUgSENGX0RNQV9UWF9CVUYxX1NJWkUJCShIRlNfQUREUl9ERVNUICsgMio2ICsgOCkJLy9leHRyYSBieXRlcyBmb3IgREEvU0EvTEVOL1NOQVAgaWYgZW5jYXBzdWxhdGlvbgorCisvL0hGU19UWF9DTlRMCisvKiBOb3RlIHRoYXQgdGhlIEhDRl8uLi4uIFN5c3RlbSBDb25zdGFudHMgaW5mbHVlbmNlIHRoZSBIRlNfLi4uLiB2YWx1ZXMgYmVsb3cKKyAqIAkJCQkJCQkJSC1JCQlILUkJIHwJSC1JSQlILUlJCUgtSUkuNQorICoJCQkJCQkJCQkJV1BBCSB8CQkJV1BBCisgKiBIRlNfVFhfQ05UTF9UWF9PSwkJCTAwMDIJMDAwMiB8CTAwMDIJMDAwMgkgTi9BCTw8PDw8PDw8ZGVwcmVjYXRlZAorICogSEZTX1RYX0NOVExfVFhfRVgJCQkwMDA0CTAwMDQgfAkwMDA0CTAwMDQJIE4vQQorICogSEZTX1RYX0NOVExfTUlDCQkJCSBOL0EJMDAxMCB8CSBOL0EJMDAxMAkgTi9BCisgKiBIRlNfVFhfQ05UTF9USUQJCQkJIE4vQQkgTi9BIHwJIE4vQQkgTi9BCTAwMEYKKyAqIEhGU19UWF9DTlRMX1NFUlZJQ0VfQ0xBU1MJIE4vQQkgTi9BIHwJIE4vQQkgTi9BCTAwQzAKKyAqIEhGU19UWF9DTlRMX1BPUlQJCQkJMDcwMAkwNzAwIHwJMDcwMAkwNzAwCTA3MDAKKyAqIEhGU19UWF9DTlRMX01JQ19LRVlfSUQJCTE4MDAJMTgwMCB8CTAwMDAJMTgwMAkgTi9BCisgKiBIRlNfVFhfQ05UTF9DS0lQCQkJCTAwMDAJMDAwMCB8CTAwMDAJMjAwMAkyMDAwCisgKiBIRlNfVFhfQ05UTF9UWF9ERUxBWQkJCTQwMDAJNDAwMCB8CTQwMDAJNDAwMAkgTi9BCisgKiBIRlNfVFhfQ05UTF9BQ1RJT04JCQkgTi9BCSBOL0EgfAkgTi9BCSBOL0EJNDAwMAorICogCQkJCQkJCQk9PT09CT09PT0gfAk9PT09CT09PT0JPT09PQorICogCQkJCQkJCQk1RjA2CTVGMTYgfAk0NzA2CTdGMDYJNjdDRgorICoKKyAqIEhDRl9UWF9DTlRMX01BU0sgc3BlY2lmaWVzIHRoZSBiaXRzIGFsbG93ZWQgb24gdGhlIEhvc3QgSS9GCisgKiBub3RlOiBiaXQgMHg0MDAwIGhhcyBkaWZmZXJlbnQgbWVhbmluZyBmb3IgSC1JSSBhbmQgSC1JSS41CisgKiBub3RlOiBbXSBpbmRpY2F0ZSBiaXRzIHdoaWNoIGFyZSBwb3NzaWJseSBhZGRlZCBieSB0aGUgSENGIHRvIFR4Q29udHJvbCBhdCB0aGUgSG9zdCBJL0YKKyAqIG5vdGU6ICgpIGluZGljYXRlIGJpdHMgd2hpY2ggYXJlIHN1cHBvc2VkbHkgbmV2ZXIgZXZlciB1c2VkIGluIGEgV0NJIGVudmlyb25tZW50CisgKiBub3RlOiA/IGRlbm90ZSBiaXRzIHdoaWNoIHNlZW0gbm90IHRvIGJlIGRvY3VtZW50ZWQgaW4gdGhlIGRvY3VtZW50cyBJIGhhdmUgYXZhaWxhYmxlCisgKi8KKy8vSC1JOiAgICAgSENGX1RYX0NOVExfTUFTSwkweDQ3RkUJLy9UWF9ERUxBWSwgTUFDUG9ydCwgUHJpb3JpdHksIChTdHJ1Y1R5cGUpLCBUeEV4LCBUeE9LCisvL0gtSSBXUEE6IEhDRl9UWF9DTlRMX01BU0sJMHg1RkU2CS8vVFhfREVMQVksIE1JQ0tleSwgTUFDUG9ydCwgUHJpb3JpdHksIChTdHJ1Y1R5cGUpLCBUeEV4LCBUeE9LCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dBUlAKKyNkZWZpbmUgIEhDRl9UWF9DTlRMX01BU0sJMHgyN0U3CS8vbm8gVFhfREVMQVk/LCBDQ1gsIE1BQ1BvcnQsIFByaW9yaXR5LCAoU3RydWNUeXBlKSwgVHhFeCwgVHhPSywgU3BlY3RyYWxpbmsKKy8vI2VsaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQorLy8jZGVmaW5lICBIQ0ZfVFhfQ05UTF9NQVNLCTB4N0YwNgkvL1RYX0RFTEFZLCBDS0lQPywgTUlDS2V5SUQsIE1BQ1BvcnQsIFtNSUNdLFR4RXgsIFR4T0sgKFRBUjQxOUQ3KQorI2Vsc2UKKyNkZWZpbmUgIEhDRl9UWF9DTlRMX01BU0sJMHg2N0U3CS8vVFhfREVMQVk/LCBDQ1gsIE1BQ1BvcnQsIFByaW9yaXR5LCAoU3RydWNUeXBlKSwgVHhFeCwgVHhPSywgU3BlY3RyYWxpbmsKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9XQVJQCisKKyNkZWZpbmUgSEZTX1RYX0NOVExfVFhfRVgJCQkweDAwMDRVCisKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCisjZGVmaW5lIEhGU19UWF9DTlRMX01JQwkJCQkweDAwMTBVCS8vODAyLjMgZm9ybWF0IHdpdGggVEtJUAkJOz9jaGFuZ2VzIHRvIDB4MDAwOCBmb3IgSC1JSQorI2RlZmluZSBIRlNfVFhfQ05UTF9NSUNfS0VZX0lECQkweDE4MDBVCS8vTUlDIEtleSBJRCBzdWJmaWVsZAorI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQorCisjZGVmaW5lIEhGU19UWF9DTlRMX1BPUlQJCQkweDA3MDBVCS8vUG9ydCBzdWJmaWVsZCBvZiBUeENvbnRyb2wgZmllbGQgb2YgVHJhbnNtaXQgRnJhbWUgU3RydWN0dXJlCisKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfQ0NYCisjZGVmaW5lIEhGU19UWF9DTlRMX0NLSVAJCQkweDIwMDBVCS8vQ0tJUCBlbmNyeXB0ZWQgZmxhZworI2VuZGlmIC8vIEhDRl9UWVBFX0NDWAorCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1RYX0RFTEFZCisjZGVmaW5lIEhGU19UWF9DTlRMX1RYX0RFTEFZCQkweDQwMDBVCS8vZGVjb3VwbGUgInB1dCBkYXRhIiBhbmQgc2VuZAorI2VuZGlmIC8vIEhDRl9UWVBFX1RYX0RFTEFZCisjZGVmaW5lIEhGU19UWF9DTlRMX1RYX0NPTlQJCQkweDQwMDB1CS8vZW5naW5lZXJpbmc6IGNvbnRpbnVvdXMgdHJhbnNtaXQKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEhDRiBEZWZpbmVkIFJFQ09SRFMJPT09PT09PT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIENGR19QUk9EX0RBVEEJCQkJCTB4MDgwMCAJCS8vUGx1ZyBEYXRhIChFbmdpbmVlcmluZyBUZXN0IHB1cnBvc2VzIG9ubHkpCisjZGVmaW5lIENGR19ETF9FRVBST00JCQkJCTB4MDgwNgkJLy9VcC9Eb3dubG9hZCBJMlBST00gZm9yIFVTQgorI2RlZmluZQkJQ0ZHX1BEQQkJCQkJCQkweDAwMDIJCS8vRG93bmxvYWQgUERBCisjZGVmaW5lCQlDRkdfTUVNX0kyUFJPTQkJCQkJMHgwMDA0CQkvL1VwL0Rvd25sb2FkIEVFUFJPTQorCisjZGVmaW5lCQlDRkdfTUVNX1JFQUQJCQkJCTB4MDAwMAorI2RlZmluZQkJQ0ZHX01FTV9XUklURQkJCQkJMHgwMDAxCisKKyNkZWZpbmUgQ0ZHX05VTEwJCQkJCQkweDA4MjAJCS8vRW1wdHkgTWFpbCBCb3ggSW5mbyBCbG9jaworI2RlZmluZSBDRkdfTUJfSU5GTwkJCQkJCTB4MDgyMAkJLy9NYWlsIEJveCBJbmZvIEJsb2NrCisjZGVmaW5lIENGR19XTVAJCQkJCQkJMHgwODIyCQkvL1dhdmVMQU4gTWFuYWdlbWVudCBQcm90b2NvbAorCisjaWYgZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lECisjZGVmaW5lIENGR19EUlZfSU5GTwkJCQkJMHgwODI1CQkvL0RyaXZlciBJbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgKHNlZSBDRkdfRFJWX0lORk9fU1RSQ1QgZm9yIGRldGFpbHMpCisjZGVmaW5lIENGR19EUlZfSURFTlRJVFkJCQkJMHgwODI2CQkvL2RyaXZlciBpZGVudGl0eSAoc2VlIENGR19EUlZfSURFTlRJVFlfU1RSQ1QgZm9yIGRldGFpbHMpCisjZGVmaW5lIENGR19EUlZfU1VQX1JBTkdFCQkJCTB4MDgyNyAgICAgIC8vU3VwcGxpZXIgcmFuZ2Ugb2YgZHJpdmVyIC0gdXRpbGl0eSBJL0YKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSQkJCTB4MDgyOCAgICAgIC8vKEFjY2VwdGFibGUpIEFjdG9yIHJhbmdlIGZvciBQcmltYXJ5IEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBCQkJMHgwODI5ICAgICAgLy8oQWNjZXB0YWJsZSkgQWN0b3IgcmFuZ2UgZm9yIFN0YXRpb24gRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19IU0kgCQkJMHgwODJBICAgICAgLy8oQWNjZXB0YWJsZSkgQWN0b3IgcmFuZ2UgZm9yIEgvVyAtIGRyaXZlciBJL0YKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRgkJCTB4MDgyQgkJLy8oQWNjZXB0YWJsZSkgQWN0b3IgcmFuZ2UgZm9yIEFQIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2RlZmluZSBDRkdfSENGX09QVAkJCQkJCTB4MDgyQwkJLy9IQ0YgKENvbXBpbGUgdGltZSkgb3B0aW9ucworI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQKKworI2RlZmluZSBDRkdfUkVHX01CCQkJCQkJMHgwODMwCQkvL1JlZ2lzdGVyIE1haWwgQm94CisjZGVmaW5lIENGR19NQl9BU1NFUlQJCQkJCTB4MDgzMQkJLy9Bc3NlcnQgaW5mb3JtYXRpb24KKyNkZWZpbmUgQ0ZHX1JFR19BU1NFUlRfUlROUAkJCQkweDA4MzIJCS8vKGRlLSlyZWdpc3RlciBNU0YgQXNzZXJ0IENhbGxiYWNrIHJvdXRpbmUKKyNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX0lORk9fTE9HCisjZGVmaW5lIENGR19SRUdfSU5GT19MT0cJCQkJMHgwODM5CQkvLyhkZS0pcmVnaXN0ZXIgSW5mbyBmcmFtZXMgdG8gTG9nCisjZW5kaWYgLy8gSENGX0lORk9fTE9HCisjZGVmaW5lIENGR19DTlRMX09QVAkJCQkJMHgwODNBCQkvL0NvbnRyb2wgb3B0aW9ucworCisjZGVmaW5lIENGR19QUk9HCQkJCQkJMHgwODU3CQkvL1Byb2dyYW0gTklDIG1lbW9yeQorI2RlZmluZSAJQ0ZHX1BST0dfU1RPUAkJCQkJMHgwMDAwCisjZGVmaW5lIAlDRkdfUFJPR19WT0xBVElMRQkJCQkweDAxMDAKKy8vI2RlZmluZSAJQ0ZHX1BST0dfRkxBU0gJCQkJCTB4MDMwMAkJLy9yZXN0b3JlIGlmIEgtSUkgbm9uLXZvbGF0aWxlIGlzIGludHJvZHVjZWQKKy8vI2RlZmluZSAJQ0ZHX1BST0dfU0VFUFJPTQkJCQkweDEzMDAJCS8vcmVzdG9yZSBpZiBILUlJIG5vbi12b2xhdGlsZSBpcyBpbnRyb2R1Y2VkCisjZGVmaW5lIAlDRkdfUFJPR19TRUVQUk9NX1JFQURCQUNLIAkJMHgwNDAwCisKKyNkZWZpbmUgQ0ZHX0ZXX1BSSU5URiAgICAgICAgICAgICAgICAgICAgICAgMHgwODU4ICAgICAgLy9SZWxhdGVkIHRvIGZpcm13YXJlIGRlYnVnIHByaW50ZiBmdW5jdGlvbmFsaXR5CisjZGVmaW5lIENGR19GV19QUklOVEZfQlVGRkVSX0xPQ0FUSU9OICAgICAgIDB4MDg1OSAgICAgIC8vQWxzbyByZWxhdGVkIHRvIGZpcm13YXJlIGRlYnVnIHByaW50ZiBmdW5jdGlvbmFsaXR5CisKKyNkZWZpbmUgQ0ZHX0NNRF9OSUMJCQkJCQkweDA4NjAJCS8vSGVybWVzIEVuZ2luZWVyaW5nIGNvbW1hbmQKKyNkZWZpbmUgQ0ZHX0NNRF9IQ0YJCQkJCQkweDA4NjMJCS8vSENGIEVuZ2luZWVyaW5nIGNvbW1hbmQKKyNkZWZpbmUgCUNGR19DTURfSENGX1JFR19BQ0NFU1MJCQkweDAwMDAJLy9EaXJlY3QgcmVnaXN0ZXIgYWNjZXNzCisjZGVmaW5lIAlDRkdfQ01EX0hDRl9SWF9NT04JCQkJMHgwMDAxCS8vUngtbW9uaXRvcgorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBNU0YgRGVmaW5lZCBSRUNPUkRTCT09PT09PT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIENGR19FTkNSWVBUX1NUUklORwkJCQkweDA5MDAJCS8vdHJhbnNmZXIgZW5jcnlwdGlvbiBpbmZvIGZyb20gQ1BMIHRvIE1TRgorI2RlZmluZSBDRkdfQVBfTU9ERQkJCQkJCTB4MDkwMQkJLy9jb250cm9sIG1vZGUgb2YgU1RBUCBkcml2ZXIgZnJvbSBDUEwKKyNkZWZpbmUgQ0ZHX0RSSVZFUl9FTkFCTEUJCQkJMHgwOTAyCQkvL2V4dGVuZCZleHBvcnQgRW4tL0Rpc2FibGUgZmFjaWxpdHkgdG8gVXRpbGl0eQorI2RlZmluZSBDRkdfUENJX0NPTU1BTkQJCQkJCTB4MDkwMwkJLy9QQ0kgYWRhcHRlciAoT29pZXZhYXIpIHN0cnVjdHVyZQorI2RlZmluZSBDRkdfV09MQVNfRU5BQkxFCQkJCTB4MDkwNAkJLy9leHRlbmQmZXhwb3J0IEVuLS9EaXNhYmxlIFdPTEFTIGZhY2lsaXR5IHRvIFV0aWxpdHkKKyNkZWZpbmUgQ0ZHX0NPVU5UUllfU1RSSU5HCQkJCTB4MDkwNQkJLy90cmFuc2ZlciBDb3VudHJ5SW5mbyBpbmZvIGZyb20gQ1BMIHRvIE1TRgorI2RlZmluZSBDRkdfRldfRFVNUAkJCQkJCTB4MDkwNgkJLy90cmFuc2ZlciBuaWMgbWVtb3J5IHRvIHV0aWxpdHkKKyNkZWZpbmUgQ0ZHX1BPV0VSX01PREUJCQkJCTB4MDkwNwkJLy9jb250cm9scyB0aGUgUE0gbW9kZSBvZiB0aGUgY2FyZAorI2RlZmluZSBDRkdfQ09OTkVDVElPTl9NT0RFCQkJCTB4MDkwOAkJLy9jb250cm9scyB0aGUgbW9kZSBvZiB0aGUgRlcgKEVTUy9BUC9JQlNTL0FESE9DKQorI2RlZmluZSBDRkdfSUZCCQkJCQkJCTB4MDkwOQkJLy9ieXRlIHdpc2UgY29weSBvZiBJRkIKKyNkZWZpbmUgQ0ZHX01TRl9UQUxMSUVTCQkJCQkweDA5MEEJCS8vTVNGIHRhbGxpZXMgKGludCdzLCByeCBhbmQgdHgpCisjZGVmaW5lIENGR19DVVJSRU5UX0xJTktfU1RBVFVTCQkJMHgwOTBCCQkvL0xhdGVzdCBsaW5rIHN0YXR1cyBnb3QgdHJvdWdoIDB4RjIwMCBMaW5rRXZlbnQKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSU5GT1JNQVRJT04gRlJBTUVTID09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBDRkdfSU5GT19GUkFNRV9NSU4JCQkJMHhGMDAwCQkvL2xvd2VzdCB2YWx1ZSByZXByZXNlbnRpbmcgYW4gSW5mb3JtYXRpbyBGcmFtZQorCisjZGVmaW5lIENGR19UQUxMSUVTCQkJCQkJMHhGMTAwCQkvL0NvbW11bmljYXRpb25zIFRhbGxpZXMKKyNkZWZpbmUgQ0ZHX1NDQU4JCQkJCQkweEYxMDEJCS8vU2NhbiByZXN1bHRzCisjZGVmaW5lIENGR19QUlNfU0NBTgkJCQkJMHhGMTAyCQkvL1Byb2JlIFJlc3BvbnNlIFNjYW4gcmVzdWx0cworCisjZGVmaW5lIENGR19MSU5LX1NUQVQgCQkJCQkweEYyMDAJCS8vTGluayBTdGF0dXMKKwkvKiAxIHRocm91Z2ggNSBhcmUgRi9XIGRlZmluZWQgdmFsdWVzLCBwcm9kdWNlZCBieSBDRkdfTElOS19TVEFUIGZyYW1lCisJICogMSB0aHJvdWdoIDUgYXJlIHNoYXJlZCBieSBDRkdfTElOS19TVEFULCBJRkJfTGlua1N0YXQgYW5kIElGQl9EU0xpbmtTdGF0CisJICogMSBwbGF5cyBhIGRvdWJsZSByb2xlIGFzIENGR19MSU5LX1NUQVRfQ09OTkVDVEVEIGFuZCBhcyBiaXQgcmVmbGVjdGluZzoKKwkgKgkgLSBjb25uZWN0ZWQ6IE9OCisJICoJIC0gZGlzY29ubmVjdGVkOiBPRkYKKwkgKi8KKyNkZWZpbmUgCUNGR19MSU5LX1NUQVRfQ09OTkVDVEVECQkJMHgwMDAxCisjZGVmaW5lIAlDRkdfTElOS19TVEFUX0RJU0NPTk5FQ1RFRAkJMHgwMDAyCisjZGVmaW5lIAlDRkdfTElOS19TVEFUX0FQX0NIQU5HRQkJCTB4MDAwMworI2RlZmluZSAJQ0ZHX0xJTktfU1RBVF9BUF9PT1IJCQkweDAwMDQKKyNkZWZpbmUgCUNGR19MSU5LX1NUQVRfQVBfSVIJCQkJMHgwMDA1CisjZGVmaW5lIAlDRkdfTElOS19TVEFUX0ZXCQkJCTB4MDAwRgkvL21hc2sgdG8gaXNvbGF0ZSBGL1cgZGVmaW5lZCBiaXRzCisvLyNkZWZpbmUgCUNGR19MSU5LX1NUQVRfVElNRVIJCQkJMHgwRkYwCS8vbWFzayB0byBpc29sYXRlIE9PUiB0aW1lcgorLy8jZGVmaW5lIAlDRkdfTElOS19TVEFUX0RTX09PUgkJCTB4MjAwMAkvLzIwMDAgYW5kIHVwIGFyZSBJRkJfTGlua1N0YXQgc3BlY2lmaWMKKy8vI2RlZmluZSAJQ0ZHX0xJTktfU1RBVF9EU19JUgkJCQkweDQwMDAKKyNkZWZpbmUgCUNGR19MSU5LX1NUQVRfQ0hBTkdFCQkJMHg4MDAwCisjZGVmaW5lIENGR19BU1NPQ19TVEFUCQkJCQkweEYyMDEJCS8vQXNzb2NpYXRpb24gU3RhdHVzCisjZGVmaW5lIENGR19TRUNVUklUWV9TVEFUCQkJCTB4RjIwMgkJLy9TZWN1cml0eSBTdGF0dXMKKyNkZWZpbmUgQ0ZHX1VQREFURURfSU5GT19SRUNPUkQJCQkweEYyMDQJCS8vVXBkYXRlZCBJbmZvIFJlY29yZAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDT05GSUdVUkFUSU9OIFJFQ09SRFMgPT09PT09PT09PT09PT09PT09PT09PSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUyBUIFIgVSBDIFQgVSBSIEUgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy9RdWljayZEaXJ0eSB0byBnZXQgZG93bmxvYWQgZm9yIERPUyBPREkgSGVybWVzLUlJIHJ1bm5pbmcgdHlwZWRlZiBMVFZfU1RSQ1QgRkFSICoJTFRWUDsKK3R5cGVkZWYgTFRWX1NUUkNUIEZBUiAqCUxUVlA7ICAgLy8gaS5zLm8gI2RlZmluZSBMVFZQIExUVl9TVFJDVCBGQVIgKgorCisjaWYgZGVmaW5lZCBXVkxBTl80MiB8fCBkZWZpbmVkIFdWTEFOXzQzIC8vOz9rZWVwdXAgd2l0aCBsZWdhY3kgYSBsaXR0bGUgd2hpbGUgbG9uZ2VyICg0YXVnMjAwMykKK3R5cGVkZWYgc3RydWN0IERVSV9TVFJDVCB7CQkJLyogImxlZ2FjeSIsIHN0aWxsIHVzZWQgYnkgV1ZMQU40Mi80MywgTkRJUyBkcml2ZXJzIHVzZSBXTEFQSQkJCSovCisJdm9pZCAgRkFSCSppZmJwOwkJCQkvKiBQb2ludGVyIHRvIElGQgorCQkJCQkJCQkJICoJcmV0dXJuZWQgZnJvbSBNU0YgdG8gVVNGIGJ5IHVpbF9jb25uZWN0CisJCQkJIAkJCQkJICoJcGFzc2VkIGZyb20gVVNGIHRvIE1TRiBhcyBhICJtYWdpYyBjb29raWUiIGJ5IGFsbCBvdGhlciBVSUwgZnVuY3Rpb24gY2FsbHMKKwkJCQkgCQkJCQkgKi8KKwloY2ZfMTYJCXN0YXQ7CQkJCS8vIHN0YXR1cyByZXR1cm5lZCBmcm9tIE1TRiB0byBVU0YKKwloY2ZfMTYJCWZ1bjsJCQkJLy8gY29tbWFuZCBjb2RlIGZyb20gVVNGIHRvIE1TRgorCUxUVl9TVFJDVAlsdHY7CQkJCS8qIExUViBzdHJ1Y3R1cmUKKwkJCSAJCQkJCQkgKioqIGR1cmluZyB1aWxfcHV0X2luZm86CisJCQkJCQkgCQkJICoJICB0aGUgTCwgVCBhbmQgVi1maWVsZHMgY2FycnkgaW5mb3JtYXRpb24gZnJvbSBVU0YgdG8gTVNGCisJCQkJCQkJCQkgKioqIGR1cmluZyB1aWxfZ2V0X2luZm86CisJCQkJCQkJCQkgKgkgIHRoZSBMIGFuZCBUIGZpZWxkcyBjYXJyeSBpbmZvcm1hdGlvbiBmcm9tIFVTRiB0byBNU0YKKwkJCQkJCQkJCSAqCSAgdGhlIEwgYW5kIFYtZmllbGRzIGNhcnJ5IGluZm9ybWF0aW9uIGZyb20gTVNGIHRvIFVTRgorCQkJIAkJCQkJCSAqLworfSBEVUlfU1RSQ1Q7Cit0eXBlZGVmIERVSV9TVFJDVCBGQVIgKglEVUlQOworI2VuZGlmIC8vZGVmaW5lZCBXVkxBTl80MiB8fCBkZWZpbmVkIFdWTEFOXzQzIC8vOz9rZWVwdXAgd2l0aCBsZWdhY3kgYSBsaWl0bGUgd2hpbGUgbG9uZ2VyICg0YXVnMjAwMykKKworCit0eXBlZGVmIHN0cnVjdCBDRkdfQ01EX05JQ19TVFJDVCB7CS8vIENGR19DTURfTklDICgweDA4NjApCQlIZXJtZXMgRW5naW5lZXJpbmcgY29tbWFuZAorCWhjZl8xNglsZW47CQkJCQkvL2RlZmF1bHQgbGVuZ3RoIG9mIFJJRAorCWhjZl8xNgl0eXA7CQkJCQkvL1JJRCBpZGVudGlmaWNhdGlvbiBhcyBkZWZpbmVkIGJ5IEhlcm1lcworCWhjZl8xNgljbWQ7CQkJCQkvL0NvbW1hbmQgY29kZSAoMHgwMDNGKSBhbmQgY29udHJvbCBiaXRzICgweEZGQzApCisJaGNmXzE2CXBhcm0wOwkJCQkJLy9wYXJhbWV0ZXJzIGZvciBIZXJtZXMgUGFyYW0wIHJlZ2lzdGVyCisJaGNmXzE2CXBhcm0xOwkJCQkJLy9wYXJhbWV0ZXJzIGZvciBIZXJtZXMgUGFyYW0xIHJlZ2lzdGVyCisJaGNmXzE2CXBhcm0yOwkJCQkJLy9wYXJhbWV0ZXJzIGZvciBIZXJtZXMgUGFyYW0yIHJlZ2lzdGVyCisJaGNmXzE2CXN0YXQ7CQkJCQkvL3Jlc3VsdCBjb2RlIGZyb20gSGVybWVzIFN0YXR1cyByZWdpc3RlcgorCWhjZl8xNglyZXNwMDsJCQkJCS8vcmVzcG9uc2VzIGZyb20gSGVybWVzIFJlc3AwIHJlZ2lzdGVyCisJaGNmXzE2CXJlc3AxOwkJCQkJLy9yZXNwb25zZXMgZnJvbSBIZXJtZXMgUmVzcDEgcmVnaXN0ZXIKKwloY2ZfMTYJcmVzcDI7CQkJCQkvL3Jlc3BvbnNlcyBmcm9tIEhlcm1lcyBSZXNwMiByZWdpc3RlcgorCWhjZl8xNgloY2Zfc3RhdDsJCQkJLy9yZXN1bHQgY29kZSBmcm9tIGNtZF9leGUgcm91dGluZQorCWhjZl8xNglpZmJfZXJyX2NtZDsJCQkvL0lGQl9FcnJDbWQKKwloY2ZfMTYJaWZiX2Vycl9xdWFsaWZpZXI7CQkvL0lGQl9FcnJRdWFsaWZpZXIKK30gQ0ZHX0NNRF9OSUNfU1RSQ1Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgQ0ZHX0RSVl9JTkZPX1NUUkNUIHsJCS8vQ0ZHX0RSVl9JTkZPICgweDA4MjUpIGRyaXZlciBpbmZvcm1hdGlvbgorCWhjZl8xNglsZW47CQkJCQkvL2RlZmF1bHQgbGVuZ3RoIG9mIFJJRAorCWhjZl8xNgl0eXA7CQkJCQkvL1JJRCBpZGVudGlmaWNhdGlvbiBhcyBkZWZpbmVkIGJ5IEhlcm1lcworCWhjZl84CWRyaXZlcl9uYW1lWzhdOwkJCS8vRHJpdmVyIG5hbWUsIDggYnl0ZXMsIHJpZ2h0IHplcm8gcGFkZGVkCisJaGNmXzE2CWRyaXZlcl92ZXJzaW9uOwkJCS8vQkNEIDIgZGlnaXQgbWFqb3IgYW5kIDIgZGlnaXQgbWlub3IgZHJpdmVyIHZlcnNpb24KKwloY2ZfMTYJSENGX3ZlcnNpb247ICAgCQkJLy9CQ0QgMiBkaWdpdCBtYWpvciBhbmQgMiBkaWdpdCBtaW5vciBIQ0YgdmVyc2lvbgorCWhjZl8xNglkcml2ZXJfc3RhdDsJCQkvLworCWhjZl8xNglJT19hZGRyZXNzOwkJCQkvL2Jhc2UgSU8gYWRkcmVzcyB1c2VkIGJ5IE5JQworCWhjZl8xNglJT19yYW5nZTsJCQkJLy9yYW5nZSBvZiBJTyBhZGRyZXNzZXMgdXNlZCBieSBOSUMKKwloY2ZfMTYJSVJRX251bWJlcjsJCQkJLy9JbnRlcnJ1cHQgdXNlZCBieSBOSUMKKwloY2ZfMTYJY2FyZF9zdGF0OwkJCQkvKk5JQyBzdGF0dXMKKwkJCQkJCQkJCUAqCTB4ODAwMAlDYXJkIHByZXNlbnQKKwkJCQkJCQkJCUAqCTB4NDAwMAlDYXJkIEVuYWJsZWQKKwkJCQkJCQkJCUAqCTB4MjAwMAlEcml2ZXIgaW5jb21wYXRpYmxlIHdpdGggTklDIFByaW1hcnkgRnVuY3Rpb25zCisJCQkJCQkJCQlAKgkweDEwMDAJRHJpdmVyIGluY29tcGF0aWJsZSB3aXRoIE5JQyBTdGF0aW9uIEZ1bmN0aW9ucwkJCQkqLworCWhjZl8xNglmcmFtZV90eXBlOwkJCQkvKkZyYW1lIHR5cGUKKwkJCQkJCQkJCUAqCTB4MDAwCTgwMi4zCisJCQkJCQkJCQlAKgkweDAwOAk4MDIuMTEJCQkJCQkJCQkJCQkJCSovCisJaGNmXzMyCWRydl9pbmZvOwkJCQkvKmRyaXZlciBzcGVjaWZpYyBpbmZvCisJCQkJCQkJCQkgKiBDRTogdmlydHVhbCBJL08gYmFzZQkJCQkJCQkJCQkJCQkqLworfUNGR19EUlZfSU5GT19TVFJDVDsKKworI2RlZmluZSBDT01QX0lEX0ZXX1BSSQkJCQkJMjEJCS8vUHJpbWFyeSBGdW5jdGlvbnMgRmlybXdhcmUKKyNkZWZpbmUgQ09NUF9JRF9GV19JTlRFUk1FRElBVEUJCQkyMgkJLy9JbnRlcm1lZGlhdGUgRnVuY3Rpb25zIEZpcm13YXJlCisjZGVmaW5lIENPTVBfSURfRldfU1RBCQkJCQkzMQkJLy9TdGF0aW9uIEZ1bmN0aW9ucyBGaXJtd2FyZQorI2RlZmluZSBDT01QX0lEX0ZXX0FQCQkJCQkzMgkJLy9BUCBGdW5jdGlvbnMgRmlybXdhcmUKKyNkZWZpbmUgQ09NUF9JRF9GV19BUF9GQUtFCQkJICAgMzMxCQkvL0FQIEZ1bmN0aW9ucyBGaXJtd2FyZQorCisjZGVmaW5lIENPTVBfSURfTUlOSVBPUlRfTkRJU18zMQkJNDEJCS8vV2luZG93cyA5eC9OVCBNaW5pcG9ydCBORElTIDMuMQorI2RlZmluZSBDT01QX0lEX1BBQ0tFVAkJCQkJNDIJCS8vUGFja2V0CisjZGVmaW5lIENPTVBfSURfT0RJXzE2CQkJCQk0MwkJLy9ET1MgT0RJCisjZGVmaW5lIENPTVBfSURfT0RJXzMyCQkJCQk0NAkJLy8zMi1iaXRzIE9ESQorI2RlZmluZSBDT01QX0lEX01BQ19PUwkJCQkJNDUJCS8vTWFjaW50b3NoIE9TCisjZGVmaW5lIENPTVBfSURfV0lOX0NFCQkJCQk0NgkJLy9XaW5kb3dzIENFIE1pbmlwb3J0CisvLyNkZWZpbmUgQ09NUF9JRF9MSU5VWF9QRAkJCQk0NwkJLy9MaW51eCwgSENGLWxpZ2h0IGJhc2VkLCBNU0Ygc291cmNlIGNvZGUgaW4gUHVibGljIERvbWFpbgorI2RlZmluZSBDT01QX0lEX01JTklQT1JUX05ESVNfNTAJCTQ4CQkvL1dpbmRvd3MgOXgvTlQgTWluaXBvcnQgTkRJUyA1LjAKKyNkZWZpbmUgQ09NUF9JRF9MSU5VWAkJCQkJNDkJCS8qTGludXgsIEdQTCdlZCBIQ0YgYmFzZWQsIGZ1bGwgc291cmNlIGNvZGUgaW4gUHVibGljIERvbWFpbgorCQkJCQkJCQkJCSAgCQkgKnRoYW5rcyB0byBBbmRyZWFzIE5ldWhhdXMJCQkJCQkJCSovCisjZGVmaW5lIENPTVBfSURfUU5YCQkJCQkJNTAJCS8vUU5YCisjZGVmaW5lIENPTVBfSURfTUlOSVBPUlRfTkRJU181MF9VU0IJNTEJCS8vV2luZG93cyA5eC9OVCBNaW5pcG9ydCBORElTIDQuMAorI2RlZmluZSBDT01QX0lEX01JTklQT1JUX05ESVNfNDAJCTUyCQkvL1dpbmRvd3MgOXgvTlQgTWluaXBvcnQgTkRJUyA0LjAKKyNkZWZpbmUgQ09NUF9JRF9WWF9XT1JLU19FTkRTVEEJCQk1MwkJLy8gVnhXb3JrcyBFTkQgU3RhdGlvbiBkcml2ZXIKKyNkZWZpbmUgQ09NUF9JRF9WWF9XT1JLU19FTkRBUAkJCTU0CQkvLyBWeFdvcmtzIEVORCBBY2Nlc3MgUG9pbnQgZHJpdmVyCisvLzs/I2RlZmluZSBDT01QX0lEX01BQ19PU18/Pz8/CQkJNTUJCS8vOz9jaGVjayB3aXRoIEhNCisjZGVmaW5lIENPTVBfSURfVlhfV09SS1NfRU5ECQkJNTYJCS8vIFZ4V29ya3MgRU5EIFN0YXRpb24vQWNjZXNzIFBvaW50IGRyaXZlcgorLy8JCQkJCQkJCQkJNTcJCS8vTnVjbGV1c09TQEFSTSBEcml2ZXIuCisjZGVmaW5lIENPTVBfSURfV1NVCQkJCQkJNjMJCS8qIFdhdmVMQU4gU3RhdGlvbiBGaXJtd2FyZSBVcGRhdGUgdXRpbGl0eQorCQkJCQkJCQkJCQkJICoJdmFyaWFudCAxOiBXaW5kb3dzCisJCQkJCQkJCQkJCQkgKgl2YXJpYW50IDI6IERPUworCQkJCQkJCQkJCQkJICovCisjZGVmaW5lIENPTVBfSURfQVAxCQkJCQkJODEJCS8vV2F2ZUxBTi9JRUVFIEFQCisjZGVmaW5lIENPTVBfSURfRUMJCQkJCQk4MwkJLy9XYXZlTEFOL0lFRUUgRXRoZXJuZXQgQ29udmVydGVyCisjZGVmaW5lIENPTVBfSURfVUJMCQkJCQkJODcJCS8vVVNCIEJvb3QgTG9hZGVyCisKKyNkZWZpbmUgQ09NUF9ST0xFX1NVUEwJCQkJCTB4MDAJLy9zdXBwbGllcgorI2RlZmluZSBDT01QX1JPTEVfQUNUCQkJCQkweDAxCS8vYWN0b3IKKworCQkJCQkJCQkJCQkJLy9TdXBwbGllcgkJCSAgLSBhY3RvcgorI2RlZmluZSBDT01QX0lEX01GSQkJCQkJCTB4MDEJLy9Nb2RlbQkJIAkJICAtIEZpcm13YXJlCUkvRgorI2RlZmluZSBDT01QX0lEX0NGSQkJCQkJCTB4MDIJLy9Db250cm9sbGVyCQkgIC0gRmlybXdhcmUJSS9GCisjZGVmaW5lIENPTVBfSURfUFJJCQkJCQkJMHgwMwkvL1ByaW1hcnkgRmlybXdhcmUJICAtIERyaXZlcgkJSS9GCisjZGVmaW5lIENPTVBfSURfU1RBCQkJCQkJMHgwNAkvL1N0YXRpb24gRmlybXdhcmUJICAtIERyaXZlcgkJSS9GCisjZGVmaW5lIENPTVBfSURfRFVJCQkJCQkJMHgwNQkvL0RyaXZlcgkJCSAgLSBVdGlsaXR5CQlJL0YKKyNkZWZpbmUgQ09NUF9JRF9IU0kJCQkJCQkweDA2CS8vSC9XICAgICAgICAgICAgICAgICAtIERyaXZlcgkJSS9GCisjZGVmaW5lIENPTVBfSURfREFJCQkJCQkJMHgwNwkvL0FQSSAgICAgICAgICAgICAgICAgLSBEcml2ZXIJCUkvRgorI2RlZmluZSBDT01QX0lEX0FQRgkJCQkJCTB4MDgJLy9IL1cgICAgICAgICAgICAgICAgIC0gRHJpdmVyCQlJL0YKKyNkZWZpbmUgQ09NUF9JRF9JTlQJCQkJCQkweDA5CS8vSW50ZXJtZWRpYXRlIEZXICAgICAtIERyaXZlcgkJSS9GCisKKyNpZmRlZiBIQ0ZfTEVHQUNZCisjZGVmaW5lIEhDRl9BQ1RfQUNTX1NDQU4JCQkJSENGX0FDVF9QUlNfU0NBTgorI2RlZmluZSBVSUxfQUNUX0FDU19TQ0FOIAkJCQlVSUxfQUNUX1BSU19TQ0FOCisjZGVmaW5lIE1ERF9BQ1RfQUNTX1NDQU4JIAkJCU1ERF9BQ1RfUFJTX1NDQU4KKyNkZWZpbmUgQ0ZHX0FDU19TQ0FOCQkJCQlDRkdfUFJTX1NDQU4KKyNlbmRpZiAvLyBIQ0ZfTEVHQUNZCisKKyNlbmRpZiAvLyBNRERfSAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9tbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL21tZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMTM4YzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9tbWQuYwpAQCAtMCwwICsxLDI1MSBAQAorCisvLyAgIHZpbTp0dz0xMTA6dHM9NDoKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRklMRQkgIDogbW1kLmMKKyoKKyogREFURSAgICA6ICREYXRlOiAyMDA0LzA3LzIzIDExOjU3OjQ1ICQgICAkUmV2aXNpb246IDEuNCAkCisqIE9yaWdpbmFsOiAyMDA0LzA1LzI4IDE0OjA1OjM1ICAgIFJldmlzaW9uOiAxLjMyICAgICAgVGFnOiBoY2Y3X3QyMDA0MDYwMl8wMQorKiBPcmlnaW5hbDogMjAwNC8wNS8xMyAxNTozMTo0NSAgICBSZXZpc2lvbjogMS4zMCAgICAgIFRhZzogaGNmN190N18yMDA0MDUxM18wMQorKiBPcmlnaW5hbDogMjAwNC8wNC8xNSAwOToyNDo0MiAgICBSZXZpc2lvbjogMS4yNSAgICAgIFRhZzogaGNmN190N18yMDA0MDQxNV8wMQorKiBPcmlnaW5hbDogMjAwNC8wNC8wOCAxNToxODoxNyAgICBSZXZpc2lvbjogMS4yNCAgICAgIFRhZzogdDdfMjAwNDA0MTNfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDQvMDEgMTU6MzI6NTUgICAgUmV2aXNpb246IDEuMjIgICAgICBUYWc6IHQ3XzIwMDQwNDAxXzAxCisqIE9yaWdpbmFsOiAyMDA0LzAzLzEwIDE1OjM5OjI4ICAgIFJldmlzaW9uOiAxLjE4ICAgICAgVGFnOiB0MjAwNDAzMTBfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDMvMDMgMTQ6MTA6MTIgICAgUmV2aXNpb246IDEuMTYgICAgICBUYWc6IHQyMDA0MDMwNF8wMQorKiBPcmlnaW5hbDogMjAwNC8wMy8wMiAwOToyNzoxMiAgICBSZXZpc2lvbjogMS4xNCAgICAgIFRhZzogdDIwMDQwMzAyXzAzCisqIE9yaWdpbmFsOiAyMDA0LzAyLzI0IDEzOjAwOjI5ICAgIFJldmlzaW9uOiAxLjEyICAgICAgVGFnOiB0MjAwNDAyMjRfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDEvMzAgMDk6NTk6MzMgICAgUmV2aXNpb246IDEuMTEgICAgICBUYWc6IHQyMDA0MDIxOV8wMQorKgorKiBBVVRIT1IgIDogTmljbyBWYWxzdGVyCisqCisqIERFU0MgICAgOiBDb21tb24gcm91dGluZXMgZm9yIEhDRiwgTVNGLCBVSUwgYXMgd2VsbCBhcyBVU0Ygc291cmNlcworKgorKiBOb3RlOiByZWxhdGl2ZSB0byBBc3NlcnRzLCB0aGUgZm9sbG93aW5nIGNhbiBiZSBvYnNlcnZlZDoKKyoJU2luY2UgdGhlIElGQiBpcyBub3Qga25vd24gaW5zaWRlIHRoZSByb3V0aW5lLCB0aGUgbWFjcm8gSENGQVNTRVJUIGlzIHJlcGxhY2VkIHdpdGggTUREQVNTRVJULgorKglBbHNvIHRoZSBsaW5lIG51bWJlciByZXBvcnRlZCBpbiB0aGUgYXNzZXJ0IGlzIHJhaXNlZCBieSBGSUxFX05BTUVfT0ZGU0VUICgyMDAwMCkgdG8gZGlzY3JpbWluYXRlIHRoZQorKglNTUQgQXNzZXJ0cyBmcm9tIEhDRiBhbmQgREhGIGFzc2VydHMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoKKyogU09GVFdBUkUgTElDRU5TRQorKgorKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyoKKyogQ09QWVJJR0hUIKkgMjAwMSAtIDIwMDQJYnkgQWdlcmUgU3lzdGVtcyBJbmMuCUFsbCBSaWdodHMgUmVzZXJ2ZWQKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorKgorKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyogICAgZGlzdHJpYnV0aW9uLgorKgorKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyoKKyogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorKgorKiBEaXNjbGFpbWVyCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyogREFNQUdFLgorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJoY2YuaCIJCQkJLy8gTmVlZGVkIGFzIGxvbmcgYXMgd2UgZG8gbm90IHJlYWxseSBzb3J0IG91dCB0aGUgbWVzcworI2luY2x1ZGUgImhjZmRlZi5oIgkJCQkvLyBnZXQgQ05WX0xJVFRMRV9UT19TSE9SVAorI2luY2x1ZGUgIm1tZC5oIgkJCQkvLyBNb3JlTW9kdWxhckRyaXZlciBjb21tb24gaW5jbHVkZSBmaWxlCisKKy8vdG8gZGlzdGluZ3Vpc2ggREhGIGZyb20gSENGIGFzc2VydHMgYnkgbWVhbnMgb2YgbGluZSBudW1iZXIKKyN1bmRlZglGSUxFX05BTUVfT0ZGU0VUCisjZGVmaW5lIEZJTEVfTkFNRV9PRkZTRVQgREhGX0ZJTEVfTkFNRV9PRkZTRVQKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5NT0RVTEUJCUNGR19SQU5HRV9TUEVDX1NUUkNUKiBtbWRfY2hlY2tfY29tcCggQ0ZHX1JBTkdFU19TVFJDVCAqYWN0cCwgQ0ZHX1NVUF9SQU5HRV9TVFJDVCAqc3VwcCApCisqLlBVUlBPU0UJCUNoZWNrcyBjb21wYXRpYmlsaXR5IGJldHdlZW4gYW4gYWN0b3IgYW5kIGEgc3VwcGxpZXIuCisqCisqLkFSR1VNRU5UUworKglhY3RwCisqCXN1cHAKKyoKKyouUkVUVVJOUworKglOVUxMCWluY29tcGF0aWJsZQorKgk8Pk5VTEwJcG9pbnRlciB0byBtYXRjaGluZyBDRkdfUkFOR0VfU1BFQ19TVFJDVCBzdWJzdHJ1Y3R1cmUgaW4gYWN0b3Itc3RydWN0dXJlIG1hdGNoaW5nIHRoZSBzdXBwbGllcgorKgorKi5OQVJSQVRJVkUKKyoKKyogIFBhcmFtZXRlcnM6CisqCWFjdHAJYWRkcmVzcyBvZiB0aGUgYWN0b3Igc3BlY2lmaWNhdGlvbgorKglzdXBwCWFkZHJlc3Mgb2YgdGhlIHN1cHBsaWVyIHNwZWNpZmljYXRpb24KKyoKKyoJRGVzY3JpcHRpb246IG1tZF9jaGVja19jb21wIGlzIGEgc3VwcG9ydCByb3V0aW5lIHRvIGNoZWNrIHRoZSBjb21wYXRpYmlsaXR5IGJldHdlZW4gYW4gYWN0b3IgYW5kIGEKKyoJc3VwcGxpZXIuICBtbWRfY2hlY2tfY29tcCBpcyBpbmRlcGVuZGVudCBvZiB0aGUgZW5kaWFuZXNzIG9mIHRoZSBhY3RwIGFuZCBzdXBwIHN0cnVjdHVyZXMuIFRoaXMgaXMKKyoJYWNoaWV2ZWQgYnkgY2hlY2tpbmcgdGhlICJib3R0b20iIG9yICJyb2xlIiBmaWVsZHMgb2YgdGhlc2Ugc3RydWN0dXJlcy4gU2luY2UgdGhlc2UgZmllbGRzIGFyZSByZXN0cmljdGVkCisqCXRvIGEgbGltaXRlZCByYW5nZSwgY29tcGFyaW5nIHRoZSBjb250ZW50cyB0byBhIHZhbHVlIHdpdGggYSBrbm93biBlbmRpYW4tZXNzIGdpdmVzIGEgY2x1ZSB0byB0aGVpciBhY3R1YWwKKyoJZW5kaWFuZXNzLgorKgorKi5ESUFHUkFNCisqMWE6IFRoZSByb2xlLWZpZWxkIG9mIHRoZSBhY3RvciBzdHJ1Y3R1cmUgaGFzIGEga25vd24gbm9uLXplcm8sIG5vdCAiYnl0ZSBzeW1tZXRyaWMiIHZhbHVlIChuYW1lbHkKKyoJQ09NUF9ST0xFX0FDVCBvciAweDAwMDEpLCBzbyBpZiBhbmQgb25seSB0aGUgY29udGVudHMgb2YgdGhpcyBmaWVsZCBtYXRjaGVzIENPTVBfUk9MRV9BQ1QgKGluIE5hdGl2ZQorKglFbmRpYW4gZm9ybWF0KSwgdGhlIGFjdG9yIHN0cnVjdHVyZSBpcyBOYXRpdmUgRW5kaWFuLgorKjJhOiBTaW5jZSB0aGUgcm9sZS1maWVsZCBvZiB0aGUgc3VwcGxpZXIgc3RydWN0dXJlIGlzIDB4MDAwMCwgdGhlIHRlc3QgYXMgdXNlZCBmb3IgdGhlIGFjdG9yIGRvZXMgbm90IHdvcmsKKyoJZm9yIGEgc3VwcGxpZXIuIEEgc3VwcGxpZXIgaGFzIGFsd2F5cyBleGFjdGx5IDEgdmFyaWFudCx0b3AsYm90dG9tIHJlY29yZCB3aXRoIChvZmZpY2lhbGx5LCBidXQgc2VlIHRoZQorKglub3RlIGJlbG93KSBlYWNoIG9mIHRoZXNlIDMgdmFsdWVzIGluIHRoZSByYW5nZSAxIHRocm91Z2ggOTksIHNvIG9uZSBieXRlIG9mIHRoZSB3b3JkIHZhbHVlIG9mIHZhcmlhbnQsCisqCXRvcCBhbmQgYm90dG9tIHdvcmRzIGlzIDB4MDAgYW5kIHRoZSBvdGhlciBieXRlIGlzIG5vbi16ZXJvLiBXaGV0aGVyIHRoZSBsb3dlc3QgYWRkcmVzcyBieXRlIG9yIHRoZQorKgloaWdoZXN0IGFkZHJlc3MgYnl0ZSBpcyBub24temVybyBkZXBlbmRzIG9uIHRoZSBFbmRpYW5lc3Mgb2YgdGhlIExUVi4gSWYgYW5kIG9ubHkgaWYgdGhlIHdvcmQgdmFsdWUgb2YKKyoJYm90dG9tIGlzIGxlc3MgdGhhbiAweDAxMDAsIHRoZSBzdXBwbGllciBpcyBOYXRpdmUgRW5kaWFuLgorKglOT1RFOiB0aGUgdmFyaWFudCBmaWVsZCBvZiB0aGUgc3VwcGxpZXIgc3RydWN0dXJlIGNhbiBub3QgYmUgdXNlZCBmb3IgdGhlIEVuZGlhbiBEZXRlY3Rpb24gQWxnb3JpdGhtLAorKgliZWNhdXNlIGEgYSB6ZXJvLXZhbHVlZCB2YXJpYW50IGhhcyBiZWVuIHVzZWQgYXMgQ29udHJvbGxlZCBEZXBsb3ltZW50IGluZGljYXRpb24gaW4gdGhlIHBhc3QuCisqCU5vdGU6IEFuIGFjdG9yIG1heSBoYXZlIG11bHRpcGxlIHNldHMgb2YgdmFyaWFudCx0b3AsYm90dG9tIHJlY29yZHMsIGluY2x1ZGluZyBkdW1teSBzZXRzIHdpdGggdmFyaWFudCwKKyoJdG9wIGFuZCBib3R0b20gZmllbGRzIHdpdGggYSB6ZXJvLXZhbHVlLiBBcyBhIGNvbnNlcXVlbmNlIHRoZSBlbmRpYW5lc3Mgb2YgdGhlIGFjdG9yIGNhbiBub3QgYmUgZGV0ZXJtaW5lZAorKgliYXNlZCBvbiBpdHMgdmFyaWFudCx0b3AsYm90dG9tIHZhbHVlcy4KKyoKKyoJTm90ZTogdGhlIEwgYW5kIFQgZmllbGQgb2YgdGhlIHN0cnVjdHVyZXMgYXJlIGFsd2F5cyBpbiBOYXRpdmUgRW5kaWFuIGZvcm1hdCwgc28geW91IGNhbiBub3QgZHJhdworKgljb25jbHVzaW9ucyBjb25jZXJuaW5nIHRoZSBFbmRpYW5lc3Mgb2YgdGhlIHN0cnVjdHVyZSBiYXNlZCBvbiB0aGVzZSB0d28gZmllbGRzLgorKgorKjFiLzJiCisqCVRoZSBvbmx5IHB1cnBvc2Ugb2YgdGhlIENGR19SQU5HRV9TUEVDX0JZVEVfU1RSQ1QgaXMgdG8gZ2l2ZSBlYXN5IGFjY2VzcyB0byB0aGUgbm9uLXplcm8gYnl0ZSBvZiB0aGUgd29yZAorKgl2YWx1ZSBvZiB2YXJpYW50LCB0b3AgYW5kIGJvdHRvbS4gVGhlIHZhcmlhYmxlcyBzdXBfZW5kaWFuIGFuZCBhY3RfZW5kaWFuIGFyZSB1c2VkIGZvciB0aGUgc3VwcGxpZXIgYW5kCisqCWFjdG9yIHN0cnVjdHVyZSByZXNwZWN0aXZlbHkuIFRoZXNlIHZhcmlhYmxlcyBtdXN0IGJlIDAgd2hlbiB0aGUgc3RydWN0dXJlIGhhcyBMRSBmb3JtYXQgYW5kIDEgaWYgdGhlCisqCXN0cnVjdHVyZSBoYXMgQkUgZm9ybWF0LiBUaGlzIGNhbiBiZSBwaHJhc2VkIGFzOgorKgl0aGUgdmFyaWFibGUgaXMgZmFsc2UgKGkuZSAweDAwMDApIGlmIGVpdGhlcgorKgkJKHRoZSBwbGF0Zm9ybSBpcyBMRSBhbmQgdGhlIExUViBpcyB0aGUgc2FtZSBhcyB0aGUgcGxhdGZvcm0pCisqCW9yCisqCQkodGhlIHBsYXRmb3JtIGlzIEJFIGFuZCB0aGUgTFRWIGRpZmZlcnMgZnJvbSB0aGUgcGxhdGZvcm0pLgorKgl0aGUgdmFyaWFibGUgaXMgdHJ1ZSAoaS5lIDB4MDAwMSkgaWYgZWl0aGVyCisqCQkodGhlIHBsYXRmb3JtIGlzIEJFIGFuZCB0aGUgTFRWIGlzIHRoZSBzYW1lIGFzIHRoZSBwbGF0Zm9ybSkKKyoJb3IKKyoJCSh0aGUgcGxhdGZvcm0gaXMgTEUgYW5kIHRoZSBMVFYgZGlmZmVycyBmcm9tIHRoZSBwbGF0Zm9ybSkuCisqCisqCUFsdGVybmF0aXZlbHkgdGhpcyBjYW4gYmUgcGhyYXNlZCBhczoKKyoJaWYgdGhlIHBsYXRmb3JtIGlzIExFCisqCQlpZiB0aGUgTFRWIGlzIExFIChpLmUgdGhlIHNhbWUgYXMgdGhlIHBsYXRmb3JtKSwgdGhlbiB0aGUgdmFyaWFibGUgPSAwCisqCQllbHNlICh0aGUgTFRWIGlzIEJFIChpLmUuIGRpZmZlcmVudCBmcm9tIHRoZSBwbGF0Zm9ybSkgKSwgdGhlbiB0aGUgdmFyaWFibGUgPSAxCisqCWlmIHRoZSBwbGF0Zm9ybSBpcyBCRQorKgkJaWYgdGhlIExUViBpcyBCRSAoaS5lIHRoZSBzYW1lIGFzIHRoZSBwbGF0Zm9ybSksIHRoZW4gdGhlIHZhcmlhYmxlID0gMQorKgkJZWxzZSAodGhlIExUViBpcyBMRSAoaS5lLiBkaWZmZXJlbnQgZnJvbSB0aGUgcGxhdGZvcm0pICksIHRoZW4gdGhlIHZhcmlhYmxlID0gMAorKgorKglUaGlzIGlzIGltcGxlbWVudGVkIGFzOgorKgkjaWYgSENGX0JJR19FTkRJQU4gPT0gMAkvL3BsYXRmb3JtIGlzIExFCisqCQlzdXAvYWN0X2VuZGlhbiBiZWNvbWVzIHJldmVyc2Ugb2Ygc3RydWN0dXJlLWVuZGlhbmVzcyBhcyBkZXRlcm1pbmVkIGluIDFhLzFiCisqCSNlbmRpZgorKjY6CUVhY2ggb2YgdGhlIGFjdG9yIHZhcmlhbnQtYm90dG9tLXRvcCByZWNvcmRzIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgKHNpbmdsZSkgc3VwcGxpZXIgdmFyaWFudC1ib3R0b20tdG9wCisqCXJhbmdlIHRpbGwgZWl0aGVyIGFuIGFjY2VwdGFibGUgbWF0Y2ggaXMgZm91bmQgb3IgYWxsIGFjdG9yIHJlY29yZHMgYXJlIHRyaWVkLiBBcyBleHBsYWluZWQgYWJvdmUsIGR1ZSB0bworKgl0aGUgbGltaXRlZCByYW5nZXMgb2YgdGhlc2UgdmFsdWVzLCBjaGVja2luZyBhIGJ5dGUgaXMgYWNjZXB0YWJsZSBhbmQgc3VpdGFibGUuCisqODoJZGVwZW5kaW5nIG9uIHdoZXRoZXIgYSBtYXRjaCB3YXMgZm91bmQgb3Igbm90IChhcyByZWZsZWN0ZWQgYnkgdGhlIHZhbHVlIG9mIHRoZSBjb250cm9sIHZhcmlhYmxlIG9mIHRoZQorKglmb3IgbG9vcCksIHRoZSBOVUxMIHBvaW50ZXIgb3IgYSBwb2ludGVyIHRvIHRoZSBtYXRjaGluZyBOdW1iZXIvQm90dG9tL1RvcCByZWNvcmQgb2YgdGhlIEFjdG9yIHN0cnVjdHVyZQorKglpcyByZXR1cm5lZC4KKyoJQXMgYW4gYWRkaXRpb25hbCBzYWZldHksIGNoZWNraW5nIHRoZSBzdXBwbGllciBsZW5ndGggcHJvdGVjdHMgYWdhaW5zdCBpbnZhbGlkIFN1cHBsaWVyIHN0cnVjdHVyZXMsIHdoaWNoCisqCW1heSBiZSBjYXVzZWQgYnkgZmFpbGluZyBoY2ZfZ2V0X2luZm8gKGluIHdoaWNoIGNhc2UgdGhlIGxlbi1maWVsZCBpcyB6ZXJvKS4gTm90ZSB0aGF0IHRoZSBjb250cmFwdGlvbgorKgkic3VwcC0+bGVuICE9IHNpemVvZihDRkdfU1VQX1JBTkdFX1NUUkNUKS9zaXplb2YoaGNmXzE2KSAtIDEiCisqCWRpZCB0dXJuIG91dCBub3QgdG8gd29yayBmb3IgYSBjb21waWxlciB3aGljaCBwYWRkZWQgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorKgorKiBOb3RlOiB3aGVuIGNvbnN1bHRpbmcgcmVmZXJlbmNlcyBsaWtlIERlc2lnbk5vdGVzIGFuZCBBcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbnMgdGhlcmUgaXMgYSBjb25mdXNpbmcgdXNlCisqCW9mIHRoZSBub3Rpb25zIG51bWJlciBhbmQgdmFyaWFudC4gVGhpcyByZXN1bHRlZCBpbiBhbiBpbmNvbnNpc3RlbnQgdXNlIGluIHRoZSBIQ0Ygbm9tZW5jbGF0dXJlIGFzIHdlbGwuCisqCVRoaXMgbWFrZXMgdGhlIGxvZ2ljIGhhcmQgdG8gZm9sbG93IGFuZCBvbmUgaGFzIHRvIGJlIHZlcnkgbXVjaCBhd2FyZSBvZiB0aGUgY29udGV4dCB3aGVuIHdhbGtpbmcgdGhyb3VnaAorKgl0aGUgY29kZS4KKyogTk9URTogVGhlIEVuZGlhbiBEZXRlY3Rpb24gQWxnb3JpdGhtIHBsYWNlcyBsaW1pdGF0aW9ucyBvbiBmdXR1cmUgZXh0ZW5zaW9ucyBvZiB0aGUgZmllbGRzLCBpLmUuIHRoZXkgc2hvdWxkCisqCXN0YXkgd2l0aGluIHRoZSBjdXJyZW50bHkgZGVmaW5lZCBib3VuZGFyaWVzIG9mIDEgdGhyb3VnaCA5OSAoYWx0aG91Z2ggMSB0aHJvdWdoIDI1NSkgd291bGQgd29yayBhcyB3ZWxsCisqCWFuZCB0aGVyZSBzaG91bGQgbmV2ZXIgYmUgdXNlZCBhIHplcm8gdmFsdWUgZm9yIHRoZSBib3R0b20gb2YgYSB2YWxpZCBzdXBwbGllci4KKyogTm90ZTogcmVsYXRpdmUgdG8gQXNzZXJ0cywgdGhlIGZvbGxvd2luZyBjYW4gYmUgb2JzZXJ2ZWQ6CisqCTE6IFN1cHBsaWVyIHZhcmlhbnQgMHgwMDAwIGhhcyBiZWVuIHVzZWQgZm9yIENvbnRyb2xsZWQgRGVwbG95bWVudAorKgkyOiBBbiBhY3RvciBtYXkgaGF2ZSBvbmUgb3IgbW9yZSB2YXJpYW50IHJlY29yZCBzcGVjaWZpY2F0aW9ucyB3aXRoIGEgdG9wIG9mIHplcm8gYW5kIGEgbm9uLXplcm8gYm90dG9tCisqCXRvIG92ZXJyaWRlIHRoZSBIQ0YgZGVmYXVsdCBzdXBwb3J0IG9mIGEgcGFydGljdWxhciB2YXJpYW50IGJ5IHRoZSBNU0YgcHJvZ3JhbW1lciB2aWEgaGNmY2ZnLmgKKyoJMzoJQW4gYWN0b3IgcmFuZ2UgY2FuIGJlIHNwZWNpZmllZCBhcyBhbGwgemVyb3MsIGUuZy4gYXMgcGFkZGluZyBpbiB0aGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZmlybXdhcmUKKyoJaW1hZ2UgZmlsZXMuCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0NGR19SQU5HRV9TUEVDX1NUUkNUKgorbW1kX2NoZWNrX2NvbXAoIENGR19SQU5HRVNfU1RSQ1QgKmFjdHAsIENGR19TVVBfUkFOR0VfU1RSQ1QgKnN1cHAgKQoreworCitDRkdfUkFOR0VfU1BFQ19CWVRFX1NUUkNUICAqYWN0cSA9IChDRkdfUkFOR0VfU1BFQ19CWVRFX1NUUkNUKilhY3RwLT52YXJfcmVjOworQ0ZHX1JBTkdFX1NQRUNfQllURV9TVFJDVCAgKnN1cHEgPSAoQ0ZHX1JBTkdFX1NQRUNfQllURV9TVFJDVCopJihzdXBwLT52YXJpYW50KTsKK2hjZl8xNglpOworaW50CQlhY3RfZW5kaWFuOwkJCQkJLy9hY3RvciBlbmRpYW4gZmxhZworaW50CQlzdXBfZW5kaWFuOwkJCQkJLy9zdXBwbGllciBlbmRpYW4gZmxhZworCisJYWN0X2VuZGlhbiA9IGFjdHAtPnJvbGUgPT0gQ09NUF9ST0xFX0FDVDsJLy90cnVlIGlmIG5hdGl2ZSBlbmRpYW4JCQkJLyogMWEgKi8KKwlzdXBfZW5kaWFuID0gc3VwcC0+Ym90dG9tIDwgMHgwMTAwOwkJIAkvL3RydWUgaWYgbmF0aXZlIGVuZGlhbgkJCQkvKiAyYSAqLworCisjaWYgSENGX0FTU0VSVAorCU1NREFTU0VSVCggc3VwcC0+bGVuID09IDYsIAkJCQkJCQkJCQkJCQkJCQlzdXBwLT5sZW4gKQorCU1NREFTU0VSVCggYWN0cC0+bGVuID49IDYgJiYgYWN0cC0+bGVuJTMgPT0gMCwgCQkJCQkJCQkJCQlhY3RwLT5sZW4gKQorCisJaWYgKCBhY3RfZW5kaWFuICkgewkJCQkJCQkvL25hdGl2ZSBlbmRpYW4KKwkJTU1EQVNTRVJUKCBhY3RwLT5yb2xlID09IENPTVBfUk9MRV9BQ1QsCQkJCQkJCQkJCQkJYWN0cC0+cm9sZSApCisJCU1NREFTU0VSVCggMSA8PSBhY3RwLT5pZCAmJiBhY3RwLT5pZCA8PSA5OSwgIAkJCQkJCQkJCQlhY3RwLT5pZCApCisJfSBlbHNlIHsJCQkJCQkJCQkvL25vbi1uYXRpdmUgZW5kaWFuCisJCU1NREFTU0VSVCggYWN0cC0+cm9sZSA9PSBDTlZfRU5EX1NIT1JUKENPTVBfUk9MRV9BQ1QpLAkgCQkJCQkJCWFjdHAtPnJvbGUgKQorCQlNTURBU1NFUlQoIDEgPD0gQ05WX0VORF9TSE9SVChhY3RwLT5pZCkgJiYgQ05WX0VORF9TSE9SVChhY3RwLT5pZCkgPD0gOTksCQkJCWFjdHAtPmlkICkKKwl9CisJaWYgKCBzdXBfZW5kaWFuICkgewkJCQkJCQkvL25hdGl2ZSBlbmRpYW4KKwkJTU1EQVNTRVJUKCBzdXBwLT5yb2xlID09IENPTVBfUk9MRV9TVVBMLCAJCQkJCQkJCQkJCXN1cHAtPnJvbGUgKQorCQlNTURBU1NFUlQoIDEgPD0gc3VwcC0+aWQgICAgICAmJiBzdXBwLT5pZCA8PSA5OSwgIAkJCQkJCQkJCXN1cHAtPmlkICkKKwkJTU1EQVNTRVJUKCAxIDw9IHN1cHAtPnZhcmlhbnQgJiYgc3VwcC0+dmFyaWFudCA8PSA5OSwgIAkJCQkJCQkJc3VwcC0+dmFyaWFudCApCisJCU1NREFTU0VSVCggMSA8PSBzdXBwLT5ib3R0b20gICYmIHN1cHAtPmJvdHRvbSA8PSA5OSwgCQkJCQkJCQlzdXBwLT5ib3R0b20gKQorCQlNTURBU1NFUlQoIDEgPD0gc3VwcC0+dG9wICAgICAmJiBzdXBwLT50b3AgPD0gOTksIAkJIAkJCQkJCQlzdXBwLT50b3AgKQorCQlNTURBU1NFUlQoIHN1cHAtPmJvdHRvbSA8PSBzdXBwLT50b3AsCQkJCQkJCXN1cHAtPmJvdHRvbSA8PCA4IHwgc3VwcC0+dG9wICkKKwl9IGVsc2UgewkJCQkJCQkJCS8vbm9uLW5hdGl2ZSBlbmRpYW4KKwkJTU1EQVNTRVJUKCBzdXBwLT5yb2xlID09IENOVl9FTkRfU0hPUlQoQ09NUF9ST0xFX1NVUEwpLCAJCQkJCQkJCXN1cHAtPnJvbGUgKQorCQlNTURBU1NFUlQoIDEgPD0gQ05WX0VORF9TSE9SVChzdXBwLT5pZCkgJiYgQ05WX0VORF9TSE9SVChzdXBwLT5pZCkgPD0gOTksCQkJCXN1cHAtPmlkICkKKwkJTU1EQVNTRVJUKCAxIDw9IENOVl9FTkRfU0hPUlQoc3VwcC0+dmFyaWFudCkgJiYgQ05WX0VORF9TSE9SVChzdXBwLT52YXJpYW50KSA8PSA5OSwJCXN1cHAtPnZhcmlhbnQgKQorCQlNTURBU1NFUlQoIDEgPD0gQ05WX0VORF9TSE9SVChzdXBwLT5ib3R0b20pICAmJiBDTlZfRU5EX1NIT1JUKHN1cHAtPmJvdHRvbSkgPD05OSwJCXN1cHAtPmJvdHRvbSApCisJCU1NREFTU0VSVCggMSA8PSBDTlZfRU5EX1NIT1JUKHN1cHAtPnRvcCkgICAgICYmIENOVl9FTkRfU0hPUlQoc3VwcC0+dG9wKSA8PTk5LCAgCQlzdXBwLT50b3AgKQorCQlNTURBU1NFUlQoIENOVl9FTkRfU0hPUlQoc3VwcC0+Ym90dG9tKSA8PSBDTlZfRU5EX1NIT1JUKHN1cHAtPnRvcCksCXN1cHAtPmJvdHRvbSA8PCA4IHwJc3VwcC0+dG9wICkKKwl9CisjZW5kaWYgLy8gSENGX0FTU0VSVAorCisjaWYgSENGX0JJR19FTkRJQU4gPT0gMAorCWFjdF9lbmRpYW4gPSAhYWN0X2VuZGlhbjsJCQkJCQkJCQkJCQkJCQkJCQkvKiAxYiovCisJc3VwX2VuZGlhbiA9ICFzdXBfZW5kaWFuOwkJCQkJCQkJCQkJCQkJCQkJCS8qIDJiKi8KKyNlbmRpZiAvLyBIQ0ZfQklHX0VORElBTgorCisJZm9yICggaSA9IGFjdHAtPmxlbiA7IGkgPiAzOyBhY3RxKyssIGkgLT0gMyApIHsJCQkJCQkJCQkJCQkJLyogNiAqLworCQlNTURBU1NFUlQoIGFjdHEtPnZhcmlhbnRbYWN0X2VuZGlhbl0gPD0gOTksIGk8PDggfCBhY3RxLT52YXJpYW50W2FjdF9lbmRpYW5dICkKKwkJTU1EQVNTRVJUKCBhY3RxLT5ib3R0b21bYWN0X2VuZGlhbl0gPD0gOTkgLCBpPDw4IHwgYWN0cS0+Ym90dG9tW2FjdF9lbmRpYW5dICkKKwkJTU1EQVNTRVJUKCBhY3RxLT50b3BbYWN0X2VuZGlhbl0gPD0gOTkJICAsIGk8PDggfCBhY3RxLT50b3BbYWN0X2VuZGlhbl0gKQorCQlNTURBU1NFUlQoIGFjdHEtPmJvdHRvbVthY3RfZW5kaWFuXSA8PSBhY3RxLT50b3BbYWN0X2VuZGlhbl0sIGk8PDggfCBhY3RxLT5ib3R0b21bYWN0X2VuZGlhbl0gKQorCQlpZiAoIGFjdHEtPnZhcmlhbnRbYWN0X2VuZGlhbl0gPT0gc3VwcS0+dmFyaWFudFtzdXBfZW5kaWFuXSAmJgorCQkJIGFjdHEtPmJvdHRvbVthY3RfZW5kaWFuXSAgPD0gc3VwcS0+dG9wW3N1cF9lbmRpYW5dICYmCisJCQkgYWN0cS0+dG9wW2FjdF9lbmRpYW5dICAgICA+PSBzdXBxLT5ib3R0b21bc3VwX2VuZGlhbl0KKwkJICAgKSBicmVhazsKKwl9CisJaWYgKCBpIDw9IDMgfHwgc3VwcC0+bGVuICE9IDYgLypzaXplb2YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCkvc2l6ZW9mKGhjZl8xNikgLSAxICovICkgeworCSAgIGFjdHEgPSBOVUxMOwkJCQkJCQkJCQkJCQkJCQkJCQkJCS8qIDggKi8KKwl9CisjaWYgSENGX0FTU0VSVAorCWlmICggYWN0cSA9PSBOVUxMICkgeworCQlmb3IgKCBpID0gMDsgaSA8PSBzdXBwLT5sZW47IGkgKz0gMiApIHsKKwkJCU1NREFTU0VSVCggRE9fQVNTRVJULCBNRVJHRV8yKCAoKGhjZl8xNiopc3VwcClbaV0sICgoaGNmXzE2KilzdXBwKVtpKzFdICkgKTsKKwkJfQorCQlmb3IgKCBpID0gMDsgaSA8PSBhY3RwLT5sZW47IGkgKz0gMiApIHsKKwkJCU1NREFTU0VSVCggRE9fQVNTRVJULCBNRVJHRV8yKCAoKGhjZl8xNiopYWN0cClbaV0sICgoaGNmXzE2KilhY3RwKVtpKzFdICkgKTsKKwkJfQorCX0KKyNlbmRpZiAvLyBIQ0ZfQVNTRVJUCisJcmV0dXJuIChDRkdfUkFOR0VfU1BFQ19TVFJDVCopYWN0cTsKK30gLy8gbW1kX2NoZWNrX2NvbXAKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvbW1kLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9tbWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjg5MGMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvbW1kLmgKQEAgLTAsMCArMSw3OCBAQAorCisvLyAgIHZpbTp0dz0xMTA6dHM9NDoKKyNpZm5kZWYgTU1EX0gKKyNkZWZpbmUgTU1EX0ggMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGSUxFCSAgOiBtbWQuaAorKgorKiBEQVRFICAgIDogJERhdGU6IDIwMDQvMDcvMTkgMDg6MTY6MTQgJCAgICRSZXZpc2lvbjogMS4yICQKKyogT3JpZ2luYWw6IDIwMDQvMDUvMTcgMDc6MzM6MTQgICAgUmV2aXNpb246IDEuMTggICAgICBUYWc6IGhjZjdfdDIwMDQwNjAyXzAxCisqIE9yaWdpbmFsOiAyMDA0LzA1LzExIDA2OjIyOjU5ICAgIFJldmlzaW9uOiAxLjE3ICAgICAgVGFnOiBoY2Y3X3Q3XzIwMDQwNTEzXzAxCisqIE9yaWdpbmFsOiAyMDA0LzA0LzE1IDA5OjI0OjQyICAgIFJldmlzaW9uOiAxLjEzICAgICAgVGFnOiBoY2Y3X3Q3XzIwMDQwNDE1XzAxCisqIE9yaWdpbmFsOiAyMDA0LzA0LzA4IDE1OjE4OjE3ICAgIFJldmlzaW9uOiAxLjEyICAgICAgVGFnOiB0N18yMDA0MDQxM18wMQorKiBPcmlnaW5hbDogMjAwNC8wNC8wMSAxNTozMjo1NSAgICBSZXZpc2lvbjogMS4xMCAgICAgIFRhZzogdDdfMjAwNDA0MDFfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDMvMDQgMTY6NDc6NTAgICAgUmV2aXNpb246IDEuNyAgICAgIFRhZzogdDIwMDQwMzEwXzAxCisqIE9yaWdpbmFsOiAyMDA0LzAzLzAzIDEyOjQ3OjA1ICAgIFJldmlzaW9uOiAxLjYgICAgICBUYWc6IHQyMDA0MDMwNF8wMQorKiBPcmlnaW5hbDogMjAwNC8wMi8yNSAxNDoxNDozOSAgICBSZXZpc2lvbjogMS41ICAgICAgVGFnOiB0MjAwNDAzMDJfMDMKKyogT3JpZ2luYWw6IDIwMDQvMDIvMjQgMTM6MDA6MjkgICAgUmV2aXNpb246IDEuNCAgICAgIFRhZzogdDIwMDQwMjI0XzAxCisqIE9yaWdpbmFsOiAyMDA0LzAxLzMwIDA5OjU5OjMzICAgIFJldmlzaW9uOiAxLjMgICAgICBUYWc6IHQyMDA0MDIxOV8wMQorKgorKiBBVVRIT1IgIDogTmljbyBWYWxzdGVyCisqCisqIERFU0MgICAgOiBEZWZpbml0aW9ucyBhbmQgUHJvdG90eXBlcyBmb3IgSENGLCBNU0YsIFVJTCBhcyB3ZWxsIGFzIFVTRiBzb3VyY2VzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoKKyogU09GVFdBUkUgTElDRU5TRQorKgorKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyoKKyogQ09QWVJJR0hUIKkgMjAwMSAtIDIwMDQJYnkgQWdlcmUgU3lzdGVtcyBJbmMuCUFsbCBSaWdodHMgUmVzZXJ2ZWQKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorKgorKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyogICAgZGlzdHJpYnV0aW9uLgorKgorKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyoKKyogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorKgorKiBEaXNjbGFpbWVyCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyogREFNQUdFLgorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEhDRl9ICisjaW5jbHVkZSAiaGNmLmgiCS8vanVzdCB0byBnZXQgZ29pbmcgd2l0aCBzd2lnCisjZW5kaWYKKworRVhURVJOX0MgQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QqIG1tZF9jaGVja19jb21wKCBDRkdfUkFOR0VTX1NUUkNUICphY3RwLCBDRkdfU1VQX1JBTkdFX1NUUkNUICpzdXBwICk7CisKKyNlbmRpZiAvLyBNTURfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvc3RhX2gyLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9zdGFfaDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWEzODUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvc3RhX2gyLmMKQEAgLTAsMCArMSw0NDgwIEBACisvKgorICogRmlsZToJc3RhX2gyNC4yMzYKKyAqCisgKiBBYnN0cmFjdDoJVGhpcyBmaWxlIGNvbnRhaW5zIG1lbW9yeSBpbWFnZSAnZndfaW1hZ2UnLgorICoKKyAqIENvbnRlbnRzOglUb3RhbCBzaXplIG9mIHRoZSBtZW1vcnkgaW1hZ2U6IDY5Mjk0IGJ5dGVzLgorICoJCVRvdGFsIG51bWJlciBvZiBibG9ja3M6IDQgYmxvY2tzLgorICoJCUJsb2NrICAxIDogbG9hZCBhZGRyZXNzIDAwMDAwMDYwLCAzOTAgYnl0ZXMuCisgKgkJQmxvY2sgIDIgOiBsb2FkIGFkZHJlc3MgMDAwMDBDMTYsIDk0OTYgYnl0ZXMuCisgKgkJQmxvY2sgIDMgOiBsb2FkIGFkZHJlc3MgMDAxRTMxMkUsIDE1Nzg2IGJ5dGVzLgorICoJCUJsb2NrICA0IDogbG9hZCBhZGRyZXNzIDAwMUY0MDAwLCA0MzYyMiBieXRlcy4KKyAqCisgKiBJZGVudGl0eToJY29tcG9uZW50IGlkOiAzMSAodmFyaWFudCAzKSB2ZXJzaW9uIDIuMzYKKyAqCisgKiBDb21wYXRpYmlsaXR5OgorICoJCXN1cHBseWluZyBpbnRlcmZhY2UgNCAodmFyaWFudCAyKSA6IDIgLSA1CisgKgkJYWN0aW5nIG9uIGludGVyZmFjZSAxICh2YXJpYW50IDQpIDogNiAtIDcKKyAqCQlhY3Rpbmcgb24gaW50ZXJmYWNlIDEgKHZhcmlhbnQgNSkgOiA2IC0gNworICoJCWFjdGluZyBvbiBpbnRlcmZhY2UgMSAodmFyaWFudCA2KSA6IDYgLSA3CisgKgkJYWN0aW5nIG9uIGludGVyZmFjZSAyICh2YXJpYW50IDIpIDogMSAtIDIKKyAqCisgKiBHZW5lcmF0ZWQ6CWJ5IGc6XGZ3XGZ1cHUzLmV4ZSB2ZXJzaW9uIDQuMjYKKyAqCisgKiBDb21tYW5kbGluZToJZzpcZndcZnVwdTMuZXhlIC9mPTQgL249ZndfaW1hZ2UgL2k9cjMwMjM2MDAuaGV4CisgKi8KKworCisjaW5jbHVkZSAiaGNmY2ZnLmgiCQkJCS8vIHRvIGdldCBoY2ZfMTYgZXRjIGRlZmluZWQgYXMgd2VsbCBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NzaWJsZSBzZXR0aW5ncyB3aGljaCBpbmx1ZW5jZSBtZGQuaCBvciBkaGYuaAorI2luY2x1ZGUgIm1kZC5oIiAgIAkJCQkvL3RvIGdldCBDT01QX0lEX1NUQSBldGMgZGVmaW5lZAorI2luY2x1ZGUgImRoZi5oIiAgIAkJCQkvL3VzZWQgdG8gYmUgImZoZm1lbS5oIiwgdG8gZ2V0IG1lbWJsb2NrLHBsdWdyZWNvcmQsCisKK3N0YXRpYyBjb25zdCBoY2ZfOCBmd19pbWFnZV8xX2RhdGFbXSA9IHsKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxQywgMHgwRCwgMHgwMCwgMHgwMCwKKwkgMHgzQSwgMHgwQywgMHgwMCwgMHgwMCwgMHgzQSwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxQiwgMHgwMCwgMHgxQiwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHg4NiwgMHgxOSwgMHg4NiwgMHgxOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwKKwkgMHgwNiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHhFQSwgMHgwMCwgMHgwMCwgMHhGRiwgMHgwNywgMHgwMSwgMHgwMCwgMHg2NCwgMHgwMCwgMHg2NCwgMHgwMCwgMHgxMCwgMHgyNywgMHgxMCwgMHgyNywKKwkgMHgxNCwgMHgwMCwgMHhEMCwgMHgwNywgMHhEMCwgMHgwNywgMHgxMCwgMHgyNywgMHgyRiwgMHgwMCwgMHgzMiwgMHgwMCwgMHgzMiwgMHgwMCwgMHgwNSwgMHgwMCwKKwkgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgxMCwgMHgyNywgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgxMywgMHgwMCwgMHgwQSwgMHgwMCwKKwkgMHgwNywgMHgwMCwgMHgwMywgMHgwMCwgMHgzMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQSwgMHgwOSwgMHgyQiwgMHgwOSwgMHgyQiwgMHgwOSwKKwkgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2RSwgMHgwMCwgMHgxNCwgMHgwMSwgMHgwMCwgMHg0MCwgMHgwMCwgMHgzMiwgMHgwMCwgMHgzMiwgMHgwMCwKKwkgMHgwQSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKworfTsgIC8qIGZ3X2ltYWdlXzFfZGF0YSAqLworCitzdGF0aWMgY29uc3QgaGNmXzggZndfaW1hZ2VfMl9kYXRhW10gPSB7CisJIDB4NEIsIDB4QTMsIDB4MDAsIDB4MEEsIDB4MTAsIDB4MDEsIDB4NjgsIDB4QTQsIDB4QjAsIDB4MDEsIDB4ODQsIDB4MDEsIDB4MzAsIDB4MzMsIDB4MzEsIDB4MzMsCisJIDB4NDQsIDB4NDQsIDB4MzAsIDB4MzMsIDB4MzEsIDB4MzMsIDB4MzAsIDB4MzMsIDB4MzEsIDB4MzMsIDB4MzIsIDB4MzMsIDB4MzIsIDB4MzMsIDB4OTAsIDB4MDAsCisJIDB4NzgsIDB4MDQsIDB4QUUsIDB4RTQsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsCisJIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTUsIDB4QzYsIDB4ODQsIDB4RjgsIDB4OTksIDB4RUUsCisJIDB4OEQsIDB4RjYsIDB4MEQsIDB4RkYsIDB4QkQsIDB4RDYsIDB4QjEsIDB4REUsIDB4NTQsIDB4OTEsIDB4NTAsIDB4NjAsIDB4MDMsIDB4MDIsIDB4QTksIDB4Q0UsCisJIDB4N0QsIDB4NTYsIDB4MTksIDB4RTcsIDB4NjIsIDB4QjUsIDB4RTYsIDB4NEQsIDB4OUEsIDB4RUMsIDB4NDUsIDB4OEYsIDB4OUQsIDB4MUYsIDB4NDAsIDB4ODksCisJIDB4ODcsIDB4RkEsIDB4MTUsIDB4RUYsIDB4RUIsIDB4QjIsIDB4QzksIDB4OEUsIDB4MEIsIDB4RkIsIDB4RUMsIDB4NDEsIDB4NjcsIDB4QjMsIDB4RkQsIDB4NUYsCisJIDB4RUEsIDB4NDUsIDB4QkYsIDB4MjMsIDB4RjcsIDB4NTMsIDB4OTYsIDB4RTQsIDB4NUIsIDB4OUIsIDB4QzIsIDB4NzUsIDB4MUMsIDB4RTEsIDB4QUUsIDB4M0QsCisJIDB4NkEsIDB4NEMsIDB4NUEsIDB4NkMsIDB4NDEsIDB4N0UsIDB4MDIsIDB4RjUsIDB4NEYsIDB4ODMsIDB4NUMsIDB4NjgsIDB4RjQsIDB4NTEsIDB4MzQsIDB4RDEsCisJIDB4MDgsIDB4RjksIDB4OTMsIDB4RTIsIDB4NzMsIDB4QUIsIDB4NTMsIDB4NjIsIDB4M0YsIDB4MkEsIDB4MEMsIDB4MDgsIDB4NTIsIDB4OTUsIDB4NjUsIDB4NDYsCisJIDB4NUUsIDB4OUQsIDB4MjgsIDB4MzAsIDB4QTEsIDB4MzcsIDB4MEYsIDB4MEEsIDB4QjUsIDB4MkYsIDB4MDksIDB4MEUsIDB4MzYsIDB4MjQsIDB4OUIsIDB4MUIsCisJIDB4M0QsIDB4REYsIDB4MjYsIDB4Q0QsIDB4NjksIDB4NEUsIDB4Q0QsIDB4N0YsIDB4OUYsIDB4RUEsIDB4MUIsIDB4MTIsIDB4OUUsIDB4MUQsIDB4NzQsIDB4NTgsCisJIDB4MkUsIDB4MzQsIDB4MkQsIDB4MzYsIDB4QjIsIDB4REMsIDB4RUUsIDB4QjQsIDB4RkIsIDB4NUIsIDB4RjYsIDB4QTQsIDB4NEQsIDB4NzYsIDB4NjEsIDB4QjcsCisJIDB4Q0UsIDB4N0QsIDB4N0IsIDB4NTIsIDB4M0UsIDB4REQsIDB4NzEsIDB4NUUsIDB4OTcsIDB4MTMsIDB4RjUsIDB4QTYsIDB4NjgsIDB4QjksIDB4MDAsIDB4MDAsCisJIDB4MkMsIDB4QzEsIDB4NjAsIDB4NDAsIDB4MUYsIDB4RTMsIDB4QzgsIDB4NzksIDB4RUQsIDB4QjYsIDB4QkUsIDB4RDQsIDB4NDYsIDB4OEQsIDB4RDksIDB4NjcsCisJIDB4NEIsIDB4NzIsIDB4REUsIDB4OTQsIDB4RDQsIDB4OTgsIDB4RTgsIDB4QjAsIDB4NEEsIDB4ODUsIDB4NkIsIDB4QkIsIDB4MkEsIDB4QzUsIDB4RTUsIDB4NEYsCisJIDB4MTYsIDB4RUQsIDB4QzUsIDB4ODYsIDB4RDcsIDB4OUEsIDB4NTUsIDB4NjYsIDB4OTQsIDB4MTEsIDB4Q0YsIDB4OEEsIDB4MTAsIDB4RTksIDB4MDYsIDB4MDQsCisJIDB4ODEsIDB4RkUsIDB4RjAsIDB4QTAsIDB4NDQsIDB4NzgsIDB4QkEsIDB4MjUsIDB4RTMsIDB4NEIsIDB4RjMsIDB4QTIsIDB4RkUsIDB4NUQsIDB4QzAsIDB4ODAsCisJIDB4OEEsIDB4MDUsIDB4QUQsIDB4M0YsIDB4QkMsIDB4MjEsIDB4NDgsIDB4NzAsIDB4MDQsIDB4RjEsIDB4REYsIDB4NjMsIDB4QzEsIDB4NzcsIDB4NzUsIDB4QUYsCisJIDB4NjMsIDB4NDIsIDB4MzAsIDB4MjAsIDB4MUEsIDB4RTUsIDB4MEUsIDB4RkQsIDB4NkQsIDB4QkYsIDB4NEMsIDB4ODEsIDB4MTQsIDB4MTgsIDB4MzUsIDB4MjYsCisJIDB4MkYsIDB4QzMsIDB4RTEsIDB4QkUsIDB4QTIsIDB4MzUsIDB4Q0MsIDB4ODgsIDB4MzksIDB4MkUsIDB4NTcsIDB4OTMsIDB4RjIsIDB4NTUsIDB4ODIsIDB4RkMsCisJIDB4NDcsIDB4N0EsIDB4QUMsIDB4QzgsIDB4RTcsIDB4QkEsIDB4MkIsIDB4MzIsIDB4OTUsIDB4RTYsIDB4QTAsIDB4QzAsIDB4OTgsIDB4MTksIDB4RDEsIDB4OUUsCisJIDB4N0YsIDB4QTMsIDB4NjYsIDB4NDQsIDB4N0UsIDB4NTQsIDB4QUIsIDB4M0IsIDB4ODMsIDB4MEIsIDB4Q0EsIDB4OEMsIDB4MjksIDB4QzcsIDB4RDMsIDB4NkIsCisJIDB4M0MsIDB4MjgsIDB4NzksIDB4QTcsIDB4RTIsIDB4QkMsIDB4MUQsIDB4MTYsIDB4NzYsIDB4QUQsIDB4M0IsIDB4REIsIDB4NTYsIDB4NjQsIDB4NEUsIDB4NzQsCisJIDB4MUUsIDB4MTQsIDB4REIsIDB4OTIsIDB4MEEsIDB4MEMsIDB4NkMsIDB4NDgsIDB4RTQsIDB4QjgsIDB4NUQsIDB4OUYsIDB4NkUsIDB4QkQsIDB4RUYsIDB4NDMsCisJIDB4QTYsIDB4QzQsIDB4QTgsIDB4MzksIDB4QTQsIDB4MzEsIDB4MzcsIDB4RDMsIDB4OEIsIDB4RjIsIDB4MzIsIDB4RDUsIDB4NDMsIDB4OEIsIDB4NTksIDB4NkUsCisJIDB4QjcsIDB4REEsIDB4OEMsIDB4MDEsIDB4NjQsIDB4QjEsIDB4RDIsIDB4OUMsIDB4RTAsIDB4NDksIDB4QjQsIDB4RDgsIDB4RkEsIDB4QUMsIDB4MDcsIDB4RjMsCisJIDB4MjUsIDB4Q0YsIDB4QUYsIDB4Q0EsIDB4OEUsIDB4RjQsIDB4RTksIDB4NDcsIDB4MTgsIDB4MTAsIDB4RDUsIDB4NkYsIDB4ODgsIDB4RjAsIDB4NkYsIDB4NEEsCisJIDB4NzIsIDB4NUMsIDB4MjQsIDB4MzgsIDB4RjEsIDB4NTcsIDB4QzcsIDB4NzMsIDB4NTEsIDB4OTcsIDB4MjMsIDB4Q0IsIDB4N0MsIDB4QTEsIDB4OUMsIDB4RTgsCisJIDB4MjEsIDB4M0UsIDB4REQsIDB4OTYsIDB4REMsIDB4NjEsIDB4ODYsIDB4MEQsIDB4ODUsIDB4MEYsIDB4OTAsIDB4RTAsIDB4NDIsIDB4N0MsIDB4QzQsIDB4NzEsCisJIDB4QUEsIDB4Q0MsIDB4RDgsIDB4OTAsIDB4MDUsIDB4MDYsIDB4MDEsIDB4RjcsIDB4MTIsIDB4MUMsIDB4QTMsIDB4QzIsIDB4NUYsIDB4NkEsIDB4RjksIDB4QUUsCisJIDB4RDAsIDB4NjksIDB4OTEsIDB4MTcsIDB4NTgsIDB4OTksIDB4MjcsIDB4M0EsIDB4QjksIDB4MjcsIDB4MzgsIDB4RDksIDB4MTMsIDB4RUIsIDB4QjMsIDB4MkIsCisJIDB4MzMsIDB4MjIsIDB4QkIsIDB4RDIsIDB4NzAsIDB4QTksIDB4ODksIDB4MDcsIDB4QTcsIDB4MzMsIDB4QjYsIDB4MkQsIDB4MjIsIDB4M0MsIDB4OTIsIDB4MTUsCisJIDB4MjAsIDB4QzksIDB4NDksIDB4ODcsIDB4RkYsIDB4QUEsIDB4NzgsIDB4NTAsIDB4N0EsIDB4QTUsIDB4OEYsIDB4MDMsIDB4RjgsIDB4NTksIDB4ODAsIDB4MDksCisJIDB4MTcsIDB4MUEsIDB4REEsIDB4NjUsIDB4MzEsIDB4RDcsIDB4QzYsIDB4ODQsIDB4QjgsIDB4RDAsIDB4QzMsIDB4ODIsIDB4QjAsIDB4MjksIDB4NzcsIDB4NUEsCisJIDB4MTEsIDB4MUUsIDB4Q0IsIDB4N0IsIDB4RkMsIDB4QTgsIDB4RDYsIDB4NkQsIDB4M0EsIDB4MkMsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MzEsIDB4MDAsIDB4MzMsCisJIDB4MDAsIDB4MzQsIDB4MDAsIDB4MzUsIDB4MDAsIDB4MzYsIDB4MDAsIDB4MzcsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MzgsIDB4MDAsIDB4M0EsIDB4MDAsIDB4M0IsCisJIDB4MDAsIDB4M0MsIDB4MDAsIDB4M0QsIDB4MDAsIDB4M0UsIDB4MDAsIDB4M0YsIDB4MDAsIDB4M0YsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MEEsIDB4MDIsIDB4MTQsCisJIDB4MDUsIDB4MzIsIDB4MEIsIDB4MzcsIDB4MDgsIDB4NTAsIDB4MEIsIDB4NkUsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4M0YsIDB4MDAsCisJIDB4MEMsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MEYsIDB4MDAsIDB4M0UsIDB4MDAsIDB4M0MsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDQsIDB4MDAsCisJIDB4MEEsIDB4MDAsIDB4MEIsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NjMsIDB4MDAsIDB4NjMsIDB4MDAsIDB4MjAsIDB4MDAsIDB4NjMsIDB4MDAsIDB4NjMsIDB4MDAsIDB4MjAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MEEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTAsIDB4MTAsCisJIDB4RUUsIDB4MTAsIDB4QTYsIDB4MTAsIDB4RTgsIDB4MTAsIDB4QUMsIDB4MTAsIDB4RTIsIDB4MTAsIDB4QjIsIDB4MTAsIDB4REMsIDB4MTAsIDB4QjgsIDB4MTAsCisJIDB4RDYsIDB4MTAsIDB4QkUsIDB4MTAsIDB4RDAsIDB4MTAsIDB4QzQsIDB4MTAsIDB4Q0EsIDB4MTAsIDB4MDcsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MjIsCisJIDB4MDAsIDB4MDQsIDB4MDgsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MjYsIDB4MDAsIDB4MDQsIDB4MDksIDB4MDEsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MkEsCisJIDB4MDAsIDB4MDQsIDB4MEEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MkUsIDB4MDAsIDB4MDQsIDB4MEIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MjQsCisJIDB4MDQsIDB4MDQsIDB4MEMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MjgsIDB4MDQsIDB4MDQsIDB4MEQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MkMsCisJIDB4MDQsIDB4MDQsIDB4MEUsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MzAsIDB4MDQsIDB4MDQsIDB4MEYsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTYsIDB4MzQsCisJIDB4MDgsIDB4MDQsIDB4MTAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTYsIDB4MzgsIDB4MDgsIDB4MDQsIDB4MTEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTYsIDB4M0MsCisJIDB4MDgsIDB4MDQsIDB4MTIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTYsIDB4NDAsIDB4MDgsIDB4MDQsIDB4MTMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NjQsCisJIDB4MEMsIDB4MEIsIDB4MTQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NjgsIDB4MEMsIDB4MEIsIDB4MTUsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NkMsCisJIDB4MEMsIDB4MEIsIDB4MTYsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NzAsIDB4MEMsIDB4MEIsIDB4MTcsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NzQsCisJIDB4MEMsIDB4MEIsIDB4MTgsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NzgsIDB4MEMsIDB4MEIsIDB4MTksIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4N0MsCisJIDB4MEMsIDB4MEIsIDB4MUEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4ODAsIDB4MEMsIDB4MEIsIDB4MUIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4ODQsCisJIDB4MEMsIDB4MEIsIDB4MUMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4ODgsIDB4MEMsIDB4MEIsIDB4MUQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4OEMsCisJIDB4MEMsIDB4MEIsIDB4MUUsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MUQsIDB4OTUsIDB4MTcsIDB4MDQsIDB4MUYsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MUQsIDB4OTksCisJIDB4MTcsIDB4MDQsIDB4MjAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MUQsIDB4OUQsIDB4MTcsIDB4MDQsIDB4MjEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MUQsIDB4QTEsCisJIDB4MTcsIDB4MDQsIDB4MjIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MEUsIDB4QTUsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTEsIDB4MzAsIDB4MTEsIDB4NTAsIDB4MTEsCisJIDB4NzAsIDB4MTEsIDB4QzgsIDB4MTEsIDB4MTgsIDB4MTEsIDB4MzgsIDB4MTEsIDB4NTgsIDB4MTEsIDB4NzgsIDB4MTEsIDB4RDAsIDB4MTEsIDB4MjAsIDB4MTEsCisJIDB4NDAsIDB4MTEsIDB4NjAsIDB4MTEsIDB4ODAsIDB4MTEsIDB4RDgsIDB4MTEsIDB4MjgsIDB4MTEsIDB4NDgsIDB4MTEsIDB4NjgsIDB4MTEsIDB4ODgsIDB4MTEsCisJIDB4RTAsIDB4MTEsIDB4OTAsIDB4MTEsIDB4OTgsIDB4MTEsIDB4QTAsIDB4MTEsIDB4QTgsIDB4MTEsIDB4QjAsIDB4MTEsIDB4QjgsIDB4MTEsIDB4QzAsIDB4MTEsCisJIDB4RTgsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkUsIDB4MUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MzYsIDB4MjUsIDB4NEYsIDB4MjUsIDB4NzIsIDB4MjUsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4QUMsIDB4MjUsCisJIDB4MDIsIDB4MkIsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RjMsIDB4MkQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsCisJIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4OEIsIDB4MjcsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsCisJIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsCisJIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTUsIDB4MjcsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsCisJIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsCisJIDB4RTEsIDB4MjQsIDB4NTksIDB4MjcsIDB4NzMsIDB4MjcsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsCisJIDB4RTEsIDB4MjQsIDB4NDcsIDB4MjMsIDB4Q0UsIDB4MjUsIDB4RTEsIDB4MjUsIDB4OTEsIDB4MjYsIDB4OTUsIDB4MjYsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsCisJIDB4NDQsIDB4MjcsIDB4NTEsIDB4RUEsIDB4RkYsIDB4RTksIDB4MDAsIDB4MDAsIDB4NDgsIDB4RUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzksIDB4RUEsCisJIDB4NjUsIDB4MjUsIDB4ODksIDB4MjUsIDB4MDAsIDB4MDAsIDB4RjgsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MkIsIDB4RTAsIDB4RkMsCisJIDB4NEMsIDB4MjgsIDB4QzYsIDB4MkEsIDB4NUEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RjksIDB4RkYsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4MDAsIDB4MDEsCisJIDB4MDIsIDB4MDAsIDB4RjcsIDB4RkYsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4NTAsIDB4MjgsIDB4MDYsIDB4MDAsIDB4RjAsIDB4RkYsIDB4NEMsIDB4MjgsCisJIDB4MjksIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4RjYsIDB4RkYsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4NkMsIDB4MDAsIDB4MDIsIDB4MDAsCisJIDB4RjQsIDB4RkYsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4QUEsIDB4MDEsIDB4MDIsIDB4MDAsIDB4RjUsIDB4RkYsIDB4NEMsIDB4MjgsIDB4Q0YsIDB4MkEsCisJIDB4NDIsIDB4MjgsIDB4MDIsIDB4MDAsIDB4RTAsIDB4RkYsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4Q0UsIDB4MkQsIDB4MDIsIDB4MDAsIDB4RTEsIDB4RkYsCisJIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4RDAsIDB4MkQsIDB4MDIsIDB4MDAsIDB4RTIsIDB4RkYsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4RDIsIDB4MkQsCisJIDB4MDIsIDB4MDAsIDB4RTMsIDB4RkYsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4Q0EsIDB4MkQsIDB4MDIsIDB4MDAsIDB4MDMsIDB4RkMsIDB4NEMsIDB4MjgsCisJIDB4MTcsIDB4MkEsIDB4MTYsIDB4MkQsIDB4MDIsIDB4MDAsIDB4MDQsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NUMsIDB4MjgsIDB4NTgsIDB4MjgsIDB4MjIsIDB4MDAsCisJIDB4MDYsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4NDAsIDB4MjgsIDB4MDIsIDB4MDAsIDB4MDcsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsCisJIDB4OUMsIDB4MjgsIDB4MDIsIDB4MDAsIDB4MEUsIDB4RkMsIDB4NEMsIDB4MjgsIDB4MjksIDB4MkEsIDB4QTYsIDB4MjgsIDB4MjIsIDB4MDAsIDB4QjEsIDB4RkMsCisJIDB4NEMsIDB4MjgsIDB4MUQsIDB4MkIsIDB4QTIsIDB4MjksIDB4MDIsIDB4MDAsIDB4MjAsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4Q0MsIDB4MjgsCisJIDB4MDIsIDB4MDAsIDB4MjUsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4RDYsIDB4MjgsIDB4MDIsIDB4MDAsIDB4MjYsIDB4RkMsIDB4NEMsIDB4MjgsCisJIDB4NjIsIDB4MjgsIDB4RDgsIDB4MjgsIDB4MDIsIDB4MDAsIDB4MjcsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4REEsIDB4MjgsIDB4MDIsIDB4MDAsCisJIDB4QjIsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NUMsIDB4MjgsIDB4QzYsIDB4MjksIDB4MjIsIDB4MDAsIDB4QzEsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsCisJIDB4NUEsIDB4MkQsIDB4MjAsIDB4MDAsIDB4QjAsIDB4RkMsIDB4MUYsIDB4MjgsIDB4MjIsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzQsIDB4RkMsCisJIDB4MUYsIDB4MjgsIDB4RTcsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4QzgsIDB4RkMsIDB4MUYsIDB4MjgsIDB4RTIsIDB4MkEsIDB4MDAsIDB4MDAsCisJIDB4MDgsIDB4MDAsIDB4QjQsIDB4RkMsIDB4MUYsIDB4MjgsIDB4NjAsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjYsIDB4RkMsIDB4MUYsIDB4MjgsCisJIDB4MTEsIDB4MkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjcsIDB4RkMsIDB4MUYsIDB4MjgsIDB4M0IsIDB4MkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4QjgsIDB4RkMsIDB4MUYsIDB4MjgsIDB4OTgsIDB4MkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjUsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsCisJIDB4QzYsIDB4MkQsIDB4MDIsIDB4MDAsIDB4QjksIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4QzgsIDB4MkQsIDB4MDIsIDB4MDAsIDB4OTAsIDB4RkQsCisJIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4Q0MsIDB4MkQsIDB4MDIsIDB4MDAsIDB4MjMsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4RDIsIDB4MjgsCisJIDB4MDIsIDB4MDAsIDB4MjksIDB4RkMsIDB4NDQsIDB4MjksIDB4RjEsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzIsIDB4RkMsIDB4NEMsIDB4MjgsCisJIDB4NjIsIDB4MjgsIDB4MEUsIDB4MkQsIDB4MDIsIDB4MDAsIDB4MzIsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4QTAsIDB4MDEsIDB4MDIsIDB4MDAsCisJIDB4MzMsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4QTIsIDB4MDEsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsCisJIDB4NTYsIDB4MjgsIDB4MDIsIDB4MDAsIDB4MDEsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4NTAsIDB4MjgsIDB4MDYsIDB4MDAsIDB4MDIsIDB4RkMsCisJIDB4NEMsIDB4MjgsIDB4REMsIDB4MjgsIDB4QTQsIDB4MjksIDB4MjIsIDB4MDAsIDB4MDUsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4NDYsIDB4MjgsCisJIDB4MDIsIDB4MDAsIDB4MDgsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4NEEsIDB4MjgsIDB4MDYsIDB4MDAsIDB4MDksIDB4RkMsIDB4NEMsIDB4MjgsCisJIDB4NjIsIDB4MjgsIDB4OUUsIDB4MjgsIDB4MDIsIDB4MDAsIDB4MEIsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4QTAsIDB4MjgsIDB4MDIsIDB4MDAsCisJIDB4MEMsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4QTIsIDB4MjgsIDB4MDIsIDB4MDAsIDB4MEQsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsCisJIDB4QTQsIDB4MjgsIDB4MDIsIDB4MDAsIDB4MjEsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4Q0UsIDB4MjgsIDB4MDIsIDB4MDAsIDB4ODAsIDB4RkMsCisJIDB4QjgsIDB4MjgsIDB4QzgsIDB4MjgsIDB4RTIsIDB4MjgsIDB4QzAsIDB4MDAsIDB4ODEsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4QTgsIDB4MDEsCisJIDB4MDIsIDB4MDAsIDB4ODMsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4QUMsIDB4MDEsIDB4MDIsIDB4MDAsIDB4ODUsIDB4RkMsIDB4NEMsIDB4MjgsCisJIDB4NDksIDB4MkEsIDB4QTYsIDB4MDEsIDB4MDIsIDB4MDAsIDB4ODYsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NUIsIDB4MkEsIDB4QjIsIDB4MDEsIDB4MDIsIDB4MDAsCisJIDB4MjgsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4REMsIDB4MjgsIDB4MDIsIDB4MDAsIDB4ODcsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsCisJIDB4RUMsIDB4MjksIDB4MjIsIDB4MDMsIDB4ODQsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NzAsIDB4MkEsIDB4QjAsIDB4MDEsIDB4MDIsIDB4MDAsIDB4MkIsIDB4RkMsCisJIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4MTQsIDB4MzEsIDB4MDIsIDB4MDAsIDB4RjgsIDB4RkYsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4MEUsIDB4MzEsCisJIDB4MDIsIDB4MDAsIDB4RjMsIDB4RkYsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4MTYsIDB4MzEsIDB4MDIsIDB4MDAsIDB4MjAsIDB4RkQsIDB4N0QsIDB4MjgsCisJIDB4MjksIDB4MjgsIDB4MjMsIDB4MzQsIDB4MDgsIDB4MDAsIDB4MjEsIDB4RkQsIDB4N0QsIDB4MjgsIDB4MjksIDB4MjgsIDB4MjcsIDB4MzQsIDB4MEEsIDB4MDAsCisJIDB4MjIsIDB4RkQsIDB4N0QsIDB4MjgsIDB4MjksIDB4MjgsIDB4MkMsIDB4MzQsIDB4MTYsIDB4MDAsIDB4MjMsIDB4RkQsIDB4N0QsIDB4MjgsIDB4MjksIDB4MjgsCisJIDB4MzcsIDB4MzQsIDB4MEEsIDB4MDAsIDB4MTAsIDB4RkQsIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4NzQsIDB4MDEsIDB4MDIsIDB4MDAsIDB4NDUsIDB4RkQsCisJIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDAsIDB4NDcsIDB4RkQsIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4NzgsIDB4MDEsCisJIDB4MDIsIDB4MDAsIDB4NDgsIDB4RkQsIDB4OUEsIDB4MjksIDB4MjksIDB4MjgsIDB4QTAsIDB4MDEsIDB4MDIsIDB4MDAsIDB4NDksIDB4RkQsIDB4OUEsIDB4MjksCisJIDB4MjksIDB4MjgsIDB4QTIsIDB4MDEsIDB4MDIsIDB4MDAsIDB4NEEsIDB4RkQsIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4OTgsIDB4MDEsIDB4MDIsIDB4MDAsCisJIDB4NEIsIDB4RkQsIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4OUEsIDB4MDEsIDB4MDIsIDB4MDAsIDB4NEQsIDB4RkQsIDB4N0QsIDB4MjgsIDB4MjksIDB4MjgsCisJIDB4M0MsIDB4MzQsIDB4MDQsIDB4MDAsIDB4NEYsIDB4RkQsIDB4QUUsIDB4MjksIDB4MjksIDB4MjgsIDB4MUEsIDB4MkQsIDB4MDIsIDB4MDAsIDB4QzAsIDB4RkQsCisJIDB4N0QsIDB4MjgsIDB4MjksIDB4MjgsIDB4M0UsIDB4MzQsIDB4MDIsIDB4MDAsIDB4QzIsIDB4RkQsIDB4QTQsIDB4MjksIDB4MjksIDB4MjgsIDB4MDAsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4QzMsIDB4RkQsIDB4N0QsIDB4MjgsIDB4MjksIDB4MjgsIDB4M0YsIDB4MzQsIDB4MDIsIDB4MDAsIDB4NDAsIDB4RkQsIDB4NzUsIDB4MjgsCisJIDB4MjksIDB4MjgsIDB4QjgsIDB4MDEsIDB4MDIsIDB4MDAsIDB4MjQsIDB4RkQsIDB4Q0IsIDB4MjksIDB4MjksIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsCisJIDB4OTEsIDB4RkQsIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4MjAsIDB4MjQsIDB4MDIsIDB4MDAsIDB4OTMsIDB4RkQsIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsCisJIDB4MjYsIDB4MjQsIDB4MDIsIDB4MDAsIDB4QzEsIDB4RkQsIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4RkUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4QzYsIDB4RkQsCisJIDB4QUEsIDB4MjgsIDB4MjksIDB4MjgsIDB4MjgsIDB4MkQsIDB4MEEsIDB4MDAsIDB4ODksIDB4RkQsIDB4NUIsIDB4MjksIDB4MjksIDB4MjgsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4OEEsIDB4RkQsIDB4OUEsIDB4MjgsIDB4MjksIDB4MjgsIDB4QTAsIDB4MkQsIDB4MjQsIDB4MDAsIDB4NDEsIDB4RkQsIDB4NEMsIDB4MjgsCisJIDB4MjksIDB4MjgsIDB4N0EsIDB4MkQsIDB4MjIsIDB4MDAsIDB4NDIsIDB4RkQsIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4MDIsIDB4MDEsIDB4MDYsIDB4MDAsCisJIDB4NDMsIDB4RkQsIDB4RDgsIDB4MjksIDB4MjksIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4NDQsIDB4RkQsIDB4QjgsIDB4MjksIDB4MjksIDB4MjgsCisJIDB4QjQsIDB4MDEsIDB4MDIsIDB4MDAsIDB4NDYsIDB4RkQsIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4QkEsIDB4MDEsIDB4MEMsIDB4MDAsIDB4NEMsIDB4RkQsCisJIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4RUEsIDB4MjksIDB4MDIsIDB4MDAsIDB4NTAsIDB4RkQsIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4RjQsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4NTEsIDB4RkQsIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4RjYsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NTIsIDB4RkQsIDB4NEMsIDB4MjgsCisJIDB4MjksIDB4MjgsIDB4QzYsIDB4MDEsIDB4MDIsIDB4MDAsIDB4OEYsIDB4RkQsIDB4RUIsIDB4MjksIDB4MjksIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsCisJIDB4OTIsIDB4RkQsIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4NTQsIDB4MkQsIDB4MDIsIDB4MDAsIDB4OEMsIDB4RkQsIDB4M0YsIDB4MjgsIDB4MjksIDB4MjgsCisJIDB4MDgsIDB4MkUsIDB4NTYsIDB4MDAsIDB4OEQsIDB4RkQsIDB4M0YsIDB4MjgsIDB4MjksIDB4MjgsIDB4NjIsIDB4MkUsIDB4MTQsIDB4MDAsIDB4MDAsIDB4RjEsCisJIDB4NDYsIDB4MDAsIDB4RTMsIDB4MjcsIDB4M0EsIDB4MDEsIDB4MDEsIDB4RjEsIDB4NDQsIDB4MDcsIDB4RTEsIDB4MjcsIDB4M0MsIDB4MDEsIDB4MDAsIDB4MDMsCisJIDB4MkEsIDB4NjgsIDB4MUUsIDB4MDAsIDB4NzYsIDB4MDEsIDB4RkUsIDB4MDAsIDB4RDYsIDB4MDEsIDB4MDIsIDB4MDEsIDB4M0UsIDB4MDEsIDB4QjgsIDB4MDEsCisJIDB4NzQsIDB4MjcsIDB4NUEsIDB4MDEsIDB4MjAsIDB4MjQsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkEsIDB4MUMsIDB4MDAsIDB4MDAsIDB4QkUsIDB4MUUsCisJIDB4NTQsIDB4MDEsIDB4MEIsIDB4MDAsIDB4QkEsIDB4MDAsIDB4RTQsIDB4MDAsIDB4M0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzQsIDB4QUYsIDB4MzcsIDB4QUYsIDB4NDMsIDB4QjAsCisJIDB4NEMsIDB4QjAsIDB4NDgsIDB4QUYsIDB4REUsIDB4QUYsIDB4QjYsIDB4QUYsIDB4MUMsIDB4MzMsIDB4N0YsIDB4MzIsIDB4MUMsIDB4MzMsIDB4RjMsIDB4MzIsCisJIDB4ODksIDB4MzIsIDB4N0QsIDB4MzIsIDB4M0IsIDB4MzMsIDB4NEMsIDB4MzMsIDB4NEMsIDB4MzMsIDB4NEMsIDB4MzMsIDB4NTUsIDB4MzMsIDB4NzAsIDB4MzMsCisJIDB4Q0QsIDB4MzMsIDB4RTksIDB4MzMsIDB4RjQsIDB4MzIsIDB4MDcsIDB4MzMsIDB4REIsIDB4MzIsIDB4MTAsIDB4MDAsIDB4MTIsIDB4MDAsIDB4MTMsIDB4MDAsCisJIDB4MjAsIDB4MDAsIDB4MjEsIDB4MDAsIDB4MjIsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MzEsIDB4MDAsIDB4MzIsIDB4MDAsIDB4MzMsIDB4MDAsIDB4MzQsIDB4MDAsCisJIDB4MzUsIDB4MDAsIDB4MzYsIDB4MDAsIDB4MzcsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MzksIDB4MDAsIDB4M0EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDEsCisJIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsIDB4RjMsIDB4MDIsCisJIDB4QUQsIDB4MDMsIDB4NjAsIDB4MDQsIDB4MDQsIDB4MDUsIDB4MDcsIDB4MDYsIDB4MDgsIDB4MDcsIDB4MEEsIDB4MDgsIDB4MTYsIDB4MDksIDB4NDQsIDB4MEEsCisJIDB4MDQsIDB4MEIsIDB4NDAsIDB4MEMsIDB4ODAsIDB4MEQsIDB4MDAsIDB4MEUsIDB4ODQsIDB4MEYsIDB4MDEsIDB4MTAsIDB4MTAsIDB4MTEsIDB4MDIsIDB4MTQsCisJIDB4NDAsIDB4MjAsIDB4MzIsIDB4MjEsIDB4MzIsIDB4MjIsIDB4MDQsIDB4MjMsIDB4MDEsIDB4MjQsIDB4MEYsIDB4MjUsIDB4MDAsIDB4MjYsIDB4MDAsIDB4MjcsCisJIDB4MDAsIDB4MjgsIDB4MDAsIDB4MjksIDB4MDAsIDB4MkEsIDB4MDEsIDB4MkIsIDB4MDYsIDB4MkMsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MzksIDB4RDYsIDB4M0EsCisJIDB4MDAsIDB4M0IsIDB4MDAsIDB4M0MsIDB4MTQsIDB4M0QsIDB4N0YsIDB4M0UsIDB4MDAsIDB4M0YsIDB4NjgsIDB4NDAsIDB4NzUsIDB4NDEsIDB4MDcsIDB4NDIsCisJIDB4MDcsIDB4NDMsIDB4MDAsIDB4NDUsIDB4M0IsIDB4NEEsIDB4MDAsIDB4NEIsIDB4MDAsIDB4NEMsIDB4MEYsIDB4NEQsIDB4MDIsIDB4NzUsIDB4MDAsIDB4NzYsCisJIDB4ODAsIDB4MDAsIDB4MDgsIDB4MDEsIDB4MDksIDB4MDEsIDB4MDksIDB4MDEsIDB4MEEsIDB4MDEsIDB4MEEsIDB4MDEsIDB4MEIsIDB4MDEsIDB4MEIsIDB4MDEsCisJIDB4MEMsIDB4MDEsIDB4MEMsIDB4MDEsIDB4MEQsIDB4MDEsIDB4MEQsIDB4MDEsIDB4MEUsIDB4MDEsIDB4MEUsIDB4MDEsIDB4MEYsIDB4MDEsIDB4MEYsIDB4MDEsCisJIDB4MTAsIDB4MDEsIDB4MTAsIDB4MDEsIDB4MTEsIDB4MDEsIDB4MTEsIDB4MDEsIDB4MTIsIDB4MDEsIDB4MTIsIDB4MDEsIDB4MTMsIDB4MDEsIDB4MTMsIDB4MDEsCisJIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsIDB4MTUsIDB4MDEsIDB4MTUsIDB4MDEsIDB4MTYsIDB4MDEsIDB4MTYsIDB4MDEsIDB4MTcsIDB4MDEsIDB4MTcsIDB4MDEsCisJIDB4MTgsIDB4MDEsIDB4MTgsIDB4MDEsIDB4MTksIDB4MDEsIDB4MTksIDB4MDEsIDB4NEQsIDB4MDEsIDB4NEQsIDB4MDEsIDB4NEUsIDB4MDEsIDB4NEUsIDB4MDEsCisJIDB4NEYsIDB4MDEsIDB4NEYsIDB4MDEsIDB4NTAsIDB4MDEsIDB4NTAsIDB4MDEsIDB4NTEsIDB4MDEsIDB4NTEsIDB4MDEsIDB4NTIsIDB4MDEsIDB4NTIsIDB4MDEsCisJIDB4NTMsIDB4MDEsIDB4NTMsIDB4MDEsIDB4NTQsIDB4MDEsIDB4NTQsIDB4MDEsIDB4NjUsIDB4MDEsIDB4NjUsIDB4MDEsIDB4NjYsIDB4MDEsIDB4NjYsIDB4MDEsCisJIDB4NjcsIDB4MDEsIDB4NjcsIDB4MDEsIDB4NjgsIDB4MDEsIDB4NjgsIDB4MDEsIDB4NjksIDB4MDEsIDB4NjksIDB4MDEsIDB4NkEsIDB4MDEsIDB4NkEsIDB4MDEsCisJIDB4NkIsIDB4MDEsIDB4NkIsIDB4MDEsIDB4NkMsIDB4MDEsIDB4NkMsIDB4MDEsIDB4NkQsIDB4MDEsIDB4NkQsIDB4MDEsIDB4NkUsIDB4MDEsIDB4NkUsIDB4MDEsCisJIDB4NkYsIDB4MDEsIDB4NkYsIDB4MDEsIDB4NzAsIDB4MDEsIDB4NzAsIDB4MDEsIDB4NzEsIDB4MDEsIDB4NzEsIDB4MDEsIDB4NzIsIDB4MDEsIDB4NzIsIDB4MDEsCisJIDB4NzMsIDB4MDEsIDB4NzMsIDB4MDEsIDB4NzQsIDB4MDEsIDB4NzQsIDB4MDEsIDB4NzUsIDB4MDEsIDB4NzUsIDB4MDEsIDB4NzYsIDB4MDEsIDB4NzYsIDB4MDEsCisJIDB4NzcsIDB4MDEsIDB4NzcsIDB4MDEsIDB4NzgsIDB4MDEsIDB4NzgsIDB4MDEsIDB4NzksIDB4MDEsIDB4NzksIDB4MDEsIDB4N0EsIDB4MDEsIDB4N0EsIDB4MDEsCisJIDB4N0IsIDB4MDEsIDB4N0IsIDB4MDEsIDB4N0MsIDB4MDEsIDB4N0MsIDB4MDEsIDB4N0QsIDB4MDEsIDB4N0QsIDB4MDEsIDB4N0UsIDB4MDEsIDB4N0UsIDB4MDEsCisJIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsCisJIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsCisJIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsCisJIDB4N0YsIDB4MDEsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsCisJIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTMsCisJIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsCisJIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsCisJIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsCisJIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsCisJIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjMsIDB4NDYsIDB4MjMsIDB4NDYsCisJIDB4MjMsIDB4NDYsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsCisJIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUQsIDB4NDcsIDB4OUEsIDB4NDgsCisJIDB4REEsIDB4NDgsIDB4MUEsIDB4NDgsIDB4NUEsIDB4NDgsIDB4OUEsIDB4NDgsIDB4REEsIDB4NDgsIDB4MUEsIDB4NDgsIDB4NUEsIDB4NDgsIDB4OUEsIDB4NDgsCisJIDB4REEsIDB4NDgsIDB4MUEsIDB4NDgsIDB4NUEsIDB4NDgsIDB4OUEsIDB4NDgsIDB4MzMsIDB4NDgsIDB4NzgsIDB4NDksIDB4NzgsIDB4NDksIDB4NzksIDB4NDksCisJIDB4NzksIDB4NDksIDB4NzksIDB4NDksIDB4NzksIDB4NDksIDB4N0EsIDB4NDksIDB4N0EsIDB4NDksIDB4N0EsIDB4NDksIDB4N0EsIDB4NDksIDB4N0IsIDB4NDksCisJIDB4N0IsIDB4NDksIDB4N0IsIDB4NDksIDB4N0MsIDB4NDksIDB4MzIsIDB4MDAsIDB4NDYsIDB4MDAsIDB4NUEsIDB4MDAsIDB4NkUsIDB4MDAsIDB4ODIsIDB4MDAsCisJIDB4OTYsIDB4MDAsIDB4QUEsIDB4MDAsIDB4QkUsIDB4MDAsIDB4RDIsIDB4MDAsIDB4RTYsIDB4MDAsIDB4RkEsIDB4MDAsIDB4MEUsIDB4MDEsIDB4MjIsIDB4MDEsCisJIDB4NTIsIDB4MDEsIDB4MDUsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDMsIDB4MDAsCisJIDB4MDMsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDMsIDB4MDAsIDB4MTUsIDB4MDAsIDB4NkUsIDB4NkYsIDB4NkUsIDB4MkQsIDB4NzMsIDB4NzAsIDB4NjUsIDB4NjMsIDB4NjksIDB4NjYsIDB4NjksIDB4NjUsCisJIDB4NjQsIDB4MjAsIDB4NTMsIDB4NTMsIDB4NDksIDB4NDQsIDB4MjAsIDB4MjEsIDB4MjEsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NjQsIDB4MDAsIDB4NjQsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4NDgsIDB4NDUsIDB4NTIsIDB4NEQsIDB4NDUsIDB4NTMsIDB4MjAsIDB4MzIsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDMsIDB4MDAsIDB4MTUsIDB4MDAsIDB4NkUsIDB4NkYsIDB4NkUsIDB4MkQsIDB4NzMsIDB4NzAsIDB4NjUsIDB4NjMsIDB4NjksIDB4NjYsIDB4NjksIDB4NjUsCisJIDB4NjQsIDB4MjAsIDB4NTMsIDB4NTMsIDB4NDksIDB4NDQsIDB4MjAsIDB4MjEsIDB4MjEsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MDEsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NjQsIDB4MDAsIDB4NjQsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4NDgsIDB4NDUsIDB4NTIsIDB4NEQsIDB4NDUsIDB4NTMsIDB4MjAsIDB4MzIsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4NDYsIDB4NjksIDB4NzIsIDB4NzMsIDB4NzQsIDB4MjAsIDB4NTcsIDB4NjEsIDB4NzYsIDB4NjUsIDB4NEMsIDB4NDEsIDB4NEUsIDB4MjAsIDB4NDksIDB4NDksCisJIDB4MjAsIDB4NTMsIDB4NTMsIDB4NDksIDB4NDQsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MDAsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MTksIDB4MDAsIDB4MDIsIDB4MDEsIDB4ODIsIDB4ODQsIDB4OEIsIDB4OTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MUUsIDB4ODUsIDB4MDAsIDB4MDEsCisJIDB4N0YsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsCisJIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4NDMsIDB4NzUsIDB4NzIsIDB4NzIsIDB4NjUsIDB4NkUsIDB4NzQsIDB4MjAsIDB4NTMsCisJIDB4NjUsIDB4NzIsIDB4NzYsIDB4NjksIDB4NjMsIDB4NjUsIDB4MjAsIDB4NTMsIDB4NjUsIDB4NzQsIDB4MjAsIDB4NDksIDB4NjQsIDB4NjUsIDB4NkUsIDB4NzQsCisJIDB4NjksIDB4NjYsIDB4NjksIDB4NjUsIDB4NzIsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4REQsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDEsCisJIDB4MDEsIDB4MDAsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDUsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDIsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDQsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDAsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDEsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MTUsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MTUsIDB4MDAsIDB4MzYsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MTQsIDB4MDAsCisJIDB4MTEsIDB4MDAsIDB4MzYsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDQsIDB4MDAsIDB4N0EsIDB4MkQsIDB4MjgsIDB4MkQsIDB4MEMsIDB4MkYsIDB4MTAsIDB4MkYsCisJIDB4MTQsIDB4MkYsIDB4QTAsIDB4MkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzYsIDB4MjksIDB4MjgsIDB4MkQsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4N0EsIDB4MkQsIDB4MjgsIDB4MkQsIDB4MEMsIDB4MkYsIDB4MTAsIDB4MkYsIDB4MTQsIDB4MkYsIDB4QTAsIDB4MkQsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N0EsIDB4MkQsIDB4MjgsIDB4MkQsIDB4RkYsIDB4RkYsIDB4RTYsIDB4MkQsCisJIDB4MzQsIDB4MkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDMsIDB4MDAsIDB4MDIsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDcsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsCisJIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisKK307ICAvKiBmd19pbWFnZV8yX2RhdGEgKi8KKworc3RhdGljIGNvbnN0IGhjZl84IGZ3X2ltYWdlXzNfZGF0YVtdID0geworCSAweDAwLCAweEUxLCAweDMwLCAweDQwLCAweDAyLCAweDM2LCAweEExLCAweEZGLCAweDgzLCAweEZGLCAweDhELCAweEZGLCAweDVDLCAweDQ0LCAweDVDLCAweDQzLAorCSAweDVDLCAweDQyLCAweDVDLCAweDQxLCAweDVDLCAweDQwLCAweEFDLCAweEZGLCAweEFELCAweEZGLCAweEU3LCAweEUxLCAweEFELCAweDYwLCAweDA4LCAweDc4LAorCSAweEZGLCAweEZGLCAweDMwLCAweDQ0LCAweDAyLCAweEE4LCAweDAwLCAweEUxLCAweDAzLCAweDAyLCAweDI4LCAweEUyLCAweDQwLCAweEZGLCAweEExLCAweEZGLAorCSAweDg0LCAweEZGLCAweEJCLCAweDYwLCAweDE4LCAweDY0LCAweDQwLCAweDQyLCAweEIwLCAweDYwLCAweDk3LCAweDY0LCAweDQwLCAweDQwLCAweEJELCAweEYzLAorCSAweDgwLCAweEZCLCAweDBGLCAweDYwLCAweDlBLCAweDYzLCAweENBLCAweEYzLCAweEJELCAweERCLCAweDAwLCAweDYwLCAweDlBLCAweDY0LCAweEJELCAweERCLAorCSAweDAyLCAweDY0LCAweEJELCAweERCLCAweDA0LCAweDY0LCAweEEzLCAweERCLCAweDVDLCAweDQ5LCAweDBBLCAweDY0LCAweDQwLCAweDRCLCAweDVDLCAweDVDLAorCSAweDAxLCAweDYwLCAweDM5LCAweEUyLCAweDA0LCAweDYwLCAweDAwLCAweDdBLCAweDg5LCAweEZGLCAweDAzLCAweDYwLCAweEZGLCAweDczLCAweDg4LCAweEZGLAorCSAweEIwLCAweDYwLCAweDk3LCAweDc4LCAweEZGLCAweEZGLCAweDMwLCAweDQ0LCAweDAyLCAweEE4LCAweDAwLCAweEUxLCAweDA2LCAweDAyLCAweDQwLCAweEZGLAorCSAweDQyLCAweEZGLCAweDQzLCAweEZGLCAweDQ0LCAweEZGLCAweDQ1LCAweEZGLCAweEExLCAweEZGLCAweDg4LCAweEZGLCAweDg1LCAweEZGLCAweDIxLCAweEUxLAorCSAweDVDLCAweDQwLCAweEJCLCAweDYwLCAweDIwLCAweDc4LCAweEZGLCAweEZGLCAweEEyLCAweEZGLCAweDMwLCAweDQ0LCAweDAyLCAweEE4LCAweDAwLCAweEUxLAorCSAweDAxLCAweDAyLCAweEExLCAweEZGLCAweDg2LCAweEZGLCAweDg4LCAweEZGLCAweDVDLCAweDQ2LCAweDVDLCAweDQ5LCAweDVDLCAweDQwLCAweEU3LCAweDYwLAorCSAweDU4LCAweDRGLCAweDMxLCAweDc4LCAweEZGLCAweEZGLCAweEM3LCAweDYwLCAweDU4LCAweDRGLCAweEY2LCAweDc4LCAweEZGLCAweEZGLCAweENBLCAweDYwLAorCSAweDU4LCAweDRGLCAweDgzLCAweDc4LCAweEZGLCAweEZGLCAweERELCAweDYwLCAweDU4LCAweDRGLCAweDNELCAweDc4LCAweEZGLCAweEZGLCAweDFCLCAweDYwLAorCSAweDU4LCAweDRGLCAweDM3LCAweDc4LCAweEZGLCAweEZGLCAweEVDLCAweDYwLCAweDU4LCAweDRGLCAweDc1LCAweDc4LCAweEZGLCAweEZGLCAweEUwLCAweDYwLAorCSAweDU4LCAweDRGLCAweDFCLCAweDc4LCAweEZGLCAweEZGLCAweEU0LCAweDYwLCAweDU4LCAweDRGLCAweERDLCAweDc4LCAweEZGLCAweEZGLCAweEYzLCAweDYwLAorCSAweDU4LCAweDRGLCAweEVCLCAweDc4LCAweEZGLCAweEZGLCAweDEzLCAweEUxLCAweEEzLCAweEZGLCAweEJGLCAweDYwLCAweEU3LCAweDc4LCAweEZGLCAweEZGLAorCSAweDAzLCAweEUxLCAweEEzLCAweEZGLCAweEZFLCAweEZDLCAweEZGLCAweEZDLCAweDIzLCAweDYwLCAweEY0LCAweDYzLCAweDE3LCAweEZELCAweEFFLCAweEZGLAorCSAweDI1LCAweDYwLCAweDExLCAweDc4LCAweEZGLCAweEZGLCAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDA4LCAweDI2LCAweDFBLCAweDAwLAorCSAweDgwLCAweDNBLCAweDE1LCAweDAwLCAweDgxLCAweEYxLCAweDMyLCAweEYyLCAweDMzLCAweEYyLCAweEQwLCAweDgwLCAweDgyLCAweEYxLCAweDBGLCAweDAyLAorCSAweEQwLCAweDgwLCAweDM0LCAweEYyLCAweDgzLCAweEYxLCAweDBCLCAweDAyLCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA4LCAweDAyLCAweERGLCAweDYwLAorCSAweDU4LCAweDRGLCAweDI4LCAweDc4LCAweEZGLCAweEZGLCAweDIwLCAweDYwLCAweDU4LCAweDRGLCAweEJGLCAweDc4LCAweEZGLCAweEZGLCAweDE5LCAweDYwLAorCSAweEU4LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweEY0LCAweEFBLCAweDYwLCAweEFBLCAweDY1LCAweDA5LCAweEYyLCAweDVBLCAweEQwLCAweEQ0LCAweDgwLAorCSAweDAzLCAweDY0LCAweDEyLCAweDAyLCAweEQwLCAweDgwLCAweDFELCAweDYwLCAweDYwLCAweDY1LCAweDBFLCAweDAyLCAweDVBLCAweEQyLCAweEZGLCAweEZGLAorCSAweEQ0LCAweDgwLCAweDAxLCAweDYwLCAweDAwLCAweDY1LCAweDA4LCAweDAyLCAweDVBLCAweEQyLCAweEZGLCAweEZGLCAweEQ0LCAweDgwLCAweEZGLCAweEZGLAorCSAweDAzLCAweDAyLCAweDE5LCAweDYwLCAweEU4LCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDYwLCAweEQ2LCAweDY1LCAweEE1LCAweEQxLCAweDVBLCAweEQxLAorCSAweDQ0LCAweDQ4LCAweDVBLCAweEQxLCAweDQ0LCAweDRBLCAweDI2LCAweDQ2LCAweDNGLCAweEYyLCAweDAwLCAweEY0LCAweDQ0LCAweDRDLCAweEQ4LCAweDgzLAorCSAweDcwLCAweDYxLCAweDY4LCAweDY1LCAweEQ3LCAweDgwLCAweEZGLCAweEZGLCAweDA3LCAweDBFLCAweDA4LCAweEYyLCAweDA4LCAweDAwLCAweDY4LCAweDY1LAorCSAweEQ3LCAweDgwLCAweEZGLCAweEZGLCAweDAxLCAweDBFLCAweDAzLCAweDAwLCAweDE5LCAweDYwLCAweEZFLCAweDc4LCAweEZGLCAweEZGLCAweDU4LCAweDRGLAorCSAweDc5LCAweDAwLCAweDlDLCAweDgwLCAweDAxLCAweDY1LCAweDAyLCAweDAyLCAweDAwLCAweDY1LCAweDAyLCAweDAwLCAweEZGLCAweDNCLCAweEY3LCAweDAxLAorCSAweDU4LCAweDRGLCAweDcwLCAweDAwLCAweDlDLCAweDgwLCAweDQ1LCAweDQyLCAweEVBLCAweDAyLCAweDU4LCAweDRGLCAweDZCLCAweDAwLCAweDlDLCAweDgwLAorCSAweEZGLCAweEZGLCAweEU1LCAweDAyLCAweDU4LCAweDRGLCAweDY2LCAweDAwLCAweDlDLCAweDgwLCAweEZGLCAweEZGLCAweDAzLCAweDAyLCAweDAwLCAweDY1LAorCSAweDQ1LCAweDQyLCAweEY4LCAweDAxLCAweEZGLCAweDNBLCAweDI5LCAweDAwLCAweDYwLCAweDQ3LCAweEZGLCAweEI1LCAweDI4LCAweDQ0LCAweEZGLCAweEI0LAorCSAweDk0LCAweDgwLCAweEZGLCAweEZGLCAweEQ0LCAweDAyLCAweDYwLCAweDQ1LCAweDI4LCAweDQ3LCAweDJBLCAweDVGLCAweDQwLCAweDQ4LCAweDJBLCAweDQ3LAorCSAweDJDLCAweDVGLCAweDQwLCAweDRBLCAweDJDLCAweDQ3LCAweDY1LCAweDVGLCAweDQwLCAweDRDLCAweDEwLCAweDY0LCAweDQwLCAweDQyLCAweDI4LCAweDQ1LAorCSAweDA1LCAweDAwLCAweDU4LCAweDRGLCAweDQ3LCAweDAwLCAweDk0LCAweDgwLCAweDI4LCAweDQ1LCAweDI2LCAweDAyLCAweDU4LCAweDRGLCAweDQyLCAweDAwLAorCSAweDk0LCAweDgwLCAweDJBLCAweDQ1LCAweDIxLCAweDAyLCAweDU4LCAweDRGLCAweDNELCAweDAwLCAweDk0LCAweDgwLCAweEZGLCAweEZGLCAweDFDLCAweDAyLAorCSAweDIyLCAweDQ0LCAweDRDLCAweDgyLCAweDJDLCAweDQ1LCAweDMxLCAweDAzLCAweEVDLCAweDAxLCAweDEwLCAweDY1LCAweDQ1LCAweDQyLCAweDI4LCAweDQ1LAorCSAweDk0LCAweDgwLCAweDJBLCAweDQ1LCAweDIxLCAweDAyLCAweDU4LCAweDRGLCAweDJELCAweDAwLCAweDk0LCAweDgwLCAweDJDLCAweDQ1LCAweDFDLCAweDAyLAorCSAweDU4LCAweDRGLCAweDI4LCAweDAwLCAweDk0LCAweDgwLCAweEZGLCAweEZGLCAweDE3LCAweDAyLCAweDIyLCAweDQ0LCAweDRDLCAweDgyLCAweDI4LCAweDQ1LAorCSAweDFDLCAweDAzLCAweDU4LCAweDRGLCAweDFGLCAweDAwLCAweEVDLCAweDAxLCAweDQwLCAweDRCLCAweDI4LCAweDQ3LCAweDQwLCAweDQ4LCAweDJBLCAweDQ3LAorCSAweDQwLCAweDRBLCAweDJDLCAweDQ3LCAweDYwLCAweDQ1LCAweDJBLCAweDVFLCAweDQwLCAweDRDLCAweDJBLCAweDQ0LCAweDI4LCAweDVFLCAweDQwLCAweDRBLAorCSAweDI4LCAweDQ0LCAweDY1LCAweDVFLCAweDQwLCAweDQ4LCAweDJCLCAweDQ0LCAweDY4LCAweDY1LCAweEQ3LCAweDgwLCAweEZGLCAweEZGLCAweDE3LCAweDBFLAorCSAweDkwLCAweDAxLCAweDI2LCAweDQ2LCAweEM1LCAweDYwLCAweDVCLCAweDc4LCAweEZGLCAweEZGLCAweEI5LCAweEZGLCAweDI2LCAweDQ2LCAweEM1LCAweDYwLAorCSAweDVCLCAweDc4LCAweEZGLCAweEZGLCAweEM5LCAweDgxLCAweENCLCAweDgzLCAweDA3LCAweDFDLCAweDAxLCAweDFELCAweDA4LCAweDAwLCAweDAwLCAweEY0LAorCSAweDAxLCAweEYyLCAweEZGLCAweEZGLCAweEZGLCAweEI0LCAweEQ4LCAweDgxLCAweDVBLCAweEQyLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LAorCSAweEM1LCAweDYwLCAweDU4LCAweDRGLCAweDc4LCAweDc4LCAweEZGLCAweEZGLCAweDAyLCAweDYwLCAweDAwLCAweDYzLCAweDAwLCAweEY0LCAweDg0LCAweDY1LAorCSAweDc4LCAweDYxLCAweEE1LCAweEQwLCAweERBLCAweDg1LCAweDgwLCAweDNBLCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDA0LCAweDY1LCAweDY0LCAweDQ0LAorCSAweDAwLCAweDdGLCAweENELCAweDgxLCAweEJELCAweERCLCAweDA1LCAweDAzLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweENELCAweDgxLCAweEJELCAweERCLAorCSAweEYwLCAweDAyLCAweDFDLCAweDYwLCAweEFDLCAweDYzLCAweDI5LCAweDYwLCAweEVDLCAweDY0LCAweDA4LCAweDY1LCAweEM0LCAweDgxLCAweDYxLCAweDQ0LAorCSAweEEzLCAweERCLCAweDFDLCAweDYwLCAweEFBLCAweDYxLCAweDAwLCAweDY0LCAweEExLCAweERCLCAweDI5LCAweDYwLCAweEVDLCAweDYxLCAweEExLCAweEQzLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQzLCAweDFDLCAweDYwLCAweEIwLCAweDYxLCAweEExLCAweERELCAweDFDLCAweDYwLCAweEIwLCAweDYxLCAweEExLCAweEQzLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQ1LCAweDFDLCAweDYwLCAweEFBLCAweDYxLCAweEExLCAweEQzLCAweEZGLCAweEZGLCAweEQ0LCAweDgwLCAweEZGLCAweEZGLAorCSAweDAxLCAweDAzLCAweDAzLCAweDAwLCAweDFBLCAweDYwLCAweEQ2LCAweDc4LCAweEZGLCAweEZGLCAweDFDLCAweDYwLCAweEE4LCAweDYxLCAweDAxLCAweDY0LAorCSAweEExLCAweERCLCAweDAyLCAweDYwLCAweDAwLCAweDYxLCAweDQxLCAweDRDLCAweDAzLCAweDYwLCAweDAwLCAweDYxLCAweDQxLCAweDRBLCAweDFDLCAweDYwLAorCSAweEFDLCAweDYxLCAweEExLCAweEQzLCAweEZGLCAweEZGLCAweDQwLCAweDQ4LCAweDFDLCAweDYwLCAweEIyLCAweDYzLCAweDI4LCAweDQxLCAweDA2LCAweDY1LAorCSAweEQ1LCAweDgxLCAweEExLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDI2LCAweDAxLCAweEE0LCAweDYwLCAweDQxLCAweEEzLCAweERCLAorCSAweDJBLCAweDQzLCAweDI4LCAweDQ1LCAweEE1LCAweEQxLCAweERBLCAweDg1LCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweENELCAweDgxLCAweEJELCAweERCLAorCSAweDA1LCAweDAzLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweENELCAweDgxLCAweEJELCAweERCLCAweEY0LCAweDAyLCAweDI4LCAweDQxLCAweDFDLCAweDYwLAorCSAweEIyLCAweDYzLCAweEEzLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQ1LCAweDQ1LCAweDhCLCAweDFDLCAweDYwLCAweEFFLCAweDYxLCAweDJCLCAweEQzLAorCSAweEExLCAweERCLCAweDJDLCAweDQxLCAweDI4LCAweDQyLCAweDRBLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQ1LCAweDQ1LCAweDhDLCAweDAwLCAweDdGLAorCSAweDAxLCAweDdFLCAweDQwLCAweDQ4LCAweDFDLCAweDYwLCAweEIyLCAweDYxLCAweEExLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQ1LCAweDAwLCAweDY0LAorCSAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDQzLCAweDAzLCAweDY1LCAweDQ0LCAweEZGLCAweEE0LCAweEExLCAweERCLCAweDFDLCAweDYwLCAweEFFLCAweDYxLAorCSAweEExLCAweEQzLCAweDI4LCAweDQ1LCAweEE0LCAweDgwLCAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDJDLCAweEQzLCAweDJBLCAweEQzLCAweDYwLCAweDQ1LAorCSAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDAxLCAweDAzLCAweDE0LCAweDAwLCAweDI4LCAweDQ0LCAweEUwLCAweDg0LCAweEZGLCAweEZGLCAweDAyLCAweDI0LAorCSAweDAxLCAweDAwLCAweDA4LCAweDAwLCAweDJCLCAweDQ0LCAweDU4LCAweDhCLCAweDFDLCAweDYwLCAweEFFLCAweDYzLCAweDJCLCAweEQzLCAweEEzLCAweERCLAorCSAweDAwLCAweDdGLCAweDAxLCAweDdFLCAweDQwLCAweDQ4LCAweDJBLCAweDQ0LCAweDU4LCAweDhBLCAweDJDLCAweDQ0LCAweDU4LCAweDhDLCAweEQyLCAweDAxLAorCSAweDFDLCAweDYwLCAweEE4LCAweDYxLCAweDAwLCAweDY0LCAweEExLCAweERCLCAweDFDLCAweDYwLCAweEFDLCAweDYxLCAweEExLCAweEQzLCAweEZGLCAweEZGLAorCSAweDYwLCAweDQ1LCAweEZBLCAweEE0LCAweDYwLCAweDQxLCAweEExLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQxLCAweEM1LCAweDgxLCAweDA2LCAweEExLAorCSAweDQxLCAweDQ4LCAweDY1LCAweDQxLCAweEZDLCAweEExLCAweEExLCAweEQzLCAweDI4LCAweDQxLCAweDYwLCAweDQwLCAweDAxLCAweDI2LCAweDAxLCAweEE0LAorCSAweDYwLCAweDQ1LCAweEM1LCAweDgxLCAweDYxLCAweDQzLCAweDFDLCAweDYwLCAweEFDLCAweDYxLCAweEExLCAweERELCAweDFDLCAweDYwLCAweEE4LCAweDYxLAorCSAweEExLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDI2LCAweDBELCAweDAwLCAweDFDLCAweDYwLCAweEFBLCAweDYxLCAweEExLCAweEQzLAorCSAweEZGLCAweEZGLCAweDAxLCAweEE0LCAweEExLCAweERCLCAweEZGLCAweEZGLCAweDFBLCAweDYwLCAweDJDLCAweDc4LCAweEZGLCAweEZGLCAweDE5LCAweDYwLAorCSAweEU4LCAweDc4LCAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweEVDLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY2LCAweDAxLCAweDYwLCAweEJBLCAweDYxLAorCSAweDFGLCAweDYwLCAweDA4LCAweDYzLCAweEExLCAweEQzLCAweDA0LCAweEExLCAweDIwLCAweDdGLCAweEJELCAweERCLCAweDMyLCAweDdFLCAweDIxLCAweDdGLAorCSAweEJELCAweERCLCAweEExLCAweEQzLCAweEZGLCAweEZGLCAweDIyLCAweDdGLCAweEEzLCAweERCLCAweDEwLCAweDAwLCAweDAxLCAweDYwLCAweEJBLCAweDYxLAorCSAweDFGLCAweDYwLCAweDA4LCAweDYzLCAweEExLCAweEQzLCAweDAwLCAweDY2LCAweDIwLCAweDdGLCAweEJELCAweERCLCAweDU5LCAweEQzLCAweEZGLCAweEZGLAorCSAweDIxLCAweDdGLCAweEJELCAweERCLCAweDU5LCAweEQzLCAweEZGLCAweEZGLCAweDIyLCAweDdGLCAweEEzLCAweERCLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLAorCSAweEEyLCAweEQxLCAweDlGLCAweDYwLCAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweERFLCAweEZFLCAweDBCLCAweDA0LCAweDBGLCAweDYwLAorCSAweERBLCAweDYyLCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDFBLCAweDYwLCAweEZELCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDI0LCAweDYwLCAweDlBLCAweDYyLCAweDFGLCAweDYwLCAweDA2LCAweDY0LCAweEEyLCAweERCLCAweDIwLCAweDY0LAorCSAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDJELCAweEZGLCAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDIwLCAweDYwLCAweDAwLCAweDY0LCAweEEyLCAweERCLAorCSAweDFCLCAweDYwLCAweDI1LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLAorCSAweEEyLCAweEQxLCAweDlGLCAweDYwLCAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweEJFLCAweEZFLCAweDBGLCAweDYwLCAweEQwLCAweDYyLAorCSAweEEyLCAweEQxLCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDJFLCAweDU4LCAweEZGLCAweEZGLAorCSAweDEwLCAweDYwLCAweDFFLCAweDYyLCAweDFFLCAweDYwLCAweEY0LCAweDY0LCAweEEyLCAweERCLCAweDFBLCAweDYwLCAweDhBLCAweDYyLCAweDAwLCAweDY0LAorCSAweEEyLCAweERCLCAweDA2LCAweEEyLCAweDEwLCAweDYwLCAweDQwLCAweDY0LCAweEEyLCAweERCLCAweDA2LCAweDY0LCAweDVBLCAweERCLCAweDVBLCAweERCLAorCSAweDFBLCAweDYwLCAweDk2LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDA2LCAweEEyLCAweDEwLCAweDYwLCAweDQ0LCAweDY0LCAweEEyLCAweERCLAorCSAweDA2LCAweDY0LCAweDVBLCAweERCLCAweDVBLCAweERCLCAweDFBLCAweDYwLCAweEEyLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDA2LCAweEEyLAorCSAweDEwLCAweDYwLCAweDQ4LCAweDY0LCAweEEyLCAweERCLCAweDA2LCAweDY0LCAweDVBLCAweERCLCAweDVBLCAweERCLCAweEMwLCAweEYxLCAweDFBLCAweDYwLAorCSAweEE2LCAweDYyLCAweEEyLCAweEQ5LCAweDEwLCAweDYwLCAweDNFLCAweDYyLCAweDIwLCAweDYwLCAweDk5LCAweDY0LCAweEEyLCAweERCLCAweDEwLCAweDYwLAorCSAweDQyLCAweDYyLCAweDIwLCAweDYwLCAweEEzLCAweDY0LCAweEEyLCAweERCLCAweDEwLCAweDYwLCAweDQ2LCAweDYyLCAweDIwLCAweDYwLCAweEFELCAweDY0LAorCSAweEEyLCAweERCLCAweDAwLCAweDYwLCAweDcwLCAweDYxLCAweEFFLCAweDYwLCAweDU4LCAweDRELCAweEM0LCAweDc4LCAweEZGLCAweEZGLCAweDY2LCAweDQ0LAorCSAweDYzLCAweEZCLCAweDA0LCAweDY0LCAweDAzLCAweEZBLCAweEE5LCAweEYzLCAweDA3LCAweEZBLCAweDAwLCAweDY0LCAweDNFLCAweEZBLCAweDNGLCAweEZBLAorCSAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweEEyLCAweERCLCAweDFCLCAweDYwLCAweDhBLCAweDY0LCAweDVBLCAweERCLAorCSAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAzLCAweDY0LAorCSAweDZBLCAweEZCLCAweDBGLCAweDRFLCAweEUwLCAweDYwLCAweDU4LCAweDRGLCAweDhFLCAweDc4LCAweEZGLCAweEZGLCAweDBFLCAweDRGLCAweDAwLCAweDY0LAorCSAweDZDLCAweEZCLCAweDYzLCAweEY1LCAweEVCLCAweEYzLCAweDJGLCAweEZBLCAweEVDLCAweEYzLCAweDMwLCAweEZBLCAweEVELCAweEYzLCAweDMxLCAweEZBLAorCSAweDgxLCAweEYzLCAweDJDLCAweEZBLCAweDMyLCAweEZBLCAweDgyLCAweEYzLCAweDJELCAweEZBLCAweDMzLCAweEZBLCAweDgzLCAweEYzLCAweDJFLCAweEZBLAorCSAweDM0LCAweEZBLCAweEJDLCAweEYzLCAweDE5LCAweEZBLCAweDA2LCAweDYwLCAweDgwLCAweDY0LCAweDBFLCAweEZBLCAweDIwLCAweDYwLCAweDU4LCAweDRFLAorCSAweDcxLCAweDc4LCAweEZGLCAweEZGLCAweEY3LCAweDYwLCAweEZGLCAweDY1LCAweDIwLCAweDQ0LCAweDI0LCAweDgwLCAweDBGLCAweDYwLCAweEQwLCAweDYyLAorCSAweEEyLCAweEQxLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLAorCSAweEEyLCAweEQxLCAweEZGLCAweDYwLCAweDhGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweEMxLCAweEYxLCAweDFBLCAweDYwLCAweDlBLCAweDYyLAorCSAweEEyLCAweEQ5LCAweDI0LCAweDYwLCAweEFBLCAweDYyLCAweDFBLCAweDYwLCAweDk2LCAweDY0LCAweEEyLCAweERCLCAweDAyLCAweDY0LCAweDRBLCAweERCLAorCSAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDAwLCAweDY0LCAweDZDLCAweEZCLCAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDAwLCAweDYwLCAweDc0LCAweDY0LAorCSAweEEyLCAweERCLCAweDFCLCAweDYwLCAweERFLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLAorCSAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDA1LCAweDAzLCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweDFFLCAweDYwLCAweEY0LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDQwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LAorCSAweDAzLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweEUwLCAweDAxLCAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LAorCSAweDExLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDIwLCAweDQwLCAweDUwLCAweDI3LCAweEQ2LCAweDAxLCAweEFGLCAweEYzLCAweEZGLCAweEZGLAorCSAweEZFLCAweEEwLCAweEZGLCAweEZGLCAweEQxLCAweDA2LCAweDZDLCAweEYzLCAweEZGLCAweEZGLCAweEY2LCAweEEwLCAweERDLCAweDg0LCAweDAxLCAweDA1LAorCSAweEEyLCAweERCLCAweENBLCAweDAxLCAweDAwLCAweDYwLCAweDEwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweENFLCAweDAzLCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweDAwLCAweDAwLCAweEUwLCAweEYzLCAweDI5LCAweDQ1LCAweEQ0LCAweDgwLCAweDZDLCAweEYzLCAweDAzLCAweDA0LCAweDFDLCAweDYwLAorCSAweDU1LCAweDc4LCAweEZGLCAweEZGLCAweEY2LCAweEEwLCAweEZGLCAweEZGLCAweDAzLCAweDA0LCAweDFDLCAweDYwLCAweDU1LCAweDc4LCAweEZGLCAweEZGLAorCSAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDAwLCAweDYwLCAweDY0LCAweDY0LCAweEEyLCAweERCLCAweDFDLCAweDYwLCAweDJBLCAweDY0LCAweDVBLCAweERCLAorCSAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweDAwLCAweDYwLCAweDA0LCAweDY0LAorCSAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDA1LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDFFLCAweDYwLCAweEY0LCAweDc4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDYwLCAweDQwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDAzLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweEQyLCAweDAxLAorCSAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweEU0LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDIwLCAweDQwLAorCSAweDUwLCAweDI3LCAweERGLCAweDAxLCAweEFGLCAweEYzLCAweEZGLCAweEZGLCAweEZFLCAweEEwLCAweEZGLCAweEZGLCAweEMzLCAweDA2LCAweDZDLCAweEYzLAorCSAweEZGLCAweEZGLCAweEY2LCAweEEwLCAweERDLCAweDg0LCAweDAxLCAweDA1LCAweEEyLCAweERCLCAweEJDLCAweDAxLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLAorCSAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDIwLCAweDQwLCAweDQwLCAweDJCLCAweDBCLCAweDAwLCAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDgwLCAweDYwLAorCSAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDFDLCAweDYwLCAweDU1LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDFDLCAweDYwLCAweDkyLCAweDY1LCAweDAxLCAweDY0LCAweEE1LCAweERCLCAweEMyLCAweEYxLCAweDFBLCAweDYwLCAweDlBLCAweDYyLCAweEEyLCAweEQ5LAorCSAweDBDLCAweDY0LCAweDUzLCAweEZCLCAweDFDLCAweDYwLCAweDc3LCAweDY0LCAweDZCLCAweEZCLCAweDFGLCAweDYwLCAweDcyLCAweDc4LCAweEZGLCAweEZGLAorCSAweDI0LCAweDYwLCAweEFBLCAweDYyLCAweDFBLCAweDYwLCAweEEyLCAweDY0LCAweEEyLCAweERCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLAorCSAweDA0LCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweEZGLCAweDYwLCAweERGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLAorCSAweDg4LCAweEYxLCAweDE5LCAweDYwLCAweDg2LCAweDYzLCAweEQzLCAweDgwLCAweDY4LCAweEZELCAweDVGLCAweDAzLCAweDY4LCAweEYzLCAweEUyLCAweEYxLAorCSAweDYwLCAweDQzLCAweDI5LCAweDQ0LCAweEEzLCAweEQzLCAweEMwLCAweDg1LCAweEQ0LCAweDgwLCAweDVCLCAweEQzLCAweDU2LCAweDA2LCAweDYwLCAweDQzLAorCSAweDA4LCAweEEzLCAweEJFLCAweEQzLCAweDgzLCAweEYxLCAweEEzLCAweEQzLCAweEQwLCAweDgwLCAweDgyLCAweEYxLCAweDA1LCAweDAyLCAweEJGLCAweEQzLAorCSAweEQwLCAweDgwLCAweDgxLCAweEYxLCAweDAxLCAweDAyLCAweEQwLCAweDgwLCAweEY4LCAweEEzLCAweDJCLCAweDAyLCAweDFDLCAweDYwLCAweEFCLCAweDY0LAorCSAweDZCLCAweEZCLCAweDFGLCAweDYwLCAweDI5LCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweEIwLCAweDg0LCAweEYzLCAweDNFLCAweDAzLCAweDYzLCAweEY1LAorCSAweDQ4LCAweDdFLCAweDJBLCAweEZBLCAweDI0LCAweDYwLCAweDc0LCAweDYyLCAweDI0LCAweDYwLCAweDI4LCAweDY0LCAweEEyLCAweERCLCAweDY2LCAweDQ0LAorCSAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEMxLCAweEZFLCAweDBGLCAweDYwLCAweERBLCAweDYyLAorCSAweDAwLCAweDYwLCAweDAxLCAweDY0LCAweEEyLCAweERCLCAweDFDLCAweDYwLCAweEM4LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweEZGLCAweDYwLCAweEZFLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLAorCSAweDFDLCAweDAwLCAweDJELCAweDYwLCAweDdBLCAweDY1LCAweEE1LCAweEQzLCAweDY1LCAweDQxLCAweDEwLCAweEEzLCAweDAxLCAweEE0LCAweEZFLCAweEI0LAorCSAweEM0LCAweDg1LCAweEZFLCAweEExLCAweEJELCAweEQzLCAweDU5LCAweEQxLCAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweEQ1LCAweDgwLCAweDA1LCAweDAyLAorCSAweDAxLCAweDAzLCAweEY4LCAweDAxLCAweDFFLCAweDYwLCAweEU4LCAweDc4LCAweEZGLCAweEZGLCAweDY4LCAweEYzLCAweDg4LCAweEYxLCAweDA0LCAweEE0LAorCSAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDAyLCAweDAzLCAweDY4LCAweEZCLCAweEExLCAweDAxLCAweEUwLCAweEYzLCAweDI5LCAweDQ1LCAweEQ0LCAweDgwLAorCSAweEZGLCAweEZGLCAweDBDLCAweDA3LCAweDI0LCAweDYwLCAweEFBLCAweDYyLCAweDFBLCAweDYwLCAweDk2LCAweDY0LCAweEEyLCAweERCLCAweDAzLCAweDY0LAorCSAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDFCLCAweDYwLCAweEIxLCAweDc4LCAweEZGLCAweEZGLCAweEUxLCAweEYzLCAweDI5LCAweDQ1LAorCSAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDE3LCAweDA2LCAweDA0LCAweDY1LCAweEU5LCAweDYwLCAweDU4LCAweDRFLCAweDdCLCAweDc4LCAweEZGLCAweEZGLAorCSAweDA1LCAweDY0LCAweERDLCAweEZCLCAweEYyLCAweEYzLCAweEZGLCAweEZGLCAweDAxLCAweEJDLCAweEYyLCAweEZCLCAweDI0LCAweDYwLCAweEFBLCAweDYyLAorCSAweDFBLCAweDYwLCAweDk2LCAweDY0LCAweEEyLCAweERCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDFELCAweDYwLAorCSAweDZELCAweDc4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDAwLCAweDYwLCAweDc0LCAweDY0LCAweEEyLCAweERCLCAweDFELCAweDYwLAorCSAweDI0LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLAorCSAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDA1LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDFFLCAweDYwLAorCSAweEY0LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDQwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDA1LCAweDAzLCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweDFDLCAweDYwLCAweDg3LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LAorCSAweDE3LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDIwLCAweDQwLCAweDUwLCAweDI3LCAweEE3LCAweDAxLCAweEFGLCAweEYzLCAweDZDLCAweEYzLAorCSAweEZFLCAweEEwLCAweEY2LCAweEEwLCAweDBBLCAweDA2LCAweDAzLCAweDA0LCAweDAwLCAweDY0LCAweDU1LCAweEZCLCAweDQwLCAweDQ5LCAweDZDLCAweEYzLAorCSAweEZGLCAweEZGLCAweEY2LCAweEEwLCAweERDLCAweDg0LCAweDAxLCAweDA1LCAweEEyLCAweERCLCAweDFDLCAweDYwLCAweDg3LCAweDc4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDYwLCAweDEwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweEM2LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDI0LCAweDYwLAorCSAweEFBLCAweDYyLCAweDFBLCAweDYwLCAweEEyLCAweDY0LCAweEEyLCAweERCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLAorCSAweDFDLCAweDYwLCAweDU1LCAweDc4LCAweEZGLCAweEZGLCAweDFDLCAweDYwLCAweEVDLCAweDc4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLAorCSAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDIwLCAweDQwLCAweDQwLCAweDJCLCAweDBCLCAweDAwLCAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDgwLCAweDYwLAorCSAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDFELCAweDYwLCAweDZELCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDFDLCAweDYwLCAweDkyLCAweDY1LCAweDAwLCAweDY0LCAweEE1LCAweERCLCAweEMzLCAweEYxLCAweDFBLCAweDYwLCAweDlBLCAweDYyLCAweEEyLCAweEQ5LAorCSAweDFGLCAweDYwLCAweDgwLCAweDY0LCAweEEwLCAweEQzLCAweEZGLCAweEZGLCAweDA4LCAweEI0LCAweDAxLCAweEJDLCAweDI5LCAweDAyLCAweEEyLCAweERCLAorCSAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDBGLCAweDRFLCAweEU0LCAweDYwLCAweDU4LCAweDRGLCAweEZCLCAweDc4LAorCSAweEZGLCAweEZGLCAweDBFLCAweDRGLCAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDEwLCAweDYwLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDFELCAweDYwLAorCSAweEE0LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDFGLCAweDYwLCAweDgwLCAweDY0LCAweEEwLCAweEQzLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDBDLCAweDI2LCAweDBDLCAweDAwLCAweDI0LCAweDYwLCAweEFBLCAweDYyLCAweDFBLCAweDYwLCAweDk2LCAweDY0LAorCSAweEEyLCAweERCLCAweDAyLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDFFLCAweDYwLCAweDk3LCAweDc4LCAweEZGLCAweEZGLAorCSAweDAxLCAweDY0LCAweDMxLCAweDYwLCAweDJBLCAweDYyLCAweEEyLCAweERCLCAweDBELCAweDY0LCAweDUzLCAweEZCLCAweDFELCAweDYwLCAweEMzLCAweDY0LAorCSAweDZCLCAweEZCLCAweDFGLCAweDYwLCAweDcyLCAweDc4LCAweEZGLCAweEZGLCAweDI0LCAweDYwLCAweEFBLCAweDYyLCAweDFBLCAweDYwLCAweEEyLCAweDY0LAorCSAweEEyLCAweERCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLAorCSAweEZGLCAweDYwLCAweERGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDg4LCAweEYxLCAweDE5LCAweDYwLCAweDg2LCAweDYzLCAweEQzLCAweDgwLAorCSAweDY4LCAweEZELCAweDAxLCAweDAyLCAweDQzLCAweDAwLCAweDY4LCAweEYzLCAweDI5LCAweDQxLCAweEEwLCAweEQxLCAweDU4LCAweEQzLCAweEQxLCAweDgwLAorCSAweDY0LCAweDQ1LCAweDYwLCAweDQzLCAweDBGLCAweDA1LCAweDA4LCAweEEzLCAweEJFLCAweEQzLCAweDgzLCAweEYxLCAweEEzLCAweEQzLCAweEQwLCAweDgwLAorCSAweDgyLCAweEYxLCAweDA1LCAweDAyLCAweEJGLCAweEQzLCAweEQwLCAweDgwLCAweDgxLCAweEYxLCAweDAxLCAweDAyLCAweEQwLCAweDgwLCAweEY4LCAweEEzLAorCSAweDA3LCAweDAyLCAweDQ1LCAweDQ5LCAweDFFLCAweDYwLCAweDJBLCAweDY0LCAweDZCLCAweEZCLCAweDFGLCAweDYwLCAweDI5LCAweDc4LCAweEZGLCAweEZGLAorCSAweDJELCAweDYwLCAweDdBLCAweDY1LCAweEE1LCAweEQzLCAweDY1LCAweDQxLCAweDEwLCAweEEzLCAweDAxLCAweEE0LCAweEZFLCAweEI0LCAweEM0LCAweDg1LAorCSAweEZFLCAweEExLCAweEJELCAweEQzLCAweDU5LCAweEQxLCAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweEQ1LCAweDgwLCAweDBGLCAweDAyLCAweEY5LCAweDAyLAorCSAweDA1LCAweDY1LCAweEU5LCAweDYwLCAweDU4LCAweDRFLCAweDdCLCAweDc4LCAweEZGLCAweEZGLCAweDA0LCAweDY0LCAweERDLCAweEZCLCAweEYyLCAweEYzLAorCSAweEZGLCAweEZGLCAweEZFLCAweEI0LCAweEYyLCAweEZCLCAweDFFLCAweDYwLCAweEU4LCAweDc4LCAweEZGLCAweEZGLCAweDY4LCAweEYzLCAweDg4LCAweEYxLAorCSAweDA0LCAweEE0LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDAyLCAweDAzLCAweDY4LCAweEZCLCAweEJELCAweDAxLCAweEUxLCAweEYzLCAweDI5LCAweDQ1LAorCSAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDc1LCAweDA1LCAweDFFLCAweDYwLCAweDJBLCAweDYzLCAweDZCLCAweEZELCAweDFBLCAweDYwLCAweDRDLCAweDYzLAorCSAweDFGLCAweDYwLCAweDI5LCAweDc4LCAweEZGLCAweEZGLCAweDI0LCAweDYwLCAweEFBLCAweDYyLCAweDFBLCAweDYwLCAweDk2LCAweDY0LCAweEEyLCAweERCLAorCSAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDA1LCAweDY1LCAweEU5LCAweDYwLCAweDU4LCAweDRFLCAweDdCLCAweDc4LAorCSAweEZGLCAweEZGLCAweDFGLCAweDYwLCAweDUyLCAweDYxLCAweDAwLCAweDY0LCAweEExLCAweERCLCAweDA0LCAweDY0LCAweERDLCAweEZCLCAweEYyLCAweEYzLAorCSAweEZGLCAweEZGLCAweEZFLCAweEI0LCAweEYyLCAweEZCLCAweDg0LCAweEYzLCAweDYzLCAweEY1LCAweDQ4LCAweDdFLCAweDJBLCAweEZBLCAweDAyLCAweDYwLAorCSAweDAwLCAweDY1LCAweDIwLCAweDQ0LCAweDM0LCAweDgwLCAweDI0LCAweDYwLCAweDc0LCAweDYyLCAweDI0LCAweDYwLCAweDI4LCAweDY0LCAweEEyLCAweERCLAorCSAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEMxLCAweEZFLCAweDBGLCAweDYwLAorCSAweERBLCAweDYyLCAweDAwLCAweDYwLCAweDAxLCAweDY0LCAweEEyLCAweERCLCAweDFFLCAweDYwLCAweDYxLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweEZGLCAweDYwLCAweEZFLCAweDY0LCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweDFBLCAweDYwLCAweDlBLCAweDYyLCAweDAwLCAweDYwLCAweDMyLCAweDY0LCAweEEyLCAweERCLCAweDI0LCAweDYwLCAweEFBLCAweDYyLAorCSAweDFBLCAweDYwLCAweDk2LCAweDY0LCAweEEyLCAweERCLCAweDAyLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDBGLCAweDYwLAorCSAweERBLCAweDYyLCAweDAwLCAweDYwLCAweDEwLCAweDY0LCAweEEyLCAweERCLCAweDFFLCAweDYwLCAweDgxLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweEZGLCAweDYwLCAweEVGLCAweDY0LCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweEZELCAweDYwLCAweEZGLCAweDY1LCAweDIwLCAweDQ0LCAweDI0LCAweDgwLCAweDBGLCAweDYwLCAweEQwLCAweDYyLCAweEEyLCAweEQxLAorCSAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDFCLCAweDYwLCAweEIxLCAweDc4LCAweEZGLCAweEZGLAorCSAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDAwLCAweDYwLCAweDc0LCAweDY0LCAweEEyLCAweERCLCAweDFFLCAweDYwLCAweEEyLCAweDY0LCAweDVBLCAweERCLAorCSAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweDAwLCAweDYwLCAweDA0LCAweDY0LAorCSAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDA1LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDFFLCAweDYwLCAweEY0LCAweDc4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDYwLCAweDQwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDA1LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDFELCAweDYwLAorCSAweEQzLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDE3LCAweDAzLCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweDIwLCAweDQwLCAweDUwLCAweDI3LCAweERELCAweDAxLCAweEFGLCAweEYzLCAweDZDLCAweEYzLCAweEZFLCAweEEwLCAweEY2LCAweEEwLAorCSAweDBBLCAweDA2LCAweDAzLCAweDA0LCAweDAwLCAweDY0LCAweDU1LCAweEZCLCAweDQwLCAweDQ5LCAweDZDLCAweEYzLCAweEZGLCAweEZGLCAweEY2LCAweEEwLAorCSAweERDLCAweDg0LCAweDAxLCAweDA1LCAweEEyLCAweERCLCAweDFELCAweDYwLCAweEQzLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDEwLCAweDY0LAorCSAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweEM2LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDI0LCAweDYwLCAweEFBLCAweDYyLCAweDFBLCAweDYwLAorCSAweEEyLCAweDY0LCAweEEyLCAweERCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDFELCAweDYwLCAweDZELCAweDc4LAorCSAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDAwLCAweDY1LCAweDIwLCAweDQ0LCAweDM0LCAweDgwLCAweDBGLCAweDYwLCAweEVBLCAweDYyLCAweEEyLCAweEQxLAorCSAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDI0LCAweDYwLCAweEFBLCAweDYyLCAweDFBLCAweDYwLAorCSAweDhBLCAweDY0LCAweEEyLCAweERCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDI0LCAweDYwLCAweEFBLCAweDYyLAorCSAweDFBLCAweDYwLCAweDk2LCAweDY0LCAweEEyLCAweERCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDI0LCAweDYwLAorCSAweEFBLCAweDYyLCAweDFBLCAweDYwLCAweEEyLCAweDY0LCAweEEyLCAweERCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLAorCSAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDVBLCAweERCLCAweDAwLCAweDY0LCAweDZBLCAweEZCLCAweDBGLCAweDYwLAorCSAweEQwLCAweDYyLCAweEEyLCAweEQxLCAweDAyLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDBGLCAweDYwLAorCSAweERBLCAweDYyLCAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweEEyLCAweERCLCAweDFCLCAweDYwLCAweDhBLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEEzLCAweEQzLCAweDdGLCAweEYxLCAweDdFLCAweEZCLCAweEQwLCAweDgwLCAweDAwLCAweDY0LCAweDQwLCAweDAzLAorCSAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweEJGLCAweDYwLCAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweERFLCAweEZFLAorCSAweDBCLCAweDA0LCAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDFGLCAweDYwLCAweDJGLCAweDY0LAorCSAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweERGLCAweDYwLAorCSAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDdFLCAweEYxLCAweDdGLCAweEY5LCAweDI0LCAweDYwLCAweDlBLCAweDYyLCAweEEyLCAweEQ5LAorCSAweDFFLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDJELCAweEZGLCAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDIwLCAweDYwLCAweDAwLCAweDY0LAorCSAweEEyLCAweERCLCAweDFGLCAweDYwLCAweDVFLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEJFLCAweEZFLAorCSAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweERGLCAweDYwLCAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDBGLCAweDYwLAorCSAweEQwLCAweDYyLCAweEEyLCAweEQxLCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDAxLCAweDY0LAorCSAweDZCLCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAyLCAweDYwLCAweDAwLCAweDY1LCAweDIwLCAweDQ0LCAweDM0LCAweDgwLCAweDBGLCAweDYwLAorCSAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweDdGLCAweDYwLCAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDIwLCAweDQwLCAweDUxLCAweDIzLAorCSAweDBCLCAweDAwLCAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDFGLCAweDYwLCAweDc2LCAweDY0LAorCSAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweDdGLCAweDYwLAorCSAweEZGLCAweDYxLCAweEExLCAweDg0LCAweDVBLCAweEQxLCAweDRBLCAweERCLCAweEExLCAweDg0LCAweDVBLCAweERCLCAweDQwLCAweDYwLCAweDAwLCAweDY1LAorCSAweDIwLCAweDQ0LCAweDM0LCAweDgwLCAweDAyLCAweDY0LCAweDhDLCAweEZCLCAweEZGLCAweEZGLCAweEMxLCAweEZFLCAweDhDLCAweEYzLCAweDAwLCAweDY1LAorCSAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDEyLCAweDAzLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweDdGLCAweDYwLCAweEZGLCAweDY0LAorCSAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDFGLCAweDYwLAorCSAweDk5LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDJELCAweDYwLCAweDdBLCAweDY0LCAweDU0LCAweEZCLAorCSAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweEVGLCAweDYwLCAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDFBLCAweDYwLAorCSAweDU4LCAweDRFLCAweERDLCAweDc4LCAweEZGLCAweEZGLCAweDBGLCAweDRFLCAweEVDLCAweDYwLCAweDU4LCAweDRGLCAweEI5LCAweDc4LCAweEZGLCAweEZGLAorCSAweDBFLCAweDRGLCAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDEwLCAweDYwLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDFGLCAweDYwLCAweEQzLCAweDY0LAorCSAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDFBLCAweDYwLCAweDU4LCAweDRFLCAweEVELCAweDc4LCAweEZGLCAweEZGLAorCSAweDI0LCAweDYwLCAweEFBLCAweDYyLCAweDFBLCAweDYwLCAweDk2LCAweDY0LCAweEEyLCAweERCLCAweDAyLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLAorCSAweDA0LCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweEVGLCAweDYwLCAweEVGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLAorCSAweDAxLCAweDY0LCAweDhDLCAweEZCLCAweEJGLCAweDYwLCAweEZGLCAweDY1LCAweDIwLCAweDQ0LCAweDI0LCAweDgwLCAweDAxLCAweDYwLCAweDE0LCAweDYyLAorCSAweEEyLCAweEQxLCAweDEyLCAweDYwLCAweDQ2LCAweDYzLCAweEMzLCAweDg1LCAweEM2LCAweEEzLCAweDNBLCAweEEzLCAweEQ3LCAweDgwLCAweEFGLCAweEYzLAorCSAweDA5LCAweDA0LCAweEZFLCAweEEwLCAweDZDLCAweEYzLCAweDNBLCAweDA2LCAweEY2LCAweEEwLCAweDAwLCAweDY0LCAweDM3LCAweDA0LCAweDU1LCAweEZCLAorCSAweDQwLCAweDQ5LCAweDM0LCAweDAwLCAweDA4LCAweEEzLCAweEJFLCAweEQzLCAweDgzLCAweEYxLCAweEEzLCAweEQzLCAweEQwLCAweDgwLCAweDgyLCAweEYxLAorCSAweDA1LCAweDAyLCAweEJGLCAweEQzLCAweEQwLCAweDgwLCAweDgxLCAweEYxLCAweDAxLCAweDAyLCAweEQwLCAweDgwLCAweEY4LCAweEEzLCAweEU1LCAweDAyLAorCSAweEJFLCAweEQzLCAweDVBLCAweEQxLCAweDYwLCAweDQ3LCAweDQwLCAweDRBLCAweDY0LCAweDQ3LCAweDQwLCAweDQ4LCAweDIwLCAweDYwLCAweDU4LCAweDRFLAorCSAweDQ1LCAweDc4LCAweEZGLCAweEZGLCAweDBBLCAweDQ4LCAweDIwLCAweDYwLCAweDU4LCAweDRFLCAweDU1LCAweDc4LCAweEZGLCAweEZGLCAweDIwLCAweDYwLAorCSAweDU4LCAweDRFLCAweDcxLCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDYwLCAweDJFLCAweDY1LCAweDZDLCAweEYzLCAweEE1LCAweEQzLCAweEY2LCAweEEwLAorCSAweDQwLCAweEJDLCAweDA2LCAweDA0LCAweEE1LCAweERCLCAweDZBLCAweEYxLCAweEZGLCAweDYwLCAweEZCLCAweDY0LCAweEEwLCAweDg0LCAweDZBLCAweEZCLAorCSAweDZDLCAweEYzLCAweEZGLCAweEZGLCAweDAwLCAweEI4LCAweENDLCAweDg0LCAweDAxLCAweDAzLCAweEEyLCAweERCLCAweEZELCAweDYwLCAweEZGLCAweDY1LAorCSAweDIwLCAweDQ0LCAweDI0LCAweDgwLCAweDBGLCAweDYwLCAweEQwLCAweDYyLCAweEEyLCAweEQxLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LAorCSAweEEyLCAweERCLCAweENGLCAweEZFLCAweEMxLCAweEZFLCAweDZCLCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDU1LCAweEYxLCAweDI4LCAweDQ0LAorCSAweEQwLCAweDg0LCAweDAzLCAweEE0LCAweDAzLCAweDBFLCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDA0LCAweDAwLCAweEZBLCAweEE0LCAweEU4LCAweDg0LAorCSAweEU4LCAweDg3LCAweEMwLCAweEJGLCAweEMwLCAweDg0LCAweEEyLCAweERCLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDU2LCAweEYxLCAweDI4LCAweDQ0LAorCSAweEQwLCAweDg0LCAweDFGLCAweEE0LCAweDA2LCAweDBFLCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LAorCSAweDA3LCAweDAwLCAweEMyLCAweEE0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg3LCAweEY4LCAweEJGLAorCSAweEMwLCAweDg0LCAweDVDLCAweEYxLCAweDU2LCAweEZCLCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDAxLCAweDA1LCAweDY0LCAweDQ0LCAweDUyLCAweEZCLAorCSAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDUyLCAweEYxLCAweDAwLCAweDY1LCAweDIwLCAweDQwLCAweDIwLCAweDJBLCAweDA2LCAweDAwLCAweDVDLCAweEYzLAorCSAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweDY0LCAweDQ1LCAweDAxLCAweDA2LCAweDYwLCAweDQ1LCAweDJGLCAweDY3LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLAorCSAweDAxLCAweDA2LCAweDYwLCAweDQ1LCAweDU1LCAweEYxLCAweDhCLCAweDY3LCAweEQwLCAweDgwLCAweDYwLCAweDQxLCAweDAyLCAweDI0LCAweDY0LCAweDQxLAorCSAweEQ1LCAweDg0LCAweDgwLCAweDY1LCAweEM0LCAweDg3LCAweDAxLCAweDA1LCAweDAwLCAweDY0LCAweEZGLCAweEI0LCAweDQwLCAweDQ5LCAweDIwLCAweDQwLAorCSAweDIwLCAweDJBLCAweDA2LCAweDAwLCAweDJFLCAweDQzLCAweEYzLCAweDYwLCAweDU4LCAweDRFLCAweEE4LCAweDc4LCAweEZGLCAweEZGLCAweDQzLCAweDRFLAorCSAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweDAwLCAweDYwLCAweDA4LCAweDY0LCAweEIwLCAweDg0LAorCSAweEEyLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweDAwLCAweDYwLAorCSAweDEwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLAorCSAweEEyLCAweEQxLCAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDBGLCAweDYwLCAweEY2LCAweDYyLAorCSAweEEyLCAweEQxLCAweDAwLCAweDYwLCAweDQwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDI2LCAweDQ2LCAweDI3LCAweEYyLCAweDcwLCAweDYzLCAweDYwLCAweDQwLCAweDBBLCAweDM2LCAweDA2LCAweDAwLCAweDE0LCAweDM2LCAweDBBLCAweDAwLAorCSAweDM3LCAweDM2LCAweDA0LCAweDAwLCAweDZFLCAweDM2LCAweDA0LCAweDAwLCAweEQwLCAweDYzLCAweDA0LCAweDAwLCAweDMzLCAweDYzLCAweDAyLCAweDAwLAorCSAweDIxLCAweDYzLCAweDAwLCAweDAwLCAweDFGLCAweDYwLCAweDVBLCAweDYxLCAweEExLCAweERELCAweDI2LCAweDQ2LCAweEJGLCAweEYyLCAweDAxLCAweDYwLAorCSAweDAwLCAweDY1LCAweEY0LCAweEExLCAweEQ1LCAweDgwLCAweDAwLCAweEY0LCAweDAyLCAweDI0LCAweDY1LCAweDQxLCAweDQxLCAweDQ4LCAweDFFLCAweDY1LAorCSAweDAyLCAweDYwLCAweDAwLCAweDYzLCAweEE1LCAweEQwLCAweERBLCAweDg1LCAweDgwLCAweDNBLCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDA0LCAweDY1LAorCSAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweENELCAweDgxLCAweEJELCAweERCLCAweDA1LCAweDAzLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweENELCAweDgxLAorCSAweEJELCAweERCLCAweEYwLCAweDAyLCAweDAyLCAweDYwLCAweDAwLCAweDYzLCAweDI4LCAweDQxLCAweEJELCAweEQzLCAweEJELCAweEQxLCAweEZELCAweEEwLAorCSAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDY0LCAweDQ0LCAweEUwLCAweDg1LCAweEQxLCAweDgxLCAweEZFLCAweEExLCAweEM3LCAweDgzLCAweEY1LCAweDBELAorCSAweDA0LCAweDAwLCAweDFBLCAweDYwLCAweDRDLCAweDYxLCAweEEzLCAweEQzLCAweEExLCAweERCLCAweDMxLCAweDQwLCAweDA2LCAweDI2LCAweDU4LCAweDAwLAorCSAweDAwLCAweDY0LCAweDcwLCAweEZCLCAweDAyLCAweDYwLCAweDAwLCAweDYzLCAweDI4LCAweDQxLCAweEJELCAweEQzLCAweEJELCAweEQxLCAweEZDLCAweEEwLAorCSAweEZCLCAweEEwLCAweDA4LCAweDAzLCAweDI4LCAweDAzLCAweDY0LCAweDQ0LCAweEUwLCAweDg1LCAweEQxLCAweDgxLCAweEZFLCAweEExLCAweEM3LCAweDgzLAorCSAweEY0LCAweDBELCAweDQ2LCAweDAwLCAweEJELCAweEQzLCAweEJELCAweEQzLCAweDAwLCAweEI4LCAweDcwLCAweEZCLCAweDZGLCAweEZCLCAweEJELCAweEQzLAorCSAweDNGLCAweDAyLCAweEEzLCAweEQzLCAweDYwLCAweDQ1LCAweDYwLCAweDQ3LCAweEI0LCAweDg0LCAweDYwLCAweDQxLCAweDNGLCAweEI1LCAweEU4LCAweDg0LAorCSAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDcyLCAweEZCLCAweDY1LCAweDQ3LCAweEUwLCAweDg0LAorCSAweEUwLCAweDg0LCAweDcxLCAweEZCLCAweDY0LCAweDQ0LCAweEUwLCAweDg1LCAweEZBLCAweEEzLCAweEM3LCAweDgzLCAweDFBLCAweDYwLCAweDQ0LCAweDYyLAorCSAweDYxLCAweDQ0LCAweEEyLCAweERCLCAweEQyLCAweDAxLCAweEJELCAweEQzLCAweEEzLCAweEQzLCAweDAwLCAweEI4LCAweDZFLCAweEZCLCAweDc0LCAweEZCLAorCSAweDFGLCAweDAyLCAweDg3LCAweEYxLCAweDcwLCAweEYzLCAweDZELCAweEY5LCAweDA0LCAweDY1LCAweDYwLCAweDQwLCAweDAwLCAweDNBLCAweDA2LCAweDY1LAorCSAweDMxLCAweDQ0LCAweEI0LCAweDg0LCAweDQwLCAweDUxLCAweDAyLCAweDJBLCAweDBCLCAweDAwLCAweDA4LCAweEJDLCAweDQwLCAweDUxLCAweDcyLCAweEYzLAorCSAweDcxLCAweEYxLCAweDAwLCAweEI4LCAweDY0LCAweDQ1LCAweDAxLCAweDAzLCAweDY3LCAweDQ1LCAweDY1LCAweDUwLCAweENDLCAweDg0LCAweDczLCAweEZCLAorCSAweDBGLCAweDYwLCAweEVBLCAweDYyLCAweEEyLCAweEQxLCAweDAxLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLAorCSAweDBGLCAweDYwLCAweEVDLCAweDYyLCAweEEyLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDgwLCAweDJBLCAweDg0LCAweDAwLCAweDFGLCAweDYwLAorCSAweDUyLCAweDYxLCAweDAxLCAweDY0LCAweEExLCAweERCLCAweDIyLCAweDYwLCAweDU4LCAweDRFLCAweDNFLCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LAorCSAweDAwLCAweEY0LCAweDBELCAweEYyLCAweDgwLCAweEZCLCAweDAwLCAweDY0LCAweDg2LCAweEZCLCAweDBGLCAweDYwLCAweEVBLCAweDYyLCAweEEyLCAweEQxLAorCSAweDAwLCAweDYwLCAweDgwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDI2LCAweDQ2LCAweDNGLCAweEYyLCAweDAwLCAweEY0LAorCSAweDFFLCAweDY1LCAweEY0LCAweEE0LCAweEQ0LCAweEEwLCAweDYwLCAweDQxLCAweDAxLCAweDA2LCAweDJDLCAweDYxLCAweDQxLCAweDQ4LCAweDAyLCAweDYwLAorCSAweDAwLCAweDYzLCAweEE1LCAweEQwLCAweERBLCAweDg1LCAweDgwLCAweDNBLCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDA0LCAweDY1LCAweDY0LCAweDQ0LAorCSAweDAwLCAweDdGLCAweENELCAweDgxLCAweEJELCAweERCLCAweDA1LCAweDAzLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweENELCAweDgxLCAweEJELCAweERCLAorCSAweEYwLCAweDAyLCAweDAyLCAweDYwLCAweDAwLCAweDYzLCAweDI4LCAweDQxLCAweEJELCAweEQzLCAweEJELCAweEQxLCAweDAxLCAweEE4LCAweEM5LCAweDgxLAorCSAweDA2LCAweDAzLCAweDY0LCAweDQ0LCAweEQxLCAweDgxLCAweEUwLCAweDg1LCAweDQyLCAweDA2LCAweEM3LCAweDgzLCAweEY1LCAweDAxLCAweDQzLCAweDQ4LAorCSAweDJELCAweDYwLCAweDJBLCAweDYzLCAweDQzLCAweDRBLCAweDY0LCAweDQxLCAweDI4LCAweDQzLCAweDAwLCAweDY1LCAweDQ1LCAweDRDLCAweDY1LCAweDVDLAorCSAweEJELCAweEQzLCAweDYxLCAweDQwLCAweDAwLCAweDM2LCAweDI3LCAweDAwLCAweENELCAweDgxLCAweDYwLCAweDQwLCAweDAyLCAweDM2LCAweDYwLCAweDQ1LAorCSAweDA0LCAweDM2LCAweDYwLCAweDQ1LCAweDgyLCAweDM2LCAweDYwLCAweDQ1LCAweDg0LCAweDM2LCAweDYwLCAweDQ1LCAweDBCLCAweDM2LCAweDYwLCAweDQ1LAorCSAweDhCLCAweDM2LCAweDYwLCAweDQ1LCAweDE2LCAweDM2LCAweDYwLCAweDQ1LCAweDk2LCAweDM2LCAweDYwLCAweDQ1LCAweDY1LCAweDQwLCAweDAwLCAweDM2LAorCSAweEU3LCAweDAxLCAweDY0LCAweDQ0LCAweERDLCAweDlDLCAweDJDLCAweDQ0LCAweDAwLCAweDNBLCAweDAyLCAweDAwLCAweDQ1LCAweDRDLCAweEUwLCAweDAxLAorCSAweDJDLCAweDVFLCAweDY1LCAweDVGLCAweDAwLCAweDY1LCAweDQ1LCAweDRDLCAweDQzLCAweDQ4LCAweDJBLCAweDQzLCAweEJELCAweERCLCAweEZGLCAweEZGLAorCSAweDQzLCAweDRBLCAweDI4LCAweDQzLCAweEQ1LCAweDAxLCAweDJELCAweDYwLCAweDI4LCAweDY0LCAweDYwLCAweEZFLCAweEEwLCAweEQ5LCAweEZGLCAweEZGLAorCSAweDIwLCAweEZFLCAweDY0LCAweDQwLCAweDAxLCAweDNBLCAweDM5LCAweDAwLCAweDJBLCAweDQzLCAweDY1LCAweDQ0LCAweEEzLCAweERCLCAweDM1LCAweDAwLAorCSAweDIzLCAweDYwLCAweDM0LCAweDc4LCAweEZGLCAweEZGLCAweERDLCAweEYzLCAweEZGLCAweEZGLCAweDAzLCAweEE4LCAweDAyLCAweEE4LCAweDAyLCAweDAzLAorCSAweDQxLCAweDAyLCAweEY2LCAweDAxLCAweDBGLCAweDYwLCAweEVBLCAweDYyLCAweEEyLCAweEQxLCAweEZGLCAweDYwLCAweEZCLCAweDY0LCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweDI0LCAweDYwLCAweEFBLCAweDYyLCAweDFBLCAweDYwLCAweDY2LCAweDY0LCAweEEyLCAweERCLCAweDAyLCAweDY0LCAweDRBLCAweERCLAorCSAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDI2LCAweDQ2LCAweDFGLCAweDYwLCAweDVBLCAweDYxLCAweEExLCAweEQzLCAweDI1LCAweEYyLCAweDYwLCAweDQ1LAorCSAweDI0LCAweEYwLCAweDAwLCAweEY0LCAweDY0LCAweDQzLCAweEM3LCAweDgzLCAweDYwLCAweDQxLCAweDAyLCAweDI0LCAweDAxLCAweEExLCAweDBBLCAweEYwLAorCSAweDA5LCAweEYyLCAweEQxLCAweDgwLCAweEZGLCAweEZGLCAweDA5LCAweDA3LCAweDA0LCAweDA0LCAweDYzLCAweDQ1LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLAorCSAweDA0LCAweDA2LCAweDIyLCAweDYwLCAweDU4LCAweDRFLCAweDNFLCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDI2LCAweEYwLCAweEZGLCAweDY3LAorCSAweDIwLCAweDg4LCAweDY0LCAweDVGLCAweDQwLCAweDRBLCAweDIwLCAweDYwLCAweDU4LCAweDRFLCAweDQ1LCAweDc4LCAweEZGLCAweEZGLCAweDBBLCAweDQ4LAorCSAweDIwLCAweDYwLCAweDU4LCAweDRFLCAweDU1LCAweDc4LCAweEZGLCAweEZGLCAweDIwLCAweDYwLCAweDU4LCAweDRFLCAweDcxLCAweDc4LCAweEZGLCAweEZGLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweERBLCAweDYyLCAweEEyLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDQwLCAweDIyLAorCSAweEFGLCAweDAxLCAweDAxLCAweDYwLCAweDJFLCAweDYyLCAweEEyLCAweEQzLCAweEZGLCAweEZGLCAweEJGLCAweEI0LCAweEEyLCAweERCLCAweDFGLCAweDYwLAorCSAweDVBLCAweDYxLCAweEExLCAweEQzLCAweDI2LCAweDQ2LCAweDYwLCAweDQ1LCAweDFFLCAweDYwLCAweEZFLCAweDYzLCAweDAwLCAweEY0LCAweDA5LCAweEYyLAorCSAweEJELCAweERCLCAweEZGLCAweEZGLCAweDBBLCAweEYyLCAweEJELCAweERCLCAweDBCLCAweEYyLCAweEZGLCAweEZGLCAweEJELCAweERCLCAweDBDLCAweEYyLAorCSAweEEzLCAweERCLCAweEZBLCAweEEzLCAweDI2LCAweDQ2LCAweEEzLCAweEQzLCAweDI0LCAweEYwLCAweDAwLCAweDYxLCAweEQwLCAweDg0LCAweEYxLCAweDgxLAorCSAweEQ0LCAweDg0LCAweEYxLCAweDgxLCAweEJELCAweERCLCAweEEzLCAweEQzLCAweDAzLCAweEIxLCAweDAzLCAweEE5LCAweDI1LCAweEYwLCAweDQyLCAweEZFLAorCSAweDA1LCAweDAzLCAweEZELCAweEExLCAweENDLCAweDg0LCAweDAxLCAweDAyLCAweENDLCAweDg0LCAweDAwLCAweDYxLCAweEYxLCAweDgxLCAweEQwLCAweDg0LAorCSAweEYxLCAweDgxLCAweEJELCAweERCLCAweEEzLCAweEQzLCAweDAzLCAweEIxLCAweDAzLCAweEE5LCAweDI4LCAweEYwLCAweDQyLCAweEZFLCAweDAxLCAweDAzLAorCSAweENDLCAweDg0LCAweEYxLCAweDgxLCAweEQwLCAweDg0LCAweEYxLCAweDgxLCAweEJELCAweERCLCAweEEzLCAweEQzLCAweDAzLCAweEIxLCAweDAzLCAweEE5LAorCSAweDI5LCAweEYwLCAweDAxLCAweDAzLCAweENDLCAweDg0LCAweEQwLCAweDg0LCAweEEzLCAweERCLCAweDFGLCAweDYwLCAweDUyLCAweDYxLCAweEExLCAweEQzLAorCSAweEZGLCAweEZGLCAweDAyLCAweEE4LCAweEZGLCAweEZGLCAweDAyLCAweDAyLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweEY1LCAweEZFLCAweDFFLCAweDYwLAorCSAweEZFLCAweDY0LCAweEEwLCAweEQxLCAweDA2LCAweEE0LCAweEEwLCAweEQzLCAweDY0LCAweDQ1LCAweDYwLCAweDQwLCAweDgwLCAweDJCLCAweDAzLCAweDAwLAorCSAweEZGLCAweDYwLCAweEZGLCAweDY0LCAweDk0LCAweDg1LCAweDAwLCAweDYwLCAweDk2LCAweDY0LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDBCLCAweDA2LAorCSAweDFGLCAweDYwLCAweDUyLCAweDYxLCAweEExLCAweEQzLCAweDZBLCAweEYzLCAweDAwLCAweEE4LCAweDA0LCAweEIwLCAweDA0LCAweDAyLCAweDAzLCAweDAzLAorCSAweDIzLCAweDYwLCAweDEwLCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDAwLCAweEY0LCAweDA5LCAweEYyLCAweDVBLCAweEQyLCAweDQwLCAweDQ4LAorCSAweDQwLCAweDRBLCAweDVBLCAweEQyLCAweDVBLCAweEQyLCAweDQwLCAweDRDLCAweDYwLCAweDQxLCAweDVBLCAweEQwLCAweDgwLCAweEY5LCAweDQwLCAweDYzLAorCSAweEFELCAweDgwLCAweEYwLCAweEEzLCAweDA5LCAweDAyLCAweDNDLCAweDAzLCAweDJDLCAweDQxLCAweDJBLCAweDQ0LCAweDQwLCAweDRDLCAweDI4LCAweDQ0LAorCSAweDQwLCAweDRBLCAweDAwLCAweDY0LCAweDQwLCAweDQ4LCAweEY0LCAweDAxLCAweEQxLCAweDgwLCAweDAxLCAweDAyLCAweDMxLCAweDA0LCAweDEwLCAweEEzLAorCSAweDgwLCAweDYwLCAweDAwLCAweDY1LCAweEE1LCAweDgwLCAweENGLCAweDgzLCAweDA4LCAweDAyLCAweDI4LCAweDQ0LCAweDYwLCAweDg4LCAweDJBLCAweDQ0LAorCSAweDcwLCAweDhBLCAweDJDLCAweDQ0LCAweDcwLCAweDhDLCAweEYxLCAweDgxLCAweEY1LCAweDAxLCAweEU3LCAweEEzLCAweDY0LCAweDQ0LCAweDAwLCAweEE4LAorCSAweDAwLCAweDYyLCAweDAyLCAweDAyLCAweDAwLCAweDYxLCAweDFDLCAweDAwLCAweEUwLCAweDg0LCAweERFLCAweDgyLCAweEZELCAweDA0LCAweDQyLCAweEZFLAorCSAweEY4LCAweDg0LCAweDYyLCAweDQ1LCAweEM3LCAweDgzLCAweDYwLCAweDQ1LCAweDAyLCAweEZFLCAweEQ1LCAweDg0LCAweDAyLCAweDA1LCAweDAxLCAweDA1LAorCSAweDYxLCAweDQ0LCAweENGLCAweDgzLCAweDYwLCAweDQxLCAweDA4LCAweDAzLCAweDI4LCAweDQ0LCAweDYwLCAweDg4LCAweDJBLCAweDQ0LCAweDcwLCAweDhBLAorCSAweDJDLCAweDQ0LCAweDcwLCAweDhDLCAweEYxLCAweDgxLCAweEYxLCAweDAxLCAweENFLCAweDgyLCAweEU5LCAweDgxLCAweEZELCAweDAyLCAweEYxLCAweDgxLAorCSAweDA5LCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQ3LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDVBLCAweEQyLCAweDNGLCAweEI1LCAweEUwLCAweDg0LAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEI0LCAweDg0LCAweDYxLCAweDQ1LCAweEQ0LCAweDg0LAorCSAweEMwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDkzLCAweDFGLCAweDYwLCAweDUyLCAweDYxLCAweEExLCAweEQzLAorCSAweEZGLCAweEZGLCAweDAwLCAweEE4LCAweEZGLCAweEZGLCAweDAyLCAweDAzLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDEwLCAweDY1LCAweDczLCAweDQ0LAorCSAweEQ0LCAweDkzLCAweDZBLCAweEYzLCAweDI2LCAweDQ2LCAweDA0LCAweEJDLCAweEEyLCAweERCLCAweDI2LCAweEYwLCAweEZGLCAweDY3LCAweDIwLCAweDg4LAorCSAweDY0LCAweDVGLCAweDQwLCAweDRBLCAweDIwLCAweDYwLCAweDU4LCAweDRFLCAweDQ1LCAweDc4LCAweEZGLCAweEZGLCAweDBBLCAweDQ4LCAweDIwLCAweDYwLAorCSAweDU4LCAweDRFLCAweDU1LCAweDc4LCAweEZGLCAweEZGLCAweDIwLCAweDYwLCAweDU4LCAweDRFLCAweDcxLCAweDc4LCAweEZGLCAweEZGLCAweDZDLCAweEYzLAorCSAweEZGLCAweEZGLCAweDAwLCAweEI4LCAweENDLCAweDg0LCAweDAxLCAweDAzLCAweEEyLCAweERCLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLAorCSAweDAwLCAweDYwLCAweDQwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDI0LCAweDYwLCAweEFBLCAweDYyLCAweDFBLCAweDYwLAorCSAweEEyLCAweDY0LCAweEEyLCAweERCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLAorCSAweEEyLCAweEQxLCAweEZGLCAweDYwLCAweERGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDI2LCAweDQ2LCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDI4LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQ3LCAweDBGLCAweEI0LCAweDU5LCAweDAwLCAweEZGLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDI0LCAweDYwLCAweDlFLCAweDY1LCAweDA0LCAweDY0LCAweEE1LCAweERCLCAweDEyLCAweDAwLCAweDI0LCAweDYwLCAweDlFLCAweDY1LCAweDBDLCAweDY0LAorCSAweEE1LCAweERCLCAweDBELCAweDAwLCAweDI0LCAweDYwLCAweDlFLCAweDY1LCAweDA2LCAweDY0LCAweEE1LCAweERCLCAweEZGLCAweEZGLCAweDJELCAweEZGLAorCSAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI0LCAweDYwLCAweDlFLCAweDY1LCAweDA4LCAweDY0LCAweEE1LCAweERCLCAweDIzLCAweDYwLAorCSAweEExLCAweDY0LCAweEExLCAweEZCLCAweEZGLCAweEZGLCAweDJELCAweEZGLCAweDI1LCAweDYwLCAweDExLCAweDc4LCAweEZGLCAweEZGLCAweDI5LCAweEYzLAorCSAweDdGLCAweEZCLCAweEE0LCAweEZCLCAweDAyLCAweDYwLCAweEVFLCAweDY0LCAweEEzLCAweEZCLCAweDA3LCAweDY0LCAweEE1LCAweEZCLCAweDIzLCAweDYwLAorCSAweEExLCAweDY0LCAweEExLCAweEZCLCAweEZGLCAweEZGLCAweERGLCAweEZFLCAweDAwLCAweDY0LCAweDE5LCAweEZGLCAweDI1LCAweDYwLCAweDExLCAweDc4LAorCSAweEZGLCAweEZGLCAweDI0LCAweDYwLCAweDBELCAweDYzLCAweDBDLCAweDYwLCAweDE2LCAweDY0LCAweEEwLCAweERELCAweDYyLCAweEZGLCAweDIzLCAweDYwLAorCSAweDhFLCAweDYzLCAweEExLCAweEZELCAweEZGLCAweEZGLCAweDFBLCAweEZGLCAweDI1LCAweDYwLCAweDExLCAweDc4LCAweEZGLCAweEZGLCAweEEzLCAweDYwLAorCSAweDRCLCAweDYzLCAweDBDLCAweDYwLCAweDE2LCAweDY0LCAweEEwLCAweERELCAweDYyLCAweEZGLCAweDI5LCAweEY1LCAweDI0LCAweDYwLCAweDdBLCAweDYzLAorCSAweDI0LCAweDYwLCAweDRDLCAweDY0LCAweEJELCAweERCLCAweDY2LCAweDQ0LCAweEJELCAweERCLCAweDAyLCAweDY0LCAweEEzLCAweERCLCAweEZGLCAweEZGLAorCSAweDJCLCAweEZGLCAweEY5LCAweEZFLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweEE3LCAweDAxLCAweDAwLCAweDM2LCAweEE4LCAweDAxLAorCSAweDAxLCAweDM2LCAweEFCLCAweDAxLCAweDAyLCAweDM2LCAweEFFLCAweDAxLCAweDAzLCAweDM2LCAweEI1LCAweDAxLCAweDA0LCAweDM2LCAweEQxLCAweDAxLAorCSAweDA1LCAweDM2LCAweENGLCAweDAxLCAweDA2LCAweDM2LCAweEYxLCAweDAxLCAweDA3LCAweDM2LCAweENCLCAweDAxLCAweDA4LCAweDM2LCAweEI3LCAweDAxLAorCSAweDA5LCAweDM2LCAweDBDLCAweDAwLCAweDBBLCAweDM2LCAweDBELCAweDAwLCAweDBCLCAweDM2LCAweDBFLCAweDAwLCAweDBDLCAweDM2LCAweDE3LCAweDAwLAorCSAweDBELCAweDM2LCAweDBELCAweDAwLCAweDBFLCAweDM2LCAweDFFLCAweDAwLCAweDBGLCAweDM2LCAweDMyLCAweDAwLCAweDAyLCAweDYwLCAweDAwLCAweDY0LAorCSAweDA4LCAweDAwLCAweDA0LCAweDYwLCAweDAwLCAweDY0LCAweDA1LCAweDAwLCAweDAwLCAweDYwLCAweDAxLCAweDY0LCAweDAyLCAweDAwLCAweDIwLCAweDYwLAorCSAweDAwLCAweDY0LCAweDMyLCAweDQ1LCAweEI0LCAweDg1LCAweDQ1LCAweDUyLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI0LCAweDYwLAorCSAweEQxLCAweDYzLCAweDBDLCAweDYwLCAweDE2LCAweDY0LCAweEEwLCAweERELCAweDYyLCAweEZGLCAweEZGLCAweEZGLCAweDFBLCAweEZGLCAweDAwLCAweDY3LAorCSAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDNGLCAweDQwLCAweDAyLCAweDJCLCAweDA1LCAweDAwLCAweDkwLCAweDYwLCAweDAwLCAweEU4LCAweDI0LCAweDYwLAorCSAweDBELCAweDYzLCAweDA0LCAweDAwLCAweDkxLCAweDYwLCAweDAwLCAweEU4LCAweDI0LCAweDYwLCAweEJCLCAweDYzLCAweDI4LCAweEU4LCAweDBDLCAweDYwLAorCSAweDE2LCAweDY0LCAweEEwLCAweERELCAweDYyLCAweEZGLCAweEZGLCAweEZGLCAweDFBLCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDkxLCAweDYwLCAweDAwLCAweEU4LCAweDI4LCAweEU4LCAweEQ5LCAweDYwLCAweEZFLCAweDY0LCAweDMyLCAweDQ1LCAweEE0LCAweDg1LCAweDQ1LCAweDUyLAorCSAweDk5LCAweEZGLCAweEE1LCAweDRGLCAweEZGLCAweEI0LCAweDA3LCAweEZCLCAweDk4LCAweEZGLCAweEEzLCAweDYwLCAweDRCLCAweDYzLCAweDBDLCAweDYwLAorCSAweDE2LCAweDY0LCAweEEwLCAweERELCAweDYyLCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweEUxLCAweEExLCAweEZGLAorCSAweEZGLCAweEZGLCAweDQzLCAweEZGLCAweDAxLCAweDYwLCAweDAwLCAweEUxLCAweDI4LCAweEYzLCAweDQ3LCAweEZGLCAweDYwLCAweDQwLCAweDA3LCAweDM3LAorCSAweDRCLCAweDAwLCAweDA1LCAweDNCLCAweDA0LCAweDAwLCAweEZGLCAweDBBLCAweDgwLCAweEUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDI5LCAweEY1LAorCSAweDJBLCAweEYzLCAweDQ3LCAweEZGLCAweDNGLCAweEYwLCAweDAxLCAweDFCLCAweDAxLCAweDY0LCAweDYwLCAweDU2LCAweEFELCAweEUyLCAweEI1LCAweEZGLAorCSAweDZDLCAweDQwLCAweDQwLCAweEUxLCAweEExLCAweEZGLCAweDAwLCAweEY0LCAweDZFLCAweDYxLCAweDEyLCAweDYyLCAweDY0LCAweDQzLCAweDAxLCAweEUxLAorCSAweDAzLCAweDY0LCAweEUyLCAweEQwLCAweEM5LCAweDgxLCAweDY0LCAweDRDLCAweENDLCAweDg0LCAweERBLCAweDgyLCAweEZBLCAweDAyLCAweDAxLCAweDYwLAorCSAweDAwLCAweDZCLCAweDlBLCAweEZGLCAweENBLCAweDgyLCAweDAzLCAweDAwLCAweDAwLCAweEY0LCAweDgxLCAweEYyLCAweEZGLCAweEZGLCAweDdBLCAweEQwLAorCSAweEExLCAweEZGLCAweDY0LCAweDRDLCAweEZDLCAweDFDLCAweEY4LCAweDFELCAweDAwLCAweEI5LCAweDA2LCAweDFFLCAweDAyLCAweDAyLCAweDAwLCAweEY0LAorCSAweERBLCAweDgyLCAweDVBLCAweEQyLCAweEExLCAweEZGLCAweDYwLCAweDRELCAweDNGLCAweDQwLCAweDAyLCAweDJCLCAweDA4LCAweDAwLCAweDI4LCAweEYzLAorCSAweEE1LCAweDYwLCAweEM0LCAweDY1LCAweDYwLCAweDQwLCAweDBFLCAweDNCLCAweDAyLCAweDAwLCAweDgwLCAweDRDLCAweEZFLCAweDAxLCAweEExLCAweEZGLAorCSAweDg3LCAweDRFLCAweDg3LCAweDRDLCAweDg3LCAweDRDLCAweDg3LCAweDRDLCAweDg3LCAweDRDLCAweDY3LCAweDRDLCAweEZGLCAweEZGLCAweEJDLCAweEZGLAorCSAweDAwLCAweEUxLCAweEQ1LCAweEZFLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDY0LCAweDQwLCAweDQ2LCAweDYwLCAweDQxLCAweEI1LCAweEZGLAorCSAweEI3LCAweEZGLCAweEI0LCAweEZGLCAweDI5LCAweEY1LCAweDNGLCAweEYwLCAweDI0LCAweEYyLCAweDQ0LCAweDQzLCAweDQwLCAweDQ0LCAweDAwLCAweEY0LAorCSAweEYzLCAweDYwLCAweEEwLCAweDY1LCAweDEwLCAweDYyLCAweDVBLCAweEQyLCAweEQ5LCAweDgxLCAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweEZCLCAweDAyLAorCSAweDYxLCAweDQ1LCAweDI0LCAweDQ0LCAweEQ0LCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEZELCAweEE1LCAweDQ4LCAweDYwLAorCSAweDAwLCAweDY0LCAweEM0LCAweDlELCAweDBELCAweDYwLCAweDAwLCAweDZCLCAweDI0LCAweDQ0LCAweEMwLCAweDgzLCAweEJCLCAweEZGLCAweDI5LCAweEY1LAorCSAweDAxLCAweEUxLCAweDAwLCAweEY0LCAweDZDLCAweDYxLCAweDEwLCAweDYyLCAweDA1LCAweDAwLCAweDAwLCAweEY0LCAweDAxLCAweEYyLCAweEZGLCAweEZGLAorCSAweDYwLCAweDQxLCAweDA0LCAweDYyLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDAxLCAweDEwLCAweDFBLCAweDAwLCAweDI2LCAweDQ0LCAweDAxLCAweDI2LAorCSAweDBDLCAweDAwLCAweDI0LCAweDQ0LCAweEM4LCAweDg0LCAweDQwLCAweDQ0LCAweDAyLCAweDAzLCAweDZDLCAweDQ1LCAweEYzLCAweDAxLCAweDAzLCAweDE1LAorCSAweDAxLCAweDY0LCAweDA1LCAweEZBLCAweDE1LCAweDAwLCAweDZDLCAweDQ1LCAweEVELCAweDAxLCAweDIzLCAweDQ0LCAweEM4LCAweDg0LCAweDQwLCAweDQzLAorCSAweDAyLCAweDAzLCAweDZDLCAweDQ1LCAweEU3LCAweDAxLCAweDAwLCAweDY0LCAweDAxLCAweDE1LCAweDAxLCAweDY0LCAweDZDLCAweDQ1LCAweDA1LCAweEZCLAorCSAweEUyLCAweEQyLCAweERBLCAweDgyLCAweEM5LCAweDgxLCAweDYwLCAweDRDLCAweERELCAweDFDLCAweEQ3LCAweDAzLCAweEJDLCAweEZGLCAweERBLCAweDAxLAorCSAweDAwLCAweEUxLCAweEQ1LCAweEZFLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDA4LCAweEUxLCAweEExLCAweEZGLCAweDY3LCAweDRDLCAweDQzLCAweEZGLAorCSAweEFELCAweDRGLCAweDAyLCAweEJDLCAweDAwLCAweDdGLCAweEEwLCAweDVELCAweDAxLCAweEUxLCAweDAxLCAweDYwLCAweDY5LCAweDZCLCAweEE1LCAweDYwLAorCSAweEM0LCAweDY0LCAweDYwLCAweDRDLCAweEJCLCAweEZGLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDYwLCAweDRDLCAweEExLCAweEZGLCAweEZGLCAweEZGLAorCSAweDYwLCAweDRDLCAweEZDLCAweDAxLCAweDI5LCAweEYzLCAweDJBLCAweEYxLCAweDA3LCAweEI1LCAweDA0LCAweEUxLCAweDY1LCAweDQxLCAweDY0LCAweDU0LAorCSAweENELCAweEUyLCAweDk1LCAweDgxLCAweEExLCAweDVELCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweEY5LCAweDAxLCAweDYxLCAweDQ0LCAweEZFLCAweEZCLAorCSAweEZGLCAweEZELCAweEZGLCAweDAxLCAweDdGLCAweDY3LCAweDAxLCAweDYxLCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweEIxLCAweEZFLCAweDA4LCAweDA1LAorCSAweEIwLCAweEZFLCAweDA5LCAweDA1LCAweEIyLCAweEZFLCAweEIzLCAweEZFLCAweDc4LCAweDQzLCAweDAxLCAweDYxLCAweDI0LCAweDYwLCAweERELCAweDc4LAorCSAweDJELCAweDYwLCAweDVELCAweDc4LCAweEZGLCAweEZGLCAweDI4LCAweEYzLCAweDI5LCAweEYxLCAweDQwLCAweDQ0LCAweDQ0LCAweDQ1LCAweDJBLCAweEYxLAorCSAweDJCLCAweEYxLCAweDQ0LCAweDQ2LCAweDQ0LCAweDQ3LCAweDNGLCAweEI0LCAweEUwLCAweDg1LCAweDFGLCAweDYwLCAweDg4LCAweDY0LCAweDQ0LCAweEQ3LAorCSAweDU4LCAweDQzLCAweEZGLCAweEZGLCAweDYwLCAweDQ1LCAweDFDLCAweDYwLCAweEI0LCAweDdDLCAweEE0LCAweEQzLCAweDYxLCAweDQzLCAweDA0LCAweEI0LAorCSAweDI0LCAweDQ0LCAweDAyLCAweDAzLCAweDEzLCAweEZGLCAweDA2LCAweDAwLCAweDNGLCAweEI0LCAweEI0LCAweDg0LCAweEZGLCAweDI3LCAweDA1LCAweEZELAorCSAweDA0LCAweEZCLCAweDEwLCAweDc1LCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDg2LCAweDNFLCAweEI0LCAweEZFLCAweDBCLCAweDA1LCAweEI1LCAweEZFLAorCSAweDAyLCAweDI0LCAweEExLCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEI3LCAweEZFLCAweDA3LCAweDA1LCAweDc4LCAweDQzLCAweDAxLCAweDYxLAorCSAweDI0LCAweDYwLCAweERELCAweDc4LCAweDJELCAweDYwLCAweDk4LCAweDc4LCAweEZGLCAweEZGLCAweDM2LCAweDQ0LCAweDAwLCAweDdGLCAweEYyLCAweEEwLAorCSAweDYwLCAweDQ1LCAweDA1LCAweDA1LCAweDIwLCAweDYwLCAweDE2LCAweDY0LCAweDQ0LCAweEQ3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDc4LCAweDQzLAorCSAweDAxLCAweDYxLCAweDI0LCAweDYwLCAweERELCAweDc4LCAweDc4LCAweDQzLCAweDAxLCAweDYxLCAweDI0LCAweDYwLCAweERELCAweDc4LCAweDdGLCAweDYwLAorCSAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLCAweDdGLCAweDY3LCAweDAyLCAweDYxLCAweDEwLCAweDAyLCAweDEwLCAweDY0LCAweDQwLCAweDQwLAorCSAweDAyLCAweDY0LCAweDQwLCAweDUwLCAweDYxLCAweEZGLCAweDNGLCAweDQwLCAweDQwLCAweDI2LCAweDA0LCAweDAwLCAweDEwLCAweEUwLCAweDQ2LCAweDYwLAorCSAweDA5LCAweEUwLCAweDAwLCAweDAwLCAweDI3LCAweEYxLCAweDAwLCAweDY2LCAweDIwLCAweDc4LCAweDQyLCAweEZFLCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDdGLCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLCAweDdGLCAweDY3LCAweDAyLCAweDYxLCAweDFBLCAweDAyLCAweDFDLCAweDYwLAorCSAweEI0LCAweDYzLCAweEEzLCAweEQzLCAweDA3LCAweDdDLCAweDIwLCAweEI1LCAweDBDLCAweEI1LCAweDA0LCAweDAzLCAweDAzLCAweDAyLCAweERDLCAweEY5LAorCSAweDAwLCAweDY3LCAweDBGLCAweDAwLCAweDAwLCAweDYxLCAweDQxLCAweDU2LCAweEM3LCAweEZFLCAweEFDLCAweDAxLCAweDM2LCAweDQ3LCAweEZGLCAweDIzLAorCSAweDA0LCAweDAwLCAweDAwLCAweDdGLCAweDYwLCAweDQxLCAweDdGLCAweDY3LCAweDA0LCAweDAwLCAweDIwLCAweDQ0LCAweDgwLCAweEJDLCAweDQwLCAweDQwLAorCSAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDdGLCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLCAweDdGLCAweDY3LAorCSAweDAyLCAweDYxLCAweDMxLCAweDAyLCAweDFDLCAweDYwLCAweEI0LCAweDYzLCAweEEzLCAweEQzLCAweDAxLCAweDdDLCAweDIwLCAweEI1LCAweDBDLCAweEI1LAorCSAweDAzLCAweDAzLCAweDAyLCAweDAyLCAweERDLCAweEY5LCAweEZGLCAweEZGLCAweDAyLCAweDYxLCAweDQxLCAweDU2LCAweEM3LCAweEZFLCAweDI1LCAweDYwLAorCSAweDExLCAweDc4LCAweEZGLCAweEZGLCAweDlGLCAweEYxLCAweDIwLCAweDQ0LCAweDY0LCAweDQwLCAweEZGLCAweDI2LCAweDFCLCAweDAwLCAweDdGLCAweEI0LAorCSAweDQwLCAweDQwLCAweDVDLCAweDVFLCAweDgyLCAweEZGLCAweDI2LCAweDQ0LCAweEZELCAweEI0LCAweDQwLCAweDQ2LCAweDVDLCAweDQxLCAweDg3LCAweEZGLAorCSAweDYyLCAweEZGLCAweDAwLCAweDYzLCAweDI0LCAweDYwLCAweDVFLCAweDYyLCAweEEyLCAweEQzLCAweEZGLCAweEZGLCAweDAwLCAweEE4LCAweDYwLCAweDQ2LAorCSAweDA0LCAweDAzLCAweDA5LCAweEYyLCAweDBGLCAweEZDLCAweEFDLCAweDg2LCAweEZCLCAweDAxLCAweDI0LCAweDYwLCAweDlFLCAweDYyLCAweDA2LCAweDY0LAorCSAweEEyLCAweERCLCAweDJELCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDY3LCAweDIwLCAweDQwLCAweDgwLCAweDJBLAorCSAweDAyLCAweDAwLCAweDdGLCAweDY3LCAweDA2LCAweDYxLCAweDYwLCAweDQ1LCAweDFDLCAweDYwLCAweEI0LCAweDdDLCAweEE0LCAweEQzLCAweDYxLCAweDQzLAorCSAweDA0LCAweEI0LCAweDI0LCAweDQ0LCAweDAyLCAweDAzLCAweDEzLCAweEZGLCAweDU1LCAweDAxLCAweDNGLCAweEI0LCAweEI0LCAweDg0LCAweEZGLCAweDI3LAorCSAweDA1LCAweEZELCAweDA0LCAweEZCLCAweDIwLCAweDQwLCAweDgwLCAweDJBLCAweDAyLCAweDAwLCAweDEwLCAweDc1LCAweDA3LCAweDAwLCAweDJELCAweDYwLAorCSAweDlDLCAweDYyLCAweDAxLCAweDY0LCAweEEyLCAweERCLCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDEwLCAweDc1LCAweDQzLCAweDAxLCAweDI1LCAweDQ2LAorCSAweDAxLCAweEYyLCAweDA4LCAweEYwLCAweDYwLCAweDQ3LCAweDAzLCAweEI0LCAweDAzLCAweEFDLCAweDdGLCAweDY3LCAweDAzLCAweDYxLCAweDA4LCAweDAyLAorCSAweDI0LCAweDYwLCAweDdBLCAweDY0LCAweDQwLCAweDRCLCAweDJDLCAweDYwLCAweDU4LCAweDRELCAweEQ4LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY3LAorCSAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI0LCAweDQwLCAweDAxLCAweDJCLCAweDQ5LCAweDAwLCAweDI1LCAweDQ0LCAweDFGLCAweEI0LCAweEUwLCAweDg1LAorCSAweDI1LCAweDYwLCAweEVCLCAweDY0LCAweEM0LCAweDk4LCAweEZGLCAweEZGLCAweEMwLCAweEZFLCAweDNELCAweDAwLCAweEMxLCAweEZFLCAweDNCLCAweDAwLAorCSAweEMyLCAweEZFLCAweDM5LCAweDAwLCAweEMzLCAweEZFLCAweDM3LCAweDAwLCAweEM0LCAweEZFLCAweDM1LCAweDAwLCAweEM1LCAweEZFLCAweDMzLCAweDAwLAorCSAweEM2LCAweEZFLCAweDMxLCAweDAwLCAweEM3LCAweEZFLCAweDJGLCAweDAwLCAweEM4LCAweEZFLCAweDJELCAweDAwLCAweEM5LCAweEZFLCAweDJCLCAweDAwLAorCSAweENBLCAweEZFLCAweDI5LCAweDAwLCAweENCLCAweEZFLCAweDI3LCAweDAwLCAweENDLCAweEZFLCAweDI1LCAweDAwLCAweENELCAweEZFLCAweDIzLCAweDAwLAorCSAweENFLCAweEZFLCAweDIxLCAweDAwLCAweENGLCAweEZFLCAweDFGLCAweDAwLCAweEQwLCAweEZFLCAweDFELCAweDAwLCAweEQxLCAweEZFLCAweDFCLCAweDAwLAorCSAweEQyLCAweEZFLCAweDE5LCAweDAwLCAweEQzLCAweEZFLCAweDE3LCAweDAwLCAweEQ0LCAweEZFLCAweDE1LCAweDAwLCAweEQ1LCAweEZFLCAweDEzLCAweDAwLAorCSAweEQ2LCAweEZFLCAweDExLCAweDAwLCAweEQ3LCAweEZFLCAweDBGLCAweDAwLCAweEQ4LCAweEZFLCAweDBELCAweDAwLCAweEQ5LCAweEZFLCAweDBCLCAweDAwLAorCSAweERBLCAweEZFLCAweDA5LCAweDAwLCAweERCLCAweEZFLCAweDA3LCAweDAwLCAweERDLCAweEZFLCAweDA1LCAweDAwLCAweERELCAweEZFLCAweDAzLCAweDAwLAorCSAweERFLCAweEZFLCAweDAxLCAweDAwLCAweERGLCAweEZFLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDY0LCAweDlGLCAweEZFLAorCSAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDlFLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDlELCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLAorCSAweDlDLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDlCLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDlBLCAweEZFLCAweEYwLCAweDg0LAorCSAweEZGLCAweEZGLCAweDk5LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDk4LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDk3LCAweEZFLAorCSAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDk2LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDk1LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLAorCSAweDk0LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDkzLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDkyLCAweEZFLCAweEYwLCAweDg0LAorCSAweEZGLCAweEZGLCAweDkxLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDkwLCAweEZFLCAweEYwLCAweDg0LCAweDA2LCAweEZCLCAweDhGLCAweEZFLAorCSAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDhFLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDhELCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLAorCSAweDhDLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDhCLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDhBLCAweEZFLCAweEYwLCAweDg0LAorCSAweEZGLCAweEZGLCAweDg5LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDg4LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDg3LCAweEZFLAorCSAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDg2LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDg1LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLAorCSAweDg0LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDgzLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDgyLCAweEZFLCAweEYwLCAweDg0LAorCSAweEZGLCAweEZGLCAweDgxLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDgwLCAweEZFLCAweEYwLCAweDg0LCAweDA1LCAweEZCLCAweDAwLCAweDY3LAorCSAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDVDLCAweDVDLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI0LCAweDQwLCAweDAxLCAweDI3LAorCSAweDU1LCAweDAwLCAweDA1LCAweDYwLCAweDAwLCAweDYzLCAweDA1LCAweEZELCAweDMwLCAweDQ0LCAweEJELCAweERCLCAweDMxLCAweDQ0LCAweEJELCAweERCLAorCSAweDMyLCAweDQ0LCAweEJELCAweERCLCAweDMzLCAweDQ0LCAweEJELCAweERCLCAweDM0LCAweDQ0LCAweEJELCAweERCLCAweDM1LCAweDQ0LCAweEJELCAweERCLAorCSAweDM2LCAweDQ0LCAweEJELCAweERCLCAweDM3LCAweDQ0LCAweEJELCAweERCLCAweDM4LCAweDQ0LCAweEJELCAweERCLCAweDM5LCAweDQ0LCAweEJELCAweERCLAorCSAweDNBLCAweDQ0LCAweEJELCAweERCLCAweDNCLCAweDQ0LCAweEJELCAweERCLCAweDNDLCAweDQ0LCAweEJELCAweERCLCAweDNELCAweDQ0LCAweEJELCAweERCLAorCSAweDNFLCAweDQ0LCAweEJELCAweERCLCAweDNGLCAweDQ0LCAweEJELCAweERCLCAweDAyLCAweDYxLCAweDYxLCAweDQ0LCAweDAyLCAweDM2LCAweDgyLCAweEZGLAorCSAweDAzLCAweDM2LCAweDgzLCAweEZGLCAweDA0LCAweDM2LCAweDg0LCAweEZGLCAweDA1LCAweDM2LCAweDg1LCAweEZGLCAweDA2LCAweDM2LCAweDg2LCAweEZGLAorCSAweDA3LCAweDM2LCAweDg3LCAweEZGLCAweDIwLCAweDQ0LCAweEJELCAweERCLCAweDIxLCAweDQ0LCAweEJELCAweERCLCAweDIyLCAweDQ0LCAweEJELCAweERCLAorCSAweDIzLCAweDQ0LCAweEJELCAweERCLCAweDI0LCAweDQ0LCAweEJELCAweERCLCAweDI1LCAweDQ0LCAweEJELCAweERCLCAweDI2LCAweDQ0LCAweEJELCAweERCLAorCSAweDI3LCAweDQ0LCAweEJELCAweERCLCAweDI4LCAweDQ0LCAweEJELCAweERCLCAweDI5LCAweDQ0LCAweEJELCAweERCLCAweDJBLCAweDQ0LCAweEJELCAweERCLAorCSAweDJCLCAweDQ0LCAweEJELCAweERCLCAweDJDLCAweDQ0LCAweEJELCAweERCLCAweDJELCAweDQ0LCAweEJELCAweERCLCAweDJFLCAweDQ0LCAweEJELCAweERCLAorCSAweDJGLCAweDQ0LCAweEJELCAweERCLCAweERELCAweDgxLCAweDA4LCAweDNBLCAweEQwLCAweDAxLCAweDU0LCAweDAwLCAweDI3LCAweDQwLCAweDEwLCAweDI2LAorCSAweDMwLCAweDAwLCAweDI2LCAweDQ0LCAweDAxLCAweDM2LCAweDJELCAweDAwLCAweDAyLCAweDM2LCAweDgyLCAweEZGLCAweDAzLCAweDM2LCAweDgzLCAweEZGLAorCSAweDA0LCAweDM2LCAweDg0LCAweEZGLCAweDA1LCAweDM2LCAweDg1LCAweEZGLCAweDA2LCAweDM2LCAweDg2LCAweEZGLCAweDI1LCAweDQ0LCAweDAwLCAweDM2LAorCSAweDQ0LCAweDQwLCAweDAxLCAweDM2LCAweDQ0LCAweDQxLCAweDAyLCAweDM2LCAweDQ0LCAweDQyLCAweDAzLCAweDM2LCAweDQ0LCAweDQzLCAweDA0LCAweDM2LAorCSAweDQ0LCAweDQ0LCAweDA1LCAweDM2LCAweDQ0LCAweDQ1LCAweDA2LCAweDM2LCAweDQ0LCAweDQ2LCAweDA3LCAweDM2LCAweDQ0LCAweDQ3LCAweDA4LCAweDM2LAorCSAweDQ0LCAweDQ4LCAweDA5LCAweDM2LCAweDQ0LCAweDQ5LCAweDBBLCAweDM2LCAweDQ0LCAweDRBLCAweDBCLCAweDM2LCAweDQ0LCAweDRCLCAweDBDLCAweDM2LAorCSAweDQ0LCAweDRDLCAweDBELCAweDM2LCAweDQ0LCAweDRELCAweDBFLCAweDM2LCAweDQ0LCAweDRFLCAweDBGLCAweDM2LCAweDQ0LCAweDRGLCAweDg3LCAweEZGLAorCSAweDIxLCAweDAwLCAweDI1LCAweDQ0LCAweDEwLCAweDM2LCAweDQ0LCAweDUwLCAweDExLCAweDM2LCAweDQ0LCAweDUxLCAweDEyLCAweDM2LCAweDQ0LCAweDUyLAorCSAweDEzLCAweDM2LCAweDQ0LCAweDUzLCAweDE0LCAweDM2LCAweDQ0LCAweDU0LCAweDE1LCAweDM2LCAweDQ0LCAweDU1LCAweDE2LCAweDM2LCAweDQ0LCAweDU2LAorCSAweDE3LCAweDM2LCAweDQ0LCAweDU3LCAweDE4LCAweDM2LCAweDQ0LCAweDU4LCAweDE5LCAweDM2LCAweDQ0LCAweDU5LCAweDFBLCAweDM2LCAweDQ0LCAweDVBLAorCSAweDFCLCAweDM2LCAweDQ0LCAweDVCLCAweDFDLCAweDM2LCAweDQ0LCAweDVDLCAweDFELCAweDM2LCAweDQ0LCAweDVELCAweDFFLCAweDM2LCAweDQ0LCAweDVFLAorCSAweDFGLCAweDM2LCAweDQ0LCAweDVGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI1LCAweDQ2LCAweEFFLCAweDYwLCAweDU4LCAweDRGLAorCSAweDZGLCAweDc4LCAweEZGLCAweEZGLCAweDAzLCAweDYxLCAweDdGLCAweDY3LCAweDBCLCAweDAyLCAweDAwLCAweEYwLCAweDI0LCAweDYwLCAweDdBLCAweDYyLAorCSAweDA0LCAweDY0LCAweEEyLCAweERCLCAweDVBLCAweEQ5LCAweDBBLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDAwLCAweDY3LAorCSAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDQwLCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLCAweDdGLCAweDY3LCAweDAyLCAweDYxLAorCSAweDExLCAweDAyLCAweDI0LCAweDYwLCAweDlFLCAweDYyLCAweDFBLCAweDY0LCAweEEyLCAweERCLCAweDAwLCAweDYwLCAweDUwLCAweDYzLCAweDVBLCAweERELAorCSAweDI3LCAweDYwLCAweDZFLCAweDY0LCAweEExLCAweEZCLCAweDJELCAweEZGLCAweDI1LCAweDYwLCAweDExLCAweDc4LCAweEZGLCAweEZGLCAweDJBLCAweEYzLAorCSAweDA1LCAweEZCLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDQwLCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLAorCSAweDdGLCAweDY3LCAweDAyLCAweDYxLCAweDBGLCAweDAyLCAweDI0LCAweDYwLCAweDlFLCAweDYyLCAweDFDLCAweDY0LCAweEEyLCAweERCLCAweDAwLCAweDYwLAorCSAweDUwLCAweDYzLCAweDVBLCAweERELCAweDI3LCAweDYwLCAweDg4LCAweDY0LCAweEExLCAweEZCLCAweDJELCAweEZGLCAweDI1LCAweDYwLCAweDExLCAweDc4LAorCSAweEZGLCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDdGLCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLAorCSAweDAyLCAweDYxLCAweDNFLCAweDAyLCAweDI1LCAweDQ1LCAweDIwLCAweDQ0LCAweDgwLCAweDJBLCAweDNBLCAweDAwLCAweEYxLCAweDYwLCAweDAwLCAweDY0LAorCSAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDBCLCAweDAzLCAweEYxLCAweDYwLCAweDAxLCAweDY0LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDA2LCAweDAzLAorCSAweEYxLCAweDYwLCAweDAyLCAweDY0LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDMwLCAweDAzLCAweDI5LCAweDAwLCAweDJELCAweDYwLCAweDBFLCAweDYyLAorCSAweEEyLCAweEQxLCAweEJBLCAweEYzLCAweDFGLCAweDYwLCAweDgyLCAweDYxLCAweEEwLCAweDg0LCAweEExLCAweERCLCAweDI1LCAweDQ1LCAweDIzLCAweDYwLAorCSAweEU0LCAweDYzLCAweDAyLCAweDYxLCAweEJELCAweEQzLCAweEJELCAweEQxLCAweEQ0LCAweDgwLCAweEJELCAweEQzLCAweEJELCAweEQ1LCAweENELCAweDgxLAorCSAweDAyLCAweDAzLCAweDE1LCAweDAzLCAweEY3LCAweDAxLCAweEEyLCAweEZGLCAweEE2LCAweEQzLCAweDQwLCAweDRDLCAweDAwLCAweEE4LCAweDY3LCAweDQzLAorCSAweDBDLCAweDAyLCAweEEyLCAweERELCAweDQyLCAweDQ4LCAweDY0LCAweDQxLCAweEFFLCAweDYwLCAweDU4LCAweDRELCAweEM0LCAweDc4LCAweEZGLCAweEZGLAorCSAweDY2LCAweDQ0LCAweDI4LCAweERCLCAweDAyLCAweDAzLCAweDJDLCAweDU4LCAweEEzLCAweEZGLCAweDBDLCAweDYxLCAweDAzLCAweDAwLCAweDA0LCAweDYxLAorCSAweDdGLCAweDY3LCAweDAxLCAweDAwLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDJELCAweDYwLCAweDBFLCAweDYyLCAweEEyLCAweEQxLAorCSAweEJBLCAweEYzLCAweDFGLCAweDYwLCAweDgyLCAweDYxLCAweEEwLCAweDg0LCAweEExLCAweERCLCAweDFGLCAweDYwLCAweDg2LCAweDYxLCAweDAxLCAweDY0LAorCSAweEExLCAweERCLCAweEZGLCAweEZGLCAweEM0LCAweEZFLCAweEVFLCAweDAxLCAweEM2LCAweEZFLCAweEVDLCAweDAxLCAweDdFLCAweDYwLCAweEMwLCAweDY0LAorCSAweDI0LCAweDQ1LCAweEE0LCAweDgwLCAweDAyLCAweDYxLCAweDNGLCAweDAyLCAweDI1LCAweDQ1LCAweEY4LCAweDJCLCAweDNCLCAweDAwLCAweDJFLCAweEY1LAorCSAweDY3LCAweDQ0LCAweEQ0LCAweDgwLCAweDIwLCAweDYwLCAweDI0LCAweDYzLCAweDM5LCAweDAzLCAweDYwLCAweDYxLCAweDI0LCAweDQ0LCAweDAxLCAweDI3LAorCSAweDI5LCAweDAwLCAweEEzLCAweEZDLCAweEE0LCAweEY4LCAweEJELCAweEQzLCAweEEzLCAweEQxLCAweEQ0LCAweDgwLCAweENELCAweDgxLCAweDA4LCAweDI0LAorCSAweDY0LCAweDU4LCAweDA4LCAweEEzLCAweEY4LCAweDAyLCAweDA4LCAweDYwLCAweDAwLCAweDYzLCAweEJELCAweEQzLCAweEEzLCAweEQxLCAweEZFLCAweEEwLAorCSAweEZBLCAweDYwLCAweDAwLCAweDY0LCAweEQwLCAweDgwLCAweDE0LCAweDAyLCAweDEzLCAweDAyLCAweDA0LCAweEEzLCAweEJFLCAweEQzLCAweEJELCAweEQxLAorCSAweDBGLCAweDE4LCAweEQ0LCAweDgwLCAweDBELCAweDE4LCAweDAzLCAweDAzLCAweEMzLCAweDgzLCAweEMzLCAweDgzLCAweEY3LCAweDAxLCAweDY0LCAweDQxLAorCSAweERELCAweDgxLCAweEUxLCAweDgxLCAweENCLCAweDgzLCAweDQ2LCAweDY1LCAweDJGLCAweDYwLCAweDU4LCAweDRGLCAweDAxLCAweDc4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDY3LCAweDBBLCAweDAwLCAweEJELCAweEQzLCAweEJFLCAweEQxLCAweEQ0LCAweDgwLCAweENELCAweDgxLCAweDA4LCAweDI0LCAweDY0LCAweDU4LAorCSAweDA4LCAweEEzLCAweEY4LCAweDAyLCAweDA0LCAweDYxLCAweDdGLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDY0LCAweDIzLCAweEZBLAorCSAweDY3LCAweDQ0LCAweDI0LCAweEZBLCAweDYyLCAweDQxLCAweDNDLCAweDYwLCAweDAwLCAweDY1LCAweDFBLCAweDYzLCAweDY4LCAweDYwLCAweDI4LCAweDY0LAorCSAweDY1LCAweDQ2LCAweDU4LCAweEQwLCAweDJFLCAweEY1LCAweDU5LCAweEQ4LCAweEZCLCAweDFGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweENCLCAweDgzLCAweEJGLCAweEQxLCAweDRBLCAweDY1LCAweDY0LCAweDQzLCAweEJELCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQxLCAweDAxLCAweDI2LAorCSAweERDLCAweDgxLCAweEU5LCAweDg0LCAweERDLCAweDg0LCAweDIzLCAweEZBLCAweDA5LCAweDAwLCAweDRCLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQxLAorCSAweEU4LCAweDg0LCAweERDLCAweDg0LCAweDIzLCAweEZBLCAweEJGLCAweEQxLCAweDRBLCAweDY1LCAweDY0LCAweDQzLCAweDJGLCAweDYwLCAweDU4LCAweDRGLAorCSAweDAxLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI1LCAweEYyLCAweEZGLCAweEZGLCAweEUwLCAweEEwLAorCSAweDIwLCAweDY0LCAweDAxLCAweDA2LCAweDI1LCAweEZBLCAweDIzLCAweEYyLCAweERGLCAweEQxLCAweENDLCAweDg0LCAweEUwLCAweDg1LCAweDBCLCAweDA2LAorCSAweEJGLCAweEQxLCAweDY0LCAweDQxLCAweEQ1LCAweDgwLCAweDY0LCAweDQzLCAweDAxLCAweDA2LCAweDY1LCAweDQxLCAweDRBLCAweDY1LCAweDI5LCAweDYwLAorCSAweDU4LCAweDRGLCAweDgzLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweERDLCAweEYzLCAweDAyLCAweDYzLAorCSAweDIzLCAweEZDLCAweDA3LCAweEI0LCAweDI1LCAweEZBLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDRCLCAweEQzLCAweEJGLCAweEQzLAorCSAweDYwLCAweDQxLCAweEM5LCAweDgzLCAweEU5LCAweDgxLCAweERELCAweDgxLCAweEEzLCAweEZBLCAweEUwLCAweDgxLCAweDNDLCAweDYwLCAweDAwLCAweDY3LAorCSAweDAyLCAweDI0LCAweDAyLCAweEE0LCAweDYwLCAweDQ3LCAweDQwLCAweDRCLCAweEM5LCAweDgxLCAweDRBLCAweDY1LCAweEFCLCAweDQ2LCAweDU5LCAweEQwLAorCSAweEFCLCAweDQ2LCAweEE1LCAweEQ4LCAweERBLCAweDg1LCAweDgwLCAweDNBLCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDA0LCAweDY1LCAweEY2LCAweDFGLAorCSAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweEZDLCAweEEzLCAweEEzLCAweEQxLCAweDRDLCAweDY1LCAweEE0LCAweEQzLCAweERBLCAweDgzLAorCSAweDYwLCAweDQ3LCAweDI1LCAweEZBLCAweDAwLCAweDdFLCAweDYwLCAweDQ3LCAweDAxLCAweDI2LCAweERDLCAweDg0LCAweDYwLCAweDQxLCAweEU4LCAweDg0LAorCSAweEQ4LCAweDg0LCAweDIzLCAweEZBLCAweEFCLCAweDAxLCAweEZDLCAweEEzLCAweEEzLCAweEQxLCAweDRDLCAweDY1LCAweEE0LCAweEQzLCAweERBLCAweDgzLAorCSAweDAwLCAweDdGLCAweDI1LCAweEZBLCAweDYwLCAweDQxLCAweDAxLCAweDI2LCAweERELCAweDgxLCAweEU5LCAweDg0LCAweEQ4LCAweDg0LCAweDIzLCAweEZBLAorCSAweDlELCAweDAxLCAweDI4LCAweDYwLCAweEUyLCAweDYzLCAweEJGLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQxLCAweEU4LCAweDg0LCAweERDLCAweDg0LAorCSAweDIzLCAweEZBLCAweDRBLCAweDY1LCAweDJGLCAweDYwLCAweDU4LCAweDRGLCAweDAxLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweDI4LCAweDYwLCAweEUyLCAweDYzLCAweDIzLCAweEYyLCAweEMwLCAweDY1LCAweENDLCAweDg0LCAweEUwLCAweDgxLCAweDBBLCAweDA0LAorCSAweEJGLCAweERCLCAweEQ1LCAweDgwLCAweDA3LCAweDAzLCAweDAxLCAweDA2LCAweDY1LCAweDQxLCAweDYxLCAweDQ0LCAweEJGLCAweERCLCAweDRBLCAweDY1LAorCSAweDU4LCAweDRGLCAweEFBLCAweDAwLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAzLCAweDRFLCAweDI4LCAweDYwLCAweDU4LCAweDQzLAorCSAweDVDLCAweDc4LCAweEZGLCAweEZGLCAweDI5LCAweDYwLCAweEM2LCAweDYxLCAweDI5LCAweDYwLCAweEE0LCAweDYyLCAweEEyLCAweEQzLCAweEExLCAweERCLAorCSAweENDLCAweDg0LCAweEE4LCAweDgzLCAweDA1LCAweDA0LCAweDI5LCAweDYwLCAweEE0LCAweDY0LCAweDU4LCAweEQxLCAweDU5LCAweEQ5LCAweEZELCAweDFGLAorCSAweDBFLCAweDQzLCAweDgxLCAweDAxLCAweDIzLCAweEYyLCAweDFDLCAweDYwLCAweDhFLCAweDY1LCAweDYwLCAweDQxLCAweDFDLCAweDYwLCAweDJBLCAweDYzLAorCSAweEEzLCAweERCLCAweEZGLCAweEExLCAweDQ4LCAweDY0LCAweDU4LCAweEQwLCAweDdFLCAweEE4LCAweDVCLCAweEQ5LCAweDAyLCAweDAyLCAweDAwLCAweEY0LAorCSAweDAyLCAweDY0LCAweEZGLCAweEExLCAweEQ3LCAweDgwLCAweDAyLCAweDAzLCAweDAxLCAweDAzLCAweEY1LCAweDAxLCAweDJFLCAweEY1LCAweDAwLCAweDYwLAorCSAweDJGLCAweDY1LCAweDI1LCAweEYyLCAweDAwLCAweDYzLCAweENDLCAweDg0LCAweDAzLCAweEEzLCAweEZELCAweDA1LCAweDRBLCAweDY0LCAweEQ3LCAweDgwLAorCSAweDFCLCAweDYwLCAweEM2LCAweDYxLCAweDJGLCAweDA1LCAweEExLCAweERELCAweEUzLCAweDgzLCAweEZFLCAweEEzLCAweDU4LCAweEQwLCAweDdFLCAweEE4LAorCSAweDU5LCAweEQ5LCAweDAyLCAweDAyLCAweDAwLCAweEY0LCAweDAyLCAweDY0LCAweEY5LCAweDFGLCAweDAwLCAweDYzLCAweDU5LCAweERELCAweDJFLCAweEY1LAorCSAweDFCLCAweDYwLCAweEM2LCAweDY0LCAweDI1LCAweEYwLCAweEEwLCAweEQzLCAweEQzLCAweDgwLCAweDAxLCAweEIwLCAweDA0LCAweDAzLCAweDAxLCAweEE0LAorCSAweDAzLCAweDAzLCAweEEyLCAweERCLCAweDAxLCAweDAwLCAweEEyLCAweERELCAweDFCLCAweDYwLCAweENFLCAweDYzLCAweDEwLCAweDYwLCAweDVBLCAweDY1LAorCSAweEJELCAweEQzLCAweEJELCAweEQxLCAweEUwLCAweDg0LCAweEM0LCAweDgyLCAweDEwLCAweDYwLCAweDdBLCAweDY1LCAweDA3LCAweDY0LCAweDY0LCAweDQxLAorCSAweDVBLCAweERCLCAweEQ2LCAweDgwLCAweENELCAweDgxLCAweDA2LCAweDAzLCAweEZCLCAweDAyLCAweDI1LCAweEYyLCAweDAyLCAweEEzLCAweENDLCAweDg0LAorCSAweEEyLCAweERBLCAweEVDLCAweDAyLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDFDLCAweDYwLCAweDJBLCAweDYxLCAweEExLCAweEQzLAorCSAweDIzLCAweEZBLCAweEUwLCAweDgzLCAweDRBLCAweDY1LCAweDA0LCAweDAyLCAweDAyLCAweDYzLCAweDIzLCAweEZDLCAweEE1LCAweEZDLCAweDA5LCAweDAwLAorCSAweERCLCAweDgzLCAweDU5LCAweEQxLCAweEE1LCAweEQ4LCAweERBLCAweDg1LCAweDgwLCAweDNBLCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDA0LCAweDY1LAorCSAweEY4LCAweDFGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDFCLCAweDYwLCAweEM2LCAweDYyLCAweEEyLCAweEQzLCAweDAwLCAweDYxLAorCSAweDAyLCAweEE0LCAweEZFLCAweEEwLCAweDIzLCAweEZBLCAweDFCLCAweDAzLCAweEZBLCAweEE0LCAweEZELCAweEE0LCAweDAxLCAweEExLCAweEZELCAweDA3LAorCSAweDYxLCAweDQzLCAweDIzLCAweEYyLCAweDI1LCAweEZDLCAweEUwLCAweDgzLCAweDAyLCAweEEzLCAweDFCLCAweDYwLCAweEM2LCAweDYxLCAweDAwLCAweDYwLAorCSAweDRBLCAweDY0LCAweDU5LCAweEQxLCAweDU4LCAweEQ4LCAweDdFLCAweDNBLCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDAyLCAweDY0LCAweEY5LCAweDFGLAorCSAweDI1LCAweEYyLCAweDIzLCAweEYyLCAweDAxLCAweEIwLCAweENDLCAweDg0LCAweDA0LCAweDAyLCAweDIzLCAweEZBLCAweDAyLCAweDAwLCAweDAwLCAweDY0LAorCSAweDI1LCAweEZBLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDQxLCAweDRCLCAweDY1LCAweDQyLCAweDgwLCAweDY0LCAweEQ0LCAweDg1LAorCSAweDJCLCAweDQxLCAweDAwLCAweEExLCAweDU1LCAweDhCLCAweDBELCAweDAzLCAweDAyLCAweDA0LCAweDY1LCAweDQxLCAweDAyLCAweDAwLCAweDAwLCAweDY0LAorCSAweDQwLCAweDRCLCAweENBLCAweDg0LCAweDU4LCAweEQwLCAweEM5LCAweDgxLCAweEJELCAweEQ5LCAweEZDLCAweDAyLCAweDAwLCAweEY0LCAweDA0LCAweDY1LAorCSAweEVDLCAweDAxLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEZDLCAweEEzLCAweEEzLCAweEQzLCAweDAyLCAweDdDLCAweEEwLCAweEQzLCAweDIzLCAweEY4LAorCSAweERDLCAweDg0LCAweDI1LCAweEZBLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAyLCAweDY0LCAweDIzLCAweEZBLCAweDAxLCAweDY0LAorCSAweDlELCAweEZFLCAweDAyLCAweDI4LCAweDAyLCAweDY0LCAweDI1LCAweEZBLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDJELCAweDYwLAorCSAweDFBLCAweDYyLCAweEEyLCAweEQzLCAweDAyLCAweDdDLCAweDIzLCAweEY4LCAweDAxLCAweEI0LCAweDI1LCAweEZBLCAweDAwLCAweDY3LCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweEZDLCAweEEzLCAweEEzLCAweEQxLCAweDAyLCAweDY0LCAweDIzLCAweEZBLCAweEE0LCAweEQzLCAweDAwLCAweDYzLCAweDYwLCAweDQwLAorCSAweDBBLCAweDM3LCAweDAxLCAweDYzLCAweDE0LCAweDM3LCAweDAyLCAweDYzLCAweDM3LCAweDM3LCAweDA2LCAweDYzLCAweDZFLCAweDM3LCAweDBCLCAweDYzLAorCSAweDI1LCAweEZDLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAyLCAweDY0LCAweDIzLCAweEZBLCAweDg4LCAweEZGLCAweDc1LCAweDQ0LAorCSAweDhELCAweEZGLCAweEU4LCAweDg3LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDAzLCAweEI0LCAweDI1LCAweEZBLCAweDAwLCAweDY3LCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweDA0LCAweDY0LCAweDIzLCAweEZBLCAweDg2LCAweEZGLCAweDI5LCAweDQ0LCAweDg3LCAweEZGLCAweDI1LCAweEZBLCAweDU1LCAweEYzLAorCSAweDUyLCAweEYxLCAweDgwLCAweDY1LCAweEM0LCAweDg3LCAweDAwLCAweDdGLCAweDI2LCAweEZBLCAweDY0LCAweDQ0LCAweEM0LCAweDg3LCAweDAwLCAweDdGLAorCSAweDI3LCAweEZBLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDA1LCAweDY0LCAweDIzLCAweEZBLCAweDUyLCAweDYzLCAweEI3LCAweEYzLAorCSAweDRCLCAweERBLCAweEI2LCAweEYzLCAweDRCLCAweERBLCAweEI1LCAweEYzLCAweDRCLCAweERBLCAweDYwLCAweDQxLCAweDg4LCAweEZGLCAweDcyLCAweDVDLAorCSAweDg5LCAweEZGLCAweDRBLCAweEQ4LCAweEEyLCAweDQ4LCAweDIwLCAweDIzLCAweDBFLCAweDAwLCAweDY0LCAweDQwLCAweDgwLCAweDI3LCAweDE1LCAweDAwLAorCSAweERDLCAweDg0LCAweEJELCAweERBLCAweEJELCAweEQyLCAweDExLCAweDA0LCAweERDLCAweDg0LCAweEEyLCAweERBLCAweEEzLCAweEQyLCAweDBELCAweDA0LAorCSAweERDLCAweDg0LCAweEEzLCAweERBLCAweDBBLCAweDAwLCAweDUyLCAweDYzLCAweEI3LCAweEYzLCAweDRCLCAweERBLCAweEI2LCAweEYzLCAweDRCLCAweERBLAorCSAweEI1LCAweEYzLCAweDRCLCAweERBLCAweDU0LCAweDkwLCAweDRDLCAweDYzLCAweEUwLCAweDAyLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDI1LCAweEYwLCAweDJELCAweDYwLCAweDE2LCAweDY1LCAweDIzLCAweEYyLCAweEE1LCAweEQ5LCAweDAyLCAweEE4LCAweDY0LCAweDQ0LCAweDA3LCAweDAyLAorCSAweDAwLCAweEJDLCAweEYyLCAweEE0LCAweDA0LCAweDAzLCAweDAzLCAweDA3LCAweDI4LCAweDYwLCAweDQ0LCAweDYyLCAweEEyLCAweEQ5LCAweDAwLCAweDY3LAorCSAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDIwLCAweDYzLCAweDI4LCAweDYwLCAweEE0LCAweDYxLCAweDQ4LCAweDY0LCAweDU4LCAweEQwLCAweDU5LCAweEQ5LAorCSAweEZELCAweDFGLCAweDI1LCAweEYwLCAweDIwLCAweDY0LCAweEQwLCAweDgxLCAweEZGLCAweEZGLCAweDAyLCAweDA3LCAweDI1LCAweEZBLCAweDBGLCAweDAwLAorCSAweDI4LCAweDYwLCAweEE4LCAweDYzLCAweEMzLCAweDgzLCAweDAxLCAweDJBLCAweDA2LCAweDAwLCAweENGLCAweDgzLCAweEEzLCAweEQzLCAweENELCAweDgxLAorCSAweDAwLCAweDdGLCAweEJELCAweERCLCAweDA0LCAweDAzLCAweDAwLCAweDY0LCAweEM5LCAweDgxLCAweEJELCAweERCLCAweEZELCAweDAyLCAweDAwLCAweDY3LAorCSAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDIzLCAweEYyLCAweDI1LCAweEYwLCAweDAyLCAweEE4LCAweDAxLCAweDYwLCAweEE2LCAweDYyLCAweDA5LCAweDAyLAorCSAweEEyLCAweEQ5LCAweDY0LCAweDQxLCAweDMyLCAweDQ0LCAweDAyLCAweEI1LCAweDAwLCAweEI5LCAweEQ0LCAweDg0LCAweDA4LCAweDI4LCAweDAyLCAweEJDLAorCSAweDQwLCAweDUyLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDIzLCAweEYyLCAweDI1LCAweEYwLCAweDAyLCAweEE4LCAweDAxLCAweDYwLAorCSAweEIyLCAweDYyLCAweDBDLCAweDAyLCAweEEyLCAweEQ5LCAweDY0LCAweDQxLCAweDMyLCAweDQ0LCAweDQwLCAweEI1LCAweDAwLCAweEI5LCAweEQ0LCAweDg0LAorCSAweDA4LCAweDI0LCAweDAzLCAweDAwLCAweDQwLCAweEJDLCAweDAyLCAweEI1LCAweEQ0LCAweDg0LCAweDQwLCAweDUyLCAweDAwLCAweDY3LCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweDIzLCAweEYyLCAweDI1LCAweEYwLCAweDAxLCAweDYwLCAweEIwLCAweDYzLCAweEEzLCAweEQ5LCAweEE5LCAweEYxLCAweDIwLCAweDYxLAorCSAweDQxLCAweDRCLCAweDY0LCAweDQzLCAweEQ4LCAweEYzLCAweDYzLCAweDQ1LCAweDY2LCAweDQxLCAweDY1LCAweDQ2LCAweDhDLCAweEZBLCAweDYwLCAweDQwLAorCSAweDAxLCAweDM2LCAweDA2LCAweDAwLCAweDAyLCAweDM2LCAweDA0LCAweDAwLCAweDA0LCAweDM2LCAweDAyLCAweDAwLCAweDA1LCAweDNBLCAweDAyLCAweDAwLAorCSAweDAwLCAweDY0LCAweDAxLCAweDAwLCAweDAxLCAweDY0LCAweDZGLCAweEZBLCAweDc5LCAweEYzLCAweDdBLCAweEYxLCAweEZGLCAweEZGLCAweEEwLCAweDg0LAorCSAweDY1LCAweDQzLCAweDAyLCAweDAyLCAweDc5LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQxLCAweDBGLCAweDYwLCAweEFFLCAweDY1LCAweEQ4LCAweEYzLAorCSAweEZGLCAweEZGLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDYxLCAweDQ1LCAweEE0LCAweDgwLCAweEZGLCAweEZGLCAweDA0LCAweDAyLCAweEU4LCAweDg0LAorCSAweEE0LCAweDgwLCAweEZGLCAweEZGLCAweEZDLCAweDAzLCAweEE0LCAweDg0LCAweDdCLCAweEZCLCAweDZGLCAweEYwLCAweDYwLCAweDQ3LCAweDkwLCAweDg0LAorCSAweDZGLCAweEZBLCAweDYwLCAweDQ3LCAweDYwLCAweDQ1LCAweDgwLCAweDY0LCAweEU4LCAweDg0LCAweEE0LCAweDgwLCAweEZGLCAweEZGLCAweEZDLCAweDAzLAorCSAweEE0LCAweDg0LCAweDcwLCAweEYwLCAweDcwLCAweEZBLCAweDAwLCAweDYxLCAweEU4LCAweDg0LCAweEZGLCAweEZGLCAweDAyLCAweDA1LCAweERELCAweDgxLAorCSAweEZCLCAweDAxLCAweEUxLCAweDgxLCAweDBGLCAweDYwLCAweEEyLCAweDY1LCAweDQ1LCAweEQzLCAweDBFLCAweEZBLCAweDY2LCAweDQzLCAweDBDLCAweEY0LAorCSAweDJCLCAweDQxLCAweDRELCAweDhCLCAweDAyLCAweEEzLCAweEI2LCAweDAyLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDIzLCAweEYyLAorCSAweDI1LCAweEYwLCAweDAyLCAweEE4LCAweDAwLCAweDY3LCAweDAyLCAweDAyLCAweDJELCAweEY5LCAweDJDLCAweEY5LCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDI4LCAweDYwLCAweDQyLCAweDYxLCAweDIzLCAweEYyLCAweDI1LCAweEYyLCAweDAyLCAweEE4LCAweDAwLCAweEE4LCAweDA5LCAweDAyLCAweDA3LCAweDAzLAorCSAweEQwLCAweEEwLCAweDMwLCAweDY1LCAweDAzLCAweDA0LCAweEE3LCAweEEwLCAweDU5LCAweDY1LCAweDAxLCAweDA2LCAweDY1LCAweDQ0LCAweEExLCAweERCLAorCSAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDMxLCAweDYwLCAweDJDLCAweDYxLCAweDAxLCAweDY0LCAweEExLCAweERCLCAweDA0LCAweDAwLAorCSAweDMxLCAweDYwLCAweDJDLCAweDYxLCAweDAwLCAweDY0LCAweEExLCAweERCLCAweDdFLCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLAorCSAweDdGLCAweDY3LCAweDAyLCAweDYxLCAweDBFLCAweDAyLCAweDA2LCAweDYxLCAweDQxLCAweDU2LCAweEM3LCAweEZFLCAweDI1LCAweDYwLCAweDExLCAweDc4LAorCSAweEZGLCAweEZGLCAweDM2LCAweDQ3LCAweEZGLCAweDIzLCAweDA0LCAweDAwLCAweDAwLCAweDdGLCAweDYwLCAweDQxLCAweDdGLCAweDY3LCAweDAxLCAweDAwLAorCSAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDdFLCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLCAweDdGLCAweDY3LAorCSAweDAyLCAweDYxLCAweDEyLCAweDAyLCAweDJELCAweDYwLCAweDU4LCAweDYxLCAweDY1LCAweDQzLCAweEExLCAweERELCAweDBDLCAweDYxLCAweDQxLCAweDU2LAorCSAweEM3LCAweEZFLCAweDI1LCAweDYwLCAweDExLCAweDc4LCAweEZGLCAweEZGLCAweDM2LCAweDQ3LCAweEZGLCAweDIzLCAweDA0LCAweDAwLCAweDAwLCAweDdGLAorCSAweDYwLCAweDQxLCAweDdGLCAweDY3LCAweDAxLCAweDAwLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI1LCAweEYwLCAweDI5LCAweDYwLAorCSAweEEyLCAweDYyLCAweEEyLCAweEQ5LCAweDE5LCAweDAwLCAweDJELCAweDYwLCAweDFBLCAweDY0LCAweEEwLCAweEQxLCAweEEwLCAweEY5LCAweDBDLCAweDYwLAorCSAweDM4LCAweDYyLCAweDQwLCAweDYzLCAweDAwLCAweDY0LCAweDVBLCAweERCLCAweEZFLCAweDFGLCAweDY0LCAweDQwLCAweDAxLCAweDJBLCAweDBDLCAweDAwLAorCSAweDA0LCAweDY1LCAweDBDLCAweDYwLCAweDM4LCAweDYxLCAweDQ4LCAweDY0LCAweDNFLCAweDYzLCAweDdDLCAweEE4LCAweDU4LCAweEQwLCAweDU5LCAweEQ5LAorCSAweDAyLCAweDAyLCAweDAwLCAweEY0LCAweDAyLCAweDY0LCAweEY5LCAweDFGLCAweDI5LCAweDYwLCAweEEyLCAweDYyLCAweEEyLCAweEQxLCAweDBELCAweDYwLAorCSAweDFDLCAweDY1LCAweDAyLCAweEZFLCAweDY0LCAweDQ0LCAweEY4LCAweDg0LCAweEY4LCAweDg0LCAweEY4LCAweDg3LCAweDYwLCAweDQxLCAweDY0LCAweDQ0LAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEM0LCAweDg0LCAweDNFLCAweEZCLCAweDYwLCAweDQyLCAweDYxLCAweDQ0LCAweDAzLCAweEEyLCAweDYwLCAweEZFLAorCSAweEEyLCAweERCLCAweEZGLCAweEZGLCAweDIwLCAweEZFLCAweDY0LCAweDQ0LCAweDBDLCAweDYwLCAweDNBLCAweDY1LCAweEUwLCAweDg0LCAweEUwLCAweDg0LAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEM0LCAweDg0LCAweDQwLCAweEZCLCAweEZGLCAweEZGLCAweDAwLCAweDY3LCAweDAwLCAweDYxLCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweDJELCAweDYwLCAweDFBLCAweDY0LCAweEEwLCAweEQxLCAweEEwLCAweEY5LCAweDAwLCAweDY0LCAweDQwLCAweDQxLCAweDY0LCAweDQwLAorCSAweDAxLCAweDJBLCAweEE0LCAweDAwLCAweDRBLCAweDY0LCAweEEwLCAweEQyLCAweEZGLCAweEZGLCAweDQwLCAweDQyLCAweDgwLCAweDJCLCAweDA0LCAweDAwLAorCSAweEZGLCAweEI0LCAweDQwLCAweDQyLCAweDAxLCAweDY0LCAweDQwLCAweDQxLCAweEE5LCAweEYzLCAweDQ2LCAweDRCLCAweDYwLCAweDQ2LCAweDIwLCAweDYzLAorCSAweEUzLCAweDgzLCAweEFCLCAweDQ2LCAweDI2LCAweEYwLCAweEFCLCAweDQ2LCAweDU1LCAweEY4LCAweEFCLCAweDQ2LCAweDI3LCAweEYwLCAweEFCLCAweDQ2LAorCSAweDU2LCAweEY4LCAweEFCLCAweDQ2LCAweDI4LCAweEYwLCAweEFCLCAweDQ2LCAweDU3LCAweEY4LCAweDY2LCAweDQ0LCAweDAyLCAweEE2LCAweEYxLCAweDFGLAorCSAweEE5LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQ2LCAweEFCLCAweDQ2LCAweDBDLCAweDYwLCAweDdBLCAweDY1LCAweDIyLCAweDQ0LCAweEZGLCAweEI0LAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEM0LCAweDgxLCAweEM5LCAweDgxLCAweDUyLCAweDY0LCAweDBFLCAweDYzLAorCSAweDU4LCAweEQwLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweDIxLCAweDQ0LCAweDAxLCAweDJBLCAweDA4LCAweDAwLCAweEFCLCAweDQ2LCAweEYwLCAweEExLAorCSAweDZFLCAweDY0LCAweDBFLCAweDYzLCAweDU5LCAweEQxLCAweDU4LCAweEQ4LCAweEZELCAweDFGLCAweEFCLCAweDQ2LCAweDIyLCAweDQ0LCAweEZGLCAweEI0LAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDBDLCAweDYwLCAweERDLCAweDY1LCAweEM0LCAweDgxLCAweDYwLCAweDQ1LCAweEM5LCAweDgxLAorCSAweDYyLCAweDY0LCAweDA2LCAweDYzLCAweDU4LCAweEQwLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweDIxLCAweDQ0LCAweDAxLCAweDJBLCAweDA4LCAweDAwLAorCSAweEFCLCAweDQ2LCAweEY4LCAweEExLCAweEFFLCAweDY0LCAweDA2LCAweDYzLCAweDU5LCAweEQxLCAweDU4LCAweEQ4LCAweEZELCAweDFGLCAweEFCLCAweDQ2LAorCSAweDY1LCAweDQ0LCAweDBDLCAweDYwLCAweEZDLCAweDY1LCAweEM0LCAweDgxLCAweEM5LCAweDgxLCAweDZBLCAweDY0LCAweDA2LCAweDYzLCAweDU4LCAweEQwLAorCSAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweDIyLCAweDQ0LCAweEZGLCAweEI0LCAweEUwLCAweDg0LCAweEUwLCAweDg1LCAweEM0LCAweDg0LCAweDBDLCAweDYwLAorCSAweEMyLCAweDY1LCAweEM0LCAweDgxLCAweDcyLCAweDY0LCAweDA0LCAweDYzLCAweDU4LCAweEQwLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweEFCLCAweDQ2LAorCSAweDIxLCAweDQ0LCAweDAxLCAweDJBLCAweDA2LCAweDAwLCAweEZBLCAweEExLCAweDg4LCAweDY0LCAweDA0LCAweDYzLCAweDU5LCAweEQxLCAweDU4LCAweEQ4LAorCSAweEZELCAweDFGLCAweDM3LCAweEYwLCAweDIxLCAweDQ0LCAweDAxLCAweDJBLCAweDEzLCAweDAwLCAweDIyLCAweDQ0LCAweDNELCAweEZCLCAweDYwLCAweDQxLAorCSAweDAyLCAweEZFLCAweEY4LCAweDg0LCAweEY4LCAweDg0LCAweEY4LCAweDg0LCAweDNDLCAweEZCLCAweDBDLCAweDYwLCAweEJFLCAweDYzLCAweDg4LCAweEZGLAorCSAweENELCAweDgxLCAweDA2LCAweEEzLCAweEZELCAweDBELCAweDhELCAweEZGLCAweDNCLCAweEZELCAweDY0LCAweDQ3LCAweDgwLCAweEJGLCAweDYwLCAweDVDLAorCSAweDIyLCAweDQzLCAweDgwLCAweDYxLCAweDg4LCAweEZGLCAweENGLCAweDgzLCAweEUxLCAweDgxLCAweEZELCAweDBELCAweDhELCAweEZGLCAweDYxLCAweDQ3LAorCSAweDMxLCAweDkxLCAweEIxLCAweDg0LCAweDM3LCAweEZBLCAweDFGLCAweDYzLCAweEUzLCAweDgzLCAweDY2LCAweDQ0LCAweDAyLCAweEE2LCAweDM3LCAweEYwLAorCSAweDY2LCAweDQ0LCAweEIxLCAweDlDLCAweDM3LCAweEY4LCAweDAyLCAweEE2LCAweEZBLCAweDFGLCAweEFCLCAweDQ2LCAweDAwLCAweDY3LCAweDAwLCAweDYxLAorCSAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDIzLCAweEYyLCAweDI1LCAweEYwLCAweDAyLCAweEE4LCAweDAwLCAweDY3LCAweDIyLCAweDAyLCAweDNELCAweEYxLAorCSAweDY0LCAweDQ0LCAweDAzLCAweEI0LCAweDQwLCAweDQyLCAweEQwLCAweDgwLCAweEE5LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQ2LCAweEI3LCAweEY0LAorCSAweDgwLCAweDYxLCAweDAyLCAweDAyLCAweEUzLCAweDgzLCAweEVCLCAweDgzLCAweDIyLCAweDQ0LCAweDg4LCAweEZGLCAweENDLCAweDg0LCAweEUxLCAweDgxLAorCSAweEZELCAweDBELCAweDhELCAweEZGLCAweDYxLCAweDQ3LCAweDMxLCAweDkxLCAweDlELCAweDg1LCAweEE3LCAweDgzLCAweDM3LCAweEZDLCAweDFGLCAweDYzLAorCSAweEUzLCAweDgzLCAweDY2LCAweDQ0LCAweDAyLCAweEE2LCAweEI3LCAweEYyLCAweDY2LCAweDQ0LCAweEE1LCAweDgxLCAweEI3LCAweEZBLCAweDAyLCAweEE2LAorCSAweEZBLCAweDFGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDJELCAweDYwLCAweDFBLCAweDY0LCAweEEwLCAweEQxLCAweEEwLCAweEY5LAorCSAweDY0LCAweDQwLCAweDAxLCAweDJBLCAweDRFLCAweDAwLCAweDI3LCAweEYyLCAweDFDLCAweDYwLCAweEJBLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLAorCSAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDY2LCAweDQxLCAweDYwLCAweDQ2LCAweDYwLCAweDQzLCAweDA1LCAweEYyLCAweDE2LCAweDE4LCAweDYxLCAweDQ2LAorCSAweDI3LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDA0LCAweEYyLCAweDBDLCAweDAyLCAweDYxLCAweDQ2LCAweDI2LCAweEYwLCAweDYzLCAweDQ2LAorCSAweEQwLCAweDgwLCAweDAzLCAweEYyLCAweDA2LCAweDAyLCAweDYxLCAweDQ2LCAweDI1LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweEZGLCAweEZGLAorCSAweDA3LCAweDAzLCAweDgwLCAweEY0LCAweEZGLCAweEZGLCAweDYzLCAweDQ2LCAweEU4LCAweDFCLCAweEE5LCAweEYzLCAweDA4LCAweEZFLCAweDYwLCAweDQzLAorCSAweDYxLCAweDQ2LCAweDAxLCAweDAzLCAweDJBLCAweDAwLCAweDQzLCAweDRCLCAweEFCLCAweDQ2LCAweDM3LCAweEYyLCAweDgwLCAweDYwLCAweDMwLCAweDdDLAorCSAweEIwLCAweDg0LCAweEEyLCAweERBLCAweDRFLCAweDYxLCAweDZFLCAweDY0LCAweDBFLCAweDYzLCAweEFCLCAweDQ2LCAweDU5LCAweEQwLCAweEFCLCAweDQ2LAorCSAweDU4LCAweEQ4LCAweEZCLCAweDFGLCAweDg4LCAweDY0LCAweDA0LCAweDYzLCAweEFCLCAweDQ2LCAweDU5LCAweEQwLCAweEFCLCAweDQ2LCAweDU4LCAweEQ4LAorCSAweEZCLCAweDFGLCAweEQ5LCAweDgxLCAweDk4LCAweDY0LCAweDA0LCAweDYzLCAweEFCLCAweDQ2LCAweDU5LCAweEQwLCAweEFCLCAweDQ2LCAweDU4LCAweEQ4LAorCSAweEZCLCAweDFGLCAweEQ5LCAweDgxLCAweEFFLCAweDY0LCAweDBFLCAweDYzLCAweEFCLCAweDQ2LCAweDU5LCAweEQwLCAweEFCLCAweDQ2LCAweDU4LCAweEQ4LAorCSAweEZCLCAweDFGLCAweDAwLCAweDY3LCAweDAwLCAweDYxLCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAxLCAweDY3LCAweDIwLCAweDYxLCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweDJELCAweDYwLCAweDFBLCAweDY0LCAweEEwLCAweEQxLCAweEEwLCAweEY5LCAweDY0LCAweDQwLCAweDAxLCAweDJBLCAweDMxLCAweDAwLAorCSAweDI3LCAweEYyLCAweDFDLCAweDYwLCAweEJBLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDY2LCAweDQxLAorCSAweDYwLCAweDQ2LCAweDYwLCAweDQzLCAweDA1LCAweEYyLCAweDE2LCAweDE4LCAweDYxLCAweDQ2LCAweDI3LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLAorCSAweDA0LCAweEYyLCAweDBDLCAweDAyLCAweDYxLCAweDQ2LCAweDI2LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDAzLCAweEYyLCAweDA2LCAweDAyLAorCSAweDYxLCAweDQ2LCAweDI1LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDgwLCAweEY0LCAweEZGLCAweEZGLAorCSAweDYzLCAweDQ2LCAweEU4LCAweDFCLCAweEE5LCAweEYzLCAweDA4LCAweEZFLCAweDYwLCAweDQzLCAweDYxLCAweDQ2LCAweDAxLCAweDAzLCAweDBELCAweDAwLAorCSAweDQzLCAweDRCLCAweEFCLCAweDQ2LCAweDM3LCAweEYyLCAweDgwLCAweDYwLCAweDMwLCAweDYxLCAweDlELCAweDg1LCAweEE0LCAweDg0LCAweEEyLCAweERBLAorCSAweEFCLCAweDQ2LCAweDAwLCAweDY3LCAweDAwLCAweDYxLCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAxLCAweDY3LCAweDIwLCAweDYxLCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweEEyLCAweEZGLCAweDQ2LCAweDQ1LCAweDAyLCAweEYwLCAweDA5LCAweDYwLCAweDA4LCAweDY0LCAweEQwLCAweDgwLCAweDAwLCAweEY0LAorCSAweDAxLCAweEYyLCAweDY2LCAweDVDLCAweDI1LCAweDQ2LCAweDU2LCAweDAyLCAweDcwLCAweDI3LCAweDU0LCAweDAwLCAweDEyLCAweDY0LCAweDAzLCAweEZBLAorCSAweDA0LCAweEY4LCAweDBFLCAweEYyLCAweDg3LCAweEZDLCAweDhELCAweEZDLCAweDhFLCAweEZDLCAweERBLCAweDgyLCAweDE2LCAweDYxLCAweDAwLCAweDYzLAorCSAweEM5LCAweDgxLCAweDVBLCAweERDLCAweEZELCAweDAyLCAweDYwLCAweDQwLCAweEYwLCAweDNCLCAweDE2LCAweDAwLCAweDMyLCAweDQ0LCAweEFGLCAweEYzLAorCSAweDAxLCAweEIwLCAweEZBLCAweEEwLCAweDA4LCAweDI0LCAweDJDLCAweDA1LCAweERDLCAweDgzLCAweEYwLCAweDY3LCAweDBFLCAweEZBLCAweDI0LCAweDYwLAorCSAweDVFLCAweDY0LCAweDJCLCAweERCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEFGLCAweEZELCAweDJCLCAweEZGLAorCSAweEZFLCAweDY0LCAweDNCLCAweDQyLCAweDRBLCAweERCLCAweDRGLCAweDAwLCAweEIwLCAweEYzLCAweDA2LCAweDY1LCAweEQ0LCAweDgwLCAweERDLCAweDgzLAorCSAweDE3LCAweDA1LCAweEIwLCAweEZELCAweDk4LCAweEZFLCAweDA0LCAweDA0LCAweDAwLCAweDdGLCAweDA4LCAweDdFLCAweDBFLCAweEZBLCAweDNCLCAweEZGLAorCSAweDI0LCAweDYwLCAweDUyLCAweDY0LCAweDJCLCAweERCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweDBFLCAweEYyLAorCSAweDJCLCAweEZGLCAweDYwLCAweDQwLCAweDA4LCAweDI2LCAweEY3LCAweEZFLCAweEZELCAweDY0LCAweDNCLCAweDQyLCAweDRBLCAweERCLCAweDMyLCAweDAwLAorCSAweEFDLCAweEYzLCAweEZGLCAweEZGLCAweEQ4LCAweEEwLCAweEZGLCAweEZGLCAweDBELCAweDA0LCAweDI0LCAweDYwLCAweDZBLCAweDY0LCAweDJCLCAweERCLAorCSAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEZDLCAweDY0LCAweDNCLCAweDQyLAorCSAweDRBLCAweERCLCAweDIxLCAweDAwLCAweDQ2LCAweDQ1LCAweDAwLCAweDY0LCAweDJCLCAweERCLCAweDI1LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LAorCSAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEEyLCAweEZGLCAweDAwLCAweEY0LCAweDAxLCAweEYwLCAweDBBLCAweDE4LCAweDcwLCAweDY3LAorCSAweEEwLCAweDgwLCAweEYwLCAweDY3LCAweDA2LCAweDAzLCAweEMwLCAweDg0LCAweDAxLCAweEZBLCAweDI1LCAweDQ2LCAweDI1LCAweDQ0LCAweDgwLCAweEZDLAorCSAweDA1LCAweEZBLCAweEFGLCAweDYwLCAweDU4LCAweDRFLCAweDk1LCAweDc4LCAweEZGLCAweEZGLCAweEQ0LCAweEZFLCAweEEzLCAweEZGLCAweEZGLCAweDY0LAorCSAweDNCLCAweDQyLCAweDRBLCAweERCLCAweEQ0LCAweEZFLCAweEEzLCAweEZGLCAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDI0LCAweDYwLCAweDU4LCAweDY0LAorCSAweDQwLCAweDQ3LCAweDU4LCAweDRGLCAweDBELCAweDAwLCAweDI0LCAweDYwLCAweDRDLCAweDY0LCAweDQwLCAweDQ3LCAweDU4LCAweDRGLCAweDE4LCAweDAwLAorCSAweDI0LCAweDYwLCAweDY0LCAweDY0LCAweDQwLCAweDQ3LCAweDU4LCAweDRGLCAweDAzLCAweDAwLCAweDI1LCAweDYwLCAweDExLCAweDc4LCAweEZGLCAweEZGLAorCSAweDI3LCAweEQ1LCAweDBFLCAweEYyLCAweDBCLCAweDE4LCAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDA4LCAweDAwLCAweDI0LCAweDYwLCAweDdBLCAweDY0LAorCSAweDQwLCAweDRCLCAweDJDLCAweDYwLCAweDU4LCAweDRELCAweEQ4LCAweDc4LCAweEZGLCAweEZGLCAweEYyLCAweDAxLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDI3LCAweEQ1LCAweDBFLCAweEYyLCAweDE0LCAweDE4LCAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDExLCAweDAwLCAweDAyLCAweEYwLCAweDA5LCAweDYwLAorCSAweDA4LCAweDY0LCAweEQwLCAweDgwLCAweEEyLCAweEZGLCAweEIwLCAweEYzLCAweDAyLCAweDAyLCAweENDLCAweDg0LCAweEIwLCAweEZCLCAweDI0LCAweDYwLAorCSAweDdBLCAweDY0LCAweDQwLCAweDRCLCAweDJDLCAweDYwLCAweDU4LCAweDRELCAweEQ4LCAweDc4LCAweEZGLCAweEZGLCAweEU5LCAweDAxLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweEZCLCAweDY0LCAweDNBLCAweDQyLCAweDRBLCAweERCLCAweEEyLCAweEZGLCAweEIzLCAweEYzLCAweEFGLCAweEYzLCAweENDLCAweDgwLAorCSAweEZELCAweEEwLCAweDAxLCAweDE0LCAweDFFLCAweDA1LCAweEFFLCAweDYwLCAweDU4LCAweDRELCAweDlCLCAweDc4LCAweEZGLCAweEZGLCAweEEyLCAweEZGLAorCSAweDE4LCAweDAzLCAweEYwLCAweDY3LCAweDBFLCAweEZBLCAweDI0LCAweDYwLCAweDdBLCAweDYyLCAweDI0LCAweDYwLCAweDVFLCAweDY0LCAweEEyLCAweERCLAorCSAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEY2LCAweDY0LCAweDNBLCAweDQyLAorCSAweDRBLCAweERCLCAweEIzLCAweEYzLCAweEFGLCAweEYzLCAweENDLCAweDgzLCAweERDLCAweDg0LCAweDAxLCAweDE1LCAweEIzLCAweEZELCAweEFGLCAweEZCLAorCSAweEQ0LCAweEZFLCAweEIyLCAweEYzLCAweEIwLCAweEYzLCAweDAwLCAweEE4LCAweEIxLCAweEYxLCAweDAzLCAweDAyLCAweEQwLCAweDgwLCAweEZGLCAweEZGLAorCSAweDI3LCAweDA1LCAweEFFLCAweDYwLCAweDU4LCAweDRELCAweDlCLCAweDc4LCAweEZGLCAweEZGLCAweEEyLCAweEZGLCAweDIxLCAweDAzLCAweDAwLCAweDYzLAorCSAweEIyLCAweEYzLCAweDBFLCAweEZDLCAweENDLCAweDg0LCAweEZGLCAweDNBLCAweEIyLCAweEZCLCAweDk4LCAweEZFLCAweDAzLCAweDA0LCAweDA4LCAweEJCLAorCSAweDBFLCAweEZDLCAweDNCLCAweEZGLCAweDI0LCAweDYwLCAweDdBLCAweDYyLCAweDI0LCAweDYwLCAweDUyLCAweDY0LCAweEEyLCAweERCLCAweDY2LCAweDQ0LAorCSAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEY3LCAweDY0LCAweDNBLCAweDQyLCAweDRBLCAweERCLAorCSAweEIwLCAweEYzLCAweDBFLCAweEYyLCAweERDLCAweDgzLCAweDA4LCAweEIwLCAweEIwLCAweEZELCAweDA4LCAweDI4LCAweEY3LCAweEZFLCAweEQ0LCAweEZFLAorCSAweEEzLCAweEZGLCAweDI1LCAweDYwLCAweDExLCAweDc4LCAweEZGLCAweEZGLCAweEI5LCAweEZFLCAweDEzLCAweEZGLCAweDI0LCAweDQwLCAweDgwLCAweDJCLAorCSAweDBCLCAweDAwLCAweEEyLCAweEZGLCAweDI1LCAweDQ2LCAweDA5LCAweEY0LCAweDBFLCAweEYyLCAweDA1LCAweDE4LCAweDA4LCAweEJDLCAweDBFLCAweEZBLAorCSAweEZGLCAweEZGLCAweEY3LCAweEZFLCAweDAxLCAweDAwLCAweEQ4LCAweEZFLCAweEEzLCAweEZGLCAweDI1LCAweDQ2LCAweDNFLCAweEYyLCAweDAwLCAweEY0LAorCSAweDA4LCAweEYwLCAweDI1LCAweDQ2LCAweDA2LCAweEI0LCAweEZGLCAweDdGLCAweDEwLCAweEJDLCAweDA2LCAweDI2LCAweEZELCAweDdGLCAweDBFLCAweEZBLAorCSAweDNFLCAweEYyLCAweDNGLCAweEYyLCAweDYwLCAweDQxLCAweDA4LCAweDJBLCAweDY0LCAweDQ3LCAweDNGLCAweEZBLCAweDYwLCAweDQ1LCAweDI3LCAweDYwLAorCSAweEZDLCAweDYyLCAweEEyLCAweEQzLCAweEEzLCAweEZDLCAweEFCLCAweEZDLCAweDkxLCAweEZDLCAweEQ0LCAweDgwLCAweEMwLCAweDYwLCAweEUxLCAweDY1LAorCSAweEE1LCAweDgwLCAweDAxLCAweDA0LCAweDA3LCAweDAzLCAweDIzLCAweEYwLCAweDA4LCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweDJFLCAweDYwLAorCSAweEM1LCAweDc4LCAweEZGLCAweEZGLCAweDJGLCAweDYwLCAweDU4LCAweDRGLCAweDBGLCAweDc4LCAweEZGLCAweEZGLCAweDE0LCAweDA0LCAweDIzLCAweEYwLAorCSAweDA0LCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweEI4LCAweEYxLCAweDI3LCAweDYwLCAweDk2LCAweDY0LCAweEEwLCAweEQzLCAweEZGLCAweEZGLAorCSAweERDLCAweDg0LCAweERDLCAweDgwLCAweEQwLCAweDgwLCAweDA0LCAweDAzLCAweEEyLCAweERCLCAweDA4LCAweDI0LCAweEM2LCAweEZFLCAweDAyLCAweDAwLAorCSAweDIwLCAweDYwLCAweDAwLCAweDc1LCAweDgzLCAweDAwLCAweERDLCAweEYzLCAweEE5LCAweEYxLCAweDA3LCAweEI0LCAweDY0LCAweDQzLCAweEZELCAweEEwLAorCSAweDJDLCAweEYyLCAweDcxLCAweDAyLCAweDAxLCAweEIwLCAweDY0LCAweDQzLCAweDc4LCAweDAyLCAweDJFLCAweEYyLCAweDFDLCAweDYwLCAweEJBLCAweDY1LAorCSAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDY2LCAweDQxLCAweDYwLCAweDQ2LCAweDYwLCAweDQzLCAweDA1LCAweEYyLAorCSAweDE2LCAweDE4LCAweDYxLCAweDQ2LCAweDJFLCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDA0LCAweEYyLCAweDBDLCAweDAyLCAweDYxLCAweDQ2LAorCSAweDJELCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDAzLCAweEYyLCAweDA2LCAweDAyLCAweDYxLCAweDQ2LCAweDJDLCAweEYwLCAweDYzLCAweDQ2LAorCSAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDgwLCAweEY0LCAweEZGLCAweEZGLCAweDYzLCAweDQ2LCAweEU4LCAweDFCLCAweEE5LCAweEYzLAorCSAweDA4LCAweEZFLCAweDYwLCAweDQzLCAweDYxLCAweDQ2LCAweDUxLCAweDAzLCAweDYzLCAweDQ2LCAweDgwLCAweEY2LCAweDI1LCAweDQ2LCAweDQzLCAweDE4LAorCSAweDJFLCAweEYyLCAweDY2LCAweDQxLCAweDFDLCAweDYwLCAweEJBLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEE5LCAweEYxLCAweEUwLCAweDg0LAorCSAweDQ0LCAweEQzLCAweDY0LCAweDQzLCAweDExLCAweDE4LCAweDYwLCAweDQ2LCAweDAwLCAweEYyLCAweEZGLCAweEZGLCAweEZDLCAweDFCLCAweDY2LCAweDQ0LAorCSAweDY0LCAweDQ2LCAweDgwLCAweEYwLCAweDYwLCAweDQ2LCAweDgwLCAweEY4LCAweDY1LCAweDQ2LCAweDY1LCAweDQzLCAweDgwLCAweEYwLCAweDAxLCAweEZBLAorCSAweDgwLCAweEZDLCAweDY0LCAweDQ2LCAweDgwLCAweEY4LCAweDBCLCAweDAwLCAweDY0LCAweDQ2LCAweDYyLCAweDQzLCAweDAwLCAweEYyLCAweEEzLCAweERCLAorCSAweDYwLCAweDQ2LCAweDgwLCAweEYwLCAweDgxLCAweEZDLCAweDgwLCAweEZDLCAweDY0LCAweDQ2LCAweDgwLCAweEY4LCAweDYwLCAweDQzLCAweDYxLCAweDQ2LAorCSAweDQzLCAweDRCLCAweDJDLCAweEYwLCAweEFELCAweEYwLCAweDJFLCAweEYyLCAweEFCLCAweDQ2LCAweDAzLCAweEY4LCAweDg0LCAweEY4LCAweDA1LCAweEZBLAorCSAweDAzLCAweDY0LCAweDA2LCAweEZBLCAweEFCLCAweDQ2LCAweDFFLCAweDYwLCAweEJDLCAweDYxLCAweEExLCAweEQzLCAweDFFLCAweDYwLCAweEZFLCAweDdDLAorCSAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweEEwLCAweERELCAweERBLCAweDlDLCAweEExLCAweEQ5LCAweDQ5LCAweEQzLCAweEZGLCAweEZGLAorCSAweERDLCAweDg0LCAweEExLCAweERCLCAweDBBLCAweDAwLCAweERDLCAweEYzLCAweDAyLCAweEEzLCAweEZFLCAweEEwLCAweEY5LCAweEEwLCAweDAxLCAweDA2LAorCSAweDA0LCAweDAyLCAweDIzLCAweEYwLCAweDA0LCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweDA3LCAweEZDLCAweDIzLCAweEYyLCAweEZGLCAweEZGLAorCSAweDI3LCAweDFCLCAweDI3LCAweDYwLCAweEZFLCAweDYyLCAweEEyLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAwLCAweDNBLCAweDEwLCAweDAwLAorCSAweDI0LCAweDYwLCAweDdBLCAweDYyLCAweDI0LCAweDYwLCAweDIyLCAweDY0LCAweEEyLCAweERCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LAorCSAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDBFLCAweEYyLCAweEMxLCAweEZFLCAweDEwLCAweEFDLCAweDBFLCAweEZBLCAweDFGLCAweDAwLAorCSAweDI0LCAweDYwLCAweDdBLCAweDYyLCAweDI0LCAweDYwLCAweDM0LCAweDY0LCAweEEyLCAweERCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LAorCSAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDBFLCAweEYyLCAweEM4LCAweEZFLCAweDEwLCAweEFDLCAweDBFLCAweEZBLCAweDBGLCAweDAwLAorCSAweDI0LCAweDYwLCAweDdBLCAweDYyLCAweDI0LCAweDYwLCAweDQ2LCAweDY0LCAweEEyLCAweERCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LAorCSAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDBFLCAweEYyLCAweENFLCAweEZFLCAweDEwLCAweEFDLCAweDBFLCAweEZBLCAweDI1LCAweDYwLAorCSAweDExLCAweDc4LCAweEZGLCAweEZGLCAweENCLCAweDg0LCAweEM5LCAweDgzLCAweEZGLCAweEZGLCAweDA4LCAweDA0LCAweDU4LCAweEQxLCAweEE1LCAweEQ4LAorCSAweERBLCAweDg1LCAweDgwLCAweDNBLCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDA0LCAweDY1LCAweEY4LCAweDFGLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDNFLCAweEYyLCAweENDLCAweEYxLCAweDA4LCAweEIwLCAweDE5LCAweEY4LCAweDNCLCAweDAyLCAweEVCLCAweEYxLCAweDJGLCAweEY4LCAweEVDLCAweEYzLAorCSAweDMwLCAweEZBLCAweDYwLCAweDQ1LCAweEVELCAweEYzLCAweDMxLCAweEZBLCAweDQ2LCAweDRBLCAweDAwLCAweEY0LCAweDYwLCAweDQzLCAweDA1LCAweEYyLAorCSAweDA2LCAweEYyLCAweEQwLCAweDgwLCAweDA3LCAweEYwLCAweDA1LCAweDAyLCAweEQ0LCAweDgwLCAweEQzLCAweDgwLCAweDAyLCAweDAyLCAweERDLCAweEYzLAorCSAweDAzLCAweDAzLCAweEFBLCAweDQ2LCAweDQyLCAweEZFLCAweDI1LCAweDAwLCAweDYwLCAweDQwLCAweDAzLCAweDJBLCAweDEwLCAweDAwLCAweDAyLCAweEYyLAorCSAweDAzLCAweEYwLCAweDA0LCAweEYyLCAweDYwLCAweDQzLCAweEFBLCAweDQ2LCAweDJDLCAweEZDLCAweDJELCAweEY4LCAweDJFLCAweEZBLCAweDgxLCAweEYxLAorCSAweDMyLCAweEY4LCAweDgyLCAweEYxLCAweDMzLCAweEY4LCAweDgzLCAweEYxLCAweDM0LCAweEY4LCAweDA4LCAweDY0LCAweDEwLCAweDAwLCAweDAyLCAweEYyLAorCSAweDAzLCAweEYwLCAweDA0LCAweEYyLCAweDYwLCAweDQzLCAweEFBLCAweDQ2LCAweDMyLCAweEZDLCAweDMzLCAweEY4LCAweDM0LCAweEZBLCAweDgxLCAweEYxLAorCSAweDJDLCAweEY4LCAweDgyLCAweEYxLCAweDJELCAweEY4LCAweDgzLCAweEYxLCAweDJFLCAweEY4LCAweDAxLCAweDYwLCAweDA4LCAweDY0LCAweDJBLCAweEZBLAorCSAweDAyLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDMwLCAweDQ0LCAweDAyLCAweEE4LCAweDAwLCAweEUxLCAweDAzLCAweDAyLCAweDQyLCAweEZGLAorCSAweDQ3LCAweEZGLCAweEExLCAweEZGLCAweDgwLCAweEZGLCAweDkwLCAweEZGLCAweDk4LCAweEZGLCAweDg4LCAweEZGLCAweDg0LCAweEUxLCAweEZGLCAweEZGLAorCSAweDAwLCAweDAwLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDg3LCAweDNFLCAweDJELCAweDYwLCAweDlDLCAweDY0LCAweEEwLCAweEQzLCAweEZGLCAweEZGLAorCSAweDAxLCAweDFCLCAweEY3LCAweDAxLCAweDg3LCAweEZGLCAweDIwLCAweDQ0LCAweDgwLCAweEZGLCAweDYwLCAweDQwLCAweDgwLCAweDI2LCAweEYxLCAweDAxLAorCSAweEMwLCAweDYwLCAweDQwLCAweEVDLCAweEMwLCAweDYwLCAweDAwLCAweEVELCAweEMwLCAweDYwLCAweDgwLCAweEVFLCAweEFDLCAweDRGLCAweEJGLCAweEI0LAorCSAweEEwLCAweDVDLCAweDJELCAweDYwLCAweDFBLCAweDYyLCAweEEyLCAweEQxLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAyLCAweDI3LCAweDA2LCAweDAwLAorCSAweDI4LCAweEUyLCAweDI0LCAweEUyLCAweEJGLCAweEZGLCAweEZGLCAweEZGLCAweDc1LCAweDQwLCAweDEwLCAweDAwLCAweDI4LCAweEUyLCAweDI0LCAweEUyLAorCSAweDAwLCAweDYwLCAweDAwLCAweDYxLCAweDAwLCAweDYwLCAweDk0LCAweEUwLCAweEJGLCAweEZGLCAweEZGLCAweEZGLCAweEExLCAweDUwLCAweDc1LCAweDQwLAorCSAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDEwLCAweEUwLCAweDJELCAweDYwLCAweDlDLCAweDYyLAorCSAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAxLCAweDYwLCAweDM5LCAweEUyLCAweDA0LCAweDYwLCAweDAwLCAweDdBLCAweEFDLCAweDRGLCAweDQwLCAweEJDLAorCSAweDAwLCAweDdGLCAweEEwLCAweDVDLCAweEMwLCAweDYwLCAweEQ5LCAweEVDLCAweEMwLCAweDYwLCAweDBGLCAweEVELCAweEMwLCAweDYwLCAweDhGLCAweEVFLAorCSAweEFFLCAweDRGLCAweDA0LCAweEJDLCAweDAwLCAweDdGLCAweEEwLCAweDVFLCAweDI2LCAweDYxLCAweENELCAweDgxLCAweEZGLCAweEZGLCAweEZELCAweDAyLAorCSAweEFFLCAweDRGLCAweEZCLCAweEI0LCAweEEwLCAweDVFLCAweEFELCAweDAxLCAweDgwLCAweEZGLCAweDkwLCAweEZGLCAweDk4LCAweEZGLCAweDJGLCAweDYwLAorCSAweDU0LCAweDYzLCAweDIwLCAweDQ0LCAweEJELCAweERCLCAweDIxLCAweDQ0LCAweEJELCAweERCLCAweDIyLCAweDQ0LCAweEJELCAweERCLCAweDIzLCAweDQ0LAorCSAweEJELCAweERCLCAweDI0LCAweDQ0LCAweEJELCAweERCLCAweDI1LCAweDQ0LCAweEJELCAweERCLCAweDI2LCAweDQ0LCAweEJELCAweERCLCAweDI3LCAweDQ0LAorCSAweEJELCAweERCLCAweDI4LCAweDQ0LCAweEJELCAweERCLCAweDI5LCAweDQ0LCAweEJELCAweERCLCAweDJBLCAweDQ0LCAweEJELCAweERCLCAweDJCLCAweDQ0LAorCSAweEJELCAweERCLCAweDJDLCAweDQ0LCAweEJELCAweERCLCAweDJELCAweDQ0LCAweEJELCAweERCLCAweDJFLCAweDQ0LCAweEJELCAweERCLCAweDJGLCAweDQ0LAorCSAweEJELCAweERCLCAweDJGLCAweDYwLCAweDQ4LCAweDY0LCAweEEwLCAweERELCAweDMwLCAweDYwLCAweDc0LCAweDYzLCAweDJGLCAweDYwLCAweDRBLCAweDY0LAorCSAweEEwLCAweERELCAweDJGLCAweDYwLCAweDRDLCAweDYzLCAweDMwLCAweDQ0LCAweEEzLCAweERCLCAweDJGLCAweDYwLCAweDRFLCAweDYzLCAweDMxLCAweDQ0LAorCSAweEEzLCAweERCLCAweDJGLCAweDYwLCAweDUwLCAweDYzLCAweDMyLCAweDQ0LCAweEEzLCAweERCLCAweDJGLCAweDYwLCAweDUyLCAweDYzLCAweDMzLCAweDQ0LAorCSAweEEzLCAweERCLCAweDgxLCAweEZGLCAweDkxLCAweEZGLCAweDU4LCAweDUxLCAweDRCLCAweDAwLCAweDgyLCAweEZGLCAweDkyLCAweEZGLCAweDU4LCAweDUxLAorCSAweDQ3LCAweDAwLCAweDgzLCAweEZGLCAweDkzLCAweEZGLCAweDU4LCAweDUxLCAweDQzLCAweDAwLCAweDg0LCAweEZGLCAweDk0LCAweEZGLCAweDU4LCAweDUxLAorCSAweDNGLCAweDAwLCAweDg1LCAweEZGLCAweDk1LCAweEZGLCAweDU4LCAweDUxLCAweDNCLCAweDAwLCAweDg2LCAweEZGLCAweDk2LCAweEZGLCAweDU4LCAweDUxLAorCSAweDM3LCAweDAwLCAweDg3LCAweEZGLCAweDk3LCAweEZGLCAweDU4LCAweDUxLCAweDMzLCAweDAwLCAweDgwLCAweEZGLCAweDkwLCAweEZGLCAweDk5LCAweEZGLAorCSAweDJGLCAweDYwLCAweDQ4LCAweDY0LCAweEEwLCAweEQxLCAweDMwLCAweDQ0LCAweDY0LCAweDQzLCAweEJELCAweERCLCAweDMxLCAweDQ0LCAweEJELCAweERCLAorCSAweDMyLCAweDQ0LCAweEJELCAweERCLCAweDMzLCAweDQ0LCAweEJELCAweERCLCAweDM0LCAweDQ0LCAweEJELCAweERCLCAweDM1LCAweDQ0LCAweEJELCAweERCLAorCSAweDM2LCAweDQ0LCAweEJELCAweERCLCAweDM3LCAweDQ0LCAweEJELCAweERCLCAweDM4LCAweDQ0LCAweEJELCAweERCLCAweDM5LCAweDQ0LCAweEJELCAweERCLAorCSAweDNBLCAweDQ0LCAweEJELCAweERCLCAweDNCLCAweDQ0LCAweEJELCAweERCLCAweDNDLCAweDQ0LCAweEJELCAweERCLCAweDNELCAweDQ0LCAweEJELCAweERCLAorCSAweDNFLCAweDQ0LCAweEJELCAweERCLCAweDNGLCAweDQ0LCAweEJELCAweERCLCAweEVGLCAweDYwLCAweDQ4LCAweDY0LCAweDBBLCAweEZCLCAweDQwLCAweDIxLAorCSAweEZFLCAweDAxLCAweDgwLCAweEZGLCAweDkwLCAweEZGLCAweDk4LCAweEZGLCAweDg4LCAweEZGLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDg3LCAweDNFLAorCSAweDQyLCAweDUwLCAweDQwLCAweDUzLCAweDJGLCAweDYwLCAweDRBLCAweDYyLCAweEEyLCAweEQzLCAweEZGLCAweEZGLCAweDQwLCAweDUyLCAweDMzLCAweDQ0LAorCSAweDMyLCAweDQyLCAweEEyLCAweERCLCAweERBLCAweDgyLCAweEEyLCAweERELCAweERBLCAweDgzLCAweDY1LCAweDQ0LCAweEJELCAweERCLCAweDYxLCAweDQ0LAorCSAweEJELCAweERCLCAweDY2LCAweDQ0LCAweEJELCAweERCLCAweEJELCAweEQ5LCAweDMwLCAweDQ0LCAweEJELCAweERCLCAweDk5LCAweEZGLCAweEE0LCAweDRDLAorCSAweEJELCAweERCLCAweEE1LCAweDRDLCAweEJELCAweERCLCAweEEwLCAweDRDLCAweEJELCAweERCLCAweEExLCAweDRDLCAweEJELCAweERCLCAweDk4LCAweEZGLAorCSAweDJGLCAweDYwLCAweDRBLCAweDY0LCAweEEwLCAweERELCAweDJGLCAweDYwLCAweDRDLCAweDYyLCAweEEyLCAweEQzLCAweEZGLCAweEZGLCAweDQwLCAweDUwLAorCSAweDJGLCAweDYwLCAweDUwLCAweDYyLCAweEEyLCAweEQzLCAweEZGLCAweEZGLCAweDQwLCAweDUyLCAweDJGLCAweDYwLCAweDUyLCAweDYyLCAweEEyLCAweEQzLAorCSAweEZGLCAweEZGLCAweDQwLCAweDUzLCAweDMxLCAweDQxLCAweDJGLCAweDYwLCAweDRFLCAweDYyLCAweEEyLCAweEQzLCAweEZGLCAweEZGLCAweDQwLCAweDUxLAorCSAweDJGLCAweDYwLCAweDQ4LCAweDYyLCAweEEyLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQzLCAweDIwLCAweDQ0LCAweEJELCAweERCLCAweDIxLCAweDQ0LAorCSAweEJELCAweERCLCAweDIyLCAweDQ0LCAweEJELCAweERCLCAweDIzLCAweDQ0LCAweEJELCAweERCLCAweDI0LCAweDQ0LCAweEJELCAweERCLCAweDI1LCAweDQ0LAorCSAweEJELCAweERCLCAweDI2LCAweDQ0LCAweEJELCAweERCLCAweDI3LCAweDQ0LCAweEJELCAweERCLCAweDI4LCAweDQ0LCAweEJELCAweERCLCAweDI5LCAweDQ0LAorCSAweEJELCAweERCLCAweDJBLCAweDQ0LCAweEJELCAweERCLCAweDJCLCAweDQ0LCAweEJELCAweERCLCAweDJDLCAweDQ0LCAweEJELCAweERCLCAweDJELCAweDQ0LAorCSAweEJELCAweERCLCAweDJFLCAweDQ0LCAweEJELCAweERCLCAweDJGLCAweDQ0LCAweEJELCAweERCLCAweDJGLCAweDYwLCAweDQ4LCAweDY0LCAweEEwLCAweERELAorCSAweDYxLCAweDU4LCAweEZGLCAweEZGLCAweDI0LCAweEUyLCAweDJELCAweEYzLCAweDJDLCAweEYzLCAweDAwLCAweEJELCAweENDLCAweDg0LCAweDA4LCAweDAzLAorCSAweDJDLCAweEZCLCAweDA2LCAweDAyLCAweDY1LCAweDQ0LCAweDJDLCAweEZCLCAweDhBLCAweEZGLCAweDgwLCAweDYwLCAweDAwLCAweDc1LCAweDg4LCAweEZGLAorCSAweEYyLCAweEYzLCAweDMxLCAweDQwLCAweDAxLCAweDJBLCAweDQ0LCAweDAwLCAweDYwLCAweDQzLCAweDA0LCAweEIwLCAweDAyLCAweEIwLCAweDA4LCAweDI0LAorCSAweDE2LCAweDAyLCAweDI5LCAweDQ0LCAweEZGLCAweEZGLCAweDAwLCAweEE4LCAweENDLCAweDgxLCAweDBFLCAweDAzLCAweDQxLCAweDQ5LCAweDM3LCAweDAyLAorCSAweDYzLCAweDQwLCAweDA4LCAweDJBLCAweDA5LCAweDAwLCAweEY3LCAweEIzLCAweDMxLCAweDYwLCAweDFFLCAweDdDLCAweEE0LCAweEQxLCAweEFELCAweDRGLAorCSAweEZELCAweEI0LCAweEEwLCAweDVELCAweDQ0LCAweDQ5LCAweDJCLCAweDAwLCAweDYzLCAweDQwLCAweDAyLCAweDJBLCAweDE0LCAweDAwLCAweDMxLCAweDYwLAorCSAweDIwLCAweDY0LCAweEEwLCAweEQzLCAweDMxLCAweDYwLCAweDFDLCAweDdDLCAweEE0LCAweERCLCAweDQwLCAweDQ5LCAweDMxLCAweDYwLCAweDIyLCAweDY0LAorCSAweEEwLCAweEQzLCAweDMxLCAweDYwLCAweDFFLCAweDdDLCAweEE0LCAweERCLCAweDBDLCAweEJCLCAweEZELCAweEIzLCAweEFELCAweDRGLCAweDAyLCAweEJDLAorCSAweDAwLCAweDdGLCAweEEwLCAweDVELCAweDE0LCAweDAwLCAweDMxLCAweDYwLCAweDI0LCAweDY0LCAweEEwLCAweEQzLCAweDMxLCAweDYwLCAweDFDLCAweDdDLAorCSAweDBFLCAweDE4LCAweEE0LCAweERCLCAweDQwLCAweDQ5LCAweDMxLCAweDYwLCAweDI2LCAweDY0LCAweEEwLCAweEQzLCAweDMxLCAweDYwLCAweDFFLCAweDdDLAorCSAweEE0LCAweERCLCAweDA4LCAweEJCLCAweEZCLCAweEIzLCAweEFELCAweDRGLCAweDAyLCAweEJDLCAweDAwLCAweDdGLCAweEEwLCAweDVELCAweEYyLCAweEZELAorCSAweDAxLCAweDYwLCAweDRFLCAweDYxLCAweEExLCAweEQzLCAweDYxLCAweDQzLCAweDE3LCAweDE4LCAweDU4LCAweEQzLCAweDYyLCAweDQxLCAweDAzLCAweDE4LAorCSAweENDLCAweDg0LCAweEExLCAweERCLCAweDExLCAweDAwLCAweDQ5LCAweEQzLCAweEEzLCAweERCLCAweDA2LCAweEExLCAweEExLCAweEQzLCAweDU5LCAweEQxLAorCSAweDYwLCAweDQ1LCAweEE1LCAweEQzLCAweDU5LCAweEQxLCAweEIwLCAweDg0LCAweEE1LCAweERCLCAweDY0LCAweDQ0LCAweDA2LCAweDM2LCAweENELCAweEZFLAorCSAweDA3LCAweDM2LCAweEQ2LCAweEZFLCAweEU1LCAweDAxLCAweDIzLCAweDQ2LCAweEIwLCAweDYwLCAweEE0LCAweDc4LCAweEZGLCAweEZGLCAweDQ2LCAweDQzLAorCSAweDI0LCAweDYwLCAweEE0LCAweDYxLCAweEExLCAweEQzLCAweDU5LCAweEQxLCAweDA2LCAweDFCLCAweDU5LCAweEQzLCAweDU5LCAweEQxLCAweDAzLCAweDFCLAorCSAweDU5LCAweEQzLCAweDU5LCAweEQxLCAweEYwLCAweDE4LCAweDAwLCAweDYzLCAweDQ5LCAweERELCAweDYwLCAweDQwLCAweDAyLCAweDM2LCAweDExLCAweDAwLAorCSAweDAzLCAweDM2LCAweDMyLCAweDAwLCAweDAxLCAweDM2LCAweDA4LCAweDAwLCAweDA1LCAweDNBLCAweEVBLCAweDAxLCAweEE0LCAweEQzLCAweDVBLCAweEQzLAorCSAweDlDLCAweDg1LCAweEE0LCAweDg0LCAweEEyLCAweERCLCAweEU0LCAweDAxLCAweDAxLCAweDYwLCAweDRFLCAweDYxLCAweDAwLCAweDY0LCAweEExLCAweERCLAorCSAweERGLCAweDAxLCAweDMxLCAweDYwLCAweDNDLCAweDY0LCAweDQwLCAweDQ1LCAweDIyLCAweDAwLCAweDAxLCAweDYwLCAweDRFLCAweDY2LCAweEE2LCAweEQzLAorCSAweDA0LCAweEExLCAweDYwLCAweDQzLCAweEExLCAweEQzLCAweEM5LCAweDgxLCAweDYwLCAweDQ1LCAweDAwLCAweEJCLCAweEExLCAweERCLCAweEJFLCAweEQzLAorCSAweDA5LCAweDAzLCAweEQ0LCAweDg0LCAweDlDLCAweDg0LCAweERDLCAweDg0LCAweEZGLCAweEZGLCAweDA0LCAweDBFLCAweEEzLCAweEQxLCAweDYzLCAweDQ2LAorCSAweDY0LCAweDQzLCAweEYyLCAweDAxLCAweDlDLCAweDg0LCAweERDLCAweDg1LCAweDQ5LCAweERELCAweDYxLCAweDQ0LCAweDAwLCAweEJCLCAweEE2LCAweERCLAorCSAweDAyLCAweDAzLCAweDY1LCAweDQ0LCAweEJFLCAweERCLCAweEJDLCAweDAxLCAweDMxLCAweDYwLCAweDE3LCAweDY0LCAweDQwLCAweDQ1LCAweDAxLCAweDYwLAorCSAweDRFLCAweDY2LCAweEE2LCAweEQzLCAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweDBGLCAweDE4LCAweDAyLCAweDAzLCAweDYwLCAweDQ2LCAweEY5LCAweDAxLAorCSAweDU4LCAweEQzLCAweEE0LCAweEQzLCAweDYwLCAweDQ1LCAweDAwLCAweDYzLCAweEE0LCAweERELCAweDA1LCAweDE4LCAweDU4LCAweEQzLCAweEZGLCAweEZGLAorCSAweEM0LCAweDgzLCAweEEyLCAweERELCAweENBLCAweDg0LCAweEE2LCAweERCLCAweDI1LCAweDU4LCAweDY0LCAweDQxLCAweDAwLCAweDYwLCAweDQ2LCAweDc0LAorCSAweENELCAweEUyLCAweDA0LCAweEUxLCAweDAyLCAweDYwLCAweDAwLCAweEUxLCAweDNGLCAweDQ0LCAweDQwLCAweDI2LCAweDBCLCAweDAwLCAweDAxLCAweDJBLAorCSAweDA1LCAweDAwLCAweDQyLCAweDYwLCAweDA5LCAweEUwLCAweDYwLCAweDYwLCAweDFDLCAweEUwLCAweDA0LCAweDAwLCAweDQyLCAweDYwLCAweDA5LCAweEUwLAorCSAweDgwLCAweDYwLCAweDFDLCAweEUwLCAweDA0LCAweDI5LCAweEZFLCAweDAxLCAweEM0LCAweEUyLCAweDQzLCAweDY0LCAweDNBLCAweERCLCAweEE0LCAweEYzLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQxLCAweDNGLCAweDQ0LCAweDAyLCAweDI3LCAweDg0LCAweDAwLCAweDIwLCAweDJCLCAweEZGLCAweDAxLCAweDgwLCAweEUxLAorCSAweDk1LCAweDYwLCAweDgwLCAweEU3LCAweDYxLCAweDQwLCAweDQwLCAweDJCLCAweDBELCAweDAwLCAweDA1LCAweDYzLCAweDMyLCAweDYwLCAweDU4LCAweDRGLAorCSAweDZBLCAweDc4LCAweEZGLCAweEZGLCAweDI4LCAweDYzLCAweEZGLCAweEZGLCAweEZFLCAweDFGLCAweDAxLCAweDYzLCAweDMyLCAweDYwLCAweDU4LCAweDRGLAorCSAweDZBLCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEIxLCAweENELCAweDgxLCAweEUxLCAweDg1LCAweDI3LCAweDYwLCAweDNDLCAweDY0LCAweDQ0LCAweEQxLAorCSAweEZGLCAweEZGLCAweDY0LCAweDQzLCAweDMyLCAweDYwLCAweDU4LCAweDRGLCAweDZBLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDAwLCAweDYzLAorCSAweDMyLCAweDYwLCAweDU4LCAweDRGLCAweDZBLCAweDc4LCAweEZGLCAweEZGLCAweDI3LCAweDYwLCAweDU4LCAweDYxLCAweDI5LCAweDYwLCAweEU4LCAweDYyLAorCSAweEEyLCAweEQzLCAweDQ1LCAweEQxLCAweDQ3LCAweEJDLCAweEUwLCAweDg0LCAweDYyLCAweDQ1LCAweDY0LCAweDVGLCAweEU4LCAweDgzLCAweDMyLCAweDYwLAorCSAweDU4LCAweDRGLCAweDZBLCAweDc4LCAweEZGLCAweEZGLCAweEEzLCAweEYzLCAweENELCAweEUyLCAweDYwLCAweDU0LCAweDA0LCAweEUxLCAweDA0LCAweDI5LAorCSAweEZFLCAweDAxLCAweEM0LCAweEUyLCAweDE1LCAweDYwLCAweEEyLCAweEU3LCAweDM4LCAweDY5LCAweEZGLCAweEZGLCAweDY4LCAweDQ0LCAweDAxLCAweDE2LAorCSAweEZELCAweDAxLCAweDAxLCAweDJBLCAweDM2LCAweDAwLCAweDAzLCAweDYwLCAweDgwLCAweDdDLCAweEEzLCAweDgzLCAweDI5LCAweDYwLCAweEU4LCAweDYyLAorCSAweEEyLCAweEQxLCAweDQzLCAweEJCLCAweEIzLCAweDgzLCAweDk1LCAweDYwLCAweDgwLCAweEU3LCAweDMyLCAweDYwLCAweDU4LCAweDRGLCAweDZBLCAweDc4LAorCSAweEZGLCAweEZGLCAweEUzLCAweDgzLCAweDE1LCAweDYwLCAweEEyLCAweEU3LCAweDM4LCAweDY5LCAweEZGLCAweEZGLCAweDY4LCAweDQxLCAweDAxLCAweDE2LAorCSAweEZELCAweDAxLCAweDYzLCAweDQ3LCAweDYxLCAweDQwLCAweDAxLCAweDJBLCAweDAzLCAweDAwLCAweDAwLCAweDNBLCAweENDLCAweDg0LCAweDAyLCAweDAwLAorCSAweDA3LCAweDNBLCAweERDLCAweDg0LCAweEZGLCAweEI0LCAweEE1LCAweERCLCAweDYwLCAweDQ3LCAweEU4LCAweDg0LCAweDQ3LCAweDY1LCAweDI5LCAweDYwLAorCSAweEU4LCAweDYyLCAweEEyLCAweEQzLCAweEI0LCAweDg1LCAweEI0LCAweDgzLCAweDgwLCAweEUxLCAweDk1LCAweDYwLCAweDgwLCAweEU3LCAweDMyLCAweDYwLAorCSAweDU4LCAweDRGLCAweDZBLCAweDc4LCAweEZGLCAweEZGLCAweEEzLCAweEYzLCAweENELCAweEUyLCAweDYwLCAweDU0LCAweDA0LCAweDI5LCAweEZFLCAweDAxLAorCSAweEM0LCAweEUyLCAweEE0LCAweEYzLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDgwLCAweDJCLCAweDA0LCAweDAwLCAweDMyLCAweDYwLCAweDQzLCAweDc4LAorCSAweEZGLCAweEZGLCAweEZGLCAweDAxLCAweEE0LCAweEYzLCAweDgwLCAweEUxLCAweENDLCAweDg0LCAweEUwLCAweDg1LCAweDE1LCAweDYwLCAweEEyLCAweEU3LAorCSAweDI2LCAweDYwLCAweDc4LCAweDY0LCAweDU4LCAweDRGLCAweDRGLCAweDAwLCAweDI2LCAweDYwLCAweDk0LCAweDY0LCAweDU4LCAweDRGLCAweDRCLCAweDAwLAorCSAweDI2LCAweDYwLCAweEIwLCAweDY0LCAweDU4LCAweDRGLCAweDQ3LCAweDAwLCAweDI2LCAweDYwLCAweENDLCAweDY0LCAweDU4LCAweDRGLCAweDQzLCAweDAwLAorCSAweDI2LCAweDYwLCAweEU4LCAweDY0LCAweDU4LCAweDRGLCAweDNGLCAweDAwLCAweDI3LCAweDYwLCAweDA0LCAweDY0LCAweDU4LCAweDRGLCAweDNCLCAweDAwLAorCSAweDI3LCAweDYwLCAweDIwLCAweDY0LCAweDU4LCAweDRGLCAweDM3LCAweDAwLCAweDAxLCAweDY4LCAweEZGLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LAorCSAweEZFLCAweDAxLCAweDNGLCAweDQ0LCAweDIwLCAweDI3LCAweDAwLCAweDAwLCAweDNGLCAweDQwLCAweDQwLCAweDI2LCAweDA4LCAweDAwLCAweDAwLCAweDYwLAorCSAweDE4LCAweDY0LCAweDAwLCAweDYwLCAweDAwLCAweDY1LCAweDk0LCAweDg0LCAweEEwLCAweDUwLCAweDFELCAweDYwLCAweDE5LCAweEUyLCAweEM0LCAweEUyLAorCSAweDAwLCAweDYzLCAweEEzLCAweEZELCAweDMyLCAweDdCLCAweDRELCAweEUyLCAweEJGLCAweEZFLCAweEM0LCAweEUyLCAweDQxLCAweEZGLCAweEUwLCAweEZFLAorCSAweEUxLCAweEZFLCAweEUyLCAweEZFLCAweDQzLCAweEZGLCAweDQ0LCAweEZGLCAweDQ2LCAweEZGLCAweEE1LCAweEYzLCAweDYyLCAweEZGLCAweDYwLCAweDQwLAorCSAweDA1LCAweDM2LCAweDJELCAweEZGLCAweDA3LCAweDM2LCAweEQ1LCAweEZFLCAweDA4LCAweEUxLCAweDg4LCAweDYwLCAweDg1LCAweDcxLCAweDhELCAweEUyLAorCSAweEEyLCAweDYwLCAweDE2LCAweDc4LCAweEZGLCAweEZGLCAweDUwLCAweEVDLCAweDYzLCAweDRBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLAorCSAweDQwLCAweEVDLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDQ0LCAweEQzLCAweDgwLCAweDdDLCAweDYwLCAweDQ4LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLAorCSAweEIwLCAweDhBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDQyLCAweEZGLCAweDQwLCAweEZGLAorCSAweERELCAweEZFLCAweEFELCAweDRGLCAweDAwLCAweDdGLCAweDAxLCAweEJDLCAweEEwLCAweDVELCAweDAwLCAweEVFLCAweDE5LCAweDYxLCAweENELCAweDgxLAorCSAweEZGLCAweEZGLCAweEZELCAweDAyLCAweDQzLCAweDQ1LCAweDIwLCAweDQ0LCAweDYwLCAweEJDLCAweDQwLCAweDQwLCAweDAyLCAweDYwLCAweEVFLCAweDYzLAorCSAweDdGLCAweEYzLCAweEEzLCAweEZELCAweDQwLCAweDdGLCAweEE0LCAweEZCLCAweDA1LCAweDY0LCAweEE1LCAweEZCLCAweERGLCAweEZFLCAweDE5LCAweEZGLAorCSAweDI0LCAweDYwLCAweERELCAweDY0LCAweDNGLCAweDQwLCAweDAxLCAweDJCLCAweDAyLCAweDAwLCAweDMyLCAweDYwLCAweEEyLCAweDY0LCAweEE2LCAweEZCLAorCSAweEJCLCAweDYwLCAweDIwLCAweDc4LCAweEZGLCAweEZGLCAweDA0LCAweEVFLCAweEFELCAweDRGLCAweDAwLCAweDdGLCAweDAxLCAweEJDLCAweEEwLCAweDVELAorCSAweDE5LCAweDYxLCAweENELCAweDgxLCAweEZGLCAweEZGLCAweEZELCAweDAyLCAweEFELCAweDRGLCAweDAwLCAweDdGLCAweDAxLCAweEJDLCAweEEwLCAweDVELAorCSAweDAwLCAweEVFLCAweDE1LCAweDYwLCAweEEyLCAweEU3LCAweDI1LCAweDYwLCAweDAyLCAweDYzLCAweDI1LCAweDYwLCAweDc2LCAweDY1LCAweERGLCAweEZFLAorCSAweDgwLCAweEUxLCAweEJELCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQ4LCAweDYwLCAweDQ3LCAweDgwLCAweEJDLCAweDAwLCAweDdGLCAweDYwLCAweDRBLAorCSAweEQ3LCAweDgwLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweEY1LCAweDAyLCAweDI1LCAweDYwLCAweDc2LCAweDYzLCAweDI2LCAweDYwLCAweDc4LCAweDY1LAorCSAweEJELCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQ4LCAweDYwLCAweDQ3LCAweDgwLCAweEJDLCAweDAwLCAweDdGLCAweDYwLCAweDRBLCAweEQ3LCAweDgwLAorCSAweEExLCAweEZGLCAweEZGLCAweEZGLCAweEY1LCAweDAyLCAweDNGLCAweDQwLCAweDIwLCAweDJCLCAweDAwLCAweDAwLCAweDAxLCAweDY4LCAweEZGLCAweDZBLAorCSAweEJGLCAweEZFLCAweDMzLCAweDYwLCAweDhBLCAweDc4LCAweEZGLCAweEZGLCAweDNGLCAweDQwLCAweDIwLCAweDJCLCAweEFELCAweDAwLCAweDAxLCAweDE2LAorCSAweEZFLCAweDAxLCAweDM4LCAweDY5LCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDY4LCAweDQ0LCAweDAxLCAweDJBLCAweEE1LCAweDAwLCAweDI3LCAweDYwLAorCSAweEI0LCAweDY0LCAweEEwLCAweEQzLCAweEZGLCAweEZGLCAweERDLCAweDg0LCAweEZGLCAweEZGLCAweDA4LCAweDI4LCAweEEyLCAweERCLCAweDdGLCAweEYxLAorCSAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDlDLCAweDAxLCAweDAwLCAweDdGLCAweEYxLCAweERELCAweEZFLCAweEFELCAweDRGLCAweDAwLCAweDdGLAorCSAweDAxLCAweEJDLCAweEEwLCAweDVELCAweDAwLCAweEVFLCAweDQzLCAweDQ1LCAweDIwLCAweDQ0LCAweDIwLCAweEJDLCAweDQwLCAweDQwLCAweDAyLCAweDYwLAorCSAweEVFLCAweDY0LCAweEEzLCAweEZCLCAweEE0LCAweEY5LCAweDA1LCAweDY0LCAweEE1LCAweEZCLCAweERGLCAweEZFLCAweDE5LCAweEZGLCAweDgzLCAweDAwLAorCSAweDIwLCAweDQ0LCAweDIwLCAweEJDLCAweDQwLCAweDQwLCAweDQzLCAweDQ1LCAweEE0LCAweEQxLCAweERBLCAweDgzLCAweEMzLCAweDg1LCAweDgwLCAweEUxLAorCSAweERGLCAweEZFLCAweEJELCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQ4LCAweDYwLCAweDQ3LCAweDgwLCAweEJDLCAweDAwLCAweDdGLCAweDYwLCAweDRBLAorCSAweEQ3LCAweDgwLCAweEExLCAweEZGLCAweEY2LCAweDAyLCAweEJGLCAweEZFLCAweDZFLCAweDAwLCAweDNGLCAweDQwLCAweDQwLCAweDI2LCAweDEzLCAweDAwLAorCSAweDBCLCAweDYwLCAweEY4LCAweDYyLCAweEEyLCAweEQxLCAweDAwLCAweDYwLCAweDEwLCAweDY0LCAweDkwLCAweDg0LCAweEEwLCAweDUwLCAweEY4LCAweEEyLAorCSAweEEyLCAweEQxLCAweDBBLCAweDYwLCAweDE5LCAweDY0LCAweDkwLCAweDg0LCAweEEwLCAweDUyLCAweDA2LCAweEEyLCAweEEyLCAweEQxLCAweDQ2LCAweDYwLAorCSAweDA5LCAweDY0LCAweDkwLCAweDg0LCAweEEwLCAweDUwLCAweEFELCAweDRGLCAweEZFLCAweEI0LCAweEEwLCAweDVELCAweEFELCAweDRGLCAweEZELCAweEI0LAorCSAweEEwLCAweDVELCAweDAyLCAweEVFLCAweEJELCAweEZFLCAweDUwLCAweDAwLCAweDgwLCAweEUxLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDY0LCAweDQ4LAorCSAweDkyLCAweDZBLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDY4LCAweDQwLCAweDI3LCAweDYwLCAweEEyLCAweDY0LCAweEEwLCAweEQzLCAweEZGLCAweEZGLAorCSAweERDLCAweDg0LCAweEZGLCAweEZGLCAweDA4LCAweDI4LCAweEEyLCAweERCLCAweDNGLCAweDAwLCAweDgwLCAweEUxLCAweDAxLCAweDE2LCAweEZFLCAweDAxLAorCSAweDAxLCAweDY4LCAweEE3LCAweDZBLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDY4LCAweDQwLCAweDM2LCAweDAwLCAweDIwLCAweDQ0LCAweDIwLCAweEJDLAorCSAweDQwLCAweDQwLCAweDgwLCAweEUxLCAweDY0LCAweDQ2LCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDIxLCAweDY5LCAweEExLCAweEZGLCAweEZGLCAweEZGLAorCSAweDY4LCAweDVFLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDIyLCAweDY5LCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDY4LCAweDVGLCAweDI2LCAweEZBLAorCSAweDFDLCAweEYyLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDNBLCAweDY5LCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDY4LCAweDVGLCAweDI3LCAweEZBLAorCSAweDFCLCAweDAwLCAweDIwLCAweDQ0LCAweDIwLCAweEJDLCAweDQwLCAweDQwLCAweDQzLCAweDQ1LCAweEJFLCAweEQ1LCAweEE0LCAweEQyLCAweDVBLCAweDg2LAorCSAweEVGLCAweEEwLCAweDExLCAweDYxLCAweDAxLCAweDA2LCAweDYwLCAweDQxLCAweDI0LCAweDYwLCAweEUwLCAweDYzLCAweDgwLCAweEUxLCAweEJELCAweEQzLAorCSAweDI2LCAweDQyLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDYwLCAweDQ5LCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDY4LCAweDQ0LCAweENELCAweDgxLAorCSAweEEyLCAweERBLCAweDVBLCAweDg2LCAweEY0LCAweDAyLCAweDI1LCAweDQzLCAweDIxLCAweEUxLCAweDAwLCAweDY0LCAweEJGLCAweERCLCAweDIwLCAweDQ0LAorCSAweDIwLCAweDJBLCAweDA3LCAweDAwLCAweDA3LCAweEI0LCAweDA0LCAweDM2LCAweEMzLCAweEZFLCAweDA2LCAweDM2LCAweENDLCAweEZFLCAweDA3LCAweDM2LAorCSAweEQ1LCAweEZFLCAweDIwLCAweDQ0LCAweEQ4LCAweEI0LCAweDQwLCAweDQwLCAweDIwLCAweDQ0LCAweDQwLCAweDJBLCAweDA3LCAweDAwLCAweDlGLCAweEZFLAorCSAweDFFLCAweDA1LCAweEJGLCAweEI0LCAweDQwLCAweDQwLCAweEE2LCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDI0LCAweDYwLCAweDgwLCAweDYzLAorCSAweEJELCAweEQzLCAweDAyLCAweDYxLCAweDE3LCAweDFCLCAweDA0LCAweEEzLCAweEJELCAweEQzLCAweDAyLCAweDYxLCAweDEzLCAweDFCLCAweDA0LCAweEEzLAorCSAweEJELCAweEQzLCAweDAyLCAweDYxLCAweDBGLCAweDFCLCAweDA0LCAweEEzLCAweEJELCAweEQzLCAweDA0LCAweDYxLCAweDBCLCAweDFCLCAweDA0LCAweEEzLAorCSAweEJELCAweEQzLCAweDA2LCAweDYxLCAweDA3LCAweDFCLCAweDA0LCAweEEzLCAweEJELCAweEQzLCAweDA3LCAweDYxLCAweDAzLCAweDFCLCAweEJCLCAweDYwLAorCSAweDIwLCAweDc4LCAweEZGLCAweEZGLCAweEEzLCAweEQxLCAweDQwLCAweDQ0LCAweDIwLCAweDQ0LCAweDA3LCAweEI1LCAweEQ0LCAweDg1LCAweDM1LCAweDgwLAorCSAweDI0LCAweDQ1LCAweDI0LCAweDYwLCAweEJDLCAweDY0LCAweDQ0LCAweEQ3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDgwLCAweEUxLCAweDQzLCAweDQ1LAorCSAweDIwLCAweDQ0LCAweDIwLCAweEJDLCAweDQwLCAweDQwLCAweDY0LCAweDQzLCAweEJELCAweEQzLCAweEJELCAweEQxLCAweDQwLCAweDQ0LCAweDEwLCAweDI3LAorCSAweDEwLCAweDAwLCAweEZGLCAweDYwLCAweDdGLCAweDY1LCAweDE1LCAweDYwLCAweEEyLCAweDY0LCAweDI0LCAweDQwLCAweDA4LCAweDJCLCAweEE0LCAweDg0LAorCSAweEEwLCAweDU3LCAweEZGLCAweEZGLCAweDY0LCAweDQ5LCAweEZGLCAweEZGLCAweDY4LCAweDQ0LCAweDAxLCAweDE2LCAweEZELCAweDAxLCAweDAwLCAweDdGLAorCSAweEEzLCAweERCLCAweEExLCAweDAxLCAweDgwLCAweEUxLCAweDQzLCAweDQ1LCAweDIwLCAweDQ0LCAweDIwLCAweEJDLCAweDQwLCAweDQwLCAweDY0LCAweDQzLAorCSAweEJELCAweEQzLCAweEJELCAweEQxLCAweDQwLCAweDQ0LCAweDEwLCAweDJCLCAweDExLCAweDAwLCAweEEzLCAweEQzLCAweEZGLCAweEZGLCAweDE1LCAweDYwLAorCSAweDgwLCAweEU3LCAweDI0LCAweDQwLCAweDA3LCAweDI3LCAweDAyLCAweDAwLCAweDUwLCAweEVDLCAweDAwLCAweDAwLCAweDYwLCAweDRBLCAweEZGLCAweEZGLAorCSAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDI0LCAweDQwLCAweDIwLCAweDJCLCAweDQwLCAweEVDLCAweDBGLCAweDAwLCAweDE1LCAweDYwLCAweDIyLCAweDY0LAorCSAweDI0LCAweDQwLCAweDA4LCAweDI3LCAweDgwLCAweEJDLCAweEEzLCAweEQzLCAweEEwLCAweDU3LCAweDYwLCAweDQ4LCAweDY0LCAweDQ0LCAweDgwLCAweEJDLAorCSAweEZGLCAweEI0LCAweDYwLCAweDRBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDc1LCAweDAxLCAweDQyLCAweDZGLCAweDZGLCAweDc0LAorCSAweDYzLCAweDZGLCAweDY0LCAweDY1LCAweDIwLCAweDIxLCAweDIxLCAweDIwLCAweDIwLCAweDAwLCAweDUzLCAweDU0LCAweDQxLCAweDJGLCAweDQxLCAweDUwLAorCSAweDIwLCAweDQ2LCAweDc1LCAweDZFLCAweDYzLCAweDI3LCAweDczLCAweDAwLCAweDFGLCAweDAwLCAweDAzLCAweDAwLCAweDAyLCAweDAwLCAweDI0LCAweDAwLAorCSAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDA1LCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDA0LCAweDAwLAorCSAweDA2LCAweDAwLCAweDA3LCAweDAwLCAweDA1LCAweDAwLCAweDA2LCAweDAwLCAweDA3LCAweDAwLCAweDA2LCAweDAwLCAweDA2LCAweDAwLCAweDA3LCAweDAwLAorCSAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLAorCSAweDAyLCAweDAwLCAweDQwLCAweDAwLCAweDMyLCAweDAwLCAweDMyLCAweDAwLCAweDBBLCAweDAwLCAweDAyLCAweDAwLCAweDA2LCAweDAwLCAweDQwLCAweDAwLAorCSAweDMyLCAweDAwLCAweDM2LCAweDAwLCAweDBBLCAweDAwLCAweDAyLCAweDAwLCAweDA2LCAweDAwLCAweDQwLCAweDAwLCAweDNCLCAweDAwLCAweDQwLCAweDAwLAorCSAweDE3LCAweDAwLCAweDA3LCAweDAwLCAweDA3LCAweDAwLCAweDRBLCAweDAwLCAweDQwLCAweDAwLCAweDRBLCAweDAwLCAweDFFLCAweDAwLCAweDBDLCAweDAwLAorCSAweDA4LCAweDAwLCAweDU3LCAweDAwLCAweDRELCAweDAwLCAweDU3LCAweDAwLCAweDJCLCAweDAwLCAweDE5LCAweDAwLCAweDA4LCAweDAwLCAweDVELCAweDAwLAorCSAweDUzLCAweDAwLCAweDVELCAweDAwLCAweDMxLCAweDAwLCAweDFGLCAweDAwLCAweDA4LCAweDAwLCAweEE5LCAweEYzLCAweDIxLCAweDYxLCAweDAwLCAweDdDLAorCSAweDAxLCAweDAwLCAweDAwLCAweEZBLCAweDYwLCAweDQ2LCAweEZFLCAweDYzLCAweEEzLCAweEQ4LCAweEZFLCAweDFGLCAweENELCAweDgxLCAweEQ4LCAweDg0LAorCSAweEY4LCAweDAyLCAweDIxLCAweDYxLCAweDgwLCAweDY3LCAweDQwLCAweDRBLCAweEE5LCAweEY1LCAweDE0LCAweDYwLCAweDAyLCAweDY1LCAweDAxLCAweDdDLAorCSAweDA3LCAweDE4LCAweDJBLCAweDQzLCAweDAyLCAweEZDLCAweDVGLCAweDhBLCAweDhFLCAweEY4LCAweDcwLCAweEY4LCAweDAwLCAweEY0LCAweEY4LCAweDAxLAorCSAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDNGLCAweDQwLCAweDQwLCAweDI2LCAweDBBLCAweDAwLCAweDQyLCAweDYwLCAweDA5LCAweEUwLCAweDNGLCAweDQwLAorCSAweDAxLCAweDJBLCAweDAzLCAweDAwLCAweDYwLCAweDYwLCAweDFDLCAweEUwLCAweDAyLCAweDAwLCAweDgwLCAweDYwLCAweDFDLCAweEUwLCAweDQwLCAweEVDLAorCSAweDAwLCAweEVELCAweDAyLCAweEVFLCAweDgwLCAweDYwLCAweDU4LCAweEVDLCAweDgwLCAweDYwLCAweDAwLCAweEVELCAweDgwLCAweDYwLCAweDgyLCAweEVFLAorCSAweEMwLCAweDYwLCAweDU5LCAweEVDLCAweEMwLCAweDYwLCAweDA3LCAweEVELCAweEFELCAweDRGLCAweEZFLCAweEI0LCAweEEwLCAweDVELCAweDAwLCAweEYzLAorCSAweDI4LCAweEZCLCAweDQwLCAweDQ0LCAweDJGLCAweDYwLCAweDUyLCAweDdDLCAweDIwLCAweEY5LCAweEEyLCAweDYwLCAweDAwLCAweDdDLCAweDIxLCAweEY5LAorCSAweEEyLCAweDYwLCAweEUwLCAweDdDLCAweDIyLCAweEY5LCAweDE4LCAweDYwLCAweDk3LCAweDdDLCAweDIzLCAweEY5LCAweDE4LCAweDYwLCAweEE4LCAweDdDLAorCSAweDI0LCAweEY5LCAweDE4LCAweDYwLCAweEQyLCAweDdDLCAweDI1LCAweEY5LCAweDE4LCAweDYwLCAweEUzLCAweDdDLCAweDI2LCAweEY5LCAweDkxLCAweDYwLAorCSAweDAwLCAweEU4LCAweDI4LCAweEU4LCAweDQ0LCAweDYwLCAweDAyLCAweEU2LCAweDEwLCAweDY3LCAweDQwLCAweDUyLCAweDEwLCAweDYwLCAweDA0LCAweEU2LAorCSAweDA4LCAweDYwLCAweDAwLCAweDYzLCAweEZBLCAweDYwLCAweDAwLCAweDY1LCAweEJELCAweEQzLCAweEJELCAweEQzLCAweDAyLCAweEE4LCAweEQ0LCAweDgwLAorCSAweDRBLCAweDAyLCAweDQ5LCAweDAyLCAweERCLCAweDgzLCAweEZBLCAweDYwLCAweDI3LCAweDY1LCAweDVCLCAweEQzLCAweEJGLCAweEQxLCAweDFBLCAweDE4LAorCSAweEMzLCAweDgzLCAweEQ0LCAweDgwLCAweEMzLCAweDgzLCAweEY5LCAweDAyLCAweERCLCAweDgzLCAweEQzLCAweDgzLCAweEQzLCAweDg2LCAweDY0LCAweDQxLAorCSAweENELCAweDgxLCAweEE2LCAweEQxLCAweERBLCAweDg2LCAweDI1LCAweDYwLCAweDAyLCAweDY1LCAweDAwLCAweDYwLCAweDcyLCAweDYzLCAweEE1LCAweEQzLAorCSAweERBLCAweDg1LCAweDkwLCAweDg0LCAweEZGLCAweDI3LCAweDAyLCAweDAwLCAweEEyLCAweEQ5LCAweDAxLCAweDAwLCAweEY4LCAweDFGLCAweENELCAweDgxLAorCSAweEZGLCAweEZGLCAweEVGLCAweDAyLCAweDA4LCAweDYwLCAweDA2LCAweDYzLCAweEZBLCAweDYwLCAweDI4LCAweDY1LCAweDVCLCAweEQzLCAweEJGLCAweEQxLAorCSAweDBCLCAweDE4LCAweEMzLCAweDgzLCAweEQ0LCAweDgwLCAweEMzLCAweDgzLCAweEY5LCAweDAyLCAweEJGLCAweEQzLCAweDI5LCAweDYwLCAweEU4LCAweDYyLAorCSAweDBFLCAweEI0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEEyLCAweERCLCAweDA4LCAweDYwLCAweDA2LCAweDYzLCAweEZELCAweDYwLCAweDBDLCAweDY1LAorCSAweDVCLCAweEQzLCAweEJGLCAweEQxLCAweDEwLCAweDE4LCAweEMzLCAweDgzLCAweEQ0LCAweDgwLCAweEMzLCAweDgzLCAweEY5LCAweDAyLCAweEZBLCAweEEzLAorCSAweEEzLCAweEQzLCAweDAyLCAweDYwLCAweDAwLCAweDY1LCAweEY3LCAweEEwLCAweEZDLCAweEEwLCAweDBELCAweDA1LCAweDA0LCAweDA1LCAweDc4LCAweDQzLAorCSAweDAyLCAweDYxLCAweDI0LCAweDYwLCAweERELCAweDc4LCAweDIxLCAweDYwLCAweDAwLCAweDY1LCAweDNGLCAweDQzLCAweDNGLCAweDQzLCAweDIxLCAweDYwLAorCSAweDAwLCAweDY1LCAweEMwLCAweDYwLCAweDhGLCAweEVFLCAweEI3LCAweDg0LCAweDQwLCAweDVGLCAweDAwLCAweDYwLCAweDMwLCAweEUyLCAweDAwLCAweDYwLAorCSAweDUwLCAweEUyLCAweDAwLCAweDYwLCAweDc5LCAweEUyLCAweDAwLCAweDYwLCAweDkwLCAweEUyLCAweDAxLCAweDYwLCAweEQwLCAweEUyLCAweDAxLCAweDYwLAorCSAweEYwLCAweEUyLCAweDAxLCAweDYwLCAweEIwLCAweEUyLCAweDI2LCAweDY0LCAweDM1LCAweEZCLCAweDAxLCAweDYwLCAweDMwLCAweDY0LCAweDBBLCAweEE0LAorCSAweDM4LCAweEZCLCAweDYwLCAweDQ1LCAweDAwLCAweDYwLCAweEY4LCAweDY0LCAweDBBLCAweEE0LCAweDM5LCAweEZCLCAweDM1LCAweEYxLCAweDBBLCAweDY0LAorCSAweEM0LCAweDg0LCAweDM2LCAweEZCLCAweEMwLCAweDg0LCAweDBBLCAweEE0LCAweDM3LCAweEZCLCAweDA5LCAweDYwLCAweDJBLCAweDY0LCAweEI5LCAweEZCLAorCSAweDgyLCAweEZGLCAweDkyLCAweEZGLCAweDVDLCAweDQxLCAweDVDLCAweDQ2LCAweDVDLCAweDQ3LCAweDAwLCAweEUxLCAweEEzLCAweDYwLCAweDRCLCAweDYzLAorCSAweDBDLCAweDYwLCAweDE2LCAweDY0LCAweEEwLCAweERELCAweDg3LCAweEZGLCAweDk3LCAweEZGLCAweDBDLCAweDYwLCAweDAyLCAweDY0LCAweDQwLCAweDVBLAorCSAweDA2LCAweEE0LCAweDQwLCAweDVCLCAweDVDLCAweDVFLCAweDVDLCAweDUxLCAweDI4LCAweDYwLCAweDQ0LCAweDYyLCAweEEyLCAweEQzLCAweDdGLCAweEZCLAorCSAweDJELCAweDYwLCAweENDLCAweDYxLCAweDI3LCAweDdDLCAweEExLCAweEQ5LCAweDZELCAweDYwLCAweDFDLCAweDYzLCAweDdGLCAweEEzLCAweEUzLCAweDg3LAorCSAweDAwLCAweDdGLCAweEFBLCAweEZCLCAweDAyLCAweDYwLCAweDdGLCAweDY0LCAweDAwLCAweDYwLCAweDQyLCAweDY1LCAweEQ0LCAweDg0LCAweEFCLCAweEZCLAorCSAweERDLCAweDg0LCAweEE5LCAweEZCLCAweDI0LCAweDYwLCAweDBFLCAweDYyLCAweEEyLCAweERCLCAweDM0LCAweDYwLCAweDU4LCAweDRFLCAweDY0LCAweDc4LAorCSAweEZGLCAweEZGLCAweEFCLCAweEYxLCAweEFBLCAweEYzLCAweDdDLCAweDYzLCAweEFELCAweEZCLCAweDYwLCAweDQ2LCAweDAxLCAweEZDLCAweERDLCAweDg0LAorCSAweEQwLCAweDgwLCAweDAwLCAweEZBLCAweEZBLCAweDA0LCAweEFFLCAweEZCLCAweDYwLCAweDQ2LCAweDAwLCAweDY0LCAweDAwLCAweEZBLCAweDYzLCAweDQ0LAorCSAweDgwLCAweDdGLCAweDAxLCAweEZBLCAweEFCLCAweEYzLCAweEFBLCAweEYxLCAweERDLCAweDg0LCAweEQwLCAweDg0LCAweEFDLCAweEZCLCAweDAzLCAweDYwLAorCSAweDI2LCAweDYxLCAweEFFLCAweDYwLCAweDU4LCAweDRELCAweEIxLCAweDc4LCAweEZGLCAweEZGLCAweDY2LCAweDQ0LCAweDJFLCAweEZCLCAweDgyLCAweEZGLAorCSAweDQwLCAweDQyLCAweDg3LCAweEZGLCAweEFDLCAweEYzLCAweEI0LCAweEZCLCAweDA4LCAweDYwLCAweDAwLCAweDYzLCAweEZBLCAweDYwLCAweDAwLCAweDY1LAorCSAweEJELCAweEQzLCAweEEzLCAweEQzLCAweDAyLCAweEE4LCAweEQ0LCAweDgwLCAweDI0LCAweDAyLCAweDIzLCAweDAyLCAweDJELCAweDYwLCAweDFBLCAweDYyLAorCSAweEEyLCAweEQxLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDgwLCAweDI2LCAweDFDLCAweDAwLCAweDA0LCAweEEzLCAweEZELCAweDYwLCAweDBELCAweDY1LAorCSAweDVCLCAweEQzLCAweEJGLCAweEQxLCAweDE2LCAweDE4LCAweEMzLCAweDgzLCAweEQ0LCAweDgwLCAweEMzLCAweDgzLCAweEY5LCAweDAyLCAweEJGLCAweEQzLAorCSAweEFELCAweDQ5LCAweEZFLCAweEEwLCAweDAwLCAweDY0LCAweDBFLCAweDA0LCAweDA4LCAweEIxLCAweDIwLCAweEJDLCAweDA4LCAweDI4LCAweDE4LCAweEJDLAorCSAweDFDLCAweDYwLCAweEI4LCAweDYzLCAweDA3LCAweDdDLCAweEEzLCAweEQ5LCAweDFDLCAweDYwLCAweEI2LCAweDYzLCAweDA1LCAweDdDLCAweEEzLCAweEQ5LAorCSAweDAxLCAweDAwLCAweDAwLCAweDY0LCAweDFDLCAweDYwLCAweEI0LCAweDYzLCAweEEzLCAweERCLCAweDAwLCAweDY0LCAweDQwLCAweDUwLCAweDYzLCAweEZGLAorCSAweDYwLCAweEZGLCAweDY2LCAweEZGLCAweDY1LCAweEZGLCAweDY0LCAweEZGLCAweDYxLCAweEZGLCAweDYyLCAweEZGLCAweDQ5LCAweDYwLCAweDAyLCAweEUxLAorCSAweDUyLCAweDYwLCAweDAyLCAweEUxLCAweDVCLCAweDYwLCAweDAyLCAweEUxLCAweDY1LCAweDYwLCAweDAyLCAweEUxLCAweDZDLCAweDYwLCAweDAyLCAweEUxLAorCSAweDc2LCAweDYwLCAweDAyLCAweEUxLCAweDQxLCAweDYwLCAweDAyLCAweEUxLCAweDA0LCAweDY1LCAweDJELCAweDYwLCAweDE4LCAweDY0LCAweDQ0LCAweEQzLAorCSAweEVGLCAweDYwLCAweDU4LCAweDRFLCAweEJELCAweDc4LCAweEZGLCAweEZGLCAweDI0LCAweDYwLCAweDlFLCAweDY1LCAweDBDLCAweDY0LCAweEE1LCAweERCLAorCSAweDM2LCAweDYwLCAweDFFLCAweDY0LCAweEExLCAweEZCLCAweDJELCAweEZGLCAweDA2LCAweDYxLCAweDQxLCAweDRCLCAweDA5LCAweDYwLCAweDA4LCAweDYxLAorCSAweEFFLCAweDYwLCAweDU4LCAweDRELCAweEIxLCAweDc4LCAweEZGLCAweEZGLCAweEYwLCAweDY3LCAweDBFLCAweEZBLCAweDI0LCAweDYwLCAweDdBLCAweDYyLAorCSAweDI0LCAweDYwLCAweDVFLCAweDY0LCAweEEyLCAweERCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLAorCSAweDJCLCAweEZGLCAweDJCLCAweDQxLCAweDRELCAweDhCLCAweEZGLCAweEZGLCAweEU5LCAweDAyLCAweDA2LCAweDYxLCAweDQxLCAweDRCLCAweDA5LCAweDYwLAorCSAweDA4LCAweDYxLCAweEFFLCAweDYwLCAweDU4LCAweDRELCAweEIxLCAweDc4LCAweEZGLCAweEZGLCAweDI0LCAweDYwLCAweDdBLCAweDYyLCAweDI0LCAweDYwLAorCSAweDUyLCAweDY0LCAweEEyLCAweERCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLAorCSAweDJCLCAweDQxLCAweDRELCAweDhCLCAweEZGLCAweEZGLCAweEVCLCAweDAyLCAweDE5LCAweDYwLCAweDE3LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweEVBLAorCSAweDAwLCAweEVCLCAweDUwLCAweDYwLCAweDAzLCAweEVBLCAweDUxLCAweDYwLCAweDEzLCAweEVBLCAweDUyLCAweDYwLCAweDMwLCAweEVBLCAweDUzLCAweDYwLAorCSAweDQwLCAweEVBLCAweDU0LCAweDYwLCAweDUyLCAweEVBLCAweDU1LCAweDYwLCAweDZELCAweEVBLCAweDU2LCAweDYwLCAweDcxLCAweEVBLCAweDU3LCAweDYwLAorCSAweDhCLCAweEVBLCAweDU4LCAweDYwLCAweDQ3LCAweEVBLCAweDU5LCAweDYwLCAweEEwLCAweEVBLCAweDVBLCAweDYwLCAweEIyLCAweEVBLCAweDVCLCAweDYwLAorCSAweEMxLCAweEVBLCAweDVDLCAweDYwLCAweEQ3LCAweEVBLCAweDVELCAweDYwLCAweEVCLCAweEVBLCAweDVFLCAweDYwLCAweEEwLCAweEVBLCAweDUwLCAweDYwLAorCSAweDM2LCAweEVCLCAweDUxLCAweDYwLCAweDM3LCAweEVCLCAweDUyLCAweDYwLCAweDIwLCAweEVCLCAweDUzLCAweDYwLCAweEU0LCAweEVCLCAweDU0LCAweDYwLAorCSAweDM0LCAweEVCLCAweDU1LCAweDYwLCAweDU4LCAweEVCLCAweDU2LCAweDYwLCAweDQ4LCAweEVCLCAweDU3LCAweDYwLCAweEQwLCAweEVCLCAweDU4LCAweDYwLAorCSAweEMzLCAweEVCLCAweDU5LCAweDYwLCAweEZDLCAweEVCLCAweDVBLCAweDYwLCAweDM0LCAweEVCLCAweDVCLCAweDYwLCAweDU4LCAweEVCLCAweDVDLCAweDYwLAorCSAweEMwLCAweEVCLCAweDVELCAweDYwLCAweEQwLCAweEVCLCAweDVFLCAweDYwLCAweDkxLCAweEVCLCAweDAwLCAweEVBLCAweDAwLCAweEVCLCAweEUwLCAweDYwLAorCSAweDAyLCAweEVBLCAweEUwLCAweDYwLCAweDAzLCAweEVCLCAweEEwLCAweDYwLCAweDAwLCAweEVCLCAweEIwLCAweDYwLCAweDAwLCAweEVCLCAweEFCLCAweDQ4LAorCSAweDQwLCAweDNCLCAweDAxLCAweDAwLCAweEZDLCAweDAxLCAweDAwLCAweEVCLCAweDAzLCAweDYwLCAweDAyLCAweDYyLCAweDYyLCAweDQ0LCAweEEyLCAweERCLAorCSAweDBGLCAweDY0LCAweDYwLCAweDdGLCAweEEwLCAweDVBLCAweDgwLCAweDYwLCAweDAwLCAweEVBLCAweEEwLCAweDYwLCAweDAwLCAweEVBLCAweEQxLCAweDYwLAorCSAweDAwLCAweEVBLCAweDNGLCAweDQwLCAweDQwLCAweDI2LCAweDA4LCAweDAwLCAweDAwLCAweDYwLCAweDE4LCAweDY0LCAweDAwLCAweDYwLCAweDAwLCAweDY1LAorCSAweDk0LCAweDg0LCAweEEwLCAweDUwLCAweDFELCAweDYwLCAweDE5LCAweEUyLCAweDI0LCAweDQ0LCAweEZGLCAweEI0LCAweDA0LCAweEZCLCAweDUwLCAweDYwLAorCSAweDAwLCAweDY0LCAweDA1LCAweEZCLCAweDEwLCAweDYwLCAweDEwLCAweDc1LCAweDI1LCAweDYwLCAweDExLCAweDc4LCAweEZGLCAweEZGLCAweDNGLCAweDQxLAorCSAweEE1LCAweDRDLCAweDUwLCAweDM3LCAweDA0LCAweDAwLCAweDAxLCAweEI5LCAweDQxLCAweDVGLCAweEI1LCAweDYwLCAweDU1LCAweEUwLCAweDBDLCAweDYwLAorCSAweDEwLCAweDYyLCAweEEyLCAweEQzLCAweDAxLCAweDYwLCAweDAxLCAweDY1LCAweEQ0LCAweDgwLCAweDVBLCAweEQxLCAweDBGLCAweDAyLCAweDVBLCAweEQzLAorCSAweDNDLCAweDYwLCAweDAwLCAweDY2LCAweEUwLCAweDg3LCAweDQwLCAweDRBLCAweDY4LCAweDYwLCAweDI4LCAweDYxLCAweDY0LCAweDQ0LCAweEM4LCAweDg0LAorCSAweDBDLCAweDYzLCAweEFBLCAweDQ2LCAweDU4LCAweEQwLCAweEFBLCAweDQ2LCAweDU5LCAweEQ4LCAweEZCLCAweDFGLCAweDA4LCAweDYwLCAweDAwLCAweDYzLAorCSAweEZBLCAweDYwLCAweDAwLCAweDY1LCAweEJELCAweEQzLCAweEEzLCAweEQzLCAweDAyLCAweEE4LCAweEQ0LCAweDgwLCAweDYxLCAweDAyLCAweDYwLCAweDAyLAorCSAweDZFLCAweDYwLCAweDU4LCAweDYxLCAweDNDLCAweDYwLCAweDAwLCAweDY2LCAweDQxLCAweDRCLCAweDJCLCAweDQxLCAweDZFLCAweDYwLCAweEEwLCAweDdDLAorCSAweEQxLCAweDgwLCAweEExLCAweEQyLCAweDI1LCAweDA1LCAweDU5LCAweEQwLCAweDYwLCAweDQ1LCAweDU5LCAweEQyLCAweDQ0LCAweDQ3LCAweEUwLCAweDg3LAorCSAweDQwLCAweDRBLCAweDU5LCAweEQyLCAweDU5LCAweDhCLCAweDQwLCAweDRDLCAweDA4LCAweDYwLCAweDAwLCAweDYzLCAweEJFLCAweEQzLCAweEJELCAweEQxLAorCSAweEVDLCAweDE4LCAweEQ0LCAweDgwLCAweEVBLCAweDE4LCAweDAzLCAweDAzLCAweEMzLCAweDgzLCAweEMzLCAweDgzLCAweEY3LCAweDAxLCAweDY3LCAweDQ0LAorCSAweEMwLCAweDg0LCAweEUwLCAweDg1LCAweDJDLCAweDQ0LCAweEQ0LCAweDgwLCAweDYzLCAweDQxLCAweDAxLCAweDA2LCAweDY1LCAweDQ0LCAweEM4LCAweDgzLAorCSAweEFBLCAweDQ2LCAweDU5LCAweEQxLCAweDI3LCAweEQ4LCAweDVBLCAweDg3LCAweEZDLCAweDFGLCAweEFBLCAweDQ2LCAweDJCLCAweDQxLCAweEQ1LCAweDAxLAorCSAweDZFLCAweDYwLCAweEEwLCAweDYxLCAweDQxLCAweDRCLCAweDJCLCAweDQxLCAweDZFLCAweDYwLCAweEQ4LCAweDdDLCAweEQxLCAweDgwLCAweEExLCAweEQyLAorCSAweDI3LCAweDA1LCAweDU5LCAweEQwLCAweDYwLCAweDQ1LCAweDU5LCAweEQyLCAweDQ0LCAweDQ3LCAweEUwLCAweDg3LCAweDQwLCAweDRBLCAweDU5LCAweEQyLAorCSAweDU5LCAweDhCLCAweDQwLCAweDRDLCAweDA4LCAweDYwLCAweDAwLCAweDYzLCAweEJFLCAweEQzLCAweEJELCAweEQxLCAweEVDLCAweDE4LCAweEQ0LCAweDgwLAorCSAweEVBLCAweDE4LCAweDAzLCAweDAzLCAweEMzLCAweDgzLCAweEMzLCAweDgzLCAweEY3LCAweDAxLCAweDA0LCAweEEzLCAweEEzLCAweEQxLCAweDVBLCAweDg4LAorCSAweDJDLCAweDQzLCAweEQzLCAweDgwLCAweEZGLCAweEZGLCAweDAxLCAweDA2LCAweDY0LCAweDQzLCAweENGLCAweDgzLCAweEFBLCAweDQ2LCAweDYwLCAweEZFLAorCSAweDI4LCAweEQxLCAweDVFLCAweDg4LCAweDI3LCAweEQ4LCAweDVBLCAweDg3LCAweEZCLCAweDFGLCAweDIwLCAweEZFLCAweEFBLCAweDQ2LCAweEQzLCAweDAxLAorCSAweEI4LCAweEZFLCAweEI5LCAweEZFLCAweEJBLCAweEZFLCAweEJCLCAweEZFLCAweEJELCAweEZFLCAweEJGLCAweEZFLCAweDJELCAweDYwLCAweDFBLCAweDYyLAorCSAweEEyLCAweEQzLCAweDEyLCAweDYzLCAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDA1LCAweDAwLCAweDBCLCAweDYwLCAweEVBLCAweDYyLCAweDAwLCAweDY0LAorCSAweDVBLCAweERCLCAweEZFLCAweDFGLCAweDM0LCAweDYwLCAweDgxLCAweDc4LCAweEZGLCAweEZGLCAweEYxLCAweEZGLCAweEY2LCAweDZDLCAweDFFLCAweDAwLAorCSAweDA0LCAweDAwLCAweEYyLCAweEZGLCAweEZBLCAweDZDLCAweDFFLCAweDAwLCAweDA0LCAweDAwLCAweEZCLCAweEZGLCAweDAyLCAweDZELCAweDFFLCAweDAwLAorCSAweDA0LCAweDAwLCAweEYxLCAweEZGLCAweDhDLCAweDY0LCAweDFFLCAweDAwLCAweDA0LCAweDAwLCAweEYyLCAweEZGLCAweDkwLCAweDY0LCAweDFFLCAweDAwLAorCSAweDA0LCAweDAwLCAweEZCLCAweEZGLCAweDk4LCAweDY0LCAweDFFLCAweDAwLCAweDA0LCAweDAwLCAweDg2LCAweEZELCAweDUwLCAweDI4LCAweDAwLCAweDAwLAorCSAweDA2LCAweDAwLCAweDEwLCAweEZELCAweDc0LCAweDAxLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDE0LCAweEZELCAweDE4LCAweDJELCAweDAwLCAweDAwLAorCSAweDBBLCAweDAwLCAweDIwLCAweEZBLCAweDk0LCAweDI2LCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweDIxLCAweEZBLCAweDc4LCAweDI2LCAweDAwLCAweDAwLAorCSAweDBFLCAweDAwLCAweDIyLCAweEZBLCAweEIwLCAweDI2LCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweDIzLCAweEZBLCAweDY0LCAweDI1LCAweDAwLCAweDAwLAorCSAweDAxLCAweDAwLCAweDI0LCAweEZBLCAweDU4LCAweDI3LCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweDI1LCAweEZBLCAweDc4LCAweDI1LCAweDAwLCAweDAwLAorCSAweDgwLCAweDAwLCAweDI2LCAweEZBLCAweDVFLCAweDI1LCAweDAwLCAweDAwLCAweDAxLCAweDAwLAorCit9OyAgLyogZndfaW1hZ2VfM19kYXRhICovCisKK3N0YXRpYyBjb25zdCBoY2ZfOCBmd19pbWFnZV80X2RhdGFbXSA9IHsKKwkgMHhBMiwgMHg2MCwgMHhERCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBMiwgMHg2MCwgMHhDMywgMHg3OCwgMHg0MSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBMiwgMHg2MCwgMHhDOSwgMHg3OCwgMHhDNCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBMiwgMHg2MCwgMHgxOSwgMHg3OCwgMHg0MywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg0NCwgMHhGRiwgMHgyMCwgMHg1NCwgMHhDRCwgMHhFMiwgMHhBMiwgMHg2MCwgMHhEQiwgMHg3OCwgMHgwOCwgMHhFMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBMiwgMHg2MCwgMHhERCwgMHg3OCwgMHg0NCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBMiwgMHg2MCwgMHhERCwgMHg3OCwgMHg0NiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBMiwgMHg2MCwgMHhERCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBOCwgMHg2MCwgMHg3MywgMHg3OCwgMHg0QywgMHg0RSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBNywgMHg2MCwgMHhGQiwgMHg3OCwgMHg0QywgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhDNCwgMHhFMiwgMHg4NCwgMHhGRiwgMHgyMiwgMHg1OCwgMHg4MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBMywgMHg2MCwgMHg3RSwgMHg3OCwgMHg0MywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhFNCwgMHhFMiwgMHhBOCwgMHg2MCwgMHgxNCwgMHg3OCwgMHhCNSwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCQSwgMHg2MCwgMHhDRSwgMHg3OCwgMHg2NCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBOCwgMHg2MCwgMHg4NywgMHg3OCwgMHhBNCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBOCwgMHg2MCwgMHg1NSwgMHg3OCwgMHg0NywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBRSwgMHg2MCwgMHgxRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBRSwgMHg2MCwgMHg0QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBQywgMHg2MCwgMHhEOCwgMHg3OCwgMHg0MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBRCwgMHg2MCwgMHgwOCwgMHg3OCwgMHg0MywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBRCwgMHg2MCwgMHgwOCwgMHg3OCwgMHg0NCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBRiwgMHg2MCwgMHhDMCwgMHg3OCwgMHg0NSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBRCwgMHg2MCwgMHgwQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2MCwgMHg4MywgMHg2NCwgMHg4MCwgMHgyOSwgMHgwOSwgMHhGQiwgMHhBRCwgMHg2MCwgMHhFNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgzMSwgMHg2MCwgMHgxNiwgMHg3OCwgMHg0MCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgzMCwgMHg2MCwgMHhBMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCOSwgMHg2MCwgMHg0QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCOCwgMHg2MCwgMHhCQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCMCwgMHg2MCwgMHg4OSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MywgMHgzRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCQiwgMHg2MCwgMHgyNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHg0MSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHg0MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHhCMCwgMHhGRiwgMHhCMSwgMHhGRiwgMHg0MCwgMHhGRiwgMHg0MywgMHhGRiwgMHhCQiwgMHg2MCwgMHgyMCwgMHg3OCwgMHg0NCwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHhCQiwgMHg2MCwgMHgyNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHgzMywgMHg2MCwgMHg5QiwgMHg3OCwgMHg0NSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHhCQiwgMHg2MCwgMHgyMCwgMHg3OCwgMHg4NCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHhCQiwgMHg2MCwgMHgxRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHhCRiwgMHg2MCwgMHhEQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhFQiwgMHg2MCwgMHgxRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCRiwgMHg2MCwgMHhFMywgMHg3OCwgMHg0MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCRiwgMHg2MCwgMHhFMywgMHg3OCwgMHgyNCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhFOSwgMHg2MCwgMHhFMywgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCRiwgMHg2MCwgMHhFMywgMHg3OCwgMHg0NCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCRiwgMHg2MCwgMHhFMywgMHg3OCwgMHg4NCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCRiwgMHg2MCwgMHhFMywgMHg3OCwgMHg0NywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgyNCwgMHg2MCwgMHhFNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgyNSwgMHg2MCwgMHgxNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgyNSwgMHg2MCwgMHgzMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgyNSwgMHg2MCwgMHgxMSwgMHg3OCwgMHgyOCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgyNSwgMHg2MCwgMHgxMSwgMHg3OCwgMHg0NCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgyNSwgMHg2MCwgMHgxMSwgMHg3OCwgMHg0NSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgyNSwgMHg2MCwgMHgxMSwgMHg3OCwgMHg0NiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2MCwgMHg4NywgMHg2NCwgMHg4MCwgMHgyOSwgMHgwOSwgMHhGQiwgMHg0NywgMHhGRiwgMHgyNSwgMHg2MCwgMHgxMSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgyRiwgMHg2MCwgMHg2MywgMHg3OCwgMHg0MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgyRiwgMHg2MCwgMHhCMywgMHg3OCwgMHg0NywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwNywgMHgwMiwgMHg2MiwgMHhGRiwgMHg2MywgMHhGRiwgMHg2NCwgMHhGRiwgMHg2NSwgMHhGRiwKKwkgMHg2NiwgMHhGRiwgMHhCRiwgMHhGRSwgMHhBMSwgMHhGRiwgMHg4MiwgMHhGRiwgMHg4OCwgMHhGRiwgMHg2QywgMHg0MCwgMHg0MSwgMHhGRiwgMHhDNCwgMHhFMiwKKwkgMHg0MywgMHhGRiwgMHg1QywgMHg0OSwgMHgwOCwgMHhFMSwgMHhBMiwgMHg2MCwgMHgxNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMSwgMHhGRiwgMHg5OCwgMHhGRiwKKwkgMHg4MCwgMHgzRSwgMHg5RiwgMHhGRSwgMHgwMywgMHgwNCwgMHgzMSwgMHg2MCwgMHg3NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFMiwgMHhGRSwgMHg0MCwgMHgwNSwKKwkgMHhFMCwgMHhGRSwgMHg1QiwgMHgwNSwgMHhFMSwgMHhGRSwgMHhGMiwgMHgwNCwgMHgyOSwgMHg0MCwgMHgwOCwgMHgyNiwgMHhFRiwgMHgwMSwgMHg3MiwgMHg0NCwKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhCNSwgMHhGMywgMHhFOCwgMHg4NSwgMHhGRiwgMHhCNywKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhCNCwgMHg4NSwgMHg3MywgMHg0NCwgMHhENCwgMHg4NCwgMHgxMCwgMHg2NSwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgyNiwgMHgwNCwgMHgzRiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgxMywgMHgwMCwgMHgwQiwgMHg2MCwgMHhGOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwKKwkgMHgxMCwgMHg2NCwgMHg5MCwgMHg4NCwgMHhBMCwgMHg1MCwgMHhGOCwgMHhBMiwgMHhBMiwgMHhEMSwgMHgwQSwgMHg2MCwgMHgxOSwgMHg2NCwgMHg5MCwgMHg4NCwKKwkgMHhBMCwgMHg1MiwgMHgwNiwgMHhBMiwgMHhBMiwgMHhEMSwgMHg0NiwgMHg2MCwgMHgwOSwgMHg2NCwgMHg5MCwgMHg4NCwgMHhBMCwgMHg1MCwgMHhGMiwgMHhGNCwKKwkgMHgzMSwgMHg2MCwgMHgxOCwgMHg3QywgMHg2MywgMHg0MCwgMHgwMSwgMHgyNiwgMHgwOCwgMHgwMCwgMHhBNCwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhCNCwKKwkgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwgMHhBRCwgMHg0RiwgMHhGRSwgMHhCNCwgMHhBMCwgMHg1RCwgMHgwMiwgMHhFRSwgMHhCRCwgMHhGRSwgMHhCRSwgMHgwMSwKKwkgMHgyMSwgMHg0NiwgMHg1RSwgMHg2MiwgMHg5QSwgMHhGRiwgMHgwNywgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwNiwgMHgyNSwgMHgxMCwgMHgwMCwKKwkgMHhBMiwgMHhEQywgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHg2MiwgMHg2MiwgMHgwMSwgMHg1RCwgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywKKwkgMHg3QSwgMHhEQywgMHg0NCwgMHhGRiwgMHgwNiwgMHgyNSwgMHgwNCwgMHgwMCwgMHgwRSwgMHhFMSwgMHgwMiwgMHg2MCwgMHgwMSwgMHhFMSwgMHg5RSwgMHgwMSwKKwkgMHg2MiwgMHhGRiwgMHhDNCwgMHhFMiwgMHg0MSwgMHhGRiwgMHgwQSwgMHhFMSwgMHg5OSwgMHgwMSwgMHhDOCwgMHg3NCwgMHhDRCwgMHhFMiwgMHgyOSwgMHg0NCwKKwkgMHgwOCwgMHhCQywgMHg0MCwgMHg0OSwgMHgwNSwgMHhFMSwgMHgzMSwgMHg2MCwgMHgxQSwgMHg2MywgMHhBMywgMHhEMywgMHhGMiwgMHhGMywgMHgwNiwgMHgxOCwKKwkgMHgyOCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwNSwgMHgwMCwgMHgyOCwgMHg0MCwgMHg0OCwgMHgzNiwgMHgwMiwgMHgwMCwgMHgwMiwgMHhCQywgMHhGMiwgMHhGQiwKKwkgMHgzRiwgMHg0MCwgMHgwMSwgMHgyQiwgMHhGRiwgMHhGRiwgMHhBMSwgMHhGRiwgMHg2NywgMHg0QywgMHgwNiwgMHg2MSwgMHhDRCwgMHg4MSwgMHgwNCwgMHgyNSwKKwkgMHgzMCwgMHgwMCwgMHg4NywgMHg0QywgMHhGQiwgMHgwMiwgMHgyOCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwMiwgMHgwMCwgMHgxNSwgMHg2MCwgMHg2RiwgMHg2QiwKKwkgMHhGMywgMHg2MCwgMHhBMCwgMHg2NCwgMHgwNCwgMHgyNSwgMHgyNSwgMHgwMCwgMHg4MCwgMHg0QywgMHgzMCwgMHg2NCwgMHgzQSwgMHhEQiwgMHg0NCwgMHhGRiwKKwkgMHgwNCwgMHgyNSwgMHgxRiwgMHgwMCwgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyNSwgMHg0NCwgMHgzNywgMHgzNiwgMHhCNCwgMHg4NCwgMHg2RSwgMHgzNiwKKwkgMHhCNCwgMHg4NCwgMHg4MCwgMHg0RSwgMHgyNCwgMHg0MSwgMHgwNCwgMHgyNSwgMHgxNCwgMHgwMCwgMHg2MSwgMHg0QywgMHg2NCwgMHhBMSwgMHg2MSwgMHg1NCwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwNCwgMHgyNSwgMHgwRCwgMHgwMCwgMHg2NywgMHg0RSwgMHgwNywgMHg2NCwgMHgxQywgMHhGQiwgMHgwMCwgMHhFMSwKKwkgMHgwMiwgMHg2MCwgMHgwMSwgMHhFMSwgMHg1MywgMHgwMSwgMHgzMywgMHhGMywgMHhGRCwgMHgxMSwgMHhGQywgMHgxOCwgMHg0MCwgMHg2NCwgMHgzQSwgMHhEQiwKKwkgMHgwQSwgMHgwMCwgMHhDNCwgMHhFMiwgMHgyNywgMHg0NCwgMHgyMCwgMHgyQSwgMHgwNCwgMHgwMCwgMHg0MiwgMHg2NCwgMHgzQSwgMHhEQiwgMHg2NywgMHg0QywKKwkgMHgwMiwgMHgwMCwgMHg0MSwgMHg2NCwgMHgzQSwgMHhEQiwgMHg2MiwgMHhGRiwgMHgwOCwgMHhFMSwgMHhFMiwgMHhGRSwgMHg3MiwgMHg1MiwgMHg1QywgMHg0OSwKKwkgMHgzMiwgMHg3QiwgMHg0RCwgMHhFMiwgMHgzQiwgMHgwMSwgMHgwOCwgMHhFMSwgMHgzOSwgMHgwMSwgMHhBMSwgMHhGRiwgMHg5OCwgMHhGRiwgMHg4MCwgMHgzRSwKKwkgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwMiwgMHgwMiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MiwgMHhGRiwgMHg4OCwgMHhGRiwKKwkgMHg0OCwgMHhFMiwgMHgwMSwgMHg3MCwgMHhDRSwgMHhGMSwgMHgwMCwgMHg2QiwgMHg4OSwgMHhGRiwgMHg2NCwgMHg1NCwgMHg4OCwgMHhGRiwgMHg5RiwgMHhGRSwKKwkgMHgwMiwgMHgwNSwgMHg2NCwgMHg0NCwgMHg2MCwgMHg1NCwgMHhDRCwgMHhFMiwgMHhDMiwgMHg2NCwgMHgzQSwgMHhEQiwgMHhCQywgMHhGRiwgMHhCNSwgMHhGRiwKKwkgMHgxRCwgMHhGRiwgMHgyNiwgMHg0NCwgMHgwMiwgMHhCNCwgMHg0MCwgMHg0NiwgMHgzQywgMHg0NCwgMHgwMCwgMHhCQywgMHhGRiwgMHhGRiwgMHgwNiwgMHgwMywKKwkgMHgyNywgMHg0MCwgMHgyNiwgMHgyMiwgMHgwMywgMHgwMCwgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHgyNywgMHg0NCwgMHgyMCwgMHgyQSwKKwkgMHgwNCwgMHgwMCwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhCMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHg1QywgMHg0RCwgMHgyNywgMHg0NCwgMHgxOCwgMHhCNCwKKwkgMHg0MCwgMHg0NywgMHgwMCwgMHhFMSwgMHg2QywgMHg0MCwgMHg0NCwgMHhFMiwgMHhDNCwgMHhFMiwgMHg0NywgMHhGRiwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwKKwkgMHgzMiwgMHhGMSwgMHgwOCwgMHgyOSwgMHgwOSwgMHgwMCwgMHg2NCwgMHg0MCwgMHgwNywgMHgyMiwgMHgwNiwgMHgwMCwgMHg0MywgMHhGRiwgMHgyNywgMHg0NCwKKwkgMHgxMCwgMHhCQywgMHg0MCwgMHg0NywgMHgwMCwgMHg2NCwgMHgzMiwgMHhGQiwgMHgzMSwgMHg0MSwgMHgzQywgMHg0NCwgMHgwMSwgMHhCMSwgMHgwMCwgMHhCQywKKwkgMHgwQSwgMHgwMiwgMHgwOSwgMHgwMywgMHgzMiwgMHhGMywgMHgwMCwgMHg3QywgMHgwMSwgMHhCNCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMywgMHgzMiwgMHhGOSwKKwkgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwgMHgwMCwgMHg2NCwKKwkgMHgzMywgMHhGQiwgMHgwQywgMHg2MCwgMHgxNiwgMHg2NCwgMHhBMCwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMiwgMHhGMywgMHgwOCwgMHgyOSwKKwkgMHgwQSwgMHgwMCwgMHg2MCwgMHg0MCwgMHgwNywgMHgyMiwgMHgwNywgMHgwMCwgMHhGRSwgMHhCNCwgMHgzMiwgMHhGQiwgMHgyNywgMHg0NCwgMHgxMCwgMHhCQywKKwkgMHhGNywgMHhCNCwgMHg0MCwgMHg0NywgMHg0MywgMHhGRiwgMHgwMCwgMHg2NCwgMHgzQSwgMHhEQiwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHgzMSwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwMCwgMHg2NCwgMHgzMywgMHhGQiwgMHgwMSwgMHg2MCwgMHgwQSwgMHhFMSwgMHhFNSwgMHhGRSwgMHgxRCwgMHgwNSwKKwkgMHgyNywgMHg0NCwgMHgxMCwgMHgyNiwgMHgxRCwgMHgwMCwgMHg5RiwgMHhGRSwgMHgwMiwgMHgwNCwgMHgwMiwgMHhFMSwgMHgxMCwgMHgwMCwgMHgzRSwgMHhFMSwKKwkgMHgzMSwgMHg0NCwgMHgwMSwgMHgyQSwgMHgwQywgMHgwMCwgMHgwRSwgMHgwQSwgMHgyOCwgMHg0NCwgMHgwNCwgMHgyNywgMHgwNywgMHgwMCwgMHhENCwgMHgzNiwKKwkgMHgwNSwgMHgwMCwgMHhDNCwgMHgzNiwgMHgwMywgMHgwMCwgMHhBRSwgMHg0RiwgMHhGNywgMHhCNCwgMHhBMCwgMHg1RSwgMHhCRiwgMHhFMSwgMHhBMSwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwgMHhBQiwgMHg2MCwgMHgyQywgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHg2MCwgMHhFQywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyNywgMHg0NCwgMHgwOCwgMHgyNiwgMHhGRiwgMHhGRiwgMHhCQSwgMHg2MCwgMHg3MCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0OCwgMHhGMywgMHgzMiwgMHhGMSwKKwkgMHgwMCwgMHg2MywgMHg2NCwgMHg0MCwgMHgwMywgMHgyMiwgMHg2NiwgMHgwMCwgMHgzMSwgMHg0MCwgMHgwOCwgMHgyNiwgMHhGNCwgMHgwMSwgMHhDRCwgMHhFMiwKKwkgMHg4NCwgMHhFMSwgMHg3MCwgMHg0MSwgMHhBRCwgMHg4MCwgMHg3MSwgMHg0MCwgMHg4MCwgMHgyNywgMHhFRCwgMHgxMiwgMHgwMywgMHgwMywgMHhCQSwgMHg2MCwKKwkgMHhFNywgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDNCwgMHhFMiwgMHgzMiwgMHhGRCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwKKwkgMHhERiwgMHgwMSwgMHgwMCwgMHg2MywgMHgzMiwgMHhGRCwgMHg2QywgMHg0MCwgMHgzQywgMHg0NiwgMHgzRSwgMHhGMiwgMHgyQSwgMHhGMCwgMHgyNywgMHg0MSwKKwkgMHg0NCwgMHg0OCwgMHgyMCwgMHhCOSwgMHgwMSwgMHhCNCwgMHhGNywgMHhCMSwgMHgwQSwgMHgwMywgMHg2NCwgMHg0MCwgMHgwOCwgMHgyNywgMHgwNywgMHgwMCwKKwkgMHgwRiwgMHg2MCwgMHg5MiwgMHg2MywgMHgwMCwgMHg2NCwgMHg0NSwgMHhGQiwgMHg0NiwgMHhGQiwgMHhCRCwgMHhEQiwgMHhBMywgMHhEQiwgMHhDQiwgMHgwQSwKKwkgMHgzMSwgMHg2MCwgMHgwRSwgMHg3QywgMHhBNCwgMHhEMywgMHhGRiwgMHhGRiwgMHgxNywgMHgxOCwgMHgyOCwgMHg0MCwgMHhENCwgMHgzNiwgMHgxNCwgMHgwMCwKKwkgMHhBQywgMHg0QywgMHg4MCwgMHgyQSwgMHgxMSwgMHgwMCwgMHgzMSwgMHg2MCwgMHgxNCwgMHg3QywgMHhBNCwgMHhEMywgMHhGRiwgMHhGRiwgMHgwQywgMHgxOCwKKwkgMHgzMSwgMHg2MCwgMHgxNiwgMHg3QywgMHhBNCwgMHhEMywgMHgzMSwgMHg2MCwgMHgxMCwgMHg3QywgMHhBNCwgMHhEMywgMHg2MCwgMHg0NSwgMHhENCwgMHg4MCwKKwkgMHhEQywgMHg4NCwgMHgwMiwgMHgwMywgMHhBNCwgMHhEQiwgMHhBRiwgMHgwMSwgMHgzMSwgMHg2MCwgMHgxMCwgMHg3QywgMHgwMCwgMHg2NCwgMHhBNCwgMHhEQiwKKwkgMHg0MSwgMHg0NywgMHgzRiwgMHg0MCwgMHgwMSwgMHgyQiwgMHgwRCwgMHgwMCwgMHhGNiwgMHhGRSwgMHg2NywgMHg0QywgMHgwNSwgMHg2MCwgMHg2OSwgMHg2QiwKKwkgMHgzMSwgMHg2MCwgMHgwRSwgMHg3QywgMHhBNCwgMHhEMywgMHhGRiwgMHhGRiwgMHgwNCwgMHgxOCwgMHhBRSwgMHg0RiwgMHgwOCwgMHhCQywgMHgwMCwgMHg3RiwKKwkgMHhBMCwgMHg1RSwgMHgwMiwgMHhFMSwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHhGMCwgMHhGRSwgMHg4NCwgMHhGRiwgMHhCQiwgMHg2MCwgMHgxOCwgMHg2NCwKKwkgMHg0MCwgMHg0MiwgMHg4MiwgMHhGRiwgMHhFNSwgMHhGRSwgMHgwMywgMHgwNCwgMHhBOCwgMHg2MCwgMHgyNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFNCwgMHhGRSwKKwkgMHgwQSwgMHgwNCwgMHgxRCwgMHhGRiwgMHgwMCwgMHhFQiwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwKKwkgMHgwMCwgMHhFQSwgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQSwgMHg0MywgMHhGRiwgMHhFNiwgMHhGRSwgMHgwMywgMHgwNSwgMHhBMywgMHg2MCwgMHg0QiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgzQywgMHg0NCwgMHg2MCwgMHg0NiwgMHgwRiwgMHhGMCwgMHg0MCwgMHg0MiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwKKwkgMHhBNiwgMHg2MCwgMHhCMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQiwgMHg2NCwgMHgzQSwgMHhEQiwgMHgxQywgMHg0MiwgMHgyMiwgMHg0NiwgMHgxMywgMHhGMiwKKwkgMHhGRiwgMHg2NSwgMHg2MCwgMHg0NywgMHgyQSwgMHhGMiwgMHg0MCwgMHg0NSwgMHg0MCwgMHg0OCwgMHgwNCwgMHgyQiwgMHgxNywgMHgwMCwgMHgxNiwgMHhGMiwKKwkgMHgxRCwgMHhGMiwgMHg0MCwgMHg0MywgMHgwRiwgMHhGMiwgMHg0MCwgMHg0NCwgMHgyNSwgMHg1RSwgMHgzRiwgMHg0MCwgMHgwMSwgMHgyNywgMHg0MCwgMHg0NSwKKwkgMHgwRiwgMHg2NCwgMHgxNCwgMHhGMCwgMHgzNSwgMHhGMiwgMHhBMCwgMHg4MiwgMHgwRiwgMHhCNCwgMHhDQSwgMHg4NSwgMHhENCwgMHg4MCwgMHgxMCwgMHhGMiwKKwkgMHgwMSwgMHgwMiwgMHgyQiwgMHhGQSwgMHgyNywgMHg0NCwgMHg0MCwgMHhCQywgMHg0MCwgMHg0NywgMHgxMywgMHgwMCwgMHgxNywgMHhGMiwgMHgyQywgMHhGMCwKKwkgMHg0MCwgMHg0MywgMHgxQiwgMHhGMiwgMHgxRCwgMHhGQSwgMHg0MCwgMHg0NCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMiwgMHgwMCwgMHhBQiwgMHhGQywKKwkgMHgwNSwgMHgwMCwgMHgyOCwgMHg0MCwgMHhBNCwgMHgzNiwgMHgwMiwgMHgwMCwgMHgxMSwgMHhGMiwgMHgyQiwgMHhGQSwgMHgyNywgMHg0NCwgMHhCRiwgMHhCNCwKKwkgMHg0MCwgMHg0NywgMHgyOCwgMHg0MCwgMHg0MCwgMHgyQiwgMHhGRiwgMHhGRiwgMHhBQiwgMHg2MCwgMHg0QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMiwgMHg0NiwKKwkgMHgyQywgMHhGMCwgMHgyNywgMHg0NCwgMHhERiwgMHhCNCwgMHg0MCwgMHg0NywgMHhCNSwgMHhGRiwgMHhCQywgMHhGRiwgMHg0NywgMHhGRiwgMHhCNywgMHhGRiwKKwkgMHhCNCwgMHhGRiwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwOSwgMHgwMCwKKwkgMHgyOCwgMHg0NCwgMHgwNCwgMHgyNywgMHgwNSwgMHgwMCwgMHhENCwgMHgzQSwgMHgwMywgMHgwMCwgMHhBRSwgMHg0RiwgMHhGNywgMHhCNCwgMHhBMCwgMHg1RSwKKwkgMHgxQiwgMHgwMCwgMHgyQSwgMHhGMCwgMHgwMSwgMHg2NSwgMHg2NCwgMHg0MCwgMHhBNCwgMHgzQSwgMHgwNCwgMHg2NSwgMHgyNywgMHg0NCwgMHgzNCwgMHg4NywKKwkgMHgzNiwgMHhGMywgMHhCNCwgMHhGRiwgMHg2MCwgMHg1QiwgMHg0RCwgMHhFMiwgMHgwNCwgMHg2NCwgMHgzQSwgMHhEQiwgMHgwMSwgMHg2MCwgMHgwQSwgMHhFMSwKKwkgMHgyOCwgMHg0NCwgMHgwNCwgMHgyNywgMHgwNSwgMHgwMCwgMHhENCwgMHgzQSwgMHgwMywgMHgwMCwgMHhBRSwgMHg0RiwgMHhGNywgMHhCNCwgMHhBMCwgMHg1RSwKKwkgMHgyQiwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwgMHgwNiwgMHg2NCwgMHgzQSwgMHhEQiwgMHgyMiwgMHg0NiwgMHgwMSwgMHg2NCwKKwkgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhCQSwgMHg2MCwgMHhGMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCNSwgMHhGRiwgMHhBMSwgMHhGRiwgMHg2QywgMHg0MCwKKwkgMHgzRiwgMHg0MCwgMHgwMSwgMHgyQiwgMHgwMywgMHgwMCwgMHg2NywgMHg0QywgMHgwNSwgMHg2MCwgMHg2OSwgMHg2QiwgMHgwMiwgMHhFMSwgMHgwMSwgMHg2MCwKKwkgMHgwOCwgMHhFMSwgMHhDNCwgMHhFMiwgMHgwOCwgMHg2NCwgMHgzQSwgMHhEQiwgMHhGMCwgMHhGRSwgMHgyNSwgMHg0NiwgMHgwMSwgMHhGMiwgMHg2MSwgMHg0NSwKKwkgMHhENCwgMHg5RSwgMHgyMSwgMHg0NiwgMHgxNiwgMHhGQSwgMHgyQSwgMHg0NCwgMHg3MiwgMHg0NSwgMHgyNCwgMHhGQSwgMHhCNSwgMHhGMywgMHgwNiwgMHgwNCwKKwkgMHhFNCwgMHhFMiwgMHhEQywgMHg5QywgMHgyOSwgMHg0MCwgMHgwMSwgMHgyNiwgMHg2NCwgMHg0NCwgMHhCNSwgMHhGOSwgMHgyNSwgMHhGQSwgMHhCNiwgMHhGMywKKwkgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHhCNiwgMHhGQiwgMHgyOCwgMHhGQSwgMHhCNywgMHhGMywgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHhCNywgMHhGQiwKKwkgMHgyOSwgMHhGQSwgMHgyRCwgMHg0NCwgMHgwNCwgMHgyQSwgMHgwNiwgMHgwMCwgMHgyOCwgMHg0MCwgMHhBNCwgMHgzNiwgMHgwMywgMHgwMCwgMHhBNSwgMHg2MCwKKwkgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0MywgMHg4NCwgMHhCQiwgMHhGQywgMHhCMywgMHgyMSwgMHg0NiwgMHgwMSwgMHg1RCwgMHgwRiwgMHhGQywKKwkgMHg1QywgMHg0NiwgMHgyNSwgMHg0NCwgMHgwNiwgMHhGQSwgMHgwNSwgMHhGRiwgMHgyNywgMHg0NCwgMHgwMSwgMHgyQSwgMHgxMywgMHgwMCwgMHg1MCwgMHhGRSwKKwkgMHgyOCwgMHg0MCwgMHgwOCwgMHgzQSwgMHgxMiwgMHgwMCwgMHgyRiwgMHhGMiwgMHgzMCwgMHhGMCwgMHg2MCwgMHg0MywgMHgzMSwgMHhGMiwgMHgyMiwgMHg0NiwKKwkgMHg2NCwgMHg0MSwgMHgyQywgMHhGMCwgMHgyRCwgMHhGMCwgMHhEMywgMHg4MCwgMHgyRSwgMHhGMCwgMHhEMSwgMHg4MCwgMHhEMCwgMHg4MCwgMHgyNywgMHg0NCwKKwkgMHgwOSwgMHgwQywgMHgwMywgMHgwMCwgMHgyNywgMHg0NCwgMHgwNiwgMHgyMiwgMHgwNSwgMHgwMCwgMHhCOCwgMHhCNCwgMHg0MCwgMHg0NywgMHgwMiwgMHg2NCwKKwkgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhENCwgMHg2NCwgMHg0MCwgMHg0OCwgMHgwRCwgMHg2NCwgMHgzQSwgMHhEQiwgMHgzMSwgMHg2MCwgMHgxMiwgMHg3QywKKwkgMHg3QywgMHg0NCwgMHhBNCwgMHhEQiwgMHgyMSwgMHg0NiwgMHgxQywgMHhGMiwgMHg3QywgMHhGMSwgMHhGRiwgMHhCNCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgwNiwgMHg2NCwgMHg0NCwgMHg0MCwgMHg0NSwgMHgwQSwgMHgzNiwgMHg3MCwgMHg2NCwgMHgxNCwgMHgzNiwgMHgzOCwgMHg2NCwgMHgzNywgMHgzQSwKKwkgMHgwMywgMHgwMCwgMHgwNCwgMHg3RiwgMHg0MCwgMHg0NSwgMHgxNSwgMHg2NCwgMHg2RSwgMHgzQSwgMHgwMywgMHgwMCwgMHg4NCwgMHg3RiwgMHg0MCwgMHg0NSwKKwkgMHgwQiwgMHg2NCwgMHg0MCwgMHg0NCwgMHgwMCwgMHg2MywgMHgyOCwgMHg0NCwgMHhBNCwgMHgzNiwgMHgwQiwgMHgwMCwgMHgwNCwgMHgyQiwgMHgwOSwgMHgwMCwKKwkgMHgzMCwgMHhGMywgMHgyNCwgMHg0NSwgMHhENCwgMHg4NCwgMHhDQSwgMHg2NSwgMHhENCwgMHg4MywgMHgzMSwgMHg2MCwgMHgxMiwgMHg3QywgMHgwMSwgMHg2NCwKKwkgMHhBNCwgMHhEQiwgMHhENCwgMHg2NCwgMHgxQSwgMHgwMCwgMHgwRiwgMHg2NCwgMHgzQSwgMHhEQiwgMHgyMSwgMHg0NiwgMHg3MCwgMHg2MywgMHgxQywgMHhGMiwKKwkgMHhDQSwgMHg2NSwgMHg0MCwgMHg0NSwgMHgwQSwgMHgzNiwgMHg3MCwgMHg2NCwgMHgxNCwgMHgzNiwgMHgzOCwgMHg2NCwgMHgzNywgMHgzQSwgMHgwMywgMHgwMCwKKwkgMHgwNCwgMHg3RiwgMHg0MCwgMHg0NSwgMHgxNSwgMHg2NCwgMHg2RSwgMHgzQSwgMHgwMywgMHgwMCwgMHg4NCwgMHg3RiwgMHg0MCwgMHg0NSwgMHgwQiwgMHg2NCwKKwkgMHg0MCwgMHg0NCwgMHgyQiwgMHhGMiwgMHhDNCwgMHg4NSwgMHhENCwgMHg4MywgMHhDNCwgMHg2NCwgMHg0MCwgMHg0OCwgMHgyRiwgMHhGMCwgMHhCMCwgMHhGMCwKKwkgMHhCMSwgMHhGMiwgMHgwMCwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MCwgMHg0RSwgMHg4MywgMHg0QywgMHg5QSwgMHhGRiwgMHg4NCwgMHg0QywKKwkgMHg4NSwgMHg0QywgMHg4MSwgMHg0QywgMHhBMSwgMHhGRiwgMHg5OCwgMHhGRiwgMHg4NywgMHg0RiwgMHg4NywgMHg0QywgMHg4NywgMHg0RiwgMHg4NywgMHg0RCwKKwkgMHg4NywgMHg0QywgMHgwMSwgMHgwOCwgMHgwMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg4NywgMHg0QywKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2QSwgMHg0NCwgMHhCQywgMHhGRiwgMHhDNCwgMHhFMiwgMHgwQywgMHg3NCwgMHgwNCwgMHhFMSwgMHhBMSwgMHhGRiwKKwkgMHgzNSwgMHhGMywgMHhDNCwgMHhFMiwgMHg2MCwgMHg1NCwgMHg4OSwgMHhGRiwgMHgxMywgMHg3NCwgMHg4OCwgMHhGRiwgMHhCNSwgMHhGRiwgMHg0NywgMHhGRiwKKwkgMHgyOSwgMHg0NCwgMHhGNywgMHhCNCwgMHg0MCwgMHg0OSwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwgMHgwOCwgMHg2MCwKKwkgMHgwMCwgMHg2QiwgMHgyOCwgMHg0MCwgMHhDNCwgMHgzNiwgMHgwOCwgMHgwMCwgMHgzMSwgMHg2MCwgMHgxMiwgMHg3QywgMHhBNCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgwMywgMHgxQiwgMHhBRSwgMHg0RiwgMHhGNywgMHhCNCwgMHhBMCwgMHg1RSwgMHgyNywgMHg0NCwgMHgwMSwgMHgyQSwgMHgwNSwgMHgwMCwgMHhGRSwgMHhCNCwKKwkgMHg0MCwgMHg0NywgMHhBNCwgMHg2MCwgMHg3QywgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHg2MCwgMHgzRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyOCwgMHg0MCwKKwkgMHhCNCwgMHgzQSwgMHgwOSwgMHgwMCwgMHgyNywgMHg0NCwgMHgwNywgMHgyMiwgMHgwNSwgMHgwMCwgMHhGOCwgMHhCNCwgMHg0MCwgMHg0NywgMHgwMiwgMHg2NCwKKwkgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHg5MCwgMHgwMSwgMHgyOCwgMHg0NCwgMHhENCwgMHgzNiwgMHgwMywgMHgwMCwgMHhBNiwgMHg2MCwgMHg5OCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg0OCwgMHhFMiwgMHgyNywgMHg0NCwgMHhGQiwgMHhCNCwgMHg0MCwgMHg0NywgMHgyRCwgMHg2MCwgMHg1QSwgMHg2MywgMHhBMywgMHhEMywKKwkgMHhCMCwgMHg2MCwgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzNCwgMHhGQiwgMHgxQywgMHg0MiwgMHgyMiwgMHg0NiwgMHgyQSwgMHhGMCwKKwkgMHhGNywgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyQiwgMHhDQywgMHgwMCwgMHgyMiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgyMiwgMHgyNiwgMHg0MiwgMHgwMCwgMHgwMSwgMHgyNiwgMHgwMywgMHgwMCwgMHgwNCwgMHgyNiwgMHgwNywgMHgwMCwKKwkgMHhDMiwgMHgwMCwgMHgwNCwgMHgyQiwgMHhDMCwgMHgwMCwgMHhBOSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NiwgMHgwMSwgMHgwMCwgMHgwNywgMHhGNCwKKwkgMHg0NywgMHhGMiwgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHg0NywgMHhGQSwgMHgwRCwgMHg2MCwgMHgzRSwgMHg2MiwgMHg4MCwgMHhGRiwgMHhCRSwgMHg2MCwKKwkgMHg3OCwgMHg0NCwgMHgwMiwgMHhBNCwgMHhBMiwgMHhEQiwgMHhERSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4MiwgMHhGRiwgMHhBOSwgMHhGMywgMHg2NiwgMHg1QywKKwkgMHhEMCwgMHg4MCwgMHgwMCwgMHg3QywgMHgwNywgMHgwMywgMHg2NiwgMHg0MywgMHgyMiwgMHg0NiwgMHgyMiwgMHhGMiwgMHg2MywgMHg0NiwgMHg2MCwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgwMSwgMHgwMCwgMHgzQywgMHhGMSwgMHg0NywgMHhGMCwgMHg2NCwgMHg0MSwgMHg2NCwgMHg0NywgMHhGRiwgMHhCNCwgMHg2MCwgMHg1RiwKKwkgMHgyMCwgMHhCQywgMHg4MCwgMHgyNiwgMHg4MCwgMHhBQywgMHg2MCwgMHg0NywgMHgyMiwgMHg0NiwgMHgzQSwgMHhGQSwgMHg2NCwgMHg0NCwgMHgyMCwgMHg3RiwKKwkgMHgzNCwgMHg5NCwgMHgzQiwgMHhGQSwgMHgwOCwgMHg2MCwgMHgwMCwgMHhFQSwgMHgwRiwgMHg2NCwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg4MCwgMHg2MCwKKwkgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQSwgMHg4NSwgMHgwMCwgMHgyQSwgMHhGMiwgMHgwMCwgMHg2MCwKKwkgMHg3QywgMHg2MiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgyNywgMHgwMCwgMHhBMiwgMHhEMywgMHgwMCwgMHg2MSwgMHg2MCwgMHhGRSwgMHhBMCwgMHhEMywKKwkgMHhERSwgMHg4MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHg2NCwgMHg1RiwgMHhEQywgMHg4NCwgMHhGMSwgMHg4MSwgMHhDMCwgMHgyQiwKKwkgMHgwNCwgMHgwMCwgMHg4MCwgMHgyQSwgMHgwMiwgMHgwMCwgMHg3RiwgMHhBNCwgMHhEQywgMHg4NCwgMHhGRiwgMHgzQiwgMHgwMywgMHgwMCwgMHg2MCwgMHg0NywKKwkgMHhEQywgMHg4NywgMHgwMSwgMHg2MSwgMHhDMCwgMHg4MCwgMHgwMCwgMHgzNiwgMHhEQywgMHg4NCwgMHg0RSwgMHhEQiwgMHg2MCwgMHhGRSwgMHhEQSwgMHg4MiwKKwkgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwgMHhDMSwgMHg4NCwgMHhGMCwgMHgyMiwgMHgxMCwgMHhBNCwgMHhGMCwgMHgyQSwgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHgwMCwgMHg2MCwgMHg3QywgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhBMCwgMHhEMywKKwkgMHg1QSwgMHhEMSwgMHgzQSwgMHhGQSwgMHgzQiwgMHhGOCwgMHg3NCwgMHg2MiwgMHhBMiwgMHhEMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NCwgMHhFMCwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFMSwgMHg3RiwgMHg1QSwgMHhEMCwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFMiwgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHgwMCwgMHg2MCwgMHg4MCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhBMCwgMHhEMSwgMHg1QSwgMHhEMSwgMHg2NCwgMHg0NSwgMHg2NCwgMHg0NCwKKwkgMHhFMywgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFNCwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFNSwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFNiwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFNywgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHg2NSwgMHg0MCwgMHgwRCwgMHgzQSwgMHgxQywgMHgwMCwgMHg2NCwgMHg0NywgMHhFOCwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwKKwkgMHhFOSwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFQSwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFQiwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFQywgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFRCwgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHg2NCwgMHg0NywgMHhFRSwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFRiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgwOCwgMHg2MCwKKwkgMHgwMCwgMHhFQSwgMHg2NSwgMHg0NCwgMHgwMiwgMHhBNCwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwKKwkgMHgwMCwgMHhFQSwgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQSwgMHgwQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg3RiwgMHhCNCwgMHgwQywgMHhGMCwgMHgwNCwgMHgwMiwKKwkgMHg2NCwgMHg0NiwgMHgwMCwgMHhGMCwgMHgwNCwgMHg2NCwgMHgyMiwgMHg0NiwgMHgwMywgMHhGQSwgMHg2MCwgMHg0MSwgMHg2NCwgMHg0NiwgMHgwMSwgMHhGMiwKKwkgMHhGQywgMHhBMSwgMHg2MSwgMHg0NSwgMHhENCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMiwgMHgwMCwgMHhGMCwgMHgwNCwgMHg2MywgMHg2NCwgMHg0NiwKKwkgMHgwMSwgMHhGMiwgMHgyMiwgMHg0NiwgMHgxQSwgMHhGQSwgMHgwMywgMHhGQywgMHgwMiwgMHgwMCwgMHgyMiwgMHg0NiwgMHgxQSwgMHhGQSwgMHgzNSwgMHhGMiwKKwkgMHgwNCwgMHhGOCwgMHhEQywgMHg4NCwgMHgzNSwgMHhGQSwgMHgxNCwgMHhGMiwgMHgwRiwgMHhCNSwgMHgwRiwgMHhCNCwgMHhDQywgMHg4NCwgMHg5NCwgMHg4MCwKKwkgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyQSwgMHhGMiwgMHgwMSwgMHgwMiwgMHg5NCwgMHg4NCwgMHgyQSwgMHhGQSwgMHg5NSwgMHhGQywgMHgwNiwgMHgwMCwKKwkgMHhDNCwgMHgzQSwgMHgwNywgMHgwMCwgMHgyNywgMHg0NCwgMHhGRCwgMHhCNCwgMHg0MCwgMHg0NywgMHg0OCwgMHhFMiwgMHhBNCwgMHg2MCwgMHgwQiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyOCwgMHg0NCwgMHgwNCwgMHgyNiwgMHgwNSwgMHgwMCwgMHg2OCwgMHgzQSwgMHgwMywgMHgwMCwgMHgzMiwgMHg0NCwgMHgwMCwgMHgyNywKKwkgMHgwMywgMHgwMCwgMHhBMywgMHg2MCwgMHg0QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQSwgMHg2NCwgMHgzQSwgMHhEQiwgMHhBMywgMHg2MCwgMHg0QiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwRSwgMHg2NCwgMHgzQSwgMHhEQiwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgzQywgMHg0NiwgMHgyQSwgMHhGMiwgMHgxMywgMHhGMCwKKwkgMHhBNCwgMHg4NCwgMHhCNCwgMHhCQywgMHg0MCwgMHg0OCwgMHg3QywgMHhGMSwgMHg2NCwgMHg0NywgMHhGRiwgMHhCNCwgMHg2MCwgMHg0NSwgMHhEMCwgMHg4MCwKKwkgMHg3MCwgMHg2MSwgMHgwMSwgMHgwNiwgMHg2NCwgMHg0NCwgMHgwQSwgMHgzNiwgMHg3MCwgMHg2NCwgMHgxNCwgMHgzNiwgMHgzOCwgMHg2NCwgMHgzNywgMHgzNiwKKwkgMHgxNSwgMHg2NCwgMHg2RSwgMHgzNiwgMHgwQiwgMHg2NCwgMHg0MCwgMHg0RSwgMHhBMCwgMHg2MywgMHgwQSwgMHg2NCwgMHg2NSwgMHg0MCwgMHgwQSwgMHgzNiwKKwkgMHgwMywgMHgwMCwgMHgzOCwgMHg2MSwgMHgxNCwgMHg2NCwgMHhFQiwgMHg4MywgMHg0MCwgMHg0NSwgMHg0MywgMHg0NCwgMHgwMiwgMHg2MCwgMHg1RSwgMHg2NSwKKwkgMHgyQSwgMHhGMiwgMHgyQiwgMHhGMiwgMHg2MCwgMHg0MCwgMHgwNCwgMHgyQiwgMHgwNCwgMHgwMCwgMHgyRSwgMHg0NSwgMHhENCwgMHg4NSwgMHhDNSwgMHg4NCwKKwkgMHgwNSwgMHgwMCwgMHgxQiwgMHhGMCwgMHhDNSwgMHg4NCwgMHhDMCwgMHg4NCwgMHgyRSwgMHg0NSwgMHhDNCwgMHg4NCwgMHg2MCwgMHg0MywgMHgyOCwgMHg0NCwKKwkgMHgwMCwgMHhFMSwgMHhBMSwgMHhGRiwgMHg4MCwgMHg0RSwgMHg4MywgMHg0QywgMHg5QSwgMHhGRiwgMHg1NiwgMHg2MiwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwKKwkgMHg3QSwgMHhENCwgMHg1QywgMHg2MiwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHhBMSwgMHhGRiwgMHg5OCwgMHhGRiwgMHg4NywgMHg0RiwKKwkgMHg4NywgMHg0QywgMHg4NywgMHg0RiwgMHg4NywgMHg0RCwgMHg4NywgMHg0QywgMHgwMSwgMHgwOCwgMHgwMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHg4NywgMHg0QywKKwkgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2QSwgMHg0NCwgMHhCQywgMHhGRiwgMHhCNSwgMHhGRiwKKwkgMHg0NywgMHhGRiwgMHgyNywgMHg0NCwgMHgwMiwgMHhCQywgMHg0MCwgMHg0NywgMHgzNiwgMHhGMywgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHg0OCwgMHg2MCwKKwkgMHgyRCwgMHg3RCwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwgMHg2MCwgMHg1QiwgMHg0RCwgMHhFMiwgMHhBNCwgMHg2MCwgMHg2QywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyMSwgMHg0NiwgMHhCNSwgMHhGRiwgMHhCQywgMHhGRiwgMHg0NywgMHhGRiwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwKKwkgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwgMHgyOCwgMHg0NCwgMHgwNCwgMHgyNywgMHgwOSwgMHgwMCwgMHhENCwgMHgzNiwgMHgwNCwgMHgwMCwgMHgwQywgMHgyMiwKKwkgMHgwMiwgMHgwMCwgMHgwQywgMHgzQSwgMHgwMywgMHgwMCwgMHhBRSwgMHg0RiwgMHhGNywgMHhCNCwgMHhBMCwgMHg1RSwgMHgyNiwgMHg0MywgMHgyNSwgMHg0NCwKKwkgMHgwNiwgMHhGQSwgMHgyQSwgMHg0NCwgMHg3MiwgMHg0NSwgMHgyNCwgMHhGQSwgMHhCNSwgMHhGMywgMHgwNiwgMHgwNCwgMHhFNCwgMHhFMiwgMHhEQywgMHg5QywKKwkgMHgyOSwgMHg0MCwgMHgwMSwgMHgyNiwgMHg2NCwgMHg0NCwgMHhCNSwgMHhGOSwgMHgyNSwgMHhGQSwgMHhCNiwgMHhGMywgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwKKwkgMHhCNiwgMHhGQiwgMHgyOCwgMHhGQSwgMHhCNywgMHhGMywgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHhCNywgMHhGQiwgMHgyOSwgMHhGQSwgMHgyRCwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgwRSwgMHgwMCwgMHgxRCwgMHhGRiwgMHgyNiwgMHg0NCwgMHgwMiwgMHhCQywgMHg0MCwgMHg0NiwgMHgyNywgMHg0NCwgMHgwNywgMHgyMiwKKwkgMHgwNSwgMHgwMCwgMHhGOCwgMHhCNCwgMHg0MCwgMHg0NywgMHgwNiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHgzMCwgMHhGMSwgMHg3NiwgMHgwMCwKKwkgMHhGQywgMHhCMywgMHgzMiwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwNiwgMHgwMCwgMHgwQSwgMHhCQiwgMHgwRiwgMHhGQywgMHhDQiwgMHhGRSwgMHhBMywgMHg2MCwKKwkgMHg0QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyRCwgMHg0NCwgMHgwNCwgMHgyNiwgMHgyOCwgMHgwMCwgMHgwRiwgMHhGQywgMHgwNSwgMHhGRiwgMHhEQywgMHhGMywKKwkgMHgyOCwgMHg0MCwgMHg4MCwgMHgzQSwgMHgyMiwgMHgwMCwgMHg2MCwgMHg0MCwgMHgwMywgMHgzQSwgMHgxRiwgMHgwMCwgMHgzMiwgMHhGMiwgMHg4MSwgMHhGMSwKKwkgMHgzMywgMHhGMiwgMHhEMCwgMHg4MCwgMHg4MiwgMHhGMSwgMHgxOSwgMHgwMiwgMHhEMCwgMHg4MCwgMHgzNCwgMHhGMiwgMHg4MywgMHhGMSwgMHgxNSwgMHgwMiwKKwkgMHhEMCwgMHg4MCwgMHgzQywgMHg0NCwgMHgxMiwgMHgwMiwgMHhBQywgMHg4NiwgMHhCQiwgMHhGRSwgMHgwRiwgMHgwMywgMHgyQSwgMHhGMiwgMHgyMSwgMHg0NiwKKwkgMHg2MCwgMHg0MCwgMHg4MCwgMHgzQSwgMHgwQSwgMHgwMCwgMHgwMSwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHgwMCwgMHg2NCwgMHgzMiwgMHhGQiwKKwkgMHg4NCwgMHhGRiwgMHhCQiwgMHg2MCwgMHgxOCwgMHg2NCwgMHg0MCwgMHg0MiwgMHg4MiwgMHhGRiwgMHgzMCwgMHhGMSwgMHgyNywgMHg0NCwgMHgwNSwgMHgyMiwKKwkgMHgyRCwgMHgwMCwgMHhGQSwgMHhCNCwgMHg0MCwgMHg0NywgMHgyRCwgMHg0NCwgMHgxMCwgMHgyQSwgMHgyNCwgMHgwMCwgMHgyOCwgMHg0MCwgMHhENCwgMHgzQSwKKwkgMHgyMSwgMHgwMCwgMHgzMSwgMHg0MCwgMHgwOCwgMHgyNiwgMHgwMCwgMHg3QywgMHgyQiwgMHg0NCwgMHhEMCwgMHg4MCwgMHg3MCwgMHg0NSwgMHgwMiwgMHgyOCwKKwkgMHg2NCwgMHg0NCwgMHhDNCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgyNCwgMHgwMCwgMHhCNCwgMHg2MCwgMHg1MCwgMHgwOCwgMHgyOCwgMHgwMSwgMHgwMCwKKwkgMHgyMCwgMHgyOSwgMHg2RCwgMHhFMiwgMHgxQywgMHg2MCwgMHg5QSwgMHg2MywgMHgxRCwgMHhGMCwgMHhDMCwgMHg2NCwgMHhDMCwgMHg4NCwgMHhBMywgMHhEMSwKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhDMCwgMHg4NCwgMHhBMywgMHhEQiwgMHhBNCwgMHg2MCwKKwkgMHg3QywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMiwgMHgyQSwgMHgwNSwgMHgwMCwKKwkgMHhGRCwgMHhCNCwgMHg0MCwgMHg0NywgMHgwNiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHgwNSwgMHg2NCwgMHgzQSwgMHhEQiwgMHgyOCwgMHg0NCwKKwkgMHhBNCwgMHgzQSwgMHgwNCwgMHgwMCwgMHgzOSwgMHhGMSwgMHgyNSwgMHg0NCwgMHgwQSwgMHgzNiwgMHgzOCwgMHhGMSwgMHgzMSwgMHg0MCwgMHgwOCwgMHgyNiwKKwkgMHgwMCwgMHg3QywgMHgyQiwgMHg0NCwgMHhEMCwgMHg4MCwgMHg3MCwgMHg0NSwgMHgwMiwgMHgyOCwgMHg2NCwgMHg0NCwgMHhDNCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgyNCwgMHgwMCwgMHhCNCwgMHgyOCwgMHg0MCwgMHhFNCwgMHgzNiwgMHgwMCwgMHhCNCwgMHg2MCwgMHg1MCwgMHgwOCwgMHgyOCwgMHgwMSwgMHgwMCwKKwkgMHgyMCwgMHgyOSwgMHg2RCwgMHhFMiwgMHhBMywgMHg2MCwgMHgzRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMSwgMHg0NiwgMHhCNSwgMHhGRiwgMHhCQywgMHhGRiwKKwkgMHg0NywgMHhGRiwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwgMHhBRSwgMHg0RiwKKwkgMHhGNywgMHhCNCwgMHhBMCwgMHg1RSwgMHgyNywgMHg0NCwgMHgwNywgMHgyMiwgMHgwNSwgMHgwMCwgMHhGOCwgMHhCNCwgMHg0MCwgMHg0NywgMHgwNiwgMHg2NCwKKwkgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhFNywgMHgwMSwgMHgyNywgMHg0NCwgMHgwNSwgMHgyMiwgMHgwOSwgMHgwMCwgMHhCQSwgMHhCNCwgMHg0MCwgMHg0NywKKwkgMHgzQywgMHg0NiwgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhBMywgMHg2MCwgMHg0QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg0NCwKKwkgMHgwMiwgMHgyQSwgMHgwNiwgMHgwMCwgMHhGRCwgMHhCNCwgMHg0MCwgMHg0NywgMHgwNiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhGNCwgMHgwMSwKKwkgMHhGMywgMHgwQSwgMHg3QywgMHg1MCwgMHg2RCwgMHhFMiwgMHhGMCwgMHgwMSwgMHg3MiwgMHg0NSwgMHhEQywgMHg4NCwgMHhCNSwgMHhGQiwgMHgxMSwgMHg2NCwKKwkgMHgzQSwgMHhEQiwgMHhCNiwgMHhGMywgMHgwNiwgMHgwNCwgMHhEQywgMHg4NCwgMHhCNiwgMHhGQiwgMHhCNywgMHhGMywgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwKKwkgMHhCNywgMHhGQiwgMHhBMywgMHg2MCwgMHg1NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MSwgMHgxMiwgMHg2NCwgMHgzQSwgMHhEQiwgMHgxRSwgMHg2MCwKKwkgMHhGRSwgMHg2MywgMHhCRCwgMHhEMywgMHg3MiwgMHg0NSwgMHg0NCwgMHg4QSwgMHgwMiwgMHgyOCwgMHgwMiwgMHgwMCwgMHhFNCwgMHhFMiwgMHhERCwgMHg4MSwKKwkgMHgwMiwgMHgyOCwgMHgwMiwgMHgwMCwgMHhFNCwgMHhFMiwgMHhERCwgMHg4MSwgMHhCRCwgMHhEMywgMHhCNSwgMHhGMSwgMHg2MSwgMHg0NSwgMHhDMCwgMHg4NCwKKwkgMHgwMCwgMHg2MSwgMHgwMiwgMHgyNCwgMHgwMSwgMHhCOSwgMHhDNCwgMHg4NCwgMHg2MCwgMHg1NSwgMHgyQSwgMHg1MiwgMHhCNSwgMHhGQiwgMHgwMiwgMHgyNCwKKwkgMHgwMSwgMHhCOSwgMHhCRCwgMHhEMywgMHhCNiwgMHhGMSwgMHg2MSwgMHg0NSwgMHhDMCwgMHg4NCwgMHgwMCwgMHg2MSwgMHgwMiwgMHgyNCwgMHgwMSwgMHhCOSwKKwkgMHhDNCwgMHg4NCwgMHhCNiwgMHhGQiwgMHgwMiwgMHgyNCwgMHgwMSwgMHhCOSwgMHhCRCwgMHhEMywgMHhCNywgMHhGMSwgMHg2MSwgMHg0NSwgMHhDMCwgMHg4NCwKKwkgMHhDNCwgMHg4NCwgMHhCNywgMHhGQiwgMHhBMywgMHg2MCwgMHhFRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMSwgMHg0MCwgMHgwNCwgMHgwQSwgMHhBRSwgMHg0RiwKKwkgMHhGNywgMHhCNCwgMHhBMCwgMHg1RSwgMHgwOSwgMHgwMCwgMHgzMSwgMHg2MCwgMHgwRSwgMHg3QywgMHhBNCwgMHhEMywgMHhGRiwgMHhGRiwgMHgwNCwgMHgxOCwKKwkgMHhBRSwgMHg0RiwgMHgwOCwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1RSwgMHg5RiwgMHgwMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwgMHgyNSwKKwkgMHgwOSwgMHgwMCwgMHgwNCwgMHgyNSwgMHgwMywgMHgwMCwgMHg0NywgMHhGRiwgMHgzMiwgMHg3NCwgMHg5NiwgMHgwMSwgMHhDNCwgMHhFMiwgMHhBQiwgMHg2MCwKKwkgMHgyQywgMHg3OCwgMHhGRiwgMHhGRiwgMHg0QywgMHg0RSwgMHg0NywgMHhGRiwgMHgzMSwgMHg2MCwgMHgwRSwgMHg3QywgMHhBNCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgxOCwgMHhBRSwgMHg0RiwgMHgwOCwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1RSwgMHgzMiwgMHg3NCwgMHhDRCwgMHhFMiwgMHhBOCwgMHg2MCwKKwkgMHg4QSwgMHg3OCwgMHgwMCwgMHg2MSwgMHgxMCwgMHg2NCwgMHgzQSwgMHhEQiwgMHhBMywgMHg2MCwgMHg0QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHg2MCwKKwkgMHg0QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1QywgMHg0RCwgMHgyNiwgMHg0NCwgMHgwMiwgMHgyNiwgMHgwQywgMHgwMCwgMHgzRSwgMHg0NiwgMHgwOSwgMHhGMiwKKwkgMHgxRSwgMHg0MSwgMHgwMywgMHgxQiwgMHhBQSwgMHg2MCwgMHhEQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0MCwgMHg1RSwgMHhGRCwgMHhGQiwgMHgyMSwgMHg0NCwKKwkgMHgwMiwgMHg2NCwgMHg0MCwgMHg0NiwgMHg0MSwgMHg1RCwgMHgyMSwgMHg0NiwgMHgwMCwgMHhGMiwgMHg0NiwgMHg0NSwgMHg4NywgMHhGQywgMHg0QywgMHhFMiwKKwkgMHgwMSwgMHg2NCwgMHgzMywgMHhGQiwgMHgwMSwgMHg2MCwgMHgwRSwgMHhFMSwgMHgwMywgMHhFMSwgMHgzRiwgMHg0MCwgMHgwMSwgMHgyNywgMHgwMCwgMHgwMCwKKwkgMHgyMSwgMHg2OSwgMHhCNiwgMHhGRiwgMHhBMSwgMHhGRiwgMHg2QywgMHg1RSwgMHhCNiwgMHhGRiwgMHhCNywgMHhGRiwgMHg2MCwgMHg1QywgMHgyMCwgMHg2NCwKKwkgMHgzQSwgMHhEQiwgMHg2OCwgMHg0MywgMHgyNiwgMHhGQywgMHgyMiwgMHg2OSwgMHg2NCwgMHg0NCwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2QywgMHg1RiwKKwkgMHg2MCwgMHg0MywgMHgyNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2OCwgMHg1RiwgMHgyNiwgMHhGQSwgMHgzQSwgMHg2OSwgMHgxRCwgMHhGQywgMHgyRSwgMHg0NCwKKwkgMHgzNiwgMHhGMSwgMHgxQywgMHhGQSwgMHhDMywgMHg5NCwgMHhDRCwgMHhFMiwgMHgyRSwgMHg0NCwgMHgxNCwgMHgzNiwgMHgxMiwgMHgwMCwgMHgwQSwgMHgzNiwKKwkgMHgwRiwgMHgwMCwgMHg2MywgMHg0NSwgMHhFMywgMHg4MywgMHhFMywgMHg4MywgMHhDNywgMHg4MywgMHhFMywgMHg4MywgMHhDNywgMHg4MywgMHhGRiwgMHhGRiwKKwkgMHgzNywgMHgzNiwgMHgwNSwgMHgwMCwgMHg2RSwgMHgzNiwgMHgwNCwgMHgwMCwgMHhBQSwgMHg2MCwgMHhGMywgMHg3OCwgMHhGRiwgMHhGRiwgMHhFQiwgMHg4MywKKwkgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhGRiwgMHhGRiwgMHg4MCwgMHgyNywgMHhDRiwgMHg4MywgMHgxQiwgMHhGQywgMHgwMSwgMHg2NCwKKwkgMHg1MSwgMHhGQiwgMHhBMSwgMHhGRiwgMHgxQywgMHhGMiwgMHgyOSwgMHg0MSwgMHhGOSwgMHg4MSwgMHg1MiwgMHg0QSwgMHg3MSwgMHg4OSwgMHg2OCwgMHg1RiwKKwkgMHgyNywgMHhGQSwgMHg2QywgMHg0MCwgMHgwMywgMHgxNSwgMHhBQiwgMHg2MCwgMHgwNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4OCwgMHg2MCwgMHg4NSwgMHg3MSwKKwkgMHg4RCwgMHhFMiwgMHhCOSwgMHhGMSwgMHhGQywgMHhBMywgMHhEMywgMHg4MCwgMHg0MywgMHg0MywgMHgwMywgMHgwNCwgMHhBQSwgMHg2MCwgMHhGQiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgzMiwgMHg0MCwgMHgwMSwgMHgyQSwgMHg0QywgMHgwMCwgMHg5QSwgMHhGRiwgMHgyMywgMHg0MywgMHgxOCwgMHg2MSwgMHhBMSwgMHhGRiwKKwkgMHg4QywgMHg0NCwgMHhDQiwgMHg4MywgMHgyQSwgMHhGQSwgMHg0MCwgMHg0OCwgMHg0MCwgMHgyNywgMHgwNCwgMHhBMSwgMHg2MCwgMHg0MCwgMHgwMywgMHgyQiwKKwkgMHgwMSwgMHgwMCwgMHgwNiwgMHhBMSwgMHg4OCwgMHhCMCwgMHg4OCwgMHgzNiwgMHhEOSwgMHg4MSwgMHg2MiwgMHg0NSwgMHgyMywgMHg0NCwgMHg1NCwgMHg5NCwKKwkgMHgyOCwgMHg0MCwgMHgwNCwgMHgyNiwgMHgwMCwgMHg2NCwgMHgzRiwgMHhGQSwgMHhDOSwgMHg4MSwgMHg2NSwgMHg0MiwgMHg3QSwgMHhEQywgMHgwMCwgMHhCOSwKKwkgMHhGRCwgMHgxQywgMHgwMCwgMHhGNCwgMHg2RSwgMHg2MSwgMHgxMCwgMHg2MiwgMHgxNCwgMHgwMiwgMHgwNSwgMHgxRCwgMHgxMiwgMHgxRSwgMHgwQywgMHgwMCwKKwkgMHgwMCwgMHhGNCwgMHg3QywgMHg2MSwgMHgwMiwgMHg2MiwgMHg3QSwgMHhEQywgMHg2MywgMHg0MCwgMHhGRCwgMHgxQywgMHhGOSwgMHgxRCwgMHhGRiwgMHhCMSwKKwkgMHgwOCwgMHgxRSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MiwgMHhCNiwgMHhGRiwgMHhCNywgMHhGRiwgMHhBMSwgMHhGRiwgMHg2QywgMHg0NCwKKwkgMHg1QSwgMHhEQSwgMHg5OCwgMHhGRiwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHg4MSwgMHhFMSwgMHhBMSwgMHhGRiwgMHg2QywgMHg0MCwgMHhBMSwgMHhGRiwKKwkgMHg0NywgMHhGRiwgMHgyNiwgMHg0NCwgMHhGRCwgMHhCNCwgMHg4NCwgMHhCQywgMHgwMSwgMHgxNSwgMHg3RiwgMHhCNCwgMHg0MCwgMHg0NiwgMHhBMSwgMHhGRiwKKwkgMHg2QywgMHg0MCwgMHgxNCwgMHg2MywgMHgwMSwgMHgxMSwgMHgwMSwgMHgwMCwgMHhGRCwgMHgxRiwgMHhBQSwgMHg2MCwgMHg2RSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg5QSwgMHhGRiwgMHg1NCwgMHg2MywgMHgxMiwgMHg2NCwgMHg0MCwgMHg0NiwgMHgwMCwgMHg2NCwgMHgwRiwgMHhGQSwgMHhBMSwgMHhGRiwgMHhFQiwgMHhGMSwKKwkgMHgxMiwgMHg2MSwgMHg1MCwgMHhGRSwgMHgyRCwgMHg2MCwgMHg1MiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwKKwkgMHgwQiwgMHgwMCwgMHg4QywgMHg0NSwgMHg5OCwgMHhGOCwgMHgwMCwgMHg2NCwgMHgzQSwgMHhGQSwgMHgzQiwgMHhGQSwgMHgzQywgMHhGQSwgMHgzRCwgMHhGQSwKKwkgMHhCRiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBNCwgMHg4NCwgMHgwMSwgMHgwMCwgMHg4QywgMHg0NCwgMHhFQywgMHhGMCwgMHhCRCwgMHhEQSwgMHg0MCwgMHg0OCwKKwkgMHgwNCwgMHgyNiwgMHg0MCwgMHgwMCwgMHhBMSwgMHhGRiwgMHg4QywgMHg0NCwgMHhCRCwgMHhEQSwgMHgzMCwgMHhGQiwgMHg2QywgMHg0NCwgMHhCRCwgMHhEQSwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgyNiwgMHgyNCwgMHgwMCwgMHhEMCwgMHg4MCwgMHhBMSwgMHhGRiwgMHg4QywgMHg0NCwgMHg2QywgMHg1QywgMHhGMiwgMHhGRSwKKwkgMHhCRCwgMHhEQSwgMHhFRCwgMHhGMywgMHhENCwgMHg4MCwgMHhEMCwgMHg4MCwgMHhCRCwgMHhEOCwgMHgyRCwgMHg0NCwgMHgxNSwgMHgwQywgMHgzMiwgMHg0MCwKKwkgMHgwMiwgMHgyQSwgMHgwNywgMHgwMCwgMHgyOCwgMHg0MiwgMHgwQywgMHhCMiwgMHgwOCwgMHgzQSwgMHgwMywgMHgwMCwgMHgxMCwgMHhCQywgMHg0MCwgMHg0RCwKKwkgMHg0RCwgMHgwMCwgMHgwMywgMHgwQSwgMHhBQiwgMHg2MCwgMHgwOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMSwgMHhCQywgMHg0MCwgMHg0RCwgMHgyOCwgMHg0NSwKKwkgMHhCRiwgMHg2MCwgMHhGRiwgMHg2NCwgMHgyNCwgMHg4OCwgMHg0MiwgMHgwMCwgMHgzMCwgMHhCQywgMHg0MCwgMHg0RCwgMHgzRiwgMHgwMCwgMHgyMCwgMHhCOSwKKwkgMHg1QywgMHg4RSwgMHhBMSwgMHhGRiwgMHg4QywgMHg0NCwgMHhCRCwgMHhEQSwgMHhEQywgMHg5QywgMHg2QywgMHg0NCwgMHhGMiwgMHhGRSwgMHhCRCwgMHhEQSwKKwkgMHgwOCwgMHgyOCwgMHg0NCwgMHg0RSwgMHhEQywgMHg4NCwgMHgyRSwgMHg1QywgMHhCMCwgMHg4NCwgMHhFRiwgMHhCMSwgMHgwOCwgMHgyNCwgMHg0MCwgMHhCOSwKKwkgMHg0MSwgMHg0NiwgMHgyQywgMHgwMCwgMHg4QywgMHg0NCwgMHgwNCwgMHg2MSwgMHhCRCwgMHhEQSwgMHg1MCwgMHhGRSwgMHg4MCwgMHgyNywgMHgwMCwgMHg2NCwKKwkgMHgzMCwgMHhGQiwgMHg4QywgMHg0NCwgMHhCRCwgMHhEQSwgMHhEMCwgMHg4MCwgMHg4QywgMHg0NCwgMHhCRCwgMHhEQSwgMHhENCwgMHg4MCwgMHgwMCwgMHg2NSwKKwkgMHg4QywgMHg0NCwgMHhFRCwgMHhGMSwgMHhCRCwgMHhEQSwgMHhEMCwgMHg4MCwgMHgyOCwgMHg0NCwgMHgwMywgMHgwQywgMHhBMCwgMHgyQSwgMHgwQSwgMHgwMCwKKwkgMHgxMSwgMHgwMCwgMHgxMCwgMHg2NSwgMHg2MCwgMHg0MCwgMHhDNCwgMHgzNiwgMHgwNCwgMHgwMCwgMHhENCwgMHgzQSwgMHgwOCwgMHgwMCwgMHgyNywgMHg0MCwKKwkgMHg0MCwgMHgyNiwgMHgzMCwgMHg2NSwgMHgwMCwgMHg2NCwgMHgzRiwgMHhGQSwgMHg0NiwgMHg0RSwgMHgzNSwgMHg4RCwgMHg1RiwgMHgwMCwgMHg0MCwgMHgyNiwKKwkgMHhGOSwgMHgwMSwgMHgzMCwgMHg2NSwgMHg5RCwgMHhEQywgMHg5RCwgMHhEQywgMHg5RCwgMHhEQywgMHhGNCwgMHgwMSwgMHgwMCwgMHhFMSwgMHgyMywgMHg0MywKKwkgMHhFOCwgMHhBMywgMHg2QSwgMHg2MiwgMHg5QSwgMHhGRiwgMHhBMSwgMHhGRiwgMHgyOCwgMHg0NCwgMHgwMywgMHgyQiwgMHgwNCwgMHgwMCwgMHg3QSwgMHhEQywKKwkgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHgyOCwgMHg0NCwgMHg4OCwgMHhCMCwgMHg4OCwgMHgyQSwgMHgwMywgMHgwMCwgMHg3MCwgMHg2MiwgMHg3QSwgMHhEQywKKwkgMHgyOCwgMHg0NCwgMHg0MCwgMHgyQiwgMHgxMywgMHgwMCwgMHg3MiwgMHg2MiwgMHg3QSwgMHhEQywgMHgwNCwgMHhFNiwgMHg3QSwgMHhEQywgMHgzQiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyMCwgMHgyQiwgMHgwMiwgMHgwMCwgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHgwOCwgMHg2MCwgMHgwMCwgMHhFQiwKKwkgMHhGQywgMHhBMywgMHgyNSwgMHhGRiwgMHgzRiwgMHhGQywgMHgwNCwgMHhBMywgMHhCMCwgMHhGRiwgMHgwMSwgMHgwMCwgMHgzRiwgMHhGQywgMHhDRiwgMHg4MywKKwkgMHhERiwgMHg4MywgMHgwNCwgMHgwMiwgMHgwMCwgMHhGNCwgMHgxMCwgMHg2MiwgMHg2QywgMHg2MSwgMHgxRiwgMHgwMCwgMHgyNywgMHgwMywgMHhDQiwgMHg4MywKKwkgMHhGRiwgMHg2MCwgMHhGRSwgMHg2NSwgMHgwRSwgMHhBMywgMHhBNywgMHg4NCwgMHhGMiwgMHhBMywgMHgwMCwgMHhGNCwgMHgxMCwgMHg2MiwgMHg2QywgMHg2MSwKKwkgMHg3QSwgMHhEQywgMHhGRSwgMHgxQywgMHgwMywgMHgxRCwgMHg3QywgMHhBOCwgMHhEOSwgMHg4MSwgMHgwQSwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MiwKKwkgMHhBNywgMHg4NCwgMHg3QSwgMHg2MSwgMHg3QSwgMHhEQywgMHhGRSwgMHgxQywgMHhGOSwgMHgxRCwgMHg3QywgMHhBOCwgMHhEOSwgMHg4MSwgMHhGNiwgMHgwMywKKwkgMHhGRiwgMHhCMSwgMHgwQywgMHgxRSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MiwgMHhBMSwgMHhGRiwgMHgwMSwgMHg2MCwgMHgwQywgMHhFMSwKKwkgMHhCNiwgMHhGRiwgMHhCNywgMHhGRiwgMHhBMSwgMHhGRiwgMHhDRCwgMHg4MSwgMHg2QywgMHg0NCwgMHg1QSwgMHhEQSwgMHg5OCwgMHhGRiwgMHgwMCwgMHhFNiwKKwkgMHg3QywgMHg0NCwgMHgzMywgMHhGQiwgMHgwMSwgMHg2MCwgMHgwQywgMHhFMSwgMHg4MywgMHhFMSwgMHhBMSwgMHhGRiwgMHg4QywgMHg0NCwgMHg0NiwgMHg0NSwKKwkgMHhBMSwgMHhGRiwgMHgxNCwgMHg2MywgMHgwMSwgMHgxMCwgMHhGRSwgMHgxRiwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHgwQSwgMHg2NCwgMHg2MCwgMHg1NCwKKwkgMHg0NywgMHhGRiwgMHg1MCwgMHg0QiwgMHg2NywgMHg1MCwgMHg2OSwgMHhFMiwgMHg2QSwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwMSwgMHgxNSwgMHgyOSwgMHgwMCwKKwkgMHg2QywgMHg0MCwgMHgyOCwgMHg0MCwgMHgwMywgMHgyNiwgMHgxNSwgMHgwMCwgMHgzMSwgMHg0MCwgMHgyMCwgMHgyQSwgMHgwMywgMHgwMCwgMHgyOCwgMHg0MCwKKwkgMHg1MCwgMHgzQSwgMHgwRiwgMHgwMCwgMHgyRCwgMHg0NCwgMHgyMCwgMHgyQSwgMHgwQywgMHgwMCwgMHgyQiwgMHg0NCwgMHhBQywgMHg4MCwgMHgyOCwgMHg0MCwKKwkgMHhCNCwgMHgzQSwgMHgwMywgMHgwMCwgMHgwMiwgMHgwMywgMHgzMCwgMHhGQiwgMHgwNCwgMHgwMCwgMHgyQiwgMHg1MCwgMHhBNCwgMHg2MCwgMHg4NSwgMHg3OCwKKwkgMHgwNCwgMHhFMSwgMHgwNCwgMHhFMSwgMHhBMSwgMHhGRiwgMHgzNSwgMHhGMSwgMHgyNiwgMHg0NCwgMHg2NCwgMHg1NCwgMHhDRCwgMHhFMiwgMHg4NCwgMHhCQywKKwkgMHgyRCwgMHg0MCwgMHgwQywgMHgyMiwgMHhGRCwgMHhCNCwgMHg0MCwgMHg0NiwgMHgyMywgMHg2NCwgMHgzQSwgMHhEQiwgMHhBNywgMHg2MCwgMHgxOCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyNywgMHg0MCwgMHgyNiwgMHgyMiwgMHgwNCwgMHgwMCwgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhGRiwgMHhGRiwKKwkgMHg2QywgMHg0MCwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwgMHgzNywgMHhGMywKKwkgMHgyQiwgMHg0NSwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgyOCwgMHg2NSwgMHg0NCwgMHg2MCwgMHg1MCwgMHhBMCwgMHg0QywgMHgyMCwgMHhCQywKKwkgMHhGRiwgMHhCNCwgMHhBMCwgMHg1MSwgMHgzNSwgMHhGMSwgMHg3NCwgMHg0NCwgMHhDMCwgMHg5NCwgMHgzMiwgMHg0MCwgMHgwMiwgMHgyQSwgMHgxOCwgMHgwMCwKKwkgMHgyOCwgMHg0NCwgMHhBNCwgMHgzNiwgMHgwNCwgMHgwMCwgMHgwQywgMHhCNCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgzNiwgMHgxMSwgMHgwMCwgMHgyNiwgMHg0MywKKwkgMHhGRCwgMHhCMywgMHgwNCwgMHhCQiwgMHg0MywgMHg0NiwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwgMHgyOCwgMHg0NywgMHg0MCwgMHhCRiwgMHg0MCwgMHg0OCwKKwkgMHgwQSwgMHhCQiwgMHgwRiwgMHhGQywgMHg1MCwgMHg0QiwgMHg2NywgMHg1MCwgMHgwMCwgMHg2NCwgMHgzMCwgMHhGQiwgMHgwNSwgMHhGRiwgMHhDNiwgMHgwMSwKKwkgMHgyNCwgMHg2NCwgMHgzQSwgMHhEQiwgMHgyOCwgMHg0NCwgMHgwNCwgMHgyQSwgMHgwNiwgMHgwMCwgMHhBRSwgMHg0RiwgMHhGNywgMHhCNCwgMHhBMCwgMHg1RSwKKwkgMHhBMywgMHg2MCwgMHgzRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRCwgMHhGRiwgMHg0OCwgMHhFMiwgMHgyNywgMHg0NCwgMHgwNiwgMHgyMiwgMHgwNSwgMHgwMCwKKwkgMHhGOSwgMHhCNCwgMHg0MCwgMHg0NywgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHgyNiwgMHg0MCwgMHgxMCwgMHgyQSwgMHgxOCwgMHgwMCwKKwkgMHgyNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwgMHhDMCwgMHhBMCwgMHhGRiwgMHhGRiwgMHgxMSwgMHgwRSwgMHhCOCwgMHhGMSwKKwkgMHgyNywgMHg2MCwgMHg5MiwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywKKwkgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwKKwkgMHhBNywgMHg2MCwgMHhFNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg5NCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwKKwkgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgyQSwgMHg2NCwgMHgzQSwgMHhEQiwgMHg1QywgMHg0MSwgMHg4NywgMHhFMSwKKwkgMHhBMSwgMHhGRiwgMHg2QywgMHg0MCwgMHgwMiwgMHgwMCwgMHgyOSwgMHg2NCwgMHgzQSwgMHhEQiwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHg4NywgMHhFMSwKKwkgMHhBMSwgMHhGRiwgMHg2QywgMHg0MCwgMHgxMSwgMHgwMCwgMHgyNywgMHg2MCwgMHhBNiwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHhGMSwgMHgwMSwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHgyMSwgMHg2NCwgMHgzQSwgMHhEQiwKKwkgMHgwMywgMHgwMCwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHg2QywgMHg0MCwgMHgwMCwgMHg2NCwgMHgzMywgMHhGQiwgMHgzMiwgMHg3NCwgMHg0MCwgMHg2MywKKwkgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgwMSwgMHg2OCwgMHgwMSwgMHgxMSwgMHgwOSwgMHgwMCwgMHhBNywgMHg2QSwgMHgyMiwgMHg2NCwgMHgzQSwgMHhEQiwKKwkgMHgwMywgMHg2MCwgMHhDOSwgMHg2MywgMHgwMSwgMHgxMSwgMHgwMiwgMHgwMCwgMHg2QywgMHg0MCwgMHhGQywgMHgxRiwgMHg2QywgMHg0MCwgMHhCNSwgMHhGRiwKKwkgMHg2QywgMHg0MCwgMHhCQywgMHhGRiwgMHg2QywgMHg0MCwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwgMHgwOCwgMHg2MCwKKwkgMHgwMCwgMHg2QiwgMHhBRSwgMHg0RiwgMHhGNywgMHhCNCwgMHhBMCwgMHg1RSwgMHgwMywgMHgwQSwgMHhBMywgMHg2MCwgMHg0QiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHg2NCwgMHg1MSwgMHhGQiwgMHgzMSwgMHg2MCwgMHgwRSwgMHg3QywgMHhBNCwgMHhEMywgMHhGRiwgMHhGRiwgMHgwNCwgMHgxOCwgMHhBRSwgMHg0RiwKKwkgMHgwOCwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1RSwgMHgyNywgMHg0NCwgMHgwNiwgMHgyMiwgMHgwNiwgMHgwMCwgMHhGOSwgMHhCNCwgMHg0MCwgMHg0NywKKwkgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHg0OCwgMHhFMiwgMHgyNywgMHg2NCwgMHgzQSwgMHhEQiwgMHhCMywgMHhFMSwgMHhBMSwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwgMHg1NCwgMHg2MiwgMHgyMiwgMHg0NiwgMHhBMiwgMHhEMCwgMHgxNiwgMHg2MywgMHg3QywgMHg0MSwgMHg0NCwgMHg0OCwKKwkgMHg4MCwgMHgzNiwgMHgwNCwgMHg2MSwgMHgyOCwgMHg0MCwgMHg1MCwgMHgzNiwgMHgwNCwgMHg2MSwgMHg0MSwgMHg0RSwgMHgyOCwgMHg0NCwgMHhBNCwgMHgzNiwKKwkgMHgwRSwgMHg2MywgMHgxQywgMHg2MCwgMHg5QywgMHg2MiwgMHhBMiwgMHhEMSwgMHgyNCwgMHg0NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhDMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg5QSwgMHhGRiwgMHhBMSwgMHhGRiwgMHgyRCwgMHg2MCwgMHg1MiwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwNiwgMHgwMCwgMHgxOCwgMHhGMiwgMHhBQSwgMHhGMCwgMHhGRiwgMHhGRiwKKwkgMHhCNCwgMHg4NCwgMHgwOCwgMHgzNiwgMHgyQSwgMHhGQSwgMHg1NCwgMHg2MiwgMHhBMiwgMHhEMiwgMHhGRiwgMHhGRiwgMHg2QSwgMHg0MCwgMHg4MCwgMHg0RSwKKwkgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgxRCwgMHg3OCwgMHgwMCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHgyOCwgMHg0MCwgMHgwMywgMHgyQiwKKwkgMHgwNCwgMHgwMCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg2QSwgMHg0MCwgMHg3MCwgMHg2MiwgMHgyOCwgMHg0NCwgMHg4OCwgMHhCMCwKKwkgMHg4OCwgMHgzNiwgMHg3QSwgMHhENCwgMHgyOCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwQiwgMHgwMCwgMHg3MiwgMHg2MiwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwKKwkgMHhBMiwgMHhEMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgwMiwgMHgwMCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg0NiwgMHgwMCwKKwkgMHgyMywgMHg0MywgMHhDRiwgMHg4MywgMHhERiwgMHg4MywgMHgwMiwgMHgwMywgMHg1NSwgMHgwMywgMHgwNCwgMHgwMCwgMHgwMywgMHhGMCwgMHgwNCwgMHhGNCwKKwkgMHg2NCwgMHg0MiwgMHgzNywgMHgwMCwgMHgyRSwgMHg0MCwgMHgwNCwgMHgyQSwgMHgyMSwgMHgwMCwgMHhBMSwgMHhGRiwgMHgwMiwgMHhGRSwgMHgxMCwgMHgyNSwKKwkgMHg0MiwgMHhGRSwgMHg3MiwgMHg0NSwgMHg2NSwgMHg0QywgMHhCNSwgMHhGMywgMHgwMywgMHgwNCwgMHhFNCwgMHhFMiwgMHhEQywgMHg4NCwgMHhCNSwgMHhGQiwKKwkgMHhBMSwgMHhGRiwgMHg4MCwgMHg0QywgMHhCNiwgMHhGMywgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHhCNiwgMHhGQiwgMHg4MCwgMHg0QywgMHhCNywgMHhGMywKKwkgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHhCNywgMHhGQiwgMHg4MCwgMHg0QywgMHg1QywgMHg0RSwgMHhGOCwgMHhBMywgMHgwMywgMHhGMiwgMHg5QSwgMHhGMiwKKwkgMHgwNCwgMHhGNCwgMHhGRiwgMHhCMSwgMHhGOCwgMHhBMSwgMHgwNiwgMHhBNCwgMHg2MCwgMHg0MiwgMHgwOSwgMHgwMCwgMHgwMywgMHhGMiwgMHg5QSwgMHhGMiwKKwkgMHgwNCwgMHhGNCwgMHhDOCwgMHg4MiwgMHhGRiwgMHhCMSwgMHgwMywgMHgwMCwgMHgwMCwgMHhGNCwgMHg4MSwgMHhGMiwgMHhGRiwgMHhCMSwgMHg3QSwgMHhENCwKKwkgMHhGRiwgMHhGRiwgMHhGRCwgMHgxQywgMHhGOSwgMHgxRCwgMHhGRiwgMHhCMSwgMHgxNywgMHgxRSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHhEQSwgMHg4MiwKKwkgMHhEQSwgMHg4MiwgMHhBMiwgMHhEMiwgMHhBMSwgMHhGRiwgMHgwOSwgMHg3NCwgMHg4MCwgMHg0RCwgMHgwRSwgMHgwMCwgMHgwMywgMHhGMiwgMHg5QSwgMHhGMiwKKwkgMHgwNCwgMHhGNCwgMHgyMywgMHg0MywgMHhBMSwgMHhGRiwgMHhBMCwgMHhEMiwgMHhGRSwgMHhBMSwgMHhDQiwgMHg4MywgMHg4MCwgMHg0RSwgMHhBRiwgMHg4MywKKwkgMHgwMiwgMHgxRCwgMHgwMiwgMHgwMywgMHhFRCwgMHgwMSwgMHhFMywgMHgwMSwgMHhBMSwgMHhGRiwgMHgyOCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwMiwgMHgwMCwKKwkgMHg5QywgMHg0RSwgMHg5QywgMHg0QywgMHhBMSwgMHhGRiwgMHhEQSwgMHg4MywgMHg2NiwgMHg0NCwgMHgyMiwgMHg0NiwgMHgwQywgMHhGQSwgMHgwQiwgMHhGQywKKwkgMHg4NywgMHg0RiwgMHg4NywgMHg0QywgMHg4NywgMHg0RiwgMHg4NywgMHg0RCwgMHg4NywgMHg0QywgMHgwMSwgMHgwOCwgMHgwMSwgMHgwMCwgMHhGRiwgMHhGRiwKKwkgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2QSwgMHg0NCwgMHhCQywgMHhGRiwKKwkgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHgwQywgMHg3NCwgMHgwNCwgMHhFMSwgMHhBMSwgMHhGRiwgMHgzNSwgMHhGMywgMHhDNCwgMHhFMiwgMHg2MCwgMHg1NCwKKwkgMHg4OSwgMHhGRiwgMHgxMywgMHg3NCwgMHg4OCwgMHhGRiwgMHgyOSwgMHg0NCwgMHhGNywgMHhCNCwgMHg0MCwgMHg0OSwgMHgzNCwgMHg2NCwgMHgzQSwgMHhEQiwKKwkgMHgwNiwgMHhFMSwgMHg0NywgMHhGRiwgMHhBNCwgMHg2MCwgMHg0NywgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxMCwgMHg2MSwgMHg3RiwgMHg2MCwKKwkgMHhDMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MywgMHgyNiwgMHgwMiwgMHg5OCwgMHhGRSwgMHgxQSwgMHgwNSwgMHgyNCwgMHg2MCwKKwkgMHg1MiwgMHg2MiwgMHhBMiwgMHhENSwgMHgwRSwgMHhGMiwgMHgxNSwgMHgxOCwgMHgwMiwgMHgxOCwgMHgwOSwgMHhGNCwgMHhGQiwgMHgwMSwgMHgyMywgMHg0NCwKKwkgMHgwMCwgMHhBOCwgMHgwOCwgMHg3RSwgMHgwQSwgMHgwMiwgMHg2NiwgMHg0NCwgMHgxMSwgMHhGQiwgMHg0NiwgMHg0MywgMHgyMywgMHg0NywgMHg4MCwgMHhCRiwKKwkgMHgzQiwgMHg0MiwgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwgMHgwOCwgMHhCOSwgMHgxMCwgMHg3RSwgMHgwMCwgMHg3RiwgMHgwRSwgMHhGQSwgMHgwMCwgMHg2NywKKwkgMHgwQSwgMHgwMCwgMHgyMCwgMHg0NCwgMHhEQywgMHg4NSwgMHgwRiwgMHhCNCwgMHhGQSwgMHhBMCwgMHg3RiwgMHg2NywgMHgwNywgMHg2MywgMHgwMywgMHgwNSwKKwkgMHg0NSwgMHg0MCwgMHgwMCwgMHg2NywgMHhEOCwgMHhGRSwgMHhGRiwgMHgyNywgMHgwNSwgMHhGRCwgMHgwQSwgMHg3RSwgMHgwNCwgMHhGQiwgMHg2MSwgMHg1NSwKKwkgMHg0QSwgMHgwMCwgMHgyOCwgMHhGQiwgMHgwMSwgMHhGMywgMHgyOSwgMHhGQiwgMHg0NCwgMHg0NiwgMHg0MCwgMHg0NSwgMHgxMCwgMHg2MSwgMHg3RSwgMHg2MCwKKwkgMHhDMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MywgMHgzMSwgMHgwMiwgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RiwgMHg2RiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg3RiwgMHg2NywgMHgwMywgMHg2MywgMHgyQSwgMHgwMiwgMHgyNiwgMHg0MCwgMHgwMSwgMHgyQiwgMHgyNCwgMHgwMCwgMHg5OCwgMHhGRSwKKwkgMHgxOSwgMHgwNSwgMHgyNCwgMHg2MCwgMHg1MiwgMHg2MiwgMHhBMiwgMHhENSwgMHgwRSwgMHhGMiwgMHgxNCwgMHgxOCwgMHgwMiwgMHgxOCwgMHgwOSwgMHhGNCwKKwkgMHhGQiwgMHgwMSwgMHgyMywgMHg0NCwgMHgwMCwgMHhBOCwgMHgwOCwgMHg3RSwgMHgwQSwgMHgwMiwgMHg2NiwgMHg0NCwgMHgxMSwgMHhGQiwgMHg0NiwgMHg0MywKKwkgMHgyMywgMHg0NywgMHg4MCwgMHhCRiwgMHgzQiwgMHg0MiwgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwgMHgwOCwgMHhCOSwgMHgxMCwgMHg3RSwgMHgwMCwgMHg3RiwKKwkgMHgwRSwgMHhGQSwgMHgwOSwgMHgwMCwgMHgyMCwgMHg0NCwgMHhEQywgMHg4NSwgMHgwRiwgMHhCNCwgMHhGQSwgMHhBMCwgMHg3RiwgMHg2NywgMHgwNywgMHg2MywKKwkgMHgwNSwgMHgwNSwgMHg0NSwgMHg0MCwgMHhEOCwgMHhGRSwgMHgwMCwgMHg2NywgMHhEMCwgMHhGRSwgMHhEOSwgMHhGRSwgMHhGRiwgMHgyNywgMHgwNSwgMHhGRCwKKwkgMHgwQiwgMHg3RSwgMHgwNCwgMHhGQiwgMHgxQywgMHg2MCwgMHhCNCwgMHg2MywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgyMCwgMHhCMCwgMHg4MCwgMHhCQywKKwkgMHgwOCwgMHgyOCwgMHhBMywgMHhEQiwgMHg2MSwgMHg1NSwgMHg2MywgMHgwMCwgMHgwNCwgMHhCNSwgMHg4MiwgMHhCNSwgMHgyNSwgMHgwMiwgMHgwNCwgMHgwMywKKwkgMHgyMCwgMHg0NCwgMHg3RiwgMHhCNCwgMHg0MCwgMHg0MCwgMHhBMywgMHhEMywgMHg5OSwgMHhGRSwgMHgwNCwgMHgwNCwgMHgwMiwgMHhCQywgMHhGRSwgMHhCNCwKKwkgMHhBMywgMHhEQiwgMHg1NiwgMHgwMCwgMHhEQywgMHhGMywgMHgyMCwgMHg0MCwgMHg4MCwgMHgyNiwgMHg1MiwgMHgwMCwgMHhBMywgMHhEMywgMHhGRiwgMHhBMCwKKwkgMHhGOCwgMHhCNCwgMHgwMiwgMHgwMiwgMHhBMywgMHhEQiwgMHgxQywgMHgwMCwgMHgwNCwgMHhCQywgMHhCRiwgMHhCNCwgMHhBMywgMHhEQiwgMHgwOCwgMHhCMCwKKwkgMHgwMSwgMHg2NCwgMHgwOCwgMHgyNCwgMHgwMiwgMHg2NCwgMHgyOCwgMHhGQiwgMHgyMCwgMHg0NCwgMHg4MCwgMHhCQywgMHg0MCwgMHg0MCwgMHhEMCwgMHhGRSwKKwkgMHgzRiwgMHgwMCwgMHhCRiwgMHhCNCwgMHhBMywgMHhEQiwgMHgzQywgMHgwMCwgMHg0MCwgMHhCMCwgMHhGRiwgMHhGRiwgMHhGQSwgMHgwMiwgMHhGOCwgMHhCNCwKKwkgMHhBMywgMHhEQiwgMHgwOCwgMHhCNSwgMHgwNywgMHg3QywgMHgwMSwgMHgwMiwgMHhEQywgMHhGOSwgMHgyMCwgMHg0NCwgMHg3RiwgMHhCNCwgMHg0MCwgMHg0MCwKKwkgMHgxQywgMHg2MCwgMHhCNCwgMHg2MywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgyMCwgMHhCNSwgMHgwNywgMHhCNSwgMHgwOCwgMHgyOCwgMHhDNCwgMHgwMiwKKwkgMHg5OSwgMHhGRSwgMHgyNiwgMHgwNSwgMHgyMCwgMHg0NCwgMHg4MCwgMHgyNiwgMHgyMywgMHgwMCwgMHgyMCwgMHgyQSwgMHgwMCwgMHgwMCwgMHg0MCwgMHgyQSwKKwkgMHgxRiwgMHgwMCwgMHhCRiwgMHhCNCwgMHg0MCwgMHg0MCwgMHgwOSwgMHgwMCwgMHhBOCwgMHhGRiwgMHgyMCwgMHg0NCwgMHg5OSwgMHhGRSwgMHgwMiwgMHgwNSwKKwkgMHg4MCwgMHgyQSwgMHgwMywgMHgwMCwgMHg0MCwgMHhCQywgMHg0MCwgMHg0MCwgMHgxMywgMHgwMCwgMHgwMCwgMHhGMSwgMHg4MCwgMHhCQywgMHg0MCwgMHg0MCwKKwkgMHg2NCwgMHg0NCwgMHhFMCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgwQSwgMHgzNiwgMHgyOSwgMHgwMSwgMHgwQiwgMHgzNiwgMHg1QSwgMHgwMSwgMHgyOCwgMHhGQiwKKwkgMHgwMSwgMHhGMSwgMHgyOSwgMHhGOSwgMHgwMiwgMHhGMSwgMHgyQSwgMHhGOSwgMHgwMywgMHhGMSwgMHgyQiwgMHhGOSwgMHhEMCwgMHhGRSwgMHhBRSwgMHhGRiwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MiwgMHgzRSwgMHg3NSwgMHg0NCwgMHgwMiwgMHhCMCwgMHgwMSwgMHhCMCwgMHgyOSwgMHgwMiwgMHhEQywgMHgwMiwKKwkgMHgwNCwgMHhCMCwgMHgwOCwgMHhCMCwgMHgwQiwgMHgwMiwgMHgyMCwgMHgwMiwgMHg0MCwgMHgyNiwgMHhBNywgMHhGRiwgMHg4QywgMHhGRiwgMHg3NSwgMHg0MCwKKwkgMHg4MCwgMHgyQiwgMHgwMSwgMHgwMCwgMHhBQiwgMHhGRiwgMHg3NSwgMHg0NCwgMHg4RCwgMHhGRiwgMHhFQSwgMHgwMSwgMHgwQSwgMHhGMywgMHhBQSwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgwMiwgMHgwMCwgMHg2MCwgMHhGRiwgMHgwRCwgMHgwMCwgMHgwMSwgMHgyNiwgMHgwQywgMHgwMCwgMHhDMCwgMHg2MCwKKwkgMHgwMCwgMHg3QywgMHhBMCwgMHg4NCwgMHg4MCwgMHgzQiwgMHgwMiwgMHgwMCwgMHhDMCwgMHg2NywgMHgwMywgMHgwMCwgMHg0MCwgMHgzQiwgMHgwMiwgMHgwMCwKKwkgMHgwMCwgMHg2NywgMHgwQSwgMHhGQiwgMHhENSwgMHgwMSwgMHhENCwgMHgwMSwgMHhBQiwgMHhGRiwgMHgzOCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhEMCwgMHgwMSwKKwkgMHg3OSwgMHg2MywgMHhGRiwgMHhGRiwgMHhGRiwgMHgxRiwgMHhBOSwgMHhGRiwgMHg3NywgMHg0NCwgMHg2MCwgMHg1NywgMHgxMCwgMHg2MCwgMHgwMCwgMHg3NSwKKwkgMHg0MCwgMHg0QSwgMHgwMSwgMHgyQSwgMHgxQywgMHgwMCwgMHgyNCwgMHg0NCwgMHhBQywgMHg4NiwgMHgwOCwgMHhGMiwgMHgxOCwgMHgwMywgMHgyNCwgMHg2MCwKKwkgMHg1OCwgMHg2NSwgMHhENCwgMHg4MCwgMHgwRSwgMHhGMiwgMHgwMiwgMHgwMywgMHhBNSwgMHhENSwgMHgwNCwgMHgwMCwgMHgwMSwgMHhCQywgMHgwRSwgMHhGQSwKKwkgMHgwOSwgMHhGNCwgMHhEMSwgMHhGRSwgMHg0NiwgMHg0NCwgMHgwQiwgMHgxOCwgMHg2NiwgMHg0NCwgMHgxMCwgMHhGQiwgMHg2NiwgMHg0NywgMHgyMCwgMHhCRiwKKwkgMHgzQiwgMHg0MiwgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwgMHgwRSwgMHhGMiwgMHgwMSwgMHg3NSwgMHgxMCwgMHhCQywgMHgwRSwgMHhGQSwgMHgyQSwgMHg0NCwKKwkgMHgwOCwgMHgyQSwgMHgxOCwgMHgwMCwgMHgyMywgMHg0NCwgMHgwMCwgMHhBOCwgMHg1QywgMHg0MywgMHgxNCwgMHgwMywgMHgyNCwgMHg2MCwgMHg1MiwgMHg2MiwKKwkgMHhBMiwgMHhENSwgMHgwMSwgMHgwMCwgMHgwOSwgMHhGNCwgMHgwRSwgMHhGMiwgMHgwRCwgMHgxOCwgMHgwOCwgMHhCMCwgMHgxOCwgMHhBQywgMHhGQSwgMHgwMywKKwkgMHgwRSwgMHhGQSwgMHg2NiwgMHg0MywgMHgxMSwgMHhGRCwgMHg0NiwgMHg0MywgMHgyMywgMHg0NywgMHg4MCwgMHhCRiwgMHgzQiwgMHg0MiwgMHgwNCwgMHhBMiwKKwkgMHhBMiwgMHhEQiwgMHgwOCwgMHg3NSwgMHgyQSwgMHg0NCwgMHgwNiwgMHgyMiwgMHgyRCwgMHgwMCwgMHgyMiwgMHg0NCwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwKKwkgMHgwRSwgMHhGMiwgMHgyOCwgMHgwMywgMHgxMCwgMHhCMCwgMHgwMSwgMHhCQywgMHgwMywgMHgwMiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg0MiwgMHgyMiwgMHgwMCwKKwkgMHgwRSwgMHhGQSwgMHhEMSwgMHhGRSwgMHgyNCwgMHg2MCwgMHg0QywgMHg2NCwgMHg0MCwgMHg0NywgMHg1OCwgMHg0RiwgMHg4NCwgMHgwMCwgMHg0NiwgMHg0MiwKKwkgMHgxOSwgMHgwMiwgMHgyMiwgMHg0NywgMHg0MCwgMHhCRiwgMHgzQiwgMHg0MiwgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwgMHgyMywgMHhGMiwgMHg2NiwgMHg0MywKKwkgMHgwMCwgMHhBOCwgMHgwRSwgMHhGMiwgMHgwOCwgMHgwMiwgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQSwgMHhFNCwgMHgwMSwgMHgxMiwgMHhGRCwgMHgxMCwgMHg2NCwKKwkgMHgwRSwgMHhGQSwgMHgwMiwgMHg3NSwgMHgwNywgMHgwMCwgMHg2MCwgMHg0MCwgMHgwNCwgMHgyQSwgMHhEQywgMHgwMSwgMHgxMiwgMHhGRCwgMHgxMCwgMHg2NCwKKwkgMHgwRSwgMHhGQSwgMHgwNCwgMHg3NSwgMHgyQSwgMHg0NCwgMHg4MCwgMHgyQSwgMHgxOSwgMHgwMCwgMHgyMSwgMHg0NCwgMHhBQywgMHg4NiwgMHgwRSwgMHhGMiwKKwkgMHgxNSwgMHgwMywgMHgwMSwgMHhCQywgMHgwRSwgMHhGQSwgMHhEMSwgMHhGRSwgMHgyNCwgMHg2MCwgMHg2NCwgMHg2NCwgMHg0MCwgMHg0NywgMHg1OCwgMHg0RiwKKwkgMHg1QSwgMHgwMCwgMHg0NiwgMHg0MSwgMHgwQiwgMHgwMiwgMHgyMSwgMHg0NywgMHgxMCwgMHhCRiwgMHgzQiwgMHg0MiwgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwKKwkgMHgwRSwgMHhGMiwgMHg2NiwgMHg0MywgMHgwOCwgMHhGRCwgMHgxMCwgMHhCQywgMHgwRSwgMHhGQSwgMHg4MCwgMHg3NSwgMHgyQSwgMHg0NCwgMHgxMCwgMHhCMCwKKwkgMHgyMCwgMHg0NCwgMHgxNSwgMHgwMywgMHg3RiwgMHhCNCwgMHg0MCwgMHg0MCwgMHgxQywgMHg2MCwgMHhCNCwgMHg2MywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgyMCwgMHhCMCwgMHg4MCwgMHhCMCwgMHgwOSwgMHgwMywgMHgwOCwgMHgwMywgMHg0MCwgMHhCQywgMHg3RiwgMHhCNCwgMHgwNCwgMHhCMCwgMHhBMywgMHhEQiwKKwkgMHgwMywgMHgwMywgMHgyMCwgMHg0NCwgMHg4MCwgMHhCQywgMHg0MCwgMHg0MCwgMHhBQywgMHg2MCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHg0MCwKKwkgMHgwOCwgMHgyQiwgMHgwMSwgMHgwMCwgMHgxMCwgMHhGRiwgMHhBRCwgMHg2MCwgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFOCwgMHhGRSwgMHgxNCwgMHgwNSwKKwkgMHhFQSwgMHhGRSwgMHgyNCwgMHgwNSwgMHhFOSwgMHhGRSwgMHgxQywgMHgwNSwgMHhFNywgMHhGRSwgMHgwOSwgMHgwNSwgMHg0NywgMHhGRiwgMHgyMCwgMHg0NCwKKwkgMHgwRiwgMHgyMiwgMHgwMywgMHgwMCwgMHhDQywgMHg4NCwgMHg0MCwgMHg0MCwgMHgwRiwgMHgyMiwgMHhCOCwgMHhGRSwgMHhFQywgMHgwMSwgMHgyMywgMHg0MSwKKwkgMHgwMCwgMHhCOSwgMHg1QywgMHg0QSwgMHhFOCwgMHgwMiwgMHg2QSwgMHgwMSwgMHgyNCwgMHg0MSwgMHgwMCwgMHhCOSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg2NSwKKwkgMHg0NSwgMHg0NywgMHhFMSwgMHgwMiwgMHg1OCwgMHg0RiwgMHgwRiwgMHgwMCwgMHhERSwgMHgwMiwgMHg1QywgMHg0QSwgMHg0NiwgMHg0NCwgMHg0QywgMHgwMSwKKwkgMHgyMiwgMHg0MSwgMHgwMCwgMHhCOSwgMHg1QywgMHg0QSwgMHgwOCwgMHgyNCwgMHg3RCwgMHgwMSwgMHhENSwgMHgwMSwgMHgyMSwgMHg0MSwgMHgwMCwgMHhCOSwKKwkgMHg1QywgMHg0QSwgMHhBMiwgMHgwMywgMHhEMCwgMHgwMSwgMHgyNywgMHhEMywgMHgwMywgMHgwMCwgMHgxMCwgMHhCMCwgMHgwOSwgMHhGMiwgMHgwNCwgMHgwMywKKwkgMHhBQywgMHg4NiwgMHgwRSwgMHhGMiwgMHhGQSwgMHgwMiwgMHgwOCwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHhGMywgMHgwRiwgMHg2MCwKKwkgMHhGRSwgMHg2NSwgMHgwQywgMHhGMywgMHgyNCwgMHg4NiwgMHgyNCwgMHg0NiwgMHg2MCwgMHg0MCwgMHhGQiwgMHgzQiwgMHgwNywgMHgwMCwgMHg4MCwgMHgyNiwKKwkgMHgwMiwgMHgwMCwgMHgyMywgMHg0NiwgMHgwMywgMHg0QywgMHg0NiwgMHg2MSwgMHgzQSwgMHg2NSwgMHgwQywgMHgwMCwgMHgyRSwgMHhGMywgMHg0MCwgMHg0NSwKKwkgMHhGOCwgMHgyQiwgMHgwMiwgMHgwMCwgMHg0MCwgMHg0NSwgMHgwMywgMHgwMCwgMHg1OCwgMHg0RiwgMHgzOSwgMHgwMCwgMHgwNywgMHgwMiwgMHg1OCwgMHg0RiwKKwkgMHg0NSwgMHgwMCwgMHgwNCwgMHgwNSwgMHg2NiwgMHg1MCwgMHg2NSwgMHg1MiwgMHg2MSwgMHg1MSwgMHgwOSwgMHgwMCwgMHgyNiwgMHg0NywgMHgwMCwgMHhCRiwKKwkgMHgwRSwgMHhGQiwgMHgyRSwgMHhGNSwgMHgwNSwgMHhGMCwgMHg4MCwgMHg2MCwgMHg2NCwgMHg1MCwgMHgwMCwgMHg3MiwgMHg3RSwgMHg3MSwgMHhBQywgMHhGRiwKKwkgMHhBRCwgMHg2MCwgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4RSwgMHhGRiwgMHgwRiwgMHhGMywgMHgwRiwgMHg2MCwgMHhGRSwgMHg2NSwgMHgyNCwgMHg4NiwKKwkgMHgwRCwgMHhGMywgMHgyRSwgMHhGMywgMHg0MCwgMHg0NSwgMHhGOCwgMHgyQiwgMHgwMiwgMHgwMCwgMHg0MCwgMHg0NSwgMHgwMywgMHgwMCwgMHg1OCwgMHg0RiwKKwkgMHgxNiwgMHgwMCwgMHgwNywgMHgwMiwgMHg1OCwgMHg0RiwgMHgyMiwgMHgwMCwgMHgwNCwgMHgwNSwgMHg2NiwgMHg1MCwgMHg2NSwgMHg1MiwgMHg2MSwgMHg1MSwKKwkgMHgwOSwgMHgwMCwgMHgyNiwgMHg0NywgMHgwMCwgMHhCRiwgMHgwRiwgMHhGQiwgMHgyRSwgMHhGNSwgMHgwNSwgMHhGMCwgMHg4MCwgMHg2MCwgMHg2NCwgMHg1MCwKKwkgMHgwMCwgMHg3MiwgMHg3RSwgMHg3MSwgMHg4RCwgMHhGRiwgMHhBRCwgMHhGRiwgMHhBRCwgMHg2MCwgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg0NCwKKwkgMHhBQSwgMHhGMSwgMHhBQiwgMHhGMSwgMHhEMCwgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNywgMHgwNCwgMHgwMSwgMHgwNiwgMHgwNSwgMHgwMCwgMHgyNSwgMHg0NiwKKwkgMHgwMSwgMHhGMCwgMHgwMywgMHg2NywgMHhBMCwgMHg4NSwgMHg5NCwgMHg4MCwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg0NiwgMHgyNiwgMHg0MSwKKwkgMHg0NiwgMHg2MywgMHgwMSwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCNSwgMHhENSwgMHg4MSwgMHgwMCwgMHhGMiwgMHgwNSwgMHgwNCwgMHgwNCwgMHg2MywKKwkgMHg2MCwgMHg0NiwgMHhGNywgMHgxQiwgMHg0MiwgMHhGRSwgMHgwRCwgMHgwMCwgMHg2MSwgMHg0NCwgMHhDNSwgMHg4MSwgMHg2MywgMHg0NSwgMHhDNSwgMHg4MSwKKwkgMHg5QywgMHg4NCwgMHhEQywgMHg4NCwgMHgwMSwgMHhGMiwgMHhGMCwgMHg4NSwgMHhGMCwgMHg4MCwgMHg2NSwgMHg0NCwgMHhGOCwgMHg4NSwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhBMiwgMHhGRiwgMHgyNCwgMHg2MCwgMHg2QSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhBQywgMHg4NiwgMHgwRSwgMHhGMiwgMHgwNywgMHgwMywgMHgwMCwgMHhBOCwgMHgwOSwgMHhGMiwgMHhGQSwgMHgwMiwgMHgwMSwgMHg2NywgMHgwRSwgMHhGQSwKKwkgMHgwOCwgMHhGRSwgMHgxNywgMHgwMCwgMHhBQywgMHhGMywgMHhGRiwgMHhGRiwgMHhEOCwgMHhBMCwgMHgwMCwgMHhCNCwgMHgxMiwgMHgwNiwgMHgwOSwgMHg2MCwKKwkgMHgwOCwgMHg2MSwgMHg0MSwgMHg0QSwgMHg3QywgMHhBMSwgMHgwRSwgMHhBMSwgMHhBMiwgMHhGRiwgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RSwgMHhFNCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhBMywgMHhGRiwgMHgwNiwgMHgwMywgMHgyQSwgMHg0MywgMHhBRiwgMHg2MCwgMHg1OCwgMHg0RSwgMHgwNSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHhGRSwgMHhBMywgMHhGRiwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg0MSwgMHg0QSwgMHg3QywgMHhBMSwgMHgwRSwgMHhBMSwgMHhBMiwgMHhGRiwKKwkgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RSwgMHhFNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHgyQSwgMHg0MywgMHhBRiwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHgwNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHhGRSwgMHgwRCwgMHgwMCwgMHgyNCwgMHg2MCwgMHg2QSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhBQywgMHg4NiwgMHgwRSwgMHhGMiwgMHgwNiwgMHgwMywgMHgwMCwgMHhBOCwgMHgwOSwgMHhGMiwgMHhGQSwgMHgwMiwgMHgwMSwgMHg2NywgMHgwRSwgMHhGQSwKKwkgMHgwOCwgMHhGRSwgMHhBMywgMHhGRiwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHhBRCwgMHhGMywgMHg3QywgMHg2MywgMHgwMCwgMHhCRSwgMHg0MCwgMHg0NSwKKwkgMHgxQSwgMHgwMywgMHgwMCwgMHg2NSwgMHg2NSwgMHg0NCwgMHhEQywgMHg4NSwgMHg4NCwgMHhBMSwgMHgwMCwgMHhGMiwgMHgwNiwgMHgwNiwgMHgwMSwgMHhGQywKKwkgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHhGNywgMHgwMiwgMHg0MCwgMHg0NSwgMHgwRSwgMHgwMCwgMHhBQywgMHhGMywgMHgwMCwgMHg2MywgMHhENCwgMHg4NCwKKwkgMHhBQywgMHhGQiwgMHg4MCwgMHg2MCwgMHg3QywgMHg2NCwgMHgwMSwgMHhGQSwgMHgwMCwgMHhGMCwgMHgwMCwgMHhGQywgMHhEMywgMHg4MCwgMHhBRCwgMHhGOSwKKwkgMHgwMiwgMHgwMiwgMHhBRSwgMHhGOSwgMHgwOCwgMHhGRSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHgyNSwgMHg0NiwgMHgwNSwgMHhGQSwKKwkgMHgwNiwgMHhGQSwgMHgwMSwgMHhGMCwgMHgwMywgMHg2NywgMHgwMiwgMHhGQywgMHhCMCwgMHg4NCwgMHgzQSwgMHg3RSwgMHgwMSwgMHhGQSwgMHgxMiwgMHg2NCwKKwkgMHgwMywgMHhGQSwgMHgwMCwgMHhGMCwgMHgwNCwgMHhGOCwgMHgwMCwgMHg2NCwgMHgwQywgMHg2MSwgMHgxMCwgMHg2MywgMHg1OSwgMHhEQSwgMHhGRSwgMHgxRiwKKwkgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg0MywgMHhFMywgMHg4MSwgMHhFOSwgMHg4MSwgMHgwMywgMHgwNSwgMHgxNiwgMHgwMywgMHgwMCwgMHg2MSwKKwkgMHgwMSwgMHgwMCwgMHhFNCwgMHg2MywgMHg2MSwgMHg0NiwgMHhCRiwgMHhEMiwgMHgyNywgMHg0NSwgMHhEQywgMHg4NCwgMHhBMiwgMHhEQSwgMHhCRSwgMHhEMiwKKwkgMHgyNSwgMHg0NiwgMHg4OCwgMHhGOCwgMHgwNCwgMHgxQiwgMHgyNSwgMHg0NCwgMHg2MSwgMHg0NiwgMHhBMywgMHhEQSwgMHgwNCwgMHgwMCwgMHgwQSwgMHhGQSwKKwkgMHg2MCwgMHg0NiwgMHgyNSwgMHg0NCwgMHgwOSwgMHhGQSwgMHg2MSwgMHg0NiwgMHhCRSwgMHhEQSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg0NCwKKwkgMHgwMCwgMHhBOCwgMHgwNywgMHg0QiwgMHgwQywgMHgwMywgMHg1OCwgMHg0RiwgMHgzMywgMHgwMCwgMHgwQiwgMHg0NywgMHgyNCwgMHg2MCwgMHg1RSwgMHg2NSwKKwkgMHgyNywgMHg0NCwgMHhENCwgMHg4MCwgMHgwMCwgMHg2NCwgMHgwMSwgMHgwMiwgMHgwRiwgMHhGQSwgMHg1OCwgMHg0RiwgMHhEMywgMHgwMSwgMHg3MCwgMHgwMCwKKwkgMHgyNSwgMHg0MywgMHhFMywgMHg4NCwgMHg3QywgMHg0MSwgMHgwMiwgMHgwNCwgMHhFOCwgMHg4MSwgMHhFNCwgMHg2MywgMHg2MSwgMHg0NiwgMHhBMywgMHhEMiwKKwkgMHgwMCwgMHg3QywgMHg0MCwgMHg0NSwgMHhCRiwgMHhEOCwgMHhBMywgMHhEOCwgMHhCRSwgMHhEOCwgMHgyNywgMHg0MiwgMHg1QSwgMHhEMywgMHgyNSwgMHg1QywKKwkgMHg2MCwgMHg0MSwgMHgwMiwgMHgxQiwgMHgyNywgMHhEOSwgMHgwNSwgMHgwMCwgMHgyNSwgMHg0NiwgMHgwQSwgMHhGQSwgMHg2MSwgMHg0NiwgMHgyNSwgMHg0NCwKKwkgMHgwOSwgMHhGQSwgMHgyNSwgMHg0NCwgMHgyNywgMHg0MywgMHgwMCwgMHg2MSwgMHg2MCwgMHg0NiwgMHgwOSwgMHhGMiwgMHgwOCwgMHhGQywgMHgwMCwgMHhBOCwKKwkgMHhERCwgMHg4MSwgMHhGQSwgMHgwMiwgMHhCRiwgMHhEMSwgMHg2NiwgMHg0NCwgMHhCRSwgMHhEQiwgMHhDMSwgMHg4NCwgMHhCRiwgMHhEQiwgMHg0OCwgMHgwMCwKKwkgMHgyNSwgMHg0NiwgMHhFNCwgMHg2MywgMHgwOCwgMHhGMiwgMHg4OSwgMHhGMiwgMHgxRSwgMHgxOCwgMHg0MCwgMHg0NywgMHhFMCwgMHg4NCwgMHhFOCwgMHg4NSwKKwkgMHgwMiwgMHgwNSwgMHhFOCwgMHg4MywgMHgwMCwgMHg2NSwgMHg2NSwgMHg0NiwgMHhCRiwgMHhEMiwgMHg2MSwgMHg1QywgMHhDQywgMHg4NCwgMHhBMiwgMHhEQSwKKwkgMHgyNSwgMHg0NiwgMHgwQSwgMHhGMiwgMHgwMCwgMHhCOSwgMHg2NSwgMHg0NiwgMHgwOCwgMHgyNCwgMHhCRSwgMHhEQSwgMHgwMiwgMHgxQiwgMHhBMywgMHhEOCwKKwkgMHgwMiwgMHgwMCwgMHg2MCwgMHg0NiwgMHg4OSwgMHhGQSwgMHgwMCwgMHhCOSwgMHg2MSwgMHg0NiwgMHgwOCwgMHgyOCwgMHgwQSwgMHhGQSwgMHgyNSwgMHg0NiwKKwkgMHg4OSwgMHhGQywgMHg4QSwgMHhGQywgMHg4OCwgMHhGQywgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MSwgMHgyOCwgMHg2NSwgMHgyNSwgMHg0MywKKwkgMHhBRSwgMHhGMywgMHhBRiwgMHg4MywgMHgwMCwgMHhCRSwgMHgxOCwgMHgwMywgMHgwMiwgMHgwMywgMHgwMCwgMHhGQywgMHgwMSwgMHgwMCwgMHhBRCwgMHhGRCwKKwkgMHg2MywgMHg0NiwgMHg2NSwgMHg0NCwgMHhDQywgMHg4NSwgMHgwMCwgMHhGMiwgMHgwNywgMHgwMiwgMHhBRSwgMHhGNSwgMHgwMCwgMHg2NCwgMHgwMCwgMHhGQSwKKwkgMHhERSwgMHg2MCwgMHhBRiwgMHg2NCwgMHgwOSwgMHhGQiwgMHgwOCwgMHgwMCwgMHg2NiwgMHg0MywgMHgwMCwgMHhCRSwgMHhERCwgMHg4MSwgMHhGMSwgMHgwMiwKKwkgMHhBQywgMHhGMSwgMHhBRSwgMHhGRCwgMHhDMSwgMHg4NCwgMHhBQywgMHhGQiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NSwKKwkgMHgyOSwgMHg0MywgMHhGQywgMHhBMywgMHg2NiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgwMCwgMHg2NCwgMHhCRCwgMHhEQiwKKwkgMHgwMywgMHg2MSwgMHgwRSwgMHg2NSwgMHgyNCwgMHg2MCwgMHg3MiwgMHg2MywgMHg0MywgMHg0OSwgMHhBMywgMHhEMywgMHgwNiwgMHhBMywgMHgwMCwgMHhBOCwKKwkgMHhDRCwgMHg4MSwgMHgwNCwgMHgwMiwgMHhGOSwgMHgwMiwgMHhBRCwgMHg2MCwgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgyNiwgMHhFNiwgMHgwMSwKKwkgMHhENCwgMHg4MCwgMHg2MCwgMHg0NSwgMHhFMywgMHgwNSwgMHhGNiwgMHhBMywgMHhCRCwgMHhEMSwgMHhCRCwgMHhEMSwgMHg0NCwgMHg0NywgMHg0NCwgMHg0OCwKKwkgMHg0NCwgMHg0NSwgMHgyNCwgMHg2MCwgMHhCMCwgMHg2NCwgMHg0NCwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHgyMiwgMHg2MywKKwkgMHgwRCwgMHg2NSwgMHgwMCwgMHg2MSwgMHg0MSwgMHg0OCwgMHhBMywgMHhEMywgMHgwNiwgMHhBMywgMHhBQywgMHg4NiwgMHgwMCwgMHg2MSwgMHgwOSwgMHgwMywKKwkgMHgwMCwgMHhGMiwgMHgwOSwgMHhGMCwgMHhBQywgMHg4NiwgMHgwMCwgMHhGMiwgMHhERCwgMHg4MSwgMHhGQywgMHgwMiwgMHg2NCwgMHg0NCwgMHhBQywgMHg4NiwKKwkgMHhGNiwgMHgwMSwgMHg2MSwgMHg0NCwgMHgyNSwgMHg0NiwgMHgyNywgMHhEQSwgMHg2NSwgMHg0NCwgMHgyOCwgMHg0NSwgMHg0NSwgMHg4OCwgMHhDQywgMHg4NSwKKwkgMHg1QSwgMHg4NywgMHhFOSwgMHgwMiwgMHgwMCwgMHg2NCwgMHgyNywgMHhEQSwgMHg1QSwgMHhEQSwgMHg1QSwgMHg4NywgMHhBOSwgMHhGMywgMHhBOCwgMHhGMSwKKwkgMHgwMiwgMHhBNCwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0NSwgMHgwMCwgMHg2MSwgMHgxRSwgMHhGMiwgMHhGRiwgMHhGRiwgMHhBQywgMHg4NiwgMHgwMCwgMHhGMiwKKwkgMHgwNCwgMHgwMywgMHhBQywgMHg4NiwgMHgwMCwgMHhGMiwgMHhERCwgMHg4MSwgMHhGQywgMHgwMiwgMHg2NSwgMHg0NCwgMHgwMiwgMHhBNSwgMHg2NSwgMHg0NiwKKwkgMHg2NCwgMHg0NCwgMHhDQywgMHg5QywgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMiwgMHg2MSwgMHg0NCwgMHgyNSwgMHg0NiwgMHgyNywgMHhEQSwgMHg1QSwgMHg4NywKKwkgMHgyOCwgMHg0NSwgMHg0NSwgMHg4OCwgMHgwMCwgMHg2NCwgMHgyNywgMHhEQSwgMHg1QSwgMHg4NywgMHgwNiwgMHg2MCwgMHg0MCwgMHg2NSwgMHhBRCwgMHhGMywKKwkgMHgwMSwgMHg2MSwgMHhBQywgMHg4NiwgMHgwMCwgMHhGMiwgMHgwMywgMHgwMywgMHhENSwgMHg4MCwgMHhERCwgMHg4MSwgMHhGQSwgMHgwNCwgMHhDRCwgMHg4NCwKKwkgMHgyNSwgMHg0NiwgMHgyNywgMHhEQSwgMHgyOCwgMHg0NSwgMHhDNCwgMHg4NCwgMHg1QSwgMHhEQSwgMHhEQSwgMHg4MSwgMHhBQywgMHhGMSwgMHg1OSwgMHhEOCwKKwkgMHgyNCwgMHg2MCwgMHgyMCwgMHg2NCwgMHgxOCwgMHg2MywgMHhBMCwgMHhEMSwgMHgwNiwgMHhBNCwgMHg1OSwgMHhEOCwgMHhGQywgMHgxRiwgMHgwMCwgMHg2NCwKKwkgMHg1OSwgMHhEQSwgMHg1OSwgMHhEQSwgMHgwMSwgMHg2MCwgMHg1QywgMHg2NCwgMHgwQSwgMHg2MywgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOCwgMHhGRCwgMHgxRiwKKwkgMHhEQywgMHhGMSwgMHg1OSwgMHhEOCwgMHg3NSwgMHgwMSwgMHgwNywgMHg0QiwgMHhBRiwgMHg2MCwgMHg1OCwgMHg0RiwgMHg3MCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwQiwgMHg0NywgMHg1OCwgMHg0RiwgMHgyMSwgMHgwMCwgMHg2QywgMHgwMSwgMHgwNywgMHg0QiwgMHhBRiwgMHg2MCwgMHg1OCwgMHg0RiwgMHg3MCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwQiwgMHg0NywgMHgyNywgMHg0NCwgMHgwMCwgMHhCRSwgMHgwOCwgMHhGMCwgMHgxNSwgMHgwMywgMHg2NCwgMHg0MiwgMHg0QSwgMHhEMywKKwkgMHgwOSwgMHhGMiwgMHhEQywgMHg4MywgMHhBMiwgMHhERCwgMHgyNSwgMHg0MywgMHgwOSwgMHhGQywgMHg2MywgMHg0NiwgMHgyNywgMHg0MywgMHgwQSwgMHhGQywKKwkgMHgwOSwgMHhGQSwgMHgwOCwgMHhGOCwgMHgwMCwgMHhBOCwgMHg2NiwgMHg0MywgMHgwMywgMHgwMiwgMHg2NCwgMHg0NCwgMHg1OCwgMHhERCwgMHgwMywgMHgwMCwKKwkgMHg2MCwgMHg0NiwgMHgyNSwgMHg0NCwgMHgwQSwgMHhGQSwgMHg0QywgMHgwMSwgMHgyNywgMHg0MywgMHhFMywgMHg4MSwgMHhFOSwgMHg4MSwgMHgwMywgMHgwNSwKKwkgMHgxNiwgMHgwMywgMHgwMCwgMHg2MSwgMHgwMSwgMHgwMCwgMHhFNCwgMHg2MywgMHg2MSwgMHg0NiwgMHhCRiwgMHhEMiwgMHgyNywgMHg0NSwgMHhEQywgMHg4NCwKKwkgMHhBMiwgMHhEQSwgMHhBMywgMHhEMiwgMHgyNSwgMHg0NiwgMHg4OCwgMHhGOCwgMHgwNCwgMHgxQiwgMHgyNSwgMHg0NCwgMHg2MSwgMHg0NiwgMHhCRSwgMHhEQSwKKwkgMHgwNCwgMHgwMCwgMHgwOSwgMHhGQSwgMHg2MCwgMHg0NiwgMHgyNSwgMHg0NCwgMHgwQSwgMHhGQSwgMHg2MSwgMHg0NiwgMHhBMywgMHhEQSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhBMCwgMHhGRSwgMHgwNywgMHgwNSwgMHhBMywgMHhGRSwgMHgwNywgMHgwNSwgMHhBMSwgMHhGRSwgMHg1MiwgMHgwNSwgMHg2MCwgMHg2NCwKKwkgMHgzQiwgMHhEQiwgMHgxMiwgMHgwMCwgMHgyMCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg0RiwgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwKKwkgMHhCOCwgMHg2MywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHhGQiwgMHhCNCwgMHhBMywgMHhEQiwgMHhBMCwgMHg0QywgMHg1OSwgMHhCQywgMHhGRiwgMHhCNCwKKwkgMHhBMCwgMHg1MSwgMHhBMCwgMHg0QywgMHg3RCwgMHhCNCwgMHhBMCwgMHg1MSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MywgMHgzRSwgMHg0MCwgMHg2MCwKKwkgMHgwQiwgMHg2NSwgMHgyQiwgMHg0NCwgMHgwMCwgMHg2MywgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgwMiwgMHgyNCwgMHg5NCwgMHg4NCwgMHhGMywgMHg4MywKKwkgMHhDRCwgMHg4MSwgMHhGRiwgMHhGRiwgMHhGOCwgMHgwMiwgMHhERiwgMHg4MywgMHgyRiwgMHg1OCwgMHg0MCwgMHg0QiwgMHgwMCwgMHg2MiwgMHgwMSwgMHg2NCwKKwkgMHhENCwgMHg4MCwgMHhFMCwgMHg4NCwgMHgxQSwgMHgwMywgMHhENCwgMHg4MCwgMHhFMCwgMHg4NCwgMHgxNSwgMHgwMywgMHg2MSwgMHg0NCwgMHgxMSwgMHg2MSwKKwkgMHhFMCwgMHg4NCwgMHhDRCwgMHg4MSwgMHhGRCwgMHgwNCwgMHgwMSwgMHgwMCwgMHhFMCwgMHg4NCwgMHhGMiwgMHg4MiwgMHhGRiwgMHhGRiwgMHgwMiwgMHgyNCwKKwkgMHhDNiwgMHg4MiwgMHgwMiwgMHgyOCwgMHhENiwgMHg4MiwgMHhFMiwgMHg4MCwgMHhDRCwgMHg4MSwgMHgwMiwgMHgyOCwgMHgwMSwgMHhCQywgMHhGNCwgMHgwMiwKKwkgMHgwMSwgMHgyQSwgMHhDNiwgMHg4MiwgMHgwMywgMHgwMCwgMHhFOSwgMHg4MSwgMHhGMiwgMHg4MiwgMHg2MSwgMHg0NCwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHhBOCwgMHgxMCwgMHg2MSwgMHgwNCwgMHgwMywgMHhGMCwgMHg4NCwgMHhDRCwgMHg4MSwgMHhGRCwgMHgwNCwgMHg2MSwgMHg0NCwgMHgyRCwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHgzQiwgMHhEQiwgMHgzQywgMHg0NCwgMHhBQywgMHg4MCwgMHhGRiwgMHhGRiwgMHhCRCwgMHgwMiwgMHg4QiwgMHhGMywKKwkgMHg4QywgMHhGMywgMHgwMiwgMHhBOCwgMHgwMiwgMHhBOCwgMHgwOCwgMHgwMiwgMHgwMCwgMHg2NCwgMHg4RCwgMHhGQiwgMHg4QiwgMHhGQiwgMHg4QywgMHhGQiwKKwkgMHgwMCwgMHg2NCwgMHg4RSwgMHhGQiwgMHhDQSwgMHhGRSwgMHgyRCwgMHgwMCwgMHgwMywgMHgwMiwgMHgwMCwgMHg2NCwgMHg4QywgMHhGQiwgMHhDQSwgMHhGRSwKKwkgMHgwMSwgMHg2NCwgMHgzQiwgMHhEQiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwKKwkgMHgxNCwgMHgwMywgMHhEQywgMHhGMywgMHgyQSwgMHhGMiwgMHhGRCwgMHhBMCwgMHg2MCwgMHg0MCwgMHg4MCwgMHgzQSwgMHgyOSwgMHgwMCwgMHgyOCwgMHgwMiwKKwkgMHg5QiwgMHhGRSwgMHgyNiwgMHgwNSwgMHgyNCwgMHg2MCwgMHg2RSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhFNSwgMHgwMSwgMHg4QywgMHhGMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhBOCwKKwkgMHhGRiwgMHhGRiwgMHgwNywgMHgwMiwgMHgyNCwgMHg2MCwgMHgyMiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwKKwkgMHgwRiwgMHgwMiwgMHg4NiwgMHhGRiwgMHgyMCwgMHg0MCwgMHg1MiwgMHgyNywgMHgwNywgMHgwMCwgMHg5QSwgMHhGRSwgMHgwNSwgMHgwNCwgMHg5RCwgMHhGRSwKKwkgMHgwMywgMHgwNCwgMHhGMSwgMHhGRSwgMHgxMiwgMHg2NCwgMHgzQiwgMHhEQiwgMHg4NCwgMHhGRiwgMHhCMCwgMHg2MCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg2NiwgMHg0NCwgMHhGQywgMHhGQiwgMHg0NiwgMHg1QywgMHgyRCwgMHg2MCwgMHg1QSwgMHg2MywgMHhBMywgMHhEMywgMHhCMCwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRCwgMHhGMiwgMHg2MCwgMHg1QywgMHg2NCwgMHg1RiwgMHgwRCwgMHhGQSwgMHgxMSwgMHg2NCwgMHgzQiwgMHhEQiwKKwkgMHg5RCwgMHhGRSwgMHgwQiwgMHgwNSwgMHgyNCwgMHg2MCwgMHg5MiwgMHg2NSwgMHgwOCwgMHg2NCwgMHhBNSwgMHhEQiwgMHhCMSwgMHg2MCwgMHg0RCwgMHg2NCwKKwkgMHg0RiwgMHhGQiwgMHgyRCwgMHhGRiwgMHhCMCwgMHg2MCwgMHhBNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHhGMCwgMHgwMCwgMHg2NCwgMHhEMCwgMHg4MCwKKwkgMHhBOSwgMHhGMywgMHgwNywgMHgwMiwgMHgyMywgMHhGMCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHhCOCwgMHg2MCwgMHgzNiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhEOCwgMHhGMywgMHg0MCwgMHgwMywgMHg2MCwgMHg0MCwgMHgwMywgMHgzQSwgMHgzRCwgMHgwMCwgMHg2NiwgMHg0MSwKKwkgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHg2MSwgMHg0NiwgMHg2NCwgMHg0MSwgMHg0RCwgMHhGMSwgMHg2MCwgMHg0MCwgMHgwMywgMHgzQSwgMHgzNCwgMHgwMCwKKwkgMHg2NCwgMHg0MCwgMHhGRiwgMHgyMiwgMHgzMSwgMHgwMCwgMHgwNSwgMHg3RSwgMHg2NiwgMHg0NSwgMHg2MSwgMHg0NiwgMHg2RiwgMHhGQSwgMHg2NSwgMHg0NiwKKwkgMHgwNywgMHhGMCwgMHgwMCwgMHg2NSwgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwgMHg4QywgMHhGQSwgMHgwMCwgMHhBOCwKKwkgMHg2RiwgMHhGMiwgMHgxNSwgMHgwMywgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHgwMCwgMHhCQiwgMHhGRiwgMHhBMCwgMHgwNywgMHgwMywKKwkgMHgwRSwgMHgwNiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwgMHgwOCwgMHgwMCwgMHhCOSwgMHg4MSwKKwkgMHhFOCwgMHg4NCwgMHhEOSwgMHg4MSwgMHhGRCwgMHgwNCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHgwQywgMHhGNCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHg0RCwgMHhGQiwgMHg0QywgMHhGQiwgMHgwNywgMHhGMCwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMiwKKwkgMHg2MSwgMHg0NiwgMHhGRiwgMHhGRiwgMHhGMCwgMHg3RSwgMHg0RSwgMHhGQiwgMHgyQSwgMHhGMiwgMHgwMCwgMHg2MywgMHg0MCwgMHg0NywgMHg1MCwgMHgzNiwKKwkgMHgwNSwgMHgwMCwgMHhBNCwgMHgzNiwgMHgwMywgMHgwMCwgMHg4MCwgMHgzNiwgMHgwMSwgMHgwMCwgMHgwMSwgMHg2MywgMHg0OCwgMHhGRCwgMHg0MCwgMHg0NywKKwkgMHgwOCwgMHgyQSwgMHgwQSwgMHgwMCwgMHgwMywgMHgyRiwgMHgwOCwgMHgwMCwgMHg4MSwgMHhGMSwgMHgyQywgMHhGOCwgMHg4MiwgMHhGMSwgMHhGRiwgMHhGRiwKKwkgMHgyRCwgMHhGOCwgMHg4MywgMHhGMSwgMHgyRSwgMHhGOCwgMHhGRiwgMHhGRiwgMHg0QSwgMHhGMywgMHgzNSwgMHhGQSwgMHgxMCwgMHhBNCwgMHg0QSwgMHhGQiwKKwkgMHgwMCwgMHg2NCwgMHgxNSwgMHhGQSwgMHgxNiwgMHhGQSwgMHgwRiwgMHhGQSwgMHhGRiwgMHhGRiwgMHgwNywgMHhGMCwgMHg2NiwgMHg0MywgMHg2NCwgMHg0NiwKKwkgMHgwRSwgMHhGMCwgMHg2MywgMHg0NiwgMHgwMCwgMHg3RiwgMHg2NCwgMHg1RSwgMHg0QiwgMHhGQiwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RSwgMHhEQiwgMHhGQiwKKwkgMHgwNywgMHhGMCwgMHhBOSwgMHhGMywgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHhEQiwgMHhGMywgMHhEQSwgMHhGQiwKKwkgMHg2MCwgMHg0MSwgMHgwMywgMHhGMiwgMHgwMCwgMHhGNCwgMHgwMSwgMHhGMiwgMHhGQywgMHhBNSwgMHgwMCwgMHg3RiwgMHhENCwgMHg4NCwgMHgyNywgMHg0NSwKKwkgMHgzQywgMHg0NiwgMHgxQSwgMHhGQSwgMHgyMiwgMHg2MywgMHg3QiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBNCwgMHg4NCwgMHgwMywgMHgyQiwgMHgxQywgMHg2MywKKwkgMHgyQSwgMHhGQSwgMHg2MCwgMHg0MCwgMHhBNCwgMHgzNiwgMHgxNCwgMHg2MywgMHg0MywgMHg0QywgMHgwMCwgMHg3QywgMHgyMiwgMHhGOCwgMHg2NCwgMHg0MSwKKwkgMHgwNywgMHhGMCwgMHg2NiwgMHg0MywgMHg2NCwgMHg0NiwgMHgzNiwgMHhGMiwgMHg2MywgMHg0NiwgMHhGRiwgMHhCNCwgMHgyMiwgMHhGQSwgMHg2MCwgMHg0MCwKKwkgMHgwMCwgMHgzNiwgMHg3NiwgMHgwMCwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgzQSwgMHhBNSwgMHgwMCwgMHgwMywgMHhGMiwKKwkgMHgwMCwgMHhGNCwgMHhBMCwgMHhEMiwgMHhBQSwgMHg2MCwgMHhBQSwgMHg2NSwgMHg1QSwgMHhEMCwgMHhENCwgMHg4MCwgMHgwMywgMHg2NCwgMHgwQSwgMHgwMiwKKwkgMHhEMCwgMHg4MCwgMHgwMCwgMHg2NCwgMHg1QSwgMHhEMCwgMHgwNiwgMHgwMiwgMHhEMCwgMHg4MCwgMHhGOCwgMHg3RiwgMHhEMCwgMHg4MCwgMHgwMSwgMHgwMywKKwkgMHgwMSwgMHgwMiwgMHgwMSwgMHg2MSwgMHg2MiwgMHg0MywgMHg0NiwgMHg0MywgMHgzQywgMHg0NiwgMHgwNywgMHhGNCwgMHgzNiwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHhBMywgMHg0NiwgMHg2MCwgMHg0MCwgMHgyMiwgMHgyNiwgMHg1QywgMHgwMCwgMHg2MCwgMHg0NSwgMHg2MywgMHg0MiwgMHg1QSwgMHhEMCwgMHhDRCwgMHg4MSwKKwkgMHgzQywgMHg0NiwgMHgxNCwgMHgwMiwgMHg2NCwgMHg0NCwgMHg4OCwgMHgzQSwgMHgxMSwgMHgwMCwgMHg4RSwgMHgzQiwgMHgwRiwgMHgwMCwgMHg2NSwgMHg0NCwKKwkgMHgwMSwgMHgyNiwgMHg3QSwgMHgwMCwgMHgwNCwgMHgyNiwgMHgwMywgMHgwMCwgMHgxMCwgMHgyNiwgMHgwMSwgMHgwMCwgMHgyRCwgMHgwMCwgMHhBMywgMHg0NiwKKwkgMHgzNywgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyQiwgMHg2RiwgMHgwMCwgMHg1NiwgMHgwMCwgMHhBMywgMHg0NiwgMHg2NSwgMHg0NCwKKwkgMHgwMSwgMHgyNiwgMHgwQiwgMHgwMCwgMHgwNCwgMHgyNiwgMHgwMywgMHgwMCwgMHgxMCwgMHgyNiwgMHgwMSwgMHgwMCwgMHgxRCwgMHgwMCwgMHgzNywgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyNywgMHg0OCwgMHgwMCwgMHgxNywgMHgwMCwgMHhBOSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NiwKKwkgMHgzNiwgMHhGMiwgMHg2NiwgMHg0MywgMHhGRiwgMHhCNCwgMHgzQywgMHg0NiwgMHgyMiwgMHhGMCwgMHg2MCwgMHg0NywgMHhCMCwgMHg4NCwgMHgyMiwgMHhGQSwKKwkgMHg2MywgMHg0NiwgMHgzNywgMHhGMCwgMHg2MCwgMHg0MCwgMHgwNCwgMHgyNywgMHgwMywgMHgwMCwgMHgxMCwgMHgyNywgMHgwMSwgMHgwMCwgMHgwNCwgMHgwMCwKKwkgMHg2NCwgMHg0MCwgMHg4MCwgMHgyNywgMHgzMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzQywgMHg0NiwgMHgwMiwgMHg2NSwgMHhCNywgMHg2MCwgMHg2NiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhDRCwgMHg4MSwgMHg2MywgMHg0MiwgMHg1QSwgMHhEMCwgMHgzQywgMHg0NiwgMHgyNiwgMHgwMiwgMHg2NCwgMHg0NCwgMHg4OCwgMHgzQSwKKwkgMHgyMywgMHgwMCwgMHg3NywgMHgzNywgMHgzOSwgMHgwMCwgMHg3OCwgMHgzNywgMHgzNywgMHgwMCwgMHg4RSwgMHgzNywgMHgzNSwgMHgwMCwgMHhGMSwgMHgwMSwKKwkgMHgyRCwgMHg2MCwgMHg1MiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgyRCwgMHgwMCwgMHgwNywgMHgwMCwKKwkgMHgyRCwgMHg2MCwgMHg1MiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHhFMiwgMHgwMSwgMHgzQywgMHg0NiwKKwkgMHgzRSwgMHhGMiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NSwgMHhGMCwgMHg4NCwgMHhBNCwgMHg4NCwgMHgxOCwgMHhGQSwgMHgyQSwgMHhGMiwgMHhCRiwgMHg2MCwKKwkgMHhGRiwgMHg2NSwgMHhBNCwgMHg4NCwgMHgyQSwgMHhGQSwgMHgxOCwgMHgwMCwgMHgzQywgMHg0NiwgMHgyMiwgMHhGMCwgMHg4MCwgMHg2NywgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQSwgMHhGRiwgMHhGRiwgMHgzRiwgMHhGMiwgMHgzRSwgMHhGMCwgMHgwOCwgMHhBNCwgMHg2MCwgMHg0MSwgMHgyMiwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwMywgMHgwMCwgMHgwNCwgMHgyNiwgMHgwMywgMHgwMCwgMHgwNiwgMHgwMCwgMHgwNCwgMHgyQiwgMHgwNCwgMHgwMCwKKwkgMHg2MSwgMHg0NCwgMHg2NCwgMHg0MCwgMHgxMCwgMHgyNiwgMHgzRiwgMHhGQSwgMHgzQywgMHg0NiwgMHgyQywgMHhGMiwgMHgyNywgMHg0MCwgMHgwMSwgMHgyNywKKwkgMHgzMiwgMHhGMiwgMHhENSwgMHhGMSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHg1MywgMHgwMCwgMHgwOSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhEMCwgMHg4MCwKKwkgMHgzRiwgMHhGMiwgMHgwOSwgMHgwNiwgMHgyQywgMHg0NSwgMHhDNCwgMHg4NCwgMHhEMCwgMHg4MCwgMHg0MCwgMHg0QSwgMHg0MCwgMHgwNiwgMHg2MCwgMHg0MywKKwkgMHg2NCwgMHg0NCwgMHg1NCwgMHg4OCwgMHgxOCwgMHgwMCwgMHg2MCwgMHg0NSwgMHgyOCwgMHg2MCwgMHgzNiwgMHg2NCwgMHhBMCwgMHhEMywgMHhEQiwgMHhGMywKKwkgMHgwMCwgMHhCQywgMHg2MCwgMHg0NywgMHhFQywgMHhBMCwgMHgzMywgMHgwMywgMHgzMiwgMHgwNywgMHgyQywgMHg0NCwgMHhDNCwgMHg4MSwgMHgwMiwgMHg2MCwKKwkgMHgxQywgMHg2NSwgMHg0NSwgMHg0QSwgMHhENSwgMHg4MCwgMHgyQywgMHg0NSwgMHgyQSwgMHgwNiwgMHgyNywgMHg0MCwgMHgwNCwgMHgyNywgMHgzMCwgMHgwMCwKKwkgMHgyQSwgMHg0MywgMHhENywgMHg4NSwgMHg0NSwgMHg0OCwgMHhENiwgMHhGMSwgMHgwRiwgMHhGMiwgMHhEMywgMHg4MCwgMHgwMSwgMHg2NSwgMHgwMSwgMHgwNywKKwkgMHgwMCwgMHg2NSwgMHhCNCwgMHg4NCwgMHgwRiwgMHhGQSwgMHgwMCwgMHg2MywgMHgzRiwgMHhGMiwgMHgyOCwgMHg0NSwgMHg2MCwgMHg0MSwgMHhENCwgMHg4NCwKKwkgMHhERiwgMHg4MywgMHhGQywgMHgwNywgMHgxNCwgMHhGQywgMHg2MSwgMHg0NCwgMHgwMSwgMHgzNiwgMHgwMiwgMHgwMCwgMHgwOSwgMHgzQSwgMHgwNiwgMHgwMCwKKwkgMHgyOCwgMHg0NCwgMHg0OCwgMHg4OCwgMHgyQSwgMHg0NCwgMHhDOCwgMHg4MywgMHg0MywgMHg0QSwgMHhFNSwgMHgwMSwgMHgxNywgMHhGQSwgMHgwNCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHgyNywgMHg0NSwgMHhCNCwgMHg4NCwgMHgyQSwgMHhGQSwgMHgyOCwgMHg0MywgMHgxNiwgMHhGQywgMHgwRCwgMHgwMCwgMHgzRiwgMHhGMiwKKwkgMHgyQywgMHg0NSwgMHhENiwgMHhGMSwgMHhDNCwgMHg4MSwgMHhEMSwgMHg4MCwgMHgwRiwgMHhGMiwgMHgwMSwgMHgwNiwgMHgwMSwgMHhCQywgMHgwRiwgMHhGQSwKKwkgMHgzRiwgMHhGMiwgMHgxNywgMHhGQSwgMHgwMSwgMHg2NCwgMHgxNCwgMHhGQSwgMHgwNywgMHhGMCwgMHg2NiwgMHg0MywgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMCwKKwkgMHg2MywgMHg0NiwgMHgwMCwgMHg3RiwgMHg2NCwgMHg1RSwgMHg0QiwgMHhGQiwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RSwgMHhEQiwgMHhGQiwgMHg3QywgMHhGMSwKKwkgMHg2MCwgMHg0MywgMHg2MCwgMHg0NywgMHhEMCwgMHg4MCwgMHhDMCwgMHg2NSwgMHgwMSwgMHgwNiwgMHg2NCwgMHg0NCwgMHgwQSwgMHgzNiwgMHg3MCwgMHg2NCwKKwkgMHgxNCwgMHgzNiwgMHgzOCwgMHg2NCwgMHgzNywgMHgzNiwgMHgxNSwgMHg2NCwgMHg2RSwgMHgzNiwgMHgwQiwgMHg2NCwgMHg0NCwgMHg4NiwgMHgyQSwgMHhGMiwKKwkgMHgwNywgMHhGMCwgMHg2MCwgMHg0MCwgMHhCMCwgMHgzQSwgMHgwMywgMHgwMCwgMHg0MCwgMHgzQiwgMHgwMSwgMHgwMCwgMHgxMiwgMHgwMCwgMHgwQywgMHhCNCwKKwkgMHgwOCwgMHgzQSwgMHg1NSwgMHgwMCwgMHgyMiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyQiwgMHg1MCwgMHgwMCwgMHgxNywgMHhGMiwKKwkgMHgyMiwgMHhGMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgyMiwgMHgyMiwgMHgwNCwgMHgwMCwgMHgwMCwgMHhBOCwgMHgwMSwgMHhBOCwgMHg0NywgMHgwMywKKwkgMHg0NiwgMHgwMywgMHgzQywgMHg0NiwgMHgyQSwgMHhGMCwgMHg0MCwgMHg2NywgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHg2MCwgMHg0NSwgMHgyMiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MywgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwMywgMHgwMCwgMHgwNCwgMHgyNiwgMHgwQSwgMHgwMCwgMHgwMiwgMHgwMCwKKwkgMHgwNCwgMHgyNywgMHgwNywgMHgwMCwgMHg2NSwgMHg0NCwgMHgyQSwgMHg2NSwgMHg2MCwgMHg0MCwgMHgwMywgMHgyQiwgMHgyNCwgMHg2NSwgMHg0NSwgMHg0QywKKwkgMHgyRSwgMHgwMCwgMHg2NSwgMHg0NCwgMHgyRSwgMHg2NSwgMHg2MCwgMHg0MCwgMHgwMywgMHgyQiwgMHgyOCwgMHg2NSwgMHg0NSwgMHg0QywgMHgwNywgMHhGMCwKKwkgMHhBOSwgMHhGMywgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHgwMCwgMHg3QywgMHgwMywgMHgwMywgMHg2MywgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMSwgMHgwMCwKKwkgMHgzRCwgMHhGMSwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwOCwgMHhCMCwgMHgzRSwgMHhGMiwgMHgxOSwgMHgwMywgMHg2MCwgMHg0NywgMHhFOCwgMHg4NCwKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgwMywgMHhCNCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxMSwgMHgwMywgMHgyNCwgMHg2MCwgMHg2RSwgMHg2MiwKKwkgMHgyNCwgMHg2MCwgMHg0NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgzQywgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHg1QywgMHg1QywgMHhGQywgMHhGQywgMHhDRSwgMHhGRSwgMHhCMCwgMHg2MCwgMHhFMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEQiwgMHhGMSwKKwkgMHgyQywgMHg0NSwgMHg2NCwgMHg0MywgMHgxNywgMHhGMiwgMHg0QiwgMHhGMSwgMHhDNCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4MSwKKwkgMHg2MywgMHg0MCwgMHgzNywgMHgzNywgMHhFMSwgMHg4MSwgMHg2NCwgMHg0NSwgMHhCMCwgMHg2MCwgMHg1OCwgMHg0RCwgMHhCNiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhBRSwgMHg4MiwgMHhGQywgMHhBMiwgMHgwQSwgMHgwMywgMHg2MywgMHg0MCwgMHg2RSwgMHgzQiwgMHgwNiwgMHgwMCwgMHg2MCwgMHg0MSwgMHgwNCwgMHgwRCwKKwkgMHg2MywgMHg0NCwgMHg4MCwgMHg3RSwgMHhEQiwgMHhGQiwgMHg2MSwgMHg0NCwgMHhEQywgMHg4NCwgMHgyQiwgMHhGMCwgMHgxQiwgMHhGQSwgMHg2NCwgMHg0NCwKKwkgMHg4MCwgMHgyNywgMHgzNCwgMHgwMCwgMHgxNiwgMHhGMiwgMHgwRiwgMHhGMCwgMHhBQywgMHg4NCwgMHgyQywgMHg0NSwgMHgyOSwgMHgwMywgMHg0QiwgMHhGMSwKKwkgMHhDNCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4MSwgMHg2MywgMHg0MCwgMHgzNywgMHgzNywgMHhFMSwgMHg4MSwgMHg2NCwgMHg0NSwKKwkgMHgwRiwgMHhGMCwgMHhCMCwgMHg2MCwgMHg1OCwgMHg0RCwgMHhCNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBRSwgMHg4MiwgMHhGQywgMHhBMiwgMHgwQSwgMHgwMywKKwkgMHg2MywgMHg0MCwgMHg2RSwgMHgzQiwgMHgwNiwgMHgwMCwgMHg2MCwgMHg0MSwgMHgwNCwgMHgwRCwgMHg4MCwgMHg2NywgMHhCMCwgMHg4NCwgMHgwRiwgMHhGQSwKKwkgMHg2MSwgMHg0NCwgMHhEQywgMHg4NCwgMHgxRCwgMHhGQSwgMHhERSwgMHg2NSwgMHhDNCwgMHg4NSwgMHgyNiwgMHg0MSwgMHhFMSwgMHg4MSwgMHhDNSwgMHg4NCwKKwkgMHgyQiwgMHhGQSwgMHgxQiwgMHhGMCwgMHhERSwgMHg2NCwgMHhDMCwgMHg4NSwgMHgyNiwgMHg0NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NCwgMHgxMCwgMHhGQSwKKwkgMHgyNiwgMHg0NCwgMHgyQywgMHhGMCwgMHgwQSwgMHhBNCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwMCwgMHg2NCwgMHgxMSwgMHhGQSwgMHhEQiwgMHhGMywKKwkgMHgxMywgMHhGQSwgMHhGRiwgMHhGRiwgMHgwRCwgMHhGMiwgMHgzRSwgMHhGMCwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwgMHg2NCwgMHg0MSwgMHgwMSwgMHhCMSwKKwkgMHgwMSwgMHg2MywgMHgxRCwgMHgwMiwgMHg2MCwgMHg0MSwgMHhGRiwgMHgyMiwgMHgwNCwgMHgwMCwgMHhCMCwgMHg2MCwgMHg1OCwgMHg0RiwgMHhBNywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHg5MiwgMHg2NCwgMHhBMCwgMHhERCwgMHgyRCwgMHg2MCwgMHg1QSwgMHg2MiwgMHhBMiwgMHhEMywgMHhCMCwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgwMSwgMHg2MywgMHg2MSwgMHg0MCwgMHhGRiwgMHgyMiwgMHgwNCwgMHgwMCwKKwkgMHhCMCwgMHg2MCwgMHg1OCwgMHg0RiwgMHhBNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHg5NCwgMHg2NCwgMHhBMCwgMHhERCwgMHgyQSwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyNywgMHgwMywgMHgwMCwgMHhCNSwgMHg2MCwgMHgxOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMiwgMHhGMiwKKwkgMHg0NiwgMHg0MywgMHg2MCwgMHg0MCwgMHgyMiwgMHgyNiwgMHg4QiwgMHgwMCwgMHgwMSwgMHgyNiwgMHgwNSwgMHgwMCwgMHgwNCwgMHgyNiwgMHgwQywgMHgwMCwKKwkgMHhCNSwgMHg2MCwgMHgxOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgyNywgMHgwMywgMHgwMCwgMHhCNSwgMHg2MCwgMHgxOSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhBOSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NiwgMHgwMiwgMHgwMCwgMHgwNywgMHhGNCwgMHhGRiwgMHhGRiwgMHhBMywgMHg0NiwgMHgyQSwgMHhGMiwKKwkgMHhBMywgMHg0NiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyNywgMHgzQiwgMHgwMCwgMHhBOSwgMHhGMywgMHg2NiwgMHg1QywgMHhEMCwgMHg4MCwgMHgzNywgMHhGMCwKKwkgMHgwOCwgMHgwMywgMHg2NCwgMHg0MCwgMHgxMCwgMHgyQSwgMHgxMiwgMHgwMCwgMHhGRiwgMHg2MCwgMHhFRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHgzNywgMHhGQSwKKwkgMHgyNCwgMHgwMCwgMHgzRCwgMHhGMywgMHgwMSwgMHg2MSwgMHg2MCwgMHg0MywgMHhDRiwgMHg4MywgMHhFMSwgMHg4MSwgMHhGRCwgMHgwRCwgMHhFOSwgMHg4MSwKKwkgMHhBMSwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHg5MSwgMHg4NCwgMHgzNywgMHhGQSwgMHgxNywgMHgwMCwgMHg0NywgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHgxMCwgMHhBMCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNCwgMHhGRiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhEQywgMHg4NCwgMHg0NywgMHhGQSwgMHg0NiwgMHhGMiwKKwkgMHgxNiwgMHgwNCwgMHhEQywgMHg4NCwgMHg0NiwgMHhGQSwgMHg0NSwgMHhGMiwgMHgwOCwgMHgwNCwgMHhEQywgMHg4NCwgMHg0NSwgMHhGQSwgMHgwNSwgMHgwNCwKKwkgMHgzNywgMHhGMiwgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgzNywgMHhGQSwgMHgwRCwgMHg2MCwgMHgzRSwgMHg2MiwgMHg4MCwgMHhGRiwKKwkgMHg3OCwgMHg0NCwgMHgwMywgMHhBNCwgMHhBMiwgMHhEQiwgMHhCRSwgMHg2MCwgMHg2NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4NCwgMHhGRiwgMHgwRCwgMHg2MCwKKwkgMHgzRSwgMHg2MiwgMHg4MCwgMHhGRiwgMHg3OCwgMHg0NCwgMHgwMywgMHhBNCwgMHhBMiwgMHhEQiwgMHhCRSwgMHg2MCwgMHhERSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg4NCwgMHhGRiwgMHhBOSwgMHhGMywgMHg2NiwgMHg1QywgMHhEMCwgMHg4MCwgMHgwMCwgMHg3QywgMHgwNywgMHgwMywgMHg2NiwgMHg0MywgMHgzQywgMHg0NiwKKwkgMHgyMiwgMHhGMiwgMHg2MywgMHg0NiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMSwgMHgwMCwgMHgzQywgMHhGMSwgMHg0NywgMHhGMCwgMHg2NCwgMHg0MSwKKwkgMHg2NCwgMHg0NywgMHhGRiwgMHhCNCwgMHg2MCwgMHg1RiwgMHgyMCwgMHhCQywgMHg4MCwgMHgyNiwgMHg4MCwgMHhBQywgMHg2MCwgMHg0NywgMHhBMywgMHg0NiwKKwkgMHgzQSwgMHhGQSwgMHg2NCwgMHg0NCwgMHgyMCwgMHg3RiwgMHgzNCwgMHg5NCwgMHgzQiwgMHhGQSwgMHhBMywgMHg0NiwgMHg0NiwgMHhGMiwgMHg0NSwgMHhGMCwKKwkgMHhBMywgMHg0NiwgMHgzQywgMHhGQSwgMHgzRCwgMHhGOCwgMHgwOCwgMHg2MCwgMHgwMCwgMHhFQSwgMHgwRiwgMHg2NCwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQSwgMHg4QSwgMHgwMCwgMHgyQSwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyNywgMHgzNSwgMHgwMCwgMHgyQSwgMHhGMiwgMHgwMCwgMHg2MCwgMHg3QywgMHg2MiwgMHg2MCwgMHg0MCwKKwkgMHg0MCwgMHgyQiwgMHgyNywgMHgwMCwgMHhBMiwgMHhEMywgMHgwMCwgMHg2MSwgMHg2MCwgMHhGRSwgMHhBMCwgMHhEMywgMHhERSwgMHg4MiwgMHhBMiwgMHhEMSwKKwkgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHg2NCwgMHg1RiwgMHhEQywgMHg4NCwgMHhGMSwgMHg4MSwgMHhDMCwgMHgyQiwgMHgwNCwgMHgwMCwgMHg4MCwgMHgyQSwKKwkgMHgwMiwgMHgwMCwgMHg3RiwgMHhBNCwgMHhEQywgMHg4NCwgMHhGRiwgMHgzQiwgMHgwMywgMHgwMCwgMHg2MCwgMHg0NywgMHhEQywgMHg4NywgMHgwMSwgMHg2MSwKKwkgMHhDMCwgMHg4MCwgMHgwMCwgMHgzNiwgMHhEQywgMHg4NCwgMHg0RSwgMHhEQiwgMHg2MCwgMHhGRSwgMHhEQSwgMHg4MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwKKwkgMHhDMSwgMHg4NCwgMHhGMCwgMHgyMiwgMHgxMCwgMHhBNCwgMHhGMCwgMHgyQSwgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyMCwgMHhGRSwgMHgwMCwgMHg2MCwgMHg3QywgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhBMCwgMHhEMywgMHg1QSwgMHhEMSwgMHgzQSwgMHhGQSwKKwkgMHgzQiwgMHhGOCwgMHg3NCwgMHg2MiwgMHhBMiwgMHhEMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NCwgMHhFMCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywKKwkgMHhFMSwgMHg3RiwgMHg1QSwgMHhEMCwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFMiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgwMCwgMHg2MCwgMHg4MCwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhBMCwgMHhEMSwgMHg1QSwgMHhEMSwgMHg2NCwgMHg0NSwgMHg2NCwgMHg0NCwgMHhFMywgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHg2NCwgMHg0NywgMHhFNCwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFNSwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywKKwkgMHhFNiwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFNywgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NSwgMHg0MCwgMHgwRCwgMHgzQSwKKwkgMHgxQywgMHgwMCwgMHg2NCwgMHg0NywgMHhFOCwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFOSwgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHg2NCwgMHg0NywgMHhFQSwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFQiwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywKKwkgMHhFQywgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFRCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFRSwgMHg3RiwKKwkgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFRiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgwOCwgMHg2MCwgMHgwMCwgMHhFQSwgMHg2NSwgMHg0NCwKKwkgMHgwMiwgMHhBNCwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhEMSwgMHg2MCwKKwkgMHgwMCwgMHhFQSwgMHgwMiwgMHg2NCwgMHgzQiwgMHhEQiwgMHhCOCwgMHg2MCwgMHhCRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHhGQywgMHhGQiwKKwkgMHgwNywgMHhGMCwgMHgwMCwgMHg2NCwgMHhEMCwgMHg4MCwgMHhBOSwgMHhGMywgMHgxNywgMHgwMywgMHhEMCwgMHg4MCwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwKKwkgMHg2RiwgMHhGMiwgMHg2MSwgMHg0NiwgMHg3QiwgMHgwMywgMHg2MCwgMHg0MCwgMHgwMCwgMHgzNiwgMHg3OCwgMHgwMCwgMHg0NywgMHhGMSwgMHgwNywgMHhGMCwKKwkgMHg2NCwgMHg0MCwgMHgwMiwgMHgyNiwgMHgwMSwgMHgwMCwgMHgwQiwgMHgwMCwgMHgwMywgMHgxMiwgMHhCNiwgMHg2MCwgMHgzOCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhGQywgMHgwQSwgMHhCNywgMHg2MCwgMHg1NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCNywgMHg2MCwgMHg1NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0MSwKKwkgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMiwgMHg2MCwgMHg0NSwgMHg2MSwgMHg0NiwgMHgxMCwgMHg3RSwgMHg0RSwgMHhGQiwgMHg2NSwgMHg0NCwgMHg2MCwgMHg0MCwKKwkgMHgwMSwgMHgzNiwgMHg1QywgMHgwMCwgMHgwMiwgMHgzNiwgMHg1RCwgMHgwMCwgMHgwMywgMHgzNiwgMHgzNCwgMHgwMCwgMHgwNCwgMHgzNiwgMHg0NSwgMHgwMCwKKwkgMHg2NywgMHgwMCwgMHgwMCwgMHg2NCwgMHg0QywgMHhGQiwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwNSwgMHg3RSwKKwkgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgwMCwgMHg2NSwgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwgMHg4QywgMHhGQSwKKwkgMHgwMCwgMHhBOCwgMHg2RiwgMHhGMiwgMHgxNSwgMHgwMywgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHgwMCwgMHhCQiwgMHhGRiwgMHhBMCwKKwkgMHgwNywgMHgwMywgMHgwRSwgMHgwNiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwgMHgwOCwgMHgwMCwKKwkgMHhCOSwgMHg4MSwgMHhFOCwgMHg4NCwgMHhEOSwgMHg4MSwgMHhGRCwgMHgwNCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwKKwkgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMiwgMHg2MSwgMHg0NiwgMHhGRiwgMHhGRiwgMHhBMCwgMHg3RSwKKwkgMHg0RSwgMHhGQiwgMHgyNCwgMHgwMCwgMHg0QywgMHhGMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHg0QywgMHhGQiwgMHhDQiwgMHhGMywgMHg2MCwgMHg0NSwKKwkgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxQiwgMHgwMiwgMHgyNCwgMHg2MCwgMHhBNiwgMHg2MiwgMHgwRiwgMHg2MCwgMHg5NiwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHhCQywgMHgwMSwgMHg0QywgMHhGMywgMHg2NiwgMHg0MSwgMHhEQywgMHg4NCwKKwkgMHg0QywgMHhGQiwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMywgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwgMHg2NiwgMHg0MSwKKwkgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMiwgMHg2MSwgMHg0NiwgMHhGRiwgMHhGRiwgMHhBNCwgMHg3RSwgMHg0RSwgMHhGQiwgMHhCNywgMHg2MCwgMHg1NiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMSwgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwKKwkgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMiwgMHg2MSwgMHg0NiwgMHhGRiwgMHhGRiwgMHhBOCwgMHg3RSwgMHg0RSwgMHhGQiwgMHhFRSwgMHgwMSwKKwkgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHg4QywgMHhGQSwgMHg2MCwgMHg0NywgMHg3MCwgMHhGMiwgMHhGRiwgMHhCNSwgMHgwOCwgMHgxOCwKKwkgMHhFNCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwgMHhGQiwgMHgwNCwgMHgwMSwgMHg2NCwgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NCwKKwkgMHgwQywgMHhGNCwgMHgwMCwgMHhBOCwgMHhGRiwgMHhGRiwgMHhERCwgMHgwMiwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0NywgMHg3MCwgMHhGMiwgMHhGRiwgMHhCNSwgMHg2MSwgMHg0NiwgMHgwMCwgMHhBOCwgMHhGRiwgMHhGRiwgMHgyOSwgMHgwMywgMHhFMCwgMHg4NCwKKwkgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGQSwgMHg2MSwgMHg0NiwgMHgwMSwgMHg2NSwKKwkgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwgMHg4QywgMHhGQSwgMHgwMCwgMHhBOCwgMHg2RiwgMHhGMiwgMHgxNSwgMHgwMywKKwkgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHgwMCwgMHhCQiwgMHhGRiwgMHhBMCwgMHgwNywgMHgwMywgMHgwRSwgMHgwNiwgMHhFOCwgMHg4NCwKKwkgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwgMHgwOCwgMHgwMCwgMHhCOSwgMHg4MSwgMHhFOCwgMHg4NCwgMHhEOSwgMHg4MSwKKwkgMHhGRCwgMHgwNCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwgMHg5NSwgMHgwMSwKKwkgMHg5NCwgMHgwMSwgMHg2NSwgMHg0NCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHhBMSwgMHgwMSwgMHgwMiwgMHgzNiwgMHgwMSwgMHgwMCwgMHg5RSwgMHgwMSwKKwkgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMSwgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgwMCwgMHg2NSwKKwkgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwgMHg4QywgMHhGQSwgMHgwMCwgMHhBOCwgMHg2RiwgMHhGMiwgMHgxNSwgMHgwMywKKwkgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHgwMCwgMHhCQiwgMHhGRiwgMHhBMCwgMHgwNywgMHgwMywgMHgwRSwgMHgwNiwgMHhFOCwgMHg4NCwKKwkgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwgMHgwOCwgMHgwMCwgMHhCOSwgMHg4MSwgMHhFOCwgMHg4NCwgMHhEOSwgMHg4MSwKKwkgMHhGRCwgMHgwNCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0MSwKKwkgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMiwgMHg2MSwgMHg0NiwgMHhEMCwgMHg3RSwgMHg0RSwgMHhGQiwgMHhCNywgMHg2MCwgMHg1NiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0NSwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMiwgMHg2MSwgMHg0NiwgMHgyMCwgMHg3RSwgMHg0RSwgMHhGQiwgMHg2NSwgMHg0NCwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwQiwgMHgwMCwgMHgwMiwgMHgzNiwgMHgxQSwgMHgwMCwgMHgwMywgMHgzNiwgMHg1MywgMHgwMCwgMHgwNCwgMHgzNiwKKwkgMHg3MCwgMHgwMCwgMHgwNSwgMHgzNiwgMHgxNCwgMHgwMCwgMHhCNywgMHg2MCwgMHg1NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHhGMCwgMHg2NiwgMHg0MSwKKwkgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMiwgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwKKwkgMHgwRSwgMHhGMiwgMHg2MSwgMHg0NiwgMHhCMCwgMHg3RSwgMHg0RSwgMHhGQiwgMHhCNywgMHg2MCwgMHg1NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHhGMCwKKwkgMHgwMSwgMHg2NSwgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwgMHg4QywgMHhGQSwgMHgwMCwgMHhBOCwgMHg2RiwgMHhGMiwKKwkgMHgxNSwgMHgwMywgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHgwMCwgMHhCQiwgMHhGRiwgMHhBMCwgMHgwNywgMHgwMywgMHgwRSwgMHgwNiwKKwkgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwgMHgwOCwgMHgwMCwgMHhCOSwgMHg4MSwgMHhFOCwgMHg4NCwKKwkgMHhEOSwgMHg4MSwgMHhGRCwgMHgwNCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwKKwkgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHgwMCwgMHg2MywgMHgwMywgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwgMHg0QywgMHhGRCwKKwkgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMiwgMHg2MSwgMHg0NiwgMHhCNCwgMHg3RSwgMHg0RSwgMHhGQiwgMHgyNCwgMHg2MCwgMHhBNiwgMHg2MiwKKwkgMHgwRiwgMHg2MCwgMHg5NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHhCNywgMHg2MCwKKwkgMHg1NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwgMHg0QywgMHhGMywgMHgwMiwgMHhCMCwgMHg2MSwgMHg0NiwKKwkgMHhDQywgMHg4NCwgMHgwNSwgMHgwMywgMHgwNCwgMHgyOCwgMHg0QywgMHhGQiwgMHhCNywgMHg2MCwgMHg1NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgyOCwKKwkgMHg0QywgMHhGQiwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwNCwgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwKKwkgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMiwgMHg2MSwgMHg0NiwgMHhCOCwgMHg3RSwgMHg0RSwgMHhGQiwgMHhCNywgMHg2MCwgMHg1NiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwKKwkgMHg2MSwgMHg0NiwgMHhGRiwgMHhBMCwgMHhGRiwgMHhGRiwgMHgzNSwgMHgwNiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwKKwkgMHhGQiwgMHgwNCwgMHgyRiwgMHgwMCwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGQSwgMHgwMSwgMHg2NSwgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwKKwkgMHg3MCwgMHhGMiwgMHg4QywgMHhGQSwgMHgwMCwgMHhBOCwgMHg2RiwgMHhGMiwgMHgxNSwgMHgwMywgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwKKwkgMHgwMCwgMHhCQiwgMHhGRiwgMHhBMCwgMHgwNywgMHgwMywgMHgwRSwgMHgwNiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwKKwkgMHhGQiwgMHgwNCwgMHgwOCwgMHgwMCwgMHhCOSwgMHg4MSwgMHhFOCwgMHg4NCwgMHhEOSwgMHg4MSwgMHhGRCwgMHgwNCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwKKwkgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwgMHg2RiwgMHhGMiwgMHgwMCwgMHg2MywgMHgwMywgMHg3RSwgMHg2RiwgMHhGQSwKKwkgMHgzQywgMHg0NiwgMHg0QywgMHhGRCwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMiwgMHg2MSwgMHg0NiwgMHhDMCwgMHg3RSwgMHg0RSwgMHhGQiwKKwkgMHg1RCwgMHgwMCwgMHg1QywgMHgwMCwgMHg2NSwgMHg0NCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwMywgMHgwMCwgMHgwMiwgMHgzNiwgMHgxOCwgMHgwMCwKKwkgMHg1NSwgMHgwMCwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwgMHg2MSwgMHg0NiwgMHgwMSwgMHhCMCwgMHhGRiwgMHhGRiwgMHg0RSwgMHgwMiwKKwkgMHgwNywgMHhGMCwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMiwgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwKKwkgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMiwgMHg2MSwgMHg0NiwgMHhFMCwgMHg3RSwgMHg0RSwgMHhGQiwgMHgzRiwgMHgwMCwgMHgzRSwgMHgwMCwKKwkgMHgwNywgMHhGMCwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMSwgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MCwgMHg0NywKKwkgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHg2MSwgMHg0NiwgMHhGRiwgMHhBMCwgMHhGRiwgMHhGRiwgMHhGMSwgMHgwNiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwgMHhFQiwgMHgwMSwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGQSwgMHg2MSwgMHg0NiwKKwkgMHgwMCwgMHg2NSwgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwgMHg4QywgMHhGQSwgMHgwMCwgMHhBOCwgMHg2RiwgMHhGMiwKKwkgMHgxNSwgMHgwMywgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHgwMCwgMHhCQiwgMHhGRiwgMHhBMCwgMHgwNywgMHgwMywgMHgwRSwgMHgwNiwKKwkgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwgMHgwOCwgMHgwMCwgMHhCOSwgMHg4MSwgMHhFOCwgMHg4NCwKKwkgMHhEOSwgMHg4MSwgMHhGRCwgMHgwNCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwKKwkgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMiwgMHg2MSwgMHg0NiwgMHhFNCwgMHg3RSwgMHg0RSwgMHhGQiwgMHgwMywgMHg2NCwgMHgzQiwgMHhEQiwKKwkgMHhDQSwgMHhGRSwgMHg0NywgMHhGMSwgMHgwMSwgMHg2NSwgMHgzMiwgMHg0MCwgMHgwNCwgMHgyNywgMHgwOCwgMHgwMCwgMHgyQywgMHhGMiwgMHg2NCwgMHg0NSwKKwkgMHgwMiwgMHgyMiwgMHgwNCwgMHgwMCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwMSwgMHgwMCwgMHhFMywgMHgwMCwgMHgxNCwgMHhGMiwgMHg2NSwgMHg0MCwKKwkgMHgwMSwgMHgyNiwgMHgxRCwgMHgwMCwgMHg2MCwgMHg0NSwgMHgwNSwgMHg2NCwgMHgzQiwgMHhEQiwgMHg2NSwgMHg0NCwgMHhDQywgMHg4NSwgMHhCOCwgMHhGMSwKKwkgMHgyNywgMHg2MCwgMHg3OCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwKKwkgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwKKwkgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHhBRiwgMHgwMCwgMHg2MCwgMHg0MSwKKwkgMHgyQSwgMHhGMCwgMHgwMCwgMHg2MCwgMHgwQywgMHg2NCwgMHhBMCwgMHg4NCwgMHgwNCwgMHgzNiwgMHgwMiwgMHgwMCwgMHgwQywgMHgzQSwgMHgwMSwgMHgwMCwKKwkgMHhBNSwgMHgwMCwgMHg2MSwgMHg0NSwgMHg2MCwgMHg0MSwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg3OCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwKKwkgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHg2MSwgMHg0MCwgMHgwOCwgMHgzNiwgMHgwMSwgMHgwMCwgMHg4OCwgMHgwMCwgMHgxNCwgMHhGMiwgMHgxQywgMHg2NSwKKwkgMHg2MCwgMHg0MSwgMHgwMCwgMHg2MywgMHhDRCwgMHg4MSwgMHhDNywgMHg4MywgMHhGRCwgMHgwMiwgMHgzRiwgMHhGMCwgMHgyQywgMHhGMiwgMHhDMywgMHg4MywKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgyOSwgMHgwMCwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg3NiwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwKKwkgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg3QywgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHg2MywgMHg0NSwgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywKKwkgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QSwgMHhGRiwKKwkgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHg1MiwgMHgwMCwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg3NCwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwKKwkgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg3QSwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHg2MywgMHg0NSwgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwKKwkgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgxNSwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwRiwgMHhCNCwgMHgwMCwgMHhBOCwKKwkgMHgwMSwgMHhBOCwgMHgyNCwgMHgwMywgMHgxMiwgMHgwMywgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg4MiwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwKKwkgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgxMSwgMHgwMCwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg4MCwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwKKwkgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgwNCwgMHg2NCwgMHgzQiwgMHhEQiwKKwkgMHgyNCwgMHg2MCwgMHg2RSwgMHg2MiwgMHgyNCwgMHg2MCwgMHg0NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgzQywgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHg1QywgMHg1QywgMHhGQywgMHhGQywgMHhDRSwgMHhGRSwgMHhCMCwgMHg2MCwgMHhFMSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwRiwgMHhGMCwgMHgxNSwgMHhGMiwgMHg2NCwgMHg0MSwgMHgwMSwgMHgyQSwgMHgwMiwgMHgwMCwgMHhEMSwgMHhGMSwgMHgwMiwgMHgwMCwKKwkgMHhEMCwgMHhGMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NSwgMHhEQywgMHg4NCwgMHhENCwgMHg4MCwgMHgxNSwgMHhGQSwgMHgzMCwgMHgwNywgMHg2MSwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgwOSwgMHgwMCwgMHgyNywgMHg2MCwgMHhBOCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHgwOCwgMHgwMCwgMHgyNywgMHg2MCwgMHhBQSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHgyQSwgMHhGMCwgMHgwOCwgMHg2NywgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHgwMCwgMHg2NCwKKwkgMHg0OCwgMHhGQiwgMHgyRCwgMHg2MCwgMHg1MiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwQywgMHgwMCwKKwkgMHgzQywgMHg0NiwgMHgzRSwgMHhGMiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NSwgMHhGMCwgMHg4NCwgMHhBNCwgMHg4NCwgMHgxOCwgMHhGQSwgMHgyQSwgMHhGMiwKKwkgMHhCRiwgMHg2MCwgMHhGRiwgMHg2NSwgMHhBNCwgMHg4NCwgMHgyQSwgMHhGQSwgMHhCMiwgMHg2MCwgMHhGQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwKKwkgMHg0OSwgMHhGQiwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg4MiwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwKKwkgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg4NCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwKKwkgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwKKwkgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgyRCwgMHg2MCwgMHg1QSwgMHg2MywgMHhBMywgMHhEMywgMHhCMCwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRCwgMHhGMiwgMHg2MCwgMHg1QywgMHg2NCwgMHg1RiwgMHgwRCwgMHhGQSwgMHgyMywgMHhGMCwgMHgwMSwgMHg2NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHg3QiwgMHgwMSwgMHhCOSwgMHg2MCwgMHg0MywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMSwgMHg2NCwgMHgzQiwgMHhEQiwKKwkgMHgzMSwgMHhGMywgMHgwMSwgMHg2MywgMHhDNCwgMHhCNCwgMHgzMSwgMHhGQiwgMHgzMiwgMHhGRCwgMHhCOCwgMHg2MCwgMHhFRiwgMHg2MiwgMHg0MiwgMHg0MCwKKwkgMHhBMCwgMHg0QywgMHg0MCwgMHhCQywgMHg3RCwgMHhCNCwgMHhBMCwgMHg1MSwgMHhBMCwgMHhGRSwgMHgxQSwgMHhGRiwgMHgyNCwgMHg2MCwgMHgzQSwgMHg2NCwKKwkgMHgwOCwgMHhGMCwgMHgwNywgMHhGMCwgMHhEMCwgMHg4MCwgMHgyNCwgMHg2MCwgMHg0MCwgMHg2MiwgMHgxNCwgMHgwMiwgMHhBMiwgMHhEMywgMHgwMSwgMHg2MywKKwkgMHhBQywgMHg4NiwgMHgwNywgMHhGMiwgMHgwRiwgMHgwMywgMHhEMCwgMHg4MCwgMHgwOSwgMHhGMiwgMHhGQSwgMHgwMiwgMHgyMywgMHhGQywgMHgyNCwgMHg2MCwKKwkgMHg2RSwgMHg2MiwgMHgyNCwgMHg2MCwgMHg0NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgzQywgMHg0NiwgMHgwNiwgMHg2NCwgMHhBMSwgMHhGRiwgMHg0OSwgMHhGQiwgMHg4MywgMHgzRSwgMHgzMSwgMHhGMywKKwkgMHg4NywgMHg2MCwgMHg4MCwgMHg2MSwgMHgxRCwgMHhGMCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgxNSwgMHgwMCwgMHhGRSwgMHhCNCwgMHgzMSwgMHhGQiwKKwkgMHgwMCwgMHg2NCwgMHg0OSwgMHhGQiwgMHgwMSwgMHg2NCwgMHg0NywgMHhGQiwgMHgyRCwgMHg2MCwgMHg1QSwgMHg2MywgMHhBMywgMHhEMywgMHhCMCwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg3MSwgMHg2NCwgMHg1RiwgMHgwRCwgMHhGQSwgMHg0MCwgMHg2NCwgMHgzQiwgMHhEQiwKKwkgMHhCOSwgMHg2MCwgMHg0MywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgyQSwgMHgxQiwgMHgwMCwgMHhEMSwgMHg5MSwgMHg4RCwgMHhFMiwgMHg0MSwgMHg2NCwKKwkgMHgzQiwgMHhEQiwgMHgzMSwgMHhGMywgMHgyRCwgMHg2MCwgMHg2MiwgMHg2MywgMHhGRCwgMHhCNCwgMHgzMSwgMHhGQiwgMHhBMywgMHhEMywgMHhCMCwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2MywgMHg2MCwgMHg1QywgMHgwRCwgMHhGMiwgMHg0NywgMHhGRCwgMHhGRiwgMHhCNSwKKwkgMHg2MCwgMHg0NywgMHhEMCwgMHg4MCwgMHhEQywgMHg4NCwgMHgxRiwgMHgwMywgMHg2MCwgMHg0NywgMHhCNCwgMHg4NCwgMHgwRCwgMHhGQSwgMHgxQiwgMHgwMCwKKwkgMHgwOCwgMHgyQSwgMHgwNywgMHgwMCwgMHg0MiwgMHg2NCwgMHgzQiwgMHhEQiwgMHgzMSwgMHhGMywgMHhGRiwgMHhGRiwgMHhGNywgMHhCNCwgMHgzMSwgMHhGQiwKKwkgMHgxMiwgMHgwMCwgMHgxMCwgMHgyQSwgMHgwOSwgMHgwMCwgMHg0MywgMHg2NCwgMHgzQiwgMHhEQiwgMHgzMSwgMHhGMywgMHhGRiwgMHhGRiwgMHhFRiwgMHhCNCwKKwkgMHgzMSwgMHhGQiwgMHhCOCwgMHg2MCwgMHhCRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0NCwgMHg2NCwgMHgzQiwgMHhEQiwgMHgzMSwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHhERiwgMHhCNCwgMHgzMSwgMHhGQiwgMHgwMCwgMHgwMCwgMHgyQSwgMHg2NCwgMHgzQiwgMHhEQiwgMHhCMCwgMHg2MCwgMHg5NywgMHg2NCwgMHg0MCwgMHg0MCwKKwkgMHhCNSwgMHg2MCwgMHgxRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHhCOCwgMHg2MywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCNSwKKwkgMHgwNCwgMHhCNSwgMHgwNCwgMHgwMywgMHgwMywgMHgwMywgMHhCQSwgMHg2MCwgMHgzQywgMHg3OCwgMHhGRiwgMHhGRiwgMHg4NiwgMHhGRiwgMHgyMCwgMHg0NCwKKwkgMHg4NCwgMHhGRiwgMHgyMCwgMHgyQSwgMHgwNCwgMHgwMCwgMHhGMywgMHg2MCwgMHg1OCwgMHg0RSwgMHgxNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMSwgMHg0MCwKKwkgMHgwMSwgMHgyNiwgMHgxNywgMHgwMCwgMHhBMCwgMHg0QywgMHg0OSwgMHhCQywgMHhGRiwgMHhCNCwgMHhBMCwgMHg1MSwgMHgxQywgMHg2MCwgMHhCOCwgMHg2MywKKwkgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCNSwgMHgwNCwgMHhCQywgMHgwOSwgMHgwMywgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHhFRCwgMHhFMiwKKwkgMHhGRSwgMHhCNCwgMHhBMywgMHhEQiwgMHhBMCwgMHg0QywgMHg3RCwgMHhCNCwgMHhBMCwgMHg1MSwgMHgwMywgMHgwMCwgMHhBMCwgMHg0QywgMHg2RCwgMHhCNCwKKwkgMHhBMCwgMHg1MSwgMHhEQywgMHhGMywgMHhGRiwgMHhGRiwgMHhGRCwgMHhBMCwgMHhGRiwgMHhGRiwgMHg0OCwgMHgwMywgMHgzMSwgMHg0MCwgMHgwNCwgMHgyQSwKKwkgMHgzRSwgMHgwMCwgMHg2RCwgMHhGMywgMHg3NCwgMHhGMywgMHhDQywgMHg4MywgMHg2RCwgMHhGRCwgMHhDQywgMHg4NCwgMHg3NCwgMHhGQiwgMHgxRiwgMHgwMiwKKwkgMHgzMSwgMHg0MCwgMHgwMiwgMHgyQSwgMHgxMiwgMHgwMCwgMHg2RiwgMHhGMywgMHg3MCwgMHhGMSwgMHhDQywgMHg4NCwgMHg2RiwgMHhGQiwgMHgwRCwgMHgwMiwKKwkgMHg2RiwgMHhGOSwgMHgzMSwgMHg0NCwgMHgwOCwgMHhCQywgMHg0MCwgMHg1MSwgMHg3MiwgMHhGMywgMHg3MSwgMHhGMSwgMHgwMCwgMHhCOCwgMHg2NCwgMHg0NSwKKwkgMHgwMSwgMHgwMywgMHg2NywgMHg0NSwgMHg2NSwgMHg1MCwgMHhDQywgMHg4NCwgMHg3MywgMHhGQiwgMHgyOCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHg2RSwgMHhGMSwgMHgwMCwgMHhCOCwgMHg3NCwgMHhGOSwgMHgwMywgMHgwMywgMHg4NywgMHhGMywgMHg2RCwgMHhGQiwgMHgwNCwgMHgwMCwgMHg2RCwgMHhGMywKKwkgMHg4NywgMHhGMSwgMHgxNSwgMHgxQiwgMHg2RCwgMHhGOSwgMHgzMSwgMHg0MCwgMHgwMSwgMHgyQSwgMHgxMSwgMHgwMCwgMHhERCwgMHhGRSwgMHgwRiwgMHgwNSwKKwkgMHhCQSwgMHhGRSwgMHhBRCwgMHg0RiwgMHgwMCwgMHg3RiwgMHgwMSwgMHhCQywgMHhBMCwgMHg1RCwgMHgwMCwgMHhFRSwgMHg3RiwgMHhGMSwgMHgwMiwgMHg2MCwKKwkgMHhFRSwgMHg2NCwgMHhBMywgMHhGQiwgMHhBNCwgMHhGOSwgMHgwNCwgMHg2NCwgMHhBNSwgMHhGQiwgMHhERiwgMHhGRSwgMHgxOSwgMHhGRiwgMHgxQSwgMHg2MCwKKwkgMHg0MiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4NCwgMHhGRiwgMHgyQiwgMHhBMiwgMHhEQiwgMHgzMSwgMHg0MCwgMHgwMSwgMHgyQSwKKwkgMHgyOSwgMHgwMCwgMHg5RCwgMHhGRSwgMHgyNywgMHgwNCwgMHgyNiwgMHgwQSwgMHg5RiwgMHhGRSwgMHgyNCwgMHgwNSwgMHg4NSwgMHhGRiwgMHgyMCwgMHg0NCwKKwkgMHg4NCwgMHhGRiwgMHg0MCwgMHgyNiwgMHgxRiwgMHgwMCwgMHgzRiwgMHg0MCwgMHgyMCwgMHgyQiwgMHgxQywgMHgwMCwgMHgzOCwgMHg2OSwgMHhGRiwgMHhGRiwKKwkgMHg2OCwgMHg0NCwgMHgwMSwgMHgxNiwgMHhGRCwgMHgwMSwgMHgwMSwgMHgyQSwgMHgxNSwgMHgwMCwgMHgyNywgMHg2MCwgMHhCNCwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHg3RiwgMHhGMSwgMHgwMiwgMHg2MCwgMHhFRSwgMHg2NCwKKwkgMHhBMywgMHhGQiwgMHhGRiwgMHhGRiwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBNCwgMHhGQiwgMHgwNCwgMHg2NCwgMHhBNSwgMHhGQiwKKwkgMHhERiwgMHhGRSwgMHgxOSwgMHhGRiwgMHgxMCwgMHg2NCwgMHgzQiwgMHhEQiwgMHg4MCwgMHhGMywgMHg3MywgMHg0NSwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg5MywgMHhDOSwgMHhGRSwgMHg0OSwgMHhGMywgMHgzQywgMHg0NiwgMHgyNywgMHgxOCwgMHhDQywgMHg4NCwKKwkgMHg0OSwgMHhGQiwgMHgyNCwgMHgwMiwgMHhCQiwgMHg2MCwgMHgxOCwgMHg2NCwgMHg0MCwgMHg0MiwgMHhGQywgMHhGQywgMHgwMCwgMHg2NCwgMHg1QywgMHg1QywKKwkgMHgzMiwgMHhGQiwgMHg4MiwgMHhGRiwgMHg1QywgMHg0NywgMHg4NCwgMHhGRiwgMHg2MiwgMHhGRiwgMHgyNywgMHg2MCwgMHhBNCwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHgyMywgMHhGMCwgMHgwMSwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQSwgMHgyNCwgMHg2MCwgMHg2RSwgMHg2MiwgMHgyNCwgMHg2MCwgMHg0NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHhDRSwgMHhGRSwgMHg2QSwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MSwgMHhGRCwgMHhCNCwgMHhBMiwgMHhEQiwgMHg2MSwgMHg0NCwgMHgwMSwgMHhCMCwgMHgwMiwgMHhCMCwgMHgwQywgMHgwMywgMHgwQiwgMHgwMiwKKwkgMHg5RCwgMHhGRSwgMHgwOSwgMHgwNCwgMHgyNCwgMHg2MCwgMHhBNiwgMHg2MiwgMHgxQSwgMHg2MCwgMHhBMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwNywgMHgwMCwgMHg4MCwgMHhGMywgMHg3MywgMHg0NSwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg5MywgMHgxQywgMHg2MCwgMHhCNCwgMHg2MywgMHhBMywgMHhEMywgMHhBRCwgMHg0OSwgMHgyMCwgMHhCNSwKKwkgMHgwOCwgMHhCMSwgMHgyMywgMHgwMywgMHhFMSwgMHg4MSwgMHgxMCwgMHhCNSwgMHg5NSwgMHg4MSwgMHg2MCwgMHg0MSwgMHgxOCwgMHgwMiwgMHgxQywgMHg2MCwKKwkgMHhCNiwgMHg3QywgMHhBNCwgMHhEMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4NCwgMHhBNCwgMHhEQiwgMHgxNywgMHgwMiwgMHgwNSwgMHg2NCwgMHhBNCwgMHhEQiwKKwkgMHg2MSwgMHg0NCwgMHgwNywgMHhCNCwgMHhGRiwgMHhGRiwgMHgxMSwgMHgwMiwgMHgwOCwgMHhCMSwgMHhFMSwgMHg4MSwgMHg5NSwgMHg4MSwgMHhBMywgMHhEMywKKwkgMHgwQywgMHgwMywgMHgwOCwgMHhBQywgMHgwMSwgMHhCQywgMHhBMywgMHhEQiwgMHhGRiwgMHhGRiwgMHgxMywgMHhGRiwgMHgwNiwgMHgwMCwgMHgxMCwgMHhBQywKKwkgMHhBMywgMHhEQiwgMHgxQywgMHg2MCwgMHhCNiwgMHg2MywgMHgwNSwgMHg3QywgMHhBMywgMHhEOSwgMHhCMCwgMHg2MCwgMHhBNCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg0NiwgMHhGMywgMHg0NSwgMHhGMSwgMHgwNSwgMHgxQiwgMHg2NCwgMHg0NCwgMHgwMywgMHgxQiwgMHgwRiwgMHg2MCwgMHg5MiwgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHg0NSwgMHhGQiwgMHgwMCwgMHg2MywgMHg0NiwgMHhGRCwgMHg2MCwgMHg0MSwgMHgyNSwgMHg2NCwgMHgzQiwgMHhEQiwgMHgyNywgMHg0NCwgMHhFRiwgMHhCNCwKKwkgMHg0MCwgMHg0NywgMHgwMCwgMHhCOSwgMHg3MSwgMHg0MCwgMHg4MCwgMHgyNywgMHgwMSwgMHgxMiwgMHgyQiwgMHgwMywgMHhCQSwgMHg2MCwgMHg5MywgMHg2MiwKKwkgMHg4NCwgMHhGRiwgMHg0MiwgMHg0MiwgMHg4MiwgMHhGRiwgMHhBMCwgMHg0QywgMHgxNCwgMHhCQywgMHhGRiwgMHhCNCwgMHhBMCwgMHg1MSwgMHgzMSwgMHgwQSwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwgMHg3MCwgMHg0NCwgMHhBQywgMHg4MCwgMHgyQiwgMHgwQSwgMHg3MSwgMHg0MCwgMHg4MCwgMHgyNywKKwkgMHhGNywgMHgxMiwgMHg0NSwgMHhGMywgMHg0QywgMHgwMiwgMHgxNSwgMHgxOCwgMHgzMSwgMHg2MCwgMHgwRSwgMHg3QywgMHhBNCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgwQiwgMHgxOCwgMHgzMSwgMHg2MCwgMHgxMCwgMHg3QywgMHhBNCwgMHhEMywgMHhGRiwgMHhGRiwgMHgwNiwgMHgxOCwgMHhBQywgMHg0QywgMHg4MCwgMHgyNiwKKwkgMHgwMywgMHgwMCwgMHgwMCwgMHg2NCwgMHg0NSwgMHhGQiwgMHgwNSwgMHgwMCwgMHg0NSwgMHhGMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4NCwgMHg0NSwgMHhGQiwKKwkgMHhERiwgMHgwMiwgMHgwNiwgMHgwQSwgMHhBMCwgMHg0QywgMHhGQiwgMHhCNCwgMHhBMCwgMHg1MSwgMHhBMywgMHg2MCwgMHg5OSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg4NCwgMHhGRiwgMHhCQSwgMHg2MCwgMHg3MCwgMHg2NCwgMHg0MCwgMHg0MiwgMHg4MiwgMHhGRiwgMHhBMCwgMHg0QywgMHgxNCwgMHhCQywgMHhGRiwgMHhCNCwKKwkgMHhBMCwgMHg1MSwgMHhBQiwgMHg2MCwgMHgyQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgzQywgMHg0NCwgMHhBQywgMHg4MCwgMHgzMiwgMHhGMSwgMHgyNSwgMHgwMywKKwkgMHg2NCwgMHg0MCwgMHgwNywgMHgyMiwgMHgyMiwgMHgwMCwgMHhBMywgMHg2MCwgMHg3QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMCwgMHg0QywgMHgxQywgMHhCQywKKwkgMHhERiwgMHhCNCwgMHhBMCwgMHg1MSwgMHgzMSwgMHg0MCwgMHgwOCwgMHgyQSwgMHhFRiwgMHgwMSwgMHg3MywgMHhGMywgMHg3MSwgMHhGMSwgMHgwMCwgMHhBMCwKKwkgMHhEQywgMHg4MCwgMHgwNSwgMHgwMywgMHgwOCwgMHgwMywgMHhDQywgMHg4NCwgMHg3MywgMHhGQiwgMHg2NywgMHg1MCwgMHgwOCwgMHgwMCwgMHhDQywgMHg4NCwKKwkgMHg3MywgMHhGQiwgMHg2NCwgMHg1MCwgMHgwNCwgMHgwMCwgMHgzMSwgMHg0NCwgMHhGNywgMHhCNCwgMHg0MCwgMHg1MSwgMHgwNiwgMHgwMCwgMHgyOCwgMHg2NCwKKwkgMHgzQSwgMHhEQiwgMHhBMCwgMHg0QywgMHgzMCwgMHhCQywgMHhGMywgMHhCNCwgMHhBMCwgMHg1MSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwKKwkgMHgyOCwgMHg2NCwgMHgzQiwgMHhEQiwgMHgwRiwgMHg2MCwgMHg5NCwgMHg2MiwgMHhBMiwgMHhEMywgMHgzMiwgMHg0MCwgMHgwMiwgMHgyNywgMHgxNiwgMHgwMCwKKwkgMHg0NiwgMHhGQiwgMHgxNCwgMHgxOCwgMHhCQiwgMHg2MCwgMHgwNiwgMHg2NCwgMHg4NCwgMHhGRiwgMHg0MCwgMHg0MiwgMHg4MiwgMHhGRiwgMHhBMCwgMHg0QywKKwkgMHgxNCwgMHhCQywgMHhGNywgMHhCNCwgMHhBMCwgMHg1MSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwgMHg3MCwgMHg0NCwgMHhBQywgMHg4MCwKKwkgMHg0NiwgMHhGMywgMHhCNywgMHgwQSwgMHhEQywgMHgwMiwgMHhDQywgMHg4NCwgMHg0NiwgMHhGQiwgMHhGNSwgMHgwMiwgMHg4NCwgMHhGRiwgMHhCQiwgMHg2MCwKKwkgMHgxOCwgMHg2NCwgMHg0MCwgMHg0MiwgMHg4MiwgMHhGRiwgMHgyNywgMHg0NCwgMHgwOCwgMHhCQywgMHg0MCwgMHg0NywgMHhCQiwgMHhFMSwgMHgwNCwgMHgwMCwKKwkgMHgzQSwgMHhFMSwgMHgzMSwgMHg0MCwgMHgwMSwgMHgyNiwgMHhCQiwgMHhFMSwgMHhBMywgMHg2MCwgMHg2RiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0MywgMHhGRiwKKwkgMHgzOSwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4NCwgMHgzRSwgMHhGQiwgMHgwMSwgMHhBMCwgMHg0QywgMHgzRCwgMHg0NiwgMHgyQSwgMHhGMiwKKwkgMHg0NiwgMHg0RCwgMHgxMCwgMHgyNSwgMHgwRSwgMHgwMCwgMHgwOSwgMHhFMSwgMHhBMSwgMHhGRiwgMHg2NiwgMHg0MCwgMHgwRiwgMHhGMiwgMHgwMSwgMHgyOSwKKwkgMHgwMiwgMHgwMCwgMHg0MCwgMHhGRiwgMHgwQSwgMHhCQywgMHhBMiwgMHhEQSwgMHgwOCwgMHgyNSwgMHhFOSwgMHgwMSwgMHhDQiwgMHhGRSwgMHg1QywgMHg1RCwKKwkgMHhFNywgMHgwMSwgMHg0NCwgMHhGRiwgMHgzMSwgMHhGMiwgMHgxQywgMHg2MCwgMHhCQSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgzMSwgMHhGMCwKKwkgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgzMCwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwKKwkgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwgMHgyRiwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywKKwkgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwgMHhBOSwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwKKwkgMHgwNywgMHhGQywgMHgzRiwgMHhGMiwgMHgwOSwgMHg2MCwgMHhCMCwgMHg2NSwgMHhENCwgMHg4MCwgMHgyQSwgMHhGMiwgMHhDNCwgMHgwNSwgMHgwOCwgMHgyNSwKKwkgMHhCNiwgMHgwMSwgMHgwMCwgMHg2NCwgMHgwRCwgMHg2MCwgMHgyQywgMHg2MSwgMHg0MCwgMHg0QiwgMHhBMSwgMHhEQiwgMHgyRCwgMHg0NiwgMHgzQiwgMHhGMiwKKwkgMHhBOSwgMHhGMSwgMHg4NywgMHhGNCwgMHg2MCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgxMiwgMHgwMCwgMHhEMywgMHg4MCwgMHgyQywgMHhGMCwgMHhCMywgMHgwMywKKwkgMHgwNywgMHhGNCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNiwgMHhBOSwgMHhGNSwgMHhCNiwgMHhGNCwgMHgyRCwgMHg0NiwgMHgwNCwgMHg2NCwgMHgwNCwgMHhCMywKKwkgMHgyMiwgMHhGQSwgMHgwNCwgMHgwMywgMHhCQywgMHg2MCwgMHg3MiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMCwgMHhERSwgMHgwMCwgMHg3NCwgMHg2MiwKKwkgMHhBMiwgMHhEMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NCwgMHhFMCwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFMSwgMHg3RiwgMHg1QSwgMHhEMCwKKwkgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFMiwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHg3QywgMHg1RiwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NSwKKwkgMHgwQywgMHg2MCwgMHgzQSwgMHg2NCwgMHg0NCwgMHhEMywgMHg1QSwgMHhEMSwgMHgwMywgMHgxQiwgMHhCQywgMHg2MCwgMHg2NSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0NSwgMHg2NCwgMHg0NCwgMHhFMywgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFNCwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwKKwkgMHg2NCwgMHg0NCwgMHhFNSwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFNiwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwKKwkgMHhFNywgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NSwgMHg0MCwgMHgwRCwgMHgzQSwgMHgxQywgMHgwMCwgMHg2NCwgMHg0NywgMHhFOCwgMHg3RiwgMHg1QSwgMHhEMSwKKwkgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFOSwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFQSwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwKKwkgMHg2NCwgMHg0NCwgMHhFQiwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFQywgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwKKwkgMHhFRCwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFRSwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFRiwgMHg3RiwKKwkgMHhBMCwgMHg1QiwgMHg2NSwgMHg0NCwgMHhEOCwgMHg4NCwgMHgwOCwgMHgyNSwgMHg3NiwgMHgwMCwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QiwgMHg4MCwgMHg2MCwKKwkgMHgwMCwgMHhFQiwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQiwgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQiwgMHgzRiwgMHhGMiwgMHgwNCwgMHg2NSwgMHhDNCwgMHg4MywKKwkgMHgwQSwgMHhFMSwgMHhCMywgMHhGRiwgMHg5QSwgMHhGRiwgMHhDQiwgMHg4MywgMHgwMCwgMHhGNCwgMHgxMCwgMHg2MiwgMHg2QywgMHg2MSwgMHgwRSwgMHhBMywKKwkgMHhBQiwgMHg4NCwgMHhGMiwgMHhBMywgMHhBMSwgMHhGRiwgMHgwOCwgMHgwMCwgMHgwMCwgMHhGNCwgMHg4MSwgMHhGMiwgMHgwMiwgMHg2MiwgMHhDOSwgMHg4MSwKKwkgMHhBQiwgMHg4NCwgMHhBMSwgMHhGRiwgMHgwMSwgMHgwMCwgMHhBMiwgMHhEQywgMHg3QSwgMHhENCwgMHhGRCwgMHgxQywgMHhBMiwgMHhEQywgMHgwOCwgMHgyNSwKKwkgMHg1MiwgMHgwMCwgMHhGMiwgMHgxRCwgMHg3QywgMHhBOCwgMHhEOSwgMHg4MSwgMHhFRiwgMHgwMywgMHhGRiwgMHhCMSwgMHgwOSwgMHgxRSwgMHgwMiwgMHgwMiwKKwkgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MiwgMHg1QSwgMHhEMiwgMHg4OSwgMHhGRiwgMHg4MCwgMHg0RiwgMHg2RiwgMHg0NCwgMHhBMiwgMHhEQSwgMHg4OCwgMHhGRiwKKwkgMHg5OCwgMHhGRiwgMHgwOSwgMHhFMSwgMHhBMSwgMHhGRiwgMHgzRCwgMHg0NiwgMHgwOCwgMHgyNSwgMHgzRCwgMHgwMCwgMHg0MCwgMHhGRiwgMHgwRiwgMHhGMCwKKwkgMHgwQSwgMHg2NCwgMHhCMCwgMHg4NCwgMHgxNiwgMHgxNCwgMHhGNywgMHhCNCwgMHhBMiwgMHhEQSwgMHgwRCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwQywgMHgwMCwgMHhGMSwgMHhGNSwgMHhGMCwgMHhGNCwgMHgwRCwgMHg2MCwgMHgyQywgMHg2MSwKKwkgMHg1OSwgMHhEMSwgMHgzNywgMHhGOCwgMHgwNSwgMHg2NCwgMHg1OSwgMHhEMSwgMHhDQywgMHg4NCwgMHhCRCwgMHhEOCwgMHhGQywgMHgwMiwgMHgyRCwgMHg0NiwKKwkgMHgwRCwgMHgwMSwgMHhBMiwgMHhEQSwgMHgyRCwgMHg0NiwgMHgzQiwgMHhGMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgxOCwgMHgwMCwKKwkgMHhGMSwgMHhGNSwgMHhCNywgMHhGMCwgMHgyQSwgMHg0NCwgMHhBNCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgyRiwgMHgyNiwgMHgxMCwgMHgwMCwgMHgyRCwgMHg0NiwKKwkgMHg2NCwgMHg0NCwgMHgzQSwgMHhGMCwgMHhCQywgMHhGMCwgMHg2NCwgMHg1RiwgMHgzRCwgMHhGMCwgMHgwNywgMHhGNCwgMHhGMCwgMHhGNCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHhBMywgMHg1QiwgMHhEOCwgMHg2NSwgMHg1QywgMHg1QiwgMHhEOCwgMHg1QiwgMHhEQSwgMHgyRCwgMHg0NiwgMHgwMSwgMHgwMCwgMHgyRCwgMHg0NiwKKwkgMHhCQiwgMHg2MCwgMHgzNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg5OCwgMHhGRiwgMHg0MywgMHhGRiwgMHg0MCwgMHhGRiwgMHhCMCwgMHhGRiwgMHhCMSwgMHhGRiwKKwkgMHgyRCwgMHg0NiwgMHgwRCwgMHg2MCwgMHgyQywgMHg2MSwgMHhBMSwgMHhEMywgMHgyRCwgMHg0NiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwQSwgMHgwMCwKKwkgMHhGMSwgMHhGNSwgMHhGMCwgMHhGNCwgMHg1OSwgMHhEMSwgMHgzNywgMHhGOCwgMHgwNSwgMHg2NCwgMHg1OSwgMHhEMSwgMHhDQywgMHg4NCwgMHhCRCwgMHhEOCwKKwkgMHhGQywgMHgwMiwgMHgyRCwgMHg0NiwgMHhCQiwgMHg2MCwgMHgyMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg5OCwgMHhGRiwgMHgwOSwgMHhFMSwgMHhBMSwgMHhGRiwKKwkgMHgzRCwgMHg0NiwgMHgwOCwgMHgyNSwgMHhFMCwgMHgwMSwgMHgwRiwgMHhGMiwgMHg0MCwgMHhGRiwgMHgwMiwgMHhCQywgMHhBMiwgMHhEQSwgMHhCQiwgMHg2MCwKKwkgMHgzNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHgwRCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEQiwgMHgwNCwgMHg2NCwgMHgyMiwgMHhGQSwKKwkgMHg4NywgMHhGNCwgMHhBOSwgMHhGMSwgMHhGRiwgMHhGRiwgMHhEMywgMHg4MCwgMHgzQiwgMHhGMiwgMHhFNywgMHgwMywgMHg2MCwgMHg0NywgMHhDMCwgMHhCNywKKwkgMHgwMiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwgMHgwMCwgMHhBOCwgMHg0MCwgMHg0QSwgMHgxNiwgMHgwMywgMHhFMCwgMHg4MSwKKwkgMHg2MSwgMHg0MywgMHg0MiwgMHhGRSwgMHgwMCwgMHg2NCwgMHhGMCwgMHg4NCwgMHhGRSwgMHgxRiwgMHg0MCwgMHg0QSwgMHhFMSwgMHg4NCwgMHhFMCwgMHg4NCwKKwkgMHgyRCwgMHg0NiwgMHgwNywgMHhGNCwgMHhFMCwgMHg4MSwgMHgzNywgMHhGMCwgMHgyQSwgMHg0NywgMHgwQywgMHg2MCwgMHg3QSwgMHg2MywgMHhBMCwgMHg4NCwKKwkgMHg0NywgMHg5QywgMHgxMCwgMHgwMywgMHg3QywgMHg0NCwgMHhBMCwgMHg2MywgMHgxMSwgMHgwMCwgMHgyMCwgMHg2NCwgMHg0MCwgMHg0QSwgMHg2MywgMHg0NiwKKwkgMHgzNywgMHhGMCwgMHg2NiwgMHg0NCwgMHg2NCwgMHg0MCwgMHg4MCwgMHgyQiwgMHgwNSwgMHgwMCwgMHgwMCwgMHg2MCwgMHg3MCwgMHg3QywgMHgwMCwgMHg2MCwKKwkgMHg5MCwgMHg2MywgMHgwNCwgMHgwMCwgMHgyRCwgMHg0NiwgMHhCQywgMHg2MCwgMHg2NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyRCwgMHg0NiwgMHhFRSwgMHhGQiwKKwkgMHhFRiwgMHhGOSwgMHhGMCwgMHhGRCwgMHgwNywgMHhGMiwgMHhGMSwgMHhGQiwgMHg2MCwgMHg0NiwgMHgzNywgMHhGMCwgMHgyQSwgMHg0NCwgMHgwRCwgMHg2MCwKKwkgMHgyQywgMHg2MiwgMHg1QSwgMHhEOSwgMHgwMCwgMHg2NSwgMHg0NSwgMHg0QiwgMHhBMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgzRiwgMHgyMiwgMHgwNSwgMHgwMCwKKwkgMHg5MCwgMHg4NCwgMHgzNywgMHhGQSwgMHgwMSwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyMSwgMHgwMCwgMHhBRCwgMHg0NiwgMHgwQSwgMHhBMywgMHgzRCwgMHhGMiwKKwkgMHhBRCwgMHg0NiwgMHhBMywgMHhEMCwgMHhBRCwgMHg0NiwgMHhEMCwgMHg4MCwgMHgzQywgMHhGMiwgMHhBRCwgMHg0NiwgMHgwMiwgMHgwMywgMHgxNiwgMHgwNywKKwkgMHgxNCwgMHgwNCwgMHg1QiwgMHhEMCwgMHhBRCwgMHg0NiwgMHhEMCwgMHg4MCwgMHgzQiwgMHhGMiwgMHgwMywgMHgwMywgMHhBRCwgMHg0NiwgMHgwRSwgMHgwNywKKwkgMHgwQywgMHgwNCwgMHgzQSwgMHhGMCwgMHhBRCwgMHg0NiwgMHg1QiwgMHhEMCwgMHg2NCwgMHg1RiwgMHhEMCwgMHg4MCwgMHgyQiwgMHg0NCwgMHgxOCwgMHgwNywKKwkgMHgwNCwgMHgwMywgMHhEMCwgMHg4NCwgMHgxMCwgMHhBNCwgMHhGRiwgMHhGRiwgMHgxMywgMHgwNywgMHg3RiwgMHgwMSwgMHgwMSwgMHg2NCwgMHgwRCwgMHg2MCwKKwkgMHgyQywgMHg2MiwgMHhBMiwgMHhEQiwgMHgyRCwgMHg0NiwgMHgwRCwgMHg2MCwgMHgzQywgMHg2MiwgMHg4MCwgMHhGRiwgMHg3OCwgMHg0NCwgMHgwMywgMHhBNCwKKwkgMHhBMiwgMHhEQiwgMHhCRCwgMHg2MCwgMHgwQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4NSwgMHhGRiwgMHgyRCwgMHg0NiwgMHgwOCwgMHgyNSwgMHg1MywgMHgwMSwKKwkgMHgyRCwgMHg0NiwgMHgwRCwgMHg2MCwgMHgzQywgMHg2MiwgMHg4MCwgMHhGRiwgMHg3OCwgMHg0NCwgMHgwMywgMHhBNCwgMHhBMiwgMHhEQiwgMHhCRCwgMHg2MCwKKwkgMHg5NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4NSwgMHhGRiwgMHgyRCwgMHg0NiwgMHgwOCwgMHgyNSwgMHg0NSwgMHgwMSwgMHgwMCwgMHg2MCwgMHgwRiwgMHg2NCwKKwkgMHhCQiwgMHg2MCwgMHhEMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHhGNCwgMHg2NiwgMHg0MSwgMHgwMywgMHhGMiwgMHgwNCwgMHhGMiwgMHg0MCwgMHg0MiwKKwkgMHgwNSwgMHhGMiwgMHg0MCwgMHg0MywgMHg0MCwgMHg0NCwgMHg2MSwgMHg0NiwgMHgzQywgMHhGMiwgMHgzRCwgMHhGMiwgMHg0MCwgMHg0MCwgMHg0MCwgMHg0MSwKKwkgMHgwRCwgMHg2MCwgMHg3MCwgMHg2NSwgMHgwMCwgMHg2MSwgMHhFRiwgMHhGMSwgMHhFRSwgMHhGNSwgMHg0NCwgMHg0QywgMHgyQywgMHg1QywgMHhFOSwgMHg4MCwKKwkgMHgwMCwgMHg2NCwgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwgMHhDMCwgMHg4MywgMHhCRCwgMHhEMiwgMHgyNCwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywKKwkgMHg5MCwgMHg5QywgMHgyMCwgMHg0NCwgMHg0MCwgMHg4MCwgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyMCwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywKKwkgMHg5MCwgMHg5QywgMHgyMSwgMHg0NCwgMHg0MCwgMHg4MSwgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyMSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywKKwkgMHg5MCwgMHg5QywgMHgyMiwgMHg0NCwgMHg0MCwgMHg4MiwgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyMiwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywKKwkgMHg5MCwgMHg5QywgMHgyMywgMHg0NCwgMHg0MCwgMHg4MywgMHhGMiwgMHhBMywgMHhCRCwgMHhEMiwgMHgyMywgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywKKwkgMHg5MCwgMHg5QywgMHgyNCwgMHg0NCwgMHhDMCwgMHg5QywgMHg0MSwgMHg4NCwgMHhERCwgMHg4MSwgMHgwOCwgMHgyQSwgMHhBNywgMHgwMSwgMHgwRCwgMHg2MCwKKwkgMHgyRSwgMHg2MSwgMHgwNSwgMHg2NCwgMHhGMCwgMHhGNCwgMHhGMSwgMHhGNSwgMHhGRSwgMHhBMywgMHg1QiwgMHhEMCwgMHhDQywgMHg4NCwgMHg1OSwgMHhEOSwKKwkgMHhGQywgMHgwMiwgMHhGMCwgMHhGMywgMHhGMSwgMHhGNSwgMHg2MCwgMHg0MiwgMHgyMCwgMHg0NCwgMHhBMiwgMHhEQSwgMHgyMSwgMHg0NCwgMHg1QSwgMHhEQSwKKwkgMHgyMiwgMHg0NCwgMHg1QSwgMHhEQSwgMHgyMywgMHg0NCwgMHg1QSwgMHhEQSwgMHgyNCwgMHg0NCwgMHg1QSwgMHhEQSwgMHg2MSwgMHg0NiwgMHgwRCwgMHg2MCwKKwkgMHgzQywgMHg2MiwgMHhBMiwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0MSwgMHhGMCwgMHhGMywgMHhGMSwgMHhGNSwgMHhBMCwgMHhEMiwKKwkgMHg1QSwgMHhEMCwgMHg0MCwgMHg0MCwgMHg0NCwgMHg0MSwgMHg1QSwgMHhEMiwgMHg1QSwgMHhEMCwgMHg0MCwgMHg0MiwgMHg1QSwgMHhEMCwgMHg0NCwgMHg0MywKKwkgMHg2MSwgMHg0NiwgMHhCQSwgMHhGMCwgMHgzQiwgMHhGMiwgMHg0NCwgMHg0NCwgMHg2NSwgMHg1RiwgMHg0MCwgMHg4NSwgMHhFRiwgMHhGNCwgMHhFRSwgMHhGNSwKKwkgMHg0MywgMHg0QywgMHgwRCwgMHg2MCwgMHg3MCwgMHg2NSwgMHhCRCwgMHhEMiwgMHgyNSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyMCwgMHg0NCwgMHg0MCwgMHg4MCwgMHhCRCwgMHhEMiwgMHgyMCwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyMSwgMHg0NCwKKwkgMHg0MCwgMHg4MSwgMHhCRCwgMHhEMiwgMHgyMSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwKKwkgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyMiwgMHg0NCwgMHg0MCwgMHg4MiwKKwkgMHhCRCwgMHhEMiwgMHgyMiwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyMywgMHg0NCwgMHg0MCwgMHg4MywgMHhCRCwgMHhEMiwKKwkgMHgyMywgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyNCwgMHg0NCwgMHg0MCwgMHg4NCwgMHhCRCwgMHhEMiwgMHgyNCwgMHg1QywKKwkgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyNSwgMHg0NCwgMHg0MCwgMHg4NSwgMHg2MSwgMHg0NiwgMHgzQSwgMHhGMCwgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHg0NCwgMHhFMCwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFMSwgMHg3RiwgMHg1QSwgMHhEMCwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwKKwkgMHhFMiwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFRSwgMHhGNSwgMHhCRCwgMHhEMiwgMHgyNSwgMHg1QywgMHg5MCwgMHg4NCwgMHhFOCwgMHg4MCwKKwkgMHhGOCwgMHg4NCwgMHgyMCwgMHg1QywgMHg0MCwgMHg4MCwgMHgyMCwgMHg0NCwgMHhFNCwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyMCwgMHg0NywgMHhFNSwgMHg3RiwKKwkgMHhBMCwgMHg1QiwgMHhCRCwgMHhEMiwgMHgyMCwgMHg1QywgMHg5MCwgMHg4NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyMSwgMHg1QywgMHg0MCwgMHg4MSwKKwkgMHgyMSwgMHg0NCwgMHhFNiwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyMSwgMHg0NywgMHhFNywgMHg3RiwgMHhBMCwgMHg1QiwgMHgyMSwgMHg0NCwgMHhFOCwgMHg4MCwKKwkgMHhGOCwgMHg4NCwgMHgyMiwgMHg1QywgMHg0MCwgMHg4MiwgMHgyMiwgMHg0NCwgMHhFOCwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyMiwgMHg0NywgMHhFOSwgMHg3RiwKKwkgMHhBMCwgMHg1QiwgMHgyMiwgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyMywgMHg1QywgMHg0MCwgMHg4MywgMHgyMywgMHg0NCwgMHhFQSwgMHg3RiwKKwkgMHhBMCwgMHg1QiwgMHgyMywgMHg0NywgMHhFQiwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyMywgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyNCwgMHg1QywKKwkgMHg0MCwgMHg4NCwgMHgyNCwgMHg0NCwgMHhFQywgMHg3RiwgMHhBMCwgMHg1QiwgMHgyNCwgMHg0NywgMHhFRCwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyNCwgMHg0NCwKKwkgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyNSwgMHg1QywgMHg0MCwgMHg4NSwgMHgyNSwgMHg0NCwgMHhFRSwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyNSwgMHg0NywKKwkgMHhFRiwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyQywgMHg0MywgMHhBMywgMHhEMiwgMHgyNSwgMHg1QywgMHg5MCwgMHg4MSwgMHhFOSwgMHg4NCwgMHhFMywgMHg3RiwKKwkgMHhBMCwgMHg1QiwgMHgwRCwgMHg2MCwgMHgzQywgMHg2MiwgMHhBMiwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFQiwgMHhGMywgMHg1QSwgMHhEMywKKwkgMHg0MCwgMHg0OCwgMHg1QSwgMHhEMywgMHg0MCwgMHg0OSwgMHg0MCwgMHg0QSwgMHgwMCwgMHg2MCwgMHg3MCwgMHg3QywgMHg0NCwgMHg0RCwgMHg0NSwgMHhGMiwKKwkgMHg0NiwgMHhGMiwgMHg0MCwgMHg0NywgMHg0MCwgMHg0NiwgMHgwRCwgMHg2MCwgMHg3MCwgMHg2NSwgMHgwMCwgMHg2MSwgMHgyRCwgMHg1QywgMHhFOSwgMHg4MCwKKwkgMHgwMCwgMHg2NCwgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwgMHhDMCwgMHg4MywgMHhCRCwgMHhEMiwgMHgyQSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywKKwkgMHg5MCwgMHg5QywgMHgyNiwgMHg0NCwgMHg0MCwgMHg4NiwgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyNiwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywKKwkgMHg5MCwgMHg5QywgMHgyNywgMHg0NCwgMHg0MCwgMHg4NywgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyNywgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywKKwkgMHg5MCwgMHg5QywgMHgyOCwgMHg0NCwgMHg0MCwgMHg4OCwgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyOCwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywKKwkgMHg5MCwgMHg5QywgMHgyOSwgMHg0NCwgMHg0MCwgMHg4OSwgMHhGMiwgMHhBMywgMHhCRCwgMHhEMiwgMHgyOSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywKKwkgMHg5MCwgMHg5QywgMHgyQSwgMHg0NCwgMHhDMCwgMHg5QywgMHg0MSwgMHg4QSwgMHhERCwgMHg4MSwgMHgwOCwgMHgyQSwgMHhBNywgMHgwMSwgMHgyNiwgMHg0NCwKKwkgMHg0MCwgMHhGQSwgMHgyNywgMHg0NCwgMHg0MSwgMHhGQSwgMHgyOCwgMHg0NCwgMHg0MiwgMHhGQSwgMHgyOSwgMHg0NCwgMHg0MywgMHhGQSwgMHgyQSwgMHg0NCwKKwkgMHg0NCwgMHhGQSwgMHgwRCwgMHg2MCwgMHgzRSwgMHg2MiwgMHhBMiwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHg4MCwgMHg3QywKKwkgMHg0NCwgMHg0RCwgMHgyRCwgMHg0MiwgMHhBMiwgMHhEMiwgMHg1QSwgMHhEMCwgMHg0MCwgMHg0NiwgMHg0NCwgMHg0NywgMHg1QSwgMHhEMiwgMHg1QSwgMHhEMCwKKwkgMHg0MCwgMHg0OCwgMHg1QSwgMHhEMCwgMHg0NCwgMHg0OSwgMHg0NywgMHhGMiwgMHg0NCwgMHg0QSwgMHg0MCwgMHg4QiwgMHg2MCwgMHg1QywgMHg2NCwgMHg0NywKKwkgMHhFMCwgMHg3RiwgMHhBMCwgMHg1QSwgMHhGRiwgMHhCNCwgMHgyMCwgMHhCQywgMHg3RiwgMHhCNCwgMHhFMSwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwKKwkgMHhFMiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgwMCwgMHg2MCwgMHg3MCwgMHg2MywgMHgwRCwgMHg2MCwgMHg3MCwgMHg2NSwgMHhCRCwgMHhEMiwgMHgyQiwgMHg1QywKKwkgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyNiwgMHg0NCwgMHg0MCwgMHg4NiwgMHhCRCwgMHhEMiwgMHgyNiwgMHg1QywgMHg5MCwgMHg5QywKKwkgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwKKwkgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyNywgMHg0NCwgMHg0MCwgMHg4NywgMHhCRCwgMHhEMiwgMHgyNywgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywKKwkgMHg5MCwgMHg5QywgMHgyOCwgMHg0NCwgMHg0MCwgMHg4OCwgMHhCRCwgMHhEMiwgMHgyOCwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyOSwgMHg0NCwgMHg0MCwgMHg4OSwgMHhCRCwgMHhEMiwgMHgyOSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyQSwgMHg0NCwKKwkgMHg0MCwgMHg4QSwgMHhCRCwgMHhEMiwgMHgyQSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwKKwkgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyQiwgMHg0NCwgMHg0MCwgMHg4QiwKKwkgMHhCRCwgMHhEMiwgMHgyQiwgMHg1QywgMHg5MCwgMHg4NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyNiwgMHg1QywgMHg0MCwgMHg4NiwgMHgyNiwgMHg0NCwKKwkgMHhFNCwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyNiwgMHg0NywgMHhFNSwgMHg3RiwgMHhBMCwgMHg1QSwgMHhCRCwgMHhEMiwgMHgyNiwgMHg1QywgMHg5MCwgMHg4NCwKKwkgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyNywgMHg1QywgMHg0MCwgMHg4NywgMHgyNywgMHg0NCwgMHhFNiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyNywgMHg0NywKKwkgMHhFNywgMHg3RiwgMHhBMCwgMHg1QSwgMHgyNywgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyOCwgMHg1QywgMHg0MCwgMHg4OCwgMHgyOCwgMHg0NCwKKwkgMHhFOCwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyOCwgMHg0NywgMHhFOSwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyOCwgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwKKwkgMHgyOSwgMHg1QywgMHg0MCwgMHg4OSwgMHgyOSwgMHg0NCwgMHhFQSwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyOSwgMHg0NywgMHhFQiwgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHgyOSwgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyQSwgMHg1QywgMHg0MCwgMHg4QSwgMHgyQSwgMHg0NCwgMHhFQywgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHgyQSwgMHg0NywgMHhFRCwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyQSwgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyQiwgMHg1QywgMHg0MCwgMHg4QiwKKwkgMHgyQiwgMHg0NCwgMHhFRSwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyQiwgMHg0NywgMHhFRiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgzOCwgMHhGMCwgMHgyQiwgMHg0NCwKKwkgMHg5MCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFMywgMHg3RiwgMHhBMCwgMHg1QSwgMHgwRCwgMHg2MCwgMHgzRSwgMHg2MiwgMHhBMiwgMHhENywgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHhFNCwgMHg2MCwgMHhDOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg4MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgzMiwgMHgwMCwgMHhEQywgMHhGMywgMHgzMSwgMHg0MSwgMHgwMSwgMHhCMSwKKwkgMHgwMywgMHhBOCwgMHgyRCwgMHgwMywgMHgxNywgMHgwMiwgMHgyMCwgMHg0MCwgMHgwNCwgMHgyQiwgMHgwQywgMHgwMCwgMHhCQiwgMHhGRSwgMHhDQSwgMHhGRSwKKwkgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHgwOCwgMHgwMCwgMHgwRiwgMHg2MCwgMHhEMiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwQywgMHgwMCwgMHhBOSwgMHhGRSwgMHhEOCwgMHgwNSwgMHhBQiwgMHhGRSwgMHgwQywgMHgwNSwgMHhBOCwgMHhGRSwKKwkgMHhDOCwgMHgwNSwgMHhBQSwgMHhGRSwgMHhDOSwgMHgwNSwgMHg3OCwgMHg0MywgMHgwMSwgMHg2MSwgMHgyNCwgMHg2MCwgMHhERCwgMHg3OCwgMHhBMSwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4NSwgMHgzRSwgMHgyNCwgMHg2MCwgMHg1RSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwKKwkgMHg2MCwgMHg0NiwgMHgwMywgMHgwMiwgMHhCRiwgMHg2MCwgMHhFNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NSwgMHhENCwgMHg4MCwgMHgwRiwgMHhGMCwKKwkgMHhGOSwgMHgwMywgMHg2NCwgMHg0NCwgMHg3MCwgMHhCMCwgMHg3MCwgMHgyQSwgMHgxNCwgMHgwMCwgMHgyNywgMHg2MCwgMHhCMiwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHhBMiwgMHhGRiwgMHhBRiwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHhDQywgMHg4NCwgMHhGRSwgMHhBMCwgMHhBRiwgMHhGQiwgMHgwMSwgMHgwNywgMHhENCwgMHhGRSwgMHhBMywgMHhGRiwgMHhDNSwgMHg2MCwgMHg1QiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMiwgMHgyNiwgMHgwOSwgMHgwMCwgMHg2NiwgMHg0NSwgMHgwOSwgMHhGNCwgMHgwRiwgMHhGMiwgMHgwMiwgMHgxOCwKKwkgMHg2NSwgMHg0NiwgMHhFMywgMHgxQiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg0NiwgMHhDQSwgMHgwMSwgMHhBMiwgMHhGRiwgMHhBRiwgMHhGMywgMHg0NiwgMHg0NiwKKwkgMHhDQywgMHg4NCwgMHhGRSwgMHhBMCwgMHhBRiwgMHhGQiwgMHgwMSwgMHgwNywgMHhENCwgMHhGRSwgMHhBMywgMHhGRiwgMHgwRiwgMHhGMCwgMHhBMywgMHhGQywKKwkgMHg2NCwgMHg0NCwgMHg4MCwgMHgyNiwgMHgyMiwgMHgwMCwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg5MiwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwKKwkgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgzMiwgMHg0NCwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwgMHgwNywgMHg2MCwKKwkgMHgwMSwgMHg2NCwgMHgwNCwgMHgwMCwgMHgwMiwgMHgyQSwgMHgwNiwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHgyMywgMHhGQSwgMHhDNSwgMHg2MCwKKwkgMHg2NywgMHg3OCwgMHhGRiwgMHhGRiwgMHhDNSwgMHg2MCwgMHg1QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyNiwgMHgzRiwgMHgwMCwgMHgyQSwgMHhGMiwKKwkgMHg2MCwgMHg2MywgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQiwgMHg2NiwgMHg2MywgMHhCRSwgMHhEMiwgMHg4MywgMHhGMSwgMHhBMywgMHhEMiwgMHhEMCwgMHg4MCwKKwkgMHg4MiwgMHhGMSwgMHgxOCwgMHgwMiwgMHhCRiwgMHhEMiwgMHhEMCwgMHg4MCwgMHg4MSwgMHhGMSwgMHgxNCwgMHgwMiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgxMSwgMHgwMiwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg5RSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwKKwkgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgzMiwgMHg0NCwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwgMHgwNywgMHg2MCwgMHgwMiwgMHg2NCwgMHgwNCwgMHgwMCwKKwkgMHgwMiwgMHgyQSwgMHgwNiwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHgyMywgMHhGQSwgMHhDNSwgMHg2MCwgMHg2NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHhCMCwgMHgzQSwgMHgwNiwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHgyMywgMHhGQSwKKwkgMHhDMSwgMHg2MCwgMHgxMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDNSwgMHg2MCwgMHg1QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMiwgMHg0NCwgMHgwMSwgMHgyQSwKKwkgMHg0QSwgMHgwMCwgMHgyOCwgMHg2MCwgMHhFMiwgMHg2MywgMHhCRiwgMHhEMywgMHgwMCwgMHg2NSwgMHhCNCwgMHg4MSwgMHhEQiwgMHg4MywgMHgzRCwgMHgwMywKKwkgMHhCRiwgMHhEMywgMHhBMywgMHhEMywgMHg0MCwgMHg0OCwgMHhCRSwgMHhEMywgMHg0MCwgMHg0QSwgMHgyRSwgMHhGMCwgMHg0MCwgMHg0QywgMHhEMCwgMHg4MCwKKwkgMHgyRCwgMHhGMCwgMHgwOCwgMHgwMiwgMHgyQSwgMHg0NCwgMHhEMCwgMHg4MCwgMHgyQywgMHhGMCwgMHgwNCwgMHgwMiwgMHgyOCwgMHg0NCwgMHhEMCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHgwMywgMHgzMSwgMHhGMCwgMHgyQywgMHg0NCwgMHhEMCwgMHg4MCwgMHgzMCwgMHhGMCwgMHgwOCwgMHgwMiwgMHgyQSwgMHg0NCwKKwkgMHhEMCwgMHg4MCwgMHgyRiwgMHhGMCwgMHgwNCwgMHgwMiwgMHgyOCwgMHg0NCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxRSwgMHgwMywgMHgzNCwgMHhGMCwKKwkgMHgyQywgMHg0NCwgMHhEMCwgMHg4MCwgMHgzMywgMHhGMCwgMHgwOCwgMHgwMiwgMHgyQSwgMHg0NCwgMHhEMCwgMHg4MCwgMHgzMiwgMHhGMCwgMHgwNCwgMHgwMiwKKwkgMHgyOCwgMHg0NCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxMSwgMHgwMywgMHgzOCwgMHhGMCwgMHgyQywgMHg0NCwgMHhEMCwgMHg4MCwgMHgzNywgMHhGMCwKKwkgMHgwOCwgMHgwMiwgMHgyQSwgMHg0NCwgMHhEMCwgMHg4MCwgMHgzNiwgMHhGMCwgMHgwNCwgMHgwMiwgMHgyOCwgMHg0NCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgwMywgMHhGQSwgMHhBMSwgMHgwNiwgMHhBMywgMHhCNywgMHgwMywgMHhDMywgMHgwMSwgMHgwNywgMHg2MCwgMHgwMCwgMHg2NCwgMHgyMywgMHhGQSwKKwkgMHhDNSwgMHg2MCwgMHg2NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHgwRiwgMHhGMCwgMHg2MCwgMHg0NSwgMHhBNCwgMHgzNiwgMHgwOCwgMHgwMCwKKwkgMHgwQywgMHhCNCwgMHgwNCwgMHgzNiwgMHgwMiwgMHgwMCwgMHgwQywgMHgzQSwgMHgwNiwgMHgwMCwgMHhDNSwgMHg2MCwgMHg1QiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhDMiwgMHg2MCwgMHhERCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHhGMCwgMHg2NSwgMHg0MCwgMHg0MCwgMHgyQiwgMHgyMiwgMHgwMCwgMHgzMiwgMHg0MCwKKwkgMHgwOCwgMHgyNiwgMHgxRiwgMHgwMCwgMHgwNywgMHhGNCwgMHgzNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgzNywgMHhCNCwgMHgyNiwgMHg0NiwgMHgxOSwgMHgwMiwKKwkgMHgyQywgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgxMSwgMHgwMCwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg5OCwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwKKwkgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHhDNSwgMHg2MCwgMHg1QiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHg2NCwgMHg0MCwgMHg2MCwgMHgyNiwgMHgwMywgMHgwMCwgMHhDMiwgMHg2MCwgMHhBRiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MSwgMHhBOSwgMHhGMywgMHgwNywgMHhGQSwgMHg2MSwgMHg0NCwgMHg4MCwgMHgzQSwgMHgwNiwgMHgwMCwgMHhFNSwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHhFNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHgxMCwgMHgwMCwgMHg2MCwgMHg0MCwgMHg0MCwgMHgzQSwgMHgwRCwgMHgwMCwgMHhEQywgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgwNywgMHhCNCwgMHgwMywgMHgzQSwgMHhFMiwgMHgwMSwgMHhDNiwgMHg2MCwgMHg1OCwgMHg0RCwgMHg0RiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhERCwgMHgwMiwgMHhBOSwgMHhGMywgMHgwNywgMHhGQSwgMHhEMSwgMHgwMCwgMHg1RSwgMHg2MywgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQiwgMHg2NCwgMHg2MywKKwkgMHg1MCwgMHhGRSwgMHhCRCwgMHhEMiwgMHg4MSwgMHhGMSwgMHhCRCwgMHhEMiwgMHhEMCwgMHg4MCwgMHg4MiwgMHhGMSwgMHhCRCwgMHhEMiwgMHhEMCwgMHg4MCwKKwkgMHg4MywgMHhGMSwgMHgyQSwgMHhGMiwgMHhEMCwgMHg4MCwgMHg2MCwgMHg0MCwgMHgwOCwgMHgzQSwgMHgwNywgMHgwMCwgMHgwMSwgMHgwQywgMHhDNiwgMHgwMSwKKwkgMHhERSwgMHg2MCwgMHg1OCwgMHg0RiwgMHhGRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCOCwgMHgwMCwgMHgyNiwgMHgwQywgMHhDNiwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHg0RiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCQiwgMHgwMiwgMHgxRiwgMHg2MCwgMHg1MiwgMHg2MSwgMHgwMiwgMHg2NCwgMHhBMSwgMHhEQiwgMHgxRiwgMHg2MCwKKwkgMHg1QSwgMHg2MSwgMHgwMCwgMHg2NCwgMHhBMSwgMHhEQiwgMHgyMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHgzRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwKKwkgMHgwNCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyNywgMHgwOCwgMHgwMCwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxRiwgMHg2MCwgMHg1MiwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg5QiwgMHgwMSwgMHg5MSwgMHgwMCwgMHhDNiwgMHg2MCwgMHg1OCwgMHg0RCwgMHg0RiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhGQSwgMHgwMiwgMHgwRiwgMHg2MCwgMHhDRSwgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwNywgMHgwMCwKKwkgMHgwMSwgMHg2NCwgMHhBMSwgMHhEQiwgMHgwMSwgMHg2NSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwKKwkgMHgzMSwgMHhGMiwgMHgxQywgMHg2MCwgMHhCQSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwKKwkgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgzMSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwKKwkgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgzMCwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwKKwkgMHg2MSwgMHg0NiwgMHgyRiwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwKKwkgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwgMHhBOSwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHhBOSwgMHhGMSwgMHg0MywgMHg0MywKKwkgMHhEMywgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMiwgMHhDNSwgMHg2MCwgMHg1OCwgMHg0RiwgMHhBNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMiwgMHg0MCwKKwkgMHgwOCwgMHgyQSwgMHgwNSwgMHgwMCwgMHg2MywgMHg0NiwgMHg4MCwgMHg2MCwgMHgwMiwgMHg2NCwgMHgwNiwgMHhGQSwgMHgyNiwgMHg0NiwgMHhEOCwgMHhGMywKKwkgMHg2MywgMHg0NSwgMHg2NiwgMHg0MSwgMHg2NSwgMHg0NiwgMHg4QywgMHhGQSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwNiwgMHgwMCwgMHgwMiwgMHgzNiwKKwkgMHgwNCwgMHgwMCwgMHgwNCwgMHgzNiwgMHgwMiwgMHgwMCwgMHgwNSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwMSwgMHgwMCwgMHgwMSwgMHg2NCwKKwkgMHg2RiwgMHhGQSwgMHg3OSwgMHhGMywgMHg3QSwgMHhGMSwgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwgMHg2NSwgMHg0MywgMHgwMiwgMHgwMiwgMHg3OSwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgwRiwgMHg2MCwgMHhBRSwgMHg2NSwgMHhEOCwgMHhGMywgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywKKwkgMHg2MSwgMHg0NSwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywKKwkgMHhBNCwgMHg4NCwgMHg3QiwgMHhGQiwgMHg2RiwgMHhGMCwgMHg2MCwgMHg0NywgMHg5MCwgMHg4NCwgMHg2RiwgMHhGQSwgMHg2MCwgMHg0NywgMHg2MCwgMHg0NSwKKwkgMHg4MCwgMHg2NCwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwgMHg3MCwgMHhGMCwgMHg3MCwgMHhGQSwKKwkgMHgwMCwgMHg2MSwgMHhFOCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNSwgMHhERCwgMHg4MSwgMHhGQiwgMHgwMSwgMHhFMSwgMHg4MSwgMHgwRiwgMHg2MCwKKwkgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHg2NiwgMHg0MywgMHgwQywgMHhGNCwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg4QywgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwKKwkgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgyNywgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgzQiwgMHgxMiwgMHgwMCwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg5QSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwKKwkgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgxMywgMHgwMCwgMHgwMiwgMHgzQiwgMHgxMSwgMHgwMCwgMHhCOCwgMHhGMSwKKwkgMHgyNywgMHg2MCwgMHg5QywgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywKKwkgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwKKwkgMHgxQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHhFNCwgMHhBNCwgMHgzRSwgMHhGQSwgMHgyQSwgMHhGMiwgMHgyOCwgMHg0MSwgMHg0MCwgMHhBOCwgMHgwMSwgMHhCMSwKKwkgMHgwMiwgMHgwMiwgMHg2MiwgMHgwMiwgMHg5MiwgMHgwMCwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgyQiwgMHgwMCwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwKKwkgMHg4QSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwKKwkgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgxQiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg5MCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEOCwgMHg4MCwKKwkgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwKKwkgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwKKwkgMHg4OCwgMHhGRiwgMHgwRiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyNiwgMHgyOCwgMHgwMCwgMHgzMiwgMHg0NCwgMHgwMiwgMHgyNiwKKwkgMHgyNSwgMHgwMCwgMHgxMCwgMHgyQiwgMHgyOSwgMHgwMCwgMHgyOCwgMHg2MCwgMHhFMiwgMHg2MywgMHhCRiwgMHhEMywgMHgyQywgMHhGMCwgMHgwMCwgMHhBOCwKKwkgMHg2MCwgMHg0MSwgMHgwRCwgMHgwMywgMHg1MCwgMHhGRSwgMHhCRCwgMHhEMywgMHgyRCwgMHhGMCwgMHhEMCwgMHg4MCwgMHhCRCwgMHhEMywgMHgyRSwgMHhGMCwKKwkgMHhEMCwgMHg4MCwgMHhCRCwgMHhEMywgMHgyQywgMHhGMCwgMHhEMCwgMHg4MCwgMHhGQSwgMHhBMSwgMHgxMCwgMHgwQywgMHhGMywgMHgwMiwgMHg1MCwgMHhGRSwKKwkgMHg2MCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhEMCwgMHg4MCwgMHgyRCwgMHhGMCwgMHgxRCwgMHg2NCwgMHhEMCwgMHg4MCwgMHgyRSwgMHhGMCwgMHgwMSwgMHg2NCwKKwkgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwQywgMHhDNSwgMHg2MCwgMHg1QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMiwgMHg0MCwgMHg0MCwgMHgyQSwKKwkgMHgwMywgMHgwMCwgMHgxOSwgMHg2MCwgMHgyMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDNSwgMHg2MCwgMHg1NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMiwgMHg0MCwKKwkgMHg0MCwgMHgyNiwgMHhGNywgMHgwMSwgMHgyQSwgMHhGMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgyQSwgMHgwMCwgMHhEQywgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgwNywgMHhCNCwgMHgwMywgMHhBOCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHgzMiwgMHg0MCwgMHgwMiwgMHgyQSwgMHgxRCwgMHgwMCwKKwkgMHgwMywgMHg2NywgMHhBMCwgMHg4NCwgMHgwMCwgMHgzNywgMHg2NCwgMHg2MywgMHg2MCwgMHg0MCwgMHgwMiwgMHgzNywgMHg1RSwgMHg2MywgMHg2MCwgMHg0MCwKKwkgMHgwMSwgMHgzNywgMHg1OCwgMHg2MywgMHg2MCwgMHg0MCwgMHgwMywgMHgzNywgMHgwRCwgMHgwMCwgMHhCRCwgMHhEMiwgMHg4MSwgMHhGMSwgMHhCRCwgMHhEMiwKKwkgMHhEMCwgMHg4MCwgMHg4MiwgMHhGMSwgMHgwNywgMHgwMiwgMHhEMCwgMHg4MCwgMHhCRCwgMHhEMiwgMHg4MywgMHhGMSwgMHgwMywgMHgwMiwgMHhEMCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHhDNSwgMHg2MCwgMHg1QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhERSwgMHg2MCwgMHg1OCwgMHg0RiwgMHhGRSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyNiwgMHgwNiwgMHgwMCwgMHgyMCwgMHg0MCwgMHgxMCwgMHgyQiwKKwkgMHgwMywgMHgwMCwgMHhDNSwgMHg2MCwgMHg1NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4NywgMHhGNCwgMHhBOSwgMHhGMSwgMHgyNywgMHgxQiwgMHgzMSwgMHhGMiwKKwkgMHgxQywgMHg2MCwgMHhCQSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwKKwkgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgzMSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwKKwkgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgzMCwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwKKwkgMHgyRiwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwKKwkgMHhFOCwgMHgxQiwgMHhBOSwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHgwMywgMHgwMCwgMHhEMywgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHhENiwgMHgwMywgMHg0MywgMHg0MywgMHhEQywgMHhGMywgMHgzMiwgMHg0MCwgMHgwMiwgMHgyNiwgMHgwNCwgMHgwMCwgMHgwNywgMHhCNCwgMHgwMywgMHhBOCwKKwkgMHgyQSwgMHhGMiwgMHg1RiwgMHgwMiwgMHhBOSwgMHhGMSwgMHgyMywgMHg0MywgMHhEMywgMHg4MCwgMHhGRiwgMHhGRiwgMHg1QSwgMHgwMiwgMHhDNSwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHhBNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMiwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwNSwgMHgwMCwgMHg2MywgMHg0NiwgMHgwMiwgMHg2NCwKKwkgMHgwNiwgMHhGQSwgMHgyNiwgMHg0NiwgMHg0RSwgMHgwMCwgMHgzMiwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwNSwgMHgwMCwgMHg2MywgMHg0NiwgMHg4MCwgMHg2MCwKKwkgMHgwMiwgMHg2NCwgMHgwNiwgMHhGQSwgMHgyNiwgMHg0NiwgMHhEOCwgMHhGMywgMHg2MywgMHg0NSwgMHg2NiwgMHg0MSwgMHg2NSwgMHg0NiwgMHg4QywgMHhGQSwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwNiwgMHgwMCwgMHgwMiwgMHgzNiwgMHgwNCwgMHgwMCwgMHgwNCwgMHgzNiwgMHgwMiwgMHgwMCwgMHgwNSwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwMSwgMHgwMCwgMHgwMSwgMHg2NCwgMHg2RiwgMHhGQSwgMHg3OSwgMHhGMywgMHg3QSwgMHhGMSwgMHhGRiwgMHhGRiwKKwkgMHhBMCwgMHg4NCwgMHg2NSwgMHg0MywgMHgwMiwgMHgwMiwgMHg3OSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgwRiwgMHg2MCwgMHhBRSwgMHg2NSwKKwkgMHhEOCwgMHhGMywgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2MSwgMHg0NSwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMiwKKwkgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwgMHg3QiwgMHhGQiwgMHg2RiwgMHhGMCwgMHg2MCwgMHg0NywKKwkgMHg5MCwgMHg4NCwgMHg2RiwgMHhGQSwgMHg2MCwgMHg0NywgMHg2MCwgMHg0NSwgMHg4MCwgMHg2NCwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwgMHg3MCwgMHhGMCwgMHg3MCwgMHhGQSwgMHgwMCwgMHg2MSwgMHhFOCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNSwKKwkgMHhERCwgMHg4MSwgMHhGQiwgMHgwMSwgMHhFMSwgMHg4MSwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHg2NiwgMHg0MywKKwkgMHgwQywgMHhGNCwgMHgwNywgMHhGQywgMHg0MywgMHg0MywgMHgwMiwgMHhGRSwgMHgxRCwgMHhGMCwgMHgxQywgMHg2MCwgMHg5QSwgMHg2MiwgMHhDMCwgMHg2NCwKKwkgMHhDMCwgMHg4NCwgMHhBMiwgMHhEMSwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhDMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgyQSwgMHhGMiwgMHg2MywgMHg0NSwgMHgwQywgMHhCNCwgMHgwOCwgMHgzQSwgMHgwQSwgMHgwMCwgMHhEQywgMHhGMywgMHgyMywgMHg0NiwKKwkgMHgwNywgMHhCNCwgMHhGRCwgMHhBMCwgMHgwNiwgMHhGMiwgMHgyNiwgMHg0NiwgMHgwMywgMHgwMywgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwRCwgMHgwMCwKKwkgMHgyQSwgMHhGMiwgMHgzNSwgMHhGMCwgMHg2MCwgMHg0MCwgMHhBNCwgMHgzNiwgMHgwQiwgMHgwMCwgMHgwOCwgMHgyQiwgMHgwQywgMHgwMCwgMHgyMywgMHg0NiwKKwkgMHgyMiwgMHhGMiwgMHgyNiwgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNiwgMHgwMiwgMHhDNSwgMHg2MCwgMHg1QiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhDNSwgMHg2MCwgMHg1NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMywgMHg0NiwgMHgxRSwgMHhGMiwgMHgyNiwgMHg0NiwgMHg0NCwgMHg0QywgMHgwRiwgMHgyNiwKKwkgMHgxRCwgMHgwMCwgMHgwMCwgMHhCQywgMHg0MCwgMHg0NSwgMHgwQiwgMHgwMywgMHgwMCwgMHg2NCwgMHgyMywgMHg0NiwgMHgxRSwgMHhGQSwgMHgyNiwgMHg0NiwKKwkgMHhBMiwgMHhGRiwgMHhBRiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHhGRiwgMHgyNiwgMHg0NiwgMHgyQSwgMHhGMCwKKwkgMHgyQywgMHg0NCwgMHg2NCwgMHg0MCwgMHgwNCwgMHgyNywgMHgwQSwgMHgwMCwgMHgyMywgMHg0NiwgMHgyMiwgMHhGQSwgMHgyNiwgMHg0NiwgMHgxQiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHhFNCwgMHhBNCwgMHgzRSwgMHhGQSwgMHhDNCwgMHg2MCwgMHhBRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHhGMiwgMHgwMiwgMHhGQSwKKwkgMHhBMiwgMHhGRiwgMHgxNiwgMHhGMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NCwgMHgwMSwgMHgyNiwgMHhEQywgMHg5QywgMHhCMywgMHhGMywgMHgyQSwgMHhGMiwKKwkgMHhEQywgMHg4MywgMHhCMywgMHhGRCwgMHgwNiwgMHhGNCwgMHgwMSwgMHhGOCwgMHgyNiwgMHg0NiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgxOCwgMHgwMCwKKwkgMHg2NCwgMHg0NCwgMHgwMCwgMHg2NSwgMHhGRiwgMHhCNCwgMHhGQywgMHhBNCwgMHgwNiwgMHhGMCwgMHgwMywgMHgwMywgMHg2NCwgMHg0NiwgMHgwQywgMHgwRCwKKwkgMHgwMiwgMHg2NSwgMHgyNiwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywgMHg2MCwgMHg0NiwKKwkgMHhGOSwgMHgwMSwgMHgwMSwgMHhGMiwgMHhGRiwgMHhGRiwgMHhENCwgMHg4NCwgMHgwMSwgMHhGQSwgMHg2NiwgMHg0NCwgMHgyNiwgMHg0NiwgMHgwNiwgMHhGQSwKKwkgMHgwNiwgMHhGNCwgMHgwMCwgMHhGMiwgMHg4MCwgMHhGQywgMHg0MCwgMHg0NSwgMHhBRiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5NSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhBMywgMHhGRiwgMHgyNiwgMHg0NiwgMHgyQywgMHg0NCwgMHgwRiwgMHgyNiwgMHgxNCwgMHgwMCwgMHgyMywgMHg0NiwgMHgyMiwgMHhGQSwgMHgyNiwgMHg0NCwKKwkgMHgxRSwgMHhGQSwgMHgyNiwgMHg0NiwgMHgxQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHhFNCwgMHhBNCwgMHgzRSwgMHhGQSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHg2RiwgMHgwMCwgMHhBMywgMHg0NiwgMHgyMiwgMHhGMiwgMHg2MCwgMHg0NSwgMHhEQywgMHg4NCwgMHhENCwgMHg4MCwgMHgyMiwgMHhGQSwgMHhBMywgMHg0NiwKKwkgMHg2QywgMHgwMiwgMHgyQSwgMHhGMCwgMHhBMywgMHg0NiwgMHgxRSwgMHhGMiwgMHhBMywgMHg0NiwgMHgwMCwgMHhCQywgMHgwMCwgMHhGMiwgMHgwMSwgMHgwMiwKKwkgMHg2NCwgMHgwMCwgMHg0NCwgMHg0QywgMHgzRiwgMHhGMCwgMHg2MCwgMHg0MywgMHgyMywgMHg0NiwgMHgxRSwgMHhGNCwgMHgwOSwgMHg2MCwgMHgwMCwgMHg2NSwKKwkgMHgzRiwgMHhGMiwgMHgyNiwgMHg0NiwgMHhDMCwgMHg4NCwgMHhENCwgMHg4MCwgMHg2MCwgMHg0NSwgMHg1NywgMHgwNywgMHg4MCwgMHhGQywgMHgxQiwgMHhGMiwKKwkgMHgwNiwgMHhGMiwgMHg2MCwgMHg0MSwgMHgyMywgMHg0NiwgMHgxRSwgMHhGNCwgMHgxQiwgMHhGMCwgMHgwNiwgMHhGMCwgMHhDMSwgMHg4MSwgMHgwNiwgMHhGQSwKKwkgMHgwNSwgMHhGQSwgMHg5QiwgMHhGQSwgMHg2NSwgMHg0NCwgMHgzRiwgMHhGQSwgMHg2NCwgMHg0NiwgMHgwMCwgMHhGQywgMHg2MywgMHg0NiwgMHgwMSwgMHhGMiwKKwkgMHgxMCwgMHg2MSwgMHhGMiwgMHhBNCwgMHgwMSwgMHhGQSwgMHhDOCwgMHg4MywgMHgwMiwgMHg2NCwgMHg1OSwgMHhEMCwgMHg1OCwgMHhEOCwgMHhGRCwgMHgxRiwKKwkgMHgwNiwgMHg0NSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNSwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhBMiwgMHhGRiwgMHgwMCwgMHhGNCwgMHgwMSwgMHhGMCwgMHgwQSwgMHgxOCwgMHg3MCwgMHg2NywKKwkgMHhBMCwgMHg4MCwgMHhGMCwgMHg2NywgMHgwNiwgMHgwMywgMHhDMCwgMHg4NCwgMHgwMSwgMHhGQSwgMHgyNSwgMHg0NiwgMHgyNSwgMHg0NCwgMHg4MCwgMHhGQywKKwkgMHgwNSwgMHhGQSwgMHhBRiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhENCwgMHhGRSwgMHhBMywgMHhGRiwgMHgyQywgMHg0NCwKKwkgMHgwNCwgMHgyNywgMHgxNiwgMHgwMCwgMHgyMywgMHg0NiwgMHgxRSwgMHhGMiwgMHg5RSwgMHhGQywgMHg2MCwgMHg0NiwgMHg0NiwgMHg0NiwgMHgzRiwgMHhGMiwKKwkgMHgwMCwgMHhGNCwgMHg2MCwgMHg0NywgMHgwOCwgMHhGQSwgMHgyNiwgMHg0NiwgMHgyQywgMHg0MywgMHgyQSwgMHhGQywgMHgwNiwgMHhGNCwgMHgwMCwgMHg2NCwKKwkgMHgwMCwgMHhGQSwgMHgwMSwgMHhGMCwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHgwMSwgMHhGQSwgMHgyNiwgMHg0NiwgMHgxRCwgMHgwMCwKKwkgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhCRiwgMHg2MCwgMHhFQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHg0NiwgMHgxRSwgMHhGMCwgMHg5RSwgMHhGQywKKwkgMHgwMCwgMHg2MywgMHgzMywgMHg4NSwgMHhBMywgMHg0NiwgMHgwRCwgMHgwMywgMHhBMywgMHg0NiwgMHgyMiwgMHhGMiwgMHgwRiwgMHg2NSwgMHhBNCwgMHg4NSwKKwkgMHhENCwgMHg4NCwgMHgyMiwgMHhGQSwgMHhBMywgMHg0NiwgMHhBMiwgMHhGRiwgMHhBRiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5NSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhBMywgMHhGRiwgMHgyNiwgMHg0NiwgMHhDNSwgMHg2MCwgMHg1QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHgzMiwgMHhGMCwgMHg2MCwgMHg0MCwKKwkgMHgwOCwgMHgyQSwgMHg1QywgMHgwMCwgMHgwMSwgMHgyQiwgMHgyRiwgMHgwMCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgyQywgMHgwMCwgMHhCOCwgMHhGMSwKKwkgMHgyNywgMHg2MCwgMHg4QSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywKKwkgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwKKwkgMHgxQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg5MCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwKKwkgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgyQiwgMHgwMCwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg4OCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwKKwkgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgxQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwgMHhCOCwgMHhGMSwKKwkgMHgyNywgMHg2MCwgMHg4RSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwKKwkgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwKKwkgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgwNywgMHhGNCwgMHhGRiwgMHhGRiwKKwkgMHgyMiwgMHhGMiwgMHgyNiwgMHg0NiwgMHgwRiwgMHhCNCwgMHhEQywgMHg4NSwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg4QywgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywKKwkgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QSwgMHhGRiwKKwkgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgyNywgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzQiwgMHgxMiwgMHgwMCwKKwkgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg5QSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwKKwkgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwKKwkgMHg4OCwgMHhGRiwgMHgxMywgMHgwMCwgMHgwMiwgMHgzQiwgMHgxMSwgMHgwMCwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg5QywgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwKKwkgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHhDNiwgMHg2MCwgMHg4NSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhCRiwgMHg2MCwgMHhFQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhCRiwgMHg2MCwgMHhFQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwKKwkgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHg1OCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGOCwgMHhGRSwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhCRiwgMHg2MCwgMHhFQiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyQSwgMHhGMiwgMHg1OCwgMHg2MywgMHg2MCwgMHg0NywgMHgwMSwgMHgyNywgMHg2NCwgMHg2MywgMHgzMSwgMHg2MCwgMHgyOCwgMHg2MiwgMHg2MSwgMHg1QywKKwkgMHhBMiwgMHhEOSwgMHhCRCwgMHhEMCwgMHhCRCwgMHhEMCwgMHg2NCwgMHg0NSwgMHg2NCwgMHg0MSwgMHhCRCwgMHhEMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHhGOCwKKwkgMHg4MywgMHhGQSwgMHg4MiwgMHhGOCwgMHhBNiwgMHg0NiwgMHgwMiwgMHhCMCwgMHg1RSwgMHg2MywgMHgwNCwgMHgwMywgMHg2NCwgMHg2MywgMHgwMywgMHhCMCwKKwkgMHgwMiwgMHgzQSwgMHg2QywgMHg2MywgMHgzRiwgMHhGMiwgMHhCRCwgMHhEMCwgMHhCRCwgMHhEMCwgMHg2NCwgMHg0NSwgMHg2NCwgMHg0MSwgMHhCRCwgMHhEMCwKKwkgMHhBNiwgMHg0NiwgMHgwNywgMHhGOCwgMHg4NiwgMHhGQSwgMHg4NSwgMHhGOCwgMHg2MCwgMHg0NywgMHgwOCwgMHhGQSwgMHgzMSwgMHg2MCwgMHgyOCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgyNiwgMHg0NiwgMHg2NCwgMHg0MSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhBOSwgMHhGNSwgMHgwMCwgMHhGMiwgMHgyNiwgMHg0NiwKKwkgMHgzMSwgMHhGMCwgMHgzOSwgMHgxOCwgMHg2NiwgMHg0MSwgMHgxQywgMHg2MCwgMHhCQSwgMHg2NSwgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhBOSwgMHhGMSwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NCwgMHg0MywgMHgxMSwgMHgxOCwgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGQywgMHgxQiwKKwkgMHg2NiwgMHg0NCwgMHg2NCwgMHg0NiwgMHg4MCwgMHhGMCwgMHg2MCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHg2NSwgMHg0MywgMHg4MCwgMHhGMCwKKwkgMHgwMSwgMHhGQSwgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwgMHgwQiwgMHgwMCwgMHg2NCwgMHg0NiwgMHg2MiwgMHg0MywgMHgwMCwgMHhGMiwKKwkgMHhBMywgMHhEQiwgMHg2MCwgMHg0NiwgMHg4MCwgMHhGMCwgMHg4MSwgMHhGQywgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2MCwgMHg0MywKKwkgMHg2MSwgMHg0NiwgMHgxRSwgMHg2MCwgMHhCQywgMHg2MSwgMHhBMSwgMHhEMywgMHgxRSwgMHg2MCwgMHhGRSwgMHg3QywgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwNywgMHgwMywgMHhBMCwgMHhERCwgMHhEQSwgMHg5QywgMHhBMSwgMHhEOSwgMHg0OSwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhBMSwgMHhEQiwKKwkgMHhDNiwgMHg2MCwgMHg0MCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg3QywgMHg3MiwgMHg0NCwgMHhGRiwgMHhCNCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHgwNCwgMHhEMCwgMHg4NCwgMHhGQiwgMHgwMSwgMHhFMCwgMHg4MywgMHhBOSwgMHhGMywgMHgwMiwgMHhBMywgMHg0MywgMHg5MywgMHhBOSwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgwMiwgMHhBNSwgMHhENywgMHg4MCwgMHgwNCwgMHhBNSwgMHgwOCwgMHgyNCwgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2MywgMHg0NiwKKwkgMHgwNSwgMHhGMiwgMHgwMCwgMHhGMCwgMHg4MSwgMHhGMCwgMHgwMiwgMHgxOCwgMHg2NCwgMHg0NiwgMHg4MSwgMHhGOCwgMHgwNywgMHgxQiwgMHgxQywgMHg2MCwKKwkgMHhCQSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEOSwgMHgwMiwgMHgwMCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGOCwKKwkgMHhBOSwgMHhGMywgMHg2MywgMHg0NSwgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhENCwgMHg4MCwgMHgwMSwgMHgxOCwgMHhGQSwgMHgwNCwKKwkgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGQSwgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RSwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwKKwkgMHgzMSwgMHhGMCwgMHg2NiwgMHg0MSwgMHgxQywgMHg2MCwgMHhCQSwgMHg2NSwgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhBOSwgMHhGMSwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEMywgMHg2NCwgMHg0MywgMHgxMSwgMHgxOCwgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGQywgMHgxQiwgMHg2NiwgMHg0NCwKKwkgMHg2NCwgMHg0NiwgMHg4MCwgMHhGMCwgMHg2MCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHg2NSwgMHg0MywgMHg4MCwgMHhGMCwgMHgwMSwgMHhGQSwKKwkgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwgMHgwQiwgMHgwMCwgMHg2NCwgMHg0NiwgMHg2MiwgMHg0MywgMHgwMCwgMHhGMiwgMHhBMywgMHhEQiwKKwkgMHg2MCwgMHg0NiwgMHg4MCwgMHhGMCwgMHg4MSwgMHhGQywgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwKKwkgMHgyRiwgMHhGMiwgMHgzMCwgMHhGMCwgMHgzMSwgMHhGMCwgMHg2NCwgMHg0NSwgMHg0NiwgMHg0MywgMHg2MywgMHg0NiwgMHgwMywgMHhGQSwgMHgwNiwgMHhGMiwKKwkgMHg4NCwgMHhGOCwgMHgwMCwgMHg3RSwgMHgwNiwgMHhGQSwgMHgwNSwgMHhGOCwgMHhBMywgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhEQywgMHhGMywKKwkgMHgyQSwgMHhGMiwgMHgwNywgMHhCMCwgMHgwMywgMHgzQSwgMHgyQSwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwOSwgMHhGMiwgMHg2MCwgMHg0NSwgMHg4MCwgMHgzQSwKKwkgMHgwNSwgMHgwMCwgMHgwRSwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMiwgMHhCMCwgMHgwRiwgMHhGMiwgMHgyMCwgMHgwMywgMHg2MCwgMHg0NywgMHgwMCwgMHgzQSwKKwkgMHgxRCwgMHgwMCwgMHg2MCwgMHg0MSwgMHgwMCwgMHgzNiwgMHgxMywgMHgwMCwgMHhEQSwgMHg4NSwgMHgyRCwgMHg2MCwgMHg3QSwgMHg2MywgMHhCRCwgMHhEMSwKKwkgMHhGRiwgMHhGRiwgMHhEMSwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxMiwgMHgwMiwgMHg2MCwgMHhGRSwgMHhCRCwgMHhEMywgMHhBNSwgMHhEMCwgMHhERSwgMHg4NSwKKwkgMHhEMCwgMHg4MCwgMHhDRCwgMHg4MSwgMHgwQiwgMHgwMiwgMHhGOSwgMHgwMiwgMHgyMCwgMHhGRSwgMHgwMCwgMHg2NCwgMHgwQSwgMHgwMCwgMHgyNiwgMHg0NiwKKwkgMHg0OCwgMHhGRSwgMHg2NSwgMHg0MCwgMHg0MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMSwgMHg2NCwgMHgwMywgMHgwMCwgMHgwOCwgMHhGRSwgMHgyMCwgMHhGRSwKKwkgMHgwMCwgMHg2NCwgMHg0MCwgMHg0OCwgMHgyNiwgMHg0NiwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyRCwgMHg2MCwgMHg1MiwgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHgxOCwgMHhGMiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgyQSwgMHhGQSwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyNiwKKwkgMHgwMywgMHgwMCwgMHhDNywgMHg2MCwgMHg2RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHhGMCwgMHgzMiwgMHg0MCwgMHgxMCwgMHgyQSwgMHgyMCwgMHgwMCwKKwkgMHgyQywgMHhGMCwgMHg2NCwgMHg0MSwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyNywgMHgxQiwgMHgwMCwgMHhDRCwgMHg4MSwgMHhERCwgMHg4MSwgMHgxOCwgMHgwMywKKwkgMHgxNywgMHgwMywgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgxNCwgMHgwMCwgMHgwMSwgMHg2MSwgMHgxMywgMHgwMCwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwKKwkgMHhBMCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwKKwkgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgyMywgMHgwMCwKKwkgMHgwMCwgMHg2MSwgMHg2MCwgMHg0MCwgMHgxOCwgMHgzNiwgMHgxRiwgMHgwMCwgMHhDNSwgMHg2MCwgMHg1OCwgMHg0RiwgMHg3OCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwRiwgMHhGMCwgMHhFQiwgMHhGMSwgMHg2NCwgMHg0NCwgMHg2MCwgMHgyMiwgMHgxOSwgMHgwMCwgMHhEQywgMHhGMywgMHhGRiwgMHhGRiwgMHgwNywgMHhCNCwKKwkgMHhGRCwgMHhBMCwgMHgyQSwgMHhGMiwgMHgwMywgMHgwMiwgMHgwOCwgMHhCMCwgMHhGRiwgMHhGRiwgMHgxMCwgMHgwMiwgMHgzMiwgMHhGMiwgMHgzMywgMHhGMiwKKwkgMHhEMCwgMHg4MCwgMHhFQywgMHhGMSwgMHgwQiwgMHgwMiwgMHhEMCwgMHg4MCwgMHgzNCwgMHhGMiwgMHgwOCwgMHgwMiwgMHhFRCwgMHhGMSwgMHhGRiwgMHhGRiwKKwkgMHhEMCwgMHg4MCwgMHgwRiwgMHhGMCwgMHgwMywgMHgwMiwgMHhDNywgMHg2MCwgMHhCOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhGNCwgMHhBQSwgMHg2MCwKKwkgMHhBQSwgMHg2NSwgMHgwOSwgMHhGMiwgMHg1QSwgMHhEMCwgMHhENCwgMHg4MCwgMHgwMywgMHg2NCwgMHg0RiwgMHgwMiwgMHhEMCwgMHg4MCwgMHgwMCwgMHg2NCwKKwkgMHg1QSwgMHhEMCwgMHg0QiwgMHgwMiwgMHg2NCwgMHg0NSwgMHhENCwgMHg4MCwgMHhGOCwgMHg3RiwgMHgwOCwgMHgwMiwgMHg1QSwgMHhEMCwgMHgyNiwgMHg0NiwKKwkgMHg2NCwgMHg0NSwgMHgyMywgMHhGMCwgMHgyMCwgMHg2NywgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHgwQiwgMHgwMCwgMHhENCwgMHg4MCwgMHgxRCwgMHg2MCwKKwkgMHg2MCwgMHg2NCwgMHgxNiwgMHgwMiwgMHg1QSwgMHhEMCwgMHgyNiwgMHg0NiwgMHg2NCwgMHg0NSwgMHgyMywgMHhGMCwgMHg0MCwgMHg2NywgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQSwgMHg2NSwgMHg0NCwgMHg4OCwgMHgzQSwgMHgwNywgMHgwMCwgMHg3NywgMHgzNywgMHgwOCwgMHgwMCwgMHg3OCwgMHgzNywgMHgwNiwgMHgwMCwKKwkgMHg4RSwgMHgzNywgMHgwNCwgMHgwMCwgMHgyQSwgMHgwMCwgMHg4MSwgMHgzQSwgMHgyOCwgMHgwMCwgMHg4MCwgMHgzNywgMHgwMCwgMHg2MSwgMHgyNSwgMHgwMCwKKwkgMHhENCwgMHg4MCwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHg1QSwgMHhEMCwgMHgyMCwgMHgwMiwgMHhEMCwgMHg4MCwgMHg1QSwgMHhEMCwgMHgxRCwgMHgwMiwKKwkgMHgyNiwgMHg0NiwgMHg2NCwgMHg0NywgMHg3RiwgMHhCNCwgMHhGRCwgMHhBMCwgMHgwOSwgMHgwMywgMHgxNywgMHgwNywgMHgzMiwgMHg0MCwgMHgwMiwgMHgyNiwKKwkgMHg0NywgMHgwMCwgMHgyMywgMHhGMCwgMHg2MCwgMHg2NywgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHg0MiwgMHgwMCwgMHgwRiwgMHhGMiwgMHgzMiwgMHg0MCwKKwkgMHgwMiwgMHgyNiwgMHgzRSwgMHgwMCwgMHhGMiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCQywgMHhGMiwgMHhGQiwgMHhFQiwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHhBNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDNywgMHg2MCwgMHhDMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHg2MSwgMHg0MCwgMHgwMSwgMHgyQSwKKwkgMHgxMiwgMHgwMCwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHhBMCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwKKwkgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHg2RSwgMHgwMCwgMHgwRiwgMHhGMiwgMHg4MSwgMHhGMSwgMHgyQSwgMHhGMiwgMHg2MCwgMHg0MCwgMHgyMCwgMHgyQSwKKwkgMHgxMiwgMHgwMCwgMHg1RSwgMHg2MywgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQiwgMHg2NCwgMHg2MywgMHhCRCwgMHhEMiwgMHhCRCwgMHhEMiwgMHhEMCwgMHg4MCwKKwkgMHg4MiwgMHhGMSwgMHgwOCwgMHgwMiwgMHhEMCwgMHg4MCwgMHhBMywgMHhEMiwgMHg4MywgMHhGMSwgMHgwNCwgMHgwMiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgwMiwgMHgwNiwgMHgwMCwgMHg1NiwgMHgwMCwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg0OCwgMHgzNiwgMHg1MSwgMHgwMCwKKwkgMHhGMiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCQywgMHhGMiwgMHhGQiwgMHg1OSwgMHgwMCwgMHgyNiwgMHg0NiwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHgwQywgMHgyNiwgMHg0NiwgMHgwMCwgMHhCMCwgMHgzNiwgMHgxNSwgMHgwMCwgMHgxMCwgMHgzNiwgMHgxMywgMHgwMCwgMHgzMCwgMHgzNiwKKwkgMHgxMSwgMHgwMCwgMHhDMCwgMHgzNiwgMHgwMiwgMHgwMCwgMHhBMCwgMHgzQSwgMHgxMiwgMHgwMCwgMHg4MSwgMHhGMSwgMHgzMiwgMHhGMiwgMHgzMywgMHhGMiwKKwkgMHhEMCwgMHg4MCwgMHg4MiwgMHhGMSwgMHgzNiwgMHgwMiwgMHhEMCwgMHg4MCwgMHgzNCwgMHhGMiwgMHg4MywgMHhGMSwgMHgzMiwgMHgwMiwgMHhEMCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgyRiwgMHgwMiwgMHhEQiwgMHg2MCwgMHg1OCwgMHg0RiwgMHhEMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHgwMCwgMHg1MCwgMHgzQSwKKwkgMHgwNSwgMHgwMCwgMHhFRiwgMHg2MCwgMHg1OCwgMHg0RiwgMHhFMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHgwMCwgMHg0MCwgMHgzQSwgMHgwNSwgMHgwMCwKKwkgMHhFOCwgMHg2MCwgMHg1OCwgMHg0RiwgMHg2MCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxOCwgMHgwMCwgMHg4MCwgMHgzQSwgMHgxNSwgMHgwMCwgMHg4MSwgMHhGMSwKKwkgMHgzMiwgMHhGMiwgMHgzMywgMHhGMiwgMHhEMCwgMHg4MCwgMHg4MiwgMHhGMSwgMHgxNCwgMHgwMiwgMHhEMCwgMHg4MCwgMHgzNCwgMHhGMiwgMHg4MywgMHhGMSwKKwkgMHgxMCwgMHgwMiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwRCwgMHgwMiwgMHhERiwgMHg2MCwgMHg1OCwgMHg0RiwgMHgyOCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyMCwgMHg2MCwgMHg1OCwgMHg0RiwgMHhCRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMCwgMHg2NiwgMHg0NCwgMHgwMCwgMHhBOCwgMHhGRiwgMHhGRiwKKwkgMHgwQSwgMHgwMywgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhDNSwgMHg2MCwgMHg1OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHgzQiwgMHhGMCwKKwkgMHg2MCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgxRSwgMHgwMCwgMHhDMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHg2NCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgxOSwgMHgwMCwKKwkgMHgyMiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhCNCwgMHhGRiwgMHhGRiwgMHgxNCwgMHgwMywgMHhDMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgyNiwgMHg0NiwKKwkgMHhBMCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgyMywgMHhGMiwgMHgxMCwgMHhCRCwgMHhCNCwgMHg5QywgMHgzRiwgMHhGMiwKKwkgMHgyMywgMHhGOCwgMHgzRiwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGOCwgMHhBNCwgMHgzRiwgMHhGQSwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0NywgMHgwOCwgMHhGQSwKKwkgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHg1OCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGOCwgMHhGRSwgMHhDQiwgMHgwMSwgMHgwMCwgMHg2MCwgMHgzMCwgMHg2MSwKKwkgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg2MCwgMHhGQiwgMHgwMCwgMHg2MCwgMHgzMCwgMHg2MSwKKwkgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg1RiwgMHhGQiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2MSwKKwkgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg2NiwgMHhGQiwgMHgxMCwgMHg2MCwgMHgyNiwgMHg2MiwKKwkgMHhDOSwgMHg2MCwgMHhDNywgMHg2NCwgMHhBMiwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgwMSwgMHg2NCwgMHhEQywgMHhGQiwgMHhGMiwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHhGMiwgMHhGQiwgMHgwRiwgMHg2MCwgMHhGMCwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2MCwgMHgxNCwgMHg2MywgMHgwMSwgMHg2MCwgMHhDNCwgMHg2MSwgMHgyOCwgMHg2MCwgMHgzRSwgMHg2NCwKKwkgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHgwMCwgMHg2MCwgMHg4OCwgMHg2MywgMHgyNywgMHg2MCwgMHhCNCwgMHg2MSwgMHgyOCwgMHg2MCwKKwkgMHg1NCwgMHg2NCwgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHg0NSwgMHhBOSwgMHhGMSwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgzNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2NSwgMHg0MCwgMHgwMSwgMHgzNiwKKwkgMHgyMiwgMHg2NCwgMHgzNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgzMiwgMHg0NSwgMHgyOCwgMHg2MCwgMHgzQywgMHg2MiwgMHhBMiwgMHhEMSwgMHgxMCwgMHg2NywKKwkgMHhCNCwgMHg4NSwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHg5NCwgMHg4NSwgMHg0NSwgMHg1MiwgMHhGRiwgMHg2MCwgMHhFNywgMHg2NSwgMHgzMiwgMHg0MSwKKwkgMHhBNSwgMHg4MSwgMHgyRCwgMHg2MCwgMHgxQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEMywgMHg2NCwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgwRCwgMHgwMCwgMHgwOCwgMHg2NSwgMHhGRiwgMHhBMCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHgwOCwgMHgwMCwgMHgyOCwgMHg2MCwKKwkgMHgzMCwgMHg2MiwgMHhBMiwgMHhEMywgMHhCNSwgMHg4MSwgMHgxMCwgMHg2NSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHhCNSwgMHg4MSwgMHg0MSwgMHg1MiwKKwkgMHgyRCwgMHg2MCwgMHgxQSwgMHg2MiwgMHhBMiwgMHhEMywgMHgzMSwgMHg2MCwgMHgxOCwgMHg2MywgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwKKwkgMHgwMSwgMHhCNSwgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwgMHgwMywgMHhCNCwgMHg2NSwgMHg1QywgMHhBMywgMHhEOSwgMHgzMSwgMHg2MCwgMHgxQSwgMHg2MywKKwkgMHgwMiwgMHhBOCwgMHhBMywgMHhEQiwgMHgxQiwgMHgwMiwgMHgwNywgMHg2MCwgMHhEMCwgMHg2NCwgMHgzMSwgMHg2MCwgMHgxQywgMHg2MywgMHhBMywgMHhEQiwKKwkgMHgzMSwgMHg2MCwgMHgyNCwgMHg2MywgMHhBMywgMHhEQiwgMHgwMCwgMHg2MCwgMHhDOCwgMHg2NCwgMHgzMSwgMHg2MCwgMHgxRSwgMHg2MywgMHhBMywgMHhEQiwKKwkgMHgzMSwgMHg2MCwgMHgyNiwgMHg2MywgMHhBMywgMHhEQiwgMHgwMCwgMHg2MCwgMHg2NCwgMHg2NCwgMHgzMSwgMHg2MCwgMHgyMCwgMHg2MywgMHhBMywgMHhEQiwKKwkgMHgwMSwgMHg2MCwgMHg5MCwgMHg2NCwgMHgzMSwgMHg2MCwgMHgyMiwgMHg2MywgMHhBMywgMHhEQiwgMHgwOCwgMHgwMCwgMHgwQSwgMHg2NCwgMHgzMSwgMHg2MCwKKwkgMHgyMCwgMHg2MywgMHhBMywgMHhEQiwgMHgwMSwgMHg2NCwgMHgzMSwgMHg2MCwgMHgyMiwgMHg2MywgMHhBMywgMHhEQiwgMHgyRCwgMHg2MCwgMHgxQSwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMSwgMHg2NCwgMHg2NCwgMHg0MCwgMHg0MCwgMHgyQSwgMHgwMywgMHgwMCwgMHgzMSwgMHg2MCwgMHgwRSwgMHg3QywgMHhBNCwgMHhEQiwKKwkgMHgxMiwgMHg2MCwgMHgyOCwgMHg2MywgMHhCQSwgMHhGMywgMHgwRSwgMHg2MSwgMHg2MCwgMHg0NSwgMHg2NSwgMHg0NCwgMHhFOCwgMHg4NSwgMHgwNSwgMHg2NCwKKwkgMHhDRCwgMHg4MSwgMHgwMiwgMHgyOCwgMHgwMCwgMHg2NCwgMHhCRCwgMHhEQiwgMHhGOCwgMHgwMiwgMHgyRCwgMHg2MCwgMHg3OCwgMHg2MSwgMHgyNywgMHg2MCwKKwkgMHhCNiwgMHg2NCwgMHgyMCwgMHg2MywgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHhCRCwgMHhGMSwgMHg4MCwgMHhGOSwgMHgxQSwgMHg2MywKKwkgMHgwMSwgMHg2MCwgMHgwMCwgMHg2MSwgMHgwMCwgMHg2NCwgMHg1OSwgMHhEQiwgMHhGRSwgMHgxRiwgMHg0MCwgMHg0MCwgMHgwMSwgMHg2NCwgMHg4NywgMHhGQiwKKwkgMHgyOCwgMHg2MCwgMHhDQywgMHg2MSwgMHhBMSwgMHhEMywgMHgyRSwgMHg2MCwgMHg5NiwgMHg2MSwgMHhGRSwgMHhBNCwgMHhFMCwgMHg4NCwgMHgwNCwgMHgyNCwKKwkgMHgwRiwgMHgwMCwgMHhFMCwgMHg4NCwgMHg0MSwgMHg5MSwgMHgyRCwgMHg2MCwgMHhDQywgMHg2MiwgMHhBMiwgMHhEMywgMHhBMSwgMHhEMSwgMHgyRCwgMHg2MCwKKwkgMHhDNCwgMHg2MiwgMHhBMCwgMHg4MywgMHhBMiwgMHhERCwgMHg1OSwgMHhEMSwgMHgyRCwgMHg2MCwgMHhDMiwgMHg2MiwgMHhBMCwgMHg4MywgMHhBMiwgMHhERCwKKwkgMHhFNSwgMHhGMywgMHg3RiwgMHhGQiwgMHgxQiwgMHg2MCwgMHhDNiwgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhCOCwgMHgxMCwgMHg2MCwKKwkgMHg1QywgMHg2NSwgMHgwRCwgMHgwMywgMHgxQiwgMHg2MCwgMHhDRSwgMHg2MywgMHhFNSwgMHhGMywgMHhBMywgMHhEMSwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhFNSwgMHhGOSwgMHg3RiwgMHhGOSwgMHhFNSwgMHhGMywKKwkgMHgwMSwgMHg2MSwgMHhDQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywgMHhFMSwgMHg4MSwgMHhGQiwgMHgwMSwgMHhCQSwgMHhGMywgMHg2MSwgMHg0NSwKKwkgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwQiwgMHgwMiwgMHgwMCwgMHhCOCwgMHgwMSwgMHg2MywgMHgwOCwgMHgwMywgMHhFOCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHgyNCwgMHgwMiwgMHgwMCwgMHhERiwgMHg4MywgMHhGQSwgMHgwMSwgMHhFNSwgMHhGRCwgMHg3RiwgMHhGRCwgMHgwRiwgMHg2MCwgMHhGMCwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhGMiwgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhDOCwgMHg2MCwgMHhGNywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg3RiwgMHhGMSwKKwkgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgwQywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwNywgMHg2NCwKKwkgMHhEMCwgMHhGQiwgMHgwRiwgMHg2MCwgMHhGMiwgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDOSwgMHg2MCwgMHgzNCwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGMCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgwMSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHhFMywgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwNSwgMHgzQSwKKwkgMHgwMywgMHgwMCwgMHg2OCwgMHg2MCwgMHhCQSwgMHg2MSwgMHgxMSwgMHgwMCwgMHgwNCwgMHgzQSwgMHgwMywgMHgwMCwgMHg2OCwgMHg2MCwgMHhBRSwgMHg2MSwKKwkgMHgwQywgMHgwMCwgMHgwMywgMHgzQSwgMHgwMywgMHgwMCwgMHg2OCwgMHg2MCwgMHhBMiwgMHg2MSwgMHgwNywgMHgwMCwgMHgwMiwgMHgzQSwgMHgwMywgMHgwMCwKKwkgMHg2OCwgMHg2MCwgMHg5NiwgMHg2MSwgMHgwMiwgMHgwMCwgMHg2OCwgMHg2MCwgMHg4QSwgMHg2MSwgMHgzQywgMHg2MCwgMHgwMCwgMHg2NiwgMHgwMSwgMHg2MCwKKwkgMHhCOCwgMHg2NCwgMHgwQSwgMHg2MywgMHg1OSwgMHhEMCwgMHg1OCwgMHhEOSwgMHhGRCwgMHgxRiwgMHgwMSwgMHg2MCwgMHhCRSwgMHg2MSwgMHhFNCwgMHhGMywKKwkgMHgwMCwgMHg2NiwgMHgwMCwgMHhBOCwgMHgwNCwgMHg2NSwgMHgwMSwgMHgwMywgMHhBMSwgMHhEQiwgMHgxRiwgMHg2MCwgMHgwOCwgMHg2MywgMHg1NSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgyMCwgMHg3RiwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMSwgMHg3RiwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgyMiwgMHg3RiwgMHhBMywgMHhEQiwgMHgwRiwgMHg2MCwgMHhGMCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwKKwkgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhGMiwgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDOSwgMHg2MCwgMHg3QiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHgxRiwgMHg2MCwgMHgwNiwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgyMCwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGMiwgMHg2MiwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDOSwgMHg2MCwgMHhBMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHhDNSwgMHhGRSwgMHgyMCwgMHg0MCwgMHgyMCwgMHgyQSwgMHgwOCwgMHgwMCwgMHgxMCwgMHg2MCwgMHgwMiwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhGMCwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwgMHgwRSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2NCwKKwkgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhGMCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg4QiwgMHhGQiwKKwkgMHhGRiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgxMCwgMHg2MCwgMHgxQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMSwgMHg2MCwgMHhERiwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyNCwgMHg2MCwgMHhBOCwgMHg2MywgMHgwMSwgMHg2NCwgMHhCRCwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhGMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgwRiwgMHg2MCwgMHhGMiwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDOSwgMHg2MCwgMHhGMywgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhGMCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHg3RiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QiwgMHhGMywgMHgwMCwgMHg2NSwgMHhENCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwQiwgMHgwMywgMHgwRiwgMHg2MCwgMHhGMiwgMHg2MiwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDOSwgMHg2MCwKKwkgMHhGMywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhERSwgMHhGRSwgMHgwRSwgMHgwNCwgMHgwOSwgMHg2NCwKKwkgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhGMiwgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDQSwgMHg2MCwKKwkgMHgxRCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwQSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHgwNiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGMCwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwgMHhCRSwgMHhGRSwgMHhEQSwgMHhGRSwgMHgyNCwgMHg2MCwgMHgzNCwgMHg2MSwgMHhDQSwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHg1NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHgyMiwgMHg2MSwgMHhDQSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg1NywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2MSwgMHhDQSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg1NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwKKwkgMHg0NiwgMHg2MSwgMHhDQSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg1NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHg0QywgMHg2MSwgMHhDQSwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHg1NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHg1OCwgMHg2MSwgMHhDQSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg1NywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhDNSwgMHhGRSwgMHgwRSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhBMSwgMHhEMywKKwkgMHgwRSwgMHg1NywgMHgyNCwgMHgwMCwgMHgwRSwgMHhGMiwgMHg0NCwgMHg0QywgMHg4MCwgMHhCMCwgMHgxMCwgMHhCMCwgMHgwQiwgMHgwMywgMHgyNCwgMHg2MCwKKwkgMHg3NCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHgxMywgMHgwMCwgMHgxMiwgMHgwMiwgMHhGMCwgMHgzNywgMHgwOSwgMHgwMCwgMHgwMiwgMHhGMCwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2NCwKKwkgMHhEMCwgMHg4MCwgMHhBMiwgMHhGRiwgMHhCMCwgMHhGMywgMHgwMiwgMHgwMiwgMHhDQywgMHg4NCwgMHhCMCwgMHhGQiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwKKwkgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQywgMHg0NCwgMHhBQywgMHg4NiwgMHgwOSwgMHhGMCwKKwkgMHhEOSwgMHgwMiwgMHgzNywgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2MywgMHgwMCwgMHg2NCwgMHhBMywgMHhEQiwgMHgwNiwgMHhBMywKKwkgMHgxMCwgMHg2MCwgMHg0QywgMHg2NCwgMHhCRCwgMHhEQiwgMHhCRCwgMHhEQiwgMHgwNiwgMHg2NCwgMHhBMywgMHhEQiwgMHgwMCwgMHg2MywgMHgxMCwgMHg2MCwKKwkgMHg5RSwgMHg2MiwgMHhBMiwgMHhERCwgMHgxMCwgMHg2MCwgMHg0QSwgMHg2MiwgMHhDRiwgMHg2MCwgMHgxNiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwKKwkgMHgyNCwgMHg2MiwgMHhDRSwgMHg2MCwgMHhFMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhDQSwgMHg2MCwgMHhGQiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2OCwgMHg2MCwKKwkgMHg3RSwgMHg2MSwgMHgzQywgMHg2MCwgMHgwMCwgMHg2NiwgMHgwMSwgMHg2MCwgMHhCOCwgMHg2NCwgMHgwQSwgMHg2MywgMHg1OSwgMHhEMCwgMHg1OCwgMHhEOSwKKwkgMHhGRCwgMHgxRiwgMHgwMSwgMHg2MCwgMHhCRSwgMHg2MSwgMHhFNCwgMHhGMywgMHgwMCwgMHg2NiwgMHgwMCwgMHhBOCwgMHgwNCwgMHg2NSwgMHgwMSwgMHgwMywKKwkgMHhBMSwgMHhEQiwgMHgxRiwgMHg2MCwgMHgwOCwgMHg2MywgMHg1NSwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMCwgMHg3RiwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgyMSwgMHg3RiwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMiwgMHg3RiwgMHhBMywgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHg0MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDQSwgMHg2MCwgMHhDNywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHgxRiwgMHg2MCwgMHgwNiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDQSwgMHg2MCwgMHhFQywgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhCQSwgMHhGRSwgMHgyNywgMHg2MCwgMHhCNiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMywgMHhBOCwKKwkgMHgwMiwgMHhBOCwgMHgwNCwgMHgwMywgMHgwRiwgMHgwMiwgMHhDRSwgMHg2MCwgMHhCMywgMHg3OCwgMHhGRiwgMHhGRiwgMHhDRCwgMHg2MCwgMHhFRiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwgMHg4MCwgMHg2NSwgMHhBNSwgMHhEMywgMHhGRiwgMHhGRiwgMHhGMywgMHhCNCwgMHhBNSwgMHhEQiwgMHhDQiwgMHg2MCwKKwkgMHgyMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2MywgMHgxQSwgMHg2MCwgMHg0MCwgMHg2NCwgMHhBMCwgMHhERCwgMHgxRiwgMHg2MCwgMHg4MCwgMHg2NCwKKwkgMHgwMCwgMHg2MywgMHhBMCwgMHhERCwgMHgxMSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhCQSwgMHhGRSwgMHgwMiwgMHg2NCwgMHhEQywgMHhGQiwgMHhGMiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhCQywgMHhGMiwgMHhGQiwKKwkgMHg0NCwgMHg2MCwgMHg0NCwgMHg2NCwgMHg4MSwgMHhGQiwgMHg4MiwgMHhGQiwgMHg4MywgMHhGQiwgMHhGRiwgMHhGRiwgMHgyMCwgMHg0MCwgMHgwNCwgMHgyQiwKKwkgMHgxOSwgMHgwMCwgMHg5QiwgMHhGRSwgMHgwOSwgMHgwNCwgMHhCQiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg4MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxMiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHhFQywgMHg2MiwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDQiwgMHg2MCwgMHgzNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHgwRCwgMHg2NCwgMHg1MywgMHhGQiwKKwkgMHgyOSwgMHg2MCwgMHhBNCwgMHg2NCwgMHg1NCwgMHhGQiwgMHgxMywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhDRSwgMHg2MSwKKwkgMHhBMSwgMHhEMSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwNywgMHgwMCwKKwkgMHgwMCwgMHg2NCwgMHhBMSwgMHhEQiwgMHgwMiwgMHg2NSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDQSwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHhBNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwgMHg4MCwgMHg2MiwgMHgxQSwgMHg2MCwgMHg0MCwgMHg2NSwgMHhBMiwgMHhEMywKKwkgMHhBNSwgMHhEMSwgMHg2MCwgMHg0MCwgMHgwQywgMHgyMiwgMHgwNCwgMHgwMCwgMHgwNCwgMHg2MSwgMHhEMSwgMHg4MCwgMHhGRiwgMHhGRiwgMHgyRCwgMHgwNSwKKwkgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg0RSwgMHhFNCwgMHg2MCwgMHg1OCwgMHg0RiwgMHhGQiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDQiwgMHg2MCwKKwkgMHg5NSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwgMHg4MCwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwQywgMHgyNiwgMHgxMSwgMHgwMCwgMHhGRCwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwKKwkgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgzOCwgMHgwMCwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwRiwgMHg0RSwgMHhFQywgMHg2MCwgMHg1OCwgMHg0RiwgMHhCOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwgMHgwRiwgMHg2MCwKKwkgMHhFQywgMHg2MiwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDQiwgMHg2MCwgMHhDMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxNCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHhGRCwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwKKwkgMHgyNCwgMHg4MCwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg4OCwgMHhGMSwgMHgxOSwgMHg2MCwgMHg4NiwgMHg2MywKKwkgMHhEMywgMHg4MCwgMHgyMCwgMHg0NCwgMHgwNSwgMHgwMywgMHgxMCwgMHhCQywgMHg0MCwgMHg0MCwgMHhDRCwgMHg2MCwgMHhFOCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg4OSwgMHhGMywgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHgyMCwgMHg0NCwgMHgwNiwgMHgwMiwgMHhENCwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwKKwkgMHhGRiwgMHhGRiwgMHgxRSwgMHgwMiwgMHg3MiwgMHgwMCwgMHgxMCwgMHhCQywgMHg0MCwgMHg0MCwgMHg2NCwgMHg0MiwgMHg1QSwgMHhEMSwgMHgwNiwgMHg2MywKKwkgMHhBNCwgMHhEMSwgMHhDMywgMHg4MywgMHg3RiwgMHhGOSwgMHhCRCwgMHhEMSwgMHg4MSwgMHhGOSwgMHhCRCwgMHhEMSwgMHhGRiwgMHhGRiwgMHg4MiwgMHhGOSwKKwkgMHhCRCwgMHhEMSwgMHg4MywgMHhGOSwgMHgwNCwgMHhBMywgMHhCRCwgMHhEMSwgMHgyRCwgMHg2MCwgMHg3QSwgMHg2NCwgMHg2NCwgMHg0MSwgMHhERCwgMHg4MSwKKwkgMHhGRSwgMHhCMSwgMHhBMCwgMHhEOSwgMHgwNCwgMHgwMywgMHhCRCwgMHhEMSwgMHhDOSwgMHg4MSwgMHg1OCwgMHhEOSwgMHhGQywgMHgwMiwgMHgxRSwgMHgwMCwKKwkgMHhFNSwgMHhGMywgMHg3RiwgMHhGQiwgMHgyOSwgMHg2MCwgMHhBNCwgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHgyRCwgMHg2MCwKKwkgMHg3QSwgMHg2MywgMHgwMiwgMHgwMiwgMHgyNywgMHg2MCwgMHhCOCwgMHg2MSwgMHhBMSwgMHhEMywgMHhCRCwgMHhEQiwgMHhEQywgMHg4NCwgMHhGRSwgMHhCNCwKKwkgMHg1OSwgMHhEMSwgMHhDOCwgMHg4NCwgMHhCRCwgMHhEOSwgMHhGQywgMHgwMiwgMHhFRCwgMHhGMywgMHg3MiwgMHg0NSwgMHhFQywgMHhGMywgMHg5NCwgMHg4MywKKwkgMHg4MywgMHhGRCwgMHg5NCwgMHg4MywgMHg4MiwgMHhGRCwgMHg2NSwgMHg1RiwgMHgwMiwgMHg2NCwgMHg4MSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhDQywgMHg2MCwgMHgyNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxOCwgMHg2NCwKKwkgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHg3RiwgMHhGMSwgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgxRSwgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDQywgMHg2MCwKKwkgMHg0RCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHhDQywgMHg2MCwgMHhBRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxNiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHg2MCwgMHhFRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHhDQSwgMHg2MCwgMHg1OCwgMHg0RSwgMHhBNywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxNywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHhEQywgMHhGQiwgMHhGMiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhCQywKKwkgMHhGMiwgMHhGQiwgMHhGNywgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhEQSwgMHhGRSwgMHhDMSwgMHhGRSwgMHgxQSwgMHg2MCwgMHg0MCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgxQSwgMHg2MCwgMHg2QSwgMHg2MiwKKwkgMHhBMiwgMHhEOSwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwMCwgMHg2MCwgMHgwNiwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDQiwgMHg2MCwKKwkgMHgyMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxQSwgMHg2MCwgMHg0MCwgMHg2MSwgMHg3NSwgMHg2MCwgMHgzMCwgMHg2NSwgMHhBMSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHhBMCwgMHhFMCwgMHg4NCwgMHgwMiwgMHgwMiwgMHgwMywgMHg2MCwgMHhFOCwgMHg2NCwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgwNCwgMHg2NSwgMHg0NCwgMHhBMSwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg3OSwgMHhGMywgMHg3QSwgMHhGQiwgMHgxRiwgMHg2MCwKKwkgMHg1MiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhGRiwgMHg2MCwgMHhERiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHhCRiwgMHhGMSwKKwkgMHgxQSwgMHg2MCwgMHg2QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHhGNywgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwKKwkgMHgxMCwgMHgyNiwgMHg2NywgMHgwMCwgMHgwMCwgMHg2NCwgMHhCNSwgMHhGQiwgMHhCNiwgMHhGQiwgMHhCNywgMHhGQiwgMHgwMCwgMHg3NSwgMHgwMCwgMHg3MiwKKwkgMHhCRCwgMHhGMSwgMHg4MCwgMHhGOSwgMHg2NCwgMHg0NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg5MywgMHhFNiwgMHhGMSwKKwkgMHg4NiwgMHhGOSwgMHgyOCwgMHg2MCwgMHhEMiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhBOCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMiwKKwkgMHgwMSwgMHg2MCwgMHhCMCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhBOCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHgwMiwgMHg2NCwKKwkgMHg2MCwgMHg0MSwgMHgyRCwgMHg2MCwgMHgyOCwgMHg2MywgMHhCRCwgMHhEMywgMHhBMywgMHhEMywgMHhGRiwgMHhCNSwgMHg2NSwgMHg1QywgMHhDRCwgMHg4MSwKKwkgMHg4MCwgMHhCRiwgMHgwRSwgMHgwMywgMHg4MCwgMHhCRiwgMHhCRCwgMHhEQiwgMHg2NSwgMHg0NCwgMHhDOCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwQiwgMHgwMywKKwkgMHg2MCwgMHg0NSwgMHhDRCwgMHg4MSwgMHhBMywgMHhEMywgMHgwNywgMHgwMywgMHhDRCwgMHg4MSwgMHg4MCwgMHhCRiwgMHgwMSwgMHgwMywgMHg4MCwgMHhCQywKKwkgMHg2MCwgMHg0NywgMHhCRCwgMHhEQiwgMHgwMCwgMHg2NSwgMHg2NCwgMHg0MSwgMHgyRCwgMHg2MCwgMHgyQSwgMHg2MywgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHg4MCwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHg2MCwgMHg0NSwgMHg2MCwgMHg0NywgMHg4MCwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywKKwkgMHg2MCwgMHg0NSwgMHhDOSwgMHg4MSwgMHhGRiwgMHhGRiwgMHhGMiwgMHgwMiwgMHg2NSwgMHg0NCwgMHg3RiwgMHhCNCwgMHgwMiwgMHgzQSwgMHgwMiwgMHgwMCwKKwkgMHgwQSwgMHg2NCwgMHgxNSwgMHgwMCwgMHgwNCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgxNCwgMHg2NCwgMHgxMSwgMHgwMCwgMHgwQSwgMHgzQSwgMHgwMiwgMHgwMCwKKwkgMHgzMiwgMHg2NCwgMHgwRCwgMHgwMCwgMHgwQiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgzNywgMHg2NCwgMHgwOSwgMHgwMCwgMHgxMCwgMHgzQSwgMHgwMiwgMHgwMCwKKwkgMHg1MCwgMHg2NCwgMHgwNSwgMHgwMCwgMHgxNiwgMHgzQSwgMHgwMiwgMHgwMCwgMHg2RSwgMHg2NCwgMHgwMSwgMHgwMCwgMHgxNCwgMHg2NCwgMHg3QywgMHhGQiwKKwkgMHgyOCwgMHgwMCwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwMCwgMHg2MCwKKwkgMHg4NCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDRCwgMHg2MCwgMHg0MCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwRCwgMHgwMywKKwkgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHg2MCwgMHg3RiwgMHg2MSwgMHhBMSwgMHg4NCwKKwkgMHg1QSwgMHhEMSwgMHg0QSwgMHhEQiwgMHhBMSwgMHg4NCwgMHg1QSwgMHhEQiwgMHgwNCwgMHgwMCwgMHhCQiwgMHhGRSwgMHhDQiwgMHg2MCwgMHgyMiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgyMiwgMHg2NSwKKwkgMHg2NCwgMHg0MCwgMHgwNywgMHgzNiwgMHgwMSwgMHg2NSwgMHhBOSwgMHhGMywgMHg2NiwgMHg1QywgMHg2MCwgMHg0NiwgMHgxRiwgMHg2MywgMHhFMywgMHg4MywKKwkgMHhCNiwgMHhGOCwgMHgwMiwgMHhBNiwgMHg2NiwgMHg0NCwgMHhGQywgMHgxRiwgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHgwNywgMHgzQSwgMHgwNCwgMHgwMCwgMHhBOSwgMHhGMywgMHgwNCwgMHg2NSwgMHg2MCwgMHg0NiwgMHhCNiwgMHhGOCwgMHg2NCwgMHg0NiwKKwkgMHhBOSwgMHhGMywgMHgzMiwgMHg0MSwgMHg2MCwgMHg0NSwgMHgwOCwgMHhCMSwgMHg2NiwgMHg0MSwgMHgxNywgMHgwMywgMHg2NSwgMHg0NiwgMHgyOSwgMHg2MCwKKwkgMHhBMiwgMHg2MiwgMHhBMiwgMHhEMywgMHgwNiwgMHhGMCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHg4MCwgMHhCRiwKKwkgMHhCMCwgMHg4NCwgMHgwNiwgMHhGQSwgMHg2NiwgMHg0MywgMHgwMiwgMHhBMywgMHg2MywgMHg0NiwgMHgwNiwgMHhGMCwgMHhGRiwgMHhGRiwgMHhCMCwgMHg4NCwKKwkgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgzMiwgMHg0NCwgMHgxMCwgMHhCQywgMHg0MCwgMHg1MiwgMHgxRiwgMHg2MCwgMHg1MiwgMHg2MiwgMHgwMSwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwRiwgMHg0RSwgMHhFNywgMHg2MCwgMHg1OCwgMHg0RiwgMHg1MSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwgMHgwRiwgMHg2MCwKKwkgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHg2MCwgMHhGQiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwKKwkgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDQiwgMHg2MCwgMHgxMSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyNCwgMHg2MCwKKwkgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwKKwkgMHhCQiwgMHhGRSwgMHgyMCwgMHg0NCwgMHgwNCwgMHgyNywgMHgxMiwgMHgwMCwgMHgxMCwgMHgyNiwgMHgwMiwgMHgwMCwgMHhEQiwgMHhGRSwgMHgxNiwgMHgwMCwKKwkgMHgwRiwgMHg2MCwgMHhDRSwgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwNywgMHgwMCwgMHgwMSwgMHg2NCwKKwkgMHhBMSwgMHhEQiwgMHgwMSwgMHg2NSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMSwgMHg2NCwgMHg4QywgMHhGQiwKKwkgMHhGRiwgMHg2MCwgMHhFRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgwMywgMHg2NCwgMHhEQywgMHhGQiwgMHhGMiwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHhGRSwgMHhCNCwgMHhGMiwgMHhGQiwgMHhDMSwgMHhGRSwgMHgxRSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgxNSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHhCQiwgMHhGRSwgMHhDRiwgMHg2MCwgMHhENiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyOCwgMHg2MCwKKwkgMHgyQywgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgyMiwgMHg2NSwgMHhBOSwgMHhGMywgMHg2NiwgMHg1QywKKwkgMHg2MCwgMHg0NiwgMHgxRiwgMHg2MywgMHhFMywgMHg4MywgMHhCNiwgMHhGOCwgMHgwMiwgMHhBNiwgMHg2NiwgMHg0NCwgMHhGQywgMHgxRiwgMHg2NCwgMHg0NiwKKwkgMHg3OSwgMHhGMSwgMHhBOSwgMHhGMywgMHg3QSwgMHhGOSwgMHgwMiwgMHhBNCwgMHhEOCwgMHhGMywgMHg2MCwgMHg0NSwgMHg2NiwgMHg0MSwgMHg2NSwgMHg0NiwKKwkgMHg4QywgMHhGQSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwNiwgMHgwMCwgMHgwMiwgMHgzNiwgMHgwNCwgMHgwMCwgMHgwNCwgMHgzNiwgMHgwMiwgMHgwMCwKKwkgMHgwNSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwMSwgMHgwMCwgMHgwMSwgMHg2NCwgMHg2RiwgMHhGQSwgMHg3OSwgMHhGMywgMHg3QSwgMHhGMSwKKwkgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwgMHg2NSwgMHg0MywgMHgwMiwgMHgwMiwgMHg3OSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgwRiwgMHg2MCwKKwkgMHhBRSwgMHg2NSwgMHhEOCwgMHhGMywgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2MSwgMHg0NSwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgwMiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwgMHg3QiwgMHhGQiwgMHg2RiwgMHhGMCwKKwkgMHg2MCwgMHg0NywgMHg5MCwgMHg4NCwgMHg2RiwgMHhGQSwgMHg2MCwgMHg0NywgMHg2MCwgMHg0NSwgMHg4MCwgMHg2NCwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwgMHg3MCwgMHhGMCwgMHg3MCwgMHhGQSwgMHgwMCwgMHg2MSwgMHhFOCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHgwNSwgMHhERCwgMHg4MSwgMHhGQiwgMHgwMSwgMHhFMSwgMHg4MSwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwKKwkgMHg2NiwgMHg0MywgMHgwQywgMHhGNCwgMHhBOSwgMHhGMSwgMHgwMiwgMHg2NCwgMHhDMCwgMHg4NSwgMHgwQywgMHg2MSwgMHgzMiwgMHg0MCwgMHgwOCwgMHgyQSwKKwkgMHgxNSwgMHgwMCwgMHgyOSwgMHg2MCwgMHhBMiwgMHg2MiwgMHhBMiwgMHhEMywgMHg2NiwgMHg0MSwgMHg2NSwgMHg0NiwgMHgwNiwgMHhGMCwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHg4MCwgMHhCRiwgMHhCMCwgMHg4MywgMHgwNiwgMHhGQywgMHg2NiwgMHg0MiwgMHhGRSwgMHhBMiwKKwkgMHg2MiwgMHg0NiwgMHgwNiwgMHhGMCwgMHhGRiwgMHhGRiwgMHhCMCwgMHg4NCwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgxRCwgMHg2NCwgMHgzQiwgMHg0MiwKKwkgMHg1QSwgMHhEQiwgMHgwQiwgMHg2NCwgMHhEQywgMHhGQiwgMHhGMiwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHhGMiwgMHhGQiwgMHgwMSwgMHg2NSwKKwkgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFNSwgMHhGMSwgMHg3RiwgMHhGOSwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhDRSwgMHg2MCwgMHg3NiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg3RiwgMHhGMSwKKwkgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgxRSwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhFQywgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDRSwgMHg2MCwgMHg5QSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwgMHhCRSwgMHhGRSwKKwkgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgwMSwgMHg2NCwgMHg4QywgMHhGQiwgMHhGRiwgMHg2MCwgMHhERiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgxRSwgMHg2NCwgMHgzQiwgMHg0MiwKKwkgMHg1QSwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwNiwgMHg2NCwgMHhEQywgMHhGQiwKKwkgMHhGMiwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHhGMiwgMHhGQiwgMHhFNSwgMHhGMSwgMHg3RiwgMHhGOSwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMSwgMHg2NCwgMHg4QywgMHhGQiwgMHhGRiwgMHg2MCwgMHhERiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwKKwkgMHhBOSwgMHhGMSwgMHg2NiwgMHg0NSwgMHg2NCwgMHg0NiwgMHg2NiwgMHg0MywgMHgwMiwgMHhBMywgMHg2MywgMHg0NiwgMHgwMiwgMHg2NCwgMHgwNiwgMHhGQSwKKwkgMHgwNCwgMHg2MywgMHgwNCwgMHg2MSwgMHgwMSwgMHg2MCwgMHhDRSwgMHg2NCwgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOCwgMHhGRCwgMHgxRiwgMHg2NSwgMHg0NiwKKwkgMHgwMSwgMHg2NSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwMCwgMHg2NCwgMHg2OCwgMHhGQiwgMHg2OSwgMHhGQiwKKwkgMHhBOSwgMHhGMSwgMHgwRSwgMHg2NCwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0MiwgMHgwMiwgMHhBMiwgMHg2MiwgMHg0NiwgMHgwNiwgMHhGMCwgMHhGRiwgMHg2MCwKKwkgMHhGQywgMHg2NCwgMHhBMCwgMHg4NCwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHhEQywgMHhGMywgMHhGRiwgMHhGRiwgMHgwNCwgMHhBOCwgMHgwRiwgMHg2MCwKKwkgMHhDRSwgMHg2NCwgMHgwNywgMHgwMywgMHhBMCwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2MywKKwkgMHhBMCwgMHhERCwgMHgwMSwgMHg2NCwgMHhEQywgMHhGQiwgMHhGMiwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHhGMiwgMHhGQiwgMHgwRiwgMHg2MCwKKwkgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhDQSwgMHg2MCwgMHhGQiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyOCwgMHg2MCwgMHgzQSwgMHg2NCwgMHhBMCwgMHhEMywgMHgwMCwgMHhGNCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzQSwgMHg0MiwgMHgwMCwgMHgxOCwgMHg2NSwKKwkgMHgyMiwgMHg2MSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHhBNSwgMHhEMCwgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwKKwkgMHgwNCwgMHg2NSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHgwNSwgMHgwMywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHhGMCwgMHgwMiwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHhCRCwgMHhEMywgMHhCRCwgMHhEMywgMHgwMSwgMHhBOCwKKwkgMHhFMCwgMHg4NSwgMHgyNywgMHgwMiwgMHhDNywgMHg4MywgMHhCRCwgMHhEMywgMHhCRCwgMHhEMywgMHg4MSwgMHhBOCwgMHgwRCwgMHhBOCwgMHgyMSwgMHgwMiwKKwkgMHgyMCwgMHgwMiwgMHhCRCwgMHhEMywgMHhCRCwgMHhEMywgMHgwMCwgMHhBOCwgMHg2MCwgMHhBOCwgMHgxQiwgMHgwMiwgMHhCRCwgMHhEMywgMHgxOSwgMHgwMiwKKwkgMHgxRCwgMHhBOCwgMHhBMywgMHhEMSwgMHgxNiwgMHgwMiwgMHhFMywgMHhGOSwgMHgwMSwgMHg2MCwgMHhCOCwgMHg2NCwgMHg2MywgMHg0MSwgMHgwQSwgMHg2MywKKwkgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOSwgMHhGRCwgMHgxRiwgMHg1OSwgMHhEMSwgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHg2NCwgMHg1RSwKKwkgMHhENiwgMHhGQiwgMHg1OSwgMHhEMSwgMHgyOCwgMHg2MCwgMHgzNiwgMHg2NCwgMHhBMCwgMHhEOSwgMHgyOCwgMHg2MCwgMHhENiwgMHg2NCwgMHhBMCwgMHhEOSwKKwkgMHgyMywgMHgwMCwgMHgyOCwgMHg2MCwgMHg0MCwgMHg2NCwgMHhBMCwgMHhEMywgMHhFMywgMHhGQiwgMHg2MCwgMHg0MCwgMHgwNSwgMHgzQSwgMHgwMywgMHgwMCwKKwkgMHg2OCwgMHg2MCwgMHhCQSwgMHg2MSwgMHgxMSwgMHgwMCwgMHgwNCwgMHgzQSwgMHgwMywgMHgwMCwgMHg2OCwgMHg2MCwgMHhBRSwgMHg2MSwgMHgwQywgMHgwMCwKKwkgMHgwMywgMHgzQSwgMHgwMywgMHgwMCwgMHg2OCwgMHg2MCwgMHhBMiwgMHg2MSwgMHgwNywgMHgwMCwgMHgwMiwgMHgzQSwgMHgwMywgMHgwMCwgMHg2OCwgMHg2MCwKKwkgMHg5NiwgMHg2MSwgMHgwMiwgMHgwMCwgMHg2OCwgMHg2MCwgMHg4QSwgMHg2MSwgMHgzQywgMHg2MCwgMHgwMCwgMHg2NiwgMHgwMSwgMHg2MCwgMHhCOCwgMHg2NCwKKwkgMHgwQSwgMHg2MywgMHg1OSwgMHhEMCwgMHg1OCwgMHhEOSwgMHhGRCwgMHgxRiwgMHgwMSwgMHg2MCwgMHhCRSwgMHg2MSwgMHhFNCwgMHhGMywgMHgwMCwgMHg2NiwKKwkgMHgwMCwgMHhBOCwgMHgwNCwgMHg2NSwgMHgwMSwgMHgwMywgMHhBMSwgMHhEQiwgMHgxRiwgMHg2MCwgMHgwOCwgMHg2MywgMHg1NSwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgyMCwgMHg3RiwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMSwgMHg3RiwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgyMiwgMHg3RiwgMHhBMywgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwKKwkgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHg2MCwgMHhBMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHgxRiwgMHg2MCwgMHgwNiwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgyMCwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHg2MCwgMHhDNywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHg0MCwgMHg2NCwgMHgzQiwgMHg0MiwKKwkgMHg1QSwgMHhEQiwgMHhCQywgMHhGMSwgMHgxQSwgMHg2MCwgMHg2QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHg2MCwgMHhGNSwgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwKKwkgMHhFQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHhCQywgMHhGMSwgMHgxOSwgMHhGOCwgMHhGOCwgMHg2MCwgMHg4MCwgMHg2NCwKKwkgMHgwRSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHhBOSwgMHhGMSwgMHgwNywgMHhGOCwgMHgwMCwgMHg2MCwgMHhEMCwgMHg2MywgMHgxOSwgMHg2MCwKKwkgMHg4NCwgMHg2NCwgMHhBMywgMHhEQiwgMHg0NCwgMHg2MCwgMHg0NCwgMHg2NCwgMHg4MSwgMHhGQiwgMHg4MiwgMHhGQiwgMHg4MywgMHhGQiwgMHgzMSwgMHg0NCwKKwkgMHhGOSwgMHhCNCwgMHg0MCwgMHg1MSwgMHgwMCwgMHg2MCwgMHhEMCwgMHg2MywgMHgwMSwgMHg2MCwgMHgxMCwgMHg2NSwgMHhBMywgMHhEMywgMHhBNSwgMHhEMSwKKwkgMHgwNCwgMHhBNCwgMHhBMywgMHhEQiwgMHhEMCwgMHg4MCwgMHhBMCwgMHhEMSwgMHgwQSwgMHgwNiwgMHg0MSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDQywgMHg2MCwgMHg1RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0NCwgMHg0NywKKwkgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhGRiwgMHhBNCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwNywgMHgwRSwgMHg2MSwKKwkgMHg0MSwgMHhEMywgMHgzMiwgMHg0MCwgMHgwOCwgMHgyNiwgMHgwMywgMHgwMCwgMHgxMCwgMHhCMCwgMHhGRiwgMHhGRiwgMHhEMywgMHgwMiwgMHg0MiwgMHg2NCwKKwkgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwKKwkgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhEMCwgMHg2MCwgMHgyMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNywgMHhEMSwgMHg3RiwgMHhGOSwgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHhBMiwgMHhEOSwKKwkgMHgxRSwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhEMCwgMHg2MCwgMHg0NywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxQSwgMHg2MCwgMHg2QSwgMHg2MiwgMHgwNywgMHg2MCwgMHhEMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyNywgMHg0MywgMHgwNiwgMHhBMywgMHhCRCwgMHhEMywgMHg4MSwgMHhGQiwgMHhCRCwgMHhEMywgMHg4MiwgMHhGQiwKKwkgMHhBMywgMHhEMywgMHg4MywgMHhGQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwKKwkgMHgwMSwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhEMCwgMHg2MCwgMHg3OSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhCQywgMHhGMSwgMHgxQSwgMHg2MCwgMHg2QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHhGRSwgMHg2MCwgMHhGRiwgMHg2MSwgMHhBMSwgMHg4NCwgMHg1QSwgMHhEMSwgMHg0QSwgMHhEQiwgMHhBMSwgMHg4NCwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHg2MCwgMHhGMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwKKwkgMHg1RiwgMHhGNSwgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHhCQywgMHhGMSwKKwkgMHgxOSwgMHhGOCwgMHg4MCwgMHg3RSwgMHhGOCwgMHg3RiwgMHgwRSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHhBOSwgMHhGMSwgMHgwNywgMHhGOCwKKwkgMHgyQiwgMHhGQSwgMHhCMCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgyNywgMHg0MywgMHgwNiwgMHhBMywgMHhCRCwgMHhEMSwgMHgyQywgMHhGOCwgMHgzMiwgMHhGOCwKKwkgMHhCRCwgMHhEMSwgMHgyRCwgMHhGOCwgMHgzMywgMHhGOCwgMHhBMywgMHhEMSwgMHgyRSwgMHhGOCwgMHgzNCwgMHhGOCwgMHgwNiwgMHg2MywgMHgzRiwgMHhGQywKKwkgMHgxRiwgMHg2MCwgMHg1NCwgMHg2MSwgMHhEQywgMHhGMywgMHhBMSwgMHhEMywgMHgwMywgMHhBOCwgMHhBQywgMHg4MywgMHgwRiwgMHgwMiwgMHgwRSwgMHgwMywKKwkgMHgxRiwgMHg2MCwgMHg1NiwgMHg2MSwgMHhBMSwgMHhEMSwgMHg2NiwgMHg0NSwgMHgwMCwgMHhGNCwgMHgwOSwgMHhGQywgMHgwMSwgMHg2NCwgMHgwQSwgMHhGQSwKKwkgMHgwQiwgMHhGOCwgMHgxRiwgMHg2MCwgMHg1NCwgMHg2MSwgMHgwMCwgMHg2NCwgMHhBMSwgMHhEQiwgMHgyOCwgMHgwMCwgMHgyOCwgMHg2MCwgMHgyRSwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHg2NiwgMHg0NSwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgxNiwgMHgwMCwgMHgwMiwgMHgzNiwgMHhDNywgMHgwMCwKKwkgMHgwMywgMHgzNiwgMHgwNywgMHgwMCwgMHgwNCwgMHgzNiwgMHgxMCwgMHgwMCwgMHgwNSwgMHgzNiwgMHhDMSwgMHgwMCwgMHgwNiwgMHgzNiwgMHgwMSwgMHgwMCwKKwkgMHgwQiwgMHgwMCwgMHg4MCwgMHg2NCwgMHgwOSwgMHhGQSwgMHgwMSwgMHg2MywgMHgwQSwgMHhGQywgMHgwMCwgMHg2NCwgMHgwQiwgMHhGQSwgMHgyRCwgMHg2MCwKKwkgMHg1NCwgMHg2MiwgMHgwMywgMHg2NCwgMHhBMiwgMHhEQiwgMHgwQSwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwOSwgMHhGQSwgMHgwMSwgMHg2MywgMHgwQSwgMHhGQywKKwkgMHgwMCwgMHg2NCwgMHgwQiwgMHhGQSwgMHgyRCwgMHg2MCwgMHg1NCwgMHg2MiwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwKKwkgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NSwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHgwMCwgMHg2NiwgMHhEQywgMHhGMywgMHg0NiwgMHg0NiwgMHhGRCwgMHhBMCwgMHhDMSwgMHhGRSwgMHgwMiwgMHgwMiwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHg2NCwgMHg2OSwgMHhGQiwgMHg0MywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgxQSwgMHg2MCwgMHg0NCwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2NCwgMHhBNCwgMHhBMiwgMHhEQiwgMHgxQSwgMHg2MCwgMHg0NCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgxQSwgMHg2MCwKKwkgMHg2QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwMCwgMHg2MCwgMHgwQywgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhEMSwgMHg2MCwgMHgyRSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHg1NiwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHgwMCwgMHg2NCwgMHg2OSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NiwKKwkgMHgwMCwgMHhGNCwgMHgwOSwgMHhGMiwgMHgwQSwgMHhGMiwgMHgwMCwgMHhBOCwgMHgwQiwgMHhGMiwgMHgwMiwgMHhBOCwgMHgxNiwgMHgwMiwgMHgwMCwgMHhBOCwKKwkgMHgxQSwgMHgwMiwgMHgxOSwgMHgwMiwgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyMCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwMywgMHgwMCwgMHhEMywgMHg2MCwKKwkgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEOSwgMHg2MCwgMHg2OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOSwgMHhGMiwgMHgwQSwgMHhGMiwgMHg4MCwgMHhBOCwKKwkgMHgwQiwgMHhGMiwgMHgwMiwgMHhBOCwgMHhFNCwgMHgwMywgMHg0NCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwQiwgMHhGMiwgMHgyNiwgMHg0NiwKKwkgMHg0MCwgMHg1OSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MSwgMHgyRiwgMHhGMiwgMHhBMSwgMHhEQiwgMHgzMCwgMHhGMiwgMHg0MSwgMHg1OCwgMHg1OSwgMHhEQiwKKwkgMHgzMSwgMHhGMiwgMHg1OSwgMHhEQiwgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgwMywgMHg2NSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg0QywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhEQywgMHg2MCwgMHhBQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2MCwgMHhGQiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHgwMCwgMHg2NCwgMHg2OSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHg0MCwgMHgwOCwgMHgyQSwKKwkgMHgwMywgMHgwMCwgMHhDRiwgMHg2MCwgMHhGMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhENywgMHg2MCwgMHhERCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2MywKKwkgMHgwOSwgMHhGQywgMHgzMiwgMHg0MCwgMHgwOCwgMHgyNiwgMHgxQSwgMHgwMCwgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHgwQiwgMHgzNiwgMHgwMywgMHgwMCwgMHhEMCwgMHg2MCwgMHhFQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgyRCwgMHg2MCwgMHg1NiwgMHg2MiwgMHgwQiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyRCwgMHg2MCwgMHg1NCwgMHg2MiwgMHgwMiwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhBOSwgMHhGMSwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgyMiwgMHg2NCwgMHgzNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgwMSwgMHg2NCwgMHgwQSwgMHhGQSwKKwkgMHgwMCwgMHg2NCwgMHgwQiwgMHhGQSwgMHgwMSwgMHg2NCwgMHg2OSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NSwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwMCwgMHg2NiwgMHhEQywgMHhGMywgMHg0NiwgMHg0NiwgMHhGRCwgMHhBMCwgMHhDMSwgMHhGRSwKKwkgMHgwMiwgMHgwMiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwMCwgMHg2MCwgMHgwQywgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhEMSwgMHg2MCwgMHhFRiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgzQiwgMHgwMywgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwMCwgMHg2NCwgMHg2OSwgMHhGQiwgMHgyNiwgMHg0NiwgMHgwMCwgMHhGNCwgMHgwOSwgMHhGMiwgMHgwQSwgMHhGMiwKKwkgMHgwMSwgMHhBOCwgMHgwQiwgMHhGMiwgMHgwMiwgMHhBOCwgMHgwNCwgMHgwMiwgMHgwMCwgMHhBOCwgMHgwMiwgMHgwMiwgMHgwMSwgMHgwMiwgMHgzMSwgMHgwMCwKKwkgMHhEMiwgMHg2MCwgMHg1OCwgMHg0RCwgMHhGNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQiwgMHhGMiwgMHgyNiwgMHg0NiwgMHg0MCwgMHg1OSwgMHgwMiwgMHg2MCwKKwkgMHgwMCwgMHg2MSwgMHgyRiwgMHhGMiwgMHhBMSwgMHhEQiwgMHgzMCwgMHhGMiwgMHg0MSwgMHg1OCwgMHg1OSwgMHhEQiwgMHgzMSwgMHhGMiwgMHg1OSwgMHhEQiwKKwkgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgwMywgMHg2NSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg0QywgMHg3OCwgMHhGRiwgMHhGRiwgMHhEQywgMHg2MCwKKwkgMHhBQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEMiwgMHg2MCwgMHg1OCwgMHg0RCwgMHhGNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHg2OSwgMHhGQiwKKwkgMHgyMCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwMywgMHgwMCwgMHhDRiwgMHg2MCwgMHhGMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhENywgMHg2MCwgMHhERCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyQSwgMHhGMiwgMHgyRiwgMHhGMCwgMHhCNCwgMHg4NCwgMHgyQSwgMHhGQSwKKwkgMHgyQywgMHhGOCwgMHgzMiwgMHhGOCwgMHgzMCwgMHhGMiwgMHgyRCwgMHhGQSwgMHgzMywgMHhGQSwgMHgzMSwgMHhGMiwgMHgyRSwgMHhGQSwgMHgzNCwgMHhGQSwKKwkgMHhFQiwgMHhGMywgMHgyRiwgMHhGQSwgMHhFQywgMHhGMywgMHgzMCwgMHhGQSwgMHhFRCwgMHhGMywgMHgzMSwgMHhGQSwgMHhDQywgMHhGMSwgMHgxOSwgMHhGOCwKKwkgMHgxQywgMHhGMCwgMHgxMywgMHhGOCwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgwMCwgMHhGNCwgMHgwMywgMHg2NCwgMHgwQSwgMHhGQSwgMHgwMCwgMHg2NCwKKwkgMHgwQiwgMHhGQSwgMHgwMSwgMHg2MywgMHg2OSwgMHhGRCwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwKKwkgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwMCwgMHg2NiwgMHhEQywgMHhGMywgMHg0NiwgMHg0NiwgMHhGRCwgMHhBMCwgMHhDMSwgMHhGRSwgMHgwMiwgMHgwMiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwMCwgMHg2MCwgMHgwQywgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhEMiwgMHg2MCwgMHg4RSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHg1MSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHgwMCwgMHg2NCwgMHg2OSwgMHhGQiwgMHgyNiwgMHg0NiwgMHgwMCwgMHhGNCwgMHgwOSwgMHhGMiwgMHgwQSwgMHhGMiwgMHgwMSwgMHhBOCwKKwkgMHgwQiwgMHhGMiwgMHgwNCwgMHhBOCwgMHgxQSwgMHgwMiwgMHgwMCwgMHhBOCwgMHgxOCwgMHgwMiwgMHgxNywgMHgwMiwgMHhEMiwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHhGNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyMCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwMywgMHgwMCwgMHhEMywgMHg2MCwKKwkgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEOSwgMHg2MCwgMHg2OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEMiwgMHg2MCwgMHg1OCwgMHg0RCwgMHhGNiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwQiwgMHhGMiwgMHgyNiwgMHg0NiwgMHg0MCwgMHg1OSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MSwgMHgyRiwgMHhGMiwgMHhBMSwgMHhEQiwKKwkgMHgzMCwgMHhGMiwgMHg0MSwgMHg1OCwgMHg1OSwgMHhEQiwgMHgzMSwgMHhGMiwgMHg1OSwgMHhEQiwgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwKKwkgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgwMywgMHg2NSwKKwkgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg0QywgMHg3OCwgMHhGRiwgMHhGRiwgMHhEQywgMHg2MCwgMHhBQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEMiwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHhGNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHg2OSwgMHhGQiwgMHgyMCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwMywgMHgwMCwKKwkgMHhDRiwgMHg2MCwgMHhGMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhENywgMHg2MCwgMHhERCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyRCwgMHg2MCwgMHg1NiwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwQiwgMHgzQSwgMHgwNywgMHgwMCwgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHgwQiwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgyRCwgMHg2MCwgMHg1NiwgMHg2MiwgMHhBMiwgMHhERiwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHg2MSwgMHg0MywgMHhBNSwgMHhEMiwgMHg2MCwgMHg0MCwgMHgwQiwgMHgyQSwgMHgzMCwgMHgwMCwgMHg4NSwgMHgzQSwgMHgzMCwgMHgwMCwKKwkgMHg2MCwgMHg0MSwgMHg2NSwgMHg0NCwgMHgwQSwgMHhBNCwgMHhBMCwgMHhEMCwgMHgyRCwgMHg2MCwgMHg1MiwgMHg2MiwgMHg2NCwgMHg0MCwgMHgxOCwgMHgyNiwKKwkgMHgwNiwgMHgwMCwgMHhBMiwgMHhERiwgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHgwMCwgMHgwMSwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHg2MSwgMHg0NCwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwgMHgwMiwgMHhBNCwgMHgyRSwgMHg2MCwgMHg2MiwgMHg2MSwgMHhBMSwgMHhEMSwKKwkgMHhERiwgMHg4MywgMHhDMCwgMHg4NCwgMHhBMSwgMHhEQiwgMHhEMCwgMHg4MSwgMHhDRCwgMHg4NCwgMHg0QywgMHg5MSwgMHg2MCwgMHg0MywgMHg2MCwgMHhGRSwKKwkgMHhBNSwgMHhEMiwgMHhERSwgMHg4NSwgMHg3RiwgMHgyNiwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHg1RCwgMHg5MywgMHhBMywgMHhEQiwKKwkgMHg1RCwgMHg5MywgMHhBNSwgMHhEMiwgMHhGNiwgMHgxRiwgMHg1RCwgMHg5MywgMHgyMCwgMHhGRSwgMHhERiwgMHg4MywgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyRCwgMHg2MCwgMHg1MiwgMHg2MiwgMHhBMiwgMHhERiwgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwgMHhGNiwgMHgwMSwKKwkgMHg0NSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgyRSwgMHg2MCwgMHhFQSwgMHg3QywgMHgyRSwgMHg2MCwgMHhERSwgMHg2MywgMHhBMywgMHhEOSwKKwkgMHg2NCwgMHg0MSwgMHgyOSwgMHg2MCwgMHhBNCwgMHg2MywgMHhCRCwgMHhEMywgMHgwMCwgMHg3QywgMHgwMywgMHgxQiwgMHgyNywgMHg0MywgMHgxMCwgMHhBMywKKwkgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwgMHg2NCwgMHg1RiwgMHhBMSwgMHhEQiwgMHg2NSwgMHg0NCwgMHhCRCwgMHhEMSwgMHhDOCwgMHg4NCwKKwkgMHg1OSwgMHhEOCwgMHhGQywgMHgwNSwgMHgyNywgMHg0MSwgMHgxMCwgMHhBMSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHhDMSwgMHg4MSwgMHgwMSwgMHgyNiwKKwkgMHhERCwgMHg4MSwgMHg0MSwgMHg0QywgMHg1OSwgMHhEMSwgMHg3QywgMHg0NCwgMHhCMCwgMHg4NCwgMHg1OSwgMHhEMSwgMHg1OSwgMHhEMSwgMHhCMCwgMHg4NCwKKwkgMHhCMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHg2NywgMHg0NCwgMHg1RCwgMHgwMCwgMHgyRCwgMHg2MCwgMHhFNiwgMHg2MywgMHhERCwgMHg2MCwKKwkgMHgxOCwgMHg2NCwgMHhCRCwgMHhEQSwgMHg1MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCRCwgMHhEQSwgMHgwMSwgMHg2MCwgMHhGMiwgMHg2NCwgMHhCRCwgMHhEQSwKKwkgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhCRCwgMHhEQSwgMHgyQywgMHg0MSwgMHg1OSwgMHhEMywgMHg1MCwgMHg2MCwgMHgwMCwgMHg3QywgMHg2MCwgMHg0MCwKKwkgMHgwMiwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMSwgMHg2MCwgMHhGMiwgMHg2NCwgMHgwRSwgMHgwMCwgMHgwNCwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMiwgMHg2MCwKKwkgMHhGMiwgMHg2NCwgMHgwOSwgMHgwMCwgMHgxMCwgMHgyQSwgMHgwMywgMHgwMCwgMHgwNCwgMHg2MCwgMHhGMiwgMHg2NCwgMHgwNCwgMHgwMCwgMHgyMCwgMHgyQSwKKwkgMHgwNCwgMHgwMCwgMHgwNSwgMHg2MCwgMHhGMiwgMHg2NCwgMHhCRCwgMHhEOSwgMHhCRCwgMHhEQiwgMHgwMSwgMHg2NCwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywKKwkgMHg1MCwgMHg2MCwgMHgwMCwgMHg3QywgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMSwgMHg2MCwgMHhGMiwgMHg2NCwgMHgwRSwgMHgwMCwKKwkgMHgwNCwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMiwgMHg2MCwgMHhGMiwgMHg2NCwgMHgwOSwgMHgwMCwgMHgxMCwgMHgyQSwgMHgwMywgMHgwMCwgMHgwNCwgMHg2MCwKKwkgMHhGMiwgMHg2NCwgMHgwNCwgMHgwMCwgMHgyMCwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwNSwgMHg2MCwgMHhGMiwgMHg2NCwgMHhCRCwgMHhEOSwgMHhCRCwgMHhEQiwKKwkgMHgwMSwgMHg2NCwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywgMHg1MCwgMHg2MCwgMHgwMCwgMHg3QywgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwKKwkgMHgwMCwgMHg2MCwgMHhGMiwgMHg2NCwgMHgwOSwgMHgwMCwgMHgwMiwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMSwgMHg2MCwgMHhGMiwgMHg2NCwgMHgwNCwgMHgwMCwKKwkgMHgwNCwgMHgyQSwgMHgwMiwgMHgwMCwgMHgwMiwgMHg2MCwgMHhGMiwgMHg2NCwgMHhCRCwgMHhEOSwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywgMHhCRCwgMHhEQSwKKwkgMHgyRCwgMHg2MCwgMHhFNiwgMHg2NCwgMHgyRSwgMHg2MCwgMHhFNCwgMHg2MiwgMHhBMiwgMHhEQiwgMHg2MCwgMHhGNSwgMHgwMCwgMHg2NCwgMHgyQiwgMHhGQSwKKwkgMHgwMCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgyNywgMHg0MywgMHgwNiwgMHhBMywgMHhCRCwgMHhEMSwgMHgyQywgMHhGOCwgMHgzMiwgMHhGOCwgMHhCRCwgMHhEMSwKKwkgMHgyRCwgMHhGOCwgMHgzMywgMHhGOCwgMHhBMywgMHhEMSwgMHgyRSwgMHhGOCwgMHgzNCwgMHhGOCwgMHgwMCwgMHhGNCwgMHgwMSwgMHg2MywgMHgzMiwgMHg0MCwKKwkgMHgwOCwgMHgyNiwgMHgxMCwgMHhCQiwgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHhGRSwgMHgyNiwKKwkgMHgxMCwgMHhCQiwgMHgwOSwgMHhGQywgMHgyNywgMHg0MiwgMHgwQywgMHhBMiwgMHgyOCwgMHg2MCwgMHgwMiwgMHg2MywgMHhBMiwgMHhEMywgMHhBMywgMHhEMywKKwkgMHgwMCwgMHhCRCwgMHgwMSwgMHg2MywgMHhBQywgMHg4MSwgMHgwOSwgMHgwMywgMHgwOCwgMHgwMywgMHhCMCwgMHg2MCwgMHg1OCwgMHg0RCwgMHhCNiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHhCOCwgMHgwMSwgMHg2MywgMHgwMSwgMHgwMywgMHg2MCwgMHg0MywgMHgxQSwgMHg2MCwgMHgzRSwgMHg2NCwgMHhBMCwgMHhERCwKKwkgMHgxMiwgMHg2MSwgMHg1OSwgMHhEQywgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHg2MCwgMHhGRiwgMHg3QywgMHg2MCwgMHg0MCwKKwkgMHgwQiwgMHgyQSwgMHgwMiwgMHgwMCwgMHgyRCwgMHg2MCwgMHgzMiwgMHg3QywgMHgyRSwgMHg2MCwgMHhFNiwgMHg2MiwgMHhBMiwgMHhEOSwgMHgyRSwgMHg2MCwKKwkgMHhERSwgMHg2NCwgMHg0MCwgMHg0OCwgMHhEOSwgMHg4MSwgMHhGRiwgMHg2MCwgMHhGMiwgMHg2NCwgMHhFOCwgMHg2MCwgMHg1OCwgMHg0RCwgMHhFOCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHhGNSwgMHgzRiwgMHhGQywgMHhEQiwgMHg4MywgMHgyRSwgMHg2MCwgMHgwOCwgMHg2MiwgMHhBMiwgMHhERCwgMHgwMCwgMHg3QywKKwkgMHg1QSwgMHhEOSwgMHg2MywgMHg0MSwgMHgyRSwgMHg2MCwgMHgwQywgMHg2MywgMHgxMiwgMHg2NSwgMHgwMCwgMHhGNCwgMHhDRCwgMHg4NCwgMHg0QywgMHg5MSwKKwkgMHg2MCwgMHg0MywgMHg2MCwgMHhGRSwgMHhBNSwgMHhEMiwgMHhERSwgMHg4NSwgMHg3RiwgMHgyNiwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwKKwkgMHg1RCwgMHg5MywgMHhBMywgMHhEQiwgMHg1RCwgMHg5MywgMHhBNSwgMHhEMiwgMHhGNiwgMHgxRiwgMHg1RCwgMHg5MywgMHgyMCwgMHhGRSwgMHhERiwgMHg4MywKKwkgMHg2MCwgMHhGNSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhDMSwgMHhGRSwgMHgwNiwgMHg2NCwKKwkgMHg2OSwgMHhGQiwgMHg0NiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwMCwgMHg2MCwKKwkgMHgxQywgMHg2NCwgMHhBMiwgMHhEQiwgMHhENCwgMHg2MCwgMHg2OCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgzQSwgMHgwMywKKwkgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NiwKKwkgMHgwMCwgMHhGNCwgMHgwQSwgMHhGMiwgMHgwMCwgMHg2MywgMHgwMCwgMHhBOCwgMHg2OSwgMHhGRCwgMHg1QSwgMHgwMywgMHgwQSwgMHhGMiwgMHgyNiwgMHg0NiwKKwkgMHg0MCwgMHg1OSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MSwgMHgyRiwgMHhGMiwgMHhBMSwgMHhEQiwgMHgzMCwgMHhGMiwgMHg0MSwgMHg1OCwgMHg1OSwgMHhEQiwKKwkgMHgzMSwgMHhGMiwgMHg1OSwgMHhEQiwgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgwNSwgMHg2NSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg0QywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhEQywgMHg2MCwgMHhBQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0NywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHhDRiwgMHg2MCwKKwkgMHhGMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgyMSwgMHgwMywgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgwMCwgMHg2NCwgMHg2OSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg0OSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHhEMCwgMHg2MCwgMHg5NCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHg2MCwgMHhGQiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2NCwgMHg2OSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg0QSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHhDRiwgMHg2MCwgMHhGMiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg0OCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwOSwgMHhGMCwgMHgyRSwgMHg2MCwgMHg2NCwgMHg2MywgMHgxMCwgMHg2NCwgMHhCRCwgMHhEQiwKKwkgMHhCRCwgMHhEOSwgMHgwQSwgMHhGMCwgMHhCRCwgMHhEOSwgMHgwQiwgMHhGMCwgMHhCRCwgMHhEOSwgMHgwQywgMHhGMiwgMHhCRCwgMHhEQiwgMHg2MCwgMHg0NywKKwkgMHhGRiwgMHhCNCwgMHgwQSwgMHhBNSwgMHgyRSwgMHg2MCwgMHg2MiwgMHg2MSwgMHg2NSwgMHg1QywgMHhBMSwgMHhEOSwgMHg2MCwgMHg0MSwgMHgxQSwgMHg2NSwKKwkgMHhDRCwgMHg4NCwgMHg0QywgMHg5MSwgMHg2MCwgMHg0MywgMHg2MCwgMHhGRSwgMHhBNSwgMHhEMiwgMHhERSwgMHg4NSwgMHg3RiwgMHgyNiwgMHgwMiwgMHgwMCwKKwkgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHg1RCwgMHg5MywgMHhBMywgMHhEQiwgMHg1RCwgMHg5MywgMHhBNSwgMHhEMiwgMHhGNiwgMHgxRiwgMHg1RCwgMHg5MywKKwkgMHgyMCwgMHhGRSwgMHhERiwgMHg4MywgMHhEMywgMHg2MCwgMHg1OCwgMHg0RCwgMHgwNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQiwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHgwNywgMHhCNCwgMHgwMSwgMHg2MSwgMHgwMywgMHgwMywgMHhDQywgMHg4NCwgMHhFMSwgMHg4MSwgMHhGRCwgMHgwMiwgMHg2MSwgMHg0NCwgMHg5NiwgMHhGQiwKKwkgMHgyNywgMHg0NSwgMHgwMiwgMHg2MiwgMHg0NiwgMHhEMywgMHg1QSwgMHhEMSwgMHg2MCwgMHg0NywgMHg1NiwgMHhGQiwgMHg2NCwgMHg0NywgMHg1NSwgMHhGQiwKKwkgMHgwMCwgMHg2NCwgMHg1QywgMHhGQiwgMHgwQywgMHg2MiwgMHg0NiwgMHhEMywgMHg4MCwgMHhGQiwgMHgwQiwgMHhGMCwgMHgwRiwgMHg2MCwgMHhGRiwgMHg2NCwKKwkgMHhBMCwgMHg4NCwgMHg4NSwgMHhGQiwgMHgyNiwgMHg0NiwgMHgzMiwgMHhGMCwgMHg4MSwgMHhGOSwgMHgzMywgMHhGMCwgMHgwRSwgMHg2MywgMHhDNywgMHg4MSwKKwkgMHg4MiwgMHhGOSwgMHgzNCwgMHhGMCwgMHg4MywgMHhGOSwgMHg1OSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NCwgMHgwMSwgMHgyQSwgMHhDOCwgMHg4NCwKKwkgMHg2MCwgMHg0MywgMHgyRCwgMHg2MCwgMHg3OCwgMHg2NCwgMHg1OCwgMHhEOSwgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOSwgMHhGRCwgMHgxRiwgMHgyOCwgMHg2MCwKKwkgMHgyQywgMHg2MiwgMHhBMiwgMHhEMSwgMHg1OSwgMHhEMywgMHg2NCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgyMiwgMHg2NCwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwKKwkgMHg1MCwgMHg5NCwgMHhBOSwgMHhGMSwgMHhGRiwgMHhGRiwgMHg0NCwgMHg0NywgMHhBNywgMHg0NiwgMHgzNiwgMHhGQSwgMHhCNywgMHhGQywgMHhBNywgMHg0NiwKKwkgMHgxQSwgMHg2MCwgMHgzRSwgMHg2MiwgMHhBMiwgMHhEMywgMHg4NywgMHhGQiwgMHgzMSwgMHhGMiwgMHgxQywgMHg2MCwgMHhCQSwgMHg2NSwgMHg2MCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwKKwkgMHg2MSwgMHg0NiwgMHgzMSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgzMCwgMHhGMCwKKwkgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwgMHgyRiwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwgMHhBOSwgMHhGMywgMHgwOCwgMHhGRSwKKwkgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHhBOSwgMHhGMSwgMHhGRiwgMHhGRiwgMHhEMywgMHg4MCwgMHgzMSwgMHhGMiwgMHgyNywgMHgwMiwgMHg2NiwgMHg0MSwKKwkgMHgxQywgMHg2MCwgMHhCQSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhBOSwgMHhGMSwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NCwgMHg0MywKKwkgMHgxMSwgMHgxOCwgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGQywgMHgxQiwgMHg2NiwgMHg0NCwgMHg2NCwgMHg0NiwgMHg4MCwgMHhGMCwKKwkgMHg2MCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHg2NSwgMHg0MywgMHg4MCwgMHhGMCwgMHgwMSwgMHhGQSwgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwKKwkgMHg4MCwgMHhGOCwgMHgwQiwgMHgwMCwgMHg2NCwgMHg0NiwgMHg2MiwgMHg0MywgMHgwMCwgMHhGMiwgMHhBMywgMHhEQiwgMHg2MCwgMHg0NiwgMHg4MCwgMHhGMCwKKwkgMHg4MSwgMHhGQywgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHg0MywgMHg0NywgMHgwMCwgMHhGNCwKKwkgMHgxOCwgMHg2NSwgMHgwQywgMHg2MSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHhBNSwgMHhEMCwgMHhEQSwgMHg4NSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwKKwkgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHgwNSwgMHgwMywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHhGNCwgMHgwMiwKKwkgMHgwMiwgMHg2MCwgMHgwMiwgMHg2MSwgMHhBMSwgMHhEMywgMHgwMCwgMHg2NSwgMHg2MCwgMHg0MywgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHg3RiwgMHhCNCwKKwkgMHgwMiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMSwgMHg2NCwgMHgxNSwgMHgwMCwgMHgwNCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMiwgMHg2NCwgMHgxMSwgMHgwMCwKKwkgMHgwQSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwNCwgMHg2NCwgMHgwRCwgMHgwMCwgMHgwQiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwOCwgMHg2NCwgMHgwOSwgMHgwMCwKKwkgMHgxMCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgxMCwgMHg2NCwgMHgwNSwgMHgwMCwgMHgxNiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgyMCwgMHg2NCwgMHgwMSwgMHgwMCwKKwkgMHgwMCwgMHg2NCwgMHhDRiwgMHg4MywgMHhCNCwgMHg4NSwgMHhFMSwgMHgwMiwgMHg2NSwgMHg0NCwgMHg3QSwgMHhGQiwgMHgwMiwgMHg2MCwgMHgwMiwgMHg2MSwKKwkgMHhBMSwgMHhEMywgMHgwMCwgMHg2NSwgMHg2MCwgMHg0MywgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHg4MCwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywKKwkgMHg2MCwgMHg0NSwgMHhDRiwgMHg4MywgMHg2NSwgMHg0NCwgMHhGNywgMHgwMiwgMHg3RiwgMHhCNCwgMHgwMiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwQSwgMHg2NCwKKwkgMHgxNSwgMHgwMCwgMHgwNCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgxNCwgMHg2NCwgMHgxMSwgMHgwMCwgMHgwQSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgzMiwgMHg2NCwKKwkgMHgwRCwgMHgwMCwgMHgwQiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgzNywgMHg2NCwgMHgwOSwgMHgwMCwgMHgxMCwgMHgzQSwgMHgwMiwgMHgwMCwgMHg1MCwgMHg2NCwKKwkgMHgwNSwgMHgwMCwgMHgxNiwgMHgzQSwgMHgwMiwgMHgwMCwgMHg2RSwgMHg2NCwgMHgwMSwgMHgwMCwgMHgxNCwgMHg2NCwgMHg3QywgMHhGQiwgMHgyNywgMHg0NCwKKwkgMHhEOCwgMHhGMywgMHg2MCwgMHg0NSwgMHg2NiwgMHg0MSwgMHg2NSwgMHg0NiwgMHg4QywgMHhGQSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwNiwgMHgwMCwKKwkgMHgwMiwgMHgzNiwgMHgwNCwgMHgwMCwgMHgwNCwgMHgzNiwgMHgwMiwgMHgwMCwgMHgwNSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwMSwgMHgwMCwKKwkgMHgwMSwgMHg2NCwgMHg2RiwgMHhGQSwgMHg3OSwgMHhGMywgMHg3QSwgMHhGMSwgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwgMHg2NSwgMHg0MywgMHgwMiwgMHgwMiwKKwkgMHg3OSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgwRiwgMHg2MCwgMHhBRSwgMHg2NSwgMHhEOCwgMHhGMywgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEMywgMHg2MSwgMHg0NSwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwgMHg3QiwgMHhGQiwgMHg2RiwgMHhGMCwgMHg2MCwgMHg0NywgMHg5MCwgMHg4NCwgMHg2RiwgMHhGQSwgMHg2MCwgMHg0NywKKwkgMHg2MCwgMHg0NSwgMHg4MCwgMHg2NCwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwgMHg3MCwgMHhGMCwKKwkgMHg3MCwgMHhGQSwgMHgwMCwgMHg2MSwgMHhFOCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNSwgMHhERCwgMHg4MSwgMHhGQiwgMHgwMSwgMHhFMSwgMHg4MSwKKwkgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHg2NiwgMHg0MywgMHgwQywgMHhGNCwgMHgyRCwgMHg2MCwgMHhEMiwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHgyRCwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg2MCwgMHg0NywgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHhCMCwgMHg4NCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgyMiwgMHg2NCwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwgMHg1MCwgMHg5NCwgMHhBNywgMHg0NiwKKwkgMHgzNiwgMHhGQSwgMHhCNywgMHhGQywgMHhBNywgMHg0NiwgMHg4MCwgMHg2MCwgMHgwMywgMHg2NSwgMHgzMiwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwMywgMHg2NSwKKwkgMHhBNywgMHg0NiwgMHgwNiwgMHhGMCwgMHg3RiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhCNCwgMHg4NCwgMHgwNiwgMHhGQSwgMHhCNywgMHhGQywKKwkgMHhBNywgMHg0NiwgMHgyNiwgMHg0NiwgMHgyRiwgMHhGMCwgMHgzMCwgMHhGMCwgMHg2NCwgMHg0MywgMHgzMSwgMHhGMiwgMHgyNywgMHg0NiwgMHgwMywgMHhGQywKKwkgMHgwNCwgMHhGOCwgMHgwNSwgMHhGQSwgMHgyNiwgMHg0NiwgMHhDRiwgMHg2MCwgMHg1OCwgMHg0RSwgMHgyMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwKKwkgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwKKwkgMHg0NiwgMHg0NiwgMHgwMSwgMHg2NCwgMHg4QywgMHhGQiwgMHgyOCwgMHg2MCwgMHgzOCwgMHg2MiwgMHhBMiwgMHhEMywgMHgyMCwgMHg0MSwgMHgwMCwgMHhCQywKKwkgMHgyMCwgMHhCOSwgMHgwMSwgMHgwMywgMHg0MSwgMHg0MCwgMHgxRiwgMHg2MCwgMHg1MiwgMHg2MSwgMHgwMCwgMHg2NCwgMHhBMSwgMHhEQiwgMHgwNCwgMHg2NCwKKwkgMHhDMSwgMHhGRSwgMHhEQywgMHhGQiwgMHhGMiwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHhGMiwgMHhGQiwgMHhGNywgMHg2MCwgMHhGRiwgMHg2NSwKKwkgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMSwgMHg2NSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwQywgMHg2NCwKKwkgMHg2OSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwMCwgMHg2MCwgMHgzMSwgMHg2NCwgMHhBMiwgMHhEQiwgMHhENiwgMHg2MCwgMHhDNCwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgwRSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwKKwkgMHgxMCwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgzMSwgMHg2MCwgMHgyQywgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMywgMHgxQiwKKwkgMHhEQywgMHg2MCwgMHhEMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEQywgMHg2MCwgMHhEMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhENywgMHg2MCwgMHg2NywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHhGOCwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhBOSwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhBNCwgMHg2MCwgMHg0MywgMHg2NiwgMHg0MSwgMHg2MywgMHg0NiwgMHgwNSwgMHhGMiwgMHgwMCwgMHhGMCwKKwkgMHg4MSwgMHhGMCwgMHgwMiwgMHgxOCwgMHg2NCwgMHg0NiwgMHg4MSwgMHhGOCwgMHgwNywgMHgxQiwgMHgxQywgMHg2MCwgMHhCQSwgMHg2NSwgMHg2MCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEOSwgMHgwMiwgMHgwMCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGOCwgMHhBOSwgMHhGMywgMHg2MywgMHg0NSwKKwkgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhENCwgMHg4MCwgMHgwMSwgMHgxOCwgMHhGQSwgMHgwNCwgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwKKwkgMHgwMCwgMHhGQSwgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RSwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHg0QiwgMHg2NCwgMHgzQiwgMHg0MiwKKwkgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMSwgMHg2MCwgMHgyRSwgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgxMCwgMHhCMCwgMHhGRiwgMHhGRiwgMHgxMywgMHgwMywgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhENywgMHg2MCwgMHgyRiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2QSwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHhCMCwgMHhGRiwgMHhGRiwgMHgxMywgMHgwMywgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwKKwkgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhENywgMHg2MCwgMHg0NywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2NCwgMHg2OSwgMHhGQiwgMHhENywgMHg2MCwgMHg1OCwgMHg0RSwgMHg3NywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMiwgMHg2NCwgMHg4QywgMHhGQiwgMHgwMiwgMHg2NCwgMHhDMSwgMHhGRSwgMHhEQywgMHhGQiwgMHhGMiwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHhCQywgMHhGMiwgMHhGQiwgMHgwMiwgMHg2NSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMywgMHg2MCwKKwkgMHhFOCwgMHg2MywgMHgxQSwgMHg2MCwgMHg0MCwgMHg2NCwgMHhBMCwgMHhERCwgMHhDQiwgMHg2MCwgMHgxQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwKKwkgMHgyMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyNCwgMHg1NCwgMHgwMSwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHgwMCwgMHg2MywgMHg2OSwgMHhGRCwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxNSwgMHgwMCwgMHgyNCwgMHg2MCwKKwkgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwKKwkgMHgwMCwgMHg2NCwgMHg2OSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMSwgMHg2NCwgMHg4QywgMHhGQiwKKwkgMHhGRiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHg1MCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMSwgMHg2MCwgMHgyRSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgxMCwgMHhCMCwKKwkgMHhGRiwgMHhGRiwgMHgxMywgMHgwMywgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhENywgMHg2MCwKKwkgMHg4RiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhCQywgMHhGMSwgMHgxQSwgMHg2MCwgMHg2QSwgMHg2MiwKKwkgMHhBMiwgMHhEOSwgMHg3RiwgMHhGMSwgMHg3RSwgMHhGOSwgMHgwMiwgMHg2NCwgMHg4QywgMHhGQiwgMHhGRiwgMHhGRiwgMHhDMSwgMHhGRSwgMHg4QywgMHhGMywKKwkgMHgwMCwgMHg2NSwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwRiwgMHgwMywgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhENywgMHg2MCwgMHhCMywgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1MSwgMHg2NCwKKwkgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgxOSwgMHg2MCwgMHg4NCwgMHg2NCwgMHg2OCwgMHhGQiwgMHgxQSwgMHg2MCwgMHg0NiwgMHg2MywgMHg4MSwgMHhGMywKKwkgMHhCRCwgMHhEQiwgMHg4MiwgMHhGMywgMHhCRCwgMHhEQiwgMHg4MywgMHhGMywgMHhBMywgMHhEQiwgMHgwMSwgMHg2MCwgMHgxMCwgMHg2NSwgMHg2OCwgMHhGMywKKwkgMHhBNSwgMHhEMSwgMHgwNCwgMHhBNCwgMHg2OCwgMHhGQiwgMHhEMCwgMHg4MCwgMHhBMCwgMHhEMywgMHgyMCwgMHgwNywgMHg0MCwgMHg0NywgMHg2MCwgMHg0MSwKKwkgMHgwRSwgMHg2NSwgMHg0NSwgMHhEMywgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwgMHgwMywgMHgxQiwgMHgxMCwgMHhCMCwKKwkgMHhGRiwgMHhGRiwgMHhFQiwgMHgwMiwgMHgyNywgMHg0NCwgMHgwNiwgMHhBNCwgMHg2MCwgMHg0MSwgMHhBMSwgMHhEMSwgMHg4MSwgMHhGMywgMHg4MiwgMHhGMSwKKwkgMHhEMCwgMHg4MCwgMHg1OSwgMHhEMywgMHgwOCwgMHgwMiwgMHhEMCwgMHg4MCwgMHg4MywgMHhGMywgMHg1OSwgMHhEMSwgMHgwNCwgMHgwMiwgMHhEMCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMiwgMHgwMywgMHgwMCwgMHhEOCwgMHg2MCwgMHg5OSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQSwgMHg2MCwgMHg0NiwgMHg2MywKKwkgMHhCRCwgMHhEMywgMHg4MSwgMHhGQiwgMHhCRCwgMHhEMywgMHg4MiwgMHhGQiwgMHhBMywgMHhEMywgMHg4MywgMHhGQiwgMHg1MywgMHg2NCwgMHgzQiwgMHg0MiwKKwkgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwKKwkgMHhFQywgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhEOCwgMHg2MCwgMHgwNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg3RSwgMHhGMSwgMHg3RiwgMHhGOSwgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgxRSwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhEOCwgMHg2MCwgMHgzNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMSwgMHg2MywgMHg4QywgMHhGRCwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHhDMSwgMHhGRSwgMHg1NCwgMHg2NCwgMHgzQiwgMHg0MiwKKwkgMHg1QSwgMHhEQiwgMHgzMSwgMHg0NCwgMHhGOSwgMHhCNCwgMHg0MCwgMHg1MSwgMHgwMSwgMHg2MCwgMHhCQSwgMHg2MSwgMHgxRiwgMHg2MCwgMHgwOCwgMHg2MywKKwkgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMCwgMHg3RiwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMSwgMHg3RiwgMHhCRCwgMHhEQiwKKwkgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMiwgMHg3RiwgMHhBMywgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhEOCwgMHg2MCwKKwkgMHg2NCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHgxRiwgMHg2MCwKKwkgMHgwNiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwKKwkgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhEOCwgMHg2MCwgMHg4OSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHhENiwgMHg2MCwgMHhCNywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyNywgMHg0MywgMHgyRCwgMHg2MCwgMHg3QSwgMHg2NSwgMHhBNSwgMHhEMywgMHg2NSwgMHg0MSwgMHgxMCwgMHhBMywgMHgwMSwgMHhBNCwKKwkgMHhGRSwgMHhCNCwgMHhDNCwgMHg4NSwgMHhGRSwgMHhBMSwgMHhCRCwgMHhEMywgMHg1OSwgMHhEMSwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhENSwgMHg4MCwKKwkgMHgwMiwgMHgwMiwgMHgwNCwgMHgwMywgMHhGOCwgMHgwMSwgMHhENywgMHg2MCwgMHhERCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1NSwgMHg2NCwgMHgzQiwgMHg0MiwKKwkgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwKKwkgMHhFQywgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhEOCwgMHg2MCwgMHhCMSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNywgMHhEMSwgMHg3RiwgMHhGOSwgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgxRSwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhEOCwgMHg2MCwgMHhENiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMSwgMHg2MCwgMHhCQSwgMHg2MSwgMHgxRiwgMHg2MCwgMHgwOCwgMHg2MywgMHhBMSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgyMCwgMHg3RiwgMHhCRCwgMHhEQiwgMHgyMSwgMHg2MCwgMHgzMiwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwNCwgMHhBMSwgMHhBMSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgyMiwgMHg3RiwgMHhBMywgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwKKwkgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhEOCwgMHg2MCwgMHhGMywgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHgxRiwgMHg2MCwgMHgwNiwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgyMCwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhEOSwgMHg2MCwgMHgxOCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxQSwgMHg2MCwgMHg2QSwgMHg2MiwgMHgwNywgMHg2MCwKKwkgMHhEMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyNywgMHg0MywgMHgwNiwgMHhBMywgMHhCRCwgMHhEMywgMHg4MSwgMHhGQiwgMHhCRCwgMHhEMywKKwkgMHg4MiwgMHhGQiwgMHhBMywgMHhEMywgMHg4MywgMHhGQiwgMHgzMSwgMHg0NCwgMHhGOSwgMHhCNCwgMHg0MCwgMHg1MSwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwMSwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhEOSwgMHg2MCwKKwkgMHg0RCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhCQywgMHhGMSwgMHgxQSwgMHg2MCwgMHg2QSwgMHg2MiwKKwkgMHhBMiwgMHhEOSwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHhGRSwgMHg2MCwgMHhGRiwgMHg2MSwgMHhBMSwgMHg4NCwgMHg1QSwgMHhEMSwKKwkgMHg0QSwgMHhEQiwgMHhBMSwgMHg4NCwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhENywgMHg2MCwgMHhERCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyNywgMHg0MiwgMHgwQywgMHhBMiwgMHgyOCwgMHg2MCwgMHgwMiwgMHg2MywgMHhBMiwgMHhEMywgMHhBMywgMHhEMywgMHgwMCwgMHhCRCwgMHgwMSwgMHg2MywKKwkgMHhBQywgMHg4MSwgMHgwOSwgMHgwMywgMHgwOCwgMHgwMywgMHhCMCwgMHg2MCwgMHg1OCwgMHg0RCwgMHhCNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhCOCwKKwkgMHgwMSwgMHg2MywgMHgwMSwgMHgwMywgMHg2MCwgMHg0MywgMHgxQSwgMHg2MCwgMHgzRSwgMHg2NCwgMHhBMCwgMHhERCwgMHg2MCwgMHhGNSwgMHgwMCwgMHg2NCwKKwkgMHgyQiwgMHhGQSwgMHgyMCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgyNywgMHg0MywgMHgwNiwgMHhBMywgMHhCRCwgMHhEMSwgMHgyQywgMHhGOCwgMHgzMiwgMHhGOCwKKwkgMHhCRCwgMHhEMSwgMHgyRCwgMHhGOCwgMHgzMywgMHhGOCwgMHhBMywgMHhEMSwgMHgyRSwgMHhGOCwgMHgzNCwgMHhGOCwgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwKKwkgMHhFQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHhCQywgMHhGMSwgMHgxOSwgMHhGOCwgMHhGOCwgMHg2MCwgMHg4MCwgMHg2NCwKKwkgMHgwRSwgMHhGQSwgMHgwMCwgMHhGNCwgMHgwMSwgMHg2MywgMHgzMiwgMHg0MCwgMHgwOCwgMHgyNiwgMHgxMCwgMHhCQiwgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHhGRSwgMHgyNiwgMHgxMCwgMHhCQiwgMHgwOSwgMHhGQywgMHgxQSwgMHg2MCwgMHgzRSwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHgxMiwgMHg2MSwgMHg1OSwgMHhEQSwgMHgxQSwgMHg2MCwgMHg0NiwgMHg2MywgMHhCRCwgMHhEMSwgMHg1OSwgMHhEOCwgMHhCRCwgMHhEMSwKKwkgMHg1OSwgMHhEOCwgMHhBMywgMHhEMSwgMHg1OSwgMHhEOCwgMHgyRSwgMHg2MCwgMHhERSwgMHg2NCwgMHg0MCwgMHg0OCwgMHhEOSwgMHg4MSwgMHhGRiwgMHg2MCwKKwkgMHhGMiwgMHg2NCwgMHhFOCwgMHg2MCwgMHg1OCwgMHg0RCwgMHhFOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MCwgMHhGNSwgMHgzRiwgMHhGQywgMHhEQiwgMHg4MywKKwkgMHgyRSwgMHg2MCwgMHgwOCwgMHg2MiwgMHhBMiwgMHhERCwgMHgyMCwgMHg3QywgMHg1QSwgMHhEOSwgMHg2MywgMHg0MSwgMHgyRSwgMHg2MCwgMHgwQywgMHg2MywKKwkgMHgxMiwgMHg2NSwgMHgwMCwgMHhGNCwgMHhDRCwgMHg4NCwgMHg0QywgMHg5MSwgMHg2MCwgMHg0MywgMHg2MCwgMHhGRSwgMHhBNSwgMHhEMiwgMHhERSwgMHg4NSwKKwkgMHg3RiwgMHgyNiwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHg1RCwgMHg5MywgMHhBMywgMHhEQiwgMHg1RCwgMHg5MywgMHhBNSwgMHhEMiwKKwkgMHhGNiwgMHgxRiwgMHg1RCwgMHg5MywgMHgyMCwgMHhGRSwgMHhERiwgMHg4MywgMHg2MCwgMHhGNSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwKKwkgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhDMSwgMHhGRSwgMHgxNCwgMHg2NCwgMHg2OSwgMHhGQiwgMHg1NiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgxQSwgMHg2MCwgMHg0NCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2NCwgMHhBNCwgMHhBMiwgMHhEQiwgMHgxQSwgMHg2MCwgMHg0NCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgxQSwgMHg2MCwgMHg2QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwMCwgMHg2MCwKKwkgMHgxQywgMHg2NCwgMHhBMiwgMHhEQiwgMHhEQSwgMHg2MCwgMHgxMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwRSwgMHgwMywKKwkgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1NywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwMCwgMHg2NCwgMHg2OSwgMHhGQiwgMHgwRiwgMHg2MCwKKwkgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhENywgMHg2MCwgMHhERCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgxNywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwKKwkgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHg1OCwgMHg2NCwgMHgzQiwgMHg0MiwKKwkgMHg1QSwgMHhEQiwgMHgwMCwgMHg2NCwgMHg2OSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhEQiwgMHg2MCwKKwkgMHhDQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgzQSwgMHgwMywgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwMCwgMHg2NCwgMHg2OSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgyNiwgMHg0NiwgMHgwMCwgMHhGNCwgMHgwQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHgyQywgMHgxOCwgMHg1OSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgwQSwgMHhGMiwgMHgyNiwgMHg0NiwgMHg0MCwgMHg1OSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MSwgMHgyRiwgMHhGMiwgMHhBMSwgMHhEQiwgMHgzMCwgMHhGMiwKKwkgMHg0MSwgMHg1OCwgMHg1OSwgMHhEQiwgMHgzMSwgMHhGMiwgMHg1OSwgMHhEQiwgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwKKwkgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgwNSwgMHg2NSwgMHhFOSwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHg0QywgMHg3OCwgMHhGRiwgMHhGRiwgMHhEQywgMHg2MCwgMHhBQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhENywgMHg2MCwgMHhERCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg1QSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHg3OCwgMHg0MywgMHgwMiwgMHg2MSwgMHgyNCwgMHg2MCwgMHhERCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg1QiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwOSwgMHhGMCwgMHgyRSwgMHg2MCwgMHg2NCwgMHg2MywgMHgzMCwgMHg2NCwKKwkgMHhCRCwgMHhEQiwgMHhCRCwgMHhEOSwgMHgwQSwgMHhGMCwgMHhCRCwgMHhEOSwgMHgwQiwgMHhGMCwgMHhCRCwgMHhEOSwgMHgwQywgMHhGMiwgMHhCRCwgMHhEQiwKKwkgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwgMHgwQSwgMHhBNSwgMHgyRSwgMHg2MCwgMHg2MiwgMHg2MiwgMHg2NSwgMHg1QywgMHhBMiwgMHhEOSwgMHg2MCwgMHg0MSwKKwkgMHgxQSwgMHg2NSwgMHhDRCwgMHg4NCwgMHg0QywgMHg5MSwgMHg2MCwgMHg0MywgMHg2MCwgMHhGRSwgMHhBNSwgMHhEMiwgMHhERSwgMHg4NSwgMHg3RiwgMHgyNiwKKwkgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHg1RCwgMHg5MywgMHhBMywgMHhEQiwgMHg1RCwgMHg5MywgMHhBNSwgMHhEMiwgMHhGNiwgMHgxRiwKKwkgMHg1RCwgMHg5MywgMHgyMCwgMHhGRSwgMHhERiwgMHg4MywgMHhEMywgMHg2MCwgMHg1OCwgMHg0RCwgMHgwNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHgwNywgMHhCNCwgMHgwMSwgMHg2MSwgMHgwMywgMHgwMywgMHhDQywgMHg4NCwgMHhFMSwgMHg4MSwgMHhGRCwgMHgwMiwgMHg2MSwgMHg0NCwKKwkgMHg5NiwgMHhGQiwgMHgyNywgMHg0NSwgMHgwMiwgMHg2MiwgMHg0NiwgMHhEMywgMHg1QSwgMHhEMSwgMHg2MCwgMHg0NywgMHg1NiwgMHhGQiwgMHg2NCwgMHg0NywKKwkgMHg1NSwgMHhGQiwgMHgwMCwgMHg2NCwgMHg1QywgMHhGQiwgMHgwQywgMHg2MiwgMHg0NiwgMHhEMywgMHg4MCwgMHhGQiwgMHgwQiwgMHhGMCwgMHgwRiwgMHg2MCwKKwkgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHg4NSwgMHhGQiwgMHgxQSwgMHg2MCwgMHgzRSwgMHg2MiwgMHhBMiwgMHhEMywgMHg4NywgMHhGQiwgMHgyNiwgMHg0NiwKKwkgMHgzMiwgMHhGMCwgMHg4MSwgMHhGOSwgMHgzMywgMHhGMCwgMHg4MiwgMHhGOSwgMHgzNCwgMHhGMCwgMHg4MywgMHhGOSwgMHgwMCwgMHhGNCwgMHgxOCwgMHg2NSwKKwkgMHgwQywgMHg2MSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHhBNSwgMHhEMCwgMHhEQSwgMHg4NSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwKKwkgMHhCRCwgMHhEQiwgMHgwNSwgMHgwMywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHhGNCwgMHgwMiwgMHgwMiwgMHg2MCwKKwkgMHgwMiwgMHg2MSwgMHhBMSwgMHhEMywgMHgwMCwgMHg2NSwgMHg2MCwgMHg0MywgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHg3RiwgMHhCNCwgMHgwMiwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwMSwgMHg2NCwgMHgxNSwgMHgwMCwgMHgwNCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMiwgMHg2NCwgMHgxMSwgMHgwMCwgMHgwQSwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwNCwgMHg2NCwgMHgwRCwgMHgwMCwgMHgwQiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwOCwgMHg2NCwgMHgwOSwgMHgwMCwgMHgxMCwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgxMCwgMHg2NCwgMHgwNSwgMHgwMCwgMHgxNiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgyMCwgMHg2NCwgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NCwKKwkgMHhDRiwgMHg4MywgMHhCNCwgMHg4NSwgMHhFMSwgMHgwMiwgMHg2NSwgMHg0NCwgMHg3QSwgMHhGQiwgMHgwMiwgMHg2MCwgMHgwMiwgMHg2MSwgMHhBMSwgMHhEMywKKwkgMHgwMCwgMHg2NSwgMHg2MCwgMHg0MywgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHg4MCwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHg2MCwgMHg0NSwKKwkgMHhDRiwgMHg4MywgMHg2NSwgMHg0NCwgMHhGNywgMHgwMiwgMHg3RiwgMHhCNCwgMHgwMiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwQSwgMHg2NCwgMHgxNSwgMHgwMCwKKwkgMHgwNCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgxNCwgMHg2NCwgMHgxMSwgMHgwMCwgMHgwQSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgzMiwgMHg2NCwgMHgwRCwgMHgwMCwKKwkgMHgwQiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgzNywgMHg2NCwgMHgwOSwgMHgwMCwgMHgxMCwgMHgzQSwgMHgwMiwgMHgwMCwgMHg1MCwgMHg2NCwgMHgwNSwgMHgwMCwKKwkgMHgxNiwgMHgzQSwgMHgwMiwgMHgwMCwgMHg2RSwgMHg2NCwgMHgwMSwgMHgwMCwgMHgxNCwgMHg2NCwgMHg3QywgMHhGQiwgMHhBOSwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHhBNCwgMHhEOCwgMHhGMywgMHg2MCwgMHg0NSwgMHg2NiwgMHg0MSwgMHg2NSwgMHg0NiwgMHg4QywgMHhGQSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwKKwkgMHgwNiwgMHgwMCwgMHgwMiwgMHgzNiwgMHgwNCwgMHgwMCwgMHgwNCwgMHgzNiwgMHgwMiwgMHgwMCwgMHgwNSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwKKwkgMHgwMSwgMHgwMCwgMHgwMSwgMHg2NCwgMHg2RiwgMHhGQSwgMHg3OSwgMHhGMywgMHg3QSwgMHhGMSwgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwgMHg2NSwgMHg0MywKKwkgMHgwMiwgMHgwMiwgMHg3OSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgwRiwgMHg2MCwgMHhBRSwgMHg2NSwgMHhEOCwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2MSwgMHg0NSwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwgMHg3QiwgMHhGQiwgMHg2RiwgMHhGMCwgMHg2MCwgMHg0NywgMHg5MCwgMHg4NCwgMHg2RiwgMHhGQSwKKwkgMHg2MCwgMHg0NywgMHg2MCwgMHg0NSwgMHg4MCwgMHg2NCwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwKKwkgMHg3MCwgMHhGMCwgMHg3MCwgMHhGQSwgMHgwMCwgMHg2MSwgMHhFOCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNSwgMHhERCwgMHg4MSwgMHhGQiwgMHgwMSwKKwkgMHhFMSwgMHg4MSwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHg2NiwgMHg0MywgMHgwQywgMHhGNCwgMHhBOSwgMHhGMywKKwkgMHgxQywgMHg2MCwgMHhCQSwgMHg2NSwgMHgwMiwgMHhBNCwgMHg2MCwgMHg0NiwgMHgwNSwgMHhGMCwgMHg2MCwgMHg0MSwgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHgwMCwgMHg3QywgMHg0NCwgMHhEOSwgMHgyNiwgMHg0NiwgMHgzMSwgMHhGMiwgMHg2MSwgMHg1QywgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEOSwgMHgyNiwgMHg0NiwgMHgyRiwgMHhGMCwgMHg2MSwgMHg0NiwgMHgwMywgMHhGOCwgMHgyNiwgMHg0NiwgMHgzMCwgMHhGMCwKKwkgMHg2MSwgMHg0NiwgMHgwNCwgMHhGOCwgMHgyNiwgMHg0NiwgMHgzMSwgMHhGMCwgMHg2MSwgMHg0NiwgMHgwNSwgMHhGOCwgMHgyNiwgMHg0NiwgMHhDRiwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHgyMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgwMywgMHg2NSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHg3QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2MywgMHg4QywgMHhGRCwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwKKwkgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHhDMSwgMHhGRSwgMHg1QywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHhENiwgMHg2MCwgMHhCNywgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2MCwgMHhGNywgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHhEMCwgMHg2MCwKKwkgMHg5OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEQywgMHhGMywgMHhGRiwgMHhGRiwgMHhGRCwgMHhBMCwgMHgyQSwgMHhGMiwgMHgwMywgMHgwMywgMHhEQywgMHg2MCwKKwkgMHg3QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHhCMCwgMHgzNiwgMHgxMSwgMHgwMCwgMHhDMCwgMHgzNiwgMHgwMiwgMHgwMCwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhEMCwgMHg2MCwgMHg5OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NSwgMHgwMCwgMHhGNCwKKwkgMHgwQSwgMHhGMiwgMHgwQiwgMHhGMiwgMHhGRSwgMHhBMCwgMHhGMywgMHhBMCwgMHg2RiwgMHgwMiwgMHg2MCwgMHg0MSwgMHgwOSwgMHhGMiwgMHgyMCwgMHgwMywKKwkgMHgwMCwgMHhBMCwgMHhGRiwgMHhBMCwgMHg1MywgMHgwMywgMHg2NSwgMHgwMywgMHgwMCwgMHhBMCwgMHhGRiwgMHhGRiwgMHg0RiwgMHgwMywgMHgxRiwgMHg2MCwKKwkgMHg1NCwgMHg2MSwgMHgwMSwgMHg2NCwgMHhBMSwgMHhEQiwgMHgxRiwgMHg2MCwgMHg1NiwgMHg2MSwgMHgwRCwgMHg2NCwgMHhBMSwgMHhEQiwgMHgxRiwgMHg2MCwKKwkgMHg1OCwgMHg2MSwgMHgwMywgMHg2NCwgMHhBMSwgMHhEQiwgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhEMCwgMHg2MCwgMHg5OCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyOCwgMHg2MCwgMHgyRSwgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhBMCwgMHgxRiwgMHg2MCwgMHg1NCwgMHg2MSwgMHgxNywgMHgwMiwKKwkgMHgwMSwgMHg2NCwgMHhBMSwgMHhEQiwgMHgxRiwgMHg2MCwgMHg1NiwgMHg2MSwgMHgwMCwgMHg2NCwgMHhBMSwgMHhEQiwgMHgxRiwgMHg2MCwgMHg1OCwgMHg2MSwKKwkgMHgwMSwgMHg2NCwgMHhBMSwgMHhEQiwgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhEMCwgMHg2MCwgMHg5OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2NCwKKwkgMHhBMSwgMHhEQiwgMHgxRiwgMHg2MCwgMHg1NiwgMHg2MSwgMHgwMCwgMHg2NCwgMHhBMSwgMHhEQiwgMHgxRiwgMHg2MCwgMHg1OCwgMHg2MSwgMHgwMSwgMHg2NCwKKwkgMHhBMSwgMHhEQiwgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhEMCwgMHg2MCwgMHg5OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NSwgMHg0NiwgMHgwNywgMHhGNCwKKwkgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMSwgMHg3RSwgMHgwNiwgMHhGQSwgMHg2NSwgMHg0NiwgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwKKwkgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhEMiwgMHg2MCwgMHg0MSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQSwgMHhGMiwgMHgwOSwgMHhGMiwgMHhGQywgMHhBMCwgMHhGRiwgMHhBMCwKKwkgMHgxMSwgMHgwMiwgMHgwQSwgMHgwMiwgMHgwQiwgMHhGMiwgMHg2NSwgMHg0NiwgMHgwQSwgMHgxQiwgMHg2NiwgMHg0MSwgMHgwNywgMHhGNCwgMHgwNiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHg3RSwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHhEMCwgMHg2MCwgMHg5OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2NSwgMHg0NiwgMHg2OSwgMHhGMSwgMHgyQSwgMHhGMiwgMHg2NCwgMHg0MSwgMHg2MCwgMHg0MCwgMHhBMCwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwOCwgMHhCMSwgMHgwNCwgMHgwMCwgMHhDMCwgMHgzQSwgMHgwQywgMHgwMCwgMHgwNCwgMHhCMSwgMHhGRiwgMHhGRiwgMHgyMCwgMHgwMywKKwkgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgxNywgMHgwMCwgMHhCMCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMSwgMHg2NSwgMHgwNywgMHgwMCwgMHgxMCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMiwgMHg2NSwKKwkgMHgwMywgMHgwMCwgMHgzMCwgMHgzQSwgMHgwRCwgMHgwMCwgMHgxMCwgMHg2NSwgMHhBNSwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwOSwgMHgwMywgMHgwRiwgMHg2MCwKKwkgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMCwgMHg2NiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyOCwgMHg2MCwgMHgyRSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhGQywgMHhBMCwgMHhGRiwgMHhGRiwKKwkgMHgxNiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHhEQywgMHg2MCwgMHhCQywgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyRCwgMHg2MCwgMHg1OCwgMHg2NSwgMHhBNSwgMHhEMSwgMHgwMSwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHhEMCwgMHg2MCwgMHg5OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg0MCwKKwkgMHgwOCwgMHgyQSwgMHgwMywgMHgwMCwgMHhDRiwgMHg2MCwgMHhGMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhENywgMHg2MCwgMHhERCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg0RSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgyRSwgMHhGNSwgMHhGRiwgMHhGRiwgMHgyNywgMHhGMiwgMHgxQywgMHg2MCwgMHhCQSwgMHg2NSwKKwkgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwKKwkgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgyNywgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwKKwkgMHgyNiwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwgMHgyNSwgMHhGMCwgMHg2MywgMHg0NiwKKwkgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwgMHhBOSwgMHhGMywKKwkgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHgyNSwgMHhGMiwgMHgyNiwgMHhGMCwgMHhBNywgMHhGMiwgMHhBOCwgMHhGMCwgMHg2NiwgMHhGNSwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg4OSwgMHhGOCwgMHg2NiwgMHhGNSwgMHhGRiwgMHhGRiwgMHgwNywgMHhGQywgMHgyQywgMHhGQSwKKwkgMHgyRCwgMHhGOCwgMHhBRSwgMHhGQSwgMHhFQiwgMHhGMywgMHgyRiwgMHhGQSwgMHhFQywgMHhGMywgMHgzMCwgMHhGQSwgMHhFRCwgMHhGMywgMHgzMSwgMHhGQSwKKwkgMHg4MSwgMHhGMywgMHgzMiwgMHhGQSwgMHg4MiwgMHhGMywgMHgzMywgMHhGQSwgMHg4MywgMHhGMywgMHgzNCwgMHhGQSwgMHgzMSwgMHg2MCwgMHgyQywgMHg2MSwKKwkgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMywgMHgxQiwgMHgwMCwgMHg2MCwgMHhBMCwgMHg2NCwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2MCwgMHhDMCwgMHg2NCwKKwkgMHgyQSwgMHhGQSwgMHgwMiwgMHg2MywgMHgzRiwgMHhGQywgMHhBQiwgMHhGQywgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHhDQywgMHhGMSwgMHgxOSwgMHhGOCwKKwkgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhDMSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhENiwgMHg2MCwgMHhDMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgzQSwgMHg2MSwgMHhBRSwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg2MiwgMHhGQiwgMHhBOSwgMHhGMywgMHgwNywgMHhGQSwgMHgwQywgMHg2MCwKKwkgMHg4MCwgMHg2NCwgMHhCQywgMHhGMSwgMHgxOSwgMHhGOCwgMHgwRSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgzRiwgMHhGQSwgMHgwMCwgMHg2MCwKKwkgMHgzQSwgMHg2MSwgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg2MSwgMHhGQiwgMHhBOSwgMHhGMywKKwkgMHgwNywgMHhGQSwgMHgwQywgMHg2MCwgMHg4MCwgMHg2NCwgMHgwRSwgMHhGQSwgMHhCQywgMHhGMSwgMHgxOSwgMHhGOCwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwKKwkgMHgzRiwgMHhGQSwgMHgxMCwgMHg2MCwgMHgyMCwgMHg2MiwgMHhERSwgMHg2MCwgMHhEQywgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFMCwgMHg2MiwKKwkgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERCwgMHg2MCwgMHg3MSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyMCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgyNywgMHg2MCwgMHhCNiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHhBOCwgMHgwMywgMHhBOCwgMHgwNCwgMHgwMywgMHgwMywgMHgwMywgMHhERSwgMHg2MCwgMHhDQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHg2MCwKKwkgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHgwRiwgMHg2MCwgMHhERSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg5QiwgMHhGRSwKKwkgMHgwMywgMHgwNSwgMHgyMCwgMHg0MCwgMHg0QiwgMHgyMywgMHgwRSwgMHgwMCwgMHgwRiwgMHg2MCwgMHhFMCwgMHg2MiwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhERCwgMHg2MCwgMHg4MywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyMSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwgMHg4NiwgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwKKwkgMHgwNywgMHgwMCwgMHg5MCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHgwMCwgMHg2NCwgMHhBMSwgMHhEQiwgMHgwNCwgMHgwMCwKKwkgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHg4QywgMHhGMywgMHg1OCwgMHhGQiwgMHg4NCwgMHhGMSwgMHhCQSwgMHhGRSwKKwkgMHgwMSwgMHhBOCwgMHg1OSwgMHhGOSwgMHgwNCwgMHgwMiwgMHgwMiwgMHg2NCwgMHg4QywgMHhGQiwgMHhGRiwgMHhGRiwgMHhDMSwgMHhGRSwgMHg2NCwgMHg0NywKKwkgMHhEQywgMHhGMywgMHgxMCwgMHhCMCwgMHgwNCwgMHhBOCwgMHgzMywgMHgwMiwgMHgzMiwgMHgwMiwgMHg2MiwgMHhGNSwgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwKKwkgMHhFQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHg4MSwgMHhGMSwgMHgyQywgMHhGOCwgMHgzMiwgMHhGOCwgMHg4MiwgMHhGMSwKKwkgMHgyRCwgMHhGOCwgMHgzMywgMHhGOCwgMHg4MywgMHhGMSwgMHgyRSwgMHhGOCwgMHgzNCwgMHhGOCwgMHgxMCwgMHg2MCwgMHg0OCwgMHg2NCwgMHgyQSwgMHhGQSwKKwkgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgyMiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHhFMCwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERCwgMHg2MCwgMHhFQSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgxMCwgMHg2NywgMHg4NCwgMHhGQiwgMHg4QywgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHhGRiwgMHhGRiwgMHgwQiwgMHgwMywgMHgwRiwgMHg2MCwgMHhFMCwgMHg2MiwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhERCwgMHg2MCwgMHhFRiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhERSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxQiwgMHg2MCwgMHhDNiwgMHg2NSwgMHgxRiwgMHg2MCwgMHg4MCwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHgwNSwgMHg3QywgMHgwOCwgMHhCMCwgMHhBNSwgMHhEMywgMHgwNSwgMHgwMiwgMHgwMCwgMHhCOCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywgMHgxNSwgMHg3QywKKwkgMHgwQiwgMHgwMCwgMHhEQywgMHhGMywgMHgxMiwgMHg2MCwgMHgyNiwgMHg2MywgMHgwMywgMHhBOCwgMHg3RiwgMHhGMywgMHgwNSwgMHgwMiwgMHhFMCwgMHg4NSwKKwkgMHg0NywgMHhEMywgMHhGRiwgMHhGRiwgMHgwNywgMHhCQywgMHhBMiwgMHhEQiwgMHg1MywgMHhGOSwgMHgyOSwgMHg2MCwgMHhDNiwgMHg2NCwgMHg1NCwgMHhGQiwKKwkgMHgyNCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg0RSwgMHhFQywgMHg2MCwgMHg1OCwgMHg0RiwgMHhCOSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwRSwgMHg0RiwgMHgwRiwgMHg2MCwgMHhFMCwgMHg2MiwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHg2MCwgMHgzNCwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHg1OSwgMHhGMywgMHg4NCwgMHhGQiwgMHg2MCwgMHg0MCwgMHgxMCwgMHgyNywgMHhEQSwgMHhGRSwgMHhEQywgMHhGMywgMHgwMCwgMHhBOCwgMHgwNCwgMHhBOCwKKwkgMHgyNywgMHgwMiwgMHgyNiwgMHgwMiwgMHg2MSwgMHhGNSwgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhFRCwgMHhGMSwKKwkgMHgzMSwgMHhGOCwgMHg4MSwgMHhGMSwgMHgyQywgMHhGOCwgMHg4MiwgMHhGMSwgMHgyRCwgMHhGOCwgMHg4MywgMHhGMSwgMHgyRSwgMHhGOCwgMHhBNCwgMHg2NCwKKwkgMHgyQSwgMHhGQSwgMHg4NSwgMHhGMSwgMHhDMCwgMHg2NywgMHhCMCwgMHg4NCwgMHgyQiwgMHhGQSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwKKwkgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHhDMSwgMHhGRSwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHgyNiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHg5RSwgMHhGNSwgMHhGRiwgMHhGRiwgMHgwNywgMHgxQiwgMHgyMCwgMHg0MCwgMHg4MCwgMHgyQiwgMHg1QywgMHgwMCwgMHg3RiwgMHg2MCwgMHhGRiwgMHg2NSwKKwkgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgwMCwgMHg2NCwgMHg0MSwgMHhGQiwgMHhGMSwgMHg2MCwgMHgwMSwgMHg2NCwgMHgyNCwgMHhGQSwgMHhEQSwgMHg4NSwKKwkgMHgxOSwgMHg2MCwgMHg4NiwgMHg2MywgMHg4OSwgMHhGMSwgMHg0MywgMHg0QywgMHhEMywgMHg4MCwgMHhCRSwgMHhEMSwgMHgxNCwgMHgwNSwgMHg2NSwgMHg0MCwKKwkgMHg4MCwgMHgyQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHg2NCwgMHg0MywgMHgzMiwgMHg2MSwgMHgwRiwgMHg0RSwgMHgyRiwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHgwMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwgMHgyQywgMHg0MywgMHgwNCwgMHhBMywgMHg0MSwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHgzMiwgMHhBNCwgMHg0MSwgMHhGQiwgMHhFNywgMHgwMSwgMHgyMCwgMHg0NywgMHgyMCwgMHhCMCwgMHgyMCwgMHhBRiwgMHgwRiwgMHgwMywgMHg0MCwgMHg0MCwKKwkgMHgwRiwgMHg2MCwgMHhFMCwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHg2MCwgMHhBMywgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHg5RSwgMHhGMSwgMHg0MSwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgwMiwgMHhBNCwgMHhFOCwgMHg4NCwgMHg2NCwgMHg0NiwgMHgyMywgMHhGQSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwKKwkgMHg2NCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEOSwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwMCwgMHg2NCwKKwkgMHg5RSwgMHhGQiwgMHhGQSwgMHhGRSwgMHhFQiwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHg1OCwgMHhGMywgMHg4QywgMHhGQiwKKwkgMHhGRiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhERSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFMCwgMHg2MiwKKwkgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERCwgMHg2MCwgMHg3MSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRSwgMHg2NCwKKwkgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyRiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHg5RSwgMHhGMSwKKwkgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NiwgMHg5RSwgMHhGQiwgMHgwNywgMHgwMywgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFQiwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgwRiwgMHg2MCwKKwkgMHhERSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFMCwgMHg2MiwgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhERCwgMHg2MCwgMHg3MSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg5NywgMHhGMywgMHgyNiwgMHg0NiwKKwkgMHg2MCwgMHg0MywgMHgwMSwgMHgyQSwgMHgyMiwgMHgwMCwgMHgwRiwgMHhGMiwgMHgyQSwgMHhGMCwgMHg2MCwgMHg0MCwgMHgxMCwgMHgyQSwgMHgxMCwgMHgwMCwKKwkgMHg2NCwgMHg0MCwgMHgwNCwgMHgyNywgMHgxQSwgMHgwMCwgMHhGRCwgMHhCMywgMHg2NCwgMHg0MCwgMHgyMCwgMHgyNywgMHgwMiwgMHhCQiwgMHgwRiwgMHg2MCwKKwkgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwQywgMHgwMCwKKwkgMHhGQiwgMHhCMywgMHg2NCwgMHg0MCwgMHgyMCwgMHgyNywgMHgwNCwgMHhCQiwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwKKwkgMHgxMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHg5NywgMHhGRCwgMHgyNiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHhEQywgMHhGMywgMHgzRiwgMHhGMiwgMHgwNCwgMHhBOCwgMHg1NywgMHhGQiwgMHgwMiwgMHgwMywgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhGNCwKKwkgMHgxRSwgMHg2MywgMHgwOCwgMHg2NCwgMHg0MCwgMHg0OCwgMHhCRCwgMHhEMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwNSwgMHgzNiwgMHgwQiwgMHgwMCwKKwkgMHhGRiwgMHhCNSwgMHhDNywgMHg4MywgMHgwMSwgMHgyQSwgMHhGNywgMHgwMSwgMHg0RiwgMHhEMiwgMHg1QiwgMHhEMiwgMHg2MCwgMHg0MCwgMHgwNSwgMHgzNywKKwkgMHgwOCwgMHgwMCwgMHhERiwgMHg4MywgMHhGNSwgMHgwMSwgMHhGRiwgMHhCNSwgMHg2NSwgMHg0MSwgMHg0NywgMHg4QSwgMHg1QiwgMHhEMiwgMHhERiwgMHg4MywKKwkgMHgwNywgMHgwMCwgMHgwMCwgMHg3RiwgMHhEQywgMHg4NSwgMHg0NywgMHg4QSwgMHg2MCwgMHg0MSwgMHg1QiwgMHhEMiwgMHhEQiwgMHg4MywgMHg2MCwgMHg0NywKKwkgMHgwMSwgMHhCMCwgMHhGRSwgMHhCNSwgMHgwMiwgMHgwMywgMHgwMiwgMHg2NCwgMHg0MCwgMHg0OCwgMHg4NSwgMHhGMSwgMHg2NSwgMHg0NCwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhGRCwgMHhBMSwgMHhFMSwgMHg4MSwgMHhFMSwgMHg4MSwgMHhFMSwgMHg4NSwgMHhDNCwgMHg4MSwgMHhEMCwgMHg4NCwKKwkgMHhEMSwgMHg4MCwgMHgyQSwgMHgwNywgMHgyOSwgMHgwNiwgMHg5QywgMHg4NCwgMHhEQywgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NSwKKwkgMHg5NiwgMHhGMywgMHhDNywgMHg4MywgMHgwMSwgMHgyNiwgMHg2MCwgMHg0NywgMHhBQiwgMHg4MywgMHhGQywgMHhBMywgMHgwMiwgMHgwMCwgMHgwMywgMHgwNCwKKwkgMHgwMCwgMHhGNCwgMHg4NCwgMHhBMywgMHhGQywgMHgwMSwgMHg4MCwgMHg2NSwgMHg0NywgMHhEMCwgMHgyOCwgMHg0MSwgMHhBMCwgMHg4MCwgMHhGRSwgMHhBMSwKKwkgMHgxNiwgMHgwMywgMHgwOSwgMHgwMiwgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxRSwgMHgwMCwgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxNSwgMHgwMCwgMHgyOCwgMHg0MSwgMHhGRSwgMHhBMSwgMHhGRiwgMHhGRiwgMHgwOSwgMHgwMywKKwkgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgwOCwgMHgwMCwgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyMCwgMHg0MCwgMHgyMCwgMHgyQSwgMHg1OCwgMHgwMCwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMiwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0MywKKwkgMHhGNCwgMHhBMywgMHgwMCwgMHg2MCwgMHgxRCwgMHg2MSwgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NSwgMHg2MCwgMHhGRSwgMHg4MSwgMHhBMSwgMHg3RiwgMHhBMSwKKwkgMHgwMiwgMHgwNiwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMiwgMHhDRiwgMHg4MywgMHhENCwgMHg4MCwgMHgyRCwgMHgwMywKKwkgMHgxNywgMHgwMywgMHhDRiwgMHg4MywgMHg2MSwgMHg0NCwgMHg4MCwgMHhBMCwgMHgyOCwgMHgwMywgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwKKwkgMHhERCwgMHg4MSwgMHhBMSwgMHhEMiwgMHhDRiwgMHg4MywgMHg4MSwgMHhBMSwgMHgyMCwgMHgwMywgMHgwNSwgMHgwNywgMHg3RiwgMHhBMSwgMHhDQywgMHg4NCwKKwkgMHhERCwgMHg4MSwgMHhFNCwgMHgwMywgMHhGNywgMHgwMSwgMHgwMCwgMHhGNCwgMHgwMCwgMHhCOCwgMHgwNCwgMHg2MSwgMHhFNCwgMHgwMywgMHhGMiwgMHgwMSwKKwkgMHgwMSwgMHg2MCwgMHhGRiwgMHg2MywgMHg0NiwgMHg0OCwgMHg0MSwgMHg0QSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwgMHhERiwgMHg4MywgMHhBMywgMHhEOSwKKwkgMHg2NCwgMHg0NCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwgMHhERiwgMHg4MywgMHhBMywgMHhEOSwgMHhDQywgMHg4NCwgMHg4MSwgMHhBMSwgMHgwNSwgMHgwMywKKwkgMHg3RiwgMHhBMSwgMHhGNywgMHgwNCwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwgMHhGNCwgMHgwMSwgMHgyMCwgMHhGRSwgMHgwMCwgMHhCQiwgMHgwMiwgMHg2MCwKKwkgMHgwMCwgMHg2MywgMHgwOCwgMHgyNCwgMHgxMSwgMHgwMCwgMHhCRCwgMHhEMywgMHgwNiwgMHg2NSwgMHhENCwgMHg4MCwgMHhCRCwgMHhEMywgMHgwQywgMHgwMiwKKwkgMHg2MCwgMHg0MCwgMHg2MCwgMHgzQSwgMHgwOSwgMHgwMCwgMHgxRCwgMHgzQiwgMHgwNywgMHgwMCwgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHhGRiwgMHhCNSwKKwkgMHgwMCwgMHg3RSwgMHg1QywgMHhGQiwgMHg2NSwgMHg0NCwgMHg1QiwgMHhGQiwgMHgyNiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MywgMHg5NywgMHhGRCwgMHgxQSwgMHg2MCwgMHg3MiwgMHg2MywgMHgwMCwgMHg2NCwKKwkgMHhBMywgMHhEQiwgMHgwNiwgMHhBMywgMHgxMCwgMHg2MCwgMHg1MCwgMHg2NCwgMHhCRCwgMHhEQiwgMHhCRCwgMHhEQiwgMHgwNiwgMHg2NCwgMHhBMywgMHhEQiwKKwkgMHgxMCwgMHg2MCwgMHg0RSwgMHg2MiwgMHhFMCwgMHg2MCwgMHgwNywgMHg2NCwgMHhBMiwgMHhEQiwgMHhEMiwgMHhGMSwgMHgxQSwgMHg2MCwgMHg3NiwgMHg2MiwKKwkgMHhBMiwgMHhEOSwgMHgxQSwgMHg2MCwgMHg3RSwgMHg2MywgMHgwMCwgMHg2NCwgMHhBMywgMHhEQiwgMHgwNiwgMHhBMywgMHgxMCwgMHg2MCwgMHg1NCwgMHg2NCwKKwkgMHhCRCwgMHhEQiwgMHhCRCwgMHhEQiwgMHgwNiwgMHg2NCwgMHhBMywgMHhEQiwgMHgxMCwgMHg2MCwgMHg1MiwgMHg2MiwgMHhFMCwgMHg2MCwgMHgxMSwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgyOCwgMHg2MCwgMHgwNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgxQSwgMHg2MCwgMHg4MiwgMHg2MiwgMHhBMiwgMHhEOSwgMHgwMCwgMHg2MCwKKwkgMHgzQSwgMHg2MSwgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg2NCwgMHhGQiwgMHhBOSwgMHhGMywKKwkgMHgwNywgMHhGQSwgMHhCQywgMHhGMywgMHgxOSwgMHhGQSwgMHhGOCwgMHg2MCwgMHg4MCwgMHg2NCwgMHgwRSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwKKwkgMHgzRiwgMHhGQSwgMHgwMCwgMHg2MCwgMHgzQSwgMHg2MSwgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwKKwkgMHg2NSwgMHhGQiwgMHhBOSwgMHhGMywgMHgwNywgMHhGQSwgMHhCQywgMHhGMywgMHgxOSwgMHhGQSwgMHgyNCwgMHg2MCwgMHg4MCwgMHg2NCwgMHgwRSwgMHhGQSwKKwkgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgzRiwgMHhGQSwgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwKKwkgMHgxMCwgMHg2MCwgMHgyOCwgMHg2MiwgMHhFMCwgMHg2MCwgMHg3NywgMHg2NCwgMHhBMiwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MywKKwkgMHg5NywgMHhGRCwgMHhCQSwgMHhGRSwgMHhGRSwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHg4NCwgMHhGRCwgMHgwRiwgMHg2MCwKKwkgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwKKwkgMHhGNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyOCwgMHg2MCwgMHgwNCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgxQSwgMHg2MCwgMHg4MiwgMHg2MiwgMHhBMiwgMHhEOSwgMHgyNywgMHg2MCwgMHhGRSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgwQSwgMHgxQiwgMHgwMCwgMHg2NCwgMHg4NCwgMHhGQiwgMHhCQSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHg1QSwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhCQSwgMHhGRSwgMHg5NywgMHhGMywgMHgwMCwgMHg2MywgMHg4NCwgMHhGRCwgMHgxMCwgMHhCQywKKwkgMHg5NywgMHhGQiwgMHhGRSwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMCwgMHg2MCwgMHg2NCwgMHg2MywgMHgxQSwgMHg2MCwKKwkgMHg0MiwgMHg2NCwgMHhBMCwgMHhERCwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhGOCwgMHg2MiwKKwkgMHgwMSwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFMCwgMHg2MCwgMHhDOSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwKKwkgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhBMywgMHgwMSwgMHgzMSwgMHg0MCwgMHgwNCwgMHgyQSwgMHhFMywgMHgwMSwgMHgyMCwgMHg0MCwKKwkgMHg1MiwgMHgyMywgMHgxMiwgMHgwMCwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhGOCwgMHg2MiwgMHg4MSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFMCwgMHg2MCwKKwkgMHhDOSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHhEQiwgMHgwMSwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHg2NSwgMHhGNSwgMHhCQywgMHhGMSwgMHgxOSwgMHhGOCwgMHg4MSwgMHhGMSwKKwkgMHgyQywgMHhGOCwgMHgzMiwgMHhGOCwgMHg4MiwgMHhGMSwgMHgyRCwgMHhGOCwgMHgzMywgMHhGOCwgMHg4MywgMHhGMSwgMHgyRSwgMHhGOCwgMHgzNCwgMHhGOCwKKwkgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHgxMSwgMHg2MCwgMHg0OCwgMHg2NCwKKwkgMHgyQSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgyQiwgMHhGQSwgMHgyMywgMHhGQSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwKKwkgMHgwRiwgMHg2MCwgMHhGOCwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFMSwgMHg2MCwgMHgyMywgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2NSwgMHhGNSwgMHgyMywgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxOCwgMHg3QiwgMHgwMSwKKwkgMHgxMCwgMHg2NywgMHg4NCwgMHhGQiwgMHgwMywgMHg2NCwgMHg5OCwgMHhGQiwgMHhGRSwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwKKwkgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhGOCwgMHg2MiwgMHg4MSwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhFMSwgMHg2MCwgMHg0NiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRCwgMHgwMCwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhFMCwgMHg2MCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwgMHg0NiwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyMCwgMHg0MSwgMHg4RSwgMHhGMywgMHhBNSwgMHg4MCwKKwkgMHgwMSwgMHhCMCwgMHgwMSwgMHgwMiwgMHgwNiwgMHgwMCwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgxQSwgMHg2MCwgMHg0MiwgMHg2NSwgMHhBNSwgMHhEMywgMHgwMSwgMHg2MywgMHg4QywgMHhGRCwgMHgyNywgMHgxQiwgMHgwMCwgMHg2MCwKKwkgMHg2NCwgMHg2NCwgMHhBNSwgMHhEQiwgMHg2NSwgMHhGNSwgMHhCQywgMHhGMSwgMHgxOSwgMHhGOCwgMHg4MSwgMHhGMSwgMHgyQywgMHhGOCwgMHgzMiwgMHhGOCwKKwkgMHg4MiwgMHhGMSwgMHgyRCwgMHhGOCwgMHgzMywgMHhGOCwgMHg4MywgMHhGMSwgMHgyRSwgMHhGOCwgMHgzNCwgMHhGOCwgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwKKwkgMHhFQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHgxMSwgMHg2MCwgMHg0OCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgwMCwgMHg2NCwKKwkgMHgyQiwgMHhGQSwgMHgyMywgMHhGQSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwNiwgMHgwMCwgMHg5NywgMHhGMywgMHgzMiwgMHg0MCwKKwkgMHgwMiwgMHgyNiwgMHgwMiwgMHgwMCwgMHg0MCwgMHgyQSwgMHhEQSwgMHhGRSwgMHhDMSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhGOCwgMHg2MiwgMHgwMSwgMHg2MCwgMHg4MiwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFMSwgMHg2MCwgMHhBNCwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMSwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhFMCwgMHg2MCwgMHg3NywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNiwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhCQSwgMHhGRSwgMHhFMywgMHg2MCwgMHhDOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2NCwgMHg4QywgMHhGQiwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NSwKKwkgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHhCQSwgMHhGRSwgMHhDMSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhGOCwgMHg2MiwgMHgwMSwgMHg2MCwgMHg0NiwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhFMSwgMHg2MCwgMHhENywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhFMCwgMHg2MCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwKKwkgMHgzQywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgzNCwgMHgwMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwQywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyOCwgMHg2MCwgMHgwMCwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHg5NywgMHhGMywgMHgwMCwgMHg2MSwgMHhEMSwgMHg4MCwgMHhGNywgMHhCNCwgMHhGMCwgMHgwMywgMHg5NywgMHhGQiwgMHgzNSwgMHgwMCwgMHgwMCwgMHg2MCwKKwkgMHgxMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwRiwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyOCwgMHg2MCwgMHgwMCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHg5NywgMHhGMywgMHgwMCwgMHg2MSwgMHhEMSwgMHg4MCwgMHgwOCwgMHhCQywgMHgwMywgMHgwMiwgMHhFMiwgMHg2MCwgMHhFOCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg5NywgMHhGQiwgMHgyMSwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywKKwkgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhFMiwgMHg2MCwgMHhFOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHgwMCwgMHg2MCwgMHg0MCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDNSwgMHgwMSwKKwkgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhFMywgMHg2MCwKKwkgMHhDOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2MywgMHg5NywgMHhGMywgMHg4QywgMHhGRCwgMHgwMSwgMHhCQywKKwkgMHhDMSwgMHhGRSwgMHg5NywgMHhGQiwgMHhEMiwgMHhGMSwgMHgxQSwgMHg2MCwgMHg3NiwgMHg2MiwgMHhBMiwgMHhEOSwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhGOCwgMHg2MiwKKwkgMHgwMSwgMHg2MCwgMHgzNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFMiwgMHg2MCwgMHg2MiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyNCwgMHg2MCwKKwkgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg3MiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwKKwkgMHg5QywgMHg4NCwgMHgwRSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg3MiwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHhFMCwgMHg2MCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgxNywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg5NywgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwNCwgMHgyQSwgMHgwMSwgMHgwMCwgMHhEMiwgMHgwMSwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwKKwkgMHg3MiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHg5NywgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHgwOCwgMHgyQSwgMHg0RCwgMHgwMCwgMHg1NCwgMHgwMCwgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwKKwkgMHgxMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwOCwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg5NywgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHhCQywgMHg5NywgMHhGQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwKKwkgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhBQiwgMHgwMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwKKwkgMHgwQywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg3MiwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyQiwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMCwgMHg4MCwKKwkgMHg5QywgMHg4NCwgMHgwQywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg3MiwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgxMywgMHgwMCwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwOCwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHg5NywgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwQSwgMHgwMCwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHgwMCwgMHg5NywgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHg5NywgMHhGQiwgMHhFMSwgMHg2MCwgMHgyQSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyNywgMHg2MCwgMHhGRSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhBOCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwgMHhFMywgMHg2MCwKKwkgMHhEMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg5NywgMHhGMywgMHgwMSwgMHg2MywgMHg4QywgMHhGRCwgMHgyMSwgMHhCQywgMHg5NywgMHhGQiwgMHg2NCwgMHhGNSwKKwkgMHg4MSwgMHhGMSwgMHgyQywgMHhGOCwgMHg4MiwgMHhGMSwgMHgyRCwgMHhGOCwgMHg4MywgMHhGMSwgMHgyRSwgMHhGOCwgMHg4NSwgMHhGMSwgMHhDMCwgMHg2NywKKwkgMHhCMCwgMHg4NCwgMHgyQiwgMHhGQSwgMHhCQywgMHhGMSwgMHgxOSwgMHhGOCwgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQywgMHhGMSwgMHgzMCwgMHhGOCwKKwkgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHgxMCwgMHg2MCwgMHhBNCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwKKwkgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHhDMSwgMHhGRSwgMHgxQSwgMHg2MCwgMHg3NiwgMHg2MiwgMHgwMCwgMHg2MCwgMHg1MCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwKKwkgMHgxQSwgMHg2MCwgMHg3MiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhGNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHhGOCwgMHg2MiwgMHgwMSwgMHg2MCwgMHgyQywgMHg2NCwgMHhBMiwgMHhEQiwgMHhFMywgMHg2MCwgMHgzQSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwKKwkgMHg5QywgMHg4NCwgMHgwRSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg3MiwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHhFMCwgMHg2MCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwMywgMHgwMywKKwkgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4RCwgMHgwMSwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwOCwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg5NywgMHhGMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCMCwKKwkgMHhGRiwgMHhGRiwgMHg0RSwgMHgwMywgMHg3RCwgMHgwMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwMywgMHgwMywKKwkgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg0NSwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgxNiwgMHgwMywKKwkgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg3MiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyOCwgMHg2MCwgMHgwMCwgMHg2MiwgMHhBMiwgMHhEMywgMHg5NywgMHhGMywgMHgwMCwgMHhBOCwKKwkgMHhGNywgMHhCNCwgMHgyRSwgMHgwMywgMHg5NywgMHhGQiwgMHhFMiwgMHg2MCwgMHgzQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgxNywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwKKwkgMHg3MiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyOCwgMHg2MCwgMHgwMCwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHg5NywgMHhGMywgMHgwMCwgMHhBOCwgMHgwOCwgMHhCQywgMHgwMSwgMHgwMiwgMHg0MiwgMHgwMSwgMHg5NywgMHhGQiwgMHhFMiwgMHg2MCwKKwkgMHgzQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhBMCwgMHg4MCwKKwkgMHg5QywgMHg4NCwgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHgwMCwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwKKwkgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg3MiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHg5NywgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHg5NywgMHhGQiwgMHhFMSwgMHg2MCwgMHgyQSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg5NywgMHhGMywgMHgwMSwgMHg2MywgMHg4QywgMHhGRCwgMHgwMSwgMHhCQywgMHg5NywgMHhGQiwgMHgwMCwgMHg2NCwgMHg4NCwgMHhGQiwgMHhDMSwgMHhGRSwKKwkgMHgyOSwgMHgwMCwgMHg5NywgMHhGMywgMHgwMSwgMHg2MywgMHg4QywgMHhGRCwgMHgwMSwgMHhCQywgMHg5NywgMHhGQiwgMHgwMCwgMHg2NCwgMHg4NCwgMHhGQiwKKwkgMHg2NCwgMHhGNSwgMHg4MSwgMHhGMSwgMHgyQywgMHhGOCwgMHg4MiwgMHhGMSwgMHgyRCwgMHhGOCwgMHg4MywgMHhGMSwgMHgyRSwgMHhGOCwgMHg4NSwgMHhGMSwKKwkgMHhDMCwgMHg2NywgMHhCMCwgMHg4NCwgMHgyQiwgMHhGQSwgMHhCQywgMHhGMSwgMHgxOSwgMHhGOCwgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQywgMHhGMSwKKwkgMHgzMCwgMHhGOCwgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHgwMCwgMHg2MCwgMHhBNCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwKKwkgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg3RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwKKwkgMHgxNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhGOCwgMHg2MiwgMHgwMywgMHg2MCwgMHgwRSwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhFNCwgMHg2MCwgMHgxNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwRSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg3RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHhFMCwgMHg2MCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgwQSwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwKKwkgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDNiwgMHgwMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwKKwkgMHgxNSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QiwgMHgwMSwgMHgwMCwgMHg2MCwgMHgxMiwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhBQywgMHgwMSwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHhBRCwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHgxMCwgMHg2NywgMHg4NCwgMHhGQiwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NSwgMHhGNSwgMHhCQywgMHhGMSwgMHgxOSwgMHhGOCwgMHg4MSwgMHhGMSwgMHgyQywgMHhGOCwgMHgzMiwgMHhGOCwKKwkgMHg4MiwgMHhGMSwgMHgyRCwgMHhGOCwgMHgzMywgMHhGOCwgMHg4MywgMHhGMSwgMHgyRSwgMHhGOCwgMHgzNCwgMHhGOCwgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwKKwkgMHhFQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHgxMSwgMHg2MCwgMHg0OCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgwMCwgMHg2NCwKKwkgMHgyQiwgMHhGQSwgMHgyMywgMHhGQSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHg5NywgMHhGMywgMHhDMSwgMHhGRSwgMHhGRSwgMHhCNCwKKwkgMHg5NywgMHhGQiwgMHgwRiwgMHg2MCwgMHhGOCwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMywgMHg2NCwgMHhBMiwgMHhEQiwgMHhFNCwgMHg2MCwgMHg5NCwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwKKwkgMHgwMiwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyOSwgMHgwMSwgMHg2NSwgMHhGNSwKKwkgMHgyMywgMHhGMiwgMHg5OCwgMHhGMywgMHgwNCwgMHgxOCwgMHhDQywgMHg4NCwgMHg5OCwgMHhGQiwgMHgwMSwgMHgwMywgMHgyMSwgMHgwMSwgMHhFMSwgMHg2MCwKKwkgMHgyQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg2MCwgMHhGRSwgMHg2MiwgMHhBMiwgMHhEMywgMHg4NCwgMHhGMSwgMHgwMiwgMHhBOCwgMHgyQSwgMHhGMiwKKwkgMHgwMywgMHgwMiwgMHhCMCwgMHg4NCwgMHgyQSwgMHhGQSwgMHgwOCwgMHgwMCwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwKKwkgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyMiwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwKKwkgMHgyNCwgMHg2MCwgMHgzNCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHhEQiwgMHgwMiwgMHhCRiwgMHg2MCwKKwkgMHhFNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGQywgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQSwgMHg2MCwgMHhBRSwgMHg2MywgMHgwMCwgMHg2NCwgMHhBMywgMHhEQiwKKwkgMHgwNiwgMHhBMywgMHgxMCwgMHg2MCwgMHg1QywgMHg2NCwgMHhCRCwgMHhEQiwgMHhCRCwgMHhEQiwgMHgwNiwgMHg2NCwgMHhBMywgMHhEQiwgMHgxMCwgMHg2MCwKKwkgMHg1QSwgMHg2MiwgMHhFNCwgMHg2MCwgMHhEMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxRiwgMHg2MCwgMHg1QywgMHg2MiwgMHhBMiwgMHhEMSwgMHgxQSwgMHg2MCwKKwkgMHhCMiwgMHg2MiwgMHhBMiwgMHhEOSwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHhFNCwgMHg2MCwgMHhGOSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwgMHg4MCwgMHg2NSwgMHhBNSwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCQywKKwkgMHhGMywgMHhCNCwgMHgwMSwgMHhCMCwgMHhBNSwgMHhEQiwgMHgwQywgMHgwMiwgMHgxMiwgMHg2MCwgMHgyNiwgMHg2MSwgMHgwMCwgMHg2NCwgMHgxQSwgMHg2MywKKwkgMHg1OSwgMHhEQiwgMHhGRSwgMHgxRiwgMHgxRiwgMHg2MCwgMHg1QywgMHg2MSwgMHgwQSwgMHg2NCwgMHgxQSwgMHg2MywgMHg1OSwgMHhEQiwgMHhGRSwgMHgxRiwKKwkgMHg3RiwgMHhGMywgMHg3RSwgMHhGQiwgMHgwMSwgMHg2NCwgMHg3RiwgMHhGQiwgMHgwMSwgMHg2MSwgMHhDQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywKKwkgMHhFMSwgMHg4MSwgMHhGQiwgMHgwMSwgMHhCQSwgMHhGMywgMHg2MSwgMHg0NSwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHg2OSwgMHgwMywgMHgwRiwgMHg2MCwKKwkgMHhGQywgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhGRSwgMHg2MiwgMHg0MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFNSwgMHg2MCwgMHgxRiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHg3RiwgMHhGMSwgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgxRSwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhGRSwgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFNSwgMHg2MCwgMHg0MywgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhGQywgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwRiwgMHg2MCwgMHhGRSwgMHg2MiwgMHgwMCwgMHg2MCwgMHgxQSwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFNSwgMHg2MCwgMHg2NCwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHhBRSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGQywgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwKKwkgMHgwOCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwQywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwKKwkgMHgxQSwgMHg2MCwgMHhBRSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyNiwgMHgwMCwKKwkgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwQiwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwKKwkgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHhBRSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwKKwkgMHgxMiwgMHg2MCwgMHgyNiwgMHg2NSwgMHg3RiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwNCwgMHhBNCwgMHhGMiwgMHhBMCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwNiwKKwkgMHhGMSwgMHhBNCwgMHgwMSwgMHgzNiwgMHgwQiwgMHgwMCwgMHgwMCwgMHgzNiwgMHgwNCwgMHhBNCwgMHg2MCwgMHg0MSwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhCOCwgMHg2MSwgMHg0NCwgMHhFRiwgMHgwMiwgMHg3NSwgMHgwMSwgMHgxRiwgMHg2MCwgMHg4MCwgMHg2NSwKKwkgMHhBNSwgMHhEMywgMHg3RSwgMHhGMSwgMHhGQywgMHhCNCwgMHhBNSwgMHhEQiwgMHg3RiwgMHhGOSwgMHgwRiwgMHg2MCwgMHhGQywgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhGRSwgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhFNSwgMHg2MCwgMHhBNSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg3RiwgMHhGMSwgMHgyNCwgMHg2MCwKKwkgMHg5QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgxRSwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGRSwgMHg2MiwKKwkgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFNSwgMHg2MCwgMHhDOSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhGQywgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhFNiwgMHg2MCwgMHhFOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFNiwgMHg2MCwgMHhFRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwKKwkgMHg4MCwgMHg2MywgMHhBMywgMHhEMywgMHgyNiwgMHg0NiwgMHgwMiwgMHhCMCwgMHgzRiwgMHhGMiwgMHhGNiwgMHgwMywgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywKKwkgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NSwgMHhENCwgMHg4MCwgMHgwMCwgMHhGNCwgMHgwMiwgMHgyNCwgMHg2NSwgMHg0NCwgMHgxMiwgMHg2NSwgMHg2MCwgMHg0MSwKKwkgMHhBNSwgMHhEMCwgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwKKwkgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHgwNSwgMHgwMywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHhGMCwgMHgwMiwKKwkgMHgwMiwgMHg2MCwgMHgxNCwgMHg2MywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhCNCwgMHhGRiwgMHhGRiwgMHgzNywgMHgwMiwgMHgyOSwgMHg2MCwKKwkgMHhBNCwgMHg2NCwgMHhBMCwgMHhEMSwgMHgxRiwgMHg2MCwgMHgwRSwgMHg2MywgMHgzMSwgMHgxOCwgMHg2NCwgMHg0MSwgMHg0NCwgMHg0QiwgMHgyOSwgMHg2MCwKKwkgMHhBNiwgMHg2NSwgMHhBNSwgMHhEMSwgMHhEQSwgMHg4NSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHgwNSwgMHgwMywKKwkgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHhGNCwgMHgwMiwgMHgwMiwgMHg2MCwgMHgxQSwgMHg2MSwgMHhBMSwgMHhEMywKKwkgMHgyQiwgMHg0NSwgMHg2MCwgMHg0MCwgMHgwMCwgMHgzNiwgMHgxQSwgMHgwMCwgMHgwMSwgMHgzNiwgMHgxOCwgMHgwMCwgMHhENCwgMHg4MCwgMHg2NSwgMHg0MywKKwkgMHhCMCwgMHgwMiwgMHgxRiwgMHg2MCwgMHgwQywgMHg2NCwgMHhFMywgMHg4MywgMHhGRSwgMHhBMywgMHg1OSwgMHhEMSwgMHg1OCwgMHhEMywgMHg0MCwgMHg0QiwKKwkgMHhEMCwgMHg4MCwgMHgyQiwgMHg0NCwgMHgwMiwgMHgwMiwgMHhGOSwgMHgxRiwgMHgwOSwgMHgwMCwgMHgwMiwgMHg2MCwgMHgxQSwgMHg2MSwgMHg2NSwgMHg0MywKKwkgMHhFMywgMHg4MywgMHhGRSwgMHhBMywgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHg5QywgMHgxQiwgMHhGQywgMHgxRiwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMCwKKwkgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhEMCwgMHg4MCwgMHg2NCwgMHg0MSwgMHgwMSwgMHgwNSwgMHg2MCwgMHg0MSwgMHhGNCwgMHhBMSwgMHgwMiwgMHg2MCwKKwkgMHgxOCwgMHg2MywgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwgMHhGRCwgMHhBMCwgMHhGOSwgMHhBMCwgMHgwOCwgMHgwMywgMHgzNSwgMHgwMywgMHhGRSwgMHhBMSwKKwkgMHg2NCwgMHg0MiwgMHhFMiwgMHg4NSwgMHhEMSwgMHg4MSwgMHhDNywgMHg4MywgMHg4NCwgMHgwNiwgMHhGMywgMHgwMSwgMHgxMiwgMHg2MCwgMHgyNiwgMHg2NSwKKwkgMHhCRCwgMHhEMywgMHhGRCwgMHhBMSwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NSwgMHgwNSwgMHg2NCwgMHhBNSwgMHhEQiwgMHgxRiwgMHg2MCwgMHg4MCwgMHg2NSwKKwkgMHhBNSwgMHhEMywgMHg0MSwgMHg0OCwgMHgwNCwgMHhCQywgMHhBNSwgMHhEQiwgMHgxMiwgMHg2MCwgMHgyOCwgMHg2NSwgMHgxMiwgMHg2MCwgMHg0NCwgMHg2MSwKKwkgMHg0OSwgMHhEMywgMHhENiwgMHg4MCwgMHgwMCwgMHhCOCwgMHgwRSwgMHgwMywgMHhGQiwgMHgwMywgMHg2MiwgMHg0NSwgMHgxMiwgMHg2MCwgMHgyNiwgMHg2MSwKKwkgMHg1OSwgMHhEMywgMHhENiwgMHg4MCwgMHgwMCwgMHhCOCwgMHgwNiwgMHgwMywgMHhGQiwgMHgwMywgMHgwNSwgMHg2NCwgMHhBMiwgMHhEQiwgMHhENiwgMHg4MCwKKwkgMHgwMiwgMHhBMiwgMHhGQywgMHgwMiwgMHgwRiwgMHg2MCwgMHhGQywgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyOCwgMHg0MSwgMHhDNSwgMHgwMSwgMHg2MywgMHg0NSwgMHgwNCwgMHg2MCwgMHgwMCwgMHg2MywgMHhENywgMHg4MywKKwkgMHhFQiwgMHg4MywgMHhEMywgMHg4MCwgMHg2NSwgMHg0MywgMHgwMSwgMHgwNSwgMHg1NCwgMHgwMCwgMHhGRSwgMHhBMywgMHg0MywgMHg0QiwgMHhBMywgMHhEMywKKwkgMHg2MywgMHg0MSwgMHg2MCwgMHg0MywgMHgxQiwgMHg2MCwgMHhDNiwgMHg2NCwgMHhBMCwgMHhERCwgMHhFMywgMHg4MywgMHhGRSwgMHhBMywgMHg1OSwgMHhEMSwKKwkgMHg1OCwgMHhEOSwgMHhGRCwgMHgxRiwgMHgwMCwgMHg2MywgMHg1OCwgMHhERCwgMHgyQiwgMHg0MywgMHhCRCwgMHhEMSwgMHgxRiwgMHg2MCwgMHg3OCwgMHg2NCwKKwkgMHg2NCwgMHg0MSwgMHhCRCwgMHhEMSwgMHg1OCwgMHhEOSwgMHhCRCwgMHhEMSwgMHhGQywgMHhBMSwgMHg0MSwgMHg0QiwgMHg1OCwgMHhEOSwgMHhCRCwgMHhEMSwKKwkgMHhBMCwgMHhEOSwgMHgxMiwgMHg2MCwgMHgyNiwgMHg2MSwgMHgxMiwgMHg2MCwgMHg0MiwgMHg2NSwgMHgwMCwgMHg2NCwgMHhENSwgMHg4MCwgMHg1OSwgMHhEQiwKKwkgMHhGRCwgMHgwMiwgMHgxMiwgMHg2MCwgMHgyNCwgMHg2NSwgMHhCRCwgMHhEMywgMHhBMywgMHhEMSwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4MiwgMHgxMiwgMHg2MCwKKwkgMHg0NCwgMHg2NSwgMHgwNSwgMHg2NCwgMHg2NCwgMHg0MSwgMHg1QSwgMHhEQiwgMHhENiwgMHg4MCwgMHhDRCwgMHg4MSwgMHgyMiwgMHgwMywgMHhGQiwgMHgwMiwKKwkgMHgxRiwgMHg2MCwgMHg1QSwgMHg2MSwgMHg0QiwgMHhEMSwgMHgwNCwgMHhBMywgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHhGNiwgMHhBMCwgMHhDMSwgMHg4MiwKKwkgMHgwNSwgMHgwNSwgMHg2NCwgMHg0MSwgMHg1QSwgMHhEQiwgMHhDRCwgMHg4MSwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMiwgMHgyQiwgMHg0MSwgMHhGRCwgMHhBMSwKKwkgMHg0MSwgMHg0QiwgMHhERiwgMHgwNywgMHgwRiwgMHg2MCwgMHhGQywgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxRiwgMHg2MCwgMHg4MCwgMHg2NSwgMHhBNSwgMHhEMywgMHhGRiwgMHhGRiwgMHgwOCwgMHhCQywgMHhBNSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHgyNiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHg5QSwgMHhGRiwgMHg1QywgMHg2MSwKKwkgMHgzRiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg4MywgMHhBMCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgyOCwgMHgzOSwgMHgwMCwgMHhGNCwgMHhBNCwgMHg2MCwgMHg0MywKKwkgMHgwMCwgMHhGNCwgMHgxRSwgMHg2MiwgMHg2MCwgMHhGRSwgMHhBMiwgMHhEMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg4NSwgMHgzNiwgMHgxMCwgMHgwMCwKKwkgMHhERSwgMHg4MiwgMHhBMiwgMHhEMiwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHhGRiwgMHhCNCwgMHgwMiwgMHhBNCwgMHg1MywgMHg5MywgMHg1MSwgMHg5MSwKKwkgMHgwNSwgMHgwRSwgMHhGRiwgMHhBNCwgMHg0MiwgMHg5MiwgMHg2MywgMHg0MCwgMHg2MSwgMHg0MCwgMHhFQywgMHgxQywgMHg5OCwgMHhGRiwgMHhEOSwgMHgwMSwKKwkgMHgyMCwgMHhGRSwgMHgwNSwgMHg2NCwgMHgwMCwgMHg3QywgMHg0MiwgMHg5MiwgMHg2MCwgMHhGRSwgMHhERSwgMHg4MiwgMHhBMiwgMHhEMiwgMHhERSwgMHg4MiwKKwkgMHhBMiwgMHhEMCwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHg2NCwgMHg1RiwgMHg2MCwgMHg0MywgMHg2MCwgMHhGRSwgMHhERSwgMHg4MiwgMHhBMiwgMHhEMiwKKwkgMHhERSwgMHg4MiwgMHhBMiwgMHhEMCwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHg2NCwgMHg1RiwgMHg5OCwgMHhGRiwgMHgwMSwgMHhBMywgMHgwMSwgMHhBNCwKKwkgMHgyRCwgMHg2MCwgMHg1QSwgMHg2MiwgMHhBMiwgMHhERCwgMHgyRCwgMHg2MCwgMHg1RSwgMHg2MiwgMHhBMiwgMHhEQiwgMHhCQSwgMHgwMSwgMHg5OCwgMHhGRiwKKwkgMHhCOCwgMHgwMSwgMHgwMCwgMHg2MCwgMHhBMCwgMHg2MSwgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwKKwkgMHg1RCwgMHhGQiwgMHgwNCwgMHg2NCwgMHgwMywgMHhGQSwgMHg4MCwgMHg2NCwgMHgyQSwgMHhGQSwgMHhDQywgMHhGMSwgMHgxOSwgMHhGOCwgMHgwMCwgMHg2NCwKKwkgMHgzRSwgMHhGQSwgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NCwgMHgwRSwgMHhGQSwgMHhBOSwgMHhGMSwgMHgwNywgMHhGOCwgMHg2NywgMHg0NCwgMHgyQywgMHhGQSwKKwkgMHgyRCwgMHhGQSwgMHgyRSwgMHhGQSwgMHgxMCwgMHg2MCwgMHgxQywgMHg2MiwgMHhFOCwgMHg2MCwgMHhERiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHg1RCwgMHhGNSwgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwKKwkgMHg4MSwgMHhGMSwgMHgzMiwgMHhGOCwgMHg4MiwgMHhGMSwgMHgzMywgMHhGOCwgMHg4MywgMHhGMSwgMHgzNCwgMHhGOCwgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMiwgMHg2NCwgMHg2NCwgMHg0MCwgMHhGRSwgMHgyNiwgMHgxMCwgMHhCQywgMHgzMiwgMHg0MCwgMHgwOCwgMHgyNiwgMHgxMCwgMHhCQywKKwkgMHgyRiwgMHg2MCwgMHg0NCwgMHg2MiwgMHhBMiwgMHhEQiwgMHgyOCwgMHg2MCwgMHgyQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgyRCwgMHg2MCwgMHg3QSwgMHg2NCwKKwkgMHgwMiwgMHgxOCwgMHgyNywgMHg2MCwgMHhEQSwgMHg2NCwgMHgyRSwgMHg2MCwgMHhBRSwgMHg2MiwgMHhBMiwgMHhEQiwgMHgyRSwgMHg2MCwgMHhDQSwgMHg2MiwKKwkgMHhBMiwgMHhEQiwgMHgyRCwgMHg2MCwgMHhBNiwgMHg2MSwgMHgyOCwgMHg2MCwgMHhDQywgMHg2MiwgMHhBMiwgMHhEMywgMHgyRSwgMHg2MCwgMHg5NiwgMHg2NSwKKwkgMHhGRSwgMHhBNCwgMHhFMCwgMHg4NCwgMHgwMiwgMHgwNSwgMHg2NywgMHg0NCwgMHg5OSwgMHgwMCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NSwgMHgyRCwgMHg2MCwKKwkgMHhDQywgMHg2MiwgMHhBMiwgMHhEMywgMHhBNSwgMHhEMSwgMHhEQSwgMHg4NSwgMHgyRCwgMHg2MCwgMHhDNCwgMHg2MiwgMHhBMCwgMHg4MywgMHhBMiwgMHhERCwKKwkgMHhBNSwgMHhEMSwgMHgyRCwgMHg2MCwgMHhDMiwgMHg2MiwgMHhBMCwgMHg4MywgMHhBMiwgMHhERCwgMHgyRCwgMHg2MCwgMHhBMCwgMHg2MSwgMHhERCwgMHg2MCwKKwkgMHgwNiwgMHg2NCwgMHhBMSwgMHhEQiwgMHgwNiwgMHhBMSwgMHgyRCwgMHg2MCwgMHhDQSwgMHg2MiwgMHhBMiwgMHhEMywgMHgyRCwgMHg2MCwgMHhDMiwgMHg2MiwKKwkgMHg2MCwgMHg0MCwgMHhGRCwgMHhBMCwgMHhBMiwgMHhEMywgMHg3NCwgMHgwMywgMHg1MCwgMHg2MCwgMHgwMCwgMHg3QywgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQSwKKwkgMHgwMywgMHgwMCwgMHgwMSwgMHg2MCwgMHhGMiwgMHg2MywgMHgwRSwgMHgwMCwgMHgwNCwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMiwgMHg2MCwgMHhGMiwgMHg2MywKKwkgMHgwOSwgMHgwMCwgMHgxMCwgMHgyQSwgMHgwMywgMHgwMCwgMHgwNCwgMHg2MCwgMHhGMiwgMHg2MywgMHgwNCwgMHgwMCwgMHgyMCwgMHgyQSwgMHgwNCwgMHgwMCwKKwkgMHgwNSwgMHg2MCwgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHgyRCwgMHg2MCwgMHhDQSwgMHg2MiwgMHhBMiwgMHhEMywgMHgyRCwgMHg2MCwKKwkgMHhDNCwgMHg2MiwgMHhGRSwgMHhBMCwgMHhBMiwgMHhEMywgMHg1NCwgMHgwMywgMHgwMCwgMHg2MCwgMHgwMCwgMHg2MywgMHg1OSwgMHhERCwgMHg2MSwgMHg0NSwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwMCwgMHg2MCwgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHg2MCwgMHg0MCwKKwkgMHgwMiwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwMSwgMHg2MCwgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHg2MCwgMHg0MCwgMHgwNCwgMHgyQSwKKwkgMHgwNCwgMHgwMCwgMHgwMiwgMHg2MCwgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHg2MCwgMHg0MCwgMHgxMCwgMHgyQSwgMHgwNCwgMHgwMCwKKwkgMHgwNCwgMHg2MCwgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHg2MCwgMHg0MCwgMHgyMCwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwNSwgMHg2MCwKKwkgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHhENSwgMHg4MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhBNSwgMHhERCwgMHgyRCwgMHg2MCwKKwkgMHhDQSwgMHg2MiwgMHhBMiwgMHhEMywgMHgyRCwgMHg2MCwgMHhDNiwgMHg2MiwgMHhGRiwgMHhBMCwgMHhBMiwgMHhEMywgMHgyMSwgMHgwMywgMHgwMCwgMHg2MCwKKwkgMHgwMCwgMHg2MywgMHg1OSwgMHhERCwgMHg2MSwgMHg0NSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwMCwgMHg2MCwgMHhGMiwgMHg2MywKKwkgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwMSwgMHg2MCwgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwKKwkgMHg1OSwgMHhERCwgMHg2MCwgMHg0MCwgMHgwNCwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwMiwgMHg2MCwgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwKKwkgMHhENSwgMHg4MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhBNSwgMHhERCwgMHgyRCwgMHg2MCwgMHhDOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg1OSwgMHhEOSwKKwkgMHgyRCwgMHg2MCwgMHhBMCwgMHg2NSwgMHhENSwgMHg4NCwgMHhERCwgMHg3RiwgMHhBNSwgMHhEQiwgMHg2NSwgMHg0NCwgMHgyRSwgMHg2MCwgMHhCOCwgMHg2MiwKKwkgMHhBMiwgMHhEQiwgMHgyRSwgMHg2MCwgMHhENCwgMHg2MiwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhENCwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhFOCwgMHg2MCwgMHgyRiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhEMiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg3RiwgMHhGMSwgMHgyRiwgMHg2MCwgMHgwRSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgyRSwgMHg2MCwKKwkgMHhCNiwgMHg2NSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RCwgMHgzMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1RCwgMHhGNSwgMHgwMCwgMHhGNCwgMHg4MCwgMHhGMSwKKwkgMHgwNiwgMHhGOCwgMHgyRiwgMHg2MCwgMHg0NCwgMHg2MiwgMHhBMiwgMHhEMywgMHgwNywgMHhGQSwgMHgyRSwgMHg2MCwgMHhBRSwgMHg2NCwgMHg0MCwgMHg0OCwKKwkgMHgxMCwgMHg2MSwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhFOCwgMHg2MCwgMHg1OCwgMHg0RCwgMHhFOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1RCwgMHhGNSwKKwkgMHgzRiwgMHhGQywgMHhEQiwgMHhGRSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwNCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHhEQywgMHhGMywgMHg5QiwgMHhGRSwgMHhGRCwgMHhBMCwgMHgyNSwgMHgwNCwgMHgyNCwgMHgwMiwgMHgwNCwgMHg2NCwgMHgwMywgMHhGQSwgMHgwMCwgMHhGNCwKKwkgMHgwOSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwMCwgMHgzQSwgMHgxQywgMHgwMCwgMHg2MCwgMHg0MywgMHgwMCwgMHgzNiwgMHgxQywgMHgwMCwKKwkgMHhFMCwgMHhBMCwgMHhEQSwgMHg4NSwgMHgxNiwgMHgwNywgMHgyRCwgMHg2MCwgMHg3QSwgMHg2MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHhEMywgMHg4MCwKKwkgMHhDQiwgMHg4MywgMHgwRiwgMHgwMiwgMHgwNywgMHgwRSwgMHg1OSwgMHhEMywgMHhBNSwgMHhEMCwgMHhEQSwgMHg4NSwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHgwMiwgMHhGOSwgMHgxRiwgMHgxMywgMHgxRSwgMHhBNSwgMHhEMCwgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHg5MCwgMHg4MCwgMHhGRiwgMHgyMiwKKwkgMHgwRCwgMHgwMCwgMHhFOCwgMHg2MCwgMHhERCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyOCwgMHg2MCwgMHgyQSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwgMHgyNywgMHg2MCwgMHhEQSwgMHg2NCwgMHgwMiwgMHgwMCwgMHgyRCwgMHg2MCwgMHg3QSwgMHg2NCwKKwkgMHgyRSwgMHg2MCwgMHhDQSwgMHg2MiwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NiwgMHgyRiwgMHhGMiwgMHgyQywgMHhGQSwgMHgzMCwgMHhGMiwgMHgyRCwgMHhGQSwKKwkgMHgzMSwgMHhGMiwgMHgyRSwgMHhGQSwgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwKKwkgMHg4MSwgMHhGMSwgMHgzMiwgMHhGOCwgMHg4MiwgMHhGMSwgMHgzMywgMHhGOCwgMHg4MywgMHhGMSwgMHgzNCwgMHhGOCwgMHg1MCwgMHg2MywgMHgyQSwgMHhGQywKKwkgMHhDQywgMHhGMywgMHgxOSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHhBOSwgMHhGMywgMHgwNywgMHhGQSwgMHgwMCwgMHhGNCwgMHg4MCwgMHhGMSwKKwkgMHgwNiwgMHhGOCwgMHgyRiwgMHg2MCwgMHg0NCwgMHg2MiwgMHhBMiwgMHhEMywgMHgwNywgMHhGQSwgMHgyRSwgMHg2MCwgMHhEMiwgMHg2NSwgMHhFOSwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHgzMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyRSwgMHg2MCwgMHhDQSwgMHg2NCwgMHg0MCwgMHg0OCwgMHgxMCwgMHg2MSwgMHgwMCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhFOCwgMHg2MCwgMHg1OCwgMHg0RCwgMHhFOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGQywgMHgyNCwgMHg2MCwKKwkgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhEMiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwgMHgwMCwgMHg2NCwgMHg5NCwgMHhGQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyRiwgMHg2MCwgMHg0NiwgMHg2MiwgMHhBMiwgMHhEQiwgMHhDRCwgMHg4MSwgMHgyOCwgMHhEMywgMHg1QSwgMHg4OCwgMHhEQywgMHg4MywgMHgzOSwgMHgxOCwKKwkgMHhGQiwgMHgwMywgMHg2MSwgMHg0MCwgMHg3RiwgMHgzQSwgMHgwNywgMHgwMCwgMHgyRiwgMHg2MCwgMHg0NiwgMHg2MiwgMHhBMiwgMHhEMywgMHgwMywgMHg2MSwKKwkgMHg3QywgMHhBNCwgMHhBMiwgMHhEQiwgMHgwMCwgMHhGNCwgMHg2MCwgMHhGRSwgMHhBMywgMHhEMSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEOCwgMHg2MSwgMHg0MCwKKwkgMHg3RiwgMHgzQSwgMHgwOSwgMHgwMCwgMHgyMCwgMHhGRSwgMHgyRiwgMHg2MCwgMHg0NiwgMHg2MiwgMHhBMiwgMHhEMywgMHgwMywgMHg2MSwgMHg3QywgMHhBNCwKKwkgMHhBMiwgMHhEQiwgMHgwMCwgMHhGNCwgMHg2MCwgMHhGRSwgMHhDRiwgMHg4MywgMHhBMywgMHhEMywgMHhERCwgMHg4MSwgMHhBMSwgMHhEQSwgMHhGRiwgMHhCNCwKKwkgMHgwMCwgMHg3RiwgMHgxNSwgMHgwMywgMHhEQiwgMHg4MywgMHg2MSwgMHg0MCwgMHg3RiwgMHgzQSwgMHgwQiwgMHgwMCwgMHgyMCwgMHhGRSwgMHg2MCwgMHg0NSwKKwkgMHgyRiwgMHg2MCwgMHg0NiwgMHg2MiwgMHhBMiwgMHhEMywgMHgwMywgMHg2MSwgMHg3QywgMHhBNCwgMHhBMiwgMHhEQiwgMHg2NSwgMHg0NCwgMHgwMCwgMHhGNCwKKwkgMHg2MCwgMHhGRSwgMHhBMywgMHhEMSwgMHhERiwgMHg4MywgMHhERCwgMHg4MSwgMHhDQywgMHg4NCwgMHhBMSwgMHhEOCwgMHhFQywgMHgwMiwgMHgyMCwgMHhGRSwKKwkgMHhDMywgMHgwMSwgMHgyRiwgMHg2MCwgMHg0NiwgMHg2MiwgMHhBMiwgMHhEMSwgMHhGRCwgMHhBMSwgMHhGRiwgMHhCMSwgMHhDMSwgMHg4MywgMHhBMiwgMHhERCwKKwkgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2NywgMHg1QywgMHgxQiwgMHg2MCwgMHhDNiwgMHg2MSwgMHhBMSwgMHhEMywgMHhBNSwgMHhEOSwgMHgxMiwgMHgxOCwKKwkgMHg2MCwgMHg0MywgMHgyRiwgMHg2MCwgMHgxNCwgMHg2NCwgMHhBNSwgMHhEQiwgMHg2MCwgMHhGRSwgMHhBMCwgMHhERCwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwKKwkgMHhEQywgMHg4NCwgMHhDRiwgMHg4MywgMHhFMywgMHg4MywgMHg1OSwgMHhEMSwgMHhEQywgMHg4NCwgMHg2MCwgMHhGRSwgMHhBMCwgMHhEOSwgMHhGRiwgMHhGRiwKKwkgMHgyMCwgMHhGRSwgMHhGOSwgMHgxRiwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg1NywgMHgzMiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgyOSwgMHgwMCwKKwkgMHg0NSwgMHg0OCwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2MSwgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMSwgMHgwMywKKwkgMHhGMiwgMHg2MCwgMHgwMiwgMHg2NCwgMHgyNCwgMHhGQSwgMHgwMCwgMHg2MCwgMHg0OCwgMHg2MSwgMHgyOCwgMHg0NCwgMHg1OSwgMHhEQSwgMHgwMywgMHg2NCwKKwkgMHgzOCwgMHg0MywgMHhCRCwgMHhEMSwgMHhDQywgMHg4NCwgMHg1OSwgMHhEOCwgMHhGQywgMHgwMiwgMHgzOSwgMHg0NCwgMHg1OSwgMHhEQSwgMHgyOCwgMHg2MCwKKwkgMHgyRSwgMHg2NCwgMHhBMCwgMHhEMywgMHg1OSwgMHhEQSwgMHgwNywgMHg2NCwgMHgyMywgMHhGQSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwKKwkgMHg2NCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHhGQSwgMHhGRSwgMHgzNywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg1NywgMHgzMiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgxQywgMHgwMCwgMHg0NSwgMHg0OCwKKwkgMHgwMCwgMHg2MCwgMHgwNiwgMHg2MSwgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxNCwgMHgwMywgMHgwMiwgMHg2NCwKKwkgMHgyMywgMHhGQSwgMHhGMiwgMHg2MCwgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQSwgMHgyOCwgMHg0NCwgMHg1QSwgMHhEQSwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwKKwkgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHg2NCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGQSwgMHhGRSwgMHgzNywgMHg1OCwgMHhGRiwgMHhGRiwgMHhBMiwgMHhGRiwgMHgzMiwgMHg0MCwgMHg0MCwgMHgyNiwKKwkgMHgzRSwgMHgwMCwgMHg5RCwgMHhGMywgMHg2NywgMHg0MywgMHhEQywgMHg4NCwgMHhDQywgMHg4NCwgMHgzOSwgMHgwMywgMHg2MCwgMHg0NiwgMHgwQSwgMHgwMiwKKwkgMHg5RCwgMHhGRCwgMHgwMCwgMHg2MCwgMHg0NiwgMHg2MSwgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwKKwkgMHg5RCwgMHhGQiwgMHgyRSwgMHgwMywgMHg0NiwgMHg0QiwgMHgyNywgMHg2MCwgMHg3MiwgMHg2MSwgMHgxOCwgMHg2NCwgMHgyMywgMHhGQSwgMHhGMSwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHgyNCwgMHhGQSwgMHg0QSwgMHg2NSwgMHhBMiwgMHhGRiwgMHgyQywgMHg2MywgMHgwMCwgMHg2NCwgMHg1OSwgMHhEMSwgMHhBMiwgMHhEQiwKKwkgMHhBNSwgMHhEOCwgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHhGNywgMHgxRiwgMHgxMiwgMHg2MywKKwkgMHg1OSwgMHhEMSwgMHhBNSwgMHhEOCwgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHhGOCwgMHgxRiwKKwkgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHg2NCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyQiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGQSwgMHhGRSwgMHhBNiwgMHhGRSwgMHgwMCwgMHg2NCwgMHg5RCwgMHhGQiwgMHhBMywgMHhGRiwKKwkgMHhCRiwgMHg2MCwgMHhFNywgMHg3OCwgMHhGRiwgMHhGRiwgMHhBNiwgMHhGRSwgMHhCOCwgMHgwNSwgMHhBNywgMHhGRSwgMHgxMiwgMHgwNSwgMHhBNSwgMHhGRSwKKwkgMHgwMywgMHgwNCwgMHhFQSwgMHg2MCwgMHhDNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBNCwgMHhGRSwgMHhGMiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhERSwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHhCRiwgMHg2MCwgMHhFNywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgzNiwgMHg0NSwgMHgyMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHg0NCwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg5RiwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHhCMCwgMHgwMCwgMHg2NCwgMHg0MSwgMHgwMywgMHg5RiwgMHhGQiwgMHgzMSwgMHg0NCwgMHhFOCwgMHhCNCwgMHg0MCwgMHg1MSwKKwkgMHg2QSwgMHg0NCwgMHhGRiwgMHhGRiwgMHg4MCwgMHgyNiwgMHhGQywgMHgwMSwgMHg2MSwgMHhGRiwgMHg2MiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgxQSwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgzNCwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHg2NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRSwgMHg2MCwgMHhCQywgMHg2MiwgMHgxRSwgMHg2MCwgMHhCRSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHgwMSwgMHg2MCwgMHhGRSwgMHg2MywgMHgxQywgMHg2MCwgMHhCOCwgMHg2MSwgMHgwMCwgMHg2NCwgMHg1OSwgMHhEQiwgMHhGRSwgMHgxRiwKKwkgMHgxQywgMHg2MywgMHgxMCwgMHg2MCwgMHg1QywgMHg2NCwgMHg1OCwgMHhEMSwgMHhGRiwgMHhGRiwgMHgwOCwgMHgxQiwgMHhGQywgMHgxRiwgMHgwMCwgMHg2MCwKKwkgMHg2MiwgMHg2MywgMHgxQiwgMHg2MCwgMHhDNCwgMHg2NCwgMHgwMCwgMHg3QywgMHg1OCwgMHhEOSwgMHhGRSwgMHgxRiwgMHgxQywgMHg2MCwgMHhCNCwgMHg2MywKKwkgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgwNCwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwNSwgMHgwMywgMHgwMiwgMHg2NSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHg3QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCRiwgMHg2MCwgMHhFNywgMHg3OCwgMHhGRiwgMHhGRiwgMHhFQSwgMHg2MCwgMHhDNSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHg3NCwgMHgwMCwgMHgyOCwgMHg2MCwgMHg1MCwgMHg2MywgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwgMHhCRCwgMHhEMSwgMHhCMCwgMHg4NCwgMHhCMCwgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHgwNywgMHgwMiwgMHg4QywgMHhGQiwgMHgzMSwgMHg0NCwgMHhGRSwgMHhCNCwgMHg0MCwgMHg1MSwgMHgwRCwgMHg2NCwgMHgwNSwgMHhGQiwKKwkgMHg2NCwgMHgwMCwgMHgyOCwgMHhGMywgMHg5RiwgMHhGMSwgMHg2MCwgMHg0NywgMHg2NCwgMHg0MSwgMHgwNywgMHhCMSwgMHgwNywgMHhCNCwgMHgwOCwgMHgyNCwKKwkgMHg2NywgMHg0QywgMHg1MCwgMHhGQiwgMHgwMSwgMHg2MSwgMHgwMywgMHgwMywgMHhDQywgMHg4NCwgMHhFMSwgMHg4MSwgMHhGRCwgMHgwMiwgMHhBMSwgMHg4MCwKKwkgMHhCMSwgMHg4MywgMHg1MywgMHgwMiwgMHg5RiwgMHhGRCwgMHgyOCwgMHg2MCwgMHg0NCwgMHg2MiwgMHhBMiwgMHhEMywgMHhFNSwgMHhGQiwgMHg3RiwgMHhGQiwKKwkgMHgyNCwgMHg2MCwgMHg1RSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHg0NiwgMHg1RSwgMHgzMSwgMHg0NCwKKwkgMHgwMSwgMHhCQywgMHg0MCwgMHg1MSwgMHhEOCwgMHhGMywgMHgwMSwgMHg2MywgMHgwMywgMHhBOCwgMHg0RSwgMHhGRCwgMHgwNSwgMHgwMiwgMHgwMiwgMHg2MywKKwkgMHgxNCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhEQiwgMHhGQiwgMHgwQywgMHgwMCwgMHgwMiwgMHhBOCwgMHgwMSwgMHg2MywgMHgwMywgMHgwMywgMHgwQSwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHgwMywgMHgwMCwgMHgwMiwgMHg2MywgMHgxNCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhEQiwgMHhGQiwgMHgwMCwgMHg2NCwgMHg0RSwgMHhGQiwKKwkgMHg0QiwgMHhGRCwgMHhBOSwgMHhGNSwgMHhGRiwgMHhGRiwgMHgwRSwgMHhGMCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHgyOCwgMHg2MCwgMHhEMiwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhBMCwgMHgwMywgMHhBOCwgMHgxMSwgMHgwNiwgMHg3OSwgMHhGMSwgMHgwNiwgMHgwMiwgMHg2NCwgMHg0NCwKKwkgMHgwOCwgMHgyQSwgMHgwOSwgMHgwMCwgMHgwNiwgMHg2NCwgMHg0NCwgMHhEMywgMHgwRCwgMHgwMCwgMHg2NCwgMHg0NCwgMHgyMCwgMHgyQSwgMHgwMywgMHgwMCwKKwkgMHgwQSwgMHg2NCwgMHg0NCwgMHhEMywgMHgwNywgMHgwMCwgMHgwMSwgMHg2NCwgMHg0NCwgMHhEMywgMHgwNCwgMHgwMCwgMHhFOCwgMHg4NCwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEMywgMHgwMCwgMHgwMCwgMHgwRSwgMHhGQSwgMHhFRCwgMHhFMiwgMHgwRiwgMHg0RSwgMHhDOCwgMHg2MCwgMHg1OCwgMHg0RiwgMHgxNSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwgMHhCRiwgMHg2MCwgMHhFNywgMHg3OCwgMHhGRiwgMHhGRiwgMHhENywgMHhGRSwgMHhCRiwgMHg2MCwgMHhFNywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHhGMywgMHgwMSwgMHgyNCwgMHg2MCwgMHg0NiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwKKwkgMHgwRSwgMHhGMiwgMHg0RCwgMHgwMywgMHg2MCwgMHg0MCwgMHhGMCwgMHgzNywgMHgzQSwgMHgwMCwgMHhGRiwgMHgzNywgMHgyRiwgMHgwMCwgMHhGRCwgMHgzNywKKwkgMHgyNywgMHgwMCwgMHhGOCwgMHgzNywgMHgwQSwgMHgwMCwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHgwRiwgMHg2MCwgMHhEMiwgMHg2MiwgMHg0NiwgMHhEMSwKKwkgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhEQSwgMHgwMSwKKwkgMHgwNiwgMHhCNCwgMHhGRCwgMHg3RiwgMHgwRSwgMHhGQSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHg0QywgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGOSwgMHhGRSwgMHhDQSwgMHgwMSwKKwkgMHgyMywgMHhGMCwgMHg2MCwgMHg0MCwgMHgwNCwgMHgyNiwgMHhFQywgMHgxQiwgMHgwMiwgMHgyNiwgMHhFQSwgMHgxOCwgMHhBMiwgMHhGRiwgMHgwMiwgMHhGMCwKKwkgMHgwOSwgMHg2MCwgMHgwOCwgMHg2NCwgMHhEMCwgMHg4MCwgMHhCMCwgMHhGMywgMHgwMiwgMHgwMiwgMHhDQywgMHg4NCwgMHhCMCwgMHhGQiwgMHgyNCwgMHg2MCwKKwkgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCMywgMHgwMSwgMHhBQywgMHhGRSwKKwkgMHgwOSwgMHgwNSwgMHhBRCwgMHhGRSwgMHgxMCwgMHgwNSwgMHhBRSwgMHhGRSwgMHhBRCwgMHgwNSwgMHhBRiwgMHhGRSwgMHgzQSwgMHgwNSwgMHhCRiwgMHg2MCwKKwkgMHhFNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHhGNCwgMHgwMSwgMHgxMCwgMHg2MCwgMHgzMiwgMHg2NSwgMHgwQiwgMHg2MSwgMHgwNywgMHgwMCwgMHhBMiwgMHhERCwKKwkgMHg1OCwgMHg0RiwgMHg2NCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhCOSwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMywgMHgwMCwgMHg2MywgMHhBNSwgMHhEMSwKKwkgMHg1QSwgMHhEMywgMHhEQSwgMHg4NSwgMHgwMCwgMHhBOCwgMHhDRCwgMHg4MSwgMHhGMiwgMHgwMiwgMHhGOCwgMHgwMiwgMHhFMCwgMHgwMSwgMHgwRiwgMHg2MCwKKwkgMHhDRSwgMHg2MiwgMHgxMCwgMHg2MCwgMHgxMiwgMHg2NSwgMHhFQiwgMHg2MCwgMHg1RiwgMHg2MywgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhENiwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMywgMHg1QSwgMHhEQiwgMHg1QSwgMHhEQiwgMHg1QSwgMHhERCwgMHhGOSwgMHgwMSwgMHgxMCwgMHg2MCwgMHgzMCwgMHg2NSwKKwkgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhENiwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywgMHg1QSwgMHhERCwgMHhGQiwgMHgwMSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEMiwgMHg2NCwgMHg0MCwgMHg0MSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MywgMHhBMywgMHhEMSwgMHgwMCwgMHg2NCwKKwkgMHhEMCwgMHg4MCwgMHgwQiwgMHg2MSwgMHgwOCwgMHgwMywgMHhCRCwgMHhEQiwgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHhCMCwgMHg4NCwgMHhDRCwgMHg4MSwKKwkgMHhBMywgMHhEQiwgMHgwNiwgMHhBMywgMHhGOSwgMHgwMiwgMHgxMCwgMHg2MCwgMHgxQSwgMHg2MywgMHhBMywgMHhEMSwgMHgwMCwgMHg2NCwgMHhEMCwgMHg4MCwKKwkgMHgwQywgMHg2MSwgMHgxOSwgMHgwMywgMHhCRCwgMHhEQiwgMHg2NCwgMHg0NCwgMHhGRSwgMHhBMywgMHgwMiwgMHhBMywgMHhDRCwgMHg4MSwgMHhFOCwgMHg4NCwKKwkgMHhFMywgMHgwMywgMHgwMiwgMHgwNSwgMHhFMSwgMHgwMywgMHhGOSwgMHgwMSwgMHg5OSwgMHhGQiwgMHg5QiwgMHhGRCwgMHg2MSwgMHg1QywgMHhBMywgMHhEMywKKwkgMHg5QSwgMHhGOSwgMHgwMywgMHgxOCwgMHg1OCwgMHg0RiwgMHg2MCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg5QiwgMHhGMywgMHg5QSwgMHhGMSwgMHg2MCwgMHg0MywKKwkgMHg5OSwgMHhGMywgMHg2NCwgMHg0MSwgMHhFQSwgMHgwMSwgMHgyMSwgMHg0MywgMHgxMCwgMHg2MCwgMHgxNCwgMHg2NSwgMHhENywgMHg4MCwgMHhCRCwgMHhEMSwKKwkgMHhCRCwgMHhEMywgMHgwMywgMHgwMiwgMHhCRiwgMHg2MCwgMHhFNywgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwgMHhCRCwgMHhEMSwgMHg0MywgMHg0MSwKKwkgMHhGNSwgMHgwMywgMHhFQiwgMHg2MCwgMHg2NCwgMHg2NCwgMHg2NCwgMHg1OCwgMHg0MCwgMHg0RiwgMHgyQSwgMHhGMCwgMHg4MywgMHg2MCwgMHhGRiwgMHg2NSwKKwkgMHg2NCwgMHg0NywgMHgwMywgMHgyQiwgMHgwMSwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwMywgMHgyNiwgMHgwMywgMHhBQywgMHg2MCwgMHg0NywgMHhBNCwgMHg4NCwKKwkgMHgyQSwgMHhGQSwgMHgyRiwgMHhGMiwgMHgyQywgMHhGQSwgMHgzMCwgMHhGMiwgMHgyRCwgMHhGQSwgMHgzMSwgMHhGMiwgMHgyRSwgMHhGQSwgMHg2NCwgMHg0MSwKKwkgMHhFQiwgMHhGMywgMHgyRiwgMHhGQSwgMHg2MCwgMHg0MywgMHhFQywgMHhGMywgMHgzMCwgMHhGQSwgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHgxOSwgMHgwMCwKKwkgMHg2MCwgMHg0NywgMHhBNCwgMHg4NCwgMHgyQSwgMHhGQSwgMHgyRiwgMHhGMiwgMHgyQywgMHhGQSwgMHgzMCwgMHhGMiwgMHgyRCwgMHhGQSwgMHgzMSwgMHhGMiwKKwkgMHgyRSwgMHhGQSwgMHgzNiwgMHhGMiwgMHgzMiwgMHhGQSwgMHgzNywgMHhGMiwgMHgzMywgMHhGQSwgMHgzOCwgMHhGMiwgMHgzNCwgMHhGQSwgMHhFQiwgMHhGMywKKwkgMHgyRiwgMHhGQSwgMHgzNiwgMHhGQSwgMHhFQywgMHhGMywgMHgzMCwgMHhGQSwgMHgzNywgMHhGQSwgMHhFRCwgMHhGMywgMHgzMSwgMHhGQSwgMHgzOCwgMHhGQSwKKwkgMHg2NCwgMHg0MSwgMHgxQywgMHhGMiwgMHgxMywgMHhGQSwgMHgwMCwgMHhGNCwgMHgwRCwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyQiwKKwkgMHgxOCwgMHgwMCwgMHg4MSwgMHg2NywgMHhBMiwgMHhEQSwgMHhFQywgMHg2MCwgMHg1OCwgMHg0RSwgMHg1QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwKKwkgMHgzRiwgMHhGQywgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMCwgMHg0MiwgMHg2NCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwNCwgMHgzRiwgMHhGQSwKKwkgMHgwNywgMHhGMiwgMHhBOSwgMHhGMSwgMHgwMSwgMHgxQiwgMHgwNywgMHhGOCwgMHgxQywgMHhGMiwgMHgxMywgMHhGQSwgMHgyNiwgMHhGMiwgMHgyNywgMHhGMCwKKwkgMHg2MCwgMHg0NywgMHgwMCwgMHhGNCwgMHgxRiwgMHhGQSwgMHg2NCwgMHg0NywgMHgyMCwgMHhGQSwgMHg2MSwgMHg0NCwgMHgyMSwgMHhGQSwgMHgwMSwgMHg2NywKKwkgMHgwRCwgMHhGQSwgMHgxMCwgMHg2MSwgMHgyOCwgMHg2MCwgMHgwNiwgMHg2NCwgMHgxRSwgMHg2MywgMHg1OCwgMHhEMSwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEOCwKKwkgMHhGQywgMHgwMiwgMHhCQiwgMHhGMSwgMHhEOCwgMHhGMSwgMHg2NCwgMHg1RSwgMHg2NCwgMHg1RiwgMHg0NCwgMHg2MywgMHhCRCwgMHhEQSwgMHgyOCwgMHg2MCwKKwkgMHgwMCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHg0QSwgMHhEMywgMHg2MCwgMHg0NSwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwMywgMHg2NCwgMHgwMiwgMHgzNiwgMHgwMSwgMHg2NCwgMHhCNCwgMHg4NCwgMHgwNiwgMHhBMiwgMHhBMiwgMHhEMSwKKwkgMHhCRCwgMHhEQSwgMHg2NCwgMHg0NywgMHhCRCwgMHhEQSwgMHhENSwgMHhGMywgMHhENiwgMHhGMSwgMHg2MCwgMHg0NywgMHhCRCwgMHhEQSwgMHg2NCwgMHg0NywKKwkgMHhFMywgMHhGMSwgMHhCRCwgMHhEQSwgMHg2NCwgMHg0NCwgMHhCRCwgMHhEQSwgMHgyNiwgMHg0NiwgMHgwMCwgMHg2NCwgMHgyMywgMHhGMCwgMHgzQiwgMHhGMCwKKwkgMHg2NCwgMHg0MCwgMHgxMCwgMHgyQSwgMHgwNiwgMHgwMCwgMHhDMCwgMHg2NywgMHhBMCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwKKwkgMHgxMCwgMHhCQywgMHgzRSwgMHhGQSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgzNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDOCwgMHhGRSwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhCNCwgMHhGMywgMHgxRiwgMHhGQSwgMHgzMiwgMHg0NywgMHgwNywgMHhGQSwgMHgyNCwgMHg3RSwgMHgwMiwgMHg3RiwKKwkgMHgwOCwgMHhGQSwgMHhEOCwgMHhGMSwgMHgwOSwgMHhGOCwgMHgwMSwgMHg2MCwgMHgwMSwgMHg2NCwgMHgwQSwgMHhGQSwgMHgwMSwgMHg2NCwgMHgwQiwgMHhGQSwKKwkgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgxOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwQSwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHg1MiwgMHg2MywgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgyQSwgMHg2MSwgMHhBRSwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg1RSwgMHhGQiwgMHgwNCwgMHg2NCwgMHgwMywgMHhGQSwgMHg2NywgMHg0NCwKKwkgMHgyQywgMHhGQSwgMHgyRCwgMHhGQSwgMHgyRSwgMHhGQSwgMHgzMiwgMHhGQSwgMHgzMywgMHhGQSwgMHgzNCwgMHhGQSwgMHgxMiwgMHg2MCwgMHg4MCwgMHg2NCwKKwkgMHhBOSwgMHhGMSwgMHgwRSwgMHhGQSwgMHgwNywgMHhGOCwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgxQSwgMHg2MCwgMHg0RSwgMHg2MywgMHhBMywgMHhEQiwKKwkgMHgwNiwgMHhBMywgMHgxMCwgMHg2MCwgMHgzOCwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwNCwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwNiwgMHg2NCwgMHhBMywgMHhEQiwKKwkgMHgxMCwgMHg2MCwgMHgzNiwgMHg2MiwgMHhFRiwgMHg2MCwgMHhBOSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxQSwgMHg2MCwgMHg1QSwgMHg2MywgMHgwMCwgMHg2NCwKKwkgMHhBMywgMHhEQiwgMHgwNiwgMHhBMywgMHgxMCwgMHg2MCwgMHgzQywgMHg2NCwgMHhCRCwgMHhEQiwgMHgwOCwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwNiwgMHg2NCwKKwkgMHhBMywgMHhEQiwgMHgxMCwgMHg2MCwgMHgzQSwgMHg2MiwgMHhFRiwgMHg2MCwgMHhCMywgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHgyMiwgMHg2MiwKKwkgMHhFRiwgMHg2MCwgMHg5MywgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2NCwgMHgzMSwgMHg2MCwgMHgyQSwgMHg2MiwgMHhBMiwgMHhEQiwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHg1RSwgMHhGNSwgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwKKwkgMHhDQywgMHhGMSwgMHgxOSwgMHhGOCwgMHgzMCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwMCwgMHg2MywgMHg4QSwgMHhGRCwgMHgxQywgMHg2MCwgMHg5NiwgMHg2NSwgMHhBNSwgMHhERCwgMHgxOSwgMHg2MCwgMHg4NiwgMHg2MywKKwkgMHg4OCwgMHhGRCwgMHg4OSwgMHhGRCwgMHgyMCwgMHg0MCwgMHgxMCwgMHgyQiwgMHgwNSwgMHgwMCwgMHgxRiwgMHg2MCwgMHg4MiwgMHg2MSwgMHhBMSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHg1OSwgMHgxOCwgMHg1RSwgMHhGNSwgMHg0MCwgMHg2NCwgMHgyQSwgMHhGQSwgMHg1NCwgMHhGMywgMHgwMCwgMHhGNCwgMHg2MCwgMHg0MywKKwkgMHhCRCwgMHhEMSwgMHgwNCwgMHg2NSwgMHg2NCwgMHg0NywgMHhBNSwgMHhEQSwgMHg2NCwgMHg0MSwgMHhERCwgMHg4MSwgMHhFOSwgMHg4MSwgMHg2MiwgMHg0NCwKKwkgMHgwNCwgMHgwMywgMHhCRCwgMHhEMSwgMHhDRCwgMHg4MSwgMHg1OCwgMHhEOCwgMHhGQywgMHgwMiwgMHg1OCwgMHg4QiwgMHgyRCwgMHg2MCwgMHgyOCwgMHg2MywKKwkgMHhBMywgMHhEMSwgMHgyQiwgMHg0NCwgMHhDOCwgMHg4NCwgMHg2NCwgMHg0MSwgMHhGRiwgMHhCMSwgMHg2MSwgMHg0NSwgMHgwMywgMHhBMSwgMHhFOSwgMHg4MSwKKwkgMHg0MSwgMHg0QywgMHhCRCwgMHhEMSwgMHhDRCwgMHg4MSwgMHg1OCwgMHhEOCwgMHhGQywgMHgwMiwgMHgyQiwgMHhEMiwgMHgyQiwgMHg0MywgMHg2MCwgMHg0NywKKwkgMHgwMSwgMHg3RSwgMHg1NCwgMHhGMSwgMHhBMywgMHhEQSwgMHhBNCwgMHhEMywgMHhDQiwgMHg4MywgMHg0NCwgMHg4QiwgMHhGOCwgMHg4NCwgMHgyQywgMHg0MSwKKwkgMHgwQywgMHgwNCwgMHhCRSwgMHhEMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHhCRSwgMHhEQSwgMHgwMCwgMHg3RSwgMHhBMywgMHhEMiwgMHg2MCwgMHg0NSwKKwkgMHgwMCwgMHg3RiwgMHhCNCwgMHg4NCwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQSwgMHhGNCwgMHgwMiwgMHg1RSwgMHhGNSwgMHgyQiwgMHg0NCwgMHgwNCwgMHhBNCwKKwkgMHgzRiwgMHhGQSwgMHg3RiwgMHhGMywgMHg3RSwgMHhGQiwgMHgxRiwgMHg2MCwgMHg4NCwgMHg2MSwgMHgwMSwgMHg2NCwgMHg1NCwgMHhGMSwgMHhBMSwgMHhEQiwKKwkgMHg3RiwgMHhGQiwgMHhBNCwgMHhEMywgMHgwNCwgMHg2NSwgMHg1MywgMHhGMywgMHgwMSwgMHgxOCwgMHgwQywgMHg2NSwgMHhGMywgMHhCNCwgMHhCNCwgMHg4NCwKKwkgMHg1MywgMHhGQiwgMHgwMiwgMHhCMCwgMHhGRiwgMHhGRiwgMHgxNiwgMHgwMywgMHg3RiwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwRiwgMHhCNCwKKwkgMHg3RiwgMHhGQiwgMHgwMSwgMHgwMywgMHgwRiwgMHgwMCwgMHhFRSwgMHg2MCwgMHg0RiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1MywgMHhGMSwgMHg3RiwgMHhGMywKKwkgMHg2NCwgMHg0MCwgMHgwMiwgMHgyNiwgMHhGOCwgMHgwMSwgMHhGMywgMHhBMCwgMHgwNCwgMHhBNCwgMHgwMSwgMHgwNCwgMHhGMSwgMHhBNCwgMHgxMCwgMHgzNiwKKwkgMHhGMiwgMHgwMSwgMHg3RiwgMHhGQiwgMHgyMCwgMHg0MCwgMHgxMCwgMHgyQiwgMHgxMiwgMHgwMCwgMHg3RiwgMHhGMywgMHgxRiwgMHg2MCwgMHg4MiwgMHg2MSwKKwkgMHhBMSwgMHhEMSwgMHhDQywgMHg4NCwgMHgwMSwgMHg2MSwgMHgwOCwgMHgyNCwgMHgwMywgMHgwMCwgMHhFMSwgMHg4MSwgMHhDQywgMHg4NCwgMHhGQiwgMHgwMSwKKwkgMHhBMSwgMHg4NCwgMHg1MywgMHhGMSwgMHhFNCwgMHgwMywgMHgxRiwgMHg2MCwgMHg4NCwgMHg2MSwgMHhBMSwgMHhEQiwgMHgxOSwgMHgwMCwgMHg1MywgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgxMCwgMHhCMCwgMHgxMiwgMHg2MCwgMHgyNiwgMHg2MywgMHgwMiwgMHgwMywgMHgxMCwgMHg2MCwgMHg1QywgMHg2MywgMHgzMSwgMHg2MCwKKwkgMHgyQSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwQywgMHgxQiwgMHg3RiwgMHhGMywgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NSwgMHg0NywgMHhEMywKKwkgMHg1MywgMHhGMSwgMHgwMSwgMHhCMCwgMHgwNiwgMHhCMCwgMHhDQiwgMHgwMywgMHg2NCwgMHg0MCwgMHgwMywgMHgyNiwgMHgwMSwgMHgwMCwgMHhDNywgMHgwMywKKwkgMHg3RiwgMHhGMywgMHgwMSwgMHg2MSwgMHhDQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywgMHhFMSwgMHg4MSwgMHhGQiwgMHgwMSwgMHhCQSwgMHhGMywKKwkgMHg2MSwgMHg0NSwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhCQiwgMHgwMywgMHgzMSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHhFNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhFNiwgMHg2MiwgMHg0MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFRCwgMHg2MCwgMHg3MCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHg3RiwgMHhGMSwgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgxRSwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhFNiwgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFRCwgMHg2MCwgMHhBMywgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHg1RSwgMHhGNSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwMCwgMHg2NCwgMHg1MSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFNiwgMHg2MiwKKwkgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFRCwgMHg2MCwgMHhDRCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHhDMSwgMHhGRSwKKwkgMHgzMywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgzNCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDNiwgMHhGMSwgMHgxQSwgMHg2MCwgMHg1MiwgMHg2MiwgMHhBMiwgMHhEOSwKKwkgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg0RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHhDNywgMHhGMSwgMHgxQSwgMHg2MCwgMHg1RSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgyNCwgMHg2MCwgMHhBOCwgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhGRCwgMHgxQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg1QSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFNiwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhFRCwgMHg2MCwgMHhGRSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg1MSwgMHhGMSwgMHgwRiwgMHg2MCwKKwkgMHhFNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NCwgMHg0MCwgMHhGRiwgMHgyNiwgMHgwMywgMHgwMCwgMHhFRCwgMHg2MCwgMHgzNiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMiwgMHgwQSwgMHgwMCwgMHg2NCwgMHg1MSwgMHhGQiwgMHhDOCwgMHhGMSwgMHgxQSwgMHg2MCwgMHg1RSwgMHg2MiwgMHhBMiwgMHhEOSwKKwkgMHgwRiwgMHg2MCwgMHhFNiwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwQywgMHg2NCwgMHhBMiwgMHhEQiwgMHhFRSwgMHg2MCwgMHgyNCwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg1QSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwKKwkgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwQywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwKKwkgMHgxQSwgMHg2MCwgMHg1QSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgxNCwgMHgwMCwKKwkgMHhGRiwgMHg2MCwgMHhGNywgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1MSwgMHhGMywgMHhEQiwgMHgwQSwgMHgwMCwgMHhBMCwgMHgwMCwgMHg2NCwKKwkgMHgwMiwgMHgwMywgMHg1MSwgMHhGQiwgMHhENiwgMHgwMSwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg0RSwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHhFRCwgMHg2MCwgMHgzNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzNSwgMHg2NCwKKwkgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg0RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHg1MywgMHhGMywgMHhGRiwgMHhGRiwgMHhFMywgMHhCNCwgMHg1MywgMHhGQiwgMHgxRiwgMHg2MCwKKwkgMHg4MCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2NCwgMHgzMSwgMHg2MCwgMHgyQSwgMHg2MiwKKwkgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwRSwgMHgwNCwgMHgzMiwgMHg2NCwKKwkgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFNiwgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFRSwgMHg2MCwKKwkgMHg2OSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg3RSwgMHhGMSwgMHg3RiwgMHhGOSwgMHgyNCwgMHg2MCwKKwkgMHg5QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgxRSwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFNiwgMHg2MiwKKwkgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFRSwgMHg2MCwgMHg5MSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxQSwgMHg2MCwgMHgwNiwgMHg2MywgMHgxQywgMHg2MSwgMHgwMCwgMHg2NCwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwKKwkgMHhGRCwgMHgwMiwgMHgxMiwgMHg2MCwgMHg0NiwgMHg2MSwgMHg4QSwgMHhGMywgMHg2MSwgMHg0MywgMHhDNiwgMHhBNSwgMHg0NywgMHhEMSwgMHgwRiwgMHgwNCwKKwkgMHhCRSwgMHhENSwgMHgxQSwgMHg2MCwgMHgwMiwgMHg2MywgMHhDMywgMHg4MywgMHhDMywgMHg4MywgMHhDMywgMHg4MywgMHg0MywgMHhEMywgMHhCRSwgMHhEMSwKKwkgMHhEQywgMHg4NCwgMHhBMywgMHhEQiwgMHg2NiwgMHg0NCwgMHhDMCwgMHg4NCwgMHhCRSwgMHhEQiwgMHg2NSwgMHg0NCwgMHhFRCwgMHgwMSwgMHgxQSwgMHg2MCwKKwkgMHgwNiwgMHg2MywgMHgwRSwgMHg2MSwgMHg0MSwgMHg0QiwgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwgMHgwMCwgMHhCRCwgMHg2NCwgMHg0MSwgMHgxOSwgMHgwMywKKwkgMHgwMSwgMHhBOCwgMHg2MSwgMHg0NCwgMHgwMiwgMHhBOCwgMHgxNSwgMHgwMywgMHgwMiwgMHgwMiwgMHhFOSwgMHg4NCwgMHgxMiwgMHgwMCwgMHg2NSwgMHg0NywKKwkgMHg2MCwgMHg0NSwgMHg2MSwgMHg0NCwgMHgwOSwgMHg2MSwgMHhDRCwgMHg4MSwgMHhFMCwgMHg4NCwgMHhGRiwgMHgyMywgMHhGQywgMHgwMSwgMHgwMiwgMHgyNCwKKwkgMHhDNCwgMHg4NCwgMHgwMiwgMHgyOCwgMHhENCwgMHg4NCwgMHhDRCwgMHg4MSwgMHgwMSwgMHgwRSwgMHgwMSwgMHhCQywgMHgwMiwgMHgwMywgMHhFMCwgMHg4NCwKKwkgMHhGNiwgMHgwMSwgMHgwMCwgMHg3RiwgMHgyQiwgMHg0MSwgMHg0RCwgMHg4QiwgMHhCRiwgMHhEQiwgMHhERCwgMHgwMiwgMHgxMiwgMHg2MCwgMHg0NiwgMHg2MSwKKwkgMHg4QSwgMHhGMywgMHg2MSwgMHg0MywgMHhDNiwgMHhBNSwgMHg0NywgMHhEMSwgMHgwQSwgMHgwNCwgMHhEQSwgMHg4NiwgMHgxQSwgMHg2MCwgMHgwNCwgMHg2MywKKwkgMHhDMywgMHg4MywgMHhDMywgMHg4MywgMHhDMywgMHg4MywgMHg0MywgMHhEMSwgMHhBNiwgMHhEOSwgMHg2NSwgMHg0NCwgMHhGMiwgMHgwMSwgMHgzNiwgMHg2NCwKKwkgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHg1MywgMHhGMywgMHg4QSwgMHhGMSwgMHhGMywgMHhCNCwgMHg1MywgMHhGQiwgMHgxMiwgMHg2MCwgMHg0NiwgMHg2MywKKwkgMHhDMywgMHg4NSwgMHg0NSwgMHg0QSwgMHgxOSwgMHg2MCwgMHg4NiwgMHg2NSwgMHg4OSwgMHhGMywgMHg0NSwgMHg0QywgMHg0MCwgMHg0OCwgMHgyMCwgMHg0MCwKKwkgMHgyMCwgMHgyQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NSwgMHg0NSwgMHg0QiwgMHgyQSwgMHg0NSwgMHhENywgMHg4MCwgMHgwMiwgMHg2NSwgMHgyMywgMHgwNSwKKwkgMHg0NywgMHhEMSwgMHgwMiwgMHg2NSwgMHg0NywgMHhEMywgMHgwQSwgMHg2NSwgMHhEMCwgMHg4MSwgMHg0NywgMHhEMywgMHgwMSwgMHgwNSwgMHgwMCwgMHg2MSwKKwkgMHhGMiwgMHhBMywgMHgwMSwgMHhCMCwgMHg2MSwgMHg0NCwgMHgxMSwgMHgwMywgMHgyMCwgMHg0MCwgMHgyMCwgMHgyQSwgMHgwOCwgMHgwMCwgMHhGMywgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHgzRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQiwgMHg0NCwgMHgwMiwgMHhBNCwgMHg0MCwgMHg0QiwgMHg2MSwgMHg0NCwgMHgyQywgMHg0MiwKKwkgMHhBMiwgMHhEQiwgMHg1QSwgMHhERCwgMHg1QSwgMHg4QywgMHgzQSwgMHhBMywgMHhERiwgMHgwMSwgMHgyOCwgMHg0MiwgMHg0QSwgMHhERCwgMHg0QSwgMHhEQiwKKwkgMHg0MiwgMHg0OCwgMHgzQSwgMHhBMywgMHhEOSwgMHgwMSwgMHgyOCwgMHg0NCwgMHg4OCwgMHhGQiwgMHg4OCwgMHhGMSwgMHgxOSwgMHg2MCwgMHg4NiwgMHg2MywKKwkgMHg0NCwgMHg0OCwgMHgyOCwgMHg0NSwgMHhENywgMHg4MCwgMHhBMywgMHhEMSwgMHgxNSwgMHgwNSwgMHgwNCwgMHg2NSwgMHg0NiwgMHhEMywgMHgyOCwgMHg0NSwKKwkgMHhENiwgMHg4MCwgMHhEMCwgMHg4MCwgMHgwMiwgMHgwNCwgMHgwNCwgMHhBMywgMHhGNSwgMHgwMSwgMHhGNywgMHgwNiwgMHg2MiwgMHg0NiwgMHhBMiwgMHhEOSwKKwkgMHhBMywgMHhEQiwgMHg1QiwgMHhEMywgMHg2NiwgMHg0MiwgMHg1QSwgMHhEMSwgMHhBMiwgMHhEQiwgMHhBMywgMHhEOSwgMHhGRSwgMHhBMywgMHhBMywgMHhEMSwKKwkgMHg2NiwgMHg0MiwgMHhFQiwgMHgwMSwgMHg4OCwgMHhGMywgMHg4OSwgMHhGMSwgMHg2MCwgMHg0MywgMHg0NCwgMHg0OCwgMHgyOCwgMHg0NSwgMHhENywgMHg4MCwKKwkgMHhBMywgMHhEMSwgMHgxNSwgMHgwNSwgMHgwNCwgMHg2NSwgMHg0NiwgMHhEMywgMHgyOCwgMHg0NSwgMHhENiwgMHg4MCwgMHhEMCwgMHg4MCwgMHgwMiwgMHgwNCwKKwkgMHgwNCwgMHhBMywgMHhGNSwgMHgwMSwgMHhGNywgMHgwNiwgMHg2MiwgMHg0NiwgMHhBMiwgMHhEOSwgMHhBMywgMHhEQiwgMHg1QiwgMHhEMywgMHg2NiwgMHg0MiwKKwkgMHg1QSwgMHhEMSwgMHhBMiwgMHhEQiwgMHhBMywgMHhEOSwgMHhGRSwgMHhBMywgMHhBMywgMHhEMSwgMHg2NiwgMHg0MiwgMHhFQiwgMHgwMSwgMHgwRiwgMHg2MCwKKwkgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyMCwgMHg0MCwKKwkgMHg4MCwgMHgyQiwgMHgxNywgMHgwMCwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2MSwgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHg2NCwgMHgyMywgMHhGQSwgMHhGMSwgMHg2MCwgMHgwMiwgMHg2NCwgMHgyNCwgMHhGQSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwKKwkgMHg2NCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHhGQSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwgMHgzRSwgMHg2NCwgMHgzQiwgMHg0MiwKKwkgMHg1QSwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwKKwkgMHgxQSwgMHg2MCwgMHg0RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwMCwgMHg2NCwKKwkgMHg1MywgMHhGQiwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwgMHhCRSwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg3OSwgMHhGQiwgMHhBQywgMHg4NSwgMHg2MCwgMHg0MSwKKwkgMHgyMCwgMHgwMywgMHgwMSwgMHg2MCwgMHgwMCwgMHg2MywgMHgwOCwgMHg2NCwgMHhFOSwgMHg4MSwgMHhDQywgMHg4NCwgMHgwMiwgMHgyNCwgMHhERiwgMHg4MywKKwkgMHhGQiwgMHgwMiwgMHgyRCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMCwgMHhERCwgMHg2NSwgMHg0MSwgMHgyRCwgMHg2MCwgMHgyQSwgMHg2MywgMHgwRiwgMHg2MCwKKwkgMHhDMCwgMHg2NCwgMHhFOSwgMHg4MSwgMHg1OCwgMHhEMSwgMHhGRCwgMHgwNCwgMHhBMywgMHhEOSwgMHgwQiwgMHgwMywgMHg1OCwgMHhEMSwgMHhFOSwgMHg4MSwKKwkgMHg2MCwgMHg0NSwgMHhGQywgMHgwNCwgMHhBMywgMHhEMSwgMHg2NCwgMHg0NywgMHhCMCwgMHg4NCwgMHhCRCwgMHhEQiwgMHgwMCwgMHhCOSwgMHg2NSwgMHg0NCwKKwkgMHhGMCwgMHgwMiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgzQywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgyMCwgMHg0MCwgMHg5MCwgMHgyQiwKKwkgMHgwMywgMHgwMCwgMHhGMiwgMHg2MCwgMHhFNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1MywgMHhGMywgMHg4QSwgMHhGMSwgMHgwNCwgMHhCMCwgMHgwNywgMHg2MCwKKwkgMHg0MCwgMHg2NCwgMHhEMCwgMHg4MCwgMHgyMSwgMHgwMywgMHgyMCwgMHgwNiwgMHgyNiwgMHg0NiwgMHg4QSwgMHhGMSwgMHgxMiwgMHg2MCwgMHg0NiwgMHg2MywKKwkgMHhDMywgMHg4MywgMHg3RiwgMHhGMywgMHgyNiwgMHhGMCwgMHhCRCwgMHhEQiwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhCRCwgMHhEQiwgMHg2NCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhCRCwgMHhEQiwgMHgzMiwgMHhGMCwgMHhCRCwgMHhEOSwgMHgzMywgMHhGMCwgMHhCRCwgMHhEOSwgMHgzNCwgMHhGMCwgMHhCRCwgMHhEOSwKKwkgMHgwMCwgMHhGNCwgMHgwRCwgMHhGMCwgMHhCRCwgMHhEOSwgMHgwRSwgMHhGMCwgMHhCRCwgMHhEOSwgMHgwMCwgMHg2NCwgMHgwRiwgMHhGMCwgMHhBMywgMHhEQiwKKwkgMHg2NCwgMHg0NywgMHg2MCwgMHg0NSwgMHgwMCwgMHgzNywgMHgwMywgMHgwMCwgMHhGMiwgMHg2MCwgMHhERiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCRCwgMHhEQiwKKwkgMHhFMCwgMHhBMCwgMHgxRiwgMHg2MSwgMHgwMCwgMHhCOCwgMHhGOCwgMHgwNywgMHhGNywgMHgwMywgMHg2MCwgMHhGRSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwKKwkgMHhDQywgMHg4NCwgMHhCRCwgMHhEOSwgMHhGQiwgMHgwMiwgMHg2NSwgMHg0MCwgMHgwMSwgMHgyNiwgMHhERiwgMHg4MywgMHgyMCwgMHhGRSwgMHgyRCwgMHg2MCwKKwkgMHhFNCwgMHg2MiwgMHhBMiwgMHhERCwgMHg2MCwgMHhGRSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzQSwKKwkgMHgwNCwgMHgwMCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwgMHhGRiwgMHhGRiwgMHhDMSwgMHg4MSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHg0MCwgMHgwMywgMHgzNiwgMHgwMywgMHgwMCwgMHhGMiwgMHg2MCwgMHhERiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEOSwgMHg4MSwgMHhBMSwgMHhEMCwKKwkgMHg3RiwgMHhGMywgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHgyMCwgMHhGRSwgMHgwOCwgMHgyNCwgMHgwMywgMHgwMCwgMHhGMiwgMHg2MCwgMHhERiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMiwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0MywgMHhGNCwgMHhBMywgMHgwMCwgMHg2MCwgMHgxRCwgMHg2MSwKKwkgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NSwgMHg2MCwgMHhGRSwgMHg4MSwgMHhBMSwgMHg3RiwgMHhBMSwgMHgwMiwgMHgwNiwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwKKwkgMHhERCwgMHg4MSwgMHhBMSwgMHhEMiwgMHhDRiwgMHg4MywgMHhENCwgMHg4MCwgMHgyRCwgMHgwMywgMHgxNywgMHgwMywgMHhDRiwgMHg4MywgMHg2MSwgMHg0NCwKKwkgMHg4MCwgMHhBMCwgMHgyOCwgMHgwMywgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMiwgMHhDRiwgMHg4MywKKwkgMHg4MSwgMHhBMSwgMHgyMCwgMHgwMywgMHgwNSwgMHgwNywgMHg3RiwgMHhBMSwgMHhDQywgMHg4NCwgMHhERCwgMHg4MSwgMHhFNCwgMHgwMywgMHhGNywgMHgwMSwKKwkgMHgwMCwgMHhGNCwgMHgwMCwgMHhCOCwgMHgwNCwgMHg2MSwgMHhFNCwgMHgwMywgMHhGMiwgMHgwMSwgMHgwMSwgMHg2MCwgMHhGRiwgMHg2MywgMHg0NiwgMHg0OCwKKwkgMHg0MSwgMHg0QSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwgMHhERiwgMHg4MywgMHhBMywgMHhEOSwgMHg2NCwgMHg0NCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwKKwkgMHhERiwgMHg4MywgMHhBMywgMHhEOSwgMHhDQywgMHg4NCwgMHg4MSwgMHhBMSwgMHgwNSwgMHgwMywgMHg3RiwgMHhBMSwgMHhGNywgMHgwNCwgMHgwMCwgMHhGNCwKKwkgMHgwMywgMHg2MSwgMHhGNCwgMHgwMSwgMHgyMCwgMHhGRSwgMHgwMCwgMHhCQiwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MSwgMHg0NSwgMHgwMywgMHg2MCwgMHhGRSwKKwkgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzQSwgMHgzRSwgMHgwMCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwKKwkgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHg2MCwgMHgzQSwgMHgzOCwgMHgwMCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwKKwkgMHgxRCwgMHgzQSwgMHgzMiwgMHgwMCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHhGRiwgMHhCNCwgMHgxQywgMHg2MCwKKwkgMHg5NiwgMHg2NSwgMHhBNSwgMHhEMywgMHg2MCwgMHg1QywgMHgwMiwgMHhBNCwgMHhBNSwgMHhEQiwgMHhGRSwgMHhBNSwgMHgxQSwgMHg2MCwgMHhDNiwgMHg2NCwKKwkgMHg0NCwgMHhEOSwgMHgwMCwgMHg3QywgMHg2MCwgMHhGRSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHgxQiwgMHg2MCwKKwkgMHgwNiwgMHg2NCwgMHhDNCwgMHg4MiwgMHg2NCwgMHg0NCwgMHhGRiwgMHhCNCwgMHhBMiwgMHhEQiwgMHgxMiwgMHg2MCwgMHg0OCwgMHg2NSwgMHg4QSwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhDNCwgMHg4MiwgMHg2NCwgMHg0NCwgMHhBMiwgMHhEMywgMHhGRiwgMHhCNSwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNSwKKwkgMHg2NSwgMHg0NCwgMHhBMiwgMHhEQiwgMHgwOSwgMHgwMCwgMHgyMCwgMHhGRSwgMHgyOCwgMHg0NiwgMHgyQSwgMHg0MSwgMHhGRiwgMHhCMSwgMHg2MCwgMHhGRSwKKwkgMHg4MiwgMHg2NCwgMHhBMSwgMHhEQSwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMiwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0MywKKwkgMHhGNCwgMHhBMywgMHgwMCwgMHg2MCwgMHgxRCwgMHg2MSwgMHgwMCwgMHg2MCwgMHhERCwgMHg2NSwgMHg2MCwgMHhGRSwgMHg4MSwgMHhBMSwgMHg3RiwgMHhBMSwKKwkgMHgwMiwgMHgwNiwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMiwgMHhDRiwgMHg4MywgMHhENCwgMHg4MCwgMHgyRCwgMHgwMywKKwkgMHgxNywgMHgwMywgMHhDRiwgMHg4MywgMHg2MSwgMHg0NCwgMHg4MCwgMHhBMCwgMHgyOCwgMHgwMywgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwKKwkgMHhERCwgMHg4MSwgMHhBMSwgMHhEMiwgMHhDRiwgMHg4MywgMHg4MSwgMHhBMSwgMHgyMCwgMHgwMywgMHgwNSwgMHgwNywgMHg3RiwgMHhBMSwgMHhDQywgMHg4NCwKKwkgMHhERCwgMHg4MSwgMHhFNCwgMHgwMywgMHhGNywgMHgwMSwgMHgwMCwgMHhGNCwgMHgwMCwgMHhCOCwgMHgwNCwgMHg2MSwgMHhFNCwgMHgwMywgMHhGMiwgMHgwMSwKKwkgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHg0NiwgMHg0OCwgMHg0MSwgMHg0QSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwgMHhERiwgMHg4MywgMHhBMywgMHhEOSwKKwkgMHg2NCwgMHg0NCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwgMHhERiwgMHg4MywgMHhBMywgMHhEOSwgMHhDQywgMHg4NCwgMHg4MSwgMHhBMSwgMHgwNSwgMHgwMywKKwkgMHg3RiwgMHhBMSwgMHhGNywgMHgwNCwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwgMHhGNCwgMHgwMSwgMHgyMCwgMHhGRSwgMHgwMCwgMHhCQiwgMHgwMiwgMHg2MCwKKwkgMHgwMCwgMHg2MSwgMHgwOCwgMHgyNCwgMHhBNiwgMHgwMCwgMHgyRCwgMHg2MCwgMHhENiwgMHg2MiwgMHhBMiwgMHhERiwgMHgyRCwgMHg2MCwgMHhEOCwgMHg2MiwKKwkgMHhBMiwgMHhERiwgMHgyRCwgMHg2MCwgMHhEQSwgMHg2MiwgMHhBMiwgMHhERiwgMHgyRCwgMHg2MCwgMHhEQywgMHg2MiwgMHhBMiwgMHhERiwgMHg2MCwgMHhGRSwKKwkgMHhERCwgMHg2NCwgMHhBMSwgMHhEQiwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHhGQSwgMHhBNCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgzNCwKKwkgMHg5QSwgMHgwMSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzQSwgMHg5NCwgMHgwMSwgMHhERCwgMHg4MSwKKwkgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHg1MCwgMHgzQSwgMHg4RSwgMHgwMSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHg0MCwgMHhGMiwgMHgzQSwgMHg4OCwgMHgwMSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzQSwKKwkgMHhEQywgMHgwMCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzQSwgMHhENiwgMHgwMCwgMHhERCwgMHg4MSwKKwkgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzQSwgMHhEMCwgMHgwMCwgMHg2MCwgMHg1QywgMHgwMCwgMHgzNiwgMHgzOSwgMHgwMCwKKwkgMHgwMCwgMHg2NCwgMHhGMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg1NywgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NSwgMHg0MCwgMHgwOCwgMHgyNiwgMHhGNywgMHgwMSwKKwkgMHgyRCwgMHg2MCwgMHhENiwgMHg2MiwgMHhBMiwgMHhEQiwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwgMHgzMSwgMHgwMCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMywKKwkgMHhERCwgMHg4MSwgMHhGMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg1NywgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NSwgMHg0MCwgMHgwOCwgMHgyNiwgMHhGNSwgMHgwMSwKKwkgMHgyRCwgMHg2MCwgMHhEOCwgMHg2MiwgMHhBMiwgMHhEQiwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwgMHgyNywgMHgwMCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMywKKwkgMHhERCwgMHg4MSwgMHhGMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg1NywgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NSwgMHg0MCwgMHgwOCwgMHgyNiwgMHhGNSwgMHgwMSwKKwkgMHgyRCwgMHg2MCwgMHhEQSwgMHg2MiwgMHhBMiwgMHhEQiwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwgMHgxRCwgMHgwMCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwKKwkgMHgyRCwgMHg2MCwgMHhEQywgMHg2MiwgMHhBMiwgMHhEOSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHgyRCwgMHg2MCwgMHhERCwgMHg2MiwgMHhBMiwgMHhEOSwKKwkgMHgxOCwgMHgwMCwgMHgyMCwgMHhGRSwgMHgyRCwgMHg2MCwgMHhENiwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHhGRSwKKwkgMHgyRCwgMHg2MCwgMHhEOCwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHhGRSwgMHgyRCwgMHg2MCwgMHhEQSwgMHg2MiwKKwkgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHhGRSwgMHgyRCwgMHg2MCwgMHhEQywgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgyMCwgMHhGRSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyRCwgMHg2MCwgMHg5RSwgMHg2MywgMHhENSwgMHg4NCwgMHhEQywgMHg4NCwKKwkgMHhCRCwgMHhEQiwgMHg2MCwgMHg0MSwgMHg2NiwgMHg0NCwgMHg2MywgMHg0NiwgMHhDRCwgMHg4MywgMHhDNywgMHg4MSwgMHg2MCwgMHg0NSwgMHg2MCwgMHhGRSwKKwkgMHg1RCwgMHg5MywgMHhBMywgMHhEMywgMHg1RCwgMHg5MywgMHhBNiwgMHhEQiwgMHhERSwgMHg4NiwgMHhGQSwgMHgxRiwgMHg2NiwgMHg0MywgMHg2NSwgMHg0NiwKKwkgMHgyMCwgMHhGRSwgMHgyMCwgMHhGRSwgMHgyRCwgMHg2MCwgMHhFNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MywgMHgwMCwgMHg2NCwKKwkgMHgyRCwgMHg2MCwgMHhDRSwgMHg2MSwgMHhBMSwgMHhEQiwgMHgyRCwgMHg2MCwgMHhDMiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgyRCwgMHg2MCwgMHhENiwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgxMCwgMHgyNiwgMHgwNywgMHgwMCwgMHgwNCwgMHgyNiwgMHgwNywgMHgwMCwKKwkgMHgyMCwgMHgyNiwgMHgwNywgMHgwMCwgMHgwMiwgMHgyNiwgMHgwNywgMHgwMCwgMHg0OCwgMHgwMCwgMHgxMCwgMHg3QywgMHgwNSwgMHgwMCwgMHgwNCwgMHg3QywKKwkgMHgwMywgMHgwMCwgMHgyMCwgMHg3QywgMHgwMSwgMHgwMCwgMHgwMiwgMHg3QywgMHgyRCwgMHg2MCwgMHhDRSwgMHg2MSwgMHhBMSwgMHhEOSwgMHg1MCwgMHg5NCwKKwkgMHgyRCwgMHg2MCwgMHhEMCwgMHg2MSwgMHhBMSwgMHhEQiwgMHgyRCwgMHg2MCwgMHhDNCwgMHg2MSwgMHhBMSwgMHhEMSwgMHgyRCwgMHg2MCwgMHhEOCwgMHg2MSwKKwkgMHhBMSwgMHhEMywgMHgyRCwgMHg2MCwgMHhDRSwgMHg2MSwgMHhBMCwgMHg4NCwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHgxMCwgMHgyNiwgMHgwNSwgMHgwMCwKKwkgMHgwNCwgMHgyNiwgMHgwNSwgMHgwMCwgMHgwMSwgMHgyNiwgMHgwOCwgMHgwMCwgMHgyOCwgMHgwMCwgMHgxMCwgMHg3QywgMHgwNiwgMHgwMCwgMHg2NCwgMHg0MCwKKwkgMHgxMCwgMHgyNiwgMHgyMywgMHgwMCwgMHgwNCwgMHg3QywgMHgwMSwgMHgwMCwgMHgwMSwgMHg3QywgMHgyRCwgMHg2MCwgMHhEMCwgMHg2MSwgMHhBMSwgMHhEOSwKKwkgMHg1MCwgMHg5NCwgMHgyRCwgMHg2MCwgMHhEMiwgMHg2MSwgMHhBMSwgMHhEQiwgMHgyRCwgMHg2MCwgMHhDNiwgMHg2MSwgMHhBMSwgMHhEMSwgMHgyRCwgMHg2MCwKKwkgMHhEQSwgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwgMHg2MCwgMHg0MCwgMHgwMiwgMHgyNiwgMHgwNSwgMHgwMCwgMHgwNCwgMHgyNiwKKwkgMHgwNSwgMHgwMCwgMHgwMSwgMHgyNiwgMHgwNSwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwMiwgMHg3QywgMHgwMywgMHgwMCwgMHgwNCwgMHg3QywgMHgwMSwgMHgwMCwKKwkgMHgyMCwgMHg3QywgMHgyRCwgMHg2MCwgMHhEMiwgMHg2MSwgMHhBMSwgMHhEOSwgMHgwRCwgMHgwMCwgMHg1MCwgMHg5NCwgMHgyRCwgMHg2MCwgMHhDRSwgMHg2MiwKKwkgMHhBMiwgMHhEQiwgMHgyRCwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEQiwgMHgyRCwgMHg2MCwgMHhEMiwgMHg2MiwgMHhBMiwgMHhEQiwgMHgyRCwgMHg2MCwKKwkgMHhENCwgMHg2MiwgMHhBMiwgMHhEQiwgMHg3QywgMHg0NCwgMHgyRCwgMHg2MCwgMHhDRSwgMHg2MSwgMHhBMSwgMHhEMSwgMHhCRCwgMHhEOSwgMHgyRCwgMHg2MCwKKwkgMHhEMCwgMHg2MSwgMHhBMSwgMHhEMSwgMHhCMCwgMHg4NCwgMHhCRCwgMHhEOSwgMHgyRCwgMHg2MCwgMHhEMiwgMHg2MSwgMHhBMSwgMHhEMSwgMHhCMCwgMHg4NCwKKwkgMHhCRCwgMHhEOSwgMHgyRCwgMHg2MCwgMHhDOCwgMHg2MSwgMHhBMSwgMHhEMSwgMHhCMCwgMHg4NCwgMHhCRCwgMHhEOSwgMHgwOCwgMHgyOCwgMHg2OCwgMHgwMCwKKwkgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhGRiwgMHhBMCwgMHhGRiwgMHhGRiwgMHgwQywgMHgyNCwgMHg2MCwgMHgwMCwKKwkgMHg2MCwgMHg0MCwgMHgwQiwgMHgzNiwgMHg1RCwgMHgwMCwgMHgyMCwgMHg0MCwgMHgxMCwgMHgyNywgMHg1QSwgMHgwMCwgMHg4OCwgMHgwMCwgMHgyMCwgMHhGRSwKKwkgMHgwMCwgMHg2NSwgMHg2MCwgMHhGRSwgMHgyRCwgMHg2MCwgMHhERSwgMHg2MiwgMHhBMiwgMHhEQiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHgwOCwgMHgyMCwKKwkgMHgwMywgMHgwMCwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHgwMiwgMHhBNSwgMHg2NCwgMHg0NCwgMHhENCwgMHg5QywgMHhENCwgMHg4MCwKKwkgMHgyRCwgMHg2MCwgMHhFMCwgMHg2MiwgMHgwMiwgMHgwNSwgMHgwOCwgMHg2NSwgMHg0MSwgMHgwMCwgMHhBMiwgMHhEOSwgMHg3QywgMHg0NCwgMHgyRCwgMHg2MCwKKwkgMHhFMiwgMHg2MiwgMHhBMiwgMHhEQiwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHgwMCwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzQSwgMHgwMSwgMHg2NSwKKwkgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHg1MCwgMHgzQSwgMHgwMSwgMHg2NSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwKKwkgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHhGMiwgMHgzQSwgMHgwMSwgMHg2NSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHg2NSwgMHg0MCwgMHgwMCwgMHgzQSwKKwkgMHgxOCwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwgMHgwMSwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzNiwKKwkgMHgwMiwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwMiwgMHgzNiwgMHgwNCwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwNCwgMHgzNiwgMHgxMCwgMHg2NSwgMHg2NCwgMHg0MCwKKwkgMHgwNSwgMHgzNiwgMHgyMCwgMHg2NSwgMHg2NSwgMHg1QywgMHgyRCwgMHg2MCwgMHhFMiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgyRCwgMHg2MCwgMHhERSwgMHg2MiwgMHhBMiwgMHhEMywgMHgwMCwgMHg2NSwgMHhGRiwgMHhBNCwgMHhBMiwgMHhEQiwgMHhDQSwgMHgwMiwKKwkgMHgyRCwgMHg2MCwgMHhFMiwgMHg2MiwgMHhBMiwgMHhEMywgMHgyRCwgMHg2MCwgMHhFMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyMCwgMHhGRSwgMHg4QSwgMHhGMywgMHhGRiwgMHhGRiwgMHgzQSwgMHhBNCwgMHg4QSwgMHhGQiwgMHgzRCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHg4OSwgMHhGMywgMHg3RiwgMHhGMSwgMHgwNCwgMHhBNCwgMHg4OSwgMHhGQiwgMHgxMiwgMHg2MCwgMHgyMiwgMHg2MywgMHg1MywgMHhGMywgMHg2NCwgMHg0MSwKKwkgMHgwOCwgMHhCMCwgMHhFMSwgMHg4NSwgMHgxQywgMHgwMywgMHhGRSwgMHhBMSwgMHg0NywgMHhEMywgMHgwMiwgMHgwNiwgMHhGQiwgMHhCNCwgMHhBMywgMHhEQiwKKwkgMHhERCwgMHg4MSwgMHg1QiwgMHhEMywgMHgwQywgMHgyNCwgMHgwMiwgMHgwMCwgMHhGQiwgMHhCNCwgMHhBMywgMHhEQiwgMHg1QiwgMHhEMywgMHhERCwgMHg4MSwKKwkgMHgwMiwgMHhCQywgMHhBMywgMHhEQiwgMHgwRSwgMHg2NSwgMHhERCwgMHg4MSwgMHhENSwgMHg4MCwgMHg1QiwgMHhEMywgMHgwOCwgMHgwNSwgMHhGQiwgMHhCNCwKKwkgMHhBMywgMHhEQiwgMHhERCwgMHg4MSwgMHhENSwgMHg4MCwgMHg1QiwgMHhEMywgMHgwMiwgMHgwMywgMHhGQiwgMHhCNCwgMHhBMywgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyMCwgMHhGRSwgMHgyNiwgMHg0NiwgMHgzMSwgMHg0MCwgMHgyMCwgMHgyQSwgMHgxOCwgMHgwMCwgMHgzRiwgMHhGMiwgMHg0NywgMHg2NSwgMHhDNCwgMHg4NCwKKwkgMHhFOCwgMHg4NCwgMHgyMywgMHhGQSwgMHhGMSwgMHg2MCwgMHgwMiwgMHg2NCwgMHgyNCwgMHhGQSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwKKwkgMHg2NCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHhGQSwgMHhGRSwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgxNiwgMHg2MywgMHgxQywgMHg2MCwgMHg4QywgMHg2MiwgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRSwgMHgxRiwgMHg1QiwgMHhGQiwgMHg1QywgMHhGQiwKKwkgMHgxQywgMHg2MCwgMHg5MiwgMHg2MywgMHgwMiwgMHg2NCwgMHhBMywgMHhEQiwgMHgxQSwgMHg2MCwgMHhDNiwgMHg2MiwgMHgzRSwgMHg2MywgMHgwMCwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRSwgMHgxRiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHg5OCwgMHg2MiwgMHhBMiwgMHhEMywgMHgwMCwgMHg2MywKKwkgMHhGOCwgMHhBMCwgMHgwMSwgMHhBNCwgMHgwMywgMHgwMywgMHhBMiwgMHhEQiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHhBMiwgMHhERCwgMHgxQywgMHg2MCwKKwkgMHg5QSwgMHg2MiwgMHhBMiwgMHhEMSwgMHhBMiwgMHhERCwgMHg1QSwgMHhEMywgMHhBMiwgMHhERCwgMHhDMCwgMHg4MSwgMHg2MSwgMHg0NCwgMHgwMiwgMHgyNCwKKwkgMHhGRiwgMHhGRiwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHg1QSwgMHhEMywgMHhFOSwgMHg4MSwgMHhFOCwgMHg4MywKKwkgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4NSwgMHhENCwgMHg4NSwgMHhDNSwgMHg4MywgMHhBMiwgMHhERCwgMHgxQywgMHg2MCwKKwkgMHg4RSwgMHg2MiwgMHg2MywgMHg0NywgMHgwMCwgMHg3RiwgMHhBMiwgMHhEQiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHhBMCwgMHg2NSwKKwkgMHhBNSwgMHhERCwgMHgxQiwgMHg2MCwgMHg0NiwgMHg2NSwgMHg2MSwgMHg0NCwgMHgyQiwgMHg0MSwgMHg0NSwgMHhEQiwgMHg2MCwgMHg0MSwgMHgxQiwgMHg2MCwKKwkgMHg4NiwgMHg2NSwgMHgwQSwgMHhBMywgMHhBMywgMHhEMSwgMHgyQiwgMHg0NCwgMHg0NCwgMHhEOSwgMHgxQywgMHg2MCwgMHhBMCwgMHg2NSwgMHhBNSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MywgMHgwMCwgMHhCOSwgMHhGRiwgMHhGRiwgMHg0QywgMHgwMywgMHgwNiwgMHhBMywgMHhCRCwgMHhEMSwgMHg4MSwgMHhGMywKKwkgMHg4MiwgMHhGMSwgMHhEMCwgMHg4MCwgMHhCRCwgMHhEMywgMHgyMiwgMHgwMiwgMHg4MywgMHhGMywgMHhEMCwgMHg4MCwgMHhBMywgMHhEMSwgMHgxRSwgMHgwMiwKKwkgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxQiwgMHgwMiwgMHg4QSwgMHhGMywgMHgxMiwgMHg2MCwgMHg0NiwgMHg2MywgMHhDNiwgMHhBNSwgMHg0NywgMHhEMSwKKwkgMHg3RiwgMHhGMywgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwgMHhGRiwgMHg2MSwgMHg2MSwgMHg0MywgMHgxQSwgMHg2MCwKKwkgMHhDNiwgMHg2NSwgMHgyQiwgMHg0NCwgMHg0NCwgMHhEMSwgMHgxQywgMHg2MCwgMHg4RSwgMHg2NSwgMHhBNSwgMHhEMSwgMHg2NCwgMHg0NCwgMHhEMCwgMHg4MSwKKwkgMHgxQywgMHg2MCwgMHg5MiwgMHg2NSwgMHgwMSwgMHgwNSwgMHgwMCwgMHg2MSwgMHhBNSwgMHhEMywgMHgxNSwgMHgwMCwgMHgxQSwgMHg2MCwgMHhDNiwgMHg2NSwKKwkgMHgyQiwgMHg0NCwgMHg0NCwgMHhEMSwgMHgxQywgMHg2MCwgMHg4RSwgMHg2NSwgMHg2NCwgMHg0MywgMHhBNSwgMHhEMSwgMHg2NCwgMHg2NSwgMHg2MywgMHg0NCwKKwkgMHhDMCwgMHg4NCwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNiwgMHgwMCwgMHg2MSwgMHgxMywgMHgwMCwgMHg2MSwgMHg0MywgMHhEMCwgMHg4MSwKKwkgMHgxQywgMHg2MCwgMHg5MiwgMHg2NSwgMHhBNSwgMHhEMywgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhDQywgMHg4NCwgMHhDQywgMHg4NCwgMHgwMiwgMHgwMywKKwkgMHgwMiwgMHgwMywgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4NSwgMHhENywgMHg4NCwgMHg2MCwgMHg0MSwgMHgwMSwgMHgwNSwKKwkgMHgwMCwgMHg2MSwgMHgxQywgMHg2MCwgMHhBMCwgMHg2NSwgMHhBNSwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MywgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgxQywgMHg2MCwgMHg5NCwgMHg2NSwgMHhBNSwgMHhEMSwgMHg1QiwgMHhGMywgMHg2NCwgMHg0MSwgMHhDRCwgMHg4MSwgMHhDRCwgMHg4MSwgMHgwMiwgMHgwMywKKwkgMHgwMiwgMHgwMywgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NSwgMHgyOSwgMHg0NCwgMHg1NCwgMHg4OSwgMHgyRSwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhFRCwgMHhGMywgMHgxQSwgMHg2MCwgMHhCRSwgMHg2MywgMHgwRiwgMHhCNCwgMHgwMSwgMHhBNCwgMHhFMCwgMHg4NywgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHhCRCwgMHhEQiwgMHgxMCwgMHg2MCwgMHg1OCwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwMiwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwNiwgMHg2NCwKKwkgMHhBMywgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHhCQSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQSwgMHg2MCwgMHhCRSwgMHg2MywgMHhFQSwgMHg2MCwgMHg2MCwgMHg2NCwKKwkgMHhCRCwgMHhEQiwgMHgxMCwgMHg2MCwgMHg1OCwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwMiwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwNiwgMHg2NCwgMHhBMywgMHhEQiwKKwkgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHhCQSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxNiwgMHg2MywgMHgxQywgMHg2MCwgMHg4QywgMHg2MiwgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRSwgMHgxRiwgMHg1QiwgMHhGQiwgMHg1QywgMHhGQiwgMHgxQywgMHg2MCwgMHg5MiwgMHg2MywgMHgwMiwgMHg2NCwgMHhBMywgMHhEQiwgMHgxQSwgMHg2MCwKKwkgMHhDNiwgMHg2MiwgMHgzRSwgMHg2MywgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRSwgMHgxRiwgMHgxMCwgMHg2MCwgMHg1NiwgMHg2MiwgMHhGNSwgMHg2MCwKKwkgMHgyOSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHgyQywgMHg2MiwgMHhGNSwgMHg2MCwgMHgxNSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwKKwkgMHgwMiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHgwNCwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhGNCwgMHg2MCwgMHgxNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg0NCwgMHg0MCwgMHgyNiwKKwkgMHgwMywgMHgwMCwgMHhGNCwgMHg2MCwgMHhFQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg0MCwgMHg1MiwgMHgyMywgMHgwNywgMHgwMCwgMHg1QSwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHhBNCwgMHg1QSwgMHhGQiwgMHhGNCwgMHg2MCwgMHhENywgMHg3OCwgMHhGRiwgMHhGRiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NSwKKwkgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHgxQywgMHg2MCwgMHg5MiwgMHg2NSwgMHgwMiwgMHg2NCwgMHhBNSwgMHhEQiwgMHgxQSwgMHg2MCwgMHhDNCwgMHg2MiwKKwkgMHg3RSwgMHg2MywgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRSwgMHgxRiwgMHgxQywgMHg2MCwgMHg5NiwgMHg2MiwgMHhBMiwgMHhERCwgMHg4QywgMHhGMywKKwkgMHg1OCwgMHhGQiwgMHgwMiwgMHg2NCwgMHg4QywgMHhGQiwgMHhGRiwgMHhGRiwgMHhDMSwgMHhGRSwgMHg4QywgMHhGMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwKKwkgMHhGRiwgMHhGRiwgMHgwQiwgMHgwMywgMHgxMCwgMHg2MCwgMHgwNCwgMHg2MiwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhGNCwgMHg2MCwKKwkgMHgzRCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHg2NCwgMHg1MywgMHhGQiwgMHgyOSwgMHg2MCwKKwkgMHhBNCwgMHg2NCwgMHg1NCwgMHhGQiwgMHgwRiwgMHg0RSwgMHhFQywgMHg2MCwgMHg1OCwgMHg0RiwgMHhCOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwKKwkgMHgxMCwgMHg2MCwgMHgwMiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHgwNCwgMHg2MiwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhGNCwgMHg2MCwgMHg2NywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg1OCwgMHhGMywKKwkgMHg4QywgMHhGQiwgMHhDQSwgMHhGRSwgMHhDMSwgMHhGRSwgMHgxQywgMHg2MCwgMHhBMiwgMHg2MiwgMHg2NiwgMHg0NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhERCwKKwkgMHg2MSwgMHg0NCwgMHg1QSwgMHhEQiwgMHg2NywgMHhGNSwgMHhDQywgMHhGMSwgMHgxOSwgMHhGOCwgMHhGOCwgMHg2MCwgMHg4MCwgMHg2NCwgMHgwRSwgMHhGQSwKKwkgMHhBOSwgMHhGMSwgMHgwNywgMHhGOCwgMHgwMSwgMHg2MCwgMHg2MCwgMHg2NywgMHgyQywgMHhGQSwgMHgxRCwgMHg2NCwgMHgyRCwgMHhGQSwgMHgwMSwgMHg2NCwKKwkgMHgyRSwgMHhGQSwgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHg4MSwgMHhGMSwKKwkgMHgzMiwgMHhGOCwgMHg4MiwgMHhGMSwgMHgzMywgMHhGOCwgMHg4MywgMHhGMSwgMHgzNCwgMHhGOCwgMHgwOCwgMHg2NCwgMHgyQSwgMHhGQSwgMHg0MCwgMHg2MywKKwkgMHgzRiwgMHhGQywgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MiwgMHhDQiwgMHg4MywgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQSwgMHhGRSwgMHgxRiwgMHgxQywgMHg2MCwKKwkgMHg4RSwgMHg2NSwgMHhBNSwgMHhEMywgMHgwMiwgMHhGQSwgMHgxOSwgMHg2MCwgMHg4OCwgMHg2NCwgMHhBMCwgMHhEMSwgMHgwQSwgMHg2MSwgMHg0MSwgMHhEMywKKwkgMHgwMywgMHhGQSwgMHgwNiwgMHg2MSwgMHgwNiwgMHg2MywgMHgwMCwgMHg2NSwgMHgxQiwgMHg2MCwgMHg4NiwgMHg2NCwgMHg0NCwgMHhEMSwgMHg1OSwgMHhEOCwKKwkgMHgxQiwgMHg2MCwgMHg0NiwgMHg2NCwgMHg0NCwgMHhEMSwgMHg1OSwgMHhEOCwgMHgxQSwgMHg2MCwgMHhDNiwgMHg2NCwgMHg0NCwgMHhEMSwgMHg1OSwgMHhEOCwKKwkgMHgxQiwgMHg2MCwgMHgwNiwgMHg2NCwgMHg0NCwgMHhEMSwgMHg1OSwgMHhEOCwgMHg2NSwgMHg0NCwgMHgwMiwgMHhBNCwgMHg2MCwgMHg0NSwgMHhFQywgMHgxRiwKKwkgMHg2NywgMHhGNSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgxQywgMHg2MCwgMHhBMiwgMHg2MiwgMHhBMiwgMHhENSwgMHg1QSwgMHhEMywKKwkgMHg1QSwgMHhEMywgMHg2MCwgMHg0MywgMHg2MCwgMHg0MSwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHhCRiwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHhGMywgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHhENCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgwMiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwKKwkgMHgwNCwgMHg2MiwgMHgxMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHhGNCwgMHg2MCwgMHgxNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHhBNCwgMHg2MywgMHg2NiwgMHg0NCwgMHhBMywgMHhEQiwgMHgwMCwgMHg2MCwgMHg0MCwgMHg2MSwKKwkgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg2NywgMHhGQiwgMHgwNCwgMHg2NCwgMHgwMywgMHhGQSwKKwkgMHgxQywgMHg2MCwgMHhBNCwgMHg2MywgMHhBMywgMHhEMSwgMHgwMCwgMHg2NCwgMHg2NCwgMHg0NiwgMHhBMywgMHhEQiwgMHgwMCwgMHg2MCwgMHg0MCwgMHg2NSwKKwkgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHhGMywgMHg2MCwgMHg1OCwgMHg0RSwgMHhCOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgwMiwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHgwNCwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHhGNCwgMHg2MCwKKwkgMHgxNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwKKwkgMHhCQSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgxMCwgMHg2MCwgMHgwMiwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwgMHhGRiwgMHg2MCwgMHg5RiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgwMiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKworfTsgIC8qIGZ3X2ltYWdlXzRfZGF0YSAqLworCitzdGF0aWMgY29uc3QgQ0ZHX0lERU5USVRZX1NUUkNUIGZ3X2ltYWdlX2luZm9pZGVudGl0eVtdID0geworCXsKKwkJc2l6ZW9mKCBDRkdfSURFTlRJVFlfU1RSQ1QgKSAvIHNpemVvZihoY2ZfMTYpIC0gMSwKKwkJQ0ZHX0ZXX0lERU5USVRZLAorCQlDT01QX0lEX0ZXX1NUQSwKKwkJMywJCQkJCQkJLy9WYXJpYW50CisJCTIsCQkJCQkJCS8vTWFqb3IKKwkJMzYJCQkJCQkJLy9NaW5vcgorCX0sCisJeyAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwIH0JCS8vZW5kc2VudGluZWwKK307CisKK3N0YXRpYyBjb25zdCBDRkdfUFJPR19TVFJDVCBmd19pbWFnZV9jb2RlW10gPSB7CisJeworCQk4LAorCQlDRkdfUFJPRywKKwkJQ0ZHX1BST0dfVk9MQVRJTEUsCQkJLy8gbW9kZQorCQkweDAxODYsCQkvLyBzaXplb2YoZndfaW1hZ2VfMV9kYXRhKSwKKwkJMHgwMDAwMDA2MCwJCQkJCS8vIFRhcmdldCBhZGRyZXNzIGluIE5JQyBNZW1vcnkKKwkJMHgwMDAwLAkJCQkJCS8vIENSQzogeWVzL25vCVRZUEU6IHByaW1hcnkvc3RhdGlvbi90ZXJ0aWFyeQorCQkoaGNmXzggRkFSICAgKikgZndfaW1hZ2VfMV9kYXRhCisJfSwKKwl7CisJCTgsCisJCUNGR19QUk9HLAorCQlDRkdfUFJPR19WT0xBVElMRSwJCQkvLyBtb2RlCisJCTB4MjUxOCwJCS8vIHNpemVvZihmd19pbWFnZV8yX2RhdGEpLAorCQkweDAwMDAwQzE2LAkJCQkJLy8gVGFyZ2V0IGFkZHJlc3MgaW4gTklDIE1lbW9yeQorCQkweDAwMDAsCQkJCQkJLy8gQ1JDOiB5ZXMvbm8JVFlQRTogcHJpbWFyeS9zdGF0aW9uL3RlcnRpYXJ5CisJCShoY2ZfOCBGQVIgICAqKSBmd19pbWFnZV8yX2RhdGEKKwl9LAorCXsKKwkJOCwKKwkJQ0ZHX1BST0csCisJCUNGR19QUk9HX1ZPTEFUSUxFLAkJCS8vIG1vZGUKKwkJMHgzZGFhLAkJLy8gc2l6ZW9mKGZ3X2ltYWdlXzNfZGF0YSksCisJCTB4MDAxRTMxMkUsCQkJCQkvLyBUYXJnZXQgYWRkcmVzcyBpbiBOSUMgTWVtb3J5CisJCTB4MDAwMCwJCQkJCQkvLyBDUkM6IHllcy9ubwlUWVBFOiBwcmltYXJ5L3N0YXRpb24vdGVydGlhcnkKKwkJKGhjZl84IEZBUiAgICopIGZ3X2ltYWdlXzNfZGF0YQorCX0sCisJeworCQk4LAorCQlDRkdfUFJPRywKKwkJQ0ZHX1BST0dfVk9MQVRJTEUsCQkJLy8gbW9kZQorCQkweGFhNjYsCQkvLyBzaXplb2YoZndfaW1hZ2VfNF9kYXRhKSwKKwkJMHgwMDFGNDAwMCwJCQkJCS8vIFRhcmdldCBhZGRyZXNzIGluIE5JQyBNZW1vcnkKKwkJMHgwMDAwLAkJCQkJCS8vIENSQzogeWVzL25vCVRZUEU6IHByaW1hcnkvc3RhdGlvbi90ZXJ0aWFyeQorCQkoaGNmXzggRkFSICAgKikgZndfaW1hZ2VfNF9kYXRhCisJfSwKKwl7CisJCTUsCisJCUNGR19QUk9HLAorCQlDRkdfUFJPR19TVE9QLAkJCQkvLyBtb2RlCisJCTAwMDAsCisgCTB4MDAwRjM2OEUsCQkJCQkvLyBTdGFydCBleGVjdXRpb24gYWRkcmVzcworCX0sCisJeyAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwMDAwMCwgMDAwMCwgMDAwMDAwMDB9Cit9OworCitzdGF0aWMgY29uc3QgQ0ZHX1JBTkdFMjBfU1RSQ1QgZndfaW1hZ2VfaW5mb2NvbXBhdFtdID0geworCXsJMyArICgoMjAgKiBzaXplb2YoQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QpKSAvIHNpemVvZihoY2ZfMTYpKSwKKwkJQ0ZHX0ZXX1NVUF9SQU5HRSwKKwkJQ09NUF9ST0xFX1NVUEwsCisJCUNPTVBfSURfU1RBLAorCQl7CisJCQl7IDIsIDIsIDUgfSAgCQkJCS8vdmFyaWFudCwgYm90dG9tLCB0b3AKKwkJfQorCX0sCisJewkzICsgKCgyMCAqIHNpemVvZihDRkdfUkFOR0VfU1BFQ19TVFJDVCkpIC8gc2l6ZW9mKGhjZl8xNikpLAorCQlDRkdfTUZJX0FDVF9SQU5HRVNfU1RBLAorCQlDT01QX1JPTEVfQUNULAorCQlDT01QX0lEX01GSSwKKwkJeworCQkJeyA0LCA2LCA3IH0sIAkJCQkvL3ZhcmlhbnQsIGJvdHRvbSwgdG9wCisJCQl7IDUsIDYsIDcgfSwgCQkJCS8vdmFyaWFudCwgYm90dG9tLCB0b3AKKwkJCXsgNiwgNiwgNyB9ICAJCQkJLy92YXJpYW50LCBib3R0b20sIHRvcAorCQl9CisJfSwKKwl7CTMgKyAoKDIwICogc2l6ZW9mKENGR19SQU5HRV9TUEVDX1NUUkNUKSkgLyBzaXplb2YoaGNmXzE2KSksCisJCUNGR19DRklfQUNUX1JBTkdFU19TVEEsCisJCUNPTVBfUk9MRV9BQ1QsCisJCUNPTVBfSURfQ0ZJLAorCQl7CisJCQl7IDIsIDEsIDIgfSAgCQkJCS8vdmFyaWFudCwgYm90dG9tLCB0b3AKKwkJfQorCX0sCisJeyAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwLCB7IHsgMDAwMCwgMDAwMCwgMDAwMCB9IH0gfQkvL2VuZHNlbnRpbmVsCit9OworCittZW1pbWFnZSBmd19pbWFnZSA9IHsKKwkiRlVQVTdEMzdkaGZ3Y2lcMDAxQyIsCQkJLy9zaWduYXR1cmUsIDxmb3JtYXQgbnVtYmVyPiwgQy9CaW4gdHlwZQorCShDRkdfUFJPR19TVFJDVCAqKSBmd19pbWFnZV9jb2RlLAorCTB4MDAwRjM2OEUsCisJMDAwMDAwMDAsCQkJCQkvLyhkdW1teSkgcGRhcGx1ZworCTAwMDAwMDAwLAkJCQkJLy8oZHVtbXkpIHByaXBsdWcKKwkoQ0ZHX1JBTkdFMjBfU1RSQ1QgKikgZndfaW1hZ2VfaW5mb2NvbXBhdCwKKwkoQ0ZHX0lERU5USVRZX1NUUkNUICopIGZ3X2ltYWdlX2luZm9pZGVudGl0eSwKK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3N0YV9oMjUuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3N0YV9oMjUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmNhMWNkZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9zdGFfaDI1LmMKQEAgLTAsMCArMSw1MjU1IEBACisvKgorICogRmlsZToJc3RhX2g1NC4xMzYKKyAqCisgKiBBYnN0cmFjdDoJVGhpcyBmaWxlIGNvbnRhaW5zIG1lbW9yeSBpbWFnZSAnZndfaW1hZ2UnLgorICoKKyAqIENvbnRlbnRzOglUb3RhbCBzaXplIG9mIHRoZSBtZW1vcnkgaW1hZ2U6IDgxNzQyIGJ5dGVzLgorICoJCVRvdGFsIG51bWJlciBvZiBibG9ja3M6IDQgYmxvY2tzLgorICoJCUJsb2NrICAxIDogbG9hZCBhZGRyZXNzIDAwMDAwMDYwLCAzODggYnl0ZXMuCisgKgkJQmxvY2sgIDIgOiBsb2FkIGFkZHJlc3MgMDAwMDBDMTYsIDExMjc4IGJ5dGVzLgorICoJCUJsb2NrICAzIDogbG9hZCBhZGRyZXNzIDAwMUUzODI0LCAyMTcyNiBieXRlcy4KKyAqCQlCbG9jayAgNCA6IGxvYWQgYWRkcmVzcyAwMDFGNDAwMCwgNDgzNTAgYnl0ZXMuCisgKgorICogSWRlbnRpdHk6CWNvbXBvbmVudCBpZDogMzEgKHZhcmlhbnQgNCkgdmVyc2lvbiAxLjM2CisgKgorICogQ29tcGF0aWJpbGl0eToKKyAqCQlzdXBwbHlpbmcgaW50ZXJmYWNlIDQgKHZhcmlhbnQgNCkgOiAxIC0gMgorICoJCWFjdGluZyBvbiBpbnRlcmZhY2UgMSAodmFyaWFudCA3KSA6IDMgLSAzCisgKgkJYWN0aW5nIG9uIGludGVyZmFjZSAxICh2YXJpYW50IDgpIDogMSAtIDEKKyAqCQlhY3Rpbmcgb24gaW50ZXJmYWNlIDIgKHZhcmlhbnQgNCkgOiAxIC0gMgorICoKKyAqIEdlbmVyYXRlZDoJYnkgZzpcZndcZnVwdTMuZXhlIHZlcnNpb24gNC4yNgorICoKKyAqIENvbW1hbmRsaW5lOglnOlxmd1xmdXB1My5leGUgL2Y9NCAvbj1md19pbWFnZSAvaT1yNDAxMzYwMC5oZXgKKyAqLworCisKKyNpbmNsdWRlICJoY2ZjZmcuaCIJCQkJLy8gdG8gZ2V0IGhjZl8xNiBldGMgZGVmaW5lZCBhcyB3ZWxsIGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvc3NpYmxlIHNldHRpbmdzIHdoaWNoIGlubHVlbmNlIG1kZC5oIG9yIGRoZi5oCisjaW5jbHVkZSAibWRkLmgiICAgCQkJCS8vdG8gZ2V0IENPTVBfSURfU1RBIGV0YyBkZWZpbmVkCisjaW5jbHVkZSAiZGhmLmgiICAgCQkJCS8vdXNlZCB0byBiZSAiZmhmbWVtLmgiLCB0byBnZXQgbWVtYmxvY2sscGx1Z3JlY29yZCwKKworc3RhdGljIGNvbnN0IGhjZl84IGZ3X2ltYWdlXzFfZGF0YVtdID0geworCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERBLCAweDBDLCAweDAwLCAweDAwLAorCSAweDAwLCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDY1LCAweDM3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDFCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDFCLCAweDAwLCAweDFCLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIyLCAweDFCLCAweEIyLCAweDFCLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLAorCSAweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDA1LCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweDAwLCAweDAwLCAweEZGLCAweDA3LAorCSAweDAxLCAweDAwLCAweDY0LCAweDAwLCAweDY0LCAweDAwLCAweDEwLCAweDI3LCAweDEwLCAweDI3LCAweDE0LCAweDAwLCAweEQwLCAweDA3LCAweEQwLCAweDA3LAorCSAweDEwLCAweDI3LCAweDJGLCAweDAwLCAweDMyLCAweDAwLCAweDMyLCAweDAwLCAweDA1LCAweDAwLCAweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDEwLCAweDI3LAorCSAweDA1LCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAyLCAweDEzLCAweDAwLCAweDA3LCAweDAwLCAweDAzLCAweDAwLCAweDMyLCAweDAwLCAweDAyLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDJBLCAweDA5LCAweDJCLCAweDA5LCAweDJCLCAweDA5LCAweEZGLCAweDBGLCAweEYwLCAweDBGLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAxLCAweDAwLCAweDQwLCAweDAwLCAweDMyLCAweDAwLCAweDMyLCAweDAwLCAweDBBLCAweDAwLAorCSAweDAyLCAweDAwLCAweDA2LCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCit9OyAgLyogZndfaW1hZ2VfMV9kYXRhICovCisKK3N0YXRpYyBjb25zdCBoY2ZfOCBmd19pbWFnZV8yX2RhdGFbXSA9IHsKKwkgMHhGNCwgMHhBMywgMHgwMCwgMHgxNiwgMHgwOCwgMHg0MCwgMHgwRiwgMHhEMiwgMHhFMSwgMHgyOCwgMHhBNSwgMHg3QywgMHg1MCwgMHgzMCwgMHhGMSwgMHg4NCwKKwkgMHg0NCwgMHgwOCwgMHhBQiwgMHhBRSwgMHhBNSwgMHhCOCwgMHhGQywgMHhCQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwKKwkgMHgwNiwgMHgwNywgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNSwgMHhDNiwgMHg4NCwgMHhGOCwgMHg5OSwgMHhFRSwKKwkgMHg4RCwgMHhGNiwgMHgwRCwgMHhGRiwgMHhCRCwgMHhENiwgMHhCMSwgMHhERSwgMHg1NCwgMHg5MSwgMHg1MCwgMHg2MCwgMHgwMywgMHgwMiwgMHhBOSwgMHhDRSwKKwkgMHg3RCwgMHg1NiwgMHgxOSwgMHhFNywgMHg2MiwgMHhCNSwgMHhFNiwgMHg0RCwgMHg5QSwgMHhFQywgMHg0NSwgMHg4RiwgMHg5RCwgMHgxRiwgMHg0MCwgMHg4OSwKKwkgMHg4NywgMHhGQSwgMHgxNSwgMHhFRiwgMHhFQiwgMHhCMiwgMHhDOSwgMHg4RSwgMHgwQiwgMHhGQiwgMHhFQywgMHg0MSwgMHg2NywgMHhCMywgMHhGRCwgMHg1RiwKKwkgMHhFQSwgMHg0NSwgMHhCRiwgMHgyMywgMHhGNywgMHg1MywgMHg5NiwgMHhFNCwgMHg1QiwgMHg5QiwgMHhDMiwgMHg3NSwgMHgxQywgMHhFMSwgMHhBRSwgMHgzRCwKKwkgMHg2QSwgMHg0QywgMHg1QSwgMHg2QywgMHg0MSwgMHg3RSwgMHgwMiwgMHhGNSwgMHg0RiwgMHg4MywgMHg1QywgMHg2OCwgMHhGNCwgMHg1MSwgMHgzNCwgMHhEMSwKKwkgMHgwOCwgMHhGOSwgMHg5MywgMHhFMiwgMHg3MywgMHhBQiwgMHg1MywgMHg2MiwgMHgzRiwgMHgyQSwgMHgwQywgMHgwOCwgMHg1MiwgMHg5NSwgMHg2NSwgMHg0NiwKKwkgMHg1RSwgMHg5RCwgMHgyOCwgMHgzMCwgMHhBMSwgMHgzNywgMHgwRiwgMHgwQSwgMHhCNSwgMHgyRiwgMHgwOSwgMHgwRSwgMHgzNiwgMHgyNCwgMHg5QiwgMHgxQiwKKwkgMHgzRCwgMHhERiwgMHgyNiwgMHhDRCwgMHg2OSwgMHg0RSwgMHhDRCwgMHg3RiwgMHg5RiwgMHhFQSwgMHgxQiwgMHgxMiwgMHg5RSwgMHgxRCwgMHg3NCwgMHg1OCwKKwkgMHgyRSwgMHgzNCwgMHgyRCwgMHgzNiwgMHhCMiwgMHhEQywgMHhFRSwgMHhCNCwgMHhGQiwgMHg1QiwgMHhGNiwgMHhBNCwgMHg0RCwgMHg3NiwgMHg2MSwgMHhCNywKKwkgMHhDRSwgMHg3RCwgMHg3QiwgMHg1MiwgMHgzRSwgMHhERCwgMHg3MSwgMHg1RSwgMHg5NywgMHgxMywgMHhGNSwgMHhBNiwgMHg2OCwgMHhCOSwgMHgwMCwgMHgwMCwKKwkgMHgyQywgMHhDMSwgMHg2MCwgMHg0MCwgMHgxRiwgMHhFMywgMHhDOCwgMHg3OSwgMHhFRCwgMHhCNiwgMHhCRSwgMHhENCwgMHg0NiwgMHg4RCwgMHhEOSwgMHg2NywKKwkgMHg0QiwgMHg3MiwgMHhERSwgMHg5NCwgMHhENCwgMHg5OCwgMHhFOCwgMHhCMCwgMHg0QSwgMHg4NSwgMHg2QiwgMHhCQiwgMHgyQSwgMHhDNSwgMHhFNSwgMHg0RiwKKwkgMHgxNiwgMHhFRCwgMHhDNSwgMHg4NiwgMHhENywgMHg5QSwgMHg1NSwgMHg2NiwgMHg5NCwgMHgxMSwgMHhDRiwgMHg4QSwgMHgxMCwgMHhFOSwgMHgwNiwgMHgwNCwKKwkgMHg4MSwgMHhGRSwgMHhGMCwgMHhBMCwgMHg0NCwgMHg3OCwgMHhCQSwgMHgyNSwgMHhFMywgMHg0QiwgMHhGMywgMHhBMiwgMHhGRSwgMHg1RCwgMHhDMCwgMHg4MCwKKwkgMHg4QSwgMHgwNSwgMHhBRCwgMHgzRiwgMHhCQywgMHgyMSwgMHg0OCwgMHg3MCwgMHgwNCwgMHhGMSwgMHhERiwgMHg2MywgMHhDMSwgMHg3NywgMHg3NSwgMHhBRiwKKwkgMHg2MywgMHg0MiwgMHgzMCwgMHgyMCwgMHgxQSwgMHhFNSwgMHgwRSwgMHhGRCwgMHg2RCwgMHhCRiwgMHg0QywgMHg4MSwgMHgxNCwgMHgxOCwgMHgzNSwgMHgyNiwKKwkgMHgyRiwgMHhDMywgMHhFMSwgMHhCRSwgMHhBMiwgMHgzNSwgMHhDQywgMHg4OCwgMHgzOSwgMHgyRSwgMHg1NywgMHg5MywgMHhGMiwgMHg1NSwgMHg4MiwgMHhGQywKKwkgMHg0NywgMHg3QSwgMHhBQywgMHhDOCwgMHhFNywgMHhCQSwgMHgyQiwgMHgzMiwgMHg5NSwgMHhFNiwgMHhBMCwgMHhDMCwgMHg5OCwgMHgxOSwgMHhEMSwgMHg5RSwKKwkgMHg3RiwgMHhBMywgMHg2NiwgMHg0NCwgMHg3RSwgMHg1NCwgMHhBQiwgMHgzQiwgMHg4MywgMHgwQiwgMHhDQSwgMHg4QywgMHgyOSwgMHhDNywgMHhEMywgMHg2QiwKKwkgMHgzQywgMHgyOCwgMHg3OSwgMHhBNywgMHhFMiwgMHhCQywgMHgxRCwgMHgxNiwgMHg3NiwgMHhBRCwgMHgzQiwgMHhEQiwgMHg1NiwgMHg2NCwgMHg0RSwgMHg3NCwKKwkgMHgxRSwgMHgxNCwgMHhEQiwgMHg5MiwgMHgwQSwgMHgwQywgMHg2QywgMHg0OCwgMHhFNCwgMHhCOCwgMHg1RCwgMHg5RiwgMHg2RSwgMHhCRCwgMHhFRiwgMHg0MywKKwkgMHhBNiwgMHhDNCwgMHhBOCwgMHgzOSwgMHhBNCwgMHgzMSwgMHgzNywgMHhEMywgMHg4QiwgMHhGMiwgMHgzMiwgMHhENSwgMHg0MywgMHg4QiwgMHg1OSwgMHg2RSwKKwkgMHhCNywgMHhEQSwgMHg4QywgMHgwMSwgMHg2NCwgMHhCMSwgMHhEMiwgMHg5QywgMHhFMCwgMHg0OSwgMHhCNCwgMHhEOCwgMHhGQSwgMHhBQywgMHgwNywgMHhGMywKKwkgMHgyNSwgMHhDRiwgMHhBRiwgMHhDQSwgMHg4RSwgMHhGNCwgMHhFOSwgMHg0NywgMHgxOCwgMHgxMCwgMHhENSwgMHg2RiwgMHg4OCwgMHhGMCwgMHg2RiwgMHg0QSwKKwkgMHg3MiwgMHg1QywgMHgyNCwgMHgzOCwgMHhGMSwgMHg1NywgMHhDNywgMHg3MywgMHg1MSwgMHg5NywgMHgyMywgMHhDQiwgMHg3QywgMHhBMSwgMHg5QywgMHhFOCwKKwkgMHgyMSwgMHgzRSwgMHhERCwgMHg5NiwgMHhEQywgMHg2MSwgMHg4NiwgMHgwRCwgMHg4NSwgMHgwRiwgMHg5MCwgMHhFMCwgMHg0MiwgMHg3QywgMHhDNCwgMHg3MSwKKwkgMHhBQSwgMHhDQywgMHhEOCwgMHg5MCwgMHgwNSwgMHgwNiwgMHgwMSwgMHhGNywgMHgxMiwgMHgxQywgMHhBMywgMHhDMiwgMHg1RiwgMHg2QSwgMHhGOSwgMHhBRSwKKwkgMHhEMCwgMHg2OSwgMHg5MSwgMHgxNywgMHg1OCwgMHg5OSwgMHgyNywgMHgzQSwgMHhCOSwgMHgyNywgMHgzOCwgMHhEOSwgMHgxMywgMHhFQiwgMHhCMywgMHgyQiwKKwkgMHgzMywgMHgyMiwgMHhCQiwgMHhEMiwgMHg3MCwgMHhBOSwgMHg4OSwgMHgwNywgMHhBNywgMHgzMywgMHhCNiwgMHgyRCwgMHgyMiwgMHgzQywgMHg5MiwgMHgxNSwKKwkgMHgyMCwgMHhDOSwgMHg0OSwgMHg4NywgMHhGRiwgMHhBQSwgMHg3OCwgMHg1MCwgMHg3QSwgMHhBNSwgMHg4RiwgMHgwMywgMHhGOCwgMHg1OSwgMHg4MCwgMHgwOSwKKwkgMHgxNywgMHgxQSwgMHhEQSwgMHg2NSwgMHgzMSwgMHhENywgMHhDNiwgMHg4NCwgMHhCOCwgMHhEMCwgMHhDMywgMHg4MiwgMHhCMCwgMHgyOSwgMHg3NywgMHg1QSwKKwkgMHgxMSwgMHgxRSwgMHhDQiwgMHg3QiwgMHhGQywgMHhBOCwgMHhENiwgMHg2RCwgMHgzQSwgMHgyQywgMHgwMCwgMHgzMCwgMHgwMCwgMHgzMSwgMHgwMCwgMHgzMywKKwkgMHgwMCwgMHgzNCwgMHgwMCwgMHgzNSwgMHgwMCwgMHgzNiwgMHgwMCwgMHgzNywgMHgwMCwgMHgzOCwgMHgwMCwgMHgzOCwgMHgwMCwgMHgzQSwgMHgwMCwgMHgzQiwKKwkgMHgwMCwgMHgzQywgMHgwMCwgMHgzRCwgMHgwMCwgMHgzRSwgMHgwMCwgMHgzRiwgMHgwMCwgMHgzRiwgMHg1OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHgyOCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwQSwgMHgwMiwgMHgxNCwgMHgwNSwgMHgzMiwgMHgwQiwgMHgzNywgMHgwOCwgMHg1MCwgMHgwQiwgMHg2RSwKKwkgMHgwMiwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwQiwgMHgwMCwgMHgxNiwgMHgwMCwgMHgwQywgMHgwMCwgMHgxMiwgMHgwMCwgMHgxOCwgMHgwMCwgMHgyNCwgMHgwMCwKKwkgMHgzMCwgMHgwMCwgMHg0OCwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzOSwgMHgwMCwgMHgzOSwgMHgwMCwgMHgyMCwgMHgwMCwgMHgzOSwgMHgwMCwgMHgzOSwgMHgwMCwgMHgyMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMCwgMHgxMCwKKwkgMHgzRSwgMHgxMSwgMHhGNiwgMHgxMCwgMHgzOCwgMHgxMSwgMHhGQywgMHgxMCwgMHgzMiwgMHgxMSwgMHgwMiwgMHgxMSwgMHgyQywgMHgxMSwgMHgwOCwgMHgxMSwKKwkgMHgyNiwgMHgxMSwgMHgwRSwgMHgxMSwgMHgyMCwgMHgxMSwgMHgxNCwgMHgxMSwgMHgxQSwgMHgxMSwgMHgwNywgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNiwgMHgyMiwKKwkgMHgwMCwgMHgwNCwgMHgwOCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNiwgMHgyNiwgMHgwMCwgMHgwNCwgMHgwOSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNiwgMHgyQSwKKwkgMHgwMCwgMHgwNCwgMHgwQSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNiwgMHgyRSwgMHgwMCwgMHgwNCwgMHgwQiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxMCwgMHgyNCwKKwkgMHgwNCwgMHgwNCwgMHgwQywgMHgwMSwgMHgwMCwgMHgwMCwgMHgxMCwgMHgyOCwgMHgwNCwgMHgwNCwgMHgwRCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxMCwgMHgyQywKKwkgMHgwNCwgMHgwNCwgMHgwRSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxMCwgMHgzMCwgMHgwNCwgMHgwNCwgMHgwRiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNCwgMHgzNCwKKwkgMHgwOCwgMHg4NCwgMHgxMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNCwgMHgzOCwgMHgwOCwgMHg4NCwgMHgxMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNCwgMHgzQywKKwkgMHgwOCwgMHg4NCwgMHgxMiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNCwgMHg0MCwgMHgwOCwgMHg4NCwgMHgxMywgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNywgMHg2NCwKKwkgMHgwQywgMHg4QiwgMHgxNCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNywgMHg2OCwgMHgwQywgMHg4QiwgMHgxNSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNywgMHg2QywKKwkgMHgwQywgMHg4QiwgMHgxNiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNywgMHg3MCwgMHgwQywgMHg4QiwgMHgxNywgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNywgMHg3NCwKKwkgMHgwQywgMHg4QiwgMHgxOCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNywgMHg3OCwgMHgwQywgMHg4QiwgMHgxOSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNywgMHg3QywKKwkgMHgwQywgMHg4QiwgMHgxQSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNywgMHg4MCwgMHgwQywgMHg4QiwgMHgxQiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNywgMHg4NCwKKwkgMHgwQywgMHg4QiwgMHgxQywgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNywgMHg4OCwgMHgwQywgMHg4QiwgMHgxRCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgxNywgMHg4QywKKwkgMHgwQywgMHg4QiwgMHgxRSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwRSwgMHg5NSwgMHgxNywgMHgwNCwgMHgxRiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwRSwgMHg5OSwKKwkgMHgxNywgMHgwNCwgMHgyMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwRSwgMHg5RCwgMHgxNywgMHgwNCwgMHgyMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwRSwgMHhBMSwKKwkgMHgxNywgMHgwNCwgMHgyMiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwRSwgMHhBNSwgMHgwMCwgMHgwMCwgMHg2MCwgMHgxMSwgMHg4MCwgMHgxMSwgMHhBMCwgMHgxMSwKKwkgMHhDMCwgMHgxMSwgMHgxOCwgMHgxMiwgMHg2OCwgMHgxMSwgMHg4OCwgMHgxMSwgMHhBOCwgMHgxMSwgMHhDOCwgMHgxMSwgMHgyMCwgMHgxMiwgMHg3MCwgMHgxMSwKKwkgMHg5MCwgMHgxMSwgMHhCMCwgMHgxMSwgMHhEMCwgMHgxMSwgMHgyOCwgMHgxMiwgMHg3OCwgMHgxMSwgMHg5OCwgMHgxMSwgMHhCOCwgMHgxMSwgMHhEOCwgMHgxMSwKKwkgMHgzMCwgMHgxMiwgMHhFMCwgMHgxMSwgMHhFOCwgMHgxMSwgMHhGMCwgMHgxMSwgMHhGOCwgMHgxMSwgMHgwMCwgMHgxMiwgMHgwOCwgMHgxMiwgMHgxMCwgMHgxMiwKKwkgMHgzOCwgMHgxMiwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgwQSwgMHgwQSwgMHg3RiwKKwkgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwKKwkgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwKKwkgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgxRSwgMHgwQSwgMHgwQSwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHgxMCwgMHgxMCwKKwkgMHgxMCwgMHgxMCwgMHgxNywgMHgxNywgMHgxNywgMHgxNywgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwKKwkgMHg3RiwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwKKwkgMHgxNCwgMHgxNCwgMHgxNCwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMSwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwKKwkgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHgwRSwgMHgwRSwgMHgwRSwgMHgwRSwgMHgwRSwKKwkgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNiwgMHgxNiwKKwkgMHgxNiwgMHgxNiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwKKwkgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHgwQSwgMHgwQSwgMHgwQSwgMHgwQSwgMHgwQSwgMHgwQSwKKwkgMHgwQSwgMHgwQSwgMHgwQSwgMHgwQSwgMHgwQSwgMHgwQSwgMHgwQSwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwKKwkgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHgwQSwKKwkgMHgwQSwgMHgwQSwgMHgwQSwgMHg3RiwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwKKwkgMHgxNCwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwKKwkgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHg3RiwgMHgxNCwgMHgxNCwKKwkgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgwQSwgMHgwQSwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwKKwkgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwKKwkgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwKKwkgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwKKwkgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwKKwkgMHg3RiwgMHg3RiwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwKKwkgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwKKwkgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg3RiwgMHg5RCwgMHg5RCwgMHhBMSwgMHhCNCwKKwkgMHgxMCwgMHgxMCwgMHgwMCwgMHg5RCwgMHgwOCwgMHgwMiwgMHgwNiwgMHgwMCwgMHhBNSwgMHhBNSwgMHhBQSwgMHhCNCwgMHgxMCwgMHgxMCwgMHgwMCwgMHhBMiwKKwkgMHgxNSwgMHgwNSwgMHgwNywgMHgwMCwgMHhBQSwgMHhBQSwgMHhCNCwgMHhCNCwgMHgxMCwgMHgxMCwgMHgwMCwgMHhBNywgMHgxQywgMHgwQSwgMHgwOCwgMHgwMCwKKwkgMHhCNywgMHhCNywgMHhDMSwgMHhDMSwgMHgxMCwgMHgxMCwgMHgwMCwgMHhCNCwgMHgyOSwgMHgxNywgMHgwOCwgMHgwMCwgMHhCRCwgMHhCRCwgMHhDNywgMHhDNywKKwkgMHgxMCwgMHgxMCwgMHgwMCwgMHhCQSwgMHgyRiwgMHgxRCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDNCwgMHgxRiwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHg0MiwgMHgyQSwgMHg1QiwgMHgyQSwgMHg3RSwgMHgyQSwgMHg3MSwgMHgzMCwgMHhFRSwgMHgyOSwgMHg4OCwgMHgzMCwgMHhCOCwgMHgyQSwKKwkgMHg5RiwgMHgzMCwgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwgMHgyMSwgMHgzNSwgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwKKwkgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwgMHg5MywgMHgyQywgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwKKwkgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwKKwkgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwgMHhERSwgMHgyQywgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwKKwkgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwKKwkgMHhFRSwgMHgyOSwgMHg2MSwgMHgyQywgMHg3QywgMHgyQywgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwKKwkgMHhFRSwgMHgyOSwgMHhFMSwgMHgyNywgMHhENywgMHgyQSwgMHhFQSwgMHgyQSwgMHg5QSwgMHgyQiwgMHg5RSwgMHgyQiwgMHhFRSwgMHgyOSwgMHhFRSwgMHgyOSwKKwkgMHg0RCwgMHgyQywgMHhBMSwgMHhGMiwgMHg2MiwgMHhGMiwgMHgwMCwgMHgwMCwgMHg5OSwgMHhGMiwgMHhFRSwgMHhGMiwgMHgxMiwgMHhGMywgMHg0OCwgMHhGMywKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgyQSwgMHg5NCwgMHgyQSwgMHgwMCwgMHgwMCwgMHg2NywgMHgzMCwgMHg3RSwgMHgzMCwgMHg5NSwgMHgzMCwKKwkgMHhBRiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhGQywgMHg0NSwgMHgyRCwgMHhGNywgMHgyRiwgMHg1QSwgMHgwMCwgMHgwMiwgMHgwMCwKKwkgMHhGOSwgMHhGRiwgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHhGQywgMHgwMCwgMHgwMiwgMHgwMCwgMHhGNywgMHhGRiwgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwKKwkgMHhBQSwgMHgyRCwgMHgwNiwgMHgwMCwgMHhGMCwgMHhGRiwgMHg0NSwgMHgyRCwgMHgyMiwgMHgyRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHhGNiwgMHhGRiwKKwkgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHg2QywgMHgwMCwgMHgwMiwgMHgwMCwgMHhGNCwgMHhGRiwgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHhBNiwgMHgwMSwKKwkgMHgwMiwgMHgwMCwgMHhGNSwgMHhGRiwgMHg0NSwgMHgyRCwgMHgwMCwgMHgzMCwgMHg5QywgMHgyRCwgMHgwMiwgMHgwMCwgMHhFRCwgMHhGRiwgMHg0NSwgMHgyRCwKKwkgMHgxMiwgMHgzMCwgMHg5OCwgMHgzMiwgMHgwMiwgMHgwMCwgMHhFQywgMHhGRiwgMHg0NSwgMHgyRCwgMHg0MCwgMHgzMCwgMHg5QSwgMHgzMiwgMHgwMiwgMHgwMCwKKwkgMHhFQiwgMHhGRiwgMHg0NSwgMHgyRCwgMHg0NiwgMHgzMCwgMHg5QywgMHgzMiwgMHgwMiwgMHgwMCwgMHhFRSwgMHhGRiwgMHg0NSwgMHgyRCwgMHg0QywgMHgzMCwKKwkgMHgxMiwgMHgzMywgMHgwMiwgMHgwMCwgMHhEQSwgMHhGRiwgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHhGMiwgMHgxMywgMHgwQywgMHgwMCwgMHhFQSwgMHhGRiwKKwkgMHg0NSwgMHgyRCwgMHgyMiwgMHgyRCwgMHg0QywgMHgzMywgMHgwNiwgMHgwMCwgMHhFOSwgMHhGRiwgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHg1MiwgMHgzMywKKwkgMHgwMiwgMHgwMCwgMHhFOCwgMHhGRiwgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHg1NCwgMHgzMywgMHgwMiwgMHgwMCwgMHhFNywgMHhGRiwgMHg0NSwgMHgyRCwKKwkgMHg1QiwgMHgyRCwgMHg1NiwgMHgzMywgMHgwMiwgMHgwMCwgMHhFNiwgMHhGRiwgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHg1OCwgMHgzMywgMHgwMiwgMHgwMCwKKwkgMHhFNSwgMHhGRiwgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHg1QSwgMHgzMywgMHgxMCwgMHgwMCwgMHhFNCwgMHhGRiwgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwKKwkgMHg2QSwgMHgzMywgMHgxOCwgMHgwMCwgMHhEQiwgMHhGRiwgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHg4MiwgMHgzMywgMHgwMiwgMHgwMCwgMHhEQywgMHhGRiwKKwkgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHg4NCwgMHgzMywgMHgwMiwgMHgwMCwgMHhFMSwgMHhGRiwgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHg1QSwgMHgzNCwKKwkgMHgwMiwgMHgwMCwgMHhFMCwgMHhGRiwgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHg1OCwgMHgzNCwgMHgwMiwgMHgwMCwgMHhFMywgMHhGRiwgMHg0NSwgMHgyRCwKKwkgMHg1QiwgMHgyRCwgMHgzQywgMHgzNCwgMHgwMiwgMHgwMCwgMHhFMiwgMHhGRiwgMHg5MywgMHgyRCwgMHgyMiwgMHgyRCwgMHhGMiwgMHgzMywgMHgyNCwgMHgwMCwKKwkgMHgwMywgMHhGQywgMHg0NSwgMHgyRCwgMHgwMSwgMHgyRiwgMHg4QywgMHgzMiwgMHgwMiwgMHgwMCwgMHgwNCwgMHhGQywgMHg0NSwgMHgyRCwgMHg1NSwgMHgyRCwKKwkgMHhCNCwgMHgyRCwgMHgyMiwgMHgwMCwgMHgwNiwgMHhGQywgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHg5QSwgMHgyRCwgMHgwMiwgMHgwMCwgMHgwNywgMHhGQywKKwkgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHhGOCwgMHgyRCwgMHgwMiwgMHgwMCwgMHgwRSwgMHhGQywgMHg0NSwgMHgyRCwgMHgyQSwgMHgyRiwgMHgwMiwgMHgyRSwKKwkgMHgyMiwgMHgwMCwgMHhCMSwgMHhGQywgMHg0NSwgMHgyRCwgMHgzOSwgMHgzMSwgMHgwMCwgMHgyRiwgMHgwMiwgMHgwMCwgMHgyMCwgMHhGQywgMHg0NSwgMHgyRCwKKwkgMHg1QiwgMHgyRCwgMHgyOCwgMHgyRSwgMHgwMiwgMHgwMCwgMHgyNSwgMHhGQywgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHgzNCwgMHgyRSwgMHgwMiwgMHgwMCwKKwkgMHgyNiwgMHhGQywgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHgzNiwgMHgyRSwgMHgwMiwgMHgwMCwgMHgyNywgMHhGQywgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwKKwkgMHgzOCwgMHgyRSwgMHgwMiwgMHgwMCwgMHhCMiwgMHhGQywgMHg0NSwgMHgyRCwgMHg1NSwgMHgyRCwgMHgyNCwgMHgyRiwgMHgyMiwgMHgwMCwgMHhDMSwgMHhGQywKKwkgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHg5RSwgMHgzMywgMHgyMCwgMHgwMCwgMHhCMCwgMHhGQywgMHgxOCwgMHgyRCwgMHgzRCwgMHgzMSwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHhDNCwgMHhGQywgMHgxOCwgMHgyRCwgMHg1NywgMHgzMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwgMHhDOCwgMHhGQywgMHgxOCwgMHgyRCwKKwkgMHg1NSwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwgMHhCNCwgMHhGQywgMHgxOCwgMHgyRCwgMHg3MSwgMHgzMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHhCNiwgMHhGQywgMHgxOCwgMHgyRCwgMHgxOSwgMHgzMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCNywgMHhGQywgMHgxOCwgMHgyRCwgMHg0MywgMHgzMiwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCOCwgMHhGQywgMHgxOCwgMHgyRCwgMHg5OSwgMHgzMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQywgMHhGQywKKwkgMHgxOCwgMHgyRCwgMHhEMiwgMHgzMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCRCwgMHhGQywgMHgxOCwgMHgyRCwgMHg1OCwgMHgzMywgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHhCRSwgMHhGQywgMHgxOCwgMHgyRCwgMHg4MiwgMHgzMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCRiwgMHhGQywgMHgxOCwgMHgyRCwKKwkgMHhDRiwgMHgzMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMywgMHhGQywgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHhBMCwgMHgwRiwgMHgxMCwgMHgwMCwKKwkgMHhCNSwgMHhGQywgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHgzOCwgMHgzNCwgMHgwMiwgMHgwMCwgMHhCOSwgMHhGQywgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwKKwkgMHgzQSwgMHgzNCwgMHgwMiwgMHgwMCwgMHg5MCwgMHhGRCwgMHg0NSwgMHgyRCwgMHgyMiwgMHgyRCwgMHgzRSwgMHgzNCwgMHgwMiwgMHgwMCwgMHg4OCwgMHhGQywKKwkgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHg3MiwgMHgzMiwgMHgwNCwgMHgwMCwgMHg4OSwgMHhGQywgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHg3NiwgMHgzMiwKKwkgMHgwNCwgMHgwMCwgMHhDNSwgMHhGQywgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHg3QSwgMHgzMiwgMHgwNCwgMHgwMCwgMHgyMywgMHhGQywgMHg0NSwgMHgyRCwKKwkgMHg1QiwgMHgyRCwgMHgyRSwgMHgyRSwgMHgwNCwgMHgwMCwgMHgyQSwgMHhGQywgMHg0NSwgMHgyRCwgMHhFOSwgMHgyRCwgMHhCMCwgMHgyRCwgMHgwMiwgMHgwMCwKKwkgMHhDNywgMHhGRCwgMHg0NSwgMHgyRCwgMHgyMiwgMHgyRCwgMHhBMCwgMHgzMiwgMHgwQSwgMHgwMCwgMHgyOSwgMHhGQywgMHgzQywgMHgyRSwgMHgwMCwgMHgyRSwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMiwgMHhGQywgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHg4MCwgMHgzMiwgMHgwOCwgMHgwMCwgMHgzMiwgMHhGQywKKwkgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHg5OCwgMHgwMSwgMHgwMiwgMHgwMCwgMHgzMywgMHhGQywgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHg5QSwgMHgwMSwKKwkgMHgwMiwgMHgwMCwgMHgzNSwgMHhGQywgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHg4OCwgMHgzMiwgMHgwMiwgMHgwMCwgMHhDNywgMHhGQywgMHg0NSwgMHgyRCwKKwkgMHhEMywgMHgyRiwgMHg4QSwgMHgzMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGQywgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHhCMiwgMHgyRCwgMHgwMiwgMHgwMCwKKwkgMHgwMSwgMHhGQywgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHhBQSwgMHgyRCwgMHgwNiwgMHgwMCwgMHgwMiwgMHhGQywgMHg0NSwgMHgyRCwgMHhENSwgMHgyRCwKKwkgMHgwMiwgMHgyRiwgMHgyMiwgMHgwMCwgMHgwNSwgMHhGQywgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHhBMCwgMHgyRCwgMHgwMiwgMHgwMCwgMHgwOCwgMHhGQywKKwkgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHhBNCwgMHgyRCwgMHgwNiwgMHgwMCwgMHgwOSwgMHhGQywgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHhGQSwgMHgyRCwKKwkgMHgwMiwgMHgwMCwgMHgwQiwgMHhGQywgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHhGQywgMHgyRCwgMHgwMiwgMHgwMCwgMHgwQywgMHhGQywgMHg0NSwgMHgyRCwKKwkgMHg1QiwgMHgyRCwgMHhGRSwgMHgyRCwgMHgwMiwgMHgwMCwgMHgwRCwgMHhGQywgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHgwMCwgMHgyRSwgMHgwMiwgMHgwMCwKKwkgMHgyMSwgMHhGQywgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHgyQSwgMHgyRSwgMHgwMiwgMHgwMCwgMHg4MCwgMHhGQywgMHhCMSwgMHgyRCwgMHhDMSwgMHgyRCwKKwkgMHg0MCwgMHgyRSwgMHhDMCwgMHgwMCwgMHg4MSwgMHhGQywgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHhBNCwgMHgwMSwgMHgwMiwgMHgwMCwgMHg4MywgMHhGQywKKwkgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHhBOCwgMHgwMSwgMHgwMiwgMHgwMCwgMHg4NSwgMHhGQywgMHg0NSwgMHgyRCwgMHg0QSwgMHgyRiwgMHhBMCwgMHgwMSwKKwkgMHgwMiwgMHgwMCwgMHg4NiwgMHhGQywgMHg0NSwgMHgyRCwgMHg2RSwgMHgyRiwgMHhCMCwgMHgwMSwgMHgwMiwgMHgwMCwgMHgyOCwgMHhGQywgMHg0NSwgMHgyRCwKKwkgMHg1QiwgMHgyRCwgMHgzQSwgMHgyRSwgMHgwMiwgMHgwMCwgMHg5MCwgMHhGQywgMHg0NSwgMHgyRCwgMHg1QywgMHgyRiwgMHhBMiwgMHgwMSwgMHgwMiwgMHgwMCwKKwkgMHg4NywgMHhGQywgMHg0NSwgMHgyRCwgMHg4QywgMHgyRiwgMHg1MCwgMHgyRiwgMHgyMiwgMHgwMywgMHgzMCwgMHhGQywgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwKKwkgMHgzQywgMHgyRSwgMHgwMiwgMHgwMCwgMHg4NCwgMHhGQywgMHg0NSwgMHgyRCwgMHg5MiwgMHgyRiwgMHhBQywgMHgwMSwgMHgwNCwgMHgwMCwgMHgyQiwgMHhGQywKKwkgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHhFMiwgMHgzNywgMHgwMiwgMHgwMCwgMHhGOCwgMHhGRiwgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHhEQywgMHgzNywKKwkgMHgwMiwgMHgwMCwgMHhGMywgMHhGRiwgMHg0NSwgMHgyRCwgMHg1QiwgMHgyRCwgMHhFNCwgMHgzNywgMHgwMiwgMHgwMCwgMHgyMCwgMHhGRCwgMHg3NiwgMHgyRCwKKwkgMHgyMiwgMHgyRCwgMHg1RSwgMHg0MCwgMHgwOCwgMHgwMCwgMHgyMSwgMHhGRCwgMHg3NiwgMHgyRCwgMHgyMiwgMHgyRCwgMHg2MiwgMHg0MCwgMHgwQSwgMHgwMCwKKwkgMHgyMiwgMHhGRCwgMHg3NiwgMHgyRCwgMHgyMiwgMHgyRCwgMHg2NywgMHg0MCwgMHgxNiwgMHgwMCwgMHgyMywgMHhGRCwgMHg3NiwgMHgyRCwgMHgyMiwgMHgyRCwKKwkgMHg3MiwgMHg0MCwgMHgwQSwgMHgwMCwgMHg0NSwgMHhGRCwgMHg0NSwgMHgyRCwgMHgyMiwgMHgyRCwgMHhGQywgMHgwMCwgMHgwMiwgMHgwMCwgMHg0NywgMHhGRCwKKwkgMHg0NSwgMHgyRCwgMHgyMiwgMHgyRCwgMHg3MiwgMHgwMSwgMHgwMiwgMHgwMCwgMHg0OCwgMHhGRCwgMHg5MSwgMHgyRSwgMHgyMiwgMHgyRCwgMHg5OCwgMHgwMSwKKwkgMHgwMiwgMHgwMCwgMHg0OSwgMHhGRCwgMHg5MSwgMHgyRSwgMHgyMiwgMHgyRCwgMHg5QSwgMHgwMSwgMHgwMiwgMHgwMCwgMHg0QSwgMHhGRCwgMHg0NSwgMHgyRCwKKwkgMHgyMiwgMHgyRCwgMHg5MiwgMHgwMSwgMHgwMiwgMHgwMCwgMHg0QiwgMHhGRCwgMHg0NSwgMHgyRCwgMHgyMiwgMHgyRCwgMHg5NCwgMHgwMSwgMHgwMiwgMHgwMCwKKwkgMHg0RCwgMHhGRCwgMHg3NiwgMHgyRCwgMHgyMiwgMHgyRCwgMHg3NywgMHg0MCwgMHgwQywgMHgwMCwgMHg0RiwgMHhGRCwgMHhBNSwgMHgyRSwgMHgyMiwgMHgyRCwKKwkgMHg5MCwgMHgzMiwgMHgwMiwgMHgwMCwgMHhDMiwgMHhGRCwgMHg5QiwgMHgyRSwgMHgyMiwgMHgyRCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg0MCwgMHhGRCwKKwkgMHg2RSwgMHgyRCwgMHgyMiwgMHgyRCwgMHhCNiwgMHgwMSwgMHgwMiwgMHgwMCwgMHgyNCwgMHhGRCwgMHhCNSwgMHgyRSwgMHgyMiwgMHgyRCwgMHgwMCwgMHgwMCwKKwkgMHgwMiwgMHgwMCwgMHg5MSwgMHhGRCwgMHg0NSwgMHgyRCwgMHgyMiwgMHgyRCwgMHhDNiwgMHgyNSwgMHgwMiwgMHgwMCwgMHg5MywgMHhGRCwgMHg0NSwgMHgyRCwKKwkgMHgyMiwgMHgyRCwgMHhDQywgMHgyNSwgMHgwMiwgMHgwMCwgMHg4RiwgMHhGRCwgMHhENSwgMHgyRSwgMHgyMiwgMHgyRCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwKKwkgMHhDMSwgMHhGRCwgMHgwMCwgMHgzMSwgMHgyMiwgMHgyRCwgMHhGQSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhDNiwgMHhGRCwgMHg0NSwgMHgyRCwgMHgyMiwgMHgyRCwKKwkgMHhGOCwgMHgzNywgMHgwNCwgMHgwMCwgMHgyNSwgMHhGRCwgMHg0NSwgMHgyRCwgMHgyMiwgMHgyRCwgMHg5RSwgMHgwMSwgMHgwMiwgMHgwMCwgMHg4OSwgMHhGRCwKKwkgMHhCOSwgMHgzMCwgMHgyMiwgMHgyRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHhGRCwgMHg5MywgMHgyRCwgMHgyMiwgMHgyRCwgMHgxMiwgMHgzNCwKKwkgMHgyNCwgMHgwMCwgMHg0MSwgMHhGRCwgMHg0NSwgMHgyRCwgMHgyMiwgMHgyRCwgMHhCRSwgMHgzMywgMHgyMiwgMHgwMCwgMHg0MiwgMHhGRCwgMHg0NSwgMHgyRCwKKwkgMHgyMiwgMHgyRCwgMHhGRSwgMHgwMCwgMHgwNiwgMHgwMCwgMHg0MywgMHhGRCwgMHhDMiwgMHgyRSwgMHgyMiwgMHgyRCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwKKwkgMHg0NCwgMHhGRCwgMHhBQywgMHgyRSwgMHgyMiwgMHgyRCwgMHhCMiwgMHgwMSwgMHgwMiwgMHgwMCwgMHg0NiwgMHhGRCwgMHgyMSwgMHgzMSwgMHgyMiwgMHgyRCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0QywgMHhGRCwgMHg0NSwgMHgyRCwgMHgyMiwgMHgyRCwgMHg0NiwgMHgyRiwgMHgwMiwgMHgwMCwgMHg1MCwgMHhGRCwKKwkgMHg0NSwgMHgyRCwgMHgyMiwgMHgyRCwgMHhGMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHg1MSwgMHhGRCwgMHg0NSwgMHgyRCwgMHgyMiwgMHgyRCwgMHhGNCwgMHgwMCwKKwkgMHgwMiwgMHgwMCwgMHg1MiwgMHhGRCwgMHg0NSwgMHgyRCwgMHgyMiwgMHgyRCwgMHhDNCwgMHgwMSwgMHgwMiwgMHgwMCwgMHg4QywgMHhGRCwgMHgzOCwgMHgyRCwKKwkgMHgyMiwgMHgyRCwgMHg5OCwgMHgzNCwgMHg1NiwgMHgwMCwgMHg4RCwgMHhGRCwgMHgzOCwgMHgyRCwgMHgyMiwgMHgyRCwgMHhGMiwgMHgzNCwgMHgxNCwgMHgwMCwKKwkgMHgwMCwgMHhGMSwgMHg0NiwgMHgwMCwgMHhEQywgMHgyQywgMHgzNiwgMHgwMSwgMHgwMSwgMHhGMSwgMHg4NCwgMHgwNywgMHhEQSwgMHgyQywgMHgzOCwgMHgwMSwKKwkgMHgwMCwgMHgwMywgMHhBMCwgMHg4MCwgMHgxRSwgMHgwMCwgMHg3MCwgMHgwMSwgMHhGQSwgMHgwMCwgMHhENCwgMHgwMSwgMHhGRSwgMHgwMCwgMHgzQSwgMHgwMSwKKwkgMHhCNiwgMHgwMSwgMHhDQywgMHgyQywgMHg1NCwgMHgwMSwgMHhDNiwgMHgyNSwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMCwgMHgxRCwgMHgwMCwgMHgwMCwKKwkgMHhDNCwgMHgxRiwgMHg0RSwgMHgwMSwgMHgwQiwgMHgwMCwgMHhCOCwgMHgwMCwgMHhFQywgMHgwMCwgMHg0NCwgMHgwMCwgMHg0NiwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxQywgMHgwOSwgMHgwOCwgMHgyNCwgMHgyOCwgMHgwNiwgMHgwQywgMHgxOCwgMHgwOCwgMHgzMCwgMHgxNCwgMHgwQywKKwkgMHgwOCwgMHgzNiwgMHgxMCwgMHgxMiwgMHgyNCwgMHhCNywgMHg5NywgMHhCNiwgMHhBMywgMHhCNywgMHhBQywgMHhCNywgMHhBOCwgMHhCNiwgMHgzRSwgMHhCNywKKwkgMHgxNiwgMHhCNywgMHg3OSwgMHgzRSwgMHg1NywgMHgzRCwgMHg3OSwgMHgzRSwgMHhGOSwgMHgzRCwgMHg1RiwgMHgzRCwgMHg1MiwgMHgzRCwgMHgzMywgMHgzRSwKKwkgMHg1NSwgMHgzRSwgMHg2QSwgMHgzRSwgMHhBQywgMHgzRSwgMHhEOCwgMHgzRSwgMHhGOCwgMHgzRCwgMHgyMiwgMHg0NiwgMHgyMiwgMHg0NiwgMHgyMiwgMHg0NiwKKwkgMHgyMiwgMHg0NiwgMHgyMiwgMHg0NiwgMHgyMiwgMHg0NiwgMHgyMiwgMHg0NiwgMHgyMiwgMHg0NiwgMHgyMiwgMHg0NiwgMHgyMiwgMHg0NiwgMHgyMiwgMHg0NiwKKwkgMHgyMywgMHg0NiwgMHgyMywgMHg0NiwgMHgyMywgMHg0NiwgMHgxQywgMHg0NywgMHgxQywgMHg0NywgMHgxQywgMHg0NywgMHgxQywgMHg0NywgMHgxQywgMHg0NywKKwkgMHgxQywgMHg0NywgMHgxQywgMHg0NywgMHgxQywgMHg0NywgMHgxQywgMHg0NywgMHgxQywgMHg0NywgMHgxQywgMHg0NywgMHgxQywgMHg0NywgMHgxQywgMHg0NywKKwkgMHgxRCwgMHg0NywgMHg5QSwgMHg0OCwgMHhEQSwgMHg0OCwgMHgxQSwgMHg0OCwgMHg1QSwgMHg0OCwgMHg5QSwgMHg0OCwgMHhEQSwgMHg0OCwgMHgxQSwgMHg0OCwKKwkgMHg1QSwgMHg0OCwgMHg5QSwgMHg0OCwgMHhEQSwgMHg0OCwgMHgxQSwgMHg0OCwgMHg1QSwgMHg0OCwgMHg5QSwgMHg0OCwgMHgzMywgMHg0OCwgMHg3OCwgMHg0OSwKKwkgMHg3OCwgMHg0OSwgMHg3OSwgMHg0OSwgMHg3OSwgMHg0OSwgMHg3OSwgMHg0OSwgMHg3OSwgMHg0OSwgMHg3QSwgMHg0OSwgMHg3QSwgMHg0OSwgMHg3QSwgMHg0OSwKKwkgMHg3QSwgMHg0OSwgMHg3QiwgMHg0OSwgMHg3QiwgMHg0OSwgMHg3QiwgMHg0OSwgMHg3QywgMHg0OSwgMHhEOCwgMHgwMywgMHhEQywgMHgwMywgMHhFMCwgMHgwMywKKwkgMHhFNCwgMHgwMywgMHhGMCwgMHgwMywgMHhGNCwgMHgwMywgMHhGOCwgMHgwMywgMHgwQSwgMHgwNCwgMHgwRSwgMHgwNCwgMHgxMiwgMHgwNCwgMHgxNiwgMHgwNCwKKwkgMHgwQywgMHgwNCwgMHgxMCwgMHgwNCwgMHgxNCwgMHgwNCwgMHgxOCwgMHgwNCwgMHgxQywgMHgwNCwgMHgyMCwgMHgwNCwgMHgyNCwgMHgwNCwgMHgyOCwgMHgwNCwKKwkgMHg0QywgMHgwNCwgMHg1MCwgMHgwNCwgMHg1NCwgMHgwNCwgMHg1OCwgMHgwNCwgMHg1QywgMHgwNCwgMHg2MCwgMHgwNCwgMHg2NCwgMHgwNCwgMHg2OCwgMHgwNCwKKwkgMHg2QywgMHgwNCwgMHg3MCwgMHgwNCwgMHg3NCwgMHgwNCwgMHg3RCwgMHgwNCwgMHg4MSwgMHgwNCwgMHg4NSwgMHgwNCwgMHg4OSwgMHgwNCwgMHg4RCwgMHgwNCwKKwkgMHgxMCwgMHgwMCwgMHg4RSwgMHgxOSwgMHhBQywgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgzQywgMHgwQywgMHgwMCwgMHgwMCwKKwkgMHhGRiwgMHgzRiwgMHg0NCwgMHgwNCwgMHgwMCwgMHgwMCwgMHhEMywgMHgyMiwgMHg0NCwgMHgwNCwgMHg5QywgMHgwMiwgMHhDQiwgMHg1NCwgMHg0NCwgMHgwNCwKKwkgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHg0NCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwQywgMHg3MSwgMHgwMCwgMHgzMCwgMHg1MCwKKwkgMHgyMCwgMHgwMCwgMHg4MCwgMHhCRiwgMHgxRiwgMHhBNiwgMHgyOCwgMHgwMCwgMHgwQiwgMHgwMiwgMHg2MCwgMHg4NCwgMHg0QywgMHgwMCwgMHgwMiwgMHgwMCwKKwkgMHg0QiwgMHgxQywgMHg5OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwQiwgMHgzNCwgMHgwNCwgMHhGRCwgMHgzNCwgMHgzNCwgMHgwMCwgMHgzOCwgMHgwNCwKKwkgMHhGRCwgMHgzNCwgMHgzNCwgMHgwMCwgMHgzQywgMHgwNCwgMHgwMSwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwgMHg1MiwgMHgxNCwgMHgwMCwKKwkgMHgwNCwgMHgwOCwgMHgwRSwgMHgzMiwgMHgwMCwgMHhBNiwgMHgxMCwgMHgwOCwgMHhDNCwgMHgwMywgMHg1MCwgMHg2MCwgMHgxOCwgMHgwOCwgMHhGMCwgMHgzRiwKKwkgMHhGQywgMHgwMSwgMHgxMCwgMHgwQywgMHgwMCwgMHgwMCwgMHg4MCwgMHgwNCwgMHgxNCwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MSwgMHgyMCwgMHgwQywKKwkgMHhCMCwgMHgwMCwgMHhCMCwgMHhCOCwgMHgyNCwgMHgwQywgMHgwMCwgMHgwMCwgMHhBQiwgMHgwNSwgMHgyQywgMHgwQywgMHg4MCwgMHgwNSwgMHgwMCwgMHhGRiwKKwkgMHgzMCwgMHgwQywgMHgwMCwgMHgwMCwgMHhCMCwgMHgwNCwgMHgzNCwgMHgwQywgMHgwMywgMHgwMCwgMHgwMCwgMHhFOCwgMHg0NCwgMHgwQywgMHgwNCwgMHgwMCwKKwkgMHhGRiwgMHgwRiwgMHgwMCwgMHgxMCwgMHgyRSwgMHgwMCwgMHgwQywgMHhFMywgMHg0NCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwNCwgMHg0NCwgMHgwNCwKKwkgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHg0NCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHg0NCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwNCwKKwkgMHg0NCwgMHgwNCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMywgMHg0OCwgMHgwQywgMHgwMCwgMHgwMCwgMHg3RiwgMHgwMCwgMHgwNCwgMHgwNCwgMHgwOCwgMHg0OCwKKwkgMHgwMCwgMHgwMCwgMHgwNCwgMHgwNCwgMHgwOCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgMHg3MSwgMHgwMCwgMHgzMCwgMHgzMCwgMHgwMCwgMHgwMCwKKwkgMHg1RSwgMHg0MCwgMHgwMSwgMHgwMCwgMHgxOCwgMHgwMCwgMHgzNiwgMHhDMCwgMHhFOCwgMHgwRSwgMHgxQywgMHgwMCwgMHg3OCwgMHhDOCwgMHhBNSwgMHg0MCwKKwkgMHgyNCwgMHgwMCwgMHg5RSwgMHhCMCwgMHhCOSwgMHg5NSwgMHgwOCwgMHgwOCwgMHgwMCwgMHhFQSwgMHg0MCwgMHgwMSwgMHgwQywgMHgwOCwgMHgwMCwgMHhFQSwKKwkgMHgwMCwgMHgwMCwgMHgxQywgMHgwOCwgMHgwMCwgMHgwMCwgMHg0MiwgMHgwNywgMHgyMCwgMHgwOCwgMHg3QiwgMHgwMCwgMHhENCwgMHgwOSwgMHgyQywgMHgwNCwKKwkgMHgxNCwgMHgwMCwgMHg1MCwgMHgxNCwgMHgzMCwgMHgwNCwgMHgyOCwgMHgwRiwgMHgyOCwgMHg3RiwgMHgxOCwgMHgwOCwgMHgyMCwgMHgwMCwgMHhGQywgMHgwMSwKKwkgMHgwNCwgMHgxMCwgMHg2OSwgMHgwMCwgMHhGRCwgMHhDMywgMHgwOCwgMHgxMCwgMHg2OSwgMHgwMCwgMHhGRCwgMHhDMywgMHgwOCwgMHgwQywgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHg0OCwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0OCwgMHgwQywgMHgwMCwgMHgwMCwgMHg3RiwgMHgwMCwgMHgwNCwgMHgwNCwKKwkgMHgwOCwgMHg0OCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1RSwgMHg0OCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwNCwgMHgwOCwgMHg0MCwgMHgwMiwgMHgwMCwKKwkgMHgwMCwgMHgwQywgMHg3MSwgMHgwMCwgMHgzMCwgMHg1MCwgMHgwMCwgMHgwMCwgMHg1RSwgMHg0OCwgMHgwMSwgMHgwMCwgMHgxOCwgMHgwMCwgMHgzQSwgMHhDMCwKKwkgMHhFOCwgMHgwNCwgMHgxQywgMHgwMCwgMHg3OCwgMHhEMCwgMHhBNSwgMHg0MCwgMHgyNCwgMHgwMCwgMHg5RSwgMHhCMCwgMHhCOSwgMHg4NSwgMHgyQywgMHgwNCwKKwkgMHgxNCwgMHgwMCwgMHg1MCwgMHgxNCwgMHgzMCwgMHgwNCwgMHgyOCwgMHgwRiwgMHgyOCwgMHg3RiwgMHgwOCwgMHgwOCwgMHgwMCwgMHhFQSwgMHg0MCwgMHgwMSwKKwkgMHgwQywgMHgwOCwgMHgwMCwgMHhFQSwgMHgwMCwgMHgwMCwgMHgxQywgMHgwOCwgMHgwMCwgMHgwMCwgMHg0MiwgMHgwNywgMHgyMCwgMHgwOCwgMHg3QiwgMHgwMCwKKwkgMHhENCwgMHgwOSwgMHgxOCwgMHgwOCwgMHhGMCwgMHgzRiwgMHhGQywgMHgwMSwgMHgwNCwgMHgxMCwgMHg2OSwgMHgwMCwgMHhERCwgMHhDRCwgMHgwOCwgMHgxMCwKKwkgMHg2OSwgMHgwMCwgMHhERCwgMHhDRCwgMHgwOCwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0OCwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwOCwgMHgwNCwgMHg0MCwgMHgwMSwgMHg0MSwgMHgwMSwgMHgwQywgMHgwNCwgMHg0MCwgMHgwNCwgMHg0MSwgMHgwNCwgMHgxMCwgMHgwNCwgMHhENiwgMHgwOCwKKwkgMHg1NiwgMHgwQSwgMHgxNCwgMHgwNCwgMHg0MiwgMHgwMiwgMHg1NiwgMHgwQSwgMHgxOCwgMHgwNCwgMHg1NiwgMHgwQSwgMHg0MCwgMHgwMiwgMHgxQywgMHgwNCwKKwkgMHg0MiwgMHgwQSwgMHg0MiwgMHgyQSwgMHgyMCwgMHgwNCwgMHhDMiwgMHgwMCwgMHhENiwgMHgwOCwgMHgyNCwgMHgwNCwgMHhENiwgMHgwOCwgMHhDMCwgMHgwMCwKKwkgMHgyOCwgMHgwNCwgMHhDMiwgMHgwOCwgMHhDMiwgMHgyOCwgMHgwOCwgMHgwNCwgMHg0MCwgMHgwMSwgMHg0MSwgMHgwMSwgMHgwQywgMHgwNCwgMHgwMCwgMHgwMSwKKwkgMHgwMSwgMHgwMSwgMHgxMCwgMHgwNCwgMHg1NiwgMHgwQSwgMHg1NiwgMHgwQSwgMHgxNCwgMHgwNCwgMHg0MiwgMHgwMiwgMHg1NiwgMHgwQSwgMHgxOCwgMHgwNCwKKwkgMHg1NiwgMHgwQSwgMHg0MCwgMHgwMiwgMHgxQywgMHgwNCwgMHg0MiwgMHgwQSwgMHg0MiwgMHgyQSwgMHgyMCwgMHgwNCwgMHg0MiwgMHgwMiwgMHg1NiwgMHgwQSwKKwkgMHgyNCwgMHgwNCwgMHg1NiwgMHgwQSwgMHg0MCwgMHgwMiwgMHgyOCwgMHgwNCwgMHg0MiwgMHgwQSwgMHg0MiwgMHgyQSwgMHgwOCwgMHgwNCwgMHg0MCwgMHgwMSwKKwkgMHg0MSwgMHgwMSwgMHgwQywgMHgwNCwgMHg0MCwgMHgwNCwgMHg0MSwgMHgwNCwgMHgxMCwgMHgwNCwgMHhDRSwgMHgwOCwgMHg0RSwgMHgwQSwgMHgxNCwgMHgwNCwKKwkgMHg0MiwgMHgwMiwgMHg0RSwgMHgwQSwgMHgxOCwgMHgwNCwgMHg0RSwgMHgwQSwgMHg0MCwgMHgwMiwgMHgxQywgMHgwNCwgMHg0MiwgMHgwQSwgMHg0MiwgMHgyQSwKKwkgMHgyMCwgMHgwNCwgMHhDMiwgMHgwMCwgMHhDRSwgMHgwOCwgMHgyNCwgMHgwNCwgMHhDRSwgMHgwOCwgMHhDMCwgMHgwMCwgMHgyOCwgMHgwNCwgMHhDMiwgMHgwOCwKKwkgMHhDMiwgMHgyOCwgMHgwOCwgMHgwNCwgMHg0MCwgMHgwMSwgMHg0MSwgMHgwMSwgMHgwQywgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMSwgMHgxMCwgMHgwNCwKKwkgMHg0RSwgMHgwQSwgMHg0RSwgMHgwQSwgMHgxNCwgMHgwNCwgMHg0MiwgMHgwMiwgMHg0RSwgMHgwQSwgMHgxOCwgMHgwNCwgMHg0RSwgMHgwQSwgMHg0MCwgMHgwMiwKKwkgMHgxQywgMHgwNCwgMHg0MiwgMHgwQSwgMHg0MiwgMHgyQSwgMHgyMCwgMHgwNCwgMHg0MiwgMHgwMiwgMHg0RSwgMHgwQSwgMHgyNCwgMHgwNCwgMHg0RSwgMHgwQSwKKwkgMHg0MCwgMHgwMiwgMHgyOCwgMHgwNCwgMHg0MiwgMHgwQSwgMHg0MiwgMHgyQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwKKwkgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMywgMHgwMCwgMHgwNSwgMHgwMCwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwKKwkgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwKKwkgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwKKwkgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwKKwkgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNiwgMHhBMCwgMHgxNywgMHhBMCwgMHgxNywgMHhBMCwgMHgxNywgMHhBMCwgMHgxOCwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwKKwkgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwKKwkgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwKKwkgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwKKwkgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHhGRiwgMHgwNiwgMHgwMCwgMHgwMCwgMHg2NSwgMHgwMCwKKwkgMHg2NSwgMHgwMCwgMHg2NSwgMHgwMCwgMHg2NSwgMHgwMCwgMHg1RCwgMHgwMCwgMHg1MiwgMHgwMCwgMHg0OCwgMHgwMCwgMHg0MCwgMHgwMCwgMHgzOCwgMHgwMCwKKwkgMHgzMSwgMHgwMCwgMHgyQywgMHgwMCwgMHgyNywgMHgwMCwgMHgyMywgMHgwMCwgMHgxRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2NSwgMHgwMCwgMHg2NSwgMHgwMCwKKwkgMHg2NSwgMHgwMCwgMHg2NSwgMHgwMCwgMHg1RCwgMHgwMCwgMHg1MiwgMHgwMCwgMHg0OCwgMHgwMCwgMHg0MCwgMHgwMCwgMHgzOCwgMHgwMCwgMHgzMSwgMHgwMCwKKwkgMHgyQywgMHgwMCwgMHgyNywgMHgwMCwgMHgyMywgMHgwMCwgMHgxRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOSwgMHgwMCwgMHgxOSwgMHgwMCwgMHgxOSwgMHgwMCwKKwkgMHgxOSwgMHgwMCwgMHgxOSwgMHgwMCwgMHgxOSwgMHgwMCwgMHgxOSwgMHgwMCwgMHgxOSwgMHgwMCwgMHgxOSwgMHgwMCwgMHgxOSwgMHgwMCwgMHgxOSwgMHgwMCwKKwkgMHgxOSwgMHgwMCwgMHgxOSwgMHgwMCwgMHgxOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgMHgwMCwKKwkgMHgwQywgMHgwMCwgMHgwQywgMHgwMCwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgxNSwgMHgwMCwgMHg2RSwgMHg2RiwgMHg2RSwgMHgyRCwKKwkgMHg3MywgMHg3MCwgMHg2NSwgMHg2MywgMHg2OSwgMHg2NiwgMHg2OSwgMHg2NSwgMHg2NCwgMHgyMCwgMHg1MywgMHg1MywgMHg0OSwgMHg0NCwgMHgyMCwgMHgyMSwKKwkgMHgyMSwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgyMCwKKwkgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgwMCwgMHgwOSwKKwkgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHg2NCwgMHgwMCwgMHg2NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0OCwgMHg0NSwgMHg1MiwgMHg0RCwgMHg0NSwgMHg1MywKKwkgMHgyMCwgMHgzMiwgMHgwMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwNCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwKKwkgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgxNSwgMHgwMCwKKwkgMHg2RSwgMHg2RiwgMHg2RSwgMHgyRCwgMHg3MywgMHg3MCwgMHg2NSwgMHg2MywgMHg2OSwgMHg2NiwgMHg2OSwgMHg2NSwgMHg2NCwgMHgyMCwgMHg1MywgMHg1MywKKwkgMHg0OSwgMHg0NCwgMHgyMCwgMHgyMSwgMHgyMSwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkgMHgwMSwgMHgwMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkgMHgyMCwgMHgyMCwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHg2NCwgMHgwMCwgMHg2NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0OCwgMHg0NSwKKwkgMHg1MiwgMHg0RCwgMHg0NSwgMHg1MywgMHgyMCwgMHgzMiwgMHgwMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgwMSwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwNCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NiwgMHg2OSwKKwkgMHg3MiwgMHg3MywgMHg3NCwgMHgyMCwgMHg1NywgMHg2MSwgMHg3NiwgMHg2NSwgMHg0QywgMHg0MSwgMHg0RSwgMHgyMCwgMHg0OSwgMHg0OSwgMHgyMCwgMHg1MywKKwkgMHg1MywgMHg0OSwgMHg0NCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgwMCwgMHgwMCwKKwkgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHgwRiwgMHhGMCwgMHgwRiwKKwkgMHgwRiwgMHgwMCwgMHg1MCwgMHgwMSwgMHgwMiwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQiwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOSwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwKKwkgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwKKwkgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwKKwkgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgxNCwgMHgwMCwKKwkgMHgxNCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgyNCwgMHgwMCwgMHhGRiwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwQSwgMHgwMCwgMHgwQSwgMHgwMCwKKwkgMHgwQiwgMHgwMCwgMHgwQiwgMHgwMCwgMHgxNCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMSwKKwkgMHgwMiwgMHgwNCwgMHgwQiwgMHgxNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMSwgMHg4MiwgMHg4NCwgMHg4QiwgMHg5NiwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgxQywgMHg4NSwgMHgwMCwgMHgwMCwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwMSwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgyMCwgMHgwMCwgMHgxQiwgMHgwMCwgMHgxNywgMHgwMCwgMHgxMSwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwQiwgMHgwMCwKKwkgMHgwQiwgMHgwMCwgMHgwOSwgMHgwMCwgMHgxNywgMHgwMCwgMHgxNCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwRCwgMHgwMCwgMHgwQiwgMHgwMCwgMHgwOSwgMHgwMCwKKwkgMHgwOCwgMHgwMCwgMHgwNywgMHgwMCwgMHgwRCwgMHgwMCwgMHgwQSwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwNSwgMHgwMCwKKwkgMHhEOCwgMHgwQywgMHhDMCwgMHgwOCwgMHg5MCwgMHgwRCwgMHg2MCwgMHgwOSwgMHg0OCwgMHgwRSwgMHgzMCwgMHgwQSwgMHgyNCwgMHgwRiwgMHgxOCwgMHgwQiwKKwkgMHgwQiwgMHg2RSwgMHgwQiwgMHgzNywgMHgwMiwgMHgxNCwgMHgwMSwgMHgwQSwgMHgwNCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMywgMHgwMCwKKwkgMHgwNywgMHgwMCwgMHgwNywgMHgwMCwgMHgwNywgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHg0MywgMHg3NSwgMHg3MiwgMHg3MiwgMHg2NSwKKwkgMHg2RSwgMHg3NCwgMHgyMCwgMHg1MywgMHg2NSwgMHg3MiwgMHg3NiwgMHg2OSwgMHg2MywgMHg2NSwgMHgyMCwgMHg1MywgMHg2NSwgMHg3NCwgMHgyMCwgMHg0OSwKKwkgMHg2NCwgMHg2NSwgMHg2RSwgMHg3NCwgMHg2OSwgMHg2NiwgMHg2OSwgMHg2NSwgMHg3MiwgMHgyMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgzMCwgMHgwMSwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHhERCwgMHgwMCwgMHg1MCwKKwkgMHhGMiwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHg1MCwgMHhGMiwgMHgwNSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg1MCwgMHhGMiwgMHgwMiwgMHgwMCwgMHg1MCwKKwkgMHhGMiwgMHgwNCwgMHgwMiwgMHgwMCwgMHgwMCwgMHg1MCwgMHhGMiwgMHgwMCwgMHgwMCwgMHg1MCwgMHhGMiwgMHgwMSwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgxNSwgMHgwMCwgMHgxNCwgMHgwMCwgMHgxNSwgMHgwMCwgMHgzNiwgMHgwMCwgMHgxMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgxNCwgMHgwMCwKKwkgMHgxMSwgMHgwMCwgMHgzNiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMSwgMHgwMCwgMHgxMCwgMHgwMCwgMHhCRSwgMHgzMywgMHgxRSwgMHgzMywgMHhDQywgMHgzNSwgMHhEMCwgMHgzNSwgMHhENCwgMHgzNSwgMHgxMiwgMHgzNCwKKwkgMHgwNCwgMHgzNiwgMHgwOCwgMHgzNiwgMHhGMiwgMHgzMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyRiwgMHgxNCwgMHgzMywgMHgwOCwgMHgzNiwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhCRSwgMHgzMywgMHgxRSwgMHgzMywgMHhDQywgMHgzNSwgMHhEMCwgMHgzNSwgMHhENCwgMHgzNSwgMHgxMiwgMHgzNCwKKwkgMHgwNCwgMHgzNiwgMHgwOCwgMHgzNiwgMHhGMiwgMHgzMywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHgwMCwgMHhCRSwgMHgzMywgMHgxNCwgMHgzMywgMHgwOCwgMHgzNiwgMHg1QywgMHgzNCwgMHgyQSwgMHgzMywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMywgMHgwMywgMHgwMCwgMHgwMiwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwNywKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgyQSwKKwkgMHgwMCwgMHgwMCwgMHgwOCwgMHgzMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwNSwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERCwgMHgwMCwgMHgzMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxRCwgMHhGQSwKKwkgMHhGOSwgMHhGOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgxOSwgMHgwQSwKKwkgMHgwOSwgMHg0NiwgMHgxQywgMHg2MCwgMHgxOCwgMHgwMCwgMHgxOSwgMHgxRCwgMHgwOSwgMHg0MiwgMHgxQywgMHg2MCwgMHgwMCwgMHgwMCwKKworfTsgIC8qIGZ3X2ltYWdlXzJfZGF0YSAqLworCitzdGF0aWMgY29uc3QgaGNmXzggZndfaW1hZ2VfM19kYXRhW10gPSB7CisJIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MUEsIDB4MDAsIDB4ODAsIDB4M0EsIDB4MTUsIDB4MDAsIDB4N0YsIDB4RjEsCisJIDB4MzIsIDB4RjIsIDB4MzMsIDB4RjIsIDB4RDAsIDB4ODAsIDB4ODAsIDB4RjEsIDB4MEYsIDB4MDIsIDB4RDAsIDB4ODAsIDB4MzQsIDB4RjIsIDB4ODEsIDB4RjEsCisJIDB4MEIsIDB4MDIsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDIsIDB4RTksIDB4NjAsIDB4NTgsIDB4NEYsIDB4MzAsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjQsIDB4NjAsIDB4NTgsIDB4NEYsIDB4RTMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUMsIDB4NjAsIDB4RDcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4RjQsCisJIDB4QUEsIDB4NjAsIDB4QUEsIDB4NjUsIDB4MDksIDB4RjIsIDB4NUEsIDB4RDAsIDB4RDQsIDB4ODAsIDB4MDMsIDB4NjQsIDB4MTIsIDB4MDIsIDB4RDAsIDB4ODAsCisJIDB4MUQsIDB4NjAsIDB4NjAsIDB4NjUsIDB4MEUsIDB4MDIsIDB4NUEsIDB4RDIsIDB4RkYsIDB4RkYsIDB4RDQsIDB4ODAsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjUsCisJIDB4MDgsIDB4MDIsIDB4NUEsIDB4RDIsIDB4RkYsIDB4RkYsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDIsIDB4MUMsIDB4NjAsIDB4RDcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4RUEsIDB4RjEsIDB4NUEsIDB4RDEsIDB4NDQsIDB4NDgsIDB4NUEsIDB4RDEsIDB4NDQsIDB4NEEsIDB4MjYsIDB4NDYsCisJIDB4M0YsIDB4RjIsIDB4MDAsIDB4RjQsIDB4NDQsIDB4NEMsIDB4RDgsIDB4ODMsIDB4NzAsIDB4NjEsIDB4NjgsIDB4NjUsIDB4RDcsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDcsIDB4MEUsIDB4MDgsIDB4RjIsIDB4MDgsIDB4MDAsIDB4NjgsIDB4NjUsIDB4RDcsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MEUsIDB4MDMsIDB4MDAsCisJIDB4MUMsIDB4NjAsIDB4RUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTgsIDB4NEYsIDB4NzksIDB4MDAsIDB4OUMsIDB4ODAsIDB4MDEsIDB4NjUsIDB4MDIsIDB4MDIsCisJIDB4MDAsIDB4NjUsIDB4MDIsIDB4MDAsIDB4RkYsIDB4M0IsIDB4RjcsIDB4MDEsIDB4NTgsIDB4NEYsIDB4NzAsIDB4MDAsIDB4OUMsIDB4ODAsIDB4NDUsIDB4NDIsCisJIDB4RUEsIDB4MDIsIDB4NTgsIDB4NEYsIDB4NkIsIDB4MDAsIDB4OUMsIDB4ODAsIDB4RkYsIDB4RkYsIDB4RTUsIDB4MDIsIDB4NTgsIDB4NEYsIDB4NjYsIDB4MDAsCisJIDB4OUMsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDIsIDB4MDAsIDB4NjUsIDB4NDUsIDB4NDIsIDB4RjgsIDB4MDEsIDB4RkYsIDB4M0EsIDB4MjksIDB4MDAsCisJIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjUsIDB4MjgsIDB4NDQsIDB4RkYsIDB4QjQsIDB4OTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4RDQsIDB4MDIsIDB4NjAsIDB4NDUsCisJIDB4MjgsIDB4NDcsIDB4MkEsIDB4NUYsIDB4NDAsIDB4NDgsIDB4MkEsIDB4NDcsIDB4MkMsIDB4NUYsIDB4NDAsIDB4NEEsIDB4MkMsIDB4NDcsIDB4NjUsIDB4NUYsCisJIDB4NDAsIDB4NEMsIDB4MTAsIDB4NjQsIDB4NDAsIDB4NDIsIDB4MjgsIDB4NDUsIDB4MDUsIDB4MDAsIDB4NTgsIDB4NEYsIDB4NDcsIDB4MDAsIDB4OTQsIDB4ODAsCisJIDB4MjgsIDB4NDUsIDB4MjYsIDB4MDIsIDB4NTgsIDB4NEYsIDB4NDIsIDB4MDAsIDB4OTQsIDB4ODAsIDB4MkEsIDB4NDUsIDB4MjEsIDB4MDIsIDB4NTgsIDB4NEYsCisJIDB4M0QsIDB4MDAsIDB4OTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MUMsIDB4MDIsIDB4MjIsIDB4NDQsIDB4NEMsIDB4ODIsIDB4MkMsIDB4NDUsIDB4MzEsIDB4MDMsCisJIDB4RUMsIDB4MDEsIDB4MTAsIDB4NjUsIDB4NDUsIDB4NDIsIDB4MjgsIDB4NDUsIDB4OTQsIDB4ODAsIDB4MkEsIDB4NDUsIDB4MjEsIDB4MDIsIDB4NTgsIDB4NEYsCisJIDB4MkQsIDB4MDAsIDB4OTQsIDB4ODAsIDB4MkMsIDB4NDUsIDB4MUMsIDB4MDIsIDB4NTgsIDB4NEYsIDB4MjgsIDB4MDAsIDB4OTQsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MTcsIDB4MDIsIDB4MjIsIDB4NDQsIDB4NEMsIDB4ODIsIDB4MjgsIDB4NDUsIDB4MUMsIDB4MDMsIDB4NTgsIDB4NEYsIDB4MUYsIDB4MDAsIDB4RUMsIDB4MDEsCisJIDB4NDAsIDB4NEIsIDB4MjgsIDB4NDcsIDB4NDAsIDB4NDgsIDB4MkEsIDB4NDcsIDB4NDAsIDB4NEEsIDB4MkMsIDB4NDcsIDB4NjAsIDB4NDUsIDB4MkEsIDB4NUUsCisJIDB4NDAsIDB4NEMsIDB4MkEsIDB4NDQsIDB4MjgsIDB4NUUsIDB4NDAsIDB4NEEsIDB4MjgsIDB4NDQsIDB4NjUsIDB4NUUsIDB4NDAsIDB4NDgsIDB4MkIsIDB4NDQsCisJIDB4NjgsIDB4NjUsIDB4RDcsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MTcsIDB4MEUsIDB4OTAsIDB4MDEsIDB4MjYsIDB4NDYsIDB4RDAsIDB4NjAsIDB4QjUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4QjksIDB4RkYsIDB4MjYsIDB4NDYsIDB4RDAsIDB4NjAsIDB4QjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QzksIDB4ODEsIDB4Q0IsIDB4ODMsCisJIDB4MDcsIDB4MUMsIDB4MDEsIDB4MUQsIDB4MDgsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QjQsIDB4RDgsIDB4ODEsCisJIDB4NUEsIDB4RDIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4RDAsIDB4NjAsIDB4NTgsIDB4NEYsIDB4RDEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4NjAsIDB4RkUsIDB4NjEsIDB4MDAsIDB4RjQsIDB4MTIsIDB4NjMsIDB4NkEsIDB4NjQsIDB4MDEsIDB4NjUsIDB4QkQsIDB4RDAsIDB4QzgsIDB4ODQsCisJIDB4NTksIDB4RDksIDB4RkMsIDB4MDIsIDB4NjUsIDB4NDAsIDB4MDEsIDB4M0EsIDB4MDUsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDAsIDB4NjUsIDB4MEUsIDB4NjQsCisJIDB4MDQsIDB4NjMsIDB4RjQsIDB4MDEsIDB4MkYsIDB4NjAsIDB4NTgsIDB4NjQsIDB4MEUsIDB4NjAsIDB4RDksIDB4RkIsIDB4MUQsIDB4NjAsIDB4QjAsIDB4NjQsCisJIDB4QTAsIDB4REYsIDB4MTcsIDB4NjAsIDB4QTgsIDB4RjMsIDB4MEUsIDB4NjAsIDB4REIsIDB4RkIsIDB4MEUsIDB4NjAsIDB4REIsIDB4RjMsIDB4MEUsIDB4NjAsCisJIDB4RDgsIDB4RjMsIDB4NjAsIDB4NDUsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDIsIDB4MUQsIDB4NjAsIDB4N0IsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4NjQsIDB4MEUsIDB4NjAsIDB4RDcsIDB4RkIsIDB4MEUsIDB4NjAsIDB4RDksIDB4RjMsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjEsIDB4NDAsIDB4NDgsCisJIDB4NDAsIDB4NEEsIDB4RkEsIDB4QTQsIDB4QTAsIDB4RDMsIDB4NDEsIDB4NEMsIDB4REMsIDB4ODQsIDB4QTgsIDB4ODQsIDB4MEUsIDB4NjAsIDB4REMsIDB4RkIsCisJIDB4MjgsIDB4NDUsIDB4NDQsIDB4OEIsIDB4MkIsIDB4RDMsIDB4MEUsIDB4NjAsIDB4REEsIDB4RkIsIDB4MjgsIDB4NDIsIDB4NEEsIDB4RDMsIDB4MkMsIDB4NDUsCisJIDB4NDQsIDB4OEMsIDB4MDEsIDB4NjQsIDB4NDAsIDB4NDgsIDB4MEUsIDB4NjAsIDB4REMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MzYsIDB4MTgsIDB4Q0MsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MEUsIDB4NjAsIDB4REEsIDB4RjMsIDB4MjgsIDB4NDUsIDB4QTQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDMsIDB4NjAsIDB4RkUsCisJIDB4MkMsIDB4RDMsIDB4MkEsIDB4RDMsIDB4NjAsIDB4NDUsIDB4RDQsIDB4ODAsIDB4MjAsIDB4RkUsIDB4MDEsIDB4MDMsIDB4MTIsIDB4MDAsIDB4MjgsIDB4NDQsCisJIDB4RTAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MjQsIDB4MDEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MkIsIDB4NDQsIDB4NTgsIDB4OEIsIDB4MkIsIDB4RDMsCisJIDB4MEUsIDB4NjAsIDB4REEsIDB4RkIsIDB4MDEsIDB4NjQsIDB4NDAsIDB4NDgsIDB4MkEsIDB4NDQsIDB4NUMsIDB4OEEsIDB4MkMsIDB4NDQsIDB4NUMsIDB4OEMsCisJIDB4REEsIDB4MDEsIDB4MDAsIDB4NjQsIDB4MEUsIDB4NjAsIDB4RDcsIDB4RkIsIDB4MEUsIDB4NjAsIDB4RDksIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsCisJIDB4RkEsIDB4QTQsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QzQsIDB4ODEsIDB4NjUsIDB4NDQsIDB4RkMsIDB4QTQsIDB4QTAsIDB4RDMsIDB4MDYsIDB4QTEsCisJIDB4REMsIDB4ODQsIDB4QTgsIDB4ODQsIDB4NDQsIDB4OTQsIDB4MEUsIDB4NjAsIDB4RDksIDB4RkIsIDB4MEUsIDB4NjAsIDB4RDcsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDksIDB4MDAsIDB4MEUsIDB4NjAsIDB4RDgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4OTQsIDB4MDEsIDB4MUMsIDB4NjAsIDB4RDcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUMsIDB4NjAsIDB4REIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsCisJIDB4MkUsIDB4NjEsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4NUYsIDB4RkIsIDB4MDEsIDB4NjAsCisJIDB4MDUsIDB4NjEsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4NUUsIDB4RkIsIDB4MDAsIDB4NjAsCisJIDB4MDIsIDB4NjEsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4NjUsIDB4RkIsIDB4MUYsIDB4NjAsCisJIDB4NkQsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MzYsIDB4RkIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjQsIDB4REIsIDB4RkIsIDB4RjEsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4RkUsIDB4QjQsIDB4RjEsIDB4RkIsIDB4MTAsIDB4NjAsIDB4MzAsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjAsCisJIDB4MTQsIDB4NjMsIDB4MDEsIDB4NjAsIDB4QzIsIDB4NjEsIDB4MkQsIDB4NjAsIDB4OTgsIDB4NjQsIDB4NTgsIDB4RDEsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsCisJIDB4MDAsIDB4NjAsIDB4OEEsIDB4NjMsIDB4MkQsIDB4NjAsIDB4MEMsIDB4NjEsIDB4MkQsIDB4NjAsIDB4QjAsIDB4NjQsIDB4NTgsIDB4RDEsIDB4NTksIDB4RDksCisJIDB4RkQsIDB4MUYsIDB4MTYsIDB4NjAsIDB4QUIsIDB4RjMsIDB4MTksIDB4NjAsIDB4NDgsIDB4RjEsIDB4RkYsIDB4QjUsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MkIsCisJIDB4MEIsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDMsIDB4MkUsIDB4MDgsIDB4MDAsIDB4ODAsIDB4MkIsIDB4MDYsIDB4MDAsIDB4MzIsIDB4NDQsIDB4MDAsIDB4NjAsCisJIDB4ODAsIDB4NjMsIDB4M0MsIDB4OTQsIDB4NDAsIDB4NTIsIDB4MDUsIDB4MDAsIDB4MzIsIDB4NDQsIDB4RkYsIDB4NjAsIDB4N0YsIDB4NjMsIDB4MkMsIDB4OTQsCisJIDB4NDAsIDB4NTIsIDB4NjUsIDB4NDMsIDB4MTYsIDB4NjAsIDB4QUIsIDB4RkQsIDB4MTYsIDB4NjAsIDB4QzIsIDB4RjEsIDB4NjYsIDB4NDEsIDB4QTYsIDB4RjUsCisJIDB4M0EsIDB4RjIsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MjIsIDB4NjQsIDB4M0EsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MzIsIDB4NDUsIDB4MTYsIDB4NjAsCisJIDB4Q0IsIDB4RjEsIDB4MTAsIDB4NjcsIDB4QjQsIDB4ODUsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4OTQsIDB4ODUsIDB4NDUsIDB4NTIsIDB4RkYsIDB4NjAsCisJIDB4RTcsIDB4NjUsIDB4MzIsIDB4NDEsIDB4QTUsIDB4ODEsIDB4MTYsIDB4NjAsIDB4QzIsIDB4RjMsIDB4MDgsIDB4NjUsIDB4RkYsIDB4QTAsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MDMsIDB4MDcsIDB4MDAsIDB4MTYsIDB4NjAsIDB4QzQsIDB4RjMsIDB4QjUsIDB4ODEsIDB4MTAsIDB4NjUsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsCisJIDB4QjUsIDB4ODEsIDB4NDEsIDB4NTIsIDB4MTksIDB4NjAsIDB4NDgsIDB4RjMsIDB4MzcsIDB4NjAsIDB4RTYsIDB4NjMsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsCisJIDB4RjAsIDB4ODQsIDB4MDMsIDB4QjUsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsIDB4MDMsIDB4QjQsIDB4NjUsIDB4NUMsIDB4QTMsIDB4RDksIDB4MzcsIDB4NjAsCisJIDB4RTgsIDB4NjMsIDB4MDIsIDB4QTgsIDB4QTMsIDB4REIsIDB4MTUsIDB4MDIsIDB4MDAsIDB4NjAsIDB4QzgsIDB4NjQsIDB4MUIsIDB4NjAsIDB4RjUsIDB4RkIsCisJIDB4MUIsIDB4NjAsIDB4RjksIDB4RkIsIDB4MDcsIDB4NjAsIDB4RDAsIDB4NjQsIDB4MUIsIDB4NjAsIDB4RjYsIDB4RkIsIDB4MUIsIDB4NjAsIDB4RkEsIDB4RkIsCisJIDB4MDEsIDB4NjAsIDB4OTAsIDB4NjQsIDB4MUIsIDB4NjAsIDB4RjcsIDB4RkIsIDB4MDAsIDB4NjAsIDB4NjQsIDB4NjQsIDB4MUIsIDB4NjAsIDB4RjgsIDB4RkIsCisJIDB4MDYsIDB4MDAsIDB4NjQsIDB4NjQsIDB4MUIsIDB4NjAsIDB4RjcsIDB4RkIsIDB4NjQsIDB4NjQsIDB4MUIsIDB4NjAsIDB4RjgsIDB4RkIsIDB4MTksIDB4NjAsCisJIDB4NDgsIDB4RjEsIDB4MDEsIDB4NjQsIDB4NjQsIDB4NDAsIDB4NDAsIDB4MkEsIDB4MDIsIDB4MDAsIDB4MUIsIDB4NjAsIDB4RUUsIDB4RkIsIDB4MzMsIDB4NjAsCisJIDB4QkMsIDB4NjEsIDB4MkQsIDB4NjAsIDB4MEUsIDB4NjQsIDB4MjAsIDB4NjMsIDB4NTgsIDB4RDEsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4QkEsIDB4RjEsCisJIDB4N0UsIDB4RjksIDB4MUEsIDB4NjMsIDB4MDAsIDB4NjAsIDB4RkMsIDB4NjEsIDB4MDAsIDB4NjQsIDB4NTksIDB4REIsIDB4RkUsIDB4MUYsIDB4NDAsIDB4NDAsCisJIDB4MDEsIDB4NjQsIDB4ODUsIDB4RkIsIDB4MTcsIDB4NjAsIDB4MTQsIDB4RjMsIDB4MzUsIDB4NjAsIDB4MzYsIDB4NjEsIDB4RkUsIDB4QTQsIDB4RTAsIDB4ODQsCisJIDB4MDQsIDB4MjQsIDB4MEMsIDB4MDAsIDB4RTAsIDB4ODQsIDB4NDEsIDB4OTEsIDB4MUEsIDB4NjAsIDB4MUYsIDB4RjMsIDB4QTEsIDB4RDEsIDB4NTksIDB4RDEsCisJIDB4QTAsIDB4ODMsIDB4MUEsIDB4NjAsIDB4MUIsIDB4RkQsIDB4QTAsIDB4ODMsIDB4MUEsIDB4NjAsIDB4MUEsIDB4RkQsIDB4RTQsIDB4RjMsIDB4N0QsIDB4RkIsCisJIDB4Q0YsIDB4RjEsIDB4MTAsIDB4NjAsIDB4RUMsIDB4NjMsIDB4MkYsIDB4MTgsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MTIsIDB4MDAsIDB4Q0MsIDB4ODQsCisJIDB4MDYsIDB4QTMsIDB4RkQsIDB4MDIsIDB4QTMsIDB4RDMsIDB4MTAsIDB4NjAsIDB4RjIsIDB4NjMsIDB4MjUsIDB4MUIsIDB4MTEsIDB4NjAsIDB4NDQsIDB4NjUsCisJIDB4QTMsIDB4RDMsIDB4MDYsIDB4QTMsIDB4RDcsIDB4ODAsIDB4MDIsIDB4MUIsIDB4RkIsIDB4MDQsIDB4MUQsIDB4MDAsIDB4RjgsIDB4QTMsIDB4QTMsIDB4RDMsCisJIDB4MTgsIDB4MDAsIDB4MTEsIDB4NjAsIDB4NjAsIDB4NjMsIDB4MTIsIDB4NjAsIDB4NDAsIDB4NjUsIDB4QTMsIDB4RDEsIDB4MDgsIDB4QTMsIDB4RDAsIDB4ODAsCisJIDB4RDcsIDB4ODAsIDB4MDIsIDB4MDMsIDB4RkEsIDB4MDQsIDB4MEYsIDB4MDAsIDB4RkEsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MTEsIDB4NjAsIDB4NjIsIDB4NjMsCisJIDB4MEEsIDB4MUIsIDB4QTMsIDB4RDMsIDB4MDgsIDB4QTMsIDB4RDcsIDB4ODAsIDB4MDIsIDB4MUIsIDB4RkIsIDB4MDQsIDB4MDQsIDB4MDAsIDB4RjYsIDB4QTMsCisJIDB4QTMsIDB4RDMsIDB4RTQsIDB4RkIsIDB4N0QsIDB4RkIsIDB4MkUsIDB4NjAsIDB4MkUsIDB4NjQsIDB4MkQsIDB4NjAsIDB4OEEsIDB4NjMsIDB4QTAsIDB4RDEsCisJIDB4QTMsIDB4RDksIDB4NjQsIDB4NDEsIDB4NTgsIDB4RDEsIDB4NUIsIDB4RDksIDB4N0QsIDB4RjMsIDB4NjYsIDB4NDUsIDB4QTYsIDB4RjUsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MjcsIDB4MDgsIDB4MDAsIDB4OTEsIDB4RkEsIDB4NjEsIDB4NDQsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QUMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTIsIDB4RkEsIDB4MDcsIDB4MDAsIDB4MTEsIDB4RjgsIDB4NjQsIDB4NDQsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QUMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTIsIDB4RkEsIDB4NjUsIDB4NDYsIDB4NDYsIDB4NDgsIDB4RTIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDUsIDB4M0EsIDB4MDMsIDB4MDAsCisJIDB4MTQsIDB4NjAsIDB4MjIsIDB4NjYsIDB4MTEsIDB4MDAsIDB4MDQsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MTQsIDB4NjAsIDB4MTYsIDB4NjYsIDB4MEMsIDB4MDAsCisJIDB4MDMsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MTQsIDB4NjAsIDB4MEEsIDB4NjYsIDB4MDcsIDB4MDAsIDB4MDIsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MTMsIDB4NjAsCisJIDB4RkUsIDB4NjYsIDB4MDIsIDB4MDAsIDB4MTMsIDB4NjAsIDB4RjIsIDB4NjYsIDB4NjAsIDB4RkUsIDB4QTYsIDB4RDMsIDB4REUsIDB4ODYsIDB4MTMsIDB4NjAsCisJIDB4REMsIDB4RkIsIDB4QTYsIDB4RDMsIDB4REUsIDB4ODYsIDB4MjgsIDB4NjAsIDB4MjksIDB4NjMsIDB4QTMsIDB4REIsIDB4MjgsIDB4NjAsIDB4QTEsIDB4NjMsCisJIDB4QTMsIDB4REIsIDB4QTYsIDB4RDMsIDB4REUsIDB4ODYsIDB4MTMsIDB4NjAsIDB4REIsIDB4RkIsIDB4QTYsIDB4RDMsIDB4REUsIDB4ODYsIDB4MjcsIDB4NjAsCisJIDB4QjksIDB4NjMsIDB4QTMsIDB4REIsIDB4MjAsIDB4RkUsIDB4QTYsIDB4RDMsIDB4REEsIDB4ODYsIDB4NjAsIDB4NDMsIDB4MUYsIDB4QjMsIDB4NjMsIDB4NUMsCisJIDB4MUYsIDB4NjAsIDB4MDAsIDB4QjQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4QjAsIDB4ODUsIDB4MTQsIDB4NjAsIDB4MTIsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4RkMsIDB4NjAsIDB4MDAsIDB4QjQsIDB4QjQsIDB4ODQsIDB4QTIsIDB4REIsIDB4MTQsIDB4NjAsIDB4NEUsIDB4RkIsIDB4MjgsIDB4NjAsCisJIDB4QzQsIDB4NjMsIDB4QTMsIDB4RDMsIDB4QTYsIDB4RDEsIDB4REUsIDB4ODYsIDB4ODAsIDB4NjAsIDB4N0YsIDB4QjUsIDB4NjQsIDB4NDQsIDB4NjAsIDB4NDcsCisJIDB4RTgsIDB4ODQsIDB4N0YsIDB4NjAsIDB4ODAsIDB4QjQsIDB4QjQsIDB4ODQsIDB4QTMsIDB4REIsIDB4NjAsIDB4RkUsIDB4QTYsIDB4RDMsIDB4REUsIDB4ODYsCisJIDB4MTMsIDB4NjAsIDB4REYsIDB4RkIsIDB4QTYsIDB4RDMsIDB4REUsIDB4ODYsIDB4MDAsIDB4NjAsIDB4REYsIDB4RkIsIDB4QTYsIDB4RDMsIDB4REUsIDB4ODYsCisJIDB4MDAsIDB4NjAsIDB4RTAsIDB4RkIsIDB4QTYsIDB4RDMsIDB4MDAsIDB4NjAsIDB4RTEsIDB4RkIsIDB4MjAsIDB4RkUsIDB4MjgsIDB4NDYsIDB4MTksIDB4NjAsCisJIDB4NEQsIDB4RjEsIDB4MDAsIDB4NjAsIDB4Q0YsIDB4RjMsIDB4NjQsIDB4NDAsIDB4MDAsIDB4M0EsIDB4MEYsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsCisJIDB4MDUsIDB4MDAsIDB4MDIsIDB4MzYsIDB4MDMsIDB4MDAsIDB4MDcsIDB4MzYsIDB4MDEsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MTAsIDB4NjAsIDB4RjAsIDB4NjQsCisJIDB4MDAsIDB4N0MsIDB4NDQsIDB4QTQsIDB4QTAsIDB4RDksIDB4MDYsIDB4QTQsIDB4QTAsIDB4RDksIDB4MzYsIDB4NDAsIDB4MDgsIDB4M0EsIDB4MDMsIDB4MDAsCisJIDB4RjMsIDB4NjAsIDB4MEEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjMsIDB4MTAsIDB4NjAsIDB4MTAsIDB4RkQsIDB4MTAsIDB4NjAsIDB4MzAsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEEsIDB4MDQsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTksIDB4RkIsCisJIDB4MUUsIDB4NjAsIDB4OEQsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4N0QsIDB4RjEsIDB4MTMsIDB4NjAsCisJIDB4MUEsIDB4RjksIDB4MEMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MDcsIDB4NjQsIDB4Q0MsIDB4RkIsIDB4MjAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTksIDB4RkIsIDB4MUYsIDB4NjAsIDB4NTMsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MzAsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4QkUsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsCisJIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4QzUsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsCisJIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTgsIDB4RkIsCisJIDB4NUEsIDB4REIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MzAsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4ODksIDB4RkIsIDB4RkYsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MzAsIDB4RjEsIDB4MDAsIDB4NjAsIDB4REYsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDEsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjEsIDB4RkIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MDgsIDB4NjAsCisJIDB4MTgsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MTksIDB4RkIsIDB4MUYsIDB4NjAsIDB4OTIsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4NjAsIDB4MTgsIDB4RjEsIDB4N0YsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4ODksIDB4RjMsIDB4MDAsIDB4NjUsCisJIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MEEsIDB4MDMsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTksIDB4RkIsIDB4MUYsIDB4NjAsCisJIDB4OTIsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4OTUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4N0YsIDB4QjQsCisJIDB4OTUsIDB4RkIsIDB4REUsIDB4RkUsIDB4MEEsIDB4MDQsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTksIDB4RkIsIDB4MUYsIDB4NjAsCisJIDB4QjcsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NjAsIDB4MzQsIDB4NjIsIDB4MDYsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTgsIDB4RkIsIDB4NUEsIDB4REIsIDB4QkUsIDB4RkUsCisJIDB4REEsIDB4RkUsIDB4MjUsIDB4NjAsIDB4REEsIDB4NjEsIDB4MUYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4RUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NjAsCisJIDB4QzgsIDB4NjEsIDB4MUYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4RUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NjAsIDB4Q0UsIDB4NjEsIDB4MUYsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4RUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NjAsIDB4RUMsIDB4NjEsIDB4MUYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4RUEsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjUsIDB4NjAsIDB4RjIsIDB4NjEsIDB4MUYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4RUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NjAsCisJIDB4RkUsIDB4NjEsIDB4MUYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4RUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QzUsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4QTEsIDB4RDMsIDB4MEUsIDB4NTcsIDB4MjMsIDB4MDAsIDB4MEUsIDB4RjIsIDB4NDQsIDB4NEMsIDB4ODAsIDB4QjAsIDB4MTAsIDB4QjAsIDB4MEEsIDB4MDMsCisJIDB4MDAsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MEQsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4MTMsIDB4MDAsIDB4MTIsIDB4MDIsIDB4RjAsIDB4MzcsIDB4MDksIDB4MDAsIDB4MDIsIDB4RjAsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjQsCisJIDB4RDAsIDB4ODAsIDB4QTIsIDB4RkYsIDB4QUQsIDB4RjMsIDB4MDIsIDB4MDIsIDB4Q0MsIDB4ODQsIDB4QUQsIDB4RkIsIDB4MjYsIDB4NjAsIDB4MUEsIDB4NjQsCisJIDB4NDAsIDB4NEIsIDB4MzQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkMsIDB4NDQsIDB4QUMsIDB4ODYsIDB4MDksIDB4RjAsCisJIDB4REEsIDB4MDIsIDB4MzcsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4NjAsCisJIDB4ODUsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MzIsIDB4RkIsIDB4MUMsIDB4NjAsIDB4QjYsIDB4NjIsIDB4QTIsIDB4REYsIDB4MDYsIDB4QTIsIDB4MTAsIDB4NjAsCisJIDB4ODgsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDYsIDB4NjQsIDB4NUEsIDB4REIsIDB4NUEsIDB4REIsIDB4MUMsIDB4NjAsIDB4QzIsIDB4NjIsIDB4QTIsIDB4REYsCisJIDB4MDYsIDB4QTIsIDB4MTAsIDB4NjAsIDB4OEMsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDYsIDB4NjQsIDB4NUEsIDB4REIsIDB4NUEsIDB4REIsIDB4MUMsIDB4NjAsCisJIDB4Q0UsIDB4NjIsIDB4QTIsIDB4REYsIDB4MDYsIDB4QTIsIDB4MTAsIDB4NjAsIDB4OTAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDYsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4NUEsIDB4REIsIDB4QkQsIDB4RjEsIDB4MEUsIDB4NjAsIDB4NjksIDB4RjksIDB4MjQsIDB4NjAsIDB4QzEsIDB4NjQsIDB4MDgsIDB4NjAsIDB4NDMsIDB4RkIsCisJIDB4MjQsIDB4NjAsIDB4Q0EsIDB4NjQsIDB4MDgsIDB4NjAsIDB4NDUsIDB4RkIsIDB4MjQsIDB4NjAsIDB4RDMsIDB4NjQsIDB4MDgsIDB4NjAsIDB4NDcsIDB4RkIsCisJIDB4MDAsIDB4NjAsIDB4M0EsIDB4NjEsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MjIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4NjIsIDB4RkIsCisJIDB4MDQsIDB4NjQsIDB4MDMsIDB4RkEsIDB4QTYsIDB4RjMsIDB4MDcsIDB4RkEsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4M0YsIDB4RkEsIDB4MDAsIDB4NjAsCisJIDB4MDIsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MEQsIDB4RkIsIDB4MjAsIDB4NjAsIDB4NjMsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MTgsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDMsIDB4NjQsIDB4NjksIDB4RkIsIDB4MEYsIDB4NEUsCisJIDB4RUEsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NEYsIDB4MDAsIDB4NjQsIDB4NkIsIDB4RkIsIDB4NjIsIDB4RjUsCisJIDB4RUEsIDB4RjMsIDB4MkYsIDB4RkEsIDB4RUIsIDB4RjMsIDB4MzAsIDB4RkEsIDB4RUMsIDB4RjMsIDB4MzEsIDB4RkEsIDB4N0YsIDB4RjMsIDB4MkMsIDB4RkEsCisJIDB4MzIsIDB4RkEsIDB4ODAsIDB4RjMsIDB4MkQsIDB4RkEsIDB4MzMsIDB4RkEsIDB4ODEsIDB4RjMsIDB4MkUsIDB4RkEsIDB4MzQsIDB4RkEsIDB4QjksIDB4RjMsCisJIDB4MTksIDB4RkEsIDB4MDYsIDB4NjAsIDB4ODAsIDB4NjQsIDB4MEUsIDB4RkEsIDB4RjcsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsCisJIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDgsIDB4NjAsCisJIDB4MEMsIDB4RjEsIDB4RkYsIDB4NjAsIDB4OEYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4QkUsIDB4RjEsIDB4MEUsIDB4NjAsIDB4NjMsIDB4RjksCisJIDB4MUMsIDB4NjAsIDB4QzIsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsCisJIDB4MDAsIDB4NjQsIDB4NkIsIDB4RkIsIDB4MDAsIDB4NjAsIDB4NzQsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MEQsIDB4RkIsIDB4MjAsIDB4NjAsIDB4QUUsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MEMsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsCisJIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDUsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MjMsIDB4NjAsIDB4ODUsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjAsIDB4NDAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4RTIsIDB4MDEsCisJIDB4MDAsIDB4NjAsIDB4MjAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MTEsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MjAsIDB4NDAsCisJIDB4NTAsIDB4MjcsIDB4RDgsIDB4MDEsIDB4QUMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MEYsIDB4MDYsIDB4NkIsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4RUMsIDB4QTAsIDB4REMsIDB4ODQsIDB4MDEsIDB4MDUsIDB4QTIsIDB4REIsIDB4Q0MsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsCisJIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4Q0YsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MDEsIDB4MDAsIDB4QzMsIDB4MDEsIDB4MDEsIDB4NjQsCisJIDB4MTksIDB4NjAsIDB4RjMsIDB4RkIsIDB4REYsIDB4RjMsIDB4MjksIDB4NDUsIDB4RDQsIDB4ODAsIDB4NkIsIDB4RjMsIDB4MDMsIDB4MDQsIDB4MjEsIDB4NjAsCisJIDB4MjgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RUMsIDB4QTAsIDB4MDAsIDB4NjQsIDB4MDQsIDB4MDQsIDB4NDAsIDB4NDksIDB4MjEsIDB4NjAsIDB4MjgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4NjQsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MEQsIDB4RkIsIDB4MjAsIDB4NjAsIDB4RkQsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MEMsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTAsIDB4ODAsCisJIDB4OUMsIDB4ODQsIDB4MDUsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MjMsIDB4NjAsIDB4ODUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsCisJIDB4NDAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4RDAsIDB4MDEsIDB4MDAsIDB4NjAsCisJIDB4MjAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4RTUsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MjAsIDB4NDAsIDB4NTAsIDB4MjcsCisJIDB4RTAsIDB4MDEsIDB4QUMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDYsIDB4NkIsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4RUMsIDB4QTAsIDB4REMsIDB4ODQsIDB4MDEsIDB4MDUsIDB4QTIsIDB4REIsIDB4QkEsIDB4MDEsIDB4QjksIDB4MDEsIDB4MzMsIDB4NjAsIDB4RTYsIDB4NjUsCisJIDB4QTUsIDB4REYsIDB4QkYsIDB4RjEsIDB4MEUsIDB4NjAsIDB4NjMsIDB4RjksIDB4RTAsIDB4RjMsIDB4MjksIDB4NDUsIDB4MDMsIDB4QTQsIDB4RDQsIDB4ODAsCisJIDB4MDEsIDB4NjMsIDB4MDEsIDB4MDUsIDB4MDAsIDB4NjMsIDB4NTMsIDB4RkQsIDB4N0QsIDB4RjMsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjUsIDB4QTQsIDB4ODAsCisJIDB4MjQsIDB4NDQsIDB4RkUsIDB4QjQsIDB4MDEsIDB4MDMsIDB4MDEsIDB4QkMsIDB4NDAsIDB4NDQsIDB4MjEsIDB4NjAsIDB4NDUsIDB4NjQsIDB4NkEsIDB4RkIsCisJIDB4MjMsIDB4NjAsIDB4RjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUMsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MEMsIDB4RjEsIDB4RkYsIDB4NjAsIDB4REYsIDB4NjQsIDB4QTAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4ODYsIDB4RjEsIDB4MUIsIDB4NjAsIDB4QjIsIDB4NjMsIDB4RDMsIDB4ODAsIDB4NjcsIDB4RkQsIDB4NDMsIDB4MDMsIDB4NjcsIDB4RjMsCisJIDB4RTEsIDB4RjEsIDB4NjAsIDB4NDMsIDB4MjksIDB4NDQsIDB4QTMsIDB4RDMsIDB4QzAsIDB4ODUsIDB4RDQsIDB4ODAsIDB4NUIsIDB4RDMsIDB4M0EsIDB4MDYsCisJIDB4NjAsIDB4NDMsIDB4MDgsIDB4QTMsIDB4QkUsIDB4RDMsIDB4ODEsIDB4RjEsIDB4QTMsIDB4RDMsIDB4RDAsIDB4ODAsIDB4ODAsIDB4RjEsIDB4MDUsIDB4MDIsCisJIDB4QkYsIDB4RDMsIDB4RDAsIDB4ODAsIDB4N0YsIDB4RjEsIDB4MDEsIDB4MDIsIDB4RDAsIDB4ODAsIDB4RjgsIDB4QTMsIDB4MjgsIDB4MDIsIDB4MjEsIDB4NjAsCisJIDB4NzcsIDB4NjQsIDB4NkEsIDB4RkIsIDB4MjMsIDB4NjAsIDB4QjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QjAsIDB4ODIsIDB4RjMsIDB4MjIsIDB4MDMsCisJIDB4NjIsIDB4RjUsIDB4NDgsIDB4N0UsIDB4MkEsIDB4RkEsIDB4MjUsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MEQsIDB4RkIsIDB4NjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MEQsIDB4RkIsIDB4MjEsIDB4NjAsIDB4OTIsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4NjAsIDB4MEMsIDB4RjEsIDB4RkYsIDB4NjAsIDB4RkUsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MDMsIDB4MDAsIDB4MjMsIDB4NjAsCisJIDB4N0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NkIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RUMsIDB4QTAsIDB4MDAsIDB4NjQsIDB4MDIsIDB4MDQsIDB4NDAsIDB4NDksCisJIDB4MTUsIDB4MDAsIDB4REYsIDB4RjMsIDB4MjksIDB4NDUsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MEIsIDB4MDcsIDB4MUMsIDB4NjAsIDB4QzIsIDB4NjQsCisJIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MjAsIDB4NjAsIDB4ODYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4RTAsIDB4RjMsIDB4MjksIDB4NDUsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MTYsIDB4MDYsIDB4MDQsIDB4NjUsIDB4RjEsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4QzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDUsIDB4NjQsIDB4REIsIDB4RkIsIDB4RjEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QkMsCisJIDB4RjEsIDB4RkIsIDB4MUMsIDB4NjAsIDB4QzIsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4RkYsIDB4MjIsIDB4NjAsIDB4MUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4NzQsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MEQsIDB4RkIsCisJIDB4MjEsIDB4NjAsIDB4RDgsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MEMsIDB4RjEsCisJIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDUsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MjMsIDB4NjAsCisJIDB4ODUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4NDAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDMsIDB4MDMsIDB4QTAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4QjAsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MjAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MTUsIDB4MDMsIDB4QTAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MjAsIDB4NDAsIDB4NTAsIDB4MjcsIDB4QTYsIDB4MDEsIDB4QUMsIDB4RjMsIDB4NkIsIDB4RjMsIDB4RkUsIDB4QTAsIDB4RUMsIDB4QTAsCisJIDB4MEEsIDB4MDYsIDB4MDMsIDB4MDQsIDB4MDAsIDB4NjQsIDB4NTUsIDB4RkIsIDB4NDAsIDB4NDksIDB4NkIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RUMsIDB4QTAsCisJIDB4REMsIDB4ODQsIDB4MDEsIDB4MDUsIDB4QTIsIDB4REIsIDB4OTYsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsCisJIDB4MEQsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MUMsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MjEsIDB4NjAsIDB4MjgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjEsIDB4NjAsIDB4OUMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4N0QsIDB4RjMsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjUsIDB4QTQsIDB4ODAsIDB4MjQsIDB4NDQsIDB4RkUsIDB4QjQsIDB4MDEsIDB4MDMsCisJIDB4MDEsIDB4QkMsIDB4MDIsIDB4QjAsIDB4RkIsIDB4QjQsIDB4MDEsIDB4MDMsIDB4MDQsIDB4QkMsIDB4NDAsIDB4NDQsIDB4QzAsIDB4RjEsIDB4MEUsIDB4NjAsCisJIDB4NjMsIDB4RjksIDB4Q0YsIDB4RjMsIDB4MjAsIDB4NjAsIDB4MjAsIDB4NjUsIDB4MzAsIDB4MUIsIDB4QTUsIDB4RDMsIDB4MjQsIDB4NDAsIDB4MDEsIDB4MjYsCisJIDB4MTYsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MjYsIDB4MjksIDB4MDAsIDB4MDEsIDB4QkMsIDB4QTUsIDB4REIsIDB4MDgsIDB4NjAsIDB4MUUsIDB4RjEsCisJIDB4MDAsIDB4NjAsIDB4MjAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MEQsIDB4RkIsIDB4MjIsIDB4NjAsIDB4NUYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsCisJIDB4MTAsIDB4MjYsIDB4MTMsIDB4MDAsIDB4MDEsIDB4QkMsIDB4QTUsIDB4REIsIDB4MDgsIDB4NjAsIDB4MUUsIDB4RjEsIDB4MDAsIDB4NjAsIDB4NDAsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MEQsIDB4RkIsIDB4MjIsIDB4NjAsCisJIDB4NUYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEQsIDB4NjQsIDB4NTMsIDB4RkIsIDB4MjIsIDB4NjAsCisJIDB4NjcsIDB4NjQsIDB4NkEsIDB4RkIsIDB4MjMsIDB4NjAsIDB4RjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUMsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4MTMsIDB4NjAsCisJIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MEMsIDB4RjEsIDB4RkYsIDB4NjAsCisJIDB4REYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4ODYsIDB4RjEsIDB4MUIsIDB4NjAsIDB4QjIsIDB4NjMsIDB4RDMsIDB4ODAsIDB4NjcsIDB4RkQsCisJIDB4MDcsIDB4MDIsIDB4MjQsIDB4NDQsIDB4MDQsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MzYsIDB4MDMsIDB4MDUsIDB4QUMsIDB4NDAsIDB4NDQsIDB4QTYsIDB4MDEsCisJIDB4NjcsIDB4RjMsIDB4MjksIDB4NDEsIDB4QTAsIDB4RDEsIDB4NTgsIDB4RDMsIDB4RDEsIDB4ODAsIDB4NjQsIDB4NDUsIDB4NjAsIDB4NDMsIDB4MkIsIDB4MDUsCisJIDB4MDgsIDB4QTMsIDB4QkUsIDB4RDMsIDB4ODEsIDB4RjEsIDB4QTMsIDB4RDMsIDB4RDAsIDB4ODAsIDB4ODAsIDB4RjEsIDB4MDUsIDB4MDIsIDB4QkYsIDB4RDMsCisJIDB4RDAsIDB4ODAsIDB4N0YsIDB4RjEsIDB4MDEsIDB4MDIsIDB4RDAsIDB4ODAsIDB4RjgsIDB4QTMsIDB4MDcsIDB4MDIsIDB4NDUsIDB4NDksIDB4MjIsIDB4NjAsCisJIDB4Q0QsIDB4NjQsIDB4NkEsIDB4RkIsIDB4MjMsIDB4NjAsIDB4QjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDUsIDB4NjUsIDB4RjEsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4QzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4NjQsIDB4REIsIDB4RkIsIDB4RjEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QjQsIDB4RjEsIDB4RkIsCisJIDB4MjMsIDB4NjAsIDB4N0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjcsIDB4RjMsIDB4ODYsIDB4RjEsIDB4MDQsIDB4QTQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4MDMsIDB4NjcsIDB4RkIsIDB4Q0QsIDB4MDEsIDB4NkIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RUMsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDQsCisJIDB4NzUsIDB4MDAsIDB4RTAsIDB4RjMsIDB4MjksIDB4NDUsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4NzAsIDB4MDUsIDB4N0QsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MDgsIDB4MDAsIDB4MjIsIDB4NjAsIDB4Q0QsIDB4NjMsIDB4NkEsIDB4RkQsIDB4MUMsIDB4NjAsIDB4NzgsIDB4NjMsCisJIDB4MjMsIDB4NjAsIDB4QjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUMsIDB4NjAsIDB4QzIsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MDUsIDB4NjUsIDB4RjEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QzMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjAsIDB4NjAsIDB4MTQsIDB4NjEsIDB4QTEsIDB4REYsIDB4MDQsIDB4NjQsIDB4REIsIDB4RkIsIDB4RjEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QjQsCisJIDB4RjEsIDB4RkIsIDB4ODIsIDB4RjMsIDB4NjIsIDB4RjUsIDB4NDgsIDB4N0UsIDB4MkEsIDB4RkEsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MjAsIDB4NDQsCisJIDB4MzQsIDB4ODAsIDB4MjUsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MEQsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MEQsIDB4RkIsCisJIDB4MjMsIDB4NjAsIDB4MDAsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MEMsIDB4RjEsCisJIDB4RkYsIDB4NjAsIDB4RkUsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjAsIDB4MzIsIDB4NjQsIDB4MEUsIDB4NjAsIDB4NjMsIDB4RkIsCisJIDB4MUMsIDB4NjAsIDB4QzIsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsCisJIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MEQsIDB4RkIsIDB4MjMsIDB4NjAsIDB4MUMsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MEMsIDB4RjEsIDB4RkYsIDB4NjAsIDB4RUYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4RkQsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MjAsIDB4NjAsIDB4ODYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4NzQsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MEQsIDB4RkIsIDB4MjMsIDB4NjAsIDB4M0EsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4NjAsIDB4MEMsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDUsIDB4MDMsIDB4QTAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MjMsIDB4NjAsIDB4ODUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4NDAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsCisJIDB4MDMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NjcsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MjAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsCisJIDB4MTUsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MjAsIDB4NDAsIDB4NTAsIDB4MjcsIDB4RTAsIDB4MDEsIDB4QUMsIDB4RjMsIDB4NkIsIDB4RjMsCisJIDB4RkUsIDB4QTAsIDB4RUMsIDB4QTAsIDB4MEEsIDB4MDYsIDB4MDMsIDB4MDQsIDB4MDAsIDB4NjQsIDB4NTUsIDB4RkIsIDB4NDAsIDB4NDksIDB4NkIsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4RUMsIDB4QTAsIDB4REMsIDB4ODQsIDB4MDEsIDB4MDUsIDB4QTIsIDB4REIsIDB4NEQsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsCisJIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4Q0IsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MUMsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4MTMsIDB4NjAsCisJIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MjIsIDB4NjAsIDB4MUIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MzQsIDB4ODAsIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MjAsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MUMsIDB4NjAsIDB4QjYsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MUMsIDB4NjAsIDB4QzIsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MUMsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MEMsIDB4RkIsIDB4NUEsIDB4REIsIDB4MDAsIDB4NjQsCisJIDB4NjksIDB4RkIsIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MEQsIDB4RkIsIDB4MjAsIDB4NjAsIDB4NjMsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4RDMsIDB4N0QsIDB4RjEsIDB4N0MsIDB4RkIsIDB4RDAsIDB4ODAsIDB4MDAsIDB4NjQsIDB4MzksIDB4MDMsCisJIDB4MDgsIDB4NjAsIDB4MEMsIDB4RjEsIDB4QkYsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEEsIDB4MDQsCisJIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MEQsIDB4RkIsIDB4MjMsIDB4NjAsIDB4QkEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MEMsIDB4RjEsIDB4REYsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4N0MsIDB4RjEsIDB4N0QsIDB4RjksIDB4MTMsIDB4NjAsIDB4MUEsIDB4RjksIDB4MEUsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsCisJIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MEQsIDB4RkIsIDB4MjMsIDB4NjAsIDB4RTQsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QkUsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MEMsIDB4RjEsIDB4REYsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MDEsIDB4NjQsIDB4NkEsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MzQsIDB4ODAsCisJIDB4MDgsIDB4NjAsIDB4MEMsIDB4RjEsIDB4N0YsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MjAsIDB4NDAsIDB4NTEsIDB4MjMsCisJIDB4MEEsIDB4MDAsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MEQsIDB4RkIsIDB4MjMsIDB4NjAsIDB4RkEsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MEMsIDB4RjEsIDB4N0YsIDB4NjAsIDB4RkYsIDB4NjEsIDB4QTEsIDB4ODQsCisJIDB4NUEsIDB4RDEsIDB4NEEsIDB4REIsIDB4QTEsIDB4ODQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4OEEsIDB4RkIsIDB4RkYsIDB4RkYsIDB4QzEsIDB4RkUsCisJIDB4OEEsIDB4RjMsIDB4MDAsIDB4NjUsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MTAsIDB4MDMsIDB4MDgsIDB4NjAsIDB4MEMsIDB4RjEsIDB4N0YsIDB4NjAsCisJIDB4RkYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MEQsIDB4RkIsIDB4MjQsIDB4NjAsCisJIDB4MTYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MzMsIDB4NjAsIDB4QkUsIDB4NjQsIDB4NTQsIDB4RkIsCisJIDB4MDgsIDB4NjAsIDB4MEMsIDB4RjEsIDB4RUYsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MjQsIDB4NDQsIDB4MDEsIDB4QjAsCisJIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDIsIDB4MDgsIDB4NjAsIDB4MTIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MDcsIDB4MDAsIDB4MDgsIDB4NjAsIDB4MTIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MjAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MEQsIDB4RkIsIDB4MjQsIDB4NjAsIDB4NTUsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUMsIDB4NjAsIDB4QzIsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDIsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MEMsIDB4RjEsIDB4RUYsIDB4NjAsIDB4RUYsIDB4NjQsIDB4QTAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MDEsIDB4NjQsIDB4OEEsIDB4RkIsIDB4NkIsIDB4RjMsIDB4MDAsIDB4NjAsIDB4OTUsIDB4RjMsIDB4RUMsIDB4QTAsIDB4NDAsIDB4QkMsCisJIDB4MDYsIDB4MDQsIDB4QTIsIDB4REIsIDB4NjksIDB4RjEsIDB4RkYsIDB4NjAsIDB4RkIsIDB4NjQsIDB4QTAsIDB4ODQsIDB4NjksIDB4RkIsIDB4RkQsIDB4NjAsCisJIDB4RkYsIDB4NjUsIDB4MjAsIDB4NDQsIDB4MjQsIDB4ODAsIDB4MDgsIDB4NjAsIDB4MDgsIDB4RjEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4QzEsIDB4RkUsIDB4NkEsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NTUsIDB4RjEsIDB4MjgsIDB4NDQsCisJIDB4RDAsIDB4ODQsIDB4MDMsIDB4QTQsIDB4MDMsIDB4MEUsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MDQsIDB4MDAsIDB4RkEsIDB4QTQsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODcsIDB4QzAsIDB4QkYsIDB4QzAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NTYsIDB4RjEsIDB4MjgsIDB4NDQsCisJIDB4RDAsIDB4ODQsIDB4MUYsIDB4QTQsIDB4MDYsIDB4MEUsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4MDcsIDB4MDAsIDB4QzIsIDB4QTQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODcsIDB4RjgsIDB4QkYsCisJIDB4QzAsIDB4ODQsIDB4NUIsIDB4RjEsIDB4NTYsIDB4RkIsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDUsIDB4NjQsIDB4NDQsIDB4NTIsIDB4RkIsCisJIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NTIsIDB4RjEsIDB4MkYsIDB4NjcsIDB4RDAsIDB4ODAsIDB4NjAsIDB4NDUsIDB4MDIsIDB4MjgsIDB4NjQsIDB4NDUsCisJIDB4NTUsIDB4RjEsIDB4OEIsIDB4NjcsIDB4RDAsIDB4ODAsIDB4NjAsIDB4NDEsIDB4MDIsIDB4MjQsIDB4NjQsIDB4NDEsIDB4RDUsIDB4ODQsIDB4ODAsIDB4NjUsCisJIDB4QzQsIDB4ODcsIDB4MDEsIDB4MDUsIDB4MDAsIDB4NjQsIDB4RkYsIDB4QjQsIDB4NDAsIDB4NDksIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsCisJIDB4MEMsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4NjAsIDB4MEMsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MEMsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MjAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4NDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MjcsIDB4RjIsIDB4NzAsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MEEsIDB4MzYsIDB4MTAsIDB4MDAsIDB4MTQsIDB4MzYsCisJIDB4MTQsIDB4MDAsIDB4MzcsIDB4MzYsIDB4MEUsIDB4MDAsIDB4NkUsIDB4MzYsIDB4MEUsIDB4MDAsIDB4MDYsIDB4MzYsIDB4MDQsIDB4MDAsIDB4MDksIDB4MzYsCisJIDB4MDQsIDB4MDAsIDB4MTgsIDB4NjMsIDB4MEEsIDB4MDAsIDB4MzAsIDB4NjMsIDB4MDgsIDB4MDAsIDB4MjYsIDB4NjMsIDB4MDYsIDB4MDAsIDB4RDAsIDB4NjMsCisJIDB4MDQsIDB4MDAsIDB4MzMsIDB4NjMsIDB4MDIsIDB4MDAsIDB4MjEsIDB4NjMsIDB4MDAsIDB4MDAsIDB4MTAsIDB4NjAsIDB4MEUsIDB4RkQsIDB4MjYsIDB4NDYsCisJIDB4M0YsIDB4RjIsIDB4ODcsIDB4RjAsIDB4MDAsIDB4RjQsIDB4NDUsIDB4NDMsIDB4MDMsIDB4NEIsIDB4NjAsIDB4NDMsIDB4RjQsIDB4QTMsIDB4MDAsIDB4NjAsCisJIDB4MUQsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjUsIDB4MDEsIDB4NjAsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NEMsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4N0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QkIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NEEsIDB4NjAsIDB4RkUsCisJIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDMsIDB4NjAsIDB4NDEsIDB4RkUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MkMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4MjYsIDB4NDYsIDB4M0YsIDB4RjIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDMsIDB4RjQsIDB4QTMsIDB4MDAsIDB4NjAsCisJIDB4MUQsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MzIsIDB4NjUsIDB4MDEsIDB4NjAsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NEMsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4N0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QkIsIDB4RkYsIDB4RkYsIDB4MEIsIDB4MDMsIDB4NjAsIDB4RkUsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsCisJIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDMsIDB4NjAsIDB4NDEsIDB4RkUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsCisJIDB4MkEsIDB4NDQsIDB4RkMsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4M0YsIDB4RjIsIDB4MDEsIDB4NjAsCisJIDB4MDAsIDB4NjUsIDB4RjQsIDB4QTQsIDB4RDQsIDB4ODAsIDB4NjAsIDB4NDEsIDB4MDIsIDB4MjQsIDB4NjUsIDB4NDEsIDB4NDEsIDB4NDgsIDB4MDAsIDB4RjQsCisJIDB4MUUsIDB4NjUsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4QTUsIDB4RDAsIDB4REEsIDB4ODUsIDB4ODAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsCisJIDB4MDQsIDB4NjUsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4Q0QsIDB4ODEsIDB4QkQsIDB4REIsIDB4MDUsIDB4MDMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4Q0QsIDB4ODEsIDB4QkQsIDB4REIsIDB4RjAsIDB4MDIsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4MjgsIDB4NDEsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDEsCisJIDB4RkQsIDB4QTAsIDB4RkUsIDB4QTEsIDB4MDcsIDB4MDMsIDB4MDksIDB4MDYsIDB4NjQsIDB4NDQsIDB4RTAsIDB4ODUsIDB4RDEsIDB4ODEsIDB4QzcsIDB4ODMsCisJIDB4RjUsIDB4MDcsIDB4MDMsIDB4MDAsIDB4QTMsIDB4RDMsIDB4MEUsIDB4NjAsIDB4M0MsIDB4RkIsIDB4MzEsIDB4NDAsIDB4MDYsIDB4MjYsIDB4NTcsIDB4MDAsCisJIDB4MDAsIDB4NjQsIDB4NkYsIDB4RkIsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4MjgsIDB4NDEsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDEsIDB4RkMsIDB4QTAsCisJIDB4RkIsIDB4QTAsIDB4MDksIDB4MDMsIDB4MjgsIDB4MDMsIDB4NjQsIDB4NDQsIDB4RTAsIDB4ODUsIDB4QzcsIDB4ODMsIDB4RDEsIDB4ODEsIDB4RkUsIDB4QTEsCisJIDB4NDYsIDB4MDYsIDB4RjMsIDB4MDcsIDB4NDQsIDB4MDAsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDMsIDB4MDAsIDB4QjgsIDB4NkYsIDB4RkIsIDB4NkUsIDB4RkIsCisJIDB4QkQsIDB4RDMsIDB4M0QsIDB4MDIsIDB4QTMsIDB4RDMsIDB4NjAsIDB4NDUsIDB4NjAsIDB4NDcsIDB4QjQsIDB4ODQsIDB4NjAsIDB4NDEsIDB4M0YsIDB4QjUsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4NzEsIDB4RkIsIDB4NjUsIDB4NDcsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4NzAsIDB4RkIsIDB4NjQsIDB4NDQsIDB4RTAsIDB4ODUsIDB4RkEsIDB4QTMsIDB4QzcsIDB4ODMsIDB4NjEsIDB4NDQsCisJIDB4MEUsIDB4NjAsIDB4MzgsIDB4RkIsIDB4RDIsIDB4MDEsIDB4QkQsIDB4RDMsIDB4QTMsIDB4RDMsIDB4MDAsIDB4QjgsIDB4NkQsIDB4RkIsIDB4NzMsIDB4RkIsCisJIDB4MUUsIDB4MDIsIDB4ODUsIDB4RjEsIDB4NkYsIDB4RjMsIDB4NkMsIDB4RjksIDB4MDQsIDB4NjUsIDB4NjAsIDB4NDAsIDB4MDAsIDB4M0EsIDB4MDYsIDB4NjUsCisJIDB4MzEsIDB4NDQsIDB4QjQsIDB4ODQsIDB4NDAsIDB4NTEsIDB4MDIsIDB4MkEsIDB4MEIsIDB4MDAsIDB4MDgsIDB4QkMsIDB4NDAsIDB4NTEsIDB4NzEsIDB4RjMsCisJIDB4NzAsIDB4RjEsIDB4MDAsIDB4QjgsIDB4NjQsIDB4NDUsIDB4MDEsIDB4MDMsIDB4NjcsIDB4NDUsIDB4NjUsIDB4NTAsIDB4Q0MsIDB4ODQsIDB4NzIsIDB4RkIsCisJIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDgsIDB4NjAsCisJIDB4MTYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4ODAsIDB4MkEsIDB4M0YsIDB4MDAsIDB4MDEsIDB4NjQsIDB4MTAsIDB4NjAsIDB4MEEsIDB4RkIsCisJIDB4MjYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MEQsIDB4RjIsIDB4N0UsIDB4RkIsCisJIDB4MDAsIDB4NjQsIDB4ODQsIDB4RkIsIDB4MjYsIDB4NDYsIDB4M0YsIDB4RjIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDMsIDB4RjQsIDB4QTMsIDB4MDAsIDB4NjAsCisJIDB4MUQsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MDcsIDB4NjUsIDB4MDEsIDB4NjAsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NEMsIDB4RkQsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4N0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QkIsIDB4RkYsIDB4RkYsIDB4MTQsIDB4MDMsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjUsIDB4QTUsIDB4RDMsCisJIDB4MUMsIDB4NjAsIDB4RTYsIDB4NjMsIDB4RkYsIDB4QjQsIDB4MDEsIDB4QTQsIDB4NjAsIDB4NDEsIDB4QTUsIDB4RDEsIDB4REEsIDB4ODUsIDB4NjQsIDB4NDQsCisJIDB4MDAsIDB4N0YsIDB4Q0QsIDB4ODEsIDB4QkQsIDB4REIsIDB4MDUsIDB4MDMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4Q0QsIDB4ODEsIDB4QkQsIDB4REIsCisJIDB4RjQsIDB4MDIsIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsIDB4MDAsIDB4NjAsIDB4ODAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MzIsIDB4MDAsIDB4MjcsIDB4NjAsIDB4NTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4REIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDMsIDB4QTgsIDB4MDIsIDB4QTgsCisJIDB4MDIsIDB4MDMsIDB4M0UsIDB4MDIsIDB4RjYsIDB4MDEsIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsIDB4RkYsIDB4NjAsIDB4RkIsIDB4NjQsIDB4QTAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MUMsIDB4NjAsIDB4OTIsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MTAsIDB4NjAsIDB4MEUsIDB4RjMsIDB4MjUsIDB4RjIsIDB4NjAsIDB4NDUsIDB4MjQsIDB4RjAsIDB4MDAsIDB4RjQsCisJIDB4NjQsIDB4NDMsIDB4QzcsIDB4ODMsIDB4NjAsIDB4NDEsIDB4MDIsIDB4MjQsIDB4MDEsIDB4QTEsIDB4MEEsIDB4RjAsIDB4MDksIDB4RjIsIDB4RDEsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDksIDB4MDcsIDB4MDQsIDB4MDQsIDB4NjMsIDB4NDUsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDYsIDB4MjYsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4NjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MjYsIDB4RjAsIDB4RkYsIDB4NjcsIDB4MjAsIDB4ODgsIDB4NjQsIDB4NUYsCisJIDB4NDAsIDB4NEEsIDB4MjQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4ODAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4NDgsIDB4MjQsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4OTAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4NjAsIDB4MEQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MjIsIDB4QjMsIDB4MDEsIDB4MDAsIDB4NjAsIDB4OTUsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4QkYsIDB4QjQsIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsIDB4MEUsIDB4RjMsIDB4MjYsIDB4NDYsIDB4NjAsIDB4NDUsIDB4MjAsIDB4NjAsCisJIDB4MDQsIDB4NjMsIDB4MDAsIDB4RjQsIDB4MDksIDB4RjIsIDB4QkQsIDB4REIsIDB4RkYsIDB4RkYsIDB4MEEsIDB4RjIsIDB4QkQsIDB4REIsIDB4MEIsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4QkQsIDB4REIsIDB4MEMsIDB4RjIsIDB4QTMsIDB4REIsIDB4RkEsIDB4QTMsIDB4MjYsIDB4NDYsIDB4QTMsIDB4RDMsIDB4MjQsIDB4RjAsCisJIDB4MDAsIDB4NjEsIDB4RDAsIDB4ODQsIDB4RjEsIDB4ODEsIDB4RDQsIDB4ODQsIDB4RjEsIDB4ODEsIDB4QkQsIDB4REIsIDB4QTMsIDB4RDMsIDB4MDMsIDB4QjEsCisJIDB4MDMsIDB4QTksIDB4MjUsIDB4RjAsIDB4NDIsIDB4RkUsIDB4MDUsIDB4MDMsIDB4RkQsIDB4QTEsIDB4Q0MsIDB4ODQsIDB4MDEsIDB4MDIsIDB4Q0MsIDB4ODQsCisJIDB4MDAsIDB4NjEsIDB4RjEsIDB4ODEsIDB4RDAsIDB4ODQsIDB4RjEsIDB4ODEsIDB4QkQsIDB4REIsIDB4QTMsIDB4RDMsIDB4MDMsIDB4QjEsIDB4MDMsIDB4QTksCisJIDB4MjgsIDB4RjAsIDB4NDIsIDB4RkUsIDB4MDEsIDB4MDMsIDB4Q0MsIDB4ODQsIDB4RjEsIDB4ODEsIDB4RDAsIDB4ODQsIDB4RjEsIDB4ODEsIDB4QkQsIDB4REIsCisJIDB4QTMsIDB4RDMsIDB4MDMsIDB4QjEsIDB4MDMsIDB4QTksIDB4MjksIDB4RjAsIDB4MDEsIDB4MDMsIDB4Q0MsIDB4ODQsIDB4RDAsIDB4ODQsIDB4QTMsIDB4REIsCisJIDB4MTAsIDB4NjAsIDB4MEEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QTgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4RjUsIDB4RkUsIDB4MTAsIDB4NjAsIDB4MDIsIDB4RjEsIDB4MDYsIDB4QTIsIDB4QTIsIDB4RDMsIDB4NjQsIDB4NDUsIDB4NjAsIDB4NDAsIDB4ODAsIDB4MkIsCisJIDB4MDMsIDB4MDAsIDB4RkYsIDB4NjAsIDB4RkYsIDB4NjQsIDB4OTQsIDB4ODUsIDB4MDAsIDB4NjAsIDB4OTYsIDB4NjQsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MEEsIDB4MDYsIDB4MTAsIDB4NjAsIDB4MEEsIDB4RjMsIDB4NjksIDB4RjMsIDB4MDAsIDB4QTgsIDB4MDQsIDB4QjAsIDB4MDQsIDB4MDIsIDB4MDMsIDB4MDMsCisJIDB4MjcsIDB4NjAsIDB4MzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MDksIDB4RjIsIDB4NUEsIDB4RDIsIDB4NDAsIDB4NDgsCisJIDB4NDAsIDB4NEEsIDB4NUEsIDB4RDIsIDB4NUEsIDB4RDIsIDB4NDAsIDB4NEMsIDB4NjAsIDB4NDEsIDB4NUEsIDB4RDAsIDB4N0UsIDB4RjksIDB4NDAsIDB4NjMsCisJIDB4QUQsIDB4ODAsIDB4RjAsIDB4QTMsIDB4MDksIDB4MDIsIDB4M0MsIDB4MDMsIDB4MkMsIDB4NDEsIDB4MkEsIDB4NDQsIDB4NDAsIDB4NEMsIDB4MjgsIDB4NDQsCisJIDB4NDAsIDB4NEEsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NDgsIDB4RjQsIDB4MDEsIDB4RDEsIDB4ODAsIDB4MDEsIDB4MDIsIDB4MzEsIDB4MDQsIDB4MTAsIDB4QTMsCisJIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4QTUsIDB4ODAsIDB4Q0YsIDB4ODMsIDB4MDgsIDB4MDIsIDB4MjgsIDB4NDQsIDB4NjAsIDB4ODgsIDB4MkEsIDB4NDQsCisJIDB4NzAsIDB4OEEsIDB4MkMsIDB4NDQsIDB4NzAsIDB4OEMsIDB4RjEsIDB4ODEsIDB4RjUsIDB4MDEsIDB4RTcsIDB4QTMsIDB4NjQsIDB4NDQsIDB4MDAsIDB4QTgsCisJIDB4MDAsIDB4NjIsIDB4MDIsIDB4MDIsIDB4MDAsIDB4NjEsIDB4MUMsIDB4MDAsIDB4RTAsIDB4ODQsIDB4REUsIDB4ODIsIDB4RkQsIDB4MDQsIDB4NDIsIDB4RkUsCisJIDB4RjgsIDB4ODQsIDB4NjIsIDB4NDUsIDB4QzcsIDB4ODMsIDB4NjAsIDB4NDUsIDB4MDIsIDB4RkUsIDB4RDUsIDB4ODQsIDB4MDIsIDB4MDUsIDB4MDEsIDB4MDUsCisJIDB4NjEsIDB4NDQsIDB4Q0YsIDB4ODMsIDB4NjAsIDB4NDEsIDB4MDgsIDB4MDMsIDB4MjgsIDB4NDQsIDB4NjAsIDB4ODgsIDB4MkEsIDB4NDQsIDB4NzAsIDB4OEEsCisJIDB4MkMsIDB4NDQsIDB4NzAsIDB4OEMsIDB4RjEsIDB4ODEsIDB4RjEsIDB4MDEsIDB4Q0UsIDB4ODIsIDB4RTksIDB4ODEsIDB4RkQsIDB4MDIsIDB4RjEsIDB4ODEsCisJIDB4MDksIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4NUEsIDB4RDIsIDB4M0YsIDB4QjUsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QjQsIDB4ODQsIDB4NjEsIDB4NDUsIDB4RDQsIDB4ODQsCisJIDB4QzAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4OTMsIDB4MTAsIDB4NjAsIDB4MEEsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4MTgsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTYsIDB4NjUsIDB4MzIsIDB4NDAsIDB4ODAsIDB4MjYsIDB4MTYsIDB4NjUsIDB4NzMsIDB4NDQsCisJIDB4RDQsIDB4OTMsIDB4NjksIDB4RjMsIDB4MjYsIDB4NDYsIDB4MDQsIDB4QkMsIDB4QTIsIDB4REIsIDB4MjYsIDB4RjAsIDB4RkYsIDB4NjcsIDB4MjAsIDB4ODgsCisJIDB4NjQsIDB4NUYsIDB4NDAsIDB4NEEsIDB4MjQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4ODAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4NDgsIDB4MjQsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4OTAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NkIsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4QzgsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDUsIDB4MDAsIDB4NjQsIDB4NkIsIDB4RkIsIDB4MDgsIDB4NjAsIDB4MEMsIDB4RjEsCisJIDB4MDAsIDB4NjAsIDB4NDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MUMsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4MTMsIDB4NjAsCisJIDB4MjIsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MEMsIDB4RjEsIDB4RkYsIDB4NjAsCisJIDB4REYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MjYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MUUsIDB4RjEsCisJIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUMsIDB4NjAsCisJIDB4REEsIDB4NjMsIDB4QTMsIDB4REYsIDB4MDYsIDB4QTMsIDB4MTAsIDB4NjAsIDB4QTQsIDB4NjQsIDB4QkQsIDB4REIsIDB4QkQsIDB4REIsIDB4MDYsIDB4NjQsCisJIDB4QTMsIDB4REIsIDB4MjcsIDB4NjAsIDB4NjgsIDB4NjQsIDB4MDgsIDB4NjAsIDB4NTEsIDB4RkIsIDB4MTAsIDB4NjAsIDB4MEYsIDB4RjEsIDB4MEUsIDB4NjAsCisJIDB4NkYsIDB4RjksIDB4MjcsIDB4NjAsIDB4Q0YsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MzgsIDB4RkIsIDB4MTEsIDB4NjAsIDB4NDQsIDB4NjMsIDB4MDgsIDB4NjAsCisJIDB4NjYsIDB4RkQsIDB4MTIsIDB4NjAsIDB4NDAsIDB4NjMsIDB4MDgsIDB4NjAsIDB4NjcsIDB4RkQsIDB4Q0YsIDB4RjMsIDB4MDIsIDB4NjMsIDB4MDEsIDB4MUIsCisJIDB4Q0YsIDB4RkQsIDB4Q0YsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RjcsIDB4QTAsIDB4MDEsIDB4NjQsIDB4MDEsIDB4MDYsIDB4Q0YsIDB4RkIsIDB4Q0YsIDB4RjMsCisJIDB4Q0YsIDB4RkIsIDB4Q0YsIDB4RjMsIDB4MTIsIDB4NjAsIDB4NzgsIDB4NjMsIDB4MjYsIDB4MTgsIDB4Q0MsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDMsCisJIDB4MkEsIDB4QTMsIDB4RkIsIDB4MDEsIDB4NjMsIDB4NDYsIDB4MTAsIDB4NjAsIDB4RjIsIDB4NjMsIDB4MEUsIDB4NjEsIDB4NjAsIDB4RkUsIDB4QTYsIDB4RDEsCisJIDB4REUsIDB4ODYsIDB4MDEsIDB4NjQsIDB4NjQsIDB4NDAsIDB4N0YsIDB4MzYsIDB4MDAsIDB4NjQsIDB4QTMsIDB4REIsIDB4REIsIDB4ODMsIDB4QTMsIDB4RDksCisJIDB4Q0QsIDB4ODEsIDB4MDQsIDB4QTMsIDB4RjQsIDB4MDIsIDB4MTEsIDB4NjAsIDB4NjIsIDB4NjMsIDB4MUMsIDB4NjEsIDB4QTYsIDB4RDEsIDB4REUsIDB4ODYsCisJIDB4MDEsIDB4NjQsIDB4NjQsIDB4NDAsIDB4N0YsIDB4MzYsIDB4MDAsIDB4NjQsIDB4QTMsIDB4REIsIDB4REIsIDB4ODMsIDB4QTMsIDB4RDksIDB4Q0QsIDB4ODEsCisJIDB4MDYsIDB4QTMsIDB4RjQsIDB4MDIsIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjAsIDB4NjAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUYsIDB4RkIsIDB4MjcsIDB4NjAsCisJIDB4RTEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTEsIDB4NjAsIDB4NDQsIDB4NjMsIDB4MDgsIDB4NjAsCisJIDB4NjYsIDB4RkQsIDB4MTIsIDB4NjAsIDB4NDAsIDB4NjMsIDB4MDgsIDB4NjAsIDB4NjcsIDB4RkQsIDB4MDAsIDB4NjAsIDB4NjAsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MUYsIDB4RkIsIDB4MjcsIDB4NjAsIDB4RTEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4MEYsIDB4QjQsIDB4OTgsIDB4MDAsIDB4RkYsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4NjQsCisJIDB4MTMsIDB4NjAsIDB4MUMsIDB4RkIsIDB4MjcsIDB4MDAsIDB4MEMsIDB4NjQsIDB4M0YsIDB4NDAsIDB4MDIsIDB4MkIsIDB4MjMsIDB4MDAsIDB4MjksIDB4RjEsCisJIDB4MTMsIDB4NjAsIDB4MUMsIDB4RkIsIDB4NUEsIDB4RDksIDB4MjcsIDB4NjAsIDB4RkQsIDB4NjQsIDB4OUYsIDB4RkIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsCisJIDB4MkEsIDB4NjAsIDB4MUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjksIDB4NjAsIDB4MUMsIDB4NjMsIDB4MDksIDB4NjEsIDB4M0QsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4MjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NzUsIDB4MDAsIDB4OTUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4N0YsIDB4QjQsIDB4OTUsIDB4RkIsIDB4MDYsIDB4NjQsCisJIDB4MTMsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjQsCisJIDB4MTMsIDB4NjAsIDB4MUMsIDB4RkIsIDB4MjgsIDB4NjAsIDB4N0EsIDB4NjQsIDB4OUYsIDB4RkIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MkEsIDB4NjAsCisJIDB4MUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjksIDB4RjMsIDB4MTIsIDB4NjAsIDB4NDUsIDB4NjUsIDB4NjAsIDB4NUMsIDB4M0YsIDB4NDAsIDB4MDIsIDB4MkIsCisJIDB4MTMsIDB4MDAsIDB4MDAsIDB4MzcsIDB4MTEsIDB4MDAsIDB4MDEsIDB4M0IsIDB4NTMsIDB4MDAsIDB4MTEsIDB4NjAsIDB4NjUsIDB4NjMsIDB4RkYsIDB4QjcsCisJIDB4NjAsIDB4NUMsIDB4QTMsIDB4RDMsIDB4MDgsIDB4QTMsIDB4MDAsIDB4N0UsIDB4RDAsIDB4ODAsIDB4RDcsIDB4ODAsIDB4MDIsIDB4MDMsIDB4RjksIDB4MDIsCisJIDB4NDcsIDB4MDAsIDB4RjQsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MDUsIDB4MDAsIDB4MDAsIDB4QkMsIDB4RjIsIDB4QTQsIDB4NDEsIDB4MDMsIDB4NDAsIDB4MDcsCisJIDB4NjQsIDB4NDQsIDB4N0QsIDB4RkIsIDB4QTEsIDB4RkIsIDB4MDcsIDB4NjQsIDB4QTIsIDB4RkIsIDB4MjgsIDB4NjAsIDB4N0EsIDB4NjQsIDB4OUYsIDB4RkIsCisJIDB4RkYsIDB4RkYsIDB4REYsIDB4RkUsIDB4MDAsIDB4NjQsIDB4MTksIDB4RkYsIDB4MkEsIDB4NjAsIDB4MUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODgsIDB4RkYsCisJIDB4QkEsIDB4NjAsIDB4OTgsIDB4NzEsIDB4OEQsIDB4RTIsIDB4MDEsIDB4MTEsIDB4MDksIDB4MDAsIDB4NzEsIDB4NDAsIDB4ODAsIDB4MjcsIDB4RkIsIDB4MDEsCisJIDB4ODgsIDB4RTIsIDB4QkEsIDB4NjAsIDB4RDAsIDB4NjQsIDB4MDMsIDB4RkIsIDB4OEQsIDB4RkYsIDB4MTUsIDB4MDAsIDB4OEQsIDB4RkYsIDB4MjgsIDB4NjAsCisJIDB4RkIsIDB4NjMsIDB4MDYsIDB4NjAsIDB4MEIsIDB4RkQsIDB4RkYsIDB4RkYsIDB4NjIsIDB4RkYsIDB4MjgsIDB4NjAsIDB4NjcsIDB4NjMsIDB4OUYsIDB4RkQsCisJIDB4RkYsIDB4RkYsIDB4MUEsIDB4RkYsIDB4MkEsIDB4NjAsIDB4MUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4NjAsIDB4RjQsIDB4NjMsIDB4MDYsIDB4NjAsCisJIDB4MEIsIDB4RkQsIDB4RkYsIDB4RkYsIDB4NjIsIDB4RkYsIDB4MjksIDB4RjUsIDB4MjYsIDB4NjAsIDB4MjAsIDB4NjMsIDB4MjUsIDB4NjAsIDB4RjIsIDB4NjQsCisJIDB4QkQsIDB4REIsIDB4NjYsIDB4NDQsIDB4QkQsIDB4REIsIDB4MDIsIDB4NjQsIDB4QTMsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RjksIDB4RkUsCisJIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjgsIDB4MDEsIDB4MDAsIDB4MzYsIDB4NjksIDB4MDEsIDB4MDEsIDB4MzYsIDB4NkIsIDB4MDEsCisJIDB4MDIsIDB4MzYsIDB4ODEsIDB4MDEsIDB4MDMsIDB4MzYsIDB4OEIsIDB4MDEsIDB4MDQsIDB4MzYsIDB4QzEsIDB4MDEsIDB4MDUsIDB4MzYsIDB4QkYsIDB4MDEsCisJIDB4MDYsIDB4MzYsIDB4RjEsIDB4MDEsIDB4MDcsIDB4MzYsIDB4QkIsIDB4MDEsIDB4MDgsIDB4MzYsIDB4OEMsIDB4MDEsIDB4MDksIDB4MzYsIDB4MEMsIDB4MDAsCisJIDB4MEEsIDB4MzYsIDB4MEQsIDB4MDAsIDB4MEIsIDB4MzYsIDB4MEUsIDB4MDAsIDB4MEMsIDB4MzYsIDB4MTcsIDB4MDAsIDB4MEQsIDB4MzYsIDB4MEQsIDB4MDAsCisJIDB4MEUsIDB4MzYsIDB4MUQsIDB4MDAsIDB4MEYsIDB4MzYsIDB4NDEsIDB4MDAsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4MDAsIDB4MDQsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4MDUsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MzIsIDB4NDUsCisJIDB4QjQsIDB4ODUsIDB4NDUsIDB4NTIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjksIDB4NjAsIDB4REUsIDB4NjMsIDB4MDYsIDB4NjAsCisJIDB4MEIsIDB4RkQsIDB4NjIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MUEsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4M0YsIDB4NDAsCisJIDB4MDIsIDB4MkIsIDB4MTUsIDB4MDAsIDB4ODgsIDB4RkYsIDB4QkEsIDB4NjAsIDB4OTgsIDB4NzEsIDB4OEQsIDB4RTIsIDB4MDEsIDB4MTEsIDB4MDksIDB4MDAsCisJIDB4NzEsIDB4NDAsIDB4ODAsIDB4MjcsIDB4RkIsIDB4MDEsIDB4ODgsIDB4RTIsIDB4QkEsIDB4NjAsIDB4RDAsIDB4NjQsIDB4MDMsIDB4RkIsIDB4OEQsIDB4RkYsCisJIDB4MTEsIDB4MDAsIDB4OEQsIDB4RkYsIDB4OTAsIDB4NjAsIDB4MDAsIDB4RTgsIDB4MjgsIDB4NjAsIDB4RkIsIDB4NjMsIDB4MDQsIDB4MDAsIDB4OTEsIDB4NjAsCisJIDB4MDAsIDB4RTgsIDB4MjksIDB4NjAsIDB4QzQsIDB4NjMsIDB4MkEsIDB4RTgsIDB4MDYsIDB4NjAsIDB4MEIsIDB4RkQsIDB4RkYsIDB4RkYsIDB4NjIsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4MUEsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RjEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RUYsIDB4QjQsCisJIDB4RjEsIDB4RkIsIDB4QUQsIDB4NEYsIDB4RkQsIDB4QjQsIDB4QTAsIDB4NUQsIDB4RDAsIDB4NjAsIDB4MDAsIDB4RTgsIDB4MkEsIDB4RTgsIDB4RDksIDB4NjAsCisJIDB4RkUsIDB4NjQsIDB4MzIsIDB4NDUsIDB4QTQsIDB4ODUsIDB4NDUsIDB4NTIsIDB4OTksIDB4RkYsIDB4QTUsIDB4NEYsIDB4RkYsIDB4QjQsIDB4MDcsIDB4RkIsCisJIDB4OTgsIDB4RkYsIDB4QTMsIDB4NjAsIDB4RjQsIDB4NjMsIDB4MDYsIDB4NjAsIDB4MEIsIDB4RkQsIDB4NjIsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MDgsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NDMsIDB4RkYsIDB4MDEsIDB4NjAsIDB4MDAsIDB4RTEsIDB4MjgsIDB4RjMsCisJIDB4NDcsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDcsIDB4MzcsIDB4NjYsIDB4MDAsIDB4MDUsIDB4M0IsIDB4MDQsIDB4MDAsIDB4RkYsIDB4MEEsIDB4ODAsIDB4RTEsCisJIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MUIsIDB4NjAsIDB4RjMsIDB4RjEsIDB4QUQsIDB4NEYsIDB4MDAsIDB4N0YsIDB4RkEsIDB4QjQsIDB4NjQsIDB4NDEsCisJIDB4N0QsIDB4RjEsIDB4MDIsIDB4QjEsIDB4MDQsIDB4NjUsIDB4MDIsIDB4MDIsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MDEsIDB4NjUsIDB4QjQsIDB4ODQsCisJIDB4QTAsIDB4NUQsIDB4MjksIDB4RjUsIDB4MkEsIDB4RjMsIDB4NDcsIDB4RkYsIDB4M0YsIDB4RjAsIDB4MDEsIDB4MUIsIDB4MDEsIDB4NjQsIDB4NjAsIDB4NTYsCisJIDB4QUQsIDB4RTIsIDB4QjUsIDB4RkYsIDB4NkMsIDB4NDAsIDB4NDAsIDB4RTEsIDB4QTEsIDB4RkYsIDB4MDAsIDB4RjQsIDB4NkUsIDB4NjEsIDB4MTIsIDB4NjIsCisJIDB4NjQsIDB4NDMsIDB4MDEsIDB4RTEsIDB4MDMsIDB4NjQsIDB4RTIsIDB4RDAsIDB4QzksIDB4ODEsIDB4NjQsIDB4NEMsIDB4Q0MsIDB4ODQsIDB4REEsIDB4ODIsCisJIDB4RkEsIDB4MDIsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NkIsIDB4OUEsIDB4RkYsIDB4Q0EsIDB4ODIsIDB4MDMsIDB4MDAsIDB4MDAsIDB4RjQsIDB4ODEsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4N0EsIDB4RDAsIDB4QTEsIDB4RkYsIDB4NjQsIDB4NEMsIDB4RkMsIDB4MUMsIDB4RjgsIDB4MUQsIDB4MDAsIDB4QjksIDB4MDYsIDB4MUUsCisJIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4REEsIDB4ODIsIDB4NUEsIDB4RDIsIDB4QTEsIDB4RkYsIDB4NjAsIDB4NEQsIDB4M0YsIDB4NDAsIDB4MDIsIDB4MkIsCisJIDB4MTAsIDB4MDAsIDB4MjgsIDB4RjMsIDB4QTUsIDB4NjAsIDB4QzQsIDB4NjUsIDB4NjAsIDB4NDAsIDB4MEUsIDB4M0IsIDB4MEEsIDB4MDAsIDB4RjEsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MTAsIDB4QkMsIDB4RjEsIDB4RkIsIDB4QUQsIDB4NEYsIDB4MDIsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUQsIDB4ODUsIDB4NEMsCisJIDB4RkUsIDB4MDEsIDB4RjEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsIDB4RjEsIDB4RkIsIDB4QTEsIDB4RkYsIDB4ODcsIDB4NEUsIDB4ODcsIDB4NEMsCisJIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEMsIDB4NjcsIDB4NEMsIDB4RkYsIDB4RkYsIDB4QkMsIDB4RkYsIDB4MDAsIDB4RTEsIDB4RDUsIDB4RkUsCisJIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NDYsIDB4NjAsIDB4NDEsIDB4QjUsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsCisJIDB4MjksIDB4RjUsIDB4M0YsIDB4RjAsIDB4MjQsIDB4RjIsIDB4NDQsIDB4NDMsIDB4NDAsIDB4NEQsIDB4MDAsIDB4RjQsIDB4RjMsIDB4NjAsIDB4QTAsIDB4NjUsCisJIDB4MTAsIDB4NjIsIDB4NUEsIDB4RDIsIDB4RDksIDB4ODEsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4RkIsIDB4MDIsIDB4NjEsIDB4NDUsIDB4MkQsIDB4NDQsCisJIDB4RDQsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RkQsIDB4QTUsIDB4NDgsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QzQsIDB4OUQsCisJIDB4MEQsIDB4NjAsIDB4MDAsIDB4NkIsIDB4MkQsIDB4NDQsIDB4QzAsIDB4ODMsIDB4QkIsIDB4RkYsIDB4MjksIDB4RjUsIDB4MDEsIDB4RTEsIDB4MDAsIDB4RjQsCisJIDB4NkMsIDB4NjEsIDB4MTAsIDB4NjIsIDB4MDUsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4MDQsIDB4NjIsCisJIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTAsIDB4MUEsIDB4MDAsIDB4MjYsIDB4NDQsIDB4MDEsIDB4MjYsIDB4MEMsIDB4MDAsIDB4MkQsIDB4NDQsCisJIDB4QzgsIDB4ODQsIDB4NDAsIDB4NEQsIDB4MDIsIDB4MDMsIDB4NkMsIDB4NDUsIDB4RjMsIDB4MDEsIDB4MDMsIDB4MTUsIDB4MDEsIDB4NjQsIDB4MDUsIDB4RkEsCisJIDB4MTUsIDB4MDAsIDB4NkMsIDB4NDUsIDB4RUQsIDB4MDEsIDB4MjMsIDB4NDQsIDB4QzgsIDB4ODQsIDB4NDAsIDB4NDMsIDB4MDIsIDB4MDMsIDB4NkMsIDB4NDUsCisJIDB4RTcsIDB4MDEsIDB4MDAsIDB4NjQsIDB4MDEsIDB4MTUsIDB4MDEsIDB4NjQsIDB4NkMsIDB4NDUsIDB4MDUsIDB4RkIsIDB4RTIsIDB4RDIsIDB4REEsIDB4ODIsCisJIDB4QzksIDB4ODEsIDB4NjAsIDB4NEMsIDB4REQsIDB4MUMsIDB4RDcsIDB4MDMsIDB4QkMsIDB4RkYsIDB4REEsIDB4MDEsIDB4MDAsIDB4RTEsIDB4RDUsIDB4RkUsCisJIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDgsIDB4RTEsIDB4QTEsIDB4RkYsIDB4NjcsIDB4NEMsIDB4NDMsIDB4RkYsIDB4RjEsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MTAsIDB4QkMsIDB4RjEsIDB4RkIsIDB4QUQsIDB4NEYsIDB4MDIsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUQsIDB4MDEsIDB4RTEsIDB4MDEsIDB4NjAsCisJIDB4NjksIDB4NkIsIDB4QTUsIDB4NjAsIDB4QzQsIDB4NjQsIDB4NjAsIDB4NEMsIDB4QkIsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NEMsCisJIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NEMsIDB4RkMsIDB4MDEsIDB4MjksIDB4RjMsIDB4MkEsIDB4RjEsIDB4MDcsIDB4QjUsIDB4MDQsIDB4RTEsCisJIDB4NjUsIDB4NDEsIDB4NjQsIDB4NTQsIDB4Q0QsIDB4RTIsIDB4OTUsIDB4ODEsIDB4QTEsIDB4NUQsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjksIDB4MDEsCisJIDB4NjEsIDB4NDQsIDB4RkUsIDB4RkIsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MDEsIDB4N0YsIDB4NjcsIDB4MDEsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4QjEsIDB4RkUsIDB4MDgsIDB4MDUsIDB4QjAsIDB4RkUsIDB4MDksIDB4MDUsIDB4QjIsIDB4RkUsIDB4QjMsIDB4RkUsIDB4NzgsIDB4NDMsIDB4MDEsIDB4NjEsCisJIDB4MjksIDB4NjAsIDB4RUEsIDB4NzgsIDB4MzQsIDB4NjAsIDB4OEQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4RjMsIDB4MjksIDB4RjEsIDB4NDAsIDB4NDQsCisJIDB4NDQsIDB4NDUsIDB4MkEsIDB4RjEsIDB4MkIsIDB4RjEsIDB4NDQsIDB4NDYsIDB4NDQsIDB4NDcsIDB4M0YsIDB4QjQsIDB4RTAsIDB4ODUsIDB4MjAsIDB4NjAsCisJIDB4MjgsIDB4NjQsIDB4NDQsIDB4RDcsIDB4NTgsIDB4NDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsIDB4MEUsIDB4NjAsIDB4REQsIDB4RjMsIDB4NjEsIDB4NDMsCisJIDB4MDQsIDB4QjQsIDB4MjQsIDB4NDQsIDB4MDIsIDB4MDMsIDB4MTMsIDB4RkYsIDB4MDYsIDB4MDAsIDB4M0YsIDB4QjQsIDB4QjQsIDB4ODQsIDB4RkYsIDB4MjcsCisJIDB4MDUsIDB4RkQsIDB4MDQsIDB4RkIsIDB4MTAsIDB4NzUsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODYsIDB4M0UsIDB4QjQsIDB4RkUsIDB4MEIsIDB4MDUsCisJIDB4QjUsIDB4RkUsIDB4MDIsIDB4MjQsIDB4OUYsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QjcsIDB4RkUsIDB4MDcsIDB4MDUsIDB4NzgsIDB4NDMsCisJIDB4MDEsIDB4NjEsIDB4MjksIDB4NjAsIDB4RUEsIDB4NzgsIDB4MzQsIDB4NjAsIDB4QzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzYsIDB4NDQsIDB4MDAsIDB4N0YsCisJIDB4RUUsIDB4QTAsIDB4NjAsIDB4NDUsIDB4MDUsIDB4MDUsIDB4MjAsIDB4NjAsIDB4QkEsIDB4NjQsIDB4NDQsIDB4RDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4NzgsIDB4NDMsIDB4MDEsIDB4NjEsIDB4MjksIDB4NjAsIDB4RUEsIDB4NzgsIDB4NzgsIDB4NDMsIDB4MDEsIDB4NjEsIDB4MjksIDB4NjAsIDB4RUEsIDB4NzgsCisJIDB4N0YsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjEsIDB4MTAsIDB4MDIsIDB4MTAsIDB4NjQsCisJIDB4NDAsIDB4NDAsIDB4MDIsIDB4NjQsIDB4NDAsIDB4NTAsIDB4NjEsIDB4RkYsIDB4M0YsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MDQsIDB4MDAsIDB4MTAsIDB4RTAsCisJIDB4NDYsIDB4NjAsIDB4MDksIDB4RTAsIDB4MDAsIDB4MDAsIDB4MjcsIDB4RjEsIDB4MDAsIDB4NjYsIDB4MjAsIDB4NzgsIDB4NDIsIDB4RkUsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4N0YsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjEsIDB4MUEsIDB4MDIsCisJIDB4MEUsIDB4NjAsIDB4REQsIDB4RjMsIDB4MDcsIDB4N0MsIDB4MjAsIDB4QjUsIDB4MEMsIDB4QjUsIDB4MDQsIDB4MDMsIDB4MDMsIDB4MDIsIDB4REIsIDB4RjksCisJIDB4MDAsIDB4NjcsIDB4MTAsIDB4MDAsIDB4MDAsIDB4NjEsIDB4NDEsIDB4NTYsIDB4QzcsIDB4RkUsIDB4QUQsIDB4MDEsIDB4MzYsIDB4NDcsIDB4RkYsIDB4MjMsCisJIDB4MDQsIDB4MDAsIDB4MDAsIDB4N0YsIDB4NjAsIDB4NDEsIDB4N0YsIDB4NjcsIDB4MDUsIDB4MDAsIDB4NjIsIDB4RkYsIDB4MjAsIDB4NDQsIDB4ODAsIDB4QkMsCisJIDB4NDAsIDB4NDAsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4N0YsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsCisJIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjEsIDB4MzEsIDB4MDIsIDB4MEUsIDB4NjAsIDB4REQsIDB4RjMsIDB4MDEsIDB4N0MsIDB4MjAsIDB4QjUsIDB4MEMsIDB4QjUsCisJIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDIsIDB4REIsIDB4RjksIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjEsIDB4NDEsIDB4NTYsIDB4QzcsIDB4RkUsIDB4MkEsIDB4NjAsCisJIDB4MUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OUQsIDB4RjEsIDB4MjAsIDB4NDQsIDB4NjQsIDB4NDAsIDB4RkYsIDB4MjYsIDB4MUMsIDB4MDAsIDB4N0YsIDB4QjQsCisJIDB4NDAsIDB4NDAsIDB4NUMsIDB4NUUsIDB4ODIsIDB4RkYsIDB4MjYsIDB4NDQsIDB4RkQsIDB4QjQsIDB4NDAsIDB4NDYsIDB4NUMsIDB4NDEsIDB4ODcsIDB4RkYsCisJIDB4NjIsIDB4RkYsIDB4MTMsIDB4NjAsIDB4MDIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MDQsIDB4MDMsIDB4MDksIDB4RjIsCisJIDB4OEYsIDB4RkMsIDB4QUMsIDB4ODYsIDB4RkIsIDB4MDEsIDB4OTUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4N0YsIDB4QjQsIDB4OTUsIDB4RkIsIDB4MDYsIDB4NjQsCisJIDB4MTMsIDB4NjAsIDB4MUMsIDB4RkIsIDB4MkQsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjAsIDB4NDAsCisJIDB4ODAsIDB4MkEsIDB4MDIsIDB4MDAsIDB4N0YsIDB4NjcsIDB4MDYsIDB4NjEsIDB4NjAsIDB4NDUsIDB4MEUsIDB4NjAsIDB4REQsIDB4RjMsIDB4NjEsIDB4NDMsCisJIDB4MDQsIDB4QjQsIDB4MjQsIDB4NDQsIDB4MDIsIDB4MDMsIDB4MTMsIDB4RkYsIDB4NTYsIDB4MDEsIDB4M0YsIDB4QjQsIDB4QjQsIDB4ODQsIDB4RkYsIDB4MjcsCisJIDB4MDUsIDB4RkQsIDB4MDQsIDB4RkIsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MkEsIDB4MDIsIDB4MDAsIDB4MTAsIDB4NzUsIDB4MDUsIDB4MDAsIDB4MDEsIDB4NjQsCisJIDB4MTksIDB4NjAsIDB4RjcsIDB4RkIsIDB4MDgsIDB4NjAsIDB4MTAsIDB4NzUsIDB4NDYsIDB4MDEsIDB4MjUsIDB4NDYsIDB4MDEsIDB4RjIsIDB4MDgsIDB4RjAsCisJIDB4NjAsIDB4NDcsIDB4MDMsIDB4QjQsIDB4MDMsIDB4QUMsIDB4N0YsIDB4NjcsIDB4MDMsIDB4NjEsIDB4MDgsIDB4MDIsIDB4MjYsIDB4NjAsIDB4MjAsIDB4NjQsCisJIDB4NDAsIDB4NEIsIDB4MzQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MjQsIDB4NDAsIDB4MDEsIDB4MkIsIDB4NDksIDB4MDAsIDB4MjUsIDB4NDQsIDB4MUYsIDB4QjQsIDB4RTAsIDB4ODUsIDB4MkEsIDB4NjAsIDB4RjQsIDB4NjQsCisJIDB4QzQsIDB4OTgsIDB4RkYsIDB4RkYsIDB4QzAsIDB4RkUsIDB4M0QsIDB4MDAsIDB4QzEsIDB4RkUsIDB4M0IsIDB4MDAsIDB4QzIsIDB4RkUsIDB4MzksIDB4MDAsCisJIDB4QzMsIDB4RkUsIDB4MzcsIDB4MDAsIDB4QzQsIDB4RkUsIDB4MzUsIDB4MDAsIDB4QzUsIDB4RkUsIDB4MzMsIDB4MDAsIDB4QzYsIDB4RkUsIDB4MzEsIDB4MDAsCisJIDB4QzcsIDB4RkUsIDB4MkYsIDB4MDAsIDB4QzgsIDB4RkUsIDB4MkQsIDB4MDAsIDB4QzksIDB4RkUsIDB4MkIsIDB4MDAsIDB4Q0EsIDB4RkUsIDB4MjksIDB4MDAsCisJIDB4Q0IsIDB4RkUsIDB4MjcsIDB4MDAsIDB4Q0MsIDB4RkUsIDB4MjUsIDB4MDAsIDB4Q0QsIDB4RkUsIDB4MjMsIDB4MDAsIDB4Q0UsIDB4RkUsIDB4MjEsIDB4MDAsCisJIDB4Q0YsIDB4RkUsIDB4MUYsIDB4MDAsIDB4RDAsIDB4RkUsIDB4MUQsIDB4MDAsIDB4RDEsIDB4RkUsIDB4MUIsIDB4MDAsIDB4RDIsIDB4RkUsIDB4MTksIDB4MDAsCisJIDB4RDMsIDB4RkUsIDB4MTcsIDB4MDAsIDB4RDQsIDB4RkUsIDB4MTUsIDB4MDAsIDB4RDUsIDB4RkUsIDB4MTMsIDB4MDAsIDB4RDYsIDB4RkUsIDB4MTEsIDB4MDAsCisJIDB4RDcsIDB4RkUsIDB4MEYsIDB4MDAsIDB4RDgsIDB4RkUsIDB4MEQsIDB4MDAsIDB4RDksIDB4RkUsIDB4MEIsIDB4MDAsIDB4REEsIDB4RkUsIDB4MDksIDB4MDAsCisJIDB4REIsIDB4RkUsIDB4MDcsIDB4MDAsIDB4REMsIDB4RkUsIDB4MDUsIDB4MDAsIDB4REQsIDB4RkUsIDB4MDMsIDB4MDAsIDB4REUsIDB4RkUsIDB4MDEsIDB4MDAsCisJIDB4REYsIDB4RkUsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4OUYsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4OUUsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OUQsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OUMsIDB4RkUsIDB4RjAsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4OUIsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OUEsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTksIDB4RkUsCisJIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTgsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTcsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4OTYsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTUsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTQsIDB4RkUsIDB4RjAsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4OTMsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTIsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTEsIDB4RkUsCisJIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTAsIDB4RkUsIDB4RjAsIDB4ODQsIDB4MDYsIDB4RkIsIDB4OEYsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4OEUsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OEQsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OEMsIDB4RkUsIDB4RjAsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4OEIsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OEEsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODksIDB4RkUsCisJIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODgsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODcsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4ODYsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODUsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODQsIDB4RkUsIDB4RjAsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4ODMsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODIsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODEsIDB4RkUsCisJIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODAsIDB4RkUsIDB4RjAsIDB4ODQsIDB4MDUsIDB4RkIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4NUMsIDB4NUMsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NTUsIDB4MDAsIDB4MDUsIDB4NjAsCisJIDB4MDAsIDB4NjMsIDB4MDUsIDB4RkQsIDB4MzAsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzEsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzIsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MzMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzQsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzYsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MzcsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzgsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzksIDB4NDQsIDB4QkQsIDB4REIsIDB4M0EsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4M0IsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0MsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0QsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0UsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4M0YsIDB4NDQsIDB4QkQsIDB4REIsIDB4MDIsIDB4NjEsIDB4NjEsIDB4NDQsIDB4MDIsIDB4MzYsIDB4ODIsIDB4RkYsIDB4MDMsIDB4MzYsIDB4ODMsIDB4RkYsCisJIDB4MDQsIDB4MzYsIDB4ODQsIDB4RkYsIDB4MDUsIDB4MzYsIDB4ODUsIDB4RkYsIDB4MDYsIDB4MzYsIDB4ODYsIDB4RkYsIDB4MDcsIDB4MzYsIDB4ODcsIDB4RkYsCisJIDB4MjAsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjEsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjIsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjMsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MjQsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjYsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjcsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MjgsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjksIDB4NDQsIDB4QkQsIDB4REIsIDB4MkEsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkIsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MkMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkQsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkYsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4REQsIDB4ODEsIDB4MDgsIDB4M0EsIDB4RDAsIDB4MDEsIDB4NTQsIDB4MDAsIDB4MjcsIDB4NDAsIDB4MTAsIDB4MjYsIDB4MzAsIDB4MDAsIDB4MjYsIDB4NDQsCisJIDB4MDEsIDB4MzYsIDB4MkQsIDB4MDAsIDB4MDIsIDB4MzYsIDB4ODIsIDB4RkYsIDB4MDMsIDB4MzYsIDB4ODMsIDB4RkYsIDB4MDQsIDB4MzYsIDB4ODQsIDB4RkYsCisJIDB4MDUsIDB4MzYsIDB4ODUsIDB4RkYsIDB4MDYsIDB4MzYsIDB4ODYsIDB4RkYsIDB4MjUsIDB4NDQsIDB4MDAsIDB4MzYsIDB4NDQsIDB4NDAsIDB4MDEsIDB4MzYsCisJIDB4NDQsIDB4NDEsIDB4MDIsIDB4MzYsIDB4NDQsIDB4NDIsIDB4MDMsIDB4MzYsIDB4NDQsIDB4NDMsIDB4MDQsIDB4MzYsIDB4NDQsIDB4NDQsIDB4MDUsIDB4MzYsCisJIDB4NDQsIDB4NDUsIDB4MDYsIDB4MzYsIDB4NDQsIDB4NDYsIDB4MDcsIDB4MzYsIDB4NDQsIDB4NDcsIDB4MDgsIDB4MzYsIDB4NDQsIDB4NDgsIDB4MDksIDB4MzYsCisJIDB4NDQsIDB4NDksIDB4MEEsIDB4MzYsIDB4NDQsIDB4NEEsIDB4MEIsIDB4MzYsIDB4NDQsIDB4NEIsIDB4MEMsIDB4MzYsIDB4NDQsIDB4NEMsIDB4MEQsIDB4MzYsCisJIDB4NDQsIDB4NEQsIDB4MEUsIDB4MzYsIDB4NDQsIDB4NEUsIDB4MEYsIDB4MzYsIDB4NDQsIDB4NEYsIDB4ODcsIDB4RkYsIDB4MjEsIDB4MDAsIDB4MjUsIDB4NDQsCisJIDB4MTAsIDB4MzYsIDB4NDQsIDB4NTAsIDB4MTEsIDB4MzYsIDB4NDQsIDB4NTEsIDB4MTIsIDB4MzYsIDB4NDQsIDB4NTIsIDB4MTMsIDB4MzYsIDB4NDQsIDB4NTMsCisJIDB4MTQsIDB4MzYsIDB4NDQsIDB4NTQsIDB4MTUsIDB4MzYsIDB4NDQsIDB4NTUsIDB4MTYsIDB4MzYsIDB4NDQsIDB4NTYsIDB4MTcsIDB4MzYsIDB4NDQsIDB4NTcsCisJIDB4MTgsIDB4MzYsIDB4NDQsIDB4NTgsIDB4MTksIDB4MzYsIDB4NDQsIDB4NTksIDB4MUEsIDB4MzYsIDB4NDQsIDB4NUEsIDB4MUIsIDB4MzYsIDB4NDQsIDB4NUIsCisJIDB4MUMsIDB4MzYsIDB4NDQsIDB4NUMsIDB4MUQsIDB4MzYsIDB4NDQsIDB4NUQsIDB4MUUsIDB4MzYsIDB4NDQsIDB4NUUsIDB4MUYsIDB4MzYsIDB4NDQsIDB4NUYsCisJIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDYsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEYsIDB4Q0UsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDMsIDB4NjEsIDB4N0YsIDB4NjcsIDB4MEEsIDB4MDIsIDB4MDAsIDB4RjAsIDB4MDQsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MTAsIDB4RkIsIDB4NUEsIDB4RDksCisJIDB4MEEsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NjAsCisJIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjEsIDB4MTIsIDB4MDIsIDB4MTQsIDB4NjQsIDB4MTMsIDB4NjAsCisJIDB4MUMsIDB4RkIsIDB4MDAsIDB4NjAsIDB4NTAsIDB4NjMsIDB4NUEsIDB4REQsIDB4MkMsIDB4NjAsIDB4NzUsIDB4NjQsIDB4OUYsIDB4RkIsIDB4MkQsIDB4RkYsCisJIDB4MkEsIDB4NjAsIDB4MUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjMsIDB4MDUsIDB4RkIsIDB4MkIsIDB4RjMsIDB4MDYsIDB4RkIsIDB4MDAsIDB4NjcsCisJIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjEsCisJIDB4MEUsIDB4MDIsIDB4MTYsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MUMsIDB4RkIsIDB4MDAsIDB4NjAsIDB4NTAsIDB4NjMsIDB4NUEsIDB4REQsIDB4MkMsIDB4NjAsCisJIDB4OTAsIDB4NjQsIDB4OUYsIDB4RkIsIDB4MkQsIDB4RkYsIDB4MkEsIDB4NjAsIDB4MUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4N0YsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsIDB4MDIsIDB4NjEsIDB4MzgsIDB4MDIsIDB4MjUsIDB4NDUsCisJIDB4MjAsIDB4NDQsIDB4ODAsIDB4MkEsIDB4MzQsIDB4MDAsIDB4RjEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDYsIDB4MDMsCisJIDB4RjEsIDB4NjAsIDB4MDIsIDB4NjQsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDMsIDB4MjgsIDB4MDAsIDB4MTksIDB4NjAsIDB4NDAsIDB4RjEsCisJIDB4QjcsIDB4RjMsIDB4MjAsIDB4NjAsIDB4MjIsIDB4NjEsIDB4QTAsIDB4ODQsIDB4QTEsIDB4REIsIDB4MjUsIDB4NDUsIDB4MjUsIDB4NjAsIDB4ODYsIDB4NjMsCisJIDB4MDIsIDB4NjEsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDEsIDB4RDQsIDB4ODAsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDUsIDB4Q0QsIDB4ODEsIDB4MDIsIDB4MDMsCisJIDB4MTUsIDB4MDMsIDB4RjcsIDB4MDEsIDB4QTIsIDB4RkYsIDB4QTYsIDB4RDMsIDB4NDAsIDB4NEMsIDB4MDAsIDB4QTgsIDB4NjcsIDB4NDMsIDB4MEMsIDB4MDIsCisJIDB4QTIsIDB4REQsIDB4NDIsIDB4NDgsIDB4NjQsIDB4NDEsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsCisJIDB4MjgsIDB4REIsIDB4MDIsIDB4MDMsIDB4MkMsIDB4NTgsIDB4QTMsIDB4RkYsIDB4MEMsIDB4NjEsIDB4MDMsIDB4MDAsIDB4MDQsIDB4NjEsIDB4N0YsIDB4NjcsCisJIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjQsIDB4MTAsIDB4NjAsIDB4MTMsIDB4RkIsIDB4RkYsIDB4RkYsCisJIDB4QzQsIDB4RkUsIDB4RjcsIDB4MDEsIDB4QzYsIDB4RkUsIDB4RjUsIDB4MDEsIDB4N0UsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsCisJIDB4MDIsIDB4NjEsIDB4M0YsIDB4MDIsIDB4MjUsIDB4NDUsIDB4RjgsIDB4MkIsIDB4M0IsIDB4MDAsIDB4MkUsIDB4RjUsIDB4NjcsIDB4NDQsIDB4RDQsIDB4ODAsCisJIDB4MjAsIDB4NjAsIDB4Q0MsIDB4NjMsIDB4MzksIDB4MDMsIDB4NzksIDB4NjEsIDB4MjQsIDB4NDQsIDB4MDEsIDB4MjcsIDB4MjksIDB4MDAsIDB4QTMsIDB4RkMsCisJIDB4QTQsIDB4RjgsIDB4QkQsIDB4RDMsIDB4QTMsIDB4RDEsIDB4RDQsIDB4ODAsIDB4Q0QsIDB4ODEsIDB4MDgsIDB4MjQsIDB4NjQsIDB4NTgsIDB4MDgsIDB4QTMsCisJIDB4RjgsIDB4MDIsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NjMsIDB4QkQsIDB4RDMsIDB4QTMsIDB4RDEsIDB4RkUsIDB4QTAsIDB4RkEsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4RDAsIDB4ODAsIDB4MTQsIDB4MDIsIDB4MTMsIDB4MDIsIDB4MDQsIDB4QTMsIDB4QkUsIDB4RDMsIDB4QkQsIDB4RDEsIDB4MEYsIDB4MTgsIDB4RDQsIDB4ODAsCisJIDB4MEQsIDB4MTgsIDB4MDMsIDB4MDMsIDB4QzMsIDB4ODMsIDB4QzMsIDB4ODMsIDB4RjcsIDB4MDEsIDB4NjQsIDB4NDEsIDB4REQsIDB4ODEsIDB4RTEsIDB4ODEsCisJIDB4Q0IsIDB4ODMsIDB4NDYsIDB4NjUsIDB4MzYsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MjIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MEEsIDB4MDAsCisJIDB4QkQsIDB4RDMsIDB4QkUsIDB4RDEsIDB4RDQsIDB4ODAsIDB4Q0QsIDB4ODEsIDB4MDgsIDB4MjQsIDB4NjQsIDB4NTgsIDB4MDgsIDB4QTMsIDB4RjgsIDB4MDIsCisJIDB4MDQsIDB4NjEsIDB4N0YsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjQsIDB4MjMsIDB4RkEsIDB4NjcsIDB4NDQsIDB4MjQsIDB4RkEsCisJIDB4NjIsIDB4NDEsIDB4M0MsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MUEsIDB4NjMsIDB4ODAsIDB4NjAsIDB4OUUsIDB4NjQsIDB4NjUsIDB4NDYsIDB4NTgsIDB4RDAsCisJIDB4MkUsIDB4RjUsIDB4NTksIDB4RDgsIDB4RkIsIDB4MUYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4Q0IsIDB4ODMsIDB4QkYsIDB4RDEsCisJIDB4NEEsIDB4NjUsIDB4NjQsIDB4NDMsIDB4QkQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4MDEsIDB4MjYsIDB4REMsIDB4ODEsIDB4RTksIDB4ODQsCisJIDB4REMsIDB4ODQsIDB4MjMsIDB4RkEsIDB4MDksIDB4MDAsIDB4NEIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4RTgsIDB4ODQsIDB4REMsIDB4ODQsCisJIDB4MjMsIDB4RkEsIDB4QkYsIDB4RDEsIDB4NEEsIDB4NjUsIDB4NjQsIDB4NDMsIDB4MzYsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MjIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RTAsIDB4QTAsIDB4MjAsIDB4NjQsIDB4MDEsIDB4MDYsCisJIDB4MjUsIDB4RkEsIDB4MjMsIDB4RjIsIDB4REYsIDB4RDEsIDB4Q0MsIDB4ODQsIDB4RTAsIDB4ODUsIDB4MEIsIDB4MDYsIDB4QkYsIDB4RDEsIDB4NjQsIDB4NDEsCisJIDB4RDUsIDB4ODAsIDB4NjQsIDB4NDMsIDB4MDEsIDB4MDYsIDB4NjUsIDB4NDEsIDB4NEEsIDB4NjUsIDB4MkUsIDB4NjAsIDB4NTgsIDB4NEYsIDB4N0EsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4REIsIDB4RjMsIDB4MDIsIDB4NjMsIDB4MjMsIDB4RkMsIDB4MDcsIDB4QjQsCisJIDB4MjUsIDB4RkEsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NEIsIDB4RDMsIDB4QkYsIDB4RDMsIDB4NjAsIDB4NDEsIDB4QzksIDB4ODMsCisJIDB4RTksIDB4ODEsIDB4REQsIDB4ODEsIDB4QTMsIDB4RkEsIDB4RTAsIDB4ODEsIDB4M0MsIDB4NjAsIDB4MDAsIDB4NjcsIDB4MDIsIDB4MjQsIDB4MDIsIDB4QTQsCisJIDB4NjAsIDB4NDcsIDB4NDAsIDB4NEIsIDB4QzksIDB4ODEsIDB4NEEsIDB4NjUsIDB4QUIsIDB4NDYsIDB4NTksIDB4RDAsIDB4QUIsIDB4NDYsIDB4QTUsIDB4RDgsCisJIDB4REEsIDB4ODUsIDB4ODAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4RjYsIDB4MUYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4RkMsIDB4QTMsIDB4QTMsIDB4RDEsIDB4NEMsIDB4NjUsIDB4QTQsIDB4RDMsIDB4REEsIDB4ODMsIDB4NjAsIDB4NDcsIDB4MjUsIDB4RkEsCisJIDB4MDAsIDB4N0UsIDB4NjAsIDB4NDcsIDB4MDEsIDB4MjYsIDB4REMsIDB4ODQsIDB4NjAsIDB4NDEsIDB4RTgsIDB4ODQsIDB4RDgsIDB4ODQsIDB4MjMsIDB4RkEsCisJIDB4QUIsIDB4MDEsIDB4RkMsIDB4QTMsIDB4QTMsIDB4RDEsIDB4NEMsIDB4NjUsIDB4QTQsIDB4RDMsIDB4REEsIDB4ODMsIDB4MDAsIDB4N0YsIDB4MjUsIDB4RkEsCisJIDB4NjAsIDB4NDEsIDB4MDEsIDB4MjYsIDB4REQsIDB4ODEsIDB4RTksIDB4ODQsIDB4RDgsIDB4ODQsIDB4MjMsIDB4RkEsIDB4OUQsIDB4MDEsIDB4MkUsIDB4NjAsCisJIDB4NDAsIDB4NjMsIDB4QkYsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4RTgsIDB4ODQsIDB4REMsIDB4ODQsIDB4MjMsIDB4RkEsIDB4NEEsIDB4NjUsCisJIDB4MzYsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MjIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkUsIDB4NjAsCisJIDB4NDAsIDB4NjMsIDB4MjMsIDB4RjIsIDB4QzAsIDB4NjUsIDB4Q0MsIDB4ODQsIDB4RTAsIDB4ODEsIDB4MEEsIDB4MDQsIDB4QkYsIDB4REIsIDB4RDUsIDB4ODAsCisJIDB4MDcsIDB4MDMsIDB4MDEsIDB4MDYsIDB4NjUsIDB4NDEsIDB4NjEsIDB4NDQsIDB4QkYsIDB4REIsIDB4NEEsIDB4NjUsIDB4NTgsIDB4NEYsIDB4QTgsIDB4MDAsCisJIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDMsIDB4NEUsIDB4MkQsIDB4NjAsIDB4NTgsIDB4NDMsIDB4NTUsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MkYsIDB4NjAsIDB4MjQsIDB4NjEsIDB4MTcsIDB4NjAsIDB4ODEsIDB4RjMsIDB4QTEsIDB4REIsIDB4Q0MsIDB4ODQsIDB4QTgsIDB4ODMsIDB4MDUsIDB4MDQsCisJIDB4MkYsIDB4NjAsIDB4MDIsIDB4NjQsIDB4NTgsIDB4RDEsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4MEUsIDB4NDMsIDB4ODIsIDB4MDEsIDB4MjMsIDB4RjIsCisJIDB4MjUsIDB4RjIsIDB4MDIsIDB4QTgsIDB4RjgsIDB4QTAsIDB4MEYsIDB4MDIsIDB4RUMsIDB4QTAsIDB4MEQsIDB4MDQsIDB4MEMsIDB4MDcsIDB4MTksIDB4NjAsCisJIDB4NEYsIDB4RjEsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDcsIDB4MTksIDB4NjAsIDB4NEYsIDB4RkIsIDB4MTksIDB4NjAsCisJIDB4NTMsIDB4RkIsIDB4MTYsIDB4NjAsIDB4RDgsIDB4RkIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4RjIsIDB4MUQsIDB4NjAsCisJIDB4QUUsIDB4NjUsIDB4NjAsIDB4NDEsIDB4MUQsIDB4NjAsIDB4NEEsIDB4NjMsIDB4QTMsIDB4REIsIDB4RkYsIDB4QTEsIDB4NDgsIDB4NjQsIDB4NTgsIDB4RDAsCisJIDB4N0UsIDB4QTgsIDB4NUIsIDB4RDksIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjQsIDB4RkYsIDB4QTEsIDB4RDcsIDB4ODAsIDB4MDIsIDB4MDMsCisJIDB4MDEsIDB4MDMsIDB4RjUsIDB4MDEsIDB4MkUsIDB4RjUsIDB4MDAsIDB4NjAsIDB4MkYsIDB4NjUsIDB4MjUsIDB4RjIsIDB4MDAsIDB4NjMsIDB4Q0MsIDB4ODQsCisJIDB4MDMsIDB4QTMsIDB4RkQsIDB4MDUsIDB4NEEsIDB4NjQsIDB4RDcsIDB4ODAsIDB4MUMsIDB4NjAsIDB4RTYsIDB4NjEsIDB4MTgsIDB4MDUsIDB4QTEsIDB4REQsCisJIDB4RTMsIDB4ODMsIDB4RkUsIDB4QTMsIDB4NTgsIDB4RDAsIDB4N0UsIDB4QTgsIDB4NTksIDB4RDksIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjQsCisJIDB4RjksIDB4MUYsIDB4MDAsIDB4NjMsIDB4NTksIDB4REQsIDB4MkUsIDB4RjUsIDB4MjUsIDB4RjAsIDB4MEUsIDB4NjAsIDB4NzMsIDB4RjMsIDB4RDMsIDB4ODAsCisJIDB4MDEsIDB4QjAsIDB4MDQsIDB4MDMsIDB4MDEsIDB4QTQsIDB4MDMsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDEsIDB4MDAsIDB4QTIsIDB4REQsIDB4MDAsIDB4NjcsCisJIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUQsIDB4NjAsIDB4NEEsIDB4NjEsIDB4QTEsIDB4RDMsIDB4MjMsIDB4RkEsIDB4RTAsIDB4ODMsIDB4NEEsIDB4NjUsCisJIDB4MDQsIDB4MDIsIDB4MDIsIDB4NjMsIDB4MjMsIDB4RkMsIDB4QTUsIDB4RkMsIDB4MDksIDB4MDAsIDB4REIsIDB4ODMsIDB4NTksIDB4RDEsIDB4QTUsIDB4RDgsCisJIDB4REEsIDB4ODUsIDB4ODAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4RjgsIDB4MUYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MEUsIDB4NjAsIDB4NzMsIDB4RjMsIDB4MDAsIDB4NjEsIDB4MDIsIDB4QTQsIDB4RkUsIDB4QTAsIDB4MjMsIDB4RkEsIDB4MUIsIDB4MDMsCisJIDB4RkEsIDB4QTQsIDB4RkQsIDB4QTQsIDB4MDEsIDB4QTEsIDB4RkQsIDB4MDcsIDB4NjEsIDB4NDMsIDB4MjMsIDB4RjIsIDB4MjUsIDB4RkMsIDB4RTAsIDB4ODMsCisJIDB4MDIsIDB4QTMsIDB4MUMsIDB4NjAsIDB4RTYsIDB4NjEsIDB4MDAsIDB4NjAsIDB4NEEsIDB4NjQsIDB4NTksIDB4RDEsIDB4NTgsIDB4RDgsIDB4N0UsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjQsIDB4RjksIDB4MUYsIDB4MjUsIDB4RjIsIDB4MjMsIDB4RjIsIDB4MDEsIDB4QjAsIDB4Q0MsIDB4ODQsCisJIDB4MDQsIDB4MDIsIDB4MjMsIDB4RkEsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MjUsIDB4RkEsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4NDEsIDB4NEIsIDB4NjUsIDB4NDIsIDB4ODAsIDB4NjQsIDB4RDQsIDB4ODUsIDB4MkIsIDB4NDEsIDB4MDAsIDB4QTEsIDB4NTUsIDB4OEIsIDB4MEQsIDB4MDMsCisJIDB4MDIsIDB4MDQsIDB4NjUsIDB4NDEsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NEIsIDB4Q0EsIDB4ODQsIDB4NTgsIDB4RDAsIDB4QzksIDB4ODEsCisJIDB4QkQsIDB4RDksIDB4RkMsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4RUMsIDB4MDEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QTMsCisJIDB4QTMsIDB4RDMsIDB4MDIsIDB4N0MsIDB4QTAsIDB4RDMsIDB4MjMsIDB4RjgsIDB4REMsIDB4ODQsIDB4MjUsIDB4RkEsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjQsIDB4MjMsIDB4RkEsIDB4MDEsIDB4NjQsIDB4OUQsIDB4RkUsIDB4MDIsIDB4MjgsIDB4MDIsIDB4NjQsIDB4MjUsIDB4RkEsCisJIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4N0MsIDB4MjMsIDB4RjgsIDB4MDEsIDB4NjQsIDB4MjUsIDB4RkEsIDB4MDAsIDB4NjcsCisJIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QTMsIDB4QTMsIDB4RDEsIDB4MDIsIDB4NjQsIDB4MjMsIDB4RkEsIDB4QTQsIDB4RDMsIDB4MjUsIDB4RkEsCisJIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjQsIDB4MjMsIDB4RkEsIDB4ODgsIDB4RkYsIDB4NzUsIDB4NDQsIDB4OEQsIDB4RkYsCisJIDB4RTgsIDB4ODcsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MDMsIDB4QjQsIDB4MjUsIDB4RkEsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4NjQsIDB4MjMsIDB4RkEsIDB4ODYsIDB4RkYsIDB4MjksIDB4NDQsIDB4ODcsIDB4RkYsIDB4MjUsIDB4RkEsIDB4NTUsIDB4RjMsIDB4NTIsIDB4RjEsCisJIDB4ODAsIDB4NjUsIDB4QzQsIDB4ODcsIDB4MDAsIDB4N0YsIDB4MjYsIDB4RkEsIDB4NjQsIDB4NDQsIDB4QzQsIDB4ODcsIDB4MDAsIDB4N0YsIDB4MjcsIDB4RkEsCisJIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDUsIDB4NjQsIDB4MjMsIDB4RkEsIDB4NTIsIDB4NjMsIDB4QjQsIDB4RjMsIDB4NEIsIDB4REEsCisJIDB4QjMsIDB4RjMsIDB4NEIsIDB4REEsIDB4QjIsIDB4RjMsIDB4NEIsIDB4REEsIDB4NjAsIDB4NDEsIDB4ODgsIDB4RkYsIDB4NzIsIDB4NUMsIDB4ODksIDB4RkYsCisJIDB4NEEsIDB4RDgsIDB4QTIsIDB4NDgsIDB4MjAsIDB4MjMsIDB4MEUsIDB4MDAsIDB4NjQsIDB4NDAsIDB4ODAsIDB4MjcsIDB4MTUsIDB4MDAsIDB4REMsIDB4ODQsCisJIDB4QkQsIDB4REEsIDB4QkQsIDB4RDIsIDB4MTEsIDB4MDQsIDB4REMsIDB4ODQsIDB4QTIsIDB4REEsIDB4QTMsIDB4RDIsIDB4MEQsIDB4MDQsIDB4REMsIDB4ODQsCisJIDB4QTMsIDB4REEsIDB4MEEsIDB4MDAsIDB4NTIsIDB4NjMsIDB4QjQsIDB4RjMsIDB4NEIsIDB4REEsIDB4QjMsIDB4RjMsIDB4NEIsIDB4REEsIDB4QjIsIDB4RjMsCisJIDB4NEIsIDB4REEsIDB4NTQsIDB4OTAsIDB4NEMsIDB4NjMsIDB4RTAsIDB4MDIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4RjAsCisJIDB4MjMsIDB4RjIsIDB4MTksIDB4NjAsIDB4NDYsIDB4RjksIDB4MDIsIDB4QTgsIDB4NjQsIDB4NDQsIDB4MUYsIDB4MDIsIDB4M0YsIDB4NDAsIDB4MDIsIDB4MkIsCisJIDB4MTYsIDB4MDAsIDB4MDAsIDB4MzcsIDB4MTQsIDB4MDAsIDB4MDEsIDB4M0IsIDB4MTgsIDB4MDAsIDB4MTIsIDB4NjAsIDB4NDUsIDB4NjUsIDB4MTEsIDB4NjAsCisJIDB4NjUsIDB4NjMsIDB4RkYsIDB4QjcsIDB4NjAsIDB4NUMsIDB4QTMsIDB4RDMsIDB4MDgsIDB4QTMsIDB4MDAsIDB4N0UsIDB4RDAsIDB4ODAsIDB4RDcsIDB4ODAsCisJIDB4MDMsIDB4MDMsIDB4RjksIDB4MDIsIDB4N0YsIDB4NjcsIDB4MEEsIDB4MDAsIDB4RjQsIDB4QTMsIDB4QTMsIDB4RDEsIDB4MDQsIDB4MDAsIDB4MDAsIDB4QkMsCisJIDB4RjIsIDB4QTQsIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDcsIDB4MTYsIDB4NjAsIDB4Q0YsIDB4RjksIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MjAsIDB4NjMsIDB4MkUsIDB4NjAsIDB4MDAsIDB4NjEsIDB4NDgsIDB4NjQsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4MjUsIDB4RjAsCisJIDB4MjAsIDB4NjQsIDB4RDAsIDB4ODEsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDcsIDB4MjUsIDB4RkEsIDB4MEYsIDB4MDAsIDB4MkUsIDB4NjAsIDB4MDQsIDB4NjMsCisJIDB4QzMsIDB4ODMsIDB4MDEsIDB4MkEsIDB4MDYsIDB4MDAsIDB4Q0YsIDB4ODMsIDB4QTMsIDB4RDMsIDB4Q0QsIDB4ODEsIDB4MDAsIDB4N0YsIDB4QkQsIDB4REIsCisJIDB4MDQsIDB4MDMsIDB4MDAsIDB4NjQsIDB4QzksIDB4ODEsIDB4QkQsIDB4REIsIDB4RkQsIDB4MDIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MjMsIDB4RjIsIDB4MjUsIDB4RjAsIDB4MDIsIDB4QTgsIDB4MDEsIDB4NjAsIDB4QTAsIDB4NjIsIDB4MDksIDB4MDIsIDB4QTIsIDB4RDksIDB4NjQsIDB4NDEsCisJIDB4MzIsIDB4NDQsIDB4MDIsIDB4QjUsIDB4MDAsIDB4QjksIDB4RDQsIDB4ODQsIDB4MDgsIDB4MjgsIDB4MDIsIDB4QkMsIDB4NDAsIDB4NTIsIDB4MDAsIDB4NjcsCisJIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4RjIsIDB4MjUsIDB4RjAsIDB4MDIsIDB4QTgsIDB4MDEsIDB4NjAsIDB4QTIsIDB4NjIsIDB4MDksIDB4MDIsCisJIDB4QTIsIDB4RDksIDB4NjQsIDB4NDEsIDB4MzIsIDB4NDQsIDB4MDQsIDB4QjUsIDB4MDAsIDB4QjksIDB4RDQsIDB4ODQsIDB4MDgsIDB4MjgsIDB4MDQsIDB4QkMsCisJIDB4NDAsIDB4NTIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4RjIsIDB4MjUsIDB4RjAsIDB4MDIsIDB4QTgsIDB4MDEsIDB4NjAsCisJIDB4QjAsIDB4NjIsIDB4MTUsIDB4MDIsIDB4QTIsIDB4RDksIDB4NjQsIDB4NDEsIDB4MzIsIDB4NDQsIDB4NDAsIDB4QjUsIDB4MDAsIDB4QjksIDB4RDQsIDB4ODQsCisJIDB4MDgsIDB4MjQsIDB4MEMsIDB4MDAsIDB4NDAsIDB4QkMsIDB4MDIsIDB4QjUsIDB4RDQsIDB4ODQsIDB4NDMsIDB4RjksIDB4MzcsIDB4NjAsIDB4NzYsIDB4NjMsCisJIDB4RDMsIDB4ODAsIDB4MkYsIDB4NjAsIDB4NTAsIDB4N0MsIDB4MDIsIDB4MDMsIDB4NDMsIDB4RkQsIDB4QTQsIDB4REYsIDB4NDAsIDB4NTIsIDB4MDAsIDB4NjcsCisJIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MzcsIDB4NjAsIDB4NzYsIDB4NjQsIDB4NDMsIDB4RkIsIDB4MkQsIDB4NjAsIDB4NUIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjMsIDB4RjIsIDB4MjUsIDB4RjAsIDB4MDEsIDB4NjAsIDB4QUMsIDB4NjMsIDB4N0YsIDB4NjcsIDB4MzksIDB4MTgsIDB4QTMsIDB4RDksIDB4MjYsIDB4RjAsCisJIDB4N0YsIDB4NjcsIDB4MzUsIDB4MTgsIDB4NUIsIDB4RDksIDB4MTYsIDB4NjAsIDB4ODcsIDB4RjMsIDB4MjUsIDB4RjAsIDB4NjAsIDB4NDAsIDB4MDMsIDB4M0EsCisJIDB4MkQsIDB4MDAsIDB4QTYsIDB4RjMsIDB4MjAsIDB4NjMsIDB4RTMsIDB4ODMsIDB4NjAsIDB4NDYsIDB4MEYsIDB4RjgsIDB4MzAsIDB4NjEsIDB4OTQsIDB4RkEsCisJIDB4MDEsIDB4NjEsIDB4OTEsIDB4RkEsIDB4MTYsIDB4NjQsIDB4MTIsIDB4RkEsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MzYsIDB4MDUsIDB4MDAsIDB4MTIsIDB4MzYsCisJIDB4MDgsIDB4MDAsIDB4MEMsIDB4MzYsIDB4MEIsIDB4MDAsIDB4MEYsIDB4MDAsIDB4NDAsIDB4NjEsIDB4QTEsIDB4ODAsIDB4MEEsIDB4NjQsIDB4MTEsIDB4MDIsCisJIDB4RjMsIDB4MDEsIDB4MTAsIDB4NjEsIDB4QTEsIDB4ODAsIDB4MEUsIDB4NjQsIDB4MEMsIDB4MDIsIDB4RUUsIDB4MDEsIDB4MDgsIDB4NjEsIDB4QTEsIDB4ODAsCisJIDB4MTAsIDB4NjQsIDB4MDcsIDB4MDIsIDB4RTksIDB4MDEsIDB4RTEsIDB4ODEsIDB4QTEsIDB4ODAsIDB4MDUsIDB4MDUsIDB4QzgsIDB4ODQsIDB4MDEsIDB4MDIsCisJIDB4RTMsIDB4MDEsIDB4MTIsIDB4RkEsIDB4OTEsIDB4RkEsIDB4NjYsIDB4NDQsIDB4MDIsIDB4QTYsIDB4RDcsIDB4MUYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MjUsIDB4RjIsIDB4MTksIDB4NjAsIDB4NDUsIDB4RkIsIDB4MTksIDB4NjAsIDB4NEMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsCisJIDB4MDgsIDB4MjYsIDB4MTgsIDB4MDAsIDB4MTksIDB4NjAsIDB4NDUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MEEsIDB4MDAsCisJIDB4MTksIDB4NjAsIDB4N0IsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsIDB4NjAsIDB4NDQsIDB4QTIsIDB4REIsIDB4MTksIDB4NjAsIDB4NDUsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDYsIDB4MDAsIDB4MTksIDB4NjAsIDB4N0IsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDQsIDB4QkMsCisJIDB4NjAsIDB4NDQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4RjIsIDB4MjUsIDB4RjAsIDB4MDIsIDB4QTgsCisJIDB4MDAsIDB4NjcsIDB4MDIsIDB4MDIsIDB4MkQsIDB4RjksIDB4MkMsIDB4RjksIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4RjIsIDB4MjUsIDB4RjIsCisJIDB4MDIsIDB4QTgsIDB4MDAsIDB4QTgsIDB4MEEsIDB4MDIsIDB4MDcsIDB4MDMsIDB4RDAsIDB4QTAsIDB4MzAsIDB4NjUsIDB4MDMsIDB4MDQsIDB4QTcsIDB4QTAsCisJIDB4NTksIDB4NjUsIDB4MDEsIDB4MDYsIDB4NjUsIDB4NDQsIDB4MTYsIDB4NjAsIDB4Q0UsIDB4RkIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MjUsIDB4RjIsIDB4MTksIDB4NjAsIDB4NEMsIDB4RkIsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MkEsIDB4MjUsIDB4MDAsIDB4MTksIDB4NjAsIDB4N0IsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4RTksIDB4QjQsIDB4NjAsIDB4NDQsIDB4MTksIDB4NjAsIDB4NEMsIDB4RjEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsCisJIDB4MDIsIDB4QkMsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDQsIDB4QkMsIDB4NjQsIDB4NDAsIDB4MDQsIDB4MjYsIDB4MDgsIDB4MDAsIDB4MTksIDB4NjAsCisJIDB4N0IsIDB4RkIsIDB4MTMsIDB4NjQsIDB4Q0IsIDB4RkIsIDB4MDEsIDB4NjAsIDB4NjcsIDB4NjQsIDB4MzcsIDB4RkIsIDB4MEMsIDB4MDAsIDB4MTAsIDB4QkMsCisJIDB4MTksIDB4NjAsIDB4N0IsIDB4RkIsIDB4MDgsIDB4NjQsIDB4Q0IsIDB4RkIsIDB4QTEsIDB4RjMsIDB4MDEsIDB4NjAsIDB4NjcsIDB4N0MsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MjcsIDB4NUIsIDB4N0MsIDB4MzcsIDB4RjksIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4RjIsIDB4MTksIDB4NjAsCisJIDB4NEQsIDB4RkIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4RjIsIDB4MTksIDB4NjAsIDB4NEUsIDB4RkIsIDB4MDAsIDB4NjcsCisJIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4RjIsIDB4MTksIDB4NjAsIDB4ODksIDB4RkIsIDB4RkYsIDB4RkYsIDB4MEYsIDB4MjIsIDB4NDEsIDB4NzUsCisJIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MUIsIDB4NjAsIDB4RkUsIDB4RkIsCisJIDB4N0UsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjEsIDB4MEUsIDB4MDIsIDB4MDYsIDB4NjEsCisJIDB4NDEsIDB4NTYsIDB4QzcsIDB4RkUsIDB4MkEsIDB4NjAsIDB4MUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzYsIDB4NDcsIDB4RkYsIDB4MjMsIDB4MDQsIDB4MDAsCisJIDB4MDAsIDB4N0YsIDB4NjAsIDB4NDEsIDB4N0YsIDB4NjcsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4N0YsIDB4NjAsCisJIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjEsIDB4MEUsIDB4MDIsIDB4MDgsIDB4NjEsIDB4NDEsIDB4NTYsCisJIDB4QzcsIDB4RkUsIDB4MkEsIDB4NjAsIDB4MUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzYsIDB4NDcsIDB4RkYsIDB4MjMsIDB4MDQsIDB4MDAsIDB4MDAsIDB4N0YsCisJIDB4NjAsIDB4NDEsIDB4N0YsIDB4NjcsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4N0YsIDB4NjAsIDB4QzAsIDB4NjQsCisJIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjEsIDB4MEUsIDB4MDIsIDB4MEEsIDB4NjEsIDB4NDEsIDB4NTYsIDB4QzcsIDB4RkUsCisJIDB4MkEsIDB4NjAsIDB4MUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzYsIDB4NDcsIDB4RkYsIDB4MjMsIDB4MDQsIDB4MDAsIDB4MDAsIDB4N0YsIDB4NjAsIDB4NDEsCisJIDB4N0YsIDB4NjcsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4N0UsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsCisJIDB4QTQsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjEsIDB4MTEsIDB4MDIsIDB4NjUsIDB4NDMsIDB4MTksIDB4NjAsIDB4QTUsIDB4RkQsIDB4MEMsIDB4NjEsCisJIDB4NDEsIDB4NTYsIDB4QzcsIDB4RkUsIDB4MkEsIDB4NjAsIDB4MUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzYsIDB4NDcsIDB4RkYsIDB4MjMsIDB4MDQsIDB4MDAsCisJIDB4MDAsIDB4N0YsIDB4NjAsIDB4NDEsIDB4N0YsIDB4NjcsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4NjQsCisJIDB4MjMsIDB4RkEsIDB4NEEsIDB4NjEsIDB4MTAsIDB4NjAsIDB4REEsIDB4NjQsIDB4QTAsIDB4RDEsIDB4QTEsIDB4RDgsIDB4NTgsIDB4RDEsIDB4NTksIDB4RDgsCisJIDB4NTgsIDB4RDEsIDB4NTksIDB4RDgsIDB4MDEsIDB4QTEsIDB4MTAsIDB4NjAsIDB4RjIsIDB4NjMsIDB4NUQsIDB4NjUsIDB4QTMsIDB4RDMsIDB4MDIsIDB4QTMsCisJIDB4MDIsIDB4MUIsIDB4N0YsIDB4NjQsIDB4MDEsIDB4MDAsIDB4QTMsIDB4RDMsIDB4NjAsIDB4RkUsIDB4NUQsIDB4REEsIDB4MjAsIDB4RkUsIDB4RDUsIDB4ODAsCisJIDB4MDQsIDB4QTMsIDB4RjQsIDB4MDIsIDB4MDEsIDB4QTEsIDB4MTAsIDB4NjAsIDB4RTAsIDB4NjQsIDB4QTAsIDB4RDEsIDB4QTEsIDB4RDgsIDB4NTgsIDB4RDEsCisJIDB4NTksIDB4RDgsIDB4NTgsIDB4RDEsIDB4NTksIDB4RDgsIDB4MDEsIDB4QTEsIDB4NjAsIDB4RkUsIDB4MDcsIDB4NjMsIDB4N0YsIDB4NjQsIDB4Q0YsIDB4ODMsCisJIDB4NUQsIDB4REEsIDB4RkQsIDB4MDIsIDB4MjAsIDB4RkUsIDB4MTIsIDB4NjAsIDB4NDAsIDB4N0MsIDB4MTEsIDB4NjAsIDB4NjIsIDB4NjMsIDB4N0YsIDB4NjUsCisJIDB4QTMsIDB4RDMsIDB4MDIsIDB4QTMsIDB4MDIsIDB4MUIsIDB4N0YsIDB4NjQsIDB4MDEsIDB4MDAsIDB4QTMsIDB4RDMsIDB4NjAsIDB4RkUsIDB4NUQsIDB4REEsCisJIDB4MjAsIDB4RkUsIDB4RDUsIDB4ODAsIDB4MDYsIDB4QTMsIDB4MDMsIDB4MDIsIDB4NDYsIDB4NDUsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjEsIDB4RDMsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4RUUsIDB4MDQsIDB4MjUsIDB4NDYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjMsIDB4N0QsIDB4RjMsCisJIDB4MjMsIDB4RkMsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjMsIDB4MTcsIDB4MDAsIDB4MDEsIDB4NjAsIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsIDB4MTEsIDB4NjAsCisJIDB4NjAsIDB4NjEsIDB4MTIsIDB4NjAsIDB4NDAsIDB4NjUsIDB4QTEsIDB4RDEsIDB4RDUsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MEIsIDB4MDMsIDB4MDIsIDB4MDMsCisJIDB4MDgsIDB4QTEsIDB4RjksIDB4MDEsIDB4MDQsIDB4QTEsIDB4QTEsIDB4RDMsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjUsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjQsCisJIDB4QjQsIDB4ODQsIDB4MDEsIDB4MDAsIDB4RkYsIDB4NjQsIDB4MjUsIDB4RkEsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEMsIDB4NjMsCisJIDB4MjMsIDB4RkMsIDB4RTIsIDB4RjMsIDB4MTMsIDB4NjAsIDB4RjIsIDB4NjMsIDB4Q0MsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDYsIDB4MEMsIDB4QTMsCisJIDB4RkIsIDB4MDEsIDB4NDgsIDB4NjEsIDB4NjEsIDB4NDQsIDB4MTgsIDB4QTUsIDB4NjAsIDB4RkUsIDB4QkQsIDB4RDMsIDB4MjAsIDB4RkUsIDB4MDAsIDB4N0YsCisJIDB4NTksIDB4REEsIDB4RDUsIDB4ODAsIDB4RkYsIDB4RkYsIDB4RjgsIDB4MDQsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4RjAsCisJIDB4MTcsIDB4NjAsIDB4ODAsIDB4RjksIDB4MTEsIDB4MDAsIDB4MEMsIDB4NjAsIDB4RkUsIDB4NjIsIDB4NDAsIDB4NjMsIDB4NUEsIDB4REYsIDB4RkUsIDB4MUYsCisJIDB4MDQsIDB4NjUsIDB4MEMsIDB4NjAsIDB4RkUsIDB4NjEsIDB4NDgsIDB4NjQsIDB4M0UsIDB4NjMsIDB4N0MsIDB4QTgsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksCisJIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjQsIDB4RjksIDB4MUYsIDB4MTcsIDB4NjAsIDB4ODAsIDB4RjEsIDB4MEMsIDB4NjAsIDB4REEsIDB4NjUsCisJIDB4MDIsIDB4RkUsIDB4NjQsIDB4NDQsIDB4RjgsIDB4ODQsIDB4RjgsIDB4ODQsIDB4RjgsIDB4ODcsIDB4NjAsIDB4NDEsIDB4NjQsIDB4NDQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODQsIDB4M0UsIDB4RkIsIDB4NjAsIDB4NDIsIDB4NjEsIDB4NDQsIDB4MDMsIDB4QTIsIDB4NjAsIDB4RkUsIDB4QTIsIDB4REIsCisJIDB4MjAsIDB4RkUsIDB4NjQsIDB4NDQsIDB4MEQsIDB4NjAsIDB4MDAsIDB4NjUsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4QzQsIDB4ODQsIDB4NDAsIDB4RkIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MDAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NUMsIDB4NDEsCisJIDB4MjUsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NDIsIDB4ODAsIDB4MkIsIDB4MDQsIDB4MDAsIDB4RkYsIDB4QjQsIDB4NDAsIDB4NDIsIDB4MDEsIDB4NjQsCisJIDB4NDAsIDB4NDEsIDB4QTYsIDB4RjMsIDB4NDYsIDB4NEIsIDB4NjAsIDB4NDYsIDB4MjAsIDB4NjMsIDB4RTMsIDB4ODMsIDB4QUIsIDB4NDYsIDB4MjYsIDB4RjAsCisJIDB4QUIsIDB4NDYsIDB4NTksIDB4RjgsIDB4QUIsIDB4NDYsIDB4MjcsIDB4RjAsIDB4QUIsIDB4NDYsIDB4NUEsIDB4RjgsIDB4QUIsIDB4NDYsIDB4MjgsIDB4RjAsCisJIDB4QUIsIDB4NDYsIDB4NUIsIDB4RjgsIDB4NjYsIDB4NDQsIDB4MDIsIDB4QTYsIDB4RjEsIDB4MUYsIDB4QTYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDYsCisJIDB4QUIsIDB4NDYsIDB4MEMsIDB4NjAsIDB4MzgsIDB4NjUsIDB4MjIsIDB4NDQsIDB4RkYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODEsIDB4QzksIDB4ODEsIDB4NTIsIDB4NjQsIDB4MEUsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsCisJIDB4MjEsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDgsIDB4MDAsIDB4QUIsIDB4NDYsIDB4RjAsIDB4QTEsIDB4NzYsIDB4NjQsIDB4MEUsIDB4NjMsIDB4NTksIDB4RDEsCisJIDB4NTgsIDB4RDgsIDB4RkQsIDB4MUYsIDB4QUIsIDB4NDYsIDB4MjIsIDB4NDQsIDB4RkYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4MEMsIDB4NjAsIDB4OUEsIDB4NjUsIDB4QzQsIDB4ODEsIDB4NjAsIDB4NDUsIDB4QzksIDB4ODEsIDB4NjIsIDB4NjQsIDB4MDYsIDB4NjMsIDB4NTgsIDB4RDAsCisJIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4MjEsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDgsIDB4MDAsIDB4QUIsIDB4NDYsIDB4RjgsIDB4QTEsIDB4QjYsIDB4NjQsCisJIDB4MDYsIDB4NjMsIDB4NTksIDB4RDEsIDB4NTgsIDB4RDgsIDB4RkQsIDB4MUYsIDB4QUIsIDB4NDYsIDB4NjUsIDB4NDQsIDB4MEMsIDB4NjAsIDB4QkEsIDB4NjUsCisJIDB4QzQsIDB4ODEsIDB4QzksIDB4ODEsIDB4NkEsIDB4NjQsIDB4MDYsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4MjIsIDB4NDQsCisJIDB4RkYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODUsIDB4QzQsIDB4ODQsIDB4MEMsIDB4NjAsIDB4ODAsIDB4NjUsIDB4QzQsIDB4ODEsIDB4NzIsIDB4NjQsCisJIDB4MDQsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4QUIsIDB4NDYsIDB4MjEsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDYsIDB4MDAsCisJIDB4RkEsIDB4QTEsIDB4OTAsIDB4NjQsIDB4MDQsIDB4NjMsIDB4NTksIDB4RDEsIDB4NTgsIDB4RDgsIDB4RkQsIDB4MUYsIDB4M0IsIDB4RjAsIDB4MjEsIDB4NDQsCisJIDB4MDEsIDB4MkEsIDB4MTMsIDB4MDAsIDB4MjIsIDB4NDQsIDB4M0QsIDB4RkIsIDB4NjAsIDB4NDEsIDB4MDIsIDB4RkUsIDB4RjgsIDB4ODQsIDB4RjgsIDB4ODQsCisJIDB4RjgsIDB4ODQsIDB4M0MsIDB4RkIsIDB4MEMsIDB4NjAsIDB4N0MsIDB4NjMsIDB4ODgsIDB4RkYsIDB4Q0QsIDB4ODEsIDB4MDYsIDB4QTMsIDB4RkQsIDB4MEQsCisJIDB4OEQsIDB4RkYsIDB4M0IsIDB4RkQsIDB4NjQsIDB4NDcsIDB4ODAsIDB4QkYsIDB4NjAsIDB4NUMsIDB4MjIsIDB4NDMsIDB4ODAsIDB4NjEsIDB4ODgsIDB4RkYsCisJIDB4Q0YsIDB4ODMsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MEQsIDB4OEQsIDB4RkYsIDB4NjEsIDB4NDcsIDB4MzEsIDB4OTEsIDB4QjEsIDB4ODQsIDB4M0IsIDB4RkEsCisJIDB4MUYsIDB4NjMsIDB4RTMsIDB4ODMsIDB4NjYsIDB4NDQsIDB4MDIsIDB4QTYsIDB4M0IsIDB4RjAsIDB4NjYsIDB4NDQsIDB4QjEsIDB4OUMsIDB4M0IsIDB4RjgsCisJIDB4MDIsIDB4QTYsIDB4RkEsIDB4MUYsIDB4QUIsIDB4NDYsIDB4MDAsIDB4NjcsIDB4MDAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4RjIsCisJIDB4MjUsIDB4RjAsIDB4MDIsIDB4QTgsIDB4MDAsIDB4NjcsIDB4MjIsIDB4MDIsIDB4M0QsIDB4RjEsIDB4NjQsIDB4NDQsIDB4MDMsIDB4QjQsIDB4NDAsIDB4NDIsCisJIDB4RDAsIDB4ODAsIDB4QTYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDYsIDB4QkIsIDB4RjQsIDB4ODAsIDB4NjEsIDB4MDIsIDB4MDIsIDB4RTMsIDB4ODMsCisJIDB4RUIsIDB4ODMsIDB4MjIsIDB4NDQsIDB4ODgsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MEQsIDB4OEQsIDB4RkYsIDB4NjEsIDB4NDcsCisJIDB4MzEsIDB4OTEsIDB4OUQsIDB4ODUsIDB4QTcsIDB4ODMsIDB4M0IsIDB4RkMsIDB4MUYsIDB4NjMsIDB4RTMsIDB4ODMsIDB4NjYsIDB4NDQsIDB4MDIsIDB4QTYsCisJIDB4QkIsIDB4RjIsIDB4NjYsIDB4NDQsIDB4QTUsIDB4ODEsIDB4QkIsIDB4RkEsIDB4MDIsIDB4QTYsIDB4RkEsIDB4MUYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MjcsIDB4RjIsIDB4MUQsIDB4NjAsIDB4QzAsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsCisJIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MjcsIDB4RjAsIDB4NjMsIDB4NDYsCisJIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsCisJIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjUsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsCisJIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4QTYsIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4MDEsIDB4MDMsCisJIDB4MkEsIDB4MDAsIDB4NDMsIDB4NEIsIDB4QUIsIDB4NDYsIDB4M0IsIDB4RjIsIDB4ODAsIDB4NjAsIDB4MzAsIDB4N0MsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsCisJIDB4NEUsIDB4NjEsIDB4NzYsIDB4NjQsIDB4MEUsIDB4NjMsIDB4QUIsIDB4NDYsIDB4NTksIDB4RDAsIDB4QUIsIDB4NDYsIDB4NTgsIDB4RDgsIDB4RkIsIDB4MUYsCisJIDB4OTAsIDB4NjQsIDB4MDQsIDB4NjMsIDB4QUIsIDB4NDYsIDB4NTksIDB4RDAsIDB4QUIsIDB4NDYsIDB4NTgsIDB4RDgsIDB4RkIsIDB4MUYsIDB4RDksIDB4ODEsCisJIDB4QTAsIDB4NjQsIDB4MDQsIDB4NjMsIDB4QUIsIDB4NDYsIDB4NTksIDB4RDAsIDB4QUIsIDB4NDYsIDB4NTgsIDB4RDgsIDB4RkIsIDB4MUYsIDB4RDksIDB4ODEsCisJIDB4QjYsIDB4NjQsIDB4MEUsIDB4NjMsIDB4QUIsIDB4NDYsIDB4NTksIDB4RDAsIDB4QUIsIDB4NDYsIDB4NTgsIDB4RDgsIDB4RkIsIDB4MUYsIDB4MDAsIDB4NjcsCisJIDB4MDAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjcsIDB4MjAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4RjIsCisJIDB4MUQsIDB4NjAsIDB4QzAsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsCisJIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MjcsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsCisJIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsCisJIDB4MjUsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsCisJIDB4RTgsIDB4MUIsIDB4QTYsIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4MDEsIDB4MDMsIDB4MEQsIDB4MDAsIDB4NDMsIDB4NEIsCisJIDB4QUIsIDB4NDYsIDB4M0IsIDB4RjIsIDB4ODAsIDB4NjAsIDB4MzAsIDB4NjEsIDB4OUQsIDB4ODUsIDB4QTQsIDB4ODQsIDB4QTIsIDB4REEsIDB4QUIsIDB4NDYsCisJIDB4MDAsIDB4NjcsIDB4MDAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjcsIDB4MjAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjQsIDB4NDAsIDB4NDEsIDB4NEEsIDB4NjQsIDB4QTAsIDB4RDIsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NDIsIDB4ODAsIDB4MkIsIDB4MDQsIDB4MDAsCisJIDB4RkYsIDB4QjQsIDB4NDAsIDB4NDIsIDB4MDEsIDB4NjQsIDB4NDAsIDB4NDEsIDB4QTYsIDB4RjMsIDB4NDYsIDB4NEIsIDB4NjAsIDB4NDYsIDB4MjAsIDB4NjMsCisJIDB4RTMsIDB4ODMsIDB4QUIsIDB4NDYsIDB4MzIsIDB4RjAsIDB4QUIsIDB4NDYsIDB4NTksIDB4RjgsIDB4QUIsIDB4NDYsIDB4MzMsIDB4RjAsIDB4QUIsIDB4NDYsCisJIDB4NUEsIDB4RjgsIDB4QUIsIDB4NDYsIDB4MzQsIDB4RjAsIDB4QUIsIDB4NDYsIDB4NUIsIDB4RjgsIDB4NjYsIDB4NDQsIDB4MDIsIDB4QTYsIDB4RjEsIDB4MUYsCisJIDB4QTYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDYsIDB4QUIsIDB4NDYsIDB4MEMsIDB4NjAsIDB4MzgsIDB4NjUsIDB4MjIsIDB4NDQsIDB4RkYsIDB4QjQsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODEsIDB4QzksIDB4ODEsIDB4NEEsIDB4NjQsIDB4MEUsIDB4NjMsCisJIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4MjEsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDgsIDB4MDAsIDB4QUIsIDB4NDYsIDB4RjAsIDB4QTEsCisJIDB4NzYsIDB4NjQsIDB4MEUsIDB4NjMsIDB4NTksIDB4RDEsIDB4NTgsIDB4RDgsIDB4RkQsIDB4MUYsIDB4QUIsIDB4NDYsIDB4MjIsIDB4NDQsIDB4RkYsIDB4QjQsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODUsIDB4QzQsIDB4ODQsIDB4MEMsIDB4NjAsIDB4ODAsIDB4NjUsIDB4QzQsIDB4ODEsIDB4NUEsIDB4NjQsIDB4MDQsIDB4NjMsCisJIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4QUIsIDB4NDYsIDB4MjEsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDYsIDB4MDAsIDB4RkEsIDB4QTEsCisJIDB4OTAsIDB4NjQsIDB4MDQsIDB4NjMsIDB4NTksIDB4RDEsIDB4NTgsIDB4RDgsIDB4RkQsIDB4MUYsIDB4M0IsIDB4RjAsIDB4MjEsIDB4NDQsIDB4MDEsIDB4MkEsCisJIDB4MTMsIDB4MDAsIDB4MjIsIDB4NDQsIDB4M0QsIDB4RkIsIDB4NjAsIDB4NDEsIDB4MDIsIDB4RkUsIDB4RjgsIDB4ODQsIDB4RjgsIDB4ODQsIDB4RjgsIDB4ODQsCisJIDB4M0MsIDB4RkIsIDB4MEMsIDB4NjAsIDB4N0MsIDB4NjMsIDB4ODgsIDB4RkYsIDB4Q0QsIDB4ODEsIDB4MDYsIDB4QTMsIDB4RkQsIDB4MEQsIDB4OEQsIDB4RkYsCisJIDB4M0IsIDB4RkQsIDB4NjQsIDB4NDcsIDB4ODAsIDB4QkYsIDB4NjAsIDB4NUMsIDB4MjIsIDB4NDMsIDB4ODAsIDB4NjEsIDB4ODgsIDB4RkYsIDB4Q0YsIDB4ODMsCisJIDB4RTEsIDB4ODEsIDB4RkQsIDB4MEQsIDB4OEQsIDB4RkYsIDB4NjEsIDB4NDcsIDB4MzEsIDB4OTEsIDB4QjEsIDB4ODQsIDB4M0IsIDB4RkEsIDB4MUYsIDB4NjMsCisJIDB4RTMsIDB4ODMsIDB4NjYsIDB4NDQsIDB4MDIsIDB4QTYsIDB4M0IsIDB4RjAsIDB4NjYsIDB4NDQsIDB4QjEsIDB4OUMsIDB4M0IsIDB4RjgsIDB4MDIsIDB4QTYsCisJIDB4RkEsIDB4MUYsIDB4QUIsIDB4NDYsIDB4MDAsIDB4NjcsIDB4MDAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4RjIsIDB4MjUsIDB4RjAsCisJIDB4MDIsIDB4QTgsIDB4MDAsIDB4NjcsIDB4MjIsIDB4MDIsIDB4M0QsIDB4RjEsIDB4NjQsIDB4NDQsIDB4MDMsIDB4QjQsIDB4NDAsIDB4NDIsIDB4RDAsIDB4ODAsCisJIDB4QTYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDYsIDB4QkIsIDB4RjQsIDB4ODAsIDB4NjEsIDB4MDIsIDB4MDIsIDB4RTMsIDB4ODMsIDB4RUIsIDB4ODMsCisJIDB4MjIsIDB4NDQsIDB4ODgsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MEQsIDB4OEQsIDB4RkYsIDB4NjEsIDB4NDcsIDB4MzEsIDB4OTEsCisJIDB4OUQsIDB4ODUsIDB4QTcsIDB4ODMsIDB4M0IsIDB4RkMsIDB4MUYsIDB4NjMsIDB4RTMsIDB4ODMsIDB4NjYsIDB4NDQsIDB4MDIsIDB4QTYsIDB4QkIsIDB4RjIsCisJIDB4NjYsIDB4NDQsIDB4QTUsIDB4ODEsIDB4QkIsIDB4RkEsIDB4MDIsIDB4QTYsIDB4RkEsIDB4MUYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MjcsIDB4RjIsIDB4MUQsIDB4NjAsIDB4QzAsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsCisJIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MjcsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsCisJIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsCisJIDB4NjEsIDB4NDYsIDB4MjUsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsCisJIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4QTYsIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4MDEsIDB4MDMsIDB4MjEsIDB4MDAsCisJIDB4NDMsIDB4NEIsIDB4QUIsIDB4NDYsIDB4M0IsIDB4RjIsIDB4ODAsIDB4NjAsIDB4MzAsIDB4N0MsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4NEUsIDB4NjEsCisJIDB4NzYsIDB4NjQsIDB4MEUsIDB4NjMsIDB4QUIsIDB4NDYsIDB4NTksIDB4RDAsIDB4QUIsIDB4NDYsIDB4NTgsIDB4RDgsIDB4RkIsIDB4MUYsIDB4OTAsIDB4NjQsCisJIDB4MDQsIDB4NjMsIDB4QUIsIDB4NDYsIDB4NTksIDB4RDAsIDB4QUIsIDB4NDYsIDB4NTgsIDB4RDgsIDB4RkIsIDB4MUYsIDB4QTAsIDB4NjQsIDB4MDQsIDB4NjMsCisJIDB4QUIsIDB4NDYsIDB4NTksIDB4RDAsIDB4QUIsIDB4NDYsIDB4NTgsIDB4RDgsIDB4RkIsIDB4MUYsIDB4MDAsIDB4NjcsIDB4MDAsIDB4NjEsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjcsIDB4MjAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4RjIsIDB4MUQsIDB4NjAsIDB4QzAsIDB4NjUsCisJIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsCisJIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MjcsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsCisJIDB4MjYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjUsIDB4RjAsIDB4NjMsIDB4NDYsCisJIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4QTYsIDB4RjMsCisJIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4MDEsIDB4MDMsIDB4MEQsIDB4MDAsIDB4NDMsIDB4NEIsIDB4QUIsIDB4NDYsIDB4M0IsIDB4RjIsCisJIDB4ODAsIDB4NjAsIDB4MzAsIDB4NjEsIDB4OUQsIDB4ODUsIDB4QTQsIDB4ODQsIDB4QTIsIDB4REEsIDB4QUIsIDB4NDYsIDB4MDAsIDB4NjcsIDB4MDAsIDB4NjEsCisJIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjcsIDB4MjAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTIsIDB4RkYsIDB4NDYsIDB4NDUsCisJIDB4MDIsIDB4RjAsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjQsIDB4RDAsIDB4ODAsIDB4MDAsIDB4RjQsIDB4MDEsIDB4RjIsIDB4NjYsIDB4NUMsIDB4MjUsIDB4NDYsCisJIDB4NTYsIDB4MDIsIDB4NzAsIDB4MjcsIDB4NTQsIDB4MDAsIDB4MTIsIDB4NjQsIDB4MDMsIDB4RkEsIDB4MDQsIDB4RjgsIDB4MEUsIDB4RjIsIDB4ODcsIDB4RkMsCisJIDB4OEQsIDB4RkMsIDB4OEUsIDB4RkMsIDB4REEsIDB4ODIsIDB4MTYsIDB4NjEsIDB4MDAsIDB4NjMsIDB4QzksIDB4ODEsIDB4NUEsIDB4REMsIDB4RkQsIDB4MDIsCisJIDB4NjAsIDB4NDAsIDB4RjAsIDB4M0IsIDB4MTYsIDB4MDAsIDB4MzIsIDB4NDQsIDB4QUMsIDB4RjMsIDB4MDEsIDB4QjAsIDB4RkEsIDB4QTAsIDB4MDgsIDB4MjQsCisJIDB4MkMsIDB4MDUsIDB4REMsIDB4ODMsIDB4RjAsIDB4NjcsIDB4MEUsIDB4RkEsIDB4MjYsIDB4NjAsIDB4MDQsIDB4NjQsIDB4MkIsIDB4REIsIDB4NjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4QUMsIDB4RkQsIDB4MkIsIDB4RkYsIDB4RkUsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NEEsIDB4REIsCisJIDB4NEYsIDB4MDAsIDB4QUQsIDB4RjMsIDB4MDUsIDB4NjUsIDB4RDQsIDB4ODAsIDB4REMsIDB4ODMsIDB4MTcsIDB4MDUsIDB4QUQsIDB4RkQsIDB4OTgsIDB4RkUsCisJIDB4MDQsIDB4MDQsIDB4MDAsIDB4N0YsIDB4MDgsIDB4N0UsIDB4MEUsIDB4RkEsIDB4M0IsIDB4RkYsIDB4MjUsIDB4NjAsIDB4RjgsIDB4NjQsIDB4MkIsIDB4REIsCisJIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4MEUsIDB4RjIsIDB4MkIsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MjYsCisJIDB4RjcsIDB4RkUsIDB4RkQsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NEEsIDB4REIsIDB4MzIsIDB4MDAsIDB4QTksIDB4RjMsIDB4RkYsIDB4RkYsIDB4RDgsIDB4QTAsCisJIDB4RkYsIDB4RkYsIDB4MEQsIDB4MDQsIDB4MjYsIDB4NjAsIDB4MTAsIDB4NjQsIDB4MkIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RkMsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NEEsIDB4REIsIDB4MjEsIDB4MDAsIDB4NDYsIDB4NDUsCisJIDB4MDAsIDB4NjQsIDB4MkIsIDB4REIsIDB4MjUsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4QTIsIDB4RkYsIDB4MDAsIDB4RjQsIDB4MDEsIDB4RjAsIDB4MEEsIDB4MTgsIDB4NzAsIDB4NjcsIDB4QTAsIDB4ODAsIDB4RjAsIDB4NjcsIDB4MDYsIDB4MDMsCisJIDB4QzAsIDB4ODQsIDB4MDEsIDB4RkEsIDB4MjUsIDB4NDYsIDB4MjUsIDB4NDQsIDB4ODAsIDB4RkMsIDB4MDUsIDB4RkEsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4RjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDQsIDB4RkUsIDB4QTMsIDB4RkYsIDB4RkYsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NEEsIDB4REIsIDB4RDQsIDB4RkUsCisJIDB4QTMsIDB4RkYsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NjAsIDB4RkUsIDB4NjQsIDB4NDAsIDB4NDcsIDB4NTgsIDB4NEYsIDB4MEQsIDB4MDAsCisJIDB4MjUsIDB4NjAsIDB4RjIsIDB4NjQsIDB4NDAsIDB4NDcsIDB4NTgsIDB4NEYsIDB4MTgsIDB4MDAsIDB4MjYsIDB4NjAsIDB4MEEsIDB4NjQsIDB4NDAsIDB4NDcsCisJIDB4NTgsIDB4NEYsIDB4MDMsIDB4MDAsIDB4MkEsIDB4NjAsIDB4MUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4RDUsIDB4MEUsIDB4RjIsIDB4MEIsIDB4MTgsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDgsIDB4MDAsIDB4MjYsIDB4NjAsIDB4MjAsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MzQsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4MDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RjIsIDB4MDEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4RDUsIDB4MEUsIDB4RjIsIDB4MTQsIDB4MTgsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MTEsIDB4MDAsIDB4MDIsIDB4RjAsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjQsIDB4RDAsIDB4ODAsIDB4QTIsIDB4RkYsCisJIDB4QUQsIDB4RjMsIDB4MDIsIDB4MDIsIDB4Q0MsIDB4ODQsIDB4QUQsIDB4RkIsIDB4MjYsIDB4NjAsIDB4MjAsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MzQsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4MDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTksIDB4MDEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RkIsIDB4NjQsIDB4M0EsIDB4NDIsCisJIDB4NEEsIDB4REIsIDB4QTIsIDB4RkYsIDB4QjAsIDB4RjMsIDB4QUMsIDB4RjMsIDB4Q0MsIDB4ODAsIDB4RkQsIDB4QTAsIDB4MDEsIDB4MTQsIDB4MUQsIDB4MDUsCisJIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RkEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTIsIDB4RkYsIDB4MTcsIDB4MDMsIDB4RjAsIDB4NjcsIDB4MEUsIDB4RkEsCisJIDB4MjYsIDB4NjAsIDB4MDQsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RjYsIDB4NjQsIDB4M0EsIDB4NDIsIDB4NEEsIDB4REIsIDB4QjAsIDB4RjMsIDB4QUMsIDB4RjMsIDB4Q0MsIDB4ODMsCisJIDB4REMsIDB4ODQsIDB4MDEsIDB4MTUsIDB4QjAsIDB4RkQsIDB4QUMsIDB4RkIsIDB4RDQsIDB4RkUsIDB4QUYsIDB4RjMsIDB4QUQsIDB4RjMsIDB4MDAsIDB4QTgsCisJIDB4QUUsIDB4RjEsIDB4MDMsIDB4MDIsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MjYsIDB4MDUsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RkEsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4QTIsIDB4RkYsIDB4MjAsIDB4MDMsIDB4MDAsIDB4NjMsIDB4QUYsIDB4RjMsIDB4MEUsIDB4RkMsIDB4Q0MsIDB4ODQsIDB4RkYsIDB4M0EsCisJIDB4QUYsIDB4RkIsIDB4OTgsIDB4RkUsIDB4MDMsIDB4MDQsIDB4MDgsIDB4QkIsIDB4MEUsIDB4RkMsIDB4M0IsIDB4RkYsIDB4MjUsIDB4NjAsIDB4RjgsIDB4NjQsCisJIDB4MTMsIDB4NjAsIDB4MTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4RjcsIDB4NjQsIDB4M0EsIDB4NDIsIDB4NEEsIDB4REIsIDB4QUQsIDB4RjMsIDB4MEUsIDB4RjIsIDB4REMsIDB4ODMsIDB4MDgsIDB4QjAsIDB4QUQsIDB4RkQsCisJIDB4MDgsIDB4MjgsIDB4RjcsIDB4RkUsIDB4RDQsIDB4RkUsIDB4QTMsIDB4RkYsIDB4MkEsIDB4NjAsIDB4MUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QjksIDB4RkUsCisJIDB4MTMsIDB4RkYsIDB4MjQsIDB4NDAsIDB4ODAsIDB4MkIsIDB4MEIsIDB4MDAsIDB4QTIsIDB4RkYsIDB4MjUsIDB4NDYsIDB4MDksIDB4RjQsIDB4MEUsIDB4RjIsCisJIDB4MDUsIDB4MTgsIDB4MDgsIDB4QkMsIDB4MEUsIDB4RkEsIDB4RkYsIDB4RkYsIDB4RjcsIDB4RkUsIDB4MDEsIDB4MDAsIDB4RDgsIDB4RkUsIDB4QTMsIDB4RkYsCisJIDB4MjUsIDB4NDYsIDB4M0UsIDB4RjIsIDB4MDAsIDB4RjQsIDB4MDgsIDB4RjAsIDB4MjUsIDB4NDYsIDB4MDYsIDB4QjQsIDB4RkYsIDB4N0YsIDB4MTAsIDB4QkMsCisJIDB4MDYsIDB4MjYsIDB4RkQsIDB4N0YsIDB4MEUsIDB4RkEsIDB4M0UsIDB4RjIsIDB4M0YsIDB4RjIsIDB4NjAsIDB4NDEsIDB4MDgsIDB4MkEsIDB4NjQsIDB4NDcsCisJIDB4M0YsIDB4RkEsIDB4NjAsIDB4NDUsIDB4QjksIDB4RkMsIDB4MTYsIDB4NjAsIDB4QUEsIDB4RjMsIDB4QTMsIDB4RkMsIDB4QUIsIDB4RkMsIDB4OTEsIDB4RkMsCisJIDB4RDQsIDB4ODAsIDB4MTgsIDB4NjAsIDB4MjEsIDB4NjUsIDB4QTUsIDB4ODAsIDB4MDEsIDB4MDQsIDB4MDcsIDB4MDMsIDB4MjMsIDB4RjAsIDB4MDgsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4MzUsIDB4NjAsIDB4RUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzYsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MzAsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEIsIDB4MDQsIDB4MjMsIDB4RjAsIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4MkMsIDB4NjAsIDB4RUUsIDB4NjQsCisJIDB4RjEsIDB4NjAsIDB4NzgsIDB4NDEsIDB4RTQsIDB4NzgsIDB4QjUsIDB4RjEsIDB4ODMsIDB4MDAsIDB4REIsIDB4RjMsIDB4QTYsIDB4RjEsIDB4MDcsIDB4QjQsCisJIDB4NjQsIDB4NDMsIDB4RkQsIDB4QTAsIDB4MkMsIDB4RjIsIDB4NzEsIDB4MDIsIDB4MDEsIDB4QjAsIDB4NjQsIDB4NDMsIDB4NzgsIDB4MDIsIDB4MkUsIDB4RjIsCisJIDB4MUQsIDB4NjAsIDB4QzAsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsCisJIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MkUsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsCisJIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MkQsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsCisJIDB4MkMsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsCisJIDB4RTgsIDB4MUIsIDB4QTYsIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4NTEsIDB4MDMsIDB4NjMsIDB4NDYsIDB4ODAsIDB4RjYsCisJIDB4MjUsIDB4NDYsIDB4NDMsIDB4MTgsIDB4MkUsIDB4RjIsIDB4NjYsIDB4NDEsIDB4MUQsIDB4NjAsIDB4QzAsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4QTYsIDB4RjEsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjQsIDB4NDMsIDB4MTEsIDB4MTgsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4RkMsIDB4MUIsIDB4NjYsIDB4NDQsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjAsIDB4NjAsIDB4NDYsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4NjUsIDB4NDMsCisJIDB4ODAsIDB4RjAsIDB4MDEsIDB4RkEsIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsIDB4MEIsIDB4MDAsIDB4NjQsIDB4NDYsIDB4NjIsIDB4NDMsCisJIDB4MDAsIDB4RjIsIDB4QTMsIDB4REIsIDB4NjAsIDB4NDYsIDB4ODAsIDB4RjAsIDB4ODEsIDB4RkMsIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsCisJIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4NDMsIDB4NEIsIDB4MkMsIDB4RjAsIDB4QUQsIDB4RjAsIDB4MkUsIDB4RjIsIDB4QUIsIDB4NDYsIDB4MDMsIDB4RjgsCisJIDB4ODQsIDB4RjgsIDB4MDUsIDB4RkEsIDB4MDMsIDB4NjQsIDB4MDYsIDB4RkEsIDB4QUIsIDB4NDYsIDB4MUYsIDB4NjAsIDB4QzIsIDB4NjEsIDB4QTEsIDB4RDMsCisJIDB4MjAsIDB4NjAsIDB4MDQsIDB4N0MsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4QTAsIDB4REQsIDB4REEsIDB4OUMsIDB4QTEsIDB4RDksCisJIDB4NDksIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4QTEsIDB4REIsIDB4MEEsIDB4MDAsIDB4REIsIDB4RjMsIDB4MDIsIDB4QTMsIDB4RkUsIDB4QTAsCisJIDB4RjksIDB4QTAsIDB4MDEsIDB4MDYsIDB4MDQsIDB4MDIsIDB4MjMsIDB4RjAsIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4MDcsIDB4RkMsCisJIDB4MjMsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MjQsIDB4MUIsIDB4MTYsIDB4NjAsIDB4QUIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDAsIDB4M0EsCisJIDB4MEYsIDB4MDAsIDB4MjUsIDB4NjAsIDB4QzgsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MEUsIDB4RjIsIDB4QzEsIDB4RkUsIDB4MTAsIDB4QUMsIDB4MEUsIDB4RkEsIDB4MUQsIDB4MDAsCisJIDB4MjUsIDB4NjAsIDB4REEsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MEUsIDB4RjIsIDB4QzgsIDB4RkUsIDB4MTAsIDB4QUMsIDB4MEUsIDB4RkEsIDB4MEUsIDB4MDAsIDB4MjUsIDB4NjAsCisJIDB4RUMsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4MEUsIDB4RjIsIDB4Q0UsIDB4RkUsIDB4MTAsIDB4QUMsIDB4MEUsIDB4RkEsIDB4MkEsIDB4NjAsIDB4MUQsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4Q0IsIDB4ODQsIDB4QzksIDB4ODMsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDQsIDB4NTgsIDB4RDEsIDB4QTUsIDB4RDgsIDB4REEsIDB4ODUsIDB4ODAsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4RjgsIDB4MUYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4M0UsIDB4RjIsIDB4QzksIDB4RjEsCisJIDB4MDgsIDB4QjAsIDB4MTksIDB4RjgsIDB4NTcsIDB4MDIsIDB4RUEsIDB4RjEsIDB4MkYsIDB4RjgsIDB4RUIsIDB4RjMsIDB4MzAsIDB4RkEsIDB4NjAsIDB4NDUsCisJIDB4RUMsIDB4RjMsIDB4MzEsIDB4RkEsIDB4NDYsIDB4NEEsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MDYsIDB4RjIsIDB4RDAsIDB4ODAsCisJIDB4MDcsIDB4RjAsIDB4MDUsIDB4MDIsIDB4RDQsIDB4ODAsIDB4RDMsIDB4ODAsIDB4MDIsIDB4MDIsIDB4REIsIDB4RjMsIDB4MDMsIDB4MDMsIDB4QUEsIDB4NDYsCisJIDB4NDIsIDB4RkUsIDB4NDEsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDMsIDB4MkEsIDB4MjAsIDB4MDAsIDB4MDIsIDB4RjIsIDB4MDMsIDB4RjAsIDB4MDQsIDB4RjIsCisJIDB4NjAsIDB4NDMsIDB4QUEsIDB4NDYsIDB4MkMsIDB4RkMsIDB4MkQsIDB4RjgsIDB4MkUsIDB4RkEsIDB4N0YsIDB4RjEsIDB4MzIsIDB4RjgsIDB4ODAsIDB4RjEsCisJIDB4MzMsIDB4RjgsIDB4ODEsIDB4RjEsIDB4MzQsIDB4RjgsIDB4MDgsIDB4NjQsIDB4MzIsIDB4NDAsIDB4MDQsIDB4MkEsIDB4MEQsIDB4MDAsIDB4MkMsIDB4RjAsCisJIDB4MzksIDB4RjAsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDgsIDB4MDAsIDB4M0UsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4QzAsIDB4QjQsCisJIDB4RTgsIDB4ODQsIDB4QjAsIDB4OUMsIDB4MzksIDB4RjgsIDB4ODgsIDB4NjQsIDB4MUMsIDB4MDAsIDB4MDIsIDB4RjIsIDB4MDMsIDB4RjAsIDB4MDQsIDB4RjIsCisJIDB4NjAsIDB4NDMsIDB4QUEsIDB4NDYsIDB4MzIsIDB4RkMsIDB4MzMsIDB4RjgsIDB4MzQsIDB4RkEsIDB4N0YsIDB4RjEsIDB4MkMsIDB4RjgsIDB4ODAsIDB4RjEsCisJIDB4MkQsIDB4RjgsIDB4ODEsIDB4RjEsIDB4MkUsIDB4RjgsIDB4MDEsIDB4NjAsIDB4MDgsIDB4NjQsIDB4MzIsIDB4NDAsIDB4MDQsIDB4MkEsIDB4MDksIDB4MDAsCisJIDB4M0UsIDB4RjIsIDB4MzksIDB4RjAsIDB4MDAsIDB4NjAsIDB4QzAsIDB4QjQsIDB4RTgsIDB4ODQsIDB4QjAsIDB4OUMsIDB4MzksIDB4RjgsIDB4MDEsIDB4NjAsCisJIDB4ODgsIDB4NjQsIDB4MkEsIDB4RkEsIDB4MDIsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MzYsIDB4NjAsIDB4MjIsIDB4NjMsIDB4MjAsIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4MjEsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjIsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjQsIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4MjUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjYsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjcsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjgsIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4MjksIDB4NDQsIDB4QkQsIDB4REIsIDB4MkEsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkIsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkMsIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4MkQsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkYsIDB4NDQsIDB4QkQsIDB4REIsIDB4MUIsIDB4NjAsCisJIDB4MEIsIDB4RkQsIDB4MzcsIDB4NjAsIDB4NDIsIDB4NjMsIDB4MUIsIDB4NjAsIDB4MEMsIDB4RkQsIDB4MzAsIDB4NDQsIDB4MUIsIDB4NjAsIDB4MEQsIDB4RkIsCisJIDB4MzEsIDB4NDQsIDB4MUIsIDB4NjAsIDB4MEUsIDB4RkIsIDB4MzIsIDB4NDQsIDB4MUIsIDB4NjAsIDB4MEYsIDB4RkIsIDB4MzMsIDB4NDQsIDB4MUIsIDB4NjAsCisJIDB4MTAsIDB4RkIsIDB4ODEsIDB4RkYsIDB4OTEsIDB4RkYsIDB4NTgsIDB4NTEsIDB4NDQsIDB4MDAsIDB4ODIsIDB4RkYsIDB4OTIsIDB4RkYsIDB4NTgsIDB4NTEsCisJIDB4NDAsIDB4MDAsIDB4ODMsIDB4RkYsIDB4OTMsIDB4RkYsIDB4NTgsIDB4NTEsIDB4M0MsIDB4MDAsIDB4ODQsIDB4RkYsIDB4OTQsIDB4RkYsIDB4NTgsIDB4NTEsCisJIDB4MzgsIDB4MDAsIDB4ODUsIDB4RkYsIDB4OTUsIDB4RkYsIDB4NTgsIDB4NTEsIDB4MzQsIDB4MDAsIDB4ODYsIDB4RkYsIDB4OTYsIDB4RkYsIDB4NTgsIDB4NTEsCisJIDB4MzAsIDB4MDAsIDB4ODcsIDB4RkYsIDB4OTcsIDB4RkYsIDB4NTgsIDB4NTEsIDB4MkMsIDB4MDAsIDB4ODAsIDB4RkYsIDB4OTAsIDB4RkYsIDB4OTksIDB4RkYsCisJIDB4MUIsIDB4NjAsIDB4MEIsIDB4RjEsIDB4MzAsIDB4NDQsIDB4NjQsIDB4NDMsIDB4QkQsIDB4REIsIDB4MzEsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzIsIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4MzMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzQsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzYsIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4MzcsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzgsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzksIDB4NDQsIDB4QkQsIDB4REIsIDB4M0EsIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4M0IsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0MsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0QsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0UsIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4M0YsIDB4NDQsIDB4QkQsIDB4REIsIDB4RjYsIDB4NjAsIDB4MTYsIDB4NjQsIDB4MEEsIDB4RkIsIDB4NDAsIDB4MjEsIDB4RkUsIDB4MDEsCisJIDB4NzQsIDB4MDAsIDB4NDIsIDB4NTAsIDB4NDAsIDB4NTMsIDB4MUIsIDB4NjAsIDB4MEMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NTIsIDB4MzMsIDB4NDQsCisJIDB4MzIsIDB4NDIsIDB4QTIsIDB4REIsIDB4REEsIDB4ODIsIDB4QTIsIDB4REQsIDB4REEsIDB4ODMsIDB4NjUsIDB4NDQsIDB4QkQsIDB4REIsIDB4NjEsIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4NjYsIDB4NDQsIDB4QkQsIDB4REIsIDB4QkQsIDB4RDksIDB4MzAsIDB4NDQsIDB4QkQsIDB4REIsIDB4OTksIDB4RkYsIDB4QTQsIDB4NEMsCisJIDB4QkQsIDB4REIsIDB4QTUsIDB4NEMsIDB4QkQsIDB4REIsIDB4QTAsIDB4NEMsIDB4QkQsIDB4REIsIDB4QTEsIDB4NEMsIDB4QkQsIDB4REIsIDB4OTgsIDB4RkYsCisJIDB4MUIsIDB4NjAsIDB4MEMsIDB4RkQsIDB4MUIsIDB4NjAsIDB4MEQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NTAsIDB4MUIsIDB4NjAsIDB4MEYsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4NDAsIDB4NTIsIDB4MUIsIDB4NjAsIDB4MTAsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NTMsIDB4MzEsIDB4NDEsIDB4MUIsIDB4NjAsCisJIDB4MEUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NTEsIDB4MUIsIDB4NjAsIDB4MEIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDMsIDB4MjAsIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4MjEsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjIsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjQsIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4MjUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjYsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjcsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjgsIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4MjksIDB4NDQsIDB4QkQsIDB4REIsIDB4MkEsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkIsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkMsIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4MkQsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkYsIDB4NDQsIDB4QkQsIDB4REIsIDB4MUIsIDB4NjAsCisJIDB4MEIsIDB4RkQsIDB4NjEsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkYsIDB4NjAsIDB4NEUsIDB4NjMsIDB4QTMsIDB4RDMsIDB4MzMsIDB4NUMsIDB4MDIsIDB4QTQsCisJIDB4QkQsIDB4REIsIDB4RkUsIDB4QjQsIDB4RTAsIDB4ODUsIDB4QzQsIDB4ODUsIDB4NDcsIDB4RDksIDB4MzQsIDB4NDQsIDB4NUIsIDB4REIsIDB4NDQsIDB4RjMsCisJIDB4NUIsIDB4REIsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODcsIDB4M0UsIDB4ODQsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODcsIDB4M0UsCisJIDB4RkYsIDB4MDEsIDB4ODYsIDB4RTEsIDB4ODAsIDB4RkYsIDB4OTAsIDB4RkYsIDB4ODgsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODcsIDB4M0UsCisJIDB4MTksIDB4NjAsIDB4RjcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTAsIDB4MUIsIDB4MzIsIDB4NDAsIDB4ODAsIDB4MkEsIDB4RjYsIDB4MDEsIDB4OUQsIDB4RkUsCisJIDB4RjQsIDB4MDUsIDB4REIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDQsIDB4QTgsIDB4MzMsIDB4NjAsIDB4RTIsIDB4NjIsIDB4MDEsIDB4MDIsIDB4QkQsIDB4MDAsCisJIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NEEsIDB4MUIsIDB4RTksIDB4MDEsIDB4ODcsIDB4RkYsIDB4MjAsIDB4NDQsIDB4ODAsIDB4RkYsIDB4NjAsIDB4NDAsCisJIDB4ODAsIDB4MjYsIDB4RTMsIDB4MDEsIDB4RjEsIDB4RkMsIDB4QUQsIDB4NEYsIDB4RkQsIDB4QjQsIDB4QTAsIDB4NUQsIDB4QzAsIDB4NjAsIDB4NDAsIDB4RUMsCisJIDB4QzAsIDB4NjAsIDB4MDAsIDB4RUQsIDB4QzAsIDB4NjAsIDB4ODAsIDB4RUUsIDB4QUMsIDB4NEYsIDB4QkYsIDB4QjQsIDB4QTAsIDB4NUMsIDB4MTksIDB4NjAsCisJIDB4NDgsIDB4RjEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MjcsIDB4MDYsIDB4MDAsIDB4MjgsIDB4RTIsIDB4MjQsIDB4RTIsIDB4NDAsIDB4MjEsCisJIDB4RkUsIDB4MDEsIDB4NzUsIDB4NDAsIDB4MEQsIDB4MDAsIDB4MjgsIDB4RTIsIDB4MjQsIDB4RTIsIDB4NzUsIDB4NDAsIDB4ODAsIDB4MkIsIDB4QUIsIDB4RkYsCisJIDB4MTQsIDB4RTAsIDB4OTQsIDB4RTAsIDB4NDAsIDB4MjEsIDB4RkUsIDB4MDEsIDB4MTAsIDB4RTAsIDB4NzUsIDB4NDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MzMsIDB4NjAsIDB4RUUsIDB4NjIsIDB4QTIsIDB4REYsIDB4MDEsIDB4NjAsIDB4MzksIDB4RTIsIDB4MDQsIDB4NjAsIDB4MDAsIDB4N0EsIDB4QUMsIDB4NEYsCisJIDB4NDAsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUMsIDB4QzAsIDB4NjAsIDB4NTksIDB4RUMsIDB4QzAsIDB4NjAsIDB4MDcsIDB4RUQsIDB4QzAsIDB4NjAsCisJIDB4OEYsIDB4RUUsIDB4QUUsIDB4NEYsIDB4MDQsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUUsIDB4MjYsIDB4NjEsIDB4Q0QsIDB4ODEsIDB4RkYsIDB4RkYsCisJIDB4RkQsIDB4MDIsIDB4QUUsIDB4NEYsIDB4RkIsIDB4QjQsIDB4QTAsIDB4NUUsIDB4QTAsIDB4MDEsIDB4RjEsIDB4RkMsIDB4QUQsIDB4NEYsIDB4RkQsIDB4QjQsCisJIDB4QTAsIDB4NUQsIDB4MTUsIDB4NjAsIDB4ODAsIDB4RTcsIDB4QzAsIDB4NjAsIDB4NDAsIDB4RUMsIDB4QzAsIDB4NjAsIDB4MDAsIDB4RUQsIDB4QUMsIDB4NEYsCisJIDB4QkYsIDB4QjQsIDB4QTAsIDB4NUMsIDB4QzAsIDB4NjAsIDB4ODQsIDB4RUUsIDB4QUUsIDB4NEYsIDB4MDQsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUUsCisJIDB4MDAsIDB4N0EsIDB4MEYsIDB4NjAsIDB4MTksIDB4RTIsIDB4MEUsIDB4NjAsIDB4MzYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4NzUsIDB4NDQsCisJIDB4ODAsIDB4MkIsIDB4QUIsIDB4RkYsIDB4ODAsIDB4MjcsIDB4MDgsIDB4MDAsIDB4MTQsIDB4RTAsIDB4OTQsIDB4RTAsIDB4MzQsIDB4RTIsIDB4NjEsIDB4NUEsCisJIDB4NDgsIDB4MjEsIDB4RkUsIDB4MDEsIDB4MDAsIDB4RTAsIDB4NzUsIDB4NDAsIDB4MEEsIDB4NjAsIDB4MTksIDB4RTIsIDB4MDAsIDB4NjQsIDB4MTksIDB4NjAsCisJIDB4RjEsIDB4RkIsIDB4MDgsIDB4NjAsIDB4MTUsIDB4RjEsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MDEsIDB4NjQsIDB4MTksIDB4NjAsIDB4RjIsIDB4RkIsIDB4RkYsIDB4RkYsIDB4MTAsIDB4RTAsIDB4MDEsIDB4NjAsIDB4MzQsIDB4RTIsIDB4RkYsIDB4RkYsCisJIDB4MDUsIDB4N0EsIDB4QUMsIDB4NEYsIDB4NDAsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUMsIDB4QzAsIDB4NjAsIDB4NTksIDB4RUMsIDB4QzAsIDB4NjAsCisJIDB4MDcsIDB4RUQsIDB4QzAsIDB4NjAsIDB4OEYsIDB4RUUsIDB4QUUsIDB4NEYsIDB4MDQsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUUsIDB4MUIsIDB4NjAsCisJIDB4RjMsIDB4RjEsIDB4QUQsIDB4NEYsIDB4MDAsIDB4N0YsIDB4RkEsIDB4QjQsIDB4NjQsIDB4NDEsIDB4N0QsIDB4RjEsIDB4MDIsIDB4QjEsIDB4MDQsIDB4NjUsCisJIDB4MDIsIDB4MDIsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MDEsIDB4NjUsIDB4QjQsIDB4ODQsIDB4QTAsIDB4NUQsIDB4MjYsIDB4NjEsIDB4Q0QsIDB4ODEsCisJIDB4RkYsIDB4RkYsIDB4RkQsIDB4MDIsIDB4QUUsIDB4NEYsIDB4RkIsIDB4QjQsIDB4QTAsIDB4NUUsIDB4MUIsIDB4NjAsIDB4RjMsIDB4RjEsIDB4QUQsIDB4NEYsCisJIDB4MDAsIDB4N0YsIDB4RkEsIDB4QjQsIDB4NjQsIDB4NDEsIDB4N0QsIDB4RjEsIDB4MDIsIDB4QjEsIDB4MDQsIDB4NjUsIDB4MDIsIDB4MDIsIDB4NjQsIDB4NDAsCisJIDB4MDEsIDB4MkIsIDB4MDEsIDB4NjUsIDB4QjQsIDB4ODQsIDB4QTAsIDB4NUQsIDB4MzAsIDB4MDEsIDB4MTksIDB4NjAsIDB4RjMsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MUIsIDB4MkIsIDB4MDEsIDB4MzEsIDB4NDQsIDB4MDQsIDB4MkEsIDB4MjgsIDB4MDEsIDB4MDgsIDB4MjYsIDB4MjYsIDB4MDEsIDB4MTksIDB4NjAsCisJIDB4RjQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTgsIDB4MjEsIDB4MDEsIDB4N0UsIDB4RjUsIDB4RjEsIDB4RkMsIDB4QUQsIDB4NEYsIDB4RkQsIDB4QjQsCisJIDB4QTAsIDB4NUQsIDB4MTUsIDB4NjAsIDB4ODAsIDB4RTcsIDB4QzAsIDB4NjAsIDB4NDAsIDB4RUMsIDB4QzAsIDB4NjAsIDB4MDAsIDB4RUQsIDB4QUMsIDB4NEYsCisJIDB4QkYsIDB4QjQsIDB4QTAsIDB4NUMsIDB4QzAsIDB4NjAsIDB4ODQsIDB4RUUsIDB4QUUsIDB4NEYsIDB4MDQsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUUsCisJIDB4MDAsIDB4N0EsIDB4MkQsIDB4NjAsIDB4NUEsIDB4NjMsIDB4QTMsIDB4RDEsIDB4MDUsIDB4NjAsIDB4REMsIDB4NjQsIDB4RDAsIDB4ODAsIDB4MDAsIDB4NjQsCisJIDB4MDEsIDB4MDYsIDB4MDEsIDB4NjQsIDB4NDAsIDB4NEUsIDB4QjIsIDB4RjEsIDB4NjYsIDB4NDEsIDB4RTEsIDB4ODEsIDB4RTEsIDB4ODEsIDB4RTEsIDB4ODEsCisJIDB4RTEsIDB4ODEsIDB4NjEsIDB4NDYsIDB4NzMsIDB4NDIsIDB4NUEsIDB4OTIsIDB4M0YsIDB4NjQsIDB4QTAsIDB4ODQsIDB4NjAsIDB4NDcsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODUsIDB4NjIsIDB4NDcsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4M0YsIDB4QjQsIDB4NjAsIDB4NDEsIDB4NjQsIDB4NDQsIDB4MTQsIDB4OTAsCisJIDB4M0YsIDB4MjYsIDB4Q0MsIDB4ODQsIDB4MTQsIDB4OTAsIDB4M0YsIDB4MjYsIDB4Q0MsIDB4ODQsIDB4NjIsIDB4NDEsIDB4NjAsIDB4NTUsIDB4QjIsIDB4RkIsCisJIDB4NzIsIDB4NUMsIDB4NjcsIDB4NDIsIDB4RDIsIDB4ODAsIDB4QTIsIDB4NDgsIDB4MjAsIDB4MkIsIDB4MDUsIDB4MDAsIDB4MDEsIDB4MDIsIDB4N0MsIDB4NUMsCisJIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QzQsIDB4ODUsIDB4RTgsIDB4RTIsIDB4RTQsIDB4RTIsIDB4NjEsIDB4NDIsIDB4NDksIDB4OTEsIDB4NjQsIDB4NDQsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4QjQsIDB4ODQsIDB4NjAsIDB4NDUsCisJIDB4NTEsIDB4OTQsIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjEsIDB4MDEsIDB4MEQsIDB4NDQsIDB4OTQsIDB4NjIsIDB4NDEsIDB4MTksIDB4NjAsIDB4RjUsIDB4RjEsCisJIDB4NjEsIDB4NDIsIDB4NjQsIDB4NDMsIDB4Q0YsIDB4ODMsIDB4Q0YsIDB4ODMsIDB4MDMsIDB4MDMsIDB4RTMsIDB4ODMsIDB4NDgsIDB4OTQsIDB4RkUsIDB4MUYsCisJIDB4MkUsIDB4NDAsIDB4MDEsIDB4MjYsIDB4RTAsIDB4ODQsIDB4NjAsIDB4NDEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsCisJIDB4NDQsIDB4OTQsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4NTQsIDB4OTQsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4NDQsIDB4OTQsCisJIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4NTQsIDB4OTQsIDB4MTksIDB4RTIsIDB4MkUsIDB4NDAsIDB4MDEsIDB4MjYsIDB4RTgsIDB4ODQsCisJIDB4MjksIDB4NjEsIDB4NTQsIDB4OTEsIDB4NjEsIDB4NDMsIDB4MTEsIDB4MDYsIDB4NzUsIDB4NDQsIDB4ODAsIDB4MkIsIDB4QUIsIDB4RkYsIDB4ODAsIDB4MjcsCisJIDB4MEMsIDB4MDAsIDB4MTQsIDB4RTAsIDB4OTQsIDB4RTAsIDB4MzQsIDB4RTIsIDB4NjEsIDB4NUEsIDB4NDgsIDB4MjEsIDB4RkUsIDB4MDEsIDB4MDAsIDB4RTAsCisJIDB4N0EsIDB4NDMsIDB4MTUsIDB4QTEsIDB4NzUsIDB4NDAsIDB4ODAsIDB4MkIsIDB4MDYsIDB4QTEsIDB4NUQsIDB4OTEsIDB4NjEsIDB4NDQsIDB4MkUsIDB4NDAsCisJIDB4MDEsIDB4MjYsIDB4RTAsIDB4ODQsIDB4NjAsIDB4NDMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4ODksIDB4RkYsIDB4MTAsIDB4RTAsCisJIDB4ODAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4NUMsIDB4OTQsIDB4RUIsIDB4ODMsIDB4NUMsIDB4OTQsCisJIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4NEMsIDB4OTQsIDB4MkUsIDB4NDAsIDB4MDEsIDB4MjYsCisJIDB4RTgsIDB4ODQsIDB4NjAsIDB4NDMsIDB4NjUsIDB4NDEsIDB4NjIsIDB4NDUsIDB4RDUsIDB4ODUsIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjEsIDB4MDEsIDB4MEQsCisJIDB4QzUsIDB4ODUsIDB4QzQsIDB4ODQsIDB4NjAsIDB4NDMsIDB4NjIsIDB4NDEsIDB4RTEsIDB4ODEsIDB4RTEsIDB4ODEsIDB4RTEsIDB4ODEsIDB4RTEsIDB4ODEsCisJIDB4RTEsIDB4ODEsIDB4RTEsIDB4OUMsIDB4MDAsIDB4NjEsIDB4REQsIDB4ODEsIDB4NTgsIDB4OTQsIDB4NEEsIDB4OTIsIDB4RkMsIDB4MDUsIDB4NDEsIDB4NEYsCisJIDB4MDAsIDB4NjEsIDB4NjIsIDB4NDUsIDB4MUMsIDB4NjAsIDB4MEEsIDB4RjMsIDB4RTMsIDB4ODMsIDB4RjEsIDB4ODEsIDB4RTMsIDB4ODMsIDB4RjEsIDB4ODEsCisJIDB4RTMsIDB4ODMsIDB4RjEsIDB4ODEsIDB4RTMsIDB4ODMsIDB4RjEsIDB4ODEsIDB4RTMsIDB4ODMsIDB4RjEsIDB4ODEsIDB4RTMsIDB4ODMsIDB4RjEsIDB4ODEsCisJIDB4QTAsIDB4NTIsIDB4QjIsIDB4RjMsIDB4QzMsIDB4OUMsIDB4NDQsIDB4OTQsIDB4MDEsIDB4MDQsIDB4REMsIDB4ODQsIDB4NjAsIDB4NTUsIDB4QjIsIDB4RkIsCisJIDB4NjQsIDB4NTIsIDB4RTksIDB4RTIsIDB4NjUsIDB4NTMsIDB4QjMsIDB4RjMsIDB4MDYsIDB4MDQsIDB4REMsIDB4ODQsIDB4QjMsIDB4RkIsIDB4QjQsIDB4RjMsCisJIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4QjQsIDB4RkIsIDB4MkYsIDB4NDMsIDB4Q0YsIDB4ODMsIDB4NkMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NUMsIDB4OTQsCisJIDB4RkYsIDB4RkYsIDB4MEMsIDB4MjQsIDB4MDEsIDB4NjQsIDB4NkMsIDB4RkIsIDB4MTYsIDB4NjAsIDB4QUMsIDB4RjEsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MUIsCisJIDB4MzEsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDcsIDB4MDAsIDB4NzMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NUMsIDB4OTQsIDB4RkYsIDB4RkYsIDB4MEMsIDB4MjQsCisJIDB4MDAsIDB4NjQsIDB4NzMsIDB4RkIsIDB4MTksIDB4NjAsIDB4RjUsIDB4RjMsIDB4MDEsIDB4N0MsIDB4NUMsIDB4OTQsIDB4MDAsIDB4MzYsIDB4MDEsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MTksIDB4NjAsIDB4RjIsIDB4RjksIDB4MDEsIDB4NjAsIDB4MzQsIDB4RTIsIDB4MzIsIDB4N0EsIDB4QUMsIDB4NEYsIDB4NDAsIDB4QkMsCisJIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUMsIDB4QzAsIDB4NjAsIDB4NTksIDB4RUMsIDB4QzAsIDB4NjAsIDB4MDcsIDB4RUQsIDB4QzAsIDB4NjAsIDB4OEYsIDB4RUUsCisJIDB4QUUsIDB4NEYsIDB4MDQsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUUsIDB4MEEsIDB4NjEsIDB4Q0QsIDB4ODEsIDB4RkYsIDB4RkYsIDB4RkQsIDB4MDIsCisJIDB4QUUsIDB4NEYsIDB4RkIsIDB4QjQsIDB4QTAsIDB4NUUsIDB4MUIsIDB4NjAsIDB4RjMsIDB4RjEsIDB4QUQsIDB4NEYsIDB4MDAsIDB4N0YsIDB4RkEsIDB4QjQsCisJIDB4NjQsIDB4NDEsIDB4N0QsIDB4RjEsIDB4MDIsIDB4QjEsIDB4MDQsIDB4NjUsIDB4MDIsIDB4MDIsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MDEsIDB4NjUsCisJIDB4QjQsIDB4ODQsIDB4QTAsIDB4NUQsIDB4MzcsIDB4NjAsIDB4N0YsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4RTIsIDB4MkQsIDB4RjMsIDB4MkMsIDB4RjMsCisJIDB4MDAsIDB4QkQsIDB4Q0MsIDB4ODQsIDB4MDgsIDB4MDMsIDB4MkMsIDB4RkIsIDB4MDYsIDB4MDIsIDB4NjUsIDB4NDQsIDB4MkMsIDB4RkIsIDB4OEEsIDB4RkYsCisJIDB4ODAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4NDQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4NDQsIDB4RkIsIDB4MkYsIDB4NjAsCisJIDB4NEEsIDB4NjUsIDB4MkYsIDB4NjAsIDB4NDgsIDB4NjEsIDB4QTUsIDB4RDMsIDB4QTEsIDB4RDMsIDB4MTEsIDB4MTgsIDB4Q0MsIDB4ODQsIDB4QTEsIDB4REIsCisJIDB4MEUsIDB4MDIsIDB4QTUsIDB4RDMsIDB4QTEsIDB4REIsIDB4MTcsIDB4NjAsIDB4QTcsIDB4RjMsIDB4MTcsIDB4NjAsIDB4QTYsIDB4RjEsIDB4QTIsIDB4REIsCisJIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDMsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4RjEsIDB4RjMsCisJIDB4MzEsIDB4NDAsIDB4MDEsIDB4MkEsIDB4M0QsIDB4MDAsIDB4NjAsIDB4NDMsIDB4MDQsIDB4QjAsIDB4MDIsIDB4QjAsIDB4MDgsIDB4MjQsIDB4MTYsIDB4MDIsCisJIDB4MTAsIDB4QjAsIDB4MjksIDB4NDQsIDB4MzQsIDB4MDIsIDB4MDAsIDB4QTgsIDB4Q0MsIDB4ODEsIDB4MEQsIDB4MDMsIDB4NDEsIDB4NDksIDB4MkYsIDB4MDIsCisJIDB4NjMsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDgsIDB4MDAsIDB4RjcsIDB4QjMsIDB4MUIsIDB4NjAsIDB4RjYsIDB4RjEsIDB4QUQsIDB4NEYsIDB4RkQsIDB4QjQsCisJIDB4QTAsIDB4NUQsIDB4NDQsIDB4NDksIDB4MjQsIDB4MDAsIDB4NjMsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MTAsIDB4MDAsIDB4MUIsIDB4NjAsIDB4RjcsIDB4RjMsCisJIDB4MUIsIDB4NjAsIDB4RjUsIDB4RkIsIDB4NDAsIDB4NDksIDB4MUIsIDB4NjAsIDB4RjgsIDB4RjMsIDB4MUIsIDB4NjAsIDB4RjYsIDB4RkIsIDB4MEMsIDB4QkIsCisJIDB4RkQsIDB4QjMsIDB4QUQsIDB4NEYsIDB4MDIsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUQsIDB4MTEsIDB4MDAsIDB4MUIsIDB4NjAsIDB4RjksIDB4RjMsCisJIDB4MzcsIDB4NjAsIDB4RUEsIDB4N0MsIDB4MEMsIDB4MTgsIDB4QTQsIDB4REIsIDB4NDAsIDB4NDksIDB4MUIsIDB4NjAsIDB4RkEsIDB4RjMsIDB4MUIsIDB4NjAsCisJIDB4RjYsIDB4RkIsIDB4MDgsIDB4QkIsIDB4RkIsIDB4QjMsIDB4QUQsIDB4NEYsIDB4MDIsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUQsIDB4RjEsIDB4RkQsCisJIDB4MDAsIDB4NjAsIDB4QTQsIDB4RjMsIDB4NjIsIDB4NDMsIDB4MTcsIDB4MTgsIDB4NTgsIDB4RDMsIDB4NjIsIDB4NDEsIDB4MDMsIDB4MTgsIDB4Q0MsIDB4ODQsCisJIDB4QTEsIDB4REIsIDB4MTEsIDB4MDAsIDB4NDksIDB4RDMsIDB4QTMsIDB4REIsIDB4MDYsIDB4QTEsIDB4QTEsIDB4RDMsIDB4NTksIDB4RDEsIDB4NjAsIDB4NDUsCisJIDB4QTUsIDB4RDMsIDB4NTksIDB4RDEsIDB4QjAsIDB4ODQsIDB4QTUsIDB4REIsIDB4NjQsIDB4NDQsIDB4MDYsIDB4MzYsIDB4Q0QsIDB4RkUsIDB4MDcsIDB4MzYsCisJIDB4RDYsIDB4RkUsIDB4RTYsIDB4MDEsIDB4MjMsIDB4NDYsIDB4QjgsIDB4NjAsIDB4MDMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDYsIDB4NDMsIDB4MjYsIDB4NjAsCisJIDB4M0UsIDB4NjEsIDB4QTEsIDB4RDMsIDB4NTksIDB4RDEsIDB4MDYsIDB4MUIsIDB4NTksIDB4RDMsIDB4NTksIDB4RDEsIDB4MDMsIDB4MUIsIDB4NTksIDB4RDMsCisJIDB4NTksIDB4RDEsIDB4RjAsIDB4MTgsIDB4MDAsIDB4NjMsIDB4NDksIDB4REQsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MzYsIDB4MTEsIDB4MDAsIDB4MDMsIDB4MzYsCisJIDB4MzIsIDB4MDAsIDB4MDEsIDB4MzYsIDB4MDgsIDB4MDAsIDB4MDUsIDB4M0EsIDB4RUEsIDB4MDEsIDB4QTQsIDB4RDMsIDB4NUEsIDB4RDMsIDB4OUMsIDB4ODUsCisJIDB4QTQsIDB4ODQsIDB4QTIsIDB4REIsIDB4RTQsIDB4MDEsIDB4MDEsIDB4NjAsIDB4NDgsIDB4NjEsIDB4MDAsIDB4NjQsIDB4QTEsIDB4REIsIDB4REYsIDB4MDEsCisJIDB4M0EsIDB4NjAsIDB4M0UsIDB4NjQsIDB4NDAsIDB4NDUsIDB4MjIsIDB4MDAsIDB4MDEsIDB4NjAsIDB4NDgsIDB4NjYsIDB4QTYsIDB4RDMsIDB4MDQsIDB4QTEsCisJIDB4NjAsIDB4NDMsIDB4QTEsIDB4RDMsIDB4QzksIDB4ODEsIDB4NjAsIDB4NDUsIDB4MDAsIDB4QkIsIDB4QTEsIDB4REIsIDB4QkUsIDB4RDMsIDB4MDksIDB4MDMsCisJIDB4RDQsIDB4ODQsIDB4OUMsIDB4ODQsIDB4REMsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MEUsIDB4QTMsIDB4RDEsIDB4NjMsIDB4NDYsIDB4NjQsIDB4NDMsCisJIDB4RjIsIDB4MDEsIDB4OUMsIDB4ODQsIDB4REMsIDB4ODUsIDB4NDksIDB4REQsIDB4NjEsIDB4NDQsIDB4MDAsIDB4QkIsIDB4QTYsIDB4REIsIDB4MDIsIDB4MDMsCisJIDB4NjUsIDB4NDQsIDB4QkUsIDB4REIsIDB4QkMsIDB4MDEsIDB4M0EsIDB4NjAsIDB4MTksIDB4NjQsIDB4NDAsIDB4NDUsIDB4MDEsIDB4NjAsIDB4NDgsIDB4NjYsCisJIDB4QTYsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4MEYsIDB4MTgsIDB4MDIsIDB4MDMsIDB4NjAsIDB4NDYsIDB4RjksIDB4MDEsIDB4NTgsIDB4RDMsCisJIDB4QTQsIDB4RDMsIDB4NjAsIDB4NDUsIDB4MDAsIDB4NjMsIDB4QTQsIDB4REQsIDB4MDUsIDB4MTgsIDB4NTgsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QzQsIDB4ODMsCisJIDB4QTIsIDB4REQsIDB4Q0EsIDB4ODQsIDB4QTYsIDB4REIsIDB4MjUsIDB4NTgsIDB4NjQsIDB4NDEsIDB4MDAsIDB4NjAsIDB4NDYsIDB4NzQsIDB4Q0QsIDB4RTIsCisJIDB4MDQsIDB4RTEsIDB4MDIsIDB4NjAsIDB4MDAsIDB4RTEsIDB4M0YsIDB4NDQsIDB4NDAsIDB4MjYsIDB4MDUsIDB4MDAsIDB4MUMsIDB4NjAsIDB4MEYsIDB4RjMsCisJIDB4NUEsIDB4RDEsIDB4QTAsIDB4NTAsIDB4QTQsIDB4NTAsIDB4M0YsIDB4NDAsIDB4MDIsIDB4MkIsIDB4MDMsIDB4MDAsIDB4M0EsIDB4NjAsIDB4QjcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjksIDB4RkUsIDB4MDEsIDB4QzQsIDB4RTIsIDB4NDMsIDB4NjQsIDB4M0EsIDB4REIsIDB4QTEsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDEsIDB4M0YsIDB4NDQsIDB4RkYsIDB4MDEsIDB4M0YsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MDUsIDB4MDAsIDB4MUMsIDB4NjAsIDB4MEQsIDB4RjMsCisJIDB4NUEsIDB4RDEsIDB4QTAsIDB4NTAsIDB4QTQsIDB4NTIsIDB4QzQsIDB4RTIsIDB4MzIsIDB4N0IsIDB4NEQsIDB4RTIsIDB4QkYsIDB4RkUsIDB4QzQsIDB4RTIsCisJIDB4NDEsIDB4RkYsIDB4RTAsIDB4RkUsIDB4RTEsIDB4RkUsIDB4RTIsIDB4RkUsIDB4NDMsIDB4RkYsIDB4NDQsIDB4RkYsIDB4NDYsIDB4RkYsIDB4QTIsIDB4RjMsCisJIDB4NjIsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDUsIDB4MzYsIDB4MkQsIDB4RkYsIDB4MDcsIDB4MzYsIDB4RDUsIDB4RkUsIDB4MDgsIDB4RTEsIDB4ODgsIDB4NjAsCisJIDB4ODUsIDB4NzEsIDB4OEQsIDB4RTIsIDB4QTIsIDB4NjAsIDB4NDEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjIsIDB4M0QsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4M0IsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDEsIDB4QTksIDB4OUMsIDB4NjAsIDB4NDUsIDB4M0QsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RjEsIDB4MDksIDB4NjAsIDB4QjQsIDB4NjEsIDB4NjQsIDB4NDQsIDB4MDEsIDB4MjcsIDB4MjQsIDB4MDAsCisJIDB4NjAsIDB4NDAsIDB4MEUsIDB4M0EsIDB4MEQsIDB4MDAsIDB4MDEsIDB4N0MsIDB4MTQsIDB4NjAsIDB4NkYsIDB4RjksIDB4NDQsIDB4NjAsIDB4MDgsIDB4N0MsCisJIDB4MTQsIDB4NjAsIDB4NDEsIDB4RjksIDB4MTYsIDB4NjAsIDB4NjIsIDB4RjEsIDB4MDIsIDB4NjAsIDB4QjAsIDB4NjEsIDB4QjEsIDB4OUMsIDB4MjYsIDB4MDAsCisJIDB4MDAsIDB4N0MsIDB4MTQsIDB4NjAsIDB4NkYsIDB4RjksIDB4NDAsIDB4NjAsIDB4MDgsIDB4N0MsIDB4MTQsIDB4NjAsIDB4NDEsIDB4RjksIDB4MTYsIDB4NjAsCisJIDB4NjIsIDB4RjEsIDB4MDIsIDB4NjAsIDB4OTAsIDB4NjEsIDB4QjEsIDB4OUMsIDB4MDksIDB4NjAsIDB4NjcsIDB4NjUsIDB4RkYsIDB4QjQsIDB4QzQsIDB4ODUsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODEsIDB4MTIsIDB4MDAsIDB4RkYsIDB4QjQsIDB4RUQsIDB4QTAsIDB4MkMsIDB4NjAsIDB4QzYsIDB4NjEsCisJIDB4MDQsIDB4MDQsIDB4RTIsIDB4QTAsIDB4RDksIDB4ODEsIDB4MDEsIDB4MDQsIDB4RDksIDB4ODEsIDB4QTEsIDB4RDEsIDB4MDIsIDB4NjAsIDB4NTAsIDB4NjEsCisJIDB4MjYsIDB4NjAsIDB4RjAsIDB4NjUsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4QjEsIDB4OUMsIDB4QzgsIDB4ODEsIDB4NjEsIDB4NDcsIDB4MDAsIDB4N0UsCisJIDB4RTksIDB4ODEsIDB4MDcsIDB4NjAsIDB4RjAsIDB4NjUsIDB4QTUsIDB4ODEsIDB4MEIsIDB4QjksIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODUsCisJIDB4QjUsIDB4ODUsIDB4MDQsIDB4NjAsIDB4NDQsIDB4NjIsIDB4M0QsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RjMsCisJIDB4QzgsIDB4NjEsIDB4NjEsIDB4NTQsIDB4Q0QsIDB4RTIsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MkUsIDB4MDAsIDB4Q0MsIDB4ODQsIDB4RTAsIDB4ODUsCisJIDB4MTUsIDB4NjAsIDB4QTIsIDB4RTcsIDB4MjYsIDB4NjAsIDB4ODAsIDB4NjQsIDB4M0QsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MDQsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjYsIDB4NjAsIDB4OUMsIDB4NjQsIDB4M0QsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NjAsIDB4QjgsIDB4NjQsCisJIDB4M0QsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NjAsIDB4RDQsIDB4NjQsIDB4M0QsIDB4NjAsIDB4NTgsIDB4NEYsCisJIDB4MDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NzUsIDB4NjQsIDB4MDYsIDB4NjEsIDB4NjEsIDB4NDgsIDB4NjAsIDB4NDQsIDB4ODAsIDB4QkMsIDB4RkYsIDB4QjQsCisJIDB4NjAsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MjgsIDB4NjAsIDB4RTYsIDB4N0MsIDB4MDcsIDB4NjAsIDB4RTgsIDB4RjksCisJIDB4MjgsIDB4NjAsIDB4NkUsIDB4NjMsIDB4MTQsIDB4NjEsIDB4MjEsIDB4MDAsIDB4MTQsIDB4NjAsIDB4REYsIDB4RjEsIDB4RkYsIDB4QjQsIDB4RUQsIDB4QTAsCisJIDB4NjQsIDB4NDEsIDB4MDQsIDB4MDQsIDB4RTIsIDB4QTAsIDB4RDksIDB4ODEsIDB4MDEsIDB4MDQsIDB4RDksIDB4ODEsIDB4QTEsIDB4RDEsIDB4MTQsIDB4NjAsCisJIDB4MEUsIDB4RjMsIDB4NjQsIDB4NDEsIDB4RkYsIDB4QjEsIDB4RkYsIDB4NjAsIDB4MDAsIDB4NjUsIDB4QTQsIDB4ODQsIDB4MzQsIDB4OTQsIDB4QTIsIDB4REIsCisJIDB4NUEsIDB4RDMsIDB4NjQsIDB4NDEsIDB4QTUsIDB4ODEsIDB4RkYsIDB4QjQsIDB4MzQsIDB4OTQsIDB4QTIsIDB4REIsIDB4MjksIDB4NjAsIDB4NTIsIDB4N0MsCisJIDB4MDcsIDB4NjAsIDB4RTgsIDB4RjksIDB4MjcsIDB4NjAsIDB4RkMsIDB4NjMsIDB4MTMsIDB4NjEsIDB4M0QsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MjMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDcsIDB4NjAsIDB4RTgsIDB4RjMsIDB4MzEsIDB4NDAsIDB4ODAsIDB4MjYsIDB4MzYsIDB4QTQsIDB4MDcsIDB4NjAsIDB4RTgsIDB4RkIsCisJIDB4NjAsIDB4NDMsIDB4MDksIDB4NjEsIDB4M0QsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RjMsIDB4MjksIDB4NjAsCisJIDB4QkUsIDB4NjEsIDB4MDAsIDB4N0MsIDB4N0UsIDB4NjMsIDB4NTksIDB4RDksIDB4RkUsIDB4MUYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MDMsIDB4MDAsCisJIDB4MkEsIDB4NjAsIDB4NDAsIDB4NjUsIDB4MTUsIDB4MDAsIDB4RkYsIDB4QjQsIDB4RjksIDB4QTAsIDB4MkEsIDB4NjAsIDB4NjIsIDB4NjUsIDB4MDEsIDB4N0MsCisJIDB4MEQsIDB4MDQsIDB4RUQsIDB4QTAsIDB4MkEsIDB4NjAsIDB4ODQsIDB4NjUsIDB4MTEsIDB4N0MsIDB4MDgsIDB4MDQsIDB4RTIsIDB4QTAsIDB4MkEsIDB4NjAsCisJIDB4QTYsIDB4NjUsIDB4MjEsIDB4N0MsIDB4MDMsIDB4MDQsIDB4MkEsIDB4NjAsIDB4QzgsIDB4NjUsIDB4MzEsIDB4N0MsIDB4NjQsIDB4NUYsIDB4N0QsIDB4RkIsCisJIDB4QTUsIDB4RDMsIDB4REEsIDB4ODUsIDB4RjAsIDB4QTAsIDB4MjksIDB4NjAsIDB4QkUsIDB4NjEsIDB4MDgsIDB4MDYsIDB4NDAsIDB4NTQsIDB4NTgsIDB4NTMsCisJIDB4MDgsIDB4RkYsIDB4MzcsIDB4NjAsIDB4N0EsIDB4NjQsIDB4NDMsIDB4RkIsIDB4MDgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjAsIDB4NDMsIDB4NjAsIDB4NDYsCisJIDB4QTUsIDB4RDEsIDB4REEsIDB4ODUsIDB4QTUsIDB4RDMsIDB4REEsIDB4ODUsIDB4NTksIDB4RDksIDB4NTksIDB4REIsIDB4NTksIDB4RDksIDB4NTksIDB4REIsCisJIDB4RkIsIDB4MUYsIDB4MEMsIDB4NjMsIDB4QTUsIDB4RDEsIDB4REEsIDB4ODUsIDB4QTUsIDB4RDMsIDB4REEsIDB4ODUsIDB4NTksIDB4RDksIDB4NTksIDB4REIsCisJIDB4NTksIDB4RDksIDB4NTksIDB4REIsIDB4RjcsIDB4MUYsIDB4NjYsIDB4NDQsIDB4MEUsIDB4NjMsIDB4NTMsIDB4OTMsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MzYsCisJIDB4MDcsIDB4MDAsIDB4NjUsIDB4NDQsIDB4NDgsIDB4RDMsIDB4NTksIDB4RDksIDB4NTksIDB4REIsIDB4NTksIDB4RDksIDB4NTksIDB4REIsIDB4RkIsIDB4MUYsCisJIDB4MTYsIDB4NjAsIDB4MzksIDB4RjEsIDB4N0QsIDB4RjMsIDB4NjQsIDB4NDMsIDB4REIsIDB4ODEsIDB4MkMsIDB4NjAsIDB4NTQsIDB4NjUsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MzcsIDB4MTIsIDB4MDAsIDB4MTEsIDB4MzcsIDB4MTcsIDB4MDAsIDB4MjEsIDB4MzcsIDB4MUQsIDB4MDAsIDB4MzEsIDB4MzcsIDB4MjIsIDB4MDAsCisJIDB4QTMsIDB4RDEsIDB4MTYsIDB4NjAsIDB4MzQsIDB4RjUsIDB4NjQsIDB4NDQsIDB4RkYsIDB4QjQsIDB4MTYsIDB4NjAsIDB4MzMsIDB4RkIsIDB4NjQsIDB4NDcsCisJIDB4RkYsIDB4QjQsIDB4MTYsIDB4NjAsIDB4MkEsIDB4RjEsIDB4MUQsIDB4MDAsIDB4QTEsIDB4RDMsIDB4MTYsIDB4NjAsIDB4MzUsIDB4RjUsIDB4RkYsIDB4QjQsCisJIDB4MTYsIDB4NjAsIDB4MkIsIDB4RjEsIDB4MTYsIDB4MDAsIDB4QTEsIDB4RDMsIDB4MTYsIDB4NjAsIDB4MzYsIDB4RjUsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjQsCisJIDB4MTYsIDB4NjAsIDB4MkMsIDB4RjEsIDB4MEUsIDB4MDAsIDB4NTksIDB4RDMsIDB4MTYsIDB4NjAsIDB4MzcsIDB4RjUsIDB4RkYsIDB4QjQsIDB4MTYsIDB4NjAsCisJIDB4MkQsIDB4RjEsIDB4MDcsIDB4MDAsIDB4NTksIDB4RDMsIDB4MTYsIDB4NjAsIDB4MzgsIDB4RjUsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjQsIDB4MTYsIDB4NjAsCisJIDB4MkUsIDB4RjEsIDB4MTYsIDB4NjAsIDB4MzIsIDB4RkIsIDB4MTYsIDB4NjAsIDB4MkYsIDB4RjksIDB4NjYsIDB4NDIsIDB4RkMsIDB4QTIsIDB4QTIsIDB4RDMsCisJIDB4MkIsIDB4NjAsIDB4NDIsIDB4NjMsIDB4Q0MsIDB4ODQsIDB4RTgsIDB4ODQsIDB4Q0MsIDB4ODEsIDB4NjMsIDB4NDUsIDB4QTYsIDB4RDMsIDB4REEsIDB4ODIsCisJIDB4RkYsIDB4QjQsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4NjAsIDB4NDAsIDB4ODAsIDB4MkIsIDB4MDMsIDB4MDAsIDB4REEsIDB4ODYsIDB4Q0QsIDB4ODEsCisJIDB4RjUsIDB4MDEsIDB4MDAsIDB4QjksIDB4QTYsIDB4RDMsIDB4MEIsIDB4MDMsIDB4NUEsIDB4RDEsIDB4REEsIDB4ODYsIDB4RkYsIDB4QjQsIDB4RTAsIDB4ODQsCisJIDB4QzQsIDB4ODQsIDB4NUMsIDB4OTAsIDB4QkQsIDB4RDksIDB4RkQsIDB4MDIsIDB4Q0QsIDB4ODEsIDB4NjYsIDB4NDIsIDB4RjIsIDB4MDIsIDB4NUEsIDB4RDMsCisJIDB4MkIsIDB4NjAsIDB4ODAsIDB4NjUsIDB4RDcsIDB4ODAsIDB4QkQsIDB4REIsIDB4RkQsIDB4MDIsIDB4N0QsIDB4RjMsIDB4MTksIDB4NjAsIDB4N0IsIDB4RjEsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MDksIDB4MDAsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MjYsIDB4MDYsIDB4MDAsIDB4MTMsIDB4NjQsIDB4Q0IsIDB4RkIsCisJIDB4MDEsIDB4NjAsIDB4NjcsIDB4NjQsIDB4MzcsIDB4RkIsIDB4MDksIDB4MDAsIDB4MDgsIDB4NjQsIDB4Q0IsIDB4RkIsIDB4QTEsIDB4RjMsIDB4MDEsIDB4NjAsCisJIDB4NjcsIDB4N0MsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NUIsIDB4N0MsIDB4MzcsIDB4RjksIDB4MTksIDB4NjAsIDB4NEQsIDB4RjEsIDB4N0QsIDB4RjMsCisJIDB4NjQsIDB4NDAsIDB4MDAsIDB4M0EsIDB4MUIsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MEQsIDB4MDAsIDB4MzIsIDB4NjAsIDB4QUIsIDB4NjMsCisJIDB4NEMsIDB4OTQsIDB4MEUsIDB4QTUsIDB4NjAsIDB4RkUsIDB4QTAsIDB4RDEsIDB4QTUsIDB4RDMsIDB4MTksIDB4NjAsIDB4NzIsIDB4RjksIDB4MTksIDB4NjAsCisJIDB4NzMsIDB4RkIsIDB4MjAsIDB4RkUsIDB4MEIsIDB4MDAsIDB4RkYsIDB4QjQsIDB4RjgsIDB4QTQsIDB4MzIsIDB4NjAsIDB4QzgsIDB4NjMsIDB4NEMsIDB4OTQsCisJIDB4NjAsIDB4RkUsIDB4QTAsIDB4RDEsIDB4RkYsIDB4RkYsIDB4MTksIDB4NjAsIDB4NzMsIDB4RjksIDB4MjAsIDB4RkUsIDB4MTksIDB4NjAsIDB4NzUsIDB4RjMsCisJIDB4MTYsIDB4NjAsIDB4RDgsIDB4RjEsIDB4NjAsIDB4NDMsIDB4RDMsIDB4ODAsIDB4MTksIDB4NjAsIDB4NzYsIDB4RjMsIDB4MDEsIDB4MDcsIDB4NjMsIDB4NUMsCisJIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDcsIDB4NjAsIDB4NUMsIDB4MTksIDB4NjAsIDB4NEYsIDB4RjksIDB4MTksIDB4NjAsIDB4NTMsIDB4RjksCisJIDB4N0QsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MEEsIDB4MDAsIDB4RkYsIDB4QjUsIDB4MTAsIDB4NjAsIDB4RjQsIDB4NjMsCisJIDB4NjUsIDB4NDEsIDB4Q0QsIDB4ODEsIDB4MDYsIDB4QTMsIDB4RkQsIDB4MDIsIDB4RkEsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MEYsIDB4MDAsIDB4MDEsIDB4NjAsCisJIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsIDB4MTEsIDB4NjAsIDB4NjAsIDB4NjEsIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4MDgsIDB4QTEsCisJIDB4RkIsIDB4MDIsIDB4RkMsIDB4QTEsIDB4QTEsIDB4RDMsIDB4MTksIDB4NjAsIDB4NEYsIDB4RjEsIDB4RkYsIDB4QjQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4MDcsIDB4MTksIDB4NjAsIDB4NEYsIDB4RkIsIDB4MTksIDB4NjAsIDB4NTMsIDB4RkIsIDB4MTksIDB4NjAsIDB4NEYsIDB4RjMsIDB4MTksIDB4NjAsCisJIDB4NzIsIDB4RjEsIDB4MTksIDB4NjAsIDB4NzQsIDB4RkIsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDQsIDB4MTksIDB4NjAsIDB4NzQsIDB4RjksCisJIDB4MkMsIDB4NjAsIDB4NzQsIDB4NjMsIDB4MkIsIDB4NjAsIDB4MDIsIDB4NjUsIDB4MTYsIDB4NjAsIDB4MzMsIDB4RjEsIDB4MkEsIDB4NjAsIDB4RUEsIDB4NjEsCisJIDB4MkMsIDB4NjAsIDB4NjIsIDB4NjQsIDB4NDAsIDB4NEYsIDB4MDQsIDB4NjQsIDB4QzMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MUEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTksIDB4NjAsIDB4NEYsIDB4RjMsIDB4MTksIDB4NjAsIDB4NzMsIDB4RjEsIDB4MTksIDB4NjAsIDB4NzQsIDB4RkIsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4MDQsIDB4MTksIDB4NjAsIDB4NzQsIDB4RjksIDB4MkMsIDB4NjAsIDB4N0MsIDB4NjMsIDB4MTYsIDB4NjAsIDB4MzIsIDB4RjEsIDB4MkIsIDB4NjAsCisJIDB4NDIsIDB4NjUsIDB4MkMsIDB4NjAsIDB4NjAsIDB4NjQsIDB4NDAsIDB4NEYsIDB4MDgsIDB4NjQsIDB4QzMsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MUEsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4N0QsIDB4RjMsIDB4MDgsIDB4N0MsIDB4MzgsIDB4RjksIDB4MkIsIDB4NjAsIDB4REEsIDB4NjEsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkIsCisJIDB4MEUsIDB4MDAsIDB4MDEsIDB4MzcsIDB4MDYsIDB4MDAsIDB4MTEsIDB4MzcsIDB4MDMsIDB4MDAsIDB4MjEsIDB4M0IsIDB4MUUsIDB4QTEsIDB4MUUsIDB4QTEsCisJIDB4MUUsIDB4QTEsIDB4MUMsIDB4NjMsIDB4MkIsIDB4NjAsIDB4QkMsIDB4NjQsIDB4NTksIDB4RDEsIDB4NTgsIDB4RDksIDB4RkQsIDB4MUYsIDB4MTYsIDB4NjAsCisJIDB4MkYsIDB4RjMsIDB4MDAsIDB4N0MsIDB4NjAsIDB4NDUsIDB4NzAsIDB4NjIsIDB4M0QsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4MjksIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjIsIDB4M0QsIDB4NjAsIDB4NTgsIDB4NEQsIDB4M0IsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4NjEsIDB4QjEsIDB4OUMsIDB4NjAsIDB4NDUsIDB4M0QsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0EsIDB4NjAsCisJIDB4OTUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDQsIDB4RDMsIDB4ODAsIDB4N0MsIDB4NjAsIDB4NDgsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4QjAsIDB4OEEsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RDUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4NjIsIDB4NDcsCisJIDB4ODAsIDB4QkYsIDB4NjAsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjQsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsCisJIDB4RkUsIDB4MDEsIDB4NjUsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4OTUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4MkQsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0MsIDB4QkQsIDB4RDMsIDB4RDUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4NjAsIDB4NDcsIDB4ODAsIDB4QkYsIDB4NjAsIDB4NEEsCisJIDB4QkQsIDB4RDMsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4OTAsIDB4OEEsIDB4QkQsIDB4RDMsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4OTAsIDB4OEEsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4Q0QsIDB4ODEsIDB4OTUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4RUIsIDB4MDIsIDB4MkQsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4RDUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4NjIsIDB4NEEsIDB4MDIsIDB4NjQsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4Q0MsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4RkQsIDB4MDIsIDB4N0MsIDB4NDksIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjgsIDB4NUMsIDB4N0MsIDB4NDksCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjgsIDB4NDQsIDB4OTUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4NDAsIDB4RkYsIDB4MjAsIDB4NDQsIDB4QkYsIDB4QjQsIDB4NDAsIDB4NDAsIDB4MDMsIDB4MDAsIDB4MjAsIDB4NDQsIDB4NDAsIDB4QkMsIDB4NDAsIDB4NDAsCisJIDB4NDMsIDB4NDUsIDB4MjAsIDB4NDQsIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4MDIsIDB4MDAsIDB4NDMsIDB4NDUsIDB4RjYsIDB4MDEsIDB4MDAsIDB4NjQsCisJIDB4MTksIDB4NjAsIDB4RjIsIDB4RkIsIDB4M0YsIDB4NDQsIDB4NDAsIDB4MjYsIDB4MDUsIDB4MDAsIDB4MUMsIDB4NjAsIDB4MEYsIDB4RjMsIDB4NUEsIDB4RDEsCisJIDB4QTAsIDB4NTAsIDB4QTQsIDB4NTAsIDB4QUUsIDB4NEYsIDB4RkQsIDB4QjQsIDB4MDQsIDB4QkMsIDB4QTAsIDB4NUUsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NzEsCisJIDB4OEQsIDB4RTIsIDB4NDAsIDB4RTEsIDB4NDAsIDB4MjksIDB4RkUsIDB4MDEsIDB4MDQsIDB4QUMsIDB4QTAsIDB4NUUsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsCisJIDB4MTAsIDB4NjIsIDB4MTksIDB4NjAsIDB4OEUsIDB4N0MsIDB4MDAsIDB4NjAsIDB4QUMsIDB4NjUsIDB4M0QsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MEYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjIsIDB4M0QsIDB4NjAsIDB4NTgsIDB4NEQsIDB4M0IsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4MTksIDB4NjAsIDB4OEUsIDB4NjQsIDB4NjQsIDB4NDAsIDB4RDAsIDB4ODAsIDB4MTQsIDB4NzEsIDB4MDUsIDB4MDMsIDB4OEQsIDB4RTIsCisJIDB4NDAsIDB4RTEsIDB4NDAsIDB4MjksIDB4RkUsIDB4MDEsIDB4RTIsIDB4MDEsIDB4M0YsIDB4NDQsIDB4NDAsIDB4MjYsIDB4MDUsIDB4MDAsIDB4MUMsIDB4NjAsCisJIDB4MEQsIDB4RjMsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NTAsIDB4QTQsIDB4NTIsIDB4MjcsIDB4NjAsIDB4MzYsIDB4NjMsIDB4MUUsIDB4NjEsIDB4M0QsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4MjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MTQsIDB4NzEsIDB4OEQsIDB4RTIsIDB4NDAsIDB4RTEsIDB4NDAsIDB4MjksCisJIDB4RkUsIDB4MDEsIDB4MzEsIDB4NDQsIDB4NDAsIDB4MjYsIDB4MDIsIDB4MDAsIDB4ODAsIDB4MjYsIDB4MTcsIDB4MDAsIDB4MjgsIDB4NjAsIDB4RTYsIDB4NjMsCisJIDB4MDcsIDB4NjAsIDB4RTgsIDB4RkQsIDB4MDksIDB4NjEsIDB4M0QsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzEsIDB4NDQsCisJIDB4NDAsIDB4MkEsIDB4MTQsIDB4MDAsIDB4MzEsIDB4NDQsIDB4N0YsIDB4QjQsIDB4NDAsIDB4NTEsIDB4QUUsIDB4NEMsIDB4MTAsIDB4MjYsIDB4MEUsIDB4MDAsCisJIDB4MDcsIDB4NjAsIDB4RTksIDB4RkIsIDB4MzEsIDB4NDQsIDB4ODAsIDB4QkMsIDB4NDAsIDB4NTEsIDB4MjksIDB4NjAsIDB4MUMsIDB4NjMsIDB4MDcsIDB4NjAsCisJIDB4RTgsIDB4RkQsIDB4MDksIDB4NjEsIDB4M0QsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NjAsIDB4RUEsIDB4NjMsCisJIDB4MDMsIDB4NjEsIDB4M0QsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjIsIDB4MTksIDB4NjAsCisJIDB4OEYsIDB4N0MsIDB4MDAsIDB4NjAsIDB4QUMsIDB4NjUsIDB4M0QsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODAsIDB4RTEsCisJIDB4QkYsIDB4RkUsIDB4QTEsIDB4NEYsIDB4NzAsIDB4QjQsIDB4NTAsIDB4MzYsIDB4MEMsIDB4MDAsIDB4MjAsIDB4MzYsIDB4MDMsIDB4MDAsIDB4M0EsIDB4NjAsCisJIDB4NzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjAsIDB4MUEsIDB4RTEsIDB4REYsIDB4RkUsIDB4MTksIDB4RkYsIDB4MDAsIDB4RTEsIDB4QTEsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4MjAsIDB4NDQsIDB4NDAsIDB4MkEsIDB4ODUsIDB4MDAsIDB4N0QsIDB4RjEsIDB4M0IsIDB4MDAsIDB4ODMsIDB4MDAsIDB4MTksIDB4NjAsCisJIDB4RjIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTgsIDB4NTksIDB4MDEsIDB4NDMsIDB4NDUsIDB4MjAsIDB4NDQsIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDAsCisJIDB4MUMsIDB4NjAsIDB4MEYsIDB4RjMsIDB4M0YsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MDEsIDB4MDAsIDB4QTAsIDB4NTAsIDB4QUUsIDB4NEYsIDB4RkQsIDB4QjQsCisJIDB4QTAsIDB4NUUsIDB4QUMsIDB4NEYsIDB4MTAsIDB4QkMsIDB4QTAsIDB4NUMsIDB4RkYsIDB4RkYsIDB4MTAsIDB4QUMsIDB4QTAsIDB4NUMsIDB4MDAsIDB4NjAsCisJIDB4QzgsIDB4NzEsIDB4OEQsIDB4RTIsIDB4NDAsIDB4RTEsIDB4NDAsIDB4MjksIDB4RkUsIDB4MDEsIDB4N0QsIDB4RjEsIDB4MzAsIDB4NjEsIDB4NjQsIDB4NDQsCisJIDB4MDEsIDB4MkIsIDB4MjAsIDB4QTEsIDB4MzAsIDB4NjQsIDB4NjEsIDB4NUYsIDB4NjAsIDB4NDUsIDB4MEMsIDB4NjAsIDB4MDAsIDB4NjIsIDB4MDAsIDB4NjAsCisJIDB4NzEsIDB4N0MsIDB4M0QsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4QzgsIDB4NzEsIDB4OEQsIDB4RTIsCisJIDB4NDAsIDB4RTEsIDB4NDAsIDB4MjksIDB4RkUsIDB4MDEsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4N0QsIDB4RjEsIDB4MjAsIDB4NDQsIDB4NDAsIDB4QkMsCisJIDB4NDAsIDB4NDAsIDB4MTksIDB4NjAsIDB4RjIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MTgsIDB4M0QsIDB4NjAsIDB4NTcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MUIsIDB4NjAsIDB4RjMsIDB4RjEsIDB4QUQsIDB4NEYsIDB4MDAsIDB4N0YsIDB4RkEsIDB4QjQsIDB4NjQsIDB4NDEsIDB4N0QsIDB4RjEsIDB4MDIsIDB4QjEsCisJIDB4MDQsIDB4NjUsIDB4MDIsIDB4MDIsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MDEsIDB4NjUsIDB4QjQsIDB4ODQsIDB4QTAsIDB4NUQsIDB4MjAsIDB4NDQsCisJIDB4NDAsIDB4MkEsIDB4NDMsIDB4NDUsIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4QTEsIDB4RjksIDB4MDUsIDB4NjQsIDB4QTIsIDB4RkIsIDB4REYsIDB4RkUsCisJIDB4MTksIDB4RkYsIDB4REQsIDB4RkUsIDB4MjYsIDB4MDAsIDB4MjAsIDB4NDQsIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4NDMsIDB4NDUsIDB4QTQsIDB4RDEsCisJIDB4REEsIDB4ODMsIDB4QzMsIDB4ODUsIDB4ODAsIDB4RTEsIDB4REYsIDB4RkUsIDB4QkQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDgsIDB4NjAsIDB4NDcsCisJIDB4ODAsIDB4QkMsIDB4MDAsIDB4N0YsIDB4NjAsIDB4NEEsIDB4RDcsIDB4ODAsIDB4QTEsIDB4RkYsIDB4RjYsIDB4MDIsIDB4QkYsIDB4RkUsIDB4MTEsIDB4MDAsCisJIDB4NDMsIDB4NDUsIDB4QTQsIDB4RDEsIDB4REEsIDB4ODMsIDB4MEQsIDB4MTgsIDB4NjQsIDB4NDQsIDB4MDAsIDB4NjEsIDB4RkEsIDB4QTQsIDB4REQsIDB4ODEsCisJIDB4RkQsIDB4MDIsIDB4M0QsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RkUsIDB4MDIsIDB4MDAsIDB4RjEsIDB4RkUsCisJIDB4MDEsIDB4MDAsIDB4MjUsIDB4NDMsIDB4MjEsIDB4RTEsIDB4MDAsIDB4NjQsIDB4QkYsIDB4REIsIDB4MjAsIDB4NDQsIDB4MjAsIDB4MkEsIDB4MDcsIDB4MDAsCisJIDB4MDcsIDB4QjQsIDB4MDQsIDB4MzYsIDB4QzMsIDB4RkUsIDB4MDYsIDB4MzYsIDB4Q0MsIDB4RkUsIDB4MDcsIDB4MzYsIDB4RDUsIDB4RkUsIDB4MjAsIDB4NDQsCisJIDB4OTgsIDB4QjQsIDB4NDAsIDB4NDAsIDB4MjYsIDB4NjAsIDB4MjYsIDB4NjMsIDB4QkQsIDB4RDMsIDB4MDMsIDB4NjEsIDB4MEYsIDB4MUIsIDB4MDQsIDB4QTMsCisJIDB4QkQsIDB4RDMsIDB4MDQsIDB4NjEsIDB4MEIsIDB4MUIsIDB4MDQsIDB4QTMsIDB4QkQsIDB4RDMsIDB4MDYsIDB4NjEsIDB4MDcsIDB4MUIsIDB4MDQsIDB4QTMsCisJIDB4QkQsIDB4RDMsIDB4MDcsIDB4NjEsIDB4MDMsIDB4MUIsIDB4QzMsIDB4NjAsIDB4NDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4RDEsIDB4NDAsIDB4NDQsCisJIDB4MjAsIDB4NDQsIDB4MDcsIDB4QjUsIDB4RDQsIDB4ODUsIDB4MzUsIDB4ODAsIDB4MjQsIDB4NDUsIDB4MjYsIDB4NjAsIDB4NjYsIDB4NjQsIDB4NDQsIDB4RDcsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NDMsIDB4NDUsIDB4MjAsIDB4NDQsIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4NjQsIDB4NDMsIDB4QkQsIDB4RDMsCisJIDB4QkQsIDB4RDEsIDB4NDAsIDB4NDQsIDB4MTAsIDB4MjcsIDB4MTksIDB4MDAsIDB4M0YsIDB4NDAsIDB4MDIsIDB4MkIsIDB4MDYsIDB4MDAsIDB4MjQsIDB4NDcsCisJIDB4MDgsIDB4MkIsIDB4MTMsIDB4MDAsIDB4MDcsIDB4QjQsIDB4MDEsIDB4MzYsIDB4MTEsIDB4MDAsIDB4RkYsIDB4NjAsIDB4N0YsIDB4NjUsIDB4MTUsIDB4NjAsCisJIDB4QTIsIDB4NjQsIDB4MjQsIDB4NDAsIDB4MDgsIDB4MkIsIDB4QTQsIDB4ODQsIDB4QTAsIDB4NTcsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDksIDB4RkYsIDB4RkYsCisJIDB4NjgsIDB4NDQsIDB4MDEsIDB4MTYsIDB4RkQsIDB4MDEsIDB4MDAsIDB4N0YsIDB4QTMsIDB4REIsIDB4QUIsIDB4MDEsIDB4NjQsIDB4NDIsIDB4M0QsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4M0IsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QkQsIDB4RDksIDB4QTMsIDB4REIsIDB4QTMsIDB4MDEsIDB4NDMsIDB4NDUsIDB4MjAsIDB4NDQsCisJIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4NjQsIDB4NDMsIDB4QkQsIDB4RDMsIDB4QTMsIDB4RDEsIDB4NDAsIDB4NDQsIDB4MTAsIDB4MkIsIDB4MTYsIDB4MDAsCisJIDB4QkUsIDB4RDEsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4ODAsIDB4RTcsIDB4MjQsIDB4NDAsIDB4MDcsIDB4MjcsIDB4MDQsIDB4MDAsIDB4QUMsIDB4NEYsCisJIDB4MTAsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUMsIDB4NjQsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MjQsIDB4NDAsCisJIDB4MjAsIDB4MjcsIDB4MUQsIDB4MDAsIDB4QUMsIDB4NEYsIDB4RUYsIDB4QjQsIDB4QTAsIDB4NUMsIDB4MTksIDB4MDAsIDB4M0YsIDB4NDAsIDB4MDIsIDB4MkIsCisJIDB4MDYsIDB4MDAsIDB4MjQsIDB4NDcsIDB4MDgsIDB4MkIsIDB4MTMsIDB4MDAsIDB4MDcsIDB4QjQsIDB4MDEsIDB4MzYsIDB4MTEsIDB4MDAsIDB4MTUsIDB4NjAsCisJIDB4MjIsIDB4NjQsIDB4MjQsIDB4NDAsIDB4MDgsIDB4MjcsIDB4ODAsIDB4QkMsIDB4N0MsIDB4NDgsIDB4QkUsIDB4RDMsIDB4QTAsIDB4NTcsIDB4NjAsIDB4NDgsCisJIDB4NjQsIDB4NDQsIDB4ODAsIDB4QkMsIDB4RkYsIDB4QjQsIDB4NjAsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjksIDB4MDEsCisJIDB4MDEsIDB4NjEsIDB4M0QsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjMsIDB4MDEsIDB4MzAsIDB4NDQsIDB4MDIsIDB4QTgsCisJIDB4MDAsIDB4RTEsIDB4MDcsIDB4MDIsIDB4NjIsIDB4RkYsIDB4NjMsIDB4RkYsIDB4NjQsIDB4RkYsIDB4NjUsIDB4RkYsIDB4NjYsIDB4RkYsIDB4QkYsIDB4RkUsCisJIDB4QTEsIDB4RkYsIDB4ODIsIDB4RkYsIDB4ODgsIDB4RkYsIDB4NkMsIDB4NDAsIDB4NDEsIDB4RkYsIDB4QzQsIDB4RTIsIDB4NDMsIDB4RkYsIDB4NUMsIDB4NDksCisJIDB4MDgsIDB4RTEsIDB4QTIsIDB4NjAsIDB4NDEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzAsIDB4NDQsIDB4MDIsIDB4QTgsIDB4MDAsIDB4RTEsIDB4MDIsIDB4MDIsCisJIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODIsIDB4RkYsIDB4ODgsIDB4RkYsIDB4QTgsIDB4RTIsIDB4Q0IsIDB4RjEsIDB4MDAsIDB4NkIsIDB4ODksIDB4RkYsCisJIDB4NjQsIDB4NTQsIDB4ODgsIDB4RkYsIDB4OUYsIDB4RkUsIDB4MDIsIDB4MDUsIDB4NjQsIDB4NDQsIDB4NjAsIDB4NTQsIDB4Q0QsIDB4RTIsIDB4QzIsIDB4NjQsCisJIDB4M0EsIDB4REIsIDB4QkMsIDB4RkYsIDB4QjUsIDB4RkYsIDB4MUQsIDB4RkYsIDB4MjYsIDB4NDQsIDB4MDIsIDB4QjQsIDB4NDAsIDB4NDYsIDB4M0MsIDB4NDQsCisJIDB4MDAsIDB4QkMsIDB4RkYsIDB4RkYsIDB4MDYsIDB4MDMsIDB4MjcsIDB4NDAsIDB4MjYsIDB4MjIsIDB4MDMsIDB4MDAsIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsCisJIDB4QzAsIDB4RkUsIDB4MjcsIDB4NDQsIDB4MjAsIDB4MkEsIDB4MDQsIDB4MDAsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4QjAsIDB4NjAsIDB4MDAsIDB4RUEsCisJIDB4NUMsIDB4NDQsIDB4MjcsIDB4NDQsIDB4MTgsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MDAsIDB4RTEsIDB4MjksIDB4NDAsIDB4NTAsIDB4MkIsIDB4MzcsIDB4MDAsCisJIDB4RUYsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjksIDB4NDQsIDB4MjQsIDB4ODksIDB4MzEsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MEIsIDB4MDAsIDB4MjEsIDB4NDYsCisJIDB4QTcsIDB4RjQsIDB4MUQsIDB4RjIsIDB4RkYsIDB4QjMsIDB4MDAsIDB4N0MsIDB4MDUsIDB4MDMsIDB4MDYsIDB4NjEsIDB4NUQsIDB4OTEsIDB4MDksIDB4NjAsCisJIDB4MDIsIDB4NjUsIDB4MDIsIDB4MDMsIDB4MDAsIDB4NjEsIDB4MTUsIDB4MDAsIDB4RDQsIDB4ODAsIDB4NjMsIDB4NDUsIDB4RkIsIDB4MDcsIDB4NjUsIDB4NDMsCisJIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjIsIDB4RjYsIDB4ODIsIDB4NTMsIDB4OTAsIDB4RTMsIDB4ODMsIDB4RkMsIDB4MDQsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsCisJIDB4RUEsIDB4ODIsIDB4NUMsIDB4OTQsIDB4QjIsIDB4OUMsIDB4RjMsIDB4MDcsIDB4NjQsIDB4NDEsIDB4REQsIDB4ODEsIDB4RTEsIDB4ODEsIDB4RTEsIDB4ODEsCisJIDB4RTEsIDB4ODEsIDB4MkIsIDB4NDQsIDB4NTQsIDB4OTAsIDB4NzAsIDB4NDUsIDB4MDIsIDB4MjgsIDB4NjEsIDB4NDQsIDB4QzQsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4MjQsIDB4MDAsIDB4QjQsIDB4NjAsIDB4NTAsIDB4MDgsIDB4MjgsIDB4MDEsIDB4MDAsIDB4MjAsIDB4MjksIDB4NkQsIDB4RTIsIDB4QTQsIDB4RTIsCisJIDB4QzQsIDB4RTIsIDB4NDcsIDB4RkYsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4MzIsIDB4RjEsIDB4MDgsIDB4MjksIDB4MDksIDB4MDAsCisJIDB4NjQsIDB4NDAsIDB4MDcsIDB4MjIsIDB4MDYsIDB4MDAsIDB4NDMsIDB4RkYsIDB4MjcsIDB4NDQsIDB4MTAsIDB4QkMsIDB4NDAsIDB4NDcsIDB4MDAsIDB4NjQsCisJIDB4MzIsIDB4RkIsIDB4MzEsIDB4NDEsIDB4M0MsIDB4NDQsIDB4MDEsIDB4QjEsIDB4MDAsIDB4QkMsIDB4MEEsIDB4MDIsIDB4MDksIDB4MDMsIDB4MzIsIDB4RjMsCisJIDB4MDAsIDB4N0MsIDB4MDEsIDB4QjQsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDMsIDB4MzIsIDB4RjksIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsCisJIDB4QzgsIDB4NjAsIDB4MDksIDB4N0QsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NkIsIDB4MDAsIDB4NjQsIDB4MzMsIDB4RkIsIDB4MEMsIDB4NjAsIDB4MTYsIDB4NjQsCisJIDB4QTAsIDB4RDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4RTEsIDB4MzAsIDB4NDAsIDB4MDIsIDB4MzYsIDB4QTEsIDB4RkYsIDB4ODMsIDB4RkYsCisJIDB4OEQsIDB4RkYsIDB4NUMsIDB4NDQsIDB4NUMsIDB4NDMsIDB4NUMsIDB4NDIsIDB4NUMsIDB4NDEsIDB4NUMsIDB4NDAsIDB4QUMsIDB4RkYsIDB4QUQsIDB4RkYsCisJIDB4RTcsIDB4RTEsIDB4QjMsIDB4NjAsIDB4RkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzAsIDB4NDQsIDB4MDIsIDB4QTgsIDB4MDAsIDB4RTEsIDB4MDMsIDB4MDIsCisJIDB4MjgsIDB4RTIsIDB4NDAsIDB4RkYsIDB4QTEsIDB4RkYsIDB4ODQsIDB4RkYsIDB4QzIsIDB4NjAsIDB4NDUsIDB4NjQsIDB4NDAsIDB4NDIsIDB4QjcsIDB4NjAsCisJIDB4RjcsIDB4NjQsIDB4NDAsIDB4NDAsIDB4QkEsIDB4RjMsIDB4N0UsIDB4RkIsIDB4MEYsIDB4NjAsIDB4RTIsIDB4NjMsIDB4QzcsIDB4RjMsIDB4QkQsIDB4REIsCisJIDB4MDAsIDB4NjAsIDB4OUEsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDIsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDQsIDB4NjQsIDB4QTMsIDB4REIsIDB4NUMsIDB4NDksCisJIDB4MEEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4NUMsIDB4NUMsIDB4MDEsIDB4NjAsIDB4MzksIDB4RTIsIDB4MDQsIDB4NjAsIDB4MDAsIDB4N0EsIDB4ODksIDB4RkYsCisJIDB4MDMsIDB4NjAsIDB4RkYsIDB4NzMsIDB4ODgsIDB4RkYsIDB4QjcsIDB4NjAsIDB4RjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzAsIDB4NDQsIDB4MDIsIDB4QTgsCisJIDB4MDAsIDB4RTEsIDB4MDYsIDB4MDIsIDB4NDAsIDB4RkYsIDB4NDIsIDB4RkYsIDB4NDMsIDB4RkYsIDB4NDQsIDB4RkYsIDB4NDUsIDB4RkYsIDB4QTEsIDB4RkYsCisJIDB4ODgsIDB4RkYsIDB4ODUsIDB4RkYsIDB4MjEsIDB4RTEsIDB4NUMsIDB4NDAsIDB4QzMsIDB4NjAsIDB4NDgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTIsIDB4RkYsCisJIDB4MzAsIDB4NDQsIDB4MDIsIDB4QTgsIDB4MDAsIDB4RTEsIDB4MDEsIDB4MDIsIDB4QTEsIDB4RkYsIDB4ODYsIDB4RkYsIDB4ODgsIDB4RkYsIDB4NUMsIDB4NDYsCisJIDB4NUMsIDB4NDksIDB4NUMsIDB4NDAsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUQsIDB4NjAsIDB4NTgsIDB4NEYsCisJIDB4ODEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDMsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NTgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTcsIDB4NjAsIDB4NTgsIDB4NEYsCisJIDB4OTksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MTksIDB4NzgsIDB4RkYsIDB4RkYsIDB4RjQsIDB4NjAsIDB4NTgsIDB4NEYsCisJIDB4RTksIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTksIDB4NjAsIDB4NTgsIDB4NEYsIDB4Q0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NjAsIDB4NTgsIDB4NEYsCisJIDB4NzEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RUUsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NjksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4RTEsIDB4QTMsIDB4RkYsCisJIDB4Q0EsIDB4NjAsIDB4RDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDMsIDB4RTEsIDB4QTMsIDB4RkYsIDB4RkUsIDB4RkMsIDB4RkYsIDB4RkMsIDB4MjUsIDB4NjAsCisJIDB4OTYsIDB4NjMsIDB4MTcsIDB4RkQsIDB4QUUsIDB4RkYsIDB4MkEsIDB4NjAsIDB4MUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDIsIDB4NkYsIDB4NkYsIDB4NzQsCisJIDB4NjMsIDB4NkYsIDB4NjQsIDB4NjUsIDB4MjAsIDB4MjEsIDB4MjEsIDB4MjAsIDB4MjAsIDB4MDAsIDB4NTMsIDB4NTQsIDB4NDEsIDB4MkYsIDB4NDEsIDB4NTAsCisJIDB4MjAsIDB4NDYsIDB4NzUsIDB4NkUsIDB4NjMsIDB4MjcsIDB4NzMsIDB4MDAsIDB4MUYsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MjQsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDQsIDB4MDAsCisJIDB4MDYsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDcsIDB4MDAsCisJIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDEsIDB4MDAsIDB4QTYsIDB4RjMsIDB4MjEsIDB4NjEsIDB4MDAsIDB4N0MsIDB4MDEsIDB4MDAsIDB4MDAsIDB4RkEsCisJIDB4NjAsIDB4NDYsIDB4RkUsIDB4NjMsIDB4QTMsIDB4RDgsIDB4RkUsIDB4MUYsIDB4Q0QsIDB4ODEsIDB4RDgsIDB4ODQsIDB4RjgsIDB4MDIsIDB4MjEsIDB4NjEsCisJIDB4ODAsIDB4NjcsIDB4NDAsIDB4NEEsIDB4QTYsIDB4RjUsIDB4MDUsIDB4MTgsIDB4MkEsIDB4NDMsIDB4MDIsIDB4RkMsIDB4NUYsIDB4OEEsIDB4MDAsIDB4RjQsCisJIDB4RkEsIDB4MDEsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTgsIDB4RjEsIDB4QTcsIDB4RjMsIDB4N0MsIDB4NjMsIDB4QUEsIDB4RkIsIDB4NjAsIDB4NDYsCisJIDB4MDEsIDB4RkMsIDB4REMsIDB4ODQsIDB4RDAsIDB4ODAsIDB4MDAsIDB4RkEsIDB4RkEsIDB4MDQsIDB4QUIsIDB4RkIsIDB4NjAsIDB4NDYsIDB4MDAsIDB4NjQsCisJIDB4MDAsIDB4RkEsIDB4NjMsIDB4NDQsIDB4ODAsIDB4N0YsIDB4MDEsIDB4RkEsIDB4QTgsIDB4RjMsIDB4QTcsIDB4RjEsIDB4REMsIDB4ODQsIDB4RDAsIDB4ODQsCisJIDB4QTksIDB4RkIsIDB4MDMsIDB4NjAsIDB4MjYsIDB4NjEsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsCisJIDB4MkUsIDB4RkIsIDB4ODIsIDB4RkYsIDB4NDAsIDB4NDIsIDB4ODcsIDB4RkYsIDB4QTksIDB4RjMsIDB4QjEsIDB4RkIsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NTAsCisJIDB4NjMsIDB4RkYsIDB4NjAsIDB4RkYsIDB4NjYsIDB4RkYsIDB4NjUsIDB4RkYsIDB4NjQsIDB4RkYsIDB4NjEsIDB4RkYsIDB4NjIsIDB4RkYsIDB4NDksIDB4NjAsCisJIDB4MDIsIDB4RTEsIDB4NTIsIDB4NjAsIDB4MDIsIDB4RTEsIDB4NUMsIDB4NjAsIDB4MDIsIDB4RTEsIDB4NjUsIDB4NjAsIDB4MDIsIDB4RTEsIDB4NkIsIDB4NjAsCisJIDB4MDIsIDB4RTEsIDB4NzYsIDB4NjAsIDB4MDIsIDB4RTEsIDB4NDEsIDB4NjAsIDB4MDIsIDB4RTEsIDB4MEMsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MUMsIDB4RkIsCisJIDB4NDEsIDB4NjAsIDB4MDcsIDB4NjQsIDB4OUYsIDB4RkIsIDB4MkQsIDB4RkYsIDB4MDYsIDB4NjEsIDB4NDEsIDB4NEIsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjEsCisJIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RjAsIDB4NjcsIDB4MEUsIDB4RkEsIDB4MjYsIDB4NjAsIDB4MDQsIDB4NjQsCisJIDB4MTMsIDB4NjAsIDB4MTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4MkIsIDB4NDEsIDB4NEQsIDB4OEIsIDB4RkYsIDB4RkYsIDB4RUEsIDB4MDIsIDB4MDUsIDB4NjEsIDB4NDEsIDB4NEIsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjEsCisJIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NjAsIDB4RjgsIDB4NjQsIDB4MTMsIDB4NjAsIDB4MTAsIDB4RkIsCisJIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MkIsIDB4NDEsIDB4NEQsIDB4OEIsCisJIDB4RkYsIDB4RkYsIDB4RUMsIDB4MDIsIDB4NDAsIDB4NjAsIDB4NDUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4RUEsIDB4MDAsIDB4RUIsIDB4NTAsIDB4NjAsCisJIDB4MDMsIDB4RUEsIDB4NTEsIDB4NjAsIDB4MTMsIDB4RUEsIDB4NTIsIDB4NjAsIDB4MzAsIDB4RUEsIDB4NTMsIDB4NjAsIDB4NDAsIDB4RUEsIDB4NTQsIDB4NjAsCisJIDB4NTIsIDB4RUEsIDB4NTUsIDB4NjAsIDB4NkQsIDB4RUEsIDB4NTYsIDB4NjAsIDB4NzEsIDB4RUEsIDB4NTcsIDB4NjAsIDB4OEIsIDB4RUEsIDB4NTgsIDB4NjAsCisJIDB4NDcsIDB4RUEsIDB4NTksIDB4NjAsIDB4QTAsIDB4RUEsIDB4NUEsIDB4NjAsIDB4QjIsIDB4RUEsIDB4NUIsIDB4NjAsIDB4QzEsIDB4RUEsIDB4NUMsIDB4NjAsCisJIDB4RDcsIDB4RUEsIDB4NUQsIDB4NjAsIDB4RUIsIDB4RUEsIDB4NUUsIDB4NjAsIDB4QTAsIDB4RUEsIDB4NTAsIDB4NjAsIDB4MzYsIDB4RUIsIDB4NTEsIDB4NjAsCisJIDB4MzcsIDB4RUIsIDB4NTIsIDB4NjAsIDB4MjAsIDB4RUIsIDB4NTMsIDB4NjAsIDB4RTQsIDB4RUIsIDB4NTQsIDB4NjAsIDB4MzQsIDB4RUIsIDB4NTUsIDB4NjAsCisJIDB4NTgsIDB4RUIsIDB4NTYsIDB4NjAsIDB4NDgsIDB4RUIsIDB4NTcsIDB4NjAsIDB4RDAsIDB4RUIsIDB4NTgsIDB4NjAsIDB4QzMsIDB4RUIsIDB4NTksIDB4NjAsCisJIDB4RkMsIDB4RUIsIDB4NUEsIDB4NjAsIDB4MzQsIDB4RUIsIDB4NUIsIDB4NjAsIDB4NTgsIDB4RUIsIDB4NUMsIDB4NjAsIDB4QzAsIDB4RUIsIDB4NUQsIDB4NjAsCisJIDB4RDAsIDB4RUIsIDB4NUUsIDB4NjAsIDB4OTEsIDB4RUIsIDB4MDAsIDB4RUEsIDB4MDAsIDB4RUIsIDB4RTAsIDB4NjAsIDB4MDIsIDB4RUEsIDB4RTAsIDB4NjAsCisJIDB4MDMsIDB4RUIsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUIsIDB4QjAsIDB4NjAsIDB4MDAsIDB4RUIsIDB4QUIsIDB4NDgsIDB4NDAsIDB4M0IsIDB4MDEsIDB4MDAsCisJIDB4RkMsIDB4MDEsIDB4MDAsIDB4RUIsIDB4MDMsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QTAsIDB4REIsIDB4MEYsIDB4NjQsIDB4NjAsIDB4N0YsIDB4QTAsIDB4NUEsCisJIDB4ODAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUEsIDB4MjQsIDB4NDQsIDB4RkYsIDB4QjQsCisJIDB4MDQsIDB4RkIsIDB4NTAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDUsIDB4RkIsIDB4MTAsIDB4NjAsIDB4MTAsIDB4NzUsIDB4MkEsIDB4NjAsIDB4MUQsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4M0YsIDB4NDAsIDB4NDAsIDB4MjYsIDB4NDAsIDB4MDAsIDB4MDUsIDB4NjAsIDB4RjksIDB4RjEsIDB4NDIsIDB4NjAsIDB4MDgsIDB4NjQsCisJIDB4MDksIDB4NjAsIDB4MTksIDB4NjMsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MDQsIDB4MDAsIDB4NDIsIDB4NjAsIDB4MDksIDB4NjQsIDB4MEEsIDB4NjAsCisJIDB4MTksIDB4NjMsIDB4MUMsIDB4NjAsIDB4MEYsIDB4RkIsIDB4MDQsIDB4NjAsIDB4MDAsIDB4QkMsIDB4MUMsIDB4NjAsIDB4MEIsIDB4RkIsIDB4MUMsIDB4NjAsCisJIDB4MEEsIDB4RkQsIDB4MUQsIDB4NjAsIDB4MTksIDB4NjMsIDB4MUMsIDB4NjAsIDB4MEUsIDB4RkQsIDB4ODAsIDB4NjAsIDB4MUMsIDB4NjQsIDB4M0YsIDB4NDAsCisJIDB4MDEsIDB4MkEsIDB4MDIsIDB4MDAsIDB4NjAsIDB4NjAsIDB4MUMsIDB4NjQsIDB4MUMsIDB4NjAsIDB4MTAsIDB4RkIsIDB4MUMsIDB4NjAsIDB4MEMsIDB4RkIsCisJIDB4MUMsIDB4NjAsIDB4MEYsIDB4RjMsIDB4QTAsIDB4NTAsIDB4QTAsIDB4NTAsIDB4MEIsIDB4NjAsIDB4RjgsIDB4NjMsIDB4QTMsIDB4RDEsIDB4MzgsIDB4NjAsCisJIDB4MTIsIDB4NjEsIDB4QTEsIDB4RDMsIDB4RjgsIDB4QTMsIDB4OTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4QTMsIDB4RDEsIDB4NTksIDB4RDMsIDB4MDYsIDB4QTMsCisJIDB4OTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4QTMsIDB4RDEsIDB4NTksIDB4RDMsIDB4RkUsIDB4QTMsIDB4OTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4QTMsIDB4RDEsCisJIDB4NTksIDB4RDMsIDB4RkYsIDB4RkYsIDB4OTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4ODAsIDB4NjAsIDB4NTgsIDB4RUMsIDB4ODAsIDB4NjAsIDB4MDAsIDB4RUQsCisJIDB4ODAsIDB4NjAsIDB4ODAsIDB4RUUsIDB4NDAsIDB4RUMsIDB4MDAsIDB4RUQsIDB4MDAsIDB4RUUsIDB4QzAsIDB4NjAsIDB4NTksIDB4RUMsIDB4QzAsIDB4NjAsCisJIDB4MDcsIDB4RUQsIDB4QzAsIDB4NjAsIDB4OEYsIDB4RUUsIDB4QUQsIDB4NEYsIDB4RkEsIDB4QjQsIDB4QTAsIDB4NUQsIDB4MDAsIDB4RjMsIDB4MjgsIDB4RkIsCisJIDB4NDAsIDB4NDQsIDB4MzcsIDB4NjAsIDB4N0IsIDB4N0MsIDB4MjAsIDB4RjksIDB4M0YsIDB4NjAsIDB4MTgsIDB4N0MsIDB4MjEsIDB4RjksIDB4M0YsIDB4NjAsCisJIDB4MkUsIDB4N0MsIDB4MjIsIDB4RjksIDB4M0YsIDB4NjAsIDB4QzUsIDB4N0MsIDB4MjMsIDB4RjksIDB4M0YsIDB4NjAsIDB4RDYsIDB4N0MsIDB4MjQsIDB4RjksCisJIDB4NDAsIDB4NjAsIDB4MDAsIDB4N0MsIDB4MjUsIDB4RjksIDB4NDAsIDB4NjAsIDB4MTEsIDB4N0MsIDB4MjYsIDB4RjksIDB4RDAsIDB4NjAsIDB4MDAsIDB4RTgsCisJIDB4MjgsIDB4RTgsIDB4NDQsIDB4NjAsIDB4MDEsIDB4RTYsIDB4MTAsIDB4NjcsIDB4NDAsIDB4NTIsIDB4MTAsIDB4NjAsIDB4MDQsIDB4RTYsIDB4MDgsIDB4NjAsCisJIDB4MDYsIDB4NjMsIDB4RkQsIDB4NjAsIDB4MEMsIDB4NjUsIDB4NUIsIDB4RDMsIDB4QkYsIDB4RDEsIDB4MTAsIDB4MTgsIDB4QzMsIDB4ODMsIDB4RDQsIDB4ODAsCisJIDB4QzMsIDB4ODMsIDB4RjksIDB4MDIsIDB4RkEsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjUsIDB4RjksIDB4QTAsIDB4RkMsIDB4QTAsCisJIDB4MEQsIDB4MDUsIDB4MDQsIDB4MDUsIDB4NzgsIDB4NDMsIDB4MDIsIDB4NjEsIDB4MjksIDB4NjAsIDB4RUEsIDB4NzgsIDB4MjEsIDB4NjAsIDB4MDAsIDB4NjUsCisJIDB4M0YsIDB4NDMsIDB4MjEsIDB4NjAsIDB4MDAsIDB4NjUsIDB4QzAsIDB4NjAsIDB4OEYsIDB4RUUsIDB4MDgsIDB4MDAsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjUsCisJIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MTgsIDB4RkIsIDB4M0YsIDB4NDMsIDB4MTEsIDB4NjAsIDB4MTAsIDB4RTYsIDB4QjcsIDB4ODQsIDB4NDAsIDB4NUYsCisJIDB4MzcsIDB4NjAsIDB4RjgsIDB4NjMsIDB4M0YsIDB4NDAsIDB4MjAsIDB4MjcsIDB4MDYsIDB4MDAsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QkQsIDB4REIsCisJIDB4MEYsIDB4NjAsIDB4RjAsIDB4NjQsIDB4MDMsIDB4MDAsIDB4MEYsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDAsIDB4NjQsIDB4QTMsIDB4REIsIDB4MDAsIDB4NjAsCisJIDB4MzAsIDB4RTIsIDB4MDAsIDB4NjAsIDB4NTAsIDB4RTIsIDB4MDAsIDB4NjAsIDB4NzksIDB4RTIsIDB4MDAsIDB4NjAsIDB4OTAsIDB4RTIsIDB4MDEsIDB4NjAsCisJIDB4RDAsIDB4RTIsIDB4MDEsIDB4NjAsIDB4RjAsIDB4RTIsIDB4MDEsIDB4NjAsIDB4QjAsIDB4RTIsIDB4MTMsIDB4NjQsIDB4Q0IsIDB4RkIsIDB4MDEsIDB4NjAsCisJIDB4NjcsIDB4NjQsIDB4MzcsIDB4RkIsIDB4MDAsIDB4NjAsIDB4MjgsIDB4NjQsIDB4MzYsIDB4RkIsIDB4MDksIDB4NjAsIDB4MkEsIDB4NjQsIDB4QjYsIDB4RkIsCisJIDB4ODIsIDB4RkYsIDB4OTIsIDB4RkYsIDB4NUMsIDB4NDEsIDB4NUMsIDB4NDYsIDB4NUMsIDB4NDcsIDB4MDAsIDB4RTEsIDB4QTMsIDB4NjAsIDB4RjQsIDB4NjMsCisJIDB4MEMsIDB4NjAsIDB4MTYsIDB4NjQsIDB4QTAsIDB4REQsIDB4ODcsIDB4RkYsIDB4OTcsIDB4RkYsIDB4MEMsIDB4NjAsIDB4MDIsIDB4NjQsIDB4NDAsIDB4NUEsCisJIDB4MDYsIDB4QTQsIDB4NDAsIDB4NUIsIDB4NUMsIDB4NUUsIDB4MTYsIDB4NjAsIDB4Q0YsIDB4RjMsIDB4N0QsIDB4RkIsIDB4M0YsIDB4NDAsIDB4MDEsIDB4MjIsCisJIDB4MDMsIDB4MDAsIDB4ODAsIDB4NjAsIDB4MzcsIDB4N0MsIDB4MDIsIDB4MDAsIDB4ODAsIDB4NjAsIDB4MjcsIDB4N0MsIDB4MUEsIDB4NjAsIDB4MUYsIDB4RjksCisJIDB4MDEsIDB4NjAsIDB4MDYsIDB4NjQsIDB4QTcsIDB4RkIsIDB4MDIsIDB4NjAsIDB4N0YsIDB4NjQsIDB4MDAsIDB4NjAsIDB4NDIsIDB4NjUsIDB4RDQsIDB4ODQsCisJIDB4QTgsIDB4RkIsIDB4REMsIDB4ODQsIDB4QTYsIDB4RkIsIDB4MTIsIDB4NjAsIDB4RDgsIDB4RkIsIDB4NDAsIDB4NjAsIDB4NTgsIDB4NEUsIDB4N0QsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4M0YsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MDUsIDB4MDAsIDB4MUMsIDB4NjAsIDB4MEQsIDB4RjMsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NTAsCisJIDB4QTQsIDB4NTIsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NjMsIDB4RkEsIDB4NjAsIDB4MDAsIDB4NjUsIDB4QkQsIDB4RDMsIDB4QTMsIDB4RDMsIDB4MDIsIDB4QTgsCisJIDB4RDQsIDB4ODAsIDB4MjEsIDB4MDIsIDB4MjAsIDB4MDIsIDB4MTksIDB4NjAsIDB4NDgsIDB4RjEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4ODAsIDB4MjYsCisJIDB4MUEsIDB4MDAsIDB4MDQsIDB4QTMsIDB4RkQsIDB4NjAsIDB4MEQsIDB4NjUsIDB4NUIsIDB4RDMsIDB4QkYsIDB4RDEsIDB4MTQsIDB4MTgsIDB4QzMsIDB4ODMsCisJIDB4RDQsIDB4ODAsIDB4QzMsIDB4ODMsIDB4RjksIDB4MDIsIDB4QkYsIDB4RDMsIDB4QUQsIDB4NDksIDB4RkUsIDB4QTAsIDB4MDAsIDB4NjQsIDB4MEMsIDB4MDQsCisJIDB4MDgsIDB4QjEsIDB4MjAsIDB4QkMsIDB4MDgsIDB4MjgsIDB4MTgsIDB4QkMsIDB4MDcsIDB4N0MsIDB4MEUsIDB4NjAsIDB4REYsIDB4RjksIDB4MDUsIDB4N0MsCisJIDB4MEUsIDB4NjAsIDB4REUsIDB4RjksIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MEUsIDB4NjAsIDB4REQsIDB4RkIsIDB4NDAsIDB4NjAsIDB4OTUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NUMsIDB4NTEsIDB4M0YsIDB4NDEsIDB4QTUsIDB4NEMsIDB4NTAsIDB4MzcsIDB4MEIsIDB4MDAsIDB4MDEsIDB4QjksIDB4NDEsIDB4NUYsCisJIDB4QjUsIDB4NjAsIDB4NTUsIDB4RTAsIDB4MDUsIDB4NjAsIDB4RjksIDB4RjEsIDB4QzAsIDB4NjcsIDB4OTAsIDB4ODQsIDB4M0YsIDB4NDAsIDB4MDEsIDB4MjYsCisJIDB4QTAsIDB4NTAsIDB4MDYsIDB4NjAsIDB4MDgsIDB4RjMsIDB4MDEsIDB4NjAsIDB4MDEsIDB4NjUsIDB4MDEsIDB4NjAsIDB4MDIsIDB4N0MsIDB4RDQsIDB4ODAsCisJIDB4RDAsIDB4ODAsIDB4MDEsIDB4MDMsIDB4MTAsIDB4MDIsIDB4NUEsIDB4RDEsIDB4NUEsIDB4RDMsIDB4M0MsIDB4NjAsIDB4MDAsIDB4NjYsIDB4RTAsIDB4ODcsCisJIDB4NDAsIDB4NEEsIDB4ODAsIDB4NjAsIDB4OUUsIDB4NjEsIDB4NjQsIDB4NDQsIDB4QzgsIDB4ODQsIDB4MEMsIDB4NjMsIDB4QUEsIDB4NDYsIDB4NTgsIDB4RDAsCisJIDB4QUEsIDB4NDYsIDB4NTksIDB4RDgsIDB4RkIsIDB4MUYsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NjMsIDB4RkEsIDB4NjAsIDB4MDAsIDB4NjUsIDB4QkQsIDB4RDMsCisJIDB4QTMsIDB4RDMsIDB4MDIsIDB4QTgsIDB4RDQsIDB4ODAsIDB4MDcsIDB4MDIsIDB4MDYsIDB4MDIsIDB4OEMsIDB4NjAsIDB4QkEsIDB4NjEsIDB4M0MsIDB4NjAsCisJIDB4MDAsIDB4NjYsIDB4NDEsIDB4NEIsIDB4MDMsIDB4MDAsIDB4NDYsIDB4NjAsIDB4M0IsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkIsIDB4NDEsIDB4OEQsIDB4NjAsCisJIDB4MDIsIDB4N0MsIDB4RDEsIDB4ODAsIDB4QTEsIDB4RDIsIDB4MjUsIDB4MDUsIDB4NTksIDB4RDAsIDB4NjAsIDB4NDUsIDB4NTksIDB4RDIsIDB4NDQsIDB4NDcsCisJIDB4RTAsIDB4ODcsIDB4NDAsIDB4NEEsIDB4NTksIDB4RDIsIDB4NTksIDB4OEIsIDB4NDAsIDB4NEMsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NjMsIDB4QkUsIDB4RDMsCisJIDB4QkQsIDB4RDEsIDB4RUMsIDB4MTgsIDB4RDQsIDB4ODAsIDB4RUEsIDB4MTgsIDB4MDMsIDB4MDMsIDB4QzMsIDB4ODMsIDB4QzMsIDB4ODMsIDB4RjcsIDB4MDEsCisJIDB4NjcsIDB4NDQsIDB4QzAsIDB4ODQsIDB4RTAsIDB4ODUsIDB4MkMsIDB4NDQsIDB4RDQsIDB4ODAsIDB4NjMsIDB4NDEsIDB4MDEsIDB4MDYsIDB4NjUsIDB4NDQsCisJIDB4QzgsIDB4ODMsIDB4QUEsIDB4NDYsIDB4NTksIDB4RDEsIDB4MjcsIDB4RDgsIDB4NUEsIDB4ODcsIDB4RkMsIDB4MUYsIDB4QUEsIDB4NDYsIDB4MkIsIDB4NDEsCisJIDB4RDUsIDB4MDEsIDB4OEQsIDB4NjAsIDB4MDIsIDB4NjEsIDB4NDEsIDB4NEIsIDB4MkIsIDB4NDEsIDB4OEQsIDB4NjAsIDB4MDIsIDB4N0MsIDB4RDEsIDB4ODAsCisJIDB4QTEsIDB4RDIsIDB4MjcsIDB4MDUsIDB4NTksIDB4RDAsIDB4NjAsIDB4NDUsIDB4NTksIDB4RDIsIDB4NDQsIDB4NDcsIDB4RTAsIDB4ODcsIDB4NDAsIDB4NEEsCisJIDB4NTksIDB4RDIsIDB4NTksIDB4OEIsIDB4NDAsIDB4NEMsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NjMsIDB4QkUsIDB4RDMsIDB4QkQsIDB4RDEsIDB4RUMsIDB4MTgsCisJIDB4RDQsIDB4ODAsIDB4RUEsIDB4MTgsIDB4MDMsIDB4MDMsIDB4QzMsIDB4ODMsIDB4QzMsIDB4ODMsIDB4RjcsIDB4MDEsIDB4MDQsIDB4QTMsIDB4QTMsIDB4RDEsCisJIDB4NUEsIDB4ODgsIDB4MkMsIDB4NDMsIDB4RDMsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDYsIDB4NjQsIDB4NDMsIDB4Q0YsIDB4ODMsIDB4QUEsIDB4NDYsCisJIDB4NjAsIDB4RkUsIDB4MjgsIDB4RDEsIDB4NUUsIDB4ODgsIDB4MjcsIDB4RDgsIDB4NUEsIDB4ODcsIDB4RkIsIDB4MUYsIDB4MjAsIDB4RkUsIDB4QUEsIDB4NDYsCisJIDB4RDMsIDB4MDEsIDB4MDcsIDB4NjAsIDB4RUMsIDB4RjMsIDB4MjAsIDB4NjAsIDB4MDAsIDB4N0MsIDB4MDgsIDB4QjAsIDB4MTAsIDB4QjAsIDB4MDUsIDB4MDIsCisJIDB4MDQsIDB4MDMsIDB4MDcsIDB4NjAsIDB4RUIsIDB4RjksIDB4MDcsIDB4NjAsIDB4RUEsIDB4RjksIDB4MDIsIDB4QjAsIDB4MDQsIDB4QjAsIDB4MEYsIDB4MDIsCisJIDB4MTMsIDB4NjAsIDB4RDIsIDB4RjMsIDB4MEMsIDB4MDMsIDB4MDIsIDB4QkMsIDB4QTIsIDB4REIsIDB4MTQsIDB4NjAsIDB4NjUsIDB4RjMsIDB4MTQsIDB4NjAsCisJIDB4MjksIDB4RjMsIDB4MDIsIDB4QkQsIDB4MDIsIDB4QkMsIDB4QTIsIDB4REIsIDB4NjUsIDB4NDQsIDB4MTQsIDB4NjAsIDB4NjUsIDB4RkIsIDB4MDcsIDB4NjAsCisJIDB4RUMsIDB4RjMsIDB4MzEsIDB4NDEsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MkEsIDB4NDAsIDB4QjksIDB4NDAsIDB4MjYsIDB4MDMsIDB4MDAsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MjYsIDB4ODAsIDB4QjksIDB4NDEsIDB4NTEsIDB4RkEsIDB4NjAsIDB4M0EsIDB4NjUsIDB4NDYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NEUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDIsIDB4NDQsIDB4NjAsIDB4QUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NUIsIDB4RDMsIDB4RjgsIDB4NjAsIDB4M0YsIDB4NjUsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4MTQsIDB4NjAsIDB4NzQsIDB4RjMsIDB4RTAsIDB4OUMsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4QkQsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4MTQsIDB4NjAsIDB4NzcsIDB4RjMsIDB4RTAsIDB4OUMsIDB4QTQsIDB4ODQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MjgsIDB4NjAsCisJIDB4RjQsIDB4NjEsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QTEsIDB4RDMsCisJIDB4RTAsIDB4OUMsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTEsIDB4REIsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4NTksIDB4RDMsIDB4RTAsIDB4OUMsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTEsIDB4REIsIDB4MTQsIDB4NjAsIDB4N0QsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MTQsIDB4NjAsIDB4ODAsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MTQsIDB4NjAsIDB4ODMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4QTMsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4MTQsIDB4NjAsIDB4ODYsIDB4RjMsIDB4RTAsIDB4OUMsCisJIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4MTQsIDB4NjAsIDB4ODksIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MTQsIDB4NjAsIDB4OEMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MDIsIDB4QTMsIDB4QTMsIDB4RDMsCisJIDB4RjgsIDB4NjAsIDB4M0YsIDB4NjUsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4MTQsIDB4NjAsIDB4OEYsIDB4RjMsIDB4RTAsIDB4OUMsCisJIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4QkQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4MTQsIDB4NjAsIDB4OTIsIDB4RjMsCisJIDB4RTAsIDB4OUMsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MjksIDB4NjAsIDB4MkEsIDB4NjEsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4QTEsIDB4RDMsIDB4RTAsIDB4OUMsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTEsIDB4REIsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4NTksIDB4RDMsIDB4RTAsIDB4OUMsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTEsIDB4REIsCisJIDB4MTQsIDB4NjAsIDB4OTgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MTQsIDB4NjAsIDB4OUIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MTQsIDB4NjAsIDB4OUUsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4MTQsIDB4NjAsCisJIDB4QTEsIDB4RjMsIDB4RTAsIDB4OUMsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MTQsIDB4NjAsIDB4QTQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MTQsIDB4NjAsIDB4QTcsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4MDAsIDB4NjAsIDB4NkEsIDB4NjMsIDB4MjksIDB4NjAsIDB4NTAsIDB4NjEsIDB4MjgsIDB4NjAsIDB4RTQsIDB4NjQsIDB4NTgsIDB4RDEsIDB4NTksIDB4RDksCisJIDB4RkQsIDB4MUYsIDB4MTQsIDB4NjAsIDB4QjAsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTgsIDB4QUMsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4MTgsIDB4QUMsIDB4QTIsIDB4REIsIDB4MTQsIDB4NjAsIDB4QjQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTgsIDB4QUMsIDB4QTIsIDB4REIsIDB4MTQsIDB4NjAsCisJIDB4QjYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTgsIDB4QUMsIDB4QTIsIDB4REIsIDB4MTQsIDB4NjAsIDB4QkQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTgsIDB4QUMsCisJIDB4QTIsIDB4REIsIDB4MTQsIDB4NjAsIDB4QkYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTgsIDB4QUMsIDB4QTIsIDB4REIsIDB4MTQsIDB4NjAsIDB4Q0IsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MTgsIDB4QUMsIDB4QTIsIDB4REIsIDB4NUEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MTgsIDB4QUMsIDB4QTIsIDB4REIsIDB4MTQsIDB4NjAsCisJIDB4Q0YsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTgsIDB4QUMsIDB4QTIsIDB4REIsIDB4MTQsIDB4NjAsIDB4RDEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTgsIDB4QUMsCisJIDB4QTIsIDB4REIsIDB4MTQsIDB4NjAsIDB4RDgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTgsIDB4QUMsIDB4QTIsIDB4REIsIDB4MTQsIDB4NjAsIDB4REEsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MTgsIDB4QUMsIDB4QTIsIDB4REIsIDB4RkEsIDB4NjAsIDB4MkMsIDB4NjUsIDB4NDYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NEUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEUsIDB4MDMsIDB4NjMsIDB4NDUsIDB4MkEsIDB4NjAsIDB4RUEsIDB4NjMsIDB4MDYsIDB4NjEsIDB4QTUsIDB4RDEsIDB4REEsIDB4ODUsCisJIDB4NjQsIDB4NDQsIDB4MEYsIDB4QjQsIDB4QkQsIDB4REIsIDB4NjQsIDB4NDcsIDB4MEYsIDB4QjQsIDB4Q0QsIDB4ODEsIDB4QkQsIDB4REIsIDB4RjYsIDB4MDIsCisJIDB4RkEsIDB4NjAsIDB4MzAsIDB4NjUsIDB4NDYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTQsIDB4MDMsIDB4QkQsIDB4RDMsCisJIDB4NjMsIDB4NDYsIDB4MkIsIDB4NjAsIDB4ODIsIDB4NjMsIDB4MTUsIDB4NjAsIDB4RDAsIDB4RkIsIDB4REEsIDB4ODUsIDB4QkQsIDB4REIsIDB4MEUsIDB4NjEsCisJIDB4QTYsIDB4RDEsIDB4REEsIDB4ODYsIDB4NjQsIDB4NDQsIDB4RkYsIDB4QjQsIDB4QTUsIDB4REIsIDB4REEsIDB4ODUsIDB4NjQsIDB4NDcsIDB4RkYsIDB4QjQsCisJIDB4Q0QsIDB4ODEsIDB4QkQsIDB4REIsIDB4RjUsIDB4MDIsIDB4RkEsIDB4NjAsIDB4MzEsIDB4NjUsIDB4NDYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NEUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjIsIDB4MDMsIDB4QkQsIDB4RDMsIDB4MTUsIDB4NjAsIDB4RUUsIDB4RkIsIDB4NUEsIDB4ODEsIDB4MTUsIDB4NjAsIDB4RkQsIDB4RkIsCisJIDB4NUEsIDB4ODIsIDB4MTYsIDB4NjAsIDB4MEMsIDB4RkIsIDB4NUEsIDB4ODMsIDB4MTYsIDB4NjAsIDB4MUIsIDB4RkIsIDB4NUEsIDB4ODQsIDB4MEUsIDB4NjEsCisJIDB4QkQsIDB4RDEsIDB4QkQsIDB4RDUsIDB4NjQsIDB4NDQsIDB4RkYsIDB4QjQsIDB4MjEsIDB4REIsIDB4NUEsIDB4ODEsIDB4NjQsIDB4NDcsIDB4RkYsIDB4QjQsCisJIDB4MjIsIDB4REIsIDB4NUEsIDB4ODIsIDB4NjYsIDB4NDQsIDB4RkYsIDB4QjQsIDB4MjMsIDB4REIsIDB4NUEsIDB4ODMsIDB4NjYsIDB4NDcsIDB4RkYsIDB4QjQsCisJIDB4MjQsIDB4REIsIDB4Q0QsIDB4ODEsIDB4NUEsIDB4ODQsIDB4RUMsIDB4MDIsIDB4RkEsIDB4NjAsIDB4NDcsIDB4NjUsIDB4NDYsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4NEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTEsIDB4MDMsIDB4NjMsIDB4NDUsIDB4MkMsIDB4NjAsIDB4NTQsIDB4NjMsIDB4QTUsIDB4RDEsIDB4REEsIDB4ODUsCisJIDB4QkQsIDB4RDksIDB4MDIsIDB4NjEsIDB4QTUsIDB4RDEsIDB4REEsIDB4ODUsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0UsIDB4QkQsIDB4REIsIDB4NjQsIDB4NDQsCisJIDB4MDAsIDB4N0UsIDB4Q0QsIDB4ODEsIDB4QkQsIDB4REIsIDB4RjYsIDB4MDIsIDB4RkEsIDB4NjAsIDB4MkUsIDB4NjUsIDB4NDYsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4NEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4MDMsIDB4NjMsIDB4NDYsIDB4RkMsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MkIsIDB4NjAsIDB4MDIsIDB4NjMsCisJIDB4Q0MsIDB4ODQsIDB4RTgsIDB4ODQsIDB4Q0MsIDB4ODEsIDB4MDAsIDB4MzYsIDB4MEQsIDB4MDAsIDB4NjMsIDB4NDUsIDB4QTYsIDB4RDMsIDB4NUEsIDB4RDEsCisJIDB4REEsIDB4ODYsIDB4RkYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODQsIDB4NUMsIDB4OTAsIDB4QkQsIDB4RDksIDB4RkQsIDB4MDIsIDB4Q0QsIDB4ODEsCisJIDB4NjYsIDB4NDIsIDB4RjQsIDB4MDIsIDB4NjYsIDB4NDIsIDB4NUEsIDB4RDMsIDB4MkIsIDB4NjAsIDB4NDIsIDB4NjUsIDB4QkQsIDB4REIsIDB4RDcsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4RkMsIDB4MDIsIDB4MkMsIDB4NjAsIDB4NjgsIDB4NjEsIDB4RkEsIDB4NjAsIDB4NDYsIDB4NjUsIDB4NDYsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4NEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDMsIDB4QTEsIDB4REQsIDB4RDksIDB4ODEsIDB4RkEsIDB4NjAsIDB4MkYsIDB4NjUsIDB4NDYsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4NEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDMsIDB4QTEsIDB4REQsIDB4RDksIDB4ODEsIDB4RkEsIDB4NjAsIDB4M0UsIDB4NjUsCisJIDB4NDYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDMsIDB4QTEsIDB4REQsIDB4RDksIDB4ODEsIDB4RkEsIDB4NjAsCisJIDB4M0YsIDB4NjUsIDB4NDYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDMsIDB4QTEsIDB4REQsIDB4RDksIDB4ODEsCisJIDB4RkEsIDB4NjAsIDB4NDAsIDB4NjUsIDB4NDYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDMsIDB4QTEsIDB4REQsCisJIDB4RDksIDB4ODEsIDB4RkEsIDB4NjAsIDB4M0IsIDB4NjUsIDB4NDYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDMsCisJIDB4QTEsIDB4REQsIDB4RkEsIDB4NjAsIDB4NDgsIDB4NjUsIDB4NDYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4MDMsCisJIDB4QkQsIDB4RDMsIDB4MkMsIDB4NjAsIDB4QzQsIDB4NjEsIDB4MEUsIDB4QjQsIDB4QkQsIDB4RDEsIDB4QTEsIDB4REIsIDB4NjQsIDB4NDcsIDB4MEUsIDB4QjQsCisJIDB4QTMsIDB4RDEsIDB4NTksIDB4REIsIDB4NjQsIDB4NDQsIDB4MEUsIDB4QjQsIDB4NTksIDB4REIsIDB4NjQsIDB4NDcsIDB4MEUsIDB4QjQsIDB4NTksIDB4REIsCisJIDB4RkEsIDB4NjAsIDB4MjksIDB4NjUsIDB4NDYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4MDQsIDB4QTMsCisJIDB4QTMsIDB4RDMsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4QjQsIDB4ODQsIDB4MTMsIDB4NjAsIDB4QTYsIDB4RkIsIDB4RkEsIDB4NjAsIDB4MkEsIDB4NjUsCisJIDB4NDYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzAsIDB4MDMsIDB4MDQsIDB4QTMsIDB4QkQsIDB4RDEsIDB4MTQsIDB4NjAsCisJIDB4NEEsIDB4RjMsIDB4NjQsIDB4NDEsIDB4NjQsIDB4NUUsIDB4QTIsIDB4REIsIDB4NjQsIDB4NDcsIDB4NUEsIDB4RDMsIDB4NjAsIDB4NUMsIDB4NjQsIDB4NUYsCisJIDB4QTIsIDB4REIsIDB4MTQsIDB4NjAsIDB4NjAsIDB4RjMsIDB4RkYsIDB4NjAsIDB4QzAsIDB4QjUsIDB4NjEsIDB4NDAsIDB4ODAsIDB4MjcsIDB4MDUsIDB4MDAsCisJIDB4RTksIDB4ODcsIDB4M0YsIDB4QjQsIDB4QjQsIDB4ODQsIDB4QTIsIDB4REIsIDB4MTUsIDB4MDAsIDB4NjUsIDB4NDQsIDB4QTIsIDB4REIsIDB4RTEsIDB4ODAsCisJIDB4RjksIDB4ODcsIDB4MDEsIDB4N0YsIDB4MTQsIDB4NjAsIDB4NjMsIDB4RjMsIDB4NjAsIDB4NDEsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTksIDB4ODEsCisJIDB4RjgsIDB4ODQsIDB4RTksIDB4ODEsIDB4RjgsIDB4ODQsIDB4QTIsIDB4REIsIDB4NEEsIDB4RDMsIDB4RkYsIDB4NjAsIDB4ODAsIDB4NjUsIDB4QTQsIDB4ODQsCisJIDB4MzQsIDB4OTQsIDB4QTIsIDB4REIsIDB4REIsIDB4ODMsIDB4MTQsIDB4NjAsIDB4REYsIDB4RkQsIDB4RkEsIDB4NjAsIDB4MkIsIDB4NjUsIDB4NDYsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4NEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4MDQsIDB4QTMsIDB4QkQsIDB4RDMsIDB4MTQsIDB4NjAsIDB4NEQsIDB4RkIsCisJIDB4QTMsIDB4RDMsIDB4MTQsIDB4NjAsIDB4MTEsIDB4RkIsIDB4RkEsIDB4NjAsIDB4M0MsIDB4NjUsIDB4NDYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NEUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MUYsIDB4MDMsIDB4QTMsIDB4RDMsIDB4RkMsIDB4NjAsIDB4RkMsIDB4NjUsIDB4QTQsIDB4ODQsIDB4NjAsIDB4NUMsIDB4MDAsIDB4N0UsCisJIDB4QzAsIDB4NjAsIDB4MDAsIDB4QTAsIDB4NjAsIDB4NDMsIDB4MDcsIDB4MDQsIDB4MTQsIDB4NjAsIDB4NTEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDMsIDB4NjAsCisJIDB4RkYsIDB4QjQsIDB4M0MsIDB4OTQsIDB4QTIsIDB4REIsIDB4MjgsIDB4NjAsIDB4MkEsIDB4NjEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4QzAsIDB4QTAsCisJIDB4NjAsIDB4NDcsIDB4MDcsIDB4MDQsIDB4NjAsIDB4NDMsIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MDMsIDB4NjAsIDB4RkYsIDB4QjQsIDB4M0MsIDB4OTQsCisJIDB4QTEsIDB4REIsIDB4RkEsIDB4NjAsIDB4NDksIDB4NjUsIDB4NDYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUIsIDB4MDMsCisJIDB4MzIsIDB4NjAsIDB4QUIsIDB4NjEsIDB4MUMsIDB4N0MsIDB4NjAsIDB4RkUsIDB4QTMsIDB4RDMsIDB4NUQsIDB4RDMsIDB4MEYsIDB4QjUsIDB4RDQsIDB4ODQsCisJIDB4QTEsIDB4REIsIDB4QkQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4NUQsIDB4RDMsCisJIDB4MEYsIDB4QjUsIDB4RDQsIDB4ODQsIDB4QTEsIDB4REIsIDB4NjcsIDB4NDQsIDB4QzAsIDB4OUMsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MTAsIDB4MDAsCisJIDB4NjQsIDB4NDAsIDB4MEUsIDB4M0EsIDB4RTksIDB4MDEsIDB4MjAsIDB4RkUsIDB4RkEsIDB4NjAsIDB4NEEsIDB4NjUsIDB4NDYsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4NEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDUsIDB4MDMsIDB4MzIsIDB4NjAsIDB4QzcsIDB4NjEsIDB4MEUsIDB4N0MsIDB4NjAsIDB4RkUsIDB4REMsIDB4MDEsCisJIDB4MjAsIDB4RkUsIDB4QjgsIDB4RkUsIDB4QjksIDB4RkUsIDB4QkEsIDB4RkUsIDB4QkIsIDB4RkUsIDB4QkQsIDB4RkUsIDB4QkYsIDB4RkUsIDB4MTksIDB4NjAsCisJIDB4NDgsIDB4RjMsIDB4MTIsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MDQsIDB4MDAsIDB4MEIsIDB4NjAsIDB4RUEsIDB4NjIsIDB4NUEsIDB4REYsCisJIDB4RkUsIDB4MUYsIDB4NDEsIDB4NjAsIDB4NkIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MDYsIDB4NjMsIDB4QkUsIDB4RDMsIDB4QkQsIDB4RDEsCisJIDB4MDcsIDB4MTgsIDB4RDQsIDB4ODAsIDB4MDUsIDB4MTgsIDB4MDMsIDB4MDMsIDB4QzMsIDB4ODMsIDB4QzMsIDB4ODMsIDB4RjcsIDB4MDEsIDB4REIsIDB4ODMsCisJIDB4MDAsIDB4QkMsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4ODYsIDB4RkQsIDB4QUEsIDB4MkQsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MTAsIDB4RkQsCisJIDB4NkUsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MTQsIDB4RkQsIDB4OEUsIDB4MzIsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MDAsIDB4NDEsIDB4RkEsCisJIDB4NDAsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4NDIsIDB4RkEsIDB4NjIsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4NDMsIDB4RkEsCisJIDB4ODQsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4NDQsIDB4RkEsIDB4QTYsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4NDUsIDB4RkEsCisJIDB4QzgsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4MjUsIDB4RkQsIDB4OUUsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsCisKK307ICAvKiBmd19pbWFnZV8zX2RhdGEgKi8KKworc3RhdGljIGNvbnN0IGhjZl84IGZ3X2ltYWdlXzRfZGF0YVtdID0geworCSAweDZDLCAweDQwLCAweEExLCAweEZGLCAweDk4LCAweEZGLCAweDgwLCAweDNFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDQxLCAweEZGLCAweDMzLCAweEYzLCAweDAyLCAweDExLCAweDMxLCAweDE4LCAweDFFLCAweDAwLCAweDQ0LCAweEZGLCAweDJFLCAweDAwLCAweEZGLCAweEZGLAorCSAweEM0LCAweEUyLCAweDI3LCAweDQ0LCAweDIwLCAweDJBLCAweDAxLCAweDAwLCAweEZGLCAweEZGLCAweDQyLCAweDY0LCAweDNBLCAweERCLCAweDIzLCAweDAwLAorCSAweDQxLCAweEZGLCAweEEyLCAweDYwLCAweDQ1LCAweDc4LCAweEUyLCAweEZFLCAweDQwLCAweDQ5LCAweDAyLCAweDYwLCAweDAxLCAweEUxLCAweDFELCAweDAwLAorCSAweDQ0LCAweEZGLCAweDFCLCAweDA5LCAweDI5LCAweDQ0LCAweDEwLCAweDJBLCAweDA0LCAweDc0LCAweENELCAweEUyLCAweDEwLCAweDY1LCAweDBCLCAweDAwLAorCSAweEEzLCAweDYwLCAweEMxLCAweDc4LCAweEE0LCAweEUyLCAweDI5LCAweDQ0LCAweDIwLCAweDJBLCAweDBELCAweDAwLCAweDIwLCAweEFDLCAweEVDLCAweDAxLAorCSAweEEzLCAweDYwLCAweEMxLCAweDc4LCAweDQ2LCAweEZGLCAweEI0LCAweDg0LCAweDQwLCAweDQ5LCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDgwLCAweDNFLAorCSAweEEzLCAweDYwLCAweEMxLCAweDc4LCAweEZGLCAweEZGLCAweDYyLCAweEZGLCAweDA4LCAweEUxLCAweEExLCAweEZGLCAweDk4LCAweEZGLCAweDgwLCAweDNFLAorCSAweEFBLCAweDYwLCAweEE1LCAweDc4LCAweDRDLCAweDRFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEFBLCAweDYwLCAweEIzLCAweDc4LCAweDQ0LCAweEUyLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEM0LCAweEUyLCAweDg0LCAweEZGLCAweDIyLCAweDU4LCAweDgyLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEE0LCAweDYwLCAweDM5LCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweEUxLCAweDAxLCAweEZGLCAweEZGLAorCSAweDEwLCAweDI5LCAweEZBLCAweDAxLCAweEU0LCAweEUyLCAweEFBLCAweDYwLCAweDVGLCAweDc4LCAweEIyLCAweEYzLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEMxLCAweDYwLCAweEZDLCAweDc4LCAweDY0LCAweEUyLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEFBLCAweDYwLCAweDQ2LCAweDc4LCAweEFDLCAweEUyLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDgwLCAweDI5LCAweEUyLCAweDAxLCAweEFBLCAweDYwLCAweEEyLCAweDc4LCAweDQ3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEI1LCAweDYwLCAweDVDLCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEI1LCAweDYwLCAweDk0LCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEIzLCAweDYwLCAweEM5LCAweDc4LCAweDQyLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEIzLCAweDYwLCAweEZDLCAweDc4LCAweDQzLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEIzLCAweDYwLCAweEZDLCAweDc4LCAweDQ0LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEI3LCAweDYwLCAweDIwLCAweDc4LCAweDQ1LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEIzLCAweDYwLCAweEZGLCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDAwLCAweDYwLCAweDgzLCAweDY0LCAweDgwLCAweDI5LCAweDA5LCAweEZCLCAweEI1LCAweDYwLCAweDI1LCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDk4LCAweEZGLCAweDNBLCAweDYwLCAweDE4LCAweDc4LCAweDQwLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDM5LCAweDYwLCAweDhGLCAweDc4LCAweDk4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEMwLCAweDYwLCAweDY3LCAweDc4LCAweDk4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEJGLCAweDYwLCAweEUxLCAweDc4LCAweDk4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEI3LCAweDYwLCAweEU5LCAweDc4LCAweDk4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEExLCAweEZGLCAweDk4LCAweEZGLCAweDgzLCAweDNFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEMzLCAweDYwLCAweDRELCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAxLAorCSAweDQxLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAxLAorCSAweDQyLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAxLAorCSAweEIwLCAweEZGLCAweEIxLCAweEZGLCAweDQwLCAweEZGLCAweDQzLCAweEZGLCAweEMzLCAweDYwLCAweDQ4LCAweDc4LCAweDQ0LCAweEZGLCAweEZGLCAweDAxLAorCSAweEMzLCAweDYwLCAweDRELCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAxLAorCSAweDNFLCAweDYwLCAweDhDLCAweDc4LCAweDQ1LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAxLAorCSAweEMzLCAweDYwLCAweDQ4LCAweDc4LCAweDg0LCAweEUyLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAxLAorCSAweEMzLCAweDYwLCAweDQ3LCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAxLAorCSAweENBLCAweDYwLCAweEM4LCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEYzLCAweDYwLCAweDlBLCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDQyLCAweEZGLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDg1LCAweDNFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweENBLCAweDYwLCAweEQwLCAweDc4LCAweDI0LCAweEUyLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEYyLCAweDYwLCAweDQ3LCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweENBLCAweDYwLCAweEQwLCAweDc4LCAweDQ0LCAweEUyLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweENBLCAweDYwLCAweEQwLCAweDc4LCAweDg0LCAweEUyLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweENBLCAweDYwLCAweEQwLCAweDc4LCAweDQ3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDI5LCAweDYwLCAweEYyLCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDJBLCAweDYwLCAweDIwLCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDJBLCAweDYwLCAweDNFLCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDJBLCAweDYwLCAweDFELCAweDc4LCAweDI4LCAweEUyLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDJBLCAweDYwLCAweDFELCAweDc4LCAweDQ0LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDJBLCAweDYwLCAweDFELCAweDc4LCAweDQ1LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDJBLCAweDYwLCAweDFELCAweDc4LCAweDQ2LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDAwLCAweDYwLCAweDg3LCAweDY0LCAweDgwLCAweDI5LCAweDA5LCAweEZCLCAweDQ3LCAweEZGLCAweDJBLCAweDYwLCAweDFELCAweDc4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDQzLCAweEY3LCAweEE3LCAweEZGLCAweDQxLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDM3LCAweDYwLCAweDgyLCAweDc4LCAweDQyLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDM2LCAweDYwLCAweDhGLCAweDc4LCAweDQ3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDQxLCAweEZGLCAweDAwLCAweDYwLCAweDAzLCAweEUxLCAweDIxLCAweDQ2LCAweDY2LCAweDQ1LCAweDAwLCAweEY0LCAweDJFLCAweDQ0LCAweDA5LCAweEZBLAorCSAweDZBLCAweDYxLCAweDdGLCAweDYwLCAweEZFLCAweDYzLCAweEExLCAweEZGLCAweDlBLCAweEZGLCAweDA1LCAweDExLCAweDBBLCAweDAwLCAweDAwLCAweEY0LAorCSAweDAxLCAweEYyLCAweDE3LCAweDE4LCAweDdBLCAweDYxLCAweDAyLCAweDI1LCAweDA0LCAweDAwLCAweDZDLCAweDQ0LCAweDdBLCAweERBLCAweEZCLCAweDFDLAorCSAweEY2LCAweDExLCAweEQ5LCAweDgxLCAweDQxLCAweEZGLCAweDAyLCAweDFDLCAweDAwLCAweEY0LCAweERBLCAweDgyLCAweDQxLCAweEZGLCAweEM5LCAweDgxLAorCSAweENCLCAweDgzLCAweDZDLCAweDQ0LCAweDVBLCAweERBLCAweDAyLCAweDFDLCAweDAwLCAweEY0LCAweDgxLCAweEYyLCAweDZDLCAweDQ0LCAweDVBLCAweERBLAorCSAweENCLCAweDgzLCAweDAyLCAweDc0LCAweDAyLCAweDYwLCAweDA0LCAweEUxLCAweDgwLCAweDYwLCAweDAwLCAweDYxLCAweDVELCAweDkzLCAweEI1LCAweEZGLAorCSAweDk4LCAweEZGLCAweDI2LCAweDQ0LCAweEZELCAweEI0LCAweDg0LCAweEJDLCAweDQwLCAweDQ2LCAweDY1LCAweDQ2LCAweDAwLCAweDY0LCAweDIzLCAweEZBLAorCSAweDNGLCAweEZDLCAweDYzLCAweDQ3LCAweDBBLCAweDYzLCAweDBGLCAweEZDLCAweDAwLCAweEY0LCAweDA4LCAweEZBLCAweENCLCAweEZFLCAweDE4LCAweEUxLAorCSAweDQ0LCAweEZGLCAweEExLCAweEZGLCAweDk4LCAweEZGLCAweDgwLCAweDNFLCAweEUyLCAweEZFLCAweDAzLCAweDA0LCAweEEzLCAweDYwLCAweDA1LCAweDc4LAorCSAweEZGLCAweEZGLCAweEUwLCAweEZFLCAweDAzLCAweDA0LCAweEEzLCAweDYwLCAweDFCLCAweDc4LCAweEZGLCAweEZGLCAweEUxLCAweEZFLCAweDA3LCAweDA1LAorCSAweDlGLCAweEZFLCAweDAzLCAweDA0LCAweDNBLCAweDYwLCAweDc3LCAweDc4LCAweEZGLCAweEZGLCAweDQzLCAweEZGLCAweEE5LCAweDAxLCAweDk1LCAweEYzLAorCSAweEZGLCAweEZGLCAweDgwLCAweEI0LCAweEZGLCAweEZGLCAweDA4LCAweDI0LCAweDE2LCAweDAwLCAweDI5LCAweDQ0LCAweDA4LCAweDI2LCAweEUxLCAweDAxLAorCSAweDcyLCAweDQ0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEIyLCAweEYzLCAweEU4LCAweDg1LAorCSAweEZGLCAweEI3LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEI0LCAweDg1LCAweDczLCAweDQ0LCAweEQ0LCAweDg0LCAweDEwLCAweDY1LCAweEQ0LCAweDgwLAorCSAweEZGLCAweEZGLCAweDAxLCAweDA1LCAweDhGLCAweDAwLCAweDgwLCAweDYwLCAweDAxLCAweEUwLCAweEQ1LCAweDYwLCAweDg0LCAweEU3LCAweEExLCAweEYzLAorCSAweDdDLCAweDQ1LCAweDYwLCAweDQwLCAweDAxLCAweDIzLCAweDAyLCAweDY1LCAweDhDLCAweDYwLCAweDQ4LCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LAorCSAweEZFLCAweDAxLCAweDAwLCAweDYwLCAweDAwLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDAwLCAweDYwLCAweDdGLCAweDZBLAorCSAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDg0LCAweDYwLCAweDA0LCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLAorCSAweDQ4LCAweDYwLCAweDA4LCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDY1LCAweDRBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LAorCSAweEZFLCAweDAxLCAweDg0LCAweDYwLCAweDA0LCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDQwLCAweDYwLCAweDA4LCAweDZBLAorCSAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDY1LCAweDRBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDk1LCAweDYwLAorCSAweDg0LCAweEU3LCAweEJELCAweEZFLCAweDBDLCAweDYwLCAweDAwLCAweDYyLCAweDAwLCAweDYwLCAweDcxLCAweDdDLCAweDAwLCAweDYwLCAweEIxLCAweDY1LAorCSAweDNELCAweDYwLCAweDU4LCAweDRELCAweDBGLCAweDc4LCAweEZGLCAweEZGLCAweDA4LCAweEUxLCAweDYyLCAweEZGLCAweEEzLCAweEZGLCAweEZGLCAweEZGLAorCSAweEEyLCAweEZGLCAweDAyLCAweDYwLCAweDA4LCAweEUxLCAweEFFLCAweDRGLCAweDAyLCAweEJDLCAweDAwLCAweDdGLCAweEEwLCAweDVFLCAweDNGLCAweDQwLAorCSAweDQwLCAweDI2LCAweDA5LCAweDAwLCAweDFDLCAweDYwLCAweDA5LCAweEYzLCAweDVBLCAweEQxLCAweEEwLCAweDUwLCAweEE0LCAweDUyLCAweDVBLCAweEQzLAorCSAweDVBLCAweEQxLCAweEEwLCAweDUwLCAweEE0LCAweDUwLCAweERCLCAweEYzLCAweEYxLCAweEYxLCAweDAxLCAweEE4LCAweDA3LCAweEE4LCAweDBBLCAweDAzLAorCSAweDA5LCAweDAzLCAweDY0LCAweDQwLCAweDAxLCAweDI2LCAweDA5LCAweDAwLCAweDFCLCAweDYwLCAweEYzLCAweEYzLCAweEZGLCAweEZGLCAweDAxLCAweEI0LAorCSAweEZGLCAweEZGLCAweDAzLCAweDAyLCAweEFELCAweDRGLCAweEZBLCAweEI0LCAweEEwLCAweDVELCAweDE5LCAweDYwLCAweEY2LCAweEYxLCAweDg5LCAweEZGLAorCSAweDMyLCAweDQwLCAweDgwLCAweDJBLCAweDFFLCAweDAwLCAweDMxLCAweDQwLCAweDAxLCAweDJBLCAweDFCLCAweDAwLCAweDEyLCAweDYwLCAweEZGLCAweEYzLAorCSAweEZGLCAweEZGLCAweDAwLCAweEE4LCAweDYwLCAweDQ2LCAweDA1LCAweDAzLCAweDBFLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDJBLAorCSAweDEwLCAweDAwLCAweDEzLCAweDYwLCAweDAyLCAweEYzLCAweEZGLCAweEZGLCAweDAwLCAweEE4LCAweDYwLCAweDQ2LCAweDAzLCAweDAzLCAweDBGLCAweEYyLAorCSAweEZGLCAweEZGLCAweDA3LCAweDFCLCAweDY0LCAweDQwLCAweDAxLCAweDI2LCAweDAzLCAweDAwLCAweDA4LCAweDYwLCAweDAwLCAweDc1LCAweDAxLCAweDAwLAorCSAweDEwLCAweEZGLCAweDg4LCAweEZGLCAweEEyLCAweDYwLCAweDQxLCAweDc4LCAweEZGLCAweEZGLCAweDIxLCAweDQ2LCAweDAxLCAweDVELCAweDVDLCAweDYyLAorCSAweDAzLCAweEUxLCAweDQ0LCAweEZGLCAweEExLCAweEZGLCAweDlBLCAweEZGLCAweDdBLCAweERDLCAweDdBLCAweERDLCAweDdBLCAweERDLCAweDYyLCAweDYyLAorCSAweDdBLCAweERDLCAweDdBLCAweERDLCAweDdBLCAweERDLCAweEExLCAweEZGLCAweDVBLCAweERDLCAweDEyLCAweEUxLCAweDAyLCAweDYwLCAweDAxLCAweEUxLAorCSAweEExLCAweEZGLCAweDk4LCAweEZGLCAweDgwLCAweDNFLCAweDI4LCAweDQwLCAweDQwLCAweDJCLCAweDAzLCAweDAwLCAweDI5LCAweDQwLCAweDIwLCAweDI3LAorCSAweEEzLCAweDAwLCAweEM4LCAweDc0LCAweENELCAweEUyLCAweDI5LCAweDQ0LCAweDA4LCAweEJDLCAweDQwLCAweDQ5LCAweDQ0LCAweEZGLCAweDA1LCAweEUxLAorCSAweERCLCAweEYzLCAweDM3LCAweDYwLCAweEU4LCAweDYzLCAweDAzLCAweEE4LCAweDA0LCAweEE4LCAweDA2LCAweDAzLCAweDA1LCAweDAzLCAweEEzLCAweEQzLAorCSAweEZGLCAweEZGLCAweDAxLCAweEE4LCAweDA3LCAweDE4LCAweDBBLCAweDAzLCAweDI4LCAweDQwLCAweDA4LCAweDJBLCAweDA3LCAweDAwLCAweDI4LCAweDQwLAorCSAweDQ4LCAweDM2LCAweDA0LCAweDAwLCAweEYxLCAweEYzLCAweEZGLCAweEZGLCAweDAyLCAweEJDLCAweEYxLCAweEZCLCAweDI5LCAweDQ0LCAweEZGLCAweDYwLAorCSAweEVGLCAweDY1LCAweDI0LCAweDg5LCAweDQwLCAweDI3LCAweDNGLCAweDAwLCAweDAwLCAweDAwLCAweDI5LCAweDQwLCAweDgwLCAweDI3LCAweDBCLCAweDAwLAorCSAweDA3LCAweDYxLCAweEExLCAweEZGLCAweENELCAweDgxLCAweDA0LCAweDI1LCAweDYxLCAweDAwLCAweDg3LCAweDRDLCAweEZCLCAweDAyLCAweEYzLCAweDYwLAorCSAweEEwLCAweDY0LCAweDgwLCAweDRDLCAweDA3LCAweDAwLCAweEExLCAweEZGLCAweDlDLCAweDRDLCAweDlDLCAweDRDLCAweDlDLCAweDRELCAweDA1LCAweDYwLAorCSAweENGLCAweDY0LCAweDgwLCAweDRDLCAweDI4LCAweDQwLCAweDQwLCAweDJCLCAweDA1LCAweDAwLCAweDI5LCAweDQwLCAweDIwLCAweDI3LCAweDAyLCAweDAwLAorCSAweDE1LCAweDYwLCAweDZGLCAweDZCLCAweDA0LCAweDI1LCAweDRBLCAweDAwLCAweDMwLCAweDY0LCAweDNBLCAweERCLCAweDQ0LCAweEZGLCAweDA0LCAweDI1LAorCSAweDQ1LCAweDAwLCAweDA0LCAweDYwLCAweDAwLCAweDY1LCAweDI1LCAweDQ0LCAweEI0LCAweDg0LCAweDgwLCAweDRFLCAweDJELCAweDQxLCAweDA0LCAweDI1LAorCSAweDNELCAweDAwLCAweDYxLCAweDRDLCAweDAwLCAweDYwLCAweDhBLCAweDY1LCAweEM1LCAweDgxLCAweDYxLCAweDU0LCAweEExLCAweEZGLCAweEZGLCAweEZGLAorCSAweDA0LCAweDI1LCAweDM0LCAweDAwLCAweDY3LCAweDRFLCAweDA3LCAweDY0LCAweDFDLCAweEZCLCAweDAwLCAweEUxLCAweDAyLCAweDYwLCAweDA1LCAweEUxLAorCSAweEExLCAweEZGLCAweDk4LCAweEZGLCAweDgwLCAweDNFLCAweDI4LCAweDQwLCAweDQwLCAweDI3LCAweDBBLCAweDAwLCAweDFDLCAweDY1LCAweDI4LCAweDQwLAorCSAweEE0LCAweDM2LCAweDE0LCAweDY1LCAweDIzLCAweDQ0LCAweEM0LCAweDg0LCAweDI4LCAweDQwLCAweDA4LCAweDJBLCAweDBDLCAweDAwLCAweDA3LCAweDAwLAorCSAweDIzLCAweDQ0LCAweDFDLCAweEE0LCAweDI5LCAweDQwLCAweDIwLCAweDI3LCAweDAyLCAweDAwLCAweDExLCAweDYwLCAweDBGLCAweDZCLCAweDNDLCAweDQ2LAorCSAweDk4LCAweEYwLCAweDIzLCAweDQ0LCAweEM0LCAweDg0LCAweDA2LCAweDc0LCAweDI1LCAweDVDLCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LAorCSAweEUwLCAweDg0LCAweEIwLCAweDg0LCAweDgwLCAweDRDLCAweDlDLCAweDRDLCAweDQ0LCAweEZGLCAweDE4LCAweEUxLCAweDBBLCAweDY0LCAweDFFLCAweDc0LAorCSAweDAyLCAweDYwLCAweDA1LCAweEUxLCAweDQwLCAweDQwLCAweEExLCAweEZGLCAweDk4LCAweEZGLCAweDgwLCAweDNFLCAweEM0LCAweEUyLCAweDI3LCAweDQ0LAorCSAweDIwLCAweDJBLCAweDA2LCAweDAwLCAweDQyLCAweDY0LCAweDNBLCAweERCLCAweDY3LCAweDRDLCAweEIxLCAweDYwLCAweEFELCAweDc4LCAweEZGLCAweEZGLAorCSAweDQxLCAweDY0LCAweDNBLCAweERCLCAweDYyLCAweEZGLCAweDA4LCAweEUxLCAweEUyLCAweEZFLCAweDcyLCAweDUyLCAweEExLCAweEZGLCAweDk4LCAweEZGLAorCSAweDgwLCAweDNFLCAweEExLCAweEZGLCAweDk4LCAweEZGLCAweDgwLCAweDNFLCAweDI4LCAweDQwLCAweDA4LCAweDI3LCAweDVBLCAweDAxLCAweDNDLCAweDQ2LAorCSAweDhCLCAweEZGLCAweDg0LCAweDYwLCAweDAwLCAweEU0LCAweDBGLCAweDYwLCAweDkwLCAweDY0LCAweEM5LCAweDYwLCAweDU4LCAweDRGLCAweDU2LCAweDc4LAorCSAweEZGLCAweEZGLCAweDNGLCAweEYyLCAweDAwLCAweDYwLCAweDE4LCAweDcwLCAweDE4LCAweDcxLCAweDIwLCAweDcyLCAweDAwLCAweEYyLCAweDYwLCAweDUzLAorCSAweDIwLCAweEUxLCAweEExLCAweEZGLCAweDg4LCAweDc1LCAweDAwLCAweEUxLCAweEZGLCAweEZGLCAweDYwLCAweDUwLCAweDc1LCAweDQ0LCAweDEyLCAweDcxLAorCSAweDZFLCAweDcyLCAweDgxLCAweDc1LCAweEZGLCAweEZGLCAweDg4LCAweEZGLCAweEEzLCAweDYwLCAweDIxLCAweDc4LCAweEZGLCAweEZGLCAweDMyLCAweEYzLAorCSAweDA4LCAweDI5LCAweDBBLCAweDAwLCAweDYwLCAweDQwLCAweDA3LCAweDIyLCAweDA3LCAweDAwLCAweEZFLCAweEI0LCAweDMyLCAweEZCLCAweDI3LCAweDQ0LAorCSAweDEwLCAweEJDLCAweEY3LCAweEI0LCAweDQwLCAweDQ3LCAweDQzLCAweEZGLCAweDAwLCAweDY0LCAweDNBLCAweERCLCAweDAxLCAweDYwLCAweDA4LCAweEUxLAorCSAweDMxLCAweDQwLCAweDAxLCAweDJBLCAweDA2LCAweDAwLCAweDAwLCAweDY0LCAweDMzLCAweEZCLCAweDAxLCAweDYwLCAweDBBLCAweEUxLCAweDI1LCAweDExLAorCSAweDI0LCAweDBBLCAweEU1LCAweEZFLCAweDJELCAweDA1LCAweDMyLCAweDQwLCAweDgwLCAweDJBLCAweDA1LCAweDAwLCAweDE5LCAweDYwLCAweEYyLCAweEYzLAorCSAweEZGLCAweEZGLCAweDAxLCAweDE4LCAweDE2LCAweDAwLCAweDlGLCAweEZFLCAweDE0LCAweDA1LCAweDlELCAweEZFLCAweDEyLCAweDA0LCAweDMxLCAweDQxLAorCSAweDQwLCAweDJBLCAweDBGLCAweDAwLCAweDA3LCAweDYwLCAweEU5LCAweEYxLCAweEFFLCAweDRDLCAweDkwLCAweDgwLCAweDEwLCAweDJBLCAweDA5LCAweDAwLAorCSAweDdGLCAweEIxLCAweDA3LCAweDYwLCAweEU5LCAweEZCLCAweDYwLCAweDQwLCAweDEwLCAweDJBLCAweDgwLCAweEI5LCAweDQxLCAweDUxLCAweERGLCAweEZFLAorCSAweDE5LCAweEZGLCAweDlGLCAweEZFLCAweDAyLCAweDA0LCAweDQwLCAweEUxLCAweDA4LCAweDAwLCAweDdDLCAweEUxLCAweDMxLCAweDQ0LCAweDAxLCAweDJBLAorCSAweDA0LCAweDAwLCAweEZELCAweEUxLCAweDI3LCAweDQ0LCAweDEwLCAweDI2LCAweDA2LCAweDAwLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDgxLCAweDNFLAorCSAweEFBLCAweDYwLCAweDZGLCAweDc4LCAweEZGLCAweEZGLCAweDI3LCAweDQ0LCAweDA4LCAweDI2LCAweEZGLCAweEZGLCAweEMxLCAweDYwLCAweEEzLCAweDc4LAorCSAweEZGLCAweEZGLCAweDQ4LCAweEYzLCAweDMyLCAweEYxLCAweDAwLCAweDYzLCAweDY0LCAweDQwLCAweDA3LCAweDI2LCAweDAzLCAweDAwLCAweEE1LCAweDYwLAorCSAweDBGLCAweDc4LCAweEZGLCAweEZGLCAweDQzLCAweEZGLCAweDMxLCAweDQwLCAweDA4LCAweDI2LCAweEYwLCAweDAxLCAweENELCAweEUyLCAweDg1LCAweEUxLAorCSAweDcwLCAweDQxLCAweEFELCAweDgwLCAweDcxLCAweDQwLCAweDgwLCAweDI3LCAweEU5LCAweDEyLCAweDAzLCAweDAzLCAweEMyLCAweDYwLCAweDE1LCAweDc4LAorCSAweEZGLCAweEZGLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweEM0LCAweEUyLCAweDMyLCAweEZELCAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweERCLCAweDAxLAorCSAweDAwLCAweDYzLCAweDMyLCAweEZELCAweDNDLCAweDQ2LCAweDNFLCAweEYyLCAweDJBLCAweEYwLCAweDI3LCAweDQxLCAweDQ0LCAweDQ4LCAweDIwLCAweEI5LAorCSAweDAxLCAweEI0LCAweEY3LCAweEIxLCAweDBBLCAweDAzLCAweDY0LCAweDQwLCAweDA4LCAweDI3LCAweDA3LCAweDAwLCAweDBGLCAweDYwLCAweERBLCAweDYzLAorCSAweDAwLCAweDY0LCAweDQ1LCAweEZCLCAweDQ2LCAweEZCLCAweEJELCAweERCLCAweEEzLCAweERCLCAweEM4LCAweDBBLCAweEM3LCAweDExLCAweDFCLCAweDYwLAorCSAweEVFLCAweEYzLCAweEZGLCAweEZGLCAweDE0LCAweDE4LCAweDI4LCAweDQwLCAweEQ0LCAweDM2LCAweDExLCAweDAwLCAweEFDLCAweDRDLCAweDgwLCAweDJBLAorCSAweDBFLCAweDAwLCAweDFCLCAweDYwLCAweEYxLCAweEYzLCAweEZGLCAweEZGLCAweDBBLCAweDE4LCAweDFCLCAweDYwLCAweEYyLCAweEYzLCAweDFCLCAweDYwLAorCSAweEVGLCAweEYzLCAweDYwLCAweDQ1LCAweEQ0LCAweDgwLCAweERDLCAweDg0LCAweDAyLCAweDAzLCAweEEyLCAweERCLCAweEFGLCAweDAxLCAweDAwLCAweDY0LAorCSAweDFCLCAweDYwLCAweEVGLCAweEZCLCAweDQxLCAweDQ3LCAweDIyLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDEwLCAweDI2LCAweDA0LCAweDAwLAorCSAweDAxLCAweDJBLCAweDA1LCAweDAwLCAweDEwLCAweDJCLCAweDAzLCAweDAwLCAweDI5LCAweDQ3LCAweDIwLCAweEJGLCAweDQwLCAweDQ5LCAweDFCLCAweDYwLAorCSAweEVFLCAweEYzLCAweEZGLCAweEZGLCAweDA0LCAweDE4LCAweEFFLCAweDRGLCAweDA4LCAweEJDLCAweDAwLCAweDdGLCAweEEwLCAweDVFLCAweDA1LCAweEUxLAorCSAweDAxLCAweDYwLCAweDA4LCAweEUxLCAweDJBLCAweEU4LCAweDNDLCAweDQ2LCAweDBGLCAweEYwLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAxLCAweDJBLAorCSAweDAzLCAweDAwLCAweEE3LCAweDYwLCAweEUxLCAweDc4LCAweEZGLCAweEZGLCAweDdELCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDI3LAorCSAweDBFLCAweDAwLCAweDFGLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDQwLCAweDJCLCAweDA5LCAweDAwLCAweDE5LCAweDYwLCAweDdCLCAweEYzLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAyLCAweDJBLCAweDAzLCAweDAwLCAweEE4LCAweDYwLCAweEVDLCAweDc4LCAweEZGLCAweEZGLCAweDFGLCAweEYyLAorCSAweEMwLCAweDYwLCAweDAwLCAweDY1LCAweEE0LCAweDlDLCAweDNGLCAweDYwLCAweENGLCAweDY1LCAweDI5LCAweDQ0LCAweEE0LCAweDg0LCAweDMwLCAweDg5LAorCSAweDE5LCAweDYwLCAweDc3LCAweEYzLCAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweDU1LCAweEZCLCAweDFGLCAweEYyLCAweDM5LCAweEYxLCAweEUwLCAweDYwLAorCSAweEZGLCAweEI1LCAweDBBLCAweDE4LCAweDYwLCAweDQ3LCAweDFGLCAweEI0LCAweEQwLCAweDg0LCAweEUwLCAweEEwLCAweDAyLCAweDBELCAweDAwLCAweDY0LAorCSAweDAyLCAweDAwLCAweDAxLCAweDA0LCAweDFGLCAweDY0LCAweDYwLCAweDQ3LCAweEI0LCAweDgxLCAweDA3LCAweDYwLCAweEVBLCAweEYxLCAweEZGLCAweEZGLAorCSAweEIxLCAweDhDLCAweDI5LCAweDQwLCAweDQwLCAweDJCLCAweDEwLCAweDAwLCAweDI5LCAweDYwLCAweEMwLCAweDY1LCAweDYwLCAweDQ3LCAweDFGLCAweEI0LAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDVBLCAweEQxLCAweDAxLCAweDYwLCAweDAwLCAweEUxLCAweDAxLCAweDYwLCAweDA5LCAweDZCLAorCSAweDYwLCAweDRDLCAweEI1LCAweEZGLCAweDY0LCAweDRDLCAweDE0LCAweDAwLCAweDI5LCAweDYwLCAweEMwLCAweDY1LCAweDYwLCAweDQ3LCAweDFGLCAweEI0LAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDVBLCAweEQxLCAweDAxLCAweDYwLCAweDAwLCAweEUxLCAweDA1LCAweDYwLCAweDY5LCAweDZCLAorCSAweDYwLCAweDRDLCAweEI1LCAweEZGLCAweDY0LCAweDRDLCAweDdDLCAweDQ0LCAweDI5LCAweDQwLCAweDgwLCAweDJCLCAweDY3LCAweDQ0LCAweDYwLCAweDRDLAorCSAweDAwLCAweEUxLCAweDg0LCAweEZGLCAweEMyLCAweDYwLCAweDQ1LCAweDY0LCAweDQwLCAweDQyLCAweDgyLCAweEZGLCAweDBELCAweDAwLCAweEU1LCAweEZFLAorCSAweDAzLCAweDA0LCAweEFBLCAweDYwLCAweDZGLCAweDc4LCAweEZGLCAweEZGLCAweDMyLCAweEYxLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDA3LCAweDIyLAorCSAweDQzLCAweEZGLCAweEEzLCAweDYwLCAweEY0LCAweDc4LCAweEZGLCAweEZGLCAweDBCLCAweDY0LCAweDNBLCAweERCLCAweDAxLCAweDYwLCAweDBBLCAweEUxLAorCSAweDFDLCAweDQyLCAweDIyLCAweDQ2LCAweDEzLCAweEYyLCAweEZGLCAweDY1LCAweDYwLCAweDQ3LCAweDJBLCAweEYyLCAweDQwLCAweDQ1LCAweDQwLCAweDQ4LAorCSAweDA0LCAweDJCLCAweDEzLCAweDAwLCAweDE2LCAweEYyLCAweDFELCAweEYyLCAweDQwLCAweDQzLCAweDBGLCAweEYyLCAweDQwLCAweDRELCAweDBGLCAweDY0LAorCSAweDE0LCAweEYwLCAweDM1LCAweEYyLCAweEEwLCAweDgyLCAweDBGLCAweEI0LCAweENBLCAweDg1LCAweEQ0LCAweDgwLCAweDEwLCAweEYyLCAweDAxLCAweDAyLAorCSAweDJCLCAweEZBLCAweDI3LCAweDQ0LCAweDQwLCAweEJDLCAweDQwLCAweDQ3LCAweDEzLCAweDAwLCAweDE3LCAweEYyLCAweDJDLCAweEYwLCAweDQwLCAweDQzLAorCSAweDFCLCAweEYyLCAweDFELCAweEZBLCAweDQwLCAweDRELCAweDY0LCAweDQwLCAweDAxLCAweDJBLCAweDAyLCAweDAwLCAweEFCLCAweEZDLCAweDA1LCAweDAwLAorCSAweDI4LCAweDQwLCAweEE0LCAweDM2LCAweDAyLCAweDAwLCAweDExLCAweEYyLCAweDJCLCAweEZBLCAweDI3LCAweDQ0LCAweEJGLCAweEI0LCAweDQwLCAweDQ3LAorCSAweEYwLCAweEZFLCAweEIwLCAweDYwLCAweEIwLCAweDc4LCAweEZGLCAweEZGLCAweDIyLCAweDQ2LCAweDJDLCAweEYwLCAweDI3LCAweDQ0LCAweERGLCAweEI0LAorCSAweDQwLCAweDQ3LCAweDY0LCAweDQwLCAweDAxLCAweDI2LCAweDA5LCAweDAwLCAweDJBLCAweEYyLCAweDM5LCAweEYwLCAweDhGLCAweEIwLCAweDg4LCAweDNBLAorCSAweDBELCAweDAwLCAweDY0LCAweDQ0LCAweDYwLCAweEIwLCAweDIwLCAweDNBLCAweDA5LCAweDAwLCAweDI4LCAweDQ0LCAweDA0LCAweDI3LCAweDA1LCAweDAwLAorCSAweEQ0LCAweDNBLCAweDAzLCAweDAwLCAweEFFLCAweDRGLCAweEY3LCAweEI0LCAweEEwLCAweDVFLCAweDExLCAweDAwLCAweDJBLCAweEYwLCAweDAxLCAweDY1LAorCSAweDY0LCAweDQwLCAweEE0LCAweDNBLCAweDA0LCAweDY1LCAweDI3LCAweDQ0LCAweDM0LCAweDg3LCAweDM2LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDU2LAorCSAweEFELCAweEUyLCAweDA0LCAweDY0LCAweDNBLCAweERCLCAweDQxLCAweEUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDgxLCAweDNFLCAweDA2LCAweDY0LAorCSAweDNBLCAweERCLCAweDIyLCAweDQ2LCAweDAxLCAweDY0LCAweDMxLCAweEZCLCAweEMwLCAweEZFLCAweEMyLCAweDYwLCAweDFFLCAweDc4LCAweEZGLCAweEZGLAorCSAweDI4LCAweDQwLCAweEM0LCAweDNBLCAweDBDLCAweDAwLCAweDI3LCAweDQ0LCAweEZELCAweEI0LCAweDQwLCAweDQ3LCAweEE4LCAweEUyLCAweDA1LCAweEUxLAorCSAweDAxLCAweDYwLCAweDA4LCAweEUxLCAweDJBLCAweEU4LCAweDNDLCAweDQ2LCAweEE0LCAweDYwLCAweEJGLCAweDc4LCAweEZGLCAweEZGLCAweDNGLCAweDQwLAorCSAweDAxLCAweDJCLCAweDA1LCAweDAwLCAweDY3LCAweDRDLCAweDAxLCAweDYwLCAweDAwLCAweEUxLCAweDA1LCAweDYwLCAweDY5LCAweDZCLCAweDA3LCAweDYwLAorCSAweEVCLCAweEYxLCAweDFGLCAweEYyLCAweDJBLCAweEU4LCAweEIwLCAweDgxLCAweDI5LCAweDQwLCAweDQwLCAweDJCLCAweDE0LCAweDAwLCAweDYxLCAweDRDLAorCSAweDI5LCAweDYwLCAweEMwLCAweDY1LCAweDYxLCAweDQ3LCAweDFGLCAweEI0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDVBLCAweEQxLAorCSAweDAxLCAweDYwLCAweDAwLCAweEUxLCAweDAxLCAweDYwLCAweDA5LCAweDZCLCAweDYwLCAweDRDLCAweEI1LCAweEZGLCAweEZGLCAweDYwLCAweEYyLCAweDY0LAorCSAweDY0LCAweDRDLCAweDQwLCAweDQzLCAweDE4LCAweDAwLCAweDI5LCAweDQ3LCAweDgwLCAweEI3LCAweDM0LCAweDk0LCAweDYwLCAweDRDLCAweDI5LCAweDYwLAorCSAweEMwLCAweDY1LCAweDYxLCAweDQ3LCAweDFGLCAweEI0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDVBLCAweEQxLCAweDAxLCAweDYwLAorCSAweDAwLCAweEUxLCAweDA1LCAweDYwLCAweDY5LCAweDZCLCAweDYwLCAweDRDLCAweEI1LCAweEZGLCAweDY0LCAweDRDLCAweDdDLCAweDQ0LCAweDI5LCAweDQwLAorCSAweDgwLCAweDJCLCAweDY3LCAweDQ0LCAweDYwLCAweDRDLCAweDQwLCAweEUxLCAweDAxLCAweDYwLCAweDA4LCAweEUxLCAweDI4LCAweDQ1LCAweEJGLCAweDYwLAorCSAweEZGLCAweDY0LCAweDI0LCAweDg4LCAweEM0LCAweEUyLCAweDA4LCAweDY0LCAweDNBLCAweERCLCAweDIxLCAweDQ2LCAweDJBLCAweDQ0LCAweDcyLCAweDQ1LAorCSAweDI0LCAweEZBLCAweEIyLCAweEYzLCAweDA2LCAweDA0LCAweEU0LCAweEUyLCAweERDLCAweDlDLCAweDI5LCAweDQwLCAweDAxLCAweDI2LCAweDY0LCAweDQ0LAorCSAweEIyLCAweEY5LCAweDI1LCAweEZBLCAweEIzLCAweEYzLCAweDAyLCAweDA0LCAweERDLCAweDg0LCAweEIzLCAweEZCLCAweDI4LCAweEZBLCAweEI0LCAweEYzLAorCSAweDAyLCAweDA0LCAweERDLCAweDg0LCAweEI0LCAweEZCLCAweDI5LCAweEZBLCAweDI0LCAweDQ0LCAweDA0LCAweDJBLCAweDA2LCAweDAwLCAweDI4LCAweDQwLAorCSAweEE0LCAweDM2LCAweDAzLCAweDAwLCAweEE2LCAweDYwLCAweEIxLCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQzLCAweDg0LCAweEJCLCAweEZDLCAweEIzLAorCSAweDIxLCAweDQ2LCAweDAxLCAweDVELCAweDBGLCAweEZDLCAweDVDLCAweDQ2LCAweDA1LCAweEZGLCAweDI3LCAweDQ0LCAweDAxLCAweDJBLCAweDEzLCAweDAwLAorCSAweDUwLCAweEZFLCAweDI4LCAweDQwLCAweDA4LCAweDNBLCAweDEyLCAweDAwLCAweDJGLCAweEYyLCAweDMwLCAweEYwLCAweDYwLCAweDQzLCAweDMxLCAweEYyLAorCSAweDIyLCAweDQ2LCAweDY0LCAweDQxLCAweDJDLCAweEYwLCAweDJELCAweEYwLCAweEQzLCAweDgwLCAweDJFLCAweEYwLCAweEQxLCAweDgwLCAweEQwLCAweDgwLAorCSAweDI3LCAweDQ0LCAweDA5LCAweDBDLCAweDAzLCAweDAwLCAweDI3LCAweDQ0LCAweDA2LCAweDIyLCAweDA1LCAweDAwLCAweEI4LCAweEI0LCAweDQwLCAweDQ3LAorCSAweDAyLCAweDY0LCAweDMxLCAweEZCLCAweEMwLCAweEZFLCAweEQ0LCAweDY0LCAweDQwLCAweDQ4LCAweDBELCAweDY0LCAweDNBLCAweERCLCAweDdDLCAweDQ0LAorCSAweDFCLCAweDYwLCAweEYwLCAweEZCLCAweDIxLCAweDQ2LCAweDFDLCAweEYyLCAweDAwLCAweEUxLCAweEYwLCAweEZFLCAweDAwLCAweDYzLCAweDI4LCAweDQ0LAorCSAweEE0LCAweDM2LCAweDBBLCAweDAwLCAweDA0LCAweDJCLCAweDA4LCAweDAwLCAweDMwLCAweEYzLCAweDJELCAweDQ1LCAweEQ0LCAweDg0LCAweENBLCAweDY1LAorCSAweEQ0LCAweDgzLCAweDAxLCAweDY0LCAweDFCLCAweDYwLCAweEYwLCAweEZCLCAweEQ0LCAweDY0LCAweDM1LCAweDAwLCAweDBGLCAweDY0LCAweDNBLCAweERCLAorCSAweDIxLCAweDQ2LCAweDI5LCAweDQwLCAweDQwLCAweDI3LCAweDE1LCAweDAwLCAweDgwLCAweDI3LCAweDAyLCAweDAwLCAweENBLCAweDY1LCAweDAxLCAweDAwLAorCSAweDZBLCAweDY1LCAweDFDLCAweEYyLCAweEZGLCAweEZGLCAweDA0LCAweDdGLCAweDQwLCAweDQ1LCAweDBBLCAweDM2LCAweDcwLCAweDY0LCAweDE0LCAweDM2LAorCSAweDM4LCAweDY0LCAweDM3LCAweDM2LCAweDE1LCAweDY0LCAweDZFLCAweDNBLCAweDE3LCAweDAwLCAweDg0LCAweDdGLCAweDQwLCAweDQ1LCAweDBCLCAweDY0LAorCSAweDEzLCAweDAwLCAweDFDLCAweEYyLCAweDFFLCAweDY1LCAweDQwLCAweDQ1LCAweDBCLCAweDM2LCAweDFFLCAweDY0LCAweDBGLCAweDM2LCAweDE2LCAweDY0LAorCSAweDBBLCAweDM2LCAweDEyLCAweDY0LCAweDBFLCAweDM2LCAweDBFLCAweDY0LCAweDA5LCAweDM2LCAweDBFLCAweDY0LCAweDBELCAweDM2LCAweDBBLCAweDY0LAorCSAweDA4LCAweDM2LCAweDBBLCAweDY0LCAweDBDLCAweDM2LCAweDBBLCAweDY0LCAweDQwLCAweDRELCAweDAwLCAweEUxLCAweEYwLCAweEZFLCAweDJCLCAweEYyLAorCSAweEM0LCAweDg1LCAweEQ0LCAweDgzLCAweEM0LCAweDY0LCAweDQwLCAweDQ4LCAweDJGLCAweEYwLCAweEIwLCAweEYwLCAweEIxLCAweEYyLCAweEExLCAweEZGLAorCSAweDEyLCAweDc0LCAweENELCAweEUyLCAweDgwLCAweDRFLCAweDEyLCAweDc0LCAweDgzLCAweDRDLCAweDEyLCAweDc0LCAweDlBLCAweEZGLCAweDg0LCAweDRDLAorCSAweDEyLCAweDc0LCAweDg1LCAweDRDLCAweDEyLCAweDc0LCAweDgxLCAweDRDLCAweDEyLCAweDc0LCAweEExLCAweEZGLCAweDk4LCAweEZGLCAweEIyLCAweDYwLAorCSAweDU4LCAweDRGLCAweDJELCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDYwLCAweDE4LCAweEUxLCAweDc4LCAweDQ0LCAweDAzLCAweEE0LCAweDM1LCAweEZCLAorCSAweEIyLCAweDYwLCAweDcwLCAweDc4LCAweEZGLCAweEZGLCAweDI5LCAweDQ0LCAweEY3LCAweEI0LCAweDQwLCAweDQ5LCAweDI4LCAweDQwLCAweEM0LCAweDM2LAorCSAweDA3LCAweDAwLCAweDFCLCAweDYwLCAweEYwLCAweEYzLCAweEZGLCAweEZGLCAweDAzLCAweDFCLCAweEFFLCAweDRGLCAweEY3LCAweEI0LCAweEEwLCAweDVFLAorCSAweDI3LCAweDQ0LCAweDAxLCAweDJBLCAweDA1LCAweDAwLCAweEZFLCAweEI0LCAweDQwLCAweDQ3LCAweEE1LCAweDYwLCAweDdGLCAweDc4LCAweEZGLCAweEZGLAorCSAweDE2LCAweDYwLCAweEFCLCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAyLCAweDM2LCAweEMxLCAweEZFLCAweEEzLCAweDYwLCAweEU3LCAweDc4LAorCSAweEZGLCAweEZGLCAweDI4LCAweDQwLCAweEI0LCAweDNBLCAweDBCLCAweDAwLCAweDI3LCAweDQ0LCAweDA3LCAweDIyLCAweDA1LCAweDAwLCAweEY4LCAweEI0LAorCSAweDQwLCAweDQ3LCAweDAyLCAweDY0LCAweDMxLCAweEZCLCAweEMwLCAweEZFLCAweEE2LCAweDYwLCAweDNFLCAweDc4LCAweEZGLCAweEZGLCAweDI4LCAweDQ0LAorCSAweEQ0LCAweDM2LCAweDAzLCAweDAwLCAweEE3LCAweDYwLCAweEM4LCAweDc4LCAweEZGLCAweEZGLCAweEE4LCAweEUyLCAweDI3LCAweDQ0LCAweEZCLCAweEI0LAorCSAweDQwLCAweDQ3LCAweDFDLCAweDQyLCAweDIyLCAweDQ2LCAweDE5LCAweDYwLCAweENGLCAweEYzLCAweEZGLCAweEZGLCAweDM0LCAweEZCLCAweDJBLCAweEYwLAorCSAweEY3LCAweDYwLCAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERBLCAweDYwLCAweDQwLCAweDQwLCAweDJCLCAweEM0LCAweDAwLCAweDIyLCAweEYyLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDIyLCAweDI2LCAweDNGLCAweDAwLCAweDAxLCAweDI2LCAweDAzLCAweDAwLCAweDA0LCAweDI2LCAweDA1LCAweDAwLAorCSAweEJBLCAweDAwLCAweDA0LCAweDJCLCAweEI4LCAweDAwLCAweEE2LCAweEY1LCAweDAxLCAweDAwLCAweDA3LCAweEY0LCAweDRCLCAweEYyLCAweEZGLCAweEZGLAorCSAweERDLCAweDg0LCAweDRCLCAweEZBLCAweDBDLCAweDYwLCAweEZDLCAweDYyLCAweDgwLCAweEZGLCAweEM4LCAweDYwLCAweDc4LCAweDQ0LCAweDAyLCAweEE0LAorCSAweEEyLCAweERCLCAweDhDLCAweDc4LCAweEZGLCAweEZGLCAweDgyLCAweEZGLCAweEE2LCAweEYzLCAweDY2LCAweDVDLCAweEQwLCAweDgwLCAweDAwLCAweDdDLAorCSAweDA3LCAweDAzLCAweDY2LCAweDQzLCAweDIyLCAweDQ2LCAweDIyLCAweEYyLCAweDYzLCAweDQ2LCAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDAxLCAweDAwLAorCSAweDNDLCAweEYxLCAweDRCLCAweEYwLCAweDY0LCAweDQxLCAweDY0LCAweDQ3LCAweDYwLCAweDVGLCAweDIwLCAweEJDLCAweDgwLCAweDI2LCAweDgwLCAweEFDLAorCSAweDYwLCAweDQ3LCAweDIyLCAweDQ2LCAweDNBLCAweEZBLCAweDY0LCAweDQ0LCAweDIwLCAweDdGLCAweDM0LCAweDk0LCAweDNCLCAweEZBLCAweDA4LCAweDYwLAorCSAweDAwLCAweEVBLCAweDBGLCAweDY0LCAweDYwLCAweDdGLCAweEEwLCAweDVBLCAweDgwLCAweDYwLCAweDAwLCAweEVBLCAweEEwLCAweDYwLCAweDAwLCAweEVBLAorCSAweEQxLCAweDYwLCAweDAwLCAweEVBLCAweDgwLCAweDAwLCAweDJBLCAweEYyLCAweDAwLCAweDYwLCAweDdDLCAweDYyLCAweDYwLCAweDQwLCAweDQwLCAweDJCLAorCSAweDI0LCAweDAwLCAweEEyLCAweEQzLCAweDAwLCAweDYxLCAweDYwLCAweEZFLCAweEEwLCAweEQzLCAweDVFLCAweEQxLCAweEZGLCAweEZGLCAweDIwLCAweEZFLAorCSAweDY0LCAweDVGLCAweERDLCAweDg0LCAweEYxLCAweDgxLCAweEMwLCAweDJCLCAweDA0LCAweDAwLCAweDgwLCAweDJBLCAweDAyLCAweDAwLCAweDdGLCAweEE0LAorCSAweERDLCAweDg0LCAweEZGLCAweDNCLCAweDAzLCAweDAwLCAweDYwLCAweDQ3LCAweERDLCAweDg3LCAweDAxLCAweDYxLCAweEMwLCAweDgwLCAweDAwLCAweDM2LAorCSAweERDLCAweDg0LCAweDRFLCAweERCLCAweDYwLCAweEZFLCAweDVBLCAweEQxLCAweEZGLCAweEZGLCAweEMxLCAweDg0LCAweEYwLCAweDIyLCAweDEwLCAweEE0LAorCSAweEYwLCAweDJBLCAweDAxLCAweDAwLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDIwLCAweEZFLCAweDAwLCAweDYwLCAweDNFLCAweEYzLCAweEZGLCAweEZGLAorCSAweEEwLCAweEQzLCAweDVBLCAweEQxLCAweDNBLCAweEZBLCAweDNCLCAweEY4LCAweDc0LCAweDYyLCAweEEyLCAweEQwLCAweEZGLCAweEZGLCAweDY0LCAweDQ0LAorCSAweEUwLCAweDdGLCAweEEwLCAweDVBLCAweDY0LCAweDQ3LCAweEUxLCAweDdGLCAweDVBLCAweEQwLCAweEEwLCAweDVBLCAweDY0LCAweDQ0LCAweEUyLCAweDdGLAorCSAweEEwLCAweDVBLCAweDAwLCAweDYwLCAweDQwLCAweEYzLCAweEZGLCAweEZGLCAweEEwLCAweEQxLCAweDVBLCAweEQxLCAweDY0LCAweDQ1LCAweDY0LCAweDQ0LAorCSAweEUzLCAweDdGLCAweEEwLCAweDVBLCAweDY0LCAweDQ3LCAweEU0LCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVBLCAweDY0LCAweDQ0LCAweEU1LCAweDdGLAorCSAweEEwLCAweDVBLCAweDY0LCAweDQ3LCAweEU2LCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVBLCAweDY0LCAweDQ0LCAweEU3LCAweDdGLCAweEEwLCAweDVBLAorCSAweDY1LCAweDQwLCAweDBELCAweDNBLCAweDFDLCAweDAwLCAweDY0LCAweDQ3LCAweEU4LCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVBLCAweDY0LCAweDQ0LAorCSAweEU5LCAweDdGLCAweEEwLCAweDVBLCAweDY0LCAweDQ3LCAweEVBLCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVBLCAweDY0LCAweDQ0LCAweEVCLCAweDdGLAorCSAweEEwLCAweDVBLCAweDY0LCAweDQ3LCAweEVDLCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVBLCAweDY0LCAweDQ0LCAweEVELCAweDdGLCAweEEwLCAweDVBLAorCSAweDY0LCAweDQ3LCAweEVFLCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVBLCAweDY0LCAweDQ0LCAweEVGLCAweDdGLCAweEEwLCAweDVBLCAweDA4LCAweDYwLAorCSAweDAwLCAweEVBLCAweDY1LCAweDQ0LCAweDAyLCAweEE0LCAweDYwLCAweDdGLCAweEEwLCAweDVBLCAweDgwLCAweDYwLCAweDAwLCAweEVBLCAweEEwLCAweDYwLAorCSAweDAwLCAweEVBLCAweEQxLCAweDYwLCAweDAwLCAweEVBLCAweDBCLCAweEYyLCAweEZGLCAweEZGLCAweDdGLCAweEI0LCAweDBDLCAweEYwLCAweDA0LCAweDAyLAorCSAweDY0LCAweDQ2LCAweDAwLCAweEYwLCAweDA0LCAweDY0LCAweDIyLCAweDQ2LCAweDAzLCAweEZBLCAweDYwLCAweDQxLCAweDY0LCAweDQ2LCAweDAxLCAweEYyLAorCSAweEZDLCAweEExLCAweDYxLCAweDQ1LCAweEQ0LCAweDg0LCAweEZGLCAweEZGLCAweDA4LCAweDAyLCAweDAwLCAweEYwLCAweDA0LCAweDYzLCAweDY0LCAweDQ2LAorCSAweDAxLCAweEYyLCAweDIyLCAweDQ2LCAweDFBLCAweEZBLCAweDAzLCAweEZDLCAweDAyLCAweDAwLCAweDIyLCAweDQ2LCAweDFBLCAweEZBLCAweDM1LCAweEYyLAorCSAweDA0LCAweEY4LCAweERDLCAweDg0LCAweDM1LCAweEZBLCAweDE0LCAweEYyLCAweDBGLCAweEI1LCAweDBGLCAweEI0LCAweENDLCAweDg0LCAweDk0LCAweDgwLAorCSAweDA0LCAweDYwLCAweDAwLCAweDY1LCAweDJBLCAweEYyLCAweDAxLCAweDAyLCAweDk0LCAweDg0LCAweDJBLCAweEZBLCAweDk1LCAweEZDLCAweDA2LCAweDAwLAorCSAweEM0LCAweDNBLCAweDA3LCAweDAwLCAweDI3LCAweDQ0LCAweEZELCAweEI0LCAweDQwLCAweDQ3LCAweEE4LCAweEUyLCAweEE1LCAweDYwLCAweDFDLCAweDc4LAorCSAweEZGLCAweEZGLCAweDI4LCAweDQ0LCAweDA0LCAweDI2LCAweDA1LCAweDAwLCAweDY4LCAweDNBLCAweDAzLCAweDAwLCAweDMyLCAweDQ0LCAweDAwLCAweDI3LAorCSAweDAzLCAweDAwLCAweEEzLCAweDYwLCAweEY0LCAweDc4LCAweEZGLCAweEZGLCAweDBBLCAweDY0LCAweDNBLCAweERCLCAweEEzLCAweDYwLCAweEY0LCAweDc4LAorCSAweEZGLCAweEZGLCAweDBFLCAweDY0LCAweDNBLCAweERCLCAweDNDLCAweDQ0LCAweDYwLCAweDQ2LCAweDFFLCAweEYwLCAweDQwLCAweDQyLCAweDY0LCAweDQwLAorCSAweDQwLCAweDI3LCAweDQ4LCAweDAwLCAweDFGLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDQwLCAweDI3LCAweDNDLCAweDAwLCAweDgwLCAweDJCLAorCSAweDBCLCAweDAwLCAweEJGLCAweDYwLCAweEZGLCAweDY1LCAweDI5LCAweDQ0LCAweDI0LCAweDg5LCAweDgwLCAweDYwLCAweDAwLCAweDY1LCAweDI5LCAweDQ0LAorCSAweDM0LCAweDg5LCAweDgwLCAweDYwLCAweDAwLCAweDYzLCAweDA1LCAweDAwLCAweDNGLCAweDYwLCAweEZGLCAweDY1LCAweDI5LCAweDQ0LCAweDI0LCAweDg5LAorCSAweDAwLCAweDYzLCAweDFFLCAweEYyLCAweDM5LCAweEYxLCAweEMwLCAweDYwLCAweEZGLCAweEI1LCAweDBBLCAweDE4LCAweDYwLCAweDQ3LCAweDFGLCAweEI0LAorCSAweEQwLCAweDg0LCAweEUwLCAweEEwLCAweDAyLCAweDBELCAweDAwLCAweDY0LCAweDAyLCAweDAwLCAweDAxLCAweDA0LCAweDFGLCAweDY0LCAweDYwLCAweDQ3LAorCSAweEI0LCAweDg0LCAweDA3LCAweDYwLCAweEVBLCAweEYxLCAweDNDLCAweDk0LCAweEIwLCAweDg0LCAweDYwLCAweDRDLCAweDI5LCAweDYwLCAweEMwLCAweDY1LAorCSAweDYwLCAweDQ3LCAweDFGLCAweEI0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDVBLCAweEQxLCAweDAxLCAweDYwLCAweDAwLCAweEUxLAorCSAweDA1LCAweDYwLCAweDY5LCAweDZCLCAweDYwLCAweDRDLCAweEI1LCAweEZGLCAweDY0LCAweDRDLCAweDdDLCAweDQ0LCAweDI5LCAweDQwLCAweDgwLCAweDJCLAorCSAweDY3LCAweDQ0LCAweDYwLCAweDRDLCAweDMyLCAweDAwLCAweDE5LCAweDYwLCAweDdCLCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDA0LCAweDI2LAorCSAweENCLCAweDAxLCAweEJGLCAweDAxLCAweDQwLCAweDYwLCAweDAwLCAweDY1LCAweDI5LCAweDQ0LCAweDM0LCAweDg5LCAweDQwLCAweDYwLCAweDAwLCAweDYzLAorCSAweDlGLCAweEYyLCAweDFFLCAweEYyLCAweDM5LCAweEYxLCAweEMwLCAweDYwLCAweEZGLCAweEI1LCAweDBBLCAweDE4LCAweDYwLCAweDQ3LCAweDFGLCAweEI0LAorCSAweEQwLCAweDg0LCAweEUwLCAweEEwLCAweDAyLCAweDBELCAweDAwLCAweDY0LCAweDAyLCAweDAwLCAweDAxLCAweDA0LCAweDFGLCAweDY0LCAweDYwLCAweDQ3LAorCSAweEI0LCAweDg0LCAweDA3LCAweDYwLCAweEVBLCAweEYxLCAweDNDLCAweDk0LCAweEIwLCAweDgxLCAweDYxLCAweDRDLCAweDI5LCAweDYwLCAweEMwLCAweDY1LAorCSAweDYxLCAweDQ3LCAweDFGLCAweEI0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDVBLCAweEQxLCAweDAxLCAweDYwLCAweDAwLCAweEUxLAorCSAweDAxLCAweDYwLCAweDA5LCAweDZCLCAweDYwLCAweDRDLCAweEI1LCAweEZGLCAweDY0LCAweDRDLCAweDQwLCAweEUxLCAweDAxLCAweDYwLCAweDA4LCAweEUxLAorCSAweDg0LCAweEZGLCAweEMyLCAweDYwLCAweDQ1LCAweDY0LCAweDQwLCAweDQyLCAweDgyLCAweEZGLCAweDJBLCAweEYyLCAweDEwLCAweDYwLCAweDAwLCAweDY1LAorCSAweEE0LCAweDg0LCAweEI0LCAweEJDLCAweDFFLCAweEYwLCAweDQwLCAweDQ4LCAweDY0LCAweDQwLCAweDQwLCAweDI3LCAweDE3LCAweDAwLCAweDFDLCAweEYyLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDBBLCAweDM2LCAweDA2LCAweDAwLCAweDE0LCAweDM2LCAweDA3LCAweDAwLCAweDM3LCAweDM2LCAweDA4LCAweDAwLAorCSAweDZFLCAweDM2LCAweDA5LCAweDAwLCAweDcwLCAweDdDLCAweEEwLCAweDYzLCAweDBGLCAweDAwLCAweDM4LCAweDdDLCAweDUwLCAweDYzLCAweDBDLCAweDAwLAorCSAweDE1LCAweDdDLCAweDFFLCAweDYzLCAweDA5LCAweDAwLCAweDBCLCAweDdDLCAweDBGLCAweDYzLCAweDA2LCAweDAwLCAweDlDLCAweEY0LCAweEZGLCAweDY1LAorCSAweDYzLCAweDQ3LCAweEE0LCAweDlDLCAweEE3LCAweDg0LCAweDIzLCAweDAwLCAweDQwLCAweDQ1LCAweDQzLCAweDRELCAweDAwLCAweEUxLCAweEYwLCAweEZFLAorCSAweDI5LCAweDQwLCAweDgwLCAweDJCLCAweDAzLCAweDAwLCAweDAwLCAweDYwLCAweDZBLCAweDY1LCAweDAyLCAweDAwLCAweDAwLCAweDYwLCAweENBLCAweDY1LAorCSAweDFGLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDQwLCAweDI3LCAweDBFLCAweDAwLCAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLAorCSAweDA0LCAweDI3LCAweDAzLCAweDAwLCAweDY1LCAweDQ0LCAweEUwLCAweDg1LCAweDEyLCAweDAwLCAweDJCLCAweEYyLCAweDExLCAweEYwLCAweEMwLCAweDg0LAorCSAweEQwLCAweDg0LCAweEM0LCAweDgzLCAweDExLCAweDAwLCAweDFFLCAweDY0LCAweEM0LCAweDg0LCAweDYwLCAweDQ1LCAweDA4LCAweDAwLCAweDQwLCAweDQ1LAorCSAweEZGLCAweDYwLCAweEY4LCAweDY0LCAweDQwLCAweDQzLCAweDAwLCAweEUxLCAweEYwLCAweEZFLCAweDAwLCAweDYwLCAweDNDLCAweDY1LCAweDkxLCAweEY0LAorCSAweDFCLCAweEYwLCAweEMzLCAweDg0LCAweEM0LCAweDg0LCAweEMwLCAweDgzLCAweDI4LCAweDQ0LCAweEExLCAweEZGLCAweDEyLCAweDc0LCAweDgwLCAweDRFLAorCSAweDEyLCAweDc0LCAweDgzLCAweDRDLCAweDlBLCAweEZGLCAweDEyLCAweDc0LCAweDU2LCAweDYyLCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LAorCSAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDVDLCAweDYyLCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LAorCSAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweEExLCAweEZGLCAweDk4LCAweEZGLCAweEIyLCAweDYwLCAweDU4LCAweDRGLCAweDJELCAweDc4LCAweEZGLCAweEZGLAorCSAweEJDLCAweEZGLCAweEI1LCAweEZGLCAweDAxLCAweDYwLCAweDE4LCAweEUxLCAweDQ3LCAweEZGLCAweDI3LCAweDQ0LCAweDAyLCAweEJDLCAweDQwLCAweDQ3LAorCSAweDM2LCAweEYzLCAweEI2LCAweEZGLCAweEI3LCAweEZGLCAweEI0LCAweEZGLCAweEM4LCAweDYwLCAweDA5LCAweDdELCAweDdDLCAweDRCLCAweDYwLCAweDU2LAorCSAweEFELCAweEUyLCAweEE1LCAweDYwLCAweDc5LCAweDc4LCAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweDdCLCAweEYzLCAweDE5LCAweDYwLCAweDNCLCAweEYzLAorCSAweDYwLCAweDQwLCAweDA0LCAweDI2LCAweDBCLCAweDAwLCAweDA3LCAweEI0LCAweDYwLCAweDQwLCAweDAxLCAweDM2LCAweDA3LCAweDAwLCAweDI5LCAweDQ0LAorCSAweEJGLCAweDYwLCAweEZGLCAweEI3LCAweDgwLCAweEJGLCAweDQwLCAweDQ5LCAweDgwLCAweDY3LCAweDA1LCAweDAwLCAweDNGLCAweDYwLCAweEZGLCAweDY1LAorCSAweDI5LCAweDQ0LCAweDI0LCAweDg5LCAweDAwLCAweDY0LCAweDE2LCAweDYwLCAweDUwLCAweEYxLCAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweDU1LCAweEY5LAorCSAweDM5LCAweEYxLCAweDE2LCAweDYwLCAweDNDLCAweEYxLCAweDY0LCAweDQxLCAweDY0LCAweDVFLCAweDYwLCAweDQ1LCAweDY0LCAweDQ3LCAweDFGLCAweEI0LAorCSAweDU0LCAweDk0LCAweEUwLCAweEEwLCAweDAyLCAweDBELCAweDAwLCAweDY0LCAweDAyLCAweDAwLCAweDAxLCAweDA0LCAweDFGLCAweDY0LCAweDYwLCAweDQ3LAorCSAweDA3LCAweDYwLCAweEVBLCAweEYxLCAweEI0LCAweDg0LCAweEIwLCAweDhDLCAweDI5LCAweDYwLCAweEMwLCAweDdDLCAweDYwLCAweDQ3LCAweDFGLCAweEI0LAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDQwLCAweEQzLCAweDVBLCAweEQxLCAweDAxLCAweDYwLCAweDAwLCAweEUxLCAweDA1LCAweDYwLCAweDY5LCAweDZCLAorCSAweDYwLCAweDRDLCAweEI1LCAweEZGLCAweDY0LCAweDRDLCAweDdDLCAweDQ0LCAweDI5LCAweDQwLCAweDgwLCAweDJCLCAweDY3LCAweDQ0LCAweDYwLCAweDRDLAorCSAweDQwLCAweEUxLCAweDAxLCAweDYwLCAweDA4LCAweEUxLCAweDg0LCAweEZGLCAweEMyLCAweDYwLCAweDQ1LCAweDY0LCAweDQwLCAweDQyLCAweDgyLCAweEZGLAorCSAweDNDLCAweDQ0LCAweDYwLCAweDQ2LCAweDQwLCAweDQyLCAweDEzLCAweDY0LCAweDNBLCAweERCLCAweDEwLCAweDYwLCAweDAwLCAweDY1LCAweDNDLCAweDQ2LAorCSAweDJBLCAweEYyLCAweDE5LCAweDYwLCAweDNCLCAweEYxLCAweEE0LCAweDg0LCAweEM0LCAweEJDLCAweDQwLCAweDQ4LCAweDY0LCAweDQ0LCAweDA0LCAweDI2LAorCSAweDA5LCAweDAwLCAweDAyLCAweDI2LCAweDBBLCAweDAwLCAweDAxLCAweDI2LCAweDBCLCAweDAwLCAweDA4LCAweDJBLCAweDAzLCAweDAwLCAweDBCLCAweDYzLAorCSAweDZFLCAweDY0LCAweDA4LCAweDAwLCAweDE1LCAweDYzLCAweDM3LCAweDY0LCAweDA1LCAweDAwLCAweDM4LCAweDYzLCAweDE0LCAweDY0LCAweDAyLCAweDAwLAorCSAweDcwLCAweDYzLCAweDBBLCAweDY0LCAweDQzLCAweDRELCAweDQwLCAweDQ1LCAweDAwLCAweEUxLCAweEYwLCAweEZFLCAweDAwLCAweDYwLCAweDFFLCAweDY0LAorCSAweDFCLCAweEYwLCAweDExLCAweEYwLCAweEMwLCAweDg0LCAweEMwLCAweDg0LCAweDYwLCAweDQzLCAweDI4LCAweDQ0LCAweEExLCAweEZGLCAweDEyLCAweDc0LAorCSAweDgwLCAweDRFLCAweDEyLCAweDc0LCAweDgzLCAweDRDLCAweDlBLCAweEZGLCAweDEyLCAweDc0LCAweDVDLCAweDYyLCAweDdBLCAweEQ0LCAweDEyLCAweDc0LAorCSAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweEExLCAweEZGLCAweDk4LCAweEZGLCAweEIyLCAweDYwLCAweDU4LCAweDRGLAorCSAweDJELCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDYwLCAweDE4LCAweEUxLCAweDc4LCAweDQ0LCAweDAzLCAweEE0LCAweDM1LCAweEZCLCAweEIyLCAweDYwLAorCSAweDcwLCAweDc4LCAweEZGLCAweEZGLCAweEM0LCAweEUyLCAweDA4LCAweDY0LCAweDNBLCAweERCLCAweEE0LCAweDYwLCAweEJGLCAweDc4LCAweEZGLCAweEZGLAorCSAweDI2LCAweDQzLCAweDI0LCAweDQwLCAweDAxLCAweDJBLCAweDBFLCAweDAwLCAweDFELCAweEZGLCAweDI2LCAweDQ0LCAweDAyLCAweEJDLCAweDQwLCAweDQ2LAorCSAweDI3LCAweDQ0LCAweDA3LCAweDIyLCAweDA1LCAweDAwLCAweEY4LCAweEI0LCAweDQwLCAweDQ3LCAweDA2LCAweDY0LCAweDMxLCAweEZCLCAweEMwLCAweEZFLAorCSAweDMwLCAweEYxLCAweDgxLCAweDAwLCAweEZDLCAweEIzLCAweDMyLCAweDQwLCAweDAxLCAweDJBLCAweDA2LCAweDAwLCAweDBBLCAweEJCLCAweDBGLCAweEZDLAorCSAweENCLCAweEZFLCAweEEzLCAweDYwLCAweEY0LCAweDc4LCAweEZGLCAweEZGLCAweDI0LCAweDQ0LCAweDA0LCAweDI2LCAweDI5LCAweDAwLCAweDBGLCAweEZDLAorCSAweDA1LCAweEZGLCAweERCLCAweEYzLCAweDI4LCAweDQwLCAweDgwLCAweDNBLCAweDIzLCAweDAwLCAweDYwLCAweDQwLCAweDAzLCAweDNBLCAweDIwLCAweDAwLAorCSAweDMyLCAweEYyLCAweDdGLCAweEYxLCAweDMzLCAweEYyLCAweEQwLCAweDgwLCAweDgwLCAweEYxLCAweDFBLCAweDAyLCAweEQwLCAweDgwLCAweDM0LCAweEYyLAorCSAweDgxLCAweEYxLCAweDE2LCAweDAyLCAweEQwLCAweDgwLCAweDNDLCAweDQ0LCAweDEzLCAweDAyLCAweEFDLCAweDg2LCAweEJCLCAweEZFLCAweDEwLCAweDAzLAorCSAweDJBLCAweEYyLCAweDIxLCAweDQ2LCAweDYwLCAweDQwLCAweDgwLCAweDNBLCAweDBCLCAweDAwLCAweDAxLCAweDY0LCAweDMxLCAweEZCLCAweEMwLCAweEZFLAorCSAweDAwLCAweDY0LCAweDMyLCAweEZCLCAweDQzLCAweEZGLCAweDg0LCAweEZGLCAweEMyLCAweDYwLCAweDQ1LCAweDY0LCAweDQwLCAweDQyLCAweDgyLCAweEZGLAorCSAweDMwLCAweEYxLCAweDI3LCAweDQ0LCAweDA1LCAweDIyLCAweDM0LCAweDAwLCAweEZBLCAweEI0LCAweDQwLCAweDQ3LCAweDI0LCAweDQ0LCAweDEwLCAweDJBLAorCSAweDJCLCAweDAwLCAweDI4LCAweDQwLCAweEQ0LCAweDNBLCAweDI4LCAweDAwLCAweDMxLCAweDQwLCAweDA4LCAweDI2LCAweDAwLCAweDdDLCAweDI5LCAweDQwLAorCSAweDUwLCAweDJCLCAweDBELCAweDAwLCAweEVGLCAweDYwLCAweEZGLCAweDY1LCAweDI5LCAweDQ0LCAweDI0LCAweDg5LCAweDMxLCAweDQwLCAweDA4LCAweDJBLAorCSAweDA2LCAweDAwLCAweDFDLCAweDYwLCAweDExLCAweEYzLCAweEZGLCAweEZGLCAweEUwLCAweDg1LCAweDJCLCAweDQ0LCAweDA1LCAweDA1LCAweDJCLCAweDQ0LAorCSAweEZGLCAweEE0LCAweDAxLCAweEE0LCAweDA0LCAweDI0LCAweDAwLCAweDY0LCAweEQwLCAweDgwLCAweDcwLCAweDQ1LCAweDAyLCAweDI4LCAweDY0LCAweDQ0LAorCSAweEM0LCAweDg0LCAweEZGLCAweEZGLCAweDA0LCAweDI0LCAweDAwLCAweEI0LCAweDYwLCAweDUwLCAweDA4LCAweDI4LCAweDAxLCAweDAwLCAweDIwLCAweDI5LAorCSAweDZELCAweEUyLCAweEE1LCAweDYwLCAweDdGLCAweDc4LCAweEZGLCAweEZGLCAweDAyLCAweDY0LCAweDMxLCAweEZCLCAweEMwLCAweEZFLCAweDA3LCAweDAwLAorCSAweDAyLCAweDJBLCAweDA1LCAweDAwLCAweEZELCAweEI0LCAweDQwLCAweDQ3LCAweDA2LCAweDY0LCAweDMxLCAweEZCLCAweEMwLCAweEZFLCAweDA1LCAweDY0LAorCSAweDNBLCAweERCLCAweDI4LCAweDQ0LCAweEE0LCAweDNBLCAweDA3LCAweDAwLCAweDAxLCAweDYwLCAweDAyLCAweDdDLCAweDI1LCAweDQ0LCAweDBBLCAweDNBLAorCSAweDAyLCAweDAwLCAweDAxLCAweDYwLCAweDNBLCAweDdDLCAweDMxLCAweDQwLCAweDA4LCAweDI2LCAweDAwLCAweDdDLCAweDI5LCAweDQwLCAweDUwLCAweDJCLAorCSAweDBELCAweDAwLCAweEVGLCAweDYwLCAweEZGLCAweDY1LCAweDI5LCAweDQ0LCAweDI0LCAweDg5LCAweDMxLCAweDQwLCAweDA4LCAweDJBLCAweDA2LCAweDAwLAorCSAweDFDLCAweDYwLCAweDExLCAweEYzLCAweEZGLCAweEZGLCAweEUwLCAweDg1LCAweDJCLCAweDQ0LCAweDA1LCAweDA1LCAweDJCLCAweDQ0LCAweEZGLCAweEE0LAorCSAweDAxLCAweEE0LCAweDA0LCAweDI0LCAweDAwLCAweDY0LCAweEQwLCAweDgwLCAweDcwLCAweDQ1LCAweDAyLCAweDI4LCAweDY0LCAweDQ0LCAweEM0LCAweDg0LAorCSAweEZGLCAweEZGLCAweDA0LCAweDI0LCAweDAwLCAweEI0LCAweDI4LCAweDQwLCAweEU0LCAweDM2LCAweDAwLCAweEI0LCAweDYwLCAweDUwLCAweDA4LCAweDI4LAorCSAweDAxLCAweDAwLCAweDIwLCAweDI5LCAweDZELCAweEUyLCAweEEzLCAweDYwLCAweEU3LCAweDc4LCAweEZGLCAweEZGLCAweDI3LCAweDQ0LCAweDA1LCAweDIyLAorCSAweDA5LCAweDAwLCAweEJBLCAweEI0LCAweDQwLCAweDQ3LCAweDNDLCAweDQ2LCAweDAyLCAweDY0LCAweDMxLCAweEZCLCAweEMwLCAweEZFLCAweEEzLCAweDYwLAorCSAweEY0LCAweDc4LCAweEZGLCAweEZGLCAweDI3LCAweDQ0LCAweDAyLCAweDJBLCAweDA2LCAweDAwLCAweEZELCAweEI0LCAweDQwLCAweDQ3LCAweDA2LCAweDY0LAorCSAweDMxLCAweEZCLCAweEMwLCAweEZFLCAweEY0LCAweDAxLCAweEYzLCAweDBBLCAweDdDLCAweDUwLCAweDZELCAweEUyLCAweEYwLCAweDAxLCAweDcyLCAweDQ1LAorCSAweERDLCAweDg0LCAweEIyLCAweEZCLCAweDExLCAweDY0LCAweDNBLCAweERCLCAweEIzLCAweEYzLCAweDA2LCAweDA0LCAweERDLCAweDg0LCAweEIzLCAweEZCLAorCSAweEI0LCAweEYzLCAweDAyLCAweDA0LCAweERDLCAweDg0LCAweEI0LCAweEZCLCAweEE0LCAweDYwLCAweDAxLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYxLAorCSAweDEyLCAweDY0LCAweDNBLCAweERCLCAweDIwLCAweDYwLCAweDA0LCAweDYzLCAweEJELCAweEQzLCAweDcyLCAweDQ1LCAweDQ0LCAweDhBLCAweDAyLCAweDI4LAorCSAweDAzLCAweDAwLCAweEU0LCAweEUyLCAweERELCAweDgxLCAweDA0LCAweDAwLCAweDAyLCAweDI4LCAweDAyLCAweDAwLCAweEU0LCAweEUyLCAweERELCAweDgxLAorCSAweEJELCAweEQzLCAweEIyLCAweEYxLCAweDYxLCAweDQ1LCAweEMwLCAweDg0LCAweDAwLCAweDYxLCAweDAyLCAweDI0LCAweDAxLCAweEI5LCAweEM0LCAweDg0LAorCSAweDYwLCAweDU1LCAweDJBLCAweDUyLCAweEU0LCAweEUyLCAweEIyLCAweEZCLCAweDAyLCAweDI0LCAweDAxLCAweEI5LCAweEJELCAweEQzLCAweEIzLCAweEYxLAorCSAweDYxLCAweDQ1LCAweEMwLCAweDg0LCAweDAwLCAweDYxLCAweDAyLCAweDI0LCAweDAxLCAweEI5LCAweEM0LCAweDg0LCAweEIzLCAweEZCLCAweDAyLCAweDI0LAorCSAweDAxLCAweEI5LCAweEJELCAweEQzLCAweEI0LCAweEYxLCAweDYxLCAweDQ1LCAweEMwLCAweDg0LCAweEM0LCAweDg0LCAweEI0LCAweEZCLCAweEE1LCAweDYwLAorCSAweDE0LCAweDc4LCAweEZGLCAweEZGLCAweEIwLCAweDYwLCAweDlFLCAweDc4LCAweEZGLCAweEZGLCAweDQ3LCAweEZGLCAweDFCLCAweDYwLCAweEVFLCAweEYzLAorCSAweEZGLCAweEZGLCAweDA0LCAweDE4LCAweEFFLCAweDRGLCAweDA4LCAweEJDLCAweDAwLCAweDdGLCAweEEwLCAweDVFLCAweEM4LCAweDc0LCAweENELCAweEUyLAorCSAweEFBLCAweDYwLCAweEI5LCAweDc4LCAweDAwLCAweDYxLCAweEEzLCAweDYwLCAweEY0LCAweDc4LCAweEZGLCAweEZGLCAweEFCLCAweDYwLCAweEU4LCAweDc4LAorCSAweEZGLCAweEZGLCAweDIxLCAweDQ2LCAweDVDLCAweDQ0LCAweDI2LCAweDQ0LCAweDAyLCAweDI2LCAweDAxLCAweDAwLCAweDNFLCAweDQ2LCAweDA5LCAweEYyLAorCSAweDQ2LCAweDQxLCAweDY2LCAweDQwLCAweEYzLCAweDE4LCAweDQwLCAweDVFLCAweEZELCAweEZCLCAweDAyLCAweDY0LCAweDQwLCAweDQ2LCAweDQxLCAweDVELAorCSAweDAwLCAweDY0LCAweDMxLCAweEZBLCAweDAwLCAweEYyLCAweDQ2LCAweDQ1LCAweDg3LCAweEZDLCAweEFDLCAweEUyLCAweDAxLCAweDY0LCAweDMzLCAweEZCLAorCSAweDMyLCAweDQwLCAweDAxLCAweDJBLCAweDIxLCAweDAwLCAweDE5LCAweEYzLCAweDAxLCAweDYwLCAweDFFLCAweEUxLCAweDFELCAweDE4LCAweDgwLCAweDY0LAorCSAweDQwLCAweDQ5LCAweDAwLCAweEUxLCAweDE5LCAweEZGLCAweDA4LCAweDY0LCAweDJBLCAweEZBLCAweDVBLCAweERBLCAweDJDLCAweEZBLCAweDVBLCAweERBLAorCSAweDVBLCAweERBLCAweEYxLCAweEYzLCAweEZGLCAweEZGLCAweDAyLCAweEJDLCAweEYxLCAweEZCLCAweDcyLCAweDQ0LCAweDI0LCAweEZBLCAweEIyLCAweEYzLAorCSAweDI1LCAweEZBLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweEI2LCAweEZGLCAweEI3LCAweEZGLCAweEI0LCAweEZGLCAweEM4LCAweDYwLCAweDA5LCAweDdELAorCSAweDdDLCAweDRCLCAweEEzLCAweDYwLCAweEY0LCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweEUxLCAweDAxLCAweDYwLCAweDFBLCAweEUxLCAweDNGLCAweDYwLAorCSAweENGLCAweDY1LCAweDI5LCAweDQ0LCAweDI0LCAweDg5LCAweDJFLCAweDQ0LCAweDAwLCAweDM2LCAweDQ4LCAweDAwLCAweDAxLCAweDNBLCAweEU1LCAweDAwLAorCSAweDg4LCAweEZGLCAweDQwLCAweDY3LCAweDI5LCAweDQ1LCAweDM0LCAweDg5LCAweDA0LCAweDY0LCAweDg5LCAweEZGLCAweDYwLCAweDU0LCAweDg4LCAweEZGLAorCSAweEExLCAweEZGLCAweDZDLCAweDQ1LCAweDY1LCAweDQ0LCAweDBGLCAweEI0LCAweDQwLCAweDQ1LCAweDFDLCAweEZBLCAweDY1LCAweDQ0LCAweDI5LCAweDQxLAorCSAweEY5LCAweDgxLCAweDUyLCAweDRBLCAweDcxLCAweDg5LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDgzLCAweDFELCAweEZDLAorCSAweDFCLCAweEZDLCAweDEwLCAweDYwLCAweDAwLCAweDY1LCAweDI5LCAweDQ0LCAweDM0LCAweDg5LCAweDUwLCAweDRCLCAweDY3LCAweDUwLCAweDY5LCAweEUyLAorCSAweEI2LCAweEYxLCAweEZDLCAweEEzLCAweEQzLCAweDgwLCAweDQzLCAweDQzLCAweDAzLCAweDA0LCAweEFCLCAweDYwLCAweERFLCAweDc4LCAweEZGLCAweEZGLAorCSAweDA5LCAweDdDLCAweEQzLCAweDgwLCAweDlBLCAweEZGLCAweDAzLCAweDA3LCAweEFCLCAweDYwLCAweERFLCAweDc4LCAweEZGLCAweEZGLCAweDI1LCAweDQ0LAorCSAweDAxLCAweDI2LCAweDBGLCAweEFDLCAweDI2LCAweDYwLCAweDRBLCAweDY1LCAweDQ0LCAweEQzLCAweDEyLCAweDY1LCAweDQ1LCAweDQ2LCAweDYwLCAweDQ3LAorCSAweDQwLCAweDdGLCAweDI3LCAweEZBLCAweDhGLCAweEZDLCAweDE4LCAweDYxLCAweEVBLCAweEYxLCAweEExLCAweEZGLCAweDZDLCAweDQ0LCAweERDLCAweDgwLAorCSAweEZGLCAweEZGLCAweDIxLCAweDAzLCAweDUwLCAweEZFLCAweEFDLCAweDYwLCAweEMxLCAweDc4LCAweEZGLCAweEZGLCAweEM4LCAweDYwLCAweDBCLCAweDdELAorCSAweDA4LCAweDYwLCAweDAwLCAweDZCLCAweEI1LCAweEZGLCAweEI3LCAweEZGLCAweEI0LCAweEZGLCAweEFBLCAweDc0LCAweENELCAweEUyLCAweDAxLCAweDY0LAorCSAweDg5LCAweEZGLCAweDYwLCAweDU0LCAweDg4LCAweEZGLCAweDAxLCAweDYwLCAweDA4LCAweEUxLCAweDA1LCAweEUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLAorCSAweDA0LCAweDI1LCAweDhCLCAweDAwLCAweDZDLCAweDQ0LCAweDBBLCAweDM2LCAweDA3LCAweDAwLCAweDE0LCAweDM2LCAweDA1LCAweDAwLCAweDM3LCAweDM2LAorCSAweDAzLCAweDAwLCAweDZFLCAweDM2LCAweDAxLCAweDAwLCAweDgxLCAweDAwLCAweDQwLCAweDQ1LCAweDMyLCAweDc0LCAweEExLCAweEZGLCAweDFDLCAweEZBLAorCSAweDQwLCAweDRFLCAweDhDLCAweDQ0LCAweDYwLCAweDQzLCAweDFELCAweEZBLCAweDAxLCAweEUxLCAweDIwLCAweDY0LCAweDNBLCAweERCLCAweDJFLCAweDQ0LAorCSAweDE0LCAweDM2LCAweDEyLCAweDAwLCAweDBBLCAweDM2LCAweDBGLCAweDAwLCAweDYzLCAweDQ1LCAweEUzLCAweDgzLCAweEUzLCAweDgzLCAweEM3LCAweDgzLAorCSAweEUzLCAweDgzLCAweEM3LCAweDgzLCAweEZGLCAweEZGLCAweDM3LCAweDM2LCAweDA1LCAweDAwLCAweDZFLCAweDM2LCAweDA0LCAweDAwLCAweEFDLCAweDYwLAorCSAweEJGLCAweDc4LCAweEZGLCAweEZGLCAweEVCLCAweDgzLCAweEVCLCAweDgzLCAweEVCLCAweDgzLCAweEVCLCAweDgzLCAweEZGLCAweEZGLCAweDgwLCAweDI3LAorCSAweENGLCAweDgzLCAweDFCLCAweEZDLCAweDAxLCAweDY0LCAweDUxLCAweEZCLCAweEExLCAweEZGLCAweDI5LCAweDQxLCAweEY5LCAweDgxLCAweDUyLCAweDRBLAorCSAweDcxLCAweDg5LCAweDJFLCAweDQ0LCAweDI3LCAweEZBLCAweEI2LCAweEYxLCAweEZDLCAweEEzLCAweEQzLCAweDgwLCAweDQzLCAweDQzLCAweDAzLCAweDA0LAorCSAweEFCLCAweDYwLCAweERFLCAweDc4LCAweEZGLCAweEZGLCAweDlBLCAweEZGLCAweDU0LCAweDYzLCAweDEyLCAweDY0LCAweDQwLCAweDQ2LCAweDhGLCAweEZDLAorCSAweDE4LCAweDYxLCAweEVBLCAweEYxLCAweDUwLCAweEZFLCAweDZDLCAweDQwLCAweDlFLCAweDE1LCAweDAxLCAweDYwLCAweDA4LCAweEUxLCAweDgwLCAweEUxLAorCSAweDAwLCAweDY0LCAweDMzLCAweEZCLCAweDI5LCAweDQwLCAweDUwLCAweDJCLCAweDBGLCAweDAwLCAweDJCLCAweDQ0LCAweDcwLCAweDQ1LCAweEM0LCAweDg0LAorCSAweEZGLCAweEZGLCAweDA0LCAweDI0LCAweDAwLCAweEI0LCAweDYwLCAweDUwLCAweDA4LCAweDI4LCAweDAxLCAweDAwLCAweDIwLCAweDI5LCAweDZELCAweEUyLAorCSAweEVGLCAweDYwLCAweEZGLCAweDY1LCAweDI5LCAweDQ0LCAweDI0LCAweDg5LCAweDAxLCAweDYwLCAweDE4LCAweEUxLCAweDAxLCAweDExLCAweDEyLCAweDAwLAorCSAweDI5LCAweDQ0LCAweDIwLCAweEJDLCAweDQwLCAweDQ5LCAweDAxLCAweDY0LCAweDMzLCAweEZCLCAweEI2LCAweEZGLCAweDAwLCAweEUxLCAweDAxLCAweDYwLAorCSAweDFBLCAweEUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDZDLCAweDQwLCAweEZDLCAweDExLCAweDAxLCAweDYwLCAweDE4LCAweEUxLCAweEFFLCAweDRGLAorCSAweEY3LCAweEI0LCAweEEwLCAweDVFLCAweEI1LCAweEZGLCAweEI2LCAweEZGLCAweEI3LCAweEZGLCAweEI0LCAweEZGLCAweEM4LCAweDYwLCAweDA5LCAweDdELAorCSAweDdDLCAweDRCLCAweDM1LCAweEUxLCAweEFDLCAweEUyLCAweEFBLCAweDYwLCAweDQ2LCAweDc4LCAweEZGLCAweEZGLCAweDE2LCAweDYwLCAweDdGLCAweEYzLAorCSAweEZGLCAweEZGLCAweERDLCAweDg0LCAweDAwLCAweDM2LCAweDAwLCAweDNCLCAweEEyLCAweERCLCAweDIxLCAweDY0LCAweDNBLCAweERCLCAweEJELCAweDAxLAorCSAweEFDLCAweEUyLCAweDAxLCAweDY0LCAweDMzLCAweEZCLCAweDAxLCAweEUxLCAweDNGLCAweDYwLCAweENGLCAweDY1LCAweDI5LCAweDQ0LCAweDI0LCAweDg5LAorCSAweDJFLCAweDQ0LCAweDAwLCAweDM2LCAweDIxLCAweDAwLCAweDAxLCAweDNBLCAweEYwLCAweDAxLCAweDg4LCAweEZGLCAweDQwLCAweDY3LCAweDI5LCAweDQ1LAorCSAweDM0LCAweDg5LCAweEExLCAweEZGLCAweDZDLCAweDQ1LCAweDY1LCAweDQ0LCAweDBGLCAweEI0LCAweDQwLCAweDQ1LCAweDY1LCAweDQ0LCAweDI5LCAweDQxLAorCSAweEY5LCAweDgxLCAweDUyLCAweDRBLCAweDcxLCAweDg5LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDgzLCAweDBFLCAweDdDLAorCSAweEQzLCAweDgwLCAweEZGLCAweEZGLCAweDAzLCAweDAzLCAweEFCLCAweDYwLCAweERFLCAweDc4LCAweEZGLCAweEZGLCAweEExLCAweEZGLCAweDZDLCAweDQ0LAorCSAweERDLCAweDgwLCAweEZGLCAweEZGLCAweEQyLCAweDAzLCAweDQxLCAweDAwLCAweEM4LCAweDYwLCAweDBCLCAweDdELCAweDA4LCAweDYwLCAweDAwLCAweDZCLAorCSAweEI1LCAweEZGLCAweEI3LCAweEZGLCAweEI0LCAweEZGLCAweEFBLCAweDc0LCAweENELCAweEUyLCAweDAxLCAweDYwLCAweDA4LCAweEUxLCAweDA1LCAweEUxLAorCSAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDA0LCAweDI1LCAweEMxLCAweDAxLCAweDZDLCAweDQ0LCAweDBBLCAweDM2LCAweDA3LCAweDAwLCAweDE0LCAweDM2LAorCSAweDA1LCAweDAwLCAweDM3LCAweDM2LCAweDAzLCAweDAwLCAweDZFLCAweDM2LCAweDAxLCAweDAwLCAweEI3LCAweDAxLCAweDQwLCAweDQ1LCAweDMyLCAweDc0LAorCSAweEExLCAweEZGLCAweDQwLCAweDRFLCAweDhDLCAweDQ0LCAweDYwLCAweDQzLCAweDAxLCAweEUxLCAweDIwLCAweDY0LCAweDNBLCAweERCLCAweDJFLCAweDQ0LAorCSAweDE0LCAweDM2LCAweDA5LCAweDAwLCAweDBBLCAweDM2LCAweDA3LCAweDAwLCAweDM3LCAweDM2LCAweDA1LCAweDAwLCAweDZFLCAweDM2LCAweDAzLCAweDAwLAorCSAweEFDLCAweDYwLCAweEJGLCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDY0LCAweDUxLCAweEZCLCAweEExLCAweEZGLCAweDI5LCAweDQxLCAweEY5LCAweDgxLAorCSAweDUyLCAweDRBLCAweDcxLCAweDg5LCAweDBFLCAweDdDLCAweEQzLCAweDgwLCAweDQzLCAweDQzLCAweDAzLCAweDAzLCAweEFCLCAweDYwLCAweERFLCAweDc4LAorCSAweEZGLCAweEZGLCAweDZDLCAweDQwLCAweEZGLCAweEZGLCAweDAxLCAweDE1LCAweDkwLCAweDAxLCAweDEyLCAweDY0LCAweDQwLCAweDQ2LCAweEVBLCAweEYxLAorCSAweDUwLCAweEZFLCAweEExLCAweEZGLCAweDEyLCAweDYxLCAweDhDLCAweDQ0LCAweEVCLCAweEYwLCAweDQwLCAweDQ4LCAweDhDLCAweDQ0LCAweDMwLCAweEZCLAorCSAweDA0LCAweDYxLCAweDUwLCAweEZFLCAweDhDLCAweDQ0LCAweEQwLCAweDgwLCAweDhDLCAweDQ0LCAweEQ0LCAweDgwLCAweDhDLCAweDQ0LCAweEVDLCAweEYxLAorCSAweDAwLCAweDY1LCAweEQwLCAweDgwLCAweDI4LCAweDQ0LCAweDAxLCAweDBDLCAweDEzLCAweDAwLCAweDEwLCAweDY1LCAweDYwLCAweDQwLCAweEM0LCAweDM2LAorCSAweDA0LCAweDAwLCAweEQ0LCAweDNBLCAweDBELCAweDAwLCAweDI3LCAweDQwLCAweDQwLCAweDI2LCAweDMwLCAweDY1LCAweDM1LCAweDg0LCAweEExLCAweEZGLAorCSAweDhDLCAweDQ0LCAweDQ3LCAweEZGLCAweDUwLCAweDRCLCAweDY3LCAweDUwLCAweDY5LCAweEUyLCAweDZBLCAweDQ0LCAweDQwLCAweDJCLCAweDA5LCAweDE1LAorCSAweDJDLCAweDYwLCAweEVDLCAweDY0LCAweEYxLCAweDYwLCAweDc4LCAweDQxLCAweEU0LCAweDc4LCAweEI1LCAweEYxLCAweDJBLCAweDY0LCAweDNBLCAweERCLAorCSAweDFDLCAweDAxLCAweDI5LCAweDQwLCAweDEwLCAweDI2LCAweDAyLCAweDAwLCAweDA0LCAweDc0LCAweENELCAweEUyLCAweDhDLCAweDQ0LCAweEI2LCAweEZGLAorCSAweEI3LCAweEZGLCAweDAxLCAweDYwLCAweDE4LCAweEUxLCAweDA1LCAweEUxLCAweDAwLCAweDY0LCAweDMzLCAweEZCLCAweEExLCAweEZGLCAweDZDLCAweDQ0LAorCSAweEExLCAweEZGLCAweDZDLCAweDQ0LCAweDI5LCAweDQwLCAweDQwLCAweDJCLCAweDAzLCAweDAwLCAweEI2LCAweEZGLCAweEExLCAweEZGLCAweDZDLCAweDQ0LAorCSAweEExLCAweEZGLCAweDAyLCAweDc0LCAweDI5LCAweDQ0LCAweDQwLCAweDI3LCAweDA1LCAweDc0LCAweENELCAweEUyLCAweEExLCAweEZGLCAweENCLCAweEYzLAorCSAweEM0LCAweEUyLCAweDg5LCAweEZGLCAweDYwLCAweDU0LCAweDg4LCAweEZGLCAweERDLCAweDg0LCAweEUwLCAweDk0LCAweDI2LCAweDQ0LCAweDg0LCAweEJDLAorCSAweDQwLCAweDQ2LCAweDIzLCAweDY0LCAweDNBLCAweERCLCAweEI1LCAweEZGLCAweEJDLCAweEZGLCAweDQ3LCAweEZGLCAweEI2LCAweEZGLCAweEI3LCAweEZGLAorCSAweEI0LCAweEZGLCAweEM4LCAweDYwLCAweDA5LCAweDdELCAweDdDLCAweDRCLCAweEE5LCAweDYwLCAweDg4LCAweDc4LCAweEZGLCAweEZGLCAweDI5LCAweDY0LAorCSAweDNBLCAweERCLCAweEEyLCAweEZDLCAweDMyLCAweDQwLCAweDAxLCAweDJBLCAweEI5LCAweDAwLCAweDAxLCAweDYwLCAweDFBLCAweEUxLCAweDIzLCAweDQzLAorCSAweEExLCAweEZGLCAweEVDLCAweDQ0LCAweDJBLCAweEZBLCAweDQwLCAweDQ4LCAweEExLCAweEZGLCAweDdBLCAweERDLCAweDdFLCAweDM2LCAweDA0LCAweEEyLAorCSAweEZDLCAweDFDLCAweDAzLCAweDFELCAweDAwLCAweDY0LCAweDNGLCAweEZBLCAweDJFLCAweDAwLCAweDAzLCAweDJCLCAweDA0LCAweDAwLCAweEExLCAweEZGLAorCSAweDdBLCAweERDLCAweDdBLCAweERDLCAweDdBLCAweERDLCAweDhGLCAweEIwLCAweDg4LCAweDNBLCAweDAzLCAweDAwLCAweDcwLCAweDYyLCAweEExLCAweEZGLAorCSAweDdBLCAweERDLCAweDI4LCAweDQwLCAweDQwLCAweDJCLCAweDA2LCAweDAwLCAweDcyLCAweDYyLCAweEExLCAweEZGLCAweDdBLCAweERDLCAweDdBLCAweERDLAorCSAweDdBLCAweERDLCAweDdBLCAweERDLCAweDNGLCAweEZDLCAweDAwLCAweEY0LCAweDEwLCAweDYyLCAweDZFLCAweDYxLCAweEExLCAweEZGLCAweDA1LCAweDFELAorCSAweDEyLCAweDFFLCAweDBDLCAweDAwLCAweDAwLCAweEY0LCAweDdDLCAweDYxLCAweDAyLCAweDYyLCAweDdBLCAweERDLCAweDYzLCAweDQwLCAweEZELCAweDFDLAorCSAweEY5LCAweDFELCAweEZGLCAweEIxLCAweDA4LCAweDFFLCAweDAyLCAweDAyLCAweDAwLCAweEY0LCAweDAyLCAweDYyLCAweEI2LCAweEZGLCAweEI3LCAweEZGLAorCSAweEExLCAweEZGLCAweDZDLCAweDQ0LCAweDVBLCAweERBLCAweDk4LCAweEZGLCAweEExLCAweEZGLCAweDZDLCAweDQwLCAweEExLCAweEZGLCAweDQ3LCAweEZGLAorCSAweDdDLCAweDQ0LCAweDMzLCAweEZCLCAweDI2LCAweDQ0LCAweEZELCAweEI0LCAweDg0LCAweEJDLCAweDAxLCAweDE1LCAweDdGLCAweEI0LCAweDQwLCAweDQ2LAorCSAweDZDLCAweDQwLCAweEI2LCAweEZGLCAweEI3LCAweEZGLCAweEExLCAweEZGLCAweDZDLCAweDQ1LCAweEExLCAweEZGLCAweDdGLCAweDYwLCAweDdGLCAweDdDLAorCSAweDZDLCAweDQ0LCAweEEwLCAweDg0LCAweDE1LCAweEE3LCAweDE1LCAweEE0LCAweDIxLCAweDQ2LCAweDI2LCAweEZBLCAweDI5LCAweDQwLCAweDQwLCAweDJCLAorCSAweDA3LCAweDAwLCAweEI2LCAweEZGLCAweDQwLCAweDYwLCAweDAwLCAweDY1LCAweEExLCAweEZGLCAweDZDLCAweDQ0LCAweDFBLCAweEZBLCAweDA5LCAweDAwLAorCSAweDY1LCAweDQ0LCAweDBGLCAweEI0LCAweDA2LCAweEE4LCAweDgwLCAweDYwLCAweDAwLCAweDY1LCAweDA4LCAweDI4LCAweDdDLCAweDQ1LCAweDI5LCAweDQ0LAorCSAweDM0LCAweDg5LCAweDI3LCAweEYwLCAweDY1LCAweDQ0LCAweDY0LCAweDVFLCAweDI3LCAweEZBLCAweDgxLCAweEUxLCAweDAxLCAweDYwLCAweDE4LCAweEUxLAorCSAweDAxLCAweDExLCAweDEyLCAweDAwLCAweDI5LCAweDQ0LCAweDIwLCAweEJDLCAweDQwLCAweDQ5LCAweDAxLCAweDY0LCAweDMzLCAweEZCLCAweEI2LCAweEZGLAorCSAweDAwLCAweEUxLCAweDAxLCAweDYwLCAweDFBLCAweEUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDZDLCAweDQwLCAweEZDLCAweDExLCAweDAxLCAweDYwLAorCSAweDE4LCAweEUxLCAweEFFLCAweDRGLCAweEY3LCAweEI0LCAweEEwLCAweDVFLCAweDAwLCAweDcwLCAweDAwLCAweDY0LCAweDQwLCAweDRCLCAweDIxLCAweDQ2LAorCSAweEI1LCAweEZGLCAweEJDLCAweEZGLCAweDQ3LCAweEZGLCAweEI2LCAweEZGLCAweEI3LCAweEZGLCAweEI0LCAweEZGLCAweEM4LCAweDYwLCAweDA5LCAweDdELAorCSAweDdDLCAweDRCLCAweDI4LCAweDQ0LCAweDA0LCAweDI3LCAweDA5LCAweDAwLCAweEQ0LCAweDM2LCAweDA0LCAweDAwLCAweDBDLCAweDIyLCAweDAyLCAweDAwLAorCSAweDBDLCAweDNBLCAweDAzLCAweDAwLCAweEFFLCAweDRGLCAweEY3LCAweEI0LCAweEEwLCAweDVFLCAweDJBLCAweDQ0LCAweDcyLCAweDQ1LCAweDI0LCAweEZBLAorCSAweEIyLCAweEYzLCAweDA2LCAweDA0LCAweEU0LCAweEUyLCAweERDLCAweDlDLCAweDI5LCAweDQwLCAweDAxLCAweDI2LCAweDY0LCAweDQ0LCAweEIyLCAweEY5LAorCSAweDI1LCAweEZBLCAweEIzLCAweEYzLCAweDAyLCAweDA0LCAweERDLCAweDg0LCAweEIzLCAweEZCLCAweDI4LCAweEZBLCAweEI0LCAweEYzLCAweDAyLCAweDA0LAorCSAweERDLCAweDg0LCAweEI0LCAweEZCLCAweDI5LCAweEZBLCAweEE5LCAweDYwLCAweDg4LCAweDc4LCAweEZGLCAweEZGLCAweEExLCAweEZGLCAweDE5LCAweDYwLAorCSAweEEzLCAweEYzLCAweDEyLCAweDYxLCAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDA4LCAweDAwLCAweDAwLCAweDY0LCAweDNCLCAweEZBLCAweEJGLCAweDYwLAorCSAweEZGLCAweDY1LCAweDhDLCAweDQ0LCAweDNELCAweEZBLCAweEE0LCAweDg0LCAweDAxLCAweDAwLCAweDhDLCAweDQ0LCAweEVCLCAweEYwLCAweDJBLCAweEZBLAorCSAweDQwLCAweDQ4LCAweDA0LCAweDI2LCAweDQ4LCAweDAwLCAweEExLCAweEZGLCAweDhDLCAweDQ0LCAweDVBLCAweERBLCAweDMwLCAweEZCLCAweDZDLCAweDQ0LAorCSAweDJDLCAweEZBLCAweEZGLCAweEZGLCAweDAxLCAweDI2LCAweDJCLCAweDAwLCAweEQwLCAweDgwLCAweEExLCAweEZGLCAweDhDLCAweDQ0LCAweDZDLCAweDVDLAorCSAweDAwLCAweEUxLCAweEYyLCAweEZFLCAweDJELCAweEZBLCAweEVDLCAweEYzLCAweEQ0LCAweDgwLCAweEQwLCAweDgwLCAweDJFLCAweEY4LCAweDI0LCAweDQ0LAorCSAweDE2LCAweDBDLCAweDMyLCAweDQwLCAweDAyLCAweDJBLCAweDA3LCAweDAwLCAweDI4LCAweDQyLCAweDBDLCAweEIyLCAweDA4LCAweDNBLCAweDAzLCAweDAwLAorCSAweDEwLCAweEJDLCAweDQwLCAweDQ0LCAweDYxLCAweDAwLCAweDA0LCAweDBBLCAweEExLCAweEZGLCAweEFCLCAweDYwLCAweEU3LCAweDc4LCAweEZGLCAweEZGLAorCSAweDExLCAweEJDLCAweDQwLCAweDQ0LCAweDI4LCAweDQ1LCAweEJGLCAweDYwLCAweEZGLCAweDY0LCAweDI0LCAweDg4LCAweDU1LCAweDAwLCAweDMwLCAweEJDLAorCSAweDQwLCAweDQ0LCAweDIyLCAweEYwLCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweDRELCAweDAwLCAweDIwLCAweEI5LAorCSAweDVDLCAweDhFLCAweEExLCAweEZGLCAweDhDLCAweDQ0LCAweDJELCAweEZBLCAweERDLCAweDlDLCAweDZDLCAweDQ0LCAweDAwLCAweEUxLCAweEYyLCAweEZFLAorCSAweDJFLCAweEZBLCAweDA4LCAweDI4LCAweDQ0LCAweDRFLCAweERDLCAweDg0LCAweDJFLCAweDVDLCAweEIwLCAweDg0LCAweEVGLCAweEIxLCAweDA4LCAweDI0LAorCSAweDQwLCAweEI5LCAweDQxLCAweDQ2LCAweDM5LCAweDAwLCAweDIzLCAweDQxLCAweDEzLCAweDY0LCAweDUxLCAweDkwLCAweDU2LCAweDYzLCAweDAzLCAweDA0LAorCSAweEFCLCAweDYwLCAweERFLCAweDc4LCAweEZGLCAweEZGLCAweDhDLCAweDQ0LCAweDA0LCAweDYxLCAweDJCLCAweEZBLCAweDUwLCAweEZFLCAweDgwLCAweDI3LAorCSAweDAwLCAweDY0LCAweDMwLCAweEZCLCAweDhDLCAweDQ0LCAweDJDLCAweEZBLCAweEQwLCAweDgwLCAweDhDLCAweDQ0LCAweDJELCAweEZBLCAweEQ0LCAweDgwLAorCSAweDAwLCAweDY1LCAweDhDLCAweDQ0LCAweEVDLCAweEYxLCAweDJFLCAweEZBLCAweEQwLCAweDgwLCAweDI4LCAweDQ0LCAweDAzLCAweDBDLCAweEEwLCAweDJBLAorCSAweDBBLCAweDAwLCAweDExLCAweDAwLCAweDEwLCAweDY1LCAweDYwLCAweDQwLCAweEM0LCAweDM2LCAweDA0LCAweDAwLCAweEQ0LCAweDNBLCAweDA4LCAweDAwLAorCSAweDI3LCAweDQwLCAweDQwLCAweDI2LCAweDMwLCAweDY1LCAweDAwLCAweDY0LCAweDNGLCAweEZBLCAweDQ2LCAweDRFLCAweDM1LCAweDg0LCAweDY0LCAweDAwLAorCSAweDQwLCAweDI2LCAweEY5LCAweDAxLCAweDMwLCAweDY1LCAweDdBLCAweERDLCAweDdBLCAweERDLCAweDdBLCAweERDLCAweDA0LCAweDYxLCAweEYzLCAweDAxLAorCSAweEExLCAweEZGLCAweEFCLCAweDYwLCAweEE1LCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweDYwLCAweEZFLCAweDY1LCAweDIzLCAweDQzLCAweEU4LCAweEEzLAorCSAweDgwLCAweDI3LCAweEY2LCAweDAxLCAweDIwLCAweEU2LCAweDA4LCAweDYwLCAweDAwLCAweEVCLCAweDI4LCAweDQ0LCAweDAzLCAweDJCLCAweDA1LCAweDAwLAorCSAweDZBLCAweDYyLCAweDdBLCAweERDLCAweDdBLCAweERDLCAweDdBLCAweERDLCAweDI4LCAweDQ0LCAweDhGLCAweEIwLCAweDg4LCAweDNBLCAweDAzLCAweDAwLAorCSAweDcwLCAweDYyLCAweDdBLCAweERDLCAweDI4LCAweDQ0LCAweDQwLCAweDJCLCAweDBELCAweDAwLCAweDcyLCAweDYyLCAweDdBLCAweERDLCAweEExLCAweEZGLAorCSAweDZDLCAweDVDLCAweDVBLCAweEQ4LCAweEU0LCAweDQwLCAweDIwLCAweDJCLCAweDAzLCAweDAwLCAweDdBLCAweERDLCAweDdBLCAweERDLCAweEY4LCAweEEzLAorCSAweDI1LCAweEZGLCAweEIwLCAweEZGLCAweDNGLCAweEZDLCAweDAwLCAweEY0LCAweDEwLCAweDYyLCAweDEwLCAweDYxLCAweDU3LCAweDkwLCAweDZDLCAweDYxLAorCSAweEExLCAweEZGLCAweDA5LCAweDA3LCAweDAyLCAweDFELCAweDI4LCAweDFFLCAweDFGLCAweDAwLCAweENCLCAweDgzLCAweDdBLCAweERDLCAweEZFLCAweDFDLAorCSAweEQ5LCAweDgxLCAweDIyLCAweDFFLCAweDE5LCAweDAwLCAweENCLCAweDgzLCAweDBFLCAweEEzLCAweEE3LCAweDg0LCAweEYyLCAweEEzLCAweDdBLCAweERDLAorCSAweEZFLCAweDFDLCAweDAzLCAweDFELCAweDdDLCAweEE4LCAweEQ5LCAweDgxLCAweDBBLCAweDAyLCAweDAwLCAweEY0LCAweDAyLCAweDYyLCAweEE3LCAweDg0LAorCSAweDdBLCAweDYxLCAweDdBLCAweERDLCAweEZFLCAweDFDLCAweEY5LCAweDFELCAweDdDLCAweEE4LCAweEQ5LCAweDgxLCAweEY2LCAweDAzLCAweEZGLCAweEIxLAorCSAweDBCLCAweDFFLCAweDAyLCAweDAyLCAweDAwLCAweEY0LCAweDAyLCAweDYyLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweEI2LCAweEZGLCAweEI3LCAweEZGLAorCSAweDZDLCAweDQ0LCAweDVBLCAweERBLCAweENELCAweDgxLCAweDY0LCAweDQwLCAweDQ2LCAweDQ1LCAweDI4LCAweDQ0LCAweDQwLCAweDJCLCAweDBFLCAweDAwLAorCSAweDY0LCAweDQwLCAweDIwLCAweDJCLCAweDBCLCAweDAwLCAweDAxLCAweEEyLCAweDYyLCAweDQ0LCAweDQ2LCAweDQ1LCAweDIxLCAweDQ2LCAweDAwLCAweEY0LAorCSAweDAyLCAweDYyLCAweDlBLCAweEZGLCAweDdBLCAweERDLCAweDdBLCAweERDLCAweDdBLCAweERDLCAweDdBLCAweERDLCAweDAxLCAweDYwLCAweDE4LCAweEUxLAorCSAweDI0LCAweDc2LCAweEFELCAweEUyLCAweDQxLCAweEUxLCAweDk4LCAweEZGLCAweDAwLCAweEU2LCAweDAxLCAweEYyLCAweDYxLCAweDQ1LCAweEQ0LCAweDlFLAorCSAweDIxLCAweDQ2LCAweDE2LCAweEZBLCAweDI1LCAweDQ0LCAweDA2LCAweEZBLCAweEExLCAweEZGLCAweDhDLCAweDQ0LCAweEExLCAweEZGLCAweDQ3LCAweEZGLAorCSAweDI5LCAweDQwLCAweDUwLCAweDJCLCAweDA2LCAweDAwLCAweDJCLCAweDQ0LCAweDFDLCAweDYwLCAweDExLCAweEZCLCAweDcwLCAweDQ1LCAweDQ0LCAweDhCLAorCSAweDAxLCAweDAwLCAweDUwLCAweDRCLCAweDY3LCAweDUwLCAweDY5LCAweEUyLCAweDI1LCAweDQ2LCAweDAxLCAweEYyLCAweDYxLCAweDQ1LCAweEQ0LCAweDlFLAorCSAweDIxLCAweDQ2LCAweDE2LCAweEZBLCAweDI1LCAweDQ1LCAweDg2LCAweEY4LCAweEZGLCAweEZGLCAweDZBLCAweDQ0LCAweDQwLCAweDJCLCAweDAzLCAweDE1LAorCSAweEFGLCAweDYwLCAweEYzLCAweDc4LCAweEZGLCAweEZGLCAweDI5LCAweDQwLCAweDEwLCAweDI2LCAweDA0LCAweDAwLCAweDA0LCAweDc0LCAweENELCAweEUyLAorCSAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDZDLCAweDQ0LCAweEI2LCAweEZGLCAweEI3LCAweEZGLCAweEM0LCAweEUyLCAweDAxLCAweDYwLCAweDE4LCAweEUxLAorCSAweDA1LCAweDc2LCAweEFELCAweEUyLCAweDQxLCAweEUxLCAweEExLCAweEZGLCAweDZDLCAweDQ1LCAweEExLCAweEZGLCAweDY1LCAweDQxLCAweDdGLCAweDYwLAorCSAweDdGLCAweDdDLCAweDZDLCAweDQ0LCAweEEwLCAweDg0LCAweDE1LCAweEE3LCAweDE1LCAweEE0LCAweDIxLCAweDQ2LCAweDI2LCAweEZBLCAweDIyLCAweDQ2LAorCSAweDEwLCAweEZBLCAweDIxLCAweDQ2LCAweDI5LCAweDQwLCAweDQwLCAweDJCLCAweDA3LCAweDAwLCAweEI2LCAweEZGLCAweEExLCAweEZGLCAweDQwLCAweDYwLAorCSAweDAwLCAweDY1LCAweDZDLCAweDQ0LCAweDFBLCAweEZBLCAweDA5LCAweDAwLCAweDY1LCAweDQ0LCAweDBGLCAweEI0LCAweDA2LCAweEE4LCAweDgwLCAweDYwLAorCSAweDAwLCAweDY1LCAweDA4LCAweDI4LCAweDdDLCAweDQ1LCAweDI5LCAweDQ0LCAweDM0LCAweDg5LCAweDAwLCAweDY0LCAweDMzLCAweEZCLCAweDQwLCAweDIxLAorCSAweDAwLCAweDAwLCAweEFDLCAweEUyLCAweDA1LCAweEUxLCAweDI3LCAweEYwLCAweDY1LCAweDQ0LCAweDY0LCAweDVFLCAweDI3LCAweEZBLCAweDI4LCAweDQ0LAorCSAweDhGLCAweEIwLCAweDg4LCAweDNBLCAweDA5LCAweDAwLCAweDM5LCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweEIwLCAweDIwLCAweDNBLCAweDA0LCAweDAwLAorCSAweDI0LCAweDQ0LCAweEZGLCAweDYwLCAweERGLCAweEI0LCAweDQwLCAweDQ0LCAweDI4LCAweDQwLCAweDAzLCAweDI2LCAweEUyLCAweDAwLCAweDMxLCAweDQwLAorCSAweDIwLCAweDJBLCAweDAzLCAweDAwLCAweDI4LCAweDQwLCAweDUwLCAweDNBLCAweERDLCAweDAwLCAweDI0LCAweDQ0LCAweDIwLCAweDJBLCAweEQ5LCAweDAwLAorCSAweDI5LCAweDQwLCAweDUwLCAweDJCLCAweDBELCAweDAwLCAweEVGLCAweDYwLCAweEZGLCAweDY1LCAweDI5LCAweDQ0LCAweDI0LCAweDg5LCAweDMxLCAweDQwLAorCSAweDA4LCAweDJBLCAweDA2LCAweDAwLCAweDFDLCAweDYwLCAweDExLCAweEYzLCAweEZGLCAweEZGLCAweEUwLCAweDg1LCAweDJCLCAweDQ0LCAweDA2LCAweDA1LAorCSAweDJCLCAweDQ0LCAweEZGLCAweEE0LCAweDAxLCAweEE0LCAweDA0LCAweDI0LCAweDAwLCAweDY0LCAweDQwLCAweDRCLCAweEFDLCAweDgwLCAweDI4LCAweDQwLAorCSAweEI0LCAweDNBLCAweDAzLCAweDAwLCAweDAyLCAweDAzLCAweDMwLCAweEZCLCAweEJDLCAweDAwLCAweDI4LCAweDQ0LCAweEJGLCAweDYwLCAweEZGLCAweDY1LAorCSAweEE0LCAweDg0LCAweDQwLCAweDQ4LCAweDJCLCAweDUwLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDAxLCAweDYwLCAweDA4LCAweEUxLCAweDFDLCAweEYyLAorCSAweEM0LCAweEUyLCAweDQwLCAweDQ1LCAweDI4LCAweDQwLCAweEM0LCAweDM2LCAweDlDLCAweDAwLCAweDI5LCAweDQwLCAweDQwLCAweDJCLCAweDQ4LCAweDAwLAorCSAweDMyLCAweDYwLCAweEZBLCAweDYzLCAweDYwLCAweDQwLCAweDBCLCAweDM2LCAweDIwLCAweDAwLCAweDBGLCAweDM2LCAweDFCLCAweDAwLCAweDBBLCAweDM2LAorCSAweDE2LCAweDAwLCAweDBFLCAweDM2LCAweDExLCAweDAwLCAweDA5LCAweDM2LCAweDBDLCAweDAwLCAweDBELCAweDM2LCAweDA3LCAweDAwLCAweDA4LCAweDM2LAorCSAweDAyLCAweDAwLCAweEEzLCAweEQzLCAweDE1LCAweDAwLCAweDAyLCAweEEzLCAweEEzLCAweEQzLCAweDEyLCAweDAwLCAweDA0LCAweEEzLCAweEEzLCAweEQzLAorCSAweDBGLCAweDAwLCAweDA2LCAweEEzLCAweEEzLCAweEQzLCAweDBDLCAweDAwLCAweDA4LCAweEEzLCAweEEzLCAweEQzLCAweDA5LCAweDAwLCAweDBBLCAweEEzLAorCSAweEEzLCAweEQzLCAweDA2LCAweDAwLCAweDBDLCAweEEzLCAweEEzLCAweEQzLCAweDAzLCAweDAwLCAweDBFLCAweEEzLCAweEEzLCAweEQzLCAweEZGLCAweEZGLAorCSAweDJDLCAweDYwLCAweDdDLCAweDYzLCAweDYwLCAweDQwLCAweDBDLCAweDM2LCAweDE5LCAweDAwLCAweDA4LCAweDM2LCAweDE1LCAweDAwLCAweDBELCAweDM2LAorCSAweDExLCAweDAwLCAweDA5LCAweDM2LCAweDBELCAweDAwLCAweDBFLCAweDM2LCAweDA5LCAweDAwLCAweDBBLCAweDM2LCAweDA1LCAweDAwLCAweDBGLCAweDM2LAorCSAweDAxLCAweDAwLCAweDM5LCAweDAwLCAweDAyLCAweEEzLCAweDM3LCAweDAwLCAweDA0LCAweEEzLCAweDM1LCAweDAwLCAweDA2LCAweEEzLCAweDMzLCAweDAwLAorCSAweDA4LCAweEEzLCAweDMxLCAweDAwLCAweDBBLCAweEEzLCAweDJGLCAweDAwLCAweDBDLCAweEEzLCAweDJELCAweDAwLCAweDBFLCAweEEzLCAweDJCLCAweDAwLAorCSAweDMzLCAweDYwLCAweDBBLCAweDYzLCAweDI1LCAweDQ0LCAweDBBLCAweDM2LCAweDBDLCAweDAwLCAweDE0LCAweDM2LCAweDA3LCAweDAwLCAweDM3LCAweDM2LAorCSAweDAyLCAweDAwLCAweEEzLCAweEQzLCAweDA5LCAweDAwLCAweDAyLCAweEEzLCAweEEzLCAweEQzLCAweDA2LCAweDAwLCAweDA0LCAweEEzLCAweEEzLCAweEQzLAorCSAweDAzLCAweDAwLCAweDA2LCAweEEzLCAweEEzLCAweEQzLCAweEZGLCAweEZGLCAweDQwLCAweDQ1LCAweDBBLCAweDM2LCAweDBELCAweDAwLCAweDE0LCAweDM2LAorCSAweDM4LCAweDY0LCAweDM3LCAweDNBLCAweDAzLCAweDAwLCAweDA0LCAweDdGLCAweDQwLCAweDQ1LCAweDE1LCAweDY0LCAweDZFLCAweDNBLCAweDA5LCAweDAwLAorCSAweDg0LCAweDdGLCAweDQwLCAweDQ1LCAweDBCLCAweDY0LCAweDA1LCAweDAwLCAweDI5LCAweDQ0LCAweDdGLCAweDYwLCAweEZGLCAweEI0LCAweDQwLCAweDQ5LAorCSAweDcwLCAweDY0LCAweDQwLCAweDRELCAweDAyLCAweDAwLCAweDQwLCAweDQ1LCAweDBBLCAweDAwLCAweDJDLCAweDYwLCAweDc0LCAweDYzLCAweDBBLCAweDM2LAorCSAweDA2LCAweDAwLCAweDE0LCAweDM2LCAweDAyLCAweEEzLCAweDM3LCAweDM2LCAweDA0LCAweEEzLCAweDZFLCAweDM2LCAweDA2LCAweEEzLCAweDI4LCAweEEzLAorCSAweEEzLCAweEQxLCAweEQ4LCAweEEzLCAweDE5LCAweDYwLCAweDU1LCAweEY5LCAweDM5LCAweEYxLCAweEEzLCAweEQxLCAweDY0LCAweDQxLCAweDY0LCAweDVFLAorCSAweDYwLCAweDQ1LCAweDY0LCAweDQ3LCAweDFGLCAweEI0LCAweDU0LCAweDk0LCAweEUwLCAweEEwLCAweDAyLCAweDBELCAweDAwLCAweDY0LCAweDAyLCAweDAwLAorCSAweDAxLCAweDA0LCAweDFGLCAweDY0LCAweDYwLCAweDQ3LCAweEI0LCAweDg1LCAweDI5LCAweDQ0LCAweEMwLCAweDYwLCAweDAwLCAweEI0LCAweEI0LCAweDg0LAorCSAweDFGLCAweEZBLCAweEI1LCAweEZGLCAweEExLCAweEZGLCAweENCLCAweEYzLCAweEM0LCAweEUyLCAweDg5LCAweEZGLCAweDYwLCAweDU0LCAweDg4LCAweEZGLAorCSAweERDLCAweDg0LCAweEUwLCAweDk0LCAweEZGLCAweDYwLCAweENGLCAweDY1LCAweDI5LCAweDQ0LCAweDI0LCAweDg5LCAweEE1LCAweDYwLCAweDg4LCAweDc4LAorCSAweDA0LCAweEUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweEM0LCAweEUyLCAweEExLCAweEZGLCAweEZGLCAweDYwLCAweENGLCAweDY1LCAweDI5LCAweDQ0LAorCSAweDI0LCAweDg5LCAweENCLCAweEYzLCAweEM0LCAweEUyLCAweDg5LCAweEZGLCAweDYwLCAweDU0LCAweDg4LCAweEZGLCAweERDLCAweDg0LCAweEUwLCAweDk0LAorCSAweDI2LCAweDQ0LCAweDg0LCAweEJDLCAweDI0LCAweDQwLCAweDBDLCAweDIyLCAweEZELCAweEI0LCAweDQwLCAweDQ2LCAweDIzLCAweDY0LCAweDNBLCAweERCLAorCSAweEFELCAweDYwLCAweDRGLCAweDc4LCAweEZGLCAweEZGLCAweDI3LCAweDQwLCAweDI2LCAweDIyLCAweDA1LCAweDAwLCAweEY4LCAweEI0LCAweDQwLCAweDQ3LAorCSAweDA2LCAweDY0LCAweDMxLCAweEZCLCAweEMwLCAweEZFLCAweDI5LCAweDQwLCAweDEwLCAweDI2LCAweDAyLCAweDAwLCAweDA0LCAweDc0LCAweENELCAweEUyLAorCSAweDAxLCAweDYwLCAweDE4LCAweEUxLCAweDAxLCAweDYwLCAweDE4LCAweEUxLCAweDAxLCAweDExLCAweDEyLCAweDAwLCAweDI5LCAweDQ0LCAweDIwLCAweEJDLAorCSAweDQwLCAweDQ5LCAweDAxLCAweDY0LCAweDMzLCAweEZCLCAweEI2LCAweEZGLCAweDAwLCAweEUxLCAweDAxLCAweDYwLCAweDFBLCAweEUxLCAweEExLCAweEZGLAorCSAweEZGLCAweEZGLCAweDZDLCAweDQwLCAweEZDLCAweDExLCAweDAxLCAweDYwLCAweDE4LCAweEUxLCAweEFFLCAweDRGLCAweEY3LCAweEI0LCAweEEwLCAweDVFLAorCSAweEI1LCAweEZGLCAweDQ3LCAweEZGLCAweEI2LCAweEZGLCAweEI3LCAweEZGLCAweEI0LCAweEZGLCAweEM4LCAweDYwLCAweDA5LCAweDdELCAweDdDLCAweDRCLAorCSAweDI5LCAweDQwLCAweDUwLCAweDJCLCAweDFCLCAweDAwLCAweDMxLCAweDQwLCAweDA4LCAweDJBLCAweDBELCAweDAwLCAweDFDLCAweDYwLCAweDExLCAweEYzLAorCSAweEZGLCAweEZGLCAweEUwLCAweDg1LCAweDJCLCAweDQ0LCAweDA3LCAweDA0LCAweDcwLCAweDQ1LCAweEM0LCAweDg0LCAweEVGLCAweDYwLCAweEZGLCAweDY1LAorCSAweDI5LCAweDQ0LCAweDI0LCAweDg5LCAweDExLCAweDAwLCAweDJCLCAweDQ0LCAweDcwLCAweDQ1LCAweEM0LCAweDg0LCAweEZGLCAweEZGLCAweDA0LCAweDI0LAorCSAweDAwLCAweEI0LCAweDQwLCAweDRCLCAweEVGLCAweDYwLCAweEZGLCAweDY1LCAweDI5LCAweDQ0LCAweDI0LCAweDg5LCAweDM3LCAweEYzLCAweDJCLCAweDQ1LAorCSAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDAyLCAweDI4LCAweDY1LCAweDQ0LCAweDYwLCAweDUwLCAweEEwLCAweDRDLCAweDIwLCAweEJDLCAweEZGLCAweEI0LAorCSAweEEwLCAweDUxLCAweDAwLCAweDYwLCAweDJFLCAweDdDLCAweDc0LCAweDQ0LCAweEMwLCAweDk0LCAweDMyLCAweDQwLCAweDAyLCAweDJBLCAweDE5LCAweDAwLAorCSAweDI4LCAweDQ0LCAweEE0LCAweDM2LCAweDAzLCAweDAwLCAweDBDLCAweEI0LCAweDA0LCAweDM2LCAweDEzLCAweDAwLCAweDI2LCAweDQzLCAweEZELCAweEIzLAorCSAweDA0LCAweEJCLCAweDQzLCAweDQ2LCAweDAxLCAweDJBLCAweDAzLCAweDAwLCAweDI4LCAweDQ3LCAweDQwLCAweEJGLCAweDQwLCAweDQ4LCAweDBBLCAweEJCLAorCSAweDBGLCAweEZDLCAweDUwLCAweDRCLCAweDY3LCAweDUwLCAweDAwLCAweDY0LCAweDMwLCAweEZCLCAweDA1LCAweEZGLCAweEFELCAweDYwLCAweDRGLCAweDc4LAorCSAweEZGLCAweEZGLCAweDI0LCAweDY0LCAweDNBLCAweERCLCAweDI4LCAweDQ0LCAweDA0LCAweDJBLCAweDAzLCAweDAwLCAweEEzLCAweDYwLCAweEU3LCAweDc4LAorCSAweEZGLCAweEZGLCAweDMyLCAweDQwLCAweDA0LCAweDJBLCAweDFDLCAweDAwLCAweDI4LCAweDQ0LCAweDBDLCAweEIwLCAweDA4LCAweDNBLCAweDE4LCAweDAwLAorCSAweDJDLCAweEYwLCAweDIyLCAweEYwLCAweDY0LCAweDQwLCAweDAxLCAweDI2LCAweDBCLCAweDAwLCAweDY0LCAweDQwLCAweDQwLCAweDJCLCAweDEwLCAweDAwLAorCSAweDhGLCAweEIwLCAweDg4LCAweDNBLCAweDBELCAweDAwLCAweDM5LCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweEIwLCAweDIwLCAweDNBLCAweDA4LCAweDAwLAorCSAweDI2LCAweDQ0LCAweEZELCAweEI0LCAweDA0LCAweEJDLCAweDQwLCAweDQ2LCAweEZDLCAweEI0LCAweDBGLCAweEZBLCAweDA1LCAweEZGLCAweDAxLCAweDAwLAorCSAweDFELCAweEZGLCAweDAxLCAweEUyLCAweDI2LCAweDQwLCAweDEwLCAweDJBLCAweDA2LCAweDAwLCAweDJDLCAweDYwLCAweEVBLCAweDY0LCAweEYxLCAweDYwLAorCSAweDc4LCAweDQxLCAweEU0LCAweDc4LCAweEI1LCAweEYxLCAweEEzLCAweDYwLCAweEU3LCAweDc4LCAweEZGLCAweEZGLCAweDAzLCAweDBBLCAweEEzLCAweDYwLAorCSAweEY0LCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDY0LCAweDUxLCAweEZCLCAweDFCLCAweDYwLCAweEVFLCAweEYzLCAweEZGLCAweEZGLCAweDA0LCAweDE4LAorCSAweEFFLCAweDRGLCAweDA4LCAweEJDLCAweDAwLCAweDdGLCAweEEwLCAweDVFLCAweEUxLCAweEUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDgxLCAweDNFLAorCSAweDU0LCAweDYyLCAweDIyLCAweDQ2LCAweEEyLCAweEQwLCAweDE2LCAweDYzLCAweDdDLCAweDQxLCAweDQ0LCAweDQ4LCAweDgwLCAweDM2LCAweDA0LCAweDYxLAorCSAweDI4LCAweDQwLCAweDUwLCAweDM2LCAweDA0LCAweDYxLCAweDQxLCAweDRFLCAweDI4LCAweDQ0LCAweEE0LCAweDM2LCAweDBFLCAweDYzLCAweDlBLCAweEZGLAorCSAweEExLCAweEZGLCAweDE5LCAweDYwLCAweEEzLCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDA2LCAweDAwLCAweDNELCAweEYyLAorCSAweEFBLCAweEYwLCAweEZGLCAweEZGLCAweEI0LCAweDg0LCAweDA4LCAweDM2LCAweDJBLCAweEZBLCAweDEyLCAweDc0LCAweENELCAweEUyLCAweDU0LCAweDYyLAorCSAweEEyLCAweEQyLCAweEZGLCAweEZGLCAweDZBLCAweDQwLCAweDgwLCAweDRFLCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LAorCSAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LAorCSAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweEZGLCAweEZGLCAweDAxLCAweDFELCAweEIyLCAweDAwLCAweDdBLCAweEQ0LCAweDEyLCAweDc0LAorCSAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDI4LCAweDQwLCAweDAzLCAweDJCLAorCSAweDA2LCAweDAwLCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDcwLCAweDYyLAorCSAweDI4LCAweDQ0LCAweDhGLCAweEIwLCAweDg4LCAweDNBLCAweDAyLCAweDAwLCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDI4LCAweDQwLCAweDQwLCAweDJCLAorCSAweDE2LCAweDAwLCAweDcyLCAweDYyLCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQyLCAweDEyLCAweDc0LCAweDgwLCAweDRDLCAweDIwLCAweDJCLAorCSAweDA1LCAweDAwLCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDIyLCAweEYyLCAweEZGLCAweEZGLAorCSAweDYwLCAweDQwLCAweDEwLCAweDI2LCAweDA0LCAweDAwLCAweDI2LCAweDI2LCAweDRELCAweDAwLCAweDI2LCAweDI3LCAweDRCLCAweDAwLCAweDIzLCAweDQzLAorCSAweEZGLCAweEZGLCAweDA2LCAweDFELCAweDJFLCAweDFFLCAweDAwLCAweDAwLCAweDAzLCAweEYwLCAweDA0LCAweEY0LCAweDY0LCAweDQyLCAweDNELCAweDAwLAorCSAweDJFLCAweDQwLCAweDA0LCAweDJBLCAweDI3LCAweDAwLCAweEExLCAweEZGLCAweDAyLCAweEZFLCAweDEwLCAweDI1LCAweDQyLCAweEZFLCAweDEyLCAweDc0LAorCSAweDcyLCAweDQ1LCAweDY1LCAweDRDLCAweEIyLCAweEYzLCAweDAzLCAweDA0LCAweEU0LCAweEUyLCAweERDLCAweDg0LCAweEIyLCAweEZCLCAweEExLCAweEZGLAorCSAweDEyLCAweDc0LCAweDgwLCAweDRDLCAweDEyLCAweDc0LCAweEIzLCAweEYzLCAweDAyLCAweDA0LCAweERDLCAweDg0LCAweEIzLCAweEZCLCAweDgwLCAweDRDLAorCSAweDEyLCAweDc0LCAweEI0LCAweEYzLCAweDAyLCAweDA0LCAweERDLCAweDg0LCAweEI0LCAweEZCLCAweDgwLCAweDRDLCAweDEyLCAweDc0LCAweDVDLCAweDRFLAorCSAweEY4LCAweEEzLCAweDAzLCAweEYyLCAweDlBLCAweEYyLCAweDA0LCAweEY0LCAweEZGLCAweEIxLCAweEY4LCAweEExLCAweDA2LCAweEE0LCAweDYwLCAweDQyLAorCSAweDBBLCAweDAwLCAweDRFLCAweDAwLCAweDAzLCAweEYyLCAweDlBLCAweEYyLCAweDA0LCAweEY0LCAweEM4LCAweDgyLCAweEZGLCAweEIxLCAweDAzLCAweDAwLAorCSAweDAwLCAweEY0LCAweDgxLCAweEYyLCAweEZGLCAweEIxLCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweEZELCAweDFDLCAweEY5LCAweDFELCAweEZGLCAweEIxLAorCSAweDFCLCAweDFFLCAweDAyLCAweDAyLCAweDAwLCAweEY0LCAweERBLCAweDgyLCAweERBLCAweDgyLCAweEEyLCAweEQyLCAweEExLCAweEZGLCAweDA5LCAweDc0LAorCSAweDYwLCAweDRELCAweDEyLCAweDAwLCAweDAzLCAweEYyLCAweDlBLCAweEYyLCAweDA0LCAweEY0LCAweDIzLCAweDQzLCAweEExLCAweEZGLCAweDEyLCAweDc0LAorCSAweEEwLCAweEQyLCAweEZFLCAweEExLCAweENCLCAweDgzLCAweDYwLCAweDRFLCAweEFGLCAweDgzLCAweDAzLCAweDFELCAweDA1LCAweDAzLCAweDEyLCAweDc0LAorCSAweEVCLCAweDAxLCAweEExLCAweEZGLCAweDEyLCAweDc0LCAweERGLCAweDAxLCAweDEyLCAweDc0LCAweERBLCAweDgzLCAweDY2LCAweDQ0LCAweDIyLCAweDQ2LAorCSAweDBDLCAweEZBLCAweDIyLCAweEYyLCAweDBCLCAweEZDLCAweDI4LCAweDQwLCAweDQwLCAweDJCLCAweDFBLCAweDAwLCAweDEwLCAweDI2LCAweDA0LCAweDAwLAorCSAweDI2LCAweDI2LCAweDBGLCAweDAwLCAweDI2LCAweDI3LCAweDBELCAweDAwLCAweDAwLCAweEY0LCAweDAyLCAweDYyLCAweEExLCAweEZGLCAweDEyLCAweDc0LAorCSAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LCAweDdBLCAweEQ0LCAweDEyLCAweDc0LAorCSAweDA3LCAweDAwLCAweEExLCAweEZGLCAweDEyLCAweDc0LCAweDlDLCAweDRFLCAweDEyLCAweDc0LCAweDlDLCAweDRDLCAweDEyLCAweDc0LCAweDAwLCAweDAwLAorCSAweDg4LCAweEZGLCAweEExLCAweEZGLCAweEIyLCAweDYwLCAweDU4LCAweDRGLCAweDJELCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDYwLCAweDE4LCAweEUxLAorCSAweDc4LCAweDQ0LCAweDAyLCAweEE0LCAweDM1LCAweEZCLCAweENDLCAweDAwLCAweDI5LCAweDQ0LCAweEY3LCAweEI0LCAweDQwLCAweDQ5LCAweDM0LCAweDY0LAorCSAweDNBLCAweERCLCAweDQ0LCAweEUxLCAweEE1LCAweDYwLCAweDU0LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDZCLCAweEJDLCAweEZGLCAweDE1LCAweEYzLAorCSAweEZGLCAweEZGLCAweERDLCAweDg0LCAweDE1LCAweEZCLCAweDc4LCAweDVDLCAweDA3LCAweDAwLCAweDc4LCAweDVDLCAweDJGLCAweDAwLCAweDYyLCAweEZGLAorCSAweEZGLCAweEZGLCAweEExLCAweEZGLCAweDk4LCAweEZGLCAweDgwLCAweDNFLCAweDgwLCAweDYwLCAweDAxLCAweEUwLCAweEQ1LCAweDYwLCAweDg0LCAweEU3LAorCSAweEExLCAweEYzLCAweDQwLCAweDYwLCAweDYwLCAweDQwLCAweDAxLCAweDIzLCAweDQ4LCAweDYwLCAweDVFLCAweDY1LCAweDgwLCAweDYwLCAweDAwLCAweDZBLAorCSAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDY1LCAweDRBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDAwLCAweDYwLAorCSAweDAwLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDgwLCAweDYwLCAweDAwLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LAorCSAweEZFLCAweDAxLCAweDY1LCAweDRBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDAwLCAweDYwLCAweDAxLCAweDZBLCAweEZGLCAweEZGLAorCSAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDk1LCAweDYwLCAweDg0LCAweEU3LCAweDY0LCAweDU4LCAweEZGLCAweEZGLCAweDgwLCAweDYwLCAweDAxLCAweEUwLAorCSAweEQ1LCAweDYwLCAweDg0LCAweEU3LCAweEExLCAweEYzLCAweDdDLCAweDQ1LCAweDYwLCAweDQwLCAweDAxLCAweDIzLCAweDAyLCAweDY1LCAweDhDLCAweDYwLAorCSAweDQ4LCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDAwLCAweDYwLCAweDAwLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LAorCSAweEZFLCAweDAxLCAweDAwLCAweDYwLCAweDdGLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDg0LCAweDYwLCAweDA0LCAweDZBLAorCSAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDQ4LCAweDYwLCAweDA4LCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLAorCSAweDY1LCAweDRBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDg0LCAweDYwLCAweDA0LCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LAorCSAweEZFLCAweDAxLCAweDQwLCAweDYwLCAweDA4LCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDY1LCAweDRBLCAweEZGLCAweEZGLAorCSAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDhDLCAweDYwLCAweDQ4LCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDAwLCAweDYwLAorCSAweDAwLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDAwLCAweDYwLCAweDAwLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LAorCSAweEZFLCAweDAxLCAweDk1LCAweDYwLCAweDg0LCAweEU3LCAweDY0LCAweDU4LCAweEZGLCAweEZGLCAweDEyLCAweDc0LCAweDZBLCAweDQwLCAweDg3LCAweDRGLAorCSAweDEyLCAweDc0LCAweDg3LCAweDRDLCAweDEyLCAweDc0LCAweDI5LCAweDQwLCAweDQwLCAweDJCLCAweDA4LCAweDAwLCAweDBBLCAweDY0LCAweDg5LCAweEZGLAorCSAweDYwLCAweDU0LCAweDg4LCAweEZGLCAweDg3LCAweDRELCAweDEyLCAweDc0LCAweDg3LCAweDRELCAweDA5LCAweDAwLCAweDAzLCAweDY0LCAweDg5LCAweEZGLAorCSAweDYwLCAweDU0LCAweDg4LCAweEZGLCAweDg3LCAweDRGLCAweDEyLCAweDc0LCAweDg3LCAweDRELCAweDEyLCAweDc0LCAweDg3LCAweDRELCAweDdDLCAweDQ0LAorCSAweDAxLCAweDA4LCAweDAxLCAweDAwLCAweDY3LCAweDQ0LCAweDEyLCAweDc0LCAweDg3LCAweDRDLCAweDEyLCAweDc0LCAweDg3LCAweDRDLCAweDEyLCAweDc0LAorCSAweDg3LCAweDRDLCAweDEyLCAweDc0LCAweDg3LCAweDRELCAweDEyLCAweDc0LCAweDg3LCAweDRELCAweDEyLCAweDc0LCAweDg3LCAweDRELCAweDEyLCAweDc0LAorCSAweDA0LCAweDIxLCAweDA0LCAweDAwLCAweEZGLCAweDJBLCAweDAxLCAweDAwLCAweDA0LCAweDAwLCAweDAzLCAweDAwLCAweEZGLCAweDJBLCAweDBELCAweDAwLAorCSAweDBDLCAweDAwLCAweEJDLCAweEZGLCAweDYxLCAweEZGLCAweDc4LCAweDVDLCAweDU3LCAweDAxLCAweDc4LCAweDVDLCAweDdGLCAweDAxLCAweEI2LCAweEZGLAorCSAweEI3LCAweEZGLCAweEI0LCAweEZGLCAweEM4LCAweDYwLCAweDA5LCAweDdELCAweDdDLCAweDRCLCAweDZBLCAweDQ0LCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDA0LCAweDc0LCAweEM0LCAweEUyLCAweDA0LCAweEUxLCAweDI5LCAweDQwLCAweDQwLCAweDJCLCAweDA1LCAweDAwLCAweEExLCAweEZGLCAweEZGLCAweEZGLAorCSAweEJDLCAweEZGLCAweDE0LCAweDc0LCAweDAxLCAweDAwLCAweDA0LCAweDc0LCAweEM0LCAweEUyLCAweDA0LCAweEUxLCAweEJDLCAweEZGLCAweEI1LCAweEZGLAorCSAweDQ3LCAweEZGLCAweEI2LCAweEZGLCAweEI3LCAweEZGLCAweEI0LCAweEZGLCAweEM4LCAweDYwLCAweDA5LCAweDdELCAweDdDLCAweDRCLCAweDI5LCAweDQwLAorCSAweDQwLCAweDI3LCAweDA0LCAweDAwLCAweEMyLCAweDYwLCAweDU4LCAweDRGLCAweEJBLCAweDc4LCAweEZGLCAweEZGLCAweEExLCAweEZGLCAweDI5LCAweDQwLAorCSAweDEwLCAweDI2LCAweDZELCAweDAwLCAweDgwLCAweDYwLCAweDAxLCAweEUwLCAweEQ1LCAweDYwLCAweDg0LCAweEU3LCAweEExLCAweEYzLCAweDQwLCAweDYwLAorCSAweDYwLCAweDQwLCAweDAxLCAweDIzLCAweDQ4LCAweDYwLCAweDVFLCAweDY1LCAweDgwLCAweDYwLCAweDAwLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LAorCSAweEZFLCAweDAxLCAweDY1LCAweDRBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDAwLCAweDYwLCAweDAwLCAweDZBLCAweEZGLCAweEZGLAorCSAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDgwLCAweDYwLCAweDAwLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDY1LCAweDRBLAorCSAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDAwLCAweDYwLCAweDAxLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLAorCSAweDk1LCAweDYwLCAweDg0LCAweEU3LCAweDgwLCAweDYwLCAweDAxLCAweEUwLCAweEQ1LCAweDYwLCAweDg0LCAweEU3LCAweEExLCAweEYzLCAweDdDLCAweDQ1LAorCSAweDYwLCAweDQwLCAweDAxLCAweDIzLCAweDAyLCAweDY1LCAweDhDLCAweDYwLCAweDQ4LCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLAorCSAweDAwLCAweDYwLCAweDAwLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDAwLCAweDYwLCAweDdGLCAweDZBLCAweEZGLCAweEZGLAorCSAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDg0LCAweDYwLCAweDA0LCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDQ4LCAweDYwLAorCSAweDA4LCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDY1LCAweDRBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLAorCSAweDg0LCAweDYwLCAweDA0LCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDQwLCAweDYwLCAweDA4LCAweDZBLCAweEZGLCAweEZGLAorCSAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDY1LCAweDRBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDhDLCAweDYwLCAweDQ4LCAweDZBLAorCSAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDAwLCAweDYwLCAweDAwLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLAorCSAweDAwLCAweDYwLCAweDAwLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDk1LCAweDYwLCAweDg0LCAweEU3LCAweDAxLCAweDYwLAorCSAweDA4LCAweEUxLCAweEZGLCAweEZGLCAweEM0LCAweEUyLCAweDI5LCAweDQwLCAweDQwLCAweDJCLCAweDA0LCAweDAwLCAweEMyLCAweDYwLCAweDU4LCAweDRGLAorCSAweEJBLCAweDc4LCAweEZGLCAweEZGLCAweEMyLCAweDYwLCAweDU4LCAweDRGLCAweEM1LCAweDc4LCAweEZGLCAweEZGLCAweEExLCAweEZGLCAweENCLCAweEYzLAorCSAweEM0LCAweEUyLCAweDg5LCAweEZGLCAweDYwLCAweDU0LCAweDg4LCAweEZGLCAweERDLCAweDg0LCAweEUwLCAweDk0LCAweDM1LCAweEY3LCAweEZGLCAweEZGLAorCSAweEZGLCAweEZGLCAweEZGLCAweDAxLCAweDEwLCAweDYxLCAweDdGLCAweDYwLCAweEMwLCAweDY0LCAweEEwLCAweDgwLCAweDdGLCAweDY3LCAweDAyLCAweDYzLAorCSAweDI1LCAweDAyLCAweDk4LCAweEZFLCAweDE5LCAweDA1LCAweDEyLCAweDYwLCAweEZDLCAweEY1LCAweDBFLCAweEYyLCAweDE1LCAweDE4LCAweDAyLCAweDE4LAorCSAweDA5LCAweEY0LCAweEZCLCAweDAxLCAweDIzLCAweDQ0LCAweDAwLCAweEE4LCAweDA4LCAweDdFLCAweDBBLCAweDAyLCAweDY2LCAweDQ0LCAweDExLCAweEZCLAorCSAweDQ2LCAweDQzLCAweDIzLCAweDQ3LCAweDgwLCAweEJGLCAweDNCLCAweDQyLCAweDA0LCAweEEyLCAweEEyLCAweERCLCAweDI4LCAweEI5LCAweDEwLCAweDdFLAorCSAweDAwLCAweDdGLCAweDBFLCAweEZBLCAweDAwLCAweDY3LCAweDBBLCAweDAwLCAweDIwLCAweDQ0LCAweERDLCAweDg1LCAweDBGLCAweEI0LCAweEZCLCAweEEwLAorCSAweDdGLCAweDY3LCAweDA3LCAweDYzLCAweDAzLCAweDA1LCAweDQ1LCAweDQwLCAweDAwLCAweDY3LCAweEQ4LCAweEZFLCAweEZGLCAweDI3LCAweDA1LCAweEZELAorCSAweDBBLCAweDdFLCAweDA0LCAweEZCLCAweDYxLCAweDU1LCAweDQ4LCAweDAwLCAweDI4LCAweEZCLCAweDAxLCAweEYzLCAweDI5LCAweEZCLCAweDQ0LCAweDQ2LAorCSAweDQwLCAweDQ1LCAweDEwLCAweDYxLCAweDdFLCAweDYwLCAweEMwLCAweDY0LCAweEEwLCAweDgwLCAweDdGLCAweDY3LCAweDAyLCAweDYzLCAweDMwLCAweDAyLAorCSAweEI1LCAweDYwLCAweDU4LCAweDRGLCAweENFLCAweDc4LCAweEZGLCAweEZGLCAweDdGLCAweDY3LCAweDAzLCAweDYzLCAweDI5LCAweDAyLCAweDI2LCAweDQwLAorCSAweDAxLCAweDJCLCAweDIzLCAweDAwLCAweDk4LCAweEZFLCAweDE4LCAweDA1LCAweDEyLCAweDYwLCAweEZDLCAweEY1LCAweDBFLCAweEYyLCAweDE0LCAweDE4LAorCSAweDAyLCAweDE4LCAweDA5LCAweEY0LCAweEZCLCAweDAxLCAweDIzLCAweDQ0LCAweDAwLCAweEE4LCAweDA4LCAweDdFLCAweDBBLCAweDAyLCAweDY2LCAweDQ0LAorCSAweDExLCAweEZCLCAweDQ2LCAweDQzLCAweDIzLCAweDQ3LCAweDgwLCAweEJGLCAweDNCLCAweDQyLCAweDA0LCAweEEyLCAweEEyLCAweERCLCAweDA4LCAweEI5LAorCSAweDEwLCAweDdFLCAweDAwLCAweDdGLCAweDBFLCAweEZBLCAweDA5LCAweDAwLCAweDIwLCAweDQ0LCAweERDLCAweDg1LCAweDBGLCAweEI0LCAweEZCLCAweEEwLAorCSAweDdGLCAweDY3LCAweDA3LCAweDYzLCAweDA1LCAweDA1LCAweDQ1LCAweDQwLCAweEQ4LCAweEZFLCAweDAwLCAweDY3LCAweEQwLCAweEZFLCAweEQ5LCAweEZFLAorCSAweEZGLCAweDI3LCAweDA1LCAweEZELCAweDBCLCAweDdFLCAweDA0LCAweEZCLCAweDBFLCAweDYwLCAweERELCAweEYzLCAweEZGLCAweEZGLCAweDIwLCAweEIwLAorCSAweDgwLCAweEJDLCAweDA4LCAweDI4LCAweEEyLCAweERCLCAweDYxLCAweDU1LCAweDY2LCAweDAwLCAweDA0LCAweEI1LCAweDgyLCAweEI1LCAweDI1LCAweDAyLAorCSAweDA0LCAweDAzLCAweDIwLCAweDQ0LCAweDdGLCAweEI0LCAweDQwLCAweDQwLCAweEEzLCAweEQzLCAweDk5LCAweEZFLCAweDA0LCAweDA0LCAweDAyLCAweEJDLAorCSAweEZFLCAweEI0LCAweEEzLCAweERCLCAweDU5LCAweDAwLCAweERCLCAweEYzLCAweDIwLCAweDQwLCAweDgwLCAweDI2LCAweDU1LCAweDAwLCAweEEzLCAweEQzLAorCSAweEZGLCAweEEwLCAweEY4LCAweEI0LCAweDAyLCAweDAyLCAweEEzLCAweERCLCAweDFDLCAweDAwLCAweDA0LCAweEJDLCAweEJGLCAweEI0LCAweEEzLCAweERCLAorCSAweDA4LCAweEIwLCAweDAxLCAweDY0LCAweDA4LCAweDI0LCAweDAyLCAweDY0LCAweDI4LCAweEZCLCAweDIwLCAweDQ0LCAweDgwLCAweEJDLCAweDQwLCAweDQwLAorCSAweEQwLCAweEZFLCAweDQyLCAweDAwLCAweEJGLCAweEI0LCAweEEzLCAweERCLCAweDNGLCAweDAwLCAweDQwLCAweEIwLCAweEZGLCAweEZGLCAweEZBLCAweDAyLAorCSAweEY4LCAweEI0LCAweEEzLCAweERCLCAweDA4LCAweEI1LCAweDA3LCAweDdDLCAweDAxLCAweDAyLCAweERCLCAweEY5LCAweDIwLCAweDQ0LCAweDdGLCAweEI0LAorCSAweDQwLCAweDQwLCAweDFELCAweDYwLCAweEJBLCAweDYzLCAweEEzLCAweEQzLCAweEZGLCAweEZGLCAweDIwLCAweEI1LCAweDA3LCAweEI1LCAweDA4LCAweDI4LAorCSAweEM0LCAweDAyLCAweDk5LCAweEZFLCAweDI5LCAweDA1LCAweDIwLCAweDQ0LCAweDgwLCAweDI2LCAweDI2LCAweDAwLCAweDIwLCAweDJBLCAweDAzLCAweDAwLAorCSAweERGLCAweEI0LCAweDQwLCAweDQwLCAweDc0LCAweDAwLCAweDQwLCAweDJBLCAweDFGLCAweDAwLCAweEJGLCAweEI0LCAweDQwLCAweDQwLCAweDA5LCAweDAwLAorCSAweEE4LCAweEZGLCAweDIwLCAweDQ0LCAweDk5LCAweEZFLCAweDAyLCAweDA1LCAweDgwLCAweDJBLCAweDAzLCAweDAwLCAweDQwLCAweEJDLCAweDQwLCAweDQwLAorCSAweDEzLCAweDAwLCAweDAwLCAweEYxLCAweDgwLCAweEJDLCAweDQwLCAweDQwLCAweDY0LCAweDQ0LCAweEUwLCAweDg0LCAweEU4LCAweDg0LCAweDBBLCAweDM2LAorCSAweDI5LCAweDAxLCAweDBCLCAweDM2LCAweDU5LCAweDAxLCAweDI4LCAweEZCLCAweDAxLCAweEYxLCAweDI5LCAweEY5LCAweDAyLCAweEYxLCAweDJBLCAweEY5LAorCSAweDAzLCAweEYxLCAweDJCLCAweEY5LCAweEQwLCAweEZFLCAweEFFLCAweEZGLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDgyLCAweDNFLCAweDc1LCAweDQ0LAorCSAweDAyLCAweEIwLCAweDAxLCAweEIwLCAweDU0LCAweDAyLCAweERDLCAweDAyLCAweDA0LCAweEIwLCAweDA4LCAweEIwLCAweDEwLCAweDAyLCAweDJBLCAweDAyLAorCSAweDQwLCAweDI2LCAweEE3LCAweEZGLCAweDhDLCAweEZGLCAweDc1LCAweDQwLCAweDgwLCAweDJCLCAweDA2LCAweDAwLCAweEFCLCAweEZGLCAweDE5LCAweDYwLAorCSAweEY2LCAweEYzLCAweEZGLCAweEZGLCAweEZFLCAweEI0LCAweEEyLCAweERCLCAweDc1LCAweDQ0LCAweDhELCAweEZGLCAweEU1LCAweDAxLCAweDBBLCAweEYzLAorCSAweEFBLCAweEZGLCAweDYwLCAweDQwLCAweDIwLCAweDJCLCAweDAyLCAweDAwLCAweDM4LCAweEZGLCAweDBELCAweDAwLCAweDAxLCAweDI2LCAweDBDLCAweDAwLAorCSAweEMwLCAweDYwLCAweDAwLCAweDdDLCAweEEwLCAweDg0LCAweDgwLCAweDNCLCAweDAyLCAweDAwLCAweEMwLCAweDY3LCAweDAzLCAweDAwLCAweDQwLCAweDNCLAorCSAweDAyLCAweDAwLCAweDAwLCAweDY3LCAweDBBLCAweEZCLCAweEQwLCAweDAxLCAweDE5LCAweDYwLCAweEY2LCAweEYzLCAweEZGLCAweEZGLCAweEZFLCAweEI0LAorCSAweEEyLCAweERCLCAweENBLCAweDAxLCAweDBCLCAweEYxLCAweEFCLCAweEZGLCAweDY0LCAweDQ0LCAweEZGLCAweDI3LCAweDFGLCAweDAwLCAweDIwLCAweDI2LAorCSAweDAzLCAweDAwLCAweDAyLCAweDYwLCAweDAwLCAweDc1LCAweDFBLCAweDAwLCAweDE5LCAweEYzLCAweEZGLCAweEZGLCAweDAzLCAweDFCLCAweDA0LCAweDYwLAorCSAweDAwLCAweDc1LCAweDBBLCAweDY0LCAweENDLCAweDg0LCAweDE5LCAweEZCLCAweDAxLCAweDYwLCAweDAwLCAweDc1LCAweDY0LCAweDQwLCAweDAzLCAweDIyLAorCSAweDBELCAweDAwLCAweDIwLCAweDQ0LCAweDgwLCAweDJBLCAweDAzLCAweDAwLCAweDIwLCAweEJDLCAweDQwLCAweDQwLCAweDA3LCAweDAwLCAweEQ5LCAweEZFLAorCSAweDgxLCAweDYwLCAweDBCLCAweDY0LCAweDI4LCAweEZCLCAweDJDLCAweDQ0LCAweDI5LCAweEZCLCAweEQwLCAweEZFLCAweEE1LCAweDAxLCAweEE5LCAweEZGLAorCSAweDc3LCAweDQ0LCAweDYwLCAweDU3LCAweDQwLCAweDRBLCAweDAxLCAweDJBLCAweDMxLCAweDAwLCAweDI0LCAweDQ0LCAweEFDLCAweDg2LCAweDA4LCAweEYyLAorCSAweDJELCAweDAzLCAweDI1LCAweDYwLCAweEZFLCAweDY1LCAweEQ0LCAweDgwLCAweDBFLCAweEYyLCAweDAyLCAweDAzLCAweEE1LCAweEQ1LCAweDA0LCAweDAwLAorCSAweDAxLCAweEJDLCAweDBFLCAweEZBLCAweDA5LCAweEY0LCAweEQxLCAweEZFLCAweDQ2LCAweDQ0LCAweDExLCAweDFCLCAweDMyLCAweDQwLCAweDgwLCAweDJBLAorCSAweDFELCAweDAwLCAweDlELCAweEZFLCAweDFCLCAweDA1LCAweDEzLCAweDYwLCAweDAyLCAweEYzLCAweEZGLCAweEZGLCAweDAwLCAweEE4LCAweDYwLCAweDQ2LAorCSAweDAzLCAweDAzLCAweDBGLCAweEYyLCAweEZGLCAweEZGLCAweDEyLCAweDFCLCAweDA4LCAweDYwLCAweDAwLCAweDc1LCAweDBGLCAweDAwLCAweDNGLCAweEYyLAorCSAweDQ4LCAweDY1LCAweEM0LCAweDg0LCAweDEzLCAweEZCLCAweDY2LCAweDQ0LCAweDEwLCAweEZCLCAweDY2LCAweDQ3LCAweDIwLCAweEJGLCAweDNCLCAweDQyLAorCSAweDA0LCAweEEyLCAweEEyLCAweERCLCAweDBFLCAweEYyLCAweDQxLCAweDc1LCAweDEwLCAweEJDLCAweDBFLCAweEZBLCAweDJBLCAweDQ0LCAweDA4LCAweDJBLAorCSAweDE3LCAweDAwLCAweDIzLCAweDQ0LCAweDAwLCAweEE4LCAweDVDLCAweDQzLCAweDEzLCAweDAzLCAweDEyLCAweDYwLCAweEZDLCAweEY1LCAweDAxLCAweDAwLAorCSAweDA5LCAweEY0LCAweDBFLCAweEYyLCAweDBELCAweDE4LCAweDA4LCAweEIwLCAweDE4LCAweEFDLCAweEZBLCAweDAzLCAweDBFLCAweEZBLCAweDY2LCAweDQzLAorCSAweDExLCAweEZELCAweDQ2LCAweDQzLCAweDIzLCAweDQ3LCAweDgwLCAweEJGLCAweDNCLCAweDQyLCAweDA0LCAweEEyLCAweEEyLCAweERCLCAweDI4LCAweDc1LAorCSAweDJBLCAweDQ0LCAweDA2LCAweDIyLCAweDJELCAweDAwLCAweDIyLCAweDQ0LCAweDAwLCAweEE4LCAweDYwLCAweDQ2LCAweDBFLCAweEYyLCAweDI4LCAweDAzLAorCSAweDEwLCAweEIwLCAweDAxLCAweEJDLCAweDAzLCAweDAyLCAweDAwLCAweDY0LCAweDQwLCAweDQyLCAweDIyLCAweDAwLCAweDBFLCAweEZBLCAweEQxLCAweEZFLAorCSAweDI1LCAweDYwLCAweEYyLCAweDY0LCAweDQwLCAweDQ3LCAweDU4LCAweDRGLCAweDk0LCAweDAwLCAweDQ2LCAweDQyLCAweDE5LCAweDAyLCAweDIyLCAweDQ3LAorCSAweDQwLCAweEJGLCAweDNCLCAweDQyLCAweDA0LCAweEEyLCAweEEyLCAweERCLCAweDIzLCAweEYyLCAweDY2LCAweDQzLCAweDAwLCAweEE4LCAweDBFLCAweEYyLAorCSAweDA4LCAweDAyLCAweDYwLCAweDQwLCAweDAyLCAweDJBLCAweEU0LCAweDAxLCAweDEyLCAweEZELCAweDEwLCAweDY0LCAweDBFLCAweEZBLCAweDAyLCAweDc1LAorCSAweDA3LCAweDAwLCAweDYwLCAweDQwLCAweDA0LCAweDJBLCAweERDLCAweDAxLCAweDEyLCAweEZELCAweDEwLCAweDY0LCAweDBFLCAweEZBLCAweDA0LCAweDc1LAorCSAweDJBLCAweDQ0LCAweDgwLCAweDJBLCAweDE5LCAweDAwLCAweDIxLCAweDQ0LCAweEFDLCAweDg2LCAweDBFLCAweEYyLCAweDE1LCAweDAzLCAweDAxLCAweEJDLAorCSAweDBFLCAweEZBLCAweEQxLCAweEZFLCAweDI2LCAweDYwLCAweDBBLCAweDY0LCAweDQwLCAweDQ3LCAweDU4LCAweDRGLCAweDZBLCAweDAwLCAweDQ2LCAweDQxLAorCSAweDBCLCAweDAyLCAweDIxLCAweDQ3LCAweDEwLCAweEJGLCAweDNCLCAweDQyLCAweDA0LCAweEEyLCAweEEyLCAweERCLCAweDBFLCAweEYyLCAweDY2LCAweDQzLAorCSAweDA4LCAweEZELCAweDEwLCAweEJDLCAweDBFLCAweEZBLCAweDgwLCAweDc1LCAweDJBLCAweDQ0LCAweDEwLCAweEIwLCAweDIwLCAweDQ0LCAweDE4LCAweDAzLAorCSAweDdGLCAweEI0LCAweDQwLCAweDQwLCAweDFELCAweDYwLCAweEJBLCAweDYzLCAweEEzLCAweEQzLCAweEZGLCAweEZGLCAweDIwLCAweEIwLCAweDgwLCAweEIwLAorCSAweDA5LCAweDAzLCAweDA4LCAweDAzLCAweDQwLCAweEJDLCAweDdGLCAweEI0LCAweDA0LCAweEIwLCAweEEzLCAweERCLCAweDAzLCAweDAzLCAweDIwLCAweDQ0LAorCSAweDgwLCAweEJDLCAweDQwLCAweDQwLCAweDJBLCAweDQwLCAweDA4LCAweDI3LCAweDAzLCAweDAwLCAweEIzLCAweDYwLCAweEM5LCAweDc4LCAweEZGLCAweEZGLAorCSAweDJBLCAweDQwLCAweDA4LCAweDJCLCAweDBGLCAweDAwLCAweDMyLCAweDQwLCAweDgwLCAweDI2LCAweDA1LCAweDAwLCAweDE5LCAweDYwLCAweEY3LCAweEYzLAorCSAweEZGLCAweEZGLCAweDAxLCAweDFCLCAweDA3LCAweDAwLCAweDE5LCAweDYwLCAweEY2LCAweEYzLCAweEZGLCAweEZGLCAweDAxLCAweEJDLCAweEEyLCAweERCLAorCSAweEZGLCAweEZGLCAweDEwLCAweEZGLCAweEIzLCAweDYwLCAweEZDLCAweDc4LCAweEZGLCAweEZGLCAweEU4LCAweEZFLCAweDE0LCAweDA1LCAweEVBLCAweEZFLAorCSAweDIzLCAweDA1LCAweEU5LCAweEZFLCAweDFDLCAweDA1LCAweEU3LCAweEZFLCAweDA5LCAweDA1LCAweDQ3LCAweEZGLCAweDIwLCAweDQ0LCAweDBGLCAweDIyLAorCSAweDAzLCAweDAwLCAweENDLCAweDg0LCAweDQwLCAweDQwLCAweDBGLCAweDIyLCAweEI4LCAweEZFLCAweEVDLCAweDAxLCAweDIzLCAweDQxLCAweDAwLCAweEI5LAorCSAweDVDLCAweDRBLCAweEU4LCAweDAyLCAweDVBLCAweDAxLCAweDI0LCAweDQxLCAweDAwLCAweEI5LCAweDI1LCAweDYwLCAweEZFLCAweDY1LCAweDQ1LCAweDQ3LAorCSAweEUxLCAweDAyLCAweDU4LCAweDRGLCAweDBFLCAweDAwLCAweERFLCAweDAyLCAweDVDLCAweDRBLCAweDQ2LCAweDQ0LCAweDM4LCAweDAxLCAweDIyLCAweDQxLAorCSAweDAwLCAweEI5LCAweDVDLCAweDRBLCAweEQ3LCAweDAyLCAweDZDLCAweDAxLCAweDIxLCAweDQxLCAweDAwLCAweEI5LCAweDVDLCAweDRBLCAweDkyLCAweDAzLAorCSAweEQxLCAweDAxLCAweDI3LCAweEQzLCAweDAzLCAweDAwLCAweDEwLCAweEIwLCAweDA5LCAweEYyLCAweDA0LCAweDAzLCAweEFDLCAweDg2LCAweDBFLCAweEYyLAorCSAweEZBLCAweDAyLCAweDA4LCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBFLCAweEYzLCAweDBGLCAweDYwLCAweEZFLCAweDY1LCAweDBDLCAweEYzLAorCSAweDI0LCAweDg2LCAweDI0LCAweDQ2LCAweDYwLCAweDQwLCAweEZCLCAweDNCLCAweDA3LCAweDAwLCAweDgwLCAweDI2LCAweDAyLCAweDAwLCAweDIzLCAweDQ2LAorCSAweDAzLCAweDRDLCAweDQ2LCAweDYxLCAweDNBLCAweDY1LCAweDBDLCAweDAwLCAweDJFLCAweEYzLCAweDQwLCAweDQ1LCAweEY4LCAweDJCLCAweDAyLCAweDAwLAorCSAweDQwLCAweDQ1LCAweDAzLCAweDAwLCAweDU4LCAweDRGLCAweDVBLCAweDAwLCAweDA3LCAweDAyLCAweDU4LCAweDRGLCAweDY2LCAweDAwLCAweDA0LCAweDA1LAorCSAweDY2LCAweDUwLCAweDY1LCAweDUyLCAweDYxLCAweDUxLCAweDA5LCAweDAwLCAweDI2LCAweDQ3LCAweDAwLCAweEJGLCAweDBFLCAweEZCLCAweDJFLCAweEY1LAorCSAweDA1LCAweEYwLCAweDgwLCAweDYwLCAweDY0LCAweDUwLCAweDAwLCAweDcyLCAweDdFLCAweDcxLCAweEFDLCAweEZGLCAweDMxLCAweDQwLCAweDAxLCAweDJBLAorCSAweDA4LCAweDAwLCAweDE5LCAweDYwLCAweEYyLCAweEYzLCAweEZGLCAweEZGLCAweDA0LCAweDE4LCAweDBDLCAweDY0LCAweDEzLCAweDYwLCAweDEzLCAweEZCLAorCSAweDJELCAweEZGLCAweEIzLCAweDYwLCAweEZDLCAweDc4LCAweEZGLCAweEZGLCAweDhFLCAweEZGLCAweDBGLCAweEYzLCAweDBGLCAweDYwLCAweEZFLCAweDY1LAorCSAweDI0LCAweDg2LCAweDBELCAweEYzLCAweDI0LCAweDQ2LCAweDYwLCAweDQwLCAweEZCLCAweDNCLCAweDA3LCAweDAwLCAweDgwLCAweDI2LCAweDAyLCAweDAwLAorCSAweDIzLCAweDQ2LCAweDAzLCAweDRDLCAweDQ2LCAweDYxLCAweDNBLCAweDY1LCAweDBDLCAweDAwLCAweDJFLCAweEYzLCAweDQwLCAweDQ1LCAweEY4LCAweDJCLAorCSAweDAyLCAweDAwLCAweDQwLCAweDQ1LCAweDAzLCAweDAwLCAweDU4LCAweDRGLCAweDIxLCAweDAwLCAweDA3LCAweDAyLCAweDU4LCAweDRGLCAweDJELCAweDAwLAorCSAweDA0LCAweDA1LCAweDY2LCAweDUwLCAweDY1LCAweDUyLCAweDYxLCAweDUxLCAweDA5LCAweDAwLCAweDI2LCAweDQ3LCAweDAwLCAweEJGLCAweDBGLCAweEZCLAorCSAweDJFLCAweEY1LCAweDA1LCAweEYwLCAweDgwLCAweDYwLCAweDY0LCAweDUwLCAweDAwLCAweDcyLCAweDdFLCAweDcxLCAweDhELCAweEZGLCAweEFELCAweEZGLAorCSAweDMxLCAweDQwLCAweDAxLCAweDJBLCAweENFLCAweDAxLCAweDE5LCAweDYwLCAweEYyLCAweEYzLCAweEZGLCAweEZGLCAweDA0LCAweDE4LCAweDBDLCAweDY0LAorCSAweDEzLCAweDYwLCAweDEzLCAweEZCLCAweDJELCAweEZGLCAweEIzLCAweDYwLCAweEZDLCAweDc4LCAweEZGLCAweEZGLCAweDI1LCAweDQ0LCAweEE3LCAweEYxLAorCSAweEE4LCAweEYxLCAweEQwLCAweDgwLCAweEQwLCAweDgwLCAweDA3LCAweDA0LCAweDAxLCAweDA2LCAweDA1LCAweDAwLCAweDI1LCAweDQ2LCAweDAxLCAweEYwLAorCSAweDAzLCAweDY3LCAweEEwLCAweDg1LCAweDk0LCAweDgwLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDI1LCAweDQ2LCAweDI2LCAweDQxLCAweDQ2LCAweDYzLAorCSAweDAxLCAweEYyLCAweEZGLCAweEZGLCAweEZGLCAweEI1LCAweEQ1LCAweDgxLCAweDAwLCAweEYyLCAweDA1LCAweDA0LCAweDA0LCAweDYzLCAweDYwLCAweDQ2LAorCSAweEY3LCAweDFCLCAweDQyLCAweEZFLCAweDBELCAweDAwLCAweDYxLCAweDQ0LCAweEM1LCAweDgxLCAweDYzLCAweDQ1LCAweEM1LCAweDgxLCAweDlDLCAweDg0LAorCSAweERDLCAweDg0LCAweDAxLCAweEYyLCAweEYwLCAweDg1LCAweEYwLCAweDgwLCAweDY1LCAweDQ0LCAweEY4LCAweDg1LCAweEZGLCAweEZGLCAweDAyLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEEyLCAweEZGLCAweDEzLCAweDYwLCAweDA4LCAweEYzLCAweEZGLCAweEZGLCAweEFDLCAweDg2LCAweDBFLCAweEYyLAorCSAweDA3LCAweDAzLCAweDAwLCAweEE4LCAweDA5LCAweEYyLCAweEZBLCAweDAyLCAweDAxLCAweDY3LCAweDBFLCAweEZBLCAweDA4LCAweEZFLCAweDE3LCAweDAwLAorCSAweEE5LCAweEYzLCAweEZGLCAweEZGLCAweEQ4LCAweEEwLCAweDAwLCAweEI0LCAweDEyLCAweDA2LCAweDA5LCAweDYwLCAweDA4LCAweDYxLCAweDQxLCAweDRBLAorCSAweDdDLCAweEExLCAweDBFLCAweEExLCAweEEyLCAweEZGLCAweEI2LCAweDYwLCAweDU4LCAweDRFLCAweDQ0LCAweDc4LCAweEZGLCAweEZGLCAweEEzLCAweEZGLAorCSAweDA2LCAweDAzLCAweDJBLCAweDQzLCAweEI2LCAweDYwLCAweDU4LCAweDRFLCAweDY1LCAweDc4LCAweEZGLCAweEZGLCAweDA4LCAweEZFLCAweEEzLCAweEZGLAorCSAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDQxLCAweDRBLCAweDQyLCAweEExLCAweDAzLCAweDAwLCAweDQxLCAweDRBLCAweDdDLCAweEExLCAweDBFLCAweEExLAorCSAweEEyLCAweEZGLCAweEI2LCAweDYwLCAweDU4LCAweDRFLCAweDQ0LCAweDc4LCAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDJBLCAweDQzLCAweEI2LCAweDYwLAorCSAweDU4LCAweDRFLCAweDY1LCAweDc4LCAweEZGLCAweEZGLCAweDA4LCAweEZFLCAweDBDLCAweDAwLCAweDEzLCAweDYwLCAweDA4LCAweEYzLCAweEZGLCAweEZGLAorCSAweEFDLCAweDg2LCAweDBFLCAweEYyLCAweDA2LCAweDAzLCAweDAwLCAweEE4LCAweDA5LCAweEYyLCAweEZBLCAweDAyLCAweDAxLCAweDY3LCAweDBFLCAweEZBLAorCSAweDA4LCAweEZFLCAweEEzLCAweEZGLCAweDJELCAweDU4LCAweEZGLCAweEZGLCAweEFBLCAweEYzLCAweDdDLCAweDYzLCAweDAwLCAweEJFLCAweDQwLCAweDQ1LAorCSAweDFBLCAweDAzLCAweDAwLCAweDY1LCAweDY1LCAweDQ0LCAweERDLCAweDg1LCAweDg0LCAweEExLCAweDAwLCAweEYyLCAweDA2LCAweDA2LCAweDAxLCAweEZDLAorCSAweDAwLCAweEE4LCAweDYwLCAweDQ2LCAweEY3LCAweDAyLCAweDQwLCAweDQ1LCAweDBFLCAweDAwLCAweEE5LCAweEYzLCAweDAwLCAweDYzLCAweEQ0LCAweDg0LAorCSAweEE5LCAweEZCLCAweDgwLCAweDYwLCAweDdDLCAweDY0LCAweDAxLCAweEZBLCAweDAwLCAweEYwLCAweDAwLCAweEZDLCAweEQzLCAweDgwLCAweEFBLCAweEY5LAorCSAweDAyLCAweDAyLCAweEFCLCAweEY5LCAweDA4LCAweEZFLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDY2LCAweDQ0LCAweDI1LCAweDQ2LCAweDA1LCAweEZBLAorCSAweDA2LCAweEZBLCAweDAxLCAweEYwLCAweDAzLCAweDY3LCAweDAyLCAweEZDLCAweEIwLCAweDg0LCAweDNBLCAweDdFLCAweDAxLCAweEZBLCAweDEyLCAweDY0LAorCSAweDAzLCAweEZBLCAweDAwLCAweEYwLCAweDA0LCAweEY4LCAweDAwLCAweDY0LCAweDBDLCAweDYxLCAweDEwLCAweDYzLCAweDU5LCAweERBLCAweEZFLCAweDFGLAorCSAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDI3LCAweDQzLCAweEUzLCAweDgxLCAweEU5LCAweDgxLCAweDAzLCAweDA1LCAweDE2LCAweDAzLCAweDAwLCAweDYxLAorCSAweDAxLCAweDAwLCAweEVDLCAweDYzLCAweDYxLCAweDQ2LCAweEJGLCAweEQyLCAweDI3LCAweDQ1LCAweERDLCAweDg0LCAweEEyLCAweERBLCAweEJFLCAweEQyLAorCSAweDI1LCAweDQ2LCAweDg4LCAweEY4LCAweDA0LCAweDFCLCAweDI1LCAweDQ0LCAweDYxLCAweDQ2LCAweEEzLCAweERBLCAweDA0LCAweDAwLCAweDBBLCAweEZBLAorCSAweDYwLCAweDQ2LCAweDI1LCAweDQ0LCAweDA5LCAweEZBLCAweDYxLCAweDQ2LCAweEJFLCAweERBLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDI1LCAweDQ0LAorCSAweDAwLCAweEE4LCAweDA3LCAweDRCLCAweDBDLCAweDAzLCAweDU4LCAweDRGLCAweDMzLCAweDAwLCAweDBCLCAweDQ3LCAweDI2LCAweDYwLCAweDA0LCAweDY1LAorCSAweDI3LCAweDQ0LCAweEQ0LCAweDgwLCAweDAwLCAweDY0LCAweDAxLCAweDAyLCAweDBGLCAweEZBLCAweDU4LCAweDRGLCAweEQzLCAweDAxLCAweDcwLCAweDAwLAorCSAweDI1LCAweDQzLCAweEUzLCAweDg0LCAweDdDLCAweDQxLCAweDAyLCAweDA0LCAweEU4LCAweDgxLCAweEVDLCAweDYzLCAweDYxLCAweDQ2LCAweEEzLCAweEQyLAorCSAweDAwLCAweDdDLCAweDQwLCAweDQ1LCAweEJGLCAweEQ4LCAweEEzLCAweEQ4LCAweEJFLCAweEQ4LCAweDI3LCAweDQyLCAweDVBLCAweEQzLCAweDI1LCAweDVDLAorCSAweDYwLCAweDQxLCAweDAyLCAweDFCLCAweDI3LCAweEQ5LCAweDA1LCAweDAwLCAweDI1LCAweDQ2LCAweDBBLCAweEZBLCAweDYxLCAweDQ2LCAweDI1LCAweDQ0LAorCSAweDA5LCAweEZBLCAweDI1LCAweDQ0LCAweDI3LCAweDQzLCAweDAwLCAweDYxLCAweDYwLCAweDQ2LCAweDA5LCAweEYyLCAweDA4LCAweEZDLCAweDAwLCAweEE4LAorCSAweERELCAweDgxLCAweEZBLCAweDAyLCAweEJGLCAweEQxLCAweDY2LCAweDQ0LCAweEJFLCAweERCLCAweEMxLCAweDg0LCAweEJGLCAweERCLCAweDQ4LCAweDAwLAorCSAweDI1LCAweDQ2LCAweEVDLCAweDYzLCAweDA4LCAweEYyLCAweDg5LCAweEYyLCAweDFFLCAweDE4LCAweDQwLCAweDQ3LCAweEUwLCAweDg0LCAweEU4LCAweDg1LAorCSAweDAyLCAweDA1LCAweEU4LCAweDgzLCAweDAwLCAweDY1LCAweDY1LCAweDQ2LCAweEJGLCAweEQyLCAweDYxLCAweDVDLCAweENDLCAweDg0LCAweEEyLCAweERBLAorCSAweDI1LCAweDQ2LCAweDBBLCAweEYyLCAweDAwLCAweEI5LCAweDY1LCAweDQ2LCAweDA4LCAweDI0LCAweEJFLCAweERBLCAweDAyLCAweDFCLCAweEEzLCAweEQ4LAorCSAweDAyLCAweDAwLCAweDYwLCAweDQ2LCAweDg5LCAweEZBLCAweDAwLCAweEI5LCAweDYxLCAweDQ2LCAweDA4LCAweDI4LCAweDBBLCAweEZBLCAweDI1LCAweDQ2LAorCSAweDg5LCAweEZDLCAweDhBLCAweEZDLCAweDg4LCAweEZDLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDYxLCAweDI4LCAweDY1LCAweDI1LCAweDQzLAorCSAweEFCLCAweEYzLCAweEFGLCAweDgzLCAweDAwLCAweEJFLCAweDE4LCAweDAzLCAweDAyLCAweDAzLCAweDAwLCAweEZDLCAweDAxLCAweDAwLCAweEFBLCAweEZELAorCSAweDYzLCAweDQ2LCAweDY1LCAweDQ0LCAweENDLCAweDg1LCAweDAwLCAweEYyLCAweDA3LCAweDAyLCAweEFCLCAweEY1LCAweDAwLCAweDY0LCAweDAwLCAweEZBLAorCSAweERFLCAweDYwLCAweEFGLCAweDY0LCAweDA5LCAweEZCLCAweDA4LCAweDAwLCAweDY2LCAweDQzLCAweDAwLCAweEJFLCAweERELCAweDgxLCAweEYxLCAweDAyLAorCSAweEE5LCAweEYxLCAweEFCLCAweEZELCAweEMxLCAweDg0LCAweEE5LCAweEZCLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDY2LCAweDQ2LCAweDQ1LAorCSAweDI5LCAweDQzLCAweEZDLCAweEEzLCAweDY2LCAweDQ0LCAweEJELCAweERCLCAweDI1LCAweDQ0LCAweEJELCAweERCLCAweDAwLCAweDY0LCAweEJELCAweERCLAorCSAweDAzLCAweDYxLCAweDBFLCAweDY1LCAweDI2LCAweDYwLCAweDE4LCAweDYzLCAweDQzLCAweDQ5LCAweEEzLCAweEQzLCAweDA2LCAweEEzLCAweDAwLCAweEE4LAorCSAweENELCAweDgxLCAweDA0LCAweDAyLCAweEY5LCAweDAyLCAweEIzLCAweDYwLCAweEZDLCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDI2LCAweEU2LCAweDAxLAorCSAweEQ0LCAweDgwLCAweDYwLCAweDQ1LCAweEUzLCAweDA1LCAweEY2LCAweEEzLCAweEJELCAweEQxLCAweEJELCAweEQxLCAweDQ0LCAweDQ3LCAweDQ0LCAweDQ4LAorCSAweDQ0LCAweDQ1LCAweDI2LCAweDYwLCAweDVBLCAweDY0LCAweDQ0LCAweEQ3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDI1LCAweDYwLCAweEM4LCAweDYzLAorCSAweDBELCAweDY1LCAweDAwLCAweDYxLCAweDQxLCAweDQ4LCAweEEzLCAweEQzLCAweDA2LCAweEEzLCAweEFDLCAweDg2LCAweDAwLCAweDYxLCAweDA5LCAweDAzLAorCSAweDAwLCAweEYyLCAweDA5LCAweEYwLCAweEFDLCAweDg2LCAweDAwLCAweEYyLCAweERELCAweDgxLCAweEZDLCAweDAyLCAweDY0LCAweDQ0LCAweEFDLCAweDg2LAorCSAweEY2LCAweDAxLCAweDYxLCAweDQ0LCAweDI1LCAweDQ2LCAweDI3LCAweERBLCAweDY1LCAweDQ0LCAweDI4LCAweDQ1LCAweDQ1LCAweDg4LCAweENDLCAweDg1LAorCSAweDVBLCAweDg3LCAweEU5LCAweDAyLCAweDAwLCAweDY0LCAweDI3LCAweERBLCAweDVBLCAweERBLCAweDVBLCAweDg3LCAweEE2LCAweEYzLCAweEE1LCAweEYxLAorCSAweDAyLCAweEE0LCAweDYwLCAweDQ2LCAweDYwLCAweDQ1LCAweDAwLCAweDYxLCAweDIyLCAweEYyLCAweEZGLCAweEZGLCAweEFDLCAweDg2LCAweDAwLCAweEYyLAorCSAweDA0LCAweDAzLCAweEFDLCAweDg2LCAweDAwLCAweEYyLCAweERELCAweDgxLCAweEZDLCAweDAyLCAweDY1LCAweDQ0LCAweDAyLCAweEE1LCAweDY1LCAweDQ2LAorCSAweDY0LCAweDQ0LCAweENDLCAweDlDLCAweEZGLCAweEZGLCAweEYwLCAweDAyLCAweDYxLCAweDQ0LCAweDI1LCAweDQ2LCAweDI3LCAweERBLCAweDVBLCAweDg3LAorCSAweDI4LCAweDQ1LCAweDQ1LCAweDg4LCAweDAwLCAweDY0LCAweDI3LCAweERBLCAweDVBLCAweDg3LCAweDA2LCAweDYwLCAweDQwLCAweDY1LCAweEFBLCAweEYzLAorCSAweDAxLCAweDYxLCAweEFDLCAweDg2LCAweDAwLCAweEYyLCAweDAzLCAweDAzLCAweEQ1LCAweDgwLCAweERELCAweDgxLCAweEZBLCAweDA0LCAweENELCAweDg0LAorCSAweDI1LCAweDQ2LCAweDI3LCAweERBLCAweDI4LCAweDQ1LCAweEM0LCAweDg0LCAweDVBLCAweERBLCAweERBLCAweDgxLCAweEE5LCAweEYxLCAweDU5LCAweEQ4LAorCSAweDI1LCAweDYwLCAweEM2LCAweDY0LCAweDE4LCAweDYzLCAweEEwLCAweEQxLCAweDA2LCAweEE0LCAweDU5LCAweEQ4LCAweEZDLCAweDFGLCAweDAwLCAweDY0LAorCSAweDU5LCAweERBLCAweDU5LCAweERBLCAweDAxLCAweDYwLCAweDU2LCAweDY0LCAweDBBLCAweDYzLCAweDU4LCAweEQxLCAweDU5LCAweEQ4LCAweEZELCAweDFGLAorCSAweERCLCAweEYxLCAweDU5LCAweEQ4LCAweDc1LCAweDAxLCAweDA3LCAweDRCLCAweEI2LCAweDYwLCAweDU4LCAweDRGLCAweEQwLCAweDc4LCAweEZGLCAweEZGLAorCSAweDBCLCAweDQ3LCAweDU4LCAweDRGLCAweDIxLCAweDAwLCAweDZDLCAweDAxLCAweDA3LCAweDRCLCAweEI2LCAweDYwLCAweDU4LCAweDRGLCAweEQwLCAweDc4LAorCSAweEZGLCAweEZGLCAweDBCLCAweDQ3LCAweDI3LCAweDQ0LCAweDAwLCAweEJFLCAweDA4LCAweEYwLCAweDE1LCAweDAzLCAweDY0LCAweDQyLCAweDRBLCAweEQzLAorCSAweDA5LCAweEYyLCAweERDLCAweDgzLCAweEEyLCAweERELCAweDI1LCAweDQzLCAweDA5LCAweEZDLCAweDYzLCAweDQ2LCAweDI3LCAweDQzLCAweDBBLCAweEZDLAorCSAweDA5LCAweEZBLCAweDA4LCAweEY4LCAweDAwLCAweEE4LCAweDY2LCAweDQzLCAweDAzLCAweDAyLCAweDY0LCAweDQ0LCAweDU4LCAweERELCAweDAzLCAweDAwLAorCSAweDYwLCAweDQ2LCAweDI1LCAweDQ0LCAweDBBLCAweEZBLCAweDRDLCAweDAxLCAweDI3LCAweDQzLCAweEUzLCAweDgxLCAweEU5LCAweDgxLCAweDAzLCAweDA1LAorCSAweDE2LCAweDAzLCAweDAwLCAweDYxLCAweDAxLCAweDAwLCAweEVDLCAweDYzLCAweDYxLCAweDQ2LCAweEJGLCAweEQyLCAweDI3LCAweDQ1LCAweERDLCAweDg0LAorCSAweEEyLCAweERBLCAweEEzLCAweEQyLCAweDI1LCAweDQ2LCAweDg4LCAweEY4LCAweDA0LCAweDFCLCAweDI1LCAweDQ0LCAweDYxLCAweDQ2LCAweEJFLCAweERBLAorCSAweDA0LCAweDAwLCAweDA5LCAweEZBLCAweDYwLCAweDQ2LCAweDI1LCAweDQ0LCAweDBBLCAweEZBLCAweDYxLCAweDQ2LCAweEEzLCAweERBLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweEEwLCAweEZFLCAweDA3LCAweDA1LCAweEEzLCAweEZFLCAweDA3LCAweDA1LCAweEExLCAweEZFLCAweDQ4LCAweDA1LCAweDYwLCAweDY0LAorCSAweDNCLCAweERCLCAweDExLCAweDAwLCAweDIwLCAweDU4LCAweEZGLCAweEZGLCAweDRGLCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDBFLCAweDYwLAorCSAweERGLCAweEYzLCAweEZGLCAweEZGLCAweEZCLCAweEI0LCAweEEyLCAweERCLCAweEEwLCAweDRDLCAweDU5LCAweEJDLCAweEZGLCAweEI0LCAweEEwLCAweDUxLAorCSAweEEwLCAweDRDLCAweDdELCAweEI0LCAweEEwLCAweDUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDgzLCAweDNFLCAweDQwLCAweDYwLCAweDBCLCAweDY1LAorCSAweDJCLCAweDQ0LCAweDAwLCAweDYzLCAweEU4LCAweDgwLCAweEY4LCAweDg0LCAweDAyLCAweDI0LCAweDk0LCAweDg0LCAweEYzLCAweDgzLCAweENELCAweDgxLAorCSAweEZGLCAweEZGLCAweEY4LCAweDAyLCAweERGLCAweDgzLCAweDJGLCAweDU4LCAweDQwLCAweDRCLCAweDAwLCAweDYyLCAweDAxLCAweDY0LCAweEQ0LCAweDgwLAorCSAweEUwLCAweDg0LCAweDFBLCAweDAzLCAweEQ0LCAweDgwLCAweEUwLCAweDg0LCAweDE1LCAweDAzLCAweDYxLCAweDQ0LCAweDExLCAweDYxLCAweEUwLCAweDg0LAorCSAweENELCAweDgxLCAweEZELCAweDA0LCAweDAxLCAweDAwLCAweEUwLCAweDg0LCAweEYyLCAweDgyLCAweEZGLCAweEZGLCAweDAyLCAweDI0LCAweEM2LCAweDgyLAorCSAweDAyLCAweDI4LCAweEQ2LCAweDgyLCAweEUyLCAweDgwLCAweENELCAweDgxLCAweDAyLCAweDI4LCAweDAxLCAweEJDLCAweEY0LCAweDAyLCAweDAxLCAweDJBLAorCSAweEM2LCAweDgyLCAweDAzLCAweDAwLCAweEU5LCAweDgxLCAweEYyLCAweDgyLCAweDYxLCAweDQ0LCAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDY0LAorCSAweDNCLCAweERCLCAweDNDLCAweDQ0LCAweEFDLCAweDgwLCAweEZGLCAweEZGLCAweEM2LCAweDAyLCAweDg5LCAweEYzLCAweDhBLCAweEYzLCAweDAyLCAweEE4LAorCSAweDAyLCAweEE4LCAweDA4LCAweDAyLCAweDAwLCAweDY0LCAweDhCLCAweEZCLCAweDg5LCAweEZCLCAweDhBLCAweEZCLCAweDAwLCAweDY0LCAweDhDLCAweEZCLAorCSAweENBLCAweEZFLCAweDJBLCAweDAwLCAweDAzLCAweDAyLCAweDAwLCAweDY0LCAweDhBLCAweEZCLCAweENBLCAweEZFLCAweDAxLCAweDY0LCAweDNCLCAweERCLAorCSAweDEyLCAweDYwLCAweEU3LCAweEYzLCAweEZGLCAweEZGLCAweDAwLCAweEE4LCAweDYwLCAweDQ2LCAweDEzLCAweDAzLCAweERCLCAweEYzLCAweDJBLCAweEYyLAorCSAweEZELCAweEEwLCAweDYwLCAweDQwLCAweDgwLCAweDNBLCAweDMzLCAweDAwLCAweDMyLCAweDAyLCAweDlCLCAweEZFLCAweDMwLCAweDA1LCAweDAwLCAweDY0LAorCSAweDEzLCAweDYwLCAweDBBLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLAorCSAweEU3LCAweDAxLCAweDhBLCAweEYzLCAweEZGLCAweEZGLCAweDAxLCAweEE4LCAweEZGLCAweEZGLCAweDA2LCAweDAyLCAweDEyLCAweDYwLCAweEU0LCAweEYzLAorCSAweEZGLCAweEZGLCAweDAwLCAweEE4LCAweDYwLCAweDQ2LCAweDFCLCAweDAyLCAweDg2LCAweEZGLCAweDIwLCAweDQwLCAweDEyLCAweDI3LCAweDEzLCAweDAwLAorCSAweDlBLCAweEZFLCAweDExLCAweDA0LCAweDlELCAweEZFLCAweDBGLCAweDA0LCAweDk1LCAweEYzLCAweEZGLCAweEZGLCAweDgwLCAweEJDLCAweDk1LCAweEZCLAorCSAweDg0LCAweEZGLCAweEMyLCAweDYwLCAweDQ1LCAweDY0LCAweDQwLCAweDQyLCAweDA2LCAweDY0LCAweDEzLCAweDYwLCAweDE2LCAweEZCLCAweEZGLCAweEZGLAorCSAweDJELCAweEZGLCAweDEyLCAweDY0LCAweDNCLCAweERCLCAweDg0LCAweEZGLCAweEI3LCAweDYwLCAweEY3LCAweDc4LCAweEZGLCAweEZGLCAweDY2LCAweDQ0LAorCSAweEZDLCAweEZCLCAweDQ2LCAweDVDLCAweDE5LCAweDYwLCAweENGLCAweEYzLCAweDBELCAweEYyLCAweDYwLCAweDVDLCAweDY0LCAweDVGLCAweDBELCAweEZBLAorCSAweDExLCAweDY0LCAweDNCLCAweERCLCAweDlELCAweEZFLCAweDA2LCAweDA1LCAweDA4LCAweDY0LCAweDEzLCAweDYwLCAweDE2LCAweEZCLCAweDJELCAweEZGLAorCSAweEZGLCAweEZGLCAweEEzLCAweEZFLCAweDA3LCAweEYwLCAweDAwLCAweDY0LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA3LCAweDAyLCAweDIzLCAweEYwLAorCSAweDA0LCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweEJGLCAweDYwLCAweDc5LCAweDc4LCAweEZGLCAweEZGLCAweDJBLCAweEYyLCAweDAwLCAweDYzLAorCSAweDQwLCAweDQ3LCAweDUwLCAweDM2LCAweDA1LCAweDAwLCAweEE0LCAweDM2LCAweDAzLCAweDAwLCAweDgwLCAweDM2LCAweDAxLCAweDAwLCAweDAxLCAweDYzLAorCSAweDQ4LCAweEZELCAweDQwLCAweDQ3LCAweDA4LCAweDJBLCAweDA4LCAweDAwLCAweDAzLCAweDJGLCAweDA2LCAweDAwLCAweDdGLCAweEYxLCAweDJDLCAweEY4LAorCSAweDgwLCAweEYxLCAweDJELCAweEY4LCAweDgxLCAweEYxLCAweDJFLCAweEY4LCAweDRBLCAweEYzLCAweDM1LCAweEZBLCAweDEwLCAweEE0LCAweDRBLCAweEZCLAorCSAweDAwLCAweDY0LCAweDE1LCAweEZBLCAweDE2LCAweEZBLCAweDBGLCAweEZBLCAweDA3LCAweEYwLCAweEE2LCAweEYzLCAweEZGLCAweEZGLCAweEQwLCAweDgwLAorCSAweEZGLCAweEZGLCAweDA1LCAweDAzLCAweDY2LCAweDQzLCAweDY0LCAweDQ2LCAweDExLCAweEYyLCAweEQ5LCAweEZCLCAweDYzLCAweDQ2LCAweDAzLCAweEYyLAorCSAweDAwLCAweEY0LCAweDAxLCAweEYyLCAweEZDLCAweEE1LCAweDAwLCAweDdGLCAweEQ0LCAweDg0LCAweDI3LCAweDQ1LCAweDNDLCAweDQ2LCAweDFBLCAweEZBLAorCSAweDIyLCAweDYzLCAweDdCLCAweDYwLCAweEZGLCAweDY0LCAweEE0LCAweDg0LCAweDAzLCAweDJCLCAweDFDLCAweDYzLCAweDJBLCAweEZBLCAweDhGLCAweEIwLAorCSAweDg4LCAweDM2LCAweDAyLCAweEEzLCAweDYwLCAweDQwLCAweEE0LCAweDM2LCAweDE0LCAweDYzLCAweDQzLCAweDRDLCAweDE4LCAweEZDLCAweDAwLCAweDdDLAorCSAweDIyLCAweEY4LCAweDY0LCAweDQxLCAweDA3LCAweEYwLCAweDY2LCAweDQzLCAweDY0LCAweDQ2LCAweDNBLCAweEYyLCAweDYzLCAweDQ2LCAweEZGLCAweEI0LAorCSAweDIyLCAweEZBLCAweDYwLCAweDQwLCAweDAwLCAweDM2LCAweDgyLCAweDAwLCAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDBDLCAweEIwLCAweDA4LCAweDNBLAorCSAweEFELCAweDAwLCAweDYwLCAweDQwLCAweDQwLCAweDI2LCAweEFBLCAweDAwLCAweDAzLCAweEYyLCAweDAwLCAweEY0LCAweEEwLCAweEQyLCAweEFBLCAweDYwLAorCSAweEFBLCAweDY1LCAweDVBLCAweEQwLCAweEQ0LCAweDgwLCAweDAzLCAweDY0LCAweDBBLCAweDAyLCAweEQwLCAweDgwLCAweDAwLCAweDY0LCAweDVBLCAweEQwLAorCSAweDA2LCAweDAyLCAweEQwLCAweDgwLCAweEY4LCAweDdGLCAweEQwLCAweDgwLCAweDAxLCAweDAzLCAweDAxLCAweDAyLCAweDAxLCAweDYxLCAweDYyLCAweDQzLAorCSAweDQ2LCAweDQzLCAweDNDLCAweDQ2LCAweDA3LCAweEY0LCAweDNBLCAweEYyLCAweEZGLCAweEZGLCAweEEzLCAweDQ2LCAweDYwLCAweDQwLCAweDIyLCAweDI2LAorCSAweDY0LCAweDAwLCAweDYwLCAweDQ1LCAweDYzLCAweDQyLCAweDVBLCAweEQwLCAweENELCAweDgxLCAweDNDLCAweDQ2LCAweDFCLCAweDAyLCAweDY0LCAweDQ0LAorCSAweDg4LCAweDNBLCAweDE4LCAweDAwLCAweDhFLCAweDM3LCAweDAzLCAweDAwLCAweEM3LCAweDM3LCAweDAxLCAweDAwLCAweDEzLCAweDAwLCAweDY1LCAweDQ0LAorCSAweDAxLCAweDI2LCAweDdDLCAweDAwLCAweDA0LCAweDI2LCAweDAzLCAweDAwLCAweDEwLCAweDI2LCAweDAxLCAweDAwLCAweDMxLCAweDAwLCAweEEzLCAweDQ2LAorCSAweDNCLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDgwLCAweDI3LCAweDVCLCAweDAwLCAweEEzLCAweDQ2LCAweDAwLCAweDdDLCAweDIyLCAweEY4LAorCSAweEEzLCAweDQ2LCAweDZDLCAweDAwLCAweEEzLCAweDQ2LCAweDY1LCAweDQ0LCAweDAxLCAweDI2LCAweDBCLCAweDAwLCAweDA0LCAweDI2LCAweDAzLCAweDAwLAorCSAweDEwLCAweDI2LCAweDAxLCAweDAwLCAweDFELCAweDAwLCAweDNCLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDgwLCAweDI3LCAweDQ4LCAweDAwLAorCSAweDE3LCAweDAwLCAweEE2LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQ2LCAweDNBLCAweEYyLCAweDY2LCAweDQzLCAweEZGLCAweEI0LCAweDNDLCAweDQ2LAorCSAweDIyLCAweEYwLCAweDYwLCAweDQ3LCAweEIwLCAweDg0LCAweDIyLCAweEZBLCAweDYzLCAweDQ2LCAweDNCLCAweEYwLCAweDYwLCAweDQwLCAweDA0LCAweDI3LAorCSAweDAzLCAweDAwLCAweDEwLCAweDI3LCAweDAxLCAweDAwLCAweDA0LCAweDAwLCAweDY0LCAweDQwLCAweDgwLCAweDI3LCAweDMxLCAweDAwLCAweDAwLCAweDAwLAorCSAweDNDLCAweDQ2LCAweDAyLCAweDY1LCAweEJGLCAweDYwLCAweDE5LCAweDc4LCAweEZGLCAweEZGLCAweENELCAweDgxLCAweDYzLCAweDQyLCAweDVBLCAweEQwLAorCSAweDNDLCAweDQ2LCAweDI2LCAweDAyLCAweDY0LCAweDQ0LCAweDg4LCAweDNBLCAweDIzLCAweDAwLCAweDc3LCAweDM3LCAweDM3LCAweDAwLCAweDc4LCAweDM3LAorCSAweDM1LCAweDAwLCAweDhFLCAweDM3LCAweDMzLCAweDAwLCAweEM3LCAweDM3LCAweDMxLCAweDAwLCAweDFBLCAweDAwLCAweDE5LCAweDYwLCAweEEzLCAweEYzLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDJBLCAweDAwLCAweDA2LCAweDAwLCAweDE5LCAweDYwLCAweEEzLCAweEYzLCAweEZGLCAweEZGLAorCSAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweEUyLCAweDAxLCAweDNDLCAweDQ2LCAweDNFLCAweEYyLCAweDQwLCAweDYwLCAweDAwLCAweDY1LCAweEYwLCAweDg0LAorCSAweEE0LCAweDg0LCAweDNELCAweEZBLCAweDJBLCAweEYyLCAweEJGLCAweDYwLCAweEZGLCAweDY1LCAweEE0LCAweDg0LCAweDJBLCAweEZBLCAweDE2LCAweDAwLAorCSAweDNDLCAweDQ2LCAweDIyLCAweEYwLCAweDgwLCAweDY3LCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweEZGLCAweEZGLCAweDNGLCAweEYyLCAweDNFLCAweEYwLAorCSAweDA4LCAweEE0LCAweDYwLCAweDQxLCAweDIyLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDI2LCAweDAzLCAweDAwLCAweDA0LCAweDI2LAorCSAweDAzLCAweDAwLCAweDA0LCAweDAwLCAweDA0LCAweDJCLCAweDAyLCAweDAwLCAweDYxLCAweDQ0LCAweDNGLCAweEZBLCAweDNDLCAweDQ2LCAweDJDLCAweEYyLAorCSAweDI3LCAweDQwLCAweDAxLCAweDI3LCAweDMyLCAweEYyLCAweEQzLCAweEYxLCAweDYwLCAweDQwLCAweDAxLCAweDI2LCAweDQ3LCAweDAwLCAweDA5LCAweDYwLAorCSAweDAwLCAweDY0LCAweEQwLCAweDgwLCAweDNGLCAweEYyLCAweDA5LCAweDA2LCAweDJDLCAweDQ1LCAweEM0LCAweDg0LCAweEQwLCAweDgwLCAweDQwLCAweDRBLAorCSAweDM0LCAweDA2LCAweDYwLCAweDQzLCAweDY0LCAweDQ0LCAweDU0LCAweDg4LCAweDE3LCAweDAwLCAweDYwLCAweDQ1LCAweDE2LCAweDYwLCAweEM4LCAweEYzLAorCSAweERBLCAweEYzLCAweDAwLCAweEJDLCAweDYwLCAweDQ3LCAweEVDLCAweEEwLCAweDI4LCAweDAzLCAweDI3LCAweDA3LCAweDJDLCAweDQ0LCAweEM0LCAweDgxLAorCSAweDAyLCAweDYwLCAweDFDLCAweDY1LCAweDQ1LCAweDRBLCAweEQ1LCAweDgwLCAweDJDLCAweDQ1LCAweDFGLCAweDA2LCAweDI3LCAweDQwLCAweDA0LCAweDI3LAorCSAweDI1LCAweDAwLCAweDJBLCAweDQzLCAweEQ3LCAweDg1LCAweDQ1LCAweDQ4LCAweEQ0LCAweEYxLCAweDBGLCAweEYyLCAweEQzLCAweDgwLCAweDAxLCAweDY1LAorCSAweDAxLCAweDA3LCAweDAwLCAweDY1LCAweEI0LCAweDg0LCAweDBGLCAweEZBLCAweDAwLCAweDYzLCAweDNGLCAweEYyLCAweDI4LCAweDQ1LCAweDYwLCAweDQxLAorCSAweEQ0LCAweDg0LCAweERGLCAweDgzLCAweEZDLCAweDA3LCAweDE0LCAweEZDLCAweDE3LCAweEZBLCAweDA0LCAweDYwLCAweDAwLCAweDY0LCAweDI3LCAweDQ1LAorCSAweEI0LCAweDg0LCAweDJBLCAweEZBLCAweDI4LCAweDQzLCAweDE2LCAweEZDLCAweDBELCAweDAwLCAweDNGLCAweEYyLCAweDJDLCAweDQ1LCAweEQ0LCAweEYxLAorCSAweEM0LCAweDgxLCAweEQxLCAweDgwLCAweDBGLCAweEYyLCAweDAxLCAweDA2LCAweDAxLCAweEJDLCAweDBGLCAweEZBLCAweDNGLCAweEYyLCAweDE3LCAweEZBLAorCSAweDAxLCAweDY0LCAweDE0LCAweEZBLCAweEFBLCAweEYyLCAweDE5LCAweDYwLCAweDNGLCAweEYzLCAweDA3LCAweEYwLCAweDY2LCAweDQzLCAweDY0LCAweDQ2LAorCSAweDQ0LCAweDQ0LCAweDYxLCAweDQwLCAweDA4LCAweDI2LCAweDAyLCAweDAwLCAweDYxLCAweDQwLCAweDgwLCAweDM2LCAweDEyLCAweEYyLCAweDYzLCAweDQ2LAorCSAweDMzLCAweDYwLCAweDg2LCAweDYxLCAweDAwLCAweDdGLCAweDYwLCAweDQ1LCAweDQ1LCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQ1LCAweDAwLCAweDdGLAorCSAweDRCLCAweEZCLCAweDY1LCAweDQ0LCAweDAwLCAweDdFLCAweERBLCAweEZCLCAweDA3LCAweEYwLCAweDY2LCAweDQzLCAweDY0LCAweDQ2LCAweDEyLCAweEYwLAorCSAweDYwLCAweDQ3LCAweDYzLCAweDQ2LCAweDY0LCAweDQwLCAweDEwLCAweDJBLCAweDFFLCAweDAwLCAweDMzLCAweDYwLCAweDBBLCAweDYzLCAweDYwLCAweDQwLAorCSAweDBBLCAweDM2LCAweDBDLCAweDAwLCAweDE0LCAweDM2LCAweDA3LCAweDAwLCAweDM3LCAweDM2LCAweDAyLCAweDAwLCAweEEzLCAweEQzLCAweDA5LCAweDAwLAorCSAweDAyLCAweEEzLCAweEEzLCAweEQzLCAweDA2LCAweDAwLCAweDA0LCAweEEzLCAweEEzLCAweEQzLCAweDAzLCAweDAwLCAweDA2LCAweEEzLCAweEEzLCAweEQzLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDBBLCAweDM2LCAweDcwLCAweDY0LCAweDE0LCAweDM2LCAweDM4LCAweDY0LCAweDM3LCAweDM2LCAweDE1LCAweDY0LAorCSAweDZFLCAweDM2LCAweDBCLCAweDY0LCAweDM5LCAweDAwLCAweDMyLCAweDYwLCAweEZBLCAweDYzLCAweDYwLCAweDQwLCAweDBCLCAweDM2LCAweDIwLCAweDAwLAorCSAweDBGLCAweDM2LCAweDFCLCAweDAwLCAweDBBLCAweDM2LCAweDE2LCAweDAwLCAweDBFLCAweDM2LCAweDExLCAweDAwLCAweDA5LCAweDM2LCAweDBDLCAweDAwLAorCSAweDBELCAweDM2LCAweDA3LCAweDAwLCAweDA4LCAweDM2LCAweDAyLCAweDAwLCAweEEzLCAweEQzLCAweDE1LCAweDAwLCAweDAyLCAweEEzLCAweEEzLCAweEQzLAorCSAweDEyLCAweDAwLCAweDA0LCAweEEzLCAweEEzLCAweEQzLCAweDBGLCAweDAwLCAweDA2LCAweEEzLCAweEEzLCAweEQzLCAweDBDLCAweDAwLCAweDA4LCAweEEzLAorCSAweEEzLCAweEQzLCAweDA5LCAweDAwLCAweDBBLCAweEEzLCAweEEzLCAweEQzLCAweDA2LCAweDAwLCAweDBDLCAweEEzLCAweEEzLCAweEQzLCAweDAzLCAweDAwLAorCSAweDBFLCAweEEzLCAweEEzLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDBCLCAweDM2LCAweDFFLCAweDY0LCAweDBGLCAweDM2LCAweDE2LCAweDY0LAorCSAweDBBLCAweDM2LCAweDEyLCAweDY0LCAweDBFLCAweDM2LCAweDBFLCAweDY0LCAweDA5LCAweDM2LCAweDBFLCAweDY0LCAweDBELCAweDM2LCAweDBBLCAweDY0LAorCSAweDA4LCAweDM2LCAweDBBLCAweDY0LCAweDBDLCAweDM2LCAweDBBLCAweDY0LCAweDQwLCAweDQ2LCAweDJBLCAweEYyLCAweDA3LCAweEYwLCAweDYwLCAweDQwLAorCSAweEIwLCAweDNBLCAweDAzLCAweDAwLCAweDQwLCAweDNCLCAweDAxLCAweDAwLCAweDEyLCAweDAwLCAweDBDLCAweEI0LCAweDA4LCAweDNBLCAweDQ0LCAweDAwLAorCSAweDIyLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDgwLCAweDJCLCAweDNGLCAweDAwLCAweDE3LCAweEYyLCAweDIyLCAweEYwLCAweEZGLCAweEZGLAorCSAweDY0LCAweDQwLCAweDIyLCAweDIyLCAweDA0LCAweDAwLCAweDAwLCAweEE4LCAweDAxLCAweEE4LCAweDM2LCAweDAzLCAweDM1LCAweDAzLCAweDNDLCAweDQ2LAorCSAweDJBLCAweEYwLCAweDQwLCAweDY3LCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweDYwLCAweDQ1LCAweDIyLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQzLAorCSAweDYwLCAweDQwLCAweDAxLCAweDI2LCAweDA1LCAweDAwLCAweDA0LCAweDI2LCAweDFELCAweDAwLCAweDEwLCAweDI2LCAweDEwLCAweDAwLCAweDA0LCAweDAwLAorCSAweDA0LCAweDI3LCAweDE4LCAweDAwLCAweDEwLCAweDI3LCAweDBCLCAweDAwLCAweDY1LCAweDQ0LCAweDJBLCAweDYxLCAweDYwLCAweDQwLCAweDAzLCAweDJCLAorCSAweDI0LCAweDYxLCAweDhGLCAweEIwLCAweDg4LCAweDM2LCAweDAyLCAweEExLCAweDQxLCAweDRDLCAweDk4LCAweEZBLCAweDE1LCAweDAwLCAweDY1LCAweDQ0LAorCSAweDMyLCAweDYxLCAweDYwLCAweDQwLCAweDAzLCAweDJCLCAweDJDLCAweDYxLCAweDhGLCAweEIwLCAweDg4LCAweDM2LCAweDAyLCAweEExLCAweDQxLCAweDRDLAorCSAweDk4LCAweEZBLCAweDBBLCAweDAwLCAweDY1LCAweDQ0LCAweDJFLCAweDYxLCAweDYwLCAweDQwLCAweDAzLCAweDJCLCAweDI4LCAweDYxLCAweDhGLCAweEIwLAorCSAweDg4LCAweDM2LCAweDAyLCAweEExLCAweDQxLCAweDRDLCAweDk4LCAweEZBLCAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDQwLCAweDI3LAorCSAweDAzLCAweDAwLCAweEJDLCAweDYwLCAweDQ2LCAweDc4LCAweEZGLCAweEZGLCAweDIyLCAweEYyLCAweDQ2LCAweDQzLCAweDYwLCAweDQwLCAweDIyLCAweDI2LAorCSAweDA5LCAweDAwLCAweDAxLCAweDI2LCAweDBBLCAweDAwLCAweDA0LCAweDI2LCAweDRCLCAweDAwLCAweDEwLCAweDI2LCAweDEwLCAweDAwLCAweEJDLCAweDYwLAorCSAweDQ2LCAweDc4LCAweEZGLCAweEZGLCAweEJCLCAweDYwLCAweEMxLCAweDc4LCAweEZGLCAweEZGLCAweDA0LCAweDI3LCAweDNELCAweDAwLCAweDEwLCAweDI3LAorCSAweDAzLCAweDAwLCAweEJDLCAweDYwLCAweDQ2LCAweDc4LCAweEZGLCAweEZGLCAweEE2LCAweEYzLCAweDNDLCAweEYxLCAweDAyLCAweDAwLCAweDA3LCAweEYyLAorCSAweDAwLCAweDdDLCAweDQwLCAweDQzLCAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDA4LCAweDI3LCAweDIxLCAweDAwLCAweEEzLCAweDQ2LAorCSAweDRCLCAweEYyLCAweEZGLCAweEZGLCAweERDLCAweDg0LCAweDRCLCAweEZBLCAweDRBLCAweEYyLCAweDA4LCAweDA0LCAweERDLCAweDg0LCAweDRBLCAweEZBLAorCSAweDQ5LCAweEYyLCAweDA0LCAweDA0LCAweERDLCAweDg0LCAweDQ5LCAweEZBLCAweDAxLCAweDA0LCAweEZGLCAweEZGLCAweEE2LCAweEYzLCAweDY2LCAweDVDLAorCSAweEQwLCAweDgwLCAweDAwLCAweDdDLCAweDAxLCAweDAyLCAweDNDLCAweEYxLCAweDRCLCAweEYwLCAweDY0LCAweDQ3LCAweDIwLCAweEJGLCAweEEzLCAweDQ2LAorCSAweDNBLCAweEY4LCAweDNCLCAweEZBLCAweEEzLCAweDQ2LCAweDRBLCAweEYyLCAweDQ5LCAweEYwLCAweEEzLCAweDQ2LCAweDNDLCAweEZBLCAweDNELCAweEY4LAorCSAweDBGLCAweDYwLCAweDlFLCAweDY0LCAweEEzLCAweDQ2LCAweDc2LCAweDYxLCAweDBFLCAweDYzLCAweDU5LCAweEQwLCAweDU4LCAweEQ5LCAweEZELCAweDFGLAorCSAweEEzLCAweDQ2LCAweEJDLCAweDYwLCAweDQ2LCAweDc4LCAweEZGLCAweEZGLCAweEE2LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQ2LCAweDAyLCAweDAwLAorCSAweDA3LCAweEY0LCAweEZGLCAweEZGLCAweEEzLCAweDQ2LCAweDJBLCAweEYyLCAweEEzLCAweDQ2LCAweDYwLCAweDQwLCAweDA4LCAweDI3LCAweDQ4LCAweDAwLAorCSAweEE2LCAweEYzLCAweDY2LCAweDVDLCAweEQwLCAweDgwLCAweDNCLCAweEYwLCAweDA4LCAweDAzLCAweDY0LCAweDQwLCAweDEwLCAweDJBLCAweDEyLCAweDAwLAorCSAweEZGLCAweDYwLCAweEVGLCAweDY0LCAweEEwLCAweDg0LCAweDNCLCAweEZBLCAweDI0LCAweDAwLCAweDNELCAweEYzLCAweDAxLCAweDYxLCAweDYwLCAweDQzLAorCSAweENGLCAweDgzLCAweEUxLCAweDgxLCAweEZELCAweDBELCAweEU5LCAweDgxLCAweEExLCAweDgwLCAweEZGLCAweEZGLCAweDAzLCAweDAzLCAweDkxLCAweDg0LAorCSAweDNCLCAweEZBLCAweDE3LCAweDAwLCAweDRCLCAweEYyLCAweEZGLCAweEZGLCAweDEwLCAweEEwLCAweEZGLCAweEZGLCAweDAyLCAweDA0LCAweEZGLCAweDYwLAorCSAweEZGLCAweDY0LCAweERDLCAweDg0LCAweDRCLCAweEZBLCAweDRBLCAweEYyLCAweDE2LCAweDA0LCAweERDLCAweDg0LCAweDRBLCAweEZBLCAweDQ5LCAweEYyLAorCSAweDA4LCAweDA0LCAweERDLCAweDg0LCAweDQ5LCAweEZBLCAweDA1LCAweDA0LCAweDNCLCAweEYyLCAweEZGLCAweEZGLCAweEUwLCAweDg0LCAweEU4LCAweDg0LAorCSAweDNCLCAweEZBLCAweDBDLCAweDYwLCAweEZDLCAweDYyLCAweDgwLCAweEZGLCAweDc4LCAweDQ0LCAweDAzLCAweEE0LCAweEEyLCAweERCLCAweEM4LCAweDYwLAorCSAweDE1LCAweDc4LCAweEZGLCAweEZGLCAweDg0LCAweEZGLCAweDA2LCAweDYwLCAweDE3LCAweEUxLCAweDc3LCAweDQwLCAweDhCLCAweEZGLCAweDAyLCAweDYwLAorCSAweDAwLCAweDc1LCAweEM5LCAweDYwLCAweDU4LCAweDRGLCAweEFELCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDY0LCAweDA2LCAweDYwLCAweDdGLCAweEZCLAorCSAweDBDLCAweDYwLCAweEZDLCAweDYyLCAweDgwLCAweEZGLCAweDc4LCAweDQ0LCAweDAzLCAweEE0LCAweEEyLCAweERCLCAweEM4LCAweDYwLCAweDhDLCAweDc4LAorCSAweEZGLCAweEZGLCAweDg0LCAweEZGLCAweDAwLCAweDdDLCAweDA2LCAweDYwLCAweDdGLCAweEYzLCAweEEyLCAweEQ5LCAweDYwLCAweDQwLCAweDAxLCAweDJBLAorCSAweDA0LCAweDAwLCAweEM5LCAweDYwLCAweDU4LCAweDRGLCAweEY2LCAweDc4LCAweEZGLCAweEZGLCAweDNDLCAweDQ2LCAweDA3LCAweEY0LCAweEE2LCAweEYzLAorCSAweDY2LCAweDVDLCAweEQwLCAweDgwLCAweDAwLCAweDdDLCAweDA3LCAweDAzLCAweDY2LCAweDQzLCAweDNDLCAweDQ2LCAweDIyLCAweEYyLCAweDYzLCAweDQ2LAorCSAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDAxLCAweDAwLCAweDNDLCAweEYxLCAweDRCLCAweEYwLCAweDY0LCAweDQxLCAweDY0LCAweDQ3LCAweEZGLCAweEI0LAorCSAweDYwLCAweDVGLCAweDIwLCAweEJDLCAweDgwLCAweDI2LCAweDgwLCAweEFDLCAweDYwLCAweDQ3LCAweEEzLCAweDQ2LCAweDNBLCAweEZBLCAweDY0LCAweDQ0LAorCSAweDIwLCAweDdGLCAweDM0LCAweDk0LCAweDNCLCAweEZBLCAweEEzLCAweDQ2LCAweDRBLCAweEYyLCAweDQ5LCAweEYwLCAweEEzLCAweDQ2LCAweDNDLCAweEZBLAorCSAweDNELCAweEY4LCAweDgwLCAweDYwLCAweDEwLCAweEUwLCAweDA4LCAweDYwLCAweDAwLCAweEVBLCAweDBGLCAweDY0LCAweDYwLCAweDdGLCAweEEwLCAweDVBLAorCSAweDgwLCAweDYwLCAweDAwLCAweEVBLCAweEEwLCAweDYwLCAweDAwLCAweEVBLCAweEQxLCAweDYwLCAweDAwLCAweEVBLCAweEJDLCAweDYwLCAweDQ2LCAweDc4LAorCSAweEZGLCAweEZGLCAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDA4LCAweDI3LCAweDMxLCAweDAwLCAweDJBLCAweEYyLCAweDAwLCAweDYwLAorCSAweDdDLCAweDYyLCAweDYwLCAweDQwLCAweDQwLCAweDJCLCAweDI0LCAweDAwLCAweEEyLCAweEQzLCAweDAwLCAweDYxLCAweDYwLCAweEZFLCAweEEwLCAweEQzLAorCSAweDVFLCAweEQxLCAweEZGLCAweEZGLCAweDIwLCAweEZFLCAweDY0LCAweDVGLCAweERDLCAweDg0LCAweEYxLCAweDgxLCAweEMwLCAweDJCLCAweDA0LCAweDAwLAorCSAweDgwLCAweDJBLCAweDAyLCAweDAwLCAweDdGLCAweEE0LCAweERDLCAweDg0LCAweEZGLCAweDNCLCAweDAzLCAweDAwLCAweDYwLCAweDQ3LCAweERDLCAweDg3LAorCSAweDAxLCAweDYxLCAweEMwLCAweDgwLCAweDAwLCAweDM2LCAweERDLCAweDg0LCAweDRFLCAweERCLCAweDYwLCAweEZFLCAweDVBLCAweEQxLCAweEZGLCAweEZGLAorCSAweEMxLCAweDg0LCAweEYwLCAweDIyLCAweDEwLCAweEE0LCAweEYwLCAweDJBLCAweDAxLCAweDAwLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDIwLCAweEZFLAorCSAweDAwLCAweDYwLCAweDNFLCAweEYzLCAweEZGLCAweEZGLCAweEEwLCAweEQzLCAweDVBLCAweEQxLCAweDNBLCAweEZBLCAweDNCLCAweEY4LCAweDc0LCAweDYyLAorCSAweEEyLCAweEQwLCAweEZGLCAweEZGLCAweDY0LCAweDQ0LCAweEUwLCAweDdGLCAweEEwLCAweDVBLCAweDY0LCAweDQ3LCAweEUxLCAweDdGLCAweDVBLCAweEQwLAorCSAweEEwLCAweDVBLCAweDY0LCAweDQ0LCAweEUyLCAweDdGLCAweEEwLCAweDVBLCAweDAwLCAweDYwLCAweDQwLCAweEYzLCAweEZGLCAweEZGLCAweEEwLCAweEQxLAorCSAweDVBLCAweEQxLCAweDY0LCAweDQ1LCAweDY0LCAweDQ0LCAweEUzLCAweDdGLCAweEEwLCAweDVBLCAweDY0LCAweDQ3LCAweEU0LCAweDdGLCAweDVBLCAweEQxLAorCSAweEEwLCAweDVBLCAweDY0LCAweDQ0LCAweEU1LCAweDdGLCAweEEwLCAweDVBLCAweDY0LCAweDQ3LCAweEU2LCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVBLAorCSAweDY0LCAweDQ0LCAweEU3LCAweDdGLCAweEEwLCAweDVBLCAweDY1LCAweDQwLCAweDBELCAweDNBLCAweDFDLCAweDAwLCAweDY0LCAweDQ3LCAweEU4LCAweDdGLAorCSAweDVBLCAweEQxLCAweEEwLCAweDVBLCAweDY0LCAweDQ0LCAweEU5LCAweDdGLCAweEEwLCAweDVBLCAweDY0LCAweDQ3LCAweEVBLCAweDdGLCAweDVBLCAweEQxLAorCSAweEEwLCAweDVBLCAweDY0LCAweDQ0LCAweEVCLCAweDdGLCAweEEwLCAweDVBLCAweDY0LCAweDQ3LCAweEVDLCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVBLAorCSAweDY0LCAweDQ0LCAweEVELCAweDdGLCAweEEwLCAweDVBLCAweDY0LCAweDQ3LCAweEVFLCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVBLCAweDY0LCAweDQ0LAorCSAweEVGLCAweDdGLCAweEEwLCAweDVBLCAweDA4LCAweDYwLCAweDAwLCAweEVBLCAweDY1LCAweDQ0LCAweDAyLCAweEE0LCAweDYwLCAweDdGLCAweEEwLCAweDVBLAorCSAweDgwLCAweDYwLCAweDAwLCAweEVBLCAweEEwLCAweDYwLCAweDAwLCAweEVBLCAweEQxLCAweDYwLCAweDAwLCAweEVBLCAweDY2LCAweDQ1LCAweEFBLCAweEYyLAorCSAweDE5LCAweDYwLCAweDNGLCAweEYzLCAweDI0LCAweDQ2LCAweDYxLCAweDQwLCAweDA4LCAweDI2LCAweDAyLCAweDAwLCAweDYxLCAweDQwLCAweDgwLCAweDM2LAorCSAweDEyLCAweEYyLCAweDY1LCAweDQ2LCAweDYwLCAweDQwLCAweDEwLCAweDI2LCAweDM0LCAweDAwLCAweDJDLCAweDQ1LCAweDE3LCAweEYyLCAweDRCLCAweEYxLAorCSAweEM0LCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDgxLCAweDY0LCAweDQ1LCAweDE2LCAweEExLCAweEI4LCAweDYwLCAweDU4LCAweDRELAorCSAweDE1LCAweDc4LCAweEZGLCAweEZGLCAweDdELCAweEYxLCAweDAxLCAweEE0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDY0LCAweDQwLCAweDAxLCAweDJCLAorCSAweDA2LCAweEE0LCAweDFCLCAweEZBLCAweERBLCAweEYzLCAweDJDLCAweDYwLCAweDdDLCAweDY1LCAweDYwLCAweDQwLCAweDBCLCAweDM3LCAweDAwLCAweDYzLAorCSAweDBGLCAweDM3LCAweDAyLCAweDYzLCAweDBBLCAweDM3LCAweDA0LCAweDYzLCAweDBFLCAweDM3LCAweDA2LCAweDYzLCAweDA5LCAweDM3LCAweDA4LCAweDYzLAorCSAweDBELCAweDM3LCAweDBBLCAweDYzLCAweDA4LCAweDM3LCAweDBDLCAweDYzLCAweDBDLCAweDM3LCAweDBFLCAweDYzLCAweDI4LCAweEEzLCAweDQ3LCAweEQxLAorCSAweEQ4LCAweEEzLCAweEQ3LCAweDgzLCAweDE5LCAweDYwLCAweDc3LCAweEY5LCAweDQ3LCAweEQxLCAweDQwLCAweDY3LCAweEIwLCAweDg0LCAweDFGLCAweEZBLAorCSAweDU4LCAweDAwLCAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDgwLCAweDM2LCAweDE5LCAweDAwLCAweDUwLCAweDM2LCAweDE3LCAweDAwLAorCSAweDQwLCAweDM2LCAweDE1LCAweDAwLCAweDAwLCAweDM2LCAweDEzLCAweDAwLCAweDIwLCAweDM2LCAweDExLCAweDAwLCAweEEwLCAweDM2LCAweDBGLCAweDAwLAorCSAweEIwLCAweDM2LCAweDBELCAweDAwLCAweEMwLCAweDM2LCAweDBCLCAweDAwLCAweERBLCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDBBLCAweDM3LAorCSAweDA2LCAweDAwLCAweDE5LCAweDYwLCAweDdCLCAweEYzLCAweDgwLCAweDYwLCAweDAwLCAweDYxLCAweDYwLCAweDQwLCAweDA0LCAweDI2LCAweDAwLCAweDYxLAorCSAweERBLCAweEYzLCAweDJDLCAweDYwLCAweDc0LCAweDY1LCAweDYwLCAweDQwLCAweDBBLCAweDM3LCAweDAwLCAweDYzLCAweDE0LCAweDM3LCAweDAyLCAweDYzLAorCSAweDM3LCAweDM3LCAweDA0LCAweDYzLCAweDZFLCAweDM3LCAweDA2LCAweDYzLCAweDI4LCAweEEzLCAweDQ3LCAweEQxLCAweEQ4LCAweEEzLCAweEQ3LCAweDgzLAorCSAweDE5LCAweDYwLCAweDc3LCAweEY5LCAweDQ3LCAweEQxLCAweEZGLCAweEZGLCAweEIxLCAweDg0LCAweDFGLCAweEZBLCAweERBLCAweEYxLCAweDJDLCAweDQ1LAorCSAweDY0LCAweDQzLCAweDE3LCAweEYyLCAweDRCLCAweEYxLCAweEM0LCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDgxLCAweDYzLCAweDQwLAorCSAweDM3LCAweDM3LCAweEUxLCAweDgxLCAweDY0LCAweDQ1LCAweEI4LCAweDYwLCAweDU4LCAweDRELCAweDE1LCAweDc4LCAweEZGLCAweEZGLCAweEFFLCAweDgyLAorCSAweEZDLCAweEEyLCAweDBBLCAweDAzLCAweDYzLCAweDQwLCAweDZFLCAweDNCLCAweDA2LCAweDAwLCAweDYwLCAweDQxLCAweDA0LCAweDBELCAweDYzLCAweDQ0LAorCSAweDgwLCAweDdFLCAweERBLCAweEZCLCAweDYxLCAweDQ0LCAweERDLCAweDg0LCAweDJCLCAweEYwLCAweDFCLCAweEZBLCAweDY0LCAweDQ0LCAweDgwLCAweDI3LAorCSAweDU4LCAweDAwLCAweDA3LCAweEYwLCAweDY2LCAweDQ1LCAweDY0LCAweDQ2LCAweDEyLCAweEYyLCAweDY1LCAweDQ2LCAweDYwLCAweDQwLCAweDEwLCAweDJBLAorCSAweDMxLCAweDAwLCAweDE2LCAweEYyLCAweDBGLCAweEYwLCAweEFDLCAweDg0LCAweDJDLCAweDQ1LCAweDJDLCAweDAzLCAweDRCLCAweEYxLCAweEM0LCAweDg0LAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDgxLCAweDYzLCAweDQwLCAweDM3LCAweDM3LCAweEUxLCAweDgxLCAweDY0LCAweDQ1LCAweDBGLCAweEYwLAorCSAweEI4LCAweDYwLCAweDU4LCAweDRELCAweDE1LCAweDc4LCAweEZGLCAweEZGLCAweEFFLCAweDgyLCAweEZDLCAweEEyLCAweDBBLCAweDAzLCAweDYzLCAweDQwLAorCSAweDZFLCAweDNCLCAweDA2LCAweDAwLCAweDYwLCAweDQxLCAweDA0LCAweDBELCAweDgwLCAweDY3LCAweEIwLCAweDg0LCAweDBGLCAweEZBLCAweDYxLCAweDQ0LAorCSAweERDLCAweDg0LCAweDFELCAweEZBLCAweDFGLCAweEYwLCAweDAxLCAweDYwLCAweDNFLCAweDY1LCAweDY0LCAweDQwLCAweDgwLCAweDI3LCAweDAyLCAweDAwLAorCSAweDAyLCAweDYwLCAweDVFLCAweDY1LCAweDFCLCAweEYwLCAweDI2LCAweDQxLCAweEUxLCAweDgxLCAweEM1LCAweDgxLCAweDQ0LCAweDk0LCAweEMxLCAweDgxLAorCSAweDJCLCAweEZBLCAweDkwLCAweEZBLCAweDI2LCAweDQ0LCAweDJDLCAweEYwLCAweDBBLCAweEE0LCAweDY2LCAweDQ1LCAweDI0LCAweDQ2LCAweDkyLCAweEYyLAorCSAweDY1LCAweDQ2LCAweDlGLCAweEYwLCAweDYxLCAweDQwLCAweDEwLCAweDJBLCAweDA1LCAweDAwLCAweDYwLCAweEE0LCAweDY1LCAweDQwLCAweDgwLCAweDJCLAorCSAweDYwLCAweEE0LCAweDAxLCAweDAwLCAweDE0LCAweEE0LCAweDY0LCAweDQwLCAweDAxLCAweDI2LCAweDAwLCAweDY0LCAweDYwLCAweDQ1LCAweDJBLCAweEYyLAorCSAweDM5LCAweEYwLCAweDhGLCAweEIwLCAweDg4LCAweDNBLCAweDA0LCAweDAwLCAweDY0LCAweDQ0LCAweDYwLCAweEIwLCAweDIwLCAweDM2LCAweDAwLCAweDY1LAorCSAweDY1LCAweDQ0LCAweDExLCAweEZBLCAweERBLCAweEYzLCAweDEzLCAweEZBLCAweDdDLCAweDQ0LCAweDFELCAweEZBLCAweDBGLCAweEYwLCAweEZGLCAweEZGLAorCSAweDY0LCAweDQwLCAweDAxLCAweDJBLCAweDZGLCAweDAwLCAweDdELCAweEYxLCAweDE5LCAweDYwLCAweDdCLCAweEYzLCAweDY0LCAweDQwLCAweDAxLCAweDI3LAorCSAweDAzLCAweDAwLCAweDYwLCAweDQwLCAweDAyLCAweDI2LCAweDE0LCAweDAwLCAweDA3LCAweEYwLCAweDY2LCAweDQzLCAweDY0LCAweDQ2LCAweDEyLCAweEYwLAorCSAweDE5LCAweDYwLCAweDdDLCAweEYzLCAweDYzLCAweDQ2LCAweDY0LCAweDQwLCAweDEwLCAweDJBLCAweDIwLCAweDAwLCAweDYwLCAweDQwLCAweDAyLCAweDI2LAorCSAweDA3LCAweDAwLCAweDAxLCAweDI2LCAweDA4LCAweDAwLCAweDA0LCAweDI2LCAweDA5LCAweDAwLCAweDA2LCAweDYxLCAweDZFLCAweDYzLCAweDA4LCAweDAwLAorCSAweDAyLCAweDYxLCAweDE0LCAweDYzLCAweDA1LCAweDAwLCAweDAwLCAweDYxLCAweDBBLCAweDYzLCAweDAyLCAweDAwLCAweDA0LCAweDYxLCAweDM3LCAweDYzLAorCSAweDAwLCAweDY0LCAweDJDLCAweDYwLCAweDlDLCAweDY1LCAweDQ1LCAweEQxLCAweEQ1LCAweDgxLCAweDE5LCAweDYwLCAweDc4LCAweEY5LCAweDJDLCAweDYwLAorCSAweDc0LCAweDY1LCAweDQ1LCAweEQxLCAweDFDLCAweEZDLCAweEIwLCAweDg0LCAweDFFLCAweEZBLCAweDNDLCAweDAwLCAweDYwLCAweDQwLCAweDEwLCAweDJBLAorCSAweDA0LCAweDAwLCAweDA4LCAweDYxLCAweDFFLCAweDYwLCAweDBCLCAweDYzLCAweDI3LCAweDAwLCAweDIwLCAweDJBLCAweDA0LCAweDAwLCAweDBBLCAweDYxLAorCSAweDE2LCAweDYwLCAweDBGLCAweDYzLCAweDIxLCAweDAwLCAweDQwLCAweDJBLCAweDA0LCAweDAwLCAweDBDLCAweDYxLCAweDEyLCAweDYwLCAweDBBLCAweDYzLAorCSAweDFCLCAweDAwLCAweDgwLCAweDJBLCAweDA0LCAweDAwLCAweDBFLCAweDYxLCAweDBFLCAweDYwLCAweDBFLCAweDYzLCAweDE1LCAweDAwLCAweDAxLCAweDJCLAorCSAweDA0LCAweDAwLCAweDEwLCAweDYxLCAweDBFLCAweDYwLCAweDA5LCAweDYzLCAweDBGLCAweDAwLCAweDAyLCAweDJCLCAweDA0LCAweDAwLCAweDEyLCAweDYxLAorCSAweDBBLCAweDYwLCAweDBELCAweDYzLCAweDA5LCAweDAwLCAweDA0LCAweDJCLCAweDA0LCAweDAwLCAweDE0LCAweDYxLCAweDBBLCAweDYwLCAweDA4LCAweDYzLAorCSAweDAzLCAweDAwLCAweDE2LCAweDYxLCAweDBBLCAweDYwLCAweDBDLCAweDYzLCAweDFFLCAweEYwLCAweDQwLCAweDY3LCAweDJDLCAweDYwLCAweDlDLCAweDY1LAorCSAweDQ1LCAweEQxLCAweEQ1LCAweDgxLCAweDE5LCAweDYwLCAweDc4LCAweEY5LCAweDJDLCAweDYwLCAweDc0LCAweDY1LCAweDQ1LCAweEQxLCAweDFDLCAweEZDLAorCSAweEIwLCAweDg0LCAweDFFLCAweEZBLCAweEZGLCAweEZGLCAweDBELCAweEYyLCAweDNFLCAweEYwLCAweDYwLCAweDQ3LCAweEZGLCAweEI0LCAweDY0LCAweDQxLAorCSAweDAxLCAweEIxLCAweDAxLCAweDYzLCAweDE3LCAweDAyLCAweDYwLCAweDQxLCAweEZGLCAweDIyLCAweDA0LCAweDAwLCAweEI4LCAweDYwLCAweDU4LCAweDRGLAorCSAweDA2LCAweDc4LCAweEZGLCAweEZGLCAweDA3LCAweDYwLCAweEVELCAweEZELCAweDE5LCAweDYwLCAweENGLCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQxLAorCSAweDAxLCAweDYzLCAweDYxLCAweDQwLCAweEZGLCAweDIyLCAweDA0LCAweDAwLCAweEI4LCAweDYwLCAweDU4LCAweDRGLCAweDA2LCAweDc4LCAweEZGLCAweEZGLAorCSAweDA3LCAweDYwLCAweEVFLCAweEZELCAweDAyLCAweDY0LCAweDNCLCAweERCLCAweEJGLCAweDYwLCAweEU0LCAweDc4LCAweEZGLCAweEZGLCAweDY2LCAweDQ0LAorCSAweEZDLCAweEZCLCAweDA3LCAweEYwLCAweDAwLCAweDY0LCAweEQwLCAweDgwLCAweEE2LCAweEYzLCAweDBFLCAweDAzLCAweEQwLCAweDgwLCAweEZGLCAweEZGLAorCSAweDBCLCAweDAzLCAweDQ3LCAweEYxLCAweDA3LCAweEYwLCAweDY0LCAweDQwLCAweDAyLCAweDI2LCAweDAxLCAweDAwLCAweDA4LCAweDAwLCAweDAzLCAweDEyLAorCSAweEJFLCAweDYwLCAweEEwLCAweDc4LCAweEZGLCAweEZGLCAweEZDLCAweDBBLCAweEJGLCAweDYwLCAweDAwLCAweDc4LCAweEZGLCAweEZGLCAweDg3LCAweEYwLAorCSAweEE2LCAweEYzLCAweDEwLCAweEYwLCAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDNELCAweDAzLCAweDY2LCAweDQzLCAweDY1LCAweDQ2LCAweEZGLCAweDY3LAorCSAweDIwLCAweDg1LCAweDY0LCAweDVGLCAweDQwLCAweDQ0LCAweDE1LCAweEYwLCAweDI1LCAweDQ0LCAweEQwLCAweDg0LCAweDAzLCAweEE0LCAweDAzLCAweDBFLAorCSAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDA0LCAweDAwLCAweEZBLCAweEE0LCAweEU4LCAweDg0LCAweEU4LCAweDg3LCAweEMwLCAweEJGLCAweEMwLCAweDg0LAorCSAweDE1LCAweEZBLCAweDQwLCAweDQ1LCAweDE0LCAweEYwLCAweDI0LCAweDQ0LCAweEQwLCAweDg0LCAweDFGLCAweEE0LCAweDA2LCAweDBFLCAweEU4LCAweDg0LAorCSAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDA3LCAweDAwLCAweEMyLCAweEE0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LAorCSAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg3LCAweEY4LCAweEJGLCAweEMwLCAweDg0LCAweDE0LCAweEZBLCAweDYwLCAweDVDLCAweDJGLCAweDY3LAorCSAweEQwLCAweDgwLCAweDYwLCAweDQ1LCAweDAyLCAweDI4LCAweDY0LCAweDQ1LCAweDI1LCAweDVDLCAweDhCLCAweDY3LCAweEQwLCAweDgwLCAweDYwLCAweDQxLAorCSAweDAyLCAweDI0LCAweDY0LCAweDQxLCAweEQ1LCAweDg0LCAweDgwLCAweDY1LCAweEM0LCAweDg3LCAweDAxLCAweDA1LCAweDAwLCAweDY0LCAweEZGLCAweEI0LAorCSAweDBFLCAweEZBLCAweDYzLCAweDQ2LCAweDA3LCAweEYwLCAweDY2LCAweDQzLCAweDY0LCAweDQ2LCAweDE3LCAweEYyLCAweDYzLCAweDQ2LCAweDYwLCAweDQwLAorCSAweDAwLCAweDM2LCAweDJFLCAweDAwLCAweDAxLCAweDM2LCAweDFFLCAweDAwLCAweDAzLCAweDNBLCAweDI1LCAweDAwLCAweDY0LCAweDQ2LCAweDEwLCAweEYyLAorCSAweDExLCAweEZBLCAweDEyLCAweEYyLCAweDAwLCAweDYxLCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweDEyLCAweEZBLCAweDk3LCAweEZBLCAweDQ2LCAweDQ0LAorCSAweDYzLCAweDQ2LCAweEMyLCAweDYwLCAweDU4LCAweDRFLCAweDRDLCAweDc4LCAweEZGLCAweEZGLCAweDY1LCAweDQwLCAweDAwLCAweDNBLCAweDA0LCAweDAwLAorCSAweEMyLCAweDYwLCAweDU4LCAweDRFLCAweDk2LCAweDc4LCAweEZGLCAweEZGLCAweDA3LCAweEYwLCAweDY2LCAweDQzLCAweDY0LCAweDQ2LCAweDk2LCAweEZDLAorCSAweDYzLCAweDQ2LCAweDQzLCAweDAwLCAweDY0LCAweDQ2LCAweDE2LCAweEYyLCAweDAwLCAweDYxLCAweDIwLCAweDI4LCAweEZGLCAweEE0LCAweDk3LCAweEZBLAorCSAweDE2LCAweEZBLCAweDYzLCAweDQ2LCAweDNBLCAweDAwLCAweDY0LCAweDQ2LCAweDAwLCAweDYxLCAweDk3LCAweEZBLCAweDYzLCAweDQ2LCAweDM1LCAweDAwLAorCSAweDA3LCAweEYwLCAweDY2LCAweDQxLCAweDY0LCAweDQ2LCAweDE2LCAweEYyLCAweEZGLCAweEZGLCAweDIwLCAweDI4LCAweEZGLCAweEE0LCAweDE2LCAweEZBLAorCSAweDkzLCAweEY0LCAweDEyLCAweEYyLCAweDIwLCAweDI4LCAweEZGLCAweEEzLCAweDEzLCAweEZDLCAweDYxLCAweDQ2LCAweDYzLCAweDQwLCAweDAwLCAweDNBLAorCSAweDI0LCAweDAwLCAweEMyLCAweDYwLCAweDU4LCAweDRFLCAweDZELCAweDc4LCAweEZGLCAweEZGLCAweDYxLCAweDQwLCAweEZGLCAweDM2LCAweDFELCAweDAwLAorCSAweDY2LCAweDQxLCAweDY0LCAweDQ2LCAweDEyLCAweEYyLCAweDkzLCAweEY0LCAweDYxLCAweDQ2LCAweDIwLCAweDI4LCAweDE2LCAweDAwLCAweDQ0LCAweDQ0LAorCSAweEMyLCAweDYwLCAweDU4LCAweDRFLCAweDRDLCAweDc4LCAweEZGLCAweEZGLCAweDI0LCAweDVDLCAweDY1LCAweDQwLCAweDAwLCAweDM2LCAweDA2LCAweDAwLAorCSAweDY2LCAweDQxLCAweDY0LCAweDQ2LCAweDAxLCAweDY0LCAweDE3LCAweEZBLCAweDYxLCAweDQ2LCAweDA3LCAweDAwLCAweDY2LCAweDQzLCAweDY0LCAweDQ2LAorCSAweEMyLCAweDYwLCAweDU4LCAweDRFLCAweDk2LCAweDc4LCAweEZGLCAweEZGLCAweDYzLCAweDQ2LCAweEJGLCAweDYwLCAweDAwLCAweDc4LCAweEZGLCAweEZGLAorCSAweDA3LCAweEYwLCAweDY2LCAweDQzLCAweDY0LCAweDQ2LCAweDE3LCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweEZGLCAweDI3LCAweEZGLCAweEZGLAorCSAweDAwLCAweDM2LCAweDA3LCAweDAwLCAweDAxLCAweDM2LCAweDFDLCAweDAwLCAweDAyLCAweDM2LCAweDI0LCAweDAwLCAweDAzLCAweDM2LCAweDQzLCAweDAwLAorCSAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweEE5LCAweEYxLCAweDE2LCAweEYyLCAweDQzLCAweDQ0LCAweEQwLCAweDgwLCAweDMzLCAweDYwLCAweDg0LCAweDYxLAorCSAweDA5LCAweDAzLCAweEExLCAweEQxLCAweDMzLCAweDYwLCAweDgyLCAweDYzLCAweEMwLCAweDg0LCAweDE2LCAweEZBLCAweEEzLCAweEQzLCAweEZGLCAweEZGLAorCSAweDEzLCAweEZBLCAweDM5LCAweDAwLCAweDk2LCAweEZDLCAweEMyLCAweDYwLCAweDU4LCAweDRFLCAweDk2LCAweDc4LCAweEZGLCAweEZGLCAweDMzLCAweDAwLAorCSAweDQzLCAweDQ0LCAweEMyLCAweDYwLCAweDU4LCAweDRFLCAweDk2LCAweDc4LCAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweEMxLCAweEYzLCAweDk2LCAweEZDLAorCSAweDEzLCAweEZBLCAweDI5LCAweDAwLCAweDYzLCAweDQ2LCAweDMzLCAweDYwLCAweDU0LCAweDYzLCAweEEzLCAweEQzLCAweDE1LCAweEYyLCAweDYwLCAweDQ1LAorCSAweEQ0LCAweDgwLCAweDA3LCAweEYwLCAweDBDLCAweDAzLCAweDY2LCAweDQxLCAweDQ0LCAweDQ0LCAweDY0LCAweDQ2LCAweDEyLCAweEYyLCAweDYxLCAweDQ2LAorCSAweEMyLCAweDYwLCAweDU4LCAweDRFLCAweDRDLCAweDc4LCAweEZGLCAweEZGLCAweDY1LCAweDQwLCAweDAwLCAweDNBLCAweDE5LCAweDAwLCAweDY2LCAweDQzLAorCSAweDI0LCAweDQ2LCAweEMyLCAweDYwLCAweDU4LCAweDRFLCAweDk2LCAweDc4LCAweEZGLCAweEZGLCAweDEyLCAweEYyLCAweDkxLCAweEYyLCAweDkwLCAweEZBLAorCSAweDYwLCAweDVGLCAweDEyLCAweEZBLCAweDA0LCAweDAwLCAweEMyLCAweDYwLCAweDU4LCAweDRFLCAweDk2LCAweDc4LCAweEZGLCAweEZGLCAweDAzLCAweDY0LAorCSAweDE3LCAweEZBLCAweDYzLCAweDQ2LCAweDA1LCAweDAwLCAweDI0LCAweDQzLCAweDAyLCAweDY0LCAweDE3LCAweEZBLCAweDYzLCAweDQ2LCAweDAwLCAweDAwLAorCSAweDAzLCAweDY0LCAweDNCLCAweERCLCAweENBLCAweEZFLCAweDQ3LCAweEYxLCAweDAxLCAweDY1LCAweDMyLCAweDQwLCAweDA0LCAweDI3LCAweDExLCAweDAwLAorCSAweDJDLCAweEYyLCAweDY0LCAweDQ1LCAweDAyLCAweDIyLCAweDBELCAweDAwLCAweDYwLCAweDQwLCAweDAxLCAweDI2LCAweDBBLCAweDAwLCAweDJBLCAweEYyLAorCSAweDM5LCAweEYwLCAweDhGLCAweEIwLCAweDg4LCAweDNBLCAweDc3LCAweDAwLCAweDY0LCAweDQ0LCAweDYwLCAweEIwLCAweDIwLCAweDM2LCAweDAxLCAweDAwLAorCSAweDcyLCAweDAwLCAweDE0LCAweEYyLCAweDY1LCAweDQwLCAweDAxLCAweDI2LCAweDBDLCAweDAwLCAweDYwLCAweDQ1LCAweDA1LCAweDY0LCAweDNCLCAweERCLAorCSAweDY1LCAweDQ0LCAweENDLCAweDg1LCAweDJDLCAweDYwLCAweEQwLCAweDY0LCAweEYxLCAweDYwLCAweDc4LCAweDQxLCAweEYwLCAweDc4LCAweEI1LCAweEYxLAorCSAweDUwLCAweDAwLCAweDYwLCAweDQxLCAweDJBLCAweEYwLCAweDAwLCAweDYwLCAweDBDLCAweDY0LCAweEEwLCAweDg0LCAweDA0LCAweDM2LCAweDAyLCAweDAwLAorCSAweDBDLCAweDNBLCAweDAxLCAweDAwLCAweDQ2LCAweDAwLCAweDYxLCAweDQ1LCAweDYwLCAweDQzLCAweDJDLCAweDYwLCAweEQwLCAweDY0LCAweEYxLCAweDYwLAorCSAweDc4LCAweDQxLCAweEYwLCAweDc4LCAweEI1LCAweEYxLCAweDYzLCAweDQwLCAweDA4LCAweDM2LCAweDAxLCAweDAwLCAweDNBLCAweDAwLCAweDE0LCAweEYyLAorCSAweDFDLCAweDY1LCAweDYwLCAweDQxLCAweDAwLCAweDYzLCAweENELCAweDgxLCAweEM3LCAweDgzLCAweEZELCAweDAyLCAweDNGLCAweEYwLCAweDJDLCAweEYyLAorCSAweEMzLCAweDgzLCAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDBELCAweDAwLCAweDJDLCAweDYwLCAweENFLCAweDY0LCAweEYxLCAweDYwLCAweDc4LCAweDQxLAorCSAweEU0LCAweDc4LCAweEI1LCAweEYxLCAweDJDLCAweDYwLCAweEQ0LCAweDY0LCAweEYxLCAweDYwLCAweDc4LCAweDQxLCAweEVGLCAweDc4LCAweDYzLCAweDQ1LAorCSAweDIwLCAweDAwLCAweDJDLCAweDYwLCAweENDLCAweDY0LCAweEYxLCAweDYwLCAweDc4LCAweDQxLCAweEU0LCAweDc4LCAweEI1LCAweEYxLCAweDJDLCAweDYwLAorCSAweEQyLCAweDY0LCAweEYxLCAweDYwLCAweDc4LCAweDQxLCAweEVGLCAweDc4LCAweDYzLCAweDQ1LCAweDE1LCAweEYyLCAweEZGLCAweEZGLCAweDBGLCAweEI0LAorCSAweDAwLCAweEE4LCAweDAxLCAweEE4LCAweDBFLCAweDAzLCAweDA3LCAweDAzLCAweDJDLCAweDYwLCAweERBLCAweDY0LCAweEYxLCAweDYwLCAweDc4LCAweDQxLAorCSAweEU0LCAweDc4LCAweEI1LCAweEYxLCAweDA2LCAweDAwLCAweDJDLCAweDYwLCAweEQ4LCAweDY0LCAweEYxLCAweDYwLCAweDc4LCAweDQxLCAweEU0LCAweDc4LAorCSAweEI1LCAweEYxLCAweDA0LCAweDY0LCAweDNCLCAweERCLCAweDI1LCAweDYwLCAweEVDLCAweDY0LCAweDEzLCAweDYwLCAweDBBLCAweEZCLCAweDNDLCAweDQ0LAorCSAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDVDLCAweDVDLCAweEZDLCAweEZDLCAweENFLCAweEZFLAorCSAweEI4LCAweDYwLCAweDM3LCAweDc4LCAweEZGLCAweEZGLCAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDUwLCAweEE4LCAweDAyLCAweDdDLCAweDA5LCAweDAzLAorCSAweDBGLCAweEYwLCAweDE1LCAweEYyLCAweDY0LCAweDQxLCAweDAxLCAweDJBLCAweDAyLCAweDAwLCAweENELCAweEYxLCAweDAyLCAweDAwLCAweENDLCAweEYxLAorCSAweEZGLCAweEZGLCAweDY0LCAweDQ1LCAweERDLCAweDg0LCAweEQ0LCAweDgwLCAweDE1LCAweEZBLCAweDJELCAweDA3LCAweDYxLCAweDQwLCAweDAxLCAweDJBLAorCSAweDA4LCAweDAwLCAweDE2LCAweDYwLCAweDgwLCAweEYzLCAweEZGLCAweEZGLCAweERDLCAweDg0LCAweDAwLCAweDM2LCAweDAwLCAweDNCLCAweEEyLCAweERCLAorCSAweDA3LCAweDAwLCAweDE2LCAweDYwLCAweDgxLCAweEYzLCAweEZGLCAweEZGLCAweERDLCAweDg0LCAweDAwLCAweDM2LCAweDAwLCAweDNCLCAweEEyLCAweERCLAorCSAweDJBLCAweEYwLCAweDA4LCAweDY3LCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweDAwLCAweDY0LCAweDQ4LCAweEZCLCAweDE5LCAweDYwLCAweEEzLCAweEYzLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDBDLCAweDAwLCAweDNDLCAweDQ2LCAweDNFLCAweEYyLCAweDQwLCAweDYwLCAweDAwLCAweDY1LAorCSAweEYwLCAweDg0LCAweEE0LCAweDg0LCAweDNELCAweEZBLCAweDJBLCAweEYyLCAweEJGLCAweDYwLCAweEZGLCAweDY1LCAweEE0LCAweDg0LCAweDJBLCAweEZBLAorCSAweEJBLCAweDYwLCAweDAyLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY0LCAweDQ5LCAweEZCLCAweDJDLCAweDYwLCAweERBLCAweDY0LCAweEYxLCAweDYwLAorCSAweDc4LCAweDQxLCAweEU0LCAweDc4LCAweEI1LCAweEYxLCAweDJDLCAweDYwLCAweERDLCAweDY0LCAweEYxLCAweDYwLCAweDc4LCAweDQxLCAweEU0LCAweDc4LAorCSAweEI1LCAweEYxLCAweDI3LCAweDQ0LCAweEY3LCAweEI0LCAweDQwLCAweDQ3LCAweDIzLCAweEYwLCAweDAxLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERBLAorCSAweDk4LCAweDAxLCAweEMwLCAweDYwLCAweDVGLCAweDc4LCAweEZGLCAweEZGLCAweDIxLCAweDY0LCAweDNCLCAweERCLCAweDMxLCAweEYzLCAweDAxLCAweDYzLAorCSAweEM0LCAweEI0LCAweDMxLCAweEZCLCAweDMyLCAweEZELCAweEMwLCAweDYwLCAweDE0LCAweDYyLCAweDQyLCAweDQwLCAweEEwLCAweDRDLCAweDQwLCAweEJDLAorCSAweDdELCAweEI0LCAweEEwLCAweDUxLCAweEEwLCAweEZFLCAweDFBLCAweEZGLCAweDI1LCAweDYwLCAweEUwLCAweDY0LCAweDA4LCAweEYwLCAweDA3LCAweEYwLAorCSAweEQwLCAweDgwLCAweDI1LCAweDYwLCAweEU2LCAweDYyLCAweDEzLCAweDAyLCAweEEyLCAweEQzLCAweDAxLCAweDYzLCAweEFDLCAweDg2LCAweDA3LCAweEYyLAorCSAweDBFLCAweDAzLCAweEQwLCAweDgwLCAweDA5LCAweEYyLCAweEZBLCAweDAyLCAweDIzLCAweEZDLCAweDI1LCAweDYwLCAweEVDLCAweDY0LCAweDEzLCAweDYwLAorCSAweDBBLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDNDLCAweDQ2LAorCSAweDA2LCAweDY0LCAweEExLCAweEZGLCAweDQ5LCAweEZCLCAweDgzLCAweDNFLCAweDMxLCAweEYzLCAweDg3LCAweDYwLCAweDgwLCAweDYxLCAweDFELCAweEYwLAorCSAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDBGLCAweDAwLCAweEZFLCAweEI0LCAweDMxLCAweEZCLCAweDAwLCAweDY0LCAweDQ5LCAweEZCLCAweDAxLCAweDY0LAorCSAweDQ3LCAweEZCLCAweDAwLCAweDcxLCAweDA1LCAweDY0LCAweDY0LCAweDVGLCAweDBELCAweEZBLCAweDQwLCAweDY0LCAweDNCLCAweERCLCAweEMwLCAweDYwLAorCSAweDVGLCAweDc4LCAweEZGLCAweEZGLCAweDAyLCAweDJBLCAweDE4LCAweDAwLCAweEQxLCAweDkxLCAweDhELCAweEUyLCAweDQxLCAweDY0LCAweDNCLCAweERCLAorCSAweDMxLCAweEYzLCAweDMzLCAweDYwLCAweEE2LCAweDYzLCAweEZELCAweEI0LCAweDMxLCAweEZCLCAweEEzLCAweEQzLCAweDAyLCAweDYzLCAweDYwLCAweDVDLAorCSAweDBELCAweEYyLCAweDQ3LCAweEZELCAweEZGLCAweEI1LCAweDYwLCAweDQ3LCAweEZGLCAweEI0LCAweEQwLCAweDgwLCAweERDLCAweDg0LCAweDFGLCAweDAzLAorCSAweDYwLCAweDQ3LCAweEI0LCAweDg0LCAweDBELCAweEZBLCAweDFCLCAweDAwLCAweDA4LCAweDJBLCAweDA3LCAweDAwLCAweDQyLCAweDY0LCAweDNCLCAweERCLAorCSAweDMxLCAweEYzLCAweEZGLCAweEZGLCAweEY3LCAweEI0LCAweDMxLCAweEZCLCAweDEyLCAweDAwLCAweDEwLCAweDJBLCAweDA5LCAweDAwLCAweDQzLCAweDY0LAorCSAweDNCLCAweERCLCAweDMxLCAweEYzLCAweEZGLCAweEZGLCAweEVGLCAweEI0LCAweDMxLCAweEZCLCAweEJGLCAweDYwLCAweEU0LCAweDc4LCAweEZGLCAweEZGLAorCSAweDQ0LCAweDY0LCAweDNCLCAweERCLCAweDMxLCAweEYzLCAweEZGLCAweEZGLCAweERGLCAweEI0LCAweDMxLCAweEZCLCAweDAwLCAweDAwLCAweDJBLCAweDY0LAorCSAweDNCLCAweERCLCAweEI3LCAweDYwLCAweEY3LCAweDY0LCAweDQwLCAweDQwLCAweEJELCAweDYwLCAweEQ3LCAweDc4LCAweEZGLCAweEZGLCAweDBFLCAweDYwLAorCSAweERGLCAweEYzLCAweEZGLCAweEZGLCAweDAyLCAweEI1LCAweDA0LCAweEI1LCAweDA0LCAweDAzLCAweDAzLCAweDAzLCAweEMxLCAweDYwLCAweDcwLCAweDc4LAorCSAweEZGLCAweEZGLCAweDMxLCAweDQwLCAweDAxLCAweDI2LCAweDE2LCAweDAwLCAweEEwLCAweDRDLCAweDQ5LCAweEJDLCAweEZGLCAweEI0LCAweEEwLCAweDUxLAorCSAweDBFLCAweDYwLCAweERGLCAweEYzLCAweEZGLCAweEZGLCAweDAyLCAweEI1LCAweDA0LCAweEJDLCAweDA5LCAweDAzLCAweDYwLCAweDQwLCAweDAxLCAweDI2LAorCSAweEVELCAweEUyLCAweEZFLCAweEI0LCAweEEyLCAweERCLCAweEEwLCAweDRDLCAweDdELCAweEI0LCAweEEwLCAweDUxLCAweDAzLCAweDAwLCAweEEwLCAweDRDLAorCSAweDZELCAweEI0LCAweEEwLCAweDUxLCAweERCLCAweEYzLCAweEZGLCAweEZGLCAweEZELCAweEEwLCAweEZGLCAweEZGLCAweDA4LCAweDI0LCAweDU5LCAweDAwLAorCSAweDMxLCAweDQwLCAweDA0LCAweDJBLCAweDM4LCAweDAwLCAweDAxLCAweDY0LCAweDE5LCAweDYwLCAweEY0LCAweEZCLCAweDZDLCAweEYzLCAweDczLCAweEYzLAorCSAweENDLCAweDgzLCAweDZDLCAweEZELCAweENDLCAweDg0LCAweDczLCAweEZCLCAweDFFLCAweDAyLCAweDMxLCAweDQwLCAweDAyLCAweDJBLCAweDEyLCAweDAwLAorCSAweDZFLCAweEYzLCAweDZGLCAweEYxLCAweENDLCAweDg0LCAweDZFLCAweEZCLCAweDBELCAweDAyLCAweDZFLCAweEY5LCAweDMxLCAweDQ0LCAweDA4LCAweEJDLAorCSAweDQwLCAweDUxLCAweDcxLCAweEYzLCAweDcwLCAweEYxLCAweDAwLCAweEI4LCAweDY0LCAweDQ1LCAweDAxLCAweDAzLCAweDY3LCAweDQ1LCAweDY1LCAweDUwLAorCSAweENDLCAweDg0LCAweDcyLCAweEZCLCAweDE2LCAweDYwLCAweEFDLCAweEYzLCAweDZELCAweEYxLCAweDAwLCAweEI4LCAweDczLCAweEY5LCAweDAzLCAweDAzLAorCSAweDg1LCAweEYzLCAweDZDLCAweEZCLCAweDA0LCAweDAwLCAweDZDLCAweEYzLCAweDg1LCAweEYxLCAweDBELCAweDFCLCAweDZDLCAweEY5LCAweDMxLCAweDQwLAorCSAweDAxLCAweDJBLCAweDA5LCAweDAwLCAweDlELCAweEZFLCAweDA3LCAweDA1LCAweEJBLCAweEZFLCAweDA4LCAweDY0LCAweDEzLCAweDYwLCAweDE2LCAweEZCLAorCSAweDJELCAweEZGLCAweEZGLCAweEZGLCAweEEzLCAweEZFLCAweDMyLCAweDQwLCAweDgwLCAweDJBLCAweDEyLCAweDAwLCAweDMxLCAweDQwLCAweDA0LCAweDJBLAorCSAweDBGLCAweDAwLCAweDE2LCAweDYwLCAweEFDLCAweEYzLCAweDZDLCAweEYxLCAweDAzLCAweDFCLCAweDMxLCAweDQwLCAweDAyLCAweDJBLCAweDA2LCAweDAwLAorCSAweDczLCAweEYzLCAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDAxLCAweDA3LCAweDYwLCAweDVDLCAweDE5LCAweDYwLCAweEY1LCAweEY5LAorCSAweDAwLCAweDY0LCAweDE5LCAweDYwLCAweEY0LCAweEZCLCAweDBFLCAweDYwLCAweDM3LCAweEYzLCAweEZGLCAweEZGLCAweENDLCAweDg0LCAweEZGLCAweDJCLAorCSAweEEyLCAweERCLCAweENGLCAweEYxLCAweDA3LCAweDYwLCAweEU5LCAweEYzLCAweDY0LCAweDQwLCAweDAyLCAweDNBLCAweDNBLCAweDAwLCAweDBBLCAweDYwLAorCSAweDE4LCAweEYxLCAweDEwLCAweEI0LCAweDkwLCAweDgwLCAweEZGLCAweEZGLCAweDM0LCAweDAzLCAweDBBLCAweDYwLCAweDE4LCAweEZCLCAweDAxLCAweDYzLAorCSAweDYwLCAweDQwLCAweDEwLCAweDIyLCAweDAwLCAweDYzLCAweDA4LCAweDYwLCAweEMxLCAweEZELCAweDA4LCAweDYwLCAweEM1LCAweEZELCAweDA4LCAweDYwLAorCSAweEM5LCAweEZELCAweDA4LCAweDYwLCAweENELCAweEZELCAweDdELCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDIzLCAweDIxLCAweDAwLAorCSAweDBCLCAweDM2LCAweDA3LCAweDAwLCAweDBDLCAweDM2LCAweDA1LCAweDAwLCAweDBELCAweDM2LCAweDAzLCAweDAwLCAweDBFLCAweDM2LCAweDAxLCAweDAwLAorCSAweDE4LCAweDAwLCAweERCLCAweEYzLCAweDAxLCAweDYzLCAweDBFLCAweDYwLCAweDM2LCAweEZELCAweDYwLCAweDQwLCAweDAzLCAweDNBLCAweDA4LCAweDAwLAorCSAweDA4LCAweDYwLCAweDE1LCAweEYxLCAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDA5LCAweDAwLAorCSAweDA0LCAweDNBLCAweDA3LCAweDAwLCAweDA4LCAweDYwLCAweDE1LCAweEYxLCAweDAwLCAweDYwLCAweDEwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLAorCSAweENGLCAweEZFLCAweDEwLCAweDY0LCAweDNCLCAweERCLCAweDdFLCAweEYzLCAweDczLCAweDQ1LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LAorCSAweEUwLCAweDg0LCAweEM0LCAweDkzLCAweEM5LCAweEZFLCAweDQ5LCAweEYzLCAweDNDLCAweDQ2LCAweDI1LCAweDE4LCAweENDLCAweDg0LCAweDQ5LCAweEZCLAorCSAweDIyLCAweDAyLCAweEMyLCAweDYwLCAweDQ1LCAweDY0LCAweDQwLCAweDQyLCAweEZDLCAweEZDLCAweDAwLCAweDY0LCAweDVDLCAweDVDLCAweDMyLCAweEZCLAorCSAweDgyLCAweEZGLCAweDVDLCAweDQ3LCAweDg0LCAweEZGLCAweDYyLCAweEZGLCAweDE2LCAweDYwLCAweDdFLCAweEYzLCAweEZGLCAweEZGLCAweERDLCAweDg0LAorCSAweDAwLCAweDM2LCAweDAwLCAweDNCLCAweEEyLCAweERCLCAweDIzLCAweEYwLCAweDAxLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweDI1LCAweDYwLAorCSAweEVDLCAweDY0LCAweDEzLCAweDYwLCAweDBBLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLAorCSAweDJCLCAweEZGLCAweEMxLCAweEZFLCAweENFLCAweEZFLCAweDY5LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQxLCAweEZELCAweEI0LCAweEEyLCAweERCLAorCSAweDYxLCAweDQ0LCAweDAxLCAweEIwLCAweDAyLCAweEIwLCAweDBCLCAweDAzLCAweDBBLCAweDAyLCAweDlELCAweEZFLCAweDA4LCAweDA0LCAweDFDLCAweDYwLAorCSAweENFLCAweDY0LCAweDEzLCAweDYwLCAweDIwLCAweEZCLCAweDAyLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDA3LCAweDAwLAorCSAweDdFLCAweEYzLCAweDczLCAweDQ1LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEM0LCAweDkzLCAweDFELCAweDYwLAorCSAweEJBLCAweDYzLCAweEEzLCAweEQzLCAweEFELCAweDQ5LCAweDIwLCAweEI1LCAweDA4LCAweEIxLCAweDIyLCAweDAzLCAweEUxLCAweDgxLCAweDEwLCAweEI1LAorCSAweDk1LCAweDgxLCAweDYwLCAweDQxLCAweDE4LCAweDAyLCAweDFELCAweDYwLCAweEJDLCAweDdDLCAweEE0LCAweEQzLCAweEZGLCAweEZGLCAweENDLCAweDg0LAorCSAweEE0LCAweERCLCAweDE2LCAweDAyLCAweDA1LCAweDY0LCAweEE0LCAweERCLCAweDYxLCAweDQ0LCAweDA3LCAweEI0LCAweEZGLCAweEZGLCAweDEwLCAweDAyLAorCSAweDA4LCAweEIxLCAweEUxLCAweDgxLCAweDk1LCAweDgxLCAweEEzLCAweEQzLCAweDBCLCAweDAzLCAweDA4LCAweEFDLCAweDAxLCAweEJDLCAweEEzLCAweERCLAorCSAweEZGLCAweEZGLCAweDEzLCAweEZGLCAweDA1LCAweDAwLCAweDEwLCAweEFDLCAweEEzLCAweERCLCAweDA1LCAweDdDLCAweDBFLCAweDYwLCAweERFLCAweEY5LAorCSAweEI4LCAweDYwLCAweDAzLCAweDc4LCAweEZGLCAweEZGLCAweDQ2LCAweEYzLCAweDQ1LCAweEYxLCAweDA0LCAweDFCLCAweDY0LCAweDQ0LCAweDAyLCAweDFCLAorCSAweDA3LCAweDYwLCAweEVELCAweEYzLCAweDQ1LCAweEZCLCAweDAwLCAweDYzLCAweDQ2LCAweEZELCAweDYwLCAweDQxLCAweDI1LCAweDY0LCAweDNCLCAweERCLAorCSAweDI3LCAweDQ0LCAweEVGLCAweEI0LCAweDQwLCAweDQ3LCAweDAwLCAweEI5LCAweDcxLCAweDQwLCAweDgwLCAweDI3LCAweDAxLCAweDEyLCAweDI3LCAweDAzLAorCSAweEMxLCAweDYwLCAweEM1LCAweDYyLCAweDg0LCAweEZGLCAweDQyLCAweDQyLCAweDgyLCAweEZGLCAweEEwLCAweDRDLCAweDE0LCAweEJDLCAweEZGLCAweEI0LAorCSAweEEwLCAweDUxLCAweDJELCAweDBBLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDgxLCAweDNFLCAweDcwLCAweDQ0LCAweEFDLCAweDgwLCAweDI3LCAweDBBLAorCSAweDcxLCAweDQwLCAweDgwLCAweDI3LCAweEY3LCAweDEyLCAweDQ1LCAweEYzLCAweDQ4LCAweDAyLCAweDExLCAweDE4LCAweDFCLCAweDYwLCAweEVFLCAweEYzLAorCSAweDFCLCAweDYwLCAweEVGLCAweEYzLCAweDA3LCAweDE4LCAweDA2LCAweDE4LCAweEFDLCAweDRDLCAweDgwLCAweDI2LCAweDAzLCAweDAwLCAweDAwLCAweDY0LAorCSAweDQ1LCAweEZCLCAweDA1LCAweDAwLCAweDQ1LCAweEYzLCAweEZGLCAweEZGLCAweENDLCAweDg0LCAweDQ1LCAweEZCLCAweEUzLCAweDAyLCAweDA2LCAweDBBLAorCSAweEEwLCAweDRDLCAweEZCLCAweEI0LCAweEEwLCAweDUxLCAweEE0LCAweDYwLCAweDU4LCAweDc4LCAweEZGLCAweEZGLCAweDg0LCAweEZGLCAweEMxLCAweDYwLAorCSAweEEzLCAweDY0LCAweDQwLCAweDQyLCAweDgyLCAweEZGLCAweEEwLCAweDRDLCAweDE0LCAweEJDLCAweEZGLCAweEI0LCAweEEwLCAweDUxLCAweEIwLCAweDYwLAorCSAweDlFLCAweDc4LCAweEZGLCAweEZGLCAweDNDLCAweDQ0LCAweEFDLCAweDgwLCAweDMyLCAweEYxLCAweDI1LCAweDAzLCAweDY0LCAweDQwLCAweDA3LCAweDIyLAorCSAweDIyLCAweDAwLCAweEE0LCAweDYwLCAweDM2LCAweDc4LCAweEZGLCAweEZGLCAweEEwLCAweDRDLCAweDFDLCAweEJDLCAweERGLCAweEI0LCAweEEwLCAweDUxLAorCSAweDMxLCAweDQwLCAweDA4LCAweDJBLCAweEVGLCAweDAxLCAweDcyLCAweEYzLCAweDcwLCAweEYxLCAweDAwLCAweEEwLCAweERDLCAweDgwLCAweDA1LCAweDAzLAorCSAweDA4LCAweDAzLCAweENDLCAweDg0LCAweDcyLCAweEZCLCAweDY3LCAweDUwLCAweDA4LCAweDAwLCAweENDLCAweDg0LCAweDcyLCAweEZCLCAweDY0LCAweDUwLAorCSAweDA0LCAweDAwLCAweDMxLCAweDQ0LCAweEY3LCAweEI0LCAweDQwLCAweDUxLCAweDA2LCAweDAwLCAweDI4LCAweDY0LCAweDNBLCAweERCLCAweEEwLCAweDRDLAorCSAweDMwLCAweEJDLCAweEYzLCAweEI0LCAweEEwLCAweDUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDgxLCAweDNFLCAweDI4LCAweDY0LCAweDNCLCAweERCLAorCSAweDA3LCAweDYwLCAweEVFLCAweEYzLCAweDMyLCAweDQwLCAweDAyLCAweDI3LCAweDE2LCAweDAwLCAweDQ2LCAweEZCLCAweDE0LCAweDE4LCAweEMyLCAweDYwLAorCSAweDMzLCAweDY0LCAweDg0LCAweEZGLCAweDQwLCAweDQyLCAweDgyLCAweEZGLCAweEEwLCAweDRDLCAweDE1LCAweEJDLCAweEY3LCAweEI0LCAweEEwLCAweDUxLAorCSAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDgxLCAweDNFLCAweDcwLCAweDQ0LCAweEFDLCAweDgwLCAweDQ2LCAweEYzLCAweEI4LCAweDBBLCAweERELCAweDAyLAorCSAweENDLCAweDg0LCAweDQ2LCAweEZCLCAweEY1LCAweDAyLCAweDg0LCAweEZGLCAweEMyLCAweDYwLCAweDQ1LCAweDY0LCAweDQwLCAweDQyLCAweDgyLCAweEZGLAorCSAweDI3LCAweDQ0LCAweDA4LCAweEJDLCAweDQwLCAweDQ3LCAweEY5LCAweEUxLCAweDA0LCAweDAwLCAweDc4LCAweEUxLCAweDMxLCAweDQwLCAweDAxLCAweDI2LAorCSAweEY5LCAweEUxLCAweEE0LCAweDYwLCAweDJELCAweDc4LCAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweEFCLCAweEYxLCAweDYwLCAweDQ1LCAweDMzLCAweDYwLAorCSAweDZBLCAweDYxLCAweEM1LCAweDgzLCAweEEzLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQxLCAweDY2LCAweDQ1LCAweDI0LCAweDQ2LCAweDBFLCAweEYyLAorCSAweDY1LCAweDQ2LCAweDY0LCAweDQ1LCAweEQ1LCAweDgxLCAweDYxLCAweDQ1LCAweDAwLCAweDdGLCAweEQ0LCAweDgwLCAweDY0LCAweDQzLCAweDA4LCAweDA0LAorCSAweEUzLCAweDgzLCAweDYzLCAweDQ1LCAweEM1LCAweDgxLCAweDYxLCAweDQ1LCAweEQ0LCAweDgwLCAweDAyLCAweDY1LCAweDAzLCAweDA3LCAweDAzLCAweDAwLAorCSAweDAwLCAweDY1LCAweDAxLCAweDAwLCAweDAxLCAweDY1LCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDY2LCAweDQzLCAweDY0LCAweDQ2LCAweDhGLCAweEYwLAorCSAweDEyLCAweEYyLCAweDkxLCAweEYyLCAweDYwLCAweDQwLCAweDEwLCAweDM2LCAweDA1LCAweDAwLCAweDEyLCAweDM2LCAweDA4LCAweDAwLCAweDBDLCAweDM2LAorCSAweDBCLCAweDAwLCAweDBGLCAweDAwLCAweDQwLCAweDYxLCAweEE1LCAweDgwLCAweDBBLCAweDY0LCAweDEzLCAweDAyLCAweEYzLCAweDAxLCAweDEwLCAweDYxLAorCSAweEE1LCAweDgwLCAweDBFLCAweDY0LCAweDBFLCAweDAyLCAweEVFLCAweDAxLCAweDA4LCAweDYxLCAweEE1LCAweDgwLCAweDEwLCAweDY0LCAweDA5LCAweDAyLAorCSAweEU5LCAweDAxLCAweEUxLCAweDgxLCAweEE1LCAweDgwLCAweDAzLCAweDA1LCAweEM4LCAweDg0LCAweDAzLCAweDAyLCAweEUzLCAweDAxLCAweEZGLCAweDYxLAorCSAweDAyLCAweDAwLCAweDEyLCAweEZBLCAweDkxLCAweEZBLCAweDYzLCAweDQ2LCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDhGLCAweEYwLCAweDEyLCAweEYyLAorCSAweDkxLCAweEYyLCAweDYwLCAweDQwLCAweDBBLCAweDM2LCAweDA1LCAweDAwLCAweDBFLCAweDM2LCAweDA4LCAweDAwLCAweDEwLCAweDM2LCAweDBCLCAweDAwLAorCSAweDBGLCAweDAwLCAweDA4LCAweDYxLCAweEE1LCAweDgwLCAweDEwLCAweDdFLCAweDExLCAweDAyLCAweEYzLCAweDAxLCAweDA0LCAweDYxLCAweEE1LCAweDgwLAorCSAweDEyLCAweDdFLCAweDBDLCAweDAyLCAweEVFLCAweDAxLCAweDIwLCAweDYxLCAweEE1LCAweDgwLCAweDBDLCAweDdFLCAweDA3LCAweDAyLCAweEU5LCAweDAxLAorCSAweEU5LCAweDgxLCAweEE1LCAweDgwLCAweDA1LCAweDA1LCAweEQ4LCAweDg0LCAweDAxLCAweDAyLCAweEUzLCAweDAxLCAweDEyLCAweEZBLCAweDkxLCAweEZBLAorCSAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDI4LCAweDQwLCAweDA4LCAweDNBLCAweDA2LCAweDAwLCAweDA0LCAweDYwLCAweDQwLCAweDYyLCAweDNELCAweDYwLAorCSAweDU4LCAweDRELCAweDNCLCAweDc4LCAweEZGLCAweEZGLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAxLCAweDJCLCAweDUwLCAweDAwLAorCSAweDI4LCAweDQwLCAweDA4LCAweDNBLCAweDRELCAweDAwLCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDE5LCAweDYwLAorCSAweDUyLCAweEZCLCAweDdELCAweEYxLCAweDJCLCAweDYwLCAweDgyLCAweDYzLCAweDY0LCAweDQwLCAweDAxLCAweDI3LCAweDNDLCAweEEzLCAweDI5LCAweDQwLAorCSAweDQwLCAweDJCLCAweDFFLCAweEEzLCAweEJELCAweEQxLCAweDYzLCAweDQ1LCAweDQ0LCAweDRFLCAweDBFLCAweDYxLCAweEJELCAweEQxLCAweENELCAweDgxLAorCSAweEQwLCAweDgwLCAweDAxLCAweDAzLCAweEZCLCAweDA0LCAweENCLCAweDgzLCAweDE5LCAweDYwLCAweDU1LCAweEYzLCAweDM5LCAweEYxLCAweEQ3LCAweDgzLAorCSAweEVCLCAweDgzLCAweDJFLCAweDQxLCAweDVELCAweDkzLCAweERGLCAweDgzLCAweDE5LCAweDYwLCAweDUxLCAweEZELCAweDE5LCAweDYwLCAweDUwLCAweEZCLAorCSAweDUzLCAweDkzLCAweERGLCAweDgwLCAweDEwLCAweDAzLCAweDM4LCAweEYzLCAweENGLCAweDgzLCAweDA4LCAweDAzLCAweERGLCAweDgzLCAweDBCLCAweDAyLAorCSAweERGLCAweDgzLCAweERDLCAweDg0LCAweEYwLCAweEEwLCAweDM4LCAweEZCLCAweDA2LCAweDAzLCAweDAzLCAweDAwLCAweENDLCAweDg0LCAweDM4LCAweEZCLAorCSAweDAyLCAweDAzLCAweDAwLCAweDYzLCAweDAyLCAweDAwLCAweDA4LCAweDY0LCAweDM4LCAweEZCLCAweEUzLCAweDgwLCAweEZCLCAweDgzLCAweEMzLCAweDgzLAorCSAweDYzLCAweDQ0LCAweEZDLCAweEEwLCAweDAyLCAweDBFLCAweDA4LCAweDA3LCAweDA4LCAweDAwLCAweDA0LCAweEE0LCAweEZGLCAweEZGLCAweDA1LCAweDBELAorCSAweEZDLCAweDY0LCAweEZGLCAweDdGLCAweDYwLCAweDQzLCAweDAxLCAweDAwLCAweDA0LCAweDYzLCAweDM5LCAweEZELCAweDE5LCAweDYwLCAweDU0LCAweEZELAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweDc0LCAweEYzLCAweDQwLCAweDRFLCAweDYwLCAweDQ2LCAweDJGLCAweERCLCAweDQ0LCAweDQ0LAorCSAweEExLCAweEQzLCAweEQ5LCAweDgxLCAweDQ4LCAweDk0LCAweDI0LCAweDVDLCAweEQwLCAweDlDLCAweDY2LCAweDQyLCAweDA0LCAweDA2LCAweEQyLCAweDlDLAorCSAweDJGLCAweEQ5LCAweDY0LCAweDQ2LCAweDI0LCAweDQ0LCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweEEzLCAweERCLCAweEZGLCAweEI0LCAweDYwLCAweDVDLAorCSAweDY2LCAweDQ0LCAweDIyLCAweEE0LCAweEQwLCAweDg0LCAweEUwLCAweEEwLCAweDAyLCAweDBELCAweDAwLCAweDY0LCAweDAyLCAweDAwLCAweDAxLCAweDA0LAorCSAweDFGLCAweDY0LCAweEEyLCAweEQzLCAweDYwLCAweDVDLCAweDY0LCAweDVFLCAweDYwLCAweDQ3LCAweDJGLCAweEQxLCAweDI4LCAweEEzLCAweEEzLCAweEQ5LAorCSAweEQ4LCAweEEzLCAweDJFLCAweDQyLCAweDRFLCAweDhFLCAweEJELCAweERCLCAweERCLCAweDAyLCAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDQzLCAweEZGLAorCSAweDM5LCAweEUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDg0LCAweDNFLCAweEZCLCAweDAxLCAweDNELCAweDQ0LCAweDAwLCAweEE4LCAweEZGLCAweEZGLAorCSAweDAzLCAweDAyLCAweDQwLCAweEZGLCAweDQ0LCAweEZGLCAweEY0LCAweDAxLCAweEEwLCAweDRDLCAweDNELCAweDQ2LCAweDJBLCAweEYyLCAweDQ2LCAweDRELAorCSAweDkyLCAweEZDLCAweDEwLCAweDI1LCAweDEyLCAweDAwLCAweDA5LCAweEUxLCAweEExLCAweEZGLCAweDJELCAweDQ2LCAweDBGLCAweEYyLCAweDAxLCAweDI5LAorCSAweDA2LCAweDAwLCAweDJBLCAweEYwLCAweDQwLCAweEZGLCAweDY0LCAweDQwLCAweDQwLCAweDJCLCAweDA4LCAweEJDLCAweDAyLCAweEJDLCAweDBGLCAweEZBLAorCSAweDA4LCAweDI1LCAweERELCAweDAxLCAweENCLCAweEZFLCAweDVDLCAweDVELCAweERCLCAweDAxLCAweDQ0LCAweEZGLCAweDMxLCAweEYyLCAweDFELCAweDYwLAorCSAweEMwLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDY2LCAweDQxLCAweDYwLCAweDQ2LCAweDYwLCAweDQzLAorCSAweDA1LCAweEYyLCAweDE2LCAweDE4LCAweDYxLCAweDQ2LCAweDMxLCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDA0LCAweEYyLCAweDBDLCAweDAyLAorCSAweDYxLCAweDQ2LCAweDMwLCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDAzLCAweEYyLCAweDA2LCAweDAyLCAweDYxLCAweDQ2LCAweDJGLCAweEYwLAorCSAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDgwLCAweEY0LCAweEZGLCAweEZGLCAweDYzLCAweDQ2LCAweEU4LCAweDFCLAorCSAweEE2LCAweEYzLCAweDA4LCAweEZFLCAweDYwLCAweDQzLCAweDYxLCAweDQ2LCAweDA3LCAweEZDLCAweDNGLCAweEYyLCAweDA5LCAweDYwLCAweEIwLCAweDY1LAorCSAweEQ0LCAweDgwLCAweDJBLCAweEYyLCAweEMwLCAweDA1LCAweDA4LCAweDI1LCAweEFBLCAweDAxLCAweDVDLCAweDRCLCAweDBDLCAweDYwLCAweEVBLCAweDYxLAorCSAweEExLCAweERGLCAweDJELCAweDQ2LCAweDNCLCAweEYyLCAweEE2LCAweEYxLCAweDg3LCAweEY0LCAweDYwLCAweDQwLCAweDIwLCAweDJCLCAweEMxLCAweDAwLAorCSAweEQzLCAweDgwLCAweDJDLCAweEYwLCAweEIwLCAweDAzLCAweDA3LCAweEY0LCAweDY0LCAweDQwLCAweDAxLCAweDI2LCAweEE2LCAweEY1LCAweEJBLCAweEY0LAorCSAweDJELCAweDQ2LCAweDA0LCAweDY0LCAweDA0LCAweEIzLCAweDIyLCAweEYwLCAweDAzLCAweDAzLCAweEM1LCAweDYwLCAweEUyLCAweDc4LCAweEZGLCAweEZGLAorCSAweDEwLCAweDY0LCAweEIwLCAweDlDLCAweDNCLCAweEYyLCAweDIyLCAweEY4LCAweDYwLCAweDQ3LCAweEMwLCAweEI3LCAweDAyLCAweEZFLCAweEYwLCAweDg0LAorCSAweEYwLCAweDg0LCAweEYwLCAweDg0LCAweDAwLCAweEE4LCAweDQwLCAweDRBLCAweDE3LCAweDAzLCAweEUwLCAweDgxLCAweDYxLCAweDQzLCAweDQyLCAweEZFLAorCSAweDAwLCAweDY0LCAweEYwLCAweDg0LCAweEZFLCAweDFGLCAweDQwLCAweDRBLCAweEUxLCAweDg0LCAweEUwLCAweDg0LCAweDJELCAweDQ2LCAweDA3LCAweEY0LAorCSAweEUwLCAweDgxLCAweDNCLCAweEYwLCAweDJBLCAweDQ3LCAweDBDLCAweDYwLCAweDM4LCAweDYzLCAweEEwLCAweDg0LCAweDQ3LCAweDlDLCAweDEwLCAweDAzLAorCSAweDdDLCAweDQ0LCAweDAwLCAweDYwLCAweEIyLCAweDYzLCAweDFDLCAweDAwLCAweDA3LCAweEY0LCAweDNCLCAweEYwLCAweDY2LCAweDQ0LCAweDY0LCAweDQwLAorCSAweDgwLCAweDJCLCAweDA2LCAweDAwLCAweDAwLCAweDYwLCAweDc4LCAweDdDLCAweDAwLCAweDYwLCAweEEyLCAweDYzLCAweDQzLCAweDRDLCAweDEwLCAweDAwLAorCSAweDJELCAweDQ2LCAweEM1LCAweDYwLCAweEQ1LCAweDc4LCAweEZGLCAweEZGLCAweDJELCAweDQ2LCAweDIyLCAweEYyLCAweDEwLCAweDYwLCAweDAwLCAweDdDLAorCSAweEIwLCAweDg0LCAweDIyLCAweEZBLCAweDMyLCAweDQwLCAweDA0LCAweDI2LCAweDI1LCAweDAwLCAweEM1LCAweDYwLCAweEQ1LCAweDc4LCAweEZGLCAweEZGLAorCSAweEVELCAweEZCLCAweEVFLCAweEY5LCAweEVGLCAweEZELCAweEFELCAweDQ2LCAweDNELCAweEYyLCAweEFELCAweDQ2LCAweEEzLCAweEQwLCAweEFELCAweDQ2LAorCSAweEQwLCAweDgwLCAweDNDLCAweEYyLCAweEFELCAweDQ2LCAweDAyLCAweDAzLCAweDE1LCAweDA3LCAweEU2LCAweDA0LCAweDVCLCAweEQwLCAweEFELCAweDQ2LAorCSAweEQwLCAweDgwLCAweDNBLCAweEYyLCAweDAzLCAweDAzLCAweEFELCAweDQ2LCAweDBELCAweDA3LCAweERFLCAweDA0LCAweDNBLCAweEYwLCAweEFELCAweDQ2LAorCSAweDVCLCAweEQwLCAweDY0LCAweDQ0LCAweEQwLCAweDgwLCAweDJCLCAweDQ0LCAweDA1LCAweDA3LCAweEQ2LCAweDAzLCAweEQwLCAweDg0LCAweDEwLCAweEE0LAorCSAweEZGLCAweEZGLCAweDAwLCAweDA3LCAweEVFLCAweEYzLCAweEVELCAweEY1LCAweEZFLCAweEE0LCAweDBGLCAweDYwLCAweEJFLCAweDYxLCAweDBFLCAweDYzLAorCSAweDU4LCAweEQwLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweDJELCAweDQ2LCAweDhCLCAweEZGLCAweDJELCAweDQ2LCAweDIyLCAweEYyLCAweDIwLCAweDYwLAorCSAweDAwLCAweDdDLCAweEIwLCAweDg0LCAweDIyLCAweEZBLCAweDBGLCAweDYwLCAweEIwLCAweDY0LCAweEM5LCAweDYwLCAweDU4LCAweDRGLCAweDU2LCAweDc4LAorCSAweEZGLCAweEZGLCAweDNGLCAweEYyLCAweDAwLCAweDYwLCAweDE4LCAweDcwLCAweDE4LCAweDcxLCAweDIwLCAweDcyLCAweDYwLCAweDUzLCAweDg4LCAweDc1LAorCSAweDAwLCAweEYyLCAweDA5LCAweEUxLCAweDYwLCAweDUwLCAweDEyLCAweDcxLCAweDZFLCAweDcyLCAweDgzLCAweDc1LCAweEExLCAweEZGLCAweEZGLCAweEZGLAorCSAweDA4LCAweDI1LCAweDFELCAweDAwLCAweDQwLCAweEZGLCAweDAyLCAweEUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDc1LCAweDQwLCAweDAzLCAweDJBLAorCSAweDAzLCAweDAwLCAweDgwLCAweDc1LCAweDBBLCAweDY0LCAweDBCLCAweDAwLCAweDgwLCAweDc1LCAweDFCLCAweEYzLCAweDhCLCAweEZGLCAweDAyLCAweDYwLAorCSAweDAwLCAweDc1LCAweEZGLCAweEZGLCAweDAyLCAweDYwLCAweDAwLCAweDc1LCAweERDLCAweDg0LCAweEEyLCAweERCLCAweDAyLCAweDY0LCAweDk4LCAweEZGLAorCSAweDJELCAweDQ2LCAweDBGLCAweEYwLCAweEZGLCAweEZGLCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweDg4LCAweEZGLCAweDBCLCAweDAxLCAweDhCLCAweEZGLAorCSAweDAyLCAweDYwLCAweDAwLCAweDc1LCAweEZGLCAweEZGLCAweDAyLCAweDYwLCAweDAwLCAweDc1LCAweDg4LCAweEZGLCAweEM1LCAweDYwLCAweEJCLCAweDc4LAorCSAweEZGLCAweEZGLCAweDIyLCAweEYwLCAweDIyLCAweDY0LCAweEIwLCAweDg0LCAweDIyLCAweEZBLCAweDNBLCAweEYwLCAweEZGLCAweEZGLCAweDY0LCAweDQ0LAorCSAweEUwLCAweDdGLCAweEEwLCAweDVCLCAweDY0LCAweDQ3LCAweEUxLCAweDdGLCAweDVBLCAweEQwLCAweEEwLCAweDVCLCAweDY0LCAweDQ0LCAweEUyLCAweDdGLAorCSAweEEwLCAweDVCLCAweDY0LCAweDQ3LCAweDdDLCAweDVGLCAweEU4LCAweDg0LCAweEU4LCAweDg1LCAweDBELCAweDYwLCAweDAwLCAweDY0LCAweDQ0LCAweEQzLAorCSAweDVBLCAweEQxLCAweDAzLCAweDFCLCAweEM1LCAweDYwLCAweEQ1LCAweDc4LCAweEZGLCAweEZGLCAweDYwLCAweDQ1LCAweDY0LCAweDQ0LCAweEUzLCAweDdGLAorCSAweEEwLCAweDVCLCAweDY0LCAweDQ3LCAweEU0LCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVCLCAweDY0LCAweDQ0LCAweEU1LCAweDdGLCAweEEwLCAweDVCLAorCSAweDY0LCAweDQ3LCAweEU2LCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVCLCAweDY0LCAweDQ0LCAweEU3LCAweDdGLCAweEEwLCAweDVCLCAweDY1LCAweDQwLAorCSAweDBELCAweDNBLCAweDFDLCAweDAwLCAweDY0LCAweDQ3LCAweEU4LCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVCLCAweDY0LCAweDQ0LCAweEU5LCAweDdGLAorCSAweEEwLCAweDVCLCAweDY0LCAweDQ3LCAweEVBLCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVCLCAweDY0LCAweDQ0LCAweEVCLCAweDdGLCAweEEwLCAweDVCLAorCSAweDY0LCAweDQ3LCAweEVDLCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVCLCAweDY0LCAweDQ0LCAweEVELCAweDdGLCAweEEwLCAweDVCLCAweDY0LCAweDQ3LAorCSAweEVFLCAweDdGLCAweDVBLCAweEQxLCAweEEwLCAweDVCLCAweDY0LCAweDQ0LCAweEVGLCAweDdGLCAweEEwLCAweDVCLCAweDY1LCAweDQ0LCAweEQ4LCAweDg0LAorCSAweDA4LCAweDI1LCAweDI1LCAweDAwLCAweDYwLCAweDdGLCAweEEwLCAweDVCLCAweDgwLCAweDYwLCAweDAwLCAweEVCLCAweEEwLCAweDYwLCAweDAwLCAweEVCLAorCSAweEQxLCAweDYwLCAweDAwLCAweEVCLCAweDIyLCAweEYyLCAweDIwLCAweDYwLCAweDAwLCAweDdDLCAweEIwLCAweDg0LCAweDIyLCAweEZBLCAweDNGLCAweEYyLAorCSAweDNCLCAweEYwLCAweDYwLCAweDQzLCAweEZDLCAweEE0LCAweDY0LCAweDQwLCAweDIwLCAweDJCLCAweDA0LCAweDAwLCAweDA4LCAweEE0LCAweDNGLCAweEZBLAorCSAweDA4LCAweEEzLCAweEY4LCAweEEzLCAweDNGLCAweEZBLCAweDBBLCAweEUxLCAweEIzLCAweEZGLCAweDlBLCAweEZGLCAweENCLCAweDgzLCAweDAwLCAweEY0LAorCSAweDEwLCAweDYyLCAweDZDLCAweDYxLCAweDBFLCAweEEzLCAweEFCLCAweDg0LCAweEYyLCAweEEzLCAweEExLCAweEZGLCAweDA5LCAweDAwLCAweERBLCAweDAwLAorCSAweDAwLCAweEY0LCAweDgxLCAweEYyLCAweEZDLCAweDE4LCAweDAyLCAweDYyLCAweEM5LCAweDgxLCAweEFCLCAweDg0LCAweDAxLCAweDAwLCAweEEyLCAweERDLAorCSAweDdBLCAweEQ0LCAweEZELCAweDFDLCAweEEyLCAweERDLCAweDA4LCAweDI1LCAweENFLCAweDAwLCAweEYyLCAweDFELCAweDQxLCAweDQ0LCAweDdDLCAweEE4LAorCSAweEQ5LCAweDgxLCAweEVFLCAweDAzLCAweEZGLCAweEIxLCAweDk4LCAweEZGLCAweDA5LCAweEUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDY0LCAweDQwLAorCSAweDIwLCAweDI3LCAweDA0LCAweDAwLCAweDA4LCAweDI1LCAweEJGLCAweDAwLCAweDdCLCAweDFFLCAweDZGLCAweDAwLCAweDA4LCAweDI1LCAweEJCLCAweDAwLAorCSAweDQwLCAweEZGLCAweDQyLCAweDQyLCAweDQ2LCAweDQzLCAweDA2LCAweDFFLCAweDA0LCAweDAyLCAweDAwLCAweEY0LCAweDAyLCAweDYyLCAweDQyLCAweDQyLAorCSAweDQ2LCAweDQzLCAweDAxLCAweEEyLCAweDYzLCAweDQ1LCAweDAxLCAweEEyLCAweDYyLCAweDQzLCAweDQ2LCAweDRDLCAweEM2LCAweDYwLCAweDU4LCAweDRGLAorCSAweDg3LCAweDc4LCAweEZGLCAweEZGLCAweDBBLCAweEUxLCAweDlBLCAweEZGLCAweDJELCAweDQ2LCAweDEyLCAweEYyLCAweDNCLCAweEYwLCAweDMzLCAweDFCLAorCSAweDY0LCAweDQwLCAweDIwLCAweDJCLCAweDM4LCAweDAwLCAweDJELCAweDVDLCAweDI0LCAweDQxLCAweDAyLCAweEExLCAweDY1LCAweDQzLCAweDA4LCAweEEzLAorCSAweDIzLCAweDQ2LCAweDIyLCAweDQyLCAweDdFLCAweDNBLCAweDBBLCAweDAwLCAweDAwLCAweEY0LCAweDgxLCAweEYyLCAweEI4LCAweDE4LCAweDAyLCAweDYyLAorCSAweEM5LCAweDgxLCAweEFCLCAweDg0LCAweDAzLCAweDAwLCAweEEyLCAweERDLCAweDdFLCAweDM2LCAweEY2LCAweDAxLCAweDE1LCAweDExLCAweDdBLCAweEQ0LAorCSAweEZGLCAweEZGLCAweEY5LCAweDFDLCAweEEyLCAweERDLCAweEYwLCAweDFELCAweEQ5LCAweDgxLCAweEZGLCAweEIxLCAweDQxLCAweDFFLCAweDYyLCAweDQwLAorCSAweDdFLCAweDNBLCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDAyLCAweDYyLCAweDA3LCAweDExLCAweDVBLCAweEQyLCAweDg5LCAweEZGLCAweDgwLCAweDRGLAorCSAweDZGLCAweDQ0LCAweEEyLCAweERBLCAweDg4LCAweEZGLCAweDM0LCAweDAwLCAweDYyLCAweDQ1LCAweDMzLCAweEYzLCAweEZGLCAweEZGLCAweDAzLCAweDFCLAorCSAweDY1LCAweDQyLCAweEU1LCAweDFELCAweEYyLCAweDAxLCAweDk4LCAweEZGLCAweDJELCAweDQ2LCAweDAxLCAweDY0LCAweDEyLCAweEZBLCAweDBGLCAweEYwLAorCSAweDBBLCAweDY0LCAweEIwLCAweDg0LCAweDQxLCAweDAwLCAweDI0LCAweDQxLCAweDAyLCAweEExLCAweDY1LCAweDQzLCAweDA4LCAweEEzLCAweDIzLCAweDQ2LAorCSAweDIyLCAweDQyLCAweDdFLCAweDNBLCAweDBBLCAweDAwLCAweDAwLCAweEY0LCAweDgxLCAweEYyLCAweDVDLCAweDE4LCAweDAyLCAweDYyLCAweEM5LCAweDgxLAorCSAweEFCLCAweDg0LCAweDAzLCAweDAwLCAweEEyLCAweERDLCAweDdFLCAweDM2LCAweEY2LCAweDAxLCAweDdBLCAweEQ0LCAweEZGLCAweEZGLCAweEZBLCAweDFDLAorCSAweEEyLCAweERDLCAweEYxLCAweDFELCAweEQ5LCAweDgxLCAweEZGLCAweEIxLCAweDBCLCAweDFFLCAweDYyLCAweDQwLCAweDdFLCAweDNBLCAweDAyLCAweDAwLAorCSAweDAwLCAweEY0LCAweDAyLCAweDYyLCAweDVBLCAweEQyLCAweDg5LCAweEZGLCAweDgwLCAweDRGLCAweDZGLCAweDQ0LCAweEEyLCAweERBLCAweDg4LCAweEZGLAorCSAweDk4LCAweEZGLCAweDJELCAweDQ2LCAweDBGLCAweEYwLCAweDBBLCAweDY0LCAweEIwLCAweDg0LCAweDE2LCAweDE0LCAweEY3LCAweEI0LCAweEEyLCAweERBLAorCSAweDA2LCAweDYwLCAweDc1LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDBCLCAweDAwLCAweEYwLCAweEY1LCAweEVGLCAweEY0LAorCSAweDBDLCAweDYwLCAweEVBLCAweDYxLCAweDU5LCAweEQxLCAweDNCLCAweEY4LCAweDA1LCAweDY0LCAweDU5LCAweEQxLCAweENDLCAweDg0LCAweEJELCAweEQ4LAorCSAweEZDLCAweDAyLCAweEMzLCAweDYwLCAweDZBLCAweDc4LCAweEZGLCAweEZGLCAweEEyLCAweERBLCAweDJELCAweDQ2LCAweDNCLCAweEYwLCAweEZGLCAweEZGLAorCSAweDY0LCAweDQwLCAweDIwLCAweDJCLCAweDFDLCAweDAwLCAweDA3LCAweEY0LCAweEJCLCAweEYwLCAweDJBLCAweDQ0LCAweEE0LCAweDg0LCAweEZGLCAweEZGLAorCSAweDJGLCAweDI2LCAweDE1LCAweDAwLCAweDJELCAweDQ2LCAweDY0LCAweDQ0LCAweDNBLCAweEYwLCAweEJDLCAweEYwLCAweDY0LCAweDVGLCAweDNELCAweEYwLAorCSAweDA3LCAweEY0LCAweEVGLCAweEY0LCAweEZGLCAweEZGLCAweDA4LCAweEEzLCAweDVCLCAweEQ4LCAweDY1LCAweDVDLCAweDVCLCAweEQ4LCAweDVCLCAweERBLAorCSAweDJELCAweDQ2LCAweEVELCAweEYzLCAweDNDLCAweEZBLCAweEVFLCAweEYzLCAweDNELCAweEZBLCAweDJBLCAweDQ0LCAweDIzLCAweEZBLCAweEMzLCAweDYwLAorCSAweDZBLCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDk4LCAweEZGLCAweDQzLCAweEZGLCAweDQwLCAweEZGLCAweEIwLCAweEZGLCAweEIxLCAweEZGLAorCSAweDJELCAweDQ2LCAweDBDLCAweDYwLCAweEVBLCAweDYxLCAweEExLCAweEQzLCAweDJELCAweDQ2LCAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDBBLCAweDAwLAorCSAweEYwLCAweEY1LCAweEVGLCAweEY0LCAweDU5LCAweEQxLCAweDNCLCAweEY4LCAweDA1LCAweDY0LCAweDU5LCAweEQxLCAweENDLCAweDg0LCAweEJELCAweEQ4LAorCSAweEZDLCAweDAyLCAweDJELCAweDQ2LCAweEMzLCAweDYwLCAweDQ4LCAweDc4LCAweEZGLCAweEZGLCAweDk4LCAweEZGLCAweDA5LCAweEUxLCAweEExLCAweEZGLAorCSAweDJELCAweDQ2LCAweDA4LCAweDI1LCAweEUwLCAweDAxLCAweDBGLCAweEYyLCAweDQwLCAweEZGLCAweDAyLCAweEJDLCAweEEyLCAweERBLCAweEMzLCAweDYwLAorCSAweDZBLCAweDc4LCAweEZGLCAweEZGLCAweEIwLCAweDg0LCAweDIyLCAweEZBLCAweEEwLCAweDYwLCAweDAwLCAweEVCLCAweEIwLCAweDYwLCAweDAwLCAweEVCLAorCSAweDAwLCAweDYzLCAweDNCLCAweEYyLCAweDA2LCAweDYwLCAweDc1LCAweEZELCAweDYwLCAweDQ3LCAweEMwLCAweEI3LCAweDAyLCAweEZFLCAweEYwLCAweDg0LAorCSAweEYwLCAweDg0LCAweEYwLCAweDg0LCAweDAwLCAweEE4LCAweDQwLCAweDRBLCAweDE2LCAweDAzLCAweEUwLCAweDgxLCAweDYxLCAweDQzLCAweDQyLCAweEZFLAorCSAweDAwLCAweDY0LCAweEYwLCAweDg0LCAweEZFLCAweDFGLCAweDQwLCAweDRBLCAweEUxLCAweDg0LCAweEUwLCAweDg0LCAweDJELCAweDQ2LCAweDA3LCAweEY0LAorCSAweEUwLCAweDgxLCAweDNCLCAweEYwLCAweDJBLCAweDQ3LCAweDBDLCAweDYwLCAweDM4LCAweDYzLCAweEEwLCAweDg0LCAweDQ3LCAweDlDLCAweDEwLCAweDAzLAorCSAweDdDLCAweDQ0LCAweEE4LCAweDYzLCAweDBGLCAweDAwLCAweDA3LCAweEY0LCAweDIwLCAweDY0LCAweDQwLCAweDRBLCAweDNCLCAweEYwLCAweDY2LCAweDQ0LAorCSAweDY0LCAweDQwLCAweDgwLCAweDJCLCAweDA1LCAweDAwLCAweDAwLCAweDYwLCAweDc4LCAweDdDLCAweDAwLCAweDYwLCAweDk4LCAweDYzLCAweDAyLCAweDAwLAorCSAweDJELCAweDQ2LCAweEJCLCAweDAxLCAweDJELCAweDQ2LCAweEVELCAweEZCLCAweEVFLCAweEY5LCAweEVGLCAweEZELCAweDA3LCAweEYyLCAweEYwLCAweEZCLAorCSAweDYwLCAweDQ2LCAweDNCLCAweEYwLCAweDJBLCAweDQ0LCAweDA2LCAweDYwLCAweDc2LCAweEY5LCAweDVDLCAweDRCLCAweEEwLCAweDg0LCAweEZGLCAweEZGLAorCSAweDNGLCAweDIyLCAweDA1LCAweDAwLCAweDkwLCAweDg0LCAweDNCLCAweEZBLCAweDAxLCAweDY0LCAweDQwLCAweDRCLCAweDJDLCAweDAwLCAweEFELCAweDQ2LAorCSAweDBBLCAweEEzLCAweDNELCAweEYyLCAweEFELCAweDQ2LCAweEEzLCAweEQwLCAweEFELCAweDQ2LCAweEQwLCAweDgwLCAweDNDLCAweEYyLCAweEFELCAweDQ2LAorCSAweDAyLCAweDAzLCAweDIxLCAweDA3LCAweDE0LCAweDA0LCAweDVCLCAweEQwLCAweEFELCAweDQ2LCAweEQwLCAweDgwLCAweDNCLCAweEYyLCAweDAzLCAweDAzLAorCSAweEFELCAweDQ2LCAweDE5LCAweDA3LCAweDBDLCAweDA0LCAweDNBLCAweEYwLCAweEFELCAweDQ2LCAweDVCLCAweEQwLCAweDY0LCAweDVGLCAweEQwLCAweDgwLAorCSAweDJCLCAweDQ0LCAweDIyLCAweDA3LCAweDA0LCAweDAzLCAweEQwLCAweDg0LCAweDEwLCAweEE0LCAweEZGLCAweEZGLCAweDFELCAweDA3LCAweDJELCAweDQ2LAorCSAweDIyLCAweEYyLCAweDEwLCAweDYwLCAweDAwLCAweDdDLCAweEIwLCAweDg0LCAweDIyLCAweEZBLCAweDMyLCAweDQwLCAweDA0LCAweDI2LCAweDE0LCAweDAwLAorCSAweEM1LCAweDYwLCAweEQ1LCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDY0LCAweDA2LCAweDYwLCAweDc1LCAweEZCLCAweDJELCAweDQ2LCAweDBDLCAweDYwLAorCSAweEZBLCAweDYyLCAweDgwLCAweEZGLCAweDc4LCAweDQ0LCAweDAzLCAweEE0LCAweEEyLCAweERCLCAweEM2LCAweDYwLCAweEJDLCAweDc4LCAweEZGLCAweEZGLAorCSAweDg1LCAweEZGLCAweDJELCAweDQ2LCAweDA4LCAweDI1LCAweDRGLCAweDAxLCAweDJELCAweDQ2LCAweDBDLCAweDYwLCAweEZBLCAweDYyLCAweDgwLCAweEZGLAorCSAweDc4LCAweDQ0LCAweDAzLCAweEE0LCAweEEyLCAweERCLCAweEM3LCAweDYwLCAweDQ0LCAweDc4LCAweEZGLCAweEZGLCAweDg1LCAweEZGLCAweDJELCAweDQ2LAorCSAweDA4LCAweDI1LCAweDQxLCAweDAxLCAweDAwLCAweDYwLCAweDBGLCAweDY0LCAweDA4LCAweDI1LCAweDNDLCAweDAxLCAweDYwLCAweDdGLCAweEEwLCAweDVCLAorCSAweDgwLCAweDYwLCAweDAwLCAweEVCLCAweEQzLCAweDYwLCAweDAwLCAweEVCLCAweEM0LCAweDYwLCAweEMyLCAweDc4LCAweEZGLCAweEZGLCAweDJELCAweDQ2LAorCSAweDNCLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDIwLCAweDJCLCAweDIzLCAweDAwLCAweDA4LCAweDYxLCAweDIzLCAweDExLCAweDJELCAweDQ2LAorCSAweDAwLCAweEY0LCAweDBBLCAweDYyLCAweDU2LCAweDkyLCAweDVBLCAweEQwLCAweDJDLCAweDQ2LCAweDY0LCAweDQ3LCAweDYzLCAweDQwLCAweDdGLCAweDJBLAorCSAweDAzLCAweDAwLCAweDAwLCAweEY0LCAweDAzLCAweDYzLCAweDQ2LCAweDRDLCAweDYwLCAweEZFLCAweERFLCAweEQ4LCAweDdGLCAweDNBLCAweDAzLCAweDAwLAorCSAweDAwLCAweEY0LCAweDAzLCAweDYzLCAweDQ2LCAweDRDLCAweERFLCAweERBLCAweEZFLCAweEExLCAweDIwLCAweEZFLCAweEU3LCAweDAyLCAweDYzLCAweDQxLAorCSAweEZELCAweEExLCAweDQ2LCAweDRDLCAweDAxLCAweEYyLCAweDJELCAweDQ2LCAweDYxLCAweDVFLCAweDE2LCAweEZBLCAweDJDLCAweDQ0LCAweDA2LCAweEZBLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDJELCAweDVDLCAweDNELCAweDQ0LCAweDAwLCAweEE4LCAweEQwLCAweDgwLCAweEQ4LCAweDAzLCAweEQ3LCAweDAzLAorCSAweDJELCAweDQ2LCAweDAxLCAweDY0LCAweDEyLCAweEZBLCAweEY0LCAweDAxLCAweDA3LCAweEY0LCAweDY2LCAweDQxLCAweDAzLCAweEYyLCAweDA0LCAweEYyLAorCSAweDQwLCAweDQyLCAweDA1LCAweEYyLCAweDQwLCAweDQzLCAweDQwLCAweDQ0LCAweDYxLCAweDQ2LCAweDNDLCAweEYyLCAweDNELCAweEYyLCAweDQwLCAweDQwLAorCSAweDQwLCAweDQxLCAweDBELCAweDYwLCAweDcwLCAweDY1LCAweDAwLCAweDYxLCAweEVFLCAweEYxLCAweEVELCAweEY1LCAweDQ0LCAweDRDLCAweDJDLCAweDVDLAorCSAweEU5LCAweDgwLCAweDAwLCAweDY0LCAweEYwLCAweDg0LCAweEYwLCAweDg0LCAweEMwLCAweDgzLCAweEJELCAweEQyLCAweDI0LCAweDVDLCAweDkwLCAweDlDLAorCSAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLAorCSAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDIwLCAweDQ0LCAweDQwLCAweDgwLCAweERCLCAweDgzLCAweEJELCAweEQyLCAweDIwLCAweDVDLCAweDkwLCAweDlDLAorCSAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLAorCSAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDIxLCAweDQ0LCAweDQwLCAweDgxLCAweERCLCAweDgzLCAweEJELCAweEQyLCAweDIxLCAweDVDLCAweDkwLCAweDlDLAorCSAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLAorCSAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDIyLCAweDQ0LCAweDQwLCAweDgyLCAweERCLCAweDgzLCAweEJELCAweEQyLCAweDIyLCAweDVDLCAweDkwLCAweDlDLAorCSAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLAorCSAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDIzLCAweDQ0LCAweDQwLCAweDgzLCAweEYyLCAweEEzLCAweEJELCAweEQyLCAweDIzLCAweDVDLCAweDkwLCAweDlDLAorCSAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLAorCSAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDI0LCAweDQ0LCAweEMwLCAweDlDLCAweDQxLCAweDg0LCAweERELCAweDgxLCAweDA4LCAweDJBLCAweEE3LCAweDAxLAorCSAweDBDLCAweDYwLCAweEVDLCAweDYxLCAweDA1LCAweDY0LCAweEVGLCAweEY0LCAweEYwLCAweEY1LCAweEZFLCAweEEzLCAweDVCLCAweEQwLCAweENDLCAweDg0LAorCSAweDU5LCAweEQ5LCAweEZDLCAweDAyLCAweEVGLCAweEYzLCAweEYwLCAweEY1LCAweDYwLCAweDQyLCAweDIwLCAweDQ0LCAweEEyLCAweERBLCAweDIxLCAweDQ0LAorCSAweDVBLCAweERBLCAweDIyLCAweDQ0LCAweDVBLCAweERBLCAweDIzLCAweDQ0LCAweDVBLCAweERBLCAweDI0LCAweDQ0LCAweDVBLCAweERBLCAweDYxLCAweDQ2LAorCSAweDA2LCAweDYwLCAweDdELCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDY2LCAweDQxLCAweEVGLCAweEYzLCAweEYwLCAweEY1LCAweEEwLCAweEQyLAorCSAweDVBLCAweEQwLCAweDQwLCAweDQwLCAweDQ0LCAweDQxLCAweDVBLCAweEQyLCAweDVBLCAweEQwLCAweDQwLCAweDQyLCAweDVBLCAweEQwLCAweDQ0LCAweDQzLAorCSAweDYxLCAweDQ2LCAweEJBLCAweEYwLCAweDNCLCAweEYyLCAweDQ0LCAweDQ0LCAweDY1LCAweDVGLCAweDQwLCAweDg1LCAweEVFLCAweEY0LCAweEVELCAweEY1LAorCSAweDQzLCAweDRDLCAweDBELCAweDYwLCAweDcwLCAweDY1LCAweEJELCAweEQyLCAweDI1LCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLAorCSAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLAorCSAweDIwLCAweDQ0LCAweDQwLCAweDgwLCAweEJELCAweEQyLCAweDIwLCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LAorCSAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDIxLCAweDQ0LAorCSAweDQwLCAweDgxLCAweEJELCAweEQyLCAweDIxLCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLAorCSAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDIyLCAweDQ0LCAweDQwLCAweDgyLAorCSAweEJELCAweEQyLCAweDIyLCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LAorCSAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDIzLCAweDQ0LCAweDQwLCAweDgzLCAweEJELCAweEQyLAorCSAweDIzLCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLAorCSAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDI0LCAweDQ0LCAweDQwLCAweDg0LCAweEJELCAweEQyLCAweDI0LCAweDVDLAorCSAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LAorCSAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDI1LCAweDQ0LCAweDQwLCAweDg1LCAweDYxLCAweDQ2LCAweDNBLCAweEYwLCAweEZGLCAweEZGLAorCSAweDY0LCAweDQ0LCAweEUwLCAweDdGLCAweEEwLCAweDVCLCAweDY0LCAweDQ3LCAweEUxLCAweDdGLCAweDVBLCAweEQwLCAweEEwLCAweDVCLCAweDY0LCAweDQ0LAorCSAweEUyLCAweDdGLCAweEEwLCAweDVCLCAweDY0LCAweDQ3LCAweEVELCAweEY1LCAweEJELCAweEQyLCAweDI1LCAweDVDLCAweDkwLCAweDg0LCAweEU4LCAweDgwLAorCSAweEY4LCAweDg0LCAweDIwLCAweDVDLCAweDQwLCAweDgwLCAweDIwLCAweDQ0LCAweEU0LCAweDdGLCAweEEwLCAweDVCLCAweDIwLCAweDQ3LCAweEU1LCAweDdGLAorCSAweEEwLCAweDVCLCAweEJELCAweEQyLCAweDIwLCAweDVDLCAweDkwLCAweDg0LCAweEU4LCAweDgwLCAweEY4LCAweDg0LCAweDIxLCAweDVDLCAweDQwLCAweDgxLAorCSAweDIxLCAweDQ0LCAweEU2LCAweDdGLCAweEEwLCAweDVCLCAweDIxLCAweDQ3LCAweEU3LCAweDdGLCAweEEwLCAweDVCLCAweDIxLCAweDQ0LCAweEU4LCAweDgwLAorCSAweEY4LCAweDg0LCAweDIyLCAweDVDLCAweDQwLCAweDgyLCAweDIyLCAweDQ0LCAweEU4LCAweDdGLCAweEEwLCAweDVCLCAweDIyLCAweDQ3LCAweEU5LCAweDdGLAorCSAweEEwLCAweDVCLCAweDIyLCAweDQ0LCAweEU4LCAweDgwLCAweEY4LCAweDg0LCAweDIzLCAweDVDLCAweDQwLCAweDgzLCAweDIzLCAweDQ0LCAweEVBLCAweDdGLAorCSAweEEwLCAweDVCLCAweDIzLCAweDQ3LCAweEVCLCAweDdGLCAweEEwLCAweDVCLCAweDIzLCAweDQ0LCAweEU4LCAweDgwLCAweEY4LCAweDg0LCAweDI0LCAweDVDLAorCSAweDQwLCAweDg0LCAweDI0LCAweDQ0LCAweEVDLCAweDdGLCAweEEwLCAweDVCLCAweDI0LCAweDQ3LCAweEVELCAweDdGLCAweEEwLCAweDVCLCAweDI0LCAweDQ0LAorCSAweEU4LCAweDgwLCAweEY4LCAweDg0LCAweDI1LCAweDVDLCAweDQwLCAweDg1LCAweDI1LCAweDQ0LCAweEVFLCAweDdGLCAweEEwLCAweDVCLCAweDI1LCAweDQ3LAorCSAweEVGLCAweDdGLCAweEEwLCAweDVCLCAweDJDLCAweDQzLCAweEEzLCAweEQyLCAweDI1LCAweDVDLCAweDkwLCAweDgxLCAweEU5LCAweDg0LCAweEUzLCAweDdGLAorCSAweEEwLCAweDVCLCAweDA2LCAweDYwLCAweDdELCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVBLCAweEYzLCAweDVBLCAweEQzLCAweDQwLCAweDQ4LAorCSAweDVBLCAweEQzLCAweDQwLCAweDQ5LCAweDQwLCAweDRBLCAweDAwLCAweDYwLCAweDc4LCAweDdDLCAweDQ0LCAweDRELCAweDQ5LCAweEYyLCAweDRBLCAweEYyLAorCSAweDQwLCAweDQ3LCAweDQwLCAweDQ2LCAweDBELCAweDYwLCAweDcwLCAweDY1LCAweDAwLCAweDYxLCAweDJELCAweDVDLCAweEU5LCAweDgwLCAweDAwLCAweDY0LAorCSAweEYwLCAweDg0LCAweEYwLCAweDg0LCAweEMwLCAweDgzLCAweEJELCAweEQyLCAweDJBLCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLAorCSAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLAorCSAweDI2LCAweDQ0LCAweDQwLCAweDg2LCAweERCLCAweDgzLCAweEJELCAweEQyLCAweDI2LCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLAorCSAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLAorCSAweDI3LCAweDQ0LCAweDQwLCAweDg3LCAweERCLCAweDgzLCAweEJELCAweEQyLCAweDI3LCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLAorCSAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLAorCSAweDI4LCAweDQ0LCAweDQwLCAweDg4LCAweERCLCAweDgzLCAweEJELCAweEQyLCAweDI4LCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLAorCSAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLAorCSAweDI5LCAweDQ0LCAweDQwLCAweDg5LCAweEYyLCAweEEzLCAweEJELCAweEQyLCAweDI5LCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLAorCSAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLAorCSAweDJBLCAweDQ0LCAweEMwLCAweDlDLCAweDQxLCAweDhBLCAweERELCAweDgxLCAweDA4LCAweDJBLCAweEE3LCAweDAxLCAweDI2LCAweDQ0LCAweDQ0LCAweEZBLAorCSAweDI3LCAweDQ0LCAweDQ1LCAweEZBLCAweDI4LCAweDQ0LCAweDQ2LCAweEZBLCAweDI5LCAweDQ0LCAweDQ3LCAweEZBLCAweDJBLCAweDQ0LCAweDQ4LCAweEZBLAorCSAweDA2LCAweDYwLCAweDdFLCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDg4LCAweDdDLCAweDQ0LCAweDRELCAweDJELCAweDQyLAorCSAweEEyLCAweEQyLCAweDVBLCAweEQwLCAweDQwLCAweDQ2LCAweDQ0LCAweDQ3LCAweDVBLCAweEQyLCAweDVBLCAweEQwLCAweDQwLCAweDQ4LCAweDVBLCAweEQwLAorCSAweDQ0LCAweDQ5LCAweDRCLCAweEYyLCAweDQ0LCAweDRBLCAweDQwLCAweDhCLCAweDYwLCAweDVDLCAweDY0LCAweDQ3LCAweEUwLCAweDdGLCAweEEwLCAweDVBLAorCSAweEZGLCAweEI0LCAweDIwLCAweEJDLCAweDdGLCAweEI0LCAweEUxLCAweDdGLCAweEEwLCAweDVBLCAweDY0LCAweDQ0LCAweEUyLCAweDdGLCAweEEwLCAweDVBLAorCSAweDAwLCAweDYwLCAweDc4LCAweDYzLCAweDBELCAweDYwLCAweDcwLCAweDY1LCAweEJELCAweEQyLCAweDJCLCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LAorCSAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LAorCSAweDkwLCAweDlDLCAweDI2LCAweDQ0LCAweDQwLCAweDg2LCAweEJELCAweEQyLCAweDI2LCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLAorCSAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLAorCSAweDI3LCAweDQ0LCAweDQwLCAweDg3LCAweEJELCAweEQyLCAweDI3LCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LAorCSAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDI4LCAweDQ0LAorCSAweDQwLCAweDg4LCAweEJELCAweEQyLCAweDI4LCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLAorCSAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDI5LCAweDQ0LCAweDQwLCAweDg5LAorCSAweEJELCAweEQyLCAweDI5LCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LAorCSAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDJBLCAweDQ0LCAweDQwLCAweDhBLCAweEJELCAweEQyLAorCSAweDJBLCAweDVDLCAweDkwLCAweDlDLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLAorCSAweEUwLCAweDg0LCAweDQ0LCAweEQxLCAweDY0LCAweDQ3LCAweDkwLCAweDlDLCAweDJCLCAweDQ0LCAweDQwLCAweDhCLCAweEJELCAweEQyLCAweDJCLCAweDVDLAorCSAweDkwLCAweDg0LCAweEU4LCAweDgwLCAweEY4LCAweDg0LCAweDI2LCAweDVDLCAweDQwLCAweDg2LCAweDI2LCAweDQ0LCAweEU0LCAweDdGLCAweEEwLCAweDVBLAorCSAweDI2LCAweDQ3LCAweEU1LCAweDdGLCAweEEwLCAweDVBLCAweEJELCAweEQyLCAweDI2LCAweDVDLCAweDkwLCAweDg0LCAweEU4LCAweDgwLCAweEY4LCAweDg0LAorCSAweDI3LCAweDVDLCAweDQwLCAweDg3LCAweDI3LCAweDQ0LCAweEU2LCAweDdGLCAweEEwLCAweDVBLCAweDI3LCAweDQ3LCAweEU3LCAweDdGLCAweEEwLCAweDVBLAorCSAweDI3LCAweDQ0LCAweEU4LCAweDgwLCAweEY4LCAweDg0LCAweDI4LCAweDVDLCAweDQwLCAweDg4LCAweDI4LCAweDQ0LCAweEU4LCAweDdGLCAweEEwLCAweDVBLAorCSAweDI4LCAweDQ3LCAweEU5LCAweDdGLCAweEEwLCAweDVBLCAweDI4LCAweDQ0LCAweEU4LCAweDgwLCAweEY4LCAweDg0LCAweDI5LCAweDVDLCAweDQwLCAweDg5LAorCSAweDI5LCAweDQ0LCAweEVBLCAweDdGLCAweEEwLCAweDVBLCAweDI5LCAweDQ3LCAweEVCLCAweDdGLCAweEEwLCAweDVBLCAweDI5LCAweDQ0LCAweEU4LCAweDgwLAorCSAweEY4LCAweDg0LCAweDJBLCAweDVDLCAweDQwLCAweDhBLCAweDJBLCAweDQ0LCAweEVDLCAweDdGLCAweEEwLCAweDVBLCAweDJBLCAweDQ3LCAweEVELCAweDdGLAorCSAweEEwLCAweDVBLCAweDJBLCAweDQ0LCAweEU4LCAweDgwLCAweEY4LCAweDg0LCAweDJCLCAweDVDLCAweDQwLCAweDhCLCAweDJCLCAweDQ0LCAweEVFLCAweDdGLAorCSAweEEwLCAweDVBLCAweDJCLCAweDQ3LCAweEVGLCAweDdGLCAweEEwLCAweDVBLCAweDNDLCAweEYwLCAweDJCLCAweDQ0LCAweDkwLCAweDg0LCAweEU4LCAweDg0LAorCSAweEUzLCAweDdGLCAweEEwLCAweDVBLCAweDA2LCAweDYwLCAweDdFLCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDYwLCAweDQ1LCAweDAwLCAweEYwLAorCSAweDg0LCAweDYwLCAweDAwLCAweEUzLCAweDA0LCAweDcxLCAweDY0LCAweDUwLCAweDAxLCAweDJBLCAweDA0LCAweDcxLCAweDVDLCAweDYxLCAweDA0LCAweDYzLAorCSAweDU5LCAweEQwLCAweDU4LCAweEQ5LCAweEZELCAweDFGLCAweDNELCAweEYyLCAweDYwLCAweDQzLCAweDYwLCAweDQ3LCAweDVCLCAweERCLCAweDNDLCAweEYyLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQ3LCAweDVCLCAweERCLCAweDNBLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQ3LCAweDVCLCAweERCLCAweDNGLCAweEYyLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQ3LCAweDVCLCAweERCLCAweDgxLCAweDYwLCAweDE4LCAweEUzLCAweDY1LCAweDQzLCAweEUzLCAweDg0LCAweDYwLCAweDQ3LAorCSAweDAwLCAweDdGLCAweDYwLCAweDUwLCAweDdGLCAweDY0LCAweDIzLCAweDk0LCAweDYwLCAweDUxLCAweDdDLCAweDcyLCAweDA0LCAweDc1LCAweDBDLCAweDYwLAorCSAweDE2LCAweDYxLCAweDE2LCAweDYwLCAweDAwLCAweDYzLCAweDU5LCAweERELCAweDJBLCAweEYyLCAweDg3LCAweDYwLCAweDhGLCAweDY1LCAweEE0LCAweDg3LAorCSAweDQwLCAweEJGLCAweDU5LCAweERCLCAweDU2LCAweDY0LCAweDBBLCAweDYzLCAweDU4LCAweEQwLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweDYyLCAweDY0LAorCSAweDA0LCAweDYzLCAweDU4LCAweEQwLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweDM1LCAweEYyLCAweDBGLCAweDY1LCAweEE0LCAweDlDLCAweDU5LCAweEQ5LAorCSAweDA2LCAweDYzLCAweDU5LCAweERGLCAweEZFLCAweDFGLCAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQ1LCAweDAzLCAweDJCLCAweDA1LCAweDAwLAorCSAweDZBLCAweDY0LCAweDA0LCAweDYzLCAweDU4LCAweEQwLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweDY1LCAweDQwLCAweDhGLCAweEIwLCAweDg4LCAweDNBLAorCSAweDAyLCAweDAwLCAweDM5LCAweEYwLCAweDU5LCAweEQ5LCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBDLCAweDYwLCAweDE2LCAweDYxLCAweEEzLCAweDQ2LAorCSAweDAwLCAweEY0LCAweDAyLCAweDY0LCAweDBBLCAweDYzLCAweDU4LCAweEQwLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweDU5LCAweERGLCAweDU5LCAweERGLAorCSAweEEwLCAweDRDLCAweDA0LCAweEJDLCAweEZGLCAweEI0LCAweEEwLCAweDUxLCAweDIzLCAweDQ0LCAweDAxLCAweEE3LCAweDgwLCAweEJGLCAweDYwLCAweDUwLAorCSAweDgwLCAweDYwLCAweDM4LCAweDcxLCAweDgwLCAweDYwLCAweDdDLCAweDcyLCAweDAxLCAweDc2LCAweEZGLCAweEZGLCAweDc2LCAweDQ0LCAweDAxLCAweDNBLAorCSAweEZELCAweDAxLCAweDQwLCAweDc2LCAweDQwLCAweDc2LCAweDQyLCAweEZGLCAweEZGLCAweEZGLCAweDQwLCAweDc2LCAweDgwLCAweDYwLCAweDE4LCAweDcwLAorCSAweDgwLCAweDYwLCAweDE4LCAweDcxLCAweDgwLCAweDYwLCAweDdDLCAweDcyLCAweDgwLCAweDYwLCAweDEwLCAweDczLCAweDAyLCAweDc2LCAweDc2LCAweDQ0LAorCSAweEZGLCAweEZGLCAweDc2LCAweDQ0LCAweDAyLCAweDNBLCAweEZELCAweDAxLCAweDQwLCAweDc2LCAweDQyLCAweEZGLCAweDNDLCAweDQ2LCAweDAwLCAweEYyLAorCSAweDgwLCAweDYwLCAweDAwLCAweEJDLCAweDYwLCAweDUwLCAweDgwLCAweDYwLCAweDEyLCAweDcxLCAweDgwLCAweDYwLCAweDZFLCAweDcyLCAweDNGLCAweEYyLAorCSAweEZGLCAweEZGLCAweEY4LCAweEE3LCAweDgwLCAweEJGLCAweDYwLCAweDUzLCAweDA0LCAweDc2LCAweEZGLCAweEZGLCAweDg4LCAweEZGLCAweDNDLCAweDQ2LAorCSAweDA3LCAweEYyLCAweEZGLCAweEZGLCAweDQwLCAweDQzLCAweEEzLCAweDQ2LCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDc3LCAweDQwLCAweDhCLCAweEZGLAorCSAweEEwLCAweDRCLCAweDA0LCAweEUxLCAweEZGLCAweEZGLCAweDc2LCAweDQ0LCAweDA0LCAweDNBLCAweEZELCAweDAxLCAweDQwLCAweDc2LCAweDQyLCAweEZGLAorCSAweEZGLCAweEZGLCAweDEwLCAweDc2LCAweEZGLCAweEZGLCAweDc2LCAweDQ0LCAweDIwLCAweDNBLCAweEZELCAweDAxLCAweDQwLCAweDc2LCAweDQyLCAweEZGLAorCSAweDYzLCAweDQ0LCAweDAwLCAweDdGLCAweEEwLCAweDUxLCAweDAyLCAweDYwLCAweDAwLCAweDc1LCAweDg4LCAweEZGLCAweEEwLCAweDRDLCAweEZCLCAweEI0LAorCSAweEEwLCAweDUxLCAweDA2LCAweDYwLCAweDFGLCAweEUxLCAweDE2LCAweEZGLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDNGLCAweEYyLAorCSAweEZGLCAweEZGLCAweEY4LCAweEE0LCAweDNGLCAweEZBLCAweDAwLCAweEY0LCAweDYwLCAweDQ3LCAweDA4LCAweEZBLCAweEEwLCAweDQ4LCAweDA4LCAweDI2LAorCSAweDA3LCAweDAwLCAweEEwLCAweDRDLCAweDA0LCAweEUxLCAweEZGLCAweEZGLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDdGLCAweEEwLCAweDUxLAorCSAweDQyLCAweEZGLCAweDI2LCAweDQ2LCAweDhCLCAweEZGLCAweDAyLCAweDYwLCAweDAwLCAweDc1LCAweDNDLCAweEYyLCAweDQwLCAweDc2LCAweDE0LCAweDFCLAorCSAweDI2LCAweDQ2LCAweDNCLCAweEYyLCAweDBDLCAweDYwLCAweEJBLCAweDYzLCAweDYwLCAweDQ3LCAweEMwLCAweEI0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LAorCSAweEU4LCAweDg0LCAweDQzLCAweDkzLCAweEUzLCAweDlDLCAweDY0LCAweDQ3LCAweDgwLCAweDdDLCAweDY0LCAweDVGLCAweDYwLCAweDUwLCAweDdGLCAweDY0LAorCSAweDIzLCAweDk3LCAweDgwLCAweEJGLCAweDYwLCAweDUxLCAweDA3LCAweDAwLCAweDAxLCAweEE3LCAweDgwLCAweEJGLCAweDYwLCAweDUwLCAweDgwLCAweDYwLAorCSAweDQwLCAweDcxLCAweDgwLCAweDYwLCAweDdDLCAweDcyLCAweDAxLCAweDc2LCAweEZGLCAweEZGLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDBDLCAweDIxLAorCSAweEZDLCAweDAxLCAweDA0LCAweDI1LCAweEQ1LCAweDAxLCAweDQwLCAweDc2LCAweDQzLCAweEZGLCAweDBDLCAweDYwLCAweDIyLCAweDYxLCAweDI2LCAweDQ2LAorCSAweDAwLCAweEY0LCAweDAyLCAweDY0LCAweDBBLCAweDYzLCAweDU4LCAweEQwLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweDU5LCAweERGLCAweDU5LCAweERGLAorCSAweDgwLCAweDYwLCAweDE4LCAweDcwLCAweDgwLCAweDYwLCAweDI0LCAweDcxLCAweDgwLCAweDYwLCAweDdDLCAweDcyLCAweDgwLCAweDYwLCAweDEwLCAweDczLAorCSAweDAyLCAweDc2LCAweEZGLCAweEZGLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDBDLCAweDIxLCAweEZDLCAweDAxLCAweDA0LCAweDI1LCAweEI4LCAweDAxLAorCSAweDQwLCAweDc2LCAweDQzLCAweEZGLCAweDI2LCAweDQ2LCAweDAwLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQ3LCAweDgwLCAweEJGLCAweDYwLCAweDUwLAorCSAweDgwLCAweDYwLCAweDEyLCAweDcxLCAweDNGLCAweEYyLCAweDgwLCAweDYwLCAweDZFLCAweDcyLCAweDYwLCAweDQ3LCAweDgwLCAweEJGLCAweDYwLCAweDUzLAorCSAweDA0LCAweDc2LCAweEZGLCAweEZGLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDBDLCAweDIxLCAweEZDLCAweDAxLCAweDA0LCAweDI1LCAweEEwLCAweDAxLAorCSAweDQwLCAweDc2LCAweDQzLCAweEZGLCAweDA4LCAweDc2LCAweEZGLCAweEZGLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDBDLCAweDIxLCAweEZDLCAweDAxLAorCSAweDA0LCAweDI1LCAweDk2LCAweDAxLCAweDc2LCAweDVDLCAweEZGLCAweEZGLCAweDQwLCAweDc2LCAweDQzLCAweEZGLCAweDg4LCAweEZGLCAweDI2LCAweDQ2LAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEVFLCAweDYwLCAweDYwLCAweDc4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDA4LCAweEYxLCAweDgwLCAweDYwLAorCSAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDAwLCAweERCLCAweEYzLCAweDMxLCAweDQxLCAweDAxLCAweEIxLAorCSAweDAzLCAweEE4LCAweDJBLCAweDAzLCAweDE1LCAweDAyLCAweDIwLCAweDQwLCAweDA0LCAweDJCLCAweDBCLCAweDAwLCAweEJCLCAweEZFLCAweENBLCAweEZFLAorCSAweDFDLCAweDYwLCAweDkyLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAyLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLAorCSAweDA3LCAweDAwLCAweDA4LCAweDYwLCAweDA5LCAweEYxLCAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLAorCSAweDA4LCAweDYwLCAweDFCLCAweEYxLCAweDAwLCAweDYwLCAweDgwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDBDLCAweDAwLAorCSAweEE5LCAweEZFLCAweERCLCAweDA1LCAweEFCLCAweEZFLCAweDBDLCAweDA1LCAweEE4LCAweEZFLCAweENDLCAweDA1LCAweEFBLCAweEZFLCAweENELCAweDA1LAorCSAweDc4LCAweDQzLCAweDAxLCAweDYxLCAweDI5LCAweDYwLCAweEVBLCAweDc4LCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDg1LCAweDNFLAorCSAweDEzLCAweDYwLCAweDAyLCAweEYzLCAweEZGLCAweEZGLCAweDAwLCAweEE4LCAweDYwLCAweDQ2LCAweDAzLCAweDAyLCAweENBLCAweDYwLCAweEQ0LCAweDc4LAorCSAweEZGLCAweEZGLCAweDI2LCAweDQ1LCAweEQ0LCAweDgwLCAweDBGLCAweEYwLCAweEY5LCAweDAzLCAweDY0LCAweDQ0LCAweDcwLCAweEIwLCAweDcwLCAweDJBLAorCSAweDEzLCAweDAwLCAweDE2LCAweDYwLCAweDg1LCAweEYzLCAweEZGLCAweEZGLCAweERDLCAweDg0LCAweDAwLCAweDM2LCAweDAwLCAweDNCLCAweEEyLCAweERCLAorCSAweEEyLCAweEZGLCAweEFDLCAweEYzLCAweEZGLCAweEZGLCAweENDLCAweDg0LCAweEZFLCAweEEwLCAweEFDLCAweEZCLCAweDAxLCAweDA3LCAweEQ0LCAweEZFLAorCSAweEEzLCAweEZGLCAweEQwLCAweDYwLCAweEI1LCAweDc4LCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAyLCAweDI2LCAweDA5LCAweDAwLCAweDY2LCAweDQ1LAorCSAweDA5LCAweEY0LCAweDBGLCAweEYyLCAweDAyLCAweDE4LCAweDY1LCAweDQ2LCAweEU0LCAweDFCLCAweDAwLCAweDY0LCAweDQwLCAweDQ2LCAweENDLCAweDAxLAorCSAweEEyLCAweEZGLCAweEFDLCAweEYzLCAweDQ2LCAweDQ2LCAweENDLCAweDg0LCAweEZFLCAweEEwLCAweEFDLCAweEZCLCAweDAxLCAweDA3LCAweEQ0LCAweEZFLAorCSAweEEzLCAweEZGLCAweDBGLCAweEYwLCAweEEzLCAweEZDLCAweDY0LCAweDQ0LCAweDgwLCAweDI2LCAweDM1LCAweDAwLCAweDJDLCAweDYwLCAweEVBLCAweDY0LAorCSAweEYxLCAweDYwLCAweDc4LCAweDQxLCAweEU0LCAweDc4LCAweEI1LCAweEYxLCAweDMyLCAweDQ0LCAweDAxLCAweDJBLCAweDAzLCAweDAwLCAweDA3LCAweDYwLAorCSAweDAxLCAweDY0LCAweDIyLCAweDAwLCAweDAyLCAweDJBLCAweDAzLCAweDAwLCAweDAwLCAweDYwLCAweDAxLCAweDY0LCAweDFELCAweDAwLCAweDA0LCAweDJBLAorCSAweDFGLCAweDAwLCAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDBDLCAweEIwLCAweDA4LCAweDNBLCAweDFBLCAweDAwLCAweDJDLCAweEYwLCAweDIyLCAweEYwLAorCSAweDY0LCAweDQwLCAweDAxLCAweDI2LCAweDBCLCAweDAwLCAweDY0LCAweDQwLCAweDQwLCAweDJCLCAweDEyLCAweDAwLCAweDhGLCAweEIwLCAweDg4LCAweDNBLAorCSAweDBGLCAweDAwLCAweDM5LCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweEIwLCAweDIwLCAweDNBLCAweDBBLCAweDAwLCAweDIzLCAweEYyLCAweDAwLCAweDYwLAorCSAweDAxLCAweDdDLCAweEIwLCAweDg0LCAweDIzLCAweEZBLCAweDBDLCAweDAwLCAweDIzLCAweEZBLCAweEQwLCAweDYwLCAweEMxLCAweDc4LCAweEZGLCAweEZGLAorCSAweEQwLCAweDYwLCAweEI1LCAweDc4LCAweEZGLCAweEZGLCAweDIyLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDEwLCAweDI3LCAweEY4LCAweDAxLAorCSAweDBGLCAweEYwLCAweEZGLCAweEZGLCAweDY0LCAweDQ0LCAweDA4LCAweDI2LCAweDY0LCAweDAwLCAweDJBLCAweEYyLCAweDYwLCAweDYzLCAweDYwLCAweDQwLAorCSAweDAyLCAweDJCLCAweDY2LCAweDYzLCAweEJFLCAweEQyLCAweDgxLCAweEYxLCAweEEzLCAweEQyLCAweEQwLCAweDgwLCAweDgwLCAweEYxLCAweDBELCAweDAyLAorCSAweEJGLCAweEQyLCAweEQwLCAweDgwLCAweDdGLCAweEYxLCAweDA5LCAweDAyLCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA2LCAweDAyLCAweDJDLCAweDYwLAorCSAweEY2LCAweDY0LCAweEYxLCAweDYwLCAweDc4LCAweDQxLCAweEU0LCAweDc4LCAweEI1LCAweEYxLCAweDMyLCAweDQ0LCAweDAxLCAweDJBLCAweDAzLCAweDAwLAorCSAweDA3LCAweDYwLCAweDAyLCAweDY0LCAweDA0LCAweDAwLCAweDAyLCAweDJBLCAweDA2LCAweDAwLCAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweDIzLCAweEZBLAorCSAweEQwLCAweDYwLCAweEMxLCAweDc4LCAweEZGLCAweEZGLCAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweEIwLCAweDNBLCAweDA2LCAweDAwLAorCSAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweDIzLCAweEZBLCAweENDLCAweDYwLCAweDMxLCAweDc4LCAweEZGLCAweEZGLCAweDMyLCAweDQwLCAweDA0LCAweDJBLAorCSAweDJELCAweDAwLCAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDBDLCAweEIwLCAweDA4LCAweDNBLCAweDI4LCAweDAwLCAweDJDLCAweEYwLCAweDIyLCAweEYwLAorCSAweDY0LCAweDQwLCAweDAxLCAweDI2LCAweDBCLCAweDAwLCAweDY0LCAweDQwLCAweDQwLCAweDJCLCAweDIwLCAweDAwLCAweDhGLCAweEIwLCAweDg4LCAweDNBLAorCSAweDFELCAweDAwLCAweDM5LCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweEIwLCAweDIwLCAweDNBLCAweDE4LCAweDAwLCAweDJDLCAweEYwLCAweDY2LCAweDQ1LAorCSAweDA3LCAweEY0LCAweDY0LCAweDQwLCAweDAxLCAweDI2LCAweEE2LCAweEY1LCAweDNBLCAweEYyLCAweDY1LCAweDQ2LCAweDYwLCAweDQwLCAweDAwLCAweDM2LAorCSAweDBELCAweDAwLCAweDIyLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDEwLCAweDJBLCAweDA4LCAweDAwLCAweDIwLCAweDJCLCAweDA2LCAweDAwLAorCSAweDIzLCAweEYyLCAweDAwLCAweDYwLCAweDAyLCAweDdDLCAweEIwLCAweDg0LCAweDIzLCAweEZBLCAweDAzLCAweDAwLCAweEQwLCAweDYwLCAweEI1LCAweDc4LAorCSAweEZGLCAweEZGLCAweDMyLCAweDQ0LCAweDAxLCAweDJBLCAweDRBLCAweDAwLCAweDJFLCAweDYwLCAweDQwLCAweDYzLCAweEJGLCAweEQzLCAweDAwLCAweDY1LAorCSAweEI0LCAweDgxLCAweERCLCAweDgzLCAweDNELCAweDAzLCAweEJGLCAweEQzLCAweEEzLCAweEQzLCAweDQwLCAweDQ4LCAweEJFLCAweEQzLCAweDQwLCAweDRBLAorCSAweDJFLCAweEYwLCAweDQwLCAweDRDLCAweEQwLCAweDgwLCAweDJELCAweEYwLCAweDA4LCAweDAyLCAweDJBLCAweDQ0LCAweEQwLCAweDgwLCAweDJDLCAweEYwLAorCSAweDA0LCAweDAyLCAweDI4LCAweDQ0LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDJCLCAweDAzLCAweDMxLCAweEYwLCAweDJDLCAweDQ0LCAweEQwLCAweDgwLAorCSAweDMwLCAweEYwLCAweDA4LCAweDAyLCAweDJBLCAweDQ0LCAweEQwLCAweDgwLCAweDJGLCAweEYwLCAweDA0LCAweDAyLCAweDI4LCAweDQ0LCAweEQwLCAweDgwLAorCSAweEZGLCAweEZGLCAweDFFLCAweDAzLCAweDM0LCAweEYwLCAweDJDLCAweDQ0LCAweEQwLCAweDgwLCAweDMzLCAweEYwLCAweDA4LCAweDAyLCAweDJBLCAweDQ0LAorCSAweEQwLCAweDgwLCAweDMyLCAweEYwLCAweDA0LCAweDAyLCAweDI4LCAweDQ0LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDExLCAweDAzLCAweDM4LCAweEYwLAorCSAweDJDLCAweDQ0LCAweEQwLCAweDgwLCAweDM3LCAweEYwLCAweDA4LCAweDAyLCAweDJBLCAweDQ0LCAweEQwLCAweDgwLCAweDM2LCAweEYwLCAweDA0LCAweDAyLAorCSAweDI4LCAweDQ0LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA0LCAweDAzLCAweEZBLCAweEExLCAweDA2LCAweEEzLCAweEI3LCAweDAzLCAweEMzLCAweDAxLAorCSAweDA3LCAweDYwLCAweDAwLCAweDY0LCAweDIzLCAweEZBLCAweEQwLCAweDYwLCAweEMxLCAweDc4LCAweEZGLCAweEZGLCAweDJBLCAweEYyLCAweDBGLCAweEYwLAorCSAweDYwLCAweDQ1LCAweEE0LCAweDM2LCAweDA4LCAweDAwLCAweDBDLCAweEI0LCAweDA0LCAweDM2LCAweDAyLCAweDAwLCAweDBDLCAweDNBLCAweDA2LCAweDAwLAorCSAweEQwLCAweDYwLCAweEI1LCAweDc4LCAweEZGLCAweEZGLCAweENFLCAweDYwLCAweDdDLCAweDc4LCAweEZGLCAweEZGLCAweDBGLCAweEYwLCAweDY1LCAweDQwLAorCSAweDQwLCAweDJCLCAweDE3LCAweDAwLCAweDMyLCAweDQwLCAweDA4LCAweDI2LCAweDE0LCAweDAwLCAweDA3LCAweEY0LCAweDNBLCAweEYyLCAweEZGLCAweEZGLAorCSAweDM3LCAweEI0LCAweDI2LCAweDQ2LCAweDBFLCAweDAyLCAweDJDLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDI2LCAweDA2LCAweDAwLAorCSAweDJDLCAweDYwLCAweEYwLCAweDY0LCAweEYxLCAweDYwLCAweDc4LCAweDQxLCAweEU0LCAweDc4LCAweEI1LCAweEYxLCAweEQwLCAweDYwLCAweEI1LCAweDc4LAorCSAweEZGLCAweEZGLCAweDJBLCAweEYyLCAweDY0LCAweDQwLCAweDYwLCAweDI2LCAweDAzLCAweDAwLCAweENFLCAweDYwLCAweDRFLCAweDc4LCAweEZGLCAweEZGLAorCSAweDYwLCAweDQxLCAweEE2LCAweEYzLCAweDA3LCAweEZBLCAweDYxLCAweDQ0LCAweDgwLCAweDNBLCAweDAyLCAweDAwLCAweDJBLCAweEYyLCAweDEyLCAweDAwLAorCSAweDYwLCAweDQwLCAweDQwLCAweDNBLCAweDBGLCAweDAwLCAweERCLCAweEYzLCAweEZGLCAweEZGLCAweDA3LCAweEI0LCAweDAzLCAweDNBLCAweEU2LCAweDAxLAorCSAweEQxLCAweDYwLCAweDU4LCAweDRELCAweEE2LCAweDc4LCAweEZGLCAweEZGLCAweEUxLCAweDAyLCAweEE2LCAweEYzLCAweDA3LCAweEZBLCAweENELCAweDYwLAorCSAweEUxLCAweDc4LCAweEZGLCAweEZGLCAweDVFLCAweDYzLCAweDYwLCAweDQwLCAweDAyLCAweDJCLCAweDY0LCAweDYzLCAweDUwLCAweEZFLCAweEJELCAweEQyLAorCSAweDdGLCAweEYxLCAweEJELCAweEQyLCAweEQwLCAweDgwLCAweDgwLCAweEYxLCAweEJELCAweEQyLCAweEQwLCAweDgwLCAweDgxLCAweEYxLCAweDJBLCAweEYyLAorCSAweEQwLCAweDgwLCAweDYwLCAweDQwLCAweDA4LCAweDNBLCAweDA5LCAweDAwLCAweDAxLCAweDBDLCAweEM4LCAweDAxLCAweEU5LCAweDYwLCAweDU4LCAweDRGLAorCSAweDA4LCAweDc4LCAweEZGLCAweEZGLCAweENELCAweDYwLCAweEUxLCAweDc4LCAweEZGLCAweEZGLCAweDIzLCAweDBDLCAweEQxLCAweDYwLCAweDU4LCAweDRELAorCSAweEE2LCAweDc4LCAweEZGLCAweEZGLCAweEJCLCAweDAyLCAweDAyLCAweDY0LCAweDEwLCAweDYwLCAweDBBLCAweEZCLCAweDAwLCAweDY0LCAweDEwLCAweDYwLAorCSAweDBFLCAweEZCLCAweDI2LCAweDYwLCAweDU4LCAweDRFLCAweDY1LCAweDc4LCAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweDA1LCAweEYzLCAweEZGLCAweEZGLAorCSAweDYwLCAweDQwLCAweDgwLCAweDI3LCAweDA3LCAweDAwLCAweDA4LCAweDYwLCAweDE1LCAweEYxLCAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweEIwLCAweDg0LAorCSAweEEyLCAweERCLCAweENGLCAweEZFLCAweDAwLCAweDY0LCAweDEwLCAweDYwLCAweDBBLCAweEZCLCAweEEwLCAweDAxLCAweENELCAweDYwLCAweEUxLCAweDc4LAorCSAweEZGLCAweEZGLCAweERCLCAweEYzLCAweEZGLCAweEZGLCAweDA3LCAweEI0LCAweEZELCAweEEwLCAweEZGLCAweEZGLCAweDAzLCAweDAzLCAweDIwLCAweDQwLAorCSAweDEwLCAweDIyLCAweEY0LCAweDAxLCAweDA4LCAweDYwLCAweDA3LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDM2LCAweDA3LCAweDAwLAorCSAweDAxLCAweDY0LCAweEEyLCAweERCLCAweDAxLCAweDY1LCAweEYxLCAweDYwLCAweDU4LCAweDRFLCAweEMzLCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LAorCSAweDMxLCAweEYyLCAweDFELCAweDYwLCAweEMwLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDY2LCAweDQxLAorCSAweDYwLCAweDQ2LCAweDYwLCAweDQzLCAweDA1LCAweEYyLCAweDE2LCAweDE4LCAweDYxLCAweDQ2LCAweDMxLCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLAorCSAweDA0LCAweEYyLCAweDBDLCAweDAyLCAweDYxLCAweDQ2LCAweDMwLCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDAzLCAweEYyLCAweDA2LCAweDAyLAorCSAweDYxLCAweDQ2LCAweDJGLCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDgwLCAweEY0LCAweEZGLCAweEZGLAorCSAweDYzLCAweDQ2LCAweEU4LCAweDFCLCAweEE2LCAweEYzLCAweDA4LCAweEZFLCAweDYwLCAweDQzLCAweDYxLCAweDQ2LCAweEE2LCAweEYxLCAweDQzLCAweDQzLAorCSAweEQzLCAweDgwLCAweEZGLCAweEZGLCAweDAzLCAweDAzLCAweENELCAweDYwLCAweEQ5LCAweDc4LCAweEZGLCAweEZGLCAweEQwLCAweDYwLCAweDU4LCAweDRGLAorCSAweEZDLCAweDc4LCAweEZGLCAweEZGLCAweDAzLCAweDRCLCAweDNGLCAweEYyLCAweDAwLCAweEY0LCAweDYwLCAweDQzLCAweEY0LCAweEEzLCAweDAwLCAweDYwLAorCSAweDFELCAweDYxLCAweDAwLCAweDYwLCAweDAxLCAweDY1LCAweDAxLCAweDYwLCAweEZGLCAweDY0LCAweDQwLCAweDRDLCAweEZELCAweDYwLCAweDU4LCAweDRFLAorCSAweDdBLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweEJCLCAweEZGLCAweEZGLCAweDAwLCAweDAyLCAweDAwLCAweDY0LCAweDQwLCAweDRBLCAweDYwLCAweEZFLAorCSAweDAyLCAweDYwLCAweDAwLCAweDYzLCAweEJELCAweEQzLCAweEJELCAweEQzLCAweDYwLCAweDQxLCAweEZFLCAweDYwLCAweDU4LCAweDRFLCAweDJDLCAweDc4LAorCSAweEZGLCAweEZGLCAweDIwLCAweEZFLCAweDAwLCAweDY1LCAweDAwLCAweDY0LCAweDE5LCAweDYwLCAweDNCLCAweEZCLCAweDAyLCAweDAwLCAweDIwLCAweEZFLAorCSAweEZGLCAweDY1LCAweDAyLCAweDYwLCAweDAwLCAweDYzLCAweDYwLCAweEZFLCAweEJELCAweEQzLCAweEJELCAweEQzLCAweDYwLCAweDQxLCAweDIwLCAweEZFLAorCSAweENELCAweDgxLCAweDYwLCAweDQwLCAweDgwLCAweDJBLCAweDM5LCAweDAwLCAweDdGLCAweEI0LCAweDAyLCAweDNBLCAweDAyLCAweDAwLCAweDAxLCAweDY0LAorCSAweDJFLCAweDAwLCAweDA0LCAweDNBLCAweDAyLCAweDAwLCAweDAyLCAweDY0LCAweDJBLCAweDAwLCAweDBCLCAweDNBLCAweDAyLCAweDAwLCAweDA0LCAweDY0LAorCSAweDI2LCAweDAwLCAweDE2LCAweDNBLCAweDAyLCAweDAwLCAweDA4LCAweDY0LCAweDIyLCAweDAwLCAweDBDLCAweDNBLCAweDAyLCAweDAwLCAweDEwLCAweDY0LAorCSAweDFFLCAweDAwLCAweDEyLCAweDNBLCAweDAyLCAweDAwLCAweDIwLCAweDY0LCAweDFBLCAweDAwLCAweDE4LCAweDNBLCAweDAyLCAweDAwLCAweDQwLCAweDY0LAorCSAweDE2LCAweDAwLCAweDI0LCAweDNBLCAweDAyLCAweDAwLCAweDgwLCAweDY0LCAweDEyLCAweDAwLCAweDMwLCAweDNBLCAweDAyLCAweDAwLCAweDAxLCAweDY3LAorCSAweDBFLCAweDAwLCAweDQ4LCAweDNBLCAweDAyLCAweDAwLCAweDAyLCAweDY3LCAweDBBLCAweDAwLCAweDYwLCAweDNBLCAweDAyLCAweDAwLCAweDA0LCAweDY3LAorCSAweDA2LCAweDAwLCAweDZDLCAweDNBLCAweDAyLCAweDAwLCAweDA4LCAweDY3LCAweDAyLCAweDAwLCAweDAwLCAweDY0LCAweDAwLCAweDAwLCAweDE5LCAweDYwLAorCSAweDNCLCAweEYxLCAweEZGLCAweEZGLCAweEIwLCAweDg0LCAweDE5LCAweDYwLCAweDNCLCAweEZCLCAweDYxLCAweDQwLCAweDAwLCAweDM2LCAweDA1LCAweDAwLAorCSAweDYwLCAweEZFLCAweEJELCAweEQzLCAweEZGLCAweEZGLCAweDIwLCAweEZFLCAweEJCLCAweDAxLCAweDY1LCAweDQwLCAweDAwLCAweDNBLCAweDFFLCAweDAwLAorCSAweDI2LCAweDQ2LCAweDNGLCAweEYyLCAweDAwLCAweEY0LCAweDYwLCAweDQzLCAweEY0LCAweEEzLCAweDAwLCAweDYwLCAweDFELCAweDYxLCAweDAwLCAweDYwLAorCSAweDMyLCAweDY1LCAweDAxLCAweDYwLCAweEZGLCAweDY0LCAweDQwLCAweDRDLCAweEZELCAweDYwLCAweDU4LCAweDRFLCAweDdBLCAweDc4LCAweEZGLCAweEZGLAorCSAweDAwLCAweEJCLCAweEZGLCAweEZGLCAweDBCLCAweDAzLCAweDYwLCAweEZFLCAweDAyLCAweDYwLCAweDAwLCAweDYzLCAweEJELCAweEQzLCAweEJELCAweEQzLAorCSAweDYwLCAweDQxLCAweEZFLCAweDYwLCAweDU4LCAweDRFLCAweDJDLCAweDc4LCAweEZGLCAweEZGLCAweDkxLCAweDAxLCAweDIwLCAweEZFLCAweDAwLCAweDY1LAorCSAweEZDLCAweDYwLCAweDU4LCAweDRFLCAweEM3LCAweDc4LCAweEZGLCAweEZGLCAweEExLCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDI3LAorCSAweDA0LCAweDAwLCAweEZELCAweDYwLCAweDU4LCAweDRFLCAweDExLCAweDc4LCAweEZGLCAweEZGLCAweDIwLCAweEZFLCAweDM3LCAweDYwLCAweEY4LCAweDYxLAorCSAweEExLCAweEQxLCAweEExLCAweEYzLCAweDAxLCAweDYwLCAweEFDLCAweDYzLCAweDYwLCAweDQ1LCAweDJBLCAweDQ0LCAweDc5LCAweEZCLCAweEEzLCAweEQ1LAorCSAweDY1LCAweDQwLCAweDAxLCAweDI3LCAweDVCLCAweEQ1LCAweDY1LCAweDQwLCAweDAxLCAweDI3LCAweDU5LCAweEQxLCAweDY2LCAweDQxLCAweEEwLCAweDg0LAorCSAweDI0LCAweDk0LCAweDJCLCAweDQ2LCAweDBGLCAweEZBLCAweDdBLCAweEZCLCAweDE2LCAweDY0LCAweDEyLCAweEZBLCAweDAxLCAweDY0LCAweDExLCAweEZBLAorCSAweDY2LCAweDVDLCAweEMyLCAweDYwLCAweDU4LCAweDRFLCAweDZELCAweDc4LCAweEZGLCAweEZGLCAweDdELCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLAorCSAweDAxLCAweDI3LCAweDI4LCAweDAwLCAweDE5LCAweDYwLCAweDQ0LCAweEYzLCAweDMyLCAweDYwLCAweDg4LCAweDYzLCAweEEzLCAweEQzLCAweEZGLCAweEZGLAorCSAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDBDLCAweDAwLCAweDBGLCAweDY0LCAweEZDLCAweDYwLCAweDU4LCAweDRFLCAweDM0LCAweDc4LCAweEZGLCAweEZGLAorCSAweEZGLCAweDYwLCAweEZGLCAweDYzLCAweDFBLCAweDYwLCAweEIzLCAweEZELCAweDFBLCAweDYwLCAweEMzLCAweEZELCAweDFDLCAweDAwLCAweDE5LCAweDYwLAorCSAweDM5LCAweEYzLCAweDNGLCAweDQwLCAweDAxLCAweDI3LCAweDA4LCAweDAwLCAweDBGLCAweDYwLCAweEZGLCAweDY1LCAweEE0LCAweDg0LCAweEZDLCAweDYwLAorCSAweDU4LCAweDRFLCAweDM0LCAweDc4LCAweEZGLCAweEZGLCAweDBGLCAweDAwLCAweDBGLCAweEI0LCAweEZDLCAweDYwLCAweDU4LCAweDRFLCAweDM0LCAweDc4LAorCSAweEZGLCAweEZGLCAweDA5LCAweDAwLCAweDE5LCAweDYwLCAweDNBLCAweEYzLCAweDBGLCAweDYwLCAweEZGLCAweDY1LCAweEE0LCAweDg0LCAweEZDLCAweDYwLAorCSAweDU4LCAweDRFLCAweDM0LCAweDc4LCAweEZGLCAweEZGLCAweEQzLCAweDYwLCAweDU4LCAweDRFLCAweDc4LCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LAorCSAweDIzLCAweDQzLCAweDMyLCAweDQwLCAweDA4LCAweDJBLCAweDA1LCAweDAwLCAweDYzLCAweDQ2LCAweDgwLCAweDYwLCAweDAyLCAweDY0LCAweDA2LCAweEZBLAorCSAweDI2LCAweDQ2LCAweDJDLCAweDYwLCAweEU0LCAweDY0LCAweEYxLCAweDYwLCAweDc4LCAweDQxLCAweEU0LCAweDc4LCAweEI1LCAweEYxLCAweDI3LCAweEYyLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDNCLCAweDA3LCAweDAwLCAweDJDLCAweDYwLCAweEYyLCAweDY0LCAweEYxLCAweDYwLCAweDc4LCAweDQxLAorCSAweEU0LCAweDc4LCAweEI1LCAweEYxLCAweDA4LCAweDAwLCAweDAyLCAweDNCLCAweDA2LCAweDAwLCAweDJDLCAweDYwLCAweEY0LCAweDY0LCAweEYxLCAweDYwLAorCSAweDc4LCAweDQxLCAweEU0LCAweDc4LCAweEI1LCAweEYxLCAweDFCLCAweEYyLCAweEZGLCAweEZGLCAweEU0LCAweEE0LCAweDNFLCAweEZBLCAweDJBLCAweEYyLAorCSAweDI4LCAweDQxLCAweDQwLCAweEE4LCAweDAxLCAweEIxLCAweDAyLCAweDAyLCAweDQ2LCAweDAyLCAweDc2LCAweDAwLCAweDYwLCAweDQwLCAweDA4LCAweDJBLAorCSAweDBGLCAweDAwLCAweDJDLCAweDYwLCAweEUyLCAweDY0LCAweEYxLCAweDYwLCAweDc4LCAweDQxLCAweEU0LCAweDc4LCAweEI1LCAweEYxLCAweDFCLCAweEYyLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQ1LCAweDJDLCAweDYwLCAweEU4LCAweDY0LCAweEYxLCAweDYwLCAweDc4LCAweDQxLCAweEYwLCAweDc4LCAweEI1LCAweEYxLAorCSAweDBGLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDQwLCAweDI2LCAweDI4LCAweDAwLCAweDMyLCAweDQ0LCAweDAyLCAweDI2LCAweDI1LCAweDAwLAorCSAweDEwLCAweDJCLCAweDI5LCAweDAwLCAweDJFLCAweDYwLCAweDQwLCAweDYzLCAweEJGLCAweEQzLCAweDJDLCAweEYwLCAweDAwLCAweEE4LCAweDYwLCAweDQxLAorCSAweDBELCAweDAzLCAweDUwLCAweEZFLCAweEJELCAweEQzLCAweDJELCAweEYwLCAweEQwLCAweDgwLCAweEJELCAweEQzLCAweDJFLCAweEYwLCAweEQwLCAweDgwLAorCSAweEJELCAweEQzLCAweDJDLCAweEYwLCAweEQwLCAweDgwLCAweEZBLCAweEExLCAweDEwLCAweDBDLCAweEYzLCAweDAyLCAweDUwLCAweEZFLCAweDYwLCAweDYwLAorCSAweDAxLCAweDY0LCAweEQwLCAweDgwLCAweDJELCAweEYwLCAweDFELCAweDY0LCAweEQwLCAweDgwLCAweDJFLCAweEYwLCAweDAxLCAweDY0LCAweEQwLCAweDgwLAorCSAweEZGLCAweEZGLCAweDAzLCAweDBDLCAweEQwLCAweDYwLCAweEI1LCAweDc4LCAweEZGLCAweEZGLCAweDMyLCAweDQwLCAweDQwLCAweDJBLCAweDAzLCAweDAwLAorCSAweDFDLCAweDYwLCAweDEyLCAweDc4LCAweEZGLCAweEZGLCAweEQwLCAweDYwLCAweDZCLCAweDc4LCAweEZGLCAweEZGLCAweDMyLCAweDQwLCAweDQwLCAweDI2LAorCSAweEY3LCAweDAxLCAweDJBLCAweEYwLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDA4LCAweDJBLCAweDJBLCAweDAwLCAweERCLCAweEYzLCAweEZGLCAweEZGLAorCSAweDA3LCAweEI0LCAweDAzLCAweEE4LCAweEZGLCAweEZGLCAweDAzLCAweDAzLCAweDMyLCAweDQwLCAweDAyLCAweDJBLCAweDFELCAweDAwLCAweDAzLCAweDY3LAorCSAweEEwLCAweDg0LCAweDAwLCAweDM3LCAweDY0LCAweDYzLCAweDYwLCAweDQwLCAweDAyLCAweDM3LCAweDVFLCAweDYzLCAweDYwLCAweDQwLCAweDAxLCAweDM3LAorCSAweDU4LCAweDYzLCAweDYwLCAweDQwLCAweDAzLCAweDM3LCAweDBELCAweDAwLCAweEJELCAweEQyLCAweDdGLCAweEYxLCAweEJELCAweEQyLCAweEQwLCAweDgwLAorCSAweDgwLCAweEYxLCAweDA3LCAweDAyLCAweEQwLCAweDgwLCAweEJELCAweEQyLCAweDgxLCAweEYxLCAweDAzLCAweDAyLCAweEQwLCAweDgwLCAweEZGLCAweEZGLAorCSAweDAzLCAweDAzLCAweEQwLCAweDYwLCAweEI1LCAweDc4LCAweEZGLCAweEZGLCAweEU5LCAweDYwLCAweDU4LCAweDRGLCAweDA4LCAweDc4LCAweEZGLCAweEZGLAorCSAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDA4LCAweDI2LCAweDA2LCAweDAwLCAweDIwLCAweDQwLCAweDEwLCAweDJCLCAweDAzLCAweDAwLAorCSAweEQwLCAweDYwLCAweDZCLCAweDc4LCAweEZGLCAweEZGLCAweDg3LCAweEY0LCAweEE2LCAweEYxLCAweDI3LCAweDFCLCAweDMxLCAweEYyLCAweDFELCAweDYwLAorCSAweEMwLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDY2LCAweDQxLCAweDYwLCAweDQ2LCAweDYwLCAweDQzLAorCSAweDA1LCAweEYyLCAweDE2LCAweDE4LCAweDYxLCAweDQ2LCAweDMxLCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDA0LCAweEYyLCAweDBDLCAweDAyLAorCSAweDYxLCAweDQ2LCAweDMwLCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDAzLCAweEYyLCAweDA2LCAweDAyLCAweDYxLCAweDQ2LCAweDJGLCAweEYwLAorCSAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDgwLCAweEY0LCAweEZGLCAweEZGLCAweDYzLCAweDQ2LCAweEU4LCAweDFCLAorCSAweEE2LCAweEYzLCAweDA4LCAweEZFLCAweDYwLCAweDQzLCAweDYxLCAweDQ2LCAweDAzLCAweDAwLCAweEQzLCAweDgwLCAweEZGLCAweEZGLCAweEQ2LCAweDAzLAorCSAweDQzLCAweDQzLCAweERCLCAweEYzLCAweDMyLCAweDQwLCAweDAyLCAweDI2LCAweDA0LCAweDAwLCAweDA3LCAweEI0LCAweDAzLCAweEE4LCAweDJBLCAweEYyLAorCSAweDQ1LCAweDAyLCAweEE2LCAweEYxLCAweDIzLCAweDQzLCAweEQzLCAweDgwLCAweEZGLCAweEZGLCAweDQwLCAweDAyLCAweEQwLCAweDYwLCAweDU4LCAweDRGLAorCSAweEZDLCAweDc4LCAweEZGLCAweEZGLCAweDMyLCAweDQwLCAweDAyLCAweDJBLCAweDA1LCAweDAwLCAweDYzLCAweDQ2LCAweDAyLCAweDY0LCAweDA2LCAweEZBLAorCSAweDI2LCAweDQ2LCAweDM0LCAweDAwLCAweDMyLCAweDQwLCAweDA4LCAweDJBLCAweDA1LCAweDAwLCAweDYzLCAweDQ2LCAweDgwLCAweDYwLCAweDAyLCAweDY0LAorCSAweDA2LCAweEZBLCAweDI2LCAweDQ2LCAweDQzLCAweDQzLCAweDdELCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDA5LCAweDAwLAorCSAweDE5LCAweDYwLCAweDQ0LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDAzLCAweDAwLCAweDIzLCAweDQ2LCAweDBGLCAweDY0LAorCSAweDEwLCAweDAwLCAweDM3LCAweDYwLCAweEY4LCAweDYxLCAweEExLCAweEQxLCAweEExLCAweEYzLCAweDAxLCAweDYwLCAweEFDLCAweDYzLCAweDYwLCAweDQ1LAorCSAweEEzLCAweEQzLCAweDY1LCAweDQwLCAweDAxLCAweDI3LCAweDVCLCAweEQzLCAweDY1LCAweDQwLCAweDAxLCAweDI3LCAweDU5LCAweEQxLCAweDIzLCAweDQ2LAorCSAweEEwLCAweDg0LCAweDBGLCAweEZBLCAweDdBLCAweEZCLCAweDc5LCAweEZCLCAweDE2LCAweDY0LCAweDEyLCAweEZBLCAweDAxLCAweDY0LCAweDExLCAweEZBLAorCSAweDY2LCAweDVDLCAweEMyLCAweDYwLCAweDU4LCAweDRFLCAweDZELCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDA3LCAweEZDLCAweDQzLCAweDQzLAorCSAweDJBLCAweEYyLCAweDYzLCAweDQ1LCAweDBDLCAweEI0LCAweDA4LCAweDNBLCAweDBBLCAweDAwLCAweERCLCAweEYzLCAweDIzLCAweDQ2LCAweDA3LCAweEI0LAorCSAweEZELCAweEEwLCAweDA2LCAweEYyLCAweDI2LCAweDQ2LCAweDAzLCAweDAzLCAweDYwLCAweDQwLCAweDAyLCAweDJBLCAweDBELCAweDAwLCAweDJBLCAweEYyLAorCSAweDM1LCAweEYwLCAweDYwLCAweDQwLCAweEE0LCAweDM2LCAweDBCLCAweDAwLCAweDA4LCAweDJCLCAweDBDLCAweDAwLCAweDIzLCAweDQ2LCAweDI2LCAweEYyLAorCSAweDI2LCAweDQ2LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA2LCAweDAyLCAweEQwLCAweDYwLCAweEI1LCAweDc4LCAweEZGLCAweEZGLCAweEQwLCAweDYwLAorCSAweDZCLCAweDc4LCAweEZGLCAweEZGLCAweDIzLCAweDQ2LCAweDIyLCAweEYyLCAweDI2LCAweDQ2LCAweDQ0LCAweDRDLCAweDBGLCAweDI2LCAweDFELCAweDAwLAorCSAweDAwLCAweEJDLCAweDQwLCAweDQ1LCAweDBCLCAweDAzLCAweDAwLCAweDY0LCAweDIzLCAweDQ2LCAweDIyLCAweEZBLCAweDI2LCAweDQ2LCAweEEyLCAweEZGLAorCSAweEI2LCAweDYwLCAweDU4LCAweDRFLCAweEY1LCAweDc4LCAweEZGLCAweEZGLCAweEEzLCAweEZGLCAweDI2LCAweDQ2LCAweDJBLCAweEYwLCAweDJDLCAweDQ0LAorCSAweDY0LCAweDQwLCAweDA0LCAweDI3LCAweDBBLCAweDAwLCAweDIzLCAweDQ2LCAweDI2LCAweEZBLCAweDI2LCAweDQ2LCAweDFCLCAweEYyLCAweEZGLCAweEZGLAorCSAweEU0LCAweEE0LCAweDNFLCAweEZBLCAweEQwLCAweDYwLCAweDIyLCAweDc4LCAweEZGLCAweEZGLCAweDNGLCAweEYyLCAweDAyLCAweEZBLCAweEEyLCAweEZGLAorCSAweDE2LCAweEYwLCAweEZGLCAweEZGLCAweDY0LCAweDQ0LCAweDAxLCAweDI2LCAweERDLCAweDlDLCAweEIwLCAweEYzLCAweDJBLCAweEYyLCAweERDLCAweDgzLAorCSAweEIwLCAweEZELCAweDA2LCAweEY0LCAweDAxLCAweEY4LCAweDI2LCAweDQ2LCAweDYwLCAweDQwLCAweDQwLCAweDJCLCAweDE4LCAweDAwLCAweDY0LCAweDQ0LAorCSAweDAwLCAweDY1LCAweEZGLCAweEI0LCAweEZDLCAweEE0LCAweDA2LCAweEYwLCAweDAzLCAweDAzLCAweDY0LCAweDQ2LCAweDBDLCAweDBELCAweDAyLCAweDY1LAorCSAweDI2LCAweDQ2LCAweDAwLCAweEYyLCAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDAyLCAweDAzLCAweDYwLCAweDQ2LCAweEY5LCAweDAxLAorCSAweDAxLCAweEYyLCAweEZGLCAweEZGLCAweEQ0LCAweDg0LCAweDAxLCAweEZBLCAweDY2LCAweDQ0LCAweDI2LCAweDQ2LCAweDA2LCAweEZBLCAweDA2LCAweEY0LAorCSAweDAwLCAweEYyLCAweDgwLCAweEZDLCAweDQwLCAweDQ1LCAweEI2LCAweDYwLCAweDU4LCAweDRFLCAweEY1LCAweDc4LCAweEZGLCAweEZGLCAweEEzLCAweEZGLAorCSAweDI2LCAweDQ2LCAweDJDLCAweDQ0LCAweDBGLCAweDI2LCAweDEzLCAweDAwLCAweDIzLCAweDQ2LCAweDI2LCAweEZBLCAweDI2LCAweDQ0LCAweDIyLCAweEZBLAorCSAweDI2LCAweDQ2LCAweDFCLCAweEYyLCAweEZGLCAweEZGLCAweEU0LCAweEE0LCAweDNFLCAweEZBLCAweDAwLCAweDY0LCAweDEzLCAweDYwLCAweDBELCAweEZCLAorCSAweDI2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDZFLCAweDAwLCAweEEzLCAweDQ2LAorCSAweDI2LCAweEYyLCAweDYwLCAweDQ1LCAweERDLCAweDg0LCAweEQ0LCAweDgwLCAweDI2LCAweEZBLCAweEEzLCAweDQ2LCAweDZCLCAweDAyLCAweDJBLCAweEYwLAorCSAweEEzLCAweDQ2LCAweDIyLCAweEYyLCAweEEzLCAweDQ2LCAweDAwLCAweEJDLCAweDAwLCAweEYyLCAweDAxLCAweDAyLCAweDYzLCAweDAwLCAweDQ0LCAweDRDLAorCSAweDNGLCAweEYwLCAweDYwLCAweDQzLCAweDIzLCAweDQ2LCAweDIyLCAweEY0LCAweDA5LCAweDYwLCAweDAwLCAweDY1LCAweDNGLCAweEYyLCAweDI2LCAweDQ2LAorCSAweEMwLCAweDg0LCAweEQ0LCAweDgwLCAweDYwLCAweDQ1LCAweDU2LCAweDA3LCAweDgwLCAweEZDLCAweDFCLCAweEYyLCAweDA2LCAweEYyLCAweDYwLCAweDQxLAorCSAweDIzLCAweDQ2LCAweDIyLCAweEY0LCAweDFCLCAweEYwLCAweDA2LCAweEYwLCAweEMxLCAweDgxLCAweDA2LCAweEZBLCAweDA1LCAweEZBLCAweDlCLCAweEZBLAorCSAweDY1LCAweDQ0LCAweDNGLCAweEZBLCAweDY0LCAweDQ2LCAweDAwLCAweEZDLCAweDYzLCAweDQ2LCAweDAxLCAweEYyLCAweDEwLCAweDYxLCAweEYyLCAweEE0LAorCSAweDAxLCAweEZBLCAweEM4LCAweDgzLCAweDAyLCAweDY0LCAweDU5LCAweEQwLCAweDU4LCAweEQ4LCAweEZELCAweDFGLCAweDA2LCAweDQ1LCAweDAwLCAweDY0LAorCSAweDEzLCAweDYwLCAweDBELCAweEZCLCAweDI1LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLAorCSAweEEyLCAweEZGLCAweDAwLCAweEY0LCAweDAxLCAweEYwLCAweDBBLCAweDE4LCAweDcwLCAweDY3LCAweEEwLCAweDgwLCAweEYwLCAweDY3LCAweDA2LCAweDAzLAorCSAweEMwLCAweDg0LCAweDAxLCAweEZBLCAweDI1LCAweDQ2LCAweDI1LCAweDQ0LCAweDgwLCAweEZDLCAweDA1LCAweEZBLCAweEI2LCAweDYwLCAweDU4LCAweDRFLAorCSAweEY1LCAweDc4LCAweEZGLCAweEZGLCAweEQ0LCAweEZFLCAweEEzLCAweEZGLCAweDJDLCAweDQ0LCAweDA0LCAweDI3LCAweDE2LCAweDAwLCAweDIzLCAweDQ2LAorCSAweDIyLCAweEYyLCAweEEyLCAweEZDLCAweDYwLCAweDQ2LCAweDQ2LCAweDQ2LCAweDNGLCAweEYyLCAweDAwLCAweEY0LCAweDYwLCAweDQ3LCAweDA4LCAweEZBLAorCSAweDI2LCAweDQ2LCAweDJDLCAweDQzLCAweDJBLCAweEZDLCAweDA2LCAweEY0LCAweDAwLCAweDY0LCAweDAwLCAweEZBLCAweDAxLCAweEYwLCAweDgwLCAweDYwLAorCSAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweDAxLCAweEZBLCAweDI2LCAweDQ2LCAweDFELCAweDAwLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweENBLCAweDYwLAorCSAweEQ4LCAweDc4LCAweEZGLCAweEZGLCAweEEzLCAweDQ2LCAweDIyLCAweEYwLCAweEEyLCAweEZDLCAweDAwLCAweDYzLCAweDMzLCAweDg1LCAweEEzLCAweDQ2LAorCSAweDBELCAweDAzLCAweEEzLCAweDQ2LCAweDI2LCAweEYyLCAweDBGLCAweDY1LCAweEE0LCAweDg1LCAweEQ0LCAweDg0LCAweDI2LCAweEZBLCAweEEzLCAweDQ2LAorCSAweEEyLCAweEZGLCAweEI2LCAweDYwLCAweDU4LCAweDRFLCAweEY1LCAweDc4LCAweEZGLCAweEZGLCAweEEzLCAweEZGLCAweDI2LCAweDQ2LCAweEQwLCAweDYwLAorCSAweEI1LCAweDc4LCAweEZGLCAweEZGLCAweDJBLCAweEYyLCAweDMyLCAweEYwLCAweDYwLCAweDQwLCAweDA4LCAweDJBLCAweDI0LCAweDAwLCAweDAxLCAweDJCLAorCSAweDEzLCAweDAwLCAweDY0LCAweDQwLCAweDAxLCAweDJBLCAweDEwLCAweDAwLCAweDJDLCAweDYwLCAweEUyLCAweDY0LCAweEYxLCAweDYwLCAweDc4LCAweDQxLAorCSAweEU0LCAweDc4LCAweEI1LCAweEYxLCAweDFCLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQ1LCAweDJDLCAweDYwLCAweEU4LCAweDY0LCAweEYxLCAweDYwLAorCSAweDc4LCAweDQxLCAweEYwLCAweDc4LCAweEI1LCAweEYxLCAweDBGLCAweDAwLCAweDJDLCAweDYwLCAweEUwLCAweDY0LCAweEYxLCAweDYwLCAweDc4LCAweDQxLAorCSAweEU0LCAweDc4LCAweEI1LCAweEYxLCAweDFCLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQ1LCAweDJDLCAweDYwLCAweEU2LCAweDY0LCAweEYxLCAweDYwLAorCSAweDc4LCAweDQxLCAweEYwLCAweDc4LCAweEI1LCAweEYxLCAweDA3LCAweEY0LCAweEZGLCAweEZGLCAweDI2LCAweEYyLCAweDI2LCAweDQ2LCAweDBGLCAweEI0LAorCSAweERDLCAweDg1LCAweDJDLCAweDYwLCAweEU0LCAweDY0LCAweEYxLCAweDYwLCAweDc4LCAweDQxLCAweEYwLCAweDc4LCAweEI1LCAweEYxLCAweDI3LCAweEYyLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDNCLCAweDA3LCAweDAwLCAweDJDLCAweDYwLCAweEYyLCAweDY0LCAweEYxLCAweDYwLCAweDc4LCAweDQxLAorCSAweEU0LCAweDc4LCAweEI1LCAweEYxLCAweDA4LCAweDAwLCAweDAyLCAweDNCLCAweDA2LCAweDAwLCAweDJDLCAweDYwLCAweEY0LCAweDY0LCAweEYxLCAweDYwLAorCSAweDc4LCAweDQxLCAweEU0LCAweDc4LCAweEI1LCAweEYxLCAweDA3LCAweEYyLCAweDI2LCAweEYwLCAweDQxLCAweDE4LCAweDYwLCAweDQ2LCAweEZGLCAweDY3LAorCSAweDIwLCAweDg4LCAweDY0LCAweDVGLCAweDQwLCAweDRBLCAweDE1LCAweEYwLCAweDI4LCAweDQ0LCAweEQwLCAweDg0LCAweDAzLCAweEE0LCAweDAzLCAweDBFLAorCSAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDA0LCAweDAwLCAweEZBLCAweEE0LCAweEU4LCAweDg0LCAweEU4LCAweDg3LCAweEMwLCAweEJGLCAweEMwLCAweDg0LAorCSAweDE1LCAweEZBLCAweDQwLCAweDQ4LCAweDE0LCAweEYwLCAweDJBLCAweDQ0LCAweEQwLCAweDg0LCAweDFGLCAweEE0LCAweDA2LCAweDBFLCAweEU4LCAweDg0LAorCSAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDA3LCAweDAwLCAweEMyLCAweEE0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LAorCSAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg3LCAweEY4LCAweEJGLCAweEMwLCAweDg0LCAweDE0LCAweEZBLCAweDMzLCAweDYwLCAweDRDLCAweDYzLAorCSAweEJELCAweERCLCAweDYwLCAweDVDLCAweDJGLCAweDY3LCAweEQwLCAweDgwLCAweDYwLCAweDQ1LCAweDAyLCAweDI4LCAweDY0LCAweDQ1LCAweDI4LCAweDVDLAorCSAweEJELCAweEQ5LCAweDhCLCAweDY3LCAweEQwLCAweDgwLCAweDYwLCAweDQxLCAweDAyLCAweDI0LCAweDY0LCAweDQxLCAweEQ1LCAweDg0LCAweDgwLCAweDY1LAorCSAweEM0LCAweDg3LCAweDAxLCAweDA1LCAweDAwLCAweDY0LCAweEZGLCAweEI0LCAweDBFLCAweEZBLCAweEEzLCAweERCLCAweDI2LCAweDQ2LCAweEQxLCAweDYwLAorCSAweERCLCAweDc4LCAweEZGLCAweEZGLCAweENBLCAweDYwLCAweEQ4LCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDYwLCAweDFBLCAweDY0LCAweDQwLCAweDRCLAorCSAweDM0LCAweDYwLCAweDU4LCAweDRELCAweDA4LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweENBLCAweDYwLCAweEQ4LCAweDc4LAorCSAweEZGLCAweEZGLCAweDI1LCAweDYwLCAweEZFLCAweDY0LCAweDEzLCAweDYwLCAweDBELCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LAorCSAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEY4LCAweEZFLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweENBLCAweDYwLCAweEQ4LCAweDc4LAorCSAweEZGLCAweEZGLCAweDJBLCAweEYyLCAweDU4LCAweDYzLCAweDYwLCAweDQ3LCAweDAxLCAweDI3LCAweDY0LCAweDYzLCAweDYxLCAweDVDLCAweDFCLCAweDYwLAorCSAweEZCLCAweEY5LCAweEJELCAweEQwLCAweEJELCAweEQwLCAweDY0LCAweDQ1LCAweDY0LCAweDQxLCAweEJELCAweEQwLCAweDAwLCAweEY0LCAweDA0LCAweEY4LAorCSAweDgzLCAweEZBLCAweDgyLCAweEY4LCAweEE2LCAweDQ2LCAweDAyLCAweEIwLCAweDVFLCAweDYzLCAweDA0LCAweDAzLCAweDY0LCAweDYzLCAweDAzLCAweEIwLAorCSAweDAyLCAweDNBLCAweDZDLCAweDYzLCAweDNGLCAweEYyLCAweEJELCAweEQwLCAweEJELCAweEQwLCAweDY0LCAweDQ1LCAweDY0LCAweDQxLCAweEJELCAweEQwLAorCSAweEE2LCAweDQ2LCAweDA3LCAweEY4LCAweDg2LCAweEZBLCAweDg1LCAweEY4LCAweDYwLCAweDQ3LCAweDA4LCAweEZBLCAweDFCLCAweDYwLCAweEZCLCAweEYxLAorCSAweDI2LCAweDQ2LCAweDY0LCAweDQxLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEE2LCAweEY1LCAweDAwLCAweEYyLCAweDI2LCAweDQ2LCAweDMxLCAweEYwLAorCSAweDM5LCAweDE4LCAweDY2LCAweDQxLCAweDFELCAweDYwLCAweEMwLCAweDY1LCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEE2LCAweEYxLCAweEUwLCAweDg0LAorCSAweDQ0LCAweEQzLCAweDY0LCAweDQzLCAweDExLCAweDE4LCAweDYwLCAweDQ2LCAweDAwLCAweEYyLCAweEZGLCAweEZGLCAweEZDLCAweDFCLCAweDY2LCAweDQ0LAorCSAweDY0LCAweDQ2LCAweDgwLCAweEYwLCAweDYwLCAweDQ2LCAweDgwLCAweEY4LCAweDY1LCAweDQ2LCAweDY1LCAweDQzLCAweDgwLCAweEYwLCAweDAxLCAweEZBLAorCSAweDgwLCAweEZDLCAweDY0LCAweDQ2LCAweDgwLCAweEY4LCAweDBCLCAweDAwLCAweDY0LCAweDQ2LCAweDYyLCAweDQzLCAweDAwLCAweEYyLCAweEEzLCAweERCLAorCSAweDYwLCAweDQ2LCAweDgwLCAweEYwLCAweDgxLCAweEZDLCAweDgwLCAweEZDLCAweDY0LCAweDQ2LCAweDgwLCAweEY4LCAweDYwLCAweDQzLCAweDYxLCAweDQ2LAorCSAweDFGLCAweDYwLCAweEMyLCAweDYxLCAweEExLCAweEQzLCAweDIwLCAweDYwLCAweDA0LCAweDdDLCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA3LCAweDAzLAorCSAweEEwLCAweERELCAweERBLCAweDlDLCAweEExLCAweEQ5LCAweDQ5LCAweEQzLCAweEZGLCAweEZGLCAweERDLCAweDg0LCAweEExLCAweERCLCAweEQxLCAweDYwLAorCSAweDk3LCAweDc4LCAweEZGLCAweEZGLCAweDIwLCAweDdDLCAweDcyLCAweDQ0LCAweEZGLCAweEI0LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDAyLCAweDA0LAorCSAweEQwLCAweDg0LCAweEZCLCAweDAxLCAweEUwLCAweDgzLCAweEE2LCAweEYzLCAweDAyLCAweEEzLCAweDQzLCAweDkzLCAweEE2LCAweEYzLCAweEZGLCAweEZGLAorCSAweDAyLCAweEE1LCAweEQ3LCAweDgwLCAweDA0LCAweEE1LCAweDA4LCAweDI0LCAweDY1LCAweDQzLCAweDY2LCAweDQxLCAweDYzLCAweDQ2LCAweDA1LCAweEYyLAorCSAweDAwLCAweEYwLCAweDgxLCAweEYwLCAweDAyLCAweDE4LCAweDY0LCAweDQ2LCAweDgxLCAweEY4LCAweDA3LCAweDFCLCAweDFELCAweDYwLCAweEMwLCAweDY1LAorCSAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQ5LCAweDAyLCAweDAwLCAweDY1LCAweDQ2LCAweDAwLCAweEY4LCAweEE2LCAweEYzLAorCSAweDYzLCAweDQ1LCAweDYwLCAweDQ2LCAweDAwLCAweEYyLCAweEZGLCAweEZGLCAweEQ0LCAweDgwLCAweDAxLCAweDE4LCAweEZBLCAweDA0LCAweDgwLCAweEY4LAorCSAweDY1LCAweDQ2LCAweDAwLCAweEZBLCAweDA2LCAweEYyLCAweEZGLCAweEZGLCAweDAwLCAweDdFLCAweDA2LCAweEZBLCAweDYxLCAweDQ2LCAweDMxLCAweEYwLAorCSAweDY2LCAweDQxLCAweDFELCAweDYwLCAweEMwLCAweDY1LCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEE2LCAweEYxLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLAorCSAweDY0LCAweDQzLCAweDExLCAweDE4LCAweDYwLCAweDQ2LCAweDAwLCAweEYyLCAweEZGLCAweEZGLCAweEZDLCAweDFCLCAweDY2LCAweDQ0LCAweDY0LCAweDQ2LAorCSAweDgwLCAweEYwLCAweDYwLCAweDQ2LCAweDgwLCAweEY4LCAweDY1LCAweDQ2LCAweDY1LCAweDQzLCAweDgwLCAweEYwLCAweDAxLCAweEZBLCAweDgwLCAweEZDLAorCSAweDY0LCAweDQ2LCAweDgwLCAweEY4LCAweDBCLCAweDAwLCAweDY0LCAweDQ2LCAweDYyLCAweDQzLCAweDAwLCAweEYyLCAweEEzLCAweERCLCAweDYwLCAweDQ2LAorCSAweDgwLCAweEYwLCAweDgxLCAweEZDLCAweDgwLCAweEZDLCAweDY0LCAweDQ2LCAweDgwLCAweEY4LCAweDYwLCAweDQzLCAweDYxLCAweDQ2LCAweDJGLCAweEYyLAorCSAweDMwLCAweEYwLCAweDMxLCAweEYwLCAweDY0LCAweDQ1LCAweDQ2LCAweDQzLCAweDYzLCAweDQ2LCAweDAzLCAweEZBLCAweDA2LCAweEYyLCAweDg0LCAweEY4LAorCSAweDAwLCAweDdFLCAweDA2LCAweEZBLCAweDA1LCAweEY4LCAweEEzLCAweDQ2LCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweERCLCAweEYzLCAweDJBLCAweEYyLAorCSAweDA3LCAweEIwLCAweDAzLCAweDNBLCAweDJBLCAweDAwLCAweDAwLCAweEY0LCAweDA5LCAweEYyLCAweDYwLCAweDQ1LCAweDgwLCAweDNBLCAweDA1LCAweDAwLAorCSAweDBFLCAweEYyLCAweEZGLCAweEZGLCAweDAyLCAweEIwLCAweDBGLCAweEYyLCAweDIwLCAweDAzLCAweDYwLCAweDQ3LCAweDAwLCAweDNBLCAweDFELCAweDAwLAorCSAweDYwLCAweDQxLCAweDAwLCAweDM2LCAweDEzLCAweDAwLCAweERBLCAweDg1LCAweDMzLCAweDYwLCAweEJFLCAweDYzLCAweEJELCAweEQxLCAweEZGLCAweEZGLAorCSAweEQxLCAweDgwLCAweEZGLCAweEZGLCAweDEyLCAweDAyLCAweDYwLCAweEZFLCAweEJELCAweEQzLCAweEE1LCAweEQwLCAweERFLCAweDg1LCAweEQwLCAweDgwLAorCSAweENELCAweDgxLCAweDBCLCAweDAyLCAweEY5LCAweDAyLCAweDIwLCAweEZFLCAweDAwLCAweDY0LCAweDA5LCAweDAwLCAweDI2LCAweDQ2LCAweDQ4LCAweEZFLAorCSAweDY1LCAweDQwLCAweDQwLCAweDNBLCAweDAyLCAweDAwLCAweDAxLCAweDY0LCAweDAyLCAweDAwLCAweDI4LCAweEZFLCAweDAwLCAweDY0LCAweDQwLCAweDQ4LAorCSAweDI2LCAweDQ2LCAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweEEzLCAweEYzLCAweDNELCAweEYyLCAweDYwLCAweDQwLCAweDAxLCAweDI2LAorCSAweDJBLCAweEZBLCAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDA4LCAweDI2LCAweDAzLCAweDAwLCAweEQyLCAweDYwLCAweEI1LCAweDc4LAorCSAweEZGLCAweEZGLCAweDNGLCAweEYwLCAweDMyLCAweDQwLCAweDEwLCAweDJBLCAweDBFLCAweDAwLCAweDJDLCAweEYwLCAweDY0LCAweDQxLCAweDYwLCAweDQwLAorCSAweDQwLCAweDI3LCAweDA5LCAweDAwLCAweENELCAweDgxLCAweERELCAweDgxLCAweDA2LCAweDAzLCAweDA1LCAweDAzLCAweDY0LCAweDQwLCAweDAxLCAweDI2LAorCSAweDAyLCAweDAwLCAweDAxLCAweDYxLCAweDAxLCAweDAwLCAweDAwLCAweDYxLCAweDYwLCAweDQwLCAweDE4LCAweDM2LCAweDFGLCAweDAwLCAweEQwLCAweDYwLAorCSAweDU4LCAweDRGLCAweEQxLCAweDc4LCAweEZGLCAweEZGLCAweDBGLCAweEYwLCAweEVBLCAweEYxLCAweDY0LCAweDQ0LCAweDYwLCAweDIyLCAweDE5LCAweDAwLAorCSAweERCLCAweEYzLCAweEZGLCAweEZGLCAweDA3LCAweEI0LCAweEZELCAweEEwLCAweDJBLCAweEYyLCAweDAzLCAweDAyLCAweDA4LCAweEIwLCAweEZGLCAweEZGLAorCSAweDEwLCAweDAyLCAweDMyLCAweEYyLCAweDMzLCAweEYyLCAweEQwLCAweDgwLCAweEVCLCAweEYxLCAweDBCLCAweDAyLCAweEQwLCAweDgwLCAweDM0LCAweEYyLAorCSAweDA4LCAweDAyLCAweEVDLCAweEYxLCAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweDBGLCAweEYwLCAweDAzLCAweDAyLCAweEQzLCAweDYwLCAweDEwLCAweDc4LAorCSAweEZGLCAweEZGLCAweDAwLCAweEY0LCAweEFBLCAweDYwLCAweEFBLCAweDY1LCAweDA5LCAweEYyLCAweDVBLCAweEQwLCAweEQ0LCAweDgwLCAweDAzLCAweDY0LAorCSAweDU3LCAweDAyLCAweEQwLCAweDgwLCAweDAwLCAweDY0LCAweDVBLCAweEQwLCAweDUzLCAweDAyLCAweDY0LCAweDQ1LCAweEQ0LCAweDgwLCAweEY4LCAweDdGLAorCSAweDA4LCAweDAyLCAweDVBLCAweEQwLCAweDI2LCAweDQ2LCAweDY0LCAweDQ1LCAweDIzLCAweEYwLCAweDIwLCAweDY3LCAweEIwLCAweDg0LCAweEEyLCAweERBLAorCSAweDBCLCAweDAwLCAweEQ0LCAweDgwLCAweDFELCAweDYwLCAweDYwLCAweDY0LCAweDE2LCAweDAyLCAweDVBLCAweEQwLCAweDI2LCAweDQ2LCAweDY0LCAweDQ1LAorCSAweDIzLCAweEYwLCAweDQwLCAweDY3LCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweDY1LCAweDQ0LCAweDg4LCAweDNBLCAweDA3LCAweDAwLCAweDc3LCAweDM3LAorCSAweDA4LCAweDAwLCAweDc4LCAweDM3LCAweDA2LCAweDAwLCAweDhFLCAweDM3LCAweDA0LCAweDAwLCAweDMyLCAweDAwLCAweDgxLCAweDNBLCAweDMwLCAweDAwLAorCSAweDgwLCAweDM3LCAweDAwLCAweDYxLCAweDJELCAweDAwLCAweEQ0LCAweDgwLCAweDAxLCAweDYwLCAweDAwLCAweDY0LCAweDVBLCAweEQwLCAweDI4LCAweDAyLAorCSAweEQwLCAweDgwLCAweDVBLCAweEQwLCAweDI1LCAweDAyLCAweDI2LCAweDQ2LCAweDY0LCAweDQ3LCAweDdGLCAweEI0LCAweEZELCAweEEwLCAweDA5LCAweDAzLAorCSAweDFGLCAweDA3LCAweDMyLCAweDQwLCAweDAyLCAweDI2LCAweDQ0LCAweDAwLCAweDIzLCAweEYwLCAweDYwLCAweDY3LCAweEIwLCAweDg0LCAweEEyLCAweERBLAorCSAweDNGLCAweDAwLCAweDBGLCAweEYyLCAweDMyLCAweDQwLCAweDAyLCAweDI2LCAweDNCLCAweDAwLCAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLAorCSAweDA4LCAweDJBLCAweDA3LCAweDAwLCAweDYwLCAweDQwLCAweDQ4LCAweDM2LCAweDA0LCAweDAwLCAweEYxLCAweEYzLCAweEZGLCAweEZGLCAweDAyLCAweEJDLAorCSAweEYxLCAweEZCLCAweEY0LCAweDYwLCAweDU4LCAweDRGLCAweDFELCAweDc4LCAweEZGLCAweEZGLCAweEQzLCAweDYwLCAweDFBLCAweDc4LCAweEZGLCAweEZGLAorCSAweDI2LCAweDQ2LCAweDYxLCAweDQwLCAweDAxLCAweDJBLCAweDA3LCAweDAwLCAweDJDLCAweDYwLCAweEY4LCAweDY0LCAweEYxLCAweDYwLCAweDc4LCAweDQxLAorCSAweEU0LCAweDc4LCAweEI1LCAweEYxLCAweDg1LCAweDAwLCAweDBGLCAweEYyLCAweDdGLCAweEYxLCAweDJBLCAweEYyLCAweDYwLCAweDQwLCAweDIwLCAweDJBLAorCSAweDEyLCAweDAwLCAweDVFLCAweDYzLCAweDYwLCAweDQwLCAweDAyLCAweDJCLCAweDY0LCAweDYzLCAweEJELCAweEQyLCAweEJELCAweEQyLCAweEQwLCAweDgwLAorCSAweDgwLCAweEYxLCAweDA4LCAweDAyLCAweEQwLCAweDgwLCAweEEzLCAweEQyLCAweDgxLCAweEYxLCAweDA0LCAweDAyLCAweEQwLCAweDgwLCAweEZGLCAweEZGLAorCSAweDAxLCAweDAyLCAweDA2LCAweDAwLCAweDZELCAweDAwLCAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDQ4LCAweDM2LCAweDY4LCAweDAwLAorCSAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDA4LCAweDJBLCAweDA3LCAweDAwLCAweDYwLCAweDQwLCAweDQ4LCAweDM2LCAweDA0LCAweDAwLAorCSAweEYxLCAweEYzLCAweEZGLCAweEZGLCAweDAyLCAweEJDLCAweEYxLCAweEZCLCAweDY4LCAweDAwLCAweDI2LCAweDQ2LCAweDJBLCAweEYyLCAweEZGLCAweEZGLAorCSAweEZGLCAweEZGLCAweDBDLCAweDI2LCAweDU1LCAweDAwLCAweEIwLCAweDM2LCAweDE1LCAweDAwLCAweDEwLCAweDM2LCAweDEzLCAweDAwLCAweDMwLCAweDM2LAorCSAweDExLCAweDAwLCAweEMwLCAweDM2LCAweDAyLCAweDAwLCAweEEwLCAweDNBLCAweDEyLCAweDAwLCAweDdGLCAweEYxLCAweDMyLCAweEYyLCAweDMzLCAweEYyLAorCSAweEQwLCAweDgwLCAweDgwLCAweEYxLCAweDQ1LCAweDAyLCAweEQwLCAweDgwLCAweDM0LCAweEYyLCAweDgxLCAweEYxLCAweDQxLCAweDAyLCAweEQwLCAweDgwLAorCSAweEZGLCAweEZGLCAweDNFLCAweDAyLCAweEU2LCAweDYwLCAweDU4LCAweDRGLCAweDNELCAweDc4LCAweEZGLCAweEZGLCAweDM1LCAweDAwLCAweDUwLCAweDNBLAorCSAweDA1LCAweDAwLCAweEY4LCAweDYwLCAweDU4LCAweDRGLCAweEUxLCAweDc4LCAweEZGLCAweEZGLCAweDJFLCAweDAwLCAweDQwLCAweDNBLCAweDA1LCAweDAwLAorCSAweEYwLCAweDYwLCAweDU4LCAweDRGLCAweDk5LCAweDc4LCAweEZGLCAweEZGLCAweDI3LCAweDAwLCAweDgwLCAweDNBLCAweDI0LCAweDAwLCAweDdGLCAweEYxLAorCSAweDMyLCAweEYyLCAweDMzLCAweEYyLCAweEQwLCAweDgwLCAweDgwLCAweEYxLCAweDIzLCAweDAyLCAweEQwLCAweDgwLCAweDM0LCAweEYyLCAweDgxLCAweEYxLAorCSAweDFGLCAweDAyLCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDFDLCAweDAyLCAweEU5LCAweDYwLCAweDU4LCAweDRGLCAweDMwLCAweDc4LCAweEZGLCAweEZGLAorCSAweDdELCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDBBLCAweDAwLCAweDE5LCAweDYwLCAweDRDLCAweEYzLCAweEZGLCAweEZGLAorCSAweDYwLCAweDQwLCAweDA4LCAweDI2LCAweDA0LCAweDAwLCAweEVFLCAweDYwLCAweDU4LCAweDRGLCAweDgxLCAweDc4LCAweEZGLCAweEZGLCAweDI0LCAweDYwLAorCSAweDU4LCAweDRGLCAweEUzLCAweDc4LCAweEZGLCAweEZGLCAweDA0LCAweDAwLCAweDY2LCAweDQ0LCAweDAwLCAweEE4LCAweEZGLCAweEZGLCAweDBBLCAweDAzLAorCSAweDI2LCAweDQ2LCAweDI2LCAweDYwLCAweDFBLCAweDY0LCAweDQwLCAweDRCLCAweDM0LCAweDYwLCAweDU4LCAweDRELCAweDA4LCAweDc4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweEQwLCAweDYwLCAweEIyLCAweDc4LCAweEZGLCAweEZGLCAweDJBLCAweEYyLCAweDNCLCAweEYwLCAweDYwLCAweDQwLAorCSAweDQwLCAweDJCLCAweDA2LCAweDAwLCAweEMwLCAweDYwLCAweDAwLCAweDY0LCAweDY0LCAweDQwLCAweDIwLCAweDJCLCAweDAxLCAweDAwLCAweDAzLCAweDAwLAorCSAweEQzLCAweDYwLCAweDRDLCAweDc4LCAweEZGLCAweEZGLCAweDIyLCAweEYyLCAweEZGLCAweEZGLCAweDA0LCAweEI0LCAweEZGLCAweEZGLCAweEY4LCAweDAzLAorCSAweDIzLCAweEYyLCAweDA3LCAweEY0LCAweEJCLCAweEYwLCAweDI2LCAweDQ2LCAweEE0LCAweDg0LCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDJGLCAweDI2LAorCSAweEQ3LCAweDAxLCAweDEyLCAweEYwLCAweEZGLCAweEZGLCAweDEwLCAweDFCLCAweENBLCAweDYwLCAweDU4LCAweDRGLCAweDE2LCAweDc4LCAweEZGLCAweEZGLAorCSAweDY0LCAweDQwLCAweDE4LCAweDM2LCAweDA5LCAweDAwLCAweDA0LCAweDY1LCAweEYxLCAweDYwLCAweDU4LCAweDRFLCAweDk2LCAweDc4LCAweEZGLCAweEZGLAorCSAweDI2LCAweDQ2LCAweEQzLCAweDYwLCAweDEwLCAweDc4LCAweEZGLCAweEZGLCAweDI1LCAweDYwLCAweEZFLCAweDY0LCAweDEzLCAweDYwLCAweDBELCAweEZCLAorCSAweDI2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEY4LCAweEZFLCAweEMwLCAweDAxLAorCSAweDFDLCAweDYwLCAweDkyLCAweDYzLCAweDAwLCAweDY0LCAweEEzLCAweERCLCAweDA2LCAweEEzLCAweDEwLCAweDYwLCAweDk0LCAweDY0LCAweEJELCAweERCLAorCSAweEJELCAweERCLCAweDA2LCAweDY0LCAweEEzLCAweERCLCAweDAwLCAweDYzLCAweDA4LCAweDYwLCAweDc3LCAweEZELCAweEQ5LCAweDYwLCAweEE1LCAweDY0LAorCSAweDA4LCAweDYwLCAweDQ5LCAweEZCLCAweEQ5LCAweDYwLCAweDZBLCAweDY0LCAweDA4LCAweDYwLCAweDM1LCAweEZCLCAweDAwLCAweDYwLCAweDAyLCAweDY0LAorCSAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEQzLCAweDYwLCAweDlDLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDdELCAweEYzLCAweDMzLCAweDYwLCAweDIwLCAweDYzLCAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDAzLCAweDAwLCAweDE5LCAweDYwLCAweDNCLCAweEYzLAorCSAweDAyLCAweDAwLCAweDE5LCAweDYwLCAweDNDLCAweEYzLCAweDA4LCAweDYxLCAweDYwLCAweEZFLCAweEEzLCAweEQxLCAweEZGLCAweEZGLCAweDIwLCAweEZFLAorCSAweDAwLCAweEE4LCAweEU4LCAweDg0LCAweDBGLCAweDAzLCAweDYwLCAweEZFLCAweDAyLCAweDI4LCAweEY2LCAweDAxLCAweDgwLCAweDYyLCAweEIyLCAweDlDLAorCSAweEJELCAweEQ5LCAweDdCLCAweEY5LCAweENELCAweDgxLCAweDAwLCAweDM2LCAweDAxLCAweDAwLCAweEVFLCAweDAxLCAweDM2LCAweDYwLCAweDBBLCAweDYzLAorCSAweDA4LCAweDYxLCAweEVBLCAweDAxLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLAorCSAweEJBLCAweEZFLCAweDE2LCAweDYwLCAweDg3LCAweEYzLCAweEZGLCAweEZGLCAweDAzLCAweEE4LCAweDAyLCAweEE4LCAweDA0LCAweDAzLCAweDI4LCAweDAyLAorCSAweEQ5LCAweDYwLCAweDQxLCAweDc4LCAweEZGLCAweEZGLCAweEQ4LCAweDYwLCAweEQ0LCAweDc4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDE1LCAweEYxLAorCSAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDExLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweEFDLCAweEYzLAorCSAweEZGLCAweEZGLCAweEZFLCAweEEwLCAweEZGLCAweEZGLCAweDBBLCAweDA3LCAweDFDLCAweDYwLCAweDkyLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLAorCSAweDAyLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDIwLCAweDYwLCAweDIwLCAweDY1LAorCSAweEE1LCAweERGLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDI3LCAweEZCLCAweDVBLCAweERCLCAweEQ0LCAweDYwLCAweEY2LCAweDc4LCAweEZGLCAweEZGLAorCSAweDAxLCAweDYzLCAweDBFLCAweDYwLCAweDM2LCAweEZELCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAwLCAweDY0LAorCSAweDA4LCAweDYwLCAweDE1LCAweEZCLCAweDVBLCAweERCLCAweEJBLCAweEZFLCAweDAyLCAweDY0LCAweERCLCAweEZCLCAweEYxLCAweEYzLCAweEZGLCAweEZGLAorCSAweDAxLCAweEJDLCAweEYxLCAweEZCLCAweDQ0LCAweDYwLCAweDQ0LCAweDY0LCAweDdGLCAweEZCLCAweDgwLCAweEZCLCAweDgxLCAweEZCLCAweDA4LCAweDYwLAorCSAweDAwLCAweDY1LCAweDIwLCAweDQ0LCAweDM0LCAweDgwLCAweDA4LCAweDYwLCAweDc3LCAweEYzLCAweEZGLCAweEZGLCAweDE1LCAweDE4LCAweEEyLCAweERGLAorCSAweDQwLCAweDYwLCAweDU4LCAweDRFLCAweDdELCAweDc4LCAweEZGLCAweEZGLCAweDFGLCAweDYwLCAweEM0LCAweDY0LCAweDBGLCAweDYwLCAweEUxLCAweEZCLAorCSAweDRBLCAweERGLCAweDAxLCAweDYwLCAweEZFLCAweDYzLCAweDFELCAweDYwLCAweEJFLCAweDYxLCAweDAwLCAweDY0LCAweDU5LCAweERCLCAweEZFLCAweDFGLAorCSAweDEwLCAweDYwLCAweDBFLCAweDYyLCAweEEyLCAweERGLCAweDVCLCAweDAwLCAweENGLCAweEYzLCAweEZGLCAweEZGLCAweDUyLCAweDFCLCAweDEwLCAweDYwLAorCSAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDI0LCAweDQwLCAweDAyLCAweDIyLCAweDI2LCAweDAwLCAweDA4LCAweDYwLCAweDFFLCAweEYxLAorCSAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDEwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLAorCSAweDE2LCAweEZCLCAweEQ0LCAweDYwLCAweDFGLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDEwLCAweDYwLAorCSAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDA4LCAweDYwLCAweDFFLCAweEYxLCAweDAwLCAweDYwLCAweDQwLCAweDY0LCAweEIwLCAweDg0LAorCSAweEEyLCAweERCLCAweENGLCAweEZFLCAweDEwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEQ0LCAweDYwLCAweDU5LCAweDY0LAorCSAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDI0LCAweDQwLCAweDAxLCAweDI2LCAweDExLCAweDAwLCAweDA4LCAweDYwLAorCSAweDFFLCAweEYxLCAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDEwLCAweDYwLCAweDAwLCAweDY0LAorCSAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEQ0LCAweDYwLCAweDU5LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDA4LCAweDYwLCAweDFFLCAweEYxLCAweDAwLCAweDYwLCAweDQwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDEwLCAweDYwLAorCSAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEQ0LCAweDYwLCAweDU5LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweEZELCAweDYwLCAweDg5LCAweDY1LCAweEYzLCAweDYwLCAweDU4LCAweDRFLCAweDI3LCAweDc4LCAweEZGLCAweEZGLCAweDEwLCAweDYwLAorCSAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE1LCAweEZCLCAweDVBLCAweERCLCAweDEwLCAweDYwLAorCSAweDRFLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweEY3LCAweDYwLCAweEZGLCAweDY1LCAweDIwLCAweDQ0LCAweDI0LCAweDgwLCAweDA4LCAweDYwLAorCSAweDA4LCAweEYxLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweEJCLCAweEZFLCAweEZELCAweDYwLAorCSAweDQwLCAweDY1LCAweEYzLCAweDYwLCAweDU4LCAweDRFLCAweDI3LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDAzLCAweDY0LCAweDA4LCAweDYwLAorCSAweDI4LCAweEZCLCAweEQ0LCAweDYwLCAweDg3LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLAorCSAweDI3LCAweEYxLCAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDA3LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLAorCSAweDEwLCAweDYwLCAweDRFLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweEUyLCAweDAxLCAweDEwLCAweDYwLCAweDRFLCAweDYyLCAweDAwLCAweDY0LAorCSAweEEyLCAweERCLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDI3LCAweEZCLCAweDVBLCAweERCLCAweDIwLCAweDQwLCAweDA0LCAweDJCLCAweDE0LCAweDAwLAorCSAweDlCLCAweEZFLCAweDA4LCAweDA0LCAweEJCLCAweEZFLCAweDA4LCAweDYwLCAweDA4LCAweEYxLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LAorCSAweEEyLCAweERCLCAweENGLCAweEZFLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEQ0LCAweDYwLCAweDk1LCAweDY0LAorCSAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDAwLCAweDY1LCAweDIwLCAweDQ0LCAweDM0LCAweDgwLAorCSAweDE2LCAweDYwLCAweENDLCAweEYzLCAweDAwLCAweDYxLCAweDYwLCAweDQwLCAweDAwLCAweDM2LCAweDAwLCAweEI5LCAweDYwLCAweDQwLCAweDAxLCAweDM2LAorCSAweDAxLCAweEI5LCAweDYwLCAweDQwLCAweDAyLCAweDM2LCAweDA2LCAweEI5LCAweDYwLCAweDQwLCAweDAzLCAweDM2LCAweDA3LCAweEI5LCAweDQxLCAweDQ0LAorCSAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweERFLCAweEZFLCAweDBBLCAweDA0LCAweDQwLCAweDYwLCAweDAwLCAweDY0LAorCSAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEQ0LCAweDYwLCAweEM4LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDdELCAweEYxLCAweDEzLCAweDYwLCAweDFBLCAweEY5LCAweDBDLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDJELCAweEZGLCAweDIwLCAweDYwLAorCSAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEQ0LCAweDYwLCAweEU5LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweEJFLCAweEZFLCAweDA4LCAweDYwLCAweDA4LCAweEYxLAorCSAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDc1LCAweDAwLCAweDEwLCAweDYwLCAweDJBLCAweDYyLAorCSAweDAwLCAweDY0LCAweEEyLCAweERCLCAweEJBLCAweEZFLCAweDAyLCAweDY0LCAweERCLCAweEZCLCAweEYxLCAweEYzLCAweEZGLCAweEZGLCAweDAxLCAweEJDLAorCSAweEYxLCAweEZCLCAweDQ0LCAweDYwLCAweDQ0LCAweDY0LCAweDdGLCAweEZCLCAweDgwLCAweEZCLCAweDgxLCAweEZCLCAweEZGLCAweEZGLCAweDIwLCAweDQwLAorCSAweDA0LCAweDJCLCAweDE0LCAweDAwLCAweDlCLCAweEZFLCAweDA4LCAweDA0LCAweEJCLCAweEZFLCAweDA4LCAweDYwLCAweDA4LCAweEYxLCAweDgwLCAweDYwLAorCSAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLAorCSAweEQ1LCAweDYwLCAweDA3LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDAwLCAweDY1LAorCSAweDIwLCAweDQ0LCAweDM0LCAweDgwLCAweDA4LCAweDYwLCAweDA3LCAweEYxLCAweDAyLCAweDYwLCAweDAwLCAweDY1LCAweDIwLCAweDQ0LCAweDM0LCAweDgwLAorCSAweDY0LCAweDQwLCAweDAxLCAweDJBLCAweDA2LCAweDAwLCAweEEyLCAweERGLCAweDAyLCAweDY1LCAweEYxLCAweDYwLCAweDU4LCAweDRFLCAweEMzLCAweDc4LAorCSAweEZGLCAweEZGLCAweENGLCAweEYzLCAweDIwLCAweDYwLCAweDIwLCAweDY1LCAweDM2LCAweDFCLCAweEE1LCAweEQzLCAweDI0LCAweDQwLCAweDAxLCAweDI2LAorCSAweDE2LCAweDAwLCAweDYwLCAweDQwLCAweDIwLCAweDI2LCAweDJGLCAweDAwLCAweDAxLCAweEJDLCAweEE1LCAweERCLCAweDA4LCAweDYwLCAweDFFLCAweEYxLAorCSAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDEwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLAorCSAweDE2LCAweEZCLCAweEQ1LCAweDYwLCAweDY1LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDYwLCAweDQwLAorCSAweDEwLCAweDI2LCAweDE5LCAweDAwLCAweDAxLCAweEJDLCAweEE1LCAweERCLCAweDA4LCAweDYwLCAweDFFLCAweEYxLCAweDAwLCAweDYwLCAweDQwLCAweDY0LAorCSAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDEwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEQ1LCAweDYwLAorCSAweDY1LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEZELCAweDYwLCAweDg5LCAweDY1LCAweEYzLCAweDYwLAorCSAweDU4LCAweDRFLCAweDI3LCAweDc4LCAweEZGLCAweEZGLCAweENGLCAweEYxLCAweDA3LCAweDYwLCAweEU5LCAweEYzLCAweDY0LCAweDQwLCAweDAyLCAweDNBLAorCSAweDBDLCAweDAwLCAweDAxLCAweDYzLCAweDYwLCAweDQwLCAweDEwLCAweDIyLCAweDAwLCAweDYzLCAweDA4LCAweDYwLCAweEMxLCAweEZELCAweDA4LCAweDYwLAorCSAweEM1LCAweEZELCAweDA4LCAweDYwLCAweEM5LCAweEZELCAweDA4LCAweDYwLCAweENELCAweEZELCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LAorCSAweEEyLCAweERCLCAweDAxLCAweDY0LCAweDUzLCAweEZCLCAweDJGLCAweDYwLCAweDAyLCAweDY0LCAweDU0LCAweEZCLCAweDI0LCAweDQwLCAweDAxLCAweDI2LAorCSAweDExLCAweDAwLCAweDA4LCAweDYwLCAweDEyLCAweEYxLCAweDAwLCAweDYwLCAweDEwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLAorCSAweDEwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEQ1LCAweDYwLCAweEFCLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDEyLCAweEYxLCAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLAorCSAweENGLCAweEZFLCAweDEwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEQ1LCAweDYwLCAweEFCLCAweDY0LCAweDVBLCAweERCLAorCSAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEZELCAweDYwLCAweEZGLCAweDY1LCAweDIwLCAweDQ0LCAweDI0LCAweDgwLCAweDA4LCAweDYwLAorCSAweDA4LCAweEYxLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDEwLCAweDYwLCAweDJBLCAweDYyLAorCSAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDg2LCAweEYxLCAweDFCLCAweDYwLCAweEIyLCAweDYzLCAweEQzLCAweDgwLCAweDIwLCAweDQ0LCAweDAzLCAweDAzLAorCSAweEQ4LCAweDYwLCAweEQwLCAweDc4LCAweEZGLCAweEZGLCAweDg3LCAweEYzLCAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDFCLCAweDAyLAorCSAweDI0LCAweDQ0LCAweDA0LCAweDIyLCAweDEyLCAweDAwLCAweDI0LCAweDQ0LCAweDAxLCAweEFDLCAweEZCLCAweEI0LCAweDQwLCAweDQ0LCAweEY3LCAweDYwLAorCSAweEZGLCAweDY1LCAweDIwLCAweDQ0LCAweDI0LCAweDgwLCAweDA4LCAweDYwLCAweDA4LCAweEYxLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LAorCSAweEEyLCAweERCLCAweENGLCAweEZFLCAweEQ0LCAweDYwLCAweEY2LCAweDc4LCAweEZGLCAweEZGLCAweEQyLCAweEYzLCAweEZGLCAweEZGLCAweDAwLCAweEE4LAorCSAweEZGLCAweEZGLCAweDFGLCAweDAyLCAweDg3LCAweDAwLCAweDIwLCAweDQ0LCAweDEwLCAweEJDLCAweDQwLCAweDQwLCAweDY0LCAweDQyLCAweDVBLCAweEQxLAorCSAweDA2LCAweDYzLCAweEE0LCAweEQxLCAweEMzLCAweDgzLCAweDdELCAweEY5LCAweEJELCAweEQxLCAweDdGLCAweEY5LCAweEJELCAweEQxLCAweEZGLCAweEZGLAorCSAweDgwLCAweEY5LCAweEJELCAweEQxLCAweDgxLCAweEY5LCAweDA0LCAweEEzLCAweEJELCAweEQxLCAweDMzLCAweDYwLCAweEJFLCAweDY0LCAweDY0LCAweDQxLAorCSAweERELCAweDgxLCAweEZFLCAweEIxLCAweEEwLCAweEQ5LCAweDA0LCAweDAzLCAweEJELCAweEQxLCAweEM5LCAweDgxLCAweDU4LCAweEQ5LCAweEZDLCAweDAyLAorCSAweDM5LCAweDAwLCAweEU0LCAweEYzLCAweDdELCAweEZCLCAweDY2LCAweDQxLCAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDA2LCAweDAwLCAweDEwLCAweDYwLAorCSAweEYwLCAweDYzLCAweDExLCAweDYwLCAweDQ0LCAweDY1LCAweDA2LCAweDY2LCAweDA1LCAweDAwLCAweDExLCAweDYwLCAweDYwLCAweDYzLCAweDEyLCAweDYwLAorCSAweDQwLCAweDY1LCAweDA4LCAweDY2LCAweEEzLCAweEQxLCAweDRCLCAweDkzLCAweEQwLCAweDgwLCAweEQ3LCAweDgwLCAweDAyLCAweDAzLCAweEZBLCAweDA0LAorCSAweDA0LCAweDAwLCAweDVCLCAweDkzLCAweDAyLCAweEEzLCAweDAxLCAweDY0LCAweEEzLCAweERCLCAweDYxLCAweDQ2LCAweDJGLCAweDYwLCAweDAyLCAweDYxLAorCSAweEExLCAweEQzLCAweEZGLCAweEZGLCAweDAwLCAweEE4LCAweDMzLCAweDYwLCAweEJFLCAweDYzLCAweDAyLCAweDAyLCAweDJELCAweDYwLCAweDEwLCAweDYxLAorCSAweEExLCAweEQzLCAweEJELCAweERCLCAweERDLCAweDg0LCAweEZFLCAweEI0LCAweDU5LCAweEQxLCAweEM4LCAweDg0LCAweEJELCAweEQ5LCAweEZDLCAweDAyLAorCSAweEVDLCAweEYzLCAweDcyLCAweDQ1LCAweEVCLCAweEYzLCAweDk0LCAweDgzLCAweDgxLCAweEZELCAweDk0LCAweDgzLCAweDgwLCAweEZELCAweDY1LCAweDVGLAorCSAweDAyLCAweDY0LCAweDdGLCAweEZCLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweERFLCAweEZFLCAweDBBLCAweDA0LAorCSAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEQ2LCAweDYwLCAweDNBLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDdELCAweEYxLCAweDEzLCAweDYwLCAweDFBLCAweEY5LCAweDBFLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLAorCSAweDJELCAweEZGLCAweDIwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEQ2LCAweDYwLCAweDVCLCAweDY0LCAweDVBLCAweERCLAorCSAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweEJFLCAweEZFLAorCSAweDA4LCAweDYwLCAweDA4LCAweEYxLCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweEQ3LCAweDYwLAorCSAweDdCLCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweDYwLCAweEVGLCAweDY1LCAweDIwLCAweDQ0LCAweDI0LCAweDgwLCAweDAyLCAweDY0LCAweERCLCAweEZCLAorCSAweEYxLCAweEYzLCAweEZGLCAweEZGLCAweDAxLCAweEJDLCAweEYxLCAweEZCLCAweEY3LCAweDYwLCAweEZGLCAweDY1LCAweDIwLCAweDQ0LCAweDI0LCAweDgwLAorCSAweDA4LCAweDYwLCAweDA4LCAweEYxLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDEwLCAweDYwLAorCSAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDI0LCAweDQ0LCAweDAyLCAweDIyLCAweDAzLCAweDAwLCAweDAxLCAweEFDLCAweDA0LCAweEJDLAorCSAweDQwLCAweDQ0LCAweDMyLCAweDQwLCAweDgwLCAweDJBLCAweDhDLCAweDAwLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLAorCSAweERFLCAweEZFLCAweDBBLCAweDA0LCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEQ2LCAweDYwLCAweDhDLCAweDY0LAorCSAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLAorCSAweDk1LCAweEYzLCAweEZGLCAweEZGLCAweDdGLCAweEI0LCAweDk1LCAweEZCLCAweDI2LCAweDYwLCAweDM0LCAweDYyLCAweDA2LCAweDY0LCAweDRBLCAweERCLAorCSAweEZGLCAweEZGLCAweDJELCAweEZGLCAweEZGLCAweEZGLCAweEJFLCAweEZFLCAweDA4LCAweDYwLCAweDA4LCAweEYxLCAweDQwLCAweDYwLCAweDAwLCAweDY0LAorCSAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweERBLCAweEZFLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLAorCSAweDEyLCAweDYwLCAweEZGLCAweEYzLCAweEZGLCAweEZGLCAweDAwLCAweEE4LCAweDYwLCAweDQ2LCAweDA1LCAweDAzLCAweDBFLCAweEYyLCAweEZGLCAweEZGLAorCSAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDIyLCAweDAwLCAweDEzLCAweDYwLCAweDAyLCAweEYzLCAweEZGLCAweEZGLCAweDAwLCAweEE4LCAweDYwLCAweDQ2LAorCSAweDAzLCAweDAzLCAweDBGLCAweEYyLCAweEZGLCAweEZGLCAweDE5LCAweDFCLCAweDA4LCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLAorCSAweEQ2LCAweDYwLCAweEU1LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDAxLCAweDY0LCAweDE5LCAweDYwLCAweEYxLCAweEZCLCAweDE5LCAweDYwLAorCSAweEY2LCAweEYxLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAxLCAweDI2LCAweDA1LCAweDAwLCAweDg5LCAweEZGLCAweDA4LCAweDYwLCAweDAwLCAweDc1LAorCSAweDg4LCAweEZGLCAweDAxLCAweDAwLCAweDEwLCAweEZGLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LAorCSAweEEyLCAweERCLCAweERFLCAweEZFLCAweDBBLCAweDA0LCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEQ2LCAweDYwLAorCSAweEU1LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LAorCSAweEEyLCAweERCLCAweDdELCAweEYxLCAweDEzLCAweDYwLCAweDFBLCAweEY5LCAweDA4LCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDJELCAweEZGLAorCSAweDIwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEQ3LCAweDYwLCAweDBBLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEJFLCAweEZFLCAweDA4LCAweDYwLCAweDA4LCAweEYxLCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LAorCSAweEEyLCAweERCLCAweENGLCAweEZFLCAweEJBLCAweEZFLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDFFLCAweDAwLAorCSAweERBLCAweEZFLCAweEMxLCAweEZFLCAweDBFLCAweDYwLCAweDM2LCAweEYxLCAweDBFLCAweDYwLCAweDRCLCAweEY5LCAweDFDLCAweDYwLCAweDkyLCAweDY0LAorCSAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAyLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDAwLCAweDYwLCAweDA2LCAweDY0LAorCSAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEQ3LCAweDYwLCAweDRFLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDAwLCAweDYwLCAweDAyLCAweDY0LAorCSAweDA4LCAweDYwLCAweDI4LCAweEZCLCAweEQ3LCAweDYwLCAweDU1LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDFDLCAweDYwLCAweDZDLCAweDYxLAorCSAweDc1LCAweDYwLCAweDMwLCAweDY1LCAweEExLCAweEQzLCAweEZGLCAweEZGLCAweEZGLCAweEEwLCAweEUwLCAweDg0LCAweDAyLCAweDAyLCAweDAzLCAweDYwLAorCSAweEU4LCAweDY0LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDAxLCAweDA0LCAweDY1LCAweDQ0LCAweEExLCAweERCLCAweDMyLCAweDQwLCAweDgwLCAweDJBLAorCSAweDAzLCAweDAwLCAweEQ0LCAweDYwLCAweEY2LCAweDc4LCAweEZGLCAweEZGLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDY0LCAweDA4LCAweDYwLAorCSAweDI3LCAweEZCLCAweDVBLCAweERCLCAweEQ0LCAweDYwLCAweEY2LCAweDc4LCAweEZGLCAweEZGLCAweDIwLCAweDQwLCAweDA2LCAweDIzLCAweDEwLCAweDAwLAorCSAweDA4LCAweDYwLCAweDI3LCAweEYxLCAweDdGLCAweDYwLCAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDgwLCAweDYwLCAweDAwLCAweDY0LAorCSAweDA4LCAweDYwLCAweDI4LCAweEZCLCAweEQ3LCAweDYwLCAweDU1LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDEwLCAweDYwLCAweDRFLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDI3LCAweEZCLCAweDVBLCAweERCLAorCSAweDFDLCAweDYwLCAweDkyLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLAorCSAweEQzLCAweDYwLCAweEQwLCAweDc4LCAweEZGLCAweEZGLCAweDc4LCAweEYzLCAweDc5LCAweEZCLCAweDIwLCAweDYwLCAweDE0LCAweDYyLCAweEEyLCAweERGLAorCSAweEZGLCAweDYwLCAweERGLCAweDY1LCAweDIwLCAweDQ0LCAweDI0LCAweDgwLCAweEJDLCAweEYxLCAweDBFLCAweDYwLCAweDRCLCAweEY5LCAweDFDLCAweDYwLAorCSAweDkyLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAyLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweEY3LCAweDYwLAorCSAweEZGLCAweDY1LCAweDIwLCAweDQ0LCAweDI0LCAweDgwLCAweDEwLCAweDI2LCAweDM4LCAweDAwLCAweDAwLCAweDY0LCAweEIyLCAweEZCLCAweEIzLCAweEZCLAorCSAweEI0LCAweEZCLCAweDAwLCAweDc1LCAweDAwLCAweDcyLCAweEJBLCAweEYxLCAweDdFLCAweEY5LCAweDY0LCAweDQ0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LAorCSAweEUwLCAweDg0LCAweEUwLCAweDkzLCAweEU1LCAweEYxLCAweDg0LCAweEY5LCAweDdELCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDI3LAorCSAweDFFLCAweDAwLCAweDE5LCAweDYwLCAweDQ0LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDBBLCAweDAwLCAweDBGLCAweDY0LAorCSAweEZDLCAweDYwLCAweDU4LCAweDRFLCAweDM0LCAweDc4LCAweEZGLCAweEZGLCAweDY3LCAweDQzLCAweDFBLCAweDYwLCAweEIzLCAweEZELCAweDFBLCAweDYwLAorCSAweEMzLCAweEZELCAweEQzLCAweDYwLCAweDU4LCAweDRFLCAweDc4LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY1LCAweEZDLCAweDYwLCAweDU4LCAweDRFLAorCSAweEM3LCAweDc4LCAweEZGLCAweEZGLCAweEZELCAweDYwLCAweDU4LCAweDRFLCAweDExLCAweDc4LCAweEZGLCAweEZGLCAweDA1LCAweDAwLCAweEZGLCAweDY1LAorCSAweEZDLCAweDYwLCAweDU4LCAweDRFLCAweEM3LCAweDc4LCAweEZGLCAweEZGLCAweDQ0LCAweDAwLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LAorCSAweEEyLCAweERCLCAweDAwLCAweDYwLCAweDg0LCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEQ3LCAweDYwLCAweERCLCAweDY0LCAweDVBLCAweERCLAorCSAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDE1LCAweEYxLCAweDAwLCAweDYwLCAweDgwLCAweDY0LCAweEEwLCAweDgwLAorCSAweDlDLCAweDg0LCAweDJCLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDA4LCAweDYwLCAweDE1LCAweEYxLCAweEZGLCAweDYwLCAweDdGLCAweDYxLAorCSAweEExLCAweDg0LCAweDVBLCAweEQxLCAweDRBLCAweERCLCAweEExLCAweDg0LCAweDVBLCAweERCLCAweDJFLCAweDYwLCAweDJFLCAweDY0LCAweDJELCAweDYwLAorCSAweDhBLCAweDYzLCAweEEwLCAweEQxLCAweEEzLCAweEQ5LCAweDY0LCAweDQxLCAweDU4LCAweEQxLCAweDVCLCAweEQ5LCAweDdELCAweEYzLCAweDY2LCAweDQ1LAorCSAweEE2LCAweEY1LCAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDA4LCAweDAwLCAweDkxLCAweEZBLCAweDYxLCAweDQ0LCAweEZELCAweDYwLCAweDU4LCAweDRFLAorCSAweEFDLCAweDc4LCAweEZGLCAweEZGLCAweDEyLCAweEZBLCAweDA3LCAweDAwLCAweDExLCAweEY4LCAweDY0LCAweDQ0LCAweEZELCAweDYwLCAweDU4LCAweDRFLAorCSAweEFDLCAweDc4LCAweEZGLCAweEZGLCAweDEyLCAweEZBLCAweDY1LCAweDQ2LCAweDA0LCAweDAwLCAweEJCLCAweEZFLCAweEQ0LCAweDYwLCAweEY2LCAweDc4LAorCSAweEZGLCAweEZGLCAweDE2LCAweDYwLCAweEMyLCAweEYxLCAweDAwLCAweDY1LCAweDY0LCAweDQwLCAweDAxLCAweDM2LCAweDIyLCAweDY1LCAweDY0LCAweDQwLAorCSAweDA3LCAweDM2LCAweDAxLCAweDY1LCAweDY0LCAweDQwLCAweDBBLCAweDM2LCAweDAxLCAweDY1LCAweDY0LCAweDQwLCAweDBCLCAweDM2LCAweDIyLCAweDY1LAorCSAweEE2LCAweEYzLCAweDY2LCAweDVDLCAweDYwLCAweDQ2LCAweDFGLCAweDYzLCAweEUzLCAweDgzLCAweEJBLCAweEY4LCAweDAyLCAweEE2LCAweDY2LCAweDQ0LAorCSAweEZDLCAweDFGLCAweDE2LCAweDYwLCAweEMyLCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDA3LCAweDM2LCAweDAzLCAweDAwLCAweDBBLCAweDM2LAorCSAweDA2LCAweDAwLCAweDA5LCAweDAwLCAweEE2LCAweEYzLCAweDA0LCAweDY1LCAweDYwLCAweDQ2LCAweEJBLCAweEY4LCAweDA0LCAweDAwLCAweEE2LCAweEYzLAorCSAweDEwLCAweDY1LCAweDYwLCAweDQ2LCAweEJBLCAweEY4LCAweDY0LCAweDQ2LCAweEE2LCAweEYzLCAweDMyLCAweDQxLCAweDYwLCAweDQ1LCAweDA4LCAweEIxLAorCSAweDY2LCAweDQxLCAweDE2LCAweDAzLCAweDY1LCAweDQ2LCAweDE3LCAweDYwLCAweDgwLCAweEYzLCAweDA2LCAweEYwLCAweEUwLCAweDg0LCAweEUwLCAweDg0LAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDgwLCAweEJGLCAweEIwLCAweDg0LCAweDA2LCAweEZBLCAweDY2LCAweDQzLCAweDAyLCAweEEzLCAweDYzLCAweDQ2LAorCSAweDA2LCAweEYwLCAweEZGLCAweEZGLCAweEIwLCAweDg0LCAweDA2LCAweEZBLCAweDYxLCAweDQ2LCAweDMyLCAweDQ0LCAweDEwLCAweEJDLCAweDQwLCAweDUyLAorCSAweDAxLCAweDY0LCAweDEwLCAweDYwLCAweDBBLCAweEZCLCAweDBGLCAweDRFLCAweEVGLCAweDYwLCAweDU4LCAweDRGLCAweDNBLCAweDc4LCAweEZGLCAweEZGLAorCSAweDBFLCAweDRGLCAweDA4LCAweDYwLCAweDE1LCAweEYxLCAweEZGLCAweDYwLCAweEZCLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDAwLCAweDYwLAorCSAweDA0LCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEQzLCAweDYwLCAweEFFLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDFDLCAweDYwLAorCSAweDkyLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAyLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweEJCLCAweEZFLAorCSAweDIwLCAweDQ0LCAweDA0LCAweDI3LCAweDExLCAweDAwLCAweDEwLCAweDI2LCAweDAyLCAweDAwLCAweERCLCAweEZFLCAweDE0LCAweDAwLCAweDA4LCAweDYwLAorCSAweDA3LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDM2LCAweDA3LCAweDAwLCAweDAxLCAweDY0LCAweEEyLCAweERCLCAweDAxLCAweDY1LAorCSAweEYxLCAweDYwLCAweDU4LCAweDRFLCAweEMzLCAweDc4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDA4LCAweEYxLCAweDgwLCAweDYwLCAweDAwLCAweDY0LAorCSAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDAxLCAweDY0LCAweDhBLCAweEZCLCAweEZGLCAweDYwLCAweEVGLCAweDY1LCAweDIwLCAweDQ0LAorCSAweDI0LCAweDgwLCAweDAzLCAweDY0LCAweERCLCAweEZCLCAweEYxLCAweEYzLCAweEZGLCAweEZGLCAweEZFLCAweEI0LCAweEYxLCAweEZCLCAweEMxLCAweEZFLAorCSAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweDA4LCAweDYwLCAweDI4LCAweEZCLCAweEQ4LCAweDYwLCAweEFBLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDIwLCAweDQwLCAweDA2LCAweDIzLCAweDEwLCAweDAwLCAweDA4LCAweDYwLCAweDI3LCAweEYxLCAweDdGLCAweDYwLAorCSAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDI4LCAweEZCLCAweEQ4LCAweDYwLAorCSAweEFBLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweDRFLCAweDYyLCAweDAwLCAweDY0LAorCSAweEEyLCAweERCLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDI3LCAweEZCLCAweDVBLCAweERCLCAweDFDLCAweDYwLCAweDkyLCAweDY0LCAweDEzLCAweDYwLAorCSAweDIyLCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweEQzLCAweDYwLCAweEQwLCAweDc4LCAweEZGLCAweEZGLAorCSAweEJCLCAweEZFLCAweEQ5LCAweDYwLCAweEIwLCAweDc4LCAweEZGLCAweEZGLCAweDE2LCAweDYwLCAweEMyLCAweEYxLCAweDAwLCAweDY1LCAweDY0LCAweDQwLAorCSAweDAxLCAweDM2LCAweDIyLCAweDY1LCAweEE2LCAweEYzLCAweDY2LCAweDVDLCAweDYwLCAweDQ2LCAweDFGLCAweDYzLCAweEUzLCAweDgzLCAweEJBLCAweEY4LAorCSAweDAyLCAweEE2LCAweDY2LCAweDQ0LCAweEZDLCAweDFGLCAweDY0LCAweDQ2LCAweEE2LCAweEYxLCAweDAyLCAweDY0LCAweEMwLCAweDg1LCAweDBDLCAweDYxLAorCSAweDMyLCAweDQwLCAweDA4LCAweDJBLCAweDE0LCAweDAwLCAweDE3LCAweDYwLCAweDgwLCAweEYzLCAweDY2LCAweDQxLCAweDY1LCAweDQ2LCAweDA2LCAweEYwLAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDgwLCAweEJGLCAweEIwLCAweDgzLCAweDA2LCAweEZDLCAweDY2LCAweDQyLAorCSAweEZFLCAweEEyLCAweDYyLCAweDQ2LCAweDA2LCAweEYwLCAweEZGLCAweEZGLCAweEIwLCAweDg0LCAweDA2LCAweEZBLCAweDYxLCAweDQ2LCAweDBCLCAweDY0LAorCSAweERCLCAweEZCLCAweEYxLCAweEYzLCAweEZGLCAweEZGLCAweEZFLCAweEI0LCAweEYxLCAweEZCLCAweDAxLCAweDY1LCAweEYxLCAweDYwLCAweDU4LCAweDRFLAorCSAweEMzLCAweDc4LCAweEZGLCAweEZGLCAweEU0LCAweEYxLCAweDdELCAweEY5LCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLAorCSAweERFLCAweEZFLCAweDBBLCAweDA0LCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEQ5LCAweDYwLCAweDBDLCAweDY0LAorCSAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDdELCAweEYxLCAweDEzLCAweDYwLCAweDFBLCAweEY5LCAweDBFLCAweDY0LAorCSAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDJELCAweEZGLCAweDIwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEQ5LCAweDYwLAorCSAweDJELCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE1LCAweEZCLAorCSAweDVBLCAweERCLCAweEJFLCAweEZFLCAweDA4LCAweDYwLCAweDA4LCAweEYxLCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLAorCSAweENGLCAweEZFLCAweDAxLCAweDY0LCAweDhBLCAweEZCLCAweEZGLCAweDYwLCAweERGLCAweDY1LCAweDIwLCAweDQ0LCAweDI0LCAweDgwLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweDA2LCAweDY0LCAweERCLCAweEZCLCAweEYxLCAweEYzLCAweEZGLCAweEZGLCAweEZFLCAweEI0LCAweEYxLCAweEZCLCAweEU0LCAweEYxLAorCSAweDdELCAweEY5LCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAxLCAweDY0LCAweDhBLCAweEZCLCAweEZGLCAweDYwLAorCSAweERGLCAweDY1LCAweDIwLCAweDQ0LCAweDI0LCAweDgwLCAweEE2LCAweEYxLCAweDY2LCAweDQ1LCAweDY0LCAweDQ2LCAweDY2LCAweDQzLCAweDAyLCAweEEzLAorCSAweDYzLCAweDQ2LCAweDAyLCAweDY0LCAweDA2LCAweEZBLCAweDA0LCAweDYzLCAweDA0LCAweDYxLCAweDAxLCAweDYwLCAweENDLCAweDY0LCAweDU4LCAweEQxLAorCSAweDU5LCAweEQ4LCAweEZELCAweDFGLCAweDY1LCAweDQ2LCAweDAxLCAweDY1LCAweEYxLCAweDYwLCAweDU4LCAweDRFLCAweEMzLCAweDc4LCAweEZGLCAweEZGLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDY0LCAweDY3LCAweEZCLCAweDY4LCAweEZCLCAweEE2LCAweEYxLCAweDBFLCAweDY0LCAweDY2LCAweDQxLAorCSAweDY0LCAweDQyLCAweDAyLCAweEEyLCAweDYyLCAweDQ2LCAweDA2LCAweEYwLCAweEZGLCAweDYwLCAweEZDLCAweDY0LCAweEEwLCAweDg0LCAweDA2LCAweEZBLAorCSAweDYxLCAweDQ2LCAweERCLCAweEYzLCAweEZGLCAweEZGLCAweDA0LCAweEE4LCAweDEwLCAweDYwLCAweDBFLCAweDY0LCAweDA3LCAweDAzLCAweEEwLCAweEQxLAorCSAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAxLCAweDJBLCAweDAyLCAweDAwLCAweDAwLCAweDYzLCAweEEwLCAweERELCAweDAxLCAweDY0LCAweERCLCAweEZCLAorCSAweEYxLCAweEYzLCAweEZGLCAweEZGLCAweEZFLCAweEI0LCAweEYxLCAweEZCLCAweDAwLCAweDYzLCAweDA4LCAweDYwLCAweDc3LCAweEZELCAweDEwLCAweDYwLAorCSAweDRFLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDI3LCAweEZCLCAweDVBLCAweERCLCAweDEwLCAweDYwLAorCSAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEQzLCAweDYwLAorCSAweDlDLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDE1LCAweEYxLCAweDAwLCAweDYwLAorCSAweDA0LCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDJFLCAweDU4LCAweEZGLCAweEZGLAorCSAweDQwLCAweDY0LCAweDNCLCAweDQyLCAweDVBLCAweERCLCAweEI5LCAweEYxLCAweDBFLCAweDYwLCAweDRCLCAweEY5LCAweDVGLCAweEY1LCAweEVBLCAweEYxLAorCSAweDJGLCAweEY4LCAweEVCLCAweEYxLCAweDMwLCAweEY4LCAweEVDLCAweEYxLCAweDMxLCAweEY4LCAweEI5LCAweEYxLCAweDE5LCAweEY4LCAweEY4LCAweDYwLAorCSAweDgwLCAweDY0LCAweDBFLCAweEZBLCAweDAwLCAweDY0LCAweDNFLCAweEZBLCAweEE2LCAweEYxLCAweDA3LCAweEY4LCAweDFCLCAweDYwLCAweEIwLCAweDY0LAorCSAweDAwLCAweDYwLCAweDY3LCAweEZCLCAweDQ0LCAweDYwLCAweDQ0LCAweDY0LCAweDdGLCAweEZCLCAweDgwLCAweEZCLCAweDgxLCAweEZCLCAweDMxLCAweDQ0LAorCSAweEY5LCAweEI0LCAweDQwLCAweDUxLCAweDAwLCAweDYwLCAweENFLCAweDYzLCAweDAxLCAweDYwLCAweDBDLCAweDY1LCAweEEzLCAweEQzLCAweEE1LCAweEQxLAorCSAweDA0LCAweEE0LCAweEEzLCAweERCLCAweEQwLCAweDgwLCAweEEwLCAweEQxLCAweDBBLCAweDA2LCAweDQxLCAweDY0LCAweDNCLCAweDQyLCAweDVBLCAweERCLAorCSAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweEQ2LCAweDYwLCAweDZBLCAweDc4LCAweEZGLCAweEZGLCAweDQ0LCAweDQ3LAorCSAweDE2LCAweDYwLCAweEMyLCAweEYzLCAweEZGLCAweEZGLCAweEZGLCAweEE0LCAweEZGLCAweEZGLCAweDA5LCAweDA3LCAweDBFLCAweDYxLCAweDQxLCAweEQzLAorCSAweDMyLCAweDQwLCAweDA4LCAweDI2LCAweDA0LCAweDAwLCAweDEwLCAweEIwLCAweEZGLCAweEZGLCAweDAxLCAweDAzLCAweEQzLCAweDAxLCAweDQyLCAweDY0LAorCSAweDNCLCAweDQyLCAweDVBLCAweERCLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweERFLCAweEZFLCAweDBBLCAweDA0LAorCSAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEQ5LCAweDYwLCAweEZBLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDI3LCAweEQxLCAweDdELCAweEY5LCAweDEzLCAweDYwLCAweDFBLCAweEY5LCAweDBFLCAweDY0LCAweDRBLCAweERCLAorCSAweEZGLCAweEZGLCAweDJELCAweEZGLCAweDIwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweERBLCAweDYwLCAweDFDLCAweDY0LAorCSAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLAorCSAweEJFLCAweEZFLCAweDA4LCAweDYwLCAweDA4LCAweEYxLCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLAorCSAweDA3LCAweDYwLCAweEQwLCAweDY0LCAweDBFLCAweDYwLCAweDRCLCAweEZCLCAweDFDLCAweDYwLCAweDkyLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLAorCSAweDAyLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDI3LCAweDQzLCAweDA2LCAweEEzLCAweEJELCAweEQzLCAweDdGLCAweEZCLAorCSAweEJELCAweEQzLCAweDgwLCAweEZCLCAweEEzLCAweEQzLCAweDgxLCAweEZCLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLAorCSAweDAxLCAweDYwLCAweDA0LCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweERBLCAweDYwLCAweDRBLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEI5LCAweEYxLCAweDBFLCAweDYwLCAweDRCLCAweEY5LCAweDA4LCAweDYwLCAweDE1LCAweEYxLCAweEZFLCAweDYwLAorCSAweEZGLCAweDYxLCAweEExLCAweDg0LCAweDVBLCAweEQxLCAweDRBLCAweERCLCAweEExLCAweDg0LCAweDVBLCAweERCLCAweDA4LCAweDYwLCAweDE1LCAweEYxLAorCSAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDA1LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweEQ5LCAweDYwLAorCSAweENBLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDA4LCAweDY1LCAweDIwLCAweDQ0LCAweDM0LCAweDgwLCAweDdELCAweEYxLCAweDMyLCAweDYwLAorCSAweDdBLCAweDYxLCAweEExLCAweEQzLCAweDY0LCAweDQwLCAweDAxLCAweDI3LCAweDU5LCAweEQzLCAweDMyLCAweDYwLCAweDdFLCAweDYxLCAweEZELCAweDYwLAorCSAweDU4LCAweDRFLCAweEFDLCAweDc4LCAweEZGLCAweEZGLCAweEExLCAweERCLCAweDVFLCAweEY1LCAweEVBLCAweEYxLCAweDJGLCAweEY4LCAweEVCLCAweEYxLAorCSAweDMwLCAweEY4LCAweEVDLCAweEYxLCAweDMxLCAweEY4LCAweEI5LCAweEYxLCAweDE5LCAweEY4LCAweDgwLCAweDdFLCAweEY4LCAweDdGLCAweDBFLCAweEZBLAorCSAweDAwLCAweDY0LCAweDNFLCAweEZBLCAweEE2LCAweEYxLCAweDA3LCAweEY4LCAweDJCLCAweEZBLCAweEIwLCAweDY0LCAweDJBLCAweEZBLCAweDI3LCAweDQzLAorCSAweDA2LCAweEEzLCAweEJELCAweEQxLCAweDJDLCAweEY4LCAweDMyLCAweEY4LCAweEJELCAweEQxLCAweDJELCAweEY4LCAweDMzLCAweEY4LCAweEEzLCAweEQxLAorCSAweDJFLCAweEY4LCAweDM0LCAweEY4LCAweDA2LCAweDYzLCAweDNGLCAweEZDLCAweDIwLCAweDYwLCAweDE2LCAweDYxLCAweERCLCAweEYzLCAweEExLCAweEQzLAorCSAweDAzLCAweEE4LCAweEFDLCAweDgzLCAweDBFLCAweDAyLCAweDBELCAweDAzLCAweDIwLCAweDYwLCAweDE4LCAweDYxLCAweEExLCAweEQxLCAweDY2LCAweDQ1LAorCSAweDAwLCAweEY0LCAweDA5LCAweEZDLCAweDAxLCAweDY0LCAweDBBLCAweEZBLCAweDBCLCAweEY4LCAweDIwLCAweDYwLCAweDE2LCAweDYxLCAweEExLCAweERGLAorCSAweDI1LCAweDAwLCAweDE2LCAweDYwLCAweEMzLCAweEYzLCAweDY2LCAweDQ1LCAweDAwLCAweEY0LCAweDYwLCAweDQwLCAweDAxLCAweDM2LCAweDE1LCAweDAwLAorCSAweDAyLCAweDM2LCAweEJELCAweDAwLCAweDAzLCAweDM2LCAweDA3LCAweDAwLCAweDA0LCAweDM2LCAweDBGLCAweDAwLCAweDA1LCAweDM2LCAweEI3LCAweDAwLAorCSAweDA2LCAweDM2LCAweDAxLCAweDAwLCAweDBBLCAweDAwLCAweDgwLCAweDY0LCAweDA5LCAweEZBLCAweDAxLCAweDYzLCAweDBBLCAweEZDLCAweDAwLCAweDY0LAorCSAweDBCLCAweEZBLCAweDgwLCAweDYwLCAweEY0LCAweDYyLCAweEEyLCAweERGLCAweDA5LCAweDAwLCAweDAwLCAweDY0LCAweDA5LCAweEZBLCAweDAxLCAweDYzLAorCSAweDBBLCAweEZDLCAweDAwLCAweDY0LCAweDBCLCAweEZBLCAweDgwLCAweDYwLCAweEY0LCAweDYyLCAweEEyLCAweERGLCAweDI1LCAweDYwLCAweENFLCAweDY0LAorCSAweDEzLCAweDYwLCAweDBELCAweEZCLCAweDY1LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLAorCSAweDAwLCAweDY2LCAweERCLCAweEYzLCAweDQ2LCAweDQ2LCAweEZELCAweEEwLCAweEMxLCAweEZFLCAweDAyLCAweDAyLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDAxLCAweDY0LCAweDY4LCAweEZCLCAweDQzLCAweDY0LCAweDNCLCAweDQyLCAweDVBLCAweERCLCAweDBFLCAweDYwLCAweDM4LCAweEYzLCAweEZGLCAweEZGLAorCSAweDY0LCAweEE0LCAweEEyLCAweERCLCAweDBFLCAweDYwLCAweDM4LCAweEYxLCAweDBFLCAweDYwLCAweDRCLCAweEY5LCAweDFDLCAweDYwLCAweDkyLCAweDY0LAorCSAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAyLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDAwLCAweDYwLCAweDBDLCAweDY0LAorCSAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweERCLCAweDYwLCAweDAwLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDA4LCAweDYwLCAweDE1LCAweEYxLCAweDAwLCAweDYwLCAweDA4LCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDU1LCAweDAzLCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweDFDLCAweDYwLCAweDkyLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLAorCSAweDA0LCAweEZGLCAweDAwLCAweDY0LCAweDY4LCAweEZCLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDI2LCAweDQ2LAorCSAweDAwLCAweEY0LCAweDA5LCAweEYyLCAweDBBLCAweEYyLCAweDAwLCAweEE4LCAweDBCLCAweEYyLCAweDAyLCAweEE4LCAweDE2LCAweDAyLCAweDAwLCAweEE4LAorCSAweDFBLCAweDAyLCAweDE5LCAweDAyLCAweDI2LCAweDQ2LCAweDI2LCAweDYwLCAweDFBLCAweDY0LCAweDQwLCAweDRCLCAweDM0LCAweDYwLCAweDU4LCAweDRELAorCSAweDA4LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweDIwLCAweDQwLCAweDA4LCAweDJBLCAweDAzLCAweDAwLCAweERDLCAweDYwLAorCSAweEY2LCAweDc4LCAweEZGLCAweEZGLCAweEUzLCAweDYwLCAweDY5LCAweDc4LCAweEZGLCAweEZGLCAweDA5LCAweEYyLCAweDBBLCAweEYyLCAweDgwLCAweEE4LAorCSAweDBCLCAweEYyLCAweDAyLCAweEE4LCAweEU0LCAweDAzLCAweDQ0LCAweDY0LCAweDNCLCAweDQyLCAweDVBLCAweERCLCAweDBCLCAweEYyLCAweDI2LCAweDQ2LAorCSAweDQwLCAweDU5LCAweDAyLCAweDYwLCAweDAwLCAweDYxLCAweDJGLCAweEYyLCAweEExLCAweERCLCAweDMwLCAweEYyLCAweDQxLCAweDU4LCAweDU5LCAweERCLAorCSAweDMxLCAweEYyLCAweDU5LCAweERCLCAweDI2LCAweDQ2LCAweDI2LCAweDYwLCAweDFBLCAweDY0LCAweDQwLCAweDRCLCAweDM0LCAweDYwLCAweDU4LCAweDRELAorCSAweDA4LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweDAzLCAweDY1LCAweEYxLCAweDYwLCAweDU4LCAweDRFLCAweDk2LCAweDc4LAorCSAweEZGLCAweEZGLCAweEU3LCAweDYwLCAweDBCLCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweDYwLCAweEZCLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLAorCSAweDAwLCAweDY0LCAweDY4LCAweEZCLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDIwLCAweDQwLCAweDA4LCAweDJBLAorCSAweDAzLCAweDAwLCAweEQ5LCAweDYwLCAweENBLCAweDc4LCAweEZGLCAweEZGLCAweEUyLCAweDYwLCAweDczLCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDYzLAorCSAweDA5LCAweEZDLCAweDMyLCAweDQwLCAweDA4LCAweDI2LCAweDE0LCAweDAwLCAweDE2LCAweDYwLCAweEMyLCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLAorCSAweDBCLCAweDM2LCAweDAzLCAweDAwLCAweERBLCAweDYwLCAweEM1LCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDY0LCAweEEyLCAweERCLCAweDBCLCAweDY0LAorCSAweDE5LCAweDYwLCAweEE0LCAweEZCLCAweEE2LCAweEYxLCAweDY2LCAweDQxLCAweDY0LCAweDQ2LCAweDIyLCAweDY0LCAweDNBLCAweEZBLCAweDYxLCAweDQ2LAorCSAweDAxLCAweDY0LCAweDBBLCAweEZBLCAweDAwLCAweDY0LCAweDBCLCAweEZBLCAweDAxLCAweDY0LCAweDQwLCAweDYwLCAweDdBLCAweEZCLCAweDAxLCAweDY0LAorCSAweDY4LCAweEZCLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDI1LCAweDYwLCAweENFLCAweDY0LCAweDEzLCAweDYwLAorCSAweDBELCAweEZCLCAweDY1LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDAwLCAweDY2LAorCSAweERCLCAweEYzLCAweDQ2LCAweDQ2LCAweEZELCAweEEwLCAweEMxLCAweEZFLCAweDAyLCAweDAyLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDFDLCAweDYwLAorCSAweDkyLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAyLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDAwLCAweDYwLAorCSAweDBDLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweERCLCAweDYwLCAweEI5LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDE1LCAweEYxLCAweDAwLCAweDYwLCAweDA4LCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDNBLCAweDAzLAorCSAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDFDLCAweDYwLCAweDkyLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLAorCSAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDAwLCAweDY0LCAweDY4LCAweEZCLCAweDI2LCAweDQ2LCAweDAwLCAweEY0LCAweDA5LCAweEYyLCAweDBBLCAweEYyLAorCSAweDAxLCAweEE4LCAweDBCLCAweEYyLCAweDAyLCAweEE4LCAweDA0LCAweDAyLCAweDAwLCAweEE4LCAweDAyLCAweDAyLCAweDAxLCAweDAyLCAweDMxLCAweDAwLAorCSAweERDLCAweDYwLCAweDU4LCAweDRELCAweEI5LCAweDc4LCAweEZGLCAweEZGLCAweDBCLCAweEYyLCAweDI2LCAweDQ2LCAweDQwLCAweDU5LCAweDAyLCAweDYwLAorCSAweDAwLCAweDYxLCAweDJGLCAweEYyLCAweEExLCAweERCLCAweDMwLCAweEYyLCAweDQxLCAweDU4LCAweDU5LCAweERCLCAweDMxLCAweEYyLCAweDU5LCAweERCLAorCSAweDI2LCAweDQ2LCAweDI2LCAweDYwLCAweDFBLCAweDY0LCAweDQwLCAweDRCLCAweDM0LCAweDYwLCAweDU4LCAweDRELCAweDA4LCAweDc4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweDAzLCAweDY1LCAweEYxLCAweDYwLCAweDU4LCAweDRFLCAweDk2LCAweDc4LCAweEZGLCAweEZGLCAweEU3LCAweDYwLAorCSAweDBCLCAweDc4LCAweEZGLCAweEZGLCAweERDLCAweDYwLCAweDU4LCAweDRELCAweEI5LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY0LCAweDY4LCAweEZCLAorCSAweDIwLCAweDQwLCAweDA4LCAweDJBLCAweDAzLCAweDAwLCAweEQ5LCAweDYwLCAweENBLCAweDc4LCAweEZGLCAweEZGLCAweEUyLCAweDYwLCAweDczLCAweDc4LAorCSAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDQwLCAweDYwLCAweDAwLCAweDY1LCAweDJBLCAweEYyLCAweDJGLCAweEYwLCAweEI0LCAweDg0LCAweDJBLCAweEZBLAorCSAweDJDLCAweEY4LCAweDMyLCAweEY4LCAweDMwLCAweEYyLCAweDJELCAweEZBLCAweDMzLCAweEZBLCAweDMxLCAweEYyLCAweDJFLCAweEZBLCAweDM0LCAweEZBLAorCSAweEVBLCAweEYzLCAweDJGLCAweEZBLCAweEVCLCAweEYzLCAweDMwLCAweEZBLCAweEVDLCAweEYzLCAweDMxLCAweEZBLCAweEM5LCAweEYxLCAweDE5LCAweEY4LAorCSAweDFDLCAweEYwLCAweDEzLCAweEY4LCAweDAwLCAweDY0LCAweDNFLCAweEZBLCAweDAwLCAweEY0LCAweDAzLCAweDY0LCAweDBBLCAweEZBLCAweDAwLCAweDY0LAorCSAweDBCLCAweEZBLCAweDAxLCAweDYzLCAweDY4LCAweEZELCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDI1LCAweDYwLAorCSAweENFLCAweDY0LCAweDEzLCAweDYwLCAweDBELCAweEZCLCAweDI2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLAorCSAweDJCLCAweEZGLCAweDAwLCAweDY2LCAweERCLCAweEYzLCAweDQ2LCAweDQ2LCAweEZELCAweEEwLCAweEMxLCAweEZFLCAweDAyLCAweDAyLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweDFDLCAweDYwLCAweDkyLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAyLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLAorCSAweDA0LCAweEZGLCAweDAwLCAweDYwLCAweDBDLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweERDLCAweDYwLCAweDUzLCAweDY0LCAweDVBLCAweERCLAorCSAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDE1LCAweEYxLCAweDAwLCAweDYwLCAweDA4LCAweDY0LCAweEEwLCAweDgwLAorCSAweDlDLCAweDg0LCAweDUwLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDFDLCAweDYwLCAweDkyLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLAorCSAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDAwLCAweDY0LCAweDY4LCAweEZCLCAweDI2LCAweDQ2LCAweDAwLCAweEY0LAorCSAweDA5LCAweEYyLCAweDBBLCAweEYyLCAweDAxLCAweEE4LCAweDBCLCAweEYyLCAweDA0LCAweEE4LCAweDFBLCAweDAyLCAweDAwLCAweEE4LCAweDE4LCAweDAyLAorCSAweDE3LCAweDAyLCAweERDLCAweDYwLCAweDU4LCAweDRELCAweEI5LCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDI2LCAweDYwLCAweDFBLCAweDY0LAorCSAweDQwLCAweDRCLCAweDM0LCAweDYwLCAweDU4LCAweDRELCAweDA4LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweDIwLCAweDQwLAorCSAweDA4LCAweDJBLCAweDAzLCAweDAwLCAweERDLCAweDYwLCAweEY2LCAweDc4LCAweEZGLCAweEZGLCAweEUzLCAweDYwLCAweDY5LCAweDc4LCAweEZGLCAweEZGLAorCSAweERDLCAweDYwLCAweDU4LCAweDRELCAweEI5LCAweDc4LCAweEZGLCAweEZGLCAweDBCLCAweEYyLCAweDI2LCAweDQ2LCAweDQwLCAweDU5LCAweDAyLCAweDYwLAorCSAweDAwLCAweDYxLCAweDJGLCAweEYyLCAweEExLCAweERCLCAweDMwLCAweEYyLCAweDQxLCAweDU4LCAweDU5LCAweERCLCAweDMxLCAweEYyLCAweDU5LCAweERCLAorCSAweDI2LCAweDQ2LCAweDI2LCAweDYwLCAweDFBLCAweDY0LCAweDQwLCAweDRCLCAweDM0LCAweDYwLCAweDU4LCAweDRELCAweDA4LCAweDc4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweDAzLCAweDY1LCAweEYxLCAweDYwLCAweDU4LCAweDRFLCAweDk2LCAweDc4LCAweEZGLCAweEZGLCAweEU3LCAweDYwLAorCSAweDBCLCAweDc4LCAweEZGLCAweEZGLCAweERDLCAweDYwLCAweDU4LCAweDRELCAweEI5LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY0LCAweDY4LCAweEZCLAorCSAweDIwLCAweDQwLCAweDA4LCAweDJBLCAweDAzLCAweDAwLCAweEQ5LCAweDYwLCAweENBLCAweDc4LCAweEZGLCAweEZGLCAweEUyLCAweDYwLCAweDczLCAweDc4LAorCSAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweEE0LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDBCLCAweDNBLCAweDA2LCAweDAwLCAweDBCLCAweDY0LAorCSAweDE2LCAweDYwLCAweEMyLCAweEZCLCAweDMzLCAweDYwLCAweDQ4LCAweDYyLCAweEEyLCAweERGLCAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDE2LCAweDYwLAorCSAweEMyLCAweEYxLCAweEE1LCAweEQyLCAweDY0LCAweDQwLCAweDBCLCAweDJBLCAweDIwLCAweDAwLCAweDg1LCAweDM2LCAweDBCLCAweDAwLCAweDMyLCAweDNBLAorCSAweDFFLCAweDAwLCAweDYwLCAweDQ3LCAweEZGLCAweEI0LCAweDAyLCAweEE0LCAweEM0LCAweDg1LCAweEE1LCAweEQyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLAorCSAweDg1LCAweDNBLCAweDE1LCAweDAwLCAweDY1LCAweDQ0LCAweDBBLCAweEE0LCAweEEwLCAweEQwLCAweDMzLCAweDYwLCAweDQ2LCAweDYyLCAweDY0LCAweDQwLAorCSAweDE4LCAweDI2LCAweDA5LCAweDAwLCAweEEyLCAweERGLCAweDAxLCAweDY0LCAweDE2LCAweDYwLCAweEMyLCAweEZCLCAweDMyLCAweDQxLCAweDA4LCAweDY1LAorCSAweEI1LCAweDgxLCAweDQxLCAweDUyLCAweDAyLCAweDAwLCAweDAxLCAweDY0LCAweEEyLCAweERCLCAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDMzLCAweDYwLAorCSAweDQ2LCAweDYyLCAweEEyLCAweERGLCAweDAxLCAweDY0LCAweDE2LCAweDYwLCAweEMyLCAweEZCLCAweEY3LCAweDAxLCAweDQ1LCAweDY0LCAweDNCLCAweDQyLAorCSAweDVBLCAweERCLCAweDM1LCAweDYwLCAweEFBLCAweDdDLCAweDM1LCAweDYwLCAweDk4LCAweDYzLCAweEEzLCAweEQ5LCAweDY0LCAweDQxLCAweDJGLCAweDYwLAorCSAweDAyLCAweDYzLCAweEJELCAweEQzLCAweDAwLCAweDdDLCAweDAzLCAweDFCLCAweDI3LCAweDQzLCAweDEwLCAweEEzLCAweEJELCAweEQzLCAweEZGLCAweEZGLAorCSAweDYwLCAweDQ1LCAweDY0LCAweDVGLCAweEExLCAweERCLCAweDY1LCAweDQ0LCAweEJELCAweEQxLCAweEM4LCAweDg0LCAweDU5LCAweEQ4LCAweEZDLCAweDA1LAorCSAweDI3LCAweDQxLCAweDEwLCAweEExLCAweEExLCAweEQxLCAweEZGLCAweEZGLCAweEMxLCAweDgxLCAweDAxLCAweDI2LCAweERELCAweDgxLCAweDQxLCAweDRDLAorCSAweDU5LCAweEQxLCAweDdDLCAweDQ0LCAweEIwLCAweDg0LCAweDU5LCAweEQxLCAweDU5LCAweEQxLCAweEIwLCAweDg0LCAweEIwLCAweDg0LCAweEZGLCAweEZGLAorCSAweDAyLCAweDAyLCAweDY3LCAweDQ0LCAweEMyLCAweDAwLCAweDM0LCAweDYwLCAweDVDLCAweDYzLCAweEQ5LCAweDgxLCAweDU5LCAweEQzLCAweDM4LCAweDYwLAorCSAweDEwLCAweDYyLCAweDAwLCAweEJDLCAweEEyLCAweERGLCAweDA5LCAweDAzLCAweDAxLCAweDdDLCAweEEyLCAweEQ5LCAweDMwLCAweDYwLCAweDE0LCAweDY0LAorCSAweEJELCAweERBLCAweDAwLCAweDYwLCAweDAxLCAweDY0LCAweEJELCAweERBLCAweDU4LCAweDAwLCAweERELCAweDYwLCAweDE4LCAweDY0LCAweEJELCAweERBLAorCSAweDUwLCAweDYwLCAweDAwLCAweDY0LCAweEJELCAweERBLCAweDAxLCAweDYwLCAweEYyLCAweDY0LCAweEJELCAweERBLCAweDAwLCAweDYwLCAweDAxLCAweDY0LAorCSAweEJELCAweERBLCAweDJDLCAweDQxLCAweDU5LCAweEQzLCAweDUwLCAweDYwLCAweDAwLCAweDdDLCAweDYwLCAweDQwLCAweDAyLCAweDJBLCAweDAzLCAweDAwLAorCSAweDAxLCAweDYwLCAweEYyLCAweDY0LCAweDBFLCAweDAwLCAweDA0LCAweDJBLCAweDAzLCAweDAwLCAweDAyLCAweDYwLCAweEYyLCAweDY0LCAweDA5LCAweDAwLAorCSAweDEwLCAweDJBLCAweDAzLCAweDAwLCAweDA0LCAweDYwLCAweEYyLCAweDY0LCAweDA0LCAweDAwLCAweDIwLCAweDJBLCAweDA0LCAweDAwLCAweDA1LCAweDYwLAorCSAweEYyLCAweDY0LCAweEJELCAweEQ5LCAweEJELCAweERCLCAweDAxLCAweDY0LCAweEJELCAweERCLCAweDU5LCAweEQzLCAweDUwLCAweDYwLCAweDAwLCAweDdDLAorCSAweDYwLCAweDQwLCAweDAyLCAweDJBLCAweDAzLCAweDAwLCAweDAxLCAweDYwLCAweEYyLCAweDY0LCAweDBFLCAweDAwLCAweDA0LCAweDJBLCAweDAzLCAweDAwLAorCSAweDAyLCAweDYwLCAweEYyLCAweDY0LCAweDA5LCAweDAwLCAweDEwLCAweDJBLCAweDAzLCAweDAwLCAweDA0LCAweDYwLCAweEYyLCAweDY0LCAweDA0LCAweDAwLAorCSAweDIwLCAweDJBLCAweDA0LCAweDAwLCAweDA1LCAweDYwLCAweEYyLCAweDY0LCAweEJELCAweEQ5LCAweEJELCAweERCLCAweDAxLCAweDY0LCAweEJELCAweERCLAorCSAweDU5LCAweEQzLCAweDUwLCAweDYwLCAweDAwLCAweDdDLCAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDAzLCAweDAwLCAweDAwLCAweDYwLCAweEYyLCAweDY0LAorCSAweDA5LCAweDAwLCAweDAyLCAweDJBLCAweDAzLCAweDAwLCAweDAxLCAweDYwLCAweEYyLCAweDY0LCAweDA0LCAweDAwLCAweDA0LCAweDJBLCAweDAyLCAweDAwLAorCSAweDAyLCAweDYwLCAweEYyLCAweDY0LCAweEJELCAweEQ5LCAweEJELCAweERCLCAweDRCLCAweDAwLCAweDJDLCAweDQxLCAweDU5LCAweEQzLCAweDBGLCAweDYwLAorCSAweDAwLCAweDdDLCAweDYwLCAweDQwLCAweDAyLCAweDJBLCAweDAzLCAweDAwLCAweDAxLCAweDYwLCAweEFDLCAweDY0LCAweDBFLCAweDAwLCAweDA0LCAweDJBLAorCSAweDAzLCAweDAwLCAweDAyLCAweDYwLCAweEFDLCAweDY0LCAweDA5LCAweDAwLCAweDEwLCAweDJBLCAweDAzLCAweDAwLCAweDA0LCAweDYwLCAweEFDLCAweDY0LAorCSAweDA0LCAweDAwLCAweDIwLCAweDJBLCAweDA0LCAweDAwLCAweDA1LCAweDYwLCAweEFDLCAweDY0LCAweEJELCAweEQ5LCAweEJELCAweERCLCAweDAxLCAweDY0LAorCSAweEJELCAweERCLCAweDU5LCAweEQzLCAweDBGLCAweDYwLCAweDAwLCAweDdDLCAweDYwLCAweDQwLCAweDAyLCAweDJBLCAweDAzLCAweDAwLCAweDAxLCAweDYwLAorCSAweEFDLCAweDY0LCAweDBFLCAweDAwLCAweDA0LCAweDJBLCAweDAzLCAweDAwLCAweDAyLCAweDYwLCAweEFDLCAweDY0LCAweDA5LCAweDAwLCAweDEwLCAweDJBLAorCSAweDAzLCAweDAwLCAweDA0LCAweDYwLCAweEFDLCAweDY0LCAweDA0LCAweDAwLCAweDIwLCAweDJBLCAweDA0LCAweDAwLCAweDA1LCAweDYwLCAweEFDLCAweDY0LAorCSAweEJELCAweEQ5LCAweEJELCAweERCLCAweDAxLCAweDY0LCAweEJELCAweERCLCAweDU5LCAweEQzLCAweDBGLCAweDYwLCAweDAwLCAweDdDLCAweDYwLCAweDQwLAorCSAweDAxLCAweDJBLCAweDAzLCAweDAwLCAweDAwLCAweDYwLCAweEFDLCAweDY0LCAweDA5LCAweDAwLCAweDAyLCAweDJBLCAweDAzLCAweDAwLCAweDAxLCAweDYwLAorCSAweEFDLCAweDY0LCAweDA0LCAweDAwLCAweDA0LCAweDJBLCAweDAyLCAweDAwLCAweDAyLCAweDYwLCAweEFDLCAweDY0LCAweEJELCAweEQ5LCAweEJELCAweERCLAorCSAweDFDLCAweDYwLCAweDA4LCAweEYzLCAweEZGLCAweEZGLCAweDAzLCAweDE4LCAweDFBLCAweDYwLCAweDJELCAweEYzLCAweDAzLCAweDAwLCAweDFBLCAweDYwLAorCSAweDFELCAweEYzLCAweEZGLCAweEZGLCAweEJELCAweERBLCAweDM0LCAweDYwLCAweDVDLCAweDY0LCAweDFBLCAweDYwLCAweENGLCAweEZCLCAweDVGLCAweEY1LAorCSAweDAwLCAweDY0LCAweDJCLCAweEZBLCAweDAwLCAweDY0LCAweDJBLCAweEZBLCAweDI3LCAweDQzLCAweDA2LCAweEEzLCAweEJELCAweEQxLCAweDJDLCAweEY4LAorCSAweDMyLCAweEY4LCAweEJELCAweEQxLCAweDJELCAweEY4LCAweDMzLCAweEY4LCAweEEzLCAweEQxLCAweDJFLCAweEY4LCAweDM0LCAweEY4LCAweDAwLCAweEY0LAorCSAweDAxLCAweDYzLCAweDMyLCAweDQwLCAweDA4LCAweDI2LCAweDEwLCAweEJCLCAweDE2LCAweDYwLCAweEMyLCAweEYxLCAweEZGLCAweEZGLCAweDY0LCAweDQwLAorCSAweEZFLCAweDI2LCAweDEwLCAweEJCLCAweDdELCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDBBLCAweDAwLCAweDE5LCAweDYwLAorCSAweDQ1LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAyLCAweDIyLCAweDIwLCAweEJCLCAweDYzLCAweDQ0LCAweEZGLCAweEZGLCAweDA0LCAweDdGLAorCSAweDYwLCAweDQzLCAweDA5LCAweEZDLCAweDI3LCAweDQyLCAweDBDLCAweEEyLCAweDJELCAweDYwLCAweDVBLCAweDYzLCAweEEyLCAweEQzLCAweEEzLCAweEQzLAorCSAweDAwLCAweEJELCAweDAxLCAweDYzLCAweEFDLCAweDgxLCAweDA5LCAweDAzLCAweDA4LCAweDAzLCAweEI4LCAweDYwLCAweDU4LCAweDRELCAweDE1LCAweDc4LAorCSAweEZGLCAweEZGLCAweDAwLCAweEI4LCAweDAxLCAweDYzLCAweDAxLCAweDAzLCAweDYwLCAweDQzLCAweDBFLCAweDYwLCAweDM1LCAweEZELCAweDEyLCAweDYxLAorCSAweDU5LCAweERDLCAweDE2LCAweDYwLCAweEMyLCAweEYzLCAweEZGLCAweDYwLCAweEZGLCAweDdDLCAweDYwLCAweDQwLCAweDBCLCAweDJBLCAweDAyLCAweDAwLAorCSAweDMzLCAweDYwLCAweDI4LCAweDdDLCAweDFBLCAweDYwLCAweEQwLCAweEY5LCAweDM1LCAweDYwLCAweDk4LCAweDY0LCAweDQwLCAweDQ4LCAweEQ5LCAweDgxLAorCSAweEZGLCAweDYwLCAweEYyLCAweDY0LCAweEYxLCAweDYwLCAweDU4LCAweDRELCAweDM0LCAweDc4LCAweEZGLCAweEZGLCAweDVGLCAweEY1LCAweDNGLCAweEZDLAorCSAweERCLCAweDgzLCAweDFBLCAweDYwLCAweDRDLCAweEZELCAweDAwLCAweDdDLCAweDVBLCAweEQ5LCAweDYzLCAweDQxLCAweDM0LCAweDYwLCAweDlDLCAweDYzLAorCSAweDEyLCAweDY1LCAweDAwLCAweEY0LCAweENELCAweDg0LCAweDRDLCAweDkxLCAweDYwLCAweDQzLCAweDYwLCAweEZFLCAweEE1LCAweEQyLCAweERFLCAweDg1LAorCSAweDdGLCAweDI2LCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDA0LCAweDY1LCAweDVELCAweDkzLCAweEEzLCAweERCLCAweDVELCAweDkzLCAweEE1LCAweEQyLAorCSAweEY2LCAweDFGLCAweDVELCAweDkzLCAweDIwLCAweEZFLCAweERGLCAweDgzLCAweDVGLCAweEY1LCAweDI1LCAweDYwLCAweENFLCAweDY0LCAweDEzLCAweDYwLAorCSAweDBELCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDAwLCAweDY2LAorCSAweDQ2LCAweDQ2LCAweEMxLCAweEZFLCAweDA2LCAweDY0LCAweDY4LCAweEZCLCAweDQ2LCAweDY0LCAweDNCLCAweDQyLCAweDVBLCAweERCLCAweDFDLCAweDYwLAorCSAweDkyLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAyLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDAwLCAweDYwLAorCSAweDFDLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweERFLCAweDYwLCAweDg0LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweERFLCAweDYwLCAweENBLCAweDc4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDE1LCAweEYxLCAweDAwLCAweDYwLCAweDA4LCAweDY0LAorCSAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweEY2LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDFDLCAweDYwLCAweDkyLCAweDY0LCAweDEzLCAweDYwLAorCSAweDIyLCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LAorCSAweEEyLCAweERCLCAweDI2LCAweDQ2LCAweDAwLCAweEY0LCAweDBBLCAweEYyLCAweDAwLCAweDYzLCAweDAwLCAweEE4LCAweDY4LCAweEZELCAweDA2LCAweDAyLAorCSAweDA5LCAweEYyLCAweEZGLCAweEZGLCAweDAxLCAweEIwLCAweDAxLCAweDdDLCAweDVBLCAweDAyLCAweDBBLCAweEY4LCAweDBBLCAweEYyLCAweDI2LCAweDQ2LAorCSAweDQwLCAweDU5LCAweDAyLCAweDYwLCAweDAwLCAweDYxLCAweDJGLCAweEYyLCAweEExLCAweERCLCAweDMwLCAweEYyLCAweDQxLCAweDU4LCAweDU5LCAweERCLAorCSAweDMxLCAweEYyLCAweDU5LCAweERCLCAweDI2LCAweDQ2LCAweDI2LCAweDYwLCAweDFBLCAweDY0LCAweDQwLCAweDRCLCAweDM0LCAweDYwLCAweDU4LCAweDRELAorCSAweDA4LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweDA1LCAweDY1LCAweEYxLCAweDYwLCAweDU4LCAweDRFLCAweDk2LCAweDc4LAorCSAweEZGLCAweEZGLCAweEU3LCAweDYwLCAweDBCLCAweDc4LCAweEZGLCAweEZGLCAweDQ3LCAweDY0LCAweDNCLCAweDQyLCAweDVBLCAweERCLCAweEQ5LCAweDYwLAorCSAweENBLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDEwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDIwLCAweDAzLCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweDFDLCAweDYwLCAweDkyLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLAorCSAweDA0LCAweEZGLCAweDI2LCAweDQ2LCAweDI2LCAweDYwLCAweDFBLCAweDY0LCAweDQwLCAweDRCLCAweDM0LCAweDYwLCAweDU4LCAweDRELCAweDA4LCAweDc4LAorCSAweEZGLCAweEZGLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweDAwLCAweDY0LCAweDY4LCAweEZCLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LAorCSAweEEyLCAweERCLCAweDQ5LCAweDY0LCAweDNCLCAweDQyLCAweDVBLCAweERCLCAweERBLCAweDYwLCAweDYyLCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweDYwLAorCSAweEZCLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDAwLCAweDY0LCAweDY4LCAweEZCLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LAorCSAweEEyLCAweERCLCAweDRBLCAweDY0LCAweDNCLCAweDQyLCAweDVBLCAweERCLCAweEQ5LCAweDYwLCAweENBLCAweDc4LCAweEZGLCAweEZGLCAweDQ4LCAweDY0LAorCSAweDNCLCAweDQyLCAweDVBLCAweERCLCAweDBDLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQxLCAweEZGLCAweEIxLCAweEZGLCAweEExLCAweDYwLCAweDQ3LAorCSAweEZGLCAweEI0LCAweDlCLCAweDAyLCAweDlBLCAweDAzLCAweDM0LCAweDYwLCAweEY0LCAweDYzLCAweDEwLCAweDY0LCAweEJELCAweERCLCAweDY2LCAweDQ1LAorCSAweDI2LCAweDQ2LCAweDNGLCAweEYyLCAweDM0LCAweDYwLCAweEYyLCAweDYxLCAweEMyLCAweEEwLCAweEZGLCAweEZGLCAweDAxLCAweDA0LCAweDNFLCAweDY0LAorCSAweDY1LCAweDQ2LCAweDAyLCAweEE0LCAweEExLCAweERCLCAweEM4LCAweDgxLCAweDEyLCAweDY1LCAweENELCAweDg0LCAweDRDLCAweDkxLCAweDYwLCAweDQzLAorCSAweDYwLCAweEZFLCAweEE1LCAweEQyLCAweERFLCAweDg1LCAweDdGLCAweDI2LCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDA0LCAweDY1LCAweDVELCAweDkzLAorCSAweEEzLCAweERCLCAweDVELCAweDkzLCAweEE1LCAweEQyLCAweEY2LCAweDFGLCAweDVELCAweDkzLCAweDIwLCAweEZFLCAweERGLCAweDgzLCAweDBDLCAweEYyLAorCSAweEZGLCAweEZGLCAweDFBLCAweDY1LCAweDYwLCAweDQ3LCAweEZGLCAweEI0LCAweEM0LCAweDg1LCAweERDLCAweDYwLCAweDU4LCAweDRELCAweEM3LCAweDc4LAorCSAweEZGLCAweEZGLCAweDBCLCAweEYyLCAweEZGLCAweEZGLCAweDA3LCAweEI0LCAweDAxLCAweDYxLCAweDAzLCAweDAzLCAweENDLCAweDg0LCAweEUxLCAweDgxLAorCSAweEZELCAweDAyLCAweDYxLCAweDQ0LCAweDk0LCAweEZCLCAweDI3LCAweDQ1LCAweDAyLCAweDYyLCAweDQ2LCAweEQzLCAweDVBLCAweEQxLCAweDYwLCAweDQ3LAorCSAweDU2LCAweEZCLCAweDY0LCAweDQ3LCAweDU1LCAweEZCLCAweDAwLCAweDY0LCAweDVCLCAweEZCLCAweDBDLCAweDYyLCAweDQ2LCAweEQzLCAweDdFLCAweEZCLAorCSAweDBCLCAweEYwLCAweDBGLCAweDYwLCAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweDgzLCAweEZCLCAweDI2LCAweDQ2LCAweDMyLCAweEYwLCAweDdGLCAweEY5LAorCSAweDMzLCAweEYwLCAweDBFLCAweDYzLCAweEM3LCAweDgxLCAweDgwLCAweEY5LCAweDM0LCAweEYwLCAweDgxLCAweEY5LCAweDU5LCAweEQxLCAweEZGLCAweEZGLAorCSAweDY0LCAweDQ0LCAweDAxLCAweDJBLCAweEM4LCAweDg0LCAweDYwLCAweDQzLCAweDMzLCAweDYwLCAweEJDLCAweDY0LCAweDU4LCAweEQ5LCAweDU5LCAweEQxLAorCSAweDU4LCAweEQ5LCAweEZELCAweDFGLCAweDE2LCAweDYwLCAweEMyLCAweEYxLCAweDU5LCAweEQzLCAweDY0LCAweDQwLCAweDAxLCAweDM2LCAweDIyLCAweDY0LAorCSAweDY0LCAweDQwLCAweDAwLCAweDM2LCAweDUwLCAweDk0LCAweEE2LCAweEYxLCAweEZGLCAweEZGLCAweDQ0LCAweDQ3LCAweEE3LCAweDQ2LCAweDNBLCAweEZBLAorCSAweEJCLCAweEZDLCAweEE3LCAweDQ2LCAweDBFLCAweDYwLCAweDM1LCAweEYzLCAweDg1LCAweEZCLCAweDJFLCAweDYwLCAweDJFLCAweDY0LCAweDJELCAweDYwLAorCSAweDhBLCAweDYzLCAweEEwLCAweEQxLCAweEEzLCAweEQ5LCAweDY0LCAweDQxLCAweDU4LCAweEQxLCAweDVCLCAweEQ5LCAweDdELCAweEYzLCAweDY2LCAweDQ1LAorCSAweEE2LCAweEY1LCAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDA4LCAweDAwLCAweDkxLCAweEZBLCAweDYxLCAweDQ0LCAweEZELCAweDYwLCAweDU4LCAweDRFLAorCSAweEFDLCAweDc4LCAweEZGLCAweEZGLCAweDEyLCAweEZBLCAweDA3LCAweDAwLCAweDExLCAweEY4LCAweDY0LCAweDQ0LCAweEZELCAweDYwLCAweDU4LCAweDRFLAorCSAweEFDLCAweDc4LCAweEZGLCAweEZGLCAweDEyLCAweEZBLCAweDY1LCAweDQ2LCAweDMxLCAweEYyLCAweDFELCAweDYwLCAweEMwLCAweDY1LCAweDYwLCAweDQ3LAorCSAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDY2LCAweDQxLCAweDYwLCAweDQ2LCAweDYwLCAweDQzLCAweDA1LCAweEYyLCAweDE2LCAweDE4LAorCSAweDYxLCAweDQ2LCAweDMxLCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDA0LCAweEYyLCAweDBDLCAweDAyLCAweDYxLCAweDQ2LCAweDMwLCAweEYwLAorCSAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDAzLCAweEYyLCAweDA2LCAweDAyLCAweDYxLCAweDQ2LCAweDJGLCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLAorCSAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDgwLCAweEY0LCAweEZGLCAweEZGLCAweDYzLCAweDQ2LCAweEU4LCAweDFCLCAweEE2LCAweEYzLCAweDA4LCAweEZFLAorCSAweDYwLCAweDQzLCAweDYxLCAweDQ2LCAweEE2LCAweEYxLCAweEZGLCAweEZGLCAweEQzLCAweDgwLCAweDMxLCAweEYyLCAweDI3LCAweDAyLCAweDY2LCAweDQxLAorCSAweDFELCAweDYwLCAweEMwLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEE2LCAweEYxLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDY0LCAweDQzLAorCSAweDExLCAweDE4LCAweDYwLCAweDQ2LCAweDAwLCAweEYyLCAweEZGLCAweEZGLCAweEZDLCAweDFCLCAweDY2LCAweDQ0LCAweDY0LCAweDQ2LCAweDgwLCAweEYwLAorCSAweDYwLCAweDQ2LCAweDgwLCAweEY4LCAweDY1LCAweDQ2LCAweDY1LCAweDQzLCAweDgwLCAweEYwLCAweDAxLCAweEZBLCAweDgwLCAweEZDLCAweDY0LCAweDQ2LAorCSAweDgwLCAweEY4LCAweDBCLCAweDAwLCAweDY0LCAweDQ2LCAweDYyLCAweDQzLCAweDAwLCAweEYyLCAweEEzLCAweERCLCAweDYwLCAweDQ2LCAweDgwLCAweEYwLAorCSAweDgxLCAweEZDLCAweDgwLCAweEZDLCAweDY0LCAweDQ2LCAweDgwLCAweEY4LCAweDYwLCAweDQzLCAweDYxLCAweDQ2LCAweDQzLCAweDRCLCAweDAxLCAweDY1LAorCSAweEZELCAweDYwLCAweDU4LCAweDRFLCAweERELCAweDc4LCAweEZGLCAweEZGLCAweDQzLCAweDQ3LCAweDNGLCAweEYyLCAweDAwLCAweEY0LCAweDYwLCAweDQzLAorCSAweEZBLCAweEEzLCAweDAwLCAweDYwLCAweDE3LCAweDYxLCAweDAwLCAweDYwLCAweDAxLCAweDY1LCAweDAxLCAweDYwLCAweEZGLCAweDY0LCAweDQwLCAweDRDLAorCSAweEZELCAweDYwLCAweDU4LCAweDRFLCAweDdBLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweEJCLCAweEZGLCAweEZGLCAweDAwLCAweDAyLCAweDAwLCAweDY0LAorCSAweDQwLCAweDRBLCAweDYwLCAweEZFLCAweDAyLCAweDYwLCAweDAwLCAweDYzLCAweEJELCAweEQzLCAweEJELCAweEQzLCAweDYwLCAweDQxLCAweEZFLCAweDYwLAorCSAweDU4LCAweDRFLCAweDJDLCAweDc4LCAweEZGLCAweEZGLCAweDIwLCAweEZFLCAweDAwLCAweDY1LCAweDAwLCAweDY0LCAweDE5LCAweDYwLCAweDNCLCAweEZCLAorCSAweDAyLCAweDAwLCAweDIwLCAweEZFLCAweEZGLCAweDY1LCAweDAyLCAweDYwLCAweDAwLCAweDYzLCAweDYwLCAweEZFLCAweEJELCAweEQzLCAweEJELCAweEQzLAorCSAweDYwLCAweDQxLCAweDIwLCAweEZFLCAweENELCAweDgxLCAweDYwLCAweDQwLCAweDgwLCAweDJBLCAweDM5LCAweDAwLCAweDdGLCAweEI0LCAweDAyLCAweDNBLAorCSAweDAyLCAweDAwLCAweDAxLCAweDY0LCAweDJFLCAweDAwLCAweDA0LCAweDNBLCAweDAyLCAweDAwLCAweDAyLCAweDY0LCAweDJBLCAweDAwLCAweDBCLCAweDNBLAorCSAweDAyLCAweDAwLCAweDA0LCAweDY0LCAweDI2LCAweDAwLCAweDE2LCAweDNBLCAweDAyLCAweDAwLCAweDA4LCAweDY0LCAweDIyLCAweDAwLCAweDBDLCAweDNBLAorCSAweDAyLCAweDAwLCAweDEwLCAweDY0LCAweDFFLCAweDAwLCAweDEyLCAweDNBLCAweDAyLCAweDAwLCAweDIwLCAweDY0LCAweDFBLCAweDAwLCAweDE4LCAweDNBLAorCSAweDAyLCAweDAwLCAweDQwLCAweDY0LCAweDE2LCAweDAwLCAweDI0LCAweDNBLCAweDAyLCAweDAwLCAweDgwLCAweDY0LCAweDEyLCAweDAwLCAweDMwLCAweDNBLAorCSAweDAyLCAweDAwLCAweDAxLCAweDY3LCAweDBFLCAweDAwLCAweDQ4LCAweDNBLCAweDAyLCAweDAwLCAweDAyLCAweDY3LCAweDBBLCAweDAwLCAweDYwLCAweDNBLAorCSAweDAyLCAweDAwLCAweDA0LCAweDY3LCAweDA2LCAweDAwLCAweDZDLCAweDNBLCAweDAyLCAweDAwLCAweDA4LCAweDY3LCAweDAyLCAweDAwLCAweDAwLCAweDY0LAorCSAweDAwLCAweDAwLCAweDE5LCAweDYwLCAweDNCLCAweEYxLCAweEZGLCAweEZGLCAweEIwLCAweDg0LCAweDE5LCAweDYwLCAweDNCLCAweEZCLCAweDYxLCAweDQwLAorCSAweDAwLCAweDM2LCAweDA1LCAweDAwLCAweDYwLCAweEZFLCAweEJELCAweEQzLCAweEZGLCAweEZGLCAweDIwLCAweEZFLCAweEJCLCAweDAxLCAweDY1LCAweDQwLAorCSAweDAwLCAweDNBLCAweDFFLCAweDAwLCAweDI2LCAweDQ2LCAweDNGLCAweEYyLCAweDAwLCAweEY0LCAweDYwLCAweDQzLCAweEZBLCAweEEzLCAweDAwLCAweDYwLAorCSAweDE3LCAweDYxLCAweDAwLCAweDYwLCAweDMyLCAweDY1LCAweDAxLCAweDYwLCAweEZGLCAweDY0LCAweDQwLCAweDRDLCAweEZELCAweDYwLCAweDU4LCAweDRFLAorCSAweDdBLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweEJCLCAweEZGLCAweEZGLCAweDBCLCAweDAzLCAweDYwLCAweEZFLCAweDAyLCAweDYwLCAweDAwLCAweDYzLAorCSAweEJELCAweEQzLCAweEJELCAweEQzLCAweDYwLCAweDQxLCAweEZFLCAweDYwLCAweDU4LCAweDRFLCAweDJDLCAweDc4LCAweEZGLCAweEZGLCAweDkxLCAweDAxLAorCSAweDIwLCAweEZFLCAweDAwLCAweDY1LCAweEZDLCAweDYwLCAweDU4LCAweDRFLCAweEM3LCAweDc4LCAweEZGLCAweEZGLCAweEExLCAweEYzLCAweEZGLCAweEZGLAorCSAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDA0LCAweDAwLCAweEZELCAweDYwLCAweDU4LCAweDRFLCAweDExLCAweDc4LCAweEZGLCAweEZGLCAweDIwLCAweEZFLAorCSAweDM3LCAweDYwLCAweEY4LCAweDYxLCAweEExLCAweEQxLCAweEExLCAweEYzLCAweDAxLCAweDYwLCAweEFDLCAweDYzLCAweDYwLCAweDQ1LCAweDJBLCAweDQ0LAorCSAweDc5LCAweEZCLCAweEEzLCAweEQ1LCAweDY1LCAweDQwLCAweDAxLCAweDI3LCAweDVCLCAweEQ1LCAweDY1LCAweDQwLCAweDAxLCAweDI3LCAweDU5LCAweEQxLAorCSAweDY2LCAweDQxLCAweEEwLCAweDg0LCAweDI0LCAweDk0LCAweDJCLCAweDQ2LCAweDBGLCAweEZBLCAweDdBLCAweEZCLCAweDE2LCAweDY0LCAweDEyLCAweEZBLAorCSAweDAxLCAweDY0LCAweDExLCAweEZBLCAweDY2LCAweDVDLCAweEMyLCAweDYwLCAweDU4LCAweDRFLCAweDZELCAweDc4LCAweEZGLCAweEZGLCAweDFBLCAweDYwLAorCSAweDIyLCAweEYzLCAweDFBLCAweDYwLCAweDIxLCAweEYxLCAweDYwLCAweDQ3LCAweEIwLCAweDg0LCAweDFDLCAweDYwLCAweDA4LCAweEYxLCAweEZGLCAweEZGLAorCSAweDAxLCAweDE4LCAweDgwLCAweEJDLCAweDE2LCAweDYwLCAweEMyLCAweEYxLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAxLCAweDM2LCAweDIyLCAweDY0LAorCSAweDY0LCAweDQwLCAweDAwLCAweDM2LCAweDUwLCAweDk0LCAweEE3LCAweDQ2LCAweDNBLCAweEZBLCAweEJCLCAweEZDLCAweEE3LCAweDQ2LCAweDgwLCAweDYwLAorCSAweDAzLCAweDY1LCAweDMyLCAweDQwLCAweDA4LCAweDJBLCAweDAzLCAweDY1LCAweEE3LCAweDQ2LCAweDA2LCAweEYwLCAweDdGLCAweDYwLCAweEZGLCAweDY0LAorCSAweEEwLCAweDg0LCAweEI0LCAweDg0LCAweDA2LCAweEZBLCAweEJCLCAweEZDLCAweEE3LCAweDQ2LCAweDI2LCAweDQ2LCAweDJGLCAweEYwLCAweDMwLCAweEYwLAorCSAweDY0LCAweDQzLCAweDMxLCAweEYyLCAweDI3LCAweDQ2LCAweDAzLCAweEZDLCAweDA0LCAweEY4LCAweDA1LCAweEZBLCAweDI2LCAweDQ2LCAweEQ5LCAweDYwLAorCSAweDU4LCAweDRFLCAweEFFLCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDI2LCAweDYwLCAweDFBLCAweDY0LCAweDQwLCAweDRCLCAweDM0LCAweDYwLAorCSAweDU4LCAweDRELCAweDA4LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweDAxLCAweDY0LCAweDhBLCAweEZCLCAweDE2LCAweDYwLAorCSAweEM5LCAweEYzLCAweDIwLCAweDQxLCAweDAwLCAweEJDLCAweDIwLCAweEI5LCAweDAxLCAweDAzLCAweDQxLCAweDQwLCAweDIwLCAweDYwLCAweDE0LCAweDYxLAorCSAweEExLCAweERGLCAweDA0LCAweDY0LCAweEMxLCAweEZFLCAweERCLCAweEZCLCAweEYxLCAweEYzLCAweEZGLCAweEZGLCAweEZFLCAweEI0LCAweEYxLCAweEZCLAorCSAweEY3LCAweDYwLCAweEZGLCAweDY1LCAweDIwLCAweDQ0LCAweDI0LCAweDgwLCAweDA4LCAweDYwLCAweDA4LCAweEYxLCAweDgwLCAweDYwLCAweDAwLCAweDY0LAorCSAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDAxLCAweDY1LCAweEYxLCAweDYwLCAweDU4LCAweDRFLCAweEMzLCAweDc4LCAweEZGLCAweEZGLAorCSAweDMzLCAweDYwLCAweEU2LCAweDY1LCAweEE1LCAweERGLCAweDA4LCAweDYwLCAweDBDLCAweEYxLCAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweEIwLCAweDg0LAorCSAweEEyLCAweERCLCAweENGLCAweEZFLCAweDBDLCAweDY0LCAweDY4LCAweEZCLCAweDAwLCAweDYwLCAweDMxLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLAorCSAweEUxLCAweDYwLCAweDM2LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweDA4LCAweDYwLCAweDI4LCAweEZCLAorCSAweEUxLCAweDYwLCAweEY3LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDY0LCAweDA4LCAweDYwLAorCSAweDI3LCAweEZCLCAweDVBLCAweERCLCAweDA4LCAweDYwLCAweDE1LCAweEYxLCAweDAwLCAweDYwLCAweDAxLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LAorCSAweDBGLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDFCLCAweDYwLCAweEZFLCAweEYzLCAweEZGLCAweEZGLCAweDAzLCAweDFCLCAweEU3LCAweDYwLAorCSAweDJFLCAweDc4LCAweEZGLCAweEZGLCAweEU3LCAweDYwLCAweDJFLCAweDc4LCAweEZGLCAweEZGLCAweEUxLCAweDYwLCAweEU3LCAweDc4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDYwLCAweDEwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweEY4LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweEE2LCAweEYzLAorCSAweEZGLCAweEZGLCAweDAyLCAweEE0LCAweDYwLCAweDQzLCAweDY2LCAweDQxLCAweDYzLCAweDQ2LCAweDA1LCAweEYyLCAweDAwLCAweEYwLCAweDgxLCAweEYwLAorCSAweDAyLCAweDE4LCAweDY0LCAweDQ2LCAweDgxLCAweEY4LCAweDA3LCAweDFCLCAweDFELCAweDYwLCAweEMwLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLAorCSAweEUwLCAweDg0LCAweDQ0LCAweEQ5LCAweDAyLCAweDAwLCAweDY1LCAweDQ2LCAweDAwLCAweEY4LCAweEE2LCAweEYzLCAweDYzLCAweDQ1LCAweDYwLCAweDQ2LAorCSAweDAwLCAweEYyLCAweEZGLCAweEZGLCAweEQ0LCAweDgwLCAweDAxLCAweDE4LCAweEZBLCAweDA0LCAweDgwLCAweEY4LCAweDY1LCAweDQ2LCAweDAwLCAweEZBLAorCSAweDA2LCAweEYyLCAweEZGLCAweEZGLCAweDAwLCAweDdFLCAweDA2LCAweEZBLCAweDYxLCAweDQ2LCAweDRCLCAweDY0LCAweDNCLCAweDQyLCAweDVBLCAweERCLAorCSAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAwLCAweDYwLCAweDk1LCAweEYzLCAweEZGLCAweEZGLCAweDEwLCAweEIwLAorCSAweEZGLCAweEZGLCAweDExLCAweDAzLCAweDA0LCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEUxLCAweDYwLCAweDlCLCAweDY0LAorCSAweDVBLCAweERCLCAweENGLCAweEZFLCAweDA4LCAweDYwLCAweDFCLCAweEYxLCAweDAxLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLAorCSAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDY5LCAweEYzLCAweEZGLCAweEZGLCAweDAxLCAweEIwLCAweEZGLCAweEZGLCAweDExLCAweDAzLAorCSAweDA4LCAweDYwLCAweDBDLCAweEYxLCAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDAyLCAweDYwLAorCSAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEUxLCAweDYwLCAweEIxLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAwLCAweDY0LCAweDY4LCAweEZCLCAweEUyLCAweDYwLAorCSAweDU4LCAweDRFLCAweDEzLCAweDc4LCAweEZGLCAweEZGLCAweDAyLCAweDY0LCAweDhBLCAweEZCLCAweDAyLCAweDY0LCAweEMxLCAweEZFLCAweERCLCAweEZCLAorCSAweEYxLCAweEYzLCAweEZGLCAweEZGLCAweDAxLCAweEJDLCAweEYxLCAweEZCLCAweDAyLCAweDY1LCAweEYxLCAweDYwLCAweDU4LCAweDRFLCAweEMzLCAweDc4LAorCSAweEZGLCAweEZGLCAweDAzLCAweDYwLCAweEU4LCAweDYzLCAweDBFLCAweDYwLCAweDM2LCAweEZELCAweDA4LCAweDYwLCAweDc3LCAweEYzLCAweEZGLCAweEZGLAorCSAweDEzLCAweDFCLCAweDE2LCAweDYwLCAweENDLCAweEYzLCAweDAwLCAweDYxLCAweDYwLCAweDQwLCAweDAwLCAweDM2LCAweDAwLCAweEI5LCAweDYwLCAweDQwLAorCSAweDAxLCAweDM2LCAweDAxLCAweEI5LCAweDYwLCAweDQwLCAweDAyLCAweDM2LCAweDA2LCAweEI5LCAweDYwLCAweDQwLCAweDAzLCAweDM2LCAweDA3LCAweEI5LAorCSAweDQxLCAweDQ0LCAweEQ0LCAweDYwLCAweEY2LCAweDc4LCAweEZGLCAweEZGLCAweEQzLCAweDYwLCAweEQwLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLAorCSAweDIwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweEZGLCAweEZGLCAweDA4LCAweDI0LCAweDQ2LCAweDAxLCAweEEwLCAweDg0LCAweEEyLCAweERCLAorCSAweDAwLCAweDYzLCAweDY4LCAweEZELCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDMwLCAweDAwLCAweDIwLCAweDQwLAorCSAweDA2LCAweDIzLCAweDEwLCAweDAwLCAweDA4LCAweDYwLCAweDI3LCAweEYxLCAweDdGLCAweDYwLCAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLAorCSAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDI4LCAweEZCLCAweEUxLCAweDYwLCAweEY3LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDI3LCAweEZCLCAweDVBLCAweERCLCAweDEwLCAweDYwLCAweDRFLCAweDYyLAorCSAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDQ0LCAweDAxLCAweDFDLCAweDYwLCAweDkyLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAzLCAweDY0LAorCSAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDAwLCAweDY0LCAweDY4LCAweEZCLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LAorCSAweEEyLCAweERCLCAweDAxLCAweDY0LCAweDhBLCAweEZCLCAweEZGLCAweEZGLCAweEMxLCAweEZFLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDUwLCAweDY0LAorCSAweDNCLCAweDQyLCAweDVBLCAweERCLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAwLCAweDYwLCAweDk1LCAweEYzLAorCSAweEZGLCAweEZGLCAweDEwLCAweEIwLCAweEZGLCAweEZGLCAweDExLCAweDAzLCAweDA4LCAweDYwLCAweDFCLCAweEYxLCAweDAxLCAweDYwLCAweDAwLCAweDY0LAorCSAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDA0LCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEUyLCAweDYwLAorCSAweDJBLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEI5LCAweEYxLCAweDBFLCAweDYwLCAweDRCLCAweEY5LAorCSAweDdELCAweEYxLCAweDdDLCAweEY5LCAweDAyLCAweDY0LCAweDhBLCAweEZCLCAweEZGLCAweEZGLCAweEMxLCAweEZFLCAweDhBLCAweEYzLCAweDAwLCAweDY1LAorCSAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDBFLCAweDAzLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDgwLCAweDYwLAorCSAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEUyLCAweDYwLCAweDRBLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDUxLCAweDY0LCAweDNCLCAweDQyLCAweDVBLCAweERCLAorCSAweDFCLCAweDYwLCAweEIwLCAweDY0LCAweDY3LCAweEZCLCAweDFDLCAweDYwLCAweDcyLCAweDYzLCAweDdGLCAweEYzLCAweEJELCAweERCLCAweDgwLCAweEYzLAorCSAweEJELCAweERCLCAweDgxLCAweEYzLCAweEEzLCAweERCLCAweDY3LCAweEYzLCAweDAwLCAweDYwLCAweDg2LCAweEYxLCAweDA0LCAweEE0LCAweDY3LCAweEZCLAorCSAweEQwLCAweDgwLCAweEEwLCAweEQzLCAweDFGLCAweDA3LCAweDQwLCAweDQ3LCAweDYwLCAweDQxLCAweDBFLCAweDY1LCAweDQ1LCAweEQzLCAweDE2LCAweDYwLAorCSAweEMyLCAweEYxLCAweEZGLCAweEZGLCAweDAzLCAweDFCLCAweDEwLCAweEIwLCAweEZGLCAweEZGLCAweEVELCAweDAyLCAweDI3LCAweDQ0LCAweDA2LCAweEE0LAorCSAweDYwLCAweDQxLCAweEExLCAweEQxLCAweDdGLCAweEYzLCAweDgwLCAweEYxLCAweEQwLCAweDgwLCAweDU5LCAweEQzLCAweDA4LCAweDAyLCAweEQwLCAweDgwLAorCSAweDgxLCAweEYzLCAweDU5LCAweEQxLCAweDA0LCAweDAyLCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweEUyLCAweDYwLAorCSAweEU2LCAweDc4LCAweEZGLCAweEZGLCAweDFDLCAweDYwLCAweDcyLCAweDYzLCAweEJELCAweEQzLCAweDdGLCAweEZCLCAweEJELCAweEQzLCAweDgwLCAweEZCLAorCSAweEEzLCAweEQzLCAweDgxLCAweEZCLCAweDUzLCAweDY0LCAweDNCLCAweDQyLCAweDVBLCAweERCLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LAorCSAweEEyLCAweERCLCAweERFLCAweEZFLCAweDBBLCAweDA0LCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEUyLCAweDYwLAorCSAweDlBLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDdDLCAweEYxLCAweDdELCAweEY5LCAweDEzLCAweDYwLAorCSAweDFBLCAweEY5LCAweDBFLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDJELCAweEZGLCAweDIwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLAorCSAweDE2LCAweEZCLCAweEUyLCAweDYwLCAweEM3LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDEwLCAweDYwLAorCSAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweEJFLCAweEZFLCAweDA4LCAweDYwLCAweDA4LCAweEYxLCAweDQwLCAweDYwLCAweDAwLCAweDY0LAorCSAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDAxLCAweDYzLCAweDhBLCAweEZELCAweDA4LCAweDYwLCAweDBDLCAweEYxLCAweDAwLCAweDYwLAorCSAweDAyLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweEMxLCAweEZFLCAweDU0LCAweDY0LCAweDNCLCAweDQyLCAweDVBLCAweERCLAorCSAweDMxLCAweDQ0LCAweEY5LCAweEI0LCAweDQwLCAweDUxLCAweEUxLCAweDYwLCAweDIyLCAweDc4LCAweEZGLCAweEZGLCAweDI3LCAweDQzLCAweDMzLCAweDYwLAorCSAweEJFLCAweDY1LCAweEE1LCAweEQzLCAweDY1LCAweDQxLCAweDEwLCAweEEzLCAweDAxLCAweEE0LCAweEZFLCAweEI0LCAweEM0LCAweDg1LCAweEZFLCAweEExLAorCSAweEJELCAweEQzLCAweDU5LCAweEQxLCAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweEQ1LCAweDgwLCAweDAyLCAweDAyLCAweDA0LCAweDAzLCAweEY4LCAweDAxLAorCSAweEUyLCAweDYwLCAweDczLCAweDc4LCAweEZGLCAweEZGLCAweDU1LCAweDY0LCAweDNCLCAweDQyLCAweDVBLCAweERCLCAweDEwLCAweDYwLCAweDJBLCAweDYyLAorCSAweDAwLCAweDY0LCAweEEyLCAweERCLCAweERFLCAweEZFLCAweDBBLCAweDA0LCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLAorCSAweEUyLCAweDYwLCAweEZFLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDI3LCAweEQxLCAweDdELCAweEY5LAorCSAweDEzLCAweDYwLCAweDFBLCAweEY5LCAweDBFLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDJELCAweEZGLCAweDIwLCAweDYwLCAweDAwLCAweDY0LAorCSAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEUzLCAweDYwLCAweDIwLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweEJFLCAweEZFLCAweDA4LCAweDYwLCAweDA4LCAweEYxLCAweDQwLCAweDYwLAorCSAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDA3LCAweDYwLCAweEQwLCAweDY0LCAweDBFLCAweDYwLCAweDRCLCAweEZCLAorCSAweDFDLCAweDYwLCAweDkyLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAyLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLAorCSAweDI3LCAweDQzLCAweDA2LCAweEEzLCAweEJELCAweEQzLCAweDdGLCAweEZCLCAweEJELCAweEQzLCAweDgwLCAweEZCLCAweEEzLCAweEQzLCAweDgxLCAweEZCLAorCSAweDMxLCAweDQ0LCAweEY5LCAweEI0LCAweDQwLCAweDUxLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAxLCAweDYwLAorCSAweDA0LCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEUzLCAweDYwLCAweDUxLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweEI5LCAweEYxLCAweDBFLCAweDYwLCAweDRCLCAweEY5LCAweDA4LCAweDYwLCAweDE1LCAweEYxLCAweEZFLCAweDYwLCAweEZGLCAweDYxLAorCSAweEExLCAweDg0LCAweDVBLCAweEQxLCAweDRBLCAweERCLCAweEExLCAweDg0LCAweDVBLCAweERCLCAweDA4LCAweDYwLCAweDE1LCAweEYxLCAweDAwLCAweDYwLAorCSAweDA0LCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDA1LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweEUyLCAweDYwLCAweDczLCAweDc4LAorCSAweEZGLCAweEZGLCAweDdELCAweEYxLCAweDMyLCAweDYwLCAweDdBLCAweDYxLCAweEExLCAweEQzLCAweDY0LCAweDQwLCAweDAxLCAweDI3LCAweDU5LCAweEQzLAorCSAweDMyLCAweDYwLCAweDdFLCAweDYxLCAweEZELCAweDYwLCAweDU4LCAweDRFLCAweEFDLCAweDc4LCAweEZGLCAweEZGLCAweEExLCAweERCLCAweDI3LCAweDQyLAorCSAweDBDLCAweEEyLCAweEEyLCAweEQzLCAweDE2LCAweDYwLCAweEFELCAweEYzLCAweDAwLCAweEJELCAweDAxLCAweDYzLCAweEFDLCAweDgxLCAweDA5LCAweDAzLAorCSAweDA4LCAweDAzLCAweEI4LCAweDYwLCAweDU4LCAweDRELCAweDE1LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweEI4LCAweDAxLCAweDYzLCAweDAxLCAweDAzLAorCSAweDYwLCAweDQzLCAweDBFLCAweDYwLCAweDM1LCAweEZELCAweDVGLCAweEY1LCAweDAwLCAweDY0LCAweDJCLCAweEZBLCAweDIwLCAweDY0LCAweDJBLCAweEZBLAorCSAweDI3LCAweDQzLCAweDA2LCAweEEzLCAweEJELCAweEQxLCAweDJDLCAweEY4LCAweDMyLCAweEY4LCAweEJELCAweEQxLCAweDJELCAweEY4LCAweDMzLCAweEY4LAorCSAweEEzLCAweEQxLCAweDJFLCAweEY4LCAweDM0LCAweEY4LCAweEVBLCAweEYxLCAweDJGLCAweEY4LCAweEVCLCAweEYxLCAweDMwLCAweEY4LCAweEVDLCAweEYxLAorCSAweDMxLCAweEY4LCAweEI5LCAweEYxLCAweDE5LCAweEY4LCAweEY4LCAweDYwLCAweDgwLCAweDY0LCAweDBFLCAweEZBLCAweDAwLCAweEY0LCAweDAxLCAweDYzLAorCSAweDMyLCAweDQwLCAweDA4LCAweDI2LCAweDEwLCAweEJCLCAweDE2LCAweDYwLCAweEMyLCAweEYxLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweEZFLCAweDI2LAorCSAweDEwLCAweEJCLCAweDdELCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDBBLCAweDAwLCAweDE5LCAweDYwLCAweDQ1LCAweEYzLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAyLCAweDIyLCAweDIwLCAweEJCLCAweDYzLCAweDQ0LCAweEZGLCAweEZGLCAweDA0LCAweDdGLCAweDYwLCAweDQzLAorCSAweDA5LCAweEZDLCAweDBFLCAweDYwLCAweDM1LCAweEYzLCAweDEyLCAweDYxLCAweDU5LCAweERBLCAweDFDLCAweDYwLCAweDcyLCAweDYzLCAweEJELCAweEQxLAorCSAweDU5LCAweEQ4LCAweEJELCAweEQxLCAweDU5LCAweEQ4LCAweEEzLCAweEQxLCAweDU5LCAweEQ4LCAweDM1LCAweDYwLCAweDk4LCAweDY0LCAweDQwLCAweDQ4LAorCSAweEQ5LCAweDgxLCAweEZGLCAweDYwLCAweEYyLCAweDY0LCAweEYxLCAweDYwLCAweDU4LCAweDRELCAweDM0LCAweDc4LCAweEZGLCAweEZGLCAweDVGLCAweEY1LAorCSAweDNGLCAweEZDLCAweERCLCAweDgzLCAweDFBLCAweDYwLCAweDRDLCAweEZELCAweDIwLCAweDdDLCAweDVBLCAweEQ5LCAweDYzLCAweDQxLCAweDM0LCAweDYwLAorCSAweDlDLCAweDYzLCAweDEyLCAweDY1LCAweDAwLCAweEY0LCAweENELCAweDg0LCAweDRDLCAweDkxLCAweDYwLCAweDQzLCAweDYwLCAweEZFLCAweEE1LCAweEQyLAorCSAweERFLCAweDg1LCAweDdGLCAweDI2LCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDA0LCAweDY1LCAweDVELCAweDkzLCAweEEzLCAweERCLCAweDVELCAweDkzLAorCSAweEE1LCAweEQyLCAweEY2LCAweDFGLCAweDVELCAweDkzLCAweDIwLCAweEZFLCAweERGLCAweDgzLCAweDVGLCAweEY1LCAweDI1LCAweDYwLCAweENFLCAweDY0LAorCSAweDEzLCAweDYwLCAweDBELCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLAorCSAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweEMxLCAweEZFLCAweDE2LCAweDY0LCAweDY4LCAweEZCLCAweDU2LCAweDY0LCAweDNCLCAweDQyLCAweDVBLCAweERCLAorCSAweDBFLCAweDYwLCAweDM4LCAweEYzLCAweEZGLCAweEZGLCAweDY0LCAweEE0LCAweEEyLCAweERCLCAweDBFLCAweDYwLCAweDM4LCAweEYxLCAweDBFLCAweDYwLAorCSAweDRCLCAweEY5LCAweDFDLCAweDYwLCAweDkyLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAyLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLAorCSAweDA0LCAweEZGLCAweDAwLCAweDYwLCAweDFDLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEU0LCAweDYwLCAweDIzLCAweDY0LCAweDVBLCAweERCLAorCSAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDE1LCAweEYxLCAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweEEwLCAweDgwLAorCSAweDlDLCAweDg0LCAweDBFLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDU3LCAweDY0LCAweDNCLCAweDQyLCAweDVBLCAweERCLCAweDAwLCAweDY0LAorCSAweDY4LCAweEZCLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweEUyLCAweDYwLCAweDczLCAweDc4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDYwLCAweDEwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDE2LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDFDLCAweDYwLAorCSAweDkyLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDU4LCAweDY0LAorCSAweDNCLCAweDQyLCAweDVBLCAweERCLCAweDAwLCAweDY0LCAweDY4LCAweEZCLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLAorCSAweEU2LCAweDYwLCAweDM2LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDA4LCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDNELCAweDAzLAorCSAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDFDLCAweDYwLCAweDkyLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLAorCSAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDAwLCAweDY0LCAweDY4LCAweEZCLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLAorCSAweDI2LCAweDQ2LCAweDAwLCAweEY0LCAweDBBLCAweEYyLCAweDA5LCAweEYyLCAweDA0LCAweDFCLCAweDAxLCAweEIwLCAweDAxLCAweDdDLCAweDJELCAweDAyLAorCSAweDBBLCAweEY4LCAweDU5LCAweDY0LCAweDNCLCAweDQyLCAweDVBLCAweERCLCAweDBBLCAweEYyLCAweDI2LCAweDQ2LCAweDQwLCAweDU5LCAweDAyLCAweDYwLAorCSAweDAwLCAweDYxLCAweDJGLCAweEYyLCAweEExLCAweERCLCAweDMwLCAweEYyLCAweDQxLCAweDU4LCAweDU5LCAweERCLCAweDMxLCAweEYyLCAweDU5LCAweERCLAorCSAweDI2LCAweDQ2LCAweDI2LCAweDYwLCAweDFBLCAweDY0LCAweDQwLCAweDRCLCAweDM0LCAweDYwLCAweDU4LCAweDRELCAweDA4LCAweDc4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweDA1LCAweDY1LCAweEYxLCAweDYwLCAweDU4LCAweDRFLCAweDk2LCAweDc4LCAweEZGLCAweEZGLCAweEU3LCAweDYwLAorCSAweDBCLCAweDc4LCAweEZGLCAweEZGLCAweEUyLCAweDYwLCAweDczLCAweDc4LCAweEZGLCAweEZGLCAweDVBLCAweDY0LCAweDNCLCAweDQyLCAweDVBLCAweERCLAorCSAweDc4LCAweDQzLCAweDAyLCAweDYxLCAweDI5LCAweDYwLCAweEVBLCAweDc4LCAweEZGLCAweEZGLCAweDVCLCAweDY0LCAweDNCLCAweDQyLCAweDVBLCAweERCLAorCSAweDBDLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQxLCAweEZGLCAweEIxLCAweEZGLCAweEExLCAweDYwLCAweDQ3LCAweEZGLCAweEI0LCAweEM4LCAweDAyLAorCSAweEM3LCAweDAzLCAweDM0LCAweDYwLCAweEY0LCAweDYzLCAweDMwLCAweDY0LCAweEJELCAweERCLCAweDY2LCAweDQ1LCAweDI2LCAweDQ2LCAweDNGLCAweEYyLAorCSAweDM0LCAweDYwLCAweEYyLCAweDYxLCAweEMyLCAweEEwLCAweEZGLCAweEZGLCAweDAxLCAweDA0LCAweDNFLCAweDY0LCAweDY1LCAweDQ2LCAweDAyLCAweEE0LAorCSAweEExLCAweERCLCAweEM4LCAweDgxLCAweDEyLCAweDY1LCAweENELCAweDg0LCAweDRDLCAweDkxLCAweDYwLCAweDQzLCAweDYwLCAweEZFLCAweEE1LCAweEQyLAorCSAweERFLCAweDg1LCAweDdGLCAweDI2LCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDA0LCAweDY1LCAweDVELCAweDkzLCAweEEzLCAweERCLCAweDVELCAweDkzLAorCSAweEE1LCAweEQyLCAweEY2LCAweDFGLCAweDVELCAweDkzLCAweDIwLCAweEZFLCAweERGLCAweDgzLCAweDBDLCAweEYyLCAweEZGLCAweEZGLCAweDFBLCAweDY1LAorCSAweDYwLCAweDQ3LCAweEZGLCAweEI0LCAweEM0LCAweDg1LCAweERDLCAweDYwLCAweDU4LCAweDRELCAweEM3LCAweDc4LCAweEZGLCAweEZGLCAweDBCLCAweEYyLAorCSAweEZGLCAweEZGLCAweDA3LCAweEI0LCAweDAxLCAweDYxLCAweDAzLCAweDAzLCAweENDLCAweDg0LCAweEUxLCAweDgxLCAweEZELCAweDAyLCAweDYxLCAweDQ0LAorCSAweDk0LCAweEZCLCAweDI3LCAweDQ1LCAweDAyLCAweDYyLCAweDQ2LCAweEQzLCAweDVBLCAweEQxLCAweDYwLCAweDQ3LCAweDU2LCAweEZCLCAweDY0LCAweDQ3LAorCSAweDU1LCAweEZCLCAweDAwLCAweDY0LCAweDVCLCAweEZCLCAweDBDLCAweDYyLCAweDQ2LCAweEQzLCAweDdFLCAweEZCLCAweDBCLCAweEYwLCAweDBGLCAweDYwLAorCSAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweDgzLCAweEZCLCAweDFDLCAweDYwLCAweDZBLCAweDYyLCAweEEyLCAweEQzLCAweDg1LCAweEZCLCAweDI2LCAweDQ2LAorCSAweDMyLCAweEYwLCAweDdGLCAweEY5LCAweDMzLCAweEYwLCAweDgwLCAweEY5LCAweDM0LCAweEYwLCAweDgxLCAweEY5LCAweDJFLCAweDYwLCAweDJFLCAweDY0LAorCSAweDJELCAweDYwLCAweDhBLCAweDYzLCAweEEwLCAweEQxLCAweEEzLCAweEQ5LCAweDY0LCAweDQxLCAweDU4LCAweEQxLCAweDVCLCAweEQ5LCAweDdELCAweEYzLAorCSAweDY2LCAweDQ1LCAweEE2LCAweEY1LCAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDA4LCAweDAwLCAweDkxLCAweEZBLCAweDYxLCAweDQ0LCAweEZELCAweDYwLAorCSAweDU4LCAweDRFLCAweEFDLCAweDc4LCAweEZGLCAweEZGLCAweDEyLCAweEZBLCAweDA3LCAweDAwLCAweDExLCAweEY4LCAweDY0LCAweDQ0LCAweEZELCAweDYwLAorCSAweDU4LCAweDRFLCAweEFDLCAweDc4LCAweEZGLCAweEZGLCAweDEyLCAweEZBLCAweDY1LCAweDQ2LCAweEE2LCAweEYzLCAweEZGLCAweEZGLCAweDAyLCAweEE0LAorCSAweDQwLCAweDRCLCAweDNGLCAweEYyLCAweDAwLCAweEY0LCAweDYwLCAweDQzLCAweEZBLCAweEEzLCAweDAwLCAweDYwLCAweDE3LCAweDYxLCAweDAwLCAweDYwLAorCSAweDAxLCAweDY1LCAweDAxLCAweDYwLCAweEZGLCAweDY0LCAweDQwLCAweDRDLCAweEZELCAweDYwLCAweDU4LCAweDRFLCAweDdBLCAweDc4LCAweEZGLCAweEZGLAorCSAweDAwLCAweEJCLCAweEZGLCAweEZGLCAweDAwLCAweDAyLCAweDAwLCAweDY0LCAweDQwLCAweDRBLCAweDYwLCAweEZFLCAweDAyLCAweDYwLCAweDAwLCAweDYzLAorCSAweEJELCAweEQzLCAweEJELCAweEQzLCAweDYwLCAweDQxLCAweEZFLCAweDYwLCAweDU4LCAweDRFLCAweDJDLCAweDc4LCAweEZGLCAweEZGLCAweDIwLCAweEZFLAorCSAweDAwLCAweDY1LCAweDAwLCAweDY0LCAweDE5LCAweDYwLCAweDNCLCAweEZCLCAweDAyLCAweDAwLCAweDIwLCAweEZFLCAweEZGLCAweDY1LCAweDAyLCAweDYwLAorCSAweDAwLCAweDYzLCAweDYwLCAweEZFLCAweEJELCAweEQzLCAweEJELCAweEQzLCAweDYwLCAweDQxLCAweDIwLCAweEZFLCAweENELCAweDgxLCAweDYwLCAweDQwLAorCSAweDgwLCAweDJBLCAweDM5LCAweDAwLCAweDdGLCAweEI0LCAweDAyLCAweDNBLCAweDAyLCAweDAwLCAweDAxLCAweDY0LCAweDJFLCAweDAwLCAweDA0LCAweDNBLAorCSAweDAyLCAweDAwLCAweDAyLCAweDY0LCAweDJBLCAweDAwLCAweDBCLCAweDNBLCAweDAyLCAweDAwLCAweDA0LCAweDY0LCAweDI2LCAweDAwLCAweDE2LCAweDNBLAorCSAweDAyLCAweDAwLCAweDA4LCAweDY0LCAweDIyLCAweDAwLCAweDBDLCAweDNBLCAweDAyLCAweDAwLCAweDEwLCAweDY0LCAweDFFLCAweDAwLCAweDEyLCAweDNBLAorCSAweDAyLCAweDAwLCAweDIwLCAweDY0LCAweDFBLCAweDAwLCAweDE4LCAweDNBLCAweDAyLCAweDAwLCAweDQwLCAweDY0LCAweDE2LCAweDAwLCAweDI0LCAweDNBLAorCSAweDAyLCAweDAwLCAweDgwLCAweDY0LCAweDEyLCAweDAwLCAweDMwLCAweDNBLCAweDAyLCAweDAwLCAweDAxLCAweDY3LCAweDBFLCAweDAwLCAweDQ4LCAweDNBLAorCSAweDAyLCAweDAwLCAweDAyLCAweDY3LCAweDBBLCAweDAwLCAweDYwLCAweDNBLCAweDAyLCAweDAwLCAweDA0LCAweDY3LCAweDA2LCAweDAwLCAweDZDLCAweDNBLAorCSAweDAyLCAweDAwLCAweDA4LCAweDY3LCAweDAyLCAweDAwLCAweDAwLCAweDY0LCAweDAwLCAweDAwLCAweDE5LCAweDYwLCAweDNCLCAweEYxLCAweEZGLCAweEZGLAorCSAweEIwLCAweDg0LCAweDE5LCAweDYwLCAweDNCLCAweEZCLCAweDYxLCAweDQwLCAweDAwLCAweDM2LCAweDA1LCAweDAwLCAweDYwLCAweEZFLCAweEJELCAweEQzLAorCSAweEZGLCAweEZGLCAweDIwLCAweEZFLCAweEJCLCAweDAxLCAweDY1LCAweDQwLCAweDAwLCAweDNBLCAweDFFLCAweDAwLCAweDI2LCAweDQ2LCAweDNGLCAweEYyLAorCSAweDAwLCAweEY0LCAweDYwLCAweDQzLCAweEZBLCAweEEzLCAweDAwLCAweDYwLCAweDE3LCAweDYxLCAweDAwLCAweDYwLCAweDMyLCAweDY1LCAweDAxLCAweDYwLAorCSAweEZGLCAweDY0LCAweDQwLCAweDRDLCAweEZELCAweDYwLCAweDU4LCAweDRFLCAweDdBLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweEJCLCAweEZGLCAweEZGLAorCSAweDBCLCAweDAzLCAweDYwLCAweEZFLCAweDAyLCAweDYwLCAweDAwLCAweDYzLCAweEJELCAweEQzLCAweEJELCAweEQzLCAweDYwLCAweDQxLCAweEZFLCAweDYwLAorCSAweDU4LCAweDRFLCAweDJDLCAweDc4LCAweEZGLCAweEZGLCAweDkxLCAweDAxLCAweDIwLCAweEZFLCAweDAwLCAweDY1LCAweEZDLCAweDYwLCAweDU4LCAweDRFLAorCSAweEM3LCAweDc4LCAweEZGLCAweEZGLCAweEExLCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDA0LCAweDAwLCAweEZELCAweDYwLAorCSAweDU4LCAweDRFLCAweDExLCAweDc4LCAweEZGLCAweEZGLCAweDIwLCAweEZFLCAweDM3LCAweDYwLCAweEY4LCAweDYxLCAweEExLCAweEQxLCAweEExLCAweEYzLAorCSAweDAxLCAweDYwLCAweEFDLCAweDYzLCAweDYwLCAweDQ1LCAweDJBLCAweDQ0LCAweDc5LCAweEZCLCAweEEzLCAweEQ1LCAweDY1LCAweDQwLCAweDAxLCAweDI3LAorCSAweDVCLCAweEQ1LCAweDY1LCAweDQwLCAweDAxLCAweDI3LCAweDU5LCAweEQxLCAweDY2LCAweDQxLCAweEEwLCAweDg0LCAweDI0LCAweDk0LCAweDJCLCAweDQ2LAorCSAweDBGLCAweEZBLCAweDdBLCAweEZCLCAweDE2LCAweDY0LCAweDEyLCAweEZBLCAweDAxLCAweDY0LCAweDExLCAweEZBLCAweDY2LCAweDVDLCAweEMyLCAweDYwLAorCSAweDU4LCAweDRFLCAweDZELCAweDc4LCAweEZGLCAweEZGLCAweEE2LCAweEYzLCAweEZGLCAweEZGLCAweDAyLCAweEE0LCAweDQwLCAweDRCLCAweDYwLCAweDQ2LAorCSAweDAwLCAweDY0LCAweDE3LCAweEZBLCAweDAwLCAweDY0LCAweDE2LCAweEZBLCAweDEzLCAweEZBLCAweDAwLCAweDY1LCAweDI2LCAweDQ2LCAweEZELCAweDYwLAorCSAweDU4LCAweDRFLCAweERELCAweDc4LCAweEZGLCAweEZGLCAweEE2LCAweEYzLCAweDFELCAweDYwLCAweEMwLCAweDY1LCAweDAyLCAweEE0LCAweDYwLCAweDQ2LAorCSAweDA1LCAweEYwLCAweDYwLCAweDQxLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDAwLCAweDdDLCAweDQ0LCAweEQ5LCAweDI2LCAweDQ2LAorCSAweDMxLCAweEYyLCAweDYxLCAweDVDLCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQ5LCAweDI2LCAweDQ2LCAweDJGLCAweEYwLAorCSAweDYxLCAweDQ2LCAweDAzLCAweEY4LCAweDI2LCAweDQ2LCAweDMwLCAweEYwLCAweDYxLCAweDQ2LCAweDA0LCAweEY4LCAweDI2LCAweDQ2LCAweDMxLCAweEYwLAorCSAweDYxLCAweDQ2LCAweDA1LCAweEY4LCAweDI2LCAweDQ2LCAweEQ5LCAweDYwLCAweDU4LCAweDRFLCAweEFFLCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LAorCSAweDI2LCAweDYwLCAweDFBLCAweDY0LCAweDQwLCAweDRCLCAweDM0LCAweDYwLCAweDU4LCAweDRELCAweDA4LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY2LAorCSAweDQ2LCAweDQ2LCAweDAzLCAweDY1LCAweEYxLCAweDYwLCAweDU4LCAweDRFLCAweEMzLCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDYzLCAweDhBLCAweEZELAorCSAweDA4LCAweDYwLCAweDBDLCAweEYxLCAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweEMxLCAweEZFLAorCSAweDVDLCAweDY0LCAweDNCLCAweDQyLCAweDVBLCAweERCLCAweEUxLCAweDYwLCAweDIyLCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweDYwLCAweEY3LCAweDY1LAorCSAweDIwLCAweDQ0LCAweDI0LCAweDgwLCAweERBLCAweDYwLCAweDc0LCAweDc4LCAweEZGLCAweEZGLCAweERCLCAweEYzLCAweEZGLCAweEZGLCAweEZELCAweEEwLAorCSAweDJBLCAweEYyLCAweDAzLCAweDAzLCAweEU2LCAweDYwLCAweERFLCAweDc4LCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweEIwLCAweDM2LCAweDExLCAweDAwLAorCSAweEMwLCAweDM2LCAweDAyLCAweDAwLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDI2LCAweDYwLCAweDFBLCAweDY0LCAweDQwLCAweDRCLAorCSAweDM0LCAweDYwLCAweDU4LCAweDRELCAweDA4LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweERBLCAweDYwLCAweDc0LCAweDc4LAorCSAweEZGLCAweEZGLCAweDY2LCAweDQ1LCAweDAwLCAweEY0LCAweDBBLCAweEYyLCAweDBCLCAweEYyLCAweEZFLCAweEEwLCAweEYzLCAweEEwLCAweDY3LCAweDAyLAorCSAweDYwLCAweDQxLCAweDA5LCAweEYyLCAweDFELCAweDAzLCAweDAwLCAweEEwLCAweEZGLCAweEEwLCAweDRCLCAweDAzLCAweDVELCAweDAzLCAweDAwLCAweEEwLAorCSAweEZGLCAweEZGLCAweDQ3LCAweDAzLCAweDAxLCAweDY0LCAweDEwLCAweDYwLCAweDBCLCAweEZCLCAweDBELCAweDY0LCAweDEwLCAweDYwLCAweDBDLCAweEZCLAorCSAweDAzLCAweDY0LCAweDEwLCAweDYwLCAweDBELCAweEZCLCAweDI2LCAweDQ2LCAweDI2LCAweDYwLCAweDFBLCAweDY0LCAweDQwLCAweDRCLCAweDM0LCAweDYwLAorCSAweDU4LCAweDRELCAweDA4LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweERBLCAweDYwLCAweDc0LCAweDc4LCAweEZGLCAweEZGLAorCSAweDE2LCAweDYwLCAweEMzLCAweEYzLCAweEZGLCAweEZGLCAweEZFLCAweEEwLCAweDIwLCAweDYwLCAweDE2LCAweDYxLCAweDE1LCAweDAyLCAweDAxLCAweDY0LAorCSAweEExLCAweERCLCAweDAwLCAweDY0LCAweDEwLCAweDYwLCAweDBDLCAweEZCLCAweDAxLCAweDY0LCAweDEwLCAweDYwLCAweDBELCAweEZCLCAweDI2LCAweDQ2LAorCSAweDI2LCAweDYwLCAweDFBLCAweDY0LCAweDQwLCAweDRCLCAweDM0LCAweDYwLCAweDU4LCAweDRELCAweDA4LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY2LAorCSAweDQ2LCAweDQ2LCAweERBLCAweDYwLCAweDc0LCAweDc4LCAweEZGLCAweEZGLCAweDAyLCAweDY0LCAweEExLCAweERCLCAweDAwLCAweDY0LCAweDEwLCAweDYwLAorCSAweDBDLCAweEZCLCAweDAxLCAweDY0LCAweDEwLCAweDYwLCAweDBELCAweEZCLCAweDI2LCAweDQ2LCAweDI2LCAweDYwLCAweDFBLCAweDY0LCAweDQwLCAweDRCLAorCSAweDM0LCAweDYwLCAweDU4LCAweDRELCAweDA4LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweERBLCAweDYwLCAweDc0LCAweDc4LAorCSAweEZGLCAweEZGLCAweDY1LCAweDQ2LCAweDA3LCAweEY0LCAweDA2LCAweEYyLCAweEZGLCAweEZGLCAweDAxLCAweDdFLCAweDA2LCAweEZBLCAweDY1LCAweDQ2LAorCSAweDI2LCAweDQ2LCAweDI2LCAweDYwLCAweDFBLCAweDY0LCAweDQwLCAweDRCLCAweDM0LCAweDYwLCAweDU4LCAweDRELCAweDA4LCAweDc4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweERDLCAweDYwLCAweDA5LCAweDc4LCAweEZGLCAweEZGLCAweDBBLCAweEYyLAorCSAweDA5LCAweEYyLCAweEZDLCAweEEwLCAweEZGLCAweEEwLCAweDExLCAweDAyLCAweDBBLCAweDAyLCAweDBCLCAweEYyLCAweDY1LCAweDQ2LCAweDBBLCAweDFCLAorCSAweDY2LCAweDQxLCAweDA3LCAweEY0LCAweDA2LCAweEYyLCAweEZGLCAweEZGLCAweDAxLCAweDdFLCAweDA2LCAweEZBLCAweDYxLCAweDQ2LCAweERBLCAweDYwLAorCSAweDc0LCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDY1LCAweDQ2LCAweDY4LCAweEYxLCAweDJBLCAweEYyLAorCSAweDY0LCAweDQxLCAweDYwLCAweDQwLCAweEEwLCAweDNBLCAweDAyLCAweDAwLCAweDA4LCAweEIxLCAweDA0LCAweDAwLCAweEMwLCAweDNBLCAweDBCLCAweDAwLAorCSAweDA0LCAweEIxLCAweEZGLCAweEZGLCAweDFFLCAweDAzLCAweDA4LCAweDYwLCAweDE1LCAweEYxLCAweDAwLCAweDYwLCAweDEwLCAweDY0LCAweEIwLCAweDg0LAorCSAweEEyLCAweERCLCAweENGLCAweEZFLCAweDE2LCAweDAwLCAweEIwLCAweDNBLCAweDAyLCAweDAwLCAweDAxLCAweDY1LCAweDA3LCAweDAwLCAweDEwLCAweDNBLAorCSAweDAyLCAweDAwLCAweDAyLCAweDY1LCAweDAzLCAweDAwLCAweDMwLCAweDNBLCAweDBDLCAweDAwLCAweDEwLCAweDY1LCAweEE1LCAweDgwLCAweEZGLCAweEZGLAorCSAweDA4LCAweDAzLCAweDA4LCAweDYwLCAweDE1LCAweEYxLCAweDAwLCAweDYwLCAweDA4LCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLAorCSAweDAwLCAweDY2LCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDE2LCAweDYwLCAweEMzLCAweEYzLCAweEZGLCAweEZGLCAweEZDLCAweEEwLCAweEZGLCAweEZGLAorCSAweDE0LCAweDA0LCAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweDA4LCAweDYwLCAweDE2LCAweEZCLCAweEU3LCAweDYwLCAweDFCLCAweDY0LCAweDVBLCAweERCLAorCSAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweEE1LCAweEYxLCAweDAxLCAweDYwLCAweDAwLCAweDY0LCAweEEwLCAweDgwLAorCSAweEZGLCAweEZGLCAweDAzLCAweDAzLCAweERBLCAweDYwLCAweDc0LCAweDc4LCAweEZGLCAweEZGLCAweDIwLCAweDQwLCAweDA4LCAweDJBLCAweDAzLCAweDAwLAorCSAweEQ5LCAweDYwLCAweENBLCAweDc4LCAweEZGLCAweEZGLCAweEUyLCAweDYwLCAweDczLCAweDc4LCAweEZGLCAweEZGLCAweDRFLCAweDY0LCAweDNCLCAweDQyLAorCSAweDVBLCAweERCLCAweDJFLCAweEY1LCAweEZGLCAweEZGLCAweDI3LCAweEYyLCAweDFELCAweDYwLCAweEMwLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLAorCSAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDY2LCAweDQxLCAweDYwLCAweDQ2LCAweDYwLCAweDQzLCAweDA1LCAweEYyLCAweDE2LCAweDE4LCAweDYxLCAweDQ2LAorCSAweDI3LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDA0LCAweEYyLCAweDBDLCAweDAyLCAweDYxLCAweDQ2LCAweDI2LCAweEYwLCAweDYzLCAweDQ2LAorCSAweEQwLCAweDgwLCAweDAzLCAweEYyLCAweDA2LCAweDAyLCAweDYxLCAweDQ2LCAweDI1LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweEZGLCAweEZGLAorCSAweDA3LCAweDAzLCAweDgwLCAweEY0LCAweEZGLCAweEZGLCAweDYzLCAweDQ2LCAweEU4LCAweDFCLCAweEE2LCAweEYzLCAweDA4LCAweEZFLCAweDYwLCAweDQzLAorCSAweDYxLCAweDQ2LCAweDI1LCAweEYyLCAweDI2LCAweEYwLCAweEE3LCAweEYyLCAweEE4LCAweEYwLCAweDY1LCAweEY1LCAweEZGLCAweEZGLCAweDAwLCAweEY0LAorCSAweEZGLCAweEZGLCAweDg5LCAweEY4LCAweDY1LCAweEY1LCAweEZGLCAweEZGLCAweDA3LCAweEZDLCAweDJDLCAweEZBLCAweDJELCAweEY4LCAweEFFLCAweEZBLAorCSAweEVBLCAweEYzLCAweDJGLCAweEZBLCAweEVCLCAweEYzLCAweDMwLCAweEZBLCAweEVDLCAweEYzLCAweDMxLCAweEZBLCAweDdGLCAweEYzLCAweDMyLCAweEZBLAorCSAweDgwLCAweEYzLCAweDMzLCAweEZBLCAweDgxLCAweEYzLCAweDM0LCAweEZBLCAweDFCLCAweDYwLCAweEZFLCAweEYzLCAweEZGLCAweEZGLCAweDAzLCAweDFCLAorCSAweDAwLCAweDYwLCAweEEwLCAweDY0LCAweDAyLCAweDAwLCAweDAwLCAweDYwLCAweEMwLCAweDY0LCAweDJBLCAweEZBLCAweDAyLCAweDYzLCAweDNGLCAweEZDLAorCSAweEFCLCAweEZDLCAweDAwLCAweDY0LCAweDNFLCAweEZBLCAweEM5LCAweEYxLCAweDE5LCAweEY4LCAweDI1LCAweDYwLCAweENFLCAweDY0LCAweDEzLCAweDYwLAorCSAweDBELCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDAwLCAweDY2LAorCSAweDQ2LCAweDQ2LCAweEMxLCAweEZFLCAweDEwLCAweDYwLCAweDJBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweEUxLCAweDYwLCAweDM0LCAweDc4LAorCSAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDNBLCAweDYxLCAweEI2LCAweDYwLCAweDU4LCAweDRELCAweDIyLCAweDc4LCAweEZGLCAweEZGLCAweDY2LCAweDQ0LAorCSAweDYxLCAweEZCLCAweEE2LCAweEYzLCAweDA3LCAweEZBLCAweDBDLCAweDYwLCAweDgwLCAweDY0LCAweEI5LCAweEYxLCAweDE5LCAweEY4LCAweDBFLCAweEZBLAorCSAweDAwLCAweDY0LCAweDNFLCAweEZBLCAweDNGLCAweEZBLCAweDAwLCAweDYwLCAweDNBLCAweDYxLCAweEI2LCAweDYwLCAweDU4LCAweDRELCAweDIyLCAweDc4LAorCSAweEZGLCAweEZGLCAweDY2LCAweDQ0LCAweDYwLCAweEZCLCAweEE2LCAweEYzLCAweDA3LCAweEZBLCAweDBDLCAweDYwLCAweDgwLCAweDY0LCAweDBFLCAweEZBLAorCSAweEI5LCAweEYxLCAweDE5LCAweEY4LCAweDAwLCAweDY0LCAweDNFLCAweEZBLCAweDNGLCAweEZBLCAweEU4LCAweDYwLCAweEVBLCAweDY0LCAweDA4LCAweDYwLAorCSAweDMzLCAweEZCLCAweDAwLCAweDYwLCAweDgwLCAweDY0LCAweDA4LCAweDYwLCAweDEwLCAweEZCLCAweEU3LCAweDYwLCAweENCLCAweDY0LCAweDVBLCAweERCLAorCSAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDE2LCAweDYwLCAweDg3LCAweEYzLCAweEZGLCAweEZGLCAweDAxLCAweEE4LCAweDAzLCAweEE4LAorCSAweDA0LCAweDAzLCAweDAzLCAweDAzLCAweEU4LCAweDYwLCAweERDLCAweDc4LCAweEZGLCAweEZGLCAweDA0LCAweDYwLCAweDAwLCAweDY1LCAweDIwLCAweDQ0LAorCSAweDM0LCAweDgwLCAweDEwLCAweDYwLCAweDFFLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDlCLCAweEZFLCAweDAzLCAweDA1LCAweDIwLCAweDQwLAorCSAweDRCLCAweDIzLCAweDBBLCAweDAwLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDEwLCAweEZCLCAweEU3LCAweDYwLCAweEQ5LCAweDY0LAorCSAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweDEzLCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLAorCSAweDAxLCAweDJBLCAweDA3LCAweDAwLCAweDkwLCAweDYwLCAweDAwLCAweDY1LCAweDIwLCAweDQ0LCAweDM0LCAweDgwLCAweDAwLCAweDY0LCAweEEyLCAweERCLAorCSAweDA0LCAweDAwLCAweDEwLCAweDYwLCAweDAwLCAweDY1LCAweDIwLCAweDQ0LCAweDM0LCAweDgwLCAweDhBLCAweEYzLCAweDU4LCAweEZCLCAweDgyLCAweEYxLAorCSAweEJBLCAweEZFLCAweDAxLCAweEE4LCAweDU5LCAweEY5LCAweDA0LCAweDAyLCAweDAyLCAweDY0LCAweDhBLCAweEZCLCAweEZGLCAweEZGLCAweEMxLCAweEZFLAorCSAweDY0LCAweDQ3LCAweERCLCAweEYzLCAweDEwLCAweEIwLCAweDA0LCAweEE4LCAweDJCLCAweDAyLCAweDJBLCAweDAyLCAweDYxLCAweEY1LCAweEVBLCAweEYxLAorCSAweDJGLCAweEY4LCAweEVCLCAweEYxLCAweDMwLCAweEY4LCAweEVDLCAweEYxLCAweDMxLCAweEY4LCAweDdGLCAweEYxLCAweDJDLCAweEY4LCAweDMyLCAweEY4LAorCSAweDgwLCAweEYxLCAweDJELCAweEY4LCAweDMzLCAweEY4LCAweDgxLCAweEYxLCAweDJFLCAweEY4LCAweDM0LCAweEY4LCAweDEwLCAweDYwLCAweDQ4LCAweDY0LAorCSAweDJBLCAweEZBLCAweDI1LCAweDYwLCAweENFLCAweDY0LCAweDEzLCAweDYwLCAweDBELCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LAorCSAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEMxLCAweEZFLCAweDAwLCAweDYwLCAweDAxLCAweDY0LCAweDA4LCAweDYwLCAweDEwLCAweEZCLAorCSAweEU4LCAweDYwLCAweDM2LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDEwLCAweDY3LCAweDgyLCAweEZCLAorCSAweDhBLCAweEYzLCAweEZGLCAweEZGLCAweDAwLCAweEE4LCAweEZGLCAweEZGLCAweDBBLCAweDAzLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLAorCSAweDEwLCAweEZCLCAweEU4LCAweDYwLCAweDM4LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDEwLCAweDYwLAorCSAweDFFLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDA1LCAweDdDLCAweDUzLCAweEY5LCAweDJGLCAweDYwLCAweDI0LCAweDY0LCAweDU0LCAweEZCLAorCSAweDE5LCAweDYwLCAweDQwLCAweEYzLCAweEZGLCAweEZGLCAweDE1LCAweDE4LCAweDEwLCAweDYwLCAweDFFLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLAorCSAweDA4LCAweDYwLCAweDEyLCAweEYxLCAweDAwLCAweDYwLCAweDEwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDEwLCAweDYwLAorCSAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDEwLCAweEZCLCAweEU4LCAweDYwLCAweDY5LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweDQxLCAweEYzLCAweEZGLCAweDYwLCAweDgwLCAweDY1LCAweEE0LCAweDgwLCAweDVBLCAweEQzLCAweDA1LCAweDAyLAorCSAweDA0LCAweDFCLCAweDVBLCAweEQzLCAweEZGLCAweEZGLCAweDAxLCAweDFCLCAweDE1LCAweDAwLCAweDEwLCAweDYwLCAweDFFLCAweDYyLCAweDAwLCAweDY0LAorCSAweEEyLCAweERCLCAweDA4LCAweDYwLCAweDEyLCAweEYxLCAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLAorCSAweDEwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDEwLCAweEZCLCAweEU4LCAweDYwLCAweDhBLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDU5LCAweEYzLCAweDgyLCAweEZCLCAweDYwLCAweDQwLCAweDEwLCAweDI3LCAweERBLCAweEZFLAorCSAweERCLCAweEYzLCAweDAwLCAweEE4LCAweDA0LCAweEE4LCAweDIzLCAweDAyLCAweDIyLCAweDAyLCAweDYwLCAweEY1LCAweEVBLCAweEYxLCAweDJGLCAweEY4LAorCSAweEVCLCAweEYxLCAweDMwLCAweEY4LCAweEVDLCAweEYxLCAweDMxLCAweEY4LCAweDdGLCAweEYxLCAweDJDLCAweEY4LCAweDgwLCAweEYxLCAweDJELCAweEY4LAorCSAweDgxLCAweEYxLCAweDJFLCAweEY4LCAweEE0LCAweDY0LCAweDJBLCAweEZBLCAweDgzLCAweEYxLCAweEMwLCAweDY3LCAweEIwLCAweDg0LCAweDJCLCAweEZBLAorCSAweDI1LCAweDYwLCAweENFLCAweDY0LCAweDEzLCAweDYwLCAweDBELCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLAorCSAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEMxLCAweEZFLCAweDIwLCAweDYwLCAweDAwLCAweDY1LCAweDIwLCAweDQ0LCAweDM0LCAweDgwLCAweDAwLCAweDYwLAorCSAweDA0LCAweDYxLCAweEI2LCAweDYwLCAweDU4LCAweDRELCAweDIyLCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDY0LCAweDIzLCAweEZBLCAweEYxLCAweDYwLAorCSAweDAyLCAweDY0LCAweDI0LCAweEZBLCAweDI2LCAweDYwLCAweDBBLCAweDY0LCAweDEzLCAweDYwLCAweDBELCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLAorCSAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEZBLCAweEZFLCAweEVCLCAweDYwLCAweEZGLCAweDY1LCAweDIwLCAweDQ0LAorCSAweDI0LCAweDgwLCAweDA4LCAweDYwLCAweDA4LCAweEYxLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLAorCSAweDU4LCAweEYzLCAweDhBLCAweEZCLCAweEZGLCAweEZGLCAweEMxLCAweEZFLCAweDEwLCAweDYwLCAweDFFLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLAorCSAweDAwLCAweDYwLCAweDgwLCAweDY0LCAweDA4LCAweDYwLCAweDEwLCAweEZCLCAweEU3LCAweDYwLCAweENCLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDlDLCAweEYxLCAweDAwLCAweDY0LCAweEIwLCAweDg2LCAweDlDLCAweEZCLCAweDA3LCAweDAzLCAweDI2LCAweDYwLAorCSAweDFBLCAweDY0LCAweDQwLCAweDRCLCAweDM0LCAweDYwLCAweDU4LCAweDRELCAweDA4LCAweDc4LCAweEZGLCAweEZGLCAweEVCLCAweDYwLCAweEZGLCAweDY1LAorCSAweDIwLCAweDQ0LCAweDI0LCAweDgwLCAweDEwLCAweDYwLCAweDFFLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAwLCAweDYwLCAweDgwLCAweDY0LAorCSAweDA4LCAweDYwLCAweDEwLCAweEZCLCAweEU3LCAweDYwLCAweENCLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDk1LCAweEYzLCAweDI2LCAweDQ2LCAweDYwLCAweDQzLCAweDAxLCAweDJBLCAweDIwLCAweDAwLCAweDBGLCAweEYyLCAweDJBLCAweEYwLCAweDYwLCAweDQwLAorCSAweDEwLCAweDJBLCAweDBGLCAweDAwLCAweDY0LCAweDQwLCAweDA0LCAweDI3LCAweDE4LCAweDAwLCAweEZELCAweEIzLCAweDY0LCAweDQwLCAweDIwLCAweDI3LAorCSAweDAyLCAweEJCLCAweDA4LCAweDYwLCAweDFCLCAweEYxLCAweDAwLCAweDYwLCAweDA4LCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLAorCSAweDBCLCAweDAwLCAweEZCLCAweEIzLCAweDY0LCAweDQwLCAweDIwLCAweDI3LCAweDA0LCAweEJCLCAweDA4LCAweDYwLCAweDFCLCAweEYxLCAweDAwLCAweDYwLAorCSAweDEwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDk1LCAweEZELCAweDI2LCAweDQ2LCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweERCLCAweEYzLCAweDNGLCAweEYyLCAweDA0LCAweEE4LCAweDU3LCAweEZCLCAweDAyLCAweDAzLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweEY0LAorCSAweDFFLCAweDYzLCAweDA4LCAweDY0LCAweDQwLCAweDQ4LCAweEJELCAweEQyLCAweEZGLCAweEZGLCAweDYwLCAweDQ3LCAweDA1LCAweDM2LCAweDBCLCAweDAwLAorCSAweEZGLCAweEI1LCAweEM3LCAweDgzLCAweDAxLCAweDJBLCAweEY3LCAweDAxLCAweDRGLCAweEQyLCAweDVCLCAweEQyLCAweDYwLCAweDQwLCAweDA1LCAweDM3LAorCSAweDBCLCAweDAwLCAweERGLCAweDgzLCAweEY1LCAweDAxLCAweEZGLCAweEI1LCAweDY1LCAweDQxLCAweEEzLCAweEQyLCAweDQ3LCAweDhBLCAweDYwLCAweDQ3LAorCSAweDQwLCAweDRDLCAweDVCLCAweEQyLCAweERGLCAweDgzLCAweDA4LCAweDAwLCAweDQwLCAweDRDLCAweDAwLCAweDdGLCAweERDLCAweDg1LCAweDQ3LCAweDhBLAorCSAweDYwLCAweDQxLCAweDVCLCAweEQyLCAweERCLCAweDgzLCAweDYwLCAweDQ3LCAweDAxLCAweEIwLCAweEZFLCAweEI1LCAweDAyLCAweDAzLCAweDAyLCAweDY0LAorCSAweDQwLCAweDQ4LCAweDJDLCAweDQ3LCAweEZGLCAweEI0LCAweDczLCAweEYxLCAweDA4LCAweDI4LCAweDczLCAweEZCLCAweDgzLCAweEYxLCAweDY1LCAweDQ0LAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEZELCAweEExLCAweEUxLCAweDgxLCAweEUxLCAweDgxLCAweEUxLCAweDg1LCAweEM0LCAweDgxLAorCSAweEQwLCAweDg0LCAweEQxLCAweDgwLCAweDI4LCAweDA3LCAweDI3LCAweDA2LCAweDlDLCAweDg0LCAweERDLCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LAorCSAweEU4LCAweDg1LCAweDk0LCAweEYzLCAweEM3LCAweDgzLCAweDAxLCAweDI2LCAweDYwLCAweDQ3LCAweEFCLCAweDgzLCAweEZDLCAweEEzLCAweDAyLCAweDAwLAorCSAweDAzLCAweDA0LCAweDAwLCAweEY0LCAweDg0LCAweEEzLCAweEZDLCAweDAxLCAweDgwLCAweDY1LCAweDQ3LCAweEQwLCAweDI4LCAweDQxLCAweEEwLCAweDgwLAorCSAweEZFLCAweEExLCAweDE0LCAweDAzLCAweDA4LCAweDAyLCAweDA4LCAweDYwLCAweDJELCAweEYxLCAweDAwLCAweDYwLCAweDEwLCAweDY0LCAweEIwLCAweDg0LAorCSAweEEyLCAweERCLCAweENGLCAweEZFLCAweDFCLCAweDAwLCAweDA4LCAweDYwLCAweDJELCAweEYxLCAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweEIwLCAweDg0LAorCSAweEEyLCAweERCLCAweENGLCAweEZFLCAweDEzLCAweDAwLCAweDI4LCAweDQxLCAweEZFLCAweEExLCAweEZGLCAweEZGLCAweDA4LCAweDAzLCAweDA4LCAweDYwLAorCSAweDJELCAweEYxLCAweDAwLCAweDYwLCAweDA4LCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDA3LCAweDAwLCAweDA4LCAweDYwLAorCSAweDJELCAweEYxLCAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDA4LCAweDYwLCAweDFCLCAweEYxLAorCSAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDI2LCAweDQ2LCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDA4LCAweDYwLCAweDFCLCAweEYxLCAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDFCLCAweEYxLCAweDAyLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDYzLCAweDk1LCAweEZELCAweDFDLCAweDYwLCAweDlFLCAweDYzLCAweDAwLCAweDY0LCAweEEzLCAweERCLAorCSAweDA2LCAweEEzLCAweDEwLCAweDYwLCAweDk4LCAweDY0LCAweEJELCAweERCLCAweEJELCAweERCLCAweDA2LCAweDY0LCAweEEzLCAweERCLCAweEU5LCAweDYwLAorCSAweEI4LCAweDY0LCAweDA4LCAweDYwLCAweDRCLCAweEZCLCAweENFLCAweEYxLCAweDBFLCAweDYwLCAweDUxLCAweEY5LCAweDFDLCAweDYwLCAweEFBLCAweDYzLAorCSAweDAwLCAweDY0LCAweEEzLCAweERCLCAweDA2LCAweEEzLCAweDEwLCAweDYwLCAweDlDLCAweDY0LCAweEJELCAweERCLCAweEJELCAweERCLCAweDA2LCAweDY0LAorCSAweEEzLCAweERCLCAweEU5LCAweDYwLCAweEMxLCAweDY0LCAweDA4LCAweDYwLCAweDRELCAweEZCLCAweDE2LCAweDYwLCAweEFFLCAweEYxLCAweDBFLCAweDYwLAorCSAweDU3LCAweEY5LCAweDAwLCAweDYwLCAweDNBLCAweDYxLCAweEI2LCAweDYwLCAweDU4LCAweDRELCAweDIyLCAweDc4LCAweEZGLCAweEZGLCAweDY2LCAweDQ0LAorCSAweDYzLCAweEZCLCAweEE2LCAweEYzLCAweDA3LCAweEZBLCAweEI5LCAweEYzLCAweDE5LCAweEZBLCAweEY4LCAweDYwLCAweDgwLCAweDY0LCAweDBFLCAweEZBLAorCSAweDAwLCAweDY0LCAweDNFLCAweEZBLCAweDNGLCAweEZBLCAweDAwLCAweDYwLCAweDNBLCAweDYxLCAweEI2LCAweDYwLCAweDU4LCAweDRELCAweDIyLCAweDc4LAorCSAweEZGLCAweEZGLCAweDY2LCAweDQ0LCAweDY0LCAweEZCLCAweEE2LCAweEYzLCAweDA3LCAweEZBLCAweEI5LCAweEYzLCAweDE5LCAweEZBLCAweDI0LCAweDYwLAorCSAweDgwLCAweDY0LCAweDBFLCAweEZBLCAweDAwLCAweDY0LCAweDNFLCAweEZBLCAweDNGLCAweEZBLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDJELCAweEZCLAorCSAweDVBLCAweERCLCAweEVBLCAweDYwLCAweDFGLCAweDY0LCAweDA4LCAweDYwLCAweDM3LCAweEZCLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDYzLAorCSAweDk1LCAweEZELCAweEJBLCAweEZFLCAweEZFLCAweDYwLCAweEZGLCAweDY1LCAweDIwLCAweDQ0LCAweDI0LCAweDgwLCAweDgyLCAweEZELCAweDA4LCAweDYwLAorCSAweDE1LCAweEYxLCAweDA0LCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDAwLCAweDY0LCAweDA4LCAweDYwLAorCSAweDFCLCAweEZCLCAweDVBLCAweERCLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDE2LCAweDYwLCAweEFCLCAweEYzLCAweEZGLCAweEZGLCAweDAxLCAweEE4LAorCSAweEZGLCAweEZGLCAweDA1LCAweDAzLCAweDE5LCAweDYwLCAweEYwLCAweEYxLCAweDBFLCAweDYwLCAweDU3LCAweEY5LCAweDA0LCAweDAwLCAweDE2LCAweDYwLAorCSAweEFFLCAweEYxLCAweDBFLCAweDYwLCAweDU3LCAweEY5LCAweDE2LCAweDYwLCAweEFCLCAweEYzLCAweEZGLCAweEZGLCAweDA5LCAweDFCLCAweDAwLCAweDY0LAorCSAweDgyLCAweEZCLCAweEJBLCAweEZFLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDFCLCAweEZCLCAweDVBLCAweERCLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweEJBLCAweEZFLCAweDk1LCAweEYzLCAweDAwLCAweDYzLCAweDgyLCAweEZELCAweDEwLCAweEJDLCAweDk1LCAweEZCLCAweEZFLCAweDYwLCAweEZGLCAweDY1LAorCSAweDIwLCAweDQ0LCAweDI0LCAweDgwLCAweDA4LCAweDYwLCAweDA4LCAweEYxLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLAorCSAweENGLCAweEZFLCAweDAwLCAweDYwLCAweDY0LCAweDYzLCAweDBFLCAweDYwLCAweDM3LCAweEZELCAweDEwLCAweDYwLCAweDM2LCAweDYyLCAweDAwLCAweDY0LAorCSAweEEyLCAweERCLCAweDAxLCAweDYwLCAweDA0LCAweDY0LCAweDA4LCAweDYwLCAweDFDLCAweEZCLCAweEVBLCAweDYwLCAweDczLCAweDY0LCAweDVBLCAweERCLAorCSAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDFCLCAweEYxLCAweDAxLCAweDYwLCAweDAwLCAweDY0LCAweEEwLCAweDgwLAorCSAweDlDLCAweDg0LCAweDAzLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweEEyLCAweDAxLCAweDMxLCAweDQwLCAweDA0LCAweDJBLCAweEU1LCAweDAxLAorCSAweDIwLCAweDQwLCAweDEyLCAweDIzLCAweDExLCAweDAwLCAweDEwLCAweDYwLCAweDM2LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDEwLCAweDYwLAorCSAweDVBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDgxLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDFDLCAweEZCLCAweEVBLCAweDYwLAorCSAweDczLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweERELCAweDAxLCAweDEwLCAweDYwLCAweDM2LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLAorCSAweDAxLCAweDYwLCAweDAwLCAweDY1LCAweDIwLCAweDQ0LCAweDM0LCAweDgwLCAweDY0LCAweEY1LCAweEI5LCAweEYxLCAweDE5LCAweEY4LCAweDdGLCAweEYxLAorCSAweDJDLCAweEY4LCAweDMyLCAweEY4LCAweDgwLCAweEYxLCAweDJELCAweEY4LCAweDMzLCAweEY4LCAweDgxLCAweEYxLCAweDJFLCAweEY4LCAweDM0LCAweEY4LAorCSAweEVBLCAweEYxLCAweDJGLCAweEY4LCAweEVCLCAweEYxLCAweDMwLCAweEY4LCAweEVDLCAweEYxLCAweDMxLCAweEY4LCAweDExLCAweDYwLCAweDQ4LCAweDY0LAorCSAweDJBLCAweEZBLCAweDAwLCAweDY0LCAweDJCLCAweEZBLCAweDIzLCAweEZBLCAweDI1LCAweDYwLCAweENFLCAweDY0LCAweDEzLCAweDYwLCAweDBELCAweEZCLAorCSAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEMxLCAweEZFLCAweDAwLCAweDYwLAorCSAweDAxLCAweDY0LCAweDA4LCAweDYwLCAweDFDLCAweEZCLCAweEVBLCAweDYwLCAweEM5LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweDY0LCAweEY1LCAweDIzLCAweEYyLCAweEZGLCAweEZGLCAweDAxLCAweDE4LCAweDgyLCAweDAxLCAweDEwLCAweDY3LCAweDgyLCAweEZCLAorCSAweDAzLCAweDY0LCAweDk2LCAweEZCLCAweEZFLCAweDYwLCAweEZGLCAweDY1LCAweDIwLCAweDQ0LCAweDI0LCAweDgwLCAweDA4LCAweDYwLCAweDA4LCAweEYxLAorCSAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDEwLCAweDYwLCAweDM2LCAweDYyLCAweDAwLCAweDY0LAorCSAweEEyLCAweERCLCAweDgxLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDFDLCAweEZCLCAweEVBLCAweDYwLCAweEVBLCAweDY0LCAweDVBLCAweERCLAorCSAweENGLCAweEZFLCAweDBDLCAweDAwLCAweDA4LCAweDYwLCAweDFCLCAweEYxLCAweDAxLCAweDYwLCAweDAwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LAorCSAweDA1LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweEVBLCAweDYwLCAweDFGLCAweDc4LCAweEZGLCAweEZGLCAweDA2LCAweDYwLCAweDAwLCAweDY1LAorCSAweDIwLCAweDQxLCAweDhDLCAweEYzLCAweEE1LCAweDgwLCAweDAxLCAweEIwLCAweDAxLCAweDAyLCAweDA2LCAweDAwLCAweDEwLCAweDYwLCAweDM2LCAweDYyLAorCSAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDFDLCAweDYwLCAweDZFLCAweDY1LCAweEE1LCAweEQzLCAweDAxLCAweDYzLAorCSAweDhBLCAweEZELCAweDI2LCAweDFCLCAweDAwLCAweDYwLCAweDY0LCAweDY0LCAweEE1LCAweERCLCAweDY0LCAweEY1LCAweEI5LCAweEYxLCAweDE5LCAweEY4LAorCSAweDdGLCAweEYxLCAweDJDLCAweEY4LCAweDMyLCAweEY4LCAweDgwLCAweEYxLCAweDJELCAweEY4LCAweDMzLCAweEY4LCAweDgxLCAweEYxLCAweDJFLCAweEY4LAorCSAweDM0LCAweEY4LCAweEVBLCAweEYxLCAweDJGLCAweEY4LCAweEVCLCAweEYxLCAweDMwLCAweEY4LCAweEVDLCAweEYxLCAweDMxLCAweEY4LCAweDExLCAweDYwLAorCSAweDQ4LCAweDY0LCAweDJBLCAweEZBLCAweDAwLCAweDY0LCAweDJCLCAweEZBLCAweDIzLCAweEZBLCAweDI1LCAweDYwLCAweENFLCAweDY0LCAweDEzLCAweDYwLAorCSAweDBELCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDA2LCAweDAwLAorCSAweDk1LCAweEYzLCAweDMyLCAweDQwLCAweDAyLCAweDI2LCAweDAyLCAweDAwLCAweDQwLCAweDJBLCAweERBLCAweEZFLCAweEMxLCAweEZFLCAweDEwLCAweDYwLAorCSAweDM2LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAxLCAweDYwLCAweDgyLCAweDY0LCAweDA4LCAweDYwLCAweDFDLCAweEZCLCAweEVCLCAweDYwLAorCSAweDQ1LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDFCLCAweEYxLCAweDAxLCAweDYwLAorCSAweDAwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDA1LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweEVBLCAweDYwLCAweDFGLCAweDc4LAorCSAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDA2LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLAorCSAweEJBLCAweEZFLCAweEVELCAweDYwLCAweDZELCAweDc4LCAweEZGLCAweEZGLCAweDAyLCAweDY0LCAweDhBLCAweEZCLCAweDAxLCAweDYwLCAweDAwLCAweDY1LAorCSAweDIwLCAweDQ0LCAweDM0LCAweDgwLCAweEJBLCAweEZFLCAweEMxLCAweEZFLCAweDEwLCAweDYwLCAweDM2LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLAorCSAweDEwLCAweDYwLCAweDVBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAxLCAweDYwLCAweDQ2LCAweDY0LCAweDA4LCAweDYwLCAweDFDLCAweEZCLAorCSAweEVCLCAweDYwLCAweDc2LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDFCLCAweEYxLAorCSAweDAxLCAweDYwLCAweDAwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDA1LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweEVBLCAweDYwLAorCSAweDFGLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDQ1LCAweDAzLCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweDA4LCAweDYwLCAweDJELCAweEYxLCAweDAwLCAweDYwLCAweDA4LCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDBGLCAweDAzLAorCSAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDA4LCAweDYwLCAweDFCLCAweEYxLCAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LAorCSAweDA1LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweEVELCAweDYwLCAweDZELCAweDc4LCAweEZGLCAweEZGLCAweDMxLCAweDAxLCAweDAwLCAweDYwLAorCSAweDAyLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDBCLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDE2LCAweDYwLCAweEFDLCAweEYxLAorCSAweDk1LCAweEYzLCAweDAwLCAweDYxLCAweEQxLCAweDgwLCAweEY3LCAweEI0LCAweEYxLCAweDAzLCAweDk1LCAweEZCLCAweDMzLCAweDAwLCAweDAwLCAweDYwLAorCSAweDEwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDBFLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDE2LCAweDYwLCAweEFDLCAweEYxLAorCSAweDk1LCAweEYzLCAweDAwLCAweDYxLCAweEQxLCAweDgwLCAweDA4LCAweEJDLCAweDAzLCAweDAyLCAweEVDLCAweDYwLCAweDlDLCAweDc4LCAweEZGLCAweEZGLAorCSAweDk1LCAweEZCLCAweDIwLCAweDAwLCAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDA1LCAweDAzLCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweEVDLCAweDYwLCAweDlDLCAweDc4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDFCLCAweEYxLCAweDAwLCAweDYwLCAweDQwLCAweDY0LAorCSAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDAzLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweEM4LCAweDAxLCAweDAwLCAweDYwLCAweDAyLCAweDY0LAorCSAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDA1LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweEVELCAweDYwLCAweDZELCAweDc4LCAweEZGLCAweEZGLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDAyLCAweDYzLCAweDk1LCAweEYzLCAweDhBLCAweEZELCAweDAxLCAweEJDLCAweEMxLCAweEZFLCAweDk1LCAweEZCLAorCSAweENFLCAweEYxLCAweDBFLCAweDYwLCAweDUxLCAweEY5LCAweDEwLCAweDYwLCAweDM2LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDEwLCAweDYwLAorCSAweDVBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAxLCAweDYwLCAweDM0LCAweDY0LCAweDA4LCAweDYwLCAweDFDLCAweEZCLCAweEVDLCAweDYwLAorCSAweDA1LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDFDLCAweDYwLCAweDlFLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAyLCAweDY0LAorCSAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDFCLCAweEYxLCAweDAxLCAweDYwLAorCSAweDAwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDBELCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDFDLCAweDYwLCAweDlFLCAweDY0LAorCSAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweEVBLCAweDYwLCAweDFGLCAweDc4LAorCSAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDEwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDIyLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLAorCSAweDk1LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDA0LCAweDJBLCAweDAxLCAweDAwLCAweEQ1LCAweDAxLCAweDFDLCAweDYwLCAweDlFLCAweDY0LAorCSAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDk1LCAweEYzLCAweEZGLCAweEZGLAorCSAweDYwLCAweDQwLCAweDA4LCAweDJBLCAweDAxLCAweDAwLCAweDY4LCAweDAwLCAweDA4LCAweDYwLCAweDFCLCAweEYxLCAweDAwLCAweDYwLCAweDAyLCAweDY0LAorCSAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDU5LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweEVELCAweDYwLCAweDZELCAweDc4LCAweEZGLCAweEZGLAorCSAweDA4LCAweDYwLCAweDJELCAweEYxLCAweDAwLCAweDYwLCAweDEwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDA4LCAweDAzLCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweDk1LCAweEYzLCAweEZGLCAweEZGLCAweDA4LCAweEJDLCAweDk1LCAweEZCLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLAorCSAweDAyLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDAzLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweEE0LCAweDAxLCAweDAwLCAweDYwLAorCSAweDA0LCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDBCLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDFDLCAweDYwLCAweDlFLCAweDY0LAorCSAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDM1LCAweDAwLCAweDAwLCAweDYwLAorCSAweDA4LCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDBCLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDFDLCAweDYwLCAweDlFLCAweDY0LAorCSAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDFFLCAweDAwLCAweDA4LCAweDYwLAorCSAweDFCLCAweEYxLCAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDE0LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLAorCSAweDk1LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDA4LCAweDJBLCAweDAxLCAweDAwLCAweDE2LCAweDAwLCAweDA4LCAweDYwLCAweDFCLCAweEYxLAorCSAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDA4LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweEVELCAweDYwLAorCSAweDZELCAweDc4LCAweEZGLCAweEZGLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDk1LCAweEYzLCAweEZGLCAweEZGLCAweEZFLCAweEI0LAorCSAweDk1LCAweEZCLCAweEVBLCAweDYwLCAweEQwLCAweDc4LCAweEZGLCAweEZGLCAweDE2LCAweDYwLCAweEFCLCAweEYzLCAweEZGLCAweEZGLCAweDAxLCAweEE4LAorCSAweEZGLCAweEZGLCAweDAzLCAweDAyLCAweEVELCAweDYwLCAweDc2LCAweDc4LCAweEZGLCAweEZGLCAweDk1LCAweEYzLCAweDAxLCAweDYzLCAweDhBLCAweEZELAorCSAweDIxLCAweEJDLCAweDk1LCAweEZCLCAweDYzLCAweEY1LCAweDdGLCAweEYxLCAweDJDLCAweEY4LCAweDgwLCAweEYxLCAweDJELCAweEY4LCAweDgxLCAweEYxLAorCSAweDJFLCAweEY4LCAweDgzLCAweEYxLCAweEMwLCAweDY3LCAweEIwLCAweDg0LCAweDJCLCAweEZBLCAweEI5LCAweEYxLCAweDE5LCAweEY4LCAweEVBLCAweEYxLAorCSAweDJGLCAweEY4LCAweEVCLCAweEYxLCAweDMwLCAweEY4LCAweEVDLCAweEYxLCAweDMxLCAweEY4LCAweDEwLCAweDYwLCAweEE0LCAweDY0LCAweDJBLCAweEZBLAorCSAweDI1LCAweDYwLCAweENFLCAweDY0LCAweDEzLCAweDYwLCAweDBELCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLAorCSAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEMxLCAweEZFLCAweDAwLCAweDYwLCAweDUwLCAweDY0LCAweDBFLCAweDYwLCAweDUxLCAweEZCLCAweDFDLCAweDYwLAorCSAweDlFLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAyLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDEwLCAweDYwLAorCSAweDM2LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDEwLCAweDYwLCAweDVBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAxLCAweDYwLAorCSAweDJDLCAweDY0LCAweDA4LCAweDYwLCAweDFDLCAweEZCLCAweEVDLCAweDYwLCAweEU5LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDFCLCAweEYxLCAweDAxLCAweDYwLCAweDAwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDBELCAweDAzLAorCSAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDFDLCAweDYwLCAweDlFLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLAorCSAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweEVBLCAweDYwLCAweDFGLCAweDc4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDJELCAweEYxLCAweDAwLCAweDYwLAorCSAweDA0LCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDAzLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDk1LCAweDAxLCAweDA4LCAweDYwLAorCSAweDFCLCAweEYxLCAweDAwLCAweDYwLCAweDA4LCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDA4LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLAorCSAweDk1LCAweEYzLCAweEZGLCAweEZGLCAweDAyLCAweEIwLCAweEZGLCAweEZGLCAweDQ5LCAweDAzLCAweDg2LCAweDAxLCAweDAwLCAweDYwLCAweDA4LCAweDY0LAorCSAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDAzLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDQwLCAweDAwLCAweDAwLCAweDYwLCAweDAyLCAweDY0LAorCSAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDE0LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDFDLCAweDYwLCAweDlFLCAweDY0LCAweDEzLCAweDYwLAorCSAweDIyLCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDE2LCAweDYwLCAweEFDLCAweEYzLCAweDk1LCAweEYzLAorCSAweDAwLCAweEE4LCAweEY3LCAweEI0LCAweDJCLCAweDAzLCAweDk1LCAweEZCLCAweEVCLCAweDYwLCAweEUyLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLAorCSAweDEwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDE1LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDFDLCAweDYwLCAweDlFLCAweDY0LAorCSAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDE2LCAweDYwLCAweEFDLCAweEYzLAorCSAweDk1LCAweEYzLCAweDAwLCAweEE4LCAweDA4LCAweEJDLCAweDAxLCAweDAyLCAweDRGLCAweDAxLCAweDk1LCAweEZCLCAweEVCLCAweDYwLCAweEUyLCAweDc4LAorCSAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDFCLCAweEYxLCAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDAzLCAweDAzLAorCSAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDAyLCAweDAwLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDFDLCAweDYwLCAweDlFLCAweDY0LAorCSAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDk1LCAweEYzLCAweEZGLCAweEZGLAorCSAweEZFLCAweEI0LCAweDk1LCAweEZCLCAweEVBLCAweDYwLCAweEQwLCAweDc4LCAweEZGLCAweEZGLCAweDk1LCAweEYzLCAweDAxLCAweDYzLCAweDhBLCAweEZELAorCSAweDAxLCAweEJDLCAweDk1LCAweEZCLCAweDAwLCAweDY0LCAweDgyLCAweEZCLCAweEMxLCAweEZFLCAweDI4LCAweDAwLCAweDk1LCAweEYzLCAweDAxLCAweDYzLAorCSAweDhBLCAweEZELCAweDAxLCAweEJDLCAweDk1LCAweEZCLCAweDAwLCAweDY0LCAweDgyLCAweEZCLCAweDYzLCAweEY1LCAweDdGLCAweEYxLCAweDJDLCAweEY4LAorCSAweDgwLCAweEYxLCAweDJELCAweEY4LCAweDgxLCAweEYxLCAweDJFLCAweEY4LCAweDgzLCAweEYxLCAweEMwLCAweDY3LCAweEIwLCAweDg0LCAweDJCLCAweEZBLAorCSAweEI5LCAweEYxLCAweDE5LCAweEY4LCAweEVBLCAweEYxLCAweDJGLCAweEY4LCAweEVCLCAweEYxLCAweDMwLCAweEY4LCAweEVDLCAweEYxLCAweDMxLCAweEY4LAorCSAweDAwLCAweDYwLCAweEE0LCAweDY0LCAweDJBLCAweEZBLCAweDI1LCAweDYwLCAweENFLCAweDY0LCAweDEzLCAweDYwLCAweDBELCAweEZCLCAweDY2LCAweDQ0LAorCSAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEMxLCAweEZFLCAweDFDLCAweDYwLCAweEFBLCAweDY0LAorCSAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAyLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDEwLCAweDYwLCAweDM2LCAweDYyLAorCSAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDEwLCAweDYwLCAweDVBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAzLCAweDYwLCAweDBFLCAweDY0LAorCSAweDA4LCAweDYwLCAweDFDLCAweEZCLCAweEVELCAweDYwLCAweEI4LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDA4LCAweDYwLCAweDFCLCAweEYxLCAweDAxLCAweDYwLCAweDAwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDBELCAweDAzLCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweDFDLCAweDYwLCAweEFBLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLAorCSAweDA0LCAweEZGLCAweEVBLCAweDYwLCAweDFGLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDBBLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LAorCSAweDAzLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweENBLCAweDAxLCAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LAorCSAweDE0LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDA4LCAweDYwLCAweDJELCAweEYxLCAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweEEwLCAweDgwLAorCSAweDlDLCAweDg0LCAweDAzLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDkxLCAweDAxLCAweDAwLCAweDYwLCAweDEyLCAweDY0LCAweEEwLCAweDgwLAorCSAweDlDLCAweDg0LCAweDAzLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweEIxLCAweDAxLCAweDA4LCAweDYwLCAweDFCLCAweEYxLCAweDAyLCAweDYwLAorCSAweDAwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweEIyLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDEwLCAweDY3LCAweDgyLCAweEZCLAorCSAweDEwLCAweDYwLCAweDM2LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDEwLCAweDYwLCAweDVBLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLAorCSAweDY0LCAweEY1LCAweEI5LCAweEYxLCAweDE5LCAweEY4LCAweDdGLCAweEYxLCAweDJDLCAweEY4LCAweDMyLCAweEY4LCAweDgwLCAweEYxLCAweDJELCAweEY4LAorCSAweDMzLCAweEY4LCAweDgxLCAweEYxLCAweDJFLCAweEY4LCAweDM0LCAweEY4LCAweEVBLCAweEYxLCAweDJGLCAweEY4LCAweEVCLCAweEYxLCAweDMwLCAweEY4LAorCSAweEVDLCAweEYxLCAweDMxLCAweEY4LCAweDExLCAweDYwLCAweDQ4LCAweDY0LCAweDJBLCAweEZBLCAweDAwLCAweDY0LCAweDJCLCAweEZBLCAweDIzLCAweEZBLAorCSAweDI1LCAweDYwLCAweENFLCAweDY0LCAweDEzLCAweDYwLCAweDBELCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLAorCSAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDk1LCAweEYzLCAweEMxLCAweEZFLCAweEZFLCAweEI0LCAweDk1LCAweEZCLCAweDAwLCAweDYwLCAweDAzLCAweDY0LAorCSAweDA4LCAweDYwLCAweDFDLCAweEZCLCAweEVFLCAweDYwLCAweDMwLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDA4LCAweDYwLCAweDFCLCAweEYxLCAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDAzLCAweDAzLCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweDMzLCAweDAxLCAweDY0LCAweEY1LCAweDIzLCAweEYyLCAweDk2LCAweEYzLCAweDA0LCAweDE4LCAweENDLCAweDg0LCAweDk2LCAweEZCLAorCSAweDAxLCAweDAzLCAweDJCLCAweDAxLCAweEVBLCAweDYwLCAweEQwLCAweDc4LCAweEZGLCAweEZGLCAweDE2LCAweDYwLCAweEFCLCAweEYzLCAweDgyLCAweEYxLAorCSAweDAyLCAweEE4LCAweDJBLCAweEYyLCAweDAzLCAweDAyLCAweEIwLCAweDg0LCAweDJBLCAweEZBLCAweDA3LCAweDAwLCAweDA4LCAweDYwLCAweDFCLCAweEYxLAorCSAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDI1LCAweDYwLCAweEM4LCAweDY0LCAweDEzLCAweDYwLAorCSAweDBELCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEMxLCAweEZFLAorCSAweDEyLCAweDYwLCAweEVELCAweEYzLCAweEZGLCAweEZGLCAweDAwLCAweEE4LCAweDYwLCAweDQ2LCAweERGLCAweDAyLCAweENBLCAweDYwLCAweEQ0LCAweDc4LAorCSAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweDQ4LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAwLCAweDYwLCAweDA2LCAweDY0LCAweDA4LCAweDYwLAorCSAweDI1LCAweEZCLCAweEVFLCAweDYwLCAweDc3LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLAorCSAweDE4LCAweDY0LCAweDA4LCAweDYwLCAweDI1LCAweEZCLCAweEVFLCAweDYwLCAweDc3LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDAwLCAweEY0LCAweERCLCAweEYzLCAweEZGLCAweEZGLCAweDA3LCAweEI0LCAweDAzLCAweDM2LCAweDFCLCAweDAwLAorCSAweDBFLCAweEYwLCAweDE5LCAweDYwLCAweDdCLCAweEYzLCAweEZGLCAweEZGLCAweEVGLCAweEI0LCAweDYwLCAweDQ0LCAweDY0LCAweDQwLCAweDA0LCAweDI3LAorCSAweDA3LCAweDAwLCAweEEyLCAweERCLCAweDEzLCAweDY0LCAweENCLCAweEZCLCAweDAxLCAweDYwLCAweDY3LCAweDY0LCAweDM3LCAweEZCLCAweDBCLCAweDAwLAorCSAweDEwLCAweEJDLCAweEEyLCAweERCLCAweDA4LCAweDY0LCAweENCLCAweEZCLCAweEExLCAweEYzLCAweDAxLCAweDYwLCAweDY3LCAweDdDLCAweDYwLCAweDQwLAorCSAweDAxLCAweDI3LCAweDVCLCAweDdDLCAweDM3LCAweEY5LCAweDI2LCAweDQ2LCAweDNGLCAweEYyLCAweDAwLCAweEY0LCAweDYwLCAweDQzLCAweEY0LCAweEEzLAorCSAweDAwLCAweDYwLCAweDFELCAweDYxLCAweDAwLCAweDYwLCAweDJBLCAweDY1LCAweDAxLCAweDYwLCAweEZGLCAweDY0LCAweDQwLCAweDRDLCAweEZELCAweDYwLAorCSAweDU4LCAweDRFLCAweDdBLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweEJCLCAweEZGLCAweEZGLCAweDAxLCAweDAyLCAweDNCLCAweDAwLCAweDAyLCAweDYwLAorCSAweDAxLCAweDYzLCAweEEzLCAweEQxLCAweERCLCAweEYzLCAweEZGLCAweEZGLCAweDA3LCAweEI0LCAweDAzLCAweDM2LCAweDFGLCAweDAwLCAweDE5LCAweDYwLAorCSAweDQ1LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDI2LCAweDA5LCAweDAwLCAweDE5LCAweDYwLCAweDdCLCAweEYzLCAweEZGLCAweEZGLAorCSAweEZELCAweEI0LCAweDYwLCAweDQ0LCAweDY0LCAweDQwLCAweDAyLCAweDI3LCAweDAyLCAweEJDLCAweEEyLCAweERCLCAweDE5LCAweDYwLCAweDQ1LCAweEYzLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAyLCAweDI2LCAweDFDLCAweDAwLCAweDE5LCAweDYwLCAweDdCLCAweEYzLCAweEZGLCAweEZGLCAweEZCLCAweEI0LAorCSAweDYwLCAweDQ0LCAweDY0LCAweDQwLCAweDA0LCAweDI3LCAweDA0LCAweEJDLCAweEEyLCAweERCLCAweDEyLCAweDAwLCAweDY0LCAweDQwLCAweDAyLCAweDJCLAorCSAweDA2LCAweDAwLCAweDE5LCAweDYwLCAweDdCLCAweEYzLCAweEZGLCAweEZGLCAweDAyLCAweEJDLCAweDYwLCAweDQ0LCAweEEyLCAweERCLCAweDY0LCAweDQwLAorCSAweDA0LCAweDJCLCAweDA2LCAweDAwLCAweDE5LCAweDYwLCAweDdCLCAweEYzLCAweEZGLCAweEZGLCAweDA0LCAweEJDLCAweDYwLCAweDQ0LCAweEEyLCAweERCLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBFLCAweEYwLCAweERCLCAweEYzLCAweEZGLCAweEZGLCAweDA3LCAweEI0LCAweDAzLCAweDM2LCAweDE4LCAweDAwLAorCSAweDE5LCAweDYwLCAweDdCLCAweEYzLCAweEZGLCAweEZGLCAweDAyLCAweEJDLCAweDYwLCAweDQ0LCAweEZCLCAweEI0LCAweDYwLCAweDQ0LCAweDY0LCAweDQwLAorCSAweDIwLCAweDJBLCAweDBBLCAweDAwLCAweDYwLCAweDQzLCAweDE5LCAweDYwLCAweDQ1LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAyLCAweDI2LAorCSAweDAyLCAweDAwLCAweDYzLCAweDQ0LCAweDAyLCAweDAwLCAweDYzLCAweDQ0LCAweDA0LCAweEJDLCAweDE5LCAweDYwLCAweDdCLCAweEZCLCAweDA5LCAweDAwLAorCSAweDY0LCAweDQwLCAweDIwLCAweDI2LCAweDA2LCAweDAwLCAweDE5LCAweDYwLCAweDdCLCAweEYzLCAweEZGLCAweEZGLCAweDA0LCAweEJDLCAweDYwLCAweDQ0LAorCSAweEEyLCAweERCLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweEIwLCAweDYxLCAweEI2LCAweDYwLCAweDU4LCAweDRELCAweDI1LCAweDc4LAorCSAweEZGLCAweEZGLCAweDY2LCAweDQ0LCAweDVDLCAweEZCLCAweDA0LCAweDY0LCAweDAzLCAweEZBLCAweDgwLCAweDY0LCAweDJBLCAweEZBLCAweEM5LCAweEYxLAorCSAweDE5LCAweEY4LCAweDAwLCAweDY0LCAweDNFLCAweEZBLCAweDAwLCAweDYwLCAweDgwLCAweDY0LCAweDBFLCAweEZBLCAweEE2LCAweEYxLCAweDA3LCAweEY4LAorCSAweDY3LCAweDQ0LCAweDJDLCAweEZBLCAweDJELCAweEZBLCAweDJFLCAweEZBLCAweEYxLCAweDYwLCAweDJDLCAweDY0LCAweDA4LCAweDYwLCAweDMxLCAweEZCLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDVDLCAweEY1LCAweEVBLCAweEYxLCAweDJGLCAweEY4LCAweEVCLCAweEYxLCAweDMwLCAweEY4LCAweEVDLCAweEYxLAorCSAweDMxLCAweEY4LCAweDdGLCAweEYxLCAweDMyLCAweEY4LCAweDgwLCAweEYxLCAweDMzLCAweEY4LCAweDgxLCAweEYxLCAweDM0LCAweEY4LCAweDE2LCAweDYwLAorCSAweEMyLCAweEYxLCAweDAyLCAweDY0LCAweDY0LCAweDQwLCAweEZFLCAweDI2LCAweDEwLCAweEJDLCAweDMyLCAweDQwLCAweDA4LCAweDI2LCAweDEwLCAweEJDLAorCSAweDIwLCAweEJDLCAweEZCLCAweDYwLCAweEZGLCAweDY1LCAweDYwLCAweDQ0LCAweEE0LCAweDg0LCAweDFCLCAweDYwLCAweDA5LCAweEZCLCAweDE2LCAweDYwLAorCSAweEMxLCAweEYxLCAweDMzLCAweDYwLCAweEJFLCAweDY0LCAweDAyLCAweDE4LCAweDJELCAweDYwLCAweDMyLCAweDY0LCAweDFBLCAweDYwLCAweEFELCAweEZCLAorCSAweDFBLCAweDYwLCAweEJELCAweEZCLCAweDM0LCAweDYwLCAweDE4LCAweDYxLCAweDE3LCAweDYwLCAweDE0LCAweEYzLCAweDM1LCAweDYwLCAweDM2LCAweDY1LAorCSAweEZFLCAweEE0LCAweEUwLCAweDg0LCAweDA2LCAweDA1LCAweDY3LCAweDQ0LCAweDFBLCAweDYwLCAweEI1LCAweEZCLCAweDFBLCAweDYwLCAweEM1LCAweEZCLAorCSAweDRCLCAweDAwLCAweEUwLCAweDg0LCAweEM0LCAweDg1LCAweDFBLCAweDYwLCAweDFGLCAweEYzLCAweEE1LCAweEQxLCAweERBLCAweDg1LCAweEEwLCAweDgzLAorCSAweDFBLCAweDYwLCAweDFCLCAweEZELCAweEE1LCAweEQxLCAweDM0LCAweDYwLCAweDM0LCAweDYyLCAweEEwLCAweDgzLCAweEEyLCAweERELCAweDY3LCAweDQ0LAorCSAweDFBLCAweDYwLCAweEI1LCAweEZCLCAweDFBLCAweDYwLCAweEM1LCAweEZCLCAweDFBLCAweDYwLCAweDJDLCAweEYzLCAweEZGLCAweEZGLCAweDIxLCAweDE4LAorCSAweDMzLCAweDYwLCAweEY0LCAweDYxLCAweDBGLCAweDYwLCAweDAwLCAweDdDLCAweDAwLCAweDYwLCAweEFDLCAweDY1LCAweEVGLCAweDYwLCAweDU4LCAweDRELAorCSAweEMxLCAweDc4LCAweEZGLCAweEZGLCAweDFBLCAweDYwLCAweDJELCAweEYxLCAweDU5LCAweEQ5LCAweDMzLCAweDYwLCAweEYyLCAweDY1LCAweEQ1LCAweDg0LAorCSAweDMwLCAweDdGLCAweEE1LCAweERCLCAweDY1LCAweDQ0LCAweDFBLCAweDYwLCAweEI1LCAweEZCLCAweDFBLCAweDYwLCAweEM1LCAweEZCLCAweDFBLCAweDYwLAorCSAweDJDLCAweEYzLCAweEZGLCAweEZGLCAweEZFLCAweEE0LCAweEZGLCAweEZGLCAweDA4LCAweDI0LCAweDAzLCAweDAwLCAweEZGLCAweDYwLCAweEZGLCAweDY0LAorCSAweDEzLCAweDAwLCAweDM0LCAweDYwLCAweDE4LCAweDYxLCAweDUwLCAweDYwLCAweDAwLCAweDdDLCAweDAwLCAweDYwLCAweEYyLCAweDY1LCAweEVGLCAweDYwLAorCSAweDU4LCAweDRELCAweEMxLCAweDc4LCAweEZGLCAweEZGLCAweDFBLCAweDYwLCAweDFELCAweEYxLCAweDU5LCAweEQ5LCAweDM0LCAweDYwLCAweDEyLCAweDY1LAorCSAweEQ1LCAweDg0LCAweERELCAweDdGLCAweEE1LCAweERCLCAweDY1LCAweDQ0LCAweDFBLCAweDYwLCAweEIyLCAweEZCLCAweDFBLCAweDYwLCAweEMyLCAweEZCLAorCSAweDc5LCAweDAwLCAweDFBLCAweDYwLCAweDFFLCAweEYzLCAweDM0LCAweDYwLCAweDM0LCAweDYyLCAweEZELCAweEEwLCAweEEyLCAweEQzLCAweEVFLCAweDAzLAorCSAweDYwLCAweDQwLCAweDAyLCAweDJBLCAweDAyLCAweDAwLCAweDAxLCAweDYzLCAweDBCLCAweDAwLCAweDA0LCAweDJBLCAweDAyLCAweDAwLCAweDAyLCAweDYzLAorCSAweDA3LCAweDAwLCAweDEwLCAweDJBLCAweDAyLCAweDAwLCAweDA0LCAweDYzLCAweDAzLCAweDAwLCAweDIwLCAweDJBLCAweDAxLCAweDAwLCAweDA1LCAweDYzLAorCSAweDYzLCAweDQ3LCAweEI0LCAweDgzLCAweDU5LCAweEQ5LCAweDU5LCAweERELCAweDFBLCAweDYwLCAweDFFLCAweEYzLCAweDFBLCAweDYwLCAweDFCLCAweEYzLAorCSAweEZFLCAweEEwLCAweDQwLCAweDRDLCAweEQzLCAweDAzLCAweDAwLCAweDYwLCAweDAwLCAweDYzLCAweDU5LCAweERELCAweDQxLCAweDRBLCAweDJDLCAweDQwLAorCSAweDAxLCAweDJBLCAweDA1LCAweDAwLCAweDAwLCAweDYzLCAweDYzLCAweDQ3LCAweEI0LCAweDgzLCAweDU5LCAweEQ5LCAweDU5LCAweERELCAweDJDLCAweDQwLAorCSAweDAyLCAweDJBLCAweDAzLCAweDAwLCAweDAxLCAweDYzLCAweDU5LCAweEQ5LCAweDU5LCAweERELCAweDJDLCAweDQwLCAweDA0LCAweDJBLCAweDA1LCAweDAwLAorCSAweDAyLCAweDYzLCAweDYzLCAweDQ3LCAweEI0LCAweDgzLCAweDU5LCAweEQ5LCAweDU5LCAweERELCAweDJDLCAweDQwLCAweDEwLCAweDJBLCAweDA1LCAweDAwLAorCSAweDA0LCAweDYzLCAweDYzLCAweDQ3LCAweEI0LCAweDgzLCAweDU5LCAweEQ5LCAweDU5LCAweERELCAweDJDLCAweDQwLCAweDIwLCAweDJBLCAweDA1LCAweDAwLAorCSAweDA1LCAweDYzLCAweDYzLCAweDQ3LCAweEI0LCAweDgzLCAweDU5LCAweEQ5LCAweDU5LCAweERELCAweDJBLCAweDQ0LCAweDUxLCAweDkzLCAweEVCLCAweDgzLAorCSAweEVCLCAweDgzLCAweEEwLCAweERELCAweDFBLCAweDYwLCAweDFFLCAweEYzLCAweDFBLCAweDYwLCAweDFDLCAweEYzLCAweEZGLCAweEEwLCAweDQwLCAweDRDLAorCSAweDlELCAweDAzLCAweDU5LCAweERGLCAweDQxLCAweDRBLCAweDJDLCAweDQwLCAweDAxLCAweDJBLCAweDA1LCAweDAwLCAweDAwLCAweDYzLCAweDYzLCAweDQ3LAorCSAweEI0LCAweDgzLCAweDU5LCAweEQ5LCAweDU5LCAweERELCAweDJDLCAweDQwLCAweDAyLCAweDJBLCAweDA1LCAweDAwLCAweDAxLCAweDYzLCAweDYzLCAweDQ3LAorCSAweEI0LCAweDgzLCAweDU5LCAweEQ5LCAweDU5LCAweERELCAweDJDLCAweDQwLCAweDA0LCAweDJBLCAweDA1LCAweDAwLCAweDAyLCAweDYzLCAweDYzLCAweDQ3LAorCSAweEI0LCAweDgzLCAweDU5LCAweEQ5LCAweDU5LCAweERELCAweDJBLCAweDQ0LCAweDUxLCAweDkzLCAweEVCLCAweDgzLCAweEVCLCAweDgzLCAweEEwLCAweERELAorCSAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweDA4LCAweDYwLCAweDBBLCAweEZCLCAweEYwLCAweDYwLCAweDQ0LCAweDY0LAorCSAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweDEyLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLAorCSAweDdELCAweEYxLCAweDM1LCAweDYwLCAweENDLCAweDY0LCAweDY0LCAweDQwLCAweDAxLCAweDJCLCAweDAxLCAweDAwLCAweDY3LCAweDQ0LCAweDFBLCAweDYwLAorCSAweEFGLCAweEZCLCAweDFBLCAweDYwLCAweEJGLCAweEZCLCAweDFBLCAweDYwLCAweEU3LCAweEY5LCAweDM1LCAweDYwLCAweDYyLCAweDY1LCAweEYxLCAweDYwLAorCSAweDU4LCAweDRELCAweDc0LCAweDc4LCAweEZGLCAweEZGLCAweDdELCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDJCLCAweDA1LCAweDAwLAorCSAweEZGLCAweDYwLCAweEZGLCAweDYzLCAweDFBLCAweDYwLCAweEIzLCAweEZELCAweDA4LCAweDAwLCAweDM2LCAweDYwLCAweDA0LCAweDYzLCAweDFBLCAweDYwLAorCSAweEIzLCAweEZELCAweEYxLCAweDYwLCAweDU4LCAweDRELCAweDhDLCAweDc4LCAweEZGLCAweEZGLCAweDVDLCAweEY1LCAweDAwLCAweEY0LCAweDdFLCAweEYxLAorCSAweDA2LCAweEY4LCAweDFCLCAweDYwLCAweDA5LCAweEYzLCAweDE5LCAweDYwLCAweDdCLCAweEYxLCAweEZCLCAweDYwLCAweEZGLCAweDY1LCAweDYwLCAweDQ0LAorCSAweEE0LCAweDg0LCAweDYwLCAweDQ3LCAweDY0LCAweDQwLCAweDEwLCAweDI2LCAweDA0LCAweEJDLCAweDYwLCAweDQ3LCAweDA3LCAweEZBLCAweDM1LCAweDYwLAorCSAweDVBLCAweDY0LCAweDQwLCAweDQ4LCAweDEwLCAweDYxLCAweDAwLCAweDYwLCAweDAwLCAweDY0LCAweEYxLCAweDYwLCAweDU4LCAweDRELCAweDM0LCAweDc4LAorCSAweEZGLCAweEZGLCAweDVDLCAweEY1LCAweDNGLCAweEZDLCAweERCLCAweEZFLCAweDI1LCAweDYwLCAweENFLCAweDY0LCAweDEzLCAweDYwLCAweDBELCAweEZCLAorCSAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDA0LCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEMxLCAweEZFLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweERCLCAweEYzLCAweDlCLCAweEZFLCAweEZELCAweEEwLCAweDI1LCAweDA0LCAweDI0LCAweDAyLCAweDA0LCAweDY0LCAweDAzLCAweEZBLAorCSAweDAwLCAweEY0LCAweDA5LCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQ3LCAweDAwLCAweDNBLCAweDFDLCAweDAwLCAweDYwLCAweDQzLCAweDAwLCAweDM2LAorCSAweDFDLCAweDAwLCAweEUwLCAweEEwLCAweERBLCAweDg1LCAweDE2LCAweDA3LCAweDMzLCAweDYwLCAweEJFLCAweDYxLCAweEExLCAweEQxLCAweEZGLCAweEZGLAorCSAweEQzLCAweDgwLCAweENCLCAweDgzLCAweDBGLCAweDAyLCAweDA3LCAweDBFLCAweDU5LCAweEQzLCAweEE1LCAweEQwLCAweERBLCAweDg1LCAweEQwLCAweDgwLAorCSAweEZGLCAweEZGLCAweDA4LCAweDAyLCAweEY5LCAweDFGLCAweDEyLCAweDFFLCAweEE1LCAweEQwLCAweDU5LCAweEQzLCAweEZGLCAweEZGLCAweDkwLCAweDgwLAorCSAweEZGLCAweDIyLCAweDBDLCAweDAwLCAweEYxLCAweDYwLCAweDJBLCAweDc4LCAweEZGLCAweEZGLCAweDE2LCAweDYwLCAweEMxLCAweEYzLCAweEZGLCAweEZGLAorCSAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDAzLCAweDAwLCAweDJELCAweDYwLCAweDMyLCAweDY0LCAweDAyLCAweDAwLCAweDMzLCAweDYwLCAweEJFLCAweDY0LAorCSAweDFBLCAweDYwLCAweEJELCAweEZCLCAweDI2LCAweDQ2LCAweDJGLCAweEYyLCAweDJDLCAweEZBLCAweDMwLCAweEYyLCAweDJELCAweEZBLCAweDMxLCAweEYyLAorCSAweDJFLCAweEZBLCAweEVBLCAweEYxLCAweDJGLCAweEY4LCAweEVCLCAweEYxLCAweDMwLCAweEY4LCAweEVDLCAweEYxLCAweDMxLCAweEY4LCAweDdGLCAweEYxLAorCSAweDMyLCAweEY4LCAweDgwLCAweEYxLCAweDMzLCAweEY4LCAweDgxLCAweEYxLCAweDM0LCAweEY4LCAweDAwLCAweDY1LCAweEZELCAweDYwLCAweDU4LCAweDRFLAorCSAweERELCAweDc4LCAweEZGLCAweEZGLCAweDYxLCAweDQ0LCAweDE5LCAweDYwLCAweDNGLCAweEZCLCAweDUwLCAweDYzLCAweDJBLCAweEZDLCAweEM5LCAweEYzLAorCSAweDE5LCAweEZBLCAweDAwLCAweDY0LCAweDNFLCAweEZBLCAweEE2LCAweEYzLCAweDA3LCAweEZBLCAweDAwLCAweEY0LCAweDdFLCAweEYxLCAweDA2LCAweEY4LAorCSAweDFCLCAweDYwLCAweDA5LCAweEYzLCAweDE5LCAweDYwLCAweDdCLCAweEYxLCAweEZCLCAweDYwLCAweEZGLCAweEI3LCAweDY0LCAweDQwLCAweDEwLCAweDI2LAorCSAweDA0LCAweEJDLCAweDYwLCAweDQ3LCAweDA3LCAweEZBLCAweDM1LCAweDYwLCAweDgyLCAweDY1LCAweEYxLCAweDYwLCAweDU4LCAweDRELCAweDc0LCAweDc4LAorCSAweEZGLCAweEZGLCAweDdELCAweEYzLCAweDM2LCAweDYwLCAweDA0LCAweDYzLCAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDY3LCAweDQzLCAweDFBLCAweDYwLAorCSAweEMzLCAweEZELCAweDM1LCAweDYwLCAweDdBLCAweDY0LCAweDQwLCAweDQ4LCAweDEwLCAweDYxLCAweDAwLCAweDYwLCAweDAwLCAweDY0LCAweEYxLCAweDYwLAorCSAweDU4LCAweDRELCAweDM0LCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDNGLCAweEZDLCAweDI1LCAweDYwLCAweENFLCAweDY0LCAweDEzLCAweDYwLAorCSAweDBELCAweEZCLCAweDI2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEMxLCAweEZFLAorCSAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDA5LCAweEZCLCAweDVBLCAweERCLAorCSAweDAwLCAweDY0LCAweDkyLCAweEZCLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDFCLCAweDYwLCAweDBBLCAweEZCLCAweENELCAweDgxLCAweDI4LCAweEQzLAorCSAweDVBLCAweDg4LCAweERDLCAweDgzLCAweDMxLCAweDE4LCAweEZCLCAweDAzLCAweDYxLCAweDQwLCAweDdGLCAweDNBLCAweDA2LCAweDAwLCAweDFCLCAweDYwLAorCSAweDBBLCAweEYzLCAweDAzLCAweDYxLCAweDdDLCAweEE0LCAweEEyLCAweERCLCAweDAwLCAweEY0LCAweDYwLCAweEZFLCAweEEzLCAweEQxLCAweDVELCAweEQ4LAorCSAweDYxLCAweDQwLCAweDdGLCAweDNBLCAweDA4LCAweDAwLCAweDIwLCAweEZFLCAweDFCLCAweDYwLCAweDBBLCAweEYzLCAweDAzLCAweDYxLCAweDdDLCAweEE0LAorCSAweEEyLCAweERCLCAweDAwLCAweEY0LCAweDYwLCAweEZFLCAweEJGLCAweEQzLCAweDVELCAweERBLCAweEZGLCAweEI0LCAweDAwLCAweDdGLCAweDEyLCAweDAzLAorCSAweERGLCAweDgzLCAweDYxLCAweDQwLCAweDdGLCAweDNBLCAweDBBLCAweDAwLCAweDIwLCAweEZFLCAweDYwLCAweDQ1LCAweDFCLCAweDYwLCAweDBBLCAweEYzLAorCSAweDAzLCAweDYxLCAweDdDLCAweEE0LCAweEEyLCAweERCLCAweDY1LCAweDQ0LCAweDAwLCAweEY0LCAweDYwLCAweEZFLCAweEJELCAweEQxLCAweENDLCAweDg0LAorCSAweDVELCAweEQ4LCAweEVGLCAweDAyLCAweDIwLCAweEZFLCAweENCLCAweDAxLCAweDFCLCAweDYwLCAweDBBLCAweEYxLCAweEZELCAweEExLCAweEZGLCAweEIxLAorCSAweEMxLCAweDgzLCAweEEyLCAweERELCAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDY3LCAweDVDLCAweDFDLCAweDYwLCAweEU2LCAweDYxLCAweEExLCAweEQzLAorCSAweEE1LCAweEQ5LCAweDEwLCAweDE4LCAweDYwLCAweDQzLCAweDM1LCAweDYwLCAweEQ0LCAweDY0LCAweEE1LCAweERCLCAweDYwLCAweEZFLCAweEEwLCAweERELAorCSAweDIwLCAweEZFLCAweERDLCAweDg0LCAweENGLCAweDgzLCAweEUzLCAweDgzLCAweDU5LCAweEQxLCAweERDLCAweDg0LCAweDYwLCAweEZFLCAweEEwLCAweEQ5LAorCSAweDIwLCAweEZFLCAweEZBLCAweDFGLCAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweDdCLCAweEYzLCAweDM2LCAweDYwLCAweDA2LCAweDYyLAorCSAweDA3LCAweEI0LCAweDYwLCAweEZFLCAweEEyLCAweERCLCAweDIwLCAweEZFLCAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDBFLCAweDU3LCAweDMyLCAweDQwLAorCSAweDQwLCAweDI2LCAweDI3LCAweDAwLCAweDQ1LCAweDQ4LCAweDAwLCAweDYwLCAweDEwLCAweDYxLCAweEI2LCAweDYwLCAweDU4LCAweDRELCAweDIyLCAweDc4LAorCSAweEZGLCAweEZGLCAweDFGLCAweDAzLCAweEYyLCAweDYwLCAweDAyLCAweDY0LCAweDI0LCAweEZBLCAweDAwLCAweDYwLCAweDQ4LCAweDYxLCAweDI4LCAweDQ0LAorCSAweDU5LCAweERBLCAweDAzLCAweDY0LCAweDM4LCAweDQzLCAweEJELCAweEQxLCAweENDLCAweDg0LCAweDU5LCAweEQ4LCAweEZDLCAweDAyLCAweDM5LCAweDQ0LAorCSAweDU5LCAweERBLCAweDE2LCAweDYwLCAweEMzLCAweEYzLCAweDU5LCAweERBLCAweDA3LCAweDY0LCAweDIzLCAweEZBLCAweDI2LCAweDYwLCAweDBBLCAweDY0LAorCSAweDEzLCAweDYwLCAweDBELCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLAorCSAweEZBLCAweEZFLCAweDM3LCAweDU4LCAweEZGLCAweEZGLCAweDBFLCAweDU3LCAweDMyLCAweDQwLCAweDQwLCAweDI2LCAweDFCLCAweDAwLCAweDQ1LCAweDQ4LAorCSAweDAwLCAweDYwLCAweDA2LCAweDYxLCAweEI2LCAweDYwLCAweDU4LCAweDRELCAweDIyLCAweDc4LCAweEZGLCAweEZGLCAweDEzLCAweDAzLCAweDAyLCAweDY0LAorCSAweDIzLCAweEZBLCAweEYyLCAweDYwLCAweDAwLCAweDY0LCAweDVBLCAweERBLCAweDI4LCAweDQ0LCAweDVBLCAweERBLCAweEZGLCAweEZGLCAweDI2LCAweDYwLAorCSAweDBBLCAweDY0LCAweDEzLCAweDYwLCAweDBELCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLAorCSAweDJCLCAweEZGLCAweEZBLCAweEZFLCAweDM3LCAweDU4LCAweEZGLCAweEZGLCAweEEwLCAweEQzLCAweEZGLCAweEZGLCAweERDLCAweDg0LCAweERDLCAweDgwLAorCSAweEQwLCAweDgwLCAweDAzLCAweDAzLCAweEEyLCAweERCLCAweDA4LCAweDI0LCAweEM2LCAweEZFLCAweERELCAweDk4LCAweEZGLCAweEZGLCAweEI1LCAweEYxLAorCSAweEEwLCAweEQzLCAweEZGLCAweEZGLCAweEQ4LCAweDgwLCAweEM0LCAweDg0LCAweDBDLCAweDAzLCAweDA4LCAweDA1LCAweERDLCAweDgwLCAweEQwLCAweDgwLAorCSAweDA1LCAweDAzLCAweEEyLCAweERCLCAweDAyLCAweDI0LCAweEM2LCAweEZFLCAweERELCAweDk4LCAweEZGLCAweEZGLCAweEZGLCAweDYwLCAweEZFLCAweDY0LAorCSAweEEyLCAweERCLCAweERELCAweDk4LCAweEZGLCAweEZGLCAweEEyLCAweEZGLCAweDMyLCAweDQwLCAweDQwLCAweDI2LCAweDNDLCAweDAwLCAweDlCLCAweEYzLAorCSAweDY3LCAweDQzLCAweERDLCAweDg0LCAweENDLCAweDg0LCAweDM3LCAweDAzLCAweDYwLCAweDQ2LCAweDBBLCAweDAyLCAweDlCLCAweEZELCAweDAwLCAweDYwLAorCSAweDQ2LCAweDYxLCAweEI2LCAweDYwLCAweDU4LCAweDRELCAweDIyLCAweDc4LCAweEZGLCAweEZGLCAweDY2LCAweDQ0LCAweDlCLCAweEZCLCAweDJDLCAweDAzLAorCSAweDQ2LCAweDRCLCAweDJDLCAweDYwLCAweENBLCAweDYxLCAweDE4LCAweDY0LCAweDIzLCAweEZBLCAweEYxLCAweDYwLCAweDAwLCAweDY0LCAweDI0LCAweEZBLAorCSAweDRBLCAweDY1LCAweEEyLCAweEZGLCAweDJDLCAweDYzLCAweDU5LCAweEQxLCAweEEyLCAweERGLCAweEE1LCAweEQ4LCAweERBLCAweDg1LCAweDgwLCAweDNBLAorCSAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDA0LCAweDY1LCAweEY3LCAweDFGLCAweDEyLCAweDYzLCAweDU5LCAweEQxLCAweEE1LCAweEQ4LCAweERBLCAweDg1LAorCSAweDgwLCAweDNBLCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDA0LCAweDY1LCAweEY4LCAweDFGLCAweDI2LCAweDYwLCAweDBBLCAweDY0LCAweDEzLCAweDYwLAorCSAweDBELCAweEZCLCAweDJCLCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEZBLCAweEZFLAorCSAweEE2LCAweEZFLCAweDAwLCAweDY0LCAweDlCLCAweEZCLCAweEEzLCAweEZGLCAweENBLCAweDYwLCAweEQ0LCAweDc4LCAweEZGLCAweEZGLCAweEE2LCAweEZFLAorCSAweEJBLCAweDA1LCAweEE3LCAweEZFLCAweDExLCAweDA1LCAweEE1LCAweEZFLCAweDAzLCAweDA0LCAweEYyLCAweDYwLCAweEQ4LCAweDc4LCAweEZGLCAweEZGLAorCSAweEE0LCAweEZFLCAweEYyLCAweDA0LCAweDA4LCAweDYwLCAweDBGLCAweEYxLCAweDAwLCAweDYwLCAweDgwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLAorCSAweENGLCAweEZFLCAweENBLCAweDYwLCAweEQ0LCAweDc4LCAweEZGLCAweEZGLCAweDM2LCAweDQ1LCAweDIwLCAweDYwLCAweEE4LCAweDY0LCAweDQ0LCAweEQ3LAorCSAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDlELCAweEYzLCAweEZGLCAweEZGLCAweDAxLCAweEIwLCAweDAwLCAweDY0LCAweDJGLCAweDAzLCAweDlELCAweEZCLAorCSAweDMxLCAweDQ0LCAweEU4LCAweEI0LCAweDQwLCAweDUxLCAweDZBLCAweDQ0LCAweEZGLCAweEZGLCAweDgwLCAweDI2LCAweEZDLCAweDAxLCAweDYxLCAweEZGLAorCSAweDYyLCAweEZGLCAweDA4LCAweDYwLCAweDMwLCAweEYxLCAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLAorCSAweDQwLCAweDYwLCAweDU4LCAweDRFLCAweDdELCAweDc4LCAweEZGLCAweEZGLCAweDFGLCAweDYwLCAweEM0LCAweDY0LCAweDBGLCAweDYwLCAweEUxLCAweEZCLAorCSAweDRBLCAweERGLCAweDAxLCAweDYwLCAweEZFLCAweDYzLCAweDFELCAweDYwLCAweEJFLCAweDYxLCAweDAwLCAweDY0LCAweDU5LCAweERCLCAweEZFLCAweDFGLAorCSAweDBFLCAweDYwLCAweERELCAweEYzLCAweEZGLCAweEZGLCAweDA0LCAweEIwLCAweEZGLCAweEZGLCAweDA1LCAweDAzLCAweDAyLCAweDY1LCAweEYxLCAweDYwLAorCSAweDU4LCAweDRFLCAweEMzLCAweDc4LCAweEZGLCAweEZGLCAweENBLCAweDYwLCAweEQ0LCAweDc4LCAweEZGLCAweEZGLCAweEYyLCAweDYwLCAweEQ4LCAweDc4LAorCSAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDE1LCAweEYxLCAweDAwLCAweDYwLCAweDAxLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLAorCSAweDM3LCAweDAwLCAweDJELCAweDYwLCAweEFBLCAweDYzLCAweEJELCAweEQzLCAweEJELCAweEQxLCAweEJELCAweEQxLCAweEIwLCAweDg0LCAweEIwLCAweDg0LAorCSAweEZGLCAweEZGLCAweDA3LCAweDAyLCAweDhBLCAweEZCLCAweDMxLCAweDQ0LCAweEZFLCAweEI0LCAweDQwLCAweDUxLCAweDBELCAweDY0LCAweDA1LCAweEZCLAorCSAweDI3LCAweDAwLCAweDI4LCAweEYzLCAweDlELCAweEYxLCAweDYwLCAweDQ3LCAweDY0LCAweDQxLCAweDA3LCAweEIxLCAweDA3LCAweEI0LCAweDUwLCAweEZCLAorCSAweDAxLCAweDYxLCAweDAzLCAweDAzLCAweENDLCAweDg0LCAweEUxLCAweDgxLCAweEZELCAweDAyLCAweEExLCAweDgwLCAweEIxLCAweDgzLCAweDE4LCAweDAyLAorCSAweDlELCAweEZELCAweDE2LCAweDYwLCAweENGLCAweEYzLCAweEU0LCAweEZCLCAweDdELCAweEZCLCAweDEzLCAweDYwLCAweDAyLCAweEYzLCAweEZGLCAweEZGLAorCSAweDAwLCAweEE4LCAweDYwLCAweDQ2LCAweDQ2LCAweDVFLCAweDMxLCAweDQ0LCAweDAxLCAweEJDLCAweDQwLCAweDUxLCAweEVELCAweEUyLCAweDBGLCAweDRFLAorCSAweDFELCAweDYwLCAweDU4LCAweDRGLCAweDlGLCAweDc4LCAweEZGLCAweEZGLCAweDBFLCAweDRGLCAweENBLCAweDYwLCAweEQ0LCAweDc4LCAweEZGLCAweEZGLAorCSAweEQ3LCAweEZFLCAweENBLCAweDYwLCAweEQ0LCAweDc4LCAweEZGLCAweEZGLCAweEYyLCAweDYwLCAweEU0LCAweDY0LCAweDA4LCAweDYwLCAweDNCLCAweEZCLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDI3LCAweEZCLCAweDVBLCAweERCLAorCSAweDEwLCAweDYwLCAweDRFLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDI4LCAweEYzLAorCSAweEZGLCAweEZGLCAweDAxLCAweEIwLCAweEZGLCAweEZGLCAweDFELCAweDAzLCAweDIwLCAweDQwLCAweDA2LCAweDIzLCAweDEwLCAweDAwLCAweDA4LCAweDYwLAorCSAweDI3LCAweEYxLCAweDdGLCAweDYwLCAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLAorCSAweDI4LCAweEZCLCAweEYyLCAweDYwLCAweEY0LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDFELCAweDYwLAorCSAweEE5LCAweDc4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDI3LCAweEYxLCAweDAwLCAweDYwLCAweDAxLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLAorCSAweENGLCAweEZFLCAweEM2LCAweDAxLCAweDA4LCAweDYwLCAweDI3LCAweEYxLCAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLAorCSAweENGLCAweEZFLCAweERCLCAweEYzLCAweDAxLCAweDYzLCAweEZELCAweEEwLCAweDA4LCAweDYwLCAweDc3LCAweEZELCAweDA3LCAweDAyLCAweDA4LCAweDYwLAorCSAweDMwLCAweEYxLCAweDAwLCAweDYwLCAweDAxLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweEIxLCAweDAxLCAweDBFLCAweDU3LAorCSAweDMyLCAweDQwLCAweDQwLCAweDI2LCAweDFCLCAweDAwLCAweDQ1LCAweDQ4LCAweDAwLCAweDYwLCAweDA2LCAweDYxLCAweEI2LCAweDYwLCAweDU4LCAweDRELAorCSAweDIyLCAweDc4LCAweEZGLCAweEZGLCAweDEzLCAweDAzLCAweDAyLCAweDY0LCAweDIzLCAweEZBLCAweEYyLCAweDYwLCAweDA0LCAweDY0LCAweDVBLCAweERBLAorCSAweDI4LCAweDQ0LCAweDVBLCAweERBLCAweEZGLCAweEZGLCAweDI2LCAweDYwLCAweDBBLCAweDY0LCAweDEzLCAweDYwLCAweDBELCAweEZCLCAweDY2LCAweDQ0LAorCSAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEZBLCAweEZFLCAweDM3LCAweDU4LCAweEZGLCAweEZGLAorCSAweDA4LCAweDYwLCAweDE1LCAweEYxLCAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDg4LCAweDAxLAorCSAweDEyLCAweDYwLCAweEY2LCAweEYzLCAweEZGLCAweEZGLCAweDAwLCAweEE4LCAweDYwLCAweDQ2LCAweDBFLCAweEYyLCAweDRCLCAweDAzLCAweDYwLCAweDQwLAorCSAweEYwLCAweDM3LCAweDM4LCAweDAwLCAweEZGLCAweDM3LCAweDJELCAweDAwLCAweEZELCAweDM3LCAweDI1LCAweDAwLCAweEY4LCAweDM3LCAweDBBLCAweDAwLAorCSAweDYwLCAweDQ3LCAweEZGLCAweEI1LCAweDEwLCAweDYwLCAweDEyLCAweDYyLCAweDQ2LCAweEQxLCAweDAwLCAweDYwLCAweDAxLCAweDY0LCAweEIwLCAweDg0LAorCSAweEEyLCAweERCLCAweENGLCAweEZFLCAweDAwLCAweDY0LCAweDEzLCAweDYwLCAweDBELCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LAorCSAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweERDLCAweDAxLCAweDA2LCAweEI0LCAweEZELCAweDdGLCAweDBFLCAweEZBLCAweDI1LCAweDYwLAorCSAweEYyLCAweDY0LCAweDEzLCAweDYwLCAweDBELCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLAorCSAweDJCLCAweEZGLCAweEY5LCAweEZFLCAweENELCAweDAxLCAweDIzLCAweEYwLCAweDYwLCAweDQwLCAweDA0LCAweDI2LCAweEVELCAweDFCLCAweDAyLCAweDI2LAorCSAweEVCLCAweDE4LCAweEEyLCAweEZGLCAweDAyLCAweEYwLCAweDA5LCAweDYwLCAweDA4LCAweDY0LCAweEQwLCAweDgwLCAweEFELCAweEYzLCAweDAyLCAweDAyLAorCSAweENDLCAweDg0LCAweEFELCAweEZCLCAweDI2LCAweDYwLCAweDFBLCAweDY0LCAweDQwLCAweDRCLCAweDM0LCAweDYwLCAweDU4LCAweDRELCAweDA4LCAweDc4LAorCSAweEZGLCAweEZGLCAweEI2LCAweDAxLCAweEFDLCAweEZFLCAweDA5LCAweDA1LCAweEFELCAweEZFLCAweDBGLCAweDA1LCAweEFFLCAweEZFLCAweEIwLCAweDA1LAorCSAweEFGLCAweEZFLCAweDM3LCAweDA1LCAweENBLCAweDYwLCAweEQ0LCAweDc4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDA4LCAweEYxLCAweDIwLCAweDYwLAorCSAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweEY1LCAweDAxLCAweDEwLCAweDYwLCAweDdBLCAweDY1LCAweDBELCAweDYxLAorCSAweDA3LCAweDAwLCAweEEyLCAweERELCAweDU4LCAweDRGLCAweDY0LCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweEI5LCAweEZGLCAweEZGLCAweDA4LCAweDAzLAorCSAweDAwLCAweDYzLCAweEE1LCAweEQxLCAweDVBLCAweEQzLCAweERBLCAweDg1LCAweDAwLCAweEE4LCAweENELCAweDgxLCAweEYyLCAweDAyLCAweEY4LCAweDAyLAorCSAweEUxLCAweDAxLCAweDEwLCAweDYwLCAweDBFLCAweDYyLCAweDEwLCAweDYwLCAweDU4LCAweDY1LCAweEYzLCAweDYwLCAweEQ3LCAweDYzLCAweDVBLCAweERGLAorCSAweEQ2LCAweDgwLCAweEZGLCAweEZGLCAweDA0LCAweDAzLCAweDVBLCAweERGLCAweDVBLCAweERGLCAweDVBLCAweERELCAweEY5LCAweDAxLCAweDEwLCAweDYwLAorCSAweDc4LCAweDY1LCAweDVBLCAweERGLCAweEQ2LCAweDgwLCAweEZGLCAweEZGLCAweDAyLCAweDAzLCAweDVBLCAweERELCAweEZCLCAweDAxLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweDEyLCAweDY0LCAweDQwLCAweDQxLCAweDEwLCAweDYwLCAweDEwLCAweDYzLCAweEEzLCAweEQxLCAweDAwLCAweDY0LAorCSAweEQwLCAweDgwLCAweDBDLCAweDYxLCAweDA4LCAweDAzLCAweEJELCAweERCLCAweEEzLCAweEQzLCAweEZGLCAweEZGLCAweEIwLCAweDg0LCAweENELCAweDgxLAorCSAweEEzLCAweERCLCAweDA2LCAweEEzLCAweEY5LCAweDAyLCAweDEwLCAweDYwLCAweDYwLCAweDYzLCAweEEzLCAweEQxLCAweDAwLCAweDY0LCAweEQwLCAweDgwLAorCSAweDBELCAweDYxLCAweDE5LCAweDAzLCAweEJELCAweERCLCAweDY0LCAweDQ0LCAweEZFLCAweEEzLCAweDAyLCAweEEzLCAweENELCAweDgxLCAweEU4LCAweDg0LAorCSAweEUzLCAweDAzLCAweDAyLCAweDA1LCAweEUxLCAweDAzLCAweEY5LCAweDAxLCAweDk3LCAweEZCLCAweDk5LCAweEZELCAweDYxLCAweDVDLCAweEEzLCAweEQzLAorCSAweDk4LCAweEY5LCAweDAzLCAweDE4LCAweDU4LCAweDRGLCAweDYwLCAweDU4LCAweEZGLCAweEZGLCAweDk5LCAweEYzLCAweDk4LCAweEYxLCAweDYwLCAweDQzLAorCSAweDk3LCAweEYzLCAweDY0LCAweDQxLCAweEVBLCAweDAxLCAweDIxLCAweDQzLCAweDEwLCAweDYwLCAweDVBLCAweDY1LCAweEQ3LCAweDgwLCAweEJELCAweEQxLAorCSAweEJELCAweEQzLCAweDAzLCAweDAyLCAweENBLCAweDYwLCAweEQ0LCAweDc4LCAweEZGLCAweEZGLCAweEEwLCAweDg0LCAweEJELCAweEQxLCAweDQzLCAweDQxLAorCSAweEY1LCAweDAzLCAweEYzLCAweDYwLCAweERDLCAweDY0LCAweDY0LCAweDU4LCAweDQwLCAweDRGLCAweDJBLCAweEYwLCAweDgzLCAweDYwLCAweEZGLCAweDY1LAorCSAweDY0LCAweDQ3LCAweDAzLCAweDJCLCAweDAxLCAweDAwLCAweDE0LCAweDAwLCAweDAzLCAweDI2LCAweDAzLCAweEFDLCAweDYwLCAweDQ3LCAweEE0LCAweDg0LAorCSAweDJBLCAweEZBLCAweDJGLCAweEYyLCAweDJDLCAweEZBLCAweDMwLCAweEYyLCAweDJELCAweEZBLCAweDMxLCAweEYyLCAweDJFLCAweEZBLCAweDY0LCAweDQxLAorCSAweEVBLCAweEYzLCAweDJGLCAweEZBLCAweDYwLCAweDQzLCAweEVCLCAweEYzLCAweDMwLCAweEZBLCAweEVDLCAweEYxLCAweDMxLCAweEY4LCAweDE5LCAweDAwLAorCSAweDYwLCAweDQ3LCAweEE0LCAweDg0LCAweDJBLCAweEZBLCAweDJGLCAweEYyLCAweDJDLCAweEZBLCAweDMwLCAweEYyLCAweDJELCAweEZBLCAweDMxLCAweEYyLAorCSAweDJFLCAweEZBLCAweDM2LCAweEYyLCAweDMyLCAweEZBLCAweDM3LCAweEYyLCAweDMzLCAweEZBLCAweDM4LCAweEYyLCAweDM0LCAweEZBLCAweEVBLCAweEYzLAorCSAweDJGLCAweEZBLCAweDM2LCAweEZBLCAweEVCLCAweEYzLCAweDMwLCAweEZBLCAweDM3LCAweEZBLCAweEVDLCAweEYzLCAweDMxLCAweEZBLCAweDM4LCAweEZBLAorCSAweDY0LCAweDQxLCAweDFDLCAweEYyLCAweDEzLCAweEZBLCAweDAwLCAweEY0LCAweDBELCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDgwLCAweDJCLAorCSAweDE3LCAweDAwLCAweDgxLCAweDY3LCAweEEyLCAweERBLCAweEY0LCAweDYwLCAweDU4LCAweDRFLCAweENGLCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LAorCSAweDNGLCAweEZDLCAweDI1LCAweDYwLCAweENFLCAweDY0LCAweDEzLCAweDYwLCAweDBELCAweEZCLCAweDI2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LAorCSAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEMxLCAweEZFLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDI2LCAweDQ2LCAweDNGLCAweEYwLCAweDQyLCAweDY0LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDAxLCAweDA0LCAweDNGLCAweEZBLCAweDA3LCAweEYyLAorCSAweEE2LCAweEYxLCAweDAxLCAweDFCLCAweDA3LCAweEY4LCAweDFDLCAweEYyLCAweDEzLCAweEZBLCAweDI2LCAweEYyLCAweDI3LCAweEYwLCAweDYwLCAweDQ3LAorCSAweDAwLCAweEY0LCAweDFGLCAweEZBLCAweDY0LCAweDQ3LCAweDIwLCAweEZBLCAweDYxLCAweDQ0LCAweDIxLCAweEZBLCAweDAxLCAweDY3LCAweDBELCAweEZBLAorCSAweDEwLCAweDYxLCAweDJELCAweDYwLCAweDVFLCAweDY0LCAweDFFLCAweDYzLCAweDU4LCAweEQxLCAweENELCAweDgxLCAweEJELCAweEQ4LCAweEZDLCAweDAyLAorCSAweEI4LCAweEYxLCAweEQ2LCAweEYxLCAweDY0LCAweDVFLCAweDY0LCAweDVGLCAweDQ0LCAweDYzLCAweEJELCAweERBLCAweDE2LCAweDYwLCAweEFDLCAweEYzLAorCSAweEZGLCAweEZGLCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDRBLCAweEQzLCAweDYwLCAweDQ1LCAweDYwLCAweDQwLCAweDAxLCAweDM2LAorCSAweDAzLCAweDY0LCAweDAyLCAweDM2LCAweDAxLCAweDY0LCAweEI0LCAweDg0LCAweDA2LCAweEEyLCAweEEyLCAweEQxLCAweEJELCAweERBLCAweDY0LCAweDQ3LAorCSAweEJELCAweERBLCAweEQzLCAweEYzLCAweEQ0LCAweEYxLCAweDYwLCAweDQ3LCAweEJELCAweERBLCAweDY0LCAweDQ3LCAweEUyLCAweEYxLCAweEJELCAweERBLAorCSAweDY0LCAweDQ0LCAweEJELCAweERBLCAweDI2LCAweDQ2LCAweDAwLCAweDY0LCAweDIzLCAweEYwLCAweDNCLCAweEYwLCAweDY0LCAweDQwLCAweDEwLCAweDJBLAorCSAweDA2LCAweDAwLCAweEMwLCAweDY3LCAweEEwLCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDEwLCAweEJDLCAweDNFLCAweEZBLAorCSAweDI1LCAweDYwLCAweERBLCAweDY0LCAweDEzLCAweDYwLCAweDBELCAweEZCLCAweDI2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLAorCSAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEM4LCAweEZFLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEIxLCAweEYzLAorCSAweDFGLCAweEZBLCAweDMyLCAweDQ3LCAweDA3LCAweEZBLCAweDI0LCAweDdFLCAweDAxLCAweDdGLCAweDA4LCAweEZBLCAweEQ2LCAweEYxLCAweDA5LCAweEY4LAorCSAweDAxLCAweDYwLCAweDAxLCAweDY0LCAweDBBLCAweEZBLCAweDAxLCAweDY0LCAweDBCLCAweEZBLCAweDE4LCAweDY0LCAweDEzLCAweDYwLCAweDBELCAweEZCLAorCSAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDBBLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDUyLCAweDYzLCAweDJFLCAweDU4LAorCSAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDJBLCAweDYxLCAweEI2LCAweDYwLCAweDU4LCAweDRELCAweDI1LCAweDc4LCAweEZGLCAweEZGLCAweDY2LCAweDQ0LAorCSAweDVELCAweEZCLCAweDA0LCAweDY0LCAweDAzLCAweEZBLCAweDY3LCAweDQ0LCAweDJDLCAweEZBLCAweDJELCAweEZBLCAweDJFLCAweEZBLCAweDMyLCAweEZBLAorCSAweDMzLCAweEZBLCAweDM0LCAweEZBLCAweDEyLCAweDYwLCAweDgwLCAweDY0LCAweEE2LCAweEYxLCAweDBFLCAweEZBLCAweDA3LCAweEY4LCAweDAwLCAweDY0LAorCSAweDNFLCAweEZBLCAweDBFLCAweDYwLCAweDNELCAweEZCLCAweDA2LCAweEEyLCAweDEwLCAweDYwLCAweDgwLCAweDY0LCAweEEyLCAweERCLCAweDA0LCAweDY0LAorCSAweDVBLCAweERCLCAweDA2LCAweDY0LCAweDVBLCAweERCLCAweEY4LCAweDYwLCAweENGLCAweDY0LCAweDA4LCAweDYwLCAweDNGLCAweEZCLCAweDAwLCAweDY0LAorCSAweDBFLCAweDYwLCAweDQzLCAweEZCLCAweDA2LCAweEEyLCAweDEwLCAweDYwLCAweDg0LCAweDY0LCAweEEyLCAweERCLCAweDA4LCAweDY0LCAweDVBLCAweERCLAorCSAweDA2LCAweDY0LCAweDVBLCAweERCLCAweEY4LCAweDYwLCAweEQ4LCAweDY0LCAweDA4LCAweDYwLCAweDQxLCAweEZCLCAweEY4LCAweDYwLCAweEI0LCAweDY0LAorCSAweDA4LCAweDYwLCAweDM0LCAweEZCLCAweDAwLCAweDYwLCAweDMwLCAweDY0LCAweDA4LCAweDYwLCAweDEzLCAweEZCLCAweEY1LCAweDYwLCAweDMxLCAweDY0LAorCSAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEY3LCAweDYwLCAweDZDLCAweDc4LAorCSAweEZGLCAweEZGLCAweDVELCAweEY1LCAweEVBLCAweEYxLCAweDJGLCAweEY4LCAweEVCLCAweEYxLCAweDMwLCAweEY4LCAweEVDLCAweEYxLCAweDMxLCAweEY4LAorCSAweEM5LCAweEYxLCAweDE5LCAweEY4LCAweDAwLCAweDYzLCAweDg4LCAweEZELCAweDFCLCAweDYwLCAweEIyLCAweDYzLCAweDg2LCAweEZELCAweDg3LCAweEZELAorCSAweDIwLCAweDQwLCAweDEwLCAweDJCLCAweDAwLCAweDAwLCAweDVELCAweEY1LCAweDQwLCAweDY0LCAweDJBLCAweEZBLCAweDdELCAweEYzLCAweDdDLCAweEZCLAorCSAweDA4LCAweDYwLCAweDEyLCAweEYxLCAweDAwLCAweDYwLCAweDEwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDAzLCAweDAzLCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweDAzLCAweDAwLCAweEY2LCAweDYwLCAweEM2LCAweDc4LCAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweDNELCAweEYzLCAweEZELCAweDYwLAorCSAweDU4LCAweDRFLCAweEFDLCAweDc4LCAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweDNGLCAweEZCLCAweDE5LCAweDYwLCAweDM5LCAweEYzLCAweDNGLCAweDQwLAorCSAweDAxLCAweDI3LCAweDA4LCAweDAwLCAweDBGLCAweDYwLCAweEZGLCAweDY1LCAweEE0LCAweDg0LCAweEZDLCAweDYwLCAweDU4LCAweDRFLCAweDM0LCAweDc4LAorCSAweEZGLCAweEZGLCAweDA1LCAweDAwLCAweDBGLCAweEI0LCAweEZDLCAweDYwLCAweDU4LCAweDRFLCAweDM0LCAweDc4LCAweEZGLCAweEZGLCAweDVELCAweEY1LAorCSAweDM1LCAweDYwLCAweDcwLCAweDY0LCAweDAwLCAweEY0LCAweDQwLCAweDQ4LCAweDJGLCAweDYwLCAweDI0LCAweDY0LCAweDIwLCAweDQwLCAweDEwLCAweDI3LAorCSAweDAyLCAweDAwLCAweDJGLCAweDYwLCAweDAyLCAweDY0LCAweDI4LCAweERCLCAweDA0LCAweDYxLCAweDAwLCAweDYwLCAweDAwLCAweDY0LCAweEYxLCAweDYwLAorCSAweDU4LCAweDRELCAweDM0LCAweDc4LCAweEZGLCAweEZGLCAweDVELCAweEY1LCAweDNGLCAweEZDLCAweDAxLCAweDY0LCAweDU0LCAweEYxLCAweDEwLCAweDYwLAorCSAweDEyLCAweEZCLCAweDdELCAweEZCLCAweEE0LCAweEQzLCAweDA0LCAweDY1LCAweDUzLCAweEYzLCAweDAxLCAweDE4LCAweDBDLCAweDY1LCAweEYzLCAweEI0LAorCSAweEI0LCAweDg0LCAweDUzLCAweEZCLCAweDBELCAweDAwLCAweEY3LCAweDYwLCAweDZDLCAweDc4LCAweEZGLCAweEZGLCAweDUzLCAweEYxLCAweDdELCAweEYzLAorCSAweEZGLCAweEZGLCAweEYzLCAweEEwLCAweDA0LCAweEE0LCAweDAxLCAweDA0LCAweEYxLCAweEE0LCAweDEwLCAweDM2LCAweEY0LCAweDAxLCAweDdELCAweEZCLAorCSAweDIwLCAweDQwLCAweDEwLCAweDJCLCAweDEwLCAweDAwLCAweDdELCAweEYzLCAweDMyLCAweDYwLCAweDgwLCAweDYxLCAweEExLCAweEQxLCAweENDLCAweDg0LAorCSAweDAxLCAweDYxLCAweDA4LCAweDI0LCAweDAzLCAweDAwLCAweEUxLCAweDgxLCAweENDLCAweDg0LCAweEZCLCAweDAxLCAweEExLCAweDg0LCAweDUzLCAweEYxLAorCSAweEU2LCAweDAzLCAweDEwLCAweDYwLCAweDEyLCAweEZCLCAweDdELCAweEYzLCAweDEwLCAweDYwLCAweEYyLCAweDYxLCAweENDLCAweDg0LCAweEZGLCAweEZGLAorCSAweDAyLCAweDAzLCAweDA2LCAweEExLCAweEZCLCAweDAxLCAweEExLCAweEQzLCAweDUzLCAweEYxLCAweDAxLCAweEIwLCAweDAyLCAweEIwLCAweEQ3LCAweDAzLAorCSAweDY0LCAweDQwLCAweDAxLCAweDI2LCAweDA1LCAweDAwLCAweDIwLCAweDQwLCAweDEwLCAweDI3LCAweDAyLCAweDAwLCAweEQwLCAweDAzLCAweDAwLCAweDAwLAorCSAweDlELCAweEZFLCAweDNELCAweDA1LCAweEJBLCAweEZFLCAweDEwLCAweDYwLCAweDI0LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweERFLCAweEZFLAorCSAweDBBLCAweDA0LCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDEzLCAweEZCLCAweEY1LCAweDYwLCAweENCLCAweDY0LCAweDVBLCAweERCLAorCSAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweDI0LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDdELCAweEYxLAorCSAweDEzLCAweDYwLCAweDFBLCAweEY5LCAweDA4LCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDJELCAweEZGLCAweDIwLCAweDYwLCAweDAwLCAweDY0LAorCSAweDA4LCAweDYwLCAweDEzLCAweEZCLCAweEY1LCAweDYwLCAweEYwLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweEJFLCAweEZFLCAweDA4LCAweDYwLCAweDA4LCAweEYxLCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLAorCSAweDFCLCAweDYwLCAweEYzLCAweEYxLCAweEFELCAweDRGLCAweDAwLCAweDdGLCAweEZBLCAweEI0LCAweDY0LCAweDQxLCAweDdELCAweEYxLCAweDAyLCAweEIxLAorCSAweDA0LCAweDY1LCAweDAyLCAweDAyLCAweDY0LCAweDQwLCAweDAxLCAweDJCLCAweDAxLCAweDY1LCAweEI0LCAweDg0LCAweEEwLCAweDVELCAweDEwLCAweDYwLAorCSAweDI0LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweERFLCAweEZFLCAweDBBLCAweDA0LCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLAorCSAweDEzLCAweEZCLCAweEY1LCAweDYwLCAweEM4LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDdELCAweEYxLAorCSAweDEzLCAweDYwLCAweDFBLCAweEY5LCAweDBFLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDJELCAweEZGLCAweDIwLCAweDYwLCAweDAwLCAweDY0LAorCSAweDA4LCAweDYwLCAweDEzLCAweEZCLCAweEY2LCAweDYwLCAweDI4LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweEJFLCAweEZFLCAweDA4LCAweDYwLCAweDA4LCAweEYxLCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLAorCSAweDEwLCAweDYwLCAweDI0LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDVELCAweEY1LCAweDI1LCAweDYwLCAweENFLCAweDY0LCAweDEzLCAweDYwLAorCSAweDBELCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDAwLCAweDY0LAorCSAweDUxLCAweEZCLCAweDAwLCAweDYwLCAweDAxLCAweDY0LCAweDA4LCAweDYwLCAweDEzLCAweEZCLCAweEY2LCAweDYwLCAweDRDLCAweDY0LCAweDVBLCAweERCLAorCSAweENGLCAweEZFLCAweEMxLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweDI0LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLAorCSAweEMzLCAweEYxLCAweDBFLCAweDYwLCAweDNGLCAweEY5LCAweDFDLCAweDYwLCAweDdBLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAyLCAweDY0LAorCSAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweEM0LCAweEYxLCAweDBFLCAweDYwLCAweDQ1LCAweEY5LCAweDI2LCAweDYwLCAweDQyLCAweDYyLAorCSAweEEyLCAweEQzLCAweEZGLCAweEZGLCAweEZELCAweDFCLCAweDFDLCAweDYwLCAweDg2LCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAyLCAweDY0LAorCSAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDAwLCAweDYwLCAweDA4LCAweDY0LCAweDA4LCAweDYwLCAweDEzLCAweEZCLCAweEY2LCAweDYwLAorCSAweDc1LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDUxLCAweEYxLCAweDEwLCAweDYwLCAweDI0LCAweDYyLAorCSAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDY0LCAweDQwLCAweEZGLCAweDI2LCAweDBCLCAweDAwLCAweDUzLCAweEYzLCAweEZGLCAweEZGLCAweDgwLCAweEIwLAorCSAweEZGLCAweEZGLCAweDAzLCAweDAzLCAweEY3LCAweDYwLCAweDY1LCAweDc4LCAweEZGLCAweEZGLCAweEY1LCAweDYwLCAweDk2LCAweDc4LCAweEZGLCAweEZGLAorCSAweDAyLCAweDBBLCAweDAwLCAweDY0LCAweDUxLCAweEZCLCAweEM1LCAweEYxLCAweDBFLCAweDYwLCAweDQ1LCAweEY5LCAweDAwLCAweDYwLCAweDBDLCAweDY0LAorCSAweDA4LCAweDYwLCAweDEzLCAweEZCLCAweEY2LCAweDYwLCAweEEwLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDFDLCAweDYwLCAweDg2LCAweDY0LAorCSAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAyLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDA4LCAweDYwLCAweDEyLCAweEYxLCAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDBCLCAweDAzLCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweDFDLCAweDYwLCAweDg2LCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLAorCSAweDA0LCAweEZGLCAweDEzLCAweDAwLCAweEZGLCAweDYwLCAweEY3LCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDUxLCAweEYzLCAweERFLCAweDBBLAorCSAweDAwLCAweEEwLCAweDAwLCAweDY0LCAweDAyLCAweDAzLCAweDUxLCAweEZCLCAweEQ5LCAweDAxLCAweDFDLCAweDYwLCAweDdBLCAweDY0LCAweDEzLCAweDYwLAorCSAweDIyLCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweEI3LCAweDAxLCAweDE5LCAweDYwLCAweDNFLCAweEYzLAorCSAweEZELCAweDYwLCAweDU4LCAweDRFLCAweEFDLCAweDc4LCAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweDNGLCAweEZCLCAweDE5LCAweDYwLCAweDNBLCAweEYzLAorCSAweDBGLCAweDYwLCAweEZGLCAweDY1LCAweEE0LCAweDg0LCAweEZDLCAweDYwLCAweDU4LCAweDRFLCAweDM0LCAweDc4LCAweEZGLCAweEZGLCAweDVELCAweEY1LAorCSAweDM1LCAweDYwLCAweDcwLCAweDY0LCAweDAwLCAweEY0LCAweDQwLCAweDQ4LCAweDJGLCAweDYwLCAweDI0LCAweDY0LCAweDIwLCAweDQwLCAweDEwLCAweDI3LAorCSAweDAyLCAweDAwLCAweDJGLCAweDYwLCAweDAyLCAweDY0LCAweDI4LCAweERCLCAweDA0LCAweDYxLCAweDAwLCAweDYwLCAweDAwLCAweDY0LCAweEYxLCAweDYwLAorCSAweDU4LCAweDRELCAweDM0LCAweDc4LCAweEZGLCAweEZGLCAweDVELCAweEY1LCAweDNGLCAweEZDLCAweDUzLCAweEYzLCAweDIwLCAweDQwLCAweDEwLCAweDIzLAorCSAweDAyLCAweDAwLCAweDIwLCAweEJDLCAweDA0LCAweDAwLCAweDYwLCAweDQwLCAweDAxLCAweDIyLCAweDQwLCAweEJDLCAweDA0LCAweEJDLCAweDgwLCAweEJDLAorCSAweDUzLCAweEZCLCAweDExLCAweDYwLCAweDYyLCAweDY0LCAweDA4LCAweDYwLCAweDZDLCAweEZCLCAweDA2LCAweDY0LCAweDA4LCAweDYwLCAweDczLCAweEZCLAorCSAweDE5LCAweDYwLCAweDQzLCAweEYzLCAweEZGLCAweEZGLCAweDA3LCAweEI0LCAweEEyLCAweERCLCAweDUzLCAweEYzLCAweDA4LCAweDYwLCAweDZDLCAweEYxLAorCSAweDYwLCAweDQwLCAweDIwLCAweDI2LCAweDAzLCAweDAwLCAweDAxLCAweDI2LCAweDMyLCAweDAwLCAweDQ1LCAweDAwLCAweDA4LCAweDYwLCAweDczLCAweEYzLAorCSAweEZGLCAweEZGLCAweERELCAweEEwLCAweDAxLCAweEE0LCAweDU4LCAweDAzLCAweEEyLCAweERCLCAweDMyLCAweDYwLCAweDgyLCAweDYxLCAweEUwLCAweEEwLAorCSAweEYwLCAweEEwLCAweDA1LCAweDA1LCAweDAxLCAweDA1LCAweDA1LCAweDAwLCAweDAyLCAweEExLCAweEYwLCAweEE0LCAweDAyLCAweDAwLCAweDA0LCAweEExLAorCSAweEUwLCAweEE0LCAweEExLCAweEQxLCAweDAxLCAweDYxLCAweERDLCAweDg0LCAweENDLCAweDg0LCAweEZGLCAweEZGLCAweDAyLCAweDAzLCAweEUxLCAweDgxLAorCSAweEZCLCAweDAxLCAweEExLCAweDgwLCAweDEwLCAweDYwLCAweEU2LCAweDY0LCAweDAxLCAweDAyLCAweEUwLCAweDAxLCAweEEwLCAweEQzLCAweDExLCAweDYwLAorCSAweDVBLCAweDYzLCAweEZBLCAweEE0LCAweENDLCAweDg0LCAweDA4LCAweEEzLCAweEZELCAweDAyLCAweENGLCAweEYxLCAweEEzLCAweEQzLCAweDAxLCAweDE4LAorCSAweEQ1LCAweDE4LCAweEZFLCAweEEzLCAweEEzLCAweEQzLCAweDdELCAweEZCLCAweEY1LCAweDYwLCAweEM4LCAweDc4LCAweEZGLCAweEZGLCAweDEyLCAweDYwLAorCSAweDQwLCAweDY1LCAweDY0LCAweDQxLCAweEExLCAweEQzLCAweEQ1LCAweDgwLCAweDAwLCAweEI4LCAweDI2LCAweDA3LCAweDAyLCAweDAyLCAweDA4LCAweEExLAorCSAweEY5LCAweDAxLCAweDYxLCAweDQ0LCAweDA4LCAweDYwLCAweDZDLCAweEZCLCAweDAxLCAweDY0LCAweEExLCAweERCLCAweDQ5LCAweEQzLCAweDdELCAweEZCLAorCSAweEY1LCAweDYwLCAweEM4LCAweDc4LCAweEZGLCAweEZGLCAweDEyLCAweDYwLCAweDQwLCAweDY1LCAweDY0LCAweDQxLCAweEExLCAweEQzLCAweEQ1LCAweDgwLAorCSAweDA0LCAweEIwLCAweDEyLCAweDA3LCAweDAyLCAweDAyLCAweDA4LCAweEExLCAweEY5LCAweDAxLCAweDYxLCAweDQ0LCAweDA4LCAweDYwLCAweDZDLCAweEZCLAorCSAweDQ5LCAweEQzLCAweDdELCAweEZCLCAweEY1LCAweDYwLCAweEM4LCAweDc4LCAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweEQ4LCAweDY1LCAweEE1LCAweEQzLAorCSAweEZGLCAweEZGLCAweDA4LCAweEE0LCAweEE1LCAweERCLCAweDk5LCAweDAxLCAweDFDLCAweDYwLCAweDdBLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLAorCSAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDUzLCAweEYzLCAweEZGLCAweEZGLCAweEUzLCAweEI0LCAweDUzLCAweEZCLAorCSAweDEwLCAweDYwLCAweDEwLCAweEYzLCAweEZGLCAweEZGLCAweEZFLCAweEI0LCAweEEyLCAweERCLCAweDEwLCAweDYwLCAweDI0LCAweDYyLCAweDAwLCAweDY0LAorCSAweEEyLCAweERCLCAweERFLCAweEZFLCAweDBBLCAweDA0LCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDEzLCAweEZCLCAweEY3LCAweDYwLAorCSAweDdELCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDdDLCAweEYxLCAweDdELCAweEY5LCAweDEzLCAweDYwLAorCSAweDFBLCAweEY5LCAweDBFLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDJELCAweEZGLCAweDIwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLAorCSAweDEzLCAweEZCLCAweEY3LCAweDYwLCAweDlGLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEJFLCAweEZFLAorCSAweDA4LCAweDYwLCAweDA4LCAweEYxLCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDUzLCAweEYzLAorCSAweEZGLCAweEZGLCAweDgwLCAweEIwLCAweEZGLCAweEZGLCAweDU0LCAweDAyLCAweDFDLCAweDYwLCAweDMyLCAweDYzLCAweDFDLCAweDYxLCAweENELCAweDgxLAorCSAweEJELCAweERGLCAweEZELCAweDAyLCAweDE0LCAweDYwLCAweDMyLCAweDYxLCAweDg4LCAweEYzLCAweDYxLCAweDQzLCAweEM0LCAweEE1LCAweDQ3LCAweEQxLAorCSAweDBGLCAweDA0LCAweEJFLCAweEQ1LCAweDFDLCAweDYwLCAweDJFLCAweDYzLCAweEMzLCAweDgzLCAweEMzLCAweDgzLCAweEMzLCAweDgzLCAweDQzLCAweEQzLAorCSAweEJFLCAweEQxLCAweERDLCAweDg0LCAweEEzLCAweERCLCAweDY2LCAweDQ0LCAweEMwLCAweDg0LCAweEJFLCAweERCLCAweDY1LCAweDQ0LCAweEVELCAweDAxLAorCSAweDFDLCAweDYwLCAweDMyLCAweDYzLCAweDBFLCAweDYxLCAweDQxLCAweDRCLCAweEJELCAweEQzLCAweEJELCAweEQxLCAweDAwLCAweEJELCAweDY0LCAweDQxLAorCSAweDE5LCAweDAzLCAweDAxLCAweEE4LCAweDYxLCAweDQ0LCAweDAyLCAweEE4LCAweDE1LCAweDAzLCAweDAyLCAweDAyLCAweEU5LCAweDg0LCAweDEyLCAweDAwLAorCSAweDY1LCAweDQ3LCAweDYwLCAweDQ1LCAweDYxLCAweDQ0LCAweDA5LCAweDYxLCAweENELCAweDgxLCAweEUwLCAweDg0LCAweEZGLCAweDIzLCAweEZDLCAweDAxLAorCSAweDAyLCAweDI0LCAweEM0LCAweDg0LCAweDAyLCAweDI4LCAweEQ0LCAweDg0LCAweENELCAweDgxLCAweDAxLCAweDBFLCAweDAxLCAweEJDLCAweDAyLCAweDAzLAorCSAweEUwLCAweDg0LCAweEY2LCAweDAxLCAweDAwLCAweDdGLCAweDJCLCAweDQxLCAweDRELCAweDhCLCAweEJGLCAweERCLCAweERELCAweDAyLCAweDE0LCAweDYwLAorCSAweDMyLCAweDYxLCAweDg4LCAweEYzLCAweDYxLCAweDQzLCAweEM0LCAweEE1LCAweDQ3LCAweEQxLCAweDBBLCAweDA0LCAweERBLCAweDg2LCAweDFDLCAweDYwLAorCSAweDMwLCAweDYzLCAweEMzLCAweDgzLCAweEMzLCAweDgzLCAweEMzLCAweDgzLCAweDQzLCAweEQxLCAweEE2LCAweEQ5LCAweDY1LCAweDQ0LCAweEYyLCAweDAxLAorCSAweDUzLCAweEYzLCAweDg4LCAweEYxLCAweEYzLCAweEI0LCAweDUzLCAweEZCLCAweDE0LCAweDYwLCAweDMyLCAweDYzLCAweEMzLCAweDg1LCAweDQ1LCAweDRBLAorCSAweDFCLCAweDYwLCAweEIyLCAweDY1LCAweDg3LCAweEYzLCAweDQ1LCAweDRDLCAweDQwLCAweDQ4LCAweDJBLCAweDQ1LCAweEQ3LCAweDgwLCAweDAyLCAweDY1LAorCSAweDE3LCAweDA1LCAweDQ3LCAweEQxLCAweDAyLCAweDY1LCAweDQ3LCAweEQzLCAweDBBLCAweDY1LCAweEQwLCAweDgxLCAweDQ3LCAweEQzLCAweDAxLCAweDA1LAorCSAweDAwLCAweDYxLCAweEYyLCAweEEzLCAweDAxLCAweEIwLCAweDYxLCAweDQ0LCAweDA1LCAweDAzLCAweDJDLCAweERCLCAweDVBLCAweERELCAweDVBLCAweDhDLAorCSAweDNDLCAweEEzLCAweEVCLCAweDAxLCAweDI4LCAweDQyLCAweDRBLCAweERELCAweDRBLCAweERCLCAweDQyLCAweDQ4LCAweDNDLCAweEEzLCAweEU1LCAweDAxLAorCSAweDI4LCAweDQ0LCAweDg2LCAweEZCLCAweDg2LCAweEYxLCAweDFCLCAweDYwLCAweEIyLCAweDYzLCAweDQ0LCAweDQ4LCAweDI4LCAweDQ1LCAweEQ3LCAweDgwLAorCSAweEEzLCAweEQxLCAweDE1LCAweDA1LCAweDA0LCAweDY1LCAweDQ2LCAweEQzLCAweDI4LCAweDQ1LCAweEQ2LCAweDgwLCAweEQwLCAweDgwLCAweDAyLCAweDA0LAorCSAweDA0LCAweEEzLCAweEY1LCAweDAxLCAweEY3LCAweDA2LCAweDYyLCAweDQ2LCAweEEyLCAweEQ5LCAweEEzLCAweERCLCAweDVCLCAweEQzLCAweDY2LCAweDQyLAorCSAweDVBLCAweEQxLCAweEEyLCAweERCLCAweEEzLCAweEQ5LCAweEZFLCAweEEzLCAweEEzLCAweEQxLCAweDY2LCAweDQyLCAweEVCLCAweDAxLCAweDg2LCAweEYzLAorCSAweDg3LCAweEYxLCAweDYwLCAweDQzLCAweDQ0LCAweDQ4LCAweDI4LCAweDQ1LCAweEQ3LCAweDgwLCAweEEzLCAweEQxLCAweDE1LCAweDA1LCAweDA0LCAweDY1LAorCSAweDQ2LCAweEQzLCAweDI4LCAweDQ1LCAweEQ2LCAweDgwLCAweEQwLCAweDgwLCAweDAyLCAweDA0LCAweDA0LCAweEEzLCAweEY1LCAweDAxLCAweEY3LCAweDA2LAorCSAweDYyLCAweDQ2LCAweEEyLCAweEQ5LCAweEEzLCAweERCLCAweDVCLCAweEQzLCAweDY2LCAweDQyLCAweDVBLCAweEQxLCAweEEyLCAweERCLCAweEEzLCAweEQ5LAorCSAweEZFLCAweEEzLCAweEEzLCAweEQxLCAweDY2LCAweDQyLCAweEVCLCAweDAxLCAweDA4LCAweDYwLCAweDA4LCAweEYxLCAweDEwLCAweDYwLCAweDAwLCAweDY0LAorCSAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDdELCAweEYxLCAweDE5LCAweDYwLCAweDNELCAweEYzLCAweDY0LCAweDQwLCAweDAxLCAweDI3LAorCSAweDI3LCAweDAwLCAweEZELCAweDYwLCAweDU4LCAweDRFLCAweEFDLCAweDc4LCAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweDNGLCAweEZCLCAweDE5LCAweDYwLAorCSAweDM5LCAweEYzLCAweDNGLCAweDQwLCAweDAxLCAweDI3LCAweDE2LCAweDAwLCAweDBGLCAweDYwLCAweEZGLCAweDY1LCAweDYwLCAweDQxLCAweERCLCAweEYzLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAzLCAweDM2LCAweDA3LCAweDAwLCAweDE5LCAweDYwLCAweDQ0LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLAorCSAweDAxLCAweDJBLCAweDAxLCAweDAwLCAweDBGLCAweDYxLCAweDYxLCAweDQ0LCAweEE0LCAweDg0LCAweEZDLCAweDYwLCAweDU4LCAweDRFLCAweDM0LCAweDc4LAorCSAweEZGLCAweEZGLCAweDE2LCAweDAwLCAweDBGLCAweEI0LCAweEZDLCAweDYwLCAweDU4LCAweDRFLCAweDM0LCAweDc4LCAweEZGLCAweEZGLCAweDEwLCAweDAwLAorCSAweDVBLCAweEQzLCAweEZELCAweDYwLCAweDU4LCAweDRFLCAweEFDLCAweDc4LCAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweDNGLCAweEZCLCAweDE5LCAweDYwLAorCSAweDNBLCAweEYzLCAweDBGLCAweDYwLCAweEZGLCAweDY1LCAweEE0LCAweDg0LCAweEZDLCAweDYwLCAweDU4LCAweDRFLCAweDM0LCAweDc4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDYwLCAweDMwLCAweDY0LCAweDA4LCAweDYwLCAweDEzLCAweEZCLCAweEY1LCAweDYwLCAweDMxLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDFDLCAweDYwLCAweDdBLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLAorCSAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDAwLCAweDY0LCAweDUzLCAweEZCLCAweDAwLCAweDY0LCAweDA4LCAweDYwLAorCSAweDEyLCAweEZCLCAweDVBLCAweERCLCAweEJFLCAweEZFLCAweDAwLCAweDYwLCAweDMwLCAweDY0LCAweDA4LCAweDYwLCAweDEzLCAweEZCLCAweEY1LCAweDYwLAorCSAweDMxLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLAorCSAweDEyLCAweEYxLCAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDA4LCAweDYwLCAweDEyLCAweEYxLCAweDAwLCAweDYwLCAweDA4LCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweDIwLCAweDQwLCAweDkwLCAweDJCLCAweDAzLCAweDAwLCAweEZCLCAweDYwLCAweEZDLCAweDc4LCAweEZGLCAweEZGLCAweDUzLCAweEYzLAorCSAweDg4LCAweEYxLCAweDA0LCAweEIwLCAweDA3LCAweDYwLCAweDgwLCAweDY0LCAweEQwLCAweDgwLCAweDIwLCAweDAzLCAweDFGLCAweDA2LCAweDI2LCAweDQ2LAorCSAweDg4LCAweEYxLCAweDE0LCAweDYwLCAweDMyLCAweDYzLCAweEMzLCAweDgzLCAweDdELCAweEYzLCAweDI2LCAweEYwLCAweEJELCAweERCLCAweDY0LCAweDQ0LAorCSAweDAwLCAweDdGLCAweEJELCAweERCLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweEJELCAweERCLCAweDMyLCAweEYwLCAweEJELCAweEQ5LCAweDMzLCAweEYwLAorCSAweEJELCAweEQ5LCAweDM0LCAweEYwLCAweEJELCAweEQ5LCAweDAwLCAweEY0LCAweDBELCAweEYwLCAweEJELCAweEQ5LCAweDBFLCAweEYwLCAweEJELCAweEQ5LAorCSAweDBGLCAweEYwLCAweEEzLCAweERGLCAweDY0LCAweDQ3LCAweDYwLCAweDQ1LCAweDAwLCAweDM3LCAweDAzLCAweDAwLCAweEZCLCAweDYwLCAweEY3LCAweDc4LAorCSAweEZGLCAweEZGLCAweEJELCAweERCLCAweEUwLCAweEEwLCAweDFGLCAweDYxLCAweDAwLCAweEI4LCAweEY4LCAweDA3LCAweEY3LCAweDAzLCAweDYwLCAweEZFLAorCSAweDVELCAweEQwLCAweENDLCAweDg0LCAweEJELCAweEQ5LCAweEZDLCAweDAyLCAweDY1LCAweDQwLCAweDAxLCAweDI2LCAweERGLCAweDgzLCAweDVELCAweEQwLAorCSAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAxLCAweDNBLCAweDAzLCAweDAwLCAweDVELCAweEQwLCAweEZGLCAweEZGLCAweEMxLCAweDgxLCAweDVELCAweEQwLAorCSAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAzLCAweDM2LCAweDA3LCAweDAwLCAweDUzLCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDgwLCAweDJBLAorCSAweERELCAweDAxLCAweENELCAweDgxLCAweDEzLCAweDAwLCAweDUzLCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDgwLCAweDJBLCAweDA0LCAweDAwLAorCSAweDVELCAweEQwLCAweEZGLCAweEZGLCAweEMxLCAweDgxLCAweDBBLCAweDAwLCAweDU5LCAweEQwLCAweDdELCAweEYzLCAweEZGLCAweEZGLCAweEQwLCAweDgwLAorCSAweDIwLCAweEZFLCAweDA4LCAweDI0LCAweDAzLCAweDAwLCAweEZCLCAweDYwLCAweEY3LCAweDc4LCAweEZGLCAweEZGLCAweDdDLCAweDQ0LCAweDFBLCAweDYwLAorCSAweDI0LCAweEZCLCAweDFBLCAweDYwLCAweDI1LCAweEZCLCAweDFBLCAweDYwLCAweDI2LCAweEZCLCAweDFBLCAweDYwLCAweDI3LCAweEZCLCAweDFDLCAweDYwLAorCSAweDA4LCAweEZCLCAweDFDLCAweDYwLCAweDA0LCAweEZCLCAweDAwLCAweDY0LCAweDFDLCAweDYwLCAweDA0LCAweEZCLCAweDIwLCAweEZFLCAweDM3LCAweDYwLAorCSAweEZFLCAweDY0LCAweDQwLCAweDRBLCAweEY5LCAweDYwLCAweDU4LCAweDRELCAweEMzLCAweDc4LCAweEZGLCAweEZGLCAweDFDLCAweDYwLCAweDA0LCAweEYzLAorCSAweEZGLCAweEZGLCAweDA5LCAweDE4LCAweEZGLCAweEZGLCAweDFDLCAweDYwLCAweDA2LCAweEYzLCAweDFDLCAweDYwLCAweDA3LCAweEY1LCAweDYwLCAweDQxLAorCSAweDAwLCAweDY0LCAweDFDLCAweDYwLCAweDA0LCAweEZCLCAweDIwLCAweEZFLCAweDJBLCAweEQxLCAweERBLCAweDg1LCAweDY0LCAweDQ0LCAweDAxLCAweEEwLAorCSAweEZGLCAweEZGLCAweDAxLCAweDAyLCAweDc5LCAweDAwLCAweDQ1LCAweDRBLCAweDdDLCAweDQ0LCAweDYwLCAweEZFLCAweEExLCAweEQyLCAweEZGLCAweEZGLAorCSAweEQwLCAweDgwLCAweDIwLCAweEZFLCAweDAxLCAweDAzLCAweEVGLCAweDAxLCAweDFDLCAweDYwLCAweDA0LCAweEYzLCAweEZGLCAweEZGLCAweDAyLCAweDE4LAorCSAweERELCAweDgxLCAweDM1LCAweDAwLCAweDYwLCAweEZFLCAweDVELCAweEQyLCAweEZGLCAweEZGLCAweDYwLCAweDVDLCAweDQxLCAweDk0LCAweDgxLCAweEEwLAorCSAweDIwLCAweEZFLCAweDJELCAweDA0LCAweDAxLCAweDY0LCAweDFDLCAweDYwLCAweDA0LCAweEZCLCAweEMxLCAweDg0LCAweDg0LCAweEE0LCAweDFDLCAweDYwLAorCSAweDA2LCAweEZCLCAweDAwLCAweEYyLCAweDFDLCAweDYwLCAweDA3LCAweEZCLCAweDFDLCAweDYwLCAweDA1LCAweEZELCAweDAyLCAweDYwLCAweDAwLCAweDYzLAorCSAweENELCAweDg1LCAweDY0LCAweDQ0LCAweEQ4LCAweDgxLCAweENELCAweDg0LCAweDRDLCAweDkxLCAweDYwLCAweDQzLCAweDYwLCAweEZFLCAweEE1LCAweEQyLAorCSAweERFLCAweDg1LCAweDdGLCAweDI2LCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDA0LCAweDY1LCAweDVELCAweDkzLCAweEEzLCAweERCLCAweDVELCAweDkzLAorCSAweEE1LCAweEQyLCAweEY2LCAweDFGLCAweDVELCAweDkzLCAweDIwLCAweEZFLCAweERGLCAweDgzLCAweDAwLCAweDYwLCAweDAxLCAweDYxLCAweDAyLCAweDYwLAorCSAweDAwLCAweDY0LCAweEUwLCAweDg3LCAweDYwLCAweDQ2LCAweDFDLCAweDYwLCAweDA1LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQzLCAweDYwLCAweEZFLAorCSAweENELCAweDgxLCAweDIwLCAweEZFLCAweDJBLCAweDQ0LCAweDM4LCAweDYwLCAweDAwLCAweDdDLCAweEQwLCAweDg0LCAweDM4LCAweDYwLCAweDA0LCAweDY1LAorCSAweDQ0LCAweEQ3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDFDLCAweDYwLCAweDA0LCAweEYzLCAweEZGLCAweEZGLCAweDA4LCAweDE4LCAweDFDLCAweDYwLAorCSAweDA2LCAweEYzLCAweDFDLCAweDYwLCAweDA3LCAweEY1LCAweDYwLCAweDQxLCAweDAwLCAweDY0LCAweDFDLCAweDYwLCAweDA0LCAweEZCLCAweDI2LCAweDQ0LAorCSAweDAxLCAweEE0LCAweDU4LCAweDkwLCAweEZGLCAweEZGLCAweDAzLCAweDAyLCAweDYxLCAweDQ0LCAweDBCLCAweEE1LCAweDA0LCAweDAwLCAweDYxLCAweDQ0LAorCSAweEZDLCAweEE0LCAweDhCLCAweDdDLCAweEMwLCAweDg1LCAweERELCAweDgxLCAweDY2LCAweDQ0LCAweDFDLCAweDYwLCAweDA3LCAweEZCLCAweDI2LCAweDQ2LAorCSAweDFCLCAweEYwLCAweDFDLCAweDYwLCAweDA3LCAweEY1LCAweDY0LCAweDQ0LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDAyLCAweDA2LCAweDJELCAweDU4LAorCSAweEZGLCAweEZGLCAweEZBLCAweDYwLCAweEU3LCAweDc4LCAweEZGLCAweEZGLCAweDYwLCAweEZFLCAweDVELCAweEQyLCAweEZGLCAweEZGLCAweDIwLCAweEZFLAorCSAweEZGLCAweEI0LCAweDQxLCAweDk0LCAweDgxLCAweEEwLCAweEZGLCAweEZGLCAweDAyLCAweDA0LCAweDAwLCAweEY0LCAweDg0LCAweEE0LCAweDYwLCAweDQxLAorCSAweDVELCAweDAxLCAweDFBLCAweDYwLCAweDJDLCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDNBLCAweDZDLCAweDAxLCAweDYxLCAweDVDLAorCSAweDFBLCAweDYwLCAweDJCLCAweEY5LCAweDYwLCAweEZFLCAweDVELCAweEQyLCAweEZGLCAweEZGLCAweEZFLCAweEE0LCAweEZGLCAweEZGLCAweDA0LCAweDIwLAorCSAweDAyLCAweDAwLCAweEZGLCAweEExLCAweDYwLCAweDAxLCAweDVELCAweEQwLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAxLCAweDM2LCAweDAyLCAweDAwLAorCSAweEZFLCAweEExLCAweDU5LCAweDAxLCAweDVELCAweEQwLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAwLCAweDM2LCAweDAyLCAweDAwLCAweEZELCAweEExLAorCSAweDUyLCAweDAxLCAweDAxLCAweDdDLCAweDFDLCAweDYwLCAweDA4LCAweEY5LCAweDRDLCAweDAwLCAweDFBLCAweDYwLCAweDJDLCAweEYzLCAweEZGLCAweEZGLAorCSAweDAxLCAweDE4LCAweDQ5LCAweDAxLCAweDAwLCAweDdDLCAweDFDLCAweDYwLCAweDA4LCAweEY5LCAweDYxLCAweDVDLCAweDFBLCAweDYwLCAweDJCLCAweEY5LAorCSAweDYwLCAweEZFLCAweDVELCAweEQyLCAweEZGLCAweEZGLCAweEZBLCAweEE0LCAweEZGLCAweEZGLCAweDA0LCAweDIwLCAweDA0LCAweDAwLCAweEZGLCAweEExLAorCSAweEY5LCAweDYwLCAweDZCLCAweDc4LCAweEZGLCAweEZGLCAweDVELCAweEQwLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAwLCAweDM2LCAweDA0LCAweDAwLAorCSAweEM5LCAweDgxLCAweEY5LCAweDYwLCAweDZCLCAweDc4LCAweEZGLCAweEZGLCAweDVELCAweEQwLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDUwLCAweDM2LAorCSAweDA0LCAweDAwLCAweEZELCAweEExLCAweEY5LCAweDYwLCAweDZCLCAweDc4LCAweEZGLCAweEZGLCAweDVELCAweEQwLCAweEZGLCAweEZGLCAweDY0LCAweDQwLAorCSAweEYyLCAweDM2LCAweDA0LCAweDAwLCAweEZDLCAweEExLCAweEY5LCAweDYwLCAweDZCLCAweDc4LCAweEZGLCAweEZGLCAweDVELCAweEQwLCAweEZGLCAweEZGLAorCSAweDY0LCAweDQwLCAweDAxLCAweDM2LCAweDA0LCAweDAwLCAweEZCLCAweEExLCAweEY5LCAweDYwLCAweDZCLCAweDc4LCAweEZGLCAweEZGLCAweDVELCAweEQwLAorCSAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAxLCAweDM2LCAweDA0LCAweDAwLCAweEZBLCAweEExLCAweEY5LCAweDYwLCAweDZCLCAweDc4LCAweEZGLCAweEZGLAorCSAweDVELCAweEQwLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAwLCAweDM2LCAweDA0LCAweDAwLCAweEY5LCAweEExLCAweEY5LCAweDYwLCAweDZCLCAweDc4LAorCSAweEZGLCAweEZGLCAweDYwLCAweDVDLCAweDAwLCAweDM2LCAweDMyLCAweDAwLCAweDAwLCAweDY0LCAweEZCLCAweDYwLCAweDU4LCAweDRFLCAweDY2LCAweDc4LAorCSAweEZGLCAweEZGLCAweDY1LCAweDQwLCAweDA4LCAweDI2LCAweEY3LCAweDAxLCAweDFBLCAweDYwLCAweDI0LCAweEZCLCAweDY0LCAweDQwLCAweDAwLCAweDM2LAorCSAweDJBLCAweDAwLCAweDVELCAweEQyLCAweERELCAweDgxLCAweEZCLCAweDYwLCAweDU4LCAweDRFLCAweDY2LCAweDc4LCAweEZGLCAweEZGLCAweDY1LCAweDQwLAorCSAweDA4LCAweDI2LCAweEY2LCAweDAxLCAweDFBLCAweDYwLCAweDI1LCAweEZCLCAweDY0LCAweDQwLCAweDAwLCAweDM2LCAweDIxLCAweDAwLCAweDVELCAweEQyLAorCSAweERELCAweDgxLCAweEZCLCAweDYwLCAweDU4LCAweDRFLCAweDY2LCAweDc4LCAweEZGLCAweEZGLCAweDY1LCAweDQwLCAweDA4LCAweDI2LCAweEY2LCAweDAxLAorCSAweDFBLCAweDYwLCAweDI2LCAweEZCLCAweDY0LCAweDQwLCAweDAwLCAweDM2LCAweDE4LCAweDAwLCAweDVELCAweEQwLCAweDM0LCAweDYwLCAweDRFLCAweDYyLAorCSAweEEyLCAweEQ5LCAweDVELCAweEQwLCAweDM0LCAweDYwLCAweDRGLCAweDYyLCAweEEyLCAweEQ5LCAweDE0LCAweDAwLCAweDIwLCAweEZFLCAweDAwLCAweDYwLAorCSAweDA0LCAweDY0LCAweDFBLCAweDYwLCAweDI0LCAweEZCLCAweDIwLCAweEZFLCAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweDFBLCAweDYwLCAweDI1LCAweEZCLAorCSAweDIwLCAweEZFLCAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweDFBLCAweDYwLCAweDI2LCAweEZCLCAweDIwLCAweEZFLCAweDAwLCAweDYwLCAweDAwLCAweDY0LAorCSAweDFBLCAweDYwLCAweDI3LCAweEZCLCAweDIwLCAweEZFLCAweDFDLCAweDYwLCAweDA4LCAweEYxLCAweEZGLCAweEZGLCAweDAzLCAweDE4LCAweDAxLCAweDdDLAorCSAweDFDLCAweDYwLCAweDA4LCAweEY5LCAweDFBLCAweDYwLCAweDJCLCAweEYxLCAweEEyLCAweERELCAweDYxLCAweDQ0LCAweDFBLCAweDYwLCAweDI4LCAweEZCLAorCSAweEQxLCAweDg0LCAweERDLCAweDg0LCAweDY0LCAweDQ1LCAweDM0LCAweDYwLCAweDEwLCAweDYzLCAweEJELCAweERCLCAweDYwLCAweDQxLCAweENELCAweDg0LAorCSAweDRDLCAweDkxLCAweDYwLCAweDQzLCAweDYwLCAweEZFLCAweEE1LCAweEQyLCAweERFLCAweDg1LCAweDdGLCAweDI2LCAweDAyLCAweDAwLCAweDAwLCAweEY0LAorCSAweDA0LCAweDY1LCAweDVELCAweDkzLCAweEEzLCAweERCLCAweDVELCAweDkzLCAweEE1LCAweEQyLCAweEY2LCAweDFGLCAweDVELCAweDkzLCAweDIwLCAweEZFLAorCSAweERGLCAweDgzLCAweDFBLCAweDYwLCAweDA5LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQ3LCAweEEyLCAweERCLCAweDFBLCAweDYwLCAweDI4LCAweEYzLAorCSAweDFBLCAweDYwLCAweDJCLCAweEYxLCAweDYwLCAweDQxLCAweDY0LCAweDQzLCAweEY5LCAweDYwLCAweDU2LCAweDc4LCAweEZGLCAweEZGLCAweDIwLCAweEZFLAorCSAweDdDLCAweDQ0LCAweDFBLCAweDYwLCAweDIwLCAweEZCLCAweDFBLCAweDYwLCAweDFBLCAweEYxLCAweDFBLCAweDYwLCAweDI0LCAweEYzLCAweEZGLCAweEZGLAorCSAweEEwLCAweDg0LCAweEZGLCAweEZGLCAweDEwLCAweDI2LCAweDA3LCAweDAwLCAweDA0LCAweDI2LCAweDA3LCAweDAwLCAweDIwLCAweDI2LCAweDA3LCAweDAwLAorCSAweDAyLCAweDI2LCAweDA3LCAweDAwLCAweDNGLCAweDAwLCAweDEwLCAweDdDLCAweDA1LCAweDAwLCAweDA0LCAweDdDLCAweDAzLCAweDAwLCAweDIwLCAweDdDLAorCSAweDAxLCAweDAwLCAweDAyLCAweDdDLCAweDFBLCAweDYwLCAweDIwLCAweEY5LCAweDdDLCAweDQ0LCAweDFBLCAweDYwLCAweDIxLCAweEZCLCAweDFBLCAweDYwLAorCSAweDFCLCAweEYxLCAweDFBLCAweDYwLCAweDI1LCAweEYzLCAweDM0LCAweDYwLCAweDQwLCAweDYxLCAweEEwLCAweDg0LCAweEExLCAweEQxLCAweEZGLCAweEZGLAorCSAweDEwLCAweDI2LCAweDA1LCAweDAwLCAweDA0LCAweDI2LCAweDA1LCAweDAwLCAweDAxLCAweDI2LCAweDA4LCAweDAwLCAweDIzLCAweDAwLCAweDEwLCAweDdDLAorCSAweDA2LCAweDAwLCAweDY0LCAweDQwLCAweDEwLCAweDI2LCAweDFFLCAweDAwLCAweDA0LCAweDdDLCAweDAxLCAweDAwLCAweDAxLCAweDdDLCAweDFBLCAweDYwLAorCSAweDIxLCAweEY5LCAweDdDLCAweDQ0LCAweDFBLCAweDYwLCAweDIyLCAweEZCLCAweDFBLCAweDYwLCAweDFDLCAweEYxLCAweDFBLCAweDYwLCAweDI2LCAweEYzLAorCSAweEZGLCAweEZGLCAweEEwLCAweDg0LCAweDYwLCAweDQwLCAweDAyLCAweDI2LCAweDA1LCAweDAwLCAweDA0LCAweDI2LCAweDA1LCAweDAwLCAweDAxLCAweDI2LAorCSAweDA1LCAweDAwLCAweDA4LCAweDAwLCAweDAyLCAweDdDLCAweDAzLCAweDAwLCAweDA0LCAweDdDLCAweDAxLCAweDAwLCAweDIwLCAweDdDLCAweDFBLCAweDYwLAorCSAweDIyLCAweEY5LCAweDA5LCAweDAwLCAweDdDLCAweDQ0LCAweDFBLCAweDYwLCAweDIwLCAweEZCLCAweDFBLCAweDYwLCAweDIxLCAweEZCLCAweDFBLCAweDYwLAorCSAweDIyLCAweEZCLCAweDFBLCAweDYwLCAweDIzLCAweEZCLCAweDdDLCAweDQ0LCAweDFBLCAweDYwLCAweDIwLCAweEYxLCAweEJELCAweEQ5LCAweDFBLCAweDYwLAorCSAweDIxLCAweEYxLCAweEIwLCAweDg0LCAweEJELCAweEQ5LCAweDFBLCAweDYwLCAweDIyLCAweEYxLCAweEIwLCAweDg0LCAweEJELCAweEQ5LCAweDFBLCAweDYwLAorCSAweDFELCAweEYxLCAweEIwLCAweDg0LCAweEJELCAweEQ5LCAweDA0LCAweDAzLCAweDFDLCAweDYwLCAweDA4LCAweEYxLCAweEJELCAweEQ5LCAweDcyLCAweDAwLAorCSAweDE2LCAweDYwLCAweEMyLCAweEYzLCAweEZGLCAweEZGLCAweEZGLCAweEEwLCAweEZGLCAweEZGLCAweDBDLCAweDI0LCAweDZCLCAweDAwLCAweDYwLCAweDQwLAorCSAweDBCLCAweDM2LCAweDY4LCAweDAwLCAweDIwLCAweDQwLCAweDEwLCAweDI3LCAweDY1LCAweDAwLCAweDkxLCAweDAwLCAweDIwLCAweEZFLCAweDAwLCAweDY1LAorCSAweDYwLCAweEZFLCAweDFBLCAweDYwLCAweDI4LCAweEZCLCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDA4LCAweDIwLCAweDAzLCAweDAwLCAweDAxLCAweDY0LAorCSAweEEyLCAweERCLCAweDAyLCAweDY0LCAweDAyLCAweEE1LCAweDY0LCAweDQ0LCAweEQ0LCAweDlDLCAweEQ0LCAweDgwLCAweDM0LCAweDYwLCAweDUyLCAweDYyLAorCSAweDAyLCAweDA1LCAweDA4LCAweDY1LCAweDRELCAweDAwLCAweEEyLCAweEQ5LCAweDdDLCAweDQ0LCAweDM0LCAweDYwLCAweDU0LCAweDYyLCAweEEyLCAweERCLAorCSAweDIwLCAweEZFLCAweDAwLCAweDY0LCAweDYwLCAweEZFLCAweDFDLCAweDYwLCAweDA4LCAweEYzLCAweEZGLCAweEZGLCAweDAwLCAweEEwLCAweDVELCAweEQwLAorCSAweDAwLCAweDY1LCAweDA0LCAweDAzLCAweDY0LCAweDQwLCAweDAwLCAweDNBLCAweDAxLCAweDY1LCAweDAzLCAweDAwLCAweDY0LCAweDQwLCAweDAwLCAweDNBLAorCSAweDAxLCAweDY1LCAweDVELCAweEQwLCAweDA0LCAweDAzLCAweDY0LCAweDQwLCAweDBGLCAweDNBLCAweDAxLCAweDY1LCAweDAzLCAweDAwLCAweDY0LCAweDQwLAorCSAweDUwLCAweDNBLCAweDAxLCAweDY1LCAweDVELCAweEQwLCAweDA0LCAweDAzLCAweDY0LCAweDQwLCAweEFDLCAweDNBLCAweDAxLCAweDY1LCAweDAzLCAweDAwLAorCSAweDY0LCAweDQwLCAweEYyLCAweDNBLCAweDAxLCAweDY1LCAweDVELCAweEQwLCAweDY1LCAweDQwLCAweDAwLCAweDNBLCAweDE3LCAweDAwLCAweDAwLCAweDYwLAorCSAweDAwLCAweDY1LCAweDY0LCAweDQwLCAweDAwLCAweDM2LCAweDAxLCAweDY1LCAweDY0LCAweDQwLCAweDAxLCAweDM2LCAweDAyLCAweDY1LCAweDY0LCAweDQwLAorCSAweDAyLCAweDM2LCAweDA0LCAweDY1LCAweDY0LCAweDQwLCAweDA0LCAweDM2LCAweDEwLCAweDY1LCAweDY0LCAweDQwLCAweDA1LCAweDM2LCAweDIwLCAweDY1LAorCSAweDY1LCAweDVDLCAweDFBLCAweDYwLCAweDJBLCAweEYzLCAweEZGLCAweEZGLCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweDFBLCAweDYwLCAweDI4LCAweEYzLAorCSAweDAwLCAweDY1LCAweEZGLCAweEE0LCAweEEyLCAweERCLCAweEJDLCAweDAyLCAweDFBLCAweDYwLCAweDJBLCAweEYzLCAweDFBLCAweDYwLCAweDI5LCAweEYxLAorCSAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDIwLCAweEZFLCAweDg4LCAweEYzLCAweEZGLCAweEZGLCAweDNDLCAweEE0LCAweDg4LCAweEZCLCAweDg3LCAweEYzLAorCSAweDdELCAweEYxLCAweDA0LCAweEE0LCAweDg3LCAweEZCLCAweDUzLCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDgwLCAweDI2LCAweDBELCAweDAwLAorCSAweDdELCAweEYzLCAweDEwLCAweDYwLCAweEYyLCAweDYxLCAweENDLCAweDg0LCAweEZGLCAweEZGLCAweDAyLCAweDAzLCAweDA2LCAweEExLCAweEZCLCAweDAxLAorCSAweEExLCAweEQzLCAweEZGLCAweEZGLCAweDAyLCAweEJDLCAweEExLCAweERCLCAweDEyLCAweDAwLCAweDdELCAweEYzLCAweDExLCAweDYwLCAweDYwLCAweDYzLAorCSAweDAxLCAweDYwLCAweEZGLCAweDY1LCAweEE0LCAweDg0LCAweDEyLCAweDYwLCAweDQwLCAweDY1LCAweEEzLCAweEQxLCAweEQ3LCAweDgwLCAweEQwLCAweDgwLAorCSAweDA2LCAweDAzLCAweDAyLCAweDAzLCAweDA4LCAweEEzLCAweEY5LCAweDAxLCAweDAyLCAweEEzLCAweDA0LCAweDY0LCAweEEzLCAweERCLCAweDIwLCAweEZFLAorCSAweDI2LCAweDQ2LCAweDMxLCAweDQwLCAweDIwLCAweDJBLCAweDM1LCAweDAwLCAweDNGLCAweEYyLCAweDQ3LCAweDY1LCAweEM0LCAweDg0LCAweEU4LCAweDg0LAorCSAweDIzLCAweEZBLCAweEYxLCAweDYwLCAweDAyLCAweDY0LCAweDI0LCAweEZBLCAweDdELCAweEYzLCAweDAxLCAweDYwLCAweEZGLCAweDY1LCAweEE0LCAweDg0LAorCSAweDAxLCAweDIzLCAweDE0LCAweDAwLCAweDExLCAweDYwLCAweDYwLCAweDYxLCAweDEyLCAweDYwLCAweDQwLCAweDY1LCAweEExLCAweEQxLCAweEQ1LCAweDgwLAorCSAweEQwLCAweDgwLCAweDBCLCAweDAzLCAweDAyLCAweDAzLCAweDA4LCAweEExLCAweEY5LCAweDAxLCAweDA0LCAweEExLCAweEExLCAweEQzLCAweDAxLCAweDYwLAorCSAweDAwLCAweDY1LCAweDYwLCAweDQ3LCAweEZGLCAweEI0LCAweEI0LCAweDg0LCAweDAxLCAweDAwLCAweDAxLCAweDY0LCAweDAwLCAweEY0LCAweDA4LCAweEZBLAorCSAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDI2LCAweDYwLCAweDBBLCAweDY0LCAweDEzLCAweDYwLCAweDBELCAweEZCLCAweDI2LCAweDQ0LCAweDVBLCAweERCLAorCSAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEZBLCAweEZFLCAweDAwLCAweDY2LCAweDQ2LCAweDQ2LCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDc4LCAweEZCLCAweEFDLCAweDg1LCAweDYwLCAweDQxLCAweDU1LCAweDAzLAorCSAweDMyLCAweDYwLCAweDAwLCAweDYzLCAweDFCLCAweDYwLCAweDA0LCAweEZELCAweDYyLCAweDQzLCAweDFBLCAweDYwLCAweEI0LCAweEZELCAweDFBLCAweDYwLAorCSAweEJBLCAweEZELCAweDFBLCAweDYwLCAweEM0LCAweEZELCAweDFBLCAweDYwLCAweENFLCAweEZELCAweDAwLCAweDYzLCAweEU5LCAweDgxLCAweDA4LCAweDY0LAorCSAweDAyLCAweDI0LCAweERGLCAweDgzLCAweEZCLCAweDAyLCAweDUzLCAweDk0LCAweDMyLCAweDdGLCAweDAzLCAweDA2LCAweDFCLCAweDYwLCAweDA0LCAweEZCLAorCSAweDA4LCAweDYzLCAweDYzLCAweDVFLCAweDAxLCAweDdGLCAweDE5LCAweDYwLCAweDhBLCAweEZCLCAweDY1LCAweDQxLCAweDMzLCAweDYwLCAweDE2LCAweDY1LAorCSAweDBGLCAweDYwLCAweEY0LCAweDY0LCAweEU5LCAweDgxLCAweDU4LCAweEQxLCAweEZELCAweDA0LCAweENGLCAweDgzLCAweEE1LCAweEQ5LCAweDBDLCAweDAzLAorCSAweEU5LCAweDgxLCAweDU4LCAweEQxLCAweEZELCAweDA0LCAweDQwLCAweDQ4LCAweEE1LCAweEQxLCAweDY0LCAweDVGLCAweDY0LCAweDVFLCAweEE1LCAweERCLAorCSAweERBLCAweDg1LCAweENGLCAweDgzLCAweDI4LCAweDQ0LCAweEVFLCAweDAyLCAweDAwLCAweEI5LCAweEQ4LCAweDgzLCAweDE1LCAweDAzLCAweDM2LCAweDYwLAorCSAweDBBLCAweDY1LCAweEU5LCAweDgxLCAweEJELCAweEQxLCAweDAyLCAweDA1LCAweEZDLCAweDAyLCAweDE3LCAweDAwLCAweEE1LCAweEQ5LCAweDE1LCAweDAzLAorCSAweEU5LCAweDgxLCAweEJELCAweEQxLCAweDAyLCAweDA1LCAweEZDLCAweDAyLCAweDEwLCAweDAwLCAweEE1LCAweEQzLCAweEZGLCAweEZGLCAweDY0LCAweDVGLAorCSAweEE1LCAweERCLCAweERBLCAweDg1LCAweEVFLCAweDAyLCAweDA5LCAweDAwLCAweDY3LCAweDQzLCAweDFBLCAweDYwLCAweEI0LCAweEZELCAweDFBLCAweDYwLAorCSAweEJBLCAweEZELCAweDFBLCAweDYwLCAweEM0LCAweEZELCAweDFBLCAweDYwLCAweENFLCAweEZELCAweDJFLCAweDQ1LCAweDI1LCAweDYwLCAweDQ2LCAweDY0LAorCSAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDEwLCAweDAzLCAweDIwLCAweDQwLCAweDEwLCAweDI3LCAweDBELCAweDAwLCAweDMzLCAweDYwLCAweDFFLCAweDYxLAorCSAweDE5LCAweDYwLCAweDhBLCAweEYzLCAweEExLCAweERCLCAweEZGLCAweEI0LCAweENDLCAweDg0LCAweEE4LCAweDgzLCAweDMzLCAweDYwLCAweDE0LCAweDY0LAorCSAweDU4LCAweEQxLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweDdELCAweEYzLCAweDMzLCAweDYwLCAweDIwLCAweDYzLCAweDYwLCAweDQwLCAweDAxLCAweDI3LAorCSAweDAzLCAweDAwLCAweDE5LCAweDYwLCAweDNCLCAweEYzLCAweDAyLCAweDAwLCAweDE5LCAweDYwLCAweDNDLCAweEYzLCAweDA4LCAweDYxLCAweDYwLCAweEZFLAorCSAweEEzLCAweEQxLCAweEZGLCAweEZGLCAweDIwLCAweEZFLCAweDAwLCAweEE4LCAweEU4LCAweDg0LCAweDBGLCAweDAzLCAweDYwLCAweEZFLCAweDAyLCAweDI4LAorCSAweEY2LCAweDAxLCAweDgwLCAweDYyLCAweEIyLCAweDlDLCAweEJELCAweEQ5LCAweDdCLCAweEY5LCAweENELCAweDgxLCAweDAwLCAweDM2LCAweDAxLCAweDAwLAorCSAweEVFLCAweDAxLCAweDM2LCAweDYwLCAweDBBLCAweDYzLCAweDA4LCAweDYxLCAweEVBLCAweDAxLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDMyLCAweDYwLAorCSAweDc2LCAweDYzLCAweDY1LCAweDQwLCAweEZGLCAweDM2LCAweDAyLCAweEEzLCAweEEzLCAweEQzLCAweEZGLCAweEZGLCAweEU4LCAweDg0LCAweEU4LCAweDg0LAorCSAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDQwLCAweDI2LCAweDdGLCAweEI0LCAweDIwLCAweDI2LCAweDNGLCAweEI0LCAweDYwLCAweDQ1LCAweDgwLCAweDYzLAorCSAweEZELCAweDYwLCAweDU4LCAweDRELCAweDM0LCAweDc4LCAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweDdELCAweEZCLCAweDQwLCAweDYzLCAweEZELCAweDYwLAorCSAweDU4LCAweDRELCAweDM0LCAweDc4LCAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweDdFLCAweEZCLCAweDIwLCAweDYzLCAweEZELCAweDYwLCAweDU4LCAweDRELAorCSAweDM0LCAweDc4LCAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweDdGLCAweEZCLCAweDEwLCAweDYzLCAweEZELCAweDYwLCAweDU4LCAweDRELCAweDM0LCAweDc4LAorCSAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweDgwLCAweEZCLCAweDA4LCAweDYzLCAweEZELCAweDYwLCAweDU4LCAweDRELCAweDM0LCAweDc4LCAweEZGLCAweEZGLAorCSAweDE5LCAweDYwLCAweDgxLCAweEZCLCAweDA0LCAweDYzLCAweEZELCAweDYwLCAweDU4LCAweDRELCAweDM0LCAweDc4LCAweEZGLCAweEZGLCAweDE5LCAweDYwLAorCSAweDgyLCAweEZCLCAweDAyLCAweDYzLCAweEZELCAweDYwLCAweDU4LCAweDRELCAweDM0LCAweDc4LCAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweDgzLCAweEZCLAorCSAweDAxLCAweDYzLCAweEZELCAweDYwLCAweDU4LCAweDRELCAweDM0LCAweDc4LCAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweDg0LCAweEZCLCAweDJFLCAweDU4LAorCSAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweDNCLCAweEYzLCAweEZGLCAweEZGLCAweDBGLCAweEI0LCAweDYwLCAweDQ1LCAweDA4LCAweDYzLCAweEZELCAweDYwLAorCSAweDU4LCAweDRELCAweDVGLCAweDc4LCAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweDg1LCAweEZCLCAweDA0LCAweDYzLCAweEZELCAweDYwLCAweDU4LCAweDRELAorCSAweDVGLCAweDc4LCAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweDg2LCAweEZCLCAweDAyLCAweDYzLCAweEZELCAweDYwLCAweDU4LCAweDRELCAweDVGLCAweDc4LAorCSAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweDg3LCAweEZCLCAweDAxLCAweDYzLCAweEZELCAweDYwLCAweDU4LCAweDRELCAweDVGLCAweDc4LCAweEZGLCAweEZGLAorCSAweDE5LCAweDYwLCAweDg4LCAweEZCLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDYzLCAweDVDLCAweEE3LCAweDg0LCAweEVCLCAweDgzLCAweDE0LCAweDAyLAorCSAweDAxLCAweDAzLCAweEZCLCAweDAxLCAweDY0LCAweDQ0LCAweDAxLCAweDM2LCAweDBCLCAweDY0LCAweDAyLCAweDM2LCAweDBCLCAweDY0LCAweDA0LCAweDM2LAorCSAweDBBLCAweDY0LCAweDA4LCAweDM2LCAweDBBLCAweDY0LCAweDEwLCAweDM2LCAweDA5LCAweDY0LCAweDIwLCAweDM2LCAweDA5LCAweDY0LCAweDQwLCAweDM2LAorCSAweDA5LCAweDY0LCAweDgwLCAweDM2LCAweDA5LCAweDY0LCAweDExLCAweDAwLCAweDYwLCAweDQwLCAweDAxLCAweDM2LCAweDBCLCAweDY0LCAweDAyLCAweDM2LAorCSAweDBGLCAweDY0LCAweDA0LCAweDM2LCAweDBBLCAweDY0LCAweDA4LCAweDM2LCAweDBFLCAweDY0LCAweDEwLCAweDM2LCAweDA5LCAweDY0LCAweDIwLCAweDM2LAorCSAweDBELCAweDY0LCAweDQwLCAweDM2LCAweDA4LCAweDY0LCAweDgwLCAweDM2LCAweDBDLCAweDY0LCAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDYzLCAweDVDLAorCSAweEE3LCAweDg0LCAweEVCLCAweDgzLCAweDBDLCAweDAyLCAweDAxLCAweDAzLCAweEZCLCAweDAxLCAweDY0LCAweDQ0LCAweDAxLCAweDM2LCAweDBBLCAweDY0LAorCSAweDAyLCAweDM2LCAweDE0LCAweDY0LCAweDA0LCAweDM2LCAweDM3LCAweDY0LCAweDA4LCAweDM2LCAweDZFLCAweDY0LCAweDA5LCAweDAwLCAweDYwLCAweDQwLAorCSAweDAxLCAweDM2LCAweDBBLCAweDY0LCAweDAyLCAweDM2LCAweDE0LCAweDY0LCAweDA0LCAweDM2LCAweDM3LCAweDY0LCAweDA4LCAweDM2LCAweDZFLCAweDY0LAorCSAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDYwLCAweEZFLCAweDgxLCAweEExLCAweDdGLCAweEExLCAweDAyLCAweDA2LCAweDAwLCAweEY0LCAweDAzLCAweDYxLAorCSAweDVELCAweEQyLCAweENGLCAweDgzLCAweEQ0LCAweDgwLCAweDI1LCAweDAzLCAweDE2LCAweDAzLCAweENGLCAweDgzLCAweDYxLCAweDQ0LCAweDgwLCAweEEwLAorCSAweDIwLCAweDAzLCAweDAyLCAweDAyLCAweDAwLCAweEY0LCAweDAzLCAweDYxLCAweDVELCAweEQyLCAweENGLCAweDgzLCAweDgxLCAweEExLCAweDE5LCAweDAzLAorCSAweDA1LCAweDA3LCAweDdGLCAweEExLCAweENDLCAweDg0LCAweERELCAweDgxLCAweEU2LCAweDAzLCAweEY3LCAweDAxLCAweDAwLCAweEY0LCAweDAwLCAweEI4LAorCSAweDA0LCAweDYxLCAweEU2LCAweDAzLCAweEYyLCAweDAxLCAweDJDLCAweDQzLCAweDVELCAweEQwLCAweERFLCAweEQ5LCAweDY0LCAweDQ0LCAweDVELCAweEQwLAorCSAweERFLCAweEQ5LCAweENDLCAweDg0LCAweDgxLCAweEExLCAweDA1LCAweDAzLCAweDdGLCAweEExLCAweEY5LCAweDA0LCAweDAwLCAweEY0LCAweDAzLCAweDYxLAorCSAweEY2LCAweDAxLCAweDIwLCAweEZFLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDAxLCAweDNBLCAweDAyLCAweDAwLCAweDE2LCAweDY0LCAweDJCLCAweDAwLAorCSAweDAyLCAweDNBLCAweDAyLCAweDAwLCAweDE0LCAweDY0LCAweDI3LCAweDAwLCAweDA0LCAweDNBLCAweDAyLCAweDAwLCAweDEyLCAweDY0LCAweDIzLCAweDAwLAorCSAweDA4LCAweDNBLCAweDAyLCAweDAwLCAweDEwLCAweDY0LCAweDFGLCAweDAwLCAweDEwLCAweDNBLCAweDAyLCAweDAwLCAweDBFLCAweDY0LCAweDFCLCAweDAwLAorCSAweDIwLCAweDNBLCAweDAyLCAweDAwLCAweDBDLCAweDY0LCAweDE3LCAweDAwLCAweDQwLCAweDNBLCAweDAyLCAweDAwLCAweDBBLCAweDY0LCAweDEzLCAweDAwLAorCSAweDgwLCAweDNBLCAweDAyLCAweDAwLCAweDA4LCAweDY0LCAweDBGLCAweDAwLCAweDAxLCAweDNCLCAweDAyLCAweDAwLCAweDA2LCAweDY0LCAweDBCLCAweDAwLAorCSAweDAyLCAweDNCLCAweDAyLCAweDAwLCAweDA0LCAweDY0LCAweDA3LCAweDAwLCAweDA0LCAweDNCLCAweDAyLCAweDAwLCAweDAyLCAweDY0LCAweDAzLCAweDAwLAorCSAweDA4LCAweDNCLCAweEZGLCAweDAxLCAweDAwLCAweDY0LCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDI3LCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLAorCSAweDM2LCAweDNBLCAweDAyLCAweDAwLCAweDAwLCAweDYxLCAweDMwLCAweDAwLCAweDMwLCAweDNBLCAweDAyLCAweDAwLCAweDAyLCAweDYxLCAweDJDLCAweDAwLAorCSAweDI0LCAweDNBLCAweDAyLCAweDAwLCAweDA0LCAweDYxLCAweDI4LCAweDAwLCAweDE4LCAweDNBLCAweDAyLCAweDAwLCAweDA2LCAweDYxLCAweDI0LCAweDAwLAorCSAweDEyLCAweDNBLCAweDAyLCAweDAwLCAweDA4LCAweDYxLCAweDIwLCAweDAwLCAweDBDLCAweDNBLCAweDAyLCAweDAwLCAweDBBLCAweDYxLCAweDFDLCAweDAwLAorCSAweDA5LCAweDNBLCAweDAyLCAweDAwLCAweDBDLCAweDYxLCAweDE4LCAweDAwLCAweDA2LCAweDNBLCAweDAyLCAweDAwLCAweDBFLCAweDYxLCAweDE0LCAweDAwLAorCSAweDZFLCAweDNBLCAweDAyLCAweDAwLCAweDEwLCAweDYxLCAweDEwLCAweDAwLCAweDM3LCAweDNBLCAweDAyLCAweDAwLCAweDEyLCAweDYxLCAweDBDLCAweDAwLAorCSAweDE0LCAweDNBLCAweDAyLCAweDAwLCAweDE0LCAweDYxLCAweDA4LCAweDAwLCAweDBBLCAweDNBLCAweDAyLCAweDAwLCAweDE2LCAweDYxLCAweDA0LCAweDAwLAorCSAweDc4LCAweDQzLCAweDAzLCAweDYxLCAweDI5LCAweDYwLCAweEVBLCAweDc4LCAweDY1LCAweDQwLCAweDAxLCAweDNBLCAweDEzLCAweDAwLCAweDY2LCAweDQ1LAorCSAweDJCLCAweDQ2LCAweDkyLCAweEZBLCAweDY1LCAweDQ2LCAweDI2LCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQxLCAweDAwLCAweDdGLCAweDYwLCAweDQ1LAorCSAweDYxLCAweDQ3LCAweDAwLCAweDdGLCAweEQ0LCAweDg0LCAweDY2LCAweDQxLCAweDJCLCAweDQ2LCAweDBFLCAweEYyLCAweDYwLCAweDQ1LCAweDY1LCAweDVFLAorCSAweDBFLCAweEZBLCAweDYxLCAweDQ2LCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweENELCAweDgxLCAweDdGLCAweEI0LCAweDAyLCAweDNBLCAweDAyLCAweDAwLAorCSAweDAxLCAweDY0LCAweDMyLCAweDAwLCAweDA0LCAweDNBLCAweDAyLCAweDAwLCAweDAyLCAweDY0LCAweDJFLCAweDAwLCAweDBCLCAweDNBLCAweDAyLCAweDAwLAorCSAweDA0LCAweDY0LCAweDJBLCAweDAwLCAweDE2LCAweDNBLCAweDAyLCAweDAwLCAweDA4LCAweDY0LCAweDI2LCAweDAwLCAweDBDLCAweDNBLCAweDAyLCAweDAwLAorCSAweDEwLCAweDY0LCAweDIyLCAweDAwLCAweDEyLCAweDNBLCAweDAyLCAweDAwLCAweDIwLCAweDY0LCAweDFFLCAweDAwLCAweDE4LCAweDNBLCAweDAyLCAweDAwLAorCSAweDQwLCAweDY0LCAweDFBLCAweDAwLCAweDI0LCAweDNBLCAweDAyLCAweDAwLCAweDgwLCAweDY0LCAweDE2LCAweDAwLCAweDMwLCAweDNBLCAweDAzLCAweDAwLAorCSAweDAwLCAweDdFLCAweDAxLCAweDdGLCAweDExLCAweDAwLCAweDQ4LCAweDNBLCAweDAzLCAweDAwLCAweDAwLCAweDdFLCAweDAyLCAweDdGLCAweDBDLCAweDAwLAorCSAweDYwLCAweDNBLCAweDAzLCAweDAwLCAweDAwLCAweDdFLCAweDA0LCAweDdGLCAweDA3LCAweDAwLCAweDZDLCAweDNBLCAweDAzLCAweDAwLCAweDAwLCAweDdFLAorCSAweDA4LCAweDdGLCAweDAyLCAweDAwLCAweDAwLCAweDY0LCAweDAwLCAweDAwLCAweDIwLCAweEZFLCAweDJBLCAweDQ1LCAweDM0LCAweDhBLCAweDYwLCAweEZFLAorCSAweDYxLCAweDQwLCAweDAwLCAweDM2LCAweDAyLCAweDAwLCAweEJELCAweEQzLCAweEJGLCAweDAxLCAweDJFLCAweDU4LCAweEZGLCAweEZGLAorCit9OyAgLyogZndfaW1hZ2VfNF9kYXRhICovCisKK3N0YXRpYyBjb25zdCBDRkdfSURFTlRJVFlfU1RSQ1QgZndfaW1hZ2VfaW5mb2lkZW50aXR5W10gPSB7CisJeworCQlzaXplb2YoIENGR19JREVOVElUWV9TVFJDVCApIC8gc2l6ZW9mKGhjZl8xNikgLSAxLAorCQlDRkdfRldfSURFTlRJVFksCisJCUNPTVBfSURfRldfU1RBLAorCQk0LAkJCQkJCQkvL1ZhcmlhbnQKKwkJMSwJCQkJCQkJLy9NYWpvcgorCQkzNgkJCQkJCQkvL01pbm9yCisJfSwKKwl7IDAwMDAsIDAwMDAsIDAwMDAsIDAwMDAsIDAwMDAsIDAwMDAgfQkJLy9lbmRzZW50aW5lbAorfTsKKworc3RhdGljIGNvbnN0IENGR19QUk9HX1NUUkNUIGZ3X2ltYWdlX2NvZGVbXSA9IHsKKwl7CisJCTgsCisJCUNGR19QUk9HLAorCQlDRkdfUFJPR19WT0xBVElMRSwJCQkvLyBtb2RlCisJCTB4MDE4NCwJCS8vIHNpemVvZihmd19pbWFnZV8xX2RhdGEpLAorCQkweDAwMDAwMDYwLAkJCQkJLy8gVGFyZ2V0IGFkZHJlc3MgaW4gTklDIE1lbW9yeQorCQkweDAwMDAsCQkJCQkJLy8gQ1JDOiB5ZXMvbm8JVFlQRTogcHJpbWFyeS9zdGF0aW9uL3RlcnRpYXJ5CisJCShoY2ZfOCBGQVIgICAqKSBmd19pbWFnZV8xX2RhdGEKKwl9LAorCXsKKwkJOCwKKwkJQ0ZHX1BST0csCisJCUNGR19QUk9HX1ZPTEFUSUxFLAkJCS8vIG1vZGUKKwkJMHgyYzBlLAkJLy8gc2l6ZW9mKGZ3X2ltYWdlXzJfZGF0YSksCisJCTB4MDAwMDBDMTYsCQkJCQkvLyBUYXJnZXQgYWRkcmVzcyBpbiBOSUMgTWVtb3J5CisJCTB4MDAwMCwJCQkJCQkvLyBDUkM6IHllcy9ubwlUWVBFOiBwcmltYXJ5L3N0YXRpb24vdGVydGlhcnkKKwkJKGhjZl84IEZBUiAgICopIGZ3X2ltYWdlXzJfZGF0YQorCX0sCisJeworCQk4LAorCQlDRkdfUFJPRywKKwkJQ0ZHX1BST0dfVk9MQVRJTEUsCQkJLy8gbW9kZQorCQkweDU0ZGUsCQkvLyBzaXplb2YoZndfaW1hZ2VfM19kYXRhKSwKKwkJMHgwMDFFMzgyNCwJCQkJCS8vIFRhcmdldCBhZGRyZXNzIGluIE5JQyBNZW1vcnkKKwkJMHgwMDAwLAkJCQkJCS8vIENSQzogeWVzL25vCVRZUEU6IHByaW1hcnkvc3RhdGlvbi90ZXJ0aWFyeQorCQkoaGNmXzggRkFSICAgKikgZndfaW1hZ2VfM19kYXRhCisJfSwKKwl7CisJCTgsCisJCUNGR19QUk9HLAorCQlDRkdfUFJPR19WT0xBVElMRSwJCQkvLyBtb2RlCisJCTB4YmNkZSwJCS8vIHNpemVvZihmd19pbWFnZV80X2RhdGEpLAorCQkweDAwMUY0MDAwLAkJCQkJLy8gVGFyZ2V0IGFkZHJlc3MgaW4gTklDIE1lbW9yeQorCQkweDAwMDAsCQkJCQkJLy8gQ1JDOiB5ZXMvbm8JVFlQRTogcHJpbWFyeS9zdGF0aW9uL3RlcnRpYXJ5CisJCShoY2ZfOCBGQVIgICAqKSBmd19pbWFnZV80X2RhdGEKKwl9LAorCXsKKwkJNSwKKwkJQ0ZHX1BST0csCisJCUNGR19QUk9HX1NUT1AsCQkJCS8vIG1vZGUKKwkJMDAwMCwKKyAJMHgwMDBGNDI5QiwJCQkJCS8vIFN0YXJ0IGV4ZWN1dGlvbiBhZGRyZXNzCisJfSwKKwl7IDAwMDAsIDAwMDAsIDAwMDAsIDAwMDAsIDAwMDAwMDAwLCAwMDAwLCAwMDAwMDAwMH0KK307CisKK3N0YXRpYyBjb25zdCBDRkdfUkFOR0UyMF9TVFJDVCBmd19pbWFnZV9pbmZvY29tcGF0W10gPSB7CisJewkzICsgKCgyMCAqIHNpemVvZihDRkdfUkFOR0VfU1BFQ19TVFJDVCkpIC8gc2l6ZW9mKGhjZl8xNikpLAorCQlDRkdfRldfU1VQX1JBTkdFLAorCQlDT01QX1JPTEVfU1VQTCwKKwkJQ09NUF9JRF9TVEEsCisJCXsKKwkJCXsgNCwgMSwgMiB9ICAJCQkJLy92YXJpYW50LCBib3R0b20sIHRvcAorCQl9CisJfSwKKwl7CTMgKyAoKDIwICogc2l6ZW9mKENGR19SQU5HRV9TUEVDX1NUUkNUKSkgLyBzaXplb2YoaGNmXzE2KSksCisJCUNGR19NRklfQUNUX1JBTkdFU19TVEEsCisJCUNPTVBfUk9MRV9BQ1QsCisJCUNPTVBfSURfTUZJLAorCQl7CisJCQl7IDcsIDMsIDMgfSwgCQkJCS8vdmFyaWFudCwgYm90dG9tLCB0b3AKKwkJCXsgOCwgMSwgMSB9ICAJCQkJLy92YXJpYW50LCBib3R0b20sIHRvcAorCQl9CisJfSwKKwl7CTMgKyAoKDIwICogc2l6ZW9mKENGR19SQU5HRV9TUEVDX1NUUkNUKSkgLyBzaXplb2YoaGNmXzE2KSksCisJCUNGR19DRklfQUNUX1JBTkdFU19TVEEsCisJCUNPTVBfUk9MRV9BQ1QsCisJCUNPTVBfSURfQ0ZJLAorCQl7CisJCQl7IDQsIDEsIDIgfSAgCQkJCS8vdmFyaWFudCwgYm90dG9tLCB0b3AKKwkJfQorCX0sCisJeyAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwLCB7IHsgMDAwMCwgMDAwMCwgMDAwMCB9IH0gfQkvL2VuZHNlbnRpbmVsCit9OworCittZW1pbWFnZSBmd19pbWFnZSA9IHsKKwkiRlVQVTdEMzdkaGZ3Y2lcMDAxQyIsCQkJLy9zaWduYXR1cmUsIDxmb3JtYXQgbnVtYmVyPiwgQy9CaW4gdHlwZQorCShDRkdfUFJPR19TVFJDVCAqKSBmd19pbWFnZV9jb2RlLAorCTB4MDAwRjQyOUIsCisJMDAwMDAwMDAsCQkJCQkvLyhkdW1teSkgcGRhcGx1ZworCTAwMDAwMDAwLAkJCQkJLy8oZHVtbXkpIHByaXBsdWcKKwkoQ0ZHX1JBTkdFMjBfU1RSQ1QgKikgZndfaW1hZ2VfaW5mb2NvbXBhdCwKKwkoQ0ZHX0lERU5USVRZX1NUUkNUICopIGZ3X2ltYWdlX2luZm9pZGVudGl0eSwKK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX2NzLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMWE4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9jcy5jCkBAIC0wLDAgKzEsNzAyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBXaXJlbGVzcyBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAod2xhZ3M0OSkuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBodHRwOi8vd3d3LmFnZXJlLmNvbQorICoKKyAqIEluaXRpYWxseSBkZXZlbG9wZWQgYnkgVHJpcGxlUG9pbnQsIEluYy4KKyAqICAgaHR0cDovL3d3dy50cmlwbGVwb2ludC5jb20KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgVGhpcyBmaWxlIGNvbnRhaW5zIHByb2Nlc3NpbmcgYW5kIGluaXRpYWxpemF0aW9uIHNwZWNpZmljIHRvIENhcmQgU2VydmljZXMKKyAqICAgZGV2aWNlcyAoUENNQ0lBLCBDRikuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTT0ZUV0FSRSBMSUNFTlNFCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisgKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisgKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisgKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisgKgorICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogRGlzY2xhaW1lcgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBpbmNsdWRlIGZpbGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPHdsX3ZlcnNpb24uaD4KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisKKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNjb2RlLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisjaW5jbHVkZSA8ZGVidWcuaD4KKworI2luY2x1ZGUgPGhjZi5oPgorI2luY2x1ZGUgPGRoZi5oPgorI2luY2x1ZGUgPGhjZmRlZi5oPgorCisjaW5jbHVkZSA8d2xfaWYuaD4KKyNpbmNsdWRlIDx3bF9pbnRlcm5hbC5oPgorI2luY2x1ZGUgPHdsX3V0aWwuaD4KKyNpbmNsdWRlIDx3bF9tYWluLmg+CisjaW5jbHVkZSA8d2xfbmV0ZGV2Lmg+CisjaW5jbHVkZSA8d2xfY3MuaD4KKyNpbmNsdWRlIDx3bF9zeXNmcy5oPgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgbWFjcm8gZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIGRvIHsgXAorICAgICAgICAgICAgICAgICAgICBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgXAorICAgICAgICAgICAgfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBnbG9iYWwgZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgREJHCitleHRlcm4gZGJnX2luZm9fdCAqRGJnSW5mbzsKKyNlbmRpZiAgLyogREJHICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2FkYXB0ZXJfYXR0YWNoKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZHJpdmVyLCBhbGxvY2F0aW5nIGxvY2FsIGRhdGEgc3RydWN0dXJlcyBmb3IKKyAqICBvbmUgZGV2aWNlLiBUaGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQgd2l0aCBDYXJkIFNlcnZpY2VzLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbm9uZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgcG9pbnRlciB0byBhbiBhbGxvY2F0ZWQgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUKKyAqICAgICAgTlVMTCBvbiBmYWlsdXJlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd2xfYWRhcHRlcl9hdHRhY2goc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgICAqZGV2OworICAgIHN0cnVjdCB3bF9wcml2YXRlCSpscDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX2FkYXB0ZXJfYXR0YWNoIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisgICAgZGV2ID0gd2xfZGV2aWNlX2FsbG9jKCk7CisgICAgaWYoZGV2ID09IE5VTEwpIHsKKyAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAid2xfZGV2aWNlX2FsbG9jIHJldHVybmVkIE5VTExcbiIpOworCXJldHVybiAtRU5PTUVNOworICAgIH0KKworICAgIGxpbmstPmlvLk51bVBvcnRzMSAgICAgID0gSENGX05VTV9JT19QT1JUUzsKKyAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMSAgICA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKKyAgICBsaW5rLT5pby5JT0FkZHJMaW5lcyAgICA9IDY7CisgICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgICAgPSBJUlFfVFlQRV9EWU5BTUlDX1NIQVJJTkcgfCBJUlFfSEFORExFX1BSRVNFTlQ7CisgICAgbGluay0+aXJxLklSUUluZm8xICAgICAgPSBJUlFfSU5GTzJfVkFMSUQgfCBJUlFfTEVWRUxfSUQ7CisgICAgbGluay0+aXJxLkhhbmRsZXIgICAgICAgPSAmd2xfaXNyOworICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyAgID0gQ09ORl9FTkFCTEVfSVJROworICAgIGxpbmstPmNvbmYuSW50VHlwZSAgICAgID0gSU5UX01FTU9SWV9BTkRfSU87CisgICAgbGluay0+Y29uZi5Db25maWdJbmRleCAgPSA1OworICAgIGxpbmstPmNvbmYuUHJlc2VudCAgICAgID0gUFJFU0VOVF9PUFRJT047CisKKyAgICBsaW5rLT5wcml2ID0gbGluay0+aXJxLkluc3RhbmNlID0gZGV2OworICAgIGxwID0gd2xfcHJpdihkZXYpOworICAgIGxwLT5saW5rID0gbGluazsKKworICAgIHdsX2FkYXB0ZXJfaW5zZXJ0KGxpbmspOworCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuIDA7Cit9IC8vIHdsX2FkYXB0ZXJfYXR0YWNoCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2FkYXB0ZXJfZGV0YWNoKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuIFRoZSBkZXZpY2UgaXMgZGUtcmVnaXN0ZXJlZCB3aXRoIENhcmQKKyAqICBTZXJ2aWNlcy4gSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIHRoZW4gdGhlIG5ldCBkZXZpY2UgaXMgdW5yZWdpc3RlcmVkLCBhbmQKKyAqICBhbGwgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBmcmVlZC4gT3RoZXJ3aXNlLCB0aGUgc3RydWN0dXJlcyB3aWxsIGJlCisgKiAgZnJlZWQgd2hlbiB0aGUgZGV2aWNlIGlzIHJlbGVhc2VkLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbGluayAgICAtIHBvaW50ZXIgdG8gdGhlIGRldl9saW5rX3Qgc3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgZGV2aWNlIHRvCisgKiAgICAgICAgICAgICAgICBkZXRhY2gKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB3bF9hZGFwdGVyX2RldGFjaChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAgICpkZXYgPSBsaW5rLT5wcml2OworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgREJHX0ZVTkMoICJ3bF9hZGFwdGVyX2RldGFjaCIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKyAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJsaW5rIiwgIjB4JXAiLCBsaW5rICk7CisKKyAgICB3bF9hZGFwdGVyX3JlbGVhc2UobGluayk7CisKKyAgICBpZiAoZGV2KSB7CisJdW5yZWdpc3Rlcl93bGFnc19zeXNmcyhkZXYpOworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisgICAgfQorCisgICAgd2xfZGV2aWNlX2RlYWxsb2MoZGV2KTsKKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworfSAvLyB3bF9hZGFwdGVyX2RldGFjaAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfYWRhcHRlcl9yZWxlYXNlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQWZ0ZXIgYSBjYXJkIGlzIHJlbW92ZWQsIHRoaXMgcm91dGluZSB3aWxsIHJlbGVhc2UgdGhlIFBDTUNJQQorICogIGNvbmZpZ3VyYXRpb24uIElmIHRoZSBkZXZpY2UgaXMgc3RpbGwgb3BlbiwgdGhpcyB3aWxsIGJlIHBvc3Rwb25lZCB1bnRpbCBpdAorICogIGlzIGNsb3NlZC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGFyZyAtIGEgdV9sb25nIHJlcHJlc2VudGluZyBhIHBvaW50ZXIgdG8gYSBkZXZfbGlua190IHN0cnVjdHVyZSBmb3IgdGhlCisgKiAgICAgICAgICAgIGRldmljZSB0byBiZSByZWxlYXNlZC4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX2FkYXB0ZXJfcmVsZWFzZSggc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmsgKQoreworICAgIERCR19GVU5DKCAid2xfYWRhcHRlcl9yZWxlYXNlIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworICAgIERCR19QQVJBTSggRGJnSW5mbywgImxpbmsiLCAiMHglcCIsIGxpbmspOworCisgICAgLyogU3RvcCBoYXJkd2FyZSAqLworICAgIHdsX3JlbW92ZShsaW5rLT5wcml2KTsKKworICAgIHBjbWNpYV9kaXNhYmxlX2RldmljZShsaW5rKTsKKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworfSAvLyB3bF9hZGFwdGVyX3JlbGVhc2UKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgd2xfYWRhcHRlcl9zdXNwZW5kKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworCisgICAgLy9pZiAobGluay0+b3BlbikgeworCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwl3bF9zdXNwZW5kKGRldik7CisvLy8vIENIRUNLISAgICAgICAgICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKyAgICAvL30KKworICAgIHJldHVybiAwOworfSAvLyB3bF9hZGFwdGVyX3N1c3BlbmQKKworc3RhdGljIGludCB3bF9hZGFwdGVyX3Jlc3VtZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKworCXdsX3Jlc3VtZShkZXYpOworCisJbmV0aWZfZGV2aWNlX2F0dGFjaCggZGV2ICk7CisKKwlyZXR1cm4gMDsKK30gLy8gd2xfYWRhcHRlcl9yZXN1bWUKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2FkYXB0ZXJfaW5zZXJ0KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgd2xfYWRhcHRlcl9pbnNlcnQoKSBpcyBzY2hlZHVsZWQgdG8gcnVuIGFmdGVyIGEgQ0FSRF9JTlNFUlRJT04gZXZlbnQgaXMKKyAqICByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0LCBhbmQgdG8gbWFrZSB0aGUgZXRoZXJuZXQgZGV2aWNlCisgKiAgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBsaW5rICAgIC0gcG9pbnRlciB0byB0aGUgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSBkZXZpY2UgdG8KKyAqICAgICAgICAgICAgICAgIGluc2VydAorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfYWRhcHRlcl9pbnNlcnQoIHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rICkKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAgICAgICAqZGV2OworICAgIGludCBpOworICAgIGludCAgICAgICAgICAgICAgICAgICAgIGxhc3RfZm4sIGxhc3RfcmV0OworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfYWRhcHRlcl9pbnNlcnQiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisgICAgREJHX1BBUkFNKCBEYmdJbmZvLCAibGluayIsICIweCVwIiwgbGluayApOworCisgICAgZGV2ICAgICA9IGxpbmstPnByaXY7CisKKyAgICAvKiBEbyB3ZSBuZWVkIHRvIGFsbG9jYXRlIGFuIGludGVycnVwdD8gKi8KKyAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROworCisgICAgQ1NfQ0hFQ0soUmVxdWVzdElPLCBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLCAmbGluay0+aW8pKTsKKyAgICBDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEobGluaywgJmxpbmstPmlycSkpOworICAgIENTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmssICZsaW5rLT5jb25mKSk7CisKKworICAgIGRldi0+aXJxICAgICAgICA9IGxpbmstPmlycS5Bc3NpZ25lZElSUTsKKyAgICBkZXYtPmJhc2VfYWRkciAgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisKKyAgICBTRVRfTkVUREVWX0RFVihkZXYsICZoYW5kbGVfdG9fZGV2KGxpbmspKTsKKyAgICBpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgIT0gMCkgeworCXByaW50aygiJXM6IHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZFxuIiwgTU9EVUxFX05BTUUpOworCWdvdG8gZmFpbGVkOworICAgIH0KKyAgICBsaW5rLT5kZXZfbm9kZSA9ICYoIHdsX3ByaXYoZGV2KSApLT5ub2RlOworICAgIHN0cmNweSgoIHdsX3ByaXYoZGV2KSApLT5ub2RlLmRldl9uYW1lLCBkZXYtPm5hbWUpOworICAgIHJlZ2lzdGVyX3dsYWdzX3N5c2ZzKGRldik7CisKKyAgICBwcmludGsoS0VSTl9JTkZPICIlczogV2lyZWxlc3MsIGlvX2FkZHIgJSMwM2x4LCBpcnEgJWQsICIibWFjX2FkZHJlc3MgIiwKKyAgICAgICAgICAgICAgIGRldi0+bmFtZSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKyApIHsKKyAgICAgICAgcHJpbnRrKCIlMDJYJWMiLCBkZXYtPmRldl9hZGRyW2ldLCAoKGkgPCAoRVRIX0FMRU4tMSkpID8gJzonIDogJ1xuJykpOworICAgIH0KKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybjsKKworCitjc19mYWlsZWQ6CisgICAgY3NfZXJyb3IoIGxpbmssIGxhc3RfZm4sIGxhc3RfcmV0ICk7CisKKworZmFpbGVkOgorICAgIHdsX2FkYXB0ZXJfcmVsZWFzZSggbGluayApOworCisgICAgREJHX0xFQVZFKERiZ0luZm8pOworICAgIHJldHVybjsKK30gLy8gd2xfYWRhcHRlcl9pbnNlcnQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2FkYXB0ZXJfb3BlbigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIE9wZW4gdGhlIGRldmljZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byBhIG5ldF9kZXZpY2Ugc3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgbmV0d29yaworICogICAgICAgICAgICBkZXZpY2UgdG8gb3Blbi4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX2FkYXB0ZXJfb3Blbiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisgICAgc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworICAgIHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rID0gbHAtPmxpbms7CisgICAgaW50ICAgICAgICAgcmVzdWx0ID0gMDsKKyAgICBpbnQgICAgICAgICBoY2Zfc3RhdHVzID0gSENGX1NVQ0NFU1M7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgICBEQkdfRlVOQyggIndsX2FkYXB0ZXJfb3BlbiIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKwlEQkdfUFJJTlQoICIlc1xuIiwgVkVSU0lPTl9JTkZPICk7CisgICAgREJHX1BBUkFNKCBEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2ICk7CisKKyAgICBpZighcGNtY2lhX2Rldl9wcmVzZW50KGxpbmspKQorICAgIHsKKyAgICAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKworICAgIGxpbmstPm9wZW4rKzsKKworICAgIGhjZl9zdGF0dXMgPSB3bF9vcGVuKCBkZXYgKTsKKworICAgIGlmKCBoY2Zfc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgeworICAgICAgICBsaW5rLT5vcGVuLS07CisgICAgICAgIHJlc3VsdCA9IC1FTk9ERVY7CisgICAgfQorCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30gLy8gd2xfYWRhcHRlcl9vcGVuCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9hZGFwdGVyX2Nsb3NlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQ2xvc2UgdGhlIGRldmljZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byBhIG5ldF9kZXZpY2Ugc3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgbmV0d29yaworICogICAgICAgICAgICBkZXZpY2UgdG8gY2xvc2UuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9hZGFwdGVyX2Nsb3NlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisgICAgc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmsgPSBscC0+bGluazsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworICAgIERCR19GVU5DKCAid2xfYWRhcHRlcl9jbG9zZSIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKyAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKKworICAgIGlmKCBsaW5rID09IE5VTEwgKSB7CisgICAgICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisKKyAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIlczogU2h1dHRpbmcgZG93biBhZGFwdGVyLlxuIiwgZGV2LT5uYW1lICk7CisgICAgd2xfY2xvc2UoIGRldiApOworCisgICAgbGluay0+b3Blbi0tOworCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuIDA7Cit9IC8vIHdsX2FkYXB0ZXJfY2xvc2UKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCB3bF9hZGFwdGVyX2lkc1tdID0geworI2lmICEgKChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9ISUk1KQorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDE1NiwgMHgwMDAzKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQWdlcmUgU3lzdGVtcyIsICJXaXJlbGVzcyBQQyBDYXJkIE1vZGVsIDAxMTAiLAorCQkJICAgIDB4MzMxMDNhOWIsIDB4ZTE3NWIwZGQpLAorI2Vsc2UKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxNTYsIDB4MDAwNCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkxpbmtzeXMiLCAiV0NGNTRHX1dpcmVsZXNzLUdfQ29tcGFjdEZsYXNoX0NhcmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDczM2NjODEsIDB4OThhNTk5ZTEpLAorI2VuZGlmICAvLyAoSENGX1RZUEUpICYgSENGX1RZUEVfSElJNQorCVBDTUNJQV9ERVZJQ0VfTlVMTCwKKwl9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIHdsX2FkYXB0ZXJfaWRzKTsKKworc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHdsYWdzNDlfZHJpdmVyID0geworICAgIC5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAorICAgIC5kcnYgICAgICAgICAgICA9IHsKKwkubmFtZSAgID0gRFJJVkVSX05BTUUsCisgICAgfSwKKyAgICAucHJvYmUJPSB3bF9hZGFwdGVyX2F0dGFjaCwKKyAgICAucmVtb3ZlCT0gd2xfYWRhcHRlcl9kZXRhY2gsCisgICAgLmlkX3RhYmxlCT0gd2xfYWRhcHRlcl9pZHMsCisgICAgLnN1c3BlbmQJPSB3bF9hZGFwdGVyX3N1c3BlbmQsCisgICAgLnJlc3VtZQk9IHdsX2FkYXB0ZXJfcmVzdW1lLAorfTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9hZGFwdGVyX2luaXRfbW9kdWxlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQ2FsbGVkIGJ5IGluaXRfbW9kdWxlKCkgdG8gcGVyZm9ybSBQQ01DSUEgZHJpdmVyIGluaXRpYWxpemF0aW9uLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgTi9BCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgLTEgb24gZXJyb3IKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX2FkYXB0ZXJfaW5pdF9tb2R1bGUoIHZvaWQgKQoreworICAgIGludCByZXQ7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgICBEQkdfRlVOQyggIndsX2FkYXB0ZXJfaW5pdF9tb2R1bGUiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAid2xfYWRhcHRlcl9pbml0X21vZHVsZSgpIC0tIFBDTUNJQVxuIiApOworCisgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmd2xhZ3M0OV9kcml2ZXIpOworCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuIHJldDsKK30gLy8gd2xfYWRhcHRlcl9pbml0X21vZHVsZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfYWRhcHRlcl9jbGVhbnVwX21vZHVsZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIENhbGxlZCBieSBjbGVhbnVwX21vZHVsZSgpIHRvIHBlcmZvcm0gZHJpdmVyIHVuaW5pdGlhbGl6YXRpb24uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBOL0EKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX2FkYXB0ZXJfY2xlYW51cF9tb2R1bGUoIHZvaWQgKQoreworICAgIERCR19GVU5DKCAid2xfYWRhcHRlcl9jbGVhbnVwX21vZHVsZSIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKyAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJ3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlKCkgLS0gUENNQ0lBXG4iICk7CisKKworICAgIHBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmd2xhZ3M0OV9kcml2ZXIpOworCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuOworfSAvLyB3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9hZGFwdGVyX2lzX29wZW4oKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBDaGVjayB3aXRoIENhcmQgU2VydmljZXMgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgZGV2aWNlIGlzIG9wZW4uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIG5ldF9kZXZpY2Ugc3RydWN0dXJlIHdob3NlIG9wZW4gc3RhdHVzIHdpbGwgYmUKKyAqICAgICAgICAgICAgY2hlY2tlZAorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgbm9uemVybyBpZiBkZXZpY2UgaXMgb3BlbgorICogICAgICAwIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfYWRhcHRlcl9pc19vcGVuKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisgICAgc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmsgPSBscC0+bGluazsKKworICAgIGlmKCFwY21jaWFfZGV2X3ByZXNlbnQobGluaykpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuKCBsaW5rLT5vcGVuICk7Cit9IC8vIHdsX2FkYXB0ZXJfaXNfb3BlbgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisjaWYgREJHCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglEYmdFdmVudCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIENvbnZlcnRzIHRoZSBjYXJkIHNlcml2Y2VzIGV2ZW50cyB0byB0ZXh0IGZvciBkZWJ1Z2dpbmcuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBtYXNrICAgIC0gYSBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgZXJyb3IocykgYmVpbmcgcmVwb3J0ZWQgYnkgQ2FyZAorICogICAgICAgICAgICAgICAgU2VydmljZXMuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IocykKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY29uc3QgY2hhciogRGJnRXZlbnQoIGludCBtYXNrICkKK3sKKyAgICBzdGF0aWMgY2hhciBEYmdCdWZmZXJbMjU2XTsKKyAgICBjaGFyICpwQnVmOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgcEJ1ZiAgICA9IERiZ0J1ZmZlcjsKKyAgICAqcEJ1ZiAgID0gJ1wwJzsKKworCisgICAgaWYoIG1hc2sgJiBDU19FVkVOVF9XUklURV9QUk9URUNUICkKKyAgICAgICAgc3RyY2F0KCBwQnVmLCAiV1JJVEVfUFJPVEVDVCAiICk7CisKKyAgICBpZihtYXNrICYgQ1NfRVZFTlRfQ0FSRF9MT0NLKQorICAgICAgICBzdHJjYXQoIHBCdWYsICJDQVJEX0xPQ0sgIiApOworCisgICAgaWYobWFzayAmIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OKQorICAgICAgICBzdHJjYXQoIHBCdWYsICJDQVJEX0lOU0VSVElPTiAiICk7CisKKyAgICBpZihtYXNrICYgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMKQorICAgICAgICBzdHJjYXQoIHBCdWYsICJDQVJEX1JFTU9WQUwgIiApOworCisgICAgaWYobWFzayAmIENTX0VWRU5UX0JBVFRFUllfREVBRCkKKyAgICAgICAgc3RyY2F0KCBwQnVmLCAiQkFUVEVSWV9ERUFEICIgKTsKKworICAgIGlmKG1hc2sgJiBDU19FVkVOVF9CQVRURVJZX0xPVykKKyAgICAgICAgc3RyY2F0KCBwQnVmLCAiQkFUVEVSWV9MT1cgIiApOworCisgICAgaWYobWFzayAmIENTX0VWRU5UX1JFQURZX0NIQU5HRSkKKyAgICAgICAgc3RyY2F0KCBwQnVmLCAiUkVBRFlfQ0hBTkdFICIgKTsKKworICAgIGlmKG1hc2sgJiBDU19FVkVOVF9DQVJEX0RFVEVDVCkKKyAgICAgICAgc3RyY2F0KCBwQnVmLCAiQ0FSRF9ERVRFQ1QgIiApOworCisgICAgaWYobWFzayAmIENTX0VWRU5UX1JFU0VUX1JFUVVFU1QpCisgICAgICAgIHN0cmNhdCggcEJ1ZiwgIlJFU0VUX1JFUVVFU1QgIiApOworCisgICAgaWYobWFzayAmIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMKQorICAgICAgICBzdHJjYXQoIHBCdWYsICJSRVNFVF9QSFlTSUNBTCAiICk7CisKKyAgICBpZihtYXNrICYgQ1NfRVZFTlRfQ0FSRF9SRVNFVCkKKyAgICAgICAgc3RyY2F0KCBwQnVmLCAiQ0FSRF9SRVNFVCAiICk7CisKKyAgICBpZihtYXNrICYgQ1NfRVZFTlRfUkVHSVNUUkFUSU9OX0NPTVBMRVRFKQorICAgICAgICBzdHJjYXQoIHBCdWYsICJSRUdJU1RSQVRJT05fQ09NUExFVEUgIiApOworCisgICAgLy8gaWYobWFzayAmIENTX0VWRU5UX1JFU0VUX0NPTVBMRVRFKQorICAgIC8vICAgICBzdHJjYXQoIHBCdWYsICJSRVNFVF9DT01QTEVURSAiICk7CisKKyAgICBpZihtYXNrICYgQ1NfRVZFTlRfUE1fU1VTUEVORCkKKyAgICAgICAgc3RyY2F0KCBwQnVmLCAiUE1fU1VTUEVORCAiICk7CisKKyAgICBpZihtYXNrICYgQ1NfRVZFTlRfUE1fUkVTVU1FKQorICAgICAgICBzdHJjYXQoIHBCdWYsICJQTV9SRVNVTUUgIiApOworCisgICAgaWYobWFzayAmIENTX0VWRU5UX0lOU0VSVElPTl9SRVFVRVNUKQorICAgICAgICBzdHJjYXQoIHBCdWYsICJJTlNFUlRJT05fUkVRVUVTVCAiICk7CisKKyAgICBpZihtYXNrICYgQ1NfRVZFTlRfRUpFQ1RJT05fUkVRVUVTVCkKKyAgICAgICAgc3RyY2F0KCBwQnVmLCAiRUpFQ1RJT05fUkVRVUVTVCAiICk7CisKKyAgICBpZihtYXNrICYgQ1NfRVZFTlRfTVREX1JFUVVFU1QpCisgICAgICAgIHN0cmNhdCggcEJ1ZiwgIk1URF9SRVFVRVNUICIgKTsKKworICAgIGlmKG1hc2sgJiBDU19FVkVOVF9FUkFTRV9DT01QTEVURSkKKyAgICAgICAgc3RyY2F0KCBwQnVmLCAiRVJBU0VfQ09NUExFVEUgIiApOworCisgICAgaWYobWFzayAmIENTX0VWRU5UX1JFUVVFU1RfQVRURU5USU9OKQorICAgICAgICBzdHJjYXQoIHBCdWYsICJSRVFVRVNUX0FUVEVOVElPTiAiICk7CisKKyAgICBpZihtYXNrICYgQ1NfRVZFTlRfQ0JfREVURUNUKQorICAgICAgICBzdHJjYXQoIHBCdWYsICJDQl9ERVRFQ1QgIiApOworCisgICAgaWYobWFzayAmIENTX0VWRU5UXzNWQ0FSRCkKKyAgICAgICAgc3RyY2F0KCBwQnVmLCAiM1ZDQVJEICIgKTsKKworICAgIGlmKG1hc2sgJiBDU19FVkVOVF9YVkNBUkQpCisgICAgICAgIHN0cmNhdCggcEJ1ZiwgIlhWQ0FSRCAiICk7CisKKworICAgIGlmKCAqcEJ1ZiApIHsKKyAgICAgICAgcEJ1ZltzdHJsZW4ocEJ1ZikgLSAxXSA9ICdcMCc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYoIG1hc2sgIT0gMHgwICkgeworICAgICAgICAgICAgc3ByaW50ZiggcEJ1ZiwgIjw8MHglMDh4Pj4iLCBtYXNrICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcEJ1ZjsKK30gLy8gRGJnRXZlbnQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNlbmRpZiAgLyogREJHICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9jcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTBlNjc0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfY3MuaApAQCAtMCwwICsxLDk1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBXaXJlbGVzcyBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAod2xhZ3M0OSkuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBodHRwOi8vd3d3LmFnZXJlLmNvbQorICoKKyAqIEluaXRpYWxseSBkZXZlbG9wZWQgYnkgVHJpcGxlUG9pbnQsIEluYy4KKyAqICAgaHR0cDovL3d3dy50cmlwbGVwb2ludC5jb20KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgSGVhZGVyIGRlc2NyaWJpbmcgaW5mb3JtYXRpb24gcmVxdWlyZWQgZm9yIHRoZSBkcml2ZXIgdG8gc3VwcG9ydCBQQ01DSUEuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTT0ZUV0FSRSBMSUNFTlNFCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisgKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisgKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisgKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisgKgorICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogRGlzY2xhaW1lcgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1dMX0NTX0hfXworI2RlZmluZSBfX1dMX0NTX0hfXworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGZ1bmN0aW9uIHByb3RveXBlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCB3bF9hZGFwdGVyX2luc2VydChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluayk7CisKK3ZvaWQgd2xfYWRhcHRlcl9yZWxlYXNlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKTsKKworaW50IHdsX2FkYXB0ZXJfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LCBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MgKTsKKworaW50IHdsX2FkYXB0ZXJfaW5pdF9tb2R1bGUoIHZvaWQgKTsKKwordm9pZCB3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlKCB2b2lkICk7CisKK2ludCB3bF9hZGFwdGVyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK2ludCB3bF9hZGFwdGVyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitpbnQgd2xfYWRhcHRlcl9pc19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI3KQordm9pZCBjc19lcnJvcihjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCBpbnQgZnVuYywgaW50IHJldCk7CisjZW5kaWYKKworY29uc3QgY2hhciAqRGJnRXZlbnQoIGludCBtYXNrICk7CisKKworCisjZW5kaWYgIC8vIF9fV0xfQ1NfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9lbmMuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YzQ0YzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9lbmMuYwpAQCAtMCwwICsxLDIzMSBAQAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBXaXJlbGVzcyBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAod2xhZ3M0OSkuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBodHRwOi8vd3d3LmFnZXJlLmNvbQorICoKKyAqIEluaXRpYWxseSBkZXZlbG9wZWQgYnkgVHJpcGxlUG9pbnQsIEluYy4KKyAqICAgaHR0cDovL3d3dy50cmlwbGVwb2ludC5jb20KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgVGhpcyBmaWxlIGRlZmluZXMgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gV0VQIGtleSBjb2RpbmcvZGVjb2RpbmcuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTT0ZUV0FSRSBMSUNFTlNFCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisgKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisgKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisgKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisgKgorICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogRGlzY2xhaW1lcgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBpbmNsdWRlIGZpbGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPHdsX3ZlcnNpb24uaD4KKworI2luY2x1ZGUgPGRlYnVnLmg+CisjaW5jbHVkZSA8aGNmLmg+CisKKyNpbmNsdWRlIDx3bF9lbmMuaD4KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBnbG9iYWwgZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgREJHCisKK2V4dGVybiBkYmdfaW5mb190ICpEYmdJbmZvOworCisjZW5kaWYgIC8qIERCRyAqLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfd2VwX2NvZGUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIGVuY29kZXMgYSBzZXQgb2Ygd2VwIGtleXMgZm9yIHByaXZhY3kKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHN6Q3J5cHQgLQorICogICAgICBzekRlc3QgIC0KKyAqICAgICAgRGF0YSAgICAtCisgKiAgICAgIG5MZW4gICAgLQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgT0sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3dlcF9jb2RlKCBjaGFyICpzekNyeXB0LCBjaGFyICpzekRlc3QsIHZvaWQgKkRhdGEsIGludCBuTGVuICkKK3sKKyAgICBpbnQgICAgIGk7CisgICAgaW50ICAgICB0OworICAgIGludCAgICAgayA7CisgICAgY2hhciAgICBiaXRzOworICAgIGNoYXIgICAgKnN6RGF0YSA9IChjaGFyICopIERhdGE7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgICBmb3IoIGkgPSBiaXRzID0gMCA7IGkgPCBNQUNBRERSRVNTX1NUUl9MRU47IGkrKyApIHsKKwkgICAgYml0cyBePSBzekNyeXB0W2ldOworCSAgICBiaXRzICs9IHN6Q3J5cHRbaV07CisgICAgfQorCisgICAgZm9yKCBpID0gdCA9ICpzekRlc3QgPSAwOyBpIDwgbkxlbjsgaSsrLCB0KysgKSB7CisJICAgIGsgPSBzekRhdGFbaV0gXiAoIGJpdHMgKyBpICk7CisKKworICAgICAgICBzd2l0Y2goIGkgJSAzICkgeworCisgICAgICAgIGNhc2UgMCA6CisKKyAgICAgICAgICAgIHN6RGVzdFt0XSAgID0gKChrICYgMHhGQykgPj4gMikgKyBDSF9TVEFSVCA7CisJCQlzekRlc3RbdCsxXSA9ICgoayAmIDB4MDMpIDw8IDQpICsgQ0hfU1RBUlQgOworCSAgICAgICAgc3pEZXN0W3QrMl0gPSAnXDAnOworCisgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGNhc2UgMSA6CisKKyAgICAgICAgICAgIHN6RGVzdFt0XSAgKz0gKCggayAmIDB4RjAgKSA+PiA0ICk7CisJCQlzekRlc3RbdCsxXSA9ICgoIGsgJiAweDBGICkgPDwgMiApICsgQ0hfU1RBUlQgOworCSAgICAgICAgc3pEZXN0W3QrMl0gPSAnXDAnOworCisgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGNhc2UgMiA6CisKKyAgICAgICAgICAgIHN6RGVzdFt0XSAgKz0gKCggayAmIDB4QzAgKSA+PiA2ICk7CisJCQlzekRlc3RbdCsxXSA9ICggayAmIDB4M0YgKSArIENIX1NUQVJUIDsKKwkgICAgICAgIHN6RGVzdFt0KzJdID0gJ1wwJzsKKwkgICAgICAgIHQrKzsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oIHN0cmxlbiggc3pEZXN0ICkpIDsKKworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3dlcF9kZWNvZGUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIGRlY29kZXMgYSBzZXQgb2YgV0VQIGtleXMgZm9yIHVzZSBieSB0aGUgY2FyZC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHN6Q3J5cHQgLQorICogICAgICBzekRlc3QgIC0KKyAqICAgICAgRGF0YSAgICAtCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBPSworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfd2VwX2RlY29kZSggY2hhciAqc3pDcnlwdCwgdm9pZCAqRGVzdCwgY2hhciAqc3pEYXRhICkKK3sKKyAgICBpbnQgICAgIGk7CisgICAgaW50ICAgICB0OworICAgIGludCAgICAgbkxlbjsKKyAgICBjaGFyICAgIGJpdHM7CisgICAgY2hhciAgICAqc3pEZXN0ID0gRGVzdDsKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgZm9yKCBpID0gYml0cyA9IDAgOyBpIDwgMTI7IGkrKyApIHsKKyAgICAgIGJpdHMgXj0gc3pDcnlwdFtpXSA7CisgICAgICBiaXRzICs9IHN6Q3J5cHRbaV0gOworICB9CisKKyAgbkxlbiA9ICggc3RybGVuKCBzekRhdGEgKSAqIDMpIC8gNCA7CisKKyAgZm9yKCBpID0gdCA9IDA7IGkgPCBuTGVuOyBpKyssIHQrKyApIHsKKyAgICAgIHN3aXRjaCggaSAlIDMgKSB7CisgICAgICBjYXNlIDAgOgorCisgICAgICAgICAgc3pEZXN0W2ldID0gKCgoIHN6RGF0YVt0XS1DSF9TVEFSVCApICYgMHgzZiApIDw8IDIgKSArCisgICAgICAgICAgICAgICAgICAgICAgKCgoIHN6RGF0YVt0KzFdLUNIX1NUQVJUICkgJiAweDMwICkgPj4gNCApOworCSAgICAgIGJyZWFrOworCisKKyAgICAgIGNhc2UgMSA6CisgICAgICAgICAgc3pEZXN0W2ldID0gKCgoIHN6RGF0YVt0XS1DSF9TVEFSVCApICYgMHgwZiApIDw8IDQgKSArCisgICAgICAgICAgICAgICAgICAgICAgKCgoIHN6RGF0YVt0KzFdLUNIX1NUQVJUICkgJiAweDNjICkgPj4gMiApOworCSAgICAgIGJyZWFrOworCisKKyAgICAgIGNhc2UgMiA6CisgICAgICAgICAgc3pEZXN0W2ldID0gKCgoIHN6RGF0YVt0XS1DSF9TVEFSVCApICYgMHgwMyApIDw8IDYgKSArCisgICAgICAgICAgICAgICAgICAgICAgICgoIHN6RGF0YVt0KzFdLUNIX1NUQVJUICkgJiAweDNmICk7CisJICAgICAgdCsrOworCSAgICAgIGJyZWFrOworICAgICAgfQorCisJc3pEZXN0W2ldIF49ICggYml0cyArIGkgKSA7CisKKyAgfQorCisgIHJldHVybiggaSApIDsKKworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfZW5jLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9lbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGY1NGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfZW5jLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCisgKgorICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgorICogICBodHRwOi8vd3d3LnRyaXBsZXBvaW50LmNvbQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBIZWFkZXIgZm9yIHBlcmZvcm1pbmcgY29kaW5nL2RlY29kaW5nIG9mIHRoZSBXRVAga2V5cy4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNPRlRXQVJFIExJQ0VOU0UKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisgKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fV0FWRUxBTjJfRU5DUllQVElPTl9IX18KKyNkZWZpbmUgX19XQVZFTEFOMl9FTkNSWVBUSU9OX0hfXworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY29uc3RhbnQgZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENSWVBUX0NPREUJCQkJCSI1NzYxNzY2NUE1RDYiCisjZGVmaW5lIEVOQ1JZUFRJT05fTEVOCQkJCTEwMgorI2RlZmluZSBFTkNSWVBUSU9OX01BR0lDCQkJMHg0ODU3Njg3N0wJLy8gSFdodworI2RlZmluZSBERUZfQ1JZUFRfU1RSCQkJCSJHP1RJVUVBXWQ1TUFkWlYnZVViJiY2LiknJjosJ1ZGLyhGUjIpNl41KicqOCpXNjsrR0I+LDdOQS0nWkQtWCZHLkgySi84Pk0wKEpQMFhWUzFIYlYyOS5ZMyk6XFwzWUZfNElSYjU2IgorCisjZGVmaW5lIERFRkFVTFRfQ1JZUFRfTUFDCQkJIldceDAxXHg2Qlx4NjZceEE1XHg1QSIKKyNkZWZpbmUgQ0hfU1RBUlQJCQkJCScmJworI2RlZmluZSBNQUNBRERSRVNTX1NUUl9MRU4JCQkxMgorCisjZGVmaW5lIEtFWV9MRU4gICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBOVU1fS0VZUyAgICAgICAgICAgICAgICAgICAgNAorCisjZGVmaW5lIEtFWV9MRU5HVEhfTk9ORV9BU0NJSSAgICAgICAwCisjZGVmaW5lIEtFWV9MRU5HVEhfNjRfQklUX0FTQ0lJICAgICA1CisjZGVmaW5lIEtFWV9MRU5HVEhfMTI4X0JJVF9BU0NJSSAgICAxMworCisjZGVmaW5lIEtFWV9MRU5HVEhfTk9ORV9IRVggICAgICAgICAoIEtFWV9MRU5HVEhfTk9ORV9BU0NJSSAgICAqIHNpemVvZiggdW5zaWduZWQgc2hvcnQgKSkKKyNkZWZpbmUgS0VZX0xFTkdUSF82NF9CSVRfSEVYICAgICAgICggS0VZX0xFTkdUSF82NF9CSVRfQVNDSUkgICogc2l6ZW9mKCB1bnNpZ25lZCBzaG9ydCApKQorI2RlZmluZSBLRVlfTEVOR1RIXzEyOF9CSVRfSEVYICAgICAgKCBLRVlfTEVOR1RIXzEyOF9CSVRfQVNDSUkgKiBzaXplb2YoIHVuc2lnbmVkIHNob3J0ICkpCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB0eXBlIGRlZmluaXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgX2VuY3N0Y3QKK3sKKwloY2ZfMzIJICAgICAgICAgICAgICAgICAgIGR3TWFnaWM7CisJaGNmXzE2CSAgICAgICAgICAgICAgICAgICB3VHhLZXlJRDsKKwloY2ZfMTYJICAgICAgICAgICAgICAgICAgIHdFbmFibGVkOworCUNGR19ERUZBVUxUX0tFWVNfU1RSQ1QgICAgIEVuY1N0cjsKK30KK0VOQ1NUUkNULCAqUEVOQ1NUUkNUOworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZnVuY3Rpb24gcHJyb3R0eXBlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF93ZXBfY29kZSggY2hhciAqc3pDcnlwdCwgY2hhciAqc3pEZXN0LCB2b2lkICpEYXRhLCBpbnQgbkxlbiApOworCitpbnQgd2xfd2VwX2RlY29kZSggY2hhciAqc3pDcnlwdCwgdm9pZCAqRGVzdCwgY2hhciAqc3pEYXRhICk7CisKKworCisKKyNlbmRpZiAgLy8gX19XQVZFTEFOMl9FTkNSWVBUSU9OX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfaWYuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX2lmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyYjQxMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX2lmLmgKQEAgLTAsMCArMSwyMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCisgKgorICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgorICogICBodHRwOi8vd3d3LnRyaXBsZXBvaW50LmNvbQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBEcml2ZXIgY29tbW9uIGhlYWRlciBmb3IgaW5mbyBuZWVkZWQgYnkgZHJpdmVyIHNvdXJjZSBhbmQgdXNlci1zcGFjZQorICogICBwcm9jZXNzZXMgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBkcml2ZXIuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTT0ZUV0FSRSBMSUNFTlNFCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisgKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisgKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisgKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisgKgorICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogRGlzY2xhaW1lcgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1dBVkVMQU4yX0lGX0hfXworI2RlZmluZSBfX1dBVkVMQU4yX0lGX0hfXworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGNvbnN0YW50IGRlZmluaXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBNQVhfTFRWX0JVRl9TSVpFICAgICAgICAgICAgKDUxMiAtIChzaXplb2YoaGNmXzE2KSAqIDIpKQorCisjZGVmaW5lIEhDRl9UQUxMSUVTX1NJWkUgICAgICAgICAgICAoc2l6ZW9mKENGR19IRVJNRVNfVEFMTElFU19TVFJDVCkgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZihoY2ZfMTYpICogMikpCisKKyNkZWZpbmUgSENGX01BWF9NVUxUSUNBU1QgICAgICAgICAgIDE2CisjZGVmaW5lIEhDRl9NQVhfTkFNRV9MRU4gICAgICAgICAgICAzMgorI2RlZmluZSBNQVhfTElORV9TSVpFICAgCQkJMjU2CisjZGVmaW5lIEhDRl9OVU1fSU9fUE9SVFMgICAgICAgICAgICAweDgwCisjZGVmaW5lIFRYX1RJTUVPVVQgICAgICAgICAgICAgICAgICAoKDgwMCAqIEhaKSAvIDEwMDApCisKKworLy8jZGVmaW5lIEhDRl9NSU5fQ09NTV9RVUFMSVRZICAgICAgICAwCisvLyNkZWZpbmUgSENGX01BWF9DT01NX1FVQUxJVFkgICAgICAgIDkyCisvLyNkZWZpbmUgSENGX01JTl9TSUdOQUxfTEVWRUwgICAgICAgIDQ3CisvLyNkZWZpbmUgSENGX01BWF9TSUdOQUxfTEVWRUwgICAgICAgIDEzOAorLy8jZGVmaW5lIEhDRl9NSU5fTk9JU0VfTEVWRUwgICAgICAgICA0NworLy8jZGVmaW5lIEhDRl9NQVhfTk9JU0VfTEVWRUwgICAgICAgICAxMzgKKy8vI2RlZmluZSBIQ0ZfMERCTV9PRkZTRVQgICAgICAgICAgICAgMTQ5CisKKy8vIFBFMUROTgorLy8gQmV0dGVyIGRhdGEgZnJvbSB0aGUgcmVhbCB3b3JsZC4gTm90IHNjaWVudGlmaWMgYnV0IGVtcGlyaWNhbCBkYXRhIGdhdGhlcmVkCisvLyBmcm9tIGEgVGhvbXNvbiBTcGVlZHRvdWNoIDExMCB3aGljaCBpcyBpZGVudGlmaWVkIGFzOgorLy8gUENNQ0lBIEluZm86ICJBZ2VyZSBTeXN0ZW1zIiAiV2lyZWxlc3MgUEMgQ2FyZCBNb2RlbCAwMTEwIgorLy8gICAgICAgICAgICAgIE1hbnVmYWN0dXJlIElEOiAwMTU2LDAwMDMKKy8vIExvd2VzdCBtZWFzdXJtZW50IGZvciBub2lzZSBmbG9vciBzZWVuIGlzIHZhbHVlIDU0CisvLyBIaWdoZXN0IHNpZ25hbCBzdHJlbmd0aCBpbiBjbG9zZSBwcm94aW1pdHkgdG8gdGhlIEFQIHNlZW4gaXMgdmFsdWUgMTE4CisvLyBWZXJ5IGdvb2QgbXVzdCBiZSBhcnJvdW5kIDEwMCAob3RoZXJ3aXNlIGl0cyBuZXZlciAiZnVsbCBzY2FsZSIKKy8vIEFsbCBvdGhlciBjb25zdGFudHMgYXJlIGRlcnJpdmVkIGZyb20gdGhlc2UuIFRoaXMgbWFrZXMgdGhlIHNpZ25hbCBnYXVnZQorLy8gd29yayBmb3IgbWUuLi4KKyNkZWZpbmUgSENGX01JTl9TSUdOQUxfTEVWRUwgICAgICAgIDU0CisjZGVmaW5lIEhDRl9NQVhfU0lHTkFMX0xFVkVMICAgICAgICAxMDAKKyNkZWZpbmUgSENGX01JTl9OT0lTRV9MRVZFTCAgICAgICAgIEhDRl9NSU5fU0lHTkFMX0xFVkVMCisjZGVmaW5lIEhDRl9NQVhfTk9JU0VfTEVWRUwgICAgICAgICBIQ0ZfTUFYX1NJR05BTF9MRVZFTAorI2RlZmluZSBIQ0ZfMERCTV9PRkZTRVQgICAgICAgICAgICAgKEhDRl9NQVhfU0lHTkFMX0xFVkVMICsgMSkKKyNkZWZpbmUgSENGX01JTl9DT01NX1FVQUxJVFkgICAgICAgIDAKKyNkZWZpbmUgSENGX01BWF9DT01NX1FVQUxJVFkgICAgICAgIChIQ0ZfTUFYX1NJR05BTF9MRVZFTCAtIEhDRl9NSU5fTk9JU0VfTEVWRUwgKyAxKQorCisKKy8qIEZvciBlbmNyeXB0aW9uIChXRVApICovCisjZGVmaW5lIE1JTl9LRVlfU0laRSAgICAgICAgICAgICAgICA1ICAgICAgIC8vIDQwIGJpdHMgUkM0IC0gV0VQCisjZGVmaW5lIE1BWF9LRVlfU0laRSAgICAgICAgICAgICAgICAxMyAgICAgIC8vIDEwNCBiaXRzCisjZGVmaW5lIE1BWF9LRVlTICAgICAgICAgICAgICAgICAgICA0CisKKyNkZWZpbmUgUkFESU9fQ0hBTk5FTFMgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFJBRElPX1NFTlNJVElWSVRZX0xFVkVMUyAgICAzCisjZGVmaW5lIFJBRElPX1RYX1BPV0VSX01XQVRUICAgICAgICAzMgorI2RlZmluZSBSQURJT19UWF9QT1dFUl9EQk0gICAgICAgICAgMTUKKworI2RlZmluZSBNSU5fUlRTX0JZVEVTICAgICAgICAgICAgICAgMAorI2RlZmluZSBNQVhfUlRTX0JZVEVTICAgICAgICAgICAgICAgMjM0NworCisjZGVmaW5lIE1BWF9SQVRFUyAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIE1FR0FCSVQgICAgICAgICAgICAgICAgICAgICAxMDI0KjEwMjQKKworI2RlZmluZSBIQ0ZfRkFJTFVSRSAgICAgICAgICAgICAgICAgMHhGRgorI2RlZmluZSBVSUxfRkFJTFVSRQkJICAgICAgICAgICAgMHhGRgorI2RlZmluZSBDRkdfVUlMX0NPTk5FQ1QgICAgICAgICAgICAgMHhBMTIzICAgICAgICAgIC8vIERlZmluZSBkaWZmZXJlbnRseT8KKyNkZWZpbmUgQ0ZHX1VJTF9DT05ORUNUX0FDS19DT0RFICAgIDB4NTY1MzQzNUEgICAgICAvLyBWU0NaCisjZGVmaW5lIFdWTEFOMl9VSUxfQ09OTkVDVEVEICAgICAgICAoMHgwMUwgPDwgMCkKKyNkZWZpbmUgV1ZMQU4yX1VJTF9CVVNZICAgICAgICAgICAgICgweDAxTCA8PCAxKQorCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZHJpdmVyIGlvY3RsIGludGVyZmFjZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgV1ZMQU4yX0lPQ1RMX1VJTCAgICAgICAgICAgIFNJT0NERVZQUklWQVRFCisKKy8qIFRoZSBVSUwgSW50ZXJmYWNlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgV1ZMQU4yX0lPQ1RMX1VJTCBjb2RlIGFib3ZlCisgICBpcyBkZWZpbmVkIGluIG1kZC5oLiBBIHF1aWNrIHJlZmVyZW5jZSBvZiB0aGUgVUlMIGNvZGVzIGlzIGxpc3RlZCBiZWxvdyAqLworLyoKK1VJTF9GVU5fQ09OTkVDVAorVUlMX0ZVTl9ESVNDT05ORUNUCitVSUxfRlVOX0FDVElPTgorICAgIFVJTF9BQ1RfQkxPQ0sKKyAgICBVSUxfQUNUX1VOQkxPQ0sKKyAgICBVSUxfQUNUX1NDQQorICAgIFVJTF9BQ1RfRElBRworICAgIFVJTF9BQ1RfQVBQTFkKK1VJTF9GVU5fU0VORF9ESUFHX01TRworVUlMX0ZVTl9HRVRfSU5GTworVUlMX0ZVTl9QVVRfSU5GTworKi8KKworI2RlZmluZSBTSU9DU0lXTkVUTkFNRSAgICAgICAgICAgICAgU0lPQ0RFVlBSSVZBVEUrMQorI2RlZmluZSBTSU9DR0lXTkVUTkFNRSAgICAgICAgICAgICAgU0lPQ0RFVlBSSVZBVEUrMgorI2RlZmluZSBTSU9DU0lXU1RBTkFNRSAgICAgICAgICAgICAgU0lPQ0RFVlBSSVZBVEUrMworI2RlZmluZSBTSU9DR0lXU1RBTkFNRSAgICAgICAgICAgICAgU0lPQ0RFVlBSSVZBVEUrNAorI2RlZmluZSBTSU9DU0lXUE9SVFRZUEUgICAgICAgICAgICAgU0lPQ0RFVlBSSVZBVEUrNQorI2RlZmluZSBTSU9DR0lXUE9SVFRZUEUgICAgICAgICAgICAgU0lPQ0RFVlBSSVZBVEUrNgorCisvKiBJT0NUTCBjb2RlIGZvciB0aGUgUlRTIGludGVyZmFjZSAqLworI2RlZmluZSBXTF9JT0NUTF9SVFMgICAgICAgICAgICAgICAgU0lPQ0RFVlBSSVZBVEUrNworCisvKiBJT0NUTCBzdWJjb2RlcyBmb3IgV0xfSU9DVExfUlRTICovCisjZGVmaW5lIFdMX0lPQ1RMX1JUU19SRUFEICAgICAgICAgICAxCisjZGVmaW5lIFdMX0lPQ1RMX1JUU19XUklURSAgICAgICAgICAyCisjZGVmaW5lIFdMX0lPQ1RMX1JUU19CQVRDSF9SRUFEICAgICAzCisjZGVmaW5lIFdMX0lPQ1RMX1JUU19CQVRDSF9XUklURSAgICA0CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNUUlVDVFVSRSBERUZJTklUSU9OUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgX191MTYgICBsZW5ndGg7CisgICAgX191OCAgICBuYW1lW0hDRl9NQVhfTkFNRV9MRU5dOworfQord3ZOYW1lX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBoY2ZfMTYgICAgICBsZW47CisgICAgaGNmXzE2ICAgICAgdHlwOworICAgIHVuaW9uCisgICAgeworICAgICAgICBoY2ZfOCAgICAgICB1OFtNQVhfTFRWX0JVRl9TSVpFIC8gc2l6ZW9mKGhjZl84KV07CisgICAgICAgIGhjZl8xNiAgICAgIHUxNltNQVhfTFRWX0JVRl9TSVpFIC8gc2l6ZW9mKGhjZl8xNildOworICAgICAgICBoY2ZfMzIgICAgICB1MzJbTUFYX0xUVl9CVUZfU0laRSAvIHNpemVvZihoY2ZfMzIpXTsKKyAgICB9IHU7Cit9CitsdHZfdDsKKworCitzdHJ1Y3QgdWlscmVxCit7CisgICAgdW5pb24KKyAgICB7CisgICAgICAgIGNoYXIgICAgaWZybl9uYW1lW0lGTkFNU0laXTsKKyAgICB9IGlmcl9pZnJuOworCisgICAgSUZCUCAgICAgICAgaGNmQ3R4OworICAgIF9fdTggICAgICAgIGNvbW1hbmQ7CisgICAgX191OCAgICAgICAgcmVzdWx0OworCisgICAgLyogVGhlIGRhdGEgZmllbGQgaW4gdGhpcyBzdHJ1Y3R1cmUgaXMgdHlwaWNhbGx5IGFuIExUViBvZiBzb21lIHR5cGUuIFRoZQorICAgICAgIGxlbiBmaWVsZCBpcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGluIGJ5dGVzLCBhcyBvcHBvc2VkIHRvIHdvcmRzIChsaWtlCisgICAgICAgdGhlIEwtZmllbGQgaW4gdGhlIExUViAqLworICAgIF9fdTE2ICAgICAgIGxlbjsKKyAgICB2b2lkICAgICAgICpkYXRhOworfTsKKworCitzdHJ1Y3QgcnRzcmVxCit7CisgICAgdW5pb24KKyAgICB7CisgICAgICAgIGNoYXIgICAgaWZybl9uYW1lW0lGTkFNU0laXTsKKyAgICB9CisgICAgaWZyX2lmcm47CisKKyAgICBfX3UxNiAgIHR5cDsKKyAgICBfX3UxNiAgIHJlZzsKKyAgICBfX3UxNiAgIGxlbjsKKyAgICBfX3UxNiAgICpkYXRhOworfTsKKworCisjZW5kaWYgIC8vIF9fV0FWRUxBTjJfSUZfSF9fCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NmZiNjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMTA1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFnZXJlIFN5c3RlbXMgSW5jLgorICogV2lyZWxlc3MgZGV2aWNlIGRyaXZlciBmb3IgTGludXggKHdsYWdzNDkpLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KKyAqCisgKiBJbml0aWFsbHkgZGV2ZWxvcGVkIGJ5IFRyaXBsZVBvaW50LCBJbmMuCisgKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIEhlYWRlciBmb3IgZGVmaW50aW9ucyBhbmQgbWFjcm9zIGludGVybmFsIHRvIHRoZSBkcnZpZXIuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTT0ZUV0FSRSBMSUNFTlNFCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisgKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisgKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisgKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisgKgorICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogRGlzY2xhaW1lcgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1dBVkVMQU4yX0hfXworI2RlZmluZSBfX1dBVkVMQU4yX0hfXworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGluY2x1ZGUgZmlsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2lmZGVmIEJVU19QQ01DSUEKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjcpCisjaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KKyNlbmRpZgorI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc2NvZGUuaD4KKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKyNlbmRpZiAgLy8gQlVTX1BDTUNJQQorCisjaWZkZWYgSEFTX1dJUkVMRVNTX0VYVEVOU0lPTlMKKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2lmIFdJUkVMRVNTX0VYVCA+IDEzCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNlbmRpZiAvLyBXSVJFTEVTU19FWFQgPiAxMworI2RlZmluZSBVU0VfREJNCisjZGVmaW5lIFJFVFVSTl9DVVJSRU5UX05FVFdPUktOQU1FCisjZGVmaW5lIFVTRV9GUkVRVUVOQ1kKKyNlbmRpZiAvLyBIQVNfV0lSRUxFU1NfRVhURU5TSU9OUy8KKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGNvbnN0YW50IGRlZmluaXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBwX3U4ICAgIF9fdTgKKyNkZWZpbmUgcF9zOCAgICBfX3M4CisjZGVmaW5lIHBfdTE2ICAgX191MTYKKyNkZWZpbmUgcF9zMTYgICBfX3MxNgorI2RlZmluZSBwX3UzMiAgIF9fdTMyCisjZGVmaW5lIHBfczMyICAgX19zMzIKKyNkZWZpbmUgcF9jaGFyICBjaGFyCisKKyNkZWZpbmUgTUFYX0tFWV9MRU4gICAgICAgICAoMiArICgxMyAqIDIpKSAvLyAweCBwbHVzIDEzIGhleCBkaWdpdCBwYWlycworI2RlZmluZSBNQl9TSVpFICAgICAgICAgICAgIDEwMjQKKyNkZWZpbmUgTUFYX0VOQ19MRU4gICAgICAgICAxMDQKKworI2RlZmluZSBNQVhfU0NBTl9USU1FX1NFQyAgIDgKKyNkZWZpbmUgTUFYX05BUFMgICAgICAgICAgICAzMgorCisjZGVmaW5lIENGR19NQl9JTkZPICAgICAgICAgMHgwODIwCQkvL01haWwgQm94IEluZm8gQmxvY2sKKworI2RlZmluZSBOVU1fV0RTX1BPUlRTICAgICAgIDYKKworI2RlZmluZSBXVkxBTl9NQVhfTE9PS0FIRUFEIChIQ0ZfTUFYX01TRys0NikgLyogYXMgcGVyIHMwMDA1TUlDXzQuZG9jICovCisKKworLyogTWluL01heC9EZWZhdWx0IFBhcmFtZXRlciBWYWx1ZXMgKi8KKyNpZiAwIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCisvLzs/IHdoeSB0aGlzIGRpZmZlcmVuY2UgZGVwZW5kaW5nIG9uIGNvbXBpbGUgb3B0aW9uLCBzZWVtcyB0byBtZSBpdCBzaG91bGQgZGVwZW5kIG9uIHJ1bnRpbWUgaWYgYW55dGhpbmcKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX1NTSUQgICAgICAgICAgICAgICAgICAgICAgICJMaW51eEFQIgorI2Vsc2UKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX1NTSUQgICAgICAgICAgICAgICAgICAgICAgICJBTlkiCisjZW5kaWYgLy8gSENGX1RZUEVfQVAKKworI2RlZmluZSBQQVJNX01JTl9OQU1FX0xFTiAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQQVJNX01BWF9OQU1FX0xFTiAgICAgICAgICAgICAgICAgICAgICAgMzIKKworCisvKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIHBlcnRhaW4gdG8gbW9kdWxlIGFuZCBwcm9maWxlIHBhcmFtZXRlcnMgKi8KKy8vICNkZWZpbmUgUEFSTV9BUF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQTW9kZQorLy8gI2RlZmluZSBQQVJNX05BTUVfQVBfTU9ERQkJCQkJCVRFWFQoIkFQTW9kZSIpCisvLyAjZGVmaW5lIFBBUk1fREVGQVVMVF9BUF9NT0RFCQkJCQlGQUxTRQorCisjZGVmaW5lIFBBUk1fQVVUSEVOVElDQVRJT04gICAgICAgICAgICAgICAgICAgICBBdXRoZW50aWNhdGlvbgorI2RlZmluZSBQQVJNX05BTUVfQVVUSEVOVElDQVRJT04JCQkJVEVYVCgiQXV0aGVudGljYXRpb24iKQorI2RlZmluZSBQQVJNX01JTl9BVVRIRU5USUNBVElPTiAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQQVJNX01BWF9BVVRIRU5USUNBVElPTiAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBQQVJNX0RFRkFVTFRfQVVUSEVOVElDQVRJT04gICAgICAgICAgICAgMQorCisjZGVmaW5lIFBBUk1fQVVUSF9LRVlfTUdNVF9TVUlURSAgICAgICAgICAgICAgICBBdXRoS2V5TWdtdFN1aXRlCisjZGVmaW5lIFBBUk1fTkFNRV9BVVRIX0tFWV9NR01UX1NVSVRFICAgICAgICAgICBURVhUKCJBdXRoS2V5TWdtdFN1aXRlIikKKyNkZWZpbmUgUEFSTV9NSU5fQVVUSF9LRVlfTUdNVF9TVUlURSAgICAgICAgICAgIDAKKyNkZWZpbmUgUEFSTV9NQVhfQVVUSF9LRVlfTUdNVF9TVUlURSAgICAgICAgICAgIDQKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX0FVVEhfS0VZX01HTVRfU1VJVEUgICAgICAgIDAKKworI2RlZmluZSBQQVJNX0JSU0NfMkdIWiAgICAgICAgICAgICAgICAgICAgICAgICAgQlJTQzJHSHoKKyNkZWZpbmUgUEFSTV9OQU1FX0JSU0NfMkdIWiAgICAgICAgICAgICAgICAgICAgIFRFWFQoIkJSU0MyR0h6IikKKyNkZWZpbmUgUEFSTV9NSU5fQlJTQyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBQQVJNX01BWF9CUlNDICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRkZGCisjZGVmaW5lIFBBUk1fREVGQVVMVF9CUlNDXzJHSFogICAgICAgICAgICAgICAgICAweDAwMEYKKworI2RlZmluZSBQQVJNX0JSU0NfNUdIWiAgICAgICAgICAgICAgICAgICAgICAgICAgQlJTQzVHSHoKKyNkZWZpbmUgUEFSTV9OQU1FX0JSU0NfNUdIWiAgICAgICAgICAgICAgICAgICAgIFRFWFQoIkJSU0M1R0h6IikKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX0JSU0NfNUdIWiAgICAgICAgICAgICAgICAgIDB4MDE1MAorCisjZGVmaW5lIFBBUk1fQ09FWElTVEVOQ0UgICAgICAgICAgICAgICAgICAgICAgICBDb2V4aXN0ZW5jZQorI2RlZmluZSBQQVJNX05BTUVfQ09FWElTVEVOQ0UgICAgICAgICAgICAgICAgICAgVEVYVCgiQ29leGlzdGVuY2UiKQorI2RlZmluZSBQQVJNX01JTl9DT0VYSVNURU5DRSAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIFBBUk1fTUFYX0NPRVhJU1RFTkNFICAgICAgICAgICAgICAgICAgICAweDAwMDcKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX0NPRVhJU1RFTkNFICAgICAgICAgICAgICAgIDB4MDAwMAorCisjZGVmaW5lIFBBUk1fQ09ORklHVVJFRCAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmVkCisjZGVmaW5lIFBBUk1fTkFNRV9DT05GSUdVUkVECQkJCQlURVhUKCJDb25maWd1cmVkIikKKworI2RlZmluZSBQQVJNX0NPTk5FQ1RJT05fQ09OVFJPTCAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbkNvbnRyb2wKKyNkZWZpbmUgUEFSTV9OQU1FX0NPTk5FQ1RJT05fQ09OVFJPTCAgICAgICAgICAgIFRFWFQoIkNvbm5lY3Rpb25Db250cm9sIikKKyNkZWZpbmUgUEFSTV9NSU5fQ09OTkVDVElPTl9DT05UUk9MICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEFSTV9NQVhfQ09OTkVDVElPTl9DT05UUk9MICAgICAgICAgICAgIDMKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX0NPTk5FQ1RJT05fQ09OVFJPTCAgICAgICAgIDIKKworI2RlZmluZSBQQVJNX0NSRUFURV9JQlNTICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlSUJTUworI2RlZmluZSBQQVJNX05BTUVfQ1JFQVRFX0lCU1MgICAgICAgICAgICAgICAgICAgVEVYVCgiQ3JlYXRlSUJTUyIpCisjZGVmaW5lIFBBUk1fREVGQVVMVF9DUkVBVEVfSUJTUyAgICAgICAgICAgICAgICBGQUxTRQorI2RlZmluZSBQQVJNX0RFRkFVTFRfQ1JFQVRFX0lCU1NfU1RSICAgICAgICAgICAgIk4iCisKKyNkZWZpbmUgUEFSTV9ERUJVR19GTEFHICAgICAgICAgICAgIAkgICAgCURlYnVnRmxhZworI2RlZmluZSBQQVJNX05BTUVfREVCVUdfRkxBRyAgICAgICAgICAgIAkJVEVYVCgiRGVidWdGbGFnIikKKyNkZWZpbmUgUEFSTV9NSU5fREVCVUdfRkxBRyAgICAgICAgICAgICAJCTAKKyNkZWZpbmUgUEFSTV9NQVhfREVCVUdfRkxBRyAgICAgICAgICAgICAJCTB4RkZGRgorI2RlZmluZSBQQVJNX0RFRkFVTFRfREVCVUdfRkxBRyAgICAgICAgIAkJMHhGRkZGCisKKyNkZWZpbmUgUEFSTV9ERVNJUkVEX1NTSUQgICAgICAgICAgICAgICAgICAgICAgIERlc2lyZWRTU0lECisjZGVmaW5lIFBBUk1fTkFNRV9ERVNJUkVEX1NTSUQgICAgICAgICAgICAgICAgICBURVhUKCJEZXNpcmVkU1NJRCIpCisKKyNkZWZpbmUgUEFSTV9ET1dOTE9BRF9GSVJNV0FSRSAgICAgICAgICAgICAgICAgIERvd25sb2FkRmlybXdhcmUKKyNkZWZpbmUgUEFSTV9OQU1FX0RPV05MT0FEX0ZJUk1XQVJFICAgICAgICAgICAgIFRFWFQoIkRvd25sb2FkRmlybXdhcmUiKQorCisjZGVmaW5lIFBBUk1fRFJJVkVSX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICBEcml2ZXJFbmFibGUKKyNkZWZpbmUgUEFSTV9OQU1FX0RSSVZFUl9FTkFCTEUJCQkJCVRFWFQoIkRyaXZlckVuYWJsZSIpCisjZGVmaW5lIFBBUk1fREVGQVVMVF9EUklWRVJfRU5BQkxFCQkJCVRSVUUKKworI2RlZmluZSBQQVJNX0VOQUJMRV9FTkNSWVBUSU9OICAgICAgICAgICAgICAgICAgRW5hYmxlRW5jcnlwdGlvbgorI2RlZmluZSBQQVJNX05BTUVfRU5BQkxFX0VOQ1JZUFRJT04gICAgICAgICAgICAgVEVYVCgiRW5hYmxlRW5jcnlwdGlvbiIpCisjZGVmaW5lIFBBUk1fTUlOX0VOQUJMRV9FTkNSWVBUSU9OICAgICAgICAgICAgICAwCisjZGVmaW5lIFBBUk1fTUFYX0VOQUJMRV9FTkNSWVBUSU9OICAgICAgICAgICAgICA3CisjZGVmaW5lIFBBUk1fREVGQVVMVF9FTkFCTEVfRU5DUllQVElPTiAgICAgICAgICAwCisKKyNkZWZpbmUgUEFSTV9FTkNSWVBUSU9OICAgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRpb24KKyNkZWZpbmUgUEFSTV9OQU1FX0VOQ1JZUFRJT04gICAgICAgICAgICAgICAgICAgIFRFWFQoIkVuY3J5cHRpb24iKQorCisjZGVmaW5lIFBBUk1fRVhDTFVERV9VTkVOQ1JZUFRFRCAgICAgICAgICAgICAgICBFeGNsdWRlVW5lbmNyeXB0ZWQKKyNkZWZpbmUgUEFSTV9OQU1FX0VYQ0xVREVfVU5FTkNSWVBURUQgICAgICAgICAgIFRFWFQoIkV4Y2x1ZGVVbmVuY3J5cHRlZCIpCisjZGVmaW5lIFBBUk1fREVGQVVMVF9FWENMVURFX1VORU5DUllQVEVEICAgICAgICBUUlVFCisjZGVmaW5lIFBBUk1fREVGQVVMVF9FWENMVURFX1VORU5DUllQVEVEX1NUUiAgICAiTiIKKworI2RlZmluZSBQQVJNX0lOVFJBX0JTU19SRUxBWSAgICAgICAgICAgICAgICAgICAgSW50cmFCU1NSZWxheQorI2RlZmluZSBQQVJNX05BTUVfSU5UUkFfQlNTX1JFTEFZICAgICAgICAgICAgICAgVEVYVCgiSW50cmFCU1NSZWxheSIpCisjZGVmaW5lIFBBUk1fREVGQVVMVF9JTlRSQV9CU1NfUkVMQVkgICAgICAgICAgICBUUlVFCisjZGVmaW5lIFBBUk1fREVGQVVMVF9JTlRSQV9CU1NfUkVMQVlfU1RSICAgICAgICAiWSIKKworI2RlZmluZSBQQVJNX0tFWTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5MQorI2RlZmluZSBQQVJNX05BTUVfS0VZMSAgICAgICAgICAgICAgICAgICAgICAgICAgVEVYVCgiS2V5MSIpCisjZGVmaW5lIFBBUk1fS0VZMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkyCisjZGVmaW5lIFBBUk1fTkFNRV9LRVkyICAgICAgICAgICAgICAgICAgICAgICAgICBURVhUKCJLZXkyIikKKyNkZWZpbmUgUEFSTV9LRVkzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleTMKKyNkZWZpbmUgUEFSTV9OQU1FX0tFWTMgICAgICAgICAgICAgICAgICAgICAgICAgIFRFWFQoIktleTMiKQorI2RlZmluZSBQQVJNX0tFWTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5NAorI2RlZmluZSBQQVJNX05BTUVfS0VZNCAgICAgICAgICAgICAgICAgICAgICAgICAgVEVYVCgiS2V5NCIpCisKKy8vOz8gI2RlZmluZSBQQVJNX0tFWV9GT1JNQVQgICAgICAgICAgICAgICAgICAgICAgICAgQXNjaWlIZXgKKy8vOz8gI2RlZmluZSBQQVJNX05BTUVfS0VZX0ZPUk1BVCAgICAgICAgICAgICAgICAgICAgVEVYVCgiQXNjaWlIZXgiKQorCisjZGVmaW5lIFBBUk1fTE9BRF9CQUxBTkNJTkcgICAgICAgICAgICAgICAgICAgICBMb2FkQmFsYW5jaW5nCisjZGVmaW5lIFBBUk1fTkFNRV9MT0FEX0JBTEFOQ0lORyAgICAgICAgICAgICAgICBURVhUKCJMb2FkQmFsYW5jaW5nIikKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX0xPQURfQkFMQU5DSU5HICAgICAgICAgICAgIFRSVUUKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX0xPQURfQkFMQU5DSU5HX1NUUiAgICAgICAgICJZIgorCisjZGVmaW5lIFBBUk1fTUFYX0RBVEFfTEVOR1RIICAgICAgICAgICAgICAgICAgICBNYXhEYXRhTGVuZ3RoCisjZGVmaW5lIFBBUk1fTkFNRV9NQVhfREFUQV9MRU5HVEgJCQkJVEVYVCgiTWF4RGF0YUxlbmd0aCIpCisKKyNkZWZpbmUgUEFSTV9NQVhfU0xFRVAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heFNsZWVwRHVyYXRpb24KKyNkZWZpbmUgUEFSTV9OQU1FX01BWF9TTEVFUCAgICAgICAgICAgICAgICAgICAgIFRFWFQoIk1heFNsZWVwRHVyYXRpb24iKQorI2RlZmluZSBQQVJNX01JTl9NQVhfUE1fU0xFRVAgICAgICAgICAgICAgICAgICAgMQkJCQkJCQkJLy87P25hbWVzIG5lYXJseSByaWdodD8KKyNkZWZpbmUgUEFSTV9NQVhfTUFYX1BNX1NMRUVQICAgICAgICAgICAgICAgICAgIDY1NTM1CisjZGVmaW5lIFBBUk1fREVGQVVMVF9NQVhfUE1fU0xFRVAgICAgICAgICAgICAgICAxMDAKKworI2RlZmluZSBQQVJNX01FRElVTV9ESVNUUklCVVRJT04gICAgICAgICAgICAgICAgTWVkaXVtRGlzdHJpYnV0aW9uCisjZGVmaW5lIFBBUk1fTkFNRV9NRURJVU1fRElTVFJJQlVUSU9OICAgICAgICAgICBURVhUKCJNZWRpdW1EaXN0cmlidXRpb24iKQorI2RlZmluZSBQQVJNX0RFRkFVTFRfTUVESVVNX0RJU1RSSUJVVElPTiAgICAgICAgVFJVRQorI2RlZmluZSBQQVJNX0RFRkFVTFRfTUVESVVNX0RJU1RSSUJVVElPTl9TVFIgICAgIlkiCisKKyNkZWZpbmUgUEFSTV9NSUNST1dBVkVfUk9CVVNUTkVTUyAgICAgICAgICAgICAgIE1pY3JvV2F2ZVJvYnVzdG5lc3MKKyNkZWZpbmUgUEFSTV9OQU1FX01JQ1JPV0FWRV9ST0JVU1RORVNTICAgICAgICAgIFRFWFQoIk1pY3JvV2F2ZVJvYnVzdG5lc3MiKQorI2RlZmluZSBQQVJNX0RFRkFVTFRfTUlDUk9XQVZFX1JPQlVTVE5FU1MgICAgICAgRkFMU0UKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX01JQ1JPV0FWRV9ST0JVU1RORVNTX1NUUiAgICJOIgorCisjZGVmaW5lIFBBUk1fTVVMVElDQVNUX1BNX0JVRkZFUklORyAgICAgICAgICAgICBNdWx0aWNhc3RQTUJ1ZmZlcmluZworI2RlZmluZSBQQVJNX05BTUVfTVVMVElDQVNUX1BNX0JVRkZFUklORwkgICAgVEVYVCgiTXVsdGljYXN0UE1CdWZmZXJpbmciKQorI2RlZmluZSBQQVJNX0RFRkFVTFRfTVVMVElDQVNUX1BNX0JVRkZFUklORyAgICAgVFJVRQorI2RlZmluZSBQQVJNX0RFRkFVTFRfTVVMVElDQVNUX1BNX0JVRkZFUklOR19TVFIgIlkiCisKKyNkZWZpbmUgUEFSTV9NVUxUSUNBU1RfUkFURSAgICAgICAgICAgICAgICAgICAgIE11bHRpY2FzdFJhdGUKKyNkZWZpbmUgUEFSTV9OQU1FX01VTFRJQ0FTVF9SQVRFICAgICAgICAgICAgICAgIFRFWFQoIk11bHRpY2FzdFJhdGUiKQorI2lmZGVmIFdBUlAKKyNkZWZpbmUgUEFSTV9NSU5fTVVMVElDQVNUX1JBVEUgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBQQVJNX01BWF9NVUxUSUNBU1RfUkFURSAgICAgICAgICAgICAgICAgMHgwZmZmCisjZGVmaW5lIFBBUk1fREVGQVVMVF9NVUxUSUNBU1RfUkFURV8yR0haICAgICAgICAweDAwMDQKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX01VTFRJQ0FTVF9SQVRFXzVHSFogICAgICAgIDB4MDAxMAorI2Vsc2UKKyNkZWZpbmUgUEFSTV9NSU5fTVVMVElDQVNUX1JBVEUgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBQQVJNX01BWF9NVUxUSUNBU1RfUkFURSAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFBBUk1fREVGQVVMVF9NVUxUSUNBU1RfUkFURV8yR0haICAgICAgICAweDAwMDIKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX01VTFRJQ0FTVF9SQVRFXzVHSFogICAgICAgIDB4MDAwMAorI2VuZGlmICAvLyBXQVJQCisKKyNkZWZpbmUgUEFSTV9NVUxUSUNBU1RfUlggICAgICAgICAgICAgICAgICAgICAgIE11bHRpY2FzdFJlY2VpdmUKKyNkZWZpbmUgUEFSTV9OQU1FX01VTFRJQ0FTVF9SWCAgICAgICAgICAgICAgICAgIFRFWFQoIk11bHRpY2FzdFJlY2VpdmUiKQorI2RlZmluZSBQQVJNX0RFRkFVTFRfTVVMVElDQVNUX1JYICAgICAgICAgICAgICAgVFJVRQorI2RlZmluZSBQQVJNX0RFRkFVTFRfTVVMVElDQVNUX1JYX1NUUiAgICAgICAgICAgIlkiCisKKyNkZWZpbmUgUEFSTV9ORVRXT1JLX0FERFIgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtBZGRyZXNzCisjZGVmaW5lIFBBUk1fTkFNRV9ORVRXT1JLX0FERFIgICAgICAgICAgICAgICAgICBURVhUKCJOZXR3b3JrQWRkcmVzcyIpCisjZGVmaW5lIFBBUk1fREVGQVVMVF9ORVRXT1JLX0FERFIgICAgICAgICAgICAgICB7IDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYgfQorCisjZGVmaW5lIFBBUk1fTkVUV09SS19UWVBFICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVHlwZQorI2RlZmluZSBQQVJNX05BTUVfTkVUV09SS19UWVBFCQkJCQlURVhUKCJOZXR3b3JrVHlwZSIpCisjZGVmaW5lIFBBUk1fREVGQVVMVF9ORVRXT1JLX1RZUEUgICAJCQkwCisKKyNkZWZpbmUgUEFSTV9PV05fQVRJTV9XSU5ET1cgICAgICAgICAgICAgICAgICAgIE93bkFUSU1XaW5kb3cKKyNkZWZpbmUgUEFSTV9OQU1FX09XTl9BVElNX1dJTkRPVwkJCQlURVhUKCJPd25BVElNV2luZG93IikKKyNkZWZpbmUgUEFSTV9NSU5fT1dOX0FUSU1fV0lORE9XICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEFSTV9NQVhfT1dOX0FUSU1fV0lORE9XICAgICAgICAgICAgICAgIDEwMAorI2RlZmluZSBQQVJNX0RFRkFVTFRfT1dOX0FUSU1fV0lORE9XICAgICAgICAgICAgMAorCisjZGVmaW5lIFBBUk1fT1dOX0JFQUNPTl9JTlRFUlZBTCAgICAgICAgICAgICAgICBPd25CZWFjb25JbnRlcnZhbAorI2RlZmluZSBQQVJNX05BTUVfT1dOX0JFQUNPTl9JTlRFUlZBTCAgICAgICAgICAgVEVYVCgiT3duQmVhY29uSW50ZXJ2YWwiKQorI2RlZmluZSBQQVJNX01JTl9PV05fQkVBQ09OX0lOVEVSVkFMICAgICAgICAgICAgMjAKKyNkZWZpbmUgUEFSTV9NQVhfT1dOX0JFQUNPTl9JTlRFUlZBTCAgICAgICAgICAgIDIwMAorI2RlZmluZSBQQVJNX0RFRkFVTFRfT1dOX0JFQUNPTl9JTlRFUlZBTCAgICAgICAgMTAwCisKKyNkZWZpbmUgUEFSTV9PV05fQ0hBTk5FTCAgICAgICAgICAgICAgICAgICAgICAgIE93bkNoYW5uZWwKKyNkZWZpbmUgUEFSTV9OQU1FX09XTl9DSEFOTkVMICAgICAgICAgICAgICAgICAgIFRFWFQoIk93bkNoYW5uZWwiKQorI2RlZmluZSBQQVJNX01JTl9PV05fQ0hBTk5FTCAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQQVJNX01BWF9PV05fQ0hBTk5FTCAgICAgICAgICAgICAgICAgICAgMTYxCisjZGVmaW5lIFBBUk1fREVGQVVMVF9PV05fQ0hBTk5FTCAgICAgICAgICAgICAgICAxMAorCisjZGVmaW5lIFBBUk1fT1dOX0RUSU1fUEVSSU9EICAgICAgICAgICAgICAgICAgICBPd25EVElNUGVyaW9kCisjZGVmaW5lIFBBUk1fTkFNRV9PV05fRFRJTV9QRVJJT0QJICAgICAgICAgICAgVEVYVCgiT3duRFRJTVBlcmlvZCIpCisjZGVmaW5lIFBBUk1fTUlOX09XTl9EVElNX1BFUklPRCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBBUk1fTUFYX09XTl9EVElNX1BFUklPRCAgICAgICAgICAgICAgICA2NTUzNQorI2RlZmluZSBQQVJNX0RFRkFVTFRfT1dOX0RUSU1fUEVSSU9EICAgICAgICAgICAgMQorCisjZGVmaW5lIFBBUk1fT1dOX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICBPd25OYW1lCisjZGVmaW5lIFBBUk1fTkFNRV9PV05fTkFNRSAgICAgICAgICAgICAgICAgICAgICBURVhUKCJPd25OYW1lIikKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX09XTl9OQU1FICAgICAgICAgICAgICAgICAgICJMaW51eCIKKworI2RlZmluZSBQQVJNX09XTl9TU0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgT3duU1NJRAorI2RlZmluZSBQQVJNX05BTUVfT1dOX1NTSUQgICAgICAgICAgICAgICAgICAgICAgVEVYVCgiT3duU1NJRCIpCisKKyNkZWZpbmUgUEFSTV9QTV9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgIFBNRW5hYmxlZAorI2RlZmluZSBQQVJNX05BTUVfUE1fRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgVEVYVCgiUE1FbmFibGVkIikKKyNkZWZpbmUgUEFSTV9NQVhfUE1fRU5BQkxFRAkJCQkJCTMKKworI2RlZmluZSBQQVJNX1BNRVBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1FUFMKKyNkZWZpbmUgUEFSTV9OQU1FX1BNRVBTICAgICAgICAgICAgICAgICAgICAgICAgIFRFWFQoIlBNRVBTIikKKworI2RlZmluZSBQQVJNX1BNX0hPTERPVkVSX0RVUkFUSU9OICAgICAgICAgICAgICAgUE1Ib2xkb3ZlckR1cmF0aW9uCisjZGVmaW5lIFBBUk1fTkFNRV9QTV9IT0xET1ZFUl9EVVJBVElPTiAgICAgICAgICBURVhUKCJQTUhvbGRvdmVyRHVyYXRpb24iKQorI2RlZmluZSBQQVJNX01JTl9QTV9IT0xET1ZFUl9EVVJBVElPTiAgICAgICAgICAgMQorI2RlZmluZSBQQVJNX01BWF9QTV9IT0xET1ZFUl9EVVJBVElPTiAgICAgICAgICAgMTAwMAorI2RlZmluZSBQQVJNX0RFRkFVTFRfUE1fSE9MRE9WRVJfRFVSQVRJT04gICAgICAgMTAwCisKKyNkZWZpbmUgUEFSTV9QTV9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvd2VyTW9kZQorI2RlZmluZSBQQVJNX05BTUVfUE1fTU9ERSAgICAgICAgICAgICAgICAgICAgICAgVEVYVCgiUG93ZXJNb2RlIikKKworI2RlZmluZSBQQVJNX1BPUlRfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydFR5cGUKKyNkZWZpbmUgUEFSTV9OQU1FX1BPUlRfVFlQRSAgICAgICAgICAgICAgICAgICAgIFRFWFQoIlBvcnRUeXBlIikKKyNkZWZpbmUgUEFSTV9NSU5fUE9SVF9UWVBFICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUEFSTV9NQVhfUE9SVF9UWVBFICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX1BPUlRfVFlQRSAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBQQVJNX1BST01JU0NVT1VTX01PREUgICAgICAgICAgICAgICAgICAgUHJvbWlzY3VvdXNNb2RlCisjZGVmaW5lIFBBUk1fTkFNRV9QUk9NSVNDVU9VU19NT0RFICAgICAgICAgICAgICBURVhUKCJQcm9taXNjdW91c01vZGUiKQorI2RlZmluZSBQQVJNX0RFRkFVTFRfUFJPTUlTQ1VPVVNfTU9ERSAgICAgICAgICAgRkFMU0UKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX1BST01JU0NVT1VTX01PREVfU1RSICAgICAgICJOIgorCisjZGVmaW5lIFBBUk1fUkVKRUNUX0FOWSAgICAgICAgICAgICAgICAgICAgICAgICBSZWplY3RBTlkKKyNkZWZpbmUgUEFSTV9OQU1FX1JFSkVDVF9BTlkJCQkJICAgIFRFWFQoIlJlamVjdEFOWSIpCisjZGVmaW5lIFBBUk1fREVGQVVMVF9SRUpFQ1RfQU5ZICAgICAgICAgICAgICAgICBGQUxTRQorI2RlZmluZSBQQVJNX0RFRkFVTFRfUkVKRUNUX0FOWV9TVFIgICAgICAgICAgICAgIk4iCisKKyNkZWZpbmUgUEFSTV9SVFNfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgICAgIFJUU1RocmVzaG9sZAorI2RlZmluZSBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgVEVYVCgiUlRTVGhyZXNob2xkIikKKyNkZWZpbmUgUEFSTV9NSU5fUlRTX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgIDIzNDcKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX1JUU19USFJFU0hPTEQgICAgICAgICAgICAgIDIzNDcKKworI2RlZmluZSBQQVJNX1JUU19USFJFU0hPTEQxICAgICAgICAgICAgICAgICAgICAgUlRTVGhyZXNob2xkMQorI2RlZmluZSBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDEgICAgICAgICAgICAgICAgVEVYVCgiUlRTVGhyZXNob2xkMSIpCisjZGVmaW5lIFBBUk1fUlRTX1RIUkVTSE9MRDIgICAgICAgICAgICAgICAgICAgICBSVFNUaHJlc2hvbGQyCisjZGVmaW5lIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMiAgICAgICAgICAgICAgICBURVhUKCJSVFNUaHJlc2hvbGQyIikKKyNkZWZpbmUgUEFSTV9SVFNfVEhSRVNIT0xEMyAgICAgICAgICAgICAgICAgICAgIFJUU1RocmVzaG9sZDMKKyNkZWZpbmUgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQzICAgICAgICAgICAgICAgIFRFWFQoIlJUU1RocmVzaG9sZDMiKQorI2RlZmluZSBQQVJNX1JUU19USFJFU0hPTEQ0ICAgICAgICAgICAgICAgICAgICAgUlRTVGhyZXNob2xkNAorI2RlZmluZSBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDQgICAgICAgICAgICAgICAgVEVYVCgiUlRTVGhyZXNob2xkNCIpCisjZGVmaW5lIFBBUk1fUlRTX1RIUkVTSE9MRDUgICAgICAgICAgICAgICAgICAgICBSVFNUaHJlc2hvbGQ1CisjZGVmaW5lIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENSAgICAgICAgICAgICAgICBURVhUKCJSVFNUaHJlc2hvbGQ1IikKKyNkZWZpbmUgUEFSTV9SVFNfVEhSRVNIT0xENiAgICAgICAgICAgICAgICAgICAgIFJUU1RocmVzaG9sZDYKKyNkZWZpbmUgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ2ICAgICAgICAgICAgICAgIFRFWFQoIlJUU1RocmVzaG9sZDYiKQorCisjZGVmaW5lIFBBUk1fU1JTQ18yR0haICAgICAgICAgICAgICAgICAgICAgICAgICBTUlNDMkdIegorI2RlZmluZSBQQVJNX05BTUVfU1JTQ18yR0haICAgICAgICAgICAgICAgICAgICAgVEVYVCgiU1JTQzJHSHoiKQorI2RlZmluZSBQQVJNX01JTl9TUlNDICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIFBBUk1fTUFYX1NSU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBGRkYKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX1NSU0NfMkdIWiAgICAgICAgICAgICAgICAgIDB4MEZGRgorCisjZGVmaW5lIFBBUk1fU1JTQ181R0haICAgICAgICAgICAgICAgICAgICAgICAgICBTUlNDNUdIegorI2RlZmluZSBQQVJNX05BTUVfU1JTQ181R0haICAgICAgICAgICAgICAgICAgICAgVEVYVCgiU1JTQzVHSHoiKQorI2RlZmluZSBQQVJNX0RFRkFVTFRfU1JTQ181R0haICAgICAgICAgICAgICAgICAgMHgwRkYwCisKKyNkZWZpbmUgUEFSTV9TWVNURU1fU0NBTEUgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVNjYWxlCisjZGVmaW5lIFBBUk1fTkFNRV9TWVNURU1fU0NBTEUgICAgICAgICAgICAgICAgICBURVhUKCJTeXN0ZW1TY2FsZSIpCisjZGVmaW5lIFBBUk1fTUlOX1NZU1RFTV9TQ0FMRSAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBBUk1fTUFYX1NZU1RFTV9TQ0FMRSAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFBBUk1fREVGQVVMVF9TWVNURU1fU0NBTEUgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgUEFSTV9UWF9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR4S2V5CisjZGVmaW5lIFBBUk1fTkFNRV9UWF9LRVkgICAgICAgICAgICAgICAgICAgICAgICBURVhUKCJUeEtleSIpCisjZGVmaW5lIFBBUk1fTUlOX1RYX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBBUk1fTUFYX1RYX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFBBUk1fREVGQVVMVF9UWF9LRVkgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgUEFSTV9UWF9QT1dfTEVWRUwgICAgICAgICAgICAgICAgICAgICAgIFR4UG93TGV2ZWwKKyNkZWZpbmUgUEFSTV9OQU1FX1RYX1BPV19MRVZFTCAgICAgICAgICAgICAgICAgIFRFWFQoIlR4UG93TGV2ZWwiKQorI2RlZmluZSBQQVJNX01JTl9UWF9QT1dfTEVWRUwgICAgICAgICAgICAgICAgICAgMSAgIC8vIDIwIGRCbQorI2RlZmluZSBQQVJNX01BWF9UWF9QT1dfTEVWRUwgICAgICAgICAgICAgICAgICAgNiAgIC8vICA4IGRCbQorI2RlZmluZSBQQVJNX0RFRkFVTFRfVFhfUE9XX0xFVkVMICAgICAgICAgICAgICAgMyAgIC8vIDE1IGRCbQorCisjZGVmaW5lIFBBUk1fVFhfUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeFJhdGVDb250cm9sCisjZGVmaW5lIFBBUk1fTkFNRV9UWF9SQVRFICAgICAgICAgICAgICAgICAgICAgICBURVhUKCJUeFJhdGVDb250cm9sIikKKyNkZWZpbmUgUEFSTV9NSU5fVFhfUkFURSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2lmZGVmIFdBUlAKKyNkZWZpbmUgUEFSTV9NQVhfVFhfUkFURSAgICAgICAgICAgICAgICAgICAgICAgIDB4MEZGRgorI2RlZmluZSBQQVJNX0RFRkFVTFRfVFhfUkFURV8yR0haICAgICAgICAgICAgICAgMHgwRkZGCisjZGVmaW5lIFBBUk1fREVGQVVMVF9UWF9SQVRFXzVHSFogICAgICAgICAgICAgICAweDBGRjAKKyNlbHNlCisjZGVmaW5lIFBBUk1fTUFYX1RYX1JBVEUgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDcKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX1RYX1JBVEVfMkdIWiAgICAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBQQVJNX0RFRkFVTFRfVFhfUkFURV81R0haICAgICAgICAgICAgICAgMHgwMDAwCisjZW5kaWYgIC8vIFdBUlAKKworI2RlZmluZSBQQVJNX1RYX1JBVEUxICAgICAgICAgICAgICAgICAgICAgICAgICAgVHhSYXRlQ29udHJvbDEKKyNkZWZpbmUgUEFSTV9OQU1FX1RYX1JBVEUxICAgICAgICAgICAgICAgICAgICAgIFRFWFQoIlR4UmF0ZUNvbnRyb2wxIikKKyNkZWZpbmUgUEFSTV9UWF9SQVRFMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFR4UmF0ZUNvbnRyb2wyCisjZGVmaW5lIFBBUk1fTkFNRV9UWF9SQVRFMiAgICAgICAgICAgICAgICAgICAgICBURVhUKCJUeFJhdGVDb250cm9sMiIpCisjZGVmaW5lIFBBUk1fVFhfUkFURTMgICAgICAgICAgICAgICAgICAgICAgICAgICBUeFJhdGVDb250cm9sMworI2RlZmluZSBQQVJNX05BTUVfVFhfUkFURTMgICAgICAgICAgICAgICAgICAgICAgVEVYVCgiVHhSYXRlQ29udHJvbDMiKQorI2RlZmluZSBQQVJNX1RYX1JBVEU0ICAgICAgICAgICAgICAgICAgICAgICAgICAgVHhSYXRlQ29udHJvbDQKKyNkZWZpbmUgUEFSTV9OQU1FX1RYX1JBVEU0ICAgICAgICAgICAgICAgICAgICAgIFRFWFQoIlR4UmF0ZUNvbnRyb2w0IikKKyNkZWZpbmUgUEFSTV9UWF9SQVRFNSAgICAgICAgICAgICAgICAgICAgICAgICAgIFR4UmF0ZUNvbnRyb2w1CisjZGVmaW5lIFBBUk1fTkFNRV9UWF9SQVRFNSAgICAgICAgICAgICAgICAgICAgICBURVhUKCJUeFJhdGVDb250cm9sNSIpCisjZGVmaW5lIFBBUk1fVFhfUkFURTYgICAgICAgICAgICAgICAgICAgICAgICAgICBUeFJhdGVDb250cm9sNgorI2RlZmluZSBQQVJNX05BTUVfVFhfUkFURTYgICAgICAgICAgICAgICAgICAgICAgVEVYVCgiVHhSYXRlQ29udHJvbDYiKQorCisjZGVmaW5lIFBBUk1fVkVORE9SREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICBWZW5kb3JEZXNjcmlwdGlvbgorI2RlZmluZSBQQVJNX05BTUVfVkVORE9SREVTQ1JJUFRJT04JCQkJVEVYVCgiVmVuZG9yRGVzY3JpcHRpb24iKQorCisjZGVmaW5lIFBBUk1fV0RTX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICBXRFNBZGRyZXNzCisjZGVmaW5lIFBBUk1fTkFNRV9XRFNfQUREUkVTUwkJCQkJVEVYVCgiV0RTQWRkcmVzcyIpCisKKyNkZWZpbmUgUEFSTV9XRFNfQUREUkVTUzEgICAgICAgICAgICAgICAgICAgICAgIFdEU0FkZHJlc3MxCisjZGVmaW5lIFBBUk1fTkFNRV9XRFNfQUREUkVTUzEJCQkJCVRFWFQoIldEU0FkZHJlc3MxIikKKyNkZWZpbmUgUEFSTV9XRFNfQUREUkVTUzIgICAgICAgICAgICAgICAgICAgICAgIFdEU0FkZHJlc3MyCisjZGVmaW5lIFBBUk1fTkFNRV9XRFNfQUREUkVTUzIJCQkJCVRFWFQoIldEU0FkZHJlc3MyIikKKyNkZWZpbmUgUEFSTV9XRFNfQUREUkVTUzMgICAgICAgICAgICAgICAgICAgICAgIFdEU0FkZHJlc3MzCisjZGVmaW5lIFBBUk1fTkFNRV9XRFNfQUREUkVTUzMJCQkJCVRFWFQoIldEU0FkZHJlc3MzIikKKyNkZWZpbmUgUEFSTV9XRFNfQUREUkVTUzQgICAgICAgICAgICAgICAgICAgICAgIFdEU0FkZHJlc3M0CisjZGVmaW5lIFBBUk1fTkFNRV9XRFNfQUREUkVTUzQJCQkJCVRFWFQoIldEU0FkZHJlc3M0IikKKyNkZWZpbmUgUEFSTV9XRFNfQUREUkVTUzUgICAgICAgICAgICAgICAgICAgICAgIFdEU0FkZHJlc3M1CisjZGVmaW5lIFBBUk1fTkFNRV9XRFNfQUREUkVTUzUJCQkJCVRFWFQoIldEU0FkZHJlc3M1IikKKyNkZWZpbmUgUEFSTV9XRFNfQUREUkVTUzYgICAgICAgICAgICAgICAgICAgICAgIFdEU0FkZHJlc3M2CisjZGVmaW5lIFBBUk1fTkFNRV9XRFNfQUREUkVTUzYJCQkJCVRFWFQoIldEU0FkZHJlc3M2IikKKworLyoKKyNkZWZpbmUgUEFSTV9MT05HX1JFVFJZX0xJTUlUICAgICAgICAgICAgICAgICAgIExvbmdSZXRyeUxpbWl0CisjZGVmaW5lIFBBUk1fTkFNRV9MT05HX1JFVFJZX0xJTUlUICAgICAgICAgICAgICBURVhUKCJMb25nUmV0cnlMaW1pdCIpCisjZGVmaW5lIFBBUk1fTUlOX0xPTkdfUkVUUllfTElNSVQgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBBUk1fTUFYX0xPTkdfUkVUUllfTElNSVQgICAgICAgICAgICAgICAxNQorI2RlZmluZSBQQVJNX0RFRkFVTFRfTE9OR19SRVRSWV9MSU1JVCAgICAgICAgICAgMworCisKKyNkZWZpbmUgUEFSTV9QUk9CRV9EQVRBX1JBVEVTICAgICAgICAgICAgICAgICAgIFByb2JlRGF0YVJhdGVzCisjZGVmaW5lIFBBUk1fTkFNRV9QUk9CRV9EQVRBX1JBVEVTICAgICAgICAgICAgICBURVhUKCJQcm9iZURhdGFSYXRlcyIpCisjZGVmaW5lIFBBUk1fTUlOX1BST0JFX0RBVEFfUkFURVMgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgUEFSTV9NQVhfUFJPQkVfREFUQV9SQVRFUyAgICAgICAgICAgICAgIDB4MEZGRgorI2RlZmluZSBQQVJNX0RFRkFVTFRfUFJPQkVfREFUQV9SQVRFU18yR0haICAgICAgMHgwMDAyCisjZGVmaW5lIFBBUk1fREVGQVVMVF9QUk9CRV9EQVRBX1JBVEVTXzVHSFogICAgICAweDAwMTAKKworI2RlZmluZSBQQVJNX1NIT1JUX1JFVFJZX0xJTUlUICAgICAgICAgICAgICAgICAgU2hvcnRSZXRyeUxpbWl0CisjZGVmaW5lIFBBUk1fTkFNRV9TSE9SVF9SRVRSWV9MSU1JVCAgICAgICAgICAgICBURVhUKCJTaG9ydFJldHJ5TGltaXQiKQorI2RlZmluZSBQQVJNX01JTl9TSE9SVF9SRVRSWV9MSU1JVCAgICAgICAgICAgICAgMQorI2RlZmluZSBQQVJNX01BWF9TSE9SVF9SRVRSWV9MSU1JVCAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX1NIT1JUX1JFVFJZX0xJTUlUICAgICAgICAgIDcKKworCisqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIHN0YXRlIGRlZmluaXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVGhlIGZvbGxvd2luZyBjb25zdGFudHMgYXJlIHVzZWQgdG8gdHJhY2sgc3RhdGUgdGhlIGRldmljZSAqLworI2RlZmluZSBXTF9GUklNV0FSRV9QUkVTRU5UICAgICAxIC8vIERvd25sb2FkIGlmIG5lZWRlZAorI2RlZmluZSBXTF9GUklNV0FSRV9OT1RfUFJFU0VOVAkwIC8vIFNraXAgb3ZlciBkb3dubG9hZCwgYXNzdW1lIGl0cyBhbHJlYWR5IHRoZXJlCisjZGVmaW5lIFdMX0hBTkRMSU5HX0lOVCAgICAgICAgIDEgLy8gQWN0dWFsbHkgY2FsbCB0aGUgSENGIHRvIHN3aXRjaCBpbnRlcnJ1cHRzIG9uL29mZgorI2RlZmluZSBXTF9OT1RfSEFORExJTkdfSU5UICAgICAwIC8vIE5vdCB5ZXQgaGFuZGxpbmcgaW50ZXJydXB0cywgZG8gbm90IHN3aXRjaCBvbi9vZmYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBtYWNybyBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRoZSBmb2xsb3dpbmcgbWFjcm8gZW5zdXJlcyB0aGF0IG5vIHN5bWJvbHMgYXJlIGV4cG9ydGVkLCBtaW5pbWl6aW5nIHRoZQorICAgY2hhbmNlIG9mIGEgc3ltYm9sIGNvbGxpc2lvbiBpbiB0aGUga2VybmVsICovCisvLyBFWFBPUlRfTk9fU1lNQk9MUzsKKworI2RlZmluZSBORUxFTShhcnIpIChzaXplb2YoYXJyKSAvIHNpemVvZihhcnJbMF0pKQorCisjZGVmaW5lIFdWTEFOX1ZBTElEX01BQ19BRERSRVNTKCB4ICkgXAorKCh4WzBdIT0weEZGKSAmJiAoeFsxXSE9MHhGRikgJiYgKHhbMl0hPTB4RkYpICYmICh4WzNdIT0weEZGKSAmJiAoeFs0XSE9MHhGRikgJiYgKHhbNV0hPTB4RkYpKQorCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogdHlwZSBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyN1bmRlZiBGQUxTRQorI3VuZGVmIFRSVUUKKwordHlwZWRlZiBlbnVtCit7CisJRkFMU0UgPSAwLAorCVRSVUUgID0gMQorfQorYm9vbF90OworCisKK3R5cGVkZWYgc3RydWN0IF9TY2FuUmVzdWx0Cit7CisJLy9oY2ZfMTYgICAgICAgIGxlbjsKKwkvL2hjZl8xNiAgICAgICAgdHlwOworCWludCAgICAgICAgICAgICBzY2FuX2NvbXBsZXRlOworCWludCAgICAgICAgICAgICBudW1fYXBzOworCVNDQU5fUlNfU1RSQ1QgICBBUFRhYmxlIFtNQVhfTkFQU107Cit9CitTY2FuUmVzdWx0OworCisKK3R5cGVkZWYgc3RydWN0IF9MSU5LX1NUQVRVU19TVFJDVAoreworCWhjZl8xNiAgbGVuOworCWhjZl8xNiAgdHlwOworCWhjZl8xNiAgbGlua1N0YXR1czsgICAgIC8qIDEuLjUgKi8KK30KK0xJTktfU1RBVFVTX1NUUkNUOworCisKK3R5cGVkZWYgc3RydWN0IF9BU1NPQ19TVEFUVVNfU1RSQ1QKK3sKKwloY2ZfMTYgIGxlbjsKKwloY2ZfMTYgIHR5cDsKKwloY2ZfMTYgIGFzc29jU3RhdHVzOyAgICAgICAgICAgIC8qIDEuLjMgKi8KKwloY2ZfOCAgIHN0YUFkZHJbRVRIX0FMRU5dOworCWhjZl84ICAgb2xkQXBBZGRyW0VUSF9BTEVOXTsKK30KK0FTU09DX1NUQVRVU19TVFJDVDsKKworCit0eXBlZGVmIHN0cnVjdCBfU0VDVVJJVFlfU1RBVFVTX1NUUkNUCit7CisJaGNmXzE2ICBsZW47CisJaGNmXzE2ICB0eXA7CisJaGNmXzE2ICBzZWN1cml0eVN0YXR1czsgICAgIC8qIDEuLjMgKi8KKwloY2ZfOCAgIHN0YUFkZHJbRVRIX0FMRU5dOworCWhjZl8xNiAgcmVhc29uOworfQorU0VDVVJJVFlfU1RBVFVTX1NUUkNUOworCisjZGVmaW5lIFdWTEFOX1dNUF9QRFVfVFlQRV9MVF9SRVEgICAgICAgMHgwMAorI2RlZmluZSBXVkxBTl9XTVBfUERVX1RZUEVfTFRfUlNQICAgICAgIDB4MDEKKyNkZWZpbmUgV1ZMQU5fV01QX1BEVV9UWVBFX0FQTF9SRVEgICAgICAweDAyCisjZGVmaW5lIFdWTEFOX1dNUF9QRFVfVFlQRV9BUExfUlNQICAgICAgMHgwMworCit0eXBlZGVmIHN0cnVjdCB3dmxhbl9ldGhfaGRyCit7CisJdW5zaWduZWQgY2hhciAgIGRzdFtFVEhfQUxFTl07ICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiBhZGRyZXNzLiAqLworCXVuc2lnbmVkIGNoYXIgICBzcmNbRVRIX0FMRU5dOyAgICAgICAgICAgLyogU291cmNlIGFkZHJlc3MuICovCisJdW5zaWduZWQgc2hvcnQgIGxlbjsgICAgICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiB0aGUgUERVLiAqLworfQorV1ZMQU5fRVRIX0hEUiwgKlBXVkxBTl9FVEhfSERSOworCit0eXBlZGVmIHN0cnVjdCB3dmxhbl9sbGNfc25hcAoreworCXVuc2lnbmVkIGNoYXIgICBkc2FwOyAgICAgICAgICAgICAgICAgICAvKiBEU0FQICgweEFBKSAqLworCXVuc2lnbmVkIGNoYXIgICBzc2FwOyAgICAgICAgICAgICAgICAgICAvKiBTU0FQICgweEFBKSAqLworCXVuc2lnbmVkIGNoYXIgICBjdHJsOyAgICAgICAgICAgICAgICAgICAvKiBDb250cm9sICgweDAzKSAqLworCXVuc2lnbmVkIGNoYXIgICBvdWlbM107ICAgICAgICAgICAgICAgICAvKiBPcmdhbml6YXRpb24gVW5pcXVlIElEICgwMC02MC0xZCkuICovCisJdW5zaWduZWQgY2hhciAgIHNwZWNpZFsyXTsgICAgICAgICAgICAgIC8qIFNwZWNpZmljIElEIGNvZGUgKDAwLTAxKS4gKi8KK30KK1dWTEFOX0xMQ19TTkFQLCAqUFdWTEFOX0xMQ19TTkFQOworCisKK3R5cGVkZWYgc3RydWN0IHd2bGFuX2x0X2hkcgoreworCXVuc2lnbmVkIGNoYXIgICB2ZXJzaW9uOyAgICAgICAgICAgICAgICAvKiBWZXJzaW9uICgweDAwKSAqLworCXVuc2lnbmVkIGNoYXIgICB0eXBlOyAgICAgICAgICAgICAgICAgICAvKiBQRFUgdHlwZTogMC1yZXEvMS1yZXNwLiAqLworCXVuc2lnbmVkIHNob3J0ICBpZDsgICAgICAgICAgICAgICAgICAgICAvKiBJZGVudGlmaWVyIHRvIGFzc29jaWF0ZSByZXNwIHRvIHJlcS4gKi8KK30KK1dWTEFOX0xUX0hEUiwgKlBXVkxBTl9MVF9IRFI7CisKKwordHlwZWRlZiBzdHJ1Y3Qgd3ZsYW5fd21wX2hkcgoreworCXVuc2lnbmVkIGNoYXIgICB2ZXJzaW9uOyAgICAgICAgICAgICAgICAvKiBWZXJzaW9uICAqLworCXVuc2lnbmVkIGNoYXIgICB0eXBlOyAgICAgICAgICAgICAgICAgICAvKiBQRFUgdHlwZSAqLworfQorV1ZMQU5fV01QX0hEUiwgKlBXVkxBTl9XTVBfSERSOworCisKKyNkZWZpbmUgRklMTEVSX1NJWkUgICAgICAgICAgICAgMTU1NAorI2RlZmluZSBURVNUX1BBVFRFUk5fU0laRSAgICAgICA1NAorCisKK3R5cGVkZWYgc3RydWN0IHd2bGFuX2x0X3JlcQoreworCXVuc2lnbmVkIGNoYXIgICBGaWxsZXJbVEVTVF9QQVRURVJOX1NJWkVdOyAgIC8qIG1pbmltYWwgbGVuZ3RoIG9mIDU0IGJ5dGVzICovCit9CitXVkxBTl9MVF9SRVEsICpQV1ZMQU5fTFRfUkVROworCisKK3R5cGVkZWYgc3RydWN0IHd2bGFuX2x0X3JzcAoreworCWNoYXIgICAgICAgICAgIG5hbWVbMzJdOworCS8qIE1lYXN1cmVkIERhdGEgKi8KKwl1bnNpZ25lZCBjaGFyICBzaWduYWw7CisJdW5zaWduZWQgY2hhciAgbm9pc2U7CisJdW5zaWduZWQgY2hhciAgcnhGbG93OworCXVuc2lnbmVkIGNoYXIgIGRhdGFSYXRlOworCXVuc2lnbmVkIHNob3J0IHByb3RvY29sOworCS8qIENhcGFiaWxpdGllcyAqLworCXVuc2lnbmVkIGNoYXIgIHN0YXRpb247CisJdW5zaWduZWQgY2hhciAgZGF0YVJhdGVDYXA7CisJdW5zaWduZWQgY2hhciAgcG93ZXJNZ210WzRdOworCXVuc2lnbmVkIGNoYXIgIHJvYnVzdG5lc3NbNF07CisJdW5zaWduZWQgY2hhciAgc2NhbGluZzsKKwl1bnNpZ25lZCBjaGFyICByZXNlcnZlZFs1XTsKK30KK1dWTEFOX0xUX1JTUCwgKlBXVkxBTl9MVF9SU1A7CisKKwordHlwZWRlZiBzdHJ1Y3Qgd3ZsYW5fcnhfd21wX2hkcgoreworCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKKwl1bnNpZ25lZCBzaG9ydCByZXNlcnZlZDFbMl07CisJdW5zaWduZWQgY2hhciAgc2lsZW5jZTsKKwl1bnNpZ25lZCBjaGFyICBzaWduYWw7CisJdW5zaWduZWQgY2hhciAgcmF0ZTsKKwl1bnNpZ25lZCBjaGFyICByeEZsb3c7CisJdW5zaWduZWQgc2hvcnQgcmVzZXJ2ZWQyWzJdOworCXVuc2lnbmVkIHNob3J0IGZyYW1lQ29udHJvbDsKKwl1bnNpZ25lZCBzaG9ydCBkdXJhdGlvbjsKKwl1bnNpZ25lZCBzaG9ydCBhZGRyZXNzMVszXTsKKwl1bnNpZ25lZCBzaG9ydCBhZGRyZXNzMlszXTsKKwl1bnNpZ25lZCBzaG9ydCBhZGRyZXNzM1szXTsKKwl1bnNpZ25lZCBzaG9ydCBzZXF1ZW5jZUNvbnRyb2w7CisJdW5zaWduZWQgc2hvcnQgYWRkcmVzczRbM107CisjaWZuZGVmIEhFUk1FUzI1CS8vOz9qdXN0IHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUgb2YgaW5oZXJpdGVkIGJ1dCBub3QgY29tcHJlaGVuZGVkIGNvZGUgI2lmZGVmIEhFUk1FUzIKKwl1bnNpZ25lZCBzaG9ydCBzZWVtc190b19iZV91bnVzZWRfcmVzZXJ2ZWQzWzVdOyAgLy87PworCXVuc2lnbmVkIHNob3J0IHNlZW1zX3RvX2JlX3VudXNlZF9yZXNlcnZlZDQ7CSAvLzs/CisjZW5kaWYgLy8gSEVSTUVTMjUKKwl1bnNpZ25lZCBzaG9ydCBIZWFkZXJEYXRhTGVuOworfQorV1ZMQU5fUlhfV01QX0hEUiwgKlBXVkxBTl9SWF9XTVBfSERSOworCisKK3R5cGVkZWYgc3RydWN0IHd2bGFuX2xpbmt0ZXN0X3JlcV9wZHUKK3sKKwlXVkxBTl9FVEhfSERSICAgICBldGhIZHI7CisJV1ZMQU5fTExDX1NOQVAgICAgbGxjU25hcDsKKwlXVkxBTl9MVF9IRFIgICAgICBsdEhkcjsKKwlXVkxBTl9MVF9SRVEgICAgICBsdFJlcTsKK30KK1dWTEFOX0xJTktURVNUX1JFUV9QRFUsICpQV1ZMQU5fTElOS1RFU1RfUkVRX1BEVTsKKworCit0eXBlZGVmIHN0cnVjdCB3dmxhbl9saW5rdGVzdF9yc3BfcGR1Cit7CisJV1ZMQU5fUlhfV01QX0hEUiAgd21wUnhIZHI7CisJV1ZMQU5fRVRIX0hEUiAgICAgZXRoSGRyOworCVdWTEFOX0xMQ19TTkFQICAgIGxsY1NuYXA7CisJV1ZMQU5fTFRfSERSICAgICAgbHRIZHI7CisJV1ZMQU5fTFRfUlNQICAgICAgbHRSc3A7Cit9CitXVkxBTl9MSU5LVEVTVF9SU1BfUERVLCAqUFdWTEFOX0xJTktURVNUX1JTUF9QRFU7CisKKwordHlwZWRlZiBzdHJ1Y3QgX0xJTktURVNUX1JTUF9TVFJDVAoreworCWhjZl8xNiAgICAgICAgICAgICAgICAgICBsZW47CisJaGNmXzE2ICAgICAgICAgICAgICAgICAgIHR5cDsKKwlXVkxBTl9MSU5LVEVTVF9SU1BfUERVICAgbHRSc3A7Cit9CitMSU5LVEVTVF9SU1BfU1RSQ1Q7CisKKwordHlwZWRlZiBzdHJ1Y3Qgd3ZsYW5fd21wX3JzcF9wZHUKK3sKKwlXVkxBTl9SWF9XTVBfSERSICB3bXBSeEhkcjsKKwlXVkxBTl9FVEhfSERSICAgICBldGhIZHI7CisJV1ZMQU5fTExDX1NOQVAgICAgbGxjU25hcDsKKwlXVkxBTl9XTVBfSERSICAgICB3bXBIZHI7Cit9CitXVkxBTl9XTVBfUlNQX1BEVSwgKlBXVkxBTl9XTVBfUlNQX1BEVTsKKworCit0eXBlZGVmIHN0cnVjdCBfV01QX1JTUF9TVFJDVAoreworCWhjZl8xNiAgICAgICAgICAgICAgbGVuOworCWhjZl8xNiAgICAgICAgICAgICAgdHlwOworCVdWTEFOX1dNUF9SU1BfUERVICAgd21wUnNwOworfQorV01QX1JTUF9TVFJDVDsKKworCit0eXBlZGVmIHN0cnVjdCBfUFJPQkVfUkVTUAoreworCS8vIGZpcnN0IHBhcnQ6IDgwMi4xMQorCWhjZl8xNglsZW5ndGg7CisJaGNmXzE2CWluZm9UeXBlOworCWhjZl8xNglyZXNlcnZlZDA7CisJLy9oY2ZfOAlzaWduYWw7CisJaGNmXzgJc2lsZW5jZTsKKwloY2ZfOAlzaWduYWw7ICAgICAvLyBNb3ZlZCBzaWduYWwgaGVyZSBhcyBzaWduYWwvbm9pc2UgdmFsdWVzIHdlcmUgZmxpcHBlZAorCWhjZl84CXJ4RmxvdzsKKwloY2ZfOAlyYXRlOworCWhjZl8xNglyZXNlcnZlZDFbMl07CisKKwkvLyBzZWNvbmQgcGFydDoKKwloY2ZfMTYJZnJhbWVDb250cm9sOworCWhjZl8xNglkdXJJRDsKKwloY2ZfOAlhZGRyZXNzMVs2XTsKKwloY2ZfOAlhZGRyZXNzMls2XTsKKwloY2ZfOAlCU1NJRFs2XTsJCQkJCS8vISB0aGlzIGlzIGNvcnJlY3QsIHJpZ2h0ID8KKwloY2ZfMTYJc2VxdWVuY2U7CisJaGNmXzgJYWRkcmVzczRbNl07CisKKyNpZm5kZWYgV0FSUAorCWhjZl84CXJlc2VydmVkMlsxMl07CisjZW5kaWYgLy8gV0FSUAorCisJaGNmXzE2CWRhdGFMZW5ndGg7CisJCQkJCQkJCQkJLy8gdGhlIGluZm9ybWF0aW9uIGluIHRoZSBuZXh0IDMgZmllbGRzIChEQS9TQS9MZW5UeXBlKSBpcyBhY3R1YWxseSBub3QgZmlsbGVkIGluLgorCWhjZl84CURBWzZdOworCWhjZl84CVNBWzZdOworCisjaWZkZWYgV0FSUAorCWhjZl84ICAgY2hhbm5lbDsKKwloY2ZfOCAgIGJhbmQ7CisjZWxzZQorCWhjZl8xNglsZW5UeXBlOworI2VuZGlmICAvLyBXQVJQCisKKwloY2ZfOAl0aW1lU3RhbXBbOF07CisJaGNmXzE2CWJlYWNvbkludGVydmFsOworCWhjZl8xNgljYXBhYmlsaXR5OworCWhjZl84CXJhd0RhdGFbMjAwXTsJCQkJLy8hIDw8PCB0aGluayBhYm91dCB0aGlzIG51bWJlciAhCisJaGNmXzE2CWZsYWdzOworfQorUFJPQkVfUkVTUCwgKlBQUk9CRV9SRVNQOworCisKK3R5cGVkZWYgc3RydWN0IF9Qcm9iZVJlc3VsdAoreworCWludCAgICAgICAgIHNjYW5fY29tcGxldGU7CisJaW50ICAgICAgICAgbnVtX2FwczsKKwlQUk9CRV9SRVNQICBQcm9iZVRhYmxlW01BWF9OQVBTXTsKK30KK1Byb2JlUmVzdWx0OworCisvKiBEZWZpbml0aW9ucyB1c2VkIHRvIHBhcnNlIGNhcGFiaWxpdGllcyBvdXQgb2YgdGhlIHByb2JlIHJlc3BvbnNlcyAqLworI2RlZmluZSBDQVBBQklMSVRZX0VTUyAgICAgIDB4MDAwMQorI2RlZmluZSBDQVBBQklMSVRZX0lCU1MgICAgIDB4MDAwMgorI2RlZmluZSBDQVBBQklMSVRZX1BSSVZBQ1kgIDB4MDAxMAorCisvKiBEZWZpbml0aW9ucyB1c2VkIHRvIHBhcnNlIHRoZSBJbmZvcm1hdGlvbiBFbGVtZW50cyBvdXQgb2YgcHJvYmUgcmVzcG9uc2VzICovCisjZGVmaW5lIERTX0lORk9fRUxFTSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgR0VORVJJQ19JTkZPX0VMRU0gICAgICAgICAgICAgICAgICAgMHhkZAorI2RlZmluZSBXUEFfTUFYX0lFX0xFTiAgICAgICAgICAgICAgICAgICAgICA0MAorI2RlZmluZSBXUEFfU0VMRUNUT1JfTEVOICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFdQQV9PVUlfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHg1MCwgMHhmMiwgMSB9CisjZGVmaW5lIFdQQV9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgV1BBX0FVVEhfS0VZX01HTVRfVU5TUEVDXzgwMl8xWCAgICAgeyAweDAwLCAweDUwLCAweGYyLCAxIH0KKyNkZWZpbmUgV1BBX0FVVEhfS0VZX01HTVRfUFNLX09WRVJfODAyXzFYICAgeyAweDAwLCAweDUwLCAweGYyLCAyIH0KKyNkZWZpbmUgV1BBX0NJUEhFUl9TVUlURV9OT05FICAgICAgICAgICAgICAgeyAweDAwLCAweDUwLCAweGYyLCAwIH0KKyNkZWZpbmUgV1BBX0NJUEhFUl9TVUlURV9XRVA0MCAgICAgICAgICAgICAgeyAweDAwLCAweDUwLCAweGYyLCAxIH0KKyNkZWZpbmUgV1BBX0NJUEhFUl9TVUlURV9US0lQICAgICAgICAgICAgICAgeyAweDAwLCAweDUwLCAweGYyLCAyIH0KKyNkZWZpbmUgV1BBX0NJUEhFUl9TVUlURV9XUkFQICAgICAgICAgICAgICAgeyAweDAwLCAweDUwLCAweGYyLCAzIH0KKyNkZWZpbmUgV1BBX0NJUEhFUl9TVUlURV9DQ01QICAgICAgICAgICAgICAgeyAweDAwLCAweDUwLCAweGYyLCA0IH0KKyNkZWZpbmUgV1BBX0NJUEhFUl9TVUlURV9XRVAxMDQgICAgICAgICAgICAgeyAweDAwLCAweDUwLCAweGYyLCA1IH0KKwordHlwZWRlZiBlbnVtIHd2bGFuX2Rydl9tb2RlCit7CisJV1ZMQU5fRFJWX01PREVfTk9fRE9XTkxPQUQsICAgICAvKiB0aGlzIGlzIHRoZSBzYW1lIGFzIFNUQSBmb3IgSGVybWVzIDEgICAgKi8KKwkJCQkgICAgICAgICAgICAgICAgICAgIC8qIGl0IGlzIGFsc28gb25seSBhcHBsaWNhYmxlIGZvciBIZXJtZXMgMSAqLworCVdWTEFOX0RSVl9NT0RFX1NUQSwKKwlXVkxBTl9EUlZfTU9ERV9BUCwKKwlXVkxBTl9EUlZfTU9ERV9NQVgKK30KK1dWTEFOX0RSVl9NT0RFLCAqUFdWTEFOX0RSVl9NT0RFOworCisKK3R5cGVkZWYgZW51bSB3dmxhbl9wb3J0X3N0YXRlCit7CisJV1ZMQU5fUE9SVF9TVEFURV9FTkFCTEVELAorCVdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQsCisJV1ZMQU5fUE9SVF9TVEFURV9DT05ORUNURUQKK30KK1dWTEFOX1BPUlRfU1RBVEUsICpQV1ZMQU5fUE9SVF9TVEFURTsKKworLyoKK3R5cGVkZWYgZW51bSB3dmxhbl9jb25uZWN0X3N0YXRlCit7CisJV1ZMQU5fQ09OTkVDVF9TVEFURV9DT05ORUNURUQsCisJV1ZMQU5fQ09OTkVDVF9TVEFURV9ESVNDT05ORUNURUQKK30KK1dWTEFOX0NPTk5FQ1RfU1RBVEUsICpQV1ZMQU5fQ09OTkVDVF9TVEFURTsKKyovCisKK3R5cGVkZWYgZW51bSB3dmxhbl9wbV9zdGF0ZQoreworCVdWTEFOX1BNX1NUQVRFX0RJU0FCTEVELAorCVdWTEFOX1BNX1NUQVRFX0VOSEFOQ0VELAorCVdWTEFOX1BNX1NUQVRFX1NUQU5EQVJECit9CitXVkxBTl9QTV9TVEFURSwgKlBXVkxBTl9QTV9TVEFURTsKKworCit0eXBlZGVmIHN0cnVjdCB3dmxhbl9mcmFtZQoreworCXN0cnVjdCBza19idWZmICAqc2tiOyAgICAgICAvKiBza19idWZmIGZvciBmcmFtZS4gKi8KKwloY2ZfMTYgICAgICAgICAgcG9ydDsgICAgICAgLyogTUFDIHBvcnQgZm9yIHRoZSBmcmFtZS4gKi8KKwloY2ZfMTYgICAgICAgICAgbGVuOyAgICAgICAgLyogTGVuZ3RoIG9mIHRoZSBmcmFtZS4gKi8KK30KK1dWTEFOX0ZSQU1FLCAqUFdWTEFOX0ZSQU1FOworCisKK3R5cGVkZWYgc3RydWN0IHd2bGFuX2xmcmFtZQoreworCXN0cnVjdCBsaXN0X2hlYWQgICAgbm9kZTsgICAvKiBOb2RlIGluIHRoZSBsaXN0ICovCisJV1ZMQU5fRlJBTUUJICAgICAgICBmcmFtZTsgIC8qIEZyYW1lLiAqLworfQorV1ZMQU5fTEZSQU1FLCAqUFdWTEFOX0xGUkFNRTsKKworCisKKyNkZWZpbmUgREVGQVVMVF9OVU1fVFhfRlJBTUVTICAgICAgICAgICA0OAorI2RlZmluZSBUWF9RX0xPV19XQVRFUl9NQVJLICAgICAgICAgICAgIChERUZBVUxUX05VTV9UWF9GUkFNRVMvMykKKworI2RlZmluZSBXVkxBTl9NQVhfVFhfUVVFVUVTICAgICAgICAgICAgIDEKKworCisjaWZkZWYgVVNFX1dEUworCit0eXBlZGVmIHN0cnVjdCB3dmxhbl93ZHNfaWYKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAgICAgICAgICAgKmRldjsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcmVnaXN0ZXJlZDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbmV0aWZfcXVldWVfb247CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgICAgIHN0YXRzOworCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICBydHNUaHJlc2hvbGQ7CisJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIHR4UmF0ZUNudGw7CisJaGNmXzggICAgICAgICAgICAgICAgICAgICAgIHdkc0FkZHJlc3NbRVRIX0FMRU5dOworfSBXVkxBTl9XRFNfSUYsICpQV1ZMQU5fV0RTX0lGOworCisjZW5kaWYgIC8vIFVTRV9XRFMKKworCisKKyNkZWZpbmUgTlVNX1JYX0RFU0MgNQorI2RlZmluZSBOVU1fVFhfREVTQyA1CisKK3R5cGVkZWYgc3RydWN0IGRtYV9zdHJjdAoreworCURFU0NfU1RSQ1QgICp0eF9wYWNrZXRbTlVNX1RYX0RFU0NdOworCURFU0NfU1RSQ1QgICpyeF9wYWNrZXRbTlVNX1JYX0RFU0NdOworCURFU0NfU1RSQ1QgICpyeF9yZWNsYWltX2Rlc2MsICp0eF9yZWNsYWltX2Rlc2M7IC8vIERlc2NyaXB0b3JzIGZvciBob3N0LXJlY2xhaW0gcHVycG9zZXMgKHNlZSBIQ0YpCisJaW50ICAgICAgICAgdHhfcnNjX2luZDsgLy8gRE1BIFR4IHJlc291cmNlIGluZGljYXRvciBpcyBtYWludGFpbmVkIGluIHRoZSBNU0YsIG5vdCBpbiB0aGUgSENGCisJaW50ICAgICAgICAgcnhfcnNjX2luZDsgLy8gQWxzbyBhZGRlZCByeCByc291cmNlIGluZGljYXRvciBzbyB0aGF0IGNsZWFudXAgY2FuIGJlIHBlcmZvcm1lZCBpZiBhbGxvYyBmYWlscworCWludCAgICAgICAgIHN0YXR1czsKK30gRE1BX1NUUkNUOworCisKKy8qIE1hY3JvcyB1c2VkIGluIERNQSBzdXBwb3J0ICovCisvKiBnZXQgYnVzIGFkZHJlc3Mgb2Yge3J4LHR4fWRtYSBzdHJ1Y3R1cmUgbWVtYmVyLCBpbiBsaXR0bGUtZW5kaWFuIGJ5dGUgb3JkZXIgKi8KKyNkZWZpbmUgV0xfRE1BX0JVU19BRERSX0xFKHN0ciwgaSwgbWVtKSBcCisJY3B1X3RvX2xlMzIoc3RyIyNfZG1hX2FkZHJbKGkpXSArICgoaGNmXzggKikmc3RyWyhpKV0tPm1lbSAtIChoY2ZfOCAqKXN0clsoaSldKSkKKworCitzdHJ1Y3Qgd2xfcHJpdmF0ZQoreworCisjaWZkZWYgQlVTX1BDTUNJQQorCWRldl9ub2RlX3QgICAgICAgICAgICAgICAgICBub2RlOworCXN0cnVjdCBwY21jaWFfZGV2aWNlCSAgICAqbGluazsKKyNlbmRpZiAvLyBCVVNfUENNQ0lBCisKKworCXN0cnVjdCBuZXRfZGV2aWNlICAgICAgICAgICAqZGV2OworLy8Jc3RydWN0IG5ldF9kZXZpY2UgICAgICAgICAgICpkZXZfbmV4dDsKKwlzcGlubG9ja190ICAgICAgICAgICAgICAgICAgc2xvY2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0ICAgICAgIHRhc2s7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgICAgIHN0YXRzOworCisKKyNpZmRlZiBXSVJFTEVTU19FWFQKKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcyAgICAgICAgd3N0YXRzOworLy8JaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHNweV9udW1iZXI7CisvLwl1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgc3B5X2FkZHJlc3NbSVdfTUFYX1NQWV1bRVRIX0FMRU5dOworLy8Jc3RydWN0IGl3X3F1YWxpdHkgICAgICAgICAgIHNweV9zdGF0W0lXX01BWF9TUFldOworCXN0cnVjdCBpd19zcHlfZGF0YSAgICAgICAgICBzcHlfZGF0YTsKKwlzdHJ1Y3QgaXdfcHVibGljX2RhdGEJd2lyZWxlc3NfZGF0YTsKKyNlbmRpZiAvLyBXSVJFTEVTU19FWFQKKworCisJSUZCX1NUUkNUICAgICAgICAgICAgICAgICAgIGhjZkN0eDsKKy8vOz8gc3RydWN0IHRpbWVyX2xpc3QJCQl0aW1lcl9vb3I7CisvLzs/IGhjZl8xNgkJCQkJCXRpbWVyX29vcl9jbnQ7CisJdV9sb25nCQkJCQkJd2xhZ3M0OV90eXBlOwkJLy9jb250cm9scyBvdXRwdXQgaW4gL3Byb2Mvd2xhZ3M0OQorCXVfbG9uZyAgICAgICAgICAgICAgICAgICAgICBmbGFnczsKKwloY2ZfMTYJCQkJCQlEZWJ1Z0ZsYWc7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3JlZ2lzdGVyZWQ7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2hhbmRsaW5nX2ludDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgZmlybXdhcmVfcHJlc2VudDsKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgc3lzZnNDcmVhdGVkOworCUNGR19EUlZfSU5GT19TVFJDVCAgICAgICAgICBkcml2ZXJJbmZvOworCUNGR19JREVOVElUWV9TVFJDVCAgICAgICAgICBkcml2ZXJJZGVudGl0eTsKKwlDRkdfRldfSURFTlRJVFlfU1RSQ1QgICAgICAgU3RhdGlvbklkZW50aXR5OworCUNGR19QUklfSURFTlRJVFlfU1RSQ1QgICAgICBQcmltYXJ5SWRlbnRpdHk7CisJQ0ZHX1BSSV9JREVOVElUWV9TVFJDVCAgICAgIE5JQ0lkZW50aXR5OworCisJbHR2X3QgICAgICAgICAgICAgICAgICAgICAgIGx0dlJlY29yZDsKKwl1X2xvbmcgICAgICAgICAgICAgICAgICAgICAgdHhCeXRlczsKKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgbWF4UG9ydDsgICAgICAgIC8qIDAgZm9yIFNUQSwgNiBmb3IgQVAgKi8KKworCS8qIEVsZW1lbnRzIHVzZWQgZm9yIGFzeW5jIG5vdGlmaWNhdGlvbiBmcm9tIGhhcmR3YXJlICovCisJUklEX0xPR19TVFJDVAkJCQlSaWRMaXN0WzEwXTsKKwlsdHZfdCAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFJlY29yZDsKKwlQUk9CRV9SRVNQCQkJCSAgICBQcm9iZVJlc3A7CisJQVNTT0NfU1RBVFVTX1NUUkNUICAgICAgICAgIGFzc29jX3N0YXQ7CisJU0VDVVJJVFlfU1RBVFVTX1NUUkNUICAgICAgIHNlY19zdGF0OworCisJdV9jaGFyICAgICAgICAgICAgICAgICAgICAgIGxvb2tBaGVhZEJ1ZltXVkxBTl9NQVhfTE9PS0FIRUFEXTsKKworCWhjZl84ICAgICAgICAgICAgICAgICAgICAgICBQb3J0VHlwZTsgICAgICAgICAgIC8vIDEgLSAzICgxIFtOb3JtYWxdIHwgMyBbQWRIb2NdKQorCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsOyAgICAgICAgICAgIC8vIDAgLSAxNCAoMCkKKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgVHhSYXRlQ29udHJvbFsyXTsKKwloY2ZfOCAgICAgICAgICAgICAgICAgICAgICAgRGlzdGFuY2VCZXR3ZWVuQVBzOyAvLyAxIC0gMyAoMSkKKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgUlRTVGhyZXNob2xkOyAgICAgICAvLyAwIC0gMjM0NyAoMjM0NykKKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgUE1FbmFibGVkOyAgICAgICAgICAvLyAwIC0gMiwgODAwMSAtIDgwMDIgKDApCisJaGNmXzggICAgICAgICAgICAgICAgICAgICAgIE1pY3Jvd2F2ZVJvYnVzdG5lc3M7Ly8gMCAtIDEgKDApCisJaGNmXzggICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUlCU1M7ICAgICAgICAgLy8gMCAtIDEgKDApCisJaGNmXzggICAgICAgICAgICAgICAgICAgICAgIE11bHRpY2FzdFJlY2VpdmU7ICAgLy8gMCAtIDEgKDEpCisJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIE1heFNsZWVwRHVyYXRpb247ICAgLy8gMCAtIDY1NTM1ICgxMDApCisJaGNmXzggICAgICAgICAgICAgICAgICAgICAgIE1BQ0FkZHJlc3NbRVRIX0FMRU5dOworCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrTmFtZVtIQ0ZfTUFYX05BTUVfTEVOKzFdOworCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICBTdGF0aW9uTmFtZVtIQ0ZfTUFYX05BTUVfTEVOKzFdOworCWhjZl84ICAgICAgICAgICAgICAgICAgICAgICBFbmFibGVFbmNyeXB0aW9uOyAgIC8vIDAgLSAxICgwKQorCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICBLZXkxW01BWF9LRVlfTEVOKzFdOworCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICBLZXkyW01BWF9LRVlfTEVOKzFdOworCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICBLZXkzW01BWF9LRVlfTEVOKzFdOworCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICBLZXk0W01BWF9LRVlfTEVOKzFdOworCWhjZl84ICAgICAgICAgICAgICAgICAgICAgICBUcmFuc21pdEtleUlEOyAgICAgIC8vIDEgLSA0ICgxKQorCUNGR19ERUZBVUxUX0tFWVNfU1RSQ1QJICAgIERlZmF1bHRLZXlzOworCXVfY2hhciAgICAgICAgICAgICAgICAgICAgICBtYWlsYm94W01CX1NJWkVdOworCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICBzekVuY3J5cHRpb25bTUFYX0VOQ19MRU5dOworCisJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIGRyaXZlckVuYWJsZTsKKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgd29sYXNFbmFibGU7CisJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIGF0aW1XaW5kb3c7CisJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIGhvbGRvdmVyRHVyYXRpb247CisJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIE11bHRpY2FzdFJhdGVbMl07CisKKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb247IC8vIGlzIHRoaXMgQVAgc3BlY2lmaWM/CisJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIHByb21pc2N1b3VzTW9kZTsKKwlXVkxBTl9EUlZfTU9ERSAgICAgICAgICAgICAgRG93bmxvYWRGaXJtd2FyZTsgICAvLyAwIC0gMiAoMCBbTm9uZV0gfCAxIFtTVEFdIHwgMiBbQVBdKQorCisJY2hhcgkJCQkJCWZ3X2ltYWdlX2ZpbGVuYW1lW01BWF9MSU5FX1NJWkUrMV07CisKKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgQXV0aEtleU1nbXRTdWl0ZTsKKworCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICBsb2FkQmFsYW5jaW5nOworCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICBtZWRpdW1EaXN0cmlidXRpb247CisJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIHR4UG93TGV2ZWw7CisJLy9oY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgc2hvcnRSZXRyeUxpbWl0OworCS8vaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIGxvbmdSZXRyeUxpbWl0OworCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICBzcnNjWzJdOworCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICBicnNjWzJdOworCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uQ29udHJvbDsKKwkvL2hjZl8xNiAgICAgICAgICAgICAgICAgICAgICBwcm9iZURhdGFSYXRlc1syXTsKKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgb3duQmVhY29uSW50ZXJ2YWw7CisJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIGNvZXhpc3RlbmNlOworCisJV1ZMQU5fRlJBTUUgICAgICAgICAgICAgICAgIHR4RjsKKwlXVkxBTl9MRlJBTUUgICAgICAgICAgICAgICAgdHhMaXN0W0RFRkFVTFRfTlVNX1RYX0ZSQU1FU107CisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICAgIHR4RnJlZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICAgdHhRW1dWTEFOX01BWF9UWF9RVUVVRVNdOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICBuZXRpZl9xdWV1ZV9vbjsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgdHhRX2NvdW50OworCURFU0NfU1RSQ1QgICAgICAgICAgICAgICAgICBkZXNjX3J4OworCURFU0NfU1RSQ1QgICAgICAgICAgICAgICAgICBkZXNjX3R4OworCisJV1ZMQU5fUE9SVF9TVEFURSAgICAgICAgICAgIHBvcnRTdGF0ZTsKKworCVNjYW5SZXN1bHQgICAgICAgICAgICAgICAgICBzY2FuX3Jlc3VsdHM7CisJUHJvYmVSZXN1bHQgICAgICAgICAgICAgICAgIHByb2JlX3Jlc3VsdHM7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JlX251bV9hcHM7CisKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgdXNlX2RtYTsKKwlETUFfU1RSQ1QgICAgICAgICAgICAgICAgICAgZG1hOworI2lmZGVmIFVTRV9SVFMKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgdXNlUlRTOworI2VuZGlmICAvLyBVU0VfUlRTCisJaGNmXzggICAgICAgICAgICAgICAgICAgICAgIERUSU1QZXJpb2Q7ICAgICAgICAgLy8gMSAtIDI1NSAoMSkKKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgbXVsdGljYXN0UE1CdWZmZXJpbmc7CisJaGNmXzggICAgICAgICAgICAgICAgICAgICAgIFJlamVjdEFueTsgICAgICAgICAgLy8gMCAtIDEgKDApCisJaGNmXzggICAgICAgICAgICAgICAgICAgICAgIEV4Y2x1ZGVVbmVuY3J5cHRlZDsgLy8gMCAtIDEgKDEpCisJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIGludHJhQlNTUmVsYXk7CisjaWZkZWYgVVNFX1dEUworCVdWTEFOX1dEU19JRiAgICAgICAgICAgICAgICB3ZHNfcG9ydFtOVU1fV0RTX1BPUlRTXTsKKyNlbmRpZiAvLyBVU0VfV0RTCit9OyAvLyB3bF9wcml2YXRlCisKKyNpZmRlZiBIQVZFX05FVERFVl9QUklWCisjZGVmaW5lIHdsX3ByaXYoZGV2KSAoKHN0cnVjdCB3bF9wcml2YXRlICopIG5ldGRldl9wcml2KGRldikpCisjZWxzZQorZXh0ZXJuIGlubGluZSBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqd2xfcHJpdihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHJldHVybiBkZXYtPnByaXY7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTG9ja2luZyBhbmQgc3luY2hyb25pemF0aW9uIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGVzZSBmdW5jdGlvbnMgKm11c3QqIGJlIGlubGluZSBvciB0aGV5IHdpbGwgYnJlYWsgaG9ycmlibHkgb24KKyAqIFNQQVJDLCBkdWUgdG8gaXRzIHdlaXJkIHNlbWFudGljcyBmb3Igc2F2ZS9yZXN0b3JlIGZsYWdzLiBleHRlcm4KKyAqIGlubGluZSBzaG91bGQgcHJldmVudCB0aGUga2VybmVsIGZyb20gbGlua2luZyBvciBtb2R1bGUgZnJvbQorICogbG9hZGluZyBpZiB0aGV5IGFyZSBub3QgaW5saW5lZC4gKi8KK2V4dGVybiBpbmxpbmUgdm9pZCB3bF9sb2NrKHN0cnVjdCB3bF9wcml2YXRlICpscCwKKwkgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c2xvY2ssICpmbGFncyk7Cit9CisKK2V4dGVybiBpbmxpbmUgdm9pZCB3bF91bmxvY2soc3RydWN0IHdsX3ByaXZhdGUgKmxwLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNsb2NrLCAqZmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJbnRlcnJ1cHQgZW5hYmxlIGRpc2FibGUgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2V4dGVybiBpbmxpbmUgdm9pZCB3bF9hY3RfaW50X29uKHN0cnVjdCB3bF9wcml2YXRlICpscCkKK3sKKwkvKgorCSAqIE9ubHkgZG8gc29tZXRoaW5nIHdoZW4gdGhlIGRyaXZlciBpcyBoYW5kbGluZworCSAqIGludGVycnVwdHMuIEhhbmRsaW5nIHN0YXJ0cyBhdCB3bF9vcGVuIGFuZAorCSAqIGVuZHMgYXQgd2xfY2xvc2Ugd2hlbiBub3QgaW4gUlRTIG1vZGUKKwkgKi8KKwlpZihscC0+aXNfaGFuZGxpbmdfaW50ID09IFdMX0hBTkRMSU5HX0lOVCkgeworCQloY2ZfYWN0aW9uKCAmbHAtPmhjZkN0eCwgSENGX0FDVF9JTlRfT04gKTsKKwl9Cit9CisKK2V4dGVybiBpbmxpbmUgdm9pZCB3bF9hY3RfaW50X29mZihzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHApCit7CisJLyoKKwkgKiBPbmx5IGRvIHNvbWV0aGluZyB3aGVuIHRoZSBkcml2ZXIgaXMgaGFuZGxpbmcKKwkgKiBpbnRlcnJ1cHRzLiBIYW5kbGluZyBzdGFydHMgYXQgd2xfb3BlbiBhbmQKKwkgKiBlbmRzIGF0IHdsX2Nsb3NlIHdoZW4gbm90IGluIFJUUyBtb2RlCisJICovCisJaWYobHAtPmlzX2hhbmRsaW5nX2ludCA9PSBXTF9IQU5ETElOR19JTlQpIHsKKwkJaGNmX2FjdGlvbiggJmxwLT5oY2ZDdHgsIEhDRl9BQ1RfSU5UX09GRiApOworCX0KK30KKworI2VuZGlmICAvLyBfX1dBVkVMQU4yX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NzY0YTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9tYWluLmMKQEAgLTAsMCArMSwzODY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBXaXJlbGVzcyBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAod2xhZ3M0OSkuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBodHRwOi8vd3d3LmFnZXJlLmNvbQorICoKKyAqIEluaXRpYWxseSBkZXZlbG9wZWQgYnkgVHJpcGxlUG9pbnQsIEluYy4KKyAqICAgaHR0cDovL3d3dy50cmlwbGVwb2ludC5jb20KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBtYWluIGRyaXZlciBlbnRyeSBwb2ludHMgYW5kIG90aGVyIGFkYXB0ZXIKKyAqICAgc3BlY2lmaWMgcm91dGluZXMuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTT0ZUV0FSRSBMSUNFTlNFCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisgKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisgKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisgKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisgKgorICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogRGlzY2xhaW1lcgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBjb25zdGFudCBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQWxsb3cgc3VwcG9ydCBmb3IgY2FsbGluZyBzeXN0ZW0gZmNucyB0byBhY2Nlc3MgRi9XIGlhbWdlIGZpbGUgKi8KKyNkZWZpbmUgX19LRVJORUxfU1lTQ0FMTFNfXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGluY2x1ZGUgZmlsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8d2xfdmVyc2lvbi5oPgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisvLyAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisvLyAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKy8vICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorLy8jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisvLyAjaW5jbHVkZSA8bGludXgvdHF1ZXVlLmg+CisvLyAjaW5jbHVkZSA8bGludXgvaW4uaD4KKy8vICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorLy8gI2luY2x1ZGUgPGFzbS9pby5oPgorLy8gI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKy8vICNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisvLyAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisvLyAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisvLyAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisKKyNkZWZpbmUgQklOX0RMIDAKKyNpZiBCSU5fREwKKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjZW5kaWYgLy8gQklOX0RMCisKKworI2luY2x1ZGUgPGRlYnVnLmg+CisKKyNpbmNsdWRlIDxoY2YuaD4KKyNpbmNsdWRlIDxkaGYuaD4KKy8vaW4gb3JkZXIgdG8gZ2V0IGFyb3VuZDo6IHdsX21haW4uYzoyMjI5OiBgSFJFR19FVl9SRE1BRCcgdW5kZWNsYXJlZCAoZmlyc3QgdXNlIGluIHRoaXMgZnVuY3Rpb24pCisjaW5jbHVkZSA8aGNmZGVmLmg+CisKKyNpbmNsdWRlIDx3bF9pZi5oPgorI2luY2x1ZGUgPHdsX2ludGVybmFsLmg+CisjaW5jbHVkZSA8d2xfdXRpbC5oPgorI2luY2x1ZGUgPHdsX21haW4uaD4KKyNpbmNsdWRlIDx3bF9uZXRkZXYuaD4KKyNpbmNsdWRlIDx3bF93ZXh0Lmg+CisKKyNpZmRlZiBVU0VfUFJPRklMRQorI2luY2x1ZGUgPHdsX3Byb2ZpbGUuaD4KKyNlbmRpZiAgLyogVVNFX1BST0ZJTEUgKi8KKworI2lmZGVmIEJVU19QQ01DSUEKKyNpbmNsdWRlIDx3bF9jcy5oPgorI2VuZGlmICAvKiBCVVNfUENNQ0lBICovCisKKyNpZmRlZiBCVVNfUENJCisjaW5jbHVkZSA8d2xfcGNpLmg+CisjZW5kaWYgIC8qIEJVU19QQ0kgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgltYWNybyBkZWZpbnRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBWQUxJRF9QQVJBTShDKSBcCisJeyBcCisJCWlmICghKEMpKSBcCisJCXsgXAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiV2lyZWxlc3MsIHBhcmFtZXRlciBlcnJvcjogXCIlc1wiXG4iLCAjQyk7IFwKKwkJCWdvdG8gZmFpbGVkOyBcCisJCX0gXAorCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglsb2NhbCBmdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX2lzcl9oYW5kbGVyKCB1bnNpZ25lZCBsb25nIHAgKTsKKworI2lmIDAgLy9TQ1VMTF9VU0VfUFJPQyAvKiBkb24ndCB3YXN0ZSBzcGFjZSBpZiB1bnVzZWQgKi8KKy8vaW50IHNjdWxsX3JlYWRfcHJvY21lbShjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuLCBpbnQgdW51c2VkKTsKK2ludCBzY3VsbF9yZWFkX3Byb2NtZW0oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbiwgaW50ICplb2YsIHZvaWQgKmRhdGEgKTsKK3N0YXRpYyBpbnQgd3JpdGVfaW50KHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpOworc3RhdGljIHZvaWQgcHJvY193cml0ZShjb25zdCBjaGFyICpuYW1lLCB3cml0ZV9wcm9jX3QgKncsIHZvaWQgKmRhdGEpOworCisjZW5kaWYgLyogU0NVTExfVVNFX1BST0MgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG1vZHVsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMgLSBzZXQgd2l0aCAnaW5zbW9kJworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBwX3UxNiAgICBpcnFfbWFzayAgICAgICAgICAgICAgICA9IDB4ZGViODsgLy8gSVJRMyw0LDUsNyw5LDEwLDExLDEyLDE0LDE1CitzdGF0aWMgcF9zOCAgICAgaXJxX2xpc3RbNF0gICAgICAgICAgICAgPSB7IC0xIH07CisKKyNpZiAwCitNT0RVTEVfUEFSTShpcnFfbWFzaywgICAgICAgICAgICAgICAiaCIpOworTU9EVUxFX1BBUk1fREVTQyhpcnFfbWFzaywgICAgICAgICAgICAgICAiSVJRIG1hc2sgWzB4ZGViOF0iKTsKK01PRFVMRV9QQVJNKGlycV9saXN0LCAgICAgICAgICAgICAgICIxLTRiIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycV9saXN0LCAgICAgICAgICAgICAgICJJUlEgbGlzdCBbPGlycV9tYXNrPl0iKTsKKyNlbmRpZgorCitzdGF0aWMgcF91OCAgICAgUEFSTV9BVVRIRU5USUNBVElPTiAgICAgICAgCT0gUEFSTV9ERUZBVUxUX0FVVEhFTlRJQ0FUSU9OOworc3RhdGljIHBfdTE2ICAgIFBBUk1fQVVUSF9LRVlfTUdNVF9TVUlURSAgIAk9IFBBUk1fREVGQVVMVF9BVVRIX0tFWV9NR01UX1NVSVRFOworc3RhdGljIHBfdTE2ICAgIFBBUk1fQlJTQ18yR0haICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9CUlNDXzJHSFo7CitzdGF0aWMgcF91MTYgICAgUEFSTV9CUlNDXzVHSFogICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX0JSU0NfNUdIWjsKK3N0YXRpYyBwX3UxNiAgICBQQVJNX0NPRVhJU1RFTkNFICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfQ09FWElTVEVOQ0U7CitzdGF0aWMgcF91MTYgICAgUEFSTV9DT05ORUNUSU9OX0NPTlRST0wgICAgCT0gUEFSTV9ERUZBVUxUX0NPTk5FQ1RJT05fQ09OVFJPTDsgIC8vOz9yZW5hbWUgYW5kIG1vdmUKK3N0YXRpYyBwX2NoYXIgICpQQVJNX0NSRUFURV9JQlNTICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfQ1JFQVRFX0lCU1NfU1RSOworc3RhdGljIHBfY2hhciAgKlBBUk1fREVTSVJFRF9TU0lEICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9TU0lEOworc3RhdGljIHBfY2hhciAgKlBBUk1fRE9XTkxPQURfRklSTVdBUkUgICAgICA9ICIiOworc3RhdGljIHBfdTE2ICAgIFBBUk1fRU5BQkxFX0VOQ1JZUFRJT04gICAgIAk9IFBBUk1fREVGQVVMVF9FTkFCTEVfRU5DUllQVElPTjsKK3N0YXRpYyBwX2NoYXIgICpQQVJNX0VYQ0xVREVfVU5FTkNSWVBURUQgICAJPSBQQVJNX0RFRkFVTFRfRVhDTFVERV9VTkVOQ1JZUFRFRF9TVFI7CitzdGF0aWMgcF9jaGFyICAqUEFSTV9JTlRSQV9CU1NfUkVMQVkgICAgICAgCT0gUEFSTV9ERUZBVUxUX0lOVFJBX0JTU19SRUxBWV9TVFI7CitzdGF0aWMgcF9jaGFyICAqUEFSTV9LRVkxICAgICAgICAgICAgICAgICAgCT0gIiI7CitzdGF0aWMgcF9jaGFyICAqUEFSTV9LRVkyICAgICAgICAgICAgICAgICAgCT0gIiI7CitzdGF0aWMgcF9jaGFyICAqUEFSTV9LRVkzICAgICAgICAgICAgICAgICAgCT0gIiI7CitzdGF0aWMgcF9jaGFyICAqUEFSTV9LRVk0ICAgICAgICAgICAgICAgICAgCT0gIiI7CitzdGF0aWMgcF9jaGFyICAqUEFSTV9MT0FEX0JBTEFOQ0lORyAgICAgICAgCT0gUEFSTV9ERUZBVUxUX0xPQURfQkFMQU5DSU5HX1NUUjsKK3N0YXRpYyBwX3UxNiAgICBQQVJNX01BWF9TTEVFUCAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfTUFYX1BNX1NMRUVQOworc3RhdGljIHBfY2hhciAgKlBBUk1fTUVESVVNX0RJU1RSSUJVVElPTiAgIAk9IFBBUk1fREVGQVVMVF9NRURJVU1fRElTVFJJQlVUSU9OX1NUUjsKK3N0YXRpYyBwX2NoYXIgICpQQVJNX01JQ1JPV0FWRV9ST0JVU1RORVNTICAJPSBQQVJNX0RFRkFVTFRfTUlDUk9XQVZFX1JPQlVTVE5FU1NfU1RSOworc3RhdGljIHBfY2hhciAgKlBBUk1fTVVMVElDQVNUX1BNX0JVRkZFUklORwk9IFBBUk1fREVGQVVMVF9NVUxUSUNBU1RfUE1fQlVGRkVSSU5HX1NUUjsKK3N0YXRpYyBwX3UxNiAgICBQQVJNX01VTFRJQ0FTVF9SQVRFICAgICAgICAJPSBQQVJNX0RFRkFVTFRfTVVMVElDQVNUX1JBVEVfMkdIWjsKK3N0YXRpYyBwX2NoYXIgICpQQVJNX01VTFRJQ0FTVF9SWCAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfTVVMVElDQVNUX1JYX1NUUjsKK3N0YXRpYyBwX3U4ICAgICBQQVJNX05FVFdPUktfQUREUltFVEhfQUxFTl0JPSBQQVJNX0RFRkFVTFRfTkVUV09SS19BRERSOworc3RhdGljIHBfdTE2ICAgIFBBUk1fT1dOX0FUSU1fV0lORE9XICAgICAgIAk9IFBBUk1fREVGQVVMVF9PV05fQVRJTV9XSU5ET1c7CitzdGF0aWMgcF91MTYgICAgUEFSTV9PV05fQkVBQ09OX0lOVEVSVkFMICAgCT0gUEFSTV9ERUZBVUxUX09XTl9CRUFDT05fSU5URVJWQUw7CitzdGF0aWMgcF91OCAgICAgUEFSTV9PV05fQ0hBTk5FTCAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX09XTl9DSEFOTkVMOworc3RhdGljIHBfdTggICAgIFBBUk1fT1dOX0RUSU1fUEVSSU9EICAgICAgIAk9IFBBUk1fREVGQVVMVF9PV05fRFRJTV9QRVJJT0Q7CitzdGF0aWMgcF9jaGFyICAqUEFSTV9PV05fTkFNRSAgICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX09XTl9OQU1FOworc3RhdGljIHBfY2hhciAgKlBBUk1fT1dOX1NTSUQgICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9TU0lEOworc3RhdGljIHBfdTE2CVBBUk1fUE1fRU5BQkxFRCAgICAgICAgICAgIAk9IFdWTEFOX1BNX1NUQVRFX0RJU0FCTEVEOworc3RhdGljIHBfdTE2ICAgIFBBUk1fUE1fSE9MRE9WRVJfRFVSQVRJT04gIAk9IFBBUk1fREVGQVVMVF9QTV9IT0xET1ZFUl9EVVJBVElPTjsKK3N0YXRpYyBwX3U4ICAgICBQQVJNX1BPUlRfVFlQRSAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfUE9SVF9UWVBFOworc3RhdGljIHBfY2hhciAgKlBBUk1fUFJPTUlTQ1VPVVNfTU9ERSAgICAgIAk9IFBBUk1fREVGQVVMVF9QUk9NSVNDVU9VU19NT0RFX1NUUjsKK3N0YXRpYyBwX2NoYXIgICpQQVJNX1JFSkVDVF9BTlkgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfUkVKRUNUX0FOWV9TVFI7CisjaWZkZWYgVVNFX1dEUworc3RhdGljIHBfdTE2ICAgIFBBUk1fUlRTX1RIUkVTSE9MRDEgICAgICAgIAk9IFBBUk1fREVGQVVMVF9SVFNfVEhSRVNIT0xEOworc3RhdGljIHBfdTE2ICAgIFBBUk1fUlRTX1RIUkVTSE9MRDIgICAgICAgIAk9IFBBUk1fREVGQVVMVF9SVFNfVEhSRVNIT0xEOworc3RhdGljIHBfdTE2ICAgIFBBUk1fUlRTX1RIUkVTSE9MRDMgICAgICAgIAk9IFBBUk1fREVGQVVMVF9SVFNfVEhSRVNIT0xEOworc3RhdGljIHBfdTE2ICAgIFBBUk1fUlRTX1RIUkVTSE9MRDQgICAgICAgIAk9IFBBUk1fREVGQVVMVF9SVFNfVEhSRVNIT0xEOworc3RhdGljIHBfdTE2ICAgIFBBUk1fUlRTX1RIUkVTSE9MRDUgICAgICAgIAk9IFBBUk1fREVGQVVMVF9SVFNfVEhSRVNIT0xEOworc3RhdGljIHBfdTE2ICAgIFBBUk1fUlRTX1RIUkVTSE9MRDYgICAgICAgIAk9IFBBUk1fREVGQVVMVF9SVFNfVEhSRVNIT0xEOworI2VuZGlmIC8vIFVTRV9XRFMKK3N0YXRpYyBwX3UxNiAgICBQQVJNX1JUU19USFJFU0hPTEQgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfUlRTX1RIUkVTSE9MRDsKK3N0YXRpYyBwX3UxNiAgICBQQVJNX1NSU0NfMkdIWiAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfU1JTQ18yR0haOworc3RhdGljIHBfdTE2ICAgIFBBUk1fU1JTQ181R0haICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9TUlNDXzVHSFo7CitzdGF0aWMgcF91OCAgICAgUEFSTV9TWVNURU1fU0NBTEUgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1NZU1RFTV9TQ0FMRTsKK3N0YXRpYyBwX3U4ICAgICBQQVJNX1RYX0tFWSAgICAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfVFhfS0VZOworc3RhdGljIHBfdTE2ICAgIFBBUk1fVFhfUE9XX0xFVkVMICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9UWF9QT1dfTEVWRUw7CisjaWZkZWYgVVNFX1dEUworc3RhdGljIHBfdTE2ICAgIFBBUk1fVFhfUkFURTEgICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9UWF9SQVRFXzJHSFo7CitzdGF0aWMgcF91MTYgICAgUEFSTV9UWF9SQVRFMiAgICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1RYX1JBVEVfMkdIWjsKK3N0YXRpYyBwX3UxNiAgICBQQVJNX1RYX1JBVEUzICAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfVFhfUkFURV8yR0haOworc3RhdGljIHBfdTE2ICAgIFBBUk1fVFhfUkFURTQgICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9UWF9SQVRFXzJHSFo7CitzdGF0aWMgcF91MTYgICAgUEFSTV9UWF9SQVRFNSAgICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1RYX1JBVEVfMkdIWjsKK3N0YXRpYyBwX3UxNiAgICBQQVJNX1RYX1JBVEU2ICAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfVFhfUkFURV8yR0haOworI2VuZGlmIC8vIFVTRV9XRFMKK3N0YXRpYyBwX3UxNiAgICBQQVJNX1RYX1JBVEUgICAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfVFhfUkFURV8yR0haOworI2lmZGVmIFVTRV9XRFMKK3N0YXRpYyBwX3U4ICAgICBQQVJNX1dEU19BRERSRVNTMVtFVEhfQUxFTl0JPSBQQVJNX0RFRkFVTFRfTkVUV09SS19BRERSOworc3RhdGljIHBfdTggICAgIFBBUk1fV0RTX0FERFJFU1MyW0VUSF9BTEVOXQk9IFBBUk1fREVGQVVMVF9ORVRXT1JLX0FERFI7CitzdGF0aWMgcF91OCAgICAgUEFSTV9XRFNfQUREUkVTUzNbRVRIX0FMRU5dCT0gUEFSTV9ERUZBVUxUX05FVFdPUktfQUREUjsKK3N0YXRpYyBwX3U4ICAgICBQQVJNX1dEU19BRERSRVNTNFtFVEhfQUxFTl0JPSBQQVJNX0RFRkFVTFRfTkVUV09SS19BRERSOworc3RhdGljIHBfdTggICAgIFBBUk1fV0RTX0FERFJFU1M1W0VUSF9BTEVOXQk9IFBBUk1fREVGQVVMVF9ORVRXT1JLX0FERFI7CitzdGF0aWMgcF91OCAgICAgUEFSTV9XRFNfQUREUkVTUzZbRVRIX0FMRU5dCT0gUEFSTV9ERUZBVUxUX05FVFdPUktfQUREUjsKKyNlbmRpZiAvLyBVU0VfV0RTCisKKworI2lmIDAKK01PRFVMRV9QQVJNKFBBUk1fREVTSVJFRF9TU0lELCAgICAgICAgICAicyIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX0RFU0lSRURfU1NJRCwgICAgICAgICAgICAgIk5ldHdvcmsgTmFtZSAoPHN0cmluZz4pIFtBTlldIik7CitNT0RVTEVfUEFSTShQQVJNX09XTl9TU0lELCAgICAgICAgICAgICAgInMiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9PV05fU1NJRCwgICAgICAgICAgICAgICAgICJOZXR3b3JrIE5hbWUgKDxzdHJpbmc+KSBbQU5ZXSIpOworTU9EVUxFX1BBUk0oUEFSTV9PV05fQ0hBTk5FTCwgICAgICAgICAgICJiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fT1dOX0NIQU5ORUwsICAgICAgICAgICAgICAiQ2hhbm5lbCAoMCAtIDE0KSBbMF0iKTsKK01PRFVMRV9QQVJNKFBBUk1fU1lTVEVNX1NDQUxFLCAgICAgICAgICAiYiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1NZU1RFTV9TQ0FMRSwgICAgICAgICAgICAgIkRpc3RhbmNlIEJldHdlZW4gQVBzICgxIC0gMykgWzFdIik7CitNT0RVTEVfUEFSTShQQVJNX1RYX1JBVEUsICAgICAgICAgICAgICAgImIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9UWF9SQVRFLCAgICAgICAgICAgICAgICAgICJUcmFuc21pdCBSYXRlIENvbnRyb2wiKTsKK01PRFVMRV9QQVJNKFBBUk1fUlRTX1RIUkVTSE9MRCwgICAgICAgICAiaCIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1JUU19USFJFU0hPTEQsICAgICAgICAgICAgIk1lZGl1bSBSZXNlcnZhdGlvbiAoUlRTL0NUUyBGcmFnbWVudCBMZW5ndGgpICgyNTYgLSAyMzQ3KSBbMjM0N10iKTsKK01PRFVMRV9QQVJNKFBBUk1fTUlDUk9XQVZFX1JPQlVTVE5FU1MsICAicyIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX01JQ1JPV0FWRV9ST0JVU1RORVNTLCAgICAgIk1pY3Jvd2F2ZSBPdmVuIFJvYnVzdG5lc3MgRW5hYmxlZCAoPHN0cmluZz4gTiBvciBZKSBbTl0iKTsKK01PRFVMRV9QQVJNKFBBUk1fT1dOX05BTUUsICAgICAgICAgICAgICAicyIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX09XTl9OQU1FLCAgICAgICAgICAgICAgICAgIlN0YXRpb24gTmFtZSAoPHN0cmluZz4pIFtMaW51eF0iKTsKKworTU9EVUxFX1BBUk0oUEFSTV9FTkFCTEVfRU5DUllQVElPTiwgICAgICJiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fRU5BQkxFX0VOQ1JZUFRJT04sICAgICAgICAiRW5jcnlwdGlvbiBNb2RlICgwIC0gNykgWzBdIik7CisKK01PRFVMRV9QQVJNKFBBUk1fS0VZMSwgICAgICAgICAgICAgICAgICAicyIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX0tFWTEsICAgICAgICAgICAgICAgICAgICAgIkRhdGEgRW5jcnlwdGlvbiBLZXkgMSAoPHN0cmluZz4pIFtdIik7CitNT0RVTEVfUEFSTShQQVJNX0tFWTIsICAgICAgICAgICAgICAgICAgInMiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9LRVkyLCAgICAgICAgICAgICAgICAgICAgICJEYXRhIEVuY3J5cHRpb24gS2V5IDIgKDxzdHJpbmc+KSBbXSIpOworTU9EVUxFX1BBUk0oUEFSTV9LRVkzLCAgICAgICAgICAgICAgICAgICJzIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fS0VZMywgICAgICAgICAgICAgICAgICAgICAiRGF0YSBFbmNyeXB0aW9uIEtleSAzICg8c3RyaW5nPikgW10iKTsKK01PRFVMRV9QQVJNKFBBUk1fS0VZNCwgICAgICAgICAgICAgICAgICAicyIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX0tFWTQsICAgICAgICAgICAgICAgICAgICAgIkRhdGEgRW5jcnlwdGlvbiBLZXkgNCAoPHN0cmluZz4pIFtdIik7CitNT0RVTEVfUEFSTShQQVJNX1RYX0tFWSwgICAgICAgICAgICAgICAgImIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9UWF9LRVksICAgICAgICAgICAgICAgICAgICJUcmFuc21pdCBLZXkgSUQgKDEgLSA0KSBbMV0iKTsKK01PRFVMRV9QQVJNKFBBUk1fTVVMVElDQVNUX1JBVEUsICAgICAgICAiYiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX01VTFRJQ0FTVF9SQVRFLCAgICAgICAgICAgIk11bHRpY2FzdCBSYXRlIik7CitNT0RVTEVfUEFSTShQQVJNX0RPV05MT0FEX0ZJUk1XQVJFLCAgICAgInMiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9ET1dOTE9BRF9GSVJNV0FSRSwgICAgICAgICJmaWxlbmFtZSBvZiBmaXJtd2FyZSBpbWFnZSIpOworCitNT0RVTEVfUEFSTShQQVJNX0FVVEhfS0VZX01HTVRfU1VJVEUsICAgImIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9BVVRIX0tFWV9NR01UX1NVSVRFLCAgICAgICJBdXRoZW50aWNhdGlvbiBLZXkgTWFuYWdlbWVudCBzdWl0ZSAoMC00KSBbMF0iKTsKKworTU9EVUxFX1BBUk0oUEFSTV9MT0FEX0JBTEFOQ0lORywgICAgICAgICJzIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fTE9BRF9CQUxBTkNJTkcsICAgICAgICAgICAiTG9hZCBCYWxhbmNpbmcgRW5hYmxlZCAoPHN0cmluZz4gTiBvciBZKSBbWV0iKTsKK01PRFVMRV9QQVJNKFBBUk1fTUVESVVNX0RJU1RSSUJVVElPTiwgICAicyIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX01FRElVTV9ESVNUUklCVVRJT04sICAgICAgIk1lZGl1bSBEaXN0cmlidXRpb24gRW5hYmxlZCAoPHN0cmluZz4gTiBvciBZKSBbWV0iKTsKK01PRFVMRV9QQVJNKFBBUk1fVFhfUE9XX0xFVkVMLCAgICAgICAgICAiYiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1RYX1BPV19MRVZFTCwgICAgICAgICAgICAgIlRyYW5zbWl0IFBvd2VyICgwIC0gNikgWzNdIik7CitNT0RVTEVfUEFSTShQQVJNX1NSU0NfMkdIWiwgICAgICAgICAgICAgImIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9TUlNDXzJHSFosICAgICAgICAgICAgICAgICJTdXBwb3J0ZWQgUmF0ZSBTZXQgQ29udHJvbCAyLjQgR0h6Iik7CitNT0RVTEVfUEFSTShQQVJNX1NSU0NfNUdIWiwgICAgICAgICAgICAgImIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9TUlNDXzVHSFosICAgICAgICAgICAgICAgICJTdXBwb3J0ZWQgUmF0ZSBTZXQgQ29udHJvbCA1LjAgR0h6Iik7CitNT0RVTEVfUEFSTShQQVJNX0JSU0NfMkdIWiwgICAgICAgICAgICAgImIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9CUlNDXzJHSFosICAgICAgICAgICAgICAgICJCYXNpYyBSYXRlIFNldCBDb250cm9sIDIuNCBHSHoiKTsKK01PRFVMRV9QQVJNKFBBUk1fQlJTQ181R0haLCAgICAgICAgICAgICAiYiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX0JSU0NfNUdIWiwgICAgICAgICAgICAgICAgIkJhc2ljIFJhdGUgU2V0IENvbnRyb2wgNS4wIEdIeiIpOworI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfU1RBCisvLzs/c2VlbXMgcmVhc29uYWJsZSB0aGF0IGV2ZW4gYW4gQVAtb25seSBkcml2ZXIgY291bGQgYWZmb3JkIHRoaXMgc21hbGwgYWRkaXRpb25hbCBmb290cHJpbnQKK01PRFVMRV9QQVJNKFBBUk1fUE1fRU5BQkxFRCwgICAgICAgICAgICAiaCIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1BNX0VOQUJMRUQsICAgICAgICAgICAgICAgIlBvd2VyIE1hbmFnZW1lbnQgU3RhdGUgKDAgLSAyLCA4MDAxIC0gODAwMikgWzBdIik7CitNT0RVTEVfUEFSTShQQVJNX1BPUlRfVFlQRSwgICAgICAgICAgICAgImIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9QT1JUX1RZUEUsICAgICAgICAgICAgICAgICJQb3J0IFR5cGUgKDEgLSAzKSBbMV0iKTsKKy8vOz9NT0RVTEVfUEFSTShQQVJNX0NSRUFURV9JQlNTLCAgICAgICAgICAgInMiKTsKKy8vOz9NT0RVTEVfUEFSTV9ERVNDKFBBUk1fQ1JFQVRFX0lCU1MsICAgICAgICAgICAgICAiQ3JlYXRlIElCU1MgKDxzdHJpbmc+IE4gb3IgWSkgW05dIik7CisvLzs/TU9EVUxFX1BBUk0oUEFSTV9NVUxUSUNBU1RfUlgsICAgICAgICAgICJzIik7CisvLzs/TU9EVUxFX1BBUk1fREVTQyhQQVJNX01VTFRJQ0FTVF9SWCwgICAgICAgICAgICAgIk11bHRpY2FzdCBSZWNlaXZlIEVuYWJsZSAoPHN0cmluZz4gTiBvciBZKSBbWV0iKTsKKy8vOz9NT0RVTEVfUEFSTShQQVJNX01BWF9TTEVFUCwgICAgICAgICAgICAgImgiKTsKKy8vOz9NT0RVTEVfUEFSTV9ERVNDKFBBUk1fTUFYX1NMRUVQLCAgICAgICAgICAgICAgICAiTWF4aW11bSBQb3dlciBNYW5hZ2VtZW50IFNsZWVwIER1cmF0aW9uICgwIC0gNjU1MzUpIFsxMDBdIik7CisvLzs/TU9EVUxFX1BBUk0oUEFSTV9ORVRXT1JLX0FERFIsICAgICAgICAgICI2YiIpOworLy87P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9ORVRXT1JLX0FERFIsICAgICAgICAgICAgICJIYXJkd2FyZSBFdGhlcm5ldCBBZGRyZXNzIChbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSkgWzxmYWN0b3J5IHZhbHVlPl0iKTsKKy8vOz9NT0RVTEVfUEFSTShQQVJNX0FVVEhFTlRJQ0FUSU9OLCAgICAgICAgImIiKTsKKy8vCisvL3RyYWNrZXIgMTI0NDgKKy8vOz9NT0RVTEVfUEFSTV9ERVNDKFBBUk1fQVVUSEVOVElDQVRJT04sICAgICAgICAgICAiQXV0aGVudGljYXRpb24gVHlwZSAoMC0yKSBbMF0gMD1PcGVuIDE9U2hhcmVkS2V5IDI9TEVBUCIpOworLy87P01PRFVMRV9QQVJNX0RFU0MoYXV0aGVudGljYXRpb24sICAgICAgICAgIkF1dGhlbnRpY2F0aW9uIFR5cGUgKDEtMikgWzFdIDE9T3BlbiAyPVNoYXJlZEtleSIpOworLy90cmFja2VyIDEyNDQ4CisvLworLy87P01PRFVMRV9QQVJNKFBBUk1fT1dOX0FUSU1fV0lORE9XLCAgICAgICAiYiIpOworLy87P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9PV05fQVRJTV9XSU5ET1csICAgICAgICAgICJBVElNIFdpbmRvdyB0aW1lIGluIFRVIGZvciBJQlNTIGNyZWF0aW9uICgwLTEwMCkgWzBdIik7CisvLzs/TU9EVUxFX1BBUk0oUEFSTV9QTV9IT0xET1ZFUl9EVVJBVElPTiwgICJiIik7CisvLzs/TU9EVUxFX1BBUk1fREVTQyhQQVJNX1BNX0hPTERPVkVSX0RVUkFUSU9OLCAgICAgIlRpbWUgc3RhdGlvbiByZW1haW5zIGF3YWtlIGFmdGVyIE1BQyBmcmFtZSB0cmFuc2ZlciB3aGVuIFBNIGlzIG9uICgwLTY1NTM1KSBbMTAwXSIpOworLy87P01PRFVMRV9QQVJNKFBBUk1fUFJPTUlTQ1VPVVNfTU9ERSwgICAgICAicyIpOworLy87P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9QUk9NSVNDVU9VU19NT0RFLCAgICAgICAgICJQcm9taXNjdW91cyBNb2RlIEVuYWJsZSAoPHN0cmluZz4gWSBvciBOICkgW05dIiApOworLy87PworTU9EVUxFX1BBUk0oUEFSTV9DT05ORUNUSU9OX0NPTlRST0wsICAgICJiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fQ09OTkVDVElPTl9DT05UUk9MLCAgICAgICAiQ29ubmVjdGlvbiBDb250cm9sICgwIC0gMykgWzJdIik7CisjZW5kaWYgLyogSENGX1NUQSAqLworI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAKKwkJCQkJLy87P3Nob3VsZCB3ZSByZXN0b3JlIHRoaXMgdG8gYWxsb3cgc21hbGxlciBtZW1vcnkgZm9vdHByaW50CitNT0RVTEVfUEFSTShQQVJNX09XTl9EVElNX1BFUklPRCwgICAgICAgImIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9PV05fRFRJTV9QRVJJT0QsICAgICAgICAgICJEVElNIFBlcmlvZCAoMCAtIDI1NSkgWzFdIik7CitNT0RVTEVfUEFSTShQQVJNX1JFSkVDVF9BTlksICAgICAgICAgICAgInMiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9SRUpFQ1RfQU5ZLCAgICAgICAgICAgICAgICJDbG9zZWQgU3lzdGVtICg8c3RyaW5nPiBOIG9yIFkpIFtOXSIpOworTU9EVUxFX1BBUk0oUEFSTV9FWENMVURFX1VORU5DUllQVEVELCAgICJzIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fRVhDTFVERV9VTkVOQ1JZUFRFRCwgICAgICAiRGVueSBub24tZW5jcnlwdGVkICg8c3RyaW5nPiBOIG9yIFkpIFtZXSIpOworTU9EVUxFX1BBUk0oUEFSTV9NVUxUSUNBU1RfUE1fQlVGRkVSSU5HLCJzIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fTVVMVElDQVNUX1BNX0JVRkZFUklORywgICAiQnVmZmVyIE1BQyBmcmFtZXMgZm9yIFR4IGFmdGVyIERUSU0gKDxzdHJpbmc+IFkgb3IgTikgW1ldIik7CitNT0RVTEVfUEFSTShQQVJNX0lOVFJBX0JTU19SRUxBWSwgICAgICAgInMiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9JTlRSQV9CU1NfUkVMQVksICAgICAgICAgICJJbnRyYUJTUyBSZWxheSAoPHN0cmluZz4gTiBvciBZKSBbWV0iKTsKK01PRFVMRV9QQVJNKFBBUk1fUlRTX1RIUkVTSE9MRDEsICAgICAgICAiaCIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1JUU19USFJFU0hPTEQxLCAgICAgICAgICAgIlJUUyBUaHJlc2hvbGQsIFdEUyBQb3J0IDEgKDI1NiAtIDIzNDcpIFsyMzQ3XSIpOworTU9EVUxFX1BBUk0oUEFSTV9SVFNfVEhSRVNIT0xEMiwgICAgICAgICJoIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fUlRTX1RIUkVTSE9MRDIsICAgICAgICAgICAiUlRTIFRocmVzaG9sZCwgV0RTIFBvcnQgMiAoMjU2IC0gMjM0NykgWzIzNDddIik7CitNT0RVTEVfUEFSTShQQVJNX1JUU19USFJFU0hPTEQzLCAgICAgICAgImgiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9SVFNfVEhSRVNIT0xEMywgICAgICAgICAgICJSVFMgVGhyZXNob2xkLCBXRFMgUG9ydCAzICgyNTYgLSAyMzQ3KSBbMjM0N10iKTsKK01PRFVMRV9QQVJNKFBBUk1fUlRTX1RIUkVTSE9MRDQsICAgICAgICAiaCIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1JUU19USFJFU0hPTEQ0LCAgICAgICAgICAgIlJUUyBUaHJlc2hvbGQsIFdEUyBQb3J0IDQgKDI1NiAtIDIzNDcpIFsyMzQ3XSIpOworTU9EVUxFX1BBUk0oUEFSTV9SVFNfVEhSRVNIT0xENSwgICAgICAgICJoIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fUlRTX1RIUkVTSE9MRDUsICAgICAgICAgICAiUlRTIFRocmVzaG9sZCwgV0RTIFBvcnQgNSAoMjU2IC0gMjM0NykgWzIzNDddIik7CitNT0RVTEVfUEFSTShQQVJNX1JUU19USFJFU0hPTEQ2LCAgICAgICAgImgiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9SVFNfVEhSRVNIT0xENiwgICAgICAgICAgICJSVFMgVGhyZXNob2xkLCBXRFMgUG9ydCA2ICgyNTYgLSAyMzQ3KSBbMjM0N10iKTsKK01PRFVMRV9QQVJNKFBBUk1fVFhfUkFURTEsICAgICAgICAgICAgICAiYiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1RYX1JBVEUxLCAgICAgICAgICAgICAgICAgIlRyYW5zbWl0IFJhdGUgQ29udHJvbCwgV0RTIFBvcnQgMSAoMSAtIDcpIFszXSIpOworTU9EVUxFX1BBUk0oUEFSTV9UWF9SQVRFMiwgICAgICAgICAgICAgICJiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fVFhfUkFURTIsICAgICAgICAgICAgICAgICAiVHJhbnNtaXQgUmF0ZSBDb250cm9sLCBXRFMgUG9ydCAyICgxIC0gNykgWzNdIik7CitNT0RVTEVfUEFSTShQQVJNX1RYX1JBVEUzLCAgICAgICAgICAgICAgImIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9UWF9SQVRFMywgICAgICAgICAgICAgICAgICJUcmFuc21pdCBSYXRlIENvbnRyb2wsIFdEUyBQb3J0IDMgKDEgLSA3KSBbM10iKTsKK01PRFVMRV9QQVJNKFBBUk1fVFhfUkFURTQsICAgICAgICAgICAgICAiYiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1RYX1JBVEU0LCAgICAgICAgICAgICAgICAgIlRyYW5zbWl0IFJhdGUgQ29udHJvbCwgV0RTIFBvcnQgNCAoMSAtIDcpIFszXSIpOworTU9EVUxFX1BBUk0oUEFSTV9UWF9SQVRFNSwgICAgICAgICAgICAgICJiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fVFhfUkFURTUsICAgICAgICAgICAgICAgICAiVHJhbnNtaXQgUmF0ZSBDb250cm9sLCBXRFMgUG9ydCA1ICgxIC0gNykgWzNdIik7CitNT0RVTEVfUEFSTShQQVJNX1RYX1JBVEU2LCAgICAgICAgICAgICAgImIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9UWF9SQVRFNiwgICAgICAgICAgICAgICAgICJUcmFuc21pdCBSYXRlIENvbnRyb2wsIFdEUyBQb3J0IDYgKDEgLSA3KSBbM10iKTsKK01PRFVMRV9QQVJNKFBBUk1fV0RTX0FERFJFU1MxLCAgICAgICAgICAiNmIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9XRFNfQUREUkVTUzEsICAgICAgICAgICAgICJNQUMgQWRkcmVzcywgV0RTIFBvcnQgMSAoWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0pIFt7MH1dIik7CitNT0RVTEVfUEFSTShQQVJNX1dEU19BRERSRVNTMiwgICAgICAgICAgIjZiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fV0RTX0FERFJFU1MyLCAgICAgICAgICAgICAiTUFDIEFkZHJlc3MsIFdEUyBQb3J0IDIgKFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdKSBbezB9XSIpOworTU9EVUxFX1BBUk0oUEFSTV9XRFNfQUREUkVTUzMsICAgICAgICAgICI2YiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1dEU19BRERSRVNTMywgICAgICAgICAgICAgIk1BQyBBZGRyZXNzLCBXRFMgUG9ydCAzIChbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSkgW3swfV0iKTsKK01PRFVMRV9QQVJNKFBBUk1fV0RTX0FERFJFU1M0LCAgICAgICAgICAiNmIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9XRFNfQUREUkVTUzQsICAgICAgICAgICAgICJNQUMgQWRkcmVzcywgV0RTIFBvcnQgNCAoWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0pIFt7MH1dIik7CitNT0RVTEVfUEFSTShQQVJNX1dEU19BRERSRVNTNSwgICAgICAgICAgIjZiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fV0RTX0FERFJFU1M1LCAgICAgICAgICAgICAiTUFDIEFkZHJlc3MsIFdEUyBQb3J0IDUgKFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdKSBbezB9XSIpOworTU9EVUxFX1BBUk0oUEFSTV9XRFNfQUREUkVTUzYsICAgICAgICAgICI2YiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1dEU19BRERSRVNTNiwgICAgICAgICAgICAgIk1BQyBBZGRyZXNzLCBXRFMgUG9ydCA2IChbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSkgW3swfV0iKTsKKworTU9EVUxFX1BBUk0oUEFSTV9PV05fQkVBQ09OX0lOVEVSVkFMLCAgICJiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fT1dOX0JFQUNPTl9JTlRFUlZBTCwgICAgICAiT3duIEJlYWNvbiBJbnRlcnZhbCAoMjAgLSAyMDApIFsxMDBdIik7CitNT0RVTEVfUEFSTShQQVJNX0NPRVhJU1RFTkNFLCAgICJiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fQ09FWElTVEVOQ0UsICAgICAgIkNvZXhpc3RlbmNlICgwLTcpIFswXSIpOworCisjZW5kaWYgLyogSENGX0FQICovCisjZW5kaWYKKworLyogRU5EIE5FVyBQQVJBTUVURVJTICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZGVidWdnaW5nIHNwZWNpZmljcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBEQkcKKworc3RhdGljIHBfdTMyICAgIHBjX2RlYnVnID0gREJHX0xWTDsKKy8vTU9EVUxFX1BBUk0ocGNfZGVidWcsICJpIik7CisvKnN0YXRpYyA7P2NvbmZsaWN0cyB3aXRoIG15IHVuZGVyc3RhbmRpbmcgb2YgQ0wgcGFyYW1ldGVycyBhbmQgYnJlYWtzIG5vdyBJIG1vdmVkCisgKiB0aGUgY29ycmVzcG9uZGlnIGxvZ2ljIHRvIHdsX3Byb2ZpbGUKKyAqLyBwX3UzMiAgICBEZWJ1Z0ZsYWcgPSB+MDsgLy9yZWNvZ25pemFibGUgInVuZGVmaW5lZCB2YWx1ZSIgcmF0aGVyIHRoZW4gREJHX0RFRkFVTFRTOworLy9NT0RVTEVfUEFSTShEZWJ1Z0ZsYWcsICJsIik7CisKK2RiZ19pbmZvX3QgICB3bF9pbmZvID0geyBEQkdfTU9EX05BTUUsIDAsIDAgfTsKK2RiZ19pbmZvX3QgICpEYmdJbmZvID0gJndsX2luZm87CisKKyNlbmRpZiAvKiBEQkcgKi8KKyNpZmRlZiBVU0VfUlRTCisKK3N0YXRpYyBwX2NoYXIgICp1c2VSVFMgPSAiTiI7CitNT0RVTEVfUEFSTSggdXNlUlRTLCAicyIgKTsKK01PRFVMRV9QQVJNX0RFU0MoIHVzZVJUUywgIlVzZSBSVFMgdGVzdCBpbnRlcmZhY2UgKDxzdHJpbmc+IE4gb3IgWSkgW05dIiApOworCisjZW5kaWYgIC8qIFVTRV9SVFMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBmaXJtd2FyZSBkb3dubG9hZCBzcGVjaWZpY3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gc3RydWN0IENGR19SQU5HRTJfU1RSQ1QgQkFTRUQKKwljZmdfZHJ2X2FjdF9yYW5nZXNfcHJpOyAJICAgIC8vIGRlc2NyaWJlcyBwcmltYXJ5LWFjdG9yIHJhbmdlIG9mIEhDRgorCisjaWYgMCAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAorZXh0ZXJuIG1lbWltYWdlIGFwOyAgICAgICAgICAgICAgICAgLy8gQVAgZmlybXdhcmUgaW1hZ2UgdG8gYmUgZG93bmxvYWRlZAorI2VuZGlmIC8qIEhDRl9BUCAqLworCisjaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9TVEEKKy8vZXh0ZXJuIG1lbWltYWdlIHN0YXRpb247ICAgICAgICAgICAgLy8gU1RBIGZpcm13YXJlIGltYWdlIHRvIGJlIGRvd25sb2FkZWQKK2V4dGVybiBtZW1pbWFnZSBmd19pbWFnZTsgICAgICAgICAgICAvLyBmaXJtd2FyZSBpbWFnZSB0byBiZSBkb3dubG9hZGVkCisjZW5kaWYgLyogSENGX1NUQSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9pbnNlcnQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICB3bF9pbnNlcnQoKSBpcyBzY2hlZHVsZWQgdG8gcnVuIGFmdGVyIGEgQ0FSRF9JTlNFUlRJT04gZXZlbnQgaXMKKyAqICByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0LCBhbmQgdG8gbWFrZSB0aGUgZXRoZXJuZXQgZGV2aWNlCisgKiAgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIG5ldF9kZXZpY2Ugc3RydWN0IG9mIHRoZSB3aXJlbGVzcyBkZXZpY2UKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIFRSVUUgb3IgRkFMU0UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX2luc2VydCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJaW50ICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBoY2Zfc3RhdHVzID0gSENGX1NVQ0NFU1M7CisJaW50ICAgICAgICAgICAgICAgICAgICAgaTsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICBmbGFncyA9IDA7CisJc3RydWN0IHdsX3ByaXZhdGUgICAgICAgKmxwID0gd2xfcHJpdihkZXYpOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlEQkdfRlVOQyggIndsX2luc2VydCIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGFkYXB0ZXIgaGFyZHdhcmUuICovCisJbWVtc2V0KCAmKCBscC0+aGNmQ3R4ICksIDAsIHNpemVvZiggSUZCX1NUUkNUICkpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgYWRhcHRlciBwYXJhbWV0ZXJzLiAqLworCXNwaW5fbG9ja19pbml0KCAmKCBscC0+c2xvY2sgKSk7CisKKwkvKiBJbnRpYWxpemUgc3RhdGVzICovCisJLy9scC0+bG9ja2NvdW50ID0gMDsgLy9QRTFETk4KKyAgICAgICAgbHAtPmlzX2hhbmRsaW5nX2ludCA9IFdMX05PVF9IQU5ETElOR19JTlQ7CisJbHAtPmZpcm13YXJlX3ByZXNlbnQgPSBXTF9GUklNV0FSRV9OT1RfUFJFU0VOVDsKKworCWxwLT5kZXYgPSBkZXY7CisKKwlEQkdfUEFSQU0oIERiZ0luZm8sICJpcnFfbWFzayIsICIweCUwNHgiLCBpcnFfbWFzayAmIDB4MEZGRkYgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sICJpcnFfbGlzdCIsICIweCUwMnggMHglMDJ4IDB4JTAyeCAweCUwMngiLAorCQkJICAgaXJxX2xpc3RbMF0gJiAweDBGRiwgaXJxX2xpc3RbMV0gJiAweDBGRiwKKwkJCSAgIGlycV9saXN0WzJdICYgMHgwRkYsIGlycV9saXN0WzNdICYgMHgwRkYgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9ERVNJUkVEX1NTSUQsICJcIiVzXCIiLCBQQVJNX0RFU0lSRURfU1NJRCApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX09XTl9TU0lELCAiXCIlc1wiIiwgUEFSTV9PV05fU1NJRCApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX09XTl9DSEFOTkVMLCAiJWQiLCBQQVJNX09XTl9DSEFOTkVMKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9TWVNURU1fU0NBTEUsICIlZCIsIFBBUk1fU1lTVEVNX1NDQUxFICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfVFhfUkFURSwgIiVkIiwgUEFSTV9UWF9SQVRFICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRCwgIiVkIiwgUEFSTV9SVFNfVEhSRVNIT0xEICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfTUlDUk9XQVZFX1JPQlVTVE5FU1MsICJcIiVzXCIiLCBQQVJNX01JQ1JPV0FWRV9ST0JVU1RORVNTICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfT1dOX05BTUUsICJcIiVzXCIiLCBQQVJNX09XTl9OQU1FICk7CisvLzs/CQlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9FTkFCTEVfRU5DUllQVElPTiwgIlwiJXNcIiIsIFBBUk1fRU5BQkxFX0VOQ1JZUFRJT04gKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9LRVkxLCAiXCIlc1wiIiwgUEFSTV9LRVkxICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfS0VZMiwgIlwiJXNcIiIsIFBBUk1fS0VZMiApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX0tFWTMsICJcIiVzXCIiLCBQQVJNX0tFWTMgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9LRVk0LCAiXCIlc1wiIiwgUEFSTV9LRVk0ICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfVFhfS0VZLCAiJWQiLCBQQVJNX1RYX0tFWSApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX01VTFRJQ0FTVF9SQVRFLCAiJWQiLCBQQVJNX01VTFRJQ0FTVF9SQVRFICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfRE9XTkxPQURfRklSTVdBUkUsICJcIiVzXCIiLCBQQVJNX0RPV05MT0FEX0ZJUk1XQVJFICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfQVVUSF9LRVlfTUdNVF9TVUlURSwgIiVkIiwgUEFSTV9BVVRIX0tFWV9NR01UX1NVSVRFICk7CisvLzs/I2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9TVEEKKwkJCQkJLy87P3Nob3VsZCB3ZSBtYWtlIHRoaXMgY29kZSBjb25kaXRpb25hbCBkZXBlbmRpbmcgb24gaW4gU1RBIG1vZGUKKy8vOz8gICAgICAgIERCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1BPUlRfVFlQRSwgIiVkIiwgUEFSTV9QT1JUX1RZUEUgKTsKKwkJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUE1fRU5BQkxFRCwgIiUwNHgiLCBQQVJNX1BNX0VOQUJMRUQgKTsKKy8vOz8gICAgICAgIERCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX0NSRUFURV9JQlNTLCAiXCIlc1wiIiwgUEFSTV9DUkVBVEVfSUJTUyApOworLy87PyAgICAgICAgREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfTVVMVElDQVNUX1JYLCAiXCIlc1wiIiwgUEFSTV9NVUxUSUNBU1RfUlggKTsKKy8vOz8gICAgICAgIERCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX01BWF9TTEVFUCwgIiVkIiwgUEFSTV9NQVhfU0xFRVAgKTsKKy8vOz8gICAgICAgIERCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX05FVFdPUktfQUREUiwgIlwiJXNcIiIsIERiZ0h3QWRkciggUEFSTV9ORVRXT1JLX0FERFIgKSk7CisvLzs/ICAgICAgICBEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9BVVRIRU5USUNBVElPTiwgIiVkIiwgUEFSTV9BVVRIRU5USUNBVElPTiApOworLy87PyAgICAgICAgREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfT1dOX0FUSU1fV0lORE9XLCAiJWQiLCBQQVJNX09XTl9BVElNX1dJTkRPVyApOworLy87PyAgICAgICAgREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUE1fSE9MRE9WRVJfRFVSQVRJT04sICIlZCIsIFBBUk1fUE1fSE9MRE9WRVJfRFVSQVRJT04gKTsKKy8vOz8gICAgICAgIERCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1BST01JU0NVT1VTX01PREUsICJcIiVzXCIiLCBQQVJNX1BST01JU0NVT1VTX01PREUgKTsKKy8vOz8jZW5kaWYgLyogSENGX1NUQSAqLworI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAKKwkJLy87P3Nob3VsZCB3ZSByZXN0b3JlIHRoaXMgdG8gYWxsb3cgc21hbGxlciBtZW1vcnkgZm9vdHByaW50CisJCS8vOz9JIGd1ZXNzOiBubywgc2luY2UgdGhpcyBpcyBEZWJ1ZyBtb2RlIG9ubHkKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9PV05fRFRJTV9QRVJJT0QsICIlZCIsIFBBUk1fT1dOX0RUSU1fUEVSSU9EICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUkVKRUNUX0FOWSwgIlwiJXNcIiIsIFBBUk1fUkVKRUNUX0FOWSApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX0VYQ0xVREVfVU5FTkNSWVBURUQsICJcIiVzXCIiLCBQQVJNX0VYQ0xVREVfVU5FTkNSWVBURUQgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9NVUxUSUNBU1RfUE1fQlVGRkVSSU5HLCAiXCIlc1wiIiwgUEFSTV9NVUxUSUNBU1RfUE1fQlVGRkVSSU5HICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfSU5UUkFfQlNTX1JFTEFZLCAiXCIlc1wiIiwgUEFSTV9JTlRSQV9CU1NfUkVMQVkgKTsKKyNpZmRlZiBVU0VfV0RTCisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDEsICIlZCIsIFBBUk1fUlRTX1RIUkVTSE9MRDEgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMiwgIiVkIiwgUEFSTV9SVFNfVEhSRVNIT0xEMiApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQzLCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQzICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDQsICIlZCIsIFBBUk1fUlRTX1RIUkVTSE9MRDQgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENSwgIiVkIiwgUEFSTV9SVFNfVEhSRVNIT0xENSApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ2LCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQ2ICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfVFhfUkFURTEsICIlZCIsIFBBUk1fVFhfUkFURTEgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9UWF9SQVRFMiwgIiVkIiwgUEFSTV9UWF9SQVRFMiApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEUzLCAiJWQiLCBQQVJNX1RYX1JBVEUzICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfVFhfUkFURTQsICIlZCIsIFBBUk1fVFhfUkFURTQgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9UWF9SQVRFNSwgIiVkIiwgUEFSTV9UWF9SQVRFNSApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEU2LCAiJWQiLCBQQVJNX1RYX1JBVEU2ICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfV0RTX0FERFJFU1MxLCAiXCIlc1wiIiwgRGJnSHdBZGRyKCBQQVJNX1dEU19BRERSRVNTMSApKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9XRFNfQUREUkVTUzIsICJcIiVzXCIiLCBEYmdId0FkZHIoIFBBUk1fV0RTX0FERFJFU1MyICkpOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1dEU19BRERSRVNTMywgIlwiJXNcIiIsIERiZ0h3QWRkciggUEFSTV9XRFNfQUREUkVTUzMgKSk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfV0RTX0FERFJFU1M0LCAiXCIlc1wiIiwgRGJnSHdBZGRyKCBQQVJNX1dEU19BRERSRVNTNCApKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9XRFNfQUREUkVTUzUsICJcIiVzXCIiLCBEYmdId0FkZHIoIFBBUk1fV0RTX0FERFJFU1M1ICkpOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1dEU19BRERSRVNTNiwgIlwiJXNcIiIsIERiZ0h3QWRkciggUEFSTV9XRFNfQUREUkVTUzYgKSk7CisjZW5kaWYgLyogVVNFX1dEUyAqLworI2VuZGlmIC8qIEhDRl9BUCAqLworCisJVkFMSURfUEFSQU0oICFQQVJNX0RFU0lSRURfU1NJRCB8fCAoIHN0cmxlbiggUEFSTV9ERVNJUkVEX1NTSUQgKSA8PSBQQVJNX01BWF9OQU1FX0xFTiApKTsKKwlWQUxJRF9QQVJBTSggIVBBUk1fT1dOX1NTSUQgfHwgKCBzdHJsZW4oIFBBUk1fT1dOX1NTSUQgKSA8PSBQQVJNX01BWF9OQU1FX0xFTiApKTsKKwlWQUxJRF9QQVJBTSgoIFBBUk1fT1dOX0NIQU5ORUwgPD0gUEFSTV9NQVhfT1dOX0NIQU5ORUwgKSk7CisJVkFMSURfUEFSQU0oKCBQQVJNX1NZU1RFTV9TQ0FMRSA+PSBQQVJNX01JTl9TWVNURU1fU0NBTEUgKSAmJiAoIFBBUk1fU1lTVEVNX1NDQUxFIDw9IFBBUk1fTUFYX1NZU1RFTV9TQ0FMRSApKTsKKwlWQUxJRF9QQVJBTSgoIFBBUk1fVFhfUkFURSA+PSBQQVJNX01JTl9UWF9SQVRFICkgJiYgKCBQQVJNX1RYX1JBVEUgPD0gUEFSTV9NQVhfVFhfUkFURSApKTsKKwlWQUxJRF9QQVJBTSgoIFBBUk1fUlRTX1RIUkVTSE9MRCA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICkpOworCVZBTElEX1BBUkFNKCAhUEFSTV9NSUNST1dBVkVfUk9CVVNUTkVTUyB8fCBzdHJjaHIoICJObll5IiwgUEFSTV9NSUNST1dBVkVfUk9CVVNUTkVTU1swXSApICE9IE5VTEwgKTsKKwlWQUxJRF9QQVJBTSggIVBBUk1fT1dOX05BTUUgfHwgKCBzdHJsZW4oIFBBUk1fTkFNRV9PV05fTkFNRSApIDw9IFBBUk1fTUFYX05BTUVfTEVOICkpOworCVZBTElEX1BBUkFNKCggUEFSTV9FTkFCTEVfRU5DUllQVElPTiA8PSBQQVJNX01BWF9FTkFCTEVfRU5DUllQVElPTiApKTsKKwlWQUxJRF9QQVJBTSggaXNfdmFsaWRfa2V5X3N0cmluZyggUEFSTV9LRVkxICkpOworCVZBTElEX1BBUkFNKCBpc192YWxpZF9rZXlfc3RyaW5nKCBQQVJNX0tFWTIgKSk7CisJVkFMSURfUEFSQU0oIGlzX3ZhbGlkX2tleV9zdHJpbmcoIFBBUk1fS0VZMyApKTsKKwlWQUxJRF9QQVJBTSggaXNfdmFsaWRfa2V5X3N0cmluZyggUEFSTV9LRVk0ICkpOworCVZBTElEX1BBUkFNKCggUEFSTV9UWF9LRVkgPj0gUEFSTV9NSU5fVFhfS0VZICkgJiYgKCBQQVJNX1RYX0tFWSA8PSBQQVJNX01BWF9UWF9LRVkgKSk7CisKKwlWQUxJRF9QQVJBTSgoIFBBUk1fTVVMVElDQVNUX1JBVEUgPj0gUEFSTV9NSU5fTVVMVElDQVNUX1JBVEUgKSAmJgorCQkJCQkoIFBBUk1fTVVMVElDQVNUX1JBVEUgPD0gUEFSTV9NQVhfTVVMVElDQVNUX1JBVEUgKSk7CisKKwlWQUxJRF9QQVJBTSggIVBBUk1fRE9XTkxPQURfRklSTVdBUkUgfHwgKCBzdHJsZW4oIFBBUk1fRE9XTkxPQURfRklSTVdBUkUgKSA8PSAyNTUgLyo7PyovICkpOworCVZBTElEX1BBUkFNKCggUEFSTV9BVVRIX0tFWV9NR01UX1NVSVRFIDwgUEFSTV9NQVhfQVVUSF9LRVlfTUdNVF9TVUlURSApKTsKKworCVZBTElEX1BBUkFNKCAhUEFSTV9MT0FEX0JBTEFOQ0lORyB8fCBzdHJjaHIoICJObll5IiwgUEFSTV9MT0FEX0JBTEFOQ0lOR1swXSApICE9IE5VTEwgKTsKKwlWQUxJRF9QQVJBTSggIVBBUk1fTUVESVVNX0RJU1RSSUJVVElPTiB8fCBzdHJjaHIoICJObll5IiwgUEFSTV9NRURJVU1fRElTVFJJQlVUSU9OWzBdICkgIT0gTlVMTCApOworCVZBTElEX1BBUkFNKCggUEFSTV9UWF9QT1dfTEVWRUwgPD0gUEFSTV9NQVhfVFhfUE9XX0xFVkVMICkpOworCisgCVZBTElEX1BBUkFNKCggUEFSTV9QT1JUX1RZUEUgPj0gUEFSTV9NSU5fUE9SVF9UWVBFICkgJiYgKCBQQVJNX1BPUlRfVFlQRSA8PSBQQVJNX01BWF9QT1JUX1RZUEUgKSk7CisJVkFMSURfUEFSQU0oIFBBUk1fUE1fRU5BQkxFRCA8PSBXVkxBTl9QTV9TVEFURV9TVEFOREFSRCB8fAorCQkJCSAoIFBBUk1fUE1fRU5BQkxFRCAmIDB4N0ZGRiApIDw9IFdWTEFOX1BNX1NUQVRFX1NUQU5EQVJEICk7CisgCVZBTElEX1BBUkFNKCAhUEFSTV9DUkVBVEVfSUJTUyB8fCBzdHJjaHIoICJObll5IiwgUEFSTV9DUkVBVEVfSUJTU1swXSApICE9IE5VTEwgKTsKKyAJVkFMSURfUEFSQU0oICFQQVJNX01VTFRJQ0FTVF9SWCB8fCBzdHJjaHIoICJObll5IiwgUEFSTV9NVUxUSUNBU1RfUlhbMF0gKSAhPSBOVUxMICk7CisgCVZBTElEX1BBUkFNKCggUEFSTV9NQVhfU0xFRVAgPD0gUEFSTV9NQVhfTUFYX1BNX1NMRUVQICkpOworIAlWQUxJRF9QQVJBTSgoIFBBUk1fQVVUSEVOVElDQVRJT04gPD0gUEFSTV9NQVhfQVVUSEVOVElDQVRJT04gKSk7CisgCVZBTElEX1BBUkFNKCggUEFSTV9PV05fQVRJTV9XSU5ET1cgPD0gUEFSTV9NQVhfT1dOX0FUSU1fV0lORE9XICkpOworIAlWQUxJRF9QQVJBTSgoIFBBUk1fUE1fSE9MRE9WRVJfRFVSQVRJT04gPD0gUEFSTV9NQVhfUE1fSE9MRE9WRVJfRFVSQVRJT04gKSk7CisgCVZBTElEX1BBUkFNKCAhUEFSTV9QUk9NSVNDVU9VU19NT0RFIHx8IHN0cmNociggIk5uWXkiLCBQQVJNX1BST01JU0NVT1VTX01PREVbMF0gKSAhPSBOVUxMICk7CisJVkFMSURfUEFSQU0oKCBQQVJNX0NPTk5FQ1RJT05fQ09OVFJPTCA8PSBQQVJNX01BWF9DT05ORUNUSU9OX0NPTlRST0wgKSk7CisKKwlWQUxJRF9QQVJBTSgoIFBBUk1fT1dOX0RUSU1fUEVSSU9EID49IFBBUk1fTUlOX09XTl9EVElNX1BFUklPRCApKTsKKwlWQUxJRF9QQVJBTSggIVBBUk1fUkVKRUNUX0FOWSB8fCBzdHJjaHIoICJObll5IiwgUEFSTV9SRUpFQ1RfQU5ZWzBdICkgIT0gTlVMTCApOworCVZBTElEX1BBUkFNKCAhUEFSTV9FWENMVURFX1VORU5DUllQVEVEIHx8IHN0cmNociggIk5uWXkiLCBQQVJNX0VYQ0xVREVfVU5FTkNSWVBURURbMF0gKSAhPSBOVUxMICk7CisJVkFMSURfUEFSQU0oICFQQVJNX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkcgfHwgc3RyY2hyKCAiTm5ZeSIsIFBBUk1fTVVMVElDQVNUX1BNX0JVRkZFUklOR1swXSApICE9IE5VTEwgKTsKKwlWQUxJRF9QQVJBTSggIVBBUk1fSU5UUkFfQlNTX1JFTEFZIHx8IHN0cmNociggIk5uWXkiLCBQQVJNX0lOVFJBX0JTU19SRUxBWVswXSApICE9IE5VTEwgKTsKKyNpZmRlZiBVU0VfV0RTCisJVkFMSURfUEFSQU0oKCBQQVJNX1JUU19USFJFU0hPTEQxIDw9IFBBUk1fTUFYX1JUU19USFJFU0hPTEQgKSk7CisJVkFMSURfUEFSQU0oKCBQQVJNX1JUU19USFJFU0hPTEQyIDw9IFBBUk1fTUFYX1JUU19USFJFU0hPTEQgKSk7CisJVkFMSURfUEFSQU0oKCBQQVJNX1JUU19USFJFU0hPTEQzIDw9IFBBUk1fTUFYX1JUU19USFJFU0hPTEQgKSk7CisJVkFMSURfUEFSQU0oKCBQQVJNX1JUU19USFJFU0hPTEQ0IDw9IFBBUk1fTUFYX1JUU19USFJFU0hPTEQgKSk7CisJVkFMSURfUEFSQU0oKCBQQVJNX1JUU19USFJFU0hPTEQ1IDw9IFBBUk1fTUFYX1JUU19USFJFU0hPTEQgKSk7CisJVkFMSURfUEFSQU0oKCBQQVJNX1JUU19USFJFU0hPTEQ2IDw9IFBBUk1fTUFYX1JUU19USFJFU0hPTEQgKSk7CisJVkFMSURfUEFSQU0oKCBQQVJNX1RYX1JBVEUxID49IFBBUk1fTUlOX1RYX1JBVEUgKSAmJiAoUEFSTV9UWF9SQVRFMSA8PSBQQVJNX01BWF9UWF9SQVRFICkpOworCVZBTElEX1BBUkFNKCggUEFSTV9UWF9SQVRFMiA+PSBQQVJNX01JTl9UWF9SQVRFICkgJiYgKFBBUk1fVFhfUkFURTIgPD0gUEFSTV9NQVhfVFhfUkFURSApKTsKKwlWQUxJRF9QQVJBTSgoIFBBUk1fVFhfUkFURTMgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmIChQQVJNX1RYX1JBVEUzIDw9IFBBUk1fTUFYX1RYX1JBVEUgKSk7CisJVkFMSURfUEFSQU0oKCBQQVJNX1RYX1JBVEU0ID49IFBBUk1fTUlOX1RYX1JBVEUgKSAmJiAoUEFSTV9UWF9SQVRFNCA8PSBQQVJNX01BWF9UWF9SQVRFICkpOworCVZBTElEX1BBUkFNKCggUEFSTV9UWF9SQVRFNSA+PSBQQVJNX01JTl9UWF9SQVRFICkgJiYgKFBBUk1fVFhfUkFURTUgPD0gUEFSTV9NQVhfVFhfUkFURSApKTsKKwlWQUxJRF9QQVJBTSgoIFBBUk1fVFhfUkFURTYgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmIChQQVJNX1RYX1JBVEU2IDw9IFBBUk1fTUFYX1RYX1JBVEUgKSk7CisjZW5kaWYgLyogVVNFX1dEUyAqLworCisJVkFMSURfUEFSQU0oKCBQQVJNX09XTl9CRUFDT05fSU5URVJWQUwgPj0gUEFSTV9NSU5fT1dOX0JFQUNPTl9JTlRFUlZBTCApICYmICggUEFSTV9PV05fQkVBQ09OX0lOVEVSVkFMIDw9IFBBUk1fTUFYX09XTl9CRUFDT05fSU5URVJWQUwgKSk7CisJVkFMSURfUEFSQU0oKCBQQVJNX0NPRVhJU1RFTkNFIDw9IFBBUk1fQ09FWElTVEVOQ0UgKSk7CisKKwkvKiBTZXQgdGhlIGRyaXZlciBwYXJhbWV0ZXJzIGZyb20gdGhlIHBhc3NlZCBpbiBwYXJhbWV0ZXJzLiAqLworCisJLyogVEhFU0UgTU9EVUxFIFBBUkFNRVRFUlMgQVJFIFRPIEJFIERFUFJFQ0FURUQgSU4gRkFWT1IgT0YgQSBOQU1JTkcgQ09OVkVOVElPTgorCSAgIFdISUNIIElTIElOTElORSBXSVRIIFRIRSBGT1JUSENPTUlORyBXQVZFTEFOIEFQSSAqLworCisJLyogU1RBUlQgTkVXIFBBUkFNRVRFUlMgKi8KKworCWxwLT5DaGFubmVsICAgICAgICAgICAgID0gUEFSTV9PV05fQ0hBTk5FTDsKKwlscC0+RGlzdGFuY2VCZXR3ZWVuQVBzICA9IFBBUk1fU1lTVEVNX1NDQUxFOworCisJLyogTmVlZCB0byBkZXRlcm1pbmUgaG93IHRvIGhhbmRsZSB0aGUgbmV3IGJhbmRzIGZvciA1R0h6ICovCisJbHAtPlR4UmF0ZUNvbnRyb2xbMF0gICAgPSBQQVJNX0RFRkFVTFRfVFhfUkFURV8yR0haOworCWxwLT5UeFJhdGVDb250cm9sWzFdICAgID0gUEFSTV9ERUZBVUxUX1RYX1JBVEVfNUdIWjsKKworCWxwLT5SVFNUaHJlc2hvbGQgICAgICAgID0gUEFSTV9SVFNfVEhSRVNIT0xEOworCisJLyogTmVlZCB0byBkZXRlcm1pbmUgaG93IHRvIGhhbmRsZSB0aGUgbmV3IGJhbmRzIGZvciA1R0h6ICovCisJbHAtPk11bHRpY2FzdFJhdGVbMF0gICAgPSBQQVJNX0RFRkFVTFRfTVVMVElDQVNUX1JBVEVfMkdIWjsKKwlscC0+TXVsdGljYXN0UmF0ZVsxXSAgICA9IFBBUk1fREVGQVVMVF9NVUxUSUNBU1RfUkFURV81R0haOworCisJaWYgKCBzdHJjaHIoICJZeSIsIFBBUk1fTUlDUk9XQVZFX1JPQlVTVE5FU1NbMF0gKSAhPSBOVUxMICkgeworCQlscC0+TWljcm93YXZlUm9idXN0bmVzcyA9IDE7CisJfSBlbHNlIHsKKwkJbHAtPk1pY3Jvd2F2ZVJvYnVzdG5lc3MgPSAwOworCX0KKwlpZiAoIFBBUk1fREVTSVJFRF9TU0lEICYmICggc3RybGVuKCBQQVJNX0RFU0lSRURfU1NJRCApIDw9IEhDRl9NQVhfTkFNRV9MRU4gKSkgeworCQlzdHJjcHkoIGxwLT5OZXR3b3JrTmFtZSwgUEFSTV9ERVNJUkVEX1NTSUQgKTsKKwl9CisJaWYgKCBQQVJNX09XTl9TU0lEICYmICggc3RybGVuKCBQQVJNX09XTl9TU0lEICkgPD0gSENGX01BWF9OQU1FX0xFTiApKSB7CisJCXN0cmNweSggbHAtPk5ldHdvcmtOYW1lLCBQQVJNX09XTl9TU0lEICk7CisJfQorCWlmICggUEFSTV9PV05fTkFNRSAmJiAoIHN0cmxlbiggUEFSTV9PV05fTkFNRSApIDw9IEhDRl9NQVhfTkFNRV9MRU4gKSkgeworCQlzdHJjcHkoIGxwLT5TdGF0aW9uTmFtZSwgUEFSTV9PV05fTkFNRSApOworCX0KKwlscC0+RW5hYmxlRW5jcnlwdGlvbiA9IFBBUk1fRU5BQkxFX0VOQ1JZUFRJT047CisJaWYgKCBQQVJNX0tFWTEgJiYgKCBzdHJsZW4oIFBBUk1fS0VZMSApIDw9IE1BWF9LRVlfTEVOICkpIHsKKwkJc3RyY3B5KCBscC0+S2V5MSwgUEFSTV9LRVkxICk7CisJfQorCWlmICggUEFSTV9LRVkyICYmICggc3RybGVuKCBQQVJNX0tFWTIgKSA8PSBNQVhfS0VZX0xFTiApKSB7CisJCXN0cmNweSggbHAtPktleTIsIFBBUk1fS0VZMiApOworCX0KKwlpZiAoIFBBUk1fS0VZMyAmJiAoIHN0cmxlbiggUEFSTV9LRVkzICkgPD0gTUFYX0tFWV9MRU4gKSkgeworCQlzdHJjcHkoIGxwLT5LZXkzLCBQQVJNX0tFWTMgKTsKKwl9CisJaWYgKCBQQVJNX0tFWTQgJiYgKCBzdHJsZW4oIFBBUk1fS0VZNCApIDw9IE1BWF9LRVlfTEVOICkpIHsKKwkJc3RyY3B5KCBscC0+S2V5NCwgUEFSTV9LRVk0ICk7CisJfQorCisJbHAtPlRyYW5zbWl0S2V5SUQgPSBQQVJNX1RYX0tFWTsKKworCWtleV9zdHJpbmcya2V5KCBscC0+S2V5MSwgJihscC0+RGVmYXVsdEtleXMua2V5WzBdICkpOworCWtleV9zdHJpbmcya2V5KCBscC0+S2V5MiwgJihscC0+RGVmYXVsdEtleXMua2V5WzFdICkpOworCWtleV9zdHJpbmcya2V5KCBscC0+S2V5MywgJihscC0+RGVmYXVsdEtleXMua2V5WzJdICkpOworCWtleV9zdHJpbmcya2V5KCBscC0+S2V5NCwgJihscC0+RGVmYXVsdEtleXMua2V5WzNdICkpOworCisJbHAtPkRvd25sb2FkRmlybXdhcmUgPSAxIDsgLy87P3RvIGJlIHVwZ3JhZGVkIFBBUk1fRE9XTkxPQURfRklSTVdBUkU7CisJbHAtPkF1dGhLZXlNZ210U3VpdGUgPSBQQVJNX0FVVEhfS0VZX01HTVRfU1VJVEU7CisKKwlpZiAoIHN0cmNociggIll5IiwgUEFSTV9MT0FEX0JBTEFOQ0lOR1swXSApICE9IE5VTEwgKSB7CisJCWxwLT5sb2FkQmFsYW5jaW5nID0gMTsKKwl9IGVsc2UgeworCQlscC0+bG9hZEJhbGFuY2luZyA9IDA7CisJfQorCisJaWYgKCBzdHJjaHIoICJZeSIsIFBBUk1fTUVESVVNX0RJU1RSSUJVVElPTlswXSApICE9IE5VTEwgKSB7CisJCWxwLT5tZWRpdW1EaXN0cmlidXRpb24gPSAxOworCX0gZWxzZSB7CisJCWxwLT5tZWRpdW1EaXN0cmlidXRpb24gPSAwOworCX0KKworCWxwLT50eFBvd0xldmVsID0gUEFSTV9UWF9QT1dfTEVWRUw7CisKKwlscC0+c3JzY1swXSA9IFBBUk1fU1JTQ18yR0haOworCWxwLT5zcnNjWzFdID0gUEFSTV9TUlNDXzVHSFo7CisJbHAtPmJyc2NbMF0gPSBQQVJNX0JSU0NfMkdIWjsKKwlscC0+YnJzY1sxXSA9IFBBUk1fQlJTQ181R0haOworI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfU1RBCisvLzs/c2VlbXMgcmVhc29uYWJsZSB0aGF0IGV2ZW4gYW4gQVAtb25seSBkcml2ZXIgY291bGQgYWZmb3JkIHRoaXMgc21hbGwgYWRkaXRpb25hbCBmb290cHJpbnQKKwlscC0+UG9ydFR5cGUgICAgICAgICAgICA9IFBBUk1fUE9SVF9UWVBFOworCWxwLT5NYXhTbGVlcER1cmF0aW9uICAgID0gUEFSTV9NQVhfU0xFRVA7CisJbHAtPmF1dGhlbnRpY2F0aW9uICAgICAgPSBQQVJNX0FVVEhFTlRJQ0FUSU9OOworCWxwLT5hdGltV2luZG93ICAgICAgICAgID0gUEFSTV9PV05fQVRJTV9XSU5ET1c7CisJbHAtPmhvbGRvdmVyRHVyYXRpb24gICAgPSBQQVJNX1BNX0hPTERPVkVSX0RVUkFUSU9OOworCWxwLT5QTUVuYWJsZWQgICAgICAgICAgID0gUEFSTV9QTV9FTkFCTEVEOyAgLy87PworCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX0NSRUFURV9JQlNTWzBdICkgIT0gTlVMTCApIHsKKwkJbHAtPkNyZWF0ZUlCU1MgPSAxOworCX0gZWxzZSB7CisJCWxwLT5DcmVhdGVJQlNTID0gMDsKKwl9CisJaWYgKCBzdHJjaHIoICJObiIsIFBBUk1fTVVMVElDQVNUX1JYWzBdICkgIT0gTlVMTCApIHsKKwkJbHAtPk11bHRpY2FzdFJlY2VpdmUgPSAwOworCX0gZWxzZSB7CisJCWxwLT5NdWx0aWNhc3RSZWNlaXZlID0gMTsKKwl9CisJaWYgKCBzdHJjaHIoICJZeSIsIFBBUk1fUFJPTUlTQ1VPVVNfTU9ERVswXSApICE9IE5VTEwgKSB7CisJCWxwLT5wcm9taXNjdW91c01vZGUgPSAxOworCX0gZWxzZSB7CisJCWxwLT5wcm9taXNjdW91c01vZGUgPSAwOworCX0KKwlmb3IoIGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKyApIHsKKwkgICBscC0+TUFDQWRkcmVzc1tpXSA9IFBBUk1fTkVUV09SS19BRERSW2ldOworCX0KKworCWxwLT5jb25uZWN0aW9uQ29udHJvbCA9IFBBUk1fQ09OTkVDVElPTl9DT05UUk9MOworCisjZW5kaWYgLyogSENGX1NUQSAqLworI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAKKwkvLzs/c2hvdWxkIHdlIHJlc3RvcmUgdGhpcyB0byBhbGxvdyBzbWFsbGVyIG1lbW9yeSBmb290cHJpbnQKKwlscC0+RFRJTVBlcmlvZCA9IFBBUk1fT1dOX0RUSU1fUEVSSU9EOworCisJaWYgKCBzdHJjaHIoICJZeSIsIFBBUk1fUkVKRUNUX0FOWVswXSApICE9IE5VTEwgKSB7CisJCWxwLT5SZWplY3RBbnkgPSAxOworCX0gZWxzZSB7CisJCWxwLT5SZWplY3RBbnkgPSAwOworCX0KKwlpZiAoIHN0cmNociggIk5uIiwgUEFSTV9FWENMVURFX1VORU5DUllQVEVEWzBdICkgIT0gTlVMTCApIHsKKwkJbHAtPkV4Y2x1ZGVVbmVuY3J5cHRlZCA9IDA7CisJfSBlbHNlIHsKKwkJbHAtPkV4Y2x1ZGVVbmVuY3J5cHRlZCA9IDE7CisJfQorCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkdbMF0gKSAhPSBOVUxMICkgeworCQlscC0+bXVsdGljYXN0UE1CdWZmZXJpbmcgPSAxOworCX0gZWxzZSB7CisJCWxwLT5tdWx0aWNhc3RQTUJ1ZmZlcmluZyA9IDA7CisJfQorCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX0lOVFJBX0JTU19SRUxBWVswXSApICE9IE5VTEwgKSB7CisJCWxwLT5pbnRyYUJTU1JlbGF5ID0gMTsKKwl9IGVsc2UgeworCQlscC0+aW50cmFCU1NSZWxheSA9IDA7CisJfQorCisJbHAtPm93bkJlYWNvbkludGVydmFsID0gUEFSTV9PV05fQkVBQ09OX0lOVEVSVkFMOworCWxwLT5jb2V4aXN0ZW5jZSAgICAgICA9IFBBUk1fQ09FWElTVEVOQ0U7CisKKyNpZmRlZiBVU0VfV0RTCisJbHAtPndkc19wb3J0WzBdLnJ0c1RocmVzaG9sZCAgICA9IFBBUk1fUlRTX1RIUkVTSE9MRDE7CisJbHAtPndkc19wb3J0WzFdLnJ0c1RocmVzaG9sZCAgICA9IFBBUk1fUlRTX1RIUkVTSE9MRDI7CisJbHAtPndkc19wb3J0WzJdLnJ0c1RocmVzaG9sZCAgICA9IFBBUk1fUlRTX1RIUkVTSE9MRDM7CisJbHAtPndkc19wb3J0WzNdLnJ0c1RocmVzaG9sZCAgICA9IFBBUk1fUlRTX1RIUkVTSE9MRDQ7CisJbHAtPndkc19wb3J0WzRdLnJ0c1RocmVzaG9sZCAgICA9IFBBUk1fUlRTX1RIUkVTSE9MRDU7CisJbHAtPndkc19wb3J0WzVdLnJ0c1RocmVzaG9sZCAgICA9IFBBUk1fUlRTX1RIUkVTSE9MRDY7CisJbHAtPndkc19wb3J0WzBdLnR4UmF0ZUNudGwgICAgICA9IFBBUk1fVFhfUkFURTE7CisJbHAtPndkc19wb3J0WzFdLnR4UmF0ZUNudGwgICAgICA9IFBBUk1fVFhfUkFURTI7CisJbHAtPndkc19wb3J0WzJdLnR4UmF0ZUNudGwgICAgICA9IFBBUk1fVFhfUkFURTM7CisJbHAtPndkc19wb3J0WzNdLnR4UmF0ZUNudGwgICAgICA9IFBBUk1fVFhfUkFURTQ7CisJbHAtPndkc19wb3J0WzRdLnR4UmF0ZUNudGwgICAgICA9IFBBUk1fVFhfUkFURTU7CisJbHAtPndkc19wb3J0WzVdLnR4UmF0ZUNudGwgICAgICA9IFBBUk1fVFhfUkFURTY7CisKKwlmb3IoIGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKyApIHsKKwkJbHAtPndkc19wb3J0WzBdLndkc0FkZHJlc3NbaV0gPSBQQVJNX1dEU19BRERSRVNTMVtpXTsKKwl9CisJZm9yKCBpID0gMDsgaSA8IEVUSF9BTEVOOyBpKysgKSB7CisJCWxwLT53ZHNfcG9ydFsxXS53ZHNBZGRyZXNzW2ldID0gUEFSTV9XRFNfQUREUkVTUzJbaV07CisJfQorCWZvciggaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrICkgeworCQlscC0+d2RzX3BvcnRbMl0ud2RzQWRkcmVzc1tpXSA9IFBBUk1fV0RTX0FERFJFU1MzW2ldOworCX0KKwlmb3IoIGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKyApIHsKKwkJbHAtPndkc19wb3J0WzNdLndkc0FkZHJlc3NbaV0gPSBQQVJNX1dEU19BRERSRVNTNFtpXTsKKwl9CisJZm9yKCBpID0gMDsgaSA8IEVUSF9BTEVOOyBpKysgKSB7CisJCWxwLT53ZHNfcG9ydFs0XS53ZHNBZGRyZXNzW2ldID0gUEFSTV9XRFNfQUREUkVTUzVbaV07CisJfQorCWZvciggaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrICkgeworCQlscC0+d2RzX3BvcnRbNV0ud2RzQWRkcmVzc1tpXSA9IFBBUk1fV0RTX0FERFJFU1M2W2ldOworCX0KKyNlbmRpZiAgLyogVVNFX1dEUyAqLworI2VuZGlmICAvKiBIQ0ZfQVAgKi8KKyNpZmRlZiBVU0VfUlRTCisJaWYgKCBzdHJjaHIoICJZeSIsIHVzZVJUU1swXSApICE9IE5VTEwgKSB7CisJCWxwLT51c2VSVFMgPSAxOworCX0gZWxzZSB7CisJCWxwLT51c2VSVFMgPSAwOworCX0KKyNlbmRpZiAgLyogVVNFX1JUUyAqLworCisKKwkvKiBFTkQgTkVXIFBBUkFNRVRFUlMgKi8KKworCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisJLyogSW5pdGlhbGl6ZSB0aGUgcG9ydFN0YXRlIHZhcmlhYmxlICovCisJbHAtPnBvcnRTdGF0ZSA9IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQ7CisKKwkvKiBJbml0aWFsaXplIHRoZSBTY2FuUmVzdWx0IHN0cnVjdCAqLworCW1lbXNldCggJiggbHAtPnNjYW5fcmVzdWx0cyApLCAwLCBzaXplb2YoIGxwLT5zY2FuX3Jlc3VsdHMgKSk7CisJbHAtPnNjYW5fcmVzdWx0cy5zY2FuX2NvbXBsZXRlID0gRkFMU0U7CisKKwkvKiBJbml0aWFsaXplIHRoZSBQcm9iZVJlc3VsdCBzdHJ1Y3QgKi8KKwltZW1zZXQoICYoIGxwLT5wcm9iZV9yZXN1bHRzICksIDAsIHNpemVvZiggbHAtPnByb2JlX3Jlc3VsdHMgKSk7CisJbHAtPnByb2JlX3Jlc3VsdHMuc2Nhbl9jb21wbGV0ZSA9IEZBTFNFOworCWxwLT5wcm9iZV9udW1fYXBzID0gMDsKKworCisJLyogSW5pdGlhbGl6ZSBUeCBxdWV1ZSBzdHVmZiAqLworCW1lbXNldCggbHAtPnR4TGlzdCwgMCwgc2l6ZW9mKCBscC0+dHhMaXN0ICkpOworCisJSU5JVF9MSVNUX0hFQUQoICYoIGxwLT50eEZyZWUgKSk7CisKKwlscC0+dHhGLnNrYiAgPSBOVUxMOworCWxwLT50eEYucG9ydCA9IDA7CisKKworCWZvciggaSA9IDA7IGkgPCBERUZBVUxUX05VTV9UWF9GUkFNRVM7IGkrKyApIHsKKwkJbGlzdF9hZGRfdGFpbCggJiggbHAtPnR4TGlzdFtpXS5ub2RlICksICYoIGxwLT50eEZyZWUgKSk7CisJfQorCisKKwlmb3IoIGkgPSAwOyBpIDwgV1ZMQU5fTUFYX1RYX1FVRVVFUzsgaSsrICkgeworCQlJTklUX0xJU1RfSEVBRCggJiggbHAtPnR4UVtpXSApKTsKKwl9CisKKwlscC0+bmV0aWZfcXVldWVfb24gPSBUUlVFOworCWxwLT50eFFfY291bnQgPSAwOworCS8qIEluaXRpYWxpemUgdGhlIHVzZV9kbWEgZWxlbWVudCBpbiB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUuIE5vdCBzdXJlIGlmCisJICAgdGhpcyBzaG91bGQgYmUgYSBjb21waWxlLXRpbWUgb3IgcnVuLXRpbWUgY29uZmlndXJhYmxlLiBTbyBmb3Igbm93LAorCSAgIGltcGxlbWVudCBhcyBydW4tdGltZSBhbmQganVzdCBkZWZpbmUgaGVyZSAqLworI2lmZGVmIFdBUlAKKyNpZmRlZiBFTkFCTEVfRE1BCisJREJHX1RSQUNFKCBEYmdJbmZvLCAiSEVSTUVTIDIuNSBCVVNNQVNURVIgRE1BIE1PREVcbiIgKTsKKwlscC0+dXNlX2RtYSA9IDE7CisjZWxzZQorCURCR19UUkFDRSggRGJnSW5mbywgIkhFUk1FUyAyLjUgUE9SVCBJL08gTU9ERVxuIiApOworCWxwLT51c2VfZG1hID0gMDsKKyNlbmRpZiAvLyBFTkFCTEVfRE1BCisjZW5kaWYgLy8gV0FSUAorCisJLyogUmVnaXN0ZXIgdGhlIElTUiBoYW5kbGVyIGluZm9ybWF0aW9uIGhlcmUsIHNvIHRoYXQgaXQncyBub3QgZG9uZQorCSAgIHJlcGVhdGVkbHkgaW4gdGhlIElTUiAqLworICAgICAgICB0YXNrbGV0X2luaXQoJmxwLT50YXNrLCB3bF9pc3JfaGFuZGxlciwgKHVuc2lnbmVkIGxvbmcpbHApOworCisgICAgICAgIC8qIENvbm5lY3QgdG8gdGhlIGFkYXB0ZXIgKi8KKyAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiQ2FsbGluZyBoY2ZfY29ubmVjdCgpLi4uXG4iICk7CisgICAgICAgIGhjZl9zdGF0dXMgPSBoY2ZfY29ubmVjdCggJmxwLT5oY2ZDdHgsIGRldi0+YmFzZV9hZGRyICk7CisJLy9IQ0ZfRVJSX0lOQ09NUF9GVyBpcyBhY2NlcHRhYmxlLCBiZWNhdXNlIGRvd25sb2FkIG11c3Qgc3RpbGwgdGFrZSBwbGFjZQorCS8vSENGX0VSUl9JTkNPTVBfUFJJIGlzIG5vdCBhY2NlcHRhYmxlCisJaWYgKCBoY2Zfc3RhdHVzICE9IEhDRl9TVUNDRVNTICYmIGhjZl9zdGF0dXMgIT0gSENGX0VSUl9JTkNPTVBfRlcgKSB7CisJCURCR19FUlJPUiggRGJnSW5mbywgImhjZl9jb25uZWN0KCkgZmFpbGVkLCBzdGF0dXM6IDB4JXhcbiIsIGhjZl9zdGF0dXMgKTsKKwkJd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisJCWdvdG8gaGNmX2ZhaWxlZDsKKwl9CisKKwkvLzs/c2hvdWxkIHNldCBIQ0ZfdmVyc2lvbiBhbmQgaG93IGFib3V0IGRyaXZlcl9zdGF0CisJbHAtPmRyaXZlckluZm8uSU9fYWRkcmVzcyAgICAgICA9IGRldi0+YmFzZV9hZGRyOworCWxwLT5kcml2ZXJJbmZvLklPX3JhbmdlICAgICAgICAgPSBIQ0ZfTlVNX0lPX1BPUlRTOwkvLzs/Y29uZGl0aW9uYWxseSAweDQwIG9yIDB4ODAgc2VlbXMgYmV0dGVyCisJbHAtPmRyaXZlckluZm8uSVJRX251bWJlciAgICAgICA9IGRldi0+aXJxOworCWxwLT5kcml2ZXJJbmZvLmNhcmRfc3RhdCAgICAgICAgPSBscC0+aGNmQ3R4LklGQl9DYXJkU3RhdDsKKwkvLzs/IHdoYXQgaGFwcGVuZWQgdG8gZnJhbWVfdHlwZQorCisJLyogRmlsbCBpbiB0aGUgZHJpdmVyIGlkZW50aXR5IHN0cnVjdHVyZSAqLworCWxwLT5kcml2ZXJJZGVudGl0eS5sZW4gICAgICAgICAgICAgID0gKCBzaXplb2YoIGxwLT5kcml2ZXJJZGVudGl0eSApIC8gc2l6ZW9mKCBoY2ZfMTYgKSkgLSAxOworCWxwLT5kcml2ZXJJZGVudGl0eS50eXAgICAgICAgICAgICAgID0gQ0ZHX0RSVl9JREVOVElUWTsKKwlscC0+ZHJpdmVySWRlbnRpdHkuY29tcF9pZCAgICAgICAgICA9IERSVl9JREVOVElUWTsKKwlscC0+ZHJpdmVySWRlbnRpdHkudmFyaWFudCAgICAgICAgICA9IERSVl9WQVJJQU5UOworCWxwLT5kcml2ZXJJZGVudGl0eS52ZXJzaW9uX21ham9yICAgID0gRFJWX01BSk9SX1ZFUlNJT047CisJbHAtPmRyaXZlcklkZW50aXR5LnZlcnNpb25fbWlub3IgICAgPSBEUlZfTUlOT1JfVkVSU0lPTjsKKworCisJLyogU3RhcnQgdGhlIGNhcmQgaGVyZSAtIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBpbiBvcmRlciB0byBnZXQgdGhlCisJICAgTUFDIGFkZHJlc3MgZm9yIHRoZSBuZXR3b3JrIGxheWVyICovCisJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ2FsbGluZyB3dmxhbl9nbygpIHRvIHBlcmZvcm0gYSBjYXJkIHJlc2V0Li4uXG4iICk7CisJaGNmX3N0YXR1cyA9IHdsX2dvKCBscCApOworCisJaWYgKCBoY2Zfc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgeworCQlEQkdfRVJST1IoIERiZ0luZm8sICJ3bF9nbygpIGZhaWxlZFxuIiApOworCQl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKwkJZ290byBoY2ZfZmFpbGVkOworCX0KKworCS8qIENlcnRhaW4gUklEcyBtdXN0IGJlIHNldCBiZWZvcmUgZW5hYmxpbmcgdGhlIHBvcnRzICovCisJd2xfcHV0X2x0dl9pbml0KCBscCApOworCisjaWYgMCAvLzs/d2h5IHdhcyB0aGlzIGFscmVhZHkgY29tbWVudGVkIG91dCBpbiB3bF9sa21fNzIwCisJLyogRW5hYmxlIHRoZSBwb3J0cyAqLworCWlmICggd2xfYWRhcHRlcl9pc19vcGVuKCBscC0+ZGV2ICkpIHsKKwkJLyogRW5hYmxlIHRoZSBwb3J0cyAqLworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJFbmFibGluZyBQb3J0IDBcbiIgKTsKKwkJaGNmX3N0YXR1cyA9IHdsX2VuYWJsZSggbHAgKTsKKworCQlpZiAoIGhjZl9zdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJFbmFibGUgcG9ydCAwIGZhaWxlZDogMHgleFxuIiwgaGNmX3N0YXR1cyApOworCQl9CisKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiRW5hYmxpbmcgV0RTIFBvcnRzXG4iICk7CisJCS8vd2xfZW5hYmxlX3dkc19wb3J0cyggbHAgKTsKKyNlbmRpZiAgLyogKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQICovCisKKwl9CisjZW5kaWYKKworCS8qIEZpbGwgb3V0IHRoZSBNQUMgYWRkcmVzcyBpbmZvcm1hdGlvbiBpbiB0aGUgbmV0X2RldmljZSBzdHJ1Y3QgKi8KKwltZW1jcHkoIGxwLT5kZXYtPmRldl9hZGRyLCBscC0+TUFDQWRkcmVzcywgRVRIX0FMRU4gKTsKKwlkZXYtPmFkZHJfbGVuID0gRVRIX0FMRU47CisKKwlscC0+aXNfcmVnaXN0ZXJlZCA9IFRSVUU7CisKKyNpZmRlZiBVU0VfUFJPRklMRQorCS8qIFBhcnNlIHRoZSBjb25maWcgZmlsZSBmb3IgdGhlIHNha2Ugb2YgY3JlYXRpbmcgV0RTIHBvcnRzIGlmIFdEUyBpcworCSAgIGNvbmZpZ3VyZWQgdGhlcmUgYnV0IG5vdCBpbiB0aGUgbW9kdWxlIG9wdGlvbnMgKi8KKwlwYXJzZV9jb25maWcoIGRldiApOworI2VuZGlmICAvKiBVU0VfUFJPRklMRSAqLworCisJLyogSWYgd2UncmUgZ29pbmcgaW50byBBUCBNb2RlLCByZWdpc3RlciB0aGUgInZpcnR1YWwiIGV0aGVybmV0IGRldmljZXMKKwkgICBuZWVkZWQgZm9yIFdEUyAqLworCVdMX1dEU19ORVRERVZfUkVHSVNURVIoIGxwICk7CisKKwkvKiBSZXNldCB0aGUgRG93bmxvYWRGaXJtd2FyZSB2YXJpYWJsZSBpbiB0aGUgcHJpdmF0ZSBzdHJ1Y3QuIElmIHRoZQorCSAgIGNvbmZpZyBmaWxlIGlzIG5vdCB1c2VkLCB0aGlzIHdpbGwgbm90IG1hdHRlcjsgaWYgaXQgaXMgdXNlZCwgaXQKKwkgICB3aWxsIGJlIHJlcGFyc2VkIGluIHdsX29wZW4oKS4gVGhpcyBpcyBkb25lIGJlY2F1c2UgbG9naWMgaW4gd2xfb3BlbgorCSAgIHVzZWQgdG8gY2hlY2sgaWYgYSBmaXJtd2FyZSBkb3dubG9hZCBpcyBuZWVkZWQgaXMgYnJva2VuIGJ5IHBhcnNpbmcKKwkgICB0aGUgZmlsZSBoZXJlOyBob3dldmVyLCB0aGlzIHBhcnNpbmcgaXMgbmVlZGVkIHRvIHJlZ2lzdGVyIFdEUyBwb3J0cworCSAgIGluIEFQIG1vZGUsIGlmIHRoZXkgYXJlIGNvbmZpZ3VyZWQgKi8KKwlscC0+RG93bmxvYWRGaXJtd2FyZSA9IFdWTEFOX0RSVl9NT0RFX1NUQTsgLy87P2Rvd25sb2FkX2Zpcm13YXJlOworCisjaWZkZWYgVVNFX1JUUworCWlmICggbHAtPnVzZVJUUyA9PSAxICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJFTlRFUklORyBSVFMgTU9ERS4uLlxuIiApOworICAgICAgICAgICAgICAgIHdsX2FjdF9pbnRfb2ZmKCBscCApOworICAgICAgICAgICAgICAgIGxwLT5pc19oYW5kbGluZ19pbnQgPSBXTF9OT1RfSEFORExJTkdfSU5UOyAvLyBOb3QgaGFuZGxpbmcgaW50ZXJydXB0cyBhbnltb3JlCisKKwkJd2xfZGlzYWJsZSggbHAgKTsKKworICAgICAgICAJaGNmX2Nvbm5lY3QoICZscC0+aGNmQ3R4LCBIQ0ZfRElTQ09OTkVDVCk7CisJfQorI2VuZGlmICAvKiBVU0VfUlRTICovCisKKwl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKworCURCR19UUkFDRSggRGJnSW5mbywgIiVzOiBXaXJlbGVzcywgaW9fYWRkciAlIzAzbHgsIGlycSAlZCwgIiJtYWNfYWRkcmVzcyAiLAorCQkJICAgZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEgKTsKKworCWZvciggaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrICkgeworCQlwcmludGsoICIlMDJYJWMiLCBkZXYtPmRldl9hZGRyW2ldLCAoKCBpIDwgKCBFVEhfQUxFTi0xICkpID8gJzonIDogJ1xuJyApKTsKKwl9CisKKyNpZiAwIC8vU0NVTExfVVNFX1BST0MgLyogZG9uJ3Qgd2FzdGUgc3BhY2UgaWYgdW51c2VkICovCisJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSggIndsYWdzIiwgMCwgTlVMTCwgc2N1bGxfcmVhZF9wcm9jbWVtLCBkZXYgKTsKKwlwcm9jX21rZGlyKCJkcml2ZXIvd2xhZ3M0OSIsIDApOworCXByb2Nfd3JpdGUoImRyaXZlci93bGFnczQ5L3dsYWdzNDlfdHlwZSIsIHdyaXRlX2ludCwgJmxwLT53bGFnczQ5X3R5cGUpOworI2VuZGlmIC8qIFNDVUxMX1VTRV9QUk9DICovCisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmVzdWx0OworCitoY2ZfZmFpbGVkOgorCXdsX2hjZl9lcnJvciggZGV2LCBoY2Zfc3RhdHVzICk7CisKK2ZhaWxlZDoKKworCURCR19FUlJPUiggRGJnSW5mbywgIndsX2luc2VydCgpIEZBSUxFRFxuIiApOworCisJaWYgKCBscC0+aXNfcmVnaXN0ZXJlZCA9PSBUUlVFICkgeworCQlscC0+aXNfcmVnaXN0ZXJlZCA9IEZBTFNFOworCX0KKworCVdMX1dEU19ORVRERVZfREVSRUdJU1RFUiggbHAgKTsKKworCXJlc3VsdCA9IC1FRkFVTFQ7CisKKworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXN1bHQ7Cit9IC8vIHdsX2luc2VydAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcmVzZXQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBSZXNldCB0aGUgYWRhcHRlci4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgbmV0X2RldmljZSBzdHJ1Y3Qgb2YgdGhlIHdpcmVsZXNzIGRldmljZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgYW4gSENGIHN0YXR1cyBjb2RlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB3bF9wcml2YXRlICAqbHAgPSB3bF9wcml2KGRldik7CisJaW50ICAgICAgICAgICAgICAgICBoY2Zfc3RhdHVzID0gSENGX1NVQ0NFU1M7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCURCR19GVU5DKCAid2xfcmVzZXQiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2ICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCAiZGV2LT5iYXNlX2FkZHIiLCAiKCUjMDNseCkiLCBkZXYtPmJhc2VfYWRkciApOworCisJLyoKKyAgICAgICAgICogVGhlIGNhbGxlciBzaG91bGQgYWxyZWFkeSBoYXZlIGEgbG9jayBhbmQKKyAgICAgICAgICogZGlzYWJsZSB0aGUgaW50ZXJydXB0cywgd2UgZG8gbm90IGxvY2sgaGVyZSwKKyAgICAgICAgICogbm9yIGRvIHdlIGVuYWJsZS9kaXNhYmxlIGludGVycnVwdHMhCisgICAgICAgICAqLworCisJREJHX1RSQUNFKCBEYmdJbmZvLCAiRGV2aWNlIEJhc2UgQWRkcmVzczogJSMwM2x4XG4iLCBkZXYtPmJhc2VfYWRkciApOworCWlmICggZGV2LT5iYXNlX2FkZHIgKSB7CisJCS8qIFNodXRkb3duIHRoZSBhZGFwdGVyLiAqLworCQloY2ZfY29ubmVjdCggJmxwLT5oY2ZDdHgsIEhDRl9ESVNDT05ORUNUICk7CisKKwkJLyogUmVzZXQgdGhlIGRyaXZlciBpbmZvcm1hdGlvbi4gKi8KKwkJbHAtPnR4Qnl0ZXMgPSAwOworCisJCS8qIENvbm5lY3QgdG8gdGhlIGFkYXB0ZXIuICovCisgICAgICAgIAloY2Zfc3RhdHVzID0gaGNmX2Nvbm5lY3QoICZscC0+aGNmQ3R4LCBkZXYtPmJhc2VfYWRkciApOworCQlpZiAoIGhjZl9zdGF0dXMgIT0gSENGX1NVQ0NFU1MgJiYgaGNmX3N0YXR1cyAhPSBIQ0ZfRVJSX0lOQ09NUF9GVyApIHsKKwkJCURCR19FUlJPUiggRGJnSW5mbywgImhjZl9jb25uZWN0KCkgZmFpbGVkLCBzdGF0dXM6IDB4JXhcbiIsIGhjZl9zdGF0dXMgKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogQ2hlY2sgaWYgZmlybXdhcmUgaXMgcHJlc2VudCwgaWYgbm90IGNoYW5nZSBzdGF0ZSAqLworCQlpZiAoIGhjZl9zdGF0dXMgPT0gSENGX0VSUl9JTkNPTVBfRlcgKSB7CisJCQlscC0+ZmlybXdhcmVfcHJlc2VudCA9IFdMX0ZSSU1XQVJFX05PVF9QUkVTRU5UOworCQl9CisKKwkJLyogSW5pdGlhbGl6ZSB0aGUgcG9ydFN0YXRlIHZhcmlhYmxlICovCisJCWxwLT5wb3J0U3RhdGUgPSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEOworCisJCS8qIFJlc3RhcnQgdGhlIGFkYXB0ZXIuICovCisJCWhjZl9zdGF0dXMgPSB3bF9nbyggbHAgKTsKKwkJaWYgKCBoY2Zfc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgeworCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAid2xfZ28oKSBmYWlsZWQsIHN0YXR1czogMHgleFxuIiwgaGNmX3N0YXR1cyApOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKiBDZXJ0YWluIFJJRHMgbXVzdCBiZSBzZXQgYmVmb3JlIGVuYWJsaW5nIHRoZSBwb3J0cyAqLworCQl3bF9wdXRfbHR2X2luaXQoIGxwICk7CisJfSBlbHNlIHsKKwkJREJHX0VSUk9SKCBEYmdJbmZvLCAiRGV2aWNlIEJhc2UgQWRkcmVzcyBJTlZBTElEISEhXG4iICk7CisJfQorCitvdXQ6CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIGhjZl9zdGF0dXM7Cit9IC8vIHdsX3Jlc2V0CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9nbygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFJlc2V0IHRoZSBhZGFwdGVyLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBuZXRfZGV2aWNlIHN0cnVjdCBvZiB0aGUgd2lyZWxlc3MgZGV2aWNlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBhbiBIQ0Ygc3RhdHVzIGNvZGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX2dvKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworCWludCAgCWhjZl9zdGF0dXMgPSBIQ0ZfU1VDQ0VTUzsKKwljaGFyCSpjcCA9IE5VTEw7CQkJLy9md19pbWFnZQorCWludAlyZXRyaWVzID0gMDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJREJHX0ZVTkMoICJ3bF9nbyIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWhjZl9zdGF0dXMgPSB3bF9kaXNhYmxlKCBscCApOworCWlmICggaGNmX3N0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiRGlzYWJsZSBwb3J0IDAgZmFpbGVkOiAweCV4XG4iLCBoY2Zfc3RhdHVzICk7CisKKwkJd2hpbGUgKCggaGNmX3N0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApICYmIChyZXRyaWVzIDwgMTApKSB7CisJCQlyZXRyaWVzKys7CisJCQloY2Zfc3RhdHVzID0gd2xfZGlzYWJsZSggbHAgKTsKKwkJfQorCQlpZiAoIGhjZl9zdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJEaXNhYmxlIHBvcnQgMCBzdWNjZXMgOiAlZCByZXRyaWVzXG4iLCByZXRyaWVzICk7CisJCX0gZWxzZSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJEaXNhYmxlIHBvcnQgMCBmYWlsZWQgYWZ0ZXI6ICVkIHJldHJpZXNcbiIsIHJldHJpZXMgKTsKKwkJfQorCX0KKworI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAKKwkvL0RCR19UUkFDRSggRGJnSW5mbywgIkRpc2FibGluZyBXRFMgUG9ydHNcbiIgKTsKKwkvL3dsX2Rpc2FibGVfd2RzX3BvcnRzKCBscCApOworI2VuZGlmICAvKiAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAgKi8KKworLy87P3doYXQgd2FzIHRoZSBwdXJwb3NlIG9mIHRoaXMKKy8vIAkvKiBsb2FkIHRoZSBhcHByb3ByaWF0ZSBmaXJtd2FyZSBpbWFnZSwgZGVwZW5kaW5nIG9uIGRyaXZlciBtb2RlICovCisvLyAJbHAtPmx0dlJlY29yZC5sZW4gICA9ICggc2l6ZW9mKCBDRkdfUkFOR0UyMF9TVFJDVCApIC8gc2l6ZW9mKCBoY2ZfMTYgKSkgLSAxOworLy8gCWxwLT5sdHZSZWNvcmQudHlwICAgPSBDRkdfRFJWX0FDVF9SQU5HRVNfUFJJOworLy8gCWhjZl9nZXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKyNpZiBCSU5fREwKKwlpZiAoIHN0cmxlbiggbHAtPmZ3X2ltYWdlX2ZpbGVuYW1lICkgKSB7CittbV9zZWdtZW50X3QJZnM7CitpbnQJCSAgICAJZmlsZV9kZXNjOworaW50IAkJCXJjOworCisJCURCR19UUkFDRSggRGJnSW5mbywgIkYvVyBpbWFnZTolczpcbiIsIGxwLT5md19pbWFnZV9maWxlbmFtZSApOworCQkvKiBPYnRhaW4gYSB1c2VyLXNwYWNlIHByb2Nlc3MgY29udGV4dCwgc3RvcmluZyB0aGUgb3JpZ2luYWwgY29udGV4dCAqLworCQlmcyA9IGdldF9mcyggKTsKKwkJc2V0X2ZzKCBnZXRfZHMoICkpOworCQlmaWxlX2Rlc2MgPSBvcGVuKCBscC0+ZndfaW1hZ2VfZmlsZW5hbWUsIE9fUkRPTkxZLCAwICk7CisJCWlmICggZmlsZV9kZXNjID09IC0xICkgeworCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiTm8gaW1hZ2UgZmlsZSBmb3VuZFxuIiApOworCQl9IGVsc2UgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiRi9XIGltYWdlIGZpbGUgZm91bmRcbiIgKTsKKyNkZWZpbmUgREhGX0FMTE9DX1NJWkUgOTYwMDAJCQkvL2p1c3QgYmVsb3cgOTZLLCBsZXQncyBob3BlIGl0IHN1ZmZpY2VzIGZvciBub3cgYW5kIGZvciB0aGUgZnV0dXJlCisJCQljcCA9IChjaGFyKil2bWFsbG9jKCBESEZfQUxMT0NfU0laRSApOworCQkJaWYgKCBjcCA9PSBOVUxMICkgeworCQkJCURCR19FUlJPUiggRGJnSW5mbywgImVycm9yIGluIHZtYWxsb2NcbiIgKTsKKwkJCX0gZWxzZSB7CisJCQkJcmMgPSByZWFkKCBmaWxlX2Rlc2MsIGNwLCBESEZfQUxMT0NfU0laRSApOworCQkJCWlmICggcmMgPT0gREhGX0FMTE9DX1NJWkUgKSB7CisJCQkJCURCR19FUlJPUiggRGJnSW5mbywgImJ1ZmZlciB0b28gc21hbGwsICVkXG4iLCBESEZfQUxMT0NfU0laRSApOworCQkJCX0gZWxzZSBpZiAoIHJjID4gMCApIHsKKwkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAicmVhZCBPLksuOiAlZCBieXRlcyAgJS4xMnNcbiIsIHJjLCBjcCApOworCQkJCQlyYyA9IHJlYWQoIGZpbGVfZGVzYywgJmNwW3JjXSwgMSApOworCQkJCQlpZiAoIHJjID09IDAgKSB7IC8vOy9jaGFuZ2UgdG8gYW4gdW50aWwtbG9vcCBhdCByYzw9MAorCQkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAibm8gbW9yZSB0byByZWFkXG4iICk7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKCByYyAhPSAwICkgeworCQkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJmaWxlIG5vdCByZWFkIGluIG9uZSBzd29vcCBvciBvdGhlciBlcnJvciJcCisJCQkJCQkJCQkJIiwgZ2l2ZSB1cCwgdG9vIGNvbXBsaWNhdGVkLCByYyA9ICUwWFxuIiwgcmMgKTsKKwkJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAic3RpbGwgaGF2ZSB0byBjaGFuZ2UgY29kZSB0byBnZXQgYSByZWFsIGRvd25sb2FkIG5vdyAhISEhISEhIVxuIiApOworCQkJCX0gZWxzZSB7CisJCQkJCURCR19UUkFDRSggRGJnSW5mbywgImJlZm9yZSBkaGZfZG93bmxvYWRfYmluYXJ5XG4iICk7CisJCQkJCWhjZl9zdGF0dXMgPSBkaGZfZG93bmxvYWRfYmluYXJ5KCAobWVtaW1hZ2UgKiljcCApOworCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJhZnRlciBkaGZfZG93bmxvYWRfYmluYXJ5LCBiZWZvcmUgZGhmX2Rvd25sb2FkX2Z3XG4iICk7CisJCQkJCS8vOz9pbXByb3ZlIGVycm9yIGZsb3cvaGFuZGxpbmcKKwkJCQkJaGNmX3N0YXR1cyA9IGRoZl9kb3dubG9hZF9mdyggJmxwLT5oY2ZDdHgsIChtZW1pbWFnZSAqKWNwICk7CisJCQkJCURCR19UUkFDRSggRGJnSW5mbywgImFmdGVyIGRoZl9kb3dubG9hZF9md1xuIiApOworCQkJCX0KKwkJCQl2ZnJlZSggY3AgKTsKKwkJCX0KKwkJCWNsb3NlKCBmaWxlX2Rlc2MgKTsKKwkJfQorCQlzZXRfZnMoIGZzICk7CQkJLyogUmV0dXJuIHRvIHRoZSBvcmlnaW5hbCBjb250ZXh0ICovCisJfQorI2VuZGlmIC8vIEJJTl9ETAorCisJLyogSWYgZmlybXdhcmUgaXMgcHJlc2VudCBidXQgdGhlIHR5cGUgaXMgdW5rbm93biB0aGVuIGRvd25sb2FkIGFueXdheSAqLworCWlmICggKGxwLT5maXJtd2FyZV9wcmVzZW50ID09IFdMX0ZSSU1XQVJFX1BSRVNFTlQpCisJICAgICAmJgorCSAgICAgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgIT0gQ09NUF9JRF9GV19TVEEgKQorCSAgICAgJiYKKwkgICAgICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApICE9IENPTVBfSURfRldfQVAgKSApIHsKKwkJLyogVW5rbm93biB0eXBlLCBkb3dubG9hZCBuZWVkZWQuICAqLworCQlscC0+ZmlybXdhcmVfcHJlc2VudCA9IFdMX0ZSSU1XQVJFX05PVF9QUkVTRU5UOworCX0KKworCWlmKGxwLT5maXJtd2FyZV9wcmVzZW50ID09IFdMX0ZSSU1XQVJFX05PVF9QUkVTRU5UKQorCXsKKwkJaWYgKCBjcCA9PSBOVUxMICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiRG93bmxvYWRpbmcgU1RBIGZpcm13YXJlLi4uXG4iICk7CisvLwkJCWhjZl9zdGF0dXMgPSBkaGZfZG93bmxvYWRfZncoICZscC0+aGNmQ3R4LCAmc3RhdGlvbiApOworCQkJaGNmX3N0YXR1cyA9IGRoZl9kb3dubG9hZF9mdyggJmxwLT5oY2ZDdHgsICZmd19pbWFnZSApOworCQl9CisJCWlmICggaGNmX3N0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApIHsKKwkJCURCR19FUlJPUiggRGJnSW5mbywgIkZpcm13YXJlIERvd25sb2FkIGZhaWxlZFxuIiApOworCQkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCQlyZXR1cm4gaGNmX3N0YXR1czsKKwkJfQorCX0KKwkvKiBSZXBvcnQgdGhlIEZXIHZlcnNpb25zICovCisJLy87P29ic29sZXRlLCB1c2UgdGhlIGF2YWlsYWJsZSBJRkIgaW5mbzo6IHdsX2dldF9wcmlfcmVjb3JkcyggbHAgKTsKKwlpZiAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX1NUQSAgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgImRvd25sb2FkZWQgc3RhdGlvbiBGL1dcbiIgKTsKKwl9IGVsc2UgaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19BUCAgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgImRvd25sb2FkZWQgQVAgRi9XXG4iICk7CisJfSBlbHNlIHsKKwkJREJHX0VSUk9SKCBEYmdJbmZvLCAidW5rbm93biBGL1cgdHlwZVxuIiApOworCX0KKworCS8qCisgICAgICAgICAqIERvd25sb2FkZWQsIG5vIG5lZWQgdG8gcmVwZWF0IHRoaXMgbmV4dCB0aW1lLCBhc3N1bWUgdGhlCisgICAgICAgICAqIGNvbnRlbnRzIHN0YXlzIGluIHRoZSBjYXJkIHVudGlsIGl0IGlzIHBvd2VyZWQgb2ZmLiBOb3RlIHdlCisgICAgICAgICAqIGRvIG5vdCBzd2l0Y2ggZmlybXdhcmUgb24gdGhlIGZseSwgdGhlIGZpcm13YXJlIGlzIGZpeGVkIGluCisgICAgICAgICAqIHRoZSBkcml2ZXIgZm9yIG5vdy4KKyAgICAgICAgICovCisJbHAtPmZpcm13YXJlX3ByZXNlbnQgPSBXTF9GUklNV0FSRV9QUkVTRU5UOworCisJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ29tcG9uZW50SUQ6JTA0eCB2YXJpYW50OiUwNHggbWFqb3I6JTA0eCBtaW5vcjolMDR4XG4iLAorCQkJCUNOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSwKKwkJCQlDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS52YXJpYW50ICksCisJCQkJQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkudmVyc2lvbl9tYWpvciApLAorCQkJCUNOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LnZlcnNpb25fbWlub3IgKSk7CisKKwkvKiBub3cgd2Ugd2lsIGdldCB0aGUgTUFDIGFkZHJlc3Mgb2YgdGhlIGNhcmQgKi8KKwlscC0+bHR2UmVjb3JkLmxlbiA9IDQ7CisJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19BUCAgKSB7CisJCWxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX05JQ19NQUNfQUREUjsKKwl9IGVsc2UKKwl7CisJCWxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0NORl9PV05fTUFDX0FERFI7CisJfQorCWhjZl9zdGF0dXMgPSBoY2ZfZ2V0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCWlmICggaGNmX3N0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApIHsKKwkJREJHX0VSUk9SKCBEYmdJbmZvLCAiQ291bGQgbm90IHJldHJpZXZlIE1BQyBhZGRyZXNzXG4iICk7CisJCURCR19MRUFWRSggRGJnSW5mbyApOworCQlyZXR1cm4gaGNmX3N0YXR1czsKKwl9CisJbWVtY3B5KCBscC0+TUFDQWRkcmVzcywgJmxwLT5sdHZSZWNvcmQudS51OFswXSwgRVRIX0FMRU4gKTsKKwlEQkdfVFJBQ0UoIERiZ0luZm8sICJDYXJkIE1BQyBBZGRyZXNzOiAlc1xuIiwgRGJnSHdBZGRyKCBscC0+TUFDQWRkcmVzcyApKTsKKworCS8qIFdyaXRlIG91dCBjb25maWd1cmF0aW9uIHRvIHRoZSBkZXZpY2UsIGVuYWJsZSwgYW5kIHJlY29ubmVjdC4gSG93ZXZlciwKKwkgICBvbmx5IHJlY29ubmVjdCBpZiBpbiBBUCBtb2RlLiBGb3IgU1RBIG1vZGUsIG5lZWQgdG8gd2FpdCBmb3IgcGFzc2l2ZSBzY2FuCisJICAgY29tcGxldGlvbiBiZWZvcmUgYSBjb25uZWN0IGNhbiBiZSBpc3N1ZWQgKi8KKwl3bF9wdXRfbHR2KCBscCApOworCS8qIEVuYWJsZSB0aGUgcG9ydHMgKi8KKwloY2Zfc3RhdHVzID0gd2xfZW5hYmxlKCBscCApOworCisJaWYgKCBscC0+RG93bmxvYWRGaXJtd2FyZSA9PSBXVkxBTl9EUlZfTU9ERV9BUCApIHsKKyNpZmRlZiBVU0VfV0RTCisJCXdsX2VuYWJsZV93ZHNfcG9ydHMoIGxwICk7CisjZW5kaWYgLy8gVVNFX1dEUworCQloY2Zfc3RhdHVzID0gd2xfY29ubmVjdCggbHAgKTsKKwl9CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIGhjZl9zdGF0dXM7Cit9IC8vIHdsX2dvCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9zZXRfd2VwX2tleXMoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBXcml0ZSBUeEtleUlEIGFuZCBXRVAga2V5cyB0byB0aGUgYWRhcHRlci4gVGhpcyBpcyBzZXBhcmF0ZWQgZnJvbQorICogIHdsX2FwcGx5KCkgdG8gYWxsb3cgZHluYW1pYyBXRVAga2V5IHVwZGF0ZXMgdGhyb3VnaCB0aGUgd2lyZWxlc3MKKyAqICBleHRlbnNpb25zLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSB3aXJlbGVzcyBhZGFwdGVyJ3MgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3NldF93ZXBfa2V5cyggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKwlpbnQgY291bnQgPSAwOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlEQkdfRlVOQyggIndsX3NldF93ZXBfa2V5cyIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sICJscCIsICIlcyAoMHglcCkiLCBscC0+ZGV2LT5uYW1lLCBscCApOworCWlmICggbHAtPkVuYWJsZUVuY3J5cHRpb24gKSB7CisJCS8qIE5PVEU6IENGR19DTkZfRU5DUllQVElPTiBpcyBzZXQgaW4gd2xfcHV0X2x0digpIGFzIGl0J3MgYSBzdGF0aWMKKwkJCQkgUklEICovCisKKwkJLyogc2V0IFR4S2V5SUQgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19UWF9LRVlfSUQ7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUobHAtPlRyYW5zbWl0S2V5SUQgLSAxKTsKKworCQloY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCURCR19UUkFDRSggRGJnSW5mbywgIktleSAxIGxlbjogJWRcbiIsIGxwLT5EZWZhdWx0S2V5cy5rZXlbMF0ubGVuICk7CisJCURCR19UUkFDRSggRGJnSW5mbywgIktleSAyIGxlbjogJWRcbiIsIGxwLT5EZWZhdWx0S2V5cy5rZXlbMV0ubGVuICk7CisJCURCR19UUkFDRSggRGJnSW5mbywgIktleSAzIGxlbjogJWRcbiIsIGxwLT5EZWZhdWx0S2V5cy5rZXlbMl0ubGVuICk7CisJCURCR19UUkFDRSggRGJnSW5mbywgIktleSA0IGxlbjogJWRcbiIsIGxwLT5EZWZhdWx0S2V5cy5rZXlbM10ubGVuICk7CisKKwkJLyogd3JpdGUga2V5cyAqLworCQlscC0+RGVmYXVsdEtleXMubGVuID0gc2l6ZW9mKCBscC0+RGVmYXVsdEtleXMgKSAvIHNpemVvZiggaGNmXzE2ICkgLSAxOworCQlscC0+RGVmYXVsdEtleXMudHlwID0gQ0ZHX0RFRkFVTFRfS0VZUzsKKworCQkvKiBlbmRpYW4gdHJhbnNsYXRlIHRoZSBhcHByb3ByaWF0ZSBrZXkgaW5mb3JtYXRpb24gKi8KKwkJZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTUFYX0tFWVM7IGNvdW50KysgKSB7CisJCQlscC0+RGVmYXVsdEtleXMua2V5W2NvdW50XS5sZW4gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPkRlZmF1bHRLZXlzLmtleVtjb3VudF0ubGVuICk7CisJCX0KKworCQloY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+RGVmYXVsdEtleXMgKSk7CisKKwkJLyogUmV2ZXJzZSB0aGUgYWJvdmUgZW5kaWFuIHRyYW5zbGF0aW9uLCBzaW5jZSB0aGVzZSBrZXlzIGFyZSBhY2Nlc3NlZAorCQkgICBlbHNld2hlcmUgKi8KKwkJZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTUFYX0tFWVM7IGNvdW50KysgKSB7CisJCQlscC0+RGVmYXVsdEtleXMua2V5W2NvdW50XS5sZW4gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPkRlZmF1bHRLZXlzLmtleVtjb3VudF0ubGVuICk7CisJCX0KKworCQlEQkdfTk9USUNFKCBEYmdJbmZvLCAiZW5jcnlwdDogJWQsIElEOiAlZFxuIiwgbHAtPkVuYWJsZUVuY3J5cHRpb24sIGxwLT5UcmFuc21pdEtleUlEICk7CisJCURCR19OT1RJQ0UoIERiZ0luZm8sICJzZXQga2V5OiAlcyglZCkgWyVkXVxuIiwgbHAtPkRlZmF1bHRLZXlzLmtleVtscC0+VHJhbnNtaXRLZXlJRC0xXS5rZXksIGxwLT5EZWZhdWx0S2V5cy5rZXlbbHAtPlRyYW5zbWl0S2V5SUQtMV0ubGVuLCBscC0+VHJhbnNtaXRLZXlJRC0xICk7CisJfQorCisJREJHX0xFQVZFKCBEYmdJbmZvICk7Cit9IC8vIHdsX3NldF93ZXBfa2V5cworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfYXBwbHkoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBXcml0ZSB0aGUgcGFyYW1ldGVycyB0byB0aGUgYWRhcHRlci4gKHJlLSllbmFibGVzIHRoZSBjYXJkIGlmIGRldmljZSBpcworICogIG9wZW4uIFJldHVybnMgaGNmX3N0YXR1cyBvZiBoY2ZfZW5hYmxlKCkuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIHdpcmVsZXNzIGFkYXB0ZXIncyBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgYW4gSENGIHN0YXR1cyBjb2RlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9hcHBseShzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHApCit7CisJaW50IGhjZl9zdGF0dXMgPSBIQ0ZfU1VDQ0VTUzsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJREJHX0ZVTkMoICJ3bF9hcHBseSIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKwlEQkdfQVNTRVJUKCBscCAhPSBOVUxMKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sICJscCIsICIlcyAoMHglcCkiLCBscC0+ZGV2LT5uYW1lLCBscCApOworCisJaWYgKCAhKCBscC0+ZmxhZ3MgJiBXVkxBTjJfVUlMX0JVU1kgKSkgeworCQkvKiBUaGUgYWRhcHRlciBwYXJhbWV0ZXJzIGhhdmUgY2hhbmdlZDoKKwkJCQlkaXNhYmxlIGNhcmQKKwkJCQlyZWxvYWQgcGFyYW1ldGVycworCQkJCWVuYWJsZSBjYXJkCisJCSovCisKKwkJaWYgKCB3bF9hZGFwdGVyX2lzX29wZW4oIGxwLT5kZXYgKSkgeworCQkJLyogRGlzY29ubmVjdCBhbmQgZGlzYWJsZSBpZiBuZWNlc3NhcnkgKi8KKwkJCWhjZl9zdGF0dXMgPSB3bF9kaXNjb25uZWN0KCBscCApOworCQkJaWYgKCBoY2Zfc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgeworCQkJCURCR19FUlJPUiggRGJnSW5mbywgIkRpc2Nvbm5lY3QgZmFpbGVkXG4iICk7CisJCQkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaGNmX3N0YXR1cyA9IHdsX2Rpc2FibGUoIGxwICk7CisJCQlpZiAoIGhjZl9zdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7CisJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiRGlzYWJsZSBmYWlsZWRcbiIgKTsKKwkJCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9IGVsc2UgeworCQkJCS8qIFdyaXRlIG91dCBjb25maWd1cmF0aW9uIHRvIHRoZSBkZXZpY2UsIGVuYWJsZSwgYW5kIHJlY29ubmVjdC4KKwkJCQkgICBIb3dldmVyLCBvbmx5IHJlY29ubmVjdCBpZiBpbiBBUCBtb2RlLiBGb3IgU1RBIG1vZGUsIG5lZWQgdG8KKwkJCQkgICB3YWl0IGZvciBwYXNzaXZlIHNjYW4gY29tcGxldGlvbiBiZWZvcmUgYSBjb25uZWN0IGNhbiBiZQorCQkJCSAgIGlzc3VlZCAqLworCQkJCWhjZl9zdGF0dXMgPSB3bF9wdXRfbHR2KCBscCApOworCisJCQkJaWYgKCBoY2Zfc3RhdHVzID09IEhDRl9TVUNDRVNTICkgeworCQkJCQloY2Zfc3RhdHVzID0gd2xfZW5hYmxlKCBscCApOworCisJCQkJCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfQVAgICkgeworCQkJCQkJaGNmX3N0YXR1cyA9IHdsX2Nvbm5lY3QoIGxwICk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIndsX3B1dF9sdHYoKSBmYWlsZWRcbiIgKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gaGNmX3N0YXR1czsKK30gLy8gd2xfYXBwbHkKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3B1dF9sdHZfaW5pdCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFVzZWQgdG8gc2V0IGJhc2ljIHBhcmFtZXRlcnMgZm9yIGNhcmQgaW5pdGlhbGl6YXRpb24uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIHdpcmVsZXNzIGFkYXB0ZXIncyBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgYW4gSENGIHN0YXR1cyBjb2RlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9wdXRfbHR2X2luaXQoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisJaW50IGk7CisJaW50IGhjZl9zdGF0dXM7CisJQ0ZHX1JJRF9MT0dfU1RSQ1QgKlJpZExvZzsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJREJHX0ZVTkMoICJ3bF9wdXRfbHR2X2luaXQiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisJaWYgKCBscCA9PSBOVUxMICkgeworCQlEQkdfRVJST1IoIERiZ0luZm8sICJscCBwb2ludGVyIGlzIE5VTExcbiIgKTsKKwkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCXJldHVybiAtMTsKKwl9CisJLyogRE1BL0lPICovCisJbHAtPmx0dlJlY29yZC5sZW4gPSAyOworCWxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0NOVExfT1BUOworCisJLyogVGhlIENhcmQgU2VydmljZXMgYnVpbGQgbXVzdCBBTFdBWVMgY29uZmlndXJlIGZvciAxNi1iaXQgSS9PLiBQQ0kgb3IKKwkgICBDYXJkQnVzIGNhbiBiZSBzZXQgdG8gZWl0aGVyIDE2LzMyIGJpdCBJL08sIG9yIEJ1cyBNYXN0ZXIgRE1BLCBidXQgb25seQorCSAgIGZvciBIZXJtZXMtMi41ICovCisjaWZkZWYgQlVTX1BDTUNJQQorCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gPSBDTlZfSU5UX1RPX0xJVFRMRSggVVNFXzE2QklUICk7CisjZWxzZQorCWlmICggbHAtPnVzZV9kbWEgKSB7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gPSBDTlZfSU5UX1RPX0xJVFRMRSggVVNFX0RNQSApOworCX0gZWxzZSB7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gPSBDTlZfSU5UX1RPX0xJVFRMRSggMCApOworCX0KKworI2VuZGlmCisJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX0NOVExfT1BUICAgICAgICAgICAgICAgICAgICAgIDogMHglMDR4XG4iLAorCQkJICAgbHAtPmx0dlJlY29yZC51LnUxNlswXSApOworCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19DTlRMX09QVCByZXN1bHQgICAgICAgICAgICAgICA6IDB4JTA0eFxuIiwKKwkJCSAgIGhjZl9zdGF0dXMgKTsKKworCS8qIFJlZ2lzdGVyIHRoZSBsaXN0IG9mIFJJRHMgb24gd2hpY2ggYXN5bmNocm9ub3VzIG5vdGlmaWNhdGlvbiBpcworCSAgIHJlcXVpcmVkLiBOb3RlIHRoYXQgdGhpcyBtZWNoYW5pc20gcmVwbGFjZXMgdGhlIG1haWxib3gsIHNvIHRoZSBtYWlsYm94CisJICAgY2FuIGJlIHF1ZXJpZWQgYnkgdGhlIGhvc3QgKGlmIGRlc2lyZWQpIHdpdGhvdXQgY29udGVudGlvbiBmcm9tIHVzICovCisJaT0wOworCisJbHAtPlJpZExpc3RbaV0ubGVuICAgICA9IHNpemVvZiggbHAtPlByb2JlUmVzcCApOworCWxwLT5SaWRMaXN0W2ldLnR5cCAgICAgPSBDRkdfQUNTX1NDQU47CisJbHAtPlJpZExpc3RbaV0uYnVmcCAgICA9ICh3Y2lfcmVjb3JkcCkmbHAtPlByb2JlUmVzcDsKKwkvL2xwLT5Qcm9iZVJlc3AuaW5mb1R5cGUgPSAweEZGRkY7CisJaSsrOworCisJbHAtPlJpZExpc3RbaV0ubGVuICAgICA9IHNpemVvZiggbHAtPmFzc29jX3N0YXQgKTsKKwlscC0+UmlkTGlzdFtpXS50eXAgICAgID0gQ0ZHX0FTU09DX1NUQVQ7CisJbHAtPlJpZExpc3RbaV0uYnVmcCAgICA9ICh3Y2lfcmVjb3JkcCkmbHAtPmFzc29jX3N0YXQ7CisJbHAtPmFzc29jX3N0YXQubGVuICAgICA9IDB4RkZGRjsKKwlpKys7CisKKwlscC0+UmlkTGlzdFtpXS5sZW4gICAgID0gNDsKKwlscC0+UmlkTGlzdFtpXS50eXAgICAgID0gQ0ZHX1VQREFURURfSU5GT19SRUNPUkQ7CisJbHAtPlJpZExpc3RbaV0uYnVmcCAgICA9ICh3Y2lfcmVjb3JkcCkmbHAtPnVwZGF0ZWRSZWNvcmQ7CisJbHAtPnVwZGF0ZWRSZWNvcmQubGVuICA9IDB4RkZGRjsKKwlpKys7CisKKwlscC0+UmlkTGlzdFtpXS5sZW4gICAgID0gc2l6ZW9mKCBscC0+c2VjX3N0YXQgKTsKKwlscC0+UmlkTGlzdFtpXS50eXAgICAgID0gQ0ZHX1NFQ1VSSVRZX1NUQVQ7CisJbHAtPlJpZExpc3RbaV0uYnVmcCAgICA9ICh3Y2lfcmVjb3JkcCkmbHAtPnNlY19zdGF0OworCWxwLT5zZWNfc3RhdC5sZW4gICAgICAgPSAweEZGRkY7CisJaSsrOworCisJbHAtPlJpZExpc3RbaV0udHlwICAgICA9IDA7ICAgIC8vIFRlcm1pbmF0ZSBMaXN0CisKKwlSaWRMb2cgPSAoQ0ZHX1JJRF9MT0dfU1RSQ1QgKikmbHAtPmx0dlJlY29yZDsKKwlSaWRMb2ctPmxlbiAgICAgPSAzOworCVJpZExvZy0+dHlwICAgICA9IENGR19SRUdfSU5GT19MT0c7CisJUmlkTG9nLT5yZWNvcmRwID0gKFJJRF9MT0dQKSZscC0+UmlkTGlzdFswXTsKKworCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19SRUdfSU5GT19MT0dcbiIgKTsKKwlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfUkVHX0lORk9fTE9HIHJlc3VsdCAgICAgICAgICAgOiAweCUwNHhcbiIsCisJCQkgICBoY2Zfc3RhdHVzICk7CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIGhjZl9zdGF0dXM7Cit9IC8vIHdsX3B1dF9sdHZfaW5pdAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcHV0X2x0digpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFVzZWQgYnkgd3ZsYW5fYXBwbHkoKSBhbmQgd3ZsYW5fZ28gdG8gc2V0IHRoZSBjYXJkJ3MgY29uZmlndXJhdGlvbi4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgd2lyZWxlc3MgYWRhcHRlcidzIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBhbiBIQ0Ygc3RhdHVzIGNvZGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3B1dF9sdHYoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisJaW50IGxlbjsKKwlpbnQgaGNmX3N0YXR1czsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJREJHX0ZVTkMoICJ3bF9wdXRfbHR2IiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYgKCBscCA9PSBOVUxMICkgeworCQlEQkdfRVJST1IoIERiZ0luZm8sICJscCBwb2ludGVyIGlzIE5VTExcbiIgKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX0FQICApIHsKKwkJbHAtPm1heFBvcnQgPSA2OwkJCS8vOz93aHkgc2V0IHRoaXMgaGVyZSBhbmQgbm90IGFzIHBhcnQgb2YgZG93bmxvYWQgcHJvY2VzcworCX0gZWxzZSB7CisJCWxwLT5tYXhQb3J0ID0gMDsKKwl9CisKKwkvKiBTZW5kIG91ciBjb25maWd1cmF0aW9uIHRvIHRoZSBjYXJkLiBQZXJmb3JtIGFueSBlbmRpYW4gdHJhbnNsYXRpb24KKwkgICBuZWNlc3NhcnkgKi8KKwkvKiBSZWdpc3RlciB0aGUgTWFpbGJveDsgVnhXb3JrcyBkb2VzIHRoaXMgZWxzZXdoZXJlOyB3aHk7PyAqLworCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gNDsKKwlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19SRUdfTUI7CisJbHAtPmx0dlJlY29yZC51LnUzMlswXSAgPSAodV9sb25nKSYoIGxwLT5tYWlsYm94ICk7CisJbHAtPmx0dlJlY29yZC51LnUxNlsyXSAgPSAoIE1CX1NJWkUgLyBzaXplb2YoIGhjZl8xNiApKTsKKwloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCS8qIE1heCBEYXRhIExlbmd0aCAqLworCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfTUFYX0RBVEFfTEVOOworCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIEhDRl9NQVhfUEFDS0VUX1NJWkUgKTsKKwloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCS8qIFN5c3RlbSBTY2FsZSAvIERpc3RhbmNlIGJldHdlZW4gQVBzICovCisJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9TWVNURU1fU0NBTEU7CisJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPkRpc3RhbmNlQmV0d2VlbkFQcyApOworCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJLyogQ2hhbm5lbCAqLworCWlmICggbHAtPkNyZWF0ZUlCU1MgJiYgKCBscC0+Q2hhbm5lbCA9PSAwICkpIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ3JlYXRlIElCU1MiICk7CisJCWxwLT5DaGFubmVsID0gMTA7CisJfQorCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfT1dOX0NIQU5ORUw7CisJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPkNoYW5uZWwgKTsKKwloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCS8qIE1pY3Jvd2F2ZSBSb2J1c3RuZXNzICovCisJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9NSUNST19XQVZFOworCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5NaWNyb3dhdmVSb2J1c3RuZXNzICk7CisJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkvKiBMb2FkIEJhbGFuY2luZyAqLworCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfTE9BRF9CQUxBTkNJTkc7CisJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmxvYWRCYWxhbmNpbmcgKTsKKwloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCS8qIE1lZGl1bSBEaXN0cmlidXRpb24gKi8KKwlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX01FRElVTV9ESVNUUklCVVRJT047CisJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPm1lZGl1bURpc3RyaWJ1dGlvbiApOworCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCS8qIENvdW50cnkgQ29kZSAqLworCisjaWZkZWYgV0FSUAorCS8qIFR4IFBvd2VyIExldmVsIChmb3Igc3VwcG9ydGVkIGNhcmRzKSAqLworCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfVFhfUE9XX0xWTDsKKwlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+dHhQb3dMZXZlbCApOworCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJLyogU2hvcnQgUmV0cnkgTGltaXQgKi8KKwkvKmxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IDB4RkMzMjsKKwlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+c2hvcnRSZXRyeUxpbWl0ICk7CisJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisJKi8KKworCS8qIExvbmcgUmV0cnkgTGltaXQgKi8KKwkvKmxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IDB4RkMzMzsKKwlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bG9uZ1JldHJ5TGltaXQgKTsKKwloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKwkqLworCisJLyogU3VwcG9ydGVkIFJhdGUgU2V0IENvbnRyb2wgKi8KKwlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDM7CisJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfU1VQUE9SVEVEX1JBVEVfU0VUX0NOVEw7IC8vMHhGQzg4OworCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5zcnNjWzBdICk7CisJbHAtPmx0dlJlY29yZC51LnUxNlsxXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPnNyc2NbMV0gKTsKKwloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCS8qIEJhc2ljIFJhdGUgU2V0IENvbnRyb2wgKi8KKwlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDM7CisJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQkFTSUNfUkFURV9TRVRfQ05UTDsgLy8weEZDODk7CisJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmJyc2NbMF0gKTsKKwlscC0+bHR2UmVjb3JkLnUudTE2WzFdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+YnJzY1sxXSApOworCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJLyogRnJhbWUgQnVyc3QgTGltaXQgKi8KKwkvKiBEZWZpbmVkLCBidXQgbm90IGN1cnJlbnRseSBhdmFpbGFibGUgaW4gRmlybXdhcmUgKi8KKworI2VuZGlmIC8vIFdBUlAKKworI2lmZGVmIFdBUlAKKwkvKiBNdWx0aWNhc3QgUmF0ZSAqLworCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMzsKKwlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfTUNBU1RfUkFURTsKKwlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+TXVsdGljYXN0UmF0ZVswXSApOworCWxwLT5sdHZSZWNvcmQudS51MTZbMV0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5NdWx0aWNhc3RSYXRlWzFdICk7CisjZWxzZQorCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfTUNBU1RfUkFURTsKKwlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+TXVsdGljYXN0UmF0ZVswXSApOworI2VuZGlmIC8vIFdBUlAKKwloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCS8qIE93biBOYW1lIChTdGF0aW9uIE5pY2tuYW1lKSAqLworCWlmICgoIGxlbiA9ICggc3RybGVuKCBscC0+U3RhdGlvbk5hbWUgKSArIDEgKSAmIH4weDAxICkgIT0gMCApIHsKKwkJLy9EQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfQ05GX09XTl9OQU1FICAgICAgICAgICAgICAgICAgOiAlc1xuIiwKKwkJLy8gICAgICAgICAgIGxwLT5TdGF0aW9uTmFtZSApOworCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMiArICggbGVuIC8gc2l6ZW9mKCBoY2ZfMTYgKSk7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9PV05fTkFNRTsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggc3RybGVuKCBscC0+U3RhdGlvbk5hbWUgKSk7CisKKwkJbWVtY3B5KCAmKCBscC0+bHR2UmVjb3JkLnUudThbMl0gKSwgbHAtPlN0YXRpb25OYW1lLCBsZW4gKTsKKwl9IGVsc2UgeworCQkvL0RCR19UUkFDRSggRGJnSW5mbywgIkNGR19DTkZfT1dOX05BTUUgICAgICAgICAgICAgICAgICA6IEVNUFRZXG4iICk7CisKKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfT1dOX05BTUU7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIDAgKTsKKwl9CisKKwloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCS8vREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX0NORl9PV05fTkFNRSByZXN1bHQgICAgICAgICAgIDogMHglMDR4XG4iLAorCS8vICAgICAgICAgICBoY2Zfc3RhdHVzICk7CisKKwkvKiBUaGUgZm9sbG93aW5nIGFyZSBzZXQgaW4gU1RBIG1vZGUgb25seSAqLworCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfU1RBICApIHsKKworCQkvKiBSVFMgVGhyZXNob2xkICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfUlRTX1RIUkg7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5SVFNUaHJlc2hvbGQgKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLyogUG9ydCBUeXBlICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX1BPUlRfVFlQRTsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPlBvcnRUeXBlICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8qIFR4IFJhdGUgQ29udHJvbCAqLworI2lmZGVmIFdBUlAKKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAzOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19UWF9SQVRFX0NOVEw7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5UeFJhdGVDb250cm9sWzBdICk7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMV0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5UeFJhdGVDb250cm9sWzFdICk7CisjZWxzZQorCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1RYX1JBVEVfQ05UTDsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPlR4UmF0ZUNvbnRyb2xbMF0gKTsKKyNlbmRpZiAgLy8gV0FSUAorCisvLzs/c2tpcCB0ZW1wb3JhcmlseSB0byBzZWUgd2hldGhlciB0aGUgUklEIG9yIHNvbWV0aGluZyBlbHNlIGlzIHRoZSBwcm9iZWxtIGhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19UWF9SQVRFX0NOVEwgMi40R0h6ICAgICAgICAgICA6IDB4JTA0eFxuIiwKKwkJCQkgICBscC0+VHhSYXRlQ29udHJvbFswXSApOworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfVFhfUkFURV9DTlRMIDUuMEdIeiAgICAgICAgICAgOiAweCUwNHhcbiIsCisJCQkJICAgbHAtPlR4UmF0ZUNvbnRyb2xbMV0gKTsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX1RYX1JBVEVfQ05UTCByZXN1bHQgICAgICAgICAgIDogMHglMDR4XG4iLAorCQkJCSAgIGhjZl9zdGF0dXMgKTsKKwkJLyogUG93ZXIgTWFuYWdlbWVudCAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9QTV9FTkFCTEVEOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+UE1FbmFibGVkICk7CisvLwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggMHg4MDAxICk7CisJCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19DTkZfUE1fRU5BQkxFRCAgICAgICAgICAgICAgICA6IDB4JTA0eFxuIiwgbHAtPlBNRW5hYmxlZCApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKwkJLyogTXVsdGljYXN0IFJlY2VpdmUgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfTUNBU1RfUlg7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5NdWx0aWNhc3RSZWNlaXZlICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8qIE1heCBTbGVlcCBEdXJhdGlvbiAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9NQVhfU0xFRVBfRFVSQVRJT047CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5NYXhTbGVlcER1cmF0aW9uICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8qIENyZWF0ZSBJQlNTICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ1JFQVRFX0lCU1M7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5DcmVhdGVJQlNTICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8qIERlc2lyZWQgU1NJRCAqLworCQlpZiAoKCggbGVuID0gKCBzdHJsZW4oIGxwLT5OZXR3b3JrTmFtZSApICsgMSApICYgfjB4MDEgKSAhPSAwICkgJiYKKwkJCSAoIHN0cmNtcCggbHAtPk5ldHdvcmtOYW1lLCAiQU5ZIiApICE9IDAgKSAmJgorCQkJICggc3RyY21wKCBscC0+TmV0d29ya05hbWUsICJhbnkiICkgIT0gMCApKSB7CisJCQkvL0RCR19UUkFDRSggRGJnSW5mbywgIkNGR19ERVNJUkVEX1NTSUQgICAgICAgICAgICAgICAgICA6ICVzXG4iLAorCQkJLy8gICAgICAgICAgIGxwLT5OZXR3b3JrTmFtZSApOworCisJCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDIgKyAobGVuIC8gc2l6ZW9mKGhjZl8xNikpOworCQkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfREVTSVJFRF9TU0lEOworCQkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggc3RybGVuKCBscC0+TmV0d29ya05hbWUgKSk7CisKKwkJCW1lbWNweSggJiggbHAtPmx0dlJlY29yZC51LnU4WzJdICksIGxwLT5OZXR3b3JrTmFtZSwgbGVuICk7CisJCX0gZWxzZSB7CisJCQkvL0RCR19UUkFDRSggRGJnSW5mbywgIkNGR19ERVNJUkVEX1NTSUQgICAgICAgICAgICAgICAgICA6IEFOWVxuIiApOworCisJCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19ERVNJUkVEX1NTSUQ7CisJCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCAwICk7CisJCX0KKworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvL0RCR19UUkFDRSggRGJnSW5mbywgIkNGR19ERVNJUkVEX1NTSUQgcmVzdWx0ICAgICAgICAgICA6IDB4JTA0eFxuIiwKKwkJLy8gICAgICAgICAgIGhjZl9zdGF0dXMgKTsKKwkJLyogT3duIEFUSU0gd2luZG93ICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX09XTl9BVElNX1dJTkRPVzsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmF0aW1XaW5kb3cgKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKworCQkvKiBIb2xkb3ZlciBEdXJhdGlvbiAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9IT0xET1ZFUl9EVVJBVElPTjsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhvbGRvdmVyRHVyYXRpb24gKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLyogUHJvbWlzY3VvdXMgTW9kZSAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1BST01JU0NVT1VTX01PREU7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5wcm9taXNjdW91c01vZGUgKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLyogQXV0aGVudGljYXRpb24gKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfQVVUSEVOVElDQVRJT047CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5hdXRoZW50aWNhdGlvbiApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKyNpZmRlZiBXQVJQCisJCS8qIENvbm5lY3Rpb24gQ29udHJvbCAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9DT05ORUNUSU9OX0NOVEw7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5jb25uZWN0aW9uQ29udHJvbCApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCisKKwkJLyogUHJvYmUgZGF0YSByYXRlICovCisJCS8qbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAzOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19QUk9CRV9EQVRBX1JBVEU7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5wcm9iZURhdGFSYXRlc1swXSApOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzFdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+cHJvYmVEYXRhUmF0ZXNbMV0gKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX1BST0JFX0RBVEFfUkFURSAyLjRHSHogICAgICAgIDogMHglMDR4XG4iLAorCQkJCSAgIGxwLT5wcm9iZURhdGFSYXRlc1swXSApOworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfUFJPQkVfREFUQV9SQVRFIDUuMEdIeiAgICAgICAgOiAweCUwNHhcbiIsCisJCQkJICAgbHAtPnByb2JlRGF0YVJhdGVzWzFdICk7CisJCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19QUk9CRV9EQVRBX1JBVEUgcmVzdWx0ICAgICAgICA6IDB4JTA0eFxuIiwKKwkJCQkgICBoY2Zfc3RhdHVzICk7Ki8KKyNlbmRpZiAvLyBXQVJQCisJfSBlbHNlIHsKKwkJLyogVGhlIGZvbGxvd2luZyBhcmUgc2V0IGluIEFQIG1vZGUgb25seSAqLworI2lmIDAgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAKKwkJLy87P3Nob3VsZCB3ZSByZXN0b3JlIHRoaXMgdG8gYWxsb3cgc21hbGxlciBtZW1vcnkgZm9vdHByaW50CisKKwkJLyogRFRJTSBQZXJpb2QgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfT1dOX0RUSU1fUEVSSU9EOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+RFRJTVBlcmlvZCApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvKiBNdWx0aWNhc3QgUE0gQnVmZmVyaW5nICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX01DQVNUX1BNX0JVRjsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPm11bHRpY2FzdFBNQnVmZmVyaW5nICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8qIFJlamVjdCBBTlkgLSBDbG9zZWQgU3lzdGVtICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX1JFSkVDVF9BTlk7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5SZWplY3RBbnkgKTsKKworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvKiBFeGNsdWRlIFVuZW5jcnlwdGVkICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX0VYQ0xfVU5FTkNSWVBURUQ7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5FeGNsdWRlVW5lbmNyeXB0ZWQgKTsKKworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvKiBJbnRyYUJTUyBSZWxheSAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9JTlRSQV9CU1NfUkVMQVk7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5pbnRyYUJTU1JlbGF5ICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8qIFJUUyBUaHJlc2hvbGQgMCAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1JUU19USFJIMDsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPlJUU1RocmVzaG9sZCApOworCisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8qIFR4IFJhdGUgQ29udHJvbCAwICovCisjaWZkZWYgV0FSUAorCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDM7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1RYX1JBVEVfQ05UTDA7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5UeFJhdGVDb250cm9sWzBdICk7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMV0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5UeFJhdGVDb250cm9sWzFdICk7CisjZWxzZQorCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1RYX1JBVEVfQ05UTDA7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5UeFJhdGVDb250cm9sWzBdICk7CisjZW5kaWYgIC8vIFdBUlAKKworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvKiBPd24gQmVhY29uIEludGVydmFsICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSAweEZDMzE7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5vd25CZWFjb25JbnRlcnZhbCApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvKiBDby1FeGlzdGVuY2UgQmVoYXZpb3IgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IDB4RkNDNzsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmNvZXhpc3RlbmNlICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisjaWZkZWYgVVNFX1dEUworCisJCS8qIFJUUyBUaHJlc2hvbGQgMSAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1JUU19USFJIMTsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPndkc19wb3J0WzBdLnJ0c1RocmVzaG9sZCApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvKiBSVFMgVGhyZXNob2xkIDIgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19SVFNfVEhSSDI7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT53ZHNfcG9ydFsxXS5ydHNUaHJlc2hvbGQgKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKworCQkvKiBSVFMgVGhyZXNob2xkIDMgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19SVFNfVEhSSDM7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT53ZHNfcG9ydFsyXS5ydHNUaHJlc2hvbGQgKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKworCQkvKiBSVFMgVGhyZXNob2xkIDQgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19SVFNfVEhSSDQ7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT53ZHNfcG9ydFszXS5ydHNUaHJlc2hvbGQgKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKworCQkvKiBSVFMgVGhyZXNob2xkIDUgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19SVFNfVEhSSDU7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT53ZHNfcG9ydFs0XS5ydHNUaHJlc2hvbGQgKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLyogUlRTIFRocmVzaG9sZCA2ICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfUlRTX1RIUkg2OworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+d2RzX3BvcnRbNV0ucnRzVGhyZXNob2xkICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworI2lmIDAKKwkJLyogVFggUmF0ZSBDb250cm9sIDEgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19UWF9SQVRFX0NOVEwxOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+d2RzX3BvcnRbMF0udHhSYXRlQ250bCApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvKiBUWCBSYXRlIENvbnRyb2wgMiAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1RYX1JBVEVfQ05UTDI7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT53ZHNfcG9ydFsxXS50eFJhdGVDbnRsICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8qIFRYIFJhdGUgQ29udHJvbCAzICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfVFhfUkFURV9DTlRMMzsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPndkc19wb3J0WzJdLnR4UmF0ZUNudGwgKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLyogVFggUmF0ZSBDb250cm9sIDQgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19UWF9SQVRFX0NOVEw0OworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+d2RzX3BvcnRbM10udHhSYXRlQ250bCApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvKiBUWCBSYXRlIENvbnRyb2wgNSAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1RYX1JBVEVfQ05UTDU7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT53ZHNfcG9ydFs0XS50eFJhdGVDbnRsICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8qIFRYIFJhdGUgQ29udHJvbCA2ICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfVFhfUkFURV9DTlRMNjsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPndkc19wb3J0WzVdLnR4UmF0ZUNudGwgKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKyNlbmRpZgorCisJCS8qIFdEUyBhZGRyZXNzZXMuICBJdCdzIG9rYXkgdG8gYmxpbmRseSBzZW5kIHRoZXNlIHBhcmFtZXRlcnMsIGJlY2F1c2UKKwkJICAgdGhlIHBvcnQgbmVlZHMgdG8gYmUgZW5hYmxlZCwgYmVmb3JlIGFueXRoaW5nIGlzIGRvbmUgd2l0aCBpdC4gKi8KKworCQkvKiBXRFMgQWRkcmVzcyAxICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgPSA0OworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgID0gQ0ZHX0NORl9XRFNfQUREUjE7CisKKwkJbWVtY3B5KCAmbHAtPmx0dlJlY29yZC51LnU4WzBdLCBscC0+d2RzX3BvcnRbMF0ud2RzQWRkcmVzcywgRVRIX0FMRU4gKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLyogV0RTIEFkZHJlc3MgMiAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgID0gNDsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICA9IENGR19DTkZfV0RTX0FERFIyOworCisJCW1lbWNweSggJmxwLT5sdHZSZWNvcmQudS51OFswXSwgbHAtPndkc19wb3J0WzFdLndkc0FkZHJlc3MsIEVUSF9BTEVOICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8qIFdEUyBBZGRyZXNzIDMgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICA9IDQ7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgPSBDRkdfQ05GX1dEU19BRERSMzsKKworCQltZW1jcHkoICZscC0+bHR2UmVjb3JkLnUudThbMF0sIGxwLT53ZHNfcG9ydFsyXS53ZHNBZGRyZXNzLCBFVEhfQUxFTiApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvKiBXRFMgQWRkcmVzcyA0ICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgPSA0OworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgID0gQ0ZHX0NORl9XRFNfQUREUjQ7CisKKwkJbWVtY3B5KCAmbHAtPmx0dlJlY29yZC51LnU4WzBdLCBscC0+d2RzX3BvcnRbM10ud2RzQWRkcmVzcywgRVRIX0FMRU4gKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLyogV0RTIEFkZHJlc3MgNSAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgID0gNDsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICA9IENGR19DTkZfV0RTX0FERFI1OworCisJCW1lbWNweSggJmxwLT5sdHZSZWNvcmQudS51OFswXSwgbHAtPndkc19wb3J0WzRdLndkc0FkZHJlc3MsIEVUSF9BTEVOICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8qIFdEUyBBZGRyZXNzIDYgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICA9IDQ7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgPSBDRkdfQ05GX1dEU19BRERSNjsKKworCQltZW1jcHkoICZscC0+bHR2UmVjb3JkLnUudThbMF0sIGxwLT53ZHNfcG9ydFs1XS53ZHNBZGRyZXNzLCBFVEhfQUxFTiApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKyNlbmRpZiAgLyogVVNFX1dEUyAqLworI2VuZGlmICAvKiAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAgKi8KKwl9CisKKwkvKiBPd24gTUFDIEFkZHJlc3MgKi8KKwkvL0RCR19UUkFDRSggRGJnSW5mbywgIk1BQyBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICA6ICVzXG4iLAorCS8vICAgICAgICAgICBEYmdId0FkZHIoIGxwLT5NQUNBZGRyZXNzICkpOworCisJaWYgKCBXVkxBTl9WQUxJRF9NQUNfQUREUkVTUyggbHAtPk1BQ0FkZHJlc3MgKSkgeworCQkvKiBNYWtlIHRoZSBNQUMgYWRkcmVzcyB2YWxpZCBieToKKwkJCQlDbGVhcmluZyB0aGUgbXVsdGljYXN0IGJpdAorCQkJCVNldHRpbmcgdGhlIGxvY2FsIE1BQyBhZGRyZXNzIGJpdAorCQkqLworCQkvL2xwLT5NQUNBZGRyZXNzWzBdICY9IH4weDAzOyAgLy87P3doeSBpcyB0aGlzIGNvbW1lbnRlZCBvdXQgYWxyZWFkeSBpbiA3MjAKKwkJLy9scC0+TUFDQWRkcmVzc1swXSB8PSAweDAyOworCisJCWxwLT5sdHZSZWNvcmQubGVuID0gMSArICggRVRIX0FMRU4gLyBzaXplb2YoIGhjZl8xNiApKTsKKwkJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19BUCAgKSB7CisJCQkvL0RCR19UUkFDRSggRGJnSW5mbywgIkNGR19OSUNfTUFDX0FERFJcbiIgKTsKKwkJCWxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX05JQ19NQUNfQUREUjsKKwkJfSBlbHNlIHsKKwkJCS8vREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX0NORl9PV05fTUFDX0FERFJcbiIgKTsKKwkJCWxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0NORl9PV05fTUFDX0FERFI7CisJCX0KKwkJLyogTUFDIGFkZHJlc3MgaXMgYnl0ZSBhbGlnbmVkLCBubyBlbmRpYW4gY29udmVyc2lvbiBuZWVkZWQgKi8KKwkJbWVtY3B5KCAmKCBscC0+bHR2UmVjb3JkLnUudThbMF0gKSwgbHAtPk1BQ0FkZHJlc3MsIEVUSF9BTEVOICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCQkvL0RCR19UUkFDRSggRGJnSW5mbywgIkNGR19YWFhfTUFDX0FERFIgcmVzdWx0ICAgICAgICAgICA6IDB4JTA0eFxuIiwKKwkJLy8gICAgICAgICAgIGhjZl9zdGF0dXMgKTsKKworCQkvKiBVcGRhdGUgdGhlIE1BQyBhZGRyZXNzIGluIHRoZSBuZXRkZXZpY2Ugc3RydWN0ICovCisJCW1lbWNweSggbHAtPmRldi0+ZGV2X2FkZHIsIGxwLT5NQUNBZGRyZXNzLCBFVEhfQUxFTiApOyAvLzs/d2hhdCBpcyB0aGUgcHVycG9zZSBvZiB0aGlzIHNlZW1pbmdseSBjb21wbGV4IGxvZ2ljCisJfQorCS8qIE93biBTU0lEICovCisJaWYgKCgoIGxlbiA9ICggc3RybGVuKCBscC0+TmV0d29ya05hbWUgKSArIDEgKSAmIH4weDAxICkgIT0gMCApICYmCisJCQkJICggc3RyY21wKCBscC0+TmV0d29ya05hbWUsICJBTlkiICkgIT0gMCApICYmCisJCQkJICggc3RyY21wKCBscC0+TmV0d29ya05hbWUsICJhbnkiICkgIT0gMCApKSB7CisJCS8vREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX0NORl9PV05fU1NJRCAgICAgICAgICAgICAgICAgIDogJXNcbiIsCisJCS8vICAgICAgICAgICBscC0+TmV0d29ya05hbWUgKTsKKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyICsgKGxlbiAvIHNpemVvZihoY2ZfMTYpKTsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX09XTl9TU0lEOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBzdHJsZW4oIGxwLT5OZXR3b3JrTmFtZSApKTsKKworCQltZW1jcHkoICYoIGxwLT5sdHZSZWNvcmQudS51OFsyXSApLCBscC0+TmV0d29ya05hbWUsIGxlbiApOworCX0gZWxzZSB7CisJCS8vREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX0NORl9PV05fU1NJRCAgICAgICAgICAgICAgICAgIDogQU5ZXG4iICk7CisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX09XTl9TU0lEOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCAwICk7CisJfQorCisJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkvL0RCR19UUkFDRSggRGJnSW5mbywgIkNGR19DTkZfT1dOX1NTSUQgcmVzdWx0ICAgICAgICAgICA6IDB4JTA0eFxuIiwKKwkvLyAgICAgICAgICAgaGNmX3N0YXR1cyApOworCS8qIGVuYWJsZS9kaXNhYmxlIGVuY3J5cHRpb24gKi8KKwlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX0VOQ1JZUFRJT047CisJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPkVuYWJsZUVuY3J5cHRpb24gKTsKKwloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCS8qIFNldCB0aGUgQXV0aGVudGljYXRpb24gS2V5IE1hbmFnZW1lbnQgU3VpdGUgKi8KKwlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfU0VUX1dQQV9BVVRIX0tFWV9NR01UX1NVSVRFOworCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5BdXRoS2V5TWdtdFN1aXRlICk7CisJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisJLyogV0VQIEtleXMgKi8KKwl3bF9zZXRfd2VwX2tleXMoIGxwICk7CisKKwkvKiBDb3VudHJ5IENvZGUgKi8KKwkvKiBjb3VudHJ5SW5mbywgbHR2Q291bnRyeUluZm8sIENGR19DTkZfQ09VTlRSWV9JTkZPICovCisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gaGNmX3N0YXR1czsKK30gLy8gd2xfcHV0X2x0dgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJaW5pdF9tb2R1bGUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBMb2FkIHRoZSBrZXJuZWwgbW9kdWxlLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgTi9BCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgYW4gZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgX19pbml0IHdsX21vZHVsZV9pbml0KCB2b2lkICkKK3sKKwlpbnQgcmVzdWx0OworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCURCR19GVU5DKCAid2xfbW9kdWxlX2luaXQiICk7CisKKyNpZiBEQkcKKwkvKiBDb252ZXJ0ICJzdGFuZGFyZCIgUENNQ0lBIHBhcmFtZXRlciBwY19kZWJ1ZyB0byBhIHJlYXNvbmFibGUgRGVidWdGbGFnIHZhbHVlLgorCSAqIE5PVEU6IFRoZSB2YWx1ZXMgYWxsIGZhbGwgdGhyb3VnaCB0byB0aGUgbG93ZXIgdmFsdWVzLiAqLworCURiZ0luZm8tPkRlYnVnRmxhZyA9IDA7CisJRGJnSW5mby0+RGVidWdGbGFnID0gREJHX1RSQUNFX09OOwkJLy87P2dldCB0aGlzIG1lc3MgcmVzb2x2ZWQgb25lIGRheQorCWlmICggcGNfZGVidWcgKSBzd2l0Y2goIHBjX2RlYnVnICkgeworCSAgY2FzZSA4OgorCQlEYmdJbmZvLT5EZWJ1Z0ZsYWcgfD0gREJHX0RTX09OOworCSAgY2FzZSA3OgorCQlEYmdJbmZvLT5EZWJ1Z0ZsYWcgfD0gREJHX1JYX09OIHwgREJHX1RYX09OOworCSAgY2FzZSA2OgorCQlEYmdJbmZvLT5EZWJ1Z0ZsYWcgfD0gREJHX1BBUkFNX09OOworCSAgY2FzZSA1OgorCQlEYmdJbmZvLT5EZWJ1Z0ZsYWcgfD0gREJHX1RSQUNFX09OOworCSAgY2FzZSA0OgorCQlEYmdJbmZvLT5EZWJ1Z0ZsYWcgfD0gREJHX1ZFUkJPU0VfT047CisJICBjYXNlIDE6CisJCURiZ0luZm8tPkRlYnVnRmxhZyB8PSBEQkdfREVGQVVMVFM7CisJICBkZWZhdWx0OgorCQlicmVhazsKKwl9CisjZW5kaWYgLyogREJHICovCisKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKwlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgVkVSU0lPTl9JTkZPKTsKKyAgICAJcHJpbnRrKEtFUk5fSU5GTyAiKioqIE1vZGlmaWVkIGZvciBrZXJuZWwgMi42IGJ5IEhlbmsgZGUgR3Jvb3QgPHBlMWRubkBhbXNhdC5vcmc+XG4iKTsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiKioqIEJhc2VkIG9uIDcuMTggdmVyc2lvbiBieSBBbmRyZXkgQm9yemVua292IDxhcnZpZGphYXJAbWFpbC5ydT4gJFJldmlzaW9uOiAzOSAkXG4iKTsKKworCisvLyA7PyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAKKy8vIAlEQkdfUFJJTlQoICJBY2Nlc3MgUG9pbnQgTW9kZSAoQVApIFN1cHBvcnQ6IFlFU1xuIiApOworLy8gI2Vsc2UKKy8vIAlEQkdfUFJJTlQoICJBY2Nlc3MgUG9pbnQgTW9kZSAoQVApIFN1cHBvcnQ6IE5PXG4iICk7CisvLyAjZW5kaWYgLyogKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQICovCisKKwlyZXN1bHQgPSB3bF9hZGFwdGVyX2luaXRfbW9kdWxlKCApOworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXN1bHQ7Cit9IC8vIGluaXRfbW9kdWxlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgljbGVhbnVwX21vZHVsZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFVubG9hZCB0aGUga2VybmVsIG1vZHVsZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCB3bF9tb2R1bGVfZXhpdCggdm9pZCApCit7CisJREJHX0ZVTkMoICJ3bF9tb2R1bGVfZXhpdCIgKTsKKwlEQkdfRU5URVIoRGJnSW5mbyk7CisKKwl3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlKCApOworI2lmIDAgLy9TQ1VMTF9VU0VfUFJPQyAvKiBkb24ndCB3YXN0ZSBzcGFjZSBpZiB1bnVzZWQgKi8KKwlyZW1vdmVfcHJvY19lbnRyeSggIndsYWdzIiwgTlVMTCApOwkJLy87P3doeSBzbyBhLXN5bW1ldHJpYyBjb21wYXJlZCB0byBsb2NhdGlvbiBvZiBjcmVhdGVfcHJvY19yZWFkX2VudHJ5CisjZW5kaWYKKworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybjsKK30gLy8gY2xlYW51cF9tb2R1bGUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK21vZHVsZV9pbml0KHdsX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KHdsX21vZHVsZV9leGl0KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2lzcigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoZSBJbnRlcnJ1cHQgU2VydmljZSBSb3V0aW5lIGZvciB0aGUgZHJpdmVyLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgaXJxICAgICAtICAgdGhlIGlycSB0aGUgaW50ZXJydXB0IGNhbWUgaW4gb24KKyAqICAgICAgZGV2X2lkICAtICAgYSBidWZmZXIgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVxdWVzdAorICogICAgICByZWdzICAgIC0KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpcnFyZXR1cm5fdCB3bF9pc3IoIGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MgKQoreworCWludCAgICAgICAgICAgICAgICAgZXZlbnRzOworCXN0cnVjdCBuZXRfZGV2aWNlICAgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IHdsX3ByaXZhdGUgICAqbHAgPSBOVUxMOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlpZiAoKCBkZXYgPT0gTlVMTCApIHx8ICggIW5ldGlmX2RldmljZV9wcmVzZW50KCBkZXYgKSkpIHsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCS8qIFNldCB0aGUgd2xfcHJpdmF0ZSBwb2ludGVyIChscCksIG5vdyB0aGF0IHdlIGtub3cgdGhhdCBkZXYgaXMgbm9uLW51bGwgKi8KKwlscCA9IHdsX3ByaXYoZGV2KTsKKworI2lmZGVmIFVTRV9SVFMKKwlpZiAoIGxwLT51c2VSVFMgPT0gMSApIHsKKwkJREJHX1BSSU5UKCAiRVhJVElORyBJU1IsIElOIFJUUyBNT0RFLi4uXG4iICk7CisJCXJldHVybjsKKwkJfQorI2VuZGlmICAvKiBVU0VfUlRTICovCisKKwkvKiBJZiB3ZSBoYXZlIGludGVycnVwdHMgcGVuZGluZywgdGhlbiBwdXQgdGhlbSBvbiBhIHN5c3RlbSB0YXNrCisJICAgcXVldWUuIE90aGVyd2lzZSB0dXJuIGludGVycnVwdHMgYmFjayBvbiAqLworCWV2ZW50cyA9IGhjZl9hY3Rpb24oICZscC0+aGNmQ3R4LCBIQ0ZfQUNUX0lOVF9PRkYgKTsKKworCWlmICggZXZlbnRzID09IEhDRl9JTlRfUEVORElORyApIHsKKwkJLyogU2NoZWR1bGUgdGhlIElTUiBoYW5kbGVyIGFzIGEgYm90dG9tLWhhbGYgdGFzayBpbiB0aGUKKwkJICAgdHFfaW1tZWRpYXRlIHF1ZXVlICovCisJCXRhc2tsZXRfc2NoZWR1bGUoJmxwLT50YXNrKTsKKwl9IGVsc2UgeworCQkvL0RCR19QUklOVCggIk5PVCBPVVIgSU5URVJSVVBUXG4iICk7CisJCWhjZl9hY3Rpb24oICZscC0+aGNmQ3R4LCBIQ0ZfQUNUX0lOVF9PTiApOworCX0KKworCXJldHVybiBJUlFfUkVUVkFMKGV2ZW50cyA9PSBIQ0ZfSU5UX1BFTkRJTkcpOworfSAvLyB3bF9pc3IKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2lzcl9oYW5kbGVyKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhlIElTUiBoYW5kbGVyLCBzY2hlZHVsZWQgdG8gcnVuIGluIGEgZGVmZXJyZWQgY29udGV4dCBieSB0aGUgSVNSLiBUaGlzCisgKiAgICAgIGlzIHdoZXJlIHRoZSBJU1IncyB3b3JrIGFjdHVhbGx5IGdldHMgZG9uZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgV1ZMQU5fTUFYX0lOVF9TRVJWSUNFUyAgNTAKKwordm9pZCB3bF9pc3JfaGFuZGxlciggdW5zaWduZWQgbG9uZyBwICkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAgICAgICAqZGV2OworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIGZsYWdzOworCWJvb2xfdCAgICAgICAgICAgICAgICAgIHN0b3AgPSBUUlVFOworCWludCAgICAgICAgICAgICAgICAgICAgIGNvdW50OworCWludCAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDsKKyAgICAgICAgc3RydWN0IHdsX3ByaXZhdGUgICAgICAgKmxwID0gKHN0cnVjdCB3bF9wcml2YXRlICopcDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlpZiAoIGxwID09IE5VTEwgKSB7CisJCURCR19QUklOVCggIndsX2lzcl9oYW5kbGVyICBscCBhZGFwdGVyIHBvaW50ZXIgaXMgTlVMTCEhIVxuIiApOworCX0gZWxzZSB7CisJCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworCQlkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilscC0+ZGV2OworCQlpZiAoIGRldiAhPSBOVUxMICYmIG5ldGlmX2RldmljZV9wcmVzZW50KCBkZXYgKSApIHN0b3AgPSBGQUxTRTsKKwkJZm9yKCBjb3VudCA9IDA7IHN0b3AgPT0gRkFMU0UgJiYgY291bnQgPCBXVkxBTl9NQVhfSU5UX1NFUlZJQ0VTOyBjb3VudCsrICkgeworCQkJc3RvcCA9IFRSVUU7CisJCQlyZXN1bHQgPSBoY2Zfc2VydmljZV9uaWMoICZscC0+aGNmQ3R4LAorCQkJCQkJCQkJICAod2NpX2J1ZnApbHAtPmxvb2tBaGVhZEJ1ZiwKKwkJCQkJCQkJCSAgc2l6ZW9mKCBscC0+bG9va0FoZWFkQnVmICkpOworCQkJaWYgKCByZXN1bHQgPT0gSENGX0VSUl9NSUMgKSB7CisJCQkJd2xfd2V4dF9ldmVudF9taWNfZmFpbGVkKCBkZXYgKTsgCS8qIFNlbmQgYW4gZXZlbnQgdGhhdCBNSUMgZmFpbGVkICovCisJCQkJLy87P3RoaXMgc2VlbXMgd3JvbmcgaWYgSENGX0VSUl9NSUMgY29pbmNpZGVzIHdpdGggYW5vdGhlciBldmVudCwgc3RvcCBnZXRzIEZBTFNFCisJCQkJLy9zbyB3aHkgbm90IGRvIGl0IGFsd2F5cyA7PworCQkJfQorCisjaWZuZGVmIFVTRV9NQk9YX1NZTkMKKwkJCWlmICggbHAtPmhjZkN0eC5JRkJfTUJJbmZvTGVuICE9IDAgKSB7CS8qIGFueXRoaW5nIGluIHRoZSBtYWlsYm94ICovCisJCQkJd2xfbWJ4KCBscCApOworCQkJCXN0b3AgPSBGQUxTRTsKKwkJCX0KKyNlbmRpZgorCQkJLyogQ2hlY2sgZm9yIGEgTGluayBzdGF0dXMgZXZlbnQgKi8KKwkJCWlmICggKCBscC0+aGNmQ3R4LklGQl9MaW5rU3RhdCAmIENGR19MSU5LX1NUQVRfRlcgKSAhPSAwICkgeworCQkJCXdsX3Byb2Nlc3NfbGlua19zdGF0dXMoIGxwICk7CisJCQkJc3RvcCA9IEZBTFNFOworCQkJfQorCQkJLyogQ2hlY2sgZm9yIHByb2JlIHJlc3BvbnNlIGV2ZW50cyAqLworCQkJaWYgKCBscC0+UHJvYmVSZXNwLmluZm9UeXBlICE9IDAgJiYKKwkJCQlscC0+UHJvYmVSZXNwLmluZm9UeXBlICE9IDB4RkZGRiApIHsKKwkJCQl3bF9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlKCBscCApOworCQkJCW1lbXNldCggJmxwLT5Qcm9iZVJlc3AsIDAsIHNpemVvZiggbHAtPlByb2JlUmVzcCApKTsKKwkJCQlscC0+UHJvYmVSZXNwLmluZm9UeXBlID0gMHhGRkZGOworCQkJCXN0b3AgPSBGQUxTRTsKKwkJCX0KKwkJCS8qIENoZWNrIGZvciB1cGRhdGVkIHJlY29yZCBldmVudHMgKi8KKwkJCWlmICggbHAtPnVwZGF0ZWRSZWNvcmQubGVuICE9IDB4RkZGRiApIHsKKwkJCQl3bF9wcm9jZXNzX3VwZGF0ZWRfcmVjb3JkKCBscCApOworCQkJCWxwLT51cGRhdGVkUmVjb3JkLmxlbiA9IDB4RkZGRjsKKwkJCQlzdG9wID0gRkFMU0U7CisJCQl9CisJCQkvKiBDaGVjayBmb3IgYXNzb2NpYXRpb24gc3RhdHVzIGV2ZW50cyAqLworCQkJaWYgKCBscC0+YXNzb2Nfc3RhdC5sZW4gIT0gMHhGRkZGICkgeworCQkJCXdsX3Byb2Nlc3NfYXNzb2Nfc3RhdHVzKCBscCApOworCQkJCWxwLT5hc3NvY19zdGF0LmxlbiA9IDB4RkZGRjsKKwkJCQlzdG9wID0gRkFMU0U7CisJCQl9CisJCQkvKiBDaGVjayBmb3Igc2VjdXJpdHkgc3RhdHVzIGV2ZW50cyAqLworCQkJaWYgKCBscC0+c2VjX3N0YXQubGVuICE9IDB4RkZGRiApIHsKKwkJCQl3bF9wcm9jZXNzX3NlY3VyaXR5X3N0YXR1cyggbHAgKTsKKwkJCQlscC0+c2VjX3N0YXQubGVuID0gMHhGRkZGOworCQkJCXN0b3AgPSBGQUxTRTsKKwkJCX0KKworI2lmZGVmIEVOQUJMRV9ETUEKKwkJCWlmICggbHAtPnVzZV9kbWEgKSB7CisJCQkJLyogQ2hlY2sgZm9yIERNQSBSeCBwYWNrZXRzICovCisJCQkJaWYgKCBscC0+aGNmQ3R4LklGQl9EbWFQYWNrZXRzICYgSFJFR19FVl9SRE1BRCApIHsKKwkJCQkJd2xfcnhfZG1hKCBkZXYgKTsKKwkJCQkJc3RvcCA9IEZBTFNFOworCQkJCX0KKwkJCQkvKiBSZXR1cm4gVHggRE1BIGRlc2NyaXB0b3JzIHRvIGhvc3QgKi8KKwkJCQlpZiAoIGxwLT5oY2ZDdHguSUZCX0RtYVBhY2tldHMgJiBIUkVHX0VWX1RETUFEICkgeworCQkJCQl3bF9wY2lfZG1hX2hjZl9yZWNsYWltX3R4KCBscCApOworCQkJCQlzdG9wID0gRkFMU0U7CisJCQkJfQorCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIEVOQUJMRV9ETUEKKwkJCXsKKwkJCQkvKiBDaGVjayBmb3IgUnggcGFja2V0cyAqLworCQkJCWlmICggbHAtPmhjZkN0eC5JRkJfUnhMZW4gIT0gMCApIHsKKwkJCQkJd2xfcngoIGRldiApOworCQkJCQlzdG9wID0gRkFMU0U7CisJCQkJfQorCQkJCS8qIE1ha2Ugc3VyZSB0aGF0IHF1ZXVlZCBmcmFtZXMgZ2V0IHNlbnQgKi8KKwkJCQlpZiAoIHdsX3NlbmQoIGxwICkpIHsKKwkJCQkJc3RvcCA9IEZBTFNFOworCQkJCX0KKwkJCX0KKwkJfQorCQkvKiBXZSdyZSBkb25lLCBzbyB0dXJuIGludGVycnVwdHMgd2hpY2ggd2VyZSB0dXJuZWQgb2ZmIGluIHdsX2lzciwgYmFjayBvbiAqLworCQloY2ZfYWN0aW9uKCAmbHAtPmhjZkN0eCwgSENGX0FDVF9JTlRfT04gKTsKKwkJd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisJfQorCXJldHVybjsKK30gLy8gd2xfaXNyX2hhbmRsZXIKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3JlbW92ZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIE5vdGlmeSB0aGUgYWRhcHRlciB0aGF0IGl0IGhhcyBiZWVuIHJlbW92ZWQuIFNpbmNlIHRoZSBhZGFwdGVyIGlzIGdvbmUsCisgKiAgd2Ugc2hvdWxkIG5vIGxvbmdlciB0cnkgdG8gdGFsayB0byBpdC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3JlbW92ZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJc3RydWN0IHdsX3ByaXZhdGUgICAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlEQkdfRlVOQyggIndsX3JlbW92ZSIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCURCR19QQVJBTSggRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldiApOworCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisJLyogc3RvcCBoYW5kbGluZyBpbnRlcnJ1cHRzICovCisJd2xfYWN0X2ludF9vZmYoIGxwICk7CisgICAgICAgIGxwLT5pc19oYW5kbGluZ19pbnQgPSBXTF9OT1RfSEFORExJTkdfSU5UOworCisJLyoKKyAgICAgICAgICogRGlzYWJsZSB0aGUgcG9ydHM6IGp1c3QgY2hhbmdlIHN0YXRlOiBzaW5jZSB0aGUKKyAgICAgICAgICogY2FyZCBpcyBnb25lIGl0IGlzIHVzZWxlc3MgdG8gdGFsayB0byBpdCBhbmQgYXQKKyAgICAgICAgICogZGlzY29ubmVjdCBhbGwgc3RhdGUgaW5mb3JtYXRpb24gaXMgbG9zdCBhbnl3YXkuCisgICAgICAgICAqLworCS8qIFJlc2V0IHBvcnRTdGF0ZSAqLworCWxwLT5wb3J0U3RhdGUgPSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEOworCisjaWYgMCAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAorI2lmZGVmIFVTRV9XRFMKKwkvL3dsX2Rpc2FibGVfd2RzX3BvcnRzKCBscCApOworI2VuZGlmIC8vIFVTRV9XRFMKKyNlbmRpZiAgLyogKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQICovCisKKwkvKiBNYXJrIHRoZSBkZXZpY2UgYXMgdW5yZWdpc3RlcmVkICovCisJbHAtPmlzX3JlZ2lzdGVyZWQgPSBGQUxTRTsKKworCS8qIERlcmVnaXN0ZXIgdGhlIFdEUyBwb3J0cyBhcyB3ZWxsICovCisJV0xfV0RTX05FVERFVl9ERVJFR0lTVEVSKCBscCApOworI2lmZGVmIFVTRV9SVFMKKwlpZiAoIGxwLT51c2VSVFMgPT0gMSApIHsKKwkJd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisKKwkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCXJldHVybjsKKwl9CisjZW5kaWYgIC8qIFVTRV9SVFMgKi8KKworCS8qIEluZm9ybSB0aGUgSENGIHRoYXQgdGhlIGNhcmQgaGFzIGJlZW4gcmVtb3ZlZCAqLworCWhjZl9jb25uZWN0KCAmbHAtPmhjZkN0eCwgSENGX0RJU0NPTk5FQ1QgKTsKKworCXdsX3VubG9jayggbHAsICZmbGFncyApOworCisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuOworfSAvLyB3bF9yZW1vdmUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3N1c3BlbmQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBQb3dlci1kb3duIGFuZCBoYWx0IHRoZSBhZGFwdGVyLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfc3VzcGVuZCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJc3RydWN0IHdsX3ByaXZhdGUgICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCURCR19GVU5DKCAid2xfc3VzcGVuZCIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCURCR19QQVJBTSggRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldiApOworCisJLyogVGhlIGFkYXB0ZXIgaXMgc3VzcGVuZGVkOgorCQkJU3RvcCB0aGUgYWRhcHRlcgorCQkJUG93ZXIgZG93bgorCSovCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHQgaGFuZGxpbmcgKi8KKwl3bF9hY3RfaW50X29mZiggbHAgKTsKKworCS8qIERpc2Nvbm5lY3QgKi8KKwl3bF9kaXNjb25uZWN0KCBscCApOworCisJLyogRGlzYWJsZSAqLworCXdsX2Rpc2FibGUoIGxwICk7CisKKyAgICAgICAgLyogRGlzY29ubmVjdCBmcm9tIHRoZSBhZGFwdGVyICovCisJaGNmX2Nvbm5lY3QoICZscC0+aGNmQ3R4LCBIQ0ZfRElTQ09OTkVDVCApOworCisJLyogUmVzZXQgcG9ydFN0YXRlIHRvIGJlIHN1cmUgKHNob3VsZCBoYXZlIGJlZW4gZG9uZSBieSB3bF9kaXNhYmxlICovCisJbHAtPnBvcnRTdGF0ZSA9IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQ7CisKKwl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybjsKK30gLy8gd2xfc3VzcGVuZAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcmVzdW1lKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgUmVzdW1lIGEgcHJldmlvdXNseSBzdXNwZW5kZWQgYWRhcHRlci4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3Jlc3VtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB3bF9wcml2YXRlICAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlEQkdfRlVOQyggIndsX3Jlc3VtZSIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCURCR19QQVJBTSggRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldiApOworCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgICAgIC8qIENvbm5lY3QgdG8gdGhlIGFkYXB0ZXIgKi8KKwloY2ZfY29ubmVjdCggJmxwLT5oY2ZDdHgsIGRldi0+YmFzZV9hZGRyICk7CisKKwkvKiBSZXNldCBwb3J0U3RhdGUgKi8KKwlscC0+cG9ydFN0YXRlID0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRDsKKworCS8qIFBvd2VyIG1pZ2h0IGhhdmUgYmVlbiBvZmYsIGFzc3VtZSB0aGUgY2FyZCBsb3N0IHRoZSBmaXJtd2FyZSovCisJbHAtPmZpcm13YXJlX3ByZXNlbnQgPSBXTF9GUklNV0FSRV9OT1RfUFJFU0VOVDsKKworCS8qIFJlbG9hZCB0aGUgZmlybXdhcmUgYW5kIHJlc3RhcnQgKi8KKwl3bF9yZXNldCggZGV2ICk7CisKKwkvKiBSZXN1bWUgaW50ZXJydXB0IGhhbmRsaW5nICovCisJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayggbHAsICZmbGFncyApOworCisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuOworfSAvLyB3bF9yZXN1bWUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3JlbGVhc2UoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIHBlcmZyb21zIGEgY2hlY2sgb24gdGhlIGRldmljZSBhbmQgY2FsbHMgd2xfcmVtb3ZlKCkgaWYKKyAqICBuZWNlc3NhcnkuIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFsbCBidXMgdHlwZXMsIGJ1dCBleGlzdHMgbW9zdGx5CisgKiAgZm9yIHRoZSBiZW5lZml0IG9mIHRoZSBDYXJkIFNlcnZpY2VzIGRyaXZlciwgYXMgdGhlcmUgYXJlIHRpbWVzIHdoZW4KKyAqICB3bF9yZW1vdmUoKSBkb2VzIG5vdCBnZXQgY2FsbGVkLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfcmVsZWFzZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJc3RydWN0IHdsX3ByaXZhdGUgICpscCA9IHdsX3ByaXYoZGV2KTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJREJHX0ZVTkMoICJ3bF9yZWxlYXNlIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJREJHX1BBUkFNKCBEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2ICk7CisJLyogSWYgd2xfcmVtb3ZlKCkgaGFzbid0IGJlZW4gY2FsbGVkIChpLmUuIHdoZW4gQ2FyZCBTZXJ2aWNlcyBpcyBzaHV0CisJICAgZG93biB3aXRoIHRoZSBjYXJkIGluIHRoZSBzbG90KSwgdGhlbiBjYWxsIGl0ICovCisJaWYgKCBscC0+aXNfcmVnaXN0ZXJlZCA9PSBUUlVFICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDYWxsaW5nIHVucmVnaXN0ZXJfbmV0ZGV2KCksIGFzIGl0IHdhc24ndCBjYWxsZWQgeWV0XG4iICk7CisJCXdsX3JlbW92ZSggZGV2ICk7CisKKwkJbHAtPmlzX3JlZ2lzdGVyZWQgPSBGQUxTRTsKKwl9CisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm47Cit9IC8vIHdsX3JlbGVhc2UKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2dldF9pcnFfbWFzaygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEFjY2Vzc29yIGZ1bmN0aW9uIHRvIHJldHJpZXZlIHRoZSBpcnFfbWFzayBtb2R1bGUgcGFyYW1ldGVyCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBOL0EKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIFRoZSBpcnFfbWFzayBtb2R1bGUgcGFyYW1ldGVyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BfdTE2IHdsX2dldF9pcnFfbWFzayggdm9pZCApCit7CisJcmV0dXJuIGlycV9tYXNrOworfSAvLyB3bF9nZXRfaXJxX21hc2sKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2dldF9pcnFfbGlzdCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEFjY2Vzc29yIGZ1bmN0aW9uIHRvIHJldHJpZXZlIHRoZSBpcnFfbGlzdCBtb2R1bGUgcGFyYW1ldGVyCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBOL0EKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIFRoZSBpcnFfbGlzdCBtb2R1bGUgcGFyYW1ldGVyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BfczggKiB3bF9nZXRfaXJxX2xpc3QoIHZvaWQgKQoreworCXJldHVybiBpcnFfbGlzdDsKK30gLy8gd2xfZ2V0X2lycV9saXN0CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2VuYWJsZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFVzZWQgdG8gZW5hYmxlIE1BQyBwb3J0cworICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgICAgICAtIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfZW5hYmxlKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworCWludCBoY2Zfc3RhdHVzID0gSENGX1NVQ0NFU1M7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCURCR19GVU5DKCAid2xfZW5hYmxlIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYgKCBscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRU5BQkxFRCApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiTm8gYWN0aW9uOiBDYXJkIGFscmVhZHkgZW5hYmxlZFxuIiApOworCX0gZWxzZSBpZiAoIGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9DT05ORUNURUQgKSB7CisJCS8vOz9zdXNwaWN1b3VzIGxvZ2ljLCBob3cgY2FuIHlvdSBiZSBjb25uZWN0ZWQgd2l0aG91dCBiZWluZyBlbmFibGVkIHNvIHRoaXMgaXMgcHJvYmFibHkgZGVhZCBjb2RlCisJCURCR19UUkFDRSggRGJnSW5mbywgIk5vIGFjdGlvbjogQ2FyZCBhbHJlYWR5IGNvbm5lY3RlZFxuIiApOworCX0gZWxzZSB7CisJCWhjZl9zdGF0dXMgPSBoY2ZfY250bCggJmxwLT5oY2ZDdHgsIEhDRl9DTlRMX0VOQUJMRSApOworCQlpZiAoIGhjZl9zdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CisJCQkvKiBTZXQgdGhlIHN0YXR1cyBvZiB0aGUgTklDIHRvIGVuYWJsZWQgKi8KKwkJCWxwLT5wb3J0U3RhdGUgPSBXVkxBTl9QT1JUX1NUQVRFX0VOQUJMRUQ7ICAgLy87P2JhZCBtbmVtb25pYywgTklDIGlzbyBQT1JUCisjaWZkZWYgRU5BQkxFX0RNQQorCQkJaWYgKCBscC0+dXNlX2RtYSApIHsKKwkJCQl3bF9wY2lfZG1hX2hjZl9zdXBwbHkoIGxwICk7ICAvLzs/YWx3YXlzIHN1Y2Nlcz8KKwkJCX0KKyNlbmRpZgorCQl9CisJfQorCWlmICggaGNmX3N0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApIHsgIC8vOz9tYWtlIHRoaXMgYW4gYXNzZXJ0CisJCURCR19UUkFDRSggRGJnSW5mbywgImZhaWxlZDogMHgleFxuIiwgaGNmX3N0YXR1cyApOworCX0KKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gaGNmX3N0YXR1czsKK30gLy8gd2xfZW5hYmxlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKyNpZmRlZiBVU0VfV0RTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfZW5hYmxlX3dkc19wb3J0cygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFVzZWQgdG8gZW5hYmxlIHRoZSBXRFMgTUFDIHBvcnRzIDEtNgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgICAgICAtIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX2VuYWJsZV93ZHNfcG9ydHMoIHN0cnVjdCB3bF9wcml2YXRlICogbHAgKQoreworCisJREJHX0ZVTkMoICJ3bF9lbmFibGVfd2RzX3BvcnRzIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfQVAgICl7CisJCURCR19FUlJPUiggRGJnSW5mbywgIiEhISE7PyBzb21lb25lIG1pc3VuZGVyc3Rvb2Qgc29tZXRoaW5nICEhISEhXG4iICk7CisJfQorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybjsKK30gLy8gd2xfZW5hYmxlX3dkc19wb3J0cworI2VuZGlmICAvKiBVU0VfV0RTICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9jb25uZWN0KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVXNlZCB0byBjb25uZWN0IGEgTUFDIHBvcnQKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAgICAgLSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX2Nvbm5lY3QoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisJaW50IGhjZl9zdGF0dXM7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJREJHX0ZVTkMoICJ3bF9jb25uZWN0IiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYgKCBscC0+cG9ydFN0YXRlICE9IFdWTEFOX1BPUlRfU1RBVEVfRU5BQkxFRCApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiTm8gYWN0aW9uOiBOb3QgaW4gZW5hYmxlZCBzdGF0ZVxuIiApOworCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJcmV0dXJuIEhDRl9TVUNDRVNTOworCX0KKwloY2Zfc3RhdHVzID0gaGNmX2NudGwoICZscC0+aGNmQ3R4LCBIQ0ZfQ05UTF9DT05ORUNUICk7CisJaWYgKCBoY2Zfc3RhdHVzID09IEhDRl9TVUNDRVNTICkgeworCQlscC0+cG9ydFN0YXRlID0gV1ZMQU5fUE9SVF9TVEFURV9DT05ORUNURUQ7CisJfQorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiBoY2Zfc3RhdHVzOworfSAvLyB3bF9jb25uZWN0CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9kaXNjb25uZWN0KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVXNlZCB0byBkaXNjb25uZWN0IGEgTUFDIHBvcnQKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAgICAgLSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX2Rpc2Nvbm5lY3QoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisJaW50IGhjZl9zdGF0dXM7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJREJHX0ZVTkMoICJ3bF9kaXNjb25uZWN0IiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYgKCBscC0+cG9ydFN0YXRlICE9IFdWTEFOX1BPUlRfU1RBVEVfQ09OTkVDVEVEICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJObyBhY3Rpb246IE5vdCBpbiBjb25uZWN0ZWQgc3RhdGVcbiIgKTsKKwkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCXJldHVybiBIQ0ZfU1VDQ0VTUzsKKwl9CisJaGNmX3N0YXR1cyA9IGhjZl9jbnRsKCAmbHAtPmhjZkN0eCwgSENGX0NOVExfRElTQ09OTkVDVCApOworCWlmICggaGNmX3N0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwkJbHAtPnBvcnRTdGF0ZSA9IFdWTEFOX1BPUlRfU1RBVEVfRU5BQkxFRDsKKwl9CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIGhjZl9zdGF0dXM7Cit9IC8vIHdsX2Rpc2Nvbm5lY3QKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2Rpc2FibGUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBVc2VkIHRvIGRpc2FibGUgTUFDIHBvcnRzCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgICAgIC0gcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICogICAgICBwb3J0ICAgIC0gdGhlIE1BQyBwb3J0IHRvIGRpc2FibGUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfZGlzYWJsZSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKwlpbnQgaGNmX3N0YXR1cyA9IEhDRl9TVUNDRVNTOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlEQkdfRlVOQyggIndsX2Rpc2FibGUiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZiAoIGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiTm8gYWN0aW9uOiBQb3J0IHN0YXRlIGlzIGRpc2FibGVkXG4iICk7CisJfSBlbHNlIHsKKwkJaGNmX3N0YXR1cyA9IGhjZl9jbnRsKCAmbHAtPmhjZkN0eCwgSENGX0NOVExfRElTQUJMRSApOworCQlpZiAoIGhjZl9zdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CisJCQkvKiBTZXQgdGhlIHN0YXR1cyBvZiB0aGUgcG9ydCB0byBkaXNhYmxlZCAqLyAvLzs/YmFkIG1uZW1vbmljIHVzZSBOSUMgaXNvIFBPUlQKKwkJCWxwLT5wb3J0U3RhdGUgPSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEOworCisjaWZkZWYgRU5BQkxFX0RNQQorCQkJaWYgKCBscC0+dXNlX2RtYSApIHsKKwkJCQl3bF9wY2lfZG1hX2hjZl9yZWNsYWltKCBscCApOworCQkJfQorI2VuZGlmCisJCX0KKwl9CisJaWYgKCBoY2Zfc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJmYWlsZWQ6IDB4JXhcbiIsIGhjZl9zdGF0dXMgKTsKKwl9CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIGhjZl9zdGF0dXM7Cit9IC8vIHdsX2Rpc2FibGUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworI2lmZGVmIFVTRV9XRFMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9kaXNhYmxlX3dkc19wb3J0cygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFVzZWQgdG8gZGlzYWJsZSB0aGUgV0RTIE1BQyBwb3J0cyAxLTYKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAgICAgLSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9kaXNhYmxlX3dkc19wb3J0cyggc3RydWN0IHdsX3ByaXZhdGUgKiBscCApCit7CisKKwlEQkdfRlVOQyggIndsX2Rpc2FibGVfd2RzX3BvcnRzIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19BUCAgKXsKKwkJREJHX0VSUk9SKCBEYmdJbmZvLCAiISEhITs/IHNvbWVvbmUgbWlzdW5kZXJzdG9vZCBzb21ldGhpbmcgISEhISFcbiIgKTsKKwl9CisvLyAJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19BUCAgKSB7CisvLyAJCXdsX2Rpc2FibGUoIGxwLCBIQ0ZfUE9SVF8xICk7CisvLyAJCXdsX2Rpc2FibGUoIGxwLCBIQ0ZfUE9SVF8yICk7CisvLyAJCXdsX2Rpc2FibGUoIGxwLCBIQ0ZfUE9SVF8zICk7CisvLyAJCXdsX2Rpc2FibGUoIGxwLCBIQ0ZfUE9SVF80ICk7CisvLyAJCXdsX2Rpc2FibGUoIGxwLCBIQ0ZfUE9SVF81ICk7CisvLyAJCXdsX2Rpc2FibGUoIGxwLCBIQ0ZfUE9SVF82ICk7CisvLyAJfQorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybjsKK30gLy8gd2xfZGlzYWJsZV93ZHNfcG9ydHMKKyNlbmRpZiAvLyBVU0VfV0RTCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKyNpZm5kZWYgVVNFX01CT1hfU1lOQworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX21ieCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlYWQgYW5kIHByb2Nlc3MgYSBtYWlsYm94IG1lc3NhZ2UuCisgKgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgICAgICAtIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIGFuIEhDRiBzdGF0dXMgY29kZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfbWJ4KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworCWludCBoY2Zfc3RhdHVzID0gSENGX1NVQ0NFU1M7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCURCR19GVU5DKCAid2xfbWJ4IiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCURCR19UUkFDRSggRGJnSW5mbywgIk1haWxib3ggSW5mbzogSUZCX01CSW5mb0xlbjogJWRcbiIsCisJCQkgICBscC0+aGNmQ3R4LklGQl9NQkluZm9MZW4gKTsKKworCW1lbXNldCggJiggbHAtPmx0dlJlY29yZCApLCAwLCBzaXplb2YoIGx0dl90ICkpOworCisJbHAtPmx0dlJlY29yZC5sZW4gPSBNQl9TSVpFOworCWxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX01CX0lORk87CisJaGNmX3N0YXR1cyA9IGhjZl9nZXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwlpZiAoIGhjZl9zdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7CisJCURCR19FUlJPUiggRGJnSW5mbywgImhjZl9nZXRfaW5mbyByZXR1cm5lZCAweCV4XG4iLCBoY2Zfc3RhdHVzICk7CisKKwkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCXJldHVybiBoY2Zfc3RhdHVzOworCX0KKworCWlmICggbHAtPmx0dlJlY29yZC50eXAgPT0gQ0ZHX01CX0lORk8gKSB7CisJCURCR19MRUFWRSggRGJnSW5mbyApOworCQlyZXR1cm4gaGNmX3N0YXR1czsKKwl9CisJLyogRW5kaWFuIHRyYW5zbGF0ZSB0aGUgbWFpbGJveCBkYXRhLCB0aGVuIHByb2Nlc3MgdGhlIG1lc3NhZ2UgKi8KKwl3bF9lbmRpYW5fdHJhbnNsYXRlX21haWxib3goICYoIGxwLT5sdHZSZWNvcmQgKSk7CisJd2xfcHJvY2Vzc19tYWlsYm94KCBscCApOworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiBoY2Zfc3RhdHVzOworfSAvLyB3bF9tYngKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2VuZGlhbl90cmFuc2xhdGVfbWFpbGJveCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gd2lsbCBwZXJmb3JtIHRoZSB0ZWRpb3VzIHRhc2sgb2YgZW5kaWFuIHRyYW5zbGF0aW5nIGFsbAorICogIGZpZWxkcyB3aXRodGluIGEgbWFpbGJveCBtZXNzYWdlIHdoaWNoIG5lZWQgdHJhbnNsYXRpbmcuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBsdHYgLSBwb2ludGVyIHRvIHRoZSBMVFYgdG8gZW5kaWFuIHRyYW5zbGF0ZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgbm9uZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX2VuZGlhbl90cmFuc2xhdGVfbWFpbGJveCggbHR2X3QgKmx0diApCit7CisKKwlEQkdfRlVOQyggIndsX2VuZGlhbl90cmFuc2xhdGVfbWFpbGJveCIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKwlzd2l0Y2goIGx0di0+dHlwICkgeworCSAgY2FzZSBDRkdfVEFMTElFUzoKKwkJYnJlYWs7CisKKwkgIGNhc2UgQ0ZHX1NDQU46CisJCXsKKwkJCWludCBudW1fYXBzOworCQkJU0NBTl9SU19TVFJDVCAqYXBzID0gKFNDQU5fUlNfU1RSQ1QgKikmbHR2LT51LnU4WzBdOworCisJCQludW1fYXBzID0gKGhjZl8xNikoKCAoc2l6ZV90KShsdHYtPmxlbiAtIDEgKSAqIDIgKSAvCisJCQkJCQkJCSAoIHNpemVvZiggU0NBTl9SU19TVFJDVCApKSk7CisKKwkJCXdoaWxlKCBudW1fYXBzID49IDEgKSB7CisJCQkJbnVtX2Fwcy0tOworCisJCQkJYXBzW251bV9hcHNdLmNoYW5uZWxfaWQgPQorCQkJCQlDTlZfTElUVExFX1RPX0lOVCggYXBzW251bV9hcHNdLmNoYW5uZWxfaWQgKTsKKworCQkJCWFwc1tudW1fYXBzXS5ub2lzZV9sZXZlbCA9CisJCQkJCUNOVl9MSVRUTEVfVE9fSU5UKCBhcHNbbnVtX2Fwc10ubm9pc2VfbGV2ZWwgKTsKKworCQkJCWFwc1tudW1fYXBzXS5zaWduYWxfbGV2ZWwgPQorCQkJCQlDTlZfTElUVExFX1RPX0lOVCggYXBzW251bV9hcHNdLnNpZ25hbF9sZXZlbCApOworCisJCQkJYXBzW251bV9hcHNdLmJlYWNvbl9pbnRlcnZhbF90aW1lID0KKwkJCQkJQ05WX0xJVFRMRV9UT19JTlQoIGFwc1tudW1fYXBzXS5iZWFjb25faW50ZXJ2YWxfdGltZSApOworCisJCQkJYXBzW251bV9hcHNdLmNhcGFiaWxpdHkgPQorCQkJCQlDTlZfTElUVExFX1RPX0lOVCggYXBzW251bV9hcHNdLmNhcGFiaWxpdHkgKTsKKworCQkJCWFwc1tudW1fYXBzXS5zc2lkX2xlbiA9CisJCQkJCUNOVl9MSVRUTEVfVE9fSU5UKCBhcHNbbnVtX2Fwc10uc3NpZF9sZW4gKTsKKworCQkJCWFwc1tudW1fYXBzXS5zc2lkX3ZhbFthcHNbbnVtX2Fwc10uc3NpZF9sZW5dID0gMDsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCSAgY2FzZSBDRkdfQUNTX1NDQU46CisJCXsKKwkJCVBST0JFX1JFU1AgKnByb2JlX3Jlc3AgPSAoUFJPQkVfUkVTUCAqKWx0djsKKworCQkJcHJvYmVfcmVzcC0+ZnJhbWVDb250cm9sICAgPSBDTlZfTElUVExFX1RPX0lOVCggcHJvYmVfcmVzcC0+ZnJhbWVDb250cm9sICk7CisJCQlwcm9iZV9yZXNwLT5kdXJJRCAgICAgICAgICA9IENOVl9MSVRUTEVfVE9fSU5UKCBwcm9iZV9yZXNwLT5kdXJJRCApOworCQkJcHJvYmVfcmVzcC0+c2VxdWVuY2UgICAgICAgPSBDTlZfTElUVExFX1RPX0lOVCggcHJvYmVfcmVzcC0+c2VxdWVuY2UgKTsKKwkJCXByb2JlX3Jlc3AtPmRhdGFMZW5ndGggICAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHByb2JlX3Jlc3AtPmRhdGFMZW5ndGggKTsKKyNpZm5kZWYgV0FSUAorCQkJcHJvYmVfcmVzcC0+bGVuVHlwZSAgICAgICAgPSBDTlZfTElUVExFX1RPX0lOVCggcHJvYmVfcmVzcC0+bGVuVHlwZSApOworI2VuZGlmIC8vIFdBUlAKKwkJCXByb2JlX3Jlc3AtPmJlYWNvbkludGVydmFsID0gQ05WX0xJVFRMRV9UT19JTlQoIHByb2JlX3Jlc3AtPmJlYWNvbkludGVydmFsICk7CisJCQlwcm9iZV9yZXNwLT5jYXBhYmlsaXR5ICAgICA9IENOVl9MSVRUTEVfVE9fSU5UKCBwcm9iZV9yZXNwLT5jYXBhYmlsaXR5ICk7CisJCQlwcm9iZV9yZXNwLT5mbGFncyAgICAgICAgICA9IENOVl9MSVRUTEVfVE9fSU5UKCBwcm9iZV9yZXNwLT5mbGFncyApOworCQl9CisJCWJyZWFrOworCisJICBjYXNlIENGR19MSU5LX1NUQVQ6CisjZGVmaW5lIGxzICgoTElOS19TVEFUVVNfU1RSQ1QgKilsdHYpCisJCQlscy0+bGlua1N0YXR1cyA9IENOVl9MSVRUTEVfVE9fSU5UKCBscy0+bGlua1N0YXR1cyApOworCQlicmVhazsKKyN1bmRlZiBscworCisJICBjYXNlIENGR19BU1NPQ19TVEFUOgorCQl7CisJCQlBU1NPQ19TVEFUVVNfU1RSQ1QgKmFzID0gKEFTU09DX1NUQVRVU19TVFJDVCAqKWx0djsKKworCQkJYXMtPmFzc29jU3RhdHVzID0gQ05WX0xJVFRMRV9UT19JTlQoIGFzLT5hc3NvY1N0YXR1cyApOworCQl9CisJCWJyZWFrOworCisJICBjYXNlIENGR19TRUNVUklUWV9TVEFUOgorCQl7CisJCQlTRUNVUklUWV9TVEFUVVNfU1RSQ1QgKnNzID0gKFNFQ1VSSVRZX1NUQVRVU19TVFJDVCAqKWx0djsKKworCQkJc3MtPnNlY3VyaXR5U3RhdHVzICA9IENOVl9MSVRUTEVfVE9fSU5UKCBzcy0+c2VjdXJpdHlTdGF0dXMgKTsKKwkJCXNzLT5yZWFzb24gICAgICAgICAgPSBDTlZfTElUVExFX1RPX0lOVCggc3MtPnJlYXNvbiApOworCQl9CisJCWJyZWFrOworCisJICBjYXNlIENGR19XTVA6CisJCWJyZWFrOworCisJICBjYXNlIENGR19OVUxMOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybjsKK30gLy8gd2xfZW5kaWFuX3RyYW5zbGF0ZV9tYWlsYm94CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcHJvY2Vzc19tYWlsYm94KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHByb2Nlc3MgdGhlIG1haWxib3ggZGF0YS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGx0diAtIHBvaW50ZXIgdG8gdGhlIExUViB0byBiZSBwcm9jZXNzZWQuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBub25lCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfcHJvY2Vzc19tYWlsYm94KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworCWx0dl90ICAgKmx0djsKKwloY2ZfMTYgIGx0dl92YWwgPSAweEZGRkY7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCURCR19GVU5DKCAid2xfcHJvY2Vzc19tYWlsYm94IiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCWx0diA9ICYoIGxwLT5sdHZSZWNvcmQgKTsKKworCXN3aXRjaCggbHR2LT50eXAgKSB7CisKKwkgIGNhc2UgQ0ZHX1RBTExJRVM6CisJCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19UQUxMSUVTXG4iICk7CisJCWJyZWFrOworCSAgY2FzZSBDRkdfU0NBTjoKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX1NDQU5cbiIgKTsKKworCQl7CisJCQlpbnQgbnVtX2FwczsKKwkJCVNDQU5fUlNfU1RSQ1QgKmFwcyA9IChTQ0FOX1JTX1NUUkNUICopJmx0di0+dS51OFswXTsKKworCQkJbnVtX2FwcyA9IChoY2ZfMTYpKCggKHNpemVfdCkobHR2LT5sZW4gLSAxICkgKiAyICkgLworCQkJCQkJCQkgKCBzaXplb2YoIFNDQU5fUlNfU1RSQ1QgKSkpOworCisJCQlscC0+c2Nhbl9yZXN1bHRzLm51bV9hcHMgPSBudW1fYXBzOworCisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJOdW1iZXIgb2YgQVBzOiAlZFxuIiwgbnVtX2FwcyApOworCisJCQl3aGlsZSggbnVtX2FwcyA+PSAxICkgeworCQkJCW51bV9hcHMtLTsKKworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIkFQICAgICAgICAgICAgICA6ICVkXG4iLCBudW1fYXBzICk7CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiPT09PT09PT09PT09PT09PT09PT09PT09PVxuIiApOworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIkNoYW5uZWwgSUQgICAgICA6IDB4JTA0eFxuIiwKKwkJCQkJCSAgIGFwc1tudW1fYXBzXS5jaGFubmVsX2lkICk7CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiTm9pc2UgTGV2ZWwgICAgIDogMHglMDR4XG4iLAorCQkJCQkJICAgYXBzW251bV9hcHNdLm5vaXNlX2xldmVsICk7CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiU2lnbmFsIExldmVsICAgIDogMHglMDR4XG4iLAorCQkJCQkJICAgYXBzW251bV9hcHNdLnNpZ25hbF9sZXZlbCApOworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIkJlYWNvbiBJbnRlcnZhbCA6IDB4JTA0eFxuIiwKKwkJCQkJCSAgIGFwc1tudW1fYXBzXS5iZWFjb25faW50ZXJ2YWxfdGltZSApOworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIkNhcGFiaWxpdHkgICAgICA6IDB4JTA0eFxuIiwKKwkJCQkJCSAgIGFwc1tudW1fYXBzXS5jYXBhYmlsaXR5ICk7CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiU1NJRCBMZW5ndGggICAgIDogMHglMDR4XG4iLAorCQkJCQkJICAgYXBzW251bV9hcHNdLnNzaWRfbGVuICk7CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQlNTSUQgICAgICAgICAgIDogJXNcbiIsCisJCQkJCQkgICBEYmdId0FkZHIoIGFwc1tudW1fYXBzXS5ic3NpZCApKTsKKworCQkJCWlmICggYXBzW251bV9hcHNdLnNzaWRfbGVuICE9IDAgKSB7CisJCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlNTSUQgICAgICAgICAgICA6ICVzLlxuIiwKKwkJCQkJCQkgICBhcHNbbnVtX2Fwc10uc3NpZF92YWwgKTsKKwkJCQl9IGVsc2UgeworCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTU0lEICAgICAgICAgICAgOiAlcy5cbiIsICJBTlkiICk7CisJCQkJfQorCisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiXG4iICk7CisKKwkJCQkvKiBDb3B5IHRoZSBpbmZvIHRvIHRoZSBTY2FuUmVzdWx0IHN0cnVjdHVyZSBpbiB0aGUgcHJpdmF0ZQorCQkJCSAgIGFkYXB0ZXIgc3RydWN0ICovCisJCQkJbWVtY3B5KCAmKCBscC0+c2Nhbl9yZXN1bHRzLkFQVGFibGVbbnVtX2Fwc10pLCAmKCBhcHNbbnVtX2Fwc10gKSwKKwkJCQkJCXNpemVvZiggU0NBTl9SU19TVFJDVCApKTsKKwkJCX0KKworCQkJLyogU2V0IHNjYW4gcmVzdWx0IHRvIHRydWUgc28gdGhhdCBhbnkgc2NhbiByZXF1ZXN0cyB3aWxsCisJCQkgICBjb21wbGV0ZSAqLworCQkJbHAtPnNjYW5fcmVzdWx0cy5zY2FuX2NvbXBsZXRlID0gVFJVRTsKKwkJfQorCisJCWJyZWFrOworCSAgY2FzZSBDRkdfQUNTX1NDQU46CisJCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19BQ1NfU0NBTlxuIiApOworCisJCXsKKwkJCVBST0JFX1JFU1AgICpwcm9iZV9yc3AgPSAoUFJPQkVfUkVTUCAqKWx0djsKKwkJCWhjZl84ICAgICAgICp3cGFfaWUgPSBOVUxMOworCQkJaGNmXzE2ICAgICAgd3BhX2llX2xlbiA9IDA7CisKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgPT09PT09PT09PT09PT09PT09PT09PT09PVxuIiwKKwkJCQkJICAgbHAtPmRldi0+bmFtZSApOworCisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGxlbmd0aCAgICAgIDogMHglMDR4LlxuIiwKKwkJCQkJICAgbHAtPmRldi0+bmFtZSwgcHJvYmVfcnNwLT5sZW5ndGggKTsKKworCQkJaWYgKCBwcm9iZV9yc3AtPmxlbmd0aCA+IDEgKSB7CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBpbmZvVHlwZSAgICA6IDB4JTA0eC5cbiIsCisJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBwcm9iZV9yc3AtPmluZm9UeXBlICk7CisKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIHNpZ25hbCAgICAgIDogMHglMDJ4LlxuIiwKKwkJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIHByb2JlX3JzcC0+c2lnbmFsICk7CisKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIHNpbGVuY2UgICAgIDogMHglMDJ4LlxuIiwKKwkJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIHByb2JlX3JzcC0+c2lsZW5jZSApOworCisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSByeEZsb3cgICAgICA6IDB4JTAyeC5cbiIsCisJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBwcm9iZV9yc3AtPnJ4RmxvdyApOworCisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSByYXRlICAgICAgICA6IDB4JTAyeC5cbiIsCisJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBwcm9iZV9yc3AtPnJhdGUgKTsKKworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgZnJhbWUgY250bCAgOiAweCUwNHguXG4iLAorCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgcHJvYmVfcnNwLT5mcmFtZUNvbnRyb2wgKTsKKworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgZHVySUQgICAgICAgOiAweCUwNHguXG4iLAorCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgcHJvYmVfcnNwLT5kdXJJRCApOworCisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBhZGRyZXNzMSAgICA6ICVzXG4iLAorCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgRGJnSHdBZGRyKCBwcm9iZV9yc3AtPmFkZHJlc3MxICkpOworCisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBhZGRyZXNzMiAgICA6ICVzXG4iLAorCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgRGJnSHdBZGRyKCBwcm9iZV9yc3AtPmFkZHJlc3MyICkpOworCisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBCU1NJRCAgICAgICA6ICVzXG4iLAorCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgRGJnSHdBZGRyKCBwcm9iZV9yc3AtPkJTU0lEICkpOworCisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBzZXF1ZW5jZSAgICA6IDB4JTA0eC5cbiIsCisJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBwcm9iZV9yc3AtPnNlcXVlbmNlICk7CisKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGFkZHJlc3M0ICAgIDogJXNcbiIsCisJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBEYmdId0FkZHIoIHByb2JlX3JzcC0+YWRkcmVzczQgKSk7CisKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGRhdGFsZW5ndGggIDogMHglMDR4LlxuIiwKKwkJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIHByb2JlX3JzcC0+ZGF0YUxlbmd0aCApOworCisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBEQSAgICAgICAgICA6ICVzXG4iLAorCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgRGJnSHdBZGRyKCBwcm9iZV9yc3AtPkRBICkpOworCisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBTQSAgICAgICAgICA6ICVzXG4iLAorCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgRGJnSHdBZGRyKCBwcm9iZV9yc3AtPlNBICkpOworCisJCQkJLy9EQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGxlblR5cGUgICAgIDogMHglMDR4LlxuIiwKKwkJCQkvLyAgICAgICAgICAgbHAtPmRldi0+bmFtZSwgcHJvYmVfcnNwLT5sZW5UeXBlICk7CisKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIHRpbWVTdGFtcCAgIDogJXNcbiIsCisJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBEYmdId0FkZHIoIHByb2JlX3JzcC0+dGltZVN0YW1wICkpOworCisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBiZWFjb25JbnQgICA6IDB4JTA0eC5cbiIsCisJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBwcm9iZV9yc3AtPmJlYWNvbkludGVydmFsICk7CisKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGNhcGFiaWxpdHkgIDogMHglMDR4LlxuIiwKKwkJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIHByb2JlX3JzcC0+Y2FwYWJpbGl0eSApOworCisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBTU0lEIGxlbiAgICA6IDB4JTA0eC5cbiIsCisJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBwcm9iZV9yc3AtPnJhd0RhdGFbMV0gKTsKKworCQkJCWlmICggcHJvYmVfcnNwLT5yYXdEYXRhWzFdID4gMCApIHsKKwkJCQkJY2hhciBzc2lkW0hDRl9NQVhfTkFNRV9MRU5dOworCisJCQkJCW1lbXNldCggc3NpZCwgMCwgc2l6ZW9mKCBzc2lkICkpOworCQkJCQlzdHJuY3B5KCBzc2lkLCAmcHJvYmVfcnNwLT5yYXdEYXRhWzJdLAorCQkJCQkJCSBwcm9iZV9yc3AtPnJhd0RhdGFbMV0gKTsKKworCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIFNTSUQgICAgICAgIDogJXNcbiIsCisJCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgc3NpZCApOworCQkJCX0KKworCQkJCS8qIFBhcnNlIG91dCB0aGUgV1BBLUlFLCBpZiBvbmUgZXhpc3RzICovCisJCQkJd3BhX2llID0gd2xfcGFyc2Vfd3BhX2llKCBwcm9iZV9yc3AsICZ3cGFfaWVfbGVuICk7CisJCQkJaWYgKCB3cGFfaWUgIT0gTlVMTCApIHsKKwkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBXUEEtSUUgICAgICA6ICVzXG4iLAorCQkJCQlscC0+ZGV2LT5uYW1lLCB3bF9wcmludF93cGFfaWUoIHdwYV9pZSwgd3BhX2llX2xlbiApKTsKKwkJCQl9CisKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGZsYWdzICAgICAgIDogMHglMDR4LlxuIiwKKwkJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIHByb2JlX3JzcC0+ZmxhZ3MgKTsKKwkJCX0KKworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiXG5cbiIgKTsKKwkJCS8qIElmIHByb2JlIHJlc3BvbnNlIGxlbmd0aCBpcyAxLCB0aGVuIHRoZSBzY2FuIGlzIGNvbXBsZXRlICovCisJCQlpZiAoIHByb2JlX3JzcC0+bGVuZ3RoID09IDEgKSB7CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiU0NBTiBDT01QTEVURVxuIiApOworCQkJCWxwLT5wcm9iZV9yZXN1bHRzLm51bV9hcHMgPSBscC0+cHJvYmVfbnVtX2FwczsKKwkJCQlscC0+cHJvYmVfcmVzdWx0cy5zY2FuX2NvbXBsZXRlID0gVFJVRTsKKworCQkJCS8qIFJlc2V0IHRoZSBjb3VudGVyIGZvciB0aGUgbmV4dCBzY2FuIHJlcXVlc3QgKi8KKwkJCQlscC0+cHJvYmVfbnVtX2FwcyA9IDA7CisKKwkJCQkvKiBTZW5kIGEgd2lyZWxlc3MgZXh0ZW5zaW9ucyBldmVudCB0aGF0IHRoZSBzY2FuIGNvbXBsZXRlZCAqLworCQkJCXdsX3dleHRfZXZlbnRfc2Nhbl9jb21wbGV0ZSggbHAtPmRldiApOworCQkJfSBlbHNlIHsKKwkJCQkvKiBPbmx5IGNvcHkgdG8gdGhlIHRhYmxlIGlmIHRoZSBlbnRyeSBpcyB1bmlxdWU7IEFQcyBzb21ldGltZXMKKwkJCQkgICByZXNwb25kIG1vcmUgdGhhbiBvbmNlIHRvIGEgcHJvYmUgKi8KKwkJCQlpZiAoIGxwLT5wcm9iZV9udW1fYXBzID09IDAgKSB7CisJCQkJCS8qIENvcHkgdGhlIGluZm8gdG8gdGhlIFNjYW5SZXN1bHQgc3RydWN0dXJlIGluIHRoZSBwcml2YXRlCisJCQkJCWFkYXB0ZXIgc3RydWN0ICovCisJCQkJCW1lbWNweSggJiggbHAtPnByb2JlX3Jlc3VsdHMuUHJvYmVUYWJsZVtscC0+cHJvYmVfbnVtX2Fwc10gKSwKKwkJCQkJCQlwcm9iZV9yc3AsIHNpemVvZiggUFJPQkVfUkVTUCApKTsKKworCQkJCQkvKiBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiBBUHMgZGV0ZWN0ZWQgKi8KKwkJCQkJbHAtPnByb2JlX251bV9hcHMrKzsKKwkJCQl9IGVsc2UgeworCQkJCQlpbnQgY291bnQ7CisJCQkJCWludCB1bmlxdWUgPSAxOworCisJCQkJCWZvciggY291bnQgPSAwOyBjb3VudCA8IGxwLT5wcm9iZV9udW1fYXBzOyBjb3VudCsrICkgeworCQkJCQkJaWYgKCBtZW1jbXAoICYoIHByb2JlX3JzcC0+QlNTSUQgKSwKKwkJCQkJCQlscC0+cHJvYmVfcmVzdWx0cy5Qcm9iZVRhYmxlW2NvdW50XS5CU1NJRCwKKwkJCQkJCQlFVEhfQUxFTiApID09IDAgKSB7CisJCQkJCQkJdW5pcXVlID0gMDsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWlmICggdW5pcXVlICkgeworCQkJCQkJLyogQ29weSB0aGUgaW5mbyB0byB0aGUgU2NhblJlc3VsdCBzdHJ1Y3R1cmUgaW4gdGhlCisJCQkJCQlwcml2YXRlIGFkYXB0ZXIgc3RydWN0LiBPbmx5IGNvcHkgaWYgdGhlcmUncyByb29tIGluIHRoZQorCQkJCQkJdGFibGUgKi8KKwkJCQkJCWlmICggbHAtPnByb2JlX251bV9hcHMgPCBNQVhfTkFQUyApCisJCQkJCQl7CisJCQkJCQkJbWVtY3B5KCAmKCBscC0+cHJvYmVfcmVzdWx0cy5Qcm9iZVRhYmxlW2xwLT5wcm9iZV9udW1fYXBzXSApLAorCQkJCQkJCQkJcHJvYmVfcnNwLCBzaXplb2YoIFBST0JFX1JFU1AgKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICJOdW0gb2Ygc2NhbiByZXN1bHRzIGV4Y2VlZHMgc3RvcmFnZSwgdHJ1bmNhdGluZ1xuIiApOworCQkJCQkJfQorCisJCQkJCQkvKiBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiBBUHMgZGV0ZWN0ZWQuIE5vdGUgSSBkbyB0aGlzCisJCQkJCQkgICBoZXJlIGV2ZW4gd2hlbiBJIGRvbid0IGNvcHkgdGhlIHByb2JlIHJlc3BvbnNlIHRvIHRoZQorCQkJCQkJICAgYnVmZmVyIGluIG9yZGVyIHRvIGRldGVjdCB0aGUgb3ZlcmZsb3cgY29uZGl0aW9uICovCisJCQkJCQlscC0+cHJvYmVfbnVtX2FwcysrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJYnJlYWs7CisKKwkgIGNhc2UgQ0ZHX0xJTktfU1RBVDoKKyNkZWZpbmUgbHMgKChMSU5LX1NUQVRVU19TVFJDVCAqKWx0dikKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX0xJTktfU1RBVFxuIiApOworCisJCXN3aXRjaCggbHMtPmxpbmtTdGF0dXMgKSB7CisJCSAgY2FzZSAxOgorCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiTGluayBTdGF0dXMgOiBDb25uZWN0ZWRcbiIgKTsKKwkJCXdsX3dleHRfZXZlbnRfYXAoIGxwLT5kZXYgKTsKKwkJCWJyZWFrOworCisJCSAgY2FzZSAyOgorCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiTGluayBTdGF0dXMgOiBEaXNjb25uZWN0ZWRcbiIgICk7CisJCQlicmVhazsKKworCQkgIGNhc2UgMzoKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIkxpbmsgU3RhdHVzIDogQWNjZXNzIFBvaW50IENoYW5nZVxuIiApOworCQkJYnJlYWs7CisKKwkJICBjYXNlIDQ6CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJMaW5rIFN0YXR1cyA6IEFjY2VzcyBQb2ludCBPdXQgb2YgUmFuZ2VcbiIgKTsKKwkJCWJyZWFrOworCisJCSAgY2FzZSA1OgorCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiTGluayBTdGF0dXMgOiBBY2Nlc3MgUG9pbnQgSW4gUmFuZ2VcbiIgKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJMaW5rIFN0YXR1cyA6IFVOS05PV04gKDB4JTA0eClcbiIsCisJCQkJCSAgIGxzLT5saW5rU3RhdHVzICk7CisJCQlicmVhazsKKwkJfQorCisJCWJyZWFrOworI3VuZGVmIGxzCisKKwkgIGNhc2UgQ0ZHX0FTU09DX1NUQVQ6CisJCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19BU1NPQ19TVEFUXG4iICk7CisKKwkJeworCQkJQVNTT0NfU1RBVFVTX1NUUkNUICphcyA9IChBU1NPQ19TVEFUVVNfU1RSQ1QgKilsdHY7CisKKwkJCXN3aXRjaCggYXMtPmFzc29jU3RhdHVzICkgeworCQkJICBjYXNlIDE6CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQXNzb2NpYXRpb24gU3RhdHVzIDogU1RBIEFzc29jaWF0ZWRcbiIgKTsKKwkJCQlicmVhazsKKworCQkJICBjYXNlIDI6CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQXNzb2NpYXRpb24gU3RhdHVzIDogU1RBIFJlYXNzb2NpYXRlZFxuIiApOworCQkJCWJyZWFrOworCisJCQkgIGNhc2UgMzoKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJBc3NvY2lhdGlvbiBTdGF0dXMgOiBTVEEgRGlzYXNzb2NpYXRlZFxuIiApOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCURCR19UUkFDRSggRGJnSW5mbywgIkFzc29jaWF0aW9uIFN0YXR1cyA6IFVOS05PV04gKDB4JTA0eClcbiIsCisJCQkJCQkgICBhcy0+YXNzb2NTdGF0dXMgKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiU1RBIEFkZHJlc3MgICAgICAgIDogJXNcbiIsCisJCQkJCSAgIERiZ0h3QWRkciggYXMtPnN0YUFkZHIgKSk7CisKKwkJCWlmICgoIGFzLT5hc3NvY1N0YXR1cyA9PSAyICkgICYmICggYXMtPmxlbiA9PSA4ICkpIHsKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJPbGQgQVAgQWRkcmVzcyAgICAgOiAlc1xuIiwKKwkJCQkJCSAgIERiZ0h3QWRkciggYXMtPm9sZEFwQWRkciApKTsKKwkJCX0KKwkJfQorCisJCWJyZWFrOworCisJICBjYXNlIENGR19TRUNVUklUWV9TVEFUOgorCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfU0VDVVJJVFlfU1RBVFxuIiApOworCisJCXsKKwkJCVNFQ1VSSVRZX1NUQVRVU19TVFJDVCAqc3MgPSAoU0VDVVJJVFlfU1RBVFVTX1NUUkNUICopbHR2OworCisJCQlzd2l0Y2goIHNzLT5zZWN1cml0eVN0YXR1cyApIHsKKwkJCSAgY2FzZSAxOgorCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlNlY3VyaXR5IFN0YXR1cyA6IERpc3Nhc3NvY2lhdGUgW0FQXVxuIiApOworCQkJCWJyZWFrOworCisJCQkgIGNhc2UgMjoKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTZWN1cml0eSBTdGF0dXMgOiBEZWF1dGhlbnRpY2F0ZSBbQVBdXG4iICk7CisJCQkJYnJlYWs7CisKKwkJCSAgY2FzZSAzOgorCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlNlY3VyaXR5IFN0YXR1cyA6IEF1dGhlbnRpY2F0ZSBGYWlsIFtTVEFdIG9yIFtBUF1cbiIgKTsKKwkJCQlicmVhazsKKworCQkJICBjYXNlIDQ6CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiU2VjdXJpdHkgU3RhdHVzIDogTUlDIEZhaWxcbiIgKTsKKwkJCQlicmVhazsKKworCQkJICBjYXNlIDU6CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiU2VjdXJpdHkgU3RhdHVzIDogQXNzb2NpYXRlIEZhaWxcbiIgKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTZWN1cml0eSBTdGF0dXMgOiBVTktOT1dOICVkXG4iLAorCQkJCQkJICAgc3MtPnNlY3VyaXR5U3RhdHVzICk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIlNUQSBBZGRyZXNzICAgICA6ICVzXG4iLCBEYmdId0FkZHIoIHNzLT5zdGFBZGRyICkpOworCisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJSZWFzb24gICAgICAgICAgOiAweCUwNHggXG4iLCBzcy0+cmVhc29uICk7CisJCX0KKworCQlicmVhazsKKworCSAgY2FzZSBDRkdfV01QOgorCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfV01QLCBzaXplIGlzICVkIGJ5dGVzXG4iLCBsdHYtPmxlbiApOworCQl7CisJCQlXTVBfUlNQX1NUUkNUICp3bXBfcnNwID0gKFdNUF9SU1BfU1RSQ1QgKilsdHY7CisKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19XTVAsIHBkdSB0eXBlIGlzIDB4JXhcbiIsCisJCQkJCSAgIHdtcF9yc3AtPndtcFJzcC53bXBIZHIudHlwZSApOworCisJCQlzd2l0Y2goIHdtcF9yc3AtPndtcFJzcC53bXBIZHIudHlwZSApIHsKKwkJCSAgY2FzZSBXVkxBTl9XTVBfUERVX1RZUEVfTFRfUlNQOgorCQkJCXsKKyNpZiBEQkcKKwkJCQkJTElOS1RFU1RfUlNQX1NUUkNUICAqbHRfcnNwID0gKExJTktURVNUX1JTUF9TVFJDVCAqKWx0djsKKyNlbmRpZiAvLyBEQkcKKwkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiTElOSyBURVNUIFJFU1VMVFxuIiApOworCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICI9PT09PT09PT09PT09PT09XG4iICk7CisJCQkJCURCR19UUkFDRSggRGJnSW5mbywgIkxlbmd0aCAgICAgICAgOiAlZC5cbiIsICAgICBsdF9yc3AtPmxlbiApOworCisJCQkJCURCR19UUkFDRSggRGJnSW5mbywgIk5hbWUgICAgICAgICAgOiAlcy5cbiIsICAgICBsdF9yc3AtPmx0UnNwLmx0UnNwLm5hbWUgKTsKKwkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiU2lnbmFsIExldmVsICA6IDB4JTAyeC5cbiIsIGx0X3JzcC0+bHRSc3AubHRSc3Auc2lnbmFsICk7CisJCQkJCURCR19UUkFDRSggRGJnSW5mbywgIk5vaXNlICBMZXZlbCAgOiAweCUwMnguXG4iLCBsdF9yc3AtPmx0UnNwLmx0UnNwLm5vaXNlICk7CisJCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlJlY2VpdmUgRmxvdyAgOiAweCUwMnguXG4iLCBsdF9yc3AtPmx0UnNwLmx0UnNwLnJ4RmxvdyApOworCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJEYXRhIFJhdGUgICAgIDogMHglMDJ4LlxuIiwgbHRfcnNwLT5sdFJzcC5sdFJzcC5kYXRhUmF0ZSApOworCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJQcm90b2NvbCAgICAgIDogMHglMDR4LlxuIiwgbHRfcnNwLT5sdFJzcC5sdFJzcC5wcm90b2NvbCApOworCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTdGF0aW9uICAgICAgIDogMHglMDJ4LlxuIiwgbHRfcnNwLT5sdFJzcC5sdFJzcC5zdGF0aW9uICk7CisJCQkJCURCR19UUkFDRSggRGJnSW5mbywgIkRhdGEgUmF0ZSBDYXAgOiAweCUwMnguXG4iLCBsdF9yc3AtPmx0UnNwLmx0UnNwLmRhdGFSYXRlQ2FwICk7CisKKwkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiUG93ZXIgTWdtdCAgICA6IDB4JTAyeCAweCUwMnggMHglMDJ4IDB4JTAyeC5cbiIsCisJCQkJCQkJCWx0X3JzcC0+bHRSc3AubHRSc3AucG93ZXJNZ210WzBdLAorCQkJCQkJCQlsdF9yc3AtPmx0UnNwLmx0UnNwLnBvd2VyTWdtdFsxXSwKKwkJCQkJCQkJbHRfcnNwLT5sdFJzcC5sdFJzcC5wb3dlck1nbXRbMl0sCisJCQkJCQkJCWx0X3JzcC0+bHRSc3AubHRSc3AucG93ZXJNZ210WzNdICk7CisKKwkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiUm9idXN0bmVzcyAgICA6IDB4JTAyeCAweCUwMnggMHglMDJ4IDB4JTAyeC5cbiIsCisJCQkJCQkJCWx0X3JzcC0+bHRSc3AubHRSc3Aucm9idXN0bmVzc1swXSwKKwkJCQkJCQkJbHRfcnNwLT5sdFJzcC5sdFJzcC5yb2J1c3RuZXNzWzFdLAorCQkJCQkJCQlsdF9yc3AtPmx0UnNwLmx0UnNwLnJvYnVzdG5lc3NbMl0sCisJCQkJCQkJCWx0X3JzcC0+bHRSc3AubHRSc3Aucm9idXN0bmVzc1szXSApOworCisJCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlNjYWxpbmcgICAgICAgOiAweCUwMnguXG4iLCBsdF9yc3AtPmx0UnNwLmx0UnNwLnNjYWxpbmcgKTsKKwkJCQl9CisKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWJyZWFrOworCisJICBjYXNlIENGR19OVUxMOgorCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfTlVMTFxuIiApOworCQlicmVhazsKKworCSAgY2FzZSBDRkdfVVBEQVRFRF9JTkZPX1JFQ09SRDogICAgICAgIC8vIFVwZGF0ZWQgSW5mb3JtYXRpb24gUmVjb3JkCisJCURCR19UUkFDRSggRGJnSW5mbywgIlVQREFURUQgSU5GT1JNQVRJT04gUkVDT1JEXG4iICk7CisKKwkJbHR2X3ZhbCA9IENOVl9JTlRfVE9fTElUVExFKCBsdHYtPnUudTE2WzBdICk7CisKKwkJLyogQ2hlY2sgYW5kIHNlZSB3aGljaCBSSUQgd2FzIHVwZGF0ZWQgKi8KKwkJc3dpdGNoKCBsdHZfdmFsICkgeworCQkgIGNhc2UgQ0ZHX0NVUl9DT1VOVFJZX0lORk86ICAvLyBJbmRpY2F0ZSBQYXNzaXZlIFNjYW4gQ29tcGxldGlvbgorCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiVXBkYXRlZCBjb3VudHJ5IGluZm9cbiIgKTsKKworCQkJLyogRG8gSSBuZWVkIHRvIGhvbGQgb2ZmIG9uIHVwZGF0aW5nIFJJRHMgdW50aWwgdGhlIHByb2Nlc3MgaXMKKwkJCSAgIGNvbXBsZXRlPyAqLworCQkJd2xfY29ubmVjdCggbHAgKTsKKwkJCWJyZWFrOworCisJCSAgY2FzZSBDRkdfUE9SVF9TVEFUOiAgICAvLyBXYWl0IGZvciBDb25uZWN0IEV2ZW50CisJCQkvL3dsX2Nvbm5lY3QoIGxwICk7CisKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIlVua25vd24gUklEOiAweCUwNHhcbiIsIGx0dl92YWwgKTsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiVU5LTk9XTiBNRVNTQUdFOiAweCUwNHhcbiIsIGx0di0+dHlwICk7CisJCWJyZWFrOworCX0KKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm47Cit9IC8vIHdsX3Byb2Nlc3NfbWFpbGJveAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNlbmRpZiAgLyogaWZuZGVmIFVTRV9NQk9YX1NZTkMgKi8KKworI2lmZGVmIFVTRV9XRFMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF93ZHNfbmV0ZGV2X3JlZ2lzdGVyKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgbmV0X2RldmljZSBzdHJ1Y3R1cmVzIHdpdGggdGhlIHN5c3RlbSdzIG5ldHdvcmsKKyAqICAgICAgbGF5ZXIgZm9yIHVzZSB3aXRoIHRoZSBXRFMgcG9ydHMuCisgKgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgICAgICAtIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3dkc19uZXRkZXZfcmVnaXN0ZXIoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisJaW50IGNvdW50OworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlEQkdfRlVOQyggIndsX3dkc19uZXRkZXZfcmVnaXN0ZXIiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisJLy87P3doeSBpcyB0aGVyZSBubyBVU0VfV0RTIGNsYXVzZSBsaWtlIGluIHdsX2VuYWJsZV93ZHNfcG9ydHMKKwlpZiAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX0FQICApIHsKKwkJZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKKwkJCWlmICggV1ZMQU5fVkFMSURfTUFDX0FERFJFU1MoIGxwLT53ZHNfcG9ydFtjb3VudF0ud2RzQWRkcmVzcyApKSB7CisJCQkJaWYgKCByZWdpc3Rlcl9uZXRkZXYoIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ICkgIT0gMCApIHsKKwkJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICJuZXQgZGV2aWNlIGZvciBXRFMgcG9ydCAlZCBjb3VsZCBub3QgYmUgcmVnaXN0ZXJlZFxuIiwKKwkJCQkJCQkJKCBjb3VudCArIDEgKSk7CisJCQkJfQorCQkJCWxwLT53ZHNfcG9ydFtjb3VudF0uaXNfcmVnaXN0ZXJlZCA9IFRSVUU7CisKKwkJCQkvKiBGaWxsIG91dCB0aGUgbmV0X2RldmljZSBzdHJ1Y3RzIHdpdGggdGhlIE1BQyBhZGRyICovCisJCQkJbWVtY3B5KCBscC0+d2RzX3BvcnRbY291bnRdLmRldi0+ZGV2X2FkZHIsIGxwLT5NQUNBZGRyZXNzLCBFVEhfQUxFTiApOworCQkJCWxwLT53ZHNfcG9ydFtjb3VudF0uZGV2LT5hZGRyX2xlbiA9IEVUSF9BTEVOOworCQkJfQorCQl9CisJfQorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybjsKK30gLy8gd2xfd2RzX25ldGRldl9yZWdpc3RlcgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfd2RzX25ldGRldl9kZXJlZ2lzdGVyKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBkZXJlZ2lzdGVycyB0aGUgV0RTIG5ldF9kZXZpY2Ugc3RydWN0dXJlcyB1c2VkIGJ5IHRoZQorICogICAgICBzeXN0ZW0ncyBuZXR3b3JrIGxheWVyLgorICoKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAgICAgLSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF93ZHNfbmV0ZGV2X2RlcmVnaXN0ZXIoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisJaW50IGNvdW50OworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlEQkdfRlVOQyggIndsX3dkc19uZXRkZXZfZGVyZWdpc3RlciIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKwlpZiAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX0FQICApIHsKKwkJZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKKwkJCWlmICggV1ZMQU5fVkFMSURfTUFDX0FERFJFU1MoIGxwLT53ZHNfcG9ydFtjb3VudF0ud2RzQWRkcmVzcyApKSB7CisJCQkJdW5yZWdpc3Rlcl9uZXRkZXYoIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ICk7CisJCQl9CisJCQlscC0+d2RzX3BvcnRbY291bnRdLmlzX3JlZ2lzdGVyZWQgPSBGQUxTRTsKKwkJfQorCX0KKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm47Cit9IC8vIHdsX3dkc19uZXRkZXZfZGVyZWdpc3RlcgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNlbmRpZiAgLyogVVNFX1dEUyAqLworCisKKyNpZiAwIC8vU0NVTExfVVNFX1BST0MgLyogZG9uJ3Qgd2FzdGUgc3BhY2UgaWYgdW51c2VkICovCisvKgorICogVGhlIHByb2MgZmlsZXN5c3RlbTogZnVuY3Rpb24gdG8gcmVhZCBhbmQgZW50cnkKKyAqLworaW50IHByaW50Zl9oY2ZfMTYoIGNoYXIgKnMsIGNoYXIgKmJ1ZiwgaGNmXzE2KiBwLCBpbnQgbiApOworaW50IHByaW50Zl9oY2ZfMTYoIGNoYXIgKnMsIGNoYXIgKmJ1ZiwgaGNmXzE2KiBwLCBpbnQgbiApIHsKKworaW50IGksIGxlbjsKKworCWxlbiA9IHNwcmludGYoYnVmLCAiJXMiLCBzICk7CisJd2hpbGUgKCBsZW4gPCAyMCApIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICIgIiApOworCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIjogIiApOworCWZvciAoIGkgPSAwOyBpIDwgbjsgaSsrICkgeworCQlpZiAoIGxlbiAlIDgwID4gNzUgKSB7CisJCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJcbiIgKTsKKwkJfQorCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCIlMDRYICIsIHBbaV0gKTsKKwl9CisJbGVuICs9IHNwcmludGYoYnVmK2xlbiwiXG4iICk7CisJcmV0dXJuIGxlbjsKK30gLy8gcHJpbnRmX2hjZl8xNgorCitpbnQgcHJpbnRmX2hjZl84KCBjaGFyICpzLCBjaGFyICpidWYsIGhjZl84KiBwLCBpbnQgbiApOworaW50IHByaW50Zl9oY2ZfOCggY2hhciAqcywgY2hhciAqYnVmLCBoY2ZfOCogcCwgaW50IG4gKSB7CisKK2ludCBpLCBsZW47CisKKwlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVzIiwgcyApOworCXdoaWxlICggbGVuIDwgMjAgKSBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiICIgKTsKKwlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCI6ICIgKTsKKwlmb3IgKCBpID0gMDsgaSA8PSBuOyBpKysgKSB7CisJCWlmICggbGVuICUgODAgPiA3NyApIHsKKwkJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlxuIiApOworCQl9CisJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIiUwMlggIiwgcFtpXSApOworCX0KKwlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJcbiIgKTsKKwlyZXR1cm4gbGVuOworfSAvLyBwcmludGZfaGNmOAorCitpbnQgcHJpbnRmX3N0cmN0KCBjaGFyICpzLCBjaGFyICpidWYsIGhjZl8xNiogcCApOworaW50IHByaW50Zl9zdHJjdCggY2hhciAqcywgY2hhciAqYnVmLCBoY2ZfMTYqIHAgKSB7CisKK2ludCBpLCBsZW47CisKKwlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVzIiwgcyApOworCXdoaWxlICggbGVuIDwgMjAgKSBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiICIgKTsKKwlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCI6ICIgKTsKKwlmb3IgKCBpID0gMDsgaSA8PSAqcDsgaSsrICkgeworCQlpZiAoIGxlbiAlIDgwID4gNzUgKSB7CisJCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJcbiIgKTsKKwkJfQorCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCIlMDRYICIsIHBbaV0gKTsKKwl9CisJbGVuICs9IHNwcmludGYoYnVmK2xlbiwiXG4iICk7CisJcmV0dXJuIGxlbjsKK30gLy8gcHJpbnRmX3N0cmN0CisKK2ludCBzY3VsbF9yZWFkX3Byb2NtZW0oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbiwgaW50ICplb2YsIHZvaWQgKmRhdGEgKQoreworCXN0cnVjdCB3bF9wcml2YXRlCSpscCA9IE5VTEw7CisJSUZCUAkJCQlpZmJwOworICAgCUNGR19IRVJNRVNfVEFMTElFU19TVFJDVCAqcDsKKworICAgICNkZWZpbmUgTElNSVQgKFBBR0VfU0laRS04MCkgLyogZG9uJ3QgcHJpbnQgYW55IG1vcmUgYWZ0ZXIgdGhpcyBzaXplICovCisKKyAgICBsZW49MDsKKworCWlmICggKCBscCA9ICgoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhKS0+cHJpdiApID09IE5VTEwgKSB7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIk5vIHdsX3ByaXZhdGUgaW4gc2N1bGxfcmVhZF9wcm9jbWVtXG4iICk7CisJfSBlbHNlIGlmICggbHAtPndsYWdzNDlfdHlwZSA9PSAwICl7CisgICAJICAgIGlmYnAgPSAmbHAtPmhjZkN0eDsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiTWFnaWM6ICAgICAgICAgICAgICAgMHglMDRYXG4iLCBpZmJwLT5JRkJfTWFnaWMgKTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiSU9CYXNlOiAgICAgICAgICAgICAgMHglMDRYXG4iLCBpZmJwLT5JRkJfSU9CYXNlICk7CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIkxpbmtTdGF0OiAgICAgICAgICAgIDB4JTA0WFxuIiwgaWZicC0+SUZCX0xpbmtTdGF0ICk7CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIkRTTGlua1N0YXQ6ICAgICAgICAgIDB4JTA0WFxuIiwgaWZicC0+SUZCX0RTTGlua1N0YXQgKTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiVGlja0luaTogICAgICAgICAweCUwOGxYXG4iLCBpZmJwLT5JRkJfVGlja0luaSApOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJUaWNrQ250OiAgICAgICAgICAgICAweCUwNFhcbiIsIGlmYnAtPklGQl9UaWNrQ250ICk7CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIkludE9mZkNudDogICAgICAgICAgIDB4JTA0WFxuIiwgaWZicC0+SUZCX0ludE9mZkNudCApOworCQlsZW4gKz0gcHJpbnRmX2hjZl8xNiggIklGQl9GV0lkZW50aXR5IiwgJmJ1ZltsZW5dLAorCQkJCQkJCSAgJmlmYnAtPklGQl9GV0lkZW50aXR5LmxlbiwgaWZicC0+SUZCX0ZXSWRlbnRpdHkubGVuICsgMSApOworCX0gZWxzZSBpZiAoIGxwLT53bGFnczQ5X3R5cGUgPT0gMSApIHsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiQ2hhbm5lbDogICAgICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPkNoYW5uZWwgKTsKKy8qKioqKiogbGVuICs9IHNwcmludGYoYnVmK2xlbiwic2xvY2s6ICAgICAgICAgICAgICAgICAgJWRcbiIsIGxwLT5zbG9jayApOwkJKi8KKy8veAkJc3RydWN0IHRxX3N0cnVjdCAgICAgICAgICAgICJ0YXNrOiAgICAgICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPnRhc2sgKTsKKy8veAkJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgICAgICJzdGF0czogICAgICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPnN0YXRzICk7CisjaWZkZWYgV0lSRUxFU1NfRVhUCisvL3gJCXN0cnVjdCBpd19zdGF0aXN0aWNzICAgICAgICAid3N0YXRzOiAgICAgICAgICAgICAweCUwNFhcbiIsIGxwLT53c3RhdHMgKTsKKy8veCAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwic3B5X251bWJlcjogICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPnNweV9udW1iZXIgKTsKKy8veAkJdV9jaGFyICAgICAgICAgICAgICAgICAgICAgIHNweV9hZGRyZXNzW0lXX01BWF9TUFldW0VUSF9BTEVOXTsKKy8veAkJc3RydWN0IGl3X3F1YWxpdHkgICAgICAgICAgIHNweV9zdGF0W0lXX01BWF9TUFldOworI2VuZGlmIC8vIFdJUkVMRVNTX0VYVAorICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJJRkI6ICAgICAgICAgICAgICAgICAgMHglcFxuIiwgJmxwLT5oY2ZDdHggKTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiZmxhZ3M6ICAgICAgICAgICAgICAgICUjLjhsWFxuIiwgbHAtPmZsYWdzICk7ICAvLzs/dXNlIHRoaXMgZm9ybWF0IGZyb20gbm93IG9uCisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIkRlYnVnRmxhZyh3bF9wcml2YXRlKSAweCUwNFhcbiIsIGxwLT5EZWJ1Z0ZsYWcgKTsKKyNpZiBEQkcKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiRGVidWdGbGFnIChEYmdJbmZvKTogICAweCUwOGxYXG4iLCBEYmdJbmZvLT5EZWJ1Z0ZsYWcgKTsKKyNlbmRpZiAvLyBEQkcKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiaXNfcmVnaXN0ZXJlZDogICAgICAgIDB4JTA0WFxuIiwgbHAtPmlzX3JlZ2lzdGVyZWQgKTsKKy8veAkJQ0ZHX0RSVl9JTkZPX1NUUkNUICAgICAgICAgICJkcml2ZXJJbmZvOiAgICAgICAgIDB4JTA0WFxuIiwgbHAtPmRyaXZlckluZm8gKTsKKwkJbGVuICs9IHByaW50Zl9zdHJjdCggImRyaXZlckluZm8iLCAmYnVmW2xlbl0sIChoY2ZfMTYqKSZscC0+ZHJpdmVySW5mbyApOworLy94CQlDRkdfSURFTlRJVFlfU1RSQ1QgICAgICAgICAgImRyaXZlcklkZW50aXR5OiAgICAgMHglMDRYXG4iLCBscC0+ZHJpdmVySWRlbnRpdHkgKTsKKwkJbGVuICs9IHByaW50Zl9zdHJjdCggImRyaXZlcklkZW50aXR5IiwgJmJ1ZltsZW5dLCAoaGNmXzE2KikmbHAtPmRyaXZlcklkZW50aXR5ICk7CisvL3gJCUNGR19GV19JREVOVElUWV9TVFJDVCAgICAgICAiU3RhdGlvbklkZW50aXR5OiAgICAweCUwNFhcbiIsIGxwLT5TdGF0aW9uSWRlbnRpdHkgKTsKKwkJbGVuICs9IHByaW50Zl9zdHJjdCggIlN0YXRpb25JZGVudGl0eSIsICZidWZbbGVuXSwgKGhjZl8xNiopJmxwLT5TdGF0aW9uSWRlbnRpdHkgKTsKKy8veAkJQ0ZHX1BSSV9JREVOVElUWV9TVFJDVCAgICAgICJQcmltYXJ5SWRlbnRpdHk6ICAgIDB4JTA0WFxuIiwgbHAtPlByaW1hcnlJZGVudGl0eSApOworCQlsZW4gKz0gcHJpbnRmX3N0cmN0KCAiUHJpbWFyeUlkZW50aXR5IiwgJmJ1ZltsZW5dLCAoaGNmXzE2KikmbHAtPmhjZkN0eC5JRkJfUFJJSWRlbnRpdHkgKTsKKwkJbGVuICs9IHByaW50Zl9zdHJjdCggIlByaW1hcnlTdXBwbGllciIsICZidWZbbGVuXSwgKGhjZl8xNiopJmxwLT5oY2ZDdHguSUZCX1BSSVN1cCApOworLy94CQlDRkdfUFJJX0lERU5USVRZX1NUUkNUICAgICAgIk5JQ0lkZW50aXR5OiAgICAgICAgMHglMDRYXG4iLCBscC0+TklDSWRlbnRpdHkgKTsKKwkJbGVuICs9IHByaW50Zl9zdHJjdCggIk5JQ0lkZW50aXR5IiwgJmJ1ZltsZW5dLCAoaGNmXzE2KikmbHAtPk5JQ0lkZW50aXR5ICk7CisvL3gJCWx0dl90ICAgICAgICAgICAgICAgICAgICAgICAibHR2UmVjb3JkOiAgICAgICAgICAweCUwNFhcbiIsIGxwLT5sdHZSZWNvcmQgKTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwidHhCeXRlczogICAgICAgICAgICAgIDB4JTA4bFhcbiIsIGxwLT50eEJ5dGVzICk7CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIm1heFBvcnQ6ICAgICAgICAgICAgICAweCUwNFhcbiIsIGxwLT5tYXhQb3J0ICk7ICAgICAgICAvKiAwIGZvciBTVEEsIDYgZm9yIEFQICovCisJLyogRWxlbWVudHMgdXNlZCBmb3IgYXN5bmMgbm90aWZpY2F0aW9uIGZyb20gaGFyZHdhcmUgKi8KKy8veAkJUklEX0xPR19TVFJDVAkJCQlSaWRMaXN0WzEwXTsKKy8veAkJbHR2X3QgICAgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVkUmVjb3JkOiAgICAgIDB4JTA0WFxuIiwgbHAtPnVwZGF0ZWRSZWNvcmQgKTsKKy8veAkJUFJPQkVfUkVTUAkJCQkgICAgIlByb2JlUmVzcDogICAgICAgICAgICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPlByb2JlUmVzcCApOworLy94CQlBU1NPQ19TVEFUVVNfU1RSQ1QgICAgICAgICAgImFzc29jX3N0YXQ6ICAgICAgICAgMHglMDRYXG4iLCBscC0+YXNzb2Nfc3RhdCApOworLy94CQlTRUNVUklUWV9TVEFUVVNfU1RSQ1QgICAgICAgInNlY19zdGF0OiAgICAgICAgICAgMHglMDRYXG4iLCBscC0+c2VjX3N0YXQgKTsKKy8veAkJdV9jaGFyICAgICAgICAgICAgICAgICAgICAgIGxvb2tBaGVhZEJ1ZltXVkxBTl9NQVhfTE9PS0FIRUFEXTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiUG9ydFR5cGU6ICAgICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPlBvcnRUeXBlICk7ICAgICAgICAgICAvLyAxIC0gMyAoMSBbTm9ybWFsXSB8IDMgW0FkSG9jXSkKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiQ2hhbm5lbDogICAgICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPkNoYW5uZWwgKTsgICAgICAgICAgICAvLyAwIC0gMTQgKDApCisvL3gJCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICBUeFJhdGVDb250cm9sWzJdOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJUeFJhdGVDb250cm9sWzJdOiAgICAgMHglMDRYIDB4JTA0WFxuIiwKKwkJCQkJCWxwLT5UeFJhdGVDb250cm9sWzBdLCBscC0+VHhSYXRlQ29udHJvbFsxXSApOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJEaXN0YW5jZUJldHdlZW5BUHM6ICAgMHglMDRYXG4iLCBscC0+RGlzdGFuY2VCZXR3ZWVuQVBzICk7IC8vIDEgLSAzICgxKQorICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJSVFNUaHJlc2hvbGQ6ICAgICAgICAgMHglMDRYXG4iLCBscC0+UlRTVGhyZXNob2xkICk7ICAgICAgIC8vIDAgLSAyMzQ3ICgyMzQ3KQorICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJQTUVuYWJsZWQ6ICAgICAgICAgICAgMHglMDRYXG4iLCBscC0+UE1FbmFibGVkICk7ICAgICAgICAgIC8vIDAgLSAyLCA4MDAxIC0gODAwMiAoMCkKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiTWljcm93YXZlUm9idXN0bmVzczogIDB4JTA0WFxuIiwgbHAtPk1pY3Jvd2F2ZVJvYnVzdG5lc3MgKTsvLyAwIC0gMSAoMCkKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiQ3JlYXRlSUJTUzogICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPkNyZWF0ZUlCU1MgKTsgICAgICAgICAvLyAwIC0gMSAoMCkKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiTXVsdGljYXN0UmVjZWl2ZTogICAgIDB4JTA0WFxuIiwgbHAtPk11bHRpY2FzdFJlY2VpdmUgKTsgICAvLyAwIC0gMSAoMSkKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiTWF4U2xlZXBEdXJhdGlvbjogICAgIDB4JTA0WFxuIiwgbHAtPk1heFNsZWVwRHVyYXRpb24gKTsgICAvLyAwIC0gNjU1MzUgKDEwMCkKKy8veAkJaGNmXzggICAgICAgICAgICAgICAgICAgICAgIE1BQ0FkZHJlc3NbRVRIX0FMRU5dOworCQlsZW4gKz0gcHJpbnRmX2hjZl84KCAiTUFDQWRkcmVzcyIsICZidWZbbGVuXSwgbHAtPk1BQ0FkZHJlc3MsIEVUSF9BTEVOICk7CisvL3gJCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrTmFtZVtIQ0ZfTUFYX05BTUVfTEVOKzFdOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJOZXR3b3JrTmFtZTogICAgICAgICAgJS4zMnNcbiIsIGxwLT5OZXR3b3JrTmFtZSApOworLy94CQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGlvbk5hbWVbSENGX01BWF9OQU1FX0xFTisxXTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiRW5hYmxlRW5jcnlwdGlvbjogICAgIDB4JTA0WFxuIiwgbHAtPkVuYWJsZUVuY3J5cHRpb24gKTsgICAvLyAwIC0gMSAoMCkKKy8veAkJY2hhciAgICAgICAgICAgICAgICAgICAgICAgIEtleTFbTUFYX0tFWV9MRU4rMV07CisJCWxlbiArPSBwcmludGZfaGNmXzgoICJLZXkxIiwgJmJ1ZltsZW5dLCBscC0+S2V5MSwgTUFYX0tFWV9MRU4gKTsKKy8veAkJY2hhciAgICAgICAgICAgICAgICAgICAgICAgIEtleTJbTUFYX0tFWV9MRU4rMV07CisvL3gJCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICBLZXkzW01BWF9LRVlfTEVOKzFdOworLy94CQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgS2V5NFtNQVhfS0VZX0xFTisxXTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiVHJhbnNtaXRLZXlJRDogICAgICAgIDB4JTA0WFxuIiwgbHAtPlRyYW5zbWl0S2V5SUQgKTsgICAgICAvLyAxIC0gNCAoMSkKKy8veAkJQ0ZHX0RFRkFVTFRfS0VZU19TVFJDVAkgICAgIkRlZmF1bHRLZXlzOiAgICAgICAgIDB4JTA0WFxuIiwgbHAtPkRlZmF1bHRLZXlzICk7CisvL3gJCXVfY2hhciAgICAgICAgICAgICAgICAgICAgICBtYWlsYm94W01CX1NJWkVdOworLy94CQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgc3pFbmNyeXB0aW9uW01BWF9FTkNfTEVOXTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiZHJpdmVyRW5hYmxlOiAgICAgICAgIDB4JTA0WFxuIiwgbHAtPmRyaXZlckVuYWJsZSApOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJ3b2xhc0VuYWJsZTogICAgICAgICAgMHglMDRYXG4iLCBscC0+d29sYXNFbmFibGUgKTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiYXRpbVdpbmRvdzogICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPmF0aW1XaW5kb3cgKTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiaG9sZG92ZXJEdXJhdGlvbjogICAgIDB4JTA0WFxuIiwgbHAtPmhvbGRvdmVyRHVyYXRpb24gKTsKKy8veAkJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIE11bHRpY2FzdFJhdGVbMl07CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sImF1dGhlbnRpY2F0aW9uOiAgICAgICAweCUwNFhcbiIsIGxwLT5hdXRoZW50aWNhdGlvbiApOyAvLyBpcyB0aGlzIEFQIHNwZWNpZmljPworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJwcm9taXNjdW91c01vZGU6ICAgICAgMHglMDRYXG4iLCBscC0+cHJvbWlzY3VvdXNNb2RlICk7CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIkRvd25sb2FkRmlybXdhcmU6ICAgICAweCUwNFhcbiIsIGxwLT5Eb3dubG9hZEZpcm13YXJlICk7ICAgLy8gMCAtIDIgKDAgW05vbmVdIHwgMSBbU1RBXSB8IDIgW0FQXSkKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiQXV0aEtleU1nbXRTdWl0ZTogICAgIDB4JTA0WFxuIiwgbHAtPkF1dGhLZXlNZ210U3VpdGUgKTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwibG9hZEJhbGFuY2luZzogICAgICAgIDB4JTA0WFxuIiwgbHAtPmxvYWRCYWxhbmNpbmcgKTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwibWVkaXVtRGlzdHJpYnV0aW9uOiAgIDB4JTA0WFxuIiwgbHAtPm1lZGl1bURpc3RyaWJ1dGlvbiApOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJ0eFBvd0xldmVsOiAgICAgICAgICAgMHglMDRYXG4iLCBscC0+dHhQb3dMZXZlbCApOworLy8gICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sInNob3J0UmV0cnlMaW1pdDogICAgMHglMDRYXG4iLCBscC0+c2hvcnRSZXRyeUxpbWl0ICk7CisvLyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwibG9uZ1JldHJ5TGltaXQ6ICAgICAweCUwNFhcbiIsIGxwLT5sb25nUmV0cnlMaW1pdCApOworLy94CQloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgc3JzY1syXTsKKy8veAkJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIGJyc2NbMl07CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sImNvbm5lY3Rpb25Db250cm9sOiAgICAweCUwNFhcbiIsIGxwLT5jb25uZWN0aW9uQ29udHJvbCApOworLy94CQkvL2hjZl8xNiAgICAgICAgICAgICAgICAgICAgICBwcm9iZURhdGFSYXRlc1syXTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwib3duQmVhY29uSW50ZXJ2YWw6ICAgIDB4JTA0WFxuIiwgbHAtPm93bkJlYWNvbkludGVydmFsICk7CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sImNvZXhpc3RlbmNlOiAgICAgICAgICAweCUwNFhcbiIsIGxwLT5jb2V4aXN0ZW5jZSApOworLy94CQlXVkxBTl9GUkFNRSAgICAgICAgICAgICAgICAgInR4RjogICAgICAgICAgICAgICAgMHglMDRYXG4iLCBscC0+dHhGICk7CisvL3gJCVdWTEFOX0xGUkFNRSAgICAgICAgICAgICAgICB0eExpc3RbREVGQVVMVF9OVU1fVFhfRlJBTUVTXTsKKy8veAkJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICAgICJ0eEZyZWU6ICAgICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPnR4RnJlZSApOworLy94CQlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICAgdHhRW1dWTEFOX01BWF9UWF9RVUVVRVNdOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJuZXRpZl9xdWV1ZV9vbjogICAgICAgMHglMDRYXG4iLCBscC0+bmV0aWZfcXVldWVfb24gKTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwidHhRX2NvdW50OiAgICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPnR4UV9jb3VudCApOworLy94CQlERVNDX1NUUkNUICAgICAgICAgICAgICAgICAgImRlc2Nfcng6ICAgICAgICAgICAgMHglMDRYXG4iLCBscC0+ZGVzY19yeCApOworLy94CQlERVNDX1NUUkNUICAgICAgICAgICAgICAgICAgImRlc2NfdHg6ICAgICAgICAgICAgMHglMDRYXG4iLCBscC0+ZGVzY190eCApOworLy94CQlXVkxBTl9QT1JUX1NUQVRFICAgICAgICAgICAgInBvcnRTdGF0ZTogICAgICAgICAgMHglMDRYXG4iLCBscC0+cG9ydFN0YXRlICk7CisvL3gJCVNjYW5SZXN1bHQgICAgICAgICAgICAgICAgICAic2Nhbl9yZXN1bHRzOiAgICAgICAweCUwNFhcbiIsIGxwLT5zY2FuX3Jlc3VsdHMgKTsKKy8veAkJUHJvYmVSZXN1bHQgICAgICAgICAgICAgICAgICJwcm9iZV9yZXN1bHRzOiAgICAgIDB4JTA0WFxuIiwgbHAtPnByb2JlX3Jlc3VsdHMgKTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwicHJvYmVfbnVtX2FwczogICAgICAgIDB4JTA0WFxuIiwgbHAtPnByb2JlX251bV9hcHMgKTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwidXNlX2RtYTogICAgICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPnVzZV9kbWEgKTsKKy8veAkJRE1BX1NUUkNUICAgICAgICAgICAgICAgICAgICJkbWE6ICAgICAgICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPmRtYSApOworI2lmZGVmIFVTRV9SVFMKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwidXNlUlRTOiAgICAgICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPnVzZVJUUyApOworI2VuZGlmICAvLyBVU0VfUlRTCisjaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAorCQkvLzs/c2hvdWxkIHdlIHJlc3RvcmUgdGhpcyB0byBhbGxvdyBzbWFsbGVyIG1lbW9yeSBmb290cHJpbnQKKwkJLy87P0kgZ3Vlc3Mgbm90LiBUaGlzIHNob3VsZCBiZSBicm91Z2h0IHVuZGVyIERlYnVnIG1vZGUgb25seQorICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJEVElNUGVyaW9kOiAgICAgICAgICAgMHglMDRYXG4iLCBscC0+RFRJTVBlcmlvZCApOyAgICAgICAgIC8vIDEgLSAyNTUgKDEpCisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIm11bHRpY2FzdFBNQnVmZmVyaW5nOiAweCUwNFhcbiIsIGxwLT5tdWx0aWNhc3RQTUJ1ZmZlcmluZyApOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJSZWplY3RBbnk6ICAgICAgICAgICAgMHglMDRYXG4iLCBscC0+UmVqZWN0QW55ICk7ICAgICAgICAgIC8vIDAgLSAxICgwKQorICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJFeGNsdWRlVW5lbmNyeXB0ZWQ6ICAgMHglMDRYXG4iLCBscC0+RXhjbHVkZVVuZW5jcnlwdGVkICk7IC8vIDAgLSAxICgxKQorICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJpbnRyYUJTU1JlbGF5OiAgICAgICAgMHglMDRYXG4iLCBscC0+aW50cmFCU1NSZWxheSApOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJ3bGFnczQ5X3R5cGU6ICAgICAgICAgICAgIDB4JTA4bFhcbiIsIGxwLT53bGFnczQ5X3R5cGUgKTsKKyNpZmRlZiBVU0VfV0RTCisvL3gJCVdWTEFOX1dEU19JRiAgICAgICAgICAgICAgICB3ZHNfcG9ydFtOVU1fV0RTX1BPUlRTXTsKKyNlbmRpZiAvLyBVU0VfV0RTCisjZW5kaWYgLy8gSENGX0FQCisJfSBlbHNlIGlmICggbHAtPndsYWdzNDlfdHlwZSA9PSAyICl7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sInRhbGxpZXMgdG8gYmUgYWRkZWRcbiIgKTsKKy8vSGVybWVzIFRhbGxpZXMgKElGQiBzdWJzdHJ1Y3R1cmUpIHsKKyAgIAkgICAgcCA9ICZscC0+aGNmQ3R4LklGQl9OSUNfVGFsbGllczsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiVHhVbmljYXN0RnJhbWVzOiAgICAgICAgICAlMDhsWFxuIiwgcC0+VHhVbmljYXN0RnJhbWVzICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlR4TXVsdGljYXN0RnJhbWVzOiAgICAgICAgJTA4bFhcbiIsIHAtPlR4TXVsdGljYXN0RnJhbWVzICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlR4RnJhZ21lbnRzOiAgICAgICAgICAgICAgJTA4bFhcbiIsIHAtPlR4RnJhZ21lbnRzICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlR4VW5pY2FzdE9jdGV0czogICAgICAgICAgJTA4bFhcbiIsIHAtPlR4VW5pY2FzdE9jdGV0cyApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJUeE11bHRpY2FzdE9jdGV0czogICAgICAgICUwOGxYXG4iLCBwLT5UeE11bHRpY2FzdE9jdGV0cyApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJUeERlZmVycmVkVHJhbnNtaXNzaW9uczogICUwOGxYXG4iLCBwLT5UeERlZmVycmVkVHJhbnNtaXNzaW9ucyApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJUeFNpbmdsZVJldHJ5RnJhbWVzOiAgICAgICUwOGxYXG4iLCBwLT5UeFNpbmdsZVJldHJ5RnJhbWVzICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlR4TXVsdGlwbGVSZXRyeUZyYW1lczogICAgJTA4bFhcbiIsIHAtPlR4TXVsdGlwbGVSZXRyeUZyYW1lcyApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJUeFJldHJ5TGltaXRFeGNlZWRlZDogICAgICUwOGxYXG4iLCBwLT5UeFJldHJ5TGltaXRFeGNlZWRlZCApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJUeERpc2NhcmRzOiAgICAgICAgICAgICAgICUwOGxYXG4iLCBwLT5UeERpc2NhcmRzICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlJ4VW5pY2FzdEZyYW1lczogICAgICAgICAgJTA4bFhcbiIsIHAtPlJ4VW5pY2FzdEZyYW1lcyApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJSeE11bHRpY2FzdEZyYW1lczogICAgICAgICUwOGxYXG4iLCBwLT5SeE11bHRpY2FzdEZyYW1lcyApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJSeEZyYWdtZW50czogICAgICAgICAgICAgICUwOGxYXG4iLCBwLT5SeEZyYWdtZW50cyApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJSeFVuaWNhc3RPY3RldHM6ICAgICAgICAgICUwOGxYXG4iLCBwLT5SeFVuaWNhc3RPY3RldHMgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiUnhNdWx0aWNhc3RPY3RldHM6ICAgICAgICAlMDhsWFxuIiwgcC0+UnhNdWx0aWNhc3RPY3RldHMgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiUnhGQ1NFcnJvcnM6ICAgICAgICAgICAgICAlMDhsWFxuIiwgcC0+UnhGQ1NFcnJvcnMgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiUnhEaXNjYXJkc05vQnVmZmVyOiAgICAgICAlMDhsWFxuIiwgcC0+UnhEaXNjYXJkc05vQnVmZmVyICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlR4RGlzY2FyZHNXcm9uZ1NBOiAgICAgICAgJTA4bFhcbiIsIHAtPlR4RGlzY2FyZHNXcm9uZ1NBICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlJ4V0VQVW5kZWNyeXB0YWJsZTogICAgICAgJTA4bFhcbiIsIHAtPlJ4V0VQVW5kZWNyeXB0YWJsZSApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJSeE1zZ0luTXNnRnJhZ21lbnRzOiAgICAgICUwOGxYXG4iLCBwLT5SeE1zZ0luTXNnRnJhZ21lbnRzICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlJ4TXNnSW5CYWRNc2dGcmFnbWVudHM6ICAgJTA4bFhcbiIsIHAtPlJ4TXNnSW5CYWRNc2dGcmFnbWVudHMgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiUnhEaXNjYXJkc1dFUElDVkVycm9yOiAgICAlMDhsWFxuIiwgcC0+UnhEaXNjYXJkc1dFUElDVkVycm9yICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlJ4RGlzY2FyZHNXRVBFeGNsdWRlZDogICAgJTA4bFhcbiIsIHAtPlJ4RGlzY2FyZHNXRVBFeGNsdWRlZCApOworI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfVEFMTElFU19GVworICAgICAgICAvL3RvIGJlIGFkZGVkIDs/CisjZW5kaWYgLy8gSENGX0VYVF9UQUxMSUVTX0ZXCisJfSBlbHNlIGlmICggbHAtPndsYWdzNDlfdHlwZSAmIDB4ODAwMCApIHsJLy87P2tsdWRneSBidXQgaXQgaXMgdW5jbGVhciB0byBtZSB3ZXJlIGVsc2UgdG8gcGxhY2UgdGhpcworI2lmIERCRworCQlEYmdJbmZvLT5EZWJ1Z0ZsYWcgPSBscC0+d2xhZ3M0OV90eXBlICYgMHg3RkZGOworI2VuZGlmIC8vIERCRworCQlscC0+d2xhZ3M0OV90eXBlID0gMDsJCQkJLy9kZWZhdWx0IHRvIElGQiBhZ2FpbiA7PworCX0gZWxzZSB7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sInVua25vd24gdmFsdWUgZm9yIHdsYWdzNDlfdHlwZTogMHglMDhsWFxuIiwgbHAtPndsYWdzNDlfdHlwZSApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCIweDAwMDAgLSBJRkJcbiIgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiMHgwMDAxIC0gd2xfcHJpdmF0ZVxuIiApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCIweDAwMDIgLSBUYWxsaWVzXG4iICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIjB4OHh4eCAtIENoYW5nZSBkZWJ1ZmZsYWdcbiIgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiRVJST1IgICAgMDAwMVxuV0FSTklORyAgMDAwMlxuTk9USUNFICAgMDAwNFxuVFJBQ0UgICAgMDAwOFxuIiApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJWRVJCT1NFICAwMDEwXG5QQVJBTSAgICAwMDIwXG5CUkVBSyAgICAwMDQwXG5SWCAgICAgICAwMTAwXG4iICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlRYICAgICAgIDAyMDBcbkRTICAgICAgIDA0MDBcbiIgKTsKKwl9CisgICAgcmV0dXJuIGxlbjsKK30gLy8gc2N1bGxfcmVhZF9wcm9jbWVtCisKK3N0YXRpYyB2b2lkIHByb2Nfd3JpdGUoY29uc3QgY2hhciAqbmFtZSwgd3JpdGVfcHJvY190ICp3LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqIGVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkobmFtZSwgU19JRlJFRyB8IFNfSVdVU1IsIE5VTEwpOworCWlmIChlbnRyeSkgeworCQllbnRyeS0+d3JpdGVfcHJvYyA9IHc7CisJCWVudHJ5LT5kYXRhID0gZGF0YTsKKwl9Cit9IC8vIHByb2Nfd3JpdGUKKworc3RhdGljIGludCB3cml0ZV9pbnQoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3sKKwlzdGF0aWMgY2hhcgkJcHJvY19udW1iZXJbMTFdOworCXVuc2lnbmVkIGludAluciA9IDA7CisKKwlEQkdfRlVOQyggIndyaXRlX2ludCIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmIChjb3VudCA+IDkpIHsKKwkJY291bnQgPSAtRUlOVkFMOworCX0gZWxzZSBpZiAoIGNvcHlfZnJvbV91c2VyKHByb2NfbnVtYmVyLCBidWZmZXIsIGNvdW50KSApIHsKKwkJY291bnQgPSAtRUZBVUxUOworCX0KKwlpZiAgKGNvdW50ID4gMCApIHsKKwkJcHJvY19udW1iZXJbY291bnRdID0gMDsKKwkJbnIgPSB3bF9hdG9pKCBwcm9jX251bWJlciApOworIAkJKih1bnNpZ25lZCBpbnQgKilkYXRhID0gbnI7CisJCWlmICggbnIgJiAweDgwMDAgKSB7CS8vOz9rbHVkZ3kgYnV0IGl0IGlzIHVuY2xlYXIgdG8gbWUgd2VyZSBlbHNlIHRvIHBsYWNlIHRoaXMKKyNpZiBEQkcKKwkJCURiZ0luZm8tPkRlYnVnRmxhZyA9IG5yICYgMHg3RkZGOworI2VuZGlmIC8vIERCRworCQl9CisJfQorCURCR19QUklOVCggInZhbHVlOiAlMDhYXG4iLCBuciApOworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiBjb3VudDsKK30gLy8gd3JpdGVfaW50CisKKyNlbmRpZiAvKiBTQ1VMTF9VU0VfUFJPQyAqLworCisjaWZkZWYgRE41NTQKKyNkZWZpbmUgUlVOX0FUKHgpCQkoamlmZmllcysoeCkpCQkvLyJib3Jyb3dlZCIgZnJvbSBpbmNsdWRlL3BjbWNpYS9rX2NvbXBhdC5oCisjZGVmaW5lIERTX09PUgkweDgwMDAJCS8vRGVlcHNsZWVwIE91dE9mUmFuZ2UgU3RhdHVzCisKKwkJbHAtPnRpbWVyX29vcl9jbnQgPSBEU19PT1I7CisJCWluaXRfdGltZXIoICZscC0+dGltZXJfb29yICk7CisJCWxwLT50aW1lcl9vb3IuZnVuY3Rpb24gPSB0aW1lcl9vb3I7CisJCWxwLT50aW1lcl9vb3IuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWxwOworCQlscC0+dGltZXJfb29yLmV4cGlyZXMgPSBSVU5fQVQoIDMgKiBIWiApOworCQlhZGRfdGltZXIoICZscC0+dGltZXJfb29yICk7CisJCXByaW50ayggIjw1PndsX2VuYWJsZTogJWxkXG4iLCBqaWZmaWVzICk7CQkvLzs/cmVtb3ZlIG1lIDEgZGF5CisjZW5kaWYgLy9ETjU1NAorI2lmZGVmIERONTU0CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJdGltZXJfb29yKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGFyZyAtIGEgdV9sb25nIHJlcHJlc2VudGluZyBhIHBvaW50ZXIgdG8gYSBkZXZfbGlua190IHN0cnVjdHVyZSBmb3IgdGhlCisgKiAgICAgICAgICAgIGRldmljZSB0byBiZSByZWxlYXNlZC4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHRpbWVyX29vciggdV9sb25nIGFyZyApCit7CisJc3RydWN0IHdsX3ByaXZhdGUgICAgICAgKmxwID0gKHN0cnVjdCB3bF9wcml2YXRlICopYXJnOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ0aW1lcl9vb3IiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisgICAgREJHX1BBUkFNKCBEYmdJbmZvLCAiYXJnIiwgIjB4JTA4bHgiLCBhcmcgKTsKKworCXByaW50ayggIjw1PnRpbWVyX29vcjogJWxkIDB4JTA0WFxuIiwgamlmZmllcywgbHAtPnRpbWVyX29vcl9jbnQgKTsJCS8vOz9yZW1vdmUgbWUgMSBkYXkKKwlscC0+dGltZXJfb29yX2NudCArPSAxMDsKKyAgICBpZiAoIChscC0+dGltZXJfb29yX2NudCAmIH5EU19PT1IpID4gMzAwICkgeworCQlscC0+dGltZXJfb29yX2NudCA9IDMwMDsKKwl9CisJbHAtPnRpbWVyX29vcl9jbnQgfD0gRFNfT09SOworCWluaXRfdGltZXIoICZscC0+dGltZXJfb29yICk7CisJbHAtPnRpbWVyX29vci5mdW5jdGlvbiA9IHRpbWVyX29vcjsKKwlscC0+dGltZXJfb29yLmRhdGEgPSAodW5zaWduZWQgbG9uZylscDsKKwlscC0+dGltZXJfb29yLmV4cGlyZXMgPSBSVU5fQVQoIChscC0+dGltZXJfb29yX2NudCAmIH5EU19PT1IpICogSFogKTsKKwlhZGRfdGltZXIoICZscC0+dGltZXJfb29yICk7CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKK30gLy8gdGltZXJfb29yCisjZW5kaWYgLy9ETjU1NAorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9tYWluLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU5M2FlNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX21haW4uaApAQCAtMCwwICsxLDEzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFnZXJlIFN5c3RlbXMgSW5jLgorICogV2lyZWxlc3MgZGV2aWNlIGRyaXZlciBmb3IgTGludXggKHdsYWdzNDkpLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KKyAqCisgKiBJbml0aWFsbHkgZGV2ZWxvcGVkIGJ5IFRyaXBsZVBvaW50LCBJbmMuCisgKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIEhlYWRlciBkZXNjcmliaW5nIGRldmljZSBzcGVjaWZpYyByb3V0aW5lcyBhbmQgZHJpdmVyIGluaXQvdW4taW5pdC4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNPRlRXQVJFIExJQ0VOU0UKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisgKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fV0xfTUFJTl9IX18KKyNkZWZpbmUgX19XTF9NQUlOX0hfXworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfaW5zZXJ0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKK3ZvaWQgd2xfc2V0X3dlcF9rZXlzKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKworaW50IHdsX3B1dF9sdHZfaW5pdCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisKK2ludCB3bF9wdXRfbHR2KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKworcF91MTYgd2xfZ2V0X2lycV9tYXNrKCB2b2lkICk7CisKK3BfczggKiB3bF9nZXRfaXJxX2xpc3QoIHZvaWQgKTsKKworaW50IHdsX3Jlc2V0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKK2ludCB3bF9nbyggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisKK2ludCB3bF9hcHBseSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisKK2lycXJldHVybl90IHdsX2lzciggaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyApOworCit2b2lkIHdsX3JlbW92ZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCit2b2lkIHdsX3N1c3BlbmQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKwordm9pZCB3bF9yZXN1bWUoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKwordm9pZCB3bF9yZWxlYXNlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKK2ludCB3bF9lbmFibGUoIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworCitpbnQgd2xfY29ubmVjdCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisKK2ludCB3bF9kaXNhYmxlKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKworaW50IHdsX2Rpc2Nvbm5lY3QoIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworCit2b2lkIHdsX2VuYWJsZV93ZHNfcG9ydHMoIHN0cnVjdCB3bF9wcml2YXRlICogbHAgKTsKKwordm9pZCB3bF9kaXNhYmxlX3dkc19wb3J0cyggc3RydWN0IHdsX3ByaXZhdGUgKiBscCApOworCisjaWZuZGVmIFVTRV9NQk9YX1NZTkMKKworaW50IHdsX21ieCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7Cit2b2lkIHdsX2VuZGlhbl90cmFuc2xhdGVfbWFpbGJveCggbHR2X3QgKmx0diApOwordm9pZCB3bF9wcm9jZXNzX21haWxib3goIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworCisjZW5kaWYgIC8qIFVTRV9NQk9YX1NZTkMgKi8KKworCisjaWZkZWYgVVNFX1dEUworCit2b2lkIHdsX3dkc19uZXRkZXZfcmVnaXN0ZXIoIHN0cnVjdCB3bF9wcml2YXRlICpscCApOwordm9pZCB3bF93ZHNfbmV0ZGV2X2RlcmVnaXN0ZXIoIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworCisjZW5kaWYgIC8qIFVTRV9XRFMgKi8KKworCisjaWZkZWYgVVNFX1dEUworCisjZGVmaW5lIFdMX1dEU19ORVRERVZfUkVHSVNURVIoIEFSRyApICAgd2xfd2RzX25ldGRldl9yZWdpc3RlciggQVJHICkKKyNkZWZpbmUgV0xfV0RTX05FVERFVl9ERVJFR0lTVEVSKCBBUkcgKSB3bF93ZHNfbmV0ZGV2X2RlcmVnaXN0ZXIoIEFSRyApCisKKyNlbHNlCisKKyNkZWZpbmUgV0xfV0RTX05FVERFVl9SRUdJU1RFUiggQVJHICkKKyNkZWZpbmUgV0xfV0RTX05FVERFVl9ERVJFR0lTVEVSKCBBUkcgKQorCisjZW5kaWYgIC8qIFVTRV9XRFMgKi8KKyNlbmRpZiAgLy8gX19XTF9NQUlOX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfbmV0ZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9uZXRkZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzM4OTAyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfbmV0ZGV2LmMKQEAgLTAsMCArMSwyMDcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBXaXJlbGVzcyBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAod2xhZ3M0OSkuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBodHRwOi8vd3d3LmFnZXJlLmNvbQorICoKKyAqIEluaXRpYWxseSBkZXZlbG9wZWQgYnkgVHJpcGxlUG9pbnQsIEluYy4KKyAqICAgaHR0cDovL3d3dy50cmlwbGVwb2ludC5jb20KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgVGhpcyBmaWxlIGNvbnRhaW5zIGhhbmRsZXIgZnVuY3Rpb25zIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbmV0X2RldmljZQorICogICBzdHJ1Y3R1cmUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTT0ZUV0FSRSBMSUNFTlNFCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisgKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisgKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisgKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisgKgorICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogRGlzY2xhaW1lcgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGluY2x1ZGUgZmlsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8d2xfdmVyc2lvbi5oPgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorLy8jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9pbi5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisvLyAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisvLyAjaW5jbHVkZSA8YXNtL2lvLmg+CisvLyAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorLy8gI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorCisjaW5jbHVkZSA8ZGVidWcuaD4KKworI2luY2x1ZGUgPGhjZi5oPgorI2luY2x1ZGUgPGRoZi5oPgorLy8gI2luY2x1ZGUgPGhjZmRlZi5oPgorCisjaW5jbHVkZSA8d2xfaWYuaD4KKyNpbmNsdWRlIDx3bF9pbnRlcm5hbC5oPgorI2luY2x1ZGUgPHdsX3V0aWwuaD4KKyNpbmNsdWRlIDx3bF9wcml2Lmg+CisjaW5jbHVkZSA8d2xfbWFpbi5oPgorI2luY2x1ZGUgPHdsX25ldGRldi5oPgorI2luY2x1ZGUgPHdsX3dleHQuaD4KKworI2lmZGVmIFVTRV9QUk9GSUxFCisjaW5jbHVkZSA8d2xfcHJvZmlsZS5oPgorI2VuZGlmICAvKiBVU0VfUFJPRklMRSAqLworCisjaWZkZWYgQlVTX1BDTUNJQQorI2luY2x1ZGUgPHdsX2NzLmg+CisjZW5kaWYgIC8qIEJVU19QQ01DSUEgKi8KKworI2lmZGVmIEJVU19QQ0kKKyNpbmNsdWRlIDx3bF9wY2kuaD4KKyNlbmRpZiAgLyogQlVTX1BDSSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnbG9iYWwgdmFyaWFibGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIERCRworZXh0ZXJuIGRiZ19pbmZvX3QgKkRiZ0luZm87CisjZW5kaWYgIC8qIERCRyAqLworCisKKyNpZiBIQ0ZfRU5DQVAKKyNkZWZpbmUgTVRVX01BWCAoSENGX01BWF9NU0cgLSBFVEhfSExFTiAtIDgpCisjZWxzZQorI2RlZmluZSBNVFVfTUFYIChIQ0ZfTUFYX01TRyAtIEVUSF9ITEVOKQorI2VuZGlmCisKKy8vc3RhdGljIGludCBtdHUgPSBNVFVfTUFYOworLy9NT0RVTEVfUEFSTShtdHUsICJpIik7CisvL01PRFVMRV9QQVJNX0RFU0MobXR1LCAiTVRVIik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtYWNyb3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEJMT0NLX0lOUFVUKGJ1ZiwgbGVuKSBcCisgICAgZGVzYy0+YnVmX2FkZHIgPSBidWY7IFwKKyAgICBkZXNjLT5CVUZfU0laRSA9IGxlbjsgXAorICAgIHN0YXR1cyA9IGhjZl9yY3ZfbXNnKCYobHAtPmhjZkN0eCksIGRlc2MsIDApCisKKyNkZWZpbmUgQkxPQ0tfSU5QVVRfRE1BKGJ1ZiwgbGVuKSBtZW1jcHkoIGJ1ZiwgZGVzY19uZXh0LT5idWZfYWRkciwgcGt0bGVuICkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9pbml0KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgV2UgbmV2ZXIgbmVlZCB0byBkbyBhbnl0aGluZyB3aGVuIGEgIldpcmVsZXNzIiBkZXZpY2UgaXMgImluaXRpYWxpemVkIgorICogIGJ5IHRoZSBuZXQgc29mdHdhcmUsIGJlY2F1c2Ugd2Ugb25seSByZWdpc3RlciBhbHJlYWR5LWZvdW5kIGNhcmRzLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfaW5pdCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisvLyAgICB1bnNpZ25lZCBsb25nICAgICAgIGZsYWdzOworLy8gICAgc3RydWN0IHdsX3ByaXZhdGUgICAqbHAgPSB3bF9wcml2KGRldik7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF9pbml0IiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisgICAgREJHX1BBUkFNKCBEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2ICk7CisKKyAgICAvKiBOb3RoaW5nIHRvIGRvLCBidXQgZ3JhYiB0aGUgc3BpbmxvY2sgYW55d2F5IGp1c3QgaW4gY2FzZSB3ZSBldmVyIG5lZWQKKyAgICAgICB0aGlzIHJvdXRpbmUgKi8KKy8vICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CisvLyAgd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm4gMDsKK30gLy8gd2xfaW5pdAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2NvbmZpZygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEltcGxlbWVudCB0aGUgU0lPQ1NJRk1BUCBpbnRlcmZhY2UuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKiAgICAgIG1hcCAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgaWZtYXAgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9jb25maWcoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwICkKK3sKKyAgICBEQkdfRlVOQyggIndsX2NvbmZpZyIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworICAgIERCR19QQVJBTSggRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldiApOworICAgIERCR19QQVJBTSggRGJnSW5mbywgIm1hcCIsICIweCVwIiwgbWFwICk7CisKKyAgICAvKiBUaGUgb25seSB0aGluZyB3ZSBjYXJlIGFib3V0IGhlcmUgaXMgYSBwb3J0IGNoYW5nZS4gU2luY2UgdGhpcyBub3QgbmVlZGVkLAorICAgICAgIGlnbm9yZSB0aGUgcmVxdWVzdC4gKi8KKyAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIlczogJXMgY2FsbGVkLlxuIiwgZGV2LT5uYW1lLCBfX0ZVTkNfXyApOworCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuIDA7Cit9IC8vIHdsX2NvbmZpZworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3N0YXRzKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgUmV0dXJuIHRoZSBjdXJyZW50IGRldmljZSBzdGF0aXN0aWNzLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgYSBwb2ludGVyIHRvIGEgbmV0X2RldmljZV9zdGF0cyBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgbmV0d29yaworICogICAgICBzdGF0aXN0aWNzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqd2xfc3RhdHMoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworI2lmZGVmIFVTRV9XRFMKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ7CisjZW5kaWYgIC8qIFVTRV9XRFMgKi8KKyAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgZmxhZ3M7CisgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgICAgICpwU3RhdHM7CisgICAgc3RydWN0IHdsX3ByaXZhdGUgICAgICAgICAgICpscCA9IHdsX3ByaXYoZGV2KTsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvL0RCR19GVU5DKCAid2xfc3RhdHMiICk7CisgICAgLy9EQkdfRU5URVIoIERiZ0luZm8gKTsKKyAgICAvL0RCR19QQVJBTSggRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldiApOworCisgICAgcFN0YXRzID0gTlVMTDsKKworICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworI2lmZGVmIFVTRV9SVFMKKyAgICBpZiggbHAtPnVzZVJUUyA9PSAxICkgeworCXdsX3VubG9jayggbHAsICZmbGFncyApOworCisJLy9EQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisjZW5kaWYgIC8qIFVTRV9SVFMgKi8KKworICAgIC8qIFJldHVybiB0aGUgc3RhdGlzdGljcyBmb3IgdGhlIGFwcHJvcHJpYXRlIGRldmljZSAqLworI2lmZGVmIFVTRV9XRFMKKworICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7CisJaWYoIGRldiA9PSBscC0+d2RzX3BvcnRbY291bnRdLmRldiApIHsKKwkgICAgcFN0YXRzID0gJiggbHAtPndkc19wb3J0W2NvdW50XS5zdGF0cyApOworCX0KKyAgICB9CisKKyNlbmRpZiAgLyogVVNFX1dEUyAqLworCisgICAgLyogSWYgcFN0YXRzIGlzIHN0aWxsIE5VTEwsIHRoZW4gdGhlIGRldmljZSBpcyBub3QgYSBXRFMgcG9ydCAqLworICAgIGlmKCBwU3RhdHMgPT0gTlVMTCApIHsKKyAgICAgICAgcFN0YXRzID0gJiggbHAtPnN0YXRzICk7CisgICAgfQorCisgICAgd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAvL0RCR19MRUFWRSggRGJnSW5mbyApOworCisgICAgcmV0dXJuIHBTdGF0czsKK30gLy8gd2xfc3RhdHMKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9vcGVuKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgT3BlbiB0aGUgZGV2aWNlLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGludCAgICAgICAgICAgICAgICAgc3RhdHVzID0gSENGX1NVQ0NFU1M7CisgICAgc3RydWN0IHdsX3ByaXZhdGUgICAqbHAgPSB3bF9wcml2KGRldik7CisgICAgdW5zaWduZWQgbG9uZyAgICAgICBmbGFnczsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX29wZW4iICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKyAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyNpZmRlZiBVU0VfUlRTCisgICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKKwlEQkdfVFJBQ0UoIERiZ0luZm8sICJTa2lwcGluZyBkZXZpY2Ugb3BlbiwgaW4gUlRTIG1vZGVcbiIgKTsKKwl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gLUVJTzsKKyAgICB9CisjZW5kaWYgIC8qIFVTRV9SVFMgKi8KKworI2lmZGVmIFVTRV9QUk9GSUxFCisgICAgcGFyc2VfY29uZmlnKCBkZXYgKTsKKyNlbmRpZgorCisgICAgaWYoIGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCApIHsKKwlEQkdfVFJBQ0UoIERiZ0luZm8sICJFbmFibGluZyBQb3J0IDBcbiIgKTsKKwlzdGF0dXMgPSB3bF9lbmFibGUoIGxwICk7CisKKyAgICAgICAgaWYoIHN0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApIHsKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIkVuYWJsZSBwb3J0IDAgZmFpbGVkOiAweCV4XG4iLCBzdGF0dXMgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEhvbGRpbmcgdGhlIGxvY2sgdG9vIGxvbmcsIG1ha2UgYSBnYXAgdG8gYWxsb3cgb3RoZXIgcHJvY2Vzc2VzCisgICAgd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIGlmICggc3RybGVuKCBscC0+ZndfaW1hZ2VfZmlsZW5hbWUgKSApIHsKKwlEQkdfVFJBQ0UoIERiZ0luZm8sICI7Pz8/PyBLbHVkZ3kgd2F5IHRvIGZvcmNlIGEgZG93bmxvYWRcbiIgKTsKKwlzdGF0dXMgPSB3bF9nbyggbHAgKTsKKyAgICB9IGVsc2UgeworCXN0YXR1cyA9IHdsX2FwcGx5KCBscCApOworICAgIH0KKworICAgIC8vIEhvbGRpbmcgdGhlIGxvY2sgdG9vIGxvbmcsIG1ha2UgYSBnYXAgdG8gYWxsb3cgb3RoZXIgcHJvY2Vzc2VzCisgICAgd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIGlmKCBzdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7CisJLy8gVW5zdWNjZXNmdWxsLCB0cnkgcmVzZXQgb2YgdGhlIGNhcmQgdG8gcmVjb3ZlcgorCXN0YXR1cyA9IHdsX3Jlc2V0KCBkZXYgKTsKKyAgICB9CisKKyAgICAvLyBIb2xkaW5nIHRoZSBsb2NrIHRvbyBsb25nLCBtYWtlIGEgZ2FwIHRvIGFsbG93IG90aGVyIHByb2Nlc3NlcworICAgIHdsX3VubG9jayhscCwgJmZsYWdzKTsKKyAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICBpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgeworCW5ldGlmX2NhcnJpZXJfb24oIGRldiApOworCVdMX1dEU19ORVRJRl9DQVJSSUVSX09OKCBscCApOworCisJbHAtPmlzX2hhbmRsaW5nX2ludCA9IFdMX0hBTkRMSU5HX0lOVDsgLy8gU3RhcnQgaGFuZGxpbmcgaW50ZXJydXB0cworICAgICAgICB3bF9hY3RfaW50X29uKCBscCApOworCisJbmV0aWZfc3RhcnRfcXVldWUoIGRldiApOworCVdMX1dEU19ORVRJRl9TVEFSVF9RVUVVRSggbHAgKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3bF9oY2ZfZXJyb3IoIGRldiwgc3RhdHVzICk7CQkvKiBSZXBvcnQgdGhlIGVycm9yICovCisgICAgICAgIG5ldGlmX2RldmljZV9kZXRhY2goIGRldiApOwkJLyogU3RvcCB0aGUgZGV2aWNlIGFuZCBxdWV1ZSAqLworICAgIH0KKworICAgIHdsX3VubG9jayggbHAsICZmbGFncyApOworCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLy8gd2xfb3BlbgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2Nsb3NlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQ2xvc2UgdGhlIGRldmljZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX2Nsb3NlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICpscCA9IHdsX3ByaXYoZGV2KTsKKyAgICB1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoIndsX2Nsb3NlIik7CisgICAgREJHX0VOVEVSKERiZ0luZm8pOworICAgIERCR19QQVJBTShEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2KTsKKworICAgIC8qIE1hcmsgdGhlIGFkYXB0ZXIgYXMgYnVzeSAqLworICAgIG5ldGlmX3N0b3BfcXVldWUoIGRldiApOworICAgIFdMX1dEU19ORVRJRl9TVE9QX1FVRVVFKCBscCApOworCisgICAgbmV0aWZfY2Fycmllcl9vZmYoIGRldiApOworICAgIFdMX1dEU19ORVRJRl9DQVJSSUVSX09GRiggbHAgKTsKKworICAgIC8qIFNodXRkb3duIHRoZSBhZGFwdGVyOgorICAgICAgICAgICAgRGlzYWJsZSBhZGFwdGVyIGludGVycnVwdHMKKyAgICAgICAgICAgIFN0b3AgVHgvUngKKyAgICAgICAgICAgIFVwZGF0ZSBzdGF0aXN0aWNzCisgICAgICAgICAgICBTZXQgbG93IHBvd2VyIG1vZGUKKyAgICAqLworCisgICAgd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgd2xfYWN0X2ludF9vZmYoIGxwICk7CisgICAgbHAtPmlzX2hhbmRsaW5nX2ludCA9IFdMX05PVF9IQU5ETElOR19JTlQ7IC8vIFN0b3AgaGFuZGxpbmcgaW50ZXJydXB0cworCisjaWZkZWYgVVNFX1JUUworICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7CisJREJHX1RSQUNFKCBEYmdJbmZvLCAiU2tpcHBpbmcgZGV2aWNlIGNsb3NlLCBpbiBSVFMgbW9kZVxuIiApOworCXdsX3VubG9jayggbHAsICZmbGFncyApOworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiAtRUlPOworICAgIH0KKyNlbmRpZiAgLyogVVNFX1JUUyAqLworCisgICAgLyogRGlzYWJsZSB0aGUgcG9ydHMgKi8KKyAgICB3bF9kaXNhYmxlKCBscCApOworCisgICAgd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm4gMDsKK30gLy8gd2xfY2xvc2UKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHdsX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisgICAgc3RybmNweShpbmZvLT5kcml2ZXIsIERSSVZFUl9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSAtIDEpOworICAgIHN0cm5jcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT05fU1RSLCBzaXplb2YoaW5mby0+dmVyc2lvbikgLSAxKTsKKy8vCXN0cm5jcHkoaW5mby5md192ZXJzaW9uLCBwcml2LT5md19uYW1lLAorLy8Jc2l6ZW9mKGluZm8uZndfdmVyc2lvbikgLSAxKTsKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMjApKQorICAgIGlmIChkZXYtPmRldi5wYXJlbnQpIHsKKyAgICAJZGV2X3NldF9uYW1lKGRldi0+ZGV2LnBhcmVudCwgIiVzIiwgaW5mby0+YnVzX2luZm8pOworCS8vc3RybmNweShpbmZvLT5idXNfaW5mbywgZGV2LT5kZXYucGFyZW50LT5idXNfaWQsCisJLy8Jc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSAtIDEpOworI2Vsc2UKKwkgICAgaWYgKGRldi0+Y2xhc3NfZGV2LnBhcmVudCkgeworCQlzaXplb2YoaW5mby0+YnVzX2luZm8pIC0gMSk7CisjZW5kaWYKKyAgICB9IGVsc2UgeworCXNucHJpbnRmKGluZm8tPmJ1c19pbmZvLCBzaXplb2YoaW5mby0+YnVzX2luZm8pIC0gMSwKKwkJIlBDTUNJQSBGSVhNRSIpOworLy8JCSAgICAiUENNQ0lBIDB4JWx4IiwgcHJpdi0+aHcuaW9iYXNlKTsKKyAgICB9Cit9IC8vIHdsX2dldF9kcnZpbmZvCisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgd2xfZXRodG9vbF9vcHMgPSB7CisgICAgLmdldF9kcnZpbmZvID0gd2xfZ2V0X2RydmluZm8sCisgICAgLmdldF9saW5rID0gZXRodG9vbF9vcF9nZXRfbGluaywKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2lvY3RsKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhlIElPQ1RMIGhhbmRsZXIgZm9yIHRoZSBkZXZpY2UuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0LgorICogICAgICBycSAgLSBhIHBvaW50ZXIgdG8gdGhlIElPQ1RMIHJlcXVlc3QgYnVmZmVyLgorICogICAgICBjbWQgLSB0aGUgSU9DVEwgY29tbWFuZCBjb2RlLgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfaW9jdGwoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQgKQoreworICAgIHN0cnVjdCB3bF9wcml2YXRlICAqbHAgPSB3bF9wcml2KGRldik7CisgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgZmxhZ3M7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX2lvY3RsIiApOworICAgIERCR19FTlRFUihEYmdJbmZvKTsKKyAgICBEQkdfUEFSQU0oRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldik7CisgICAgREJHX1BBUkFNKERiZ0luZm8sICJycSIsICIweCVwIiwgcnEpOworICAgIERCR19QQVJBTShEYmdJbmZvLCAiY21kIiwgIjB4JTA0eCIsIGNtZCk7CisKKyAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICB3bF9hY3RfaW50X29mZiggbHAgKTsKKworI2lmZGVmIFVTRV9SVFMKKyAgICBpZiggbHAtPnVzZVJUUyA9PSAxICkgeworCS8qIEhhbmRsZSBhbnkgUlRTIElPQ1RMIGhlcmUgKi8KKwlpZiggY21kID09IFdMX0lPQ1RMX1JUUyApIHsKKwkgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiSU9DVEw6IFdMX0lPQ1RMX1JUU1xuIiApOworCSAgICByZXQgPSB3dmxhbl9ydHMoIChzdHJ1Y3QgcnRzcmVxICopcnEsIGRldi0+YmFzZV9hZGRyICk7CisJfSBlbHNlIHsKKwkgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiSU9DVEwgbm90IHN1cHBvcnRlZCBpbiBSVFMgbW9kZTogMHglWFxuIiwgY21kICk7CisJICAgIHJldCA9IC1FT1BOT1RTVVBQOworCX0KKworCWdvdG8gb3V0X2FjdF9pbnRfb25fdW5sb2NrOworICAgIH0KKyNlbmRpZiAgLyogVVNFX1JUUyAqLworCisgICAgLyogT25seSBoYW5kbGUgVUlMIElPQ1RMIHJlcXVlc3RzIHdoZW4gdGhlIFVJTCBoYXMgdGhlIHN5c3RlbSBibG9ja2VkLiAqLworICAgIGlmKCAhKCggbHAtPmZsYWdzICYgV1ZMQU4yX1VJTF9CVVNZICkgJiYgKCBjbWQgIT0gV1ZMQU4yX0lPQ1RMX1VJTCApKSkgeworI2lmZGVmIFVTRV9VSUwKKwlzdHJ1Y3QgdWlscmVxICAqdXJxID0gKHN0cnVjdCB1aWxyZXEgKilycTsKKyNlbmRpZiAvKiBVU0VfVUlMICovCisKKwlzd2l0Y2goIGNtZCApIHsKKwkJLy8gPT09PT09PT09PT09PT09PT09IFByaXZhdGUgSU9DVExzICh1cCB0byAxNikgPT09PT09PT09PT09PT09PT09CisjaWZkZWYgVVNFX1VJTAorCWNhc2UgV1ZMQU4yX0lPQ1RMX1VJTDoKKwkgICAgIERCR19UUkFDRSggRGJnSW5mbywgIklPQ1RMOiBXVkxBTjJfSU9DVExfVUlMXG4iICk7CisJICAgICByZXQgPSB3dmxhbl91aWwoIHVycSwgbHAgKTsKKwkgICAgIGJyZWFrOworI2VuZGlmICAvKiBVU0VfVUlMICovCisKKwlkZWZhdWx0OgorCSAgICAgREJHX1RSQUNFKERiZ0luZm8sICJJT0NUTCBDT0RFIE5PVCBTVVBQT1JURUQ6IDB4JVhcbiIsIGNtZCApOworCSAgICAgcmV0ID0gLUVPUE5PVFNVUFA7CisJICAgICBicmVhazsKKwl9CisgICAgfSBlbHNlIHsKKwlEQkdfV0FSTklORyggRGJnSW5mbywgIkRFVklDRSBJUyBCVVNZLCBDQU5OT1QgUFJPQ0VTUyBSRVFVRVNUXG4iICk7CisJcmV0ID0gLUVCVVNZOworICAgIH0KKworI2lmZGVmIFVTRV9SVFMKK291dF9hY3RfaW50X29uX3VubG9jazoKKyNlbmRpZiAgLyogVVNFX1JUUyAqLworICAgIHdsX2FjdF9pbnRfb24oIGxwICk7CisKKyAgICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybiByZXQ7Cit9IC8vIHdsX2lvY3RsCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK3ZvaWQgd2xfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIHN0cnVjdCBwdF9yZWdzIHJlZ3M7CisKKyAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CisgICAgd2xfaXNyKGRldi0+aXJxLCBkZXYsICZyZWdzKTsKKyAgICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfdHhfdGltZW91dCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoZSBoYW5kbGVyIGNhbGxlZCB3aGVuLCBmb3Igc29tZSByZWFzb24sIGEgVHggcmVxdWVzdCBpcyBub3QgY29tcGxldGVkLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdC4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3R4X3RpbWVvdXQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworI2lmZGVmIFVTRV9XRFMKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBjb3VudDsKKyNlbmRpZiAgLyogVVNFX1dEUyAqLworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIGZsYWdzOworICAgIHN0cnVjdCB3bF9wcml2YXRlICAgICAgICpscCA9IHdsX3ByaXYoZGV2KTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcFN0YXRzID0gTlVMTDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX3R4X3RpbWVvdXQiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKyAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIiVzOiBUcmFuc21pdCB0aW1lb3V0LlxuIiwgZGV2LT5uYW1lICk7CisKKyAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyNpZmRlZiBVU0VfUlRTCisgICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKKwlEQkdfVFJBQ0UoIERiZ0luZm8sICJTa2lwcGluZyB0eF90aW1lb3V0IGhhbmRsZXIsIGluIFJUUyBtb2RlXG4iICk7CisJd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm47CisgICAgfQorI2VuZGlmICAvKiBVU0VfUlRTICovCisKKyAgICAvKiBGaWd1cmUgb3V0IHdoaWNoIGRldmljZSAodGhlICJyb290IiBkZXZpY2Ugb3IgV0RTIHBvcnQpIHRoaXMgdGltZW91dAorICAgICAgIGlzIGZvciAqLworI2lmZGVmIFVTRV9XRFMKKworICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7CisJaWYoIGRldiA9PSBscC0+d2RzX3BvcnRbY291bnRdLmRldiApIHsKKwkgICAgcFN0YXRzID0gJiggbHAtPndkc19wb3J0W2NvdW50XS5zdGF0cyApOworCisJICAgIC8qIEJyZWFrIHRoZSBsb29wIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGUgY291bnRlciB0byBhY2Nlc3MgV0RTCisJICAgICAgIGluZm9ybWF0aW9uIGluIHRoZSBwcml2YXRlIHN0cnVjdHVyZSAqLworCSAgICBicmVhazsKKwl9CisgICAgfQorCisjZW5kaWYgIC8qIFVTRV9XRFMgKi8KKworICAgIC8qIElmIHBTdGF0cyBpcyBzdGlsbCBOVUxMLCB0aGVuIHRoZSBkZXZpY2UgaXMgbm90IGEgV0RTIHBvcnQgKi8KKyAgICBpZiggcFN0YXRzID09IE5VTEwgKSB7CisJcFN0YXRzID0gJiggbHAtPnN0YXRzICk7CisgICAgfQorCisgICAgLyogQWNjdW11bGF0ZSB0aGUgdGltZW91dCBlcnJvciAqLworICAgIHBTdGF0cy0+dHhfZXJyb3JzKys7CisKKyAgICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybjsKK30gLy8gd2xfdHhfdGltZW91dAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3NlbmQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGUgcm91dGluZSB3aGljaCBwZXJmb3JtcyBkYXRhIHRyYW5zbWl0cy4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3Mgd2xfcHJpdmF0ZSBzdHJ1Y3QuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgMSBvbiBlcnJvcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfc2VuZCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKworICAgIGludCAgICAgICAgICAgICAgICAgc3RhdHVzOworICAgIERFU0NfU1RSQ1QgICAgICAgICAgKmRlc2M7CisgICAgV1ZMQU5fTEZSQU1FICAgICAgICAqdHhGID0gTlVMTDsKKyAgICBzdHJ1Y3QgbGlzdF9oZWFkICAgICplbGVtZW50OworICAgIGludCAgICAgICAgICAgICAgICAgbGVuOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfc2VuZCIgKTsKKworICAgIGlmKCBscCA9PSBOVUxMICkgeworICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJQcml2YXRlIGFkYXB0ZXIgc3RydWN0IGlzIE5VTExcbiIgKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpZiggbHAtPmRldiA9PSBOVUxMICkgeworICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJuZXRfZGV2aWNlIHN0cnVjdCBpbiB3bF9wcml2YXRlIGlzIE5VTExcbiIgKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIENoZWNrIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIEZJRHM7IGlmIG5vbmUgYXJlIGF2YWlsYWJsZSwgZG9uJ3QgdGFrZSBhbnkKKyAgICAgICBmcmFtZXMgb2ZmIHRoZSB0eFEgKi8KKyAgICBpZiggbHAtPmhjZkN0eC5JRkJfUnNjSW5kID09IDAgKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvKiBSZWNsYWltIHRoZSBUeFEgRWxlbWVudHMgYW5kIHBsYWNlIHRoZW0gYmFjayBvbiB0aGUgZnJlZSBxdWV1ZSAqLworICAgIGlmKCAhbGlzdF9lbXB0eSggJiggbHAtPnR4UVswXSApKSkgeworICAgICAgICBlbGVtZW50ID0gbHAtPnR4UVswXS5uZXh0OworCisgICAgICAgIHR4RiA9IChXVkxBTl9MRlJBTUUgKiApbGlzdF9lbnRyeSggZWxlbWVudCwgV1ZMQU5fTEZSQU1FLCBub2RlICk7CisgICAgICAgIGlmKCB0eEYgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIGxwLT50eEYuc2tiICA9IHR4Ri0+ZnJhbWUuc2tiOworICAgICAgICAgICAgbHAtPnR4Ri5wb3J0ID0gdHhGLT5mcmFtZS5wb3J0OworCisgICAgICAgICAgICB0eEYtPmZyYW1lLnNrYiAgPSBOVUxMOworICAgICAgICAgICAgdHhGLT5mcmFtZS5wb3J0ID0gMDsKKworICAgICAgICAgICAgbGlzdF9kZWwoICYoIHR4Ri0+bm9kZSApKTsKKyAgICAgICAgICAgIGxpc3RfYWRkKCBlbGVtZW50LCAmKCBscC0+dHhGcmVlICkpOworCisgICAgICAgICAgICBscC0+dHhRX2NvdW50LS07CisKKyAgICAgICAgICAgIGlmKCBscC0+dHhRX2NvdW50IDwgVFhfUV9MT1dfV0FURVJfTUFSSyApIHsKKyAgICAgICAgICAgICAgICBpZiggbHAtPm5ldGlmX3F1ZXVlX29uID09IEZBTFNFICkgeworICAgICAgICAgICAgICAgICAgICBEQkdfVFgoIERiZ0luZm8sICJLaWNrc3RhcnRpbmcgUTogJWRcbiIsIGxwLT50eFFfY291bnQgKTsKKyAgICAgICAgICAgICAgICAgICAgbmV0aWZfd2FrZV9xdWV1ZSggbHAtPmRldiApOworICAgICAgICAgICAgICAgICAgICBXTF9XRFNfTkVUSUZfV0FLRV9RVUVVRSggbHAgKTsKKyAgICAgICAgICAgICAgICAgICAgbHAtPm5ldGlmX3F1ZXVlX29uID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggbHAtPnR4Ri5za2IgPT0gTlVMTCApIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIElmIHRoZSBkZXZpY2UgaGFzIHJlc291cmNlcyAoRklEcykgYXZhaWxhYmxlLCB0aGVuIFR4IHRoZSBwYWNrZXQgKi8KKyAgICAvKiBGb3JtYXQgdGhlIFR4UmVxdWVzdCBhbmQgc2VuZCBpdCB0byB0aGUgYWRhcHRlciAqLworICAgIGxlbiA9IGxwLT50eEYuc2tiLT5sZW4gPCBFVEhfWkxFTiA/IEVUSF9aTEVOIDogbHAtPnR4Ri5za2ItPmxlbjsKKworICAgIGRlc2MgICAgICAgICAgICAgICAgICAgID0gJiggbHAtPmRlc2NfdHggKTsKKyAgICBkZXNjLT5idWZfYWRkciAgICAgICAgICA9IGxwLT50eEYuc2tiLT5kYXRhOworICAgIGRlc2MtPkJVRl9DTlQgICAgICAgICAgID0gbGVuOworICAgIGRlc2MtPm5leHRfZGVzY19hZGRyICAgID0gTlVMTDsKKworICAgIHN0YXR1cyA9IGhjZl9zZW5kX21zZyggJiggbHAtPmhjZkN0eCApLCBkZXNjLCBscC0+dHhGLnBvcnQgKTsKKworICAgIGlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CisgICAgICAgIGxwLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworICAgICAgICBEQkdfVFgoIERiZ0luZm8sICJUcmFuc21pdC4uLlxuIiApOworCisgICAgICAgIGlmKCBscC0+dHhGLnBvcnQgPT0gSENGX1BPUlRfMCApIHsKKyAgICAgICAgICAgIGxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisgICAgICAgICAgICBscC0+c3RhdHMudHhfYnl0ZXMgKz0gbHAtPnR4Ri5za2ItPmxlbjsKKyAgICAgICAgfQorCisjaWZkZWYgVVNFX1dEUworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxwLT53ZHNfcG9ydFsoKCBscC0+dHhGLnBvcnQgPj4gOCApIC0gMSldLnN0YXRzLnR4X3BhY2tldHMrKzsKKyAgICAgICAgICAgIGxwLT53ZHNfcG9ydFsoKCBscC0+dHhGLnBvcnQgPj4gOCApIC0gMSldLnN0YXRzLnR4X2J5dGVzICs9IGxwLT50eEYuc2tiLT5sZW47CisgICAgICAgIH0KKworI2VuZGlmICAvKiBVU0VfV0RTICovCisKKyAgICAgICAgLyogRnJlZSB0aGUgc2tiIGFuZCBwZXJmb3JtIHF1ZXVlIGNsZWFudXAsIGFzIHRoZSBidWZmZXIgd2FzCisgICAgICAgICAgICB0cmFuc21pdHRlZCBzdWNjZXNzZnVsbHkgKi8KKyAgICAgICAgZGV2X2tmcmVlX3NrYiggbHAtPnR4Ri5za2IgKTsKKworICAgICAgICBscC0+dHhGLnNrYiA9IE5VTEw7CisgICAgICAgIGxwLT50eEYucG9ydCA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9IC8vIHdsX3NlbmQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF90eCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoZSBUeCBoYW5kbGVyIGZ1bmN0aW9uIGZvciB0aGUgbmV0d29yayBsYXllci4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHNrYiAtIGEgcG9pbnRlciB0byB0aGUgc2tfYnVmZiBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgZGF0YSB0byB0cmFuc2Zlci4KKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZS4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICAxIG9uIGVycm9yCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF90eCggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBvcnQgKQoreworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIGZsYWdzOworICAgIHN0cnVjdCB3bF9wcml2YXRlICAgICAgICpscCA9IHdsX3ByaXYoZGV2KTsKKyAgICBXVkxBTl9MRlJBTUUgICAgICAgICAgICAqdHhGID0gTlVMTDsKKyAgICBzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAqZWxlbWVudDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX3R4IiApOworCisgICAgLyogR3JhYiB0aGUgc3BpbmxvY2sgKi8KKyAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICBpZiggbHAtPmZsYWdzICYgV1ZMQU4yX1VJTF9CVVNZICkgeworICAgICAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIlVJTCBoYXMgZGV2aWNlIGJsb2NrZWRcbiIgKTsKKyAgICAgICAgLyogU3RhcnQgZHJvcHBpbmcgcGFja2V0cyBoZXJlPz8/ICovCisJd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworI2lmZGVmIFVTRV9SVFMKKyAgICBpZiggbHAtPnVzZVJUUyA9PSAxICkgeworICAgICAgICBEQkdfUFJJTlQoICJSVFM6IHdlJ3JlIGdldHRpbmcgYSBUeC4uLlxuIiApOworCXdsX3VubG9jayggbHAsICZmbGFncyApOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisjZW5kaWYgIC8qIFVTRV9SVFMgKi8KKworICAgIGlmKCAhbHAtPnVzZV9kbWEgKSB7CisgICAgICAgIC8qIEdldCBhbiBlbGVtZW50IGZyb20gdGhlIHF1ZXVlICovCisgICAgICAgIGVsZW1lbnQgPSBscC0+dHhGcmVlLm5leHQ7CisgICAgICAgIHR4RiA9IChXVkxBTl9MRlJBTUUgKilsaXN0X2VudHJ5KCBlbGVtZW50LCBXVkxBTl9MRlJBTUUsIG5vZGUgKTsKKyAgICAgICAgaWYoIHR4RiA9PSBOVUxMICkgeworICAgICAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiUHJvYmxlbSB3aXRoIGxpc3RfZW50cnlcbiIgKTsKKwkgICAgd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICAvKiBGaWxsIG91dCB0aGUgZnJhbWUgKi8KKyAgICAgICAgdHhGLT5mcmFtZS5za2IgPSBza2I7CisgICAgICAgIHR4Ri0+ZnJhbWUucG9ydCA9IHBvcnQ7CisgICAgICAgIC8qIE1vdmUgdGhlIGZyYW1lIHRvIHRoZSB0eFEgKi8KKyAgICAgICAgLyogTk9URTogSGVyZSdzIHdoZXJlIHdlIHdvdWxkIGRvIHByaW9yaXR5IHF1ZXVlaW5nICovCisgICAgICAgIGxpc3RfZGVsKCAmKCB0eEYtPm5vZGUgKSk7CisgICAgICAgIGxpc3RfYWRkKCAmKCB0eEYtPm5vZGUgKSwgJiggbHAtPnR4UVswXSApKTsKKworICAgICAgICBscC0+dHhRX2NvdW50Kys7CisgICAgICAgIGlmKCBscC0+dHhRX2NvdW50ID49IERFRkFVTFRfTlVNX1RYX0ZSQU1FUyApIHsKKyAgICAgICAgICAgIERCR19UWCggRGJnSW5mbywgIlEgRnVsbDogJWRcbiIsIGxwLT50eFFfY291bnQgKTsKKyAgICAgICAgICAgIGlmKCBscC0+bmV0aWZfcXVldWVfb24gPT0gVFJVRSApIHsKKyAgICAgICAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKCBscC0+ZGV2ICk7CisgICAgICAgICAgICAgICAgV0xfV0RTX05FVElGX1NUT1BfUVVFVUUoIGxwICk7CisgICAgICAgICAgICAgICAgbHAtPm5ldGlmX3F1ZXVlX29uID0gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgd2xfYWN0X2ludF9vZmYoIGxwICk7IC8qIERpc2FibGUgSW50ZXJydXB0cyAqLworCisgICAgLyogU2VuZCB0aGUgZGF0YSB0byB0aGUgaGFyZHdhcmUgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZCAqLworI2lmZGVmIEVOQUJMRV9ETUEKKyAgICBpZiggbHAtPnVzZV9kbWEgKSB7CisgICAgICAgIHdsX3NlbmRfZG1hKCBscCwgc2tiLCBwb3J0ICk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgICAgd2xfc2VuZCggbHAgKTsKKyAgICB9CisgICAgLyogUmUtZW5hYmxlIEludGVycnVwdHMsIHJlbGVhc2UgdGhlIHNwaW5sb2NrIGFuZCByZXR1cm4gKi8KKyAgICB3bF9hY3RfaW50X29uKCBscCApOworICAgIHdsX3VubG9jayggbHAsICZmbGFncyApOworICAgIHJldHVybiAwOworfSAvLyB3bF90eAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3J4KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhlIHJvdXRpbmUgd2hpY2ggcGVyZm9ybXMgZGF0YSByZWNlcHRpb24uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlLgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIDEgb24gZXJyb3IKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgcG9ydDsKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAqc2tiOworICAgIHN0cnVjdCB3bF9wcml2YXRlICAgICAgICpscCA9IHdsX3ByaXYoZGV2KTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisgICAgaGNmXzE2ICAgICAgICAgICAgICAgICAgcGt0bGVuOworICAgIGhjZl8xNiAgICAgICAgICAgICAgICAgIGhmc19zdGF0OworICAgIERFU0NfU1RSQ1QgICAgICAgICAgICAgICpkZXNjOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCJ3bF9yeCIpCisgICAgREJHX1BBUkFNKERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYpOworCisgICAgaWYoISggbHAtPmZsYWdzICYgV1ZMQU4yX1VJTF9CVVNZICkpIHsKKworI2lmZGVmIFVTRV9SVFMKKyAgICAgICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKKyAgICAgICAgICAgIERCR19QUklOVCggIlJUUzogV2UncmUgZ2V0dGluZyBhbiBSeC4uLlxuIiApOworICAgICAgICAgICAgcmV0dXJuIC1FSU87CisgICAgICAgIH0KKyNlbmRpZiAgLyogVVNFX1JUUyAqLworCisgICAgICAgIC8qIFJlYWQgdGhlIEhGU19TVEFUIHJlZ2lzdGVyIGZyb20gdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KKyAgICAgICAgaGZzX3N0YXQgPSAoaGNmXzE2KSgoIGxwLT5sb29rQWhlYWRCdWZbSEZTX1NUQVRdICkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICggbHAtPmxvb2tBaGVhZEJ1ZltIRlNfU1RBVCArIDFdIDw8IDggKSk7CisKKyAgICAgICAgLyogTWFrZSBzdXJlIHRoZSBmcmFtZSBpc24ndCBiYWQgKi8KKyAgICAgICAgaWYoKCBoZnNfc3RhdCAmIEhGU19TVEFUX0VSUiApICE9IEhDRl9TVUNDRVNTICkgeworICAgICAgICAgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICJIRlNfU1RBVF9FUlJPUiAoMHgleCkgaW4gUnggUGFja2V0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5sb29rQWhlYWRCdWZbSEZTX1NUQVRdICk7CisgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgfQorCisgICAgICAgIC8qIERldGVybWluZSB3aGF0IHBvcnQgdGhpcyBwYWNrZXQgaXMgZm9yICovCisgICAgICAgIHBvcnQgPSAoIGhmc19zdGF0ID4+IDggKSAmIDB4MDAwNzsKKyAgICAgICAgREJHX1JYKCBEYmdJbmZvLCAiUnggZnJhbWUgZm9yIHBvcnQgJWRcbiIsIHBvcnQgKTsKKworICAgICAgICBpZigoIHBrdGxlbiA9IGxwLT5oY2ZDdHguSUZCX1J4TGVuICkgIT0gMCApIHsKKyAgICAgICAgICAgIGlmKCggc2tiID0gQUxMT0NfU0tCKCBwa3RsZW4gKSkgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIG5ldGRldiBiYXNlZCBvbiB0aGUgcG9ydCAqLworICAgICAgICAgICAgICAgIHN3aXRjaCggcG9ydCApIHsKKyNpZmRlZiBVU0VfV0RTCisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgIHNrYi0+ZGV2ID0gbHAtPndkc19wb3J0W3BvcnQtMV0uZGV2OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAgLyogVVNFX1dEUyAqLworCisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHNrYi0+ZGV2ID0gZGV2OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZXNjID0gJiggbHAtPmRlc2NfcnggKTsKKworICAgICAgICAgICAgICAgIGRlc2MtPm5leHRfZGVzY19hZGRyID0gTlVMTDsKKworLyoKKyNkZWZpbmUgQkxPQ0tfSU5QVVQoYnVmLCBsZW4pIFwKKyAgICBkZXNjLT5idWZfYWRkciA9IGJ1ZjsgXAorICAgIGRlc2MtPkJVRl9TSVpFID0gbGVuOyBcCisgICAgc3RhdHVzID0gaGNmX3Jjdl9tc2coJihscC0+aGNmQ3R4KSwgZGVzYywgMCkKKyovCisKKyAgICAgICAgICAgICAgICBHRVRfUEFDS0VUKCBza2ItPmRldiwgc2tiLCBwa3RsZW4gKTsKKworICAgICAgICAgICAgICAgIGlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CisgICAgICAgICAgICAgICAgICAgIG5ldGlmX3J4KCBza2IgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiggcG9ydCA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RsZW47CisgICAgICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBVU0VfV0RTCisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W3BvcnQtMV0uc3RhdHMucnhfcGFja2V0cysrOworICAgICAgICAgICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W3BvcnQtMV0uc3RhdHMucnhfYnl0ZXMgKz0gcGt0bGVuOworICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgIC8qIFVTRV9XRFMgKi8KKworICAgICAgICAgICAgICAgICAgICBkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCisjaWZkZWYgV0lSRUxFU1NfRVhUCisjaWZkZWYgV0lSRUxFU1NfU1BZCisgICAgICAgICAgICAgICAgICAgIGlmKCBscC0+c3B5ZGF0YS5zcHlfbnVtYmVyID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnNyY2FkZHIgPSBza2ItPm1hYy5yYXcgKyBNQUNfQUREUl9TSVpFOworCisgICAgICAgICAgICAgICAgICAgICAgICB3bF9zcHlfZ2F0aGVyKCBkZXYsIHNyY2FkZHIgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIFdJUkVMRVNTX1NQWSAqLworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCAqLworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIlJ4IHJlcXVlc3QgdG8gY2FyZCBGQUlMRURcbiIgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiggcG9ydCA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorI2lmZGVmIFVTRV9XRFMKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbcG9ydC0xXS5zdGF0cy5yeF9kcm9wcGVkKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAgLyogVVNFX1dEUyAqLworCisgICAgICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2IoIHNrYiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiQ291bGQgbm90IGFsbG9jIHNrYlxuIiApOworCisgICAgICAgICAgICAgICAgaWYoIHBvcnQgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKyAgICAgICAgICAgICAgICB9CisjaWZkZWYgVVNFX1dEUworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtwb3J0LTFdLnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgIC8qIFVTRV9XRFMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfSAvLyB3bF9yeAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX211bHRpY2FzdCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIHRvIGhhbmRsZSBtdWx0aWNhc3QgcGFja2V0cworICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZS4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgTkVXX01VTFRJQ0FTVAorCit2b2lkIHdsX211bHRpY2FzdCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisjaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9TVEEgLy87P3Nob3VsZCB3ZSByZXR1cm4gYW4gZXJyb3Igc3RhdHVzIGluIEFQIG1vZGUKKy8vOz9zZWVtcyByZWFzb25hYmxlIHRoYXQgZXZlbiBhbiBBUC1vbmx5IGRyaXZlciBjb3VsZCBhZmZvcmQgdGhpcyBzbWFsbCBhZGRpdGlvbmFsIGZvb3RwcmludAorCisgICAgaW50ICAgICAgICAgICAgICAgICB4OworICAgIHN0cnVjdCBkZXZfbWNfbGlzdCAgKm1jbGlzdDsKKyAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICpscCA9IHdsX3ByaXYoZGV2KTsKKyAgICB1bnNpZ25lZCBsb25nICAgICAgIGZsYWdzOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfbXVsdGljYXN0IiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworICAgIERCR19QQVJBTSggRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldiApOworCisgICAgaWYoICF3bF9hZGFwdGVyX2lzX29wZW4oIGRldiApKSB7CisgICAgICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWYgREJHCisgICAgaWYoIERCR19GTEFHUyggRGJnSW5mbyApICYgREJHX1BBUkFNX09OICkgeworICAgICAgICBEQkdfUFJJTlQoIiAgZmxhZ3M6ICVzJXMlc1xuIiwKKyAgICAgICAgICAgICggZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDICkgPyAiUHJvbWlzY291cyAiIDogIiIsCisgICAgICAgICAgICAoIGRldi0+ZmxhZ3MgJiBJRkZfTVVMVElDQVNUICkgPyAiTXVsdGljYXN0ICIgOiAiIiwKKyAgICAgICAgICAgICggZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSApID8gIkFsbC1NdWx0aWNhc3QiIDogIiIgKTsKKworICAgICAgICBEQkdfUFJJTlQoICIgIG1jX2NvdW50OiAlZFxuIiwgZGV2LT5tY19jb3VudCApOworCisgICAgICAgIGZvciggeCA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNsaXN0ICYmIHggPCBkZXYtPm1jX2NvdW50OworICAgICAgICAgICAgIHgrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0ICkgeworICAgICAgICAgICAgREJHX1BSSU5UKCAiICAgICVzICglZClcbiIsIERiZ0h3QWRkcihtY2xpc3QtPmRtaV9hZGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbWNsaXN0LT5kbWlfYWRkcmxlbiApOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIERCRyAqLworCisgICAgaWYoISggbHAtPmZsYWdzICYgV1ZMQU4yX1VJTF9CVVNZICkpIHsKKworI2lmZGVmIFVTRV9SVFMKKyAgICAgICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlNraXBwaW5nIG11bHRpY2FzdCwgaW4gUlRTIG1vZGVcbiIgKTsKKworICAgICAgICAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyNlbmRpZiAgLyogVVNFX1JUUyAqLworCisgICAgICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKyAgICAgICAgd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKwkJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19TVEEgICkgeworICAgICAgICAgICAgaWYoIGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQyApIHsKKyAgICAgICAgICAgICAgICAvKiBFbmFibGUgcHJvbWlzY3VvdXMgbW9kZSAqLworICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKyAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19QUk9NSVNDVU9VU19NT0RFOworICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIDEgKTsKKyAgICAgICAgICAgICAgICBEQkdfUFJJTlQoICJFbmFibGluZyBQcm9taXNjdW91cyBtb2RlIChJRkZfUFJPTUlTQylcbiIgKTsKKyAgICAgICAgICAgICAgICBoY2ZfcHV0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoKCBkZXYtPm1jX2NvdW50ID4gSENGX01BWF9NVUxUSUNBU1QgKSB8fAorICAgICAgICAgICAgICAgICAgICAoIGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkgKSkgeworICAgICAgICAgICAgICAgIC8qIFNodXR0aW5nIG9mZiB0aGlzIGZpbHRlciB3aWxsIGVuYWJsZSBhbGwgbXVsdGljYXN0IGZyYW1lcyB0bworICAgICAgICAgICAgICAgICAgIGJlIHNlbnQgdXAgZnJvbSB0aGUgZGV2aWNlOyBob3dldmVyLCB0aGlzIGlzIGEgc3RhdGljIFJJRCwgc28KKyAgICAgICAgICAgICAgICAgICBhIGNhbGwgdG8gd2xfYXBwbHkoKSBpcyBuZWVkZWQgKi8KKyAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisgICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX1JYX0FMTF9HUk9VUF9BRERSOworICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIDAgKTsKKyAgICAgICAgICAgICAgICBEQkdfUFJJTlQoICJFbmFibGluZyBhbGwgbXVsdGljYXN0IG1vZGUgKElGRl9BTExNVUxUSSlcbiIgKTsKKyAgICAgICAgICAgICAgICBoY2ZfcHV0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKyAgICAgICAgICAgICAgICB3bF9hcHBseSggbHAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIGRldi0+bWNfY291bnQgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIG11bHRpY2FzdCBhZGRyZXNzZXMgKi8KKyAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLmxlbiA9ICggZGV2LT5tY19jb3VudCAqIDMgKSArIDE7CisgICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfR1JPVVBfQUREUjsKKworICAgICAgICAgICAgICAgIGZvciggeCA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsKKyAgICAgICAgICAgICAgICAoIHggPCBkZXYtPm1jX2NvdW50ICkgJiYgKCBtY2xpc3QgIT0gTlVMTCApOworICAgICAgICAgICAgICAgICAgICB4KyssIG1jbGlzdCA9IG1jbGlzdC0+bmV4dCApIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCAmKCBscC0+bHR2UmVjb3JkLnUudThbeCAqIEVUSF9BTEVOXSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1jbGlzdC0+ZG1pX2FkZHIsIEVUSF9BTEVOICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERCR19QUklOVCggIlNldHRpbmcgbXVsdGljYXN0IGxpc3RcbiIgKTsKKyAgICAgICAgICAgICAgICBoY2ZfcHV0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogRGlzYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisgICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1BST01JU0NVT1VTX01PREU7CisgICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggMCApOworICAgICAgICAgICAgICAgIERCR19QUklOVCggIkRpc2FibGluZyBQcm9taXNjdW91cyBtb2RlXG4iICk7CisgICAgICAgICAgICAgICAgaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKyAgICAgICAgICAgICAgICAvKiBEaXNhYmxlIG11bHRpY2FzdCBtb2RlICovCisgICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC5sZW4gPSAyOworICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0dST1VQX0FERFI7CisgICAgICAgICAgICAgICAgREJHX1BSSU5UKCAiRGlzYWJsaW5nIE11bHRpY2FzdCBtb2RlXG4iICk7CisgICAgICAgICAgICAgICAgaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKyAgICAgICAgICAgICAgICAvKiBUdXJuaW5nIG9uIHRoaXMgZmlsdGVyIHdpbGwgcHJldmVudCBhbGwgbXVsdGljYXN0IGZyYW1lcyBmcm9tCisgICAgICAgICAgICAgICAgICAgYmVpbmcgc2VudCB1cCBmcm9tIHRoZSBkZXZpY2U7IGhvd2V2ZXIsIHRoaXMgaXMgYSBzdGF0aWMgUklELAorICAgICAgICAgICAgICAgICAgIHNvIGEgY2FsbCB0byB3bF9hcHBseSgpIGlzIG5lZWRlZCAqLworICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKyAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfUlhfQUxMX0dST1VQX0FERFI7CisgICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggMSApOworICAgICAgICAgICAgICAgIERCR19QUklOVCggIkRpc2FibGluZyBhbGwgbXVsdGljYXN0IG1vZGUgKElGRl9BTExNVUxUSSlcbiIgKTsKKyAgICAgICAgICAgICAgICBoY2ZfcHV0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKyAgICAgICAgICAgICAgICB3bF9hcHBseSggbHAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB3bF9hY3RfaW50X29uKCBscCApOworCXdsX3VubG9jayggbHAsICZmbGFncyApOworICAgIH0KKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyNlbmRpZiAvKiBIQ0ZfU1RBICovCit9IC8vIHdsX211bHRpY2FzdAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2Vsc2UgLyogTkVXX01VTFRJQ0FTVCAqLworCit2b2lkIHdsX211bHRpY2FzdCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG51bV9hZGRycywgdm9pZCAqYWRkcnMgKQoreworICAgIERCR19GVU5DKCAid2xfbXVsdGljYXN0Iik7CisgICAgREJHX0VOVEVSKERiZ0luZm8pOworCisgICAgREJHX1BBUkFNKCBEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2ICk7CisgICAgREJHX1BBUkFNKCBEYmdJbmZvLCAibnVtX2FkZHJzIiwgIiVkIiwgbnVtX2FkZHJzICk7CisgICAgREJHX1BBUkFNKCBEYmdJbmZvLCAiYWRkcnMiLCAiMHglcCIsIGFkZHJzICk7CisKKyNlcnJvciBPYnNvbGV0ZSBzZXQgbXVsdGljYXN0IGludGVyZmFjZSEKKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworfSAvLyB3bF9tdWx0aWNhc3QKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNlbmRpZiAvKiBORVdfTVVMVElDQVNUICovCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDMwKSkKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgd2xfbmV0ZGV2X29wcyA9Cit7CisgICAgLm5kb19zdGFydF94bWl0ICAgICAgICAgPSAmd2xfdHhfcG9ydDAsCisKKyAgICAubmRvX3NldF9jb25maWcgICAgICAgICA9ICZ3bF9jb25maWcsCisgICAgLm5kb19nZXRfc3RhdHMgICAgICAgICAgPSAmd2xfc3RhdHMsCisgICAgLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSAmd2xfbXVsdGljYXN0LAorCisgICAgLm5kb19pbml0ICAgICAgICAgICAgICAgPSAmd2xfaW5zZXJ0LAorICAgIC5uZG9fb3BlbiAgICAgICAgICAgICAgID0gJndsX2FkYXB0ZXJfb3BlbiwKKyAgICAubmRvX3N0b3AgICAgICAgICAgICAgICA9ICZ3bF9hZGFwdGVyX2Nsb3NlLAorICAgIC5uZG9fZG9faW9jdGwgICAgICAgICAgID0gJndsX2lvY3RsLAorCisjaWZkZWYgSEFWRV9UWF9USU1FT1VUCisgICAgLm5kb190eF90aW1lb3V0ICAgICAgICAgPSAmd2xfdHhfdGltZW91dCwKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKyAgICAubmRvX3BvbGxfY29udHJvbGxlciAgICA9IHdsX3BvbGwsCisjZW5kaWYKK307CisjZW5kaWYgLy8gKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwzMCkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9kZXZpY2VfYWxsb2MoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBDcmVhdGUgaW5zdGFuY2VzIG9mIG5ldF9kZXZpY2UgYW5kIHdsX3ByaXZhdGUgZm9yIHRoZSBuZXcgYWRhcHRlcgorICogIGFuZCByZWdpc3RlciB0aGUgZGV2aWNlJ3MgZW50cnkgcG9pbnRzIGluIHRoZSBuZXRfZGV2aWNlIHN0cnVjdHVyZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgYSBwb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgbmV0X2RldmljZSBzdHJ1Y3QgZm9yIHRoaXMKKyAqICAgICAgZGV2aWNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgbmV0X2RldmljZSAqIHdsX2RldmljZV9hbGxvYyggdm9pZCApCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgICAqZGV2ID0gTlVMTDsKKyAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICpscCA9IE5VTEw7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF9kZXZpY2VfYWxsb2MiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKyAgICAvKiBBbGxvYyBhIG5ldF9kZXZpY2Ugc3RydWN0ICovCisgICAgZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCB3bF9wcml2YXRlKSk7CisgICAgaWYgKCFkZXYpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgJ25leHQnIHBvaW50ZXIgaW4gdGhlIHN0cnVjdC4gQ3VycmVudGx5IG9ubHkgdXNlZCBmb3IgUENJLAorICAgICAgIGJ1dCBkbyBpdCBoZXJlIGp1c3QgaW4gY2FzZSBpdCdzIHVzZWQgZm9yIG90aGVyIGJ1c2VzIGluIHRoZSBmdXR1cmUgKi8KKyAgICBscCA9IHdsX3ByaXYoZGV2KTsKKworCisgICAgLyogQ2hlY2sgTVRVICovCisgICAgaWYoIGRldi0+bXR1ID4gTVRVX01BWCApCisgICAgeworCSAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIiVzOiBNVFUgc2V0IHRvbyBoaWdoLCBsaW1pdGluZyB0byAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIE1UVV9NQVggKTsKKyAgICAJZGV2LT5tdHUgPSBNVFVfTUFYOworICAgIH0KKworICAgIC8qIFNldHVwIHRoZSBmdW5jdGlvbiB0YWJsZSBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKworICAgIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopJndsX2l3X2hhbmRsZXJfZGVmOworICAgIGxwLT53aXJlbGVzc19kYXRhLnNweV9kYXRhID0gJmxwLT5zcHlfZGF0YTsKKyAgICBkZXYtPndpcmVsZXNzX2RhdGEgPSAmbHAtPndpcmVsZXNzX2RhdGE7CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDMwKSkKKyAgICBkZXYtPm5ldGRldl9vcHMgPSAmd2xfbmV0ZGV2X29wczsKKyNlbHNlCisgICAgZGV2LT5oYXJkX3N0YXJ0X3htaXQgICAgPSAmd2xfdHhfcG9ydDA7CisKKyAgICBkZXYtPnNldF9jb25maWcgICAgICAgICA9ICZ3bF9jb25maWc7CisgICAgZGV2LT5nZXRfc3RhdHMgICAgICAgICAgPSAmd2xfc3RhdHM7CisgICAgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmd2xfbXVsdGljYXN0OworCisgICAgZGV2LT5pbml0ICAgICAgICAgICAgICAgPSAmd2xfaW5zZXJ0OworICAgIGRldi0+b3BlbiAgICAgICAgICAgICAgID0gJndsX2FkYXB0ZXJfb3BlbjsKKyAgICBkZXYtPnN0b3AgICAgICAgICAgICAgICA9ICZ3bF9hZGFwdGVyX2Nsb3NlOworICAgIGRldi0+ZG9faW9jdGwgICAgICAgICAgID0gJndsX2lvY3RsOworCisjaWZkZWYgSEFWRV9UWF9USU1FT1VUCisgICAgZGV2LT50eF90aW1lb3V0ICAgICAgICAgPSAmd2xfdHhfdGltZW91dDsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKyAgICBkZXYtPnBvbGxfY29udHJvbGxlciA9IHdsX3BvbGw7CisjZW5kaWYKKworI2VuZGlmIC8vIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMzApKQorCisjaWZkZWYgSEFWRV9UWF9USU1FT1VUCisgICAgZGV2LT53YXRjaGRvZ190aW1lbyAgICAgPSBUWF9USU1FT1VUOworI2VuZGlmCisKKyAgICBkZXYtPmV0aHRvb2xfb3BzCSAgICA9ICZ3bF9ldGh0b29sX29wczsKKworICAgIG5ldGlmX3N0b3BfcXVldWUoIGRldiApOworCisgICAgLyogQWxsb2NhdGUgdmlydXRhbCBkZXZpY2VzIGZvciBXRFMgc3VwcG9ydCBpZiBuZWVkZWQgKi8KKyAgICBXTF9XRFNfREVWSUNFX0FMTE9DKCBscCApOworCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuIGRldjsKK30gLy8gd2xfZGV2aWNlX2FsbG9jCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfZGV2aWNlX2RlYWxsb2MoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBGcmVlIGluc3RhbmNlcyBvZiBuZXRfZGV2aWNlIGFuZCB3bF9wcml2YXRlIHN0cmN1dHJlcyBmb3IgYW4gYWRhcHRlcgorICogIGFuZCBwZXJmb3JtIGJhc2ljIGNsZWFudXAuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlLgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfZGV2aWNlX2RlYWxsb2MoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworLy8gICAgc3RydWN0IHdsX3ByaXZhdGUgICAqbHAgPSB3bF9wcml2KGRldik7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF9kZXZpY2VfZGVhbGxvYyIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworICAgIC8qIERlYWxsb2MgdGhlIFdEUyBwb3J0cyAqLworICAgIFdMX1dEU19ERVZJQ0VfREVBTExPQyggbHAgKTsKKworICAgIGZyZWVfbmV0ZGV2KCBkZXYgKTsKKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybjsKK30gLy8gd2xfZGV2aWNlX2RlYWxsb2MKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF90eF9wb3J0MCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoZSBoYW5kbGVyIHJvdXRpbmUgZm9yIFR4IG92ZXIgSENGX1BPUlRfMC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHNrYiAtIGEgcG9pbnRlciB0byB0aGUgc2tfYnVmZiB0byB0cmFuc21pdC4KKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIGEgbmV0X2RldmljZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIEhDRl9QT1JUXzAuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3R4X3BvcnQwKCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyAgICBEQkdfVFgoIERiZ0luZm8sICJUeCBvbiBQb3J0IDBcbiIgKTsKKworICAgIHJldHVybiB3bF90eCggc2tiLCBkZXYsIEhDRl9QT1JUXzAgKTsKKyNpZmRlZiBFTkFCTEVfRE1BCisgICAgcmV0dXJuIHdsX3R4X2RtYSggc2tiLCBkZXYsIEhDRl9QT1JUXzAgKTsKKyNlbmRpZgorfSAvLyB3bF90eF9wb3J0MAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2lmZGVmIFVTRV9XRFMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3R4X3BvcnQxKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhlIGhhbmRsZXIgcm91dGluZSBmb3IgVHggb3ZlciBIQ0ZfUE9SVF8xLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgc2tiIC0gYSBwb2ludGVyIHRvIHRoZSBza19idWZmIHRvIHRyYW5zbWl0LgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gYSBuZXRfZGV2aWNlIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgSENGX1BPUlRfMS4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfdHhfcG9ydDEoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworICAgIERCR19UWCggRGJnSW5mbywgIlR4IG9uIFBvcnQgMVxuIiApOworICAgIHJldHVybiB3bF90eCggc2tiLCBkZXYsIEhDRl9QT1JUXzEgKTsKK30gLy8gd2xfdHhfcG9ydDEKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF90eF9wb3J0MigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoZSBoYW5kbGVyIHJvdXRpbmUgZm9yIFR4IG92ZXIgSENGX1BPUlRfMi4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHNrYiAtIGEgcG9pbnRlciB0byB0aGUgc2tfYnVmZiB0byB0cmFuc21pdC4KKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIGEgbmV0X2RldmljZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIEhDRl9QT1JUXzIuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3R4X3BvcnQyKCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyAgICBEQkdfVFgoIERiZ0luZm8sICJUeCBvbiBQb3J0IDJcbiIgKTsKKyAgICByZXR1cm4gd2xfdHgoIHNrYiwgZGV2LCBIQ0ZfUE9SVF8yICk7Cit9IC8vIHdsX3R4X3BvcnQyCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfdHhfcG9ydDMoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGUgaGFuZGxlciByb3V0aW5lIGZvciBUeCBvdmVyIEhDRl9QT1JUXzMuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBza2IgLSBhIHBvaW50ZXIgdG8gdGhlIHNrX2J1ZmYgdG8gdHJhbnNtaXQuCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byBhIG5ldF9kZXZpY2Ugc3RydWN0dXJlIHJlcHJlc2VudGluZyBIQ0ZfUE9SVF8zLgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF90eF9wb3J0Myggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisgICAgREJHX1RYKCBEYmdJbmZvLCAiVHggb24gUG9ydCAzXG4iICk7CisgICAgcmV0dXJuIHdsX3R4KCBza2IsIGRldiwgSENGX1BPUlRfMyApOworfSAvLyB3bF90eF9wb3J0MworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3R4X3BvcnQ0KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhlIGhhbmRsZXIgcm91dGluZSBmb3IgVHggb3ZlciBIQ0ZfUE9SVF80LgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgc2tiIC0gYSBwb2ludGVyIHRvIHRoZSBza19idWZmIHRvIHRyYW5zbWl0LgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gYSBuZXRfZGV2aWNlIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgSENGX1BPUlRfNC4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfdHhfcG9ydDQoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworICAgIERCR19UWCggRGJnSW5mbywgIlR4IG9uIFBvcnQgNFxuIiApOworICAgIHJldHVybiB3bF90eCggc2tiLCBkZXYsIEhDRl9QT1JUXzQgKTsKK30gLy8gd2xfdHhfcG9ydDQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF90eF9wb3J0NSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoZSBoYW5kbGVyIHJvdXRpbmUgZm9yIFR4IG92ZXIgSENGX1BPUlRfNS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHNrYiAtIGEgcG9pbnRlciB0byB0aGUgc2tfYnVmZiB0byB0cmFuc21pdC4KKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIGEgbmV0X2RldmljZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIEhDRl9QT1JUXzUuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3R4X3BvcnQ1KCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyAgICBEQkdfVFgoIERiZ0luZm8sICJUeCBvbiBQb3J0IDVcbiIgKTsKKyAgICByZXR1cm4gd2xfdHgoIHNrYiwgZGV2LCBIQ0ZfUE9SVF81ICk7Cit9IC8vIHdsX3R4X3BvcnQ1CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfdHhfcG9ydDYoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGUgaGFuZGxlciByb3V0aW5lIGZvciBUeCBvdmVyIEhDRl9QT1JUXzYuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBza2IgLSBhIHBvaW50ZXIgdG8gdGhlIHNrX2J1ZmYgdG8gdHJhbnNtaXQuCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byBhIG5ldF9kZXZpY2Ugc3RydWN0dXJlIHJlcHJlc2VudGluZyBIQ0ZfUE9SVF82LgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF90eF9wb3J0Niggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisgICAgREJHX1RYKCBEYmdJbmZvLCAiVHggb24gUG9ydCA2XG4iICk7CisgICAgcmV0dXJuIHdsX3R4KCBza2IsIGRldiwgSENGX1BPUlRfNiApOworfSAvLyB3bF90eF9wb3J0NgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3dkc19kZXZpY2VfYWxsb2MoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBDcmVhdGUgaW5zdGFuY2VzIG9mIG5ldF9kZXZpY2UgdG8gcmVwcmVzZW50IHRoZSBXRFMgcG9ydHMsIGFuZCByZWdpc3RlcgorICogIHRoZSBkZXZpY2UncyBlbnRyeSBwb2ludHMgaW4gdGhlIG5ldF9kZXZpY2Ugc3RydWN0dXJlLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EsIGJ1dCB3aWxsIHBsYWNlIHBvaW50ZXJzIHRvIHRoZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIG5ldF9kZXZpY2UKKyAqICAgICAgc3RydWN0cyBpbiB0aGUgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF93ZHNfZGV2aWNlX2FsbG9jKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworICAgIGludCBjb3VudDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX3dkc19kZXZpY2VfYWxsb2MiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKyAgICAvKiBXRFMgc3VwcG9ydCByZXF1aXJlcyBhZGRpdGlvbmFsIG5ldF9kZXZpY2Ugc3RydWN0cyB0byBiZSBhbGxvY2F0ZWQsCisgICAgICAgc28gdGhhdCB1c2VyIHNwYWNlIGFwcHMgY2FuIHVzZSB0aGVzZSB2aXJ0dWFsIGRldmljZXMgdG8gc3BlY2lmeSB0aGUKKyAgICAgICBwb3J0IG9uIHdoaWNoIHRvIFR4L1J4ICovCisgICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldl93ZHMgPSBOVUxMOworCisgICAgICAgIGRldl93ZHMgPSBrbWFsbG9jKCBzaXplb2YoIHN0cnVjdCBuZXRfZGV2aWNlICksIEdGUF9LRVJORUwgKTsKKyAgICAgICAgbWVtc2V0KCBkZXZfd2RzLCAwLCBzaXplb2YoIHN0cnVjdCBuZXRfZGV2aWNlICkpOworCisgICAgICAgIGV0aGVyX3NldHVwKCBkZXZfd2RzICk7CisKKyAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5kZXYgPSBkZXZfd2RzOworCisgICAgICAgIC8qIFJlLXVzZSB3bF9pbml0IGZvciBhbGwgdGhlIGRldmljZXMsIGFzIGl0IGN1cnJlbnRseSBkb2VzIG5vdGhpbmcsIGJ1dAorICAgICAgICAgICBpcyByZXF1aXJlZC4gUmUtdXNlIHRoZSBzdGF0cy90eF90aW1lb3V0IGhhbmRsZXIgZm9yIGFsbCBhcyB3ZWxsOyB0aGUKKyAgICAgICAgICAgV0RTIHBvcnQgd2hpY2ggaXMgcmVxdWVzdGluZyB0aGVzZSBvcGVyYXRpb25zIGNhbiBiZSBkZXRlcm1pbmVkIGJ5CisgICAgICAgICAgIHRoZSBuZXRfZGV2aWNlIHBvaW50ZXIuIFNldCB0aGUgcHJpdmF0ZSBtZW1iZXIgb2YgYWxsIGRldmljZXMgdG8gcG9pbnQKKyAgICAgICAgICAgdG8gdGhlIHNhbWUgbmV0X2RldmljZSBzdHJ1Y3Q7IHRoYXQgd2F5LCBhbGwgaW5mb3JtYXRpb24gZ2V0cworICAgICAgICAgICBmdW5uZWxsZWQgdGhyb3VnaCB0aGUgb25lICJyZWFsIiBuZXRfZGV2aWNlLiBOYW1lIHRoZSBXRFMgcG9ydHMKKyAgICAgICAgICAgIndkczxuPiIgKi8KKyAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPmluaXQgICAgICAgICAgID0gJndsX2luaXQ7CisgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2LT5nZXRfc3RhdHMgICAgICA9ICZ3bF9zdGF0czsKKyAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPnR4X3RpbWVvdXQgICAgID0gJndsX3R4X3RpbWVvdXQ7CisgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2LT5wcml2ICAgICAgICAgICA9IGxwOworCisgICAgICAgIHNwcmludGYoIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2LT5uYW1lLCAid2RzJWQiLCBjb3VudCApOworICAgIH0KKworICAgIC8qIFJlZ2lzdGVyIHRoZSBUeCBoYW5kbGVycyAqLworICAgIGxwLT53ZHNfcG9ydFswXS5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ3bF90eF9wb3J0MTsKKyAgICBscC0+d2RzX3BvcnRbMV0uZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmd2xfdHhfcG9ydDI7CisgICAgbHAtPndkc19wb3J0WzJdLmRldi0+aGFyZF9zdGFydF94bWl0ID0gJndsX3R4X3BvcnQzOworICAgIGxwLT53ZHNfcG9ydFszXS5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ3bF90eF9wb3J0NDsKKyAgICBscC0+d2RzX3BvcnRbNF0uZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmd2xfdHhfcG9ydDU7CisgICAgbHAtPndkc19wb3J0WzVdLmRldi0+aGFyZF9zdGFydF94bWl0ID0gJndsX3R4X3BvcnQ2OworCisgICAgV0xfV0RTX05FVElGX1NUT1BfUVVFVUUoIGxwICk7CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm47Cit9IC8vIHdsX3dkc19kZXZpY2VfYWxsb2MKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF93ZHNfZGV2aWNlX2RlYWxsb2MoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBGcmVlIGluc3RhbmNlcyBvZiBuZXRfZGV2aWNlIHN0cnVjdHVyZXMgdXNlZCB0byBzdXBwb3J0IFdEUy4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfd2RzX2RldmljZV9kZWFsbG9jKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworICAgIGludCBjb3VudDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX3dkc19kZXZpY2VfZGVhbGxvYyIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7CisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfd2RzID0gTlVMTDsKKworICAgICAgICBkZXZfd2RzID0gbHAtPndkc19wb3J0W2NvdW50XS5kZXY7CisKKyAgICAgICAgaWYoIGRldl93ZHMgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIGlmKCBkZXZfd2RzLT5mbGFncyAmIElGRl9VUCApIHsKKyAgICAgICAgICAgICAgICBkZXZfY2xvc2UoIGRldl93ZHMgKTsKKyAgICAgICAgICAgICAgICBkZXZfd2RzLT5mbGFncyAmPSB+KCBJRkZfVVAgfCBJRkZfUlVOTklORyApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBrZnJlZSggZGV2X3dkcyApOworICAgICAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5kZXYgPSBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuOworfSAvLyB3bF93ZHNfZGV2aWNlX2RlYWxsb2MKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF93ZHNfbmV0aWZfc3RhcnRfcXVldWUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBVc2VkIHRvIHN0YXJ0IHRoZSBuZXRpZiBxdWV1ZXMgb2YgYWxsIHRoZSAidmlydHVhbCIgbmV0d29yayBkZXZpY2VzCisgKiAgICAgIHdoaWNoIHJlcGVzZW50IHRoZSBXRFMgcG9ydHMuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3dkc19uZXRpZl9zdGFydF9xdWV1ZSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKyAgICBpbnQgY291bnQ7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgaWYoIGxwICE9IE5VTEwgKSB7CisgICAgICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7CisgICAgICAgICAgICBpZiggbHAtPndkc19wb3J0W2NvdW50XS5pc19yZWdpc3RlcmVkICYmCisgICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5uZXRpZl9xdWV1ZV9vbiA9PSBGQUxTRSApIHsKKyAgICAgICAgICAgICAgICBuZXRpZl9zdGFydF9xdWV1ZSggbHAtPndkc19wb3J0W2NvdW50XS5kZXYgKTsKKyAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLm5ldGlmX3F1ZXVlX29uID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybjsKK30gLy8gd2xfd2RzX25ldGlmX3N0YXJ0X3F1ZXVlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfd2RzX25ldGlmX3N0b3BfcXVldWUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBVc2VkIHRvIHN0b3AgdGhlIG5ldGlmIHF1ZXVlcyBvZiBhbGwgdGhlICJ2aXJ0dWFsIiBuZXR3b3JrIGRldmljZXMKKyAqICAgICAgd2hpY2ggcmVwZXNlbnQgdGhlIFdEUyBwb3J0cy4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfd2RzX25ldGlmX3N0b3BfcXVldWUoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisgICAgaW50IGNvdW50OworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIGlmKCBscCAhPSBOVUxMICkgeworICAgICAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgeworICAgICAgICAgICAgaWYoIGxwLT53ZHNfcG9ydFtjb3VudF0uaXNfcmVnaXN0ZXJlZCAmJgorICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPT0gVFJVRSApIHsKKyAgICAgICAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKCBscC0+d2RzX3BvcnRbY291bnRdLmRldiApOworICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybjsKK30gLy8gd2xfd2RzX25ldGlmX3N0b3BfcXVldWUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF93ZHNfbmV0aWZfd2FrZV9xdWV1ZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFVzZWQgdG8gd2FrZSB0aGUgbmV0aWYgcXVldWVzIG9mIGFsbCB0aGUgInZpcnR1YWwiIG5ldHdvcmsgZGV2aWNlcworICogICAgICB3aGljaCByZXBlc2VudCB0aGUgV0RTIHBvcnRzLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF93ZHNfbmV0aWZfd2FrZV9xdWV1ZSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKyAgICBpbnQgY291bnQ7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgaWYoIGxwICE9IE5VTEwgKSB7CisgICAgICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7CisgICAgICAgICAgICBpZiggbHAtPndkc19wb3J0W2NvdW50XS5pc19yZWdpc3RlcmVkICYmCisgICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5uZXRpZl9xdWV1ZV9vbiA9PSBGQUxTRSApIHsKKyAgICAgICAgICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKCBscC0+d2RzX3BvcnRbY291bnRdLmRldiApOworICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuOworfSAvLyB3bF93ZHNfbmV0aWZfd2FrZV9xdWV1ZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3dkc19uZXRpZl9jYXJyaWVyX29uKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVXNlZCB0byBzaWduYWwgdGhlIG5ldHdvcmsgbGF5ZXIgdGhhdCBjYXJyaWVyIGlzIHByZXNlbnQgb24gYWxsIG9mIHRoZQorICogICAgICAidmlydHVhbCIgbmV0d29yayBkZXZpY2VzIHdoaWNoIHJlcGVzZW50IHRoZSBXRFMgcG9ydHMuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3dkc19uZXRpZl9jYXJyaWVyX29uKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworICAgIGludCBjb3VudDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBpZiggbHAgIT0gTlVMTCApIHsKKyAgICAgICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKKyAgICAgICAgICAgIGlmKCBscC0+d2RzX3BvcnRbY291bnRdLmlzX3JlZ2lzdGVyZWQgKSB7CisgICAgICAgICAgICAgICAgbmV0aWZfY2Fycmllcl9vbiggbHAtPndkc19wb3J0W2NvdW50XS5kZXYgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybjsKK30gLy8gd2xfd2RzX25ldGlmX2NhcnJpZXJfb24KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF93ZHNfbmV0aWZfY2Fycmllcl9vZmYoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBVc2VkIHRvIHNpZ25hbCB0aGUgbmV0d29yayBsYXllciB0aGF0IGNhcnJpZXIgaXMgTk9UIHByZXNlbnQgb24gYWxsIG9mCisgKiAgICAgIHRoZSAidmlydHVhbCIgbmV0d29yayBkZXZpY2VzIHdoaWNoIHJlcGVzZW50IHRoZSBXRFMgcG9ydHMuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3dkc19uZXRpZl9jYXJyaWVyX29mZiggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKyAgICBpbnQgY291bnQ7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgaWYoIGxwICE9IE5VTEwgKSB7CisgICAgICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7CisgICAgICAgICAgICBpZiggbHAtPndkc19wb3J0W2NvdW50XS5pc19yZWdpc3RlcmVkICkgeworICAgICAgICAgICAgICAgIG5ldGlmX2NhcnJpZXJfb2ZmKCBscC0+d2RzX3BvcnRbY291bnRdLmRldiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuOworfSAvLyB3bF93ZHNfbmV0aWZfY2Fycmllcl9vZmYKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNlbmRpZiAgLyogVVNFX1dEUyAqLworCisjaWZkZWYgRU5BQkxFX0RNQQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3NlbmRfZG1hKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhlIHJvdXRpbmUgd2hpY2ggcGVyZm9ybXMgZGF0YSB0cmFuc21pdHMgd2hlbiB1c2luZyBidXNtYXN0ZXIgRE1BLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3Mgd2xfcHJpdmF0ZSBzdHJ1Y3QuCisgKiAgICAgIHNrYiAgLSBhIHBvaW50ZXIgdG8gdGhlIG5ldHdvcmsgbGF5ZXIncyBkYXRhIGJ1ZmZlci4KKyAqICAgICAgcG9ydCAtIHRoZSBIZXJtZXMgcG9ydCBvbiB3aGljaCB0byB0cmFuc21pdC4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICAxIG9uIGVycm9yCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9zZW5kX2RtYSggc3RydWN0IHdsX3ByaXZhdGUgKmxwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcG9ydCApCit7CisgICAgaW50ICAgICAgICAgbGVuOworICAgIERFU0NfU1RSQ1QgKmRlc2MgPSBOVUxMOworICAgIERFU0NfU1RSQ1QgKmRlc2NfbmV4dCA9IE5VTEw7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF9zZW5kX2RtYSIgKTsKKworICAgIGlmKCBscCA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIlByaXZhdGUgYWRhcHRlciBzdHJ1Y3QgaXMgTlVMTFxuIiApOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYoIGxwLT5kZXYgPT0gTlVMTCApCisgICAgeworICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJuZXRfZGV2aWNlIHN0cnVjdCBpbiB3bF9wcml2YXRlIGlzIE5VTExcbiIgKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIEFHQUlOLCBBTEwgVEhFIFFVRVVFSU5HIERPTkUgSEVSRSBJTiBJL08gTU9ERSBJUyBOT1QgUEVSRk9STUVEICovCisKKyAgICBpZiggc2tiID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgREJHX1dBUk5JTkcgKERiZ0luZm8sICJOb3RoaW5nIHRvIHNlbmQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGxlbiA9IHNrYi0+bGVuOworCisgICAgLyogR2V0IGEgZnJlZSBkZXNjcmlwdG9yICovCisgICAgZGVzYyA9IHdsX3BjaV9kbWFfZ2V0X3R4X3BhY2tldCggbHAgKTsKKworICAgIGlmKCBkZXNjID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgaWYoIGxwLT5uZXRpZl9xdWV1ZV9vbiA9PSBUUlVFICkgeworICAgICAgICAgICAgbmV0aWZfc3RvcF9xdWV1ZSggbHAtPmRldiApOworICAgICAgICAgICAgV0xfV0RTX05FVElGX1NUT1BfUVVFVUUoIGxwICk7CisgICAgICAgICAgICBscC0+bmV0aWZfcXVldWVfb24gPSBGQUxTRTsKKworICAgICAgICAgICAgZGV2X2tmcmVlX3NrYiggc2tiICk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIFNFVF9CVUZfQ05UKCBkZXNjLCAvKkhDRl9ETUFfRkRfQ05UKi9IRlNfQUREUl9ERVNUICk7CisgICAgU0VUX0JVRl9TSVpFKCBkZXNjLCBIQ0ZfRE1BX1RYX0JVRjFfU0laRSApOworCisgICAgZGVzY19uZXh0ID0gZGVzYy0+bmV4dF9kZXNjX2FkZHI7CisKKyAgICBpZiggZGVzY19uZXh0LT5idWZfYWRkciA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIkRNQSBkZXNjcmlwdG9yIGJ1Zl9hZGRyIGlzIE5VTExcbiIgKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIENvcHkgdGhlIHBheWxvYWQgaW50byB0aGUgRE1BIHBhY2tldCAqLworICAgIG1lbWNweSggZGVzY19uZXh0LT5idWZfYWRkciwgc2tiLT5kYXRhLCBsZW4gKTsKKworICAgIFNFVF9CVUZfQ05UKCBkZXNjX25leHQsIGxlbiApOworICAgIFNFVF9CVUZfU0laRSggZGVzY19uZXh0LCBIQ0ZfTUFYX1BBQ0tFVF9TSVpFICk7CisKKyAgICBoY2ZfZG1hX3R4X3B1dCggJiggbHAtPmhjZkN0eCApLCBkZXNjLCAwICk7CisKKyAgICAvKiBGcmVlIHRoZSBza2IgYW5kIHBlcmZvcm0gcXVldWUgY2xlYW51cCwgYXMgdGhlIGJ1ZmZlciB3YXMKKyAgICAgICAgICAgIHRyYW5zbWl0dGVkIHN1Y2Nlc3NmdWxseSAqLworICAgIGRldl9rZnJlZV9za2IoIHNrYiApOworCisgICAgcmV0dXJuIFRSVUU7Cit9IC8vIHdsX3NlbmRfZG1hCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcnhfZG1hKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhlIHJvdXRpbmUgd2hpY2ggcGVyZm9ybXMgZGF0YSByZWNlcHRpb24gd2hlbiB1c2luZyBidXNtYXN0ZXIgRE1BLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZS4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICAxIG9uIGVycm9yCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9yeF9kbWEoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgICBwb3J0OworICAgIGhjZl8xNiAgICAgICAgICAgICAgICAgICBwa3RsZW47CisgICAgaGNmXzE2ICAgICAgICAgICAgICAgICAgIGhmc19zdGF0OworICAgIHN0cnVjdCBza19idWZmICAgICAgICAgICpza2I7CisgICAgc3RydWN0IHdsX3ByaXZhdGUgICAgICAgKmxwID0gTlVMTDsKKyAgICBERVNDX1NUUkNUICAgICAgICAgICAgICAqZGVzYywgKmRlc2NfbmV4dDsKKyAgICAvL0NGR19NQl9JTkZPX1JBTkdFMl9TVFJDVCB4OworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCJ3bF9yeCIpCisgICAgREJHX1BBUkFNKERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYpOworCisgICAgaWYoKCggbHAgPSAoc3RydWN0IHdsX3ByaXZhdGUgKilkZXYtPnByaXYgKSAhPSBOVUxMICkgJiYKKyAgICAgICAgICAhKCBscC0+ZmxhZ3MgJiBXVkxBTjJfVUlMX0JVU1kgKSkgeworCisjaWZkZWYgVVNFX1JUUworICAgICAgICBpZiggbHAtPnVzZVJUUyA9PSAxICkgeworICAgICAgICAgICAgREJHX1BSSU5UKCAiUlRTOiBXZSdyZSBnZXR0aW5nIGFuIFJ4Li4uXG4iICk7CisgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgfQorI2VuZGlmICAvKiBVU0VfUlRTICovCisKKyAgICAgICAgLy9pZiggbHAtPmRtYS5zdGF0dXMgPT0gMCApCisgICAgICAgIC8veworICAgICAgICAgICAgZGVzYyA9IGhjZl9kbWFfcnhfZ2V0KCAmKCBscC0+aGNmQ3R4ICkpOworCisgICAgICAgICAgICBpZiggZGVzYyAhPSBOVUxMICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBDaGVjayBhbmQgc2VlIGlmIHdlIHJjdmQuIGEgV01QIGZyYW1lICovCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICBpZigoKCAqKGhjZl84ICopJmRlc2MtPmJ1Zl9hZGRyW0hGU19TVEFUXSApICYKKyAgICAgICAgICAgICAgICAgICAgKCBIRlNfU1RBVF9NU0dfVFlQRSB8IEhGU19TVEFUX0VSUiApKSA9PSBIRlNfU1RBVF9XTVBfTVNHICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIkdvdCBhIFdNUCBmcmFtZVxuIiApOworCisgICAgICAgICAgICAgICAgICAgIHgubGVuID0gc2l6ZW9mKCBDRkdfTUJfSU5GT19SQU5HRTJfU1RSQ1QgKSAvIHNpemVvZiggaGNmXzE2ICk7CisJCQkJICAgIHgudHlwID0gQ0ZHX01CX0lORk87CisJCQkJICAgIHguYmFzZV90eXAgPSBDRkdfV01QOworCQkJCSAgICB4LmZyYWdfY250ID0gMjsKKwkJCQkgICAgeC5mcmFnX2J1ZlswXS5mcmFnX2xlbiAgPSBHRVRfQlVGX0NOVCggZGVzY3AgKSAvIHNpemVvZiggaGNmXzE2ICk7CisJCQkJICAgIHguZnJhZ19idWZbMF0uZnJhZ19hZGRyID0gKGhjZl84ICopIGRlc2NwLT5idWZfYWRkciA7CisJCQkJICAgIHguZnJhZ19idWZbMV0uZnJhZ19sZW4gID0gKCBHRVRfQlVGX0NOVCggZGVzY3AtPm5leHRfZGVzY19hZGRyICkgKyAxICkgLyBzaXplb2YoIGhjZl8xNiApOworCQkJCSAgICB4LmZyYWdfYnVmWzFdLmZyYWdfYWRkciA9IChoY2ZfOCAqKSBkZXNjcC0+bmV4dF9kZXNjX2FkZHItPmJ1Zl9hZGRyIDsKKworICAgICAgICAgICAgICAgICAgICBoY2ZfcHV0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJnggKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIGRlc2NfbmV4dCA9IGRlc2MtPm5leHRfZGVzY19hZGRyOworCisgICAgICAgICAgICAgICAgLyogTWFrZSBzdXJlIHRoZSBidWZmZXIgaXNuJ3QgZW1wdHkgKi8KKyAgICAgICAgICAgICAgICBpZiggR0VUX0JVRl9DTlQoIGRlc2MgKSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIkJ1ZmZlciBpcyBlbXB0eSFcbiIgKTsKKworICAgICAgICAgICAgICAgICAgICAvKiBHaXZlIHRoZSBkZXNjcmlwdG9yIGJhY2sgdG8gdGhlIEhDRiAqLworICAgICAgICAgICAgICAgICAgICBoY2ZfZG1hX3J4X3B1dCggJiggbHAtPmhjZkN0eCApLCBkZXNjICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlPOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIFJlYWQgdGhlIEhGU19TVEFUIHJlZ2lzdGVyIGZyb20gdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBoZnNfc3RhdCA9IChoY2ZfMTYpKCBkZXNjLT5idWZfYWRkcltIRlNfU1RBVC8yXSApOworCisgICAgICAgICAgICAgICAgLyogTWFrZSBzdXJlIHRoZSBmcmFtZSBpc24ndCBiYWQgKi8KKyAgICAgICAgICAgICAgICBpZigoIGhmc19zdGF0ICYgSEZTX1NUQVRfRVJSICkgIT0gSENGX1NVQ0NFU1MgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICJIRlNfU1RBVF9FUlJPUiAoMHgleCkgaW4gUnggUGFja2V0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5idWZfYWRkcltIRlNfU1RBVC8yXSApOworCisgICAgICAgICAgICAgICAgICAgIC8qIEdpdmUgdGhlIGRlc2NyaXB0b3IgYmFjayB0byB0aGUgSENGICovCisgICAgICAgICAgICAgICAgICAgIGhjZl9kbWFfcnhfcHV0KCAmKCBscC0+aGNmQ3R4ICksIGRlc2MgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU87CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogRGV0ZXJtaW5lIHdoYXQgcG9ydCB0aGlzIHBhY2tldCBpcyBmb3IgKi8KKyAgICAgICAgICAgICAgICBwb3J0ID0gKCBoZnNfc3RhdCA+PiA4ICkgJiAweDAwMDc7CisgICAgICAgICAgICAgICAgREJHX1JYKCBEYmdJbmZvLCAiUnggZnJhbWUgZm9yIHBvcnQgJWRcbiIsIHBvcnQgKTsKKworICAgICAgICAgICAgICAgIGlmKCggcGt0bGVuID0gR0VUX0JVRl9DTlQoIGRlc2NfbmV4dCApKSAhPSAwICkgeworICAgICAgICAgICAgICAgICAgICBpZigoIHNrYiA9IEFMTE9DX1NLQiggcGt0bGVuICkpICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHBvcnQgKSB7CisjaWZkZWYgVVNFX1dEUworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+ZGV2ID0gbHAtPndkc19wb3J0W3BvcnQtMV0uZGV2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmICAvKiBVU0VfV0RTICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5kZXYgPSBkZXY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9QQUNLRVRfRE1BKCBza2ItPmRldiwgc2tiLCBwa3RsZW4gKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogR2l2ZSB0aGUgZGVzY3JpcHRvciBiYWNrIHRvIHRoZSBIQ0YgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGhjZl9kbWFfcnhfcHV0KCAmKCBscC0+aGNmQ3R4ICksIGRlc2MgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbmV0aWZfcngoIHNrYiApOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggcG9ydCA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBVU0VfV0RTCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W3BvcnQtMV0uc3RhdHMucnhfcGFja2V0cysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtwb3J0LTFdLnN0YXRzLnJ4X2J5dGVzICs9IHBrdGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAgLyogVVNFX1dEUyAqLworCisgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJDb3VsZCBub3QgYWxsb2Mgc2tiXG4iICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwb3J0ID09IDAgKQorCSAgICAgICAgICAgICAgICAgICAgeworCSAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJICAgICAgICAgICAgICAgICAgICB9CisjaWZkZWYgVVNFX1dEUworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtwb3J0LTFdLnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAgLyogVVNFX1dEUyAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAvL30KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30gLy8gd2xfcnhfZG1hCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2VuZGlmICAvLyBFTkFCTEVfRE1BCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9uZXRkZXYuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX25ldGRldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMmFiMmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9uZXRkZXYuaApAQCAtMCwwICsxLDE1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFnZXJlIFN5c3RlbXMgSW5jLgorICogV2lyZWxlc3MgZGV2aWNlIGRyaXZlciBmb3IgTGludXggKHdsYWdzNDkpLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KKyAqCisgKiBJbml0aWFsbHkgZGV2ZWxvcGVkIGJ5IFRyaXBsZVBvaW50LCBJbmMuCisgKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIEhlYWRlciBkZXNjcmliaW5nIGluZm9ybWF0aW9uIHJlcXVpcmVkIGJ5IHRoZSBuZXR3b3JrIGxheWVyZW50cnkgcG9pbnRzCisgKiAgIGludG8gdGhlIGRyaXZlci4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNPRlRXQVJFIExJQ0VOU0UKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisgKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fV0xfTkVUREVWX0hfXworI2RlZmluZSBfX1dMX05FVERFVl9IX18KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBmdW5jdGlvbiBwcm90b3R5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX2luaXQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKworaW50IHdsX2NvbmZpZyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICptYXAgKTsKKworc3RydWN0IG5ldF9kZXZpY2UgKndsX2RldmljZV9hbGxvYyggdm9pZCApOworCit2b2lkIHdsX2RldmljZV9kZWFsbG9jKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKK2ludCB3bF9vcGVuKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKK2ludCB3bF9jbG9zZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCitpbnQgd2xfaW9jdGwoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQgKTsKKworaW50IHdsX3R4KCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcG9ydCApOworCitpbnQgd2xfc2VuZCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisKK2ludCB3bF9yeCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCit2b2lkIHdsX3R4X3RpbWVvdXQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKndsX3N0YXRzKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKKworI2lmZGVmIEVOQUJMRV9ETUEKK2ludCB3bF9zZW5kX2RtYSggc3RydWN0IHdsX3ByaXZhdGUgKmxwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcG9ydCApOworaW50IHdsX3J4X2RtYSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworI2VuZGlmCisKKyNpZmRlZiBORVdfTVVMVElDQVNUCit2b2lkIHdsX211bHRpY2FzdCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworI2Vsc2UKK3ZvaWQgd2xfbXVsdGljYXN0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbnVtX2FkZHJzLCB2b2lkICphZGRycyApOworI2VuZGlmIC8vIE5FV19NVUxUSUNBU1QKKworCitpbnQgd2xfdHhfcG9ydDAoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKworCisjaWZkZWYgVVNFX1dEUworCitpbnQgd2xfdHhfcG9ydDEoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKK2ludCB3bF90eF9wb3J0Miggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworaW50IHdsX3R4X3BvcnQzKCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CitpbnQgd2xfdHhfcG9ydDQoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKK2ludCB3bF90eF9wb3J0NSggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworaW50IHdsX3R4X3BvcnQ2KCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKK3ZvaWQgd2xfd2RzX2RldmljZV9hbGxvYyggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7Cit2b2lkIHdsX3dkc19kZXZpY2VfZGVhbGxvYyggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7Cit2b2lkIHdsX3dkc19uZXRpZl9zdGFydF9xdWV1ZSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7Cit2b2lkIHdsX3dkc19uZXRpZl9zdG9wX3F1ZXVlKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKK3ZvaWQgd2xfd2RzX25ldGlmX3dha2VfcXVldWUoIHN0cnVjdCB3bF9wcml2YXRlICpscCApOwordm9pZCB3bF93ZHNfbmV0aWZfY2Fycmllcl9vbiggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7Cit2b2lkIHdsX3dkc19uZXRpZl9jYXJyaWVyX29mZiggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisKKyNlbmRpZiAgLyogVVNFX1dEUyAqLworCisKKyNpZmRlZiBVU0VfV0RTCisKKyNkZWZpbmUgV0xfV0RTX0RFVklDRV9BTExPQyggQVJHICkgICAgICB3bF93ZHNfZGV2aWNlX2FsbG9jKCBBUkcgKQorI2RlZmluZSBXTF9XRFNfREVWSUNFX0RFQUxMT0MoIEFSRyApICAgIHdsX3dkc19kZXZpY2VfZGVhbGxvYyggQVJHICkKKyNkZWZpbmUgV0xfV0RTX05FVElGX1NUQVJUX1FVRVVFKCBBUkcgKSB3bF93ZHNfbmV0aWZfc3RhcnRfcXVldWUoIEFSRyApCisjZGVmaW5lIFdMX1dEU19ORVRJRl9TVE9QX1FVRVVFKCBBUkcgKSAgd2xfd2RzX25ldGlmX3N0b3BfcXVldWUoIEFSRyApCisjZGVmaW5lIFdMX1dEU19ORVRJRl9XQUtFX1FVRVVFKCBBUkcgKSAgd2xfd2RzX25ldGlmX3dha2VfcXVldWUoIEFSRyApCisjZGVmaW5lIFdMX1dEU19ORVRJRl9DQVJSSUVSX09OKCBBUkcgKSAgd2xfd2RzX25ldGlmX2NhcnJpZXJfb24oIEFSRyApCisjZGVmaW5lIFdMX1dEU19ORVRJRl9DQVJSSUVSX09GRiggQVJHICkgd2xfd2RzX25ldGlmX2NhcnJpZXJfb2ZmKCBBUkcgKQorCisjZWxzZQorCisjZGVmaW5lIFdMX1dEU19ERVZJQ0VfQUxMT0MoIEFSRyApCisjZGVmaW5lIFdMX1dEU19ERVZJQ0VfREVBTExPQyggQVJHICkKKyNkZWZpbmUgV0xfV0RTX05FVElGX1NUQVJUX1FVRVVFKCBBUkcgKQorI2RlZmluZSBXTF9XRFNfTkVUSUZfU1RPUF9RVUVVRSggQVJHICkKKyNkZWZpbmUgV0xfV0RTX05FVElGX1dBS0VfUVVFVUUoIEFSRyApCisjZGVmaW5lIFdMX1dEU19ORVRJRl9DQVJSSUVSX09OKCBBUkcgKQorI2RlZmluZSBXTF9XRFNfTkVUSUZfQ0FSUklFUl9PRkYoIEFSRyApCisKKyNlbmRpZiAgLyogVVNFX1dEUyAqLworCisKKyNlbmRpZiAgLy8gX19XTF9ORVRERVZfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wY2kuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZGIxMTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wY2kuYwpAQCAtMCwwICsxLDE1ODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCisgKgorICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgorICogICBodHRwOi8vd3d3LnRyaXBsZXBvaW50LmNvbQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBUaGlzIGZpbGUgY29udGFpbnMgcHJvY2Vzc2luZyBhbmQgaW5pdGlhbGl6YXRpb24gc3BlY2lmaWMgdG8gUENJL21pbmlQQ0kKKyAqICAgZGV2aWNlcy4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNPRlRXQVJFIExJQ0VOU0UKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisgKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaW5jbHVkZSBmaWxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDx3aXJlbGVzcy93bF92ZXJzaW9uLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorLy8jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKworI2luY2x1ZGUgPGhjZi9kZWJ1Zy5oPgorCisjaW5jbHVkZSA8aGNmLmg+CisjaW5jbHVkZSA8ZGhmLmg+CisjaW5jbHVkZSA8aGNmZGVmLmg+CisKKyNpbmNsdWRlIDx3aXJlbGVzcy93bF9pZi5oPgorI2luY2x1ZGUgPHdpcmVsZXNzL3dsX2ludGVybmFsLmg+CisjaW5jbHVkZSA8d2lyZWxlc3Mvd2xfdXRpbC5oPgorI2luY2x1ZGUgPHdpcmVsZXNzL3dsX21haW4uaD4KKyNpbmNsdWRlIDx3aXJlbGVzcy93bF9uZXRkZXYuaD4KKyNpbmNsdWRlIDx3aXJlbGVzcy93bF9wY2kuaD4KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2xvYmFsIHZhcmlhYmxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBEQkcKK2V4dGVybiBkYmdfaW5mb190ICpEYmdJbmZvOworI2VuZGlmICAvLyBEQkcKKworLyogZGVmaW5lIHRoZSBQQ0kgZGV2aWNlIFRhYmxlIENhcmRuYW1lIGFuZCBpZCB0YWJsZXMgKi8KK2VudW0gaGVybWVzX3BjaV92ZXJzaW9ucyB7CisJQ0hfQWdlcmVfU3lzdGVtc19NaW5pX1BDSV9WMSA9IDAsCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgd2xfcGNpX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyBXTF9MS01fUENJX1ZFTkRPUl9JRCwgV0xfTEtNX1BDSV9ERVZJQ0VfSURfMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfQWdlcmVfU3lzdGVtc19NaW5pX1BDSV9WMSB9LAorICAgIHsgV0xfTEtNX1BDSV9WRU5ET1JfSUQsIFdMX0xLTV9QQ0lfREVWSUNFX0lEXzEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIX0FnZXJlX1N5c3RlbXNfTWluaV9QQ0lfVjEgfSwKKyAgICB7IFdMX0xLTV9QQ0lfVkVORE9SX0lELCBXTF9MS01fUENJX0RFVklDRV9JRF8yLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF9BZ2VyZV9TeXN0ZW1zX01pbmlfUENJX1YxIH0sCisJeyB9CQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB3bF9wY2lfdGJsKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgX19kZXZpbml0IHdsX3BjaV9wcm9iZSggc3RydWN0IHBjaV9kZXYgKnBkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQgKTsKK3ZvaWQgX19kZXZleGl0IHdsX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworaW50IHdsX3BjaV9zZXR1cCggc3RydWN0IHBjaV9kZXYgKnBkZXYgKTsKK3ZvaWQgd2xfcGNpX2VuYWJsZV9jYXJkYnVzX2ludGVycnVwdHMoIHN0cnVjdCBwY2lfZGV2ICpwZGV2ICk7CisKKyNpZmRlZiBFTkFCTEVfRE1BCitpbnQgd2xfcGNpX2RtYV9hbGxvYyggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworaW50IHdsX3BjaV9kbWFfZnJlZSggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworaW50IHdsX3BjaV9kbWFfYWxsb2NfdHhfcGFja2V0KCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICoqZGVzYyApOworaW50IHdsX3BjaV9kbWFfZnJlZV90eF9wYWNrZXQoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjICk7CitpbnQgd2xfcGNpX2RtYV9hbGxvY19yeF9wYWNrZXQoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjICk7CitpbnQgd2xfcGNpX2RtYV9mcmVlX3J4X3BhY2tldCggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqKmRlc2MgKTsKK2ludCB3bF9wY2lfZG1hX2FsbG9jX2Rlc2NfYW5kX2J1Ziggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqKmRlc2MsIGludCBzaXplICk7CitpbnQgd2xfcGNpX2RtYV9mcmVlX2Rlc2NfYW5kX2J1Ziggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqKmRlc2MgKTsKK2ludCB3bF9wY2lfZG1hX2FsbG9jX2Rlc2MoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICoqZGVzYyApOworaW50IHdsX3BjaV9kbWFfZnJlZV9kZXNjKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqKmRlc2MgKTsKK2ludCB3bF9wY2lfZG1hX2FsbG9jX2J1Ziggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqZGVzYywgaW50IHNpemUgKTsKK2ludCB3bF9wY2lfZG1hX2ZyZWVfYnVmKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICpkZXNjICk7CisKK3ZvaWQgd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbV9yeCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisjZW5kaWYgIC8vIEVOQUJMRV9ETUEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBDSSBtb2R1bGUgZnVuY3Rpb24gcmVnaXN0cmF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHdsX2RyaXZlciA9Cit7CisJbmFtZToJCU1PRFVMRV9OQU1FLAorICAgIGlkX3RhYmxlOgl3bF9wY2lfdGJsLAorCXByb2JlOgkJd2xfcGNpX3Byb2JlLAorCXJlbW92ZToJCV9fZGV2ZXhpdF9wKHdsX3BjaV9yZW1vdmUpLAorICAgIHN1c3BlbmQ6ICAgIE5VTEwsCisgICAgcmVzdW1lOiAgICAgTlVMTCwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9hZGFwdGVyX2luaXRfbW9kdWxlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQ2FsbGVkIGJ5IGluaXRfbW9kdWxlKCkgdG8gcGVyZm9ybSBQQ0ktc3BlY2lmaWMgZHJpdmVyIGluaXRpYWxpemF0aW9uLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgTi9BCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9hZGFwdGVyX2luaXRfbW9kdWxlKCB2b2lkICkKK3sKKyAgICBpbnQgcmVzdWx0OworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfYWRhcHRlcl9pbml0X21vZHVsZSgpIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworICAgIERCR19UUkFDRSggRGJnSW5mbywgIndsX2FkYXB0ZXJfaW5pdF9tb2R1bGUoKSAtLSBQQ0lcbiIgKTsKKworICAgIHJlc3VsdCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoICZ3bF9kcml2ZXIgKTsgLy87P3JlcGxhY2Ugd2l0aCBwY2lfbW9kdWxlX2luaXQsIFJ1YmluaSBwZyA0OTAKKwkvLzs/IHdoeSBub3QgZG8gc29tZXRoaW5nIHdpdGggdGhlIHJlc3VsdAorCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuIDA7Cit9IC8vIHdsX2FkYXB0ZXJfaW5pdF9tb2R1bGUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQ2FsbGVkIGJ5IGNsZWFudXBfbW9kdWxlKCkgdG8gcGVyZm9ybSBQQ0ktc3BlY2lmaWMgZHJpdmVyIGNsZWFudXAuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBOL0EKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX2FkYXB0ZXJfY2xlYW51cF9tb2R1bGUoIHZvaWQgKQoreworCS8vOz9ob3cgY29tZXMgd2xfYWRhcHRlcl9jbGVhbnVwX21vZHVsZSBpcyBsb2NhdGVkIGluIGEgc2VlbWluZ2x5IHBjaSBzcGVjaWZpYyBtb2R1bGUKKyAgICBEQkdfRlVOQyggIndsX2FkYXB0ZXJfY2xlYW51cF9tb2R1bGUiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwkvLzs/REJHX1RSQUNFIGJlbG93IGZlZWxzIGxpa2UgbmVhcmx5IHJlZHVuZGFudCBpbiB0aGUgbGlnaHQgb2YgREJHX0VOVEVSIGFib3ZlCisgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAid2xfYWRhcHRlcl9jbGVhbnVwX21vZHVsZSgpIC0tIFBDSVxuIiApOworCisgICAgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCAmd2xfZHJpdmVyICk7CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm47Cit9IC8vIHdsX2FkYXB0ZXJfY2xlYW51cF9tb2R1bGUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9hZGFwdGVyX2luc2VydCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIENhbGxlZCBieSB3bF9wY2lfcHJvYmUoKSB0byBjb250aW51ZSB0aGUgcHJvY2VzcyBvZiBkZXZpY2UgaW5zZXJ0aW9uLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgVFJVRSBvciBGQUxTRQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfYWRhcHRlcl9pbnNlcnQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworICAgIGludCByZXN1bHQgPSBGQUxTRTsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX2FkYXB0ZXJfaW5zZXJ0IiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAid2xfYWRhcHRlcl9pbnNlcnQoKSAtLSBQQ0lcbiIgKTsKKworICAgIGlmKCBkZXYgPT0gTlVMTCApIHsKKyAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAibmV0X2RldmljZSBwb2ludGVyIGlzIE5VTEwhISFcbiIgKTsKKyAgICB9IGVsc2UgaWYoIGRldi0+cHJpdiA9PSBOVUxMICkgeworICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJ3bF9wcml2YXRlIHBvaW50ZXIgaXMgTlVMTCEhIVxuIiApOworICAgIH0gZWxzZSBpZiggd2xfaW5zZXJ0KCBkZXYgKSApIHsgLyogUGVyZm9ybSByZW1haW5pbmcgZGV2aWNlIGluaXRpYWxpemF0aW9uICovCisJCXJlc3VsdCA9IFRSVUU7CisJfSBlbHNlIHsKKyAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAid2xfaW5zZXJ0KCkgRkFJTEVEXG4iICk7CisgICAgfQorICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybiByZXN1bHQ7Cit9IC8vIHdsX2FkYXB0ZXJfaW5zZXJ0CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfYWRhcHRlcl9vcGVuKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgT3BlbiB0aGUgZGV2aWNlLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgYW4gSENGIHN0YXR1cyBjb2RlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9hZGFwdGVyX29wZW4oIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworICAgIGludCAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgaW50ICAgICAgICAgaGNmX3N0YXR1cyA9IEhDRl9TVUNDRVNTOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfYWRhcHRlcl9vcGVuIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAid2xfYWRhcHRlcl9vcGVuKCkgLS0gUENJXG4iICk7CisKKyAgICBoY2Zfc3RhdHVzID0gd2xfb3BlbiggZGV2ICk7CisKKyAgICBpZiggaGNmX3N0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApIHsKKyAgICAgICAgcmVzdWx0ID0gLUVOT0RFVjsKKyAgICB9CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm4gcmVzdWx0OworfSAvLyB3bF9hZGFwdGVyX29wZW4KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9hZGFwdGVyX2Nsb3NlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQ2xvc2UgdGhlIGRldmljZQorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfYWRhcHRlcl9jbG9zZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisgICAgREJHX0ZVTkMoICJ3bF9hZGFwdGVyX2Nsb3NlIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAid2xfYWRhcHRlcl9jbG9zZSgpIC0tIFBDSVxuIiApOworICAgIERCR19UUkFDRSggRGJnSW5mbywgIiVzOiBTaHV0dGluZyBkb3duIGFkYXB0ZXIuXG4iLCBkZXYtPm5hbWUgKTsKKworICAgIHdsX2Nsb3NlKCBkZXYgKTsKKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybiAwOworfSAvLyB3bF9hZGFwdGVyX2Nsb3NlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfYWRhcHRlcl9pc19vcGVuKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQ2hlY2sgd2hldGhlciB0aGlzIGRldmljZSBpcyBvcGVuLiBSZXR1cm5zCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBub256ZXJvIGlmIGRldmljZSBpcyBvcGVuLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfYWRhcHRlcl9pc19vcGVuKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyAgICAvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gUENNQ0lBIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgdGhlICdvcGVuJyBmaWVsZAorICAgICAgIGluIHRoZSBkZXZfbGlua190IHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggYSBuZXR3b3JrIGRldmljZS4gVGhlcmUKKyAgICAgICBkb2Vzbid0IHNlZW0gdG8gYmUgYW4gYW5hbG9nIHRvIHRoaXMgZm9yIFBDSSwgYW5kIGNoZWNraW5nIHRoZSBzdGF0dXMKKyAgICAgICBjb250YWluZWQgaW4gdGhlIG5ldF9kZXZpY2Ugc3RydWN0dXJlIGRvZXNuJ3QgaGF2ZSB0aGUgc2FtZSBlZmZlY3QuCisgICAgICAgRm9yIG5vdywgcmV0dXJuIFRSVUUsIGJ1dCBmaW5kIG91dCBpZiB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgUENJLiAqLworCisgICAgcmV0dXJuIFRSVUU7Cit9IC8vIHdsX2FkYXB0ZXJfaXNfb3BlbgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3BjaV9wcm9iZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFJlZ2lzdGVyZWQgaW4gdGhlIHBjaV9kcml2ZXIgc3RydWN0dXJlLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZQorICogIFBDSSBzdWJzeXN0ZW0gZmluZHMgYSBuZXcgUENJIGRldmljZSB3aGljaCBtYXRjaGVzIHRoZSBpbmZvbWF0aW9uIGNvbnRhaW5lZAorICogIGluIHRoZSBwY2lfZGV2aWNlX2lkIHRhYmxlLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgcGRldiAgICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKKyAqICAgICAgZW50ICAgICAtIHRoaXMgZGV2aWNlJ3MgZW50cnkgaW4gdGhlIHBjaV9kZXZpY2VfaWQgdGFibGUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IF9fZGV2aW5pdCB3bF9wY2lfcHJvYmUoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50ICkKK3sKKyAgICBpbnQgcmVzdWx0OworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfcGNpX3Byb2JlIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCURCR19QUklOVCggIiVzXG4iLCBWRVJTSU9OX0lORk8gKTsKKworICAgIHJlc3VsdCA9IHdsX3BjaV9zZXR1cCggcGRldiApOworCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfSAvLyB3bF9wY2lfcHJvYmUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wY2lfcmVtb3ZlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgUmVnaXN0ZXJlZCBpbiB0aGUgcGNpX2RyaXZlciBzdHJ1Y3R1cmUsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlCisgKiAgUENJIHN1YnN5c3RlbSBkZXRlY3RzIHRoYXQgYSBQQ0kgZGV2aWNlIHdoaWNoIG1hdGNoZXMgdGhlIGluZm9tYXRpb24KKyAqICBjb250YWluZWQgaW4gdGhlIHBjaV9kZXZpY2VfaWQgdGFibGUgaGFzIGJlZW4gcmVtb3ZlZC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBfX2RldmV4aXQgd2xfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAgICAgICAqZGV2ID0gTlVMTDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX3BjaV9yZW1vdmUiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKyAgICAvKiBNYWtlIHN1cmUgdGhlIHBjaV9kZXYgcG9pbnRlciBwYXNzZWQgaW4gaXMgdmFsaWQgKi8KKyAgICBpZiggcGRldiA9PSBOVUxMICkgeworICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJQQ0kgc3Vic3lzIHBhc3NlZCBpbiBhbiBpbnZhbGlkIHBjaV9kZXYgcG9pbnRlclxuIiApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopcGNpX2dldF9kcnZkYXRhKCBwZGV2ICk7CisgICAgaWYoIGRldiA9PSBOVUxMICkgeworICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJDb3VsZCBub3QgcmV0cmlldmUgbmV0X2RldmljZSBzdHJ1Y3R1cmVcbiIgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFBlcmZvcm0gZGV2aWNlIGNsZWFudXAgKi8KKyAgICB3bF9yZW1vdmUoIGRldiApOworICAgIGZyZWVfaXJxKCBkZXYtPmlycSwgZGV2ICk7CisKKyNpZmRlZiBFTkFCTEVfRE1BCisgICAgd2xfcGNpX2RtYV9mcmVlKCBwZGV2LCAoc3RydWN0IHdsX3ByaXZhdGUgKilkZXYtPnByaXYgKTsKKyNlbmRpZgorCisgICAgd2xfZGV2aWNlX2RlYWxsb2MoIGRldiApOworCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuOworfSAvLyB3bF9wY2lfcmVtb3ZlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcGNpX3NldHVwKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQ2FsbGVkIGJ5IHdsX3BjaV9wcm9iZSgpIHRvIGJlZ2luIGEgZGV2aWNlJ3MgaW5pdGlhbGl6YXRpb24gcHJvY2Vzcy4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9wY2lfc2V0dXAoIHN0cnVjdCBwY2lfZGV2ICpwZGV2ICkKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgICAqZGV2ID0gTlVMTDsKKyAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICpscCA9IE5VTEw7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF9wY2lfc2V0dXAiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKyAgICAvKiBNYWtlIHN1cmUgdGhlIHBjaV9kZXYgcG9pbnRlciBwYXNzZWQgaW4gaXMgdmFsaWQgKi8KKyAgICBpZiggcGRldiA9PSBOVUxMICkgeworICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJQQ0kgc3Vic3lzIHBhc3NlZCBpbiBhbiBpbnZhbGlkIHBjaV9kZXYgcG9pbnRlclxuIiApOworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisKKyAgICByZXN1bHQgPSBwY2lfZW5hYmxlX2RldmljZSggcGRldiApOworICAgIGlmKCByZXN1bHQgIT0gMCApIHsKKyAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAicGNpX2VuYWJsZV9kZXZpY2UoKSBmYWlsZWRcbiIgKTsKKyAgICAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyogV2UgZm91bmQgb3VyIGRldmljZSEgTGV0J3MgcmVnaXN0ZXIgaXQgd2l0aCB0aGUgc3lzdGVtICovCisgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiRm91bmQgb3VyIGRldmljZSwgbm93IHJlZ2lzdGVyaW5nXG4iICk7CisgICAgZGV2ID0gd2xfZGV2aWNlX2FsbG9jKCApOworICAgIGlmKCBkZXYgPT0gTlVMTCApIHsKKyAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiQ291bGQgbm90IHJlZ2lzdGVyIGRldmljZSEhIVxuIiApOworICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgfQorCisgICAgLyogTWFrZSBzdXJlIHRoYXQgc3BhY2Ugd2FzIGFsbG9jYXRlZCBmb3Igb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3QgKi8KKyAgICBpZiggZGV2LT5wcml2ID09IE5VTEwgKSB7CisgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIlByaXZhdGUgYWRhcHRlciBzdHJ1Y3Qgd2FzIG5vdCBhbGxvY2F0ZWQhISFcbiIgKTsKKyAgICAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgIH0KKworI2lmZGVmIEVOQUJMRV9ETUEKKyAgICAvKiBBbGxvY2F0ZSBETUEgRGVzY3JpcHRvcnMgKi8KKyAgICBpZiggd2xfcGNpX2RtYV9hbGxvYyggcGRldiwgKHN0cnVjdCB3bF9wcml2YXRlICopZGV2LT5wcml2ICkgPCAwICkgeworICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJDb3VsZCBub3QgYWxsb2NhdGUgRE1BIGRlc2NyaXB0b3IgbWVtb3J5ISEhXG4iICk7CisgICAgICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIFJlZ2lzdGVyIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlIHdpdGggUENJICovCisgICAgcGNpX3NldF9kcnZkYXRhKCBwZGV2LCBkZXYgKTsKKworICAgIC8qIEZpbGwgb3V0IGJ1cyBzcGVjaWZpYyBpbmZvcm1hdGlvbiBpbiB0aGUgbmV0X2RldmljZSBzdHJ1Y3QgKi8KKyAgICBkZXYtPmlycSA9IHBkZXYtPmlycTsKKyAgICBTRVRfTU9EVUxFX09XTkVSKCBkZXYgKTsKKworICAgIERCR19UUkFDRSggRGJnSW5mbywgIkRldmljZSBCYXNlIEFkZHJlc3M6ICUjMDNseFxuIiwgcGRldi0+cmVzb3VyY2VbMF0uc3RhcnQgKTsKKwlkZXYtPmJhc2VfYWRkciA9IHBkZXYtPnJlc291cmNlWzBdLnN0YXJ0OworCisgICAgLyogSW5pdGlhbGl6ZSBvdXIgZGV2aWNlIGhlcmUgKi8KKyAgICBpZiggIXdsX2FkYXB0ZXJfaW5zZXJ0KCBkZXYgKSkgeworICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJ3bF9hZGFwdGVyX2luc2VydCgpIEZBSUxFRCEhIVxuIiApOworICAgICAgICB3bF9kZXZpY2VfZGVhbGxvYyggZGV2ICk7CisgICAgICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAvKiBSZWdpc3RlciBvdXIgSVNSICovCisgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiUmVnaXN0ZXJpbmcgSVNSLi4uXG4iICk7CisKKyAgICByZXN1bHQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgd2xfaXNyLCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpOworICAgIGlmKCByZXN1bHQgKSB7CisgICAgICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiQ291bGQgbm90IHJlZ2lzdGVyIElTUiEhIVxuIiApOworICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKwl9CisKKyAgICAvKiBNYWtlIHN1cmUgaW50ZXJydXB0cyBhcmUgZW5hYmxlZCBwcm9wZXJseSBmb3IgQ2FyZEJ1cyAqLworICAgIGxwID0gKHN0cnVjdCB3bF9wcml2YXRlICopZGV2LT5wcml2OworCisgICAgaWYoIGxwLT5oY2ZDdHguSUZCX0J1c1R5cGUgPT0gQ0ZHX05JQ19CVVNfVFlQRV9DQVJEQlVTIHx8CisJICAgIGxwLT5oY2ZDdHguSUZCX0J1c1R5cGUgPT0gQ0ZHX05JQ19CVVNfVFlQRV9QQ0kgCQkpIHsKKyAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiVGhpcyBpcyBhIFBDSS9DYXJkQnVzIGNhcmQsIGVuYWJsZSBpbnRlcnJ1cHRzXG4iICk7CisgICAgICAgIHdsX3BjaV9lbmFibGVfY2FyZGJ1c19pbnRlcnJ1cHRzKCBwZGV2ICk7CisgICAgfQorCisgICAgLyogRW5hYmxlIGJ1cyBtYXN0ZXJpbmcgKi8KKyAgICBwY2lfc2V0X21hc3RlciggcGRldiApOworCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuIDA7Cit9IC8vIHdsX3BjaV9zZXR1cAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3BjaV9lbmFibGVfY2FyZGJ1c19pbnRlcnJ1cHRzKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQ2FsbGVkIGJ5IHdsX3BjaV9zZXR1cCgpIHRvIGVuYWJsZSBpbnRlcnJ1cHRzIG9uIGEgQ2FyZEJ1cyBkZXZpY2UuIFRoaXMKKyAqICBpcyBkb25lIGJ5IHdyaXRpbmcgYml0IDE1IHRvIHRoZSBmdW5jdGlvbiBldmVudCBtYXNrIHJlZ2lzdGVyLiBUaGlzCisgKiAgQ2FyZEJ1cy1zcGVjaWZpYyByZWdpc3RlciBpcyBsb2NhdGVkIGluIEJBUjIgKGNvdW50aW5nIGZyb20gQkFSMCksIGluIG1lbW9yeQorICogIHNwYWNlIGF0IGJ5dGUgb2Zmc2V0IDFmNCAoN2Y0IGZvciBXQVJQKS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9wY2lfZW5hYmxlX2NhcmRidXNfaW50ZXJydXB0cyggc3RydWN0IHBjaV9kZXYgKnBkZXYgKQoreworICAgIHUzMiAgICAgICAgICAgICAgICAgYmFyMl9yZWc7CisgICAgdTMyICAgICAgICAgICAgICAgICBtZW1fYWRkcl9idXM7CisgICAgdTMyICAgICAgICAgICAgICAgICBmdW5jX2V2dF9tYXNrX3JlZzsKKyAgICB2b2lkICAgICAgICAgICAgICAgICptZW1fYWRkcl9rZXJuID0gTlVMTDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX3BjaV9lbmFibGVfY2FyZGJ1c19pbnRlcnJ1cHRzIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisgICAgLyogSW5pdGlhbGl6ZSB0byBrbm93biBiYWQgdmFsdWVzICovCisgICAgYmFyMl9yZWcgPSAweGRlYWRiZWVmOworICAgIG1lbV9hZGRyX2J1cyA9IDB4ZGVhZGJlZWY7CisKKyAgICAvKiBSZWFkIHRoZSBCQVIyIHJlZ2lzdGVyOyB0aGlzIHJlZ2lzdGVyIGNvbnRhaW5zIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlCisgICAgICAgbWVtb3J5IHJlZ2lvbiB3aGVyZSB0aGUgZnVuY3Rpb24gZXZlbnQgbWFzayByZWdpc3RlciBsaXZlcyAqLworICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZCggcGRldiwgUENJX0JBU0VfQUREUkVTU18yLCAmYmFyMl9yZWcgKTsKKyAgICBtZW1fYWRkcl9idXMgPSBiYXIyX3JlZyAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CisKKyAgICAvKiBPbmNlIHRoZSBiYXNlIGFkZHJlc3MgaXMgb2J0YWluZWQsIHJlbWFwIHRoZSBtZW1vcnkgcmVnaW9uIHRvIGtlcm5lbAorICAgICAgIHNwYWNlIHNvIHdlIGNhbiByZXRyaWV2ZSB0aGUgcmVnaXN0ZXIgKi8KKyAgICBtZW1fYWRkcl9rZXJuID0gaW9yZW1hcCggbWVtX2FkZHJfYnVzLCAweDIwMCApOworCisjaWZkZWYgSEVSTUVTMjUKKyNkZWZpbmUgUkVHX09GRlNFVCAgMHgwN0Y0CisjZWxzZQorI2RlZmluZSBSRUdfT0ZGU0VUICAweDAxRjQKKyNlbmRpZiAvLyBIRVJNRVMyNQorCisjZGVmaW5lIEJJVDE1ICAgICAgIDB4ODAwMAorCisgICAgLyogUmV0cmlldmUgdGhlIGZ1bmN0aW9uYWwgZXZlbnQgbWFzayByZWdpc3RlciwgZW5hYmxlIGludGVycnVwdHMgYnkKKyAgICAgICBzZXR0aW5nIEJpdCAxNSwgYW5kIHdyaXRlIGJhY2sgdGhlIHZhbHVlICovCisgICAgZnVuY19ldnRfbWFza19yZWcgPSAqKHUzMiAqKSggbWVtX2FkZHJfa2VybiArIFJFR19PRkZTRVQgKTsKKyAgICBmdW5jX2V2dF9tYXNrX3JlZyB8PSBCSVQxNTsKKyAgICAqKHUzMiAqKSggbWVtX2FkZHJfa2VybiArIFJFR19PRkZTRVQgKSA9IGZ1bmNfZXZ0X21hc2tfcmVnOworCisgICAgLyogT25jZSBjb21wbGV0ZSwgdW5tYXAgdGhlIHJlZ2lvbiBhbmQgZXhpdCAqLworICAgIGlvdW5tYXAoIG1lbV9hZGRyX2tlcm4gKTsKKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybjsKK30gLy8gd2xfcGNpX2VuYWJsZV9jYXJkYnVzX2ludGVycnVwdHMKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpZmRlZiBFTkFCTEVfRE1BCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcGNpX2RtYV9hbGxvYygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEFsbG9jYXRlcyBhbGwgcmVzb3VyY2VzIG5lZWRlZCBmb3IgUENJL0NhcmRCdXMgRE1BIG9wZXJhdGlvbgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgcGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3BjaV9kbWFfYWxsb2MoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworICAgIGludCBpOworICAgIGludCBzdGF0dXMgPSAwOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfcGNpX2RtYV9hbGxvYyIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworLy8gICAgIGxwLT5kbWEudHhfcnNjX2luZCA9IGxwLT5kbWEucnhfcnNjX2luZCA9IDA7CisvLworLy8gICAgIC8qIEFsbG9jIGZvciB0aGUgVHggY2hhaW4gYW5kIGl0cyByZWNsYWltIGRlc2NyaXB0b3IgKi8KKy8vICAgICBmb3IoIGkgPSAwOyBpIDwgTlVNX1RYX0RFU0M7IGkrKyApIHsKKy8vICAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9hbGxvY190eF9wYWNrZXQoIHBkZXYsIGxwLCAmbHAtPmRtYS50eF9wYWNrZXRbaV0gKTsKKy8vICAgICAgICAgaWYoIHN0YXR1cyA9PSAwICkgeworLy8gICAgICAgICAgICAgREJHX1BSSU5UKCAibHAtPmRtYS50eF9wYWNrZXRbJWRdIDogICAgICAgICAgICAgICAgIDB4JXBcbiIsIGksIGxwLT5kbWEudHhfcGFja2V0W2ldICk7CisvLyAgICAgICAgICAgICBEQkdfUFJJTlQoICJscC0+ZG1hLnR4X3BhY2tldFslZF0tPm5leHRfZGVzY19hZGRyIDogMHglcFxuIiwgaSwgbHAtPmRtYS50eF9wYWNrZXRbaV0tPm5leHRfZGVzY19hZGRyICk7CisvLyAgICAgICAgICAgICBscC0+ZG1hLnR4X3JzY19pbmQrKzsKKy8vICAgICAgICAgfSBlbHNlIHsKKy8vICAgICAgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIkNvdWxkIG5vdCBhbGxvYyBETUEgVHggUGFja2V0XG4iICk7CisvLyAgICAgICAgICAgICBicmVhazsKKy8vICAgICAgICAgfQorLy8gICAgIH0KKy8vICAgICBpZiggc3RhdHVzID09IDAgKSB7CisvLyAgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfYWxsb2NfZGVzYyggcGRldiwgbHAsICZscC0+ZG1hLnR4X3JlY2xhaW1fZGVzYyApOworLy8gICAgICAgICBEQkdfUFJJTlQoICJscC0+ZG1hLnR4X3JlY2xhaW1fZGVzYzogMHglcFxuIiwgbHAtPmRtYS50eF9yZWNsYWltX2Rlc2MgKTsKKy8vICAgICB9CisvLyAgICAgLyogQWxsb2MgZm9yIHRoZSBSeCBjaGFpbiBhbmQgaXRzIHJlY2xhaW0gZGVzY3JpcHRvciAqLworLy8gICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKKy8vICAgICAgICAgZm9yKCBpID0gMDsgaSA8IE5VTV9SWF9ERVNDOyBpKysgKSB7CisvLyAgICAgICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2FsbG9jX3J4X3BhY2tldCggcGRldiwgbHAsICZscC0+ZG1hLnJ4X3BhY2tldFtpXSApOworLy8gICAgICAgICAgICAgaWYoIHN0YXR1cyA9PSAwICkgeworLy8gICAgICAgICAgICAgICAgIERCR19QUklOVCggImxwLT5kbWEucnhfcGFja2V0WyVkXSAgICAgICAgICAgICAgICAgOiAweCVwXG4iLCBpLCBscC0+ZG1hLnJ4X3BhY2tldFtpXSApOworLy8gICAgICAgICAgICAgICAgIERCR19QUklOVCggImxwLT5kbWEucnhfcGFja2V0WyVkXS0+bmV4dF9kZXNjX2FkZHIgOiAweCVwXG4iLCBpLCBscC0+ZG1hLnJ4X3BhY2tldFtpXS0+bmV4dF9kZXNjX2FkZHIgKTsKKy8vICAgICAgICAgICAgICAgICBscC0+ZG1hLnJ4X3JzY19pbmQrKzsKKy8vICAgICAgICAgICAgIH0gZWxzZSB7CisvLyAgICAgICAgICAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiQ291bGQgbm90IGFsbG9jIERNQSBSeCBQYWNrZXRcbiIgKTsKKy8vICAgICAgICAgICAgICAgICBicmVhazsKKy8vICAgICAgICAgICAgIH0KKy8vICAgICAgICAgfQorLy8gICAgIH0KKy8vICAgICBpZiggc3RhdHVzID09IDAgKSB7CisvLyAgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfYWxsb2NfZGVzYyggcGRldiwgbHAsICZscC0+ZG1hLnJ4X3JlY2xhaW1fZGVzYyApOworLy8gICAgICAgICBEQkdfUFJJTlQoICJscC0+ZG1hLnJ4X3JlY2xhaW1fZGVzYzogMHglcFxuIiwgbHAtPmRtYS5yeF9yZWNsYWltX2Rlc2MgKTsKKy8vICAgICB9CisvLyAgICAgLyogU3RvcmUgc3RhdHVzLCBhcyBob3N0IHNob3VsZCBub3QgY2FsbCBIQ0YgZnVuY3Rpb25zIGlmIHRoaXMgZmFpbHMgKi8KKy8vICAgICBscC0+ZG1hLnN0YXR1cyA9IHN0YXR1czsgIC8vOz9hbGwgdXNlYWdlcyBvZiBkbWEuc3RhdHVzIGhhdmUgYmVlbiBjb21tZW50ZWQgb3V0CisvLyAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLy8gd2xfcGNpX2RtYV9hbGxvYworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3BjaV9kbWFfZnJlZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIERlYWxsb2NhdGVkIGFsbCByZXNvdXJjZXMgbmVlZGVkIGZvciBQQ0kvQ2FyZEJ1cyBETUEgb3BlcmF0aW9uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBwZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfcGNpX2RtYV9mcmVlKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX3BjaV9kbWFfZnJlZSIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworICAgIC8qIFJlY2xhaW0gYWxsIFJ4IHBhY2tldHMgdGhhdCB3ZXJlIGhhbmRlZCBvdmVyIHRvIHRoZSBIQ0YgKi8KKyAgICAvKiBEbyBJIG5lZWQgdG8gZG8gdGhpcz8gQmVmb3JlIHRoaXMgZnJlZSBpcyBjYWxsZWQsIEkndmUgYWxyZWFkeSBkaXNhYmxlZAorICAgICAgIHRoZSBwb3J0IHdoaWNoIHdpbGwgY2FsbCB3bF9wY2lfZG1hX2hjZl9yZWNsYWltICovCisgICAgLy9pZiggbHAtPmRtYS5zdGF0dXMgPT0gMCApCisgICAgLy97CisgICAgLy8gICAgd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbSggbHAgKTsKKyAgICAvL30KKworICAgIC8qIEZyZWUgZXZlcnl0aGluZyBuZWVkZWQgZm9yIERNQSBSeCAqLworICAgIGZvciggaSA9IDA7IGkgPCBOVU1fUlhfREVTQzsgaSsrICkgeworICAgICAgICBpZiggbHAtPmRtYS5yeF9wYWNrZXRbaV0gKSB7CisgICAgICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2ZyZWVfcnhfcGFja2V0KCBwZGV2LCBscCwgJmxwLT5kbWEucnhfcGFja2V0W2ldICk7CisgICAgICAgICAgICBpZiggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICAgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICJQcm9ibGVtIGZyZWVpbmcgUnggcGFja2V0XG4iICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbHAtPmRtYS5yeF9yc2NfaW5kID0gMDsKKworICAgIGlmKCBscC0+ZG1hLnJ4X3JlY2xhaW1fZGVzYyApIHsKKyAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9mcmVlX2Rlc2MoIHBkZXYsIGxwLCAmbHAtPmRtYS5yeF9yZWNsYWltX2Rlc2MgKTsKKyAgICAgICAgaWYoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICJQcm9ibGVtIGZyZWVpbmcgUnggcmVjbGFpbSBkZXNjcmlwdG9yXG4iICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBGcmVlIGV2ZXJ5dGhpbmcgbmVlZGVkIGZvciBETUEgVHggKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgTlVNX1RYX0RFU0M7IGkrKyApIHsKKyAgICAgICAgaWYoIGxwLT5kbWEudHhfcGFja2V0W2ldICkgeworICAgICAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9mcmVlX3R4X3BhY2tldCggcGRldiwgbHAsICZscC0+ZG1hLnR4X3BhY2tldFtpXSApOworICAgICAgICAgICAgaWYoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiUHJvYmxlbSBmcmVlaW5nIFR4IHBhY2tldFxuIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGxwLT5kbWEudHhfcnNjX2luZCA9IDA7CisKKyAgICBpZiggbHAtPmRtYS50eF9yZWNsYWltX2Rlc2MgKSB7CisgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfZnJlZV9kZXNjKCBwZGV2LCBscCwgJmxwLT5kbWEudHhfcmVjbGFpbV9kZXNjICk7CisgICAgICAgIGlmKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiUHJvYmxlbSBmcmVlaW5nIFR4IHJlY2xhaW0gZGVzY3JpcHRvclxuIiApOworICAgICAgICB9CisgICAgfQorCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLy8gd2xfcGNpX2RtYV9mcmVlCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wY2lfZG1hX2FsbG9jX3R4X3BhY2tldCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEFsbG9jYXRlcyBhIHNpbmdsZSBUeCBwYWNrZXQsIGNvbnNpc3Rpbmcgb2Ygc2V2ZXJhbCBkZXNjcmlwdG9ycyBhbmQKKyAqICAgICAgYnVmZmVycy4gRGF0YSB0byB0cmFuc21pdCBpcyBmaXJzdCBjb3BpZWQgaW50byB0aGUgJ3BheWxvYWQnIGJ1ZmZlcgorICogICAgICBiZWZvcmUgYmVpbmcgdHJhbnNtaXR0ZWQuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBwZGV2ICAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQorICogICAgICBscCAgICAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqICAgICAgZGVzYyAgICAtIGEgcG9pbnRlciB3aGljaCB3aWxsIHJlZmVyZW5jZSB0aGUgZGVzY3JpcHRvciB0byBiZSBhbGxvYydkLgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfcGNpX2RtYV9hbGxvY190eF9wYWNrZXQoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjICkKK3sKKy8vICAgICBpbnQgc3RhdHVzID0gMDsKKy8vICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvLworLy8gICAgIGlmKCBkZXNjID09IE5VTEwgKSB7CisvLyAgICAgICAgIHN0YXR1cyA9IC1FRkFVTFQ7CisvLyAgICAgfQorLy8gICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKKy8vICAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9hbGxvY19kZXNjX2FuZF9idWYoIHBkZXYsIGxwLCBkZXNjLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSENGX0RNQV9UWF9CVUYxX1NJWkUgKTsKKy8vCisvLyAgICAgICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKKy8vICAgICAgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfYWxsb2NfZGVzY19hbmRfYnVmKCBwZGV2LCBscCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKCAoKmRlc2MpLT5uZXh0X2Rlc2NfYWRkciApLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDRl9NQVhfUEFDS0VUX1NJWkUgKTsKKy8vICAgICAgICAgfQorLy8gICAgIH0KKy8vICAgICBpZiggc3RhdHVzID09IDAgKSB7CisvLyAgICAgICAgICgqZGVzYyktPm5leHRfZGVzY19waHlzX2FkZHIgPSAoKmRlc2MpLT5uZXh0X2Rlc2NfYWRkci0+ZGVzY19waHlzX2FkZHI7CisvLyAgICAgfQorLy8gICAgIHJldHVybiBzdGF0dXM7Cit9IC8vIHdsX3BjaV9kbWFfYWxsb2NfdHhfcGFja2V0CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcGNpX2RtYV9mcmVlX3R4X3BhY2tldCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEZyZWVzIGEgc2luZ2xlIFR4IHBhY2tldCwgZGVzY3JpYmVkIGluIHRoZSBjb3JyZXNwb25kaW5nIGFsbG9jIGZ1bmN0aW9uLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgcGRldiAgICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKKyAqICAgICAgbHAgICAgICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKiAgICAgIGRlc2MgICAgLSBhIHBvaW50ZXIgd2hpY2ggd2lsbCByZWZlcmVuY2UgdGhlIGRlc2NyaXB0b3IgdG8gYmUgYWxsb2MnZC4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3BjaV9kbWFfZnJlZV90eF9wYWNrZXQoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjICkKK3sKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBpZiggKmRlc2MgPT0gTlVMTCApIHsKKyAgICAgICAgREJHX1BSSU5UKCAiTnVsbCBkZXNjcmlwdG9yXG4iICk7CisgICAgICAgIHN0YXR1cyA9IC1FRkFVTFQ7CisgICAgfQorCS8vOz90aGUgImxpbWl0ZWQiIE5ESVMgc3RyYXRlZ3ksIGFzc3VtaW5nIGEgZnJhbWUgY29uc2lzdHMgQUxXQVlTIG91dCBvZiAyCisJLy9kZXNjcmlwdG9ycywgbWFrZSB0aGlzIHJvYnVzdAorICAgIGlmKCBzdGF0dXMgPT0gMCAmJiAoKmRlc2MpLT5uZXh0X2Rlc2NfYWRkciApIHsKKyAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9mcmVlX2Rlc2NfYW5kX2J1ZiggcGRldiwgbHAsICYoKmRlc2MpLT5uZXh0X2Rlc2NfYWRkciApOworICAgIH0KKyAgICBpZiggc3RhdHVzID09IDAgKSB7CisgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfZnJlZV9kZXNjX2FuZF9idWYoIHBkZXYsIGxwLCBkZXNjICk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8vIHdsX3BjaV9kbWFfZnJlZV90eF9wYWNrZXQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wY2lfZG1hX2FsbG9jX3J4X3BhY2tldCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEFsbG9jYXRlcyBhIHNpbmdsZSBSeCBwYWNrZXQsIGNvbnNpc3Rpbmcgb2YgdHdvIGRlc2NyaXB0b3JzIGFuZCBvbmUKKyAqICAgICAgY29udGlndW91cyBidWZmZXIuIFRIZSBidWZmZXIgc3RhcnRzIHdpdGggdGhlIGhlcm1lcy1zcGVjaWZpYyBoZWFkZXIuCisgKiAgICAgIE9uZSBkZXNjcmlwdG9yIHBvaW50cyBhdCB0aGUgc3RhcnQsIHRoZSBvdGhlciBhdCBvZmZzZXQgMHgzYSBvZiB0aGUKKyAqICAgICAgYnVmZmVyLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgcGRldiAgICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKKyAqICAgICAgbHAgICAgICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKiAgICAgIGRlc2MgICAgLSBhIHBvaW50ZXIgd2hpY2ggd2lsbCByZWZlcmVuY2UgdGhlIGRlc2NyaXB0b3IgdG8gYmUgYWxsb2MnZC4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3BjaV9kbWFfYWxsb2NfcnhfcGFja2V0KCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICoqZGVzYyApCit7CisgICAgaW50ICAgICAgICAgc3RhdHVzID0gMDsKKyAgICBERVNDX1NUUkNUICAqcDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8vICAgICBpZiggZGVzYyA9PSBOVUxMICkgeworLy8gICAgICAgICBzdGF0dXMgPSAtRUZBVUxUOworLy8gICAgIH0KKy8vIAkvLzs/dGhlICJsaW1pdGVkIiBORElTIHN0cmF0ZWd5LCBhc3N1bWluZyBhIGZyYW1lIGNvbnNpc3RzIEFMV0FZUyBvdXQgb2YgMgorLy8gCS8vZGVzY3JpcHRvcnMsIG1ha2UgdGhpcyByb2J1c3QKKy8vICAgICBpZiggc3RhdHVzID09IDAgKSB7CisvLyAgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfYWxsb2NfZGVzYyggcGRldiwgbHAsIGRlc2MgKTsKKy8vIAl9CisvLyAgICAgaWYoIHN0YXR1cyA9PSAwICkgeworLy8gICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2FsbG9jX2J1ZiggcGRldiwgbHAsICpkZXNjLCBIQ0ZfTUFYX1BBQ0tFVF9TSVpFICk7CisvLyAgICAgfQorLy8gICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKKy8vICAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9hbGxvY19kZXNjKCBwZGV2LCBscCwgJnAgKTsKKy8vICAgICB9CisvLyAgICAgaWYoIHN0YXR1cyA9PSAwICkgeworLy8gICAgICAgICAvKiBTaXplIG9mIDFzdCBkZXNjcmlwdG9yIGJlY29tZXMgMHgzYSBieXRlcyAqLworLy8gICAgICAgICBTRVRfQlVGX1NJWkUoICpkZXNjLCBIQ0ZfRE1BX1JYX0JVRjFfU0laRSApOworLy8KKy8vICAgICAgICAgLyogTWFrZSAybmQgZGVzY3JpcHRvciBwb2ludCBhdCBvZmZzZXQgMHgzYSBvZiB0aGUgYnVmZmVyICovCisvLyAgICAgICAgIFNFVF9CVUZfU0laRSggcCwgKCBIQ0ZfTUFYX1BBQ0tFVF9TSVpFIC0gSENGX0RNQV9SWF9CVUYxX1NJWkUgKSk7CisvLyAgICAgICAgIHAtPmJ1Zl9hZGRyICAgICAgID0gKCpkZXNjKS0+YnVmX2FkZHIgKyBIQ0ZfRE1BX1JYX0JVRjFfU0laRTsKKy8vICAgICAgICAgcC0+YnVmX3BoeXNfYWRkciAgPSAoKmRlc2MpLT5idWZfcGh5c19hZGRyICsgSENGX0RNQV9SWF9CVUYxX1NJWkU7CisvLyAgICAgICAgIHAtPm5leHRfZGVzY19hZGRyID0gTlVMTDsKKy8vCisvLyAgICAgICAgIC8qIENoYWluIDJuZCBkZXNjcmlwdG9yIHRvIDFzdCBkZXNjcmlwdG9yICovCisvLyAgICAgICAgICgqZGVzYyktPm5leHRfZGVzY19hZGRyICAgICAgPSBwOworLy8gICAgICAgICAoKmRlc2MpLT5uZXh0X2Rlc2NfcGh5c19hZGRyID0gcC0+ZGVzY19waHlzX2FkZHI7CisvLyAgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30gLy8gd2xfcGNpX2RtYV9hbGxvY19yeF9wYWNrZXQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wY2lfZG1hX2ZyZWVfcnhfcGFja2V0KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgRnJlZXMgYSBzaW5nbGUgUnggcGFja2V0LCBkZXNjcmliZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgYWxsb2MgZnVuY3Rpb24uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBwZGV2ICAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQorICogICAgICBscCAgICAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqICAgICAgZGVzYyAgICAtIGEgcG9pbnRlciB3aGljaCB3aWxsIHJlZmVyZW5jZSB0aGUgZGVzY3JpcHRvciB0byBiZSBhbGxvYydkLgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfcGNpX2RtYV9mcmVlX3J4X3BhY2tldCggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqKmRlc2MgKQoreworICAgIGludCBzdGF0dXMgPSAwOworICAgIERFU0NfU1RSQ1QgKnA7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgaWYoICpkZXNjID09IE5VTEwgKSB7CisgICAgICAgIHN0YXR1cyA9IC1FRkFVTFQ7CisgICAgfQorICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKKyAgICAgICAgcCA9ICgqZGVzYyktPm5leHRfZGVzY19hZGRyOworCisgICAgICAgIC8qIEZyZWUgdGhlIDJuZCBkZXNjcmlwdG9yICovCisgICAgICAgIGlmKCBwICE9IE5VTEwgKSB7CisgICAgICAgICAgICBwLT5idWZfYWRkciAgICAgID0gTlVMTDsKKyAgICAgICAgICAgIHAtPmJ1Zl9waHlzX2FkZHIgPSAwOworCisgICAgICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2ZyZWVfZGVzYyggcGRldiwgbHAsICZwICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBGcmVlIHRoZSBidWZmZXIgYW5kIDFzdCBkZXNjcmlwdG9yICovCisgICAgaWYoIHN0YXR1cyA9PSAwICkgeworICAgICAgICBTRVRfQlVGX1NJWkUoICpkZXNjLCBIQ0ZfTUFYX1BBQ0tFVF9TSVpFICk7CisgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfZnJlZV9kZXNjX2FuZF9idWYoIHBkZXYsIGxwLCBkZXNjICk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8vIHdsX3BjaV9kbWFfZnJlZV9yeF9wYWNrZXQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wY2lfZG1hX2FsbG9jX2Rlc2NfYW5kX2J1ZigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEFsbG9jYXRlcyBhIERNQSBkZXNjcmlwdG9yIGFuZCBidWZmZXIsIGFuZCBhc3NvY2lhdGVzIHRoZW0gd2l0aCBvbmUKKyAqICAgICAgYW5vdGhlci4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHBkZXYgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQorICogICAgICBscCAgICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKiAgICAgIGRlc2MgIC0gYSBwb2ludGVyIHdoaWNoIHdpbGwgcmVmZXJlbmNlIHRoZSBkZXNjcmlwdG9yIHRvIGJlIGFsbG9jJ2QKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3BjaV9kbWFfYWxsb2NfZGVzY19hbmRfYnVmKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICoqZGVzYywgaW50IHNpemUgKQoreworICAgIGludCBzdGF0dXMgPSAwOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLy8gICAgIGlmKCBkZXNjID09IE5VTEwgKSB7CisvLyAgICAgICAgIHN0YXR1cyA9IC1FRkFVTFQ7CisvLyAgICAgfQorLy8gICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKKy8vICAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9hbGxvY19kZXNjKCBwZGV2LCBscCwgZGVzYyApOworLy8KKy8vICAgICAgICAgaWYoIHN0YXR1cyA9PSAwICkgeworLy8gICAgICAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9hbGxvY19idWYoIHBkZXYsIGxwLCAqZGVzYywgc2l6ZSApOworLy8gICAgICAgICB9CisvLyAgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8vIHdsX3BjaV9kbWFfYWxsb2NfZGVzY19hbmRfYnVmCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcGNpX2RtYV9mcmVlX2Rlc2NfYW5kX2J1ZigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEZyZWVzIGEgRE1BIGRlc2NyaXB0b3IgYW5kIGFzc29jaWF0ZWQgYnVmZmVyLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgcGRldiAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCisgKiAgICAgIGxwICAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqICAgICAgZGVzYyAgLSBhIHBvaW50ZXIgd2hpY2ggd2lsbCByZWZlcmVuY2UgdGhlIGRlc2NyaXB0b3IgdG8gYmUgYWxsb2MnZAorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfcGNpX2RtYV9mcmVlX2Rlc2NfYW5kX2J1Ziggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqKmRlc2MgKQoreworICAgIGludCBzdGF0dXMgPSAwOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIGlmKCBkZXNjID09IE5VTEwgKSB7CisgICAgICAgIHN0YXR1cyA9IC1FRkFVTFQ7CisgICAgfQorICAgIGlmKCBzdGF0dXMgPT0gMCAmJiAqZGVzYyA9PSBOVUxMICkgeworICAgICAgICBzdGF0dXMgPSAtRUZBVUxUOworICAgIH0KKyAgICBpZiggc3RhdHVzID09IDAgKSB7CisgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfZnJlZV9idWYoIHBkZXYsIGxwLCAqZGVzYyApOworCisgICAgICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfZnJlZV9kZXNjKCBwZGV2LCBscCwgZGVzYyApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8vIHdsX3BjaV9kbWFfZnJlZV9kZXNjX2FuZF9idWYKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wY2lfZG1hX2FsbG9jX2Rlc2MoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBBbGxvY2F0ZXMgb25lIERNQSBkZXNjcmlwdG9yIGluIGNhY2hlIGNvaGVyZW50IG1lbW9yeS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9wY2lfZG1hX2FsbG9jX2Rlc2MoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICoqZGVzYyApCit7CisvLyAgICAgaW50ICAgICAgICAgc3RhdHVzID0gMDsKKy8vICAgICBkbWFfYWRkcl90ICBwYTsKKy8vICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvLworLy8gICAgIERCR19GVU5DKCAid2xfcGNpX2RtYV9hbGxvY19kZXNjIiApOworLy8gICAgIERCR19FTlRFUiggRGJnSW5mbyApOworLy8KKy8vICAgICBpZiggZGVzYyA9PSBOVUxMICkgeworLy8gICAgICAgICBzdGF0dXMgPSAtRUZBVUxUOworLy8gICAgIH0KKy8vICAgICBpZiggc3RhdHVzID09IDAgKSB7CisvLyAgICAgICAgICpkZXNjID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoIHBkZXYsIHNpemVvZiggREVTQ19TVFJDVCApLCAmcGEgKTsKKy8vICAgICB9CisvLyAgICAgaWYoICpkZXNjID09IE5VTEwgKSB7CisvLyAgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgInBjaV9hbGxvY19jb25zaXN0ZW50KCkgZmFpbGVkXG4iICk7CisvLyAgICAgICAgIHN0YXR1cyA9IC1FTk9NRU07CisvLyAgICAgfSBlbHNlIHsKKy8vICAgICAgICAgbWVtc2V0KCAqZGVzYywgMCwgc2l6ZW9mKCBERVNDX1NUUkNUICkpOworLy8gICAgICAgICAoKmRlc2MpLT5kZXNjX3BoeXNfYWRkciA9IGNwdV90b19sZTMyKCBwYSApOworLy8gICAgIH0KKy8vICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKy8vICAgICByZXR1cm4gc3RhdHVzOworfSAvLyB3bF9wY2lfZG1hX2FsbG9jX2Rlc2MKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wY2lfZG1hX2ZyZWVfZGVzYygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEZyZWVzIG9uZSBETUEgZGVzY3JpcHRvciBpbiBjYWNoZSBjb2hlcmVudCBtZW1vcnkuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBwZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfcGNpX2RtYV9mcmVlX2Rlc2MoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICoqZGVzYyApCit7CisgICAgaW50ICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBpZiggKmRlc2MgPT0gTlVMTCApIHsKKyAgICAgICAgc3RhdHVzID0gLUVGQVVMVDsKKyAgICB9CisgICAgaWYoIHN0YXR1cyA9PSAwICkgeworICAgICAgICBwY2lfZnJlZV9jb25zaXN0ZW50KCBwZGV2LCBzaXplb2YoIERFU0NfU1RSQ1QgKSwgKmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZGVzYyktPmRlc2NfcGh5c19hZGRyICk7CisgICAgfQorICAgICpkZXNjID0gTlVMTDsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvLyB3bF9wY2lfZG1hX2ZyZWVfZGVzYworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3BjaV9kbWFfYWxsb2NfYnVmKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQWxsb2NhdGVzIG9uZSBETUEgYnVmZmVyIGluIGNhY2hlIGNvaGVyZW50IG1lbW9yeSwgYW5kIGFzc29jaWF0ZXMgYSBETUEKKyAqICAgICAgZGVzY3JpcHRvciB3aXRoIHRoaXMgYnVmZmVyLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgcGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3BjaV9kbWFfYWxsb2NfYnVmKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICpkZXNjLCBpbnQgc2l6ZSApCit7CisgICAgaW50ICAgICAgICAgc3RhdHVzID0gMDsKKyAgICBkbWFfYWRkcl90ICBwYTsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8vICAgICBEQkdfRlVOQyggIndsX3BjaV9kbWFfYWxsb2NfYnVmIiApOworLy8gICAgIERCR19FTlRFUiggRGJnSW5mbyApOworLy8KKy8vICAgICBpZiggZGVzYyA9PSBOVUxMICkgeworLy8gICAgICAgICBzdGF0dXMgPSAtRUZBVUxUOworLy8gICAgIH0KKy8vICAgICBpZiggc3RhdHVzID09IDAgJiYgZGVzYy0+YnVmX2FkZHIgIT0gTlVMTCApIHsKKy8vICAgICAgICAgc3RhdHVzID0gLUVGQVVMVDsKKy8vICAgICB9CisvLyAgICAgaWYoIHN0YXR1cyA9PSAwICkgeworLy8gICAgICAgICBkZXNjLT5idWZfYWRkciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KCBwZGV2LCBzaXplLCAmcGEgKTsKKy8vICAgICB9CisvLyAgICAgaWYoIGRlc2MtPmJ1Zl9hZGRyID09IE5VTEwgKSB7CisvLyAgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgInBjaV9hbGxvY19jb25zaXN0ZW50KCkgZmFpbGVkXG4iICk7CisvLyAgICAgICAgIHN0YXR1cyA9IC1FTk9NRU07CisvLyAgICAgfSBlbHNlIHsKKy8vICAgICAgICAgZGVzYy0+YnVmX3BoeXNfYWRkciA9IGNwdV90b19sZTMyKCBwYSApOworLy8gICAgICAgICBTRVRfQlVGX1NJWkUoIGRlc2MsIHNpemUgKTsKKy8vICAgICB9CisvLyAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLy8gd2xfcGNpX2RtYV9hbGxvY19idWYKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wY2lfZG1hX2ZyZWVfYnVmKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQWxsb2NhdGVzIG9uZSBETUEgYnVmZmVyIGluIGNhY2hlIGNvaGVyZW50IG1lbW9yeSwgYW5kIGFzc29jaWF0ZXMgYSBETUEKKyAqICAgICAgZGVzY3JpcHRvciB3aXRoIHRoaXMgYnVmZmVyLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgcGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3BjaV9kbWFfZnJlZV9idWYoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqZGVzYyApCit7CisgICAgaW50ICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBpZiggZGVzYyA9PSBOVUxMICkgeworICAgICAgICBzdGF0dXMgPSAtRUZBVUxUOworICAgIH0KKyAgICBpZiggc3RhdHVzID09IDAgJiYgZGVzYy0+YnVmX2FkZHIgPT0gTlVMTCApIHsKKyAgICAgICAgc3RhdHVzID0gLUVGQVVMVDsKKyAgICB9CisgICAgaWYoIHN0YXR1cyA9PSAwICkgeworICAgICAgICBwY2lfZnJlZV9jb25zaXN0ZW50KCBwZGV2LCBHRVRfQlVGX1NJWkUoIGRlc2MgKSwgZGVzYy0+YnVmX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPmJ1Zl9waHlzX2FkZHIgKTsKKworICAgICAgICBkZXNjLT5idWZfYWRkciA9IDA7CisgICAgICAgIGRlc2MtPmJ1Zl9waHlzX2FkZHIgPSAwOworICAgICAgICBTRVRfQlVGX1NJWkUoIGRlc2MsIDAgKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30gLy8gd2xfcGNpX2RtYV9mcmVlX2J1ZgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3BjaV9kbWFfaGNmX3N1cHBseSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFN1cHBseSBIQ0Ygd2l0aCBETUEtcmVsYXRlZCByZXNvdXJjZXMuIFRoZXNlIGNvbnNpc3Qgb2Y6CisgKiAgICAgICAgICAtIGJ1ZmZlcnMgYW5kIGRlc2NyaXB0b3JzIGZvciByZWNlaXZlIHB1cnBvc2VzCisgKiAgICAgICAgICAtIG9uZSAncmVjbGFpbScgZGVzY3JpcHRvciBmb3IgdGhlIHRyYW5zbWl0IHBhdGgsIHVzZWQgdG8gZnVsZmlsbCBhCisgKiAgICAgICAgICAgIGNlcnRhaW4gSDI1IERNQSBlbmdpbmUgcmVxdWlyZW1lbnQKKyAqICAgICAgICAgIC0gb25lICdyZWNsYWltJyBkZXNjcmlwdG9yIGZvciB0aGUgcmVjZWl2ZSBwYXRoLCB1c2VkIHRvIGZ1bGZpbGwgYQorICogICAgICAgICAgICBjZXJ0YWluIEgyNSBETUEgZW5naW5lIHJlcXVpcmVtZW50CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCBzdGFydC1vZi1kYXkgb3IgYXQgcmUtaW5pdGlhbGl6YXRpb24uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3BjaV9kbWFfaGNmX3N1cHBseSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKyAgICBpbnQgaTsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX3BjaV9kbWFfaGNmX3N1cHBseSIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworICAgIC8vaWYoIGxwLT5kbWEuc3RhdHVzID09IDAgKTsKKyAgICAvL3sKKyAgICAgICAgLyogSGFuZCBvdmVyIHRoZSBSeC9UeCByZWNsYWltIGRlc2NyaXB0b3JzIHRvIHRoZSBIQ0YgKi8KKyAgICAgICAgaWYoIGxwLT5kbWEudHhfcmVjbGFpbV9kZXNjICkgeworICAgICAgICAgICAgREJHX1BSSU5UKCAibHAtPmRtYS50eF9yZWNsYWltX2Rlc2M6IDB4JXBcbiIsIGxwLT5kbWEudHhfcmVjbGFpbV9kZXNjICk7CisgICAgICAgICAgICBoY2ZfZG1hX3R4X3B1dCggJmxwLT5oY2ZDdHgsIGxwLT5kbWEudHhfcmVjbGFpbV9kZXNjLCAwICk7CisgICAgICAgICAgICBscC0+ZG1hLnR4X3JlY2xhaW1fZGVzYyA9IE5VTEw7CisgICAgICAgICAgICBEQkdfUFJJTlQoICJscC0+ZG1hLnR4X3JlY2xhaW1fZGVzYzogMHglcFxuIiwgbHAtPmRtYS50eF9yZWNsYWltX2Rlc2MgKTsKKyAgICAgICAgfQorICAgICAgICBpZiggbHAtPmRtYS5yeF9yZWNsYWltX2Rlc2MgKSB7CisgICAgICAgICAgICBEQkdfUFJJTlQoICJscC0+ZG1hLnJ4X3JlY2xhaW1fZGVzYzogMHglcFxuIiwgbHAtPmRtYS5yeF9yZWNsYWltX2Rlc2MgKTsKKyAgICAgICAgICAgIGhjZl9kbWFfcnhfcHV0KCAmbHAtPmhjZkN0eCwgbHAtPmRtYS5yeF9yZWNsYWltX2Rlc2MgKTsKKyAgICAgICAgICAgIGxwLT5kbWEucnhfcmVjbGFpbV9kZXNjID0gTlVMTDsKKyAgICAgICAgICAgIERCR19QUklOVCggImxwLT5kbWEucnhfcmVjbGFpbV9kZXNjOiAweCVwXG4iLCBscC0+ZG1hLnJ4X3JlY2xhaW1fZGVzYyApOworICAgICAgICB9CisgICAgICAgIC8qIEhhbmQgb3ZlciB0aGUgUnggZGVzY3JpcHRvciBjaGFpbiB0byB0aGUgSENGICovCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBOVU1fUlhfREVTQzsgaSsrICkgeworICAgICAgICAgICAgREJHX1BSSU5UKCAibHAtPmRtYS5yeF9wYWNrZXRbJWRdOiAgICAweCVwXG4iLCBpLCBscC0+ZG1hLnJ4X3BhY2tldFtpXSApOworICAgICAgICAgICAgaGNmX2RtYV9yeF9wdXQoICZscC0+aGNmQ3R4LCBscC0+ZG1hLnJ4X3BhY2tldFtpXSApOworICAgICAgICAgICAgbHAtPmRtYS5yeF9wYWNrZXRbaV0gPSBOVUxMOworICAgICAgICAgICAgREJHX1BSSU5UKCAibHAtPmRtYS5yeF9wYWNrZXRbJWRdOiAgICAweCVwXG4iLCBpLCBscC0+ZG1hLnJ4X3BhY2tldFtpXSApOworICAgICAgICB9CisgICAgLy99CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm47Cit9IC8vIHdsX3BjaV9kbWFfaGNmX3N1cHBseQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3BjaV9kbWFfaGNmX3JlY2xhaW0oKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBSZXR1cm4gRE1BLXJlbGF0ZWQgcmVzb3VyY2VzIGZyb20gdGhlIEhDRi4gVGhlc2UgY29uc2lzdCBvZjoKKyAqICAgICAgICAgIC0gYnVmZmVycyBhbmQgZGVzY3JpcHRvcnMgZm9yIHJlY2VpdmUgcHVycG9zZXMKKyAqICAgICAgICAgIC0gYnVmZmVycyBhbmQgZGVzY3JpcHRvcnMgZm9yIHRyYW5zbWl0IHB1cnBvc2VzCisgKiAgICAgICAgICAtIG9uZSAncmVjbGFpbScgZGVzY3JpcHRvciBmb3IgdGhlIHRyYW5zbWl0IHBhdGgsIHVzZWQgdG8gZnVsZmlsbCBhCisgKiAgICAgICAgICAgIGNlcnRhaW4gSDI1IERNQSBlbmdpbmUgcmVxdWlyZW1lbnQKKyAqICAgICAgICAgIC0gb25lICdyZWNsYWltJyBkZXNjcmlwdG9yIGZvciB0aGUgcmVjZWl2ZSBwYXRoLCB1c2VkIHRvIGZ1bGZpbGwgYQorICogICAgICAgICAgICBjZXJ0YWluIEgyNSBETUEgZW5naW5lIHJlcXVpcmVtZW50CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCBlbmQtb2YtZGF5IG9yIGF0IHJlLWluaXRpYWxpemF0aW9uLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9wY2lfZG1hX2hjZl9yZWNsYWltKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworICAgIGludCBpOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfcGNpX2RtYV9oY2ZfcmVjbGFpbSIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworICAgIHdsX3BjaV9kbWFfaGNmX3JlY2xhaW1fcngoIGxwICk7CisgICAgZm9yKCBpID0gMDsgaSA8IE5VTV9SWF9ERVNDOyBpKysgKSB7CisgICAgICAgIERCR19QUklOVCggInJ4X3BhY2tldFslZF0gMHglcFxuIiwgaSwgbHAtPmRtYS5yeF9wYWNrZXRbaV0gKTsKKy8vICAgICAgICAgaWYoIGxwLT5kbWEucnhfcGFja2V0W2ldID09IE5VTEwgKSB7CisvLyAgICAgICAgICAgICBEQkdfUFJJTlQoICJ3bF9wY2lfZG1hX2hjZl9yZWNsYWltOiByeF9wYWNrZXRbJWRdIE5VTExcbiIsIGkgKTsKKy8vICAgICAgICAgfQorICAgIH0KKworICAgIHdsX3BjaV9kbWFfaGNmX3JlY2xhaW1fdHgoIGxwICk7CisgICAgZm9yKCBpID0gMDsgaSA8IE5VTV9UWF9ERVNDOyBpKysgKSB7CisgICAgICAgIERCR19QUklOVCggInR4X3BhY2tldFslZF0gMHglcFxuIiwgaSwgbHAtPmRtYS50eF9wYWNrZXRbaV0gKTsKKy8vICAgICAgICAgaWYoIGxwLT5kbWEudHhfcGFja2V0W2ldID09IE5VTEwgKSB7CisvLyAgICAgICAgICAgICBEQkdfUFJJTlQoICJ3bF9wY2lfZG1hX2hjZl9yZWNsYWltOiB0eF9wYWNrZXRbJWRdIE5VTExcbiIsIGkgKTsKKy8vICAgICAgICAgfQorICAgICB9CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm47Cit9IC8vIHdsX3BjaV9kbWFfaGNmX3JlY2xhaW0KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wY2lfZG1hX2hjZl9yZWNsYWltX3J4KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgUmVjbGFpbSBSeCBwYWNrZXRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkIGJ5IHRoZSBIQ0YuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3BjaV9kbWFfaGNmX3JlY2xhaW1fcngoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisgICAgaW50ICAgICAgICAgaTsKKyAgICBERVNDX1NUUkNUICpwOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfcGNpX2RtYV9oY2ZfcmVjbGFpbV9yeCIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworICAgIC8vaWYoIGxwLT5kbWEuc3RhdHVzID09IDAgKQorICAgIC8veworICAgICAgICB3aGlsZSAoICggcCA9IGhjZl9kbWFfcnhfZ2V0KCAmbHAtPmhjZkN0eCApICkgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIGlmKCBwICYmIHAtPmJ1Zl9hZGRyID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgLyogQSByZWNsYWltIGRlc2NyaXB0b3IgaXMgYmVpbmcgZ2l2ZW4gYmFjayBieSB0aGUgSENGLiBSZWNsYWltCisgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnMgaGF2ZSBhIE5VTEwgYnVmX2FkZHIgKi8KKyAgICAgICAgICAgICAgICBscC0+ZG1hLnJ4X3JlY2xhaW1fZGVzYyA9IHA7CisgICAgICAgICAgICAJREJHX1BSSU5UKCAicmVjbGFpbV9kZXNjcmlwdG9yOiAweCVwXG4iLCBwICk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgTlVNX1JYX0RFU0M7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBpZiggbHAtPmRtYS5yeF9wYWNrZXRbaV0gPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogQW4gUnggYnVmZmVyIGRlc2NyaXB0b3IgaXMgYmVpbmcgZ2l2ZW4gYmFjayBieSB0aGUgSENGICovCisgICAgICAgICAgICBscC0+ZG1hLnJ4X3BhY2tldFtpXSA9IHA7CisgICAgICAgICAgICBscC0+ZG1hLnJ4X3JzY19pbmQrKzsKKyAgICAgICAgCURCR19QUklOVCggInJ4X3BhY2tldFslZF0gMHglcFxuIiwgaSwgbHAtPmRtYS5yeF9wYWNrZXRbaV0gKTsKKyAgICAgICAgfQorICAgIC8vfQorICAgIERCR19MRUFWRSggRGJnSW5mbyApOworfSAvLyB3bF9wY2lfZG1hX2hjZl9yZWNsYWltX3J4CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcGNpX2RtYV9nZXRfdHhfcGFja2V0KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgT2J0YWlucyBhIFR4IGRlc2NyaXB0b3IgZnJvbSB0aGUgY2hhaW4gdG8gdXNlIGZvciBUeC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyB3bF9wcml2YXRlIHN0cnVjdHVyZS4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIEEgcG9pbnRlciB0byB0aGUgcmV0cmlldmVkIGRlc2NyaXB0b3IKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworREVTQ19TVFJDVCAqIHdsX3BjaV9kbWFfZ2V0X3R4X3BhY2tldCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKyAgICBpbnQgaTsKKyAgICBERVNDX1NUUkNUICpkZXNjID0gTlVMTDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBmb3IoIGkgPSAwOyBpIDwgTlVNX1RYX0RFU0M7IGkrKyApIHsKKyAgICAgICAgaWYoIGxwLT5kbWEudHhfcGFja2V0W2ldICkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggaSAhPSBOVU1fVFhfREVTQyApIHsKKyAgICAgICAgZGVzYyA9IGxwLT5kbWEudHhfcGFja2V0W2ldOworCisgICAgICAgIGxwLT5kbWEudHhfcGFja2V0W2ldID0gTlVMTDsKKyAgICAgICAgbHAtPmRtYS50eF9yc2NfaW5kLS07CisKKyAgICAgICAgbWVtc2V0KCBkZXNjLT5idWZfYWRkciwgMCwgSENGX0RNQV9UWF9CVUYxX1NJWkUgKTsKKyAgICB9CisKKyAgICByZXR1cm4gZGVzYzsKK30gLy8gd2xfcGNpX2RtYV9nZXRfdHhfcGFja2V0CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcGNpX2RtYV9wdXRfdHhfcGFja2V0KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgUmV0dXJucyBhIFR4IGRlc2NyaXB0b3IgdG8gdGhlIGNoYWluLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3Mgd2xfcHJpdmF0ZSBzdHJ1Y3R1cmUuCisgKiAgICAgIGRlc2MgLSBhIHBvaW50ZXIgdG8gdGhlIGRlc2NyaXB0b3IgdG8gcmV0dXJuLgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfcGNpX2RtYV9wdXRfdHhfcGFja2V0KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsIERFU0NfU1RSQ1QgKmRlc2MgKQoreworICAgIGludCBpOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIGZvciggaSA9IDA7IGkgPCBOVU1fVFhfREVTQzsgaSsrICkgeworICAgICAgICBpZiggbHAtPmRtYS50eF9wYWNrZXRbaV0gPT0gTlVMTCApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoIGkgIT0gTlVNX1RYX0RFU0MgKSB7CisgICAgICAgIGxwLT5kbWEudHhfcGFja2V0W2ldID0gZGVzYzsKKyAgICAgICAgbHAtPmRtYS50eF9yc2NfaW5kKys7CisgICAgfQorfSAvLyB3bF9wY2lfZG1hX3B1dF90eF9wYWNrZXQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wY2lfZG1hX2hjZl9yZWNsYWltX3R4KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgUmVjbGFpbSBUeCBwYWNrZXRzIHRoYXQgaGF2ZSBlaXRoZXIgYmVlbiBwcm9jZXNzZWQgYnkgdGhlIEhDRiBkdWUgdG8gYQorICogICAgICBwb3J0IGRpc2FibGUgb3IgYSBUeCBjb21wbGV0aW9uLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9wY2lfZG1hX2hjZl9yZWNsYWltX3R4KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworICAgIGludCAgICAgICAgIGk7CisgICAgREVTQ19TVFJDVCAqcDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX3BjaV9kbWFfaGNmX3JlY2xhaW1fdHgiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKyAgICAvL2lmKCBscC0+ZG1hLnN0YXR1cyA9PSAwICkKKyAgICAvL3sKKyAgICAgICAgd2hpbGUgKCAoIHAgPSBoY2ZfZG1hX3R4X2dldCggJmxwLT5oY2ZDdHggKSApICE9IE5VTEwgKSB7CisKKyAgICAgICAgICAgIGlmKCBwICE9IE5VTEwgJiYgcC0+YnVmX2FkZHIgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAvKiBBIFJlY2xhaW0gZGVzY3JpcHRvciBpcyBiZWluZyBnaXZlbiBiYWNrIGJ5IHRoZSBIQ0YuIFJlY2xhaW0KKyAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9ycyBoYXZlIGEgTlVMTCBidWZfYWRkciAqLworICAgICAgICAgICAgICAgIGxwLT5kbWEudHhfcmVjbGFpbV9kZXNjID0gcDsKKyAgICAgICAgICAgIAlEQkdfUFJJTlQoICJyZWNsYWltX2Rlc2NyaXB0b3I6IDB4JXBcbiIsIHAgKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBOVU1fVFhfREVTQzsgaSsrICkgeworICAgICAgICAgICAgICAgIGlmKCBscC0+ZG1hLnR4X3BhY2tldFtpXSA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBBbiBSeCBidWZmZXIgZGVzY3JpcHRvciBpcyBiZWluZyBnaXZlbiBiYWNrIGJ5IHRoZSBIQ0YgKi8KKyAgICAgICAgICAgIGxwLT5kbWEudHhfcGFja2V0W2ldID0gcDsKKyAgICAgICAgICAgIGxwLT5kbWEudHhfcnNjX2luZCsrOworICAgICAgICAJREJHX1BSSU5UKCAidHhfcGFja2V0WyVkXSAweCVwXG4iLCBpLCBscC0+ZG1hLnR4X3BhY2tldFtpXSApOworICAgICAgICB9CisgICAgLy99CisKKyAgICBpZiggbHAtPm5ldGlmX3F1ZXVlX29uID09IEZBTFNFICkgeworICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKCBscC0+ZGV2ICk7CisgICAgICAgIFdMX1dEU19ORVRJRl9XQUtFX1FVRVVFKCBscCApOworICAgICAgICBscC0+bmV0aWZfcXVldWVfb24gPSBUUlVFOworICAgIH0KKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm47Cit9IC8vIHdsX3BjaV9kbWFfaGNmX3JlY2xhaW1fdHgKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjZW5kaWYgIC8vIEVOQUJMRV9ETUEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3BjaS5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThkN2I1MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3BjaS5oCkBAIC0wLDAgKzEsMTA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBXaXJlbGVzcyBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAod2xhZ3M0OSkuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBodHRwOi8vd3d3LmFnZXJlLmNvbQorICoKKyAqIEluaXRpYWxseSBkZXZlbG9wZWQgYnkgVHJpcGxlUG9pbnQsIEluYy4KKyAqICAgaHR0cDovL3d3dy50cmlwbGVwb2ludC5jb20KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgSGVhZGVyIGRlc2NyaWJpbmcgaW5mb3JtYXRpb24gcmVxdWlyZWQgZm9yIHRoZSBkcml2ZXIgdG8gc3VwcG9ydCBQQ0kuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTT0ZUV0FSRSBMSUNFTlNFCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisgKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisgKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisgKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisgKgorICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogRGlzY2xhaW1lcgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1dMX1BDSV9IX18KKyNkZWZpbmUgX19XTF9QQ0lfSF9fCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgY29uc3RhbnQgZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFdMX0xLTV9QQ0lfVkVORE9SX0lEICAgIDB4MTFDMSAgLy8gTHVjZW50IE1pY3JvZWxlY3Ryb25pY3MKKyNkZWZpbmUgV0xfTEtNX1BDSV9ERVZJQ0VfSURfMCAgMHhBQjMwICAvLyBNaW5pIFBDSQorI2RlZmluZSBXTF9MS01fUENJX0RFVklDRV9JRF8xICAweEFCMzQgIC8vIE1pbmkgUENJCisjZGVmaW5lIFdMX0xLTV9QQ0lfREVWSUNFX0lEXzIgIDB4QUIxMSAgLy8gV0FSUCBDYXJkQnVzCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgZnVuY3Rpb24gcHJvdG90eXBlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9hZGFwdGVyX2luaXRfbW9kdWxlKCB2b2lkICk7CisKK3ZvaWQgd2xfYWRhcHRlcl9jbGVhbnVwX21vZHVsZSggdm9pZCApOworCitpbnQgd2xfYWRhcHRlcl9pbnNlcnQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKworaW50IHdsX2FkYXB0ZXJfb3Blbiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCitpbnQgd2xfYWRhcHRlcl9jbG9zZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCitpbnQgd2xfYWRhcHRlcl9pc19vcGVuKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKKworI2lmZGVmIEVOQUJMRV9ETUEKKwordm9pZCB3bF9wY2lfZG1hX2hjZl9zdXBwbHkoIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworCit2b2lkIHdsX3BjaV9kbWFfaGNmX3JlY2xhaW0oIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworCitERVNDX1NUUkNUICogd2xfcGNpX2RtYV9nZXRfdHhfcGFja2V0KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKwordm9pZCB3bF9wY2lfZG1hX3B1dF90eF9wYWNrZXQoIHN0cnVjdCB3bF9wcml2YXRlICpscCwgREVTQ19TVFJDVCAqZGVzYyApOworCit2b2lkIHdsX3BjaV9kbWFfaGNmX3JlY2xhaW1fdHgoIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworCisjZW5kaWYgIC8vIEVOQUJMRV9ETUEKKworCisjZW5kaWYgIC8vIF9fV0xfUENJX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcHJpdi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcHJpdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNjEwYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wcml2LmMKQEAgLTAsMCArMSwyMDc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBXaXJlbGVzcyBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAod2xhZ3M0OSkuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBodHRwOi8vd3d3LmFnZXJlLmNvbQorICoKKyAqIEluaXRpYWxseSBkZXZlbG9wZWQgYnkgVHJpcGxlUG9pbnQsIEluYy4KKyAqICAgaHR0cDovL3d3dy50cmlwbGVwb2ludC5jb20KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgVGhpcyBmaWxlIGRlZmluZXMgaGFuZGxpbmcgcm91dGluZXMgZm9yIHRoZSBwcml2YXRlIElPQ1RMcworICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU09GVFdBUkUgTElDRU5TRQorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisgKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIERpc2NsYWltZXIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIJNBUyBJU5QgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisgKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBpbmNsdWRlIGZpbGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPHdsX3ZlcnNpb24uaD4KKworI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGRlYnVnLmg+CisjaW5jbHVkZSA8aGNmLmg+CisjaW5jbHVkZSA8aGNmZGVmLmg+CisKKyNpbmNsdWRlIDx3bF9pZi5oPgorI2luY2x1ZGUgPHdsX2ludGVybmFsLmg+CisjaW5jbHVkZSA8d2xfZW5jLmg+CisjaW5jbHVkZSA8d2xfbWFpbi5oPgorI2luY2x1ZGUgPHdsX3ByaXYuaD4KKyNpbmNsdWRlIDx3bF91dGlsLmg+CisjaW5jbHVkZSA8d2xfbmV0ZGV2Lmg+CisKK2ludCB3dmxhbl91aWxfY29ubmVjdCggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKK2ludCB3dmxhbl91aWxfZGlzY29ubmVjdCggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKK2ludCB3dmxhbl91aWxfYWN0aW9uKCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworaW50IHd2bGFuX3VpbF9ibG9jayggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKK2ludCB3dmxhbl91aWxfdW5ibG9jayggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKK2ludCB3dmxhbl91aWxfc2VuZF9kaWFnX21zZyggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKK2ludCB3dmxhbl91aWxfcHV0X2luZm8oIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CitpbnQgd3ZsYW5fdWlsX2dldF9pbmZvKCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworCitpbnQgY2ZnX2RyaXZlcl9pbmZvKCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworaW50IGNmZ19kcml2ZXJfaWRlbnRpdHkoIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdsb2JhbCB2YXJpYWJsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgREJHCitleHRlcm4gZGJnX2luZm9fdCAqRGJnSW5mbzsKKyNlbmRpZiAgLy8gREJHCisKKworCisKKy8qIElmIFVTRV9VSUwgaXMgbm90IGRlZmluZWQsIHRoZW4gbm9uZSBvZiB0aGUgVUlMIEludGVyZmFjZSBjb2RlIGJlbG93IHdpbGwKKyAgIGJlIGluY2x1ZGVkIGluIHRoZSBidWlsZCAqLworI2lmZGVmIFVTRV9VSUwKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXd2bGFuX3VpbCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoZSBoYW5kbGVyIGZ1bmN0aW9uIGZvciB0aGUgVUlMIGludGVyZmFjZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHVycSAtIGEgcG9pbnRlciB0byB0aGUgVUlMIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd3ZsYW5fdWlsKCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisJaW50IGlvY3RsX3JldCA9IDA7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJREJHX0ZVTkMoICJ3dmxhbl91aWwiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlzd2l0Y2goIHVycS0+Y29tbWFuZCApIHsKKwkgIGNhc2UgVUlMX0ZVTl9DT05ORUNUOgorCQlEQkdfVFJBQ0UoRGJnSW5mbywgIklPQ1RMOiBXVkxBTjJfSU9DVExfVUlMIC0tIFdWTEFOMl9VSUxfQ09OTkVDVFxuIik7CisJCWlvY3RsX3JldCA9IHd2bGFuX3VpbF9jb25uZWN0KCB1cnEsIGxwICk7CisJCWJyZWFrOworCSAgY2FzZSBVSUxfRlVOX0RJU0NPTk5FQ1Q6CisJCURCR19UUkFDRShEYmdJbmZvLCAiSU9DVEw6IFdWTEFOMl9JT0NUTF9VSUwgLS0gV1ZMQU4yX1VJTF9ESVNDT05ORUNUXG4iKTsKKwkJaW9jdGxfcmV0ID0gd3ZsYW5fdWlsX2Rpc2Nvbm5lY3QoIHVycSwgbHAgKTsKKwkJYnJlYWs7CisJICBjYXNlIFVJTF9GVU5fQUNUSU9OOgorCQlEQkdfVFJBQ0UoRGJnSW5mbywgIklPQ1RMOiBXVkxBTjJfSU9DVExfVUlMIC0tIFdWTEFOMl9VSUxfQUNUSU9OXG4iICk7CisJCWlvY3RsX3JldCA9IHd2bGFuX3VpbF9hY3Rpb24oIHVycSwgbHAgKTsKKwkJYnJlYWs7CisJICBjYXNlIFVJTF9GVU5fU0VORF9ESUFHX01TRzoKKwkJREJHX1RSQUNFKERiZ0luZm8sICJJT0NUTDogV1ZMQU4yX0lPQ1RMX1VJTCAtLSBXVkxBTjJfVUlMX1NFTkRfRElBR19NU0dcbiIpOworCQlpb2N0bF9yZXQgPSB3dmxhbl91aWxfc2VuZF9kaWFnX21zZyggdXJxLCBscCApOworCQlicmVhazsKKwkgIGNhc2UgVUlMX0ZVTl9HRVRfSU5GTzoKKwkJREJHX1RSQUNFKERiZ0luZm8sICJJT0NUTDogV1ZMQU4yX0lPQ1RMX1VJTCAtLSBXVkxBTjJfVUlMX0dFVF9JTkZPXG4iKTsKKwkJaW9jdGxfcmV0ID0gd3ZsYW5fdWlsX2dldF9pbmZvKCB1cnEsIGxwICk7CisJCWJyZWFrOworCSAgY2FzZSBVSUxfRlVOX1BVVF9JTkZPOgorCQlEQkdfVFJBQ0UoRGJnSW5mbywgIklPQ1RMOiBXVkxBTjJfSU9DVExfVUlMIC0tIFdWTEFOMl9VSUxfUFVUX0lORk9cbiIpOworCQlpb2N0bF9yZXQgPSB3dmxhbl91aWxfcHV0X2luZm8oIHVycSwgbHAgKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREJHX1RSQUNFKERiZ0luZm8sICJJT0NUTDogV1ZMQU4yX0lPQ1RMX1VJTCAtLSBVTlNVUFBPUlRFRCBVSUwgQ09ERTogMHglWCIsIHVycS0+Y29tbWFuZCApOworCQlpb2N0bF9yZXQgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisJfQorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiBpb2N0bF9yZXQ7Cit9IC8vIHd2bGFuX3VpbAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXd2bGFuX3VpbF9jb25uZWN0KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQ29ubmVjdCB0byB0aGUgVUlMIGluIG9yZGVyIHRvIG1ha2UgYSByZXF1ZXN0LgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgdXJxIC0gYSBwb2ludGVyIHRvIHRoZSBVSUwgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBVSUxfU1VDQ0VTUworICogICAgICBVSUxfRVJSX3h4eCB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHd2bGFuX3VpbF9jb25uZWN0KCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisJaW50IHJlc3VsdCA9IDA7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggInd2bGFuX3VpbF9jb25uZWN0IiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisKKwlpZiggISggbHAtPmZsYWdzICYgV1ZMQU4yX1VJTF9DT05ORUNURUQgKSkgeworCQlscC0+ZmxhZ3MgfD0gV1ZMQU4yX1VJTF9DT05ORUNURUQ7CisJCXVycS0+aGNmQ3R4ID0gJiggbHAtPmhjZkN0eCApOworCQl1cnEtPnJlc3VsdCA9IFVJTF9TVUNDRVNTOworCX0gZWxzZSB7CisJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiVUlMX0VSUl9JTl9VU0VcbiIgKTsKKwkJdXJxLT5yZXN1bHQgPSBVSUxfRVJSX0lOX1VTRTsKKwl9CisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmVzdWx0OworfSAvLyB3dmxhbl91aWxfY29ubmVjdAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXd2bGFuX3VpbF9kaXNjb25uZWN0KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgRGlzb25uZWN0IGZyb20gdGhlIFVJTCBhZnRlciBhIHJlcXVlc3QgaGFzIGJlZW4gY29tcGxldGVkLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgdXJxIC0gYSBwb2ludGVyIHRvIHRoZSBVSUwgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBVSUxfU1VDQ0VTUworICogICAgICBVSUxfRVJSX3h4eCB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHd2bGFuX3VpbF9kaXNjb25uZWN0KCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisJaW50IHJlc3VsdCA9IDA7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggInd2bGFuX3VpbF9kaXNjb25uZWN0IiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisKKwlpZiggdXJxLT5oY2ZDdHggPT0gJiggbHAtPmhjZkN0eCApKSB7CisJCWlmIChscC0+ZmxhZ3MgJiBXVkxBTjJfVUlMX0NPTk5FQ1RFRCkgeworCQkJbHAtPmZsYWdzICY9IH5XVkxBTjJfVUlMX0NPTk5FQ1RFRDsKKwkJCS8qCisJCQlpZiAobHAtPmZsYWdzICYgV1ZMQU4yX1VJTF9CVVNZKSB7CisJCQkJbHAtPmZsYWdzICY9IH5XVkxBTjJfVUlMX0JVU1k7CisJCQkJbmV0aWZfc3RhcnRfcXVldWUobHAtPmRldik7CisJCQl9CisJCQkqLworCQl9CisKKwkJdXJxLT5oY2ZDdHggPSBOVUxMOworCQl1cnEtPnJlc3VsdCA9IFVJTF9TVUNDRVNTOworCX0gZWxzZSB7CisJCURCR19FUlJPUiggRGJnSW5mbywgIlVJTF9FUlJfV1JPTkdfSUZCXG4iICk7CisJCXVycS0+cmVzdWx0ID0gVUlMX0VSUl9XUk9OR19JRkI7CisJfQorCisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJlc3VsdDsKK30gLy8gd3ZsYW5fdWlsX2Rpc2Nvbm5lY3QKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3dmxhbl91aWxfYWN0aW9uKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgSGFuZGxlciBmb3IgdGhlIFVJTF9BQ1RfeHh4IHN1YmNvZGVzIGFzc29jaWF0ZWQgd2l0aCBVSUxfRlVOX0FDVElPTgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgdXJxIC0gYSBwb2ludGVyIHRvIHRoZSBVSUwgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBVSUxfU1VDQ0VTUworICogICAgICBVSUxfRVJSX3h4eCB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHd2bGFuX3VpbF9hY3Rpb24oIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKwlpbnQgICAgIHJlc3VsdCA9IDA7CisJbHR2X3QgICAqbHR2OworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3dmxhbl91aWxfYWN0aW9uIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisKKwlpZiggdXJxLT5oY2ZDdHggPT0gJiggbHAtPmhjZkN0eCApKSB7CisJCS8qIE1ha2Ugc3VyZSB0aGVyZSdzIGFuIExUViBpbiB0aGUgcmVxdWVzdCBidWZmZXIgKi8KKwkJbHR2ID0gKGx0dl90ICopdXJxLT5kYXRhOworCQlpZiggbHR2ICE9IE5VTEwgKSB7CisJCQkvKiBTd2l0Y2ggb24gdGhlIFR5cGUgZmllbGQgb2YgdGhlIExUViBjb250YWluZWQgaW4gdGhlIHJlcXVlc3QKKwkJCSAgIGJ1ZmZlciAqLworCQkJc3dpdGNoKCBsdHYtPnR5cCApIHsKKwkJCWNhc2UgVUlMX0FDVF9CTE9DSzoKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJVSUxfQUNUX0JMT0NLXG4iICk7CisJCQkJcmVzdWx0ID0gd3ZsYW5fdWlsX2Jsb2NrKCB1cnEsIGxwICk7CisJCQkJYnJlYWs7CisJCQljYXNlIFVJTF9BQ1RfVU5CTE9DSzoKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJVSUxfQUNUX1VOQkxPQ0tcbiIgKTsKKwkJCQlyZXN1bHQgPSB3dmxhbl91aWxfdW5ibG9jayggdXJxLCBscCApOworCQkJCWJyZWFrOworCQkJY2FzZSBVSUxfQUNUX1NDQU46CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiVUlMX0FDVF9TQ0FOXG4iICk7CisJCQkJdXJxLT5yZXN1bHQgPSBoY2ZfYWN0aW9uKCAmKCBscC0+aGNmQ3R4ICksIE1ERF9BQ1RfU0NBTiApOworCQkJCWJyZWFrOworCQkJY2FzZSBVSUxfQUNUX0FQUExZOgorCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlVJTF9BQ1RfQVBQTFlcbiIgKTsKKwkJCQl1cnEtPnJlc3VsdCA9IHdsX2FwcGx5KCBscCApOworCQkJCWJyZWFrOworCQkJY2FzZSBVSUxfQUNUX1JFU0VUOgorCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlVJTF9BQ1RfUkVTRVRcbiIgKTsKKwkJCQl1cnEtPnJlc3VsdCA9IHdsX2dvKCBscCApOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIlVua25vd24gYWN0aW9uIGNvZGU6IDB4JXhcbiIsIGx0di0+dHlwICk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlEQkdfRVJST1IoIERiZ0luZm8sICJCYWQgTFRWIGZvciB0aGlzIGFjdGlvblxuIiApOworCQkJdXJxLT5yZXN1bHQgPSBVSUxfRVJSX0xFTjsKKwkJfQorCX0gZWxzZSB7CisJCURCR19FUlJPUiggRGJnSW5mbywgIlVJTF9FUlJfV1JPTkdfSUZCXG4iICk7CisJCXVycS0+cmVzdWx0ID0gVUlMX0VSUl9XUk9OR19JRkI7CisJfQorCisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJlc3VsdDsKK30gLy8gd3ZsYW5fdWlsX2FjdGlvbgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXd2bGFuX3VpbF9ibG9jaygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFNldHMgYSBibG9jayBpbiB0aGUgZHJpdmVyIHRvIHByZXZlbnQgYWNjZXNzIHRvIHRoZSBjYXJkIGJ5IG90aGVyCisgKiAgcHJvY2Vzc2VzLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgdXJxIC0gYSBwb2ludGVyIHRvIHRoZSBVSUwgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBVSUxfU1VDQ0VTUworICogICAgICBVSUxfRVJSX3h4eCB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgd3ZsYW5fdWlsX2Jsb2NrKCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisJaW50IHJlc3VsdCA9IDA7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggInd2bGFuX3VpbF9ibG9jayIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKCB1cnEtPmhjZkN0eCA9PSAmKCBscC0+aGNmQ3R4ICkpIHsKKwkJaWYoIGNhcGFibGUoIENBUF9ORVRfQURNSU4gKSkgeworCQkJbHAtPmZsYWdzIHw9IFdWTEFOMl9VSUxfQlVTWTsKKwkJCW5ldGlmX3N0b3BfcXVldWUobHAtPmRldik7CisJCQlXTF9XRFNfTkVUSUZfU1RPUF9RVUVVRSggbHAgKTsKKwkJCXVycS0+cmVzdWx0ID0gVUlMX1NVQ0NFU1M7CisJCX0gZWxzZSB7CisJCQlEQkdfRVJST1IoIERiZ0luZm8sICJFUEVSTVxuIiApOworCQkJdXJxLT5yZXN1bHQgPSBVSUxfRkFJTFVSRTsKKwkJCXJlc3VsdCA9IC1FUEVSTTsKKwkJfQorCX0gZWxzZSB7CisJCURCR19FUlJPUiggRGJnSW5mbywgIlVJTF9FUlJfV1JPTkdfSUZCXG4iICk7CisJCXVycS0+cmVzdWx0ID0gVUlMX0VSUl9XUk9OR19JRkI7CisJfQorCisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJlc3VsdDsKK30gLy8gd3ZsYW5fdWlsX2Jsb2NrCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd3ZsYW5fdWlsX3VuYmxvY2soKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBVbmJsb2NrcyB0aGUgZHJpdmVyIHRvIHJlc3RvcmUgYWNjZXNzIHRvIHRoZSBjYXJkIGJ5IG90aGVyIHByb2Nlc3Nlcy4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHVycSAtIGEgcG9pbnRlciB0byB0aGUgVUlMIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgVUlMX1NVQ0NFU1MKKyAqICAgICAgVUlMX0VSUl94eHggdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3dmxhbl91aWxfdW5ibG9jayggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworCWludCByZXN1bHQgPSAwOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3dmxhbl91aWxfdW5ibG9jayIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKCB1cnEtPmhjZkN0eCA9PSAmKCBscC0+aGNmQ3R4ICkpIHsKKwkJaWYoIGNhcGFibGUoIENBUF9ORVRfQURNSU4gKSkgeworCQkJaWYgKGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSkgeworCQkJCWxwLT5mbGFncyAmPSB+V1ZMQU4yX1VJTF9CVVNZOworCQkJCW5ldGlmX3dha2VfcXVldWUobHAtPmRldik7CisJCQkJV0xfV0RTX05FVElGX1dBS0VfUVVFVUUoIGxwICk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlEQkdfRVJST1IoIERiZ0luZm8sICJFUEVSTVxuIiApOworCQkJdXJxLT5yZXN1bHQgPSBVSUxfRkFJTFVSRTsKKwkJCXJlc3VsdCA9IC1FUEVSTTsKKwkJfQorCX0gZWxzZSB7CisJCURCR19FUlJPUiggRGJnSW5mbywgIlVJTF9FUlJfV1JPTkdfSUZCXG4iICk7CisJCXVycS0+cmVzdWx0ID0gVUlMX0VSUl9XUk9OR19JRkI7CisJfQorCisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJlc3VsdDsKK30gLy8gd3ZsYW5fdWlsX3VuYmxvY2sKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3dmxhbl91aWxfc2VuZF9kaWFnX21zZygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFNlbmRzIGEgZGlhZ25vc3RpYyBtZXNzYWdlIHRvIHRoZSBjYXJkLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgdXJxIC0gYSBwb2ludGVyIHRvIHRoZSBVSUwgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBVSUxfU1VDQ0VTUworICogICAgICBVSUxfRVJSX3h4eCB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHd2bGFuX3VpbF9zZW5kX2RpYWdfbXNnKCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisJaW50ICAgICAgICAgcmVzdWx0ID0gMDsKKwlERVNDX1NUUkNUICBEZXNjcFsxXTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid3ZsYW5fdWlsX3NlbmRfZGlhZ19tc2ciICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZiggdXJxLT5oY2ZDdHggPT0gJiggbHAtPmhjZkN0eCApKSB7CisJCWlmKCBjYXBhYmxlKCBDQVBfTkVUX0FETUlOICkpIHsKKwkJCWlmICgodXJxLT5kYXRhICE9IE5VTEwpICYmICh1cnEtPmxlbiAhPSAwKSkgeworCQkJCWlmIChscC0+aGNmQ3R4LklGQl9Sc2NJbmQgIT0gMCkgeworCQkJCQl1X2NoYXIgKmRhdGE7CisKKwkJCQkJLy8gVmVyaWZ5IHRoZSB1c2VyIGJ1ZmZlcgorCQkJCQlyZXN1bHQgPSB2ZXJpZnlfYXJlYShWRVJJRllfUkVBRCwgdXJxLT5kYXRhLCB1cnEtPmxlbik7CisJCQkJCWlmIChyZXN1bHQgIT0gMCkgeworCQkJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAidmVyaWZ5X2FyZWEgZmFpbGVkLCByZXN1bHQ6ICVkXG4iLCByZXN1bHQgKTsKKwkJCQkJCXVycS0+cmVzdWx0ID0gVUlMX0ZBSUxVUkU7CisJCQkJCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKworCQkJCQlpZiAoKGRhdGEgPSBrbWFsbG9jKHVycS0+bGVuLCBHRlBfS0VSTkVMKSkgIT0gTlVMTCkgeworCQkJCQkJbWVtc2V0KCBEZXNjcCwgMCwgc2l6ZW9mKCBERVNDX1NUUkNUICkpOworCQkJCQkJbWVtY3B5KCBkYXRhLCB1cnEtPmRhdGEsIHVycS0+bGVuICk7CisKKwkJCQkJCURlc2NwWzBdLmJ1Zl9hZGRyICAgICAgID0gKHdjaV9idWZwKWRhdGE7CisJCQkJCQlEZXNjcFswXS5CVUZfQ05UICAgICAgICA9IHVycS0+bGVuOworCQkJCQkJRGVzY3BbMF0ubmV4dF9kZXNjX2FkZHIgPSAwOyAgICAvLyB0ZXJtaW5hdGUgbGlzdAorCisJCQkJCQloY2Zfc2VuZF9tc2coICYobHAtPmhjZkN0eCksICAmRGVzY3BbMF0sIEhDRl9QT1JUXzAgKTsKKwkJCQkJCWtmcmVlKCBkYXRhICk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJFTk9NRU1cbiIgKTsKKwkJCQkJCXVycS0+cmVzdWx0ID0gVUlMX0ZBSUxVUkU7CisJCQkJCQlyZXN1bHQgPSAtRU5PTUVNOworCQkJCQkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisKKwkJCQl9IGVsc2UgeworCQkJCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfQlVTWTsKKwkJCQl9CisKKwkJCX0gZWxzZSB7CisJCQkJdXJxLT5yZXN1bHQgPSBVSUxfRkFJTFVSRTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCURCR19FUlJPUiggRGJnSW5mbywgIkVQRVJNXG4iICk7CisJCQl1cnEtPnJlc3VsdCA9IFVJTF9GQUlMVVJFOworCQkJcmVzdWx0ID0gLUVQRVJNOworCQl9CisJfSBlbHNlIHsKKwkJREJHX0VSUk9SKCBEYmdJbmZvLCAiVUlMX0VSUl9XUk9OR19JRkJcbiIgKTsKKwkJdXJxLT5yZXN1bHQgPSBVSUxfRVJSX1dST05HX0lGQjsKKwl9CisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmVzdWx0OworfSAvLyB3dmxhbl91aWxfc2VuZF9kaWFnX21zZworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd3ZsYW5fdWlsX3B1dF9pbmZvKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgU2VuZHMgYSBzcGVjaWZpYyBSSUQgZGlyZWN0bHkgdG8gdGhlIGRyaXZlciB0byBzZXQgY29uZmlndXJhdGlvbiBpbmZvLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgdXJxIC0gYSBwb2ludGVyIHRvIHRoZSBVSUwgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBVSUxfU1VDQ0VTUworICogICAgICBVSUxfRVJSX3h4eCB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHd2bGFuX3VpbF9wdXRfaW5mbyggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworCWludCAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDA7CisJbHR2X3QgICAgICAgICAgICAgICAgICAgKnBMdHY7CisJYm9vbF90ICAgICAgICAgICAgICAgICAgbHR2QWxsb2NhdGVkID0gRkFMU0U7CisJRU5DU1RSQ1QgICAgICAgICAgICAgICAgc0VuY3J5cHRpb247CisKKyNpZmRlZiBVU0VfV0RTCisJaGNmXzE2ICAgICAgICAgICAgICAgICAgaGNmUG9ydCAgPSBIQ0ZfUE9SVF8wOworI2VuZGlmICAvKiBVU0VfV0RTICovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCURCR19GVU5DKCAid3ZsYW5fdWlsX3B1dF9pbmZvIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisKKwlpZiggdXJxLT5oY2ZDdHggPT0gJiggbHAtPmhjZkN0eCApKSB7CisJCWlmKCBjYXBhYmxlKCBDQVBfTkVUX0FETUlOICkpIHsKKwkJCWlmKCggdXJxLT5kYXRhICE9IE5VTEwgKSAmJiAoIHVycS0+bGVuICE9IDAgKSkgeworCQkJCS8qIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYXQgbGVhc3QgYSBjb21tYW5kIGFuZCBsZW5ndGggdG8gc2VuZC4gKi8KKwkJCQlpZiggdXJxLT5sZW4gPCAoIHNpemVvZiggaGNmXzE2ICkgKiAyICkpIHsKKwkJCQkJdXJxLT5sZW4gPSBzaXplb2YoIGxwLT5sdHZSZWNvcmQgKTsKKwkJCQkJdXJxLT5yZXN1bHQgPSBVSUxfRVJSX0xFTjsKKwkJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiTm8gTGVuZ3RoL1R5cGUgaW4gTFRWISEhXG4iICk7CisJCQkJCURCR19FUlJPUiggRGJnSW5mbywgIlVJTF9FUlJfTEVOXG4iICk7CisJCQkJCURCR19MRUFWRSggRGJnSW5mbyApOworCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCX0KKworCQkJCS8qIFZlcmlmeSB0aGUgdXNlciBidWZmZXIgKi8KKwkJCQlyZXN1bHQgPSB2ZXJpZnlfYXJlYSggVkVSSUZZX1JFQUQsIHVycS0+ZGF0YSwgdXJxLT5sZW4gKTsKKwkJCQlpZiggcmVzdWx0ICE9IDAgKSB7CisJCQkJCXVycS0+cmVzdWx0ID0gVUlMX0ZBSUxVUkU7CisJCQkJCURCR19FUlJPUiggRGJnSW5mbywgInZlcmlmeV9hcmVhKCksIFZFUklGWV9SRUFEIEZBSUxFRFxuIiApOworCQkJCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisKKwkJCQkvKiBHZXQgb25seSB0aGUgY29tbWFuZCBhbmQgbGVuZ3RoIGluZm9ybWF0aW9uLiAqLworCQkJCWNvcHlfZnJvbV91c2VyKCAmKCBscC0+bHR2UmVjb3JkICksIHVycS0+ZGF0YSwgc2l6ZW9mKCBoY2ZfMTYgKSAqIDIgKTsKKworCQkJCS8qIE1ha2Ugc3VyZSB0aGUgaW5jb21pbmcgTFRWIHJlY29yZCBsZW5ndGggaXMgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlCisJCQkJICAgSU9DVEwgbGVuZ3RoICovCisJCQkJaWYoKCggbHAtPmx0dlJlY29yZC5sZW4gKyAxICkgKiBzaXplb2YoIGhjZl8xNiApKSA+IHVycS0+bGVuICkgeworCQkJCQl1cnEtPmxlbiA9IHNpemVvZiggbHAtPmx0dlJlY29yZCApOworCQkJCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfTEVOOworCQkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJVSUxfRVJSX0xFTlxuIiApOworCQkJCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisKKwkJCQkvKiBJZiB0aGUgcmVxdWVzdGVkIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gdGhlIHNpemUgb2Ygb3VyIGxvY2FsCisJCQkJICAgTFRWIHJlY29yZCwgdHJ5IHRvIGFsbG9jYXRlIGl0IGZyb20gdGhlIGtlcm5lbCBzdGFjay4KKwkJCQkgICBPdGhlcndpc2UsIHdlIGp1c3QgdXNlIG91ciBsb2NhbCBMVFYgcmVjb3JkLiAqLworCQkJCWlmKCB1cnEtPmxlbiA+IHNpemVvZiggbHAtPmx0dlJlY29yZCApKSB7CisJCQkJCWlmKCggcEx0diA9IChsdHZfdCAqKWttYWxsb2MoIHVycS0+bGVuLCBHRlBfS0VSTkVMICkpICE9IE5VTEwgKSB7CisJCQkJCQlsdHZBbGxvY2F0ZWQgPSBUUlVFOworCQkJCQl9IGVsc2UgeworCQkJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiQWxsb2MgRkFJTEVEXG4iICk7CisJCQkJCQl1cnEtPmxlbiA9IHNpemVvZiggbHAtPmx0dlJlY29yZCApOworCQkJCQkJdXJxLT5yZXN1bHQgPSBVSUxfRVJSX0xFTjsKKwkJCQkJCXJlc3VsdCA9IC1FTk9NRU07CisJCQkJCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlwTHR2ID0gJiggbHAtPmx0dlJlY29yZCApOworCQkJCX0KKworCQkJCS8qIENvcHkgdGhlIGRhdGEgZnJvbSB0aGUgdXNlcidzIGJ1ZmZlciBpbnRvIHRoZSBsb2NhbCBMVFYKKwkJCQkgICByZWNvcmQgZGF0YSBhcmVhLiAqLworCQkJCWNvcHlfZnJvbV91c2VyKCBwTHR2LCB1cnEtPmRhdGEsIHVycS0+bGVuICk7CisKKworCQkJCS8qIFdlIG5lZWQgdG8gc25vb3AgdGhlIGNvbW1hbmRzIHRvIHNlZSBpZiB0aGVyZSBpcyBhbnl0aGluZyB3ZQorCQkJCSAgIG5lZWQgdG8gc3RvcmUgZm9yIHRoZSBwdXJwb3NlcyBvZiBhIHJlc2V0IG9yIHN0YXJ0L3N0b3AKKwkJCQkgICBzZXF1ZW5jZS4gUGVyZm9ybSBlbmRpYW4gdHJhbnNsYXRpb24gYXMgbmVlZGVkICovCisJCQkJc3dpdGNoKCBwTHR2LT50eXAgKSB7CisJCQkJY2FzZSBDRkdfQ05GX1BPUlRfVFlQRToKKwkJCQkJbHAtPlBvcnRUeXBlICAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19DTkZfT1dOX01BQ19BRERSOgorCQkJCQkvKiBUT0RPOiBkZXRlcm1pbmUgaWYgd2UgYXJlIGdvaW5nIHRvIHN0b3JlIGFueXRoaW5nIGJhc2VkIG9uIHRoaXMgKi8KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfQ05GX09XTl9DSEFOTkVMOgorCQkJCQlscC0+Q2hhbm5lbCAgICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworCQkJCS8qIENGR19DTkZfT1dOX1NTSUQgY3VycmVudGx5IHNhbWUgYXMgQ05GX0RFU0lSRURfU1NJRC4gRG8gd2UKKwkJCQkgICBuZWVkIHNlcGVyYXRlIHN0b3JhZ2UgZm9yIHRoaXM/ICovCisJCQkJLy9jYXNlIENGR19DTkZfT1dOX1NTSUQ6CisJCQkJY2FzZSBDRkdfQ05GX09XTl9BVElNX1dJTkRPVzoKKwkJCQkJbHAtPmF0aW1XaW5kb3cgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19DTkZfU1lTVEVNX1NDQUxFOgorCQkJCQlscC0+RGlzdGFuY2VCZXR3ZWVuQVBzICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCisJCQkJY2FzZSBDRkdfQ05GX01BWF9EQVRBX0xFTjoKKwkJCQkJLyogVE9ETzogZGV0ZXJtaW5lIGlmIHdlIGFyZSBnb2luZyB0byBzdG9yZSBhbnl0aGluZyBiYXNlZAorCQkJCQkgICBvbiB0aGlzICovCisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX0NORl9QTV9FTkFCTEVEOgorCQkJCQlscC0+UE1FbmFibGVkICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX0NORl9NQ0FTVF9SWDoKKwkJCQkJbHAtPk11bHRpY2FzdFJlY2VpdmUgICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfQ05GX01BWF9TTEVFUF9EVVJBVElPTjoKKwkJCQkJbHAtPk1heFNsZWVwRHVyYXRpb24gICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfQ05GX0hPTERPVkVSX0RVUkFUSU9OOgorCQkJCQlscC0+aG9sZG92ZXJEdXJhdGlvbiAgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19DTkZfT1dOX05BTUU6CisJCQkJCW1lbXNldCggbHAtPlN0YXRpb25OYW1lLCAwLCBzaXplb2YoIGxwLT5TdGF0aW9uTmFtZSApKTsKKwkJCQkJbWVtY3B5KCAodm9pZCAqKWxwLT5TdGF0aW9uTmFtZSwgKHZvaWQgKikmcEx0di0+dS51OFsyXSwgKHNpemVfdClwTHR2LT51LnUxNlswXSk7CisJCQkJCXBMdHYtPnUudTE2WzBdID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX0NORl9MT0FEX0JBTEFOQ0lORzoKKwkJCQkJbHAtPmxvYWRCYWxhbmNpbmcgICAgICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfQ05GX01FRElVTV9ESVNUUklCVVRJT046CisJCQkJCWxwLT5tZWRpdW1EaXN0cmlidXRpb24gID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworI2lmZGVmIFdBUlAKKwkJCQljYXNlIENGR19DTkZfVFhfUE9XX0xWTDoKKwkJCQkJbHAtPnR4UG93TGV2ZWwgICAgICAgICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisJCQkJLy9jYXNlIENGR19DTkZfU0hPUlRfUkVUUllfTElNSVQ6ICAgIC8vIFNob3J0IFJldHJ5IExpbWl0CisJCQkJLy9jYXNlIDB4RkMzMzogICAgLy8gTG9uZyBSZXRyeSBMaW1pdAorCQkJCWNhc2UgQ0ZHX1NVUFBPUlRFRF9SQVRFX1NFVF9DTlRMOiAgICAgICAgLy8gU3VwcG9ydGVkIFJhdGUgU2V0IENvbnRyb2wKKwkJCQkJbHAtPnNyc2NbMF0gICAgICAgICAgICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJbHAtPnNyc2NbMV0gICAgICAgICAgICAgPSBwTHR2LT51LnUxNlsxXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJcEx0di0+dS51MTZbMV0gICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMV0gKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfQkFTSUNfUkFURV9TRVRfQ05UTDogICAgICAgIC8vIEJhc2ljIFJhdGUgU2V0IENvbnRyb2wKKwkJCQkJbHAtPmJyc2NbMF0gICAgICAgICAgICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJbHAtPmJyc2NbMV0gICAgICAgICAgICAgPSBwTHR2LT51LnUxNlsxXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJcEx0di0+dS51MTZbMV0gICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMV0gKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfQ05GX0NPTk5FQ1RJT05fQ05UTDoKKwkJCQkJbHAtPmNvbm5lY3Rpb25Db250cm9sICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisJCQkJLy9jYXNlIENGR19QUk9CRV9EQVRBX1JBVEU6CisjZW5kaWYgIC8vIEhFUk1FUzI1CisKKyNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCisJCS8vOz9zaG91bGQgd2UgcmVzdG9yZSB0aGlzIHRvIGFsbG93IHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludAorCisJCQkJY2FzZSBDRkdfQ05GX09XTl9EVElNX1BFUklPRDoKKwkJCQkJbHAtPkRUSU1QZXJpb2QgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKyNpZmRlZiBXQVJQCisJCQkJY2FzZSBDRkdfQ05GX09XTl9CRUFDT05fSU5URVJWQUw6ICAgICAgICAvLyBPd24gQmVhY29uIEludGVydmFsCisJCQkJCWxwLT5vd25CZWFjb25JbnRlcnZhbCAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworI2VuZGlmIC8vIFdBUlAKKwkJCQljYXNlIENGR19DT0VYSVNURU5TRV9CRUhBVklPVVI6ICAgICAgICAgLy8gQ29leGlzdGVuY2UgYmVoYXZpb3IKKwkJCQkJbHAtPmNvZXhpc3RlbmNlICAgICAgICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisjaWZkZWYgVVNFX1dEUworCQkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjE6CisJCQkJCW1lbWNweSggJmxwLT53ZHNfcG9ydFswXS53ZHNBZGRyZXNzLCAmcEx0di0+dS51OFswXSwgRVRIX0FMRU4gKTsKKwkJCQkJaGNmUG9ydCA9IEhDRl9QT1JUXzE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjI6CisJCQkJCW1lbWNweSggJmxwLT53ZHNfcG9ydFsxXS53ZHNBZGRyZXNzLCAmcEx0di0+dS51OFswXSwgRVRIX0FMRU4gKTsKKwkJCQkJaGNmUG9ydCA9IEhDRl9QT1JUXzI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjM6CisJCQkJCW1lbWNweSggJmxwLT53ZHNfcG9ydFsyXS53ZHNBZGRyZXNzLCAmcEx0di0+dS51OFswXSwgRVRIX0FMRU4gKTsKKwkJCQkJaGNmUG9ydCA9IEhDRl9QT1JUXzM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjQ6CisJCQkJCW1lbWNweSggJmxwLT53ZHNfcG9ydFszXS53ZHNBZGRyZXNzLCAmcEx0di0+dS51OFswXSwgRVRIX0FMRU4gKTsKKwkJCQkJaGNmUG9ydCA9IEhDRl9QT1JUXzQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjU6CisJCQkJCW1lbWNweSggJmxwLT53ZHNfcG9ydFs0XS53ZHNBZGRyZXNzLCAmcEx0di0+dS51OFswXSwgRVRIX0FMRU4gKTsKKwkJCQkJaGNmUG9ydCA9IEhDRl9QT1JUXzU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjY6CisJCQkJCW1lbWNweSggJmxwLT53ZHNfcG9ydFs1XS53ZHNBZGRyZXNzLCAmcEx0di0+dS51OFswXSwgRVRIX0FMRU4gKTsKKwkJCQkJaGNmUG9ydCA9IEhDRl9QT1JUXzY7CisJCQkJCWJyZWFrOworI2VuZGlmICAvKiBVU0VfV0RTICovCisKKwkJCQljYXNlIENGR19DTkZfTUNBU1RfUE1fQlVGOgorCQkJCQlscC0+bXVsdGljYXN0UE1CdWZmZXJpbmcgICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX0NORl9SRUpFQ1RfQU5ZOgorCQkJCQlscC0+UmVqZWN0QW55ICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworI2VuZGlmCisKKwkJCQljYXNlIENGR19DTkZfRU5DUllQVElPTjoKKwkJCQkJbHAtPkVuYWJsZUVuY3J5cHRpb24gICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfQ05GX0FVVEhFTlRJQ0FUSU9OOgorCQkJCQlscC0+YXV0aGVudGljYXRpb24gID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisjaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAorCQkvLzs/c2hvdWxkIHdlIHJlc3RvcmUgdGhpcyB0byBhbGxvdyBzbWFsbGVyIG1lbW9yeSBmb290cHJpbnQKKworCQkJCS8vY2FzZSBDRkdfQ05GX0VYQ0xfVU5FTkNSWVBURUQ6CisJCQkJCS8vbHAtPkV4Y2x1ZGVVbmVuY3J5cHRlZCAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJLy9wTHR2LT51LnUxNlswXSAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQkvL2JyZWFrOworCQkJCWNhc2UgQ0ZHX0NORl9NQ0FTVF9SQVRFOgorCQkJCQkvKiBUT0RPOiBkZXRlcm1pbmUgaWYgd2UgYXJlIGdvaW5nIHRvIHN0b3JlIGFueXRoaW5nIGJhc2VkIG9uIHRoaXMgKi8KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfQ05GX0lOVFJBX0JTU19SRUxBWToKKwkJCQkJbHAtPmludHJhQlNTUmVsYXkgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworI2VuZGlmCisKKwkJCQljYXNlIENGR19DTkZfTUlDUk9fV0FWRToKKwkJCQkJLyogVE9ETzogZGV0ZXJtaW5lIGlmIHdlIGFyZSBnb2luZyB0byBzdG9yZSBhbnl0aGluZyBiYXNlZCBvbiB0aGlzICovCisJCQkJCWJyZWFrOworCQkJCS8vY2FzZSBDRkdfQ05GX0xPQURfQkFMQU5DSU5HOgorCQkJCQkvKiBUT0RPOiBkZXRlcm1pbmUgaWYgd2UgYXJlIGdvaW5nIHRvIHN0b3JlIGFueXRoaW5nIGJhc2VkIG9uIHRoaXMgKi8KKwkJCQkJLy9icmVhazsKKwkJCQkvL2Nhc2UgQ0ZHX0NORl9NRURJVU1fRElTVFJJQlVUSU9OOgorCQkJCQkvKiBUT0RPOiBkZXRlcm1pbmUgaWYgd2UgYXJlIGdvaW5nIHRvIHN0b3JlIGFueXRoaW5nIGJhc2VkIG9uIHRoaXMgKi8KKwkJCQkJLy9icmVhazsKKwkJCQkvL2Nhc2UgQ0ZHX0NORl9SWF9BTExfR1JPVVBfQUREUkVTUzoKKwkJCQkJLy8gVE9ETzogZGV0ZXJtaW5lIGlmIHdlIGFyZSBnb2luZyB0byBzdG9yZSBhbnl0aGluZyBiYXNlZCBvbiB0aGlzCisJCQkJCS8vYnJlYWs7CisJCQkJLy9jYXNlIENGR19DTkZfQ09VTlRSWV9JTkZPOgorCQkJCQkvKiBUT0RPOiBkZXRlcm1pbmUgaWYgd2UgYXJlIGdvaW5nIHRvIHN0b3JlIGFueXRoaW5nIGJhc2VkIG9uIHRoaXMgKi8KKwkJCQkJLy9icmVhazsKKwkJCQljYXNlIENGR19DTkZfT1dOX1NTSUQ6CisJCQkJLy9jYXNlIENORl9ERVNJUkVEX1NTSUQ6CisJCQkJY2FzZSBDRkdfREVTSVJFRF9TU0lEOgorCQkJCQltZW1zZXQoIGxwLT5OZXR3b3JrTmFtZSwgMCwgc2l6ZW9mKCBscC0+TmV0d29ya05hbWUgKSk7CisJCQkJCW1lbWNweSggKHZvaWQgKilscC0+TmV0d29ya05hbWUsICh2b2lkICopJnBMdHYtPnUudThbMl0sIChzaXplX3QpcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJcEx0di0+dS51MTZbMF0gPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKworCQkJCQkvKiB0YWtlIGNhcmUgb2YgdGhlIHNwZWNpYWwgbmV0d29yayBuYW1lICJBTlkiIGNhc2UgKi8KKwkJCQkJaWYoKCBzdHJsZW4oICZwTHR2LT51LnU4WzJdICAgICAgICApID09IDAgKSB8fAorCQkJCQkgICAoIHN0cmNtcCggJnBMdHYtPnUudThbMl0sICJBTlkiICkgPT0gMCApIHx8CisJCQkJCSAgICggc3RyY21wKCAmcEx0di0+dS51OFsyXSwgImFueSIgKSA9PSAwICkpIHsKKwkJCQkJCS8qIHNldCB0aGUgU1NJRF9TVFJDVCBsbGVuIGZpZWxkICh1MTZbMF0pIHRvIHplcm8sIGFuZCB0aGUKKwkJCQkJCWVmZmVjdHVhbGx5IG51bGwgdGhlIHN0cmluZyB1OFsyXSAqLworCQkJCQkJcEx0di0+dS51MTZbMF0gPSAwOworCQkJCQkJcEx0di0+dS51OFsyXSAgPSAwOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX0dST1VQX0FERFI6CisJCQkJCS8qIFRPRE86IGRldGVybWluZSBpZiB3ZSBhcmUgZ29pbmcgdG8gc3RvcmUgYW55dGhpbmcgYmFzZWQgb24gdGhpcyAqLworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19DUkVBVEVfSUJTUzoKKwkJCQkJbHAtPkNyZWF0ZUlCU1MgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19SVFNfVEhSSDoKKwkJCQkJbHAtPlJUU1RocmVzaG9sZCAgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX1RYX1JBVEVfQ05UTDoKKwkJCQkJbHAtPlR4UmF0ZUNvbnRyb2xbMF0gICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJbHAtPlR4UmF0ZUNvbnRyb2xbMV0gICAgPSBwTHR2LT51LnUxNlsxXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJcEx0di0+dS51MTZbMV0gICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMV0gKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfUFJPTUlTQ1VPVVNfTU9ERToKKwkJCQkJLyogVE9ETzogZGV0ZXJtaW5lIGlmIHdlIGFyZSBnb2luZyB0byBzdG9yZSBhbnl0aGluZyBiYXNlZCBvbiB0aGlzICovCisJCQkJCWJyZWFrOworCQkJCS8vY2FzZSBDRkdfV0FLRV9PTl9MQU46CisJCQkJCS8qIFRPRE86IGRldGVybWluZSBpZiB3ZSBhcmUgZ29pbmcgdG8gc3RvcmUgYW55dGhpbmcgYmFzZWQgb24gdGhpcyAqLworCQkJCQkvL2JyZWFrOworI2lmIDEgLy87PyAjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCisJCS8vOz9zaG91bGQgd2UgcmVzdG9yZSB0aGlzIHRvIGFsbG93IHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludAorCQkJCWNhc2UgQ0ZHX1JUU19USFJIMDoKKwkJCQkJbHAtPlJUU1RocmVzaG9sZCAgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX1RYX1JBVEVfQ05UTDA6CisvLzs/bm8gaWRlYSB3aGF0IHRoaXMgc2hvdWxkIGJlLCBnZXQgZ29pbmcgc28gY29tbWVudCBpdCBvdXQJCQkJCWxwLT5UeFJhdGVDb250cm9sICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKyNpZmRlZiBVU0VfV0RTCisJCQkJY2FzZSBDRkdfUlRTX1RIUkgxOgorCQkJCQlscC0+d2RzX3BvcnRbMF0ucnRzVGhyZXNob2xkICAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJaGNmUG9ydCAgICAgICAgICAgICAgICAgICAgICAgICA9IEhDRl9QT1JUXzE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX1JUU19USFJIMjoKKwkJCQkJbHAtPndkc19wb3J0WzFdLnJ0c1RocmVzaG9sZCAgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWhjZlBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgPSBIQ0ZfUE9SVF8yOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19SVFNfVEhSSDM6CisJCQkJCWxwLT53ZHNfcG9ydFsyXS5ydHNUaHJlc2hvbGQgICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQloY2ZQb3J0ICAgICAgICAgICAgICAgICAgICAgICAgID0gSENGX1BPUlRfMzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfUlRTX1RIUkg0OgorCQkJCQlscC0+d2RzX3BvcnRbM10ucnRzVGhyZXNob2xkICAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJaGNmUG9ydCAgICAgICAgICAgICAgICAgICAgICAgICA9IEhDRl9QT1JUXzQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX1JUU19USFJINToKKwkJCQkJbHAtPndkc19wb3J0WzRdLnJ0c1RocmVzaG9sZCAgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWhjZlBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgPSBIQ0ZfUE9SVF81OworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19SVFNfVEhSSDY6CisJCQkJCWxwLT53ZHNfcG9ydFs1XS5ydHNUaHJlc2hvbGQgICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQloY2ZQb3J0ICAgICAgICAgICAgICAgICAgICAgICAgID0gSENGX1BPUlRfNjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfVFhfUkFURV9DTlRMMToKKwkJCQkJbHAtPndkc19wb3J0WzBdLnR4UmF0ZUNudGwgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQloY2ZQb3J0ICAgICAgICAgICAgICAgICAgICAgPSBIQ0ZfUE9SVF8xOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19UWF9SQVRFX0NOVEwyOgorCQkJCQlscC0+d2RzX3BvcnRbMV0udHhSYXRlQ250bCAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWhjZlBvcnQgICAgICAgICAgICAgICAgICAgICA9IEhDRl9QT1JUXzI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX1RYX1JBVEVfQ05UTDM6CisJCQkJCWxwLT53ZHNfcG9ydFsyXS50eFJhdGVDbnRsICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJaGNmUG9ydCAgICAgICAgICAgICAgICAgICAgID0gSENGX1BPUlRfMzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfVFhfUkFURV9DTlRMNDoKKwkJCQkJbHAtPndkc19wb3J0WzNdLnR4UmF0ZUNudGwgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQloY2ZQb3J0ICAgICAgICAgICAgICAgICAgICAgPSBIQ0ZfUE9SVF80OworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19UWF9SQVRFX0NOVEw1OgorCQkJCQlscC0+d2RzX3BvcnRbNF0udHhSYXRlQ250bCAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWhjZlBvcnQgICAgICAgICAgICAgICAgICAgICA9IEhDRl9QT1JUXzU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX1RYX1JBVEVfQ05UTDY6CisJCQkJCWxwLT53ZHNfcG9ydFs1XS50eFJhdGVDbnRsICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJaGNmUG9ydCAgICAgICAgICAgICAgICAgICAgID0gSENGX1BPUlRfNjsKKwkJCQkJYnJlYWs7CisjZW5kaWYgIC8qIFVTRV9XRFMgKi8KKyNlbmRpZiAgLyogKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQICovCisKKwkJCQljYXNlIENGR19ERUZBVUxUX0tFWVM6CisJCQkJCXsKKwkJCQkJCUNGR19ERUZBVUxUX0tFWVNfU1RSQ1QgKnBLZXlzID0gKENGR19ERUZBVUxUX0tFWVNfU1RSQ1QgKilwTHR2OworCisJCQkJCQlwS2V5cy0+a2V5WzBdLmxlbiA9IENOVl9JTlRfVE9fTElUVExFKCBwS2V5cy0+a2V5WzBdLmxlbiApOworCQkJCQkJcEtleXMtPmtleVsxXS5sZW4gPSBDTlZfSU5UX1RPX0xJVFRMRSggcEtleXMtPmtleVsxXS5sZW4gKTsKKwkJCQkJCXBLZXlzLT5rZXlbMl0ubGVuID0gQ05WX0lOVF9UT19MSVRUTEUoIHBLZXlzLT5rZXlbMl0ubGVuICk7CisJCQkJCQlwS2V5cy0+a2V5WzNdLmxlbiA9IENOVl9JTlRfVE9fTElUVExFKCBwS2V5cy0+a2V5WzNdLmxlbiApOworCisJCQkJCQltZW1jcHkoICh2b2lkICopJihscC0+RGVmYXVsdEtleXMpLCAodm9pZCAqKXBLZXlzLAorCQkJCQkJCQlzaXplb2YoIENGR19ERUZBVUxUX0tFWVNfU1RSQ1QgKSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfVFhfS0VZX0lEOgorCQkJCQlscC0+VHJhbnNtaXRLZXlJRCAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfU0NBTl9TU0lEOgorCQkJCQkvKiBUT0RPOiBkZXRlcm1pbmUgaWYgd2UgYXJlIGdvaW5nIHRvIHN0b3JlIGFueXRoaW5nIGJhc2VkIG9uIHRoaXMgKi8KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfVElDS19USU1FOgorCQkJCQkvKiBUT0RPOiBkZXRlcm1pbmUgaWYgd2UgYXJlIGdvaW5nIHRvIHN0b3JlIGFueXRoaW5nIGJhc2VkIG9uIHRoaXMgKi8KKwkJCQkJYnJlYWs7CisJCQkJLyogdGhlc2UgUklEUyBhcmUgSW5mbyBSSURzLCBhbmQgc2hvdWxkIHRoZXkgYmUgYWxsb3dlZCBmb3IgcHV0cz8/PyAqLworCQkJCWNhc2UgQ0ZHX01BWF9MT0FEX1RJTUU6CisJCQkJY2FzZSBDRkdfRExfQlVGOgorCQkJCS8vY2FzZSBDRkdfSFNJX1NVUF9SQU5HRToKKwkJCQljYXNlIENGR19OSUNfU0VSSUFMX05VTUJFUjoKKwkJCQljYXNlIENGR19OSUNfSURFTlRJVFk6CisJCQkJY2FzZSBDRkdfTklDX01GSV9TVVBfUkFOR0U6CisJCQkJY2FzZSBDRkdfTklDX0NGSV9TVVBfUkFOR0U6CisJCQkJY2FzZSBDRkdfTklDX1RFTVBfVFlQRToKKwkJCQljYXNlIENGR19OSUNfUFJPRklMRToKKwkJCQljYXNlIENGR19GV19JREVOVElUWToKKwkJCQljYXNlIENGR19GV19TVVBfUkFOR0U6CisJCQkJY2FzZSBDRkdfTUZJX0FDVF9SQU5HRVNfU1RBOgorCQkJCWNhc2UgQ0ZHX0NGSV9BQ1RfUkFOR0VTX1NUQToKKwkJCQljYXNlIENGR19QT1JUX1NUQVQ6CisJCQkJY2FzZSBDRkdfQ1VSX1NTSUQ6CisJCQkJY2FzZSBDRkdfQ1VSX0JTU0lEOgorCQkJCWNhc2UgQ0ZHX0NPTU1TX1FVQUxJVFk6CisJCQkJY2FzZSBDRkdfQ1VSX1RYX1JBVEU6CisJCQkJY2FzZSBDRkdfQ1VSX0JFQUNPTl9JTlRFUlZBTDoKKwkJCQljYXNlIENGR19DVVJfU0NBTEVfVEhSSDoKKwkJCQljYXNlIENGR19QUk9UT0NPTF9SU1BfVElNRToKKwkJCQljYXNlIENGR19DVVJfU0hPUlRfUkVUUllfTElNSVQ6CisJCQkJY2FzZSBDRkdfQ1VSX0xPTkdfUkVUUllfTElNSVQ6CisJCQkJY2FzZSBDRkdfTUFYX1RYX0xJRkVUSU1FOgorCQkJCWNhc2UgQ0ZHX01BWF9SWF9MSUZFVElNRToKKwkJCQljYXNlIENGR19DRl9QT0xMQUJMRToKKwkJCQljYXNlIENGR19BVVRIRU5USUNBVElPTl9BTEdPUklUSE1TOgorCQkJCWNhc2UgQ0ZHX1BSSVZBQ1lfT1BUX0lNUExFTUVOVEVEOgorCQkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9SRU1PVEVfUkFURVM6CisJCQkJLy9jYXNlIENGR19DVVJSRU5UX1VTRURfUkFURVM6CisJCQkJLy9jYXNlIENGR19DVVJSRU5UX1NZU1RFTV9TQ0FMRToKKwkJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfVFhfUkFURTE6CisJCQkJLy9jYXNlIENGR19DVVJSRU5UX1RYX1JBVEUyOgorCQkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9UWF9SQVRFMzoKKwkJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfVFhfUkFURTQ6CisJCQkJLy9jYXNlIENGR19DVVJSRU5UX1RYX1JBVEU1OgorCQkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9UWF9SQVRFNjoKKwkJCQljYXNlIENGR19OSUNfTUFDX0FERFI6CisJCQkJY2FzZSBDRkdfUENGX0lORk86CisJCQkJLy9jYXNlIENGR19DVVJSRU5UX0NPVU5UUllfSU5GTzoKKwkJCQljYXNlIENGR19QSFlfVFlQRToKKwkJCQljYXNlIENGR19DVVJfQ0hBTk5FTDoKKwkJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfUE9XRVJfU1RBVEU6CisJCQkJLy9jYXNlIENGR19DQ0FNT0RFOgorCQkJCWNhc2UgQ0ZHX1NVUFBPUlRFRF9EQVRBX1JBVEVTOgorCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19BUF9NT0RFOgorLy87PwkJCQlscC0+RG93bmxvYWRGaXJtd2FyZSA9ICggcEx0di0+dS51MTZbMF0gKSArIDE7CisJCQkJCURCR19FUlJPUiggRGJnSW5mbywgInNldCBDRkdfQVBfTU9ERSBubyBsb25nZXIgc3VwcG9ydGVkXG4iICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX0VOQ1JZUFRfU1RSSU5HOgorCQkJCQkvKiBUT0RPOiBFTkRJQU4gVFJBTlNMQVRJT04gSEVSRT8/PyAqLworCQkJCQltZW1zZXQoIGxwLT5zekVuY3J5cHRpb24sIDAsIHNpemVvZiggbHAtPnN6RW5jcnlwdGlvbiApKTsKKwkJCQkJbWVtY3B5KCAodm9pZCAqKWxwLT5zekVuY3J5cHRpb24sICAodm9pZCAqKSZwTHR2LT51LnU4WzBdLAorCQkJCQkJCSggcEx0di0+bGVuICogc2l6ZW9mKCBoY2ZfMTYgKSkgKTsKKwkJCQkJd2xfd2VwX2RlY29kZSggQ1JZUFRfQ09ERSwgJnNFbmNyeXB0aW9uLAorCQkJCQkJCQkgICAgbHAtPnN6RW5jcnlwdGlvbiApOworCisJCQkJCS8qIHRoZSBMaW51eCBkcml2ZXIgbGlrZXMgdG8gdXNlIDEtNCBmb3IgdGhlIGtleSBJRHMsIGFuZCB0aGVuCisJCQkJCWNvbnZlcnQgdG8gMC0zIHdoZW4gc2VuZGluZyB0byB0aGUgY2FyZC4gIFRoZSBXaW5kb3dzIGNvZGUKKwkJCQkJYmFzZSB1c2VkIDAtMyBpbiB0aGUgQVBJIERMTCwgd2hpY2ggd2FzIHBvcnRlZCB0byBMaW51eC4gIEZvcgorCQkJCQl0aGUgc2FrZSBvZiB0aGUgdXNlciBleHBlcmllbmNlLCB3ZSBkZWNpZGVkIHRvIGtlZXAgMC0zIGFzIHRoZQorCQkJCQludW1iZXJzIHVzZWQgaW4gdGhlIERMTDsgYW5kIHdpbGwgcGVyZm9ybSB0aGUgKzEgY29udmVyc2lvbiBoZXJlLgorCQkJCQlXZSBjb3VsZCBoYXZlIGNvbnZlcnRlZCAgdGhlIGVudGlyZSBMaW51eCBkcml2ZXIsIGJ1dCB0aGlzIGlzCisJCQkJCWxlc3Mgb2J0cnVzaXZlLiAgVGhpcyBtYXkgYmUgYSAidG9kbyIgdG8gY29udmVydCB0aGUgd2hvbGUgZHJpdmVyICovCisJCQkJCWxwLT5UcmFuc21pdEtleUlEICAgID0gc0VuY3J5cHRpb24ud1R4S2V5SUQgKyAxOworCQkJCQlscC0+RW5hYmxlRW5jcnlwdGlvbiA9IHNFbmNyeXB0aW9uLndFbmFibGVkOworCisJCQkJCW1lbWNweSggJmxwLT5EZWZhdWx0S2V5cywgJnNFbmNyeXB0aW9uLkVuY1N0ciwKKwkJCQkJCQlzaXplb2YoIENGR19ERUZBVUxUX0tFWVNfU1RSQ1QgKSk7CisJCQkJCWJyZWFrOworCQkJCS8qY2FzZSBDRkdfQ09VTlRSWV9TVFJJTkc6CisJCQkJCW1lbXNldCggbHAtPmNvdW50cnlTdHJpbmcsIDAsIHNpemVvZiggbHAtPmNvdW50cnlTdHJpbmcgKSk7CisJCQkJCW1lbWNweSggKHZvaWQgKilscC0+Y291bnRyeVN0cmluZywgKHZvaWQgKikmcEx0di0+dS51OFsyXSwgKHNpemVfdClwTHR2LT51LnUxNlswXSk7CisJCQkJCWJyZWFrOworCQkJCSovCisKKwkJCQljYXNlIENGR19EUklWRVJfRU5BQkxFOgorCQkJCQlscC0+ZHJpdmVyRW5hYmxlICAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfV09MQVNfRU5BQkxFOgorCQkJCQlscC0+d29sYXNFbmFibGUgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX1NFVF9XUEFfQVVUSF9LRVlfTUdNVF9TVUlURToKKwkJCQkJbHAtPkF1dGhLZXlNZ210U3VpdGUgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX0RJU0FTU09DSUFURV9BRERSOgorCQkJCQlwTHR2LT51LnUxNltFVEhfQUxFTiAvIDJdID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2W0VUSF9BTEVOIC8gMl0gKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfQUREX1RLSVBfREVGQVVMVF9LRVk6CisJCQkJY2FzZSBDRkdfUkVNT1ZFX1RLSVBfREVGQVVMVF9LRVk6CisJCQkJCS8qIEVuZGlhbiBjb252ZXJ0IHRoZSBUeCBLZXkgSW5mb3JtYXRpb24gKi8KKwkJCQkJcEx0di0+dS51MTZbMF0gPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfQUREX1RLSVBfTUFQUEVEX0tFWToKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfUkVNT1ZFX1RLSVBfTUFQUEVEX0tFWToKKwkJCQkJYnJlYWs7CisJCQkJLyogc29tZSBSSURzIGp1c3QgY2FuJ3QgYmUgcHV0ICovCisJCQkJY2FzZSBDRkdfTUJfSU5GTzoKKwkJCQljYXNlIENGR19JRkI6CisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyogVGhpcyBjb2RlIHdpbGwgcHJldmVudCBTdGF0aWMgQ29uZmlndXJhdGlvbiBFbnRpdGllcyBmcm9tCisJCQkJICAgYmVpbmcgc2VudCB0byB0aGUgY2FyZCwgYXMgdGhleSByZXF1aXJlIGEgY2FsbCB0bworCQkJCSAgIFVJTF9BQ1RfQVBQTFkgdG8gdGFrZSBlZmZlY3QuIER5bmFtaWMgRW50aXRpZXMgd2lsbCBiZSBzZW50CisJCQkJICAgaW1tZWRpYXRlbHkgKi8KKwkJCQlzd2l0Y2goIHBMdHYtPnR5cCApIHsKKwkJCQljYXNlIENGR19DTkZfUE9SVF9UWVBFOgorCQkJCWNhc2UgQ0ZHX0NORl9PV05fTUFDX0FERFI6CisJCQkJY2FzZSBDRkdfQ05GX09XTl9DSEFOTkVMOgorCQkJCWNhc2UgQ0ZHX0NORl9PV05fU1NJRDoKKwkJCQljYXNlIENGR19DTkZfT1dOX0FUSU1fV0lORE9XOgorCQkJCWNhc2UgQ0ZHX0NORl9TWVNURU1fU0NBTEU6CisJCQkJY2FzZSBDRkdfQ05GX01BWF9EQVRBX0xFTjoKKwkJCQljYXNlIENGR19DTkZfUE1fRU5BQkxFRDoKKwkJCQljYXNlIENGR19DTkZfTUNBU1RfUlg6CisJCQkJY2FzZSBDRkdfQ05GX01BWF9TTEVFUF9EVVJBVElPTjoKKwkJCQljYXNlIENGR19DTkZfSE9MRE9WRVJfRFVSQVRJT046CisJCQkJY2FzZSBDRkdfQ05GX09XTl9OQU1FOgorCQkJCWNhc2UgQ0ZHX0NORl9MT0FEX0JBTEFOQ0lORzoKKwkJCQljYXNlIENGR19DTkZfTUVESVVNX0RJU1RSSUJVVElPTjoKKyNpZmRlZiBXQVJQCisJCQkJY2FzZSBDRkdfQ05GX1RYX1BPV19MVkw6CisJCQkJY2FzZSBDRkdfQ05GX0NPTk5FQ1RJT05fQ05UTDoKKwkJCQkvL2Nhc2UgQ0ZHX1BST0JFX0RBVEFfUkFURToKKyNlbmRpZiAvLyBIRVJNRVMyNQorI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAKKwkJLy87P3Nob3VsZCB3ZSByZXN0b3JlIHRoaXMgdG8gYWxsb3cgc21hbGxlciBtZW1vcnkgZm9vdHByaW50CisJCQkJY2FzZSBDRkdfQ05GX09XTl9EVElNX1BFUklPRDoKKyNpZmRlZiBXQVJQCisJCQkJY2FzZSBDRkdfQ05GX09XTl9CRUFDT05fSU5URVJWQUw6ICAgICAgICAgICAgICAgICAgICAvLyBPd24gQmVhY29uIEludGVydmFsCisjZW5kaWYgLy8gV0FSUAorI2lmZGVmIFVTRV9XRFMKKwkJCQljYXNlIENGR19DTkZfV0RTX0FERFIxOgorCQkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjI6CisJCQkJY2FzZSBDRkdfQ05GX1dEU19BRERSMzoKKwkJCQljYXNlIENGR19DTkZfV0RTX0FERFI0OgorCQkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjU6CisJCQkJY2FzZSBDRkdfQ05GX1dEU19BRERSNjoKKyNlbmRpZgorCQkJCWNhc2UgQ0ZHX0NORl9NQ0FTVF9QTV9CVUY6CisJCQkJY2FzZSBDRkdfQ05GX1JFSkVDVF9BTlk6CisjZW5kaWYKKworCQkJCWNhc2UgQ0ZHX0NORl9FTkNSWVBUSU9OOgorCQkJCWNhc2UgQ0ZHX0NORl9BVVRIRU5USUNBVElPTjoKKyNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCisJCS8vOz9zaG91bGQgd2UgcmVzdG9yZSB0aGlzIHRvIGFsbG93IHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludAorCisJCQkJY2FzZSBDRkdfQ05GX0VYQ0xfVU5FTkNSWVBURUQ6CisJCQkJY2FzZSBDRkdfQ05GX01DQVNUX1JBVEU6CisJCQkJY2FzZSBDRkdfQ05GX0lOVFJBX0JTU19SRUxBWToKKyNlbmRpZgorCisJCQkJY2FzZSBDRkdfQ05GX01JQ1JPX1dBVkU6CisJCQkJLy9jYXNlIENGR19DTkZfTE9BRF9CQUxBTkNJTkc6CisJCQkJLy9jYXNlIENGR19DTkZfTUVESVVNX0RJU1RSSUJVVElPTjoKKwkJCQkvL2Nhc2UgQ0ZHX0NORl9SWF9BTExfR1JPVVBfQUREUkVTUzoKKwkJCQkvL2Nhc2UgQ0ZHX0NORl9DT1VOVFJZX0lORk86CisJCQkJLy9jYXNlIENGR19DT1VOVFJZX1NUUklORzoKKwkJCQljYXNlIENGR19BUF9NT0RFOgorCQkJCWNhc2UgQ0ZHX0VOQ1JZUFRfU1RSSU5HOgorCQkJCS8vY2FzZSBDRkdfRFJJVkVSX0VOQUJMRToKKwkJCQljYXNlIENGR19XT0xBU19FTkFCTEU6CisJCQkJY2FzZSBDRkdfTUJfSU5GTzoKKwkJCQljYXNlIENGR19JRkI6CisJCQkJCWJyZWFrOworCQkJCS8qIERlYWwgd2l0aCB0aGlzIGR5bmFtaWMgTVNGIFJJRCwgYXMgaXQncyByZXF1aXJlZCBmb3IgV1BBICovCisJCQkJY2FzZSBDRkdfRFJJVkVSX0VOQUJMRToKKwkJCQkJaWYoIGxwLT5kcml2ZXJFbmFibGUgKSB7CisJCQkJCQkvL2hjZl9jbnRsX3BvcnQoICYoIGxwLT5oY2ZDdHggKSwKKwkJCQkJCS8vICAgICAgICAgICAgICAgSENGX1BPUlRfRU5BQkxFIHwgSENGX1BPUlRfMCApOworCQkJCQkJLy8gLy9oY2ZfY250bCggJiggbHAtPmhjZkN0eCApLAorCQkJCQkJLy8gLy8gICAgICAgICBIQ0ZfUE9SVF9FTkFCTEUgfCBIQ0ZfUE9SVF8wICk7CisJCQkJCQkvL2hjZl9jbnRsKCAmKCBscC0+aGNmQ3R4ICksIEhDRl9DTlRMX0VOQUJMRSApOworCQkJCQkJLy8gLy9oY2ZfY250bCggJiggbHAtPmhjZkN0eCApLCBIQ0ZfQ05UTF9DT05ORUNUICk7CisKKwkJCQkJCWhjZl9jbnRsKCAmKCBscC0+aGNmQ3R4ICksIEhDRl9DTlRMX0VOQUJMRSB8IEhDRl9QT1JUXzAgKTsKKwkJCQkJCWhjZl9jbnRsKCAmKCBscC0+aGNmQ3R4ICksIEhDRl9DTlRMX0NPTk5FQ1QgKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vaGNmX2NudGxfcG9ydCggJiggbHAtPmhjZkN0eCApLAorCQkJCQkJLy8gICAgICAgICAgICAgICBIQ0ZfUE9SVF9ESVNBQkxFIHwgSENGX1BPUlRfMCApOworCQkJCQkJLy8gLy9oY2ZfY250bCggJiggbHAtPmhjZkN0eCApLAorCQkJCQkJLy8gLy8gICAgICAgICBIQ0ZfUE9SVF9ESVNBQkxFIHwgSENGX1BPUlRfMCApOworCQkJCQkJLy9oY2ZfY250bCggJiggbHAtPmhjZkN0eCApLCBIQ0ZfQ05UTF9ESVNBQkxFICk7CisJCQkJCQkvLyAvL2hjZl9jbnRsKCAmKCBscC0+aGNmQ3R4ICksIEhDRl9DTlRMX0RJU0NPTk5FQ1QgKTsKKworCQkJCQkJaGNmX2NudGwoICYoIGxwLT5oY2ZDdHggKSwgSENGX0NOVExfRElTQUJMRSB8IEhDRl9QT1JUXzAgKTsKKwkJCQkJCWhjZl9jbnRsKCAmKCBscC0+aGNmQ3R4ICksIEhDRl9DTlRMX0RJU0NPTk5FQ1QgKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorICAgIAkJCQkJd2xfYWN0X2ludF9vZmYoIGxwICk7CisJCQkJCXVycS0+cmVzdWx0ID0gaGNmX3B1dF9pbmZvKCYobHAtPmhjZkN0eCksIChMVFZQKSBwTHR2KTsKKyAgICAJCQkJCXdsX2FjdF9pbnRfb24oIGxwICk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlmKCBsdHZBbGxvY2F0ZWQgKSB7CisJCQkJCWtmcmVlKCBwTHR2ICk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQl1cnEtPnJlc3VsdCA9IFVJTF9GQUlMVVJFOworCQkJfQorCQl9IGVsc2UgeworCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiRVBFUk1cbiIgKTsKKwkJCXVycS0+cmVzdWx0ID0gVUlMX0ZBSUxVUkU7CisJCQlyZXN1bHQgPSAtRVBFUk07CisJCX0KKwl9IGVsc2UgeworCQlEQkdfRVJST1IoIERiZ0luZm8sICJVSUxfRVJSX1dST05HX0lGQlxuIiApOworCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfV1JPTkdfSUZCOworCX0KKworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXN1bHQ7Cit9IC8vIHd2bGFuX3VpbF9wdXRfaW5mbworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXd2bGFuX3VpbF9nZXRfaW5mbygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFNlbmRzIGEgc3BlY2lmaWMgUklEIGRpcmVjdGx5IHRvIHRoZSBkcml2ZXIgdG8gcmV0cmlldmUgY29uZmlndXJhdGlvbgorICogICAgICBpbmZvLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgdXJxIC0gYSBwb2ludGVyIHRvIHRoZSBVSUwgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBVSUxfU1VDQ0VTUworICogICAgICBVSUxfRVJSX3h4eCB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHd2bGFuX3VpbF9nZXRfaW5mbyggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworCWludCByZXN1bHQgPSAwOworCWludCBpOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCURCR19GVU5DKCAid3ZsYW5fdWlsX2dldF9pbmZvIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYoIHVycS0+aGNmQ3R4ID09ICYoIGxwLT5oY2ZDdHggKSkgeworCQlpZigoIHVycS0+ZGF0YSAhPSBOVUxMICkgJiYgKCB1cnEtPmxlbiAhPSAwICkpIHsKKwkJCWx0dl90ICAgICAgKnBMdHY7CisJCQlib29sX3QgICAgICBsdHZBbGxvY2F0ZWQgPSBGQUxTRTsKKworCQkJLyogTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBhdCBsZWFzdCBhIGNvbW1hbmQgYW5kIGxlbmd0aCAqLworCQkJaWYoIHVycS0+bGVuIDwgKCBzaXplb2YoIGhjZl8xNiApICogMiApKSB7CisJCQkJdXJxLT5sZW4gPSBzaXplb2YoIGxwLT5sdHZSZWNvcmQgKTsKKwkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJObyBMZW5ndGgvVHlwZSBpbiBMVFYhISFcbiIgKTsKKwkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJVSUxfRVJSX0xFTlxuIiApOworCQkJCXVycS0+cmVzdWx0ID0gVUlMX0VSUl9MRU47CisJCQkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJLyogVmVyaWZ5IHRoZSB1c2VyJ3MgTFRWIHJlY29yZCBoZWFkZXIuICovCisJCQlyZXN1bHQgPSB2ZXJpZnlfYXJlYSggVkVSSUZZX1JFQUQsIHVycS0+ZGF0YSwgc2l6ZW9mKCBoY2ZfMTYgKSAqIDIgKTsKKwkJCWlmKCByZXN1bHQgIT0gMCApIHsKKwkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJ2ZXJpZnlfYXJlYSgpLCBWRVJJRllfUkVBRCBGQUlMRURcbiIgKTsKKwkJCQl1cnEtPnJlc3VsdCA9IFVJTF9GQUlMVVJFOworCQkJCURCR19MRUFWRSggRGJnSW5mbyApOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCS8qIEdldCBvbmx5IHRoZSBjb21tYW5kIGFuZCBsZW5ndGggaW5mb3JtYXRpb24uICovCisJCQlyZXN1bHQgPSBjb3B5X2Zyb21fdXNlciggJiggbHAtPmx0dlJlY29yZCApLCB1cnEtPmRhdGEsIHNpemVvZiggaGNmXzE2ICkgKiAyICk7CisKKwkJCS8qIE1ha2Ugc3VyZSB0aGUgaW5jb21pbmcgTFRWIHJlY29yZCBsZW5ndGggaXMgd2l0aGluIHRoZSBib3VuZHMgb2YKKwkJCSAgIHRoZSBJT0NUTCBsZW5ndGguICovCisJCQlpZigoKCBscC0+bHR2UmVjb3JkLmxlbiArIDEgKSAqIHNpemVvZiggaGNmXzE2ICkpID4gdXJxLT5sZW4gKSB7CisJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiSW5jb21pbmcgTFRWIHRvbyBiaWdcbiIgKTsKKwkJCQl1cnEtPmxlbiA9IHNpemVvZiggbHAtPmx0dlJlY29yZCApOworCQkJCXVycS0+cmVzdWx0ID0gVUlMX0VSUl9MRU47CisJCQkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKworCQkJLyogRGV0ZXJtaW5lIGlmIGhjZl9nZXRfaW5mbygpIGlzIG5lZWRlZCBvciBub3QgKi8KKwkJCXN3aXRjaCAoIGxwLT5sdHZSZWNvcmQudHlwICkgeworCQkJY2FzZSBDRkdfTklDX0lERU5USVRZOgorCQkJCW1lbWNweSggJmxwLT5sdHZSZWNvcmQudS51OFswXSwgJmxwLT5OSUNJZGVudGl0eSwgc2l6ZW9mKCBscC0+TklDSWRlbnRpdHkgKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIENGR19QUklfSURFTlRJVFk6CisJCQkJbWVtY3B5KCAmbHAtPmx0dlJlY29yZC51LnU4WzBdLCAmbHAtPlByaW1hcnlJZGVudGl0eSwgc2l6ZW9mKCBscC0+UHJpbWFyeUlkZW50aXR5ICkpOworCQkJCWJyZWFrOworCQkJY2FzZSBDRkdfQVBfTU9ERToKKwkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJzZXQgQ0ZHX0FQX01PREUgbm8gbG9uZ2VyIHN1cHBvcnRlZCwgc28gaXMgZ2V0IHVzZWZ1bCA/Pz8/XG4iICk7CisJCQkJbHAtPmx0dlJlY29yZC51LnUxNlswXSA9CisJCQkJCUNOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX0FQOworCQkJCWJyZWFrOworCQkJLy9jYXNlIENGR19EUlZfSU5GTzoKKwkJCWNhc2UgQ0ZHX0VOQ1JZUFRfU1RSSU5HOgorCQkJY2FzZSBDRkdfQ09VTlRSWV9TVFJJTkc6CisJCQljYXNlIENGR19EUklWRVJfRU5BQkxFOgorCQkJY2FzZSBDRkdfV09MQVNfRU5BQkxFOgorCQkJCS8vIFRPRE86IGRldGVybWluZSBpZiB3ZSdyZSBnb2luZyB0byBzdXBwb3J0IHRoZXNlCisJCQkJdXJxLT5yZXN1bHQgPSBVSUxfRkFJTFVSRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ0ZHX0RSVl9JTkZPOgorCQkJCURCR19UUkFDRSggRGJnSW5mbywgIkludGVyY2VwdCBDRkdfRFJWX0lORk9cbiIgKTsKKwkJCQlyZXN1bHQgPSBjZmdfZHJpdmVyX2luZm8oIHVycSwgbHAgKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ0ZHX0RSVl9JREVOVElUWToKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJbnRlcmNlcHQgQ0ZHX0RSVl9JREVOVElUWVxuIiApOworCQkJCXJlc3VsdCA9IGNmZ19kcml2ZXJfaWRlbnRpdHkoIHVycSwgbHAgKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ0ZHX0lGQjoKKwkJCQkvKiBJRkIgY2FuIGJlIGEgc2VjdXJpdHkgaG9sZSAqLworCQkJCWlmKCAhY2FwYWJsZSggQ0FQX05FVF9BRE1JTiApKSB7CisJCQkJCXJlc3VsdCA9IC1FUEVSTTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyogRWxzZSBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgKi8KKworCQkJY2FzZSBDRkdfRldfSURFTlRJVFk6ICAgLy8gRm9yIEhlcm1lcy0xLCB0aGlzIGlzIGNhY2hlZAorCQkJZGVmYXVsdDoKKworCQkJCS8qIFZlcmlmeSB0aGUgdXNlciBidWZmZXIgKi8KKwkJCQlyZXN1bHQgPSB2ZXJpZnlfYXJlYSggVkVSSUZZX1dSSVRFLCB1cnEtPmRhdGEsIHVycS0+bGVuICk7CisJCQkJaWYoIHJlc3VsdCAhPSAwICkgeworCQkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJ2ZXJpZnlfYXJlYSgpLCBWRVJJRllfV1JJVEUgRkFJTEVEXG4iICk7CisJCQkJCXVycS0+cmVzdWx0ID0gVUlMX0ZBSUxVUkU7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8qIElmIHRoZSByZXF1ZXN0ZWQgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZSBvZiBvdXIgbG9jYWwKKwkJCQkgICBMVFYgcmVjb3JkLCB0cnkgdG8gYWxsb2NhdGUgaXQgZnJvbSB0aGUga2VybmVsIHN0YWNrLgorCQkJCSAgIE90aGVyd2lzZSwgd2UganVzdCB1c2Ugb3VyIGxvY2FsIExUViByZWNvcmQuICovCisJCQkJaWYoIHVycS0+bGVuID4gc2l6ZW9mKCBscC0+bHR2UmVjb3JkICkpIHsKKwkJCQkJaWYoKCBwTHR2ID0gKGx0dl90ICopa21hbGxvYyggdXJxLT5sZW4sIEdGUF9LRVJORUwgKSkgIT0gTlVMTCApIHsKKwkJCQkJCWx0dkFsbG9jYXRlZCA9IFRSVUU7CisKKwkJCQkJCS8qIENvcHkgdGhlIGNvbW1hbmQvbGVuZ3RoIGluZm9ybWF0aW9uIGludG8gdGhlIG5ldyBidWZmZXIuICovCisJCQkJCQltZW1jcHkoIHBMdHYsICYoIGxwLT5sdHZSZWNvcmQgKSwgc2l6ZW9mKCBoY2ZfMTYgKSAqIDIgKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXVycS0+bGVuID0gc2l6ZW9mKCBscC0+bHR2UmVjb3JkICk7CisJCQkJCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfTEVOOworCQkJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAia21hbGxvYyBGQUlMRURcbiIgKTsKKwkJCQkJCURCR19FUlJPUiggRGJnSW5mbywgIlVJTF9FUlJfTEVOXG4iICk7CisJCQkJCQlyZXN1bHQgPSAtRU5PTUVNOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlwTHR2ID0gJiggbHAtPmx0dlJlY29yZCApOworCQkJCX0KKworICAgIAkJCQl3bF9hY3RfaW50X29mZiggbHAgKTsKKwkJCQl1cnEtPnJlc3VsdCA9IGhjZl9nZXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkgcEx0diApOworICAgIAkJCQl3bF9hY3RfaW50X29uKCBscCApOworCisJCQkJLy8gQ29weSB0aGUgTFRWIGludG8gdGhlIHVzZXIncyBidWZmZXIuCisJCQkJLy9jb3B5X3RvX3VzZXIoIHVycS0+ZGF0YSwgcEx0diwgdXJxLT5sZW4gKTsKKworCQkJCS8vaWYoIGx0dkFsbG9jYXRlZCApCisJCQkJLy97CisJCQkJLy8gICAga2ZyZWUoIHBMdHYgKTsKKwkJCQkvL30KKworCQkJCS8vdXJxLT5yZXN1bHQgPSBVSUxfU1VDQ0VTUzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogSGFuZGxlIGVuZGlhbiBjb252ZXJzaW9uIG9mIHNwZWNpYWwgZmllbGRzICovCisJCQlzd2l0Y2goIGxwLT5sdHZSZWNvcmQudHlwICkgeworCQkJLyogc2ltcGxlIGludCBnZXRzIGp1c3QgbmVlZCB0aGUgZmlyc3QgaGNmXzE2IGJ5dGUgZmxpcHBlZCAqLworCQkJY2FzZSBDRkdfQ05GX1BPUlRfVFlQRToKKwkJCWNhc2UgQ0ZHX0NORl9PV05fQ0hBTk5FTDoKKwkJCWNhc2UgQ0ZHX0NORl9PV05fQVRJTV9XSU5ET1c6CisJCQljYXNlIENGR19DTkZfU1lTVEVNX1NDQUxFOgorCQkJY2FzZSBDRkdfQ05GX01BWF9EQVRBX0xFTjoKKwkJCWNhc2UgQ0ZHX0NORl9QTV9FTkFCTEVEOgorCQkJY2FzZSBDRkdfQ05GX01DQVNUX1JYOgorCQkJY2FzZSBDRkdfQ05GX01BWF9TTEVFUF9EVVJBVElPTjoKKwkJCWNhc2UgQ0ZHX0NORl9IT0xET1ZFUl9EVVJBVElPTjoKKwkJCWNhc2UgQ0ZHX0NORl9PV05fRFRJTV9QRVJJT0Q6CisJCQljYXNlIENGR19DTkZfTUNBU1RfUE1fQlVGOgorCQkJY2FzZSBDRkdfQ05GX1JFSkVDVF9BTlk6CisJCQljYXNlIENGR19DTkZfRU5DUllQVElPTjoKKwkJCWNhc2UgQ0ZHX0NORl9BVVRIRU5USUNBVElPTjoKKwkJCWNhc2UgQ0ZHX0NORl9FWENMX1VORU5DUllQVEVEOgorCQkJY2FzZSBDRkdfQ05GX0lOVFJBX0JTU19SRUxBWToKKwkJCWNhc2UgQ0ZHX0NORl9NSUNST19XQVZFOgorCQkJY2FzZSBDRkdfQ05GX0xPQURfQkFMQU5DSU5HOgorCQkJY2FzZSBDRkdfQ05GX01FRElVTV9ESVNUUklCVVRJT046CisjaWZkZWYgV0FSUAorCQkJY2FzZSBDRkdfQ05GX1RYX1BPV19MVkw6CisJCQljYXNlIENGR19DTkZfQ09OTkVDVElPTl9DTlRMOgorCQkJY2FzZSBDRkdfQ05GX09XTl9CRUFDT05fSU5URVJWQUw6ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPd24gQmVhY29uIEludGVydmFsCisJCQljYXNlIENGR19DT0VYSVNURU5TRV9CRUhBVklPVVI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvZXhpc3RlbmNlIEJlaGF2aW9yCisJCQkvL2Nhc2UgQ0ZHX0NORl9SWF9BTExfR1JPVVBfQUREUkVTUzoKKyNlbmRpZiAvLyBIRVJNRVMyNQorCQkJY2FzZSBDRkdfQ1JFQVRFX0lCU1M6CisJCQljYXNlIENGR19SVFNfVEhSSDoKKwkJCWNhc2UgQ0ZHX1BST01JU0NVT1VTX01PREU6CisJCQkvL2Nhc2UgQ0ZHX1dBS0VfT05fTEFOOgorCQkJY2FzZSBDRkdfUlRTX1RIUkgwOgorCQkJY2FzZSBDRkdfUlRTX1RIUkgxOgorCQkJY2FzZSBDRkdfUlRTX1RIUkgyOgorCQkJY2FzZSBDRkdfUlRTX1RIUkgzOgorCQkJY2FzZSBDRkdfUlRTX1RIUkg0OgorCQkJY2FzZSBDRkdfUlRTX1RIUkg1OgorCQkJY2FzZSBDRkdfUlRTX1RIUkg2OgorCQkJY2FzZSBDRkdfVFhfUkFURV9DTlRMMDoKKwkJCWNhc2UgQ0ZHX1RYX1JBVEVfQ05UTDE6CisJCQljYXNlIENGR19UWF9SQVRFX0NOVEwyOgorCQkJY2FzZSBDRkdfVFhfUkFURV9DTlRMMzoKKwkJCWNhc2UgQ0ZHX1RYX1JBVEVfQ05UTDQ6CisJCQljYXNlIENGR19UWF9SQVRFX0NOVEw1OgorCQkJY2FzZSBDRkdfVFhfUkFURV9DTlRMNjoKKwkJCWNhc2UgQ0ZHX1RYX0tFWV9JRDoKKwkJCWNhc2UgQ0ZHX1RJQ0tfVElNRToKKwkJCWNhc2UgQ0ZHX01BWF9MT0FEX1RJTUU6CisJCQljYXNlIENGR19OSUNfVEVNUF9UWVBFOgorCQkJY2FzZSBDRkdfUE9SVF9TVEFUOgorCQkJY2FzZSBDRkdfQ1VSX1RYX1JBVEU6CisJCQljYXNlIENGR19DVVJfQkVBQ09OX0lOVEVSVkFMOgorCQkJY2FzZSBDRkdfUFJPVE9DT0xfUlNQX1RJTUU6CisJCQljYXNlIENGR19DVVJfU0hPUlRfUkVUUllfTElNSVQ6CisJCQljYXNlIENGR19DVVJfTE9OR19SRVRSWV9MSU1JVDoKKwkJCWNhc2UgQ0ZHX01BWF9UWF9MSUZFVElNRToKKwkJCWNhc2UgQ0ZHX01BWF9SWF9MSUZFVElNRToKKwkJCWNhc2UgQ0ZHX0NGX1BPTExBQkxFOgorCQkJY2FzZSBDRkdfUFJJVkFDWV9PUFRfSU1QTEVNRU5URUQ6CisJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfUkVNT1RFX1JBVEVTOgorCQkJLy9jYXNlIENGR19DVVJSRU5UX1VTRURfUkFURVM6CisJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfU1lTVEVNX1NDQUxFOgorCQkJLy9jYXNlIENGR19DVVJSRU5UX1RYX1JBVEUxOgorCQkJLy9jYXNlIENGR19DVVJSRU5UX1RYX1JBVEUyOgorCQkJLy9jYXNlIENGR19DVVJSRU5UX1RYX1JBVEUzOgorCQkJLy9jYXNlIENGR19DVVJSRU5UX1RYX1JBVEU0OgorCQkJLy9jYXNlIENGR19DVVJSRU5UX1RYX1JBVEU1OgorCQkJLy9jYXNlIENGR19DVVJSRU5UX1RYX1JBVEU2OgorCQkJY2FzZSBDRkdfUEhZX1RZUEU6CisJCQljYXNlIENGR19DVVJfQ0hBTk5FTDoKKwkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9QT1dFUl9TVEFURToKKwkJCS8vY2FzZSBDRkdfQ0NBTU9ERToKKwkJCS8vICAgIGxwLT5sdHZSZWNvcmQudS51MTZbMF0gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNlswXSApOworCQkJLy8gICAgYnJlYWs7CisJCQkvKiBuYW1lIHN0cmluZyBnZXRzIGp1c3QgbmVlZCB0aGUgZmlyc3QgaGNmXzE2IGJ5dGUgZmxpcHBlZCAobGVuZ3RoIG9mIHN0cmluZykgKi8KKwkJCWNhc2UgQ0ZHX0NORl9PV05fU1NJRDoKKwkJCWNhc2UgQ0ZHX0NORl9PV05fTkFNRToKKwkJCS8vY2FzZSBDTkZfREVTSVJFRF9TU0lEOgorCQkJY2FzZSBDRkdfREVTSVJFRF9TU0lEOgorCQkJY2FzZSBDRkdfU0NBTl9TU0lEOgorCQkJY2FzZSBDRkdfQ1VSX1NTSUQ6CisJCQkJbHAtPmx0dlJlY29yZC51LnUxNlswXSA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bHR2UmVjb3JkLnUudTE2WzBdICk7CisJCQkJYnJlYWs7CisJCQkvKiBub24tbGVuZ3RoIGNvdW50ZWQgc3RyaW5ncyBuZWVkIG5vIGJ5dGUgZmxpcHBpbmcgKi8KKwkJCWNhc2UgQ0ZHX0NORl9PV05fTUFDX0FERFI6CisJCQkvKiB0aGlzIGNhc2UgaXMgbm8gbG9uZ2VyIHZhbGlkOiBDRkdfQ05GX1dEU19BRERSICovCisJCQljYXNlIENGR19DTkZfV0RTX0FERFIxOgorCQkJY2FzZSBDRkdfQ05GX1dEU19BRERSMjoKKwkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjM6CisJCQljYXNlIENGR19DTkZfV0RTX0FERFI0OgorCQkJY2FzZSBDRkdfQ05GX1dEU19BRERSNToKKwkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjY6CisJCQljYXNlIENGR19HUk9VUF9BRERSOgorCQkJY2FzZSBDRkdfTklDX1NFUklBTF9OVU1CRVI6CisJCQljYXNlIENGR19DVVJfQlNTSUQ6CisJCQljYXNlIENGR19OSUNfTUFDX0FERFI6CisJCQljYXNlIENGR19TVVBQT1JURURfREFUQV9SQVRFUzogIC8qIG5lZWQgdG8gZW5zdXJlIHdlIGNhbiB0cmVhdCB0aGlzIGFzIGEgc3RyaW5nICovCisJCQkJYnJlYWs7CisJCQkvL2Nhc2UgQ0ZHX0NORl9DT1VOVFJZX0lORk86ICAgICAgLyogc3BlY2lhbCBjYXNlLCBzZWUgcGFnZSA3NSAgb2YgMDIyNDg2LCBSZXYgQy4gKi8KKwkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9DT1VOVFJZX0lORk86ICAvKiBzcGVjaWFsIGNhc2UsIHNlZSBwYWdlIDEwMSBvZiAwMjI0ODYsIFJldiBDLiAqLworCQkJLyoKKwkJCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sdHZSZWNvcmQudS51MTZbMF0gKTsKKwkJCQlscC0+bHR2UmVjb3JkLnUudTE2WzNdID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sdHZSZWNvcmQudS51MTZbM10gKTsKKworCQkJCWZvciggaSA9IDQ7IGkgPCBscC0+bHR2UmVjb3JkLmxlbjsgaSsrICkgeworCQkJCQlscC0+bHR2UmVjb3JkLnUudTE2W2ldID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sdHZSZWNvcmQudS51MTZbaV0gKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkqLworCisJCQljYXNlIENGR19ERUZBVUxUX0tFWVM6CisJCQkJeworCQkJCQlDRkdfREVGQVVMVF9LRVlTX1NUUkNUICpwS2V5cyA9IChDRkdfREVGQVVMVF9LRVlTX1NUUkNUICopJmxwLT5sdHZSZWNvcmQudS51OFswXTsKKworCQkJCQlwS2V5c1swXS5sZW4gPSBDTlZfSU5UX1RPX0xJVFRMRSggcEtleXNbMF0ubGVuICk7CisJCQkJCXBLZXlzWzFdLmxlbiA9IENOVl9JTlRfVE9fTElUVExFKCBwS2V5c1sxXS5sZW4gKTsKKwkJCQkJcEtleXNbMl0ubGVuID0gQ05WX0lOVF9UT19MSVRUTEUoIHBLZXlzWzJdLmxlbiApOworCQkJCQlwS2V5c1szXS5sZW4gPSBDTlZfSU5UX1RPX0xJVFRMRSggcEtleXNbM10ubGVuICk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBDRkdfQ05GX01DQVNUX1JBVEU6CisJCQljYXNlIENGR19UWF9SQVRFX0NOVEw6CisJCQljYXNlIENGR19TVVBQT1JURURfUkFURV9TRVRfQ05UTDogICAgLy8gU3VwcG9ydGVkIFJhdGUgU2V0IENvbnRyb2wKKwkJCWNhc2UgQ0ZHX0JBU0lDX1JBVEVfU0VUX0NOVEw6ICAgIC8vIEJhc2ljIFJhdGUgU2V0IENvbnRyb2wKKwkJCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sdHZSZWNvcmQudS51MTZbMF0gKTsKKwkJCQlscC0+bHR2UmVjb3JkLnUudTE2WzFdID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sdHZSZWNvcmQudS51MTZbMV0gKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ0ZHX0RMX0JVRjoKKwkJCWNhc2UgQ0ZHX05JQ19JREVOVElUWToKKwkJCWNhc2UgQ0ZHX0NPTU1TX1FVQUxJVFk6CisJCQljYXNlIENGR19QQ0ZfSU5GTzoKKwkJCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sdHZSZWNvcmQudS51MTZbMF0gKTsKKwkJCQlscC0+bHR2UmVjb3JkLnUudTE2WzFdID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sdHZSZWNvcmQudS51MTZbMV0gKTsKKwkJCQlscC0+bHR2UmVjb3JkLnUudTE2WzJdID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sdHZSZWNvcmQudS51MTZbMl0gKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ0ZHX0ZXX0lERU5USVRZOgorCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNlswXSApOworCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbMV0gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNlsxXSApOworCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbMl0gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNlsyXSApOworCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbM10gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNlszXSApOworCQkJCWJyZWFrOworCQkJLy9jYXNlIENGR19IU0lfU1VQX1JBTkdFOgorCQkJY2FzZSBDRkdfTklDX01GSV9TVVBfUkFOR0U6CisJCQljYXNlIENGR19OSUNfQ0ZJX1NVUF9SQU5HRToKKwkJCWNhc2UgQ0ZHX05JQ19QUk9GSUxFOgorCQkJY2FzZSBDRkdfRldfU1VQX1JBTkdFOgorCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNlswXSApOworCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbMV0gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNlsxXSApOworCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbMl0gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNlsyXSApOworCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbM10gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNlszXSApOworCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbNF0gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNls0XSApOworCQkJCWJyZWFrOworCQkJY2FzZSBDRkdfTUZJX0FDVF9SQU5HRVNfU1RBOgorCQkJY2FzZSBDRkdfQ0ZJX0FDVF9SQU5HRVNfU1RBOgorCQkJY2FzZSBDRkdfQ1VSX1NDQUxFX1RIUkg6CisJCQljYXNlIENGR19BVVRIRU5USUNBVElPTl9BTEdPUklUSE1TOgorCQkJCWZvciggaSA9IDA7IGkgPCAoIGxwLT5sdHZSZWNvcmQubGVuIC0gMSApOyBpKysgKSB7CisJCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbaV0gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNltpXSApOworCQkJCX0KKwkJCQlicmVhazsKKwkJCS8qIGRvbmUgYXQgaW5pdCB0aW1lLCBhbmQgZW5kaWFuIGhhbmRsZWQgdGhlbiAqLworCQkJY2FzZSBDRkdfUFJJX0lERU5USVRZOgorCQkJCWJyZWFrOworCQkJY2FzZSBDRkdfTUJfSU5GTzoKKwkJCQkvL3d2bGFuRW5kaWFuVHJhbnNsYXRlTWFpbGJveCggcEx0diApOworCQkJCWJyZWFrOworCQkJLyogTVNGIGFuZCBIQ0YgUklEUyAqLworCQkJY2FzZSBDRkdfSUZCOgorCQkJY2FzZSBDRkdfRFJWX0lORk86CisJCQljYXNlIENGR19BUF9NT0RFOgorCQkJY2FzZSBDRkdfRU5DUllQVF9TVFJJTkc6CisJCQljYXNlIENGR19DT1VOVFJZX1NUUklORzoKKwkJCWNhc2UgQ0ZHX0RSSVZFUl9FTkFCTEU6CisJCQljYXNlIENGR19XT0xBU19FTkFCTEU6CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCisJCQkvLyBDb3B5IHRoZSBMVFYgaW50byB0aGUgdXNlcidzIGJ1ZmZlci4KKwkJCWNvcHlfdG9fdXNlciggdXJxLT5kYXRhLCAmKCBscC0+bHR2UmVjb3JkICksIHVycS0+bGVuICk7CisKKwkJCWlmKCBsdHZBbGxvY2F0ZWQgKSB7CisJCQkJa2ZyZWUoICYoIGxwLT5sdHZSZWNvcmQgKSk7CisJCQl9CisKKwkJCXVycS0+cmVzdWx0ID0gVUlMX1NVQ0NFU1M7CisJCX0gZWxzZSB7CisJCQl1cnEtPnJlc3VsdCA9IFVJTF9GQUlMVVJFOworCQl9CisJfSBlbHNlIHsKKwkJREJHX0VSUk9SKCBEYmdJbmZvLCAiVUlMX0VSUl9XUk9OR19JRkJcbiIgKTsKKwkJdXJxLT5yZXN1bHQgPSBVSUxfRVJSX1dST05HX0lGQjsKKwl9CisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmVzdWx0OworfSAvLyB3dmxhbl91aWxfZ2V0X2luZm8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCWNmZ19kcml2ZXJfaW5mbygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFJldHJpZXZlcyBkcml2ZXIgaW5mb3JtYXRpb24uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB1cnEgLSBhIHBvaW50ZXIgdG8gdGhlIFVJTCByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIFVJTF9TVUNDRVNTCisgKiAgICAgIFVJTF9FUlJfeHh4IHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgY2ZnX2RyaXZlcl9pbmZvKCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisJaW50IHJlc3VsdCA9IDA7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggImNmZ19kcml2ZXJfaW5mbyIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCisJLyogTWFrZSBzdXJlIHRoYXQgdXNlciBidWZmZXIgY2FuIGhhbmRsZSB0aGUgZHJpdmVyIGluZm9ybWF0aW9uIGJ1ZmZlciAqLworCWlmKCB1cnEtPmxlbiA8IHNpemVvZiggbHAtPmRyaXZlckluZm8gKSkgeworCQl1cnEtPmxlbiA9IHNpemVvZiggbHAtPmRyaXZlckluZm8gKTsKKwkJdXJxLT5yZXN1bHQgPSBVSUxfRVJSX0xFTjsKKwkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogVmVyaWZ5IHRoZSB1c2VyIGJ1ZmZlci4gKi8KKwlyZXN1bHQgPSB2ZXJpZnlfYXJlYSggVkVSSUZZX1dSSVRFLCB1cnEtPmRhdGEsIHNpemVvZiggbHAtPmRyaXZlckluZm8gKSk7CisJaWYoIHJlc3VsdCAhPSAwICkgeworCQl1cnEtPnJlc3VsdCA9IFVJTF9GQUlMVVJFOworCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlscC0+ZHJpdmVySW5mby5jYXJkX3N0YXQgPSBscC0+aGNmQ3R4LklGQl9DYXJkU3RhdDsKKworCS8vIENvcHkgdGhlIGRyaXZlciBpbmZvcm1hdGlvbiBpbnRvIHRoZSB1c2VyJ3MgYnVmZmVyLgorCXVycS0+cmVzdWx0ID0gVUlMX1NVQ0NFU1M7CisJY29weV90b191c2VyKCB1cnEtPmRhdGEsICYoIGxwLT5kcml2ZXJJbmZvICksIHNpemVvZiggbHAtPmRyaXZlckluZm8gKSk7CisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmVzdWx0OworfSAvLyBjZmdfZHJpdmVyX2luZm8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgljZmdfZHJpdmVyX2lkZW50aXR5KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgUmV0cmlldmVzIElEIGluZm9ybWF0aW9uIGZyb20gdGhlIGNhcmQuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB1cnEgLSBhIHBvaW50ZXIgdG8gdGhlIFVJTCByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIFVJTF9TVUNDRVNTCisgKiAgICAgIFVJTF9FUlJfeHh4IHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgY2ZnX2RyaXZlcl9pZGVudGl0eSggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworCWludCByZXN1bHQgPSAwOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3dmxhbl9kcml2ZXJfaWRlbnRpdHkiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKworCS8qIE1ha2Ugc3VyZSB0aGF0IHVzZXIgYnVmZmVyIGNhbiBoYW5kbGUgdGhlIGRyaXZlciBpZGVudGl0eSBzdHJ1Y3R1cmUuICovCisJaWYoIHVycS0+bGVuIDwgc2l6ZW9mKCBscC0+ZHJpdmVySWRlbnRpdHkgKSkgeworCQl1cnEtPmxlbiA9IHNpemVvZiggbHAtPmRyaXZlcklkZW50aXR5ICk7CisJCXVycS0+cmVzdWx0ID0gVUlMX0VSUl9MRU47CisJCURCR19MRUFWRSggRGJnSW5mbyApOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIFZlcmlmeSB0aGUgdXNlciBidWZmZXIuICovCisJcmVzdWx0ID0gdmVyaWZ5X2FyZWEoIFZFUklGWV9XUklURSwgdXJxLT5kYXRhLCBzaXplb2YoIGxwLT5kcml2ZXJJZGVudGl0eSApKTsKKwlpZiggcmVzdWx0ICE9IDAgKSB7CisJCXVycS0+cmVzdWx0ID0gVUlMX0ZBSUxVUkU7CisJCURCR19MRUFWRSggRGJnSW5mbyApOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIENvcHkgdGhlIGRyaXZlciBpZGVudGl0eSBpbnRvIHRoZSB1c2VyJ3MgYnVmZmVyLiAqLworCXVycS0+cmVzdWx0ID0gVUlMX1NVQ0NFU1M7CisJY29weV90b191c2VyKCB1cnEtPmRhdGEsICYoIGxwLT5kcml2ZXJJZGVudGl0eSApLCBzaXplb2YoIGxwLT5kcml2ZXJJZGVudGl0eSApKTsKKworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXN1bHQ7Cit9IC8vIGNmZ19kcml2ZXJfaWRlbnRpdHkKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworI2VuZGlmICAvKiBVU0VfVUlMICovCisKKworLyogSWYgV0lSRUxFU1NfRVhUIGlzIG5vdCBkZWZpbmVkLCB0aGVuIHRoZSBmdW5jdGlvbnMgdGhhdCBmb2xsb3cgd2lsbCBub3QgYmUKKyAgIGluY2x1ZGVkIGluIHRoZSBidWlsZC4gKi8KKy8qIE5PVEU6IEFyZSB0aGVzZSBzdGlsbCBldmVuIG5lZWRlZD8gKi8KKyNpZmRlZiBXSVJFTEVTU19FWFQKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd3ZsYW5fc2V0X25ldG5hbWUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBTZXQgdGhlIEVTU0lEIG9mIHRoZSBjYXJkLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gYSBwb2ludGVyIHRvIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHd2bGFuX3NldF9uZXRuYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCSAgICAgIGNoYXIgKmV4dHJhKQoreworICAgICAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggInd2bGFuX3NldF9uZXRuYW1lIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisgICAgICAgIHdsX2xvY2sobHAsICZmbGFncyk7CisKKyAgICAgICAgbWVtc2V0KCBscC0+TmV0d29ya05hbWUsIDAsIHNpemVvZiggbHAtPk5ldHdvcmtOYW1lICkpOworICAgICAgICBtZW1jcHkoIGxwLT5OZXR3b3JrTmFtZSwgZXh0cmEsIHdycXUtPmRhdGEubGVuZ3RoKTsKKworCS8qIENvbW1pdCB0aGUgYWRhcHRlciBwYXJhbWV0ZXJzICovCisJd2xfYXBwbHkobHApOworICAgICAgICB3bF91bmxvY2sobHAsICZmbGFncyk7CisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3dmxhbl9zZXRfbmV0bmFtZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXd2bGFuX2dldF9uZXRuYW1lKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgR2V0IHRoZSBFU1NJRCBvZiB0aGUgY2FyZC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIGEgcG9pbnRlciB0byB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3dmxhbl9nZXRfbmV0bmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkgICAgICBjaGFyICpleHRyYSkKK3sKKyAgICAgICAgc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICBpbnQgICAgICAgICByZXQgPSAwOworICAgICAgICBpbnQgICAgICAgICBzdGF0dXMgPSAtMTsKKyAgICAgICAgd3ZOYW1lX3QgICAqcE5hbWU7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgICAgICAgREJHX0ZVTkMoICJ3dmxhbl9nZXRfbmV0bmFtZSIgKTsKKyAgICAgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKyAgICAgICAgd2xfbG9jayhscCwgJmZsYWdzKTsKKworICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgbmV0d29yayBuYW1lICovCisgICAgICAgIGxwLT5sdHZSZWNvcmQubGVuID0gMSArICggc2l6ZW9mKCAqcE5hbWUgKSAvIHNpemVvZiggaGNmXzE2ICkpOworICAgICAgICBscC0+bHR2UmVjb3JkLnR5cCA9IENGR19DVVJfU1NJRDsKKworICAgICAgICBzdGF0dXMgPSBoY2ZfZ2V0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworICAgICAgICBpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgeworICAgICAgICAgICAgICAgIHBOYW1lID0gKHd2TmFtZV90ICopJiggbHAtPmx0dlJlY29yZC51LnUzMiApOworCisJCW1lbXNldChleHRyYSwgJ1wwJywgSENGX01BWF9OQU1FX0xFTik7CisJCXdycXUtPmRhdGEubGVuZ3RoID0gcE5hbWUtPmxlbmd0aDsKKworICAgICAgICAgICAgICAgIG1lbWNweShleHRyYSwgcE5hbWUtPm5hbWUsIHBOYW1lLT5sZW5ndGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldCA9IC1FRkFVTFQ7CisJfQorCisgICAgICAgIHdsX3VubG9jayhscCwgJmZsYWdzKTsKKworICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICAgICAgcmV0dXJuIHJldDsKK30gLy8gd3ZsYW5fZ2V0X25ldG5hbWUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3dmxhbl9zZXRfc3RhdGlvbl9uaWNrbmFtZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFNldCB0aGUgY2FyZCdzIHN0YXRpb24gbmlja25hbWUuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSBhIHBvaW50ZXIgdG8gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd3ZsYW5fc2V0X3N0YXRpb25fbmlja25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJICAgICAgY2hhciAqZXh0cmEpCit7CisgICAgICAgIHN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAgaW50ICAgICAgICAgcmV0ID0gMDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworICAgICAgICBEQkdfRlVOQyggInd2bGFuX3NldF9zdGF0aW9uX25pY2tuYW1lIiApOworICAgICAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworICAgICAgICB3bF9sb2NrKGxwLCAmZmxhZ3MpOworCisgICAgICAgIG1lbXNldCggbHAtPlN0YXRpb25OYW1lLCAwLCBzaXplb2YoIGxwLT5TdGF0aW9uTmFtZSApKTsKKworICAgICAgICBtZW1jcHkoIGxwLT5TdGF0aW9uTmFtZSwgZXh0cmEsIHdycXUtPmRhdGEubGVuZ3RoKTsKKworICAgICAgICAvKiBDb21taXQgdGhlIGFkYXB0ZXIgcGFyYW1ldGVycyAqLworICAgICAgICB3bF9hcHBseSggbHAgKTsKKyAgICAgICAgd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCisgICAgICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgICAgICByZXR1cm4gcmV0OworfSAvLyB3dmxhbl9zZXRfc3RhdGlvbl9uaWNrbmFtZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXd2bGFuX2dldF9zdGF0aW9uX25pY2tuYW1lKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgR2V0IHRoZSBjYXJkJ3Mgc3RhdGlvbiBuaWNrbmFtZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIGEgcG9pbnRlciB0byB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3dmxhbl9nZXRfc3RhdGlvbl9uaWNrbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkgICAgICBjaGFyICpleHRyYSkKK3sKKyAgICAgICAgc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCAgICAgICAgIHJldCA9IDA7CisJaW50ICAgICAgICAgc3RhdHVzID0gLTE7CisJd3ZOYW1lX3QgICAqcE5hbWU7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgICAgICAgREJHX0ZVTkMoICJ3dmxhbl9nZXRfc3RhdGlvbl9uaWNrbmFtZSIgKTsKKyAgICAgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKyAgICAgICAgd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBzdGF0aW9uIG5hbWUgKi8KKyAgICAgICAgbHAtPmx0dlJlY29yZC5sZW4gPSAxICsgKCBzaXplb2YoICpwTmFtZSApIC8gc2l6ZW9mKCBoY2ZfMTYgKSk7CisgICAgICAgIGxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0NORl9PV05fTkFNRTsKKworICAgICAgICBzdGF0dXMgPSBoY2ZfZ2V0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworICAgICAgICBpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgeworICAgICAgICAgICAgICAgIHBOYW1lID0gKHd2TmFtZV90ICopJiggbHAtPmx0dlJlY29yZC51LnUzMiApOworCisJCW1lbXNldChleHRyYSwgJ1wwJywgSENGX01BWF9OQU1FX0xFTik7CisJCXdycXUtPmRhdGEubGVuZ3RoID0gcE5hbWUtPmxlbmd0aDsKKwkJbWVtY3B5KGV4dHJhLCBwTmFtZS0+bmFtZSwgcE5hbWUtPmxlbmd0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0ID0gLUVGQVVMVDsKKyAgICAgICAgfQorCisgICAgICAgIHdsX3VubG9jayhscCwgJmZsYWdzKTsKKworLy9vdXQ6CisgICAgICAgIERCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9IC8vIHd2bGFuX2dldF9zdGF0aW9uX25pY2tuYW1lCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd3ZsYW5fc2V0X3BvcnR0eXBlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgU2V0IHRoZSBjYXJkJ3MgcG9ydHR5cGUKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIGEgcG9pbnRlciB0byB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3dmxhbl9zZXRfcG9ydHR5cGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJICAgICAgY2hhciAqZXh0cmEpCit7CisgICAgICAgIHN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAgaW50ICAgICByZXQgPSAwOworCWhjZl8xNiAgcG9ydFR5cGU7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgICAgICAgREJHX0ZVTkMoICJ3dmxhbl9zZXRfcG9ydHR5cGUiICk7CisgICAgICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisgICAgICAgIHdsX2xvY2sobHAsICZmbGFncyk7CisKKyAgICAgICAgLyogVmFsaWRhdGUgdGhlIG5ldyB2YWx1ZSAqLworICAgICAgICBwb3J0VHlwZSA9ICooKF9fdTMyICopZXh0cmEpOworCisgICAgICAgIGlmKCAhKCggcG9ydFR5cGUgPT0gMSApIHx8ICggcG9ydFR5cGUgPT0gMyApKSkgeworICAgICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3VubG9jazsKKyAgICAgICAgfQorCisgICAgICAgIGxwLT5Qb3J0VHlwZSA9IHBvcnRUeXBlOworCisgICAgICAgIC8qIENvbW1pdCB0aGUgYWRhcHRlciBwYXJhbWV0ZXJzICovCisgICAgICAgIHdsX2FwcGx5KCBscCApOworCitvdXRfdW5sb2NrOgorICAgICAgICB3bF91bmxvY2sobHAsICZmbGFncyk7CisKKy8vb3V0OgorICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICAgICAgcmV0dXJuIHJldDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd3ZsYW5fZ2V0X3BvcnR0eXBlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgR2V0IHRoZSBjYXJkJ3MgcG9ydHR5cGUKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIGEgcG9pbnRlciB0byB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3dmxhbl9nZXRfcG9ydHR5cGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJICAgICAgY2hhciAqZXh0cmEpCit7CisgICAgICAgIHN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAgaW50ICAgICByZXQgPSAwOworICAgICAgICBpbnQgICAgIHN0YXR1cyA9IC0xOworICAgICAgICBoY2ZfMTYgICpwUG9ydFR5cGU7CisgICAgICAgIF9fdTMyICpwRGF0YSA9IChfX3UzMiAqKWV4dHJhOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgICAgIERCR19GVU5DKCAid3ZsYW5fZ2V0X3BvcnR0eXBlIiApOworICAgICAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworICAgICAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHBvcnQgdHlwZSAqLworICAgICAgICBscC0+bHR2UmVjb3JkLmxlbiA9IDEgKyAoIHNpemVvZiggKnBQb3J0VHlwZSApIC8gc2l6ZW9mKCBoY2ZfMTYgKSk7CisgICAgICAgIGxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0NORl9QT1JUX1RZUEU7CisKKyAgICAgICAgc3RhdHVzID0gaGNmX2dldF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKyAgICAgICAgaWYoIHN0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKyAgICAgICAgICAgICAgICBwUG9ydFR5cGUgPSAoaGNmXzE2ICopJiggbHAtPmx0dlJlY29yZC51LnUzMiApOworCisgICAgICAgICAgICAgICAgKnBEYXRhID0gQ05WX0xJVFRMRV9UT19JTlQoICpwUG9ydFR5cGUgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IC1FRkFVTFQ7CisJfQorCisgICAgICAgIHdsX3VubG9jayhscCwgJmZsYWdzKTsKKworLy9vdXQ6CisgICAgICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgICAgICByZXR1cm4gcmV0OworfSAvLyB3dmxhbl9nZXRfcG9ydHR5cGUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNlbmRpZiAgLy8gV0lSRUxFU1NfRVhUCisKKworCisKKyNpZmRlZiBVU0VfUlRTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd3ZsYW5fcnRzKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgSU9DVEwgaGFuZGxlciBmb3IgUlRTIGNvbW1hbmRzCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBycnEgLSBhIHBvaW50ZXIgdG8gdGhlIHJ0cyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHd2bGFuX3J0cyggc3RydWN0IHJ0c3JlcSAqcnJxLCBfX3UzMiBpb19iYXNlICkKK3sKKwlpbnQgaW9jdGxfcmV0ID0gMDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid3ZsYW5fcnRzIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisKKwlEQkdfUFJJTlQoICJpb19iYXNlOiAweCUwOHhcbiIsIGlvX2Jhc2UgKTsKKworCXN3aXRjaCggcnJxLT50eXAgKSB7CisJICBjYXNlIFdMX0lPQ1RMX1JUU19SRUFEOgorCQlEQkdfVFJBQ0UoRGJnSW5mbywgIklPQ1RMOiBXVkxBTjJfSU9DVExfUlRTIC0tIFdMX0lPQ1RMX1JUU19SRUFEXG4iKTsKKwkJcnJxLT5kYXRhWzBdID0gSU5fUE9SVF9XT1JEKCBpb19iYXNlICsgcnJxLT5yZWcgKTsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiICByZWcgMHglMDR4ID09PiAweCUwNHhcbiIsIHJycS0+cmVnLCBDTlZfTElUVExFX1RPX1NIT1JUKCBycnEtPmRhdGFbMF0gKSApOworCQlicmVhazsKKwkgIGNhc2UgV0xfSU9DVExfUlRTX1dSSVRFOgorCQlEQkdfVFJBQ0UoRGJnSW5mbywgIklPQ1RMOiBXVkxBTjJfSU9DVExfUlRTIC0tIFdMX0lPQ1RMX1JUU19XUklURVxuIik7CisJCU9VVF9QT1JUX1dPUkQoIGlvX2Jhc2UgKyBycnEtPnJlZywgcnJxLT5kYXRhWzBdICk7CisJCURCR19UUkFDRSggRGJnSW5mbywgIiAgcmVnIDB4JTA0eCA8PT0gMHglMDR4XG4iLCBycnEtPnJlZywgQ05WX0xJVFRMRV9UT19TSE9SVCggcnJxLT5kYXRhWzBdICkgKTsKKwkJYnJlYWs7CisJICBjYXNlIFdMX0lPQ1RMX1JUU19CQVRDSF9SRUFEOgorCQlEQkdfVFJBQ0UoRGJnSW5mbywgIklPQ1RMOiBXVkxBTjJfSU9DVExfUlRTIC0tIFdMX0lPQ1RMX1JUU19CQVRDSF9SRUFEXG4iKTsKKwkJSU5fUE9SVF9TVFJJTkdfMTYoIGlvX2Jhc2UgKyBycnEtPnJlZywgcnJxLT5kYXRhLCBycnEtPmxlbiApOworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIgIHJlZyAweCUwNHggPT0+ICVkIGJ5dGVzXG4iLCBycnEtPnJlZywgcnJxLT5sZW4gKiBzaXplb2YgKF9fdTE2ICkgKTsKKwkJYnJlYWs7CisJICBjYXNlIFdMX0lPQ1RMX1JUU19CQVRDSF9XUklURToKKwkJREJHX1RSQUNFKERiZ0luZm8sICJJT0NUTDogV1ZMQU4yX0lPQ1RMX1JUUyAtLSBXTF9JT0NUTF9SVFNfQkFUQ0hfV1JJVEVcbiIpOworCQlPVVRfUE9SVF9TVFJJTkdfMTYoIGlvX2Jhc2UgKyBycnEtPnJlZywgcnJxLT5kYXRhLCBycnEtPmxlbiApOworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIgIHJlZyAweCUwNHggPD09ICVkIGJ5dGVzXG4iLCBycnEtPnJlZywgcnJxLT5sZW4gKiBzaXplb2YgKF9fdTE2KSApOworCQlicmVhazsKKwlkZWZhdWx0OgorCisJCURCR19UUkFDRShEYmdJbmZvLCAiSU9DVEw6IFdWTEFOMl9JT0NUTF9SVFMgLS0gVU5TVVBQT1JURUQgUlRTIENPREU6IDB4JVgiLCBycnEtPnR5cCApOworCQlpb2N0bF9yZXQgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisJfQorCisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIGlvY3RsX3JldDsKK30gLy8gd3ZsYW5fcnRzCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZW5kaWYgIC8qIFVTRV9SVFMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3ByaXYuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3ByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjAyNTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcHJpdi5oCkBAIC0wLDAgKzEsMTIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBXaXJlbGVzcyBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAod2xhZ3M0OSkuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBodHRwOi8vd3d3LmFnZXJlLmNvbQorICoKKyAqIEluaXRpYWxseSBkZXZlbG9wZWQgYnkgVHJpcGxlUG9pbnQsIEluYy4KKyAqICAgaHR0cDovL3d3dy50cmlwbGVwb2ludC5jb20KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgSGVhZGVyIGRlc2NyaWJpbmcgaW5mb3JtYXRpb24gcmVxdWlyZWQgZm9yIHRoZSBwcml2YXRlIElPQ1RMIGhhbmRsZXJzLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU09GVFdBUkUgTElDRU5TRQorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisgKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIERpc2NsYWltZXIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIJNBUyBJU5QgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisgKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19XTF9QUklWX0hfXworI2RlZmluZSBfX1dMX1BSSVZfSF9fCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgZnVuY3Rpb24gcHJvdG90eXBlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBXSVJFTEVTU19FWFQKKworCitpbnQgd3ZsYW5fc2V0X25ldG5hbWUoIHN0cnVjdCBuZXRfZGV2aWNlICosICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICosIHVuaW9uIGl3cmVxX2RhdGEgKiwgY2hhciAqZXh0cmEgKTsKKworaW50IHd2bGFuX2dldF9uZXRuYW1lKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqLCB1bmlvbiBpd3JlcV9kYXRhICosIGNoYXIgKmV4dHJhICk7CisKK2ludCB3dmxhbl9zZXRfc3RhdGlvbl9uaWNrbmFtZSggc3RydWN0IG5ldF9kZXZpY2UgKiwgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKiwgdW5pb24gaXdyZXFfZGF0YSAqLCBjaGFyICpleHRyYSApOworCitpbnQgd3ZsYW5fZ2V0X3N0YXRpb25fbmlja25hbWUoIHN0cnVjdCBuZXRfZGV2aWNlICosICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICosIHVuaW9uIGl3cmVxX2RhdGEgKiwgY2hhciAqZXh0cmEgKTsKKworaW50IHd2bGFuX3NldF9wb3J0dHlwZSggc3RydWN0IG5ldF9kZXZpY2UgKiwgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKiwgdW5pb24gaXdyZXFfZGF0YSAqLCBjaGFyICpleHRyYSApOworCitpbnQgd3ZsYW5fZ2V0X3BvcnR0eXBlKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqLCB1bmlvbiBpd3JlcV9kYXRhICosIGNoYXIgKmV4dHJhICk7CisKKworI2VuZGlmICAvLyBXSVJFTEVTU19FWFQKKworCisKKworI2lmZGVmIFVTRV9VSUwKKworaW50IHd2bGFuX3VpbCggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKworLy8gaW50IHd2bGFuX3VpbF9jb25uZWN0KCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworLy8gaW50IHd2bGFuX3VpbF9kaXNjb25uZWN0KCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworLy8gaW50IHd2bGFuX3VpbF9hY3Rpb24oIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisvLyBpbnQgd3ZsYW5fdWlsX2Jsb2NrKCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworLy8gaW50IHd2bGFuX3VpbF91bmJsb2NrKCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworLy8gaW50IHd2bGFuX3VpbF9zZW5kX2RpYWdfbXNnKCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworLy8gaW50IHd2bGFuX3VpbF9wdXRfaW5mbyggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKy8vIGludCB3dmxhbl91aWxfZ2V0X2luZm8oIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisKKy8vaW50IGNmZ19kcml2ZXJfaW5mbyggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKy8vaW50IGNmZ19kcml2ZXJfaWRlbnRpdHkoIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisKKyNlbmRpZiAgLy8gVVNFX1VJTAorCisKKyNpZmRlZiBVU0VfUlRTCisKK2ludCB3dmxhbl9ydHMoIHN0cnVjdCBydHNyZXEgKnJycSwgX191MzIgaW9fYmFzZSApOworaW50IHd2bGFuX3J0c19yZWFkKCBfX3UxNiByZWcsIF9fdTE2ICp2YWwsIF9fdTMyIGlvX2Jhc2UgKTsKK2ludCB3dmxhbl9ydHNfd3JpdGUoIF9fdTE2IHJlZywgX191MTYgdmFsLCBfX3UzMiBpb19iYXNlICk7CitpbnQgd3ZsYW5fcnRzX2JhdGNoX3JlYWQoIHN0cnVjdCBydHNyZXEgKnJycSwgX191MzIgaW9fYmFzZSApOworaW50IHd2bGFuX3J0c19iYXRjaF93cml0ZSggc3RydWN0IHJ0c3JlcSAqcnJxLCBfX3UzMiBpb19iYXNlICk7CisKKyNlbmRpZiAgLy8gVVNFX1JUUworCisKKyNlbmRpZiAgLy8gX19XTF9QUklWX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcHJvZmlsZS5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcHJvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNWYwMjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wcm9maWxlLmMKQEAgLTAsMCArMSwxMTExIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBXaXJlbGVzcyBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAod2xhZ3M0OSkuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBodHRwOi8vd3d3LmFnZXJlLmNvbQorICoKKyAqIEluaXRpYWxseSBkZXZlbG9wZWQgYnkgVHJpcGxlUG9pbnQsIEluYy4KKyAqICAgaHR0cDovL3d3dy50cmlwbGVwb2ludC5jb20KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgVGhpcyBmaWxlIGRlZmluZXMgcm91dGluZXMgcmVxdWlyZWQgdG8gcGFyc2UgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgKiAgIGxpc3RlZCBpbiBhIGNvbmZpZyBmaWxlLCBpZiB0aGF0IGNvbmZpZyBmaWxlIGV4aXN0cy4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNPRlRXQVJFIExJQ0VOU0UKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisgKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBPbmx5IGluY2x1ZGUgdGhpcyBmaWxlIGlmIFVTRV9QUk9GSUxFIGlzIGRlZmluZWQgKi8KKyNpZmRlZiBVU0VfUFJPRklMRQorCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGNvbnN0YW50IGRlZmluaXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qIEFsbG93IHN1cHBvcnQgZm9yIGNhbGxpbmcgc3lzdGVtIGZjbnMgdG8gcGFyc2UgY29uZmlnIGZpbGUgKi8KKyNkZWZpbmUgX19LRVJORUxfU1lTQ0FMTFNfXworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaW5jbHVkZSBmaWxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDx3bF92ZXJzaW9uLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNkZWZpbmUgQklOX0RMIDEKKworI2luY2x1ZGUgPGRlYnVnLmg+CisjaW5jbHVkZSA8aGNmLmg+CisvLyNpbmNsdWRlIDxoY2ZkZWYuaD4KKworI2luY2x1ZGUgPHdsX2lmLmg+CisjaW5jbHVkZSA8d2xfaW50ZXJuYWwuaD4KKyNpbmNsdWRlIDx3bF91dGlsLmg+CisjaW5jbHVkZSA8d2xfZW5jLmg+CisjaW5jbHVkZSA8d2xfbWFpbi5oPgorI2luY2x1ZGUgPHdsX3Byb2ZpbGUuaD4KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2xvYmFsIHZhcmlhYmxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGVmaW5pdGlvbiBuZWVkZWQgdG8gcHJldmVudCB1bnJlc29sdmVkIGV4dGVybmFsIGluIHVuaXN0ZC5oICovCitzdGF0aWMgaW50IGVycm5vOworCisjaWYgREJHCitleHRlcm4gcF91MzIgICAgRGVidWdGbGFnOworZXh0ZXJuIGRiZ19pbmZvX3QgKkRiZ0luZm87CisjZW5kaWYKKworaW50IHBhcnNlX3llc19ubyggY2hhciogdmFsdWUgKTsKKworCitpbnQgcGFyc2VfeWVzX25vKCBjaGFyKiB2YWx1ZSApIHsKK2ludCByYyA9IDA7CQkJCQkJCQkJCS8vZGVmYXVsdCB0byBOTyBmb3IgaW52YWxpZCBwYXJhbWV0ZXJzCisKKwlpZiAoIHN0cmxlbiggdmFsdWUgKSA9PSAxICkgeworCQlpZiAoICggdmFsdWVbMF0gfCAoJ1knXid5JykgKSA9PSAneScgKSByYyA9IDE7CisvLwl9IGVsc2UgeworLy8JCXRoaXMgc2hvdWxkIG5vdCBiZSBkZWJ1ZyB0aW1lIGluZm8sIGl0IGlzIGFuIGVuZHVzZXIgZGF0YSBlbnRyeSBlcnJvciA7PworLy8JCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfTUlDUk9XQVZFX1JPQlVTVE5FU1MgKTsKKwl9CisJcmV0dXJuIHJjOworfSAvLyBwYXJzZV95ZXNfbm8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJcGFyc2VfY29uZmlnKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgZGV2aWNlJ3MgY29uZmlnIGZpbGUgYW5kIHBhcnNlcyB0aGUgb3B0aW9ucyBmcm9tCisgKiAgIGl0LCBzbyB0aGF0IGl0IGNhbiBwcm9wZXJseSBjb25maWd1cmUgaXRzZWxmLiBJZiBubyBjb25maWd1cmF0aW9uIGZpbGUKKyAqICAgb3IgY29uZmlndXJhdGlvbiBpcyBwcmVzZW50LCB0aGVuIGNvbnRpbnVlIHRvIHVzZSB0aGUgb3B0aW9ucyBhbHJlYWR5CisgKiAgIHBhcnNlZCBmcm9tIGNvbmZpZy5vcHRzIG9yIHdpcmVsZXNzLm9wdHMuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwYXJzZV9jb25maWcoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCWludAkJCQkgICAgZmlsZV9kZXNjOworI2lmIDAgLy8gQklOX0RMCisJaW50IAkgCQkJcmM7CisJY2hhcgkJCQkqY3AgPSBOVUxMOworI2VuZGlmIC8vIEJJTl9ETAorCWNoYXIgICAgICAgICAgICAgICAgYnVmZmVyW01BWF9MSU5FX1NJWkVdOworCWNoYXIgICAgICAgICAgICAgICAgZmlsZW5hbWVbTUFYX0xJTkVfU0laRV07CisJbW1fc2VnbWVudF90CSAgICBmczsKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICp3dmxhbl9jb25maWcgPSBOVUxMOworCUVOQ1NUUkNUICAgICAgICAgICAgc0VuY3J5cHRpb247CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJREJHX0ZVTkMoICJwYXJzZV9jb25maWciICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwkvKiBHZXQgdGhlIHdhdmVsYW4gc3BlY2lmaWMgaW5mbyBmb3IgdGhpcyBkZXZpY2UgKi8KKwl3dmxhbl9jb25maWcgPSAoc3RydWN0IHdsX3ByaXZhdGUgKilkZXYtPnByaXY7CisJaWYgKCB3dmxhbl9jb25maWcgPT0gTlVMTCApIHsKKwkJREJHX0VSUk9SKCBEYmdJbmZvLCAiV2F2ZWxhbiBzcGVjaWZpYyBpbmZvIHN0cnVjdCBub3QgcHJlc2VudD9cbiIgKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHNldHVwIHRoZSBkZWZhdWx0IGVuY3J5cHRpb24gc3RyaW5nICovCisJc3RyY3B5KCB3dmxhbl9jb25maWctPnN6RW5jcnlwdGlvbiwgREVGX0NSWVBUX1NUUiApOworCisJLyogT2J0YWluIGEgdXNlci1zcGFjZSBwcm9jZXNzIGNvbnRleHQsIHN0b3JpbmcgdGhlIG9yaWdpbmFsIGNvbnRleHQgKi8KKwlmcyA9IGdldF9mcyggKTsKKwlzZXRfZnMoIGdldF9kcyggKSk7CisKKwkvKiBEZXRlcm1pbmUgdGhlIGZpbGVuYW1lIGZvciB0aGlzIGRldmljZSBhbmQgYXR0ZW1wdCB0byBvcGVuIGl0ICovCisJc3ByaW50ZiggZmlsZW5hbWUsICIlcyVzIiwgUk9PVF9DT05GSUdfRklMRU5BTUUsIGRldi0+bmFtZSApOworCWZpbGVfZGVzYyA9IG9wZW4oIGZpbGVuYW1lLCBPX1JET05MWSwgMCApOworCWlmICggZmlsZV9kZXNjICE9IC0xICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJXaXJlbGVzcyBjb25maWcgZmlsZSBmb3VuZC4gUGFyc2luZyBvcHRpb25zLi4uXG4iICk7CisKKwkJLyogUmVhZCBvdXQgdGhlIG9wdGlvbnMgKi8KKwkJd2hpbGUoIHJlYWRsaW5lKCBmaWxlX2Rlc2MsIGJ1ZmZlciApKSB7CisJCQl0cmFuc2xhdGVfb3B0aW9uKCBidWZmZXIsIHd2bGFuX2NvbmZpZyApOworCQl9CisJCS8qIENsb3NlIHRoZSBmaWxlICovCisJCWNsb3NlKCBmaWxlX2Rlc2MgKTsJLy87P2V2ZW4gaWYgZmlsZV9kZXNjID09IC0xID8/PworCX0gZWxzZSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIk5vIGl3Y29uZmlnIGZpbGUgZm91bmQgZm9yIHRoaXMgZGV2aWNlOyAiCisJCQkJICAgImNvbmZpZy5vcHRzIG9yIHdpcmVsZXNzLm9wdHMgd2lsbCBiZSB1c2VkXG4iICk7CisJfQorCS8qIFJldHVybiB0byB0aGUgb3JpZ2luYWwgY29udGV4dCAqLworCXNldF9mcyggZnMgKTsKKworCS8qIGNvbnZlcnQgdGhlIFdFUCBrZXlzLCBpZiByZWFkIGluIGFzIGtleTEsIGtleTIsIHR5cGUgb2YgZGF0YSAqLworCWlmICggd3ZsYW5fY29uZmlnLT5FbmFibGVFbmNyeXB0aW9uICkgeworCQltZW1zZXQoICZzRW5jcnlwdGlvbiwgMCwgc2l6ZW9mKCBzRW5jcnlwdGlvbiApKTsKKworCQl3bF93ZXBfZGVjb2RlKCBDUllQVF9DT0RFLCAmc0VuY3J5cHRpb24sCisJCQkJCQkgICB3dmxhbl9jb25maWctPnN6RW5jcnlwdGlvbiApOworCisJCS8qIHRoZSBMaW51eCBkcml2ZXIgbGlrZXMgdG8gdXNlIDEtNCBmb3IgdGhlIGtleSBJRHMsIGFuZCB0aGVuCisJCSAgIGNvbnZlcnQgdG8gMC0zIHdoZW4gc2VuZGluZyB0byB0aGUgY2FyZC4gIFRoZSBXaW5kb3dzIGNvZGUKKwkJICAgYmFzZSB1c2VkIDAtMyBpbiB0aGUgQVBJIERMTCwgd2hpY2ggd2FzIHBvcnRlZCB0byBMaW51eC4gIEZvcgorCQkgICB0aGUgc2FrZSBvZiB0aGUgdXNlciBleHBlcmllbmNlLCB3ZSBkZWNpZGVkIHRvIGtlZXAgMC0zIGFzIHRoZQorCQkgICBudW1iZXJzIHVzZWQgaW4gdGhlIERMTDsgYW5kIHdpbGwgcGVyZm9ybSB0aGUgKzEgY29udmVyc2lvbiBoZXJlLgorCQkgICBXZSBjb3VsZCBoYXZlIGNvbnZlcnRlZCAgdGhlIGVudGlyZSBMaW51eCBkcml2ZXIsIGJ1dCB0aGlzIGlzCisJCSAgIGxlc3Mgb2J0cnVzaXZlLiAgVGhpcyBtYXkgYmUgYSAidG9kbyIgdG8gY29udmVydCB0aGUgd2hvbGUgZHJpdmVyICovCisJCXNFbmNyeXB0aW9uLndFbmFibGVkID0gd3ZsYW5fY29uZmlnLT5FbmFibGVFbmNyeXB0aW9uOworCQlzRW5jcnlwdGlvbi53VHhLZXlJRCA9IHd2bGFuX2NvbmZpZy0+VHJhbnNtaXRLZXlJRCAtIDE7CisKKwkJbWVtY3B5KCAmc0VuY3J5cHRpb24uRW5jU3RyLCAmd3ZsYW5fY29uZmlnLT5EZWZhdWx0S2V5cywKKwkJCQlzaXplb2YoIENGR19ERUZBVUxUX0tFWVNfU1RSQ1QgKSk7CisKKwkJbWVtc2V0KCB3dmxhbl9jb25maWctPnN6RW5jcnlwdGlvbiwgMCwgc2l6ZW9mKCB3dmxhbl9jb25maWctPnN6RW5jcnlwdGlvbiApKTsKKworCQl3bF93ZXBfY29kZSggQ1JZUFRfQ09ERSwgd3ZsYW5fY29uZmlnLT5zekVuY3J5cHRpb24sICZzRW5jcnlwdGlvbiwKKwkJCQkJCSBzaXplb2YoIHNFbmNyeXB0aW9uICkpOworCX0KKworCS8qIGRlY29kZSB0aGUgZW5jcnlwdGlvbiBzdHJpbmcgZm9yIHRoZSBjYWxsIHRvIHdsX2NvbW1pdCgpICovCisJd2xfd2VwX2RlY29kZSggQ1JZUFRfQ09ERSwgJnNFbmNyeXB0aW9uLCB3dmxhbl9jb25maWctPnN6RW5jcnlwdGlvbiApOworCisJd3ZsYW5fY29uZmlnLT5UcmFuc21pdEtleUlEICAgID0gc0VuY3J5cHRpb24ud1R4S2V5SUQgKyAxOworCXd2bGFuX2NvbmZpZy0+RW5hYmxlRW5jcnlwdGlvbiA9IHNFbmNyeXB0aW9uLndFbmFibGVkOworCisJbWVtY3B5KCAmd3ZsYW5fY29uZmlnLT5EZWZhdWx0S2V5cywgJnNFbmNyeXB0aW9uLkVuY1N0ciwKKwkJCXNpemVvZiggQ0ZHX0RFRkFVTFRfS0VZU19TVFJDVCApKTsKKworI2lmIDAgLy9CSU5fREwKKwkJLyogT2J0YWluIGEgdXNlci1zcGFjZSBwcm9jZXNzIGNvbnRleHQsIHN0b3JpbmcgdGhlIG9yaWdpbmFsIGNvbnRleHQgKi8KKwkJZnMgPSBnZXRfZnMoICk7CisJCXNldF9mcyggZ2V0X2RzKCApKTsKKworCQkvLzs/anVzdCB0byBmYWtlIHNvbWV0aGluZworCQlzdHJjcHkoLyp3dmxhbl9jb25maWctPmZ3X2ltYWdlXyovZmlsZW5hbWUsICIvZXRjL2FnZXJlL2Z3LmJpbiIgKTsKKwkJZmlsZV9kZXNjID0gb3BlbiggLyp3dmxhbl9jb25maWctPmZ3X2ltYWdlXyovZmlsZW5hbWUsIDAsIDAgKTsKKwkJaWYgKCBmaWxlX2Rlc2MgPT0gLTEgKSB7CisJCQlEQkdfRVJST1IoIERiZ0luZm8sICJObyBpbWFnZSBmaWxlIGZvdW5kXG4iICk7CisJCX0gZWxzZSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJGL1cgaW1hZ2UgZmlsZSBmb3VuZFxuIiApOworI2RlZmluZSBESEZfQUxMT0NfU0laRSA5NjAwMAkJCS8vanVzdCBiZWxvdyA5NkssIGxldCdzIGhvcGUgaXQgc3VmZmljZXMgZm9yIG5vdyBhbmQgZm9yIHRoZSBmdXR1cmUKKwkJCWNwID0gKGNoYXIqKXZtYWxsb2MoIERIRl9BTExPQ19TSVpFICk7CisJCQlpZiAoIGNwID09IE5VTEwgKSB7CisJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiZXJyb3IgaW4gdm1hbGxvY1xuIiApOworCQkJfSBlbHNlIHsKKwkJCQlyYyA9IHJlYWQoIGZpbGVfZGVzYywgY3AsIERIRl9BTExPQ19TSVpFICk7CisJCQkJaWYgKCByYyA9PSBESEZfQUxMT0NfU0laRSApIHsKKwkJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiYnVmZmVyIHRvbyBzbWFsbCwgJWRcbiIsIERIRl9BTExPQ19TSVpFICk7CisJCQkJfSBlbHNlIGlmICggcmMgPiAwICkgeworCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJyZWFkIE8uSy46ICVkIGJ5dGVzICAlLjEyc1xuIiwgcmMsIGNwICk7CisJCQkJCXJjID0gcmVhZCggZmlsZV9kZXNjLCAmY3BbcmNdLCAxICk7CisJCQkJCWlmICggcmMgPT0gMCApIHsKKwkJCQkJCURCR19UUkFDRSggRGJnSW5mbywgIm5vIG1vcmUgdG8gcmVhZFxuIiApOworCQkJCQl9CisJCQkJfQorCQkJCWlmICggcmMgIT0gMCApIHsKKwkJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiZmlsZSBub3QgcmVhZCBpbiBvbmUgc3dvb3Agb3Igb3RoZXIgZXJyb3IiXAorCQkJCQkJCQkJCSIsIGdpdmUgdXAsIHRvbyBjb21wbGljYXRlZCwgcmMgPSAlMFhcbiIsIHJjICk7CisJCQkJfQorCQkJCXZmcmVlKCBjcCApOworCQkJfQorCQkJY2xvc2UoIGZpbGVfZGVzYyApOworCQl9CisJCXNldF9mcyggZnMgKTsJCQkvKiBSZXR1cm4gdG8gdGhlIG9yaWdpbmFsIGNvbnRleHQgKi8KKyNlbmRpZiAvLyBCSU5fREwKKworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybjsKK30gLy8gcGFyc2VfY29uZmlnCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglyZWFkbGluZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gcmVhZHMgaW4gZGF0YSBmcm9tIGEgZ2l2ZW4gZmlsZSBvbmUgbGluZSBhdCBhIHRpbWUsCisgKiAgIGNvbnZlcnRpbmcgdGhlIGRldGVjdGVkIG5ld2xpbmUgY2hhcmFjdGVyICdcbicgdG8gYSBudWxsICdcMCcuIE5vdGUgdGhhdAorICogICB0aGUgZmlsZSBkZXNjcmlwdG9yIG11c3QgYmUgdmFsaWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGZpbGVkZXNjICAgIC0gdGhlIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIG9wZW4gY29uZmlndXJhdGlvbiBmaWxlCisgKiAgICAgIGJ1ZmZlciAgICAgIC0gYSBidWZmZXIgcG9pbnRlciwgcGFzc2VkIGluIGJ5IHRoZSBjYWxsZXIsIHRvIHdoaWNoIHRoZQorICogICAgICAgICAgICAgICAgICAgIGxpbmUgd2lsbCBiZSBzdG9yZWQuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQKKyAqICAgICAgLTEgb24gZXJyb3IKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHJlYWRsaW5lKCBpbnQgZmlsZWRlc2MsIGNoYXIgKmJ1ZmZlciApCit7CisJaW50IHJlc3VsdCA9IC0xOworCWludCBieXRlc19yZWFkID0gMDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkvKiBNYWtlIHN1cmUgdGhlIGZpbGUgZGVzY3JpcHRvciBpcyBnb29kICovCisJaWYgKCBmaWxlZGVzYyAhPSAtMSApIHsKKwkJLyogUmVhZCBpbiBmcm9tIHRoZSBmaWxlIGJ5dGUgYnkgYnl0ZSB1bnRpbCBhIG5ld2xpbmUgaXMgcmVhY2hlZCAqLworCQl3aGlsZSgoIHJlc3VsdCA9IHJlYWQoIGZpbGVkZXNjLCAmYnVmZmVyW2J5dGVzX3JlYWRdLCAxICkpID09IDEgKSB7CisJCQlpZiAoIGJ1ZmZlcltieXRlc19yZWFkXSA9PSAnXG4nICkgeworCQkJCWJ1ZmZlcltieXRlc19yZWFkXSA9ICdcMCc7CisJCQkJYnl0ZXNfcmVhZCsrOworCQkJCWJyZWFrOworCQkJfQorCQkJYnl0ZXNfcmVhZCsrOworCQl9CisJfQorCisJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCAqLworCWlmICggcmVzdWx0ID09IC0xICkgeworCQlyZXR1cm4gcmVzdWx0OworCX0gZWxzZSB7CisJCXJldHVybiBieXRlc19yZWFkOworCX0KK30gLy8gcmVhZGxpbmUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl0cmFuc2xhdGVfb3B0aW9uKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGxpbmUgcmVhZCBpbiBmcm9tIHRoZSBjb25maWcgZmlsZSBhbmQgcGFyc2VzIG91dAorICogICB0aGUga2V5L3ZhbHVlIHBhaXJzLiBJdCB0aGVuIGRldGVybWluZXMgd2hpY2gga2V5IGhhcyBiZWVuIHBhcnNlZCBhbmQgc2V0cworICogICB0aGUgY2FyZCdzIGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gdGhlIHZhbHVlIGdpdmVuLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgYnVmZmVyIC0gYSBidWZmZXIgY29udGFpbmluZyBhIGxpbmUgdG8gdHJhbnNsYXRlCisgKiAgICAgIGNvbmZpZyAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHJhbnNsYXRlX29wdGlvbiggY2hhciAqYnVmZmVyLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworCXVuc2lnbmVkIGludCB2YWx1ZV9jb252ZXJ0ID0gMDsKKwlpbnQgc3RyaW5nX2xlbmd0aCA9IDA7CisJY2hhciAqa2V5ID0gTlVMTDsKKwljaGFyICp2YWx1ZSA9IE5VTEw7CisJdV9jaGFyIG1hY192YWx1ZVtFVEhfQUxFTl07CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJREJHX0ZVTkMoICJ0cmFuc2xhdGVfb3B0aW9uIiApOworCisJaWYgKCBidWZmZXIgPT0gTlVMTCB8fCBscCA9PSBOVUxMICkgeworCQlEQkdfRVJST1IoIERiZ0luZm8sICJDb25maWcgZmlsZSBidWZmZXIgYW5kL29yIHdhdmVsYW4gYnVmZmVyIHB0ciBOVUxMXG4iICk7CisJCXJldHVybjsKKwl9CisKKwlQYXJzZUNvbmZpZ0xpbmUoIGJ1ZmZlciwgJmtleSwgJnZhbHVlICk7CisKKwlpZiAoIGtleSA9PSBOVUxMIHx8IHZhbHVlID09IE5VTEwgKSB7CisJCXJldHVybjsKKwl9CisKKwkvKiBEZXRlcm1pbmUgd2hpY2gga2V5IGl0IGlzIGFuZCBwZXJmb3JtIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb24gKi8KKworCS8qIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyB1c2VkIGluIGFsbCBzY2VuYXJpb3MgKi8KKyNpZiBEQkcKKwkvKiBoYW5kbGUgRGVidWdGbGFnIGFzIGVhcmx5IGFzIHBvc3NpYmxlIHNvIGl0IHN0YXJ0cyBpdHMgaW5mbHVlbmNlIGFzIGVhcmx5CisJICogYXMgcG9zc2libGUKKwkgKi8KKwlpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfREVCVUdfRkxBRyApID09IDAgKSB7CisJCWlmICggRGVidWdGbGFnID09IH4wICkgewkJCS8vaWYgRGVidWdGbGFnIGlzIG5vdCBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZQorCQkJaWYgKCBEYmdJbmZvLT5EZWJ1Z0ZsYWcgPT0gMCApIHsJLyogaWYgcGNfZGVidWcgZGlkIG5vdCBzZXQgRGVidWdGbGFnIChpLmUucGNfZGVidWcgaXMKKwkJCQkJCQkJCQkJICogbm90IHNwZWNpZmllZCBvciBzcGVjaWZpZWQgb3V0c2lkZSB0aGUgNC04IHJhbmdlCisJCQkJCQkJCQkJCSAqLworCQkJCURiZ0luZm8tPkRlYnVnRmxhZyB8PSBEQkdfREVGQVVMVFM7CisJCQl9CisJCX0gZWxzZSB7CisJCQlEYmdJbmZvLT5EZWJ1Z0ZsYWcgPSB3bF9hdG9pKCB2YWx1ZSApOyAvLzs/RGVidWdGbGFnOworCQl9CisJCURiZ0luZm8tPkRlYnVnRmxhZyA9IHdsX2F0b2koIHZhbHVlICk7IC8vOz9EZWxldGUgQVNBUAorCX0KKyNlbmRpZiAvKiBEQkcgKi8KKwlpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfQVVUSF9LRVlfTUdNVF9TVUlURSApID09IDAgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9BVVRIX0tFWV9NR01UX1NVSVRFLCB2YWx1ZSApOworCisJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX0FVVEhfS0VZX01HTVRfU1VJVEUgKSB8fCAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfQVVUSF9LRVlfTUdNVF9TVUlURSApKSB7CisJCQlscC0+QXV0aEtleU1nbXRTdWl0ZSA9IHZhbHVlX2NvbnZlcnQ7CisJCX0gZWxzZSB7CisJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0FVVEhfS0VZX01HTVRfU1VJVEUgKTsKKwkJfQorCX0KKwllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9CUlNDXzJHSFogKSA9PSAwICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfQlJTQ18yR0haLCB2YWx1ZSApOworCisJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX0JSU0MgKSB8fCAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfQlJTQyApKSB7CisJCQlscC0+YnJzY1swXSA9IHZhbHVlX2NvbnZlcnQ7CisJCX0gZWxzZSB7CisJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfQlJTQ18yR0haICk7CisJCX0KKwl9CisJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfQlJTQ181R0haICkgPT0gMCApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0JSU0NfNUdIWiwgdmFsdWUgKTsKKworCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9CUlNDICkgfHwgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX0JSU0MgKSkgeworCQkJbHAtPmJyc2NbMV0gPSB2YWx1ZV9jb252ZXJ0OworCQl9IGVsc2UgeworCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0JSU0NfNUdIWiApOworCQl9CisJfQorCWVsc2UgaWYgKCggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9ERVNJUkVEX1NTSUQgKSA9PSAwICkgfHwgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX09XTl9TU0lEICkgPT0gMCApKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIlNTSUQsIHZhbHVlOiAlc1xuIiwgdmFsdWUgKTsKKworCQltZW1zZXQoIGxwLT5OZXR3b3JrTmFtZSwgMCwgKCBQQVJNX01BWF9OQU1FX0xFTiArIDEgKSk7CisKKwkJLyogTWFrZSBzdXJlIHRoZSB2YWx1ZSBpc24ndCB0b28gbG9uZyAqLworCQlzdHJpbmdfbGVuZ3RoID0gc3RybGVuKCB2YWx1ZSApOworCQlpZiAoIHN0cmluZ19sZW5ndGggPiBQQVJNX01BWF9OQU1FX0xFTiApIHsKKwkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiU1NJRCB0b28gbG9uZzsgd2lsbCBiZSB0cnVuY2F0ZWRcbiIgKTsKKwkJCXN0cmluZ19sZW5ndGggPSBQQVJNX01BWF9OQU1FX0xFTjsKKwkJfQorCisJCW1lbWNweSggbHAtPk5ldHdvcmtOYW1lLCB2YWx1ZSwgc3RyaW5nX2xlbmd0aCApOworCX0KKyNpZiAwCisJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfRE9XTkxPQURfRklSTVdBUkUgKSA9PSAwICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJET1dOTE9BRF9GSVJNV0FSRSwgdmFsdWU6ICVzXG4iLCB2YWx1ZSApOworCQltZW1zZXQoIGxwLT5md19pbWFnZV9maWxlbmFtZSwgMCwgKCBNQVhfTElORV9TSVpFICsgMSApKTsKKwkJLyogTWFrZSBzdXJlIHRoZSB2YWx1ZSBpc24ndCB0b28gbG9uZyAqLworCQlzdHJpbmdfbGVuZ3RoID0gc3RybGVuKCB2YWx1ZSApOworCQlpZiAoIHN0cmluZ19sZW5ndGggPiBNQVhfTElORV9TSVpFICkgeworCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICJGL1cgaW1hZ2UgZmlsZSBuYW1lIHRvbyBsb25nOyB3aWxsIGJlIGlnbm9yZWRcbiIgKTsKKwkJfSBlbHNlIHsKKwkJCW1lbWNweSggbHAtPmZ3X2ltYWdlX2ZpbGVuYW1lLCB2YWx1ZSwgc3RyaW5nX2xlbmd0aCApOworCQl9CisJfQorI2VuZGlmCisJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfRU5BQkxFX0VOQ1JZUFRJT04gKSA9PSAwICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfRU5BQkxFX0VOQ1JZUFRJT04sIHZhbHVlICk7CisKKwkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fRU5BQkxFX0VOQ1JZUFRJT04gKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfRU5BQkxFX0VOQ1JZUFRJT04gKSkgeworCQkJbHAtPkVuYWJsZUVuY3J5cHRpb24gPSB2YWx1ZV9jb252ZXJ0OworCQl9IGVsc2UgeworCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9FTkFCTEVfRU5DUllQVElPTiApOworCQl9CisJfQorCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0VOQ1JZUFRJT04gKSA9PSAwICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfRU5DUllQVElPTiwgdmFsdWUgKTsKKworCQltZW1zZXQoIGxwLT5zekVuY3J5cHRpb24sIDAsIHNpemVvZiggbHAtPnN6RW5jcnlwdGlvbiApKTsKKworCQkvKiBNYWtlIHN1cmUgdGhlIHZhbHVlIGlzbid0IHRvbyBsb25nICovCisJCXN0cmluZ19sZW5ndGggPSBzdHJsZW4oIHZhbHVlICk7CisJCWlmICggc3RyaW5nX2xlbmd0aCA+IHNpemVvZiggbHAtPnN6RW5jcnlwdGlvbiApICkgeworCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyB0b28gbG9uZzsgd2lsbCBiZSB0cnVuY2F0ZWRcbiIsIFBBUk1fTkFNRV9FTkNSWVBUSU9OICk7CisJCQlzdHJpbmdfbGVuZ3RoID0gc2l6ZW9mKCBscC0+c3pFbmNyeXB0aW9uICk7CisJCX0KKworCQltZW1jcHkoIGxwLT5zekVuY3J5cHRpb24sIHZhbHVlLCBzdHJpbmdfbGVuZ3RoICk7CisJfQorCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0tFWTEgKSA9PSAwICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfS0VZMSwgdmFsdWUgKTsKKworCQlpZiAoIGlzX3ZhbGlkX2tleV9zdHJpbmcoIHZhbHVlICkpIHsKKwkJCW1lbXNldCggbHAtPkRlZmF1bHRLZXlzLmtleVswXS5rZXksIDAsIE1BWF9LRVlfU0laRSApOworCisJCQlrZXlfc3RyaW5nMmtleSggdmFsdWUsICZscC0+RGVmYXVsdEtleXMua2V5WzBdICk7CisJCX0gZWxzZSB7CisJCQkgREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9LRVkxICk7CisJCX0KKwl9CisJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfS0VZMiApID09IDAgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9LRVkyLCB2YWx1ZSApOworCisJCWlmICggaXNfdmFsaWRfa2V5X3N0cmluZyggdmFsdWUgKSkgeworCQkJbWVtc2V0KCBscC0+RGVmYXVsdEtleXMua2V5WzFdLmtleSwgMCwgTUFYX0tFWV9TSVpFICk7CisKKwkJCWtleV9zdHJpbmcya2V5KCB2YWx1ZSwgJmxwLT5EZWZhdWx0S2V5cy5rZXlbMV0gKTsKKwkJfSBlbHNlIHsKKwkJCSBEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0tFWTIgKTsKKwkJfQorCX0KKwllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9LRVkzICkgPT0gMCApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0tFWTMsIHZhbHVlICk7CisKKwkJaWYgKCBpc192YWxpZF9rZXlfc3RyaW5nKCB2YWx1ZSApKSB7CisJCQltZW1zZXQoIGxwLT5EZWZhdWx0S2V5cy5rZXlbMl0ua2V5LCAwLCBNQVhfS0VZX1NJWkUgKTsKKworCQkJa2V5X3N0cmluZzJrZXkoIHZhbHVlLCAmbHAtPkRlZmF1bHRLZXlzLmtleVsyXSApOworCQl9IGVsc2UgeworCQkJIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfS0VZMyApOworCQl9CisJfQorCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0tFWTQgKSA9PSAwICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfS0VZNCwgdmFsdWUgKTsKKworCQlpZiAoIGlzX3ZhbGlkX2tleV9zdHJpbmcoIHZhbHVlICkpIHsKKwkJCW1lbXNldCggbHAtPkRlZmF1bHRLZXlzLmtleVszXS5rZXksIDAsIE1BWF9LRVlfU0laRSApOworCisJCQlrZXlfc3RyaW5nMmtleSggdmFsdWUsICZscC0+RGVmYXVsdEtleXMua2V5WzNdICk7CisJCX0gZWxzZSB7CisJCQkgREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9LRVk0ICk7CisJCX0KKwl9CisJLyogTmV3IFBhcmFtZXRlcnMgZm9yIFdBUlAgKi8KKwllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9MT0FEX0JBTEFOQ0lORyApID09IDAgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9MT0FEX0JBTEFOQ0lORywgdmFsdWUgKTsKKwkJbHAtPmxvYWRCYWxhbmNpbmcgPSBwYXJzZV95ZXNfbm8odmFsdWUpOworCX0KKwllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9NRURJVU1fRElTVFJJQlVUSU9OICkgPT0gMCApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX01FRElVTV9ESVNUUklCVVRJT04sIHZhbHVlICk7CisJCWxwLT5tZWRpdW1EaXN0cmlidXRpb24gPSBwYXJzZV95ZXNfbm8odmFsdWUpOworCX0KKwllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9NSUNST1dBVkVfUk9CVVNUTkVTUykgPT0gMCApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX01JQ1JPV0FWRV9ST0JVU1RORVNTLCB2YWx1ZSApOworCQlscC0+TWljcm93YXZlUm9idXN0bmVzcyA9IHBhcnNlX3llc19ubyh2YWx1ZSk7CisJfQorCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX01VTFRJQ0FTVF9SQVRFICkgPT0gMCApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX01VTFRJQ0FTVF9SQVRFLCB2YWx1ZSApOworCisJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCisJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fTVVMVElDQVNUX1JBVEUgKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfTVVMVElDQVNUX1JBVEUgKSkgeworCQkJbHAtPk11bHRpY2FzdFJhdGVbMF0gPSB2YWx1ZV9jb252ZXJ0OworCQl9IGVsc2UgeworCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9NVUxUSUNBU1RfUkFURSApOworCQl9CisJfQorCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX09XTl9DSEFOTkVMICkgPT0gMCApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX09XTl9DSEFOTkVMLCB2YWx1ZSApOworCisJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQlpZiAoIHdsX2lzX2FfdmFsaWRfY2hhbiggdmFsdWVfY29udmVydCApKSB7CisJCQlpZiAoIHZhbHVlX2NvbnZlcnQgPiAxNCApIHsKKwkJCQl2YWx1ZV9jb252ZXJ0ID0gdmFsdWVfY29udmVydCB8IDB4MTAwOworCQkJfQorCQkJbHAtPkNoYW5uZWwgPSB2YWx1ZV9jb252ZXJ0OworCQl9IGVsc2UgeworCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9PV05fQ0hBTk5FTCApOworCQl9CisJfQorCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX09XTl9OQU1FICkgPT0gMCApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX09XTl9OQU1FLCB2YWx1ZSApOworCisJCW1lbXNldCggbHAtPlN0YXRpb25OYW1lLCAwLCAoIFBBUk1fTUFYX05BTUVfTEVOICsgMSApKTsKKworCQkvKiBNYWtlIHN1cmUgdGhlIHZhbHVlIGlzbid0IHRvbyBsb25nICovCisJCXN0cmluZ19sZW5ndGggPSBzdHJsZW4oIHZhbHVlICk7CisJCWlmICggc3RyaW5nX2xlbmd0aCA+IFBBUk1fTUFYX05BTUVfTEVOICkgeworCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyB0b28gbG9uZzsgd2lsbCBiZSB0cnVuY2F0ZWRcbiIsIFBBUk1fTkFNRV9PV05fTkFNRSApOworCQkJc3RyaW5nX2xlbmd0aCA9IFBBUk1fTUFYX05BTUVfTEVOOworCQl9CisKKwkJbWVtY3B5KCBscC0+U3RhdGlvbk5hbWUsIHZhbHVlLCBzdHJpbmdfbGVuZ3RoICk7CisJfQorCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQgKSA9PSAwICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRCwgdmFsdWUgKTsKKworCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9SVFNfVEhSRVNIT0xEICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1JUU19USFJFU0hPTEQgKSkgeworCQkJbHAtPlJUU1RocmVzaG9sZCA9IHZhbHVlX2NvbnZlcnQ7CisJCX0gZWxzZSB7CisJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQgKTsKKwkJfQorCX0KKwllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9TUlNDXzJHSFogKSA9PSAwICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfU1JTQ18yR0haLCB2YWx1ZSApOworCisJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1NSU0MgKSB8fCAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfU1JTQyApKSB7CisJCQlscC0+c3JzY1swXSA9IHZhbHVlX2NvbnZlcnQ7CisJCX0gZWxzZSB7CisJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfU1JTQ18yR0haICk7CisJCX0KKwl9CisJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfU1JTQ181R0haICkgPT0gMCApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1NSU0NfNUdIWiwgdmFsdWUgKTsKKworCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9TUlNDICkgfHwgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1NSU0MgKSkgeworCQkJbHAtPnNyc2NbMV0gPSB2YWx1ZV9jb252ZXJ0OworCQl9IGVsc2UgeworCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1NSU0NfNUdIWiApOworCQl9CisJfQorCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1NZU1RFTV9TQ0FMRSApID09IDAgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9TWVNURU1fU0NBTEUsIHZhbHVlICk7CisKKwkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fU1lTVEVNX1NDQUxFICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1NZU1RFTV9TQ0FMRSApKSB7CisJCQlscC0+RGlzdGFuY2VCZXR3ZWVuQVBzID0gdmFsdWVfY29udmVydDsKKwkJfSBlbHNlIHsKKwkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfU1lTVEVNX1NDQUxFICk7CisJCX0KKwl9CisJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfVFhfS0VZICkgPT0gMCApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1RYX0tFWSwgdmFsdWUgKTsKKworCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9UWF9LRVkgKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfVFhfS0VZICkpIHsKKwkJCWxwLT5UcmFuc21pdEtleUlEID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJfSBlbHNlIHsKKwkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfVFhfS0VZICk7CisJCX0KKwl9CisJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfVFhfUkFURSApID09IDAgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9UWF9SQVRFLCB2YWx1ZSApOworCisJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1RYX1JBVEUgKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfVFhfUkFURSApKSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFswXSA9IHZhbHVlX2NvbnZlcnQ7CisJCX0gZWxzZSB7CisJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1RYX1JBVEUgKTsKKwkJfQorCX0KKwllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9UWF9QT1dfTEVWRUwgKSA9PSAwICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfVFhfUE9XX0xFVkVMLCB2YWx1ZSApOworCisJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1RYX1BPV19MRVZFTCApIHx8ICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9UWF9QT1dfTEVWRUwgKSkgeworCQkJbHAtPnR4UG93TGV2ZWwgPSB2YWx1ZV9jb252ZXJ0OworCQl9IGVsc2UgeworCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9UWF9QT1dfTEVWRUwgKTsKKwkJfQorCX0KKworCS8qIE5lZWQgdG8gYWRkPyA6IENvdW50cnkgY29kZSwgU2hvcnQvTG9uZyByZXRyeSAqLworCisJLyogQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIHNwZWNpZmljIHRvIFNUQSBtb2RlICovCisjaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9TVEEKKy8vOz9zZWVtcyByZWFzb25hYmxlIHRoYXQgZXZlbiBhbiBBUC1vbmx5IGRyaXZlciBjb3VsZCBhZmZvcmQgdGhpcyBzbWFsbCBhZGRpdGlvbmFsIGZvb3RwcmludAorCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfU1RBICApIHsKKwkJCQkJLy87P3Nob3VsZCB3ZSByZXR1cm4gYW4gZXJyb3Igc3RhdHVzIGluIEFQIG1vZGUKKwkJaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1BPUlRfVFlQRSApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfUE9SVF9UWVBFLCB2YWx1ZSApOworCisJCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPT0gUEFSTV9NSU5fUE9SVF9UWVBFICkgfHwgKCB2YWx1ZV9jb252ZXJ0ID09IFBBUk1fTUFYX1BPUlRfVFlQRSApKSB7CisJCQkJbHAtPlBvcnRUeXBlID0gdmFsdWVfY29udmVydDsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9QT1JUX1RZUEUgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9QTV9FTkFCTEVEICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9QTV9FTkFCTEVELCB2YWx1ZSApOworCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJLyogOz8gaG93IGFib3V0IHdsX21haW4uYyBjb250YWluaW5nCisJICogVkFMSURfUEFSQU0oIFBBUk1fUE1fRU5BQkxFRCA8PSBXVkxBTl9QTV9TVEFURV9TVEFOREFSRCB8fAorCSAqCQkJCQkgKCBQQVJNX1BNX0VOQUJMRUQgJiAweDdGRkYgKSA8PSBXVkxBTl9QTV9TVEFURV9TVEFOREFSRCApOworCSAqLworCQkJaWYgKCAoIHZhbHVlX2NvbnZlcnQgJiAweDdGRkYgKSA8PSBQQVJNX01BWF9QTV9FTkFCTEVEKSB7CisJCQkJbHAtPlBNRW5hYmxlZCA9IHZhbHVlX2NvbnZlcnQ7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfUE1fRU5BQkxFRCApOworCQkJCS8vOz90aGlzIGlzIGEgZGF0YSBlbnRyeSBlcnJvciwgaGVuY2Ugbm90IGEgREJHX1dBUk5JTkcKKwkJCX0KKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9DUkVBVEVfSUJTUyApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfQ1JFQVRFX0lCU1MsIHZhbHVlICk7CisJCQlscC0+Q3JlYXRlSUJTUyA9IHBhcnNlX3llc19ubyh2YWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfTVVMVElDQVNUX1JYICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9NVUxUSUNBU1RfUlgsIHZhbHVlICk7CisJCQlscC0+TXVsdGljYXN0UmVjZWl2ZSA9IHBhcnNlX3llc19ubyh2YWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfTUFYX1NMRUVQICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9NQVhfU0xFRVAsIHZhbHVlICk7CisKKwkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQkJaWYgKCggdmFsdWVfY29udmVydCA+PSAwICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IDY1NTM1ICkpIHsKKwkJCQlscC0+TWF4U2xlZXBEdXJhdGlvbiA9IHZhbHVlX2NvbnZlcnQ7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfTUFYX1NMRUVQICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfTkVUV09SS19BRERSICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9ORVRXT1JLX0FERFIsIHZhbHVlICk7CisKKwkJCWlmICggcGFyc2VfbWFjX2FkZHJlc3MoIHZhbHVlLCBtYWNfdmFsdWUgKSA9PSBFVEhfQUxFTiApIHsKKwkJCQltZW1jcHkoIGxwLT5NQUNBZGRyZXNzLCBtYWNfdmFsdWUsIEVUSF9BTEVOICk7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfTkVUV09SS19BRERSICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfQVVUSEVOVElDQVRJT04gKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0FVVEhFTlRJQ0FUSU9OLCB2YWx1ZSApOworCisJCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fQVVUSEVOVElDQVRJT04gKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfQVVUSEVOVElDQVRJT04gKSkgeworCQkJCWxwLT5hdXRoZW50aWNhdGlvbiA9IHZhbHVlX2NvbnZlcnQ7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfQVVUSEVOVElDQVRJT04gKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9PV05fQVRJTV9XSU5ET1cgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX09XTl9BVElNX1dJTkRPVywgdmFsdWUgKTsKKworCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX09XTl9BVElNX1dJTkRPVyApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9PV05fQVRJTV9XSU5ET1cgKSkgeworCQkJCWxwLT5hdGltV2luZG93ID0gdmFsdWVfY29udmVydDsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9PV05fQVRJTV9XSU5ET1cgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9QTV9IT0xET1ZFUl9EVVJBVElPTiApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfUE1fSE9MRE9WRVJfRFVSQVRJT04sIHZhbHVlICk7CisKKwkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9QTV9IT0xET1ZFUl9EVVJBVElPTiApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9QTV9IT0xET1ZFUl9EVVJBVElPTiApKSB7CisJCQkJbHAtPmhvbGRvdmVyRHVyYXRpb24gPSB2YWx1ZV9jb252ZXJ0OworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1BNX0hPTERPVkVSX0RVUkFUSU9OICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfUFJPTUlTQ1VPVVNfTU9ERSApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfUFJPTUlTQ1VPVVNfTU9ERSwgdmFsdWUgKTsKKwkJCWxwLT5wcm9taXNjdW91c01vZGUgPSBwYXJzZV95ZXNfbm8odmFsdWUpOworCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0NPTk5FQ1RJT05fQ09OVFJPTCApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfQ09OTkVDVElPTl9DT05UUk9MLCB2YWx1ZSApOworCisJCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fQ09OTkVDVElPTl9DT05UUk9MICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX0NPTk5FQ1RJT05fQ09OVFJPTCApKSB7CisJCQkJbHAtPmNvbm5lY3Rpb25Db250cm9sID0gdmFsdWVfY29udmVydDsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9DT05ORUNUSU9OX0NPTlRST0wgKTsKKwkJCX0KKwkJfQorCisJCS8qIE5lZWQgdG8gYWRkPyA6IFByb2JlIERhdGEgUmF0ZSAqLworCX0KKyNlbmRpZiAgLyogKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQSAqLworCisJLyogQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIHNwZWNpZmljIHRvIEFQIG1vZGUgKi8KKyNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCisJCS8vOz9zaG91bGQgd2UgcmVzdG9yZSB0aGlzIHRvIGFsbG93IHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludAorCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfQVAgICkgeworCQlpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfT1dOX0RUSU1fUEVSSU9EICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9PV05fRFRJTV9QRVJJT0QsIHZhbHVlICk7CisKKwkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQkJaWYgKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX09XTl9EVElNX1BFUklPRCApIHsKKwkJCQlscC0+RFRJTVBlcmlvZCA9IHZhbHVlX2NvbnZlcnQ7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfT1dOX0RUSU1fUEVSSU9EICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfUkVKRUNUX0FOWSApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfUkVKRUNUX0FOWSwgdmFsdWUgKTsKKwkJCWxwLT5SZWplY3RBbnkgPSBwYXJzZV95ZXNfbm8odmFsdWUpOworCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0VYQ0xVREVfVU5FTkNSWVBURUQgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0VYQ0xVREVfVU5FTkNSWVBURUQsIHZhbHVlICk7CisJCQlscC0+RXhjbHVkZVVuZW5jcnlwdGVkID0gcGFyc2VfeWVzX25vKHZhbHVlKTsKKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9NVUxUSUNBU1RfUE1fQlVGRkVSSU5HICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9NVUxUSUNBU1RfUE1fQlVGRkVSSU5HLCB2YWx1ZSApOworCQkJbHAtPkV4Y2x1ZGVVbmVuY3J5cHRlZCA9IHBhcnNlX3llc19ubyh2YWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfSU5UUkFfQlNTX1JFTEFZICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9JTlRSQV9CU1NfUkVMQVksIHZhbHVlICk7CisJCQlscC0+RXhjbHVkZVVuZW5jcnlwdGVkID0gcGFyc2VfeWVzX25vKHZhbHVlKTsKKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9PV05fQkVBQ09OX0lOVEVSVkFMICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9PV05fQkVBQ09OX0lOVEVSVkFMLCB2YWx1ZSApOworCisJCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJCWlmICggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9PV05fQkVBQ09OX0lOVEVSVkFMICkgeworCQkJCWxwLT5vd25CZWFjb25JbnRlcnZhbCA9IHZhbHVlX2NvbnZlcnQ7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfT1dOX0JFQUNPTl9JTlRFUlZBTCApOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0NPRVhJU1RFTkNFICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9DT0VYSVNURU5DRSwgdmFsdWUgKTsKKworCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCQlpZiAoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fQ09FWElTVEVOQ0UgKSB7CisJCQkJbHAtPmNvZXhpc3RlbmNlID0gdmFsdWVfY29udmVydDsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9DT0VYSVNURU5DRSApOworCQkJfQorCQl9CisKKyNpZmRlZiBVU0VfV0RTCisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQxICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMSwgdmFsdWUgKTsKKworCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1JUU19USFJFU0hPTEQgKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCApKSB7CisJCQkJbHAtPndkc19wb3J0WzBdLnJ0c1RocmVzaG9sZCA9IHZhbHVlX2NvbnZlcnQ7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDEgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMiApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDIsIHZhbHVlICk7CisKKwkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9SVFNfVEhSRVNIT0xEICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1JUU19USFJFU0hPTEQgKSkgeworCQkJCWxwLT53ZHNfcG9ydFsxXS5ydHNUaHJlc2hvbGQgPSB2YWx1ZV9jb252ZXJ0OworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQyICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDMgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQzLCB2YWx1ZSApOworCisJCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fUlRTX1RIUkVTSE9MRCApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICkpIHsKKwkJCQlscC0+d2RzX3BvcnRbMl0ucnRzVGhyZXNob2xkID0gdmFsdWVfY29udmVydDsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMyApOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ0ICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENCwgdmFsdWUgKTsKKworCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1JUU19USFJFU0hPTEQgKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCApKSB7CisJCQkJbHAtPndkc19wb3J0WzNdLnJ0c1RocmVzaG9sZCA9IHZhbHVlX2NvbnZlcnQ7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDQgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENSApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDUsIHZhbHVlICk7CisKKwkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9SVFNfVEhSRVNIT0xEICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1JUU19USFJFU0hPTEQgKSkgeworCQkJCWxwLT53ZHNfcG9ydFs0XS5ydHNUaHJlc2hvbGQgPSB2YWx1ZV9jb252ZXJ0OworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ1ICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDYgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ2LCB2YWx1ZSApOworCisJCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fUlRTX1RIUkVTSE9MRCApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICkpIHsKKwkJCQlscC0+d2RzX3BvcnRbNV0ucnRzVGhyZXNob2xkID0gdmFsdWVfY29udmVydDsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENiApOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1RYX1JBVEUxICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9UWF9SQVRFMSwgdmFsdWUgKTsKKworCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1RYX1JBVEUgKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfVFhfUkFURSApKSB7CisJCQkJbHAtPndkc19wb3J0WzBdLnR4UmF0ZUNudGwgPSB2YWx1ZV9jb252ZXJ0OworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1RYX1JBVEUxICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfVFhfUkFURTIgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1RYX1JBVEUyLCB2YWx1ZSApOworCisJCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9UWF9SQVRFICkpIHsKKwkJCQlscC0+d2RzX3BvcnRbMV0udHhSYXRlQ250bCA9IHZhbHVlX2NvbnZlcnQ7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfVFhfUkFURTIgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9UWF9SQVRFMyApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfVFhfUkFURTMsIHZhbHVlICk7CisKKwkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9UWF9SQVRFICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1RYX1JBVEUgKSkgeworCQkJCWxwLT53ZHNfcG9ydFsyXS50eFJhdGVDbnRsID0gdmFsdWVfY29udmVydDsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9UWF9SQVRFMyApOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1RYX1JBVEU0ICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9UWF9SQVRFNCwgdmFsdWUgKTsKKworCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1RYX1JBVEUgKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfVFhfUkFURSApKSB7CisJCQkJbHAtPndkc19wb3J0WzNdLnR4UmF0ZUNudGwgPSB2YWx1ZV9jb252ZXJ0OworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1RYX1JBVEU0ICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfVFhfUkFURTUgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1RYX1JBVEU1LCB2YWx1ZSApOworCisJCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9UWF9SQVRFICkpIHsKKwkJCQlscC0+d2RzX3BvcnRbNF0udHhSYXRlQ250bCA9IHZhbHVlX2NvbnZlcnQ7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfVFhfUkFURTUgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9UWF9SQVRFNiApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfVFhfUkFURTYsIHZhbHVlICk7CisKKwkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9UWF9SQVRFICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1RYX1JBVEUgKSkgeworCQkJCWxwLT53ZHNfcG9ydFs1XS50eFJhdGVDbnRsID0gdmFsdWVfY29udmVydDsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9UWF9SQVRFNiApOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1dEU19BRERSRVNTMSApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1MxLCB2YWx1ZSApOworCisJCQlpZiAoIHBhcnNlX21hY19hZGRyZXNzKCB2YWx1ZSwgbWFjX3ZhbHVlICkgPT0gRVRIX0FMRU4gKSB7CisJCQkJbWVtY3B5KCBscC0+d2RzX3BvcnRbMF0ud2RzQWRkcmVzcywgbWFjX3ZhbHVlLCBFVEhfQUxFTiApOworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTMSApOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1dEU19BRERSRVNTMiApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1MyLCB2YWx1ZSApOworCisJCQlpZiAoIHBhcnNlX21hY19hZGRyZXNzKCB2YWx1ZSwgbWFjX3ZhbHVlICkgPT0gRVRIX0FMRU4gKSB7CisJCQkJbWVtY3B5KCBscC0+d2RzX3BvcnRbMV0ud2RzQWRkcmVzcywgbWFjX3ZhbHVlLCBFVEhfQUxFTiApOworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTMiApOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1dEU19BRERSRVNTMyApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1MzLCB2YWx1ZSApOworCisJCQlpZiAoIHBhcnNlX21hY19hZGRyZXNzKCB2YWx1ZSwgbWFjX3ZhbHVlICkgPT0gRVRIX0FMRU4gKSB7CisJCQkJbWVtY3B5KCBscC0+d2RzX3BvcnRbMl0ud2RzQWRkcmVzcywgbWFjX3ZhbHVlLCBFVEhfQUxFTiApOworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTMyApOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1dEU19BRERSRVNTNCApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1M0LCB2YWx1ZSApOworCisJCQlpZiAoIHBhcnNlX21hY19hZGRyZXNzKCB2YWx1ZSwgbWFjX3ZhbHVlICkgPT0gRVRIX0FMRU4gKSB7CisJCQkJbWVtY3B5KCBscC0+d2RzX3BvcnRbM10ud2RzQWRkcmVzcywgbWFjX3ZhbHVlLCBFVEhfQUxFTiApOworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTNCApOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1dEU19BRERSRVNTNSApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1M1LCB2YWx1ZSApOworCisJCQlpZiAoIHBhcnNlX21hY19hZGRyZXNzKCB2YWx1ZSwgbWFjX3ZhbHVlICkgPT0gRVRIX0FMRU4gKSB7CisJCQkJbWVtY3B5KCBscC0+d2RzX3BvcnRbNF0ud2RzQWRkcmVzcywgbWFjX3ZhbHVlLCBFVEhfQUxFTiApOworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTNSApOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1dEU19BRERSRVNTNiApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfV0RTX0FERFJFU1M2LCB2YWx1ZSApOworCisJCQlpZiAoIHBhcnNlX21hY19hZGRyZXNzKCB2YWx1ZSwgbWFjX3ZhbHVlICkgPT0gRVRIX0FMRU4gKSB7CisJCQkJbWVtY3B5KCBscC0+d2RzX3BvcnRbNV0ud2RzQWRkcmVzcywgbWFjX3ZhbHVlLCBFVEhfQUxFTiApOworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTNiApOworCQkJfQorCQl9CisjZW5kaWYgIC8qIFVTRV9XRFMgKi8KKwl9CisjZW5kaWYgIC8qIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUCAqLworCisJcmV0dXJuOworfSAvLyB0cmFuc2xhdGVfb3B0aW9uCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJcGFyc2VfbWFjX2FkZHJlc3MoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcGFyc2UgYSBtYWMgYWRkcmVzcyBzdHJpbmcgYW5kIGNvbnZlcnQgaXQgdG8gYSBieXRlCisgKiAgIGFycmF5LgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgdmFsdWUgICAgICAgLSB0aGUgTUFDIGFkZHJlc3MsIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nCisgKiAgICAgIGJ5dGVfYXJyYXkgIC0gdGhlIE1BQyBhZGRyZXNzLCByZXByZXNlbnRlZCBhcyBhIGJ5dGUgYXJyYXkgb2YgbGVuZ3RoCisgKiAgICAgICAgICAgICAgICAgICAgRVRIX0FMRU4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGZpbmFsIE1BQyBhZGRyZXNzLCBzaG91bGQgZXF1YWwgdG8gRVRIX0FMRU4uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBwYXJzZV9tYWNfYWRkcmVzcyggY2hhciAqdmFsdWUsIHVfY2hhciAqYnl0ZV9hcnJheSApCit7CisJaW50ICAgICB2YWx1ZV9vZmZzZXQgPSAwOworCWludCAgICAgYXJyYXlfb2Zmc2V0ID0gMDsKKwlpbnQgICAgIGZpZWxkX29mZnNldCA9IDA7CisJY2hhciAgICBieXRlX2ZpZWxkWzNdOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCW1lbXNldCggYnl0ZV9maWVsZCwgJ1wwJywgMyApOworCisJd2hpbGUoIHZhbHVlW3ZhbHVlX29mZnNldF0gIT0gJ1wwJyApIHsKKwkJLyogU2tpcCBvdmVyIHRoZSBjb2xvbiBjaGFycyBzZXBlcmF0aW5nIHRoZSBieXRlcywgaWYgdGhleSBleGlzdCAqLworCQlpZiAoIHZhbHVlW3ZhbHVlX29mZnNldF0gPT0gJzonICkgeworCQkJdmFsdWVfb2Zmc2V0Kys7CisJCQljb250aW51ZTsKKwkJfQorCisJCWJ5dGVfZmllbGRbZmllbGRfb2Zmc2V0XSA9IHZhbHVlW3ZhbHVlX29mZnNldF07CisJCWZpZWxkX29mZnNldCsrOworCQl2YWx1ZV9vZmZzZXQrKzsKKworCQkvKiBPbmNlIHRoZSBieXRlX2ZpZWxkIGlzIGZpbGxlZCwgY29udmVydCBpdCBhbmQgc3RvcmUgaXQgKi8KKwkJaWYgKCBmaWVsZF9vZmZzZXQgPT0gMiApIHsKKwkJCWJ5dGVfZmllbGRbZmllbGRfb2Zmc2V0XSA9ICdcMCc7CisJCQlieXRlX2FycmF5W2FycmF5X29mZnNldF0gPSBzaW1wbGVfc3RydG91bCggYnl0ZV9maWVsZCwgTlVMTCwgMTYgKTsKKwkJCWZpZWxkX29mZnNldCA9IDA7CisJCQlhcnJheV9vZmZzZXQrKzsKKwkJfQorCX0KKworCS8qIFVzZSB0aGUgYXJyYXlfb2Zmc2V0IGFzIGEgY2hlY2s7IDYgYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gdGhlCisJICAgYnl0ZV9hcnJheSAqLworCXJldHVybiBhcnJheV9vZmZzZXQ7Cit9IC8vIHBhcnNlX21hY19hZGRyZXNzCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJUGFyc2VDb25maWdMaW5lKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgUGFyc2VzIGEgbGluZSBmcm9tIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaW50byBhbiBMLXZhbCBhbmQgYW4gUi12YWwsCisgKiAgcmVwcmVzZW50aW5nIGEga2V5L3ZhbHVlIHBhaXIuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBwc3pMaW5lICAgICAtIHRoZSBsaW5lIGZyb20gdGhlIGNvbmZpZyBmaWxlIHRvIHBhcnNlCisgKiAgICAgIHBwc3pMVmFsICAgIC0gdGhlIHJlc3VsdGluZyBMLXZhbCAoS2V5KQorICogICAgICBwcHN6UlZhbCAgICAtIHRoZSByZXN1bHRpbmcgUi12YWwgKFZhbHVlKQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUGFyc2VDb25maWdMaW5lKCBjaGFyICpwc3pMaW5lLCBjaGFyICoqcHBzekxWYWwsIGNoYXIgKipwcHN6UlZhbCApCit7CisJaW50IGk7CisJaW50IHNpemU7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJREJHX0ZVTkMoICJQYXJzZUNvbmZpZ0xpbmUiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwkvKiBnZXQgYSBzbmFwc2hvdCBvZiBvdXIgc3RyaW5nIHNpemUgKi8KKwlzaXplICAgICAgPSBzdHJsZW4oIHBzekxpbmUgKTsKKwkqcHBzekxWYWwgPSBOVUxMOworCSpwcHN6UlZhbCA9IE5VTEw7CisKKwlpZiAoIHBzekxpbmVbMF0gIT0gJyMnICYmCQkJCQkJCS8qIHNraXAgdGhlIGxpbmUgaWYgaXQgaXMgYSBjb21tZW50ICovCisJCSBwc3pMaW5lWzBdICE9ICdcbicmJgkJCQkJCQkvKiBpZiBpdCdzIGFuIGVtcHR5IFVOSVggbGluZSwgZG8gbm90aGluZyAqLworCQkgISggcHN6TGluZVswXSA9PSAnXHInICYmIHBzekxpbmVbMV0gPT0gJ1xuJyApCS8qIGlmIGl0J3MgYW4gZW1wdHkgTVMtRE9TIGxpbmUsIGRvIG5vdGhpbmcgKi8KKwkgICAgKSB7CisJCS8qIGFkdmFuY2UgcGFzdCBhbnkgd2hpdGVzcGFjZSwgYW5kIGFzc2lnbiB0aGUgTC12YWx1ZSAqLworCQlmb3IoIGkgPSAwOyBpIDwgc2l6ZTsgaSsrICkgeworCQkJaWYgKCBwc3pMaW5lW2ldICE9ICcgJyApIHsKKwkJCQkqcHBzekxWYWwgPSAmcHN6TGluZVtpXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKiBhZHZhbmNlIHRvIHRoZSBlbmQgb2YgdGhlIGwtdmFsdWUqLworCQlmb3IoIGkrKzsgaSA8IHNpemU7IGkrKyApIHsKKwkJCWlmICggcHN6TGluZVtpXSA9PSAnICcgfHwgcHN6TGluZVtpXSA9PSAnPScgKSB7CisJCQkJcHN6TGluZVtpXSA9ICdcMCc7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLyogbWFrZSBhbnkgd2hpdGVzcGFjZSBhbmQgdGhlIGVxdWFsIHNpZ24gYSBOVUxMIGNoYXJhY3RlciwgYW5kCisJCSAgIGFkdmFuY2UgdG8gdGhlIFItVmFsdWUgKi8KKwkJZm9yKCBpKys7IGkgPCBzaXplOyBpKysgKSB7CisJCQlpZiAoIHBzekxpbmVbaV0gPT0gJyAnIHx8IHBzekxpbmVbaV0gPT0gJz0nICkgeworCQkJCXBzekxpbmVbaV0gPSAnXDAnOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJKnBwc3pSVmFsID0gJnBzekxpbmVbaV07CisJCQlicmVhazsKKwkJfQorCQkvKiBtYWtlIHRoZSBsaW5lIGVuZGluZyBjaGFyYWN0ZXIocykgYSBOVUxMICovCisJCWZvciggaSsrOyBpIDwgc2l6ZTsgaSsrICkgeworCQkJaWYgKCBwc3pMaW5lW2ldID09ICdcbicgKSB7CisJCQkJcHN6TGluZVtpXSA9ICdcMCc7CisJCQl9CisJCQlpZiAoKCBwc3pMaW5lW2ldID09ICdccicgKSAmJiAoIHBzekxpbmVbaSsxXSA9PSAnXG4nICkpIHsKKwkJCQlwc3pMaW5lW2ldID0gJ1wwJzsKKwkJCX0KKwkJfQorCX0KKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKK30gLy8gUGFyc2VDb25maWdMaW5lCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZW5kaWYgIC8vIFVTRV9QUk9GSUxFCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wcm9maWxlLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wcm9maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFkYjhlOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3Byb2ZpbGUuaApAQCAtMCwwICsxLDg3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBXaXJlbGVzcyBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAod2xhZ3M0OSkuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBodHRwOi8vd3d3LmFnZXJlLmNvbQorICoKKyAqIEluaXRpYWxseSBkZXZlbG9wZWQgYnkgVHJpcGxlUG9pbnQsIEluYy4KKyAqICAgaHR0cDovL3d3dy50cmlwbGVwb2ludC5jb20KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgSGVhZGVyIGRlc2NyaWJpbmcgaW5mb3JtYXRpb24gcmVxdWlyZWQgZm9yIHRoZSBjb25maWcgcGFyc2luZyByb3V0aW5lcy4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNPRlRXQVJFIExJQ0VOU0UKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisgKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fV0xfUFJPRklMRV9IX18KKyNkZWZpbmUgX19XTF9QUk9GSUxFX0hfXworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGNvbnN0YW50IGRlZmluaXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBST09UX0NPTkZJR19GSUxFTkFNRSAiL2V0Yy9hZ2VyZS9pd2NvbmZpZy0iCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBmdW5jdGlvbiBwcm90b3R5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwYXJzZV9jb25maWcoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKworaW50IHJlYWRsaW5lKCBpbnQgZmlsZWRlc2MsIGNoYXIgKmJ1ZmZlciApOworCit2b2lkIHRyYW5zbGF0ZV9vcHRpb24oIGNoYXIgKmJ1ZmZlciwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisKK2ludCBwYXJzZV9tYWNfYWRkcmVzcyggY2hhciAqdmFsdWUsIHVfY2hhciAqYnl0ZV9hcnJheSApOworCit2b2lkIFBhcnNlQ29uZmlnTGluZSggY2hhciAqcHN6TGluZSwgY2hhciAqKnBwc3pMVmFsLCBjaGFyICoqcHBzelJWYWwgKTsKKworCisjZW5kaWYgIC8vIF9fV0xfUFJPRklMRV9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3N5c2ZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9zeXNmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NGUwMWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9zeXNmcy5jCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogZXg6IHN3PTQKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKworI2luY2x1ZGUgPGRlYnVnLmg+CisjaW5jbHVkZSA8aGNmLmg+CisjaW5jbHVkZSA8aGNmZGVmLmg+CisKKyNpbmNsdWRlIDx3bF9pZi5oPgorI2luY2x1ZGUgPHdsX2ludGVybmFsLmg+CisjaW5jbHVkZSA8d2xfdXRpbC5oPgorI2luY2x1ZGUgPHdsX21haW4uaD4KKyNpbmNsdWRlIDx3bF93ZXh0Lmg+CisjaW5jbHVkZSA8d2xfcHJpdi5oPgorCitzdGF0aWMgaW5saW5lIGludCBkZXZfaXNhbGl2ZShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICAgICAgcmV0dXJuIGRldi0+cmVnX3N0YXRlID09IE5FVFJFR19SRUdJU1RFUkVEOworfQorCisvKgorICogZW1waXJpY2FsbHkgZXZlbiBpZiB0YWxsaWVzIGFyZSBkZWZpbmVkIGFzIDMyIGJpdHMgZW50aXRpZXMsIG9ubHkKKyAqIGhpZ2ggMTYgYml0cyBhcmUgcmVsZXZhbnQ7IGxvdyBoYWxmIGlzIGFsd2F5cyB6ZXJvLiBJdCBtZWFucyB0YWxsaWVzCisgKiBhcmUgcHJldHR5IG11Y2ggdXNlbGVzcyBmb3IgdHJhZmZpYyBjb3VudGluZyBidXQgYXQgbGVhc3QgZ2l2ZSBvdmVydmlldworICogYWJvdXQgd2hlcmUgZXJyb3IgY29tZSBmcm9tCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGFsbGllcyhzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjaGFyICpidWYpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHRvX25ldF9kZXYoZCk7CisgICAgc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgQ0ZHX0hFUk1FU19UQUxMSUVTX1NUUkNUIHRhbGxpZXM7CisgICAgc3NpemVfdCByZXQgPSAtRUlOVkFMOworCisgICAgcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKyAgICBpZiAoZGV2X2lzYWxpdmUoZGV2KSkgeworCXdsX2xvY2sobHAsICZmbGFncyk7CisKKwlpZiAoKHJldCA9IHdsX2dldF90YWxsaWVzKGxwLCAmdGFsbGllcykpID09IDApIHsKKwkJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCQlyZXQgPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwKKwkJICAgICJUeFVuaWNhc3RGcmFtZXM6ICAgICAgICAgICAldVxuIgorCQkgICAgIlR4TXVsdGljYXN0RnJhbWVzOiAgICAgICAgICV1XG4iCisJCSAgICAiVHhGcmFnbWVudHM6ICAgICAgICAgICAgICAgJXVcbiIKKwkJICAgICJUeFVuaWNhc3RPY3RldHM6ICAgICAgICAgICAldVxuIgorCQkgICAgIlR4TXVsdGljYXN0T2N0ZXRzOiAgICAgICAgICV1XG4iCisJCSAgICAiVHhEZWZlcnJlZFRyYW5zbWlzc2lvbnM6ICAgJXVcbiIKKwkJICAgICJUeFNpbmdsZVJldHJ5RnJhbWVzOiAgICAgICAldVxuIgorCQkgICAgIlR4TXVsdGlwbGVSZXRyeUZyYW1lczogICAgICV1XG4iCisJCSAgICAiVHhSZXRyeUxpbWl0RXhjZWVkZWQ6ICAgICAgJXVcbiIKKwkJICAgICJUeERpc2NhcmRzOiAgICAgICAgICAgICAgICAldVxuIgorCQkgICAgIlJ4VW5pY2FzdEZyYW1lczogICAgICAgICAgICV1XG4iCisJCSAgICAiUnhNdWx0aWNhc3RGcmFtZXM6ICAgICAgICAgJXVcbiIKKwkJICAgICJSeEZyYWdtZW50czogICAgICAgICAgICAgICAldVxuIgorCQkgICAgIlJ4VW5pY2FzdE9jdGV0czogICAgICAgICAgICV1XG4iCisJCSAgICAiUnhNdWx0aWNhc3RPY3RldHM6ICAgICAgICAgJXVcbiIKKwkJICAgICJSeEZDU0Vycm9yczogICAgICAgICAgICAgICAldVxuIgorCQkgICAgIlJ4RGlzY2FyZHNOb0J1ZmZlcjogICAgICAgICV1XG4iCisJCSAgICAiVHhEaXNjYXJkc1dyb25nU0E6ICAgICAgICAgJXVcbiIKKwkJICAgICJSeFdFUFVuZGVjcnlwdGFibGU6ICAgICAgICAldVxuIgorCQkgICAgIlJ4TXNnSW5Nc2dGcmFnbWVudHM6ICAgICAgICV1XG4iCisJCSAgICAiUnhNc2dJbkJhZE1zZ0ZyYWdtZW50czogICAgJXVcbiIKKwkJICAgICJSeERpc2NhcmRzV0VQSUNWRXJyb3I6ICAgICAldVxuIgorCQkgICAgIlJ4RGlzY2FyZHNXRVBFeGNsdWRlZDogICAgICV1XG4iCisJCSAgICAsCisJCSAgICAodW5zaWduZWQgaW50KXRhbGxpZXMuVHhVbmljYXN0RnJhbWVzLAorCQkgICAgKHVuc2lnbmVkIGludCl0YWxsaWVzLlR4TXVsdGljYXN0RnJhbWVzLAorCQkgICAgKHVuc2lnbmVkIGludCl0YWxsaWVzLlR4RnJhZ21lbnRzLAorCQkgICAgKHVuc2lnbmVkIGludCl0YWxsaWVzLlR4VW5pY2FzdE9jdGV0cywKKwkJICAgICh1bnNpZ25lZCBpbnQpdGFsbGllcy5UeE11bHRpY2FzdE9jdGV0cywKKwkJICAgICh1bnNpZ25lZCBpbnQpdGFsbGllcy5UeERlZmVycmVkVHJhbnNtaXNzaW9ucywKKwkJICAgICh1bnNpZ25lZCBpbnQpdGFsbGllcy5UeFNpbmdsZVJldHJ5RnJhbWVzLAorCQkgICAgKHVuc2lnbmVkIGludCl0YWxsaWVzLlR4TXVsdGlwbGVSZXRyeUZyYW1lcywKKwkJICAgICh1bnNpZ25lZCBpbnQpdGFsbGllcy5UeFJldHJ5TGltaXRFeGNlZWRlZCwKKwkJICAgICh1bnNpZ25lZCBpbnQpdGFsbGllcy5UeERpc2NhcmRzLAorCQkgICAgKHVuc2lnbmVkIGludCl0YWxsaWVzLlJ4VW5pY2FzdEZyYW1lcywKKwkJICAgICh1bnNpZ25lZCBpbnQpdGFsbGllcy5SeE11bHRpY2FzdEZyYW1lcywKKwkJICAgICh1bnNpZ25lZCBpbnQpdGFsbGllcy5SeEZyYWdtZW50cywKKwkJICAgICh1bnNpZ25lZCBpbnQpdGFsbGllcy5SeFVuaWNhc3RPY3RldHMsCisJCSAgICAodW5zaWduZWQgaW50KXRhbGxpZXMuUnhNdWx0aWNhc3RPY3RldHMsCisJCSAgICAodW5zaWduZWQgaW50KXRhbGxpZXMuUnhGQ1NFcnJvcnMsCisJCSAgICAodW5zaWduZWQgaW50KXRhbGxpZXMuUnhEaXNjYXJkc05vQnVmZmVyLAorCQkgICAgKHVuc2lnbmVkIGludCl0YWxsaWVzLlR4RGlzY2FyZHNXcm9uZ1NBLAorCQkgICAgKHVuc2lnbmVkIGludCl0YWxsaWVzLlJ4V0VQVW5kZWNyeXB0YWJsZSwKKwkJICAgICh1bnNpZ25lZCBpbnQpdGFsbGllcy5SeE1zZ0luTXNnRnJhZ21lbnRzLAorCQkgICAgKHVuc2lnbmVkIGludCl0YWxsaWVzLlJ4TXNnSW5CYWRNc2dGcmFnbWVudHMsCisJCSAgICAodW5zaWduZWQgaW50KXRhbGxpZXMuUnhEaXNjYXJkc1dFUElDVkVycm9yLAorCQkgICAgKHVuc2lnbmVkIGludCl0YWxsaWVzLlJ4RGlzY2FyZHNXRVBFeGNsdWRlZCk7CisJICAgIH0gZWxzZSB7CisJCXdsX3VubG9jayggbHAsICZmbGFncyApOworCSAgICB9CisgICAgfQorCisgICAgcmVhZF91bmxvY2soJmRldl9iYXNlX2xvY2spOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUih0YWxsaWVzLCBTX0lSVUdPLCBzaG93X3RhbGxpZXMsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqd2xhZ3NfYXR0cnNbXSA9IHsKKyAgICAmZGV2X2F0dHJfdGFsbGllcy5hdHRyLAorICAgIE5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHdsYWdzX2dyb3VwID0geworICAgIC5uYW1lID0gIndsYWdzIiwKKyAgICAuYXR0cnMgPSB3bGFnc19hdHRycywKK307CisKK3ZvaWQgcmVnaXN0ZXJfd2xhZ3Nfc3lzZnMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKK3sKKyAgICBzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmKG5ldC0+ZGV2KTsKKyAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KG5ldCk7CisKKyAgICBscC0+c3lzZnNDcmVhdGVkID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXYtPmtvYmosICZ3bGFnc19ncm91cCk7Cit9CisKK3ZvaWQgdW5yZWdpc3Rlcl93bGFnc19zeXNmcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQoreworICAgIHN0cnVjdCBkZXZpY2UgKmRldiA9ICYobmV0LT5kZXYpOworICAgIHN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYobmV0KTsKKworICAgIGlmIChscC0+c3lzZnNDcmVhdGVkKQorCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2LT5rb2JqLCAmd2xhZ3NfZ3JvdXApOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfc3lzZnMuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3N5c2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ5NmQwMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3N5c2ZzLmgKQEAgLTAsMCArMSw3IEBACisjaWZkZWYgQ09ORklHX1NZU0ZTCitleHRlcm4gdm9pZCByZWdpc3Rlcl93bGFnc19zeXNmcyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK2V4dGVybiB2b2lkIHVucmVnaXN0ZXJfd2xhZ3Nfc3lzZnMoc3RydWN0IG5ldF9kZXZpY2UgKik7CisjZWxzZQorc3RhdGljIHZvaWQgcmVnaXN0ZXJfd2xhZ3Nfc3lzZnMoc3RydWN0IG5ldF9kZXZpY2UgKikgeyByZXR1cm47IH07CitzdGF0aWMgdm9pZCB1bnJlZ2lzdGVyX3dsYWdzX3N5c2ZzKHN0cnVjdCBuZXRfZGV2aWNlICopIHsgcmV0dXJuOyB9OworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF91dGlsLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxZTdmMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3V0aWwuYwpAQCAtMCwwICsxLDE1ODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCisgKgorICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgorICogICBodHRwOi8vd3d3LnRyaXBsZXBvaW50LmNvbQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBUaGlzIGZpbGUgZGVmaW5lcyBtaXNjIHV0aWxpdHkgZnVuY3Rpb25zLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU09GVFdBUkUgTElDRU5TRQorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisgKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIERpc2NsYWltZXIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIJNBUyBJU5QgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisgKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgaW5jbHVkZSBmaWxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDx3bF92ZXJzaW9uLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisvLyAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisvLyAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9pbi5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisvLyAjaW5jbHVkZSA8YXNtL2lvLmg+CisvLyAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorLy8gI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisvLyAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisvLyAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisvLyAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisKKyNpbmNsdWRlIDxkZWJ1Zy5oPgorI2luY2x1ZGUgPGhjZi5oPgorLy8gI2luY2x1ZGUgPGhjZmRlZi5oPgorCisjaW5jbHVkZSA8d2xfaWYuaD4KKyNpbmNsdWRlIDx3bF9pbnRlcm5hbC5oPgorI2luY2x1ZGUgPHdsX3V0aWwuaD4KKyNpbmNsdWRlIDx3bF93ZXh0Lmg+CisjaW5jbHVkZSA8d2xfbWFpbi5oPgorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdsb2JhbCB2YXJpYWJsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEEgbWF0cml4IHdoaWNoIG1hcHMgY2hhbm5lbHMgdG8gZnJlcXVlbmNpZXMgKi8KKyNkZWZpbmUgTUFYX0NIQU5fRlJFUV9NQVBfRU5UUklFUyAgIDUwCitzdGF0aWMgY29uc3QgbG9uZyBjaGFuX2ZyZXFfbGlzdFtdW01BWF9DSEFOX0ZSRVFfTUFQX0VOVFJJRVNdID0KK3sKKyAgICB7MSwyNDEyfSwKKyAgICB7MiwyNDE3fSwKKyAgICB7MywyNDIyfSwKKyAgICB7NCwyNDI3fSwKKyAgICB7NSwyNDMyfSwKKyAgICB7NiwyNDM3fSwKKyAgICB7NywyNDQyfSwKKyAgICB7OCwyNDQ3fSwKKyAgICB7OSwyNDUyfSwKKyAgICB7MTAsMjQ1N30sCisgICAgezExLDI0NjJ9LAorICAgIHsxMiwyNDY3fSwKKyAgICB7MTMsMjQ3Mn0sCisgICAgezE0LDI0ODR9LAorICAgIHszNiw1MTgwfSwKKyAgICB7NDAsNTIwMH0sCisgICAgezQ0LDUyMjB9LAorICAgIHs0OCw1MjQwfSwKKyAgICB7NTIsNTI2MH0sCisgICAgezU2LDUyODB9LAorICAgIHs2MCw1MzAwfSwKKyAgICB7NjQsNTMyMH0sCisgICAgezE0OSw1NzQ1fSwKKyAgICB7MTUzLDU3NjV9LAorICAgIHsxNTcsNTc4NX0sCisgICAgezE2MSw1ODA1fQorfTsKKworI2lmIERCRworZXh0ZXJuIGRiZ19pbmZvX3QgKkRiZ0luZm87CisjZW5kaWYgIC8qIERCRyAqLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJZGJtKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgUmV0dXJuIGFuIGVuZXJneSB2YWx1ZSBpbiBkQm0uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB2YWx1ZSAtIHRoZSBlbmVyZ3kgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICB0aGUgdmFsdWUgaW4gZEJtCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBkYm0oIGludCB2YWx1ZSApCit7CisgICAgLyogVHJ1bmNhdGUgdGhlIHZhbHVlIHRvIGJlIGJldHdlZW4gbWluIGFuZCBtYXguICovCisgICAgaWYoIHZhbHVlIDwgSENGX01JTl9TSUdOQUxfTEVWRUwgKQorICAgICAgICB2YWx1ZSA9IEhDRl9NSU5fU0lHTkFMX0xFVkVMOworCisgICAgaWYoIHZhbHVlID4gSENGX01BWF9TSUdOQUxfTEVWRUwgKQorICAgICAgICB2YWx1ZSA9IEhDRl9NQVhfU0lHTkFMX0xFVkVMOworCisgICAgLyogUmV0dXJuIHRoZSBlbmVyZ3kgdmFsdWUgaW4gZEJtLiAqLworICAgIHJldHVybiAoIHZhbHVlIC0gSENGXzBEQk1fT0ZGU0VUICk7Cit9IC8vIGRibQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXBlcmNlbnQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBSZXR1cm4gYSB2YWx1ZSBhcyBhIHBlcmNlbnRhZ2Ugb2YgbWluIHRvIG1heC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHZhbHVlICAgLSB0aGUgdmFsdWUgaW4gcXVlc3Rpb24KKyAqICAgICAgbWluICAgICAtIHRoZSBtaW5pbXVtIHJhbmdlIHZhbHVlCisgKiAgICAgIG1heCAgICAgLSB0aGUgbWF4aW11bSByYW5nZSB2YWx1ZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgdGhlIHBlcmNlbnRhZ2UgdmFsdWUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHBlcmNlbnQoIGludCB2YWx1ZSwgaW50IG1pbiwgaW50IG1heCApCit7CisgICAgLyogVHJ1bmNhdGUgdGhlIHZhbHVlIHRvIGJlIGJldHdlZW4gbWluIGFuZCBtYXguICovCisgICAgaWYoIHZhbHVlIDwgbWluICkKKyAgICAgICAgdmFsdWUgPSBtaW47CisKKyAgICBpZiggdmFsdWUgPiBtYXggKQorICAgICAgICB2YWx1ZSA9IG1heDsKKworICAgIC8qIFJldHVybiB0aGUgdmFsdWUgYXMgYSBwZXJjZW50YWdlIG9mIG1pbiB0byBtYXguICovCisgICAgcmV0dXJuICgoKCB2YWx1ZSAtIG1pbiApICogMTAwICkgLyAoIG1heCAtIG1pbiApKTsKK30gLy8gcGVyY2VudAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCWlzX3ZhbGlkX2tleV9zdHJpbmcoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBDaGVja3MgdG8gZGV0ZXJtaW5lIGlmIHRoZSBXRVAga2V5IHN0cmluZyBpcyB2YWxpZAorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgcyAtIHRoZSBzdHJpbmcgaW4gcXVlc3Rpb24KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIG5vbi16ZXJvIGlmIHRoZSBzdHJpbmcgY29udGFpbnMgYSB2YWxpZCBrZXkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGlzX3ZhbGlkX2tleV9zdHJpbmcoIGNoYXIgKnMgKQoreworICAgIGludCBsOworICAgIGludCBpOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgbCA9IHN0cmxlbiggcyApOworCisgICAgLyogMHggZm9sbG93ZWQgYnkgNSBvciAxMyBoZXhhZGVjaW1hbCBkaWdpdCBwYWlycyBpcyB2YWxpZCAqLworICAgIGlmKCBzWzBdID09ICcwJyAmJiAoIHNbMV0gPT0gJ3gnIHx8IHNbMV0gPT0gJ1gnICkpIHsKKyAgICAgICAgaWYoIGwgPT0gMTIgfHwgbCA9PSAyOCApIHsKKyAgICAgICAgICAgIGZvciggaSA9IDI7IGkgPCBsOyBpKysgKSB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCggc1tpXSApKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHN0cmluZyB3aXRoIDAsIDUsIG9yIDEzIGNoYXJhY3RlcnMgaXMgdmFsaWQgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4oIGwgPT0gMCB8fCBsID09IDUgfHwgbCA9PSAxMyApOworICAgIH0KK30gLy8gaXNfdmFsaWRfa2V5X3N0cmluZworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCWhleGRpZ2l0MmludCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIENvbnZlcnRzIGEgaGV4YWRlY2ltYWwgZGlnaXQgY2hhcmFjdGVyIHRvIGFuIGludGVnZXIKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGMgICAtIHRoZSBoZXhhZGVjaW1hbCBkaWdpdCBjaGFyYWN0ZXIKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIHRoZSBjb252ZXJ0ZWQgaW50ZWdlcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgaGV4ZGlnaXQyaW50KCBjaGFyIGMgKQoreworICAgaWYoIGMgPj0gJzAnICYmIGMgPD0gJzknICkKKyAgICAgICByZXR1cm4gYyAtICcwJzsKKworICAgaWYoIGMgPj0gJ0EnICYmIGMgPD0gJ0YnICkKKyAgICAgICByZXR1cm4gYyAtICdBJyArIDEwOworCisgICBpZiggYyA+PSAnYScgJiYgYyA8PSAnZicgKQorICAgICAgIHJldHVybiBjIC0gJ2EnICsgMTA7CisKKyAgIHJldHVybiAwOworfSAvLyBoZXhkaWdpdDJpbnQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglrZXlfc3RyaW5nMmtleSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIENvbnZlcnRzIGEga2V5X3N0cmluZyB0byBhIGtleSwgQXNzdW1lcyB0aGUga2V5X3N0cmluZyBpcyB2YWxpZGF0ZWQgd2l0aAorICogIGlzX3ZhbGlkX2tleV9zdHJpbmcoKS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGtzICAtIHRoZSB2YWxpZCBrZXkgc3RyaW5nCisgKiAgICAgIGtleSAtIGEgcG9pbnRlciB0byBhIEtFWV9TVFJVQ1Qgd2hlcmUgdGhlIGNvbnZlcnRlZCBrZXkgaW5mb3JtYXRpb24gd2lsbAorICogICAgICAgICAgICBiZSBzdG9yZWQuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBrZXlfc3RyaW5nMmtleSggY2hhciAqa3MsIEtFWV9TVFJDVCAqa2V5ICkKK3sKKyAgICBpbnQgbCxpLG47CisgICAgY2hhciAqcDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworICAgIGwgPSBzdHJsZW4oIGtzICk7CisKKyAgICAvKiAweCBmb2xsb3dlZCBieSBoZXhhZGVjaW1hbCBkaWdpdCBwYWlycyAqLworICAgIGlmKCBrc1swXSA9PSAnMCcgJiYgKCBrc1sxXSA9PSAneCcgfHwga3NbMV0gPT0gJ1gnICkpIHsKKyAgICAgICAgbiA9IDA7CisgICAgICAgIHAgPSAoY2hhciAqKWtleS0+a2V5OworCisgICAgICAgIGZvciggaSA9IDI7IGkgPCBsOyBpKz0yICkgeworICAgICAgICAgICAqcCsrID0gKCBoZXhkaWdpdDJpbnQoIGtzW2ldICkgPDwgNCApICsgaGV4ZGlnaXQyaW50IChrc1tpKzFdICk7CisgICAgICAgICAgIG4rKzsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE5vdGUgdGhhdCBlbmRpYW4gdHJhbnNsYXRpb24gb2YgdGhlIGxlbmd0aCBmaWVsZCBpcyBub3QgbmVlZGVkIGhlcmUKKyAgICAgICAgICBiZWNhdXNlIGl0J3MgcGVyZm9ybWVkIGluIHdsX3B1dF9sdHYoKSAqLworICAgICAgICBrZXktPmxlbiA9IG47CisgICAgfQorICAgIC8qIGNoYXJhY3RlciBzdHJpbmcgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICBzdHJjcHkoIChjaGFyICopa2V5LT5rZXksIGtzICk7CisgICAgICAgIGtleS0+bGVuID0gbDsKKyAgICB9CisKKyAgICByZXR1cm47Cit9IC8vIGtleV9zdHJpbmcya2V5CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisjaWYgREJHCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJRGJnSHdBZGRyKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQ29udmVydCBhIGhhcmR3YXJlIGV0aGVybmV0IGFkZHJlc3MgdG8gYSBjaGFyYWN0ZXIgc3RyaW5nCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBod0FkZHIgIC0gYW4gZXRoZXJuZXQgYWRkcmVzcworICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgYSBwb2ludGVyIHRvIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZXRoZXJuZXQgYWRkcmVzcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjb25zdCBjaGFyICpEYmdId0FkZHIodW5zaWduZWQgY2hhciAqaHdBZGRyKQoreworICAgIHN0YXRpYyBjaGFyICAgICBidWZmZXJbMThdOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgc3ByaW50ZiggYnVmZmVyLCAiJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlgiLAorICAgICAgICAgICAgIGh3QWRkclswXSwgaHdBZGRyWzFdLCBod0FkZHJbMl0sIGh3QWRkclszXSwgaHdBZGRyWzRdLCBod0FkZHJbNV0gKTsKKworICAgIHJldHVybiBidWZmZXI7Cit9IC8vIERiZ0h3QWRkcgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2VuZGlmIC8qIERCRyAqLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfaGFzX3dlcCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIENoZWNrcyB0byBzZWUgaWYgdGhlIGRldmljZSBzdXBwb3J0cyBXRVAKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGlmYnAgICAgLSB0aGUgSUZCIHBvaW50ZXIgb2YgdGhlIGRldmljZSBpbiBxdWVzdGlvbgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMSBpZiBXRVAgaXMga25vd24gZW5hYmxlZCwgZWxzZSAwCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9oYXNfd2VwIChJRkJQIGlmYnApCit7CisgICAgQ0ZHX1BSSVZBQ1lfT1BUX0lNUExFTUVOVEVEX1NUUkNUIGx0djsKKwlpbnQgcmMsIHByaXZhY3k7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwkvKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB1cyB0byBkaXN0aWd1aXNoIGJyb256ZSBjYXJkcyBmcm9tIG90aGVyIHR5cGVzLCB0bworICAgICAgIGtub3cgaWYgV0VQIGV4aXN0cy4gRG9lcyBub3QgZGlzdGluZ3Vpc2ggKGJlY2F1c2UgdGhlcmUncyBubyB3YXkgdG8pCisgICAgICAgYmV0d2VlbiBzaWx2ZXIgYW5kIGdvbGQgY2FyZHMuICovCisgICAgbHR2LmxlbiA9IDI7CisgICAgbHR2LnR5cCA9IENGR19QUklWQUNZX09QVF9JTVBMRU1FTlRFRDsKKworCXJjID0gaGNmX2dldF9pbmZvKCBpZmJwLCAoTFRWUCkgJmx0diApOworCisJcHJpdmFjeSA9IENOVl9MSVRUTEVfVE9fSU5UKCBsdHYucHJpdmFjeV9vcHRfaW1wbGVtZW50ZWQgKTsKKworCS8vcmV0dXJuIHJjID8gMCA6IHByaXZhY3k7CisgICAgcmV0dXJuIDE7Cit9IC8vIHdsX2hhc193ZXAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9oY2ZfZXJyb3IoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBSZXBvcnQgdGhlIHR5cGUgb2YgSENGIGVycm9yIG1lc3NhZ2UKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIG5vbmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIEEgZGVzY3JpcHRpdmUgc3RyaW5nIGluZGljYXRpbmcgdGhlIGVycm9yLCBxdWlldCBvdGhlcndpc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfaGNmX2Vycm9yKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaGNmU3RhdHVzICkKK3sKKyAgICBjaGFyICAgICBidWZmZXJbNjRdLCAqcE1zZzsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworICAgIGlmKCBoY2ZTdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7CisgICAgICAgIHN3aXRjaCggaGNmU3RhdHVzICkgeworCisgICAgICAgIGNhc2UgSENGX0VSUl9USU1FX09VVDoKKworICAgICAgICAgICAgcE1zZyA9ICJFeHBlY3RlZCBhZGFwdGVyIGV2ZW50IGRpZCBub3Qgb2NjdXIgaW4gZXhwZWN0ZWQgdGltZSI7CisgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGNhc2UgSENGX0VSUl9OT19OSUM6CisKKyAgICAgICAgICAgIHBNc2cgPSAiQ2FyZCBub3QgZm91bmQgKGVqZWN0ZWQgdW5leHBlY3RlZGx5KSI7CisgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGNhc2UgSENGX0VSUl9MRU46CisKKyAgICAgICAgICAgIHBNc2cgPSAiQ29tbWFuZCBidWZmZXIgc2l6ZSBpbnN1ZmZpY2llbnQiOworICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICBjYXNlIEhDRl9FUlJfSU5DT01QX1BSSToKKworICAgICAgICAgICAgcE1zZyA9ICJQcmltYXJ5IGZ1bmN0aW9ucyBhcmUgbm90IGNvbXBhdGlibGUiOworICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICBjYXNlIEhDRl9FUlJfSU5DT01QX0ZXOgorCisgICAgICAgICAgICBwTXNnID0gIlByaW1hcnkgZnVuY3Rpb25zIGFyZSBjb21wYXRpYmxlLCAiCisgICAgICAgICAgICAgICAgInN0YXRpb24vYXAgZnVuY3Rpb25zIGFyZSBub3QiOworICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICBjYXNlIEhDRl9FUlJfQlVTWToKKworICAgICAgICAgICAgcE1zZyA9ICJJbnF1aXJlIGNtZCB3aGlsZSBhbm90aGVyIElucXVpcmUgaW4gcHJvZ3Jlc3MiOworICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICAvL2Nhc2UgSENGX0VSUl9TRVFfQlVHOgorCisgICAgICAgIC8vICAgIHBNc2cgPSAiVW5leHBlY3RlZCBjb21tYW5kIGNvbXBsZXRlZCI7CisgICAgICAgIC8vICAgIGJyZWFrOworCisKKyAgICAgICAgY2FzZSBIQ0ZfRVJSX0RFRlVOQ1RfQVVYOgorCisgICAgICAgICAgICBwTXNnID0gIlRpbWVvdXQgb24gYWNrIGZvciBlbmFibGUvZGlzYWJsZSBvZiBBVVggcmVnaXN0ZXJzIjsKKyAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgY2FzZSBIQ0ZfRVJSX0RFRlVOQ1RfVElNRVI6CisgICAgICAgICAgICBwTXNnID0gIlRpbWVvdXQgb24gdGltZXIgY2FsaWJyYXRpb24gZHVyaW5nIGluaXRpYWxpemF0aW9uIHByb2Nlc3MiOworICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICBjYXNlIEhDRl9FUlJfREVGVU5DVF9USU1FX09VVDoKKyAgICAgICAgICAgIHBNc2cgPSAiVGltZW91dCBvbiBCdXN5IGJpdCBkcm9wIGR1cmluZyBCQVAgc2V0dXAiOworICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICBjYXNlIEhDRl9FUlJfREVGVU5DVF9DTURfU0VROgorICAgICAgICAgICAgcE1zZyA9ICJIZXJtZXMgYW5kIEhDRiBhcmUgb3V0IG9mIHN5bmMiOworICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICBkZWZhdWx0OgorCisgICAgICAgICAgICBzcHJpbnRmKCBidWZmZXIsICJFcnJvciBjb2RlICVkIiwgaGNmU3RhdHVzICk7CisgICAgICAgICAgICBwTXNnID0gYnVmZmVyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBwcmludGsoIEtFUk5fSU5GTyAiJXM6IFdpcmVsZXNzLCBIQ0YgZmFpbHVyZTogXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgcE1zZyApOworICAgIH0KK30gLy8gd2xfaGNmX2Vycm9yCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfZW5kaWFuX3RyYW5zbGF0ZV9ldmVudCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIERldGVybWluZXMgd2hhdCB0eXBlIG9mIGRhdGEgaXMgaW4gdGhlIG1haWxib3ggYW5kIHBlcmZvcm1zIHRoZSBwcm9wZXIKKyAqICBlbmRpYW4gdHJhbnNsYXRpb24uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBwTHR2IC0gYW4gTFRWIHBvaW50ZXIKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX2VuZGlhbl90cmFuc2xhdGVfZXZlbnQoIGx0dl90ICpwTHR2ICkKK3sKKyAgICBEQkdfRlVOQyggIndsX2VuZGlhbl90cmFuc2xhdGVfZXZlbnQiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKworICAgIHN3aXRjaCggcEx0di0+dHlwICkgeworICAgIGNhc2UgQ0ZHX1RBTExJRVM6CisgICAgICAgIGJyZWFrOworCisKKyAgICBjYXNlIENGR19TQ0FOOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbnVtQVBzOworICAgICAgICAgICAgU0NBTl9SU19TVFJDVCAqcEFwcyA9IChTQ0FOX1JTX1NUUkNUKikmcEx0di0+dS51OFswXTsKKworICAgICAgICAgICAgbnVtQVBzID0gKGhjZl8xNikoKCAoc2l6ZV90KSggcEx0di0+bGVuIC0gMSApICogMiApIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZiggU0NBTl9SU19TVFJDVCApKSk7CisKKyAgICAgICAgICAgIHdoaWxlKCBudW1BUHMgPj0gMSApIHsKKyAgICAgICAgICAgICAgICBudW1BUHMtLTsKKworICAgICAgICAgICAgICAgIHBBcHNbbnVtQVBzXS5jaGFubmVsX2lkICAgICAgICAgICA9CisgICAgICAgICAgICAgICAgICAgIENOVl9MSVRUTEVfVE9fSU5UKCBwQXBzW251bUFQc10uY2hhbm5lbF9pZCApOworCisgICAgICAgICAgICAgICAgcEFwc1tudW1BUHNdLm5vaXNlX2xldmVsICAgICAgICAgID0KKyAgICAgICAgICAgICAgICAgICAgQ05WX0xJVFRMRV9UT19JTlQoIHBBcHNbbnVtQVBzXS5ub2lzZV9sZXZlbCApOworCisgICAgICAgICAgICAgICAgcEFwc1tudW1BUHNdLnNpZ25hbF9sZXZlbCAgICAgICAgID0KKyAgICAgICAgICAgICAgICAgICAgQ05WX0xJVFRMRV9UT19JTlQoIHBBcHNbbnVtQVBzXS5zaWduYWxfbGV2ZWwgKTsKKworICAgICAgICAgICAgICAgIHBBcHNbbnVtQVBzXS5iZWFjb25faW50ZXJ2YWxfdGltZSA9CisgICAgICAgICAgICAgICAgICAgIENOVl9MSVRUTEVfVE9fSU5UKCBwQXBzW251bUFQc10uYmVhY29uX2ludGVydmFsX3RpbWUgKTsKKworICAgICAgICAgICAgICAgIHBBcHNbbnVtQVBzXS5jYXBhYmlsaXR5ICAgICAgICAgICA9CisgICAgICAgICAgICAgICAgICAgIENOVl9MSVRUTEVfVE9fSU5UKCBwQXBzW251bUFQc10uY2FwYWJpbGl0eSApOworCisgICAgICAgICAgICAgICAgcEFwc1tudW1BUHNdLnNzaWRfbGVuICAgICAgICAgICAgID0KKyAgICAgICAgICAgICAgICAgICAgQ05WX0xJVFRMRV9UT19JTlQoIHBBcHNbbnVtQVBzXS5zc2lkX2xlbiApOworCisgICAgICAgICAgICAgICAgcEFwc1tudW1BUHNdLnNzaWRfdmFsW3BBcHNbbnVtQVBzXS5zc2lkX2xlbl0gPSAwOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKworICAgIGNhc2UgQ0ZHX0FDU19TQ0FOOgorICAgICAgICB7CisgICAgICAgICAgICBQUk9CRV9SRVNQICpwcm9iZV9yZXNwID0gKFBST0JFX1JFU1AgKilwTHR2OworCisgICAgICAgICAgICBwcm9iZV9yZXNwLT5mcmFtZUNvbnRyb2wgICA9IENOVl9MSVRUTEVfVE9fSU5UKCBwcm9iZV9yZXNwLT5mcmFtZUNvbnRyb2wgKTsKKyAgICAgICAgICAgIHByb2JlX3Jlc3AtPmR1cklEICAgICAgICAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHByb2JlX3Jlc3AtPmR1cklEICk7CisgICAgICAgICAgICBwcm9iZV9yZXNwLT5zZXF1ZW5jZSAgICAgICA9IENOVl9MSVRUTEVfVE9fSU5UKCBwcm9iZV9yZXNwLT5zZXF1ZW5jZSApOworICAgICAgICAgICAgcHJvYmVfcmVzcC0+ZGF0YUxlbmd0aCAgICAgPSBDTlZfTElUVExFX1RPX0lOVCggcHJvYmVfcmVzcC0+ZGF0YUxlbmd0aCApOworCisjaWZuZGVmIFdBUlAKKyAgICAgICAgICAgIHByb2JlX3Jlc3AtPmxlblR5cGUgICAgICAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHByb2JlX3Jlc3AtPmxlblR5cGUgKTsKKyNlbmRpZiAvLyBXQVJQCisKKyAgICAgICAgICAgIHByb2JlX3Jlc3AtPmJlYWNvbkludGVydmFsID0gQ05WX0xJVFRMRV9UT19JTlQoIHByb2JlX3Jlc3AtPmJlYWNvbkludGVydmFsICk7CisgICAgICAgICAgICBwcm9iZV9yZXNwLT5jYXBhYmlsaXR5ICAgICA9IENOVl9MSVRUTEVfVE9fSU5UKCBwcm9iZV9yZXNwLT5jYXBhYmlsaXR5ICk7CisgICAgICAgICAgICBwcm9iZV9yZXNwLT5mbGFncyAgICAgICAgICA9IENOVl9MSVRUTEVfVE9fSU5UKCBwcm9iZV9yZXNwLT5mbGFncyApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisKKyAgICBjYXNlIENGR19MSU5LX1NUQVQ6CisjZGVmaW5lIGxzICgoTElOS19TVEFUVVNfU1RSQ1QgKilwTHR2KQorICAgICAgICAgICAgbHMtPmxpbmtTdGF0dXMgPSBDTlZfTElUVExFX1RPX0lOVCggbHMtPmxpbmtTdGF0dXMgKTsKKyAgICAgICAgYnJlYWs7CisjdW5kZWYgbHMKKworICAgIGNhc2UgQ0ZHX0FTU09DX1NUQVQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU09DX1NUQVRVU19TVFJDVCAqcEFzID0gKEFTU09DX1NUQVRVU19TVFJDVCAqKXBMdHY7CisKKyAgICAgICAgICAgIHBBcy0+YXNzb2NTdGF0dXMgPSBDTlZfTElUVExFX1RPX0lOVCggcEFzLT5hc3NvY1N0YXR1cyApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisKKyAgICBjYXNlIENGR19TRUNVUklUWV9TVEFUOgorICAgICAgICB7CisgICAgICAgICAgICBTRUNVUklUWV9TVEFUVVNfU1RSQ1QgKnBTcyA9IChTRUNVUklUWV9TVEFUVVNfU1RSQ1QgKilwTHR2OworCisgICAgICAgICAgICBwU3MtPnNlY3VyaXR5U3RhdHVzID0gQ05WX0xJVFRMRV9UT19JTlQoIHBTcy0+c2VjdXJpdHlTdGF0dXMgKTsKKyAgICAgICAgICAgIHBTcy0+cmVhc29uICAgICAgICAgPSBDTlZfTElUVExFX1RPX0lOVCggcFNzLT5yZWFzb24gKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworCisgICAgY2FzZSBDRkdfV01QOgorICAgICAgICBicmVhazsKKworCisgICAgY2FzZSBDRkdfTlVMTDoKKyAgICAgICAgYnJlYWs7CisKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybjsKK30gLy8gd2xfZW5kaWFuX3RyYW5zbGF0ZV9ldmVudAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJbXNmX2Fzc2VydCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFByaW50IHN0YXRlbWVudCB1c2VkIHRvIGRpc3BsYXkgYXNzZXJ0cyBmcm9tIHdpdGhpbiB0aGUgSENGLiBPbmx5IGNhbGxlZAorICogIHdoZW4gYXNzZXJ0cyBpbiB0aGUgSENGIGFyZSB0dXJuZWQgb24uIFNlZSBoY2ZjZmcuaCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGZpbGVfbmFtZXAgIC0gdGhlIGZpbGVuYW1lIGluIHdoaWNoIHRoZSBhc3NlcnQgb2NjdXJyZWQuCisgKiAgICAgIGxpbmVfbnVtYmVyIC0gdGhlIGxpbmUgbnVtYmVyIG9uIHdoaWNoIHRoZSBhc3NlcnQgb2NjdXJyZWQuCisgKiAgICAgIHRyYWNlICAgICAgIC0gYSBjb21tZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzZXJ0LgorICogICAgICBxdWFsICAgICAgICAtIHJldHVybiBjb2RlIG9yIG90aGVyIHZhbHVlIHJlbGF0ZWQgdG8gdGhlIGFzc2VydAorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgbXNmX2Fzc2VydCggdW5zaWduZWQgaW50IGxpbmVfbnVtYmVyLCBoY2ZfMTYgdHJhY2UsIGhjZl8zMiBxdWFsICkKK3sKKyAgICBEQkdfUFJJTlQoICJIQ0YgQVNTRVJUOiBMaW5lICVkLCBWQUw6IDB4JS44eFxuIiwgbGluZV9udW1iZXIsIC8qOz8qLyh1MzIpcXVhbCApOworfSAvLyBtc2ZfYXNzZXJ0CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcGFyc2VfZHNfaWUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIHBhcnNlcyB0aGUgRGlyZWN0IFNlcXVlbmNlIFBhcmFtZXRlciBTZXQgSUUsIHVzZWQgdG8KKyAqICAgICAgZGV0ZXJtaW5lIGNoYW5uZWwvZnJlcXVlbmN5IGluZm9ybWF0aW9uLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgcHJvYmVfcnNwIC0gYSBwb2ludGVyIHRvIGEgUFJPQkVfUkVTUCBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgcHJvYmUKKyAqICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBUaGUgY2hhbm5lbCBvbiB3aGljaCB0aGUgQlNTIHJlcHJlc2VudGVkIGJ5IHRoaXMgcHJvYmUgcmVzcG9uc2UgaXMKKyAqICAgICAgdHJhbnNtaXR0aW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitoY2ZfOCB3bF9wYXJzZV9kc19pZSggUFJPQkVfUkVTUCAqcHJvYmVfcnNwICkKK3sKKyAgICBpbnQgICAgIGk7CisgICAgaW50ICAgICBpZV9sZW5ndGggPSAwOworICAgIGhjZl84ICAgKmJ1ZjsKKyAgICBoY2ZfOCAgIGJ1Zl9zaXplOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgaWYoIHByb2JlX3JzcCA9PSBOVUxMICkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBidWYgICAgICA9IHByb2JlX3JzcC0+cmF3RGF0YTsKKyAgICBidWZfc2l6ZSA9IHNpemVvZiggcHJvYmVfcnNwLT5yYXdEYXRhICk7CisKKworICAgIGZvciggaSA9IDA7IGkgPCBidWZfc2l6ZTsgaSsrICkgeworICAgICAgICBpZiggYnVmW2ldID09IERTX0lORk9fRUxFTSApIHsKKyAgICAgICAgICAgIC8qIEluY3JlbWVudCBieSAxIHRvIGdldCB0aGUgbGVuZ3RoLCBhbmQgdGVzdCBpdDsgaW4gYSBEUyBlbGVtZW50LAorICAgICAgICAgICAgICAgbGVuZ3RoIHNob3VsZCBhbHdheXMgYmUgMSAqLworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgaWVfbGVuZ3RoID0gYnVmW2ldOworCisgICAgICAgICAgICBpZiggYnVmW2ldID09IDEgKSB7CisgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBjaGFubmVsIGluZm9ybWF0aW9uICovCisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIHJldHVybiBidWZbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJZiB3ZSBnZXQgaGVyZSwgd2UgZGlkbid0IGZpbmQgYSBEUy1JRSwgd2hpY2ggaXMgc3RyYW5nZSAqLworICAgIHJldHVybiAwOworfSAvLyB3bF9wYXJzZV9kc19pZQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wYXJzZV93cGFfaWUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIHBhcnNlcyB0aGUgUHJvYmUgUmVzcG9uc2UgZm9yIGEgdmFsaWQgV1BBLUlFLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgcHJvYmVfcnNwIC0gYSBwb2ludGVyIHRvIGEgUFJPQkVfUkVTUCBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgcHJvYmUKKyAqICAgICAgICAgICAgICAgICAgcmVzcG9uc2UKKyAqICAgICAgbGVuZ3RoICAgIC0gYSBwb2ludGVyIHRvIGFuIGhjZl8xNiBpbiB3aGljaCB0aGUgc2l6ZSBvZiB0aGUgV1BBLUlFIHdpbGwKKyAqICAgICAgICAgICAgICAgICAgYmUgc3RvcmVkIChpZiBmb3VuZCkuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBBIHBvaW50ZXIgdG8gdGhlIGxvY2F0aW9uIGluIHRoZSBwcm9iZSByZXNwb25zZSBidWZmZXIgd2hlcmUgYSB2YWxpZAorICogICAgICBXUEEtSUUgbGl2ZXMuIFRoZSBsZW5ndGggb2YgdGhpcyBJRSBpcyB3cml0dGVuIGJhY2sgdG8gdGhlICdsZW5ndGgnCisgKiAgICAgIGFyZ3VtZW50IHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2hjZl84ICogd2xfcGFyc2Vfd3BhX2llKCBQUk9CRV9SRVNQICpwcm9iZV9yc3AsIGhjZl8xNiAqbGVuZ3RoICkKK3sKKyAgICBpbnQgICAgIGk7CisgICAgaW50ICAgICBpZV9sZW5ndGggPSAwOworICAgIGhjZl84ICAgKmJ1ZjsKKyAgICBoY2ZfOCAgIGJ1Zl9zaXplOworICAgIGhjZl84ICAgd3BhX291aVtdID0gV1BBX09VSV9UWVBFOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgaWYoIHByb2JlX3JzcCA9PSBOVUxMIHx8IGxlbmd0aCA9PSBOVUxMICkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBidWYgICAgICA9IHByb2JlX3JzcC0+cmF3RGF0YTsKKyAgICBidWZfc2l6ZSA9IHNpemVvZiggcHJvYmVfcnNwLT5yYXdEYXRhICk7CisgICAgKmxlbmd0aCAgPSAwOworCisKKyAgICBmb3IoIGkgPSAwOyBpIDwgYnVmX3NpemU7IGkrKyApIHsKKyAgICAgICAgaWYoIGJ1ZltpXSA9PSBHRU5FUklDX0lORk9fRUxFTSApIHsKKyAgICAgICAgICAgIC8qIEluY3JlbWVudCBieSBvbmUgdG8gZ2V0IHRoZSBJRSBsZW5ndGggKi8KKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIGllX2xlbmd0aCA9IHByb2JlX3JzcC0+cmF3RGF0YVtpXTsKKworICAgICAgICAgICAgLyogSW5jcmVtZW50IGJ5IG9uZSB0byBwb2ludCB0byB0aGUgSUUgcGF5bG9hZCAqLworICAgICAgICAgICAgaSsrOworCisgICAgICAgICAgICAvKiBEb2VzIHRoZSBJRSBjb250YWluIGEgV1BBIE9VST8gSWYgbm90LCBpdCdzIGEgcHJvcHJpZXRhcnkgSUUgKi8KKyAgICAgICAgICAgIGlmKCBtZW1jbXAoICZidWZbaV0sICZ3cGFfb3VpLCBXUEFfU0VMRUNUT1JfTEVOICkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAvKiBQYXNzIGJhY2sgbGVuZ3RoIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBXUEEtSUUgKi8KKyAgICAgICAgICAgICAgICAvKiBOT1RFOiBMZW5ndGggY29udGFpbmVkIGluIHRoZSBXUEEtSUUgaXMgb25seSB0aGUgbGVuZ3RoIG9mCisgICAgICAgICAgICAgICAgICAgdGhlIHBheWxvYWQuIFRoZSBlbnRpcmUgV1BBLUlFLCBpbmNsdWRpbmcgdGhlIElFIGlkZW50aWZpZXIKKyAgICAgICAgICAgICAgICAgICBhbmQgdGhlIGxlbmd0aCwgaXMgMiBieXRlcyBsYXJnZXIgKi8KKyAgICAgICAgICAgICAgICAqbGVuZ3RoID0gaWVfbGVuZ3RoICsgMjsKKworICAgICAgICAgICAgICAgIC8qIEJhY2sgdXAgdGhlIHBvaW50ZXIgMiBieXRlcyB0byBpbmNsdWRlIHRoZSBJRSBpZGVudGlmaWVyIGFuZAorICAgICAgICAgICAgICAgICAgIHRoZSBsZW5ndGggaW4gdGhlIGJ1ZmZlciByZXR1cm5lZCAqLworICAgICAgICAgICAgICAgIGkgLT0gMjsKKyAgICAgICAgICAgICAgICByZXR1cm4gJmJ1ZltpXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogSW5jcmVtZW50IHBhc3QgdGhpcyBub24tV1BBIElFIGFuZCBjb250aW51ZSBsb29raW5nICovCisgICAgICAgICAgICBpICs9ICggaWVfbGVuZ3RoIC0gMSApOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSWYgd2UncmUgaGVyZSwgd2UgZGlkbid0IGZpbmQgYSBXUEEtSUUgaW4gdGhlIGJ1ZmZlciAqLworICAgIHJldHVybiBOVUxMOworfSAvLyB3bF9wYXJzZV93cGFfaWUKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcHJpbnRfd3BhX2llKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgRnVuY3Rpb24gdXNlZCB0byB0YWtlIGEgV1BBIEluZm9ybWF0aW9uIEVsZW1lbnQgKFdQQS1JRSkgYnVmZmVyIGFuZAorICogICAgICBkaXNwbGF5IGl0IGluIGEgcmVhZGFibGUgZm9ybWF0LgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgYnVmZmVyIC0gdGhlIGJ5dGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIFdQQS1JRQorICogICAgICBsZW5ndGggLSB0aGUgbGVuZ3RoIG9mIHRoZSBhYm92ZSBidWZmZXIKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIEEgcG9pbnRlciB0byB0aGUgZm9ybWF0dGVkIFdQQS1JRSBzdHJpbmcuIE5vdGUgdGhhdCB0aGUgZm9ybWF0IHVzZWQgaXMKKyAqICAgICAgYnl0ZS1ieS1ieXRlIHByaW50aW5nIGFzICUwMnggaGV4IHZhbHVlcyB3aXRoIG5vIHNwYWNlcy4gVGhpcyBpcworICogICAgICByZXF1aXJlZCBmb3IgcHJvcGVyIG9wZXJhdGlvbiB3aXRoIHNvbWUgV1BBIHN1cHBsaWNhbnRzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitoY2ZfOCAqIHdsX3ByaW50X3dwYV9pZSggaGNmXzggKmJ1ZmZlciwgaW50IGxlbmd0aCApCit7CisgICAgaW50IGNvdW50OworICAgIGludCByb3dzOworICAgIGludCByZW1haW5kZXI7CisgICAgaW50IHJvd3NpemUgPSA0OworICAgIGhjZl84IHJvd19idWZbNjRdOworICAgIHN0YXRpYyBoY2ZfOCBvdXRwdXRbNTEyXTsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworICAgIG1lbXNldCggb3V0cHV0LCAwLCBzaXplb2YoIG91dHB1dCApKTsKKyAgICBtZW1zZXQoIHJvd19idWYsIDAsIHNpemVvZiggcm93X2J1ZiApKTsKKworCisgICAgLyogRGV0ZXJtaW5lIGhvdyBtYW55IHJvd3Mgd2lsbCBiZSBuZWVkZWQsIGFuZCB0aGUgcmVtYWluZGVyICovCisgICAgcm93cyA9IGxlbmd0aCAvIHJvd3NpemU7CisgICAgcmVtYWluZGVyID0gbGVuZ3RoICUgcm93c2l6ZTsKKworCisgICAgLyogRm9ybWF0IHRoZSByb3dzICovCisgICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgcm93czsgY291bnQrKyApIHsKKyAgICAgICAgc3ByaW50Ziggcm93X2J1ZiwgIiUwMnglMDJ4JTAyeCUwMngiLAorICAgICAgICAgICAgICAgICBidWZmZXJbY291bnQqcm93c2l6ZV0sIGJ1ZmZlcltjb3VudCpyb3dzaXplKzFdLAorICAgICAgICAgICAgICAgICBidWZmZXJbY291bnQqcm93c2l6ZSsyXSwgYnVmZmVyW2NvdW50KnJvd3NpemUrM10pOworICAgICAgICBzdHJjYXQoIG91dHB1dCwgcm93X2J1ZiApOworICAgIH0KKworICAgIG1lbXNldCggcm93X2J1ZiwgMCwgc2l6ZW9mKCByb3dfYnVmICkpOworCisKKyAgICAvKiBGb3JtYXQgdGhlIHJlbWFpbmRlciAqLworICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IHJlbWFpbmRlcjsgY291bnQrKyApIHsKKyAgICAgICAgc3ByaW50Ziggcm93X2J1ZiwgIiUwMngiLCBidWZmZXJbKHJvd3Mqcm93c2l6ZSkrY291bnRdKTsKKyAgICAgICAgc3RyY2F0KCBvdXRwdXQsIHJvd19idWYgKTsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0cHV0OworfSAvLyB3bF9wcmludF93cGFfaWUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9pc19hX3ZhbGlkX2NoYW4oKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBDaGVja3MgaWYgYSBnaXZlbiBjaGFubmVsIGlzIHZhbGlkCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBjaGFubmVsIC0gdGhlIGNoYW5uZWwKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDEgaWYgVFJVRQorICogICAgICAwIGlmIEZBTFNFCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9pc19hX3ZhbGlkX2NoYW4oIGludCBjaGFubmVsICkKK3sKKyAgICBpbnQgaTsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworICAgIC8qIFN0cmlwIG91dCB0aGUgaGlnaCBiaXQgc2V0IGJ5IHRoZSBGVyBmb3IgODAyLjExYSBjaGFubmVscyAqLworICAgIGlmKCBjaGFubmVsICYgMHgxMDAgKSB7CisgICAgICAgIGNoYW5uZWwgPSBjaGFubmVsICYgMHgwRkY7CisgICAgfQorCisgICAgLyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBtYXRyaXggYW5kIHJldHJpZXZlIHRoZSBmcmVxdWVuY3kgKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgTUFYX0NIQU5fRlJFUV9NQVBfRU5UUklFUzsgaSsrICkgeworICAgICAgICBpZiggY2hhbl9mcmVxX2xpc3RbaV1bMF0gPT0gY2hhbm5lbCApIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9IC8vIHdsX2lzX2FfdmFsaWRfY2hhbgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2dldF9jaGFuX2Zyb21fZnJlcSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIENoZWNrcyBpZiBhIGdpdmVuIGZyZXF1ZW5jeSBpcyB2YWxpZAorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZnJlcSAtIHRoZSBmcmVxdWVuY3kKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDEgaWYgVFJVRQorICogICAgICAwIGlmIEZBTFNFCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9pc19hX3ZhbGlkX2ZyZXEoIGxvbmcgZnJlcXVlbmN5ICkKK3sKKyAgICBpbnQgaTsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbWF0cml4IGFuZCByZXRyaWV2ZSB0aGUgY2hhbm5lbCAqLworICAgIGZvciggaSA9IDA7IGkgPCBNQVhfQ0hBTl9GUkVRX01BUF9FTlRSSUVTOyBpKysgKSB7CisgICAgICAgIGlmKCBjaGFuX2ZyZXFfbGlzdFtpXVsxXSA9PSBmcmVxdWVuY3kgKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfSAvLyB3bF9pc19hX3ZhbGlkX2ZyZXEKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9nZXRfZnJlcV9mcm9tX2NoYW4oKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBGdW5jdGlvbiB1c2VkIHRvIGxvb2sgdXAgdGhlIGZyZXF1ZW5jeSBmb3IgYSBnaXZlbiBjaGFubmVsIG9uIHdoaWNoIHRoZQorICogICAgICBhZGFwdGVyIGlzIFR4L1J4LgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgY2hhbm5lbCAtIHRoZSBjaGFubmVsCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBUaGUgY29ycmVzcG9uZGluZyBmcmVxdWVuY3kKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworbG9uZyB3bF9nZXRfZnJlcV9mcm9tX2NoYW4oIGludCBjaGFubmVsICkKK3sKKyAgICBpbnQgaTsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworICAgIC8qIFN0cmlwIG91dCB0aGUgaGlnaCBiaXQgc2V0IGJ5IHRoZSBGVyBmb3IgODAyLjExYSBjaGFubmVscyAqLworICAgIGlmKCBjaGFubmVsICYgMHgxMDAgKSB7CisgICAgICAgIGNoYW5uZWwgPSBjaGFubmVsICYgMHgwRkY7CisgICAgfQorCisgICAgLyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBtYXRyaXggYW5kIHJldHJpZXZlIHRoZSBmcmVxdWVuY3kgKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgTUFYX0NIQU5fRlJFUV9NQVBfRU5UUklFUzsgaSsrICkgeworICAgICAgICBpZiggY2hhbl9mcmVxX2xpc3RbaV1bMF0gPT0gY2hhbm5lbCApIHsKKyAgICAgICAgICAgIHJldHVybiBjaGFuX2ZyZXFfbGlzdFtpXVsxXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfSAvLyB3bF9nZXRfZnJlcV9mcm9tX2NoYW4KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9nZXRfY2hhbl9mcm9tX2ZyZXEoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBGdW5jdGlvbiB1c2VkIHRvIGxvb2sgdXAgdGhlIGNoYW5uZWwgZm9yIGEgZ2l2ZW4gZnJlcXVlbmN5IG9uIHdoaWNoIHRoZQorICogICAgICBhZGFwdGVyIGlzIFR4L1J4LgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZnJlcXVlbmN5IC0gdGhlIGZyZXF1ZW5jeQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgVGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfZ2V0X2NoYW5fZnJvbV9mcmVxKCBsb25nIGZyZXF1ZW5jeSApCit7CisgICAgaW50IGk7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgICAvKiBJdGVyYXRlIHRocm91Z2ggdGhlIG1hdHJpeCBhbmQgcmV0cmlldmUgdGhlIGNoYW5uZWwgKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgTUFYX0NIQU5fRlJFUV9NQVBfRU5UUklFUzsgaSsrICkgeworICAgICAgICBpZiggY2hhbl9mcmVxX2xpc3RbaV1bMV0gPT0gZnJlcXVlbmN5ICkgeworICAgICAgICAgICAgcmV0dXJuIGNoYW5fZnJlcV9saXN0W2ldWzBdOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9IC8vIHdsX2dldF9jaGFuX2Zyb21fZnJlcQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3Byb2Nlc3NfbGlua19zdGF0dXMoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBQcm9jZXNzIHRoZSBsaW5rIHN0YXR1cyBtZXNzYWdlIHNpZ25hbGVkIGJ5IHRoZSBkZXZpY2UuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3Byb2Nlc3NfbGlua19zdGF0dXMoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisgICAgaGNmXzE2IGxpbmtfc3RhdDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX3Byb2Nlc3NfbGlua19zdGF0dXMiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKyAgICBpZiggbHAgIT0gTlVMTCApIHsKKyAgICAgICAgLy9saW5rX3N0YXQgPSBscC0+aGNmQ3R4LklGQl9EU0xpbmtTdGF0ICYgQ0ZHX0xJTktfU1RBVF9GVzsKKyAgICAgICAgbGlua19zdGF0ID0gbHAtPmhjZkN0eC5JRkJfTGlua1N0YXQgJiBDRkdfTElOS19TVEFUX0ZXOworICAgICAgICBzd2l0Y2goIGxpbmtfc3RhdCApIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiTGluayBTdGF0dXMgOiBDb25uZWN0ZWRcbiIgKTsKKyAgICAgICAgICAgIHdsX3dleHRfZXZlbnRfYXAoIGxwLT5kZXYgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJMaW5rIFN0YXR1cyA6IERpc2Nvbm5lY3RlZFxuIiAgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJMaW5rIFN0YXR1cyA6IEFjY2VzcyBQb2ludCBDaGFuZ2VcbiIgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJMaW5rIFN0YXR1cyA6IEFjY2VzcyBQb2ludCBPdXQgb2YgUmFuZ2VcbiIgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJMaW5rIFN0YXR1cyA6IEFjY2VzcyBQb2ludCBJbiBSYW5nZVxuIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJMaW5rIFN0YXR1cyA6IFVOS05PV04gKDB4JTA0eClcbiIsIGxpbmtfc3RhdCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuOworfSAvLyB3bF9wcm9jZXNzX2xpbmtfc3RhdHVzCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcHJvY2Vzc19wcm9iZV9yZXNwb25zZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFByb2Nlc3MgdGhlIHByb2JlIHJlc3BvbnNlcyByZXR1bnJlZCBieSB0aGUgZGV2aWNlIGFzIGEgcmVzdWx0IG9mIGFuCisgKiAgICAgIGFjdGl2ZSBzY2FuLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworICAgIFBST0JFX1JFU1AgICpwcm9iZV9yc3A7CisgICAgaGNmXzggICAgICAgKndwYV9pZSA9IE5VTEw7CisgICAgaGNmXzE2ICAgICAgd3BhX2llX2xlbiA9IDA7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgICBEQkdfRlVOQyggIndsX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2UiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKworICAgIGlmKCBscCAhPSBOVUxMICkgeworICAgICAgICBwcm9iZV9yc3AgPSAoUFJPQkVfUkVTUCAqKSZscC0+UHJvYmVSZXNwOworCisgICAgICAgIHdsX2VuZGlhbl90cmFuc2xhdGVfZXZlbnQoIChsdHZfdCAqKXByb2JlX3JzcCApOworCisgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgPT09PT09PT09PT09PT09PT09PT09PT09PVxuIiwgbHAtPmRldi0+bmFtZSApOworICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGxlbmd0aCAgICAgIDogMHglMDR4LlxuIiwgIGxwLT5kZXYtPm5hbWUsCisgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT5sZW5ndGggKTsKKworICAgICAgICBpZiggcHJvYmVfcnNwLT5sZW5ndGggPiAxICkgeworICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBpbmZvVHlwZSAgICA6IDB4JTA0eC5cbiIsIGxwLT5kZXYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+aW5mb1R5cGUgKTsKKworICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBzaWduYWwgICAgICA6IDB4JTAyeC5cbiIsIGxwLT5kZXYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+c2lnbmFsICk7CisKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgc2lsZW5jZSAgICAgOiAweCUwMnguXG4iLCBscC0+ZGV2LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnNpbGVuY2UgKTsKKworICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSByeEZsb3cgICAgICA6IDB4JTAyeC5cbiIsIGxwLT5kZXYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+cnhGbG93ICk7CisKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgcmF0ZSAgICAgICAgOiAweCUwMnguXG4iLCBscC0+ZGV2LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnJhdGUgKTsKKworICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBmcmFtZSBjbnRsICA6IDB4JTA0eC5cbiIsIGxwLT5kZXYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+ZnJhbWVDb250cm9sICk7CisKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgZHVySUQgICAgICAgOiAweCUwNHguXG4iLCBscC0+ZGV2LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPmR1cklEICk7CisKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgYWRkcmVzczEgICAgOiAlc1xuIiwgbHAtPmRldi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgRGJnSHdBZGRyKCBwcm9iZV9yc3AtPmFkZHJlc3MxICkpOworCisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGFkZHJlc3MyICAgIDogJXNcbiIsIGxwLT5kZXYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgIERiZ0h3QWRkciggcHJvYmVfcnNwLT5hZGRyZXNzMiApKTsKKworICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBCU1NJRCAgICAgICA6ICVzXG4iLCBscC0+ZGV2LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICBEYmdId0FkZHIoIHByb2JlX3JzcC0+QlNTSUQgKSk7CisKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgc2VxdWVuY2UgICAgOiAweCUwNHguXG4iLCBscC0+ZGV2LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnNlcXVlbmNlICk7CisKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgYWRkcmVzczQgICAgOiAlc1xuIiwgbHAtPmRldi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgRGJnSHdBZGRyKCBwcm9iZV9yc3AtPmFkZHJlc3M0ICkpOworCisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGRhdGFsZW5ndGggIDogMHglMDR4LlxuIiwgbHAtPmRldi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT5kYXRhTGVuZ3RoICk7CisKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgREEgICAgICAgICAgOiAlc1xuIiwgbHAtPmRldi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgRGJnSHdBZGRyKCBwcm9iZV9yc3AtPkRBICkpOworCisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIFNBICAgICAgICAgIDogJXNcbiIsIGxwLT5kZXYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgIERiZ0h3QWRkciggcHJvYmVfcnNwLT5TQSApKTsKKworI2lmZGVmIFdBUlAKKworICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBjaGFubmVsICAgICA6ICVkXG4iLCBscC0+ZGV2LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPmNoYW5uZWwgKTsKKworICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBiYW5kICAgICAgICA6ICVkXG4iLCBscC0+ZGV2LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPmJhbmQgKTsKKyNlbHNlCisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGxlblR5cGUgICAgIDogMHglMDR4LlxuIiwgbHAtPmRldi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT5sZW5UeXBlICk7CisjZW5kaWYgIC8vIFdBUlAKKworICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSB0aW1lU3RhbXAgICA6ICVkLiVkLiVkLiVkLiVkLiVkLiVkLiVkXG4iLAorICAgICAgICAgICAgICAgICAgICBscC0+ZGV2LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnRpbWVTdGFtcFswXSwKKyAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT50aW1lU3RhbXBbMV0sCisgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+dGltZVN0YW1wWzJdLAorICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnRpbWVTdGFtcFszXSwKKyAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT50aW1lU3RhbXBbNF0sCisgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+dGltZVN0YW1wWzVdLAorICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnRpbWVTdGFtcFs2XSwKKyAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT50aW1lU3RhbXBbN10pOworCisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGJlYWNvbkludCAgIDogMHglMDR4LlxuIiwgbHAtPmRldi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT5iZWFjb25JbnRlcnZhbCApOworCisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGNhcGFiaWxpdHkgIDogMHglMDR4LlxuIiwgbHAtPmRldi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT5jYXBhYmlsaXR5ICk7CisKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgU1NJRCBsZW4gICAgOiAweCUwNHguXG4iLCBscC0+ZGV2LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnJhd0RhdGFbMV0gKTsKKworCisgICAgICAgICAgICBpZiggcHJvYmVfcnNwLT5yYXdEYXRhWzFdID4gMCApIHsKKyAgICAgICAgICAgICAgICBjaGFyIHNzaWRbSENGX01BWF9OQU1FX0xFTl07CisKKyAgICAgICAgICAgICAgICBtZW1zZXQoIHNzaWQsIDAsIHNpemVvZiggc3NpZCApKTsKKyAgICAgICAgICAgICAgICBzdHJuY3B5KCBzc2lkLCAmcHJvYmVfcnNwLT5yYXdEYXRhWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+cmF3RGF0YVsxXSApOworCisgICAgICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBTU0lEICAgICAgICA6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5kZXYtPm5hbWUsIHNzaWQgKTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvKiBQYXJzZSBvdXQgdGhlIFdQQS1JRSwgaWYgb25lIGV4aXN0cyAqLworICAgICAgICAgICAgd3BhX2llID0gd2xfcGFyc2Vfd3BhX2llKCBwcm9iZV9yc3AsICZ3cGFfaWVfbGVuICk7CisgICAgICAgICAgICBpZiggd3BhX2llICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBXUEEtSUUgICAgICA6ICVzXG4iLAorICAgICAgICAgICAgICAgIGxwLT5kZXYtPm5hbWUsIHdsX3ByaW50X3dwYV9pZSggd3BhX2llLCB3cGFfaWVfbGVuICkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGZsYWdzICAgICAgIDogMHglMDR4LlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5kZXYtPm5hbWUsIHByb2JlX3JzcC0+ZmxhZ3MgKTsKKyAgICAgICAgfQorCisgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlxuIiApOworCisKKyAgICAgICAgLyogSWYgcHJvYmUgcmVzcG9uc2UgbGVuZ3RoIGlzIDEsIHRoZW4gdGhlIHNjYW4gaXMgY29tcGxldGUgKi8KKyAgICAgICAgaWYoIHByb2JlX3JzcC0+bGVuZ3RoID09IDEgKSB7CisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJTQ0FOIENPTVBMRVRFXG4iICk7CisgICAgICAgICAgICBscC0+cHJvYmVfcmVzdWx0cy5udW1fYXBzID0gbHAtPnByb2JlX251bV9hcHM7CisgICAgICAgICAgICBscC0+cHJvYmVfcmVzdWx0cy5zY2FuX2NvbXBsZXRlID0gVFJVRTsKKworICAgICAgICAgICAgLyogUmVzZXQgdGhlIGNvdW50ZXIgZm9yIHRoZSBuZXh0IHNjYW4gcmVxdWVzdCAqLworICAgICAgICAgICAgbHAtPnByb2JlX251bV9hcHMgPSAwOworCisgICAgICAgICAgICAvKiBTZW5kIGEgd2lyZWxlc3MgZXh0ZW5zaW9ucyBldmVudCB0aGF0IHRoZSBzY2FuIGNvbXBsZXRlZCAqLworICAgICAgICAgICAgd2xfd2V4dF9ldmVudF9zY2FuX2NvbXBsZXRlKCBscC0+ZGV2ICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBPbmx5IGNvcHkgdG8gdGhlIHRhYmxlIGlmIHRoZSBlbnRyeSBpcyB1bmlxdWU7IEFQcyBzb21ldGltZXMKKyAgICAgICAgICAgICAgICByZXNwb25kIG1vcmUgdGhhbiBvbmNlIHRvIGEgcHJvYmUgKi8KKyAgICAgICAgICAgIGlmKCBscC0+cHJvYmVfbnVtX2FwcyA9PSAwICkgeworICAgICAgICAgICAgICAgIC8qIENvcHkgdGhlIGluZm8gdG8gdGhlIFNjYW5SZXN1bHQgc3RydWN0dXJlIGluIHRoZSBwcml2YXRlCisgICAgICAgICAgICAgICAgYWRhcHRlciBzdHJ1Y3QgKi8KKyAgICAgICAgICAgICAgICBtZW1jcHkoICYoIGxwLT5wcm9iZV9yZXN1bHRzLlByb2JlVGFibGVbbHAtPnByb2JlX251bV9hcHNdICksCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AsIHNpemVvZiggUFJPQkVfUkVTUCApKTsKKworICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIEFQcyBkZXRlY3RlZCAqLworICAgICAgICAgICAgICAgIGxwLT5wcm9iZV9udW1fYXBzKys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBjb3VudDsKKyAgICAgICAgICAgICAgICBpbnQgdW5pcXVlID0gMTsKKworICAgICAgICAgICAgICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IGxwLT5wcm9iZV9udW1fYXBzOyBjb3VudCsrICkgeworICAgICAgICAgICAgICAgICAgICBpZiggbWVtY21wKCAmKCBwcm9iZV9yc3AtPkJTU0lEICksCisgICAgICAgICAgICAgICAgICAgICAgICBscC0+cHJvYmVfcmVzdWx0cy5Qcm9iZVRhYmxlW2NvdW50XS5CU1NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVUSF9BTEVOICkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiggdW5pcXVlICkgeworICAgICAgICAgICAgICAgICAgICAvKiBDb3B5IHRoZSBpbmZvIHRvIHRoZSBTY2FuUmVzdWx0IHN0cnVjdHVyZSBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdC4gT25seSBjb3B5IGlmIHRoZXJlJ3Mgcm9vbSBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgdGFibGUgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYoIGxwLT5wcm9iZV9udW1fYXBzIDwgTUFYX05BUFMgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoICYoIGxwLT5wcm9iZV9yZXN1bHRzLlByb2JlVGFibGVbbHAtPnByb2JlX251bV9hcHNdICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcCwgc2l6ZW9mKCBQUk9CRV9SRVNQICkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICJOdW0gb2Ygc2NhbiByZXN1bHRzIGV4Y2VlZHMgc3RvcmFnZSwgdHJ1bmNhdGluZ1xuIiApOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IHRoZSBudW1iZXIgb2YgQVBzIGRldGVjdGVkLiBOb3RlIEkgZG8gdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSBldmVuIHdoZW4gSSBkb24ndCBjb3B5IHRoZSBwcm9iZSByZXNwb25zZSB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBpbiBvcmRlciB0byBkZXRlY3QgdGhlIG92ZXJmbG93IGNvbmRpdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBscC0+cHJvYmVfbnVtX2FwcysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybjsKK30gLy8gd2xfcHJvY2Vzc19wcm9iZV9yZXNwb25zZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3Byb2Nlc3NfdXBkYXRlZF9yZWNvcmQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBQcm9jZXNzIHRoZSB1cGRhdGVkIGluZm9ybWF0aW9uIHJlY29yZCBtZXNzYWdlIHNpZ25hbGVkIGJ5IHRoZSBkZXZpY2UuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3Byb2Nlc3NfdXBkYXRlZF9yZWNvcmQoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisgICAgREJHX0ZVTkMoICJ3bF9wcm9jZXNzX3VwZGF0ZWRfcmVjb3JkIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisKKyAgICBpZiggbHAgIT0gTlVMTCApIHsKKyAgICAgICAgbHAtPnVwZGF0ZWRSZWNvcmQudS51MTZbMF0gPSBDTlZfTElUVExFX1RPX0lOVCggbHAtPnVwZGF0ZWRSZWNvcmQudS51MTZbMF0gKTsKKworICAgICAgICBzd2l0Y2goIGxwLT51cGRhdGVkUmVjb3JkLnUudTE2WzBdICkgeworICAgICAgICBjYXNlIENGR19DVVJfQ09VTlRSWV9JTkZPOgorICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiVXBkYXRlZCBSZWNvcmQ6IENGR19DVVJfQ09VTlRSWV9JTkZPXG4iICk7CisgICAgICAgICAgICB3bF9jb25uZWN0KCBscCApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBDRkdfUE9SVF9TVEFUOgorICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiVXBkYXRlZCBSZWNvcmQ6IFdBSVRfRk9SX0NPTk5FQ1QgKDB4RkQ0MClcbiIgKTsKKyAgICAgICAgICAgIC8vd2xfY29ubmVjdCggbHAgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJVTktOT1dOOiAweCUwNHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGxwLT51cGRhdGVkUmVjb3JkLnUudTE2WzBdICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm47Cit9IC8vIHdsX3Byb2Nlc3NfdXBkYXRlZF9yZWNvcmQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wcm9jZXNzX2Fzc29jX3N0YXR1cygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFByb2Nlc3MgdGhlIGFzc29jaWF0aW9uIHN0YXR1cyBldmVudCBzaWduYWxlZCBieSB0aGUgZGV2aWNlLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9wcm9jZXNzX2Fzc29jX3N0YXR1cyggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKyAgICBBU1NPQ19TVEFUVVNfU1RSQ1QgKmFzc29jX3N0YXQ7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgICBEQkdfRlVOQyggIndsX3Byb2Nlc3NfYXNzb2Nfc3RhdHVzIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisKKyAgICBpZiggbHAgIT0gTlVMTCApIHsKKyAgICAgICAgYXNzb2Nfc3RhdCA9IChBU1NPQ19TVEFUVVNfU1RSQ1QgKikmbHAtPmFzc29jX3N0YXQ7CisKKyAgICAgICAgd2xfZW5kaWFuX3RyYW5zbGF0ZV9ldmVudCggKGx0dl90ICopYXNzb2Nfc3RhdCApOworCisgICAgICAgIHN3aXRjaCggYXNzb2Nfc3RhdC0+YXNzb2NTdGF0dXMgKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIkFzc29jaWF0aW9uIFN0YXR1cyA6IFNUQSBBc3NvY2lhdGVkXG4iICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJBc3NvY2lhdGlvbiBTdGF0dXMgOiBTVEEgUmVhc3NvY2lhdGVkXG4iICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJBc3NvY2lhdGlvbiBTdGF0dXMgOiBTVEEgRGlzYXNzb2NpYXRlZFxuIiApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIkFzc29jaWF0aW9uIFN0YXR1cyA6IFVOS05PV04gKDB4JTA0eClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBhc3NvY19zdGF0LT5hc3NvY1N0YXR1cyApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJTVEEgQWRkcmVzcyAgICAgICAgOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgRGJnSHdBZGRyKCBhc3NvY19zdGF0LT5zdGFBZGRyICkpOworCisgICAgICAgIGlmKCggYXNzb2Nfc3RhdC0+YXNzb2NTdGF0dXMgPT0gMiApICAmJiAoIGFzc29jX3N0YXQtPmxlbiA9PSA4ICkpIHsKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIk9sZCBBUCBBZGRyZXNzICAgICA6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgRGJnSHdBZGRyKCBhc3NvY19zdGF0LT5vbGRBcEFkZHIgKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm47Cit9IC8vIHdsX3Byb2Nlc3NfYXNzb2Nfc3RhdHVzCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcHJvY2Vzc19zZWN1cml0eV9zdGF0dXMoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBQcm9jZXNzIHRoZSBzZWN1cml0eSBzdGF0dXMgbWVzc2FnZSBzaWduYWxlZCBieSB0aGUgZGV2aWNlLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9wcm9jZXNzX3NlY3VyaXR5X3N0YXR1cyggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKyAgICBTRUNVUklUWV9TVEFUVVNfU1RSQ1QgKnNlY19zdGF0OworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgREJHX0ZVTkMoICJ3bF9wcm9jZXNzX3NlY3VyaXR5X3N0YXR1cyIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCisgICAgaWYoIGxwICE9IE5VTEwgKSB7CisgICAgICAgIHNlY19zdGF0ID0gKFNFQ1VSSVRZX1NUQVRVU19TVFJDVCAqKSZscC0+c2VjX3N0YXQ7CisKKyAgICAgICAgd2xfZW5kaWFuX3RyYW5zbGF0ZV9ldmVudCggKGx0dl90ICopc2VjX3N0YXQgKTsKKworICAgICAgICBzd2l0Y2goIHNlY19zdGF0LT5zZWN1cml0eVN0YXR1cyApIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiU2VjdXJpdHkgU3RhdHVzIDogRGlzc2Fzc29jaWF0ZSBbQVBdXG4iICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJTZWN1cml0eSBTdGF0dXMgOiBEZWF1dGhlbnRpY2F0ZSBbQVBdXG4iICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJTZWN1cml0eSBTdGF0dXMgOiBBdXRoZW50aWNhdGUgRmFpbCBbU1RBXSBvciBbQVBdXG4iICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJTZWN1cml0eSBTdGF0dXMgOiBNSUMgRmFpbFxuIiApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiU2VjdXJpdHkgU3RhdHVzIDogQXNzb2NpYXRlIEZhaWxcbiIgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJTZWN1cml0eSBTdGF0dXMgOiBVTktOT1dOICgweCUwNHgpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VjX3N0YXQtPnNlY3VyaXR5U3RhdHVzICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlNUQSBBZGRyZXNzICAgICA6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgIERiZ0h3QWRkciggc2VjX3N0YXQtPnN0YUFkZHIgKSk7CisgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlJlYXNvbiAgICAgICAgICA6IDB4JTA0eCBcbiIsIHNlY19zdGF0LT5yZWFzb24gKTsKKworICAgIH0KKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybjsKK30gLy8gd2xfcHJvY2Vzc19zZWN1cml0eV9zdGF0dXMKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK2ludCB3bF9nZXRfdGFsbGllcyhzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCisJCSAgIENGR19IRVJNRVNfVEFMTElFU19TVFJDVCAqdGFsbGllcykKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpbnQgc3RhdHVzOworICAgIENGR19IRVJNRVNfVEFMTElFU19TVFJDVCAqcFRhbGxpZXM7CisKKyAgICBEQkdfRlVOQyggIndsX2dldF90YWxsaWVzIiApOworICAgIERCR19FTlRFUihEYmdJbmZvKTsKKworICAgIC8qIEdldCB0aGUgY3VycmVudCB0YWxsaWVzIGZyb20gdGhlIGFkYXB0ZXIgKi8KKyAgICBscC0+bHR2UmVjb3JkLmxlbiA9IDEgKyBIQ0ZfVE9UX1RBTF9DTlQgKiBzaXplb2YoaGNmXzE2KTsKKyAgICBscC0+bHR2UmVjb3JkLnR5cCA9IENGR19UQUxMSUVTOworCisgICAgc3RhdHVzID0gaGNmX2dldF9pbmZvKCYobHAtPmhjZkN0eCksIChMVFZQKSYobHAtPmx0dlJlY29yZCkpOworCisgICAgaWYoIHN0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwlwVGFsbGllcyA9IChDRkdfSEVSTUVTX1RBTExJRVNfU1RSQ1QgKikmKGxwLT5sdHZSZWNvcmQudS51MzIpOworCW1lbWNweSh0YWxsaWVzLCBwVGFsbGllcywgc2l6ZW9mKCp0YWxsaWVzKSk7CisgICAgCURCR19UUkFDRSggRGJnSW5mbywgIkdldCB0YWxsaWVzIG9rYXksIGRpeGU6ICVkXG4iLCBzaXplb2YoKnRhbGxpZXMpICk7CisgICAgfSBlbHNlIHsKKyAgICAJREJHX1RSQUNFKCBEYmdJbmZvLCAiR2V0IHRhbGxpZXMgZmFpbGVkXG4iICk7CisJcmV0ID0gLUVGQVVMVDsKKyAgICB9CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9hdG9pKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQmVsaWV2ZSBpdCBvciBub3QsIHdlIG5lZWQgb3VyIG93biBpbXBsZW1lbnRhdGlvbiBvZiBhdG9pIGluIHRoZSBrZXJuZWwuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBzdHJpbmcgIC0gdGhlIEFTQ0lJIHN0cmluZyB0byBjb252ZXJ0IHRvIGFuIGludGVnZXIKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIHVuc2lnbmVkIGludGVnZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordW5zaWduZWQgaW50IHdsX2F0b2koIGNoYXIgKnN0cmluZyApCit7Cit1bnNpZ25lZCBpbnQgYmFzZSA9IDEwOwkJCQkvL2RlZmF1bHQgdG8gZGVjaW1hbAordW5zaWduZWQgaW50IHZhbHVlID0gMDsKK3Vuc2lnbmVkIGludCBjOworaW50IGkgPSBzdHJsZW4oIHN0cmluZyApOworCisJaWYgKCBpID4gMiAmJiBzdHJpbmdbMF0gPT0gJzAnICYmICggc3RyaW5nWzFdIHwgKCdYJ14neCcpICkgPT0gJ3gnICkgeworCQliYXNlID0gMTY7CisJCXN0cmluZyArPTI7CisJfQorCXdoaWxlICggKCBjID0gKnN0cmluZysrICkgIT0gJ1wwJyApIHsKKwkJaWYgKCB2YWx1ZSA+IFVJTlRfTUFYIC8gYmFzZSApIHsJLy90ZXN0IGZvciBvdmVycnVuCisJCQlEQkdfRlVOQyggIndsX2F0b2kiICk7CS8vZG9uJ3Qgb3ZlcmxvYWQgdGhlIGxvZyBmaWxlIHdpdGggZ29vZCBtZXNzYWdlcworCQkJREJHX0VOVEVSKCBEYmdJbmZvICk7CisJCQlEQkdfRVJST1IoIERiZ0luZm8sICJzdHJpbmcgXCIlc1wiLCBsZW5naHQgZXhjZWVkcyBleHBlY3RhdGlvbnNcbiIsIHN0cmluZyApOworCQkJcHJpbnRrKCAiPDE+c3RyaW5nIFwiJXNcIiwgbGVuZ2h0IGV4Y2VlZHMgZXhwZWN0YXRpb25zXG4iLCBzdHJpbmcgKTsKKwkJCURCR19MRUFWRSggRGJnSW5mbyApOworCQkJYnJlYWs7CisJCX0KKwkJYyAtPSAnMCc7CisJCWlmICggMCA8PSBjICYmIGMgPD0gOSApIHZhbHVlID0gYmFzZSAqIHZhbHVlICsgYzsKKwkJZWxzZSBpZiAoIGJhc2UgPT0gMTYgKSB7CisJCQljICs9ICcwJzsKKwkJCWMgfD0gJ0EnXidhJzsKKwkJCWMgPSBjIC0gJ2EnKyAxMDsKKwkJCWlmICggMTAgPD0gYyAmJiBjIDw9IDE1ICkgdmFsdWUgPSBiYXNlICogdmFsdWUgKyBjOworCQl9CisJfQorCXJldHVybiB2YWx1ZTsKK30gLy8gd2xfYXRvaQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF91dGlsLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZjZDZjNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3V0aWwuaApAQCAtMCwwICsxLDEwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFnZXJlIFN5c3RlbXMgSW5jLgorICogV2lyZWxlc3MgZGV2aWNlIGRyaXZlciBmb3IgTGludXggKHdsYWdzNDkpLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KKyAqCisgKiBJbml0aWFsbHkgZGV2ZWxvcGVkIGJ5IFRyaXBsZVBvaW50LCBJbmMuCisgKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIEhlYWRlciBkZXNjcmliaW5nIGluZm9ybWF0aW9uIHJlcXVpcmVkIGZvciB1dGlsaXR5IGZ1bmN0aW9ucyB1c2VkCisgKiAgIHRocm91Z2hvdXQgdGhlIGRyaXZlci4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNPRlRXQVJFIExJQ0VOU0UKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisgKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fV0xfVVRJTF9IX18KKyNkZWZpbmUgX19XTF9VVElMX0hfXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZGJtKCBpbnQgdmFsdWUgKTsKKworaW50IGlzX3ZhbGlkX2tleV9zdHJpbmcoIGNoYXIgKnMgKTsKKwordm9pZCBrZXlfc3RyaW5nMmtleSggY2hhciAqa3MsIEtFWV9TVFJDVCAqa2V5ICk7CisKK2ludCBoZXhkaWdpdDJpbnQoIGNoYXIgYyApOworCit2b2lkIHdsX2hjZl9lcnJvciggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGhjZlN0YXR1cyApOworCit2b2lkIHdsX2VuZGlhbl90cmFuc2xhdGVfZXZlbnQoIGx0dl90ICpwTHR2ICk7CisKK2ludCB3bF9oYXNfd2VwKCBJRkJQIGlmYnAgKTsKKworCisjaWYgREJHCitjb25zdCBjaGFyICpEYmdId0FkZHIoIHVuc2lnbmVkIGNoYXIgKmh3QWRkciApOworI2VuZGlmIC8vIERCRworCitoY2ZfOCAgIHdsX3BhcnNlX2RzX2llKCBQUk9CRV9SRVNQICpwcm9iZV9yc3AgKTsKK2hjZl84ICogd2xfcGFyc2Vfd3BhX2llKCBQUk9CRV9SRVNQICpwcm9iZV9yc3AsIGhjZl8xNiAqbGVuZ3RoICk7CitoY2ZfOCAqIHdsX3ByaW50X3dwYV9pZSggaGNmXzggKmJ1ZmZlciwgaW50IGxlbmd0aCApOworCitpbnQgd2xfZ2V0X3RhbGxpZXMoc3RydWN0IHdsX3ByaXZhdGUgKiwgQ0ZHX0hFUk1FU19UQUxMSUVTX1NUUkNUICopOworaW50IHdsX2lzX2FfdmFsaWRfY2hhbiggaW50IGNoYW5uZWwgKTsKK2ludCB3bF9pc19hX3ZhbGlkX2ZyZXEoIGxvbmcgZnJlcXVlbmN5ICk7Citsb25nIHdsX2dldF9mcmVxX2Zyb21fY2hhbiggaW50IGNoYW5uZWwgKTsKK2ludCB3bF9nZXRfY2hhbl9mcm9tX2ZyZXEoIGxvbmcgZnJlcXVlbmN5ICk7CisKK3ZvaWQgd2xfcHJvY2Vzc19saW5rX3N0YXR1cyggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7Cit2b2lkIHdsX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2UoIHN0cnVjdCB3bF9wcml2YXRlICpscCApOwordm9pZCB3bF9wcm9jZXNzX3VwZGF0ZWRfcmVjb3JkKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKK3ZvaWQgd2xfcHJvY2Vzc19hc3NvY19zdGF0dXMoIHN0cnVjdCB3bF9wcml2YXRlICpscCApOwordm9pZCB3bF9wcm9jZXNzX3NlY3VyaXR5X3N0YXR1cyggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisKK3Vuc2lnbmVkIGludCB3bF9hdG9pKCBjaGFyICpzdHJpbmcgKTsKKworI2VuZGlmICAvLyBfX1dMX1VUSUxfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF92ZXJzaW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF92ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVlNjA0YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3ZlcnNpb24uaApAQCAtMCwwICsxLDE3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFnZXJlIFN5c3RlbXMgSW5jLgorICogV2lyZWxlc3MgZGV2aWNlIGRyaXZlciBmb3IgTGludXggKHdsYWdzNDkpLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KKyAqCisgKiBJbml0aWFsbHkgZGV2ZWxvcGVkIGJ5IFRyaXBsZVBvaW50LCBJbmMuCisgKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIFRoaXMgaGVhZGVyIGZpbGUgY29udGFpbnMgdmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGNvZGUgYmFzZSwgYXMgd2VsbCBhcworICogICBzcGVjaWFsIGRlZmluaXRpb25zIGFuZCBtYWNyb3MgbmVlZGVkIGJ5IGNlcnRhaW4gdmVyc2lvbnMgb2YgdGhlIGNvZGUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTT0ZUV0FSRSBMSUNFTlNFCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisgKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisgKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisgKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisgKgorICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogRGlzY2xhaW1lcgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1dMX1ZFUlNJT05fSF9fCisjZGVmaW5lIF9fV0xfVkVSU0lPTl9IX18KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBpbmNsdWRlIGZpbGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaWZuZGVmIENPTkZJR19NT0RWRVJTSU9OUworI2RlZmluZSBfX05PX1ZFUlNJT05fXworI2VuZGlmICAvLyBDT05GSUdfTU9EVkVSU0lPTlMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBjb25zdGFudCBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBWRU5ET1JfTkFNRSAgICAgICAgICJBZ2VyZSBTeXN0ZW1zLCBodHRwOi8vd3d3LmFnZXJlLmNvbSIKKworI2RlZmluZSBEUklWRVJfTkFNRSAgICAgICAgICJ3bGFnczQ5IgorI2RlZmluZSBEUlZfSURFTlRJVFkgICAgICAgIDQ5CisKKyNkZWZpbmUgRFJWX01BSk9SX1ZFUlNJT04gICA3CisjZGVmaW5lIERSVl9NSU5PUl9WRVJTSU9OICAgMjIKKyNkZWZpbmUgRFJWX1ZFUlNJT05fU1RSICAgICAiNy4yMiIKKworCisjaWYgZGVmaW5lZCBCVVNfUENNQ0lBCisjZGVmaW5lIEJVU19UWVBFICAgICAgICAgICAgIlBDTUNJQSIKKyNlbGlmIGRlZmluZWQgQlVTX1BDSQorI2RlZmluZSBCVVNfVFlQRSAgICAgICAgICAgICJQQ0kiCisjZWxzZQorZXJyOiBkZWZpbmUgYnVzIHR5cGU7CisjZW5kaWYgIC8vIEJVU19YWFgKKworI2lmIGRlZmluZWQgSEVSTUVTMjUKKyNkZWZpbmUgSFdfVFlQRQkJCQkiSElJLjUiCisjZWxzZQorI2RlZmluZSBIV19UWVBFCQkJCSJISUkiCisjZW5kaWYgLy8gSEVSTUVTMjUKKworI2lmIGRlZmluZWQgV0FSUAorI2RlZmluZSBGV19UWVBFCQkJCSJXQVJQIgorI2Vsc2UKKyNkZWZpbmUgRldfVFlQRQkJCQkiQkVBR0xFIgorI2VuZGlmIC8vIFdBUlAKKworI2lmIGRlZmluZWQgSEVSTUVTMjUKKyNpZiBkZWZpbmVkIFdBUlAKKyNkZWZpbmUgRFJWX1ZBUklBTlQgICAgICAgICAzCisjZWxzZQorI2RlZmluZSBEUlZfVkFSSUFOVCAgICAgICAgIDQKKyNlbmRpZiAvLyBXQVJQCisjZWxzZQorI2RlZmluZSBEUlZfVkFSSUFOVCAgICAgICAgIDIKKyNlbmRpZiAvLyBIRVJNRVMyNQorCisjaWZkZWYgQlVTX1BDTUNJQQorI2lmIGRlZmluZWQgSEVSTUVTMjUKKyNkZWZpbmUgTU9EVUxFX05BTUUgICAgICAgICBEUklWRVJfTkFNRSAiX2gyNV9jcyIKKyNlbHNlCisjZGVmaW5lIE1PRFVMRV9OQU1FICAgICAgICAgRFJJVkVSX05BTUUgIl9oMl9jcyIKKyNlbmRpZiAgLyogSEVSTUVTMjUgKi8KKyNlbGlmIGRlZmluZWQgQlVTX1BDSQorI2lmIGRlZmluZWQgSEVSTUVTMjUKKyNkZWZpbmUgTU9EVUxFX05BTUUgICAgICAgICBEUklWRVJfTkFNRSAiX2gyNSIKKyNlbHNlCisjZGVmaW5lIE1PRFVMRV9OQU1FICAgICAgICAgRFJJVkVSX05BTUUgIl9oMiIKKyNlbmRpZiAgLyogSEVSTUVTMjUgKi8KKyNlbmRpZiAgLyogQlVTX1hYWCAqLworCisjaWZkZWYgREJHCisjZGVmaW5lIE1PRFVMRV9EQVRFICAgICAgICAgX19EQVRFX18gIiAiIF9fVElNRV9fCisjZWxzZQorI2RlZmluZSBNT0RVTEVfREFURSAgICAgICAgICIwNy8xOC8yMDA0IDEzOjMwOjAwIgorI2VuZGlmIC8vIERCRworCisvLyNkZWZpbmUgU1RSMihtKSAjbQorLy8jZGVmaW5lIFNUUjEobSkgU1RSMihtKQorLy8jZGVmaW5lIE1PRFVMRV9OQU1FCQkJU1RSMSggTU9EX05BTUUgKQorCisjZGVmaW5lIFZFUlNJT05fSU5GTyAgICAgICAgTU9EVUxFX05BTUUgIiB2IiBEUlZfVkVSU0lPTl9TVFIgXAorCQkJCQkJCSIgZm9yICIgQlVTX1RZUEUgIiwgIiAJCQkJCQkJCQkJCSAgIAkgXAorCQkJCQkJCU1PRFVMRV9EQVRFICIgYnkgIiBWRU5ET1JfTkFNRQorCisjZGVmaW5lIFdJUkVMRVNTX1NVUFBPUlQgICAgMTUgIC8vIFRoZSB2ZXJzaW9uIG9mIHdpcmVsZXNzIGV4dGVuc2lvbnMgd2Ugc3VwcG9ydAorCisvLyNkZWZpbmUgREJHX01PRF9OQU1FICAgICAgICAgRFJJVkVSX05BTUUgIjoiIEJVU19UWVBFICI6IiBIV19UWVBFICI6IiBGV19UWVBFCisjZGVmaW5lIERCR19NT0RfTkFNRSAgICAgICAgTU9EVUxFX05BTUUKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgYnVzIGFyY2hpdGVjaHR1cmUgc3BlY2lmaWMgZGVmaW5lcywgaW5jbHVkZXMsIGV0Yy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgZGlmZmVyZW5jZSBmb3IgUENNQ0lBIGFuZCBQQ0kgYW55bW9yZSwgYXQgbGVhc3QKKyAqIGZvciBQQ01DSUEgdGhlIHNhbWUgZGVmaW5lcyBhcmUgbmVlZGVkIG5vdyBhcyBwcmV2aW91c2x5IG9ubHkgdXNlZCBmb3IgUENJCisgKi8KKyNpZiBVU0VfV0VYVAorI2RlZmluZSBIQVNfV0lSRUxFU1NfRVhURU5TSU9OUworI2VuZGlmICAvLyBVU0VfV0VYVAorCisjZGVmaW5lIE5FV19NVUxUSUNBU1QKKyNkZWZpbmUgQUxMT0NfU0tCKGxlbikgICBkZXZfYWxsb2Nfc2tiKGxlbisyKQorI2RlZmluZSBHRVRfUEFDS0VUKGRldiwgc2tiLCBjb3VudClcCisgICAgICAgICAgICAgICAgICAgICAgICBza2JfcmVzZXJ2ZSgoc2tiKSwgMik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJMT0NLX0lOUFVUKHNrYl9wdXQoKHNrYiksIChjb3VudCkpLCAoY291bnQpKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgKHNrYiktPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoKHNrYiksIChkZXYpKQorI2RlZmluZSBHRVRfUEFDS0VUX0RNQShkZXYsIHNrYiwgY291bnQpXAorICAgICAgICAgICAgICAgICAgICAgICAgc2tiX3Jlc2VydmUoKHNrYiksIDIpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICBCTE9DS19JTlBVVF9ETUEoc2tiX3B1dCgoc2tiKSwgKGNvdW50KSksIChjb3VudCkpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAoc2tiKS0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucygoc2tiKSwgKGRldikpCisKKworCisKKyNlbmRpZiAgLy8gX19XTF9WRVJTSU9OX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfd2V4dC5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfd2V4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MzRlMDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF93ZXh0LmMKQEAgLTAsMCArMSw0MTMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBXaXJlbGVzcyBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAod2xhZ3M0OSkuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBodHRwOi8vd3d3LmFnZXJlLmNvbQorICoKKyAqIEluaXRpYWxseSBkZXZlbG9wZWQgYnkgVHJpcGxlUG9pbnQsIEluYy4KKyAqICAgaHR0cDovL3d3dy50cmlwbGVwb2ludC5jb20KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNPRlRXQVJFIExJQ0VOU0UKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisgKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGluY2x1ZGUgZmlsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8d2xfdmVyc2lvbi5oPgorCisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8ZGVidWcuaD4KKyNpbmNsdWRlIDxoY2YuaD4KKyNpbmNsdWRlIDxoY2ZkZWYuaD4KKworI2luY2x1ZGUgPHdsX2lmLmg+CisjaW5jbHVkZSA8d2xfaW50ZXJuYWwuaD4KKyNpbmNsdWRlIDx3bF91dGlsLmg+CisjaW5jbHVkZSA8d2xfbWFpbi5oPgorI2luY2x1ZGUgPHdsX3dleHQuaD4KKyNpbmNsdWRlIDx3bF9wcml2Lmg+CisKKworCisvKiBJZiBXSVJFTEVTU19FWFQgaXMgbm90IGRlZmluZWQgKGFzIGEgcmVzdWx0IG9mIEhBU19XSVJFTEVTU19FWFRFTlNJT05TCisgICAjaW5jbHVkaW5nIGxpbnV4L3dpcmVsZXNzLmgpLCB0aGVuIHRoZXNlIGZ1bmN0aW9ucyBkbyBub3QgbmVlZCB0byBiZSBpbmNsdWRlZAorICAgaW4gdGhlIGJ1aWxkLiAqLworI2lmZGVmIFdJUkVMRVNTX0VYVAorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI3KQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBidWYsIGVuZCwgaXdlLCBsZW4pIFwKKyAgICBpd2Vfc3RyZWFtX2FkZF9ldmVudChidWYsIGVuZCwgaXdlLCBsZW4pCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGJ1ZiwgZW5kLCBpd2UsIG1zZykgXAorICAgIGl3ZV9zdHJlYW1fYWRkX3BvaW50KGJ1ZiwgZW5kLCBpd2UsIG1zZykKKyNlbHNlCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGJ1ZiwgZW5kLCBpd2UsIGxlbikgXAorICAgIGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIGJ1ZiwgZW5kLCBpd2UsIGxlbikKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgYnVmLCBlbmQsIGl3ZSwgbXNnKSBcCisgICAgaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgYnVmLCBlbmQsIGl3ZSwgbXNnKQorI2VuZGlmCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2xvYmFsIGRlZmluaXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIERCRworZXh0ZXJuIGRiZ19pbmZvX3QgKkRiZ0luZm87CisjZW5kaWYgIC8vIERCRworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2lyZWxlc3NfY29tbWl0KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQ29tbWl0CisgKiAgcHJvdG9jb2wgdXNlZC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3NfY29tbWl0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqcnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlEQkdfRlVOQyggIndpcmVsZXNzX2NvbW1pdCIgKTsKKwlEQkdfRU5URVIoRGJnSW5mbyk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKwl3bF9hcHBseShscCk7CisKKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworb3V0OgorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX2NvbW1pdAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdpcmVsZXNzX2dldF9wcm90b2NvbCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFJldHVybnMgYSB2ZW5kb3ItZGVmaW5lZCBzdHJpbmcgdGhhdCBzaG91bGQgaWRlbnRpZnkgdGhlIHdpcmVsZXNzCisgKiAgcHJvdG9jb2wgdXNlZC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3NfZ2V0X3Byb3RvY29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIGNoYXIgKm5hbWUsIGNoYXIgKmV4dHJhKQoreworCURCR19GVU5DKCAid2lyZWxlc3NfZ2V0X3Byb3RvY29sIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJLyogT3JpZ2luYWxseSwgdGhlIGRyaXZlciB3YXMgcGxhY2luZyB0aGUgc3RyaW5nICJXaXJlbGVzcyIgaGVyZS4gSG93ZXZlciwKKwkgICB0aGUgd2lyZWxlc3MgZXh0ZW5zaW9ucyAoL2xpbnV4L3dpcmVsZXNzLmgpIGluZGljYXRlIHRoaXMgc3RyaW5nIHNob3VsZAorCSAgIGRlc2NyaWJlIHRoZSB3aXJlbGVzcyBwcm90b2NvbC4gKi8KKworCXN0cmNweShuYW1lLCAiSUVFRSA4MDIuMTFiIik7CisKKwlEQkdfTEVBVkUoRGJnSW5mbyk7CisJcmV0dXJuIDA7Cit9IC8vIHdpcmVsZXNzX2dldF9wcm90b2NvbAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdpcmVsZXNzX3NldF9mcmVxdWVuY3koKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBTZXRzIHRoZSBmcmVxdWVuY3kgKGNoYW5uZWwpIG9uIHdoaWNoIHRoZSBjYXJkIHNob3VsZCBUeC9SeC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdpcmVsZXNzX3NldF9mcmVxdWVuY3koc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjaGFubmVsID0gMDsKKwlpbnQgcmV0ICAgICA9IDA7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggIndpcmVsZXNzX3NldF9mcmVxdWVuY3kiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiggIWNhcGFibGUoIENBUF9ORVRfQURNSU4gKSkgeworCQlyZXQgPSAtRVBFUk07CisJCURCR19MRUFWRSggRGJnSW5mbyApOworCQlyZXR1cm4gcmV0OworCX0KKworCisJLyogSWYgZnJlcXVlbmN5IHNwZWNpZmllZCwgbG9vayB1cCBjaGFubmVsICovCisJaWYoIGZyZXEtPmUgPT0gMSApIHsKKwkJaW50IGYgPSBmcmVxLT5tIC8gMTAwMDAwOworCQljaGFubmVsID0gd2xfZ2V0X2NoYW5fZnJvbV9mcmVxKCBmICk7CisJfQorCisKKwkvKiBDaGFubmVsIHNwZWNpZmllZCAqLworCWlmKCBmcmVxLT5lID09IDAgKSB7CisJCWNoYW5uZWwgPSBmcmVxLT5tOworCX0KKworCisJLyogSWYgdGhlIGNoYW5uZWwgaXMgYW4gODAyLjExYSBjaGFubmVsLCBzZXQgQml0IDggKi8KKwlpZiggY2hhbm5lbCA+IDE0ICkgeworCQljaGFubmVsID0gY2hhbm5lbCB8IDB4MTAwOworCX0KKworCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisJbHAtPkNoYW5uZWwgPSBjaGFubmVsOworCisKKwkvKiBDb21taXQgdGhlIGFkYXB0ZXIgcGFyYW1ldGVycyAqLworCXdsX2FwcGx5KCBscCApOworCisJLyogU2VuZCBhbiBldmVudCB0aGF0IGNoYW5uZWwvZnJlcSBoYXMgYmVlbiBzZXQgKi8KKwl3bF93ZXh0X2V2ZW50X2ZyZXEoIGxwLT5kZXYgKTsKKworICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCitvdXQ6CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3Nfc2V0X2ZyZXF1ZW5jeQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdpcmVsZXNzX2dldF9mcmVxdWVuY3koKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBHZXRzIHRoZSBmcmVxdWVuY3kgKGNoYW5uZWwpIG9uIHdoaWNoIHRoZSBjYXJkIGlzIFR4L1J4LgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3aXJlbGVzc19nZXRfZnJlcXVlbmN5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIHN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKKworeworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAtMTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid2lyZWxlc3NfZ2V0X2ZyZXF1ZW5jeSIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworCWxwLT5sdHZSZWNvcmQubGVuID0gMjsKKwlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19DVVJfQ0hBTk5FTDsKKworCXJldCA9IGhjZl9nZXRfaW5mbyggJihscC0+aGNmQ3R4KSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKwlpZiggcmV0ID09IEhDRl9TVUNDRVNTICkgeworCQloY2ZfMTYgY2hhbm5lbCA9IENOVl9MSVRUTEVfVE9fSU5UKCBscC0+bHR2UmVjb3JkLnUudTE2WzBdICk7CisKKyNpZmRlZiBVU0VfRlJFUVVFTkNZCisKKwkJZnJlcS0+bSA9IHdsX2dldF9mcmVxX2Zyb21fY2hhbiggY2hhbm5lbCApICogMTAwMDAwOworCQlmcmVxLT5lID0gMTsKKyNlbHNlCisKKwkJZnJlcS0+bSA9IGNoYW5uZWw7CisJCWZyZXEtPmUgPSAwOworCisjZW5kaWYgLyogVVNFX0ZSRVFVRU5DWSAqLworCX0KKworICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCisJcmV0ID0gKHJldCA9PSBIQ0ZfU1VDQ0VTUyA/IDAgOiAtRUZBVUxUKTsKKworb3V0OgorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX2dldF9mcmVxdWVuY3kKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3aXJlbGVzc19nZXRfcmFuZ2UoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcHJvdmlkZSBtaXNjIGluZm8gYW5kIHN0YXRpc3RpY3MgYWJvdXQgdGhlCisgKiAgd2lyZWxlc3MgZGV2aWNlLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3NfZ2V0X3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgICAgICBmbGFnczsKKwlzdHJ1Y3QgaXdfcmFuZ2UgICAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopIGV4dHJhOworCWludCAgICAgICAgICAgICAgICByZXQgPSAwOworCWludCAgICAgICAgICAgICAgICBzdGF0dXMgPSAtMTsKKwlpbnQgICAgICAgICAgICAgICAgY291bnQ7CisJX191MTYgICAgICAgICAgICAgKnBUeFJhdGU7CisJaW50ICAgICAgICAgICAgICAgIHJldHJpZXMgPSAwOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3aXJlbGVzc19nZXRfcmFuZ2UiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwkvKiBTZXQgcmFuZ2UgaW5mb3JtYXRpb24gKi8KKwlkYXRhLT5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKTsKKwltZW1zZXQocmFuZ2UsIDAsIHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpKTsKKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworCS8qIFNldCByYW5nZSBpbmZvcm1hdGlvbiAqLworCW1lbXNldCggcmFuZ2UsIDAsIHNpemVvZiggc3RydWN0IGl3X3JhbmdlICkpOworCityZXRyeToKKwkvKiBHZXQgdGhlIGN1cnJlbnQgdHJhbnNtaXQgcmF0ZSBmcm9tIHRoZSBhZGFwdGVyICovCisJbHAtPmx0dlJlY29yZC5sZW4gPSAxICsgKHNpemVvZigqcFR4UmF0ZSkgLyBzaXplb2YoaGNmXzE2KSk7CisJbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfQ1VSX1RYX1JBVEU7CisKKwlzdGF0dXMgPSBoY2ZfZ2V0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKwlpZiggc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgeworCQkvKiBSZWNvdmVyeSBhY3Rpb246IHJlc2V0IGFuZCByZXRyeSB1cCB0byAxMCB0aW1lcyAqLworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJHZXQgQ0ZHX0NVUl9UWF9SQVRFIGZhaWxlZDogMHgleFxuIiwgc3RhdHVzICk7CisKKwkJaWYgKHJldHJpZXMgPCAxMCkgeworCQkJcmV0cmllcysrOworCisJCQkvKiBIb2xkaW5nIHRoZSBsb2NrIHRvbyBsb25nLCBtYWtlIGEgZ2FwIHRvIGFsbG93IG90aGVyIHByb2Nlc3NlcyAqLworCQkJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCQkJd2xfbG9jayggbHAsICZmbGFncyApOworCisJCQlzdGF0dXMgPSB3bF9yZXNldCggZGV2ICk7CisJCQlpZiAoIHN0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApIHsKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJyZXNldCBmYWlsZWQ6IDB4JXhcbiIsIHN0YXR1cyApOworCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlnb3RvIG91dF91bmxvY2s7CisJCQl9CisKKwkJCS8qIEhvbGRpbmcgdGhlIGxvY2sgdG9vIGxvbmcsIG1ha2UgYSBnYXAgdG8gYWxsb3cgb3RoZXIgcHJvY2Vzc2VzICovCisJCQl3bF91bmxvY2sobHAsICZmbGFncyk7CisJCQl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKwkJCWdvdG8gcmV0cnk7CisKKwkJfSBlbHNlIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIkdldCBDRkdfQ1VSX1RYX1JBVEUgZmFpbGVkOiAlZCByZXRyaWVzXG4iLCByZXRyaWVzICk7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisJfQorCisJLyogSG9sZGluZyB0aGUgbG9jayB0b28gbG9uZywgbWFrZSBhIGdhcCB0byBhbGxvdyBvdGhlciBwcm9jZXNzZXMgKi8KKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisJd2xfbG9jayggbHAsICZmbGFncyApOworCisJcFR4UmF0ZSA9IChfX3UxNiAqKSYoIGxwLT5sdHZSZWNvcmQudS51MzIgKTsKKworCXJhbmdlLT50aHJvdWdocHV0ID0gQ05WX0xJVFRMRV9UT19JTlQoICpwVHhSYXRlICkgKiBNRUdBQklUOworCisJaWYgKHJldHJpZXMgPiAwKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIkdldCBDRkdfQ1VSX1RYX1JBVEUgc3VjY2VzOiAlZCByZXRyaWVzXG4iLCByZXRyaWVzICk7CisJfQorCisJLy8gTldJRCAtIE5PVCBTVVBQT1JURUQKKworCisJLyogQ2hhbm5lbC9GcmVxdWVuY3kgSW5mbyAqLworCXJhbmdlLT5udW1fY2hhbm5lbHMgPSBSQURJT19DSEFOTkVMUzsKKworCisJLyogU2lnbmFsIExldmVsIFRocmVzaG9sZHMgKi8KKwlyYW5nZS0+c2Vuc2l0aXZpdHkgPSBSQURJT19TRU5TSVRJVklUWV9MRVZFTFM7CisKKworCS8qIExpbmsgcXVhbGl0eSAqLworI2lmZGVmIFVTRV9EQk0KKworCXJhbmdlLT5tYXhfcXVhbC5xdWFsICAgICA9ICh1X2NoYXIpSENGX01BWF9DT01NX1FVQUxJVFk7CisKKwkvKiBJZiB0aGUgdmFsdWUgcmV0dXJuZWQgaW4gL3Byb2MvbmV0L3dpcmVsZXNzIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSByYW5nZSwKKwkgICBpd2NvbmZpZyBhc3N1bWVzIHRoYXQgdGhlIHZhbHVlIGlzIGluIGRCbS4gQmVjYXVzZSBhbiB1bnNpZ25lZCBjaGFyIGlzIHVzZWQsCisJICAgaXQgcmVxdWlyZXMgYSBiaXQgb2YgY29udG9yc2lvbi4uLiAqLworCisJcmFuZ2UtPm1heF9xdWFsLmxldmVsICAgPSAodV9jaGFyKSggZGJtKCBIQ0ZfTUlOX1NJR05BTF9MRVZFTCApIC0gMSApOworCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSAgID0gKHVfY2hhcikoIGRibSggSENGX01JTl9OT0lTRV9MRVZFTCApIC0gMSApOworI2Vsc2UKKworCXJhbmdlLT5tYXhfcXVhbC5xdWFsICAgID0gMTAwOworCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCAgID0gMTAwOworCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSAgID0gMTAwOworCisjZW5kaWYgLyogVVNFX0RCTSAqLworCisKKwkvKiBTZXQgYXZhaWxhYmxlIHJhdGVzICovCisJcmFuZ2UtPm51bV9iaXRyYXRlcyA9IDA7CisKKwlscC0+bHR2UmVjb3JkLmxlbiA9IDY7CisJbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfU1VQUE9SVEVEX0RBVEFfUkFURVM7CisKKwlzdGF0dXMgPSBoY2ZfZ2V0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKwlpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgeworCQlmb3IoIGNvdW50ID0gMDsgY291bnQgPCBNQVhfUkFURVM7IGNvdW50KysgKQorCQkJaWYoIGxwLT5sdHZSZWNvcmQudS51OFtjb3VudCsyXSAhPSAwICkgeworCQkJCXJhbmdlLT5iaXRyYXRlW2NvdW50XSA9IGxwLT5sdHZSZWNvcmQudS51OFtjb3VudCsyXSAqIE1FR0FCSVQgLyAyOworCQkJCXJhbmdlLT5udW1fYml0cmF0ZXMrKzsKKwkJCX0KKwl9IGVsc2UgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfU1VQUE9SVEVEX0RBVEFfUkFURVM6IDB4JXhcbiIsIHN0YXR1cyApOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJLyogUlRTIFRocmVzaG9sZCBpbmZvICovCisJcmFuZ2UtPm1pbl9ydHMgICA9IE1JTl9SVFNfQllURVM7CisJcmFuZ2UtPm1heF9ydHMgICA9IE1BWF9SVFNfQllURVM7CisKKwkvLyBGcmFnIFRocmVzaG9sZCBpbmZvIC0gTk9UIFNVUFBPUlRFRAorCisJLy8gUG93ZXIgTWFuYWdlbWVudCBpbmZvIC0gTk9UIFNVUFBPUlRFRAorCisJLyogRW5jcnlwdGlvbiAqLworCisjaWYgV0lSRUxFU1NfRVhUID4gOAorCisJLyogSG9sZGluZyB0aGUgbG9jayB0b28gbG9uZywgbWFrZSBhIGdhcCB0byBhbGxvdyBvdGhlciBwcm9jZXNzZXMgKi8KKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisJd2xfbG9jayggbHAsICZmbGFncyApOworCisJLyogSXMgV0VQIHN1cHBvcnRlZD8gKi8KKworCWlmKCB3bF9oYXNfd2VwKCAmKCBscC0+aGNmQ3R4ICkpKSB7CisJCS8qIFdFUDogUkM0IDQwIGJpdHMgKi8KKwkJcmFuZ2UtPmVuY29kaW5nX3NpemVbMF0gICAgICA9IE1JTl9LRVlfU0laRTsKKworCQkvKiBSQzQgfjEyOCBiaXRzICovCisJCXJhbmdlLT5lbmNvZGluZ19zaXplWzFdICAgICAgPSBNQVhfS0VZX1NJWkU7CisJCXJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgICAgPSAyOworCQlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyAgID0gTUFYX0tFWVM7CisJfQorCisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gOCAqLworCisJLyogVHggUG93ZXIgSW5mbyAqLworCXJhbmdlLT50eHBvd2VyX2NhcGEgID0gSVdfVFhQT1dfTVdBVFQ7CisJcmFuZ2UtPm51bV90eHBvd2VyICAgPSAxOworCXJhbmdlLT50eHBvd2VyWzBdICAgID0gUkFESU9fVFhfUE9XRVJfTVdBVFQ7CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxMAorCisJLyogV2lyZWxlc3MgRXh0ZW5zaW9uIEluZm8gKi8KKwlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCAgID0gV0lSRUxFU1NfRVhUOworCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSAgICAgPSBXSVJFTEVTU19TVVBQT1JUOworCisJLy8gUmV0cnkgTGltaXRzIGFuZCBMaWZldGltZSAtIE5PVCBTVVBQT1JURUQKKworI2VuZGlmCisKKworI2lmIFdJUkVMRVNTX0VYVCA+IDExCisKKwkvKiBIb2xkaW5nIHRoZSBsb2NrIHRvbyBsb25nLCBtYWtlIGEgZ2FwIHRvIGFsbG93IG90aGVyIHByb2Nlc3NlcyAqLworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKwlEQkdfVFJBQ0UoIERiZ0luZm8sICJjYWxsaW5nIHdsX3dpcmVsZXNzX3N0YXRzXG4iICk7CisJd2xfd2lyZWxlc3Nfc3RhdHMoIGxwLT5kZXYgKTsKKwlyYW5nZS0+YXZnX3F1YWwgPSBscC0+d3N0YXRzLnF1YWw7CisJREJHX1RSQUNFKCBEYmdJbmZvLCAid2xfd2lyZWxlc3Nfc3RhdHMgZG9uZVxuIiApOworCisjZW5kaWYKKworCS8qIEV2ZW50IGNhcGFiaWxpdHkgKGtlcm5lbCArIGRyaXZlcikgKi8KKwlyYW5nZS0+ZXZlbnRfY2FwYVswXSA9IChJV19FVkVOVF9DQVBBX0tfMCB8CisJCQkJSVdfRVZFTlRfQ0FQQV9NQVNLKFNJT0NHSVdBUCkgfAorCQkJCUlXX0VWRU5UX0NBUEFfTUFTSyhTSU9DR0lXU0NBTikpOworCXJhbmdlLT5ldmVudF9jYXBhWzFdID0gSVdfRVZFTlRfQ0FQQV9LXzE7CisJcmFuZ2UtPmV2ZW50X2NhcGFbNF0gPSAoSVdfRVZFTlRfQ0FQQV9NQVNLKElXRVZSRUdJU1RFUkVEKSB8CisJCQkJSVdfRVZFTlRfQ0FQQV9NQVNLKElXRVZDVVNUT00pIHwKKwkJCQlJV19FVkVOVF9DQVBBX01BU0soSVdFVkVYUElSRUQpKTsKKworCXJhbmdlLT5lbmNfY2FwYSA9IElXX0VOQ19DQVBBX1dQQSB8IElXX0VOQ19DQVBBX0NJUEhFUl9US0lQOworCitvdXRfdW5sb2NrOgorICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCisJREJHX0xFQVZFKERiZ0luZm8pOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX2dldF9yYW5nZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2lyZWxlc3NfZ2V0X2Jzc2lkKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgR2V0cyB0aGUgQlNTSUQgdGhlIHdpcmVsZXNzIGRldmljZSBpcyBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3NfZ2V0X2Jzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIHN0cnVjdCBzb2NrYWRkciAqYXBfYWRkciwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisjaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9TVEEKKwlpbnQgc3RhdHVzID0gLTE7CisjZW5kaWYgLyogKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQSAqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3aXJlbGVzc19nZXRfYnNzaWQiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKwltZW1zZXQoICZhcF9hZGRyLT5zYV9kYXRhLCAwLCBFVEhfQUxFTiApOworCisJYXBfYWRkci0+c2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCisJLyogQXNzdW1lIEFQIG1vZGUgaGVyZSwgd2hpY2ggbWVhbnMgdGhlIEJTU0lEIGlzIG91ciBvd24gTUFDIGFkZHJlc3MuIEluCisJICAgU1RBIG1vZGUsIHRoaXMgYWRkcmVzcyB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggdGhlIGFjdHVhbCBCU1NJRCB1c2luZworCSAgIHRoZSBjb2RlIGJlbG93LiAqLworCW1lbWNweSgmYXBfYWRkci0+c2FfZGF0YSwgbHAtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKworCisjaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9TVEEKKwkJCQkJLy87P3Nob3VsZCB3ZSByZXR1cm4gYW4gZXJyb3Igc3RhdHVzIGluIEFQIG1vZGUKKworCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfU1RBICApIHsKKwkJLyogR2V0IEN1cnJlbnQgQlNTSUQgKi8KKwkJbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfQ1VSX0JTU0lEOworCQlscC0+bHR2UmVjb3JkLmxlbiA9IDQ7CisJCXN0YXR1cyA9IGhjZl9nZXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCWlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CisJCQkvKiBDb3B5IGluZm8gaW50byBzb2NrYWRkciBzdHJ1Y3QgKi8KKwkJCW1lbWNweSgmYXBfYWRkci0+c2FfZGF0YSwgbHAtPmx0dlJlY29yZC51LnU4LCBFVEhfQUxFTik7CisJCX0gZWxzZSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQl9CisJfQorCisjZW5kaWYgLy8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQQorCisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKK291dDoKKwlEQkdfTEVBVkUoRGJnSW5mbyk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3NfZ2V0X2Jzc2lkCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2lyZWxlc3NfZ2V0X2FwX2xpc3QoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBHZXRzIHRoZSByZXN1bHRzIG9mIGEgbmV0d29yayBzY2FuLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICogIE5PVEU6IFNJT0NHSVdBUExJU1QgaGFzIGJlZW4gZGVwcmVjYXRlZCBieSBTSU9DU0lXU0NBTi4gVGhpcyBmdW5jdGlvbgorICogICAgICAgaW1wbGVtZW50cyBTSU9DR0lXQVBMSVNUIG9ubHkgdG8gcHJvdmlkZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gRm9yCisgKiAgICAgICBhbGwgc3lzdGVtcyB1c2luZyBXSVJFTEVTU19FWFQgdjE0IGFuZCBoaWdoZXIsIHVzZSBTSU9DU0lXU0NBTiEKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3aXJlbGVzc19nZXRfYXBfbGlzdCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZwkgIGZsYWdzOworCWludCAgICAgICAgICAgICAgICAgcmV0OworCWludCAgICAgICAgICAgICAgICAgbnVtX2FwcyA9IC0xOworCWludCAgICAgICAgICAgICAgICAgc2VjX2NvdW50ID0gMDsKKwloY2ZfMzIgICAgICAgICAgICAgIGNvdW50OworCXN0cnVjdCBzb2NrYWRkciAgICAgKmh3YSA9IE5VTEw7CisJc3RydWN0IGl3X3F1YWxpdHkgICAqcXVhbCA9IE5VTEw7CisjaWZkZWYgV0FSUAorCVNjYW5SZXN1bHQJCQkqcCA9ICZscC0+c2Nhbl9yZXN1bHRzOworI2Vsc2UKKwlQcm9iZVJlc3VsdCAgICAgICAgICpwID0gJmxwLT5wcm9iZV9yZXN1bHRzOworI2VuZGlmICAvLyBXQVJQCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJREJHX0ZVTkMoICJ3aXJlbGVzc19nZXRfYXBfbGlzdCIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworCS8qIFNldCB0aGUgY29tcGxldGlvbiBzdGF0ZSB0byBGQUxTRSAqLworCWxwLT5zY2FuX3Jlc3VsdHMuc2Nhbl9jb21wbGV0ZSA9IEZBTFNFOworCWxwLT5wcm9iZV9yZXN1bHRzLnNjYW5fY29tcGxldGUgPSBGQUxTRTsKKwkvKiBDaGFubmVscyB0byBzY2FuICovCisJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1NDQU5fQ0hBTk5FTFNfMkdIWjsKKwlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCAweDdGRkYgKTsKKwlyZXQgPSBoY2ZfcHV0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKwlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfU0NBTl9DSEFOTkVMU18yR0haIHJlc3VsdDogMHgleFxuIiwgcmV0ICk7CisKKwkvKiBTZXQgdGhlIFNDQU5fU1NJRCB0byAiQU5ZIi4gVXNpbmcgdGhpcyBSSUQgZm9yIHNjYW4gcHJldmVudHMgdGhlIG5lZWQgdG8KKwkgICBkaXNhc3NvY2lhdGUgZnJvbSB0aGUgbmV0d29yayB3ZSBhcmUgY3VycmVudGx5IG9uICovCisJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1NDQU5fU1NJRDsKKwlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCAwICk7CisJcmV0ID0gaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX1NDQU5fU1NJRCB0byAnYW55JyByZXQ6IDB4JXhcbiIsIHJldCApOworCisJLyogSW5pdGlhdGUgdGhlIHNjYW4gKi8KKyNpZmRlZiBXQVJQCisJcmV0ID0gaGNmX2FjdGlvbiggJiggbHAtPmhjZkN0eCApLCBNRERfQUNUX1NDQU4gKTsKKyNlbHNlCisJcmV0ID0gaGNmX2FjdGlvbiggJiggbHAtPmhjZkN0eCApLCBIQ0ZfQUNUX0FDU19TQ0FOICk7CisjZW5kaWYgIC8vIFdBUlAKKworICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJLy87PyB1bmxvY2s/IHdoYXQgYWJvdXQgdGhlIGFjY2VzcyB0byBscCBiZWxvdz8gaXMgaXQgYnJva2VuPworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworCWlmKCByZXQgPT0gSENGX1NVQ0NFU1MgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIlNVQ0NFU1NGVUxMWSBJTklUSUFURUQgU0NBTi4uLlxuIiApOworCQl3aGlsZSggKCpwKS5zY2FuX2NvbXBsZXRlID09IEZBTFNFICYmIHJldCA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIldhaXRpbmcgZm9yIHNjYW4gcmVzdWx0cy4uLlxuIiApOworCQkJLyogQWJvcnQgdGhlIHNjYW4gaWYgd2UndmUgd2FpdGVkIGZvciBtb3JlIHRoYW4gTUFYX1NDQU5fVElNRV9TRUMgKi8KKwkJCWlmKCBzZWNfY291bnQrKyA+IE1BWF9TQ0FOX1RJTUVfU0VDICkgeworCQkJCXJldCA9IC1FSU87CisJCQl9IGVsc2UgeworCQkJCS8qIFdhaXQgZm9yIDEgc2VjIGluIDEwbXMgaW50ZXJ2YWxzLCBzY2hlZHVsaW5nIHRoZSBrZXJuZWwgdG8gZG8KKwkJCQkgICBvdGhlciB0aGluZ3MgaW4gdGhlIG1lYW50aW1lLCBUaGlzIHByZXZlbnRzIHN5c3RlbSBsb2NrdXBzIGJ5CisJCQkJICAgZ2l2aW5nIHNvbWUgdGltZSBiYWNrIHRvIHRoZSBrZXJuZWwgKi8KKwkJCQlmb3IoIGNvdW50ID0gMDsgY291bnQgPCAxMDA7IGNvdW50ICsrICkgeworCQkJCQltZGVsYXkoIDEwICk7CisJCQkJCXNjaGVkdWxlKCApOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJtYigpOworCisJCWlmICggcmV0ICE9IEhDRl9TVUNDRVNTICkgeworCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAidGltZW91dCB3YWl0aW5nIGZvciBzY2FuIHJlc3VsdHNcbiIgKTsKKwkJfSBlbHNlIHsKKwkJCW51bV9hcHMgICAgICAgICAgICAgPSAoKnApLypscC0+cHJvYmVfcmVzdWx0cyovLm51bV9hcHM7CisJCQlpZiAobnVtX2FwcyA+IElXX01BWF9BUCkgeworCQkJCW51bV9hcHMgPSBJV19NQVhfQVA7CisJCQl9CisJCQlkYXRhLT5sZW5ndGggPSBudW1fYXBzOworCQkJaHdhID0gKHN0cnVjdCBzb2NrYWRkciAqKWV4dHJhOworCQkJcXVhbCA9IChzdHJ1Y3QgaXdfcXVhbGl0eSAqKSBleHRyYSArCisJCQkJCSggc2l6ZW9mKCBzdHJ1Y3Qgc29ja2FkZHIgKSAqIG51bV9hcHMgKTsKKworCQkJLyogVGhpcyBmbGFnIGlzIHVzZWQgdG8gdGVsbCB0aGUgdXNlciBpZiB3ZSBwcm92aWRlIHF1YWxpdHkKKwkJCSAgIGluZm9ybWF0aW9uLiBTaW5jZSB3ZSBwcm92aWRlIHNpZ25hbC9ub2lzZSBsZXZlbHMgYnV0IG5vCisJCQkgICBxdWFsaXR5IGluZm8gb24gYSBzY2FuLCB0aGlzIGlzIHNldCB0byAwLiBTZXR0aW5nIHRvIDEgYW5kCisJCQkgICBwcm92aWRpbmcgYSBxdWFsaXR5IG9mIDAgcHJvZHVjZXMgd2VpcmQgcmVzdWx0cy4gSWYgd2UgZXZlcgorCQkJICAgcHJvdmlkZSBxdWFsaXR5IChvciBjYW4gY2FsY3VsYXRlIGl0KSwgdGhpcyBjYW4gYmUgY2hhbmdlZCAqLworCQkJZGF0YS0+ZmxhZ3MgPSAwOworCisJCQlmb3IoIGNvdW50ID0gMDsgY291bnQgPCBudW1fYXBzOyBjb3VudCsrICkgeworI2lmZGVmIFdBUlAKKwkJCQltZW1jcHkoIGh3YVtjb3VudF0uc2FfZGF0YSwKKwkJCQkJCSgqcCkvKmxwLT5zY2FuX3Jlc3VsdHMqLy5BUFRhYmxlW2NvdW50XS5ic3NpZCwgRVRIX0FMRU4gKTsKKyNlbHNlICAvLzs/d2h5IHVzZSBCU1NJRCBhbmQgYnNzaWQgYXMgbmFtZXMgaW4gc2VlbWluZ2x5IHZlcnkgY29tcGFyYWJsZSBzaXR1YXRpb25zCisJCQkJREJHX1BSSU5UKCAiQlNTSUQ6ICVzXG4iLCBEYmdId0FkZHIoICgqcCkvKmxwLT5wcm9iZV9yZXN1bHRzKi8uUHJvYmVUYWJsZVtjb3VudF0uQlNTSUQgKSk7CisJCQkJbWVtY3B5KCBod2FbY291bnRdLnNhX2RhdGEsCisJCQkJCQkoKnApLypscC0+cHJvYmVfcmVzdWx0cyovLlByb2JlVGFibGVbY291bnRdLkJTU0lELCBFVEhfQUxFTiApOworI2VuZGlmIC8vIFdBUlAKKwkJCX0KKwkJCS8qIE9uY2UgdGhlIGRhdGEgaXMgY29waWVkIHRvIHRoZSB3aXJlbGVzcyBzdHJ1Y3QsIGludmFsaWRhdGUgdGhlCisJCQkgICBzY2FuIHJlc3VsdCB0byBpbml0aWF0ZSBhIHJlc2NhbiBvbiB0aGUgbmV4dCByZXF1ZXN0ICovCisJCQkoKnApLypscC0+cHJvYmVfcmVzdWx0cyovLnNjYW5fY29tcGxldGUgPSBGQUxTRTsKKwkJCS8qIFNlbmQgdGhlIHdpcmVsZXNzIGV2ZW50IHRoYXQgdGhlIHNjYW4gaGFzIGNvbXBsZXRlZCwganVzdCBpbiBjYXNlCisJCQkgICBpdCdzIG5lZWRlZCAqLworCQkJd2xfd2V4dF9ldmVudF9zY2FuX2NvbXBsZXRlKCBscC0+ZGV2ICk7CisJCX0KKwl9CitvdXQ6CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3NfZ2V0X2FwX2xpc3QKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3aXJlbGVzc19zZXRfc2Vuc2l0aXZpdHkoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBTZXRzIHRoZSBzZW5zaXRpdml0eSAoZGlzdGFuY2UgYmV0d2VlbiBBUHMpIG9mIHRoZSB3aXJlbGVzcyBjYXJkLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3Nfc2V0X3NlbnNpdGl2aXR5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIHN0cnVjdCBpd19wYXJhbSAqc2VucywgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisJaW50IGRlbnMgPSBzZW5zLT52YWx1ZTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid2lyZWxlc3Nfc2V0X3NlbnNpdGl2aXR5IiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYoKCBkZW5zIDwgMSApIHx8ICggZGVucyA+IDMgKSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKwlscC0+RGlzdGFuY2VCZXR3ZWVuQVBzID0gZGVuczsKKwl3bF9hcHBseSggbHAgKTsKKworICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCitvdXQ6CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3Nfc2V0X3NlbnNpdGl2aXR5CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2lyZWxlc3NfZ2V0X3NlbnNpdGl2aXR5KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgR2V0cyB0aGUgc2Vuc2l0aXZpdHkgKGRpc3RhbmNlIGJldHdlZW4gQVBzKSBvZiB0aGUgd2lyZWxlc3MgY2FyZC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdpcmVsZXNzX2dldF9zZW5zaXRpdml0eShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBzdHJ1Y3QgaXdfcGFyYW0gKnNlbnMsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwlpbnQgcmV0ID0gMDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggIndpcmVsZXNzX2dldF9zZW5zaXRpdml0eSIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCS8qIG5vdCB3b3J0aCBsb2NraW5nIC4uLiAqLworCXNlbnMtPnZhbHVlID0gbHAtPkRpc3RhbmNlQmV0d2VlbkFQczsKKwlzZW5zLT5maXhlZCA9IDA7CS8qIGF1dG8gKi8KK291dDoKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19nZXRfc2Vuc2l0aXZpdHkKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3aXJlbGVzc19zZXRfZXNzaWQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBTZXRzIHRoZSBFU1NJRCAobmV0d29yayBuYW1lKSB0aGF0IHRoZSB3aXJlbGVzcyBkZXZpY2Ugc2hvdWxkIGFzc29jaWF0ZQorICogIHdpdGguCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3aXJlbGVzc19zZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpzc2lkKQoreworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJREJHX0ZVTkMoICJ3aXJlbGVzc19zZXRfZXNzaWQiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZGF0YS0+ZmxhZ3MgIT0gMCAmJiBkYXRhLT5sZW5ndGggPiBIQ0ZfTUFYX05BTUVfTEVOICsgMSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKwltZW1zZXQoIGxwLT5OZXR3b3JrTmFtZSwgMCwgc2l6ZW9mKCBscC0+TmV0d29ya05hbWUgKSk7CisKKwkvKiBkYXRhLT5mbGFncyBpcyB6ZXJvIHRvIGFzayBmb3IgImFueSIgKi8KKwlpZiggZGF0YS0+ZmxhZ3MgPT0gMCApIHsKKwkJLyogTmVlZCB0aGlzIGJlY2F1c2UgaW4gU1RBUCBidWlsZCBQQVJNX0RFRkFVTFRfU1NJRCBpcyAiTGludXhBUCIKKwkJICogOz9idXQgdGhlcmUgYWluJ3Qgbm8gU1RBUCBhbnltb3JlKi8KKwkJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19TVEEgICkgeworCQkJc3RyY3B5KCBscC0+TmV0d29ya05hbWUsICJBTlkiICk7CisJCX0gZWxzZSB7CisJCQkvL3N0cmNweSggbHAtPk5ldHdvcmtOYW1lLCAiQU5ZIiApOworCQkJc3RyY3B5KCBscC0+TmV0d29ya05hbWUsIFBBUk1fREVGQVVMVF9TU0lEICk7CisJCX0KKwl9IGVsc2UgeworCQltZW1jcHkoIGxwLT5OZXR3b3JrTmFtZSwgc3NpZCwgZGF0YS0+bGVuZ3RoICk7CisJfQorCisJREJHX05PVElDRSggRGJnSW5mbywgInNldCBOZXR3b3JrTmFtZTogJXNcbiIsIHNzaWQgKTsKKworCS8qIENvbW1pdCB0aGUgYWRhcHRlciBwYXJhbWV0ZXJzICovCisJd2xfYXBwbHkoIGxwICk7CisKKwkvKiBTZW5kIGFuIGV2ZW50IHRoYXQgRVNTSUQgaGFzIGJlZW4gc2V0ICovCisJd2xfd2V4dF9ldmVudF9lc3NpZCggbHAtPmRldiApOworCisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKK291dDoKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19zZXRfZXNzaWQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3aXJlbGVzc19nZXRfZXNzaWQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBHZXRzIHRoZSBFU1NJRCAobmV0d29yayBuYW1lKSB0aGF0IHRoZSB3aXJlbGVzcyBkZXZpY2UgaXMgYXNzb2NpYXRlZAorICogIHdpdGguCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3aXJlbGVzc19nZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICplc3NpZCkKKworeworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCAgICAgICAgIHJldCA9IDA7CisJaW50ICAgICAgICAgc3RhdHVzID0gLTE7CisJd3ZOYW1lX3QgICAgKnBOYW1lOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3aXJlbGVzc19nZXRfZXNzaWQiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKwkvKiBHZXQgdGhlIGRlc2lyZWQgbmV0d29yayBuYW1lICovCisJbHAtPmx0dlJlY29yZC5sZW4gPSAxICsgKCBzaXplb2YoICpwTmFtZSApIC8gc2l6ZW9mKCBoY2ZfMTYgKSk7CisKKworI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfU1RBCisJCQkJCS8vOz9zaG91bGQgd2UgcmV0dXJuIGFuIGVycm9yIHN0YXR1cyBpbiBBUCBtb2RlCisKKwlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19ERVNJUkVEX1NTSUQ7CisKKyNlbmRpZgorCisKKyNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCisJCS8vOz9zaG91bGQgd2UgcmVzdG9yZSB0aGlzIHRvIGFsbG93IHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludAorCisJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19BUCAgKSB7CisJCWxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0NORl9PV05fU1NJRDsKKwl9CisKKyNlbmRpZiAvLyBIQ0ZfQVAKKworCisJc3RhdHVzID0gaGNmX2dldF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisJaWYoIHN0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwkJcE5hbWUgPSAod3ZOYW1lX3QgKikmKCBscC0+bHR2UmVjb3JkLnUudTMyICk7CisKKwkJLyogRW5kaWFuIHRyYW5zbGF0ZSB0aGUgc3RyaW5nIGxlbmd0aCAqLworCQlwTmFtZS0+bGVuZ3RoID0gQ05WX0xJVFRMRV9UT19JTlQoIHBOYW1lLT5sZW5ndGggKTsKKworCQkvKiBDb3B5IHRoZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSB1c2VyIGJ1ZmZlciAqLworCQlkYXRhLT5sZW5ndGggPSBwTmFtZS0+bGVuZ3RoOworCisJCS8qIE5PVEU6IE51bGwgdGVybWluYXRpbmcgaXMgbmVjZXNzYXJ5IGZvciBwcm9wZXIgZGlzcGxheSBvZiB0aGUgU1NJRCBpbgorCQkgICB0aGUgd2lyZWxlc3MgdG9vbHMgKi8KKwkJZGF0YS0+bGVuZ3RoID0gcE5hbWUtPmxlbmd0aCArIDE7CisJCWlmKCBwTmFtZS0+bGVuZ3RoIDwgSENGX01BWF9OQU1FX0xFTiApIHsKKwkJCXBOYW1lLT5uYW1lW3BOYW1lLT5sZW5ndGhdID0gJ1wwJzsKKwkJfQorCisJCWRhdGEtPmZsYWdzID0gMTsKKworCisjaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9TVEEKKwkJCQkJLy87P3Nob3VsZCB3ZSByZXR1cm4gYW4gZXJyb3Igc3RhdHVzIGluIEFQIG1vZGUKKyNpZmRlZiBSRVRVUk5fQ1VSUkVOVF9ORVRXT1JLTkFNRQorCisJCS8qIGlmIGRlc2lyZWQgaXMgbnVsbCAoImFueSIpLCByZXR1cm4gY3VycmVudCBvciAiYW55IiAqLworCQlpZiggcE5hbWUtPm5hbWVbMF0gPT0gJ1wwJyApIHsKKwkJCS8qIEdldCB0aGUgY3VycmVudCBuZXR3b3JrIG5hbWUgKi8KKwkJCWxwLT5sdHZSZWNvcmQubGVuID0gMSArICggc2l6ZW9mKCpwTmFtZSApIC8gc2l6ZW9mKCBoY2ZfMTYgKSk7CisJCQlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19DVVJfU1NJRDsKKworCQkJc3RhdHVzID0gaGNmX2dldF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJCWlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CisJCQkJcE5hbWUgPSAod3ZOYW1lX3QgKikmKCBscC0+bHR2UmVjb3JkLnUudTMyICk7CisKKwkJCQkvKiBFbmRpYW4gdHJhbnNsYXRlIHRoZSBzdHJpbmcgbGVuZ3RoICovCisJCQkJcE5hbWUtPmxlbmd0aCA9IENOVl9MSVRUTEVfVE9fSU5UKCBwTmFtZS0+bGVuZ3RoICk7CisKKwkJCQkvKiBDb3B5IHRoZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSB1c2VyIGJ1ZmZlciAqLworCQkJCWRhdGEtPmxlbmd0aCA9IHBOYW1lLT5sZW5ndGggKyAxOworCQkJCWlmKCBwTmFtZS0+bGVuZ3RoIDwgSENGX01BWF9OQU1FX0xFTiApIHsKKwkJCQkJcE5hbWUtPm5hbWVbcE5hbWUtPmxlbmd0aF0gPSAnXDAnOworCQkJCX0KKworCQkJCWRhdGEtPmZsYWdzID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlnb3RvIG91dF91bmxvY2s7CisJCQl9CisJCX0KKworI2VuZGlmIC8vIFJFVFVSTl9DVVJSRU5UX05FVFdPUktOQU1FCisjZW5kaWYgLy8gSENGX1NUQQorCisJCWRhdGEtPmxlbmd0aC0tOworCisJCWlmIChwTmFtZS0+bGVuZ3RoID4gSVdfRVNTSURfTUFYX1NJWkUpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKworCQltZW1jcHkoZXNzaWQsIHBOYW1lLT5uYW1lLCBwTmFtZS0+bGVuZ3RoKTsKKwl9IGVsc2UgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCitvdXRfdW5sb2NrOgorICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCitvdXQ6CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3NfZ2V0X2Vzc2lkCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2lyZWxlc3Nfc2V0X2VuY29kZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgU2V0cyB0aGUgZW5jcnlwdGlvbiBrZXlzIGFuZCBzdGF0dXMgKGVuYWJsZSBvciBkaXNhYmxlKS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdpcmVsZXNzX3NldF9lbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmtleWJ1ZikKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgICAgIHJldCA9IDA7CisKKyNpZiAxIC8vOz8gI2lmIFdJUkVMRVNTX0VYVCA+IDggLSB1c2VkIHVuY29uZGl0aW9uYWxseSBpbiB0aGUgcmVzdCBvZiB0aGUgY29kZS4uLgorCWhjZl84ICAgZW5jcnlwdGlvbl9zdGF0ZTsKKyNlbmRpZiAvLyBXSVJFTEVTU19FWFQgPiA4CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggIndpcmVsZXNzX3NldF9lbmNvZGUiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKwkvKiBJcyBlbmNyeXB0aW9uIHN1cHBvcnRlZD8gKi8KKwlpZiggIXdsX2hhc193ZXAoICYoIGxwLT5oY2ZDdHggKSkpIHsKKwkJREJHX1dBUk5JTkcoIERiZ0luZm8sICJXRVAgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGRldmljZVxuIiApOworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCURCR19OT1RJQ0UoIERiZ0luZm8sICJwb2ludGVyOiAlcCwgbGVuZ3RoOiAlZCwgZmxhZ3M6ICUjeFxuIiwKKwkJCQlrZXlidWYsIGVycS0+bGVuZ3RoLAorCQkJCWVycS0+ZmxhZ3MpOworCisJLyogU2F2ZSBzdGF0ZSBvZiBFbmNyeXB0aW9uIHN3aXRjaCAqLworCWVuY3J5cHRpb25fc3RhdGUgPSBscC0+RW5hYmxlRW5jcnlwdGlvbjsKKworCS8qIEJhc2ljIGNoZWNraW5nOiBkbyB3ZSBoYXZlIGEga2V5IHRvIHNldD8gKi8KKwlpZigoZXJxLT5sZW5ndGgpICE9IDApIHsKKwkJaW50IGluZGV4ICAgPSAoIGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVggKSAtIDE7CisJCWludCB0ayAgICAgID0gbHAtPlRyYW5zbWl0S2V5SUQgLSAxOwkJLy8gY3VycmVudCBrZXkKKworCisJCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBrZXkgKi8KKwkJc3dpdGNoKGVycS0+bGVuZ3RoKSB7CisJCWNhc2UgMDoKKwkJCWJyZWFrOworCisJCWNhc2UgTUlOX0tFWV9TSVpFOgorCQljYXNlIE1BWF9LRVlfU0laRToKKworCQkJLyogQ2hlY2sgdGhlIGluZGV4ICovCisJCQlpZigoIGluZGV4IDwgMCApIHx8ICggaW5kZXggPj0gTUFYX0tFWVMgKSkgeworCQkJCWluZGV4ID0gdGs7CisJCQl9CisKKwkJCS8qIENsZWFudXAgKi8KKwkJCW1lbXNldCggbHAtPkRlZmF1bHRLZXlzLmtleVtpbmRleF0ua2V5LCAwLCBNQVhfS0VZX1NJWkUgKTsKKworCQkJLyogQ29weSB0aGUga2V5IGluIHRoZSBkcml2ZXIgKi8KKwkJCW1lbWNweSggbHAtPkRlZmF1bHRLZXlzLmtleVtpbmRleF0ua2V5LCBrZXlidWYsIGVycS0+bGVuZ3RoKTsKKworCQkJLyogU2V0IHRoZSBsZW5ndGggKi8KKwkJCWxwLT5EZWZhdWx0S2V5cy5rZXlbaW5kZXhdLmxlbiA9IGVycS0+bGVuZ3RoOworCisJCQlEQkdfTk9USUNFKCBEYmdJbmZvLCAiZW5jb2RpbmcubGVuZ3RoOiAlZFxuIiwgZXJxLT5sZW5ndGggKTsKKwkJCURCR19OT1RJQ0UoIERiZ0luZm8sICJzZXQga2V5OiAlcyglZCkgWyVkXVxuIiwgbHAtPkRlZmF1bHRLZXlzLmtleVtpbmRleF0ua2V5LAorCQkJCQkJbHAtPkRlZmF1bHRLZXlzLmtleVtpbmRleF0ubGVuLCBpbmRleCApOworCisJCQkvKiBFbmFibGUgV0VQIChpZiBwb3NzaWJsZSkgKi8KKwkJCWlmKCggaW5kZXggPT0gdGsgKSAmJiAoIGxwLT5EZWZhdWx0S2V5cy5rZXlbdGtdLmxlbiA+IDAgKSkgeworCQkJCWxwLT5FbmFibGVFbmNyeXB0aW9uID0gMTsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiSW52YWxpZCBLZXkgbGVuZ3RoXG4iICk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisJfSBlbHNlIHsKKwkJaW50IGluZGV4ID0gKCBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYICkgLSAxOworCisKKwkJLyogRG8gd2Ugd2FudCB0byBqdXN0IHNldCB0aGUgY3VycmVudCB0cmFuc21pdCBrZXk/ICovCisJCWlmKCggaW5kZXggPj0gMCApICYmICggaW5kZXggPCBNQVhfS0VZUyApKSB7CisJCQlEQkdfTk9USUNFKCBEYmdJbmZvLCAiaW5kZXg6ICVkOyBsZW46ICVkXG4iLCBpbmRleCwKKwkJCQkJCWxwLT5EZWZhdWx0S2V5cy5rZXlbaW5kZXhdLmxlbiApOworCisJCQlpZiggbHAtPkRlZmF1bHRLZXlzLmtleVtpbmRleF0ubGVuID4gMCApIHsKKwkJCQlscC0+VHJhbnNtaXRLZXlJRCAgICAgICA9IGluZGV4ICsgMTsKKwkJCQlscC0+RW5hYmxlRW5jcnlwdGlvbiAgICA9IDE7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiUHJvYmxlbSBzZXR0aW5nIHRoZSBjdXJyZW50IFR4S2V5XG4iICk7CisJCQkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0KKworCS8qIFJlYWQgdGhlIGZsYWdzICovCisJaWYoIGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQgKSB7CisJCWxwLT5FbmFibGVFbmNyeXB0aW9uID0gMDsJLy8gZGlzYWJsZSBlbmNyeXB0aW9uCisJfSBlbHNlIHsKKwkJbHAtPkVuYWJsZUVuY3J5cHRpb24gPSAxOworCX0KKworCWlmKCBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQgKSB7CisJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiSVdfRU5DT0RFX1JFU1RSSUNURUQgaW52YWxpZFxuIiApOworCQlyZXQgPSAtRUlOVkFMOwkJLy8gSW52YWxpZAorCX0KKworCURCR19UUkFDRSggRGJnSW5mbywgImVuY3J5cHRpb25fc3RhdGUgOiAgICAgICAlZFxuIiwgZW5jcnlwdGlvbl9zdGF0ZSApOworCURCR19UUkFDRSggRGJnSW5mbywgImxwLT5FbmFibGVFbmNyeXB0aW9uIDogICAlZFxuIiwgbHAtPkVuYWJsZUVuY3J5cHRpb24gKTsKKwlEQkdfVFJBQ0UoIERiZ0luZm8sICJlcnEtPmxlbmd0aCAgICAgICAgICAgIDogJWRcbiIsCisJCQkgICBlcnEtPmxlbmd0aCk7CisJREJHX1RSQUNFKCBEYmdJbmZvLCAiZXJxLT5mbGFncyAgICAgICAgICAgICA6IDB4JXhcbiIsCisJCQkgICBlcnEtPmZsYWdzKTsKKworCS8qIFdyaXRlIHRoZSBjaGFuZ2VzIHRvIHRoZSBjYXJkICovCisJaWYoIHJldCA9PSAwICkgeworCQlEQkdfTk9USUNFKCBEYmdJbmZvLCAiZW5jcnlwdDogJWQsIElEOiAlZFxuIiwgbHAtPkVuYWJsZUVuY3J5cHRpb24sCisJCQkJCWxwLT5UcmFuc21pdEtleUlEICk7CisKKwkJaWYoIGxwLT5FbmFibGVFbmNyeXB0aW9uID09IGVuY3J5cHRpb25fc3RhdGUgKSB7CisJCQlpZiggZXJxLT5sZW5ndGggIT0gMCApIHsKKwkJCQkvKiBEeW5hbWljIFdFUCBrZXkgdXBkYXRlICovCisJCQkJd2xfc2V0X3dlcF9rZXlzKCBscCApOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogVG8gc3dpdGNoIGVuY3J5cHRpb24gb24vb2ZmLCBzb2Z0IHJlc2V0IGlzIHJlcXVpcmVkICovCisJCQl3bF9hcHBseSggbHAgKTsKKwkJfQorCX0KKworCS8qIFNlbmQgYW4gZXZlbnQgdGhhdCBFbmNyeXB0aW9uIGhhcyBiZWVuIHNldCAqLworCXdsX3dleHRfZXZlbnRfZW5jb2RlKCBkZXYgKTsKKworb3V0X3VubG9jazoKKworICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCitvdXQ6CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3Nfc2V0X2VuY29kZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdpcmVsZXNzX2dldF9lbmNvZGUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgIEdldHMgdGhlIGVuY3J5cHRpb24ga2V5cyBhbmQgc3RhdHVzLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3NfZ2V0X2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBzdHJ1Y3QgaXdfcG9pbnQgKmVycSwgY2hhciAqa2V5KQorCit7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisJaW50IGluZGV4OworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3aXJlbGVzc19nZXRfZW5jb2RlIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCURCR19OT1RJQ0UoRGJnSW5mbywgIkdJV0VOQ09ERTogZW5jcnlwdDogJWQsIElEOiAlZFxuIiwgbHAtPkVuYWJsZUVuY3J5cHRpb24sIGxwLT5UcmFuc21pdEtleUlEKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCS8qIE9ubHkgc3VwZXItdXNlciBjYW4gc2VlIFdFUCBrZXkgKi8KKwlpZiggIWNhcGFibGUoIENBUF9ORVRfQURNSU4gKSkgeworCQlyZXQgPSAtRVBFUk07CisJCURCR19MRUFWRSggRGJnSW5mbyApOworCQlyZXR1cm4gcmV0OworCX0KKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworCS8qIElzIGl0IHN1cHBvcnRlZD8gKi8KKwlpZiggIXdsX2hhc193ZXAoICYoIGxwLT5oY2ZDdHggKSkpIHsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwkvKiBCYXNpYyBjaGVja2luZyAqLworCWluZGV4ID0gKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVggKSAtIDE7CisKKworCS8qIFNldCB0aGUgZmxhZ3MgKi8KKwllcnEtPmZsYWdzID0gMDsKKworCWlmKCBscC0+RW5hYmxlRW5jcnlwdGlvbiA9PSAwICkgeworCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwl9CisKKwkvKiBXaGljaCBrZXkgZG8gd2Ugd2FudCAqLworCWlmKCggaW5kZXggPCAwICkgfHwgKCBpbmRleCA+PSBNQVhfS0VZUyApKSB7CisJCWluZGV4ID0gbHAtPlRyYW5zbWl0S2V5SUQgLSAxOworCX0KKworCWVycS0+ZmxhZ3MgfD0gaW5kZXggKyAxOworCisJLyogQ29weSB0aGUga2V5IHRvIHRoZSB1c2VyIGJ1ZmZlciAqLworCWVycS0+bGVuZ3RoID0gbHAtPkRlZmF1bHRLZXlzLmtleVtpbmRleF0ubGVuOworCisJbWVtY3B5KGtleSwgbHAtPkRlZmF1bHRLZXlzLmtleVtpbmRleF0ua2V5LCBlcnEtPmxlbmd0aCk7CisKK291dF91bmxvY2s6CisKKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworb3V0OgorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX2dldF9lbmNvZGUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3aXJlbGVzc19zZXRfbmlja25hbWUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgIFNldHMgdGhlIG5pY2tuYW1lLCBvciBzdGF0aW9uIG5hbWUsIG9mIHRoZSB3aXJlbGVzcyBkZXZpY2UuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3aXJlbGVzc19zZXRfbmlja25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpuaWNrbmFtZSkKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid2lyZWxlc3Nfc2V0X25pY2tuYW1lIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisjaWYgMCAvLzs/IE5lZWRlZCwgd2FzIHByZXNlbnQgaW4gb3JpZ2luYWwgY29kZSBidXQgbm90IGluIDcuMTggTGludXggMi42IGtlcm5lbCB2ZXJzaW9uCisJaWYoICFjYXBhYmxlKENBUF9ORVRfQURNSU4gKSkgeworCQlyZXQgPSAtRVBFUk07CisJCURCR19MRUFWRSggRGJnSW5mbyApOworCQlyZXR1cm4gcmV0OworCX0KKyNlbmRpZgorCisJLyogVmFsaWRhdGUgdGhlIG5ldyB2YWx1ZSAqLworCWlmKGRhdGEtPmxlbmd0aCA+IEhDRl9NQVhfTkFNRV9MRU4pIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisJbWVtc2V0KCBscC0+U3RhdGlvbk5hbWUsIDAsIHNpemVvZiggbHAtPlN0YXRpb25OYW1lICkpOworCisJbWVtY3B5KCBscC0+U3RhdGlvbk5hbWUsIG5pY2tuYW1lLCBkYXRhLT5sZW5ndGggKTsKKworCS8qIENvbW1pdCB0aGUgYWRhcHRlciBwYXJhbWV0ZXJzICovCisJd2xfYXBwbHkoIGxwICk7CisKKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworb3V0OgorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX3NldF9uaWNrbmFtZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdpcmVsZXNzX2dldF9uaWNrbmFtZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgR2V0cyB0aGUgbmlja25hbWUsIG9yIHN0YXRpb24gbmFtZSwgb2YgdGhlIHdpcmVsZXNzIGRldmljZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdpcmVsZXNzX2dldF9uaWNrbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKm5pY2tuYW1lKQoreworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCAgICAgICAgIHJldCA9IDA7CisJaW50ICAgICAgICAgc3RhdHVzID0gLTE7CisJd3ZOYW1lX3QgICAgKnBOYW1lOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3aXJlbGVzc19nZXRfbmlja25hbWUiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKwkvKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlvbiBuYW1lICovCisJbHAtPmx0dlJlY29yZC5sZW4gPSAxICsgKCBzaXplb2YoICpwTmFtZSApIC8gc2l6ZW9mKCBoY2ZfMTYgKSk7CisJbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfQ05GX09XTl9OQU1FOworCisJc3RhdHVzID0gaGNmX2dldF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwlpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgeworCQlwTmFtZSA9ICh3dk5hbWVfdCAqKSYoIGxwLT5sdHZSZWNvcmQudS51MzIgKTsKKworCQkvKiBFbmRpYW4gdHJhbnNsYXRlIHRoZSBsZW5ndGggKi8KKwkJcE5hbWUtPmxlbmd0aCA9IENOVl9MSVRUTEVfVE9fSU5UKCBwTmFtZS0+bGVuZ3RoICk7CisKKwkJaWYgKCBwTmFtZS0+bGVuZ3RoID4gSVdfRVNTSURfTUFYX1NJWkUgKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQl9IGVsc2UgeworCQkJLyogQ29weSB0aGUgaW5mb3JtYXRpb24gaW50byB0aGUgdXNlciBidWZmZXIgKi8KKwkJCWRhdGEtPmxlbmd0aCA9IHBOYW1lLT5sZW5ndGg7CisJCQltZW1jcHkobmlja25hbWUsIHBOYW1lLT5uYW1lLCBwTmFtZS0+bGVuZ3RoKTsKKwkJfQorCX0gZWxzZSB7CisJCXJldCA9IC1FRkFVTFQ7CisJfQorCisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKK291dDoKKwlEQkdfTEVBVkUoRGJnSW5mbyk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3NfZ2V0X25pY2tuYW1lCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2lyZWxlc3Nfc2V0X3BvcnR0eXBlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICBTZXRzIHRoZSBwb3J0IHR5cGUgb2YgdGhlIHdpcmVsZXNzIGRldmljZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdpcmVsZXNzX3NldF9wb3J0dHlwZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBfX3UzMiAqbW9kZSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisJaGNmXzE2ICBwb3J0VHlwZTsKKwloY2ZfMTYJY3JlYXRlSUJTUzsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlEQkdfRlVOQyggIndpcmVsZXNzX3NldF9wb3J0dHlwZSIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworCS8qIFZhbGlkYXRlIHRoZSBuZXcgdmFsdWUgKi8KKwlzd2l0Y2goICptb2RlICkgeworCWNhc2UgSVdfTU9ERV9BREhPQzoKKworCQkvKiBXaGVuIHVzZXIgcmVxdWVzdHMgYWQtaG9jLCBzZXQgSUJTUyBtb2RlISAqLworCQlwb3J0VHlwZSAgICAgICAgID0gMTsKKwkJY3JlYXRlSUJTUyAgICAgICA9IDE7CisKKwkJbHAtPkRvd25sb2FkRmlybXdhcmUgPSBXVkxBTl9EUlZfTU9ERV9TVEE7IC8vMTsKKworCQlicmVhazsKKworCisJY2FzZSBJV19NT0RFX0FVVE86CisJY2FzZSBJV19NT0RFX0lORlJBOgorCisJCS8qIEJvdGggYXV0b21hdGljIGFuZCBpbmZyYXN0cnVjdHVyZSBzZXQgcG9ydCB0byBCU1MvU1RBIG1vZGUgKi8KKwkJcG9ydFR5cGUgICAgICAgICA9IDE7CisJCWNyZWF0ZUlCU1MgICAgICAgPSAwOworCisJCWxwLT5Eb3dubG9hZEZpcm13YXJlID0gV1ZMQU5fRFJWX01PREVfU1RBOyAvLzE7CisKKwkJYnJlYWs7CisKKworI2lmIDAgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAKKworCWNhc2UgSVdfTU9ERV9NQVNURVI6CisKKwkJLyogU2V0IEJTUy9BUCBtb2RlICovCisJCXBvcnRUeXBlICAgICAgICAgICAgID0gMTsKKworCQlscC0+Q3JlYXRlSUJTUyAgICAgICA9IDA7CisJCWxwLT5Eb3dubG9hZEZpcm13YXJlID0gV1ZMQU5fRFJWX01PREVfQVA7IC8vMjsKKworCQlicmVhazsKKworI2VuZGlmIC8qIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUCAqLworCisKKwlkZWZhdWx0OgorCisJCXBvcnRUeXBlICAgPSAwOworCQljcmVhdGVJQlNTID0gMDsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlpZiggcG9ydFR5cGUgIT0gMCApIHsKKwkJLyogT25seSBkbyBzb21ldGhpbmcgaWYgdGhlcmUgaXMgYSBtb2RlIGNoYW5nZSAqLworCQlpZiggKCBscC0+UG9ydFR5cGUgIT0gcG9ydFR5cGUgKSB8fCAobHAtPkNyZWF0ZUlCU1MgIT0gY3JlYXRlSUJTUykpIHsKKwkJCWxwLT5Qb3J0VHlwZSAgID0gcG9ydFR5cGU7CisJCQlscC0+Q3JlYXRlSUJTUyA9IGNyZWF0ZUlCU1M7CisKKwkJCS8qIENvbW1pdCB0aGUgYWRhcHRlciBwYXJhbWV0ZXJzICovCisJCQl3bF9nbyggbHAgKTsKKworCQkJLyogU2VuZCBhbiBldmVudCB0aGF0IG1vZGUgaGFzIGJlZW4gc2V0ICovCisJCQl3bF93ZXh0X2V2ZW50X21vZGUoIGxwLT5kZXYgKTsKKwkJfQorCX0KKworICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCitvdXQ6CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3Nfc2V0X3BvcnR0eXBlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2lyZWxlc3NfZ2V0X3BvcnR0eXBlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICBHZXRzIHRoZSBwb3J0IHR5cGUgb2YgdGhlIHdpcmVsZXNzIGRldmljZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdpcmVsZXNzX2dldF9wb3J0dHlwZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBfX3UzMiAqbW9kZSwgY2hhciAqZXh0cmEpCisKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgICAgIHJldCA9IDA7CisJaW50ICAgICBzdGF0dXMgPSAtMTsKKwloY2ZfMTYgICpwUG9ydFR5cGU7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggIndpcmVsZXNzX2dldF9wb3J0dHlwZSIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworCS8qIEdldCB0aGUgY3VycmVudCBwb3J0IHR5cGUgKi8KKwlscC0+bHR2UmVjb3JkLmxlbiA9IDEgKyAoIHNpemVvZiggKnBQb3J0VHlwZSApIC8gc2l6ZW9mKCBoY2ZfMTYgKSk7CisJbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfQ05GX1BPUlRfVFlQRTsKKworCXN0YXR1cyA9IGhjZl9nZXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJaWYoIHN0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwkJcFBvcnRUeXBlID0gKGhjZl8xNiAqKSYoIGxwLT5sdHZSZWNvcmQudS51MzIgKTsKKworCQkqcFBvcnRUeXBlID0gQ05WX0xJVFRMRV9UT19JTlQoICpwUG9ydFR5cGUgKTsKKworCQlzd2l0Y2goICpwUG9ydFR5cGUgKSB7CisJCWNhc2UgMToKKworI2lmIDAKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAKKworCQkJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19BUCAgKSB7CisJCQkJKm1vZGUgPSBJV19NT0RFX01BU1RFUjsKKwkJCX0gZWxzZSB7CisJCQkJKm1vZGUgPSBJV19NT0RFX0lORlJBOworCQkJfQorCisjZWxzZQorCisJCQkqbW9kZSA9IElXX01PREVfSU5GUkE7CisKKyNlbmRpZiAgLyogKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQICovCisjZW5kaWYKKworCQkJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19BUCAgKSB7CisJCQkJKm1vZGUgPSAgSVdfTU9ERV9NQVNURVI7CisJCQl9IGVsc2UgeworCQkJCWlmKCBscC0+Q3JlYXRlSUJTUyApIHsKKwkJCQkJKm1vZGUgPSBJV19NT0RFX0FESE9DOworCQkJCX0gZWxzZSB7CisJCQkJCSptb2RlID0gSVdfTU9ERV9JTkZSQTsKKwkJCQl9CisJCQl9CisKKwkJCWJyZWFrOworCisKKwkJY2FzZSAzOgorCQkJKm1vZGUgPSBJV19NT0RFX0FESE9DOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXJldCA9IC1FRkFVTFQ7CisJfQorCisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKK291dDoKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19nZXRfcG9ydHR5cGUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3aXJlbGVzc19zZXRfcG93ZXIoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgIFNldHMgdGhlIHBvd2VyIG1hbmFnZW1lbnQgc2V0dGluZ3Mgb2YgdGhlIHdpcmVsZXNzIGRldmljZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdpcmVsZXNzX3NldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBzdHJ1Y3QgaXdfcGFyYW0gKndycSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggIndpcmVsZXNzX3NldF9wb3dlciIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCURCR19QUklOVCggIlRISVMgQ09SUlVQVFMgUE1FbmFibGVkIDs/ISEhISEhISEhISEhISEhISEhISEhISEhISEhISFcbiIgKTsKKworI2lmIDAgLy87PyBOZWVkZWQsIHdhcyBwcmVzZW50IGluIG9yaWdpbmFsIGNvZGUgYnV0IG5vdCBpbiA3LjE4IExpbnV4IDIuNiBrZXJuZWwgdmVyc2lvbgorCWlmKCAhY2FwYWJsZSggQ0FQX05FVF9BRE1JTiApKSB7CisJCXJldCA9IC1FUEVSTTsKKworCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJcmV0dXJuIHJldDsKKwl9CisjZW5kaWYKKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworCS8qIFNldCB0aGUgcG93ZXIgbWFuYWdlbWVudCBzdGF0ZSBiYXNlZCBvbiB0aGUgJ2Rpc2FibGVkJyB2YWx1ZSAqLworCWlmKCB3cnEtPmRpc2FibGVkICkgeworCQlscC0+UE1FbmFibGVkID0gMDsKKwl9IGVsc2UgeworCQlscC0+UE1FbmFibGVkID0gMTsKKwl9CisKKwkvKiBDb21taXQgdGhlIGFkYXB0ZXIgcGFyYW1ldGVycyAqLworCXdsX2FwcGx5KCBscCApOworCisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKK291dDoKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19zZXRfcG93ZXIKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3aXJlbGVzc19nZXRfcG93ZXIoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgIEdldHMgdGhlIHBvd2VyIG1hbmFnZW1lbnQgc2V0dGluZ3Mgb2YgdGhlIHdpcmVsZXNzIGRldmljZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdpcmVsZXNzX2dldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBzdHJ1Y3QgaXdfcGFyYW0gKnJycSwgY2hhciAqZXh0cmEpCisKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJREJHX0ZVTkMoICJ3aXJlbGVzc19nZXRfcG93ZXIiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlEQkdfUFJJTlQoICJUSElTIElTIFBST0JBQkxZIEFOIE9WRVItU0lNUExJRklDQVRJT04gOz8hISEhISEhISEhISEhISEhISEhISEhISEhISEhIVxuIiApOworCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisJcnJxLT5mbGFncyA9IDA7CisJcnJxLT52YWx1ZSA9IDA7CisKKwlpZiggbHAtPlBNRW5hYmxlZCApIHsKKwkJcnJxLT5kaXNhYmxlZCA9IDA7CisJfSBlbHNlIHsKKwkJcnJxLT5kaXNhYmxlZCA9IDE7CisJfQorCisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKK291dDoKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19nZXRfcG93ZXIKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3aXJlbGVzc19nZXRfdHhfcG93ZXIoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgIEdldHMgdGhlIHRyYW5zbWl0IHBvd2VyIG9mIHRoZSB3aXJlbGVzcyBkZXZpY2UncyByYWRpby4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdpcmVsZXNzX2dldF90eF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBzdHJ1Y3QgaXdfcGFyYW0gKnJycSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCURCR19GVU5DKCAid2lyZWxlc3NfZ2V0X3R4X3Bvd2VyIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisjaWZkZWYgVVNFX1BPV0VSX0RCTQorCXJycS0+dmFsdWUgPSBSQURJT19UWF9QT1dFUl9EQk07CisJcnJxLT5mbGFncyA9IElXX1RYUE9XX0RCTTsKKyNlbHNlCisJcnJxLT52YWx1ZSA9IFJBRElPX1RYX1BPV0VSX01XQVRUOworCXJycS0+ZmxhZ3MgPSBJV19UWFBPV19NV0FUVDsKKyNlbmRpZgorCXJycS0+Zml4ZWQgPSAxOworCXJycS0+ZGlzYWJsZWQgPSAwOworCisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKK291dDoKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19nZXRfdHhfcG93ZXIKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3aXJlbGVzc19zZXRfcnRzX3RocmVzaG9sZCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgU2V0cyB0aGUgUlRTIHRocmVzaG9sZCBmb3IgdGhlIHdpcmVsZXNzIGNhcmQuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3aXJlbGVzc19zZXRfcnRzX3RocmVzaG9sZCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBydGhyID0gcnRzLT52YWx1ZTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid2lyZWxlc3Nfc2V0X3J0c190aHJlc2hvbGQiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlpZihydHMtPmZpeGVkID09IDApIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisjaWYgV0lSRUxFU1NfRVhUID4gOAorCWlmKCBydHMtPmRpc2FibGVkICkgeworCQlydGhyID0gMjM0NzsKKwl9CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gOCAqLworCisJaWYoKCBydGhyIDwgMjU2ICkgfHwgKCBydGhyID4gMjM0NyApKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworCWxwLT5SVFNUaHJlc2hvbGQgPSBydGhyOworCisJd2xfYXBwbHkoIGxwICk7CisKKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworb3V0OgorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX3NldF9ydHNfdGhyZXNob2xkCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2lyZWxlc3NfZ2V0X3J0c190aHJlc2hvbGQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgIEdldHMgdGhlIFJUUyB0aHJlc2hvbGQgZm9yIHRoZSB3aXJlbGVzcyBjYXJkLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3NfZ2V0X3J0c190aHJlc2hvbGQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlEQkdfRlVOQyggIndpcmVsZXNzX2dldF9ydHNfdGhyZXNob2xkIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisJcnRzLT52YWx1ZSA9IGxwLT5SVFNUaHJlc2hvbGQ7CisKKyNpZiBXSVJFTEVTU19FWFQgPiA4CisKKwlydHMtPmRpc2FibGVkID0gKCBydHMtPnZhbHVlID09IDIzNDcgKTsKKworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDggKi8KKworCXJ0cy0+Zml4ZWQgPSAxOworCisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKK291dDoKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19nZXRfcnRzX3RocmVzaG9sZAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2lyZWxlc3Nfc2V0X3JhdGUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBTZXQgdGhlIGRlZmF1bHQgZGF0YSByYXRlIHNldHRpbmcgdXNlZCBieSB0aGUgd2lyZWxlc3MgZGV2aWNlLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3Nfc2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IGl3X3BhcmFtICpycnEsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworI2lmZGVmIFdBUlAKKwlpbnQgc3RhdHVzID0gLTE7CisJaW50IGluZGV4ID0gMDsKKyNlbmRpZiAgLy8gV0FSUAorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3aXJlbGVzc19zZXRfcmF0ZSIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworI2lmZGVmIFdBUlAKKworCS8qIERldGVybWluZSBpZiB0aGUgY2FyZCBpcyBvcGVyYXRpbmcgaW4gdGhlIDIuNCBvciA1LjAgR0h6IGJhbmQ7IGNoZWNrCisJICAgaWYgQml0IDkgaXMgc2V0IGluIHRoZSBjdXJyZW50IGNoYW5uZWwgUklEICovCisJbHAtPmx0dlJlY29yZC5sZW4gPSAyOworCWxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0NVUl9DSEFOTkVMOworCisJc3RhdHVzID0gaGNmX2dldF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwlpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgeworCQlpbmRleCA9ICggQ05WX0xJVFRMRV9UT19JTlQoIGxwLT5sdHZSZWNvcmQudS51MTZbMF0gKSAmIDB4MTAwICkgPyAxIDogMDsKKworCQlEQkdfUFJJTlQoICJJbmRleDogJWRcbiIsIGluZGV4ICk7CisJfSBlbHNlIHsKKwkJREJHX0VSUk9SKCBEYmdJbmZvLCAiQ291bGQgbm90IGRldGVybWluZSByYWRpbyBmcmVxdWVuY3lcbiIgKTsKKwkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlpZiggcnJxLT52YWx1ZSA+IDAgJiYKKwkJcnJxLT52YWx1ZSA8PSAxICogTUVHQUJJVCApIHsKKwkJbHAtPlR4UmF0ZUNvbnRyb2xbaW5kZXhdID0gMHgwMDAxOworCX0KKwllbHNlIGlmKCBycnEtPnZhbHVlID4gMSAqIE1FR0FCSVQgJiYKKwkJCXJycS0+dmFsdWUgPD0gMiAqIE1FR0FCSVQgKSB7CisJCWlmKCBycnEtPmZpeGVkID09IDEgKSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFtpbmRleF0gPSAweDAwMDI7CisJCX0gZWxzZSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFtpbmRleF0gPSAweDAwMDM7CisJCX0KKwl9CisJZWxzZSBpZiggcnJxLT52YWx1ZSA+IDIgKiBNRUdBQklUICYmCisJCQlycnEtPnZhbHVlIDw9IDUgKiBNRUdBQklUICkgeworCQlpZiggcnJxLT5maXhlZCA9PSAxICkgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbaW5kZXhdID0gMHgwMDA0OworCQl9IGVsc2UgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbaW5kZXhdID0gMHgwMDA3OworCQl9CisJfQorCWVsc2UgaWYoIHJycS0+dmFsdWUgPiA1ICogTUVHQUJJVCAmJgorCQkJcnJxLT52YWx1ZSA8PSA2ICogTUVHQUJJVCApIHsKKwkJaWYoIHJycS0+Zml4ZWQgPT0gMSApIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sW2luZGV4XSA9IDB4MDAxMDsKKwkJfSBlbHNlIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sW2luZGV4XSA9IDB4MDAxNzsKKwkJfQorCX0KKwllbHNlIGlmKCBycnEtPnZhbHVlID4gNiAqIE1FR0FCSVQgJiYKKwkJCXJycS0+dmFsdWUgPD0gOSAqIE1FR0FCSVQgKSB7CisJCWlmKCBycnEtPmZpeGVkID09IDEgKSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFtpbmRleF0gPSAweDAwMjA7CisJCX0gZWxzZSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFtpbmRleF0gPSAweDAwMzc7CisJCX0KKwl9CisJZWxzZSBpZiggcnJxLT52YWx1ZSA+IDkgKiBNRUdBQklUICYmCisJCQlycnEtPnZhbHVlIDw9IDExICogTUVHQUJJVCApIHsKKwkJaWYoIHJycS0+Zml4ZWQgPT0gMSApIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sW2luZGV4XSA9IDB4MDAwODsKKwkJfSBlbHNlIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sW2luZGV4XSA9IDB4MDAzRjsKKwkJfQorCX0KKwllbHNlIGlmKCBycnEtPnZhbHVlID4gMTEgKiBNRUdBQklUICYmCisJCQlycnEtPnZhbHVlIDw9IDEyICogTUVHQUJJVCApIHsKKwkJaWYoIHJycS0+Zml4ZWQgPT0gMSApIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sW2luZGV4XSA9IDB4MDA0MDsKKwkJfSBlbHNlIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sW2luZGV4XSA9IDB4MDA3RjsKKwkJfQorCX0KKwllbHNlIGlmKCBycnEtPnZhbHVlID4gMTIgKiBNRUdBQklUICYmCisJCQlycnEtPnZhbHVlIDw9IDE4ICogTUVHQUJJVCApIHsKKwkJaWYoIHJycS0+Zml4ZWQgPT0gMSApIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sW2luZGV4XSA9IDB4MDA4MDsKKwkJfSBlbHNlIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sW2luZGV4XSA9IDB4MDBGRjsKKwkJfQorCX0KKwllbHNlIGlmKCBycnEtPnZhbHVlID4gMTggKiBNRUdBQklUICYmCisJCQlycnEtPnZhbHVlIDw9IDI0ICogTUVHQUJJVCApIHsKKwkJaWYoIHJycS0+Zml4ZWQgPT0gMSApIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sW2luZGV4XSA9IDB4MDEwMDsKKwkJfSBlbHNlIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sW2luZGV4XSA9IDB4MDFGRjsKKwkJfQorCX0KKwllbHNlIGlmKCBycnEtPnZhbHVlID4gMjQgKiBNRUdBQklUICYmCisJCQlycnEtPnZhbHVlIDw9IDM2ICogTUVHQUJJVCApIHsKKwkJaWYoIHJycS0+Zml4ZWQgPT0gMSApIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sW2luZGV4XSA9IDB4MDIwMDsKKwkJfSBlbHNlIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sW2luZGV4XSA9IDB4MDNGRjsKKwkJfQorCX0KKwllbHNlIGlmKCBycnEtPnZhbHVlID4gMzYgKiBNRUdBQklUICYmCisJCQlycnEtPnZhbHVlIDw9IDQ4ICogTUVHQUJJVCApIHsKKwkJaWYoIHJycS0+Zml4ZWQgPT0gMSApIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sW2luZGV4XSA9IDB4MDQwMDsKKwkJfSBlbHNlIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sW2luZGV4XSA9IDB4MDdGRjsKKwkJfQorCX0KKwllbHNlIGlmKCBycnEtPnZhbHVlID4gNDggKiBNRUdBQklUICYmCisJCQlycnEtPnZhbHVlIDw9IDU0ICogTUVHQUJJVCApIHsKKwkJaWYoIHJycS0+Zml4ZWQgPT0gMSApIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sW2luZGV4XSA9IDB4MDgwMDsKKwkJfSBlbHNlIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sW2luZGV4XSA9IDB4MEZGRjsKKwkJfQorCX0KKwllbHNlIGlmKCBycnEtPmZpeGVkID09IDAgKSB7CisJCS8qIEluIHRoaXMgY2FzZSwgdGhlIHVzZXIgaGFzIG5vdCBzcGVjaWZpZWQgYSBiaXRyYXRlLCBvbmx5IHRoZSAiYXV0byIKKwkJICAgbW9uaWtlci4gU28sIHNldCB0byBhbGwgc3VwcG9ydGVkIHJhdGVzICovCisJCWxwLT5UeFJhdGVDb250cm9sW2luZGV4XSA9IFBBUk1fTUFYX1RYX1JBVEU7CisJfSBlbHNlIHsKKwkJcnJxLT52YWx1ZSA9IDA7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKworI2Vsc2UKKworCWlmKCBycnEtPnZhbHVlID4gMCAmJgorCQkJcnJxLT52YWx1ZSA8PSAxICogTUVHQUJJVCApIHsKKwkJbHAtPlR4UmF0ZUNvbnRyb2xbMF0gPSAxOworCX0KKwllbHNlIGlmKCBycnEtPnZhbHVlID4gMSAqIE1FR0FCSVQgJiYKKwkJCXJycS0+dmFsdWUgPD0gMiAqIE1FR0FCSVQgKSB7CisJCWlmKCBycnEtPmZpeGVkICkgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbMF0gPSAyOworCQl9IGVsc2UgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbMF0gPSA2OworCQl9CisJfQorCWVsc2UgaWYoIHJycS0+dmFsdWUgPiAyICogTUVHQUJJVCAmJgorCQkJcnJxLT52YWx1ZSA8PSA1ICogTUVHQUJJVCApIHsKKwkJaWYoIHJycS0+Zml4ZWQgKSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFswXSA9IDQ7CisJCX0gZWxzZSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFswXSA9IDc7CisJCX0KKwl9CisJZWxzZSBpZiggcnJxLT52YWx1ZSA+IDUgKiBNRUdBQklUICYmCisJCQlycnEtPnZhbHVlIDw9IDExICogTUVHQUJJVCApIHsKKwkJaWYoIHJycS0+Zml4ZWQpICB7CisJCQlscC0+VHhSYXRlQ29udHJvbFswXSA9IDU7CisJCX0gZWxzZSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFswXSA9IDM7CisJCX0KKwl9CisJZWxzZSBpZiggcnJxLT5maXhlZCA9PSAwICkgeworCQkvKiBJbiB0aGlzIGNhc2UsIHRoZSB1c2VyIGhhcyBub3Qgc3BlY2lmaWVkIGEgYml0cmF0ZSwgb25seSB0aGUgImF1dG8iCisJCSAgIG1vbmlrZXIuIFNvLCBzZXQgdGhlIHJhdGUgdG8gMTFNYiBhdXRvICovCisJCWxwLT5UeFJhdGVDb250cm9sWzBdID0gMzsKKwl9IGVsc2UgeworCQlycnEtPnZhbHVlID0gMDsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworI2VuZGlmICAvLyBXQVJQCisKKworCS8qIENvbW1pdCB0aGUgYWRhcHRlciBwYXJhbWV0ZXJzICovCisJd2xfYXBwbHkoIGxwICk7CisKK291dF91bmxvY2s6CisKKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworb3V0OgorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX3NldF9yYXRlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2lyZWxlc3NfZ2V0X3JhdGUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBHZXQgdGhlIGRlZmF1bHQgZGF0YSByYXRlIHNldHRpbmcgdXNlZCBieSB0aGUgd2lyZWxlc3MgZGV2aWNlLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3NfZ2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IGl3X3BhcmFtICpycnEsIGNoYXIgKmV4dHJhKQorCit7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50ICAgICByZXQgPSAwOworCWludCAgICAgc3RhdHVzID0gLTE7CisJaGNmXzE2ICB0eFJhdGU7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggIndpcmVsZXNzX2dldF9yYXRlIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisJLyogR2V0IHRoZSBjdXJyZW50IHRyYW5zbWl0IHJhdGUgZnJvbSB0aGUgYWRhcHRlciAqLworCWxwLT5sdHZSZWNvcmQubGVuID0gMSArICggc2l6ZW9mKHR4UmF0ZSkvc2l6ZW9mKGhjZl8xNikpOworCWxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0NVUl9UWF9SQVRFOworCisJc3RhdHVzID0gaGNmX2dldF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwlpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgeworI2lmZGVmIFdBUlAKKworCQl0eFJhdGUgPSBDTlZfTElUVExFX1RPX0lOVCggbHAtPmx0dlJlY29yZC51LnUxNlswXSApOworCisJCWlmKCB0eFJhdGUgJiAweDAwMDEgKSB7CisJCQl0eFJhdGUgPSAxOworCQl9CisJCWVsc2UgaWYoIHR4UmF0ZSAmIDB4MDAwMiApIHsKKwkJCXR4UmF0ZSA9IDI7CisJCX0KKwkJZWxzZSBpZiggdHhSYXRlICYgMHgwMDA0ICkgeworCQkJdHhSYXRlID0gNTsKKwkJfQorCQllbHNlIGlmKCB0eFJhdGUgJiAweDAwMDggKSB7CisJCQl0eFJhdGUgPSAxMTsKKwkJfQorCQllbHNlIGlmKCB0eFJhdGUgJiAweDAwMDEwICkgeworCQkJdHhSYXRlID0gNjsKKwkJfQorCQllbHNlIGlmKCB0eFJhdGUgJiAweDAwMDIwICkgeworCQkJdHhSYXRlID0gOTsKKwkJfQorCQllbHNlIGlmKCB0eFJhdGUgJiAweDAwMDQwICkgeworCQkJdHhSYXRlID0gMTI7CisJCX0KKwkJZWxzZSBpZiggdHhSYXRlICYgMHgwMDA4MCApIHsKKwkJCXR4UmF0ZSA9IDE4OworCQl9CisJCWVsc2UgaWYoIHR4UmF0ZSAmIDB4MDAxMDAgKSB7CisJCQl0eFJhdGUgPSAyNDsKKwkJfQorCQllbHNlIGlmKCB0eFJhdGUgJiAweDAwMjAwICkgeworCQkJdHhSYXRlID0gMzY7CisJCX0KKwkJZWxzZSBpZiggdHhSYXRlICYgMHgwMDQwMCApIHsKKwkJCXR4UmF0ZSA9IDQ4OworCQl9CisJCWVsc2UgaWYoIHR4UmF0ZSAmIDB4MDA4MDAgKSB7CisJCQl0eFJhdGUgPSA1NDsKKwkJfQorCisjZWxzZQorCisJCXR4UmF0ZSA9IChoY2ZfMTYpQ05WX0xJVFRMRV9UT19MT05HKCBscC0+bHR2UmVjb3JkLnUudTMyWzBdICk7CisKKyNlbmRpZiAgLy8gV0FSUAorCisJCXJycS0+dmFsdWUgPSB0eFJhdGUgKiBNRUdBQklUOworCX0gZWxzZSB7CisJCXJycS0+dmFsdWUgPSAwOworCQlyZXQgPSAtRUZBVUxUOworCX0KKworICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCitvdXQ6CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3NfZ2V0X3JhdGUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKyNpZiAwIC8vOz8gTm90IHVzZWQgYW55bW9yZQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdpcmVsZXNzX2dldF9wcml2YXRlX2ludGVyZmFjZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFJldHVybnMgdGhlIExpbnV4IFdpcmVsZXNzIEV4dGVuc2lvbnMnIGNvbXBhdGlibGUgcHJpdmF0ZSBpbnRlcmZhY2Ugb2YKKyAqICB0aGUgZHJpdmVyLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3aXJlbGVzc19nZXRfcHJpdmF0ZV9pbnRlcmZhY2UoIHN0cnVjdCBpd3JlcSAqd3JxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworCWludCByZXQgPSAwOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3aXJlbGVzc19nZXRfcHJpdmF0ZV9pbnRlcmZhY2UiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiggd3JxLT51LmRhdGEucG9pbnRlciAhPSBOVUxMICkgeworCQlzdHJ1Y3QgaXdfcHJpdl9hcmdzIHByaXZbXSA9CisJCXsKKwkJCXsgU0lPQ1NJV05FVE5BTUUsIElXX1BSSVZfVFlQRV9DSEFSIHwgSENGX01BWF9OQU1FX0xFTiwgMCwgInNuZXR3b3JrX25hbWUiIH0sCisJCQl7IFNJT0NHSVdORVROQU1FLCAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IEhDRl9NQVhfTkFNRV9MRU4sICJnbmV0d29ya19uYW1lIiB9LAorCQkJeyBTSU9DU0lXU1RBTkFNRSwgSVdfUFJJVl9UWVBFX0NIQVIgfCBIQ0ZfTUFYX05BTUVfTEVOLCAwLCAic3N0YXRpb25fbmFtZSIgfSwKKwkJCXsgU0lPQ0dJV1NUQU5BTUUsIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSENGX01BWF9OQU1FX0xFTiwgImdzdGF0aW9uX25hbWUiIH0sCisJCQl7IFNJT0NTSVdQT1JUVFlQRSwgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic3BvcnRfdHlwZSIgfSwKKwkJCXsgU0lPQ0dJV1BPUlRUWVBFLCAwLCBJV19QUklWX1RZUEVfQllURSB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJncG9ydF90eXBlIiB9LAorCQl9OworCisJCS8qIFZlcmlmeSB0aGUgdXNlciBidWZmZXIgKi8KKwkJcmV0ID0gdmVyaWZ5X2FyZWEoIFZFUklGWV9XUklURSwgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKCBwcml2ICkpOworCisJCWlmKCByZXQgIT0gMCApIHsKKwkJCURCR19MRUFWRSggRGJnSW5mbyApOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCS8qIENvcHkgdGhlIGRhdGEgaW50byB0aGUgdXNlcidzIGJ1ZmZlciAqLworCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBORUxFTSggcHJpdiApOworCQljb3B5X3RvX3VzZXIoIHdycS0+dS5kYXRhLnBvaW50ZXIsICZwcml2LCBzaXplb2YoIHByaXYgKSk7CisJfQorCitvdXQ6CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3NfZ2V0X3ByaXZhdGVfaW50ZXJmYWNlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2VuZGlmCisKKworCisjaWYgV0lSRUxFU1NfRVhUID4gMTMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdpcmVsZXNzX3NldF9zY2FuKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgSW5zdHJ1Y3RzIHRoZSBkcml2ZXIgdG8gaW5pdGlhdGUgYSBuZXR3b3JrIHNjYW4uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3aXJlbGVzc19zZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCAgICAgICAgICAgICAgICAgcmV0ID0gMDsKKwlpbnQgICAgICAgICAgICAgICAgIHN0YXR1cyA9IC0xOworCWludAkJICAgIHJldHJpZXMgPSAwOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCS8vOz8gTm90ZTogc2hvd3MgcmVzdWx0cyBhcyB0cmFjZSwgcmV0cnVucyBhbHdheXMgMCB1bmxlc3MgQlVTWQorCisJREJHX0ZVTkMoICJ3aXJlbGVzc19zZXRfc2NhbiIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworCS8qCisgICAgICAgICAqIFRoaXMgbG9va3MgbGlrZSBhIG5pY2UgcGxhY2UgdG8gdGVzdCBpZiB0aGUgSENGIGlzIHN0aWxsCisgICAgICAgICAqIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgY2FyZC4gSXQgc2VlbXMgdGhhdCBzb21ldGltZXMgQkFQXzEKKyAgICAgICAgICogZ2V0cyBjb3JydXB0ZWQuIEJ5IGxvb2tpbmcgYXQgdGhlIGNvbW1lbnRzIGluIEhDRiB0aGUKKyAgICAgICAgICogY2F1c2UgaXMgc3RpbGwgYSBtaXN0ZXJ5LiBPa2F5LCB0aGUgY29tbXVuaWNhdGlvbiB0byB0aGUKKyAgICAgICAgICogY2FyZCBpcyBkZWFkLCByZXNldCB0aGUgY2FyZCB0byByZXZpdmUuCisgICAgICAgICAqLworCWlmKChscC0+aGNmQ3R4LklGQl9DYXJkU3RhdCAmIENBUkRfU1RBVF9ERUZVTkNUKSAhPSAwKQorCXsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0FSRCBpcyBpbiBERUZVTkNUIG1vZGUsIHJlc2V0IGl0IHRvIGJyaW5nIGl0IGJhY2sgdG8gbGlmZVxuIiApOworCQl3bF9yZXNldCggZGV2ICk7CisJfQorCityZXRyeToKKwkvKiBTZXQgdGhlIGNvbXBsZXRpb24gc3RhdGUgdG8gRkFMU0UgKi8KKwlscC0+cHJvYmVfcmVzdWx0cy5zY2FuX2NvbXBsZXRlID0gRkFMU0U7CisKKworCS8qIENoYW5uZWxzIHRvIHNjYW4gKi8KKyNpZmRlZiBXQVJQCisJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSA1OworCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1NDQU5fQ0hBTk5FTDsKKwlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCAweDNGRkYgKTsgIC8vIDIuNCBHSHogQmFuZAorCWxwLT5sdHZSZWNvcmQudS51MTZbMV0gID0gQ05WX0lOVF9UT19MSVRUTEUoIDB4RkZGRiApOyAgLy8gNS4wIEdIeiBCYW5kCisJbHAtPmx0dlJlY29yZC51LnUxNlsyXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggMHhGRkZGICk7ICAvLyAgICAgIC4uCisJbHAtPmx0dlJlY29yZC51LnUxNlszXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggMHgwMDA3ICk7ICAvLyAgICAgIC4uCisjZWxzZQorCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19TQ0FOX0NIQU5ORUw7CisJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggMHg3RkZGICk7CisjZW5kaWYgIC8vIFdBUlAKKworCXN0YXR1cyA9IGhjZl9wdXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX1NDQU5fQ0hBTk5FTCByZXN1bHQgICAgICA6IDB4JXhcbiIsIHN0YXR1cyApOworCisJLy8gSG9sZGluZyB0aGUgbG9jayB0b28gbG9uZywgbWFrZSBhIGdhcCB0byBhbGxvdyBvdGhlciBwcm9jZXNzZXMKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisJd2xfbG9jayggbHAsICZmbGFncyApOworCisJaWYoIHN0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApIHsKKwkJLy9SZWNvdmVyeQorCQlyZXRyaWVzKys7CisJCWlmKHJldHJpZXMgPD0gMTApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIlJlc2V0IGNhcmQgdG8gcmVjb3ZlciwgYXR0ZW1wdDogJWRcbiIsIHJldHJpZXMgKTsKKwkJCXdsX3Jlc2V0KCBkZXYgKTsKKworCQkJLy8gSG9sZGluZyB0aGUgbG9jayB0b28gbG9uZywgbWFrZSBhIGdhcCB0byBhbGxvdyBvdGhlciBwcm9jZXNzZXMKKwkJCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKwkJCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworCQkJZ290byByZXRyeTsKKwkJfQorCX0KKworCS8qIFNldCB0aGUgU0NBTl9TU0lEIHRvICJBTlkiLiBVc2luZyB0aGlzIFJJRCBmb3Igc2NhbiBwcmV2ZW50cyB0aGUgbmVlZCB0bworCSAgIGRpc2Fzc29jaWF0ZSBmcm9tIHRoZSBuZXR3b3JrIHdlIGFyZSBjdXJyZW50bHkgb24gKi8KKwlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDE4OworCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1NDQU5fU1NJRDsKKwlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCAwICk7CisJbHAtPmx0dlJlY29yZC51LnUxNlsxXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggMCApOworCisJc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkvLyBIb2xkaW5nIHRoZSBsb2NrIHRvbyBsb25nLCBtYWtlIGEgZ2FwIHRvIGFsbG93IG90aGVyIHByb2Nlc3NlcworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKwlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfU0NBTl9TU0lEIHRvICdhbnknIHN0YXR1czogMHgleFxuIiwgc3RhdHVzICk7CisKKwkvKiBJbml0aWF0ZSB0aGUgc2NhbiAqLworCS8qIE5PVEU6IFVzaW5nIEhDRl9BQ1RfU0NBTiBoYXMgYmVlbiByZW1vdmVkLCBhcyB1c2luZyBIQ0ZfQUNUX0FDU19TQ0FOIHRvCisJICAgcmV0cmlldmUgcHJvYmUgcmVzcG9uc2VzIG11c3QgYWx3YXlzIGJlIHVzZWQgdG8gc3VwcG9ydCBXUEEgKi8KKwlzdGF0dXMgPSBoY2ZfYWN0aW9uKCAmKCBscC0+aGNmQ3R4ICksIEhDRl9BQ1RfQUNTX1NDQU4gKTsKKworCWlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIlNVQ0NFU1NGVUxMWSBJTklUSUFURUQgU0NBTi4uLlxuIiApOworCX0gZWxzZSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIklOSVRJQVRFIFNDQU4gRkFJTEVELi4uXG4iICk7CisJfQorCisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKK291dDoKKwlEQkdfTEVBVkUoRGJnSW5mbyk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3Nfc2V0X3NjYW4KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3aXJlbGVzc19nZXRfc2NhbigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEluc3RydWN0cyB0aGUgZHJpdmVyIHRvIGdhdGhlciBhbmQgcmV0dXJuIHRoZSByZXN1bHRzIG9mIGEgbmV0d29yayBzY2FuLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3NfZ2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgICAgICAgICAgICAgICAgIHJldCA9IDA7CisJaW50ICAgICAgICAgICAgICAgICBjb3VudDsKKwljaGFyICAgICAgICAgICAgICAgICpidWY7CisJY2hhciAgICAgICAgICAgICAgICAqYnVmX2VuZDsKKwlzdHJ1Y3QgaXdfZXZlbnQgICAgIGl3ZTsKKwlQUk9CRV9SRVNQICAgICAgICAgICpwcm9iZV9yZXNwOworCWhjZl84ICAgICAgICAgICAgICAgbXNnWzUxMl07CisJaGNmXzggICAgICAgICAgICAgICAqd3BhX2llOworCWhjZl8xNiAgICAgICAgICAgICAgd3BhX2llX2xlbjsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid2lyZWxlc3NfZ2V0X3NjYW4iICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKwkvKiBJZiB0aGUgc2NhbiBpcyBub3QgZG9uZSwgdGVsbCB0aGUgY2FsbGluZyBwcm9jZXNzIHRvIHRyeSBhZ2FpbiBsYXRlciAqLworCWlmKCAhbHAtPnByb2JlX3Jlc3VsdHMuc2Nhbl9jb21wbGV0ZSApIHsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCURCR19UUkFDRSggRGJnSW5mbywgIlNDQU4gQ09NUExFVEUsIE51bSBvZiBBUHM6ICVkXG4iLAorCQkJICAgbHAtPnByb2JlX3Jlc3VsdHMubnVtX2FwcyApOworCisJYnVmICAgICA9IGV4dHJhOworCWJ1Zl9lbmQgPSBleHRyYSArIElXX1NDQU5fTUFYX0RBVEE7CisKKwlmb3IoIGNvdW50ID0gMDsgY291bnQgPCBscC0+cHJvYmVfcmVzdWx0cy5udW1fYXBzOyBjb3VudCsrICkgeworCQkvKiBSZWZlcmVuY2UgdGhlIHByb2JlIHJlc3BvbnNlIGZyb20gdGhlIHRhYmxlICovCisJCXByb2JlX3Jlc3AgPSAoUFJPQkVfUkVTUCAqKSZscC0+cHJvYmVfcmVzdWx0cy5Qcm9iZVRhYmxlW2NvdW50XTsKKworCisJCS8qIEZpcnN0IGVudHJ5IE1VU1QgYmUgdGhlIE1BQyBhZGRyZXNzICovCisJCW1lbXNldCggJml3ZSwgMCwgc2l6ZW9mKCBpd2UgKSk7CisKKwkJaXdlLmNtZCAgICAgICAgICAgICAgICAgPSBTSU9DR0lXQVA7CisJCWl3ZS51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQltZW1jcHkoIGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgcHJvYmVfcmVzcC0+QlNTSUQsIEVUSF9BTEVOKTsKKwkJaXdlLmxlbiAgICAgICAgICAgICAgICAgPSBJV19FVl9BRERSX0xFTjsKKworCQlidWYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBidWYsIGJ1Zl9lbmQsICZpd2UsIElXX0VWX0FERFJfTEVOKTsKKworCisJCS8qIFVzZSB0aGUgbW9kZSB0byBpbmRpY2F0ZSBpZiBpdCdzIGEgc3RhdGlvbiBvciBBUCAqLworCQkvKiBXb24ndCBhbHdheXMgYmUgYW4gQVAgaWYgaW4gSUJTUyBtb2RlICovCisJCW1lbXNldCggJml3ZSwgMCwgc2l6ZW9mKCBpd2UgKSk7CisKKwkJaXdlLmNtZCA9IFNJT0NHSVdNT0RFOworCisJCWlmKCBwcm9iZV9yZXNwLT5jYXBhYmlsaXR5ICYgQ0FQQUJJTElUWV9JQlNTICkgeworCQkJaXdlLnUubW9kZSA9IElXX01PREVfSU5GUkE7CisJCX0gZWxzZSB7CisJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9NQVNURVI7CisJCX0KKworCQlpd2UubGVuID0gSVdfRVZfVUlOVF9MRU47CisKKwkJYnVmID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgYnVmLCBidWZfZW5kLCAmaXdlLCBJV19FVl9VSU5UX0xFTik7CisKKworCQkvKiBBbnkgcXVhbGl0eSBpbmZvcm1hdGlvbiAqLworCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCisJCWl3ZS5jbWQgICAgICAgICAgICAgPSBJV0VWUVVBTDsKKwkJaXdlLnUucXVhbC5sZXZlbCAgICA9IGRibShwcm9iZV9yZXNwLT5zaWduYWwpOworCQlpd2UudS5xdWFsLm5vaXNlICAgID0gZGJtKHByb2JlX3Jlc3AtPnNpbGVuY2UpOworCQlpd2UudS5xdWFsLnF1YWwgICAgID0gaXdlLnUucXVhbC5sZXZlbCAtIGl3ZS51LnF1YWwubm9pc2U7CisJCWl3ZS51LnF1YWwudXBkYXRlZCAgPSBscC0+cHJvYmVfcmVzdWx0cy5zY2FuX2NvbXBsZXRlIHwgSVdfUVVBTF9EQk07CisJCWl3ZS5sZW4gICAgICAgICAgICAgPSBJV19FVl9RVUFMX0xFTjsKKworCQlidWYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBidWYsIGJ1Zl9lbmQsICZpd2UsIElXX0VWX1FVQUxfTEVOKTsKKworCisJCS8qIEVTU0lEIGluZm9ybWF0aW9uICovCisJCWlmKCBwcm9iZV9yZXNwLT5yYXdEYXRhWzFdID4gMCApIHsKKwkJCW1lbXNldCggJml3ZSwgMCwgc2l6ZW9mKCBpd2UgKSk7CisKKwkJCWl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7CisJCQlpd2UudS5kYXRhLmxlbmd0aCA9IHByb2JlX3Jlc3AtPnJhd0RhdGFbMV07CisJCQlpd2UudS5kYXRhLmZsYWdzID0gMTsKKworCQkJYnVmID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgYnVmLCBidWZfZW5kLCAmaXdlLCAmcHJvYmVfcmVzcC0+cmF3RGF0YVsyXSk7CisJCX0KKworCisJCS8qIEVuY3J5cHRpb24gSW5mb3JtYXRpb24gKi8KKwkJbWVtc2V0KCAmaXdlLCAwLCBzaXplb2YoIGl3ZSApKTsKKworCQlpd2UuY21kICAgICAgICAgICAgID0gU0lPQ0dJV0VOQ09ERTsKKwkJaXdlLnUuZGF0YS5sZW5ndGggICA9IDA7CisKKwkJLyogQ2hlY2sgdGhlIGNhcGFiaWxpdGllcyBmaWVsZCBvZiB0aGUgUHJvYmUgUmVzcG9uc2UgdG8gc2VlIGlmCisJCSAgICdwcml2YWN5JyBpcyBzdXBwb3J0ZWQgb24gdGhlIEFQIGluIHF1ZXN0aW9uICovCisJCWlmKCBwcm9iZV9yZXNwLT5jYXBhYmlsaXR5ICYgQ0FQQUJJTElUWV9QUklWQUNZICkgeworCQkJaXdlLnUuZGF0YS5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsKKwkJfSBlbHNlIHsKKwkJCWl3ZS51LmRhdGEuZmxhZ3MgfD0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQl9CisKKwkJYnVmID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgYnVmLCBidWZfZW5kLCAmaXdlLCBOVUxMKTsKKworCisJCS8qIEZyZXF1ZW5jeSBJbmZvICovCisJCW1lbXNldCggJml3ZSwgMCwgc2l6ZW9mKCBpd2UgKSk7CisKKwkJaXdlLmNtZCA9IFNJT0NHSVdGUkVROworCQlpd2UubGVuID0gSVdfRVZfRlJFUV9MRU47CisJCWl3ZS51LmZyZXEubSA9IHdsX3BhcnNlX2RzX2llKCBwcm9iZV9yZXNwICk7CisJCWl3ZS51LmZyZXEuZSA9IDA7CisKKwkJYnVmID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgYnVmLCBidWZfZW5kLCAmaXdlLCBJV19FVl9GUkVRX0xFTik7CisKKworI2lmIFdJUkVMRVNTX0VYVCA+IDE0CisJCS8qIEN1c3RvbSBpbmZvIChCZWFjb24gSW50ZXJ2YWwpICovCisJCW1lbXNldCggJml3ZSwgMCwgc2l6ZW9mKCBpd2UgKSk7CisJCW1lbXNldCggbXNnLCAwLCBzaXplb2YoIG1zZyApKTsKKworCQlpd2UuY21kID0gSVdFVkNVU1RPTTsKKwkJc3ByaW50ZiggbXNnLCAiYmVhY29uX2ludGVydmFsPSVkIiwgcHJvYmVfcmVzcC0+YmVhY29uSW50ZXJ2YWwgKTsKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oIG1zZyApOworCisJCWJ1ZiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGJ1ZiwgYnVmX2VuZCwgJml3ZSwgbXNnKTsKKworCisJCS8qIEN1c3RvbSBpbmZvIChXUEEtSUUpICovCisJCXdwYV9pZSA9IE5VTEw7CisJCXdwYV9pZV9sZW4gPSAwOworCisJCXdwYV9pZSA9IHdsX3BhcnNlX3dwYV9pZSggcHJvYmVfcmVzcCwgJndwYV9pZV9sZW4gKTsKKwkJaWYoIHdwYV9pZSAhPSBOVUxMICkgeworCQkJbWVtc2V0KCAmaXdlLCAwLCBzaXplb2YoIGl3ZSApKTsKKwkJCW1lbXNldCggbXNnLCAwLCBzaXplb2YoIG1zZyApKTsKKworCQkJaXdlLmNtZCA9IElXRVZDVVNUT007CisJCQlzcHJpbnRmKCBtc2csICJ3cGFfaWU9JXMiLCB3bF9wcmludF93cGFfaWUoIHdwYV9pZSwgd3BhX2llX2xlbiApKTsKKwkJCWl3ZS51LmRhdGEubGVuZ3RoID0gc3RybGVuKCBtc2cgKTsKKworCQkJYnVmID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgYnVmLCBidWZfZW5kLCAmaXdlLCBtc2cpOworCQl9CisKKwkJLyogQWRkIG90aGVyIGN1c3RvbSBpbmZvIGluIGZvcm1hdHRlZCBzdHJpbmcgZm9ybWF0IGFzIG5lZWRlZC4uLiAqLworI2VuZGlmCisJfQorCisJZGF0YS0+bGVuZ3RoID0gYnVmIC0gZXh0cmE7CisKK291dF91bmxvY2s6CisKKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworb3V0OgorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX2dldF9zY2FuCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZW5kaWYgIC8vIFdJUkVMRVNTX0VYVCA+IDEzCisKKworI2lmIFdJUkVMRVNTX0VYVCA+IDE3CisKK3N0YXRpYyBpbnQgd2lyZWxlc3Nfc2V0X2F1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BhcmFtICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQJCQkgICAgICByZXQ7CisJaW50CQkJICAgICAgaXdhX2lkeCA9IGRhdGEtPmZsYWdzICYgSVdfQVVUSF9JTkRFWDsKKwlpbnQJCQkgICAgICBpd2FfdmFsID0gZGF0YS0+dmFsdWU7CisKKwlEQkdfRlVOQyggIndpcmVsZXNzX3NldF9hdXRoIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisJc3dpdGNoIChpd2FfaWR4KSB7CisJCWNhc2UgSVdfQVVUSF9XUEFfVkVSU0lPTjoKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIklXX0FVVEhfV1BBX1ZFUlNJT05cbiIpOworCQkJLyogV2UgZG8gc3VwcG9ydCBXUEEgb25seTsgaG93IHNob3VsZCBESVNBQkxFRCBiZSB0cmVhdGVkPyAqLworCQkJaWYgKGl3YV92YWwgPT0gSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEEpCisJCQkJcmV0ID0gMDsKKwkJCWVsc2UKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisKKwkJY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgorCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiSVdfQVVUSF9XUEFfRU5BQkxFRDogdmFsID0gJWRcbiIsIGl3YV92YWwpOworCQkJaWYgKGl3YV92YWwpCisJCQkJbHAtPkVuYWJsZUVuY3J5cHRpb24gPSAyOworCQkJZWxzZQorCQkJCWxwLT5FbmFibGVFbmNyeXB0aW9uID0gMDsKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKworCQljYXNlIElXX0FVVEhfVEtJUF9DT1VOVEVSTUVBU1VSRVM6CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJV19BVVRIX1RLSVBfQ09VTlRFUk1FQVNVUkVTXG4iKTsKKwkJCWxwLT5kcml2ZXJFbmFibGUgPSAhaXdhX3ZhbDsKKwkJCWlmKGxwLT5kcml2ZXJFbmFibGUpCisJCQkJaGNmX2NudGwoJihscC0+aGNmQ3R4KSwgSENGX0NOVExfRU5BQkxFIHwgSENGX1BPUlRfMCk7CisJCQllbHNlCisJCQkJaGNmX2NudGwoJihscC0+aGNmQ3R4KSwgSENGX0NOVExfRElTQUJMRSB8IEhDRl9QT1JUXzApOworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgorCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEXG4iKTsKKwkJCS8qIFdlIGRvIG5vdCBhY3R1YWxseSBkbyBhbnl0aGluZyBoZXJlLCBqdXN0IHRvIHNpbGVuY2UKKwkJCSAqIHdwYV9zdXBwbGljYW50ICovCisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBJV19BVVRIX0NJUEhFUl9QQUlSV0lTRToKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIklXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFXG4iKTsKKwkJCS8qIG5vdCBpbXBsZW1lbnRlZCwgcmV0dXJuIGFuIGVycm9yICovCisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisKKwkJY2FzZSBJV19BVVRIX0NJUEhFUl9HUk9VUDoKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIklXX0FVVEhfQ0lQSEVSX0dST1VQXG4iKTsKKwkJCS8qIG5vdCBpbXBsZW1lbnRlZCwgcmV0dXJuIGFuIGVycm9yICovCisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisKKwkJY2FzZSBJV19BVVRIX0tFWV9NR01UOgorCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiSVdfQVVUSF9LRVlfTUdNVFxuIik7CisJCQkvKiBub3QgaW1wbGVtZW50ZWQsIHJldHVybiBhbiBlcnJvciAqLworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCisJCWNhc2UgSVdfQVVUSF84MDIxMV9BVVRIX0FMRzoKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIklXX0FVVEhfODAyMTFfQVVUSF9BTEdcbiIpOworCQkJLyogbm90IGltcGxlbWVudGVkLCByZXR1cm4gYW4gZXJyb3IgKi8KKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKworCQljYXNlIElXX0FVVEhfUlhfVU5FTkNSWVBURURfRUFQT0w6CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJV19BVVRIX1JYX1VORU5DUllQVEVEX0VBUE9MXG4iKTsKKwkJCS8qIG5vdCBpbXBsZW1lbnRlZCwgcmV0dXJuIGFuIGVycm9yICovCisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisKKwkJY2FzZSBJV19BVVRIX1JPQU1JTkdfQ09OVFJPTDoKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIklXX0FVVEhfUk9BTUlOR19DT05UUk9MXG4iKTsKKwkJCS8qIG5vdCBpbXBsZW1lbnRlZCwgcmV0dXJuIGFuIGVycm9yICovCisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisKKwkJY2FzZSBJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRDoKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIklXX0FVVEhfUFJJVkFDWV9JTlZPS0VEXG4iKTsKKwkJCS8qIG5vdCBpbXBsZW1lbnRlZCwgcmV0dXJuIGFuIGVycm9yICovCisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIklXX0FVVEhfPz8gKCVkKSB1bmtub3duXG4iLCBpd2FfaWR4KTsKKwkJCS8qIHJldHVybiBhbiBlcnJvciAqLworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCX0KKworICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCitvdXQ6CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3Nfc2V0X2F1dGgKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCitzdGF0aWMgaW50IGhlcm1lc19zZXRfa2V5KGx0dl90ICpsdHYsIGludCBhbGcsIGludCBrZXlfaWR4LCB1OCAqYWRkciwKKwkJCSAgaW50IHNldF90eCwgdTggKnNlcSwgdTggKmtleSwgc2l6ZV90IGtleV9sZW4pCit7CisJaW50IHJldCA9IC1FSU5WQUw7CisJLy8gaW50ICAgY291bnQgPSAwOworCWludCAgIGJ1Zl9pZHggPSAwOworCWhjZl84IHRzY1tJV19FTkNPREVfU0VRX01BWF9TSVpFXSA9CisJCXsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCisJREJHX0ZVTkMoICJoZXJtZXNfc2V0X2tleSIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCS8qCisgICAgICAgICAqIENoZWNrIHRoZSBrZXkgaW5kZXggaGVyZTsgaWYgMCwgbG9hZCBhcyBQYWlyd2lzZSBLZXksIG90aGVyd2lzZSwKKyAgICAgICAgICogbG9hZCBhcyBhIGdyb3VwIGtleS4gTm90ZSB0aGF0IGZvciB0aGUgSGVybWVzLCB0aGUgUklEcyBmb3IKKyAgICAgICAgICogZ3JvdXAvcGFyaXdpc2Uga2V5cyBhcmUgZGlmZmVyZW50IGZyb20gZWFjaCBvdGhlciBhbmQgZGlmZmVyZW50CisgICAgICAgICAqIHRoYW4gdGhlIGRlZmF1bHQgV0VQIGtleXMgYXMgd2VsbC4KKyAgICAgICAgICovCisJc3dpdGNoIChhbGcpCisJeworCWNhc2UgSVdfRU5DT0RFX0FMR19US0lQOgorCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJV19FTkNPREVfQUxHX1RLSVA6IGtleSglZClcbiIsIGtleV9pZHgpOworI2lmIDAKKwkJLyoKKyAgICAgICAgICAgICAgICAgKiBNYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBubyBkYXRhIHF1ZXVlZCB1cCBpbiB0aGUgZmlybXdhcmUKKyAgICAgICAgICAgICAgICAgKiBiZWZvcmUgc2V0dGluZyB0aGUgVEtJUCBrZXlzLiBJZiB0aGlzIGNoZWNrIGlzIG5vdAorICAgICAgICAgICAgICAgICAqIHBlcmZvcm1lZCwgc29tZSBkYXRhIG1heSBiZSBzZW50IG91dCB3aXRoIGluY29ycmVjdCBNSUMKKyAgICAgICAgICAgICAgICAgKiBhbmQgY2F1c2Ugc3luY2hyb25pemFyaW9uIGVycm9ycyB3aXRoIHRoZSBBUAorICAgICAgICAgICAgICAgICAqLworCQkvKiBDaGVjayBldmVyeSAxbXMgZm9yIDEwMG1zICovCisJCWZvciggY291bnQgPSAwOyBjb3VudCA8IDEwMDsgY291bnQrKyApCisJCXsKKwkJCXVzbGVlcCggMTAwMCApOworCisJCQlsdHYubGVuID0gMjsKKwkJCWx0di50eXAgPSAweEZEOTE7ICAvLyBUaGlzIFJJRCBub3QgZGVmaW5lZCBpbiBIQ0YgeWV0ISEhCisJCQlsdHYudS51MTZbMF0gPSAwOworCisJCQl3bF9nZXRfaW5mbyggc29jaywgJmx0diwgaWZuYW1lICk7CisKKwkJCWlmKCBsdHYudS51MTZbMF0gPT0gMCApCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiggY291bnQgPT0gMTAwICkKKwkJeworCQkJd3BhX3ByaW50ZiggTVNHX0RFQlVHLCAiVGltZWQgb3V0IHdhaXRpbmcgZm9yIFR4USEiICk7CisJCX0KKyNlbmRpZgorCisJCXN3aXRjaCAoa2V5X2lkeCkgeworCQljYXNlIDA6CisJCQlsdHYtPmxlbiA9IDI4OworCQkJbHR2LT50eXAgPSBDRkdfQUREX1RLSVBfTUFQUEVEX0tFWTsKKworCQkJLyogTG9hZCB0aGUgQlNTSUQgKi8KKwkJCW1lbWNweSgmbHR2LT51LnU4W2J1Zl9pZHhdLCBhZGRyLCBFVEhfQUxFTik7CisJCQlidWZfaWR4ICs9IEVUSF9BTEVOOworCisJCQkvKiBMb2FkIHRoZSBUS0lQIGtleSAqLworCQkJbWVtY3B5KCZsdHYtPnUudThbYnVmX2lkeF0sICZrZXlbMF0sIDE2KTsKKwkJCWJ1Zl9pZHggKz0gMTY7CisKKwkJCS8qIExvYWQgdGhlIFRTQyAqLworCQkJbWVtY3B5KCZsdHYtPnUudThbYnVmX2lkeF0sIHRzYywgSVdfRU5DT0RFX1NFUV9NQVhfU0laRSk7CisJCQlidWZfaWR4ICs9IElXX0VOQ09ERV9TRVFfTUFYX1NJWkU7CisKKwkJCS8qIExvYWQgdGhlIFJTQyAqLworCQkJbWVtY3B5KCZsdHYtPnUudThbYnVmX2lkeF0sIHNlcSwgSVdfRU5DT0RFX1NFUV9NQVhfU0laRSk7CisJCQlidWZfaWR4ICs9IElXX0VOQ09ERV9TRVFfTUFYX1NJWkU7CisKKwkJCS8qIExvYWQgdGhlIFR4TUlDIGtleSAqLworCQkJbWVtY3B5KCZsdHYtPnUudThbYnVmX2lkeF0sICZrZXlbMTZdLCA4KTsKKwkJCWJ1Zl9pZHggKz0gODsKKworCQkJLyogTG9hZCB0aGUgUnhNSUMga2V5ICovCisJCQltZW1jcHkoJmx0di0+dS51OFtidWZfaWR4XSwgJmtleVsyNF0sIDgpOworCisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJY2FzZSAyOgorCQljYXNlIDM6CisJCQlsdHYtPmxlbiA9IDI2OworCQkJbHR2LT50eXAgPSBDRkdfQUREX1RLSVBfREVGQVVMVF9LRVk7CisKKwkJCS8qIExvYWQgdGhlIGtleSBJbmRleCAqLworCQkJbHR2LT51LnUxNltidWZfaWR4XSA9IGtleV9pZHg7CisJCQkvKiBJZiB0aGlzIGlzIGEgVHggS2V5LCBzZXQgYml0IDgwMDAgKi8KKwkJCWlmKHNldF90eCkKKwkJCQlsdHYtPnUudTE2W2J1Zl9pZHhdIHw9IDB4ODAwMDsKKwkJCWJ1Zl9pZHggKz0gMjsKKworCQkJLyogTG9hZCB0aGUgUlNDICovCisJCQltZW1jcHkoJmx0di0+dS51OFtidWZfaWR4XSwgc2VxLCBJV19FTkNPREVfU0VRX01BWF9TSVpFKTsKKwkJCWJ1Zl9pZHggKz0gSVdfRU5DT0RFX1NFUV9NQVhfU0laRTsKKworCQkJLyogTG9hZCB0aGUgVEtJUCwgVHhNSUMsIGFuZCBSeE1JQyBrZXlzIGluIG9uZSBzaG90LCBiZWNhdXNlIGluCisJCQkgICBDRkdfQUREX1RLSVBfREVGQVVMVF9LRVkgdGhleSBhcmUgYmFjay10by1iYWNrICovCisJCQltZW1jcHkoJmx0di0+dS51OFtidWZfaWR4XSwga2V5LCBrZXlfbGVuKTsKKwkJCWJ1Zl9pZHggKz0ga2V5X2xlbjsKKworCQkJLyogTG9hZCB0aGUgVFNDICovCisJCQltZW1jcHkoJmx0di0+dS51OFtidWZfaWR4XSwgdHNjLCBJV19FTkNPREVfU0VRX01BWF9TSVpFKTsKKworCQkJbHR2LT51LnUxNlswXSA9IENOVl9JTlRfVE9fTElUVExFKGx0di0+dS51MTZbMF0pOworCisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBJV19FTkNPREVfQUxHX1dFUDoKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiSVdfRU5DT0RFX0FMR19XRVA6IGtleSglZClcbiIsIGtleV9pZHgpOworCQlicmVhazsKKworCWNhc2UgSVdfRU5DT0RFX0FMR19DQ01QOgorCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJV19FTkNPREVfQUxHX0NDTVA6IGtleSglZClcbiIsIGtleV9pZHgpOworCQlicmVhazsKKworCWNhc2UgSVdfRU5DT0RFX0FMR19OT05FOgorCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJV19FTkNPREVfQUxHX05PTkU6IGtleSglZClcbiIsIGtleV9pZHgpOworCQlzd2l0Y2ggKGtleV9pZHgpIHsKKwkJY2FzZSAwOgorCQkJaWYgKG1lbWNtcChhZGRyLCAiXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIiwgRVRIX0FMRU4pICE9IDApIHsKKwkJCS8vaWYgKGFkZHIgIT0gTlVMTCkgeworCQkJCWx0di0+bGVuID0gNzsKKwkJCQlsdHYtPnR5cCA9IENGR19SRU1PVkVfVEtJUF9NQVBQRURfS0VZOworCQkJCW1lbWNweSgmbHR2LT51LnU4WzBdLCBhZGRyLCBFVEhfQUxFTik7CisJCQkJcmV0ID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDE6CisJCWNhc2UgMjoKKwkJY2FzZSAzOgorCQkJLyogQ2xlYXIgdGhlIEdyb3VwIFRLSVAga2V5cyBieSBpbmRleCAqLworCQkJbHR2LT5sZW4gPSAyOworCQkJbHR2LT50eXAgPSBDRkdfUkVNT1ZFX1RLSVBfREVGQVVMVF9LRVk7CisJCQlsdHYtPnUudTE2WzBdID0ga2V5X2lkeDsKKworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiSVdfRU5DT0RFXz8/OiBrZXkoJWQpXG4iLCBrZXlfaWR4KTsKKwkJYnJlYWs7CisJfQorCisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30gLy8gaGVybWVzX3NldF9rZXkKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCitzdGF0aWMgaW50IHdpcmVsZXNzX3NldF9lbmNvZGVleHQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJCXN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICprZXlidWYpCit7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50CQkJICAgICAgcmV0OworCWludCBrZXlfaWR4ID0gKGVycS0+ZmxhZ3MmSVdfRU5DT0RFX0lOREVYKSAtIDE7CisJbHR2X3QgbHR2OworCXN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQgPSAoc3RydWN0IGl3X2VuY29kZV9leHQgKilrZXlidWY7CisKKwlEQkdfRlVOQyggIndpcmVsZXNzX3NldF9lbmNvZGVleHQiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoc2l6ZW9mKGV4dC0+cnhfc2VxKSAhPSA4KSB7CisJCURCR19UUkFDRShEYmdJbmZvLCAicnpfc2VxIHNpemUgbWlzbWF0Y2hcbiIpOworCQlEQkdfTEVBVkUoRGJnSW5mbyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEhhbmRsZSBXRVAga2V5cyB2aWEgdGhlIG9sZCBzZXQgZW5jb2RlIHByb2NlZHVyZSAqLworCWlmKGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfV0VQKSB7CisJCXN0cnVjdCBpd19wb2ludCAgd2VwX2VycTsKKwkJY2hhciAgICAgICAgICAgICp3ZXBfa2V5YnVmOworCisJCS8qIEJ1aWxkIHJlcXVlc3Qgc3RydWN0dXJlICovCisJCXdlcF9lcnEuZmxhZ3MgID0gZXJxLT5mbGFnczsgICAvLyB0YWtlIG92ZXIgZmxhZ3Mgd2l0aCBrZXkgaW5kZXgKKwkJd2VwX2VycS5sZW5ndGggPSBleHQtPmtleV9sZW47IC8vIHRha2UgbGVuZ3RoIGZyb20gZXh0ZW5kZWQga2V5IGluZm8KKwkJd2VwX2tleWJ1ZiAgICAgPSBleHQtPmtleTsgICAgIC8vIHBvaW50ZXIgdG8gdGhlIGtleSB0ZXh0CisKKwkJLyogQ2FsbCB3aXJlbGVzc19zZXRfZW5jb2RlIHRvdCBoYW5kbGUgdGhlIFdFUCBrZXkgKi8KKwkJcmV0ID0gd2lyZWxlc3Nfc2V0X2VuY29kZShkZXYsIGluZm8sICZ3ZXBfZXJxLCB3ZXBfa2V5YnVmKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogUHJvY2VlZCBmb3IgZXh0ZW5kZWQgZW5jb2RlIGZ1bmN0aW9ucyBmb3IgV0FQIGFuZCBOT05FICovCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisJbWVtc2V0KCZsdHYsIDAsIHNpemVvZihsdHYpKTsKKwlyZXQgPSBoZXJtZXNfc2V0X2tleSgmbHR2LCBleHQtPmFsZywga2V5X2lkeCwgZXh0LT5hZGRyLnNhX2RhdGEsCisJCQkJZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVksCisJCQkJZXh0LT5yeF9zZXEsIGV4dC0+a2V5LCBleHQtPmtleV9sZW4pOworCisJaWYgKHJldCAhPSAwKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgImhlcm1lc19zZXRfa2V5IHJldHVybmVkICE9IDAsIGtleSBub3Qgc2V0XG4iKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCS8qIFB1dCB0aGUga2V5IGluIEhDRiAqLworCXJldCA9IGhjZl9wdXRfaW5mbygmKGxwLT5oY2ZDdHgpLCAoTFRWUCkmbHR2KTsKKworb3V0X3VubG9jazoKKwlpZihyZXQgPT0gSENGX1NVQ0NFU1MpIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiUHV0IGtleSBpbmZvIHN1Y2Nlc1xuIik7CisJfSBlbHNlIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiUHV0IGtleSBpbmZvIGZhaWxlZCwga2V5IG5vdCBzZXRcbiIpOworCX0KKworICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCitvdXQ6CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3Nfc2V0X2VuY29kZWV4dAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKK3N0YXRpYyBpbnQgd2lyZWxlc3NfZ2V0X2dlbmllKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJCSAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCisKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgICByZXQgPSAwOworCWx0dl90IGx0djsKKworCURCR19GVU5DKCAid2lyZWxlc3NfZ2V0X2dlbmllIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisJbWVtc2V0KCZsdHYsIDAsIHNpemVvZihsdHYpKTsKKwlsdHYubGVuID0gMjsKKwlsdHYudHlwID0gQ0ZHX1NFVF9XUEFfQVVUSF9LRVlfTUdNVF9TVUlURTsKKwlscC0+QXV0aEtleU1nbXRTdWl0ZSA9IGx0di51LnUxNlswXSA9IDQ7CisJbHR2LnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKGx0di51LnUxNlswXSk7CisKKwlyZXQgPSBoY2ZfcHV0X2luZm8oJihscC0+aGNmQ3R4KSwgKExUVlApJmx0dik7CisKKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworb3V0OgorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKyNlbmRpZiAvLyBXSVJFTEVTU19FWFQgPiAxNworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfd2lyZWxlc3Nfc3RhdHMoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBSZXR1cm4gdGhlIGN1cnJlbnQgZGV2aWNlIHdpcmVsZXNzIHN0YXRpc3RpY3MuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGl3X3N0YXRpc3RpY3MgKiB3bF93aXJlbGVzc19zdGF0cyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJc3RydWN0IGl3X3N0YXRpc3RpY3MgICAgKnBTdGF0czsKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICAgICAqbHAgPSB3bF9wcml2KGRldik7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggIndsX3dpcmVsZXNzX3N0YXRzIiApOworCURCR19FTlRFUihEYmdJbmZvKTsKKwlEQkdfUEFSQU0oRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldik7CisKKwlwU3RhdHMgPSBOVUxMOworCisJLyogSW5pdGlhbGl6ZSB0aGUgc3RhdGlzdGljcyAqLworCXBTdGF0cwkJCT0gJiggbHAtPndzdGF0cyApOworCXBTdGF0cy0+cXVhbC51cGRhdGVkICAgID0gMHgwMDsKKworCWlmKCAhKCBscC0+ZmxhZ3MgJiBXVkxBTjJfVUlMX0JVU1kgKSkKKwl7CisJCUNGR19DT01NU19RVUFMSVRZX1NUUkNUICpwUXVhbDsKKwkJQ0ZHX0hFUk1FU19UQUxMSUVTX1NUUkNUIHRhbGxpZXM7CisJCWludCAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisKKwkJLyogVXBkYXRlIGRyaXZlciBzdGF0dXMgKi8KKwkJcFN0YXRzLT5zdGF0dXMgPSAwOworCisJCS8qIEdldCB0aGUgY3VycmVudCBsaW5rIHF1YWxpdHkgaW5mb3JtYXRpb24gKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gPSAxICsgKCBzaXplb2YoICpwUXVhbCApIC8gc2l6ZW9mKCBoY2ZfMTYgKSk7CisJCWxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0NPTU1TX1FVQUxJVFk7CisJCXN0YXR1cyA9IGhjZl9nZXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCWlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CisJCQlwUXVhbCA9IChDRkdfQ09NTVNfUVVBTElUWV9TVFJDVCAqKSYoIGxwLT5sdHZSZWNvcmQgKTsKKworI2lmZGVmIFVTRV9EQk0KKwkJCXBTdGF0cy0+cXVhbC5xdWFsICA9ICh1X2NoYXIpIENOVl9MSVRUTEVfVE9fSU5UKCBwUXVhbC0+Y29tc19xdWFsICk7CisJCQlwU3RhdHMtPnF1YWwubGV2ZWwgPSAodV9jaGFyKSBkYm0oIENOVl9MSVRUTEVfVE9fSU5UKCBwUXVhbC0+c2lnbmFsX2x2bCApKTsKKwkJCXBTdGF0cy0+cXVhbC5ub2lzZSA9ICh1X2NoYXIpIGRibSggQ05WX0xJVFRMRV9UT19JTlQoIHBRdWFsLT5ub2lzZV9sdmwgKSk7CisKKwkJCXBTdGF0cy0+cXVhbC51cGRhdGVkIHw9IChJV19RVUFMX1FVQUxfVVBEQVRFRCAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElXX1FVQUxfTEVWRUxfVVBEQVRFRCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVdfUVVBTF9OT0lTRV9VUERBVEVEIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJV19RVUFMX0RCTSk7CisjZWxzZQorCQkJcFN0YXRzLT5xdWFsLnF1YWwgPSBwZXJjZW50KCBDTlZfTElUVExFX1RPX0lOVCggcFF1YWwtPmNvbXNfcXVhbCApLAorCQkJCQkJICAgICBIQ0ZfTUlOX0NPTU1fUVVBTElUWSwKKwkJCQkJCSAgICAgSENGX01BWF9DT01NX1FVQUxJVFkgKTsKKworCQkJcFN0YXRzLT5xdWFsLmxldmVsID0gcGVyY2VudCggQ05WX0xJVFRMRV9UT19JTlQoIHBRdWFsLT5zaWduYWxfbHZsICksCisJCQkJCQkgICAgICBIQ0ZfTUlOX1NJR05BTF9MRVZFTCwKKwkJCQkJCSAgICAgIEhDRl9NQVhfU0lHTkFMX0xFVkVMICk7CisKKwkJCXBTdGF0cy0+cXVhbC5ub2lzZSA9IHBlcmNlbnQoIENOVl9MSVRUTEVfVE9fSU5UKCBwUXVhbC0+bm9pc2VfbHZsICksCisJCQkJCQkgICAgICBIQ0ZfTUlOX05PSVNFX0xFVkVMLAorCQkJCQkJICAgICAgSENGX01BWF9OT0lTRV9MRVZFTCApOworCisJCQlwU3RhdHMtPnF1YWwudXBkYXRlZCB8PSAoSVdfUVVBTF9RVUFMX1VQREFURUQgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJV19RVUFMX0xFVkVMX1VQREFURUQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElXX1FVQUxfTk9JU0VfVVBEQVRFRCk7CisjZW5kaWYgLyogVVNFX0RCTSAqLworCQl9IGVsc2UgeworCQkJbWVtc2V0KCAmKCBwU3RhdHMtPnF1YWwgKSwgMCwgc2l6ZW9mKCBwU3RhdHMtPnF1YWwgKSk7CisJCX0KKworCQkvKiBHZXQgdGhlIGN1cnJlbnQgdGFsbGllcyBmcm9tIHRoZSBhZGFwdGVyICovCisgICAgICAgICAgICAgICAgLyogT25seSBwb3NzaWJsZSB3aGVuIHRoZSBkZXZpY2UgaXMgb3BlbiAqLworCQlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJCWlmKCB3bF9nZXRfdGFsbGllcyggbHAsICZ0YWxsaWVzICkgPT0gMCApIHsKKwkJCQkvKiBObyBlbmRpYW4gdHJhbnNsYXRpb24gaXMgbmVlZGVkIGhlcmUsIGFzIENGR19UQUxMSUVTIGlzIGFuCisJCQkJICAgTVNGIFJJRDsgYWxsIHByb2Nlc3NpbmcgaXMgZG9uZSBvbiB0aGUgaG9zdCwgbm90IHRoZSBjYXJkISAqLworCQkJCXBTdGF0cy0+ZGlzY2FyZC5ud2lkID0gMEw7CisJCQkJcFN0YXRzLT5kaXNjYXJkLmNvZGUgPSB0YWxsaWVzLlJ4V0VQVW5kZWNyeXB0YWJsZTsKKwkJCQlwU3RhdHMtPmRpc2NhcmQubWlzYyA9IHRhbGxpZXMuVHhEaXNjYXJkcyArCisJCQkJCQkgICAgICAgdGFsbGllcy5SeEZDU0Vycm9ycyArCisJCQkJCQkgICAgICAgLy90YWxsaWVzLlJ4RGlzY2FyZHNOb0J1ZmZlciArCisJCQkJCQkgICAgICAgdGFsbGllcy5UeERpc2NhcmRzV3JvbmdTQTsKKwkJCQkvLzs/IEV4dHJhIHRha2VuIG92ZXIgZnJvbSBMaW51eCBkcml2ZXIgYmFzZWQgb24gNy4xOCB2ZXJzaW9uCisJCQkJcFN0YXRzLT5kaXNjYXJkLnJldHJpZXMgPSB0YWxsaWVzLlR4UmV0cnlMaW1pdEV4Y2VlZGVkOworCQkJCXBTdGF0cy0+ZGlzY2FyZC5mcmFnbWVudCA9IHRhbGxpZXMuUnhNc2dJbkJhZE1zZ0ZyYWdtZW50czsKKwkJCX0gZWxzZSB7CisJCQkJbWVtc2V0KCAmKCBwU3RhdHMtPmRpc2NhcmQgKSwgMCwgc2l6ZW9mKCBwU3RhdHMtPmRpc2NhcmQgKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQltZW1zZXQoICYoIHBTdGF0cy0+ZGlzY2FyZCApLCAwLCBzaXplb2YoIHBTdGF0cy0+ZGlzY2FyZCApKTsKKwkJfQorCX0KKworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiBwU3RhdHM7Cit9IC8vIHdsX3dpcmVsZXNzX3N0YXRzCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfZ2V0X3dpcmVsZXNzX3N0YXRzKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgUmV0dXJuIHRoZSBjdXJyZW50IGRldmljZSB3aXJlbGVzcyBzdGF0aXN0aWNzLiBUaGlzIGZ1bmN0aW9uIGNhbGxzCisgKiAgICAgIHdsX3dpcmVsZXNzX3N0YXRzLCBidXQgYWNxdWlyZXMgc3BpbmxvY2tzIGZpcnN0IGFzIGl0IGNhbiBiZSBjYWxsZWQKKyAqICAgICAgZGlyZWN0bHkgYnkgdGhlIG5ldHdvcmsgbGF5ZXIuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGl3X3N0YXRpc3RpY3MgKiB3bF9nZXRfd2lyZWxlc3Nfc3RhdHMoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIGZsYWdzOworCXN0cnVjdCB3bF9wcml2YXRlICAgICAgICpscCA9IHdsX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcyAgICAqcFN0YXRzID0gTlVMTDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlEQkdfRlVOQyggIndsX2dldF93aXJlbGVzc19zdGF0cyIgKTsKKwlEQkdfRU5URVIoRGJnSW5mbyk7CisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKyNpZmRlZiBVU0VfUlRTCisJaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiU2tpcHBpbmcgd2lyZWxlc3Mgc3RhdHMsIGluIFJUUyBtb2RlXG4iICk7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCXBTdGF0cyA9IHdsX3dpcmVsZXNzX3N0YXRzKCBkZXYgKTsKKwl9CisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcFN0YXRzOworfSAvLyB3bF9nZXRfd2lyZWxlc3Nfc3RhdHMKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfc3B5X2dhdGhlcigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEdhdGhlciB3aXJlbGVzcyBzcHkgc3RhdGlzdGljcy4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbmxpbmUgdm9pZCB3bF9zcHlfZ2F0aGVyKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2NoYXIgKm1hYyApCit7CisJc3RydWN0IGl3X3F1YWxpdHkgd3N0YXRzOworCWludCAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1X2NoYXIgICAgICAgICAgICAgICAgICBzdGF0c1syXTsKKwlERVNDX1NUUkNUICAgICAgICAgICAgICBkZXNjWzFdOworCXN0cnVjdCB3bF9wcml2YXRlICAgKmxwID0gd2xfcHJpdihkZXYpOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCS8qIHNob3J0Y3V0ICovCisJaWYgKCFscC0+c3B5X2RhdGEuc3B5X251bWJlcikgeworCQlyZXR1cm47CisJfQorCisJLyogR2F0aGVyIHdpcmVsZXNzIHNweSBzdGF0aXN0aWNzOiBmb3IgZWFjaCBwYWNrZXQsIGNvbXBhcmUgdGhlIHNvdXJjZQorCSAgIGFkZHJlc3Mgd2l0aCBvdXQgbGlzdCwgYW5kIGlmIG1hdGNoLCBnZXQgdGhlIHN0YXRzLiAqLworCW1lbXNldCggc3RhdHMsIDAsIHNpemVvZihzdGF0cykpOworCW1lbXNldCggZGVzYywgMCwgc2l6ZW9mKERFU0NfU1RSQ1QpKTsKKworCWRlc2NbMF0uYnVmX2FkZHIJPSBzdGF0czsKKwlkZXNjWzBdLkJVRl9TSVpFCT0gc2l6ZW9mKHN0YXRzKTsKKwlkZXNjWzBdLm5leHRfZGVzY19hZGRyICA9IDA7CQkvLyB0ZXJtaW5hdGUgbGlzdAorCisJc3RhdHVzID0gaGNmX3Jjdl9tc2coICYoIGxwLT5oY2ZDdHggKSwgJmRlc2NbMF0sIDAgKTsKKworCWlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CisJCXdzdGF0cy5sZXZlbCA9ICh1X2NoYXIpIGRibShzdGF0c1sxXSk7CisJCXdzdGF0cy5ub2lzZSA9ICh1X2NoYXIpIGRibShzdGF0c1swXSk7CisJCXdzdGF0cy5xdWFsICA9IHdzdGF0cy5sZXZlbCA+IHdzdGF0cy5ub2lzZSA/IHdzdGF0cy5sZXZlbCAtIHdzdGF0cy5ub2lzZSA6IDA7CisKKwkJd3N0YXRzLnVwZGF0ZWQgPSAoSVdfUVVBTF9RVUFMX1VQREFURUQgIHwKKwkJCQkgIElXX1FVQUxfTEVWRUxfVVBEQVRFRCB8CisJCQkJICBJV19RVUFMX05PSVNFX1VQREFURUQgfAorCQkJCSAgSVdfUVVBTF9EQk0pOworCisJCXdpcmVsZXNzX3NweV91cGRhdGUoIGRldiwgbWFjLCAmd3N0YXRzICk7CisJfQorfSAvLyB3bF9zcHlfZ2F0aGVyCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfd2V4dF9ldmVudF9mcmVxKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgYW4gZXZlbnQgdGhhdCB0aGUgY2hhbm5lbC9mcmVxCisgKiAgICAgIGNvbmZpZ3VyYXRpb24gZm9yIGEgc3BlY2lmaWMgZGV2aWNlIGhhcyBjaGFuZ2VkLgorICoKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIHRoZSBuZXR3b3JrIGRldmljZSBmb3Igd2hpY2ggdGhpcyBldmVudCBpcyB0byBiZSBpc3N1ZWQKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3dleHRfZXZlbnRfZnJlcSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisjaWYgV0lSRUxFU1NfRVhUID4gMTMKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJbWVtc2V0KCAmd3JxdSwgMCwgc2l6ZW9mKCB3cnF1ICkpOworCisJd3JxdS5mcmVxLm0gPSBscC0+Q2hhbm5lbDsKKwl3cnF1LmZyZXEuZSA9IDA7CisKKwl3aXJlbGVzc19zZW5kX2V2ZW50KCBkZXYsIFNJT0NTSVdGUkVRLCAmd3JxdSwgTlVMTCApOworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDEzICovCisKKwlyZXR1cm47Cit9IC8vIHdsX3dleHRfZXZlbnRfZnJlcQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3dleHRfZXZlbnRfbW9kZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZW5kIGFuIGV2ZW50IHRoYXQgdGhlIG1vZGUgb2Ygb3BlcmF0aW9uCisgKiAgICAgIGZvciBhIHNwZWNpZmljIGRldmljZSBoYXMgY2hhbmdlZC4KKyAqCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSB0aGUgbmV0d29yayBkZXZpY2UgZm9yIHdoaWNoIHRoaXMgZXZlbnQgaXMgdG8gYmUgaXNzdWVkCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF93ZXh0X2V2ZW50X21vZGUoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworI2lmIFdJUkVMRVNTX0VYVCA+IDEzCisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCW1lbXNldCggJndycXUsIDAsIHNpemVvZiggd3JxdSApKTsKKworCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfU1RBICApIHsKKwkJd3JxdS5tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwl9IGVsc2UgeworCQl3cnF1Lm1vZGUgPSBJV19NT0RFX01BU1RFUjsKKwl9CisKKwl3aXJlbGVzc19zZW5kX2V2ZW50KCBkZXYsIFNJT0NTSVdNT0RFLCAmd3JxdSwgTlVMTCApOworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDEzICovCisKKwlyZXR1cm47Cit9IC8vIHdsX3dleHRfZXZlbnRfbW9kZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3dleHRfZXZlbnRfZXNzaWQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBhbiBldmVudCB0aGF0IHRoZSBFU1NJRCBjb25maWd1cmF0aW9uIGZvcgorICogICAgICBhIHNwZWNpZmljIGRldmljZSBoYXMgY2hhbmdlZC4KKyAqCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSB0aGUgbmV0d29yayBkZXZpY2UgZm9yIHdoaWNoIHRoaXMgZXZlbnQgaXMgdG8gYmUgaXNzdWVkCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF93ZXh0X2V2ZW50X2Vzc2lkKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyNpZiBXSVJFTEVTU19FWFQgPiAxMworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwltZW1zZXQoICZ3cnF1LCAwLCBzaXplb2YoIHdycXUgKSk7CisKKwkvKiBGaWxsIG91dCB0aGUgYnVmZmVyLiBOb3RlIHRoYXQgdGhlIGJ1ZmZlciBkb2Vzbid0IGFjdHVhbGx5IGNvbnRhaW4gdGhlCisJICAgRVNTSUQsIGJ1dCBhIHBvaW50ZXIgdG8gdGhlIGNvbnRlbnRzLiBJbiBhZGRpdGlvbiwgdGhlICdleHRyYScgZmllbGQgb2YKKwkgICB0aGUgY2FsbCB0byB3aXJlbGVzc19zZW5kX2V2ZW50KCkgbXVzdCBhbHNvIHBvaW50IHRvIHdoZXJlIHRoZSBFU1NJRAorCSAgIGxpdmVzICovCisJd3JxdS5lc3NpZC5sZW5ndGggID0gc3RybGVuKCBscC0+TmV0d29ya05hbWUgKTsKKwl3cnF1LmVzc2lkLnBvaW50ZXIgPSAoY2FkZHJfdClscC0+TmV0d29ya05hbWU7CisJd3JxdS5lc3NpZC5mbGFncyAgID0gMTsKKworCXdpcmVsZXNzX3NlbmRfZXZlbnQoIGRldiwgU0lPQ1NJV0VTU0lELCAmd3JxdSwgbHAtPk5ldHdvcmtOYW1lICk7CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTMgKi8KKworCXJldHVybjsKK30gLy8gd2xfd2V4dF9ldmVudF9lc3NpZAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3dleHRfZXZlbnRfZW5jb2RlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgYW4gZXZlbnQgdGhhdCB0aGUgZW5jcnlwdGlvbiBjb25maWd1cmF0aW9uCisgKiAgICAgIGZvciBhIHNwZWNpZmljIGRldmljZSBoYXMgY2hhbmdlZC4KKyAqCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSB0aGUgbmV0d29yayBkZXZpY2UgZm9yIHdoaWNoIHRoaXMgZXZlbnQgaXMgdG8gYmUgaXNzdWVkCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF93ZXh0X2V2ZW50X2VuY29kZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisjaWYgV0lSRUxFU1NfRVhUID4gMTMKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCWludCBpbmRleCA9IDA7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwltZW1zZXQoICZ3cnF1LCAwLCBzaXplb2YoIHdycXUgKSk7CisKKwlpZiggbHAtPkVuYWJsZUVuY3J5cHRpb24gPT0gMCApIHsKKwkJd3JxdS5lbmNvZGluZy5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwl9IGVsc2UgeworCQl3cnF1LmVuY29kaW5nLmZsYWdzIHw9IGxwLT5UcmFuc21pdEtleUlEOworCisJCWluZGV4ID0gbHAtPlRyYW5zbWl0S2V5SUQgLSAxOworCisJCS8qIE9ubHkgc2V0IElXX0VOQ09ERV9SRVNUUklDVEVEL09QRU4gZmxhZyB1c2luZyBscC0+RXhjbHVkZVVuZW5jcnlwdGVkCisJCSAgIGlmIHdlJ3JlIGluIEFQIG1vZGUgKi8KKyNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCisJCS8vOz9zaG91bGQgd2UgcmVzdG9yZSB0aGlzIHRvIGFsbG93IHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludAorCisJCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfQVAgICkgeworCQkJaWYoIGxwLT5FeGNsdWRlVW5lbmNyeXB0ZWQgKSB7CisJCQkJd3JxdS5lbmNvZGluZy5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsKKwkJCX0gZWxzZSB7CisJCQkJd3JxdS5lbmNvZGluZy5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsKKwkJCX0KKwkJfQorCisjZW5kaWYgIC8vIEhDRl9UWVBFX0FQCisKKwkJLyogT25seSBwcm92aWRlIHRoZSBrZXkgaWYgcGVybWlzc2lvbnMgYWxsb3cgKi8KKwkJaWYoIGNhcGFibGUoIENBUF9ORVRfQURNSU4gKSkgeworCQkJd3JxdS5lbmNvZGluZy5wb2ludGVyID0gKGNhZGRyX3QpbHAtPkRlZmF1bHRLZXlzLmtleVtpbmRleF0ua2V5OworCQkJd3JxdS5lbmNvZGluZy5sZW5ndGggID0gbHAtPkRlZmF1bHRLZXlzLmtleVtpbmRleF0ubGVuOworCQl9IGVsc2UgeworCQkJd3JxdS5lbmNvZGluZy5mbGFncyB8PSBJV19FTkNPREVfTk9LRVk7CisJCX0KKwl9CisKKwl3aXJlbGVzc19zZW5kX2V2ZW50KCBkZXYsIFNJT0NTSVdFTkNPREUsICZ3cnF1LAorCQkJCQkJIGxwLT5EZWZhdWx0S2V5cy5rZXlbaW5kZXhdLmtleSApOworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDEzICovCisKKwlyZXR1cm47Cit9IC8vIHdsX3dleHRfZXZlbnRfZW5jb2RlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfd2V4dF9ldmVudF9hcCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZW5kIGFuIGV2ZW50IHRoYXQgdGhlIGRldmljZSBoYXMgYmVlbgorICogICAgICBhc3NvY2lhdGVkIHRvIGEgbmV3IEFQLgorICoKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIHRoZSBuZXR3b3JrIGRldmljZSBmb3Igd2hpY2ggdGhpcyBldmVudCBpcyB0byBiZSBpc3N1ZWQKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3dleHRfZXZlbnRfYXAoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworI2lmIFdJUkVMRVNTX0VYVCA+IDEzCisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwlpbnQgc3RhdHVzOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJLyogUmV0cmlldmUgdGhlIFdQQS1JRXMgdXNlZCBieSB0aGUgZmlybXdhcmUgYW5kIHNlbmQgYW4gZXZlbnQuIFdlIG11c3Qgc2VuZAorCSAgIHRoaXMgZXZlbnQgQkVGT1JFIHNlbmRpbmcgdGhlIGFzc29jaWF0aW9uIGV2ZW50LCBhcyB0aGVyZSBhcmUgdGltaW5nCisJICAgaXNzdWVzIHdpdGggdGhlIGhvc3RhcCBzdXBwbGljYW50LiBUaGUgc3VwcGxpY2FudCB3aWxsIGF0dGVtcHQgdG8gcHJvY2VzcworCSAgIGFuIEVBUE9MLUtleSBmcmFtZSBmcm9tIGFuIEFQIGJlZm9yZSByZWNlaXZpbmcgdGhpcyBpbmZvcm1hdGlvbiwgd2hpY2gKKwkgICBpcyByZXF1aXJlZCBwcm9wZXJseSBwcm9jZXNzIHRoZSBzYWlkIGZyYW1lLiAqLworCXdsX3dleHRfZXZlbnRfYXNzb2NfaWUoIGRldiApOworCisJLyogR2V0IHRoZSBCU1NJRCAqLworCWxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0NVUl9CU1NJRDsKKwlscC0+bHR2UmVjb3JkLmxlbiA9IDQ7CisKKwlzdGF0dXMgPSBoY2ZfZ2V0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKwlpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgeworCQltZW1zZXQoICZ3cnF1LCAwLCBzaXplb2YoIHdycXUgKSk7CisKKwkJbWVtY3B5KCB3cnF1LmFkZHIuc2FfZGF0YSwgbHAtPmx0dlJlY29yZC51LnU4LCBFVEhfQUxFTiApOworCisJCXdycXUuYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisKKwkJd2lyZWxlc3Nfc2VuZF9ldmVudCggZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMICk7CisJfQorCisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTMgKi8KKworCXJldHVybjsKK30gLy8gd2xfd2V4dF9ldmVudF9hcAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF93ZXh0X2V2ZW50X3NjYW5fY29tcGxldGUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBhbiBldmVudCB0aGF0IGEgcmVxdWVzdCBmb3IgYSBuZXR3b3JrIHNjYW4KKyAqICAgICAgaGFzIGNvbXBsZXRlZC4KKyAqCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSB0aGUgbmV0d29yayBkZXZpY2UgZm9yIHdoaWNoIHRoaXMgZXZlbnQgaXMgdG8gYmUgaXNzdWVkCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF93ZXh0X2V2ZW50X3NjYW5fY29tcGxldGUoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworI2lmIFdJUkVMRVNTX0VYVCA+IDEzCisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJbWVtc2V0KCAmd3JxdSwgMCwgc2l6ZW9mKCB3cnF1ICkpOworCisJd3JxdS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwl3aXJlbGVzc19zZW5kX2V2ZW50KCBkZXYsIFNJT0NHSVdTQ0FOLCAmd3JxdSwgTlVMTCApOworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDEzICovCisKKwlyZXR1cm47Cit9IC8vIHdsX3dleHRfZXZlbnRfc2Nhbl9jb21wbGV0ZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3dleHRfZXZlbnRfbmV3X3N0YSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZW5kIGFuIGV2ZW50IHRoYXQgYW4gQVAgaGFzIHJlZ2lzdGVyZWQgYSBuZXcKKyAqICAgICAgc3RhdGlvbi4KKyAqCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSB0aGUgbmV0d29yayBkZXZpY2UgZm9yIHdoaWNoIHRoaXMgZXZlbnQgaXMgdG8gYmUgaXNzdWVkCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF93ZXh0X2V2ZW50X25ld19zdGEoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworI2lmIFdJUkVMRVNTX0VYVCA+IDE0CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJbWVtc2V0KCAmd3JxdSwgMCwgc2l6ZW9mKCB3cnF1ICkpOworCisJLyogU2VuZCB0aGUgc3RhdGlvbidzIG1hYyBhZGRyZXNzIGhlcmUgKi8KKwltZW1jcHkoIHdycXUuYWRkci5zYV9kYXRhLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTiApOworCXdycXUuYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJd2lyZWxlc3Nfc2VuZF9ldmVudCggZGV2LCBJV0VWUkVHSVNURVJFRCwgJndycXUsIE5VTEwgKTsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxNCAqLworCisJcmV0dXJuOworfSAvLyB3bF93ZXh0X2V2ZW50X25ld19zdGEKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF93ZXh0X2V2ZW50X2V4cGlyZWRfc3RhKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgYW4gZXZlbnQgdGhhdCBhbiBBUCBoYXMgZGVyZWdpc3RlcmVkIGEKKyAqICAgICAgc3RhdGlvbi4KKyAqCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSB0aGUgbmV0d29yayBkZXZpY2UgZm9yIHdoaWNoIHRoaXMgZXZlbnQgaXMgdG8gYmUgaXNzdWVkCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF93ZXh0X2V2ZW50X2V4cGlyZWRfc3RhKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyNpZiBXSVJFTEVTU19FWFQgPiAxNAorCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCW1lbXNldCggJndycXUsIDAsIHNpemVvZiggd3JxdSApKTsKKworCW1lbWNweSggd3JxdS5hZGRyLnNhX2RhdGEsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOICk7CisJd3JxdS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwl3aXJlbGVzc19zZW5kX2V2ZW50KCBkZXYsIElXRVZFWFBJUkVELCAmd3JxdSwgTlVMTCApOworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDE0ICovCisKKwlyZXR1cm47Cit9IC8vIHdsX3dleHRfZXZlbnRfZXhwaXJlZF9zdGEKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF93ZXh0X2V2ZW50X21pY19mYWlsZWQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBhbiBldmVudCB0aGF0IE1JQyBjYWxjdWxhdGlvbnMgZmFpbGVkLgorICoKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIHRoZSBuZXR3b3JrIGRldmljZSBmb3Igd2hpY2ggdGhpcyBldmVudCBpcyB0byBiZSBpc3N1ZWQKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3dleHRfZXZlbnRfbWljX2ZhaWxlZCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisjaWYgV0lSRUxFU1NfRVhUID4gMTQKKwljaGFyICAgICAgICAgICAgICAgbXNnWzUxMl07CisJdW5pb24gaXdyZXFfZGF0YSAgIHdycXU7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCWludCAgICAgICAgICAgICAgICBrZXlfaWR4OworCWNoYXIgICAgICAgICAgICAgICphZGRyMTsKKwljaGFyICAgICAgICAgICAgICAqYWRkcjI7CisJV1ZMQU5fUlhfV01QX0hEUiAgKmhkcjsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCWtleV9pZHggPSBscC0+bG9va0FoZWFkQnVmW0hGU19TVEFUKzFdID4+IDM7CisJa2V5X2lkeCAmPSAweDAzOworCisJLyogQ2FzdCB0aGUgbG9va2FoZWFkIGJ1ZmZlciBpbnRvIGEgUkZTIGZvcm1hdCAqLworCWhkciA9IChXVkxBTl9SWF9XTVBfSERSICopJmxwLT5sb29rQWhlYWRCdWZbSEZTX1NUQVRdOworCisJLyogQ2FzdCB0aGUgYWRkcmVzc2VzIHRvIGJ5dGUgYnVmZmVycywgYXMgaW4gdGhlIGFib3ZlIFJGUyB0aGV5IGFyZSB3b3JkCisJICAgbGVuZ3RoICovCisJYWRkcjEgPSAoY2hhciAqKWhkci0+YWRkcmVzczE7CisJYWRkcjIgPSAoY2hhciAqKWhkci0+YWRkcmVzczI7CisKKwlEQkdfUFJJTlQoICJNSUMgRkFJTCAtIEtFWSBVU0VEIDogJWQsIFNUQVRVUyA6IDB4JTA0eFxuIiwga2V5X2lkeCwKKwkJCSAgIGhkci0+c3RhdHVzICk7CisKKwltZW1zZXQoICZ3cnF1LCAwLCBzaXplb2YoIHdycXUgKSk7CisJbWVtc2V0KCBtc2csIDAsIHNpemVvZiggbXNnICkpOworCisKKwkvKiBCZWN1YXNlIE1JQyBmYWlsdXJlcyBhcmUgbm90IHBhcnQgb2YgdGhlIFdpcmVsZXNzIEV4dGVuc2lvbnMgeWV0LCB0aGV5CisJICAgbXVzdCBiZSBwYXNzZWQgYXMgYSBzdHJpbmcgdXNpbmcgYW4gSVdFVkNVU1RPTSBldmVudC4gSW4gb3JkZXIgZm9yIHRoZQorCSAgIGV2ZW50IHRvIGJlIGVmZmVjdGl2ZSwgdGhlIHN0cmluZyBmb3JtYXQgbXVzdCBiZSBrbm93biBieSBib3RoIHRoZQorCSAgIGRyaXZlciBhbmQgdGhlIHN1cHBsaWNhbnQuIFRoZSBmb2xsb3dpbmcgaXMgdGhlIHN0cmluZyBmb3JtYXQgdXNlZCBieSB0aGUKKwkgICBob3N0YXAgcHJvamVjdCdzIFdQQSBzdXBwbGljYW50LCBhbmQgd2lsbCBiZSB1c2VkIGhlcmUgdW50aWwgdGhlIFdpcmVsZXNzCisJICAgRXh0ZW5zaW9ucyBpbnRlcmZhY2UgYWRkcyB0aGlzIHN1cHBvcnQ6CisKKwkgICBNTE1FLU1JQ0hBRUxNSUNGQUlMVVJFLmluZGljYXRpb24oa2V5aWQ9IyBicm9hZGNhc3QvdW5pY2FzdCBhZGRyPWFkZHIyKQorICAgKi8KKworCS8qIE5PVEU6IEZvcm1hdCBvZiBNQUMgYWRkcmVzcyAodXNpbmcgY29sb25zIHRvIHNlcGVyYXRlIGJ5dGVzKSBtYXkgY2F1c2UKKwkJCSBhIHByb2JsZW0gaW4gZnV0dXJlIHZlcnNpb25zIG9mIHRoZSBzdXBwbGljYW50LCBpZiB0aGV5IGV2ZXIKKwkJCSBhY3R1YWxseSBwYXJzZSB0aGVzZSBwYXJhbWV0ZXJzICovCisjaWYgREJHCisJc3ByaW50ZiggbXNnLCAiTUxNRS1NSUNIQUVMTUlDRkFJTFVSRS5pbmRpY2F0aW9uKGtleWlkPSVkICVzY2FzdCBhZGRyPSIKKwkJCSAiJXMpIiwga2V5X2lkeCwgYWRkcjFbMF0gJiAweDAxID8gImJyb2FkIiA6ICJ1bmkiLAorCQkJIERiZ0h3QWRkciggYWRkcjIgKSk7CisjZW5kaWYKKwl3cnF1LmRhdGEubGVuZ3RoID0gc3RybGVuKCBtc2cgKTsKKwl3aXJlbGVzc19zZW5kX2V2ZW50KCBkZXYsIElXRVZDVVNUT00sICZ3cnF1LCBtc2cgKTsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxNCAqLworCisJcmV0dXJuOworfSAvLyB3bF93ZXh0X2V2ZW50X21pY19mYWlsZWQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF93ZXh0X2V2ZW50X2Fzc29jX2llKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgYW4gZXZlbnQgY29udGFpbmluZyB0aGUgV1BBLUlFIGdlbmVyYXRlZAorICogICAgICBieSB0aGUgZmlybXdhcmUgaW4gYW4gYXNzb2NpYXRpb24gcmVxdWVzdC4KKyAqCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSB0aGUgbmV0d29yayBkZXZpY2UgZm9yIHdoaWNoIHRoaXMgZXZlbnQgaXMgdG8gYmUgaXNzdWVkCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF93ZXh0X2V2ZW50X2Fzc29jX2llKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyNpZiBXSVJFTEVTU19FWFQgPiAxNAorCWNoYXIgICAgICAgICAgICAgICBtc2dbNTEyXTsKKwl1bmlvbiBpd3JlcV9kYXRhICAgd3JxdTsKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJaW50IHN0YXR1czsKKwlQUk9CRV9SRVNQICAgICAgICAgZGF0YTsKKwloY2ZfMTYgICAgICAgICAgICAgbGVuZ3RoOworCWhjZl84ICAgICAgICAgICAgICAqd3BhX2llOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJbWVtc2V0KCAmd3JxdSwgMCwgc2l6ZW9mKCB3cnF1ICkpOworCW1lbXNldCggbXNnLCAwLCBzaXplb2YoIG1zZyApKTsKKworCS8qIFJldHJpZXZlIHRoZSBBc3NvY2lhdGlvbiBSZXF1ZXN0IElFICovCisJbHAtPmx0dlJlY29yZC5sZW4gPSA0NTsKKwlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19DVVJfQVNTT0NfUkVRX0lORk87CisKKwlzdGF0dXMgPSBoY2ZfZ2V0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKwlpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkKKwl7CisJCWxlbmd0aCA9IDA7CisJCW1lbWNweSggJmRhdGEucmF3RGF0YSwgJiggbHAtPmx0dlJlY29yZC51LnU4WzFdICksIDg4ICk7CisJCXdwYV9pZSA9IHdsX3BhcnNlX3dwYV9pZSggJmRhdGEsICZsZW5ndGggKTsKKworCQkvKiBCZWN1YXNlIHRoaXMgZXZlbnQgKEFzc29jaWF0aW9uIFdQQS1JRSkgaXMgbm90IHBhcnQgb2YgdGhlIFdpcmVsZXNzCisJCUV4dGVuc2lvbnMgeWV0LCBpdCBtdXN0IGJlIHBhc3NlZCBhcyBhIHN0cmluZyB1c2luZyBhbiBJV0VWQ1VTVE9NIGV2ZW50LgorCQlJbiBvcmRlciBmb3IgdGhlIGV2ZW50IHRvIGJlIGVmZmVjdGl2ZSwgdGhlIHN0cmluZyBmb3JtYXQgbXVzdCBiZSBrbm93bgorCQlieSBib3RoIHRoZSBkcml2ZXIgYW5kIHRoZSBzdXBwbGljYW50LiBUaGUgZm9sbG93aW5nIGlzIHRoZSBzdHJpbmcgZm9ybWF0CisJCXVzZWQgYnkgdGhlIGhvc3RhcCBwcm9qZWN0J3MgV1BBIHN1cHBsaWNhbnQsIGFuZCB3aWxsIGJlIHVzZWQgaGVyZSB1bnRpbAorCQl0aGUgV2lyZWxlc3MgRXh0ZW5zaW9ucyBpbnRlcmZhY2UgYWRkcyB0aGlzIHN1cHBvcnQ6CisKKwkJQVNTT0NJTkZPKFJlcUlFcz1XUEEtSUUgUmVzcElFcz1XUEEtSUUpCisJCSovCisKKwkJaWYoIGxlbmd0aCAhPSAwICkKKwkJeworCQkJc3ByaW50ZiggbXNnLCAiQVNTT0NJTkZPKFJlcUlFcz0lcykiLCB3bF9wcmludF93cGFfaWUoIHdwYV9pZSwgbGVuZ3RoICkpOworCQkJd3JxdS5kYXRhLmxlbmd0aCA9IHN0cmxlbiggbXNnICk7CisJCQl3aXJlbGVzc19zZW5kX2V2ZW50KCBkZXYsIElXRVZDVVNUT00sICZ3cnF1LCBtc2cgKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxNCAqLworCisJcmV0dXJuOworfSAgLy8gd2xfd2V4dF9ldmVudF9hc3NvY19pZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIFN0cnVjdHVyZXMgdG8gZXhwb3J0IHRoZSBXaXJlbGVzcyBIYW5kbGVycyAqLworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlciB3bF9oYW5kbGVyW10gPQoreworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19jb21taXQsICAgICAgICAgICAvKiBTSU9DU0lXQ09NTUlUICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX2dldF9wcm90b2NvbCwgICAgIC8qIFNJT0NHSVdOQU1FICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdOV0lEICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdOV0lEICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX3NldF9mcmVxdWVuY3ksICAgIC8qIFNJT0NTSVdGUkVRICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX2dldF9mcmVxdWVuY3ksICAgIC8qIFNJT0NHSVdGUkVRICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX3NldF9wb3J0dHlwZSwgICAgIC8qIFNJT0NTSVdNT0RFICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX2dldF9wb3J0dHlwZSwgICAgIC8qIFNJT0NHSVdNT0RFICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX3NldF9zZW5zaXRpdml0eSwgIC8qIFNJT0NTSVdTRU5TICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX2dldF9zZW5zaXRpdml0eSwgIC8qIFNJT0NHSVdTRU5TICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwgLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdSQU5HRSAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19nZXRfcmFuZ2UsICAgICAgICAvKiBTSU9DR0lXUkFOR0UgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCAsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1BSSVYgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCAvKiBrZXJuZWwgY29kZSAqLywgICAgLyogU0lPQ0dJV1BSSVYgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCAsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NUQVRTICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwgLyoga2VybmVsIGNvZGUgKi8sICAgIC8qIFNJT0NHSVdTVEFUUyAqLworICAgICAgICAgICAgICAgIGl3X2hhbmRsZXJfc2V0X3NweSwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU1BZICovCisgICAgICAgICAgICAgICAgaXdfaGFuZGxlcl9nZXRfc3B5LCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdTUFkgKi8KKyAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1RIUlNQWSAqLworICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXVEhSU1BZICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdBUCAqLworI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfU1RBCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX2dldF9ic3NpZCwgICAgICAgIC8qIFNJT0NHSVdBUCAqLworI2Vsc2UKKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV0FQICovCisjZW5kaWYKKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV01MTUUgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X2FwX2xpc3QsICAgICAgLyogU0lPQ0dJV0FQTElTVCAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19zZXRfc2NhbiwgICAgICAgICAvKiBTSU9DU0lXU0NBTiAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19nZXRfc2NhbiwgICAgICAgICAvKiBTSU9DR0lXU0NBTiAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19zZXRfZXNzaWQsICAgICAgICAvKiBTSU9DU0lXRVNTSUQgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X2Vzc2lkLCAgICAgICAgLyogU0lPQ0dJV0VTU0lEICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX3NldF9uaWNrbmFtZSwgICAgIC8qIFNJT0NTSVdOSUNLTiAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19nZXRfbmlja25hbWUsICAgICAvKiBTSU9DR0lXTklDS04gKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogLS0gaG9sZSAtLSAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAvKiAtLSBob2xlIC0tICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX3NldF9yYXRlLCAgICAgICAgIC8qIFNJT0NTSVdSQVRFICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX2dldF9yYXRlLCAgICAgICAgIC8qIFNJT0NHSVdSQVRFICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX3NldF9ydHNfdGhyZXNob2xkLC8qIFNJT0NTSVdSVFMgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X3J0c190aHJlc2hvbGQsLyogU0lPQ0dJV1JUUyAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXRlJBRyAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXRlJBRyAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXVFhQT1cgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X3R4X3Bvd2VyLCAgICAgLyogU0lPQ0dJV1RYUE9XICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdSRVRSWSAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXUkVUUlkgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3Nfc2V0X2VuY29kZSwgICAgICAgLyogU0lPQ1NJV0VOQ09ERSAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19nZXRfZW5jb2RlLCAgICAgICAvKiBTSU9DR0lXRU5DT0RFICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX3NldF9wb3dlciwgICAgICAgIC8qIFNJT0NTSVdQT1dFUiAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19nZXRfcG93ZXIsICAgICAgICAvKiBTSU9DR0lXUE9XRVIgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogLS0gaG9sZSAtLSAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAvKiAtLSBob2xlIC0tICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX2dldF9nZW5pZSwgICAgICAgIC8qIFNJT0NTSVdHRU5JRSAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXR0VOSUUgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3Nfc2V0X2F1dGgsICAgICAgICAgLyogU0lPQ1NJV0FVVEggKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV0FVVEggKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3Nfc2V0X2VuY29kZWV4dCwgICAgLyogU0lPQ1NJV0VOQ09ERUVYVCAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXRU5DT0RFRVhUICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdQTUtTQSAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAvKiAtLSBob2xlIC0tICovCit9OworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlciB3bF9wcml2YXRlX2hhbmRsZXJbXSA9Cit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NJV0ZJUlNUUFJJViArICovCisgICAgICAgICAgICAgICAgd3ZsYW5fc2V0X25ldG5hbWUsICAgICAgICAgICAgICAgICAgICAgIC8qIDA6IFNJT0NTSVdORVROQU1FICovCisgICAgICAgICAgICAgICAgd3ZsYW5fZ2V0X25ldG5hbWUsICAgICAgICAgICAgICAgICAgICAgIC8qIDE6IFNJT0NHSVdORVROQU1FICovCisgICAgICAgICAgICAgICAgd3ZsYW5fc2V0X3N0YXRpb25fbmlja25hbWUsICAgICAgICAgICAgIC8qIDI6IFNJT0NTSVdTVEFOQU1FICovCisgICAgICAgICAgICAgICAgd3ZsYW5fZ2V0X3N0YXRpb25fbmlja25hbWUsICAgICAgICAgICAgIC8qIDM6IFNJT0NHSVdTVEFOQU1FICovCisjaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9TVEEKKyAgICAgICAgICAgICAgICB3dmxhbl9zZXRfcG9ydHR5cGUsICAgICAgICAgICAgICAgICAgICAgLyogNDogU0lPQ1NJV1BPUlRUWVBFICovCisgICAgICAgICAgICAgICAgd3ZsYW5fZ2V0X3BvcnR0eXBlLCAgICAgICAgICAgICAgICAgICAgIC8qIDU6IFNJT0NHSVdQT1JUVFlQRSAqLworI2VuZGlmCit9OworCitzdHJ1Y3QgaXdfcHJpdl9hcmdzIHdsX3ByaXZfYXJnc1tdID0geworICAgICAgICB7U0lPQ1NJV05FVE5BTUUsICAgIElXX1BSSVZfVFlQRV9DSEFSIHwgSENGX01BWF9OQU1FX0xFTiwgMCwgInNuZXR3b3JrX25hbWUiIH0sCisgICAgICAgIHtTSU9DR0lXTkVUTkFNRSwgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBIQ0ZfTUFYX05BTUVfTEVOLCAgICAiZ25ldHdvcmtfbmFtZSIgfSwKKyAgICAgICAge1NJT0NTSVdTVEFOQU1FLCAgICBJV19QUklWX1RZUEVfQ0hBUiB8IEhDRl9NQVhfTkFNRV9MRU4sIDAsICJzc3RhdGlvbl9uYW1lIiB9LAorICAgICAgICB7U0lPQ0dJV1NUQU5BTUUsIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSENGX01BWF9OQU1FX0xFTiwgICAgImdzdGF0aW9uX25hbWUiIH0sCisjaWYgMSAvLzs/ICNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfU1RBCisgICAgICAgIHtTSU9DU0lXUE9SVFRZUEUsICAgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic3BvcnRfdHlwZSIgfSwKKyAgICAgICAge1NJT0NHSVdQT1JUVFlQRSwgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICAgICJncG9ydF90eXBlIiB9LAorI2VuZGlmCit9OworCitjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgd2xfaXdfaGFuZGxlcl9kZWYgPQoreworICAgICAgICAubnVtX3ByaXZhdGUgICAgICAgID0gc2l6ZW9mKHdsX3ByaXZhdGVfaGFuZGxlcikgLyBzaXplb2YoaXdfaGFuZGxlciksCisgICAgICAgIC5wcml2YXRlICAgICAgICAgICAgPSAoaXdfaGFuZGxlciAqKSB3bF9wcml2YXRlX2hhbmRsZXIsCisgICAgICAgIC5wcml2YXRlX2FyZ3MgICAgICAgPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKSB3bF9wcml2X2FyZ3MsCisgICAgICAgIC5udW1fcHJpdmF0ZV9hcmdzICAgPSBzaXplb2Yod2xfcHJpdl9hcmdzKSAvIHNpemVvZihzdHJ1Y3QgaXdfcHJpdl9hcmdzKSwKKyAgICAgICAgLm51bV9zdGFuZGFyZCAgICAgICA9IHNpemVvZih3bF9oYW5kbGVyKSAvIHNpemVvZihpd19oYW5kbGVyKSwKKyAgICAgICAgLnN0YW5kYXJkICAgICAgICAgICA9IChpd19oYW5kbGVyICopIHdsX2hhbmRsZXIsCisgICAgICAgIC5nZXRfd2lyZWxlc3Nfc3RhdHMgPSB3bF9nZXRfd2lyZWxlc3Nfc3RhdHMsCit9OworCisjZW5kaWYgLy8gV0lSRUxFU1NfRVhUCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF93ZXh0LmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF93ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlkMzlhNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3dleHQuaApAQCAtMCwwICsxLDk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBXaXJlbGVzcyBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAod2xhZ3M0OSkuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBodHRwOi8vd3d3LmFnZXJlLmNvbQorICoKKyAqIEluaXRpYWxseSBkZXZlbG9wZWQgYnkgVHJpcGxlUG9pbnQsIEluYy4KKyAqICAgaHR0cDovL3d3dy50cmlwbGVwb2ludC5jb20KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgSGVhZGVyIGRlc2NyaWJpbmcgaW5mb3JtYXRpb24gcmVxdWlyZWQgZm9yIHRoZSB3aXJlbGVzcyBJT0NUTCBoYW5kbGVycy4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNPRlRXQVJFIExJQ0VOU0UKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisgKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fV0xfV0VYVF9IX18KKyNkZWZpbmUgX19XTF9XRVhUX0hfXworCisKKyNpZmRlZiBXSVJFTEVTU19FWFQKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGZ1bmN0aW9uIHByb3RveXBlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGl3X3N0YXRpc3RpY3MgKndsX3dpcmVsZXNzX3N0YXRzKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKK3N0cnVjdCBpd19zdGF0aXN0aWNzICogd2xfZ2V0X3dpcmVsZXNzX3N0YXRzKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKK2lubGluZSB2b2lkIHdsX3NweV9nYXRoZXIgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfY2hhciAqbWFjKTsKKwordm9pZCB3bF93ZXh0X2V2ZW50X2ZyZXEoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKK3ZvaWQgd2xfd2V4dF9ldmVudF9tb2RlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7Cit2b2lkIHdsX3dleHRfZXZlbnRfZXNzaWQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKK3ZvaWQgd2xfd2V4dF9ldmVudF9lbmNvZGUoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKK3ZvaWQgd2xfd2V4dF9ldmVudF9hcCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOwordm9pZCB3bF93ZXh0X2V2ZW50X3NjYW5fY29tcGxldGUoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKK3ZvaWQgd2xfd2V4dF9ldmVudF9uZXdfc3RhKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7Cit2b2lkIHdsX3dleHRfZXZlbnRfZXhwaXJlZF9zdGEoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKK3ZvaWQgd2xfd2V4dF9ldmVudF9taWNfZmFpbGVkKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7Cit2b2lkIHdsX3dleHRfZXZlbnRfYXNzb2NfaWUoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiB3bF9pd19oYW5kbGVyX2RlZjsKKworI2Vsc2UKKyNlcnJvciBXSVJFTEVTU19FWFQKKyNlbmRpZiAvLyBXSVJFTEVTU19FWFQKKworCisjZW5kaWYgIC8vIF9fV0xfV0VYVF9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0YThjOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9LY29uZmlnCkBAIC0wLDAgKzEsOSBAQAorY29uZmlnIFdMQUdTNDlfSDI1CisJdHJpc3RhdGUgIkxpbmtzeXMgSEVSTUVTIElJLjUgV0NGNTRHX1dpcmVsZXNzLUdfQ29tcGFjdEZsYXNoX0NhcmQiCisJZGVwZW5kcyBvbiBXTEFOXzgwMjExICYmIFdJUkVMRVNTX0VYVCAmJiBQQ01DSUEKKwlzZWxlY3QgV0VYVF9TUFkKKwktLS1oZWxwLS0tCisJICBEcml2ZXIgZm9yIHdpcmVsZXNzIGNhcmRzIHVzaW5nIEFnZXJlJ3MgSEVSTUVTIElJLjUgY2hpcHNldAorCSAgd2hpY2ggYXJlIGlkZW50aWZpZWQgd2l0aCBNYW51ZmFjdHVyZSBJRDogMDE1NiwwMDA0CisJICBUaGUgc29mdHdhcmUgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHdsX2xrbV83MjJfYWJnLnRhci5negorCSAgZnJvbSB0aGUgQWdlcmUgU3lzdGVtcyB3ZWJzaXRlLCBhZGRhcHRlZCBmb3IgVWJ1bnR1IDkuMDQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBiMjNkNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9NYWtlZmlsZQpAQCAtMCwwICsxLDgxIEBACisjCisjIE1ha2VmaWxlIGZvciB3bGFnczQ5X2gyX2NzLmtvIGFuZCB3bGFnczQ5X2gyNV9jcy5rbworIworIyBEZWZhdWx0IGJ1aWxkIGZvciBIZXJtZXMtSUkgYmFzZSBjYXJkcyAocG9zc2libHkgaWRlbnRpZmllZCB3aXRoCisjICJtYW5maWQ6IDB4MDE1NiwgMHgwMDAzIiBpbiAicGNjYXJkY3RsIGlkZW50IiBvdXRwdXQpLCBjb21tZW50CisjIC1ESEVSTUVTMjUgYmVsb3cKKyMKKyMgSWYgeW91IHdhbnQgdG8gYnVpbGQgZm9yIEhlcm1lcy1JSS41IGJhc2UgY2FyZHMgKHBvc3NpYmx5IGlkZW50aWZpZWQgd2l0aAorIyAibWFuZmlkOiAweDAxNTYsIDB4MDAwNCIgaW4gInBjY2FyZGN0bCBpZGVudCIgb3V0cHV0KSwgdW5jb21tZW50CisjIC1ESEVSTUVTMjUgYmVsb3cKKyMKKyMgIElmIHlvdSB3YW50IHRvIGJ1aWxkIEFQIHN1cHBvcnQgKHVudGVzdGVkKSwgY29tbWVudCBvdXQgLURTVEFfT05MWQorCitJTlNUQUxMRElSIDo9IC9saWIvbW9kdWxlcy8kKHNoZWxsIHVuYW1lIC1yKS9rZXJuZWwvZHJpdmVycy9uZXQvd2lyZWxlc3MKK0VYVFJBX0NGTEFHUyArPSAtSSQoS0VSTkVMRElSKS9pbmNsdWRlCitFWFRSQV9DRkxBR1MgKz0gLUkkKHNyYykgXAorCQktREJVU19QQ01DSUEgXAorCQktRFVTRV9XUEEgXAorCQktRFVTRV9XRVhUIFwKKwkJLURTVEFfT05MWSBcCisJCS1EV1ZMQU5fNDkgXAorCQktREhFUk1FUzI1IFwKKyMJCS1EREJHIFwKKyMJCS1EREJHX0xWTD01IFwKKyMJCS1EVVNFX1VJTCBcCisjCQktRFVTRV9QUk9GSUxFIFwKKworaWZlcSAoJChmaW5kc3RyaW5nIEhFUk1FUzI1LCQoRVhUUkFfQ0ZMQUdTKSksKQorV0xOQU1FIDo9IHdsYWdzNDlfaDJfY3MKKyQoV0xOQU1FKS15IDo9IHN0YV9oMi5vCitpZmVxICgkKGZpbmRzdHJpbmcgU1RBX09OTFksJChFWFRSQV9DRkxBR1MpKSwpCiskKFdMTkFNRSkteSArPSBhcF9oMi5vCitlbmRpZgorZWxzZQorV0xOQU1FPXdsYWdzNDlfaDI1X2NzCiskKFdMTkFNRSkteSA6PSBzdGFfaDI1Lm8KK2lmZXEgKCQoZmluZHN0cmluZyBTVEFfT05MWSwkKEVYVFJBX0NGTEFHUykpLCkKKyQoV0xOQU1FKS15ICs9IGFwX2gyNS5vCitlbmRpZgorZW5kaWYKKworIyBJZiBLRVJORUxSRUxFQVNFIGlzIGRlZmluZWQsIHdlJ3ZlIGJlZW4gaW52b2tlZCBmcm9tIHRoZQorIyBrZXJuZWwgYnVpbGQgc3lzdGVtIGFuZCBjYW4gdXNlIGl0cyBsYW5ndWFnZS4KK2lmbmVxICgkKEtFUk5FTFJFTEVBU0UpLCkKKworb2JqLW0JCSs9ICQoV0xOQU1FKS5vCisKKyQoV0xOQU1FKS15ICs9CXdsX3Byb2ZpbGUubyBcCisJCXdsX3dleHQubyBcCisJCXdsX3ByaXYubyBcCisJCXdsX21haW4ubyBcCisJCXdsX2VuYy5vIFwKKwkJd2xfdXRpbC5vIFwKKwkJd2xfbmV0ZGV2Lm8gXAorCQl3bF9jcy5vIFwKKwkJbW1kLm8gXAorCQloY2YubyBcCisJCWRoZi5vCisKKyQoV0xOQU1FKS0kKENPTkZJR19TWVNGUykJKz0gd2xfc3lzZnMubworCisjIE90aGVyd2lzZSB3ZSB3ZXJlIGNhbGxlZCBkaXJlY3RseSBmcm9tIHRoZSBjb21tYW5kCisjIGxpbmU7IGludm9rZSB0aGUga2VybmVsIGJ1aWxkIHN5c3RlbS4KK2Vsc2UKKwlLRVJORUxESVIgPz0gL2xpYi9tb2R1bGVzLyQoc2hlbGwgdW5hbWUgLXIpL2J1aWxkCisJUFdEIDo9ICQoc2hlbGwgcHdkKQorCitkZWZhdWx0OgorCSQoTUFLRSkgLUMgJChLRVJORUxESVIpIE09JChQV0QpIG1vZHVsZXMKK2VuZGlmCisKK2NsZWFuOgorCXJtIC1mciAqLm8gKi5rbyAqLm1vZC5jICoubW9kLm8gLiouKi5jbWQgTW9kdWxlLnN5bXZlcnMgXAorCQlNb2R1bGUubWFya2VycyBtb2R1bGVzLm9yZGVyIC50bXBfdmVyc2lvbnMKKworaW5zdGFsbDogZGVmYXVsdAorCS1ybW1vZCAkKFdMTkFNRSkKKwlpbnN0YWxsIC1kICQoSU5TVEFMTERJUikKKwlpbnN0YWxsIC1tIDA2NDQgLW8gcm9vdCAtZyByb290ICQoV0xOQU1FKS5rbyAkKElOU1RBTExESVIpCisJL3NiaW4vZGVwbW9kIC1hcQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvUkVBRE1FLnR4dCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjN2E4MzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvUkVBRE1FLnR4dApAQCAtMCwwICsxLDMwIEBACis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorV0xBTiBkcml2ZXIgZm9yIGNhcmRzIHVzaW5nIHRoZSBIRVJNRVMgSUkgYW5kIEhFUk1FUyBJSS41IGNoaXBzZXQKKworSEVSTUVTIElJIENhcmQKKworUENNQ0lBIEluZm86ICJBZ2VyZSBTeXN0ZW1zIiAiV2lyZWxlc3MgUEMgQ2FyZCBNb2RlbCAwMTEwIgorICAgICAgICAgICAgIE1hbnVmYWN0dXJlIElEOiAwMTU2LDAwMDMKKworSEVSTUVTIElJLjUgQ2FyZAorCitQQ01DSUEgSW5mbzogIkxpbmtzeXMiICJXQ0Y1NEdfV2lyZWxlc3MtR19Db21wYWN0Rmxhc2hfQ2FyZCIKKyAgICAgICAgICAgICBNYW51ZmFjdHVyZSBJRDogMDE1NiwwMDA0CisKK0Jhc2VkIG9uIEFnZXJlIFN5c3RlbXMgTGludXggTEtNIFdpcmVsZXNzIERyaXZlciBTb3VyY2UgQ29kZSwKK1ZlcnNpb24gNy4yMjsgY29tcGxpZXMgd2l0aCBPcGVuIFNvdXJjZSBCU0QgTGljZW5zZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0RFU0NSSVBUSU9OCisKK1RoaXMgZGlyZWN0b3J5IG9ubHkgY29udGFpbnMgZmlsZXMgdGhhdCByZWZlciB0byB0aGUgc291cmNlIGluIHdsYWdzNDlfaDIuCitPbmx5IHJlYWwgc291cmNlZmlsZXMgYXJlIHRoZSBNYWtlZmlsZSB3aGljaCBoYXMgYmVlbiBjb25maWd1cmVkIHRvIGJ1aWxkCit0aGUgZHJpdmVyIGZvciB0aGUgSEVSTUVTIElJLjUgY2hpcHNldCBhbmQgS2NvbmZpZyB0byBkZXNjcmliZSB0aGUgZHJpdmVyLgorCitUaGUgd2xhZ3M0OV9oMiBkaXJlY3RvcnkgY29udGFpbnMgdGhlIGZ1bGwgc291cmNlLCBpbmNsdWRpbmcgdGhlIGZpbGVzCitleGNsdXNpdmVseSB1c2VkIGJ5IHRoaXMgZHJpdmVyLgorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZHJpdmVyIGxvb2sgYXQgdGhlIHdsYWdzNDlfaDIgZGlyZWNvcnkuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRhYTQxNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9UT0RPCkBAIC0wLDAgKzEsMzMgQEAKK0ZpcnN0IG9mIGFsbCwgdGhlIGJlc3QgdGhpbmcgd291bGQgYmUgdGhhdCB0aGlzIGRyaXZlciBiZWNvbWVzIG9ic29sdGUgYnkKK2FkZGluZyBzdXBwb3J0IGZvciBIZXJtZXMgSUkgYW5kIEhlcm1lcyBJSS41IGNhcmRzIHRvIHRoZSBleGlzdGluZyBvcmlub2NvCitkcml2ZXIuIFRoZSBvcmlub2NvIGRyaXZlciBjdXJyZW50bHkgb25seSBzdXBwb3J0cyBIZXJtZXMgSSBiYXNlZCBjYXJkcy4KK1NpbmNlIHRoaXMgd2lsbCBub3QgaGFwcGVuIGJ5IG1hZ2ljIGFuZCBoYXMgbm90IGhhcHBlbmQgdW50aWwgbm93IHRoaXMKK2RyaXZlciBwcm92aWRlcyBhIHN0b3AtZ2FwIHNvbHV0aW9uIGZvciB0aGVzZSB0eXBlIG9mIGNhcmRzLgorCitIYXZpbmcgc2FpZCB0aGF0LCB0aGUgZm9sbG93aW5nIHdpc2hsaXN0IGNvbWVzIHRvIG1pbmQgdG8gbWFrZSB0aGUgZHJpdmVyCitzdWl0YWJsZSBhcyBmdWxseSBzdXBwb3J0ZWQga2VybmVsIGRyaXZlci4gRmVlbCBmcmVlIHRvIGV4cGFuZC9lbmhhbmNlIHRoZQorbGlzdC4KKworVE9ETzoKKwktIHZlcmlmeSBhZ2FpbnN0IGEgSGVybWVzIElJLjUgY2FyZAorCS0gdmVyaWZ5IHdpdGggV1BBIGVuY3JpcHRpb24gKGJvdGggd2l0aCBIMiBhbmQgSDIuNSBjYXJkcykKKwktIHNvbWV0aW1lcyB0aGUgY2FyZCBkb2VzIG5vdCBpbml0aWFsaXplIGNvcnJlY3RseSwgcmV0cnkgbWVjaGFuaXNtcworCSAgYXJlIGJ1aWxkIGluIHRvIGNhdGNoIG1vc3QgY2FzZXMgYnV0IG5vdCBhbGwKKwktIG9uY2UgdGhlIGRyaXZlciBydW5zIGl0IGlzIHZlcnkgc3RhYmxlLCBidXQgSSBoYXZlIHRoZSBpbXByZXNzaW9uCisJICBzb21lIHRoZSBjcml0dGljYWwgc2VjdGlvbnMgdGFrZSB0byBsb25nCisJLSB0aGUgZHJpdmVyIGlzIHNwbGl0IGludG8gYSBIZXJtZXMgSUkgYW5kIGEgSGVybWVzIElJLjUgcGFydCwgaXQKKwkgIHdvdWxkIGJlIG5pY2UgdG8gaGFuZGxlIGJvdGggd2l0aCBvbmUgbW9kdWxlIGluc3RlYWQgb2YgdHdvCisJLSByZXZpZXcgYnkgdGhlIHdpcmVsZXNzIGRldmVsb3BlciBjb21tdW5pdHkKKwktIHZlcmlmeSB0aGUgY29kZSBhZ2FpbnN0IHRoZSBjb2Rpbmcgc3RhbmRhcmRzIGZvciBhIHByb3BwZXIgbGludXgKKwkgIGRyaXZlcgorCS0gcmVzb2x2ZSBsaWNlbnNlIGlzc3VlcyAoPykKKworRE9ORToKKwktIHZlcmlmaWVkIGFnYWluc3QgYSBIZXJtZXMgSUkgY2FyZCAoVGhvbXNvbiBTcGVlZHRvdWNoIDExMCBQQ01DSUEKKwkgIGNhcmQpCisJLSB2ZXJpZmllZCB3aXRoIFdFUCBlbmNyaXB0aW9uCisKK1BsZWFzZSBzZW5kIGFueSBwYXRjaGVzIG9yIGNvbXBsYWludHMgYWJvdXQgdGhpcyBkcml2ZXIgdG8gR3JlZworS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IGFuZCBDYzogSGVuayBkZSBHcm9vdCA8cGUxZG5uQGFtc2F0Lm9yZz4KK0Rvbid0IGJvdGhlciB0aGUgdXBzdHJlYW0gd2lyZWxlc3Mga2VybmVsIGRldmVsb3BlcnMgYWJvdXQgaXQsIHRoZXkKK3dhbnQgbm90aGluZyB0byBkbyB3aXRoIGl0LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L2FwX2gyNS5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L2FwX2gyNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNDRmYTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvYXBfaDI1LmMKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL2FwX2gyNS5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L2RlYnVnLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWZiMTM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L2RlYnVnLmgKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL2RlYnVnLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvZGhmLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvZGhmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE3NjJjOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9kaGYuYwpAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvZGhmLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvZGhmLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvZGhmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQxODFkYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9kaGYuaApAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvZGhmLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvZGhmY2ZnLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvZGhmY2ZnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4NmUzOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9kaGZjZmcuaApAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvZGhmY2ZnLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvaGNmLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvaGNmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVlYmExZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9oY2YuYwpAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvaGNmLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvaGNmLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvaGNmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDExNDNkOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9oY2YuaApAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvaGNmLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvaGNmY2ZnLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvaGNmY2ZnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg4YzRiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9oY2ZjZmcuaApAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvaGNmY2ZnLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvaGNmZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvaGNmZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhMDA2MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9oY2ZkZWYuaApAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvaGNmZGVmLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvbWRkLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvbWRkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ4ZTE0MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9tZGQuaApAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvbWRkLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvbW1kLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvbW1kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIwNzgyZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9tbWQuYwpAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvbW1kLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvbW1kLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvbW1kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI4NGRkOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9tbWQuaApAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvbW1kLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvc3RhX2gyNS5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3N0YV9oMjUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2M3NmJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3N0YV9oMjUuYwpAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvc3RhX2gyNS5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX2NzLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmUxZjE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX2NzLmMKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL3dsX2NzLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfY3MuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9jcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1N2FjZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfY3MuaApAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvd2xfY3MuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9lbmMuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTU5ZGYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX2VuYy5jCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi93bF9lbmMuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9lbmMuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9lbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmU4NjBlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX2VuYy5oCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi93bF9lbmMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9pZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX2lmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBkODZmMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9pZi5oCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi93bF9pZi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTY4N2EzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX2ludGVybmFsLmgKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL3dsX2ludGVybmFsLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmMwNmFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX21haW4uYwpAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvd2xfbWFpbi5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX21haW4uaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk4Mzc2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9tYWluLmgKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL3dsX21haW4uaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9uZXRkZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9uZXRkZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzUxMmMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX25ldGRldi5jCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi93bF9uZXRkZXYuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9uZXRkZXYuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9uZXRkZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTljZDVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX25ldGRldi5oCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi93bF9uZXRkZXYuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9wcml2LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfcHJpdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MGM4MDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfcHJpdi5jCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi93bF9wcml2LmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfcHJpdi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3ByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODQ5MmIzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3ByaXYuaApAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvd2xfcHJpdi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3Byb2ZpbGUuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9wcm9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJhYTIwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9wcm9maWxlLmMKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL3dsX3Byb2ZpbGUuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9wcm9maWxlLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfcHJvZmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMjUzYTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfcHJvZmlsZS5oCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi93bF9wcm9maWxlLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfc3lzZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9zeXNmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NThlZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfc3lzZnMuYwpAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvd2xfc3lzZnMuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9zeXNmcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3N5c2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI4MTlhNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9zeXNmcy5oCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi93bF9zeXNmcy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3V0aWwuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcxYmViZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF91dGlsLmMKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL3dsX3V0aWwuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF91dGlsLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZDc0ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfdXRpbC5oCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi93bF91dGlsLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfdmVyc2lvbi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDM4ZThmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3ZlcnNpb24uaApAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvd2xfdmVyc2lvbi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3dleHQuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF93ZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY2MGU3OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF93ZXh0LmMKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL3dsX3dleHQuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF93ZXh0LmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfd2V4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZDYzODYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfd2V4dC5oCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi93bF93ZXh0LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9LY29uZmlnIGIvZHJpdmVycy91c2IvS2NvbmZpZwppbmRleCAyNDA3NTA4Li44MWFhYzdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL0tjb25maWcKQEAgLTYwLDYgKzYwLDggQEAKIAlkZWZhdWx0IHkgaWYgQVJDSF9JWFA0WFgKIAlkZWZhdWx0IHkgaWYgQVJDSF9XOTBYOTAwCiAJZGVmYXVsdCB5IGlmIEFSQ0hfQVQ5MVNBTTlHNDUKKwlkZWZhdWx0IHkgaWYgQVJDSF9NWEMKKwlkZWZhdWx0IHkgaWYgQVJDSF9PTUFQMzRYWAogCWRlZmF1bHQgUENJCiAKICMgQVJNIFNBMTExMSBjaGlwcyBoYXZlIGEgbm9uLVBDSSBiYXNlZCAiT0hDSS1jb21wYXRpYmxlIiBVU0IgaG9zdCBpbnRlcmZhY2UuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL01ha2VmaWxlCmluZGV4IGJlM2M5YjguLjQ3M2FhMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL01ha2VmaWxlCkBAIC00NCwzICs0NCw1IEBACiAKIG9iai0kKENPTkZJR19VU0JfQVRNKQkJKz0gYXRtLwogb2JqLSQoQ09ORklHX1VTQl9TUEVFRFRPVUNIKQkrPSBhdG0vCisKK29iai0kKENPTkZJR19VU0JfVUxQSSkJCSs9IG90Zy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMgYi9kcml2ZXJzL3VzYi9hdG0vdWVhZ2xlLWF0bS5jCmluZGV4IGJiYTRkM2UuLmM1Mzk1MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMKKysrIGIvZHJpdmVycy91c2IvYXRtL3VlYWdsZS1hdG0uYwpAQCAtNjY3LDEyICs2NjcsMTIgQEAKIAllbHNlCiAJCXVlYV9pbmZvKHVzYiwgImZpcm13YXJlIHVwbG9hZGVkXG4iKTsKIAotCXVlYV9sZWF2ZXModXNiKTsKLQlyZXR1cm47CisJZ290byBlcnI7CiAKIGVycl9md19jb3JydXB0ZWQ6CiAJdWVhX2Vycih1c2IsICJmaXJtd2FyZSBpcyBjb3JydXB0ZWRcbiIpOwogZXJyOgorCXJlbGVhc2VfZmlybXdhcmUoZndfZW50cnkpOwogCXVlYV9sZWF2ZXModXNiKTsKIH0KIApAQCAtNzA1LDcgKzcwNSw4IEBACiAJCWJyZWFrOwogCX0KIAotCXJldCA9IHJlcXVlc3RfZmlybXdhcmVfbm93YWl0KFRISVNfTU9EVUxFLCAxLCBmd19uYW1lLCAmdXNiLT5kZXYsIHVzYiwgdWVhX3VwbG9hZF9wcmVfZmlybXdhcmUpOworCXJldCA9IHJlcXVlc3RfZmlybXdhcmVfbm93YWl0KFRISVNfTU9EVUxFLCAxLCBmd19uYW1lLCAmdXNiLT5kZXYsCisJCQkJICAgICAgR0ZQX0tFUk5FTCwgdXNiLCB1ZWFfdXBsb2FkX3ByZV9maXJtd2FyZSk7CiAJaWYgKHJldCkKIAkJdWVhX2Vycih1c2IsICJmaXJtd2FyZSAlcyBpcyBub3QgYXZhaWxhYmxlXG4iLCBmd19uYW1lKTsKIAllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMgYi9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMKaW5kZXggZTRlY2E3OC4uMzRkNGViOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jCisrKyBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYwpAQCAtMTQ2MSw2ICsxNDYxLDEyIEBACiB9CiAKICNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworI2RlZmluZSBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKHgpIFwKKwkJVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oMHgwNDIxLCB4LCBcCisJCVVTQl9DTEFTU19DT01NLCBVU0JfQ0RDX1NVQkNMQVNTX0FDTSwgXAorCQlVU0JfQ0RDX0FDTV9QUk9UT19WRU5ET1IpCisKIC8qCiAgKiBVU0IgZHJpdmVyIHN0cnVjdHVyZS4KICAqLwpAQCAtMTUxOSw2ICsxNTI1LDU3IEBACiAJLmRyaXZlcl9pbmZvID0gTk9fVU5JT05fTk9STUFMLCAvKiByZXBvcnRzIHplcm8gbGVuZ3RoIGRlc2NyaXB0b3IgKi8KIAl9LAogCisJLyogTm9raWEgUzYwIHBob25lcyBleHBvc2UgdHdvIEFDTSBjaGFubmVscy4gVGhlIGZpcnN0IGlzCisJICogYSBtb2RlbSBhbmQgaXMgcGlja2VkIHVwIGJ5IHRoZSBzdGFuZGFyZCBBVC1jb21tYW5kCisJICogaW5mb3JtYXRpb24gYmVsb3cuIFRoZSBzZWNvbmQgaXMgJ3ZlbmRvci1zcGVjaWZpYycgYnV0CisJICogaXMgdHJlYXRlZCBhcyBhIHNlcmlhbCBkZXZpY2UgYXQgdGhlIFM2MCBlbmQsIHNvIHdlIHdhbnQKKwkgKiB0byBleHBvc2UgaXQgb24gTGludXggdG9vLiAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDA0MkQpLCB9LCAvKiBOb2tpYSAzMjUwICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDREOCksIH0sIC8qIE5va2lhIDU1MDAgU3BvcnQgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwNEM5KSwgfSwgLyogTm9raWEgRTUwICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDQxOSksIH0sIC8qIE5va2lhIEU2MCAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDA0NEQpLCB9LCAvKiBOb2tpYSBFNjEgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwMDAxKSwgfSwgLyogTm9raWEgRTYxaSAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDA0NzUpLCB9LCAvKiBOb2tpYSBFNjIgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwNTA4KSwgfSwgLyogTm9raWEgRTY1ICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDQxOCksIH0sIC8qIE5va2lhIEU3MCAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDA0MjUpLCB9LCAvKiBOb2tpYSBONzEgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwNDg2KSwgfSwgLyogTm9raWEgTjczICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDRERiksIH0sIC8qIE5va2lhIE43NSAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDAwMGUpLCB9LCAvKiBOb2tpYSBONzcgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwNDQ1KSwgfSwgLyogTm9raWEgTjgwICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDQyRiksIH0sIC8qIE5va2lhIE45MSAmIE45MSA4R0IgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwNDhFKSwgfSwgLyogTm9raWEgTjkyICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDQyMCksIH0sIC8qIE5va2lhIE45MyAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDA0RTYpLCB9LCAvKiBOb2tpYSBOOTNpICAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDA0QjIpLCB9LCAvKiBOb2tpYSA1NzAwIFhwcmVzc011c2ljICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDEzNCksIH0sIC8qIE5va2lhIDYxMTAgTmF2aWdhdG9yIChDaGluYSkgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwNDZFKSwgfSwgLyogTm9raWEgNjExMCBOYXZpZ2F0b3IgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwMDJmKSwgfSwgLyogTm9raWEgNjEyMCBjbGFzc2ljICYgICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDA4OCksIH0sIC8qIE5va2lhIDYxMjEgY2xhc3NpYyAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDAwZmMpLCB9LCAvKiBOb2tpYSA2MTI0IGNsYXNzaWMgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwMDQyKSwgfSwgLyogTm9raWEgRTUxICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDBiMCksIH0sIC8qIE5va2lhIEU2NiAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDAwYWIpLCB9LCAvKiBOb2tpYSBFNzEgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwNDgxKSwgfSwgLyogTm9raWEgTjc2ICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDAwNyksIH0sIC8qIE5va2lhIE44MSAmIE44MSA4R0IgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwMDcxKSwgfSwgLyogTm9raWEgTjgyICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDRGMCksIH0sIC8qIE5va2lhIE45NSAmIE45NS0zIE5BTSAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDAwNzApLCB9LCAvKiBOb2tpYSBOOTUgOEdCICAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDAwZTkpLCB9LCAvKiBOb2tpYSA1MzIwIFhwcmVzc011c2ljICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDA5OSksIH0sIC8qIE5va2lhIDYyMTAgTmF2aWdhdG9yLCBSTS0zNjcgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwMTI4KSwgfSwgLyogTm9raWEgNjIxMCBOYXZpZ2F0b3IsIFJNLTQxOSAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDAwOGYpLCB9LCAvKiBOb2tpYSA2MjIwIENsYXNzaWMgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwMGEwKSwgfSwgLyogTm9raWEgNjY1MCAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDAwN2IpLCB9LCAvKiBOb2tpYSBONzggKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwMDk0KSwgfSwgLyogTm9raWEgTjg1ICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDAzYSksIH0sIC8qIE5va2lhIE45NiAmIE45Ni0zICAqLworCXsgTk9LSUFfUENTVUlURV9BQ01fSU5GTygweDAwZTkpLCB9LCAvKiBOb2tpYSA1MzIwIFhwcmVzc011c2ljICovCisJeyBOT0tJQV9QQ1NVSVRFX0FDTV9JTkZPKDB4MDEwOCksIH0sIC8qIE5va2lhIDUzMjAgWHByZXNzTXVzaWMgMkcgKi8KKwl7IE5PS0lBX1BDU1VJVEVfQUNNX0lORk8oMHgwMWY1KSwgfSwgLyogTm9raWEgTjk3LCBSTS01MDUgKi8KKworCS8qIE5PVEU6IG5vbi1Ob2tpYSBDT01NL0FDTS8weGZmIGlzIGxpa2VseSBNU0ZUIFJORElTLi4uIE5PVCBhIG1vZGVtISAqLworCiAJLyogY29udHJvbCBpbnRlcmZhY2VzIHdpdGggdmFyaW91cyBBVC1jb21tYW5kIHNldHMgKi8KIAl7IFVTQl9JTlRFUkZBQ0VfSU5GTyhVU0JfQ0xBU1NfQ09NTSwgVVNCX0NEQ19TVUJDTEFTU19BQ00sCiAJCVVTQl9DRENfQUNNX1BST1RPX0FUX1YyNVRFUikgfSwKQEAgLTE1MzMsNyArMTU5MCw2IEBACiAJeyBVU0JfSU5URVJGQUNFX0lORk8oVVNCX0NMQVNTX0NPTU0sIFVTQl9DRENfU1VCQ0xBU1NfQUNNLAogCQlVU0JfQ0RDX0FDTV9QUk9UT19BVF9DRE1BKSB9LAogCi0JLyogTk9URTogIENPTU0vQUNNLzB4ZmYgaXMgbGlrZWx5IE1TRlQgUk5ESVMgLi4uIE5PVCBhIG1vZGVtISEgKi8KIAl7IH0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NsYXNzL3VzYnRtYy5jIGIvZHJpdmVycy91c2IvY2xhc3MvdXNidG1jLmMKaW5kZXggYjRiZDI0MS4uN2M1ZjRlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2xhc3MvdXNidG1jLmMKKysrIGIvZHJpdmVycy91c2IvY2xhc3MvdXNidG1jLmMKQEAgLTM0NywxMyArMzQ3LDggQEAKIAlnb3RvIGV4aXQ7CiAKIHVzYnRtY19hYm9ydF9idWxrX291dF9jbGVhcl9oYWx0OgotCXJ2ID0gdXNiX2NvbnRyb2xfbXNnKGRhdGEtPnVzYl9kZXYsCi0JCQkgICAgIHVzYl9zbmRjdHJscGlwZShkYXRhLT51c2JfZGV2LCAwKSwKLQkJCSAgICAgVVNCX1JFUV9DTEVBUl9GRUFUVVJFLAotCQkJICAgICBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1NUQU5EQVJEIHwKLQkJCSAgICAgVVNCX1JFQ0lQX0VORFBPSU5ULAotCQkJICAgICBVU0JfRU5EUE9JTlRfSEFMVCwgZGF0YS0+YnVsa19vdXQsIGJ1ZmZlciwKLQkJCSAgICAgMCwgVVNCVE1DX1RJTUVPVVQpOworCXJ2ID0gdXNiX2NsZWFyX2hhbHQoZGF0YS0+dXNiX2RldiwKKwkJCSAgICB1c2Jfc25kYnVsa3BpcGUoZGF0YS0+dXNiX2RldiwgZGF0YS0+YnVsa19vdXQpKTsKIAogCWlmIChydiA8IDApIHsKIAkJZGV2X2VycihkZXYsICJ1c2JfY29udHJvbF9tc2cgcmV0dXJuZWQgJWRcbiIsIHJ2KTsKQEAgLTU2MiwxMCArNTU3LDE2IEBACiAJCW5fYnl0ZXMgPSByb3VuZHVwKDEyICsgdGhpc19wYXJ0LCA0KTsKIAkJbWVtc2V0KGJ1ZmZlciArIDEyICsgdGhpc19wYXJ0LCAwLCBuX2J5dGVzIC0gKDEyICsgdGhpc19wYXJ0KSk7CiAKLQkJcmV0dmFsID0gdXNiX2J1bGtfbXNnKGRhdGEtPnVzYl9kZXYsCi0JCQkJICAgICAgdXNiX3NuZGJ1bGtwaXBlKGRhdGEtPnVzYl9kZXYsCi0JCQkJCQkgICAgICBkYXRhLT5idWxrX291dCksCi0JCQkJICAgICAgYnVmZmVyLCBuX2J5dGVzLCAmYWN0dWFsLCBVU0JUTUNfVElNRU9VVCk7CisJCWRvIHsKKwkJCXJldHZhbCA9IHVzYl9idWxrX21zZyhkYXRhLT51c2JfZGV2LAorCQkJCQkgICAgICB1c2Jfc25kYnVsa3BpcGUoZGF0YS0+dXNiX2RldiwKKwkJCQkJCQkgICAgICBkYXRhLT5idWxrX291dCksCisJCQkJCSAgICAgIGJ1ZmZlciwgbl9ieXRlcywKKwkJCQkJICAgICAgJmFjdHVhbCwgVVNCVE1DX1RJTUVPVVQpOworCQkJaWYgKHJldHZhbCAhPSAwKQorCQkJCWJyZWFrOworCQkJbl9ieXRlcyAtPSBhY3R1YWw7CisJCX0gd2hpbGUgKG5fYnl0ZXMpOwogCiAJCWRhdGEtPmJUYWdfbGFzdF93cml0ZSA9IGRhdGEtPmJUYWc7CiAJCWRhdGEtPmJUYWcrKzsKQEAgLTcwMiwxNCArNzAzLDggQEAKIAogdXNidG1jX2NsZWFyX2J1bGtfb3V0X2hhbHQ6CiAKLQlydiA9IHVzYl9jb250cm9sX21zZyhkYXRhLT51c2JfZGV2LAotCQkJICAgICB1c2Jfc25kY3RybHBpcGUoZGF0YS0+dXNiX2RldiwgMCksCi0JCQkgICAgIFVTQl9SRVFfQ0xFQVJfRkVBVFVSRSwKLQkJCSAgICAgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9TVEFOREFSRCB8Ci0JCQkgICAgIFVTQl9SRUNJUF9FTkRQT0lOVCwKLQkJCSAgICAgVVNCX0VORFBPSU5UX0hBTFQsCi0JCQkgICAgIGRhdGEtPmJ1bGtfb3V0LCBidWZmZXIsIDAsCi0JCQkgICAgIFVTQlRNQ19USU1FT1VUKTsKKwlydiA9IHVzYl9jbGVhcl9oYWx0KGRhdGEtPnVzYl9kZXYsCisJCQkgICAgdXNiX3NuZGJ1bGtwaXBlKGRhdGEtPnVzYl9kZXYsIGRhdGEtPmJ1bGtfb3V0KSk7CiAJaWYgKHJ2IDwgMCkgewogCQlkZXZfZXJyKGRldiwgInVzYl9jb250cm9sX21zZyByZXR1cm5lZCAlZFxuIiwgcnYpOwogCQlnb3RvIGV4aXQ7CkBAIC03MzAsMTMgKzcyNSw4IEBACiAJaWYgKCFidWZmZXIpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcnYgPSB1c2JfY29udHJvbF9tc2coZGF0YS0+dXNiX2RldiwKLQkJCSAgICAgdXNiX3NuZGN0cmxwaXBlKGRhdGEtPnVzYl9kZXYsIDApLAotCQkJICAgICBVU0JfUkVRX0NMRUFSX0ZFQVRVUkUsCi0JCQkgICAgIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfU1RBTkRBUkQgfAotCQkJICAgICBVU0JfUkVDSVBfRU5EUE9JTlQsCi0JCQkgICAgIFVTQl9FTkRQT0lOVF9IQUxULCBkYXRhLT5idWxrX291dCwKLQkJCSAgICAgYnVmZmVyLCAwLCBVU0JUTUNfVElNRU9VVCk7CisJcnYgPSB1c2JfY2xlYXJfaGFsdChkYXRhLT51c2JfZGV2LAorCQkJICAgIHVzYl9zbmRidWxrcGlwZShkYXRhLT51c2JfZGV2LCBkYXRhLT5idWxrX291dCkpOwogCiAJaWYgKHJ2IDwgMCkgewogCQlkZXZfZXJyKCZkYXRhLT51c2JfZGV2LT5kZXYsICJ1c2JfY29udHJvbF9tc2cgcmV0dXJuZWQgJWRcbiIsCkBAIC03NTksMTIgKzc0OSw4IEBACiAJaWYgKCFidWZmZXIpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcnYgPSB1c2JfY29udHJvbF9tc2coZGF0YS0+dXNiX2RldiwgdXNiX3NuZGN0cmxwaXBlKGRhdGEtPnVzYl9kZXYsIDApLAotCQkJICAgICBVU0JfUkVRX0NMRUFSX0ZFQVRVUkUsCi0JCQkgICAgIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfU1RBTkRBUkQgfAotCQkJICAgICBVU0JfUkVDSVBfRU5EUE9JTlQsCi0JCQkgICAgIFVTQl9FTkRQT0lOVF9IQUxULCBkYXRhLT5idWxrX2luLCBidWZmZXIsIDAsCi0JCQkgICAgIFVTQlRNQ19USU1FT1VUKTsKKwlydiA9IHVzYl9jbGVhcl9oYWx0KGRhdGEtPnVzYl9kZXYsCisJCQkgICAgdXNiX3JjdmJ1bGtwaXBlKGRhdGEtPnVzYl9kZXYsIGRhdGEtPmJ1bGtfaW4pKTsKIAogCWlmIChydiA8IDApIHsKIAkJZGV2X2VycigmZGF0YS0+dXNiX2Rldi0+ZGV2LCAidXNiX2NvbnRyb2xfbXNnIHJldHVybmVkICVkXG4iLApAQCAtMTEwOSwxMyArMTA5NSwxMyBAQAogCWtyZWZfcHV0KCZkYXRhLT5rcmVmLCB1c2J0bWNfZGVsZXRlKTsKIH0KIAotc3RhdGljIGludCB1c2J0bWNfc3VzcGVuZCAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQorc3RhdGljIGludCB1c2J0bWNfc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCiB7CiAJLyogdGhpcyBkcml2ZXIgZG9lcyBub3QgaGF2ZSBwZW5kaW5nIFVSQnMgKi8KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB1c2J0bWNfcmVzdW1lIChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3N0YXRpYyBpbnQgdXNidG1jX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYyBiL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYwppbmRleCAxODFmNzhjLi42ZThiY2RmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9kZXZpby5jCkBAIC0xMzg4LDYgKzEzODgsNDYgQEAKIH0KIAogI2lmZGVmIENPTkZJR19DT01QQVQKK3N0YXRpYyBpbnQgcHJvY19jb250cm9sX2NvbXBhdChzdHJ1Y3QgZGV2X3N0YXRlICpwcywKKwkJCQlzdHJ1Y3QgdXNiZGV2ZnNfY3RybHRyYW5zZmVyMzIgX191c2VyICpwMzIpCit7CisgICAgICAgIHN0cnVjdCB1c2JkZXZmc19jdHJsdHJhbnNmZXIgX191c2VyICpwOworICAgICAgICBfX3UzMiB1ZGF0YTsKKyAgICAgICAgcCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcCkpOworICAgICAgICBpZiAoY29weV9pbl91c2VyKHAsIHAzMiwgKHNpemVvZigqcDMyKSAtIHNpemVvZihjb21wYXRfY2FkZHJfdCkpKSB8fAorICAgICAgICAgICAgZ2V0X3VzZXIodWRhdGEsICZwMzItPmRhdGEpIHx8CisJICAgIHB1dF91c2VyKGNvbXBhdF9wdHIodWRhdGEpLCAmcC0+ZGF0YSkpCisJCXJldHVybiAtRUZBVUxUOworICAgICAgICByZXR1cm4gcHJvY19jb250cm9sKHBzLCBwKTsKK30KKworc3RhdGljIGludCBwcm9jX2J1bGtfY29tcGF0KHN0cnVjdCBkZXZfc3RhdGUgKnBzLAorCQkJc3RydWN0IHVzYmRldmZzX2J1bGt0cmFuc2ZlcjMyIF9fdXNlciAqcDMyKQoreworICAgICAgICBzdHJ1Y3QgdXNiZGV2ZnNfYnVsa3RyYW5zZmVyIF9fdXNlciAqcDsKKyAgICAgICAgY29tcGF0X3VpbnRfdCBuOworICAgICAgICBjb21wYXRfY2FkZHJfdCBhZGRyOworCisgICAgICAgIHAgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnApKTsKKworICAgICAgICBpZiAoZ2V0X3VzZXIobiwgJnAzMi0+ZXApIHx8IHB1dF91c2VyKG4sICZwLT5lcCkgfHwKKyAgICAgICAgICAgIGdldF91c2VyKG4sICZwMzItPmxlbikgfHwgcHV0X3VzZXIobiwgJnAtPmxlbikgfHwKKyAgICAgICAgICAgIGdldF91c2VyKG4sICZwMzItPnRpbWVvdXQpIHx8IHB1dF91c2VyKG4sICZwLT50aW1lb3V0KSB8fAorICAgICAgICAgICAgZ2V0X3VzZXIoYWRkciwgJnAzMi0+ZGF0YSkgfHwgcHV0X3VzZXIoY29tcGF0X3B0cihhZGRyKSwgJnAtPmRhdGEpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworCisgICAgICAgIHJldHVybiBwcm9jX2J1bGsocHMsIHApOworfQorc3RhdGljIGludCBwcm9jX2Rpc2Nvbm5lY3RzaWduYWxfY29tcGF0KHN0cnVjdCBkZXZfc3RhdGUgKnBzLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCB1c2JkZXZmc19kaXNjb25uZWN0c2lnbmFsMzIgZHM7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmRzLCBhcmcsIHNpemVvZihkcykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlwcy0+ZGlzY3NpZ25yID0gZHMuc2lnbnI7CisJcHMtPmRpc2Njb250ZXh0ID0gY29tcGF0X3B0cihkcy5jb250ZXh0KTsKKwlyZXR1cm4gMDsKK30KIAogc3RhdGljIGludCBnZXRfdXJiMzIoc3RydWN0IHVzYmRldmZzX3VyYiAqa3VyYiwKIAkJICAgICBzdHJ1Y3QgdXNiZGV2ZnNfdXJiMzIgX191c2VyICp1dXJiKQpAQCAtMTQ4Miw2ICsxNTIyLDcgQEAKIAlyZXR1cm4gcHJvY2Vzc2NvbXBsX2NvbXBhdChhcywgKHZvaWQgX191c2VyICogX191c2VyICopYXJnKTsKIH0KIAorCiAjZW5kaWYKIAogc3RhdGljIGludCBwcm9jX2Rpc2Nvbm5lY3RzaWduYWwoc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCkBAIC0xNjQ4LDEyICsxNjg5LDEyIEBACiAgKiBhcmUgYXNzdW1pbmcgdGhhdCBzb21laG93IHRoZSBjb25maWd1cmF0aW9uIGhhcyBiZWVuIHByZXZlbnRlZCBmcm9tCiAgKiBjaGFuZ2luZy4gIEJ1dCB0aGVyZSdzIG5vIG1lY2hhbmlzbSB0byBlbnN1cmUgdGhhdC4uLgogICovCi1zdGF0aWMgaW50IHVzYmRldl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGxvbmcgdXNiZGV2X2RvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCXZvaWQgX191c2VyICpwKQogewogCXN0cnVjdCBkZXZfc3RhdGUgKnBzID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBwcy0+ZGV2OwotCXZvaWQgX191c2VyICpwID0gKHZvaWQgX191c2VyICopYXJnOwogCWludCByZXQgPSAtRU5PVFRZOwogCiAJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQpAQCAtMTcyNiw2ICsxNzY3LDI0IEBACiAJCWJyZWFrOwogCiAjaWZkZWYgQ09ORklHX0NPTVBBVAorCWNhc2UgVVNCREVWRlNfQ09OVFJPTDMyOgorCQlzbm9vcCgmZGV2LT5kZXYsICIlczogQ09OVFJPTDMyXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IHByb2NfY29udHJvbF9jb21wYXQocHMsIHApOworCQlpZiAocmV0ID49IDApCisJCQlpbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKKwkJYnJlYWs7CisKKwljYXNlIFVTQkRFVkZTX0JVTEszMjoKKwkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IEJVTEszMlxuIiwgX19mdW5jX18pOworCQlyZXQgPSBwcm9jX2J1bGtfY29tcGF0KHBzLCBwKTsKKwkJaWYgKHJldCA+PSAwKQorCQkJaW5vZGUtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7CisJCWJyZWFrOworCisJY2FzZSBVU0JERVZGU19ESVNDU0lHTkFMMzI6CisJCXNub29wKCZkZXYtPmRldiwgIiVzOiBESVNDU0lHTkFMMzJcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gcHJvY19kaXNjb25uZWN0c2lnbmFsX2NvbXBhdChwcywgcCk7CisJCWJyZWFrOwogCiAJY2FzZSBVU0JERVZGU19TVUJNSVRVUkIzMjoKIAkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IFNVQk1JVFVSQjMyXG4iLCBfX2Z1bmNfXyk7CkBAIC0xNzQ1LDcgKzE4MDQsNyBAQAogCQlicmVhazsKIAogCWNhc2UgVVNCREVWRlNfSU9DVEwzMjoKLQkJc25vb3AoJmRldi0+ZGV2LCAiJXM6IElPQ1RMXG4iLCBfX2Z1bmNfXyk7CisJCXNub29wKCZkZXYtPmRldiwgIiVzOiBJT0NUTDMyXG4iLCBfX2Z1bmNfXyk7CiAJCXJldCA9IHByb2NfaW9jdGxfY29tcGF0KHBzLCBwdHJfdG9fY29tcGF0KHApKTsKIAkJYnJlYWs7CiAjZW5kaWYKQEAgLTE4MDEsNiArMTg2MCwzMiBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBsb25nIHVzYmRldl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByZXQ7CisKKwlsb2NrX2tlcm5lbCgpOworCXJldCA9IHVzYmRldl9kb19pb2N0bChmaWxlLCBjbWQsICh2b2lkIF9fdXNlciAqKWFyZyk7CisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIENPTkZJR19DT01QQVQKK3N0YXRpYyBsb25nIHVzYmRldl9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmV0OworCisJbG9ja19rZXJuZWwoKTsKKwlyZXQgPSB1c2JkZXZfZG9faW9jdGwoZmlsZSwgY21kLCBjb21wYXRfcHRyKGFyZykpOworCXVubG9ja19rZXJuZWwoKTsKKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKwogLyogTm8ga2VybmVsIGxvY2sgLSBmaW5lICovCiBzdGF0aWMgdW5zaWduZWQgaW50IHVzYmRldl9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLAogCQkJCXN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKQEAgLTE4MTcsMTMgKzE5MDIsMTYgQEAKIH0KIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1c2JkZXZfZmlsZV9vcGVyYXRpb25zID0gewotCS5vd25lciA9IAlUSElTX01PRFVMRSwKLQkubGxzZWVrID0JdXNiZGV2X2xzZWVrLAotCS5yZWFkID0JCXVzYmRldl9yZWFkLAotCS5wb2xsID0JCXVzYmRldl9wb2xsLAotCS5pb2N0bCA9CXVzYmRldl9pb2N0bCwKLQkub3BlbiA9CQl1c2JkZXZfb3BlbiwKLQkucmVsZWFzZSA9CXVzYmRldl9yZWxlYXNlLAorCS5vd25lciA9CSAgVEhJU19NT0RVTEUsCisJLmxsc2VlayA9CSAgdXNiZGV2X2xzZWVrLAorCS5yZWFkID0JCSAgdXNiZGV2X3JlYWQsCisJLnBvbGwgPQkJICB1c2JkZXZfcG9sbCwKKwkudW5sb2NrZWRfaW9jdGwgPSB1c2JkZXZfaW9jdGwsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwgPSAgIHVzYmRldl9jb21wYXRfaW9jdGwsCisjZW5kaWYKKwkub3BlbiA9CQkgIHVzYmRldl9vcGVuLAorCS5yZWxlYXNlID0JICB1c2JkZXZfcmVsZWFzZSwKIH07CiAKIHN0YXRpYyB2b2lkIHVzYmRldl9yZW1vdmUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jIGIvZHJpdmVycy91c2IvY29yZS9kcml2ZXIuYwppbmRleCA0Zjg2NDQ3Li42MGE0NWYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMKQEAgLTgzLDYgKzgzLDQ3IEBACiB9CiBzdGF0aWMgRFJJVkVSX0FUVFIobmV3X2lkLCBTX0lXVVNSLCBOVUxMLCBzdG9yZV9uZXdfaWQpOwogCisvKioKKyAqIHN0b3JlX3JlbW92ZV9pZCAtIHJlbW92ZSBhIFVTQiBkZXZpY2UgSUQgZnJvbSB0aGlzIGRyaXZlcgorICogQGRyaXZlcjogdGFyZ2V0IGRldmljZSBkcml2ZXIKKyAqIEBidWY6IGJ1ZmZlciBmb3Igc2Nhbm5pbmcgZGV2aWNlIElEIGRhdGEKKyAqIEBjb3VudDogaW5wdXQgc2l6ZQorICoKKyAqIFJlbW92ZXMgYSBkeW5hbWljIHVzYiBkZXZpY2UgSUQgZnJvbSB0aGlzIGRyaXZlci4KKyAqLworc3RhdGljIHNzaXplX3QKK3N0b3JlX3JlbW92ZV9pZChzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgdXNiX2R5bmlkICpkeW5pZCwgKm47CisJc3RydWN0IHVzYl9kcml2ZXIgKnVzYl9kcml2ZXIgPSB0b191c2JfZHJpdmVyKGRyaXZlcik7CisJdTMyIGlkVmVuZG9yID0gMDsKKwl1MzIgaWRQcm9kdWN0ID0gMDsKKwlpbnQgZmllbGRzID0gMDsKKwlpbnQgcmV0dmFsID0gMDsKKworCWZpZWxkcyA9IHNzY2FuZihidWYsICIleCAleCIsICZpZFZlbmRvciwgJmlkUHJvZHVjdCk7CisJaWYgKGZpZWxkcyA8IDIpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrKCZ1c2JfZHJpdmVyLT5keW5pZHMubG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGR5bmlkLCBuLCAmdXNiX2RyaXZlci0+ZHluaWRzLmxpc3QsIG5vZGUpIHsKKwkJc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkID0gJmR5bmlkLT5pZDsKKwkJaWYgKChpZC0+aWRWZW5kb3IgPT0gaWRWZW5kb3IpICYmCisJCSAgICAoaWQtPmlkUHJvZHVjdCA9PSBpZFByb2R1Y3QpKSB7CisJCQlsaXN0X2RlbCgmZHluaWQtPm5vZGUpOworCQkJa2ZyZWUoZHluaWQpOworCQkJcmV0dmFsID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZ1c2JfZHJpdmVyLT5keW5pZHMubG9jayk7CisKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBEUklWRVJfQVRUUihyZW1vdmVfaWQsIFNfSVdVU1IsIE5VTEwsIHN0b3JlX3JlbW92ZV9pZCk7CisKIHN0YXRpYyBpbnQgdXNiX2NyZWF0ZV9uZXdpZF9maWxlKHN0cnVjdCB1c2JfZHJpdmVyICp1c2JfZHJ2KQogewogCWludCBlcnJvciA9IDA7CkBAIC0xMDcsNiArMTQ4LDIxIEBACiAJCQkJICAgJmRyaXZlcl9hdHRyX25ld19pZCk7CiB9CiAKK3N0YXRpYyBpbnQKK3VzYl9jcmVhdGVfcmVtb3ZlaWRfZmlsZShzdHJ1Y3QgdXNiX2RyaXZlciAqZHJ2KQoreworCWludCBlcnJvciA9IDA7CisJaWYgKGRydi0+cHJvYmUgIT0gTlVMTCkKKwkJZXJyb3IgPSBkcml2ZXJfY3JlYXRlX2ZpbGUoJmRydi0+ZHJ2d3JhcC5kcml2ZXIsCisJCQkJJmRyaXZlcl9hdHRyX3JlbW92ZV9pZCk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCB1c2JfcmVtb3ZlX3JlbW92ZWlkX2ZpbGUoc3RydWN0IHVzYl9kcml2ZXIgKmRydikKK3sKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoJmRydi0+ZHJ2d3JhcC5kcml2ZXIsICZkcml2ZXJfYXR0cl9yZW1vdmVfaWQpOworfQorCiBzdGF0aWMgdm9pZCB1c2JfZnJlZV9keW5pZHMoc3RydWN0IHVzYl9kcml2ZXIgKnVzYl9kcnYpCiB7CiAJc3RydWN0IHVzYl9keW5pZCAqZHluaWQsICpuOwpAQCAtMTI4LDYgKzE4NCwxNiBAQAogewogfQogCitzdGF0aWMgaW50Cit1c2JfY3JlYXRlX3JlbW92ZWlkX2ZpbGUoc3RydWN0IHVzYl9kcml2ZXIgKmRydikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdXNiX3JlbW92ZV9yZW1vdmVpZF9maWxlKHN0cnVjdCB1c2JfZHJpdmVyICpkcnYpCit7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCB1c2JfZnJlZV9keW5pZHMoc3RydWN0IHVzYl9kcml2ZXIgKnVzYl9kcnYpCiB7CiB9CkBAIC03NzQsMTkgKzg0MCwzNCBAQAogCUlOSVRfTElTVF9IRUFEKCZuZXdfZHJpdmVyLT5keW5pZHMubGlzdCk7CiAKIAlyZXR2YWwgPSBkcml2ZXJfcmVnaXN0ZXIoJm5ld19kcml2ZXItPmRydndyYXAuZHJpdmVyKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKIAotCWlmICghcmV0dmFsKSB7Ci0JCXByX2luZm8oIiVzOiByZWdpc3RlcmVkIG5ldyBpbnRlcmZhY2UgZHJpdmVyICVzXG4iLAorCXVzYmZzX3VwZGF0ZV9zcGVjaWFsKCk7CisKKwlyZXR2YWwgPSB1c2JfY3JlYXRlX25ld2lkX2ZpbGUobmV3X2RyaXZlcik7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXRfbmV3aWQ7CisKKwlyZXR2YWwgPSB1c2JfY3JlYXRlX3JlbW92ZWlkX2ZpbGUobmV3X2RyaXZlcik7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXRfcmVtb3ZlaWQ7CisKKwlwcl9pbmZvKCIlczogcmVnaXN0ZXJlZCBuZXcgaW50ZXJmYWNlIGRyaXZlciAlc1xuIiwKIAkJCXVzYmNvcmVfbmFtZSwgbmV3X2RyaXZlci0+bmFtZSk7Ci0JCXVzYmZzX3VwZGF0ZV9zcGVjaWFsKCk7Ci0JCXVzYl9jcmVhdGVfbmV3aWRfZmlsZShuZXdfZHJpdmVyKTsKLQl9IGVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciAlZCByZWdpc3RlcmluZyBpbnRlcmZhY2UgIgorCitvdXQ6CisJcmV0dXJuIHJldHZhbDsKKworb3V0X3JlbW92ZWlkOgorCXVzYl9yZW1vdmVfbmV3aWRfZmlsZShuZXdfZHJpdmVyKTsKK291dF9uZXdpZDoKKwlkcml2ZXJfdW5yZWdpc3RlcigmbmV3X2RyaXZlci0+ZHJ2d3JhcC5kcml2ZXIpOworCisJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgJWQgcmVnaXN0ZXJpbmcgaW50ZXJmYWNlICIKIAkJCSIJZHJpdmVyICVzXG4iLAogCQkJdXNiY29yZV9uYW1lLCByZXR2YWwsIG5ld19kcml2ZXItPm5hbWUpOwotCX0KLQotCXJldHVybiByZXR2YWw7CisJZ290byBvdXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1c2JfcmVnaXN0ZXJfZHJpdmVyKTsKIApAQCAtODA2LDYgKzg4Nyw3IEBACiAJcHJfaW5mbygiJXM6IGRlcmVnaXN0ZXJpbmcgaW50ZXJmYWNlIGRyaXZlciAlc1xuIiwKIAkJCXVzYmNvcmVfbmFtZSwgZHJpdmVyLT5uYW1lKTsKIAorCXVzYl9yZW1vdmVfcmVtb3ZlaWRfZmlsZShkcml2ZXIpOwogCXVzYl9yZW1vdmVfbmV3aWRfZmlsZShkcml2ZXIpOwogCXVzYl9mcmVlX2R5bmlkcyhkcml2ZXIpOwogCWRyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXItPmRydndyYXAuZHJpdmVyKTsKQEAgLTk0OCw4ICsxMDMwLDYgQEAKIAogIGRvbmU6CiAJZGV2X3ZkYmcoJnVkZXYtPmRldiwgIiVzOiBzdGF0dXMgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwotCWlmIChzdGF0dXMgPT0gMCkKLQkJdWRldi0+YXV0b3Jlc3VtZV9kaXNhYmxlZCA9IDA7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMTI4MCwxMSArMTM2MCw2IEBACiAKIAkvKiBQcm9wYWdhdGUgdGhlIHJlc3VtZSB1cCB0aGUgdHJlZSwgaWYgbmVjZXNzYXJ5ICovCiAJaWYgKHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9TVVNQRU5ERUQpIHsKLQkJaWYgKChtc2cuZXZlbnQgJiBQTV9FVkVOVF9BVVRPKSAmJgotCQkJCXVkZXYtPmF1dG9yZXN1bWVfZGlzYWJsZWQpIHsKLQkJCXN0YXR1cyA9IC1FUEVSTTsKLQkJCWdvdG8gZG9uZTsKLQkJfQogCQlpZiAocGFyZW50KSB7CiAJCQlzdGF0dXMgPSB1c2JfYXV0b3Jlc3VtZV9kZXZpY2UocGFyZW50KTsKIAkJCWlmIChzdGF0dXMgPT0gMCkgewpAQCAtMTM0MSw3ICsxNDE2LDYgQEAKIAlpbnQJc3RhdHVzID0gMDsKIAogCXVzYl9wbV9sb2NrKHVkZXYpOwotCXVkZXYtPmF1dG9fcG0gPSAxOwogCXVkZXYtPnBtX3VzYWdlX2NudCArPSBpbmNfdXNhZ2VfY250OwogCVdBUk5fT04odWRldi0+cG1fdXNhZ2VfY250IDwgMCk7CiAJaWYgKGluY191c2FnZV9jbnQpCkBAIC0xNDczLDcgKzE1NDcsNiBAQAogCWlmIChpbnRmLT5jb25kaXRpb24gPT0gVVNCX0lOVEVSRkFDRV9VTkJPVU5EKQogCQlzdGF0dXMgPSAtRU5PREVWOwogCWVsc2UgewotCQl1ZGV2LT5hdXRvX3BtID0gMTsKIAkJYXRvbWljX2FkZChpbmNfdXNhZ2VfY250LCAmaW50Zi0+cG1fdXNhZ2VfY250KTsKIAkJdWRldi0+bGFzdF9idXN5ID0gamlmZmllczsKIAkJaWYgKGluY191c2FnZV9jbnQgPj0gMCAmJgpAQCAtMTY0MCw4ICsxNzEzLDYgQEAKIAogCWlmIChpbnRmLT5jb25kaXRpb24gPT0gVVNCX0lOVEVSRkFDRV9VTkJPVU5EKQogCQlzdGF0dXMgPSAtRU5PREVWOwotCWVsc2UgaWYgKHVkZXYtPmF1dG9yZXN1bWVfZGlzYWJsZWQpCi0JCXN0YXR1cyA9IC1FUEVSTTsKIAllbHNlIHsKIAkJYXRvbWljX2luYygmaW50Zi0+cG1fdXNhZ2VfY250KTsKIAkJaWYgKGF0b21pY19yZWFkKCZpbnRmLT5wbV91c2FnZV9jbnQpID4gMCAmJgpAQCAtMTY1NCwyOCArMTcyNSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2VfYXN5bmMpOwogCi0vKioKLSAqIHVzYl9hdXRvcG1fc2V0X2ludGVyZmFjZSAtIHNldCBhIFVTQiBpbnRlcmZhY2UncyBhdXRvc3VzcGVuZCBzdGF0ZQotICogQGludGY6IHRoZSB1c2JfaW50ZXJmYWNlIHdob3NlIHN0YXRlIHNob3VsZCBiZSBzZXQKLSAqCi0gKiBUaGlzIHJvdXRpbmUgc2V0cyB0aGUgYXV0b3N1c3BlbmQgc3RhdGUgb2YgQGludGYncyBkZXZpY2UgYWNjb3JkaW5nCi0gKiB0byBAaW50ZidzIHVzYWdlIGNvdW50ZXIsIHdoaWNoIHRoZSBjYWxsZXIgbXVzdCBoYXZlIHNldCBwcmV2aW91c2x5LgotICogSWYgdGhlIGNvdW50ZXIgaXMgPD0gMCwgdGhlIGRldmljZSBpcyBhdXRvc3VzcGVuZGVkIChpZiBpdCBpc24ndAotICogYWxyZWFkeSBzdXNwZW5kZWQgYW5kIGlmIG5vdGhpbmcgZWxzZSBwcmV2ZW50cyB0aGUgYXV0b3N1c3BlbmQpLiAgSWYKLSAqIHRoZSBjb3VudGVyIGlzID4gMCwgdGhlIGRldmljZSBpcyBhdXRvcmVzdW1lZCAoaWYgaXQgaXNuJ3QgYWxyZWFkeQotICogYXdha2UpLgotICovCi1pbnQgdXNiX2F1dG9wbV9zZXRfaW50ZXJmYWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQotewotCWludAlzdGF0dXM7Ci0KLQlzdGF0dXMgPSB1c2JfYXV0b3BtX2RvX2ludGVyZmFjZShpbnRmLCAwKTsKLQlkZXZfdmRiZygmaW50Zi0+ZGV2LCAiJXM6IHN0YXR1cyAlZCBjbnQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgc3RhdHVzLCBhdG9taWNfcmVhZCgmaW50Zi0+cG1fdXNhZ2VfY250KSk7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHVzYl9hdXRvcG1fc2V0X2ludGVyZmFjZSk7Ci0KICNlbHNlCiAKIHZvaWQgdXNiX2F1dG9zdXNwZW5kX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtMTcwNyw3ICsxNzU2LDYgQEAKIAogCWRvX3VuYmluZF9yZWJpbmQodWRldiwgRE9fVU5CSU5EKTsKIAl1c2JfcG1fbG9jayh1ZGV2KTsKLQl1ZGV2LT5hdXRvX3BtID0gMDsKIAlzdGF0dXMgPSB1c2Jfc3VzcGVuZF9ib3RoKHVkZXYsIG1zZyk7CiAJdXNiX3BtX3VubG9jayh1ZGV2KTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMTczMCw3ICsxNzc4LDYgQEAKIAlpbnQJc3RhdHVzOwogCiAJdXNiX3BtX2xvY2sodWRldik7Ci0JdWRldi0+YXV0b19wbSA9IDA7CiAJc3RhdHVzID0gdXNiX3Jlc3VtZV9ib3RoKHVkZXYsIG1zZyk7CiAJdWRldi0+bGFzdF9idXN5ID0gamlmZmllczsKIAl1c2JfcG1fdW5sb2NrKHVkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9maWxlLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2ZpbGUuYwppbmRleCAyMjJlZTA3Li5iZmM2YzJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2ZpbGUuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2ZpbGUuYwpAQCAtOTksNiArOTksNyBAQAogCQlwcmludGsoS0VSTl9FUlIgImNsYXNzX2NyZWF0ZSBmYWlsZWQgZm9yIHVzYiBkZXZpY2VzXG4iKTsKIAkJa2ZyZWUodXNiX2NsYXNzKTsKIAkJdXNiX2NsYXNzID0gTlVMTDsKKwkJZ290byBleGl0OwogCX0KIAl1c2JfY2xhc3MtPmNsYXNzLT5kZXZub2RlID0gdXNiX2Rldm5vZGU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZ2VuZXJpYy5jIGIvZHJpdmVycy91c2IvY29yZS9nZW5lcmljLmMKaW5kZXggMDVlNmQzMS4uYmRmODdhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9nZW5lcmljLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9nZW5lcmljLmMKQEAgLTEzOSw3ICsxMzksNyBAQAogCiAJaWYgKGJlc3QpIHsKIAkJaSA9IGJlc3QtPmRlc2MuYkNvbmZpZ3VyYXRpb25WYWx1ZTsKLQkJZGV2X2luZm8oJnVkZXYtPmRldiwKKwkJZGV2X2RiZygmdWRldi0+ZGV2LAogCQkJImNvbmZpZ3VyYXRpb24gIyVkIGNob3NlbiBmcm9tICVkIGNob2ljZSVzXG4iLAogCQkJaSwgbnVtX2NvbmZpZ3MsIHBsdXJhbChudW1fY29uZmlncykpOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jIGIvZHJpdmVycy91c2IvY29yZS9oY2QuYwppbmRleCAzNGRlNDc1Li42ZGFjM2I4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogCkBAIC0xMjc1LDEzICsxMjc2LDE2IEBACiAKIAlpZiAodXNiX2VuZHBvaW50X3hmZXJfY29udHJvbCgmdXJiLT5lcC0+ZGVzYykKIAkgICAgJiYgISh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX05PX1NFVFVQX0RNQV9NQVApKSB7Ci0JCWlmIChoY2QtPnNlbGYudXNlc19kbWEpCisJCWlmIChoY2QtPnNlbGYudXNlc19kbWEpIHsKIAkJCXVyYi0+c2V0dXBfZG1hID0gZG1hX21hcF9zaW5nbGUoCiAJCQkJCWhjZC0+c2VsZi5jb250cm9sbGVyLAogCQkJCQl1cmItPnNldHVwX3BhY2tldCwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QpLAogCQkJCQlETUFfVE9fREVWSUNFKTsKLQkJZWxzZSBpZiAoaGNkLT5kcml2ZXItPmZsYWdzICYgSENEX0xPQ0FMX01FTSkKKwkJCWlmIChkbWFfbWFwcGluZ19lcnJvcihoY2QtPnNlbGYuY29udHJvbGxlciwKKwkJCQkJCXVyYi0+c2V0dXBfZG1hKSkKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfSBlbHNlIGlmIChoY2QtPmRyaXZlci0+ZmxhZ3MgJiBIQ0RfTE9DQUxfTUVNKQogCQkJcmV0ID0gaGNkX2FsbG9jX2NvaGVyZW50KAogCQkJCQl1cmItPmRldi0+YnVzLCBtZW1fZmxhZ3MsCiAJCQkJCSZ1cmItPnNldHVwX2RtYSwKQEAgLTEyOTMsMTMgKzEyOTcsMTYgQEAKIAlkaXIgPSB1c2JfdXJiX2Rpcl9pbih1cmIpID8gRE1BX0ZST01fREVWSUNFIDogRE1BX1RPX0RFVklDRTsKIAlpZiAocmV0ID09IDAgJiYgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoICE9IDAKIAkgICAgJiYgISh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX05PX1RSQU5TRkVSX0RNQV9NQVApKSB7Ci0JCWlmIChoY2QtPnNlbGYudXNlc19kbWEpCisJCWlmIChoY2QtPnNlbGYudXNlc19kbWEpIHsKIAkJCXVyYi0+dHJhbnNmZXJfZG1hID0gZG1hX21hcF9zaW5nbGUgKAogCQkJCQloY2QtPnNlbGYuY29udHJvbGxlciwKIAkJCQkJdXJiLT50cmFuc2Zlcl9idWZmZXIsCiAJCQkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKIAkJCQkJZGlyKTsKLQkJZWxzZSBpZiAoaGNkLT5kcml2ZXItPmZsYWdzICYgSENEX0xPQ0FMX01FTSkgeworCQkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGhjZC0+c2VsZi5jb250cm9sbGVyLAorCQkJCQkJdXJiLT50cmFuc2Zlcl9kbWEpKQorCQkJCXJldHVybiAtRUFHQUlOOworCQl9IGVsc2UgaWYgKGhjZC0+ZHJpdmVyLT5mbGFncyAmIEhDRF9MT0NBTF9NRU0pIHsKIAkJCXJldCA9IGhjZF9hbGxvY19jb2hlcmVudCgKIAkJCQkJdXJiLT5kZXYtPmJ1cywgbWVtX2ZsYWdzLAogCQkJCQkmdXJiLT50cmFuc2Zlcl9kbWEsCkBAIC0xNTg5LDE5ICsxNTk2LDMyIEBACiAJfQogfQogCi0vKiBDaGVjayB3aGV0aGVyIGEgbmV3IGNvbmZpZ3VyYXRpb24gb3IgYWx0IHNldHRpbmcgZm9yIGFuIGludGVyZmFjZQotICogd2lsbCBleGNlZWQgdGhlIGJhbmR3aWR0aCBmb3IgdGhlIGJ1cyAob3IgdGhlIGhvc3QgY29udHJvbGxlciByZXNvdXJjZXMpLgotICogT25seSBwYXNzIGluIGEgbm9uLU5VTEwgY29uZmlnIG9yIGludGVyZmFjZSwgbm90IGJvdGghCi0gKiBQYXNzaW5nIE5VTEwgZm9yIGJvdGggbmV3X2NvbmZpZyBhbmQgbmV3X2ludGYgbWVhbnMgdGhlIGRldmljZSB3aWxsIGJlCi0gKiBkZS1jb25maWd1cmVkIGJ5IGlzc3VpbmcgYSBzZXQgY29uZmlndXJhdGlvbiAwIGNvbW1hbmQuCisvKioKKyAqIENoZWNrIHdoZXRoZXIgYSBuZXcgYmFuZHdpZHRoIHNldHRpbmcgZXhjZWVkcyB0aGUgYnVzIGJhbmR3aWR0aC4KKyAqIEBuZXdfY29uZmlnOiBuZXcgY29uZmlndXJhdGlvbiB0byBpbnN0YWxsCisgKiBAY3VyX2FsdDogdGhlIGN1cnJlbnQgYWx0ZXJuYXRlIGludGVyZmFjZSBzZXR0aW5nCisgKiBAbmV3X2FsdDogYWx0ZXJuYXRlIGludGVyZmFjZSBzZXR0aW5nIHRoYXQgaXMgYmVpbmcgaW5zdGFsbGVkCisgKgorICogVG8gY2hhbmdlIGNvbmZpZ3VyYXRpb25zLCBwYXNzIGluIHRoZSBuZXcgY29uZmlndXJhdGlvbiBpbiBuZXdfY29uZmlnLAorICogYW5kIHBhc3MgTlVMTCBmb3IgY3VyX2FsdCBhbmQgbmV3X2FsdC4KKyAqCisgKiBUbyByZXNldCBhIGRldmljZSdzIGNvbmZpZ3VyYXRpb24gKHB1dCB0aGUgZGV2aWNlIGluIHRoZSBBRERSRVNTRUQgc3RhdGUpLAorICogcGFzcyBpbiBOVUxMIGZvciBuZXdfY29uZmlnLCBjdXJfYWx0LCBhbmQgbmV3X2FsdC4KKyAqCisgKiBUbyBjaGFuZ2UgYWx0ZXJuYXRlIGludGVyZmFjZSBzZXR0aW5ncywgcGFzcyBpbiBOVUxMIGZvciBuZXdfY29uZmlnLAorICogcGFzcyBpbiB0aGUgY3VycmVudCBhbHRlcm5hdGUgaW50ZXJmYWNlIHNldHRpbmcgaW4gY3VyX2FsdCwKKyAqIGFuZCBwYXNzIGluIHRoZSBuZXcgYWx0ZXJuYXRlIGludGVyZmFjZSBzZXR0aW5nIGluIG5ld19hbHQuCisgKgorICogUmV0dXJucyBhbiBlcnJvciBpZiB0aGUgcmVxdWVzdGVkIGJhbmR3aWR0aCBjaGFuZ2UgZXhjZWVkcyB0aGUKKyAqIGJ1cyBiYW5kd2lkdGggb3IgaG9zdCBjb250cm9sbGVyIGludGVybmFsIHJlc291cmNlcy4KICAqLwotaW50IHVzYl9oY2RfY2hlY2tfYmFuZHdpZHRoKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAoraW50IHVzYl9oY2RfYWxsb2NfYmFuZHdpZHRoKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAogCQlzdHJ1Y3QgdXNiX2hvc3RfY29uZmlnICpuZXdfY29uZmlnLAotCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqbmV3X2ludGYpCisJCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmN1cl9hbHQsCisJCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKm5ld19hbHQpCiB7CiAJaW50IG51bV9pbnRmcywgaSwgajsKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZV9jYWNoZSAqaW50Zl9jYWNoZTsKLQlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICphbHQgPSAwOworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdCA9IE5VTEw7CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IHVzYl9oY2QgKmhjZDsKIAlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwOwpAQCAtMTYxMSw3ICsxNjMxLDcgQEAKIAkJcmV0dXJuIDA7CiAKIAkvKiBDb25maWd1cmF0aW9uIGlzIGJlaW5nIHJlbW92ZWQgLSBzZXQgY29uZmlndXJhdGlvbiAwICovCi0JaWYgKCFuZXdfY29uZmlnICYmICFuZXdfaW50ZikgeworCWlmICghbmV3X2NvbmZpZyAmJiAhY3VyX2FsdCkgewogCQlmb3IgKGkgPSAxOyBpIDwgMTY7ICsraSkgewogCQkJZXAgPSB1ZGV2LT5lcF9vdXRbaV07CiAJCQlpZiAoZXApCkBAIC0xNjQ4LDE5ICsxNjY4LDEyIEBACiAJCQl9CiAJCX0KIAkJZm9yIChpID0gMDsgaSA8IG51bV9pbnRmczsgKytpKSB7CisJCQkvKiBTZXQgdXAgZW5kcG9pbnRzIGZvciBhbHRlcm5hdGUgaW50ZXJmYWNlIHNldHRpbmcgMCAqLworCQkJYWx0ID0gdXNiX2ZpbmRfYWx0X3NldHRpbmcobmV3X2NvbmZpZywgaSwgMCk7CisJCQlpZiAoIWFsdCkKKwkJCQkvKiBObyBhbHQgc2V0dGluZyAwPyBQaWNrIHRoZSBmaXJzdCBzZXR0aW5nLiAqLworCQkJCWFsdCA9ICZuZXdfY29uZmlnLT5pbnRmX2NhY2hlW2ldLT5hbHRzZXR0aW5nWzBdOwogCi0JCQkvKiBEaWcgdGhlIGVuZHBvaW50cyBmb3IgYWx0IHNldHRpbmcgMCBvdXQgb2YgdGhlCi0JCQkgKiBpbnRlcmZhY2UgY2FjaGUgZm9yIHRoaXMgaW50ZXJmYWNlCi0JCQkgKi8KLQkJCWludGZfY2FjaGUgPSBuZXdfY29uZmlnLT5pbnRmX2NhY2hlW2ldOwotCQkJZm9yIChqID0gMDsgaiA8IGludGZfY2FjaGUtPm51bV9hbHRzZXR0aW5nOyBqKyspIHsKLQkJCQlpZiAoaW50Zl9jYWNoZS0+YWx0c2V0dGluZ1tqXS5kZXNjLmJBbHRlcm5hdGVTZXR0aW5nID09IDApCi0JCQkJCWFsdCA9ICZpbnRmX2NhY2hlLT5hbHRzZXR0aW5nW2pdOwotCQkJfQotCQkJaWYgKCFhbHQpIHsKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAiRGlkIG5vdCBmaW5kIGFsdCBzZXR0aW5nIDAgZm9yIGludGYgJWRcbiIsIGkpOwotCQkJCWNvbnRpbnVlOwotCQkJfQogCQkJZm9yIChqID0gMDsgaiA8IGFsdC0+ZGVzYy5iTnVtRW5kcG9pbnRzOyBqKyspIHsKIAkJCQlyZXQgPSBoY2QtPmRyaXZlci0+YWRkX2VuZHBvaW50KGhjZCwgdWRldiwgJmFsdC0+ZW5kcG9pbnRbal0pOwogCQkJCWlmIChyZXQgPCAwKQpAQCAtMTY2OCw2ICsxNjgxLDIyIEBACiAJCQl9CiAJCX0KIAl9CisJaWYgKGN1cl9hbHQgJiYgbmV3X2FsdCkgeworCQkvKiBEcm9wIGFsbCB0aGUgZW5kcG9pbnRzIGluIHRoZSBjdXJyZW50IGFsdCBzZXR0aW5nICovCisJCWZvciAoaSA9IDA7IGkgPCBjdXJfYWx0LT5kZXNjLmJOdW1FbmRwb2ludHM7IGkrKykgeworCQkJcmV0ID0gaGNkLT5kcml2ZXItPmRyb3BfZW5kcG9pbnQoaGNkLCB1ZGV2LAorCQkJCQkmY3VyX2FsdC0+ZW5kcG9pbnRbaV0pOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byByZXNldDsKKwkJfQorCQkvKiBBZGQgYWxsIHRoZSBlbmRwb2ludHMgaW4gdGhlIG5ldyBhbHQgc2V0dGluZyAqLworCQlmb3IgKGkgPSAwOyBpIDwgbmV3X2FsdC0+ZGVzYy5iTnVtRW5kcG9pbnRzOyBpKyspIHsKKwkJCXJldCA9IGhjZC0+ZHJpdmVyLT5hZGRfZW5kcG9pbnQoaGNkLCB1ZGV2LAorCQkJCQkmbmV3X2FsdC0+ZW5kcG9pbnRbaV0pOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byByZXNldDsKKwkJfQorCX0KIAlyZXQgPSBoY2QtPmRyaXZlci0+Y2hlY2tfYmFuZHdpZHRoKGhjZCwgdWRldik7CiByZXNldDoKIAlpZiAocmV0IDwgMCkKQEAgLTE5ODQsNiArMjAxMyw3IEBACiAjaWZkZWYgQ09ORklHX1BNCiAJSU5JVF9XT1JLKCZoY2QtPndha2V1cF93b3JrLCBoY2RfcmVzdW1lX3dvcmspOwogI2VuZGlmCisJbXV0ZXhfaW5pdCgmaGNkLT5iYW5kd2lkdGhfbXV0ZXgpOwogCiAJaGNkLT5kcml2ZXIgPSBkcml2ZXI7CiAJaGNkLT5wcm9kdWN0X2Rlc2MgPSAoZHJpdmVyLT5wcm9kdWN0X2Rlc2MpID8gZHJpdmVyLT5wcm9kdWN0X2Rlc2MgOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9oY2QuaCBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmgKaW5kZXggNzk3ODJhMS4uZDhiNDNhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9oY2QuaAorKysgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5oCkBAIC0xMTEsNiArMTExLDIwIEBACiAJdTY0CQkJcnNyY19sZW47CS8qIG1lbW9yeS9pbyByZXNvdXJjZSBsZW5ndGggKi8KIAl1bnNpZ25lZAkJcG93ZXJfYnVkZ2V0OwkvKiBpbiBtQSwgMCA9IG5vIGxpbWl0ICovCiAKKwkvKiBiYW5kd2lkdGhfbXV0ZXggc2hvdWxkIGJlIHRha2VuIGJlZm9yZSBhZGRpbmcgb3IgcmVtb3ZpbmcKKwkgKiBhbnkgbmV3IGJ1cyBiYW5kd2lkdGggY29uc3RyYWludHM6CisJICogICAxLiBCZWZvcmUgYWRkaW5nIGEgY29uZmlndXJhdGlvbiBmb3IgYSBuZXcgZGV2aWNlLgorCSAqICAgMi4gQmVmb3JlIHJlbW92aW5nIHRoZSBjb25maWd1cmF0aW9uIHRvIHB1dCB0aGUgZGV2aWNlIGludG8KKwkgKiAgICAgIHRoZSBhZGRyZXNzZWQgc3RhdGUuCisJICogICAzLiBCZWZvcmUgc2VsZWN0aW5nIGEgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24uCisJICogICA0LiBCZWZvcmUgc2VsZWN0aW5nIGFuIGFsdGVybmF0ZSBpbnRlcmZhY2Ugc2V0dGluZy4KKwkgKgorCSAqIGJhbmR3aWR0aF9tdXRleCBzaG91bGQgYmUgZHJvcHBlZCBhZnRlciBhIHN1Y2Nlc3NmdWwgY29udHJvbCBtZXNzYWdlCisJICogdG8gdGhlIGRldmljZSwgb3IgcmVzZXR0aW5nIHRoZSBiYW5kd2lkdGggYWZ0ZXIgYSBmYWlsZWQgYXR0ZW1wdC4KKwkgKi8KKwlzdHJ1Y3QgbXV0ZXgJCWJhbmR3aWR0aF9tdXRleDsKKworCiAjZGVmaW5lIEhDRF9CVUZGRVJfUE9PTFMJNAogCXN0cnVjdCBkbWFfcG9vbAkJKnBvb2wgW0hDRF9CVUZGRVJfUE9PTFNdOwogCkBAIC0yOTAsOSArMzA0LDEwIEBACiBleHRlcm4gdm9pZCB1c2JfaGNkX3Jlc2V0X2VuZHBvaW50KHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAogCQlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwKTsKIGV4dGVybiB2b2lkIHVzYl9oY2Rfc3luY2hyb25pemVfdW5saW5rcyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldik7Ci1leHRlcm4gaW50IHVzYl9oY2RfY2hlY2tfYmFuZHdpZHRoKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAorZXh0ZXJuIGludCB1c2JfaGNkX2FsbG9jX2JhbmR3aWR0aChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKIAkJc3RydWN0IHVzYl9ob3N0X2NvbmZpZyAqbmV3X2NvbmZpZywKLQkJc3RydWN0IHVzYl9pbnRlcmZhY2UgKm5ld19pbnRmKTsKKwkJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqb2xkX2FsdCwKKwkJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqbmV3X2FsdCk7CiBleHRlcm4gaW50IHVzYl9oY2RfZ2V0X2ZyYW1lX251bWJlcihzdHJ1Y3QgdXNiX2RldmljZSAqdWRldik7CiAKIGV4dGVybiBzdHJ1Y3QgdXNiX2hjZCAqdXNiX2NyZWF0ZV9oY2QoY29uc3Qgc3RydWN0IGhjX2RyaXZlciAqZHJpdmVyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9odWIuYyBiL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKaW5kZXggMGY4NTdlNi4uMDZhZjk3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9odWIuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCkBAIC00NSw3ICs0NSw2IEBACiAKIAkvKiBidWZmZXIgZm9yIHVyYiAuLi4gd2l0aCBleHRyYSBzcGFjZSBpbiBjYXNlIG9mIGJhYmJsZSAqLwogCWNoYXIJCQkoKmJ1ZmZlcilbOF07Ci0JZG1hX2FkZHJfdAkJYnVmZmVyX2RtYTsJLyogRE1BIGFkZHJlc3MgZm9yIGJ1ZmZlciAqLwogCXVuaW9uIHsKIAkJc3RydWN0IHVzYl9odWJfc3RhdHVzCWh1YjsKIAkJc3RydWN0IHVzYl9wb3J0X3N0YXR1cwlwb3J0OwpAQCAtNjEsNiArNjAsOCBAQAogCQkJCQkJCXN0YXR1cyBjaGFuZ2UgKi8KIAl1bnNpZ25lZCBsb25nCQlidXN5X2JpdHNbMV07CS8qIHBvcnRzIGJlaW5nIHJlc2V0IG9yCiAJCQkJCQkJcmVzdW1lZCAqLworCXVuc2lnbmVkIGxvbmcJCXJlbW92ZWRfYml0c1sxXTsgLyogcG9ydHMgd2l0aCBhICJyZW1vdmVkIgorCQkJCQkJCWRldmljZSBwcmVzZW50ICovCiAjaWYgVVNCX01BWENISUxEUkVOID4gMzEgLyogOCpzaXplb2YodW5zaWduZWQgbG9uZykgLSAxICovCiAjZXJyb3IgZXZlbnRfYml0c1tdIGlzIHRvbyBzaG9ydCEKICNlbmRpZgpAQCAtNzAsNiArNzEsNyBAQAogCiAJdW5zaWduZWQJCW1BX3Blcl9wb3J0OwkvKiBjdXJyZW50IGZvciBlYWNoIGNoaWxkICovCiAKKwl1bnNpZ25lZAkJaW5pdF9kb25lOjE7CiAJdW5zaWduZWQJCWxpbWl0ZWRfcG93ZXI6MTsKIAl1bnNpZ25lZAkJcXVpZXNjaW5nOjE7CiAJdW5zaWduZWQJCWRpc2Nvbm5lY3RlZDoxOwpAQCAtMzc0LDEyICszNzYsMTMgQEAKIHsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCi0JLyogU3VwcHJlc3MgYXV0b3N1c3BlbmQgdW50aWwga2h1YmQgcnVucyAqLwotCWF0b21pY19zZXQoJnRvX3VzYl9pbnRlcmZhY2UoaHViLT5pbnRmZGV2KS0+cG1fdXNhZ2VfY250LCAxKTsKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZodWJfZXZlbnRfbG9jaywgZmxhZ3MpOwogCWlmICghaHViLT5kaXNjb25uZWN0ZWQgJiYgbGlzdF9lbXB0eSgmaHViLT5ldmVudF9saXN0KSkgewogCQlsaXN0X2FkZF90YWlsKCZodWItPmV2ZW50X2xpc3QsICZodWJfZXZlbnRfbGlzdCk7CisKKwkJLyogU3VwcHJlc3MgYXV0b3N1c3BlbmQgdW50aWwga2h1YmQgcnVucyAqLworCQl1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2Vfbm9fcmVzdW1lKAorCQkJCXRvX3VzYl9pbnRlcmZhY2UoaHViLT5pbnRmZGV2KSk7CiAJCXdha2VfdXAoJmtodWJkX3dhaXQpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodWJfZXZlbnRfbG9jaywgZmxhZ3MpOwpAQCAtNjM2LDggKzYzOSwzNSBAQAogIAlraWNrX2todWJkKGh1Yik7CiB9CiAKKy8qKgorICogdXNiX3JlbW92ZV9kZXZpY2UgLSBkaXNhYmxlIGEgZGV2aWNlJ3MgcG9ydCBvbiBpdHMgcGFyZW50IGh1YgorICogQHVkZXY6IGRldmljZSB0byBiZSBkaXNhYmxlZCBhbmQgcmVtb3ZlZAorICogQ29udGV4dDogQHVkZXYgbG9ja2VkLCBtdXN0IGJlIGFibGUgdG8gc2xlZXAuCisgKgorICogQWZ0ZXIgQHVkZXYncyBwb3J0IGhhcyBiZWVuIGRpc2FibGVkLCBraHViZCBpcyBub3RpZmllZCBhbmQgaXQgd2lsbAorICogc2VlIHRoYXQgdGhlIGRldmljZSBoYXMgYmVlbiBkaXNjb25uZWN0ZWQuICBXaGVuIHRoZSBkZXZpY2UgaXMKKyAqIHBoeXNpY2FsbHkgdW5wbHVnZ2VkIGFuZCBzb21ldGhpbmcgaXMgcGx1Z2dlZCBpbiwgdGhlIGV2ZW50cyB3aWxsCisgKiBiZSByZWNlaXZlZCBhbmQgcHJvY2Vzc2VkIG5vcm1hbGx5LgorICovCitpbnQgdXNiX3JlbW92ZV9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCit7CisJc3RydWN0IHVzYl9odWIgKmh1YjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKKworCWlmICghdWRldi0+cGFyZW50KQkvKiBDYW4ndCByZW1vdmUgYSByb290IGh1YiAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwlodWIgPSBoZGV2X3RvX2h1Yih1ZGV2LT5wYXJlbnQpOworCWludGYgPSB0b191c2JfaW50ZXJmYWNlKGh1Yi0+aW50ZmRldik7CisKKwl1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UoaW50Zik7CisJc2V0X2JpdCh1ZGV2LT5wb3J0bnVtLCBodWItPnJlbW92ZWRfYml0cyk7CisJaHViX3BvcnRfbG9naWNhbF9kaXNjb25uZWN0KGh1YiwgdWRldi0+cG9ydG51bSk7CisJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKGludGYpOworCXJldHVybiAwOworfQorCiBlbnVtIGh1Yl9hY3RpdmF0aW9uX3R5cGUgewotCUhVQl9JTklULCBIVUJfSU5JVDIsIEhVQl9JTklUMywKKwlIVUJfSU5JVCwgSFVCX0lOSVQyLCBIVUJfSU5JVDMsCQkvKiBJTklUcyBtdXN0IGNvbWUgZmlyc3QgKi8KIAlIVUJfUE9TVF9SRVNFVCwgSFVCX1JFU1VNRSwgSFVCX1JFU0VUX1JFU1VNRSwKIH07CiAKQEAgLTY4Miw4ICs3MTIsOCBAQAogCQkJCQltc2Vjc190b19qaWZmaWVzKGRlbGF5KSk7CiAKIAkJCS8qIFN1cHByZXNzIGF1dG9zdXNwZW5kIHVudGlsIGluaXQgaXMgZG9uZSAqLwotCQkJYXRvbWljX3NldCgmdG9fdXNiX2ludGVyZmFjZShodWItPmludGZkZXYpLT4KLQkJCQkJcG1fdXNhZ2VfY250LCAxKTsKKwkJCXVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZV9ub19yZXN1bWUoCisJCQkJCXRvX3VzYl9pbnRlcmZhY2UoaHViLT5pbnRmZGV2KSk7CiAJCQlyZXR1cm47CQkvKiBDb250aW51ZXMgYXQgaW5pdDI6IGJlbG93ICovCiAJCX0gZWxzZSB7CiAJCQlodWJfcG93ZXJfb24oaHViLCB0cnVlKTsKQEAgLTczMSw2ICs3NjEsMTMgQEAKIAkJCQkJVVNCX1BPUlRfRkVBVF9DX0VOQUJMRSk7CiAJCX0KIAorCQkvKiBXZSBjYW4gZm9yZ2V0IGFib3V0IGEgInJlbW92ZWQiIGRldmljZSB3aGVuIHRoZXJlJ3MgYQorCQkgKiBwaHlzaWNhbCBkaXNjb25uZWN0IG9yIHRoZSBjb25uZWN0IHN0YXR1cyBjaGFuZ2VzLgorCQkgKi8KKwkJaWYgKCEocG9ydHN0YXR1cyAmIFVTQl9QT1JUX1NUQVRfQ09OTkVDVElPTikgfHwKKwkJCQkocG9ydGNoYW5nZSAmIFVTQl9QT1JUX1NUQVRfQ19DT05ORUNUSU9OKSkKKwkJCWNsZWFyX2JpdChwb3J0MSwgaHViLT5yZW1vdmVkX2JpdHMpOworCiAJCWlmICghdWRldiB8fCB1ZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQpIHsKIAkJCS8qIFRlbGwga2h1YmQgdG8gZGlzY29ubmVjdCB0aGUgZGV2aWNlIG9yCiAJCQkgKiBjaGVjayBmb3IgYSBuZXcgY29ubmVjdGlvbgpAQCAtNzgzLDYgKzgyMCw3IEBACiAJfQogIGluaXQzOgogCWh1Yi0+cXVpZXNjaW5nID0gMDsKKwlodWItPmluaXRfZG9uZSA9IDE7CiAKIAlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYihodWItPnVyYiwgR0ZQX05PSU8pOwogCWlmIChzdGF0dXMgPCAwKQpAQCAtNzkyLDYgKzgzMCwxMCBAQAogCiAJLyogU2NhbiBhbGwgcG9ydHMgdGhhdCBuZWVkIGF0dGVudGlvbiAqLwogCWtpY2tfa2h1YmQoaHViKTsKKworCS8qIEFsbG93IGF1dG9zdXNwZW5kIGlmIGl0IHdhcyBzdXBwcmVzc2VkICovCisJaWYgKHR5cGUgPD0gSFVCX0lOSVQzKQorCQl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2VfYXN5bmModG9fdXNiX2ludGVyZmFjZShodWItPmludGZkZXYpKTsKIH0KIAogLyogSW1wbGVtZW50IHRoZSBjb250aW51YXRpb25zIGZvciB0aGUgZGVsYXlzIGFib3ZlICovCkBAIC04MTksNiArODYxLDExIEBACiAJaW50IGk7CiAKIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmh1Yi0+aW5pdF93b3JrKTsKKwlpZiAoIWh1Yi0+aW5pdF9kb25lKSB7CisJCWh1Yi0+aW5pdF9kb25lID0gMTsKKwkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlX25vX3N1c3BlbmQoCisJCQkJdG9fdXNiX2ludGVyZmFjZShodWItPmludGZkZXYpKTsKKwl9CiAKIAkvKiBraHViZCBhbmQgcmVsYXRlZCBhY3Rpdml0eSB3b24ndCByZS10cmlnZ2VyICovCiAJaHViLT5xdWllc2NpbmcgPSAxOwpAQCAtODY5LDggKzkxNiw3IEBACiAJaW50IG1heHAsIHJldDsKIAljaGFyICptZXNzYWdlID0gIm91dCBvZiBtZW1vcnkiOwogCi0JaHViLT5idWZmZXIgPSB1c2JfYnVmZmVyX2FsbG9jKGhkZXYsIHNpemVvZigqaHViLT5idWZmZXIpLCBHRlBfS0VSTkVMLAotCQkJJmh1Yi0+YnVmZmVyX2RtYSk7CisJaHViLT5idWZmZXIgPSBrbWFsbG9jKHNpemVvZigqaHViLT5idWZmZXIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWh1Yi0+YnVmZmVyKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZmFpbDsKQEAgLTExMTEsOCArMTE1Nyw2IEBACiAKIAl1c2JfZmlsbF9pbnRfdXJiKGh1Yi0+dXJiLCBoZGV2LCBwaXBlLCAqaHViLT5idWZmZXIsIG1heHAsIGh1Yl9pcnEsCiAJCWh1YiwgZW5kcG9pbnQtPmJJbnRlcnZhbCk7Ci0JaHViLT51cmItPnRyYW5zZmVyX2RtYSA9IGh1Yi0+YnVmZmVyX2RtYTsKLQlodWItPnVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CiAKIAkvKiBtYXliZSBjeWNsZSB0aGUgaHViIGxlZHMgKi8KIAlpZiAoaHViLT5oYXNfaW5kaWNhdG9ycyAmJiBibGlua2VubGlnaHRzKQpAQCAtMTE0NCw3ICsxMTg4LDEwIEBACiAKIAkvKiBUYWtlIHRoZSBodWIgb2ZmIHRoZSBldmVudCBsaXN0IGFuZCBkb24ndCBsZXQgaXQgYmUgYWRkZWQgYWdhaW4gKi8KIAlzcGluX2xvY2tfaXJxKCZodWJfZXZlbnRfbG9jayk7Ci0JbGlzdF9kZWxfaW5pdCgmaHViLT5ldmVudF9saXN0KTsKKwlpZiAoIWxpc3RfZW1wdHkoJmh1Yi0+ZXZlbnRfbGlzdCkpIHsKKwkJbGlzdF9kZWxfaW5pdCgmaHViLT5ldmVudF9saXN0KTsKKwkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlX25vX3N1c3BlbmQoaW50Zik7CisJfQogCWh1Yi0+ZGlzY29ubmVjdGVkID0gMTsKIAlzcGluX3VubG9ja19pcnEoJmh1Yl9ldmVudF9sb2NrKTsKIApAQCAtMTE2Miw4ICsxMjA5LDcgQEAKIAlrZnJlZShodWItPnBvcnRfb3duZXJzKTsKIAlrZnJlZShodWItPmRlc2NyaXB0b3IpOwogCWtmcmVlKGh1Yi0+c3RhdHVzKTsKLQl1c2JfYnVmZmVyX2ZyZWUoaHViLT5oZGV2LCBzaXplb2YoKmh1Yi0+YnVmZmVyKSwgaHViLT5idWZmZXIsCi0JCQlodWItPmJ1ZmZlcl9kbWEpOworCWtmcmVlKGh1Yi0+YnVmZmVyKTsKIAogCWtyZWZfcHV0KCZodWItPmtyZWYsIGh1Yl9yZWxlYXNlKTsKIH0KQEAgLTE2MzAsNyArMTY3Niw3IEBACiAJaWYgKCF1ZGV2LT5idXMtPmlzX2JfaG9zdAogCQkJJiYgdWRldi0+Y29uZmlnCiAJCQkmJiB1ZGV2LT5wYXJlbnQgPT0gdWRldi0+YnVzLT5yb290X2h1YikgewotCQlzdHJ1Y3QgdXNiX290Z19kZXNjcmlwdG9yCSpkZXNjID0gMDsKKwkJc3RydWN0IHVzYl9vdGdfZGVzY3JpcHRvcgkqZGVzYyA9IE5VTEw7CiAJCXN0cnVjdCB1c2JfYnVzCQkJKmJ1cyA9IHVkZXYtPmJ1czsKIAogCQkvKiBkZXNjcmlwdG9yIG1heSBhcHBlYXIgYW55d2hlcmUgaW4gY29uZmlnICovCkBAIC0yMTIzLDkgKzIxNjksMTMgQEAKIAkJCQlVU0JfREVWSUNFX1JFTU9URV9XQUtFVVAsIDAsCiAJCQkJTlVMTCwgMCwKIAkJCQlVU0JfQ1RSTF9TRVRfVElNRU9VVCk7Ci0JCWlmIChzdGF0dXMpCisJCWlmIChzdGF0dXMpIHsKIAkJCWRldl9kYmcoJnVkZXYtPmRldiwgIndvbid0IHJlbW90ZSB3YWtldXAsIHN0YXR1cyAlZFxuIiwKIAkJCQkJc3RhdHVzKTsKKwkJCS8qIGJhaWwgaWYgYXV0b3N1c3BlbmQgaXMgcmVxdWVzdGVkICovCisJCQlpZiAobXNnLmV2ZW50ICYgUE1fRVZFTlRfQVVUTykKKwkJCQlyZXR1cm4gc3RhdHVzOworCQl9CiAJfQogCiAJLyogc2VlIDcuMS43LjYgKi8KQEAgLTIxMzQsNyArMjE4NCw4IEBACiAJCWRldl9kYmcoaHViLT5pbnRmZGV2LCAiY2FuJ3Qgc3VzcGVuZCBwb3J0ICVkLCBzdGF0dXMgJWRcbiIsCiAJCQkJcG9ydDEsIHN0YXR1cyk7CiAJCS8qIHBhcmFub2lhOiAgInNob3VsZCBub3QgaGFwcGVuIiAqLwotCQkodm9pZCkgdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKKwkJaWYgKHVkZXYtPmRvX3JlbW90ZV93YWtldXApCisJCQkodm9pZCkgdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKIAkJCQlVU0JfUkVRX0NMRUFSX0ZFQVRVUkUsIFVTQl9SRUNJUF9ERVZJQ0UsCiAJCQkJVVNCX0RFVklDRV9SRU1PVEVfV0FLRVVQLCAwLAogCQkJCU5VTEwsIDAsCkBAIC0yOTY1LDYgKzMwMTYsMTMgQEAKIAkJdXNiX2Rpc2Nvbm5lY3QoJmhkZXYtPmNoaWxkcmVuW3BvcnQxLTFdKTsKIAljbGVhcl9iaXQocG9ydDEsIGh1Yi0+Y2hhbmdlX2JpdHMpOwogCisJLyogV2UgY2FuIGZvcmdldCBhYm91dCBhICJyZW1vdmVkIiBkZXZpY2Ugd2hlbiB0aGVyZSdzIGEgcGh5c2ljYWwKKwkgKiBkaXNjb25uZWN0IG9yIHRoZSBjb25uZWN0IHN0YXR1cyBjaGFuZ2VzLgorCSAqLworCWlmICghKHBvcnRzdGF0dXMgJiBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT04pIHx8CisJCQkocG9ydGNoYW5nZSAmIFVTQl9QT1JUX1NUQVRfQ19DT05ORUNUSU9OKSkKKwkJY2xlYXJfYml0KHBvcnQxLCBodWItPnJlbW92ZWRfYml0cyk7CisKIAlpZiAocG9ydGNoYW5nZSAmIChVU0JfUE9SVF9TVEFUX0NfQ09OTkVDVElPTiB8CiAJCQkJVVNCX1BPUlRfU1RBVF9DX0VOQUJMRSkpIHsKIAkJc3RhdHVzID0gaHViX3BvcnRfZGVib3VuY2UoaHViLCBwb3J0MSk7CkBAIC0yOTc4LDggKzMwMzYsMTEgQEAKIAkJfQogCX0KIAotCS8qIFJldHVybiBub3cgaWYgZGVib3VuY2luZyBmYWlsZWQgb3Igbm90aGluZyBpcyBjb25uZWN0ZWQgKi8KLQlpZiAoIShwb3J0c3RhdHVzICYgVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OKSkgeworCS8qIFJldHVybiBub3cgaWYgZGVib3VuY2luZyBmYWlsZWQgb3Igbm90aGluZyBpcyBjb25uZWN0ZWQgb3IKKwkgKiB0aGUgZGV2aWNlIHdhcyAicmVtb3ZlZCIuCisJICovCisJaWYgKCEocG9ydHN0YXR1cyAmIFVTQl9QT1JUX1NUQVRfQ09OTkVDVElPTikgfHwKKwkJCXRlc3RfYml0KHBvcnQxLCBodWItPnJlbW92ZWRfYml0cykpIHsKIAogCQkvKiBtYXliZSBzd2l0Y2ggcG93ZXIgYmFjayBvbiAoZS5nLiByb290IGh1YiB3YXMgcmVzZXQpICovCiAJCWlmICgod0h1YkNoYXJhY3RlcmlzdGljcyAmIEhVQl9DSEFSX0xQU00pIDwgMgpAQCAtMzE4OSw3ICszMjUwLDcgQEAKIAkJICogZGlzY29ubmVjdGVkIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBsb2NrIHRvIHN1Y2NlZWQuICovCiAJCXVzYl9sb2NrX2RldmljZShoZGV2KTsKIAkJaWYgKHVubGlrZWx5KGh1Yi0+ZGlzY29ubmVjdGVkKSkKLQkJCWdvdG8gbG9vcDsKKwkJCWdvdG8gbG9vcDI7CiAKIAkJLyogSWYgdGhlIGh1YiBoYXMgZGllZCwgY2xlYW4gdXAgYWZ0ZXIgaXQgKi8KIAkJaWYgKGhkZXYtPnN0YXRlID09IFVTQl9TVEFURV9OT1RBVFRBQ0hFRCkgewpAQCAtMzMzOCwxMSArMzM5OSwxNSBAQAogCQkJfQogCQl9CiAKLWxvb3BfYXV0b3BtOgotCQkvKiBBbGxvdyBhdXRvc3VzcGVuZCBpZiB3ZSdyZSBub3QgZ29pbmcgdG8gcnVuIGFnYWluICovCi0JCWlmIChsaXN0X2VtcHR5KCZodWItPmV2ZW50X2xpc3QpKQotCQkJdXNiX2F1dG9wbV9lbmFibGUoaW50Zik7Ci1sb29wOgorIGxvb3BfYXV0b3BtOgorCQkvKiBCYWxhbmNlIHRoZSB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UoKSBhYm92ZSAqLworCQl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2Vfbm9fc3VzcGVuZChpbnRmKTsKKyBsb29wOgorCQkvKiBCYWxhbmNlIHRoZSB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2Vfbm9fcmVzdW1lKCkgaW4KKwkJICoga2lja19raHViZCgpIGFuZCBhbGxvdyBhdXRvc3VzcGVuZC4KKwkJICovCisJCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShpbnRmKTsKKyBsb29wMjoKIAkJdXNiX3VubG9ja19kZXZpY2UoaGRldik7CiAJCWtyZWZfcHV0KCZodWItPmtyZWYsIGh1Yl9yZWxlYXNlKTsKIApAQCAtMzUzNCw2ICszNTk5LDcgQEAKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZQkJKnBhcmVudF9oZGV2ID0gdWRldi0+cGFyZW50OwogCXN0cnVjdCB1c2JfaHViCQkJKnBhcmVudF9odWI7CisJc3RydWN0IHVzYl9oY2QJCQkqaGNkID0gYnVzX3RvX2hjZCh1ZGV2LT5idXMpOwogCXN0cnVjdCB1c2JfZGV2aWNlX2Rlc2NyaXB0b3IJZGVzY3JpcHRvciA9IHVkZXYtPmRlc2NyaXB0b3I7CiAJaW50IAkJCQlpLCByZXQgPSAwOwogCWludAkJCQlwb3J0MSA9IHVkZXYtPnBvcnRudW07CkBAIC0zNTc3LDYgKzM2NDMsMTYgQEAKIAkvKiBSZXN0b3JlIHRoZSBkZXZpY2UncyBwcmV2aW91cyBjb25maWd1cmF0aW9uICovCiAJaWYgKCF1ZGV2LT5hY3Rjb25maWcpCiAJCWdvdG8gZG9uZTsKKworCW11dGV4X2xvY2soJmhjZC0+YmFuZHdpZHRoX211dGV4KTsKKwlyZXQgPSB1c2JfaGNkX2FsbG9jX2JhbmR3aWR0aCh1ZGV2LCB1ZGV2LT5hY3Rjb25maWcsIE5VTEwsIE5VTEwpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl93YXJuKCZ1ZGV2LT5kZXYsCisJCQkJIkJ1c3RlZCBIQz8gIE5vdCBlbm91Z2ggSENEIHJlc291cmNlcyBmb3IgIgorCQkJCSJvbGQgY29uZmlndXJhdGlvbi5cbiIpOworCQltdXRleF91bmxvY2soJmhjZC0+YmFuZHdpZHRoX211dGV4KTsKKwkJZ290byByZV9lbnVtZXJhdGU7CisJfQogCXJldCA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCiAJCQlVU0JfUkVRX1NFVF9DT05GSUdVUkFUSU9OLCAwLAogCQkJdWRldi0+YWN0Y29uZmlnLT5kZXNjLmJDb25maWd1cmF0aW9uVmFsdWUsIDAsCkBAIC0zNTg1LDggKzM2NjEsMTAgQEAKIAkJZGV2X2VycigmdWRldi0+ZGV2LAogCQkJImNhbid0IHJlc3RvcmUgY29uZmlndXJhdGlvbiAjJWQgKGVycm9yPSVkKVxuIiwKIAkJCXVkZXYtPmFjdGNvbmZpZy0+ZGVzYy5iQ29uZmlndXJhdGlvblZhbHVlLCByZXQpOworCQltdXRleF91bmxvY2soJmhjZC0+YmFuZHdpZHRoX211dGV4KTsKIAkJZ290byByZV9lbnVtZXJhdGU7CiAgIAl9CisJbXV0ZXhfdW5sb2NrKCZoY2QtPmJhbmR3aWR0aF9tdXRleCk7CiAJdXNiX3NldF9kZXZpY2Vfc3RhdGUodWRldiwgVVNCX1NUQVRFX0NPTkZJR1VSRUQpOwogCiAJLyogUHV0IGludGVyZmFjZXMgYmFjayBpbnRvIHRoZSBzYW1lIGFsdHNldHRpbmdzIGFzIGJlZm9yZS4KQEAgLTM1OTYsNyArMzY3NCw4IEBACiAJICogZW5kcG9pbnQgc3RhdGUuCiAJICovCiAJZm9yIChpID0gMDsgaSA8IHVkZXYtPmFjdGNvbmZpZy0+ZGVzYy5iTnVtSW50ZXJmYWNlczsgaSsrKSB7Ci0JCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdWRldi0+YWN0Y29uZmlnLT5pbnRlcmZhY2VbaV07CisJCXN0cnVjdCB1c2JfaG9zdF9jb25maWcgKmNvbmZpZyA9IHVkZXYtPmFjdGNvbmZpZzsKKwkJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSBjb25maWctPmludGVyZmFjZVtpXTsKIAkJc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqZGVzYzsKIAogCQlkZXNjID0gJmludGYtPmN1cl9hbHRzZXR0aW5nLT5kZXNjOwpAQCAtMzYwNSw2ICszNjg0LDE3IEBACiAJCQl1c2JfZW5hYmxlX2ludGVyZmFjZSh1ZGV2LCBpbnRmLCB0cnVlKTsKIAkJCXJldCA9IDA7CiAJCX0gZWxzZSB7CisJCQkvKiBXZSd2ZSBqdXN0IHJlc2V0IHRoZSBkZXZpY2UsIHNvIGl0IHdpbGwgdGhpbmsgYWx0CisJCQkgKiBzZXR0aW5nIDAgaXMgaW5zdGFsbGVkLiAgRm9yIHVzYl9zZXRfaW50ZXJmYWNlKCkgdG8KKwkJCSAqIHdvcmsgcHJvcGVybHksIHdlIG5lZWQgdG8gc2V0IHRoZSBjdXJyZW50IGFsdGVybmF0ZQorCQkJICogaW50ZXJmYWNlIHNldHRpbmcgdG8gMCAob3IgdGhlIGZpcnN0IGFsdCBzZXR0aW5nLCBpZgorCQkJICogdGhlIGRldmljZSBkb2Vzbid0IGhhdmUgYWx0IHNldHRpbmcgMCkuCisJCQkgKi8KKwkJCWludGYtPmN1cl9hbHRzZXR0aW5nID0KKwkJCQl1c2JfZmluZF9hbHRfc2V0dGluZyhjb25maWcsIGksIDApOworCQkJaWYgKCFpbnRmLT5jdXJfYWx0c2V0dGluZykKKwkJCQlpbnRmLT5jdXJfYWx0c2V0dGluZyA9CisJCQkJCSZjb25maWctPmludGZfY2FjaGVbaV0tPmFsdHNldHRpbmdbMF07CiAJCQlyZXQgPSB1c2Jfc2V0X2ludGVyZmFjZSh1ZGV2LCBkZXNjLT5iSW50ZXJmYWNlTnVtYmVyLAogCQkJCQlkZXNjLT5iQWx0ZXJuYXRlU2V0dGluZyk7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jIGIvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMKaW5kZXggZTgwZjFhZi4uMWI5OTQ4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMKQEAgLTM5MywxMyArMzkzLDcgQEAKIAlpZiAoaW8tPmVudHJpZXMgPD0gMCkKIAkJcmV0dXJuIGlvLT5lbnRyaWVzOwogCi0JLyogSWYgd2UncmUgcnVubmluZyBvbiBhbiB4SENJIGhvc3QgY29udHJvbGxlciwgcXVldWUgdGhlIHdob2xlIHNjYXR0ZXIKLQkgKiBnYXRoZXIgbGlzdCB3aXRoIG9uZSBjYWxsIHRvIHVyYl9lbnF1ZXVlKCkuICBUaGlzIGlzIG9ubHkgZm9yIGJ1bGssCi0JICogYXMgdGhhdCBlbmRwb2ludCB0eXBlIGRvZXMgbm90IGNhcmUgaG93IHRoZSBkYXRhIGdldHMgYnJva2VuIHVwCi0JICogYWNyb3NzIGZyYW1lcy4KLQkgKi8KLQlpZiAodXNiX3BpcGVidWxrKHBpcGUpICYmCi0JCQlidXNfdG9faGNkKGRldi0+YnVzKS0+ZHJpdmVyLT5mbGFncyAmIEhDRF9VU0IzKSB7CisJaWYgKGRldi0+YnVzLT5zZ190YWJsZXNpemUgPiAwKSB7CiAJCWlvLT51cmJzID0ga21hbGxvYyhzaXplb2YgKmlvLT51cmJzLCBtZW1fZmxhZ3MpOwogCQl1c2Vfc2cgPSB0cnVlOwogCX0gZWxzZSB7CkBAIC00MDksNyArNDAzLDcgQEAKIAlpZiAoIWlvLT51cmJzKQogCQlnb3RvIG5vbWVtOwogCi0JdXJiX2ZsYWdzID0gVVJCX05PX0lOVEVSUlVQVDsKKwl1cmJfZmxhZ3MgPSAwOwogCWlmIChkbWEpCiAJCXVyYl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKIAlpZiAodXNiX3BpcGVpbihwaXBlKSkKQEAgLTQ0MSw2ICs0MzUsNyBAQAogCQlpby0+dXJic1swXS0+bnVtX3NncyA9IGlvLT5lbnRyaWVzOwogCQlpby0+ZW50cmllcyA9IDE7CiAJfSBlbHNlIHsKKwkJdXJiX2ZsYWdzIHw9IFVSQl9OT19JTlRFUlJVUFQ7CiAJCWZvcl9lYWNoX3NnKHNnLCBzZywgaW8tPmVudHJpZXMsIGkpIHsKIAkJCXVuc2lnbmVkIGxlbjsKIApAQCAtMTMwMyw2ICsxMjk4LDcgQEAKIHsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2U7CiAJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqYWx0OworCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBidXNfdG9faGNkKGRldi0+YnVzKTsKIAlpbnQgcmV0OwogCWludCBtYW51YWwgPSAwOwogCXVuc2lnbmVkIGludCBlcGFkZHI7CkBAIC0xMzI1LDYgKzEzMjEsMTggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJLyogTWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIGJhbmR3aWR0aCBmb3IgdGhpcyBhbHRlcm5hdGUgaW50ZXJmYWNlLgorCSAqIFJlbW92ZSB0aGUgY3VycmVudCBhbHQgc2V0dGluZyBhbmQgYWRkIHRoZSBuZXcgYWx0IHNldHRpbmcuCisJICovCisJbXV0ZXhfbG9jaygmaGNkLT5iYW5kd2lkdGhfbXV0ZXgpOworCXJldCA9IHVzYl9oY2RfYWxsb2NfYmFuZHdpZHRoKGRldiwgTlVMTCwgaWZhY2UtPmN1cl9hbHRzZXR0aW5nLCBhbHQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9pbmZvKCZkZXYtPmRldiwgIk5vdCBlbm91Z2ggYmFuZHdpZHRoIGZvciBhbHRzZXR0aW5nICVkXG4iLAorCQkJCWFsdGVybmF0ZSk7CisJCW11dGV4X3VubG9jaygmaGNkLT5iYW5kd2lkdGhfbXV0ZXgpOworCQlyZXR1cm4gcmV0OworCX0KKwogCWlmIChkZXYtPnF1aXJrcyAmIFVTQl9RVUlSS19OT19TRVRfSU5URikKIAkJcmV0ID0gLUVQSVBFOwogCWVsc2UKQEAgLTEzNDAsOCArMTM0OCwxMyBAQAogCQkJIm1hbnVhbCBzZXRfaW50ZXJmYWNlIGZvciBpZmFjZSAlZCwgYWx0ICVkXG4iLAogCQkJaW50ZXJmYWNlLCBhbHRlcm5hdGUpOwogCQltYW51YWwgPSAxOwotCX0gZWxzZSBpZiAocmV0IDwgMCkKKwl9IGVsc2UgaWYgKHJldCA8IDApIHsKKwkJLyogUmUtaW5zdGF0ZSB0aGUgb2xkIGFsdCBzZXR0aW5nICovCisJCXVzYl9oY2RfYWxsb2NfYmFuZHdpZHRoKGRldiwgTlVMTCwgYWx0LCBpZmFjZS0+Y3VyX2FsdHNldHRpbmcpOworCQltdXRleF91bmxvY2soJmhjZC0+YmFuZHdpZHRoX211dGV4KTsKIAkJcmV0dXJuIHJldDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZoY2QtPmJhbmR3aWR0aF9tdXRleCk7CiAKIAkvKiBGSVhNRSBkcml2ZXJzIHNob3VsZG4ndCBuZWVkIHRvIHJlcGxpY2F0ZS9idWdmaXggdGhlIGxvZ2ljIGhlcmUKIAkgKiB3aGVuIHRoZXkgaW1wbGVtZW50IGFzeW5jIG9yIGVhc2lseS1raWxsYWJsZSB2ZXJzaW9ucyBvZiB0aGlzIG9yCkBAIC0xNDIzLDYgKzE0MzYsNyBAQAogewogCWludAkJCWksIHJldHZhbDsKIAlzdHJ1Y3QgdXNiX2hvc3RfY29uZmlnCSpjb25maWc7CisJc3RydWN0IHVzYl9oY2QgKmhjZCA9IGJ1c190b19oY2QoZGV2LT5idXMpOwogCiAJaWYgKGRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX1NVU1BFTkRFRCkKIAkJcmV0dXJuIC1FSE9TVFVOUkVBQ0g7CkBAIC0xNDM4LDEyICsxNDUyLDQ2IEBACiAJfQogCiAJY29uZmlnID0gZGV2LT5hY3Rjb25maWc7CisJcmV0dmFsID0gMDsKKwltdXRleF9sb2NrKCZoY2QtPmJhbmR3aWR0aF9tdXRleCk7CisJLyogTWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIGJhbmR3aWR0aCBmb3IgZWFjaCBhbHRlcm5hdGUgc2V0dGluZyAwICovCisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+ZGVzYy5iTnVtSW50ZXJmYWNlczsgaSsrKSB7CisJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gY29uZmlnLT5pbnRlcmZhY2VbaV07CisJCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdDsKKworCQlhbHQgPSB1c2JfYWx0bnVtX3RvX2FsdHNldHRpbmcoaW50ZiwgMCk7CisJCWlmICghYWx0KQorCQkJYWx0ID0gJmludGYtPmFsdHNldHRpbmdbMF07CisJCWlmIChhbHQgIT0gaW50Zi0+Y3VyX2FsdHNldHRpbmcpCisJCQlyZXR2YWwgPSB1c2JfaGNkX2FsbG9jX2JhbmR3aWR0aChkZXYsIE5VTEwsCisJCQkJCWludGYtPmN1cl9hbHRzZXR0aW5nLCBhbHQpOworCQlpZiAocmV0dmFsIDwgMCkKKwkJCWJyZWFrOworCX0KKwkvKiBJZiBub3QsIHJlaW5zdGF0ZSB0aGUgb2xkIGFsdGVybmF0ZSBzZXR0aW5ncyAqLworCWlmIChyZXR2YWwgPCAwKSB7CityZXNldF9vbGRfYWx0czoKKwkJZm9yICg7IGkgPj0gMDsgaS0tKSB7CisJCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IGNvbmZpZy0+aW50ZXJmYWNlW2ldOworCQkJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqYWx0OworCisJCQlhbHQgPSB1c2JfYWx0bnVtX3RvX2FsdHNldHRpbmcoaW50ZiwgMCk7CisJCQlpZiAoIWFsdCkKKwkJCQlhbHQgPSAmaW50Zi0+YWx0c2V0dGluZ1swXTsKKwkJCWlmIChhbHQgIT0gaW50Zi0+Y3VyX2FsdHNldHRpbmcpCisJCQkJdXNiX2hjZF9hbGxvY19iYW5kd2lkdGgoZGV2LCBOVUxMLAorCQkJCQkJYWx0LCBpbnRmLT5jdXJfYWx0c2V0dGluZyk7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZoY2QtPmJhbmR3aWR0aF9tdXRleCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAogCQkJVVNCX1JFUV9TRVRfQ09ORklHVVJBVElPTiwgMCwKIAkJCWNvbmZpZy0+ZGVzYy5iQ29uZmlndXJhdGlvblZhbHVlLCAwLAogCQkJTlVMTCwgMCwgVVNCX0NUUkxfU0VUX1RJTUVPVVQpOwogCWlmIChyZXR2YWwgPCAwKQotCQlyZXR1cm4gcmV0dmFsOworCQlnb3RvIHJlc2V0X29sZF9hbHRzOworCW11dGV4X3VubG9jaygmaGNkLT5iYW5kd2lkdGhfbXV0ZXgpOwogCiAJLyogcmUtaW5pdCBoYy9oY2QgaW50ZXJmYWNlL2VuZHBvaW50IHN0YXRlICovCiAJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+ZGVzYy5iTnVtSW50ZXJmYWNlczsgaSsrKSB7CkBAIC0xNTg1LDcgKzE2MzMsNyBAQAogICoKICAqIFNlZSB1c2JfcXVldWVfcmVzZXRfZGV2aWNlKCkgZm9yIG1vcmUgZGV0YWlscwogICovCi12b2lkIF9fdXNiX3F1ZXVlX3Jlc2V0X2RldmljZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndzKQorc3RhdGljIHZvaWQgX191c2JfcXVldWVfcmVzZXRfZGV2aWNlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd3MpCiB7CiAJaW50IHJjOwogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSA9CkBAIC0xNjUyLDYgKzE3MDAsNyBAQAogCWludCBpLCByZXQ7CiAJc3RydWN0IHVzYl9ob3N0X2NvbmZpZyAqY3AgPSBOVUxMOwogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICoqbmV3X2ludGVyZmFjZXMgPSBOVUxMOworCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBidXNfdG9faGNkKGRldi0+YnVzKTsKIAlpbnQgbiwgbmludGY7CiAKIAlpZiAoZGV2LT5hdXRob3JpemVkID09IDAgfHwgY29uZmlndXJhdGlvbiA9PSAtMSkKQEAgLTE3MjEsMTIgKzE3NzAsMTEgQEAKIAkgKiBob3N0IGNvbnRyb2xsZXIgd2lsbCBub3QgYWxsb3cgc3VibWlzc2lvbnMgdG8gZHJvcHBlZCBlbmRwb2ludHMuICBJZgogCSAqIHRoaXMgY2FsbCBmYWlscywgdGhlIGRldmljZSBzdGF0ZSBpcyB1bmNoYW5nZWQuCiAJICovCi0JaWYgKGNwKQotCQlyZXQgPSB1c2JfaGNkX2NoZWNrX2JhbmR3aWR0aChkZXYsIGNwLCBOVUxMKTsKLQllbHNlCi0JCXJldCA9IHVzYl9oY2RfY2hlY2tfYmFuZHdpZHRoKGRldiwgTlVMTCwgTlVMTCk7CisJbXV0ZXhfbG9jaygmaGNkLT5iYW5kd2lkdGhfbXV0ZXgpOworCXJldCA9IHVzYl9oY2RfYWxsb2NfYmFuZHdpZHRoKGRldiwgY3AsIE5VTEwsIE5VTEwpOwogCWlmIChyZXQgPCAwKSB7CiAJCXVzYl9hdXRvc3VzcGVuZF9kZXZpY2UoZGV2KTsKKwkJbXV0ZXhfdW5sb2NrKCZoY2QtPmJhbmR3aWR0aF9tdXRleCk7CiAJCWdvdG8gZnJlZV9pbnRlcmZhY2VzOwogCX0KIApAQCAtMTc1MiwxMCArMTgwMCwxMiBAQAogCWRldi0+YWN0Y29uZmlnID0gY3A7CiAJaWYgKCFjcCkgewogCQl1c2Jfc2V0X2RldmljZV9zdGF0ZShkZXYsIFVTQl9TVEFURV9BRERSRVNTKTsKLQkJdXNiX2hjZF9jaGVja19iYW5kd2lkdGgoZGV2LCBOVUxMLCBOVUxMKTsKKwkJdXNiX2hjZF9hbGxvY19iYW5kd2lkdGgoZGV2LCBOVUxMLCBOVUxMLCBOVUxMKTsKIAkJdXNiX2F1dG9zdXNwZW5kX2RldmljZShkZXYpOworCQltdXRleF91bmxvY2soJmhjZC0+YmFuZHdpZHRoX211dGV4KTsKIAkJZ290byBmcmVlX2ludGVyZmFjZXM7CiAJfQorCW11dGV4X3VubG9jaygmaGNkLT5iYW5kd2lkdGhfbXV0ZXgpOwogCXVzYl9zZXRfZGV2aWNlX3N0YXRlKGRldiwgVVNCX1NUQVRFX0NPTkZJR1VSRUQpOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgbmV3IGludGVyZmFjZSBzdHJ1Y3R1cmVzIGFuZCB0aGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvc3lzZnMuYyBiL2RyaXZlcnMvdXNiL2NvcmUvc3lzZnMuYwppbmRleCA3ZWMzMDQxYS4uMTU0NzcwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9zeXNmcy5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvc3lzZnMuYwpAQCAtMTM5LDYgKzEzOSwxNiBAQAogc3RhdGljIERFVklDRV9BVFRSKGRldm51bSwgU19JUlVHTywgc2hvd19kZXZudW0sIE5VTEwpOwogCiBzdGF0aWMgc3NpemVfdAorc2hvd19kZXZwYXRoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKworCXVkZXYgPSB0b191c2JfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHVkZXYtPmRldnBhdGgpOworfQorc3RhdGljIERFVklDRV9BVFRSKGRldnBhdGgsIFNfSVJVR08sIHNob3dfZGV2cGF0aCwgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90CiBzaG93X3ZlcnNpb24oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwpAQCAtMzE3LDcgKzMyNyw2IEBACiAKIHN0YXRpYyBjb25zdCBjaGFyIG9uX3N0cmluZ1tdID0gIm9uIjsKIHN0YXRpYyBjb25zdCBjaGFyIGF1dG9fc3RyaW5nW10gPSAiYXV0byI7Ci1zdGF0aWMgY29uc3QgY2hhciBzdXNwZW5kX3N0cmluZ1tdID0gInN1c3BlbmQiOwogCiBzdGF0aWMgc3NpemVfdAogc2hvd19sZXZlbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCkBAIC0zMjUsMTMgKzMzNCw4IEBACiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSB0b191c2JfZGV2aWNlKGRldik7CiAJY29uc3QgY2hhciAqcCA9IGF1dG9fc3RyaW5nOwogCi0JaWYgKHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9TVVNQRU5ERUQpIHsKLQkJaWYgKHVkZXYtPmF1dG9yZXN1bWVfZGlzYWJsZWQpCi0JCQlwID0gc3VzcGVuZF9zdHJpbmc7Ci0JfSBlbHNlIHsKLQkJaWYgKHVkZXYtPmF1dG9zdXNwZW5kX2Rpc2FibGVkKQotCQkJcCA9IG9uX3N0cmluZzsKLQl9CisJaWYgKHVkZXYtPnN0YXRlICE9IFVTQl9TVEFURV9TVVNQRU5ERUQgJiYgdWRldi0+YXV0b3N1c3BlbmRfZGlzYWJsZWQpCisJCXAgPSBvbl9zdHJpbmc7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHApOwogfQogCkBAIC0zNDMsNyArMzQ3LDcgQEAKIAlpbnQgbGVuID0gY291bnQ7CiAJY2hhciAqY3A7CiAJaW50IHJjID0gMDsKLQlpbnQgb2xkX2F1dG9zdXNwZW5kX2Rpc2FibGVkLCBvbGRfYXV0b3Jlc3VtZV9kaXNhYmxlZDsKKwlpbnQgb2xkX2F1dG9zdXNwZW5kX2Rpc2FibGVkOwogCiAJY3AgPSBtZW1jaHIoYnVmLCAnXG4nLCBjb3VudCk7CiAJaWYgKGNwKQpAQCAtMzUxLDcgKzM1NSw2IEBACiAKIAl1c2JfbG9ja19kZXZpY2UodWRldik7CiAJb2xkX2F1dG9zdXNwZW5kX2Rpc2FibGVkID0gdWRldi0+YXV0b3N1c3BlbmRfZGlzYWJsZWQ7Ci0Jb2xkX2F1dG9yZXN1bWVfZGlzYWJsZWQgPSB1ZGV2LT5hdXRvcmVzdW1lX2Rpc2FibGVkOwogCiAJLyogU2V0dGluZyB0aGUgZmxhZ3Mgd2l0aG91dCBjYWxsaW5nIHVzYl9wbV9sb2NrIGlzIGEgc3ViamVjdCB0bwogCSAqIHJhY2VzLCBidXQgd2hvIGNhcmVzLi4uCkBAIC0zNTksMjggKzM2MiwxOCBAQAogCWlmIChsZW4gPT0gc2l6ZW9mIG9uX3N0cmluZyAtIDEgJiYKIAkJCXN0cm5jbXAoYnVmLCBvbl9zdHJpbmcsIGxlbikgPT0gMCkgewogCQl1ZGV2LT5hdXRvc3VzcGVuZF9kaXNhYmxlZCA9IDE7Ci0JCXVkZXYtPmF1dG9yZXN1bWVfZGlzYWJsZWQgPSAwOwogCQlyYyA9IHVzYl9leHRlcm5hbF9yZXN1bWVfZGV2aWNlKHVkZXYsIFBNU0dfVVNFUl9SRVNVTUUpOwogCiAJfSBlbHNlIGlmIChsZW4gPT0gc2l6ZW9mIGF1dG9fc3RyaW5nIC0gMSAmJgogCQkJc3RybmNtcChidWYsIGF1dG9fc3RyaW5nLCBsZW4pID09IDApIHsKIAkJdWRldi0+YXV0b3N1c3BlbmRfZGlzYWJsZWQgPSAwOwotCQl1ZGV2LT5hdXRvcmVzdW1lX2Rpc2FibGVkID0gMDsKIAkJcmMgPSB1c2JfZXh0ZXJuYWxfcmVzdW1lX2RldmljZSh1ZGV2LCBQTVNHX1VTRVJfUkVTVU1FKTsKIAotCX0gZWxzZSBpZiAobGVuID09IHNpemVvZiBzdXNwZW5kX3N0cmluZyAtIDEgJiYKLQkJCXN0cm5jbXAoYnVmLCBzdXNwZW5kX3N0cmluZywgbGVuKSA9PSAwKSB7Ci0JCXVkZXYtPmF1dG9zdXNwZW5kX2Rpc2FibGVkID0gMDsKLQkJdWRldi0+YXV0b3Jlc3VtZV9kaXNhYmxlZCA9IDE7Ci0JCXJjID0gdXNiX2V4dGVybmFsX3N1c3BlbmRfZGV2aWNlKHVkZXYsIFBNU0dfVVNFUl9TVVNQRU5EKTsKLQogCX0gZWxzZQogCQlyYyA9IC1FSU5WQUw7CiAKLQlpZiAocmMpIHsKKwlpZiAocmMpCiAJCXVkZXYtPmF1dG9zdXNwZW5kX2Rpc2FibGVkID0gb2xkX2F1dG9zdXNwZW5kX2Rpc2FibGVkOwotCQl1ZGV2LT5hdXRvcmVzdW1lX2Rpc2FibGVkID0gb2xkX2F1dG9yZXN1bWVfZGlzYWJsZWQ7Ci0JfQogCXVzYl91bmxvY2tfZGV2aWNlKHVkZXYpOwogCXJldHVybiAocmMgPCAwID8gcmMgOiBjb3VudCk7CiB9CkBAIC01MDgsNiArNTAxLDI4IEBACiBzdGF0aWMgREVWSUNFX0FUVFIoYXV0aG9yaXplZCwgMDY0NCwKIAkgICAgdXNiX2Rldl9hdXRob3JpemVkX3Nob3csIHVzYl9kZXZfYXV0aG9yaXplZF9zdG9yZSk7CiAKKy8qICJTYWZlbHkgcmVtb3ZlIGEgZGV2aWNlIiAqLworc3RhdGljIHNzaXplX3QgdXNiX3JlbW92ZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHRvX3VzYl9kZXZpY2UoZGV2KTsKKwlpbnQgcmMgPSAwOworCisJdXNiX2xvY2tfZGV2aWNlKHVkZXYpOworCWlmICh1ZGV2LT5zdGF0ZSAhPSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQpIHsKKworCQkvKiBUbyBhdm9pZCByYWNlcywgZmlyc3QgdW5jb25maWd1cmUgYW5kIHRoZW4gcmVtb3ZlICovCisJCXVzYl9zZXRfY29uZmlndXJhdGlvbih1ZGV2LCAtMSk7CisJCXJjID0gdXNiX3JlbW92ZV9kZXZpY2UodWRldik7CisJfQorCWlmIChyYyA9PSAwKQorCQlyYyA9IGNvdW50OworCXVzYl91bmxvY2tfZGV2aWNlKHVkZXYpOworCXJldHVybiByYzsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihyZW1vdmUsIDAyMDAsIE5VTEwsIHVzYl9yZW1vdmVfc3RvcmUpOworCiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpkZXZfYXR0cnNbXSA9IHsKIAkvKiBjdXJyZW50IGNvbmZpZ3VyYXRpb24ncyBhdHRyaWJ1dGVzICovCkBAIC01MTYsOCArNTMxLDggQEAKIAkmZGV2X2F0dHJfYkNvbmZpZ3VyYXRpb25WYWx1ZS5hdHRyLAogCSZkZXZfYXR0cl9ibUF0dHJpYnV0ZXMuYXR0ciwKIAkmZGV2X2F0dHJfYk1heFBvd2VyLmF0dHIsCi0JJmRldl9hdHRyX3VyYm51bS5hdHRyLAogCS8qIGRldmljZSBhdHRyaWJ1dGVzICovCisJJmRldl9hdHRyX3VyYm51bS5hdHRyLAogCSZkZXZfYXR0cl9pZFZlbmRvci5hdHRyLAogCSZkZXZfYXR0cl9pZFByb2R1Y3QuYXR0ciwKIAkmZGV2X2F0dHJfYmNkRGV2aWNlLmF0dHIsCkBAIC01MjksMTAgKzU0NCwxMiBAQAogCSZkZXZfYXR0cl9zcGVlZC5hdHRyLAogCSZkZXZfYXR0cl9idXNudW0uYXR0ciwKIAkmZGV2X2F0dHJfZGV2bnVtLmF0dHIsCisJJmRldl9hdHRyX2RldnBhdGguYXR0ciwKIAkmZGV2X2F0dHJfdmVyc2lvbi5hdHRyLAogCSZkZXZfYXR0cl9tYXhjaGlsZC5hdHRyLAogCSZkZXZfYXR0cl9xdWlya3MuYXR0ciwKIAkmZGV2X2F0dHJfYXV0aG9yaXplZC5hdHRyLAorCSZkZXZfYXR0cl9yZW1vdmUuYXR0ciwKIAlOVUxMLAogfTsKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGRldl9hdHRyX2dycCA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvdXJiLmMgYi9kcml2ZXJzL3VzYi9jb3JlL3VyYi5jCmluZGV4IDA4ODVkNGEuLmU3Y2FlMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvdXJiLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS91cmIuYwpAQCAtNDI5LDggKzQyOSwxNiBAQAogCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfSVNPQzoKIAljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lOVDoKIAkJLyogdG9vIHNtYWxsPyAqLwotCQlpZiAodXJiLT5pbnRlcnZhbCA8PSAwKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJCXN3aXRjaCAoZGV2LT5zcGVlZCkgeworCQljYXNlIFVTQl9TUEVFRF9WQVJJQUJMRToKKwkJCWlmICh1cmItPmludGVydmFsIDwgNikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKHVyYi0+aW50ZXJ2YWwgPD0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CiAJCS8qIHRvbyBiaWc/ICovCiAJCXN3aXRjaCAoZGV2LT5zcGVlZCkgewogCQljYXNlIFVTQl9TUEVFRF9TVVBFUjoJLyogdW5pdHMgYXJlIDEyNXVzICovCkBAIC00MzgsNiArNDQ2LDEwIEBACiAJCQlpZiAodXJiLT5pbnRlcnZhbCA+ICgxIDw8IDE1KSkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCW1heCA9IDEgPDwgMTU7CisJCWNhc2UgVVNCX1NQRUVEX1ZBUklBQkxFOgorCQkJaWYgKHVyYi0+aW50ZXJ2YWwgPiAxNikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOwogCQljYXNlIFVTQl9TUEVFRF9ISUdIOgkvKiB1bml0cyBhcmUgbWljcm9mcmFtZXMgKi8KIAkJCS8qIE5PVEUgdXNiIGhhbmRsZXMgMl4xNSAqLwogCQkJaWYgKHVyYi0+aW50ZXJ2YWwgPiAoMTAyNCAqIDgpKQpAQCAtNDYxLDggKzQ3MywxMCBAQAogCQlkZWZhdWx0OgogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJLyogUm91bmQgZG93biB0byBhIHBvd2VyIG9mIDIsIG5vIG1vcmUgdGhhbiBtYXggKi8KLQkJdXJiLT5pbnRlcnZhbCA9IG1pbihtYXgsIDEgPDwgaWxvZzIodXJiLT5pbnRlcnZhbCkpOworCQlpZiAoZGV2LT5zcGVlZCAhPSBVU0JfU1BFRURfVkFSSUFCTEUpIHsKKwkJCS8qIFJvdW5kIGRvd24gdG8gYSBwb3dlciBvZiAyLCBubyBtb3JlIHRoYW4gbWF4ICovCisJCQl1cmItPmludGVydmFsID0gbWluKG1heCwgMSA8PCBpbG9nMih1cmItPmludGVydmFsKSk7CisJCX0KIAl9CiAKIAlyZXR1cm4gdXNiX2hjZF9zdWJtaXRfdXJiKHVyYiwgbWVtX2ZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmMgYi9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jCmluZGV4IGIxYjg1YWIuLjRlMmM2ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS91c2IuYwpAQCAtNjQsNiArNjQsNDMgQEAKIAogCiAvKioKKyAqIHVzYl9maW5kX2FsdF9zZXR0aW5nKCkgLSBHaXZlbiBhIGNvbmZpZ3VyYXRpb24sIGZpbmQgdGhlIGFsdGVybmF0ZSBzZXR0aW5nCisgKiBmb3IgdGhlIGdpdmVuIGludGVyZmFjZS4KKyAqIEBjb25maWcgLSB0aGUgY29uZmlndXJhdGlvbiB0byBzZWFyY2ggKG5vdCBuZWNlc3NhcmlseSB0aGUgY3VycmVudCBjb25maWcpLgorICogQGlmYWNlX251bSAtIGludGVyZmFjZSBudW1iZXIgdG8gc2VhcmNoIGluCisgKiBAYWx0X251bSAtIGFsdGVybmF0ZSBpbnRlcmZhY2Ugc2V0dGluZyBudW1iZXIgdG8gc2VhcmNoIGZvci4KKyAqCisgKiBTZWFyY2ggdGhlIGNvbmZpZ3VyYXRpb24ncyBpbnRlcmZhY2UgY2FjaGUgZm9yIHRoZSBnaXZlbiBhbHQgc2V0dGluZy4KKyAqLworc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqdXNiX2ZpbmRfYWx0X3NldHRpbmcoCisJCXN0cnVjdCB1c2JfaG9zdF9jb25maWcgKmNvbmZpZywKKwkJdW5zaWduZWQgaW50IGlmYWNlX251bSwKKwkJdW5zaWduZWQgaW50IGFsdF9udW0pCit7CisJc3RydWN0IHVzYl9pbnRlcmZhY2VfY2FjaGUgKmludGZfY2FjaGUgPSBOVUxMOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+ZGVzYy5iTnVtSW50ZXJmYWNlczsgaSsrKSB7CisJCWlmIChjb25maWctPmludGZfY2FjaGVbaV0tPmFsdHNldHRpbmdbMF0uZGVzYy5iSW50ZXJmYWNlTnVtYmVyCisJCQkJPT0gaWZhY2VfbnVtKSB7CisJCQlpbnRmX2NhY2hlID0gY29uZmlnLT5pbnRmX2NhY2hlW2ldOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCFpbnRmX2NhY2hlKQorCQlyZXR1cm4gTlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgaW50Zl9jYWNoZS0+bnVtX2FsdHNldHRpbmc7IGkrKykKKwkJaWYgKGludGZfY2FjaGUtPmFsdHNldHRpbmdbaV0uZGVzYy5iQWx0ZXJuYXRlU2V0dGluZyA9PSBhbHRfbnVtKQorCQkJcmV0dXJuICZpbnRmX2NhY2hlLT5hbHRzZXR0aW5nW2ldOworCisJcHJpbnRrKEtFUk5fREVCVUcgIkRpZCBub3QgZmluZCBhbHQgc2V0dGluZyAldSBmb3IgaW50ZiAldSwgIgorCQkJImNvbmZpZyAldVxuIiwgYWx0X251bSwgaWZhY2VfbnVtLAorCQkJY29uZmlnLT5kZXNjLmJDb25maWd1cmF0aW9uVmFsdWUpOworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwodXNiX2ZpbmRfYWx0X3NldHRpbmcpOworCisvKioKICAqIHVzYl9pZm51bV90b19pZiAtIGdldCB0aGUgaW50ZXJmYWNlIG9iamVjdCB3aXRoIGEgZ2l2ZW4gaW50ZXJmYWNlIG51bWJlcgogICogQGRldjogdGhlIGRldmljZSB3aG9zZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gaXMgY29uc2lkZXJlZAogICogQGlmbnVtOiB0aGUgZGVzaXJlZCBpbnRlcmZhY2UKQEAgLTEzMCwyNCArMTY3LDE3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1c2JfYWx0bnVtX3RvX2FsdHNldHRpbmcpOwogCi1zdHJ1Y3QgZmluZF9pbnRlcmZhY2VfYXJnIHsKLQlpbnQgbWlub3I7Ci0Jc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZTsKLX07Ci0KIHN0YXRpYyBpbnQgX19maW5kX2ludGVyZmFjZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGZpbmRfaW50ZXJmYWNlX2FyZyAqYXJnID0gZGF0YTsKKwlpbnQgKm1pbm9yID0gZGF0YTsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKIAogCWlmICghaXNfdXNiX2ludGVyZmFjZShkZXYpKQogCQlyZXR1cm4gMDsKIAogCWludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7Ci0JaWYgKGludGYtPm1pbm9yICE9IC0xICYmIGludGYtPm1pbm9yID09IGFyZy0+bWlub3IpIHsKLQkJYXJnLT5pbnRlcmZhY2UgPSBpbnRmOworCWlmIChpbnRmLT5taW5vciAhPSAtMSAmJiBpbnRmLT5taW5vciA9PSAqbWlub3IpCiAJCXJldHVybiAxOwotCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU2LDIxICsxODYsMjAgQEAKICAqIEBkcnY6IHRoZSBkcml2ZXIgd2hvc2UgY3VycmVudCBjb25maWd1cmF0aW9uIGlzIGNvbnNpZGVyZWQKICAqIEBtaW5vcjogdGhlIG1pbm9yIG51bWJlciBvZiB0aGUgZGVzaXJlZCBkZXZpY2UKICAqCi0gKiBUaGlzIHdhbGtzIHRoZSBkcml2ZXIgZGV2aWNlIGxpc3QgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBpbnRlcmZhY2UKKyAqIFRoaXMgd2Fsa3MgdGhlIGJ1cyBkZXZpY2UgbGlzdCBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGludGVyZmFjZQogICogd2l0aCB0aGUgbWF0Y2hpbmcgbWlub3IuICBOb3RlLCB0aGlzIG9ubHkgd29ya3MgZm9yIGRldmljZXMgdGhhdCBzaGFyZSB0aGUKICAqIFVTQiBtYWpvciBudW1iZXIuCiAgKi8KIHN0cnVjdCB1c2JfaW50ZXJmYWNlICp1c2JfZmluZF9pbnRlcmZhY2Uoc3RydWN0IHVzYl9kcml2ZXIgKmRydiwgaW50IG1pbm9yKQogewotCXN0cnVjdCBmaW5kX2ludGVyZmFjZV9hcmcgYXJnYjsKLQlpbnQgcmV0dmFsOworCXN0cnVjdCBkZXZpY2UgKmRldjsKIAotCWFyZ2IubWlub3IgPSBtaW5vcjsKLQlhcmdiLmludGVyZmFjZSA9IE5VTEw7Ci0JLyogZWF0IHRoZSBlcnJvciwgaXQgd2lsbCBiZSBpbiBhcmdiLmludGVyZmFjZSAqLwotCXJldHZhbCA9IGRyaXZlcl9mb3JfZWFjaF9kZXZpY2UoJmRydi0+ZHJ2d3JhcC5kcml2ZXIsIE5VTEwsICZhcmdiLAotCQkJCQlfX2ZpbmRfaW50ZXJmYWNlKTsKLQlyZXR1cm4gYXJnYi5pbnRlcmZhY2U7CisJZGV2ID0gYnVzX2ZpbmRfZGV2aWNlKCZ1c2JfYnVzX3R5cGUsIE5VTEwsICZtaW5vciwgX19maW5kX2ludGVyZmFjZSk7CisKKwkvKiBEcm9wIHJlZmVyZW5jZSBjb3VudCBmcm9tIGJ1c19maW5kX2RldmljZSAqLworCXB1dF9kZXZpY2UoZGV2KTsKKworCXJldHVybiBkZXYgPyB0b191c2JfaW50ZXJmYWNlKGRldikgOiBOVUxMOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodXNiX2ZpbmRfaW50ZXJmYWNlKTsKIApAQCAtMTAzOCw3ICsxMDY3LDcgQEAKIHN0cnVjdCBkZW50cnkgKnVzYl9kZWJ1Z19yb290OwogRVhQT1JUX1NZTUJPTF9HUEwodXNiX2RlYnVnX3Jvb3QpOwogCi1zdHJ1Y3QgZGVudHJ5ICp1c2JfZGVidWdfZGV2aWNlczsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICp1c2JfZGVidWdfZGV2aWNlczsKIAogc3RhdGljIGludCB1c2JfZGVidWdmc19pbml0KHZvaWQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5oIGIvZHJpdmVycy91c2IvY29yZS91c2IuaAppbmRleCA5YThiMTVlLi40YzM2YzdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5oCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmgKQEAgLTI0LDYgKzI0LDcgQEAKIGV4dGVybiBpbnQgdXNiX2RlYXV0aG9yaXplX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqKTsKIGV4dGVybiBpbnQgdXNiX2F1dGhvcml6ZV9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKik7CiBleHRlcm4gdm9pZCB1c2JfZGV0ZWN0X3F1aXJrcyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldik7CitleHRlcm4gaW50IHVzYl9yZW1vdmVfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KTsKIAogZXh0ZXJuIGludCB1c2JfZ2V0X2RldmljZV9kZXNjcmlwdG9yKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsCiAJCXVuc2lnbmVkIGludCBzaXplKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnIGIvZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWcKaW5kZXggYTE4ZTNjNS4uZWU0MTEyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWcKQEAgLTczMiw2ICs3MzIsMjQgQEAKIAkgIGJlaGF2aW9yIG9mIFVTQiBNYXNzIFN0b3JhZ2UgaG9zdHMuICBOb3QgbmVlZGVkIGZvcgogCSAgbm9ybWFsIG9wZXJhdGlvbi4KIAorY29uZmlnIFVTQl9NQVNTX1NUT1JBR0UKKwl0cmlzdGF0ZSAiTWFzcyBTdG9yYWdlIEdhZGdldCIKKwlkZXBlbmRzIG9uIEJMT0NLCisJaGVscAorCSAgVGhlIE1hc3MgU3RvcmFnZSBHYWRnZXQgYWN0cyBhcyBhIFVTQiBNYXNzIFN0b3JhZ2UgZGlzayBkcml2ZS4KKwkgIEFzIGl0cyBzdG9yYWdlIHJlcG9zaXRvcnkgaXQgY2FuIHVzZSBhIHJlZ3VsYXIgZmlsZSBvciBhIGJsb2NrCisJICBkZXZpY2UgKGluIG11Y2ggdGhlIHNhbWUgd2F5IGFzIHRoZSAibG9vcCIgZGV2aWNlIGRyaXZlciksCisJICBzcGVjaWZpZWQgYXMgYSBtb2R1bGUgcGFyYW1ldGVyIG9yIHN5c2ZzIG9wdGlvbi4KKworCSAgVGhpcyBpcyBoZWF2aWx5IGJhc2VkIG9uIEZpbGUtYmFja2VkIFN0b3JhZ2UgR2FkZ2V0IGFuZCBpbiBtb3N0CisJICBjYXNlcyB5b3Ugd2lsbCB3YW50IHRvIHVzZSBGU0cgaW5zdGVhZC4gIFRoaXMgZ2FkZ2V0IGlzIG1vc3RseQorCSAgaGVyZSB0byB0ZXN0IHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBNYXNzIFN0b3JhZ2UgRnVuY3Rpb24KKwkgIHdoaWNoIG1heSBiZSB1c2VkIHdpdGggY29tcG9zaXRlIGZyYW1ld29yay4KKworCSAgU2F5ICJ5IiB0byBsaW5rIHRoZSBkcml2ZXIgc3RhdGljYWxseSwgb3IgIm0iIHRvIGJ1aWxkCisJICBhIGR5bmFtaWNhbGx5IGxpbmtlZCBtb2R1bGUgY2FsbGVkICJnX2ZpbGVfc3RvcmFnZSIuICBJZiB1bnN1cmUsCisJICBjb25zaWRlciBGaWxlLWJhY2tlZCBTdG9yYWdlIEdhZGdldC4KKwogY29uZmlnIFVTQl9HX1NFUklBTAogCXRyaXN0YXRlICJTZXJpYWwgR2FkZ2V0ICh3aXRoIENEQyBBQ00gYW5kIENEQyBPQkVYIHN1cHBvcnQpIgogCWhlbHAKQEAgLTc5NCw2ICs4MTIsNDggQEAKIAkgIFNheSAieSIgdG8gbGluayB0aGUgZHJpdmVyIHN0YXRpY2FsbHksIG9yICJtIiB0byBidWlsZCBhCiAJICBkeW5hbWljYWxseSBsaW5rZWQgbW9kdWxlLgogCitjb25maWcgVVNCX0dfTVVMVEkKKwl0cmlzdGF0ZSAiTXVsdGlmdW5jdGlvbiBDb21wb3NpdGUgR2FkZ2V0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gQkxPQ0sgJiYgTkVUCisJaGVscAorCSAgVGhlIE11bHRpZnVuY3Rpb24gQ29tcG9zaXRlIEdhZGdldCBwcm92aWRlcyBFdGhlcm5ldCAoUk5ESVMKKwkgIGFuZC9vciBDREMgRXRoZXJuZXQpLCBtYXNzIHN0b3JhZ2UgYW5kIEFDTSBzZXJpYWwgbGluaworCSAgaW50ZXJmYWNlcy4KKworCSAgWW91IHdpbGwgYmUgYXNrZWQgdG8gY2hvb3NlIHdoaWNoIG9mIHRoZSB0d28gY29uZmlndXJhdGlvbnMgaXMKKwkgIHRvIGJlIGF2YWlsYWJsZSBpbiB0aGUgZ2FkZ2V0LiAgQXQgbGVhc3Qgb25lIGNvbmZpZ3VyYXRpb24gbXVzdAorCSAgYmUgY2hvc2VuIHRvIG1ha2UgdGhlIGdhZGdldCB1c2FibGUuICBTZWxlY3RpbmcgbW9yZSB0aGFuIG9uZQorCSAgY29uZmlndXJhdGlvbiB3aWxsIHByZXZlbnQgV2luZG93cyBmcm9tIGF1dG9tYXRpY2FsbHkgZGV0ZWN0aW5nCisJICB0aGUgZ2FkZ2V0IGFzIGEgY29tcG9zaXRlIGdhZGdldCwgc28gYW4gSU5GIGZpbGUgd2lsbCBiZSBuZWVkZWQgdG8KKwkgIHVzZSB0aGUgZ2FkZ2V0LgorCisJICBTYXkgInkiIHRvIGxpbmsgdGhlIGRyaXZlciBzdGF0aWNhbGx5LCBvciAibSIgdG8gYnVpbGQgYQorCSAgZHluYW1pY2FsbHkgbGlua2VkIG1vZHVsZSBjYWxsZWQgImdfbXVsdGkiLgorCitjb25maWcgVVNCX0dfTVVMVElfUk5ESVMKKwlib29sICJSTkRJUyArIENEQyBTZXJpYWwgKyBTdG9yYWdlIGNvbmZpZ3VyYXRpb24iCisJZGVwZW5kcyBvbiBVU0JfR19NVUxUSQorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgYSBjb25maWd1cmF0aW9uIHdpdGggUk5ESVMsIENEQyBTZXJpYWwgYW5kCisJICBNYXNzIFN0b3JhZ2UgZnVuY3Rpb25zIGF2YWlsYWJsZSBpbiB0aGUgTXVsdGlmdW5jdGlvbiBDb21wb3NpdGUKKwkgIEdhZGdldC4gIFRoaXMgaXMgdGhlIGNvbmZpZ3VyYXRpb24gZGVkaWNhdGVkIGZvciBXaW5kb3dzIHNpbmNlIFJORElTCisJICBpcyBNaWNyb3NvZnQncyBwcm90b2NvbC4KKworCSAgSWYgdW5zdXJlLCBzYXkgInkiLgorCitjb25maWcgVVNCX0dfTVVMVElfQ0RDCisJYm9vbCAiQ0RDIEV0aGVybmV0ICsgQ0RDIFNlcmlhbCArIFN0b3JhZ2UgY29uZmlndXJhdGlvbiIKKwlkZXBlbmRzIG9uIFVTQl9HX01VTFRJCisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBhIGNvbmZpZ3VyYXRpb24gd2l0aCBDREMgRXRoZXJuZXQgKEVDTSksIENEQworCSAgU2VyaWFsIGFuZCBNYXNzIFN0b3JhZ2UgZnVuY3Rpb25zIGF2YWlsYWJsZSBpbiB0aGUgTXVsdGlmdW5jdGlvbgorCSAgQ29tcG9zaXRlIEdhZGdldC4KKworCSAgSWYgdW5zdXJlLCBzYXkgInkiLgorCisKICMgcHV0IGRyaXZlcnMgdGhhdCBuZWVkIGlzb2Nocm9ub3VzIHRyYW5zZmVyIHN1cHBvcnQgKGZvciBhdWRpbwogIyBvciB2aWRlbyBjbGFzcyBnYWRnZXQgZHJpdmVycyksIG9yIHNwZWNpZmljIGhhcmR3YXJlLCBoZXJlLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9nYWRnZXQvTWFrZWZpbGUKaW5kZXggOWQ3Yjg3Yy4uMmUyYzA0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9NYWtlZmlsZQpAQCAtMzksMTYgKzM5LDIwIEBACiBnX21pZGktb2JqcwkJCTo9IGdtaWRpLm8KIGdhZGdldGZzLW9ianMJCQk6PSBpbm9kZS5vCiBnX2ZpbGVfc3RvcmFnZS1vYmpzCQk6PSBmaWxlX3N0b3JhZ2UubworZ19tYXNzX3N0b3JhZ2Utb2JqcwkJOj0gbWFzc19zdG9yYWdlLm8KIGdfcHJpbnRlci1vYmpzCQkJOj0gcHJpbnRlci5vCiBnX2NkYy1vYmpzCQkJOj0gY2RjMi5vCitnX211bHRpLW9ianMJCQk6PSBtdWx0aS5vCiAKIG9iai0kKENPTkZJR19VU0JfWkVSTykJCSs9IGdfemVyby5vCiBvYmotJChDT05GSUdfVVNCX0FVRElPKQkJKz0gZ19hdWRpby5vCiBvYmotJChDT05GSUdfVVNCX0VUSCkJCSs9IGdfZXRoZXIubwogb2JqLSQoQ09ORklHX1VTQl9HQURHRVRGUykJKz0gZ2FkZ2V0ZnMubwogb2JqLSQoQ09ORklHX1VTQl9GSUxFX1NUT1JBR0UpCSs9IGdfZmlsZV9zdG9yYWdlLm8KK29iai0kKENPTkZJR19VU0JfTUFTU19TVE9SQUdFKQkrPSBnX21hc3Nfc3RvcmFnZS5vCiBvYmotJChDT05GSUdfVVNCX0dfU0VSSUFMKQkrPSBnX3NlcmlhbC5vCiBvYmotJChDT05GSUdfVVNCX0dfUFJJTlRFUikJKz0gZ19wcmludGVyLm8KIG9iai0kKENPTkZJR19VU0JfTUlESV9HQURHRVQpCSs9IGdfbWlkaS5vCiBvYmotJChDT05GSUdfVVNCX0NEQ19DT01QT1NJVEUpICs9IGdfY2RjLm8KK29iai0kKENPTkZJR19VU0JfR19NVUxUSSkJKz0gZ19tdWx0aS5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9hdDkxX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2F0OTFfdWRjLmMKaW5kZXggNjY0NTBhMS4uMDQzZTA0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2F0OTFfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2F0OTFfdWRjLmMKQEAgLTg5Miw3ICs4OTIsNyBAQAogCiAJCQl0eHZjIHw9IEFUOTFfVURQX1RYVkNfUFVPTjsKIAkJCWF0OTFfdWRwX3dyaXRlKHVkYywgQVQ5MV9VRFBfVFhWQywgdHh2Yyk7Ci0JCX0gZWxzZSBpZiAoY3B1X2lzX2F0OTFzYW05MjYxKCkpIHsKKwkJfSBlbHNlIGlmIChjcHVfaXNfYXQ5MXNhbTkyNjEoKSB8fCBjcHVfaXNfYXQ5MXNhbTlnMTAoKSkgewogCQkJdTMyCXVzYnB1Y3I7CiAKIAkJCXVzYnB1Y3IgPSBhdDkxX3N5c19yZWFkKEFUOTFfTUFUUklYX1VTQlBVQ1IpOwpAQCAtOTEwLDcgKzkxMCw3IEBACiAKIAkJCXR4dmMgJj0gfkFUOTFfVURQX1RYVkNfUFVPTjsKIAkJCWF0OTFfdWRwX3dyaXRlKHVkYywgQVQ5MV9VRFBfVFhWQywgdHh2Yyk7Ci0JCX0gZWxzZSBpZiAoY3B1X2lzX2F0OTFzYW05MjYxKCkpIHsKKwkJfSBlbHNlIGlmIChjcHVfaXNfYXQ5MXNhbTkyNjEoKSB8fCBjcHVfaXNfYXQ5MXNhbTlnMTAoKSkgewogCQkJdTMyCXVzYnB1Y3I7CiAKIAkJCXVzYnB1Y3IgPSBhdDkxX3N5c19yZWFkKEFUOTFfTUFUUklYX1VTQlBVQ1IpOwpAQCAtMTY5Miw3ICsxNjkyLDcgQEAKIAkJdWRjLT5lcFszXS5tYXhwYWNrZXQgPSA2NDsKIAkJdWRjLT5lcFs0XS5tYXhwYWNrZXQgPSA1MTI7CiAJCXVkYy0+ZXBbNV0ubWF4cGFja2V0ID0gNTEyOwotCX0gZWxzZSBpZiAoY3B1X2lzX2F0OTFzYW05MjYxKCkpIHsKKwl9IGVsc2UgaWYgKGNwdV9pc19hdDkxc2FtOTI2MSgpIHx8IGNwdV9pc19hdDkxc2FtOWcxMCgpKSB7CiAJCXVkYy0+ZXBbM10ubWF4cGFja2V0ID0gNjQ7CiAJfSBlbHNlIGlmIChjcHVfaXNfYXQ5MXNhbTkyNjMoKSkgewogCQl1ZGMtPmVwWzBdLm1heHBhY2tldCA9IDY0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2F1ZGlvLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvYXVkaW8uYwppbmRleCBhM2EwZjRhLi41OGYyMjAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvYXVkaW8uYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvYXVkaW8uYwpAQCAtODksMTIwICs4OSw2IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLS8qKgotICogSGFuZGxlIFVTQiBhdWRpbyBlbmRwb2ludCBzZXQvZ2V0IGNvbW1hbmQgaW4gc2V0dXAgY2xhc3MgcmVxdWVzdAotICovCi0KLXN0YXRpYyBpbnQgYXVkaW9fc2V0X2VuZHBvaW50X3JlcShzdHJ1Y3QgdXNiX2NvbmZpZ3VyYXRpb24gKmMsCi0JCWNvbnN0IHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmN0cmwpCi17Ci0Jc3RydWN0IHVzYl9jb21wb3NpdGVfZGV2ICpjZGV2ID0gYy0+Y2RldjsKLQlpbnQJCQl2YWx1ZSA9IC1FT1BOT1RTVVBQOwotCXUxNgkJCWVwID0gbGUxNl90b19jcHUoY3RybC0+d0luZGV4KTsKLQl1MTYJCQlsZW4gPSBsZTE2X3RvX2NwdShjdHJsLT53TGVuZ3RoKTsKLQl1MTYJCQl3X3ZhbHVlID0gbGUxNl90b19jcHUoY3RybC0+d1ZhbHVlKTsKLQotCURCRyhjZGV2LCAiYlJlcXVlc3QgMHgleCwgd192YWx1ZSAweCUwNHgsIGxlbiAlZCwgZW5kcG9pbnQgJWRcbiIsCi0JCQljdHJsLT5iUmVxdWVzdCwgd192YWx1ZSwgbGVuLCBlcCk7Ci0KLQlzd2l0Y2ggKGN0cmwtPmJSZXF1ZXN0KSB7Ci0JY2FzZSBVQUNfU0VUX0NVUjoKLQkJdmFsdWUgPSAwOwotCQlicmVhazsKLQotCWNhc2UgVUFDX1NFVF9NSU46Ci0JCWJyZWFrOwotCi0JY2FzZSBVQUNfU0VUX01BWDoKLQkJYnJlYWs7Ci0KLQljYXNlIFVBQ19TRVRfUkVTOgotCQlicmVhazsKLQotCWNhc2UgVUFDX1NFVF9NRU06Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHZhbHVlOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX2dldF9lbmRwb2ludF9yZXEoc3RydWN0IHVzYl9jb25maWd1cmF0aW9uICpjLAotCQljb25zdCBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjdHJsKQotewotCXN0cnVjdCB1c2JfY29tcG9zaXRlX2RldiAqY2RldiA9IGMtPmNkZXY7Ci0JaW50IHZhbHVlID0gLUVPUE5PVFNVUFA7Ci0JdTggZXAgPSAoKGxlMTZfdG9fY3B1KGN0cmwtPndJbmRleCkgPj4gOCkgJiAweEZGKTsKLQl1MTYgbGVuID0gbGUxNl90b19jcHUoY3RybC0+d0xlbmd0aCk7Ci0JdTE2IHdfdmFsdWUgPSBsZTE2X3RvX2NwdShjdHJsLT53VmFsdWUpOwotCi0JREJHKGNkZXYsICJiUmVxdWVzdCAweCV4LCB3X3ZhbHVlIDB4JTA0eCwgbGVuICVkLCBlbmRwb2ludCAlZFxuIiwKLQkJCWN0cmwtPmJSZXF1ZXN0LCB3X3ZhbHVlLCBsZW4sIGVwKTsKLQotCXN3aXRjaCAoY3RybC0+YlJlcXVlc3QpIHsKLQljYXNlIFVBQ19HRVRfQ1VSOgotCWNhc2UgVUFDX0dFVF9NSU46Ci0JY2FzZSBVQUNfR0VUX01BWDoKLQljYXNlIFVBQ19HRVRfUkVTOgotCQl2YWx1ZSA9IDM7Ci0JCWJyZWFrOwotCWNhc2UgVUFDX0dFVF9NRU06Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiB2YWx1ZTsKLX0KLQotc3RhdGljIGludAotYXVkaW9fc2V0dXAoc3RydWN0IHVzYl9jb25maWd1cmF0aW9uICpjLCBjb25zdCBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjdHJsKQotewotCXN0cnVjdCB1c2JfY29tcG9zaXRlX2RldiAqY2RldiA9IGMtPmNkZXY7Ci0Jc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEgPSBjZGV2LT5yZXE7Ci0JaW50IHZhbHVlID0gLUVPUE5PVFNVUFA7Ci0JdTE2IHdfaW5kZXggPSBsZTE2X3RvX2NwdShjdHJsLT53SW5kZXgpOwotCXUxNiB3X3ZhbHVlID0gbGUxNl90b19jcHUoY3RybC0+d1ZhbHVlKTsKLQl1MTYgd19sZW5ndGggPSBsZTE2X3RvX2NwdShjdHJsLT53TGVuZ3RoKTsKLQotCS8qIGNvbXBvc2l0ZSBkcml2ZXIgaW5mcmFzdHJ1Y3R1cmUgaGFuZGxlcyBldmVyeXRoaW5nIGV4Y2VwdAotCSAqIEF1ZGlvIGNsYXNzIG1lc3NhZ2VzOyBpbnRlcmZhY2UgYWN0aXZhdGlvbiB1c2VzIHNldF9hbHQoKS4KLQkgKi8KLQlzd2l0Y2ggKGN0cmwtPmJSZXF1ZXN0VHlwZSkgewotCWNhc2UgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9FTkRQT0lOVDoKLQkJdmFsdWUgPSBhdWRpb19zZXRfZW5kcG9pbnRfcmVxKGMsIGN0cmwpOwotCQlicmVhazsKLQotCWNhc2UgVVNCX0RJUl9JTiB8IFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0VORFBPSU5UOgotCQl2YWx1ZSA9IGF1ZGlvX2dldF9lbmRwb2ludF9yZXEoYywgY3RybCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJRVJST1IoY2RldiwgIkludmFsaWQgY29udHJvbCByZXElMDJ4LiUwMnggdiUwNHggaSUwNHggbCVkXG4iLAotCQkJY3RybC0+YlJlcXVlc3RUeXBlLCBjdHJsLT5iUmVxdWVzdCwKLQkJCXdfdmFsdWUsIHdfaW5kZXgsIHdfbGVuZ3RoKTsKLQl9Ci0KLQkvKiByZXNwb25kIHdpdGggZGF0YSB0cmFuc2ZlciBvciBzdGF0dXMgcGhhc2U/ICovCi0JaWYgKHZhbHVlID49IDApIHsKLQkJREJHKGNkZXYsICJBdWRpbyByZXElMDJ4LiUwMnggdiUwNHggaSUwNHggbCVkXG4iLAotCQkJY3RybC0+YlJlcXVlc3RUeXBlLCBjdHJsLT5iUmVxdWVzdCwKLQkJCXdfdmFsdWUsIHdfaW5kZXgsIHdfbGVuZ3RoKTsKLQkJcmVxLT56ZXJvID0gMDsKLQkJcmVxLT5sZW5ndGggPSB2YWx1ZTsKLQkJdmFsdWUgPSB1c2JfZXBfcXVldWUoY2Rldi0+Z2FkZ2V0LT5lcDAsIHJlcSwgR0ZQX0FUT01JQyk7Ci0JCWlmICh2YWx1ZSA8IDApCi0JCQlFUlJPUihjZGV2LCAiQXVkaW8gcmVzcG9uc2Ugb24gZXJyICVkXG4iLCB2YWx1ZSk7Ci0JfQotCi0JLyogZGV2aWNlIGVpdGhlciBzdGFsbHMgKHZhbHVlIDwgMCkgb3IgcmVwb3J0cyBzdWNjZXNzICovCi0JcmV0dXJuIHZhbHVlOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCiBzdGF0aWMgaW50IF9faW5pdCBhdWRpb19kb19jb25maWcoc3RydWN0IHVzYl9jb25maWd1cmF0aW9uICpjKQogewogCS8qIEZJWE1FIGFsbG9jIGlDb25maWd1cmF0aW9uIHN0cmluZywgc2V0IGl0IGluIGMtPnN0cmluZ3MgKi8KQEAgLTIyMCw3ICsxMDYsNiBAQAogc3RhdGljIHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbiBhdWRpb19jb25maWdfZHJpdmVyID0gewogCS5sYWJlbAkJCT0gRFJJVkVSX0RFU0MsCiAJLmJpbmQJCQk9IGF1ZGlvX2RvX2NvbmZpZywKLQkuc2V0dXAJCQk9IGF1ZGlvX3NldHVwLAogCS5iQ29uZmlndXJhdGlvblZhbHVlCT0gMSwKIAkvKiAuaUNvbmZpZ3VyYXRpb24gPSBEWU5BTUlDICovCiAJLmJtQXR0cmlidXRlcwkJPSBVU0JfQ09ORklHX0FUVF9TRUxGUE9XRVIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvY29tcG9zaXRlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvY29tcG9zaXRlLmMKaW5kZXggZDA1Mzk3ZS4uMDkyODliYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2NvbXBvc2l0ZS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9jb21wb3NpdGUuYwpAQCAtMzczLDYgKzM3Myw4IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShmLCAmY2Rldi0+Y29uZmlnLT5mdW5jdGlvbnMsIGxpc3QpIHsKIAkJaWYgKGYtPmRpc2FibGUpCiAJCQlmLT5kaXNhYmxlKGYpOworCisJCWJpdG1hcF96ZXJvKGYtPmVuZHBvaW50cywgMzIpOwogCX0KIAljZGV2LT5jb25maWcgPSBOVUxMOwogfQpAQCAtNDE4LDEwICs0MjAsMzUgQEAKIAkvKiBJbml0aWFsaXplIGFsbCBpbnRlcmZhY2VzIGJ5IHNldHRpbmcgdGhlbSB0byBhbHRzZXR0aW5nIHplcm8uICovCiAJZm9yICh0bXAgPSAwOyB0bXAgPCBNQVhfQ09ORklHX0lOVEVSRkFDRVM7IHRtcCsrKSB7CiAJCXN0cnVjdCB1c2JfZnVuY3Rpb24JKmYgPSBjLT5pbnRlcmZhY2VbdG1wXTsKKwkJc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKmRlc2NyaXB0b3JzOwogCiAJCWlmICghZikKIAkJCWJyZWFrOwogCisJCS8qCisJCSAqIFJlY29yZCB3aGljaCBlbmRwb2ludHMgYXJlIHVzZWQgYnkgdGhlIGZ1bmN0aW9uLiBUaGlzIGlzIHVzZWQKKwkJICogdG8gZGlzcGF0Y2ggY29udHJvbCByZXF1ZXN0cyB0YXJnZXRlZCBhdCB0aGF0IGVuZHBvaW50IHRvIHRoZQorCQkgKiBmdW5jdGlvbidzIHNldHVwIGNhbGxiYWNrIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQKKwkJICogY29uZmlndXJhdGlvbidzIHNldHVwIGNhbGxiYWNrLgorCQkgKi8KKwkJaWYgKGdhZGdldC0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpCisJCQlkZXNjcmlwdG9ycyA9IGYtPmhzX2Rlc2NyaXB0b3JzOworCQllbHNlCisJCQlkZXNjcmlwdG9ycyA9IGYtPmRlc2NyaXB0b3JzOworCisJCWZvciAoOyAqZGVzY3JpcHRvcnM7ICsrZGVzY3JpcHRvcnMpIHsKKwkJCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXA7CisJCQlpbnQgYWRkcjsKKworCQkJaWYgKCgqZGVzY3JpcHRvcnMpLT5iRGVzY3JpcHRvclR5cGUgIT0gVVNCX0RUX0VORFBPSU5UKQorCQkJCWNvbnRpbnVlOworCisJCQllcCA9IChzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKikqZGVzY3JpcHRvcnM7CisJCQlhZGRyID0gKChlcC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4ODApID4+IDMpCisJCQkgICAgIHwgIChlcC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4MGYpOworCQkJc2V0X2JpdChhZGRyLCBmLT5lbmRwb2ludHMpOworCQl9CisKIAkJcmVzdWx0ID0gZi0+c2V0X2FsdChmLCB0bXAsIDApOwogCQlpZiAocmVzdWx0IDwgMCkgewogCQkJREJHKGNkZXYsICJpbnRlcmZhY2UgJWQgKCVzLyVwKSBhbHQgMCAtLT4gJWRcbiIsCkBAIC02ODgsNiArNzE1LDcgQEAKIAl1MTYJCQkJd192YWx1ZSA9IGxlMTZfdG9fY3B1KGN0cmwtPndWYWx1ZSk7CiAJdTE2CQkJCXdfbGVuZ3RoID0gbGUxNl90b19jcHUoY3RybC0+d0xlbmd0aCk7CiAJc3RydWN0IHVzYl9mdW5jdGlvbgkJKmYgPSBOVUxMOworCXU4CQkJCWVuZHA7CiAKIAkvKiBwYXJ0aWFsIHJlLWluaXQgb2YgdGhlIHJlc3BvbnNlIG1lc3NhZ2U7IHRoZSBmdW5jdGlvbiBvciB0aGUKIAkgKiBnYWRnZXQgbWlnaHQgbmVlZCB0byBpbnRlcmNlcHQgZS5nLiBhIGNvbnRyb2wtT1VUIGNvbXBsZXRpb24KQEAgLTgwMCwyMyArODI4LDMzIEBACiAJCQljdHJsLT5iUmVxdWVzdFR5cGUsIGN0cmwtPmJSZXF1ZXN0LAogCQkJd192YWx1ZSwgd19pbmRleCwgd19sZW5ndGgpOwogCi0JCS8qIGZ1bmN0aW9ucyBhbHdheXMgaGFuZGxlIHRoZWlyIGludGVyZmFjZXMgLi4uIHB1bnQgb3RoZXIKLQkJICogcmVjaXBpZW50cyAoZW5kcG9pbnQsIG90aGVyLCBXVVNCLCAuLi4pIHRvIHRoZSBjdXJyZW50CisJCS8qIGZ1bmN0aW9ucyBhbHdheXMgaGFuZGxlIHRoZWlyIGludGVyZmFjZXMgYW5kIGVuZHBvaW50cy4uLgorCQkgKiBwdW50IG90aGVyIHJlY2lwaWVudHMgKG90aGVyLCBXVVNCLCAuLi4pIHRvIHRoZSBjdXJyZW50CiAJCSAqIGNvbmZpZ3VyYXRpb24gY29kZS4KIAkJICoKIAkJICogUkVWSVNJVCBpdCBjb3VsZCBtYWtlIHNlbnNlIHRvIGxldCB0aGUgY29tcG9zaXRlIGRldmljZQogCQkgKiB0YWtlIHN1Y2ggcmVxdWVzdHMgdG9vLCBpZiB0aGF0J3MgZXZlciBuZWVkZWQ6ICB0byB3b3JrCiAJCSAqIGluIGNvbmZpZyAwLCBldGMuCiAJCSAqLwotCQlpZiAoKGN0cmwtPmJSZXF1ZXN0VHlwZSAmIFVTQl9SRUNJUF9NQVNLKQotCQkJCT09IFVTQl9SRUNJUF9JTlRFUkZBQ0UpIHsKKwkJc3dpdGNoIChjdHJsLT5iUmVxdWVzdFR5cGUgJiBVU0JfUkVDSVBfTUFTSykgeworCQljYXNlIFVTQl9SRUNJUF9JTlRFUkZBQ0U6CiAJCQlmID0gY2Rldi0+Y29uZmlnLT5pbnRlcmZhY2VbaW50Zl07Ci0JCQlpZiAoZiAmJiBmLT5zZXR1cCkKLQkJCQl2YWx1ZSA9IGYtPnNldHVwKGYsIGN0cmwpOwotCQkJZWxzZQorCQkJYnJlYWs7CisKKwkJY2FzZSBVU0JfUkVDSVBfRU5EUE9JTlQ6CisJCQllbmRwID0gKCh3X2luZGV4ICYgMHg4MCkgPj4gMykgfCAod19pbmRleCAmIDB4MGYpOworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShmLCAmY2Rldi0+Y29uZmlnLT5mdW5jdGlvbnMsIGxpc3QpIHsKKwkJCQlpZiAodGVzdF9iaXQoZW5kcCwgZi0+ZW5kcG9pbnRzKSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoJmYtPmxpc3QgPT0gJmNkZXYtPmNvbmZpZy0+ZnVuY3Rpb25zKQogCQkJCWYgPSBOVUxMOworCQkJYnJlYWs7CiAJCX0KLQkJaWYgKHZhbHVlIDwgMCAmJiAhZikgeworCisJCWlmIChmICYmIGYtPnNldHVwKQorCQkJdmFsdWUgPSBmLT5zZXR1cChmLCBjdHJsKTsKKwkJZWxzZSB7CiAJCQlzdHJ1Y3QgdXNiX2NvbmZpZ3VyYXRpb24JKmM7CiAKIAkJCWMgPSBjZGV2LT5jb25maWc7CkBAIC0xMDU0LDcgKzEwOTIsOCBAQAogCS5zcGVlZAkJPSBVU0JfU1BFRURfSElHSCwKIAogCS5iaW5kCQk9IGNvbXBvc2l0ZV9iaW5kLAotCS51bmJpbmQJCT0gX19leGl0X3AoY29tcG9zaXRlX3VuYmluZCksCisJLyogLnVuYmluZAkJPSBfX2V4aXRfcChjb21wb3NpdGVfdW5iaW5kKSwgKi8KKwkudW5iaW5kCQk9IGNvbXBvc2l0ZV91bmJpbmQsCiAKIAkuc2V0dXAJCT0gY29tcG9zaXRlX3NldHVwLAogCS5kaXNjb25uZWN0CT0gY29tcG9zaXRlX2Rpc2Nvbm5lY3QsCkBAIC0xMTAzLDcgKzExNDIsNyBAQAogICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHVucmVnaXN0ZXIgZHJpdmVycyB1c2luZyB0aGUgY29tcG9zaXRlCiAgKiBkcml2ZXIgZnJhbWV3b3JrLgogICovCi12b2lkIF9fZXhpdCB1c2JfY29tcG9zaXRlX3VucmVnaXN0ZXIoc3RydWN0IHVzYl9jb21wb3NpdGVfZHJpdmVyICpkcml2ZXIpCit2b2lkIC8qIF9fZXhpdCAqLyB1c2JfY29tcG9zaXRlX3VucmVnaXN0ZXIoc3RydWN0IHVzYl9jb21wb3NpdGVfZHJpdmVyICpkcml2ZXIpCiB7CiAJaWYgKGNvbXBvc2l0ZSAhPSBkcml2ZXIpCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2V0aGVyLmMKaW5kZXggMTY3Y2IyYS4uMTQxMzcyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2V0aGVyLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2V0aGVyLmMKQEAgLTI1LDYgKzI1LDE0IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogCisKKyNpZiBkZWZpbmVkIFVTQl9FVEhfUk5ESVMKKyMgIHVuZGVmIFVTQl9FVEhfUk5ESVMKKyNlbmRpZgorI2lmZGVmIENPTkZJR19VU0JfRVRIX1JORElTCisjICBkZWZpbmUgVVNCX0VUSF9STkRJUyB5CisjZW5kaWYKKwogI2luY2x1ZGUgInVfZXRoZXIuaCIKIAogCkBAIC02Niw3ICs3NCw3IEBACiAjZGVmaW5lIERSSVZFUl9ERVNDCQkiRXRoZXJuZXQgR2FkZ2V0IgogI2RlZmluZSBEUklWRVJfVkVSU0lPTgkJIk1lbW9yaWFsIERheSAyMDA4IgogCi0jaWZkZWYgQ09ORklHX1VTQl9FVEhfUk5ESVMKKyNpZmRlZiBVU0JfRVRIX1JORElTCiAjZGVmaW5lIFBSRUZJWAkJCSJSTkRJUy8iCiAjZWxzZQogI2RlZmluZSBQUkVGSVgJCQkiIgpAQCAtODcsNyArOTUsNyBAQAogCiBzdGF0aWMgaW5saW5lIGJvb2wgaGFzX3JuZGlzKHZvaWQpCiB7Ci0jaWZkZWYJQ09ORklHX1VTQl9FVEhfUk5ESVMKKyNpZmRlZglVU0JfRVRIX1JORElTCiAJcmV0dXJuIHRydWU7CiAjZWxzZQogCXJldHVybiBmYWxzZTsKQEAgLTExMCw3ICsxMTgsNyBAQAogCiAjaW5jbHVkZSAiZl9lY20uYyIKICNpbmNsdWRlICJmX3N1YnNldC5jIgotI2lmZGVmCUNPTkZJR19VU0JfRVRIX1JORElTCisjaWZkZWYJVVNCX0VUSF9STkRJUwogI2luY2x1ZGUgImZfcm5kaXMuYyIKICNpbmNsdWRlICJybmRpcy5jIgogI2VuZGlmCkBAIC0yNTEsNyArMjU5LDcgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotI2lmZGVmIENPTkZJR19VU0JfRVRIX0VFTQorI2lmZGVmIFVTQl9FVEhfRUVNCiBzdGF0aWMgaW50IHVzZV9lZW0gPSAxOwogI2Vsc2UKIHN0YXRpYyBpbnQgdXNlX2VlbTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX2FjbS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfYWNtLmMKaW5kZXggNGUzNjU3OC4uZDEwMzUzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfYWNtLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfYWNtLmMKQEAgLTQsNiArNCw4IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQWwgQm9yY2hlcnMgKGFsYm9yY2hlcnNAc3RlaW5lcnBvaW50LmNvbSkKICAqIENvcHlyaWdodCAoQykgMjAwOCBieSBEYXZpZCBCcm93bmVsbAogICogQ29weXJpZ2h0IChDKSAyMDA4IGJ5IE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgYnkgU2Ftc3VuZyBFbGVjdHJvbmljcworICogQXV0aG9yOiBNaWNoYWwgTmF6YXJld2ljeiAobS5uYXphcmV3aWN6QHNhbXN1bmcuY29tKQogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbAogICogUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKQEAgLTk5LDYgKzEwMSwyMCBAQAogCiAvKiBpbnRlcmZhY2UgYW5kIGNsYXNzIGRlc2NyaXB0b3JzOiAqLwogCitzdGF0aWMgc3RydWN0IHVzYl9pbnRlcmZhY2VfYXNzb2NfZGVzY3JpcHRvcgorYWNtX2lhZF9kZXNjcmlwdG9yID0geworCS5iTGVuZ3RoID0JCXNpemVvZiBhY21faWFkX2Rlc2NyaXB0b3IsCisJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9JTlRFUkZBQ0VfQVNTT0NJQVRJT04sCisKKwkvKiAuYkZpcnN0SW50ZXJmYWNlID0JRFlOQU1JQywgKi8KKwkuYkludGVyZmFjZUNvdW50ID0gCTIsCS8vIGNvbnRyb2wgKyBkYXRhCisJLmJGdW5jdGlvbkNsYXNzID0JVVNCX0NMQVNTX0NPTU0sCisJLmJGdW5jdGlvblN1YkNsYXNzID0JVVNCX0NEQ19TVUJDTEFTU19BQ00sCisJLmJGdW5jdGlvblByb3RvY29sID0JVVNCX0NEQ19QUk9UT19OT05FLAorCS8qIC5pRnVuY3Rpb24gPQkJRFlOQU1JQyAqLworfTsKKworCiBzdGF0aWMgc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciBhY21fY29udHJvbF9pbnRlcmZhY2VfZGVzYyBfX2luaXRkYXRhID0gewogCS5iTGVuZ3RoID0JCVVTQl9EVF9JTlRFUkZBQ0VfU0laRSwKIAkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0lOVEVSRkFDRSwKQEAgLTE3OCw2ICsxOTQsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKmFjbV9mc19mdW5jdGlvbltdIF9faW5pdGRhdGEgPSB7CisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmFjbV9pYWRfZGVzY3JpcHRvciwKIAkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmYWNtX2NvbnRyb2xfaW50ZXJmYWNlX2Rlc2MsCiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmFjbV9oZWFkZXJfZGVzYywKIAkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmYWNtX2NhbGxfbWdtdF9kZXNjcmlwdG9yLApAQCAtMjE2LDYgKzIzMyw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqYWNtX2hzX2Z1bmN0aW9uW10gX19pbml0ZGF0YSA9IHsKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmYWNtX2lhZF9kZXNjcmlwdG9yLAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZhY21fY29udHJvbF9pbnRlcmZhY2VfZGVzYywKIAkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmYWNtX2hlYWRlcl9kZXNjLAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZhY21fY2FsbF9tZ210X2Rlc2NyaXB0b3IsCkBAIC0yMzIsMTEgKzI1MCwxMyBAQAogCiAjZGVmaW5lIEFDTV9DVFJMX0lEWAkwCiAjZGVmaW5lIEFDTV9EQVRBX0lEWAkxCisjZGVmaW5lIEFDTV9JQURfSURYCTIKIAogLyogc3RhdGljIHN0cmluZ3MsIGluIFVURi04ICovCiBzdGF0aWMgc3RydWN0IHVzYl9zdHJpbmcgYWNtX3N0cmluZ19kZWZzW10gPSB7CiAJW0FDTV9DVFJMX0lEWF0ucyA9ICJDREMgQWJzdHJhY3QgQ29udHJvbCBNb2RlbCAoQUNNKSIsCiAJW0FDTV9EQVRBX0lEWF0ucyA9ICJDREMgQUNNIERhdGEiLAorCVtBQ01fSUFEX0lEWCBdLnMgPSAiQ0RDIFNlcmlhbCIsCiAJeyAgLyogWkVST0VTIEVORCBMSVNUICovIH0sCiB9OwogCkBAIC01NjMsNiArNTgzLDcgQEAKIAlpZiAoc3RhdHVzIDwgMCkKIAkJZ290byBmYWlsOwogCWFjbS0+Y3RybF9pZCA9IHN0YXR1czsKKwlhY21faWFkX2Rlc2NyaXB0b3IuYkZpcnN0SW50ZXJmYWNlID0gc3RhdHVzOwogCiAJYWNtX2NvbnRyb2xfaW50ZXJmYWNlX2Rlc2MuYkludGVyZmFjZU51bWJlciA9IHN0YXR1czsKIAlhY21fdW5pb25fZGVzYyAuYk1hc3RlckludGVyZmFjZTAgPSBzdGF0dXM7CkBAIC03MzIsNiArNzUzLDEzIEBACiAJCWFjbV9zdHJpbmdfZGVmc1tBQ01fREFUQV9JRFhdLmlkID0gc3RhdHVzOwogCiAJCWFjbV9kYXRhX2ludGVyZmFjZV9kZXNjLmlJbnRlcmZhY2UgPSBzdGF0dXM7CisKKwkJc3RhdHVzID0gdXNiX3N0cmluZ19pZChjLT5jZGV2KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCQlhY21fc3RyaW5nX2RlZnNbQUNNX0lBRF9JRFhdLmlkID0gc3RhdHVzOworCisJCWFjbV9pYWRfZGVzY3JpcHRvci5pRnVuY3Rpb24gPSBzdGF0dXM7CiAJfQogCiAJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgb25lIG5ldyBpbnN0YW5jZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfYXVkaW8uYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX2F1ZGlvLmMKaW5kZXggOThlOWJiOS4uYzQzYzg5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfYXVkaW8uYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9hdWRpby5jCkBAIC00NDUsNiArNDQ1LDcwIEBACiAJcmV0dXJuIGxlbjsKIH0KIAorc3RhdGljIGludCBhdWRpb19zZXRfZW5kcG9pbnRfcmVxKHN0cnVjdCB1c2JfZnVuY3Rpb24gKmYsCisJCWNvbnN0IHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmN0cmwpCit7CisJc3RydWN0IHVzYl9jb21wb3NpdGVfZGV2ICpjZGV2ID0gZi0+Y29uZmlnLT5jZGV2OworCWludAkJCXZhbHVlID0gLUVPUE5PVFNVUFA7CisJdTE2CQkJZXAgPSBsZTE2X3RvX2NwdShjdHJsLT53SW5kZXgpOworCXUxNgkJCWxlbiA9IGxlMTZfdG9fY3B1KGN0cmwtPndMZW5ndGgpOworCXUxNgkJCXdfdmFsdWUgPSBsZTE2X3RvX2NwdShjdHJsLT53VmFsdWUpOworCisJREJHKGNkZXYsICJiUmVxdWVzdCAweCV4LCB3X3ZhbHVlIDB4JTA0eCwgbGVuICVkLCBlbmRwb2ludCAlZFxuIiwKKwkJCWN0cmwtPmJSZXF1ZXN0LCB3X3ZhbHVlLCBsZW4sIGVwKTsKKworCXN3aXRjaCAoY3RybC0+YlJlcXVlc3QpIHsKKwljYXNlIFVBQ19TRVRfQ1VSOgorCQl2YWx1ZSA9IDA7CisJCWJyZWFrOworCisJY2FzZSBVQUNfU0VUX01JTjoKKwkJYnJlYWs7CisKKwljYXNlIFVBQ19TRVRfTUFYOgorCQlicmVhazsKKworCWNhc2UgVUFDX1NFVF9SRVM6CisJCWJyZWFrOworCisJY2FzZSBVQUNfU0VUX01FTToKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBpbnQgYXVkaW9fZ2V0X2VuZHBvaW50X3JlcShzdHJ1Y3QgdXNiX2Z1bmN0aW9uICpmLAorCQljb25zdCBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjdHJsKQoreworCXN0cnVjdCB1c2JfY29tcG9zaXRlX2RldiAqY2RldiA9IGYtPmNvbmZpZy0+Y2RldjsKKwlpbnQgdmFsdWUgPSAtRU9QTk9UU1VQUDsKKwl1OCBlcCA9ICgobGUxNl90b19jcHUoY3RybC0+d0luZGV4KSA+PiA4KSAmIDB4RkYpOworCXUxNiBsZW4gPSBsZTE2X3RvX2NwdShjdHJsLT53TGVuZ3RoKTsKKwl1MTYgd192YWx1ZSA9IGxlMTZfdG9fY3B1KGN0cmwtPndWYWx1ZSk7CisKKwlEQkcoY2RldiwgImJSZXF1ZXN0IDB4JXgsIHdfdmFsdWUgMHglMDR4LCBsZW4gJWQsIGVuZHBvaW50ICVkXG4iLAorCQkJY3RybC0+YlJlcXVlc3QsIHdfdmFsdWUsIGxlbiwgZXApOworCisJc3dpdGNoIChjdHJsLT5iUmVxdWVzdCkgeworCWNhc2UgVUFDX0dFVF9DVVI6CisJY2FzZSBVQUNfR0VUX01JTjoKKwljYXNlIFVBQ19HRVRfTUFYOgorCWNhc2UgVUFDX0dFVF9SRVM6CisJCXZhbHVlID0gMzsKKwkJYnJlYWs7CisJY2FzZSBVQUNfR0VUX01FTToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHZhbHVlOworfQorCiBzdGF0aWMgaW50CiBmX2F1ZGlvX3NldHVwKHN0cnVjdCB1c2JfZnVuY3Rpb24gKmYsIGNvbnN0IHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmN0cmwpCiB7CkBAIC00NTUsOCArNTE5LDggQEAKIAl1MTYJCQl3X3ZhbHVlID0gbGUxNl90b19jcHUoY3RybC0+d1ZhbHVlKTsKIAl1MTYJCQl3X2xlbmd0aCA9IGxlMTZfdG9fY3B1KGN0cmwtPndMZW5ndGgpOwogCi0JLyogY29tcG9zaXRlIGRyaXZlciBpbmZyYXN0cnVjdHVyZSBoYW5kbGVzIGV2ZXJ5dGhpbmcgZXhjZXB0Ci0JICogQXVkaW8gY2xhc3MgbWVzc2FnZXM7IGludGVyZmFjZSBhY3RpdmF0aW9uIHVzZXMgc2V0X2FsdCgpLgorCS8qIGNvbXBvc2l0ZSBkcml2ZXIgaW5mcmFzdHJ1Y3R1cmUgaGFuZGxlcyBldmVyeXRoaW5nOyBpbnRlcmZhY2UKKwkgKiBhY3RpdmF0aW9uIHVzZXMgc2V0X2FsdCgpLgogCSAqLwogCXN3aXRjaCAoY3RybC0+YlJlcXVlc3RUeXBlKSB7CiAJY2FzZSBVU0JfRElSX09VVCB8IFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRToKQEAgLTQ2Nyw2ICs1MzEsMTQgQEAKIAkJdmFsdWUgPSBhdWRpb19nZXRfaW50Zl9yZXEoZiwgY3RybCk7CiAJCWJyZWFrOwogCisJY2FzZSBVU0JfRElSX09VVCB8IFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0VORFBPSU5UOgorCQl2YWx1ZSA9IGF1ZGlvX3NldF9lbmRwb2ludF9yZXEoZiwgY3RybCk7CisJCWJyZWFrOworCisJY2FzZSBVU0JfRElSX0lOIHwgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfRU5EUE9JTlQ6CisJCXZhbHVlID0gYXVkaW9fZ2V0X2VuZHBvaW50X3JlcShmLCBjdHJsKTsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlFUlJPUihjZGV2LCAiaW52YWxpZCBjb250cm9sIHJlcSUwMnguJTAyeCB2JTA0eCBpJTA0eCBsJWRcbiIsCiAJCQljdHJsLT5iUmVxdWVzdFR5cGUsIGN0cmwtPmJSZXF1ZXN0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfbWFzc19zdG9yYWdlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9tYXNzX3N0b3JhZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzc2NDBlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfbWFzc19zdG9yYWdlLmMKQEAgLTAsMCArMSwzMDkxIEBACisvKgorICogZl9tYXNzX3N0b3JhZ2UuYyAtLSBNYXNzIFN0b3JhZ2UgVVNCIENvbXBvc2l0ZSBGdW5jdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEFsYW4gU3Rlcm4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBTYW1zdW5nIEVsZWN0cm9uaWNzCisgKiAgICAgICAgICAgICAgICAgICAgQXV0aG9yOiBNaWNoYWwgTmF6YXJld2ljeiA8bS5uYXphcmV3aWN6QHNhbXN1bmcuY29tPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisKKy8qCisgKiBUaGUgTWFzcyBTdG9yYWdlIEZ1bmN0aW9uIGFjdHMgYXMgYSBVU0IgTWFzcyBTdG9yYWdlIGRldmljZSwKKyAqIGFwcGVhcmluZyB0byB0aGUgaG9zdCBhcyBhIGRpc2sgZHJpdmUgb3IgYXMgYSBDRC1ST00gZHJpdmUuICBJbgorICogYWRkaXRpb24gdG8gcHJvdmlkaW5nIGFuIGV4YW1wbGUgb2YgYSBnZW51aW5lbHkgdXNlZnVsIGNvbXBvc2l0ZQorICogZnVuY3Rpb24gZm9yIGEgVVNCIGRldmljZSwgaXQgYWxzbyBpbGx1c3RyYXRlcyBhIHRlY2huaXF1ZSBvZgorICogZG91YmxlLWJ1ZmZlcmluZyBmb3IgaW5jcmVhc2VkIHRocm91Z2hwdXQuCisgKgorICogRnVuY3Rpb24gc3VwcG9ydHMgbXVsdGlwbGUgbG9naWNhbCB1bml0cyAoTFVOcykuICBCYWNraW5nIHN0b3JhZ2UKKyAqIGZvciBlYWNoIExVTiBpcyBwcm92aWRlZCBieSBhIHJlZ3VsYXIgZmlsZSBvciBhIGJsb2NrIGRldmljZS4KKyAqIEFjY2VzcyBmb3IgZWFjaCBMVU4gY2FuIGJlIGxpbWl0ZWQgdG8gcmVhZC1vbmx5LiAgTW9yZW92ZXIsIHRoZQorICogZnVuY3Rpb24gY2FuIGluZGljYXRlIHRoYXQgTFVOIGlzIHJlbW92YWJsZSBhbmQvb3IgQ0QtUk9NLiAgKFRoZQorICogbGF0ZXIgaW1wbGllcyByZWFkLW9ubHkgYWNjZXNzLikKKyAqCisgKiBNU0YgaXMgY29uZmlndXJlZCBieSBzcGVjaWZ5aW5nIGEgZnNnX2NvbmZpZyBzdHJ1Y3R1cmUuICBJdCBoYXMgdGhlCisgKiBmb2xsb3dpbmcgZmllbGRzOgorICoKKyAqCW5sdW5zCQlOdW1iZXIgb2YgTFVOcyBmdW5jdGlvbiBoYXZlIChhbnl3aGVyZSBmcm9tIDEKKyAqCQkJCXRvIEZTR19NQVhfTFVOUyB3aGljaCBpcyA4KS4KKyAqCWx1bnMJCUFuIGFycmF5IG9mIExVTiBjb25maWd1cmF0aW9uIHZhbHVlcy4gIFRoaXMKKyAqCQkJCXNob3VsZCBiZSBmaWxsZWQgZm9yIGVhY2ggTFVOIHRoYXQKKyAqCQkJCWZ1bmN0aW9uIHdpbGwgaW5jbHVkZSAoaWUuIGZvciAibmx1bnMiCisgKgkJCQlMVU5zKS4gIEVhY2ggZWxlbWVudCBvZiB0aGUgYXJyYXkgaGFzCisgKgkJCQl0aGUgZm9sbG93aW5nIGZpZWxkczoKKyAqCS0+ZmlsZW5hbWUJVGhlIHBhdGggdG8gdGhlIGJhY2tpbmcgZmlsZSBmb3IgdGhlIExVTi4KKyAqCQkJCVJlcXVpcmVkIGlmIExVTiBpcyBub3QgbWFya2VkIGFzCisgKgkJCQlyZW1vdmFibGUuCisgKgktPnJvCQlGbGFnIHNwZWNpZnlpbmcgYWNjZXNzIHRvIHRoZSBMVU4gc2hhbGwgYmUKKyAqCQkJCXJlYWQtb25seS4gIFRoaXMgaXMgaW1wbGllZCBpZiBDRC1ST00KKyAqCQkJCWVtdWxhdGlvbiBpcyBlbmFibGVkIGFzIHdlbGwgYXMgd2hlbgorICoJCQkJaXQgd2FzIGltcG9zc2libGUgdG8gb3BlbiAiZmlsZW5hbWUiCisgKgkJCQlpbiBSL1cgbW9kZS4KKyAqCS0+cmVtb3ZhYmxlCUZsYWcgc3BlY2lmeWluZyB0aGF0IExVTiBzaGFsbCBiZSBpbmRpY2F0ZWQgYXMKKyAqCQkJCWJlaW5nIHJlbW92YWJsZS4KKyAqCS0+Y2Ryb20JCUZsYWcgc3BlY2lmeWluZyB0aGF0IExVTiBzaGFsbCBiZSByZXBvcnRlZCBhcworICoJCQkJYmVpbmcgYSBDRC1ST00uCisgKgorICoJbHVuX25hbWVfZm9ybWF0CUEgcHJpbnRmLWxpa2UgZm9ybWF0IGZvciBuYW1lcyBvZiB0aGUgTFVOCisgKgkJCQlkZXZpY2VzLiAgVGhpcyBkZXRlcm1pbmVzIGhvdyB0aGUKKyAqCQkJCWRpcmVjdG9yeSBpbiBzeXNmcyB3aWxsIGJlIG5hbWVkLgorICoJCQkJVW5sZXNzIHlvdSBhcmUgdXNpbmcgc2V2ZXJhbCBNU0ZzIGluCisgKgkJCQlhIHNpbmdsZSBnYWRnZXQgKGFzIG9wcG9zZWQgdG8gc2luZ2xlCisgKgkJCQlNU0YgaW4gbWFueSBjb25maWd1cmF0aW9ucykgeW91IG1heQorICoJCQkJbGVhdmUgaXQgYXMgTlVMTCAoaW4gd2hpY2ggY2FzZQorICoJCQkJImx1biVkIiB3aWxsIGJlIHVzZWQpLiAgSW4gdGhlIGZvcm1hdAorICoJCQkJeW91IGNhbiB1c2UgIiVkIiB0byBpbmRleCBMVU5zIGZvcgorICoJCQkJTVNGJ3Mgd2l0aCBtb3JlIHRoYW4gb25lIExVTi4gIChCZXdhcmUKKyAqCQkJCXRoYXQgdGhlcmUgaXMgb25seSBvbmUgaW50ZWdlciBnaXZlbgorICoJCQkJYXMgYW4gYXJndW1lbnQgZm9yIHRoZSBmb3JtYXQgYW5kCisgKgkJCQlzcGVjaWZ5aW5nIGludmFsaWQgZm9ybWF0IG1heSBjYXVzZQorICoJCQkJdW5zcGVjaWZpZWQgYmVoYXZpb3VyLikKKyAqCXRocmVhZF9uYW1lCU5hbWUgb2YgdGhlIGtlcm5lbCB0aHJlYWQgcHJvY2VzcyB1c2VkIGJ5IHRoZQorICoJCQkJTVNGLiAgWW91IGNhbiBzYWZlbHkgc2V0IGl0IHRvIE5VTEwKKyAqCQkJCShpbiB3aGljaCBjYXNlIGRlZmF1bHQgImZpbGUtc3RvcmFnZSIKKyAqCQkJCXdpbGwgYmUgdXNlZCkuCisgKgorICoJdmVuZG9yX25hbWUKKyAqCXByb2R1Y3RfbmFtZQorICoJcmVsZWFzZQkJSW5mb3JtYXRpb24gdXNlZCBhcyBhIHJlcGx5IHRvIElOUVVJUlkKKyAqCQkJCXJlcXVlc3QuICBUbyB1c2UgZGVmYXVsdCBzZXQgdG8gTlVMTCwKKyAqCQkJCU5VTEwsIDB4ZmZmZiByZXNwZWN0aXZlbHkuICBUaGUgZmlyc3QKKyAqCQkJCWZpZWxkIHNob3VsZCBiZSA4IGFuZCB0aGUgc2Vjb25kIDE2CisgKgkJCQljaGFyYWN0ZXJzIG9yIGxlc3MuCisgKgorICoJY2FuX3N0YWxsCVNldCB0byBwZXJtaXQgZnVuY3Rpb24gdG8gaGFsdCBidWxrIGVuZHBvaW50cy4KKyAqCQkJCURpc2FibGVkIG9uIHNvbWUgVVNCIGRldmljZXMga25vd24gbm90CisgKgkJCQl0byB3b3JrIGNvcnJlY3RseS4gIFlvdSBzaG91bGQgc2V0IGl0CisgKgkJCQl0byB0cnVlLgorICoKKyAqIElmICJyZW1vdmFibGUiIGlzIG5vdCBzZXQgZm9yIGEgTFVOIHRoZW4gYSBiYWNraW5nIGZpbGUgbXVzdCBiZQorICogc3BlY2lmaWVkLiAgSWYgaXQgaXMgc2V0LCB0aGVuIE5VTEwgZmlsZW5hbWUgbWVhbnMgdGhlIExVTidzIG1lZGl1bQorICogaXMgbm90IGxvYWRlZCAoYW4gZW1wdHkgc3RyaW5nIGFzICJmaWxlbmFtZSIgaW4gdGhlIGZzZ19jb25maWcKKyAqIHN0cnVjdHVyZSBjYXVzZXMgZXJyb3IpLiAgVGhlIENELVJPTSBlbXVsYXRpb24gaW5jbHVkZXMgYSBzaW5nbGUKKyAqIGRhdGEgdHJhY2sgYW5kIG5vIGF1ZGlvIHRyYWNrczsgaGVuY2UgdGhlcmUgbmVlZCBiZSBvbmx5IG9uZQorICogYmFja2luZyBmaWxlIHBlciBMVU4uICBOb3RlIGFsc28gdGhhdCB0aGUgQ0QtUk9NIGJsb2NrIGxlbmd0aCBpcworICogc2V0IHRvIDUxMiByYXRoZXIgdGhhbiB0aGUgbW9yZSBjb21tb24gdmFsdWUgMjA0OC4KKyAqCisgKgorICogTVNGIGluY2x1ZGVzIHN1cHBvcnQgZm9yIG1vZHVsZSBwYXJhbWV0ZXJzLiAgSWYgZ2FkZ2V0IHVzaW5nIGl0CisgKiBkZWNpZGVzIHRvIHVzZSBpdCwgdGhlIGZvbGxvd2luZyBtb2R1bGUgcGFyYW1ldGVycyB3aWxsIGJlCisgKiBhdmFpbGFibGU6CisgKgorICoJZmlsZT1maWxlbmFtZVssZmlsZW5hbWUuLi5dCisgKgkJCU5hbWVzIG9mIHRoZSBmaWxlcyBvciBibG9jayBkZXZpY2VzIHVzZWQgZm9yCisgKgkJCQliYWNraW5nIHN0b3JhZ2UuCisgKglybz1iWyxiLi4uXQlEZWZhdWx0IGZhbHNlLCBib29sZWFuIGZvciByZWFkLW9ubHkgYWNjZXNzLgorICoJcmVtb3ZhYmxlPWJbLGIuLi5dCisgKgkJCURlZmF1bHQgdHJ1ZSwgYm9vbGVhbiBmb3IgcmVtb3ZhYmxlIG1lZGlhLgorICoJY2Ryb209YlssYi4uLl0JRGVmYXVsdCBmYWxzZSwgYm9vbGVhbiBmb3Igd2hldGhlciB0byBlbXVsYXRlCisgKgkJCQlhIENELVJPTSBkcml2ZS4KKyAqCWx1bnM9TgkJRGVmYXVsdCBOID0gbnVtYmVyIG9mIGZpbGVuYW1lcywgbnVtYmVyIG9mCisgKgkJCQlMVU5zIHRvIHN1cHBvcnQuCisgKglzdGFsbAkJRGVmYXVsdCBkZXRlcm1pbmVkIGFjY29yZGluZyB0byB0aGUgdHlwZSBvZgorICoJCQkJVVNCIGRldmljZSBjb250cm9sbGVyICh1c3VhbGx5IHRydWUpLAorICoJCQkJYm9vbGVhbiB0byBwZXJtaXQgdGhlIGRyaXZlciB0byBoYWx0CisgKgkJCQlidWxrIGVuZHBvaW50cy4KKyAqCisgKiBUaGUgbW9kdWxlIHBhcmFtZXRlcnMgbWF5IGJlIHByZWZpeGVkIHdpdGggc29tZSBzdHJpbmcuICBZb3UgbmVlZAorICogdG8gY29uc3VsdCBnYWRnZXQncyBkb2N1bWVudGF0aW9uIG9yIHNvdXJjZSB0byB2ZXJpZnkgd2hldGhlciBpdCBpcworICogdXNpbmcgdGhvc2UgbW9kdWxlIHBhcmFtZXRlcnMgYW5kIGlmIGl0IGRvZXMgd2hhdCBhcmUgdGhlIHByZWZpeGVzCisgKiAobG9vayBmb3IgRlNHX01PRFVMRV9QQVJBTUVURVJTKCkgbWFjcm8gdXNhZ2UsIHdoYXQncyBpbnNpZGUgaXQgaXMKKyAqIHRoZSBwcmVmaXgpLgorICoKKyAqCisgKiBSZXF1aXJlbWVudHMgYXJlIG1vZGVzdDsgb25seSBhIGJ1bGstaW4gYW5kIGEgYnVsay1vdXQgZW5kcG9pbnQgYXJlCisgKiBuZWVkZWQuICBUaGUgbWVtb3J5IHJlcXVpcmVtZW50IGFtb3VudHMgdG8gdHdvIDE2SyBidWZmZXJzLCBzaXplCisgKiBjb25maWd1cmFibGUgYnkgYSBwYXJhbWV0ZXIuICBTdXBwb3J0IGlzIGluY2x1ZGVkIGZvciBib3RoCisgKiBmdWxsLXNwZWVkIGFuZCBoaWdoLXNwZWVkIG9wZXJhdGlvbi4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIGRyaXZlciBpcyBzbGlnaHRseSBub24tcG9ydGFibGUgaW4gdGhhdCBpdCBhc3N1bWVzIGEKKyAqIHNpbmdsZSBtZW1vcnkvRE1BIGJ1ZmZlciB3aWxsIGJlIHVzZWFibGUgZm9yIGJ1bGstaW4sIGJ1bGstb3V0LCBhbmQKKyAqIGludGVycnVwdC1pbiBlbmRwb2ludHMuICBXaXRoIG1vc3QgZGV2aWNlIGNvbnRyb2xsZXJzIHRoaXMgaXNuJ3QgYW4KKyAqIGlzc3VlLCBidXQgdGhlcmUgbWF5IGJlIHNvbWUgd2l0aCBoYXJkd2FyZSByZXN0cmljdGlvbnMgdGhhdCBwcmV2ZW50CisgKiBhIGJ1ZmZlciBmcm9tIGJlaW5nIHVzZWQgYnkgbW9yZSB0aGFuIG9uZSBlbmRwb2ludC4KKyAqCisgKgorICogVGhlIHBhdGhuYW1lcyBvZiB0aGUgYmFja2luZyBmaWxlcyBhbmQgdGhlIHJvIHNldHRpbmdzIGFyZQorICogYXZhaWxhYmxlIGluIHRoZSBhdHRyaWJ1dGUgZmlsZXMgImZpbGUiIGFuZCAicm8iIGluIHRoZSBsdW48bj4gKG9yCisgKiB0byBiZSBtb3JlIHByZWNpc2UgaW4gYSBkaXJlY3Rvcnkgd2hpY2ggbmFtZSBjb21lcyBmcm9tCisgKiAibHVuX25hbWVfZm9ybWF0IiBvcHRpb24hKSBzdWJkaXJlY3Rvcnkgb2YgdGhlIGdhZGdldCdzIHN5c2ZzCisgKiBkaXJlY3RvcnkuICBJZiB0aGUgInJlbW92YWJsZSIgb3B0aW9uIGlzIHNldCwgd3JpdGluZyB0byB0aGVzZQorICogZmlsZXMgd2lsbCBzaW11bGF0ZSBlamVjdGluZy9sb2FkaW5nIHRoZSBtZWRpdW0gKHdyaXRpbmcgYW4gZW1wdHkKKyAqIGxpbmUgbWVhbnMgZWplY3QpIGFuZCBhZGp1c3RpbmcgYSB3cml0ZS1lbmFibGUgdGFiLiAgQ2hhbmdlcyB0byB0aGUKKyAqIHJvIHNldHRpbmcgYXJlIG5vdCBhbGxvd2VkIHdoZW4gdGhlIG1lZGl1bSBpcyBsb2FkZWQgb3IgaWYgQ0QtUk9NCisgKiBlbXVsYXRpb24gaXMgYmVpbmcgdXNlZC4KKyAqCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBoZWF2aWx5IGJhc2VkIG9uICJGaWxlLWJhY2tlZCBTdG9yYWdlIEdhZGdldCIgYnkKKyAqIEFsYW4gU3Rlcm4gd2hpY2ggaW4gdHVybiBpcyBoZWF2aWx5IGJhc2VkIG9uICJHYWRnZXQgWmVybyIgYnkgRGF2aWQKKyAqIEJyb3duZWxsLiAgVGhlIGRyaXZlcidzIFNDU0kgY29tbWFuZCBpbnRlcmZhY2Ugd2FzIGJhc2VkIG9uIHRoZQorICogIkluZm9ybWF0aW9uIHRlY2hub2xvZ3kgLSBTbWFsbCBDb21wdXRlciBTeXN0ZW0gSW50ZXJmYWNlIC0gMiIKKyAqIGRvY3VtZW50IGZyb20gWDNUOS4yIFByb2plY3QgMzc1RCwgUmV2aXNpb24gMTBMLCA3LVNFUC05MywKKyAqIGF2YWlsYWJsZSBhdCA8aHR0cDovL3d3dy50MTAub3JnL2Z0cC90MTAvZHJhZnRzL3MyL3MyLXIxMGwucGRmPi4KKyAqIFRoZSBzaW5nbGUgZXhjZXB0aW9uIGlzIG9wY29kZSAweDIzIChSRUFEIEZPUk1BVCBDQVBBQ0lUSUVTKSwgd2hpY2gKKyAqIHdhcyBiYXNlZCBvbiB0aGUgIlVuaXZlcnNhbCBTZXJpYWwgQnVzIE1hc3MgU3RvcmFnZSBDbGFzcyBVRkkKKyAqIENvbW1hbmQgU3BlY2lmaWNhdGlvbiIgZG9jdW1lbnQsIFJldmlzaW9uIDEuMCwgRGVjZW1iZXIgMTQsIDE5OTgsCisgKiBhdmFpbGFibGUgYXQKKyAqIDxodHRwOi8vd3d3LnVzYi5vcmcvZGV2ZWxvcGVycy9kZXZjbGFzc19kb2NzL3VzYm1hc3MtdWZpMTAucGRmPi4KKyAqLworCisKKy8qCisgKgkJCQlEcml2ZXIgRGVzaWduCisgKgorICogVGhlIE1TRiBpcyBmYWlybHkgc3RyYWlnaHRmb3J3YXJkLiAgVGhlcmUgaXMgYSBtYWluIGtlcm5lbAorICogdGhyZWFkIHRoYXQgaGFuZGxlcyBtb3N0IG9mIHRoZSB3b3JrLiAgSW50ZXJydXB0IHJvdXRpbmVzIGZpZWxkCisgKiBjYWxsYmFja3MgZnJvbSB0aGUgY29udHJvbGxlciBkcml2ZXI6IGJ1bGstIGFuZCBpbnRlcnJ1cHQtcmVxdWVzdAorICogY29tcGxldGlvbiBub3RpZmljYXRpb25zLCBlbmRwb2ludC0wIGV2ZW50cywgYW5kIGRpc2Nvbm5lY3QgZXZlbnRzLgorICogQ29tcGxldGlvbiBldmVudHMgYXJlIHBhc3NlZCB0byB0aGUgbWFpbiB0aHJlYWQgYnkgd2FrZXVwIGNhbGxzLiAgTWFueQorICogZXAwIHJlcXVlc3RzIGFyZSBoYW5kbGVkIGF0IGludGVycnVwdCB0aW1lLCBidXQgU2V0SW50ZXJmYWNlLAorICogU2V0Q29uZmlndXJhdGlvbiwgYW5kIGRldmljZSByZXNldCByZXF1ZXN0cyBhcmUgZm9yd2FyZGVkIHRvIHRoZQorICogdGhyZWFkIGluIHRoZSBmb3JtIG9mICJleGNlcHRpb25zIiB1c2luZyBTSUdVU1IxIHNpZ25hbHMgKHNpbmNlIHRoZXkKKyAqIHNob3VsZCBpbnRlcnJ1cHQgYW55IG9uZ29pbmcgZmlsZSBJL08gb3BlcmF0aW9ucykuCisgKgorICogVGhlIHRocmVhZCdzIG1haW4gcm91dGluZSBpbXBsZW1lbnRzIHRoZSBzdGFuZGFyZCBjb21tYW5kL2RhdGEvc3RhdHVzCisgKiBwYXJ0cyBvZiBhIFNDU0kgaW50ZXJhY3Rpb24uICBJdCBhbmQgaXRzIHN1YnJvdXRpbmVzIGFyZSBmdWxsIG9mIHRlc3RzCisgKiBmb3IgcGVuZGluZyBzaWduYWxzL2V4Y2VwdGlvbnMgLS0gYWxsIHRoaXMgcG9sbGluZyBpcyBuZWNlc3Nhcnkgc2luY2UKKyAqIHRoZSBrZXJuZWwgaGFzIG5vIHNldGptcC9sb25nam1wIGVxdWl2YWxlbnRzLiAgKE1heWJlIHRoaXMgaXMgYW4KKyAqIGluZGljYXRpb24gdGhhdCB0aGUgZHJpdmVyIHJlYWxseSB3YW50cyB0byBiZSBydW5uaW5nIGluIHVzZXJzcGFjZS4pCisgKiBBbiBpbXBvcnRhbnQgcG9pbnQgaXMgdGhhdCBzbyBsb25nIGFzIHRoZSB0aHJlYWQgaXMgYWxpdmUgaXQga2VlcHMgYW4KKyAqIG9wZW4gcmVmZXJlbmNlIHRvIHRoZSBiYWNraW5nIGZpbGUuICBUaGlzIHdpbGwgcHJldmVudCB1bm1vdW50aW5nCisgKiB0aGUgYmFja2luZyBmaWxlJ3MgdW5kZXJseWluZyBmaWxlc3lzdGVtIGFuZCBjb3VsZCBjYXVzZSBwcm9ibGVtcworICogZHVyaW5nIHN5c3RlbSBzaHV0ZG93biwgZm9yIGV4YW1wbGUuICBUbyBwcmV2ZW50IHN1Y2ggcHJvYmxlbXMsIHRoZQorICogdGhyZWFkIGNhdGNoZXMgSU5ULCBURVJNLCBhbmQgS0lMTCBzaWduYWxzIGFuZCBjb252ZXJ0cyB0aGVtIGludG8KKyAqIGFuIEVYSVQgZXhjZXB0aW9uLgorICoKKyAqIEluIG5vcm1hbCBvcGVyYXRpb24gdGhlIG1haW4gdGhyZWFkIGlzIHN0YXJ0ZWQgZHVyaW5nIHRoZSBnYWRnZXQncworICogZnNnX2JpbmQoKSBjYWxsYmFjayBhbmQgc3RvcHBlZCBkdXJpbmcgZnNnX3VuYmluZCgpLiAgQnV0IGl0IGNhbgorICogYWxzbyBleGl0IHdoZW4gaXQgcmVjZWl2ZXMgYSBzaWduYWwsIGFuZCB0aGVyZSdzIG5vIHBvaW50IGxlYXZpbmcKKyAqIHRoZSBnYWRnZXQgcnVubmluZyB3aGVuIHRoZSB0aHJlYWQgaXMgZGVhZC4gIEF0IG9mIHRoaXMgbW9tZW50LCBNU0YKKyAqIHByb3ZpZGVzIG5vIHdheSB0byBkZXJlZ2lzdGVyIHRoZSBnYWRnZXQgd2hlbiB0aHJlYWQgZGllcyAtLSBtYXliZQorICogYSBjYWxsYmFjayBmdW5jdGlvbnMgaXMgbmVlZGVkLgorICoKKyAqIFRvIHByb3ZpZGUgbWF4aW11bSB0aHJvdWdocHV0LCB0aGUgZHJpdmVyIHVzZXMgYSBjaXJjdWxhciBwaXBlbGluZSBvZgorICogYnVmZmVyIGhlYWRzIChzdHJ1Y3QgZnNnX2J1ZmZoZCkuICBJbiBwcmluY2lwbGUgdGhlIHBpcGVsaW5lIGNhbiBiZQorICogYXJiaXRyYXJpbHkgbG9uZzsgaW4gcHJhY3RpY2UgdGhlIGJlbmVmaXRzIGRvbid0IGp1c3RpZnkgaGF2aW5nIG1vcmUKKyAqIHRoYW4gMiBzdGFnZXMgKGkuZS4sIGRvdWJsZSBidWZmZXJpbmcpLiAgQnV0IGl0IGhlbHBzIHRvIHRoaW5rIG9mIHRoZQorICogcGlwZWxpbmUgYXMgYmVpbmcgYSBsb25nIG9uZS4gIEVhY2ggYnVmZmVyIGhlYWQgY29udGFpbnMgYSBidWxrLWluIGFuZAorICogYSBidWxrLW91dCByZXF1ZXN0IHBvaW50ZXIgKHNpbmNlIHRoZSBidWZmZXIgY2FuIGJlIHVzZWQgZm9yIGJvdGgKKyAqIG91dHB1dCBhbmQgaW5wdXQgLS0gZGlyZWN0aW9ucyBhbHdheXMgYXJlIGdpdmVuIGZyb20gdGhlIGhvc3QncworICogcG9pbnQgb2YgdmlldykgYXMgd2VsbCBhcyBhIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBhbmQgdmFyaW91cyBzdGF0ZQorICogdmFyaWFibGVzLgorICoKKyAqIFVzZSBvZiB0aGUgcGlwZWxpbmUgZm9sbG93cyBhIHNpbXBsZSBwcm90b2NvbC4gIFRoZXJlIGlzIGEgdmFyaWFibGUKKyAqIChmc2ctPm5leHRfYnVmZmhkX3RvX2ZpbGwpIHRoYXQgcG9pbnRzIHRvIHRoZSBuZXh0IGJ1ZmZlciBoZWFkIHRvIHVzZS4KKyAqIEF0IGFueSB0aW1lIHRoYXQgYnVmZmVyIGhlYWQgbWF5IHN0aWxsIGJlIGluIHVzZSBmcm9tIGFuIGVhcmxpZXIKKyAqIHJlcXVlc3QsIHNvIGVhY2ggYnVmZmVyIGhlYWQgaGFzIGEgc3RhdGUgdmFyaWFibGUgaW5kaWNhdGluZyB3aGV0aGVyCisgKiBpdCBpcyBFTVBUWSwgRlVMTCwgb3IgQlVTWS4gIFR5cGljYWwgdXNlIGludm9sdmVzIHdhaXRpbmcgZm9yIHRoZQorICogYnVmZmVyIGhlYWQgdG8gYmUgRU1QVFksIGZpbGxpbmcgdGhlIGJ1ZmZlciBlaXRoZXIgYnkgZmlsZSBJL08gb3IgYnkKKyAqIFVTQiBJL08gKGR1cmluZyB3aGljaCB0aGUgYnVmZmVyIGhlYWQgaXMgQlVTWSksIGFuZCBtYXJraW5nIHRoZSBidWZmZXIKKyAqIGhlYWQgRlVMTCB3aGVuIHRoZSBJL08gaXMgY29tcGxldGUuICBUaGVuIHRoZSBidWZmZXIgd2lsbCBiZSBlbXB0aWVkCisgKiAoYWdhaW4gcG9zc2libHkgYnkgVVNCIEkvTywgZHVyaW5nIHdoaWNoIGl0IGlzIG1hcmtlZCBCVVNZKSBhbmQKKyAqIGZpbmFsbHkgbWFya2VkIEVNUFRZIGFnYWluIChwb3NzaWJseSBieSBhIGNvbXBsZXRpb24gcm91dGluZSkuCisgKgorICogQSBtb2R1bGUgcGFyYW1ldGVyIHRlbGxzIHRoZSBkcml2ZXIgdG8gYXZvaWQgc3RhbGxpbmcgdGhlIGJ1bGsKKyAqIGVuZHBvaW50cyB3aGVyZXZlciB0aGUgdHJhbnNwb3J0IHNwZWNpZmljYXRpb24gYWxsb3dzLiAgVGhpcyBpcworICogbmVjZXNzYXJ5IGZvciBzb21lIFVEQ3MgbGlrZSB0aGUgU3VwZXJILCB3aGljaCBjYW5ub3QgcmVsaWFibHkgY2xlYXIgYQorICogaGFsdCBvbiBhIGJ1bGsgZW5kcG9pbnQuICBIb3dldmVyLCB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMgdGhlCisgKiBCdWxrLW9ubHkgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyBhIHN0YWxsLiAgSW4gc3VjaCBjYXNlcyB0aGUgZHJpdmVyCisgKiB3aWxsIGhhbHQgdGhlIGVuZHBvaW50IGFuZCBzZXQgYSBmbGFnIGluZGljYXRpbmcgdGhhdCBpdCBzaG91bGQgY2xlYXIKKyAqIHRoZSBoYWx0IGluIHNvZnR3YXJlIGR1cmluZyB0aGUgbmV4dCBkZXZpY2UgcmVzZXQuICBIb3BlZnVsbHkgdGhpcworICogd2lsbCBwZXJtaXQgZXZlcnl0aGluZyB0byB3b3JrIGNvcnJlY3RseS4gIEZ1cnRoZXJtb3JlLCBhbHRob3VnaCB0aGUKKyAqIHNwZWNpZmljYXRpb24gYWxsb3dzIHRoZSBidWxrLW91dCBlbmRwb2ludCB0byBoYWx0IHdoZW4gdGhlIGhvc3Qgc2VuZHMKKyAqIHRvbyBtdWNoIGRhdGEsIGltcGxlbWVudGluZyB0aGlzIHdvdWxkIGNhdXNlIGFuIHVuYXZvaWRhYmxlIHJhY2UuCisgKiBUaGUgZHJpdmVyIHdpbGwgYWx3YXlzIHVzZSB0aGUgIm5vLXN0YWxsIiBhcHByb2FjaCBmb3IgT1VUIHRyYW5zZmVycy4KKyAqCisgKiBPbmUgc3VidGxlIHBvaW50IGNvbmNlcm5zIHNlbmRpbmcgc3RhdHVzLXN0YWdlIHJlc3BvbnNlcyBmb3IgZXAwCisgKiByZXF1ZXN0cy4gIFNvbWUgb2YgdGhlc2UgcmVxdWVzdHMsIHN1Y2ggYXMgZGV2aWNlIHJlc2V0LCBjYW4gaW52b2x2ZQorICogaW50ZXJydXB0aW5nIGFuIG9uZ29pbmcgZmlsZSBJL08gb3BlcmF0aW9uLCB3aGljaCBtaWdodCB0YWtlIGFuCisgKiBhcmJpdHJhcmlseSBsb25nIHRpbWUuICBEdXJpbmcgdGhhdCBkZWxheSB0aGUgaG9zdCBtaWdodCBnaXZlIHVwIG9uCisgKiB0aGUgb3JpZ2luYWwgZXAwIHJlcXVlc3QgYW5kIGlzc3VlIGEgbmV3IG9uZS4gIFdoZW4gdGhhdCBoYXBwZW5zIHRoZQorICogZHJpdmVyIHNob3VsZCBub3Qgbm90aWZ5IHRoZSBob3N0IGFib3V0IGNvbXBsZXRpb24gb2YgdGhlIG9yaWdpbmFsCisgKiByZXF1ZXN0LCBhcyB0aGUgaG9zdCB3aWxsIG5vIGxvbmdlciBiZSB3YWl0aW5nIGZvciBpdC4gIFNvIHRoZSBkcml2ZXIKKyAqIGFzc2lnbnMgdG8gZWFjaCBlcDAgcmVxdWVzdCBhIHVuaXF1ZSB0YWcsIGFuZCBpdCBrZWVwcyB0cmFjayBvZiB0aGUKKyAqIHRhZyB2YWx1ZSBvZiB0aGUgcmVxdWVzdCBhc3NvY2lhdGVkIHdpdGggYSBsb25nLXJ1bm5pbmcgZXhjZXB0aW9uCisgKiAoZGV2aWNlLXJlc2V0LCBpbnRlcmZhY2UtY2hhbmdlLCBvciBjb25maWd1cmF0aW9uLWNoYW5nZSkuICBXaGVuIHRoZQorICogZXhjZXB0aW9uIGhhbmRsZXIgaXMgZmluaXNoZWQsIHRoZSBzdGF0dXMtc3RhZ2UgcmVzcG9uc2UgaXMgc3VibWl0dGVkCisgKiBvbmx5IGlmIHRoZSBjdXJyZW50IGVwMCByZXF1ZXN0IHRhZyBpcyBlcXVhbCB0byB0aGUgZXhjZXB0aW9uIHJlcXVlc3QKKyAqIHRhZy4gIFRodXMgb25seSB0aGUgbW9zdCByZWNlbnRseSByZWNlaXZlZCBlcDAgcmVxdWVzdCB3aWxsIGdldCBhCisgKiBzdGF0dXMtc3RhZ2UgcmVzcG9uc2UuCisgKgorICogV2FybmluZzogVGhpcyBkcml2ZXIgc291cmNlIGZpbGUgaXMgdG9vIGxvbmcuICBJdCBvdWdodCB0byBiZSBzcGxpdCB1cAorICogaW50byBhIGhlYWRlciBmaWxlIHBsdXMgYWJvdXQgMyBzZXBhcmF0ZSAuYyBmaWxlcywgdG8gaGFuZGxlIHRoZSBkZXRhaWxzCisgKiBvZiB0aGUgR2FkZ2V0LCBVU0IgTWFzcyBTdG9yYWdlLCBhbmQgU0NTSSBwcm90b2NvbHMuCisgKi8KKworCisvKiAjZGVmaW5lIFZFUkJPU0VfREVCVUcgKi8KKy8qICNkZWZpbmUgRFVNUF9NU0dTICovCisKKworI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva3JlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisKKyNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2dhZGdldC5oPgorCisjaW5jbHVkZSAiZ2FkZ2V0X2NoaXBzLmgiCisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgRlNHX0RSSVZFUl9ERVNDCQkiTWFzcyBTdG9yYWdlIEZ1bmN0aW9uIgorI2RlZmluZSBGU0dfRFJJVkVSX1ZFUlNJT04JIjIwMDkvMDkvMTEiCisKK3N0YXRpYyBjb25zdCBjaGFyIGZzZ19zdHJpbmdfaW50ZXJmYWNlW10gPSAiTWFzcyBTdG9yYWdlIjsKKworCisjZGVmaW5lIEZTR19OT19JTlRSX0VQIDEKKyNkZWZpbmUgRlNHX0JVRkZIRF9TVEFUSUNfQlVGRkVSIDEKKyNkZWZpbmUgRlNHX05PX0RFVklDRV9TVFJJTkdTICAgIDEKKyNkZWZpbmUgRlNHX05PX09URyAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRlNHX05PX0lOVFJfRVAgICAgICAgICAgIDEKKworI2luY2x1ZGUgInN0b3JhZ2VfY29tbW9uLmMiCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RydWN0IGZzZ19kZXY7CisKKworLyogRGF0YSBzaGFyZWQgYnkgYWxsIHRoZSBGU0cgaW5zdGFuY2VzLiAqLworc3RydWN0IGZzZ19jb21tb24geworCXN0cnVjdCB1c2JfZ2FkZ2V0CSpnYWRnZXQ7CisJc3RydWN0IGZzZ19kZXYJCSpmc2c7CisJc3RydWN0IGZzZ19kZXYJCSpwcmV2X2ZzZzsKKworCS8qIGZpbGVzZW0gcHJvdGVjdHM6IGJhY2tpbmcgZmlsZXMgaW4gdXNlICovCisJc3RydWN0IHJ3X3NlbWFwaG9yZQlmaWxlc2VtOworCisJLyogbG9jayBwcm90ZWN0czogc3RhdGUsIGFsbCB0aGUgcmVxX2J1c3kncyAqLworCXNwaW5sb2NrX3QJCWxvY2s7CisKKwlzdHJ1Y3QgdXNiX2VwCQkqZXAwOwkJLyogQ29weSBvZiBnYWRnZXQtPmVwMCAqLworCXN0cnVjdCB1c2JfcmVxdWVzdAkqZXAwcmVxOwkvKiBDb3B5IG9mIGNkZXYtPnJlcSAqLworCXVuc2lnbmVkIGludAkJZXAwX3JlcV90YWc7CisJY29uc3QgY2hhcgkJKmVwMHJlcV9uYW1lOworCisJc3RydWN0IGZzZ19idWZmaGQJKm5leHRfYnVmZmhkX3RvX2ZpbGw7CisJc3RydWN0IGZzZ19idWZmaGQJKm5leHRfYnVmZmhkX3RvX2RyYWluOworCXN0cnVjdCBmc2dfYnVmZmhkCWJ1ZmZoZHNbRlNHX05VTV9CVUZGRVJTXTsKKworCWludAkJCWNtbmRfc2l6ZTsKKwl1OAkJCWNtbmRbTUFYX0NPTU1BTkRfU0laRV07CisKKwl1bnNpZ25lZCBpbnQJCW5sdW5zOworCXVuc2lnbmVkIGludAkJbHVuOworCXN0cnVjdCBmc2dfbHVuCQkqbHVuczsKKwlzdHJ1Y3QgZnNnX2x1bgkJKmN1cmx1bjsKKworCXVuc2lnbmVkIGludAkJYnVsa19vdXRfbWF4cGFja2V0OworCWVudW0gZnNnX3N0YXRlCQlzdGF0ZTsJCS8qIEZvciBleGNlcHRpb24gaGFuZGxpbmcgKi8KKwl1bnNpZ25lZCBpbnQJCWV4Y2VwdGlvbl9yZXFfdGFnOworCisJdTgJCQljb25maWcsIG5ld19jb25maWc7CisJZW51bSBkYXRhX2RpcmVjdGlvbglkYXRhX2RpcjsKKwl1MzIJCQlkYXRhX3NpemU7CisJdTMyCQkJZGF0YV9zaXplX2Zyb21fY21uZDsKKwl1MzIJCQl0YWc7CisJdTMyCQkJcmVzaWR1ZTsKKwl1MzIJCQl1c2JfYW1vdW50X2xlZnQ7CisKKwl1bnNpZ25lZCBpbnQJCWNhbl9zdGFsbDoxOworCXVuc2lnbmVkIGludAkJZnJlZV9zdG9yYWdlX29uX3JlbGVhc2U6MTsKKwl1bnNpZ25lZCBpbnQJCXBoYXNlX2Vycm9yOjE7CisJdW5zaWduZWQgaW50CQlzaG9ydF9wYWNrZXRfcmVjZWl2ZWQ6MTsKKwl1bnNpZ25lZCBpbnQJCWJhZF9sdW5fb2theToxOworCXVuc2lnbmVkIGludAkJcnVubmluZzoxOworCisJaW50CQkJdGhyZWFkX3dha2V1cF9uZWVkZWQ7CisJc3RydWN0IGNvbXBsZXRpb24JdGhyZWFkX25vdGlmaWVyOworCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGhyZWFkX3Rhc2s7CisKKwkvKiBDYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhyZWFkIGV4aXRzLiAqLworCXZvaWQJCQkoKnRocmVhZF9leGl0cykoc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbik7CisJLyogR2FkZ2V0J3MgcHJpdmF0ZSBkYXRhLiAqLworCXZvaWQJCQkqcHJpdmF0ZV9kYXRhOworCisJLyogVmVuZG9yICg4IGNoYXJzKSwgcHJvZHVjdCAoMTYgY2hhcnMpLCByZWxlYXNlICg0CisJICogaGV4YWRlY2ltYWwgZGlnaXRzKSBhbmQgTlVMIGJ5dGUgKi8KKwljaGFyIGlucXVpcnlfc3RyaW5nWzggKyAxNiArIDQgKyAxXTsKKworCXN0cnVjdCBrcmVmCQlyZWY7Cit9OworCisKK3N0cnVjdCBmc2dfY29uZmlnIHsKKwl1bnNpZ25lZCBubHVuczsKKwlzdHJ1Y3QgZnNnX2x1bl9jb25maWcgeworCQljb25zdCBjaGFyICpmaWxlbmFtZTsKKwkJY2hhciBybzsKKwkJY2hhciByZW1vdmFibGU7CisJCWNoYXIgY2Ryb207CisJfSBsdW5zW0ZTR19NQVhfTFVOU107CisKKwljb25zdCBjaGFyCQkqbHVuX25hbWVfZm9ybWF0OworCWNvbnN0IGNoYXIJCSp0aHJlYWRfbmFtZTsKKworCS8qIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aHJlYWQgZXhpdHMuICovCisJdm9pZAkJCSgqdGhyZWFkX2V4aXRzKShzdHJ1Y3QgZnNnX2NvbW1vbiAqY29tbW9uKTsKKwkvKiBHYWRnZXQncyBwcml2YXRlIGRhdGEuICovCisJdm9pZAkJCSpwcml2YXRlX2RhdGE7CisKKwljb25zdCBjaGFyICp2ZW5kb3JfbmFtZTsJCS8qICA4IGNoYXJhY3RlcnMgb3IgbGVzcyAqLworCWNvbnN0IGNoYXIgKnByb2R1Y3RfbmFtZTsJCS8qIDE2IGNoYXJhY3RlcnMgb3IgbGVzcyAqLworCXUxNiByZWxlYXNlOworCisJY2hhcgkJCWNhbl9zdGFsbDsKK307CisKKworc3RydWN0IGZzZ19kZXYgeworCXN0cnVjdCB1c2JfZnVuY3Rpb24JZnVuY3Rpb247CisJc3RydWN0IHVzYl9nYWRnZXQJKmdhZGdldDsJLyogQ29weSBvZiBjZGV2LT5nYWRnZXQgKi8KKwlzdHJ1Y3QgZnNnX2NvbW1vbgkqY29tbW9uOworCisJdTE2CQkJaW50ZXJmYWNlX251bWJlcjsKKworCXVuc2lnbmVkIGludAkJYnVsa19pbl9lbmFibGVkOjE7CisJdW5zaWduZWQgaW50CQlidWxrX291dF9lbmFibGVkOjE7CisKKwl1bnNpZ25lZCBsb25nCQlhdG9taWNfYml0ZmxhZ3M7CisjZGVmaW5lIElHTk9SRV9CVUxLX09VVAkJMAorCisJc3RydWN0IHVzYl9lcAkJKmJ1bGtfaW47CisJc3RydWN0IHVzYl9lcAkJKmJ1bGtfb3V0OworfTsKKworCitzdGF0aWMgaW5saW5lIGludCBfX2ZzZ19pc19zZXQoc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbiwKKwkJCSAgICAgICBjb25zdCBjaGFyICpmdW5jLCB1bnNpZ25lZCBsaW5lKQoreworCWlmIChjb21tb24tPmZzZykKKwkJcmV0dXJuIDE7CisJRVJST1IoY29tbW9uLCAiY29tbW9uLT5mc2cgaXMgTlVMTCBpbiAlcyBhdCAldVxuIiwgZnVuYywgbGluZSk7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgZnNnX2lzX3NldChjb21tb24pIGxpa2VseShfX2ZzZ19pc19zZXQoY29tbW9uLCBfX2Z1bmNfXywgX19MSU5FX18pKQorCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGZzZ19kZXYgKmZzZ19mcm9tX2Z1bmMoc3RydWN0IHVzYl9mdW5jdGlvbiAqZikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGYsIHN0cnVjdCBmc2dfZGV2LCBmdW5jdGlvbik7Cit9CisKKwordHlwZWRlZiB2b2lkICgqZnNnX3JvdXRpbmVfdCkoc3RydWN0IGZzZ19kZXYgKik7CisKK3N0YXRpYyBpbnQgZXhjZXB0aW9uX2luX3Byb2dyZXNzKHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24pCit7CisJcmV0dXJuIGNvbW1vbi0+c3RhdGUgPiBGU0dfU1RBVEVfSURMRTsKK30KKworLyogTWFrZSBidWxrLW91dCByZXF1ZXN0cyBiZSBkaXZpc2libGUgYnkgdGhlIG1heHBhY2tldCBzaXplICovCitzdGF0aWMgdm9pZCBzZXRfYnVsa19vdXRfcmVxX2xlbmd0aChzdHJ1Y3QgZnNnX2NvbW1vbiAqY29tbW9uLAorCQlzdHJ1Y3QgZnNnX2J1ZmZoZCAqYmgsIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisJdW5zaWduZWQgaW50CXJlbTsKKworCWJoLT5idWxrX291dF9pbnRlbmRlZF9sZW5ndGggPSBsZW5ndGg7CisJcmVtID0gbGVuZ3RoICUgY29tbW9uLT5idWxrX291dF9tYXhwYWNrZXQ7CisJaWYgKHJlbSA+IDApCisJCWxlbmd0aCArPSBjb21tb24tPmJ1bGtfb3V0X21heHBhY2tldCAtIHJlbTsKKwliaC0+b3V0cmVxLT5sZW5ndGggPSBsZW5ndGg7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgZnNnX3NldF9oYWx0KHN0cnVjdCBmc2dfZGV2ICpmc2csIHN0cnVjdCB1c2JfZXAgKmVwKQoreworCWNvbnN0IGNoYXIJKm5hbWU7CisKKwlpZiAoZXAgPT0gZnNnLT5idWxrX2luKQorCQluYW1lID0gImJ1bGstaW4iOworCWVsc2UgaWYgKGVwID09IGZzZy0+YnVsa19vdXQpCisJCW5hbWUgPSAiYnVsay1vdXQiOworCWVsc2UKKwkJbmFtZSA9IGVwLT5uYW1lOworCURCRyhmc2csICIlcyBzZXQgaGFsdFxuIiwgbmFtZSk7CisJcmV0dXJuIHVzYl9lcF9zZXRfaGFsdChlcCk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVGhlc2Ugcm91dGluZXMgbWF5IGJlIGNhbGxlZCBpbiBwcm9jZXNzIGNvbnRleHQgb3IgaW5faXJxICovCisKKy8qIENhbGxlciBtdXN0IGhvbGQgZnNnLT5sb2NrICovCitzdGF0aWMgdm9pZCB3YWtldXBfdGhyZWFkKHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24pCit7CisJLyogVGVsbCB0aGUgbWFpbiB0aHJlYWQgdGhhdCBzb21ldGhpbmcgaGFzIGhhcHBlbmVkICovCisJY29tbW9uLT50aHJlYWRfd2FrZXVwX25lZWRlZCA9IDE7CisJaWYgKGNvbW1vbi0+dGhyZWFkX3Rhc2spCisJCXdha2VfdXBfcHJvY2Vzcyhjb21tb24tPnRocmVhZF90YXNrKTsKK30KKworCitzdGF0aWMgdm9pZCByYWlzZV9leGNlcHRpb24oc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbiwgZW51bSBmc2dfc3RhdGUgbmV3X3N0YXRlKQoreworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisJLyogRG8gbm90aGluZyBpZiBhIGhpZ2hlci1wcmlvcml0eSBleGNlcHRpb24gaXMgYWxyZWFkeSBpbiBwcm9ncmVzcy4KKwkgKiBJZiBhIGxvd2VyLW9yLWVxdWFsIHByaW9yaXR5IGV4Y2VwdGlvbiBpcyBpbiBwcm9ncmVzcywgcHJlZW1wdCBpdAorCSAqIGFuZCBub3RpZnkgdGhlIG1haW4gdGhyZWFkIGJ5IHNlbmRpbmcgaXQgYSBzaWduYWwuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbW1vbi0+bG9jaywgZmxhZ3MpOworCWlmIChjb21tb24tPnN0YXRlIDw9IG5ld19zdGF0ZSkgeworCQljb21tb24tPmV4Y2VwdGlvbl9yZXFfdGFnID0gY29tbW9uLT5lcDBfcmVxX3RhZzsKKwkJY29tbW9uLT5zdGF0ZSA9IG5ld19zdGF0ZTsKKwkJaWYgKGNvbW1vbi0+dGhyZWFkX3Rhc2spCisJCQlzZW5kX3NpZ19pbmZvKFNJR1VTUjEsIFNFTkRfU0lHX0ZPUkNFRCwKKwkJCQkgICAgICBjb21tb24tPnRocmVhZF90YXNrKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29tbW9uLT5sb2NrLCBmbGFncyk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBlcDBfcXVldWUoc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbikKK3sKKwlpbnQJcmM7CisKKwlyYyA9IHVzYl9lcF9xdWV1ZShjb21tb24tPmVwMCwgY29tbW9uLT5lcDByZXEsIEdGUF9BVE9NSUMpOworCWNvbW1vbi0+ZXAwLT5kcml2ZXJfZGF0YSA9IGNvbW1vbjsKKwlpZiAocmMgIT0gMCAmJiByYyAhPSAtRVNIVVRET1dOKSB7CisJCS8qIFdlIGNhbid0IGRvIG11Y2ggbW9yZSB0aGFuIHdhaXQgZm9yIGEgcmVzZXQgKi8KKwkJV0FSTklORyhjb21tb24sICJlcnJvciBpbiBzdWJtaXNzaW9uOiAlcyAtLT4gJWRcbiIsCisJCQljb21tb24tPmVwMC0+bmFtZSwgcmMpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEJ1bGsgYW5kIGludGVycnVwdCBlbmRwb2ludCBjb21wbGV0aW9uIGhhbmRsZXJzLgorICogVGhlc2UgYWx3YXlzIHJ1biBpbl9pcnEuICovCisKK3N0YXRpYyB2b2lkIGJ1bGtfaW5fY29tcGxldGUoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBmc2dfY29tbW9uCSpjb21tb24gPSBlcC0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGZzZ19idWZmaGQJKmJoID0gcmVxLT5jb250ZXh0OworCisJaWYgKHJlcS0+c3RhdHVzIHx8IHJlcS0+YWN0dWFsICE9IHJlcS0+bGVuZ3RoKQorCQlEQkcoY29tbW9uLCAiJXMgLS0+ICVkLCAldS8ldVxuIiwgX19mdW5jX18sCisJCQkJcmVxLT5zdGF0dXMsIHJlcS0+YWN0dWFsLCByZXEtPmxlbmd0aCk7CisJaWYgKHJlcS0+c3RhdHVzID09IC1FQ09OTlJFU0VUKQkJLyogUmVxdWVzdCB3YXMgY2FuY2VsbGVkICovCisJCXVzYl9lcF9maWZvX2ZsdXNoKGVwKTsKKworCS8qIEhvbGQgdGhlIGxvY2sgd2hpbGUgd2UgdXBkYXRlIHRoZSByZXF1ZXN0IGFuZCBidWZmZXIgc3RhdGVzICovCisJc21wX3dtYigpOworCXNwaW5fbG9jaygmY29tbW9uLT5sb2NrKTsKKwliaC0+aW5yZXFfYnVzeSA9IDA7CisJYmgtPnN0YXRlID0gQlVGX1NUQVRFX0VNUFRZOworCXdha2V1cF90aHJlYWQoY29tbW9uKTsKKwlzcGluX3VubG9jaygmY29tbW9uLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgYnVsa19vdXRfY29tcGxldGUoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBmc2dfY29tbW9uCSpjb21tb24gPSBlcC0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGZzZ19idWZmaGQJKmJoID0gcmVxLT5jb250ZXh0OworCisJZHVtcF9tc2coY29tbW9uLCAiYnVsay1vdXQiLCByZXEtPmJ1ZiwgcmVxLT5hY3R1YWwpOworCWlmIChyZXEtPnN0YXR1cyB8fCByZXEtPmFjdHVhbCAhPSBiaC0+YnVsa19vdXRfaW50ZW5kZWRfbGVuZ3RoKQorCQlEQkcoY29tbW9uLCAiJXMgLS0+ICVkLCAldS8ldVxuIiwgX19mdW5jX18sCisJCQkJcmVxLT5zdGF0dXMsIHJlcS0+YWN0dWFsLAorCQkJCWJoLT5idWxrX291dF9pbnRlbmRlZF9sZW5ndGgpOworCWlmIChyZXEtPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCkJCS8qIFJlcXVlc3Qgd2FzIGNhbmNlbGxlZCAqLworCQl1c2JfZXBfZmlmb19mbHVzaChlcCk7CisKKwkvKiBIb2xkIHRoZSBsb2NrIHdoaWxlIHdlIHVwZGF0ZSB0aGUgcmVxdWVzdCBhbmQgYnVmZmVyIHN0YXRlcyAqLworCXNtcF93bWIoKTsKKwlzcGluX2xvY2soJmNvbW1vbi0+bG9jayk7CisJYmgtPm91dHJlcV9idXN5ID0gMDsKKwliaC0+c3RhdGUgPSBCVUZfU1RBVEVfRlVMTDsKKwl3YWtldXBfdGhyZWFkKGNvbW1vbik7CisJc3Bpbl91bmxvY2soJmNvbW1vbi0+bG9jayk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRXAwIGNsYXNzLXNwZWNpZmljIGhhbmRsZXJzLiAgVGhlc2UgYWx3YXlzIHJ1biBpbl9pcnEuICovCisKK3N0YXRpYyBpbnQgZnNnX3NldHVwKHN0cnVjdCB1c2JfZnVuY3Rpb24gKmYsCisJCWNvbnN0IHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmN0cmwpCit7CisJc3RydWN0IGZzZ19kZXYJCSpmc2cgPSBmc2dfZnJvbV9mdW5jKGYpOworCXN0cnVjdCB1c2JfcmVxdWVzdAkqcmVxID0gZnNnLT5jb21tb24tPmVwMHJlcTsKKwl1MTYJCQl3X2luZGV4ID0gbGUxNl90b19jcHUoY3RybC0+d0luZGV4KTsKKwl1MTYJCQl3X3ZhbHVlID0gbGUxNl90b19jcHUoY3RybC0+d1ZhbHVlKTsKKwl1MTYJCQl3X2xlbmd0aCA9IGxlMTZfdG9fY3B1KGN0cmwtPndMZW5ndGgpOworCisJaWYgKCFmc2ctPmNvbW1vbi0+Y29uZmlnKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlzd2l0Y2ggKGN0cmwtPmJSZXF1ZXN0KSB7CisKKwljYXNlIFVTQl9CVUxLX1JFU0VUX1JFUVVFU1Q6CisJCWlmIChjdHJsLT5iUmVxdWVzdFR5cGUgIT0KKwkJICAgIChVU0JfRElSX09VVCB8IFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSkpCisJCQlicmVhazsKKwkJaWYgKHdfaW5kZXggIT0gZnNnLT5pbnRlcmZhY2VfbnVtYmVyIHx8IHdfdmFsdWUgIT0gMCkKKwkJCXJldHVybiAtRURPTTsKKworCQkvKiBSYWlzZSBhbiBleGNlcHRpb24gdG8gc3RvcCB0aGUgY3VycmVudCBvcGVyYXRpb24KKwkJICogYW5kIHJlaW5pdGlhbGl6ZSBvdXIgc3RhdGUuICovCisJCURCRyhmc2csICJidWxrIHJlc2V0IHJlcXVlc3RcbiIpOworCQlyYWlzZV9leGNlcHRpb24oZnNnLT5jb21tb24sIEZTR19TVEFURV9SRVNFVCk7CisJCXJldHVybiBERUxBWUVEX1NUQVRVUzsKKworCWNhc2UgVVNCX0JVTEtfR0VUX01BWF9MVU5fUkVRVUVTVDoKKwkJaWYgKGN0cmwtPmJSZXF1ZXN0VHlwZSAhPQorCQkgICAgKFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UpKQorCQkJYnJlYWs7CisJCWlmICh3X2luZGV4ICE9IGZzZy0+aW50ZXJmYWNlX251bWJlciB8fCB3X3ZhbHVlICE9IDApCisJCQlyZXR1cm4gLUVET007CisJCVZEQkcoZnNnLCAiZ2V0IG1heCBMVU5cbiIpOworCQkqKHU4ICopIHJlcS0+YnVmID0gZnNnLT5jb21tb24tPm5sdW5zIC0gMTsKKwkJcmV0dXJuIDE7CisJfQorCisJVkRCRyhmc2csCisJICAgICAidW5rbm93biBjbGFzcy1zcGVjaWZpYyBjb250cm9sIHJlcSAiCisJICAgICAiJTAyeC4lMDJ4IHYlMDR4IGklMDR4IGwldVxuIiwKKwkgICAgIGN0cmwtPmJSZXF1ZXN0VHlwZSwgY3RybC0+YlJlcXVlc3QsCisJICAgICBsZTE2X3RvX2NwdShjdHJsLT53VmFsdWUpLCB3X2luZGV4LCB3X2xlbmd0aCk7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEFsbCB0aGUgZm9sbG93aW5nIHJvdXRpbmVzIHJ1biBpbiBwcm9jZXNzIGNvbnRleHQgKi8KKworCisvKiBVc2UgdGhpcyBmb3IgYnVsayBvciBpbnRlcnJ1cHQgdHJhbnNmZXJzLCBub3QgZXAwICovCitzdGF0aWMgdm9pZCBzdGFydF90cmFuc2ZlcihzdHJ1Y3QgZnNnX2RldiAqZnNnLCBzdHJ1Y3QgdXNiX2VwICplcCwKKwkJc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEsIGludCAqcGJ1c3ksCisJCWVudW0gZnNnX2J1ZmZlcl9zdGF0ZSAqc3RhdGUpCit7CisJaW50CXJjOworCisJaWYgKGVwID09IGZzZy0+YnVsa19pbikKKwkJZHVtcF9tc2coZnNnLCAiYnVsay1pbiIsIHJlcS0+YnVmLCByZXEtPmxlbmd0aCk7CisKKwlzcGluX2xvY2tfaXJxKCZmc2ctPmNvbW1vbi0+bG9jayk7CisJKnBidXN5ID0gMTsKKwkqc3RhdGUgPSBCVUZfU1RBVEVfQlVTWTsKKwlzcGluX3VubG9ja19pcnEoJmZzZy0+Y29tbW9uLT5sb2NrKTsKKwlyYyA9IHVzYl9lcF9xdWV1ZShlcCwgcmVxLCBHRlBfS0VSTkVMKTsKKwlpZiAocmMgIT0gMCkgeworCQkqcGJ1c3kgPSAwOworCQkqc3RhdGUgPSBCVUZfU1RBVEVfRU1QVFk7CisKKwkJLyogV2UgY2FuJ3QgZG8gbXVjaCBtb3JlIHRoYW4gd2FpdCBmb3IgYSByZXNldCAqLworCisJCS8qIE5vdGU6IGN1cnJlbnRseSB0aGUgbmV0MjI4MCBkcml2ZXIgZmFpbHMgemVyby1sZW5ndGgKKwkJICogc3VibWlzc2lvbnMgaWYgRE1BIGlzIGVuYWJsZWQuICovCisJCWlmIChyYyAhPSAtRVNIVVRET1dOICYmICEocmMgPT0gLUVPUE5PVFNVUFAgJiYKKwkJCQkJCXJlcS0+bGVuZ3RoID09IDApKQorCQkJV0FSTklORyhmc2csICJlcnJvciBpbiBzdWJtaXNzaW9uOiAlcyAtLT4gJWRcbiIsCisJCQkJCWVwLT5uYW1lLCByYyk7CisJfQorfQorCisjZGVmaW5lIFNUQVJUX1RSQU5TRkVSX09SKGNvbW1vbiwgZXBfbmFtZSwgcmVxLCBwYnVzeSwgc3RhdGUpCQlcCisJaWYgKGZzZ19pc19zZXQoY29tbW9uKSkJCQkJCQlcCisJCXN0YXJ0X3RyYW5zZmVyKChjb21tb24pLT5mc2csIChjb21tb24pLT5mc2ctPmVwX25hbWUsCVwKKwkJCSAgICAgICByZXEsIHBidXN5LCBzdGF0ZSk7CQkJXAorCWVsc2UKKworI2RlZmluZSBTVEFSVF9UUkFOU0ZFUihjb21tb24sIGVwX25hbWUsIHJlcSwgcGJ1c3ksIHN0YXRlKQkJXAorCVNUQVJUX1RSQU5TRkVSX09SKGNvbW1vbiwgZXBfbmFtZSwgcmVxLCBwYnVzeSwgc3RhdGUpICh2b2lkKTAKKworCisKK3N0YXRpYyBpbnQgc2xlZXBfdGhyZWFkKHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24pCit7CisJaW50CXJjID0gMDsKKworCS8qIFdhaXQgdW50aWwgYSBzaWduYWwgYXJyaXZlcyBvciB3ZSBhcmUgd29rZW4gdXAgKi8KKwlmb3IgKDs7KSB7CisJCXRyeV90b19mcmVlemUoKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyYyA9IC1FSU5UUjsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjb21tb24tPnRocmVhZF93YWtldXBfbmVlZGVkKQorCQkJYnJlYWs7CisJCXNjaGVkdWxlKCk7CisJfQorCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwljb21tb24tPnRocmVhZF93YWtldXBfbmVlZGVkID0gMDsKKwlyZXR1cm4gcmM7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBkb19yZWFkKHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24pCit7CisJc3RydWN0IGZzZ19sdW4JCSpjdXJsdW4gPSBjb21tb24tPmN1cmx1bjsKKwl1MzIJCQlsYmE7CisJc3RydWN0IGZzZ19idWZmaGQJKmJoOworCWludAkJCXJjOworCXUzMgkJCWFtb3VudF9sZWZ0OworCWxvZmZfdAkJCWZpbGVfb2Zmc2V0LCBmaWxlX29mZnNldF90bXA7CisJdW5zaWduZWQgaW50CQlhbW91bnQ7CisJdW5zaWduZWQgaW50CQlwYXJ0aWFsX3BhZ2U7CisJc3NpemVfdAkJCW5yZWFkOworCisJLyogR2V0IHRoZSBzdGFydGluZyBMb2dpY2FsIEJsb2NrIEFkZHJlc3MgYW5kIGNoZWNrIHRoYXQgaXQncworCSAqIG5vdCB0b28gYmlnICovCisJaWYgKGNvbW1vbi0+Y21uZFswXSA9PSBTQ19SRUFEXzYpCisJCWxiYSA9IGdldF91bmFsaWduZWRfYmUyNCgmY29tbW9uLT5jbW5kWzFdKTsKKwllbHNlIHsKKwkJbGJhID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZjb21tb24tPmNtbmRbMl0pOworCisJCS8qIFdlIGFsbG93IERQTyAoRGlzYWJsZSBQYWdlIE91dCA9IGRvbid0IHNhdmUgZGF0YSBpbiB0aGUKKwkJICogY2FjaGUpIGFuZCBGVUEgKEZvcmNlIFVuaXQgQWNjZXNzID0gZG9uJ3QgcmVhZCBmcm9tIHRoZQorCQkgKiBjYWNoZSksIGJ1dCB3ZSBkb24ndCBpbXBsZW1lbnQgdGhlbS4gKi8KKwkJaWYgKChjb21tb24tPmNtbmRbMV0gJiB+MHgxOCkgIT0gMCkgeworCQkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfSU5WQUxJRF9GSUVMRF9JTl9DREI7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwlpZiAobGJhID49IGN1cmx1bi0+bnVtX3NlY3RvcnMpIHsKKwkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfTE9HSUNBTF9CTE9DS19BRERSRVNTX09VVF9PRl9SQU5HRTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWZpbGVfb2Zmc2V0ID0gKChsb2ZmX3QpIGxiYSkgPDwgOTsKKworCS8qIENhcnJ5IG91dCB0aGUgZmlsZSByZWFkcyAqLworCWFtb3VudF9sZWZ0ID0gY29tbW9uLT5kYXRhX3NpemVfZnJvbV9jbW5kOworCWlmICh1bmxpa2VseShhbW91bnRfbGVmdCA9PSAwKSkKKwkJcmV0dXJuIC1FSU87CQkvKiBObyBkZWZhdWx0IHJlcGx5ICovCisKKwlmb3IgKDs7KSB7CisKKwkJLyogRmlndXJlIG91dCBob3cgbXVjaCB3ZSBuZWVkIHRvIHJlYWQ6CisJCSAqIFRyeSB0byByZWFkIHRoZSByZW1haW5pbmcgYW1vdW50LgorCQkgKiBCdXQgZG9uJ3QgcmVhZCBtb3JlIHRoYW4gdGhlIGJ1ZmZlciBzaXplLgorCQkgKiBBbmQgZG9uJ3QgdHJ5IHRvIHJlYWQgcGFzdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgorCQkgKiBGaW5hbGx5LCBpZiB3ZSdyZSBub3QgYXQgYSBwYWdlIGJvdW5kYXJ5LCBkb24ndCByZWFkIHBhc3QKKwkJICoJdGhlIG5leHQgcGFnZS4KKwkJICogSWYgdGhpcyBtZWFucyByZWFkaW5nIDAgdGhlbiB3ZSB3ZXJlIGFza2VkIHRvIHJlYWQgcGFzdAorCQkgKgl0aGUgZW5kIG9mIGZpbGUuICovCisJCWFtb3VudCA9IG1pbihhbW91bnRfbGVmdCwgRlNHX0JVRkxFTik7CisJCWFtb3VudCA9IG1pbigobG9mZl90KSBhbW91bnQsCisJCQkJY3VybHVuLT5maWxlX2xlbmd0aCAtIGZpbGVfb2Zmc2V0KTsKKwkJcGFydGlhbF9wYWdlID0gZmlsZV9vZmZzZXQgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisJCWlmIChwYXJ0aWFsX3BhZ2UgPiAwKQorCQkJYW1vdW50ID0gbWluKGFtb3VudCwgKHVuc2lnbmVkIGludCkgUEFHRV9DQUNIRV9TSVpFIC0KKwkJCQkJcGFydGlhbF9wYWdlKTsKKworCQkvKiBXYWl0IGZvciB0aGUgbmV4dCBidWZmZXIgdG8gYmVjb21lIGF2YWlsYWJsZSAqLworCQliaCA9IGNvbW1vbi0+bmV4dF9idWZmaGRfdG9fZmlsbDsKKwkJd2hpbGUgKGJoLT5zdGF0ZSAhPSBCVUZfU1RBVEVfRU1QVFkpIHsKKwkJCXJjID0gc2xlZXBfdGhyZWFkKGNvbW1vbik7CisJCQlpZiAocmMpCisJCQkJcmV0dXJuIHJjOworCQl9CisKKwkJLyogSWYgd2Ugd2VyZSBhc2tlZCB0byByZWFkIHBhc3QgdGhlIGVuZCBvZiBmaWxlLAorCQkgKiBlbmQgd2l0aCBhbiBlbXB0eSBidWZmZXIuICovCisJCWlmIChhbW91bnQgPT0gMCkgeworCQkJY3VybHVuLT5zZW5zZV9kYXRhID0KKwkJCQkJU1NfTE9HSUNBTF9CTE9DS19BRERSRVNTX09VVF9PRl9SQU5HRTsKKwkJCWN1cmx1bi0+c2Vuc2VfZGF0YV9pbmZvID0gZmlsZV9vZmZzZXQgPj4gOTsKKwkJCWN1cmx1bi0+aW5mb192YWxpZCA9IDE7CisJCQliaC0+aW5yZXEtPmxlbmd0aCA9IDA7CisJCQliaC0+c3RhdGUgPSBCVUZfU1RBVEVfRlVMTDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogUGVyZm9ybSB0aGUgcmVhZCAqLworCQlmaWxlX29mZnNldF90bXAgPSBmaWxlX29mZnNldDsKKwkJbnJlYWQgPSB2ZnNfcmVhZChjdXJsdW4tPmZpbHAsCisJCQkJKGNoYXIgX191c2VyICopIGJoLT5idWYsCisJCQkJYW1vdW50LCAmZmlsZV9vZmZzZXRfdG1wKTsKKwkJVkxEQkcoY3VybHVuLCAiZmlsZSByZWFkICV1IEAgJWxsdSAtPiAlZFxuIiwgYW1vdW50LAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGZpbGVfb2Zmc2V0LAorCQkJCShpbnQpIG5yZWFkKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJcmV0dXJuIC1FSU5UUjsKKworCQlpZiAobnJlYWQgPCAwKSB7CisJCQlMREJHKGN1cmx1biwgImVycm9yIGluIGZpbGUgcmVhZDogJWRcbiIsCisJCQkJCShpbnQpIG5yZWFkKTsKKwkJCW5yZWFkID0gMDsKKwkJfSBlbHNlIGlmIChucmVhZCA8IGFtb3VudCkgeworCQkJTERCRyhjdXJsdW4sICJwYXJ0aWFsIGZpbGUgcmVhZDogJWQvJXVcbiIsCisJCQkJCShpbnQpIG5yZWFkLCBhbW91bnQpOworCQkJbnJlYWQgLT0gKG5yZWFkICYgNTExKTsJLyogUm91bmQgZG93biB0byBhIGJsb2NrICovCisJCX0KKwkJZmlsZV9vZmZzZXQgICs9IG5yZWFkOworCQlhbW91bnRfbGVmdCAgLT0gbnJlYWQ7CisJCWNvbW1vbi0+cmVzaWR1ZSAtPSBucmVhZDsKKwkJYmgtPmlucmVxLT5sZW5ndGggPSBucmVhZDsKKwkJYmgtPnN0YXRlID0gQlVGX1NUQVRFX0ZVTEw7CisKKwkJLyogSWYgYW4gZXJyb3Igb2NjdXJyZWQsIHJlcG9ydCBpdCBhbmQgaXRzIHBvc2l0aW9uICovCisJCWlmIChucmVhZCA8IGFtb3VudCkgeworCQkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfVU5SRUNPVkVSRURfUkVBRF9FUlJPUjsKKwkJCWN1cmx1bi0+c2Vuc2VfZGF0YV9pbmZvID0gZmlsZV9vZmZzZXQgPj4gOTsKKwkJCWN1cmx1bi0+aW5mb192YWxpZCA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChhbW91bnRfbGVmdCA9PSAwKQorCQkJYnJlYWs7CQkvKiBObyBtb3JlIGxlZnQgdG8gcmVhZCAqLworCisJCS8qIFNlbmQgdGhpcyBidWZmZXIgYW5kIGdvIHJlYWQgc29tZSBtb3JlICovCisJCWJoLT5pbnJlcS0+emVybyA9IDA7CisJCVNUQVJUX1RSQU5TRkVSX09SKGNvbW1vbiwgYnVsa19pbiwgYmgtPmlucmVxLAorCQkJICAgICAgICZiaC0+aW5yZXFfYnVzeSwgJmJoLT5zdGF0ZSkKKwkJCS8qIERvbid0IGtub3cgd2hhdCB0byBkbyBpZgorCQkJICogY29tbW9uLT5mc2cgaXMgTlVMTCAqLworCQkJcmV0dXJuIC1FSU87CisJCWNvbW1vbi0+bmV4dF9idWZmaGRfdG9fZmlsbCA9IGJoLT5uZXh0OworCX0KKworCXJldHVybiAtRUlPOwkJLyogTm8gZGVmYXVsdCByZXBseSAqLworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgZG9fd3JpdGUoc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbikKK3sKKwlzdHJ1Y3QgZnNnX2x1bgkJKmN1cmx1biA9IGNvbW1vbi0+Y3VybHVuOworCXUzMgkJCWxiYTsKKwlzdHJ1Y3QgZnNnX2J1ZmZoZAkqYmg7CisJaW50CQkJZ2V0X3NvbWVfbW9yZTsKKwl1MzIJCQlhbW91bnRfbGVmdF90b19yZXEsIGFtb3VudF9sZWZ0X3RvX3dyaXRlOworCWxvZmZfdAkJCXVzYl9vZmZzZXQsIGZpbGVfb2Zmc2V0LCBmaWxlX29mZnNldF90bXA7CisJdW5zaWduZWQgaW50CQlhbW91bnQ7CisJdW5zaWduZWQgaW50CQlwYXJ0aWFsX3BhZ2U7CisJc3NpemVfdAkJCW53cml0dGVuOworCWludAkJCXJjOworCisJaWYgKGN1cmx1bi0+cm8pIHsKKwkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfV1JJVEVfUFJPVEVDVEVEOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc3Bpbl9sb2NrKCZjdXJsdW4tPmZpbHAtPmZfbG9jayk7CisJY3VybHVuLT5maWxwLT5mX2ZsYWdzICY9IH5PX1NZTkM7CS8qIERlZmF1bHQgaXMgbm90IHRvIHdhaXQgKi8KKwlzcGluX3VubG9jaygmY3VybHVuLT5maWxwLT5mX2xvY2spOworCisJLyogR2V0IHRoZSBzdGFydGluZyBMb2dpY2FsIEJsb2NrIEFkZHJlc3MgYW5kIGNoZWNrIHRoYXQgaXQncworCSAqIG5vdCB0b28gYmlnICovCisJaWYgKGNvbW1vbi0+Y21uZFswXSA9PSBTQ19XUklURV82KQorCQlsYmEgPSBnZXRfdW5hbGlnbmVkX2JlMjQoJmNvbW1vbi0+Y21uZFsxXSk7CisJZWxzZSB7CisJCWxiYSA9IGdldF91bmFsaWduZWRfYmUzMigmY29tbW9uLT5jbW5kWzJdKTsKKworCQkvKiBXZSBhbGxvdyBEUE8gKERpc2FibGUgUGFnZSBPdXQgPSBkb24ndCBzYXZlIGRhdGEgaW4gdGhlCisJCSAqIGNhY2hlKSBhbmQgRlVBIChGb3JjZSBVbml0IEFjY2VzcyA9IHdyaXRlIGRpcmVjdGx5IHRvIHRoZQorCQkgKiBtZWRpdW0pLiAgV2UgZG9uJ3QgaW1wbGVtZW50IERQTzsgd2UgaW1wbGVtZW50IEZVQSBieQorCQkgKiBwZXJmb3JtaW5nIHN5bmNocm9ub3VzIG91dHB1dC4gKi8KKwkJaWYgKGNvbW1vbi0+Y21uZFsxXSAmIH4weDE4KSB7CisJCQljdXJsdW4tPnNlbnNlX2RhdGEgPSBTU19JTlZBTElEX0ZJRUxEX0lOX0NEQjsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChjb21tb24tPmNtbmRbMV0gJiAweDA4KSB7CS8qIEZVQSAqLworCQkJc3Bpbl9sb2NrKCZjdXJsdW4tPmZpbHAtPmZfbG9jayk7CisJCQljdXJsdW4tPmZpbHAtPmZfZmxhZ3MgfD0gT19TWU5DOworCQkJc3Bpbl91bmxvY2soJmN1cmx1bi0+ZmlscC0+Zl9sb2NrKTsKKwkJfQorCX0KKwlpZiAobGJhID49IGN1cmx1bi0+bnVtX3NlY3RvcnMpIHsKKwkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfTE9HSUNBTF9CTE9DS19BRERSRVNTX09VVF9PRl9SQU5HRTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ2Fycnkgb3V0IHRoZSBmaWxlIHdyaXRlcyAqLworCWdldF9zb21lX21vcmUgPSAxOworCWZpbGVfb2Zmc2V0ID0gdXNiX29mZnNldCA9ICgobG9mZl90KSBsYmEpIDw8IDk7CisJYW1vdW50X2xlZnRfdG9fcmVxID0gY29tbW9uLT5kYXRhX3NpemVfZnJvbV9jbW5kOworCWFtb3VudF9sZWZ0X3RvX3dyaXRlID0gY29tbW9uLT5kYXRhX3NpemVfZnJvbV9jbW5kOworCisJd2hpbGUgKGFtb3VudF9sZWZ0X3RvX3dyaXRlID4gMCkgeworCisJCS8qIFF1ZXVlIGEgcmVxdWVzdCBmb3IgbW9yZSBkYXRhIGZyb20gdGhlIGhvc3QgKi8KKwkJYmggPSBjb21tb24tPm5leHRfYnVmZmhkX3RvX2ZpbGw7CisJCWlmIChiaC0+c3RhdGUgPT0gQlVGX1NUQVRFX0VNUFRZICYmIGdldF9zb21lX21vcmUpIHsKKworCQkJLyogRmlndXJlIG91dCBob3cgbXVjaCB3ZSB3YW50IHRvIGdldDoKKwkJCSAqIFRyeSB0byBnZXQgdGhlIHJlbWFpbmluZyBhbW91bnQuCisJCQkgKiBCdXQgZG9uJ3QgZ2V0IG1vcmUgdGhhbiB0aGUgYnVmZmVyIHNpemUuCisJCQkgKiBBbmQgZG9uJ3QgdHJ5IHRvIGdvIHBhc3QgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKwkJCSAqIElmIHdlJ3JlIG5vdCBhdCBhIHBhZ2UgYm91bmRhcnksCisJCQkgKglkb24ndCBnbyBwYXN0IHRoZSBuZXh0IHBhZ2UuCisJCQkgKiBJZiB0aGlzIG1lYW5zIGdldHRpbmcgMCwgdGhlbiB3ZSB3ZXJlIGFza2VkCisJCQkgKgl0byB3cml0ZSBwYXN0IHRoZSBlbmQgb2YgZmlsZS4KKwkJCSAqIEZpbmFsbHksIHJvdW5kIGRvd24gdG8gYSBibG9jayBib3VuZGFyeS4gKi8KKwkJCWFtb3VudCA9IG1pbihhbW91bnRfbGVmdF90b19yZXEsIEZTR19CVUZMRU4pOworCQkJYW1vdW50ID0gbWluKChsb2ZmX3QpIGFtb3VudCwgY3VybHVuLT5maWxlX2xlbmd0aCAtCisJCQkJCXVzYl9vZmZzZXQpOworCQkJcGFydGlhbF9wYWdlID0gdXNiX29mZnNldCAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwkJCWlmIChwYXJ0aWFsX3BhZ2UgPiAwKQorCQkJCWFtb3VudCA9IG1pbihhbW91bnQsCisJKHVuc2lnbmVkIGludCkgUEFHRV9DQUNIRV9TSVpFIC0gcGFydGlhbF9wYWdlKTsKKworCQkJaWYgKGFtb3VudCA9PSAwKSB7CisJCQkJZ2V0X3NvbWVfbW9yZSA9IDA7CisJCQkJY3VybHVuLT5zZW5zZV9kYXRhID0KKwkJCQkJU1NfTE9HSUNBTF9CTE9DS19BRERSRVNTX09VVF9PRl9SQU5HRTsKKwkJCQljdXJsdW4tPnNlbnNlX2RhdGFfaW5mbyA9IHVzYl9vZmZzZXQgPj4gOTsKKwkJCQljdXJsdW4tPmluZm9fdmFsaWQgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYW1vdW50IC09IChhbW91bnQgJiA1MTEpOworCQkJaWYgKGFtb3VudCA9PSAwKSB7CisKKwkJCQkvKiBXaHkgd2VyZSB3ZSB3ZXJlIGFza2VkIHRvIHRyYW5zZmVyIGEKKwkJCQkgKiBwYXJ0aWFsIGJsb2NrPyAqLworCQkJCWdldF9zb21lX21vcmUgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBHZXQgdGhlIG5leHQgYnVmZmVyICovCisJCQl1c2Jfb2Zmc2V0ICs9IGFtb3VudDsKKwkJCWNvbW1vbi0+dXNiX2Ftb3VudF9sZWZ0IC09IGFtb3VudDsKKwkJCWFtb3VudF9sZWZ0X3RvX3JlcSAtPSBhbW91bnQ7CisJCQlpZiAoYW1vdW50X2xlZnRfdG9fcmVxID09IDApCisJCQkJZ2V0X3NvbWVfbW9yZSA9IDA7CisKKwkJCS8qIGFtb3VudCBpcyBhbHdheXMgZGl2aXNpYmxlIGJ5IDUxMiwgaGVuY2UgYnkKKwkJCSAqIHRoZSBidWxrLW91dCBtYXhwYWNrZXQgc2l6ZSAqLworCQkJYmgtPm91dHJlcS0+bGVuZ3RoID0gYW1vdW50OworCQkJYmgtPmJ1bGtfb3V0X2ludGVuZGVkX2xlbmd0aCA9IGFtb3VudDsKKwkJCWJoLT5vdXRyZXEtPnNob3J0X25vdF9vayA9IDE7CisJCQlTVEFSVF9UUkFOU0ZFUl9PUihjb21tb24sIGJ1bGtfb3V0LCBiaC0+b3V0cmVxLAorCQkJCQkgICZiaC0+b3V0cmVxX2J1c3ksICZiaC0+c3RhdGUpCisJCQkJLyogRG9uJ3Qga25vdyB3aGF0IHRvIGRvIGlmCisJCQkJICogY29tbW9uLT5mc2cgaXMgTlVMTCAqLworCQkJCXJldHVybiAtRUlPOworCQkJY29tbW9uLT5uZXh0X2J1ZmZoZF90b19maWxsID0gYmgtPm5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFdyaXRlIHRoZSByZWNlaXZlZCBkYXRhIHRvIHRoZSBiYWNraW5nIGZpbGUgKi8KKwkJYmggPSBjb21tb24tPm5leHRfYnVmZmhkX3RvX2RyYWluOworCQlpZiAoYmgtPnN0YXRlID09IEJVRl9TVEFURV9FTVBUWSAmJiAhZ2V0X3NvbWVfbW9yZSkKKwkJCWJyZWFrOwkJCS8qIFdlIHN0b3BwZWQgZWFybHkgKi8KKwkJaWYgKGJoLT5zdGF0ZSA9PSBCVUZfU1RBVEVfRlVMTCkgeworCQkJc21wX3JtYigpOworCQkJY29tbW9uLT5uZXh0X2J1ZmZoZF90b19kcmFpbiA9IGJoLT5uZXh0OworCQkJYmgtPnN0YXRlID0gQlVGX1NUQVRFX0VNUFRZOworCisJCQkvKiBEaWQgc29tZXRoaW5nIGdvIHdyb25nIHdpdGggdGhlIHRyYW5zZmVyPyAqLworCQkJaWYgKGJoLT5vdXRyZXEtPnN0YXR1cyAhPSAwKSB7CisJCQkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfQ09NTVVOSUNBVElPTl9GQUlMVVJFOworCQkJCWN1cmx1bi0+c2Vuc2VfZGF0YV9pbmZvID0gZmlsZV9vZmZzZXQgPj4gOTsKKwkJCQljdXJsdW4tPmluZm9fdmFsaWQgPSAxOworCQkJCWJyZWFrOworCQkJfQorCisJCQlhbW91bnQgPSBiaC0+b3V0cmVxLT5hY3R1YWw7CisJCQlpZiAoY3VybHVuLT5maWxlX2xlbmd0aCAtIGZpbGVfb2Zmc2V0IDwgYW1vdW50KSB7CisJCQkJTEVSUk9SKGN1cmx1biwKKwkid3JpdGUgJXUgQCAlbGx1IGJleW9uZCBlbmQgJWxsdVxuIiwKKwlhbW91bnQsICh1bnNpZ25lZCBsb25nIGxvbmcpIGZpbGVfb2Zmc2V0LAorCSh1bnNpZ25lZCBsb25nIGxvbmcpIGN1cmx1bi0+ZmlsZV9sZW5ndGgpOworCQkJCWFtb3VudCA9IGN1cmx1bi0+ZmlsZV9sZW5ndGggLSBmaWxlX29mZnNldDsKKwkJCX0KKworCQkJLyogUGVyZm9ybSB0aGUgd3JpdGUgKi8KKwkJCWZpbGVfb2Zmc2V0X3RtcCA9IGZpbGVfb2Zmc2V0OworCQkJbndyaXR0ZW4gPSB2ZnNfd3JpdGUoY3VybHVuLT5maWxwLAorCQkJCQkoY2hhciBfX3VzZXIgKikgYmgtPmJ1ZiwKKwkJCQkJYW1vdW50LCAmZmlsZV9vZmZzZXRfdG1wKTsKKwkJCVZMREJHKGN1cmx1biwgImZpbGUgd3JpdGUgJXUgQCAlbGx1IC0+ICVkXG4iLCBhbW91bnQsCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGZpbGVfb2Zmc2V0LAorCQkJCQkoaW50KSBud3JpdHRlbik7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJcmV0dXJuIC1FSU5UUjsJCS8qIEludGVycnVwdGVkISAqLworCisJCQlpZiAobndyaXR0ZW4gPCAwKSB7CisJCQkJTERCRyhjdXJsdW4sICJlcnJvciBpbiBmaWxlIHdyaXRlOiAlZFxuIiwKKwkJCQkJCShpbnQpIG53cml0dGVuKTsKKwkJCQlud3JpdHRlbiA9IDA7CisJCQl9IGVsc2UgaWYgKG53cml0dGVuIDwgYW1vdW50KSB7CisJCQkJTERCRyhjdXJsdW4sICJwYXJ0aWFsIGZpbGUgd3JpdGU6ICVkLyV1XG4iLAorCQkJCQkJKGludCkgbndyaXR0ZW4sIGFtb3VudCk7CisJCQkJbndyaXR0ZW4gLT0gKG53cml0dGVuICYgNTExKTsKKwkJCQkvKiBSb3VuZCBkb3duIHRvIGEgYmxvY2sgKi8KKwkJCX0KKwkJCWZpbGVfb2Zmc2V0ICs9IG53cml0dGVuOworCQkJYW1vdW50X2xlZnRfdG9fd3JpdGUgLT0gbndyaXR0ZW47CisJCQljb21tb24tPnJlc2lkdWUgLT0gbndyaXR0ZW47CisKKwkJCS8qIElmIGFuIGVycm9yIG9jY3VycmVkLCByZXBvcnQgaXQgYW5kIGl0cyBwb3NpdGlvbiAqLworCQkJaWYgKG53cml0dGVuIDwgYW1vdW50KSB7CisJCQkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfV1JJVEVfRVJST1I7CisJCQkJY3VybHVuLT5zZW5zZV9kYXRhX2luZm8gPSBmaWxlX29mZnNldCA+PiA5OworCQkJCWN1cmx1bi0+aW5mb192YWxpZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIERpZCB0aGUgaG9zdCBkZWNpZGUgdG8gc3RvcCBlYXJseT8gKi8KKwkJCWlmIChiaC0+b3V0cmVxLT5hY3R1YWwgIT0gYmgtPm91dHJlcS0+bGVuZ3RoKSB7CisJCQkJY29tbW9uLT5zaG9ydF9wYWNrZXRfcmVjZWl2ZWQgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQkvKiBXYWl0IGZvciBzb21ldGhpbmcgdG8gaGFwcGVuICovCisJCXJjID0gc2xlZXBfdGhyZWFkKGNvbW1vbik7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gLUVJTzsJCS8qIE5vIGRlZmF1bHQgcmVwbHkgKi8KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IGRvX3N5bmNocm9uaXplX2NhY2hlKHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24pCit7CisJc3RydWN0IGZzZ19sdW4JKmN1cmx1biA9IGNvbW1vbi0+Y3VybHVuOworCWludAkJcmM7CisKKwkvKiBXZSBpZ25vcmUgdGhlIHJlcXVlc3RlZCBMQkEgYW5kIHdyaXRlIG91dCBhbGwgZmlsZSdzCisJICogZGlydHkgZGF0YSBidWZmZXJzLiAqLworCXJjID0gZnNnX2x1bl9mc3luY19zdWIoY3VybHVuKTsKKwlpZiAocmMpCisJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX1dSSVRFX0VSUk9SOworCXJldHVybiAwOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIGludmFsaWRhdGVfc3ViKHN0cnVjdCBmc2dfbHVuICpjdXJsdW4pCit7CisJc3RydWN0IGZpbGUJKmZpbHAgPSBjdXJsdW4tPmZpbHA7CisJc3RydWN0IGlub2RlCSppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CisJdW5zaWduZWQgbG9uZwlyYzsKKworCXJjID0gaW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKGlub2RlLT5pX21hcHBpbmcsIDAsIC0xKTsKKwlWTERCRyhjdXJsdW4sICJpbnZhbGlkYXRlX2lub2RlX3BhZ2VzIC0+ICVsZFxuIiwgcmMpOworfQorCitzdGF0aWMgaW50IGRvX3ZlcmlmeShzdHJ1Y3QgZnNnX2NvbW1vbiAqY29tbW9uKQoreworCXN0cnVjdCBmc2dfbHVuCQkqY3VybHVuID0gY29tbW9uLT5jdXJsdW47CisJdTMyCQkJbGJhOworCXUzMgkJCXZlcmlmaWNhdGlvbl9sZW5ndGg7CisJc3RydWN0IGZzZ19idWZmaGQJKmJoID0gY29tbW9uLT5uZXh0X2J1ZmZoZF90b19maWxsOworCWxvZmZfdAkJCWZpbGVfb2Zmc2V0LCBmaWxlX29mZnNldF90bXA7CisJdTMyCQkJYW1vdW50X2xlZnQ7CisJdW5zaWduZWQgaW50CQlhbW91bnQ7CisJc3NpemVfdAkJCW5yZWFkOworCisJLyogR2V0IHRoZSBzdGFydGluZyBMb2dpY2FsIEJsb2NrIEFkZHJlc3MgYW5kIGNoZWNrIHRoYXQgaXQncworCSAqIG5vdCB0b28gYmlnICovCisJbGJhID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZjb21tb24tPmNtbmRbMl0pOworCWlmIChsYmEgPj0gY3VybHVuLT5udW1fc2VjdG9ycykgeworCQljdXJsdW4tPnNlbnNlX2RhdGEgPSBTU19MT0dJQ0FMX0JMT0NLX0FERFJFU1NfT1VUX09GX1JBTkdFOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBXZSBhbGxvdyBEUE8gKERpc2FibGUgUGFnZSBPdXQgPSBkb24ndCBzYXZlIGRhdGEgaW4gdGhlCisJICogY2FjaGUpIGJ1dCB3ZSBkb24ndCBpbXBsZW1lbnQgaXQuICovCisJaWYgKGNvbW1vbi0+Y21uZFsxXSAmIH4weDEwKSB7CisJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX0lOVkFMSURfRklFTERfSU5fQ0RCOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl2ZXJpZmljYXRpb25fbGVuZ3RoID0gZ2V0X3VuYWxpZ25lZF9iZTE2KCZjb21tb24tPmNtbmRbN10pOworCWlmICh1bmxpa2VseSh2ZXJpZmljYXRpb25fbGVuZ3RoID09IDApKQorCQlyZXR1cm4gLUVJTzsJCS8qIE5vIGRlZmF1bHQgcmVwbHkgKi8KKworCS8qIFByZXBhcmUgdG8gY2Fycnkgb3V0IHRoZSBmaWxlIHZlcmlmeSAqLworCWFtb3VudF9sZWZ0ID0gdmVyaWZpY2F0aW9uX2xlbmd0aCA8PCA5OworCWZpbGVfb2Zmc2V0ID0gKChsb2ZmX3QpIGxiYSkgPDwgOTsKKworCS8qIFdyaXRlIG91dCBhbGwgdGhlIGRpcnR5IGJ1ZmZlcnMgYmVmb3JlIGludmFsaWRhdGluZyB0aGVtICovCisJZnNnX2x1bl9mc3luY19zdWIoY3VybHVuKTsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCXJldHVybiAtRUlOVFI7CisKKwlpbnZhbGlkYXRlX3N1YihjdXJsdW4pOworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCS8qIEp1c3QgdHJ5IHRvIHJlYWQgdGhlIHJlcXVlc3RlZCBibG9ja3MgKi8KKwl3aGlsZSAoYW1vdW50X2xlZnQgPiAwKSB7CisKKwkJLyogRmlndXJlIG91dCBob3cgbXVjaCB3ZSBuZWVkIHRvIHJlYWQ6CisJCSAqIFRyeSB0byByZWFkIHRoZSByZW1haW5pbmcgYW1vdW50LCBidXQgbm90IG1vcmUgdGhhbgorCQkgKiB0aGUgYnVmZmVyIHNpemUuCisJCSAqIEFuZCBkb24ndCB0cnkgdG8gcmVhZCBwYXN0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCisJCSAqIElmIHRoaXMgbWVhbnMgcmVhZGluZyAwIHRoZW4gd2Ugd2VyZSBhc2tlZCB0byByZWFkCisJCSAqIHBhc3QgdGhlIGVuZCBvZiBmaWxlLiAqLworCQlhbW91bnQgPSBtaW4oYW1vdW50X2xlZnQsIEZTR19CVUZMRU4pOworCQlhbW91bnQgPSBtaW4oKGxvZmZfdCkgYW1vdW50LAorCQkJCWN1cmx1bi0+ZmlsZV9sZW5ndGggLSBmaWxlX29mZnNldCk7CisJCWlmIChhbW91bnQgPT0gMCkgeworCQkJY3VybHVuLT5zZW5zZV9kYXRhID0KKwkJCQkJU1NfTE9HSUNBTF9CTE9DS19BRERSRVNTX09VVF9PRl9SQU5HRTsKKwkJCWN1cmx1bi0+c2Vuc2VfZGF0YV9pbmZvID0gZmlsZV9vZmZzZXQgPj4gOTsKKwkJCWN1cmx1bi0+aW5mb192YWxpZCA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFBlcmZvcm0gdGhlIHJlYWQgKi8KKwkJZmlsZV9vZmZzZXRfdG1wID0gZmlsZV9vZmZzZXQ7CisJCW5yZWFkID0gdmZzX3JlYWQoY3VybHVuLT5maWxwLAorCQkJCShjaGFyIF9fdXNlciAqKSBiaC0+YnVmLAorCQkJCWFtb3VudCwgJmZpbGVfb2Zmc2V0X3RtcCk7CisJCVZMREJHKGN1cmx1biwgImZpbGUgcmVhZCAldSBAICVsbHUgLT4gJWRcbiIsIGFtb3VudCwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKSBmaWxlX29mZnNldCwKKwkJCQkoaW50KSBucmVhZCk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRUlOVFI7CisKKwkJaWYgKG5yZWFkIDwgMCkgeworCQkJTERCRyhjdXJsdW4sICJlcnJvciBpbiBmaWxlIHZlcmlmeTogJWRcbiIsCisJCQkJCShpbnQpIG5yZWFkKTsKKwkJCW5yZWFkID0gMDsKKwkJfSBlbHNlIGlmIChucmVhZCA8IGFtb3VudCkgeworCQkJTERCRyhjdXJsdW4sICJwYXJ0aWFsIGZpbGUgdmVyaWZ5OiAlZC8ldVxuIiwKKwkJCQkJKGludCkgbnJlYWQsIGFtb3VudCk7CisJCQlucmVhZCAtPSAobnJlYWQgJiA1MTEpOwkvKiBSb3VuZCBkb3duIHRvIGEgc2VjdG9yICovCisJCX0KKwkJaWYgKG5yZWFkID09IDApIHsKKwkJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX1VOUkVDT1ZFUkVEX1JFQURfRVJST1I7CisJCQljdXJsdW4tPnNlbnNlX2RhdGFfaW5mbyA9IGZpbGVfb2Zmc2V0ID4+IDk7CisJCQljdXJsdW4tPmluZm9fdmFsaWQgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJZmlsZV9vZmZzZXQgKz0gbnJlYWQ7CisJCWFtb3VudF9sZWZ0IC09IG5yZWFkOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IGRvX2lucXVpcnkoc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbiwgc3RydWN0IGZzZ19idWZmaGQgKmJoKQoreworCXN0cnVjdCBmc2dfbHVuICpjdXJsdW4gPSBjb21tb24tPmN1cmx1bjsKKwl1OAkqYnVmID0gKHU4ICopIGJoLT5idWY7CisKKwlpZiAoIWN1cmx1bikgewkJLyogVW5zdXBwb3J0ZWQgTFVOcyBhcmUgb2theSAqLworCQljb21tb24tPmJhZF9sdW5fb2theSA9IDE7CisJCW1lbXNldChidWYsIDAsIDM2KTsKKwkJYnVmWzBdID0gMHg3ZjsJCS8qIFVuc3VwcG9ydGVkLCBubyBkZXZpY2UtdHlwZSAqLworCQlidWZbNF0gPSAzMTsJCS8qIEFkZGl0aW9uYWwgbGVuZ3RoICovCisJCXJldHVybiAzNjsKKwl9CisKKwlidWZbMF0gPSBjdXJsdW4tPmNkcm9tID8gVFlQRV9DRFJPTSA6IFRZUEVfRElTSzsKKwlidWZbMV0gPSBjdXJsdW4tPnJlbW92YWJsZSA/IDB4ODAgOiAwOworCWJ1ZlsyXSA9IDI7CQkvKiBBTlNJIFNDU0kgbGV2ZWwgMiAqLworCWJ1ZlszXSA9IDI7CQkvKiBTQ1NJLTIgSU5RVUlSWSBkYXRhIGZvcm1hdCAqLworCWJ1Zls0XSA9IDMxOwkJLyogQWRkaXRpb25hbCBsZW5ndGggKi8KKwlidWZbNV0gPSAwOwkJLyogTm8gc3BlY2lhbCBvcHRpb25zICovCisJYnVmWzZdID0gMDsKKwlidWZbN10gPSAwOworCW1lbWNweShidWYgKyA4LCBjb21tb24tPmlucXVpcnlfc3RyaW5nLCBzaXplb2YgY29tbW9uLT5pbnF1aXJ5X3N0cmluZyk7CisJcmV0dXJuIDM2OworfQorCisKK3N0YXRpYyBpbnQgZG9fcmVxdWVzdF9zZW5zZShzdHJ1Y3QgZnNnX2NvbW1vbiAqY29tbW9uLCBzdHJ1Y3QgZnNnX2J1ZmZoZCAqYmgpCit7CisJc3RydWN0IGZzZ19sdW4JKmN1cmx1biA9IGNvbW1vbi0+Y3VybHVuOworCXU4CQkqYnVmID0gKHU4ICopIGJoLT5idWY7CisJdTMyCQlzZCwgc2RpbmZvOworCWludAkJdmFsaWQ7CisKKwkvKgorCSAqIEZyb20gdGhlIFNDU0ktMiBzcGVjLiwgc2VjdGlvbiA3LjkgKFVuaXQgYXR0ZW50aW9uIGNvbmRpdGlvbik6CisJICoKKwkgKiBJZiBhIFJFUVVFU1QgU0VOU0UgY29tbWFuZCBpcyByZWNlaXZlZCBmcm9tIGFuIGluaXRpYXRvcgorCSAqIHdpdGggYSBwZW5kaW5nIHVuaXQgYXR0ZW50aW9uIGNvbmRpdGlvbiAoYmVmb3JlIHRoZSB0YXJnZXQKKwkgKiBnZW5lcmF0ZXMgdGhlIGNvbnRpbmdlbnQgYWxsZWdpYW5jZSBjb25kaXRpb24pLCB0aGVuIHRoZQorCSAqIHRhcmdldCBzaGFsbCBlaXRoZXI6CisJICogICBhKSByZXBvcnQgYW55IHBlbmRpbmcgc2Vuc2UgZGF0YSBhbmQgcHJlc2VydmUgdGhlIHVuaXQKKwkgKglhdHRlbnRpb24gY29uZGl0aW9uIG9uIHRoZSBsb2dpY2FsIHVuaXQsIG9yLAorCSAqICAgYikgcmVwb3J0IHRoZSB1bml0IGF0dGVudGlvbiBjb25kaXRpb24sIG1heSBkaXNjYXJkIGFueQorCSAqCXBlbmRpbmcgc2Vuc2UgZGF0YSwgYW5kIGNsZWFyIHRoZSB1bml0IGF0dGVudGlvbgorCSAqCWNvbmRpdGlvbiBvbiB0aGUgbG9naWNhbCB1bml0IGZvciB0aGF0IGluaXRpYXRvci4KKwkgKgorCSAqIEZTRyBub3JtYWxseSB1c2VzIG9wdGlvbiBhKTsgZW5hYmxlIHRoaXMgY29kZSB0byB1c2Ugb3B0aW9uIGIpLgorCSAqLworI2lmIDAKKwlpZiAoY3VybHVuICYmIGN1cmx1bi0+dW5pdF9hdHRlbnRpb25fZGF0YSAhPSBTU19OT19TRU5TRSkgeworCQljdXJsdW4tPnNlbnNlX2RhdGEgPSBjdXJsdW4tPnVuaXRfYXR0ZW50aW9uX2RhdGE7CisJCWN1cmx1bi0+dW5pdF9hdHRlbnRpb25fZGF0YSA9IFNTX05PX1NFTlNFOworCX0KKyNlbmRpZgorCisJaWYgKCFjdXJsdW4pIHsJCS8qIFVuc3VwcG9ydGVkIExVTnMgYXJlIG9rYXkgKi8KKwkJY29tbW9uLT5iYWRfbHVuX29rYXkgPSAxOworCQlzZCA9IFNTX0xPR0lDQUxfVU5JVF9OT1RfU1VQUE9SVEVEOworCQlzZGluZm8gPSAwOworCQl2YWxpZCA9IDA7CisJfSBlbHNlIHsKKwkJc2QgPSBjdXJsdW4tPnNlbnNlX2RhdGE7CisJCXNkaW5mbyA9IGN1cmx1bi0+c2Vuc2VfZGF0YV9pbmZvOworCQl2YWxpZCA9IGN1cmx1bi0+aW5mb192YWxpZCA8PCA3OworCQljdXJsdW4tPnNlbnNlX2RhdGEgPSBTU19OT19TRU5TRTsKKwkJY3VybHVuLT5zZW5zZV9kYXRhX2luZm8gPSAwOworCQljdXJsdW4tPmluZm9fdmFsaWQgPSAwOworCX0KKworCW1lbXNldChidWYsIDAsIDE4KTsKKwlidWZbMF0gPSB2YWxpZCB8IDB4NzA7CQkJLyogVmFsaWQsIGN1cnJlbnQgZXJyb3IgKi8KKwlidWZbMl0gPSBTSyhzZCk7CisJcHV0X3VuYWxpZ25lZF9iZTMyKHNkaW5mbywgJmJ1ZlszXSk7CS8qIFNlbnNlIGluZm9ybWF0aW9uICovCisJYnVmWzddID0gMTggLSA4OwkJCS8qIEFkZGl0aW9uYWwgc2Vuc2UgbGVuZ3RoICovCisJYnVmWzEyXSA9IEFTQyhzZCk7CisJYnVmWzEzXSA9IEFTQ1Eoc2QpOworCXJldHVybiAxODsKK30KKworCitzdGF0aWMgaW50IGRvX3JlYWRfY2FwYWNpdHkoc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbiwgc3RydWN0IGZzZ19idWZmaGQgKmJoKQoreworCXN0cnVjdCBmc2dfbHVuCSpjdXJsdW4gPSBjb21tb24tPmN1cmx1bjsKKwl1MzIJCWxiYSA9IGdldF91bmFsaWduZWRfYmUzMigmY29tbW9uLT5jbW5kWzJdKTsKKwlpbnQJCXBtaSA9IGNvbW1vbi0+Y21uZFs4XTsKKwl1OAkJKmJ1ZiA9ICh1OCAqKSBiaC0+YnVmOworCisJLyogQ2hlY2sgdGhlIFBNSSBhbmQgTEJBIGZpZWxkcyAqLworCWlmIChwbWkgPiAxIHx8IChwbWkgPT0gMCAmJiBsYmEgIT0gMCkpIHsKKwkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfSU5WQUxJRF9GSUVMRF9JTl9DREI7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXB1dF91bmFsaWduZWRfYmUzMihjdXJsdW4tPm51bV9zZWN0b3JzIC0gMSwgJmJ1ZlswXSk7CisJCQkJCQkvKiBNYXggbG9naWNhbCBibG9jayAqLworCXB1dF91bmFsaWduZWRfYmUzMig1MTIsICZidWZbNF0pOwkvKiBCbG9jayBsZW5ndGggKi8KKwlyZXR1cm4gODsKK30KKworCitzdGF0aWMgaW50IGRvX3JlYWRfaGVhZGVyKHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24sIHN0cnVjdCBmc2dfYnVmZmhkICpiaCkKK3sKKwlzdHJ1Y3QgZnNnX2x1bgkqY3VybHVuID0gY29tbW9uLT5jdXJsdW47CisJaW50CQltc2YgPSBjb21tb24tPmNtbmRbMV0gJiAweDAyOworCXUzMgkJbGJhID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZjb21tb24tPmNtbmRbMl0pOworCXU4CQkqYnVmID0gKHU4ICopIGJoLT5idWY7CisKKwlpZiAoY29tbW9uLT5jbW5kWzFdICYgfjB4MDIpIHsJCS8qIE1hc2sgYXdheSBNU0YgKi8KKwkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfSU5WQUxJRF9GSUVMRF9JTl9DREI7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAobGJhID49IGN1cmx1bi0+bnVtX3NlY3RvcnMpIHsKKwkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfTE9HSUNBTF9CTE9DS19BRERSRVNTX09VVF9PRl9SQU5HRTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWVtc2V0KGJ1ZiwgMCwgOCk7CisJYnVmWzBdID0gMHgwMTsJCS8qIDIwNDggYnl0ZXMgb2YgdXNlciBkYXRhLCByZXN0IGlzIEVDICovCisJc3RvcmVfY2Ryb21fYWRkcmVzcygmYnVmWzRdLCBtc2YsIGxiYSk7CisJcmV0dXJuIDg7Cit9CisKKworc3RhdGljIGludCBkb19yZWFkX3RvYyhzdHJ1Y3QgZnNnX2NvbW1vbiAqY29tbW9uLCBzdHJ1Y3QgZnNnX2J1ZmZoZCAqYmgpCit7CisJc3RydWN0IGZzZ19sdW4JKmN1cmx1biA9IGNvbW1vbi0+Y3VybHVuOworCWludAkJbXNmID0gY29tbW9uLT5jbW5kWzFdICYgMHgwMjsKKwlpbnQJCXN0YXJ0X3RyYWNrID0gY29tbW9uLT5jbW5kWzZdOworCXU4CQkqYnVmID0gKHU4ICopIGJoLT5idWY7CisKKwlpZiAoKGNvbW1vbi0+Y21uZFsxXSAmIH4weDAyKSAhPSAwIHx8CS8qIE1hc2sgYXdheSBNU0YgKi8KKwkJCXN0YXJ0X3RyYWNrID4gMSkgeworCQljdXJsdW4tPnNlbnNlX2RhdGEgPSBTU19JTlZBTElEX0ZJRUxEX0lOX0NEQjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWVtc2V0KGJ1ZiwgMCwgMjApOworCWJ1ZlsxXSA9ICgyMC0yKTsJCS8qIFRPQyBkYXRhIGxlbmd0aCAqLworCWJ1ZlsyXSA9IDE7CQkJLyogRmlyc3QgdHJhY2sgbnVtYmVyICovCisJYnVmWzNdID0gMTsJCQkvKiBMYXN0IHRyYWNrIG51bWJlciAqLworCWJ1Zls1XSA9IDB4MTY7CQkJLyogRGF0YSB0cmFjaywgY29weWluZyBhbGxvd2VkICovCisJYnVmWzZdID0gMHgwMTsJCQkvKiBPbmx5IHRyYWNrIGlzIG51bWJlciAxICovCisJc3RvcmVfY2Ryb21fYWRkcmVzcygmYnVmWzhdLCBtc2YsIDApOworCisJYnVmWzEzXSA9IDB4MTY7CQkJLyogTGVhZC1vdXQgdHJhY2sgaXMgZGF0YSAqLworCWJ1ZlsxNF0gPSAweEFBOwkJCS8qIExlYWQtb3V0IHRyYWNrIG51bWJlciAqLworCXN0b3JlX2Nkcm9tX2FkZHJlc3MoJmJ1ZlsxNl0sIG1zZiwgY3VybHVuLT5udW1fc2VjdG9ycyk7CisJcmV0dXJuIDIwOworfQorCisKK3N0YXRpYyBpbnQgZG9fbW9kZV9zZW5zZShzdHJ1Y3QgZnNnX2NvbW1vbiAqY29tbW9uLCBzdHJ1Y3QgZnNnX2J1ZmZoZCAqYmgpCit7CisJc3RydWN0IGZzZ19sdW4JKmN1cmx1biA9IGNvbW1vbi0+Y3VybHVuOworCWludAkJbXNjbW5kID0gY29tbW9uLT5jbW5kWzBdOworCXU4CQkqYnVmID0gKHU4ICopIGJoLT5idWY7CisJdTgJCSpidWYwID0gYnVmOworCWludAkJcGMsIHBhZ2VfY29kZTsKKwlpbnQJCWNoYW5nZWFibGVfdmFsdWVzLCBhbGxfcGFnZXM7CisJaW50CQl2YWxpZF9wYWdlID0gMDsKKwlpbnQJCWxlbiwgbGltaXQ7CisKKwlpZiAoKGNvbW1vbi0+Y21uZFsxXSAmIH4weDA4KSAhPSAwKSB7CS8qIE1hc2sgYXdheSBEQkQgKi8KKwkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfSU5WQUxJRF9GSUVMRF9JTl9DREI7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwYyA9IGNvbW1vbi0+Y21uZFsyXSA+PiA2OworCXBhZ2VfY29kZSA9IGNvbW1vbi0+Y21uZFsyXSAmIDB4M2Y7CisJaWYgKHBjID09IDMpIHsKKwkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfU0FWSU5HX1BBUkFNRVRFUlNfTk9UX1NVUFBPUlRFRDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWNoYW5nZWFibGVfdmFsdWVzID0gKHBjID09IDEpOworCWFsbF9wYWdlcyA9IChwYWdlX2NvZGUgPT0gMHgzZik7CisKKwkvKiBXcml0ZSB0aGUgbW9kZSBwYXJhbWV0ZXIgaGVhZGVyLiAgRml4ZWQgdmFsdWVzIGFyZTogZGVmYXVsdAorCSAqIG1lZGl1bSB0eXBlLCBubyBjYWNoZSBjb250cm9sIChEUE9GVUEpLCBhbmQgbm8gYmxvY2sgZGVzY3JpcHRvcnMuCisJICogVGhlIG9ubHkgdmFyaWFibGUgdmFsdWUgaXMgdGhlIFdyaXRlUHJvdGVjdCBiaXQuICBXZSB3aWxsIGZpbGwgaW4KKwkgKiB0aGUgbW9kZSBkYXRhIGxlbmd0aCBsYXRlci4gKi8KKwltZW1zZXQoYnVmLCAwLCA4KTsKKwlpZiAobXNjbW5kID09IFNDX01PREVfU0VOU0VfNikgeworCQlidWZbMl0gPSAoY3VybHVuLT5ybyA/IDB4ODAgOiAweDAwKTsJCS8qIFdQLCBEUE9GVUEgKi8KKwkJYnVmICs9IDQ7CisJCWxpbWl0ID0gMjU1OworCX0gZWxzZSB7CQkJLyogU0NfTU9ERV9TRU5TRV8xMCAqLworCQlidWZbM10gPSAoY3VybHVuLT5ybyA/IDB4ODAgOiAweDAwKTsJCS8qIFdQLCBEUE9GVUEgKi8KKwkJYnVmICs9IDg7CisJCWxpbWl0ID0gNjU1MzU7CQkvKiBTaG91bGQgcmVhbGx5IGJlIEZTR19CVUZMRU4gKi8KKwl9CisKKwkvKiBObyBibG9jayBkZXNjcmlwdG9ycyAqLworCisJLyogVGhlIG1vZGUgcGFnZXMsIGluIG51bWVyaWNhbCBvcmRlci4gIFRoZSBvbmx5IHBhZ2Ugd2Ugc3VwcG9ydAorCSAqIGlzIHRoZSBDYWNoaW5nIHBhZ2UuICovCisJaWYgKHBhZ2VfY29kZSA9PSAweDA4IHx8IGFsbF9wYWdlcykgeworCQl2YWxpZF9wYWdlID0gMTsKKwkJYnVmWzBdID0gMHgwODsJCS8qIFBhZ2UgY29kZSAqLworCQlidWZbMV0gPSAxMDsJCS8qIFBhZ2UgbGVuZ3RoICovCisJCW1lbXNldChidWYrMiwgMCwgMTApOwkvKiBOb25lIG9mIHRoZSBmaWVsZHMgYXJlIGNoYW5nZWFibGUgKi8KKworCQlpZiAoIWNoYW5nZWFibGVfdmFsdWVzKSB7CisJCQlidWZbMl0gPSAweDA0OwkvKiBXcml0ZSBjYWNoZSBlbmFibGUsICovCisJCQkJCS8qIFJlYWQgY2FjaGUgbm90IGRpc2FibGVkICovCisJCQkJCS8qIE5vIGNhY2hlIHJldGVudGlvbiBwcmlvcml0aWVzICovCisJCQlwdXRfdW5hbGlnbmVkX2JlMTYoMHhmZmZmLCAmYnVmWzRdKTsKKwkJCQkJLyogRG9uJ3QgZGlzYWJsZSBwcmVmZXRjaCAqLworCQkJCQkvKiBNaW5pbXVtIHByZWZldGNoID0gMCAqLworCQkJcHV0X3VuYWxpZ25lZF9iZTE2KDB4ZmZmZiwgJmJ1Zls4XSk7CisJCQkJCS8qIE1heGltdW0gcHJlZmV0Y2ggKi8KKwkJCXB1dF91bmFsaWduZWRfYmUxNigweGZmZmYsICZidWZbMTBdKTsKKwkJCQkJLyogTWF4aW11bSBwcmVmZXRjaCBjZWlsaW5nICovCisJCX0KKwkJYnVmICs9IDEyOworCX0KKworCS8qIENoZWNrIHRoYXQgYSB2YWxpZCBwYWdlIHdhcyByZXF1ZXN0ZWQgYW5kIHRoZSBtb2RlIGRhdGEgbGVuZ3RoCisJICogaXNuJ3QgdG9vIGxvbmcuICovCisJbGVuID0gYnVmIC0gYnVmMDsKKwlpZiAoIXZhbGlkX3BhZ2UgfHwgbGVuID4gbGltaXQpIHsKKwkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfSU5WQUxJRF9GSUVMRF9JTl9DREI7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qICBTdG9yZSB0aGUgbW9kZSBkYXRhIGxlbmd0aCAqLworCWlmIChtc2NtbmQgPT0gU0NfTU9ERV9TRU5TRV82KQorCQlidWYwWzBdID0gbGVuIC0gMTsKKwllbHNlCisJCXB1dF91bmFsaWduZWRfYmUxNihsZW4gLSAyLCBidWYwKTsKKwlyZXR1cm4gbGVuOworfQorCisKK3N0YXRpYyBpbnQgZG9fc3RhcnRfc3RvcChzdHJ1Y3QgZnNnX2NvbW1vbiAqY29tbW9uKQoreworCWlmICghY29tbW9uLT5jdXJsdW4pIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmICghY29tbW9uLT5jdXJsdW4tPnJlbW92YWJsZSkgeworCQljb21tb24tPmN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX0lOVkFMSURfQ09NTUFORDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZG9fcHJldmVudF9hbGxvdyhzdHJ1Y3QgZnNnX2NvbW1vbiAqY29tbW9uKQoreworCXN0cnVjdCBmc2dfbHVuCSpjdXJsdW4gPSBjb21tb24tPmN1cmx1bjsKKwlpbnQJCXByZXZlbnQ7CisKKwlpZiAoIWNvbW1vbi0+Y3VybHVuKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAoIWNvbW1vbi0+Y3VybHVuLT5yZW1vdmFibGUpIHsKKwkJY29tbW9uLT5jdXJsdW4tPnNlbnNlX2RhdGEgPSBTU19JTlZBTElEX0NPTU1BTkQ7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXByZXZlbnQgPSBjb21tb24tPmNtbmRbNF0gJiAweDAxOworCWlmICgoY29tbW9uLT5jbW5kWzRdICYgfjB4MDEpICE9IDApIHsJLyogTWFzayBhd2F5IFByZXZlbnQgKi8KKwkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfSU5WQUxJRF9GSUVMRF9JTl9DREI7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjdXJsdW4tPnByZXZlbnRfbWVkaXVtX3JlbW92YWwgJiYgIXByZXZlbnQpCisJCWZzZ19sdW5fZnN5bmNfc3ViKGN1cmx1bik7CisJY3VybHVuLT5wcmV2ZW50X21lZGl1bV9yZW1vdmFsID0gcHJldmVudDsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGRvX3JlYWRfZm9ybWF0X2NhcGFjaXRpZXMoc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbiwKKwkJCXN0cnVjdCBmc2dfYnVmZmhkICpiaCkKK3sKKwlzdHJ1Y3QgZnNnX2x1bgkqY3VybHVuID0gY29tbW9uLT5jdXJsdW47CisJdTgJCSpidWYgPSAodTggKikgYmgtPmJ1ZjsKKworCWJ1ZlswXSA9IGJ1ZlsxXSA9IGJ1ZlsyXSA9IDA7CisJYnVmWzNdID0gODsJLyogT25seSB0aGUgQ3VycmVudC9NYXhpbXVtIENhcGFjaXR5IERlc2NyaXB0b3IgKi8KKwlidWYgKz0gNDsKKworCXB1dF91bmFsaWduZWRfYmUzMihjdXJsdW4tPm51bV9zZWN0b3JzLCAmYnVmWzBdKTsKKwkJCQkJCS8qIE51bWJlciBvZiBibG9ja3MgKi8KKwlwdXRfdW5hbGlnbmVkX2JlMzIoNTEyLCAmYnVmWzRdKTsJLyogQmxvY2sgbGVuZ3RoICovCisJYnVmWzRdID0gMHgwMjsJCQkJLyogQ3VycmVudCBjYXBhY2l0eSAqLworCXJldHVybiAxMjsKK30KKworCitzdGF0aWMgaW50IGRvX21vZGVfc2VsZWN0KHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24sIHN0cnVjdCBmc2dfYnVmZmhkICpiaCkKK3sKKwlzdHJ1Y3QgZnNnX2x1bgkqY3VybHVuID0gY29tbW9uLT5jdXJsdW47CisKKwkvKiBXZSBkb24ndCBzdXBwb3J0IE1PREUgU0VMRUNUICovCisJaWYgKGN1cmx1bikKKwkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfSU5WQUxJRF9DT01NQU5EOworCXJldHVybiAtRUlOVkFMOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgaGFsdF9idWxrX2luX2VuZHBvaW50KHN0cnVjdCBmc2dfZGV2ICpmc2cpCit7CisJaW50CXJjOworCisJcmMgPSBmc2dfc2V0X2hhbHQoZnNnLCBmc2ctPmJ1bGtfaW4pOworCWlmIChyYyA9PSAtRUFHQUlOKQorCQlWREJHKGZzZywgImRlbGF5ZWQgYnVsay1pbiBlbmRwb2ludCBoYWx0XG4iKTsKKwl3aGlsZSAocmMgIT0gMCkgeworCQlpZiAocmMgIT0gLUVBR0FJTikgeworCQkJV0FSTklORyhmc2csICJ1c2JfZXBfc2V0X2hhbHQgLT4gJWRcbiIsIHJjKTsKKwkJCXJjID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogV2FpdCBmb3IgYSBzaG9ydCB0aW1lIGFuZCB0aGVuIHRyeSBhZ2FpbiAqLworCQlpZiAobXNsZWVwX2ludGVycnVwdGlibGUoMTAwKSAhPSAwKQorCQkJcmV0dXJuIC1FSU5UUjsKKwkJcmMgPSB1c2JfZXBfc2V0X2hhbHQoZnNnLT5idWxrX2luKTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHdlZGdlX2J1bGtfaW5fZW5kcG9pbnQoc3RydWN0IGZzZ19kZXYgKmZzZykKK3sKKwlpbnQJcmM7CisKKwlEQkcoZnNnLCAiYnVsay1pbiBzZXQgd2VkZ2VcbiIpOworCXJjID0gdXNiX2VwX3NldF93ZWRnZShmc2ctPmJ1bGtfaW4pOworCWlmIChyYyA9PSAtRUFHQUlOKQorCQlWREJHKGZzZywgImRlbGF5ZWQgYnVsay1pbiBlbmRwb2ludCB3ZWRnZVxuIik7CisJd2hpbGUgKHJjICE9IDApIHsKKwkJaWYgKHJjICE9IC1FQUdBSU4pIHsKKwkJCVdBUk5JTkcoZnNnLCAidXNiX2VwX3NldF93ZWRnZSAtPiAlZFxuIiwgcmMpOworCQkJcmMgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBXYWl0IGZvciBhIHNob3J0IHRpbWUgYW5kIHRoZW4gdHJ5IGFnYWluICovCisJCWlmIChtc2xlZXBfaW50ZXJydXB0aWJsZSgxMDApICE9IDApCisJCQlyZXR1cm4gLUVJTlRSOworCQlyYyA9IHVzYl9lcF9zZXRfd2VkZ2UoZnNnLT5idWxrX2luKTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHBhZF93aXRoX3plcm9zKHN0cnVjdCBmc2dfZGV2ICpmc2cpCit7CisJc3RydWN0IGZzZ19idWZmaGQJKmJoID0gZnNnLT5jb21tb24tPm5leHRfYnVmZmhkX3RvX2ZpbGw7CisJdTMyCQkJbmtlZXAgPSBiaC0+aW5yZXEtPmxlbmd0aDsKKwl1MzIJCQluc2VuZDsKKwlpbnQJCQlyYzsKKworCWJoLT5zdGF0ZSA9IEJVRl9TVEFURV9FTVBUWTsJCS8qIEZvciB0aGUgZmlyc3QgaXRlcmF0aW9uICovCisJZnNnLT5jb21tb24tPnVzYl9hbW91bnRfbGVmdCA9IG5rZWVwICsgZnNnLT5jb21tb24tPnJlc2lkdWU7CisJd2hpbGUgKGZzZy0+Y29tbW9uLT51c2JfYW1vdW50X2xlZnQgPiAwKSB7CisKKwkJLyogV2FpdCBmb3IgdGhlIG5leHQgYnVmZmVyIHRvIGJlIGZyZWUgKi8KKwkJd2hpbGUgKGJoLT5zdGF0ZSAhPSBCVUZfU1RBVEVfRU1QVFkpIHsKKwkJCXJjID0gc2xlZXBfdGhyZWFkKGZzZy0+Y29tbW9uKTsKKwkJCWlmIChyYykKKwkJCQlyZXR1cm4gcmM7CisJCX0KKworCQluc2VuZCA9IG1pbihmc2ctPmNvbW1vbi0+dXNiX2Ftb3VudF9sZWZ0LCBGU0dfQlVGTEVOKTsKKwkJbWVtc2V0KGJoLT5idWYgKyBua2VlcCwgMCwgbnNlbmQgLSBua2VlcCk7CisJCWJoLT5pbnJlcS0+bGVuZ3RoID0gbnNlbmQ7CisJCWJoLT5pbnJlcS0+emVybyA9IDA7CisJCXN0YXJ0X3RyYW5zZmVyKGZzZywgZnNnLT5idWxrX2luLCBiaC0+aW5yZXEsCisJCQkJJmJoLT5pbnJlcV9idXN5LCAmYmgtPnN0YXRlKTsKKwkJYmggPSBmc2ctPmNvbW1vbi0+bmV4dF9idWZmaGRfdG9fZmlsbCA9IGJoLT5uZXh0OworCQlmc2ctPmNvbW1vbi0+dXNiX2Ftb3VudF9sZWZ0IC09IG5zZW5kOworCQlua2VlcCA9IDA7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRocm93X2F3YXlfZGF0YShzdHJ1Y3QgZnNnX2NvbW1vbiAqY29tbW9uKQoreworCXN0cnVjdCBmc2dfYnVmZmhkCSpiaDsKKwl1MzIJCQlhbW91bnQ7CisJaW50CQkJcmM7CisKKwlmb3IgKGJoID0gY29tbW9uLT5uZXh0X2J1ZmZoZF90b19kcmFpbjsKKwkgICAgIGJoLT5zdGF0ZSAhPSBCVUZfU1RBVEVfRU1QVFkgfHwgY29tbW9uLT51c2JfYW1vdW50X2xlZnQgPiAwOworCSAgICAgYmggPSBjb21tb24tPm5leHRfYnVmZmhkX3RvX2RyYWluKSB7CisKKwkJLyogVGhyb3cgYXdheSB0aGUgZGF0YSBpbiBhIGZpbGxlZCBidWZmZXIgKi8KKwkJaWYgKGJoLT5zdGF0ZSA9PSBCVUZfU1RBVEVfRlVMTCkgeworCQkJc21wX3JtYigpOworCQkJYmgtPnN0YXRlID0gQlVGX1NUQVRFX0VNUFRZOworCQkJY29tbW9uLT5uZXh0X2J1ZmZoZF90b19kcmFpbiA9IGJoLT5uZXh0OworCisJCQkvKiBBIHNob3J0IHBhY2tldCBvciBhbiBlcnJvciBlbmRzIGV2ZXJ5dGhpbmcgKi8KKwkJCWlmIChiaC0+b3V0cmVxLT5hY3R1YWwgIT0gYmgtPm91dHJlcS0+bGVuZ3RoIHx8CisJCQkJCWJoLT5vdXRyZXEtPnN0YXR1cyAhPSAwKSB7CisJCQkJcmFpc2VfZXhjZXB0aW9uKGNvbW1vbiwKKwkJCQkJCUZTR19TVEFURV9BQk9SVF9CVUxLX09VVCk7CisJCQkJcmV0dXJuIC1FSU5UUjsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogVHJ5IHRvIHN1Ym1pdCBhbm90aGVyIHJlcXVlc3QgaWYgd2UgbmVlZCBvbmUgKi8KKwkJYmggPSBjb21tb24tPm5leHRfYnVmZmhkX3RvX2ZpbGw7CisJCWlmIChiaC0+c3RhdGUgPT0gQlVGX1NUQVRFX0VNUFRZCisJCSAmJiBjb21tb24tPnVzYl9hbW91bnRfbGVmdCA+IDApIHsKKwkJCWFtb3VudCA9IG1pbihjb21tb24tPnVzYl9hbW91bnRfbGVmdCwgRlNHX0JVRkxFTik7CisKKwkJCS8qIGFtb3VudCBpcyBhbHdheXMgZGl2aXNpYmxlIGJ5IDUxMiwgaGVuY2UgYnkKKwkJCSAqIHRoZSBidWxrLW91dCBtYXhwYWNrZXQgc2l6ZSAqLworCQkJYmgtPm91dHJlcS0+bGVuZ3RoID0gYW1vdW50OworCQkJYmgtPmJ1bGtfb3V0X2ludGVuZGVkX2xlbmd0aCA9IGFtb3VudDsKKwkJCWJoLT5vdXRyZXEtPnNob3J0X25vdF9vayA9IDE7CisJCQlTVEFSVF9UUkFOU0ZFUl9PUihjb21tb24sIGJ1bGtfb3V0LCBiaC0+b3V0cmVxLAorCQkJCQkgICZiaC0+b3V0cmVxX2J1c3ksICZiaC0+c3RhdGUpCisJCQkJLyogRG9uJ3Qga25vdyB3aGF0IHRvIGRvIGlmCisJCQkJICogY29tbW9uLT5mc2cgaXMgTlVMTCAqLworCQkJCXJldHVybiAtRUlPOworCQkJY29tbW9uLT5uZXh0X2J1ZmZoZF90b19maWxsID0gYmgtPm5leHQ7CisJCQljb21tb24tPnVzYl9hbW91bnRfbGVmdCAtPSBhbW91bnQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIE90aGVyd2lzZSB3YWl0IGZvciBzb21ldGhpbmcgdG8gaGFwcGVuICovCisJCXJjID0gc2xlZXBfdGhyZWFkKGNvbW1vbik7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBmaW5pc2hfcmVwbHkoc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbikKK3sKKwlzdHJ1Y3QgZnNnX2J1ZmZoZAkqYmggPSBjb21tb24tPm5leHRfYnVmZmhkX3RvX2ZpbGw7CisJaW50CQkJcmMgPSAwOworCisJc3dpdGNoIChjb21tb24tPmRhdGFfZGlyKSB7CisJY2FzZSBEQVRBX0RJUl9OT05FOgorCQlicmVhazsJCQkvKiBOb3RoaW5nIHRvIHNlbmQgKi8KKworCS8qIElmIHdlIGRvbid0IGtub3cgd2hldGhlciB0aGUgaG9zdCB3YW50cyB0byByZWFkIG9yIHdyaXRlLAorCSAqIHRoaXMgbXVzdCBiZSBDQiBvciBDQkkgd2l0aCBhbiB1bmtub3duIGNvbW1hbmQuICBXZSBtdXN0bid0CisJICogdHJ5IHRvIHNlbmQgb3IgcmVjZWl2ZSBhbnkgZGF0YS4gIFNvIHN0YWxsIGJvdGggYnVsayBwaXBlcworCSAqIGlmIHdlIGNhbiBhbmQgd2FpdCBmb3IgYSByZXNldC4gKi8KKwljYXNlIERBVEFfRElSX1VOS05PV046CisJCWlmICghY29tbW9uLT5jYW5fc3RhbGwpIHsKKwkJCS8qIE5vdGhpbmcgKi8KKwkJfSBlbHNlIGlmIChmc2dfaXNfc2V0KGNvbW1vbikpIHsKKwkJCWZzZ19zZXRfaGFsdChjb21tb24tPmZzZywgY29tbW9uLT5mc2ctPmJ1bGtfb3V0KTsKKwkJCXJjID0gaGFsdF9idWxrX2luX2VuZHBvaW50KGNvbW1vbi0+ZnNnKTsKKwkJfSBlbHNlIHsKKwkJCS8qIERvbid0IGtub3cgd2hhdCB0byBkbyBpZiBjb21tb24tPmZzZyBpcyBOVUxMICovCisJCQlyYyA9IC1FSU87CisJCX0KKwkJYnJlYWs7CisKKwkvKiBBbGwgYnV0IHRoZSBsYXN0IGJ1ZmZlciBvZiBkYXRhIG11c3QgaGF2ZSBhbHJlYWR5IGJlZW4gc2VudCAqLworCWNhc2UgREFUQV9ESVJfVE9fSE9TVDoKKwkJaWYgKGNvbW1vbi0+ZGF0YV9zaXplID09IDApIHsKKwkJCS8qIE5vdGhpbmcgdG8gc2VuZCAqLworCisJCS8qIElmIHRoZXJlJ3Mgbm8gcmVzaWR1ZSwgc2ltcGx5IHNlbmQgdGhlIGxhc3QgYnVmZmVyICovCisJCX0gZWxzZSBpZiAoY29tbW9uLT5yZXNpZHVlID09IDApIHsKKwkJCWJoLT5pbnJlcS0+emVybyA9IDA7CisJCQlTVEFSVF9UUkFOU0ZFUl9PUihjb21tb24sIGJ1bGtfaW4sIGJoLT5pbnJlcSwKKwkJCQkJICAmYmgtPmlucmVxX2J1c3ksICZiaC0+c3RhdGUpCisJCQkJcmV0dXJuIC1FSU87CisJCQljb21tb24tPm5leHRfYnVmZmhkX3RvX2ZpbGwgPSBiaC0+bmV4dDsKKworCQkvKiBGb3IgQnVsay1vbmx5LCBpZiB3ZSdyZSBhbGxvd2VkIHRvIHN0YWxsIHRoZW4gc2VuZCB0aGUKKwkJICogc2hvcnQgcGFja2V0IGFuZCBoYWx0IHRoZSBidWxrLWluIGVuZHBvaW50LiAgSWYgd2UgY2FuJ3QKKwkJICogc3RhbGwsIHBhZCBvdXQgdGhlIHJlbWFpbmluZyBkYXRhIHdpdGggMCdzLiAqLworCQl9IGVsc2UgaWYgKGNvbW1vbi0+Y2FuX3N0YWxsKSB7CisJCQliaC0+aW5yZXEtPnplcm8gPSAxOworCQkJU1RBUlRfVFJBTlNGRVJfT1IoY29tbW9uLCBidWxrX2luLCBiaC0+aW5yZXEsCisJCQkJCSAgJmJoLT5pbnJlcV9idXN5LCAmYmgtPnN0YXRlKQorCQkJCS8qIERvbid0IGtub3cgd2hhdCB0byBkbyBpZgorCQkJCSAqIGNvbW1vbi0+ZnNnIGlzIE5VTEwgKi8KKwkJCQlyYyA9IC1FSU87CisJCQljb21tb24tPm5leHRfYnVmZmhkX3RvX2ZpbGwgPSBiaC0+bmV4dDsKKwkJCWlmIChjb21tb24tPmZzZykKKwkJCQlyYyA9IGhhbHRfYnVsa19pbl9lbmRwb2ludChjb21tb24tPmZzZyk7CisJCX0gZWxzZSBpZiAoZnNnX2lzX3NldChjb21tb24pKSB7CisJCQlyYyA9IHBhZF93aXRoX3plcm9zKGNvbW1vbi0+ZnNnKTsKKwkJfSBlbHNlIHsKKwkJCS8qIERvbid0IGtub3cgd2hhdCB0byBkbyBpZiBjb21tb24tPmZzZyBpcyBOVUxMICovCisJCQlyYyA9IC1FSU87CisJCX0KKwkJYnJlYWs7CisKKwkvKiBXZSBoYXZlIHByb2Nlc3NlZCBhbGwgd2Ugd2FudCBmcm9tIHRoZSBkYXRhIHRoZSBob3N0IGhhcyBzZW50LgorCSAqIFRoZXJlIG1heSBzdGlsbCBiZSBvdXRzdGFuZGluZyBidWxrLW91dCByZXF1ZXN0cy4gKi8KKwljYXNlIERBVEFfRElSX0ZST01fSE9TVDoKKwkJaWYgKGNvbW1vbi0+cmVzaWR1ZSA9PSAwKSB7CisJCQkvKiBOb3RoaW5nIHRvIHJlY2VpdmUgKi8KKworCQkvKiBEaWQgdGhlIGhvc3Qgc3RvcCBzZW5kaW5nIHVuZXhwZWN0ZWRseSBlYXJseT8gKi8KKwkJfSBlbHNlIGlmIChjb21tb24tPnNob3J0X3BhY2tldF9yZWNlaXZlZCkgeworCQkJcmFpc2VfZXhjZXB0aW9uKGNvbW1vbiwgRlNHX1NUQVRFX0FCT1JUX0JVTEtfT1VUKTsKKwkJCXJjID0gLUVJTlRSOworCisJCS8qIFdlIGhhdmVuJ3QgcHJvY2Vzc2VkIGFsbCB0aGUgaW5jb21pbmcgZGF0YS4gIEV2ZW4gdGhvdWdoCisJCSAqIHdlIG1heSBiZSBhbGxvd2VkIHRvIHN0YWxsLCBkb2luZyBzbyB3b3VsZCBjYXVzZSBhIHJhY2UuCisJCSAqIFRoZSBjb250cm9sbGVyIG1heSBhbHJlYWR5IGhhdmUgQUNLJ2VkIGFsbCB0aGUgcmVtYWluaW5nCisJCSAqIGJ1bGstb3V0IHBhY2tldHMsIGluIHdoaWNoIGNhc2UgdGhlIGhvc3Qgd291bGRuJ3Qgc2VlIGEKKwkJICogU1RBTEwuICBOb3QgcmVhbGl6aW5nIHRoZSBlbmRwb2ludCB3YXMgaGFsdGVkLCBpdCB3b3VsZG4ndAorCQkgKiBjbGVhciB0aGUgaGFsdCAtLSBsZWFkaW5nIHRvIHByb2JsZW1zIGxhdGVyIG9uLiAqLworI2lmIDAKKwkJfSBlbHNlIGlmIChjb21tb24tPmNhbl9zdGFsbCkgeworCQkJaWYgKGZzZ19pc19zZXQoY29tbW9uKSkKKwkJCQlmc2dfc2V0X2hhbHQoY29tbW9uLT5mc2csCisJCQkJCSAgICAgY29tbW9uLT5mc2ctPmJ1bGtfb3V0KTsKKwkJCXJhaXNlX2V4Y2VwdGlvbihjb21tb24sIEZTR19TVEFURV9BQk9SVF9CVUxLX09VVCk7CisJCQlyYyA9IC1FSU5UUjsKKyNlbmRpZgorCisJCS8qIFdlIGNhbid0IHN0YWxsLiAgUmVhZCBpbiB0aGUgZXhjZXNzIGRhdGEgYW5kIHRocm93IGl0CisJCSAqIGFsbCBhd2F5LiAqLworCQl9IGVsc2UgeworCQkJcmMgPSB0aHJvd19hd2F5X2RhdGEoY29tbW9uKTsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBpbnQgc2VuZF9zdGF0dXMoc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbikKK3sKKwlzdHJ1Y3QgZnNnX2x1bgkJKmN1cmx1biA9IGNvbW1vbi0+Y3VybHVuOworCXN0cnVjdCBmc2dfYnVmZmhkCSpiaDsKKwlzdHJ1Y3QgYnVsa19jc193cmFwCSpjc3c7CisJaW50CQkJcmM7CisJdTgJCQlzdGF0dXMgPSBVU0JfU1RBVFVTX1BBU1M7CisJdTMyCQkJc2QsIHNkaW5mbyA9IDA7CisKKwkvKiBXYWl0IGZvciB0aGUgbmV4dCBidWZmZXIgdG8gYmVjb21lIGF2YWlsYWJsZSAqLworCWJoID0gY29tbW9uLT5uZXh0X2J1ZmZoZF90b19maWxsOworCXdoaWxlIChiaC0+c3RhdGUgIT0gQlVGX1NUQVRFX0VNUFRZKSB7CisJCXJjID0gc2xlZXBfdGhyZWFkKGNvbW1vbik7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwl9CisKKwlpZiAoY3VybHVuKSB7CisJCXNkID0gY3VybHVuLT5zZW5zZV9kYXRhOworCQlzZGluZm8gPSBjdXJsdW4tPnNlbnNlX2RhdGFfaW5mbzsKKwl9IGVsc2UgaWYgKGNvbW1vbi0+YmFkX2x1bl9va2F5KQorCQlzZCA9IFNTX05PX1NFTlNFOworCWVsc2UKKwkJc2QgPSBTU19MT0dJQ0FMX1VOSVRfTk9UX1NVUFBPUlRFRDsKKworCWlmIChjb21tb24tPnBoYXNlX2Vycm9yKSB7CisJCURCRyhjb21tb24sICJzZW5kaW5nIHBoYXNlLWVycm9yIHN0YXR1c1xuIik7CisJCXN0YXR1cyA9IFVTQl9TVEFUVVNfUEhBU0VfRVJST1I7CisJCXNkID0gU1NfSU5WQUxJRF9DT01NQU5EOworCX0gZWxzZSBpZiAoc2QgIT0gU1NfTk9fU0VOU0UpIHsKKwkJREJHKGNvbW1vbiwgInNlbmRpbmcgY29tbWFuZC1mYWlsdXJlIHN0YXR1c1xuIik7CisJCXN0YXR1cyA9IFVTQl9TVEFUVVNfRkFJTDsKKwkJVkRCRyhjb21tb24sICIgIHNlbnNlIGRhdGE6IFNLIHglMDJ4LCBBU0MgeCUwMngsIEFTQ1EgeCUwMng7IgorCQkJCSIgIGluZm8geCV4XG4iLAorCQkJCVNLKHNkKSwgQVNDKHNkKSwgQVNDUShzZCksIHNkaW5mbyk7CisJfQorCisJLyogU3RvcmUgYW5kIHNlbmQgdGhlIEJ1bGstb25seSBDU1cgKi8KKwljc3cgPSAodm9pZCAqKWJoLT5idWY7CisKKwljc3ctPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTQl9CVUxLX0NTX1NJRyk7CisJY3N3LT5UYWcgPSBjb21tb24tPnRhZzsKKwljc3ctPlJlc2lkdWUgPSBjcHVfdG9fbGUzMihjb21tb24tPnJlc2lkdWUpOworCWNzdy0+U3RhdHVzID0gc3RhdHVzOworCisJYmgtPmlucmVxLT5sZW5ndGggPSBVU0JfQlVMS19DU19XUkFQX0xFTjsKKwliaC0+aW5yZXEtPnplcm8gPSAwOworCVNUQVJUX1RSQU5TRkVSX09SKGNvbW1vbiwgYnVsa19pbiwgYmgtPmlucmVxLAorCQkJICAmYmgtPmlucmVxX2J1c3ksICZiaC0+c3RhdGUpCisJCS8qIERvbid0IGtub3cgd2hhdCB0byBkbyBpZiBjb21tb24tPmZzZyBpcyBOVUxMICovCisJCXJldHVybiAtRUlPOworCisJY29tbW9uLT5uZXh0X2J1ZmZoZF90b19maWxsID0gYmgtPm5leHQ7CisJcmV0dXJuIDA7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQ2hlY2sgd2hldGhlciB0aGUgY29tbWFuZCBpcyBwcm9wZXJseSBmb3JtZWQgYW5kIHdoZXRoZXIgaXRzIGRhdGEgc2l6ZQorICogYW5kIGRpcmVjdGlvbiBhZ3JlZSB3aXRoIHRoZSB2YWx1ZXMgd2UgYWxyZWFkeSBoYXZlLiAqLworc3RhdGljIGludCBjaGVja19jb21tYW5kKHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24sIGludCBjbW5kX3NpemUsCisJCWVudW0gZGF0YV9kaXJlY3Rpb24gZGF0YV9kaXIsIHVuc2lnbmVkIGludCBtYXNrLAorCQlpbnQgbmVlZHNfbWVkaXVtLCBjb25zdCBjaGFyICpuYW1lKQoreworCWludAkJCWk7CisJaW50CQkJbHVuID0gY29tbW9uLT5jbW5kWzFdID4+IDU7CisJc3RhdGljIGNvbnN0IGNoYXIJZGlybGV0dGVyWzRdID0geyd1JywgJ28nLCAnaScsICduJ307CisJY2hhcgkJCWhkbGVuWzIwXTsKKwlzdHJ1Y3QgZnNnX2x1bgkJKmN1cmx1bjsKKworCWhkbGVuWzBdID0gMDsKKwlpZiAoY29tbW9uLT5kYXRhX2RpciAhPSBEQVRBX0RJUl9VTktOT1dOKQorCQlzcHJpbnRmKGhkbGVuLCAiLCBIJWM9JXUiLCBkaXJsZXR0ZXJbKGludCkgY29tbW9uLT5kYXRhX2Rpcl0sCisJCQkJY29tbW9uLT5kYXRhX3NpemUpOworCVZEQkcoY29tbW9uLCAiU0NTSSBjb21tYW5kOiAlczsgIERjPSVkLCBEJWM9JXU7ICBIYz0lZCVzXG4iLAorCSAgICAgbmFtZSwgY21uZF9zaXplLCBkaXJsZXR0ZXJbKGludCkgZGF0YV9kaXJdLAorCSAgICAgY29tbW9uLT5kYXRhX3NpemVfZnJvbV9jbW5kLCBjb21tb24tPmNtbmRfc2l6ZSwgaGRsZW4pOworCisJLyogV2UgY2FuJ3QgcmVwbHkgYXQgYWxsIHVudGlsIHdlIGtub3cgdGhlIGNvcnJlY3QgZGF0YSBkaXJlY3Rpb24KKwkgKiBhbmQgc2l6ZS4gKi8KKwlpZiAoY29tbW9uLT5kYXRhX3NpemVfZnJvbV9jbW5kID09IDApCisJCWRhdGFfZGlyID0gREFUQV9ESVJfTk9ORTsKKwlpZiAoY29tbW9uLT5kYXRhX3NpemUgPCBjb21tb24tPmRhdGFfc2l6ZV9mcm9tX2NtbmQpIHsKKwkJLyogSG9zdCBkYXRhIHNpemUgPCBEZXZpY2UgZGF0YSBzaXplIGlzIGEgcGhhc2UgZXJyb3IuCisJCSAqIENhcnJ5IG91dCB0aGUgY29tbWFuZCwgYnV0IG9ubHkgdHJhbnNmZXIgYXMgbXVjaCBhcworCQkgKiB3ZSBhcmUgYWxsb3dlZC4gKi8KKwkJY29tbW9uLT5kYXRhX3NpemVfZnJvbV9jbW5kID0gY29tbW9uLT5kYXRhX3NpemU7CisJCWNvbW1vbi0+cGhhc2VfZXJyb3IgPSAxOworCX0KKwljb21tb24tPnJlc2lkdWUgPSBjb21tb24tPmRhdGFfc2l6ZTsKKwljb21tb24tPnVzYl9hbW91bnRfbGVmdCA9IGNvbW1vbi0+ZGF0YV9zaXplOworCisJLyogQ29uZmxpY3RpbmcgZGF0YSBkaXJlY3Rpb25zIGlzIGEgcGhhc2UgZXJyb3IgKi8KKwlpZiAoY29tbW9uLT5kYXRhX2RpciAhPSBkYXRhX2RpcgorCSAmJiBjb21tb24tPmRhdGFfc2l6ZV9mcm9tX2NtbmQgPiAwKSB7CisJCWNvbW1vbi0+cGhhc2VfZXJyb3IgPSAxOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBWZXJpZnkgdGhlIGxlbmd0aCBvZiB0aGUgY29tbWFuZCBpdHNlbGYgKi8KKwlpZiAoY21uZF9zaXplICE9IGNvbW1vbi0+Y21uZF9zaXplKSB7CisKKwkJLyogU3BlY2lhbCBjYXNlIHdvcmthcm91bmQ6IFRoZXJlIGFyZSBwbGVudHkgb2YgYnVnZ3kgU0NTSQorCQkgKiBpbXBsZW1lbnRhdGlvbnMuIE1hbnkgaGF2ZSBpc3N1ZXMgd2l0aCBjYnctPkxlbmd0aAorCQkgKiBmaWVsZCBwYXNzaW5nIGEgd3JvbmcgY29tbWFuZCBzaXplLiBGb3IgdGhvc2UgY2FzZXMgd2UKKwkJICogYWx3YXlzIHRyeSB0byB3b3JrIGFyb3VuZCB0aGUgcHJvYmxlbSBieSB1c2luZyB0aGUgbGVuZ3RoCisJCSAqIHNlbnQgYnkgdGhlIGhvc3Qgc2lkZSBwcm92aWRlZCBpdCBpcyBhdCBsZWFzdCBhcyBsYXJnZQorCQkgKiBhcyB0aGUgY29ycmVjdCBjb21tYW5kIGxlbmd0aC4KKwkJICogRXhhbXBsZXMgb2Ygc3VjaCBjYXNlcyB3b3VsZCBiZSBNUy1XaW5kb3dzLCB3aGljaCBpc3N1ZXMKKwkJICogUkVRVUVTVCBTRU5TRSB3aXRoIGNidy0+TGVuZ3RoID09IDEyIHdoZXJlIGl0IHNob3VsZAorCQkgKiBiZSA2LCBhbmQgeGJveDM2MCBpc3N1aW5nIElOUVVJUlksIFRFU1QgVU5JVCBSRUFEWSBhbmQKKwkJICogUkVRVUVTVCBTRU5TRSB3aXRoIGNidy0+TGVuZ3RoID09IDEwIHdoZXJlIGl0IHNob3VsZAorCQkgKiBiZSA2IGFzIHdlbGwuCisJCSAqLworCQlpZiAoY21uZF9zaXplIDw9IGNvbW1vbi0+Y21uZF9zaXplKSB7CisJCQlEQkcoY29tbW9uLCAiJXMgaXMgYnVnZ3khIEV4cGVjdGVkIGxlbmd0aCAlZCAiCisJCQkgICAgImJ1dCB3ZSBnb3QgJWRcbiIsIG5hbWUsCisJCQkgICAgY21uZF9zaXplLCBjb21tb24tPmNtbmRfc2l6ZSk7CisJCQljbW5kX3NpemUgPSBjb21tb24tPmNtbmRfc2l6ZTsKKwkJfSBlbHNlIHsKKwkJCWNvbW1vbi0+cGhhc2VfZXJyb3IgPSAxOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwkvKiBDaGVjayB0aGF0IHRoZSBMVU4gdmFsdWVzIGFyZSBjb25zaXN0ZW50ICovCisJaWYgKGNvbW1vbi0+bHVuICE9IGx1bikKKwkJREJHKGNvbW1vbiwgInVzaW5nIExVTiAlZCBmcm9tIENCVywgbm90IExVTiAlZCBmcm9tIENEQlxuIiwKKwkJICAgIGNvbW1vbi0+bHVuLCBsdW4pOworCisJLyogQ2hlY2sgdGhlIExVTiAqLworCWlmIChjb21tb24tPmx1biA+PSAwICYmIGNvbW1vbi0+bHVuIDwgY29tbW9uLT5ubHVucykgeworCQljdXJsdW4gPSAmY29tbW9uLT5sdW5zW2NvbW1vbi0+bHVuXTsKKwkJY29tbW9uLT5jdXJsdW4gPSBjdXJsdW47CisJCWlmIChjb21tb24tPmNtbmRbMF0gIT0gU0NfUkVRVUVTVF9TRU5TRSkgeworCQkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfTk9fU0VOU0U7CisJCQljdXJsdW4tPnNlbnNlX2RhdGFfaW5mbyA9IDA7CisJCQljdXJsdW4tPmluZm9fdmFsaWQgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJY29tbW9uLT5jdXJsdW4gPSBOVUxMOworCQljdXJsdW4gPSBOVUxMOworCQljb21tb24tPmJhZF9sdW5fb2theSA9IDA7CisKKwkJLyogSU5RVUlSWSBhbmQgUkVRVUVTVCBTRU5TRSBjb21tYW5kcyBhcmUgZXhwbGljaXRseSBhbGxvd2VkCisJCSAqIHRvIHVzZSB1bnN1cHBvcnRlZCBMVU5zOyBhbGwgb3RoZXJzIG1heSBub3QuICovCisJCWlmIChjb21tb24tPmNtbmRbMF0gIT0gU0NfSU5RVUlSWSAmJgorCQkgICAgY29tbW9uLT5jbW5kWzBdICE9IFNDX1JFUVVFU1RfU0VOU0UpIHsKKwkJCURCRyhjb21tb24sICJ1bnN1cHBvcnRlZCBMVU4gJWRcbiIsIGNvbW1vbi0+bHVuKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJLyogSWYgYSB1bml0IGF0dGVudGlvbiBjb25kaXRpb24gZXhpc3RzLCBvbmx5IElOUVVJUlkgYW5kCisJICogUkVRVUVTVCBTRU5TRSBjb21tYW5kcyBhcmUgYWxsb3dlZDsgYW55dGhpbmcgZWxzZSBtdXN0IGZhaWwuICovCisJaWYgKGN1cmx1biAmJiBjdXJsdW4tPnVuaXRfYXR0ZW50aW9uX2RhdGEgIT0gU1NfTk9fU0VOU0UgJiYKKwkJCWNvbW1vbi0+Y21uZFswXSAhPSBTQ19JTlFVSVJZICYmCisJCQljb21tb24tPmNtbmRbMF0gIT0gU0NfUkVRVUVTVF9TRU5TRSkgeworCQljdXJsdW4tPnNlbnNlX2RhdGEgPSBjdXJsdW4tPnVuaXRfYXR0ZW50aW9uX2RhdGE7CisJCWN1cmx1bi0+dW5pdF9hdHRlbnRpb25fZGF0YSA9IFNTX05PX1NFTlNFOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDaGVjayB0aGF0IG9ubHkgY29tbWFuZCBieXRlcyBsaXN0ZWQgaW4gdGhlIG1hc2sgYXJlIG5vbi16ZXJvICovCisJY29tbW9uLT5jbW5kWzFdICY9IDB4MWY7CQkJLyogTWFzayBhd2F5IHRoZSBMVU4gKi8KKwlmb3IgKGkgPSAxOyBpIDwgY21uZF9zaXplOyArK2kpIHsKKwkJaWYgKGNvbW1vbi0+Y21uZFtpXSAmJiAhKG1hc2sgJiAoMSA8PCBpKSkpIHsKKwkJCWlmIChjdXJsdW4pCisJCQkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfSU5WQUxJRF9GSUVMRF9JTl9DREI7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCS8qIElmIHRoZSBtZWRpdW0gaXNuJ3QgbW91bnRlZCBhbmQgdGhlIGNvbW1hbmQgbmVlZHMgdG8gYWNjZXNzCisJICogaXQsIHJldHVybiBhbiBlcnJvci4gKi8KKwlpZiAoY3VybHVuICYmICFmc2dfbHVuX2lzX29wZW4oY3VybHVuKSAmJiBuZWVkc19tZWRpdW0pIHsKKwkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfTUVESVVNX05PVF9QUkVTRU5UOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGRvX3Njc2lfY29tbWFuZChzdHJ1Y3QgZnNnX2NvbW1vbiAqY29tbW9uKQoreworCXN0cnVjdCBmc2dfYnVmZmhkCSpiaDsKKwlpbnQJCQlyYzsKKwlpbnQJCQlyZXBseSA9IC1FSU5WQUw7CisJaW50CQkJaTsKKwlzdGF0aWMgY2hhcgkJdW5rbm93blsxNl07CisKKwlkdW1wX2NkYihjb21tb24pOworCisJLyogV2FpdCBmb3IgdGhlIG5leHQgYnVmZmVyIHRvIGJlY29tZSBhdmFpbGFibGUgZm9yIGRhdGEgb3Igc3RhdHVzICovCisJYmggPSBjb21tb24tPm5leHRfYnVmZmhkX3RvX2ZpbGw7CisJY29tbW9uLT5uZXh0X2J1ZmZoZF90b19kcmFpbiA9IGJoOworCXdoaWxlIChiaC0+c3RhdGUgIT0gQlVGX1NUQVRFX0VNUFRZKSB7CisJCXJjID0gc2xlZXBfdGhyZWFkKGNvbW1vbik7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwl9CisJY29tbW9uLT5waGFzZV9lcnJvciA9IDA7CisJY29tbW9uLT5zaG9ydF9wYWNrZXRfcmVjZWl2ZWQgPSAwOworCisJZG93bl9yZWFkKCZjb21tb24tPmZpbGVzZW0pOwkvKiBXZSdyZSB1c2luZyB0aGUgYmFja2luZyBmaWxlICovCisJc3dpdGNoIChjb21tb24tPmNtbmRbMF0pIHsKKworCWNhc2UgU0NfSU5RVUlSWToKKwkJY29tbW9uLT5kYXRhX3NpemVfZnJvbV9jbW5kID0gY29tbW9uLT5jbW5kWzRdOworCQlyZXBseSA9IGNoZWNrX2NvbW1hbmQoY29tbW9uLCA2LCBEQVRBX0RJUl9UT19IT1NULAorCQkJCSAgICAgICgxPDw0KSwgMCwKKwkJCQkgICAgICAiSU5RVUlSWSIpOworCQlpZiAocmVwbHkgPT0gMCkKKwkJCXJlcGx5ID0gZG9faW5xdWlyeShjb21tb24sIGJoKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDX01PREVfU0VMRUNUXzY6CisJCWNvbW1vbi0+ZGF0YV9zaXplX2Zyb21fY21uZCA9IGNvbW1vbi0+Y21uZFs0XTsKKwkJcmVwbHkgPSBjaGVja19jb21tYW5kKGNvbW1vbiwgNiwgREFUQV9ESVJfRlJPTV9IT1NULAorCQkJCSAgICAgICgxPDwxKSB8ICgxPDw0KSwgMCwKKwkJCQkgICAgICAiTU9ERSBTRUxFQ1QoNikiKTsKKwkJaWYgKHJlcGx5ID09IDApCisJCQlyZXBseSA9IGRvX21vZGVfc2VsZWN0KGNvbW1vbiwgYmgpOworCQlicmVhazsKKworCWNhc2UgU0NfTU9ERV9TRUxFQ1RfMTA6CisJCWNvbW1vbi0+ZGF0YV9zaXplX2Zyb21fY21uZCA9CisJCQlnZXRfdW5hbGlnbmVkX2JlMTYoJmNvbW1vbi0+Y21uZFs3XSk7CisJCXJlcGx5ID0gY2hlY2tfY29tbWFuZChjb21tb24sIDEwLCBEQVRBX0RJUl9GUk9NX0hPU1QsCisJCQkJICAgICAgKDE8PDEpIHwgKDM8PDcpLCAwLAorCQkJCSAgICAgICJNT0RFIFNFTEVDVCgxMCkiKTsKKwkJaWYgKHJlcGx5ID09IDApCisJCQlyZXBseSA9IGRvX21vZGVfc2VsZWN0KGNvbW1vbiwgYmgpOworCQlicmVhazsKKworCWNhc2UgU0NfTU9ERV9TRU5TRV82OgorCQljb21tb24tPmRhdGFfc2l6ZV9mcm9tX2NtbmQgPSBjb21tb24tPmNtbmRbNF07CisJCXJlcGx5ID0gY2hlY2tfY29tbWFuZChjb21tb24sIDYsIERBVEFfRElSX1RPX0hPU1QsCisJCQkJICAgICAgKDE8PDEpIHwgKDE8PDIpIHwgKDE8PDQpLCAwLAorCQkJCSAgICAgICJNT0RFIFNFTlNFKDYpIik7CisJCWlmIChyZXBseSA9PSAwKQorCQkJcmVwbHkgPSBkb19tb2RlX3NlbnNlKGNvbW1vbiwgYmgpOworCQlicmVhazsKKworCWNhc2UgU0NfTU9ERV9TRU5TRV8xMDoKKwkJY29tbW9uLT5kYXRhX3NpemVfZnJvbV9jbW5kID0KKwkJCWdldF91bmFsaWduZWRfYmUxNigmY29tbW9uLT5jbW5kWzddKTsKKwkJcmVwbHkgPSBjaGVja19jb21tYW5kKGNvbW1vbiwgMTAsIERBVEFfRElSX1RPX0hPU1QsCisJCQkJICAgICAgKDE8PDEpIHwgKDE8PDIpIHwgKDM8PDcpLCAwLAorCQkJCSAgICAgICJNT0RFIFNFTlNFKDEwKSIpOworCQlpZiAocmVwbHkgPT0gMCkKKwkJCXJlcGx5ID0gZG9fbW9kZV9zZW5zZShjb21tb24sIGJoKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDX1BSRVZFTlRfQUxMT1dfTUVESVVNX1JFTU9WQUw6CisJCWNvbW1vbi0+ZGF0YV9zaXplX2Zyb21fY21uZCA9IDA7CisJCXJlcGx5ID0gY2hlY2tfY29tbWFuZChjb21tb24sIDYsIERBVEFfRElSX05PTkUsCisJCQkJICAgICAgKDE8PDQpLCAwLAorCQkJCSAgICAgICJQUkVWRU5ULUFMTE9XIE1FRElVTSBSRU1PVkFMIik7CisJCWlmIChyZXBseSA9PSAwKQorCQkJcmVwbHkgPSBkb19wcmV2ZW50X2FsbG93KGNvbW1vbik7CisJCWJyZWFrOworCisJY2FzZSBTQ19SRUFEXzY6CisJCWkgPSBjb21tb24tPmNtbmRbNF07CisJCWNvbW1vbi0+ZGF0YV9zaXplX2Zyb21fY21uZCA9IChpID09IDAgPyAyNTYgOiBpKSA8PCA5OworCQlyZXBseSA9IGNoZWNrX2NvbW1hbmQoY29tbW9uLCA2LCBEQVRBX0RJUl9UT19IT1NULAorCQkJCSAgICAgICg3PDwxKSB8ICgxPDw0KSwgMSwKKwkJCQkgICAgICAiUkVBRCg2KSIpOworCQlpZiAocmVwbHkgPT0gMCkKKwkJCXJlcGx5ID0gZG9fcmVhZChjb21tb24pOworCQlicmVhazsKKworCWNhc2UgU0NfUkVBRF8xMDoKKwkJY29tbW9uLT5kYXRhX3NpemVfZnJvbV9jbW5kID0KKwkJCQlnZXRfdW5hbGlnbmVkX2JlMTYoJmNvbW1vbi0+Y21uZFs3XSkgPDwgOTsKKwkJcmVwbHkgPSBjaGVja19jb21tYW5kKGNvbW1vbiwgMTAsIERBVEFfRElSX1RPX0hPU1QsCisJCQkJICAgICAgKDE8PDEpIHwgKDB4Zjw8MikgfCAoMzw8NyksIDEsCisJCQkJICAgICAgIlJFQUQoMTApIik7CisJCWlmIChyZXBseSA9PSAwKQorCQkJcmVwbHkgPSBkb19yZWFkKGNvbW1vbik7CisJCWJyZWFrOworCisJY2FzZSBTQ19SRUFEXzEyOgorCQljb21tb24tPmRhdGFfc2l6ZV9mcm9tX2NtbmQgPQorCQkJCWdldF91bmFsaWduZWRfYmUzMigmY29tbW9uLT5jbW5kWzZdKSA8PCA5OworCQlyZXBseSA9IGNoZWNrX2NvbW1hbmQoY29tbW9uLCAxMiwgREFUQV9ESVJfVE9fSE9TVCwKKwkJCQkgICAgICAoMTw8MSkgfCAoMHhmPDwyKSB8ICgweGY8PDYpLCAxLAorCQkJCSAgICAgICJSRUFEKDEyKSIpOworCQlpZiAocmVwbHkgPT0gMCkKKwkJCXJlcGx5ID0gZG9fcmVhZChjb21tb24pOworCQlicmVhazsKKworCWNhc2UgU0NfUkVBRF9DQVBBQ0lUWToKKwkJY29tbW9uLT5kYXRhX3NpemVfZnJvbV9jbW5kID0gODsKKwkJcmVwbHkgPSBjaGVja19jb21tYW5kKGNvbW1vbiwgMTAsIERBVEFfRElSX1RPX0hPU1QsCisJCQkJICAgICAgKDB4Zjw8MikgfCAoMTw8OCksIDEsCisJCQkJICAgICAgIlJFQUQgQ0FQQUNJVFkiKTsKKwkJaWYgKHJlcGx5ID09IDApCisJCQlyZXBseSA9IGRvX3JlYWRfY2FwYWNpdHkoY29tbW9uLCBiaCk7CisJCWJyZWFrOworCisJY2FzZSBTQ19SRUFEX0hFQURFUjoKKwkJaWYgKCFjb21tb24tPmN1cmx1biB8fCAhY29tbW9uLT5jdXJsdW4tPmNkcm9tKQorCQkJZ290byB1bmtub3duX2NtbmQ7CisJCWNvbW1vbi0+ZGF0YV9zaXplX2Zyb21fY21uZCA9CisJCQlnZXRfdW5hbGlnbmVkX2JlMTYoJmNvbW1vbi0+Y21uZFs3XSk7CisJCXJlcGx5ID0gY2hlY2tfY29tbWFuZChjb21tb24sIDEwLCBEQVRBX0RJUl9UT19IT1NULAorCQkJCSAgICAgICgzPDw3KSB8ICgweDFmPDwxKSwgMSwKKwkJCQkgICAgICAiUkVBRCBIRUFERVIiKTsKKwkJaWYgKHJlcGx5ID09IDApCisJCQlyZXBseSA9IGRvX3JlYWRfaGVhZGVyKGNvbW1vbiwgYmgpOworCQlicmVhazsKKworCWNhc2UgU0NfUkVBRF9UT0M6CisJCWlmICghY29tbW9uLT5jdXJsdW4gfHwgIWNvbW1vbi0+Y3VybHVuLT5jZHJvbSkKKwkJCWdvdG8gdW5rbm93bl9jbW5kOworCQljb21tb24tPmRhdGFfc2l6ZV9mcm9tX2NtbmQgPQorCQkJZ2V0X3VuYWxpZ25lZF9iZTE2KCZjb21tb24tPmNtbmRbN10pOworCQlyZXBseSA9IGNoZWNrX2NvbW1hbmQoY29tbW9uLCAxMCwgREFUQV9ESVJfVE9fSE9TVCwKKwkJCQkgICAgICAoNzw8NikgfCAoMTw8MSksIDEsCisJCQkJICAgICAgIlJFQUQgVE9DIik7CisJCWlmIChyZXBseSA9PSAwKQorCQkJcmVwbHkgPSBkb19yZWFkX3RvYyhjb21tb24sIGJoKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDX1JFQURfRk9STUFUX0NBUEFDSVRJRVM6CisJCWNvbW1vbi0+ZGF0YV9zaXplX2Zyb21fY21uZCA9CisJCQlnZXRfdW5hbGlnbmVkX2JlMTYoJmNvbW1vbi0+Y21uZFs3XSk7CisJCXJlcGx5ID0gY2hlY2tfY29tbWFuZChjb21tb24sIDEwLCBEQVRBX0RJUl9UT19IT1NULAorCQkJCSAgICAgICgzPDw3KSwgMSwKKwkJCQkgICAgICAiUkVBRCBGT1JNQVQgQ0FQQUNJVElFUyIpOworCQlpZiAocmVwbHkgPT0gMCkKKwkJCXJlcGx5ID0gZG9fcmVhZF9mb3JtYXRfY2FwYWNpdGllcyhjb21tb24sIGJoKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDX1JFUVVFU1RfU0VOU0U6CisJCWNvbW1vbi0+ZGF0YV9zaXplX2Zyb21fY21uZCA9IGNvbW1vbi0+Y21uZFs0XTsKKwkJcmVwbHkgPSBjaGVja19jb21tYW5kKGNvbW1vbiwgNiwgREFUQV9ESVJfVE9fSE9TVCwKKwkJCQkgICAgICAoMTw8NCksIDAsCisJCQkJICAgICAgIlJFUVVFU1QgU0VOU0UiKTsKKwkJaWYgKHJlcGx5ID09IDApCisJCQlyZXBseSA9IGRvX3JlcXVlc3Rfc2Vuc2UoY29tbW9uLCBiaCk7CisJCWJyZWFrOworCisJY2FzZSBTQ19TVEFSVF9TVE9QX1VOSVQ6CisJCWNvbW1vbi0+ZGF0YV9zaXplX2Zyb21fY21uZCA9IDA7CisJCXJlcGx5ID0gY2hlY2tfY29tbWFuZChjb21tb24sIDYsIERBVEFfRElSX05PTkUsCisJCQkJICAgICAgKDE8PDEpIHwgKDE8PDQpLCAwLAorCQkJCSAgICAgICJTVEFSVC1TVE9QIFVOSVQiKTsKKwkJaWYgKHJlcGx5ID09IDApCisJCQlyZXBseSA9IGRvX3N0YXJ0X3N0b3AoY29tbW9uKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDX1NZTkNIUk9OSVpFX0NBQ0hFOgorCQljb21tb24tPmRhdGFfc2l6ZV9mcm9tX2NtbmQgPSAwOworCQlyZXBseSA9IGNoZWNrX2NvbW1hbmQoY29tbW9uLCAxMCwgREFUQV9ESVJfTk9ORSwKKwkJCQkgICAgICAoMHhmPDwyKSB8ICgzPDw3KSwgMSwKKwkJCQkgICAgICAiU1lOQ0hST05JWkUgQ0FDSEUiKTsKKwkJaWYgKHJlcGx5ID09IDApCisJCQlyZXBseSA9IGRvX3N5bmNocm9uaXplX2NhY2hlKGNvbW1vbik7CisJCWJyZWFrOworCisJY2FzZSBTQ19URVNUX1VOSVRfUkVBRFk6CisJCWNvbW1vbi0+ZGF0YV9zaXplX2Zyb21fY21uZCA9IDA7CisJCXJlcGx5ID0gY2hlY2tfY29tbWFuZChjb21tb24sIDYsIERBVEFfRElSX05PTkUsCisJCQkJMCwgMSwKKwkJCQkiVEVTVCBVTklUIFJFQURZIik7CisJCWJyZWFrOworCisJLyogQWx0aG91Z2ggb3B0aW9uYWwsIHRoaXMgY29tbWFuZCBpcyB1c2VkIGJ5IE1TLVdpbmRvd3MuICBXZQorCSAqIHN1cHBvcnQgYSBtaW5pbWFsIHZlcnNpb246IEJ5dENoayBtdXN0IGJlIDAuICovCisJY2FzZSBTQ19WRVJJRlk6CisJCWNvbW1vbi0+ZGF0YV9zaXplX2Zyb21fY21uZCA9IDA7CisJCXJlcGx5ID0gY2hlY2tfY29tbWFuZChjb21tb24sIDEwLCBEQVRBX0RJUl9OT05FLAorCQkJCSAgICAgICgxPDwxKSB8ICgweGY8PDIpIHwgKDM8PDcpLCAxLAorCQkJCSAgICAgICJWRVJJRlkiKTsKKwkJaWYgKHJlcGx5ID09IDApCisJCQlyZXBseSA9IGRvX3ZlcmlmeShjb21tb24pOworCQlicmVhazsKKworCWNhc2UgU0NfV1JJVEVfNjoKKwkJaSA9IGNvbW1vbi0+Y21uZFs0XTsKKwkJY29tbW9uLT5kYXRhX3NpemVfZnJvbV9jbW5kID0gKGkgPT0gMCA/IDI1NiA6IGkpIDw8IDk7CisJCXJlcGx5ID0gY2hlY2tfY29tbWFuZChjb21tb24sIDYsIERBVEFfRElSX0ZST01fSE9TVCwKKwkJCQkgICAgICAoNzw8MSkgfCAoMTw8NCksIDEsCisJCQkJICAgICAgIldSSVRFKDYpIik7CisJCWlmIChyZXBseSA9PSAwKQorCQkJcmVwbHkgPSBkb193cml0ZShjb21tb24pOworCQlicmVhazsKKworCWNhc2UgU0NfV1JJVEVfMTA6CisJCWNvbW1vbi0+ZGF0YV9zaXplX2Zyb21fY21uZCA9CisJCQkJZ2V0X3VuYWxpZ25lZF9iZTE2KCZjb21tb24tPmNtbmRbN10pIDw8IDk7CisJCXJlcGx5ID0gY2hlY2tfY29tbWFuZChjb21tb24sIDEwLCBEQVRBX0RJUl9GUk9NX0hPU1QsCisJCQkJICAgICAgKDE8PDEpIHwgKDB4Zjw8MikgfCAoMzw8NyksIDEsCisJCQkJICAgICAgIldSSVRFKDEwKSIpOworCQlpZiAocmVwbHkgPT0gMCkKKwkJCXJlcGx5ID0gZG9fd3JpdGUoY29tbW9uKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDX1dSSVRFXzEyOgorCQljb21tb24tPmRhdGFfc2l6ZV9mcm9tX2NtbmQgPQorCQkJCWdldF91bmFsaWduZWRfYmUzMigmY29tbW9uLT5jbW5kWzZdKSA8PCA5OworCQlyZXBseSA9IGNoZWNrX2NvbW1hbmQoY29tbW9uLCAxMiwgREFUQV9ESVJfRlJPTV9IT1NULAorCQkJCSAgICAgICgxPDwxKSB8ICgweGY8PDIpIHwgKDB4Zjw8NiksIDEsCisJCQkJICAgICAgIldSSVRFKDEyKSIpOworCQlpZiAocmVwbHkgPT0gMCkKKwkJCXJlcGx5ID0gZG9fd3JpdGUoY29tbW9uKTsKKwkJYnJlYWs7CisKKwkvKiBTb21lIG1hbmRhdG9yeSBjb21tYW5kcyB0aGF0IHdlIHJlY29nbml6ZSBidXQgZG9uJ3QgaW1wbGVtZW50LgorCSAqIFRoZXkgZG9uJ3QgbWVhbiBtdWNoIGluIHRoaXMgc2V0dGluZy4gIEl0J3MgbGVmdCBhcyBhbiBleGVyY2lzZQorCSAqIGZvciBhbnlvbmUgaW50ZXJlc3RlZCB0byBpbXBsZW1lbnQgUkVTRVJWRSBhbmQgUkVMRUFTRSBpbiB0ZXJtcworCSAqIG9mIFBvc2l4IGxvY2tzLiAqLworCWNhc2UgU0NfRk9STUFUX1VOSVQ6CisJY2FzZSBTQ19SRUxFQVNFOgorCWNhc2UgU0NfUkVTRVJWRToKKwljYXNlIFNDX1NFTkRfRElBR05PU1RJQzoKKwkJLyogRmFsbCB0aHJvdWdoICovCisKKwlkZWZhdWx0OgordW5rbm93bl9jbW5kOgorCQljb21tb24tPmRhdGFfc2l6ZV9mcm9tX2NtbmQgPSAwOworCQlzcHJpbnRmKHVua25vd24sICJVbmtub3duIHglMDJ4IiwgY29tbW9uLT5jbW5kWzBdKTsKKwkJcmVwbHkgPSBjaGVja19jb21tYW5kKGNvbW1vbiwgY29tbW9uLT5jbW5kX3NpemUsCisJCQkJICAgICAgREFUQV9ESVJfVU5LTk9XTiwgMHhmZiwgMCwgdW5rbm93bik7CisJCWlmIChyZXBseSA9PSAwKSB7CisJCQljb21tb24tPmN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX0lOVkFMSURfQ09NTUFORDsKKwkJCXJlcGx5ID0gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwl9CisJdXBfcmVhZCgmY29tbW9uLT5maWxlc2VtKTsKKworCWlmIChyZXBseSA9PSAtRUlOVFIgfHwgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCXJldHVybiAtRUlOVFI7CisKKwkvKiBTZXQgdXAgdGhlIHNpbmdsZSByZXBseSBidWZmZXIgZm9yIGZpbmlzaF9yZXBseSgpICovCisJaWYgKHJlcGx5ID09IC1FSU5WQUwpCisJCXJlcGx5ID0gMDsJCS8qIEVycm9yIHJlcGx5IGxlbmd0aCAqLworCWlmIChyZXBseSA+PSAwICYmIGNvbW1vbi0+ZGF0YV9kaXIgPT0gREFUQV9ESVJfVE9fSE9TVCkgeworCQlyZXBseSA9IG1pbigodTMyKSByZXBseSwgY29tbW9uLT5kYXRhX3NpemVfZnJvbV9jbW5kKTsKKwkJYmgtPmlucmVxLT5sZW5ndGggPSByZXBseTsKKwkJYmgtPnN0YXRlID0gQlVGX1NUQVRFX0ZVTEw7CisJCWNvbW1vbi0+cmVzaWR1ZSAtPSByZXBseTsKKwl9CQkJCS8qIE90aGVyd2lzZSBpdCdzIGFscmVhZHkgc2V0ICovCisKKwlyZXR1cm4gMDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IHJlY2VpdmVkX2NidyhzdHJ1Y3QgZnNnX2RldiAqZnNnLCBzdHJ1Y3QgZnNnX2J1ZmZoZCAqYmgpCit7CisJc3RydWN0IHVzYl9yZXF1ZXN0CSpyZXEgPSBiaC0+b3V0cmVxOworCXN0cnVjdCBmc2dfYnVsa19jYl93cmFwCSpjYncgPSByZXEtPmJ1ZjsKKwlzdHJ1Y3QgZnNnX2NvbW1vbgkqY29tbW9uID0gZnNnLT5jb21tb247CisKKwkvKiBXYXMgdGhpcyBhIHJlYWwgcGFja2V0PyAgU2hvdWxkIGl0IGJlIGlnbm9yZWQ/ICovCisJaWYgKHJlcS0+c3RhdHVzIHx8IHRlc3RfYml0KElHTk9SRV9CVUxLX09VVCwgJmZzZy0+YXRvbWljX2JpdGZsYWdzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBJcyB0aGUgQ0JXIHZhbGlkPyAqLworCWlmIChyZXEtPmFjdHVhbCAhPSBVU0JfQlVMS19DQl9XUkFQX0xFTiB8fAorCQkJY2J3LT5TaWduYXR1cmUgIT0gY3B1X3RvX2xlMzIoCisJCQkJVVNCX0JVTEtfQ0JfU0lHKSkgeworCQlEQkcoZnNnLCAiaW52YWxpZCBDQlc6IGxlbiAldSBzaWcgMHgleFxuIiwKKwkJCQlyZXEtPmFjdHVhbCwKKwkJCQlsZTMyX3RvX2NwdShjYnctPlNpZ25hdHVyZSkpOworCisJCS8qIFRoZSBCdWxrLW9ubHkgc3BlYyBzYXlzIHdlIE1VU1Qgc3RhbGwgdGhlIElOIGVuZHBvaW50CisJCSAqICg2LjYuMSksIHNvIGl0J3MgdW5hdm9pZGFibGUuICBJdCBhbHNvIHNheXMgd2UgbXVzdAorCQkgKiByZXRhaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGUgbmV4dCByZXNldCwgYnV0IHRoZXJlJ3MKKwkJICogbm8gd2F5IHRvIHRlbGwgdGhlIGNvbnRyb2xsZXIgZHJpdmVyIGl0IHNob3VsZCBpZ25vcmUKKwkJICogQ2xlYXItRmVhdHVyZShIQUxUKSByZXF1ZXN0cy4KKwkJICoKKwkJICogV2UgYXJlbid0IHJlcXVpcmVkIHRvIGhhbHQgdGhlIE9VVCBlbmRwb2ludDsgaW5zdGVhZAorCQkgKiB3ZSBjYW4gc2ltcGx5IGFjY2VwdCBhbmQgZGlzY2FyZCBhbnkgZGF0YSByZWNlaXZlZAorCQkgKiB1bnRpbCB0aGUgbmV4dCByZXNldC4gKi8KKwkJd2VkZ2VfYnVsa19pbl9lbmRwb2ludChmc2cpOworCQlzZXRfYml0KElHTk9SRV9CVUxLX09VVCwgJmZzZy0+YXRvbWljX2JpdGZsYWdzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogSXMgdGhlIENCVyBtZWFuaW5nZnVsPyAqLworCWlmIChjYnctPkx1biA+PSBGU0dfTUFYX0xVTlMgfHwgY2J3LT5GbGFncyAmIH5VU0JfQlVMS19JTl9GTEFHIHx8CisJCQljYnctPkxlbmd0aCA8PSAwIHx8IGNidy0+TGVuZ3RoID4gTUFYX0NPTU1BTkRfU0laRSkgeworCQlEQkcoZnNnLCAibm9uLW1lYW5pbmdmdWwgQ0JXOiBsdW4gPSAldSwgZmxhZ3MgPSAweCV4LCAiCisJCQkJImNtZGxlbiAldVxuIiwKKwkJCQljYnctPkx1biwgY2J3LT5GbGFncywgY2J3LT5MZW5ndGgpOworCisJCS8qIFdlIGNhbiBkbyBhbnl0aGluZyB3ZSB3YW50IGhlcmUsIHNvIGxldCdzIHN0YWxsIHRoZQorCQkgKiBidWxrIHBpcGVzIGlmIHdlIGFyZSBhbGxvd2VkIHRvLiAqLworCQlpZiAoY29tbW9uLT5jYW5fc3RhbGwpIHsKKwkJCWZzZ19zZXRfaGFsdChmc2csIGZzZy0+YnVsa19vdXQpOworCQkJaGFsdF9idWxrX2luX2VuZHBvaW50KGZzZyk7CisJCX0KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogU2F2ZSB0aGUgY29tbWFuZCBmb3IgbGF0ZXIgKi8KKwljb21tb24tPmNtbmRfc2l6ZSA9IGNidy0+TGVuZ3RoOworCW1lbWNweShjb21tb24tPmNtbmQsIGNidy0+Q0RCLCBjb21tb24tPmNtbmRfc2l6ZSk7CisJaWYgKGNidy0+RmxhZ3MgJiBVU0JfQlVMS19JTl9GTEFHKQorCQljb21tb24tPmRhdGFfZGlyID0gREFUQV9ESVJfVE9fSE9TVDsKKwllbHNlCisJCWNvbW1vbi0+ZGF0YV9kaXIgPSBEQVRBX0RJUl9GUk9NX0hPU1Q7CisJY29tbW9uLT5kYXRhX3NpemUgPSBsZTMyX3RvX2NwdShjYnctPkRhdGFUcmFuc2Zlckxlbmd0aCk7CisJaWYgKGNvbW1vbi0+ZGF0YV9zaXplID09IDApCisJCWNvbW1vbi0+ZGF0YV9kaXIgPSBEQVRBX0RJUl9OT05FOworCWNvbW1vbi0+bHVuID0gY2J3LT5MdW47CisJY29tbW9uLT50YWcgPSBjYnctPlRhZzsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGdldF9uZXh0X2NvbW1hbmQoc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbikKK3sKKwlzdHJ1Y3QgZnNnX2J1ZmZoZAkqYmg7CisJaW50CQkJcmMgPSAwOworCisJLyogV2FpdCBmb3IgdGhlIG5leHQgYnVmZmVyIHRvIGJlY29tZSBhdmFpbGFibGUgKi8KKwliaCA9IGNvbW1vbi0+bmV4dF9idWZmaGRfdG9fZmlsbDsKKwl3aGlsZSAoYmgtPnN0YXRlICE9IEJVRl9TVEFURV9FTVBUWSkgeworCQlyYyA9IHNsZWVwX3RocmVhZChjb21tb24pOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJfQorCisJLyogUXVldWUgYSByZXF1ZXN0IHRvIHJlYWQgYSBCdWxrLW9ubHkgQ0JXICovCisJc2V0X2J1bGtfb3V0X3JlcV9sZW5ndGgoY29tbW9uLCBiaCwgVVNCX0JVTEtfQ0JfV1JBUF9MRU4pOworCWJoLT5vdXRyZXEtPnNob3J0X25vdF9vayA9IDE7CisJU1RBUlRfVFJBTlNGRVJfT1IoY29tbW9uLCBidWxrX291dCwgYmgtPm91dHJlcSwKKwkJCSAgJmJoLT5vdXRyZXFfYnVzeSwgJmJoLT5zdGF0ZSkKKwkJLyogRG9uJ3Qga25vdyB3aGF0IHRvIGRvIGlmIGNvbW1vbi0+ZnNnIGlzIE5VTEwgKi8KKwkJcmV0dXJuIC1FSU87CisKKwkvKiBXZSB3aWxsIGRyYWluIHRoZSBidWZmZXIgaW4gc29mdHdhcmUsIHdoaWNoIG1lYW5zIHdlCisJICogY2FuIHJldXNlIGl0IGZvciB0aGUgbmV4dCBmaWxsaW5nLiAgTm8gbmVlZCB0byBhZHZhbmNlCisJICogbmV4dF9idWZmaGRfdG9fZmlsbC4gKi8KKworCS8qIFdhaXQgZm9yIHRoZSBDQlcgdG8gYXJyaXZlICovCisJd2hpbGUgKGJoLT5zdGF0ZSAhPSBCVUZfU1RBVEVfRlVMTCkgeworCQlyYyA9IHNsZWVwX3RocmVhZChjb21tb24pOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJfQorCXNtcF9ybWIoKTsKKwlyYyA9IGZzZ19pc19zZXQoY29tbW9uKSA/IHJlY2VpdmVkX2Nidyhjb21tb24tPmZzZywgYmgpIDogLUVJTzsKKwliaC0+c3RhdGUgPSBCVUZfU1RBVEVfRU1QVFk7CisKKwlyZXR1cm4gcmM7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBlbmFibGVfZW5kcG9pbnQoc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbiwgc3RydWN0IHVzYl9lcCAqZXAsCisJCWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZCkKK3sKKwlpbnQJcmM7CisKKwllcC0+ZHJpdmVyX2RhdGEgPSBjb21tb247CisJcmMgPSB1c2JfZXBfZW5hYmxlKGVwLCBkKTsKKwlpZiAocmMpCisJCUVSUk9SKGNvbW1vbiwgImNhbid0IGVuYWJsZSAlcywgcmVzdWx0ICVkXG4iLCBlcC0+bmFtZSwgcmMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBhbGxvY19yZXF1ZXN0KHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24sIHN0cnVjdCB1c2JfZXAgKmVwLAorCQlzdHJ1Y3QgdXNiX3JlcXVlc3QgKipwcmVxKQoreworCSpwcmVxID0gdXNiX2VwX2FsbG9jX3JlcXVlc3QoZXAsIEdGUF9BVE9NSUMpOworCWlmICgqcHJlcSkKKwkJcmV0dXJuIDA7CisJRVJST1IoY29tbW9uLCAiY2FuJ3QgYWxsb2NhdGUgcmVxdWVzdCBmb3IgJXNcbiIsIGVwLT5uYW1lKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyoKKyAqIFJlc2V0IGludGVyZmFjZSBzZXR0aW5nIGFuZCByZS1pbml0IGVuZHBvaW50IHN0YXRlICh0b2dnbGUgZXRjKS4KKyAqIENhbGwgd2l0aCBhbHRzZXR0aW5nIDwgMCB0byBkaXNhYmxlIHRoZSBpbnRlcmZhY2UuICBUaGUgb25seSBvdGhlcgorICogYXZhaWxhYmxlIGFsdHNldHRpbmcgaXMgMCwgd2hpY2ggZW5hYmxlcyB0aGUgaW50ZXJmYWNlLgorICovCitzdGF0aWMgaW50IGRvX3NldF9pbnRlcmZhY2Uoc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbiwgaW50IGFsdHNldHRpbmcpCit7CisJaW50CXJjID0gMDsKKwlpbnQJaTsKKwljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKmQ7CisKKwlpZiAoY29tbW9uLT5ydW5uaW5nKQorCQlEQkcoY29tbW9uLCAicmVzZXQgaW50ZXJmYWNlXG4iKTsKKworcmVzZXQ6CisJLyogRGVhbGxvY2F0ZSB0aGUgcmVxdWVzdHMgKi8KKwlpZiAoY29tbW9uLT5wcmV2X2ZzZykgeworCQlzdHJ1Y3QgZnNnX2RldiAqZnNnID0gY29tbW9uLT5wcmV2X2ZzZzsKKworCQlmb3IgKGkgPSAwOyBpIDwgRlNHX05VTV9CVUZGRVJTOyArK2kpIHsKKwkJCXN0cnVjdCBmc2dfYnVmZmhkICpiaCA9ICZjb21tb24tPmJ1ZmZoZHNbaV07CisKKwkJCWlmIChiaC0+aW5yZXEpIHsKKwkJCQl1c2JfZXBfZnJlZV9yZXF1ZXN0KGZzZy0+YnVsa19pbiwgYmgtPmlucmVxKTsKKwkJCQliaC0+aW5yZXEgPSBOVUxMOworCQkJfQorCQkJaWYgKGJoLT5vdXRyZXEpIHsKKwkJCQl1c2JfZXBfZnJlZV9yZXF1ZXN0KGZzZy0+YnVsa19vdXQsIGJoLT5vdXRyZXEpOworCQkJCWJoLT5vdXRyZXEgPSBOVUxMOworCQkJfQorCQl9CisKKwkJLyogRGlzYWJsZSB0aGUgZW5kcG9pbnRzICovCisJCWlmIChmc2ctPmJ1bGtfaW5fZW5hYmxlZCkgeworCQkJdXNiX2VwX2Rpc2FibGUoZnNnLT5idWxrX2luKTsKKwkJCWZzZy0+YnVsa19pbl9lbmFibGVkID0gMDsKKwkJfQorCQlpZiAoZnNnLT5idWxrX291dF9lbmFibGVkKSB7CisJCQl1c2JfZXBfZGlzYWJsZShmc2ctPmJ1bGtfb3V0KTsKKwkJCWZzZy0+YnVsa19vdXRfZW5hYmxlZCA9IDA7CisJCX0KKworCQljb21tb24tPnByZXZfZnNnID0gMDsKKwl9CisKKwljb21tb24tPnJ1bm5pbmcgPSAwOworCWlmIChhbHRzZXR0aW5nIDwgMCB8fCByYyAhPSAwKQorCQlyZXR1cm4gcmM7CisKKwlEQkcoY29tbW9uLCAic2V0IGludGVyZmFjZSAlZFxuIiwgYWx0c2V0dGluZyk7CisKKwlpZiAoZnNnX2lzX3NldChjb21tb24pKSB7CisJCXN0cnVjdCBmc2dfZGV2ICpmc2cgPSBjb21tb24tPmZzZzsKKwkJY29tbW9uLT5wcmV2X2ZzZyA9IGNvbW1vbi0+ZnNnOworCisJCS8qIEVuYWJsZSB0aGUgZW5kcG9pbnRzICovCisJCWQgPSBmc2dfZXBfZGVzYyhjb21tb24tPmdhZGdldCwKKwkJCQkmZnNnX2ZzX2J1bGtfaW5fZGVzYywgJmZzZ19oc19idWxrX2luX2Rlc2MpOworCQlyYyA9IGVuYWJsZV9lbmRwb2ludChjb21tb24sIGZzZy0+YnVsa19pbiwgZCk7CisJCWlmIChyYykKKwkJCWdvdG8gcmVzZXQ7CisJCWZzZy0+YnVsa19pbl9lbmFibGVkID0gMTsKKworCQlkID0gZnNnX2VwX2Rlc2MoY29tbW9uLT5nYWRnZXQsCisJCQkJJmZzZ19mc19idWxrX291dF9kZXNjLCAmZnNnX2hzX2J1bGtfb3V0X2Rlc2MpOworCQlyYyA9IGVuYWJsZV9lbmRwb2ludChjb21tb24sIGZzZy0+YnVsa19vdXQsIGQpOworCQlpZiAocmMpCisJCQlnb3RvIHJlc2V0OworCQlmc2ctPmJ1bGtfb3V0X2VuYWJsZWQgPSAxOworCQljb21tb24tPmJ1bGtfb3V0X21heHBhY2tldCA9IGxlMTZfdG9fY3B1KGQtPndNYXhQYWNrZXRTaXplKTsKKwkJY2xlYXJfYml0KElHTk9SRV9CVUxLX09VVCwgJmZzZy0+YXRvbWljX2JpdGZsYWdzKTsKKworCQkvKiBBbGxvY2F0ZSB0aGUgcmVxdWVzdHMgKi8KKwkJZm9yIChpID0gMDsgaSA8IEZTR19OVU1fQlVGRkVSUzsgKytpKSB7CisJCQlzdHJ1Y3QgZnNnX2J1ZmZoZAkqYmggPSAmY29tbW9uLT5idWZmaGRzW2ldOworCisJCQlyYyA9IGFsbG9jX3JlcXVlc3QoY29tbW9uLCBmc2ctPmJ1bGtfaW4sICZiaC0+aW5yZXEpOworCQkJaWYgKHJjKQorCQkJCWdvdG8gcmVzZXQ7CisJCQlyYyA9IGFsbG9jX3JlcXVlc3QoY29tbW9uLCBmc2ctPmJ1bGtfb3V0LCAmYmgtPm91dHJlcSk7CisJCQlpZiAocmMpCisJCQkJZ290byByZXNldDsKKwkJCWJoLT5pbnJlcS0+YnVmID0gYmgtPm91dHJlcS0+YnVmID0gYmgtPmJ1ZjsKKwkJCWJoLT5pbnJlcS0+Y29udGV4dCA9IGJoLT5vdXRyZXEtPmNvbnRleHQgPSBiaDsKKwkJCWJoLT5pbnJlcS0+Y29tcGxldGUgPSBidWxrX2luX2NvbXBsZXRlOworCQkJYmgtPm91dHJlcS0+Y29tcGxldGUgPSBidWxrX291dF9jb21wbGV0ZTsKKwkJfQorCisJCWNvbW1vbi0+cnVubmluZyA9IDE7CisJCWZvciAoaSA9IDA7IGkgPCBjb21tb24tPm5sdW5zOyArK2kpCisJCQljb21tb24tPmx1bnNbaV0udW5pdF9hdHRlbnRpb25fZGF0YSA9IFNTX1JFU0VUX09DQ1VSUkVEOworCQlyZXR1cm4gcmM7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU87CisJfQorfQorCisKKy8qCisgKiBDaGFuZ2Ugb3VyIG9wZXJhdGlvbmFsIGNvbmZpZ3VyYXRpb24uICBUaGlzIGNvZGUgbXVzdCBhZ3JlZSB3aXRoIHRoZSBjb2RlCisgKiB0aGF0IHJldHVybnMgY29uZmlnIGRlc2NyaXB0b3JzLCBhbmQgd2l0aCBpbnRlcmZhY2UgYWx0c2V0dGluZyBjb2RlLgorICoKKyAqIEl0J3MgYWxzbyByZXNwb25zaWJsZSBmb3IgcG93ZXIgbWFuYWdlbWVudCBpbnRlcmFjdGlvbnMuICBTb21lCisgKiBjb25maWd1cmF0aW9ucyBtaWdodCBub3Qgd29yayB3aXRoIG91ciBjdXJyZW50IHBvd2VyIHNvdXJjZXMuCisgKiBGb3Igbm93IHdlIGp1c3QgYXNzdW1lIHRoZSBnYWRnZXQgaXMgYWx3YXlzIHNlbGYtcG93ZXJlZC4KKyAqLworc3RhdGljIGludCBkb19zZXRfY29uZmlnKHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24sIHU4IG5ld19jb25maWcpCit7CisJaW50CXJjID0gMDsKKworCS8qIERpc2FibGUgdGhlIHNpbmdsZSBpbnRlcmZhY2UgKi8KKwlpZiAoY29tbW9uLT5jb25maWcgIT0gMCkgeworCQlEQkcoY29tbW9uLCAicmVzZXQgY29uZmlnXG4iKTsKKwkJY29tbW9uLT5jb25maWcgPSAwOworCQlyYyA9IGRvX3NldF9pbnRlcmZhY2UoY29tbW9uLCAtMSk7CisJfQorCisJLyogRW5hYmxlIHRoZSBpbnRlcmZhY2UgKi8KKwlpZiAobmV3X2NvbmZpZyAhPSAwKSB7CisJCWNvbW1vbi0+Y29uZmlnID0gbmV3X2NvbmZpZzsKKwkJcmMgPSBkb19zZXRfaW50ZXJmYWNlKGNvbW1vbiwgMCk7CisJCWlmIChyYyAhPSAwKQorCQkJY29tbW9uLT5jb25maWcgPSAwOwkvKiBSZXNldCBvbiBlcnJvcnMgKi8KKwl9CisJcmV0dXJuIHJjOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUxUIENPTkZJR1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyBpbnQgZnNnX3NldF9hbHQoc3RydWN0IHVzYl9mdW5jdGlvbiAqZiwgdW5zaWduZWQgaW50ZiwgdW5zaWduZWQgYWx0KQoreworCXN0cnVjdCBmc2dfZGV2ICpmc2cgPSBmc2dfZnJvbV9mdW5jKGYpOworCWZzZy0+Y29tbW9uLT5wcmV2X2ZzZyA9IGZzZy0+Y29tbW9uLT5mc2c7CisJZnNnLT5jb21tb24tPmZzZyA9IGZzZzsKKwlmc2ctPmNvbW1vbi0+bmV3X2NvbmZpZyA9IDE7CisJcmFpc2VfZXhjZXB0aW9uKGZzZy0+Y29tbW9uLCBGU0dfU1RBVEVfQ09ORklHX0NIQU5HRSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZzZ19kaXNhYmxlKHN0cnVjdCB1c2JfZnVuY3Rpb24gKmYpCit7CisJc3RydWN0IGZzZ19kZXYgKmZzZyA9IGZzZ19mcm9tX2Z1bmMoZik7CisJZnNnLT5jb21tb24tPnByZXZfZnNnID0gZnNnLT5jb21tb24tPmZzZzsKKwlmc2ctPmNvbW1vbi0+ZnNnID0gZnNnOworCWZzZy0+Y29tbW9uLT5uZXdfY29uZmlnID0gMDsKKwlyYWlzZV9leGNlcHRpb24oZnNnLT5jb21tb24sIEZTR19TVEFURV9DT05GSUdfQ0hBTkdFKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBoYW5kbGVfZXhjZXB0aW9uKHN0cnVjdCBmc2dfY29tbW9uICpjb21tb24pCit7CisJc2lnaW5mb190CQlpbmZvOworCWludAkJCXNpZzsKKwlpbnQJCQlpOworCXN0cnVjdCBmc2dfYnVmZmhkCSpiaDsKKwllbnVtIGZzZ19zdGF0ZQkJb2xkX3N0YXRlOworCXU4CQkJbmV3X2NvbmZpZzsKKwlzdHJ1Y3QgZnNnX2x1bgkJKmN1cmx1bjsKKwl1bnNpZ25lZCBpbnQJCWV4Y2VwdGlvbl9yZXFfdGFnOworCWludAkJCXJjOworCisJLyogQ2xlYXIgdGhlIGV4aXN0aW5nIHNpZ25hbHMuICBBbnl0aGluZyBidXQgU0lHVVNSMSBpcyBjb252ZXJ0ZWQKKwkgKiBpbnRvIGEgaGlnaC1wcmlvcml0eSBFWElUIGV4Y2VwdGlvbi4gKi8KKwlmb3IgKDs7KSB7CisJCXNpZyA9IGRlcXVldWVfc2lnbmFsX2xvY2soY3VycmVudCwgJmN1cnJlbnQtPmJsb2NrZWQsICZpbmZvKTsKKwkJaWYgKCFzaWcpCisJCQlicmVhazsKKwkJaWYgKHNpZyAhPSBTSUdVU1IxKSB7CisJCQlpZiAoY29tbW9uLT5zdGF0ZSA8IEZTR19TVEFURV9FWElUKQorCQkJCURCRyhjb21tb24sICJNYWluIHRocmVhZCBleGl0aW5nIG9uIHNpZ25hbFxuIik7CisJCQlyYWlzZV9leGNlcHRpb24oY29tbW9uLCBGU0dfU1RBVEVfRVhJVCk7CisJCX0KKwl9CisKKwkvKiBDYW5jZWwgYWxsIHRoZSBwZW5kaW5nIHRyYW5zZmVycyAqLworCWlmIChmc2dfaXNfc2V0KGNvbW1vbikpIHsKKwkJZm9yIChpID0gMDsgaSA8IEZTR19OVU1fQlVGRkVSUzsgKytpKSB7CisJCQliaCA9ICZjb21tb24tPmJ1ZmZoZHNbaV07CisJCQlpZiAoYmgtPmlucmVxX2J1c3kpCisJCQkJdXNiX2VwX2RlcXVldWUoY29tbW9uLT5mc2ctPmJ1bGtfaW4sIGJoLT5pbnJlcSk7CisJCQlpZiAoYmgtPm91dHJlcV9idXN5KQorCQkJCXVzYl9lcF9kZXF1ZXVlKGNvbW1vbi0+ZnNnLT5idWxrX291dCwKKwkJCQkJICAgICAgIGJoLT5vdXRyZXEpOworCQl9CisKKwkJLyogV2FpdCB1bnRpbCBldmVyeXRoaW5nIGlzIGlkbGUgKi8KKwkJZm9yICg7OykgeworCQkJaW50IG51bV9hY3RpdmUgPSAwOworCQkJZm9yIChpID0gMDsgaSA8IEZTR19OVU1fQlVGRkVSUzsgKytpKSB7CisJCQkJYmggPSAmY29tbW9uLT5idWZmaGRzW2ldOworCQkJCW51bV9hY3RpdmUgKz0gYmgtPmlucmVxX2J1c3kgKyBiaC0+b3V0cmVxX2J1c3k7CisJCQl9CisJCQlpZiAobnVtX2FjdGl2ZSA9PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKHNsZWVwX3RocmVhZChjb21tb24pKQorCQkJCXJldHVybjsKKwkJfQorCisJCS8qIENsZWFyIG91dCB0aGUgY29udHJvbGxlcidzIGZpZm9zICovCisJCWlmIChjb21tb24tPmZzZy0+YnVsa19pbl9lbmFibGVkKQorCQkJdXNiX2VwX2ZpZm9fZmx1c2goY29tbW9uLT5mc2ctPmJ1bGtfaW4pOworCQlpZiAoY29tbW9uLT5mc2ctPmJ1bGtfb3V0X2VuYWJsZWQpCisJCQl1c2JfZXBfZmlmb19mbHVzaChjb21tb24tPmZzZy0+YnVsa19vdXQpOworCX0KKworCS8qIFJlc2V0IHRoZSBJL08gYnVmZmVyIHN0YXRlcyBhbmQgcG9pbnRlcnMsIHRoZSBTQ1NJCisJICogc3RhdGUsIGFuZCB0aGUgZXhjZXB0aW9uLiAgVGhlbiBpbnZva2UgdGhlIGhhbmRsZXIuICovCisJc3Bpbl9sb2NrX2lycSgmY29tbW9uLT5sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBGU0dfTlVNX0JVRkZFUlM7ICsraSkgeworCQliaCA9ICZjb21tb24tPmJ1ZmZoZHNbaV07CisJCWJoLT5zdGF0ZSA9IEJVRl9TVEFURV9FTVBUWTsKKwl9CisJY29tbW9uLT5uZXh0X2J1ZmZoZF90b19maWxsID0gJmNvbW1vbi0+YnVmZmhkc1swXTsKKwljb21tb24tPm5leHRfYnVmZmhkX3RvX2RyYWluID0gJmNvbW1vbi0+YnVmZmhkc1swXTsKKwlleGNlcHRpb25fcmVxX3RhZyA9IGNvbW1vbi0+ZXhjZXB0aW9uX3JlcV90YWc7CisJbmV3X2NvbmZpZyA9IGNvbW1vbi0+bmV3X2NvbmZpZzsKKwlvbGRfc3RhdGUgPSBjb21tb24tPnN0YXRlOworCisJaWYgKG9sZF9zdGF0ZSA9PSBGU0dfU1RBVEVfQUJPUlRfQlVMS19PVVQpCisJCWNvbW1vbi0+c3RhdGUgPSBGU0dfU1RBVEVfU1RBVFVTX1BIQVNFOworCWVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgY29tbW9uLT5ubHVuczsgKytpKSB7CisJCQljdXJsdW4gPSAmY29tbW9uLT5sdW5zW2ldOworCQkJY3VybHVuLT5wcmV2ZW50X21lZGl1bV9yZW1vdmFsID0gMDsKKwkJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX05PX1NFTlNFOworCQkJY3VybHVuLT51bml0X2F0dGVudGlvbl9kYXRhID0gU1NfTk9fU0VOU0U7CisJCQljdXJsdW4tPnNlbnNlX2RhdGFfaW5mbyA9IDA7CisJCQljdXJsdW4tPmluZm9fdmFsaWQgPSAwOworCQl9CisJCWNvbW1vbi0+c3RhdGUgPSBGU0dfU1RBVEVfSURMRTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZjb21tb24tPmxvY2spOworCisJLyogQ2Fycnkgb3V0IGFueSBleHRyYSBhY3Rpb25zIHJlcXVpcmVkIGZvciB0aGUgZXhjZXB0aW9uICovCisJc3dpdGNoIChvbGRfc3RhdGUpIHsKKwljYXNlIEZTR19TVEFURV9BQk9SVF9CVUxLX09VVDoKKwkJc2VuZF9zdGF0dXMoY29tbW9uKTsKKwkJc3Bpbl9sb2NrX2lycSgmY29tbW9uLT5sb2NrKTsKKwkJaWYgKGNvbW1vbi0+c3RhdGUgPT0gRlNHX1NUQVRFX1NUQVRVU19QSEFTRSkKKwkJCWNvbW1vbi0+c3RhdGUgPSBGU0dfU1RBVEVfSURMRTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjb21tb24tPmxvY2spOworCQlicmVhazsKKworCWNhc2UgRlNHX1NUQVRFX1JFU0VUOgorCQkvKiBJbiBjYXNlIHdlIHdlcmUgZm9yY2VkIGFnYWluc3Qgb3VyIHdpbGwgdG8gaGFsdCBhCisJCSAqIGJ1bGsgZW5kcG9pbnQsIGNsZWFyIHRoZSBoYWx0IG5vdy4gIChUaGUgU3VwZXJIIFVEQworCQkgKiByZXF1aXJlcyB0aGlzLikgKi8KKwkJaWYgKCFmc2dfaXNfc2V0KGNvbW1vbikpCisJCQlicmVhazsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChJR05PUkVfQlVMS19PVVQsCisJCQkJICAgICAgICZjb21tb24tPmZzZy0+YXRvbWljX2JpdGZsYWdzKSkKKwkJCXVzYl9lcF9jbGVhcl9oYWx0KGNvbW1vbi0+ZnNnLT5idWxrX2luKTsKKworCQlpZiAoY29tbW9uLT5lcDBfcmVxX3RhZyA9PSBleGNlcHRpb25fcmVxX3RhZykKKwkJCWVwMF9xdWV1ZShjb21tb24pOwkvKiBDb21wbGV0ZSB0aGUgc3RhdHVzIHN0YWdlICovCisKKwkJLyogVGVjaG5pY2FsbHkgdGhpcyBzaG91bGQgZ28gaGVyZSwgYnV0IGl0IHdvdWxkIG9ubHkgYmUKKwkJICogYSB3YXN0ZSBvZiB0aW1lLiAgRGl0dG8gZm9yIHRoZSBJTlRFUkZBQ0VfQ0hBTkdFIGFuZAorCQkgKiBDT05GSUdfQ0hBTkdFIGNhc2VzLiAqLworCQkvKiBmb3IgKGkgPSAwOyBpIDwgY29tbW9uLT5ubHVuczsgKytpKSAqLworCQkvKgljb21tb24tPmx1bnNbaV0udW5pdF9hdHRlbnRpb25fZGF0YSA9ICovCisJCS8qCQlTU19SRVNFVF9PQ0NVUlJFRDsgICovCisJCWJyZWFrOworCisJY2FzZSBGU0dfU1RBVEVfQ09ORklHX0NIQU5HRToKKwkJcmMgPSBkb19zZXRfY29uZmlnKGNvbW1vbiwgbmV3X2NvbmZpZyk7CisJCWlmIChjb21tb24tPmVwMF9yZXFfdGFnICE9IGV4Y2VwdGlvbl9yZXFfdGFnKQorCQkJYnJlYWs7CisJCWlmIChyYyAhPSAwKSB7CQkJLyogU1RBTEwgb24gZXJyb3JzICovCisJCQlEQkcoY29tbW9uLCAiZXAwIHNldCBoYWx0XG4iKTsKKwkJCXVzYl9lcF9zZXRfaGFsdChjb21tb24tPmVwMCk7CisJCX0gZWxzZSB7CQkJLyogQ29tcGxldGUgdGhlIHN0YXR1cyBzdGFnZSAqLworCQkJZXAwX3F1ZXVlKGNvbW1vbik7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEZTR19TVEFURV9FWElUOgorCWNhc2UgRlNHX1NUQVRFX1RFUk1JTkFURUQ6CisJCWRvX3NldF9jb25maWcoY29tbW9uLCAwKTsJCS8qIEZyZWUgcmVzb3VyY2VzICovCisJCXNwaW5fbG9ja19pcnEoJmNvbW1vbi0+bG9jayk7CisJCWNvbW1vbi0+c3RhdGUgPSBGU0dfU1RBVEVfVEVSTUlOQVRFRDsJLyogU3RvcCB0aGUgdGhyZWFkICovCisJCXNwaW5fdW5sb2NrX2lycSgmY29tbW9uLT5sb2NrKTsKKwkJYnJlYWs7CisKKwljYXNlIEZTR19TVEFURV9JTlRFUkZBQ0VfQ0hBTkdFOgorCWNhc2UgRlNHX1NUQVRFX0RJU0NPTk5FQ1Q6CisJY2FzZSBGU0dfU1RBVEVfQ09NTUFORF9QSEFTRToKKwljYXNlIEZTR19TVEFURV9EQVRBX1BIQVNFOgorCWNhc2UgRlNHX1NUQVRFX1NUQVRVU19QSEFTRToKKwljYXNlIEZTR19TVEFURV9JRExFOgorCQlicmVhazsKKwl9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBmc2dfbWFpbl90aHJlYWQodm9pZCAqY29tbW9uXykKK3sKKwlzdHJ1Y3QgZnNnX2NvbW1vbgkqY29tbW9uID0gY29tbW9uXzsKKworCS8qIEFsbG93IHRoZSB0aHJlYWQgdG8gYmUga2lsbGVkIGJ5IGEgc2lnbmFsLCBidXQgc2V0IHRoZSBzaWduYWwgbWFzaworCSAqIHRvIGJsb2NrIGV2ZXJ5dGhpbmcgYnV0IElOVCwgVEVSTSwgS0lMTCwgYW5kIFVTUjEuICovCisJYWxsb3dfc2lnbmFsKFNJR0lOVCk7CisJYWxsb3dfc2lnbmFsKFNJR1RFUk0pOworCWFsbG93X3NpZ25hbChTSUdLSUxMKTsKKwlhbGxvd19zaWduYWwoU0lHVVNSMSk7CisKKwkvKiBBbGxvdyB0aGUgdGhyZWFkIHRvIGJlIGZyb3plbiAqLworCXNldF9mcmVlemFibGUoKTsKKworCS8qIEFycmFuZ2UgZm9yIHVzZXJzcGFjZSByZWZlcmVuY2VzIHRvIGJlIGludGVycHJldGVkIGFzIGtlcm5lbAorCSAqIHBvaW50ZXJzLiAgVGhhdCB3YXkgd2UgY2FuIHBhc3MgYSBrZXJuZWwgcG9pbnRlciB0byBhIHJvdXRpbmUKKwkgKiB0aGF0IGV4cGVjdHMgYSBfX3VzZXIgcG9pbnRlciBhbmQgaXQgd2lsbCB3b3JrIG9rYXkuICovCisJc2V0X2ZzKGdldF9kcygpKTsKKworCS8qIFRoZSBtYWluIGxvb3AgKi8KKwl3aGlsZSAoY29tbW9uLT5zdGF0ZSAhPSBGU0dfU1RBVEVfVEVSTUlOQVRFRCkgeworCQlpZiAoZXhjZXB0aW9uX2luX3Byb2dyZXNzKGNvbW1vbikgfHwgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCWhhbmRsZV9leGNlcHRpb24oY29tbW9uKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFjb21tb24tPnJ1bm5pbmcpIHsKKwkJCXNsZWVwX3RocmVhZChjb21tb24pOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoZ2V0X25leHRfY29tbWFuZChjb21tb24pKQorCQkJY29udGludWU7CisKKwkJc3Bpbl9sb2NrX2lycSgmY29tbW9uLT5sb2NrKTsKKwkJaWYgKCFleGNlcHRpb25faW5fcHJvZ3Jlc3MoY29tbW9uKSkKKwkJCWNvbW1vbi0+c3RhdGUgPSBGU0dfU1RBVEVfREFUQV9QSEFTRTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjb21tb24tPmxvY2spOworCisJCWlmIChkb19zY3NpX2NvbW1hbmQoY29tbW9uKSB8fCBmaW5pc2hfcmVwbHkoY29tbW9uKSkKKwkJCWNvbnRpbnVlOworCisJCXNwaW5fbG9ja19pcnEoJmNvbW1vbi0+bG9jayk7CisJCWlmICghZXhjZXB0aW9uX2luX3Byb2dyZXNzKGNvbW1vbikpCisJCQljb21tb24tPnN0YXRlID0gRlNHX1NUQVRFX1NUQVRVU19QSEFTRTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjb21tb24tPmxvY2spOworCisJCWlmIChzZW5kX3N0YXR1cyhjb21tb24pKQorCQkJY29udGludWU7CisKKwkJc3Bpbl9sb2NrX2lycSgmY29tbW9uLT5sb2NrKTsKKwkJaWYgKCFleGNlcHRpb25faW5fcHJvZ3Jlc3MoY29tbW9uKSkKKwkJCWNvbW1vbi0+c3RhdGUgPSBGU0dfU1RBVEVfSURMRTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjb21tb24tPmxvY2spOworCX0KKworCXNwaW5fbG9ja19pcnEoJmNvbW1vbi0+bG9jayk7CisJY29tbW9uLT50aHJlYWRfdGFzayA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxKCZjb21tb24tPmxvY2spOworCisJaWYgKGNvbW1vbi0+dGhyZWFkX2V4aXRzKQorCQljb21tb24tPnRocmVhZF9leGl0cyhjb21tb24pOworCisJLyogTGV0IHRoZSB1bmJpbmQgYW5kIGNsZWFudXAgcm91dGluZXMga25vdyB0aGUgdGhyZWFkIGhhcyBleGl0ZWQgKi8KKwljb21wbGV0ZV9hbmRfZXhpdCgmY29tbW9uLT50aHJlYWRfbm90aWZpZXIsIDApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogREVWSUNFIEFUVFJJQlVURVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBXcml0ZSBwZXJtaXNzaW9uIGlzIGNoZWNrZWQgcGVyIExVTiBpbiBzdG9yZV8qKCkgZnVuY3Rpb25zLiAqLworc3RhdGljIERFVklDRV9BVFRSKHJvLCAwNjQ0LCBmc2dfc2hvd19ybywgZnNnX3N0b3JlX3JvKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihmaWxlLCAwNjQ0LCBmc2dfc2hvd19maWxlLCBmc2dfc3RvcmVfZmlsZSk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBGU0cgQ09NTU9OICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgZnNnX2NvbW1vbl9yZWxlYXNlKHN0cnVjdCBrcmVmICpyZWYpOworCitzdGF0aWMgdm9pZCBmc2dfbHVuX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCS8qIE5vdGhpbmcgbmVlZHMgdG8gYmUgZG9uZSAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnNnX2NvbW1vbl9nZXQoc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbikKK3sKKwlrcmVmX2dldCgmY29tbW9uLT5yZWYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnNnX2NvbW1vbl9wdXQoc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbikKK3sKKwlrcmVmX3B1dCgmY29tbW9uLT5yZWYsIGZzZ19jb21tb25fcmVsZWFzZSk7Cit9CisKKworc3RhdGljIHN0cnVjdCBmc2dfY29tbW9uICpmc2dfY29tbW9uX2luaXQoc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbiwKKwkJCQkJICBzdHJ1Y3QgdXNiX2NvbXBvc2l0ZV9kZXYgKmNkZXYsCisJCQkJCSAgc3RydWN0IGZzZ19jb25maWcgKmNmZykKK3sKKwlzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0ID0gY2Rldi0+Z2FkZ2V0OworCXN0cnVjdCBmc2dfYnVmZmhkICpiaDsKKwlzdHJ1Y3QgZnNnX2x1biAqY3VybHVuOworCXN0cnVjdCBmc2dfbHVuX2NvbmZpZyAqbGNmZzsKKwlpbnQgbmx1bnMsIGksIHJjOworCWNoYXIgKnBhdGhidWY7CisKKwkvKiBGaW5kIG91dCBob3cgbWFueSBMVU5zIHRoZXJlIHNob3VsZCBiZSAqLworCW5sdW5zID0gY2ZnLT5ubHVuczsKKwlpZiAobmx1bnMgPCAxIHx8IG5sdW5zID4gRlNHX01BWF9MVU5TKSB7CisJCWRldl9lcnIoJmdhZGdldC0+ZGV2LCAiaW52YWxpZCBudW1iZXIgb2YgTFVOczogJXVcbiIsIG5sdW5zKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJLyogQWxsb2NhdGU/ICovCisJaWYgKCFjb21tb24pIHsKKwkJY29tbW9uID0ga3phbGxvYyhzaXplb2YgKmNvbW1vbiwgR0ZQX0tFUk5FTCk7CisJCWlmICghY29tbW9uKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJCWNvbW1vbi0+ZnJlZV9zdG9yYWdlX29uX3JlbGVhc2UgPSAxOworCX0gZWxzZSB7CisJCW1lbXNldChjb21tb24sIDAsIHNpemVvZiBjb21tb24pOworCQljb21tb24tPmZyZWVfc3RvcmFnZV9vbl9yZWxlYXNlID0gMDsKKwl9CisKKwljb21tb24tPnByaXZhdGVfZGF0YSA9IGNmZy0+cHJpdmF0ZV9kYXRhOworCisJY29tbW9uLT5nYWRnZXQgPSBnYWRnZXQ7CisJY29tbW9uLT5lcDAgPSBnYWRnZXQtPmVwMDsKKwljb21tb24tPmVwMHJlcSA9IGNkZXYtPnJlcTsKKworCS8qIE1heWJlIGFsbG9jYXRlIGRldmljZS1nbG9iYWwgc3RyaW5nIElEcywgYW5kIHBhdGNoIGRlc2NyaXB0b3JzICovCisJaWYgKGZzZ19zdHJpbmdzW0ZTR19TVFJJTkdfSU5URVJGQUNFXS5pZCA9PSAwKSB7CisJCXJjID0gdXNiX3N0cmluZ19pZChjZGV2KTsKKwkJaWYgKHJjIDwgMCkgeworCQkJa2ZyZWUoY29tbW9uKTsKKwkJCXJldHVybiBFUlJfUFRSKHJjKTsKKwkJfQorCQlmc2dfc3RyaW5nc1tGU0dfU1RSSU5HX0lOVEVSRkFDRV0uaWQgPSByYzsKKwkJZnNnX2ludGZfZGVzYy5pSW50ZXJmYWNlID0gcmM7CisJfQorCisJLyogQ3JlYXRlIHRoZSBMVU5zLCBvcGVuIHRoZWlyIGJhY2tpbmcgZmlsZXMsIGFuZCByZWdpc3RlciB0aGUKKwkgKiBMVU4gZGV2aWNlcyBpbiBzeXNmcy4gKi8KKwljdXJsdW4gPSBremFsbG9jKG5sdW5zICogc2l6ZW9mICpjdXJsdW4sIEdGUF9LRVJORUwpOworCWlmICghY3VybHVuKSB7CisJCWtmcmVlKGNvbW1vbik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKwljb21tb24tPmx1bnMgPSBjdXJsdW47CisKKwlpbml0X3J3c2VtKCZjb21tb24tPmZpbGVzZW0pOworCisJZm9yIChpID0gMCwgbGNmZyA9IGNmZy0+bHVuczsgaSA8IG5sdW5zOyArK2ksICsrY3VybHVuLCArK2xjZmcpIHsKKwkJY3VybHVuLT5jZHJvbSA9ICEhbGNmZy0+Y2Ryb207CisJCWN1cmx1bi0+cm8gPSBsY2ZnLT5jZHJvbSB8fCBsY2ZnLT5ybzsKKwkJY3VybHVuLT5yZW1vdmFibGUgPSBsY2ZnLT5yZW1vdmFibGU7CisJCWN1cmx1bi0+ZGV2LnJlbGVhc2UgPSBmc2dfbHVuX3JlbGVhc2U7CisJCWN1cmx1bi0+ZGV2LnBhcmVudCA9ICZnYWRnZXQtPmRldjsKKwkJLyogY3VybHVuLT5kZXYuZHJpdmVyID0gJmZzZ19kcml2ZXIuZHJpdmVyOyBYWFggKi8KKwkJZGV2X3NldF9kcnZkYXRhKCZjdXJsdW4tPmRldiwgJmNvbW1vbi0+ZmlsZXNlbSk7CisJCWRldl9zZXRfbmFtZSgmY3VybHVuLT5kZXYsCisJCQkgICAgIGNmZy0+bHVuX25hbWVfZm9ybWF0CisJCQkgICA/IGNmZy0+bHVuX25hbWVfZm9ybWF0CisJCQkgICA6ICJsdW4lZCIsCisJCQkgICAgIGkpOworCisJCXJjID0gZGV2aWNlX3JlZ2lzdGVyKCZjdXJsdW4tPmRldik7CisJCWlmIChyYykgeworCQkJSU5GTyhjb21tb24sICJmYWlsZWQgdG8gcmVnaXN0ZXIgTFVOJWQ6ICVkXG4iLCBpLCByYyk7CisJCQljb21tb24tPm5sdW5zID0gaTsKKwkJCWdvdG8gZXJyb3JfcmVsZWFzZTsKKwkJfQorCisJCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZjdXJsdW4tPmRldiwgJmRldl9hdHRyX3JvKTsKKwkJaWYgKHJjKQorCQkJZ290byBlcnJvcl9sdW5zOworCQlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmY3VybHVuLT5kZXYsICZkZXZfYXR0cl9maWxlKTsKKwkJaWYgKHJjKQorCQkJZ290byBlcnJvcl9sdW5zOworCisJCWlmIChsY2ZnLT5maWxlbmFtZSkgeworCQkJcmMgPSBmc2dfbHVuX29wZW4oY3VybHVuLCBsY2ZnLT5maWxlbmFtZSk7CisJCQlpZiAocmMpCisJCQkJZ290byBlcnJvcl9sdW5zOworCQl9IGVsc2UgaWYgKCFjdXJsdW4tPnJlbW92YWJsZSkgeworCQkJRVJST1IoY29tbW9uLCAibm8gZmlsZSBnaXZlbiBmb3IgTFVOJWRcbiIsIGkpOworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBlcnJvcl9sdW5zOworCQl9CisJfQorCWNvbW1vbi0+bmx1bnMgPSBubHVuczsKKworCisJLyogRGF0YSBidWZmZXJzIGN5Y2xpYyBsaXN0ICovCisJLyogQnVmZmVycyBpbiBidWZmaGRzIGFyZSBzdGF0aWMgLS0gbm8gbmVlZCBmb3IgYWRkaXRpb25hbAorCSAqIGFsbG9jYXRpb24uICovCisJYmggPSBjb21tb24tPmJ1ZmZoZHM7CisJaSA9IEZTR19OVU1fQlVGRkVSUyAtIDE7CisJZG8geworCQliaC0+bmV4dCA9IGJoICsgMTsKKwl9IHdoaWxlICgrK2JoLCAtLWkpOworCWJoLT5uZXh0ID0gY29tbW9uLT5idWZmaGRzOworCisKKwkvKiBQcmVwYXJlIGlucXVpcnlTdHJpbmcgKi8KKwlpZiAoY2ZnLT5yZWxlYXNlICE9IDB4ZmZmZikgeworCQlpID0gY2ZnLT5yZWxlYXNlOworCX0gZWxzZSB7CisJCS8qIFRoZSBzYTExMDAgY29udHJvbGxlciBpcyBub3Qgc3VwcG9ydGVkICovCisJCWkgPSBnYWRnZXRfaXNfc2ExMTAwKGdhZGdldCkKKwkJCT8gLTEKKwkJCTogdXNiX2dhZGdldF9jb250cm9sbGVyX251bWJlcihnYWRnZXQpOworCQlpZiAoaSA+PSAwKSB7CisJCQlpID0gMHgwMzAwICsgaTsKKwkJfSBlbHNlIHsKKwkJCVdBUk5JTkcoY29tbW9uLCAiY29udHJvbGxlciAnJXMnIG5vdCByZWNvZ25pemVkXG4iLAorCQkJCWdhZGdldC0+bmFtZSk7CisJCQlpID0gMHgwMzk5OworCQl9CisJfQorI2RlZmluZSBPUih4LCB5KSAoKHgpID8gKHgpIDogKHkpKQorCXNucHJpbnRmKGNvbW1vbi0+aW5xdWlyeV9zdHJpbmcsIHNpemVvZiBjb21tb24tPmlucXVpcnlfc3RyaW5nLAorCQkgIiUtOHMlLTE2cyUwNHgiLAorCQkgT1IoY2ZnLT52ZW5kb3JfbmFtZSwgIkxpbnV4ICAgIiksCisJCSAvKiBBc3N1bWUgcHJvZHVjdCBuYW1lIGRlcGVuZGVudCBvbiB0aGUgZmlyc3QgTFVOICovCisJCSBPUihjZmctPnByb2R1Y3RfbmFtZSwgY29tbW9uLT5sdW5zLT5jZHJvbQorCQkJCSAgICAgPyAiRmlsZS1TdG9yIEdhZGdldCIKKwkJCQkgICAgIDogIkZpbGUtQ0QgR2FkZ2V0ICAiKSwKKwkJIGkpOworCisKKwkvKiBTb21lIHBlcmlwaGVyYWwgY29udHJvbGxlcnMgYXJlIGtub3duIG5vdCB0byBiZSBhYmxlIHRvCisJICogaGFsdCBidWxrIGVuZHBvaW50cyBjb3JyZWN0bHkuICBJZiBvbmUgb2YgdGhlbSBpcyBwcmVzZW50LAorCSAqIGRpc2FibGUgc3RhbGxzLgorCSAqLworCWNvbW1vbi0+Y2FuX3N0YWxsID0gY2ZnLT5jYW5fc3RhbGwgJiYKKwkJIShnYWRnZXRfaXNfc2goY29tbW9uLT5nYWRnZXQpIHx8CisJCSAgZ2FkZ2V0X2lzX2F0OTEoY29tbW9uLT5nYWRnZXQpKTsKKworCisJc3Bpbl9sb2NrX2luaXQoJmNvbW1vbi0+bG9jayk7CisJa3JlZl9pbml0KCZjb21tb24tPnJlZik7CisKKworCS8qIFRlbGwgdGhlIHRocmVhZCB0byBzdGFydCB3b3JraW5nICovCisJY29tbW9uLT50aHJlYWRfZXhpdHMgPSBjZmctPnRocmVhZF9leGl0czsKKwljb21tb24tPnRocmVhZF90YXNrID0KKwkJa3RocmVhZF9jcmVhdGUoZnNnX21haW5fdGhyZWFkLCBjb21tb24sCisJCQkgICAgICAgT1IoY2ZnLT50aHJlYWRfbmFtZSwgImZpbGUtc3RvcmFnZSIpKTsKKwlpZiAoSVNfRVJSKGNvbW1vbi0+dGhyZWFkX3Rhc2spKSB7CisJCXJjID0gUFRSX0VSUihjb21tb24tPnRocmVhZF90YXNrKTsKKwkJZ290byBlcnJvcl9yZWxlYXNlOworCX0KKwlpbml0X2NvbXBsZXRpb24oJmNvbW1vbi0+dGhyZWFkX25vdGlmaWVyKTsKKyN1bmRlZiBPUgorCisKKwkvKiBJbmZvcm1hdGlvbiAqLworCUlORk8oY29tbW9uLCBGU0dfRFJJVkVSX0RFU0MgIiwgdmVyc2lvbjogIiBGU0dfRFJJVkVSX1ZFUlNJT04gIlxuIik7CisJSU5GTyhjb21tb24sICJOdW1iZXIgb2YgTFVOcz0lZFxuIiwgY29tbW9uLT5ubHVucyk7CisKKwlwYXRoYnVmID0ga21hbGxvYyhQQVRIX01BWCwgR0ZQX0tFUk5FTCk7CisJZm9yIChpID0gMCwgbmx1bnMgPSBjb21tb24tPm5sdW5zLCBjdXJsdW4gPSBjb21tb24tPmx1bnM7CisJICAgICBpIDwgbmx1bnM7CisJICAgICArK2N1cmx1biwgKytpKSB7CisJCWNoYXIgKnAgPSAiKG5vIG1lZGl1bSkiOworCQlpZiAoZnNnX2x1bl9pc19vcGVuKGN1cmx1bikpIHsKKwkJCXAgPSAiKGVycm9yKSI7CisJCQlpZiAocGF0aGJ1ZikgeworCQkJCXAgPSBkX3BhdGgoJmN1cmx1bi0+ZmlscC0+Zl9wYXRoLAorCQkJCQkgICBwYXRoYnVmLCBQQVRIX01BWCk7CisJCQkJaWYgKElTX0VSUihwKSkKKwkJCQkJcCA9ICIoZXJyb3IpIjsKKwkJCX0KKwkJfQorCQlMSU5GTyhjdXJsdW4sICJMVU46ICVzJXMlc2ZpbGU6ICVzXG4iLAorCQkgICAgICBjdXJsdW4tPnJlbW92YWJsZSA/ICJyZW1vdmFibGUgIiA6ICIiLAorCQkgICAgICBjdXJsdW4tPnJvID8gInJlYWQgb25seSAiIDogIiIsCisJCSAgICAgIGN1cmx1bi0+Y2Ryb20gPyAiQ0QtUk9NICIgOiAiIiwKKwkJICAgICAgcCk7CisJfQorCWtmcmVlKHBhdGhidWYpOworCisJREJHKGNvbW1vbiwgIkkvTyB0aHJlYWQgcGlkOiAlZFxuIiwgdGFza19waWRfbnIoY29tbW9uLT50aHJlYWRfdGFzaykpOworCisJd2FrZV91cF9wcm9jZXNzKGNvbW1vbi0+dGhyZWFkX3Rhc2spOworCisJcmV0dXJuIGNvbW1vbjsKKworCitlcnJvcl9sdW5zOgorCWNvbW1vbi0+bmx1bnMgPSBpICsgMTsKK2Vycm9yX3JlbGVhc2U6CisJY29tbW9uLT5zdGF0ZSA9IEZTR19TVEFURV9URVJNSU5BVEVEOwkvKiBUaGUgdGhyZWFkIGlzIGRlYWQgKi8KKwkvKiBDYWxsIGZzZ19jb21tb25fcmVsZWFzZSgpIGRpcmVjdGx5LCByZWYgbWlnaHQgYmUgbm90CisJICogaW5pdGlhbGlzZWQgKi8KKwlmc2dfY29tbW9uX3JlbGVhc2UoJmNvbW1vbi0+cmVmKTsKKwljb21wbGV0ZSgmY29tbW9uLT50aHJlYWRfbm90aWZpZXIpOworCXJldHVybiBFUlJfUFRSKHJjKTsKK30KKworCitzdGF0aWMgdm9pZCBmc2dfY29tbW9uX3JlbGVhc2Uoc3RydWN0IGtyZWYgKnJlZikKK3sKKwlzdHJ1Y3QgZnNnX2NvbW1vbiAqY29tbW9uID0KKwkJY29udGFpbmVyX29mKHJlZiwgc3RydWN0IGZzZ19jb21tb24sIHJlZik7CisJdW5zaWduZWQgaSA9IGNvbW1vbi0+bmx1bnM7CisJc3RydWN0IGZzZ19sdW4gKmx1biA9IGNvbW1vbi0+bHVuczsKKworCS8qIElmIHRoZSB0aHJlYWQgaXNuJ3QgYWxyZWFkeSBkZWFkLCB0ZWxsIGl0IHRvIGV4aXQgbm93ICovCisJaWYgKGNvbW1vbi0+c3RhdGUgIT0gRlNHX1NUQVRFX1RFUk1JTkFURUQpIHsKKwkJcmFpc2VfZXhjZXB0aW9uKGNvbW1vbiwgRlNHX1NUQVRFX0VYSVQpOworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjb21tb24tPnRocmVhZF9ub3RpZmllcik7CisKKwkJLyogVGhlIGNsZWFudXAgcm91dGluZSB3YWl0cyBmb3IgdGhpcyBjb21wbGV0aW9uIGFsc28gKi8KKwkJY29tcGxldGUoJmNvbW1vbi0+dGhyZWFkX25vdGlmaWVyKTsKKwl9CisKKwkvKiBCZXdhcmUgdGVtcHRpbmcgZm9yIC0+IGRvLXdoaWxlIG9wdGltaXphdGlvbjogd2hlbiBpbiBlcnJvcgorCSAqIHJlY292ZXJ5IG5sdW5zIG1heSBiZSB6ZXJvLiAqLworCisJZm9yICg7IGk7IC0taSwgKytsdW4pIHsKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZsdW4tPmRldiwgJmRldl9hdHRyX3JvKTsKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZsdW4tPmRldiwgJmRldl9hdHRyX2ZpbGUpOworCQlmc2dfbHVuX2Nsb3NlKGx1bik7CisJCWRldmljZV91bnJlZ2lzdGVyKCZsdW4tPmRldik7CisJfQorCisJa2ZyZWUoY29tbW9uLT5sdW5zKTsKKwlpZiAoY29tbW9uLT5mcmVlX3N0b3JhZ2Vfb25fcmVsZWFzZSkKKwkJa2ZyZWUoY29tbW9uKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKK3N0YXRpYyB2b2lkIGZzZ191bmJpbmQoc3RydWN0IHVzYl9jb25maWd1cmF0aW9uICpjLCBzdHJ1Y3QgdXNiX2Z1bmN0aW9uICpmKQoreworCXN0cnVjdCBmc2dfZGV2CQkqZnNnID0gZnNnX2Zyb21fZnVuYyhmKTsKKworCURCRyhmc2csICJ1bmJpbmRcbiIpOworCWZzZ19jb21tb25fcHV0KGZzZy0+Y29tbW9uKTsKKwlrZnJlZShmc2cpOworfQorCisKK3N0YXRpYyBpbnQgZnNnX2JpbmQoc3RydWN0IHVzYl9jb25maWd1cmF0aW9uICpjLCBzdHJ1Y3QgdXNiX2Z1bmN0aW9uICpmKQoreworCXN0cnVjdCBmc2dfZGV2CQkqZnNnID0gZnNnX2Zyb21fZnVuYyhmKTsKKwlzdHJ1Y3QgdXNiX2dhZGdldAkqZ2FkZ2V0ID0gYy0+Y2Rldi0+Z2FkZ2V0OworCWludAkJCXJjOworCWludAkJCWk7CisJc3RydWN0IHVzYl9lcAkJKmVwOworCisJZnNnLT5nYWRnZXQgPSBnYWRnZXQ7CisKKwkvKiBOZXcgaW50ZXJmYWNlICovCisJaSA9IHVzYl9pbnRlcmZhY2VfaWQoYywgZik7CisJaWYgKGkgPCAwKQorCQlyZXR1cm4gaTsKKwlmc2dfaW50Zl9kZXNjLmJJbnRlcmZhY2VOdW1iZXIgPSBpOworCWZzZy0+aW50ZXJmYWNlX251bWJlciA9IGk7CisKKwkvKiBGaW5kIGFsbCB0aGUgZW5kcG9pbnRzIHdlIHdpbGwgdXNlICovCisJZXAgPSB1c2JfZXBfYXV0b2NvbmZpZyhnYWRnZXQsICZmc2dfZnNfYnVsa19pbl9kZXNjKTsKKwlpZiAoIWVwKQorCQlnb3RvIGF1dG9jb25mX2ZhaWw7CisJZXAtPmRyaXZlcl9kYXRhID0gZnNnLT5jb21tb247CS8qIGNsYWltIHRoZSBlbmRwb2ludCAqLworCWZzZy0+YnVsa19pbiA9IGVwOworCisJZXAgPSB1c2JfZXBfYXV0b2NvbmZpZyhnYWRnZXQsICZmc2dfZnNfYnVsa19vdXRfZGVzYyk7CisJaWYgKCFlcCkKKwkJZ290byBhdXRvY29uZl9mYWlsOworCWVwLT5kcml2ZXJfZGF0YSA9IGZzZy0+Y29tbW9uOwkvKiBjbGFpbSB0aGUgZW5kcG9pbnQgKi8KKwlmc2ctPmJ1bGtfb3V0ID0gZXA7CisKKwlpZiAoZ2FkZ2V0X2lzX2R1YWxzcGVlZChnYWRnZXQpKSB7CisJCS8qIEFzc3VtZSBlbmRwb2ludCBhZGRyZXNzZXMgYXJlIHRoZSBzYW1lIGZvciBib3RoIHNwZWVkcyAqLworCQlmc2dfaHNfYnVsa19pbl9kZXNjLmJFbmRwb2ludEFkZHJlc3MgPQorCQkJZnNnX2ZzX2J1bGtfaW5fZGVzYy5iRW5kcG9pbnRBZGRyZXNzOworCQlmc2dfaHNfYnVsa19vdXRfZGVzYy5iRW5kcG9pbnRBZGRyZXNzID0KKwkJCWZzZ19mc19idWxrX291dF9kZXNjLmJFbmRwb2ludEFkZHJlc3M7CisJCWYtPmhzX2Rlc2NyaXB0b3JzID0gZnNnX2hzX2Z1bmN0aW9uOworCX0KKworCXJldHVybiAwOworCithdXRvY29uZl9mYWlsOgorCUVSUk9SKGZzZywgInVuYWJsZSB0byBhdXRvY29uZmlndXJlIGFsbCBlbmRwb2ludHNcbiIpOworCXJjID0gLUVOT1RTVVBQOworCWZzZ191bmJpbmQoYywgZik7CisJcmV0dXJuIHJjOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUREIEZVTkNUSU9OICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCB1c2JfZ2FkZ2V0X3N0cmluZ3MgKmZzZ19zdHJpbmdzX2FycmF5W10gPSB7CisJJmZzZ19zdHJpbmd0YWIsCisJTlVMTCwKK307CisKK3N0YXRpYyBpbnQgZnNnX2FkZChzdHJ1Y3QgdXNiX2NvbXBvc2l0ZV9kZXYgKmNkZXYsCisJCSAgIHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbiAqYywKKwkJICAgc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbikKK3sKKwlzdHJ1Y3QgZnNnX2RldiAqZnNnOworCWludCByYzsKKworCWZzZyA9IGt6YWxsb2Moc2l6ZW9mICpmc2csIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseSghZnNnKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmc2ctPmZ1bmN0aW9uLm5hbWUgICAgICAgID0gRlNHX0RSSVZFUl9ERVNDOworCWZzZy0+ZnVuY3Rpb24uc3RyaW5ncyAgICAgPSBmc2dfc3RyaW5nc19hcnJheTsKKwlmc2ctPmZ1bmN0aW9uLmRlc2NyaXB0b3JzID0gZnNnX2ZzX2Z1bmN0aW9uOworCWZzZy0+ZnVuY3Rpb24uYmluZCAgICAgICAgPSBmc2dfYmluZDsKKwlmc2ctPmZ1bmN0aW9uLnVuYmluZCAgICAgID0gZnNnX3VuYmluZDsKKwlmc2ctPmZ1bmN0aW9uLnNldHVwICAgICAgID0gZnNnX3NldHVwOworCWZzZy0+ZnVuY3Rpb24uc2V0X2FsdCAgICAgPSBmc2dfc2V0X2FsdDsKKwlmc2ctPmZ1bmN0aW9uLmRpc2FibGUgICAgID0gZnNnX2Rpc2FibGU7CisKKwlmc2ctPmNvbW1vbiAgICAgICAgICAgICAgID0gY29tbW9uOworCS8qIE91ciBjYWxsZXIgaG9sZHMgYSByZWZlcmVuY2UgdG8gY29tbW9uIHN0cnVjdHVyZSBzbyB3ZQorCSAqIGRvbid0IGhhdmUgdG8gYmUgd29ycnkgYWJvdXQgaXQgYmVpbmcgZnJlZWQgdW50aWwgd2UgcmV0dXJuCisJICogZnJvbSB0aGlzIGZ1bmN0aW9uLiAgU28gaW5zdGVhZCBvZiBpbmNyZW1lbnRpbmcgY291bnRlciBub3cKKwkgKiBhbmQgZGVjcmVtZW50IGluIGVycm9yIHJlY292ZXJ5IHdlIGluY3JlbWVudCBpdCBvbmx5IHdoZW4KKwkgKiBjYWxsIHRvIHVzYl9hZGRfZnVuY3Rpb24oKSB3YXMgc3VjY2Vzc2Z1bC4gKi8KKworCXJjID0gdXNiX2FkZF9mdW5jdGlvbihjLCAmZnNnLT5mdW5jdGlvbik7CisKKwlpZiAobGlrZWx5KHJjID09IDApKQorCQlmc2dfY29tbW9uX2dldChmc2ctPmNvbW1vbik7CisJZWxzZQorCQlrZnJlZShmc2cpOworCisJcmV0dXJuIHJjOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogTW9kdWxlIHBhcmFtZXRlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdHJ1Y3QgZnNnX21vZHVsZV9wYXJhbWV0ZXJzIHsKKwljaGFyCQkqZmlsZVtGU0dfTUFYX0xVTlNdOworCWludAkJcm9bRlNHX01BWF9MVU5TXTsKKwlpbnQJCXJlbW92YWJsZVtGU0dfTUFYX0xVTlNdOworCWludAkJY2Ryb21bRlNHX01BWF9MVU5TXTsKKworCXVuc2lnbmVkIGludAlmaWxlX2NvdW50LCByb19jb3VudCwgcmVtb3ZhYmxlX2NvdW50LCBjZHJvbV9jb3VudDsKKwl1bnNpZ25lZCBpbnQJbHVuczsJLyogbmx1bnMgKi8KKwlpbnQJCXN0YWxsOwkvKiBjYW5fc3RhbGwgKi8KK307CisKKworI2RlZmluZSBfRlNHX01PRFVMRV9QQVJBTV9BUlJBWShwcmVmaXgsIHBhcmFtcywgbmFtZSwgdHlwZSwgZGVzYykJXAorCW1vZHVsZV9wYXJhbV9hcnJheV9uYW1lZChwcmVmaXggIyMgbmFtZSwgcGFyYW1zLm5hbWUsIHR5cGUsCVwKKwkJCQkgJnByZWZpeCAjIyBwYXJhbXMubmFtZSAjIyBfY291bnQsCVwKKwkJCQkgU19JUlVHTyk7CQkJCVwKKwlNT0RVTEVfUEFSTV9ERVNDKHByZWZpeCAjIyBuYW1lLCBkZXNjKQorCisjZGVmaW5lIF9GU0dfTU9EVUxFX1BBUkFNKHByZWZpeCwgcGFyYW1zLCBuYW1lLCB0eXBlLCBkZXNjKQkJXAorCW1vZHVsZV9wYXJhbV9uYW1lZChwcmVmaXggIyMgbmFtZSwgcGFyYW1zLm5hbWUsIHR5cGUsCQlcCisJCQkgICBTX0lSVUdPKTsJCQkJCVwKKwlNT0RVTEVfUEFSTV9ERVNDKHByZWZpeCAjIyBuYW1lLCBkZXNjKQorCisjZGVmaW5lIEZTR19NT0RVTEVfUEFSQU1FVEVSUyhwcmVmaXgsIHBhcmFtcykJCQkJXAorCV9GU0dfTU9EVUxFX1BBUkFNX0FSUkFZKHByZWZpeCwgcGFyYW1zLCBmaWxlLCBjaGFycCwJCVwKKwkJCQkibmFtZXMgb2YgYmFja2luZyBmaWxlcyBvciBkZXZpY2VzIik7CVwKKwlfRlNHX01PRFVMRV9QQVJBTV9BUlJBWShwcmVmaXgsIHBhcmFtcywgcm8sIGJvb2wsCQlcCisJCQkJInRydWUgdG8gZm9yY2UgcmVhZC1vbmx5Iik7CQlcCisJX0ZTR19NT0RVTEVfUEFSQU1fQVJSQVkocHJlZml4LCBwYXJhbXMsIHJlbW92YWJsZSwgYm9vbCwJXAorCQkJCSJ0cnVlIHRvIHNpbXVsYXRlIHJlbW92YWJsZSBtZWRpYSIpOwlcCisJX0ZTR19NT0RVTEVfUEFSQU1fQVJSQVkocHJlZml4LCBwYXJhbXMsIGNkcm9tLCBib29sLAkJXAorCQkJCSJ0cnVlIHRvIHNpbXVsYXRlIENELVJPTSBpbnN0ZWFkIG9mIGRpc2siKTsgXAorCV9GU0dfTU9EVUxFX1BBUkFNKHByZWZpeCwgcGFyYW1zLCBsdW5zLCB1aW50LAkJCVwKKwkJCSAgIm51bWJlciBvZiBMVU5zIik7CQkJCVwKKwlfRlNHX01PRFVMRV9QQVJBTShwcmVmaXgsIHBhcmFtcywgc3RhbGwsIGJvb2wsCQkJXAorCQkJICAiZmFsc2UgdG8gcHJldmVudCBidWxrIHN0YWxscyIpCisKKworc3RhdGljIHZvaWQKK2ZzZ19jb25maWdfZnJvbV9wYXJhbXMoc3RydWN0IGZzZ19jb25maWcgKmNmZywKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBmc2dfbW9kdWxlX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgZnNnX2x1bl9jb25maWcgKmx1bjsKKwl1bnNpZ25lZCBpOworCisJLyogQ29uZmlndXJlIExVTnMgKi8KKwljZmctPm5sdW5zID0KKwkJbWluKHBhcmFtcy0+bHVucyA/OiAocGFyYW1zLT5maWxlX2NvdW50ID86IDF1KSwKKwkJICAgICh1bnNpZ25lZClGU0dfTUFYX0xVTlMpOworCWZvciAoaSA9IDAsIGx1biA9IGNmZy0+bHVuczsgaSA8IGNmZy0+bmx1bnM7ICsraSwgKytsdW4pIHsKKwkJbHVuLT5ybyA9ICEhcGFyYW1zLT5yb1tpXTsKKwkJbHVuLT5jZHJvbSA9ICEhcGFyYW1zLT5jZHJvbVtpXTsKKwkJbHVuLT5yZW1vdmFibGUgPSAvKiBSZW1vdmFibGUgYnkgZGVmYXVsdCAqLworCQkJcGFyYW1zLT5yZW1vdmFibGVfY291bnQgPD0gaSB8fCBwYXJhbXMtPnJlbW92YWJsZVtpXTsKKwkJbHVuLT5maWxlbmFtZSA9CisJCQlwYXJhbXMtPmZpbGVfY291bnQgPiBpICYmIHBhcmFtcy0+ZmlsZVtpXVswXQorCQkJPyBwYXJhbXMtPmZpbGVbaV0KKwkJCTogMDsKKwl9CisKKwkvKiBMZXQgTVNGIHVzZSBkZWZhdWx0cyAqLworCWNmZy0+bHVuX25hbWVfZm9ybWF0ID0gMDsKKwljZmctPnRocmVhZF9uYW1lID0gMDsKKwljZmctPnZlbmRvcl9uYW1lID0gMDsKKwljZmctPnByb2R1Y3RfbmFtZSA9IDA7CisJY2ZnLT5yZWxlYXNlID0gMHhmZmZmOworCisJY2ZnLT50aHJlYWRfZXhpdHMgPSAwOworCWNmZy0+cHJpdmF0ZV9kYXRhID0gMDsKKworCS8qIEZpbmFsaXNlICovCisJY2ZnLT5jYW5fc3RhbGwgPSBwYXJhbXMtPnN0YWxsOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBmc2dfY29tbW9uICoKK2ZzZ19jb21tb25fZnJvbV9wYXJhbXMoc3RydWN0IGZzZ19jb21tb24gKmNvbW1vbiwKKwkJICAgICAgIHN0cnVjdCB1c2JfY29tcG9zaXRlX2RldiAqY2RldiwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBmc2dfbW9kdWxlX3BhcmFtZXRlcnMgKnBhcmFtcykKKwlfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKTsKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGZzZ19jb21tb24gKgorZnNnX2NvbW1vbl9mcm9tX3BhcmFtcyhzdHJ1Y3QgZnNnX2NvbW1vbiAqY29tbW9uLAorCQkgICAgICAgc3RydWN0IHVzYl9jb21wb3NpdGVfZGV2ICpjZGV2LAorCQkgICAgICAgY29uc3Qgc3RydWN0IGZzZ19tb2R1bGVfcGFyYW1ldGVycyAqcGFyYW1zKQoreworCXN0cnVjdCBmc2dfY29uZmlnIGNmZzsKKwlmc2dfY29uZmlnX2Zyb21fcGFyYW1zKCZjZmcsIHBhcmFtcyk7CisJcmV0dXJuIGZzZ19jb21tb25faW5pdChjb21tb24sIGNkZXYsICZjZmcpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9ybmRpcy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Zfcm5kaXMuYwppbmRleCBjOTk2NmNjLi45NWRhZTRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9ybmRpcy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX3JuZGlzLmMKQEAgLTQsNiArNCw4IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSwyMDA4IERhdmlkIEJyb3duZWxsCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBSb2JlcnQgU2Nod2ViZWwsIEJlbmVkaWt0IFNwcmFuZ2VyCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwOSBTYW1zdW5nIEVsZWN0cm9uaWNzCisgKiAgICAgICAgICAgICAgICAgICAgQXV0aG9yOiBNaWNoYWwgTmF6YXJld2ljeiAobS5uYXphcmV3aWN6QHNhbXN1bmcuY29tKQogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMTQ5LDggKzE1MSw4IEBACiAJLmJEYXRhSW50ZXJmYWNlID0JMHgwMSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX2NkY19hY21fZGVzY3JpcHRvciBhY21fZGVzY3JpcHRvciBfX2luaXRkYXRhID0gewotCS5iTGVuZ3RoID0JCXNpemVvZiBhY21fZGVzY3JpcHRvciwKK3N0YXRpYyBzdHJ1Y3QgdXNiX2NkY19hY21fZGVzY3JpcHRvciBybmRpc19hY21fZGVzY3JpcHRvciBfX2luaXRkYXRhID0geworCS5iTGVuZ3RoID0JCXNpemVvZiBybmRpc19hY21fZGVzY3JpcHRvciwKIAkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0NTX0lOVEVSRkFDRSwKIAkuYkRlc2NyaXB0b3JTdWJUeXBlID0JVVNCX0NEQ19BQ01fVFlQRSwKIApAQCAtMTc5LDYgKzE4MSwyMCBAQAogCS8qIC5pSW50ZXJmYWNlID0gRFlOQU1JQyAqLwogfTsKIAorCitzdGF0aWMgc3RydWN0IHVzYl9pbnRlcmZhY2VfYXNzb2NfZGVzY3JpcHRvcgorcm5kaXNfaWFkX2Rlc2NyaXB0b3IgPSB7CisJLmJMZW5ndGggPQkJc2l6ZW9mIHJuZGlzX2lhZF9kZXNjcmlwdG9yLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfSU5URVJGQUNFX0FTU09DSUFUSU9OLAorCisJLmJGaXJzdEludGVyZmFjZSA9CTAsIC8qIFhYWCwgaGFyZGNvZGVkICovCisJLmJJbnRlcmZhY2VDb3VudCA9IAkyLAkvLyBjb250cm9sICsgZGF0YQorCS5iRnVuY3Rpb25DbGFzcyA9CVVTQl9DTEFTU19DT01NLAorCS5iRnVuY3Rpb25TdWJDbGFzcyA9CVVTQl9DRENfU1VCQ0xBU1NfRVRIRVJORVQsCisJLmJGdW5jdGlvblByb3RvY29sID0JVVNCX0NEQ19QUk9UT19OT05FLAorCS8qIC5pRnVuY3Rpb24gPSBEWU5BTUlDICovCit9OworCiAvKiBmdWxsIHNwZWVkIHN1cHBvcnQ6ICovCiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgZnNfbm90aWZ5X2Rlc2MgX19pbml0ZGF0YSA9IHsKQEAgLTIwOCwxMSArMjI0LDEyIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqZXRoX2ZzX2Z1bmN0aW9uW10gX19pbml0ZGF0YSA9IHsKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmcm5kaXNfaWFkX2Rlc2NyaXB0b3IsCiAJLyogY29udHJvbCBpbnRlcmZhY2UgbWF0Y2hlcyBBQ00sIG5vdCBFdGhlcm5ldCAqLwogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZybmRpc19jb250cm9sX2ludGYsCiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmhlYWRlcl9kZXNjLAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZjYWxsX21nbXRfZGVzY3JpcHRvciwKLQkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmYWNtX2Rlc2NyaXB0b3IsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnJuZGlzX2FjbV9kZXNjcmlwdG9yLAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZybmRpc191bmlvbl9kZXNjLAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZmc19ub3RpZnlfZGVzYywKIAkvKiBkYXRhIGludGVyZmFjZSBoYXMgbm8gYWx0c2V0dGluZyAqLwpAQCAtMjUyLDExICsyNjksMTIgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICpldGhfaHNfZnVuY3Rpb25bXSBfX2luaXRkYXRhID0geworCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZybmRpc19pYWRfZGVzY3JpcHRvciwKIAkvKiBjb250cm9sIGludGVyZmFjZSBtYXRjaGVzIEFDTSwgbm90IEV0aGVybmV0ICovCiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnJuZGlzX2NvbnRyb2xfaW50ZiwKIAkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmaGVhZGVyX2Rlc2MsCiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmNhbGxfbWdtdF9kZXNjcmlwdG9yLAotCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZhY21fZGVzY3JpcHRvciwKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmcm5kaXNfYWNtX2Rlc2NyaXB0b3IsCiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnJuZGlzX3VuaW9uX2Rlc2MsCiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmhzX25vdGlmeV9kZXNjLAogCS8qIGRhdGEgaW50ZXJmYWNlIGhhcyBubyBhbHRzZXR0aW5nICovCkBAIC0yNzEsNiArMjg5LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgdXNiX3N0cmluZyBybmRpc19zdHJpbmdfZGVmc1tdID0gewogCVswXS5zID0gIlJORElTIENvbW11bmljYXRpb25zIENvbnRyb2wiLAogCVsxXS5zID0gIlJORElTIEV0aGVybmV0IERhdGEiLAorCVsyXS5zID0gIlJORElTIiwKIAl7ICB9IC8qIGVuZCBvZiBsaXN0ICovCiB9OwogCkBAIC01ODcsNiArNjA2LDcgQEAKIAlpZiAoc3RhdHVzIDwgMCkKIAkJZ290byBmYWlsOwogCXJuZGlzLT5jdHJsX2lkID0gc3RhdHVzOworCXJuZGlzX2lhZF9kZXNjcmlwdG9yLmJGaXJzdEludGVyZmFjZSA9IHN0YXR1czsKIAogCXJuZGlzX2NvbnRyb2xfaW50Zi5iSW50ZXJmYWNlTnVtYmVyID0gc3RhdHVzOwogCXJuZGlzX3VuaW9uX2Rlc2MuYk1hc3RlckludGVyZmFjZTAgPSBzdGF0dXM7CkBAIC03OTgsNiArODE4LDEzIEBACiAJCQlyZXR1cm4gc3RhdHVzOwogCQlybmRpc19zdHJpbmdfZGVmc1sxXS5pZCA9IHN0YXR1czsKIAkJcm5kaXNfZGF0YV9pbnRmLmlJbnRlcmZhY2UgPSBzdGF0dXM7CisKKwkJLyogSUFEIGlGdW5jdGlvbiBsYWJlbCAqLworCQlzdGF0dXMgPSB1c2Jfc3RyaW5nX2lkKGMtPmNkZXYpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXJldHVybiBzdGF0dXM7CisJCXJuZGlzX3N0cmluZ19kZWZzWzJdLmlkID0gc3RhdHVzOworCQlybmRpc19pYWRfZGVzY3JpcHRvci5pRnVuY3Rpb24gPSBzdGF0dXM7CiAJfQogCiAJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgb25lIG5ldyBpbnN0YW5jZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jCmluZGV4IDFlNmFhNTAuLjI5ZGZiMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMKQEAgLTI0OCw4ICsyNDgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAKLSNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+Ci0KICNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2dhZGdldC5oPgogCkBAIC0yNzQsMjEgKzI3MiwyMCBAQAogI2RlZmluZSBEUklWRVJfTkFNRQkJImdfZmlsZV9zdG9yYWdlIgogI2RlZmluZSBEUklWRVJfVkVSU0lPTgkJIjIwIE5vdmVtYmVyIDIwMDgiCiAKLXN0YXRpYyBjb25zdCBjaGFyIGxvbmduYW1lW10gPSBEUklWRVJfREVTQzsKLXN0YXRpYyBjb25zdCBjaGFyIHNob3J0bmFtZVtdID0gRFJJVkVSX05BTUU7CitzdGF0aWMgICAgICAgY2hhciBmc2dfc3RyaW5nX21hbnVmYWN0dXJlcls2NF07CitzdGF0aWMgY29uc3QgY2hhciBmc2dfc3RyaW5nX3Byb2R1Y3RbXSA9IERSSVZFUl9ERVNDOworc3RhdGljICAgICAgIGNoYXIgZnNnX3N0cmluZ19zZXJpYWxbMTNdOworc3RhdGljIGNvbnN0IGNoYXIgZnNnX3N0cmluZ19jb25maWdbXSA9ICJTZWxmLXBvd2VyZWQiOworc3RhdGljIGNvbnN0IGNoYXIgZnNnX3N0cmluZ19pbnRlcmZhY2VbXSA9ICJNYXNzIFN0b3JhZ2UiOworCisKKyNpbmNsdWRlICJzdG9yYWdlX2NvbW1vbi5jIgorCiAKIE1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CiBNT0RVTEVfQVVUSE9SKCJBbGFuIFN0ZXJuIik7CiBNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CiAKLS8qIFRoYW5rcyB0byBOZXRDaGlwIFRlY2hub2xvZ2llcyBmb3IgZG9uYXRpbmcgdGhpcyBwcm9kdWN0IElELgotICoKLSAqIERPIE5PVCBSRVVTRSBUSEVTRSBJRHMgd2l0aCBhbnkgb3RoZXIgZHJpdmVyISEgIEV2ZXIhIQotICogSW5zdGVhZDogIGFsbG9jYXRlIHlvdXIgb3duLCB1c2luZyBub3JtYWwgVVNCLUlGIHByb2NlZHVyZXMuICovCi0jZGVmaW5lIERSSVZFUl9WRU5ET1JfSUQJMHgwNTI1CS8vIE5ldENoaXAKLSNkZWZpbmUgRFJJVkVSX1BST0RVQ1RfSUQJMHhhNGE1CS8vIExpbnV4LVVTQiBGaWxlLWJhY2tlZCBTdG9yYWdlIEdhZGdldAotCi0KIC8qCiAgKiBUaGlzIGRyaXZlciBhc3N1bWVzIHNlbGYtcG93ZXJlZCBoYXJkd2FyZSBhbmQgaGFzIG5vIHdheSBmb3IgdXNlcnMgdG8KICAqIHRyaWdnZXIgcmVtb3RlIHdha2V1cC4gIEl0IHVzZXMgYXV0b2NvbmZpZ3VyYXRpb24gdG8gc2VsZWN0IGVuZHBvaW50cwpAQCAtMjk4LDU0ICsyOTUsMTIgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotI2RlZmluZSBMREJHKGx1bixmbXQsYXJncy4uLikgXAotCWRldl9kYmcoJihsdW4pLT5kZXYgLCBmbXQgLCAjIyBhcmdzKQotI2RlZmluZSBNREJHKGZtdCxhcmdzLi4uKSBcCi0JcHJfZGVidWcoRFJJVkVSX05BTUUgIjogIiBmbXQgLCAjIyBhcmdzKQotCi0jaWZuZGVmIERFQlVHCi0jdW5kZWYgVkVSQk9TRV9ERUJVRwotI3VuZGVmIERVTVBfTVNHUwotI2VuZGlmIC8qICFERUJVRyAqLwotCi0jaWZkZWYgVkVSQk9TRV9ERUJVRwotI2RlZmluZSBWTERCRwlMREJHCi0jZWxzZQotI2RlZmluZSBWTERCRyhsdW4sZm10LGFyZ3MuLi4pIFwKLQlkbyB7IH0gd2hpbGUgKDApCi0jZW5kaWYgLyogVkVSQk9TRV9ERUJVRyAqLwotCi0jZGVmaW5lIExFUlJPUihsdW4sZm10LGFyZ3MuLi4pIFwKLQlkZXZfZXJyKCYobHVuKS0+ZGV2ICwgZm10ICwgIyMgYXJncykKLSNkZWZpbmUgTFdBUk4obHVuLGZtdCxhcmdzLi4uKSBcCi0JZGV2X3dhcm4oJihsdW4pLT5kZXYgLCBmbXQgLCAjIyBhcmdzKQotI2RlZmluZSBMSU5GTyhsdW4sZm10LGFyZ3MuLi4pIFwKLQlkZXZfaW5mbygmKGx1biktPmRldiAsIGZtdCAsICMjIGFyZ3MpCi0KLSNkZWZpbmUgTUlORk8oZm10LGFyZ3MuLi4pIFwKLQlwcl9pbmZvKERSSVZFUl9OQU1FICI6ICIgZm10ICwgIyMgYXJncykKLQotI2RlZmluZSBEQkcoZCwgZm10LCBhcmdzLi4uKSBcCi0JZGV2X2RiZygmKGQpLT5nYWRnZXQtPmRldiAsIGZtdCAsICMjIGFyZ3MpCi0jZGVmaW5lIFZEQkcoZCwgZm10LCBhcmdzLi4uKSBcCi0JZGV2X3ZkYmcoJihkKS0+Z2FkZ2V0LT5kZXYgLCBmbXQgLCAjIyBhcmdzKQotI2RlZmluZSBFUlJPUihkLCBmbXQsIGFyZ3MuLi4pIFwKLQlkZXZfZXJyKCYoZCktPmdhZGdldC0+ZGV2ICwgZm10ICwgIyMgYXJncykKLSNkZWZpbmUgV0FSTklORyhkLCBmbXQsIGFyZ3MuLi4pIFwKLQlkZXZfd2FybigmKGQpLT5nYWRnZXQtPmRldiAsIGZtdCAsICMjIGFyZ3MpCi0jZGVmaW5lIElORk8oZCwgZm10LCBhcmdzLi4uKSBcCi0JZGV2X2luZm8oJihkKS0+Z2FkZ2V0LT5kZXYgLCBmbXQgLCAjIyBhcmdzKQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qIEVuY2Fwc3VsYXRlIHRoZSBtb2R1bGUgcGFyYW1ldGVyIHNldHRpbmdzICovCiAKLSNkZWZpbmUgTUFYX0xVTlMJOAotCiBzdGF0aWMgc3RydWN0IHsKLQljaGFyCQkqZmlsZVtNQVhfTFVOU107Ci0JaW50CQlyb1tNQVhfTFVOU107CisJY2hhcgkJKmZpbGVbRlNHX01BWF9MVU5TXTsKKwlpbnQJCXJvW0ZTR19NQVhfTFVOU107CiAJdW5zaWduZWQgaW50CW51bV9maWxlbmFtZXM7CiAJdW5zaWduZWQgaW50CW51bV9yb3M7CiAJdW5zaWduZWQgaW50CW5sdW5zOwpAQCAtMzcyLDggKzMyNyw4IEBACiAJLnJlbW92YWJsZQkJPSAwLAogCS5jYW5fc3RhbGwJCT0gMSwKIAkuY2Ryb20JCQk9IDAsCi0JLnZlbmRvcgkJCT0gRFJJVkVSX1ZFTkRPUl9JRCwKLQkucHJvZHVjdAkJPSBEUklWRVJfUFJPRFVDVF9JRCwKKwkudmVuZG9yCQkJPSBGU0dfVkVORE9SX0lELAorCS5wcm9kdWN0CQk9IEZTR19QUk9EVUNUX0lELAogCS5yZWxlYXNlCQk9IDB4ZmZmZiwJLy8gVXNlIGNvbnRyb2xsZXIgY2hpcCB0eXBlCiAJLmJ1ZmxlbgkJCT0gMTYzODQsCiAJfTsKQEAgLTQyNSwxMjUgKzM4MCw2IEBACiAjZW5kaWYgLyogQ09ORklHX1VTQl9GSUxFX1NUT1JBR0VfVEVTVCAqLwogCiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFNDU0kgZGV2aWNlIHR5cGVzICovCi0jZGVmaW5lIFRZUEVfRElTSwkweDAwCi0jZGVmaW5lIFRZUEVfQ0RST00JMHgwNQotCi0vKiBVU0IgcHJvdG9jb2wgdmFsdWUgPSB0aGUgdHJhbnNwb3J0IG1ldGhvZCAqLwotI2RlZmluZSBVU0JfUFJfQ0JJCTB4MDAJCS8vIENvbnRyb2wvQnVsay9JbnRlcnJ1cHQKLSNkZWZpbmUgVVNCX1BSX0NCCTB4MDEJCS8vIENvbnRyb2wvQnVsayB3L28gaW50ZXJydXB0Ci0jZGVmaW5lIFVTQl9QUl9CVUxLCTB4NTAJCS8vIEJ1bGstb25seQotCi0vKiBVU0Igc3ViY2xhc3MgdmFsdWUgPSB0aGUgcHJvdG9jb2wgZW5jYXBzdWxhdGlvbiAqLwotI2RlZmluZSBVU0JfU0NfUkJDCTB4MDEJCS8vIFJlZHVjZWQgQmxvY2sgQ29tbWFuZHMgKGZsYXNoKQotI2RlZmluZSBVU0JfU0NfODAyMAkweDAyCQkvLyBTRkYtODAyMGksIE1NQy0yLCBBVEFQSSAoQ0QtUk9NKQotI2RlZmluZSBVU0JfU0NfUUlDCTB4MDMJCS8vIFFJQy0xNTcgKHRhcGUpCi0jZGVmaW5lIFVTQl9TQ19VRkkJMHgwNAkJLy8gVUZJIChmbG9wcHkpCi0jZGVmaW5lIFVTQl9TQ184MDcwCTB4MDUJCS8vIFNGRi04MDcwaSAocmVtb3ZhYmxlKQotI2RlZmluZSBVU0JfU0NfU0NTSQkweDA2CQkvLyBUcmFuc3BhcmVudCBTQ1NJCi0KLS8qIEJ1bGstb25seSBkYXRhIHN0cnVjdHVyZXMgKi8KLQotLyogQ29tbWFuZCBCbG9jayBXcmFwcGVyICovCi1zdHJ1Y3QgYnVsa19jYl93cmFwIHsKLQlfX2xlMzIJU2lnbmF0dXJlOwkJLy8gQ29udGFpbnMgJ1VTQkMnCi0JdTMyCVRhZzsJCQkvLyBVbmlxdWUgcGVyIGNvbW1hbmQgaWQKLQlfX2xlMzIJRGF0YVRyYW5zZmVyTGVuZ3RoOwkvLyBTaXplIG9mIHRoZSBkYXRhCi0JdTgJRmxhZ3M7CQkJLy8gRGlyZWN0aW9uIGluIGJpdCA3Ci0JdTgJTHVuOwkJCS8vIExVTiAobm9ybWFsbHkgMCkKLQl1OAlMZW5ndGg7CQkJLy8gT2YgdGhlIENEQiwgPD0gTUFYX0NPTU1BTkRfU0laRQotCXU4CUNEQlsxNl07CQkvLyBDb21tYW5kIERhdGEgQmxvY2sKLX07Ci0KLSNkZWZpbmUgVVNCX0JVTEtfQ0JfV1JBUF9MRU4JMzEKLSNkZWZpbmUgVVNCX0JVTEtfQ0JfU0lHCQkweDQzNDI1MzU1CS8vIFNwZWxscyBvdXQgVVNCQwotI2RlZmluZSBVU0JfQlVMS19JTl9GTEFHCTB4ODAKLQotLyogQ29tbWFuZCBTdGF0dXMgV3JhcHBlciAqLwotc3RydWN0IGJ1bGtfY3Nfd3JhcCB7Ci0JX19sZTMyCVNpZ25hdHVyZTsJCS8vIFNob3VsZCA9ICdVU0JTJwotCXUzMglUYWc7CQkJLy8gU2FtZSBhcyBvcmlnaW5hbCBjb21tYW5kCi0JX19sZTMyCVJlc2lkdWU7CQkvLyBBbW91bnQgbm90IHRyYW5zZmVycmVkCi0JdTgJU3RhdHVzOwkJCS8vIFNlZSBiZWxvdwotfTsKLQotI2RlZmluZSBVU0JfQlVMS19DU19XUkFQX0xFTgkxMwotI2RlZmluZSBVU0JfQlVMS19DU19TSUcJCTB4NTM0MjUzNTUJLy8gU3BlbGxzIG91dCAnVVNCUycKLSNkZWZpbmUgVVNCX1NUQVRVU19QQVNTCQkwCi0jZGVmaW5lIFVTQl9TVEFUVVNfRkFJTAkJMQotI2RlZmluZSBVU0JfU1RBVFVTX1BIQVNFX0VSUk9SCTIKLQotLyogQnVsay1vbmx5IGNsYXNzIHNwZWNpZmljIHJlcXVlc3RzICovCi0jZGVmaW5lIFVTQl9CVUxLX1JFU0VUX1JFUVVFU1QJCTB4ZmYKLSNkZWZpbmUgVVNCX0JVTEtfR0VUX01BWF9MVU5fUkVRVUVTVAkweGZlCi0KLQotLyogQ0JJIEludGVycnVwdCBkYXRhIHN0cnVjdHVyZSAqLwotc3RydWN0IGludGVycnVwdF9kYXRhIHsKLQl1OAliVHlwZTsKLQl1OAliVmFsdWU7Ci19OwotCi0jZGVmaW5lIENCSV9JTlRFUlJVUFRfREFUQV9MRU4JCTIKLQotLyogQ0JJIEFjY2VwdCBEZXZpY2UtU3BlY2lmaWMgQ29tbWFuZCByZXF1ZXN0ICovCi0jZGVmaW5lIFVTQl9DQklfQURTQ19SRVFVRVNUCQkweDAwCi0KLQotI2RlZmluZSBNQVhfQ09NTUFORF9TSVpFCTE2CS8vIExlbmd0aCBvZiBhIFNDU0kgQ29tbWFuZCBEYXRhIEJsb2NrCi0KLS8qIFNDU0kgY29tbWFuZHMgdGhhdCB3ZSByZWNvZ25pemUgKi8KLSNkZWZpbmUgU0NfRk9STUFUX1VOSVQJCQkweDA0Ci0jZGVmaW5lIFNDX0lOUVVJUlkJCQkweDEyCi0jZGVmaW5lIFNDX01PREVfU0VMRUNUXzYJCTB4MTUKLSNkZWZpbmUgU0NfTU9ERV9TRUxFQ1RfMTAJCTB4NTUKLSNkZWZpbmUgU0NfTU9ERV9TRU5TRV82CQkJMHgxYQotI2RlZmluZSBTQ19NT0RFX1NFTlNFXzEwCQkweDVhCi0jZGVmaW5lIFNDX1BSRVZFTlRfQUxMT1dfTUVESVVNX1JFTU9WQUwJMHgxZQotI2RlZmluZSBTQ19SRUFEXzYJCQkweDA4Ci0jZGVmaW5lIFNDX1JFQURfMTAJCQkweDI4Ci0jZGVmaW5lIFNDX1JFQURfMTIJCQkweGE4Ci0jZGVmaW5lIFNDX1JFQURfQ0FQQUNJVFkJCTB4MjUKLSNkZWZpbmUgU0NfUkVBRF9GT1JNQVRfQ0FQQUNJVElFUwkweDIzCi0jZGVmaW5lIFNDX1JFQURfSEVBREVSCQkJMHg0NAotI2RlZmluZSBTQ19SRUFEX1RPQwkJCTB4NDMKLSNkZWZpbmUgU0NfUkVMRUFTRQkJCTB4MTcKLSNkZWZpbmUgU0NfUkVRVUVTVF9TRU5TRQkJMHgwMwotI2RlZmluZSBTQ19SRVNFUlZFCQkJMHgxNgotI2RlZmluZSBTQ19TRU5EX0RJQUdOT1NUSUMJCTB4MWQKLSNkZWZpbmUgU0NfU1RBUlRfU1RPUF9VTklUCQkweDFiCi0jZGVmaW5lIFNDX1NZTkNIUk9OSVpFX0NBQ0hFCQkweDM1Ci0jZGVmaW5lIFNDX1RFU1RfVU5JVF9SRUFEWQkJMHgwMAotI2RlZmluZSBTQ19WRVJJRlkJCQkweDJmCi0jZGVmaW5lIFNDX1dSSVRFXzYJCQkweDBhCi0jZGVmaW5lIFNDX1dSSVRFXzEwCQkJMHgyYQotI2RlZmluZSBTQ19XUklURV8xMgkJCTB4YWEKLQotLyogU0NTSSBTZW5zZSBLZXkvQWRkaXRpb25hbCBTZW5zZSBDb2RlL0FTQyBRdWFsaWZpZXIgdmFsdWVzICovCi0jZGVmaW5lIFNTX05PX1NFTlNFCQkJCTAKLSNkZWZpbmUgU1NfQ09NTVVOSUNBVElPTl9GQUlMVVJFCQkweDA0MDgwMAotI2RlZmluZSBTU19JTlZBTElEX0NPTU1BTkQJCQkweDA1MjAwMAotI2RlZmluZSBTU19JTlZBTElEX0ZJRUxEX0lOX0NEQgkJCTB4MDUyNDAwCi0jZGVmaW5lIFNTX0xPR0lDQUxfQkxPQ0tfQUREUkVTU19PVVRfT0ZfUkFOR0UJMHgwNTIxMDAKLSNkZWZpbmUgU1NfTE9HSUNBTF9VTklUX05PVF9TVVBQT1JURUQJCTB4MDUyNTAwCi0jZGVmaW5lIFNTX01FRElVTV9OT1RfUFJFU0VOVAkJCTB4MDIzYTAwCi0jZGVmaW5lIFNTX01FRElVTV9SRU1PVkFMX1BSRVZFTlRFRAkJMHgwNTUzMDIKLSNkZWZpbmUgU1NfTk9UX1JFQURZX1RPX1JFQURZX1RSQU5TSVRJT04JMHgwNjI4MDAKLSNkZWZpbmUgU1NfUkVTRVRfT0NDVVJSRUQJCQkweDA2MjkwMAotI2RlZmluZSBTU19TQVZJTkdfUEFSQU1FVEVSU19OT1RfU1VQUE9SVEVECTB4MDUzOTAwCi0jZGVmaW5lIFNTX1VOUkVDT1ZFUkVEX1JFQURfRVJST1IJCTB4MDMxMTAwCi0jZGVmaW5lIFNTX1dSSVRFX0VSUk9SCQkJCTB4MDMwYzAyCi0jZGVmaW5lIFNTX1dSSVRFX1BST1RFQ1RFRAkJCTB4MDcyNzAwCi0KLSNkZWZpbmUgU0soeCkJCSgodTgpICgoeCkgPj4gMTYpKQkvLyBTZW5zZSBLZXkgYnl0ZSwgZXRjLgotI2RlZmluZSBBU0MoeCkJCSgodTgpICgoeCkgPj4gOCkpCi0jZGVmaW5lIEFTQ1EoeCkJCSgodTgpICh4KSkKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCiAvKgogICogVGhlc2UgZGVmaW5pdGlvbnMgd2lsbCBwZXJtaXQgdGhlIGNvbXBpbGVyIHRvIGF2b2lkIGdlbmVyYXRpbmcgY29kZSBmb3IKICAqIHBhcnRzIG9mIHRoZSBkcml2ZXIgdGhhdCBhcmVuJ3QgdXNlZCBpbiB0aGUgbm9uLVRFU1QgdmVyc2lvbi4gIEV2ZW4gZ2NjCkBAIC01NjYsODEgKzQwMiw4IEBACiAjZW5kaWYgLyogQ09ORklHX1VTQl9GSUxFX1NUT1JBR0VfVEVTVCAqLwogCiAKLXN0cnVjdCBsdW4gewotCXN0cnVjdCBmaWxlCSpmaWxwOwotCWxvZmZfdAkJZmlsZV9sZW5ndGg7Ci0JbG9mZl90CQludW1fc2VjdG9yczsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLQl1bnNpZ25lZCBpbnQJcm8gOiAxOwotCXVuc2lnbmVkIGludAlwcmV2ZW50X21lZGl1bV9yZW1vdmFsIDogMTsKLQl1bnNpZ25lZCBpbnQJcmVnaXN0ZXJlZCA6IDE7Ci0JdW5zaWduZWQgaW50CWluZm9fdmFsaWQgOiAxOwotCi0JdTMyCQlzZW5zZV9kYXRhOwotCXUzMgkJc2Vuc2VfZGF0YV9pbmZvOwotCXUzMgkJdW5pdF9hdHRlbnRpb25fZGF0YTsKLQotCXN0cnVjdCBkZXZpY2UJZGV2OwotfTsKLQotI2RlZmluZSBiYWNraW5nX2ZpbGVfaXNfb3BlbihjdXJsdW4pCSgoY3VybHVuKS0+ZmlscCAhPSBOVUxMKQotCi1zdGF0aWMgc3RydWN0IGx1biAqZGV2X3RvX2x1bihzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBsdW4sIGRldik7Ci19Ci0KLQotLyogQmlnIGVub3VnaCB0byBob2xkIG91ciBiaWdnZXN0IGRlc2NyaXB0b3IgKi8KLSNkZWZpbmUgRVAwX0JVRlNJWkUJMjU2Ci0jZGVmaW5lIERFTEFZRURfU1RBVFVTCShFUDBfQlVGU0laRSArIDk5OSkJLy8gQW4gaW1wb3NzaWJseSBsYXJnZSB2YWx1ZQotCi0vKiBOdW1iZXIgb2YgYnVmZmVycyB3ZSB3aWxsIHVzZS4gIDIgaXMgZW5vdWdoIGZvciBkb3VibGUtYnVmZmVyaW5nICovCi0jZGVmaW5lIE5VTV9CVUZGRVJTCTIKLQotZW51bSBmc2dfYnVmZmVyX3N0YXRlIHsKLQlCVUZfU1RBVEVfRU1QVFkgPSAwLAotCUJVRl9TVEFURV9GVUxMLAotCUJVRl9TVEFURV9CVVNZCi19OwotCi1zdHJ1Y3QgZnNnX2J1ZmZoZCB7Ci0Jdm9pZAkJCQkqYnVmOwotCWVudW0gZnNnX2J1ZmZlcl9zdGF0ZQkJc3RhdGU7Ci0Jc3RydWN0IGZzZ19idWZmaGQJCSpuZXh0OwotCi0JLyogVGhlIE5ldENoaXAgMjI4MCBpcyBmYXN0ZXIsIGFuZCBoYW5kbGVzIHNvbWUgcHJvdG9jb2wgZmF1bHRzCi0JICogYmV0dGVyLCBpZiB3ZSBkb24ndCBzdWJtaXQgYW55IHNob3J0IGJ1bGstb3V0IHJlYWQgcmVxdWVzdHMuCi0JICogU28gd2Ugd2lsbCByZWNvcmQgdGhlIGludGVuZGVkIHJlcXVlc3QgbGVuZ3RoIGhlcmUuICovCi0JdW5zaWduZWQgaW50CQkJYnVsa19vdXRfaW50ZW5kZWRfbGVuZ3RoOwotCi0Jc3RydWN0IHVzYl9yZXF1ZXN0CQkqaW5yZXE7Ci0JaW50CQkJCWlucmVxX2J1c3k7Ci0Jc3RydWN0IHVzYl9yZXF1ZXN0CQkqb3V0cmVxOwotCWludAkJCQlvdXRyZXFfYnVzeTsKLX07Ci0KLWVudW0gZnNnX3N0YXRlIHsKLQlGU0dfU1RBVEVfQ09NTUFORF9QSEFTRSA9IC0xMCwJCS8vIFRoaXMgb25lIGlzbid0IHVzZWQgYW55d2hlcmUKLQlGU0dfU1RBVEVfREFUQV9QSEFTRSwKLQlGU0dfU1RBVEVfU1RBVFVTX1BIQVNFLAotCi0JRlNHX1NUQVRFX0lETEUgPSAwLAotCUZTR19TVEFURV9BQk9SVF9CVUxLX09VVCwKLQlGU0dfU1RBVEVfUkVTRVQsCi0JRlNHX1NUQVRFX0lOVEVSRkFDRV9DSEFOR0UsCi0JRlNHX1NUQVRFX0NPTkZJR19DSEFOR0UsCi0JRlNHX1NUQVRFX0RJU0NPTk5FQ1QsCi0JRlNHX1NUQVRFX0VYSVQsCi0JRlNHX1NUQVRFX1RFUk1JTkFURUQKLX07Ci0KLWVudW0gZGF0YV9kaXJlY3Rpb24gewotCURBVEFfRElSX1VOS05PV04gPSAwLAotCURBVEFfRElSX0ZST01fSE9TVCwKLQlEQVRBX0RJUl9UT19IT1NULAotCURBVEFfRElSX05PTkUKLX07CiAKIHN0cnVjdCBmc2dfZGV2IHsKIAkvKiBsb2NrIHByb3RlY3RzOiBzdGF0ZSwgYWxsIHRoZSByZXFfYnVzeSdzLCBhbmQgY2JidWZfY21uZCAqLwpAQCAtNjYyLDcgKzQyNSw3IEBACiAJaW50CQkJaW50cmVxX2J1c3k7CiAJc3RydWN0IGZzZ19idWZmaGQJKmludHJfYnVmZmhkOwogCi0gCXVuc2lnbmVkIGludAkJYnVsa19vdXRfbWF4cGFja2V0OworCXVuc2lnbmVkIGludAkJYnVsa19vdXRfbWF4cGFja2V0OwogCWVudW0gZnNnX3N0YXRlCQlzdGF0ZTsJCS8vIEZvciBleGNlcHRpb24gaGFuZGxpbmcKIAl1bnNpZ25lZCBpbnQJCWV4Y2VwdGlvbl9yZXFfdGFnOwogCkBAIC02ODcsNyArNDUwLDcgQEAKIAogCXN0cnVjdCBmc2dfYnVmZmhkCSpuZXh0X2J1ZmZoZF90b19maWxsOwogCXN0cnVjdCBmc2dfYnVmZmhkCSpuZXh0X2J1ZmZoZF90b19kcmFpbjsKLQlzdHJ1Y3QgZnNnX2J1ZmZoZAlidWZmaGRzW05VTV9CVUZGRVJTXTsKKwlzdHJ1Y3QgZnNnX2J1ZmZoZAlidWZmaGRzW0ZTR19OVU1fQlVGRkVSU107CiAKIAlpbnQJCQl0aHJlYWRfd2FrZXVwX25lZWRlZDsKIAlzdHJ1Y3QgY29tcGxldGlvbgl0aHJlYWRfbm90aWZpZXI7CkBAIC03MTIsOCArNDc1LDggQEAKIAl1OAkJCWNiYnVmX2NtbmRbTUFYX0NPTU1BTkRfU0laRV07CiAKIAl1bnNpZ25lZCBpbnQJCW5sdW5zOwotCXN0cnVjdCBsdW4JCSpsdW5zOwotCXN0cnVjdCBsdW4JCSpjdXJsdW47CisJc3RydWN0IGZzZ19sdW4JCSpsdW5zOworCXN0cnVjdCBmc2dfbHVuCQkqY3VybHVuOwogfTsKIAogdHlwZWRlZiB2b2lkICgqZnNnX3JvdXRpbmVfdCkoc3RydWN0IGZzZ19kZXYgKik7CkBAIC03MzksNDkgKzUwMiw5IEBACiBzdGF0aWMgc3RydWN0IGZzZ19kZXYJCQkqdGhlX2ZzZzsKIHN0YXRpYyBzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIJCWZzZ19kcml2ZXI7CiAKLXN0YXRpYyB2b2lkCWNsb3NlX2JhY2tpbmdfZmlsZShzdHJ1Y3QgbHVuICpjdXJsdW4pOwotCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSNpZmRlZiBEVU1QX01TR1MKLQotc3RhdGljIHZvaWQgZHVtcF9tc2coc3RydWN0IGZzZ19kZXYgKmZzZywgY29uc3QgY2hhciAqbGFiZWwsCi0JCWNvbnN0IHU4ICpidWYsIHVuc2lnbmVkIGludCBsZW5ndGgpCi17Ci0JaWYgKGxlbmd0aCA8IDUxMikgewotCQlEQkcoZnNnLCAiJXMsIGxlbmd0aCAldTpcbiIsIGxhYmVsLCBsZW5ndGgpOwotCQlwcmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCAiIiwgRFVNUF9QUkVGSVhfT0ZGU0VULAotCQkJCTE2LCAxLCBidWYsIGxlbmd0aCwgMCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBkdW1wX2NkYihzdHJ1Y3QgZnNnX2RldiAqZnNnKQote30KLQotI2Vsc2UKLQotc3RhdGljIHZvaWQgZHVtcF9tc2coc3RydWN0IGZzZ19kZXYgKmZzZywgY29uc3QgY2hhciAqbGFiZWwsCi0JCWNvbnN0IHU4ICpidWYsIHVuc2lnbmVkIGludCBsZW5ndGgpCi17fQotCi0jaWZkZWYgVkVSQk9TRV9ERUJVRwotCi1zdGF0aWMgdm9pZCBkdW1wX2NkYihzdHJ1Y3QgZnNnX2RldiAqZnNnKQotewotCXByaW50X2hleF9kdW1wKEtFUk5fREVCVUcsICJTQ1NJIENEQjogIiwgRFVNUF9QUkVGSVhfTk9ORSwKLQkJCTE2LCAxLCBmc2ctPmNtbmQsIGZzZy0+Y21uZF9zaXplLCAwKTsKLX0KLQotI2Vsc2UKLQotc3RhdGljIHZvaWQgZHVtcF9jZGIoc3RydWN0IGZzZ19kZXYgKmZzZykKLXt9Ci0KLSNlbmRpZiAvKiBWRVJCT1NFX0RFQlVHICovCi0jZW5kaWYgLyogRFVNUF9NU0dTICovCi0KLQogc3RhdGljIGludCBmc2dfc2V0X2hhbHQoc3RydWN0IGZzZ19kZXYgKmZzZywgc3RydWN0IHVzYl9lcCAqZXApCiB7CiAJY29uc3QgY2hhcgkqbmFtZTsKQEAgLTc5OSwyNiArNTIyLDExIEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLS8qIFJvdXRpbmVzIGZvciB1bmFsaWduZWQgZGF0YSBhY2Nlc3MgKi8KLQotc3RhdGljIHUzMiBnZXRfdW5hbGlnbmVkX2JlMjQodTggKmJ1ZikKLXsKLQlyZXR1cm4gMHhmZmZmZmYgJiAodTMyKSBnZXRfdW5hbGlnbmVkX2JlMzIoYnVmIC0gMSk7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQogLyoKICAqIERFU0NSSVBUT1JTIC4uLiBtb3N0IGFyZSBzdGF0aWMsIGJ1dCBzdHJpbmdzIGFuZCAoZnVsbCkgY29uZmlndXJhdGlvbgogICogZGVzY3JpcHRvcnMgYXJlIGJ1aWx0IG9uIGRlbWFuZC4gIEFsc28gdGhlIChzdGF0aWMpIGNvbmZpZyBhbmQgaW50ZXJmYWNlCiAgKiBkZXNjcmlwdG9ycyBhcmUgYWRqdXN0ZWQgZHVyaW5nIGZzZ19iaW5kKCkuCiAgKi8KLSNkZWZpbmUgU1RSSU5HX01BTlVGQUNUVVJFUgkxCi0jZGVmaW5lIFNUUklOR19QUk9EVUNUCQkyCi0jZGVmaW5lIFNUUklOR19TRVJJQUwJCTMKLSNkZWZpbmUgU1RSSU5HX0NPTkZJRwkJNAotI2RlZmluZSBTVFJJTkdfSU5URVJGQUNFCTUKIAogLyogVGhlcmUgaXMgb25seSBvbmUgY29uZmlndXJhdGlvbi4gKi8KICNkZWZpbmUJQ09ORklHX1ZBTFVFCQkxCkBAIC04MzIsMTMgKzU0MCwxMyBAQAogCS5iRGV2aWNlQ2xhc3MgPQkJVVNCX0NMQVNTX1BFUl9JTlRFUkZBQ0UsCiAKIAkvKiBUaGUgbmV4dCB0aHJlZSB2YWx1ZXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgbW9kdWxlIHBhcmFtZXRlcnMgKi8KLQkuaWRWZW5kb3IgPQkJY3B1X3RvX2xlMTYoRFJJVkVSX1ZFTkRPUl9JRCksCi0JLmlkUHJvZHVjdCA9CQljcHVfdG9fbGUxNihEUklWRVJfUFJPRFVDVF9JRCksCisJLmlkVmVuZG9yID0JCWNwdV90b19sZTE2KEZTR19WRU5ET1JfSUQpLAorCS5pZFByb2R1Y3QgPQkJY3B1X3RvX2xlMTYoRlNHX1BST0RVQ1RfSUQpLAogCS5iY2REZXZpY2UgPQkJY3B1X3RvX2xlMTYoMHhmZmZmKSwKIAotCS5pTWFudWZhY3R1cmVyID0JU1RSSU5HX01BTlVGQUNUVVJFUiwKLQkuaVByb2R1Y3QgPQkJU1RSSU5HX1BST0RVQ1QsCi0JLmlTZXJpYWxOdW1iZXIgPQlTVFJJTkdfU0VSSUFMLAorCS5pTWFudWZhY3R1cmVyID0JRlNHX1NUUklOR19NQU5VRkFDVFVSRVIsCisJLmlQcm9kdWN0ID0JCUZTR19TVFJJTkdfUFJPRFVDVCwKKwkuaVNlcmlhbE51bWJlciA9CUZTR19TVFJJTkdfU0VSSUFMLAogCS5iTnVtQ29uZmlndXJhdGlvbnMgPQkxLAogfTsKIApAQCAtODUwLDg2ICs1NTgsMTIgQEAKIAkvKiB3VG90YWxMZW5ndGggY29tcHV0ZWQgYnkgdXNiX2dhZGdldF9jb25maWdfYnVmKCkgKi8KIAkuYk51bUludGVyZmFjZXMgPQkxLAogCS5iQ29uZmlndXJhdGlvblZhbHVlID0JQ09ORklHX1ZBTFVFLAotCS5pQ29uZmlndXJhdGlvbiA9CVNUUklOR19DT05GSUcsCisJLmlDb25maWd1cmF0aW9uID0JRlNHX1NUUklOR19DT05GSUcsCiAJLmJtQXR0cmlidXRlcyA9CQlVU0JfQ09ORklHX0FUVF9PTkUgfCBVU0JfQ09ORklHX0FUVF9TRUxGUE9XRVIsCiAJLmJNYXhQb3dlciA9CQlDT05GSUdfVVNCX0dBREdFVF9WQlVTX0RSQVcgLyAyLAogfTsKIAotc3RhdGljIHN0cnVjdCB1c2Jfb3RnX2Rlc2NyaXB0b3IKLW90Z19kZXNjID0gewotCS5iTGVuZ3RoID0JCXNpemVvZihvdGdfZGVzYyksCi0JLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9PVEcsCiAKLQkuYm1BdHRyaWJ1dGVzID0JCVVTQl9PVEdfU1JQLAotfTsKLQotLyogVGhlcmUgaXMgb25seSBvbmUgaW50ZXJmYWNlLiAqLwotCi1zdGF0aWMgc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvcgotaW50Zl9kZXNjID0gewotCS5iTGVuZ3RoID0JCXNpemVvZiBpbnRmX2Rlc2MsCi0JLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9JTlRFUkZBQ0UsCi0KLQkuYk51bUVuZHBvaW50cyA9CTIsCQkvLyBBZGp1c3RlZCBkdXJpbmcgZnNnX2JpbmQoKQotCS5iSW50ZXJmYWNlQ2xhc3MgPQlVU0JfQ0xBU1NfTUFTU19TVE9SQUdFLAotCS5iSW50ZXJmYWNlU3ViQ2xhc3MgPQlVU0JfU0NfU0NTSSwJLy8gQWRqdXN0ZWQgZHVyaW5nIGZzZ19iaW5kKCkKLQkuYkludGVyZmFjZVByb3RvY29sID0JVVNCX1BSX0JVTEssCS8vIEFkanVzdGVkIGR1cmluZyBmc2dfYmluZCgpCi0JLmlJbnRlcmZhY2UgPQkJU1RSSU5HX0lOVEVSRkFDRSwKLX07Ci0KLS8qIFRocmVlIGZ1bGwtc3BlZWQgZW5kcG9pbnQgZGVzY3JpcHRvcnM6IGJ1bGstaW4sIGJ1bGstb3V0LAotICogYW5kIGludGVycnVwdC1pbi4gKi8KLQotc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgotZnNfYnVsa19pbl9kZXNjID0gewotCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAotCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCi0KLQkuYkVuZHBvaW50QWRkcmVzcyA9CVVTQl9ESVJfSU4sCi0JLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAotCS8qIHdNYXhQYWNrZXRTaXplIHNldCBieSBhdXRvY29uZmlndXJhdGlvbiAqLwotfTsKLQotc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgotZnNfYnVsa19vdXRfZGVzYyA9IHsKLQkuYkxlbmd0aCA9CQlVU0JfRFRfRU5EUE9JTlRfU0laRSwKLQkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0VORFBPSU5ULAotCi0JLmJFbmRwb2ludEFkZHJlc3MgPQlVU0JfRElSX09VVCwKLQkuYm1BdHRyaWJ1dGVzID0JCVVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCi0JLyogd01heFBhY2tldFNpemUgc2V0IGJ5IGF1dG9jb25maWd1cmF0aW9uICovCi19OwotCi1zdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCi1mc19pbnRyX2luX2Rlc2MgPSB7Ci0JLmJMZW5ndGggPQkJVVNCX0RUX0VORFBPSU5UX1NJWkUsCi0JLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKLQotCS5iRW5kcG9pbnRBZGRyZXNzID0JVVNCX0RJUl9JTiwKLQkuYm1BdHRyaWJ1dGVzID0JCVVTQl9FTkRQT0lOVF9YRkVSX0lOVCwKLQkud01heFBhY2tldFNpemUgPQljcHVfdG9fbGUxNigyKSwKLQkuYkludGVydmFsID0JCTMyLAkvLyBmcmFtZXMgLT4gMzIgbXMKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICpmc19mdW5jdGlvbltdID0gewotCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZvdGdfZGVzYywKLQkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmaW50Zl9kZXNjLAotCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZmc19idWxrX2luX2Rlc2MsCi0JKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmZzX2J1bGtfb3V0X2Rlc2MsCi0JKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmZzX2ludHJfaW5fZGVzYywKLQlOVUxMLAotfTsKLSNkZWZpbmUgRlNfRlVOQ1RJT05fUFJFX0VQX0VOVFJJRVMJMgotCi0KLS8qCi0gKiBVU0IgMi4wIGRldmljZXMgbmVlZCB0byBleHBvc2UgYm90aCBoaWdoIHNwZWVkIGFuZCBmdWxsIHNwZWVkCi0gKiBkZXNjcmlwdG9ycywgdW5sZXNzIHRoZXkgb25seSBydW4gYXQgZnVsbCBzcGVlZC4KLSAqCi0gKiBUaGF0IG1lYW5zIGFsdGVybmF0ZSBlbmRwb2ludCBkZXNjcmlwdG9ycyAoYmlnZ2VyIHBhY2tldHMpCi0gKiBhbmQgYSAiZGV2aWNlIHF1YWxpZmllciIgLi4uIHBsdXMgbW9yZSBjb25zdHJ1Y3Rpb24gb3B0aW9ucwotICogZm9yIHRoZSBjb25maWcgZGVzY3JpcHRvci4KLSAqLwogc3RhdGljIHN0cnVjdCB1c2JfcXVhbGlmaWVyX2Rlc2NyaXB0b3IKIGRldl9xdWFsaWZpZXIgPSB7CiAJLmJMZW5ndGggPQkJc2l6ZW9mIGRldl9xdWFsaWZpZXIsCkBAIC05NDEsNzggKzU3NSw2IEBACiAJLmJOdW1Db25maWd1cmF0aW9ucyA9CTEsCiB9OwogCi1zdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCi1oc19idWxrX2luX2Rlc2MgPSB7Ci0JLmJMZW5ndGggPQkJVVNCX0RUX0VORFBPSU5UX1NJWkUsCi0JLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKLQotCS8qIGJFbmRwb2ludEFkZHJlc3MgY29waWVkIGZyb20gZnNfYnVsa19pbl9kZXNjIGR1cmluZyBmc2dfYmluZCgpICovCi0JLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAotCS53TWF4UGFja2V0U2l6ZSA9CWNwdV90b19sZTE2KDUxMiksCi19OwotCi1zdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCi1oc19idWxrX291dF9kZXNjID0gewotCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAotCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCi0KLQkvKiBiRW5kcG9pbnRBZGRyZXNzIGNvcGllZCBmcm9tIGZzX2J1bGtfb3V0X2Rlc2MgZHVyaW5nIGZzZ19iaW5kKCkgKi8KLQkuYm1BdHRyaWJ1dGVzID0JCVVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCi0JLndNYXhQYWNrZXRTaXplID0JY3B1X3RvX2xlMTYoNTEyKSwKLQkuYkludGVydmFsID0JCTEsCS8vIE5BSyBldmVyeSAxIHVmcmFtZQotfTsKLQotc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgotaHNfaW50cl9pbl9kZXNjID0gewotCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAotCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCi0KLQkvKiBiRW5kcG9pbnRBZGRyZXNzIGNvcGllZCBmcm9tIGZzX2ludHJfaW5fZGVzYyBkdXJpbmcgZnNnX2JpbmQoKSAqLwotCS5ibUF0dHJpYnV0ZXMgPQkJVVNCX0VORFBPSU5UX1hGRVJfSU5ULAotCS53TWF4UGFja2V0U2l6ZSA9CWNwdV90b19sZTE2KDIpLAotCS5iSW50ZXJ2YWwgPQkJOSwJLy8gMioqKDktMSkgPSAyNTYgdWZyYW1lcyAtPiAzMiBtcwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKmhzX2Z1bmN0aW9uW10gPSB7Ci0JKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJm90Z19kZXNjLAotCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZpbnRmX2Rlc2MsCi0JKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmhzX2J1bGtfaW5fZGVzYywKLQkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmaHNfYnVsa19vdXRfZGVzYywKLQkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmaHNfaW50cl9pbl9kZXNjLAotCU5VTEwsCi19OwotI2RlZmluZSBIU19GVU5DVElPTl9QUkVfRVBfRU5UUklFUwkyCi0KLS8qIE1heHBhY2tldCBhbmQgb3RoZXIgdHJhbnNmZXIgY2hhcmFjdGVyaXN0aWNzIHZhcnkgYnkgc3BlZWQuICovCi1zdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICoKLWVwX2Rlc2Moc3RydWN0IHVzYl9nYWRnZXQgKmcsIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZnMsCi0JCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqaHMpCi17Ci0JaWYgKGdhZGdldF9pc19kdWFsc3BlZWQoZykgJiYgZy0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpCi0JCXJldHVybiBoczsKLQlyZXR1cm4gZnM7Ci19Ci0KLQotLyogVGhlIENCSSBzcGVjaWZpY2F0aW9uIGxpbWl0cyB0aGUgc2VyaWFsIHN0cmluZyB0byAxMiB1cHBlcmNhc2UgaGV4YWRlY2ltYWwKLSAqIGNoYXJhY3RlcnMuICovCi1zdGF0aWMgY2hhcgkJCQltYW51ZmFjdHVyZXJbNjRdOwotc3RhdGljIGNoYXIJCQkJc2VyaWFsWzEzXTsKLQotLyogU3RhdGljIHN0cmluZ3MsIGluIFVURi04IChmb3Igc2ltcGxpY2l0eSB3ZSB1c2Ugb25seSBBU0NJSSBjaGFyYWN0ZXJzKSAqLwotc3RhdGljIHN0cnVjdCB1c2Jfc3RyaW5nCQlzdHJpbmdzW10gPSB7Ci0Je1NUUklOR19NQU5VRkFDVFVSRVIsCW1hbnVmYWN0dXJlcn0sCi0Je1NUUklOR19QUk9EVUNULAlsb25nbmFtZX0sCi0Je1NUUklOR19TRVJJQUwsCQlzZXJpYWx9LAotCXtTVFJJTkdfQ09ORklHLAkJIlNlbGYtcG93ZXJlZCJ9LAotCXtTVFJJTkdfSU5URVJGQUNFLAkiTWFzcyBTdG9yYWdlIn0sCi0Je30KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2dhZGdldF9zdHJpbmdzCXN0cmluZ3RhYiA9IHsKLQkubGFuZ3VhZ2UJPSAweDA0MDksCQkvLyBlbi11cwotCS5zdHJpbmdzCT0gc3RyaW5ncywKLX07CiAKIAogLyoKQEAgLTEwMzIsMTAgKzU5NCw5IEBACiAKIAlpZiAoZ2FkZ2V0X2lzX2R1YWxzcGVlZChnYWRnZXQpICYmIHR5cGUgPT0gVVNCX0RUX09USEVSX1NQRUVEX0NPTkZJRykKIAkJc3BlZWQgPSAoVVNCX1NQRUVEX0ZVTEwgKyBVU0JfU1BFRURfSElHSCkgLSBzcGVlZDsKLQlpZiAoZ2FkZ2V0X2lzX2R1YWxzcGVlZChnYWRnZXQpICYmIHNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQotCQlmdW5jdGlvbiA9IGhzX2Z1bmN0aW9uOwotCWVsc2UKLQkJZnVuY3Rpb24gPSBmc19mdW5jdGlvbjsKKwlmdW5jdGlvbiA9IGdhZGdldF9pc19kdWFsc3BlZWQoZ2FkZ2V0KSAmJiBzcGVlZCA9PSBVU0JfU1BFRURfSElHSAorCQk/IChjb25zdCBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICoqKWZzZ19oc19mdW5jdGlvbgorCQk6IChjb25zdCBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICoqKWZzZ19mc19mdW5jdGlvbjsKIAogCS8qIGZvciBub3csIGRvbid0IGFkdmVydGlzZSBzcnAtb25seSBkZXZpY2VzICovCiAJaWYgKCFnYWRnZXRfaXNfb3RnKGdhZGdldCkpCkBAIC0xMzg2LDcgKzk0Nyw3IEBACiAJCQlWREJHKGZzZywgImdldCBzdHJpbmcgZGVzY3JpcHRvclxuIik7CiAKIAkJCS8qIHdJbmRleCA9PSBsYW5ndWFnZSBjb2RlICovCi0JCQl2YWx1ZSA9IHVzYl9nYWRnZXRfZ2V0X3N0cmluZygmc3RyaW5ndGFiLAorCQkJdmFsdWUgPSB1c2JfZ2FkZ2V0X2dldF9zdHJpbmcoJmZzZ19zdHJpbmd0YWIsCiAJCQkJCXdfdmFsdWUgJiAweGZmLCByZXEtPmJ1Zik7CiAJCQlicmVhazsKIAkJfQpAQCAtMTU1MSw3ICsxMTEyLDcgQEAKIAogc3RhdGljIGludCBkb19yZWFkKHN0cnVjdCBmc2dfZGV2ICpmc2cpCiB7Ci0Jc3RydWN0IGx1bgkJKmN1cmx1biA9IGZzZy0+Y3VybHVuOworCXN0cnVjdCBmc2dfbHVuCQkqY3VybHVuID0gZnNnLT5jdXJsdW47CiAJdTMyCQkJbGJhOwogCXN0cnVjdCBmc2dfYnVmZmhkCSpiaDsKIAlpbnQJCQlyYzsKQEAgLTE2NzcsNyArMTIzOCw3IEBACiAKIHN0YXRpYyBpbnQgZG9fd3JpdGUoc3RydWN0IGZzZ19kZXYgKmZzZykKIHsKLQlzdHJ1Y3QgbHVuCQkqY3VybHVuID0gZnNnLT5jdXJsdW47CisJc3RydWN0IGZzZ19sdW4JCSpjdXJsdW4gPSBmc2ctPmN1cmx1bjsKIAl1MzIJCQlsYmE7CiAJc3RydWN0IGZzZ19idWZmaGQJKmJoOwogCWludAkJCWdldF9zb21lX21vcmU7CkBAIC0xNzEzLDcgKzEyNzQsNyBAQAogCQl9CiAJCWlmIChmc2ctPmNtbmRbMV0gJiAweDA4KSB7CS8vIEZVQQogCQkJc3Bpbl9sb2NrKCZjdXJsdW4tPmZpbHAtPmZfbG9jayk7Ci0JCQljdXJsdW4tPmZpbHAtPmZfZmxhZ3MgfD0gT19TWU5DOworCQkJY3VybHVuLT5maWxwLT5mX2ZsYWdzIHw9IE9fRFNZTkM7CiAJCQlzcGluX3VubG9jaygmY3VybHVuLT5maWxwLT5mX2xvY2spOwogCQl9CiAJfQpAQCAtMTg2NCwzMyArMTQyNSwxNCBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0vKiBTeW5jIHRoZSBmaWxlIGRhdGEsIGRvbid0IGJvdGhlciB3aXRoIHRoZSBtZXRhZGF0YS4KLSAqIFRoaXMgY29kZSB3YXMgY29waWVkIGZyb20gZnMvYnVmZmVyLmM6c3lzX2ZkYXRhc3luYygpLiAqLwotc3RhdGljIGludCBmc3luY19zdWIoc3RydWN0IGx1biAqY3VybHVuKQotewotCXN0cnVjdCBmaWxlCSpmaWxwID0gY3VybHVuLT5maWxwOwotCi0JaWYgKGN1cmx1bi0+cm8gfHwgIWZpbHApCi0JCXJldHVybiAwOwotCXJldHVybiB2ZnNfZnN5bmMoZmlscCwgZmlscC0+Zl9wYXRoLmRlbnRyeSwgMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZzeW5jX2FsbChzdHJ1Y3QgZnNnX2RldiAqZnNnKQotewotCWludAlpOwotCi0JZm9yIChpID0gMDsgaSA8IGZzZy0+bmx1bnM7ICsraSkKLQkJZnN5bmNfc3ViKCZmc2ctPmx1bnNbaV0pOwotfQotCiBzdGF0aWMgaW50IGRvX3N5bmNocm9uaXplX2NhY2hlKHN0cnVjdCBmc2dfZGV2ICpmc2cpCiB7Ci0Jc3RydWN0IGx1bgkqY3VybHVuID0gZnNnLT5jdXJsdW47CisJc3RydWN0IGZzZ19sdW4JKmN1cmx1biA9IGZzZy0+Y3VybHVuOwogCWludAkJcmM7CiAKIAkvKiBXZSBpZ25vcmUgdGhlIHJlcXVlc3RlZCBMQkEgYW5kIHdyaXRlIG91dCBhbGwgZmlsZSdzCiAJICogZGlydHkgZGF0YSBidWZmZXJzLiAqLwotCXJjID0gZnN5bmNfc3ViKGN1cmx1bik7CisJcmMgPSBmc2dfbHVuX2ZzeW5jX3N1YihjdXJsdW4pOwogCWlmIChyYykKIAkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfV1JJVEVfRVJST1I7CiAJcmV0dXJuIDA7CkBAIC0xODk5LDcgKzE0NDEsNyBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1zdGF0aWMgdm9pZCBpbnZhbGlkYXRlX3N1YihzdHJ1Y3QgbHVuICpjdXJsdW4pCitzdGF0aWMgdm9pZCBpbnZhbGlkYXRlX3N1YihzdHJ1Y3QgZnNnX2x1biAqY3VybHVuKQogewogCXN0cnVjdCBmaWxlCSpmaWxwID0gY3VybHVuLT5maWxwOwogCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwpAQCAtMTkxMSw3ICsxNDUzLDcgQEAKIAogc3RhdGljIGludCBkb192ZXJpZnkoc3RydWN0IGZzZ19kZXYgKmZzZykKIHsKLQlzdHJ1Y3QgbHVuCQkqY3VybHVuID0gZnNnLT5jdXJsdW47CisJc3RydWN0IGZzZ19sdW4JCSpjdXJsdW4gPSBmc2ctPmN1cmx1bjsKIAl1MzIJCQlsYmE7CiAJdTMyCQkJdmVyaWZpY2F0aW9uX2xlbmd0aDsKIAlzdHJ1Y3QgZnNnX2J1ZmZoZAkqYmggPSBmc2ctPm5leHRfYnVmZmhkX3RvX2ZpbGw7CkBAIC0xOTQ0LDcgKzE0ODYsNyBAQAogCWZpbGVfb2Zmc2V0ID0gKChsb2ZmX3QpIGxiYSkgPDwgOTsKIAogCS8qIFdyaXRlIG91dCBhbGwgdGhlIGRpcnR5IGJ1ZmZlcnMgYmVmb3JlIGludmFsaWRhdGluZyB0aGVtICovCi0JZnN5bmNfc3ViKGN1cmx1bik7CisJZnNnX2x1bl9mc3luY19zdWIoY3VybHVuKTsKIAlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCXJldHVybiAtRUlOVFI7CiAKQEAgLTIwNDEsNyArMTU4Myw3IEBACiAKIHN0YXRpYyBpbnQgZG9fcmVxdWVzdF9zZW5zZShzdHJ1Y3QgZnNnX2RldiAqZnNnLCBzdHJ1Y3QgZnNnX2J1ZmZoZCAqYmgpCiB7Ci0Jc3RydWN0IGx1bgkqY3VybHVuID0gZnNnLT5jdXJsdW47CisJc3RydWN0IGZzZ19sdW4JKmN1cmx1biA9IGZzZy0+Y3VybHVuOwogCXU4CQkqYnVmID0gKHU4ICopIGJoLT5idWY7CiAJdTMyCQlzZCwgc2RpbmZvOwogCWludAkJdmFsaWQ7CkBAIC0yMDk1LDcgKzE2MzcsNyBAQAogCiBzdGF0aWMgaW50IGRvX3JlYWRfY2FwYWNpdHkoc3RydWN0IGZzZ19kZXYgKmZzZywgc3RydWN0IGZzZ19idWZmaGQgKmJoKQogewotCXN0cnVjdCBsdW4JKmN1cmx1biA9IGZzZy0+Y3VybHVuOworCXN0cnVjdCBmc2dfbHVuCSpjdXJsdW4gPSBmc2ctPmN1cmx1bjsKIAl1MzIJCWxiYSA9IGdldF91bmFsaWduZWRfYmUzMigmZnNnLT5jbW5kWzJdKTsKIAlpbnQJCXBtaSA9IGZzZy0+Y21uZFs4XTsKIAl1OAkJKmJ1ZiA9ICh1OCAqKSBiaC0+YnVmOwpAQCAtMjExMywyNyArMTY1NSw5IEBACiB9CiAKIAotc3RhdGljIHZvaWQgc3RvcmVfY2Ryb21fYWRkcmVzcyh1OCAqZGVzdCwgaW50IG1zZiwgdTMyIGFkZHIpCi17Ci0JaWYgKG1zZikgewotCQkvKiBDb252ZXJ0IHRvIE1pbnV0ZXMtU2Vjb25kcy1GcmFtZXMgKi8KLQkJYWRkciA+Pj0gMjsJCS8qIENvbnZlcnQgdG8gMjA0OC1ieXRlIGZyYW1lcyAqLwotCQlhZGRyICs9IDIqNzU7CQkvKiBMZWFkLWluIG9jY3VwaWVzIDIgc2Vjb25kcyAqLwotCQlkZXN0WzNdID0gYWRkciAlIDc1OwkvKiBGcmFtZXMgKi8KLQkJYWRkciAvPSA3NTsKLQkJZGVzdFsyXSA9IGFkZHIgJSA2MDsJLyogU2Vjb25kcyAqLwotCQlhZGRyIC89IDYwOwotCQlkZXN0WzFdID0gYWRkcjsJCS8qIE1pbnV0ZXMgKi8KLQkJZGVzdFswXSA9IDA7CQkvKiBSZXNlcnZlZCAqLwotCX0gZWxzZSB7Ci0JCS8qIEFic29sdXRlIHNlY3RvciAqLwotCQlwdXRfdW5hbGlnbmVkX2JlMzIoYWRkciwgZGVzdCk7Ci0JfQotfQotCiBzdGF0aWMgaW50IGRvX3JlYWRfaGVhZGVyKHN0cnVjdCBmc2dfZGV2ICpmc2csIHN0cnVjdCBmc2dfYnVmZmhkICpiaCkKIHsKLQlzdHJ1Y3QgbHVuCSpjdXJsdW4gPSBmc2ctPmN1cmx1bjsKKwlzdHJ1Y3QgZnNnX2x1bgkqY3VybHVuID0gZnNnLT5jdXJsdW47CiAJaW50CQltc2YgPSBmc2ctPmNtbmRbMV0gJiAweDAyOwogCXUzMgkJbGJhID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZmc2ctPmNtbmRbMl0pOwogCXU4CQkqYnVmID0gKHU4ICopIGJoLT5idWY7CkBAIC0yMTU2LDcgKzE2ODAsNyBAQAogCiBzdGF0aWMgaW50IGRvX3JlYWRfdG9jKHN0cnVjdCBmc2dfZGV2ICpmc2csIHN0cnVjdCBmc2dfYnVmZmhkICpiaCkKIHsKLQlzdHJ1Y3QgbHVuCSpjdXJsdW4gPSBmc2ctPmN1cmx1bjsKKwlzdHJ1Y3QgZnNnX2x1bgkqY3VybHVuID0gZnNnLT5jdXJsdW47CiAJaW50CQltc2YgPSBmc2ctPmNtbmRbMV0gJiAweDAyOwogCWludAkJc3RhcnRfdHJhY2sgPSBmc2ctPmNtbmRbNl07CiAJdTgJCSpidWYgPSAodTggKikgYmgtPmJ1ZjsKQEAgLTIxODQsNyArMTcwOCw3IEBACiAKIHN0YXRpYyBpbnQgZG9fbW9kZV9zZW5zZShzdHJ1Y3QgZnNnX2RldiAqZnNnLCBzdHJ1Y3QgZnNnX2J1ZmZoZCAqYmgpCiB7Ci0Jc3RydWN0IGx1bgkqY3VybHVuID0gZnNnLT5jdXJsdW47CisJc3RydWN0IGZzZ19sdW4JKmN1cmx1biA9IGZzZy0+Y3VybHVuOwogCWludAkJbXNjbW5kID0gZnNnLT5jbW5kWzBdOwogCXU4CQkqYnVmID0gKHU4ICopIGJoLT5idWY7CiAJdTgJCSpidWYwID0gYnVmOwpAQCAtMjI2NSw3ICsxNzg5LDcgQEAKIAogc3RhdGljIGludCBkb19zdGFydF9zdG9wKHN0cnVjdCBmc2dfZGV2ICpmc2cpCiB7Ci0Jc3RydWN0IGx1bgkqY3VybHVuID0gZnNnLT5jdXJsdW47CisJc3RydWN0IGZzZ19sdW4JKmN1cmx1biA9IGZzZy0+Y3VybHVuOwogCWludAkJbG9laiwgc3RhcnQ7CiAKIAlpZiAoIW1vZF9kYXRhLnJlbW92YWJsZSkgewpAQCAtMjI5NSw3ICsxODE5LDcgQEAKIAkJaWYgKGxvZWopIHsJCS8vIFNpbXVsYXRlIGFuIHVubG9hZC9lamVjdAogCQkJdXBfcmVhZCgmZnNnLT5maWxlc2VtKTsKIAkJCWRvd25fd3JpdGUoJmZzZy0+ZmlsZXNlbSk7Ci0JCQljbG9zZV9iYWNraW5nX2ZpbGUoY3VybHVuKTsKKwkJCWZzZ19sdW5fY2xvc2UoY3VybHVuKTsKIAkJCXVwX3dyaXRlKCZmc2ctPmZpbGVzZW0pOwogCQkJZG93bl9yZWFkKCZmc2ctPmZpbGVzZW0pOwogCQl9CkBAIC0yMzAzLDcgKzE4MjcsNyBAQAogCiAJCS8qIE91ciBlbXVsYXRpb24gZG9lc24ndCBzdXBwb3J0IG1vdW50aW5nOyB0aGUgbWVkaXVtIGlzCiAJCSAqIGF2YWlsYWJsZSBmb3IgdXNlIGFzIHNvb24gYXMgaXQgaXMgbG9hZGVkLiAqLwotCQlpZiAoIWJhY2tpbmdfZmlsZV9pc19vcGVuKGN1cmx1bikpIHsKKwkJaWYgKCFmc2dfbHVuX2lzX29wZW4oY3VybHVuKSkgewogCQkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfTUVESVVNX05PVF9QUkVTRU5UOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTIzMTUsNyArMTgzOSw3IEBACiAKIHN0YXRpYyBpbnQgZG9fcHJldmVudF9hbGxvdyhzdHJ1Y3QgZnNnX2RldiAqZnNnKQogewotCXN0cnVjdCBsdW4JKmN1cmx1biA9IGZzZy0+Y3VybHVuOworCXN0cnVjdCBmc2dfbHVuCSpjdXJsdW4gPSBmc2ctPmN1cmx1bjsKIAlpbnQJCXByZXZlbnQ7CiAKIAlpZiAoIW1vZF9kYXRhLnJlbW92YWJsZSkgewpAQCAtMjMzMCw3ICsxODU0LDcgQEAKIAl9CiAKIAlpZiAoY3VybHVuLT5wcmV2ZW50X21lZGl1bV9yZW1vdmFsICYmICFwcmV2ZW50KQotCQlmc3luY19zdWIoY3VybHVuKTsKKwkJZnNnX2x1bl9mc3luY19zdWIoY3VybHVuKTsKIAljdXJsdW4tPnByZXZlbnRfbWVkaXVtX3JlbW92YWwgPSBwcmV2ZW50OwogCXJldHVybiAwOwogfQpAQCAtMjMzOSw3ICsxODYzLDcgQEAKIHN0YXRpYyBpbnQgZG9fcmVhZF9mb3JtYXRfY2FwYWNpdGllcyhzdHJ1Y3QgZnNnX2RldiAqZnNnLAogCQkJc3RydWN0IGZzZ19idWZmaGQgKmJoKQogewotCXN0cnVjdCBsdW4JKmN1cmx1biA9IGZzZy0+Y3VybHVuOworCXN0cnVjdCBmc2dfbHVuCSpjdXJsdW4gPSBmc2ctPmN1cmx1bjsKIAl1OAkJKmJ1ZiA9ICh1OCAqKSBiaC0+YnVmOwogCiAJYnVmWzBdID0gYnVmWzFdID0gYnVmWzJdID0gMDsKQEAgLTIzNTYsNyArMTg4MCw3IEBACiAKIHN0YXRpYyBpbnQgZG9fbW9kZV9zZWxlY3Qoc3RydWN0IGZzZ19kZXYgKmZzZywgc3RydWN0IGZzZ19idWZmaGQgKmJoKQogewotCXN0cnVjdCBsdW4JKmN1cmx1biA9IGZzZy0+Y3VybHVuOworCXN0cnVjdCBmc2dfbHVuCSpjdXJsdW4gPSBmc2ctPmN1cmx1bjsKIAogCS8qIFdlIGRvbid0IHN1cHBvcnQgTU9ERSBTRUxFQ1QgKi8KIAljdXJsdW4tPnNlbnNlX2RhdGEgPSBTU19JTlZBTElEX0NPTU1BTkQ7CkBAIC0yNTk5LDcgKzIxMjMsNyBAQAogCiBzdGF0aWMgaW50IHNlbmRfc3RhdHVzKHN0cnVjdCBmc2dfZGV2ICpmc2cpCiB7Ci0Jc3RydWN0IGx1bgkJKmN1cmx1biA9IGZzZy0+Y3VybHVuOworCXN0cnVjdCBmc2dfbHVuCQkqY3VybHVuID0gZnNnLT5jdXJsdW47CiAJc3RydWN0IGZzZ19idWZmaGQJKmJoOwogCWludAkJCXJjOwogCXU4CQkJc3RhdHVzID0gVVNCX1NUQVRVU19QQVNTOwpAQCAtMjY5MSw3ICsyMjE1LDcgQEAKIAlpbnQJCQlsdW4gPSBmc2ctPmNtbmRbMV0gPj4gNTsKIAlzdGF0aWMgY29uc3QgY2hhcglkaXJsZXR0ZXJbNF0gPSB7J3UnLCAnbycsICdpJywgJ24nfTsKIAljaGFyCQkJaGRsZW5bMjBdOwotCXN0cnVjdCBsdW4JCSpjdXJsdW47CisJc3RydWN0IGZzZ19sdW4JCSpjdXJsdW47CiAKIAkvKiBBZGp1c3QgdGhlIGV4cGVjdGVkIGNtbmRfc2l6ZSBmb3IgcHJvdG9jb2wgZW5jYXBzdWxhdGlvbiBwYWRkaW5nLgogCSAqIFRyYW5zcGFyZW50IFNDU0kgZG9lc24ndCBwYWQuICovCkBAIC0yODIwLDcgKzIzNDQsNyBAQAogCiAJLyogSWYgdGhlIG1lZGl1bSBpc24ndCBtb3VudGVkIGFuZCB0aGUgY29tbWFuZCBuZWVkcyB0byBhY2Nlc3MKIAkgKiBpdCwgcmV0dXJuIGFuIGVycm9yLiAqLwotCWlmIChjdXJsdW4gJiYgIWJhY2tpbmdfZmlsZV9pc19vcGVuKGN1cmx1bikgJiYgbmVlZHNfbWVkaXVtKSB7CisJaWYgKGN1cmx1biAmJiAhZnNnX2x1bl9pc19vcGVuKGN1cmx1bikgJiYgbmVlZHNfbWVkaXVtKSB7CiAJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX01FRElVTV9OT1RfUFJFU0VOVDsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMzA3NSw4ICsyNTk5LDggQEAKIAogc3RhdGljIGludCByZWNlaXZlZF9jYncoc3RydWN0IGZzZ19kZXYgKmZzZywgc3RydWN0IGZzZ19idWZmaGQgKmJoKQogewotCXN0cnVjdCB1c2JfcmVxdWVzdAkqcmVxID0gYmgtPm91dHJlcTsKLQlzdHJ1Y3QgYnVsa19jYl93cmFwCSpjYncgPSByZXEtPmJ1ZjsKKwlzdHJ1Y3QgdXNiX3JlcXVlc3QJCSpyZXEgPSBiaC0+b3V0cmVxOworCXN0cnVjdCBmc2dfYnVsa19jYl93cmFwCSpjYncgPSByZXEtPmJ1ZjsKIAogCS8qIFdhcyB0aGlzIGEgcmVhbCBwYWNrZXQ/ICBTaG91bGQgaXQgYmUgaWdub3JlZD8gKi8KIAlpZiAocmVxLT5zdGF0dXMgfHwgdGVzdF9iaXQoSUdOT1JFX0JVTEtfT1VULCAmZnNnLT5hdG9taWNfYml0ZmxhZ3MpKQpAQCAtMzEwNSw3ICsyNjI5LDcgQEAKIAl9CiAKIAkvKiBJcyB0aGUgQ0JXIG1lYW5pbmdmdWw/ICovCi0JaWYgKGNidy0+THVuID49IE1BWF9MVU5TIHx8IGNidy0+RmxhZ3MgJiB+VVNCX0JVTEtfSU5fRkxBRyB8fAorCWlmIChjYnctPkx1biA+PSBGU0dfTUFYX0xVTlMgfHwgY2J3LT5GbGFncyAmIH5VU0JfQlVMS19JTl9GTEFHIHx8CiAJCQljYnctPkxlbmd0aCA8PSAwIHx8IGNidy0+TGVuZ3RoID4gTUFYX0NPTU1BTkRfU0laRSkgewogCQlEQkcoZnNnLCAibm9uLW1lYW5pbmdmdWwgQ0JXOiBsdW4gPSAldSwgZmxhZ3MgPSAweCV4LCAiCiAJCQkJImNtZGxlbiAldVxuIiwKQEAgLTMyMzgsNyArMjc2Miw3IEBACiAKIHJlc2V0OgogCS8qIERlYWxsb2NhdGUgdGhlIHJlcXVlc3RzICovCi0JZm9yIChpID0gMDsgaSA8IE5VTV9CVUZGRVJTOyArK2kpIHsKKwlmb3IgKGkgPSAwOyBpIDwgRlNHX05VTV9CVUZGRVJTOyArK2kpIHsKIAkJc3RydWN0IGZzZ19idWZmaGQgKmJoID0gJmZzZy0+YnVmZmhkc1tpXTsKIAogCQlpZiAoYmgtPmlucmVxKSB7CkBAIC0zMjc2LDEyICsyODAwLDE0IEBACiAJREJHKGZzZywgInNldCBpbnRlcmZhY2UgJWRcbiIsIGFsdHNldHRpbmcpOwogCiAJLyogRW5hYmxlIHRoZSBlbmRwb2ludHMgKi8KLQlkID0gZXBfZGVzYyhmc2ctPmdhZGdldCwgJmZzX2J1bGtfaW5fZGVzYywgJmhzX2J1bGtfaW5fZGVzYyk7CisJZCA9IGZzZ19lcF9kZXNjKGZzZy0+Z2FkZ2V0LAorCQkJJmZzZ19mc19idWxrX2luX2Rlc2MsICZmc2dfaHNfYnVsa19pbl9kZXNjKTsKIAlpZiAoKHJjID0gZW5hYmxlX2VuZHBvaW50KGZzZywgZnNnLT5idWxrX2luLCBkKSkgIT0gMCkKIAkJZ290byByZXNldDsKIAlmc2ctPmJ1bGtfaW5fZW5hYmxlZCA9IDE7CiAKLQlkID0gZXBfZGVzYyhmc2ctPmdhZGdldCwgJmZzX2J1bGtfb3V0X2Rlc2MsICZoc19idWxrX291dF9kZXNjKTsKKwlkID0gZnNnX2VwX2Rlc2MoZnNnLT5nYWRnZXQsCisJCQkmZnNnX2ZzX2J1bGtfb3V0X2Rlc2MsICZmc2dfaHNfYnVsa19vdXRfZGVzYyk7CiAJaWYgKChyYyA9IGVuYWJsZV9lbmRwb2ludChmc2csIGZzZy0+YnVsa19vdXQsIGQpKSAhPSAwKQogCQlnb3RvIHJlc2V0OwogCWZzZy0+YnVsa19vdXRfZW5hYmxlZCA9IDE7CkBAIC0zMjg5LDE0ICsyODE1LDE1IEBACiAJY2xlYXJfYml0KElHTk9SRV9CVUxLX09VVCwgJmZzZy0+YXRvbWljX2JpdGZsYWdzKTsKIAogCWlmICh0cmFuc3BvcnRfaXNfY2JpKCkpIHsKLQkJZCA9IGVwX2Rlc2MoZnNnLT5nYWRnZXQsICZmc19pbnRyX2luX2Rlc2MsICZoc19pbnRyX2luX2Rlc2MpOworCQlkID0gZnNnX2VwX2Rlc2MoZnNnLT5nYWRnZXQsCisJCQkJJmZzZ19mc19pbnRyX2luX2Rlc2MsICZmc2dfaHNfaW50cl9pbl9kZXNjKTsKIAkJaWYgKChyYyA9IGVuYWJsZV9lbmRwb2ludChmc2csIGZzZy0+aW50cl9pbiwgZCkpICE9IDApCiAJCQlnb3RvIHJlc2V0OwogCQlmc2ctPmludHJfaW5fZW5hYmxlZCA9IDE7CiAJfQogCiAJLyogQWxsb2NhdGUgdGhlIHJlcXVlc3RzICovCi0JZm9yIChpID0gMDsgaSA8IE5VTV9CVUZGRVJTOyArK2kpIHsKKwlmb3IgKGkgPSAwOyBpIDwgRlNHX05VTV9CVUZGRVJTOyArK2kpIHsKIAkJc3RydWN0IGZzZ19idWZmaGQJKmJoID0gJmZzZy0+YnVmZmhkc1tpXTsKIAogCQlpZiAoKHJjID0gYWxsb2NfcmVxdWVzdChmc2csIGZzZy0+YnVsa19pbiwgJmJoLT5pbnJlcSkpICE9IDApCkBAIC0zMzcyLDcgKzI4OTksNyBAQAogCXN0cnVjdCBmc2dfYnVmZmhkCSpiaDsKIAllbnVtIGZzZ19zdGF0ZQkJb2xkX3N0YXRlOwogCXU4CQkJbmV3X2NvbmZpZzsKLQlzdHJ1Y3QgbHVuCQkqY3VybHVuOworCXN0cnVjdCBmc2dfbHVuCQkqY3VybHVuOwogCXVuc2lnbmVkIGludAkJZXhjZXB0aW9uX3JlcV90YWc7CiAJaW50CQkJcmM7CiAKQEAgLTMzOTIsNyArMjkxOSw3IEBACiAJLyogQ2FuY2VsIGFsbCB0aGUgcGVuZGluZyB0cmFuc2ZlcnMgKi8KIAlpZiAoZnNnLT5pbnRyZXFfYnVzeSkKIAkJdXNiX2VwX2RlcXVldWUoZnNnLT5pbnRyX2luLCBmc2ctPmludHJlcSk7Ci0JZm9yIChpID0gMDsgaSA8IE5VTV9CVUZGRVJTOyArK2kpIHsKKwlmb3IgKGkgPSAwOyBpIDwgRlNHX05VTV9CVUZGRVJTOyArK2kpIHsKIAkJYmggPSAmZnNnLT5idWZmaGRzW2ldOwogCQlpZiAoYmgtPmlucmVxX2J1c3kpCiAJCQl1c2JfZXBfZGVxdWV1ZShmc2ctPmJ1bGtfaW4sIGJoLT5pbnJlcSk7CkBAIC0zNDAzLDcgKzI5MzAsNyBAQAogCS8qIFdhaXQgdW50aWwgZXZlcnl0aGluZyBpcyBpZGxlICovCiAJZm9yICg7OykgewogCQludW1fYWN0aXZlID0gZnNnLT5pbnRyZXFfYnVzeTsKLQkJZm9yIChpID0gMDsgaSA8IE5VTV9CVUZGRVJTOyArK2kpIHsKKwkJZm9yIChpID0gMDsgaSA8IEZTR19OVU1fQlVGRkVSUzsgKytpKSB7CiAJCQliaCA9ICZmc2ctPmJ1ZmZoZHNbaV07CiAJCQludW1fYWN0aXZlICs9IGJoLT5pbnJlcV9idXN5ICsgYmgtPm91dHJlcV9idXN5OwogCQl9CkBAIC0zNDI1LDcgKzI5NTIsNyBAQAogCSAqIHN0YXRlLCBhbmQgdGhlIGV4Y2VwdGlvbi4gIFRoZW4gaW52b2tlIHRoZSBoYW5kbGVyLiAqLwogCXNwaW5fbG9ja19pcnEoJmZzZy0+bG9jayk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0JVRkZFUlM7ICsraSkgeworCWZvciAoaSA9IDA7IGkgPCBGU0dfTlVNX0JVRkZFUlM7ICsraSkgewogCQliaCA9ICZmc2ctPmJ1ZmZoZHNbaV07CiAJCWJoLT5zdGF0ZSA9IEJVRl9TVEFURV9FTVBUWTsKIAl9CkBAIC0zNTA2LDcgKzMwMzMsOCBAQAogCQlicmVhazsKIAogCWNhc2UgRlNHX1NUQVRFX0RJU0NPTk5FQ1Q6Ci0JCWZzeW5jX2FsbChmc2cpOworCQlmb3IgKGkgPSAwOyBpIDwgZnNnLT5ubHVuczsgKytpKQorCQkJZnNnX2x1bl9mc3luY19zdWIoZnNnLT5sdW5zICsgaSk7CiAJCWRvX3NldF9jb25maWcoZnNnLCAwKTsJCS8vIFVuY29uZmlndXJlZCBzdGF0ZQogCQlicmVhazsKIApAQCAtMzU5NSwyMDEgKzMxMjMsMTAgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotLyogSWYgdGhlIG5leHQgdHdvIHJvdXRpbmVzIGFyZSBjYWxsZWQgd2hpbGUgdGhlIGdhZGdldCBpcyByZWdpc3RlcmVkLAotICogdGhlIGNhbGxlciBtdXN0IG93biBmc2ctPmZpbGVzZW0gZm9yIHdyaXRpbmcuICovCi0KLXN0YXRpYyBpbnQgb3Blbl9iYWNraW5nX2ZpbGUoc3RydWN0IGx1biAqY3VybHVuLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLQlpbnQJCQkJcm87Ci0Jc3RydWN0IGZpbGUJCQkqZmlscCA9IE5VTEw7Ci0JaW50CQkJCXJjID0gLUVJTlZBTDsKLQlzdHJ1Y3QgaW5vZGUJCQkqaW5vZGUgPSBOVUxMOwotCWxvZmZfdAkJCQlzaXplOwotCWxvZmZfdAkJCQludW1fc2VjdG9yczsKLQlsb2ZmX3QJCQkJbWluX3NlY3RvcnM7Ci0KLQkvKiBSL1cgaWYgd2UgY2FuLCBSL08gaWYgd2UgbXVzdCAqLwotCXJvID0gY3VybHVuLT5ybzsKLQlpZiAoIXJvKSB7Ci0JCWZpbHAgPSBmaWxwX29wZW4oZmlsZW5hbWUsIE9fUkRXUiB8IE9fTEFSR0VGSUxFLCAwKTsKLQkJaWYgKC1FUk9GUyA9PSBQVFJfRVJSKGZpbHApKQotCQkJcm8gPSAxOwotCX0KLQlpZiAocm8pCi0JCWZpbHAgPSBmaWxwX29wZW4oZmlsZW5hbWUsIE9fUkRPTkxZIHwgT19MQVJHRUZJTEUsIDApOwotCWlmIChJU19FUlIoZmlscCkpIHsKLQkJTElORk8oY3VybHVuLCAidW5hYmxlIHRvIG9wZW4gYmFja2luZyBmaWxlOiAlc1xuIiwgZmlsZW5hbWUpOwotCQlyZXR1cm4gUFRSX0VSUihmaWxwKTsKLQl9Ci0KLQlpZiAoIShmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCi0JCXJvID0gMTsKLQotCWlmIChmaWxwLT5mX3BhdGguZGVudHJ5KQotCQlpbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7Ci0JaWYgKGlub2RlICYmIFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpIHsKLQkJaWYgKGJkZXZfcmVhZF9vbmx5KGlub2RlLT5pX2JkZXYpKQotCQkJcm8gPSAxOwotCX0gZWxzZSBpZiAoIWlub2RlIHx8ICFTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7Ci0JCUxJTkZPKGN1cmx1biwgImludmFsaWQgZmlsZSB0eXBlOiAlc1xuIiwgZmlsZW5hbWUpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBJZiB3ZSBjYW4ndCByZWFkIHRoZSBmaWxlLCBpdCdzIG5vIGdvb2QuCi0JICogSWYgd2UgY2FuJ3Qgd3JpdGUgdGhlIGZpbGUsIHVzZSBpdCByZWFkLW9ubHkuICovCi0JaWYgKCFmaWxwLT5mX29wIHx8ICEoZmlscC0+Zl9vcC0+cmVhZCB8fCBmaWxwLT5mX29wLT5haW9fcmVhZCkpIHsKLQkJTElORk8oY3VybHVuLCAiZmlsZSBub3QgcmVhZGFibGU6ICVzXG4iLCBmaWxlbmFtZSk7Ci0JCWdvdG8gb3V0OwotCX0KLQlpZiAoIShmaWxwLT5mX29wLT53cml0ZSB8fCBmaWxwLT5mX29wLT5haW9fd3JpdGUpKQotCQlybyA9IDE7Ci0KLQlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUtPmlfbWFwcGluZy0+aG9zdCk7Ci0JaWYgKHNpemUgPCAwKSB7Ci0JCUxJTkZPKGN1cmx1biwgInVuYWJsZSB0byBmaW5kIGZpbGUgc2l6ZTogJXNcbiIsIGZpbGVuYW1lKTsKLQkJcmMgPSAoaW50KSBzaXplOwotCQlnb3RvIG91dDsKLQl9Ci0JbnVtX3NlY3RvcnMgPSBzaXplID4+IDk7CS8vIEZpbGUgc2l6ZSBpbiA1MTItYnl0ZSBibG9ja3MKLQltaW5fc2VjdG9ycyA9IDE7Ci0JaWYgKG1vZF9kYXRhLmNkcm9tKSB7Ci0JCW51bV9zZWN0b3JzICY9IH4zOwkvLyBSZWR1Y2UgdG8gYSBtdWx0aXBsZSBvZiAyMDQ4Ci0JCW1pbl9zZWN0b3JzID0gMzAwKjQ7CS8vIFNtYWxsZXN0IHRyYWNrIGlzIDMwMCBmcmFtZXMKLQkJaWYgKG51bV9zZWN0b3JzID49IDI1Nio2MCo3NSo0KSB7Ci0JCQludW1fc2VjdG9ycyA9ICgyNTYqNjAqNzUgLSAxKSAqIDQ7Ci0JCQlMSU5GTyhjdXJsdW4sICJmaWxlIHRvbyBiaWc6ICVzXG4iLCBmaWxlbmFtZSk7Ci0JCQlMSU5GTyhjdXJsdW4sICJ1c2luZyBvbmx5IGZpcnN0ICVkIGJsb2Nrc1xuIiwKLQkJCQkJKGludCkgbnVtX3NlY3RvcnMpOwotCQl9Ci0JfQotCWlmIChudW1fc2VjdG9ycyA8IG1pbl9zZWN0b3JzKSB7Ci0JCUxJTkZPKGN1cmx1biwgImZpbGUgdG9vIHNtYWxsOiAlc1xuIiwgZmlsZW5hbWUpOwotCQlyYyA9IC1FVE9PU01BTEw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWdldF9maWxlKGZpbHApOwotCWN1cmx1bi0+cm8gPSBybzsKLQljdXJsdW4tPmZpbHAgPSBmaWxwOwotCWN1cmx1bi0+ZmlsZV9sZW5ndGggPSBzaXplOwotCWN1cmx1bi0+bnVtX3NlY3RvcnMgPSBudW1fc2VjdG9yczsKLQlMREJHKGN1cmx1biwgIm9wZW4gYmFja2luZyBmaWxlOiAlc1xuIiwgZmlsZW5hbWUpOwotCXJjID0gMDsKLQotb3V0OgotCWZpbHBfY2xvc2UoZmlscCwgY3VycmVudC0+ZmlsZXMpOwotCXJldHVybiByYzsKLX0KLQotCi1zdGF0aWMgdm9pZCBjbG9zZV9iYWNraW5nX2ZpbGUoc3RydWN0IGx1biAqY3VybHVuKQotewotCWlmIChjdXJsdW4tPmZpbHApIHsKLQkJTERCRyhjdXJsdW4sICJjbG9zZSBiYWNraW5nIGZpbGVcbiIpOwotCQlmcHV0KGN1cmx1bi0+ZmlscCk7Ci0JCWN1cmx1bi0+ZmlscCA9IE5VTEw7Ci0JfQotfQotCi0KLXN0YXRpYyBzc2l6ZV90IHNob3dfcm8oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBsdW4JKmN1cmx1biA9IGRldl90b19sdW4oZGV2KTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjdXJsdW4tPnJvKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd19maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgbHVuCSpjdXJsdW4gPSBkZXZfdG9fbHVuKGRldik7Ci0Jc3RydWN0IGZzZ19kZXYJKmZzZyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWNoYXIJCSpwOwotCXNzaXplX3QJCXJjOwotCi0JZG93bl9yZWFkKCZmc2ctPmZpbGVzZW0pOwotCWlmIChiYWNraW5nX2ZpbGVfaXNfb3BlbihjdXJsdW4pKSB7CS8vIEdldCB0aGUgY29tcGxldGUgcGF0aG5hbWUKLQkJcCA9IGRfcGF0aCgmY3VybHVuLT5maWxwLT5mX3BhdGgsIGJ1ZiwgUEFHRV9TSVpFIC0gMSk7Ci0JCWlmIChJU19FUlIocCkpCi0JCQlyYyA9IFBUUl9FUlIocCk7Ci0JCWVsc2UgewotCQkJcmMgPSBzdHJsZW4ocCk7Ci0JCQltZW1tb3ZlKGJ1ZiwgcCwgcmMpOwotCQkJYnVmW3JjXSA9ICdcbic7CQkvLyBBZGQgYSBuZXdsaW5lCi0JCQlidWZbKytyY10gPSAwOwotCQl9Ci0JfSBlbHNlIHsJCQkJLy8gTm8gZmlsZSwgcmV0dXJuIDAgYnl0ZXMKLQkJKmJ1ZiA9IDA7Ci0JCXJjID0gMDsKLQl9Ci0JdXBfcmVhZCgmZnNnLT5maWxlc2VtKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLQotc3RhdGljIHNzaXplX3Qgc3RvcmVfcm8oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3NpemVfdAkJcmMgPSBjb3VudDsKLQlzdHJ1Y3QgbHVuCSpjdXJsdW4gPSBkZXZfdG9fbHVuKGRldik7Ci0Jc3RydWN0IGZzZ19kZXYJKmZzZyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludAkJaTsKLQotCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmaSkgIT0gMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBBbGxvdyB0aGUgd3JpdGUtZW5hYmxlIHN0YXR1cyB0byBjaGFuZ2Ugb25seSB3aGlsZSB0aGUgYmFja2luZyBmaWxlCi0JICogaXMgY2xvc2VkLiAqLwotCWRvd25fcmVhZCgmZnNnLT5maWxlc2VtKTsKLQlpZiAoYmFja2luZ19maWxlX2lzX29wZW4oY3VybHVuKSkgewotCQlMREJHKGN1cmx1biwgInJlYWQtb25seSBzdGF0dXMgY2hhbmdlIHByZXZlbnRlZFxuIik7Ci0JCXJjID0gLUVCVVNZOwotCX0gZWxzZSB7Ci0JCWN1cmx1bi0+cm8gPSAhIWk7Ci0JCUxEQkcoY3VybHVuLCAicmVhZC1vbmx5IHN0YXR1cyBzZXQgdG8gJWRcbiIsIGN1cmx1bi0+cm8pOwotCX0KLQl1cF9yZWFkKCZmc2ctPmZpbGVzZW0pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3Qgc3RvcmVfZmlsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgbHVuCSpjdXJsdW4gPSBkZXZfdG9fbHVuKGRldik7Ci0Jc3RydWN0IGZzZ19kZXYJKmZzZyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludAkJcmMgPSAwOwotCi0JaWYgKGN1cmx1bi0+cHJldmVudF9tZWRpdW1fcmVtb3ZhbCAmJiBiYWNraW5nX2ZpbGVfaXNfb3BlbihjdXJsdW4pKSB7Ci0JCUxEQkcoY3VybHVuLCAiZWplY3QgYXR0ZW1wdCBwcmV2ZW50ZWRcbiIpOwotCQlyZXR1cm4gLUVCVVNZOwkJCQkvLyAiRG9vciBpcyBsb2NrZWQiCi0JfQotCi0JLyogUmVtb3ZlIGEgdHJhaWxpbmcgbmV3bGluZSAqLwotCWlmIChjb3VudCA+IDAgJiYgYnVmW2NvdW50LTFdID09ICdcbicpCi0JCSgoY2hhciAqKSBidWYpW2NvdW50LTFdID0gMDsJCS8vIFVnaCEKLQotCS8qIEVqZWN0IGN1cnJlbnQgbWVkaXVtICovCi0JZG93bl93cml0ZSgmZnNnLT5maWxlc2VtKTsKLQlpZiAoYmFja2luZ19maWxlX2lzX29wZW4oY3VybHVuKSkgewotCQljbG9zZV9iYWNraW5nX2ZpbGUoY3VybHVuKTsKLQkJY3VybHVuLT51bml0X2F0dGVudGlvbl9kYXRhID0gU1NfTUVESVVNX05PVF9QUkVTRU5UOwotCX0KLQotCS8qIExvYWQgbmV3IG1lZGl1bSAqLwotCWlmIChjb3VudCA+IDAgJiYgYnVmWzBdKSB7Ci0JCXJjID0gb3Blbl9iYWNraW5nX2ZpbGUoY3VybHVuLCBidWYpOwotCQlpZiAocmMgPT0gMCkKLQkJCWN1cmx1bi0+dW5pdF9hdHRlbnRpb25fZGF0YSA9Ci0JCQkJCVNTX05PVF9SRUFEWV9UT19SRUFEWV9UUkFOU0lUSU9OOwotCX0KLQl1cF93cml0ZSgmZnNnLT5maWxlc2VtKTsKLQlyZXR1cm4gKHJjIDwgMCA/IHJjIDogY291bnQpOwotfQotCiAKIC8qIFRoZSB3cml0ZSBwZXJtaXNzaW9ucyBhbmQgc3RvcmVfeHh4IHBvaW50ZXJzIGFyZSBzZXQgaW4gZnNnX2JpbmQoKSAqLwotc3RhdGljIERFVklDRV9BVFRSKHJvLCAwNDQ0LCBzaG93X3JvLCBOVUxMKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihmaWxlLCAwNDQ0LCBzaG93X2ZpbGUsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHJvLCAwNDQ0LCBmc2dfc2hvd19ybywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoZmlsZSwgMDQ0NCwgZnNnX3Nob3dfZmlsZSwgTlVMTCk7CiAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTM4MDQsNyArMzE0MSw5IEBACiAKIHN0YXRpYyB2b2lkIGx1bl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZnNnX2RldgkqZnNnID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHJ3X3NlbWFwaG9yZQkqZmlsZXNlbSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBmc2dfZGV2CQkqZnNnID0KKwkJY29udGFpbmVyX29mKGZpbGVzZW0sIHN0cnVjdCBmc2dfZGV2LCBmaWxlc2VtKTsKIAogCWtyZWZfcHV0KCZmc2ctPnJlZiwgZnNnX3JlbGVhc2UpOwogfQpAQCAtMzgxMyw3ICszMTUyLDcgQEAKIHsKIAlzdHJ1Y3QgZnNnX2RldgkJKmZzZyA9IGdldF9nYWRnZXRfZGF0YShnYWRnZXQpOwogCWludAkJCWk7Ci0Jc3RydWN0IGx1bgkJKmN1cmx1bjsKKwlzdHJ1Y3QgZnNnX2x1bgkJKmN1cmx1bjsKIAlzdHJ1Y3QgdXNiX3JlcXVlc3QJKnJlcSA9IGZzZy0+ZXAwcmVxOwogCiAJREJHKGZzZywgInVuYmluZFxuIik7CkBAIC0zODI1LDcgKzMxNjQsNyBAQAogCQlpZiAoY3VybHVuLT5yZWdpc3RlcmVkKSB7CiAJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmN1cmx1bi0+ZGV2LCAmZGV2X2F0dHJfcm8pOwogCQkJZGV2aWNlX3JlbW92ZV9maWxlKCZjdXJsdW4tPmRldiwgJmRldl9hdHRyX2ZpbGUpOwotCQkJY2xvc2VfYmFja2luZ19maWxlKGN1cmx1bik7CisJCQlmc2dfbHVuX2Nsb3NlKGN1cmx1bik7CiAJCQlkZXZpY2VfdW5yZWdpc3RlcigmY3VybHVuLT5kZXYpOwogCQkJY3VybHVuLT5yZWdpc3RlcmVkID0gMDsKIAkJfQpAQCAtMzg0MSw3ICszMTgwLDcgQEAKIAl9CiAKIAkvKiBGcmVlIHRoZSBkYXRhIGJ1ZmZlcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0JVRkZFUlM7ICsraSkKKwlmb3IgKGkgPSAwOyBpIDwgRlNHX05VTV9CVUZGRVJTOyArK2kpCiAJCWtmcmVlKGZzZy0+YnVmZmhkc1tpXS5idWYpOwogCiAJLyogRnJlZSB0aGUgcmVxdWVzdCBhbmQgYnVmZmVyIGZvciBlbmRwb2ludCAwICovCkBAIC0zOTQ4LDcgKzMyODcsNyBAQAogCXN0cnVjdCBmc2dfZGV2CQkqZnNnID0gdGhlX2ZzZzsKIAlpbnQJCQlyYzsKIAlpbnQJCQlpOwotCXN0cnVjdCBsdW4JCSpjdXJsdW47CisJc3RydWN0IGZzZ19sdW4JCSpjdXJsdW47CiAJc3RydWN0IHVzYl9lcAkJKmVwOwogCXN0cnVjdCB1c2JfcmVxdWVzdAkqcmVxOwogCWNoYXIJCQkqcGF0aGJ1ZiwgKnA7CkBAIC0zOTYzLDEwICszMzAyLDEwIEBACiAKIAlpZiAobW9kX2RhdGEucmVtb3ZhYmxlKSB7CS8vIEVuYWJsZSB0aGUgc3RvcmVfeHh4IGF0dHJpYnV0ZXMKIAkJZGV2X2F0dHJfZmlsZS5hdHRyLm1vZGUgPSAwNjQ0OwotCQlkZXZfYXR0cl9maWxlLnN0b3JlID0gc3RvcmVfZmlsZTsKKwkJZGV2X2F0dHJfZmlsZS5zdG9yZSA9IGZzZ19zdG9yZV9maWxlOwogCQlpZiAoIW1vZF9kYXRhLmNkcm9tKSB7CiAJCQlkZXZfYXR0cl9yby5hdHRyLm1vZGUgPSAwNjQ0OwotCQkJZGV2X2F0dHJfcm8uc3RvcmUgPSBzdG9yZV9ybzsKKwkJCWRldl9hdHRyX3JvLnN0b3JlID0gZnNnX3N0b3JlX3JvOwogCQl9CiAJfQogCkBAIC0zOTc0LDcgKzMzMTMsNyBAQAogCWkgPSBtb2RfZGF0YS5ubHVuczsKIAlpZiAoaSA9PSAwKQogCQlpID0gbWF4KG1vZF9kYXRhLm51bV9maWxlbmFtZXMsIDF1KTsKLQlpZiAoaSA+IE1BWF9MVU5TKSB7CisJaWYgKGkgPiBGU0dfTUFYX0xVTlMpIHsKIAkJRVJST1IoZnNnLCAiaW52YWxpZCBudW1iZXIgb2YgTFVOczogJWRcbiIsIGkpOwogCQlyYyA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwpAQCAtMzk4Miw3ICszMzIxLDcgQEAKIAogCS8qIENyZWF0ZSB0aGUgTFVOcywgb3BlbiB0aGVpciBiYWNraW5nIGZpbGVzLCBhbmQgcmVnaXN0ZXIgdGhlCiAJICogTFVOIGRldmljZXMgaW4gc3lzZnMuICovCi0JZnNnLT5sdW5zID0ga3phbGxvYyhpICogc2l6ZW9mKHN0cnVjdCBsdW4pLCBHRlBfS0VSTkVMKTsKKwlmc2ctPmx1bnMgPSBremFsbG9jKGkgKiBzaXplb2Yoc3RydWN0IGZzZ19sdW4pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWZzZy0+bHVucykgewogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwpAQCAtMzk5MSwxMyArMzMzMCwxNCBAQAogCiAJZm9yIChpID0gMDsgaSA8IGZzZy0+bmx1bnM7ICsraSkgewogCQljdXJsdW4gPSAmZnNnLT5sdW5zW2ldOwotCQljdXJsdW4tPnJvID0gbW9kX2RhdGEucm9baV07Ci0JCWlmIChtb2RfZGF0YS5jZHJvbSkKLQkJCWN1cmx1bi0+cm8gPSAxOworCQljdXJsdW4tPmNkcm9tID0gISFtb2RfZGF0YS5jZHJvbTsKKwkJY3VybHVuLT5ybyA9IG1vZF9kYXRhLmNkcm9tIHx8IG1vZF9kYXRhLnJvW2ldOworCQljdXJsdW4tPmluaXRpYWxseV9ybyA9IGN1cmx1bi0+cm87CisJCWN1cmx1bi0+cmVtb3ZhYmxlID0gbW9kX2RhdGEucmVtb3ZhYmxlOwogCQljdXJsdW4tPmRldi5yZWxlYXNlID0gbHVuX3JlbGVhc2U7CiAJCWN1cmx1bi0+ZGV2LnBhcmVudCA9ICZnYWRnZXQtPmRldjsKIAkJY3VybHVuLT5kZXYuZHJpdmVyID0gJmZzZ19kcml2ZXIuZHJpdmVyOwotCQlkZXZfc2V0X2RydmRhdGEoJmN1cmx1bi0+ZGV2LCBmc2cpOworCQlkZXZfc2V0X2RydmRhdGEoJmN1cmx1bi0+ZGV2LCAmZnNnLT5maWxlc2VtKTsKIAkJZGV2X3NldF9uYW1lKCZjdXJsdW4tPmRldiwiJXMtbHVuJWQiLAogCQkJICAgICBkZXZfbmFtZSgmZ2FkZ2V0LT5kZXYpLCBpKTsKIApAQCAtNDAxNiw3ICszMzU2LDcgQEAKIAkJa3JlZl9nZXQoJmZzZy0+cmVmKTsKIAogCQlpZiAobW9kX2RhdGEuZmlsZVtpXSAmJiAqbW9kX2RhdGEuZmlsZVtpXSkgewotCQkJaWYgKChyYyA9IG9wZW5fYmFja2luZ19maWxlKGN1cmx1biwKKwkJCWlmICgocmMgPSBmc2dfbHVuX29wZW4oY3VybHVuLAogCQkJCQltb2RfZGF0YS5maWxlW2ldKSkgIT0gMCkKIAkJCQlnb3RvIG91dDsKIAkJfSBlbHNlIGlmICghbW9kX2RhdGEucmVtb3ZhYmxlKSB7CkBAIC00MDI4LDIwICszMzY4LDIwIEBACiAKIAkvKiBGaW5kIGFsbCB0aGUgZW5kcG9pbnRzIHdlIHdpbGwgdXNlICovCiAJdXNiX2VwX2F1dG9jb25maWdfcmVzZXQoZ2FkZ2V0KTsKLQllcCA9IHVzYl9lcF9hdXRvY29uZmlnKGdhZGdldCwgJmZzX2J1bGtfaW5fZGVzYyk7CisJZXAgPSB1c2JfZXBfYXV0b2NvbmZpZyhnYWRnZXQsICZmc2dfZnNfYnVsa19pbl9kZXNjKTsKIAlpZiAoIWVwKQogCQlnb3RvIGF1dG9jb25mX2ZhaWw7CiAJZXAtPmRyaXZlcl9kYXRhID0gZnNnOwkJLy8gY2xhaW0gdGhlIGVuZHBvaW50CiAJZnNnLT5idWxrX2luID0gZXA7CiAKLQllcCA9IHVzYl9lcF9hdXRvY29uZmlnKGdhZGdldCwgJmZzX2J1bGtfb3V0X2Rlc2MpOworCWVwID0gdXNiX2VwX2F1dG9jb25maWcoZ2FkZ2V0LCAmZnNnX2ZzX2J1bGtfb3V0X2Rlc2MpOwogCWlmICghZXApCiAJCWdvdG8gYXV0b2NvbmZfZmFpbDsKIAllcC0+ZHJpdmVyX2RhdGEgPSBmc2c7CQkvLyBjbGFpbSB0aGUgZW5kcG9pbnQKIAlmc2ctPmJ1bGtfb3V0ID0gZXA7CiAKIAlpZiAodHJhbnNwb3J0X2lzX2NiaSgpKSB7Ci0JCWVwID0gdXNiX2VwX2F1dG9jb25maWcoZ2FkZ2V0LCAmZnNfaW50cl9pbl9kZXNjKTsKKwkJZXAgPSB1c2JfZXBfYXV0b2NvbmZpZyhnYWRnZXQsICZmc2dfZnNfaW50cl9pbl9kZXNjKTsKIAkJaWYgKCFlcCkKIAkJCWdvdG8gYXV0b2NvbmZfZmFpbDsKIAkJZXAtPmRyaXZlcl9kYXRhID0gZnNnOwkJLy8gY2xhaW0gdGhlIGVuZHBvaW50CkBAIC00MDU1LDI4ICszMzk1LDI4IEBACiAJZGV2aWNlX2Rlc2MuYmNkRGV2aWNlID0gY3B1X3RvX2xlMTYobW9kX2RhdGEucmVsZWFzZSk7CiAKIAlpID0gKHRyYW5zcG9ydF9pc19jYmkoKSA/IDMgOiAyKTsJLy8gTnVtYmVyIG9mIGVuZHBvaW50cwotCWludGZfZGVzYy5iTnVtRW5kcG9pbnRzID0gaTsKLQlpbnRmX2Rlc2MuYkludGVyZmFjZVN1YkNsYXNzID0gbW9kX2RhdGEucHJvdG9jb2xfdHlwZTsKLQlpbnRmX2Rlc2MuYkludGVyZmFjZVByb3RvY29sID0gbW9kX2RhdGEudHJhbnNwb3J0X3R5cGU7Ci0JZnNfZnVuY3Rpb25baSArIEZTX0ZVTkNUSU9OX1BSRV9FUF9FTlRSSUVTXSA9IE5VTEw7CisJZnNnX2ludGZfZGVzYy5iTnVtRW5kcG9pbnRzID0gaTsKKwlmc2dfaW50Zl9kZXNjLmJJbnRlcmZhY2VTdWJDbGFzcyA9IG1vZF9kYXRhLnByb3RvY29sX3R5cGU7CisJZnNnX2ludGZfZGVzYy5iSW50ZXJmYWNlUHJvdG9jb2wgPSBtb2RfZGF0YS50cmFuc3BvcnRfdHlwZTsKKwlmc2dfZnNfZnVuY3Rpb25baSArIEZTR19GU19GVU5DVElPTl9QUkVfRVBfRU5UUklFU10gPSBOVUxMOwogCiAJaWYgKGdhZGdldF9pc19kdWFsc3BlZWQoZ2FkZ2V0KSkgewotCQloc19mdW5jdGlvbltpICsgSFNfRlVOQ1RJT05fUFJFX0VQX0VOVFJJRVNdID0gTlVMTDsKKwkJZnNnX2hzX2Z1bmN0aW9uW2kgKyBGU0dfSFNfRlVOQ1RJT05fUFJFX0VQX0VOVFJJRVNdID0gTlVMTDsKIAogCQkvKiBBc3N1bWUgZXAwIHVzZXMgdGhlIHNhbWUgbWF4cGFja2V0IHZhbHVlIGZvciBib3RoIHNwZWVkcyAqLwogCQlkZXZfcXVhbGlmaWVyLmJNYXhQYWNrZXRTaXplMCA9IGZzZy0+ZXAwLT5tYXhwYWNrZXQ7CiAKIAkJLyogQXNzdW1lIGVuZHBvaW50IGFkZHJlc3NlcyBhcmUgdGhlIHNhbWUgZm9yIGJvdGggc3BlZWRzICovCi0JCWhzX2J1bGtfaW5fZGVzYy5iRW5kcG9pbnRBZGRyZXNzID0KLQkJCQlmc19idWxrX2luX2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKLQkJaHNfYnVsa19vdXRfZGVzYy5iRW5kcG9pbnRBZGRyZXNzID0KLQkJCQlmc19idWxrX291dF9kZXNjLmJFbmRwb2ludEFkZHJlc3M7Ci0JCWhzX2ludHJfaW5fZGVzYy5iRW5kcG9pbnRBZGRyZXNzID0KLQkJCQlmc19pbnRyX2luX2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKKwkJZnNnX2hzX2J1bGtfaW5fZGVzYy5iRW5kcG9pbnRBZGRyZXNzID0KKwkJCWZzZ19mc19idWxrX2luX2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKKwkJZnNnX2hzX2J1bGtfb3V0X2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9CisJCQlmc2dfZnNfYnVsa19vdXRfZGVzYy5iRW5kcG9pbnRBZGRyZXNzOworCQlmc2dfaHNfaW50cl9pbl9kZXNjLmJFbmRwb2ludEFkZHJlc3MgPQorCQkJZnNnX2ZzX2ludHJfaW5fZGVzYy5iRW5kcG9pbnRBZGRyZXNzOwogCX0KIAogCWlmIChnYWRnZXRfaXNfb3RnKGdhZGdldCkpCi0JCW90Z19kZXNjLmJtQXR0cmlidXRlcyB8PSBVU0JfT1RHX0hOUDsKKwkJZnNnX290Z19kZXNjLmJtQXR0cmlidXRlcyB8PSBVU0JfT1RHX0hOUDsKIAogCXJjID0gLUVOT01FTTsKIApAQCAtNDA5MCw3ICszNDMwLDcgQEAKIAlyZXEtPmNvbXBsZXRlID0gZXAwX2NvbXBsZXRlOwogCiAJLyogQWxsb2NhdGUgdGhlIGRhdGEgYnVmZmVycyAqLwotCWZvciAoaSA9IDA7IGkgPCBOVU1fQlVGRkVSUzsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IEZTR19OVU1fQlVGRkVSUzsgKytpKSB7CiAJCXN0cnVjdCBmc2dfYnVmZmhkCSpiaCA9ICZmc2ctPmJ1ZmZoZHNbaV07CiAKIAkJLyogQWxsb2NhdGUgZm9yIHRoZSBidWxrLWluIGVuZHBvaW50LiAgV2UgYXNzdW1lIHRoYXQKQEAgLTQxMDEsMjMgKzM0NDEsMjQgQEAKIAkJCWdvdG8gb3V0OwogCQliaC0+bmV4dCA9IGJoICsgMTsKIAl9Ci0JZnNnLT5idWZmaGRzW05VTV9CVUZGRVJTIC0gMV0ubmV4dCA9ICZmc2ctPmJ1ZmZoZHNbMF07CisJZnNnLT5idWZmaGRzW0ZTR19OVU1fQlVGRkVSUyAtIDFdLm5leHQgPSAmZnNnLT5idWZmaGRzWzBdOwogCiAJLyogVGhpcyBzaG91bGQgcmVmbGVjdCB0aGUgYWN0dWFsIGdhZGdldCBwb3dlciBzb3VyY2UgKi8KIAl1c2JfZ2FkZ2V0X3NldF9zZWxmcG93ZXJlZChnYWRnZXQpOwogCi0Jc25wcmludGYobWFudWZhY3R1cmVyLCBzaXplb2YgbWFudWZhY3R1cmVyLCAiJXMgJXMgd2l0aCAlcyIsCisJc25wcmludGYoZnNnX3N0cmluZ19tYW51ZmFjdHVyZXIsIHNpemVvZiBmc2dfc3RyaW5nX21hbnVmYWN0dXJlciwKKwkJCSIlcyAlcyB3aXRoICVzIiwKIAkJCWluaXRfdXRzbmFtZSgpLT5zeXNuYW1lLCBpbml0X3V0c25hbWUoKS0+cmVsZWFzZSwKIAkJCWdhZGdldC0+bmFtZSk7CiAKIAkvKiBPbiBhIHJlYWwgZGV2aWNlLCBzZXJpYWxbXSB3b3VsZCBiZSBsb2FkZWQgZnJvbSBwZXJtYW5lbnQKIAkgKiBzdG9yYWdlLiAgV2UganVzdCBlbmNvZGUgaXQgZnJvbSB0aGUgZHJpdmVyIHZlcnNpb24gc3RyaW5nLiAqLwotCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc2VyaWFsKSAtIDI7IGkgKz0gMikgeworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgZnNnX3N0cmluZ19zZXJpYWwgLSAyOyBpICs9IDIpIHsKIAkJdW5zaWduZWQgY2hhcgkJYyA9IERSSVZFUl9WRVJTSU9OW2kgLyAyXTsKIAogCQlpZiAoIWMpCiAJCQlicmVhazsKLQkJc3ByaW50Zigmc2VyaWFsW2ldLCAiJTAyWCIsIGMpOworCQlzcHJpbnRmKCZmc2dfc3RyaW5nX3NlcmlhbFtpXSwgIiUwMlgiLCBjKTsKIAl9CiAKIAlmc2ctPnRocmVhZF90YXNrID0ga3RocmVhZF9jcmVhdGUoZnNnX21haW5fdGhyZWFkLCBmc2csCkBAIC00MTMzLDcgKzM0NzQsNyBAQAogCXBhdGhidWYgPSBrbWFsbG9jKFBBVEhfTUFYLCBHRlBfS0VSTkVMKTsKIAlmb3IgKGkgPSAwOyBpIDwgZnNnLT5ubHVuczsgKytpKSB7CiAJCWN1cmx1biA9ICZmc2ctPmx1bnNbaV07Ci0JCWlmIChiYWNraW5nX2ZpbGVfaXNfb3BlbihjdXJsdW4pKSB7CisJCWlmIChmc2dfbHVuX2lzX29wZW4oY3VybHVuKSkgewogCQkJcCA9IE5VTEw7CiAJCQlpZiAocGF0aGJ1ZikgewogCQkJCXAgPSBkX3BhdGgoJmN1cmx1bi0+ZmlscC0+Zl9wYXRoLApAQCAtNDIwMyw3ICszNTQ0LDcgQEAKICNlbHNlCiAJLnNwZWVkCQk9IFVTQl9TUEVFRF9GVUxMLAogI2VuZGlmCi0JLmZ1bmN0aW9uCT0gKGNoYXIgKikgbG9uZ25hbWUsCisJLmZ1bmN0aW9uCT0gKGNoYXIgKikgZnNnX3N0cmluZ19wcm9kdWN0LAogCS5iaW5kCQk9IGZzZ19iaW5kLAogCS51bmJpbmQJCT0gZnNnX3VuYmluZCwKIAkuZGlzY29ubmVjdAk9IGZzZ19kaXNjb25uZWN0LApAQCAtNDIxMiw3ICszNTUzLDcgQEAKIAkucmVzdW1lCQk9IGZzZ19yZXN1bWUsCiAKIAkuZHJpdmVyCQk9IHsKLQkJLm5hbWUJCT0gKGNoYXIgKikgc2hvcnRuYW1lLAorCQkubmFtZQkJPSBEUklWRVJfTkFNRSwKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCQkvLyAucmVsZWFzZSA9IC4uLgogCQkvLyAuc3VzcGVuZCA9IC4uLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF9xZV91ZGMuaCBiL2RyaXZlcnMvdXNiL2dhZGdldC9mc2xfcWVfdWRjLmgKaW5kZXggMzFiMjcxMC4uYmVhNWI4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF9xZV91ZGMuaAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX3FlX3VkYy5oCkBAIC00MTksMTkgKzQxOSw0IEBACiAjZGVmaW5lIENQTV9VU0JfUkVTVEFSVF9UWF9PUENPREUgMHgwYgogI2RlZmluZSBDUE1fVVNCX0VQX1NISUZUIDUKIAotI2lmbmRlZiBDT05GSUdfQ1BNCi1pbmxpbmUgaW50IGNwbV9jb21tYW5kKHUzMiBjb21tYW5kLCB1OCBvcGNvZGUpCi17Ci0JcmV0dXJuIC1FT1BOT1RTVVBQOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgQ09ORklHX1FVSUNDX0VOR0lORQotaW5saW5lIGludCBxZV9pc3N1ZV9jbWQodTMyIGNtZCwgdTMyIGRldmljZSwgdTggbWNuX3Byb3RvY29sLAotCXUzMiBjbWRfaW5wdXQpCi17Ci0JcmV0dXJuIC1FT1BOT1RTVVBQOwotfQotI2VuZGlmCi0KICNlbmRpZiAgLyogX19GU0xfUUVfVURDX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9tYXNzX3N0b3JhZ2UuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9tYXNzX3N0b3JhZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTYxOWZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L21hc3Nfc3RvcmFnZS5jCkBAIC0wLDAgKzEsMjQwIEBACisvKgorICogbWFzc19zdG9yYWdlLmMgLS0gTWFzcyBTdG9yYWdlIFVTQiBHYWRnZXQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBBbGFuIFN0ZXJuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2Ftc3VuZyBFbGVjdHJvbmljcworICogICAgICAgICAgICAgICAgICAgIEF1dGhvcjogTWljaGFsIE5hemFyZXdpY3ogPG0ubmF6YXJld2ljekBzYW1zdW5nLmNvbT4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKworLyoKKyAqIFRoZSBNYXNzIFN0b3JhZ2UgR2FkZ2V0IGFjdHMgYXMgYSBVU0IgTWFzcyBTdG9yYWdlIGRldmljZSwKKyAqIGFwcGVhcmluZyB0byB0aGUgaG9zdCBhcyBhIGRpc2sgZHJpdmUgb3IgYXMgYSBDRC1ST00gZHJpdmUuICBJbgorICogYWRkaXRpb24gdG8gcHJvdmlkaW5nIGFuIGV4YW1wbGUgb2YgYSBnZW51aW5lbHkgdXNlZnVsIGdhZGdldAorICogZHJpdmVyIGZvciBhIFVTQiBkZXZpY2UsIGl0IGFsc28gaWxsdXN0cmF0ZXMgYSB0ZWNobmlxdWUgb2YKKyAqIGRvdWJsZS1idWZmZXJpbmcgZm9yIGluY3JlYXNlZCB0aHJvdWdocHV0LiAgTGFzdCBidXQgbm90IGxlYXN0LCBpdAorICogZ2l2ZXMgYW4gZWFzeSB3YXkgdG8gcHJvYmUgdGhlIGJlaGF2aW9yIG9mIHRoZSBNYXNzIFN0b3JhZ2UgZHJpdmVycworICogaW4gYSBVU0IgaG9zdC4KKyAqCisgKiBTaW5jZSB0aGlzIGZpbGUgc2VydmVzIG9ubHkgYWRtaW5pc3RyYXRpdmUgcHVycG9zZXMgYW5kIGFsbCB0aGUKKyAqIGJ1c2luZXNzIGxvZ2ljIGlzIGltcGxlbWVudGVkIGluIGZfbWFzc19zdG9yYWdlLiogZmlsZS4gIFJlYWQKKyAqIGNvbW1lbnRzIGluIHRoaXMgZmlsZSBmb3IgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbi4KKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgRFJJVkVSX0RFU0MJCSJNYXNzIFN0b3JhZ2UgR2FkZ2V0IgorI2RlZmluZSBEUklWRVJfVkVSU0lPTgkJIjIwMDkvMDkvMTEiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBrYnVpbGQgaXMgbm90IHZlcnkgY29vcGVyYXRpdmUgd2l0aCByZXNwZWN0IHRvIGxpbmtpbmcgc2VwYXJhdGVseQorICogY29tcGlsZWQgbGlicmFyeSBvYmplY3RzIGludG8gb25lIG1vZHVsZS4gIFNvIGZvciBub3cgd2Ugd29uJ3QgdXNlCisgKiBzZXBhcmF0ZSBjb21waWxhdGlvbiAuLi4gZW5zdXJpbmcgaW5pdC9leGl0IHNlY3Rpb25zIHdvcmsgdG8gc2hyaW5rCisgKiB0aGUgcnVudGltZSBmb290cHJpbnQsIGFuZCBnaXZpbmcgdXMgYXQgbGVhc3Qgc29tZSBwYXJ0cyBvZiB3aGF0CisgKiBhICJnY2MgLS1jb21iaW5lIC4uLiBwYXJ0MS5jIHBhcnQyLmMgcGFydDMuYyAuLi4gIiBidWlsZCB3b3VsZC4KKyAqLworCisjaW5jbHVkZSAiY29tcG9zaXRlLmMiCisjaW5jbHVkZSAidXNic3RyaW5nLmMiCisjaW5jbHVkZSAiY29uZmlnLmMiCisjaW5jbHVkZSAiZXBhdXRvY29uZi5jIgorI2luY2x1ZGUgImZfbWFzc19zdG9yYWdlLmMiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yIG1zZ19kZXZpY2VfZGVzYyA9IHsKKwkuYkxlbmd0aCA9CQlzaXplb2YgbXNnX2RldmljZV9kZXNjLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfREVWSUNFLAorCisJLmJjZFVTQiA9CQljcHVfdG9fbGUxNigweDAyMDApLAorCS5iRGV2aWNlQ2xhc3MgPQkJVVNCX0NMQVNTX1BFUl9JTlRFUkZBQ0UsCisKKwkvKiBWZW5kb3IgYW5kIHByb2R1Y3QgaWQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgbW9kdWxlIHBhcmFtZXRlcnMuICAqLworCS5pZFZlbmRvciA9CQljcHVfdG9fbGUxNihGU0dfVkVORE9SX0lEKSwKKwkuaWRQcm9kdWN0ID0JCWNwdV90b19sZTE2KEZTR19QUk9EVUNUX0lEKSwKKwkvKiAuYmNkRGV2aWNlID0gZihoYXJkd2FyZSkgKi8KKwkvKiAuaU1hbnVmYWN0dXJlciA9IERZTkFNSUMgKi8KKwkvKiAuaVByb2R1Y3QgPSBEWU5BTUlDICovCisJLyogTk8gU0VSSUFMIE5VTUJFUiAqLworCS5iTnVtQ29uZmlndXJhdGlvbnMgPQkxLAorfTsKKworc3RhdGljIHN0cnVjdCB1c2Jfb3RnX2Rlc2NyaXB0b3Igb3RnX2Rlc2NyaXB0b3IgPSB7CisJLmJMZW5ndGggPQkJc2l6ZW9mIG90Z19kZXNjcmlwdG9yLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfT1RHLAorCisJLyogUkVWSVNJVCBTUlAtb25seSBoYXJkd2FyZSBpcyBwb3NzaWJsZSwgYWx0aG91Z2gKKwkgKiBpdCB3b3VsZCBub3QgYmUgY2FsbGVkICJPVEciIC4uLgorCSAqLworCS5ibUF0dHJpYnV0ZXMgPQkJVVNCX09UR19TUlAgfCBVU0JfT1RHX0hOUCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICpvdGdfZGVzY1tdID0geworCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZvdGdfZGVzY3JpcHRvciwKKwlOVUxMLAorfTsKKworCisvKiBzdHJpbmcgSURzIGFyZSBhc3NpZ25lZCBkeW5hbWljYWxseSAqLworCisjZGVmaW5lIFNUUklOR19NQU5VRkFDVFVSRVJfSURYCQkwCisjZGVmaW5lIFNUUklOR19QUk9EVUNUX0lEWAkJMQorI2RlZmluZSBTVFJJTkdfQ09ORklHVVJBVElPTl9JRFgJMgorCitzdGF0aWMgY2hhciBtYW51ZmFjdHVyZXJbNTBdOworCitzdGF0aWMgc3RydWN0IHVzYl9zdHJpbmcgc3RyaW5nc19kZXZbXSA9IHsKKwlbU1RSSU5HX01BTlVGQUNUVVJFUl9JRFhdLnMgPSBtYW51ZmFjdHVyZXIsCisJW1NUUklOR19QUk9EVUNUX0lEWF0ucyA9IERSSVZFUl9ERVNDLAorCVtTVFJJTkdfQ09ORklHVVJBVElPTl9JRFhdLnMgPSAiU2VsZiBQb3dlcmVkIiwKKwl7ICB9IC8qIGVuZCBvZiBsaXN0ICovCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9nYWRnZXRfc3RyaW5ncyBzdHJpbmd0YWJfZGV2ID0geworCS5sYW5ndWFnZQk9IDB4MDQwOSwJLyogZW4tdXMgKi8KKwkuc3RyaW5ncwk9IHN0cmluZ3NfZGV2LAorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZ2FkZ2V0X3N0cmluZ3MgKmRldl9zdHJpbmdzW10gPSB7CisJJnN0cmluZ3RhYl9kZXYsCisJTlVMTCwKK307CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENvbmZpZ3VyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBmc2dfbW9kdWxlX3BhcmFtZXRlcnMgbW9kX2RhdGEgPSB7CisJLnN0YWxsID0gMQorfTsKK0ZTR19NT0RVTEVfUEFSQU1FVEVSUygvKiBubyBwcmVmaXggKi8sIG1vZF9kYXRhKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbXNnX3JlZ2lzdGVyZWQgPSAwOworc3RhdGljIHZvaWQgbXNnX2NsZWFudXAodm9pZCk7CisKK3N0YXRpYyBpbnQgX19pbml0IG1zZ19kb19jb25maWcoc3RydWN0IHVzYl9jb25maWd1cmF0aW9uICpjKQoreworCXN0cnVjdCBmc2dfY29tbW9uICpjb21tb247CisJc3RydWN0IGZzZ19jb25maWcgY29uZmlnOworCWludCByZXQ7CisKKwlpZiAoZ2FkZ2V0X2lzX290ZyhjLT5jZGV2LT5nYWRnZXQpKSB7CisJCWMtPmRlc2NyaXB0b3JzID0gb3RnX2Rlc2M7CisJCWMtPmJtQXR0cmlidXRlcyB8PSBVU0JfQ09ORklHX0FUVF9XQUtFVVA7CisJfQorCisJZnNnX2NvbmZpZ19mcm9tX3BhcmFtcygmY29uZmlnLCAmbW9kX2RhdGEpOworCWNvbmZpZy50aHJlYWRfZXhpdHMgPSAodm9pZCgqKShzdHJ1Y3QgZnNnX2NvbW1vbiopKSZtc2dfY2xlYW51cDsKKwljb21tb24gPSBmc2dfY29tbW9uX2luaXQoMCwgYy0+Y2RldiwgJmNvbmZpZyk7CisJaWYgKElTX0VSUihjb21tb24pKQorCQlyZXR1cm4gUFRSX0VSUihjb21tb24pOworCisJcmV0ID0gZnNnX2FkZChjLT5jZGV2LCBjLCBjb21tb24pOworCWZzZ19jb21tb25fcHV0KGNvbW1vbik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbiBtc2dfY29uZmlnX2RyaXZlciA9IHsKKwkubGFiZWwJCQk9ICJMaW51eCBGaWxlLUJhY2tlZCBTdG9yYWdlIiwKKwkuYmluZAkJCT0gbXNnX2RvX2NvbmZpZywKKwkuYkNvbmZpZ3VyYXRpb25WYWx1ZQk9IDEsCisJLyogLmlDb25maWd1cmF0aW9uID0gRFlOQU1JQyAqLworCS5ibUF0dHJpYnV0ZXMJCT0gVVNCX0NPTkZJR19BVFRfU0VMRlBPV0VSLAorfTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogR2FkZ2V0IEJpbmQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyBpbnQgX19pbml0IG1zZ19iaW5kKHN0cnVjdCB1c2JfY29tcG9zaXRlX2RldiAqY2RldikKK3sKKwlzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0ID0gY2Rldi0+Z2FkZ2V0OworCWludCBzdGF0dXM7CisKKwkvKiBBbGxvY2F0ZSBzdHJpbmcgZGVzY3JpcHRvciBudW1iZXJzIC4uLiBub3RlIHRoYXQgc3RyaW5nCisJICogY29udGVudHMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGNvbXBvc2l0ZV9kZXYgZ2x1ZS4KKwkgKi8KKworCS8qIGRldmljZSBkZXNjcmlwdG9yIHN0cmluZ3M6IG1hbnVmYWN0dXJlciwgcHJvZHVjdCAqLworCXNucHJpbnRmKG1hbnVmYWN0dXJlciwgc2l6ZW9mIG1hbnVmYWN0dXJlciwgIiVzICVzIHdpdGggJXMiLAorCSAgICAgICAgIGluaXRfdXRzbmFtZSgpLT5zeXNuYW1lLCBpbml0X3V0c25hbWUoKS0+cmVsZWFzZSwKKwkgICAgICAgICBnYWRnZXQtPm5hbWUpOworCXN0YXR1cyA9IHVzYl9zdHJpbmdfaWQoY2Rldik7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisJc3RyaW5nc19kZXZbU1RSSU5HX01BTlVGQUNUVVJFUl9JRFhdLmlkID0gc3RhdHVzOworCW1zZ19kZXZpY2VfZGVzYy5pTWFudWZhY3R1cmVyID0gc3RhdHVzOworCisJc3RhdHVzID0gdXNiX3N0cmluZ19pZChjZGV2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKwlzdHJpbmdzX2RldltTVFJJTkdfUFJPRFVDVF9JRFhdLmlkID0gc3RhdHVzOworCW1zZ19kZXZpY2VfZGVzYy5pUHJvZHVjdCA9IHN0YXR1czsKKworCXN0YXR1cyA9IHVzYl9zdHJpbmdfaWQoY2Rldik7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisJc3RyaW5nc19kZXZbU1RSSU5HX0NPTkZJR1VSQVRJT05fSURYXS5pZCA9IHN0YXR1czsKKwltc2dfY29uZmlnX2RyaXZlci5pQ29uZmlndXJhdGlvbiA9IHN0YXR1czsKKworCS8qIHJlZ2lzdGVyIG91ciBzZWNvbmQgY29uZmlndXJhdGlvbiAqLworCXN0YXR1cyA9IHVzYl9hZGRfY29uZmlnKGNkZXYsICZtc2dfY29uZmlnX2RyaXZlcik7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisKKwlkZXZfaW5mbygmZ2FkZ2V0LT5kZXYsIERSSVZFUl9ERVNDICIsIHZlcnNpb246ICIgRFJJVkVSX1ZFUlNJT04gIlxuIik7CisJc2V0X2JpdCgwLCAmbXNnX3JlZ2lzdGVyZWQpOworCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU29tZSBub2lzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIHN0cnVjdCB1c2JfY29tcG9zaXRlX2RyaXZlciBtc2dfZHJpdmVyID0geworCS5uYW1lCQk9ICJnX21hc3Nfc3RvcmFnZSIsCisJLmRldgkJPSAmbXNnX2RldmljZV9kZXNjLAorCS5zdHJpbmdzCT0gZGV2X3N0cmluZ3MsCisJLmJpbmQJCT0gbXNnX2JpbmQsCit9OworCitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworTU9EVUxFX0FVVEhPUigiTWljaGFsIE5hemFyZXdpY3oiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBfX2luaXQgbXNnX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gdXNiX2NvbXBvc2l0ZV9yZWdpc3RlcigmbXNnX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChtc2dfaW5pdCk7CisKK3N0YXRpYyB2b2lkIG1zZ19jbGVhbnVwKHZvaWQpCit7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCgwLCAmbXNnX3JlZ2lzdGVyZWQpKQorCQl1c2JfY29tcG9zaXRlX3VucmVnaXN0ZXIoJm1zZ19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQobXNnX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L211bHRpLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbXVsdGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjk1NjAxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L211bHRpLmMKQEAgLTAsMCArMSwzNTggQEAKKy8qCisgKiBtdWx0aS5jIC0tIE11bHRpZnVuY3Rpb24gQ29tcG9zaXRlIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBEYXZpZCBCcm93bmVsbAorICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU2Ftc3VuZyBFbGVjdHJvbmljcworICogQXV0aG9yOiBNaWNoYWwgTmF6YXJld2ljeiAobS5uYXphcmV3aWN6QHNhbXN1bmcuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisKKworI2lmIGRlZmluZWQgVVNCX0VUSF9STkRJUworIyAgdW5kZWYgVVNCX0VUSF9STkRJUworI2VuZGlmCisjaWZkZWYgQ09ORklHX1VTQl9FVEhfUk5ESVMKKyMgIGRlZmluZSBVU0JfRVRIX1JORElTIHkKKyNlbmRpZgorCisKKyNkZWZpbmUgRFJJVkVSX0RFU0MJCSJNdWx0aWZ1bmN0aW9uIENvbXBvc2l0ZSBHYWRnZXQiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCQkiMjAwOS8wNy8yMSIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBNVUxUSV9WRU5ET1JfTlVNCTB4MDUyNQkvKiBYWFggTmV0Q2hpcCAqLworI2RlZmluZSBNVUxUSV9QUk9EVUNUX05VTQkweGE0YWIJLyogWFhYICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBrYnVpbGQgaXMgbm90IHZlcnkgY29vcGVyYXRpdmUgd2l0aCByZXNwZWN0IHRvIGxpbmtpbmcgc2VwYXJhdGVseQorICogY29tcGlsZWQgbGlicmFyeSBvYmplY3RzIGludG8gb25lIG1vZHVsZS4gIFNvIGZvciBub3cgd2Ugd29uJ3QgdXNlCisgKiBzZXBhcmF0ZSBjb21waWxhdGlvbiAuLi4gZW5zdXJpbmcgaW5pdC9leGl0IHNlY3Rpb25zIHdvcmsgdG8gc2hyaW5rCisgKiB0aGUgcnVudGltZSBmb290cHJpbnQsIGFuZCBnaXZpbmcgdXMgYXQgbGVhc3Qgc29tZSBwYXJ0cyBvZiB3aGF0CisgKiBhICJnY2MgLS1jb21iaW5lIC4uLiBwYXJ0MS5jIHBhcnQyLmMgcGFydDMuYyAuLi4gIiBidWlsZCB3b3VsZC4KKyAqLworCisjaW5jbHVkZSAiY29tcG9zaXRlLmMiCisjaW5jbHVkZSAidXNic3RyaW5nLmMiCisjaW5jbHVkZSAiY29uZmlnLmMiCisjaW5jbHVkZSAiZXBhdXRvY29uZi5jIgorCisjaW5jbHVkZSAidV9zZXJpYWwuYyIKKyNpbmNsdWRlICJmX2FjbS5jIgorCisjaW5jbHVkZSAiZl9lY20uYyIKKyNpbmNsdWRlICJmX3N1YnNldC5jIgorI2lmZGVmIFVTQl9FVEhfUk5ESVMKKyMgIGluY2x1ZGUgImZfcm5kaXMuYyIKKyMgIGluY2x1ZGUgInJuZGlzLmMiCisjZW5kaWYKKyNpbmNsdWRlICJ1X2V0aGVyLmMiCisKKyN1bmRlZiBEQkcgICAgIC8qIHVfZXRoZXIuYyBoYXMgYnJva2VuIGlkZWEgYWJvdXQgbWFjcm9zICovCisjdW5kZWYgVkRCRyAgICAvKiBzbyBjbGVhbiB1cCBhZnRlciBpdCAqLworI3VuZGVmIEVSUk9SCisjdW5kZWYgSU5GTworI2luY2x1ZGUgImZfbWFzc19zdG9yYWdlLmMiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yIGRldmljZV9kZXNjID0geworCS5iTGVuZ3RoID0JCXNpemVvZiBkZXZpY2VfZGVzYywKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0RFVklDRSwKKworCS5iY2RVU0IgPQkJY3B1X3RvX2xlMTYoMHgwMjAwKSwKKworCS8qIC5iRGV2aWNlQ2xhc3MgPQkJVVNCX0NMQVNTX0NPTU0sICovCisJLyogLmJEZXZpY2VTdWJDbGFzcyA9CTAsICovCisJLyogLmJEZXZpY2VQcm90b2NvbCA9CTAsICovCisJLmJEZXZpY2VDbGFzcyA9CQkweEVGLAorCS5iRGV2aWNlU3ViQ2xhc3MgPQkyLAorCS5iRGV2aWNlUHJvdG9jb2wgPQkxLAorCS8qIC5iTWF4UGFja2V0U2l6ZTAgPSBmKGhhcmR3YXJlKSAqLworCisJLyogVmVuZG9yIGFuZCBwcm9kdWN0IGlkIGNhbiBiZSBvdmVycmlkZGVuIGJ5IG1vZHVsZSBwYXJhbWV0ZXJzLiAgKi8KKwkuaWRWZW5kb3IgPQkJY3B1X3RvX2xlMTYoTVVMVElfVkVORE9SX05VTSksCisJLmlkUHJvZHVjdCA9CQljcHVfdG9fbGUxNihNVUxUSV9QUk9EVUNUX05VTSksCisJLyogLmJjZERldmljZSA9IGYoaGFyZHdhcmUpICovCisJLyogLmlNYW51ZmFjdHVyZXIgPSBEWU5BTUlDICovCisJLyogLmlQcm9kdWN0ID0gRFlOQU1JQyAqLworCS8qIE5PIFNFUklBTCBOVU1CRVIgKi8KKwkuYk51bUNvbmZpZ3VyYXRpb25zID0JMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX290Z19kZXNjcmlwdG9yIG90Z19kZXNjcmlwdG9yID0geworCS5iTGVuZ3RoID0JCXNpemVvZiBvdGdfZGVzY3JpcHRvciwKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX09URywKKworCS8qIFJFVklTSVQgU1JQLW9ubHkgaGFyZHdhcmUgaXMgcG9zc2libGUsIGFsdGhvdWdoCisJICogaXQgd291bGQgbm90IGJlIGNhbGxlZCAiT1RHIiAuLi4KKwkgKi8KKwkuYm1BdHRyaWJ1dGVzID0JCVVTQl9PVEdfU1JQIHwgVVNCX09UR19ITlAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqb3RnX2Rlc2NbXSA9IHsKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmb3RnX2Rlc2NyaXB0b3IsCisJTlVMTCwKK307CisKKworLyogc3RyaW5nIElEcyBhcmUgYXNzaWduZWQgZHluYW1pY2FsbHkgKi8KKworI2RlZmluZSBTVFJJTkdfTUFOVUZBQ1RVUkVSX0lEWAkJMAorI2RlZmluZSBTVFJJTkdfUFJPRFVDVF9JRFgJCTEKKworc3RhdGljIGNoYXIgbWFudWZhY3R1cmVyWzUwXTsKKworc3RhdGljIHN0cnVjdCB1c2Jfc3RyaW5nIHN0cmluZ3NfZGV2W10gPSB7CisJW1NUUklOR19NQU5VRkFDVFVSRVJfSURYXS5zID0gbWFudWZhY3R1cmVyLAorCVtTVFJJTkdfUFJPRFVDVF9JRFhdLnMgPSBEUklWRVJfREVTQywKKwl7ICB9IC8qIGVuZCBvZiBsaXN0ICovCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9nYWRnZXRfc3RyaW5ncyBzdHJpbmd0YWJfZGV2ID0geworCS5sYW5ndWFnZQk9IDB4MDQwOSwJLyogZW4tdXMgKi8KKwkuc3RyaW5ncwk9IHN0cmluZ3NfZGV2LAorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZ2FkZ2V0X3N0cmluZ3MgKmRldl9zdHJpbmdzW10gPSB7CisJJnN0cmluZ3RhYl9kZXYsCisJTlVMTCwKK307CisKK3N0YXRpYyB1OCBob3N0YWRkcltFVEhfQUxFTl07CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENvbmZpZ3VyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBmc2dfbW9kdWxlX3BhcmFtZXRlcnMgbW9kX2RhdGEgPSB7CisJLnN0YWxsID0gMQorfTsKK0ZTR19NT0RVTEVfUEFSQU1FVEVSUygvKiBubyBwcmVmaXggKi8sIG1vZF9kYXRhKTsKKworc3RhdGljIHN0cnVjdCBmc2dfY29tbW9uICpmc2dfY29tbW9uOworCisKKyNpZmRlZiBVU0JfRVRIX1JORElTCisKK3N0YXRpYyBpbnQgX19pbml0IHJuZGlzX2RvX2NvbmZpZyhzdHJ1Y3QgdXNiX2NvbmZpZ3VyYXRpb24gKmMpCit7CisJaW50IHJldDsKKworCWlmIChnYWRnZXRfaXNfb3RnKGMtPmNkZXYtPmdhZGdldCkpIHsKKwkJYy0+ZGVzY3JpcHRvcnMgPSBvdGdfZGVzYzsKKwkJYy0+Ym1BdHRyaWJ1dGVzIHw9IFVTQl9DT05GSUdfQVRUX1dBS0VVUDsKKwl9CisKKwlyZXQgPSBybmRpc19iaW5kX2NvbmZpZyhjLCBob3N0YWRkcik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhY21fYmluZF9jb25maWcoYywgMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBmc2dfYWRkKGMtPmNkZXYsIGMsIGZzZ19jb21tb24pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2NvbmZpZ3VyYXRpb24gcm5kaXNfY29uZmlnX2RyaXZlciA9IHsKKwkubGFiZWwJCQk9ICJNdWx0aWZ1bmN0aW9uIENvbXBvc2l0ZSAoUk5ESVMgKyBNUyArIEFDTSkiLAorCS5iaW5kCQkJPSBybmRpc19kb19jb25maWcsCisJLmJDb25maWd1cmF0aW9uVmFsdWUJPSAyLAorCS8qIC5pQ29uZmlndXJhdGlvbiA9IERZTkFNSUMgKi8KKwkuYm1BdHRyaWJ1dGVzCQk9IFVTQl9DT05GSUdfQVRUX1NFTEZQT1dFUiwKK307CisKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1VTQl9HX01VTFRJX0NEQworCitzdGF0aWMgaW50IF9faW5pdCBjZGNfZG9fY29uZmlnKHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbiAqYykKK3sKKwlpbnQgcmV0OworCisJaWYgKGdhZGdldF9pc19vdGcoYy0+Y2Rldi0+Z2FkZ2V0KSkgeworCQljLT5kZXNjcmlwdG9ycyA9IG90Z19kZXNjOworCQljLT5ibUF0dHJpYnV0ZXMgfD0gVVNCX0NPTkZJR19BVFRfV0FLRVVQOworCX0KKworCXJldCA9IGVjbV9iaW5kX2NvbmZpZyhjLCBob3N0YWRkcik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhY21fYmluZF9jb25maWcoYywgMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBmc2dfYWRkKGMtPmNkZXYsIGMsIGZzZ19jb21tb24pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2NvbmZpZ3VyYXRpb24gY2RjX2NvbmZpZ19kcml2ZXIgPSB7CisJLmxhYmVsCQkJPSAiTXVsdGlmdW5jdGlvbiBDb21wb3NpdGUgKENEQyArIE1TICsgQUNNKSIsCisJLmJpbmQJCQk9IGNkY19kb19jb25maWcsCisJLmJDb25maWd1cmF0aW9uVmFsdWUJPSAxLAorCS8qIC5pQ29uZmlndXJhdGlvbiA9IERZTkFNSUMgKi8KKwkuYm1BdHRyaWJ1dGVzCQk9IFVTQl9DT05GSUdfQVRUX1NFTEZQT1dFUiwKK307CisKKyNlbmRpZgorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBHYWRnZXQgQmluZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIGludCBfX2luaXQgbXVsdGlfYmluZChzdHJ1Y3QgdXNiX2NvbXBvc2l0ZV9kZXYgKmNkZXYpCit7CisJc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCA9IGNkZXYtPmdhZGdldDsKKwlpbnQgc3RhdHVzLCBnY251bTsKKworCWlmICghY2FuX3N1cHBvcnRfZWNtKGNkZXYtPmdhZGdldCkpIHsKKwkJZGV2X2VycigmZ2FkZ2V0LT5kZXYsICJjb250cm9sbGVyICclcycgbm90IHVzYWJsZVxuIiwKKwkJICAgICAgICBnYWRnZXQtPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBzZXQgdXAgbmV0d29yayBsaW5rIGxheWVyICovCisJc3RhdHVzID0gZ2V0aGVyX3NldHVwKGNkZXYtPmdhZGdldCwgaG9zdGFkZHIpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJLyogc2V0IHVwIHNlcmlhbCBsaW5rIGxheWVyICovCisJc3RhdHVzID0gZ3NlcmlhbF9zZXR1cChjZGV2LT5nYWRnZXQsIDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGZhaWwwOworCisJLyogc2V0IHVwIG1hc3Mgc3RvcmFnZSBmdW5jdGlvbiAqLworCWZzZ19jb21tb24gPSBmc2dfY29tbW9uX2Zyb21fcGFyYW1zKDAsIGNkZXYsICZtb2RfZGF0YSk7CisJaWYgKElTX0VSUihmc2dfY29tbW9uKSkgeworCQlzdGF0dXMgPSBQVFJfRVJSKGZzZ19jb21tb24pOworCQlnb3RvIGZhaWwxOworCX0KKworCisJZ2NudW0gPSB1c2JfZ2FkZ2V0X2NvbnRyb2xsZXJfbnVtYmVyKGdhZGdldCk7CisJaWYgKGdjbnVtID49IDApCisJCWRldmljZV9kZXNjLmJjZERldmljZSA9IGNwdV90b19sZTE2KDB4MDMwMCB8IGdjbnVtKTsKKwllbHNlIHsKKwkJLyogV2UgYXNzdW1lIHRoYXQgY2FuX3N1cHBvcnRfZWNtKCkgdGVsbHMgdGhlIHRydXRoOworCQkgKiBidXQgaWYgdGhlIGNvbnRyb2xsZXIgaXNuJ3QgcmVjb2duaXplZCBhdCBhbGwgdGhlbgorCQkgKiB0aGF0IGFzc3VtcHRpb24gaXMgYSBiaXQgbW9yZSBsaWtlbHkgdG8gYmUgd3JvbmcuCisJCSAqLworCQlXQVJOSU5HKGNkZXYsICJjb250cm9sbGVyICclcycgbm90IHJlY29nbml6ZWRcbiIsCisJCSAgICAgICAgZ2FkZ2V0LT5uYW1lKTsKKwkJZGV2aWNlX2Rlc2MuYmNkRGV2aWNlID0gY3B1X3RvX2xlMTYoMHgwMzAwIHwgMHgwMDk5KTsKKwl9CisKKworCS8qIEFsbG9jYXRlIHN0cmluZyBkZXNjcmlwdG9yIG51bWJlcnMgLi4uIG5vdGUgdGhhdCBzdHJpbmcKKwkgKiBjb250ZW50cyBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgY29tcG9zaXRlX2RldiBnbHVlLgorCSAqLworCisJLyogZGV2aWNlIGRlc2NyaXB0b3Igc3RyaW5nczogbWFudWZhY3R1cmVyLCBwcm9kdWN0ICovCisJc25wcmludGYobWFudWZhY3R1cmVyLCBzaXplb2YgbWFudWZhY3R1cmVyLCAiJXMgJXMgd2l0aCAlcyIsCisJICAgICAgICAgaW5pdF91dHNuYW1lKCktPnN5c25hbWUsIGluaXRfdXRzbmFtZSgpLT5yZWxlYXNlLAorCSAgICAgICAgIGdhZGdldC0+bmFtZSk7CisJc3RhdHVzID0gdXNiX3N0cmluZ19pZChjZGV2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBmYWlsMjsKKwlzdHJpbmdzX2RldltTVFJJTkdfTUFOVUZBQ1RVUkVSX0lEWF0uaWQgPSBzdGF0dXM7CisJZGV2aWNlX2Rlc2MuaU1hbnVmYWN0dXJlciA9IHN0YXR1czsKKworCXN0YXR1cyA9IHVzYl9zdHJpbmdfaWQoY2Rldik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZmFpbDI7CisJc3RyaW5nc19kZXZbU1RSSU5HX1BST0RVQ1RfSURYXS5pZCA9IHN0YXR1czsKKwlkZXZpY2VfZGVzYy5pUHJvZHVjdCA9IHN0YXR1czsKKworI2lmZGVmIFVTQl9FVEhfUk5ESVMKKwkvKiByZWdpc3RlciBvdXIgZmlyc3QgY29uZmlndXJhdGlvbiAqLworCXN0YXR1cyA9IHVzYl9hZGRfY29uZmlnKGNkZXYsICZybmRpc19jb25maWdfZHJpdmVyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBmYWlsMjsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1VTQl9HX01VTFRJX0NEQworCS8qIHJlZ2lzdGVyIG91ciBzZWNvbmQgY29uZmlndXJhdGlvbiAqLworCXN0YXR1cyA9IHVzYl9hZGRfY29uZmlnKGNkZXYsICZjZGNfY29uZmlnX2RyaXZlcik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZmFpbDI7CisjZW5kaWYKKworCWRldl9pbmZvKCZnYWRnZXQtPmRldiwgRFJJVkVSX0RFU0MgIiwgdmVyc2lvbjogIiBEUklWRVJfVkVSU0lPTiAiXG4iKTsKKwlmc2dfY29tbW9uX3B1dChmc2dfY29tbW9uKTsKKwlyZXR1cm4gMDsKKworZmFpbDI6CisJZnNnX2NvbW1vbl9wdXQoZnNnX2NvbW1vbik7CitmYWlsMToKKwlnc2VyaWFsX2NsZWFudXAoKTsKK2ZhaWwwOgorCWdldGhlcl9jbGVhbnVwKCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBfX2V4aXQgbXVsdGlfdW5iaW5kKHN0cnVjdCB1c2JfY29tcG9zaXRlX2RldiAqY2RldikKK3sKKwlnc2VyaWFsX2NsZWFudXAoKTsKKwlnZXRoZXJfY2xlYW51cCgpOworCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU29tZSBub2lzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIHN0cnVjdCB1c2JfY29tcG9zaXRlX2RyaXZlciBtdWx0aV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImdfbXVsdGkiLAorCS5kZXYJCT0gJmRldmljZV9kZXNjLAorCS5zdHJpbmdzCT0gZGV2X3N0cmluZ3MsCisJLmJpbmQJCT0gbXVsdGlfYmluZCwKKwkudW5iaW5kCQk9IF9fZXhpdF9wKG11bHRpX3VuYmluZCksCit9OworCitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworTU9EVUxFX0FVVEhPUigiTWljaGFsIE5hemFyZXdpY3oiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBfX2luaXQgZ19tdWx0aV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHVzYl9jb21wb3NpdGVfcmVnaXN0ZXIoJm11bHRpX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChnX211bHRpX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgZ19tdWx0aV9jbGVhbnVwKHZvaWQpCit7CisJdXNiX2NvbXBvc2l0ZV91bnJlZ2lzdGVyKCZtdWx0aV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoZ19tdWx0aV9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9zdG9yYWdlX2NvbW1vbi5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3N0b3JhZ2VfY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY4ZDhlZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9zdG9yYWdlX2NvbW1vbi5jCkBAIC0wLDAgKzEsNzc4IEBACisvKgorICogc3RvcmFnZV9jb21tb24uYyAtLSBDb21tb24gZGVmaW5pdGlvbnMgZm9yIG1hc3Mgc3RvcmFnZSBmdW5jdGlvbmFsaXR5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQWxhbiBTdGVybgorICogQ29weWVpZ2h0IChDKSAyMDA5IFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqIEF1dGhvcjogTWljaGFsIE5hemFyZXdpY3ogKG0ubmF6YXJld2ljekBzYW1zdW5nLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworCisvKgorICogVGhpcyBmaWxlIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgaWRlbnRpZmllcnMgdXNlZCBpbiBVU0Igc3RyaW5ncyB0bworICogYmUgZGVmaW5lZCAoZWFjaCBvZiB0eXBlIHBvaW50ZXIgdG8gY2hhcik6CisgKiAgLSBmc2dfc3RyaW5nX21hbnVmYWN0dXJlciAtLSBuYW1lIG9mIHRoZSBtYW51ZmFjdHVyZXIKKyAqICAtIGZzZ19zdHJpbmdfcHJvZHVjdCAgICAgIC0tIG5hbWUgb2YgdGhlIHByb2R1Y3QKKyAqICAtIGZzZ19zdHJpbmdfc2VyaWFsICAgICAgIC0tIHByb2R1Y3QncyBzZXJpYWwKKyAqICAtIGZzZ19zdHJpbmdfY29uZmlnICAgICAgIC0tIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24KKyAqICAtIGZzZ19zdHJpbmdfaW50ZXJmYWNlICAgIC0tIG5hbWUgb2YgdGhlIGludGVyZmFjZQorICogVGhlIGZpcnN0IGZvdXIgYXJlIG9ubHkgbmVlZGVkIHdoZW4gRlNHX0RFU0NSSVBUT1JTX0RFVklDRV9TVFJJTkdTCisgKiBtYWNybyBpcyBkZWZpbmVkIHByaW9yIHRvIGluY2x1ZGluZyB0aGlzIGZpbGUuCisgKi8KKworLyoKKyAqIFdoZW4gRlNHX05PX0lOVFJfRVAgaXMgZGVmaW5lZCBmc2dfZnNfaW50cl9pbl9kZXNjIGFuZAorICogZnNnX2hzX2ludHJfaW5fZGVzYyBvYmplY3RzIGFzIHdlbGwgYXMKKyAqIEZTR19GU19GVU5DVElPTl9QUkVfRVBfRU5UUklFUyBhbmQgRlNHX0hTX0ZVTkNUSU9OX1BSRV9FUF9FTlRSSUVTCisgKiBtYWNyb3MgYXJlIG5vdCBkZWZpbmVkLgorICoKKyAqIFdoZW4gRlNHX05PX0RFVklDRV9TVFJJTkdTIGlzIGRlZmluZWQgRlNHX1NUUklOR19NQU5VRkFDVFVSRVIsCisgKiBGU0dfU1RSSU5HX1BST0RVQ1QsIEZTR19TVFJJTkdfU0VSSUFMIGFuZCBGU0dfU1RSSU5HX0NPTkZJRyBhcmUgbm90CisgKiBkZWZpbmVkIChhcyB3ZWxsIGFzIGNvcnJlc3BvbmRpbmcgZW50cmllcyBpbiBzdHJpbmcgdGFibGVzIGFyZQorICogbWlzc2luZykgYW5kIEZTR19TVFJJTkdfSU5URVJGQUNFIGhhcyB2YWx1ZSBvZiB6ZXJvLgorICoKKyAqIFdoZW4gRlNHX05PX09URyBpcyBkZWZpbmVkIGZzZ19vdGdfZGVzYyB3b24ndCBiZSBkZWZpbmVkLgorICovCisKKy8qCisgKiBXaGVuIEZTR19CVUZGSERfU1RBVElDX0JVRkZFUiBpcyBkZWZpbmVkIHdoZW4gdGhpcyBmaWxlIGlzIGluY2x1ZGVkCisgKiB0aGUgZnNnX2J1ZmZoZCBzdHJ1Y3R1cmUncyBidWYgZmllbGQgd2lsbCBiZSBhbiBhcnJheSBvZiBGU0dfQlVGTEVOCisgKiBjaGFyYWN0ZXJzIHJhdGhlciB0aGVuIGEgcG9pbnRlciB0byB2b2lkLgorICovCisKKworI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworCisvKiBUaGFua3MgdG8gTmV0Q2hpcCBUZWNobm9sb2dpZXMgZm9yIGRvbmF0aW5nIHRoaXMgcHJvZHVjdCBJRC4KKyAqCisgKiBETyBOT1QgUkVVU0UgVEhFU0UgSURzIHdpdGggYW55IG90aGVyIGRyaXZlciEhICBFdmVyISEKKyAqIEluc3RlYWQ6ICBhbGxvY2F0ZSB5b3VyIG93biwgdXNpbmcgbm9ybWFsIFVTQi1JRiBwcm9jZWR1cmVzLiAqLworI2RlZmluZSBGU0dfVkVORE9SX0lECTB4MDUyNQkvKiBOZXRDaGlwICovCisjZGVmaW5lIEZTR19QUk9EVUNUX0lECTB4YTRhNQkvKiBMaW51eC1VU0IgRmlsZS1iYWNrZWQgU3RvcmFnZSBHYWRnZXQgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyNpZm5kZWYgREVCVUcKKyN1bmRlZiBWRVJCT1NFX0RFQlVHCisjdW5kZWYgRFVNUF9NU0dTCisjZW5kaWYgLyogIURFQlVHICovCisKKyNpZmRlZiBWRVJCT1NFX0RFQlVHCisjZGVmaW5lIFZMREJHCUxEQkcKKyNlbHNlCisjZGVmaW5lIFZMREJHKGx1biwgZm10LCBhcmdzLi4uKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogVkVSQk9TRV9ERUJVRyAqLworCisjZGVmaW5lIExEQkcobHVuLCBmbXQsIGFyZ3MuLi4pICAgZGV2X2RiZyAoJihsdW4pLT5kZXYsIGZtdCwgIyMgYXJncykKKyNkZWZpbmUgTEVSUk9SKGx1biwgZm10LCBhcmdzLi4uKSBkZXZfZXJyICgmKGx1biktPmRldiwgZm10LCAjIyBhcmdzKQorI2RlZmluZSBMV0FSTihsdW4sIGZtdCwgYXJncy4uLikgIGRldl93YXJuKCYobHVuKS0+ZGV2LCBmbXQsICMjIGFyZ3MpCisjZGVmaW5lIExJTkZPKGx1biwgZm10LCBhcmdzLi4uKSAgZGV2X2luZm8oJihsdW4pLT5kZXYsIGZtdCwgIyMgYXJncykKKworLyogS2VlcCB0aG9zZSBtYWNyb3MgaW4gc3luYyB3aXRoIHRob3MgaW4KKyAqIGluY2x1ZGUvbGludXgvdWJzL2NvbXBvc2l0ZS5oIG9yIGVsc2UgR0NDIHdpbGwgY29tcGxhaW4uICBJZiB0aGV5CisgKiBhcmUgaWRlbnRpY2FsICh0aGUgc2FtZSBuYW1lcyBvZiBhcmd1bWVudHMsIHdoaXRlIHNwYWNlcyBpbiB0aGUKKyAqIHNhbWUgcGxhY2VzKSBHQ0Mgd2lsbCBhbGxvdyByZWRlZmluaXRpb24gb3RoZXJ3aXNlIChldmVuIGlmIHNvbWUKKyAqIHdoaXRlIHNwYWNlIGlzIHJlbW92ZWQgb3IgYWRkZWQpIHdhcm5pbmcgd2lsbCBiZSBpc3N1ZWQuICBObworICogY2hlY2tpbmcgaWYgdGhvc2Ugc3ltYm9scyBpcyBkZWZpbmVkIGlzIHBlcmZvcm1lZCBiZWNhdXNlIHdhcm5pbmcKKyAqIGlzIGRlc2lyZWQgd2hlbiB0aG9zZSBtYWNyb3Mgd2VyZSBkZWZpbmVkIGJ5IHNvbWVvbmUgZWxzZSB0byBtZWFuCisgKiBzb21ldGhpbmcgZWxzZS4gKi8KKyNkZWZpbmUgREJHKGQsIGZtdCwgYXJncy4uLikgICAgIGRldl9kYmcoJihkKS0+Z2FkZ2V0LT5kZXYgLCBmbXQgLCAjIyBhcmdzKQorI2RlZmluZSBWREJHKGQsIGZtdCwgYXJncy4uLikgICAgZGV2X3ZkYmcoJihkKS0+Z2FkZ2V0LT5kZXYgLCBmbXQgLCAjIyBhcmdzKQorI2RlZmluZSBFUlJPUihkLCBmbXQsIGFyZ3MuLi4pICAgZGV2X2VycigmKGQpLT5nYWRnZXQtPmRldiAsIGZtdCAsICMjIGFyZ3MpCisjZGVmaW5lIFdBUk5JTkcoZCwgZm10LCBhcmdzLi4uKSBkZXZfd2FybigmKGQpLT5nYWRnZXQtPmRldiAsIGZtdCAsICMjIGFyZ3MpCisjZGVmaW5lIElORk8oZCwgZm10LCBhcmdzLi4uKSAgICBkZXZfaW5mbygmKGQpLT5nYWRnZXQtPmRldiAsIGZtdCAsICMjIGFyZ3MpCisKKworCisjaWZkZWYgRFVNUF9NU0dTCisKKyMgIGRlZmluZSBkdW1wX21zZyhmc2csIC8qIGNvbnN0IGNoYXIgKiAqLyBsYWJlbCwJCQlcCisJCSAgIC8qIGNvbnN0IHU4ICogKi8gYnVmLCAvKiB1bnNpZ25lZCAqLyBsZW5ndGgpIGRvIHsJXAorCWlmIChsZW5ndGggPCA1MTIpIHsJCQkJCQlcCisJCURCRyhmc2csICIlcywgbGVuZ3RoICV1OlxuIiwgbGFiZWwsIGxlbmd0aCk7CQlcCisJCXByaW50X2hleF9kdW1wKEtFUk5fREVCVUcsICIiLCBEVU1QX1BSRUZJWF9PRkZTRVQsCVwKKwkJCSAgICAgICAxNiwgMSwgYnVmLCBsZW5ndGgsIDApOwkJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjICBkZWZpbmUgZHVtcF9jZGIoZnNnKSBkbyB7IH0gd2hpbGUgKDApCisKKyNlbHNlCisKKyMgIGRlZmluZSBkdW1wX21zZyhmc2csIC8qIGNvbnN0IGNoYXIgKiAqLyBsYWJlbCwgXAorCQkgICAvKiBjb25zdCB1OCAqICovIGJ1ZiwgLyogdW5zaWduZWQgKi8gbGVuZ3RoKSBkbyB7IH0gd2hpbGUgKDApCisKKyMgIGlmZGVmIFZFUkJPU0VfREVCVUcKKworIyAgICBkZWZpbmUgZHVtcF9jZGIoZnNnKQkJCQkJCVwKKwlwcmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCAiU0NTSSBDREI6ICIsIERVTVBfUFJFRklYX05PTkUsCVwKKwkJICAgICAgIDE2LCAxLCAoZnNnKS0+Y21uZCwgKGZzZyktPmNtbmRfc2l6ZSwgMCkJCVwKKworIyAgZWxzZQorCisjICAgIGRlZmluZSBkdW1wX2NkYihmc2cpIGRvIHsgfSB3aGlsZSAoMCkKKworIyAgZW5kaWYgLyogVkVSQk9TRV9ERUJVRyAqLworCisjZW5kaWYgLyogRFVNUF9NU0dTICovCisKKworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU0NTSSBkZXZpY2UgdHlwZXMgKi8KKyNkZWZpbmUgVFlQRV9ESVNLCTB4MDAKKyNkZWZpbmUgVFlQRV9DRFJPTQkweDA1CisKKy8qIFVTQiBwcm90b2NvbCB2YWx1ZSA9IHRoZSB0cmFuc3BvcnQgbWV0aG9kICovCisjZGVmaW5lIFVTQl9QUl9DQkkJMHgwMAkJLyogQ29udHJvbC9CdWxrL0ludGVycnVwdCAqLworI2RlZmluZSBVU0JfUFJfQ0IJMHgwMQkJLyogQ29udHJvbC9CdWxrIHcvbyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgVVNCX1BSX0JVTEsJMHg1MAkJLyogQnVsay1vbmx5ICovCisKKy8qIFVTQiBzdWJjbGFzcyB2YWx1ZSA9IHRoZSBwcm90b2NvbCBlbmNhcHN1bGF0aW9uICovCisjZGVmaW5lIFVTQl9TQ19SQkMJMHgwMQkJLyogUmVkdWNlZCBCbG9jayBDb21tYW5kcyAoZmxhc2gpICovCisjZGVmaW5lIFVTQl9TQ184MDIwCTB4MDIJCS8qIFNGRi04MDIwaSwgTU1DLTIsIEFUQVBJIChDRC1ST00pICovCisjZGVmaW5lIFVTQl9TQ19RSUMJMHgwMwkJLyogUUlDLTE1NyAodGFwZSkgKi8KKyNkZWZpbmUgVVNCX1NDX1VGSQkweDA0CQkvKiBVRkkgKGZsb3BweSkgKi8KKyNkZWZpbmUgVVNCX1NDXzgwNzAJMHgwNQkJLyogU0ZGLTgwNzBpIChyZW1vdmFibGUpICovCisjZGVmaW5lIFVTQl9TQ19TQ1NJCTB4MDYJCS8qIFRyYW5zcGFyZW50IFNDU0kgKi8KKworLyogQnVsay1vbmx5IGRhdGEgc3RydWN0dXJlcyAqLworCisvKiBDb21tYW5kIEJsb2NrIFdyYXBwZXIgKi8KK3N0cnVjdCBmc2dfYnVsa19jYl93cmFwIHsKKwlfX2xlMzIJU2lnbmF0dXJlOwkJLyogQ29udGFpbnMgJ1VTQkMnICovCisJdTMyCVRhZzsJCQkvKiBVbmlxdWUgcGVyIGNvbW1hbmQgaWQgKi8KKwlfX2xlMzIJRGF0YVRyYW5zZmVyTGVuZ3RoOwkvKiBTaXplIG9mIHRoZSBkYXRhICovCisJdTgJRmxhZ3M7CQkJLyogRGlyZWN0aW9uIGluIGJpdCA3ICovCisJdTgJTHVuOwkJCS8qIExVTiAobm9ybWFsbHkgMCkgKi8KKwl1OAlMZW5ndGg7CQkJLyogT2YgdGhlIENEQiwgPD0gTUFYX0NPTU1BTkRfU0laRSAqLworCXU4CUNEQlsxNl07CQkvKiBDb21tYW5kIERhdGEgQmxvY2sgKi8KK307CisKKyNkZWZpbmUgVVNCX0JVTEtfQ0JfV1JBUF9MRU4JMzEKKyNkZWZpbmUgVVNCX0JVTEtfQ0JfU0lHCQkweDQzNDI1MzU1CS8qIFNwZWxscyBvdXQgVVNCQyAqLworI2RlZmluZSBVU0JfQlVMS19JTl9GTEFHCTB4ODAKKworLyogQ29tbWFuZCBTdGF0dXMgV3JhcHBlciAqLworc3RydWN0IGJ1bGtfY3Nfd3JhcCB7CisJX19sZTMyCVNpZ25hdHVyZTsJCS8qIFNob3VsZCA9ICdVU0JTJyAqLworCXUzMglUYWc7CQkJLyogU2FtZSBhcyBvcmlnaW5hbCBjb21tYW5kICovCisJX19sZTMyCVJlc2lkdWU7CQkvKiBBbW91bnQgbm90IHRyYW5zZmVycmVkICovCisJdTgJU3RhdHVzOwkJCS8qIFNlZSBiZWxvdyAqLworfTsKKworI2RlZmluZSBVU0JfQlVMS19DU19XUkFQX0xFTgkxMworI2RlZmluZSBVU0JfQlVMS19DU19TSUcJCTB4NTM0MjUzNTUJLyogU3BlbGxzIG91dCAnVVNCUycgKi8KKyNkZWZpbmUgVVNCX1NUQVRVU19QQVNTCQkwCisjZGVmaW5lIFVTQl9TVEFUVVNfRkFJTAkJMQorI2RlZmluZSBVU0JfU1RBVFVTX1BIQVNFX0VSUk9SCTIKKworLyogQnVsay1vbmx5IGNsYXNzIHNwZWNpZmljIHJlcXVlc3RzICovCisjZGVmaW5lIFVTQl9CVUxLX1JFU0VUX1JFUVVFU1QJCTB4ZmYKKyNkZWZpbmUgVVNCX0JVTEtfR0VUX01BWF9MVU5fUkVRVUVTVAkweGZlCisKKworLyogQ0JJIEludGVycnVwdCBkYXRhIHN0cnVjdHVyZSAqLworc3RydWN0IGludGVycnVwdF9kYXRhIHsKKwl1OAliVHlwZTsKKwl1OAliVmFsdWU7Cit9OworCisjZGVmaW5lIENCSV9JTlRFUlJVUFRfREFUQV9MRU4JCTIKKworLyogQ0JJIEFjY2VwdCBEZXZpY2UtU3BlY2lmaWMgQ29tbWFuZCByZXF1ZXN0ICovCisjZGVmaW5lIFVTQl9DQklfQURTQ19SRVFVRVNUCQkweDAwCisKKworLyogTGVuZ3RoIG9mIGEgU0NTSSBDb21tYW5kIERhdGEgQmxvY2sgKi8KKyNkZWZpbmUgTUFYX0NPTU1BTkRfU0laRQkxNgorCisvKiBTQ1NJIGNvbW1hbmRzIHRoYXQgd2UgcmVjb2duaXplICovCisjZGVmaW5lIFNDX0ZPUk1BVF9VTklUCQkJMHgwNAorI2RlZmluZSBTQ19JTlFVSVJZCQkJMHgxMgorI2RlZmluZSBTQ19NT0RFX1NFTEVDVF82CQkweDE1CisjZGVmaW5lIFNDX01PREVfU0VMRUNUXzEwCQkweDU1CisjZGVmaW5lIFNDX01PREVfU0VOU0VfNgkJCTB4MWEKKyNkZWZpbmUgU0NfTU9ERV9TRU5TRV8xMAkJMHg1YQorI2RlZmluZSBTQ19QUkVWRU5UX0FMTE9XX01FRElVTV9SRU1PVkFMCTB4MWUKKyNkZWZpbmUgU0NfUkVBRF82CQkJMHgwOAorI2RlZmluZSBTQ19SRUFEXzEwCQkJMHgyOAorI2RlZmluZSBTQ19SRUFEXzEyCQkJMHhhOAorI2RlZmluZSBTQ19SRUFEX0NBUEFDSVRZCQkweDI1CisjZGVmaW5lIFNDX1JFQURfRk9STUFUX0NBUEFDSVRJRVMJMHgyMworI2RlZmluZSBTQ19SRUFEX0hFQURFUgkJCTB4NDQKKyNkZWZpbmUgU0NfUkVBRF9UT0MJCQkweDQzCisjZGVmaW5lIFNDX1JFTEVBU0UJCQkweDE3CisjZGVmaW5lIFNDX1JFUVVFU1RfU0VOU0UJCTB4MDMKKyNkZWZpbmUgU0NfUkVTRVJWRQkJCTB4MTYKKyNkZWZpbmUgU0NfU0VORF9ESUFHTk9TVElDCQkweDFkCisjZGVmaW5lIFNDX1NUQVJUX1NUT1BfVU5JVAkJMHgxYgorI2RlZmluZSBTQ19TWU5DSFJPTklaRV9DQUNIRQkJMHgzNQorI2RlZmluZSBTQ19URVNUX1VOSVRfUkVBRFkJCTB4MDAKKyNkZWZpbmUgU0NfVkVSSUZZCQkJMHgyZgorI2RlZmluZSBTQ19XUklURV82CQkJMHgwYQorI2RlZmluZSBTQ19XUklURV8xMAkJCTB4MmEKKyNkZWZpbmUgU0NfV1JJVEVfMTIJCQkweGFhCisKKy8qIFNDU0kgU2Vuc2UgS2V5L0FkZGl0aW9uYWwgU2Vuc2UgQ29kZS9BU0MgUXVhbGlmaWVyIHZhbHVlcyAqLworI2RlZmluZSBTU19OT19TRU5TRQkJCQkwCisjZGVmaW5lIFNTX0NPTU1VTklDQVRJT05fRkFJTFVSRQkJMHgwNDA4MDAKKyNkZWZpbmUgU1NfSU5WQUxJRF9DT01NQU5ECQkJMHgwNTIwMDAKKyNkZWZpbmUgU1NfSU5WQUxJRF9GSUVMRF9JTl9DREIJCQkweDA1MjQwMAorI2RlZmluZSBTU19MT0dJQ0FMX0JMT0NLX0FERFJFU1NfT1VUX09GX1JBTkdFCTB4MDUyMTAwCisjZGVmaW5lIFNTX0xPR0lDQUxfVU5JVF9OT1RfU1VQUE9SVEVECQkweDA1MjUwMAorI2RlZmluZSBTU19NRURJVU1fTk9UX1BSRVNFTlQJCQkweDAyM2EwMAorI2RlZmluZSBTU19NRURJVU1fUkVNT1ZBTF9QUkVWRU5URUQJCTB4MDU1MzAyCisjZGVmaW5lIFNTX05PVF9SRUFEWV9UT19SRUFEWV9UUkFOU0lUSU9OCTB4MDYyODAwCisjZGVmaW5lIFNTX1JFU0VUX09DQ1VSUkVECQkJMHgwNjI5MDAKKyNkZWZpbmUgU1NfU0FWSU5HX1BBUkFNRVRFUlNfTk9UX1NVUFBPUlRFRAkweDA1MzkwMAorI2RlZmluZSBTU19VTlJFQ09WRVJFRF9SRUFEX0VSUk9SCQkweDAzMTEwMAorI2RlZmluZSBTU19XUklURV9FUlJPUgkJCQkweDAzMGMwMgorI2RlZmluZSBTU19XUklURV9QUk9URUNURUQJCQkweDA3MjcwMAorCisjZGVmaW5lIFNLKHgpCQkoKHU4KSAoKHgpID4+IDE2KSkJLyogU2Vuc2UgS2V5IGJ5dGUsIGV0Yy4gKi8KKyNkZWZpbmUgQVNDKHgpCQkoKHU4KSAoKHgpID4+IDgpKQorI2RlZmluZSBBU0NRKHgpCQkoKHU4KSAoeCkpCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCitzdHJ1Y3QgZnNnX2x1biB7CisJc3RydWN0IGZpbGUJKmZpbHA7CisJbG9mZl90CQlmaWxlX2xlbmd0aDsKKwlsb2ZmX3QJCW51bV9zZWN0b3JzOworCisJdW5zaWduZWQgaW50CWluaXRpYWxseV9ybzoxOworCXVuc2lnbmVkIGludAlybzoxOworCXVuc2lnbmVkIGludAlyZW1vdmFibGU6MTsKKwl1bnNpZ25lZCBpbnQJY2Ryb206MTsKKwl1bnNpZ25lZCBpbnQJcHJldmVudF9tZWRpdW1fcmVtb3ZhbDoxOworCXVuc2lnbmVkIGludAlyZWdpc3RlcmVkOjE7CisJdW5zaWduZWQgaW50CWluZm9fdmFsaWQ6MTsKKworCXUzMgkJc2Vuc2VfZGF0YTsKKwl1MzIJCXNlbnNlX2RhdGFfaW5mbzsKKwl1MzIJCXVuaXRfYXR0ZW50aW9uX2RhdGE7CisKKwlzdHJ1Y3QgZGV2aWNlCWRldjsKK307CisKKyNkZWZpbmUgZnNnX2x1bl9pc19vcGVuKGN1cmx1bikJKChjdXJsdW4pLT5maWxwICE9IE5VTEwpCisKK3N0YXRpYyBzdHJ1Y3QgZnNnX2x1biAqZnNnX2x1bl9mcm9tX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBmc2dfbHVuLCBkZXYpOworfQorCisKKy8qIEJpZyBlbm91Z2ggdG8gaG9sZCBvdXIgYmlnZ2VzdCBkZXNjcmlwdG9yICovCisjZGVmaW5lIEVQMF9CVUZTSVpFCTI1NgorI2RlZmluZSBERUxBWUVEX1NUQVRVUwkoRVAwX0JVRlNJWkUgKyA5OTkpCS8qIEFuIGltcG9zc2libHkgbGFyZ2UgdmFsdWUgKi8KKworLyogTnVtYmVyIG9mIGJ1ZmZlcnMgd2Ugd2lsbCB1c2UuICAyIGlzIGVub3VnaCBmb3IgZG91YmxlLWJ1ZmZlcmluZyAqLworI2RlZmluZSBGU0dfTlVNX0JVRkZFUlMJMgorCisvKiBEZWZhdWx0IHNpemUgb2YgYnVmZmVyIGxlbmd0aC4gKi8KKyNkZWZpbmUgRlNHX0JVRkxFTgkoKHUzMikxNjM4NCkKKworLyogTWF4aW1hbCBudW1iZXIgb2YgTFVOcyBzdXBwb3J0ZWQgaW4gbWFzcyBzdG9yYWdlIGZ1bmN0aW9uICovCisjZGVmaW5lIEZTR19NQVhfTFVOUwk4CisKK2VudW0gZnNnX2J1ZmZlcl9zdGF0ZSB7CisJQlVGX1NUQVRFX0VNUFRZID0gMCwKKwlCVUZfU1RBVEVfRlVMTCwKKwlCVUZfU1RBVEVfQlVTWQorfTsKKworc3RydWN0IGZzZ19idWZmaGQgeworI2lmZGVmIEZTR19CVUZGSERfU1RBVElDX0JVRkZFUgorCWNoYXIJCQkJYnVmW0ZTR19CVUZMRU5dOworI2Vsc2UKKwl2b2lkCQkJCSpidWY7CisjZW5kaWYKKwllbnVtIGZzZ19idWZmZXJfc3RhdGUJCXN0YXRlOworCXN0cnVjdCBmc2dfYnVmZmhkCQkqbmV4dDsKKworCS8qIFRoZSBOZXRDaGlwIDIyODAgaXMgZmFzdGVyLCBhbmQgaGFuZGxlcyBzb21lIHByb3RvY29sIGZhdWx0cworCSAqIGJldHRlciwgaWYgd2UgZG9uJ3Qgc3VibWl0IGFueSBzaG9ydCBidWxrLW91dCByZWFkIHJlcXVlc3RzLgorCSAqIFNvIHdlIHdpbGwgcmVjb3JkIHRoZSBpbnRlbmRlZCByZXF1ZXN0IGxlbmd0aCBoZXJlLiAqLworCXVuc2lnbmVkIGludAkJCWJ1bGtfb3V0X2ludGVuZGVkX2xlbmd0aDsKKworCXN0cnVjdCB1c2JfcmVxdWVzdAkJKmlucmVxOworCWludAkJCQlpbnJlcV9idXN5OworCXN0cnVjdCB1c2JfcmVxdWVzdAkJKm91dHJlcTsKKwlpbnQJCQkJb3V0cmVxX2J1c3k7Cit9OworCitlbnVtIGZzZ19zdGF0ZSB7CisJLyogVGhpcyBvbmUgaXNuJ3QgdXNlZCBhbnl3aGVyZSAqLworCUZTR19TVEFURV9DT01NQU5EX1BIQVNFID0gLTEwLAorCUZTR19TVEFURV9EQVRBX1BIQVNFLAorCUZTR19TVEFURV9TVEFUVVNfUEhBU0UsCisKKwlGU0dfU1RBVEVfSURMRSA9IDAsCisJRlNHX1NUQVRFX0FCT1JUX0JVTEtfT1VULAorCUZTR19TVEFURV9SRVNFVCwKKwlGU0dfU1RBVEVfSU5URVJGQUNFX0NIQU5HRSwKKwlGU0dfU1RBVEVfQ09ORklHX0NIQU5HRSwKKwlGU0dfU1RBVEVfRElTQ09OTkVDVCwKKwlGU0dfU1RBVEVfRVhJVCwKKwlGU0dfU1RBVEVfVEVSTUlOQVRFRAorfTsKKworZW51bSBkYXRhX2RpcmVjdGlvbiB7CisJREFUQV9ESVJfVU5LTk9XTiA9IDAsCisJREFUQV9ESVJfRlJPTV9IT1NULAorCURBVEFfRElSX1RPX0hPU1QsCisJREFUQV9ESVJfTk9ORQorfTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKK3N0YXRpYyBpbmxpbmUgdTMyIGdldF91bmFsaWduZWRfYmUyNCh1OCAqYnVmKQoreworCXJldHVybiAweGZmZmZmZiAmICh1MzIpIGdldF91bmFsaWduZWRfYmUzMihidWYgLSAxKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKK2VudW0geworI2lmbmRlZiBGU0dfTk9fREVWSUNFX1NUUklOR1MKKwlGU0dfU1RSSU5HX01BTlVGQUNUVVJFUgk9IDEsCisJRlNHX1NUUklOR19QUk9EVUNULAorCUZTR19TVFJJTkdfU0VSSUFMLAorCUZTR19TVFJJTkdfQ09ORklHLAorI2VuZGlmCisJRlNHX1NUUklOR19JTlRFUkZBQ0UKK307CisKKworI2lmbmRlZiBGU0dfTk9fT1RHCitzdGF0aWMgc3RydWN0IHVzYl9vdGdfZGVzY3JpcHRvcgorZnNnX290Z19kZXNjID0geworCS5iTGVuZ3RoID0JCXNpemVvZiBmc2dfb3RnX2Rlc2MsCisJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9PVEcsCisKKwkuYm1BdHRyaWJ1dGVzID0JCVVTQl9PVEdfU1JQLAorfTsKKyNlbmRpZgorCisvKiBUaGVyZSBpcyBvbmx5IG9uZSBpbnRlcmZhY2UuICovCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yCitmc2dfaW50Zl9kZXNjID0geworCS5iTGVuZ3RoID0JCXNpemVvZiBmc2dfaW50Zl9kZXNjLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfSU5URVJGQUNFLAorCisJLmJOdW1FbmRwb2ludHMgPQkyLAkJLyogQWRqdXN0ZWQgZHVyaW5nIGZzZ19iaW5kKCkgKi8KKwkuYkludGVyZmFjZUNsYXNzID0JVVNCX0NMQVNTX01BU1NfU1RPUkFHRSwKKwkuYkludGVyZmFjZVN1YkNsYXNzID0JVVNCX1NDX1NDU0ksCS8qIEFkanVzdGVkIGR1cmluZyBmc2dfYmluZCgpICovCisJLmJJbnRlcmZhY2VQcm90b2NvbCA9CVVTQl9QUl9CVUxLLAkvKiBBZGp1c3RlZCBkdXJpbmcgZnNnX2JpbmQoKSAqLworCS5pSW50ZXJmYWNlID0JCUZTR19TVFJJTkdfSU5URVJGQUNFLAorfTsKKworLyogVGhyZWUgZnVsbC1zcGVlZCBlbmRwb2ludCBkZXNjcmlwdG9yczogYnVsay1pbiwgYnVsay1vdXQsCisgKiBhbmQgaW50ZXJydXB0LWluLiAqLworCitzdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCitmc2dfZnNfYnVsa19pbl9kZXNjID0geworCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCisKKwkuYkVuZHBvaW50QWRkcmVzcyA9CVVTQl9ESVJfSU4sCisJLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorCS8qIHdNYXhQYWNrZXRTaXplIHNldCBieSBhdXRvY29uZmlndXJhdGlvbiAqLworfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgorZnNnX2ZzX2J1bGtfb3V0X2Rlc2MgPSB7CisJLmJMZW5ndGggPQkJVVNCX0RUX0VORFBPSU5UX1NJWkUsCisJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKKworCS5iRW5kcG9pbnRBZGRyZXNzID0JVVNCX0RJUl9PVVQsCisJLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorCS8qIHdNYXhQYWNrZXRTaXplIHNldCBieSBhdXRvY29uZmlndXJhdGlvbiAqLworfTsKKworI2lmbmRlZiBGU0dfTk9fSU5UUl9FUAorCitzdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCitmc2dfZnNfaW50cl9pbl9kZXNjID0geworCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCisKKwkuYkVuZHBvaW50QWRkcmVzcyA9CVVTQl9ESVJfSU4sCisJLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9JTlQsCisJLndNYXhQYWNrZXRTaXplID0JY3B1X3RvX2xlMTYoMiksCisJLmJJbnRlcnZhbCA9CQkzMiwJLyogZnJhbWVzIC0+IDMyIG1zICovCit9OworCisjaWZuZGVmIEZTR19OT19PVEcKKyMgIGRlZmluZSBGU0dfRlNfRlVOQ1RJT05fUFJFX0VQX0VOVFJJRVMJMgorI2Vsc2UKKyMgIGRlZmluZSBGU0dfRlNfRlVOQ1RJT05fUFJFX0VQX0VOVFJJRVMJMQorI2VuZGlmCisKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqZnNnX2ZzX2Z1bmN0aW9uW10gPSB7CisjaWZuZGVmIEZTR19OT19PVEcKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmZnNnX290Z19kZXNjLAorI2VuZGlmCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmZzZ19pbnRmX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmZzZ19mc19idWxrX2luX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmZzZ19mc19idWxrX291dF9kZXNjLAorI2lmbmRlZiBGU0dfTk9fSU5UUl9FUAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZmc2dfZnNfaW50cl9pbl9kZXNjLAorI2VuZGlmCisJTlVMTCwKK307CisKKworLyoKKyAqIFVTQiAyLjAgZGV2aWNlcyBuZWVkIHRvIGV4cG9zZSBib3RoIGhpZ2ggc3BlZWQgYW5kIGZ1bGwgc3BlZWQKKyAqIGRlc2NyaXB0b3JzLCB1bmxlc3MgdGhleSBvbmx5IHJ1biBhdCBmdWxsIHNwZWVkLgorICoKKyAqIFRoYXQgbWVhbnMgYWx0ZXJuYXRlIGVuZHBvaW50IGRlc2NyaXB0b3JzIChiaWdnZXIgcGFja2V0cykKKyAqIGFuZCBhICJkZXZpY2UgcXVhbGlmaWVyIiAuLi4gcGx1cyBtb3JlIGNvbnN0cnVjdGlvbiBvcHRpb25zCisgKiBmb3IgdGhlIGNvbmZpZyBkZXNjcmlwdG9yLgorICovCitzdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCitmc2dfaHNfYnVsa19pbl9kZXNjID0geworCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCisKKwkvKiBiRW5kcG9pbnRBZGRyZXNzIGNvcGllZCBmcm9tIGZzX2J1bGtfaW5fZGVzYyBkdXJpbmcgZnNnX2JpbmQoKSAqLworCS5ibUF0dHJpYnV0ZXMgPQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKKwkud01heFBhY2tldFNpemUgPQljcHVfdG9fbGUxNig1MTIpLAorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgorZnNnX2hzX2J1bGtfb3V0X2Rlc2MgPSB7CisJLmJMZW5ndGggPQkJVVNCX0RUX0VORFBPSU5UX1NJWkUsCisJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKKworCS8qIGJFbmRwb2ludEFkZHJlc3MgY29waWVkIGZyb20gZnNfYnVsa19vdXRfZGVzYyBkdXJpbmcgZnNnX2JpbmQoKSAqLworCS5ibUF0dHJpYnV0ZXMgPQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKKwkud01heFBhY2tldFNpemUgPQljcHVfdG9fbGUxNig1MTIpLAorCS5iSW50ZXJ2YWwgPQkJMSwJLyogTkFLIGV2ZXJ5IDEgdWZyYW1lICovCit9OworCisjaWZuZGVmIEZTR19OT19JTlRSX0VQCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IKK2ZzZ19oc19pbnRyX2luX2Rlc2MgPSB7CisJLmJMZW5ndGggPQkJVVNCX0RUX0VORFBPSU5UX1NJWkUsCisJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKKworCS8qIGJFbmRwb2ludEFkZHJlc3MgY29waWVkIGZyb20gZnNfaW50cl9pbl9kZXNjIGR1cmluZyBmc2dfYmluZCgpICovCisJLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9JTlQsCisJLndNYXhQYWNrZXRTaXplID0JY3B1X3RvX2xlMTYoMiksCisJLmJJbnRlcnZhbCA9CQk5LAkvKiAyKiooOS0xKSA9IDI1NiB1ZnJhbWVzIC0+IDMyIG1zICovCit9OworCisjaWZuZGVmIEZTR19OT19PVEcKKyMgIGRlZmluZSBGU0dfSFNfRlVOQ1RJT05fUFJFX0VQX0VOVFJJRVMJMgorI2Vsc2UKKyMgIGRlZmluZSBGU0dfSFNfRlVOQ1RJT05fUFJFX0VQX0VOVFJJRVMJMQorI2VuZGlmCisKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqZnNnX2hzX2Z1bmN0aW9uW10gPSB7CisjaWZuZGVmIEZTR19OT19PVEcKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmZnNnX290Z19kZXNjLAorI2VuZGlmCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmZzZ19pbnRmX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmZzZ19oc19idWxrX2luX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmZzZ19oc19idWxrX291dF9kZXNjLAorI2lmbmRlZiBGU0dfTk9fSU5UUl9FUAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZmc2dfaHNfaW50cl9pbl9kZXNjLAorI2VuZGlmCisJTlVMTCwKK307CisKKy8qIE1heHBhY2tldCBhbmQgb3RoZXIgdHJhbnNmZXIgY2hhcmFjdGVyaXN0aWNzIHZhcnkgYnkgc3BlZWQuICovCitzdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICoKK2ZzZ19lcF9kZXNjKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnLCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmZzLAorCQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmhzKQoreworCWlmIChnYWRnZXRfaXNfZHVhbHNwZWVkKGcpICYmIGctPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQorCQlyZXR1cm4gaHM7CisJcmV0dXJuIGZzOworfQorCisKKy8qIFN0YXRpYyBzdHJpbmdzLCBpbiBVVEYtOCAoZm9yIHNpbXBsaWNpdHkgd2UgdXNlIG9ubHkgQVNDSUkgY2hhcmFjdGVycykgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX3N0cmluZwkJZnNnX3N0cmluZ3NbXSA9IHsKKyNpZm5kZWYgRlNHX05PX0RFVklDRV9TVFJJTkdTCisJe0ZTR19TVFJJTkdfTUFOVUZBQ1RVUkVSLAlmc2dfc3RyaW5nX21hbnVmYWN0dXJlcn0sCisJe0ZTR19TVFJJTkdfUFJPRFVDVCwJCWZzZ19zdHJpbmdfcHJvZHVjdH0sCisJe0ZTR19TVFJJTkdfU0VSSUFMLAkJZnNnX3N0cmluZ19zZXJpYWx9LAorCXtGU0dfU1RSSU5HX0NPTkZJRywJCWZzZ19zdHJpbmdfY29uZmlnfSwKKyNlbmRpZgorCXtGU0dfU1RSSU5HX0lOVEVSRkFDRSwJCWZzZ19zdHJpbmdfaW50ZXJmYWNlfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZ2FkZ2V0X3N0cmluZ3MJZnNnX3N0cmluZ3RhYiA9IHsKKwkubGFuZ3VhZ2UJPSAweDA0MDksCQkvKiBlbi11cyAqLworCS5zdHJpbmdzCT0gZnNnX3N0cmluZ3MsCit9OworCisKKyAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBJZiB0aGUgbmV4dCB0d28gcm91dGluZXMgYXJlIGNhbGxlZCB3aGlsZSB0aGUgZ2FkZ2V0IGlzIHJlZ2lzdGVyZWQsCisgKiB0aGUgY2FsbGVyIG11c3Qgb3duIGZzZy0+ZmlsZXNlbSBmb3Igd3JpdGluZy4gKi8KKworc3RhdGljIGludCBmc2dfbHVuX29wZW4oc3RydWN0IGZzZ19sdW4gKmN1cmx1biwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJaW50CQkJCXJvOworCXN0cnVjdCBmaWxlCQkJKmZpbHAgPSBOVUxMOworCWludAkJCQlyYyA9IC1FSU5WQUw7CisJc3RydWN0IGlub2RlCQkJKmlub2RlID0gTlVMTDsKKwlsb2ZmX3QJCQkJc2l6ZTsKKwlsb2ZmX3QJCQkJbnVtX3NlY3RvcnM7CisJbG9mZl90CQkJCW1pbl9zZWN0b3JzOworCisJLyogUi9XIGlmIHdlIGNhbiwgUi9PIGlmIHdlIG11c3QgKi8KKwlybyA9IGN1cmx1bi0+aW5pdGlhbGx5X3JvOworCWlmICghcm8pIHsKKwkJZmlscCA9IGZpbHBfb3BlbihmaWxlbmFtZSwgT19SRFdSIHwgT19MQVJHRUZJTEUsIDApOworCQlpZiAoLUVST0ZTID09IFBUUl9FUlIoZmlscCkpCisJCQlybyA9IDE7CisJfQorCWlmIChybykKKwkJZmlscCA9IGZpbHBfb3BlbihmaWxlbmFtZSwgT19SRE9OTFkgfCBPX0xBUkdFRklMRSwgMCk7CisJaWYgKElTX0VSUihmaWxwKSkgeworCQlMSU5GTyhjdXJsdW4sICJ1bmFibGUgdG8gb3BlbiBiYWNraW5nIGZpbGU6ICVzXG4iLCBmaWxlbmFtZSk7CisJCXJldHVybiBQVFJfRVJSKGZpbHApOworCX0KKworCWlmICghKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJcm8gPSAxOworCisJaWYgKGZpbHAtPmZfcGF0aC5kZW50cnkpCisJCWlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKwlpZiAoaW5vZGUgJiYgU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkgeworCQlpZiAoYmRldl9yZWFkX29ubHkoaW5vZGUtPmlfYmRldikpCisJCQlybyA9IDE7CisJfSBlbHNlIGlmICghaW5vZGUgfHwgIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJTElORk8oY3VybHVuLCAiaW52YWxpZCBmaWxlIHR5cGU6ICVzXG4iLCBmaWxlbmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIElmIHdlIGNhbid0IHJlYWQgdGhlIGZpbGUsIGl0J3Mgbm8gZ29vZC4KKwkgKiBJZiB3ZSBjYW4ndCB3cml0ZSB0aGUgZmlsZSwgdXNlIGl0IHJlYWQtb25seS4gKi8KKwlpZiAoIWZpbHAtPmZfb3AgfHwgIShmaWxwLT5mX29wLT5yZWFkIHx8IGZpbHAtPmZfb3AtPmFpb19yZWFkKSkgeworCQlMSU5GTyhjdXJsdW4sICJmaWxlIG5vdCByZWFkYWJsZTogJXNcbiIsIGZpbGVuYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCWlmICghKGZpbHAtPmZfb3AtPndyaXRlIHx8IGZpbHAtPmZfb3AtPmFpb193cml0ZSkpCisJCXJvID0gMTsKKworCXNpemUgPSBpX3NpemVfcmVhZChpbm9kZS0+aV9tYXBwaW5nLT5ob3N0KTsKKwlpZiAoc2l6ZSA8IDApIHsKKwkJTElORk8oY3VybHVuLCAidW5hYmxlIHRvIGZpbmQgZmlsZSBzaXplOiAlc1xuIiwgZmlsZW5hbWUpOworCQlyYyA9IChpbnQpIHNpemU7CisJCWdvdG8gb3V0OworCX0KKwludW1fc2VjdG9ycyA9IHNpemUgPj4gOTsJLyogRmlsZSBzaXplIGluIDUxMi1ieXRlIGJsb2NrcyAqLworCW1pbl9zZWN0b3JzID0gMTsKKwlpZiAoY3VybHVuLT5jZHJvbSkgeworCQludW1fc2VjdG9ycyAmPSB+MzsJLyogUmVkdWNlIHRvIGEgbXVsdGlwbGUgb2YgMjA0OCAqLworCQltaW5fc2VjdG9ycyA9IDMwMCo0OwkvKiBTbWFsbGVzdCB0cmFjayBpcyAzMDAgZnJhbWVzICovCisJCWlmIChudW1fc2VjdG9ycyA+PSAyNTYqNjAqNzUqNCkgeworCQkJbnVtX3NlY3RvcnMgPSAoMjU2KjYwKjc1IC0gMSkgKiA0OworCQkJTElORk8oY3VybHVuLCAiZmlsZSB0b28gYmlnOiAlc1xuIiwgZmlsZW5hbWUpOworCQkJTElORk8oY3VybHVuLCAidXNpbmcgb25seSBmaXJzdCAlZCBibG9ja3NcbiIsCisJCQkJCShpbnQpIG51bV9zZWN0b3JzKTsKKwkJfQorCX0KKwlpZiAobnVtX3NlY3RvcnMgPCBtaW5fc2VjdG9ycykgeworCQlMSU5GTyhjdXJsdW4sICJmaWxlIHRvbyBzbWFsbDogJXNcbiIsIGZpbGVuYW1lKTsKKwkJcmMgPSAtRVRPT1NNQUxMOworCQlnb3RvIG91dDsKKwl9CisKKwlnZXRfZmlsZShmaWxwKTsKKwljdXJsdW4tPnJvID0gcm87CisJY3VybHVuLT5maWxwID0gZmlscDsKKwljdXJsdW4tPmZpbGVfbGVuZ3RoID0gc2l6ZTsKKwljdXJsdW4tPm51bV9zZWN0b3JzID0gbnVtX3NlY3RvcnM7CisJTERCRyhjdXJsdW4sICJvcGVuIGJhY2tpbmcgZmlsZTogJXNcbiIsIGZpbGVuYW1lKTsKKwlyYyA9IDA7CisKK291dDoKKwlmaWxwX2Nsb3NlKGZpbHAsIGN1cnJlbnQtPmZpbGVzKTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIHZvaWQgZnNnX2x1bl9jbG9zZShzdHJ1Y3QgZnNnX2x1biAqY3VybHVuKQoreworCWlmIChjdXJsdW4tPmZpbHApIHsKKwkJTERCRyhjdXJsdW4sICJjbG9zZSBiYWNraW5nIGZpbGVcbiIpOworCQlmcHV0KGN1cmx1bi0+ZmlscCk7CisJCWN1cmx1bi0+ZmlscCA9IE5VTEw7CisJfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFN5bmMgdGhlIGZpbGUgZGF0YSwgZG9uJ3QgYm90aGVyIHdpdGggdGhlIG1ldGFkYXRhLgorICogVGhpcyBjb2RlIHdhcyBjb3BpZWQgZnJvbSBmcy9idWZmZXIuYzpzeXNfZmRhdGFzeW5jKCkuICovCitzdGF0aWMgaW50IGZzZ19sdW5fZnN5bmNfc3ViKHN0cnVjdCBmc2dfbHVuICpjdXJsdW4pCit7CisJc3RydWN0IGZpbGUJKmZpbHAgPSBjdXJsdW4tPmZpbHA7CisKKwlpZiAoY3VybHVuLT5ybyB8fCAhZmlscCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHZmc19mc3luYyhmaWxwLCBmaWxwLT5mX3BhdGguZGVudHJ5LCAxKTsKK30KKworc3RhdGljIHZvaWQgc3RvcmVfY2Ryb21fYWRkcmVzcyh1OCAqZGVzdCwgaW50IG1zZiwgdTMyIGFkZHIpCit7CisJaWYgKG1zZikgeworCQkvKiBDb252ZXJ0IHRvIE1pbnV0ZXMtU2Vjb25kcy1GcmFtZXMgKi8KKwkJYWRkciA+Pj0gMjsJCS8qIENvbnZlcnQgdG8gMjA0OC1ieXRlIGZyYW1lcyAqLworCQlhZGRyICs9IDIqNzU7CQkvKiBMZWFkLWluIG9jY3VwaWVzIDIgc2Vjb25kcyAqLworCQlkZXN0WzNdID0gYWRkciAlIDc1OwkvKiBGcmFtZXMgKi8KKwkJYWRkciAvPSA3NTsKKwkJZGVzdFsyXSA9IGFkZHIgJSA2MDsJLyogU2Vjb25kcyAqLworCQlhZGRyIC89IDYwOworCQlkZXN0WzFdID0gYWRkcjsJCS8qIE1pbnV0ZXMgKi8KKwkJZGVzdFswXSA9IDA7CQkvKiBSZXNlcnZlZCAqLworCX0gZWxzZSB7CisJCS8qIEFic29sdXRlIHNlY3RvciAqLworCQlwdXRfdW5hbGlnbmVkX2JlMzIoYWRkciwgZGVzdCk7CisJfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworc3RhdGljIHNzaXplX3QgZnNnX3Nob3dfcm8oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZnNnX2x1bgkqY3VybHVuID0gZnNnX2x1bl9mcm9tX2RldihkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGZzZ19sdW5faXNfb3BlbihjdXJsdW4pCisJCQkJICA/IGN1cmx1bi0+cm8KKwkJCQkgIDogY3VybHVuLT5pbml0aWFsbHlfcm8pOworfQorCitzdGF0aWMgc3NpemVfdCBmc2dfc2hvd19maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZnNnX2x1bgkqY3VybHVuID0gZnNnX2x1bl9mcm9tX2RldihkZXYpOworCXN0cnVjdCByd19zZW1hcGhvcmUJKmZpbGVzZW0gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwljaGFyCQkqcDsKKwlzc2l6ZV90CQlyYzsKKworCWRvd25fcmVhZChmaWxlc2VtKTsKKwlpZiAoZnNnX2x1bl9pc19vcGVuKGN1cmx1bikpIHsJLyogR2V0IHRoZSBjb21wbGV0ZSBwYXRobmFtZSAqLworCQlwID0gZF9wYXRoKCZjdXJsdW4tPmZpbHAtPmZfcGF0aCwgYnVmLCBQQUdFX1NJWkUgLSAxKTsKKwkJaWYgKElTX0VSUihwKSkKKwkJCXJjID0gUFRSX0VSUihwKTsKKwkJZWxzZSB7CisJCQlyYyA9IHN0cmxlbihwKTsKKwkJCW1lbW1vdmUoYnVmLCBwLCByYyk7CisJCQlidWZbcmNdID0gJ1xuJzsJCS8qIEFkZCBhIG5ld2xpbmUgKi8KKwkJCWJ1ZlsrK3JjXSA9IDA7CisJCX0KKwl9IGVsc2UgewkJCQkvKiBObyBmaWxlLCByZXR1cm4gMCBieXRlcyAqLworCQkqYnVmID0gMDsKKwkJcmMgPSAwOworCX0KKwl1cF9yZWFkKGZpbGVzZW0pOworCXJldHVybiByYzsKK30KKworCitzdGF0aWMgc3NpemVfdCBmc2dfc3RvcmVfcm8oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzc2l6ZV90CQlyYyA9IGNvdW50OworCXN0cnVjdCBmc2dfbHVuCSpjdXJsdW4gPSBmc2dfbHVuX2Zyb21fZGV2KGRldik7CisJc3RydWN0IHJ3X3NlbWFwaG9yZQkqZmlsZXNlbSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludAkJaTsKKworCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmaSkgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBBbGxvdyB0aGUgd3JpdGUtZW5hYmxlIHN0YXR1cyB0byBjaGFuZ2Ugb25seSB3aGlsZSB0aGUgYmFja2luZyBmaWxlCisJICogaXMgY2xvc2VkLiAqLworCWRvd25fcmVhZChmaWxlc2VtKTsKKwlpZiAoZnNnX2x1bl9pc19vcGVuKGN1cmx1bikpIHsKKwkJTERCRyhjdXJsdW4sICJyZWFkLW9ubHkgc3RhdHVzIGNoYW5nZSBwcmV2ZW50ZWRcbiIpOworCQlyYyA9IC1FQlVTWTsKKwl9IGVsc2UgeworCQljdXJsdW4tPnJvID0gISFpOworCQljdXJsdW4tPmluaXRpYWxseV9ybyA9ICEhaTsKKwkJTERCRyhjdXJsdW4sICJyZWFkLW9ubHkgc3RhdHVzIHNldCB0byAlZFxuIiwgY3VybHVuLT5ybyk7CisJfQorCXVwX3JlYWQoZmlsZXNlbSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgc3NpemVfdCBmc2dfc3RvcmVfZmlsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGZzZ19sdW4JKmN1cmx1biA9IGZzZ19sdW5fZnJvbV9kZXYoZGV2KTsKKwlzdHJ1Y3Qgcndfc2VtYXBob3JlCSpmaWxlc2VtID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50CQlyYyA9IDA7CisKKwlpZiAoY3VybHVuLT5wcmV2ZW50X21lZGl1bV9yZW1vdmFsICYmIGZzZ19sdW5faXNfb3BlbihjdXJsdW4pKSB7CisJCUxEQkcoY3VybHVuLCAiZWplY3QgYXR0ZW1wdCBwcmV2ZW50ZWRcbiIpOworCQlyZXR1cm4gLUVCVVNZOwkJCQkvKiAiRG9vciBpcyBsb2NrZWQiICovCisJfQorCisJLyogUmVtb3ZlIGEgdHJhaWxpbmcgbmV3bGluZSAqLworCWlmIChjb3VudCA+IDAgJiYgYnVmW2NvdW50LTFdID09ICdcbicpCisJCSgoY2hhciAqKSBidWYpW2NvdW50LTFdID0gMDsJCS8qIFVnaCEgKi8KKworCS8qIEVqZWN0IGN1cnJlbnQgbWVkaXVtICovCisJZG93bl93cml0ZShmaWxlc2VtKTsKKwlpZiAoZnNnX2x1bl9pc19vcGVuKGN1cmx1bikpIHsKKwkJZnNnX2x1bl9jbG9zZShjdXJsdW4pOworCQljdXJsdW4tPnVuaXRfYXR0ZW50aW9uX2RhdGEgPSBTU19NRURJVU1fTk9UX1BSRVNFTlQ7CisJfQorCisJLyogTG9hZCBuZXcgbWVkaXVtICovCisJaWYgKGNvdW50ID4gMCAmJiBidWZbMF0pIHsKKwkJcmMgPSBmc2dfbHVuX29wZW4oY3VybHVuLCBidWYpOworCQlpZiAocmMgPT0gMCkKKwkJCWN1cmx1bi0+dW5pdF9hdHRlbnRpb25fZGF0YSA9CisJCQkJCVNTX05PVF9SRUFEWV9UT19SRUFEWV9UUkFOU0lUSU9OOworCX0KKwl1cF93cml0ZShmaWxlc2VtKTsKKwlyZXR1cm4gKHJjIDwgMCA/IHJjIDogY291bnQpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZXRoZXIuaCBiL2RyaXZlcnMvdXNiL2dhZGdldC91X2V0aGVyLmgKaW5kZXggOTFiMzlmZi4uZmQ1NWY0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZXRoZXIuaAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdV9ldGhlci5oCkBAIC0xMTIsNyArMTEyLDcgQEAKIGludCBlY21fYmluZF9jb25maWcoc3RydWN0IHVzYl9jb25maWd1cmF0aW9uICpjLCB1OCBldGhhZGRyW0VUSF9BTEVOXSk7CiBpbnQgZWVtX2JpbmRfY29uZmlnKHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbiAqYyk7CiAKLSNpZmRlZiBDT05GSUdfVVNCX0VUSF9STkRJUworI2lmZGVmIFVTQl9FVEhfUk5ESVMKIAogaW50IHJuZGlzX2JpbmRfY29uZmlnKHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbiAqYywgdTggZXRoYWRkcltFVEhfQUxFTl0pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcgYi9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcKaW5kZXggOWI0M2IyMi4uMjY3OGExNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvS2NvbmZpZwpAQCAtOTAsMTQgKzkwLDI1IEBACiAKIGNvbmZpZyBVU0JfRUhDSV9CSUdfRU5ESUFOX01NSU8KIAlib29sCi0JZGVwZW5kcyBvbiBVU0JfRUhDSV9IQ0QgJiYgKFBQQ19DRUxMRUIgfHwgUFBDX1BTMyB8fCA0NDBFUFggfHwgQVJDSF9JWFA0WFgpCisJZGVwZW5kcyBvbiBVU0JfRUhDSV9IQ0QgJiYgKFBQQ19DRUxMRUIgfHwgUFBDX1BTMyB8fCA0NDBFUFggfHwgQVJDSF9JWFA0WFggfHwgWFBTX1VTQl9IQ0RfWElMSU5YKQogCWRlZmF1bHQgeQogCiBjb25maWcgVVNCX0VIQ0lfQklHX0VORElBTl9ERVNDCiAJYm9vbAotCWRlcGVuZHMgb24gVVNCX0VIQ0lfSENEICYmICg0NDBFUFggfHwgQVJDSF9JWFA0WFgpCisJZGVwZW5kcyBvbiBVU0JfRUhDSV9IQ0QgJiYgKDQ0MEVQWCB8fCBBUkNIX0lYUDRYWCB8fCBYUFNfVVNCX0hDRF9YSUxJTlgpCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBYUFNfVVNCX0hDRF9YSUxJTlgKKwlib29sICJVc2UgWGlsaW54IHVzYiBob3N0IEVIQ0kgY29udHJvbGxlciBjb3JlIgorCWRlcGVuZHMgb24gVVNCX0VIQ0lfSENEICYmIChQUEMzMiB8fCBNSUNST0JMQVpFKQorCXNlbGVjdCBVU0JfRUhDSV9CSUdfRU5ESUFOX0RFU0MKKwlzZWxlY3QgVVNCX0VIQ0lfQklHX0VORElBTl9NTUlPCisJLS0taGVscC0tLQorCQlYaWxpbnggeHBzIFVTQiBob3N0IGNvbnRyb2xsZXIgY29yZSBpcyBFSENJIGNvbXBpbGFudCBhbmQgaGFzCisJCXRyYW5zYWN0aW9uIHRyYW5zbGF0b3IgYnVpbHQtaW4uIEl0IGNhbiBiZSBjb25maWd1cmVkIHRvIGVpdGhlcgorCQlzdXBwb3J0IGJvdGggaGlnaCBzcGVlZCBhbmQgZnVsbCBzcGVlZCBkZXZpY2VzLCBvciBoaWdoIHNwZWVkCisJCWRldmljZXMgb25seS4KKwogY29uZmlnIFVTQl9FSENJX0ZTTAogCWJvb2wgIlN1cHBvcnQgZm9yIEZyZWVzY2FsZSBvbi1jaGlwIEVIQ0kgVVNCIGNvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBVU0JfRUhDSV9IQ0QgJiYgRlNMX1NPQwpAQCAtMTA1LDYgKzExNiwxMyBAQAogCS0tLWhlbHAtLS0KIAkgIFZhcmlhdGlvbiBvZiBBUkMgVVNCIGJsb2NrIHVzZWQgaW4gc29tZSBGcmVlc2NhbGUgY2hpcHMuCiAKK2NvbmZpZyBVU0JfRUhDSV9NWEMKKwlib29sICJTdXBwb3J0IGZvciBGcmVlc2NhbGUgb24tY2hpcCBFSENJIFVTQiBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gVVNCX0VIQ0lfSENEICYmIEFSQ0hfTVhDCisJc2VsZWN0IFVTQl9FSENJX1JPT1RfSFVCX1RUCisJLS0taGVscC0tLQorCSAgVmFyaWF0aW9uIG9mIEFSQyBVU0IgYmxvY2sgdXNlZCBpbiBzb21lIEZyZWVzY2FsZSBjaGlwcy4KKwogY29uZmlnIFVTQl9FSENJX0hDRF9QUENfT0YKIAlib29sICJFSENJIHN1cHBvcnQgZm9yIFBQQyBVU0IgY29udHJvbGxlciBvbiBPRiBwbGF0Zm9ybSBidXMiCiAJZGVwZW5kcyBvbiBVU0JfRUhDSV9IQ0QgJiYgUFBDX09GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMKaW5kZXggZDhmNGFhYS4uNTg1OTUyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYwpAQCAtNTQ5LDcgKzU0OSw3IEBACiAJLyogY29udHJvbGxlcnMgbWF5IGNhY2hlIHNvbWUgb2YgdGhlIHBlcmlvZGljIHNjaGVkdWxlIC4uLiAqLwogCWhjY19wYXJhbXMgPSBlaGNpX3JlYWRsKGVoY2ksICZlaGNpLT5jYXBzLT5oY2NfcGFyYW1zKTsKIAlpZiAoSENDX0lTT0NfQ0FDSEUoaGNjX3BhcmFtcykpCQkvLyBmdWxsIGZyYW1lIGNhY2hlCi0JCWVoY2ktPmlfdGhyZXNoID0gODsKKwkJZWhjaS0+aV90aHJlc2ggPSAyICsgODsKIAllbHNlCQkJCQkvLyBOIG1pY3JvZnJhbWVzIGNhY2hlZAogCQllaGNpLT5pX3RocmVzaCA9IDIgKyBIQ0NfSVNPQ19USFJFUyhoY2NfcGFyYW1zKTsKIApAQCAtNjA1LDYgKzYwNSw4IEBACiAJfQogCWVoY2ktPmNvbW1hbmQgPSB0ZW1wOwogCisJLyogQWNjZXB0IGFyYml0cmFyaWx5IGxvbmcgc2NhdHRlci1nYXRoZXIgbGlzdHMgKi8KKwloY2QtPnNlbGYuc2dfdGFibGVzaXplID0gfjA7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExMDUsMTEgKzExMDcsMjEgQEAKICNkZWZpbmUJUExBVEZPUk1fRFJJVkVSCQllaGNpX2ZzbF9kcml2ZXIKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1VTQl9FSENJX01YQworI2luY2x1ZGUgImVoY2ktbXhjLmMiCisjZGVmaW5lIFBMQVRGT1JNX0RSSVZFUgkJZWhjaV9teGNfZHJpdmVyCisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19TT0NfQVUxMjAwCiAjaW5jbHVkZSAiZWhjaS1hdTF4eHguYyIKICNkZWZpbmUJUExBVEZPUk1fRFJJVkVSCQllaGNpX2hjZF9hdTF4eHhfZHJpdmVyCiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19BUkNIX09NQVAzNFhYCisjaW5jbHVkZSAiZWhjaS1vbWFwLmMiCisjZGVmaW5lICAgICAgICBQTEFURk9STV9EUklWRVIgICAgICAgICBlaGNpX2hjZF9vbWFwX2RyaXZlcgorI2VuZGlmCisKICNpZmRlZiBDT05GSUdfUFBDX1BTMwogI2luY2x1ZGUgImVoY2ktcHMzLmMiCiAjZGVmaW5lCVBTM19TWVNURU1fQlVTX0RSSVZFUglwczNfZWhjaV9kcml2ZXIKQEAgLTExMjAsNiArMTEzMiwxMSBAQAogI2RlZmluZSBPRl9QTEFURk9STV9EUklWRVIJZWhjaV9oY2RfcHBjX29mX2RyaXZlcgogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfWFBTX1VTQl9IQ0RfWElMSU5YCisjaW5jbHVkZSAiZWhjaS14aWxpbngtb2YuYyIKKyNkZWZpbmUgT0ZfUExBVEZPUk1fRFJJVkVSCWVoY2lfaGNkX3hpbGlueF9vZl9kcml2ZXIKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX1BMQVRfT1JJT04KICNpbmNsdWRlICJlaGNpLW9yaW9uLmMiCiAjZGVmaW5lCVBMQVRGT1JNX0RSSVZFUgkJZWhjaV9vcmlvbl9kcml2ZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1odWIuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1odWIuYwppbmRleCAxYjZmMWMwLi4yYzY1NzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaHViLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWh1Yi5jCkBAIC0yMzYsNyArMjM2LDcgQEAKIAl9CiAKIAlpZiAodW5saWtlbHkoZWhjaS0+ZGVidWcpKSB7Ci0JCWlmIChlaGNpLT5kZWJ1ZyAmJiAhZGJncF9yZXNldF9wcmVwKCkpCisJCWlmICghZGJncF9yZXNldF9wcmVwKCkpCiAJCQllaGNpLT5kZWJ1ZyA9IE5VTEw7CiAJCWVsc2UKIAkJCWRiZ3BfZXh0ZXJuYWxfc3RhcnR1cCgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLW14Yy5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLW14Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YzU2ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktbXhjLmMKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU2FzY2hhIEhhdWVyIDxzLmhhdWVyQHBlbmd1dHJvbml4LmRlPiwgUGVuZ3V0cm9uaXgKKyAqIENvcHlyaWdodCAoYykgMjAwOSBEYW5pZWwgTWFjayA8ZGFuaWVsQGNhaWFxLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKKyAqIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9vdGcuaD4KKworI2luY2x1ZGUgPG1hY2gvbXhjX2VoY2kuaD4KKworI2RlZmluZSBVTFBJX1ZJRVdQT1JUX09GRlNFVAkweDE3MAorI2RlZmluZSBQT1JUU0NfT0ZGU0VUCQkweDE4NAorI2RlZmluZSBVU0JNT0RFX09GRlNFVAkJMHgxYTgKKyNkZWZpbmUgVVNCTU9ERV9DTV9IT1NUCQkzCisKK3N0cnVjdCBlaGNpX214Y19wcml2IHsKKwlzdHJ1Y3QgY2xrICp1c2JjbGssICphaGJjbGs7CisJc3RydWN0IHVzYl9oY2QgKmhjZDsKK307CisKKy8qIGNhbGxlZCBkdXJpbmcgcHJvYmUoKSBhZnRlciBjaGlwIHJlc2V0IGNvbXBsZXRlcyAqLworc3RhdGljIGludCBlaGNpX214Y19zZXR1cChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCXN0cnVjdCBlaGNpX2hjZCAqZWhjaSA9IGhjZF90b19laGNpKGhjZCk7CisJaW50IHJldHZhbDsKKworCS8qIEVIQ0kgcmVnaXN0ZXJzIHN0YXJ0IGF0IG9mZnNldCAweDEwMCAqLworCWVoY2ktPmNhcHMgPSBoY2QtPnJlZ3MgKyAweDEwMDsKKwllaGNpLT5yZWdzID0gaGNkLT5yZWdzICsgMHgxMDAgKworCSAgICBIQ19MRU5HVEgoZWhjaV9yZWFkbChlaGNpLCAmZWhjaS0+Y2Fwcy0+aGNfY2FwYmFzZSkpOworCWRiZ19oY3NfcGFyYW1zKGVoY2ksICJyZXNldCIpOworCWRiZ19oY2NfcGFyYW1zKGVoY2ksICJyZXNldCIpOworCisJLyogY2FjaGUgdGhpcyByZWFkb25seSBkYXRhOyBtaW5pbWl6ZSBjaGlwIHJlYWRzICovCisJZWhjaS0+aGNzX3BhcmFtcyA9IGVoY2lfcmVhZGwoZWhjaSwgJmVoY2ktPmNhcHMtPmhjc19wYXJhbXMpOworCisJcmV0dmFsID0gZWhjaV9oYWx0KGVoY2kpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwkvKiBkYXRhIHN0cnVjdHVyZSBpbml0ICovCisJcmV0dmFsID0gZWhjaV9pbml0KGhjZCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWhjZC0+aGFzX3R0ID0gMTsKKworCWVoY2ktPnNicm4gPSAweDIwOworCisJZWhjaV9yZXNldChlaGNpKTsKKworCWVoY2lfcG9ydF9wb3dlcihlaGNpLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoY19kcml2ZXIgZWhjaV9teGNfaGNfZHJpdmVyID0geworCS5kZXNjcmlwdGlvbiA9IGhjZF9uYW1lLAorCS5wcm9kdWN0X2Rlc2MgPSAiRnJlZXNjYWxlIE9uLUNoaXAgRUhDSSBIb3N0IENvbnRyb2xsZXIiLAorCS5oY2RfcHJpdl9zaXplID0gc2l6ZW9mKHN0cnVjdCBlaGNpX2hjZCksCisKKwkvKgorCSAqIGdlbmVyaWMgaGFyZHdhcmUgbGlua2FnZQorCSAqLworCS5pcnEgPSBlaGNpX2lycSwKKwkuZmxhZ3MgPSBIQ0RfVVNCMiB8IEhDRF9NRU1PUlksCisKKwkvKgorCSAqIGJhc2ljIGxpZmVjeWNsZSBvcGVyYXRpb25zCisJICovCisJLnJlc2V0ID0gZWhjaV9teGNfc2V0dXAsCisJLnN0YXJ0ID0gZWhjaV9ydW4sCisJLnN0b3AgPSBlaGNpX3N0b3AsCisJLnNodXRkb3duID0gZWhjaV9zaHV0ZG93biwKKworCS8qCisJICogbWFuYWdpbmcgaS9vIHJlcXVlc3RzIGFuZCBhc3NvY2lhdGVkIGRldmljZSByZXNvdXJjZXMKKwkgKi8KKwkudXJiX2VucXVldWUgPSBlaGNpX3VyYl9lbnF1ZXVlLAorCS51cmJfZGVxdWV1ZSA9IGVoY2lfdXJiX2RlcXVldWUsCisJLmVuZHBvaW50X2Rpc2FibGUgPSBlaGNpX2VuZHBvaW50X2Rpc2FibGUsCisKKwkvKgorCSAqIHNjaGVkdWxpbmcgc3VwcG9ydAorCSAqLworCS5nZXRfZnJhbWVfbnVtYmVyID0gZWhjaV9nZXRfZnJhbWUsCisKKwkvKgorCSAqIHJvb3QgaHViIHN1cHBvcnQKKwkgKi8KKwkuaHViX3N0YXR1c19kYXRhID0gZWhjaV9odWJfc3RhdHVzX2RhdGEsCisJLmh1Yl9jb250cm9sID0gZWhjaV9odWJfY29udHJvbCwKKwkuYnVzX3N1c3BlbmQgPSBlaGNpX2J1c19zdXNwZW5kLAorCS5idXNfcmVzdW1lID0gZWhjaV9idXNfcmVzdW1lLAorCS5yZWxpbnF1aXNoX3BvcnQgPSBlaGNpX3JlbGlucXVpc2hfcG9ydCwKKwkucG9ydF9oYW5kZWRfb3ZlciA9IGVoY2lfcG9ydF9oYW5kZWRfb3ZlciwKK307CisKK3N0YXRpYyBpbnQgZWhjaV9teGNfZHJ2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG14Y191c2JoX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHVzYl9oY2QgKmhjZDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgaXJxLCByZXQsIHRlbXA7CisJc3RydWN0IGVoY2lfbXhjX3ByaXYgKnByaXY7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJpbml0aWFsaXppbmcgaS5NWCBVU0IgQ29udHJvbGxlclxuIik7CisKKwlpZiAoIXBkYXRhKSB7CisJCWRldl9lcnIoZGV2LCAiTm8gcGxhdGZvcm0gZGF0YSBnaXZlbiwgYmFpbGluZyBvdXQuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKworCWhjZCA9IHVzYl9jcmVhdGVfaGNkKCZlaGNpX214Y19oY19kcml2ZXIsIGRldiwgZGV2X25hbWUoZGV2KSk7CisJaWYgKCFoY2QpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2FsbG9jOworCX0KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycihkZXYsICJGb3VuZCBIQyB3aXRoIG5vIHJlZ2lzdGVyIGFkZHIuIENoZWNrIHNldHVwIVxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2dldF9yZXNvdXJjZTsKKwl9CisKKwloY2QtPnJzcmNfc3RhcnQgPSByZXMtPnN0YXJ0OworCWhjZC0+cnNyY19sZW4gPSByZXNvdXJjZV9zaXplKHJlcyk7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihoY2QtPnJzcmNfc3RhcnQsIGhjZC0+cnNyY19sZW4sIGhjZF9uYW1lKSkgeworCQlkZXZfZGJnKGRldiwgImNvbnRyb2xsZXIgYWxyZWFkeSBpbiB1c2VcbiIpOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJyX3JlcXVlc3RfbWVtOworCX0KKworCWhjZC0+cmVncyA9IGlvcmVtYXAoaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuKTsKKwlpZiAoIWhjZC0+cmVncykgeworCQlkZXZfZXJyKGRldiwgImVycm9yIG1hcHBpbmcgbWVtb3J5XG4iKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnJfaW9yZW1hcDsKKwl9CisKKwkvKiBlbmFibGUgY2xvY2tzICovCisJcHJpdi0+dXNiY2xrID0gY2xrX2dldChkZXYsICJ1c2IiKTsKKwlpZiAoSVNfRVJSKHByaXYtPnVzYmNsaykpIHsKKwkJcmV0ID0gUFRSX0VSUihwcml2LT51c2JjbGspOworCQlnb3RvIGVycl9jbGs7CisJfQorCWNsa19lbmFibGUocHJpdi0+dXNiY2xrKTsKKworCWlmICghY3B1X2lzX214MzUoKSkgeworCQlwcml2LT5haGJjbGsgPSBjbGtfZ2V0KGRldiwgInVzYl9haGIiKTsKKwkJaWYgKElTX0VSUihwcml2LT5haGJjbGspKSB7CisJCQlyZXQgPSBQVFJfRVJSKHByaXYtPmFoYmNsayk7CisJCQlnb3RvIGVycl9jbGtfYWhiOworCQl9CisJCWNsa19lbmFibGUocHJpdi0+YWhiY2xrKTsKKwl9CisKKwkvKiBzZXQgVVNCTU9ERSB0byBob3N0IG1vZGUgKi8KKwl0ZW1wID0gcmVhZGwoaGNkLT5yZWdzICsgVVNCTU9ERV9PRkZTRVQpOworCXdyaXRlbCh0ZW1wIHwgVVNCTU9ERV9DTV9IT1NULCBoY2QtPnJlZ3MgKyBVU0JNT0RFX09GRlNFVCk7CisKKwkvKiBzZXQgdXAgdGhlIFBPUlRTQ3ggcmVnaXN0ZXIgKi8KKwl3cml0ZWwocGRhdGEtPnBvcnRzYywgaGNkLT5yZWdzICsgUE9SVFNDX09GRlNFVCk7CisJbWRlbGF5KDEwKTsKKworCS8qIHNldHVwIFVTQkNPTlRST0wuICovCisJcmV0ID0gbXhjX3NldF91c2Jjb250cm9sKHBkZXYtPmlkLCBwZGF0YS0+ZmxhZ3MpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9pbml0OworCisJLyogY2FsbCBwbGF0Zm9ybSBzcGVjaWZpYyBpbml0IGZ1bmN0aW9uICovCisJaWYgKHBkYXRhLT5pbml0KSB7CisJCXJldCA9IHBkYXRhLT5pbml0KHBkZXYpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldiwgInBsYXRmb3JtIGluaXQgZmFpbGVkXG4iKTsKKwkJCWdvdG8gZXJyX2luaXQ7CisJCX0KKwl9CisKKwkvKiBtb3N0IHBsYXRmb3JtcyBuZWVkIHNvbWUgdGltZSB0byBzZXR0bGUgY2hhbmdlZCBJTyBzZXR0aW5ncyAqLworCW1kZWxheSgxMCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSB0cmFuc2NlaXZlciAqLworCWlmIChwZGF0YS0+b3RnKSB7CisJCXBkYXRhLT5vdGctPmlvX3ByaXYgPSBoY2QtPnJlZ3MgKyBVTFBJX1ZJRVdQT1JUX09GRlNFVDsKKwkJaWYgKG90Z19pbml0KHBkYXRhLT5vdGcpICE9IDApCisJCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byBpbml0IHRyYW5zY2VpdmVyXG4iKTsKKwkJZWxzZSBpZiAob3RnX3NldF92YnVzKHBkYXRhLT5vdGcsIDEpICE9IDApCisJCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byBlbmFibGUgdmJ1cyBvbiB0cmFuc2NlaXZlclxuIik7CisJfQorCisJcHJpdi0+aGNkID0gaGNkOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHByaXYpOworCisJcmV0ID0gdXNiX2FkZF9oY2QoaGNkLCBpcnEsIElSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfYWRkOworCisJcmV0dXJuIDA7CisKK2Vycl9hZGQ6CisJaWYgKHBkYXRhICYmIHBkYXRhLT5leGl0KQorCQlwZGF0YS0+ZXhpdChwZGV2KTsKK2Vycl9pbml0OgorCWlmIChwcml2LT5haGJjbGspIHsKKwkJY2xrX2Rpc2FibGUocHJpdi0+YWhiY2xrKTsKKwkJY2xrX3B1dChwcml2LT5haGJjbGspOworCX0KK2Vycl9jbGtfYWhiOgorCWNsa19kaXNhYmxlKHByaXYtPnVzYmNsayk7CisJY2xrX3B1dChwcml2LT51c2JjbGspOworZXJyX2NsazoKKwlpb3VubWFwKGhjZC0+cmVncyk7CitlcnJfaW9yZW1hcDoKKwlyZWxlYXNlX21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuKTsKK2Vycl9yZXF1ZXN0X21lbToKK2Vycl9nZXRfcmVzb3VyY2U6CisJa2ZyZWUocHJpdik7CitlcnJfYWxsb2M6CisJdXNiX3B1dF9oY2QoaGNkKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZXhpdCBlaGNpX214Y19kcnZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG14Y191c2JoX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGVoY2lfbXhjX3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gcHJpdi0+aGNkOworCisJaWYgKHBkYXRhICYmIHBkYXRhLT5leGl0KQorCQlwZGF0YS0+ZXhpdChwZGV2KTsKKworCWlmIChwZGF0YS0+b3RnKQorCQlvdGdfc2h1dGRvd24ocGRhdGEtPm90Zyk7CisKKwl1c2JfcmVtb3ZlX2hjZChoY2QpOworCWlvdW5tYXAoaGNkLT5yZWdzKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuKTsKKwl1c2JfcHV0X2hjZChoY2QpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJY2xrX2Rpc2FibGUocHJpdi0+dXNiY2xrKTsKKwljbGtfcHV0KHByaXYtPnVzYmNsayk7CisJaWYgKHByaXYtPmFoYmNsaykgeworCQljbGtfZGlzYWJsZShwcml2LT5haGJjbGspOworCQljbGtfcHV0KHByaXYtPmFoYmNsayk7CisJfQorCisJa2ZyZWUocHJpdik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZWhjaV9teGNfZHJ2X3NodXRkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGVoY2lfbXhjX3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gcHJpdi0+aGNkOworCisJaWYgKGhjZC0+ZHJpdmVyLT5zaHV0ZG93bikKKwkJaGNkLT5kcml2ZXItPnNodXRkb3duKGhjZCk7Cit9CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06bXhjLWVoY2kiKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZWhjaV9teGNfZHJpdmVyID0geworCS5wcm9iZSA9IGVoY2lfbXhjX2Rydl9wcm9iZSwKKwkucmVtb3ZlID0gX19leGl0X3AoZWhjaV9teGNfZHJ2X3JlbW92ZSksCisJLnNodXRkb3duID0gZWhjaV9teGNfZHJ2X3NodXRkb3duLAorCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gIm14Yy1laGNpIiwKKwl9LAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1vbWFwLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktb21hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZjFhZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktb21hcC5jCkBAIC0wLDAgKzEsNzU2IEBACisvKgorICogZWhjaS1vbWFwLmMgLSBkcml2ZXIgZm9yIFVTQkhPU1Qgb24gT01BUCAzNHh4IHByb2Nlc3NvcgorICoKKyAqIEJ1cyBHbHVlIGZvciBPTUFQMzR4eCBVU0JIT1NUIDMgcG9ydCBFSENJIGNvbnRyb2xsZXIKKyAqIFRlc3RlZCBvbiBPTUFQMzQzMCBFUzIuMCBTRFAKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoJQXV0aG9yOiBWaWtyYW0gUGFuZGl0YSA8dmlrcmFtLnBhbmRpdGFAdGkuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbgorICoJQ29udGFjdDogRmVsaXBlIEJhbGJpIDxmZWxpcGUuYmFsYmlAbm9raWEuY29tPgorICoKKyAqIEJhc2VkIG9uICJlaGNpLWZzbC5jIiBhbmQgImVoY2ktYXUxeHh4LmMiIGVoY2kgZ2x1ZSBsYXllcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBUT0RPIChsYXN0IHVwZGF0ZWQgRmViIDIzcmQsIDIwMDkpOgorICoJLSBhZGQga2VybmVsLWRvYworICoJLSBlbmFibGUgQVVUT0lETEUKKyAqCS0gbW92ZSBEUExMNSBwcm9ncmFtbWluZyB0byBjbG9jayBmdworICoJLSBhZGQgc3VzcGVuZC9yZXN1bWUKKyAqCS0gbW92ZSB3b3JrYXJvdW5kcyB0byBib2FyZC1maWxlcworICovCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC91c2IuaD4KKworLyoKKyAqIE9NQVAgVVNCSE9TVCBSZWdpc3RlciBhZGRyZXNzZXM6IFZJUlRVQUwgQUREUkVTU0VTCisgKglVc2UgZWhjaV9vbWFwX3JlYWRsKCkvZWhjaV9vbWFwX3dyaXRlbCgpIGZ1bmN0aW9ucworICovCisKKy8qIFRMTCBSZWdpc3RlciBTZXQgKi8KKyNkZWZpbmUJT01BUF9VU0JUTExfUkVWSVNJT04JCQkJKDB4MDApCisjZGVmaW5lCU9NQVBfVVNCVExMX1NZU0NPTkZJRwkJCQkoMHgxMCkKKyNkZWZpbmUJT01BUF9VU0JUTExfU1lTQ09ORklHX0NBQ1RJVklUWQkJCSgxIDw8IDgpCisjZGVmaW5lCU9NQVBfVVNCVExMX1NZU0NPTkZJR19TSURMRU1PREUJCQkoMSA8PCAzKQorI2RlZmluZQlPTUFQX1VTQlRMTF9TWVNDT05GSUdfRU5BV0FLRVVQCQkJKDEgPDwgMikKKyNkZWZpbmUJT01BUF9VU0JUTExfU1lTQ09ORklHX1NPRlRSRVNFVAkJCSgxIDw8IDEpCisjZGVmaW5lCU9NQVBfVVNCVExMX1NZU0NPTkZJR19BVVRPSURMRQkJCSgxIDw8IDApCisKKyNkZWZpbmUJT01BUF9VU0JUTExfU1lTU1RBVFVTCQkJCSgweDE0KQorI2RlZmluZQlPTUFQX1VTQlRMTF9TWVNTVEFUVVNfUkVTRVRET05FCQkJKDEgPDwgMCkKKworI2RlZmluZQlPTUFQX1VTQlRMTF9JUlFTVEFUVVMJCQkJKDB4MTgpCisjZGVmaW5lCU9NQVBfVVNCVExMX0lSUUVOQUJMRQkJCQkoMHgxQykKKworI2RlZmluZQlPTUFQX1RMTF9TSEFSRURfQ09ORgkJCQkoMHgzMCkKKyNkZWZpbmUJT01BUF9UTExfU0hBUkVEX0NPTkZfVVNCXzkwRF9ERFJfRU4JCSgxIDw8IDYpCisjZGVmaW5lCU9NQVBfVExMX1NIQVJFRF9DT05GX1VTQl8xODBEX1NEUl9FTgkJKDEgPDwgNSkKKyNkZWZpbmUJT01BUF9UTExfU0hBUkVEX0NPTkZfVVNCX0RJVlJBVElPTgkJKDEgPDwgMikKKyNkZWZpbmUJT01BUF9UTExfU0hBUkVEX0NPTkZfRkNMS19SRVEJCQkoMSA8PCAxKQorI2RlZmluZQlPTUFQX1RMTF9TSEFSRURfQ09ORl9GQ0xLX0lTX09OCQkJKDEgPDwgMCkKKworI2RlZmluZQlPTUFQX1RMTF9DSEFOTkVMX0NPTkYobnVtKQkJCSgweDA0MCArIDB4MDA0ICogbnVtKQorI2RlZmluZQlPTUFQX1RMTF9DSEFOTkVMX0NPTkZfVUxQSU5PQklUU1RVRkYJCSgxIDw8IDExKQorI2RlZmluZQlPTUFQX1RMTF9DSEFOTkVMX0NPTkZfVUxQSV9VTFBJQVVUT0lETEUJCSgxIDw8IDEwKQorI2RlZmluZQlPTUFQX1RMTF9DSEFOTkVMX0NPTkZfVVRNSUFVVE9JRExFCQkoMSA8PCA5KQorI2RlZmluZQlPTUFQX1RMTF9DSEFOTkVMX0NPTkZfVUxQSUREUk1PREUJCSgxIDw8IDgpCisjZGVmaW5lCU9NQVBfVExMX0NIQU5ORUxfQ09ORl9DSEFORU4JCQkoMSA8PCAwKQorCisjZGVmaW5lCU9NQVBfVExMX1VMUElfRlVOQ1RJT05fQ1RSTChudW0pCQkoMHg4MDQgKyAweDEwMCAqIG51bSkKKyNkZWZpbmUJT01BUF9UTExfVUxQSV9JTlRFUkZBQ0VfQ1RSTChudW0pCQkoMHg4MDcgKyAweDEwMCAqIG51bSkKKyNkZWZpbmUJT01BUF9UTExfVUxQSV9PVEdfQ1RSTChudW0pCQkJKDB4ODBBICsgMHgxMDAgKiBudW0pCisjZGVmaW5lCU9NQVBfVExMX1VMUElfSU5UX0VOX1JJU0UobnVtKQkJCSgweDgwRCArIDB4MTAwICogbnVtKQorI2RlZmluZQlPTUFQX1RMTF9VTFBJX0lOVF9FTl9GQUxMKG51bSkJCQkoMHg4MTAgKyAweDEwMCAqIG51bSkKKyNkZWZpbmUJT01BUF9UTExfVUxQSV9JTlRfU1RBVFVTKG51bSkJCQkoMHg4MTMgKyAweDEwMCAqIG51bSkKKyNkZWZpbmUJT01BUF9UTExfVUxQSV9JTlRfTEFUQ0gobnVtKQkJCSgweDgxNCArIDB4MTAwICogbnVtKQorI2RlZmluZQlPTUFQX1RMTF9VTFBJX0RFQlVHKG51bSkJCQkoMHg4MTUgKyAweDEwMCAqIG51bSkKKyNkZWZpbmUJT01BUF9UTExfVUxQSV9TQ1JBVENIX1JFR0lTVEVSKG51bSkJCSgweDgxNiArIDB4MTAwICogbnVtKQorCisjZGVmaW5lIE9NQVBfVExMX0NIQU5ORUxfQ09VTlQJCQkJMworI2RlZmluZSBPTUFQX1RMTF9DSEFOTkVMXzFfRU5fTUFTSwkJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVBfVExMX0NIQU5ORUxfMl9FTl9NQVNLCQkJKDEgPDwgMikKKyNkZWZpbmUgT01BUF9UTExfQ0hBTk5FTF8zX0VOX01BU0sJCQkoMSA8PCA0KQorCisvKiBVSEggUmVnaXN0ZXIgU2V0ICovCisjZGVmaW5lCU9NQVBfVUhIX1JFVklTSU9OCQkJCSgweDAwKQorI2RlZmluZQlPTUFQX1VISF9TWVNDT05GSUcJCQkJKDB4MTApCisjZGVmaW5lCU9NQVBfVUhIX1NZU0NPTkZJR19NSURMRU1PREUJCQkoMSA8PCAxMikKKyNkZWZpbmUJT01BUF9VSEhfU1lTQ09ORklHX0NBQ1RJVklUWQkJCSgxIDw8IDgpCisjZGVmaW5lCU9NQVBfVUhIX1NZU0NPTkZJR19TSURMRU1PREUJCQkoMSA8PCAzKQorI2RlZmluZQlPTUFQX1VISF9TWVNDT05GSUdfRU5BV0FLRVVQCQkJKDEgPDwgMikKKyNkZWZpbmUJT01BUF9VSEhfU1lTQ09ORklHX1NPRlRSRVNFVAkJCSgxIDw8IDEpCisjZGVmaW5lCU9NQVBfVUhIX1NZU0NPTkZJR19BVVRPSURMRQkJCSgxIDw8IDApCisKKyNkZWZpbmUJT01BUF9VSEhfU1lTU1RBVFVTCQkJCSgweDE0KQorI2RlZmluZQlPTUFQX1VISF9IT1NUQ09ORklHCQkJCSgweDQwKQorI2RlZmluZQlPTUFQX1VISF9IT1NUQ09ORklHX1VMUElfQllQQVNTCQkJKDEgPDwgMCkKKyNkZWZpbmUJT01BUF9VSEhfSE9TVENPTkZJR19VTFBJX1AxX0JZUEFTUwkJKDEgPDwgMCkKKyNkZWZpbmUJT01BUF9VSEhfSE9TVENPTkZJR19VTFBJX1AyX0JZUEFTUwkJKDEgPDwgMTEpCisjZGVmaW5lCU9NQVBfVUhIX0hPU1RDT05GSUdfVUxQSV9QM19CWVBBU1MJCSgxIDw8IDEyKQorI2RlZmluZSBPTUFQX1VISF9IT1NUQ09ORklHX0lOQ1I0X0JVUlNUX0VOCQkoMSA8PCAyKQorI2RlZmluZSBPTUFQX1VISF9IT1NUQ09ORklHX0lOQ1I4X0JVUlNUX0VOCQkoMSA8PCAzKQorI2RlZmluZSBPTUFQX1VISF9IT1NUQ09ORklHX0lOQ1IxNl9CVVJTVF9FTgkJKDEgPDwgNCkKKyNkZWZpbmUgT01BUF9VSEhfSE9TVENPTkZJR19JTkNSWF9BTElHTl9FTgkJKDEgPDwgNSkKKyNkZWZpbmUgT01BUF9VSEhfSE9TVENPTkZJR19QMV9DT05ORUNUX1NUQVRVUwkJKDEgPDwgOCkKKyNkZWZpbmUgT01BUF9VSEhfSE9TVENPTkZJR19QMl9DT05ORUNUX1NUQVRVUwkJKDEgPDwgOSkKKyNkZWZpbmUgT01BUF9VSEhfSE9TVENPTkZJR19QM19DT05ORUNUX1NUQVRVUwkJKDEgPDwgMTApCisKKyNkZWZpbmUJT01BUF9VSEhfREVCVUdfQ1NSCQkJCSgweDQ0KQorCisvKiBFSENJIFJlZ2lzdGVyIFNldCAqLworI2RlZmluZQlFSENJX0lOU05SRUcwNV9VTFBJCQkJCSgweEE0KQorI2RlZmluZQlFSENJX0lOU05SRUcwNV9VTFBJX0NPTlRST0xfU0hJRlQJCTMxCisjZGVmaW5lCUVIQ0lfSU5TTlJFRzA1X1VMUElfUE9SVFNFTF9TSElGVAkJMjQKKyNkZWZpbmUJRUhDSV9JTlNOUkVHMDVfVUxQSV9PUFNFTF9TSElGVAkJCTIyCisjZGVmaW5lCUVIQ0lfSU5TTlJFRzA1X1VMUElfUkVHQUREX1NISUZUCQkxNgorI2RlZmluZQlFSENJX0lOU05SRUcwNV9VTFBJX0VYVFJFR0FERF9TSElGVAkJOAorI2RlZmluZQlFSENJX0lOU05SRUcwNV9VTFBJX1dSREFUQV9TSElGVAkJMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIHZvaWQgZWhjaV9vbWFwX3dyaXRlbCh2b2lkIF9faW9tZW0gKmJhc2UsIHUzMiByZWcsIHUzMiB2YWwpCit7CisJX19yYXdfd3JpdGVsKHZhbCwgYmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGVoY2lfb21hcF9yZWFkbCh2b2lkIF9faW9tZW0gKmJhc2UsIHUzMiByZWcpCit7CisJcmV0dXJuIF9fcmF3X3JlYWRsKGJhc2UgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZWhjaV9vbWFwX3dyaXRlYih2b2lkIF9faW9tZW0gKmJhc2UsIHU4IHJlZywgdTggdmFsKQoreworCV9fcmF3X3dyaXRlYih2YWwsIGJhc2UgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHU4IGVoY2lfb21hcF9yZWFkYih2b2lkIF9faW9tZW0gKmJhc2UsIHU4IHJlZykKK3sKKwlyZXR1cm4gX19yYXdfcmVhZGIoYmFzZSArIHJlZyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0cnVjdCBlaGNpX2hjZF9vbWFwIHsKKwlzdHJ1Y3QgZWhjaV9oY2QJCSplaGNpOworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CisKKwlzdHJ1Y3QgY2xrCQkqdXNiaG9zdF9pY2s7CisJc3RydWN0IGNsawkJKnVzYmhvc3QyXzEyMG1fZmNrOworCXN0cnVjdCBjbGsJCSp1c2Job3N0MV80OG1fZmNrOworCXN0cnVjdCBjbGsJCSp1c2J0bGxfZmNrOworCXN0cnVjdCBjbGsJCSp1c2J0bGxfaWNrOworCisJLyogRklYTUUgdGhlIGZvbGxvd2luZyB0d28gd29ya2Fyb3VuZHMgYXJlCisJICogYm9hcmQgc3BlY2lmaWMgbm90IHNpbGljb24tc3BlY2lmaWMgc28gdGhlc2UKKwkgKiBzaG91bGQgYmUgbW92ZWQgdG8gYm9hcmQtZmlsZSBpbnN0ZWFkLgorCSAqCisJICogTWF5YmUgc29tZW9uZSBmcm9tIFRJIHdpbGwga25vdyBiZXR0ZXIgd2hpY2gKKwkgKiBib2FyZCBpcyBhZmZlY3RlZCBhbmQgbmVlZHMgdGhlIHdvcmthcm91bmRzCisJICogdG8gYmUgYXBwbGllZAorCSAqLworCisJLyogZ3BpbyBmb3IgcmVzZXR0aW5nIHBoeSAqLworCWludAkJCXJlc2V0X2dwaW9fcG9ydFtPTUFQM19IU19VU0JfUE9SVFNdOworCisJLyogcGh5IHJlc2V0IHdvcmthcm91bmQgKi8KKwlpbnQJCQlwaHlfcmVzZXQ7CisKKwkvKiBkZXNpcmVkIHBoeV9tb2RlOiBUTEwsIFBIWSAqLworCWVudW0gZWhjaV9oY2Rfb21hcF9tb2RlCXBvcnRfbW9kZVtPTUFQM19IU19VU0JfUE9SVFNdOworCisJdm9pZCBfX2lvbWVtCQkqdWhoX2Jhc2U7CisJdm9pZCBfX2lvbWVtCQkqdGxsX2Jhc2U7CisJdm9pZCBfX2lvbWVtCQkqZWhjaV9iYXNlOworfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgb21hcF91c2JfdXRtaV9pbml0KHN0cnVjdCBlaGNpX2hjZF9vbWFwICpvbWFwLCB1OCB0bGxfY2hhbm5lbF9tYXNrKQoreworCXVuc2lnbmVkIHJlZzsKKwlpbnQgaTsKKworCS8qIFByb2dyYW0gdGhlIDMgVExMIGNoYW5uZWxzIHVwZnJvbnQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgT01BUF9UTExfQ0hBTk5FTF9DT1VOVDsgaSsrKSB7CisJCXJlZyA9IGVoY2lfb21hcF9yZWFkbChvbWFwLT50bGxfYmFzZSwgT01BUF9UTExfQ0hBTk5FTF9DT05GKGkpKTsKKworCQkvKiBEaXNhYmxlIEF1dG9JZGxlLCBCaXRTdHVmZmluZyBhbmQgdXNlIFNEUiBNb2RlICovCisJCXJlZyAmPSB+KE9NQVBfVExMX0NIQU5ORUxfQ09ORl9VVE1JQVVUT0lETEUKKwkJCQl8IE9NQVBfVExMX0NIQU5ORUxfQ09ORl9VTFBJTk9CSVRTVFVGRgorCQkJCXwgT01BUF9UTExfQ0hBTk5FTF9DT05GX1VMUElERFJNT0RFKTsKKwkJZWhjaV9vbWFwX3dyaXRlbChvbWFwLT50bGxfYmFzZSwgT01BUF9UTExfQ0hBTk5FTF9DT05GKGkpLCByZWcpOworCX0KKworCS8qIFByb2dyYW0gQ29tbW9uIFRMTCByZWdpc3RlciAqLworCXJlZyA9IGVoY2lfb21hcF9yZWFkbChvbWFwLT50bGxfYmFzZSwgT01BUF9UTExfU0hBUkVEX0NPTkYpOworCXJlZyB8PSAoT01BUF9UTExfU0hBUkVEX0NPTkZfRkNMS19JU19PTgorCQkJfCBPTUFQX1RMTF9TSEFSRURfQ09ORl9VU0JfRElWUkFUSU9OCisJCQl8IE9NQVBfVExMX1NIQVJFRF9DT05GX1VTQl8xODBEX1NEUl9FTik7CisJcmVnICY9IH5PTUFQX1RMTF9TSEFSRURfQ09ORl9VU0JfOTBEX0REUl9FTjsKKworCWVoY2lfb21hcF93cml0ZWwob21hcC0+dGxsX2Jhc2UsIE9NQVBfVExMX1NIQVJFRF9DT05GLCByZWcpOworCisJLyogRW5hYmxlIGNoYW5uZWxzIG5vdyAqLworCWZvciAoaSA9IDA7IGkgPCBPTUFQX1RMTF9DSEFOTkVMX0NPVU5UOyBpKyspIHsKKwkJcmVnID0gZWhjaV9vbWFwX3JlYWRsKG9tYXAtPnRsbF9iYXNlLCBPTUFQX1RMTF9DSEFOTkVMX0NPTkYoaSkpOworCisJCS8qIEVuYWJsZSBvbmx5IHRoZSByZWcgdGhhdCBpcyBuZWVkZWQgKi8KKwkJaWYgKCEodGxsX2NoYW5uZWxfbWFzayAmIDE8PGkpKQorCQkJY29udGludWU7CisKKwkJcmVnIHw9IE9NQVBfVExMX0NIQU5ORUxfQ09ORl9DSEFORU47CisJCWVoY2lfb21hcF93cml0ZWwob21hcC0+dGxsX2Jhc2UsIE9NQVBfVExMX0NIQU5ORUxfQ09ORihpKSwgcmVnKTsKKworCQllaGNpX29tYXBfd3JpdGViKG9tYXAtPnRsbF9iYXNlLAorCQkJCU9NQVBfVExMX1VMUElfU0NSQVRDSF9SRUdJU1RFUihpKSwgMHhiZSk7CisJCWRldl9kYmcob21hcC0+ZGV2LCAiVUxQSV9TQ1JBVENIX1JFR1tjaD0lZF09IDB4JTAyeFxuIiwKKwkJCQlpKzEsIGVoY2lfb21hcF9yZWFkYihvbWFwLT50bGxfYmFzZSwKKwkJCQlPTUFQX1RMTF9VTFBJX1NDUkFUQ0hfUkVHSVNURVIoaSkpKTsKKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIG9tYXBfc3RhcnRfZWhjCisgKgktIFN0YXJ0IHRoZSBUSSBVU0JIT1NUIGNvbnRyb2xsZXIKKyAqLworc3RhdGljIGludCBvbWFwX3N0YXJ0X2VoYyhzdHJ1Y3QgZWhjaV9oY2Rfb21hcCAqb21hcCwgc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDAwKTsKKwl1OCB0bGxfY2hfbWFzayA9IDA7CisJdW5zaWduZWQgcmVnID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCWRldl9kYmcob21hcC0+ZGV2LCAic3RhcnRpbmcgVEkgRUhDSSBVU0IgQ29udHJvbGxlclxuIik7CisKKwkvKiBFbmFibGUgQ2xvY2tzIGZvciBVU0JIT1NUICovCisJb21hcC0+dXNiaG9zdF9pY2sgPSBjbGtfZ2V0KG9tYXAtPmRldiwgInVzYmhvc3RfaWNrIik7CisJaWYgKElTX0VSUihvbWFwLT51c2Job3N0X2ljaykpIHsKKwkJcmV0ID0gIFBUUl9FUlIob21hcC0+dXNiaG9zdF9pY2spOworCQlnb3RvIGVycl9ob3N0X2ljazsKKwl9CisJY2xrX2VuYWJsZShvbWFwLT51c2Job3N0X2ljayk7CisKKwlvbWFwLT51c2Job3N0Ml8xMjBtX2ZjayA9IGNsa19nZXQob21hcC0+ZGV2LCAidXNiaG9zdF8xMjBtX2ZjayIpOworCWlmIChJU19FUlIob21hcC0+dXNiaG9zdDJfMTIwbV9mY2spKSB7CisJCXJldCA9IFBUUl9FUlIob21hcC0+dXNiaG9zdDJfMTIwbV9mY2spOworCQlnb3RvIGVycl9ob3N0XzEyMG1fZmNrOworCX0KKwljbGtfZW5hYmxlKG9tYXAtPnVzYmhvc3QyXzEyMG1fZmNrKTsKKworCW9tYXAtPnVzYmhvc3QxXzQ4bV9mY2sgPSBjbGtfZ2V0KG9tYXAtPmRldiwgInVzYmhvc3RfNDhtX2ZjayIpOworCWlmIChJU19FUlIob21hcC0+dXNiaG9zdDFfNDhtX2ZjaykpIHsKKwkJcmV0ID0gUFRSX0VSUihvbWFwLT51c2Job3N0MV80OG1fZmNrKTsKKwkJZ290byBlcnJfaG9zdF80OG1fZmNrOworCX0KKwljbGtfZW5hYmxlKG9tYXAtPnVzYmhvc3QxXzQ4bV9mY2spOworCisJaWYgKG9tYXAtPnBoeV9yZXNldCkgeworCQkvKiBSZWZlcjogSVNTVUUxICovCisJCWlmIChncGlvX2lzX3ZhbGlkKG9tYXAtPnJlc2V0X2dwaW9fcG9ydFswXSkpIHsKKwkJCWdwaW9fcmVxdWVzdChvbWFwLT5yZXNldF9ncGlvX3BvcnRbMF0sCisJCQkJCQkiVVNCMSBQSFkgcmVzZXQiKTsKKwkJCWdwaW9fZGlyZWN0aW9uX291dHB1dChvbWFwLT5yZXNldF9ncGlvX3BvcnRbMF0sIDApOworCQl9CisKKwkJaWYgKGdwaW9faXNfdmFsaWQob21hcC0+cmVzZXRfZ3Bpb19wb3J0WzFdKSkgeworCQkJZ3Bpb19yZXF1ZXN0KG9tYXAtPnJlc2V0X2dwaW9fcG9ydFsxXSwKKwkJCQkJCSJVU0IyIFBIWSByZXNldCIpOworCQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KG9tYXAtPnJlc2V0X2dwaW9fcG9ydFsxXSwgMCk7CisJCX0KKworCQkvKiBIb2xkIHRoZSBQSFkgaW4gUkVTRVQgZm9yIGVub3VnaCB0aW1lIHRpbGwgRElSIGlzIGhpZ2ggKi8KKwkJdWRlbGF5KDEwKTsKKwl9CisKKwkvKiBDb25maWd1cmUgVExMIGZvciA2ME1oeiBjbGsgZm9yIFVMUEkgKi8KKwlvbWFwLT51c2J0bGxfZmNrID0gY2xrX2dldChvbWFwLT5kZXYsICJ1c2J0bGxfZmNrIik7CisJaWYgKElTX0VSUihvbWFwLT51c2J0bGxfZmNrKSkgeworCQlyZXQgPSBQVFJfRVJSKG9tYXAtPnVzYnRsbF9mY2spOworCQlnb3RvIGVycl90bGxfZmNrOworCX0KKwljbGtfZW5hYmxlKG9tYXAtPnVzYnRsbF9mY2spOworCisJb21hcC0+dXNidGxsX2ljayA9IGNsa19nZXQob21hcC0+ZGV2LCAidXNidGxsX2ljayIpOworCWlmIChJU19FUlIob21hcC0+dXNidGxsX2ljaykpIHsKKwkJcmV0ID0gUFRSX0VSUihvbWFwLT51c2J0bGxfaWNrKTsKKwkJZ290byBlcnJfdGxsX2ljazsKKwl9CisJY2xrX2VuYWJsZShvbWFwLT51c2J0bGxfaWNrKTsKKworCS8qIHBlcmZvcm0gVExMIHNvZnQgcmVzZXQsIGFuZCB3YWl0IHVudGlsIHJlc2V0IGlzIGNvbXBsZXRlICovCisJZWhjaV9vbWFwX3dyaXRlbChvbWFwLT50bGxfYmFzZSwgT01BUF9VU0JUTExfU1lTQ09ORklHLAorCQkJT01BUF9VU0JUTExfU1lTQ09ORklHX1NPRlRSRVNFVCk7CisKKwkvKiBXYWl0IGZvciBUTEwgcmVzZXQgdG8gY29tcGxldGUgKi8KKwl3aGlsZSAoIShlaGNpX29tYXBfcmVhZGwob21hcC0+dGxsX2Jhc2UsIE9NQVBfVVNCVExMX1NZU1NUQVRVUykKKwkJCSYgT01BUF9VU0JUTExfU1lTU1RBVFVTX1JFU0VURE9ORSkpIHsKKwkJY3B1X3JlbGF4KCk7CisKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJCWRldl9kYmcob21hcC0+ZGV2LCAib3BlcmF0aW9uIHRpbWVkIG91dFxuIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJfc3lzX3N0YXR1czsKKwkJfQorCX0KKworCWRldl9kYmcob21hcC0+ZGV2LCAiVExMIFJFU0VUIERPTkVcbiIpOworCisJLyogKDE8PDMpID0gbm8gaWRsZSBtb2RlIG9ubHkgZm9yIGluaXRpYWwgZGVidWdnaW5nICovCisJZWhjaV9vbWFwX3dyaXRlbChvbWFwLT50bGxfYmFzZSwgT01BUF9VU0JUTExfU1lTQ09ORklHLAorCQkJT01BUF9VU0JUTExfU1lTQ09ORklHX0VOQVdBS0VVUCB8CisJCQlPTUFQX1VTQlRMTF9TWVNDT05GSUdfU0lETEVNT0RFIHwKKwkJCU9NQVBfVVNCVExMX1NZU0NPTkZJR19DQUNUSVZJVFkpOworCisKKwkvKiBQdXQgVUhIIGluIE5vSWRsZS9Ob1N0YW5kYnkgbW9kZSAqLworCXJlZyA9IGVoY2lfb21hcF9yZWFkbChvbWFwLT51aGhfYmFzZSwgT01BUF9VSEhfU1lTQ09ORklHKTsKKwlyZWcgfD0gKE9NQVBfVUhIX1NZU0NPTkZJR19FTkFXQUtFVVAKKwkJCXwgT01BUF9VSEhfU1lTQ09ORklHX1NJRExFTU9ERQorCQkJfCBPTUFQX1VISF9TWVNDT05GSUdfQ0FDVElWSVRZCisJCQl8IE9NQVBfVUhIX1NZU0NPTkZJR19NSURMRU1PREUpOworCXJlZyAmPSB+T01BUF9VSEhfU1lTQ09ORklHX0FVVE9JRExFOworCisJZWhjaV9vbWFwX3dyaXRlbChvbWFwLT51aGhfYmFzZSwgT01BUF9VSEhfU1lTQ09ORklHLCByZWcpOworCisJcmVnID0gZWhjaV9vbWFwX3JlYWRsKG9tYXAtPnVoaF9iYXNlLCBPTUFQX1VISF9IT1NUQ09ORklHKTsKKworCS8qIHNldHVwIFVMUEkgYnlwYXNzIGFuZCBidXJzdCBjb25maWd1cmF0aW9ucyAqLworCXJlZyB8PSAoT01BUF9VSEhfSE9TVENPTkZJR19JTkNSNF9CVVJTVF9FTgorCQkJfCBPTUFQX1VISF9IT1NUQ09ORklHX0lOQ1I4X0JVUlNUX0VOCisJCQl8IE9NQVBfVUhIX0hPU1RDT05GSUdfSU5DUjE2X0JVUlNUX0VOKTsKKwlyZWcgJj0gfk9NQVBfVUhIX0hPU1RDT05GSUdfSU5DUlhfQUxJR05fRU47CisKKwlpZiAob21hcC0+cG9ydF9tb2RlWzBdID09IEVIQ0lfSENEX09NQVBfTU9ERV9VTktOT1dOKQorCQlyZWcgJj0gfk9NQVBfVUhIX0hPU1RDT05GSUdfUDFfQ09OTkVDVF9TVEFUVVM7CisJaWYgKG9tYXAtPnBvcnRfbW9kZVsxXSA9PSBFSENJX0hDRF9PTUFQX01PREVfVU5LTk9XTikKKwkJcmVnICY9IH5PTUFQX1VISF9IT1NUQ09ORklHX1AyX0NPTk5FQ1RfU1RBVFVTOworCWlmIChvbWFwLT5wb3J0X21vZGVbMl0gPT0gRUhDSV9IQ0RfT01BUF9NT0RFX1VOS05PV04pCisJCXJlZyAmPSB+T01BUF9VSEhfSE9TVENPTkZJR19QM19DT05ORUNUX1NUQVRVUzsKKworCS8qIEJ5cGFzcyB0aGUgVExMIG1vZHVsZSBmb3IgUEhZIG1vZGUgb3BlcmF0aW9uICovCisJIGlmIChvbWFwX3JldigpIDw9IE9NQVAzNDMwX1JFVl9FUzJfMSkgeworCQlkZXZfZGJnKG9tYXAtPmRldiwgIk9NQVAzIEVTIHZlcnNpb24gPD0gRVMyLjEgXG4iKTsKKwkJaWYgKChvbWFwLT5wb3J0X21vZGVbMF0gPT0gRUhDSV9IQ0RfT01BUF9NT0RFX1BIWSkgfHwKKwkJCShvbWFwLT5wb3J0X21vZGVbMV0gPT0gRUhDSV9IQ0RfT01BUF9NT0RFX1BIWSkgfHwKKwkJCQkob21hcC0+cG9ydF9tb2RlWzJdID09IEVIQ0lfSENEX09NQVBfTU9ERV9QSFkpKQorCQkJcmVnICY9IH5PTUFQX1VISF9IT1NUQ09ORklHX1VMUElfQllQQVNTOworCQllbHNlCisJCQlyZWcgfD0gT01BUF9VSEhfSE9TVENPTkZJR19VTFBJX0JZUEFTUzsKKwl9IGVsc2UgeworCQlkZXZfZGJnKG9tYXAtPmRldiwgIk9NQVAzIEVTIHZlcnNpb24gPiBFUzIuMVxuIik7CisJCWlmIChvbWFwLT5wb3J0X21vZGVbMF0gPT0gRUhDSV9IQ0RfT01BUF9NT0RFX1BIWSkKKwkJCXJlZyAmPSB+T01BUF9VSEhfSE9TVENPTkZJR19VTFBJX1AxX0JZUEFTUzsKKwkJZWxzZSBpZiAob21hcC0+cG9ydF9tb2RlWzBdID09IEVIQ0lfSENEX09NQVBfTU9ERV9UTEwpCisJCQlyZWcgfD0gT01BUF9VSEhfSE9TVENPTkZJR19VTFBJX1AxX0JZUEFTUzsKKworCQlpZiAob21hcC0+cG9ydF9tb2RlWzFdID09IEVIQ0lfSENEX09NQVBfTU9ERV9QSFkpCisJCQlyZWcgJj0gfk9NQVBfVUhIX0hPU1RDT05GSUdfVUxQSV9QMl9CWVBBU1M7CisJCWVsc2UgaWYgKG9tYXAtPnBvcnRfbW9kZVsxXSA9PSBFSENJX0hDRF9PTUFQX01PREVfVExMKQorCQkJcmVnIHw9IE9NQVBfVUhIX0hPU1RDT05GSUdfVUxQSV9QMl9CWVBBU1M7CisKKwkJaWYgKG9tYXAtPnBvcnRfbW9kZVsyXSA9PSBFSENJX0hDRF9PTUFQX01PREVfUEhZKQorCQkJcmVnICY9IH5PTUFQX1VISF9IT1NUQ09ORklHX1VMUElfUDNfQllQQVNTOworCQllbHNlIGlmIChvbWFwLT5wb3J0X21vZGVbMl0gPT0gRUhDSV9IQ0RfT01BUF9NT0RFX1RMTCkKKwkJCXJlZyB8PSBPTUFQX1VISF9IT1NUQ09ORklHX1VMUElfUDNfQllQQVNTOworCisJfQorCWVoY2lfb21hcF93cml0ZWwob21hcC0+dWhoX2Jhc2UsIE9NQVBfVUhIX0hPU1RDT05GSUcsIHJlZyk7CisJZGV2X2RiZyhvbWFwLT5kZXYsICJVSEggc2V0dXAgZG9uZSwgdWhoX2hvc3Rjb25maWc9JXhcbiIsIHJlZyk7CisKKworCWlmICgob21hcC0+cG9ydF9tb2RlWzBdID09IEVIQ0lfSENEX09NQVBfTU9ERV9UTEwpIHx8CisJCShvbWFwLT5wb3J0X21vZGVbMV0gPT0gRUhDSV9IQ0RfT01BUF9NT0RFX1RMTCkgfHwKKwkJCShvbWFwLT5wb3J0X21vZGVbMl0gPT0gRUhDSV9IQ0RfT01BUF9NT0RFX1RMTCkpIHsKKworCQlpZiAob21hcC0+cG9ydF9tb2RlWzBdID09IEVIQ0lfSENEX09NQVBfTU9ERV9UTEwpCisJCQl0bGxfY2hfbWFzayB8PSBPTUFQX1RMTF9DSEFOTkVMXzFfRU5fTUFTSzsKKwkJaWYgKG9tYXAtPnBvcnRfbW9kZVsxXSA9PSBFSENJX0hDRF9PTUFQX01PREVfVExMKQorCQkJdGxsX2NoX21hc2sgfD0gT01BUF9UTExfQ0hBTk5FTF8yX0VOX01BU0s7CisJCWlmIChvbWFwLT5wb3J0X21vZGVbMl0gPT0gRUhDSV9IQ0RfT01BUF9NT0RFX1RMTCkKKwkJCXRsbF9jaF9tYXNrIHw9IE9NQVBfVExMX0NIQU5ORUxfM19FTl9NQVNLOworCisJCS8qIEVuYWJsZSBVVE1JIG1vZGUgZm9yIHJlcXVpcmVkIFRMTCBjaGFubmVscyAqLworCQlvbWFwX3VzYl91dG1pX2luaXQob21hcCwgdGxsX2NoX21hc2spOworCX0KKworCWlmIChvbWFwLT5waHlfcmVzZXQpIHsKKwkJLyogUmVmZXIgSVNTVUUxOgorCQkgKiBIb2xkIHRoZSBQSFkgaW4gUkVTRVQgZm9yIGVub3VnaCB0aW1lIHRpbGwKKwkJICogUEhZIGlzIHNldHRsZWQgYW5kIHJlYWR5CisJCSAqLworCQl1ZGVsYXkoMTApOworCisJCWlmIChncGlvX2lzX3ZhbGlkKG9tYXAtPnJlc2V0X2dwaW9fcG9ydFswXSkpCisJCQlncGlvX3NldF92YWx1ZShvbWFwLT5yZXNldF9ncGlvX3BvcnRbMF0sIDEpOworCisJCWlmIChncGlvX2lzX3ZhbGlkKG9tYXAtPnJlc2V0X2dwaW9fcG9ydFsxXSkpCisJCQlncGlvX3NldF92YWx1ZShvbWFwLT5yZXNldF9ncGlvX3BvcnRbMV0sIDEpOworCX0KKworCXJldHVybiAwOworCitlcnJfc3lzX3N0YXR1czoKKwljbGtfZGlzYWJsZShvbWFwLT51c2J0bGxfaWNrKTsKKwljbGtfcHV0KG9tYXAtPnVzYnRsbF9pY2spOworCitlcnJfdGxsX2ljazoKKwljbGtfZGlzYWJsZShvbWFwLT51c2J0bGxfZmNrKTsKKwljbGtfcHV0KG9tYXAtPnVzYnRsbF9mY2spOworCitlcnJfdGxsX2ZjazoKKwljbGtfZGlzYWJsZShvbWFwLT51c2Job3N0MV80OG1fZmNrKTsKKwljbGtfcHV0KG9tYXAtPnVzYmhvc3QxXzQ4bV9mY2spOworCisJaWYgKG9tYXAtPnBoeV9yZXNldCkgeworCQlpZiAoZ3Bpb19pc192YWxpZChvbWFwLT5yZXNldF9ncGlvX3BvcnRbMF0pKQorCQkJZ3Bpb19mcmVlKG9tYXAtPnJlc2V0X2dwaW9fcG9ydFswXSk7CisKKwkJaWYgKGdwaW9faXNfdmFsaWQob21hcC0+cmVzZXRfZ3Bpb19wb3J0WzFdKSkKKwkJCWdwaW9fZnJlZShvbWFwLT5yZXNldF9ncGlvX3BvcnRbMV0pOworCX0KKworZXJyX2hvc3RfNDhtX2ZjazoKKwljbGtfZGlzYWJsZShvbWFwLT51c2Job3N0Ml8xMjBtX2Zjayk7CisJY2xrX3B1dChvbWFwLT51c2Job3N0Ml8xMjBtX2Zjayk7CisKK2Vycl9ob3N0XzEyMG1fZmNrOgorCWNsa19kaXNhYmxlKG9tYXAtPnVzYmhvc3RfaWNrKTsKKwljbGtfcHV0KG9tYXAtPnVzYmhvc3RfaWNrKTsKKworZXJyX2hvc3RfaWNrOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfc3RvcF9laGMoc3RydWN0IGVoY2lfaGNkX29tYXAgKm9tYXAsIHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwKTsKKworCWRldl9kYmcob21hcC0+ZGV2LCAic3RvcHBpbmcgVEkgRUhDSSBVU0IgQ29udHJvbGxlclxuIik7CisKKwkvKiBSZXNldCBPTUFQIG1vZHVsZXMgZm9yIGluc21vZC9ybW1vZCB0byB3b3JrICovCisJZWhjaV9vbWFwX3dyaXRlbChvbWFwLT51aGhfYmFzZSwgT01BUF9VSEhfU1lTQ09ORklHLAorCQkJT01BUF9VSEhfU1lTQ09ORklHX1NPRlRSRVNFVCk7CisJd2hpbGUgKCEoZWhjaV9vbWFwX3JlYWRsKG9tYXAtPnVoaF9iYXNlLCBPTUFQX1VISF9TWVNTVEFUVVMpCisJCQkJJiAoMSA8PCAwKSkpIHsKKwkJY3B1X3JlbGF4KCk7CisKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCisJCQlkZXZfZGJnKG9tYXAtPmRldiwgIm9wZXJhdGlvbiB0aW1lZCBvdXRcbiIpOworCX0KKworCXdoaWxlICghKGVoY2lfb21hcF9yZWFkbChvbWFwLT51aGhfYmFzZSwgT01BUF9VSEhfU1lTU1RBVFVTKQorCQkJCSYgKDEgPDwgMSkpKSB7CisJCWNwdV9yZWxheCgpOworCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJZGV2X2RiZyhvbWFwLT5kZXYsICJvcGVyYXRpb24gdGltZWQgb3V0XG4iKTsKKwl9CisKKwl3aGlsZSAoIShlaGNpX29tYXBfcmVhZGwob21hcC0+dWhoX2Jhc2UsIE9NQVBfVUhIX1NZU1NUQVRVUykKKwkJCQkmICgxIDw8IDIpKSkgeworCQljcHVfcmVsYXgoKTsKKworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCWRldl9kYmcob21hcC0+ZGV2LCAib3BlcmF0aW9uIHRpbWVkIG91dFxuIik7CisJfQorCisJZWhjaV9vbWFwX3dyaXRlbChvbWFwLT50bGxfYmFzZSwgT01BUF9VU0JUTExfU1lTQ09ORklHLCAoMSA8PCAxKSk7CisKKwl3aGlsZSAoIShlaGNpX29tYXBfcmVhZGwob21hcC0+dGxsX2Jhc2UsIE9NQVBfVVNCVExMX1NZU1NUQVRVUykKKwkJCQkmICgxIDw8IDApKSkgeworCQljcHVfcmVsYXgoKTsKKworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCWRldl9kYmcob21hcC0+ZGV2LCAib3BlcmF0aW9uIHRpbWVkIG91dFxuIik7CisJfQorCisJaWYgKG9tYXAtPnVzYnRsbF9mY2sgIT0gTlVMTCkgeworCQljbGtfZGlzYWJsZShvbWFwLT51c2J0bGxfZmNrKTsKKwkJY2xrX3B1dChvbWFwLT51c2J0bGxfZmNrKTsKKwkJb21hcC0+dXNidGxsX2ZjayA9IE5VTEw7CisJfQorCisJaWYgKG9tYXAtPnVzYmhvc3RfaWNrICE9IE5VTEwpIHsKKwkJY2xrX2Rpc2FibGUob21hcC0+dXNiaG9zdF9pY2spOworCQljbGtfcHV0KG9tYXAtPnVzYmhvc3RfaWNrKTsKKwkJb21hcC0+dXNiaG9zdF9pY2sgPSBOVUxMOworCX0KKworCWlmIChvbWFwLT51c2Job3N0MV80OG1fZmNrICE9IE5VTEwpIHsKKwkJY2xrX2Rpc2FibGUob21hcC0+dXNiaG9zdDFfNDhtX2Zjayk7CisJCWNsa19wdXQob21hcC0+dXNiaG9zdDFfNDhtX2Zjayk7CisJCW9tYXAtPnVzYmhvc3QxXzQ4bV9mY2sgPSBOVUxMOworCX0KKworCWlmIChvbWFwLT51c2Job3N0Ml8xMjBtX2ZjayAhPSBOVUxMKSB7CisJCWNsa19kaXNhYmxlKG9tYXAtPnVzYmhvc3QyXzEyMG1fZmNrKTsKKwkJY2xrX3B1dChvbWFwLT51c2Job3N0Ml8xMjBtX2Zjayk7CisJCW9tYXAtPnVzYmhvc3QyXzEyMG1fZmNrID0gTlVMTDsKKwl9CisKKwlpZiAob21hcC0+dXNidGxsX2ljayAhPSBOVUxMKSB7CisJCWNsa19kaXNhYmxlKG9tYXAtPnVzYnRsbF9pY2spOworCQljbGtfcHV0KG9tYXAtPnVzYnRsbF9pY2spOworCQlvbWFwLT51c2J0bGxfaWNrID0gTlVMTDsKKwl9CisKKwlpZiAob21hcC0+cGh5X3Jlc2V0KSB7CisJCWlmIChncGlvX2lzX3ZhbGlkKG9tYXAtPnJlc2V0X2dwaW9fcG9ydFswXSkpCisJCQlncGlvX2ZyZWUob21hcC0+cmVzZXRfZ3Bpb19wb3J0WzBdKTsKKworCQlpZiAoZ3Bpb19pc192YWxpZChvbWFwLT5yZXNldF9ncGlvX3BvcnRbMV0pKQorCQkJZ3Bpb19mcmVlKG9tYXAtPnJlc2V0X2dwaW9fcG9ydFsxXSk7CisJfQorCisJZGV2X2RiZyhvbWFwLT5kZXYsICJDbG9jayB0byBVU0IgaG9zdCBoYXMgYmVlbiBkaXNhYmxlZFxuIik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGNfZHJpdmVyIGVoY2lfb21hcF9oY19kcml2ZXI7CisKKy8qIGNvbmZpZ3VyZSBzbyBhbiBIQyBkZXZpY2UgYW5kIGlkIGFyZSBhbHdheXMgcHJvdmlkZWQgKi8KKy8qIGFsd2F5cyBjYWxsZWQgd2l0aCBwcm9jZXNzIGNvbnRleHQ7IHNsZWVwaW5nIGlzIE9LICovCisKKy8qKgorICogZWhjaV9oY2Rfb21hcF9wcm9iZSAtIGluaXRpYWxpemUgVEktYmFzZWQgSENEcworICoKKyAqIEFsbG9jYXRlcyBiYXNpYyByZXNvdXJjZXMgZm9yIHRoaXMgVVNCIGhvc3QgY29udHJvbGxlciwgYW5kCisgKiB0aGVuIGludm9rZXMgdGhlIHN0YXJ0KCkgbWV0aG9kIGZvciB0aGUgSENEIGFzc29jaWF0ZWQgd2l0aCBpdAorICogdGhyb3VnaCB0aGUgaG90cGx1ZyBlbnRyeSdzIGRyaXZlcl9kYXRhLgorICovCitzdGF0aWMgaW50IGVoY2lfaGNkX29tYXBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZWhjaV9oY2Rfb21hcF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBlaGNpX2hjZF9vbWFwICpvbWFwOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCB1c2JfaGNkICpoY2Q7CisKKwlpbnQgaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpbnQgcmV0ID0gLUVOT0RFVjsKKworCWlmICghcGRhdGEpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAibWlzc2luZyBwbGF0Zm9ybV9kYXRhXG4iKTsKKwkJZ290byBlcnJfcGRhdGE7CisJfQorCisJaWYgKHVzYl9kaXNhYmxlZCgpKQorCQlnb3RvIGVycl9kaXNhYmxlZDsKKworCW9tYXAgPSBremFsbG9jKHNpemVvZigqb21hcCksIEdGUF9LRVJORUwpOworCWlmICghb21hcCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9kaXNhYmxlZDsKKwl9CisKKwloY2QgPSB1c2JfY3JlYXRlX2hjZCgmZWhjaV9vbWFwX2hjX2RyaXZlciwgJnBkZXYtPmRldiwKKwkJCWRldl9uYW1lKCZwZGV2LT5kZXYpKTsKKwlpZiAoIWhjZCkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIGhjZCB3aXRoIGVyciAlZFxuIiwgcmV0KTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfY3JlYXRlX2hjZDsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBvbWFwKTsKKwlvbWFwLT5kZXYJCT0gJnBkZXYtPmRldjsKKwlvbWFwLT5waHlfcmVzZXQJCT0gcGRhdGEtPnBoeV9yZXNldDsKKwlvbWFwLT5yZXNldF9ncGlvX3BvcnRbMF0JPSBwZGF0YS0+cmVzZXRfZ3Bpb19wb3J0WzBdOworCW9tYXAtPnJlc2V0X2dwaW9fcG9ydFsxXQk9IHBkYXRhLT5yZXNldF9ncGlvX3BvcnRbMV07CisJb21hcC0+cmVzZXRfZ3Bpb19wb3J0WzJdCT0gcGRhdGEtPnJlc2V0X2dwaW9fcG9ydFsyXTsKKwlvbWFwLT5wb3J0X21vZGVbMF0JCT0gcGRhdGEtPnBvcnRfbW9kZVswXTsKKwlvbWFwLT5wb3J0X21vZGVbMV0JCT0gcGRhdGEtPnBvcnRfbW9kZVsxXTsKKwlvbWFwLT5wb3J0X21vZGVbMl0JCT0gcGRhdGEtPnBvcnRfbW9kZVsyXTsKKwlvbWFwLT5laGNpCQk9IGhjZF90b19laGNpKGhjZCk7CisJb21hcC0+ZWhjaS0+c2Jybgk9IDB4MjA7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCisJaGNkLT5yc3JjX3N0YXJ0ID0gcmVzLT5zdGFydDsKKwloY2QtPnJzcmNfbGVuID0gcmVzb3VyY2Vfc2l6ZShyZXMpOworCisJaGNkLT5yZWdzID0gaW9yZW1hcChoY2QtPnJzcmNfc3RhcnQsIGhjZC0+cnNyY19sZW4pOworCWlmICghaGNkLT5yZWdzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkVIQ0kgaW9yZW1hcCBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9pb3JlbWFwOworCX0KKworCS8qIHdlIGtub3cgdGhpcyBpcyB0aGUgbWVtb3J5IHdlIHdhbnQsIG5vIG5lZWQgdG8gaW9yZW1hcCBhZ2FpbiAqLworCW9tYXAtPmVoY2ktPmNhcHMgPSBoY2QtPnJlZ3M7CisJb21hcC0+ZWhjaV9iYXNlID0gaGNkLT5yZWdzOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKKwlvbWFwLT51aGhfYmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAoIW9tYXAtPnVoaF9iYXNlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVISCBpb3JlbWFwIGZhaWxlZFxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3VoaF9pb3JlbWFwOworCX0KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMik7CisJb21hcC0+dGxsX2Jhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFvbWFwLT50bGxfYmFzZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJUTEwgaW9yZW1hcCBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl90bGxfaW9yZW1hcDsKKwl9CisKKwlyZXQgPSBvbWFwX3N0YXJ0X2VoYyhvbWFwLCBoY2QpOworCWlmIChyZXQpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHN0YXJ0IGVoY2lcbiIpOworCQlnb3RvIGVycl9zdGFydDsKKwl9CisKKwlvbWFwLT5laGNpLT5yZWdzID0gaGNkLT5yZWdzCisJCSsgSENfTEVOR1RIKHJlYWRsKCZvbWFwLT5laGNpLT5jYXBzLT5oY19jYXBiYXNlKSk7CisKKwkvKiBjYWNoZSB0aGlzIHJlYWRvbmx5IGRhdGE7IG1pbmltaXplIGNoaXAgcmVhZHMgKi8KKwlvbWFwLT5laGNpLT5oY3NfcGFyYW1zID0gcmVhZGwoJm9tYXAtPmVoY2ktPmNhcHMtPmhjc19wYXJhbXMpOworCisJLyogU0VUIDEgbWljcm8tZnJhbWUgSW50ZXJydXB0IGludGVydmFsICovCisJd3JpdGVsKHJlYWRsKCZvbWFwLT5laGNpLT5yZWdzLT5jb21tYW5kKSB8ICgxIDw8IDE2KSwKKwkJCSZvbWFwLT5laGNpLT5yZWdzLT5jb21tYW5kKTsKKworCXJldCA9IHVzYl9hZGRfaGNkKGhjZCwgaXJxLCBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQpOworCWlmIChyZXQpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFkZCBoY2Qgd2l0aCBlcnIgJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX2FkZF9oY2Q7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9hZGRfaGNkOgorCW9tYXBfc3RvcF9laGMob21hcCwgaGNkKTsKKworZXJyX3N0YXJ0OgorCWlvdW5tYXAob21hcC0+dGxsX2Jhc2UpOworCitlcnJfdGxsX2lvcmVtYXA6CisJaW91bm1hcChvbWFwLT51aGhfYmFzZSk7CisKK2Vycl91aGhfaW9yZW1hcDoKKwlpb3VubWFwKGhjZC0+cmVncyk7CisKK2Vycl9pb3JlbWFwOgorCXVzYl9wdXRfaGNkKGhjZCk7CisKK2Vycl9jcmVhdGVfaGNkOgorCWtmcmVlKG9tYXApOworZXJyX2Rpc2FibGVkOgorZXJyX3BkYXRhOgorCXJldHVybiByZXQ7Cit9CisKKy8qIG1heSBiZSBjYWxsZWQgd2l0aG91dCBjb250cm9sbGVyIGVsZWN0cmljYWxseSBwcmVzZW50ICovCisvKiBtYXkgYmUgY2FsbGVkIHdpdGggY29udHJvbGxlciwgYnVzLCBhbmQgZGV2aWNlcyBhY3RpdmUgKi8KKworLyoqCisgKiBlaGNpX2hjZF9vbWFwX3JlbW92ZSAtIHNodXRkb3duIHByb2Nlc3NpbmcgZm9yIEVIQ0kgSENEcworICogQHBkZXY6IFVTQiBIb3N0IENvbnRyb2xsZXIgYmVpbmcgcmVtb3ZlZAorICoKKyAqIFJldmVyc2VzIHRoZSBlZmZlY3Qgb2YgdXNiX2VoY2lfaGNkX29tYXBfcHJvYmUoKSwgZmlyc3QgaW52b2tpbmcKKyAqIHRoZSBIQ0QncyBzdG9wKCkgbWV0aG9kLiAgSXQgaXMgYWx3YXlzIGNhbGxlZCBmcm9tIGEgdGhyZWFkCisgKiBjb250ZXh0LCBub3JtYWxseSAicm1tb2QiLCAiYXBtZCIsIG9yIHNvbWV0aGluZyBzaW1pbGFyLgorICovCitzdGF0aWMgaW50IGVoY2lfaGNkX29tYXBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGVoY2lfaGNkX29tYXAgKm9tYXAgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gZWhjaV90b19oY2Qob21hcC0+ZWhjaSk7CisKKwl1c2JfcmVtb3ZlX2hjZChoY2QpOworCW9tYXBfc3RvcF9laGMob21hcCwgaGNkKTsKKwlpb3VubWFwKGhjZC0+cmVncyk7CisJaW91bm1hcChvbWFwLT50bGxfYmFzZSk7CisJaW91bm1hcChvbWFwLT51aGhfYmFzZSk7CisJdXNiX3B1dF9oY2QoaGNkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlaGNpX2hjZF9vbWFwX3NodXRkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGVoY2lfaGNkX29tYXAgKm9tYXAgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gZWhjaV90b19oY2Qob21hcC0+ZWhjaSk7CisKKwlpZiAoaGNkLT5kcml2ZXItPnNodXRkb3duKQorCQloY2QtPmRyaXZlci0+c2h1dGRvd24oaGNkKTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZWhjaV9oY2Rfb21hcF9kcml2ZXIgPSB7CisJLnByb2JlCQkJPSBlaGNpX2hjZF9vbWFwX3Byb2JlLAorCS5yZW1vdmUJCQk9IGVoY2lfaGNkX29tYXBfcmVtb3ZlLAorCS5zaHV0ZG93bgkJPSBlaGNpX2hjZF9vbWFwX3NodXRkb3duLAorCS8qLnN1c3BlbmQJCT0gZWhjaV9oY2Rfb21hcF9zdXNwZW5kLCAqLworCS8qLnJlc3VtZQkJPSBlaGNpX2hjZF9vbWFwX3Jlc3VtZSwgKi8KKwkuZHJpdmVyID0geworCQkubmFtZQkJPSAiZWhjaS1vbWFwIiwKKwl9Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhjX2RyaXZlciBlaGNpX29tYXBfaGNfZHJpdmVyID0geworCS5kZXNjcmlwdGlvbgkJPSBoY2RfbmFtZSwKKwkucHJvZHVjdF9kZXNjCQk9ICJPTUFQLUVIQ0kgSG9zdCBDb250cm9sbGVyIiwKKwkuaGNkX3ByaXZfc2l6ZQkJPSBzaXplb2Yoc3RydWN0IGVoY2lfaGNkKSwKKworCS8qCisJICogZ2VuZXJpYyBoYXJkd2FyZSBsaW5rYWdlCisJICovCisJLmlycQkJCT0gZWhjaV9pcnEsCisJLmZsYWdzCQkJPSBIQ0RfTUVNT1JZIHwgSENEX1VTQjIsCisKKwkvKgorCSAqIGJhc2ljIGxpZmVjeWNsZSBvcGVyYXRpb25zCisJICovCisJLnJlc2V0CQkJPSBlaGNpX2luaXQsCisJLnN0YXJ0CQkJPSBlaGNpX3J1biwKKwkuc3RvcAkJCT0gZWhjaV9zdG9wLAorCS5zaHV0ZG93bgkJPSBlaGNpX3NodXRkb3duLAorCisJLyoKKwkgKiBtYW5hZ2luZyBpL28gcmVxdWVzdHMgYW5kIGFzc29jaWF0ZWQgZGV2aWNlIHJlc291cmNlcworCSAqLworCS51cmJfZW5xdWV1ZQkJPSBlaGNpX3VyYl9lbnF1ZXVlLAorCS51cmJfZGVxdWV1ZQkJPSBlaGNpX3VyYl9kZXF1ZXVlLAorCS5lbmRwb2ludF9kaXNhYmxlCT0gZWhjaV9lbmRwb2ludF9kaXNhYmxlLAorCS5lbmRwb2ludF9yZXNldAkJPSBlaGNpX2VuZHBvaW50X3Jlc2V0LAorCisJLyoKKwkgKiBzY2hlZHVsaW5nIHN1cHBvcnQKKwkgKi8KKwkuZ2V0X2ZyYW1lX251bWJlcgk9IGVoY2lfZ2V0X2ZyYW1lLAorCisJLyoKKwkgKiByb290IGh1YiBzdXBwb3J0CisJICovCisJLmh1Yl9zdGF0dXNfZGF0YQk9IGVoY2lfaHViX3N0YXR1c19kYXRhLAorCS5odWJfY29udHJvbAkJPSBlaGNpX2h1Yl9jb250cm9sLAorCS5idXNfc3VzcGVuZAkJPSBlaGNpX2J1c19zdXNwZW5kLAorCS5idXNfcmVzdW1lCQk9IGVoY2lfYnVzX3Jlc3VtZSwKKworCS5jbGVhcl90dF9idWZmZXJfY29tcGxldGUgPSBlaGNpX2NsZWFyX3R0X2J1ZmZlcl9jb21wbGV0ZSwKK307CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06b21hcC1laGNpIik7CitNT0RVTEVfQVVUSE9SKCJUZXhhcyBJbnN0cnVtZW50cywgSW5jLiIpOworTU9EVUxFX0FVVEhPUigiRmVsaXBlIEJhbGJpIDxmZWxpcGUuYmFsYmlAbm9raWEuY29tPiIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcS5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXEuYwppbmRleCAxMzlhMmNjLi5hNDI3ZDNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1xLmMKQEAgLTYxNiw5ICs2MTYsMTEgQEAKICkgewogCXN0cnVjdCBlaGNpX3F0ZAkJKnF0ZCwgKnF0ZF9wcmV2OwogCWRtYV9hZGRyX3QJCWJ1ZjsKLQlpbnQJCQlsZW4sIG1heHBhY2tldDsKKwlpbnQJCQlsZW4sIHRoaXNfc2dfbGVuLCBtYXhwYWNrZXQ7CiAJaW50CQkJaXNfaW5wdXQ7CiAJdTMyCQkJdG9rZW47CisJaW50CQkJaTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKnNnOwogCiAJLyoKIAkgKiBVUkJzIG1hcCB0byBzZXF1ZW5jZXMgb2YgUVREczogIG9uZSBsb2dpY2FsIHRyYW5zYWN0aW9uCkBAIC02NTksNyArNjYxLDIwIEBACiAJLyoKIAkgKiBkYXRhIHRyYW5zZmVyIHN0YWdlOiAgYnVmZmVyIHNldHVwCiAJICovCi0JYnVmID0gdXJiLT50cmFuc2Zlcl9kbWE7CisJaSA9IHVyYi0+bnVtX3NnczsKKwlpZiAobGVuID4gMCAmJiBpID4gMCkgeworCQlzZyA9IHVyYi0+c2ctPnNnOworCQlidWYgPSBzZ19kbWFfYWRkcmVzcyhzZyk7CisKKwkJLyogdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoIG1heSBiZSBzbWFsbGVyIHRoYW4gdGhlCisJCSAqIHNpemUgb2YgdGhlIHNjYXR0ZXJsaXN0IChvciB2aWNlIHZlcnNhKQorCQkgKi8KKwkJdGhpc19zZ19sZW4gPSBtaW5fdChpbnQsIHNnX2RtYV9sZW4oc2cpLCBsZW4pOworCX0gZWxzZSB7CisJCXNnID0gTlVMTDsKKwkJYnVmID0gdXJiLT50cmFuc2Zlcl9kbWE7CisJCXRoaXNfc2dfbGVuID0gbGVuOworCX0KIAogCWlmIChpc19pbnB1dCkKIAkJdG9rZW4gfD0gKDEgLyogImluIiAqLyA8PCA4KTsKQEAgLTY3NSw3ICs2OTAsOSBAQAogCWZvciAoOzspIHsKIAkJaW50IHRoaXNfcXRkX2xlbjsKIAotCQl0aGlzX3F0ZF9sZW4gPSBxdGRfZmlsbChlaGNpLCBxdGQsIGJ1ZiwgbGVuLCB0b2tlbiwgbWF4cGFja2V0KTsKKwkJdGhpc19xdGRfbGVuID0gcXRkX2ZpbGwoZWhjaSwgcXRkLCBidWYsIHRoaXNfc2dfbGVuLCB0b2tlbiwKKwkJCQltYXhwYWNrZXQpOworCQl0aGlzX3NnX2xlbiAtPSB0aGlzX3F0ZF9sZW47CiAJCWxlbiAtPSB0aGlzX3F0ZF9sZW47CiAJCWJ1ZiArPSB0aGlzX3F0ZF9sZW47CiAKQEAgLTY5MSw4ICs3MDgsMTMgQEAKIAkJaWYgKChtYXhwYWNrZXQgJiAodGhpc19xdGRfbGVuICsgKG1heHBhY2tldCAtIDEpKSkgPT0gMCkKIAkJCXRva2VuIF49IFFURF9UT0dHTEU7CiAKLQkJaWYgKGxpa2VseSAobGVuIDw9IDApKQotCQkJYnJlYWs7CisJCWlmIChsaWtlbHkodGhpc19zZ19sZW4gPD0gMCkpIHsKKwkJCWlmICgtLWkgPD0gMCB8fCBsZW4gPD0gMCkKKwkJCQlicmVhazsKKwkJCXNnID0gc2dfbmV4dChzZyk7CisJCQlidWYgPSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJCQl0aGlzX3NnX2xlbiA9IG1pbl90KGludCwgc2dfZG1hX2xlbihzZyksIGxlbik7CisJCX0KIAogCQlxdGRfcHJldiA9IHF0ZDsKIAkJcXRkID0gZWhjaV9xdGRfYWxsb2MgKGVoY2ksIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1zY2hlZC5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXNjaGVkLmMKaW5kZXggYTU1MzViNS4uMWUzOTFlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXNjaGVkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXNjaGVkLmMKQEAgLTEzODUsNyArMTM4NSw3IEBACiAgKiBnaXZlbiBFSENJX1RVTkVfRkxTIGFuZCB0aGUgc2xvcCkuICBPciwgd3JpdGUgYSBzbWFydGVyIHNjaGVkdWxlciEKICAqLwogCi0jZGVmaW5lIFNDSEVEVUxFX1NMT1AJMTAJLyogZnJhbWVzICovCisjZGVmaW5lIFNDSEVEVUxFX1NMT1AJODAJLyogbWljcm9mcmFtZXMgKi8KIAogc3RhdGljIGludAogaXNvX3N0cmVhbV9zY2hlZHVsZSAoCkBAIC0xMzk0LDEyICsxMzk0LDEzIEBACiAJc3RydWN0IGVoY2lfaXNvX3N0cmVhbQkqc3RyZWFtCiApCiB7Ci0JdTMyCQkJbm93LCBzdGFydCwgbWF4LCBwZXJpb2Q7CisJdTMyCQkJbm93LCBuZXh0LCBzdGFydCwgcGVyaW9kOwogCWludAkJCXN0YXR1czsKIAl1bnNpZ25lZAkJbW9kID0gZWhjaS0+cGVyaW9kaWNfc2l6ZSA8PCAzOwogCXN0cnVjdCBlaGNpX2lzb19zY2hlZAkqc2NoZWQgPSB1cmItPmhjcHJpdjsKKwlzdHJ1Y3QgcGNpX2RldgkJKnBkZXY7CiAKLQlpZiAoc2NoZWQtPnNwYW4gPiAobW9kIC0gOCAqIFNDSEVEVUxFX1NMT1ApKSB7CisJaWYgKHNjaGVkLT5zcGFuID4gKG1vZCAtIFNDSEVEVUxFX1NMT1ApKSB7CiAJCWVoY2lfZGJnIChlaGNpLCAiaXNvIHJlcXVlc3QgJXAgdG9vIGxvbmdcbiIsIHVyYik7CiAJCXN0YXR1cyA9IC1FRkJJRzsKIAkJZ290byBmYWlsOwpAQCAtMTQxOCwyNiArMTQxOSwzNSBAQAogCiAJbm93ID0gZWhjaV9yZWFkbChlaGNpLCAmZWhjaS0+cmVncy0+ZnJhbWVfaW5kZXgpICUgbW9kOwogCi0JLyogd2hlbidzIHRoZSBsYXN0IHVmcmFtZSB0aGlzIHVyYiBjb3VsZCBzdGFydD8gKi8KLQltYXggPSBub3cgKyBtb2Q7Ci0KIAkvKiBUeXBpY2FsIGNhc2U6IHJldXNlIGN1cnJlbnQgc2NoZWR1bGUsIHN0cmVhbSBpcyBzdGlsbCBhY3RpdmUuCiAJICogSG9wZWZ1bGx5IHRoZXJlIGFyZSBubyBnYXBzIGZyb20gdGhlIGhvc3QgZmFsbGluZyBiZWhpbmQKIAkgKiAoaXJxIGRlbGF5cyBldGMpLCBidXQgaWYgdGhlcmUgYXJlIHdlJ2xsIHRha2UgdGhlIG5leHQKIAkgKiBzbG90IGluIHRoZSBzY2hlZHVsZSwgaW1wbGljaXRseSBhc3N1bWluZyBVUkJfSVNPX0FTQVAuCiAJICovCiAJaWYgKGxpa2VseSAoIWxpc3RfZW1wdHkgKCZzdHJlYW0tPnRkX2xpc3QpKSkgeworCQlwZGV2ID0gdG9fcGNpX2RldihlaGNpX3RvX2hjZChlaGNpKS0+c2VsZi5jb250cm9sbGVyKTsKIAkJc3RhcnQgPSBzdHJlYW0tPm5leHRfdWZyYW1lOwotCQlpZiAoc3RhcnQgPCBub3cpCi0JCQlzdGFydCArPSBtb2Q7CisKKwkJLyogRm9yIGhpZ2ggc3BlZWQgZGV2aWNlcywgYWxsb3cgc2NoZWR1bGluZyB3aXRoaW4gdGhlCisJCSAqIGlzb2Nocm9ub3VzIHNjaGVkdWxpbmcgdGhyZXNob2xkLiAgRm9yIGZ1bGwgc3BlZWQgZGV2aWNlcywKKwkJICogZG9uJ3QuIChXb3JrIGFyb3VuZCBmb3IgSW50ZWwgSUNIOSBidWcuKQorCQkgKi8KKwkJaWYgKCFzdHJlYW0tPmhpZ2hzcGVlZCAmJgorCQkJCXBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0lOVEVMKQorCQkJbmV4dCA9IG5vdyArIGVoY2ktPmlfdGhyZXNoOworCQllbHNlCisJCQluZXh0ID0gbm93OwogCiAJCS8qIEZlbGwgYmVoaW5kIChieSB1cCB0byB0d2ljZSB0aGUgc2xvcCBhbW91bnQpPyAqLwotCQlpZiAoc3RhcnQgPj0gbWF4IC0gMiAqIDggKiBTQ0hFRFVMRV9TTE9QKQorCQlpZiAoKChzdGFydCAtIG5leHQpICYgKG1vZCAtIDEpKSA+PQorCQkJCW1vZCAtIDIgKiBTQ0hFRFVMRV9TTE9QKQogCQkJc3RhcnQgKz0gcGVyaW9kICogRElWX1JPVU5EX1VQKAotCQkJCQltYXggLSBzdGFydCwgcGVyaW9kKSAtIG1vZDsKKwkJCQkJKG5leHQgLSBzdGFydCkgJiAobW9kIC0gMSksCisJCQkJCXBlcmlvZCk7CiAKIAkJLyogVHJpZWQgdG8gc2NoZWR1bGUgdG9vIGZhciBpbnRvIHRoZSBmdXR1cmU/ICovCi0JCWlmICh1bmxpa2VseSgoc3RhcnQgKyBzY2hlZC0+c3BhbikgPj0gbWF4KSkgeworCQlpZiAodW5saWtlbHkoKChzdGFydCAtIG5vdykgJiAobW9kIC0gMSkpICsgc2NoZWQtPnNwYW4KKwkJCQkJPj0gbW9kIC0gMiAqIFNDSEVEVUxFX1NMT1ApKSB7CiAJCQlzdGF0dXMgPSAtRUZCSUc7CiAJCQlnb3RvIGZhaWw7CiAJCX0KQEAgLTE0NTEsNyArMTQ2MSw3IEBACiAJICogY2FuIGFsc28gaGVscCBoaWdoIGJhbmR3aWR0aCBpZiB0aGUgZG1hIGFuZCBpcnEgbG9hZHMgZG9uJ3QKIAkgKiBqdW1wIHVudGlsIGFmdGVyIHRoZSBxdWV1ZSBpcyBwcmltZWQuCiAJICovCi0Jc3RhcnQgPSBTQ0hFRFVMRV9TTE9QICogOCArIChub3cgJiB+MHgwNyk7CisJc3RhcnQgPSBTQ0hFRFVMRV9TTE9QICsgKG5vdyAmIH4weDA3KTsKIAlzdGFydCAlPSBtb2Q7CiAJc3RyZWFtLT5uZXh0X3VmcmFtZSA9IHN0YXJ0OwogCkBAIC0xNDgyLDcgKzE0OTIsNyBAQAogCS8qIG5vIHJvb20gaW4gdGhlIHNjaGVkdWxlICovCiAJZWhjaV9kYmcgKGVoY2ksICJpc28gJXNzY2hlZCBmdWxsICVwIChub3cgJWQgbWF4ICVkKVxuIiwKIAkJbGlzdF9lbXB0eSAoJnN0cmVhbS0+dGRfbGlzdCkgPyAiIiA6ICJyZSIsCi0JCXVyYiwgbm93LCBtYXgpOworCQl1cmIsIG5vdywgbm93ICsgbW9kKTsKIAlzdGF0dXMgPSAtRU5PU1BDOwogCiBmYWlsOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXhpbGlueC1vZi5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXhpbGlueC1vZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ODYxNTMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXhpbGlueC1vZi5jCkBAIC0wLDAgKzEsMzAwIEBACisvKgorICogRUhDSSBIQ0QgKEhvc3QgQ29udHJvbGxlciBEcml2ZXIpIGZvciBVU0IuCisgKgorICogQnVzIEdsdWUgZm9yIFhpbGlueCBFSENJIGNvcmUgb24gdGhlIG9mX3BsYXRmb3JtIGJ1cworICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBYaWxpbngsIEluYy4KKyAqCisgKiBCYXNlZCBvbiAiZWhjaS1wcGMtb2YuYyIgYnkgVmFsZW50aW5lIEJhcnNoYWsgPHZiYXJzaGFrQHJ1Lm12aXN0YS5jb20+CisgKiBhbmQgImVoY2ktcHBjLXNvYy5jIiBieSBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CisgKiBhbmQgIm9oY2ktcHBjLW9mLmMiIGJ5IFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCisgKiBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorCisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorCisvKioKKyAqIGVoY2lfeGlsaW54X29mX3NldHVwIC0gSW5pdGlhbGl6ZSB0aGUgZGV2aWNlIGZvciBlaGNpX3Jlc2V0KCkKKyAqIEBoY2Q6CVBvaW50ZXIgdG8gdGhlIHVzYl9oY2QgZGV2aWNlIHRvIHdoaWNoIHRoZSBob3N0IGNvbnRyb2xsZXIgYm91bmQKKyAqCisgKiBjYWxsZWQgZHVyaW5nIHByb2JlKCkgYWZ0ZXIgY2hpcCByZXNldCBjb21wbGV0ZXMuCisgKi8KK3N0YXRpYyBpbnQgZWhjaV94aWxpbnhfb2Zfc2V0dXAoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3QgZWhjaV9oY2QJKmVoY2kgPSBoY2RfdG9fZWhjaShoY2QpOworCWludAkJcmV0dmFsOworCisJcmV0dmFsID0gZWhjaV9oYWx0KGVoY2kpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR2YWwgPSBlaGNpX2luaXQoaGNkKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJZWhjaS0+c2JybiA9IDB4MjA7CisKKwlyZXR1cm4gZWhjaV9yZXNldChlaGNpKTsKK30KKworLyoqCisgKiBlaGNpX3hpbGlueF9wb3J0X2hhbmRlZF9vdmVyIC0gaGFuZCB0aGUgcG9ydCBvdXQgaWYgZmFpbGVkIHRvIGVuYWJsZSBpdAorICogQGhjZDoJUG9pbnRlciB0byB0aGUgdXNiX2hjZCBkZXZpY2UgdG8gd2hpY2ggdGhlIGhvc3QgY29udHJvbGxlciBib3VuZAorICogQHBvcnRudW06UG9ydCBudW1iZXIgdG8gd2hpY2ggdGhlIGRldmljZSBpcyBhdHRhY2hlZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYXMgYSBwbGFjZSB0byB0ZWxsIHRoZSB1c2VyIHRoYXQgdGhlIFhpbGlueCBVU0IgaG9zdAorICogY29udHJvbGxlciBkb2VzIHN1cHBvcnQgTFMgZGV2aWNlcy4gQW5kIGluIGFuIEhTIG9ubHkgY29uZmlndXJhdGlvbiwgaXQKKyAqIGRvZXMgbm90IHN1cHBvcnQgRlMgZGV2aWNlcyBlaXRoZXIuIEl0IGlzIGhvcGVkIHRoYXQgdGhpcyBjYW4gaGVscCBhCisgKiBjb25mdXNlZCB1c2VyLgorICoKKyAqIFRoZXJlIGFyZSBjYXNlcyB3aGVuIHRoZSBob3N0IGNvbnRyb2xsZXIgZmFpbHMgdG8gZW5hYmxlIHRoZSBwb3J0IGR1ZSB0bywKKyAqIGZvciBleGFtcGxlLCBpbnN1ZmZpY2llbnQgcG93ZXIgdGhhdCBjYW4gYmUgc3VwcGxpZWQgdG8gdGhlIGRldmljZSBmcm9tCisgKiB0aGUgVVNCIGJ1cy4gSW4gdGhvc2UgY2FzZXMsIHRoZSBtZXNzYWdlcyBwcmludGVkIGhlcmUgYXJlIG5vdCBoZWxwZnVsLgorICovCitzdGF0aWMgaW50IGVoY2lfeGlsaW54X3BvcnRfaGFuZGVkX292ZXIoc3RydWN0IHVzYl9oY2QgKmhjZCwgaW50IHBvcnRudW0pCit7CisJZGV2X3dhcm4oaGNkLT5zZWxmLmNvbnRyb2xsZXIsICJwb3J0ICVkIGNhbm5vdCBiZSBlbmFibGVkXG4iLCBwb3J0bnVtKTsKKwlpZiAoaGNkLT5oYXNfdHQpIHsKKwkJZGV2X3dhcm4oaGNkLT5zZWxmLmNvbnRyb2xsZXIsCisJCQkiTWF5YmUgeW91IGhhdmUgY29ubmVjdGVkIGEgbG93IHNwZWVkIGRldmljZT9cbiIpOworCisJCWRldl93YXJuKGhjZC0+c2VsZi5jb250cm9sbGVyLAorCQkJIldlIGRvIG5vdCBzdXBwb3J0IGxvdyBzcGVlZCBkZXZpY2VzXG4iKTsKKwl9IGVsc2UgeworCQlkZXZfd2FybihoY2QtPnNlbGYuY29udHJvbGxlciwKKwkJCSJNYXliZSB5b3VyIGRldmljZSBpcyBub3QgYSBoaWdoIHNwZWVkIGRldmljZT9cbiIpOworCQlkZXZfd2FybihoY2QtPnNlbGYuY29udHJvbGxlciwKKwkJCSJUaGUgVVNCIGhvc3QgY29udHJvbGxlciBkb2VzIG5vdCBzdXBwb3J0IGZ1bGwgc3BlZWQgIgorCQkJIm5vciBsb3cgc3BlZWQgZGV2aWNlc1xuIik7CisJCWRldl93YXJuKGhjZC0+c2VsZi5jb250cm9sbGVyLAorCQkJIllvdSBjYW4gcmVjb25maWd1cmUgdGhlIGhvc3QgY29udHJvbGxlciB0byBoYXZlICIKKwkJCSJmdWxsIHNwZWVkIHN1cHBvcnRcbiIpOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGNfZHJpdmVyIGVoY2lfeGlsaW54X29mX2hjX2RyaXZlciA9IHsKKwkuZGVzY3JpcHRpb24JCT0gaGNkX25hbWUsCisJLnByb2R1Y3RfZGVzYwkJPSAiT0YgRUhDSSIsCisJLmhjZF9wcml2X3NpemUJCT0gc2l6ZW9mKHN0cnVjdCBlaGNpX2hjZCksCisKKwkvKgorCSAqIGdlbmVyaWMgaGFyZHdhcmUgbGlua2FnZQorCSAqLworCS5pcnEJCQk9IGVoY2lfaXJxLAorCS5mbGFncwkJCT0gSENEX01FTU9SWSB8IEhDRF9VU0IyLAorCisJLyoKKwkgKiBiYXNpYyBsaWZlY3ljbGUgb3BlcmF0aW9ucworCSAqLworCS5yZXNldAkJCT0gZWhjaV94aWxpbnhfb2Zfc2V0dXAsCisJLnN0YXJ0CQkJPSBlaGNpX3J1biwKKwkuc3RvcAkJCT0gZWhjaV9zdG9wLAorCS5zaHV0ZG93bgkJPSBlaGNpX3NodXRkb3duLAorCisJLyoKKwkgKiBtYW5hZ2luZyBpL28gcmVxdWVzdHMgYW5kIGFzc29jaWF0ZWQgZGV2aWNlIHJlc291cmNlcworCSAqLworCS51cmJfZW5xdWV1ZQkJPSBlaGNpX3VyYl9lbnF1ZXVlLAorCS51cmJfZGVxdWV1ZQkJPSBlaGNpX3VyYl9kZXF1ZXVlLAorCS5lbmRwb2ludF9kaXNhYmxlCT0gZWhjaV9lbmRwb2ludF9kaXNhYmxlLAorCisJLyoKKwkgKiBzY2hlZHVsaW5nIHN1cHBvcnQKKwkgKi8KKwkuZ2V0X2ZyYW1lX251bWJlcgk9IGVoY2lfZ2V0X2ZyYW1lLAorCisJLyoKKwkgKiByb290IGh1YiBzdXBwb3J0CisJICovCisJLmh1Yl9zdGF0dXNfZGF0YQk9IGVoY2lfaHViX3N0YXR1c19kYXRhLAorCS5odWJfY29udHJvbAkJPSBlaGNpX2h1Yl9jb250cm9sLAorI2lmZGVmCUNPTkZJR19QTQorCS5idXNfc3VzcGVuZAkJPSBlaGNpX2J1c19zdXNwZW5kLAorCS5idXNfcmVzdW1lCQk9IGVoY2lfYnVzX3Jlc3VtZSwKKyNlbmRpZgorCS5yZWxpbnF1aXNoX3BvcnQJPSBOVUxMLAorCS5wb3J0X2hhbmRlZF9vdmVyCT0gZWhjaV94aWxpbnhfcG9ydF9oYW5kZWRfb3ZlciwKKworCS5jbGVhcl90dF9idWZmZXJfY29tcGxldGUgPSBlaGNpX2NsZWFyX3R0X2J1ZmZlcl9jb21wbGV0ZSwKK307CisKKy8qKgorICogZWhjaV9oY2RfeGlsaW54X29mX3Byb2JlIC0gUHJvYmUgbWV0aG9kIGZvciB0aGUgVVNCIGhvc3QgY29udHJvbGxlcgorICogQG9wOgkJcG9pbnRlciB0byB0aGUgb2ZfZGV2aWNlIHRvIHdoaWNoIHRoZSBob3N0IGNvbnRyb2xsZXIgYm91bmQKKyAqIEBtYXRjaDoJcG9pbnRlciB0byBvZl9kZXZpY2VfaWQgc3RydWN0dXJlLCBub3QgdXNlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVxdWVzdHMgcmVzb3VyY2VzIGFuZCBzZXRzIHVwIGFwcHJvcHJpYXRlIHByb3BlcnRpZXMgZm9yIHRoZQorICogaG9zdCBjb250cm9sbGVyLiBCZWNhdXNlIHRoZSBYaWxpbnggVVNCIGhvc3QgY29udHJvbGxlciBjYW4gYmUgY29uZmlndXJlZAorICogYXMgSFMgb25seSBvciBIUy9GUyBvbmx5LCBpdCBjaGVja3MgdGhlIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGRldmljZSB0cmVlCisgKiBlbnRyeSwgYW5kIHNldHMgYW4gYXBwcm9wcmlhdGUgdmFsdWUgZm9yIGhjZC0+aGFzX3R0LgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdAorZWhjaV9oY2RfeGlsaW54X29mX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gb3AtPm5vZGU7CisJc3RydWN0IHVzYl9oY2QgKmhjZDsKKwlzdHJ1Y3QgZWhjaV9oY2QJKmVoY2k7CisJc3RydWN0IHJlc291cmNlIHJlczsKKwlpbnQgaXJxOworCWludCBydjsKKwlpbnQgKnZhbHVlOworCisJaWYgKHVzYl9kaXNhYmxlZCgpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRldl9kYmcoJm9wLT5kZXYsICJpbml0aWFsaXppbmcgWElMSU5YLU9GIFVTQiBDb250cm9sbGVyXG4iKTsKKworCXJ2ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShkbiwgMCwgJnJlcyk7CisJaWYgKHJ2KQorCQlyZXR1cm4gcnY7CisKKwloY2QgPSB1c2JfY3JlYXRlX2hjZCgmZWhjaV94aWxpbnhfb2ZfaGNfZHJpdmVyLCAmb3AtPmRldiwKKwkJCQkiWElMSU5YLU9GIFVTQiIpOworCWlmICghaGNkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWhjZC0+cnNyY19zdGFydCA9IHJlcy5zdGFydDsKKwloY2QtPnJzcmNfbGVuID0gcmVzLmVuZCAtIHJlcy5zdGFydCArIDE7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihoY2QtPnJzcmNfc3RhcnQsIGhjZC0+cnNyY19sZW4sIGhjZF9uYW1lKSkgeworCQlwcmludGsoS0VSTl9FUlIgX19GSUxFX18gIjogcmVxdWVzdF9tZW1fcmVnaW9uIGZhaWxlZFxuIik7CisJCXJ2ID0gLUVCVVNZOworCQlnb3RvIGVycl9ybXI7CisJfQorCisJaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoZG4sIDApOworCWlmIChpcnEgPT0gTk9fSVJRKSB7CisJCXByaW50ayhLRVJOX0VSUiBfX0ZJTEVfXyAiOiBpcnFfb2ZfcGFyc2VfYW5kX21hcCBmYWlsZWRcbiIpOworCQlydiA9IC1FQlVTWTsKKwkJZ290byBlcnJfaXJxOworCX0KKworCWhjZC0+cmVncyA9IGlvcmVtYXAoaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuKTsKKwlpZiAoIWhjZC0+cmVncykgeworCQlwcmludGsoS0VSTl9FUlIgX19GSUxFX18gIjogaW9yZW1hcCBmYWlsZWRcbiIpOworCQlydiA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2lvcmVtYXA7CisJfQorCisJZWhjaSA9IGhjZF90b19laGNpKGhjZCk7CisKKwkvKiBUaGlzIGNvcmUgYWx3YXlzIGhhcyBiaWctZW5kaWFuIHJlZ2lzdGVyIGludGVyZmFjZSBhbmQgdXNlcworCSAqIGJpZy1lbmRpYW4gbWVtb3J5IGRlc2NyaXB0b3JzLgorCSAqLworCWVoY2ktPmJpZ19lbmRpYW5fbW1pbyA9IDE7CisJZWhjaS0+YmlnX2VuZGlhbl9kZXNjID0gMTsKKworCS8qIENoZWNrIHdoZXRoZXIgdGhlIEZTIHN1cHBvcnQgb3B0aW9uIGlzIHNlbGVjdGVkIGluIHRoZSBoYXJkd2FyZS4KKwkgKi8KKwl2YWx1ZSA9IChpbnQgKilvZl9nZXRfcHJvcGVydHkoZG4sICJ4bG54LHN1cHBvcnQtdXNiLWZzIiwgTlVMTCk7CisJaWYgKHZhbHVlICYmICgqdmFsdWUgPT0gMSkpIHsKKwkJZWhjaV9kYmcoZWhjaSwgIlVTQiBob3N0IGNvbnRyb2xsZXIgc3VwcG9ydHMgRlMgZGV2aWNlc1xuIik7CisJCWhjZC0+aGFzX3R0ID0gMTsKKwl9IGVsc2UgeworCQllaGNpX2RiZyhlaGNpLAorCQkJIlVTQiBob3N0IGNvbnRyb2xsZXIgaXMgSFMgb25seVxuIik7CisJCWhjZC0+aGFzX3R0ID0gMDsKKwl9CisKKwkvKiBEZWJ1ZyByZWdpc3RlcnMgYXJlIGF0IHRoZSBmaXJzdCAweDEwMCByZWdpb24KKwkgKi8KKwllaGNpLT5jYXBzID0gaGNkLT5yZWdzICsgMHgxMDA7CisJZWhjaS0+cmVncyA9IGhjZC0+cmVncyArIDB4MTAwICsKKwkJCUhDX0xFTkdUSChlaGNpX3JlYWRsKGVoY2ksICZlaGNpLT5jYXBzLT5oY19jYXBiYXNlKSk7CisKKwkvKiBjYWNoZSB0aGlzIHJlYWRvbmx5IGRhdGE7IG1pbmltaXplIGNoaXAgcmVhZHMgKi8KKwllaGNpLT5oY3NfcGFyYW1zID0gZWhjaV9yZWFkbChlaGNpLCAmZWhjaS0+Y2Fwcy0+aGNzX3BhcmFtcyk7CisKKwlydiA9IHVzYl9hZGRfaGNkKGhjZCwgaXJxLCAwKTsKKwlpZiAocnYgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpb3VubWFwKGhjZC0+cmVncyk7CisKK2Vycl9pb3JlbWFwOgorZXJyX2lycToKKwlyZWxlYXNlX21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuKTsKK2Vycl9ybXI6CisJdXNiX3B1dF9oY2QoaGNkKTsKKworCXJldHVybiBydjsKK30KKworLyoqCisgKiBlaGNpX2hjZF94aWxpbnhfb2ZfcmVtb3ZlIC0gc2h1dGRvd24gaGNkIGFuZCByZWxlYXNlIHJlc291cmNlcworICogQG9wOgkJcG9pbnRlciB0byBvZl9kZXZpY2Ugc3RydWN0dXJlIHRoYXQgaXMgdG8gYmUgcmVtb3ZlZAorICoKKyAqIFJlbW92ZSB0aGUgaGNkIHN0cnVjdHVyZSwgYW5kIHJlbGVhc2UgcmVzb3VyY2VzIHRoYXQgaGFzIGJlZW4gcmVxdWVzdGVkCisgKiBkdXJpbmcgcHJvYmUuCisgKi8KK3N0YXRpYyBpbnQgZWhjaV9oY2RfeGlsaW54X29mX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCkKK3sKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gZGV2X2dldF9kcnZkYXRhKCZvcC0+ZGV2KTsKKwlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIE5VTEwpOworCisJZGV2X2RiZygmb3AtPmRldiwgInN0b3BwaW5nIFhJTElOWC1PRiBVU0IgQ29udHJvbGxlclxuIik7CisKKwl1c2JfcmVtb3ZlX2hjZChoY2QpOworCisJaW91bm1hcChoY2QtPnJlZ3MpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihoY2QtPnJzcmNfc3RhcnQsIGhjZC0+cnNyY19sZW4pOworCisJdXNiX3B1dF9oY2QoaGNkKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGVoY2lfaGNkX3hpbGlueF9vZl9zaHV0ZG93biAtIHNodXRkb3duIHRoZSBoY2QKKyAqIEBvcDoJCXBvaW50ZXIgdG8gb2ZfZGV2aWNlIHN0cnVjdHVyZSB0aGF0IGlzIHRvIGJlIHJlbW92ZWQKKyAqCisgKiBQcm9wZXJseSBzaHV0ZG93biB0aGUgaGNkLCBjYWxsIGRyaXZlcidzIHNodXRkb3duIHJvdXRpbmUuCisgKi8KK3N0YXRpYyBpbnQgZWhjaV9oY2RfeGlsaW54X29mX3NodXRkb3duKHN0cnVjdCBvZl9kZXZpY2UgKm9wKQoreworCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBkZXZfZ2V0X2RydmRhdGEoJm9wLT5kZXYpOworCisJaWYgKGhjZC0+ZHJpdmVyLT5zaHV0ZG93bikKKwkJaGNkLT5kcml2ZXItPnNodXRkb3duKGhjZCk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBlaGNpX2hjZF94aWxpbnhfb2ZfbWF0Y2hbXSA9IHsKKwkJey5jb21wYXRpYmxlID0gInhsbngseHBzLXVzYi1ob3N0LTEuMDAuYSIsfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBlaGNpX2hjZF94aWxpbnhfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBlaGNpX2hjZF94aWxpbnhfb2ZfZHJpdmVyID0geworCS5uYW1lCQk9ICJ4aWxpbngtb2YtZWhjaSIsCisJLm1hdGNoX3RhYmxlCT0gZWhjaV9oY2RfeGlsaW54X29mX21hdGNoLAorCS5wcm9iZQkJPSBlaGNpX2hjZF94aWxpbnhfb2ZfcHJvYmUsCisJLnJlbW92ZQkJPSBlaGNpX2hjZF94aWxpbnhfb2ZfcmVtb3ZlLAorCS5zaHV0ZG93bgk9IGVoY2lfaGNkX3hpbGlueF9vZl9zaHV0ZG93biwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAieGlsaW54LW9mLWVoY2kiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTM2Mi5oIGIvZHJpdmVycy91c2IvaG9zdC9pc3AxMzYyLmgKaW5kZXggMWEyNTNlYi4uNTE1MTUxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9pc3AxMzYyLmgKKysrIGIvZHJpdmVycy91c2IvaG9zdC9pc3AxMzYyLmgKQEAgLTUzNCw4ICs1MzQsOCBAQAogCiAJLyogcGVyaW9kaWMgc2NoZWR1bGU6IGlzb2Nocm9ub3VzICovCiAJc3RydWN0IGxpc3RfaGVhZAlpc29jOwotCWludAkJCWlzdGxfZmxpcDoxOwotCWludAkJCWlycV9hY3RpdmU6MTsKKwl1bnNpZ25lZCBpbnQJCWlzdGxfZmxpcDoxOworCXVuc2lnbmVkIGludAkJaXJxX2FjdGl2ZToxOwogCiAJLyogU2NoZWR1bGVzIGZvciB0aGUgY3VycmVudCBmcmFtZSAqLwogCXN0cnVjdCBpc3AxMzYyX2VwX3F1ZXVlIGF0bF9xdWV1ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1hdDkxLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktYXQ5MS5jCmluZGV4IDdjY2ZmY2IuLjY4YjgzYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1hdDkxLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWF0OTEuYwpAQCAtMzUsNyArMzUsNyBAQAogCiBzdGF0aWMgdm9pZCBhdDkxX3N0YXJ0X2Nsb2NrKHZvaWQpCiB7Ci0JaWYgKGNwdV9pc19hdDkxc2FtOTI2MSgpKQorCWlmIChjcHVfaXNfYXQ5MXNhbTkyNjEoKSB8fCBjcHVfaXNfYXQ5MXNhbTlnMTAoKSkKIAkJY2xrX2VuYWJsZShoY2xrKTsKIAljbGtfZW5hYmxlKGljbGspOwogCWNsa19lbmFibGUoZmNsayk7CkBAIC00Niw3ICs0Niw3IEBACiB7CiAJY2xrX2Rpc2FibGUoZmNsayk7CiAJY2xrX2Rpc2FibGUoaWNsayk7Ci0JaWYgKGNwdV9pc19hdDkxc2FtOTI2MSgpKQorCWlmIChjcHVfaXNfYXQ5MXNhbTkyNjEoKSB8fCBjcHVfaXNfYXQ5MXNhbTlnMTAoKSkKIAkJY2xrX2Rpc2FibGUoaGNsayk7CiAJY2xvY2tlZCA9IDA7CiB9CkBAIC0xNDIsNyArMTQyLDcgQEAKIAogCWljbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJvaGNpX2NsayIpOwogCWZjbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJ1aHBjayIpOwotCWlmIChjcHVfaXNfYXQ5MXNhbTkyNjEoKSkKKwlpZiAoY3B1X2lzX2F0OTFzYW05MjYxKCkgfHwgY3B1X2lzX2F0OTFzYW05ZzEwKCkpCiAJCWhjbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJoY2swIik7CiAKIAlhdDkxX3N0YXJ0X2hjKHBkZXYpOwpAQCAtMTU1LDcgKzE1NSw3IEBACiAJLyogRXJyb3IgaGFuZGxpbmcgKi8KIAlhdDkxX3N0b3BfaGMocGRldik7CiAKLQlpZiAoY3B1X2lzX2F0OTFzYW05MjYxKCkpCisJaWYgKGNwdV9pc19hdDkxc2FtOTI2MSgpIHx8IGNwdV9pc19hdDkxc2FtOWcxMCgpKQogCQljbGtfcHV0KGhjbGspOwogCWNsa19wdXQoZmNsayk7CiAJY2xrX3B1dChpY2xrKTsKQEAgLTE5Miw3ICsxOTIsNyBAQAogCXJlbGVhc2VfbWVtX3JlZ2lvbihoY2QtPnJzcmNfc3RhcnQsIGhjZC0+cnNyY19sZW4pOwogCXVzYl9wdXRfaGNkKGhjZCk7CiAKLQlpZiAoY3B1X2lzX2F0OTFzYW05MjYxKCkpCisJaWYgKGNwdV9pc19hdDkxc2FtOTI2MSgpIHx8IGNwdV9pc19hdDkxc2FtOWcxMCgpKQogCQljbGtfcHV0KGhjbGspOwogCWNsa19wdXQoZmNsayk7CiAJY2xrX3B1dChpY2xrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wbng0MDA4LmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcG54NDAwOC5jCmluZGV4IDEwMGJmM2QuLjI3NjkzMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wbng0MDA4LmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBueDQwMDguYwpAQCAtOTgsOCArOTgsOCBAQAogI2RlZmluZSBJU1AxMzAxX0kyQ19JTlRFUlJVUFRfUklTSU5HIDB4RQogI2RlZmluZSBJU1AxMzAxX0kyQ19SRUdfQ0xFQVJfQUREUiAxCiAKLXN0cnVjdCBpMmNfZHJpdmVyIGlzcDEzMDFfZHJpdmVyOwotc3RydWN0IGkyY19jbGllbnQgKmlzcDEzMDFfaTJjX2NsaWVudDsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpc3AxMzAxX2RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCAqaXNwMTMwMV9pMmNfY2xpZW50OwogCiBleHRlcm4gaW50IHVzYl9kaXNhYmxlZCh2b2lkKTsKIGV4dGVybiBpbnQgb2NwaV9lbmFibGUodm9pZCk7CkBAIC0xMjAsMTIgKzEyMCwxMiBAQAogCXJldHVybiAwOwogfQogCi1jb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBpc3AxMzAxX2lkW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgaXNwMTMwMV9pZFtdID0gewogCXsgImlzcDEzMDFfcG54IiwgMCB9LAogCXsgfQogfTsKIAotc3RydWN0IGkyY19kcml2ZXIgaXNwMTMwMV9kcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaXNwMTMwMV9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAiaXNwMTMwMV9wbngiLAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3I4YTY2NTk3LWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9yOGE2NjU5Ny1oY2QuYwppbmRleCBlMzNkMzYyLi40MWRiYzcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3I4YTY2NTk3LWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvcjhhNjY1OTctaGNkLmMKQEAgLTgyMiw4ICs4MjIsNiBAQAogCQlyZXR1cm47CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodGQsIG5leHQsIGxpc3QsIHF1ZXVlKSB7Ci0JCWlmICghdGQpCi0JCQljb250aW51ZTsKIAkJaWYgKHRkLT5hZGRyZXNzICE9IGFkZHJlc3MpCiAJCQljb250aW51ZTsKIApAQCAtMjAyNSw4ICsyMDIzLDYgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0ID0gJnI4YTY2NTk3LT5jaGlsZF9kZXZpY2U7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgbGlzdCwgZGV2aWNlX2xpc3QpIHsKLQkJaWYgKCFkZXYpCi0JCQljb250aW51ZTsKIAkJaWYgKGRldi0+dXNiX2FkZHJlc3MgIT0gYWRkcikKIAkJCWNvbnRpbnVlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3doY2kvZGVidWcuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9kZWJ1Zy5jCmluZGV4IDIyNzNjODEuLjhjMWM2MTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9kZWJ1Zy5jCkBAIC0zMSwxNyArMzEsMjkgQEAKIAogdm9pZCBxc2V0X3ByaW50KHN0cnVjdCBzZXFfZmlsZSAqcywgc3RydWN0IHdoY19xc2V0ICpxc2V0KQogeworCXN0YXRpYyBjb25zdCBjaGFyICpxaF90eXBlW10gPSB7CisJCSJjdHJsIiwgImlzb2MiLCAiYnVsayIsICJpbnRyIiwgInJzdmQiLCAicnN2ZCIsICJyc3ZkIiwgImxwaW50ciIsIH07CiAJc3RydWN0IHdoY19zdGQgKnN0ZDsKIAlzdHJ1Y3QgdXJiICp1cmIgPSBOVUxMOwogCWludCBpOwogCi0Jc2VxX3ByaW50ZihzLCAicXNldCAlMDh4XG4iLCAodTMyKXFzZXQtPnFzZXRfZG1hKTsKKwlzZXFfcHJpbnRmKHMsICJxc2V0ICUwOHgiLCAodTMyKXFzZXQtPnFzZXRfZG1hKTsKKwlpZiAoJnFzZXQtPmxpc3Rfbm9kZSA9PSBxc2V0LT53aGMtPmFzeW5jX2xpc3QucHJldikgeworCQlzZXFfcHJpbnRmKHMsICIgKGR1bW15KVxuIik7CisJfSBlbHNlIHsKKwkJc2VxX3ByaW50ZihzLCAiIGVwJWQlcy0lcyBtYXhwa3Q6ICVkXG4iLAorCQkJICAgcXNldC0+cWguaW5mbzEgJiAweDBmLAorCQkJICAgKHFzZXQtPnFoLmluZm8xID4+IDQpICYgMHgxID8gImluIiA6ICJvdXQiLAorCQkJICAgcWhfdHlwZVsocXNldC0+cWguaW5mbzEgPj4gNSkgJiAweDddLAorCQkJICAgKHFzZXQtPnFoLmluZm8xID4+IDE2KSAmIDB4ZmZmZik7CisJfQogCXNlcV9wcmludGYocywgIiAgLT4gJTA4eFxuIiwgKHUzMilxc2V0LT5xaC5saW5rKTsKIAlzZXFfcHJpbnRmKHMsICIgIGluZm86ICUwOHggJTA4eCAlMDh4XG4iLAotCQlxc2V0LT5xaC5pbmZvMSwgcXNldC0+cWguaW5mbzIsICBxc2V0LT5xaC5pbmZvMyk7Ci0Jc2VxX3ByaW50ZihzLCAiICBzdHM6ICUwNHggZXJyczogJWRcbiIsIHFzZXQtPnFoLnN0YXR1cywgcXNldC0+cWguZXJyX2NvdW50KTsKKwkJICAgcXNldC0+cWguaW5mbzEsIHFzZXQtPnFoLmluZm8yLCAgcXNldC0+cWguaW5mbzMpOworCXNlcV9wcmludGYocywgIiAgc3RzOiAlMDR4IGVycnM6ICVkIGN1cndpbjogJTA4eFxuIiwKKwkJICAgcXNldC0+cWguc3RhdHVzLCBxc2V0LT5xaC5lcnJfY291bnQsIHFzZXQtPnFoLmN1cl93aW5kb3cpOwogCXNlcV9wcmludGYocywgIiAgVEQ6IHN0czogJTA4eCBvcHRzOiAlMDh4XG4iLAotCQlxc2V0LT5xaC5vdmVybGF5LnF0ZC5zdGF0dXMsIHFzZXQtPnFoLm92ZXJsYXkucXRkLm9wdGlvbnMpOworCQkgICBxc2V0LT5xaC5vdmVybGF5LnF0ZC5zdGF0dXMsIHFzZXQtPnFoLm92ZXJsYXkucXRkLm9wdGlvbnMpOwogCiAJZm9yIChpID0gMDsgaSA8IFdIQ0lfUVNFVF9URF9NQVg7IGkrKykgewogCQlzZXFfcHJpbnRmKHMsICIgICVjJWMgVERbJWRdOiBzdHM6ICUwOHggb3B0czogJTA4eCBwdHI6ICUwOHhcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3doY2kvaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3doY2kvaGNkLmMKaW5kZXggNjg3YjYyMi4uZTBkMzQwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC93aGNpL2hjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9oY2QuYwpAQCAtMjUwLDYgKzI1MCw3IEBACiAJfQogCiAJdXNiX2hjZC0+d2lyZWxlc3MgPSAxOworCXVzYl9oY2QtPnNlbGYuc2dfdGFibGVzaXplID0gMjA0ODsgLyogc29tZXdoYXQgYXJiaXRyYXJ5ICovCiAKIAl3dXNiaGMgPSB1c2JfaGNkX3RvX3d1c2JoYyh1c2JfaGNkKTsKIAl3aGMgPSB3dXNiaGNfdG9fd2hjKHd1c2JoYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3doY2kvcXNldC5jIGIvZHJpdmVycy91c2IvaG9zdC93aGNpL3FzZXQuYwppbmRleCAxYjlkYzE1Li43ZDQyMDRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3doY2kvcXNldC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9xc2V0LmMKQEAgLTQ5LDE2ICs0OSwxOSBAQAogICogICAgICAgIHN0YXRlCiAgKiBAdXJiOiAgYW4gdXJiIGZvciBhIHRyYW5zZmVyIHRvIHRoaXMgZW5kcG9pbnQKICAqLwotc3RhdGljIHZvaWQgcXNldF9maWxsX3FoKHN0cnVjdCB3aGNfcXNldCAqcXNldCwgc3RydWN0IHVyYiAqdXJiKQorc3RhdGljIHZvaWQgcXNldF9maWxsX3FoKHN0cnVjdCB3aGMgKndoYywgc3RydWN0IHdoY19xc2V0ICpxc2V0LCBzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSB1cmItPmRldjsKKwlzdHJ1Y3Qgd3VzYl9kZXYgKnd1c2JfZGV2ID0gdXNiX2Rldi0+d3VzYl9kZXY7CiAJc3RydWN0IHVzYl93aXJlbGVzc19lcF9jb21wX2Rlc2NyaXB0b3IgKmVwY2Q7CiAJYm9vbCBpc19vdXQ7CisJdWludDhfdCBwaHlfcmF0ZTsKIAogCWlzX291dCA9IHVzYl9waXBlb3V0KHVyYi0+cGlwZSk7CiAKLQllcGNkID0gKHN0cnVjdCB1c2Jfd2lyZWxlc3NfZXBfY29tcF9kZXNjcmlwdG9yICopcXNldC0+ZXAtPmV4dHJhOworCXFzZXQtPm1heF9wYWNrZXQgPSBsZTE2X3RvX2NwdSh1cmItPmVwLT5kZXNjLndNYXhQYWNrZXRTaXplKTsKIAorCWVwY2QgPSAoc3RydWN0IHVzYl93aXJlbGVzc19lcF9jb21wX2Rlc2NyaXB0b3IgKilxc2V0LT5lcC0+ZXh0cmE7CiAJaWYgKGVwY2QpIHsKIAkJcXNldC0+bWF4X3NlcSA9IGVwY2QtPmJNYXhTZXF1ZW5jZTsKIAkJcXNldC0+bWF4X2J1cnN0ID0gZXBjZC0+Yk1heEJ1cnN0OwpAQCAtNjcsMTIgKzcwLDI4IEBACiAJCXFzZXQtPm1heF9idXJzdCA9IDE7CiAJfQogCisJLyoKKwkgKiBJbml0aWFsIFBIWSByYXRlIGlzIDUzLjMgTWJpdC9zIGZvciBjb250cm9sIGVuZHBvaW50cyBvcgorCSAqIHRoZSBtYXhpbXVtIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlIGZvciBvdGhlciBlbmRwb2ludHMKKwkgKiAodW5sZXNzIGxpbWl0ZWQgYnkgdGhlIHVzZXIpLgorCSAqLworCWlmICh1c2JfcGlwZWNvbnRyb2wodXJiLT5waXBlKSkKKwkJcGh5X3JhdGUgPSBVV0JfUEhZX1JBVEVfNTM7CisJZWxzZSB7CisJCXVpbnQxNl90IHBoeV9yYXRlczsKKworCQlwaHlfcmF0ZXMgPSBsZTE2X3RvX2NwdSh3dXNiX2Rldi0+d3VzYl9jYXBfZGVzY3ItPndQSFlSYXRlcyk7CisJCXBoeV9yYXRlID0gZmxzKHBoeV9yYXRlcykgLSAxOworCQlpZiAocGh5X3JhdGUgPiB3aGMtPnd1c2JoYy5waHlfcmF0ZSkKKwkJCXBoeV9yYXRlID0gd2hjLT53dXNiaGMucGh5X3JhdGU7CisJfQorCiAJcXNldC0+cWguaW5mbzEgPSBjcHVfdG9fbGUzMigKIAkJUUhfSU5GTzFfRVAodXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpKQogCQl8IChpc19vdXQgPyBRSF9JTkZPMV9ESVJfT1VUIDogUUhfSU5GTzFfRElSX0lOKQogCQl8IHVzYl9waXBlX3RvX3FoX3R5cGUodXJiLT5waXBlKQogCQl8IFFIX0lORk8xX0RFVl9JTkZPX0lEWCh3dXNiX3BvcnRfbm9fdG9faWR4KHVzYl9kZXYtPnBvcnRudW0pKQotCQl8IFFIX0lORk8xX01BWF9QS1RfTEVOKHVzYl9tYXhwYWNrZXQodXJiLT5kZXYsIHVyYi0+cGlwZSwgaXNfb3V0KSkKKwkJfCBRSF9JTkZPMV9NQVhfUEtUX0xFTihxc2V0LT5tYXhfcGFja2V0KQogCQkpOwogCXFzZXQtPnFoLmluZm8yID0gY3B1X3RvX2xlMzIoCiAJCVFIX0lORk8yX0JVUlNUKHFzZXQtPm1heF9idXJzdCkKQEAgLTg2LDcgKzEwNSw3IEBACiAJICogc3RyZW5ndGggYW5kIGNhbiBwcmVzdW1hYmx5IGd1ZXNzIHRoZSBUeCBwb3dlciByZXF1aXJlZAogCSAqIGZyb20gdGhhdD8gKi8KIAlxc2V0LT5xaC5pbmZvMyA9IGNwdV90b19sZTMyKAotCQlRSF9JTkZPM19UWF9SQVRFXzUzXzMKKwkJUUhfSU5GTzNfVFhfUkFURShwaHlfcmF0ZSkKIAkJfCBRSF9JTkZPM19UWF9QV1IoMCkgLyogMCA9PSBtYXggcG93ZXIgKi8KIAkJKTsKIApAQCAtMTQ4LDcgKzE2Nyw3IEBACiAKIAkJcXNldC0+ZXAgPSB1cmItPmVwOwogCQl1cmItPmVwLT5oY3ByaXYgPSBxc2V0OwotCQlxc2V0X2ZpbGxfcWgocXNldCwgdXJiKTsKKwkJcXNldF9maWxsX3FoKHdoYywgcXNldCwgdXJiKTsKIAl9CiAJcmV0dXJuIHFzZXQ7CiB9CkBAIC0yNDEsNiArMjYwLDM2IEBACiAJcXNldC0+bnRkcy0tOwogfQogCitzdGF0aWMgdm9pZCBxc2V0X2NvcHlfYm91bmNlX3RvX3NnKHN0cnVjdCB3aGMgKndoYywgc3RydWN0IHdoY19zdGQgKnN0ZCkKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXZvaWQgKmJvdW5jZTsKKwlzaXplX3QgcmVtYWluaW5nLCBvZmZzZXQ7CisKKwlib3VuY2UgPSBzdGQtPmJvdW5jZV9idWY7CisJcmVtYWluaW5nID0gc3RkLT5sZW47CisKKwlzZyA9IHN0ZC0+Ym91bmNlX3NnOworCW9mZnNldCA9IHN0ZC0+Ym91bmNlX29mZnNldDsKKworCXdoaWxlIChyZW1haW5pbmcpIHsKKwkJc2l6ZV90IGxlbjsKKworCQlsZW4gPSBtaW4oc2ctPmxlbmd0aCAtIG9mZnNldCwgcmVtYWluaW5nKTsKKwkJbWVtY3B5KHNnX3ZpcnQoc2cpICsgb2Zmc2V0LCBib3VuY2UsIGxlbik7CisKKwkJYm91bmNlICs9IGxlbjsKKwkJcmVtYWluaW5nIC09IGxlbjsKKworCQlvZmZzZXQgKz0gbGVuOworCQlpZiAob2Zmc2V0ID49IHNnLT5sZW5ndGgpIHsKKwkJCXNnID0gc2dfbmV4dChzZyk7CisJCQlvZmZzZXQgPSAwOworCQl9CisJfQorCit9CisKIC8qKgogICogcXNldF9mcmVlX3N0ZCAtIHJlbW92ZSBhbiBzVEQgYW5kIGZyZWUgaXQuCiAgKiBAd2hjOiB0aGUgV0hDSSBob3N0IGNvbnRyb2xsZXIKQEAgLTI0OSwxMyArMjk4LDI5IEBACiB2b2lkIHFzZXRfZnJlZV9zdGQoc3RydWN0IHdoYyAqd2hjLCBzdHJ1Y3Qgd2hjX3N0ZCAqc3RkKQogewogCWxpc3RfZGVsKCZzdGQtPmxpc3Rfbm9kZSk7Ci0JaWYgKHN0ZC0+bnVtX3BvaW50ZXJzKSB7Ci0JCWRtYV91bm1hcF9zaW5nbGUod2hjLT53dXNiaGMuZGV2LCBzdGQtPmRtYV9hZGRyLAotCQkJCSBzdGQtPm51bV9wb2ludGVycyAqIHNpemVvZihzdHJ1Y3Qgd2hjX3BhZ2VfbGlzdF9lbnRyeSksCi0JCQkJIERNQV9UT19ERVZJQ0UpOwotCQlrZnJlZShzdGQtPnBsX3ZpcnQpOwotCX0KKwlpZiAoc3RkLT5ib3VuY2VfYnVmKSB7CisJCWJvb2wgaXNfb3V0ID0gdXNiX3BpcGVvdXQoc3RkLT51cmItPnBpcGUpOworCQlkbWFfYWRkcl90IGRtYV9hZGRyOwogCisJCWlmIChzdGQtPm51bV9wb2ludGVycykKKwkJCWRtYV9hZGRyID0gbGU2NF90b19jcHUoc3RkLT5wbF92aXJ0WzBdLmJ1Zl9wdHIpOworCQllbHNlCisJCQlkbWFfYWRkciA9IHN0ZC0+ZG1hX2FkZHI7CisKKwkJZG1hX3VubWFwX3NpbmdsZSh3aGMtPnd1c2JoYy5kZXYsIGRtYV9hZGRyLAorCQkJCSBzdGQtPmxlbiwgaXNfb3V0ID8gRE1BX1RPX0RFVklDRSA6IERNQV9GUk9NX0RFVklDRSk7CisJCWlmICghaXNfb3V0KQorCQkJcXNldF9jb3B5X2JvdW5jZV90b19zZyh3aGMsIHN0ZCk7CisJCWtmcmVlKHN0ZC0+Ym91bmNlX2J1Zik7CisJfQorCWlmIChzdGQtPnBsX3ZpcnQpIHsKKwkJaWYgKHN0ZC0+ZG1hX2FkZHIpCisJCQlkbWFfdW5tYXBfc2luZ2xlKHdoYy0+d3VzYmhjLmRldiwgc3RkLT5kbWFfYWRkciwKKwkJCQkJIHN0ZC0+bnVtX3BvaW50ZXJzICogc2l6ZW9mKHN0cnVjdCB3aGNfcGFnZV9saXN0X2VudHJ5KSwKKwkJCQkJIERNQV9UT19ERVZJQ0UpOworCQlrZnJlZShzdGQtPnBsX3ZpcnQpOworCQlzdGQtPnBsX3ZpcnQgPSBOVUxMOworCX0KIAlrZnJlZShzdGQpOwogfQogCkBAIC0yOTMsMTIgKzM1OCwxNyBAQAogewogCWRtYV9hZGRyX3QgZG1hX2FkZHIgPSBzdGQtPmRtYV9hZGRyOwogCWRtYV9hZGRyX3Qgc3AsIGVwOwotCXNpemVfdCBzdGRfbGVuID0gc3RkLT5sZW47CiAJc2l6ZV90IHBsX2xlbjsKIAlpbnQgcDsKIAotCXNwID0gQUxJR04oZG1hX2FkZHIsIFdIQ0lfUEFHRV9TSVpFKTsKLQllcCA9IGRtYV9hZGRyICsgc3RkX2xlbjsKKwkvKiBTaG9ydCBidWZmZXJzIGRvbid0IG5lZWQgYSBwYWdlIGxpc3QuICovCisJaWYgKHN0ZC0+bGVuIDw9IFdIQ0lfUEFHRV9TSVpFKSB7CisJCXN0ZC0+bnVtX3BvaW50ZXJzID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJc3AgPSBkbWFfYWRkciAmIH4oV0hDSV9QQUdFX1NJWkUtMSk7CisJZXAgPSBkbWFfYWRkciArIHN0ZC0+bGVuOwogCXN0ZC0+bnVtX3BvaW50ZXJzID0gRElWX1JPVU5EX1VQKGVwIC0gc3AsIFdIQ0lfUEFHRV9TSVpFKTsKIAogCXBsX2xlbiA9IHN0ZC0+bnVtX3BvaW50ZXJzICogc2l6ZW9mKHN0cnVjdCB3aGNfcGFnZV9saXN0X2VudHJ5KTsKQEAgLTMwOSw3ICszNzksNyBAQAogCiAJZm9yIChwID0gMDsgcCA8IHN0ZC0+bnVtX3BvaW50ZXJzOyBwKyspIHsKIAkJc3RkLT5wbF92aXJ0W3BdLmJ1Zl9wdHIgPSBjcHVfdG9fbGU2NChkbWFfYWRkcik7Ci0JCWRtYV9hZGRyID0gQUxJR04oZG1hX2FkZHIgKyBXSENJX1BBR0VfU0laRSwgV0hDSV9QQUdFX1NJWkUpOworCQlkbWFfYWRkciA9IChkbWFfYWRkciArIFdIQ0lfUEFHRV9TSVpFKSAmIH4oV0hDSV9QQUdFX1NJWkUtMSk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0zMzksNiArNDA5LDIxOCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndoYy0+bG9jaywgZmxhZ3MpOwogfQogCitzdGF0aWMgc3RydWN0IHdoY19zdGQgKnFzZXRfbmV3X3N0ZChzdHJ1Y3Qgd2hjICp3aGMsIHN0cnVjdCB3aGNfcXNldCAqcXNldCwKKwkJCQkgICAgc3RydWN0IHVyYiAqdXJiLCBnZnBfdCBtZW1fZmxhZ3MpCit7CisJc3RydWN0IHdoY19zdGQgKnN0ZDsKKworCXN0ZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3aGNfc3RkKSwgbWVtX2ZsYWdzKTsKKwlpZiAoc3RkID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJc3RkLT51cmIgPSB1cmI7CisJc3RkLT5xdGQgPSBOVUxMOworCisJSU5JVF9MSVNUX0hFQUQoJnN0ZC0+bGlzdF9ub2RlKTsKKwlsaXN0X2FkZF90YWlsKCZzdGQtPmxpc3Rfbm9kZSwgJnFzZXQtPnN0ZHMpOworCisJcmV0dXJuIHN0ZDsKK30KKworc3RhdGljIGludCBxc2V0X2FkZF91cmJfc2coc3RydWN0IHdoYyAqd2hjLCBzdHJ1Y3Qgd2hjX3FzZXQgKnFzZXQsIHN0cnVjdCB1cmIgKnVyYiwKKwkJCSAgIGdmcF90IG1lbV9mbGFncykKK3sKKwlzaXplX3QgcmVtYWluaW5nOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJaW50IGk7CisJaW50IG50ZHMgPSAwOworCXN0cnVjdCB3aGNfc3RkICpzdGQgPSBOVUxMOworCXN0cnVjdCB3aGNfcGFnZV9saXN0X2VudHJ5ICplbnRyeTsKKwlkbWFfYWRkcl90IHByZXZfZW5kID0gMDsKKwlzaXplX3QgcGxfbGVuOworCWludCBwID0gMDsKKworCXJlbWFpbmluZyA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aDsKKworCWZvcl9lYWNoX3NnKHVyYi0+c2ctPnNnLCBzZywgdXJiLT5udW1fc2dzLCBpKSB7CisJCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJCXNpemVfdCBkbWFfcmVtYWluaW5nOworCQlkbWFfYWRkcl90IHNwLCBlcDsKKwkJaW50IG51bV9wb2ludGVyczsKKworCQlpZiAocmVtYWluaW5nID09IDApIHsKKwkJCWJyZWFrOworCQl9CisKKwkJZG1hX2FkZHIgPSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJCWRtYV9yZW1haW5pbmcgPSBtaW5fdChzaXplX3QsIHNnX2RtYV9sZW4oc2cpLCByZW1haW5pbmcpOworCisJCXdoaWxlIChkbWFfcmVtYWluaW5nKSB7CisJCQlzaXplX3QgZG1hX2xlbjsKKworCQkJLyoKKwkJCSAqIFdlIGNhbiB1c2UgdGhlIHByZXZpb3VzIHN0ZCAoaWYgaXQgZXhpc3RzKSBwcm92aWRlZCB0aGF0OgorCQkJICogLSB0aGUgcHJldmlvdXMgb25lIGVuZGVkIG9uIGEgcGFnZSBib3VuZGFyeS4KKwkJCSAqIC0gdGhlIGN1cnJlbnQgb25lIGJlZ2lucyBvbiBhIHBhZ2UgYm91bmRhcnkuCisJCQkgKiAtIHRoZSBwcmV2aW91cyBvbmUgaXNuJ3QgZnVsbC4KKwkJCSAqCisJCQkgKiBJZiBhIG5ldyBzdGQgaXMgbmVlZGVkIGJ1dCB0aGUgcHJldmlvdXMgb25lCisJCQkgKiB3YXMgbm90IGEgd2hvbGUgbnVtYmVyIG9mIHBhY2tldHMgdGhlbiB0aGlzCisJCQkgKiBzZyBsaXN0IGNhbm5vdCBiZSBtYXBwZWQgb250byBtdWx0aXBsZQorCQkJICogcVREcy4gIFJldHVybiBhbiBlcnJvciBhbmQgbGV0IHRoZSBjYWxsZXIKKwkJCSAqIHNvcnQgaXQgb3V0LgorCQkJICovCisJCQlpZiAoIXN0ZAorCQkJICAgIHx8IChwcmV2X2VuZCAmIChXSENJX1BBR0VfU0laRS0xKSkKKwkJCSAgICB8fCAoZG1hX2FkZHIgJiAoV0hDSV9QQUdFX1NJWkUtMSkpCisJCQkgICAgfHwgc3RkLT5sZW4gKyBXSENJX1BBR0VfU0laRSA+IFFURF9NQVhfWEZFUl9TSVpFKSB7CisJCQkJaWYgKHN0ZC0+bGVuICUgcXNldC0+bWF4X3BhY2tldCAhPSAwKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlzdGQgPSBxc2V0X25ld19zdGQod2hjLCBxc2V0LCB1cmIsIG1lbV9mbGFncyk7CisJCQkJaWYgKHN0ZCA9PSBOVUxMKSB7CisJCQkJCXJldHVybiAtRU5PTUVNOworCQkJCX0KKwkJCQludGRzKys7CisJCQkJcCA9IDA7CisJCQl9CisKKwkJCWRtYV9sZW4gPSBkbWFfcmVtYWluaW5nOworCisJCQkvKgorCQkJICogSWYgdGhlIHJlbWFpbmRlciBvZiB0aGlzIGVsZW1lbnQgZG9lc24ndAorCQkJICogZml0IGluIGEgc2luZ2xlIHFURCwgbGltaXQgdGhlIHFURCB0byBhCisJCQkgKiB3aG9sZSBudW1iZXIgb2YgcGFja2V0cy4gIFRoaXMgYWxsb3dzIHRoZQorCQkJICogcmVtYWluZGVyIHRvIGdvIGludG8gdGhlIG5leHQgcVRELgorCQkJICovCisJCQlpZiAoc3RkLT5sZW4gKyBkbWFfbGVuID4gUVREX01BWF9YRkVSX1NJWkUpIHsKKwkJCQlkbWFfbGVuID0gKFFURF9NQVhfWEZFUl9TSVpFIC8gcXNldC0+bWF4X3BhY2tldCkKKwkJCQkJKiBxc2V0LT5tYXhfcGFja2V0IC0gc3RkLT5sZW47CisJCQl9CisKKwkJCXN0ZC0+bGVuICs9IGRtYV9sZW47CisJCQlzdGQtPm50ZHNfcmVtYWluaW5nID0gLTE7IC8qIGZpbGxlZCBpbiBsYXRlciAqLworCisJCQlzcCA9IGRtYV9hZGRyICYgfihXSENJX1BBR0VfU0laRS0xKTsKKwkJCWVwID0gZG1hX2FkZHIgKyBkbWFfbGVuOworCQkJbnVtX3BvaW50ZXJzID0gRElWX1JPVU5EX1VQKGVwIC0gc3AsIFdIQ0lfUEFHRV9TSVpFKTsKKwkJCXN0ZC0+bnVtX3BvaW50ZXJzICs9IG51bV9wb2ludGVyczsKKworCQkJcGxfbGVuID0gc3RkLT5udW1fcG9pbnRlcnMgKiBzaXplb2Yoc3RydWN0IHdoY19wYWdlX2xpc3RfZW50cnkpOworCisJCQlzdGQtPnBsX3ZpcnQgPSBrcmVhbGxvYyhzdGQtPnBsX3ZpcnQsIHBsX2xlbiwgbWVtX2ZsYWdzKTsKKwkJCWlmIChzdGQtPnBsX3ZpcnQgPT0gTlVMTCkgeworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCisJCQlmb3IgKDtwIDwgc3RkLT5udW1fcG9pbnRlcnM7IHArKywgZW50cnkrKykgeworCQkJCXN0ZC0+cGxfdmlydFtwXS5idWZfcHRyID0gY3B1X3RvX2xlNjQoZG1hX2FkZHIpOworCQkJCWRtYV9hZGRyID0gKGRtYV9hZGRyICsgV0hDSV9QQUdFX1NJWkUpICYgfihXSENJX1BBR0VfU0laRS0xKTsKKwkJCX0KKworCQkJcHJldl9lbmQgPSBkbWFfYWRkciA9IGVwOworCQkJZG1hX3JlbWFpbmluZyAtPSBkbWFfbGVuOworCQkJcmVtYWluaW5nIC09IGRtYV9sZW47CisJCX0KKwl9CisKKwkvKiBOb3cgdGhlIG51bWJlciBvZiBzdGRzIGlzIGtub3csIGdvIGJhY2sgYW5kIGZpbGwgaW4KKwkgICBzdGQtPm50ZHNfcmVtYWluaW5nLiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoc3RkLCAmcXNldC0+c3RkcywgbGlzdF9ub2RlKSB7CisJCWlmIChzdGQtPm50ZHNfcmVtYWluaW5nID09IC0xKSB7CisJCQlwbF9sZW4gPSBzdGQtPm51bV9wb2ludGVycyAqIHNpemVvZihzdHJ1Y3Qgd2hjX3BhZ2VfbGlzdF9lbnRyeSk7CisJCQlzdGQtPm50ZHNfcmVtYWluaW5nID0gbnRkcy0tOworCQkJc3RkLT5kbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKHdoYy0+d3VzYmhjLmRldiwgc3RkLT5wbF92aXJ0LAorCQkJCQkJICAgICAgIHBsX2xlbiwgRE1BX1RPX0RFVklDRSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcXNldF9hZGRfdXJiX3NnX2xpbmVhcml6ZSAtIGFkZCBhbiB1cmIgd2l0aCBzZyBsaXN0LCBjb3B5aW5nIHRoZSBkYXRhCisgKgorICogSWYgdGhlIFVSQiBjb250YWlucyBhbiBzZyBsaXN0IHdob3NlIGVsZW1lbnRzIGNhbm5vdCBiZSBkaXJlY3RseQorICogbWFwcGVkIHRvIHFURHMgdGhlbiB0aGUgZGF0YSBtdXN0IGJlIHRyYW5zZmVycmVkIHZpYSBib3VuY2UKKyAqIGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyBpbnQgcXNldF9hZGRfdXJiX3NnX2xpbmVhcml6ZShzdHJ1Y3Qgd2hjICp3aGMsIHN0cnVjdCB3aGNfcXNldCAqcXNldCwKKwkJCQkgICAgIHN0cnVjdCB1cmIgKnVyYiwgZ2ZwX3QgbWVtX2ZsYWdzKQoreworCWJvb2wgaXNfb3V0ID0gdXNiX3BpcGVvdXQodXJiLT5waXBlKTsKKwlzaXplX3QgbWF4X3N0ZF9sZW47CisJc2l6ZV90IHJlbWFpbmluZzsKKwlpbnQgbnRkcyA9IDA7CisJc3RydWN0IHdoY19zdGQgKnN0ZCA9IE5VTEw7CisJdm9pZCAqYm91bmNlID0gTlVMTDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCWludCBpOworCisJLyogbGltaXQgbWF4aW11bSBib3VuY2UgYnVmZmVyIHRvIDE2ICogMy41IEtpQiB+PSAyOCBrICovCisJbWF4X3N0ZF9sZW4gPSBxc2V0LT5tYXhfYnVyc3QgKiBxc2V0LT5tYXhfcGFja2V0OworCisJcmVtYWluaW5nID0gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOworCisJZm9yX2VhY2hfc2codXJiLT5zZy0+c2csIHNnLCB1cmItPnNnLT5uZW50cywgaSkgeworCQlzaXplX3QgbGVuOworCQlzaXplX3Qgc2dfcmVtYWluaW5nOworCQl2b2lkICpvcmlnOworCisJCWlmIChyZW1haW5pbmcgPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKworCQlzZ19yZW1haW5pbmcgPSBtaW5fdChzaXplX3QsIHJlbWFpbmluZywgc2ctPmxlbmd0aCk7CisJCW9yaWcgPSBzZ192aXJ0KHNnKTsKKworCQl3aGlsZSAoc2dfcmVtYWluaW5nKSB7CisJCQlpZiAoIXN0ZCB8fCBzdGQtPmxlbiA9PSBtYXhfc3RkX2xlbikgeworCQkJCXN0ZCA9IHFzZXRfbmV3X3N0ZCh3aGMsIHFzZXQsIHVyYiwgbWVtX2ZsYWdzKTsKKwkJCQlpZiAoc3RkID09IE5VTEwpCisJCQkJCXJldHVybiAtRU5PTUVNOworCQkJCXN0ZC0+Ym91bmNlX2J1ZiA9IGttYWxsb2MobWF4X3N0ZF9sZW4sIG1lbV9mbGFncyk7CisJCQkJaWYgKHN0ZC0+Ym91bmNlX2J1ZiA9PSBOVUxMKQorCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQlzdGQtPmJvdW5jZV9zZyA9IHNnOworCQkJCXN0ZC0+Ym91bmNlX29mZnNldCA9IG9yaWcgLSBzZ192aXJ0KHNnKTsKKwkJCQlib3VuY2UgPSBzdGQtPmJvdW5jZV9idWY7CisJCQkJbnRkcysrOworCQkJfQorCisJCQlsZW4gPSBtaW4oc2dfcmVtYWluaW5nLCBtYXhfc3RkX2xlbiAtIHN0ZC0+bGVuKTsKKworCQkJaWYgKGlzX291dCkKKwkJCQltZW1jcHkoYm91bmNlLCBvcmlnLCBsZW4pOworCisJCQlzdGQtPmxlbiArPSBsZW47CisJCQlzdGQtPm50ZHNfcmVtYWluaW5nID0gLTE7IC8qIGZpbGxlZCBpbiBsYXRlciAqLworCisJCQlib3VuY2UgKz0gbGVuOworCQkJb3JpZyArPSBsZW47CisJCQlzZ19yZW1haW5pbmcgLT0gbGVuOworCQkJcmVtYWluaW5nIC09IGxlbjsKKwkJfQorCX0KKworCS8qCisJICogRm9yIGVhY2ggb2YgdGhlIG5ldyBzVERzLCBtYXAgdGhlIGJvdW5jZSBidWZmZXJzLCBjcmVhdGUKKwkgKiBwYWdlIGxpc3RzIChpZiBuZWNlc3NhcnkpLCBhbmQgZmlsbCBpbiBzdGQtPm50ZHNfcmVtYWluaW5nLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoc3RkLCAmcXNldC0+c3RkcywgbGlzdF9ub2RlKSB7CisJCWlmIChzdGQtPm50ZHNfcmVtYWluaW5nICE9IC0xKQorCQkJY29udGludWU7CisKKwkJc3RkLT5kbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKCZ3aGMtPnVtYy0+ZGV2LCBzdGQtPmJvdW5jZV9idWYsIHN0ZC0+bGVuLAorCQkJCQkgICAgICAgaXNfb3V0ID8gRE1BX1RPX0RFVklDRSA6IERNQV9GUk9NX0RFVklDRSk7CisKKwkJaWYgKHFzZXRfZmlsbF9wYWdlX2xpc3Qod2hjLCBzdGQsIG1lbV9mbGFncykgPCAwKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJc3RkLT5udGRzX3JlbWFpbmluZyA9IG50ZHMtLTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiBxc2V0X2FkZF91cmIgLSBhZGQgYW4gdXJiIHRvIHRoZSBxc2V0J3MgcXVldWUuCiAgKgpAQCAtMzUzLDEwICs2MzUsNyBAQAogCWludCByZW1haW5pbmcgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGg7CiAJdTY0IHRyYW5zZmVyX2RtYSA9IHVyYi0+dHJhbnNmZXJfZG1hOwogCWludCBudGRzX3JlbWFpbmluZzsKLQotCW50ZHNfcmVtYWluaW5nID0gRElWX1JPVU5EX1VQKHJlbWFpbmluZywgUVREX01BWF9YRkVSX1NJWkUpOwotCWlmIChudGRzX3JlbWFpbmluZyA9PSAwKQotCQludGRzX3JlbWFpbmluZyA9IDE7CisJaW50IHJldDsKIAogCXd1cmIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgd2hjX3VyYiksIG1lbV9mbGFncyk7CiAJaWYgKHd1cmIgPT0gTlVMTCkKQEAgLTM2NiwzMiArNjQ1LDM5IEBACiAJd3VyYi0+dXJiID0gdXJiOwogCUlOSVRfV09SSygmd3VyYi0+ZGVxdWV1ZV93b3JrLCB1cmJfZGVxdWV1ZV93b3JrKTsKIAorCWlmICh1cmItPnNnKSB7CisJCXJldCA9IHFzZXRfYWRkX3VyYl9zZyh3aGMsIHFzZXQsIHVyYiwgbWVtX2ZsYWdzKTsKKwkJaWYgKHJldCA9PSAtRUlOVkFMKSB7CisJCQlxc2V0X2ZyZWVfc3Rkcyhxc2V0LCB1cmIpOworCQkJcmV0ID0gcXNldF9hZGRfdXJiX3NnX2xpbmVhcml6ZSh3aGMsIHFzZXQsIHVyYiwgbWVtX2ZsYWdzKTsKKwkJfQorCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyX25vX21lbTsKKwkJcmV0dXJuIDA7CisJfQorCisJbnRkc19yZW1haW5pbmcgPSBESVZfUk9VTkRfVVAocmVtYWluaW5nLCBRVERfTUFYX1hGRVJfU0laRSk7CisJaWYgKG50ZHNfcmVtYWluaW5nID09IDApCisJCW50ZHNfcmVtYWluaW5nID0gMTsKKwogCXdoaWxlIChudGRzX3JlbWFpbmluZykgewogCQlzdHJ1Y3Qgd2hjX3N0ZCAqc3RkOwogCQlzaXplX3Qgc3RkX2xlbjsKIAotCQlzdGQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgd2hjX3N0ZCksIG1lbV9mbGFncyk7Ci0JCWlmIChzdGQgPT0gTlVMTCkKLQkJCWdvdG8gZXJyX25vX21lbTsKLQogCQlzdGRfbGVuID0gcmVtYWluaW5nOwogCQlpZiAoc3RkX2xlbiA+IFFURF9NQVhfWEZFUl9TSVpFKQogCQkJc3RkX2xlbiA9IFFURF9NQVhfWEZFUl9TSVpFOwogCi0JCXN0ZC0+dXJiID0gdXJiOworCQlzdGQgPSBxc2V0X25ld19zdGQod2hjLCBxc2V0LCB1cmIsIG1lbV9mbGFncyk7CisJCWlmIChzdGQgPT0gTlVMTCkKKwkJCWdvdG8gZXJyX25vX21lbTsKKwogCQlzdGQtPmRtYV9hZGRyID0gdHJhbnNmZXJfZG1hOwogCQlzdGQtPmxlbiA9IHN0ZF9sZW47CiAJCXN0ZC0+bnRkc19yZW1haW5pbmcgPSBudGRzX3JlbWFpbmluZzsKLQkJc3RkLT5xdGQgPSBOVUxMOwogCi0JCUlOSVRfTElTVF9IRUFEKCZzdGQtPmxpc3Rfbm9kZSk7Ci0JCWxpc3RfYWRkX3RhaWwoJnN0ZC0+bGlzdF9ub2RlLCAmcXNldC0+c3Rkcyk7Ci0KLQkJaWYgKHN0ZF9sZW4gPiBXSENJX1BBR0VfU0laRSkgewotCQkJaWYgKHFzZXRfZmlsbF9wYWdlX2xpc3Qod2hjLCBzdGQsIG1lbV9mbGFncykgPCAwKQotCQkJCWdvdG8gZXJyX25vX21lbTsKLQkJfSBlbHNlCi0JCQlzdGQtPm51bV9wb2ludGVycyA9IDA7CisJCWlmIChxc2V0X2ZpbGxfcGFnZV9saXN0KHdoYywgc3RkLCBtZW1fZmxhZ3MpIDwgMCkKKwkJCWdvdG8gZXJyX25vX21lbTsKIAogCQludGRzX3JlbWFpbmluZy0tOwogCQlyZW1haW5pbmcgLT0gc3RkX2xlbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS93aGNkLmggYi9kcml2ZXJzL3VzYi9ob3N0L3doY2kvd2hjZC5oCmluZGV4IDI0ZTk0ZDkuLmM4MGM3ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS93aGNkLmgKKysrIGIvZHJpdmVycy91c2IvaG9zdC93aGNpL3doY2QuaApAQCAtODQsNiArODQsMTEgQEAKICAqIEBsZW46IHRoZSBsZW5ndGggb2YgZGF0YSBpbiB0aGUgYXNzb2NpYXRlZCBURC4KICAqIEBudGRzX3JlbWFpbmluZzogbnVtYmVyIG9mIFREcyAoc3RhcnRpbmcgZnJvbSB0aGlzIG9uZSkgaW4gdGhpcyB0cmFuc2Zlci4KICAqCisgKiBAYm91bmNlX2J1ZjogYSBib3VuY2UgYnVmZmVyIGlmIHRoZSBzdGQgd2FzIGZyb20gYW4gdXJiIHdpdGggYSBzZworICogbGlzdCB0aGF0IGNvdWxkIG5vdCBiZSBtYXBwZWQgdG8gcVREcyBkaXJlY3RseS4KKyAqIEBib3VuY2Vfc2c6IHRoZSBmaXJzdCBzY2F0dGVybGlzdCBlbGVtZW50IGJvdW5jZV9idWYgaXMgZm9yLgorICogQGJvdW5jZV9vZmZzZXQ6IHRoZSBvZmZzZXQgaW50byBib3VuY2Vfc2cgZm9yIHRoZSBzdGFydCBvZiBib3VuY2VfYnVmLgorICoKICAqIFF1ZXVlZCBVUkJzIG1heSByZXF1aXJlIG1vcmUgVERzIHRoYW4gYXJlIGF2YWlsYWJsZSBpbiBhIHFzZXQgc28gd2UKICAqIHVzZSBhIGxpc3Qgb2YgdGhlc2UgInNvZnR3YXJlIFREcyIgKHNURHMpIHRvIGhvbGQgcGVyLVREIGRhdGEuCiAgKi8KQEAgLTk3LDYgKzEwMiwxMCBAQAogCWludCBudW1fcG9pbnRlcnM7CiAJZG1hX2FkZHJfdCBkbWFfYWRkcjsKIAlzdHJ1Y3Qgd2hjX3BhZ2VfbGlzdF9lbnRyeSAqcGxfdmlydDsKKworCXZvaWQgKmJvdW5jZV9idWY7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpib3VuY2Vfc2c7CisJdW5zaWduZWQgYm91bmNlX29mZnNldDsKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC93aGNpL3doY2ktaGMuaCBiL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS93aGNpLWhjLmgKaW5kZXggZThkMDAwMS4uNGQ0Y2JjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC93aGNpL3doY2ktaGMuaAorKysgYi9kcml2ZXJzL3VzYi9ob3N0L3doY2kvd2hjaS1oYy5oCkBAIC0xNzIsMTQgKzE3Miw3IEBACiAjZGVmaW5lIFFIX0lORk8zX01BWF9ERUxBWShkKSAgICAoKGQpIDw8IDApICAvKiBtYXhpbXVtIHN0cmVhbSBkZWxheSBpbiAxMjUgdXMgdW5pdHMgKGlzb2Mgb25seSkgKi8KICNkZWZpbmUgUUhfSU5GTzNfSU5URVJWQUwoaSkgICAgICgoaSkgPDwgMTYpIC8qIHNlZ21lbnQgaW50ZXJ2YWwgaW4gMTI1IHVzIHVuaXRzIChpc29jIG9ubHkpICovCiAKLSNkZWZpbmUgUUhfSU5GTzNfVFhfUkFURV81M18zICAgICgwIDw8IDI0KQotI2RlZmluZSBRSF9JTkZPM19UWF9SQVRFXzgwICAgICAgKDEgPDwgMjQpCi0jZGVmaW5lIFFIX0lORk8zX1RYX1JBVEVfMTA2XzcgICAoMiA8PCAyNCkKLSNkZWZpbmUgUUhfSU5GTzNfVFhfUkFURV8xNjAgICAgICgzIDw8IDI0KQotI2RlZmluZSBRSF9JTkZPM19UWF9SQVRFXzIwMCAgICAgKDQgPDwgMjQpCi0jZGVmaW5lIFFIX0lORk8zX1RYX1JBVEVfMzIwICAgICAoNSA8PCAyNCkKLSNkZWZpbmUgUUhfSU5GTzNfVFhfUkFURV80MDAgICAgICg2IDw8IDI0KQotI2RlZmluZSBRSF9JTkZPM19UWF9SQVRFXzQ4MCAgICAgKDcgPDwgMjQpCisjZGVmaW5lIFFIX0lORk8zX1RYX1JBVEUocikgICAgICAoKHIpIDw8IDI0KSAvKiBQSFkgcmF0ZSAoc2VlIFtFQ01BLTM2OF0gc2VjdGlvbiAxMC4zLjEuMSkgKi8KICNkZWZpbmUgUUhfSU5GTzNfVFhfUFdSKHApICAgICAgICgocCkgPDwgMjkpIC8qIHRyYW5zbWl0IHBvd2VyIChzZWUgW1dVU0JdIHNlY3Rpb24gNS4yLjEuMikgKi8KIAogI2RlZmluZSBRSF9TVEFUVVNfRkxPV19DVFJMICAgICAgKDEgPDwgMTUpCkBAIC0yNjcsOCArMjYwLDkgQEAKIAl1bnNpZ25lZCByZXNldDoxOwogCXN0cnVjdCB1cmIgKnBhdXNlX2FmdGVyX3VyYjsKIAlzdHJ1Y3QgY29tcGxldGlvbiByZW1vdmVfY29tcGxldGU7Ci0JaW50IG1heF9idXJzdDsKLQlpbnQgbWF4X3NlcTsKKwl1aW50MTZfdCBtYXhfcGFja2V0OworCXVpbnQ4X3QgbWF4X2J1cnN0OworCXVpbnQ4X3QgbWF4X3NlcTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB3aGNfcXNldF9zZXRfbGlua19wdHIodTY0ICpwdHIsIHU2NCB0YXJnZXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktaGNkLmMKaW5kZXggOTMyZjk5OS4uNWU5MmM3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1oY2QuYwpAQCAtNjcsNiArNjcsMjUgQEAKIH0KIAogLyoKKyAqIERpc2FibGUgaW50ZXJydXB0cyBhbmQgYmVnaW4gdGhlIHhIQ0kgaGFsdGluZyBwcm9jZXNzLgorICovCit2b2lkIHhoY2lfcXVpZXNjZShzdHJ1Y3QgeGhjaV9oY2QgKnhoY2kpCit7CisJdTMyIGhhbHRlZDsKKwl1MzIgY21kOworCXUzMiBtYXNrOworCisJbWFzayA9IH4oWEhDSV9JUlFTKTsKKwloYWx0ZWQgPSB4aGNpX3JlYWRsKHhoY2ksICZ4aGNpLT5vcF9yZWdzLT5zdGF0dXMpICYgU1RTX0hBTFQ7CisJaWYgKCFoYWx0ZWQpCisJCW1hc2sgJj0gfkNNRF9SVU47CisKKwljbWQgPSB4aGNpX3JlYWRsKHhoY2ksICZ4aGNpLT5vcF9yZWdzLT5jb21tYW5kKTsKKwljbWQgJj0gbWFzazsKKwl4aGNpX3dyaXRlbCh4aGNpLCBjbWQsICZ4aGNpLT5vcF9yZWdzLT5jb21tYW5kKTsKK30KKworLyoKICAqIEZvcmNlIEhDIGludG8gaGFsdCBzdGF0ZS4KICAqCiAgKiBEaXNhYmxlIGFueSBJUlFzIGFuZCBjbGVhciB0aGUgcnVuL3N0b3AgYml0LgpAQCAtNzcsMjAgKzk2LDggQEAKICAqLwogaW50IHhoY2lfaGFsdChzdHJ1Y3QgeGhjaV9oY2QgKnhoY2kpCiB7Ci0JdTMyIGhhbHRlZDsKLQl1MzIgY21kOwotCXUzMiBtYXNrOwotCiAJeGhjaV9kYmcoeGhjaSwgIi8vIEhhbHQgdGhlIEhDXG4iKTsKLQkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIGZyb20gdGhlIGhvc3QgY29udHJvbGxlciAqLwotCW1hc2sgPSB+KFhIQ0lfSVJRUyk7Ci0JaGFsdGVkID0geGhjaV9yZWFkbCh4aGNpLCAmeGhjaS0+b3BfcmVncy0+c3RhdHVzKSAmIFNUU19IQUxUOwotCWlmICghaGFsdGVkKQotCQltYXNrICY9IH5DTURfUlVOOwotCi0JY21kID0geGhjaV9yZWFkbCh4aGNpLCAmeGhjaS0+b3BfcmVncy0+Y29tbWFuZCk7Ci0JY21kICY9IG1hc2s7Ci0JeGhjaV93cml0ZWwoeGhjaSwgY21kLCAmeGhjaS0+b3BfcmVncy0+Y29tbWFuZCk7CisJeGhjaV9xdWllc2NlKHhoY2kpOwogCiAJcmV0dXJuIGhhbmRzaGFrZSh4aGNpLCAmeGhjaS0+b3BfcmVncy0+c3RhdHVzLAogCQkJU1RTX0hBTFQsIFNUU19IQUxULCBYSENJX01BWF9IQUxUX1VTRUMpOwpAQCAtMTI0LDI4ICsxMzEsNiBAQAogCXJldHVybiBoYW5kc2hha2UoeGhjaSwgJnhoY2ktPm9wX3JlZ3MtPmNvbW1hbmQsIENNRF9SRVNFVCwgMCwgMjUwICogMTAwMCk7CiB9CiAKLS8qCi0gKiBTdG9wIHRoZSBIQyBmcm9tIHByb2Nlc3NpbmcgdGhlIGVuZHBvaW50IHF1ZXVlcy4KLSAqLwotc3RhdGljIHZvaWQgeGhjaV9xdWllc2NlKHN0cnVjdCB4aGNpX2hjZCAqeGhjaSkKLXsKLQkvKgotCSAqIFF1ZXVlcyBhcmUgcGVyIGVuZHBvaW50LCBzbyB3ZSBuZWVkIHRvIGRpc2FibGUgYW4gZW5kcG9pbnQgb3Igc2xvdC4KLQkgKgotCSAqIFRvIGRpc2FibGUgYSBzbG90LCB3ZSBuZWVkIHRvIGluc2VydCBhIGRpc2FibGUgc2xvdCBjb21tYW5kIG9uIHRoZQotCSAqIGNvbW1hbmQgcmluZyBhbmQgcmluZyB0aGUgZG9vcmJlbGwuICBUaGlzIHdpbGwgYWxzbyBmcmVlIGFueSBpbnRlcm5hbAotCSAqIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNsb3QgKHdoaWNoIG1pZ2h0IG5vdCBiZSB3aGF0IHdlIHdhbnQpLgotCSAqCi0JICogQSBSZWxlYXNlIEVuZHBvaW50IGNvbW1hbmQgc291bmRzIGJldHRlciAtIGRvZXNuJ3QgZnJlZSBpbnRlcm5hbCBIQwotCSAqIG1lbW9yeSwgYnV0IHJlbW92ZXMgdGhlIGVuZHBvaW50cyBmcm9tIHRoZSBzY2hlZHVsZSBhbmQgcmVsZWFzZXMgdGhlCi0JICogYmFuZHdpZHRoLCBkaXNhYmxlcyB0aGUgZG9vcmJlbGxzLCBhbmQgY2xlYXJzIHRoZSBlbmRwb2ludCBlbmFibGUKLQkgKiBmbGFnLiAgVXN1YWxseSB1c2VkIHByaW9yIHRvIGEgc2V0IGludGVyZmFjZSBjb21tYW5kLgotCSAqCi0JICogVE9ETzogSW1wbGVtZW50IGFmdGVyIGNvbW1hbmQgcmluZyBjb2RlIGlzIGRvbmUuCi0JICovCi0JQlVHX09OKCFIQ19JU19SVU5OSU5HKHhoY2lfdG9faGNkKHhoY2kpLT5zdGF0ZSkpOwotCXhoY2lfZGJnKHhoY2ksICJGaW5pc2hlZCBxdWllc2NpbmcgLS0gY29kZSBub3Qgd3JpdHRlbiB5ZXRcbiIpOwotfQogCiAjaWYgMAogLyogU2V0IHVwIE1TSS1YIHRhYmxlIGZvciBlbnRyeSAwIChtYXkgY2xhaW0gb3RoZXIgZW50cmllcyBsYXRlcikgKi8KQEAgLTI2MSw4ICsyNDYsMTQgQEAKIAkvKiBGbHVzaCBwb3N0ZWQgd3JpdGVzICovCiAJeGhjaV9yZWFkbCh4aGNpLCAmeGhjaS0+aXJfc2V0LT5pcnFfcGVuZGluZyk7CiAKLQkvKiBGSVhNRSB0aGlzIHNob3VsZCBiZSBhIGRlbGF5ZWQgc2VydmljZSByb3V0aW5lIHRoYXQgY2xlYXJzIHRoZSBFSEIgKi8KLQl4aGNpX2hhbmRsZV9ldmVudCh4aGNpKTsKKwlpZiAoeGhjaS0+eGhjX3N0YXRlICYgWEhDSV9TVEFURV9EWUlORykKKwkJeGhjaV9kYmcoeGhjaSwgInhIQ0kgZHlpbmcsIGlnbm9yaW5nIGludGVycnVwdC4gIgorCQkJCSJTaG91bGRuJ3QgSVJRcyBiZSBkaXNhYmxlZD9cbiIpOworCWVsc2UKKwkJLyogRklYTUUgdGhpcyBzaG91bGQgYmUgYSBkZWxheWVkIHNlcnZpY2Ugcm91dGluZQorCQkgKiB0aGF0IGNsZWFycyB0aGUgRUhCLgorCQkgKi8KKwkJeGhjaV9oYW5kbGVfZXZlbnQoeGhjaSk7CiAKIAkvKiBDbGVhciB0aGUgZXZlbnQgaGFuZGxlciBidXN5IGZsYWcgKFJXMUMpOyB0aGUgZXZlbnQgcmluZyBzaG91bGQgYmUgZW1wdHkuICovCiAJdGVtcF82NCA9IHhoY2lfcmVhZF82NCh4aGNpLCAmeGhjaS0+aXJfc2V0LT5lcnN0X2RlcXVldWUpOwpAQCAtMzM1LDcgKzMyNiw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnhoY2ktPmxvY2ssIGZsYWdzKTsKIAl0ZW1wID0geGhjaV9yZWFkbCh4aGNpLCAmeGhjaS0+b3BfcmVncy0+c3RhdHVzKTsKIAl4aGNpX2RiZyh4aGNpLCAib3AgcmVnIHN0YXR1cyA9IDB4JXhcbiIsIHRlbXApOwotCWlmICh0ZW1wID09IDB4ZmZmZmZmZmYpIHsKKwlpZiAodGVtcCA9PSAweGZmZmZmZmZmIHx8ICh4aGNpLT54aGNfc3RhdGUgJiBYSENJX1NUQVRFX0RZSU5HKSkgewogCQl4aGNpX2RiZyh4aGNpLCAiSFcgZGllZCwgcG9sbGluZyBzdG9wcGVkLlxuIik7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnhoY2ktPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwpAQCAtNDkwLDggKzQ4MSw2IEBACiAJc3RydWN0IHhoY2lfaGNkICp4aGNpID0gaGNkX3RvX3hoY2koaGNkKTsKIAogCXNwaW5fbG9ja19pcnEoJnhoY2ktPmxvY2spOwotCWlmIChIQ19JU19SVU5OSU5HKGhjZC0+c3RhdGUpKQotCQl4aGNpX3F1aWVzY2UoeGhjaSk7CiAJeGhjaV9oYWx0KHhoY2kpOwogCXhoY2lfcmVzZXQoeGhjaSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZ4aGNpLT5sb2NrKTsKQEAgLTcyNywxNiArNzE2LDIyIEBACiAJCSAqIGF0b21pYyBjb250ZXh0IHRvIHRoaXMgZnVuY3Rpb24sIHdoaWNoIG1heSBhbGxvY2F0ZSBtZW1vcnkuCiAJCSAqLwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmeGhjaS0+bG9jaywgZmxhZ3MpOworCQlpZiAoeGhjaS0+eGhjX3N0YXRlICYgWEhDSV9TVEFURV9EWUlORykKKwkJCWdvdG8gZHlpbmc7CiAJCXJldCA9IHhoY2lfcXVldWVfY3RybF90eCh4aGNpLCBHRlBfQVRPTUlDLCB1cmIsCiAJCQkJc2xvdF9pZCwgZXBfaW5kZXgpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4aGNpLT5sb2NrLCBmbGFncyk7CiAJfSBlbHNlIGlmICh1c2JfZW5kcG9pbnRfeGZlcl9idWxrKCZ1cmItPmVwLT5kZXNjKSkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmeGhjaS0+bG9jaywgZmxhZ3MpOworCQlpZiAoeGhjaS0+eGhjX3N0YXRlICYgWEhDSV9TVEFURV9EWUlORykKKwkJCWdvdG8gZHlpbmc7CiAJCXJldCA9IHhoY2lfcXVldWVfYnVsa190eCh4aGNpLCBHRlBfQVRPTUlDLCB1cmIsCiAJCQkJc2xvdF9pZCwgZXBfaW5kZXgpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4aGNpLT5sb2NrLCBmbGFncyk7CiAJfSBlbHNlIGlmICh1c2JfZW5kcG9pbnRfeGZlcl9pbnQoJnVyYi0+ZXAtPmRlc2MpKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZ4aGNpLT5sb2NrLCBmbGFncyk7CisJCWlmICh4aGNpLT54aGNfc3RhdGUgJiBYSENJX1NUQVRFX0RZSU5HKQorCQkJZ290byBkeWluZzsKIAkJcmV0ID0geGhjaV9xdWV1ZV9pbnRyX3R4KHhoY2ksIEdGUF9BVE9NSUMsIHVyYiwKIAkJCQlzbG90X2lkLCBlcF9pbmRleCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnhoY2ktPmxvY2ssIGZsYWdzKTsKQEAgLTc0NSw2ICs3NDAsMTIgQEAKIAl9CiBleGl0OgogCXJldHVybiByZXQ7CitkeWluZzoKKwl4aGNpX2RiZyh4aGNpLCAiRXAgMHgleDogVVJCICVwIHN1Ym1pdHRlZCBmb3IgIgorCQkJIm5vbi1yZXNwb25zaXZlIHhIQ0kgaG9zdC5cbiIsCisJCQl1cmItPmVwLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MsIHVyYik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeGhjaS0+bG9jaywgZmxhZ3MpOworCXJldHVybiAtRVNIVVRET1dOOwogfQogCiAvKgpAQCAtODA2LDYgKzgwNywxNyBAQAogCQlrZnJlZSh0ZCk7CiAJCXJldHVybiByZXQ7CiAJfQorCWlmICh4aGNpLT54aGNfc3RhdGUgJiBYSENJX1NUQVRFX0RZSU5HKSB7CisJCXhoY2lfZGJnKHhoY2ksICJFcCAweCV4OiBVUkIgJXAgdG8gYmUgY2FuY2VsZWQgb24gIgorCQkJCSJub24tcmVzcG9uc2l2ZSB4SENJIGhvc3QuXG4iLAorCQkJCXVyYi0+ZXAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcywgdXJiKTsKKwkJLyogTGV0IHRoZSBzdG9wIGVuZHBvaW50IGNvbW1hbmQgd2F0Y2hkb2cgdGltZXIgKHdoaWNoIHNldCB0aGlzCisJCSAqIHN0YXRlKSBmaW5pc2ggY2xlYW5pbmcgdXAgdGhlIGVuZHBvaW50IFREIGxpc3RzLiAgV2UgbXVzdAorCQkgKiBoYXZlIGNhdWdodCBpdCBpbiB0aGUgbWlkZGxlIG9mIGRyb3BwaW5nIGEgbG9jayBhbmQgZ2l2aW5nCisJCSAqIGJhY2sgYW4gVVJCLgorCQkgKi8KKwkJZ290byBkb25lOworCX0KIAogCXhoY2lfZGJnKHhoY2ksICJDYW5jZWwgVVJCICVwXG4iLCB1cmIpOwogCXhoY2lfZGJnKHhoY2ksICJFdmVudCByaW5nOlxuIik7CkBAIC04MTcsMTIgKzgyOSwxNiBAQAogCXhoY2lfZGVidWdfcmluZyh4aGNpLCBlcF9yaW5nKTsKIAl0ZCA9IChzdHJ1Y3QgeGhjaV90ZCAqKSB1cmItPmhjcHJpdjsKIAotCWVwLT5jYW5jZWxzX3BlbmRpbmcrKzsKIAlsaXN0X2FkZF90YWlsKCZ0ZC0+Y2FuY2VsbGVkX3RkX2xpc3QsICZlcC0+Y2FuY2VsbGVkX3RkX2xpc3QpOwogCS8qIFF1ZXVlIGEgc3RvcCBlbmRwb2ludCBjb21tYW5kLCBidXQgb25seSBpZiB0aGlzIGlzCiAJICogdGhlIGZpcnN0IGNhbmNlbGxhdGlvbiB0byBiZSBoYW5kbGVkLgogCSAqLwotCWlmIChlcC0+Y2FuY2Vsc19wZW5kaW5nID09IDEpIHsKKwlpZiAoIShlcC0+ZXBfc3RhdGUgJiBFUF9IQUxUX1BFTkRJTkcpKSB7CisJCWVwLT5lcF9zdGF0ZSB8PSBFUF9IQUxUX1BFTkRJTkc7CisJCWVwLT5zdG9wX2NtZHNfcGVuZGluZysrOworCQllcC0+c3RvcF9jbWRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKworCQkJWEhDSV9TVE9QX0VQX0NNRF9USU1FT1VUICogSFo7CisJCWFkZF90aW1lcigmZXAtPnN0b3BfY21kX3RpbWVyKTsKIAkJeGhjaV9xdWV1ZV9zdG9wX2VuZHBvaW50KHhoY2ksIHVyYi0+ZGV2LT5zbG90X2lkLCBlcF9pbmRleCk7CiAJCXhoY2lfcmluZ19jbWRfZGIoeGhjaSk7CiAJfQpAQCAtMTI0NiwxMyArMTI2MiwzNSBAQAogCQkJTEFTVF9DVFhfVE9fRVBfTlVNKHNsb3RfY3R4LT5kZXZfaW5mbykpOwogCiAJeGhjaV96ZXJvX2luX2N0eCh4aGNpLCB2aXJ0X2Rldik7Ci0JLyogRnJlZSBhbnkgb2xkIHJpbmdzICovCisJLyogSW5zdGFsbCBuZXcgcmluZ3MgYW5kIGZyZWUgb3IgY2FjaGUgYW55IG9sZCByaW5ncyAqLwogCWZvciAoaSA9IDE7IGkgPCAzMTsgKytpKSB7Ci0JCWlmICh2aXJ0X2Rldi0+ZXBzW2ldLm5ld19yaW5nKSB7Ci0JCQl4aGNpX3JpbmdfZnJlZSh4aGNpLCB2aXJ0X2Rldi0+ZXBzW2ldLnJpbmcpOwotCQkJdmlydF9kZXYtPmVwc1tpXS5yaW5nID0gdmlydF9kZXYtPmVwc1tpXS5uZXdfcmluZzsKLQkJCXZpcnRfZGV2LT5lcHNbaV0ubmV3X3JpbmcgPSBOVUxMOworCQlpbnQgcmluZ3NfY2FjaGVkOworCisJCWlmICghdmlydF9kZXYtPmVwc1tpXS5uZXdfcmluZykKKwkJCWNvbnRpbnVlOworCQkvKiBPbmx5IGNhY2hlIG9yIGZyZWUgdGhlIG9sZCByaW5nIGlmIGl0IGV4aXN0cy4KKwkJICogSXQgbWF5IG5vdCBpZiB0aGlzIGlzIHRoZSBmaXJzdCBhZGQgb2YgYW4gZW5kcG9pbnQuCisJCSAqLworCQlpZiAodmlydF9kZXYtPmVwc1tpXS5yaW5nKSB7CisJCQlyaW5nc19jYWNoZWQgPSB2aXJ0X2Rldi0+bnVtX3JpbmdzX2NhY2hlZDsKKwkJCWlmIChyaW5nc19jYWNoZWQgPCBYSENJX01BWF9SSU5HU19DQUNIRUQpIHsKKwkJCQl2aXJ0X2Rldi0+bnVtX3JpbmdzX2NhY2hlZCsrOworCQkJCXJpbmdzX2NhY2hlZCA9IHZpcnRfZGV2LT5udW1fcmluZ3NfY2FjaGVkOworCQkJCXZpcnRfZGV2LT5yaW5nX2NhY2hlW3JpbmdzX2NhY2hlZF0gPQorCQkJCQl2aXJ0X2Rldi0+ZXBzW2ldLnJpbmc7CisJCQkJeGhjaV9kYmcoeGhjaSwgIkNhY2hlZCBvbGQgcmluZywgIgorCQkJCQkJIiVkIHJpbmclcyBjYWNoZWRcbiIsCisJCQkJCQlyaW5nc19jYWNoZWQsCisJCQkJCQkocmluZ3NfY2FjaGVkID4gMSkgPyAicyIgOiAiIik7CisJCQl9IGVsc2UgeworCQkJCXhoY2lfcmluZ19mcmVlKHhoY2ksIHZpcnRfZGV2LT5lcHNbaV0ucmluZyk7CisJCQkJeGhjaV9kYmcoeGhjaSwgIlJpbmcgY2FjaGUgZnVsbCAoJWQgcmluZ3MpLCAiCisJCQkJCQkiZnJlZWluZyByaW5nXG4iLAorCQkJCQkJdmlydF9kZXYtPm51bV9yaW5nc19jYWNoZWQpOworCQkJfQogCQl9CisJCXZpcnRfZGV2LT5lcHNbaV0ucmluZyA9IHZpcnRfZGV2LT5lcHNbaV0ubmV3X3Jpbmc7CisJCXZpcnRfZGV2LT5lcHNbaV0ubmV3X3JpbmcgPSBOVUxMOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0xNDI3LDE2ICsxNDY1LDI3IEBACiB2b2lkIHhoY2lfZnJlZV9kZXYoc3RydWN0IHVzYl9oY2QgKmhjZCwgc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCiB7CiAJc3RydWN0IHhoY2lfaGNkICp4aGNpID0gaGNkX3RvX3hoY2koaGNkKTsKKwlzdHJ1Y3QgeGhjaV92aXJ0X2RldmljZSAqdmlydF9kZXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgc3RhdGU7CisJaW50IGk7CiAKIAlpZiAodWRldi0+c2xvdF9pZCA9PSAwKQogCQlyZXR1cm47CisJdmlydF9kZXYgPSB4aGNpLT5kZXZzW3VkZXYtPnNsb3RfaWRdOworCWlmICghdmlydF9kZXYpCisJCXJldHVybjsKKworCS8qIFN0b3AgYW55IHdheXdhcmQgdGltZXIgZnVuY3Rpb25zICh3aGljaCBtYXkgZ3JhYiB0aGUgbG9jaykgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzE7ICsraSkgeworCQl2aXJ0X2Rldi0+ZXBzW2ldLmVwX3N0YXRlICY9IH5FUF9IQUxUX1BFTkRJTkc7CisJCWRlbF90aW1lcl9zeW5jKCZ2aXJ0X2Rldi0+ZXBzW2ldLnN0b3BfY21kX3RpbWVyKTsKKwl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmeGhjaS0+bG9jaywgZmxhZ3MpOwogCS8qIERvbid0IGRpc2FibGUgdGhlIHNsb3QgaWYgdGhlIGhvc3QgY29udHJvbGxlciBpcyBkZWFkLiAqLwogCXN0YXRlID0geGhjaV9yZWFkbCh4aGNpLCAmeGhjaS0+b3BfcmVncy0+c3RhdHVzKTsKLQlpZiAoc3RhdGUgPT0gMHhmZmZmZmZmZikgeworCWlmIChzdGF0ZSA9PSAweGZmZmZmZmZmIHx8ICh4aGNpLT54aGNfc3RhdGUgJiBYSENJX1NUQVRFX0RZSU5HKSkgewogCQl4aGNpX2ZyZWVfdmlydF9kZXZpY2UoeGhjaSwgdWRldi0+c2xvdF9pZCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnhoY2ktPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLW1lbS5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLW1lbS5jCmluZGV4IGI4ZmQyNzAuLmJmZmNlZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1tZW0uYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktbWVtLmMKQEAgLTEyNSw2ICsxMjUsMjMgQEAKIAlrZnJlZShyaW5nKTsKIH0KIAorc3RhdGljIHZvaWQgeGhjaV9pbml0aWFsaXplX3JpbmdfaW5mbyhzdHJ1Y3QgeGhjaV9yaW5nICpyaW5nKQoreworCS8qIFRoZSByaW5nIGlzIGVtcHR5LCBzbyB0aGUgZW5xdWV1ZSBwb2ludGVyID09IGRlcXVldWUgcG9pbnRlciAqLworCXJpbmctPmVucXVldWUgPSByaW5nLT5maXJzdF9zZWctPnRyYnM7CisJcmluZy0+ZW5xX3NlZyA9IHJpbmctPmZpcnN0X3NlZzsKKwlyaW5nLT5kZXF1ZXVlID0gcmluZy0+ZW5xdWV1ZTsKKwlyaW5nLT5kZXFfc2VnID0gcmluZy0+Zmlyc3Rfc2VnOworCS8qIFRoZSByaW5nIGlzIGluaXRpYWxpemVkIHRvIDAuIFRoZSBwcm9kdWNlciBtdXN0IHdyaXRlIDEgdG8gdGhlIGN5Y2xlCisJICogYml0IHRvIGhhbmRvdmVyIG93bmVyc2hpcCBvZiB0aGUgVFJCLCBzbyBQQ1MgPSAxLiAgVGhlIGNvbnN1bWVyIG11c3QKKwkgKiBjb21wYXJlIENDUyB0byB0aGUgY3ljbGUgYml0IHRvIGNoZWNrIG93bmVyc2hpcCwgc28gQ0NTID0gMS4KKwkgKi8KKwlyaW5nLT5jeWNsZV9zdGF0ZSA9IDE7CisJLyogTm90IG5lY2Vzc2FyeSBmb3IgbmV3IHJpbmdzLCBidXQgbmVlZGVkIGZvciByZS1pbml0aWFsaXplZCByaW5ncyAqLworCXJpbmctPmVucV91cGRhdGVzID0gMDsKKwlyaW5nLT5kZXFfdXBkYXRlcyA9IDA7Cit9CisKIC8qKgogICogQ3JlYXRlIGEgbmV3IHJpbmcgd2l0aCB6ZXJvIG9yIG1vcmUgc2VnbWVudHMuCiAgKgpAQCAtMTczLDE3ICsxOTAsNyBAQAogCQkJCSIgc2VnbWVudCAlcCAodmlydHVhbCksIDB4JWxseCAoRE1BKVxuIiwKIAkJCQlwcmV2LCAodW5zaWduZWQgbG9uZyBsb25nKXByZXYtPmRtYSk7CiAJfQotCS8qIFRoZSByaW5nIGlzIGVtcHR5LCBzbyB0aGUgZW5xdWV1ZSBwb2ludGVyID09IGRlcXVldWUgcG9pbnRlciAqLwotCXJpbmctPmVucXVldWUgPSByaW5nLT5maXJzdF9zZWctPnRyYnM7Ci0JcmluZy0+ZW5xX3NlZyA9IHJpbmctPmZpcnN0X3NlZzsKLQlyaW5nLT5kZXF1ZXVlID0gcmluZy0+ZW5xdWV1ZTsKLQlyaW5nLT5kZXFfc2VnID0gcmluZy0+Zmlyc3Rfc2VnOwotCS8qIFRoZSByaW5nIGlzIGluaXRpYWxpemVkIHRvIDAuIFRoZSBwcm9kdWNlciBtdXN0IHdyaXRlIDEgdG8gdGhlIGN5Y2xlCi0JICogYml0IHRvIGhhbmRvdmVyIG93bmVyc2hpcCBvZiB0aGUgVFJCLCBzbyBQQ1MgPSAxLiAgVGhlIGNvbnN1bWVyIG11c3QKLQkgKiBjb21wYXJlIENDUyB0byB0aGUgY3ljbGUgYml0IHRvIGNoZWNrIG93bmVyc2hpcCwgc28gQ0NTID0gMS4KLQkgKi8KLQlyaW5nLT5jeWNsZV9zdGF0ZSA9IDE7Ci0KKwl4aGNpX2luaXRpYWxpemVfcmluZ19pbmZvKHJpbmcpOwogCXJldHVybiByaW5nOwogCiBmYWlsOgpAQCAtMTkxLDYgKzE5OCwyNyBAQAogCXJldHVybiAwOwogfQogCisvKiBaZXJvIGFuIGVuZHBvaW50IHJpbmcgKGV4Y2VwdCBmb3IgbGluayBUUkJzKSBhbmQgbW92ZSB0aGUgZW5xdWV1ZSBhbmQgZGVxdWV1ZQorICogcG9pbnRlcnMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcmluZy4KKyAqLworc3RhdGljIHZvaWQgeGhjaV9yZWluaXRfY2FjaGVkX3Jpbmcoc3RydWN0IHhoY2lfaGNkICp4aGNpLAorCQlzdHJ1Y3QgeGhjaV9yaW5nICpyaW5nKQoreworCXN0cnVjdCB4aGNpX3NlZ21lbnQJKnNlZyA9IHJpbmctPmZpcnN0X3NlZzsKKwlkbyB7CisJCW1lbXNldChzZWctPnRyYnMsIDAsCisJCQkJc2l6ZW9mKHVuaW9uIHhoY2lfdHJiKSpUUkJTX1BFUl9TRUdNRU5UKTsKKwkJLyogQWxsIGVuZHBvaW50IHJpbmdzIGhhdmUgbGluayBUUkJzICovCisJCXhoY2lfbGlua19zZWdtZW50cyh4aGNpLCBzZWcsIHNlZy0+bmV4dCwgMSk7CisJCXNlZyA9IHNlZy0+bmV4dDsKKwl9IHdoaWxlIChzZWcgIT0gcmluZy0+Zmlyc3Rfc2VnKTsKKwl4aGNpX2luaXRpYWxpemVfcmluZ19pbmZvKHJpbmcpOworCS8qIHRkIGxpc3Qgc2hvdWxkIGJlIGVtcHR5IHNpbmNlIGFsbCBVUkJzIGhhdmUgYmVlbiBjYW5jZWxsZWQsCisJICogYnV0IGp1c3QgaW4gY2FzZS4uLgorCSAqLworCUlOSVRfTElTVF9IRUFEKCZyaW5nLT50ZF9saXN0KTsKK30KKwogI2RlZmluZSBDVFhfU0laRShfaGNjKSAoSENDXzY0QllURV9DT05URVhUKF9oY2MpID8gNjQgOiAzMikKIAogc3RydWN0IHhoY2lfY29udGFpbmVyX2N0eCAqeGhjaV9hbGxvY19jb250YWluZXJfY3R4KHN0cnVjdCB4aGNpX2hjZCAqeGhjaSwKQEAgLTI0OCw2ICsyNzYsMTUgQEAKIAkJKGN0eC0+Ynl0ZXMgKyAoZXBfaW5kZXggKiBDVFhfU0laRSh4aGNpLT5oY2NfcGFyYW1zKSkpOwogfQogCitzdGF0aWMgdm9pZCB4aGNpX2luaXRfZW5kcG9pbnRfdGltZXIoc3RydWN0IHhoY2lfaGNkICp4aGNpLAorCQlzdHJ1Y3QgeGhjaV92aXJ0X2VwICplcCkKK3sKKwlpbml0X3RpbWVyKCZlcC0+c3RvcF9jbWRfdGltZXIpOworCWVwLT5zdG9wX2NtZF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGVwOworCWVwLT5zdG9wX2NtZF90aW1lci5mdW5jdGlvbiA9IHhoY2lfc3RvcF9lbmRwb2ludF9jb21tYW5kX3dhdGNoZG9nOworCWVwLT54aGNpID0geGhjaTsKK30KKwogLyogQWxsIHRoZSB4aGNpX3RkcyBpbiB0aGUgcmluZydzIFREIGxpc3Qgc2hvdWxkIGJlIGZyZWVkIGF0IHRoaXMgcG9pbnQgKi8KIHZvaWQgeGhjaV9mcmVlX3ZpcnRfZGV2aWNlKHN0cnVjdCB4aGNpX2hjZCAqeGhjaSwgaW50IHNsb3RfaWQpCiB7CkBAIC0yNjcsNiArMzA0LDEyIEBACiAJCWlmIChkZXYtPmVwc1tpXS5yaW5nKQogCQkJeGhjaV9yaW5nX2ZyZWUoeGhjaSwgZGV2LT5lcHNbaV0ucmluZyk7CiAKKwlpZiAoZGV2LT5yaW5nX2NhY2hlKSB7CisJCWZvciAoaSA9IDA7IGkgPCBkZXYtPm51bV9yaW5nc19jYWNoZWQ7IGkrKykKKwkJCXhoY2lfcmluZ19mcmVlKHhoY2ksIGRldi0+cmluZ19jYWNoZVtpXSk7CisJCWtmcmVlKGRldi0+cmluZ19jYWNoZSk7CisJfQorCiAJaWYgKGRldi0+aW5fY3R4KQogCQl4aGNpX2ZyZWVfY29udGFpbmVyX2N0eCh4aGNpLCBkZXYtPmluX2N0eCk7CiAJaWYgKGRldi0+b3V0X2N0eCkKQEAgLTMwOSwxNSArMzUyLDI1IEBACiAJeGhjaV9kYmcoeGhjaSwgIlNsb3QgJWQgaW5wdXQgY3R4ID0gMHglbGx4IChkbWEpXG4iLCBzbG90X2lkLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylkZXYtPmluX2N0eC0+ZG1hKTsKIAotCS8qIEluaXRpYWxpemUgdGhlIGNhbmNlbGxhdGlvbiBsaXN0IGZvciBlYWNoIGVuZHBvaW50ICovCi0JZm9yIChpID0gMDsgaSA8IDMxOyBpKyspCisJLyogSW5pdGlhbGl6ZSB0aGUgY2FuY2VsbGF0aW9uIGxpc3QgYW5kIHdhdGNoZG9nIHRpbWVycyBmb3IgZWFjaCBlcCAqLworCWZvciAoaSA9IDA7IGkgPCAzMTsgaSsrKSB7CisJCXhoY2lfaW5pdF9lbmRwb2ludF90aW1lcih4aGNpLCAmZGV2LT5lcHNbaV0pOwogCQlJTklUX0xJU1RfSEVBRCgmZGV2LT5lcHNbaV0uY2FuY2VsbGVkX3RkX2xpc3QpOworCX0KIAogCS8qIEFsbG9jYXRlIGVuZHBvaW50IDAgcmluZyAqLwogCWRldi0+ZXBzWzBdLnJpbmcgPSB4aGNpX3JpbmdfYWxsb2MoeGhjaSwgMSwgdHJ1ZSwgZmxhZ3MpOwogCWlmICghZGV2LT5lcHNbMF0ucmluZykKIAkJZ290byBmYWlsOwogCisJLyogQWxsb2NhdGUgcG9pbnRlcnMgdG8gdGhlIHJpbmcgY2FjaGUgKi8KKwlkZXYtPnJpbmdfY2FjaGUgPSBremFsbG9jKAorCQkJc2l6ZW9mKHN0cnVjdCB4aGNpX3JpbmcgKikqWEhDSV9NQVhfUklOR1NfQ0FDSEVELAorCQkJZmxhZ3MpOworCWlmICghZGV2LT5yaW5nX2NhY2hlKQorCQlnb3RvIGZhaWw7CisJZGV2LT5udW1fcmluZ3NfY2FjaGVkID0gMDsKKwogCWluaXRfY29tcGxldGlvbigmZGV2LT5jbWRfY29tcGxldGlvbik7CiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+Y21kX2xpc3QpOwogCkBAIC01NDQsOCArNTk3LDE2IEBACiAJLyogU2V0IHVwIHRoZSBlbmRwb2ludCByaW5nICovCiAJdmlydF9kZXYtPmVwc1tlcF9pbmRleF0ubmV3X3JpbmcgPQogCQl4aGNpX3JpbmdfYWxsb2MoeGhjaSwgMSwgdHJ1ZSwgbWVtX2ZsYWdzKTsKLQlpZiAoIXZpcnRfZGV2LT5lcHNbZXBfaW5kZXhdLm5ld19yaW5nKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoIXZpcnRfZGV2LT5lcHNbZXBfaW5kZXhdLm5ld19yaW5nKSB7CisJCS8qIEF0dGVtcHQgdG8gdXNlIHRoZSByaW5nIGNhY2hlICovCisJCWlmICh2aXJ0X2Rldi0+bnVtX3JpbmdzX2NhY2hlZCA9PSAwKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXZpcnRfZGV2LT5lcHNbZXBfaW5kZXhdLm5ld19yaW5nID0KKwkJCXZpcnRfZGV2LT5yaW5nX2NhY2hlW3ZpcnRfZGV2LT5udW1fcmluZ3NfY2FjaGVkXTsKKwkJdmlydF9kZXYtPnJpbmdfY2FjaGVbdmlydF9kZXYtPm51bV9yaW5nc19jYWNoZWRdID0gTlVMTDsKKwkJdmlydF9kZXYtPm51bV9yaW5nc19jYWNoZWQtLTsKKwkJeGhjaV9yZWluaXRfY2FjaGVkX3JpbmcoeGhjaSwgdmlydF9kZXYtPmVwc1tlcF9pbmRleF0ubmV3X3JpbmcpOworCX0KIAllcF9yaW5nID0gdmlydF9kZXYtPmVwc1tlcF9pbmRleF0ubmV3X3Jpbmc7CiAJZXBfY3R4LT5kZXEgPSBlcF9yaW5nLT5maXJzdF9zZWctPmRtYSB8IGVwX3JpbmctPmN5Y2xlX3N0YXRlOwogCkBAIC03NjgsMTQgKzgyOSwxNyBAQAogCiAJY29tbWFuZC0+aW5fY3R4ID0KIAkJeGhjaV9hbGxvY19jb250YWluZXJfY3R4KHhoY2ksIFhIQ0lfQ1RYX1RZUEVfSU5QVVQsIG1lbV9mbGFncyk7Ci0JaWYgKCFjb21tYW5kLT5pbl9jdHgpCisJaWYgKCFjb21tYW5kLT5pbl9jdHgpIHsKKwkJa2ZyZWUoY29tbWFuZCk7CiAJCXJldHVybiBOVUxMOworCX0KIAogCWlmIChhbGxvY2F0ZV9jb21wbGV0aW9uKSB7CiAJCWNvbW1hbmQtPmNvbXBsZXRpb24gPQogCQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IGNvbXBsZXRpb24pLCBtZW1fZmxhZ3MpOwogCQlpZiAoIWNvbW1hbmQtPmNvbXBsZXRpb24pIHsKIAkJCXhoY2lfZnJlZV9jb250YWluZXJfY3R4KHhoY2ksIGNvbW1hbmQtPmluX2N0eCk7CisJCQlrZnJlZShjb21tYW5kKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCWluaXRfY29tcGxldGlvbihjb21tYW5kLT5jb21wbGV0aW9uKTsKQEAgLTg0OCw2ICs5MTIsMTYzIEBACiAJeGhjaS0+cGFnZV9zaGlmdCA9IDA7CiB9CiAKK3N0YXRpYyBpbnQgeGhjaV90ZXN0X3RyYl9pbl90ZChzdHJ1Y3QgeGhjaV9oY2QgKnhoY2ksCisJCXN0cnVjdCB4aGNpX3NlZ21lbnQgKmlucHV0X3NlZywKKwkJdW5pb24geGhjaV90cmIgKnN0YXJ0X3RyYiwKKwkJdW5pb24geGhjaV90cmIgKmVuZF90cmIsCisJCWRtYV9hZGRyX3QgaW5wdXRfZG1hLAorCQlzdHJ1Y3QgeGhjaV9zZWdtZW50ICpyZXN1bHRfc2VnLAorCQljaGFyICp0ZXN0X25hbWUsIGludCB0ZXN0X251bWJlcikKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnRfZG1hOworCXVuc2lnbmVkIGxvbmcgbG9uZyBlbmRfZG1hOworCXN0cnVjdCB4aGNpX3NlZ21lbnQgKnNlZzsKKworCXN0YXJ0X2RtYSA9IHhoY2lfdHJiX3ZpcnRfdG9fZG1hKGlucHV0X3NlZywgc3RhcnRfdHJiKTsKKwllbmRfZG1hID0geGhjaV90cmJfdmlydF90b19kbWEoaW5wdXRfc2VnLCBlbmRfdHJiKTsKKworCXNlZyA9IHRyYl9pbl90ZChpbnB1dF9zZWcsIHN0YXJ0X3RyYiwgZW5kX3RyYiwgaW5wdXRfZG1hKTsKKwlpZiAoc2VnICE9IHJlc3VsdF9zZWcpIHsKKwkJeGhjaV93YXJuKHhoY2ksICJXQVJOOiAlcyBUUkIgbWF0aCB0ZXN0ICVkIGZhaWxlZCFcbiIsCisJCQkJdGVzdF9uYW1lLCB0ZXN0X251bWJlcik7CisJCXhoY2lfd2Fybih4aGNpLCAiVGVzdGVkIFRSQiBtYXRoIHcvIHNlZyAlcCBhbmQgIgorCQkJCSJpbnB1dCBETUEgMHglbGx4XG4iLAorCQkJCWlucHV0X3NlZywKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKSBpbnB1dF9kbWEpOworCQl4aGNpX3dhcm4oeGhjaSwgInN0YXJ0aW5nIFRSQiAlcCAoMHglbGx4IERNQSksICIKKwkJCQkiZW5kaW5nIFRSQiAlcCAoMHglbGx4IERNQSlcbiIsCisJCQkJc3RhcnRfdHJiLCBzdGFydF9kbWEsCisJCQkJZW5kX3RyYiwgZW5kX2RtYSk7CisJCXhoY2lfd2Fybih4aGNpLCAiRXhwZWN0ZWQgc2VnICVwLCBnb3Qgc2VnICVwXG4iLAorCQkJCXJlc3VsdF9zZWcsIHNlZyk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFRSQiBtYXRoIGNoZWNrcyBmb3IgeGhjaV90cmJfaW5fdGQoKSwgdXNpbmcgdGhlIGNvbW1hbmQgYW5kIGV2ZW50IHJpbmdzLiAqLworc3RhdGljIGludCB4aGNpX2NoZWNrX3RyYl9pbl90ZF9tYXRoKHN0cnVjdCB4aGNpX2hjZCAqeGhjaSwgZ2ZwX3QgbWVtX2ZsYWdzKQoreworCXN0cnVjdCB7CisJCWRtYV9hZGRyX3QJCWlucHV0X2RtYTsKKwkJc3RydWN0IHhoY2lfc2VnbWVudAkqcmVzdWx0X3NlZzsKKwl9IHNpbXBsZV90ZXN0X3ZlY3RvciBbXSA9IHsKKwkJLyogQSB6ZXJvZWQgRE1BIGZpZWxkIHNob3VsZCBmYWlsICovCisJCXsgMCwgTlVMTCB9LAorCQkvKiBPbmUgVFJCIGJlZm9yZSB0aGUgcmluZyBzdGFydCBzaG91bGQgZmFpbCAqLworCQl7IHhoY2ktPmV2ZW50X3JpbmctPmZpcnN0X3NlZy0+ZG1hIC0gMTYsIE5VTEwgfSwKKwkJLyogT25lIGJ5dGUgYmVmb3JlIHRoZSByaW5nIHN0YXJ0IHNob3VsZCBmYWlsICovCisJCXsgeGhjaS0+ZXZlbnRfcmluZy0+Zmlyc3Rfc2VnLT5kbWEgLSAxLCBOVUxMIH0sCisJCS8qIFN0YXJ0aW5nIFRSQiBzaG91bGQgc3VjY2VlZCAqLworCQl7IHhoY2ktPmV2ZW50X3JpbmctPmZpcnN0X3NlZy0+ZG1hLCB4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWcgfSwKKwkJLyogRW5kaW5nIFRSQiBzaG91bGQgc3VjY2VlZCAqLworCQl7IHhoY2ktPmV2ZW50X3JpbmctPmZpcnN0X3NlZy0+ZG1hICsgKFRSQlNfUEVSX1NFR01FTlQgLSAxKSoxNiwKKwkJCXhoY2ktPmV2ZW50X3JpbmctPmZpcnN0X3NlZyB9LAorCQkvKiBPbmUgYnl0ZSBhZnRlciB0aGUgcmluZyBlbmQgc2hvdWxkIGZhaWwgKi8KKwkJeyB4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWctPmRtYSArIChUUkJTX1BFUl9TRUdNRU5UIC0gMSkqMTYgKyAxLCBOVUxMIH0sCisJCS8qIE9uZSBUUkIgYWZ0ZXIgdGhlIHJpbmcgZW5kIHNob3VsZCBmYWlsICovCisJCXsgeGhjaS0+ZXZlbnRfcmluZy0+Zmlyc3Rfc2VnLT5kbWEgKyAoVFJCU19QRVJfU0VHTUVOVCkqMTYsIE5VTEwgfSwKKwkJLyogQW4gYWRkcmVzcyBvZiBhbGwgb25lcyBzaG91bGQgZmFpbCAqLworCQl7IChkbWFfYWRkcl90KSAofjApLCBOVUxMIH0sCisJfTsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgeGhjaV9zZWdtZW50CSppbnB1dF9zZWc7CisJCXVuaW9uIHhoY2lfdHJiCQkqc3RhcnRfdHJiOworCQl1bmlvbiB4aGNpX3RyYgkJKmVuZF90cmI7CisJCWRtYV9hZGRyX3QJCWlucHV0X2RtYTsKKwkJc3RydWN0IHhoY2lfc2VnbWVudAkqcmVzdWx0X3NlZzsKKwl9IGNvbXBsZXhfdGVzdF92ZWN0b3IgW10gPSB7CisJCS8qIFRlc3QgZmVlZGluZyBhIHZhbGlkIERNQSBhZGRyZXNzIGZyb20gYSBkaWZmZXJlbnQgcmluZyAqLworCQl7CS5pbnB1dF9zZWcgPSB4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWcsCisJCQkuc3RhcnRfdHJiID0geGhjaS0+ZXZlbnRfcmluZy0+Zmlyc3Rfc2VnLT50cmJzLAorCQkJLmVuZF90cmIgPSAmeGhjaS0+ZXZlbnRfcmluZy0+Zmlyc3Rfc2VnLT50cmJzW1RSQlNfUEVSX1NFR01FTlQgLSAxXSwKKwkJCS5pbnB1dF9kbWEgPSB4aGNpLT5jbWRfcmluZy0+Zmlyc3Rfc2VnLT5kbWEsCisJCQkucmVzdWx0X3NlZyA9IE5VTEwsCisJCX0sCisJCS8qIFRlc3QgZmVlZGluZyBhIHZhbGlkIGVuZCBUUkIgZnJvbSBhIGRpZmZlcmVudCByaW5nICovCisJCXsJLmlucHV0X3NlZyA9IHhoY2ktPmV2ZW50X3JpbmctPmZpcnN0X3NlZywKKwkJCS5zdGFydF90cmIgPSB4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWctPnRyYnMsCisJCQkuZW5kX3RyYiA9ICZ4aGNpLT5jbWRfcmluZy0+Zmlyc3Rfc2VnLT50cmJzW1RSQlNfUEVSX1NFR01FTlQgLSAxXSwKKwkJCS5pbnB1dF9kbWEgPSB4aGNpLT5jbWRfcmluZy0+Zmlyc3Rfc2VnLT5kbWEsCisJCQkucmVzdWx0X3NlZyA9IE5VTEwsCisJCX0sCisJCS8qIFRlc3QgZmVlZGluZyBhIHZhbGlkIHN0YXJ0IGFuZCBlbmQgVFJCIGZyb20gYSBkaWZmZXJlbnQgcmluZyAqLworCQl7CS5pbnB1dF9zZWcgPSB4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWcsCisJCQkuc3RhcnRfdHJiID0geGhjaS0+Y21kX3JpbmctPmZpcnN0X3NlZy0+dHJicywKKwkJCS5lbmRfdHJiID0gJnhoY2ktPmNtZF9yaW5nLT5maXJzdF9zZWctPnRyYnNbVFJCU19QRVJfU0VHTUVOVCAtIDFdLAorCQkJLmlucHV0X2RtYSA9IHhoY2ktPmNtZF9yaW5nLT5maXJzdF9zZWctPmRtYSwKKwkJCS5yZXN1bHRfc2VnID0gTlVMTCwKKwkJfSwKKwkJLyogVFJCIGluIHRoaXMgcmluZywgYnV0IGFmdGVyIHRoaXMgVEQgKi8KKwkJewkuaW5wdXRfc2VnID0geGhjaS0+ZXZlbnRfcmluZy0+Zmlyc3Rfc2VnLAorCQkJLnN0YXJ0X3RyYiA9ICZ4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWctPnRyYnNbMF0sCisJCQkuZW5kX3RyYiA9ICZ4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWctPnRyYnNbM10sCisJCQkuaW5wdXRfZG1hID0geGhjaS0+ZXZlbnRfcmluZy0+Zmlyc3Rfc2VnLT5kbWEgKyA0KjE2LAorCQkJLnJlc3VsdF9zZWcgPSBOVUxMLAorCQl9LAorCQkvKiBUUkIgaW4gdGhpcyByaW5nLCBidXQgYmVmb3JlIHRoaXMgVEQgKi8KKwkJewkuaW5wdXRfc2VnID0geGhjaS0+ZXZlbnRfcmluZy0+Zmlyc3Rfc2VnLAorCQkJLnN0YXJ0X3RyYiA9ICZ4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWctPnRyYnNbM10sCisJCQkuZW5kX3RyYiA9ICZ4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWctPnRyYnNbNl0sCisJCQkuaW5wdXRfZG1hID0geGhjaS0+ZXZlbnRfcmluZy0+Zmlyc3Rfc2VnLT5kbWEgKyAyKjE2LAorCQkJLnJlc3VsdF9zZWcgPSBOVUxMLAorCQl9LAorCQkvKiBUUkIgaW4gdGhpcyByaW5nLCBidXQgYWZ0ZXIgdGhpcyB3cmFwcGVkIFREICovCisJCXsJLmlucHV0X3NlZyA9IHhoY2ktPmV2ZW50X3JpbmctPmZpcnN0X3NlZywKKwkJCS5zdGFydF90cmIgPSAmeGhjaS0+ZXZlbnRfcmluZy0+Zmlyc3Rfc2VnLT50cmJzW1RSQlNfUEVSX1NFR01FTlQgLSAzXSwKKwkJCS5lbmRfdHJiID0gJnhoY2ktPmV2ZW50X3JpbmctPmZpcnN0X3NlZy0+dHJic1sxXSwKKwkJCS5pbnB1dF9kbWEgPSB4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWctPmRtYSArIDIqMTYsCisJCQkucmVzdWx0X3NlZyA9IE5VTEwsCisJCX0sCisJCS8qIFRSQiBpbiB0aGlzIHJpbmcsIGJ1dCBiZWZvcmUgdGhpcyB3cmFwcGVkIFREICovCisJCXsJLmlucHV0X3NlZyA9IHhoY2ktPmV2ZW50X3JpbmctPmZpcnN0X3NlZywKKwkJCS5zdGFydF90cmIgPSAmeGhjaS0+ZXZlbnRfcmluZy0+Zmlyc3Rfc2VnLT50cmJzW1RSQlNfUEVSX1NFR01FTlQgLSAzXSwKKwkJCS5lbmRfdHJiID0gJnhoY2ktPmV2ZW50X3JpbmctPmZpcnN0X3NlZy0+dHJic1sxXSwKKwkJCS5pbnB1dF9kbWEgPSB4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWctPmRtYSArIChUUkJTX1BFUl9TRUdNRU5UIC0gNCkqMTYsCisJCQkucmVzdWx0X3NlZyA9IE5VTEwsCisJCX0sCisJCS8qIFRSQiBub3QgaW4gdGhpcyByaW5nLCBhbmQgd2UgaGF2ZSBhIHdyYXBwZWQgVEQgKi8KKwkJewkuaW5wdXRfc2VnID0geGhjaS0+ZXZlbnRfcmluZy0+Zmlyc3Rfc2VnLAorCQkJLnN0YXJ0X3RyYiA9ICZ4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWctPnRyYnNbVFJCU19QRVJfU0VHTUVOVCAtIDNdLAorCQkJLmVuZF90cmIgPSAmeGhjaS0+ZXZlbnRfcmluZy0+Zmlyc3Rfc2VnLT50cmJzWzFdLAorCQkJLmlucHV0X2RtYSA9IHhoY2ktPmNtZF9yaW5nLT5maXJzdF9zZWctPmRtYSArIDIqMTYsCisJCQkucmVzdWx0X3NlZyA9IE5VTEwsCisJCX0sCisJfTsKKworCXVuc2lnbmVkIGludCBudW1fdGVzdHM7CisJaW50IGksIHJldDsKKworCW51bV90ZXN0cyA9IHNpemVvZihzaW1wbGVfdGVzdF92ZWN0b3IpIC8gc2l6ZW9mKHNpbXBsZV90ZXN0X3ZlY3RvclswXSk7CisJZm9yIChpID0gMDsgaSA8IG51bV90ZXN0czsgaSsrKSB7CisJCXJldCA9IHhoY2lfdGVzdF90cmJfaW5fdGQoeGhjaSwKKwkJCQl4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWcsCisJCQkJeGhjaS0+ZXZlbnRfcmluZy0+Zmlyc3Rfc2VnLT50cmJzLAorCQkJCSZ4aGNpLT5ldmVudF9yaW5nLT5maXJzdF9zZWctPnRyYnNbVFJCU19QRVJfU0VHTUVOVCAtIDFdLAorCQkJCXNpbXBsZV90ZXN0X3ZlY3RvcltpXS5pbnB1dF9kbWEsCisJCQkJc2ltcGxlX3Rlc3RfdmVjdG9yW2ldLnJlc3VsdF9zZWcsCisJCQkJIlNpbXBsZSIsIGkpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJbnVtX3Rlc3RzID0gc2l6ZW9mKGNvbXBsZXhfdGVzdF92ZWN0b3IpIC8gc2l6ZW9mKGNvbXBsZXhfdGVzdF92ZWN0b3JbMF0pOworCWZvciAoaSA9IDA7IGkgPCBudW1fdGVzdHM7IGkrKykgeworCQlyZXQgPSB4aGNpX3Rlc3RfdHJiX2luX3RkKHhoY2ksCisJCQkJY29tcGxleF90ZXN0X3ZlY3RvcltpXS5pbnB1dF9zZWcsCisJCQkJY29tcGxleF90ZXN0X3ZlY3RvcltpXS5zdGFydF90cmIsCisJCQkJY29tcGxleF90ZXN0X3ZlY3RvcltpXS5lbmRfdHJiLAorCQkJCWNvbXBsZXhfdGVzdF92ZWN0b3JbaV0uaW5wdXRfZG1hLAorCQkJCWNvbXBsZXhfdGVzdF92ZWN0b3JbaV0ucmVzdWx0X3NlZywKKwkJCQkiQ29tcGxleCIsIGkpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCXhoY2lfZGJnKHhoY2ksICJUUkIgbWF0aCB0ZXN0cyBwYXNzZWQuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworCiBpbnQgeGhjaV9tZW1faW5pdChzdHJ1Y3QgeGhjaV9oY2QgKnhoY2ksIGdmcF90IGZsYWdzKQogewogCWRtYV9hZGRyX3QJZG1hOwpAQCAtOTUxLDYgKzExNzIsOCBAQAogCXhoY2ktPmV2ZW50X3JpbmcgPSB4aGNpX3JpbmdfYWxsb2MoeGhjaSwgRVJTVF9OVU1fU0VHUywgZmFsc2UsIGZsYWdzKTsKIAlpZiAoIXhoY2ktPmV2ZW50X3JpbmcpCiAJCWdvdG8gZmFpbDsKKwlpZiAoeGhjaV9jaGVja190cmJfaW5fdGRfbWF0aCh4aGNpLCBmbGFncykgPCAwKQorCQlnb3RvIGZhaWw7CiAKIAl4aGNpLT5lcnN0LmVudHJpZXMgPSBwY2lfYWxsb2NfY29uc2lzdGVudCh0b19wY2lfZGV2KGRldiksCiAJCQlzaXplb2Yoc3RydWN0IHhoY2lfZXJzdF9lbnRyeSkqRVJTVF9OVU1fU0VHUywgJmRtYSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGNpLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGNpLmMKaW5kZXggMDY1OTVlYy4uZTA5NzAwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLXBjaS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wY2kuYwpAQCAtNTQsNiArNTQsOCBAQAogCXN0cnVjdCBwY2lfZGV2CQkqcGRldiA9IHRvX3BjaV9kZXYoaGNkLT5zZWxmLmNvbnRyb2xsZXIpOwogCWludAkJCXJldHZhbDsKIAorCWhjZC0+c2VsZi5zZ190YWJsZXNpemUgPSBUUkJTX1BFUl9TRUdNRU5UIC0gMTsKKwogCXhoY2ktPmNhcF9yZWdzID0gaGNkLT5yZWdzOwogCXhoY2ktPm9wX3JlZ3MgPSBoY2QtPnJlZ3MgKwogCQlIQ19MRU5HVEgoeGhjaV9yZWFkbCh4aGNpLCAmeGhjaS0+Y2FwX3JlZ3MtPmhjX2NhcGJhc2UpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1yaW5nLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcmluZy5jCmluZGV4IDgyMWI3YjQuLmVlN2JjN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1yaW5nLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXJpbmcuYwpAQCAtMzA2LDcgKzMwNiw3IEBACiAJLyogRG9uJ3QgcmluZyB0aGUgZG9vcmJlbGwgZm9yIHRoaXMgZW5kcG9pbnQgaWYgdGhlcmUgYXJlIHBlbmRpbmcKIAkgKiBjYW5jZWxsYXRpb25zIGJlY2F1c2UgdGhlIHdlIGRvbid0IHdhbnQgdG8gaW50ZXJydXB0IHByb2Nlc3NpbmcuCiAJICovCi0JaWYgKCFlcC0+Y2FuY2Vsc19wZW5kaW5nICYmICEoZXBfc3RhdGUgJiBTRVRfREVRX1BFTkRJTkcpCisJaWYgKCEoZXBfc3RhdGUgJiBFUF9IQUxUX1BFTkRJTkcpICYmICEoZXBfc3RhdGUgJiBTRVRfREVRX1BFTkRJTkcpCiAJCQkmJiAhKGVwX3N0YXRlICYgRVBfSEFMVEVEKSkgewogCQlmaWVsZCA9IHhoY2lfcmVhZGwoeGhjaSwgZGJfYWRkcikgJiBEQl9NQVNLOwogCQl4aGNpX3dyaXRlbCh4aGNpLCBmaWVsZCB8IEVQSV9UT19EQihlcF9pbmRleCksIGRiX2FkZHIpOwpAQCAtNDc1LDYgKzQ3NSwzNSBAQAogCWVwLT5lcF9zdGF0ZSB8PSBTRVRfREVRX1BFTkRJTkc7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCB4aGNpX3N0b3Bfd2F0Y2hkb2dfdGltZXJfaW5faXJxKHN0cnVjdCB4aGNpX2hjZCAqeGhjaSwKKwkJc3RydWN0IHhoY2lfdmlydF9lcCAqZXApCit7CisJZXAtPmVwX3N0YXRlICY9IH5FUF9IQUxUX1BFTkRJTkc7CisJLyogQ2FuJ3QgZGVsX3RpbWVyX3N5bmMgaW4gaW50ZXJydXB0LCBzbyB3ZSBhdHRlbXB0IHRvIGNhbmNlbC4gIElmIHRoZQorCSAqIHRpbWVyIGlzIHJ1bm5pbmcgb24gYW5vdGhlciBDUFUsIHdlIGRvbid0IGRlY3JlbWVudCBzdG9wX2NtZHNfcGVuZGluZworCSAqIChzaW5jZSB3ZSBkaWRuJ3Qgc3VjY2Vzc2Z1bGx5IHN0b3AgdGhlIHdhdGNoZG9nIHRpbWVyKS4KKwkgKi8KKwlpZiAoZGVsX3RpbWVyKCZlcC0+c3RvcF9jbWRfdGltZXIpKQorCQllcC0+c3RvcF9jbWRzX3BlbmRpbmctLTsKK30KKworLyogTXVzdCBiZSBjYWxsZWQgd2l0aCB4aGNpLT5sb2NrIGhlbGQgaW4gaW50ZXJydXB0IGNvbnRleHQgKi8KK3N0YXRpYyB2b2lkIHhoY2lfZ2l2ZWJhY2tfdXJiX2luX2lycShzdHJ1Y3QgeGhjaV9oY2QgKnhoY2ksCisJCXN0cnVjdCB4aGNpX3RkICpjdXJfdGQsIGludCBzdGF0dXMsIGNoYXIgKmFkamVjdGl2ZSkKK3sKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0geGhjaV90b19oY2QoeGhjaSk7CisKKwljdXJfdGQtPnVyYi0+aGNwcml2ID0gTlVMTDsKKwl1c2JfaGNkX3VubGlua191cmJfZnJvbV9lcChoY2QsIGN1cl90ZC0+dXJiKTsKKwl4aGNpX2RiZyh4aGNpLCAiR2l2ZWJhY2sgJXMgVVJCICVwXG4iLCBhZGplY3RpdmUsIGN1cl90ZC0+dXJiKTsKKworCXNwaW5fdW5sb2NrKCZ4aGNpLT5sb2NrKTsKKwl1c2JfaGNkX2dpdmViYWNrX3VyYihoY2QsIGN1cl90ZC0+dXJiLCBzdGF0dXMpOworCWtmcmVlKGN1cl90ZCk7CisJc3Bpbl9sb2NrKCZ4aGNpLT5sb2NrKTsKKwl4aGNpX2RiZyh4aGNpLCAiJXMgVVJCIGdpdmVuIGJhY2tcbiIsIGFkamVjdGl2ZSk7Cit9CisKIC8qCiAgKiBXaGVuIHdlIGdldCBhIGNvbW1hbmQgY29tcGxldGlvbiBmb3IgYSBTdG9wIEVuZHBvaW50IENvbW1hbmQsIHdlIG5lZWQgdG8KICAqIHVubGluayBhbnkgY2FuY2VsbGVkIFREcyBmcm9tIHRoZSByaW5nLiAgVGhlcmUgYXJlIHR3byB3YXlzIHRvIGRvIHRoYXQ6CkBAIC00OTcsOSArNTI2LDYgQEAKIAlzdHJ1Y3QgeGhjaV90ZCAqbGFzdF91bmxpbmtlZF90ZDsKIAogCXN0cnVjdCB4aGNpX2RlcXVldWVfc3RhdGUgZGVxX3N0YXRlOwotI2lmZGVmIENPTkZJR19VU0JfSENEX1NUQVQKLQlrdGltZV90IHN0b3BfdGltZSA9IGt0aW1lX2dldCgpOwotI2VuZGlmCiAKIAltZW1zZXQoJmRlcV9zdGF0ZSwgMCwgc2l6ZW9mKGRlcV9zdGF0ZSkpOwogCXNsb3RfaWQgPSBUUkJfVE9fU0xPVF9JRCh0cmItPmdlbmVyaWMuZmllbGRbM10pOwpAQCAtNTA3LDggKzUzMywxMSBAQAogCWVwID0gJnhoY2ktPmRldnNbc2xvdF9pZF0tPmVwc1tlcF9pbmRleF07CiAJZXBfcmluZyA9IGVwLT5yaW5nOwogCi0JaWYgKGxpc3RfZW1wdHkoJmVwLT5jYW5jZWxsZWRfdGRfbGlzdCkpCisJaWYgKGxpc3RfZW1wdHkoJmVwLT5jYW5jZWxsZWRfdGRfbGlzdCkpIHsKKwkJeGhjaV9zdG9wX3dhdGNoZG9nX3RpbWVyX2luX2lycSh4aGNpLCBlcCk7CisJCXJpbmdfZXBfZG9vcmJlbGwoeGhjaSwgc2xvdF9pZCwgZXBfaW5kZXgpOwogCQlyZXR1cm47CisJfQogCiAJLyogRml4IHVwIHRoZSBlcCByaW5nIGZpcnN0LCBzbyBIVyBzdG9wcyBleGVjdXRpbmcgY2FuY2VsbGVkIFREcy4KIAkgKiBXZSBoYXZlIHRoZSB4SENJIGxvY2ssIHNvIG5vdGhpbmcgY2FuIG1vZGlmeSB0aGlzIGxpc3QgdW50aWwgd2UgZHJvcApAQCAtNTM1LDkgKzU2NCw5IEBACiAJCSAqIHRoZSBjYW5jZWxsZWQgVEQgbGlzdCBmb3IgVVJCIGNvbXBsZXRpb24gbGF0ZXIuCiAJCSAqLwogCQlsaXN0X2RlbCgmY3VyX3RkLT50ZF9saXN0KTsKLQkJZXAtPmNhbmNlbHNfcGVuZGluZy0tOwogCX0KIAlsYXN0X3VubGlua2VkX3RkID0gY3VyX3RkOworCXhoY2lfc3RvcF93YXRjaGRvZ190aW1lcl9pbl9pcnEoeGhjaSwgZXApOwogCiAJLyogSWYgbmVjZXNzYXJ5LCBxdWV1ZSBhIFNldCBUcmFuc2ZlciBSaW5nIERlcXVldWUgUG9pbnRlciBjb21tYW5kICovCiAJaWYgKGRlcV9zdGF0ZS5uZXdfZGVxX3B0ciAmJiBkZXFfc3RhdGUubmV3X2RlcV9zZWcpIHsKQEAgLTU2MSwyNyArNTkwLDEzNiBAQAogCQlsaXN0X2RlbCgmY3VyX3RkLT5jYW5jZWxsZWRfdGRfbGlzdCk7CiAKIAkJLyogQ2xlYW4gdXAgdGhlIGNhbmNlbGxlZCBVUkIgKi8KLSNpZmRlZiBDT05GSUdfVVNCX0hDRF9TVEFUCi0JCWhjZF9zdGF0X3VwZGF0ZSh4aGNpLT50cF9zdGF0LCBjdXJfdGQtPnVyYi0+YWN0dWFsX2xlbmd0aCwKLQkJCQlrdGltZV9zdWIoc3RvcF90aW1lLCBjdXJfdGQtPnN0YXJ0X3RpbWUpKTsKLSNlbmRpZgotCQljdXJfdGQtPnVyYi0+aGNwcml2ID0gTlVMTDsKLQkJdXNiX2hjZF91bmxpbmtfdXJiX2Zyb21fZXAoeGhjaV90b19oY2QoeGhjaSksIGN1cl90ZC0+dXJiKTsKLQotCQl4aGNpX2RiZyh4aGNpLCAiR2l2ZWJhY2sgY2FuY2VsbGVkIFVSQiAlcFxuIiwgY3VyX3RkLT51cmIpOwotCQlzcGluX3VubG9jaygmeGhjaS0+bG9jayk7CiAJCS8qIERvZXNuJ3QgbWF0dGVyIHdoYXQgd2UgcGFzcyBmb3Igc3RhdHVzLCBzaW5jZSB0aGUgY29yZSB3aWxsCiAJCSAqIGp1c3Qgb3ZlcndyaXRlIGl0IChiZWNhdXNlIHRoZSBVUkIgaGFzIGJlZW4gdW5saW5rZWQpLgogCQkgKi8KLQkJdXNiX2hjZF9naXZlYmFja191cmIoeGhjaV90b19oY2QoeGhjaSksIGN1cl90ZC0+dXJiLCAwKTsKLQkJa2ZyZWUoY3VyX3RkKTsKKwkJeGhjaV9naXZlYmFja191cmJfaW5faXJxKHhoY2ksIGN1cl90ZCwgMCwgImNhbmNlbGxlZCIpOwogCi0JCXNwaW5fbG9jaygmeGhjaS0+bG9jayk7CisJCS8qIFN0b3AgcHJvY2Vzc2luZyB0aGUgY2FuY2VsbGVkIGxpc3QgaWYgdGhlIHdhdGNoZG9nIHRpbWVyIGlzCisJCSAqIHJ1bm5pbmcuCisJCSAqLworCQlpZiAoeGhjaS0+eGhjX3N0YXRlICYgWEhDSV9TVEFURV9EWUlORykKKwkJCXJldHVybjsKIAl9IHdoaWxlIChjdXJfdGQgIT0gbGFzdF91bmxpbmtlZF90ZCk7CiAKIAkvKiBSZXR1cm4gdG8gdGhlIGV2ZW50IGhhbmRsZXIgd2l0aCB4aGNpLT5sb2NrIHJlLWFjcXVpcmVkICovCiB9CiAKKy8qIFdhdGNoZG9nIHRpbWVyIGZ1bmN0aW9uIGZvciB3aGVuIGEgc3RvcCBlbmRwb2ludCBjb21tYW5kIGZhaWxzIHRvIGNvbXBsZXRlLgorICogSW4gdGhpcyBjYXNlLCB3ZSBhc3N1bWUgdGhlIGhvc3QgY29udHJvbGxlciBpcyBicm9rZW4gb3IgZHlpbmcgb3IgZGVhZC4gIFRoZQorICogaG9zdCBtYXkgc3RpbGwgYmUgY29tcGxldGluZyBzb21lIG90aGVyIGV2ZW50cywgc28gd2UgaGF2ZSB0byBiZSBjYXJlZnVsIHRvCisgKiBsZXQgdGhlIGV2ZW50IHJpbmcgaGFuZGxlciBhbmQgdGhlIFVSQiBkZXF1ZXVlaW5nL2VucXVldWVpbmcgZnVuY3Rpb25zIGtub3cKKyAqIHRocm91Z2ggeGhjaS0+c3RhdGUuCisgKgorICogVGhlIHRpbWVyIG1heSBhbHNvIGZpcmUgaWYgdGhlIGhvc3QgdGFrZXMgYSB2ZXJ5IGxvbmcgdGltZSB0byByZXNwb25kIHRvIHRoZQorICogY29tbWFuZCwgYW5kIHRoZSBzdG9wIGVuZHBvaW50IGNvbW1hbmQgY29tcGxldGlvbiBoYW5kbGVyIGNhbm5vdCBkZWxldGUgdGhlCisgKiB0aW1lciBiZWZvcmUgdGhlIHRpbWVyIGZ1bmN0aW9uIGlzIGNhbGxlZC4gIEFub3RoZXIgZW5kcG9pbnQgY2FuY2VsbGF0aW9uIG1heQorICogc25lYWsgaW4gYmVmb3JlIHRoZSB0aW1lciBmdW5jdGlvbiBjYW4gZ3JhYiB0aGUgbG9jaywgYW5kIHRoYXQgbWF5IHF1ZXVlCisgKiBhbm90aGVyIHN0b3AgZW5kcG9pbnQgY29tbWFuZCBhbmQgYWRkIHRoZSB0aW1lciBiYWNrLiAgU28gd2UgY2Fubm90IHVzZSBhCisgKiBzaW1wbGUgZmxhZyB0byBzYXkgd2hldGhlciB0aGVyZSBpcyBhIHBlbmRpbmcgc3RvcCBlbmRwb2ludCBjb21tYW5kIGZvciBhCisgKiBwYXJ0aWN1bGFyIGVuZHBvaW50LgorICoKKyAqIEluc3RlYWQgd2UgdXNlIGEgY29tYmluYXRpb24gb2YgdGhhdCBmbGFnIGFuZCBhIGNvdW50ZXIgZm9yIHRoZSBudW1iZXIgb2YKKyAqIHBlbmRpbmcgc3RvcCBlbmRwb2ludCBjb21tYW5kcy4gIElmIHRoZSB0aW1lciBpcyB0aGUgdGFpbCBlbmQgb2YgdGhlIGxhc3QKKyAqIHN0b3AgZW5kcG9pbnQgY29tbWFuZCwgYW5kIHRoZSBlbmRwb2ludCdzIGNvbW1hbmQgaXMgc3RpbGwgcGVuZGluZywgd2UgYXNzdW1lCisgKiB0aGUgaG9zdCBpcyBkeWluZy4KKyAqLwordm9pZCB4aGNpX3N0b3BfZW5kcG9pbnRfY29tbWFuZF93YXRjaGRvZyh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgeGhjaV9oY2QgKnhoY2k7CisJc3RydWN0IHhoY2lfdmlydF9lcCAqZXA7CisJc3RydWN0IHhoY2lfdmlydF9lcCAqdGVtcF9lcDsKKwlzdHJ1Y3QgeGhjaV9yaW5nICpyaW5nOworCXN0cnVjdCB4aGNpX3RkICpjdXJfdGQ7CisJaW50IHJldCwgaSwgajsKKworCWVwID0gKHN0cnVjdCB4aGNpX3ZpcnRfZXAgKikgYXJnOworCXhoY2kgPSBlcC0+eGhjaTsKKworCXNwaW5fbG9jaygmeGhjaS0+bG9jayk7CisKKwllcC0+c3RvcF9jbWRzX3BlbmRpbmctLTsKKwlpZiAoeGhjaS0+eGhjX3N0YXRlICYgWEhDSV9TVEFURV9EWUlORykgeworCQl4aGNpX2RiZyh4aGNpLCAiU3RvcCBFUCB0aW1lciByYW4sIGJ1dCBhbm90aGVyIHRpbWVyIG1hcmtlZCAiCisJCQkJInhIQ0kgYXMgRFlJTkcsIGV4aXRpbmcuXG4iKTsKKwkJc3Bpbl91bmxvY2soJnhoY2ktPmxvY2spOworCQlyZXR1cm47CisJfQorCWlmICghKGVwLT5zdG9wX2NtZHNfcGVuZGluZyA9PSAwICYmIChlcC0+ZXBfc3RhdGUgJiBFUF9IQUxUX1BFTkRJTkcpKSkgeworCQl4aGNpX2RiZyh4aGNpLCAiU3RvcCBFUCB0aW1lciByYW4sIGJ1dCBubyBjb21tYW5kIHBlbmRpbmcsICIKKwkJCQkiZXhpdGluZy5cbiIpOworCQlzcGluX3VubG9jaygmeGhjaS0+bG9jayk7CisJCXJldHVybjsKKwl9CisKKwl4aGNpX3dhcm4oeGhjaSwgInhIQ0kgaG9zdCBub3QgcmVzcG9uZGluZyB0byBzdG9wIGVuZHBvaW50IGNvbW1hbmQuXG4iKTsKKwl4aGNpX3dhcm4oeGhjaSwgIkFzc3VtaW5nIGhvc3QgaXMgZHlpbmcsIGhhbHRpbmcgaG9zdC5cbiIpOworCS8qIE9vcHMsIEhDIGlzIGRlYWQgb3IgZHlpbmcgb3IgYXQgbGVhc3Qgbm90IHJlc3BvbmRpbmcgdG8gdGhlIHN0b3AKKwkgKiBlbmRwb2ludCBjb21tYW5kLgorCSAqLworCXhoY2ktPnhoY19zdGF0ZSB8PSBYSENJX1NUQVRFX0RZSU5HOworCS8qIERpc2FibGUgaW50ZXJydXB0cyBmcm9tIHRoZSBob3N0IGNvbnRyb2xsZXIgYW5kIHN0YXJ0IGhhbHRpbmcgaXQgKi8KKwl4aGNpX3F1aWVzY2UoeGhjaSk7CisJc3Bpbl91bmxvY2soJnhoY2ktPmxvY2spOworCisJcmV0ID0geGhjaV9oYWx0KHhoY2kpOworCisJc3Bpbl9sb2NrKCZ4aGNpLT5sb2NrKTsKKwlpZiAocmV0IDwgMCkgeworCQkvKiBUaGlzIGlzIGJhZDsgdGhlIGhvc3QgaXMgbm90IHJlc3BvbmRpbmcgdG8gY29tbWFuZHMgYW5kIGl0J3MKKwkJICogbm90IGFsbG93aW5nIGl0c2VsZiB0byBiZSBoYWx0ZWQuICBBdCBsZWFzdCBpbnRlcnJ1cHRzIGFyZQorCQkgKiBkaXNhYmxlZCwgc28gd2UgY2FuIHNldCBIQ19TVEFURV9IQUxUIGFuZCBub3RpZnkgdGhlCisJCSAqIFVTQiBjb3JlLiAgQnV0IGlmIHdlIGNhbGwgdXNiX2hjX2RpZWQoKSwgaXQgd2lsbCBhdHRlbXB0IHRvCisJCSAqIGRpc2Nvbm5lY3QgYWxsIGRldmljZSBkcml2ZXJzIHVuZGVyIHRoaXMgaG9zdC4gIFRob3NlCisJCSAqIGRpc2Nvbm5lY3QoKSBtZXRob2RzIHdpbGwgd2FpdCBmb3IgYWxsIFVSQnMgdG8gYmUgdW5saW5rZWQsCisJCSAqIHNvIHdlIG11c3QgY29tcGxldGUgdGhlbS4KKwkJICovCisJCXhoY2lfd2Fybih4aGNpLCAiTm9uLXJlc3BvbnNpdmUgeEhDSSBob3N0IGlzIG5vdCBoYWx0aW5nLlxuIik7CisJCXhoY2lfd2Fybih4aGNpLCAiQ29tcGxldGluZyBhY3RpdmUgVVJCcyBhbnl3YXkuXG4iKTsKKwkJLyogV2UgY291bGQgdHVybiBhbGwgVERzIG9uIHRoZSByaW5ncyB0byBuby1vcHMuICBUaGlzIHdvbid0CisJCSAqIGhlbHAgaWYgdGhlIGhvc3QgaGFzIGNhY2hlZCBwYXJ0IG9mIHRoZSByaW5nLCBhbmQgaXMgc2xvdyBpZgorCQkgKiB3ZSB3YW50IHRvIHByZXNlcnZlIHRoZSBjeWNsZSBiaXQuICBTa2lwIGl0IGFuZCBob3BlIHRoZSBob3N0CisJCSAqIGRvZXNuJ3QgdG91Y2ggdGhlIG1lbW9yeS4KKwkJICovCisJfQorCWZvciAoaSA9IDA7IGkgPCBNQVhfSENfU0xPVFM7IGkrKykgeworCQlpZiAoIXhoY2ktPmRldnNbaV0pCisJCQljb250aW51ZTsKKwkJZm9yIChqID0gMDsgaiA8IDMxOyBqKyspIHsKKwkJCXRlbXBfZXAgPSAmeGhjaS0+ZGV2c1tpXS0+ZXBzW2pdOworCQkJcmluZyA9IHRlbXBfZXAtPnJpbmc7CisJCQlpZiAoIXJpbmcpCisJCQkJY29udGludWU7CisJCQl4aGNpX2RiZyh4aGNpLCAiS2lsbGluZyBVUkJzIGZvciBzbG90IElEICV1LCAiCisJCQkJCSJlcCBpbmRleCAldVxuIiwgaSwgaik7CisJCQl3aGlsZSAoIWxpc3RfZW1wdHkoJnJpbmctPnRkX2xpc3QpKSB7CisJCQkJY3VyX3RkID0gbGlzdF9maXJzdF9lbnRyeSgmcmluZy0+dGRfbGlzdCwKKwkJCQkJCXN0cnVjdCB4aGNpX3RkLAorCQkJCQkJdGRfbGlzdCk7CisJCQkJbGlzdF9kZWwoJmN1cl90ZC0+dGRfbGlzdCk7CisJCQkJaWYgKCFsaXN0X2VtcHR5KCZjdXJfdGQtPmNhbmNlbGxlZF90ZF9saXN0KSkKKwkJCQkJbGlzdF9kZWwoJmN1cl90ZC0+Y2FuY2VsbGVkX3RkX2xpc3QpOworCQkJCXhoY2lfZ2l2ZWJhY2tfdXJiX2luX2lycSh4aGNpLCBjdXJfdGQsCisJCQkJCQktRVNIVVRET1dOLCAia2lsbGVkIik7CisJCQl9CisJCQl3aGlsZSAoIWxpc3RfZW1wdHkoJnRlbXBfZXAtPmNhbmNlbGxlZF90ZF9saXN0KSkgeworCQkJCWN1cl90ZCA9IGxpc3RfZmlyc3RfZW50cnkoCisJCQkJCQkmdGVtcF9lcC0+Y2FuY2VsbGVkX3RkX2xpc3QsCisJCQkJCQlzdHJ1Y3QgeGhjaV90ZCwKKwkJCQkJCWNhbmNlbGxlZF90ZF9saXN0KTsKKwkJCQlsaXN0X2RlbCgmY3VyX3RkLT5jYW5jZWxsZWRfdGRfbGlzdCk7CisJCQkJeGhjaV9naXZlYmFja191cmJfaW5faXJxKHhoY2ksIGN1cl90ZCwKKwkJCQkJCS1FU0hVVERPV04sICJraWxsZWQiKTsKKwkJCX0KKwkJfQorCX0KKwlzcGluX3VubG9jaygmeGhjaS0+bG9jayk7CisJeGhjaV90b19oY2QoeGhjaSktPnN0YXRlID0gSENfU1RBVEVfSEFMVDsKKwl4aGNpX2RiZyh4aGNpLCAiQ2FsbGluZyB1c2JfaGNfZGllZCgpXG4iKTsKKwl1c2JfaGNfZGllZCh4aGNpX3RvX2hjZCh4aGNpKSk7CisJeGhjaV9kYmcoeGhjaSwgInhIQ0kgaG9zdCBjb250cm9sbGVyIGlzIGRlYWQuXG4iKTsKK30KKwogLyoKICAqIFdoZW4gd2UgZ2V0IGEgY29tcGxldGlvbiBmb3IgYSBTZXQgVHJhbnNmZXIgUmluZyBEZXF1ZXVlIFBvaW50ZXIgY29tbWFuZCwKICAqIHdlIG5lZWQgdG8gY2xlYXIgdGhlIHNldCBkZXEgcGVuZGluZyBmbGFnIGluIHRoZSBlbmRwb2ludCByaW5nIHN0YXRlLCBzbyB0aGF0CkBAIC03NjUsMjggKzkwMywzMiBAQAogCQkJCXZpcnRfZGV2LT5pbl9jdHgpOwogCQkvKiBJbnB1dCBjdHggYWRkX2ZsYWdzIGFyZSB0aGUgZW5kcG9pbnQgaW5kZXggcGx1cyBvbmUgKi8KIAkJZXBfaW5kZXggPSB4aGNpX2xhc3RfdmFsaWRfZW5kcG9pbnQoY3RybF9jdHgtPmFkZF9mbGFncykgLSAxOwotCQllcF9yaW5nID0geGhjaS0+ZGV2c1tzbG90X2lkXS0+ZXBzW2VwX2luZGV4XS5yaW5nOwotCQlpZiAoIWVwX3JpbmcpIHsKLQkJCS8qIFRoaXMgbXVzdCBoYXZlIGJlZW4gYW4gaW5pdGlhbCBjb25maWd1cmUgZW5kcG9pbnQgKi8KLQkJCXhoY2ktPmRldnNbc2xvdF9pZF0tPmNtZF9zdGF0dXMgPQotCQkJCUdFVF9DT01QX0NPREUoZXZlbnQtPnN0YXR1cyk7Ci0JCQljb21wbGV0ZSgmeGhjaS0+ZGV2c1tzbG90X2lkXS0+Y21kX2NvbXBsZXRpb24pOwotCQkJYnJlYWs7Ci0JCX0KLQkJZXBfc3RhdGUgPSB4aGNpLT5kZXZzW3Nsb3RfaWRdLT5lcHNbZXBfaW5kZXhdLmVwX3N0YXRlOwotCQl4aGNpX2RiZyh4aGNpLCAiQ29tcGxldGVkIGNvbmZpZyBlcCBjbWQgLSBsYXN0IGVwIGluZGV4ID0gJWQsICIKLQkJCQkic3RhdGUgPSAlZFxuIiwgZXBfaW5kZXgsIGVwX3N0YXRlKTsKKwkJLyogQSB1c2Jfc2V0X2ludGVyZmFjZSgpIGNhbGwgZGlyZWN0bHkgYWZ0ZXIgY2xlYXJpbmcgYSBoYWx0ZWQKKwkJICogY29uZGl0aW9uIG1heSByYWNlIG9uIHRoaXMgcXVpcmt5IGhhcmR3YXJlLgorCQkgKiBOb3Qgd29ydGggd29ycnlpbmcgYWJvdXQsIHNpbmNlIHRoaXMgaXMgcHJvdG90eXBlIGhhcmR3YXJlLgorCQkgKi8KIAkJaWYgKHhoY2ktPnF1aXJrcyAmIFhIQ0lfUkVTRVRfRVBfUVVJUksgJiYKLQkJCQllcF9zdGF0ZSAmIEVQX0hBTFRFRCkgeworCQkJCWVwX2luZGV4ICE9ICh1bnNpZ25lZCBpbnQpIC0xICYmCisJCQkJY3RybF9jdHgtPmFkZF9mbGFncyAtIFNMT1RfRkxBRyA9PQorCQkJCQljdHJsX2N0eC0+ZHJvcF9mbGFncykgeworCQkJZXBfcmluZyA9IHhoY2ktPmRldnNbc2xvdF9pZF0tPmVwc1tlcF9pbmRleF0ucmluZzsKKwkJCWVwX3N0YXRlID0geGhjaS0+ZGV2c1tzbG90X2lkXS0+ZXBzW2VwX2luZGV4XS5lcF9zdGF0ZTsKKwkJCWlmICghKGVwX3N0YXRlICYgRVBfSEFMVEVEKSkKKwkJCQlnb3RvIGJhbmR3aWR0aF9jaGFuZ2U7CisJCQl4aGNpX2RiZyh4aGNpLCAiQ29tcGxldGVkIGNvbmZpZyBlcCBjbWQgLSAiCisJCQkJCSJsYXN0IGVwIGluZGV4ID0gJWQsIHN0YXRlID0gJWRcbiIsCisJCQkJCWVwX2luZGV4LCBlcF9zdGF0ZSk7CiAJCQkvKiBDbGVhciBvdXIgaW50ZXJuYWwgaGFsdGVkIHN0YXRlIGFuZCByZXN0YXJ0IHJpbmcgKi8KIAkJCXhoY2ktPmRldnNbc2xvdF9pZF0tPmVwc1tlcF9pbmRleF0uZXBfc3RhdGUgJj0KIAkJCQl+RVBfSEFMVEVEOwogCQkJcmluZ19lcF9kb29yYmVsbCh4aGNpLCBzbG90X2lkLCBlcF9pbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQl4aGNpLT5kZXZzW3Nsb3RfaWRdLT5jbWRfc3RhdHVzID0KLQkJCQlHRVRfQ09NUF9DT0RFKGV2ZW50LT5zdGF0dXMpOwotCQkJY29tcGxldGUoJnhoY2ktPmRldnNbc2xvdF9pZF0tPmNtZF9jb21wbGV0aW9uKTsKKwkJCWJyZWFrOwogCQl9CitiYW5kd2lkdGhfY2hhbmdlOgorCQl4aGNpX2RiZyh4aGNpLCAiQ29tcGxldGVkIGNvbmZpZyBlcCBjbWRcbiIpOworCQl4aGNpLT5kZXZzW3Nsb3RfaWRdLT5jbWRfc3RhdHVzID0KKwkJCUdFVF9DT01QX0NPREUoZXZlbnQtPnN0YXR1cyk7CisJCWNvbXBsZXRlKCZ4aGNpLT5kZXZzW3Nsb3RfaWRdLT5jbWRfY29tcGxldGlvbik7CiAJCWJyZWFrOwogCWNhc2UgVFJCX1RZUEUoVFJCX0VWQUxfQ09OVEVYVCk6CiAJCXZpcnRfZGV2ID0geGhjaS0+ZGV2c1tzbG90X2lkXTsKQEAgLTg0OSw4ICs5OTEsNyBAQAogICogVFJCIGluIHRoaXMgVEQsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGF0IFRSQidzIHNlZ21lbnQuICBPdGhlcndpc2UgaXQKICAqIHJldHVybnMgMC4KICAqLwotc3RhdGljIHN0cnVjdCB4aGNpX3NlZ21lbnQgKnRyYl9pbl90ZCgKLQkJc3RydWN0IHhoY2lfc2VnbWVudCAqc3RhcnRfc2VnLAorc3RydWN0IHhoY2lfc2VnbWVudCAqdHJiX2luX3RkKHN0cnVjdCB4aGNpX3NlZ21lbnQgKnN0YXJ0X3NlZywKIAkJdW5pb24geGhjaV90cmIJKnN0YXJ0X3RyYiwKIAkJdW5pb24geGhjaV90cmIJKmVuZF90cmIsCiAJCWRtYV9hZGRyX3QJc3VzcGVjdF9kbWEpCkBAIC05MDAsNiArMTA0MSw0NSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCB4aGNpX2NsZWFudXBfaGFsdGVkX2VuZHBvaW50KHN0cnVjdCB4aGNpX2hjZCAqeGhjaSwKKwkJdW5zaWduZWQgaW50IHNsb3RfaWQsIHVuc2lnbmVkIGludCBlcF9pbmRleCwKKwkJc3RydWN0IHhoY2lfdGQgKnRkLCB1bmlvbiB4aGNpX3RyYiAqZXZlbnRfdHJiKQoreworCXN0cnVjdCB4aGNpX3ZpcnRfZXAgKmVwID0gJnhoY2ktPmRldnNbc2xvdF9pZF0tPmVwc1tlcF9pbmRleF07CisJZXAtPmVwX3N0YXRlIHw9IEVQX0hBTFRFRDsKKwllcC0+c3RvcHBlZF90ZCA9IHRkOworCWVwLT5zdG9wcGVkX3RyYiA9IGV2ZW50X3RyYjsKKwl4aGNpX3F1ZXVlX3Jlc2V0X2VwKHhoY2ksIHNsb3RfaWQsIGVwX2luZGV4KTsKKwl4aGNpX2NsZWFudXBfc3RhbGxlZF9yaW5nKHhoY2ksIHRkLT51cmItPmRldiwgZXBfaW5kZXgpOworCXhoY2lfcmluZ19jbWRfZGIoeGhjaSk7Cit9CisKKy8qIENoZWNrIGlmIGFuIGVycm9yIGhhcyBoYWx0ZWQgdGhlIGVuZHBvaW50IHJpbmcuICBUaGUgY2xhc3MgZHJpdmVyIHdpbGwKKyAqIGNsZWFudXAgdGhlIGhhbHQgZm9yIGEgbm9uLWRlZmF1bHQgY29udHJvbCBlbmRwb2ludCBpZiB3ZSBpbmRpY2F0ZSBhIHN0YWxsLgorICogSG93ZXZlciwgYSBiYWJibGUgYW5kIG90aGVyIGVycm9ycyBhbHNvIGhhbHQgdGhlIGVuZHBvaW50IHJpbmcsIGFuZCB0aGUgY2xhc3MKKyAqIGRyaXZlciB3b24ndCBjbGVhciB0aGUgaGFsdCBpbiB0aGF0IGNhc2UsIHNvIHdlIG5lZWQgdG8gaXNzdWUgYSBTZXQgVHJhbnNmZXIKKyAqIFJpbmcgRGVxdWV1ZSBQb2ludGVyIGNvbW1hbmQgbWFudWFsbHkuCisgKi8KK3N0YXRpYyBpbnQgeGhjaV9yZXF1aXJlc19tYW51YWxfaGFsdF9jbGVhbnVwKHN0cnVjdCB4aGNpX2hjZCAqeGhjaSwKKwkJc3RydWN0IHhoY2lfZXBfY3R4ICplcF9jdHgsCisJCXVuc2lnbmVkIGludCB0cmJfY29tcF9jb2RlKQoreworCS8qIFRSQiBjb21wbGV0aW9uIGNvZGVzIHRoYXQgbWF5IHJlcXVpcmUgYSBtYW51YWwgaGFsdCBjbGVhbnVwICovCisJaWYgKHRyYl9jb21wX2NvZGUgPT0gQ09NUF9UWF9FUlIgfHwKKwkJCXRyYl9jb21wX2NvZGUgPT0gQ09NUF9CQUJCTEUgfHwKKwkJCXRyYl9jb21wX2NvZGUgPT0gQ09NUF9TUExJVF9FUlIpCisJCS8qIFRoZSAwLjk2IHNwZWMgc2F5cyBhIGJhYmJsaW5nIGNvbnRyb2wgZW5kcG9pbnQKKwkJICogaXMgbm90IGhhbHRlZC4gVGhlIDAuOTYgc3BlYyBzYXlzIGl0IGlzLiAgU29tZSBIVworCQkgKiBjbGFpbXMgdG8gYmUgMC45NSBjb21wbGlhbnQsIGJ1dCBpdCBoYWx0cyB0aGUgY29udHJvbAorCQkgKiBlbmRwb2ludCBhbnl3YXkuICBDaGVjayBpZiBhIGJhYmJsZSBoYWx0ZWQgdGhlCisJCSAqIGVuZHBvaW50LgorCQkgKi8KKwkJaWYgKChlcF9jdHgtPmVwX2luZm8gJiBFUF9TVEFURV9NQVNLKSA9PSBFUF9TVEFURV9IQUxURUQpCisJCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCiAvKgogICogSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvbmRpdGlvbiwgaXQgbWVhbnMgaXQgZ290IGEgVHJhbnNmZXIKICAqIGV2ZW50IHdpdGggYSBjb3JydXB0ZWQgU2xvdCBJRCwgRW5kcG9pbnQgSUQsIG9yIFRSQiBETUEgYWRkcmVzcy4KQEAgLTEwMDIsNiArMTE4Miw3IEBACiAJCXhoY2lfd2Fybih4aGNpLCAiV0FSTjogVFJCIGVycm9yIG9uIGVuZHBvaW50XG4iKTsKIAkJc3RhdHVzID0gLUVJTFNFUTsKIAkJYnJlYWs7CisJY2FzZSBDT01QX1NQTElUX0VSUjoKIAljYXNlIENPTVBfVFhfRVJSOgogCQl4aGNpX3dhcm4oeGhjaSwgIldBUk46IHRyYW5zZmVyIGVycm9yIG9uIGVuZHBvaW50XG4iKTsKIAkJc3RhdHVzID0gLUVQUk9UTzsKQEAgLTEwMTUsNiArMTE5NiwxNiBAQAogCQlzdGF0dXMgPSAtRU5PU1I7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CisJCWlmICh0cmJfY29tcF9jb2RlID49IDIyNCAmJiB0cmJfY29tcF9jb2RlIDw9IDI1NSkgeworCQkJLyogVmVuZG9yIGRlZmluZWQgImluZm9ybWF0aW9uYWwiIGNvbXBsZXRpb24gY29kZSwKKwkJCSAqIHRyZWF0IGFzIG5vdC1hbi1lcnJvci4KKwkJCSAqLworCQkJeGhjaV9kYmcoeGhjaSwgIlZlbmRvciBkZWZpbmVkIGluZm8gY29tcGxldGlvbiBjb2RlICV1XG4iLAorCQkJCQl0cmJfY29tcF9jb2RlKTsKKwkJCXhoY2lfZGJnKHhoY2ksICJUcmVhdGluZyBjb2RlIGFzIHN1Y2Nlc3MuXG4iKTsKKwkJCXN0YXR1cyA9IDA7CisJCQlicmVhazsKKwkJfQogCQl4aGNpX3dhcm4oeGhjaSwgIkVSUk9SIFVua25vd24gZXZlbnQgY29uZGl0aW9uLCBIQyBwcm9iYWJseSBidXN0ZWRcbiIpOwogCQl1cmIgPSBOVUxMOwogCQlnb3RvIGNsZWFudXA7CkBAIC0xMDQzLDE1ICsxMjM0LDE0IEBACiAJCQllbHNlCiAJCQkJc3RhdHVzID0gMDsKIAkJCWJyZWFrOwotCQljYXNlIENPTVBfQkFCQkxFOgotCQkJLyogVGhlIDAuOTYgc3BlYyBzYXlzIGEgYmFiYmxpbmcgY29udHJvbCBlbmRwb2ludAotCQkJICogaXMgbm90IGhhbHRlZC4gVGhlIDAuOTYgc3BlYyBzYXlzIGl0IGlzLiAgU29tZSBIVwotCQkJICogY2xhaW1zIHRvIGJlIDAuOTUgY29tcGxpYW50LCBidXQgaXQgaGFsdHMgdGhlIGNvbnRyb2wKLQkJCSAqIGVuZHBvaW50IGFueXdheS4gIENoZWNrIGlmIGEgYmFiYmxlIGhhbHRlZCB0aGUKLQkJCSAqIGVuZHBvaW50LgotCQkJICovCi0JCQlpZiAoZXBfY3R4LT5lcF9pbmZvICE9IEVQX1NUQVRFX0hBTFRFRCkKKworCQlkZWZhdWx0OgorCQkJaWYgKCF4aGNpX3JlcXVpcmVzX21hbnVhbF9oYWx0X2NsZWFudXAoeGhjaSwKKwkJCQkJCWVwX2N0eCwgdHJiX2NvbXBfY29kZSkpCiAJCQkJYnJlYWs7CisJCQl4aGNpX2RiZyh4aGNpLCAiVFJCIGVycm9yIGNvZGUgJXUsICIKKwkJCQkJImhhbHRlZCBlbmRwb2ludCBpbmRleCA9ICV1XG4iLAorCQkJCQl0cmJfY29tcF9jb2RlLCBlcF9pbmRleCk7CiAJCQkvKiBlbHNlIGZhbGwgdGhyb3VnaCAqLwogCQljYXNlIENPTVBfU1RBTEw6CiAJCQkvKiBEaWQgd2UgdHJhbnNmZXIgcGFydCBvZiB0aGUgZGF0YSAobWlkZGxlKSBwaGFzZT8gKi8KQEAgLTEwNjMsMTUgKzEyNTMsOSBAQAogCQkJZWxzZQogCQkJCXRkLT51cmItPmFjdHVhbF9sZW5ndGggPSAwOwogCi0JCQllcC0+c3RvcHBlZF90ZCA9IHRkOwotCQkJZXAtPnN0b3BwZWRfdHJiID0gZXZlbnRfdHJiOwotCQkJeGhjaV9xdWV1ZV9yZXNldF9lcCh4aGNpLCBzbG90X2lkLCBlcF9pbmRleCk7Ci0JCQl4aGNpX2NsZWFudXBfc3RhbGxlZF9yaW5nKHhoY2ksIHRkLT51cmItPmRldiwgZXBfaW5kZXgpOwotCQkJeGhjaV9yaW5nX2NtZF9kYih4aGNpKTsKKwkJCXhoY2lfY2xlYW51cF9oYWx0ZWRfZW5kcG9pbnQoeGhjaSwKKwkJCQkJc2xvdF9pZCwgZXBfaW5kZXgsIHRkLCBldmVudF90cmIpOwogCQkJZ290byB0ZF9jbGVhbnVwOwotCQlkZWZhdWx0OgotCQkJLyogT3RoZXJzIGFscmVhZHkgaGFuZGxlZCBhYm92ZSAqLwotCQkJYnJlYWs7CiAJCX0KIAkJLyoKIAkJICogRGlkIHdlIHRyYW5zZmVyIGFueSBkYXRhLCBkZXNwaXRlIHRoZSBlcnJvcnMgdGhhdCBtaWdodCBoYXZlCkBAIC0xMjA5LDE2ICsxMzkzLDI1IEBACiAJCWVwLT5zdG9wcGVkX3RkID0gdGQ7CiAJCWVwLT5zdG9wcGVkX3RyYiA9IGV2ZW50X3RyYjsKIAl9IGVsc2UgewotCQlpZiAodHJiX2NvbXBfY29kZSA9PSBDT01QX1NUQUxMIHx8Ci0JCQkJdHJiX2NvbXBfY29kZSA9PSBDT01QX0JBQkJMRSkgeworCQlpZiAodHJiX2NvbXBfY29kZSA9PSBDT01QX1NUQUxMKSB7CiAJCQkvKiBUaGUgdHJhbnNmZXIgaXMgY29tcGxldGVkIGZyb20gdGhlIGRyaXZlcidzCiAJCQkgKiBwZXJzcGVjdGl2ZSwgYnV0IHdlIG5lZWQgdG8gaXNzdWUgYSBzZXQgZGVxdWV1ZQogCQkJICogY29tbWFuZCBmb3IgdGhpcyBzdGFsbGVkIGVuZHBvaW50IHRvIG1vdmUgdGhlIGRlcXVldWUKIAkJCSAqIHBvaW50ZXIgcGFzdCB0aGUgVEQuICBXZSBjYW4ndCBkbyB0aGF0IGhlcmUgYmVjYXVzZQotCQkJICogdGhlIGhhbHQgY29uZGl0aW9uIG11c3QgYmUgY2xlYXJlZCBmaXJzdC4KKwkJCSAqIHRoZSBoYWx0IGNvbmRpdGlvbiBtdXN0IGJlIGNsZWFyZWQgZmlyc3QuICBMZXQgdGhlCisJCQkgKiBVU0IgY2xhc3MgZHJpdmVyIGNsZWFyIHRoZSBzdGFsbCBsYXRlci4KIAkJCSAqLwogCQkJZXAtPnN0b3BwZWRfdGQgPSB0ZDsKIAkJCWVwLT5zdG9wcGVkX3RyYiA9IGV2ZW50X3RyYjsKKwkJfSBlbHNlIGlmICh4aGNpX3JlcXVpcmVzX21hbnVhbF9oYWx0X2NsZWFudXAoeGhjaSwKKwkJCQkJZXBfY3R4LCB0cmJfY29tcF9jb2RlKSkgeworCQkJLyogT3RoZXIgdHlwZXMgb2YgZXJyb3JzIGhhbHQgdGhlIGVuZHBvaW50LCBidXQgdGhlCisJCQkgKiBjbGFzcyBkcml2ZXIgZG9lc24ndCBjYWxsIHVzYl9yZXNldF9lbmRwb2ludCgpIHVubGVzcworCQkJICogdGhlIGVycm9yIGlzIC1FUElQRS4gIENsZWFyIHRoZSBoYWx0ZWQgc3RhdHVzIGluIHRoZQorCQkJICogeEhDSSBoYXJkd2FyZSBtYW51YWxseS4KKwkJCSAqLworCQkJeGhjaV9jbGVhbnVwX2hhbHRlZF9lbmRwb2ludCh4aGNpLAorCQkJCQlzbG90X2lkLCBlcF9pbmRleCwgdGQsIGV2ZW50X3RyYik7CiAJCX0gZWxzZSB7CiAJCQkvKiBVcGRhdGUgcmluZyBkZXF1ZXVlIHBvaW50ZXIgKi8KIAkJCXdoaWxlIChlcF9yaW5nLT5kZXF1ZXVlICE9IHRkLT5sYXN0X3RyYikKQEAgLTEyNDksMTAgKzE0NDIsOSBAQAogCQl9CiAJCWxpc3RfZGVsKCZ0ZC0+dGRfbGlzdCk7CiAJCS8qIFdhcyB0aGlzIFREIHNsYXRlZCB0byBiZSBjYW5jZWxsZWQgYnV0IGNvbXBsZXRlZCBhbnl3YXk/ICovCi0JCWlmICghbGlzdF9lbXB0eSgmdGQtPmNhbmNlbGxlZF90ZF9saXN0KSkgeworCQlpZiAoIWxpc3RfZW1wdHkoJnRkLT5jYW5jZWxsZWRfdGRfbGlzdCkpCiAJCQlsaXN0X2RlbCgmdGQtPmNhbmNlbGxlZF90ZF9saXN0KTsKLQkJCWVwLT5jYW5jZWxzX3BlbmRpbmctLTsKLQkJfQorCiAJCS8qIExlYXZlIHRoZSBURCBhcm91bmQgZm9yIHRoZSByZXNldCBlbmRwb2ludCBmdW5jdGlvbiB0byB1c2UKIAkJICogKGJ1dCBvbmx5IGlmIGl0J3Mgbm90IGEgY29udHJvbCBlbmRwb2ludCwgc2luY2Ugd2UgYWxyZWFkeQogCQkgKiBxdWV1ZWQgdGhlIFNldCBUUiBkZXF1ZXVlIHBvaW50ZXIgY29tbWFuZCBmb3Igc3RhbGxlZApAQCAtMTMzMSw2ICsxNTIzLDE0IEBACiAJZGVmYXVsdDoKIAkJeGhjaS0+ZXJyb3JfYml0bWFzayB8PSAxIDw8IDM7CiAJfQorCS8qIEFueSBvZiB0aGUgYWJvdmUgZnVuY3Rpb25zIG1heSBkcm9wIGFuZCByZS1hY3F1aXJlIHRoZSBsb2NrLCBzbyBjaGVjaworCSAqIHRvIG1ha2Ugc3VyZSBhIHdhdGNoZG9nIHRpbWVyIGRpZG4ndCBtYXJrIHRoZSBob3N0IGFzIG5vbi1yZXNwb25zaXZlLgorCSAqLworCWlmICh4aGNpLT54aGNfc3RhdGUgJiBYSENJX1NUQVRFX0RZSU5HKSB7CisJCXhoY2lfZGJnKHhoY2ksICJ4SENJIGhvc3QgZHlpbmcsIHJldHVybmluZyBmcm9tICIKKwkJCQkiZXZlbnQgaGFuZGxlci5cbiIpOworCQlyZXR1cm47CisJfQogCiAJaWYgKHVwZGF0ZV9wdHJzKSB7CiAJCS8qIFVwZGF0ZSBTVyBhbmQgSEMgZXZlbnQgcmluZyBkZXF1ZXVlIHBvaW50ZXIgKi8KQEAgLTE1NTUsNiArMTc1NSwyMSBAQAogCXJldHVybiB4aGNpX3F1ZXVlX2J1bGtfdHgoeGhjaSwgR0ZQX0FUT01JQywgdXJiLCBzbG90X2lkLCBlcF9pbmRleCk7CiB9CiAKKy8qCisgKiBUaGUgVEQgc2l6ZSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbmluZyBpbiB0aGUgVEQgKGluY2x1ZGluZyB0aGlzIFRSQiksCisgKiByaWdodCBzaGlmdGVkIGJ5IDEwLgorICogSXQgbXVzdCBmaXQgaW4gYml0cyAyMToxNywgc28gaXQgY2FuJ3QgYmUgYmlnZ2VyIHRoYW4gMzEuCisgKi8KK3N0YXRpYyB1MzIgeGhjaV90ZF9yZW1haW5kZXIodW5zaWduZWQgaW50IHJlbWFpbmRlcikKK3sKKwl1MzIgbWF4ID0gKDEgPDwgKDIxIC0gMTcgKyAxKSkgLSAxOworCisJaWYgKChyZW1haW5kZXIgPj4gMTApID49IG1heCkKKwkJcmV0dXJuIG1heCA8PCAxNzsKKwllbHNlCisJCXJldHVybiAocmVtYWluZGVyID4+IDEwKSA8PCAxNzsKK30KKwogc3RhdGljIGludCBxdWV1ZV9idWxrX3NnX3R4KHN0cnVjdCB4aGNpX2hjZCAqeGhjaSwgZ2ZwX3QgbWVtX2ZsYWdzLAogCQlzdHJ1Y3QgdXJiICp1cmIsIGludCBzbG90X2lkLCB1bnNpZ25lZCBpbnQgZXBfaW5kZXgpCiB7CkBAIC0xNjEyLDYgKzE4MjcsNyBAQAogCWRvIHsKIAkJdTMyIGZpZWxkID0gMDsKIAkJdTMyIGxlbmd0aF9maWVsZCA9IDA7CisJCXUzMiByZW1haW5kZXIgPSAwOwogCiAJCS8qIERvbid0IGNoYW5nZSB0aGUgY3ljbGUgYml0IG9mIHRoZSBmaXJzdCBUUkIgdW50aWwgbGF0ZXIgKi8KIAkJaWYgKGZpcnN0X3RyYikKQEAgLTE2NDEsOCArMTg1NywxMCBAQAogCQkJCQkodW5zaWduZWQgaW50KSAoYWRkciArIFRSQl9NQVhfQlVGRl9TSVpFKSAmIH4oVFJCX01BWF9CVUZGX1NJWkUgLSAxKSwKIAkJCQkJKHVuc2lnbmVkIGludCkgYWRkciArIHRyYl9idWZmX2xlbik7CiAJCX0KKwkJcmVtYWluZGVyID0geGhjaV90ZF9yZW1haW5kZXIodXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoIC0KKwkJCQlydW5uaW5nX3RvdGFsKSA7CiAJCWxlbmd0aF9maWVsZCA9IFRSQl9MRU4odHJiX2J1ZmZfbGVuKSB8Ci0JCQlURF9SRU1BSU5ERVIodXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoIC0gcnVubmluZ190b3RhbCkgfAorCQkJcmVtYWluZGVyIHwKIAkJCVRSQl9JTlRSX1RBUkdFVCgwKTsKIAkJcXVldWVfdHJiKHhoY2ksIGVwX3JpbmcsIGZhbHNlLAogCQkJCWxvd2VyXzMyX2JpdHMoYWRkciksCkBAIC0xNzU1LDYgKzE5NzMsNyBAQAogCiAJLyogUXVldWUgdGhlIGZpcnN0IFRSQiwgZXZlbiBpZiBpdCdzIHplcm8tbGVuZ3RoICovCiAJZG8geworCQl1MzIgcmVtYWluZGVyID0gMDsKIAkJZmllbGQgPSAwOwogCiAJCS8qIERvbid0IGNoYW5nZSB0aGUgY3ljbGUgYml0IG9mIHRoZSBmaXJzdCBUUkIgdW50aWwgbGF0ZXIgKi8KQEAgLTE3NzMsOCArMTk5MiwxMCBAQAogCQkJdGQtPmxhc3RfdHJiID0gZXBfcmluZy0+ZW5xdWV1ZTsKIAkJCWZpZWxkIHw9IFRSQl9JT0M7CiAJCX0KKwkJcmVtYWluZGVyID0geGhjaV90ZF9yZW1haW5kZXIodXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoIC0KKwkJCQlydW5uaW5nX3RvdGFsKTsKIAkJbGVuZ3RoX2ZpZWxkID0gVFJCX0xFTih0cmJfYnVmZl9sZW4pIHwKLQkJCVREX1JFTUFJTkRFUih1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggLSBydW5uaW5nX3RvdGFsKSB8CisJCQlyZW1haW5kZXIgfAogCQkJVFJCX0lOVFJfVEFSR0VUKDApOwogCQlxdWV1ZV90cmIoeGhjaSwgZXBfcmluZywgZmFsc2UsCiAJCQkJbG93ZXJfMzJfYml0cyhhZGRyKSwKQEAgLTE4NjIsNyArMjA4Myw3IEBACiAJLyogSWYgdGhlcmUncyBkYXRhLCBxdWV1ZSBkYXRhIFRSQnMgKi8KIAlmaWVsZCA9IDA7CiAJbGVuZ3RoX2ZpZWxkID0gVFJCX0xFTih1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpIHwKLQkJVERfUkVNQUlOREVSKHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCkgfAorCQl4aGNpX3RkX3JlbWFpbmRlcih1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpIHwKIAkJVFJCX0lOVFJfVEFSR0VUKDApOwogCWlmICh1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPiAwKSB7CiAJCWlmIChzZXR1cC0+YlJlcXVlc3RUeXBlICYgVVNCX0RJUl9JTikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5oIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLmgKaW5kZXggNGIyNTRiNi4uODc3ODEzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLmgKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLmgKQEAgLTY1MiwxMyArNjUyLDE3IEBACiAJc3RydWN0IHhoY2lfcmluZwkJKm5ld19yaW5nOwogCXVuc2lnbmVkIGludAkJCWVwX3N0YXRlOwogI2RlZmluZSBTRVRfREVRX1BFTkRJTkcJCSgxIDw8IDApCi0jZGVmaW5lIEVQX0hBTFRFRAkJKDEgPDwgMSkKKyNkZWZpbmUgRVBfSEFMVEVECQkoMSA8PCAxKQkvKiBGb3Igc3RhbGwgaGFuZGxpbmcgKi8KKyNkZWZpbmUgRVBfSEFMVF9QRU5ESU5HCQkoMSA8PCAyKQkvKiBGb3IgVVJCIGNhbmNlbGxhdGlvbiAqLwogCS8qIC0tLS0gIFJlbGF0ZWQgdG8gVVJCIGNhbmNlbGxhdGlvbiAtLS0tICovCiAJc3RydWN0IGxpc3RfaGVhZAljYW5jZWxsZWRfdGRfbGlzdDsKLQl1bnNpZ25lZCBpbnQJCWNhbmNlbHNfcGVuZGluZzsKIAkvKiBUaGUgVFJCIHRoYXQgd2FzIGxhc3QgcmVwb3J0ZWQgaW4gYSBzdG9wcGVkIGVuZHBvaW50IHJpbmcgKi8KIAl1bmlvbiB4aGNpX3RyYgkJKnN0b3BwZWRfdHJiOwogCXN0cnVjdCB4aGNpX3RkCQkqc3RvcHBlZF90ZDsKKwkvKiBXYXRjaGRvZyB0aW1lciBmb3Igc3RvcCBlbmRwb2ludCBjb21tYW5kIHRvIGNhbmNlbCBVUkJzICovCisJc3RydWN0IHRpbWVyX2xpc3QJc3RvcF9jbWRfdGltZXI7CisJaW50CQkJc3RvcF9jbWRzX3BlbmRpbmc7CisJc3RydWN0IHhoY2lfaGNkCQkqeGhjaTsKIH07CiAKIHN0cnVjdCB4aGNpX3ZpcnRfZGV2aWNlIHsKQEAgLTY3Myw2ICs2NzcsMTAgQEAKIAlzdHJ1Y3QgeGhjaV9jb250YWluZXJfY3R4ICAgICAgICpvdXRfY3R4OwogCS8qIFVzZWQgZm9yIGFkZHJlc3NpbmcgZGV2aWNlcyBhbmQgY29uZmlndXJhdGlvbiBjaGFuZ2VzICovCiAJc3RydWN0IHhoY2lfY29udGFpbmVyX2N0eCAgICAgICAqaW5fY3R4OworCS8qIFJpbmdzIHNhdmVkIHRvIGVuc3VyZSBvbGQgYWx0IHNldHRpbmdzIGNhbiBiZSByZS1pbnN0YXRlZCAqLworCXN0cnVjdCB4aGNpX3JpbmcJCSoqcmluZ19jYWNoZTsKKwlpbnQJCQkJbnVtX3JpbmdzX2NhY2hlZDsKKyNkZWZpbmUJWEhDSV9NQVhfUklOR1NfQ0FDSEVECTMxCiAJc3RydWN0IHhoY2lfdmlydF9lcAkJZXBzWzMxXTsKIAlzdHJ1Y3QgY29tcGxldGlvbgkJY21kX2NvbXBsZXRpb247CiAJLyogU3RhdHVzIG9mIHRoZSBsYXN0IGNvbW1hbmQgaXNzdWVkIGZvciB0aGlzIGRldmljZSAqLwpAQCAtODI0LDkgKzgzMiw2IEBACiAvKiBOb3JtYWwgVFJCIGZpZWxkcyAqLwogLyogdHJhbnNmZXJfbGVuIGJpdG1hc2tzIC0gYml0cyAwOjE2ICovCiAjZGVmaW5lCVRSQl9MRU4ocCkJCSgocCkgJiAweDFmZmZmKQotLyogVEQgc2l6ZSAtIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcgaW4gdGhlIFREIChpbmNsdWRpbmcgdGhpcyBUUkIpOgotICogYml0cyAxNyAtIDIxLiAgU2hpZnQgdGhlIG51bWJlciBvZiBieXRlcyBieSAxMC4gKi8KLSNkZWZpbmUgVERfUkVNQUlOREVSKHApCQkoKCgocCkgPj4gMTApICYgMHgxZikgPDwgMTcpCiAvKiBJbnRlcnJ1cHRlciBUYXJnZXQgLSB3aGljaCBNU0ktWCB2ZWN0b3IgdG8gdGFyZ2V0IHRoZSBjb21wbGV0aW9uIGV2ZW50IGF0ICovCiAjZGVmaW5lIFRSQl9JTlRSX1RBUkdFVChwKQkoKChwKSAmIDB4M2ZmKSA8PCAyMikKICNkZWZpbmUgR0VUX0lOVFJfVEFSR0VUKHApCSgoKHApID4+IDIyKSAmIDB4M2ZmKQpAQCAtMTAyMiw2ICsxMDI3LDggQEAKICNkZWZpbmUJRVJTVF9FTlRSSUVTCTEKIC8qIFBvbGwgZXZlcnkgNjAgc2Vjb25kcyAqLwogI2RlZmluZQlQT0xMX1RJTUVPVVQJNjAKKy8qIFN0b3AgZW5kcG9pbnQgY29tbWFuZCB0aW1lb3V0IChzZWNzKSBmb3IgVVJCIGNhbmNlbGxhdGlvbiB3YXRjaGRvZyB0aW1lciAqLworI2RlZmluZSBYSENJX1NUT1BfRVBfQ01EX1RJTUVPVVQJNQogLyogWFhYOiBNYWtlIHRoZXNlIG1vZHVsZSBwYXJhbWV0ZXJzICovCiAKIApAQCAtMTA4Myw2ICsxMDkwLDIxIEBACiAJc3RydWN0IHRpbWVyX2xpc3QJZXZlbnRfcmluZ190aW1lcjsKIAlpbnQJCQl6b21iaWU7CiAjZW5kaWYKKwkvKiBIb3N0IGNvbnRyb2xsZXIgd2F0Y2hkb2cgdGltZXIgc3RydWN0dXJlcyAqLworCXVuc2lnbmVkIGludAkJeGhjX3N0YXRlOworLyogSG9zdCBjb250cm9sbGVyIGlzIGR5aW5nIC0gbm90IHJlc3BvbmRpbmcgdG8gY29tbWFuZHMuICJJJ20gbm90IGRlYWQgeWV0ISIKKyAqCisgKiB4SEMgaW50ZXJydXB0cyBoYXZlIGJlZW4gZGlzYWJsZWQgYW5kIGEgd2F0Y2hkb2cgdGltZXIgd2lsbCAob3IgaGFzIGFscmVhZHkpCisgKiBoYWx0IHRoZSB4SENJIGhvc3QsIGFuZCBjb21wbGV0ZSBhbGwgVVJCcyB3aXRoIGFuIC1FU0hVVERPV04gY29kZS4gIEFueSBjb2RlCisgKiB0aGF0IHNlZXMgdGhpcyBzdGF0dXMgKG90aGVyIHRoYW4gdGhlIHRpbWVyIHRoYXQgc2V0IGl0KSBzaG91bGQgc3RvcCB0b3VjaGluZworICogaGFyZHdhcmUgaW1tZWRpYXRlbHkuICBJbnRlcnJ1cHQgaGFuZGxlcnMgc2hvdWxkIHJldHVybiBpbW1lZGlhdGVseSB3aGVuCisgKiB0aGV5IHNlZSB0aGlzIHN0YXR1cyAoYW55IHRpbWUgdGhleSBkcm9wIGFuZCByZS1hY3F1aXJlIHhoY2ktPmxvY2spLgorICogeGhjaV91cmJfZGVxdWV1ZSgpIHNob3VsZCBjYWxsIHVzYl9oY2RfY2hlY2tfdW5saW5rX3VyYigpIGFuZCByZXR1cm4gd2l0aG91dAorICogcHV0dGluZyB0aGUgVEQgb24gdGhlIGNhbmNlbGVkIGxpc3QsIGV0Yy4KKyAqCisgKiBUaGVyZSBhcmUgbm8gcmVwb3J0cyBvZiB4SENJIGhvc3QgY29udHJvbGxlcnMgdGhhdCBkaXNwbGF5IHRoaXMgaXNzdWUuCisgKi8KKyNkZWZpbmUgWEhDSV9TVEFURV9EWUlORwkoMSA8PCAwKQogCS8qIFN0YXRpc3RpY3MgKi8KIAlpbnQJCQlub29wc19zdWJtaXR0ZWQ7CiAJaW50CQkJbm9vcHNfaGFuZGxlZDsKQEAgLTEyMjMsNiArMTI0NSw3IEBACiAjZW5kaWYKIAogLyogeEhDSSBob3N0IGNvbnRyb2xsZXIgZ2x1ZSAqLwordm9pZCB4aGNpX3F1aWVzY2Uoc3RydWN0IHhoY2lfaGNkICp4aGNpKTsKIGludCB4aGNpX2hhbHQoc3RydWN0IHhoY2lfaGNkICp4aGNpKTsKIGludCB4aGNpX3Jlc2V0KHN0cnVjdCB4aGNpX2hjZCAqeGhjaSk7CiBpbnQgeGhjaV9pbml0KHN0cnVjdCB1c2JfaGNkICpoY2QpOwpAQCAtMTI0Niw2ICsxMjY5LDkgQEAKIAogLyogeEhDSSByaW5nLCBzZWdtZW50LCBUUkIsIGFuZCBURCBmdW5jdGlvbnMgKi8KIGRtYV9hZGRyX3QgeGhjaV90cmJfdmlydF90b19kbWEoc3RydWN0IHhoY2lfc2VnbWVudCAqc2VnLCB1bmlvbiB4aGNpX3RyYiAqdHJiKTsKK3N0cnVjdCB4aGNpX3NlZ21lbnQgKnRyYl9pbl90ZChzdHJ1Y3QgeGhjaV9zZWdtZW50ICpzdGFydF9zZWcsCisJCXVuaW9uIHhoY2lfdHJiICpzdGFydF90cmIsIHVuaW9uIHhoY2lfdHJiICplbmRfdHJiLAorCQlkbWFfYWRkcl90IHN1c3BlY3RfZG1hKTsKIHZvaWQgeGhjaV9yaW5nX2NtZF9kYihzdHJ1Y3QgeGhjaV9oY2QgKnhoY2kpOwogdm9pZCAqeGhjaV9zZXR1cF9vbmVfbm9vcChzdHJ1Y3QgeGhjaV9oY2QgKnhoY2kpOwogdm9pZCB4aGNpX2hhbmRsZV9ldmVudChzdHJ1Y3QgeGhjaV9oY2QgKnhoY2kpOwpAQCAtMTI3OCw2ICsxMzA0LDcgQEAKIHZvaWQgeGhjaV9xdWV1ZV9jb25maWdfZXBfcXVpcmsoc3RydWN0IHhoY2lfaGNkICp4aGNpLAogCQl1bnNpZ25lZCBpbnQgc2xvdF9pZCwgdW5zaWduZWQgaW50IGVwX2luZGV4LAogCQlzdHJ1Y3QgeGhjaV9kZXF1ZXVlX3N0YXRlICpkZXFfc3RhdGUpOwordm9pZCB4aGNpX3N0b3BfZW5kcG9pbnRfY29tbWFuZF93YXRjaGRvZyh1bnNpZ25lZCBsb25nIGFyZyk7CiAKIC8qIHhIQ0kgcm9vdGh1YiBjb2RlICovCiBpbnQgeGhjaV9odWJfY29udHJvbChzdHJ1Y3QgdXNiX2hjZCAqaGNkLCB1MTYgdHlwZVJlcSwgdTE2IHdWYWx1ZSwgdTE2IHdJbmRleCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvdXNidGVzdC5jIGIvZHJpdmVycy91c2IvbWlzYy91c2J0ZXN0LmMKaW5kZXggYTlmMDZkNy4uM2RhYjBjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy91c2J0ZXN0LmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy91c2J0ZXN0LmMKQEAgLTIxMyw4ICsyMTMsOSBAQAogfQogCiBzdGF0aWMgdW5zaWduZWQgcGF0dGVybiA9IDA7Ci1tb2R1bGVfcGFyYW0gKHBhdHRlcm4sIHVpbnQsIFNfSVJVR08pOwotTU9EVUxFX1BBUk1fREVTQyhwYXR0ZXJuLCAiaS9vIHBhdHRlcm4gKDAgPT0gemVyb2VzKSIpOworc3RhdGljIHVuc2lnbmVkIG1vZF9wYXR0ZXJuOworbW9kdWxlX3BhcmFtX25hbWVkKHBhdHRlcm4sIG1vZF9wYXR0ZXJuLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKG1vZF9wYXR0ZXJuLCAiaS9vIHBhdHRlcm4gKDAgPT0gemVyb2VzKSIpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2ltcGxlX2ZpbGxfYnVmIChzdHJ1Y3QgdXJiICp1cmIpCiB7CkBAIC0xNTY3LDYgKzE1NjgsOCBAQAogCiAJLy8gRklYTUUgVVNCREVWRlNfQ09OTkVDVElORk8gZG9lc24ndCBzYXkgaG93IGZhc3QgdGhlIGRldmljZSBpcy4KIAorCXBhdHRlcm4gPSBtb2RfcGF0dGVybjsKKwogCWlmIChjb2RlICE9IFVTQlRFU1RfUkVRVUVTVCkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tb24vbW9uX2Jpbi5jIGIvZHJpdmVycy91c2IvbW9uL21vbl9iaW4uYwppbmRleCAxMGYzMjA1Li4zODVlYzA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tb24vbW9uX2Jpbi5jCisrKyBiL2RyaXZlcnMvdXNiL21vbi9tb25fYmluLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKQEAgLTIyMSw3ICsyMjIsNyBAQAogLyoKICAqIFRoaXMgaXMgYSAiY2h1bmtlZCBtZW1jcHkiLiBJdCBkb2VzIG5vdCBtYW5pcHVsYXRlIGFueSBjb3VudGVycy4KICAqLwotc3RhdGljIHZvaWQgbW9uX2NvcHlfdG9fYnVmZihjb25zdCBzdHJ1Y3QgbW9uX3JlYWRlcl9iaW4gKnRoaXMsCitzdGF0aWMgdW5zaWduZWQgaW50IG1vbl9jb3B5X3RvX2J1ZmYoY29uc3Qgc3RydWN0IG1vbl9yZWFkZXJfYmluICp0aGlzLAogICAgIHVuc2lnbmVkIGludCBvZmYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmZyb20sIHVuc2lnbmVkIGludCBsZW5ndGgpCiB7CiAJdW5zaWduZWQgaW50IHN0ZXBfbGVuOwpAQCAtMjQ2LDYgKzI0Nyw3IEBACiAJCWZyb20gKz0gc3RlcF9sZW47CiAJCWxlbmd0aCAtPSBzdGVwX2xlbjsKIAl9CisJcmV0dXJuIG9mZjsKIH0KIAogLyoKQEAgLTM5NCwxNCArMzk2LDQ0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjaGFyIG1vbl9iaW5fZ2V0X2RhdGEoY29uc3Qgc3RydWN0IG1vbl9yZWFkZXJfYmluICpycCwKLSAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCBzdHJ1Y3QgdXJiICp1cmIsIHVuc2lnbmVkIGludCBsZW5ndGgpCitzdGF0aWMgdW5zaWduZWQgaW50IG1vbl9iaW5fZ2V0X2RhdGEoY29uc3Qgc3RydWN0IG1vbl9yZWFkZXJfYmluICpycCwKKyAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCBzdHJ1Y3QgdXJiICp1cmIsIHVuc2lnbmVkIGludCBsZW5ndGgsCisgICAgY2hhciAqZmxhZykKIHsKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXVuc2lnbmVkIGludCB0aGlzX2xlbjsKIAotCWlmICh1cmItPnRyYW5zZmVyX2J1ZmZlciA9PSBOVUxMKQotCQlyZXR1cm4gJ1onOwotCW1vbl9jb3B5X3RvX2J1ZmYocnAsIG9mZnNldCwgdXJiLT50cmFuc2Zlcl9idWZmZXIsIGxlbmd0aCk7Ci0JcmV0dXJuIDA7CisJKmZsYWcgPSAwOworCWlmICh1cmItPm51bV9zZ3MgPT0gMCkgeworCQlpZiAodXJiLT50cmFuc2Zlcl9idWZmZXIgPT0gTlVMTCkgeworCQkJKmZsYWcgPSAnWic7CisJCQlyZXR1cm4gbGVuZ3RoOworCQl9CisJCW1vbl9jb3B5X3RvX2J1ZmYocnAsIG9mZnNldCwgdXJiLT50cmFuc2Zlcl9idWZmZXIsIGxlbmd0aCk7CisJCWxlbmd0aCA9IDA7CisKKwl9IGVsc2UgeworCQkvKiBJZiBJT01NVSBjb2FsZXNjaW5nIG9jY3VycmVkLCB3ZSBjYW5ub3QgdHJ1c3Qgc2dfcGFnZSAqLworCQlpZiAodXJiLT5zZy0+bmVudHMgIT0gdXJiLT5udW1fc2dzKSB7CisJCQkqZmxhZyA9ICdEJzsKKwkJCXJldHVybiBsZW5ndGg7CisJCX0KKworCQkvKiBDb3B5IHVwIHRvIHRoZSBmaXJzdCBub24tYWRkcmVzc2FibGUgc2VnbWVudCAqLworCQlmb3JfZWFjaF9zZyh1cmItPnNnLT5zZywgc2csIHVyYi0+bnVtX3NncywgaSkgeworCQkJaWYgKGxlbmd0aCA9PSAwIHx8IFBhZ2VIaWdoTWVtKHNnX3BhZ2Uoc2cpKSkKKwkJCQlicmVhazsKKwkJCXRoaXNfbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBzZy0+bGVuZ3RoLCBsZW5ndGgpOworCQkJb2Zmc2V0ID0gbW9uX2NvcHlfdG9fYnVmZihycCwgb2Zmc2V0LCBzZ192aXJ0KHNnKSwKKwkJCQkJdGhpc19sZW4pOworCQkJbGVuZ3RoIC09IHRoaXNfbGVuOworCQl9CisJCWlmIChpID09IDApCisJCQkqZmxhZyA9ICdEJzsKKwl9CisKKwlyZXR1cm4gbGVuZ3RoOwogfQogCiBzdGF0aWMgdm9pZCBtb25fYmluX2dldF9pc29kZXNjKGNvbnN0IHN0cnVjdCBtb25fcmVhZGVyX2JpbiAqcnAsCkBAIC01MzYsOCArNTY4LDkgQEAKIAl9CiAKIAlpZiAobGVuZ3RoICE9IDApIHsKLQkJZXAtPmZsYWdfZGF0YSA9IG1vbl9iaW5fZ2V0X2RhdGEocnAsIG9mZnNldCwgdXJiLCBsZW5ndGgpOwotCQlpZiAoZXAtPmZsYWdfZGF0YSAhPSAwKSB7CS8qIFllcywgaXQncyAweDAwLCBub3QgJzAnICovCisJCWxlbmd0aCA9IG1vbl9iaW5fZ2V0X2RhdGEocnAsIG9mZnNldCwgdXJiLCBsZW5ndGgsCisJCQkJJmVwLT5mbGFnX2RhdGEpOworCQlpZiAobGVuZ3RoID4gMCkgewogCQkJZGVsdGEgPSAoZXAtPmxlbl9jYXAgKyBQS1RfQUxJR04tMSkgJiB+KFBLVF9BTElHTi0xKTsKIAkJCWVwLT5sZW5fY2FwIC09IGxlbmd0aDsKIAkJCWRlbHRhIC09IChlcC0+bGVuX2NhcCArIFBLVF9BTElHTi0xKSAmIH4oUEtUX0FMSUdOLTEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbW9uL21vbl90ZXh0LmMgYi9kcml2ZXJzL3VzYi9tb24vbW9uX3RleHQuYwppbmRleCA5ZjFhOTIyLi4wNDc1NjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tb24vbW9uX3RleHQuYworKysgYi9kcml2ZXJzL3VzYi9tb24vbW9uX3RleHQuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKICNpbmNsdWRlICJ1c2JfbW9uLmgiCkBAIC0xMzcsNiArMTM4LDggQEAKIHN0YXRpYyBpbmxpbmUgY2hhciBtb25fdGV4dF9nZXRfZGF0YShzdHJ1Y3QgbW9uX2V2ZW50X3RleHQgKmVwLCBzdHJ1Y3QgdXJiICp1cmIsCiAgICAgaW50IGxlbiwgY2hhciBldl90eXBlLCBzdHJ1Y3QgbW9uX2J1cyAqbWJ1cykKIHsKKwl2b2lkICpzcmM7CisKIAlpZiAobGVuIDw9IDApCiAJCXJldHVybiAnTCc7CiAJaWYgKGxlbiA+PSBEQVRBX01BWCkKQEAgLTE1MCwxMCArMTUzLDI0IEBACiAJCQlyZXR1cm4gJz4nOwogCX0KIAotCWlmICh1cmItPnRyYW5zZmVyX2J1ZmZlciA9PSBOVUxMKQotCQlyZXR1cm4gJ1onOwkvKiAnMCcgd291bGQgYmUgbm90IGFzIHByZXR0eS4gKi8KKwlpZiAodXJiLT5udW1fc2dzID09IDApIHsKKwkJc3JjID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJCWlmIChzcmMgPT0gTlVMTCkKKwkJCXJldHVybiAnWic7CS8qICcwJyB3b3VsZCBiZSBub3QgYXMgcHJldHR5LiAqLworCX0gZWxzZSB7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSB1cmItPnNnLT5zZzsKIAotCW1lbWNweShlcC0+ZGF0YSwgdXJiLT50cmFuc2Zlcl9idWZmZXIsIGxlbik7CisJCS8qIElmIElPTU1VIGNvYWxlc2Npbmcgb2NjdXJyZWQsIHdlIGNhbm5vdCB0cnVzdCBzZ19wYWdlICovCisJCWlmICh1cmItPnNnLT5uZW50cyAhPSB1cmItPm51bV9zZ3MgfHwKKwkJCQlQYWdlSGlnaE1lbShzZ19wYWdlKHNnKSkpCisJCQlyZXR1cm4gJ0QnOworCisJCS8qIEZvciB0aGUgdGV4dCBpbnRlcmZhY2Ugd2UgY29weSBvbmx5IHRoZSBmaXJzdCBzZyBidWZmZXIgKi8KKwkJbGVuID0gbWluX3QoaW50LCBzZy0+bGVuZ3RoLCBsZW4pOworCQlzcmMgPSBzZ192aXJ0KHNnKTsKKwl9CisKKwltZW1jcHkoZXAtPmRhdGEsIHNyYywgbGVuKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9LY29uZmlnIGIvZHJpdmVycy91c2IvbXVzYi9LY29uZmlnCmluZGV4IGI4NGFiZDguLmQ5ZGI4NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9tdXNiL0tjb25maWcKQEAgLTksMTAgKzksOSBAQAogIyAoTSlIRFJDID0gKE11bHRpcG9pbnQpIEhpZ2hzcGVlZCBEdWFsLVJvbGUgQ29udHJvbGxlcgogY29uZmlnIFVTQl9NVVNCX0hEUkMKIAlkZXBlbmRzIG9uIChVU0IgfHwgVVNCX0dBREdFVCkKLQlkZXBlbmRzIG9uIChBUk0gfHwgQkxBQ0tGSU4pCi0Jc2VsZWN0IE5PUF9VU0JfWENFSVYgaWYgQVJDSF9EQVZJTkNJCisJZGVwZW5kcyBvbiAoQVJNIHx8IChCRjU0eCAmJiAhQkY1NDQpIHx8IChCRjUyeCAmJiAhQkY1MjIgJiYgIUJGNTIzKSkKKwlzZWxlY3QgTk9QX1VTQl9YQ0VJViBpZiAoQVJDSF9EQVZJTkNJIHx8IE1BQ0hfT01BUDNFVk0gfHwgQkxBQ0tGSU4pCiAJc2VsZWN0IFRXTDQwMzBfVVNCIGlmIE1BQ0hfT01BUF8zNDMwU0RQCi0Jc2VsZWN0IE5PUF9VU0JfWENFSVYgaWYgTUFDSF9PTUFQM0VWTQogCXNlbGVjdCBVU0JfT1RHX1VUSUxTCiAJdHJpc3RhdGUgJ0ludmVudHJhIEhpZ2hzcGVlZCBEdWFsIFJvbGUgQ29udHJvbGxlciAoVEksIEFESSwgLi4uKScKIAloZWxwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL2JsYWNrZmluLmMgYi9kcml2ZXJzL3VzYi9tdXNiL2JsYWNrZmluLmMKaW5kZXggZmNlYzg3ZS4uZmU0OTM0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9ibGFja2Zpbi5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvYmxhY2tmaW4uYwpAQCAtNTMsMTMgKzUzLDExIEBACiB2b2lkIG11c2JfcmVhZF9maWZvKHN0cnVjdCBtdXNiX2h3X2VwICpod19lcCwgdTE2IGxlbiwgdTggKmRzdCkKIHsKIAl2b2lkIF9faW9tZW0gKmZpZm8gPSBod19lcC0+ZmlmbzsKKworI2lmZGVmIENPTkZJR19CRjUyeAogCXU4IGVwbnVtID0gaHdfZXAtPmVwbnVtOwogCXUxNiBkbWFfcmVnID0gMDsKIAotCURCRyg0LCAiJWNYIGVwJWQgZmlmbyAlcCBjb3VudCAlZCBidWYgJXBcbiIsCi0JCQknUicsIGh3X2VwLT5lcG51bSwgZmlmbywgbGVuLCBkc3QpOwotCi0jaWZkZWYgQ09ORklHX0JGNTJ4CiAJaW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGludClkc3QsCiAJCSh1bnNpZ25lZCBpbnQpKGRzdCArIGxlbikpOwogCkBAIC0xMDIsNiArMTAwLDkgQEAKIAkJCWxlbiAmIDB4MDEgPyAobGVuID4+IDEpICsgMSA6IGxlbiA+PiAxKTsKICNlbmRpZgogCisJREJHKDQsICIlY1ggZXAlZCBmaWZvICVwIGNvdW50ICVkIGJ1ZiAlcFxuIiwKKwkJCSdSJywgaHdfZXAtPmVwbnVtLCBmaWZvLCBsZW4sIGRzdCk7CisKIAlkdW1wX2ZpZm9fZGF0YShkc3QsIGxlbik7CiB9CiAKQEAgLTIyNSw4ICsyMjYsOSBAQAogCXJldHVybiAwOwogfQogCi12b2lkIG11c2JfcGxhdGZvcm1fc2V0X21vZGUoc3RydWN0IG11c2IgKm11c2IsIHU4IG11c2JfbW9kZSkKK2ludCBtdXNiX3BsYXRmb3JtX3NldF9tb2RlKHN0cnVjdCBtdXNiICptdXNiLCB1OCBtdXNiX21vZGUpCiB7CisJcmV0dXJuIC1FSU87CiB9CiAKIGludCBfX2luaXQgbXVzYl9wbGF0Zm9ybV9pbml0KHN0cnVjdCBtdXNiICptdXNiKQpAQCAtMjYxLDEwICsyNjMsNiBAQAogCQlTU1lOQygpOwogCX0KIAotCS8qIFRPRE8KLQkgKiBTZXQgU0lDLUlWRyByZWdpc3RlcgotCSAqLwotCiAJLyogQ29uZmlndXJlIFBMTCBvc2NpbGxhdG9yIHJlZ2lzdGVyICovCiAJYmZpbl93cml0ZV9VU0JfUExMT1NDX0NUUkwoMHgzMGE4KTsKIAlTU1lOQygpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9ibGFja2Zpbi5oIGIvZHJpdmVycy91c2IvbXVzYi9ibGFja2Zpbi5oCmluZGV4IGEyNDBjMWUuLjEwYjdkNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvYmxhY2tmaW4uaAorKysgYi9kcml2ZXJzL3VzYi9tdXNiL2JsYWNrZmluLmgKQEAgLTE0LDYgKzE0LDQzIEBACiAgKiBCbGFja2ZpbiBzcGVjaWZpYyBkZWZpbml0aW9ucwogICovCiAKKy8qIEFub21hbGllcyBub3RlczoKKyAqCisgKiAgMDUwMDA0NTAgLSBVU0IgRE1BIE1vZGUgMSBTaG9ydCBQYWNrZXQgRGF0YSBDb3JydXB0aW9uOgorICogICAgICAgICAgICAgTVVTQiBkcml2ZXIgaXMgZGVzaWduZWQgdG8gdHJhbnNmZXIgYnVmZmVyIG9mIE4gKiBtYXhwYWNrZXQgc2l6ZQorICogICAgICAgICAgICAgaW4gRE1BIG1vZGUgMSBhbmQgbGVhdmUgdGhlIHJlc3Qgb2YgdGhlIGRhdGEgdG8gdGhlIG5leHQKKyAqICAgICAgICAgICAgIHRyYW5zZmVyIGluIERNQSBtb2RlIDAsIHNvIHdlIG5ldmVyIHRyYW5zbWl0IGEgc2hvcnQgcGFja2V0IGluCisgKiAgICAgICAgICAgICBETUEgbW9kZSAxLgorICoKKyAqICAwNTAwMDQ2MyAtIFRoaXMgYW5vbWFseSBkb2Vzbid0IGFmZmVjdCB0aGlzIGRyaXZlciBzaW5jZSBpdAorICogICAgICAgICAgICAgbmV2ZXIgdXNlcyBMMSBvciBMMiBtZW1vcnkgYXMgZGF0YSBkZXN0aW5hdGlvbi4KKyAqCisgKiAgMDUwMDA0NjQgLSBUaGlzIGFub21hbHkgZG9lc24ndCBhZmZlY3QgdGhpcyBkcml2ZXIgc2luY2UgaXQKKyAqICAgICAgICAgICAgIG5ldmVyIHVzZXMgTDEgb3IgTDIgbWVtb3J5IGFzIGRhdGEgc291cmNlLgorICoKKyAqICAwNTAwMDQ2NSAtIFRoZSBhbm9tYWx5IGNhbiBiZSBzZWVuIHdoZW4gU0NMSyBpcyBvdmVyIDEwMCBNSHosIGFuZCB0aGVyZSBpcworICogICAgICAgICAgICAgbm8gd2F5IHRvIHdvcmthcm91bmQgZm9yIGJ1bGsgZW5kcG9pbnRzLiAgU2luY2UgdGhlIHdNYXhQYWNrU2l6ZQorICogICAgICAgICAgICAgb2YgYnVsayBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gNTEyLCB3aGlsZSB0aGUgZmlmbyBzaXplIG9mCisgKiAgICAgICAgICAgICBlbmRwb2ludCA1LCA2LCA3IGlzIDEwMjQsIHRoZSBkb3VibGUgYnVmZmVyIG1vZGUgaXMgZW5hYmxlZAorICogICAgICAgICAgICAgYXV0b21hdGljYWxseSB3aGVuIHRoZXNlIGVuZHBvaW50cyBhcmUgdXNlZCBmb3IgYnVsayBPVVQuCisgKgorICogIDA1MDAwNDY2IC0gVGhpcyBhbm9tYWx5IGRvZXNuJ3QgYWZmZWN0IHRoaXMgZHJpdmVyIHNpbmNlIGl0IG5ldmVyIG1peGVzCisgKiAgICAgICAgICAgICBjb25jdXJyZW50IERNQSBhbmQgY29yZSBhY2Nlc3NlcyB0byB0aGUgVFggZW5kcG9pbnQgRklGT3MuCisgKgorICogIDA1MDAwNDY3IC0gVGhlIHdvcmthcm91bmQgZm9yIHRoaXMgYW5vbWFseSB3aWxsIGludHJvZHVjZSBhbm90aGVyCisgKiAgICAgICAgICAgICBhbm9tYWx5IC0gMDUwMDA0NjUuCisgKi8KKworLyogVGhlIE1lbnRvciBVU0IgRE1BIGVuZ2luZSBvbiBCRjUyeCAoc2lsaWNvbiB2MC4wIGFuZCB2MC4xKSBzZWVtcyB0byBiZQorICogdW5zdGFibGUgaW4gaG9zdCBtb2RlLiAgVGhpcyBtYXkgYmUgY2F1c2VkIGJ5IEFub21hbHkgMDUwMDAzODAuICBBZnRlcgorICogZGlnZ2luZyBvdXQgdGhlIHJvb3QgY2F1c2UsIHdlIHdpbGwgY2hhbmdlIHRoaXMgbnVtYmVyIGFjY29yZGluZ2x5LgorICogU28sIG5lZWQgdG8gZWl0aGVyIHVzZSBzaWxpY29uIHYwLjIrIG9yIGRpc2FibGUgRE1BIG1vZGUgaW4gTVVTQi4KKyAqLworI2lmIEFOT01BTFlfMDUwMDAzODAgJiYgZGVmaW5lZChDT05GSUdfQkY1MngpICYmIFwKKyAgICBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9IRFJDKSAmJiAhZGVmaW5lZChDT05GSUdfTVVTQl9QSU9fT05MWSkKKyMgZXJyb3IgIlBsZWFzZSB1c2UgUElPIG1vZGUgaW4gTVVTQiBkcml2ZXIgb24gYmY1MnggY2hpcCB2MC4wIGFuZCB2MC4xIgorI2VuZGlmCisKICN1bmRlZiBEVU1QX0ZJRk9fREFUQQogI2lmZGVmIERVTVBfRklGT19EQVRBCiBzdGF0aWMgdm9pZCBkdW1wX2ZpZm9fZGF0YSh1OCAqYnVmLCB1MTYgbGVuKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmMKaW5kZXggNTQ3ZTBlMy4uNDlmMjM0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jCkBAIC0xMzE5LDcgKzEzMTksNiBAQAogI2VuZGlmCiAJdTggcmVnOwogCWNoYXIgKnR5cGU7Ci0JdTE2IGh3dmVycywgcmV2X21ham9yLCByZXZfbWlub3I7CiAJY2hhciBhSW5mb1s3OF0sIGFSZXZpc2lvblszMl0sIGFEYXRlWzEyXTsKIAl2b2lkIF9faW9tZW0JKm1iYXNlID0gbXVzYi0+bXJlZ3M7CiAJaW50CQlzdGF0dXMgPSAwOwpAQCAtMTM5MSwxMSArMTM5MCwxMCBAQAogCX0KIAogCS8qIGxvZyByZWxlYXNlIGluZm8gKi8KLQlod3ZlcnMgPSBtdXNiX3JlYWRfaHd2ZXJzKG1iYXNlKTsKLQlyZXZfbWFqb3IgPSAoaHd2ZXJzID4+IDEwKSAmIDB4MWY7Ci0JcmV2X21pbm9yID0gaHd2ZXJzICYgMHgzZmY7Ci0Jc25wcmludGYoYVJldmlzaW9uLCAzMiwgIiVkLiVkJXMiLCByZXZfbWFqb3IsCi0JCXJldl9taW5vciwgKGh3dmVycyAmIDB4ODAwMCkgPyAiUkMiIDogIiIpOworCW11c2ItPmh3dmVycyA9IG11c2JfcmVhZF9od3ZlcnMobWJhc2UpOworCXNucHJpbnRmKGFSZXZpc2lvbiwgMzIsICIlZC4lZCVzIiwgTVVTQl9IV1ZFUlNfTUFKT1IobXVzYi0+aHd2ZXJzKSwKKwkJTVVTQl9IV1ZFUlNfTUlOT1IobXVzYi0+aHd2ZXJzKSwKKwkJKG11c2ItPmh3dmVycyAmIE1VU0JfSFdWRVJTX1JDKSA/ICJSQyIgOiAiIik7CiAJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlc0hEUkMgUlRMIHZlcnNpb24gJXMgJXNcbiIsCiAJCQltdXNiX2RyaXZlcl9uYW1lLCB0eXBlLCBhUmV2aXNpb24sIGFEYXRlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuaCBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmgKaW5kZXggNmFhNWYyMi4uMDNkNTA5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuaAorKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5oCkBAIC0zMjIsNiArMzIyLDE0IEBACiAJc3RydWN0IGNsawkJKmNsb2NrOwogCWlycXJldHVybl90CQkoKmlzcikoaW50LCB2b2lkICopOwogCXN0cnVjdCB3b3JrX3N0cnVjdAlpcnFfd29yazsKKyNkZWZpbmUgTVVTQl9IV1ZFUlNfTUFKT1IoeCkJKCh4ID4+IDEwKSAmIDB4MWYpCisjZGVmaW5lIE1VU0JfSFdWRVJTX01JTk9SKHgpCSh4ICYgMHgzZmYpCisjZGVmaW5lIE1VU0JfSFdWRVJTX1JDCQkweDgwMDAKKyNkZWZpbmUgTVVTQl9IV1ZFUlNfMTMwMAkweDUyQworI2RlZmluZSBNVVNCX0hXVkVSU18xNDAwCTB4NTkwCisjZGVmaW5lIE1VU0JfSFdWRVJTXzE4MDAJMHg3MjAKKyNkZWZpbmUgTVVTQl9IV1ZFUlNfMjAwMAkweDgwMAorCXUxNgkJCWh3dmVyczsKIAogLyogdGhpcyBodWIgc3RhdHVzIGJpdCBpcyByZXNlcnZlZCBieSBVU0IgMi4wIGFuZCBub3Qgc2VlbiBieSB1c2Jjb3JlICovCiAjZGVmaW5lIE1VU0JfUE9SVF9TVEFUX1JFU1VNRQkoMSA8PCAzMSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9kbWEuaCBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9kbWEuaAppbmRleCAwYTJjNGUzLi45MTYwNjViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfZG1hLmgKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2RtYS5oCkBAIC04MCw2ICs4MCwxNyBAQAogI2RlZmluZSB0dXNiX2RtYV9vbWFwKCkJCQkwCiAjZW5kaWYKIAorLyogQW5vbWFseSAwNTAwMDQ1NiAtIFVTQiBSZWNlaXZlIEludGVycnVwdCBJcyBOb3QgR2VuZXJhdGVkIGluIERNQSBNb2RlIDEKKyAqCU9ubHkgYWxsb3cgRE1BIG1vZGUgMSB0byBiZSB1c2VkIHdoZW4gdGhlIFVTQiB3aWxsIGFjdHVhbGx5IGdlbmVyYXRlIHRoZQorICoJaW50ZXJydXB0cyB3ZSBleHBlY3QuCisgKi8KKyNpZmRlZiBDT05GSUdfQkxBQ0tGSU4KKyMgdW5kZWYgVVNFX01PREUxCisjIGlmICFBTk9NQUxZXzA1MDAwNDU2CisjICBkZWZpbmUgVVNFX01PREUxCisjIGVuZGlmCisjZW5kaWYKKwogLyoKICAqIERNQSBjaGFubmVsIHN0YXR1cyAuLi4gdXBkYXRlZCBieSB0aGUgZG1hIGNvbnRyb2xsZXIgZHJpdmVyIHdoZW5ldmVyIHRoYXQKICAqIHN0YXR1cyBjaGFuZ2VzLCBhbmQgcHJvdGVjdGVkIGJ5IHRoZSBvdmVyYWxsIGNvbnRyb2xsZXIgc3BpbmxvY2suCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0LmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0LmMKaW5kZXggNzQwNzNmOS4uYzQ5YjliYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldC5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9nYWRnZXQuYwpAQCAtNDI5LDExMiArNDI5LDEwMiBAQAogCURCRyg0LCAiPD09ICVzLCB0eGNzciAlMDR4XG4iLCBtdXNiX2VwLT5lbmRfcG9pbnQubmFtZSwgY3NyKTsKIAogCWRtYSA9IGlzX2RtYV9jYXBhYmxlKCkgPyBtdXNiX2VwLT5kbWEgOiBOVUxMOwotCWRvIHsKLQkJLyogUkVWSVNJVCBmb3IgaGlnaCBiYW5kd2lkdGgsIE1VU0JfVFhDU1JfUF9JTkNPTVBUWAotCQkgKiBwcm9iYWJseSByYXRlcyByZXBvcnRpbmcgYXMgYSBob3N0IGVycm9yCisKKwkvKgorCSAqIFJFVklTSVQ6IGZvciBoaWdoIGJhbmR3aWR0aCwgTVVTQl9UWENTUl9QX0lOQ09NUFRYCisJICogcHJvYmFibHkgcmF0ZXMgcmVwb3J0aW5nIGFzIGEgaG9zdCBlcnJvci4KKwkgKi8KKwlpZiAoY3NyICYgTVVTQl9UWENTUl9QX1NFTlRTVEFMTCkgeworCQljc3IgfD0JTVVTQl9UWENTUl9QX1daQ19CSVRTOworCQljc3IgJj0gfk1VU0JfVFhDU1JfUF9TRU5UU1RBTEw7CisJCW11c2Jfd3JpdGV3KGVwaW8sIE1VU0JfVFhDU1IsIGNzcik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoY3NyICYgTVVTQl9UWENTUl9QX1VOREVSUlVOKSB7CisJCS8qIFdlIE5BS2VkLCBubyBiaWcgZGVhbC4uLiBsaXR0bGUgcmVhc29uIHRvIGNhcmUuICovCisJCWNzciB8PQkgTVVTQl9UWENTUl9QX1daQ19CSVRTOworCQljc3IgJj0gfihNVVNCX1RYQ1NSX1BfVU5ERVJSVU4gfCBNVVNCX1RYQ1NSX1RYUEtUUkRZKTsKKwkJbXVzYl93cml0ZXcoZXBpbywgTVVTQl9UWENTUiwgY3NyKTsKKwkJREJHKDIwLCAidW5kZXJydW4gb24gZXAlZCwgcmVxICVwXG4iLCBlcG51bSwgcmVxdWVzdCk7CisJfQorCisJaWYgKGRtYV9jaGFubmVsX3N0YXR1cyhkbWEpID09IE1VU0JfRE1BX1NUQVRVU19CVVNZKSB7CisJCS8qCisJCSAqIFNIT1VMRCBOT1QgSEFQUEVOLi4uIGhhcyB3aXRoIENQUEkgdGhvdWdoLCBhZnRlcgorCQkgKiBjaGFuZ2luZyBTRU5EU1RBTEwgKGFuZCBvdGhlciBjYXNlcyk7IGhhcm1sZXNzPwogCQkgKi8KLQkJaWYgKGNzciAmIE1VU0JfVFhDU1JfUF9TRU5UU1RBTEwpIHsKKwkJREJHKDUsICIlcyBkbWEgc3RpbGwgYnVzeT9cbiIsIG11c2JfZXAtPmVuZF9wb2ludC5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChyZXF1ZXN0KSB7CisJCXU4CWlzX2RtYSA9IDA7CisKKwkJaWYgKGRtYSAmJiAoY3NyICYgTVVTQl9UWENTUl9ETUFFTkFCKSkgeworCQkJaXNfZG1hID0gMTsKIAkJCWNzciB8PSBNVVNCX1RYQ1NSX1BfV1pDX0JJVFM7Ci0JCQljc3IgJj0gfk1VU0JfVFhDU1JfUF9TRU5UU1RBTEw7CisJCQljc3IgJj0gfihNVVNCX1RYQ1NSX0RNQUVOQUIgfCBNVVNCX1RYQ1NSX1BfVU5ERVJSVU4gfAorCQkJCSBNVVNCX1RYQ1NSX1RYUEtUUkRZKTsKIAkJCW11c2Jfd3JpdGV3KGVwaW8sIE1VU0JfVFhDU1IsIGNzcik7Ci0JCQlicmVhazsKKwkJCS8qIEVuc3VyZSB3cml0ZWJ1ZmZlciBpcyBlbXB0eS4gKi8KKwkJCWNzciA9IG11c2JfcmVhZHcoZXBpbywgTVVTQl9UWENTUik7CisJCQlyZXF1ZXN0LT5hY3R1YWwgKz0gbXVzYl9lcC0+ZG1hLT5hY3R1YWxfbGVuOworCQkJREJHKDQsICJUWENTUiVkICUwNHgsIERNQSBvZmYsIGxlbiAlenUsIHJlcSAlcFxuIiwKKwkJCQllcG51bSwgY3NyLCBtdXNiX2VwLT5kbWEtPmFjdHVhbF9sZW4sIHJlcXVlc3QpOwogCQl9CiAKLQkJaWYgKGNzciAmIE1VU0JfVFhDU1JfUF9VTkRFUlJVTikgewotCQkJLyogd2UgTkFLZWQsIG5vIGJpZyBkZWFsIC4uLiBsaXR0bGUgcmVhc29uIHRvIGNhcmUgKi8KLQkJCWNzciB8PSBNVVNCX1RYQ1NSX1BfV1pDX0JJVFM7Ci0JCQljc3IgJj0gfihNVVNCX1RYQ1NSX1BfVU5ERVJSVU4KLQkJCQkJfCBNVVNCX1RYQ1NSX1RYUEtUUkRZKTsKLQkJCW11c2Jfd3JpdGV3KGVwaW8sIE1VU0JfVFhDU1IsIGNzcik7Ci0JCQlEQkcoMjAsICJ1bmRlcnJ1biBvbiBlcCVkLCByZXEgJXBcbiIsIGVwbnVtLCByZXF1ZXN0KTsKLQkJfQotCi0JCWlmIChkbWFfY2hhbm5lbF9zdGF0dXMoZG1hKSA9PSBNVVNCX0RNQV9TVEFUVVNfQlVTWSkgewotCQkJLyogU0hPVUxEIE5PVCBIQVBQRU4gLi4uIGhhcyB3aXRoIGNwcGkgdGhvdWdoLCBhZnRlcgotCQkJICogY2hhbmdpbmcgU0VORFNUQUxMIChhbmQgb3RoZXIgY2FzZXMpOyBoYXJtbGVzcz8KKwkJaWYgKGlzX2RtYSB8fCByZXF1ZXN0LT5hY3R1YWwgPT0gcmVxdWVzdC0+bGVuZ3RoKSB7CisJCQkvKgorCQkJICogRmlyc3QsIG1heWJlIGEgdGVybWluYXRpbmcgc2hvcnQgcGFja2V0LiBTb21lIERNQQorCQkJICogZW5naW5lcyBtaWdodCBoYW5kbGUgdGhpcyBieSB0aGVtc2VsdmVzLgogCQkJICovCi0JCQlEQkcoNSwgIiVzIGRtYSBzdGlsbCBidXN5P1xuIiwgbXVzYl9lcC0+ZW5kX3BvaW50Lm5hbWUpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAocmVxdWVzdCkgewotCQkJdTgJaXNfZG1hID0gMDsKLQotCQkJaWYgKGRtYSAmJiAoY3NyICYgTVVTQl9UWENTUl9ETUFFTkFCKSkgewotCQkJCWlzX2RtYSA9IDE7Ci0JCQkJY3NyIHw9IE1VU0JfVFhDU1JfUF9XWkNfQklUUzsKLQkJCQljc3IgJj0gfihNVVNCX1RYQ1NSX0RNQUVOQUIKLQkJCQkJCXwgTVVTQl9UWENTUl9QX1VOREVSUlVOCi0JCQkJCQl8IE1VU0JfVFhDU1JfVFhQS1RSRFkpOwotCQkJCW11c2Jfd3JpdGV3KGVwaW8sIE1VU0JfVFhDU1IsIGNzcik7Ci0JCQkJLyogZW5zdXJlIHdyaXRlYnVmZmVyIGlzIGVtcHR5ICovCi0JCQkJY3NyID0gbXVzYl9yZWFkdyhlcGlvLCBNVVNCX1RYQ1NSKTsKLQkJCQlyZXF1ZXN0LT5hY3R1YWwgKz0gbXVzYl9lcC0+ZG1hLT5hY3R1YWxfbGVuOwotCQkJCURCRyg0LCAiVFhDU1IlZCAlMDR4LCBkbWEgb2ZmLCAiCi0JCQkJCQkibGVuICV6dSwgcmVxICVwXG4iLAotCQkJCQllcG51bSwgY3NyLAotCQkJCQltdXNiX2VwLT5kbWEtPmFjdHVhbF9sZW4sCi0JCQkJCXJlcXVlc3QpOwotCQkJfQotCi0JCQlpZiAoaXNfZG1hIHx8IHJlcXVlc3QtPmFjdHVhbCA9PSByZXF1ZXN0LT5sZW5ndGgpIHsKLQotCQkJCS8qIEZpcnN0LCBtYXliZSBhIHRlcm1pbmF0aW5nIHNob3J0IHBhY2tldC4KLQkJCQkgKiBTb21lIERNQSBlbmdpbmVzIG1pZ2h0IGhhbmRsZSB0aGlzIGJ5Ci0JCQkJICogdGhlbXNlbHZlcy4KLQkJCQkgKi8KLQkJCQlpZiAoKHJlcXVlc3QtPnplcm8KLQkJCQkJCSYmIHJlcXVlc3QtPmxlbmd0aAotCQkJCQkJJiYgKHJlcXVlc3QtPmxlbmd0aAotCQkJCQkJCSUgbXVzYl9lcC0+cGFja2V0X3N6KQotCQkJCQkJCT09IDApCisJCQlpZiAoKHJlcXVlc3QtPnplcm8gJiYgcmVxdWVzdC0+bGVuZ3RoCisJCQkJJiYgcmVxdWVzdC0+bGVuZ3RoICUgbXVzYl9lcC0+cGFja2V0X3N6ID09IDApCiAjaWZkZWYgQ09ORklHX1VTQl9JTlZFTlRSQV9ETUEKLQkJCQkJfHwgKGlzX2RtYSAmJgotCQkJCQkJKCghZG1hLT5kZXNpcmVkX21vZGUpIHx8Ci0JCQkJCQkgICAgKHJlcXVlc3QtPmFjdHVhbCAmCi0JCQkJCQkgICAgKG11c2JfZXAtPnBhY2tldF9zeiAtIDEpKSkpCisJCQkJfHwgKGlzX2RtYSAmJiAoIWRtYS0+ZGVzaXJlZF9tb2RlIHx8CisJCQkJCShyZXF1ZXN0LT5hY3R1YWwgJgorCQkJCQkJKG11c2JfZXAtPnBhY2tldF9zeiAtIDEpKSkpCiAjZW5kaWYKLQkJCQkpIHsKLQkJCQkJLyogb24gZG1hIGNvbXBsZXRpb24sIGZpZm8gbWF5IG5vdAotCQkJCQkgKiBiZSBhdmFpbGFibGUgeWV0IC4uLgotCQkJCQkgKi8KLQkJCQkJaWYgKGNzciAmIE1VU0JfVFhDU1JfVFhQS1RSRFkpCi0JCQkJCQlicmVhazsKLQotCQkJCQlEQkcoNCwgInNlbmRpbmcgemVybyBwa3RcbiIpOwotCQkJCQltdXNiX3dyaXRldyhlcGlvLCBNVVNCX1RYQ1NSLAotCQkJCQkJCU1VU0JfVFhDU1JfTU9ERQotCQkJCQkJCXwgTVVTQl9UWENTUl9UWFBLVFJEWSk7Ci0JCQkJCXJlcXVlc3QtPnplcm8gPSAwOwotCQkJCX0KLQotCQkJCS8qIC4uLiBvciBpZiBub3QsIHRoZW4gY29tcGxldGUgaXQgKi8KLQkJCQltdXNiX2dfZ2l2ZWJhY2sobXVzYl9lcCwgcmVxdWVzdCwgMCk7Ci0KLQkJCQkvKiBraWNrc3RhcnQgbmV4dCB0cmFuc2ZlciBpZiBhcHByb3ByaWF0ZTsKLQkJCQkgKiB0aGUgcGFja2V0IHRoYXQganVzdCBjb21wbGV0ZWQgbWlnaHQgbm90Ci0JCQkJICogYmUgdHJhbnNtaXR0ZWQgZm9yIGhvdXJzIG9yIGRheXMuCi0JCQkJICogUkVWSVNJVCBmb3IgZG91YmxlIGJ1ZmZlcmluZy4uLgotCQkJCSAqIEZJWE1FIHJldmlzaXQgZm9yIHN0YWxscyB0b28uLi4KKwkJCSkgeworCQkJCS8qCisJCQkJICogT24gRE1BIGNvbXBsZXRpb24sIEZJRk8gbWF5IG5vdCBiZQorCQkJCSAqIGF2YWlsYWJsZSB5ZXQuLi4KIAkJCQkgKi8KLQkJCQltdXNiX2VwX3NlbGVjdChtYmFzZSwgZXBudW0pOwotCQkJCWNzciA9IG11c2JfcmVhZHcoZXBpbywgTVVTQl9UWENTUik7Ci0JCQkJaWYgKGNzciAmIE1VU0JfVFhDU1JfRklGT05PVEVNUFRZKQotCQkJCQlicmVhazsKLQkJCQlyZXF1ZXN0ID0gbXVzYl9lcC0+ZGVzYwotCQkJCQkJPyBuZXh0X3JlcXVlc3QobXVzYl9lcCkKLQkJCQkJCTogTlVMTDsKLQkJCQlpZiAoIXJlcXVlc3QpIHsKLQkJCQkJREJHKDQsICIlcyBpZGxlIG5vd1xuIiwKLQkJCQkJCW11c2JfZXAtPmVuZF9wb2ludC5uYW1lKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQorCQkJCWlmIChjc3IgJiBNVVNCX1RYQ1NSX1RYUEtUUkRZKQorCQkJCQlyZXR1cm47CisKKwkJCQlEQkcoNCwgInNlbmRpbmcgemVybyBwa3RcbiIpOworCQkJCW11c2Jfd3JpdGV3KGVwaW8sIE1VU0JfVFhDU1IsIE1VU0JfVFhDU1JfTU9ERQorCQkJCQkJfCBNVVNCX1RYQ1NSX1RYUEtUUkRZKTsKKwkJCQlyZXF1ZXN0LT56ZXJvID0gMDsKIAkJCX0KIAotCQkJdHhzdGF0ZShtdXNiLCB0b19tdXNiX3JlcXVlc3QocmVxdWVzdCkpOworCQkJLyogLi4uIG9yIGlmIG5vdCwgdGhlbiBjb21wbGV0ZSBpdC4gKi8KKwkJCW11c2JfZ19naXZlYmFjayhtdXNiX2VwLCByZXF1ZXN0LCAwKTsKKworCQkJLyoKKwkJCSAqIEtpY2tzdGFydCBuZXh0IHRyYW5zZmVyIGlmIGFwcHJvcHJpYXRlOworCQkJICogdGhlIHBhY2tldCB0aGF0IGp1c3QgY29tcGxldGVkIG1pZ2h0IG5vdAorCQkJICogYmUgdHJhbnNtaXR0ZWQgZm9yIGhvdXJzIG9yIGRheXMuCisJCQkgKiBSRVZJU0lUIGZvciBkb3VibGUgYnVmZmVyaW5nLi4uCisJCQkgKiBGSVhNRSByZXZpc2l0IGZvciBzdGFsbHMgdG9vLi4uCisJCQkgKi8KKwkJCW11c2JfZXBfc2VsZWN0KG1iYXNlLCBlcG51bSk7CisJCQljc3IgPSBtdXNiX3JlYWR3KGVwaW8sIE1VU0JfVFhDU1IpOworCQkJaWYgKGNzciAmIE1VU0JfVFhDU1JfRklGT05PVEVNUFRZKQorCQkJCXJldHVybjsKKworCQkJaWYgKCFtdXNiX2VwLT5kZXNjKSB7CisJCQkJREJHKDQsICIlcyBpZGxlIG5vd1xuIiwKKwkJCQkJbXVzYl9lcC0+ZW5kX3BvaW50Lm5hbWUpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZQorCQkJCXJlcXVlc3QgPSBuZXh0X3JlcXVlc3QobXVzYl9lcCk7CiAJCX0KIAotCX0gd2hpbGUgKDApOworCQl0eHN0YXRlKG11c2IsIHRvX211c2JfcmVxdWVzdChyZXF1ZXN0KSk7CisJfQogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTk2Niw2ICs5NTYsNyBAQAogCiAJbXVzYl9lcC0+ZGVzYyA9IGRlc2M7CiAJbXVzYl9lcC0+YnVzeSA9IDA7CisJbXVzYl9lcC0+d2VkZ2VkID0gMDsKIAlzdGF0dXMgPSAwOwogCiAJcHJfZGVidWcoIiVzIHBlcmlwaDogZW5hYmxlZCAlcyBmb3IgJXMgJXMsICVzbWF4cGFja2V0ICVkXG4iLApAQCAtMTIyMCw3ICsxMjExLDcgQEAKICAqCiAgKiBleHBvcnRlZCB0byBlcDAgY29kZQogICovCi1pbnQgbXVzYl9nYWRnZXRfc2V0X2hhbHQoc3RydWN0IHVzYl9lcCAqZXAsIGludCB2YWx1ZSkKK3N0YXRpYyBpbnQgbXVzYl9nYWRnZXRfc2V0X2hhbHQoc3RydWN0IHVzYl9lcCAqZXAsIGludCB2YWx1ZSkKIHsKIAlzdHJ1Y3QgbXVzYl9lcAkJKm11c2JfZXAgPSB0b19tdXNiX2VwKGVwKTsKIAl1OAkJCWVwbnVtID0gbXVzYl9lcC0+Y3VycmVudF9lcG51bTsKQEAgLTEyNjIsNyArMTI1Myw4IEBACiAJCQkJZ290byBkb25lOwogCQkJfQogCQl9Ci0JfQorCX0gZWxzZQorCQltdXNiX2VwLT53ZWRnZWQgPSAwOwogCiAJLyogc2V0L2NsZWFyIHRoZSBzdGFsbCBhbmQgdG9nZ2xlIGJpdHMgKi8KIAlEQkcoMiwgIiVzOiAlcyBzdGFsbFxuIiwgZXAtPm5hbWUsIHZhbHVlID8gInNldCIgOiAiY2xlYXIiKTsKQEAgLTEzMDEsNiArMTI5MywyMSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKKy8qCisgKiBTZXRzIHRoZSBoYWx0IGZlYXR1cmUgd2l0aCB0aGUgY2xlYXIgcmVxdWVzdHMgaWdub3JlZAorICovCitzdGF0aWMgaW50IG11c2JfZ2FkZ2V0X3NldF93ZWRnZShzdHJ1Y3QgdXNiX2VwICplcCkKK3sKKwlzdHJ1Y3QgbXVzYl9lcAkJKm11c2JfZXAgPSB0b19tdXNiX2VwKGVwKTsKKworCWlmICghZXApCisJCXJldHVybiAtRUlOVkFMOworCisJbXVzYl9lcC0+d2VkZ2VkID0gMTsKKworCXJldHVybiB1c2JfZXBfc2V0X2hhbHQoZXApOworfQorCiBzdGF0aWMgaW50IG11c2JfZ2FkZ2V0X2ZpZm9fc3RhdHVzKHN0cnVjdCB1c2JfZXAgKmVwKQogewogCXN0cnVjdCBtdXNiX2VwCQkqbXVzYl9lcCA9IHRvX211c2JfZXAoZXApOwpAQCAtMTM3MSw2ICsxMzc4LDcgQEAKIAkucXVldWUJCT0gbXVzYl9nYWRnZXRfcXVldWUsCiAJLmRlcXVldWUJPSBtdXNiX2dhZGdldF9kZXF1ZXVlLAogCS5zZXRfaGFsdAk9IG11c2JfZ2FkZ2V0X3NldF9oYWx0LAorCS5zZXRfd2VkZ2UJPSBtdXNiX2dhZGdldF9zZXRfd2VkZ2UsCiAJLmZpZm9fc3RhdHVzCT0gbXVzYl9nYWRnZXRfZmlmb19zdGF0dXMsCiAJLmZpZm9fZmx1c2gJPSBtdXNiX2dhZGdldF9maWZvX2ZsdXNoCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldC5oIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldC5oCmluZGV4IDU5NTAyZGEuLmM4YjE0MDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9nYWRnZXQuaAorKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0LmgKQEAgLTc1LDYgKzc1LDggQEAKIAkvKiBsYXRlciB0aGluZ3MgYXJlIG1vZGlmaWVkIGJhc2VkIG9uIHVzYWdlICovCiAJc3RydWN0IGxpc3RfaGVhZAkJcmVxX2xpc3Q7CiAKKwl1OAkJCQl3ZWRnZWQ7CisKIAkvKiB0cnVlIGlmIGxvY2sgbXVzdCBiZSBkcm9wcGVkIGJ1dCByZXFfbGlzdCBtYXkgbm90IGJlIGFkdmFuY2VkICovCiAJdTgJCQkJYnVzeTsKIH07CkBAIC0xMDMsNiArMTA1LDQgQEAKIAogZXh0ZXJuIHZvaWQgbXVzYl9nX2dpdmViYWNrKHN0cnVjdCBtdXNiX2VwICosIHN0cnVjdCB1c2JfcmVxdWVzdCAqLCBpbnQpOwogCi1leHRlcm4gaW50IG11c2JfZ2FkZ2V0X3NldF9oYWx0KHN0cnVjdCB1c2JfZXAgKmVwLCBpbnQgdmFsdWUpOwotCiAjZW5kaWYJCS8qIF9fTVVTQl9HQURHRVRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldF9lcDAuYyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9nYWRnZXRfZXAwLmMKaW5kZXggNTIyZWZiMy4uOGZiYTNmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldF9lcDAuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0X2VwMC5jCkBAIC0xOTksNyArMTk5LDYgQEAKIHN0YXRpYyB2b2lkIG11c2JfZ19lcDBfZ2l2ZWJhY2soc3RydWN0IG11c2IgKm11c2IsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKQogewogCW11c2JfZ19naXZlYmFjaygmbXVzYi0+ZW5kcG9pbnRzWzBdLmVwX2luLCByZXEsIDApOwotCW11c2ItPmVwMF9zdGF0ZSA9IE1VU0JfRVAwX1NUQUdFX1NFVFVQOwogfQogCiAvKgpAQCAtMjU4LDMwICsyNTcsNTMgQEAKIAkJCWNhc2UgVVNCX1JFQ0lQX0lOVEVSRkFDRToKIAkJCQlicmVhazsKIAkJCWNhc2UgVVNCX1JFQ0lQX0VORFBPSU5UOnsKLQkJCQljb25zdCB1OCBudW0gPSBjdHJscmVxdWVzdC0+d0luZGV4ICYgMHgwZjsKLQkJCQlzdHJ1Y3QgbXVzYl9lcCAqbXVzYl9lcDsKKwkJCQljb25zdCB1OAkJZXBudW0gPQorCQkJCQljdHJscmVxdWVzdC0+d0luZGV4ICYgMHgwZjsKKwkJCQlzdHJ1Y3QgbXVzYl9lcAkJKm11c2JfZXA7CisJCQkJc3RydWN0IG11c2JfaHdfZXAJKmVwOworCQkJCXZvaWQgX19pb21lbQkJKnJlZ3M7CisJCQkJaW50CQkJaXNfaW47CisJCQkJdTE2CQkJY3NyOwogCi0JCQkJaWYgKG51bSA9PSAwCi0JCQkJCQl8fCBudW0gPj0gTVVTQl9DX05VTV9FUFMKLQkJCQkJCXx8IGN0cmxyZXF1ZXN0LT53VmFsdWUKLQkJCQkJCQkhPSBVU0JfRU5EUE9JTlRfSEFMVCkKKwkJCQlpZiAoZXBudW0gPT0gMCB8fCBlcG51bSA+PSBNVVNCX0NfTlVNX0VQUyB8fAorCQkJCSAgICBjdHJscmVxdWVzdC0+d1ZhbHVlICE9IFVTQl9FTkRQT0lOVF9IQUxUKQogCQkJCQlicmVhazsKIAotCQkJCWlmIChjdHJscmVxdWVzdC0+d0luZGV4ICYgVVNCX0RJUl9JTikKLQkJCQkJbXVzYl9lcCA9ICZtdXNiLT5lbmRwb2ludHNbbnVtXS5lcF9pbjsKKwkJCQllcCA9IG11c2ItPmVuZHBvaW50cyArIGVwbnVtOworCQkJCXJlZ3MgPSBlcC0+cmVnczsKKwkJCQlpc19pbiA9IGN0cmxyZXF1ZXN0LT53SW5kZXggJiBVU0JfRElSX0lOOworCQkJCWlmIChpc19pbikKKwkJCQkJbXVzYl9lcCA9ICZlcC0+ZXBfaW47CiAJCQkJZWxzZQotCQkJCQltdXNiX2VwID0gJm11c2ItPmVuZHBvaW50c1tudW1dLmVwX291dDsKKwkJCQkJbXVzYl9lcCA9ICZlcC0+ZXBfb3V0OwogCQkJCWlmICghbXVzYl9lcC0+ZGVzYykKIAkJCQkJYnJlYWs7CiAKLQkJCQkvKiBSRVZJU0lUIGRvIGl0IGRpcmVjdGx5LCBubyBsb2NraW5nIGdhbWVzICovCi0JCQkJc3Bpbl91bmxvY2soJm11c2ItPmxvY2spOwotCQkJCW11c2JfZ2FkZ2V0X3NldF9oYWx0KCZtdXNiX2VwLT5lbmRfcG9pbnQsIDApOwotCQkJCXNwaW5fbG9jaygmbXVzYi0+bG9jayk7CisJCQkJaGFuZGxlZCA9IDE7CisJCQkJLyogSWdub3JlIHJlcXVlc3QgaWYgZW5kcG9pbnQgaXMgd2VkZ2VkICovCisJCQkJaWYgKG11c2JfZXAtPndlZGdlZCkKKwkJCQkJYnJlYWs7CisKKwkJCQltdXNiX2VwX3NlbGVjdChtYmFzZSwgZXBudW0pOworCQkJCWlmIChpc19pbikgeworCQkJCQljc3IgID0gbXVzYl9yZWFkdyhyZWdzLCBNVVNCX1RYQ1NSKTsKKwkJCQkJY3NyIHw9IE1VU0JfVFhDU1JfQ0xSREFUQVRPRyB8CisJCQkJCSAgICAgICBNVVNCX1RYQ1NSX1BfV1pDX0JJVFM7CisJCQkJCWNzciAmPSB+KE1VU0JfVFhDU1JfUF9TRU5EU1RBTEwgfAorCQkJCQkJIE1VU0JfVFhDU1JfUF9TRU5UU1RBTEwgfAorCQkJCQkJIE1VU0JfVFhDU1JfVFhQS1RSRFkpOworCQkJCQltdXNiX3dyaXRldyhyZWdzLCBNVVNCX1RYQ1NSLCBjc3IpOworCQkJCX0gZWxzZSB7CisJCQkJCWNzciAgPSBtdXNiX3JlYWR3KHJlZ3MsIE1VU0JfUlhDU1IpOworCQkJCQljc3IgfD0gTVVTQl9SWENTUl9DTFJEQVRBVE9HIHwKKwkJCQkJICAgICAgIE1VU0JfUlhDU1JfUF9XWkNfQklUUzsKKwkJCQkJY3NyICY9IH4oTVVTQl9SWENTUl9QX1NFTkRTVEFMTCB8CisJCQkJCQkgTVVTQl9SWENTUl9QX1NFTlRTVEFMTCk7CisJCQkJCW11c2Jfd3JpdGV3KHJlZ3MsIE1VU0JfUlhDU1IsIGNzcik7CisJCQkJfQogCiAJCQkJLyogc2VsZWN0IGVwMCBhZ2FpbiAqLwogCQkJCW11c2JfZXBfc2VsZWN0KG1iYXNlLCAwKTsKLQkJCQloYW5kbGVkID0gMTsKIAkJCQl9IGJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQkvKiBjbGFzcywgdmVuZG9yLCBldGMgLi4uIGRlbGVnYXRlICovCkBAIC0zNzQsMTAgKzM5Niw4IEBACiAJCQkJaW50CQkJaXNfaW47CiAJCQkJdTE2CQkJY3NyOwogCi0JCQkJaWYgKGVwbnVtID09IDAKLQkJCQkJCXx8IGVwbnVtID49IE1VU0JfQ19OVU1fRVBTCi0JCQkJCQl8fCBjdHJscmVxdWVzdC0+d1ZhbHVlCi0JCQkJCQkJIT0gVVNCX0VORFBPSU5UX0hBTFQpCisJCQkJaWYgKGVwbnVtID09IDAgfHwgZXBudW0gPj0gTVVTQl9DX05VTV9FUFMgfHwKKwkJCQkgICAgY3RybHJlcXVlc3QtPndWYWx1ZQkhPSBVU0JfRU5EUE9JTlRfSEFMVCkKIAkJCQkJYnJlYWs7CiAKIAkJCQllcCA9IG11c2ItPmVuZHBvaW50cyArIGVwbnVtOwpAQCAtMzkyLDI0ICs0MTIsMjAgQEAKIAogCQkJCW11c2JfZXBfc2VsZWN0KG1iYXNlLCBlcG51bSk7CiAJCQkJaWYgKGlzX2luKSB7Ci0JCQkJCWNzciA9IG11c2JfcmVhZHcocmVncywKLQkJCQkJCQlNVVNCX1RYQ1NSKTsKKwkJCQkJY3NyID0gbXVzYl9yZWFkdyhyZWdzLCBNVVNCX1RYQ1NSKTsKIAkJCQkJaWYgKGNzciAmIE1VU0JfVFhDU1JfRklGT05PVEVNUFRZKQogCQkJCQkJY3NyIHw9IE1VU0JfVFhDU1JfRkxVU0hGSUZPOwogCQkJCQljc3IgfD0gTVVTQl9UWENTUl9QX1NFTkRTVEFMTAogCQkJCQkJfCBNVVNCX1RYQ1NSX0NMUkRBVEFUT0cKIAkJCQkJCXwgTVVTQl9UWENTUl9QX1daQ19CSVRTOwotCQkJCQltdXNiX3dyaXRldyhyZWdzLCBNVVNCX1RYQ1NSLAotCQkJCQkJCWNzcik7CisJCQkJCW11c2Jfd3JpdGV3KHJlZ3MsIE1VU0JfVFhDU1IsIGNzcik7CiAJCQkJfSBlbHNlIHsKLQkJCQkJY3NyID0gbXVzYl9yZWFkdyhyZWdzLAotCQkJCQkJCU1VU0JfUlhDU1IpOworCQkJCQljc3IgPSBtdXNiX3JlYWR3KHJlZ3MsIE1VU0JfUlhDU1IpOwogCQkJCQljc3IgfD0gTVVTQl9SWENTUl9QX1NFTkRTVEFMTAogCQkJCQkJfCBNVVNCX1JYQ1NSX0ZMVVNIRklGTwogCQkJCQkJfCBNVVNCX1JYQ1NSX0NMUkRBVEFUT0cKIAkJCQkJCXwgTVVTQl9SWENTUl9QX1daQ19CSVRTOwotCQkJCQltdXNiX3dyaXRldyhyZWdzLCBNVVNCX1JYQ1NSLAotCQkJCQkJCWNzcik7CisJCQkJCW11c2Jfd3JpdGV3KHJlZ3MsIE1VU0JfUlhDU1IsIGNzcik7CiAJCQkJfQogCiAJCQkJLyogc2VsZWN0IGVwMCBhZ2FpbiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2hvc3QuYyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9ob3N0LmMKaW5kZXggZTNhYjQwYS4uNzRjNGMzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2hvc3QuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfaG9zdC5jCkBAIC0xNjQyLDE4ICsxNjQyLDE4IEBACiAJCQljID0gbXVzYi0+ZG1hX2NvbnRyb2xsZXI7CiAKIAkJCWlmICh1c2JfcGlwZWlzb2MocGlwZSkpIHsKLQkJCQlpbnQgc3RhdHVzID0gMDsKKwkJCQlpbnQgZF9zdGF0dXMgPSAwOwogCQkJCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICpkOwogCiAJCQkJZCA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2MgKyBxaC0+aXNvX2lkeDsKIAogCQkJCWlmIChpc29fZXJyKSB7Ci0JCQkJCXN0YXR1cyA9IC1FSUxTRVE7CisJCQkJCWRfc3RhdHVzID0gLUVJTFNFUTsKIAkJCQkJdXJiLT5lcnJvcl9jb3VudCsrOwogCQkJCX0KIAkJCQlpZiAocnhfY291bnQgPiBkLT5sZW5ndGgpIHsKLQkJCQkJaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCQkJCQlzdGF0dXMgPSAtRU9WRVJGTE9XOworCQkJCQlpZiAoZF9zdGF0dXMgPT0gMCkgeworCQkJCQkJZF9zdGF0dXMgPSAtRU9WRVJGTE9XOwogCQkJCQkJdXJiLT5lcnJvcl9jb3VudCsrOwogCQkJCQl9CiAJCQkJCURCRygyLCAiKiogT1ZFUkZMT1cgJWQgaW50byAlZFxuIixcCkBAIC0xNjYyLDcgKzE2NjIsNyBAQAogCQkJCQlsZW5ndGggPSBkLT5sZW5ndGg7CiAJCQkJfSBlbHNlCiAJCQkJCWxlbmd0aCA9IHJ4X2NvdW50OwotCQkJCWQtPnN0YXR1cyA9IHN0YXR1czsKKwkJCQlkLT5zdGF0dXMgPSBkX3N0YXR1czsKIAkJCQlidWYgPSB1cmItPnRyYW5zZmVyX2RtYSArIGQtPm9mZnNldDsKIAkJCX0gZWxzZSB7CiAJCQkJbGVuZ3RoID0gcnhfY291bnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfcmVncy5oIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX3JlZ3MuaAppbmRleCBjYzFkNzFiLi40NzNhOTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfcmVncy5oCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9yZWdzLmgKQEAgLTQ2NSw5ICs0NjUsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHUxNiBtdXNiX3JlYWRfdGFyZ2V0X3JlZ19iYXNlKHU4IGksIHZvaWQgX19pb21lbSAqbWJhc2UpCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqbXVzYl9yZWFkX3RhcmdldF9yZWdfYmFzZSh1OCBpLCB2b2lkIF9faW9tZW0gKm1iYXNlKQogewotCXJldHVybiAwOworCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbXVzYl93cml0ZV9yeGZ1bmFkZHIodm9pZCBfX2lvbWVtICplcF90YXJnZXRfcmVncywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYmhzZG1hLmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2Joc2RtYS5jCmluZGV4IDVlODNmOTYuLmEyMzc1NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYmhzZG1hLmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiaHNkbWEuYwpAQCAtMjU5LDYgKzI1OSwxMSBAQAogCWlmICghaW50X2hzZG1hKQogCQlnb3RvIGRvbmU7CiAKKyNpZmRlZiBDT05GSUdfQkxBQ0tGSU4KKwkvKiBDbGVhciBETUEgaW50ZXJydXB0IGZsYWdzICovCisJbXVzYl93cml0ZWIobWJhc2UsIE1VU0JfSFNETUFfSU5UUiwgaW50X2hzZG1hKTsKKyNlbmRpZgorCiAJZm9yIChiY2hhbm5lbCA9IDA7IGJjaGFubmVsIDwgTVVTQl9IU0RNQV9DSEFOTkVMUzsgYmNoYW5uZWwrKykgewogCQlpZiAoaW50X2hzZG1hICYgKDEgPDwgYmNoYW5uZWwpKSB7CiAJCQltdXNiX2NoYW5uZWwgPSAoc3RydWN0IG11c2JfZG1hX2NoYW5uZWwgKikKQEAgLTI4MCw3ICsyODUsNyBAQAogCQkJCWNoYW5uZWwtPmFjdHVhbF9sZW4gPSBhZGRyCiAJCQkJCS0gbXVzYl9jaGFubmVsLT5zdGFydF9hZGRyOwogCi0JCQkJREJHKDIsICJjaCAlcCwgMHgleCAtPiAweCV4ICglZCAvICVkKSAlc1xuIiwKKwkJCQlEQkcoMiwgImNoICVwLCAweCV4IC0+IDB4JXggKCV6dSAvICVkKSAlc1xuIiwKIAkJCQkJY2hhbm5lbCwgbXVzYl9jaGFubmVsLT5zdGFydF9hZGRyLAogCQkJCQlhZGRyLCBjaGFubmVsLT5hY3R1YWxfbGVuLAogCQkJCQltdXNiX2NoYW5uZWwtPmxlbiwKQEAgLTMyNCwxMSArMzI5LDYgQEAKIAkJfQogCX0KIAotI2lmZGVmIENPTkZJR19CTEFDS0ZJTgotCS8qIENsZWFyIERNQSBpbnRlcnJ1cCBmbGFncyAqLwotCW11c2Jfd3JpdGViKG1iYXNlLCBNVVNCX0hTRE1BX0lOVFIsIGludF9oc2RtYSk7Ci0jZW5kaWYKLQogCXJldHZhbCA9IElSUV9IQU5ETEVEOwogZG9uZToKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdXNiLT5sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL29tYXAyNDMwLmMgYi9kcml2ZXJzL3VzYi9tdXNiL29tYXAyNDMwLmMKaW5kZXggNjc2MWQyMC4uODNiZWVhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9vbWFwMjQzMC5jCisrKyBiL2RyaXZlcnMvdXNiL211c2Ivb21hcDI0MzAuYwpAQCAtMzE1LDcgKzMxNSw3IEBACiAJbXVzYl9wbGF0Zm9ybV9zdXNwZW5kKG11c2IpOwogCiAJY2xrX3B1dChtdXNiLT5jbG9jayk7Ci0JbXVzYi0+Y2xvY2sgPSAwOworCW11c2ItPmNsb2NrID0gTlVMTDsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivb3RnL0tjb25maWcgYi9kcml2ZXJzL3VzYi9vdGcvS2NvbmZpZwppbmRleCBhYTg4NGQwLi5kZTU2YjNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9vdGcvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9vdGcvS2NvbmZpZwpAQCAtNDEsNiArNDEsMTUgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGlzcDEzMDFfb21hcC4KIAorY29uZmlnIFVTQl9VTFBJCisJYm9vbCAiR2VuZXJpYyBVTFBJIFRyYW5zY2VpdmVyIERyaXZlciIKKwlkZXBlbmRzIG9uIEFSTQorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIHRvIHN1cHBvcnQgVUxQSSBjb25uZWN0ZWQgVVNCIE9URyB0cmFuc2NlaXZlcnMgd2hpY2gKKwkgIGFyZSBsaWtlbHkgZm91bmQgb24gZW1iZWRkZWQgYm9hcmRzLgorCisJICBUaGUgb25seSBjaGlwIGN1cnJlbnRseSBzdXBwb3J0ZWQgaXMgTlhQJ3MgSVNQMTUwNAorCiBjb25maWcgVFdMNDAzMF9VU0IKIAl0cmlzdGF0ZSAiVFdMNDAzMCBVU0IgVHJhbnNjZWl2ZXIgRHJpdmVyIgogCWRlcGVuZHMgb24gVFdMNDAzMF9DT1JFICYmIFJFR1VMQVRPUl9UV0w0MDMwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9vdGcvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9vdGcvTWFrZWZpbGUKaW5kZXggMjA4MTY3OC4uYWViNDlhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivb3RnL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL290Zy9NYWtlZmlsZQpAQCAtMTAsNiArMTAsNyBAQAogb2JqLSQoQ09ORklHX0lTUDEzMDFfT01BUCkJKz0gaXNwMTMwMV9vbWFwLm8KIG9iai0kKENPTkZJR19UV0w0MDMwX1VTQikJKz0gdHdsNDAzMC11c2Iubwogb2JqLSQoQ09ORklHX05PUF9VU0JfWENFSVYpCSs9IG5vcC11c2IteGNlaXYubworb2JqLSQoQ09ORklHX1VTQl9VTFBJKQkJKz0gdWxwaS5vCiAKIGNjZmxhZ3MtJChDT05GSUdfVVNCX0RFQlVHKQkrPSAtRERFQlVHCiBjY2ZsYWdzLSQoQ09ORklHX1VTQl9HQURHRVRfREVCVUcpICs9IC1EREVCVUcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL290Zy90d2w0MDMwLXVzYi5jIGIvZHJpdmVycy91c2Ivb3RnL3R3bDQwMzAtdXNiLmMKaW5kZXggOWUzZTdhNS4uMmJlOWYyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivb3RnL3R3bDQwMzAtdXNiLmMKKysrIGIvZHJpdmVycy91c2Ivb3RnL3R3bDQwMzAtdXNiLmMKQEAgLTMzLDcgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL290Zy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy90d2w0MDMwLmg+CisjaW5jbHVkZSA8bGludXgvaTJjL3R3bC5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCkBAIC0yNzYsMTYgKzI3NiwxNiBAQAogewogCXU4IGNoZWNrOwogCi0JaWYgKCh0d2w0MDMwX2kyY193cml0ZV91OChtb2R1bGUsIGRhdGEsIGFkZHJlc3MpID49IDApICYmCi0JICAgICh0d2w0MDMwX2kyY19yZWFkX3U4KG1vZHVsZSwgJmNoZWNrLCBhZGRyZXNzKSA+PSAwKSAmJgorCWlmICgodHdsX2kyY193cml0ZV91OChtb2R1bGUsIGRhdGEsIGFkZHJlc3MpID49IDApICYmCisJICAgICh0d2xfaTJjX3JlYWRfdTgobW9kdWxlLCAmY2hlY2ssIGFkZHJlc3MpID49IDApICYmCiAJCQkJCQkoY2hlY2sgPT0gZGF0YSkpCiAJCXJldHVybiAwOwogCWRldl9kYmcodHdsLT5kZXYsICJXcml0ZSVkWyVkLDB4JXhdIHdyb3RlICUwMnggYnV0IHJlYWQgJTAyeFxuIiwKIAkJCTEsIG1vZHVsZSwgYWRkcmVzcywgY2hlY2ssIGRhdGEpOwogCiAJLyogRmFpbGVkIG9uY2U6IFRyeSBhZ2FpbiAqLwotCWlmICgodHdsNDAzMF9pMmNfd3JpdGVfdTgobW9kdWxlLCBkYXRhLCBhZGRyZXNzKSA+PSAwKSAmJgotCSAgICAodHdsNDAzMF9pMmNfcmVhZF91OChtb2R1bGUsICZjaGVjaywgYWRkcmVzcykgPj0gMCkgJiYKKwlpZiAoKHR3bF9pMmNfd3JpdGVfdTgobW9kdWxlLCBkYXRhLCBhZGRyZXNzKSA+PSAwKSAmJgorCSAgICAodHdsX2kyY19yZWFkX3U4KG1vZHVsZSwgJmNoZWNrLCBhZGRyZXNzKSA+PSAwKSAmJgogCQkJCQkJKGNoZWNrID09IGRhdGEpKQogCQlyZXR1cm4gMDsKIAlkZXZfZGJnKHR3bC0+ZGV2LCAiV3JpdGUlZFslZCwweCV4XSB3cm90ZSAlMDJ4IGJ1dCByZWFkICUwMnhcbiIsCkBAIC0zMDMsNyArMzAzLDcgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCXJldCA9IHR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1VTQiwgZGF0YSwgYWRkcmVzcyk7CisJcmV0ID0gdHdsX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9VU0IsIGRhdGEsIGFkZHJlc3MpOwogCWlmIChyZXQgPCAwKQogCQlkZXZfZGJnKHR3bC0+ZGV2LAogCQkJIlRXTDQwMzA6VVNCOldyaXRlWzB4JXhdIEVycm9yICVkXG4iLCBhZGRyZXNzLCByZXQpOwpAQCAtMzE1LDcgKzMxNSw3IEBACiAJdTggZGF0YTsKIAlpbnQgcmV0ID0gMDsKIAotCXJldCA9IHR3bDQwMzBfaTJjX3JlYWRfdTgobW9kdWxlLCAmZGF0YSwgYWRkcmVzcyk7CisJcmV0ID0gdHdsX2kyY19yZWFkX3U4KG1vZHVsZSwgJmRhdGEsIGFkZHJlc3MpOwogCWlmIChyZXQgPj0gMCkKIAkJcmV0ID0gZGF0YTsKIAllbHNlCkBAIC00NjIsNyArNDYyLDcgQEAKIAkJICogU0xFRVAuIFdlIHdvcmsgYXJvdW5kIHRoaXMgYnkgY2xlYXJpbmcgdGhlIGJpdCBhZnRlciB1c3YzdjEKIAkJICogaXMgcmUtYWN0aXZhdGVkLiBUaGlzIGVuc3VyZXMgdGhhdCBWVVNCM1YxIGlzIHJlYWxseSBhY3RpdmUuCiAJCSAqLwotCQl0d2w0MDMwX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9SRUNFSVZFUiwgMCwKKwkJdHdsX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9SRUNFSVZFUiwgMCwKIAkJCQkJCQlWVVNCX0RFRElDQVRFRDIpOwogCQlyZWd1bGF0b3JfZW5hYmxlKHR3bC0+dXNiMXY1KTsKIAkJcHdyICY9IH5QSFlfUFdSX1BIWVBXRDsKQEAgLTUwNSw0NCArNTA1LDQ0IEBACiBzdGF0aWMgaW50IHR3bDQwMzBfdXNiX2xkb19pbml0KHN0cnVjdCB0d2w0MDMwX3VzYiAqdHdsKQogewogCS8qIEVuYWJsZSB3cml0aW5nIHRvIHBvd2VyIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCi0JdHdsNDAzMF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSLCAweEMwLCBQUk9URUNUX0tFWSk7Ci0JdHdsNDAzMF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSLCAweDBDLCBQUk9URUNUX0tFWSk7CisJdHdsX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9NQVNURVIsIDB4QzAsIFBST1RFQ1RfS0VZKTsKKwl0d2xfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX01BU1RFUiwgMHgwQywgUFJPVEVDVF9LRVkpOwogCiAJLyogcHV0IFZVU0IzVjEgTERPIGluIGFjdGl2ZSBzdGF0ZSAqLwotCXR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSLCAwLCBWVVNCX0RFRElDQVRFRDIpOworCXR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fUkVDRUlWRVIsIDAsIFZVU0JfREVESUNBVEVEMik7CiAKIAkvKiBpbnB1dCB0byBWVVNCM1YxIExETyBpcyBmcm9tIFZCQVQsIG5vdCBWQlVTICovCi0JdHdsNDAzMF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fUkVDRUlWRVIsIDB4MTQsIFZVU0JfREVESUNBVEVEMSk7CisJdHdsX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9SRUNFSVZFUiwgMHgxNCwgVlVTQl9ERURJQ0FURUQxKTsKIAogCS8qIEluaXRpYWxpemUgMy4xViByZWd1bGF0b3IgKi8KLQl0d2w0MDMwX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9SRUNFSVZFUiwgMCwgVlVTQjNWMV9ERVZfR1JQKTsKKwl0d2xfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSLCAwLCBWVVNCM1YxX0RFVl9HUlApOwogCiAJdHdsLT51c2IzdjEgPSByZWd1bGF0b3JfZ2V0KHR3bC0+ZGV2LCAidXNiM3YxIik7CiAJaWYgKElTX0VSUih0d2wtPnVzYjN2MSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JdHdsNDAzMF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fUkVDRUlWRVIsIDAsIFZVU0IzVjFfVFlQRSk7CisJdHdsX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9SRUNFSVZFUiwgMCwgVlVTQjNWMV9UWVBFKTsKIAogCS8qIEluaXRpYWxpemUgMS41ViByZWd1bGF0b3IgKi8KLQl0d2w0MDMwX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9SRUNFSVZFUiwgMCwgVlVTQjFWNV9ERVZfR1JQKTsKKwl0d2xfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSLCAwLCBWVVNCMVY1X0RFVl9HUlApOwogCiAJdHdsLT51c2IxdjUgPSByZWd1bGF0b3JfZ2V0KHR3bC0+ZGV2LCAidXNiMXY1Iik7CiAJaWYgKElTX0VSUih0d2wtPnVzYjF2NSkpCiAJCWdvdG8gZmFpbDE7CiAKLQl0d2w0MDMwX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9SRUNFSVZFUiwgMCwgVlVTQjFWNV9UWVBFKTsKKwl0d2xfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSLCAwLCBWVVNCMVY1X1RZUEUpOwogCiAJLyogSW5pdGlhbGl6ZSAxLjhWIHJlZ3VsYXRvciAqLwotCXR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSLCAwLCBWVVNCMVY4X0RFVl9HUlApOworCXR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fUkVDRUlWRVIsIDAsIFZVU0IxVjhfREVWX0dSUCk7CiAKIAl0d2wtPnVzYjF2OCA9IHJlZ3VsYXRvcl9nZXQodHdsLT5kZXYsICJ1c2IxdjgiKTsKIAlpZiAoSVNfRVJSKHR3bC0+dXNiMXY4KSkKIAkJZ290byBmYWlsMjsKIAotCXR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSLCAwLCBWVVNCMVY4X1RZUEUpOworCXR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fUkVDRUlWRVIsIDAsIFZVU0IxVjhfVFlQRSk7CiAKIAkvKiBkaXNhYmxlIGFjY2VzcyB0byBwb3dlciBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLwotCXR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX01BU1RFUiwgMCwgUFJPVEVDVF9LRVkpOworCXR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSLCAwLCBQUk9URUNUX0tFWSk7CiAKIAlyZXR1cm4gMDsKIApAQCAtNTk4LDEyICs1OTgsMTIgQEAKIAkJICogVVNCX0xJTktfVkJVUyBzdGF0ZS4gIG11c2JfaGRyYyB3b24ndCBjYXJlIHVudGlsIGl0CiAJCSAqIHN0YXJ0cyB0byBoYW5kbGUgc29mdGNvbm5lY3QgcmlnaHQuCiAJCSAqLwotCQl0d2w0MDMwY2hhcmdlcl91c2JfZW4oc3RhdHVzID09IFVTQl9MSU5LX1ZCVVMpOwotCiAJCWlmIChzdGF0dXMgPT0gVVNCX0xJTktfTk9ORSkKIAkJCXR3bDQwMzBfcGh5X3N1c3BlbmQodHdsLCAwKTsKIAkJZWxzZQogCQkJdHdsNDAzMF9waHlfcmVzdW1lKHR3bCk7CisKKwkJdHdsNDAzMGNoYXJnZXJfdXNiX2VuKHN0YXR1cyA9PSBVU0JfTElOS19WQlVTKTsKIAl9CiAJc3lzZnNfbm90aWZ5KCZ0d2wtPmRldi0+a29iaiwgTlVMTCwgInZidXMiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivb3RnL3VscGkuYyBiL2RyaXZlcnMvdXNiL290Zy91bHBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk2NTI3NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL290Zy91bHBpLmMKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBHZW5lcmljIFVMUEkgVVNCIHRyYW5zY2VpdmVyIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRGFuaWVsIE1hY2sgPGRhbmllbEBjYWlhcS5kZT4KKyAqCisgKiBCYXNlZCBvbiBzb3VyY2VzIGZyb20KKyAqCisgKiAgIFNhc2NoYSBIYXVlciA8cy5oYXVlckBwZW5ndXRyb25peC5kZT4KKyAqICAgRnJlZXNjYWxlIFNlbWljb25kdWN0b3JzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9vdGcuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvdWxwaS5oPgorCisvKiBVTFBJIHJlZ2lzdGVyIGFkZHJlc3NlcyAqLworI2RlZmluZSBVTFBJX1ZJRF9MT1cgICAgICAgICAweDAwICAgIC8qIFZlbmRvciBJRCBsb3cgKi8KKyNkZWZpbmUgVUxQSV9WSURfSElHSCAgICAgICAgMHgwMSAgICAvKiBWZW5kb3IgSUQgaGlnaCAqLworI2RlZmluZSBVTFBJX1BJRF9MT1cgICAgICAgICAweDAyICAgIC8qIFByb2R1Y3QgSUQgbG93ICovCisjZGVmaW5lIFVMUElfUElEX0hJR0ggICAgICAgIDB4MDMgICAgLyogUHJvZHVjdCBJRCBoaWdoICovCisjZGVmaW5lIFVMUElfSVRGQ1RMICAgICAgICAgIDB4MDcgICAgLyogSW50ZXJmYWNlIENvbnRyb2wgKi8KKyNkZWZpbmUgVUxQSV9PVEdDVEwgICAgICAgICAgMHgwQSAgICAvKiBPVEcgQ29udHJvbCAqLworCisvKiBhZGQgdG8gYWJvdmUgcmVnaXN0ZXIgYWRkcmVzcyB0byBhY2Nlc3MgU2V0L0NsZWFyIGZ1bmN0aW9ucyAqLworI2RlZmluZSBVTFBJX1JFR19TRVQgICAgICAgICAweDAxCisjZGVmaW5lIFVMUElfUkVHX0NMRUFSICAgICAgIDB4MDIKKworLyogVUxQSSBPVEcgQ29udHJvbCBSZWdpc3RlciBiaXRzICovCisjZGVmaW5lIElEX1BVTExfVVAgICAgICAgICAgICAgICgxIDw8IDApICAgICAgICAvKiBlbmFibGUgSUQgUHVsbCBVcCAqLworI2RlZmluZSBEUF9QVUxMX0RPV04gICAgICAgICAgICAoMSA8PCAxKSAgICAgICAgLyogZW5hYmxlIERQIFB1bGwgRG93biAqLworI2RlZmluZSBETV9QVUxMX0RPV04gICAgICAgICAgICAoMSA8PCAyKSAgICAgICAgLyogZW5hYmxlIERNIFB1bGwgRG93biAqLworI2RlZmluZSBESVNDSFJHX1ZCVVMgICAgICAgICAgICAoMSA8PCAzKSAgICAgICAgLyogRGlzY2hhcmdlIFZidXMgKi8KKyNkZWZpbmUgQ0hSR19WQlVTICAgICAgICAgICAgICAgKDEgPDwgNCkgICAgICAgIC8qIENoYXJnZSBWYnVzICovCisjZGVmaW5lIERSVl9WQlVTICAgICAgICAgICAgICAgICgxIDw8IDUpICAgICAgICAvKiBEcml2ZSBWYnVzICovCisjZGVmaW5lIERSVl9WQlVTX0VYVCAgICAgICAgICAgICgxIDw8IDYpICAgICAgICAvKiBEcml2ZSBWYnVzIGV4dGVybmFsICovCisjZGVmaW5lIFVTRV9FWFRfVkJVU19JTkQgICAgICAgICgxIDw8IDcpICAgICAgICAvKiBVc2UgZXh0LiBWYnVzIGluZGljYXRvciAqLworCisjZGVmaW5lIFVMUElfSUQodmVuZG9yLCBwcm9kdWN0KSAoKCh2ZW5kb3IpIDw8IDE2KSB8IChwcm9kdWN0KSkKKworI2RlZmluZSBUUl9GTEFHKGZsYWdzLCBhLCBiKQkoKChmbGFncykgJiBhKSA/IGIgOiAwKQorCisvKiBVTFBJIGhhcmRjb2RlZCBJRHMsIHVzZWQgZm9yIHByb2JpbmcgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdWxwaV9pZHNbXSA9IHsKKwlVTFBJX0lEKDB4MDRjYywgMHgxNTA0KSwJLyogTlhQIElTUDE1MDQgKi8KK307CisKK3N0YXRpYyBpbnQgdWxwaV9zZXRfZmxhZ3Moc3RydWN0IG90Z190cmFuc2NlaXZlciAqb3RnKQoreworCXVuc2lnbmVkIGludCBmbGFncyA9IDA7CisKKwlpZiAob3RnLT5mbGFncyAmIFVTQl9PVEdfUFVMTFVQX0lEKQorCQlmbGFncyB8PSBJRF9QVUxMX1VQOworCisJaWYgKG90Zy0+ZmxhZ3MgJiBVU0JfT1RHX1BVTExET1dOX0RNKQorCQlmbGFncyB8PSBETV9QVUxMX0RPV047CisKKwlpZiAob3RnLT5mbGFncyAmIFVTQl9PVEdfUFVMTERPV05fRFApCisJCWZsYWdzIHw9IERQX1BVTExfRE9XTjsKKworCWlmIChvdGctPmZsYWdzICYgVVNCX09UR19FWFRfVkJVU19JTkRJQ0FUT1IpCisJCWZsYWdzIHw9IFVTRV9FWFRfVkJVU19JTkQ7CisKKwlyZXR1cm4gb3RnX2lvX3dyaXRlKG90ZywgZmxhZ3MsIFVMUElfT1RHQ1RMICsgVUxQSV9SRUdfU0VUKTsKK30KKworc3RhdGljIGludCB1bHBpX2luaXQoc3RydWN0IG90Z190cmFuc2NlaXZlciAqb3RnKQoreworCWludCBpLCB2aWQsIHBpZDsKKworCXZpZCA9IChvdGdfaW9fcmVhZChvdGcsIFVMUElfVklEX0hJR0gpIDw8IDgpIHwKKwkgICAgICAgb3RnX2lvX3JlYWQob3RnLCBVTFBJX1ZJRF9MT1cpOworCXBpZCA9IChvdGdfaW9fcmVhZChvdGcsIFVMUElfUElEX0hJR0gpIDw8IDgpIHwKKwkgICAgICAgb3RnX2lvX3JlYWQob3RnLCBVTFBJX1BJRF9MT1cpOworCisJcHJfaW5mbygiVUxQSSB0cmFuc2NlaXZlciB2ZW5kb3IvcHJvZHVjdCBJRCAweCUwNHgvMHglMDR4XG4iLCB2aWQsIHBpZCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh1bHBpX2lkcyk7IGkrKykKKwkJaWYgKHVscGlfaWRzW2ldID09IFVMUElfSUQodmlkLCBwaWQpKQorCQkJcmV0dXJuIHVscGlfc2V0X2ZsYWdzKG90Zyk7CisKKwlwcl9lcnIoIlVMUEkgSUQgZG9lcyBub3QgbWF0Y2ggYW55IGtub3duIHRyYW5zY2VpdmVyLlxuIik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgdWxwaV9zZXRfdmJ1cyhzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICpvdGcsIGJvb2wgb24pCit7CisJdW5zaWduZWQgaW50IGZsYWdzID0gb3RnX2lvX3JlYWQob3RnLCBVTFBJX09UR0NUTCk7CisKKwlmbGFncyAmPSB+KERSVl9WQlVTIHwgRFJWX1ZCVVNfRVhUKTsKKworCWlmIChvbikgeworCQlpZiAob3RnLT5mbGFncyAmIFVTQl9PVEdfRFJWX1ZCVVMpCisJCQlmbGFncyB8PSBEUlZfVkJVUzsKKworCQlpZiAob3RnLT5mbGFncyAmIFVTQl9PVEdfRFJWX1ZCVVNfRVhUKQorCQkJZmxhZ3MgfD0gRFJWX1ZCVVNfRVhUOworCX0KKworCXJldHVybiBvdGdfaW9fd3JpdGUob3RnLCBmbGFncywgVUxQSV9PVEdDVEwgKyBVTFBJX1JFR19TRVQpOworfQorCitzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICoKK290Z191bHBpX2NyZWF0ZShzdHJ1Y3Qgb3RnX2lvX2FjY2Vzc19vcHMgKm9wcywKKwkJdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKm90ZzsKKworCW90ZyA9IGt6YWxsb2Moc2l6ZW9mKCpvdGcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW90ZykKKwkJcmV0dXJuIE5VTEw7CisKKwlvdGctPmxhYmVsCT0gIlVMUEkiOworCW90Zy0+ZmxhZ3MJPSBmbGFnczsKKwlvdGctPmlvX29wcwk9IG9wczsKKwlvdGctPmluaXQJPSB1bHBpX2luaXQ7CisJb3RnLT5zZXRfdmJ1cwk9IHVscGlfc2V0X3ZidXM7CisKKwlyZXR1cm4gb3RnOworfQorRVhQT1JUX1NZTUJPTF9HUEwob3RnX3VscGlfY3JlYXRlKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2FyazMxMTYuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9hcmszMTE2LmMKaW5kZXggMTMxZTYxYS4uYTljMmRlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2FyazMxMTYuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYXJrMzExNi5jCkBAIC0xLDQgKzEsNiBAQAogLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBieSBCYXJ0IEhhcnRnZXJzIChiYXJ0LmhhcnRnZXJzK2FyazMxMTZAZ21haWwuY29tKQorICogT3JpZ2luYWwgdmVyc2lvbjoKICAqIENvcHlyaWdodCAoQykgMjAwNgogICogICBTaW1vbiBTY2h1bHogKGFyazMxMTZfZHJpdmVyIDxhdD4gYXVjdGlvbmFudC5kZSkKICAqCkBAIC02LDEwICs4LDEzIEBACiAgKiAtIGltcGxlbWVudHMgYSBkcml2ZXIgZm9yIHRoZSBhcmttaWNybyBhcmszMTE2IGNoaXBzZXQgKHZlbmRvcj0weDY1NDcsCiAgKiAgIHByb2R1Y3RpZD0weDAyMzIpICh1c2VkIGluIGEgZGF0YWNhYmxlIGNhbGxlZCBLUS1VOEEpCiAgKgotICogLSBiYXNlZCBvbiBjb2RlIGJ5IGtyaXNmeCAtPiB0aGFua3MgISEKLSAqICAgKHNlZSBodHRwOi8vd3d3LmxpbnV4cXVlc3Rpb25zLm9yZy9xdWVzdGlvbnMvc2hvd3RocmVhZC5waHA/cD0yMTg0NDU3I3Bvc3QyMTg0NDU3KQorICogU3VwcG9ydHMgZnVsbCBtb2RlbSBzdGF0dXMgbGluZXMsIGJyZWFrLCBoYXJkd2FyZSBmbG93IGNvbnRyb2wuIERvZXMgbm90CisgKiBzdXBwb3J0IHNvZnR3YXJlIGZsb3cgY29udHJvbCwgc2luY2UgSSBkbyBub3Qga25vdyBob3cgdG8gZW5hYmxlIGl0IGluIGh3LgogICoKLSAqICAtIGJhc2VkIG9uIGxvZ3MgY3JlYXRlZCBieSB1c2Jzbm9vcHkKKyAqIFRoaXMgZHJpdmVyIGlzIGEgZXNzZW50aWFsbHkgbmV3IGltcGxlbWVudGF0aW9uLiBJIGluaXRpYWxseSBkdWcKKyAqIGludG8gdGhlIG9sZCBhcmszMTE2LmMgZHJpdmVyIGFuZCBzdWRkZW5seSByZWFsaXplZCB0aGUgYXJrMzExNiBpcworICogYSAxNjQ1MCB3aXRoIGEgVVNCIGludGVyZmFjZSBnbHVlZCB0byBpdC4gU2VlIGNvbW1lbnRzIGF0IHRoZQorICogYm90dG9tIG9mIHRoaXMgZmlsZS4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCkBAIC0xOSwxNSArMjQsMzEgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL3NlcmlhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKIHN0YXRpYyBpbnQgZGVidWc7CisvKgorICogVmVyc2lvbiBpbmZvcm1hdGlvbgorICovCisKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYwLjUiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgIkJhcnQgSGFydGdlcnMgPGJhcnQuaGFydGdlcnMrYXJrMzExNkBnbWFpbC5jb20+IgorI2RlZmluZSBEUklWRVJfREVTQyAiVVNCIEFSSzMxMTYgc2VyaWFsL0lyREEgZHJpdmVyIgorI2RlZmluZSBEUklWRVJfREVWX0RFU0MgIkFSSzMxMTYgUlMyMzIvSXJEQSIKKyNkZWZpbmUgRFJJVkVSX05BTUUgImFyazMxMTYiCisKKy8qIHVzYiB0aW1lb3V0IG9mIDEgc2Vjb25kICovCisjZGVmaW5lIEFSS19USU1FT1VUICgxKkhaKQogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGUgW10gPSB7CiAJeyBVU0JfREVWSUNFKDB4NjU0NywgMHgwMjMyKSB9LApAQCAtNDUsMTE4ICs2NiwxNTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIEFSSzMxMTZfU05EKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsIGludCBzZXEsCi0JCQkgICAgICAgX191OCByZXF1ZXN0LCBfX3U4IHJlcXVlc3R0eXBlLAotCQkJICAgICAgIF9fdTE2IHZhbHVlLCBfX3UxNiBpbmRleCkKK3N0cnVjdCBhcmszMTE2X3ByaXZhdGUgeworCXdhaXRfcXVldWVfaGVhZF90ICAgICAgIGRlbHRhX21zcl93YWl0OworCXN0cnVjdCBhc3luY19pY291bnQJaWNvdW50OworCWludAkJCWlyZGE7CS8qIDEgZm9yIGlyZGEgZGV2aWNlICovCisKKwkvKiBwcm90ZWN0cyBodyByZWdpc3RlciB1cGRhdGVzICovCisJc3RydWN0IG11dGV4CQlod19sb2NrOworCisJaW50CQkJcXVvdDsJLyogYmF1ZHJhdGUgZGl2aXNvciAqLworCV9fdTMyCQkJbGNyOwkvKiBsaW5lIGNvbnRyb2wgcmVnaXN0ZXIgdmFsdWUgKi8KKwlfX3UzMgkJCWhjcjsJLyogaGFuZHNoYWtlIGNvbnRyb2wgcmVnaXN0ZXIgKDB4OCkKKwkJCQkJICogdmFsdWUgKi8KKwlfX3UzMgkJCW1jcjsJLyogbW9kZW0gY29udG9sIHJlZ2lzdGVyIHZhbHVlICovCisKKwkvKiBwcm90ZWN0cyB0aGUgc3RhdHVzIHZhbHVlcyBiZWxvdyAqLworCXNwaW5sb2NrX3QJCXN0YXR1c19sb2NrOworCV9fdTMyCQkJbXNyOwkvKiBtb2RlbSBzdGF0dXMgcmVnaXN0ZXIgdmFsdWUgKi8KKwlfX3UzMgkJCWxzcjsJLyogbGluZSBzdGF0dXMgcmVnaXN0ZXIgdmFsdWUgKi8KK307CisKK3N0YXRpYyBpbnQgYXJrMzExNl93cml0ZV9yZWcoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCwKKwkJCSAgICAgdW5zaWduZWQgcmVnLCBfX3U4IHZhbCkKIHsKIAlpbnQgcmVzdWx0OworCSAvKiAweGZlIDB4NDAgYXJlIG1hZ2ljIHZhbHVlcyB0YWtlbiBmcm9tIG9yaWdpbmFsIGRyaXZlciAqLwogCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyhzZXJpYWwtPmRldiwKIAkJCQkgdXNiX3NuZGN0cmxwaXBlKHNlcmlhbC0+ZGV2LCAwKSwKLQkJCQkgcmVxdWVzdCwgcmVxdWVzdHR5cGUsIHZhbHVlLCBpbmRleCwKLQkJCQkgTlVMTCwgMHgwMCwgMTAwMCk7Ci0JZGJnKCIlMDNkID4gb2siLCBzZXEpOworCQkJCSAweGZlLCAweDQwLCB2YWwsIHJlZywKKwkJCQkgTlVMTCwgMCwgQVJLX1RJTUVPVVQpOworCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBBUkszMTE2X1JDVihzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsLCBpbnQgc2VxLAotCQkJICAgICAgIF9fdTggcmVxdWVzdCwgX191OCByZXF1ZXN0dHlwZSwKLQkJCSAgICAgICBfX3UxNiB2YWx1ZSwgX191MTYgaW5kZXgsIF9fdTggZXhwZWN0ZWQsCi0JCQkgICAgICAgY2hhciAqYnVmKQorc3RhdGljIGludCBhcmszMTE2X3JlYWRfcmVnKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsCisJCQkgICAgdW5zaWduZWQgcmVnLCB1bnNpZ25lZCBjaGFyICpidWYpCiB7CiAJaW50IHJlc3VsdDsKKwkvKiAweGZlIDB4YzAgYXJlIG1hZ2ljIHZhbHVlcyB0YWtlbiBmcm9tIG9yaWdpbmFsIGRyaXZlciAqLwogCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyhzZXJpYWwtPmRldiwKIAkJCQkgdXNiX3JjdmN0cmxwaXBlKHNlcmlhbC0+ZGV2LCAwKSwKLQkJCQkgcmVxdWVzdCwgcmVxdWVzdHR5cGUsIHZhbHVlLCBpbmRleCwKLQkJCQkgYnVmLCAweDAwMDAwMDEsIDEwMDApOwotCWlmIChyZXN1bHQpCi0JCWRiZygiJTAzZCA8ICVkIGJ5dGVzIFsweCUwMlhdIiwgc2VxLCByZXN1bHQsCi0JCSAgICAoKHVuc2lnbmVkIGNoYXIgKilidWYpWzBdKTsKKwkJCQkgMHhmZSwgMHhjMCwgMCwgcmVnLAorCQkJCSBidWYsIDEsIEFSS19USU1FT1VUKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJcmV0dXJuIHJlc3VsdDsKIAllbHNlCi0JCWRiZygiJTAzZCA8IDAgYnl0ZXMiLCBzZXEpOworCQlyZXR1cm4gYnVmWzBdOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgQVJLMzExNl9SQ1ZfUVVJRVQoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCwKLQkJCQkgICAgIF9fdTggcmVxdWVzdCwgX191OCByZXF1ZXN0dHlwZSwKLQkJCQkgICAgIF9fdTE2IHZhbHVlLCBfX3UxNiBpbmRleCwgY2hhciAqYnVmKQorc3RhdGljIGlubGluZSBpbnQgY2FsY19kaXZpc29yKGludCBicHMpCiB7Ci0JdXNiX2NvbnRyb2xfbXNnKHNlcmlhbC0+ZGV2LAotCQkJdXNiX3JjdmN0cmxwaXBlKHNlcmlhbC0+ZGV2LCAwKSwKLQkJCXJlcXVlc3QsIHJlcXVlc3R0eXBlLCB2YWx1ZSwgaW5kZXgsCi0JCQlidWYsIDB4MDAwMDAwMSwgMTAwMCk7CisJLyogT3JpZ2luYWwgYXJrMzExNiBtYWRlIHNvbWUgZXhjZXB0aW9ucyBpbiByb3VuZGluZyBoZXJlCisJICogYmVjYXVzZSB3aW5kb3dzIGRpZCB0aGUgc2FtZS4gQXNzdW1lIHRoYXQgaXMgbm90IHJlYWxseQorCSAqIG5lY2Vzc2FyeS4KKwkgKiBDcnlzdGFsIGlzIDEyTUh6LCBwcm9iYWJseSBiZWNhdXNlIG9mIFVTQiwgYnV0IHdlIGRpdmlkZSBieSA0PworCSAqLworCXJldHVybiAoMTIwMDAwMDAgKyAyKmJwcykgLyAoNCpicHMpOwogfQogCiBzdGF0aWMgaW50IGFyazMxMTZfYXR0YWNoKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCiB7Ci0JY2hhciAqYnVmOworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSBzZXJpYWwtPnBvcnRbMF07CisJc3RydWN0IGFyazMxMTZfcHJpdmF0ZSAqcHJpdjsKIAotCWJ1ZiA9IGttYWxsb2MoMSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpIHsKLQkJZGJnKCJlcnJvciBrbWFsbG9jIC0+IG91dCBvZiBtZW0/Iik7CisJLyogbWFrZSBzdXJlIHdlIGhhdmUgb3VyIGVuZC1wb2ludHMgKi8KKwlpZiAoKHNlcmlhbC0+bnVtX2J1bGtfaW4gPT0gMCkgfHwKKwkgICAgKHNlcmlhbC0+bnVtX2J1bGtfb3V0ID09IDApIHx8CisJICAgIChzZXJpYWwtPm51bV9pbnRlcnJ1cHRfaW4gPT0gMCkpIHsKKwkJZGV2X2Vycigmc2VyaWFsLT5kZXYtPmRldiwKKwkJCSIlcyAtIG1pc3NpbmcgZW5kcG9pbnQgLSAiCisJCQkiYnVsayBpbjogJWQsIGJ1bGsgb3V0OiAlZCwgaW50IGluICVkXG4iLAorCQkJS0JVSUxEX01PRE5BTUUsCisJCQlzZXJpYWwtPm51bV9idWxrX2luLAorCQkJc2VyaWFsLT5udW1fYnVsa19vdXQsCisJCQlzZXJpYWwtPm51bV9pbnRlcnJ1cHRfaW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFyazMxMTZfcHJpdmF0ZSksCisJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCiAJCXJldHVybiAtRU5PTUVNOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcHJpdi0+ZGVsdGFfbXNyX3dhaXQpOworCW11dGV4X2luaXQoJnByaXYtPmh3X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZwcml2LT5zdGF0dXNfbG9jayk7CisKKwlwcml2LT5pcmRhID0gaXNfaXJkYShzZXJpYWwpOworCisJdXNiX3NldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQsIHByaXYpOworCisJLyogc2V0dXAgdGhlIGhhcmR3YXJlICovCisJYXJrMzExNl93cml0ZV9yZWcoc2VyaWFsLCBVQVJUX0lFUiwgMCk7CisJLyogZGlzYWJsZSBETUEgKi8KKwlhcmszMTE2X3dyaXRlX3JlZyhzZXJpYWwsIFVBUlRfRkNSLCAwKTsKKwkvKiBoYW5kc2hha2UgY29udHJvbCAqLworCXByaXYtPmhjciA9IDA7CisJYXJrMzExNl93cml0ZV9yZWcoc2VyaWFsLCAweDggICAgICwgMCk7CisJLyogbW9kZW0gY29udHJvbCAqLworCXByaXYtPm1jciA9IDA7CisJYXJrMzExNl93cml0ZV9yZWcoc2VyaWFsLCBVQVJUX01DUiwgMCk7CisKKwlpZiAoIShwcml2LT5pcmRhKSkgeworCQlhcmszMTE2X3dyaXRlX3JlZyhzZXJpYWwsIDB4YiAsIDApOworCX0gZWxzZSB7CisJCWFyazMxMTZfd3JpdGVfcmVnKHNlcmlhbCwgMHhiICwgMSk7CisJCWFyazMxMTZfd3JpdGVfcmVnKHNlcmlhbCwgMHhjICwgMCk7CisJCWFyazMxMTZfd3JpdGVfcmVnKHNlcmlhbCwgMHhkICwgMHg0MSk7CisJCWFyazMxMTZfd3JpdGVfcmVnKHNlcmlhbCwgMHhhICwgMSk7CiAJfQogCi0JaWYgKGlzX2lyZGEoc2VyaWFsKSkKLQkJZGJnKCJJckRBIG1vZGUiKTsKKwkvKiBzZXR1cCBiYXVkcmF0ZSAqLworCWFyazMxMTZfd3JpdGVfcmVnKHNlcmlhbCwgVUFSVF9MQ1IsIFVBUlRfTENSX0RMQUIpOwogCi0JLyogMyAqLwotCUFSSzMxMTZfU05EKHNlcmlhbCwgMywgMHhGRSwgMHg0MCwgMHgwMDA4LCAweDAwMDIpOwotCUFSSzMxMTZfU05EKHNlcmlhbCwgNCwgMHhGRSwgMHg0MCwgMHgwMDA4LCAweDAwMDEpOwotCUFSSzMxMTZfU05EKHNlcmlhbCwgNSwgMHhGRSwgMHg0MCwgMHgwMDAwLCAweDAwMDgpOwotCUFSSzMxMTZfU05EKHNlcmlhbCwgNiwgMHhGRSwgMHg0MCwgaXNfaXJkYShzZXJpYWwpID8gMHgwMDAxIDogMHgwMDAwLAotCQkgICAgMHgwMDBCKTsKKwkvKiBzZXR1cCBmb3IgOTYwMCA4TjEgKi8KKwlwcml2LT5xdW90ID0gY2FsY19kaXZpc29yKDk2MDApOworCWFyazMxMTZfd3JpdGVfcmVnKHNlcmlhbCwgVUFSVF9ETEwsIHByaXYtPnF1b3QgJiAweGZmKTsKKwlhcmszMTE2X3dyaXRlX3JlZyhzZXJpYWwsIFVBUlRfRExNLCAocHJpdi0+cXVvdD4+OCkgJiAweGZmKTsKIAotCWlmIChpc19pcmRhKHNlcmlhbCkpIHsKLQkJQVJLMzExNl9TTkQoc2VyaWFsLCAxMDAxLCAweEZFLCAweDQwLCAweDAwMDAsIDB4MDAwQyk7Ci0JCUFSSzMxMTZfU05EKHNlcmlhbCwgMTAwMiwgMHhGRSwgMHg0MCwgMHgwMDQxLCAweDAwMEQpOwotCQlBUkszMTE2X1NORChzZXJpYWwsIDEwMDMsIDB4RkUsIDB4NDAsIDB4MDAwMSwgMHgwMDBBKTsKLQl9CisJcHJpdi0+bGNyID0gVUFSVF9MQ1JfV0xFTjg7CisJYXJrMzExNl93cml0ZV9yZWcoc2VyaWFsLCBVQVJUX0xDUiwgVUFSVF9MQ1JfV0xFTjgpOwogCi0JLyogPC0tIHNlcTcgKi8KLQlBUkszMTE2X1JDVihzZXJpYWwsICA3LCAweEZFLCAweEMwLCAweDAwMDAsIDB4MDAwMywgMHgwMCwgYnVmKTsKLQlBUkszMTE2X1NORChzZXJpYWwsICA4LCAweEZFLCAweDQwLCAweDAwODAsIDB4MDAwMyk7Ci0JQVJLMzExNl9TTkQoc2VyaWFsLCAgOSwgMHhGRSwgMHg0MCwgMHgwMDFBLCAweDAwMDApOwotCUFSSzMxMTZfU05EKHNlcmlhbCwgMTAsIDB4RkUsIDB4NDAsIDB4MDAwMCwgMHgwMDAxKTsKLQlBUkszMTE2X1NORChzZXJpYWwsIDExLCAweEZFLCAweDQwLCAweDAwMDAsIDB4MDAwMyk7CisJYXJrMzExNl93cml0ZV9yZWcoc2VyaWFsLCAweGUsIDApOwogCi0JLyogPC0tIHNlcTEyICovCi0JQVJLMzExNl9SQ1Yoc2VyaWFsLCAxMiwgMHhGRSwgMHhDMCwgMHgwMDAwLCAweDAwMDQsIDB4MDAsIGJ1Zik7Ci0JQVJLMzExNl9TTkQoc2VyaWFsLCAxMywgMHhGRSwgMHg0MCwgMHgwMDAwLCAweDAwMDQpOworCWlmIChwcml2LT5pcmRhKQorCQlhcmszMTE2X3dyaXRlX3JlZyhzZXJpYWwsIDB4OSwgMCk7CiAKLQkvKiAxNCAqLwotCUFSSzMxMTZfUkNWKHNlcmlhbCwgMTQsIDB4RkUsIDB4QzAsIDB4MDAwMCwgMHgwMDA0LCAweDAwLCBidWYpOwotCUFSSzMxMTZfU05EKHNlcmlhbCwgMTUsIDB4RkUsIDB4NDAsIDB4MDAwMCwgMHgwMDA0KTsKLQotCS8qIDE2ICovCi0JQVJLMzExNl9SQ1Yoc2VyaWFsLCAxNiwgMHhGRSwgMHhDMCwgMHgwMDAwLCAweDAwMDQsIDB4MDAsIGJ1Zik7Ci0JLyogLS0+IHNlcTE3ICovCi0JQVJLMzExNl9TTkQoc2VyaWFsLCAxNywgMHhGRSwgMHg0MCwgMHgwMDAxLCAweDAwMDQpOwotCi0JLyogPC0tIHNlcTE4ICovCi0JQVJLMzExNl9SQ1Yoc2VyaWFsLCAxOCwgMHhGRSwgMHhDMCwgMHgwMDAwLCAweDAwMDQsIDB4MDEsIGJ1Zik7Ci0KLQkvKiAtLT4gc2VxMTkgKi8KLQlBUkszMTE2X1NORChzZXJpYWwsIDE5LCAweEZFLCAweDQwLCAweDAwMDMsIDB4MDAwNCk7Ci0KLQkvKiA8LS0gc2VxMjAgKi8KLQkvKiBzZWVtcyBsaWtlIHNlcmlhbCBwb3J0IHN0YXR1cyBpbmZvIChSVFMsIENUUywgLi4uKSAqLwotCS8qIHJldHVybnMgbW9kZW0gY29udHJvbCBsaW5lIHN0YXR1cz8hICovCi0JQVJLMzExNl9SQ1Yoc2VyaWFsLCAyMCwgMHhGRSwgMHhDMCwgMHgwMDAwLCAweDAwMDYsIDB4RkYsIGJ1Zik7Ci0KLQkvKiBzZXQgOTYwMCBiYXVkICYgZG8gc29tZSBpbml0PyEgKi8KLQlBUkszMTE2X1NORChzZXJpYWwsIDE0NywgMHhGRSwgMHg0MCwgMHgwMDgzLCAweDAwMDMpOwotCUFSSzMxMTZfU05EKHNlcmlhbCwgMTQ4LCAweEZFLCAweDQwLCAweDAwMzgsIDB4MDAwMCk7Ci0JQVJLMzExNl9TTkQoc2VyaWFsLCAxNDksIDB4RkUsIDB4NDAsIDB4MDAwMSwgMHgwMDAxKTsKLQlpZiAoaXNfaXJkYShzZXJpYWwpKQotCQlBUkszMTE2X1NORChzZXJpYWwsIDEwMDQsIDB4RkUsIDB4NDAsIDB4MDAwMCwgMHgwMDA5KTsKLQlBUkszMTE2X1NORChzZXJpYWwsIDE1MCwgMHhGRSwgMHg0MCwgMHgwMDAzLCAweDAwMDMpOwotCUFSSzMxMTZfUkNWKHNlcmlhbCwgMTUxLCAweEZFLCAweEMwLCAweDAwMDAsIDB4MDAwNCwgMHgwMywgYnVmKTsKLQlBUkszMTE2X1NORChzZXJpYWwsIDE1MiwgMHhGRSwgMHg0MCwgMHgwMDAwLCAweDAwMDMpOwotCUFSSzMxMTZfUkNWKHNlcmlhbCwgMTUzLCAweEZFLCAweEMwLCAweDAwMDAsIDB4MDAwMywgMHgwMCwgYnVmKTsKLQlBUkszMTE2X1NORChzZXJpYWwsIDE1NCwgMHhGRSwgMHg0MCwgMHgwMDAzLCAweDAwMDMpOwotCi0Ja2ZyZWUoYnVmKTsKKwlkZXZfaW5mbygmc2VyaWFsLT5kZXYtPmRldiwKKwkJIiVzIHVzaW5nICVzIG1vZGVcbiIsCisJCUtCVUlMRF9NT0ROQU1FLAorCQlwcml2LT5pcmRhID8gIklyREEiIDogIlJTMjMyIik7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGFyazMxMTZfcmVsZWFzZShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQoreworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSBzZXJpYWwtPnBvcnRbMF07CisJc3RydWN0IGFyazMxMTZfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKworCS8qIGRldmljZSBpcyBjbG9zZWQsIHNvIFVSQnMgYW5kIERNQSBzaG91bGQgYmUgZG93biAqLworCisJdXNiX3NldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQsIE5VTEwpOworCisJbXV0ZXhfZGVzdHJveSgmcHJpdi0+aHdfbG9jayk7CisKKwlrZnJlZShwcml2KTsKK30KKwogc3RhdGljIHZvaWQgYXJrMzExNl9pbml0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKIAlzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MgPSB0dHktPnRlcm1pb3M7CkBAIC0xNzIsMjAwICsyMjcsMTg5IEBACiAJCQkJc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOworCXN0cnVjdCBhcmszMTE2X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zID0gdHR5LT50ZXJtaW9zOwogCXVuc2lnbmVkIGludCBjZmxhZyA9IHRlcm1pb3MtPmNfY2ZsYWc7Ci0JaW50IGJhdWQ7Ci0JaW50IGFyazMxMTZfYmF1ZDsKLQljaGFyICpidWY7Ci0JY2hhciBjb25maWc7CisJaW50IGJwcyA9IHR0eV9nZXRfYmF1ZF9yYXRlKHR0eSk7CisJaW50IHF1b3Q7CisJX191OCBsY3IsIGhjciwgZXZhbDsKIAotCWNvbmZpZyA9IDA7Ci0KLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwotCi0KLQljZmxhZyA9IHRlcm1pb3MtPmNfY2ZsYWc7Ci0JdGVybWlvcy0+Y19jZmxhZyAmPSB+KENNU1BBUnxDUlRTQ1RTKTsKLQotCWJ1ZiA9IGttYWxsb2MoMSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpIHsKLQkJZGJnKCJlcnJvciBrbWFsbG9jIik7Ci0JCSp0ZXJtaW9zID0gKm9sZF90ZXJtaW9zOwotCQlyZXR1cm47Ci0JfQotCi0JLyogc2V0IGRhdGEgYml0IGNvdW50ICg4LzcvNi81KSAqLwotCWlmIChjZmxhZyAmIENTSVpFKSB7Ci0JCXN3aXRjaCAoY2ZsYWcgJiBDU0laRSkgewotCQljYXNlIENTNToKLQkJCWNvbmZpZyB8PSAweDAwOwotCQkJZGJnKCJzZXR0aW5nIENTNSIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ1M2OgotCQkJY29uZmlnIHw9IDB4MDE7Ci0JCQlkYmcoInNldHRpbmcgQ1M2Iik7Ci0JCQlicmVhazsKLQkJY2FzZSBDUzc6Ci0JCQljb25maWcgfD0gMHgwMjsKLQkJCWRiZygic2V0dGluZyBDUzciKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZGJnKCJDU0laRSB3YXMgc2V0IGJ1dCBub3QgQ1M1LUNTOCwgdXNpbmcgQ1M4ISIpOwotCQkJLyogZmFsbCB0aHJvdWdoICovCi0JCWNhc2UgQ1M4OgotCQkJY29uZmlnIHw9IDB4MDM7Ci0JCQlkYmcoInNldHRpbmcgQ1M4Iik7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qIHNldCBwYXJpdHkgKE5PTkUvRVZFTi9PREQpICovCi0JaWYgKGNmbGFnICYgUEFSRU5CKSB7Ci0JCWlmIChjZmxhZyAmIFBBUk9ERCkgewotCQkJY29uZmlnIHw9IDB4MDg7Ci0JCQlkYmcoInNldHRpbmcgcGFyaXR5IHRvIE9ERCIpOwotCQl9IGVsc2UgewotCQkJY29uZmlnIHw9IDB4MTg7Ci0JCQlkYmcoInNldHRpbmcgcGFyaXR5IHRvIEVWRU4iKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWRiZygic2V0dGluZyBwYXJpdHkgdG8gTk9ORSIpOwotCX0KLQotCS8qIHNldCBzdG9wIGJpdCAoMS8yKSAqLwotCWlmIChjZmxhZyAmIENTVE9QQikgewotCQljb25maWcgfD0gMHgwNDsKLQkJZGJnKCJzZXR0aW5nIDIgc3RvcCBiaXRzIik7Ci0JfSBlbHNlIHsKLQkJZGJnKCJzZXR0aW5nIDEgc3RvcCBiaXQiKTsKLQl9Ci0KLQkvKiBzZXQgYmF1ZHJhdGUgKi8KLQliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUodHR5KTsKLQotCXN3aXRjaCAoYmF1ZCkgewotCWNhc2UgNzU6Ci0JY2FzZSAxNTA6Ci0JY2FzZSAzMDA6Ci0JY2FzZSA2MDA6Ci0JY2FzZSAxMjAwOgotCWNhc2UgMTgwMDoKLQljYXNlIDI0MDA6Ci0JY2FzZSA0ODAwOgotCWNhc2UgOTYwMDoKLQljYXNlIDE5MjAwOgotCWNhc2UgMzg0MDA6Ci0JY2FzZSA1NzYwMDoKLQljYXNlIDExNTIwMDoKLQljYXNlIDIzMDQwMDoKLQljYXNlIDQ2MDgwMDoKLQkJLyogUmVwb3J0IHRoZSByZXN1bHRpbmcgcmF0ZSBiYWNrIHRvIHRoZSBjYWxsZXIgKi8KLQkJdHR5X2VuY29kZV9iYXVkX3JhdGUodHR5LCBiYXVkLCBiYXVkKTsKKwkvKiBzZXQgZGF0YSBiaXQgY291bnQgKi8KKwlzd2l0Y2ggKGNmbGFnICYgQ1NJWkUpIHsKKwljYXNlIENTNToKKwkJbGNyID0gVUFSVF9MQ1JfV0xFTjU7CiAJCWJyZWFrOwotCS8qIHNldCA5NjAwIGFzIGRlZmF1bHQgKGlmIGdpdmVuIGJhdWRyYXRlIGlzIGludmFsaWQgZm9yIGV4YW1wbGUpICovCisJY2FzZSBDUzY6CisJCWxjciA9IFVBUlRfTENSX1dMRU42OworCQlicmVhazsKKwljYXNlIENTNzoKKwkJbGNyID0gVUFSVF9MQ1JfV0xFTjc7CisJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXR0eV9lbmNvZGVfYmF1ZF9yYXRlKHR0eSwgOTYwMCwgOTYwMCk7CisJY2FzZSBDUzg6CisJCWxjciA9IFVBUlRfTENSX1dMRU44OworCQlicmVhazsKKwl9CisJaWYgKGNmbGFnICYgQ1NUT1BCKQorCQlsY3IgfD0gVUFSVF9MQ1JfU1RPUDsKKwlpZiAoY2ZsYWcgJiBQQVJFTkIpCisJCWxjciB8PSBVQVJUX0xDUl9QQVJJVFk7CisJaWYgKCEoY2ZsYWcgJiBQQVJPREQpKQorCQlsY3IgfD0gVUFSVF9MQ1JfRVBBUjsKKyNpZmRlZiBDTVNQQVIKKwlpZiAoY2ZsYWcgJiBDTVNQQVIpCisJCWxjciB8PSBVQVJUX0xDUl9TUEFSOworI2VuZGlmCisJLyogaGFuZHNoYWtlIGNvbnRyb2wgKi8KKwloY3IgPSAoY2ZsYWcgJiBDUlRTQ1RTKSA/IDB4MDMgOiAweDAwOworCisJLyogY2FsYyBiYXVkcmF0ZSAqLworCWRiZygiJXMgLSBzZXR0aW5nIGJwcyB0byAlZCIsIF9fZnVuY19fLCBicHMpOworCWV2YWwgPSAwOworCXN3aXRjaCAoYnBzKSB7CiAJY2FzZSAwOgotCQliYXVkID0gOTYwMDsKKwkJcXVvdCA9IGNhbGNfZGl2aXNvcig5NjAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKChicHMgPCA3NSkgfHwgKGJwcyA+IDMwMDAwMDApKQorCQkJYnBzID0gOTYwMDsKKwkJcXVvdCA9IGNhbGNfZGl2aXNvcihicHMpOworCQlicmVhazsKKwljYXNlIDQ2MDgwMDoKKwkJZXZhbCA9IDE7CisJCXF1b3QgPSBjYWxjX2Rpdmlzb3IoYnBzKTsKKwkJYnJlYWs7CisJY2FzZSA5MjE2MDA6CisJCWV2YWwgPSAyOworCQlxdW90ID0gY2FsY19kaXZpc29yKGJwcyk7CisJCWJyZWFrOwogCX0KIAotCS8qCi0JICogZm91bmQgYnkgdHJ5J24nZXJyb3IsIGJlIGNhcmVmdWwsIG1heWJlIHRoZXJlIGFyZSBvdGhlciBvcHRpb25zCi0JICogZm9yIG11bHRpcGxpY2F0b3IgZXRjISAoMy41IGZvciBleGFtcGxlKQotCSAqLwotCWlmIChiYXVkID09IDQ2MDgwMCkKLQkJLyogc3RyYW5nZSwgZm9yIDQ2MDgwMCB0aGUgZm9ybXVsYSBpcyB3cm9uZwotCQkgKiBpZiB1c2luZyByb3VuZCgpIHRoZW4gOTYwMGJhdWQgaXMgd3JvbmcpICovCi0JCWFyazMxMTZfYmF1ZCA9IDc7Ci0JZWxzZQotCQlhcmszMTE2X2JhdWQgPSAzMDAwMDAwIC8gYmF1ZDsKKwkvKiBVcGRhdGUgc3RhdGU6IHN5bmNocm9uaXplICovCisJbXV0ZXhfbG9jaygmcHJpdi0+aHdfbG9jayk7CiAKLQkvKiA/ICovCi0JQVJLMzExNl9SQ1Yoc2VyaWFsLCAwLCAweEZFLCAweEMwLCAweDAwMDAsIDB4MDAwMywgMHgwMywgYnVmKTsKKwkvKiBrZWVwIG9sZCBMQ1JfU0JDIGJpdCAqLworCWxjciB8PSAocHJpdi0+bGNyICYgVUFSVF9MQ1JfU0JDKTsKIAotCS8qIG9mZnNldCA9IGJ1ZlswXTsgKi8KLQkvKiBvZmZzZXQgPSAweDAzOyAqLwotCS8qIGRiZygidXNpbmcgMHglMDRYIGFzIHRhcmdldCBmb3IgMHgwMDAzOiIsIDB4MDA4MCArIG9mZnNldCk7ICovCisJZGJnKCIlcyAtIHNldHRpbmcgaGNyOjB4JTAyeCxsY3I6MHglMDJ4LHF1b3Q6JWQiLAorCSAgICBfX2Z1bmNfXywgaGNyLCBsY3IsIHF1b3QpOwogCi0JLyogc2V0IGJhdWRyYXRlICovCi0JZGJnKCJzZXR0aW5nIGJhdWRyYXRlIHRvICVkICgtPnJlZz0lZCkiLCBiYXVkLCBhcmszMTE2X2JhdWQpOwotCUFSSzMxMTZfU05EKHNlcmlhbCwgMTQ3LCAweEZFLCAweDQwLCAweDAwODMsIDB4MDAwMyk7Ci0JQVJLMzExNl9TTkQoc2VyaWFsLCAxNDgsIDB4RkUsIDB4NDAsCi0JCQkgICAgKGFyazMxMTZfYmF1ZCAmIDB4MDBGRiksIDB4MDAwMCk7Ci0JQVJLMzExNl9TTkQoc2VyaWFsLCAxNDksIDB4RkUsIDB4NDAsCi0JCQkgICAgKGFyazMxMTZfYmF1ZCAmIDB4RkYwMCkgPj4gOCwgMHgwMDAxKTsKLQlBUkszMTE2X1NORChzZXJpYWwsIDE1MCwgMHhGRSwgMHg0MCwgMHgwMDAzLCAweDAwMDMpOworCS8qIGhhbmRzaGFrZSBjb250cm9sICovCisJaWYgKHByaXYtPmhjciAhPSBoY3IpIHsKKwkJcHJpdi0+aGNyID0gaGNyOworCQlhcmszMTE2X3dyaXRlX3JlZyhzZXJpYWwsIDB4OCwgaGNyKTsKKwl9CiAKLQkvKiA/ICovCi0JQVJLMzExNl9SQ1Yoc2VyaWFsLCAxNTEsIDB4RkUsIDB4QzAsIDB4MDAwMCwgMHgwMDA0LCAweDAzLCBidWYpOwotCUFSSzMxMTZfU05EKHNlcmlhbCwgMTUyLCAweEZFLCAweDQwLCAweDAwMDAsIDB4MDAwMyk7CisJLyogYmF1ZHJhdGUgKi8KKwlpZiAocHJpdi0+cXVvdCAhPSBxdW90KSB7CisJCXByaXYtPnF1b3QgPSBxdW90OworCQlwcml2LT5sY3IgPSBsY3I7IC8qIG5lZWQgdG8gd3JpdGUgbGNyIGFueXdheSAqLwogCi0JLyogc2V0IGRhdGEgYml0IGNvdW50LCBzdG9wIGJpdCBjb3VudCAmIHBhcml0eTogKi8KLQlkYmcoInVwZGF0aW5nIGJpdCBjb3VudCwgc3RvcCBiaXQgb3IgcGFyaXR5IChjZmc9MHglMDJYKSIsIGNvbmZpZyk7Ci0JQVJLMzExNl9SQ1Yoc2VyaWFsLCAxNTMsIDB4RkUsIDB4QzAsIDB4MDAwMCwgMHgwMDAzLCAweDAwLCBidWYpOwotCUFSSzMxMTZfU05EKHNlcmlhbCwgMTU0LCAweEZFLCAweDQwLCBjb25maWcsIDB4MDAwMyk7CisJCS8qIGRpc2FibGUgRE1BIHNpbmNlIHRyYW5zbWl0L3JlY2VpdmUgaXMKKwkJICogc2hhZG93ZWQgYnkgVUFSVF9ETEwKKwkJICovCisJCWFyazMxMTZfd3JpdGVfcmVnKHNlcmlhbCwgVUFSVF9GQ1IsIDApOwogCi0JaWYgKGNmbGFnICYgQ1JUU0NUUykKLQkJZGJnKCJDUlRTQ1RTIG5vdCBzdXBwb3J0ZWQgYnkgY2hpcHNldD8hIik7CisJCWFyazMxMTZfd3JpdGVfcmVnKHNlcmlhbCwgVUFSVF9MQ1IsCisJCQkJICBsY3J8VUFSVF9MQ1JfRExBQik7CisJCWFyazMxMTZfd3JpdGVfcmVnKHNlcmlhbCwgVUFSVF9ETEwsIHF1b3QgJiAweGZmKTsKKwkJYXJrMzExNl93cml0ZV9yZWcoc2VyaWFsLCBVQVJUX0RMTSwgKHF1b3Q+PjgpICYgMHhmZik7CiAKLQkvKiBURVNUIEFSSzMxMTZfU05EKDE1NCwgMHhGRSwgMHg0MCwgMHhGRkZGLCAweDAwMDYpOyAqLworCQkvKiByZXN0b3JlIGxjciAqLworCQlhcmszMTE2X3dyaXRlX3JlZyhzZXJpYWwsIFVBUlRfTENSLCBsY3IpOworCQkvKiBtYWdpYyBiYXVkcmF0ZSB0aGluZ3k6IG5vdCBzdXJlIHdoYXQgaXQgZG9lcywKKwkJICogYnV0IHdpbmRvd3MgZG9lcyB0aGlzIGFzIHdlbGwuCisJCSAqLworCQlhcmszMTE2X3dyaXRlX3JlZyhzZXJpYWwsIDB4ZSwgZXZhbCk7CiAKLQlrZnJlZShidWYpOworCQkvKiBlbmFibGUgRE1BICovCisJCWFyazMxMTZfd3JpdGVfcmVnKHNlcmlhbCwgVUFSVF9GQ1IsIFVBUlRfRkNSX0RNQV9TRUxFQ1QpOworCX0gZWxzZSBpZiAocHJpdi0+bGNyICE9IGxjcikgeworCQlwcml2LT5sY3IgPSBsY3I7CisJCWFyazMxMTZfd3JpdGVfcmVnKHNlcmlhbCwgVUFSVF9MQ1IsIGxjcik7CisJfQogCi0JcmV0dXJuOworCW11dGV4X3VubG9jaygmcHJpdi0+aHdfbG9jayk7CisKKwkvKiBjaGVjayBmb3Igc29mdHdhcmUgZmxvdyBjb250cm9sICovCisJaWYgKElfSVhPRkYodHR5KSB8fCBJX0lYT04odHR5KSkgeworCQlkZXZfd2Fybigmc2VyaWFsLT5kZXYtPmRldiwKKwkJCSAiJXM6IGRvbid0IGtub3cgaG93IHRvIGRvIHNvZnR3YXJlIGZsb3cgY29udHJvbFxuIiwKKwkJCSBLQlVJTERfTU9ETkFNRSk7CisJfQorCisJLyogRG9uJ3QgcmV3cml0ZSBCMCAqLworCWlmICh0dHlfdGVybWlvc19iYXVkX3JhdGUodGVybWlvcykpCisJCXR0eV90ZXJtaW9zX2VuY29kZV9iYXVkX3JhdGUodGVybWlvcywgYnBzLCBicHMpOworfQorCitzdGF0aWMgdm9pZCBhcmszMTE2X2Nsb3NlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKKworCWlmIChzZXJpYWwtPmRldikgeworCQkvKiBkaXNhYmxlIERNQSAqLworCQlhcmszMTE2X3dyaXRlX3JlZyhzZXJpYWwsIFVBUlRfRkNSLCAwKTsKKworCQkvKiBkZWFjdGl2YXRlIGludGVycnVwdHMgKi8KKwkJYXJrMzExNl93cml0ZV9yZWcoc2VyaWFsLCBVQVJUX0lFUiwgMCk7CisKKwkJLyogc2h1dGRvd24gYW55IGJ1bGsgcmVhZHMgdGhhdCBtaWdodCBiZSBnb2luZyBvbiAqLworCQlpZiAoc2VyaWFsLT5udW1fYnVsa19vdXQpCisJCQl1c2Jfa2lsbF91cmIocG9ydC0+d3JpdGVfdXJiKTsKKwkJaWYgKHNlcmlhbC0+bnVtX2J1bGtfaW4pCisJCQl1c2Jfa2lsbF91cmIocG9ydC0+cmVhZF91cmIpOworCQlpZiAoc2VyaWFsLT5udW1faW50ZXJydXB0X2luKQorCQkJdXNiX2tpbGxfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIpOworCX0KIH0KIAogc3RhdGljIGludCBhcmszMTE2X29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKLQlzdHJ1Y3Qga3Rlcm1pb3MgdG1wX3Rlcm1pb3M7CisJc3RydWN0IGFyazMxMTZfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwotCWNoYXIgKmJ1ZjsKLQlpbnQgcmVzdWx0ID0gMDsKLQotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CisJdW5zaWduZWQgY2hhciAqYnVmOworCWludCByZXN1bHQ7CiAKIAlidWYgPSBrbWFsbG9jKDEsIEdGUF9LRVJORUwpOwotCWlmICghYnVmKSB7Ci0JCWRiZygiZXJyb3Iga21hbGxvYyAtPiBvdXQgb2YgbWVtPyIpOworCWlmIChidWYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJcmVzdWx0ID0gdXNiX3NlcmlhbF9nZW5lcmljX29wZW4odHR5LCBwb3J0KTsKLQlpZiAocmVzdWx0KQorCWlmIChyZXN1bHQpIHsKKwkJZGJnKCIlcyAtIHVzYl9zZXJpYWxfZ2VuZXJpY19vcGVuIGZhaWxlZDogJWQiLAorCQkgICAgX19mdW5jX18sIHJlc3VsdCk7CiAJCWdvdG8gZXJyX291dDsKKwl9CiAKLQkvKiBvcGVuICovCi0JQVJLMzExNl9SQ1Yoc2VyaWFsLCAxMTEsIDB4RkUsIDB4QzAsIDB4MDAwMCwgMHgwMDAzLCAweDAyLCBidWYpOwotCi0JQVJLMzExNl9TTkQoc2VyaWFsLCAxMTIsIDB4RkUsIDB4NDAsIDB4MDA4MiwgMHgwMDAzKTsKLQlBUkszMTE2X1NORChzZXJpYWwsIDExMywgMHhGRSwgMHg0MCwgMHgwMDFBLCAweDAwMDApOwotCUFSSzMxMTZfU05EKHNlcmlhbCwgMTE0LCAweEZFLCAweDQwLCAweDAwMDAsIDB4MDAwMSk7Ci0JQVJLMzExNl9TTkQoc2VyaWFsLCAxMTUsIDB4RkUsIDB4NDAsIDB4MDAwMiwgMHgwMDAzKTsKLQotCUFSSzMxMTZfUkNWKHNlcmlhbCwgMTE2LCAweEZFLCAweEMwLCAweDAwMDAsIDB4MDAwNCwgMHgwMywgYnVmKTsKLQlBUkszMTE2X1NORChzZXJpYWwsIDExNywgMHhGRSwgMHg0MCwgMHgwMDAyLCAweDAwMDQpOwotCi0JQVJLMzExNl9SQ1Yoc2VyaWFsLCAxMTgsIDB4RkUsIDB4QzAsIDB4MDAwMCwgMHgwMDA0LCAweDAyLCBidWYpOwotCUFSSzMxMTZfU05EKHNlcmlhbCwgMTE5LCAweEZFLCAweDQwLCAweDAwMDAsIDB4MDAwNCk7Ci0KLQlBUkszMTE2X1JDVihzZXJpYWwsIDEyMCwgMHhGRSwgMHhDMCwgMHgwMDAwLCAweDAwMDQsIDB4MDAsIGJ1Zik7Ci0KLQlBUkszMTE2X1NORChzZXJpYWwsIDEyMSwgMHhGRSwgMHg0MCwgMHgwMDAxLCAweDAwMDQpOwotCi0JQVJLMzExNl9SQ1Yoc2VyaWFsLCAxMjIsIDB4RkUsIDB4QzAsIDB4MDAwMCwgMHgwMDA0LCAweDAxLCBidWYpOwotCi0JQVJLMzExNl9TTkQoc2VyaWFsLCAxMjMsIDB4RkUsIDB4NDAsIDB4MDAwMywgMHgwMDA0KTsKLQotCS8qIHJldHVybnMgZGlmZmVyZW50IHZhbHVlcyAoY29udHJvbCBsaW5lcz8hKSAqLwotCUFSSzMxMTZfUkNWKHNlcmlhbCwgMTI0LCAweEZFLCAweEMwLCAweDAwMDAsIDB4MDAwNiwgMHhGRiwgYnVmKTsKLQotCS8qIGluaXRpYWxpc2UgdGVybWlvcyAqLworCS8qIHNldHVwIHRlcm1pb3MgKi8KIAlpZiAodHR5KQotCQlhcmszMTE2X3NldF90ZXJtaW9zKHR0eSwgcG9ydCwgJnRtcF90ZXJtaW9zKTsKKwkJYXJrMzExNl9zZXRfdGVybWlvcyh0dHksIHBvcnQsIE5VTEwpOworCisJLyogcmVtb3ZlIGFueSBkYXRhIHN0aWxsIGxlZnQ6IGFsc28gY2xlYXJzIGVycm9yIHN0YXRlICovCisJYXJrMzExNl9yZWFkX3JlZyhzZXJpYWwsIFVBUlRfUlgsIGJ1Zik7CisKKwkvKiByZWFkIG1vZGVtIHN0YXR1cyAqLworCXByaXYtPm1zciA9IGFyazMxMTZfcmVhZF9yZWcoc2VyaWFsLCBVQVJUX01TUiwgYnVmKTsKKwkvKiByZWFkIGxpbmUgc3RhdHVzICovCisJcHJpdi0+bHNyID0gYXJrMzExNl9yZWFkX3JlZyhzZXJpYWwsIFVBUlRfTFNSLCBidWYpOworCisJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0tFUk5FTCk7CisJaWYgKHJlc3VsdCkgeworCQlkZXZfZXJyKCZwb3J0LT5kZXYsICJzdWJtaXQgaXJxX2luIHVyYiBmYWlsZWQgJWRcbiIsCisJCQlyZXN1bHQpOworCQlhcmszMTE2X2Nsb3NlKHBvcnQpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyogYWN0aXZhdGUgaW50ZXJydXB0cyAqLworCWFyazMxMTZfd3JpdGVfcmVnKHBvcnQtPnNlcmlhbCwgVUFSVF9JRVIsIFVBUlRfSUVSX01TSXxVQVJUX0lFUl9STFNJKTsKKworCS8qIGVuYWJsZSBETUEgKi8KKwlhcmszMTE2X3dyaXRlX3JlZyhwb3J0LT5zZXJpYWwsIFVBUlRfRkNSLCBVQVJUX0ZDUl9ETUFfU0VMRUNUKTsKIAogZXJyX291dDoKIAlrZnJlZShidWYpOwotCiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMzczLDYgKzQxNyw3IEBACiAJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGFyazMxMTZfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBzZXJzdHJ1Y3Q7CiAJdm9pZCBfX3VzZXIgKnVzZXJfYXJnID0gKHZvaWQgX191c2VyICopYXJnOwogCkBAIC0zOTQsOSArNDM5LDQ4IEBACiAJCWlmIChjb3B5X2Zyb21fdXNlcigmc2Vyc3RydWN0LCB1c2VyX2FyZywgc2l6ZW9mKHNlcnN0cnVjdCkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXJldHVybiAwOwotCWRlZmF1bHQ6Ci0JCWRiZygiJXMgY21kIDB4JTA0eCBub3Qgc3VwcG9ydGVkIiwgX19mdW5jX18sIGNtZCk7CisJY2FzZSBUSU9DTUlXQUlUOgorCQlmb3IgKDs7KSB7CisJCQlzdHJ1Y3QgYXN5bmNfaWNvdW50IHByZXYgPSBwcml2LT5pY291bnQ7CisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZwcml2LT5kZWx0YV9tc3Jfd2FpdCk7CisJCQkvKiBzZWUgaWYgYSBzaWduYWwgZGlkIGl0ICovCisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJCWlmICgocHJldi5ybmcgPT0gcHJpdi0+aWNvdW50LnJuZykgJiYKKwkJCSAgICAocHJldi5kc3IgPT0gcHJpdi0+aWNvdW50LmRzcikgJiYKKwkJCSAgICAocHJldi5kY2QgPT0gcHJpdi0+aWNvdW50LmRjZCkgJiYKKwkJCSAgICAocHJldi5jdHMgPT0gcHJpdi0+aWNvdW50LmN0cykpCisJCQkJcmV0dXJuIC1FSU87CisJCQlpZiAoKGFyZyAmIFRJT0NNX1JORyAmJgorCQkJICAgICAocHJldi5ybmcgIT0gcHJpdi0+aWNvdW50LnJuZykpIHx8CisJCQkgICAgKGFyZyAmIFRJT0NNX0RTUiAmJgorCQkJICAgICAocHJldi5kc3IgIT0gcHJpdi0+aWNvdW50LmRzcikpIHx8CisJCQkgICAgKGFyZyAmIFRJT0NNX0NEICAmJgorCQkJICAgICAocHJldi5kY2QgIT0gcHJpdi0+aWNvdW50LmRjZCkpIHx8CisJCQkgICAgKGFyZyAmIFRJT0NNX0NUUyAmJgorCQkJICAgICAocHJldi5jdHMgIT0gcHJpdi0+aWNvdW50LmN0cykpKQorCQkJCXJldHVybiAwOworCQl9CiAJCWJyZWFrOworCWNhc2UgVElPQ0dJQ09VTlQ6IHsKKwkJc3RydWN0IHNlcmlhbF9pY291bnRlcl9zdHJ1Y3QgaWNvdW50OworCQlzdHJ1Y3QgYXN5bmNfaWNvdW50IGNub3cgPSBwcml2LT5pY291bnQ7CisJCW1lbXNldCgmaWNvdW50LCAwLCBzaXplb2YoaWNvdW50KSk7CisJCWljb3VudC5jdHMgPSBjbm93LmN0czsKKwkJaWNvdW50LmRzciA9IGNub3cuZHNyOworCQlpY291bnQucm5nID0gY25vdy5ybmc7CisJCWljb3VudC5kY2QgPSBjbm93LmRjZDsKKwkJaWNvdW50LnJ4ID0gY25vdy5yeDsKKwkJaWNvdW50LnR4ID0gY25vdy50eDsKKwkJaWNvdW50LmZyYW1lID0gY25vdy5mcmFtZTsKKwkJaWNvdW50Lm92ZXJydW4gPSBjbm93Lm92ZXJydW47CisJCWljb3VudC5wYXJpdHkgPSBjbm93LnBhcml0eTsKKwkJaWNvdW50LmJyayA9IGNub3cuYnJrOworCQlpY291bnQuYnVmX292ZXJydW4gPSBjbm93LmJ1Zl9vdmVycnVuOworCQlpZiAoY29weV90b191c2VyKHVzZXJfYXJnLCAmaWNvdW50LCBzaXplb2YoaWNvdW50KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJfQogCX0KIAogCXJldHVybiAtRU5PSU9DVExDTUQ7CkBAIC00MDUsMzIgKzQ4OSwyNzMgQEAKIHN0YXRpYyBpbnQgYXJrMzExNl90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwotCWNoYXIgKmJ1ZjsKLQljaGFyIHRlbXA7CisJc3RydWN0IGFyazMxMTZfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKwlfX3UzMiBzdGF0dXM7CisJX191MzIgY3RybDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JLyogc2VlbXMgbGlrZSBzZXJpYWwgcG9ydCBzdGF0dXMgaW5mbyAoUlRTLCBDVFMsIC4uLikgaXMgc3RvcmVkCi0JICogaW4gcmVnKD8pIDB4MDAwNgotCSAqIHBjYiBjb25uZWN0aW9uIHBvaW50IDExID0gR05EIC0+IHNldHMgYml0NCBvZiByZXNwb25zZQotCSAqIHBjYiBjb25uZWN0aW9uIHBvaW50ICA3ID0gR05EIC0+IHNldHMgYml0NiBvZiByZXNwb25zZQorCW11dGV4X2xvY2soJnByaXYtPmh3X2xvY2spOworCWN0cmwgPSBwcml2LT5tY3I7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5od19sb2NrKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGF0dXNfbG9jaywgZmxhZ3MpOworCXN0YXR1cyA9IHByaXYtPm1zcjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGF0dXNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuICAoc3RhdHVzICYgVUFSVF9NU1JfRFNSICA/IFRJT0NNX0RTUiAgOiAwKSB8CisJCShzdGF0dXMgJiBVQVJUX01TUl9DVFMgID8gVElPQ01fQ1RTICA6IDApIHwKKwkJKHN0YXR1cyAmIFVBUlRfTVNSX1JJICAgPyBUSU9DTV9SSSAgIDogMCkgfAorCQkoc3RhdHVzICYgVUFSVF9NU1JfRENEICA/IFRJT0NNX0NEICAgOiAwKSB8CisJCShjdHJsICAgJiBVQVJUX01DUl9EVFIgID8gVElPQ01fRFRSICA6IDApIHwKKwkJKGN0cmwgICAmIFVBUlRfTUNSX1JUUyAgPyBUSU9DTV9SVFMgIDogMCkgfAorCQkoY3RybCAgICYgVUFSVF9NQ1JfT1VUMSA/IFRJT0NNX09VVDEgOiAwKSB8CisJCShjdHJsICAgJiBVQVJUX01DUl9PVVQyID8gVElPQ01fT1VUMiA6IDApOworfQorCitzdGF0aWMgaW50IGFyazMxMTZfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBzZXQsIHVuc2lnbmVkIGNscikKK3sKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgYXJrMzExNl9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCisJLyogd2UgbmVlZCB0byB0YWtlIHRoZSBtdXRleCBoZXJlLCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgdmFsdWUKKwkgKiBpbiBwcml2LT5tY3IgaXMgYWN0dWFsbHkgdGhlIG9uZSB0aGF0IGlzIGluIHRoZSBoYXJkd2FyZQogCSAqLwogCi0JYnVmID0ga21hbGxvYygxLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikgewotCQlkYmcoImVycm9yIGttYWxsb2MiKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJbXV0ZXhfbG9jaygmcHJpdi0+aHdfbG9jayk7CisKKwlpZiAoc2V0ICYgVElPQ01fUlRTKQorCQlwcml2LT5tY3IgfD0gVUFSVF9NQ1JfUlRTOworCWlmIChzZXQgJiBUSU9DTV9EVFIpCisJCXByaXYtPm1jciB8PSBVQVJUX01DUl9EVFI7CisJaWYgKHNldCAmIFRJT0NNX09VVDEpCisJCXByaXYtPm1jciB8PSBVQVJUX01DUl9PVVQxOworCWlmIChzZXQgJiBUSU9DTV9PVVQyKQorCQlwcml2LT5tY3IgfD0gVUFSVF9NQ1JfT1VUMjsKKwlpZiAoY2xyICYgVElPQ01fUlRTKQorCQlwcml2LT5tY3IgJj0gflVBUlRfTUNSX1JUUzsKKwlpZiAoY2xyICYgVElPQ01fRFRSKQorCQlwcml2LT5tY3IgJj0gflVBUlRfTUNSX0RUUjsKKwlpZiAoY2xyICYgVElPQ01fT1VUMSkKKwkJcHJpdi0+bWNyICY9IH5VQVJUX01DUl9PVVQxOworCWlmIChjbHIgJiBUSU9DTV9PVVQyKQorCQlwcml2LT5tY3IgJj0gflVBUlRfTUNSX09VVDI7CisKKwlhcmszMTE2X3dyaXRlX3JlZyhwb3J0LT5zZXJpYWwsIFVBUlRfTUNSLCBwcml2LT5tY3IpOworCisJbXV0ZXhfdW5sb2NrKCZwcml2LT5od19sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhcmszMTE2X2JyZWFrX2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgYnJlYWtfc3RhdGUpCit7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGFyazMxMTZfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKworCS8qIExDUiBpcyBhbHNvIHVzZWQgZm9yIG90aGVyIHRoaW5nczogcHJvdGVjdCBhY2Nlc3MgKi8KKwltdXRleF9sb2NrKCZwcml2LT5od19sb2NrKTsKKworCWlmIChicmVha19zdGF0ZSkKKwkJcHJpdi0+bGNyIHw9IFVBUlRfTENSX1NCQzsKKwllbHNlCisJCXByaXYtPmxjciAmPSB+VUFSVF9MQ1JfU0JDOworCisJYXJrMzExNl93cml0ZV9yZWcocG9ydC0+c2VyaWFsLCBVQVJUX0xDUiwgcHJpdi0+bGNyKTsKKworCW11dGV4X3VubG9jaygmcHJpdi0+aHdfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGFyazMxMTZfdXBkYXRlX21zcihzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBfX3U4IG1zcikKK3sKKwlzdHJ1Y3QgYXJrMzExNl9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhdHVzX2xvY2ssIGZsYWdzKTsKKwlwcml2LT5tc3IgPSBtc3I7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhdHVzX2xvY2ssIGZsYWdzKTsKKworCWlmIChtc3IgJiBVQVJUX01TUl9BTllfREVMVEEpIHsKKwkJLyogdXBkYXRlIGlucHV0IGxpbmUgY291bnRlcnMgKi8KKwkJaWYgKG1zciAmIFVBUlRfTVNSX0RDVFMpCisJCQlwcml2LT5pY291bnQuY3RzKys7CisJCWlmIChtc3IgJiBVQVJUX01TUl9ERFNSKQorCQkJcHJpdi0+aWNvdW50LmRzcisrOworCQlpZiAobXNyICYgVUFSVF9NU1JfRERDRCkKKwkJCXByaXYtPmljb3VudC5kY2QrKzsKKwkJaWYgKG1zciAmIFVBUlRfTVNSX1RFUkkpCisJCQlwcml2LT5pY291bnQucm5nKys7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+ZGVsdGFfbXNyX3dhaXQpOworCX0KK30KKworc3RhdGljIHZvaWQgYXJrMzExNl91cGRhdGVfbHNyKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIF9fdTggbHNyKQoreworCXN0cnVjdCBhcmszMTE2X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGF0dXNfbG9jaywgZmxhZ3MpOworCS8qIGNvbWJpbmUgYml0cyAqLworCXByaXYtPmxzciB8PSBsc3I7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhdHVzX2xvY2ssIGZsYWdzKTsKKworCWlmIChsc3ImVUFSVF9MU1JfQlJLX0VSUk9SX0JJVFMpIHsKKwkJaWYgKGxzciAmIFVBUlRfTFNSX0JJKQorCQkJcHJpdi0+aWNvdW50LmJyaysrOworCQlpZiAobHNyICYgVUFSVF9MU1JfRkUpCisJCQlwcml2LT5pY291bnQuZnJhbWUrKzsKKwkJaWYgKGxzciAmIFVBUlRfTFNSX1BFKQorCQkJcHJpdi0+aWNvdW50LnBhcml0eSsrOworCQlpZiAobHNyICYgVUFSVF9MU1JfT0UpCisJCQlwcml2LT5pY291bnQub3ZlcnJ1bisrOworCX0KK30KKworc3RhdGljIHZvaWQgYXJrMzExNl9yZWFkX2ludF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKKwlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CisJY29uc3QgX191OCAqZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOworCWludCByZXN1bHQ7CisKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KKwkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsCisJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWRiZygiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOworCQlicmVhazsKKwljYXNlIDA6IC8qIHN1Y2Nlc3MgKi8KKwkJLyogZGlzY292ZXJlZCB0aGlzIGJ5IHRyYWlsIGFuZCBlcnJvci4uLiAqLworCQlpZiAoKHVyYi0+YWN0dWFsX2xlbmd0aCA9PSA0KSAmJiAoZGF0YVswXSA9PSAweGU4KSkgeworCQkJY29uc3QgX191OCBpZCA9IGRhdGFbMV0mVUFSVF9JSVJfSUQ7CisJCQlkYmcoIiVzOiBpaXI9JTAyeCIsIF9fZnVuY19fLCBkYXRhWzFdKTsKKwkJCWlmIChpZCA9PSBVQVJUX0lJUl9NU0kpIHsKKwkJCQlkYmcoIiVzOiBtc3I9JTAyeCIsIF9fZnVuY19fLCBkYXRhWzNdKTsKKwkJCQlhcmszMTE2X3VwZGF0ZV9tc3IocG9ydCwgZGF0YVszXSk7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKGlkID09IFVBUlRfSUlSX1JMU0kpIHsKKwkJCQlkYmcoIiVzOiBsc3I9JTAyeCIsIF9fZnVuY19fLCBkYXRhWzJdKTsKKwkJCQlhcmszMTE2X3VwZGF0ZV9sc3IocG9ydCwgZGF0YVsyXSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLyoKKwkJICogTm90IHN1cmUgd2hhdCB0aGlzIGRhdGEgbWVhbnQuLi4KKwkJICovCisJCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwKKwkJCQkgICAgICBfX2Z1bmNfXywKKwkJCQkgICAgICB1cmItPmFjdHVhbF9sZW5ndGgsCisJCQkJICAgICAgdXJiLT50cmFuc2Zlcl9idWZmZXIpOworCQlicmVhazsKIAl9CiAKLQkvKiByZWFkIHJlZ2lzdGVyICovCi0JQVJLMzExNl9SQ1ZfUVVJRVQoc2VyaWFsLCAweEZFLCAweEMwLCAweDAwMDAsIDB4MDAwNiwgYnVmKTsKLQl0ZW1wID0gYnVmWzBdOwotCWtmcmVlKGJ1Zik7CisJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAocmVzdWx0KQorCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LAorCQkJIiVzIC0gRXJyb3IgJWQgc3VibWl0dGluZyBpbnRlcnJ1cHQgdXJiXG4iLAorCQkJX19mdW5jX18sIHJlc3VsdCk7Cit9CiAKLQkvKiBpIGRvIG5vdCByZWFsbHkga25vdyBpZiBiaXQ0PUNUUyBhbmQgYml0Nj1EU1IuLi4ganVzdCBhCi0JICogcXVpY2sgZ3Vlc3MhCi0JICovCi0JcmV0dXJuICh0ZW1wICYgKDE8PDQpID8gVElPQ01fQ1RTIDogMCkKLQkgICAgICAgfCAodGVtcCAmICgxPDw2KSA/IFRJT0NNX0RTUiA6IDApOworCisvKiBEYXRhIGNvbWVzIGluIHZpYSB0aGUgYnVsayAoZGF0YSkgVVJCLCBlcm9ycy9pbnRlcnJ1cHRzIHZpYSB0aGUgaW50IFVSQi4KKyAqIFRoaXMgbWVhbnMgdGhhdCB3ZSBjYW5ub3QgYmUgc3VyZSB3aGljaCBkYXRhIGJ5dGUgaGFzIGFuIGFzc29jaWF0ZWQgZXJyb3IKKyAqIGNvbmRpdGlvbiwgc28gd2UgcmVwb3J0IGFuIGVycm9yIGZvciBhbGwgZGF0YSBpbiB0aGUgbmV4dCBidWxrIHJlYWQuCisgKgorICogQWN0dWFsbHksIHRoZXJlIG1pZ2h0IGV2ZW4gYmUgYSB3aW5kb3cgYmV0d2VlbiB0aGUgYnVsayBkYXRhIGxlYXZpbmcgdGhlCisgKiBhcmsgYW5kIHJlYWRpbmcvcmVzZXR0aW5nIHRoZSBsc3IgaW4gdGhlIHJlYWRfYnVsa19jYWxsYmFjayB3aGVyZSBhbgorICogaW50ZXJydXB0IGZvciB0aGUgbmV4dCBkYXRhIGJsb2NrIGNvdWxkIGNvbWUgaW4uCisgKiBXaXRob3V0IHNvbWVraW5kIG9mIG9yZGVyaW5nIG9uIHRoZSBhcmssIHdlIHdvdWxkIGhhdmUgdG8gcmVwb3J0IHRoZQorICogZXJyb3IgZm9yIHRoZSBuZXh0IGJsb2NrIG9mIGRhdGEgYXMgd2VsbC4uLgorICogRm9yIG5vdywgbGV0J3MgcHJldGVuZCB0aGlzIGNhbid0IGhhcHBlbi4KKyAqLworCitzdGF0aWMgdm9pZCBzZW5kX3RvX3R0eShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqY2hhcnMsCisJCQlzaXplX3Qgc2l6ZSwgY2hhciBmbGFnKQoreworCWlmIChzaXplID09IDApCisJCXJldHVybjsKKwlpZiAoZmxhZyA9PSBUVFlfTk9STUFMKSB7CisJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBjaGFycywgc2l6ZSk7CisJfSBlbHNlIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplOyArK2kpCisJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoYXJzW2ldLCBmbGFnKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFyazMxMTZfcmVhZF9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gIHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgYXJrMzExNl9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCWNvbnN0IF9fdTggKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXN1bHQ7CisJY2hhciBmbGFnOworCV9fdTMyIGxzcjsKKworCXN3aXRjaCAoc3RhdHVzKSB7CisJY2FzZSAtRUNPTk5SRVNFVDoKKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRVNIVVRET1dOOgorCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLworCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLAorCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CisJCWJyZWFrOworCWNhc2UgMDogLyogc3VjY2VzcyAqLworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGF0dXNfbG9jaywgZmxhZ3MpOworCQlsc3IgPSBwcml2LT5sc3I7CisJCS8qIGNsZWFyIGVycm9yIGJpdHMgKi8KKwkJcHJpdi0+bHNyICY9IH5VQVJUX0xTUl9CUktfRVJST1JfQklUUzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhdHVzX2xvY2ssIGZsYWdzKTsKKworCQlpZiAodW5saWtlbHkobHNyICYgVUFSVF9MU1JfQkkpKQorCQkJZmxhZyA9IFRUWV9CUkVBSzsKKwkJZWxzZSBpZiAodW5saWtlbHkobHNyICYgVUFSVF9MU1JfUEUpKQorCQkJZmxhZyA9IFRUWV9QQVJJVFk7CisJCWVsc2UgaWYgKHVubGlrZWx5KGxzciAmIFVBUlRfTFNSX0ZFKSkKKwkJCWZsYWcgPSBUVFlfRlJBTUU7CisJCWVsc2UKKwkJCWZsYWcgPSBUVFlfTk9STUFMOworCisJCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnQtPnBvcnQpOworCQlpZiAodHR5KSB7CisJCQl0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIHVyYi0+YWN0dWFsX2xlbmd0aCArIDEpOworCQkJLyogb3ZlcnJ1biBpcyBzcGVjaWFsLCBub3QgYXNzb2NpYXRlZCB3aXRoIGEgY2hhciAqLworCQkJaWYgKHVubGlrZWx5KGxzciAmIFVBUlRfTFNSX09FKSkKKwkJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIDAsIFRUWV9PVkVSUlVOKTsKKwkJCXNlbmRfdG9fdHR5KHR0eSwgZGF0YSwgdXJiLT5hY3R1YWxfbGVuZ3RoLCBmbGFnKTsKKwkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CisJCQl0dHlfa3JlZl9wdXQodHR5KTsKKwkJfQorCisJCS8qIFRocm90dGxlIHRoZSBkZXZpY2UgaWYgcmVxdWVzdGVkIGJ5IHR0eSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCQlwb3J0LT50aHJvdHRsZWQgPSBwb3J0LT50aHJvdHRsZV9yZXE7CisJCWlmIChwb3J0LT50aHJvdHRsZWQpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJfQorCS8qIENvbnRpbnVlIHJlYWRpbmcgZnJvbSBkZXZpY2UgKi8KKwlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCWlmIChyZXN1bHQpCisJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsICIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmciCisJCQkiIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBhcmszMTE2X2RyaXZlciA9IHsKQEAgLTQ1MCwxMSArNzc1LDE3IEBACiAJLnVzYl9kcml2ZXIgPQkJJmFyazMxMTZfZHJpdmVyLAogCS5udW1fcG9ydHMgPQkJMSwKIAkuYXR0YWNoID0JCWFyazMxMTZfYXR0YWNoLAorCS5yZWxlYXNlID0JCWFyazMxMTZfcmVsZWFzZSwKIAkuc2V0X3Rlcm1pb3MgPQkJYXJrMzExNl9zZXRfdGVybWlvcywKIAkuaW5pdF90ZXJtaW9zID0JCWFyazMxMTZfaW5pdF90ZXJtaW9zLAogCS5pb2N0bCA9CQlhcmszMTE2X2lvY3RsLAogCS50aW9jbWdldCA9CQlhcmszMTE2X3Rpb2NtZ2V0LAorCS50aW9jbXNldCA9CQlhcmszMTE2X3Rpb2Ntc2V0LAogCS5vcGVuID0JCQlhcmszMTE2X29wZW4sCisJLmNsb3NlID0JCWFyazMxMTZfY2xvc2UsCisJLmJyZWFrX2N0bCA9IAkJYXJrMzExNl9icmVha19jdGwsCisJLnJlYWRfaW50X2NhbGxiYWNrID0gCWFyazMxMTZfcmVhZF9pbnRfY2FsbGJhY2ssCisJLnJlYWRfYnVsa19jYWxsYmFjayA9CWFyazMxMTZfcmVhZF9idWxrX2NhbGxiYWNrLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgYXJrMzExNl9pbml0KHZvaWQpCkBAIC00NjUsNyArNzk2LDEyIEBACiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAlyZXR2YWwgPSB1c2JfcmVnaXN0ZXIoJmFyazMxMTZfZHJpdmVyKTsKLQlpZiAocmV0dmFsKQorCWlmIChyZXR2YWwgPT0gMCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczoiCisJCSAgICAgICBEUklWRVJfVkVSU0lPTiAiOiIKKwkJICAgICAgIERSSVZFUl9ERVNDICJcbiIsCisJCSAgICAgICBLQlVJTERfTU9ETkFNRSk7CisJfSBlbHNlCiAJCXVzYl9zZXJpYWxfZGVyZWdpc3RlcigmYXJrMzExNl9kZXZpY2UpOwogCXJldHVybiByZXR2YWw7CiB9CkBAIC00ODAsNiArODE2LDEwOSBAQAogbW9kdWxlX2V4aXQoYXJrMzExNl9leGl0KTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotbW9kdWxlX3BhcmFtKGRlYnVnLCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7Ci1NT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgZW5hYmxlZCBvciBub3QiKTsKK01PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOwogCittb2R1bGVfcGFyYW0oZGVidWcsIGJvb2wsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJFbmFibGUgZGVidWciKTsKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZGVzY3JpYmVzIHdoYXQgSSBsZWFybmVkIGZyb20gc3R1ZHlpbmcgdGhlIG9sZAorICogYXJrMzExNi5jIGRyaXZlciwgZGlzYXNzZW1ibGluZyB0aGUgd2luZG93cyBkcml2ZXIsIGFuZCBzb21lIGx1Y2t5CisgKiBndWVzc2VzLiBTaW5jZSBJIGRvIG5vdCBoYXZlIGFueSBkYXRhc2hlZXQgb3Igb3RoZXIKKyAqIGRvY3VtZW50YXRpb24sIGluYWNjdXJhY2llcyBhcmUgYWxtb3N0IGd1YXJhbnRlZWQuCisgKgorICogU29tZSBzcGVjcyBmb3IgdGhlIEFSSzMxMTYgY2FuIGJlIGZvdW5kIGhlcmU6CisgKiBodHRwOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDA2MDMxODAwMDQzOC8KKyAqICAgd3d3LmFya21pY3JvLmNvbS9lbi9wcm9kdWN0cy92aWV3LnBocD9pZD0xMAorICogT24gdGhhdCBwYWdlLCAyIEdQSU8gcGlucyBhcmUgbWVudGlvbmVkOiBJIGFzc3VtZSB0aGVzZSBhcmUgdGhlCisgKiBPVVQxIGFuZCBPVVQyIHBpbnMgb2YgdGhlIFVBUlQsIHNvIEkgYWRkZWQgc3VwcG9ydCBmb3IgdGhvc2UKKyAqIHRocm91Z2ggdGhlIE1DUi4gU2luY2UgdGhlIHBpbnMgYXJlIG5vdCBhdmFpbGFibGUgb24gbXkgaGFyZHdhcmUsCisgKiBJIGNvdWxkIG5vdCB2ZXJpZnkgdGhpcy4KKyAqIEFsc28sIGl0IHN0YXRlcyB0aGVyZSBpcyAib24tY2hpcCBoYXJkd2FyZSBmbG93IGNvbnRyb2wiLiBJIGhhdmUKKyAqIGRpc2NvdmVyZWQgaG93IHRvIGVuYWJsZSB0aGF0LiBVbmZvcnR1bmF0ZWx5LCBJIGRvIG5vdCBrbm93IGhvdyB0bworICogZW5hYmxlIFhPTi9YT0ZGIChzb2Z0d2FyZSkgZmxvdyBjb250cm9sLCB3aGljaCB3b3VsZCBuZWVkIHN1cHBvcnQKKyAqIGZyb20gdGhlIGNoaXAgYXMgd2VsbCB0byB3b3JrLiBCZWNhdXNlIG9mIHRoZSB3b3JkaW5nIG9uIHRoZSB3ZWIKKyAqIHBhZ2UgdGhlcmUgaXMgYSByZWFsIHBvc3NpYmlsaXR5IHRoZSBjaGlwIHNpbXBseSBkb2VzIG5vdCBzdXBwb3J0CisgKiBzb2Z0d2FyZSBmbG93IGNvbnRyb2wuCisgKgorICogSSBnb3QgbXkgYXJrMzExNiBhcyBwYXJ0IG9mIGEgbW9iaWxlIHBob25lIGFkYXB0ZXIgY2FibGUuIE9uIHRoZQorICogUENCLCB0aGUgZm9sbG93aW5nIG51bWJlcmVkIGNvbnRhY3RzIGFyZSBwcmVzZW50OgorICoKKyAqICAxOi0gKzVWCisgKiAgMjpvIERUUgorICogIDM6aSBSWAorICogIDQ6aSBEQ0QKKyAqICA1Om8gUlRTCisgKiAgNjpvIFRYCisgKiAgNzppIFJJCisgKiAgODppIERTUgorICogMTA6LSAwVgorICogMTE6aSBDVFMKKyAqCisgKiBPbiBteSBjaGlwLCBhbGwgc2lnbmFscyBzZWVtIHRvIGJlIDMuM1YsIGJ1dCA1ViB0b2xlcmFudC4gQnV0IHRoYXQKKyAqIG1heSBiZSBkaWZmZXJlbnQgZm9yIHRoZSBvbmUgeW91IGhhdmUgOy0pLgorICoKKyAqIFRoZSB3aW5kb3dzIGRyaXZlciBsaW1pdHMgdGhlIHJlZ2lzdGVycyB0byAwLUYsIHNvIEkgYXNzdW1lIHRoZXJlCisgKiBhcmUgYWN0dWFsbHkgMTYgcHJlc2VudCBvbiB0aGUgZGV2aWNlLgorICoKKyAqIE9uIGFuIFVBUlQgaW50ZXJydXB0LCA0IGJ5dGVzIG9mIGRhdGEgY29tZSBpbiBvbiB0aGUgaW50ZXJydXB0CisgKiBlbmRwb2ludC4gVGhlIGJ5dGVzIGFyZSAweGU4IElJUiBMU1IgTVNSLgorICoKKyAqIFRoZSBiYXVkcmF0ZSBzZWVtcyB0byBiZSBnZW5lcmF0ZWQgZnJvbSB0aGUgMTJNSHogY3J5c3RhbCwgdXNpbmcKKyAqIDQtdGltZXMgc3Vic2FtcGxpbmcuIFNvIHF1b3Q9MTJlNi8oNCpiYXVkKS4gQWxzbyBzZWUgZGVzY3JpcHRpb24KKyAqIG9mIHJlZ2lzdGVyIEUuCisgKgorICogUmVnaXN0ZXJzIDAtNzoKKyAqIFRoZXNlIHNlZW0gdG8gYmUgdGhlIHNhbWUgYXMgZm9yIGEgcmVndWxhciAxNjQ1MC4gVGhlIEZDUiBpcyBzZXQKKyAqIHRvIFVBUlRfRkNSX0RNQV9TRUxFQ1QgKDB4OCksIEkgZ3Vlc3MgdG8gZW5hYmxlIHRyYW5zZmVycyBiZXR3ZWVuCisgKiB0aGUgVUFSVCBhbmQgdGhlIFVTQiBicmlkZ2UvRE1BIGVuZ2luZS4KKyAqCisgKiBSZWdpc3RlciA4OgorICogQnkgdHJpYWwgYW5kIGVycm9yLCBJIGZvdW5kIG91dCB0aGF0IGJpdCAwIGVuYWJsZXMgaGFyZHdhcmUgQ1RTLAorICogc3RvcHBpbmcgVFggd2hlbiBDVFMgaXMgKzVWLiBCaXQgMSBkb2VzIHRoZSBzYW1lIGZvciBSVFMsIG1ha2luZworICogUlRTICs1ViB3aGVuIHRoZSAzMTE2IGNhbm5vdCB0cmFuc2ZlciB0aGUgZGF0YSB0byB0aGUgVVNCIGJ1cworICogKHZlcmlmaWVkIGJ5IGRpc2FibGluZyB0aGUgcmVhZGluZyBVUkIpLiBOb3RlIHRoYXQgYXMgZmFyIGFzIEkgY2FuCisgKiB0ZWxsLCB0aGUgd2luZG93cyBkcml2ZXIgZG9lcyBOT1QgdXNlIHRoaXMsIHNvIHRoZXJlIG1pZ2h0IGJlIHNvbWUKKyAqIGhhcmR3YXJlIGJ1ZyBvciBzb21ldGhpbmcuCisgKgorICogQWNjb3JkaW5nIHRvIGEgcGF0Y2ggcHJvdmlkZWQgaGVyZQorICogKGh0dHA6Ly9sa21sLm9yZy9sa21sLzIwMDkvNy8yNi81NiksIHRoZSBBUkszMTE2IGNhbiBhbHNvIGJlIHVzZWQKKyAqIGFzIGFuIElyREEgZG9uZ2xlLiBTaW5jZSBJIGRvIG5vdCBoYXZlIHN1Y2ggYSB0aGluZywgSSBjb3VsZCBub3QKKyAqIGludmVzdGlnYXRlIHRoYXQgYXNwZWN0LiBIb3dldmVyLCBJIGNhbiBzcGVjdWxhdGUgOy0pLgorICoKKyAqIC0gSXJEQSBlbmNvZGVzIGRhdGEgZGlmZmVyZW50bHkgdGhhbiBSUzIzMi4gTW9zdCBsaWtlbHksIG9uZSBvZgorICogICB0aGUgYml0cyBpbiByZWdpc3RlcnMgOS4uRSBlbmFibGVzIHRoZSBJUiBFTkRFQyAoZW5jb2Rlci9kZWNvZGVyKS4KKyAqIC0gRGVwZW5kaW5nIG9uIHRoZSBJUiB0cmFuc2NlaXZlciwgdGhlIGlucHV0IGFuZCBvdXRwdXQgbmVlZCB0byBiZQorICogICBpbnZlcnRlZCwgc28gdGhlcmUgYXJlIHByb2JhYmx5IGJpdHMgZm9yIHRoYXQgYXMgd2VsbC4KKyAqIC0gSXJEQSBpcyBoYWxmLWR1cGxleCwgc28gdGhlcmUgc2hvdWxkIGJlIGEgYml0IGZvciBzZWxlY3RpbmcgdGhhdC4KKyAqCisgKiBUaGlzIHN0aWxsIGxlYXZlcyBhdCBsZWFzdCB0d28gcmVnaXN0ZXJzIHVuYWNjb3VudGVkIGZvci4gUGVyaGFwcworICogVGhlIGNoaXAgY2FuIGRvIFhPTi9YT0ZGIG9yIENSQyBpbiBIVz8KKyAqCisgKiBSZWdpc3RlciA5OgorICogU2V0IHRvIDB4MDAgZm9yIElyREEsIHdoZW4gdGhlIGJhdWRyYXRlIGlzIGluaXRpYWxpc2VkLgorICoKKyAqIFJlZ2lzdGVyIEE6CisgKiBTZXQgdG8gMHgwMSBmb3IgSXJEQSwgYXQgaW5pdC4KKyAqCisgKiBSZWdpc3RlciBCOgorICogU2V0IHRvIDB4MDEgZm9yIElyREEsIDB4MDAgZm9yIFJTMjMyLCBhdCBpbml0LgorICoKKyAqIFJlZ2lzdGVyIEM6CisgKiBTZXQgdG8gMDAgZm9yIElyREEsIGF0IGluaXQuCisgKgorICogUmVnaXN0ZXIgRDoKKyAqIFNldCB0byAweDQxIGZvciBJckRBLCBhdCBpbml0LgorICoKKyAqIFJlZ2lzdGVyIEU6CisgKiBTb21la2luZCBvZiBiYXVkcmF0ZSBvdmVycmlkZS4gVGhlIHdpbmRvd3MgZHJpdmVyIHNlZW1zIHRvIHNldAorICogdGhpcyB0byAweDAwIGZvciBub3JtYWwgYmF1ZHJhdGVzLCAweDAxIGZvciA0NjA4MDAsIDB4MDIgZm9yIDkyMTYwMC4KKyAqIFNpbmNlIDQ2MDgwMCBhbmQgOTIxNjAwIGNhbm5vdCBiZSBvYnRhaW5lZCBieSBkaXZpZGluZyAzTUh6IGJ5IGFuIGludGVnZXIsCisgKiBpdCBjb3VsZCBiZSBzb21la2luZCBvZiBzdWJkaXZpc29yIHRoaW5neS4KKyAqIEhvd2V2ZXIsaXQgZG9lcyBub3Qgc2VlbSB0byBkbyBhbnl0aGluZzogc2VsZWN0aW5nIDkyMTYwMCAoZGl2aXNvciAzLAorICogcmVnIEU9MiksIHN0aWxsIGdldHMgMSBNSHouIEkgYWxzbyBjaGVja2VkIGlmIHJlZ2lzdGVycyA5LCBDIG9yIEYgd291bGQKKyAqIHdvcmssIGJ1dCB0aGV5IGRvbid0LgorICoKKyAqIFJlZ2lzdGVyIEY6IHVua25vd24KKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYwppbmRleCBlYmNjNmQwLi5mOTk0OThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYwpAQCAtNTk4LDYgKzU5OCwyMCBAQAogCXsgVVNCX0RFVklDRShCQU5EQl9WSUQsIEJBTkRCX1VTT1RMNF9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEJBTkRCX1ZJRCwgQkFOREJfVVNUTDRfUElEKSB9LAogCXsgVVNCX0RFVklDRShCQU5EQl9WSUQsIEJBTkRCX1VTTzlNTDJfUElEKSB9LAorCXsgVVNCX0RFVklDRShCQU5EQl9WSUQsIEJBTkRCX1VTT1BUTDRfUElEKSB9LAorCXsgVVNCX0RFVklDRShCQU5EQl9WSUQsIEJBTkRCX1VTUFRMNF9QSUQpIH0sCisJeyBVU0JfREVWSUNFKEJBTkRCX1ZJRCwgQkFOREJfVVNPOU1MMkRSXzJfUElEKSB9LAorCXsgVVNCX0RFVklDRShCQU5EQl9WSUQsIEJBTkRCX1VTTzlNTDJEUl9QSUQpIH0sCisJeyBVU0JfREVWSUNFKEJBTkRCX1ZJRCwgQkFOREJfVVNPUFRMNERSMl9QSUQpIH0sCisJeyBVU0JfREVWSUNFKEJBTkRCX1ZJRCwgQkFOREJfVVNPUFRMNERSX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoQkFOREJfVklELCBCQU5EQl80ODVVU0I5Rl8yV19QSUQpIH0sCisJeyBVU0JfREVWSUNFKEJBTkRCX1ZJRCwgQkFOREJfNDg1VVNCOUZfNFdfUElEKSB9LAorCXsgVVNCX0RFVklDRShCQU5EQl9WSUQsIEJBTkRCXzIzMlVTQjlNX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoQkFOREJfVklELCBCQU5EQl80ODVVU0JUQl8yV19QSUQpIH0sCisJeyBVU0JfREVWSUNFKEJBTkRCX1ZJRCwgQkFOREJfNDg1VVNCVEJfNFdfUElEKSB9LAorCXsgVVNCX0RFVklDRShCQU5EQl9WSUQsIEJBTkRCX1RUTDVVU0I5TV9QSUQpIH0sCisJeyBVU0JfREVWSUNFKEJBTkRCX1ZJRCwgQkFOREJfVFRMM1VTQjlNX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoQkFOREJfVklELCBCQU5EQl9aWl9QUk9HMV9VU0JfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRVZFUl9FQ09fUFJPX0NEUykgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfNE5fR0FMQVhZX0RFXzFfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV80Tl9HQUxBWFlfREVfMl9QSUQpIH0sCkBAIC0yMTk1LDE1ICsyMjA5LDIxIEBACiAKIAkvKiBTZXQgbnVtYmVyIG9mIGRhdGEgYml0cywgcGFyaXR5LCBzdG9wIGJpdHMgKi8KIAotCXRlcm1pb3MtPmNfY2ZsYWcgJj0gfkNNU1BBUjsKLQogCXVyYl92YWx1ZSA9IDA7CiAJdXJiX3ZhbHVlIHw9IChjZmxhZyAmIENTVE9QQiA/IEZURElfU0lPX1NFVF9EQVRBX1NUT1BfQklUU18yIDoKIAkJICAgICAgRlRESV9TSU9fU0VUX0RBVEFfU1RPUF9CSVRTXzEpOwotCXVyYl92YWx1ZSB8PSAoY2ZsYWcgJiBQQVJFTkIgPwotCQkgICAgICAoY2ZsYWcgJiBQQVJPREQgPyBGVERJX1NJT19TRVRfREFUQV9QQVJJVFlfT0REIDoKLQkJICAgICAgIEZURElfU0lPX1NFVF9EQVRBX1BBUklUWV9FVkVOKSA6Ci0JCSAgICAgIEZURElfU0lPX1NFVF9EQVRBX1BBUklUWV9OT05FKTsKKwlpZiAoY2ZsYWcgJiBQQVJFTkIpIHsKKwkJaWYgKGNmbGFnICYgQ01TUEFSKQorCQkJdXJiX3ZhbHVlIHw9IGNmbGFnICYgUEFST0REID8KKwkJCQkgICAgIEZURElfU0lPX1NFVF9EQVRBX1BBUklUWV9NQVJLIDoKKwkJCQkgICAgIEZURElfU0lPX1NFVF9EQVRBX1BBUklUWV9TUEFDRTsKKwkJZWxzZQorCQkJdXJiX3ZhbHVlIHw9IGNmbGFnICYgUEFST0REID8KKwkJCQkgICAgIEZURElfU0lPX1NFVF9EQVRBX1BBUklUWV9PREQgOgorCQkJCSAgICAgRlRESV9TSU9fU0VUX0RBVEFfUEFSSVRZX0VWRU47CisJfSBlbHNlIHsKKwkJdXJiX3ZhbHVlIHw9IEZURElfU0lPX1NFVF9EQVRBX1BBUklUWV9OT05FOworCX0KIAlpZiAoY2ZsYWcgJiBDU0laRSkgewogCQlzd2l0Y2ggKGNmbGFnICYgQ1NJWkUpIHsKIAkJY2FzZSBDUzU6IHVyYl92YWx1ZSB8PSA1OyBkYmcoIlNldHRpbmcgQ1M1Iik7IGJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmggYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uaAppbmRleCA2ZjMxZTBkLi40NTg2YTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uaAorKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uaApAQCAtNjYyLDYgKzY2MiwyMCBAQAogI2RlZmluZSBCQU5EQl9VU09UTDRfUElECTB4QUMwMQkvKiBVU09UTDQgSXNvbGF0ZWQgUlMtNDg1IENvbnZlcnRlciAqLwogI2RlZmluZSBCQU5EQl9VU1RMNF9QSUQJCTB4QUMwMgkvKiBVU1RMNCBSUy00ODUgQ29udmVydGVyICovCiAjZGVmaW5lIEJBTkRCX1VTTzlNTDJfUElECTB4QUMwMwkvKiBVU085TUwyIElzb2xhdGVkIFJTLTIzMiBDb252ZXJ0ZXIgKi8KKyNkZWZpbmUgQkFOREJfVVNPUFRMNF9QSUQJMHhBQzExCisjZGVmaW5lIEJBTkRCX1VTUFRMNF9QSUQJMHhBQzEyCisjZGVmaW5lIEJBTkRCX1VTTzlNTDJEUl8yX1BJRAkweEFDMTYKKyNkZWZpbmUgQkFOREJfVVNPOU1MMkRSX1BJRAkweEFDMTcKKyNkZWZpbmUgQkFOREJfVVNPUFRMNERSMl9QSUQJMHhBQzE4CS8qIFVTT1BUTDRSLTIgMi1wb3J0IElzb2xhdGVkIFJTLTIzMiBDb252ZXJ0ZXIgKi8KKyNkZWZpbmUgQkFOREJfVVNPUFRMNERSX1BJRAkweEFDMTkKKyNkZWZpbmUgQkFOREJfNDg1VVNCOUZfMldfUElECTB4QUMyNQorI2RlZmluZSBCQU5EQl80ODVVU0I5Rl80V19QSUQJMHhBQzI2CisjZGVmaW5lIEJBTkRCXzIzMlVTQjlNX1BJRAkweEFDMjcKKyNkZWZpbmUgQkFOREJfNDg1VVNCVEJfMldfUElECTB4QUMzMworI2RlZmluZSBCQU5EQl80ODVVU0JUQl80V19QSUQJMHhBQzM0CisjZGVmaW5lIEJBTkRCX1RUTDVVU0I5TV9QSUQJMHhBQzQ5CisjZGVmaW5lIEJBTkRCX1RUTDNVU0I5TV9QSUQJMHhBQzUwCisjZGVmaW5lIEJBTkRCX1paX1BST0cxX1VTQl9QSUQJMHhCQTAyCiAKIC8qCiAgKiBSTSBNaWNoYWVsaWRlcyBDQU52aWV3IFVTQiAoaHR0cDovL3d3dy5ybWNhbi5jb20pCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL21vczc4NDAuYwppbmRleCBmMTFhYmY1Li40ODVmYTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMKQEAgLTEyMSw4ICsxMjEsMTQgQEAKICAqIG1vc2NoaXBfaWRfdGFibGVfY29tYmluZWQKICAqLwogI2RlZmluZSBVU0JfVkVORE9SX0lEX0JBTkRCICAgICAgICAgICAgIDB4MDg1NgotI2RlZmluZSBCQU5EQl9ERVZJQ0VfSURfVVNPUFRMNF80ICAgICAgIDB4QUM0NAorI2RlZmluZSBCQU5EQl9ERVZJQ0VfSURfVVNPOU1MMl8yCTB4QUMyMgorI2RlZmluZSBCQU5EQl9ERVZJQ0VfSURfVVNPOU1MMl80CTB4QUMyNAorI2RlZmluZSBCQU5EQl9ERVZJQ0VfSURfVVM5TUwyXzIJMHhBQzI5CisjZGVmaW5lIEJBTkRCX0RFVklDRV9JRF9VUzlNTDJfNAkweEFDMzAKKyNkZWZpbmUgQkFOREJfREVWSUNFX0lEX1VTUFRMNF8yCTB4QUMzMQorI2RlZmluZSBCQU5EQl9ERVZJQ0VfSURfVVNQVEw0XzQJMHhBQzMyCiAjZGVmaW5lIEJBTkRCX0RFVklDRV9JRF9VU09QVEw0XzIgICAgICAgMHhBQzQyCisjZGVmaW5lIEJBTkRCX0RFVklDRV9JRF9VU09QVEw0XzQgICAgICAgMHhBQzQ0CiAKIC8qIFRoaXMgZHJpdmVyIGFsc28gc3VwcG9ydHMKICAqIEFURU4gVUMyMzI0IGRldmljZSB1c2luZyBNb3NjaGlwIE1DUzc4NDAKQEAgLTE3Nyw4ICsxODMsMTQgQEAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBtb3NjaGlwX3BvcnRfaWRfdGFibGVbXSA9IHsKIAl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01PU0NISVAsIE1PU0NISVBfREVWSUNFX0lEXzc4NDApfSwKIAl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01PU0NISVAsIE1PU0NISVBfREVWSUNFX0lEXzc4MjApfSwKLQl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0JBTkRCLCBCQU5EQl9ERVZJQ0VfSURfVVNPUFRMNF80KX0sCisJe1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9CQU5EQiwgQkFOREJfREVWSUNFX0lEX1VTTzlNTDJfMil9LAorCXtVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQkFOREIsIEJBTkRCX0RFVklDRV9JRF9VU085TUwyXzQpfSwKKwl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0JBTkRCLCBCQU5EQl9ERVZJQ0VfSURfVVM5TUwyXzIpfSwKKwl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0JBTkRCLCBCQU5EQl9ERVZJQ0VfSURfVVM5TUwyXzQpfSwKKwl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0JBTkRCLCBCQU5EQl9ERVZJQ0VfSURfVVNQVEw0XzIpfSwKKwl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0JBTkRCLCBCQU5EQl9ERVZJQ0VfSURfVVNQVEw0XzQpfSwKIAl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0JBTkRCLCBCQU5EQl9ERVZJQ0VfSURfVVNPUFRMNF8yKX0sCisJe1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9CQU5EQiwgQkFOREJfREVWSUNFX0lEX1VTT1BUTDRfNCl9LAogCXtVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVRFTklOVEwsIEFURU5JTlRMX0RFVklDRV9JRF9VQzIzMjQpfSwKIAl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FURU5JTlRMLCBBVEVOSU5UTF9ERVZJQ0VfSURfVUMyMzIyKX0sCiAJe30JCQkvKiB0ZXJtaW5hdGluZyBlbnRyeSAqLwpAQCAtMTg3LDggKzE5OSwxNCBAQAogc3RhdGljIF9fZGV2aW5pdGRhdGEgc3RydWN0IHVzYl9kZXZpY2VfaWQgbW9zY2hpcF9pZF90YWJsZV9jb21iaW5lZFtdID0gewogCXtVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTU9TQ0hJUCwgTU9TQ0hJUF9ERVZJQ0VfSURfNzg0MCl9LAogCXtVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTU9TQ0hJUCwgTU9TQ0hJUF9ERVZJQ0VfSURfNzgyMCl9LAotCXtVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQkFOREIsIEJBTkRCX0RFVklDRV9JRF9VU09QVEw0XzQpfSwKKwl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0JBTkRCLCBCQU5EQl9ERVZJQ0VfSURfVVNPOU1MMl8yKX0sCisJe1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9CQU5EQiwgQkFOREJfREVWSUNFX0lEX1VTTzlNTDJfNCl9LAorCXtVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQkFOREIsIEJBTkRCX0RFVklDRV9JRF9VUzlNTDJfMil9LAorCXtVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQkFOREIsIEJBTkRCX0RFVklDRV9JRF9VUzlNTDJfNCl9LAorCXtVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQkFOREIsIEJBTkRCX0RFVklDRV9JRF9VU1BUTDRfMil9LAorCXtVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQkFOREIsIEJBTkRCX0RFVklDRV9JRF9VU1BUTDRfNCl9LAogCXtVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQkFOREIsIEJBTkRCX0RFVklDRV9JRF9VU09QVEw0XzIpfSwKKwl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0JBTkRCLCBCQU5EQl9ERVZJQ0VfSURfVVNPUFRMNF80KX0sCiAJe1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BVEVOSU5UTCwgQVRFTklOVExfREVWSUNFX0lEX1VDMjMyNCl9LAogCXtVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVRFTklOVEwsIEFURU5JTlRMX0RFVklDRV9JRF9VQzIzMjIpfSwKIAl7fQkJCS8qIHRlcm1pbmF0aW5nIGVudHJ5ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aWNvbi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL29wdGljb24uYwppbmRleCA4MGY1OWI2Li40Y2RiOTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aWNvbi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpY29uLmMKQEAgLTUwMSwxMiArNTAxLDEzIEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHNlcmlhbC0+cG9ydFswXTsKIAlpbnQgcmVzdWx0OwogCi0JbXV0ZXhfbG9jaygmcG9ydC0+bXV0ZXgpOwotCWlmIChwb3J0LT5wb3J0LmNvdW50KQorCW11dGV4X2xvY2soJnBvcnQtPnBvcnQubXV0ZXgpOworCS8qIFRoaXMgaXMgcHJvdGVjdGVkIGJ5IHRoZSBwb3J0IG11dGV4IGFnYWluc3QgY2xvc2Uvb3BlbiAqLworCWlmICh0ZXN0X2JpdChBU1lOQ0JfSU5JVElBTElaRUQsICZwb3J0LT5wb3J0LmZsYWdzKSkKIAkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocHJpdi0+YnVsa19yZWFkX3VyYiwgR0ZQX05PSU8pOwogCWVsc2UKIAkJcmVzdWx0ID0gMDsKLQltdXRleF91bmxvY2soJnBvcnQtPm11dGV4KTsKKwltdXRleF91bmxvY2soJnBvcnQtPnBvcnQubXV0ZXgpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYwppbmRleCAwNTc3ZTRiLi45YTJiOTAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCkBAIC01ODAsMTIgKzU4MCw0OCBAQAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMDg2LCAweGZmLCAweGZmLCAweGZmKSB9LAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgyMDAyLCAweGZmLCAweGZmLCAweGZmKSB9LAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgyMDAzLCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTA0LCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTA2LCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTA4LCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTEzLCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTE3LCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTE4LCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTIxLCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTIyLCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTIzLCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTI0LCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTI1LCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTI2LCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTI4LCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTQyLCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTQzLCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTQ0LCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTQ1LCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTQ2LCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTQ3LCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTQ4LCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTQ5LCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTUwLCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTUxLCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTUyLCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTUzLCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTU0LCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTU1LCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTU2LCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTU3LCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTU4LCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTU5LCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTYwLCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTYxLCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTYyLCAweGZmLCAweGZmLCAweGZmKSB9LAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMDE0LCAweGZmLCAweGZmLCAweGZmKSB9LCAvKiBaVEUgQ0RNQSBwcm9kdWN0cyAqLwogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMDI3LCAweGZmLCAweGZmLCAweGZmKSB9LAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMDU5LCAweGZmLCAweGZmLCAweGZmKSB9LAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMDYwLCAweGZmLCAweGZmLCAweGZmKSB9LAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMDcwLCAweGZmLCAweGZmLCAweGZmKSB9LAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMDczLCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTMwLCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMTQxLCAweGZmLCAweGZmLCAweGZmKSB9LAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgWlRFX1BST0RVQ1RfQ0RNQV9URUNILCAweGZmLCAweGZmLCAweGZmKSB9LAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgWlRFX1BST0RVQ1RfQUM4NzEwLCAweGZmLCAweGZmLCAweGZmKSB9LAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgWlRFX1BST0RVQ1RfQUMyNzI2LCAweGZmLCAweGZmLCAweGZmKSB9LApAQCAtNTk5LDYgKzYzNSw3IEBACiAJeyBVU0JfREVWSUNFKFRPU0hJQkFfVkVORE9SX0lELCBUT1NISUJBX1BST0RVQ1RfRzQ1MCkgfSwKIAl7IFVTQl9ERVZJQ0UoVE9TSElCQV9WRU5ET1JfSUQsIFRPU0hJQkFfUFJPRFVDVF9IU0RQQV9NSU5JQ0FSRCApIH0sIC8qIFRvc2hpYmEgM0cgSFNEUEEgPT0gTm92YXRlbCBFeHBlZGl0ZSBFVTg3MEQgTWluaUNhcmQgKi8KIAl7IFVTQl9ERVZJQ0UoQUxJTktfVkVORE9SX0lELCAweDkwMDApIH0sCisJeyBVU0JfREVWSUNFKEFMSU5LX1ZFTkRPUl9JRCwgMHhjZTE2KSB9LAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oQUxJTktfVkVORE9SX0lELCBBTElOS19QUk9EVUNUXzNHVSwgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0UoQUxDQVRFTF9WRU5ET1JfSUQsIEFMQ0FURUxfUFJPRFVDVF9YMDYwUykgfSwKIAl7IFVTQl9ERVZJQ0UoQUlSUExVU19WRU5ET1JfSUQsIEFJUlBMVVNfUFJPRFVDVF9NQ0Q2NTApIH0sCkBAIC0xMzEyLDcgKzEzNDksNyBAQAogCiAJZGJnKCIlcyBlbnRlcmVkIiwgX19mdW5jX18pOwogCi0JaWYgKHNlcmlhbC0+ZGV2LT5hdXRvX3BtKSB7CisJaWYgKG1lc3NhZ2UuZXZlbnQgJiBQTV9FVkVOVF9BVVRPKSB7CiAJCXNwaW5fbG9ja19pcnEoJmludGZkYXRhLT5zdXNwX2xvY2spOwogCQliID0gaW50ZmRhdGEtPmluX2ZsaWdodDsKIAkJc3Bpbl91bmxvY2tfaXJxKCZpbnRmZGF0YS0+c3VzcF9sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9zaWVycmEuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9zaWVycmEuYwppbmRleCA1MDE5MzI1Li5hYzFiNjQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvc2llcnJhLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3NpZXJyYS5jCkBAIC0xNiw4ICsxNiw5IEBACiAgIFBvcnRpb25zIGJhc2VkIG9uIHRoZSBvcHRpb24gZHJpdmVyIGJ5IE1hdHRoaWFzIFVybGljaHMgPHNtdXJmQHNtdXJmLm5vcmlzLmRlPgogICBXaG9tIGJhc2VkIGhpcyBvbiB0aGUgS2V5c3BhbiBkcml2ZXIgYnkgSHVnaCBCbGVtaW5ncyA8aHVnaEBibGVtaW5ncy5vcmc+CiAqLwotCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2LjEuMy44IgorLyogVW5jb21tZW50IHRvIGxvZyBmdW5jdGlvbiBjYWxscyAqLworLyogI2RlZmluZSBERUJVRyAqLworI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidi4xLjcuMTYiCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IgIktldmluIExsb3lkLCBFbGluYSBQYXNoZXZhLCBNYXR0aGV3IFNhZmFyLCBSb3J5IEZpbGVyIgogI2RlZmluZSBEUklWRVJfREVTQyAiVVNCIERyaXZlciBmb3IgU2llcnJhIFdpcmVsZXNzIFVTQiBtb2RlbXMiCiAKQEAgLTMzLDggKzM0LDEwIEBACiAjZGVmaW5lIFNXSU1TX1VTQl9SRVFVRVNUX1NldFBvd2VyCTB4MDAKICNkZWZpbmUgU1dJTVNfVVNCX1JFUVVFU1RfU2V0Tm1lYQkweDA3CiAKLSNkZWZpbmUgTl9JTl9VUkIJOAotI2RlZmluZSBOX09VVF9VUkIJNjQKKyNkZWZpbmUgTl9JTl9VUkJfSE0JOAorI2RlZmluZSBOX09VVF9VUkJfSE0JNjQKKyNkZWZpbmUgTl9JTl9VUkIJNAorI2RlZmluZSBOX09VVF9VUkIJNAogI2RlZmluZSBJTl9CVUZMRU4JNDA5NgogCiAjZGVmaW5lIE1BWF9UUkFOU0ZFUgkJKFBBR0VfU0laRSAtIDUxMikKQEAgLTEyNCw2ICsxMjcsMjMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBpc19oaW1lbW9yeShjb25zdCB1OCBpZm51bSwKKwkJCQljb25zdCBzdHJ1Y3Qgc2llcnJhX2lmYWNlX2luZm8gKmhpbWVtb3J5bGlzdCkKK3sKKwljb25zdCB1OCAgKmluZm87CisJaW50IGk7CisKKwlpZiAoaGltZW1vcnlsaXN0KSB7CisJCWluZm8gPSBoaW1lbW9yeWxpc3QtPmlmYWNlaW5mbzsKKworCQlmb3IgKGk9MDsgaSA8IGhpbWVtb3J5bGlzdC0+aW5mb2xlbjsgaSsrKSB7CisJCQlpZiAoaW5mb1tpXSA9PSBpZm51bSkKKwkJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBzaWVycmFfY2FsY19pbnRlcmZhY2Uoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKIHsKIAlpbnQgaW50ZXJmYWNlOwpAQCAtMTg2LDYgKzIwNiwyMCBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKKy8qIGludGVyZmFjZXMgd2l0aCBoaWdoZXIgbWVtb3J5IHJlcXVpcmVtZW50cyAqLworc3RhdGljIGNvbnN0IHU4IGhpX21lbW9yeV90eXBlQV9pZmFjZXNbXSA9IHsgMCwgMiB9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBzaWVycmFfaWZhY2VfaW5mbyB0eXBlQV9pbnRlcmZhY2VfbGlzdCA9IHsKKwkuaW5mb2xlbiA9IEFSUkFZX1NJWkUoaGlfbWVtb3J5X3R5cGVBX2lmYWNlcyksCisJLmlmYWNlaW5mbyA9IGhpX21lbW9yeV90eXBlQV9pZmFjZXMsCit9OworCitzdGF0aWMgY29uc3QgdTggaGlfbWVtb3J5X3R5cGVCX2lmYWNlc1tdID0geyAzLCA0LCA1LCA2IH07CitzdGF0aWMgY29uc3Qgc3RydWN0IHNpZXJyYV9pZmFjZV9pbmZvIHR5cGVCX2ludGVyZmFjZV9saXN0ID0geworCS5pbmZvbGVuID0gQVJSQVlfU0laRShoaV9tZW1vcnlfdHlwZUJfaWZhY2VzKSwKKwkuaWZhY2VpbmZvID0gaGlfbWVtb3J5X3R5cGVCX2lmYWNlcywKK307CisKKy8qICdibGFja2xpc3QnIG9mIGludGVyZmFjZXMgbm90IHNlcnZlZCBieSB0aGlzIGRyaXZlciAqLwogc3RhdGljIGNvbnN0IHU4IGRpcmVjdF9pcF9ub25fc2VyaWFsX2lmYWNlc1tdID0geyA3LCA4LCA5LCAxMCwgMTEgfTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2llcnJhX2lmYWNlX2luZm8gZGlyZWN0X2lwX2ludGVyZmFjZV9ibGFja2xpc3QgPSB7CiAJLmluZm9sZW4gPSBBUlJBWV9TSVpFKGRpcmVjdF9pcF9ub25fc2VyaWFsX2lmYWNlcyksCkBAIC0yODYsOCArMzIwLDEwIEBACiAJc3RydWN0IHVzYl9hbmNob3IgYWN0aXZlOwogCXN0cnVjdCB1c2JfYW5jaG9yIGRlbGF5ZWQ7CiAKKwlpbnQgbnVtX291dF91cmJzOworCWludCBudW1faW5fdXJiczsKIAkvKiBJbnB1dCBlbmRwb2ludHMgYW5kIGJ1ZmZlcnMgZm9yIHRoaXMgcG9ydCAqLwotCXN0cnVjdCB1cmIgKmluX3VyYnNbTl9JTl9VUkJdOworCXN0cnVjdCB1cmIgKmluX3VyYnNbTl9JTl9VUkJfSE1dOwogCiAJLyogU2V0dGluZ3MgZm9yIHRoZSBwb3J0ICovCiAJaW50IHJ0c19zdGF0ZTsJLyogSGFuZHNoYWtpbmcgcGlucyAob3V0cHV0cykgKi8KQEAgLTQ2MCw3ICs0OTYsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0ZGF0YS0+bG9jaywgZmxhZ3MpOwogCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gb3V0c3RhbmRpbmdfdXJiczogJWRcbiIsIF9fZnVuY19fLAogCQlwb3J0ZGF0YS0+b3V0c3RhbmRpbmdfdXJicyk7Ci0JaWYgKHBvcnRkYXRhLT5vdXRzdGFuZGluZ191cmJzID4gTl9PVVRfVVJCKSB7CisJaWYgKHBvcnRkYXRhLT5vdXRzdGFuZGluZ191cmJzID4gcG9ydGRhdGEtPm51bV9vdXRfdXJicykgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0ZGF0YS0+bG9jaywgZmxhZ3MpOwogCQlkZXZfZGJnKCZwb3J0LT5kZXYsICIlcyAtIHdyaXRlIGxpbWl0IGhpdFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gMDsKQEAgLTY2NSw3ICs3MDEsNyBAQAogCS8qIHRyeSB0byBnaXZlIGEgZ29vZCBudW1iZXIgYmFjayBiYXNlZCBvbiBpZiB3ZSBoYXZlIGFueSBmcmVlIHVyYnMgYXQKIAkgKiB0aGlzIHBvaW50IGluIHRpbWUgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydGRhdGEtPmxvY2ssIGZsYWdzKTsKLQlpZiAocG9ydGRhdGEtPm91dHN0YW5kaW5nX3VyYnMgPiBOX09VVF9VUkIgKiAyIC8gMykgeworCWlmIChwb3J0ZGF0YS0+b3V0c3RhbmRpbmdfdXJicyA+IChwb3J0ZGF0YS0+bnVtX291dF91cmJzICogMikgLyAzKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnRkYXRhLT5sb2NrLCBmbGFncyk7CiAJCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gd3JpdGUgbGltaXQgaGl0XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwpAQCAtNjgwLDcgKzcxNiw3IEBACiAJaW50IGk7CiAJc3RydWN0IHNpZXJyYV9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocG9ydGRhdGEtPmluX3VyYnMpOyBpKyspCisJZm9yIChpID0gMDsgaSA8IHBvcnRkYXRhLT5udW1faW5fdXJiczsgaSsrKQogCQl1c2Jfa2lsbF91cmIocG9ydGRhdGEtPmluX3VyYnNbaV0pOwogCiAJdXNiX2tpbGxfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIpOwpAQCAtNjk1LDcgKzczMSw3IEBACiAJc3RydWN0IHNpZXJyYV9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCiAJb2tfY250ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwb3J0ZGF0YS0+aW5fdXJicyk7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBwb3J0ZGF0YS0+bnVtX2luX3VyYnM7IGkrKykgewogCQl1cmIgPSBwb3J0ZGF0YS0+aW5fdXJic1tpXTsKIAkJaWYgKCF1cmIpCiAJCQljb250aW51ZTsKQEAgLTc5MSw3ICs4MjcsNyBAQAogCQkvKiBTdG9wIHJlYWRpbmcgdXJicyAqLwogCQlzaWVycmFfc3RvcF9yeF91cmJzKHBvcnQpOwogCQkvKiAuLiBhbmQgcmVsZWFzZSB0aGVtICovCi0JCWZvciAoaSA9IDA7IGkgPCBOX0lOX1VSQjsgaSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBwb3J0ZGF0YS0+bnVtX2luX3VyYnM7IGkrKykgewogCQkJc2llcnJhX3JlbGVhc2VfdXJiKHBvcnRkYXRhLT5pbl91cmJzW2ldKTsKIAkJCXBvcnRkYXRhLT5pbl91cmJzW2ldID0gTlVMTDsKIAkJfQpAQCAtODE4LDcgKzg1NCw3IEBACiAKIAogCWVuZHBvaW50ID0gcG9ydC0+YnVsa19pbl9lbmRwb2ludEFkZHJlc3M7Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocG9ydGRhdGEtPmluX3VyYnMpOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgcG9ydGRhdGEtPm51bV9pbl91cmJzOyBpKyspIHsKIAkJdXJiID0gc2llcnJhX3NldHVwX3VyYihzZXJpYWwsIGVuZHBvaW50LCBVU0JfRElSX0lOLCBwb3J0LAogCQkJCQlJTl9CVUZMRU4sIEdGUF9LRVJORUwsCiAJCQkJCXNpZXJyYV9pbmRhdF9jYWxsYmFjayk7CkBAIC04NjksNyArOTA1LDkgQEAKIHsKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0OwogCXN0cnVjdCBzaWVycmFfcG9ydF9wcml2YXRlICpwb3J0ZGF0YTsKKwlzdHJ1Y3Qgc2llcnJhX2lmYWNlX2luZm8gKmhpbWVtb3J5cCA9IE5VTEw7CiAJaW50IGk7CisJdTggaWZudW07CiAKIAlkZXZfZGJnKCZzZXJpYWwtPmRldi0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIApAQCAtODg2LDEzICs5MjQsNDAgQEAKIAkJcG9ydGRhdGEgPSBremFsbG9jKHNpemVvZigqcG9ydGRhdGEpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFwb3J0ZGF0YSkgewogCQkJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXM6IGttYWxsb2MgZm9yICIKLQkJCQkic2llcnJhX3BvcnRfcHJpdmF0ZSAoJWQpIGZhaWxlZCEuXG4iLAorCQkJCSJzaWVycmFfcG9ydF9wcml2YXRlICglZCkgZmFpbGVkIVxuIiwKIAkJCQlfX2Z1bmNfXywgaSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQlzcGluX2xvY2tfaW5pdCgmcG9ydGRhdGEtPmxvY2spOwogCQlpbml0X3VzYl9hbmNob3IoJnBvcnRkYXRhLT5hY3RpdmUpOwogCQlpbml0X3VzYl9hbmNob3IoJnBvcnRkYXRhLT5kZWxheWVkKTsKKwkJaWZudW0gPSBpOworCQkvKiBBc3N1bWUgbG93IG1lbW9yeSByZXF1aXJlbWVudHMgKi8KKwkJcG9ydGRhdGEtPm51bV9vdXRfdXJicyA9IE5fT1VUX1VSQjsKKwkJcG9ydGRhdGEtPm51bV9pbl91cmJzICA9IE5fSU5fVVJCOworCisJCS8qIERldGVybWluZSBhY3R1YWwgbWVtb3J5IHJlcXVpcmVtZW50cyAqLworCQlpZiAoc2VyaWFsLT5udW1fcG9ydHMgPT0gMSkgeworCQkJLyogR2V0IGludGVyZmFjZSBudW1iZXIgZm9yIGNvbXBvc2l0ZSBkZXZpY2UgKi8KKwkJCWlmbnVtID0gc2llcnJhX2NhbGNfaW50ZXJmYWNlKHNlcmlhbCk7CisJCQloaW1lbW9yeXAgPQorCQkJICAgIChzdHJ1Y3Qgc2llcnJhX2lmYWNlX2luZm8gKikmdHlwZUJfaW50ZXJmYWNlX2xpc3Q7CisJCQlpZiAoaXNfaGltZW1vcnkoaWZudW0sIGhpbWVtb3J5cCkpIHsKKwkJCQlwb3J0ZGF0YS0+bnVtX291dF91cmJzID0gTl9PVVRfVVJCX0hNOworCQkJCXBvcnRkYXRhLT5udW1faW5fdXJicyAgPSBOX0lOX1VSQl9ITTsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCWhpbWVtb3J5cCA9CisJCQkgICAgKHN0cnVjdCBzaWVycmFfaWZhY2VfaW5mbyAqKSZ0eXBlQV9pbnRlcmZhY2VfbGlzdDsKKwkJCWlmIChpc19oaW1lbW9yeShpLCBoaW1lbW9yeXApKSB7CisJCQkJcG9ydGRhdGEtPm51bV9vdXRfdXJicyA9IE5fT1VUX1VSQl9ITTsKKwkJCQlwb3J0ZGF0YS0+bnVtX2luX3VyYnMgID0gTl9JTl9VUkJfSE07CisJCQl9CisJCX0KKwkJZGV2X2RiZygmc2VyaWFsLT5kZXYtPmRldiwKKwkJCSJNZW1vcnkgdXNhZ2UgKHVyYnMpIGludGVyZmFjZSAjJWQsIGluPSVkLCBvdXQ9JWRcbiIsCisJCQlpZm51bSxwb3J0ZGF0YS0+bnVtX2luX3VyYnMsIHBvcnRkYXRhLT5udW1fb3V0X3VyYnMgKTsKIAkJLyogU2V0IHRoZSBwb3J0IHByaXZhdGUgZGF0YSBwb2ludGVyICovCiAJCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0LCBwb3J0ZGF0YSk7CiAJfQpAQCAtOTQwLDcgKzEwMDUsNyBAQAogCXN0cnVjdCBzaWVycmFfaW50Zl9wcml2YXRlICppbnRmZGF0YTsKIAlpbnQgYjsKIAotCWlmIChzZXJpYWwtPmRldi0+YXV0b19wbSkgeworCWlmIChtZXNzYWdlLmV2ZW50ICYgUE1fRVZFTlRfQVVUTykgewogCQlpbnRmZGF0YSA9IHNlcmlhbC0+cHJpdmF0ZTsKIAkJc3Bpbl9sb2NrX2lycSgmaW50ZmRhdGEtPnN1c3BfbG9jayk7CiAJCWIgPSBpbnRmZGF0YS0+aW5fZmxpZ2h0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMKaW5kZXggYmQzZmE3Zi4uNDU0M2YzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jCkBAIC0yNDcsOTYgKzI0Nyw2NiBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBpbnQgc2VyaWFsX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgaW50IHNlcmlhbF9hY3RpdmF0ZShzdHJ1Y3QgdHR5X3BvcnQgKnRwb3J0LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPQorCQljb250YWluZXJfb2YodHBvcnQsIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQsIHBvcnQpOwogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CiAJaW50IHJldHZhbDsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7Ci0KLQlzcGluX2xvY2tfaXJxKCZwb3J0LT5wb3J0LmxvY2spOwotCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkKLQkJKytwb3J0LT5wb3J0LmNvdW50OwotCXNwaW5fdW5sb2NrX2lycSgmcG9ydC0+cG9ydC5sb2NrKTsKLQl0dHlfcG9ydF90dHlfc2V0KCZwb3J0LT5wb3J0LCB0dHkpOwotCi0JLyogRG8gdGhlIGRldmljZS1zcGVjaWZpYyBvcGVuIG9ubHkgaWYgdGhlIGhhcmR3YXJlIGlzbid0Ci0JICogYWxyZWFkeSBpbml0aWFsaXplZC4KLQkgKi8KLQlpZiAoIXRlc3RfYml0KEFTWU5DQl9JTklUSUFMSVpFRCwgJnBvcnQtPnBvcnQuZmxhZ3MpKSB7Ci0JCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnBvcnQtPm11dGV4KSkKLQkJCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0JCW11dGV4X2xvY2soJnNlcmlhbC0+ZGlzY19tdXRleCk7Ci0JCWlmIChzZXJpYWwtPmRpc2Nvbm5lY3RlZCkKLQkJCXJldHZhbCA9IC1FTk9ERVY7Ci0JCWVsc2UKLQkJCXJldHZhbCA9IHBvcnQtPnNlcmlhbC0+dHlwZS0+b3Blbih0dHksIHBvcnQpOwotCQltdXRleF91bmxvY2soJnNlcmlhbC0+ZGlzY19tdXRleCk7Ci0JCW11dGV4X3VubG9jaygmcG9ydC0+bXV0ZXgpOwotCQlpZiAocmV0dmFsKQotCQkJcmV0dXJuIHJldHZhbDsKLQkJc2V0X2JpdChBU1lOQ0JfSU5JVElBTElaRUQsICZwb3J0LT5wb3J0LmZsYWdzKTsKLQl9Ci0KLQkvKiBOb3cgZG8gdGhlIGNvcnJlY3QgdHR5IGxheWVyIHNlbWFudGljcyAqLwotCXJldHZhbCA9IHR0eV9wb3J0X2Jsb2NrX3RpbF9yZWFkeSgmcG9ydC0+cG9ydCwgdHR5LCBmaWxwKTsKKwltdXRleF9sb2NrKCZzZXJpYWwtPmRpc2NfbXV0ZXgpOworCWlmIChzZXJpYWwtPmRpc2Nvbm5lY3RlZCkKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwllbHNlCisJCXJldHZhbCA9IHBvcnQtPnNlcmlhbC0+dHlwZS0+b3Blbih0dHksIHBvcnQpOworCW11dGV4X3VubG9jaygmc2VyaWFsLT5kaXNjX211dGV4KTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCitzdGF0aWMgaW50IHNlcmlhbF9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOworCisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKKwlyZXR1cm4gdHR5X3BvcnRfb3BlbigmcG9ydC0+cG9ydCwgdHR5LCBmaWxwKTsKK30KKwogLyoqCiAgKiBzZXJpYWxfZG93biAtIHNodXQgZG93biBoYXJkd2FyZQotICogQHBvcnQ6IHBvcnQgdG8gc2h1dCBkb3duCisgKiBAdHBvcnQ6IHR0eSBwb3J0IHRvIHNodXQgZG93bgogICoKICAqIFNodXQgZG93biBhIFVTQiBzZXJpYWwgcG9ydCB1bmxlc3MgaXQgaXMgdGhlIGNvbnNvbGUuICBXZSBuZXZlcgotICogc2h1dCBkb3duIHRoZSBjb25zb2xlIGhhcmR3YXJlIGFzIGl0IHdpbGwgYWx3YXlzIGJlIGluIHVzZS4KKyAqIHNodXQgZG93biB0aGUgY29uc29sZSBoYXJkd2FyZSBhcyBpdCB3aWxsIGFsd2F5cyBiZSBpbiB1c2UuIFNlcmlhbGl6ZWQKKyAqIGFnYWluc3QgYWN0aXZhdGUgYnkgdGhlIHRwb3J0IG11dGV4IGFuZCBrZXB0IHRvIG1hdGNoaW5nIG9wZW4vY2xvc2UgcGFpcnMKKyAqIG9mIGNhbGxzIGJ5IHRoZSBBU1lOQ0JfSU5JVElBTElaRUQgZmxhZy4KICAqLwotc3RhdGljIHZvaWQgc2VyaWFsX2Rvd24oc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKK3N0YXRpYyB2b2lkIHNlcmlhbF9kb3duKHN0cnVjdCB0dHlfcG9ydCAqdHBvcnQpCiB7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9CisJCWNvbnRhaW5lcl9vZih0cG9ydCwgc3RydWN0IHVzYl9zZXJpYWxfcG9ydCwgcG9ydCk7CiAJc3RydWN0IHVzYl9zZXJpYWxfZHJpdmVyICpkcnYgPSBwb3J0LT5zZXJpYWwtPnR5cGU7Ci0KIAkvKgogCSAqIFRoZSBjb25zb2xlIGlzIG1hZ2ljYWwuICBEbyBub3QgaGFuZyB1cCB0aGUgY29uc29sZSBoYXJkd2FyZQogCSAqIG9yIHRoZXJlIHdpbGwgYmUgdGVhcnMuCiAJICovCiAJaWYgKHBvcnQtPmNvbnNvbGUpCiAJCXJldHVybjsKLQotCS8qIERvbid0IGNhbGwgdGhlIGNsb3NlIG1ldGhvZCBpZiB0aGUgaGFyZHdhcmUgaGFzbid0IGJlZW4KLQkgKiBpbml0aWFsaXplZC4KLQkgKi8KLQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChBU1lOQ0JfSU5JVElBTElaRUQsICZwb3J0LT5wb3J0LmZsYWdzKSkKLQkJcmV0dXJuOwotCi0JbXV0ZXhfbG9jaygmcG9ydC0+bXV0ZXgpOwogCWlmIChkcnYtPmNsb3NlKQogCQlkcnYtPmNsb3NlKHBvcnQpOwotCW11dGV4X3VubG9jaygmcG9ydC0+bXV0ZXgpOwogfQogCiBzdGF0aWMgdm9pZCBzZXJpYWxfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0KIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwotCi0Jc2VyaWFsX2Rvd24ocG9ydCk7CiAJdHR5X3BvcnRfaGFuZ3VwKCZwb3J0LT5wb3J0KTsKIH0KIAogc3RhdGljIHZvaWQgc2VyaWFsX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQogewogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwotCiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKLQotCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKQotCQlyZXR1cm47Ci0JaWYgKHR0eV9wb3J0X2Nsb3NlX3N0YXJ0KCZwb3J0LT5wb3J0LCB0dHksIGZpbHApID09IDApCi0JCXJldHVybjsKLQlzZXJpYWxfZG93bihwb3J0KTsKLQl0dHlfcG9ydF9jbG9zZV9lbmQoJnBvcnQtPnBvcnQsIHR0eSk7Ci0JdHR5X3BvcnRfdHR5X3NldCgmcG9ydC0+cG9ydCwgTlVMTCk7CisJdHR5X3BvcnRfY2xvc2UoJnBvcnQtPnBvcnQsIHR0eSwgZmlscCk7CiB9CiAKIC8qKgpAQCAtNzI1LDYgKzY5NSw4IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHR0eV9wb3J0X29wZXJhdGlvbnMgc2VyaWFsX3BvcnRfb3BzID0gewogCS5jYXJyaWVyX3JhaXNlZCA9IHNlcmlhbF9jYXJyaWVyX3JhaXNlZCwKIAkuZHRyX3J0cyA9IHNlcmlhbF9kdHJfcnRzLAorCS5hY3RpdmF0ZSA9IHNlcmlhbF9hY3RpdmF0ZSwKKwkuc2h1dGRvd24gPSBzZXJpYWxfZG93biwKIH07CiAKIGludCB1c2Jfc2VyaWFsX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCkBAIC05MjMsNyArODk1LDggQEAKIAkJcG9ydC0+cG9ydC5vcHMgPSAmc2VyaWFsX3BvcnRfb3BzOwogCQlwb3J0LT5zZXJpYWwgPSBzZXJpYWw7CiAJCXNwaW5fbG9ja19pbml0KCZwb3J0LT5sb2NrKTsKLQkJbXV0ZXhfaW5pdCgmcG9ydC0+bXV0ZXgpOworCQkvKiBLZWVwIHRoaXMgZm9yIHByaXZhdGUgZHJpdmVyIHVzZSBmb3IgdGhlIG1vbWVudCBidXQKKwkJICAgc2hvdWxkIHByb2JhYmx5IGdvIGF3YXkgKi8KIAkJSU5JVF9XT1JLKCZwb3J0LT53b3JrLCB1c2Jfc2VyaWFsX3BvcnRfd29yayk7CiAJCXNlcmlhbC0+cG9ydFtpXSA9IHBvcnQ7CiAJCXBvcnQtPmRldi5wYXJlbnQgPSAmaW50ZXJmYWNlLT5kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3Njc2lnbHVlLmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3Njc2lnbHVlLmMKaW5kZXggY2ZhMjZkNS4uZTVlNmRmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS9zY3NpZ2x1ZS5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2NzaWdsdWUuYwpAQCAtNzMsNyArNzMsOCBAQAogCiBzdGF0aWMgY29uc3QgY2hhciogaG9zdF9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCiB7Ci0JcmV0dXJuICJTQ1NJIGVtdWxhdGlvbiBmb3IgVVNCIE1hc3MgU3RvcmFnZSBkZXZpY2VzIjsKKwlzdHJ1Y3QgdXNfZGF0YSAqdXMgPSBob3N0X3RvX3VzKGhvc3QpOworCXJldHVybiB1cy0+c2NzaV9uYW1lOwogfQogCiBzdGF0aWMgaW50IHNsYXZlX2FsbG9jIChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuYwppbmRleCA1ODlmNmI0Li5jYzMxM2QxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMKQEAgLTY2NiwxMCArNjY2LDExIEBACiAJICogdG8gd2FpdCBmb3IgYXQgbGVhc3Qgb25lIENIRUNLX0NPTkRJVElPTiB0byBkZXRlcm1pbmUKIAkgKiBTQU5FX1NFTlNFIHN1cHBvcnQKIAkgKi8KLQlpZiAoKHNyYi0+Y21uZFswXSA9PSBBVEFfMTYgfHwgc3JiLT5jbW5kWzBdID09IEFUQV8xMikgJiYKKwlpZiAodW5saWtlbHkoKHNyYi0+Y21uZFswXSA9PSBBVEFfMTYgfHwgc3JiLT5jbW5kWzBdID09IEFUQV8xMikgJiYKIAkgICAgcmVzdWx0ID09IFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EICYmCiAJICAgICEodXMtPmZmbGFncyAmIFVTX0ZMX1NBTkVfU0VOU0UpICYmCi0JICAgICEoc3JiLT5jbW5kWzJdICYgMHgyMCkpIHsKKwkgICAgISh1cy0+ZmZsYWdzICYgVVNfRkxfQkFEX1NFTlNFKSAmJgorCSAgICAhKHNyYi0+Y21uZFsyXSAmIDB4MjApKSkgewogCQlVU19ERUJVR1AoIi0tIFNBVCBzdXBwb3J0ZWQsIGluY3JlYXNpbmcgYXV0by1zZW5zZVxuIik7CiAJCXVzLT5mZmxhZ3MgfD0gVVNfRkxfU0FORV9TRU5TRTsKIAl9CkBAIC03MTgsNiArNzE5LDEyIEBACiAJCWlmICh0ZXN0X2JpdChVU19GTElEWF9USU1FRF9PVVQsICZ1cy0+ZGZsYWdzKSkgewogCQkJVVNfREVCVUdQKCItLSBhdXRvLXNlbnNlIGFib3J0ZWRcbiIpOwogCQkJc3JiLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisKKwkJCS8qIElmIFNBTkVfU0VOU0UgY2F1c2VkIHRoaXMgcHJvYmxlbSwgZGlzYWJsZSBpdCAqLworCQkJaWYgKHNlbnNlX3NpemUgIT0gVVNfU0VOU0VfU0laRSkgeworCQkJCXVzLT5mZmxhZ3MgJj0gflVTX0ZMX1NBTkVfU0VOU0U7CisJCQkJdXMtPmZmbGFncyB8PSBVU19GTF9CQURfU0VOU0U7CisJCQl9CiAJCQlnb3RvIEhhbmRsZV9FcnJvcnM7CiAJCX0KIApAQCAtNzI3LDEwICs3MzQsMTEgQEAKIAkJICogKHNtYWxsKSBzZW5zZSByZXF1ZXN0LiBUaGlzIGZpeGVzIHNvbWUgVVNCIEdTTSBtb2RlbXMKIAkJICovCiAJCWlmICh0ZW1wX3Jlc3VsdCA9PSBVU0JfU1RPUl9UUkFOU1BPUlRfRkFJTEVEICYmCi0JCSAgICAodXMtPmZmbGFncyAmIFVTX0ZMX1NBTkVfU0VOU0UpICYmCi0JCSAgICBzZW5zZV9zaXplICE9IFVTX1NFTlNFX1NJWkUpIHsKKwkJCQlzZW5zZV9zaXplICE9IFVTX1NFTlNFX1NJWkUpIHsKIAkJCVVTX0RFQlVHUCgiLS0gYXV0by1zZW5zZSBmYWlsdXJlLCByZXRyeSBzbWFsbCBzZW5zZVxuIik7CiAJCQlzZW5zZV9zaXplID0gVVNfU0VOU0VfU0laRTsKKwkJCXVzLT5mZmxhZ3MgJj0gflVTX0ZMX1NBTkVfU0VOU0U7CisJCQl1cy0+ZmZsYWdzIHw9IFVTX0ZMX0JBRF9TRU5TRTsKIAkJCWdvdG8gUmV0cnlfU2Vuc2U7CiAJCX0KIApAQCAtNzU0LDYgKzc2Miw3IEBACiAJCSAqLwogCQlpZiAoc3JiLT5zZW5zZV9idWZmZXJbN10gPiAoVVNfU0VOU0VfU0laRSAtIDgpICYmCiAJCSAgICAhKHVzLT5mZmxhZ3MgJiBVU19GTF9TQU5FX1NFTlNFKSAmJgorCQkgICAgISh1cy0+ZmZsYWdzICYgVVNfRkxfQkFEX1NFTlNFKSAmJgogCQkgICAgKHNyYi0+c2Vuc2VfYnVmZmVyWzBdICYgMHg3QykgPT0gMHg3MCkgewogCQkJVVNfREVCVUdQKCItLSBTQU5FX1NFTlNFIHN1cHBvcnQgZW5hYmxlZFxuIik7CiAJCQl1cy0+ZmZsYWdzIHw9IFVTX0ZMX1NBTkVfU0VOU0U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaAppbmRleCBkNGYwMzRlLi42NGEwYTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKQEAgLTgxOCw2ICs4MTgsMTMgQEAKIAkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCiAJCVVTX0ZMX0ZJWF9DQVBBQ0lUWSApLAogCisvKiBSZXBvcnRlZCBieSBEYW5pZWwgS3VrdWxhIDxkYW5pZWwua3VrdUBnbWFpbC5jb20+ICovCitVTlVTVUFMX0RFViggMHgwNjdiLCAweDEwNjMsIDB4MDEwMCwgMHgwMTAwLAorCQkiUHJvbGlmaWMgVGVjaG5vbG9neSwgSW5jLiIsCisJCSJQcm9saWZpYyBTdG9yYWdlIEdhZGdldCIsCisJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAorCQlVU19GTF9CQURfU0VOU0UgKSwKKwogLyogUmVwb3J0ZWQgYnkgUm9nZXJpbyBCcml0byA8cmJyaXRvQGltZS51c3AuYnI+ICovCiBVTlVTVUFMX0RFViggMHgwNjdiLCAweDIzMTcsIDB4MDAwMSwgMHgwMDEsCiAJCSJQcm9saWZpYyBUZWNobm9sb2d5LCBJbmMuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jCmluZGV4IDgwNjBiODUuLjVhNTNkNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYwpAQCAtNDUsNiArNDUsMTAgQEAKICAqIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKKyNpZmRlZiBDT05GSUdfVVNCX1NUT1JBR0VfREVCVUcKKyNkZWZpbmUgREVCVUcKKyNlbmRpZgorCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KQEAgLTIyOCw2ICsyMzIsNyBAQAogCWlmIChkYXRhX2xlbjwzNikgLy8gWW91IGxvc2UuCiAJCXJldHVybjsKIAorCW1lbXNldChkYXRhKzgsICcgJywgMjgpOwogCWlmKGRhdGFbMF0mMHgyMCkgeyAvKiBVU0IgZGV2aWNlIGN1cnJlbnRseSBub3QgY29ubmVjdGVkLiBSZXR1cm4KIAkJCSAgICAgIHBlcmlwaGVyYWwgcXVhbGlmaWVyIDAwMWIgKCIuLi5ob3dldmVyLCB0aGUKIAkJCSAgICAgIHBoeXNpY2FsIGRldmljZSBpcyBub3QgY3VycmVudGx5IGNvbm5lY3RlZApAQCAtMjM3LDE1ICsyNDIsMTUgQEAKIAkJCSAgICAgIGRldmljZSwgaXQgbWF5IHJldHVybiB6ZXJvcyBvciBBU0NJSSBzcGFjZXMgCiAJCQkgICAgICAoMjBoKSBpbiB0aG9zZSBmaWVsZHMgdW50aWwgdGhlIGRhdGEgaXMKIAkJCSAgICAgIGF2YWlsYWJsZSBmcm9tIHRoZSBkZXZpY2UuIikuICovCi0JCW1lbXNldChkYXRhKzgsMCwyOCk7CiAJfSBlbHNlIHsKIAkJdTE2IGJjZERldmljZSA9IGxlMTZfdG9fY3B1KHVzLT5wdXNiX2Rldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UpOwotCQltZW1jcHkoZGF0YSs4LCB1cy0+dW51c3VhbF9kZXYtPnZlbmRvck5hbWUsIAotCQkJc3RybGVuKHVzLT51bnVzdWFsX2Rldi0+dmVuZG9yTmFtZSkgPiA4ID8gOCA6Ci0JCQlzdHJsZW4odXMtPnVudXN1YWxfZGV2LT52ZW5kb3JOYW1lKSk7Ci0JCW1lbWNweShkYXRhKzE2LCB1cy0+dW51c3VhbF9kZXYtPnByb2R1Y3ROYW1lLCAKLQkJCXN0cmxlbih1cy0+dW51c3VhbF9kZXYtPnByb2R1Y3ROYW1lKSA+IDE2ID8gMTYgOgotCQkJc3RybGVuKHVzLT51bnVzdWFsX2Rldi0+cHJvZHVjdE5hbWUpKTsKKwkJaW50IG47CisKKwkJbiA9IHN0cmxlbih1cy0+dW51c3VhbF9kZXYtPnZlbmRvck5hbWUpOworCQltZW1jcHkoZGF0YSs4LCB1cy0+dW51c3VhbF9kZXYtPnZlbmRvck5hbWUsIG1pbig4LCBuKSk7CisJCW4gPSBzdHJsZW4odXMtPnVudXN1YWxfZGV2LT5wcm9kdWN0TmFtZSk7CisJCW1lbWNweShkYXRhKzE2LCB1cy0+dW51c3VhbF9kZXYtPnByb2R1Y3ROYW1lLCBtaW4oMTYsIG4pKTsKKwogCQlkYXRhWzMyXSA9IDB4MzAgKyAoKGJjZERldmljZT4+MTIpICYgMHgwRik7CiAJCWRhdGFbMzNdID0gMHgzMCArICgoYmNkRGV2aWNlPj44KSAmIDB4MEYpOwogCQlkYXRhWzM0XSA9IDB4MzAgKyAoKGJjZERldmljZT4+NCkgJiAweDBGKTsKQEAgLTQ1OSw2ICs0NjQsOSBAQAogCQljYXNlICdhJzoKIAkJCWYgfD0gVVNfRkxfU0FORV9TRU5TRTsKIAkJCWJyZWFrOworCQljYXNlICdiJzoKKwkJCWYgfD0gVVNfRkxfQkFEX1NFTlNFOworCQkJYnJlYWs7CiAJCWNhc2UgJ2MnOgogCQkJZiB8PSBVU19GTF9GSVhfQ0FQQUNJVFk7CiAJCQlicmVhazsKQEAgLTgwOCwxNCArODE2LDEzIEBACiB7CiAJc3RydWN0IHVzX2RhdGEgKnVzID0gKHN0cnVjdCB1c19kYXRhICopX191czsKIAotCXByaW50ayhLRVJOX0RFQlVHCi0JCSJ1c2Itc3RvcmFnZTogZGV2aWNlIGZvdW5kIGF0ICVkXG4iLCB1cy0+cHVzYl9kZXYtPmRldm51bSk7CisJZGV2X2RiZygmdXMtPnB1c2JfaW50Zi0+ZGV2LCAiZGV2aWNlIGZvdW5kXG4iKTsKIAogCXNldF9mcmVlemFibGUoKTsKIAkvKiBXYWl0IGZvciB0aGUgdGltZW91dCB0byBleHBpcmUgb3IgZm9yIGEgZGlzY29ubmVjdCAqLwogCWlmIChkZWxheV91c2UgPiAwKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJ1c2Itc3RvcmFnZTogd2FpdGluZyBmb3IgZGV2aWNlICIKLQkJCQkidG8gc2V0dGxlIGJlZm9yZSBzY2FubmluZ1xuIik7CisJCWRldl9kYmcoJnVzLT5wdXNiX2ludGYtPmRldiwgIndhaXRpbmcgZm9yIGRldmljZSB0byBzZXR0bGUgIgorCQkJCSJiZWZvcmUgc2Nhbm5pbmdcbiIpOwogCQl3YWl0X2V2ZW50X2ZyZWV6YWJsZV90aW1lb3V0KHVzLT5kZWxheV93YWl0LAogCQkJCXRlc3RfYml0KFVTX0ZMSURYX0RPTlRfU0NBTiwgJnVzLT5kZmxhZ3MpLAogCQkJCWRlbGF5X3VzZSAqIEhaKTsKQEAgLTgzMiw3ICs4MzksNyBAQAogCQkJbXV0ZXhfdW5sb2NrKCZ1cy0+ZGV2X211dGV4KTsKIAkJfQogCQlzY3NpX3NjYW5faG9zdCh1c190b19ob3N0KHVzKSk7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJ1c2Itc3RvcmFnZTogZGV2aWNlIHNjYW4gY29tcGxldGVcbiIpOworCQlkZXZfZGJnKCZ1cy0+cHVzYl9pbnRmLT5kZXYsICJzY2FuIGNvbXBsZXRlXG4iKTsKIAogCQkvKiBTaG91bGQgd2UgdW5iaW5kIGlmIG5vIGRldmljZXMgd2VyZSBkZXRlY3RlZD8gKi8KIAl9CkBAIC04NDAsNiArODQ3LDE1IEBACiAJY29tcGxldGVfYW5kX2V4aXQoJnVzLT5zY2FubmluZ19kb25lLCAwKTsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGludCB1c2Jfc3Rvcl9zZ190YWJsZXNpemUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCisJaWYgKHVzYl9kZXYtPmJ1cy0+c2dfdGFibGVzaXplKSB7CisJCXJldHVybiB1c2JfZGV2LT5idXMtPnNnX3RhYmxlc2l6ZTsKKwl9CisJcmV0dXJuIFNHX0FMTDsKK30KIAogLyogRmlyc3QgcGFydCBvZiBnZW5lcmFsIFVTQiBtYXNzLXN0b3JhZ2UgcHJvYmluZyAqLwogaW50IHVzYl9zdG9yX3Byb2JlMShzdHJ1Y3QgdXNfZGF0YSAqKnB1cywKQEAgLTg2OCw2ICs4ODQsNyBAQAogCSAqIEFsbG93IDE2LWJ5dGUgQ0RCcyBhbmQgdGh1cyA+IDJUQgogCSAqLwogCWhvc3QtPm1heF9jbWRfbGVuID0gMTY7CisJaG9zdC0+c2dfdGFibGVzaXplID0gdXNiX3N0b3Jfc2dfdGFibGVzaXplKGludGYpOwogCSpwdXMgPSB1cyA9IGhvc3RfdG9fdXMoaG9zdCk7CiAJbWVtc2V0KHVzLCAwLCBzaXplb2Yoc3RydWN0IHVzX2RhdGEpKTsKIAltdXRleF9pbml0KCYodXMtPmRldl9tdXRleCkpOwpAQCAtOTI5LDYgKzk0Niw4IEBACiAJcmVzdWx0ID0gdXNiX3N0b3JfYWNxdWlyZV9yZXNvdXJjZXModXMpOwogCWlmIChyZXN1bHQpCiAJCWdvdG8gQmFkRGV2aWNlOworCXNucHJpbnRmKHVzLT5zY3NpX25hbWUsIHNpemVvZih1cy0+c2NzaV9uYW1lKSwgInVzYi1zdG9yYWdlICVzIiwKKwkJCQkJZGV2X25hbWUoJnVzLT5wdXNiX2ludGYtPmRldikpOwogCXJlc3VsdCA9IHNjc2lfYWRkX2hvc3QodXNfdG9faG9zdCh1cyksICZ1cy0+cHVzYl9pbnRmLT5kZXYpOwogCWlmIChyZXN1bHQpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBVU0JfU1RPUkFHRQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmgKaW5kZXggMjYwOWVmYi4uNjk3MTcxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuaAorKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5oCkBAIC0xMzIsNiArMTMyLDcgQEAKIAkvKiBTQ1NJIGludGVyZmFjZXMgKi8KIAlzdHJ1Y3Qgc2NzaV9jbW5kCSpzcmI7CQkgLyogY3VycmVudCBzcmIJCSovCiAJdW5zaWduZWQgaW50CQl0YWc7CQkgLyogY3VycmVudCBkQ0JXVGFnCSovCisJY2hhcgkJCXNjc2lfbmFtZVszMl07CSAvKiBzY3NpX2hvc3QgbmFtZQkqLwogCiAJLyogY29udHJvbCBhbmQgYnVsayBjb21tdW5pY2F0aW9ucyBkYXRhICovCiAJc3RydWN0IHVyYgkJKmN1cnJlbnRfdXJiOwkgLyogVVNCIHJlcXVlc3RzCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvdXNiLXNrZWxldG9uLmMgYi9kcml2ZXJzL3VzYi91c2Itc2tlbGV0b24uYwppbmRleCBiNjJmMmJjLi5iMWU1NzljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi91c2Itc2tlbGV0b24uYworKysgYi9kcml2ZXJzL3VzYi91c2Itc2tlbGV0b24uYwpAQCAtMzU4LDcgKzM1OCw3IEBACiAJCXJ2ID0gc2tlbF9kb19yZWFkX2lvKGRldiwgY291bnQpOwogCQlpZiAocnYgPCAwKQogCQkJZ290byBleGl0OwotCQllbHNlIGlmICghZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCWVsc2UgaWYgKCEoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKQogCQkJZ290byByZXRyeTsKIAkJcnYgPSAtRUFHQUlOOwogCX0KQEAgLTQxMSw3ICs0MTEsNyBAQAogCSAqIGxpbWl0IHRoZSBudW1iZXIgb2YgVVJCcyBpbiBmbGlnaHQgdG8gc3RvcCBhIHVzZXIgZnJvbSB1c2luZyB1cCBhbGwKIAkgKiBSQU0KIAkgKi8KLQlpZiAoIWZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJaWYgKCEoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKSB7CiAJCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRldi0+bGltaXRfc2VtKSkgewogCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOwogCQkJZ290byBleGl0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivd3VzYmNvcmUvZGV2Y29ubmVjdC5jIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvZGV2Y29ubmVjdC5jCmluZGV4IDRhYzQzMDAuLmRjZWQ0MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL2RldmNvbm5lY3QuYworKysgYi9kcml2ZXJzL3VzYi93dXNiY29yZS9kZXZjb25uZWN0LmMKQEAgLTExOSwxMCArMTE5LDEyIEBACiAJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAlpZiAodXJiID09IE5VTEwpCiAJCWdvdG8gZXJyOworCXd1c2JfZGV2LT5zZXRfZ3RrX3VyYiA9IHVyYjsKIAotCXJlcSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QpLCBHRlBfS0VSTkVMKTsKKwlyZXEgPSBrbWFsbG9jKHNpemVvZigqcmVxKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJlcSA9PSBOVUxMKQogCQlnb3RvIGVycjsKKwl3dXNiX2Rldi0+c2V0X2d0a19yZXEgPSByZXE7CiAKIAlyZXEtPmJSZXF1ZXN0VHlwZSA9IFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfU1RBTkRBUkQgfCBVU0JfUkVDSVBfREVWSUNFOwogCXJlcS0+YlJlcXVlc3QgPSBVU0JfUkVRX1NFVF9ERVNDUklQVE9SOwpAQCAtMTMwLDkgKzEzMiw2IEBACiAJcmVxLT53SW5kZXggPSAwOwogCXJlcS0+d0xlbmd0aCA9IGNwdV90b19sZTE2KHd1c2JoYy0+Z3RrLmRlc2NyLmJMZW5ndGgpOwogCi0Jd3VzYl9kZXYtPnNldF9ndGtfdXJiID0gdXJiOwotCXd1c2JfZGV2LT5zZXRfZ3RrX3JlcSA9IHJlcTsKLQogCXJldHVybiB3dXNiX2RldjsKIGVycjoKIAl3dXNiX2Rldl9mcmVlKHd1c2JfZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3NlY3VyaXR5LmMgYi9kcml2ZXJzL3VzYi93dXNiY29yZS9zZWN1cml0eS5jCmluZGV4IDQ1MTZjMzYuLmVkY2QyZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3NlY3VyaXR5LmMKKysrIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvc2VjdXJpdHkuYwpAQCAtMjA1LDE1ICsyMDUsMTUgQEAKIAljb25zdCB2b2lkICppdHIsICp0b3A7CiAJY2hhciBidWZbNjRdOwogCi0Jc2VjZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2Jfc2VjdXJpdHlfZGVzY3JpcHRvciksIEdGUF9LRVJORUwpOworCXNlY2QgPSBrbWFsbG9jKHNpemVvZigqc2VjZCksIEdGUF9LRVJORUwpOwogCWlmIChzZWNkID09IE5VTEwpIHsKIAkJcmVzdWx0ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQogCiAJcmVzdWx0ID0gdXNiX2dldF9kZXNjcmlwdG9yKHVzYl9kZXYsIFVTQl9EVF9TRUNVUklUWSwKLQkJCQkgICAgMCwgc2VjZCwgc2l6ZW9mKHN0cnVjdCB1c2Jfc2VjdXJpdHlfZGVzY3JpcHRvcikpOwotCWlmIChyZXN1bHQgPCBzaXplb2Yoc2VjZCkpIHsKKwkJCQkgICAgMCwgc2VjZCwgc2l6ZW9mKCpzZWNkKSk7CisJaWYgKHJlc3VsdCA8IHNpemVvZigqc2VjZCkpIHsKIAkJZGV2X2VycihkZXYsICJDYW4ndCByZWFkIHNlY3VyaXR5IGRlc2NyaXB0b3Igb3IgIgogCQkJIm5vdCBlbm91Z2ggZGF0YTogJWRcbiIsIHJlc3VsdCk7CiAJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivd3VzYmNvcmUvd3VzYmhjLmMgYi9kcml2ZXJzL3VzYi93dXNiY29yZS93dXNiaGMuYwppbmRleCBlZTYyNTZmLi5lYWI4NmU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS93dXNiaGMuYworKysgYi9kcml2ZXJzL3VzYi93dXNiY29yZS93dXNiaGMuYwpAQCAtMTQ3LDEwICsxNDcsNDAgQEAKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUih3dXNiX2NoaWQsIDA2NDQsIHd1c2JfY2hpZF9zaG93LCB3dXNiX2NoaWRfc3RvcmUpOwogCisKK3N0YXRpYyBzc2l6ZV90IHd1c2JfcGh5X3JhdGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgd3VzYmhjICp3dXNiaGMgPSB1c2JoY19kZXZfdG9fd3VzYmhjKGRldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgd3VzYmhjLT5waHlfcmF0ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHd1c2JfcGh5X3JhdGVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHd1c2JoYyAqd3VzYmhjID0gdXNiaGNfZGV2X3RvX3d1c2JoYyhkZXYpOworCXVpbnQ4X3QgcGh5X3JhdGU7CisJc3NpemVfdCByZXN1bHQ7CisKKwlyZXN1bHQgPSBzc2NhbmYoYnVmLCAiJWhodSIsICZwaHlfcmF0ZSk7CisJaWYgKHJlc3VsdCAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocGh5X3JhdGUgPj0gVVdCX1BIWV9SQVRFX0lOVkFMSUQpCisJCXJldHVybiAtRUlOVkFMOworCisJd3VzYmhjLT5waHlfcmF0ZSA9IHBoeV9yYXRlOworCXJldHVybiBzaXplOworfQorc3RhdGljIERFVklDRV9BVFRSKHd1c2JfcGh5X3JhdGUsIDA2NDQsIHd1c2JfcGh5X3JhdGVfc2hvdywgd3VzYl9waHlfcmF0ZV9zdG9yZSk7CisKIC8qIEdyb3VwIGFsbCB0aGUgV1VTQkhDIGF0dHJpYnV0ZXMgKi8KIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp3dXNiaGNfYXR0cnNbXSA9IHsKIAkJJmRldl9hdHRyX3d1c2JfdHJ1c3RfdGltZW91dC5hdHRyLAogCQkmZGV2X2F0dHJfd3VzYl9jaGlkLmF0dHIsCisJCSZkZXZfYXR0cl93dXNiX3BoeV9yYXRlLmF0dHIsCiAJCU5VTEwsCiB9OwogCkBAIC0xNzcsNiArMjA3LDggQEAKIAlpbnQgcmVzdWx0ID0gMDsKIAogCXd1c2JoYy0+dHJ1c3RfdGltZW91dCA9IFdVU0JfVFJVU1RfVElNRU9VVF9NUzsKKwl3dXNiaGMtPnBoeV9yYXRlID0gVVdCX1BIWV9SQVRFX0lOVkFMSUQgLSAxOworCiAJbXV0ZXhfaW5pdCgmd3VzYmhjLT5tdXRleCk7CiAJcmVzdWx0ID0gd3VzYmhjX21tY2llX2NyZWF0ZSh3dXNiaGMpOwogCWlmIChyZXN1bHQgPCAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivd3VzYmNvcmUvd3VzYmhjLmggYi9kcml2ZXJzL3VzYi93dXNiY29yZS93dXNiaGMuaAppbmRleCA3OTdjMjQ1Li5mZDJmZDRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS93dXNiaGMuaAorKysgYi9kcml2ZXJzL3VzYi93dXNiY29yZS93dXNiaGMuaApAQCAtMjUzLDYgKzI1Myw3IEBACiAKIAl1bnNpZ25lZCB0cnVzdF90aW1lb3V0OwkJCS8qIGluIGppZmZpZXMgKi8KIAlzdHJ1Y3Qgd3VzYl9ja2hkaWQgY2hpZDsKKwl1aW50OF90IHBoeV9yYXRlOwogCXN0cnVjdCB3dWllX2hvc3RfaW5mbyAqd3VpZV9ob3N0X2luZm87CiAKIAlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CQkJLyogbG9ja3MgZXZlcnl0aGluZyBlbHNlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL0tjb25maWcKaW5kZXggYmI1ZmJlZC4uOTljMGRmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmlkZW8vS2NvbmZpZwpAQCAtMjEzMSw3ICsyMTMxLDcgQEAKIAkgIHRoZSBib290bG9hZGVyLgogCiBjb25maWcgRkJfTVNNCi0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiTVNNIEZyYW1lYnVmZmVyIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBGQiAmJiBBUkNIX01TTQogCXNlbGVjdCBGQl9DRkJfRklMTFJFQ1QKIAlzZWxlY3QgRkJfQ0ZCX0NPUFlBUkVBCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hZHA1NTIwX2JsLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hZHA1NTIwX2JsLmMKaW5kZXggYWQwNWRhNS4uNGMxMGVkZWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hZHA1NTIwX2JsLmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYWRwNTUyMF9ibC5jCkBAIC0xNSw3ICsxNSw3IEBACiAKIHN0cnVjdCBhZHA1NTIwX2JsIHsKIAlzdHJ1Y3QgZGV2aWNlICptYXN0ZXI7Ci0Jc3RydWN0IGFkcDU1MjBfYmFja2xpZ2h0X3BsYXRmcm9tX2RhdGEgKnBkYXRhOworCXN0cnVjdCBhZHA1NTIwX2JhY2tsaWdodF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIAlzdHJ1Y3QgbXV0ZXggbG9jazsKIAl1bnNpZ25lZCBsb25nIGNhY2hlZF9kYXlsaWdodF9tYXg7CiAJaW50IGlkOwpAQCAtMzEsMjkgKzMxLDMwIEBACiAJaWYgKGRhdGEtPnBkYXRhLT5lbl9hbWJsX3NlbnMpIHsKIAkJaWYgKChicmlnaHRuZXNzID4gMCkgJiYgKGJyaWdodG5lc3MgPCBBRFA1MDIwX01BWF9CUklHSFRORVNTKSkgewogCQkJLyogRGlzYWJsZSBBbWJpZW50IExpZ2h0IGF1dG8gYWRqdXN0ICovCi0JCQlyZXQgfD0gYWRwNTUyMF9jbHJfYml0cyhtYXN0ZXIsIEJMX0NPTlRST0wsCi0JCQkJCUJMX0FVVE9fQURKKTsKLQkJCXJldCB8PSBhZHA1NTIwX3dyaXRlKG1hc3RlciwgREFZTElHSFRfTUFYLCBicmlnaHRuZXNzKTsKKwkJCXJldCB8PSBhZHA1NTIwX2Nscl9iaXRzKG1hc3RlciwgQURQNTUyMF9CTF9DT05UUk9MLAorCQkJCQlBRFA1NTIwX0JMX0FVVE9fQURKKTsKKwkJCXJldCB8PSBhZHA1NTIwX3dyaXRlKG1hc3RlciwgQURQNTUyMF9EQVlMSUdIVF9NQVgsCisJCQkJCWJyaWdodG5lc3MpOwogCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIE1BWF9CUklHSFRORVNTIC0+IEVuYWJsZSBBbWJpZW50IExpZ2h0IGF1dG8gYWRqdXN0CiAJCQkgKiByZXN0b3JlIGRheWxpZ2h0IGwzIHN5c2ZzIGJyaWdodG5lc3MKIAkJCSAqLwotCQkJcmV0IHw9IGFkcDU1MjBfd3JpdGUobWFzdGVyLCBEQVlMSUdIVF9NQVgsCisJCQlyZXQgfD0gYWRwNTUyMF93cml0ZShtYXN0ZXIsIEFEUDU1MjBfREFZTElHSFRfTUFYLAogCQkJCQkgZGF0YS0+Y2FjaGVkX2RheWxpZ2h0X21heCk7Ci0JCQlyZXQgfD0gYWRwNTUyMF9zZXRfYml0cyhtYXN0ZXIsIEJMX0NPTlRST0wsCi0JCQkJCSBCTF9BVVRPX0FESik7CisJCQlyZXQgfD0gYWRwNTUyMF9zZXRfYml0cyhtYXN0ZXIsIEFEUDU1MjBfQkxfQ09OVFJPTCwKKwkJCQkJIEFEUDU1MjBfQkxfQVVUT19BREopOwogCQl9CiAJfSBlbHNlIHsKLQkJcmV0IHw9IGFkcDU1MjBfd3JpdGUobWFzdGVyLCBEQVlMSUdIVF9NQVgsIGJyaWdodG5lc3MpOworCQlyZXQgfD0gYWRwNTUyMF93cml0ZShtYXN0ZXIsIEFEUDU1MjBfREFZTElHSFRfTUFYLCBicmlnaHRuZXNzKTsKIAl9CiAKIAlpZiAoZGF0YS0+Y3VycmVudF9icmlnaHRuZXNzICYmIGJyaWdodG5lc3MgPT0gMCkKIAkJcmV0IHw9IGFkcDU1MjBfc2V0X2JpdHMobWFzdGVyLAotCQkJCU1PREVfU1RBVFVTLCBESU1fRU4pOworCQkJCUFEUDU1MjBfTU9ERV9TVEFUVVMsIEFEUDU1MjBfRElNX0VOKTsKIAllbHNlIGlmIChkYXRhLT5jdXJyZW50X2JyaWdodG5lc3MgPT0gMCAmJiBicmlnaHRuZXNzKQogCQlyZXQgfD0gYWRwNTUyMF9jbHJfYml0cyhtYXN0ZXIsCi0JCQkJTU9ERV9TVEFUVVMsIERJTV9FTik7CisJCQkJQURQNTUyMF9NT0RFX1NUQVRVUywgQURQNTUyMF9ESU1fRU4pOwogCiAJaWYgKCFyZXQpCiAJCWRhdGEtPmN1cnJlbnRfYnJpZ2h0bmVzcyA9IGJyaWdodG5lc3M7CkBAIC03OSw3ICs4MCw3IEBACiAJaW50IGVycm9yOwogCXVpbnQ4X3QgcmVnX3ZhbDsKIAotCWVycm9yID0gYWRwNTUyMF9yZWFkKGRhdGEtPm1hc3RlciwgQkxfVkFMVUUsICZyZWdfdmFsKTsKKwllcnJvciA9IGFkcDU1MjBfcmVhZChkYXRhLT5tYXN0ZXIsIEFEUDU1MjBfQkxfVkFMVUUsICZyZWdfdmFsKTsKIAogCXJldHVybiBlcnJvciA/IGRhdGEtPmN1cnJlbnRfYnJpZ2h0bmVzcyA6IHJlZ192YWw7CiB9CkBAIC05MywzMyArOTQsNDYgQEAKIHsKIAlzdHJ1Y3QgYWRwNTUyMF9ibCAqZGF0YSA9IGJsX2dldF9kYXRhKGJsKTsKIAlzdHJ1Y3QgZGV2aWNlICptYXN0ZXIgPSBkYXRhLT5tYXN0ZXI7Ci0Jc3RydWN0IGFkcDU1MjBfYmFja2xpZ2h0X3BsYXRmcm9tX2RhdGEgKnBkYXRhID0gZGF0YS0+cGRhdGE7CisJc3RydWN0IGFkcDU1MjBfYmFja2xpZ2h0X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGF0YS0+cGRhdGE7CiAJaW50IHJldCA9IDA7CiAKLQlyZXQgfD0gYWRwNTUyMF93cml0ZShtYXN0ZXIsIERBWUxJR0hUX01BWCwgcGRhdGEtPmwxX2RheWxpZ2h0X21heCk7Ci0JcmV0IHw9IGFkcDU1MjBfd3JpdGUobWFzdGVyLCBEQVlMSUdIVF9ESU0sIHBkYXRhLT5sMV9kYXlsaWdodF9kaW0pOworCXJldCB8PSBhZHA1NTIwX3dyaXRlKG1hc3RlciwgQURQNTUyMF9EQVlMSUdIVF9NQVgsCisJCQkJcGRhdGEtPmwxX2RheWxpZ2h0X21heCk7CisJcmV0IHw9IGFkcDU1MjBfd3JpdGUobWFzdGVyLCBBRFA1NTIwX0RBWUxJR0hUX0RJTSwKKwkJCQlwZGF0YS0+bDFfZGF5bGlnaHRfZGltKTsKIAogCWlmIChwZGF0YS0+ZW5fYW1ibF9zZW5zKSB7CiAJCWRhdGEtPmNhY2hlZF9kYXlsaWdodF9tYXggPSBwZGF0YS0+bDFfZGF5bGlnaHRfbWF4OwotCQlyZXQgfD0gYWRwNTUyMF93cml0ZShtYXN0ZXIsIE9GRklDRV9NQVgsIHBkYXRhLT5sMl9vZmZpY2VfbWF4KTsKLQkJcmV0IHw9IGFkcDU1MjBfd3JpdGUobWFzdGVyLCBPRkZJQ0VfRElNLCBwZGF0YS0+bDJfb2ZmaWNlX2RpbSk7Ci0JCXJldCB8PSBhZHA1NTIwX3dyaXRlKG1hc3RlciwgREFSS19NQVgsIHBkYXRhLT5sM19kYXJrX21heCk7Ci0JCXJldCB8PSBhZHA1NTIwX3dyaXRlKG1hc3RlciwgREFSS19ESU0sIHBkYXRhLT5sM19kYXJrX2RpbSk7Ci0JCXJldCB8PSBhZHA1NTIwX3dyaXRlKG1hc3RlciwgTDJfVFJJUCwgcGRhdGEtPmwyX3RyaXApOwotCQlyZXQgfD0gYWRwNTUyMF93cml0ZShtYXN0ZXIsIEwyX0hZUywgcGRhdGEtPmwyX2h5c3QpOwotCQlyZXQgfD0gYWRwNTUyMF93cml0ZShtYXN0ZXIsIEwzX1RSSVAsIHBkYXRhLT5sM190cmlwKTsKLQkJcmV0IHw9IGFkcDU1MjBfd3JpdGUobWFzdGVyLCBMM19IWVMsIHBkYXRhLT5sM19oeXN0KTsKLQkJcmV0IHw9IGFkcDU1MjBfd3JpdGUobWFzdGVyLCBBTFNfQ01QUl9DRkcsCi0JCQlBTFNfQ01QUl9DRkdfVkFMKHBkYXRhLT5hYm1sX2ZpbHQsIEwzX0VOKSk7CisJCXJldCB8PSBhZHA1NTIwX3dyaXRlKG1hc3RlciwgQURQNTUyMF9PRkZJQ0VfTUFYLAorCQkJCXBkYXRhLT5sMl9vZmZpY2VfbWF4KTsKKwkJcmV0IHw9IGFkcDU1MjBfd3JpdGUobWFzdGVyLCBBRFA1NTIwX09GRklDRV9ESU0sCisJCQkJcGRhdGEtPmwyX29mZmljZV9kaW0pOworCQlyZXQgfD0gYWRwNTUyMF93cml0ZShtYXN0ZXIsIEFEUDU1MjBfREFSS19NQVgsCisJCQkJcGRhdGEtPmwzX2RhcmtfbWF4KTsKKwkJcmV0IHw9IGFkcDU1MjBfd3JpdGUobWFzdGVyLCBBRFA1NTIwX0RBUktfRElNLAorCQkJCXBkYXRhLT5sM19kYXJrX2RpbSk7CisJCXJldCB8PSBhZHA1NTIwX3dyaXRlKG1hc3RlciwgQURQNTUyMF9MMl9UUklQLAorCQkJCXBkYXRhLT5sMl90cmlwKTsKKwkJcmV0IHw9IGFkcDU1MjBfd3JpdGUobWFzdGVyLCBBRFA1NTIwX0wyX0hZUywKKwkJCQlwZGF0YS0+bDJfaHlzdCk7CisJCXJldCB8PSBhZHA1NTIwX3dyaXRlKG1hc3RlciwgQURQNTUyMF9MM19UUklQLAorCQkJCSBwZGF0YS0+bDNfdHJpcCk7CisJCXJldCB8PSBhZHA1NTIwX3dyaXRlKG1hc3RlciwgQURQNTUyMF9MM19IWVMsCisJCQkJcGRhdGEtPmwzX2h5c3QpOworCQlyZXQgfD0gYWRwNTUyMF93cml0ZShtYXN0ZXIsIEFEUDU1MjBfQUxTX0NNUFJfQ0ZHLAorCQkJCUFMU19DTVBSX0NGR19WQUwocGRhdGEtPmFibWxfZmlsdCwKKwkJCQlBRFA1NTIwX0wzX0VOKSk7CiAJfQogCi0JcmV0IHw9IGFkcDU1MjBfd3JpdGUobWFzdGVyLCBCTF9DT05UUk9MLAotCQkJQkxfQ1RSTF9WQUwocGRhdGEtPmZhZGVfbGVkX2xhdywgcGRhdGEtPmVuX2FtYmxfc2VucykpOworCXJldCB8PSBhZHA1NTIwX3dyaXRlKG1hc3RlciwgQURQNTUyMF9CTF9DT05UUk9MLAorCQkJQkxfQ1RSTF9WQUwocGRhdGEtPmZhZGVfbGVkX2xhdywKKwkJCQkJcGRhdGEtPmVuX2FtYmxfc2VucykpOwogCi0JcmV0IHw9IGFkcDU1MjBfd3JpdGUobWFzdGVyLCBCTF9GQURFLCBGQURFX1ZBTChwZGF0YS0+ZmFkZV9pbiwKKwlyZXQgfD0gYWRwNTUyMF93cml0ZShtYXN0ZXIsIEFEUDU1MjBfQkxfRkFERSwgRkFERV9WQUwocGRhdGEtPmZhZGVfaW4sCiAJCQlwZGF0YS0+ZmFkZV9vdXQpKTsKIAotCXJldCB8PSBhZHA1NTIwX3NldF9iaXRzKG1hc3RlciwgTU9ERV9TVEFUVVMsIEJMX0VOIHwgRElNX0VOKTsKKwlyZXQgfD0gYWRwNTUyMF9zZXRfYml0cyhtYXN0ZXIsIEFEUDU1MjBfTU9ERV9TVEFUVVMsCisJCQlBRFA1NTIwX0JMX0VOIHwgQURQNTUyMF9ESU1fRU4pOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE1NiwyOSArMTcwLDMxIEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFkcDU1MjBfYmxfZGFya19tYXhfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXJldHVybiBhZHA1NTIwX3Nob3coZGV2LCBidWYsIERBUktfTUFYKTsKKwlyZXR1cm4gYWRwNTUyMF9zaG93KGRldiwgYnVmLCBBRFA1NTIwX0RBUktfTUFYKTsKIH0KIAogc3RhdGljIHNzaXplX3QgYWRwNTUyMF9ibF9kYXJrX21heF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JcmV0dXJuIGFkcDU1MjBfc3RvcmUoZGV2LCBidWYsIGNvdW50LCBEQVJLX01BWCk7CisJcmV0dXJuIGFkcDU1MjBfc3RvcmUoZGV2LCBidWYsIGNvdW50LCBBRFA1NTIwX0RBUktfTUFYKTsKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUihkYXJrX21heCwgMDY2NCwgYWRwNTUyMF9ibF9kYXJrX21heF9zaG93LAogCQkJYWRwNTUyMF9ibF9kYXJrX21heF9zdG9yZSk7CiAKIHN0YXRpYyBzc2l6ZV90IGFkcDU1MjBfYmxfb2ZmaWNlX21heF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXJldHVybiBhZHA1NTIwX3Nob3coZGV2LCBidWYsIE9GRklDRV9NQVgpOworCXJldHVybiBhZHA1NTIwX3Nob3coZGV2LCBidWYsIEFEUDU1MjBfT0ZGSUNFX01BWCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFkcDU1MjBfYmxfb2ZmaWNlX21heF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JcmV0dXJuIGFkcDU1MjBfc3RvcmUoZGV2LCBidWYsIGNvdW50LCBPRkZJQ0VfTUFYKTsKKwlyZXR1cm4gYWRwNTUyMF9zdG9yZShkZXYsIGJ1ZiwgY291bnQsIEFEUDU1MjBfT0ZGSUNFX01BWCk7CiB9CiBzdGF0aWMgREVWSUNFX0FUVFIob2ZmaWNlX21heCwgMDY2NCwgYWRwNTUyMF9ibF9vZmZpY2VfbWF4X3Nob3csCiAJCQlhZHA1NTIwX2JsX29mZmljZV9tYXhfc3RvcmUpOwpAQCAtMTg2LDE2ICsyMDIsMTcgQEAKIHN0YXRpYyBzc2l6ZV90IGFkcDU1MjBfYmxfZGF5bGlnaHRfbWF4X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlyZXR1cm4gYWRwNTUyMF9zaG93KGRldiwgYnVmLCBEQVlMSUdIVF9NQVgpOworCXJldHVybiBhZHA1NTIwX3Nob3coZGV2LCBidWYsIEFEUDU1MjBfREFZTElHSFRfTUFYKTsKIH0KIAogc3RhdGljIHNzaXplX3QgYWRwNTUyMF9ibF9kYXlsaWdodF9tYXhfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBhZHA1NTIwX2JsICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAlzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YS0+Y2FjaGVkX2RheWxpZ2h0X21heCk7Ci0JcmV0dXJuIGFkcDU1MjBfc3RvcmUoZGV2LCBidWYsIGNvdW50LCBEQVlMSUdIVF9NQVgpOworCXJldHVybiBhZHA1NTIwX3N0b3JlKGRldiwgYnVmLCBjb3VudCwgQURQNTUyMF9EQVlMSUdIVF9NQVgpOwogfQogc3RhdGljIERFVklDRV9BVFRSKGRheWxpZ2h0X21heCwgMDY2NCwgYWRwNTUyMF9ibF9kYXlsaWdodF9tYXhfc2hvdywKIAkJCWFkcDU1MjBfYmxfZGF5bGlnaHRfbWF4X3N0b3JlKTsKQEAgLTIwMywxNCArMjIwLDE0IEBACiBzdGF0aWMgc3NpemVfdCBhZHA1NTIwX2JsX2RhcmtfZGltX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlyZXR1cm4gYWRwNTUyMF9zaG93KGRldiwgYnVmLCBEQVJLX0RJTSk7CisJcmV0dXJuIGFkcDU1MjBfc2hvdyhkZXYsIGJ1ZiwgQURQNTUyMF9EQVJLX0RJTSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFkcDU1MjBfYmxfZGFya19kaW1fc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JcmV0dXJuIGFkcDU1MjBfc3RvcmUoZGV2LCBidWYsIGNvdW50LCBEQVJLX0RJTSk7CisJcmV0dXJuIGFkcDU1MjBfc3RvcmUoZGV2LCBidWYsIGNvdW50LCBBRFA1NTIwX0RBUktfRElNKTsKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUihkYXJrX2RpbSwgMDY2NCwgYWRwNTUyMF9ibF9kYXJrX2RpbV9zaG93LAogCQkJYWRwNTUyMF9ibF9kYXJrX2RpbV9zdG9yZSk7CkBAIC0yMTgsMjkgKzIzNSwyOSBAQAogc3RhdGljIHNzaXplX3QgYWRwNTUyMF9ibF9vZmZpY2VfZGltX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlyZXR1cm4gYWRwNTUyMF9zaG93KGRldiwgYnVmLCBPRkZJQ0VfRElNKTsKKwlyZXR1cm4gYWRwNTUyMF9zaG93KGRldiwgYnVmLCBBRFA1NTIwX09GRklDRV9ESU0pOwogfQogCiBzdGF0aWMgc3NpemVfdCBhZHA1NTIwX2JsX29mZmljZV9kaW1fc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JcmV0dXJuIGFkcDU1MjBfc3RvcmUoZGV2LCBidWYsIGNvdW50LCBPRkZJQ0VfRElNKTsKKwlyZXR1cm4gYWRwNTUyMF9zdG9yZShkZXYsIGJ1ZiwgY291bnQsIEFEUDU1MjBfT0ZGSUNFX0RJTSk7CiB9CiBzdGF0aWMgREVWSUNFX0FUVFIob2ZmaWNlX2RpbSwgMDY2NCwgYWRwNTUyMF9ibF9vZmZpY2VfZGltX3Nob3csCiAJCQlhZHA1NTIwX2JsX29mZmljZV9kaW1fc3RvcmUpOwogCiBzdGF0aWMgc3NpemVfdCBhZHA1NTIwX2JsX2RheWxpZ2h0X2RpbV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXJldHVybiBhZHA1NTIwX3Nob3coZGV2LCBidWYsIERBWUxJR0hUX0RJTSk7CisJcmV0dXJuIGFkcDU1MjBfc2hvdyhkZXYsIGJ1ZiwgQURQNTUyMF9EQVlMSUdIVF9ESU0pOwogfQogCiBzdGF0aWMgc3NpemVfdCBhZHA1NTIwX2JsX2RheWxpZ2h0X2RpbV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlyZXR1cm4gYWRwNTUyMF9zdG9yZShkZXYsIGJ1ZiwgY291bnQsIERBWUxJR0hUX0RJTSk7CisJcmV0dXJuIGFkcDU1MjBfc3RvcmUoZGV2LCBidWYsIGNvdW50LCBBRFA1NTIwX0RBWUxJR0hUX0RJTSk7CiB9CiBzdGF0aWMgREVWSUNFX0FUVFIoZGF5bGlnaHRfZGltLCAwNjY0LCBhZHA1NTIwX2JsX2RheWxpZ2h0X2RpbV9zaG93LAogCQkJYWRwNTUyMF9ibF9kYXlsaWdodF9kaW1fc3RvcmUpOwpAQCAtMzE2LDcgKzMzMyw3IEBACiAJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IGFkcDU1MjBfYmwgKmRhdGEgPSBibF9nZXRfZGF0YShibCk7CiAKLQlhZHA1NTIwX2Nscl9iaXRzKGRhdGEtPm1hc3RlciwgTU9ERV9TVEFUVVMsIEJMX0VOKTsKKwlhZHA1NTIwX2Nscl9iaXRzKGRhdGEtPm1hc3RlciwgQURQNTUyMF9NT0RFX1NUQVRVUywgQURQNTUyMF9CTF9FTik7CiAKIAlpZiAoZGF0YS0+cGRhdGEtPmVuX2FtYmxfc2VucykKIAkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZibC0+ZGV2LmtvYmosCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29mZmIuYyBiL2RyaXZlcnMvdmlkZW8vb2ZmYi5jCmluZGV4IDRkOGM1NGMuLmIwNDNhYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb2ZmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb2ZmYi5jCkBAIC0yODIsOCArMjgyLDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIG9mZmJfZGVzdHJveShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlpZiAoaW5mby0+c2NyZWVuX2Jhc2UpCisJCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihpbmZvLT5hcGVydHVyZV9iYXNlLCBpbmZvLT5hcGVydHVyZV9zaXplKTsKKwlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOworfQorCiBzdGF0aWMgc3RydWN0IGZiX29wcyBvZmZiX29wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmZiX2Rlc3Ryb3kJPSBvZmZiX2Rlc3Ryb3ksCiAJLmZiX3NldGNvbHJlZwk9IG9mZmJfc2V0Y29scmVnLAogCS5mYl9zZXRfcGFyCT0gb2ZmYl9zZXRfcGFyLAogCS5mYl9ibGFuawk9IG9mZmJfYmxhbmssCkBAIC00ODIsMTAgKzQ5MSwxNCBAQAogCXZhci0+c3luYyA9IDA7CiAJdmFyLT52bW9kZSA9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQ7CiAKKwkvKiBzZXQgb2ZmYiBhcGVydHVyZSBzaXplIGZvciBnZW5lcmljIHByb2JpbmcgKi8KKwlpbmZvLT5hcGVydHVyZV9iYXNlID0gYWRkcmVzczsKKwlpbmZvLT5hcGVydHVyZV9zaXplID0gZml4LT5zbWVtX2xlbjsKKwogCWluZm8tPmZib3BzID0gJm9mZmJfb3BzOwogCWluZm8tPnNjcmVlbl9iYXNlID0gaW9yZW1hcChhZGRyZXNzLCBmaXgtPnNtZW1fbGVuKTsKIAlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9ICh2b2lkICopIChpbmZvICsgMSk7Ci0JaW5mby0+ZmxhZ3MgPSBGQklORk9fREVGQVVMVCB8IGZvcmVpZ25fZW5kaWFuOworCWluZm8tPmZsYWdzID0gRkJJTkZPX0RFRkFVTFQgfCBGQklORk9fTUlTQ19GSVJNV0FSRSB8IGZvcmVpZ25fZW5kaWFuOwogCiAJZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwgMjU2LCAwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF8yNDMwc2RwLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkXzI0MzBzZHAuYwppbmRleCA3NjA2NDVkLi5lM2VjY2M5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkXzI0MzBzZHAuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkXzI0MzBzZHAuYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy90d2w0MDMwLmg+CisjaW5jbHVkZSA8bGludXgvaTJjL3R3bC5oPgogCiAjaW5jbHVkZSA8cGxhdC9tdXguaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgpAQCAtNTIsNyArNTIsNyBAQAogI2RlZmluZSBUV0w0MDMwX1ZQTEwyX0RFVl9HUlAgICAgICAgICAgIDB4MzMKICNkZWZpbmUgVFdMNDAzMF9WUExMMl9ERURJQ0FURUQgICAgICAgICAweDM2CiAKLSNkZWZpbmUgdDJfb3V0KGMsIHIsIHYpIHR3bDQwMzBfaTJjX3dyaXRlX3U4KGMsIHIsIHYpCisjZGVmaW5lIHQyX291dChjLCByLCB2KSB0d2xfaTJjX3dyaXRlX3U4KGMsIHIsIHYpCiAKIAogc3RhdGljIGludCBzZHAyNDMwX3BhbmVsX2luaXQoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkYy5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZGMuYwppbmRleCBiODMxZTFkLi5hMzM0ODM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkYy5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RjLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAKKyNpbmNsdWRlIDxtYWNoL2xjZGMuaD4KICNpbmNsdWRlIDxwbGF0L2RtYS5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KQEAgLTM5LDM4ICs0MCw2IEBACiAKICNkZWZpbmUgTU9EVUxFX05BTUUJCQkibGNkYyIKIAotI2RlZmluZSBPTUFQX0xDRENfQkFTRQkJCTB4ZmZmZWMwMDAKLSNkZWZpbmUgT01BUF9MQ0RDX1NJWkUJCQkyNTYKLSNkZWZpbmUgT01BUF9MQ0RDX0lSUQkJCUlOVF9MQ0RfQ1RSTAotCi0jZGVmaW5lIE9NQVBfTENEQ19DT05UUk9MCQkoT01BUF9MQ0RDX0JBU0UgKyAweDAwKQotI2RlZmluZSBPTUFQX0xDRENfVElNSU5HMAkJKE9NQVBfTENEQ19CQVNFICsgMHgwNCkKLSNkZWZpbmUgT01BUF9MQ0RDX1RJTUlORzEJCShPTUFQX0xDRENfQkFTRSArIDB4MDgpCi0jZGVmaW5lIE9NQVBfTENEQ19USU1JTkcyCQkoT01BUF9MQ0RDX0JBU0UgKyAweDBjKQotI2RlZmluZSBPTUFQX0xDRENfU1RBVFVTCQkoT01BUF9MQ0RDX0JBU0UgKyAweDEwKQotI2RlZmluZSBPTUFQX0xDRENfU1VCUEFORUwJCShPTUFQX0xDRENfQkFTRSArIDB4MTQpCi0jZGVmaW5lIE9NQVBfTENEQ19MSU5FX0lOVAkJKE9NQVBfTENEQ19CQVNFICsgMHgxOCkKLSNkZWZpbmUgT01BUF9MQ0RDX0RJU1BMQVlfU1RBVFVTCShPTUFQX0xDRENfQkFTRSArIDB4MWMpCi0KLSNkZWZpbmUgT01BUF9MQ0RDX1NUQVRfRE9ORQkJKDEgPDwgMCkKLSNkZWZpbmUgT01BUF9MQ0RDX1NUQVRfVlNZTkMJCSgxIDw8IDEpCi0jZGVmaW5lIE9NQVBfTENEQ19TVEFUX1NZTkNfTE9TVAkoMSA8PCAyKQotI2RlZmluZSBPTUFQX0xDRENfU1RBVF9BQkMJCSgxIDw8IDMpCi0jZGVmaW5lIE9NQVBfTENEQ19TVEFUX0xJTkVfSU5UCQkoMSA8PCA0KQotI2RlZmluZSBPTUFQX0xDRENfU1RBVF9GVUYJCSgxIDw8IDUpCi0jZGVmaW5lIE9NQVBfTENEQ19TVEFUX0xPQURFRF9QQUxFVFRFCSgxIDw8IDYpCi0KLSNkZWZpbmUgT01BUF9MQ0RDX0NUUkxfTENEX0VOCQkoMSA8PCAwKQotI2RlZmluZSBPTUFQX0xDRENfQ1RSTF9MQ0RfVEZUCQkoMSA8PCA3KQotI2RlZmluZSBPTUFQX0xDRENfQ1RSTF9MSU5FX0lSUV9DTFJfU0VMCSgxIDw8IDEwKQotCi0jZGVmaW5lIE9NQVBfTENEQ19JUlFfVlNZTkMJCSgxIDw8IDIpCi0jZGVmaW5lIE9NQVBfTENEQ19JUlFfRE9ORQkJKDEgPDwgMykKLSNkZWZpbmUgT01BUF9MQ0RDX0lSUV9MT0FERURfUEFMRVRURQkoMSA8PCA0KQotI2RlZmluZSBPTUFQX0xDRENfSVJRX0xJTkVfTklSUQkJKDEgPDwgNSkKLSNkZWZpbmUgT01BUF9MQ0RDX0lSUV9MSU5FCQkoMSA8PCA2KQotI2RlZmluZSBPTUFQX0xDRENfSVJRX01BU0sJCSgoKDEgPDwgNSkgLSAxKSA8PCAyKQotCiAjZGVmaW5lIE1BWF9QQUxFVFRFX1NJWkUJCVBBR0VfU0laRQogCiBlbnVtIGxjZGNfbG9hZF9tb2RlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8veGVuLWZiZnJvbnQuYyBiL2RyaXZlcnMvdmlkZW8veGVuLWZiZnJvbnQuYwppbmRleCA5MWE2OGU5Li42MDM1OThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3hlbi1mYmZyb250LmMKKysrIGIvZHJpdmVycy92aWRlby94ZW4tZmJmcm9udC5jCkBAIC0yNSw3ICsyNSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorCiAjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcnZpc29yLmg+CisKKyNpbmNsdWRlIDx4ZW4veGVuLmg+CiAjaW5jbHVkZSA8eGVuL2V2ZW50cy5oPgogI2luY2x1ZGUgPHhlbi9wYWdlLmg+CiAjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS9pby9mYmlmLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL0tjb25maWcgYi9kcml2ZXJzL3dhdGNoZG9nL0tjb25maWcKaW5kZXggMzcxMWI4OC4uZDk1OGI3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZwpAQCAtODYxLDggKzg2MSwxMCBAQAogCSAgV2F0Y2hkb2cgdGltZXIgZm91bmQgaW4gYSBudW1iZXIgb2YgR0UgRmFudWMgc2luZ2xlIGJvYXJkIGNvbXB1dGVycy4KIAogY29uZmlnIE1QQzUyMDBfV0RUCi0JdHJpc3RhdGUgIk1QQzUyMDAgV2F0Y2hkb2cgVGltZXIiCisJYm9vbCAiTVBDNTJ4eCBXYXRjaGRvZyBUaW1lciIKIAlkZXBlbmRzIG9uIFBQQ19NUEM1Mnh4CisJaGVscAorCSAgVXNlIEdlbmVyYWwgUHVycG9zZSBUaW1lciAoR1BUKSAwIG9uIHRoZSBNUEM1MjAwIGFzIFdhdGNoZG9nLgogCiBjb25maWcgOHh4eF9XRFQKIAl0cmlzdGF0ZSAiTVBDOHh4eCBQbGF0Zm9ybSBXYXRjaGRvZyBUaW1lciIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvTWFrZWZpbGUgYi9kcml2ZXJzL3dhdGNoZG9nL01ha2VmaWxlCmluZGV4IDY5OTE5OWIuLjg5YzA0NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvTWFrZWZpbGUKKysrIGIvZHJpdmVycy93YXRjaGRvZy9NYWtlZmlsZQpAQCAtMTE4LDcgKzExOCw2IEBACiAKICMgUE9XRVJQQyBBcmNoaXRlY3R1cmUKIG9iai0kKENPTkZJR19HRUZfV0RUKSArPSBnZWZfd2R0Lm8KLW9iai0kKENPTkZJR19NUEM1MjAwX1dEVCkgKz0gbXBjNTIwMF93ZHQubwogb2JqLSQoQ09ORklHXzh4eHhfV0RUKSArPSBtcGM4eHh4X3dkdC5vCiBvYmotJChDT05GSUdfTVY2NFg2MF9XRFQpICs9IG12NjR4NjBfd2R0Lm8KIG9iai0kKENPTkZJR19QSUtBX1dEVCkgKz0gcGlrYV93ZHQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9tcGM1MjAwX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9tcGM1MjAwX3dkdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTljNDdjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvbXBjNTIwMF93ZHQuYworKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vbXBjNTJ4eC5oPgotCi0KLSNkZWZpbmUgR1BUX01PREVfV0RUCQkoMSA8PCAxNSkKLSNkZWZpbmUgR1BUX01PREVfQ0UJCSgxIDw8IDEyKQotI2RlZmluZSBHUFRfTU9ERV9NU19USU1FUgkoMHg0KQotCi0KLXN0cnVjdCBtcGM1MjAwX3dkdCB7Ci0JdW5zaWduZWQgY291bnQ7CS8qIHRpbWVyIHRpY2tzIGJlZm9yZSB3YXRjaGRvZyBraWNrcyBpbiAqLwotCWxvbmcgaXBiX2ZyZXE7Ci0Jc3RydWN0IG1pc2NkZXZpY2UgbWlzY2RldjsKLQlzdHJ1Y3QgcmVzb3VyY2UgbWVtOwotCXN0cnVjdCBtcGM1Mnh4X2dwdCBfX2lvbWVtICpyZWdzOwotCXNwaW5sb2NrX3QgaW9fbG9jazsKLX07Ci0KLS8qIGlzX2FjdGl2ZSBzdG9yZXMgd2V0aGVyIG9yIG5vdCB0aGUgL2Rldi93YXRjaGRvZyBkZXZpY2UgaXMgb3BlbmVkICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBpc19hY3RpdmU7Ci0KLS8qIG1pc2MgZGV2aWNlcyBkb24ndCBwcm92aWRlIGEgd2F5LCB0byBnZXQgYmFjayB0byAnZGV2JyBvciAnbWlzY2RldicgZnJvbQotICogZmlsZSBvcGVyYXRpb25zLCB3aGljaCBzdWNrcy4gQnV0IHRoZXJlIGNhbiBiZSBtYXggMSB3YXRjaGRvZyBhbnl3YXksIHNvLi4uCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbXBjNTIwMF93ZHQgKndkdF9nbG9iYWw7Ci0KLQotLyogaGVscGVyIHRvIGNhbGN1bGF0ZSB0aW1lb3V0IGluIHRpbWVyIGNvdW50cyAqLwotc3RhdGljIHZvaWQgbXBjNTIwMF93ZHRfc2V0X3RpbWVvdXQoc3RydWN0IG1wYzUyMDBfd2R0ICp3ZHQsIGludCB0aW1lb3V0KQotewotCS8qIHVzZSBiaWdnZXN0IHByZXNjYWxlciBvZiA2NGsgKi8KLQl3ZHQtPmNvdW50ID0gKHdkdC0+aXBiX2ZyZXEgKyAweGZmZmYpIC8gMHgxMDAwMCAqIHRpbWVvdXQ7Ci0KLQlpZiAod2R0LT5jb3VudCA+IDB4ZmZmZikKLQkJd2R0LT5jb3VudCA9IDB4ZmZmZjsKLX0KLS8qIHJldHVybiB0aW1lb3V0IGluIHNlY29uZHMgKGNhbGN1bGF0ZWQgZnJvbSB0aW1lciBjb3VudCkgKi8KLXN0YXRpYyBpbnQgbXBjNTIwMF93ZHRfZ2V0X3RpbWVvdXQoc3RydWN0IG1wYzUyMDBfd2R0ICp3ZHQpCi17Ci0JcmV0dXJuIHdkdC0+Y291bnQgKiAweDEwMDAwIC8gd2R0LT5pcGJfZnJlcTsKLX0KLQotCi0vKiB3YXRjaGRvZyBvcGVyYXRpb25zICovCi1zdGF0aWMgaW50IG1wYzUyMDBfd2R0X3N0YXJ0KHN0cnVjdCBtcGM1MjAwX3dkdCAqd2R0KQotewotCXNwaW5fbG9jaygmd2R0LT5pb19sb2NrKTsKLQkvKiBkaXNhYmxlICovCi0Jb3V0X2JlMzIoJndkdC0+cmVncy0+bW9kZSwgMCk7Ci0JLyogc2V0IHRpbWVvdXQsIHdpdGggbWF4aW11bSBwcmVzY2FsZXIgKi8KLQlvdXRfYmUzMigmd2R0LT5yZWdzLT5jb3VudCwgMHgwIHwgd2R0LT5jb3VudCk7Ci0JLyogZW5hYmxlIHdhdGNoZG9nICovCi0Jb3V0X2JlMzIoJndkdC0+cmVncy0+bW9kZSwgR1BUX01PREVfQ0UgfCBHUFRfTU9ERV9XRFQgfAotCQkJCQkJR1BUX01PREVfTVNfVElNRVIpOwotCXNwaW5fdW5sb2NrKCZ3ZHQtPmlvX2xvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW50IG1wYzUyMDBfd2R0X3Bpbmcoc3RydWN0IG1wYzUyMDBfd2R0ICp3ZHQpCi17Ci0Jc3Bpbl9sb2NrKCZ3ZHQtPmlvX2xvY2spOwotCS8qIHdyaXRpbmcgQTUgdG8gT0NQVyByZXNldHMgdGhlIHdhdGNoZG9nICovCi0Jb3V0X2JlMzIoJndkdC0+cmVncy0+bW9kZSwgMHhBNTAwMDAwMCB8Ci0JCQkJKDB4ZmZmZmZmICYgaW5fYmUzMigmd2R0LT5yZWdzLT5tb2RlKSkpOwotCXNwaW5fdW5sb2NrKCZ3ZHQtPmlvX2xvY2spOwotCXJldHVybiAwOwotfQotc3RhdGljIGludCBtcGM1MjAwX3dkdF9zdG9wKHN0cnVjdCBtcGM1MjAwX3dkdCAqd2R0KQotewotCXNwaW5fbG9jaygmd2R0LT5pb19sb2NrKTsKLQkvKiBkaXNhYmxlICovCi0Jb3V0X2JlMzIoJndkdC0+cmVncy0+bW9kZSwgMCk7Ci0Jc3Bpbl91bmxvY2soJndkdC0+aW9fbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotLyogZmlsZSBvcGVyYXRpb25zICovCi1zdGF0aWMgc3NpemVfdCBtcGM1MjAwX3dkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmRhdGEsCi0JCXNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgbXBjNTIwMF93ZHQgKndkdCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQltcGM1MjAwX3dkdF9waW5nKHdkdCk7Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gbXBjNTIwMF93ZHRfaW5mbyA9IHsKLQkub3B0aW9ucwk9IFdESU9GX1NFVFRJTUVPVVQgfCBXRElPRl9LRUVQQUxJVkVQSU5HLAotCS5pZGVudGl0eQk9ICJtcGM1MjAwIHdhdGNoZG9nIG9uIEdQVDAiLAotfTsKLXN0YXRpYyBsb25nIG1wYzUyMDBfd2R0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBtcGM1MjAwX3dkdCAqd2R0ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCBfX3VzZXIgKmRhdGEgPSAoaW50IF9fdXNlciAqKWFyZzsKLQlpbnQgdGltZW91dDsKLQlpbnQgcmV0ID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBXRElPQ19HRVRTVVBQT1JUOgotCQlyZXQgPSBjb3B5X3RvX3VzZXIoZGF0YSwgJm1wYzUyMDBfd2R0X2luZm8sCi0JCQkJCQlzaXplb2YobXBjNTIwMF93ZHRfaW5mbykpOwotCQlpZiAocmV0KQotCQkJcmV0ID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0KLQljYXNlIFdESU9DX0dFVFNUQVRVUzoKLQljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6Ci0JCXJldCA9IHB1dF91c2VyKDAsIGRhdGEpOwotCQlicmVhazsKLQotCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgotCQltcGM1MjAwX3dkdF9waW5nKHdkdCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBXRElPQ19TRVRUSU1FT1VUOgotCQlyZXQgPSBnZXRfdXNlcih0aW1lb3V0LCBkYXRhKTsKLQkJaWYgKHJldCkKLQkJCWJyZWFrOwotCQltcGM1MjAwX3dkdF9zZXRfdGltZW91dCh3ZHQsIHRpbWVvdXQpOwotCQltcGM1MjAwX3dkdF9zdGFydCh3ZHQpOwotCQkvKiBmYWxsIHRocm91Z2ggYW5kIHJldHVybiB0aGUgdGltZW91dCAqLwotCi0JY2FzZSBXRElPQ19HRVRUSU1FT1VUOgotCQl0aW1lb3V0ID0gbXBjNTIwMF93ZHRfZ2V0X3RpbWVvdXQod2R0KTsKLQkJcmV0ID0gcHV0X3VzZXIodGltZW91dCwgZGF0YSk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0ID0gLUVOT1RUWTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtcGM1MjAwX3dkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCS8qIC9kZXYvd2F0Y2hkb2cgY2FuIG9ubHkgYmUgb3BlbmVkIG9uY2UgKi8KLQlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmaXNfYWN0aXZlKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCS8qIFNldCBhbmQgYWN0aXZhdGUgdGhlIHdhdGNoZG9nICovCi0JbXBjNTIwMF93ZHRfc2V0X3RpbWVvdXQod2R0X2dsb2JhbCwgMzApOwotCW1wYzUyMDBfd2R0X3N0YXJ0KHdkdF9nbG9iYWwpOwotCWZpbGUtPnByaXZhdGVfZGF0YSA9IHdkdF9nbG9iYWw7Ci0JcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwotfQotc3RhdGljIGludCBtcGM1MjAwX3dkdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotI2lmIFdBVENIRE9HX05PV0FZT1VUID09IDAKLQlzdHJ1Y3QgbXBjNTIwMF93ZHQgKndkdCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQltcGM1MjAwX3dkdF9zdG9wKHdkdCk7Ci0Jd2R0LT5jb3VudCA9IDA7CQkvKiA9PSBkaXNhYmxlZCAqLwotI2VuZGlmCi0JY2xlYXJfYml0KDAsICZpc19hY3RpdmUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtcGM1MjAwX3dkdF9mb3BzID0gewotCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCS53cml0ZQk9IG1wYzUyMDBfd2R0X3dyaXRlLAotCS51bmxvY2tlZF9pb2N0bAk9IG1wYzUyMDBfd2R0X2lvY3RsLAotCS5vcGVuCT0gbXBjNTIwMF93ZHRfb3BlbiwKLQkucmVsZWFzZSA9IG1wYzUyMDBfd2R0X3JlbGVhc2UsCi19OwotCi0vKiBtb2R1bGUgb3BlcmF0aW9ucyAqLwotc3RhdGljIGludCBtcGM1MjAwX3dkdF9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwKLQkJCQkJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCi17Ci0Jc3RydWN0IG1wYzUyMDBfd2R0ICp3ZHQ7Ci0JaW50IGVycjsKLQljb25zdCB2b2lkICpoYXNfd2R0OwotCWludCBzaXplOwotCi0JaGFzX3dkdCA9IG9mX2dldF9wcm9wZXJ0eShvcC0+bm9kZSwgImhhcy13ZHQiLCBOVUxMKTsKLQlpZiAoIWhhc193ZHQpCi0JCWhhc193ZHQgPSBvZl9nZXRfcHJvcGVydHkob3AtPm5vZGUsICJmc2wsaGFzLXdkdCIsIE5VTEwpOwotCWlmICghaGFzX3dkdCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQl3ZHQgPSBremFsbG9jKHNpemVvZigqd2R0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF3ZHQpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jd2R0LT5pcGJfZnJlcSA9IG1wYzV4eHhfZ2V0X2J1c19mcmVxdWVuY3kob3AtPm5vZGUpOwotCi0JZXJyID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShvcC0+bm9kZSwgMCwgJndkdC0+bWVtKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dF9mcmVlOwotCXNpemUgPSB3ZHQtPm1lbS5lbmQgLSB3ZHQtPm1lbS5zdGFydCArIDE7Ci0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24od2R0LT5tZW0uc3RhcnQsIHNpemUsICJtcGM1MjAwX3dkdCIpKSB7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0X2ZyZWU7Ci0JfQotCXdkdC0+cmVncyA9IGlvcmVtYXAod2R0LT5tZW0uc3RhcnQsIHNpemUpOwotCWlmICghd2R0LT5yZWdzKSB7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0X3JlbGVhc2U7Ci0JfQotCi0JZGV2X3NldF9kcnZkYXRhKCZvcC0+ZGV2LCB3ZHQpOwotCXNwaW5fbG9ja19pbml0KCZ3ZHQtPmlvX2xvY2spOwotCi0Jd2R0LT5taXNjZGV2ID0gKHN0cnVjdCBtaXNjZGV2aWNlKSB7Ci0JCS5taW5vcgk9IFdBVENIRE9HX01JTk9SLAotCQkubmFtZQk9ICJ3YXRjaGRvZyIsCi0JCS5mb3BzCT0gJm1wYzUyMDBfd2R0X2ZvcHMsCi0JCS5wYXJlbnQgPSAmb3AtPmRldiwKLQl9OwotCXdkdF9nbG9iYWwgPSB3ZHQ7Ci0JZXJyID0gbWlzY19yZWdpc3Rlcigmd2R0LT5taXNjZGV2KTsKLQlpZiAoIWVycikKLQkJcmV0dXJuIDA7Ci0KLQlpb3VubWFwKHdkdC0+cmVncyk7Ci1vdXRfcmVsZWFzZToKLQlyZWxlYXNlX21lbV9yZWdpb24od2R0LT5tZW0uc3RhcnQsIHNpemUpOwotb3V0X2ZyZWU6Ci0Ja2ZyZWUod2R0KTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IG1wYzUyMDBfd2R0X3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCkKLXsKLQlzdHJ1Y3QgbXBjNTIwMF93ZHQgKndkdCA9IGRldl9nZXRfZHJ2ZGF0YSgmb3AtPmRldik7Ci0KLQltcGM1MjAwX3dkdF9zdG9wKHdkdCk7Ci0JbWlzY19kZXJlZ2lzdGVyKCZ3ZHQtPm1pc2NkZXYpOwotCWlvdW5tYXAod2R0LT5yZWdzKTsKLQlyZWxlYXNlX21lbV9yZWdpb24od2R0LT5tZW0uc3RhcnQsIHdkdC0+bWVtLmVuZCAtIHdkdC0+bWVtLnN0YXJ0ICsgMSk7Ci0Ja2ZyZWUod2R0KTsKLQotCXJldHVybiAwOwotfQotc3RhdGljIGludCBtcGM1MjAwX3dkdF9zdXNwZW5kKHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0Jc3RydWN0IG1wYzUyMDBfd2R0ICp3ZHQgPSBkZXZfZ2V0X2RydmRhdGEoJm9wLT5kZXYpOwotCW1wYzUyMDBfd2R0X3N0b3Aod2R0KTsKLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBpbnQgbXBjNTIwMF93ZHRfcmVzdW1lKHN0cnVjdCBvZl9kZXZpY2UgKm9wKQotewotCXN0cnVjdCBtcGM1MjAwX3dkdCAqd2R0ID0gZGV2X2dldF9kcnZkYXRhKCZvcC0+ZGV2KTsKLQlpZiAod2R0LT5jb3VudCkKLQkJbXBjNTIwMF93ZHRfc3RhcnQod2R0KTsKLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBpbnQgbXBjNTIwMF93ZHRfc2h1dGRvd24oc3RydWN0IG9mX2RldmljZSAqb3ApCi17Ci0Jc3RydWN0IG1wYzUyMDBfd2R0ICp3ZHQgPSBkZXZfZ2V0X2RydmRhdGEoJm9wLT5kZXYpOwotCW1wYzUyMDBfd2R0X3N0b3Aod2R0KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgbXBjNTIwMF93ZHRfbWF0Y2hbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gIm1wYzUyMDAtZ3B0IiwgfSwKLQl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM1MjAwLWdwdCIsIH0sCi0Je30sCi19Owotc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgbXBjNTIwMF93ZHRfZHJpdmVyID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkubmFtZQkJPSAibXBjNTIwMC1ncHQtd2R0IiwKLQkubWF0Y2hfdGFibGUJPSBtcGM1MjAwX3dkdF9tYXRjaCwKLQkucHJvYmUJCT0gbXBjNTIwMF93ZHRfcHJvYmUsCi0JLnJlbW92ZQkJPSBtcGM1MjAwX3dkdF9yZW1vdmUsCi0JLnN1c3BlbmQJPSBtcGM1MjAwX3dkdF9zdXNwZW5kLAotCS5yZXN1bWUJCT0gbXBjNTIwMF93ZHRfcmVzdW1lLAotCS5zaHV0ZG93bgk9IG1wYzUyMDBfd2R0X3NodXRkb3duLAotfTsKLQotCi1zdGF0aWMgaW50IF9faW5pdCBtcGM1MjAwX3dkdF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmbXBjNTIwMF93ZHRfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IG1wYzUyMDBfd2R0X2V4aXQodm9pZCkKLXsKLQlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmbXBjNTIwMF93ZHRfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQobXBjNTIwMF93ZHRfaW5pdCk7Ci1tb2R1bGVfZXhpdChtcGM1MjAwX3dkdF9leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiRG9tZW4gUHVuY2VyIDxkb21lbi5wdW5jZXJAdGVsYXJnby5jb20+Iik7Ci1NT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7Ci1NT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3R3bDQwMzBfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3R3bDQwMzBfd2R0LmMKaW5kZXggY2I0NjU1Ni4uODE2MmE0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy90d2w0MDMwX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvdHdsNDAzMF93ZHQuYwpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjL3R3bDQwMzAuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvdHdsLmg+CiAKICNkZWZpbmUgVFdMNDAzMF9XQVRDSERPR19DRkdfUkVHX09GRlMJMHgzCiAKQEAgLTQ4LDcgKzQ4LDcgQEAKIAogc3RhdGljIGludCB0d2w0MDMwX3dkdF93cml0ZSh1bnNpZ25lZCBjaGFyIHZhbCkKIHsKLQlyZXR1cm4gdHdsNDAzMF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fUkVDRUlWRVIsIHZhbCwKKwlyZXR1cm4gdHdsX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9SRUNFSVZFUiwgdmFsLAogCQkJCQlUV0w0MDMwX1dBVENIRE9HX0NGR19SRUdfT0ZGUyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL2JhbGxvb24uYyBiL2RyaXZlcnMveGVuL2JhbGxvb24uYwppbmRleCA0MjA0MzM2Li5mNjczOGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9iYWxsb29uLmMKKysrIGIvZHJpdmVycy94ZW4vYmFsbG9vbi5jCkBAIC01Miw2ICs1Miw4IEBACiAKICNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KICNpbmNsdWRlIDxhc20veGVuL2h5cGVyY2FsbC5oPgorCisjaW5jbHVkZSA8eGVuL3hlbi5oPgogI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UveGVuLmg+CiAjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS9tZW1vcnkuaD4KICNpbmNsdWRlIDx4ZW4veGVuYnVzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9jcHVfaG90cGx1Zy5jIGIvZHJpdmVycy94ZW4vY3B1X2hvdHBsdWcuYwppbmRleCAwZjc2NWE5Li4xNGUyZDk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9jcHVfaG90cGx1Zy5jCisrKyBiL2RyaXZlcnMveGVuL2NwdV9ob3RwbHVnLmMKQEAgLTEsNSArMSw2IEBACiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KIAorI2luY2x1ZGUgPHhlbi94ZW4uaD4KICNpbmNsdWRlIDx4ZW4veGVuYnVzLmg+CiAKICNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL2V2dGNobi5jIGIvZHJpdmVycy94ZW4vZXZ0Y2huLmMKaW5kZXggNzliZWRiYS4uZjcwYTRmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vZXZ0Y2huLmMKKysrIGIvZHJpdmVycy94ZW4vZXZ0Y2huLmMKQEAgLTQ4LDYgKzQ4LDggQEAKICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorCisjaW5jbHVkZSA8eGVuL3hlbi5oPgogI2luY2x1ZGUgPHhlbi9ldmVudHMuaD4KICNpbmNsdWRlIDx4ZW4vZXZ0Y2huLmg+CiAjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcnZpc29yLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9ncmFudC10YWJsZS5jIGIvZHJpdmVycy94ZW4vZ3JhbnQtdGFibGUuYwppbmRleCA3ZDhmNTMxLi40YzZjMGJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9ncmFudC10YWJsZS5jCisrKyBiL2RyaXZlcnMveGVuL2dyYW50LXRhYmxlLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCisjaW5jbHVkZSA8eGVuL3hlbi5oPgogI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UveGVuLmg+CiAjaW5jbHVkZSA8eGVuL3BhZ2UuaD4KICNpbmNsdWRlIDx4ZW4vZ3JhbnRfdGFibGUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3N5cy1oeXBlcnZpc29yLmMgYi9kcml2ZXJzL3hlbi9zeXMtaHlwZXJ2aXNvci5jCmluZGV4IDg4YTYwZTAuLmFlNWNiMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL3N5cy1oeXBlcnZpc29yLmMKKysrIGIvZHJpdmVycy94ZW4vc3lzLWh5cGVydmlzb3IuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJ2aXNvci5oPgogI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJjYWxsLmg+CiAKKyNpbmNsdWRlIDx4ZW4veGVuLmg+CiAjaW5jbHVkZSA8eGVuL3hlbmJ1cy5oPgogI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UveGVuLmg+CiAjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS92ZXJzaW9uLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmMgYi9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmMKaW5kZXggNjQ5ZmNkZi4uMmY3YWFhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5jCisrKyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuYwpAQCAtNDksNiArNDksOCBAQAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KKworI2luY2x1ZGUgPHhlbi94ZW4uaD4KICNpbmNsdWRlIDx4ZW4veGVuYnVzLmg+CiAjaW5jbHVkZSA8eGVuL2V2ZW50cy5oPgogI2luY2x1ZGUgPHhlbi9wYWdlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW5mcy9zdXBlci5jIGIvZHJpdmVycy94ZW4veGVuZnMvc3VwZXIuYwppbmRleCA2NTU5ZTBjLi44OTI0ZDkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW5mcy9zdXBlci5jCisrKyBiL2RyaXZlcnMveGVuL3hlbmZzL3N1cGVyLmMKQEAgLTEzLDYgKzEzLDggQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CiAKKyNpbmNsdWRlIDx4ZW4veGVuLmg+CisKICNpbmNsdWRlICJ4ZW5mcy5oIgogCiAjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcnZpc29yLmg+CmRpZmYgLS1naXQgYS9mcy9hZnMvd3JpdGUuYyBiL2ZzL2Fmcy93cml0ZS5jCmluZGV4IGM2M2EzYzguLjVlMTVhMjEgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy93cml0ZS5jCisrKyBiL2ZzL2Fmcy93cml0ZS5jCkBAIC02NzEsNyArNjcxLDYgQEAKIAlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IEFGU19GU19JKGRlbnRyeS0+ZF9pbm9kZSk7CiAJc3NpemVfdCByZXN1bHQ7CiAJc2l6ZV90IGNvdW50ID0gaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOwotCWludCByZXQ7CiAKIAlfZW50ZXIoInsleC4ldX0seyV6dX0sJWx1LCIsCiAJICAgICAgIHZub2RlLT5maWQudmlkLCB2bm9kZS0+ZmlkLnZub2RlLCBjb3VudCwgbnJfc2Vncyk7CkBAIC02OTEsMTMgKzY5MCw2IEBACiAJCXJldHVybiByZXN1bHQ7CiAJfQogCi0JLyogcmV0dXJuIGVycm9yIHZhbHVlcyBmb3IgT19TWU5DIGFuZCBJU19TWU5DKCkgKi8KLQlpZiAoSVNfU1lOQygmdm5vZGUtPnZmc19pbm9kZSkgfHwgaW9jYi0+a2lfZmlscC0+Zl9mbGFncyAmIE9fU1lOQykgewotCQlyZXQgPSBhZnNfZnN5bmMoaW9jYi0+a2lfZmlscCwgZGVudHJ5LCAxKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXN1bHQgPSByZXQ7Ci0JfQotCiAJX2xlYXZlKCIgPSAlemQiLCByZXN1bHQpOwogCXJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQgYS9mcy9idHJmcy9maWxlLmMgYi9mcy9idHJmcy9maWxlLmMKaW5kZXggMDY1NTBhZi4uNzdmNzU5MyAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZmlsZS5jCisrKyBiL2ZzL2J0cmZzL2ZpbGUuYwpAQCAtOTA5LDcgKzkwOSw3IEBACiAJdW5zaWduZWQgbG9uZyBsYXN0X2luZGV4OwogCWludCB3aWxsX3dyaXRlOwogCi0Jd2lsbF93cml0ZSA9ICgoZmlsZS0+Zl9mbGFncyAmIE9fU1lOQykgfHwgSVNfU1lOQyhpbm9kZSkgfHwKKwl3aWxsX3dyaXRlID0gKChmaWxlLT5mX2ZsYWdzICYgT19EU1lOQykgfHwgSVNfU1lOQyhpbm9kZSkgfHwKIAkJICAgICAgKGZpbGUtPmZfZmxhZ3MgJiBPX0RJUkVDVCkpOwogCiAJbnJwdHJzID0gbWluKChjb3VudCArIFBBR0VfQ0FDSEVfU0laRSAtIDEpIC8gUEFHRV9DQUNIRV9TSVpFLApAQCAtMTA3Niw3ICsxMDc2LDcgQEAKIAkJaWYgKGVycikKIAkJCW51bV93cml0dGVuID0gZXJyOwogCi0JCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fU1lOQykgfHwgSVNfU1lOQyhpbm9kZSkpIHsKKwkJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19EU1lOQykgfHwgSVNfU1lOQyhpbm9kZSkpIHsKIAkJCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMSk7CiAJCQlyZXQgPSBidHJmc19sb2dfZGVudHJ5X3NhZmUodHJhbnMsIHJvb3QsCiAJCQkJCQkgICAgZmlsZS0+Zl9kZW50cnkpOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9kaXIuYyBiL2ZzL2NpZnMvZGlyLmMKaW5kZXggMWY0MmY3Ny4uNmNjZjcyNiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9kaXIuYworKysgYi9mcy9jaWZzL2Rpci5jCkBAIC0yMTQsNyArMjE0LDggQEAKIAkJcG9zaXhfZmxhZ3MgfD0gU01CX09fRVhDTDsKIAlpZiAob2ZsYWdzICYgT19UUlVOQykKIAkJcG9zaXhfZmxhZ3MgfD0gU01CX09fVFJVTkM7Ci0JaWYgKG9mbGFncyAmIE9fU1lOQykKKwkvKiBiZSBzYWZlIGFuZCBpbXBseSBPX1NZTkMgZm9yIE9fRFNZTkMgKi8KKwlpZiAob2ZsYWdzICYgT19EU1lOQykKIAkJcG9zaXhfZmxhZ3MgfD0gU01CX09fU1lOQzsKIAlpZiAob2ZsYWdzICYgT19ESVJFQ1RPUlkpCiAJCXBvc2l4X2ZsYWdzIHw9IFNNQl9PX0RJUkVDVE9SWTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvZmlsZS5jIGIvZnMvY2lmcy9maWxlLmMKaW5kZXggNDI5MzM3ZS4uMDU3ZTFkYSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9maWxlLmMKKysrIGIvZnMvY2lmcy9maWxlLmMKQEAgLTc2LDggKzc2LDEwIEBACiAJICAgcmVvcGVuaW5nIGEgZmlsZS4gIFRoZXkgaGFkIHRoZWlyIGVmZmVjdCBvbiB0aGUgb3JpZ2luYWwgb3BlbiAqLwogCWlmIChmbGFncyAmIE9fQVBQRU5EKQogCQlwb3NpeF9mbGFncyB8PSAoZm1vZGVfdClPX0FQUEVORDsKLQlpZiAoZmxhZ3MgJiBPX1NZTkMpCi0JCXBvc2l4X2ZsYWdzIHw9IChmbW9kZV90KU9fU1lOQzsKKwlpZiAoZmxhZ3MgJiBPX0RTWU5DKQorCQlwb3NpeF9mbGFncyB8PSAoZm1vZGVfdClPX0RTWU5DOworCWlmIChmbGFncyAmIF9fT19TWU5DKQorCQlwb3NpeF9mbGFncyB8PSAoZm1vZGVfdClfX09fU1lOQzsKIAlpZiAoZmxhZ3MgJiBPX0RJUkVDVE9SWSkKIAkJcG9zaXhfZmxhZ3MgfD0gKGZtb2RlX3QpT19ESVJFQ1RPUlk7CiAJaWYgKGZsYWdzICYgT19OT0ZPTExPVykKZGlmZiAtLWdpdCBhL2ZzL2NvbXBhdF9pb2N0bC5jIGIvZnMvY29tcGF0X2lvY3RsLmMKaW5kZXggMjM0Njg5NS4uMTRjYmM4MyAxMDA2NDQKLS0tIGEvZnMvY29tcGF0X2lvY3RsLmMKKysrIGIvZnMvY29tcGF0X2lvY3RsLmMKQEAgLTExMSw0MyArMTExLDQwIEBACiAjaW5jbHVkZSA8bGludXgvZHZiL2Zyb250ZW5kLmg+CiAjaW5jbHVkZSA8bGludXgvZHZiL3ZpZGVvLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9zb3J0Lmg+CisKICNpZmRlZiBDT05GSUdfU1BBUkMKICNpbmNsdWRlIDxhc20vZmJpby5oPgogI2VuZGlmCiAKLXN0YXRpYyBpbnQgZG9faW9jdGwzMl9wb2ludGVyKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3QgZmlsZSAqZikKLXsKLQlyZXR1cm4gc3lzX2lvY3RsKGZkLCBjbWQsICh1bnNpZ25lZCBsb25nKWNvbXBhdF9wdHIoYXJnKSk7Ci19Ci0KLXN0YXRpYyBpbnQgd19sb25nKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgaW50IHdfbG9uZyh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsCisJCWNvbXBhdF91bG9uZ190IF9fdXNlciAqYXJncCkKIHsKIAltbV9zZWdtZW50X3Qgb2xkX2ZzID0gZ2V0X2ZzKCk7CiAJaW50IGVycjsKIAl1bnNpZ25lZCBsb25nIHZhbDsKLQkKKwogCXNldF9mcyAoS0VSTkVMX0RTKTsKIAllcnIgPSBzeXNfaW9jdGwoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpJnZhbCk7CiAJc2V0X2ZzIChvbGRfZnMpOwotCWlmICghZXJyICYmIHB1dF91c2VyKHZhbCwgKHUzMiBfX3VzZXIgKiljb21wYXRfcHRyKGFyZykpKQorCWlmICghZXJyICYmIHB1dF91c2VyKHZhbCwgYXJncCkpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiBlcnI7CiB9Ci0gCi1zdGF0aWMgaW50IHJ3X2xvbmcodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKKworc3RhdGljIGludCByd19sb25nKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwKKwkJY29tcGF0X3Vsb25nX3QgX191c2VyICphcmdwKQogewogCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKLQl1MzIgX191c2VyICphcmdwdHIgPSBjb21wYXRfcHRyKGFyZyk7CiAJaW50IGVycjsKIAl1bnNpZ25lZCBsb25nIHZhbDsKLQkKLQlpZihnZXRfdXNlcih2YWwsIGFyZ3B0cikpCisKKwlpZihnZXRfdXNlcih2YWwsIGFyZ3ApKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlzZXRfZnMgKEtFUk5FTF9EUyk7CiAJZXJyID0gc3lzX2lvY3RsKGZkLCBjbWQsICh1bnNpZ25lZCBsb25nKSZ2YWwpOwogCXNldF9mcyAob2xkX2ZzKTsKLQlpZiAoIWVyciAmJiBwdXRfdXNlcih2YWwsIGFyZ3B0cikpCisJaWYgKCFlcnIgJiYgcHV0X3VzZXIodmFsLCBhcmdwKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTE2MSw3ICsxNTgsOCBAQAogCX0gdTsKIH07CiAKLXN0YXRpYyBpbnQgZG9fdmlkZW9fZ2V0X2V2ZW50KHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgaW50IGRvX3ZpZGVvX2dldF9ldmVudCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsCisJCXN0cnVjdCBjb21wYXRfdmlkZW9fZXZlbnQgX191c2VyICp1cCkKIHsKIAlzdHJ1Y3QgdmlkZW9fZXZlbnQga2V2ZW50OwogCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKQEAgLTE3Miw4ICsxNzAsNiBAQAogCXNldF9mcyhvbGRfZnMpOwogCiAJaWYgKCFlcnIpIHsKLQkJc3RydWN0IGNvbXBhdF92aWRlb19ldmVudCBfX3VzZXIgKnVwID0gY29tcGF0X3B0cihhcmcpOwotCiAJCWVyciAgPSBwdXRfdXNlcihrZXZlbnQudHlwZSwgJnVwLT50eXBlKTsKIAkJZXJyIHw9IHB1dF91c2VyKGtldmVudC50aW1lc3RhbXAsICZ1cC0+dGltZXN0YW1wKTsKIAkJZXJyIHw9IHB1dF91c2VyKGtldmVudC51LnNpemUudywgJnVwLT51LnNpemUudyk7CkBAIC0xOTIsMTUgKzE4OCwxNCBAQAogICAgICAgICBpbnQzMl90IHNpemU7CiB9OwogCi1zdGF0aWMgaW50IGRvX3ZpZGVvX3N0aWxscGljdHVyZSh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCBkb192aWRlb19zdGlsbHBpY3R1cmUodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLAorCXN0cnVjdCBjb21wYXRfdmlkZW9fc3RpbGxfcGljdHVyZSBfX3VzZXIgKnVwKQogewotCXN0cnVjdCBjb21wYXRfdmlkZW9fc3RpbGxfcGljdHVyZSBfX3VzZXIgKnVwOwogCXN0cnVjdCB2aWRlb19zdGlsbF9waWN0dXJlIF9fdXNlciAqdXBfbmF0aXZlOwogCWNvbXBhdF91cHRyX3QgZnA7CiAJaW50MzJfdCBzaXplOwogCWludCBlcnI7CiAKLQl1cCA9IChzdHJ1Y3QgY29tcGF0X3ZpZGVvX3N0aWxsX3BpY3R1cmUgX191c2VyICopIGFyZzsKIAllcnIgID0gZ2V0X3VzZXIoZnAsICZ1cC0+aUZyYW1lKTsKIAllcnIgfD0gZ2V0X3VzZXIoc2l6ZSwgJnVwLT5zaXplKTsKIAlpZiAoZXJyKQpAQCAtMjI0LDE0ICsyMTksMTMgQEAKIAljb21wYXRfdXB0cl90IHBhbGV0dGU7CiB9OwogCi1zdGF0aWMgaW50IGRvX3ZpZGVvX3NldF9zcHVfcGFsZXR0ZSh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCBkb192aWRlb19zZXRfc3B1X3BhbGV0dGUodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLAorCQlzdHJ1Y3QgY29tcGF0X3ZpZGVvX3NwdV9wYWxldHRlIF9fdXNlciAqdXApCiB7Ci0Jc3RydWN0IGNvbXBhdF92aWRlb19zcHVfcGFsZXR0ZSBfX3VzZXIgKnVwOwogCXN0cnVjdCB2aWRlb19zcHVfcGFsZXR0ZSBfX3VzZXIgKnVwX25hdGl2ZTsKIAljb21wYXRfdXB0cl90IHBhbHA7CiAJaW50IGxlbmd0aCwgZXJyOwogCi0JdXAgPSAoc3RydWN0IGNvbXBhdF92aWRlb19zcHVfcGFsZXR0ZSBfX3VzZXIgKikgYXJnOwogCWVyciAgPSBnZXRfdXNlcihwYWxwLCAmdXAtPnBhbGV0dGUpOwogCWVyciB8PSBnZXRfdXNlcihsZW5ndGgsICZ1cC0+bGVuZ3RoKTsKIApAQCAtMjk5LDE2ICsyOTMsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzZ19pb2N0bF90cmFucyh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCBzZ19pb2N0bF90cmFucyh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsCisJCQlzZ19pb19oZHIzMl90IF9fdXNlciAqc2dpbzMyKQogewogCXNnX2lvX2hkcl90IF9fdXNlciAqc2dpbzsKLQlzZ19pb19oZHIzMl90IF9fdXNlciAqc2dpbzMyOwogCXUxNiBpb3ZlY19jb3VudDsKIAl1MzIgZGF0YTsKIAl2b2lkIF9fdXNlciAqZHhmZXJwOwogCWludCBlcnI7CiAKLQlzZ2lvMzIgPSBjb21wYXRfcHRyKGFyZyk7CiAJaWYgKGdldF91c2VyKGlvdmVjX2NvdW50LCAmc2dpbzMyLT5pb3ZlY19jb3VudCkpCiAJCXJldHVybiAtRUZBVUxUOwogCkBAIC0zOTgsMTEgKzM5MSwxMSBAQAogCWludCB1bnVzZWQ7CiB9OwogCi1zdGF0aWMgaW50IHNnX2dydF90cmFucyh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCBzZ19ncnRfdHJhbnModW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCBzdHJ1Y3QKKwkJCWNvbXBhdF9zZ19yZXFfaW5mbyBfX3VzZXIgKm8pCiB7CiAJaW50IGVyciwgaTsKIAlzZ19yZXFfaW5mb190IF9fdXNlciAqcjsKLQlzdHJ1Y3QgY29tcGF0X3NnX3JlcV9pbmZvIF9fdXNlciAqbyA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlyID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKHNnX3JlcV9pbmZvX3QpKlNHX01BWF9RVUVVRSk7CiAJZXJyID0gc3lzX2lvY3RsKGZkLGNtZCwodW5zaWduZWQgbG9uZylyKTsKIAlpZiAoZXJyIDwgMCkKQEAgLTQzMCw5ICs0MjMsOSBAQAogI2RlZmluZSBQUFBJT0NTUEFTUzMyCV9JT1coJ3QnLCA3MSwgc3RydWN0IHNvY2tfZnByb2czMikKICNkZWZpbmUgUFBQSU9DU0FDVElWRTMyCV9JT1coJ3QnLCA3MCwgc3RydWN0IHNvY2tfZnByb2czMikKIAotc3RhdGljIGludCBwcHBfc29ja19mcHJvZ19pb2N0bF90cmFucyh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCBwcHBfc29ja19mcHJvZ19pb2N0bF90cmFucyh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsCisJCQlzdHJ1Y3Qgc29ja19mcHJvZzMyIF9fdXNlciAqdV9mcHJvZzMyKQogewotCXN0cnVjdCBzb2NrX2Zwcm9nMzIgX191c2VyICp1X2Zwcm9nMzIgPSBjb21wYXRfcHRyKGFyZyk7CiAJc3RydWN0IHNvY2tfZnByb2cgX191c2VyICp1X2Zwcm9nNjQgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2Yoc3RydWN0IHNvY2tfZnByb2cpKTsKIAl2b2lkIF9fdXNlciAqZnB0cjY0OwogCXUzMiBmcHRyMzI7CkBAIC00NjksMTUgKzQ2MiwxNCBAQAogfTsKICNkZWZpbmUgUFBQSU9DR0lETEUzMgkJX0lPUigndCcsIDYzLCBzdHJ1Y3QgcHBwX2lkbGUzMikKIAotc3RhdGljIGludCBwcHBfZ2lkbGUodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBpbnQgcHBwX2dpZGxlKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwKKwkJc3RydWN0IHBwcF9pZGxlMzIgX191c2VyICppZGxlMzIpCiB7CiAJc3RydWN0IHBwcF9pZGxlIF9fdXNlciAqaWRsZTsKLQlzdHJ1Y3QgcHBwX2lkbGUzMiBfX3VzZXIgKmlkbGUzMjsKIAlfX2tlcm5lbF90aW1lX3QgeG1pdCwgcmVjdjsKIAlpbnQgZXJyOwogCiAJaWRsZSA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqaWRsZSkpOwotCWlkbGUzMiA9IGNvbXBhdF9wdHIoYXJnKTsKIAogCWVyciA9IHN5c19pb2N0bChmZCwgUFBQSU9DR0lETEUsICh1bnNpZ25lZCBsb25nKSBpZGxlKTsKIApAQCAtNDkxLDE1ICs0ODMsMTQgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHBwcF9zY29tcHJlc3ModW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBpbnQgcHBwX3Njb21wcmVzcyh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsCisJc3RydWN0IHBwcF9vcHRpb25fZGF0YTMyIF9fdXNlciAqb2RhdGEzMikKIHsKIAlzdHJ1Y3QgcHBwX29wdGlvbl9kYXRhIF9fdXNlciAqb2RhdGE7Ci0Jc3RydWN0IHBwcF9vcHRpb25fZGF0YTMyIF9fdXNlciAqb2RhdGEzMjsKIAlfX3UzMiBkYXRhOwogCXZvaWQgX191c2VyICpkYXRhcDsKIAogCW9kYXRhID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpvZGF0YSkpOwotCW9kYXRhMzIgPSBjb21wYXRfcHRyKGFyZyk7CiAKIAlpZiAoZ2V0X3VzZXIoZGF0YSwgJm9kYXRhMzItPnB0cikpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtNTE1LDM1ICs1MDYsNiBAQAogCXJldHVybiBzeXNfaW9jdGwoZmQsIFBQUElPQ1NDT01QUkVTUywgKHVuc2lnbmVkIGxvbmcpIG9kYXRhKTsKIH0KIAotc3RhdGljIGludCBwcHBfaW9jdGxfdHJhbnModW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlpbnQgZXJyOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFBQUElPQ0dJRExFMzI6Ci0JCWVyciA9IHBwcF9naWRsZShmZCwgY21kLCBhcmcpOwotCQlicmVhazsKLQotCWNhc2UgUFBQSU9DU0NPTVBSRVNTMzI6Ci0JCWVyciA9IHBwcF9zY29tcHJlc3MoZmQsIGNtZCwgYXJnKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlkbyB7Ci0JCQlzdGF0aWMgaW50IGNvdW50OwotCQkJaWYgKCsrY291bnQgPD0gMjApCi0JCQkJcHJpbnRrKCJwcHBfaW9jdGw6IFVua25vd24gY21kIGZkKCVkKSAiCi0JCQkJICAgICAgICJjbWQoJTA4eCkgYXJnKCUwOHgpXG4iLAotCQkJCSAgICAgICAoaW50KWZkLCAodW5zaWduZWQgaW50KWNtZCwgKHVuc2lnbmVkIGludClhcmcpOwotCQl9IHdoaWxlKDApOwotCQllcnIgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9OwotCi0JcmV0dXJuIGVycjsKLX0KLQotCiAjaWZkZWYgQ09ORklHX0JMT0NLCiBzdHJ1Y3QgbXRnZXQzMiB7CiAJY29tcGF0X2xvbmdfdAltdF90eXBlOwpAQCAtNTYxLDcgKzUyMyw3IEBACiB9OwogI2RlZmluZSBNVElPQ1BPUzMyCV9JT1IoJ20nLCAzLCBzdHJ1Y3QgbXRwb3MzMikKIAotc3RhdGljIGludCBtdF9pb2N0bF90cmFucyh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCBtdF9pb2N0bF90cmFucyh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmdwKQogewogCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKIAlzdHJ1Y3QgbXRnZXQgZ2V0OwpAQCAtNTgxLDE1ICs1NDMsNiBAQAogCQlrY21kID0gTVRJT0NHRVQ7CiAJCWthcmcgPSAmZ2V0OwogCQlicmVhazsKLQlkZWZhdWx0OgotCQlkbyB7Ci0JCQlzdGF0aWMgaW50IGNvdW50OwotCQkJaWYgKCsrY291bnQgPD0gMjApCi0JCQkJcHJpbnRrKCJtdF9pb2N0bDogVW5rbm93biBjbWQgZmQoJWQpICIKLQkJCQkgICAgICAgImNtZCglMDh4KSBhcmcoJTA4eClcbiIsCi0JCQkJICAgICAgIChpbnQpZmQsICh1bnNpZ25lZCBpbnQpY21kLCAodW5zaWduZWQgaW50KWFyZyk7Ci0JCX0gd2hpbGUoMCk7Ci0JCXJldHVybiAtRUlOVkFMOwogCX0KIAlzZXRfZnMgKEtFUk5FTF9EUyk7CiAJZXJyID0gc3lzX2lvY3RsIChmZCwga2NtZCwgKHVuc2lnbmVkIGxvbmcpa2FyZyk7CkBAIC01OTgsMTEgKzU1MSwxMSBAQAogCQlyZXR1cm4gZXJyOwogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBNVElPQ1BPUzMyOgotCQl1cG9zMzIgPSBjb21wYXRfcHRyKGFyZyk7CisJCXVwb3MzMiA9IGFyZ3A7CiAJCWVyciA9IF9fcHV0X3VzZXIocG9zLm10X2Jsa25vLCAmdXBvczMyLT5tdF9ibGtubyk7CiAJCWJyZWFrOwogCWNhc2UgTVRJT0NHRVQzMjoKLQkJdW1nZXQzMiA9IGNvbXBhdF9wdHIoYXJnKTsKKwkJdW1nZXQzMiA9IGFyZ3A7CiAJCWVyciA9IF9fcHV0X3VzZXIoZ2V0Lm10X3R5cGUsICZ1bWdldDMyLT5tdF90eXBlKTsKIAkJZXJyIHw9IF9fcHV0X3VzZXIoZ2V0Lm10X3Jlc2lkLCAmdW1nZXQzMi0+bXRfcmVzaWQpOwogCQllcnIgfD0gX19wdXRfdXNlcihnZXQubXRfZHNyZWcsICZ1bWdldDMyLT5tdF9kc3JlZyk7CkBAIC02MTcsMTYyICs1NzAsOCBAQAogCiAjZW5kaWYgLyogQ09ORklHX0JMT0NLICovCiAKLSNpZmRlZiBDT05GSUdfVlQKLQotc3RhdGljIGludCB2dF9jaGVjayhzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwotCXN0cnVjdCB2Y19kYXRhICp2YzsKLQkKLQlpZiAoZmlsZS0+Zl9vcC0+dW5sb2NrZWRfaW9jdGwgIT0gdHR5X2lvY3RsKQotCQlyZXR1cm4gLUVJTlZBTDsKLQkgICAgICAgICAgICAgICAgCi0JdHR5ID0gKHN0cnVjdCB0dHlfc3RydWN0ICopZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWlmICh0dHlfcGFyYW5vaWFfY2hlY2sodHR5LCBpbm9kZSwgInR0eV9pb2N0bCIpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQlpZiAodHR5LT5vcHMtPmlvY3RsICE9IHZ0X2lvY3RsKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXZjID0gKHN0cnVjdCB2Y19kYXRhICopdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAoIXZjX2NvbnNfYWxsb2NhdGVkKHZjLT52Y19udW0pKSAJLyogaW1wb3NzaWJsZT8gKi8KLQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKLQotCS8qCi0JICogVG8gaGF2ZSBwZXJtaXNzaW9ucyB0byBkbyBtb3N0IG9mIHRoZSB2dCBpb2N0bHMsIHdlIGVpdGhlciBoYXZlCi0JICogdG8gYmUgdGhlIG93bmVyIG9mIHRoZSB0dHksIG9yIGhhdmUgQ0FQX1NZU19UVFlfQ09ORklHLgotCSAqLwotCWlmIChjdXJyZW50LT5zaWduYWwtPnR0eSA9PSB0dHkgfHwgY2FwYWJsZShDQVBfU1lTX1RUWV9DT05GSUcpKQotCQlyZXR1cm4gMTsKLQlyZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi19Ci0KLXN0cnVjdCBjb25zb2xlZm9udGRlc2MzMiB7Ci0JdW5zaWduZWQgc2hvcnQgY2hhcmNvdW50OyAgICAgICAvKiBjaGFyYWN0ZXJzIGluIGZvbnQgKDI1NiBvciA1MTIpICovCi0JdW5zaWduZWQgc2hvcnQgY2hhcmhlaWdodDsgICAgICAvKiBzY2FuIGxpbmVzIHBlciBjaGFyYWN0ZXIgKDEtMzIpICovCi0JY29tcGF0X2NhZGRyX3QgY2hhcmRhdGE7CS8qIGZvbnQgZGF0YSBpbiBleHBhbmRlZCBmb3JtICovCi19OwotCi1zdGF0aWMgaW50IGRvX2ZvbnR4X2lvY3RsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBjb25zb2xlZm9udGRlc2MzMiBfX3VzZXIgKnVzZXJfY2ZkID0gY29tcGF0X3B0cihhcmcpOwotCXN0cnVjdCBjb25zb2xlX2ZvbnRfb3Agb3A7Ci0JY29tcGF0X2NhZGRyX3QgZGF0YTsKLQlpbnQgaSwgcGVybTsKLQotCXBlcm0gPSB2dF9jaGVjayhmaWxlKTsKLQlpZiAocGVybSA8IDApIHJldHVybiBwZXJtOwotCQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBQSU9fRk9OVFg6Ci0JCWlmICghcGVybSkKLQkJCXJldHVybiAtRVBFUk07Ci0JCW9wLm9wID0gS0RfRk9OVF9PUF9TRVQ7Ci0JCW9wLmZsYWdzID0gMDsKLQkJb3Aud2lkdGggPSA4OwotCQlpZiAoZ2V0X3VzZXIob3AuaGVpZ2h0LCAmdXNlcl9jZmQtPmNoYXJoZWlnaHQpIHx8Ci0JCSAgICBnZXRfdXNlcihvcC5jaGFyY291bnQsICZ1c2VyX2NmZC0+Y2hhcmNvdW50KSB8fAotCQkgICAgZ2V0X3VzZXIoZGF0YSwgJnVzZXJfY2ZkLT5jaGFyZGF0YSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJb3AuZGF0YSA9IGNvbXBhdF9wdHIoZGF0YSk7Ci0JCXJldHVybiBjb25fZm9udF9vcCh2Y19jb25zW2ZnX2NvbnNvbGVdLmQsICZvcCk7Ci0JY2FzZSBHSU9fRk9OVFg6Ci0JCW9wLm9wID0gS0RfRk9OVF9PUF9HRVQ7Ci0JCW9wLmZsYWdzID0gMDsKLQkJb3Aud2lkdGggPSA4OwotCQlpZiAoZ2V0X3VzZXIob3AuaGVpZ2h0LCAmdXNlcl9jZmQtPmNoYXJoZWlnaHQpIHx8Ci0JCSAgICBnZXRfdXNlcihvcC5jaGFyY291bnQsICZ1c2VyX2NmZC0+Y2hhcmNvdW50KSB8fAotCQkgICAgZ2V0X3VzZXIoZGF0YSwgJnVzZXJfY2ZkLT5jaGFyZGF0YSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJaWYgKCFkYXRhKQotCQkJcmV0dXJuIDA7Ci0JCW9wLmRhdGEgPSBjb21wYXRfcHRyKGRhdGEpOwotCQlpID0gY29uX2ZvbnRfb3AodmNfY29uc1tmZ19jb25zb2xlXS5kLCAmb3ApOwotCQlpZiAoaSkKLQkJCXJldHVybiBpOwotCQlpZiAocHV0X3VzZXIob3AuaGVpZ2h0LCAmdXNlcl9jZmQtPmNoYXJoZWlnaHQpIHx8Ci0JCSAgICBwdXRfdXNlcihvcC5jaGFyY291bnQsICZ1c2VyX2NmZC0+Y2hhcmNvdW50KSB8fAotCQkgICAgcHV0X3VzZXIoKGNvbXBhdF9jYWRkcl90KSh1bnNpZ25lZCBsb25nKW9wLmRhdGEsCi0JCQkJJnVzZXJfY2ZkLT5jaGFyZGF0YSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdHJ1Y3QgY29uc29sZV9mb250X29wMzIgewotCWNvbXBhdF91aW50X3Qgb3A7ICAgICAgICAvKiBvcGVyYXRpb24gY29kZSBLRF9GT05UX09QXyogKi8KLQljb21wYXRfdWludF90IGZsYWdzOyAgICAgLyogS0RfRk9OVF9GTEFHXyogKi8KLQljb21wYXRfdWludF90IHdpZHRoLCBoZWlnaHQ7ICAgICAvKiBmb250IHNpemUgKi8KLQljb21wYXRfdWludF90IGNoYXJjb3VudDsKLQljb21wYXRfY2FkZHJfdCBkYXRhOyAgICAvKiBmb250IGRhdGEgd2l0aCBoZWlnaHQgZml4ZWQgdG8gMzIgKi8KLX07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1zdGF0aWMgaW50IGRvX2tkZm9udG9wX2lvY3RsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBjb25zb2xlX2ZvbnRfb3Agb3A7Ci0Jc3RydWN0IGNvbnNvbGVfZm9udF9vcDMyIF9fdXNlciAqZm9udG9wID0gY29tcGF0X3B0cihhcmcpOwotCWludCBwZXJtID0gdnRfY2hlY2soZmlsZSksIGk7Ci0Jc3RydWN0IHZjX2RhdGEgKnZjOwotCQotCWlmIChwZXJtIDwgMCkgcmV0dXJuIHBlcm07Ci0JCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZvcCwgZm9udG9wLCBzaXplb2Yoc3RydWN0IGNvbnNvbGVfZm9udF9vcDMyKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmICghcGVybSAmJiBvcC5vcCAhPSBLRF9GT05UX09QX0dFVCkKLQkJcmV0dXJuIC1FUEVSTTsKLQlvcC5kYXRhID0gY29tcGF0X3B0cigoKHN0cnVjdCBjb25zb2xlX2ZvbnRfb3AzMiAqKSZvcCktPmRhdGEpOwotCW9wLmZsYWdzIHw9IEtEX0ZPTlRfRkxBR19PTEQ7Ci0JdmMgPSAoKHN0cnVjdCB0dHlfc3RydWN0ICopZmlsZS0+cHJpdmF0ZV9kYXRhKS0+ZHJpdmVyX2RhdGE7Ci0JaSA9IGNvbl9mb250X29wKHZjLCAmb3ApOwotCWlmIChpKQotCQlyZXR1cm4gaTsKLQkoKHN0cnVjdCBjb25zb2xlX2ZvbnRfb3AzMiAqKSZvcCktPmRhdGEgPSAodW5zaWduZWQgbG9uZylvcC5kYXRhOwotCWlmIChjb3B5X3RvX3VzZXIoZm9udG9wLCAmb3AsIHNpemVvZihzdHJ1Y3QgY29uc29sZV9mb250X29wMzIpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCB1bmltYXBkZXNjMzIgewotCXVuc2lnbmVkIHNob3J0IGVudHJ5X2N0OwotCWNvbXBhdF9jYWRkcl90IGVudHJpZXM7Ci19OwotCi1zdGF0aWMgaW50IGRvX3VuaW1hcF9pb2N0bCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgdW5pbWFwZGVzYzMyIHRtcDsKLQlzdHJ1Y3QgdW5pbWFwZGVzYzMyIF9fdXNlciAqdXNlcl91ZCA9IGNvbXBhdF9wdHIoYXJnKTsKLQlpbnQgcGVybSA9IHZ0X2NoZWNrKGZpbGUpOwotCXN0cnVjdCB2Y19kYXRhICp2YzsKLQotCWlmIChwZXJtIDwgMCkKLQkJcmV0dXJuIHBlcm07Ci0JaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXAsIHVzZXJfdWQsIHNpemVvZiB0bXApKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAodG1wLmVudHJpZXMpCi0JCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgY29tcGF0X3B0cih0bXAuZW50cmllcyksCi0JCQkJdG1wLmVudHJ5X2N0KnNpemVvZihzdHJ1Y3QgdW5pcGFpcikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JdmMgPSAoKHN0cnVjdCB0dHlfc3RydWN0ICopZmlsZS0+cHJpdmF0ZV9kYXRhKS0+ZHJpdmVyX2RhdGE7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFBJT19VTklNQVA6Ci0JCWlmICghcGVybSkKLQkJCXJldHVybiAtRVBFUk07Ci0JCXJldHVybiBjb25fc2V0X3VuaW1hcCh2YywgdG1wLmVudHJ5X2N0LAotCQkJCQkJY29tcGF0X3B0cih0bXAuZW50cmllcykpOwotCWNhc2UgR0lPX1VOSU1BUDoKLQkJaWYgKCFwZXJtICYmIGZnX2NvbnNvbGUgIT0gdmMtPnZjX251bSkKLQkJCXJldHVybiAtRVBFUk07Ci0JCXJldHVybiBjb25fZ2V0X3VuaW1hcCh2YywgdG1wLmVudHJ5X2N0LCAmKHVzZXJfdWQtPmVudHJ5X2N0KSwKLQkJCQkJCWNvbXBhdF9wdHIodG1wLmVudHJpZXMpKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfVlQgKi8KLQotc3RhdGljIGludCBkb19zbWJfZ2V0bW91bnR1aWQodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBpbnQgZG9fc21iX2dldG1vdW50dWlkKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwKKwkJCWNvbXBhdF91aWRfdCBfX3VzZXIgKmFyZ3ApCiB7CiAJbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOwogCV9fa2VybmVsX3VpZF90IGt1aWQ7CkBAIC03ODUsMjAgKzU4NCwxNSBAQAogCXNldF9mcyhvbGRfZnMpOwogCiAJaWYgKGVyciA+PSAwKQotCQllcnIgPSBwdXRfdXNlcihrdWlkLCAoY29tcGF0X3VpZF90IF9fdXNlciAqKWNvbXBhdF9wdHIoYXJnKSk7CisJCWVyciA9IHB1dF91c2VyKGt1aWQsIGFyZ3ApOwogCiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIF9fdXNlZCBpbnQKLXJldF9laW52YWwodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBpbnQgaW9jX3NldHRpbWVvdXQodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLAorCQljb21wYXRfdWxvbmdfdCBfX3VzZXIgKmFyZ3ApCiB7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgaW9jX3NldHRpbWVvdXQodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlyZXR1cm4gcndfbG9uZyhmZCwgQVVUT0ZTX0lPQ19TRVRUSU1FT1VULCBhcmcpOworCXJldHVybiByd19sb25nKGZkLCBBVVRPRlNfSU9DX1NFVFRJTUVPVVQsIGFyZ3ApOwogfQogCiAvKiBCbHVldG9vdGggaW9jdGxzICovCkBAIC04NTYsNyArNjUwLDggQEAKICAgICAgICAgcmV0dXJuIHJldCA/IC1FRkFVTFQgOiAwOwogfQogCi1zdGF0aWMgaW50IHJhd19pb2N0bCh1bnNpZ25lZCBmZCwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBpbnQgcmF3X2lvY3RsKHVuc2lnbmVkIGZkLCB1bnNpZ25lZCBjbWQsCisJCXN0cnVjdCByYXczMl9jb25maWdfcmVxdWVzdCBfX3VzZXIgKnVzZXJfcmVxKQogewogICAgICAgICBpbnQgcmV0OwogCkBAIC04NjQsNyArNjU5LDYgQEAKICAgICAgICAgY2FzZSBSQVdfU0VUQklORDoKICAgICAgICAgY2FzZSBSQVdfR0VUQklORDogewogICAgICAgICAgICAgICAgIHN0cnVjdCByYXdfY29uZmlnX3JlcXVlc3QgcmVxOwotICAgICAgICAgICAgICAgIHN0cnVjdCByYXczMl9jb25maWdfcmVxdWVzdCBfX3VzZXIgKnVzZXJfcmVxID0gY29tcGF0X3B0cihhcmcpOwogICAgICAgICAgICAgICAgIG1tX3NlZ21lbnRfdCBvbGRmcyA9IGdldF9mcygpOwogCiAgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBnZXRfcmF3MzJfcmVxdWVzdCgmcmVxLCB1c2VyX3JlcSkpKQpAQCAtODc5LDkgKzY3Myw2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0ID0gc3lzX2lvY3RsKGZkLCBjbWQsIGFyZyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTkwOSwxMSArNzAwLDExIEBACiAgICAgICAgIGNvbXBhdF9pbnRfdCAgICByZXNlcnZlZFsxXTsKIH07CiAKLXN0YXRpYyBpbnQgc2VyaWFsX3N0cnVjdF9pb2N0bCh1bnNpZ25lZCBmZCwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBpbnQgc2VyaWFsX3N0cnVjdF9pb2N0bCh1bnNpZ25lZCBmZCwgdW5zaWduZWQgY21kLAorCQkJc3RydWN0IHNlcmlhbF9zdHJ1Y3QzMiBfX3VzZXIgKnNzMzIpCiB7CiAgICAgICAgIHR5cGVkZWYgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgU1M7CiAgICAgICAgIHR5cGVkZWYgc3RydWN0IHNlcmlhbF9zdHJ1Y3QzMiBTUzMyOwotICAgICAgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdDMyIF9fdXNlciAqc3MzMiA9IGNvbXBhdF9wdHIoYXJnKTsKICAgICAgICAgaW50IGVycjsKICAgICAgICAgc3RydWN0IHNlcmlhbF9zdHJ1Y3Qgc3M7CiAgICAgICAgIG1tX3NlZ21lbnRfdCBvbGRzZWcgPSBnZXRfZnMoKTsKQEAgLTk1MSw5NiArNzQyLDYgQEAKICAgICAgICAgcmV0dXJuIGVycjsKIH0KIAotc3RydWN0IHVzYmRldmZzX2N0cmx0cmFuc2ZlcjMyIHsKLSAgICAgICAgdTggYlJlcXVlc3RUeXBlOwotICAgICAgICB1OCBiUmVxdWVzdDsKLSAgICAgICAgdTE2IHdWYWx1ZTsKLSAgICAgICAgdTE2IHdJbmRleDsKLSAgICAgICAgdTE2IHdMZW5ndGg7Ci0gICAgICAgIHUzMiB0aW1lb3V0OyAgLyogaW4gbWlsbGlzZWNvbmRzICovCi0gICAgICAgIGNvbXBhdF9jYWRkcl90IGRhdGE7Ci19OwotCi0jZGVmaW5lIFVTQkRFVkZTX0NPTlRST0wzMiAgICAgICAgICAgX0lPV1IoJ1UnLCAwLCBzdHJ1Y3QgdXNiZGV2ZnNfY3RybHRyYW5zZmVyMzIpCi0KLXN0YXRpYyBpbnQgZG9fdXNiZGV2ZnNfY29udHJvbCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotICAgICAgICBzdHJ1Y3QgdXNiZGV2ZnNfY3RybHRyYW5zZmVyMzIgX191c2VyICpwMzIgPSBjb21wYXRfcHRyKGFyZyk7Ci0gICAgICAgIHN0cnVjdCB1c2JkZXZmc19jdHJsdHJhbnNmZXIgX191c2VyICpwOwotICAgICAgICBfX3UzMiB1ZGF0YTsKLSAgICAgICAgcCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcCkpOwotICAgICAgICBpZiAoY29weV9pbl91c2VyKHAsIHAzMiwgKHNpemVvZigqcDMyKSAtIHNpemVvZihjb21wYXRfY2FkZHJfdCkpKSB8fAotICAgICAgICAgICAgZ2V0X3VzZXIodWRhdGEsICZwMzItPmRhdGEpIHx8Ci0JICAgIHB1dF91c2VyKGNvbXBhdF9wdHIodWRhdGEpLCAmcC0+ZGF0YSkpCi0JCXJldHVybiAtRUZBVUxUOwotICAgICAgICByZXR1cm4gc3lzX2lvY3RsKGZkLCBVU0JERVZGU19DT05UUk9MLCAodW5zaWduZWQgbG9uZylwKTsKLX0KLQotCi1zdHJ1Y3QgdXNiZGV2ZnNfYnVsa3RyYW5zZmVyMzIgewotICAgICAgICBjb21wYXRfdWludF90IGVwOwotICAgICAgICBjb21wYXRfdWludF90IGxlbjsKLSAgICAgICAgY29tcGF0X3VpbnRfdCB0aW1lb3V0OyAvKiBpbiBtaWxsaXNlY29uZHMgKi8KLSAgICAgICAgY29tcGF0X2NhZGRyX3QgZGF0YTsKLX07Ci0KLSNkZWZpbmUgVVNCREVWRlNfQlVMSzMyICAgICAgICAgICAgICBfSU9XUignVScsIDIsIHN0cnVjdCB1c2JkZXZmc19idWxrdHJhbnNmZXIzMikKLQotc3RhdGljIGludCBkb191c2JkZXZmc19idWxrKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0gICAgICAgIHN0cnVjdCB1c2JkZXZmc19idWxrdHJhbnNmZXIzMiBfX3VzZXIgKnAzMiA9IGNvbXBhdF9wdHIoYXJnKTsKLSAgICAgICAgc3RydWN0IHVzYmRldmZzX2J1bGt0cmFuc2ZlciBfX3VzZXIgKnA7Ci0gICAgICAgIGNvbXBhdF91aW50X3QgbjsKLSAgICAgICAgY29tcGF0X2NhZGRyX3QgYWRkcjsKLQotICAgICAgICBwID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpwKSk7Ci0KLSAgICAgICAgaWYgKGdldF91c2VyKG4sICZwMzItPmVwKSB8fCBwdXRfdXNlcihuLCAmcC0+ZXApIHx8Ci0gICAgICAgICAgICBnZXRfdXNlcihuLCAmcDMyLT5sZW4pIHx8IHB1dF91c2VyKG4sICZwLT5sZW4pIHx8Ci0gICAgICAgICAgICBnZXRfdXNlcihuLCAmcDMyLT50aW1lb3V0KSB8fCBwdXRfdXNlcihuLCAmcC0+dGltZW91dCkgfHwKLSAgICAgICAgICAgIGdldF91c2VyKGFkZHIsICZwMzItPmRhdGEpIHx8IHB1dF91c2VyKGNvbXBhdF9wdHIoYWRkciksICZwLT5kYXRhKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKLQotICAgICAgICByZXR1cm4gc3lzX2lvY3RsKGZkLCBVU0JERVZGU19CVUxLLCAodW5zaWduZWQgbG9uZylwKTsKLX0KLQotCi0vKgotICogIFVTQkRFVkZTX1NVQk1JVFVSQiwgVVNCREVWRlNfUkVBUFVSQiBhbmQgVVNCREVWRlNfUkVBUFVSQk5ERUxBWQotICogIGFyZSBoYW5kbGVkIGluIHVzYmRldmZzIGNvcmUuCQkJLUNocmlzdG9waGVyIExpCi0gKi8KLQotc3RydWN0IHVzYmRldmZzX2Rpc2Nvbm5lY3RzaWduYWwzMiB7Ci0gICAgICAgIGNvbXBhdF9pbnRfdCBzaWducjsKLSAgICAgICAgY29tcGF0X2NhZGRyX3QgY29udGV4dDsKLX07Ci0KLSNkZWZpbmUgVVNCREVWRlNfRElTQ1NJR05BTDMyICAgICAgX0lPUignVScsIDE0LCBzdHJ1Y3QgdXNiZGV2ZnNfZGlzY29ubmVjdHNpZ25hbDMyKQotCi1zdGF0aWMgaW50IGRvX3VzYmRldmZzX2Rpc2NzaWduYWwodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLSAgICAgICAgc3RydWN0IHVzYmRldmZzX2Rpc2Nvbm5lY3RzaWduYWwga2RpczsKLSAgICAgICAgc3RydWN0IHVzYmRldmZzX2Rpc2Nvbm5lY3RzaWduYWwzMiBfX3VzZXIgKnVkaXM7Ci0gICAgICAgIG1tX3NlZ21lbnRfdCBvbGRfZnM7Ci0gICAgICAgIHUzMiB1Y3R4OwotICAgICAgICBpbnQgZXJyOwotCi0gICAgICAgIHVkaXMgPSBjb21wYXRfcHRyKGFyZyk7Ci0KLSAgICAgICAgaWYgKGdldF91c2VyKGtkaXMuc2lnbnIsICZ1ZGlzLT5zaWducikgfHwKLSAgICAgICAgICAgIF9fZ2V0X3VzZXIodWN0eCwgJnVkaXMtPmNvbnRleHQpKQotICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOwotCi0gICAgICAgIGtkaXMuY29udGV4dCA9IGNvbXBhdF9wdHIodWN0eCk7Ci0KLSAgICAgICAgb2xkX2ZzID0gZ2V0X2ZzKCk7Ci0gICAgICAgIHNldF9mcyhLRVJORUxfRFMpOwotICAgICAgICBlcnIgPSBzeXNfaW9jdGwoZmQsIFVTQkRFVkZTX0RJU0NTSUdOQUwsICh1bnNpZ25lZCBsb25nKSAma2Rpcyk7Ci0gICAgICAgIHNldF9mcyhvbGRfZnMpOwotCi0gICAgICAgIHJldHVybiBlcnI7Ci19Ci0KIC8qCiAgKiBJMkMgbGF5ZXIgaW9jdGxzCiAgKi8KQEAgLTEwNjksOSArNzcwLDkgQEAKIAlzdHJ1Y3QgaTJjX21zZyBtc2dzWzBdOwogfTsKIAotc3RhdGljIGludCBkb19pMmNfcmR3cl9pb2N0bCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCBkb19pMmNfcmR3cl9pb2N0bCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsCisJCQlzdHJ1Y3QgaTJjX3Jkd3JfaW9jdGxfZGF0YTMyICAgIF9fdXNlciAqdWRhdGEpCiB7Ci0Jc3RydWN0IGkyY19yZHdyX2lvY3RsX2RhdGEzMglfX3VzZXIgKnVkYXRhID0gY29tcGF0X3B0cihhcmcpOwogCXN0cnVjdCBpMmNfcmR3cl9hbGlnbmVkCQlfX3VzZXIgKnRkYXRhOwogCXN0cnVjdCBpMmNfbXNnCQkJX191c2VyICp0bXNnczsKIAlzdHJ1Y3QgaTJjX21zZzMyCQlfX3VzZXIgKnVtc2dzOwpAQCAtMTEwNSwxMCArODA2LDEwIEBACiAJcmV0dXJuIHN5c19pb2N0bChmZCwgY21kLCAodW5zaWduZWQgbG9uZyl0ZGF0YSk7CiB9CiAKLXN0YXRpYyBpbnQgZG9faTJjX3NtYnVzX2lvY3RsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgaW50IGRvX2kyY19zbWJ1c19pb2N0bCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsCisJCQlzdHJ1Y3QgaTJjX3NtYnVzX2lvY3RsX2RhdGEzMiAgIF9fdXNlciAqdWRhdGEpCiB7CiAJc3RydWN0IGkyY19zbWJ1c19pb2N0bF9kYXRhCV9fdXNlciAqdGRhdGE7Ci0Jc3RydWN0IGkyY19zbWJ1c19pb2N0bF9kYXRhMzIJX191c2VyICp1ZGF0YTsKIAljb21wYXRfY2FkZHJfdAkJCWRhdGFwOwogCiAJdGRhdGEgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnRkYXRhKSk7CkBAIC0xMTE3LDcgKzgxOCw2IEBACiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB0ZGF0YSwgc2l6ZW9mKCp0ZGF0YSkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCXVkYXRhID0gY29tcGF0X3B0cihhcmcpOwogCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1ZGF0YSwgc2l6ZW9mKCp1ZGF0YSkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIApAQCAtMTEzNyw3ICs4MzcsNyBAQAogI2RlZmluZSBSVENfRVBPQ0hfUkVBRDMyCV9JT1IoJ3AnLCAweDBkLCBjb21wYXRfdWxvbmdfdCkKICNkZWZpbmUgUlRDX0VQT0NIX1NFVDMyCQlfSU9XKCdwJywgMHgwZSwgY29tcGF0X3Vsb25nX3QpCiAKLXN0YXRpYyBpbnQgcnRjX2lvY3RsKHVuc2lnbmVkIGZkLCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCBydGNfaW9jdGwodW5zaWduZWQgZmQsIHVuc2lnbmVkIGNtZCwgdm9pZCBfX3VzZXIgKmFyZ3ApCiB7CiAJbW1fc2VnbWVudF90IG9sZGZzID0gZ2V0X2ZzKCk7CiAJY29tcGF0X3Vsb25nX3QgdmFsMzI7CkBAIC0xMTU1LDI5ICs4NTUsMTQgQEAKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJCXZhbDMyID0ga3ZhbDsKLQkJcmV0dXJuIHB1dF91c2VyKHZhbDMyLCAodW5zaWduZWQgaW50IF9fdXNlciAqKWFyZyk7CisJCXJldHVybiBwdXRfdXNlcih2YWwzMiwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilhcmdwKTsKIAljYXNlIFJUQ19JUlFQX1NFVDMyOgotCQlyZXR1cm4gc3lzX2lvY3RsKGZkLCBSVENfSVJRUF9TRVQsIGFyZyk7IAorCQlyZXR1cm4gc3lzX2lvY3RsKGZkLCBSVENfSVJRUF9TRVQsICh1bnNpZ25lZCBsb25nKWFyZ3ApOwogCWNhc2UgUlRDX0VQT0NIX1NFVDMyOgotCQlyZXR1cm4gc3lzX2lvY3RsKGZkLCBSVENfRVBPQ0hfU0VULCBhcmcpOwotCWRlZmF1bHQ6Ci0JCS8qIHVucmVhY2hlZCAqLwotCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCQlyZXR1cm4gc3lzX2lvY3RsKGZkLCBSVENfRVBPQ0hfU0VULCAodW5zaWduZWQgbG9uZylhcmdwKTsKIAl9Ci19CiAKLXN0YXRpYyBpbnQKLWxwX3RpbWVvdXRfdHJhbnModW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICp0YyA9IChzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICopYXJnOwotCXN0cnVjdCB0aW1ldmFsIF9fdXNlciAqdG4gPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2Yoc3RydWN0IHRpbWV2YWwpKTsKLQlzdHJ1Y3QgdGltZXZhbCB0czsKLQlpZiAoZ2V0X3VzZXIodHMudHZfc2VjLCAmdGMtPnR2X3NlYykgfHwKLQkgICAgZ2V0X3VzZXIodHMudHZfdXNlYywgJnRjLT50dl91c2VjKSB8fAotCSAgICBwdXRfdXNlcih0cy50dl9zZWMsICZ0bi0+dHZfc2VjKSB8fAotCSAgICBwdXRfdXNlcih0cy50dl91c2VjLCAmdG4tPnR2X3VzZWMpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gc3lzX2lvY3RsKGZkLCBjbWQsICh1bnNpZ25lZCBsb25nKXRuKTsKKwlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogfQogCiAvKiBvbiBpYTMyIGxfc3RhcnQgaXMgb24gYSAzMi1iaXQgYm91bmRhcnkgKi8KQEAgLTExOTcsOSArODgyLDkgQEAKICNkZWZpbmUgRlNfSU9DX1JFU1ZTUDY0XzMyCV9JT1cgKCdYJywgNDIsIHN0cnVjdCBzcGFjZV9yZXN2XzMyKQogCiAvKiBqdXN0IGFjY291bnQgZm9yIGRpZmZlcmVudCBhbGlnbm1lbnQgKi8KLXN0YXRpYyBpbnQgY29tcGF0X2lvY3RsX3ByZWFsbG9jYXRlKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBpbnQgY29tcGF0X2lvY3RsX3ByZWFsbG9jYXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJc3RydWN0IHNwYWNlX3Jlc3ZfMzIgICAgX191c2VyICpwMzIpCiB7Ci0Jc3RydWN0IHNwYWNlX3Jlc3ZfMzIJX191c2VyICpwMzIgPSBjb21wYXRfcHRyKGFyZyk7CiAJc3RydWN0IHNwYWNlX3Jlc3YJX191c2VyICpwID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpwKSk7CiAKIAlpZiAoY29weV9pbl91c2VyKCZwLT5sX3R5cGUsCSZwMzItPmxfdHlwZSwJc2l6ZW9mKHMxNikpIHx8CkBAIC0xMjE1LDI3ICs5MDAsMTMgQEAKIH0KICNlbmRpZgogCisvKgorICogc2ltcGxlIHJldmVyc2libGUgdHJhbnNmb3JtIHRvIG1ha2Ugb3VyIHRhYmxlIG1vcmUgZXZlbmx5CisgKiBkaXN0cmlidXRlZCBhZnRlciBzb3J0aW5nLgorICovCisjZGVmaW5lIFhGT1JNKGkpICgoKGkpIF4gKChpKSA8PCAyNykgXiAoKGkpIDw8IDE3KSkgJiAweGZmZmZmZmZmKQogCi10eXBlZGVmIGludCAoKmlvY3RsX3RyYW5zX2hhbmRsZXJfdCkodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsCi0JCQkJCXVuc2lnbmVkIGxvbmcsIHN0cnVjdCBmaWxlICopOwotCi1zdHJ1Y3QgaW9jdGxfdHJhbnMgewotCXVuc2lnbmVkIGxvbmcgY21kOwotCWlvY3RsX3RyYW5zX2hhbmRsZXJfdCBoYW5kbGVyOwotCXN0cnVjdCBpb2N0bF90cmFucyAqbmV4dDsKLX07Ci0KLSNkZWZpbmUgSEFORExFX0lPQ1RMKGNtZCxoYW5kbGVyKSBcCi0JeyAoY21kKSwgKGlvY3RsX3RyYW5zX2hhbmRsZXJfdCkoaGFuZGxlcikgfSwKLQotLyogcG9pbnRlciB0byBjb21wYXRpYmxlIHN0cnVjdHVyZSBvciBubyBhcmd1bWVudCAqLwotI2RlZmluZSBDT01QQVRJQkxFX0lPQ1RMKGNtZCkgXAotCXsgKGNtZCksIGRvX2lvY3RsMzJfcG9pbnRlciB9LAotCi0vKiBhcmd1bWVudCBpcyBhbiB1bnNpZ25lZCBsb25nIGludGVnZXIsIG5vdCBhIHBvaW50ZXIgKi8KLSNkZWZpbmUgVUxPTkdfSU9DVEwoY21kKSBcCi0JeyAoY21kKSwgKGlvY3RsX3RyYW5zX2hhbmRsZXJfdClzeXNfaW9jdGwgfSwKLQorI2RlZmluZSBDT01QQVRJQkxFX0lPQ1RMKGNtZCkgWEZPUk0oY21kKSwKIC8qIGlvY3RsIHNob3VsZCBub3QgYmUgd2FybmVkIGFib3V0IGV2ZW4gaWYgaXQncyBub3QgaW1wbGVtZW50ZWQuCiAgICBWYWxpZCByZWFzb25zIHRvIHVzZSB0aGlzOgogICAgLSBJdCBpcyBpbXBsZW1lbnRlZCB3aXRoIC0+Y29tcGF0X2lvY3RsIG9uIHNvbWUgZGV2aWNlLCBidXQgcHJvZ3JhbXMKQEAgLTEyNDUsNyArOTE2LDcgQEAKICAgIE1vc3Qgb3RoZXIgcmVhc29ucyBhcmUgbm90IHZhbGlkLiAqLwogI2RlZmluZSBJR05PUkVfSU9DVEwoY21kKSBDT01QQVRJQkxFX0lPQ1RMKGNtZCkKIAotc3RhdGljIHN0cnVjdCBpb2N0bF90cmFucyBpb2N0bF9zdGFydFtdID0geworc3RhdGljIHVuc2lnbmVkIGludCBpb2N0bF9wb2ludGVyW10gPSB7CiAvKiBjb21wYXRpYmxlIGlvY3RscyBmaXJzdCAqLwogQ09NUEFUSUJMRV9JT0NUTCgweDRCNTApICAgLyogS0RHSFdDTEsgLSBub3QgaW4gdGhlIGtlcm5lbCwgYnV0IGRvbid0IGNvbXBsYWluICovCiBDT01QQVRJQkxFX0lPQ1RMKDB4NEI1MSkgICAvKiBLRFNIV0NMSyAtIG5vdCBpbiB0aGUga2VybmVsLCBidXQgZG9uJ3QgY29tcGxhaW4gKi8KQEAgLTEyNTYsNyArOTI3LDYgQEAKIENPTVBBVElCTEVfSU9DVEwoVENTRVRBVykKIENPTVBBVElCTEVfSU9DVEwoVENTRVRBRikKIENPTVBBVElCTEVfSU9DVEwoVENTQlJLKQotVUxPTkdfSU9DVEwoVENTQlJLUCkKIENPTVBBVElCTEVfSU9DVEwoVENYT05DKQogQ09NUEFUSUJMRV9JT0NUTChUQ0ZMU0gpCiBDT01QQVRJQkxFX0lPQ1RMKFRDR0VUUykKQEAgLTEyNjYsNyArOTM2LDYgQEAKIENPTVBBVElCTEVfSU9DVEwoVElPQ0xJTlVYKQogQ09NUEFUSUJMRV9JT0NUTChUSU9DU0JSSykKIENPTVBBVElCTEVfSU9DVEwoVElPQ0NCUkspCi1VTE9OR19JT0NUTChUSU9DTUlXQUlUKQogQ09NUEFUSUJMRV9JT0NUTChUSU9DR0lDT1VOVCkKIC8qIExpdHRsZSB0ICovCiBDT01QQVRJQkxFX0lPQ1RMKFRJT0NHRVREKQpAQCAtMTI4OCw3ICs5NTcsNiBAQAogQ09NUEFUSUJMRV9JT0NUTChUSU9DT1VUUSkKIENPTVBBVElCTEVfSU9DVEwoVElPQ1NQR1JQKQogQ09NUEFUSUJMRV9JT0NUTChUSU9DR1BHUlApCi1VTE9OR19JT0NUTChUSU9DU0NUVFkpCiBDT01QQVRJQkxFX0lPQ1RMKFRJT0NHUFROKQogQ09NUEFUSUJMRV9JT0NUTChUSU9DU1BUTENLKQogQ09NUEFUSUJMRV9JT0NUTChUSU9DU0VSR0VUTFNSKQpAQCAtMTMxMSw0NCArOTc5LDExIEBACiAvKiAnWCcgLSBvcmlnaW5hbGx5IFhGUyBidXQgc29tZSBub3cgaW4gdGhlIFZGUyAqLwogQ09NUEFUSUJMRV9JT0NUTChGSUZSRUVaRSkKIENPTVBBVElCTEVfSU9DVEwoRklUSEFXKQotLyogUkFJRCAqLwotQ09NUEFUSUJMRV9JT0NUTChSQUlEX1ZFUlNJT04pCi1DT01QQVRJQkxFX0lPQ1RMKEdFVF9BUlJBWV9JTkZPKQotQ09NUEFUSUJMRV9JT0NUTChHRVRfRElTS19JTkZPKQotQ09NUEFUSUJMRV9JT0NUTChQUklOVF9SQUlEX0RFQlVHKQotQ09NUEFUSUJMRV9JT0NUTChSQUlEX0FVVE9SVU4pCi1DT01QQVRJQkxFX0lPQ1RMKENMRUFSX0FSUkFZKQotQ09NUEFUSUJMRV9JT0NUTChBRERfTkVXX0RJU0spCi1VTE9OR19JT0NUTChIT1RfUkVNT1ZFX0RJU0spCi1DT01QQVRJQkxFX0lPQ1RMKFNFVF9BUlJBWV9JTkZPKQotQ09NUEFUSUJMRV9JT0NUTChTRVRfRElTS19JTkZPKQotQ09NUEFUSUJMRV9JT0NUTChXUklURV9SQUlEX0lORk8pCi1DT01QQVRJQkxFX0lPQ1RMKFVOUFJPVEVDVF9BUlJBWSkKLUNPTVBBVElCTEVfSU9DVEwoUFJPVEVDVF9BUlJBWSkKLVVMT05HX0lPQ1RMKEhPVF9BRERfRElTSykKLVVMT05HX0lPQ1RMKFNFVF9ESVNLX0ZBVUxUWSkKLUNPTVBBVElCTEVfSU9DVEwoUlVOX0FSUkFZKQotQ09NUEFUSUJMRV9JT0NUTChTVE9QX0FSUkFZKQotQ09NUEFUSUJMRV9JT0NUTChTVE9QX0FSUkFZX1JPKQotQ09NUEFUSUJMRV9JT0NUTChSRVNUQVJUX0FSUkFZX1JXKQotQ09NUEFUSUJMRV9JT0NUTChHRVRfQklUTUFQX0ZJTEUpCi1VTE9OR19JT0NUTChTRVRfQklUTUFQX0ZJTEUpCi0vKiBCaWcgSyAqLwotQ09NUEFUSUJMRV9JT0NUTChQSU9fRk9OVCkKLUNPTVBBVElCTEVfSU9DVEwoR0lPX0ZPTlQpCi1DT01QQVRJQkxFX0lPQ1RMKFBJT19DTUFQKQotQ09NUEFUSUJMRV9JT0NUTChHSU9fQ01BUCkKLVVMT05HX0lPQ1RMKEtEU0lHQUNDRVBUKQogQ09NUEFUSUJMRV9JT0NUTChLREdFVEtFWUNPREUpCiBDT01QQVRJQkxFX0lPQ1RMKEtEU0VUS0VZQ09ERSkKLVVMT05HX0lPQ1RMKEtJT0NTT1VORCkKLVVMT05HX0lPQ1RMKEtETUtUT05FKQogQ09NUEFUSUJMRV9JT0NUTChLREdLQlRZUEUpCi1VTE9OR19JT0NUTChLRFNFVE1PREUpCiBDT01QQVRJQkxFX0lPQ1RMKEtER0VUTU9ERSkKLVVMT05HX0lPQ1RMKEtEU0tCTU9ERSkKIENPTVBBVElCTEVfSU9DVEwoS0RHS0JNT0RFKQotVUxPTkdfSU9DVEwoS0RTS0JNRVRBKQogQ09NUEFUSUJMRV9JT0NUTChLREdLQk1FVEEpCiBDT01QQVRJQkxFX0lPQ1RMKEtER0tCRU5UKQogQ09NUEFUSUJMRV9JT0NUTChLRFNLQkVOVCkKQEAgLTEzNTgsMTUgKzk5Myw3IEBACiBDT01QQVRJQkxFX0lPQ1RMKEtEU0tCRElBQ1IpCiBDT01QQVRJQkxFX0lPQ1RMKEtES0JEUkVQKQogQ09NUEFUSUJMRV9JT0NUTChLREdLQkxFRCkKLVVMT05HX0lPQ1RMKEtEU0tCTEVEKQogQ09NUEFUSUJMRV9JT0NUTChLREdFVExFRCkKLVVMT05HX0lPQ1RMKEtEU0VUTEVEKQotQ09NUEFUSUJMRV9JT0NUTChHSU9fU0NSTk1BUCkKLUNPTVBBVElCTEVfSU9DVEwoUElPX1NDUk5NQVApCi1DT01QQVRJQkxFX0lPQ1RMKEdJT19VTklTQ1JOTUFQKQotQ09NUEFUSUJMRV9JT0NUTChQSU9fVU5JU0NSTk1BUCkKLUNPTVBBVElCTEVfSU9DVEwoUElPX0ZPTlRSRVNFVCkKLUNPTVBBVElCTEVfSU9DVEwoUElPX1VOSU1BUENMUikKICNpZmRlZiBDT05GSUdfQkxPQ0sKIC8qIEJpZyBTICovCiBDT01QQVRJQkxFX0lPQ1RMKFNDU0lfSU9DVExfR0VUX0lETFVOKQpAQCAtMTM3OCwyMCArMTAwNSw2IEBACiBDT01QQVRJQkxFX0lPQ1RMKFNDU0lfSU9DVExfUFJPQkVfSE9TVCkKIENPTVBBVElCTEVfSU9DVEwoU0NTSV9JT0NUTF9HRVRfUENJKQogI2VuZGlmCi0vKiBCaWcgViAqLwotQ09NUEFUSUJMRV9JT0NUTChWVF9TRVRNT0RFKQotQ09NUEFUSUJMRV9JT0NUTChWVF9HRVRNT0RFKQotQ09NUEFUSUJMRV9JT0NUTChWVF9HRVRTVEFURSkKLUNPTVBBVElCTEVfSU9DVEwoVlRfT1BFTlFSWSkKLVVMT05HX0lPQ1RMKFZUX0FDVElWQVRFKQotVUxPTkdfSU9DVEwoVlRfV0FJVEFDVElWRSkKLVVMT05HX0lPQ1RMKFZUX1JFTERJU1ApCi1VTE9OR19JT0NUTChWVF9ESVNBTExPQ0FURSkKLUNPTVBBVElCTEVfSU9DVEwoVlRfUkVTSVpFKQotQ09NUEFUSUJMRV9JT0NUTChWVF9SRVNJWkVYKQotQ09NUEFUSUJMRV9JT0NUTChWVF9MT0NLU1dJVENIKQotQ09NUEFUSUJMRV9JT0NUTChWVF9VTkxPQ0tTV0lUQ0gpCi1DT01QQVRJQkxFX0lPQ1RMKFZUX0dFVEhJRk9OVE1BU0spCiAvKiBMaXR0bGUgcCAoL2Rldi9ydGMsIC9kZXYvZW52Y3RybCwgZXRjLikgKi8KIENPTVBBVElCTEVfSU9DVEwoUlRDX0FJRV9PTikKIENPTVBBVElCTEVfSU9DVEwoUlRDX0FJRV9PRkYpCkBAIC0xNDIwLDExICsxMDMzLDEyIEBACiAvKiBTb2NrZXQgbGV2ZWwgc3R1ZmYgKi8KIENPTVBBVElCTEVfSU9DVEwoRklPUVNJWkUpCiAjaWZkZWYgQ09ORklHX0JMT0NLCisvKiBsb29wICovCitJR05PUkVfSU9DVEwoTE9PUF9DTFJfRkQpCiAvKiBTRyBzdHVmZiAqLwogQ09NUEFUSUJMRV9JT0NUTChTR19TRVRfVElNRU9VVCkKIENPTVBBVElCTEVfSU9DVEwoU0dfR0VUX1RJTUVPVVQpCiBDT01QQVRJQkxFX0lPQ1RMKFNHX0VNVUxBVEVEX0hPU1QpCi1VTE9OR19JT0NUTChTR19TRVRfVFJBTlNGT1JNKQogQ09NUEFUSUJMRV9JT0NUTChTR19HRVRfVFJBTlNGT1JNKQogQ09NUEFUSUJMRV9JT0NUTChTR19TRVRfUkVTRVJWRURfU0laRSkKIENPTVBBVElCTEVfSU9DVEwoU0dfR0VUX1JFU0VSVkVEX1NJWkUpCkBAIC0xNDc4LDggKzEwOTIsNiBAQAogLyogUFBQT1ggKi8KIENPTVBBVElCTEVfSU9DVEwoUFBQT0VJT0NTRldEKQogQ09NUEFUSUJMRV9JT0NUTChQUFBPRUlPQ0RGV0QpCi0vKiBMUCAqLwotQ09NUEFUSUJMRV9JT0NUTChMUEdFVFNUQVRVUykKIC8qIHBwZGV2ICovCiBDT01QQVRJQkxFX0lPQ1RMKFBQU0VUTU9ERSkKIENPTVBBVElCTEVfSU9DVEwoUFBSU1RBVFVTKQpAQCAtMTY2MSw4ICsxMjczLDYgQEAKIENPTVBBVElCTEVfSU9DVEwoU09VTkRfTUlYRVJfU0VUTEVWRUxTKQogQ09NUEFUSUJMRV9JT0NUTChPU1NfR0VUVkVSU0lPTikKIC8qIEFVVE9GUyAqLwotVUxPTkdfSU9DVEwoQVVUT0ZTX0lPQ19SRUFEWSkKLVVMT05HX0lPQ1RMKEFVVE9GU19JT0NfRkFJTCkKIENPTVBBVElCTEVfSU9DVEwoQVVUT0ZTX0lPQ19DQVRBVE9OSUMpCiBDT01QQVRJQkxFX0lPQ1RMKEFVVE9GU19JT0NfUFJPVE9WRVIpCiBDT01QQVRJQkxFX0lPQ1RMKEFVVE9GU19JT0NfRVhQSVJFKQpAQCAtMTc1NSwzMCArMTM2NSwxMSBAQAogQ09NUEFUSUJMRV9JT0NUTChQQ0lJT0NfTU1BUF9JU19JTykKIENPTVBBVElCTEVfSU9DVEwoUENJSU9DX01NQVBfSVNfTUVNKQogQ09NUEFUSUJMRV9JT0NUTChQQ0lJT0NfV1JJVEVfQ09NQklORSkKLS8qIFVTQiAqLwotQ09NUEFUSUJMRV9JT0NUTChVU0JERVZGU19SRVNFVEVQKQotQ09NUEFUSUJMRV9JT0NUTChVU0JERVZGU19TRVRJTlRFUkZBQ0UpCi1DT01QQVRJQkxFX0lPQ1RMKFVTQkRFVkZTX1NFVENPTkZJR1VSQVRJT04pCi1DT01QQVRJQkxFX0lPQ1RMKFVTQkRFVkZTX0dFVERSSVZFUikKLUNPTVBBVElCTEVfSU9DVEwoVVNCREVWRlNfRElTQ0FSRFVSQikKLUNPTVBBVElCTEVfSU9DVEwoVVNCREVWRlNfQ0xBSU1JTlRFUkZBQ0UpCi1DT01QQVRJQkxFX0lPQ1RMKFVTQkRFVkZTX1JFTEVBU0VJTlRFUkZBQ0UpCi1DT01QQVRJQkxFX0lPQ1RMKFVTQkRFVkZTX0NPTk5FQ1RJTkZPKQotQ09NUEFUSUJMRV9JT0NUTChVU0JERVZGU19IVUJfUE9SVElORk8pCi1DT01QQVRJQkxFX0lPQ1RMKFVTQkRFVkZTX1JFU0VUKQotQ09NUEFUSUJMRV9JT0NUTChVU0JERVZGU19TVUJNSVRVUkIzMikKLUNPTVBBVElCTEVfSU9DVEwoVVNCREVWRlNfUkVBUFVSQjMyKQotQ09NUEFUSUJMRV9JT0NUTChVU0JERVZGU19SRUFQVVJCTkRFTEFZMzIpCi1DT01QQVRJQkxFX0lPQ1RMKFVTQkRFVkZTX0NMRUFSX0hBTFQpCiAvKiBOQkQgKi8KLVVMT05HX0lPQ1RMKE5CRF9TRVRfU09DSykKLVVMT05HX0lPQ1RMKE5CRF9TRVRfQkxLU0laRSkKLVVMT05HX0lPQ1RMKE5CRF9TRVRfU0laRSkKIENPTVBBVElCTEVfSU9DVEwoTkJEX0RPX0lUKQogQ09NUEFUSUJMRV9JT0NUTChOQkRfQ0xFQVJfU09DSykKIENPTVBBVElCTEVfSU9DVEwoTkJEX0NMRUFSX1FVRSkKIENPTVBBVElCTEVfSU9DVEwoTkJEX1BSSU5UX0RFQlVHKQotVUxPTkdfSU9DVEwoTkJEX1NFVF9TSVpFX0JMT0NLUykKIENPTVBBVElCTEVfSU9DVEwoTkJEX0RJU0NPTk5FQ1QpCiAvKiBpMmMgKi8KIENPTVBBVElCTEVfSU9DVEwoSTJDX1NMQVZFKQpAQCAtMTg3OCw0MiArMTQ2OSw2IEBACiBDT01QQVRJQkxFX0lPQ1RMKEpTSU9DR0JVVFRPTlMpCiBDT01QQVRJQkxFX0lPQ1RMKEpTSU9DR05BTUUoMCkpCiAKLS8qIG5vdyB0aGluZ3MgdGhhdCBuZWVkIGhhbmRsZXJzICovCi0jaWZkZWYgQ09ORklHX0JMT0NLCi1IQU5ETEVfSU9DVEwoU0dfSU8sc2dfaW9jdGxfdHJhbnMpCi1IQU5ETEVfSU9DVEwoU0dfR0VUX1JFUVVFU1RfVEFCTEUsIHNnX2dydF90cmFucykKLSNlbmRpZgotSEFORExFX0lPQ1RMKFBQUElPQ0dJRExFMzIsIHBwcF9pb2N0bF90cmFucykKLUhBTkRMRV9JT0NUTChQUFBJT0NTQ09NUFJFU1MzMiwgcHBwX2lvY3RsX3RyYW5zKQotSEFORExFX0lPQ1RMKFBQUElPQ1NQQVNTMzIsIHBwcF9zb2NrX2Zwcm9nX2lvY3RsX3RyYW5zKQotSEFORExFX0lPQ1RMKFBQUElPQ1NBQ1RJVkUzMiwgcHBwX3NvY2tfZnByb2dfaW9jdGxfdHJhbnMpCi0jaWZkZWYgQ09ORklHX0JMT0NLCi1IQU5ETEVfSU9DVEwoTVRJT0NHRVQzMiwgbXRfaW9jdGxfdHJhbnMpCi1IQU5ETEVfSU9DVEwoTVRJT0NQT1MzMiwgbXRfaW9jdGxfdHJhbnMpCi0jZW5kaWYKLSNkZWZpbmUgQVVUT0ZTX0lPQ19TRVRUSU1FT1VUMzIgX0lPV1IoMHg5MywweDY0LHVuc2lnbmVkIGludCkKLUhBTkRMRV9JT0NUTChBVVRPRlNfSU9DX1NFVFRJTUVPVVQzMiwgaW9jX3NldHRpbWVvdXQpCi0jaWZkZWYgQ09ORklHX1ZUCi1IQU5ETEVfSU9DVEwoUElPX0ZPTlRYLCBkb19mb250eF9pb2N0bCkKLUhBTkRMRV9JT0NUTChHSU9fRk9OVFgsIGRvX2ZvbnR4X2lvY3RsKQotSEFORExFX0lPQ1RMKFBJT19VTklNQVAsIGRvX3VuaW1hcF9pb2N0bCkKLUhBTkRMRV9JT0NUTChHSU9fVU5JTUFQLCBkb191bmltYXBfaW9jdGwpCi1IQU5ETEVfSU9DVEwoS0RGT05UT1AsIGRvX2tkZm9udG9wX2lvY3RsKQotI2VuZGlmCi0vKiBPbmUgU01CIGlvY3RsIG5lZWRzIHRyYW5zbGF0aW9ucy4gKi8KLSNkZWZpbmUgU01CX0lPQ19HRVRNT1VOVFVJRF8zMiBfSU9SKCd1JywgMSwgY29tcGF0X3VpZF90KQotSEFORExFX0lPQ1RMKFNNQl9JT0NfR0VUTU9VTlRVSURfMzIsIGRvX3NtYl9nZXRtb3VudHVpZCkKLS8qIGJsb2NrIHN0dWZmICovCi0jaWZkZWYgQ09ORklHX0JMT0NLCi0vKiBsb29wICovCi1JR05PUkVfSU9DVEwoTE9PUF9DTFJfRkQpCi0vKiBSYXcgZGV2aWNlcyAqLwotSEFORExFX0lPQ1RMKFJBV19TRVRCSU5ELCByYXdfaW9jdGwpCi1IQU5ETEVfSU9DVEwoUkFXX0dFVEJJTkQsIHJhd19pb2N0bCkKLSNlbmRpZgotLyogU2VyaWFsICovCi1IQU5ETEVfSU9DVEwoVElPQ0dTRVJJQUwsIHNlcmlhbF9zdHJ1Y3RfaW9jdGwpCi1IQU5ETEVfSU9DVEwoVElPQ1NTRVJJQUwsIHNlcmlhbF9zdHJ1Y3RfaW9jdGwpCiAjaWZkZWYgVElPQ0dMVEMKIENPTVBBVElCTEVfSU9DVEwoVElPQ0dMVEMpCiBDT01QQVRJQkxFX0lPQ1RMKFRJT0NTTFRDKQpAQCAtMTkyOCwzOSArMTQ4Myw2IEBACiBDT01QQVRJQkxFX0lPQ1RMKFRJT0NTVEFSVCkKIENPTVBBVElCTEVfSU9DVEwoVElPQ1NUT1ApCiAjZW5kaWYKLS8qIFVzYmRldmZzICovCi1IQU5ETEVfSU9DVEwoVVNCREVWRlNfQ09OVFJPTDMyLCBkb191c2JkZXZmc19jb250cm9sKQotSEFORExFX0lPQ1RMKFVTQkRFVkZTX0JVTEszMiwgZG9fdXNiZGV2ZnNfYnVsaykKLUhBTkRMRV9JT0NUTChVU0JERVZGU19ESVNDU0lHTkFMMzIsIGRvX3VzYmRldmZzX2Rpc2NzaWduYWwpCi1DT01QQVRJQkxFX0lPQ1RMKFVTQkRFVkZTX0lPQ1RMMzIpCi0vKiBpMmMgKi8KLUhBTkRMRV9JT0NUTChJMkNfRlVOQ1MsIHdfbG9uZykKLUhBTkRMRV9JT0NUTChJMkNfUkRXUiwgZG9faTJjX3Jkd3JfaW9jdGwpCi1IQU5ETEVfSU9DVEwoSTJDX1NNQlVTLCBkb19pMmNfc21idXNfaW9jdGwpCi0vKiBOb3QgaW1wbGVtZW50ZWQgaW4gdGhlIG5hdGl2ZSBrZXJuZWwgKi8KLUhBTkRMRV9JT0NUTChSVENfSVJRUF9SRUFEMzIsIHJ0Y19pb2N0bCkKLUhBTkRMRV9JT0NUTChSVENfSVJRUF9TRVQzMiwgcnRjX2lvY3RsKQotSEFORExFX0lPQ1RMKFJUQ19FUE9DSF9SRUFEMzIsIHJ0Y19pb2N0bCkKLUhBTkRMRV9JT0NUTChSVENfRVBPQ0hfU0VUMzIsIHJ0Y19pb2N0bCkKLQotLyogZHZiICovCi1IQU5ETEVfSU9DVEwoVklERU9fR0VUX0VWRU5ULCBkb192aWRlb19nZXRfZXZlbnQpCi1IQU5ETEVfSU9DVEwoVklERU9fU1RJTExQSUNUVVJFLCBkb192aWRlb19zdGlsbHBpY3R1cmUpCi1IQU5ETEVfSU9DVEwoVklERU9fU0VUX1NQVV9QQUxFVFRFLCBkb192aWRlb19zZXRfc3B1X3BhbGV0dGUpCi0KLS8qIHBhcnBvcnQgKi8KLUNPTVBBVElCTEVfSU9DVEwoTFBUSU1FKQotQ09NUEFUSUJMRV9JT0NUTChMUENIQVIpCi1DT01QQVRJQkxFX0lPQ1RMKExQQUJPUlRPUEVOKQotQ09NUEFUSUJMRV9JT0NUTChMUENBUkVGVUwpCi1DT01QQVRJQkxFX0lPQ1RMKExQV0FJVCkKLUNPTVBBVElCTEVfSU9DVEwoTFBTRVRJUlEpCi1DT01QQVRJQkxFX0lPQ1RMKExQR0VUU1RBVFVTKQotQ09NUEFUSUJMRV9JT0NUTChMUEdFVFNUQVRVUykKLUNPTVBBVElCTEVfSU9DVEwoTFBSRVNFVCkKLS8qTFBHRVRTVEFUUyBub3QgaW1wbGVtZW50ZWQsIGJ1dCBubyBrZXJuZWxzIHNlZW0gdG8gY29tcGlsZSBpdCBpbiBhbnl3YXlzKi8KLUNPTVBBVElCTEVfSU9DVEwoTFBHRVRGTEFHUykKLUhBTkRMRV9JT0NUTChMUFNFVFRJTUVPVVQsIGxwX3RpbWVvdXRfdHJhbnMpCiAKIC8qIGZhdCAncicgaW9jdGxzLiBUaGVzZSBhcmUgaGFuZGxlZCBieSBmYXQgd2l0aCAtPmNvbXBhdF9pb2N0bCwKICAgIGJ1dCB3ZSBkb24ndCB3YW50IHdhcm5pbmdzIG9uIG90aGVyIGZpbGUgc3lzdGVtcy4gU28gZGVjbGFyZQpAQCAtMTk4OCwxMiArMTUxMCwxMTAgQEAKICNlbmRpZgogfTsKIAotI2RlZmluZSBJT0NUTF9IQVNIU0laRSAyNTYKLXN0YXRpYyBzdHJ1Y3QgaW9jdGxfdHJhbnMgKmlvY3RsMzJfaGFzaF90YWJsZVtJT0NUTF9IQVNIU0laRV07Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBpb2N0bDMyX2hhc2godW5zaWduZWQgbG9uZyBjbWQpCisvKgorICogQ29udmVydCBjb21tb24gaW9jdGwgYXJndW1lbnRzIGJhc2VkIG9uIHRoZWlyIGNvbW1hbmQgbnVtYmVyCisgKgorICogUGxlYXNlIGRvIG5vdCBhZGQgYW55IGNvZGUgaW4gaGVyZS4gSW5zdGVhZCwgaW1wbGVtZW50CisgKiBhIGNvbXBhdF9pb2N0bCBvcGVyYXRpb24gaW4gdGhlIHBsYWNlIHRoYXQgaGFuZGxl0ZUgdGhlCisgKiBpb2N0bCBmb3IgdGhlIG5hdGl2ZSBjYXNlLgorICovCitzdGF0aWMgbG9uZyBkb19pb2N0bF90cmFucyhpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsCisJCSB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JcmV0dXJuICgoKGNtZCA+PiA2KSBeIChjbWQgPj4gNCkgXiBjbWQpKSAlIElPQ1RMX0hBU0hTSVpFOworCXZvaWQgX191c2VyICphcmdwID0gY29tcGF0X3B0cihhcmcpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFBQUElPQ0dJRExFMzI6CisJCXJldHVybiBwcHBfZ2lkbGUoZmQsIGNtZCwgYXJncCk7CisJY2FzZSBQUFBJT0NTQ09NUFJFU1MzMjoKKwkJcmV0dXJuIHBwcF9zY29tcHJlc3MoZmQsIGNtZCwgYXJncCk7CisJY2FzZSBQUFBJT0NTUEFTUzMyOgorCWNhc2UgUFBQSU9DU0FDVElWRTMyOgorCQlyZXR1cm4gcHBwX3NvY2tfZnByb2dfaW9jdGxfdHJhbnMoZmQsIGNtZCwgYXJncCk7CisjaWZkZWYgQ09ORklHX0JMT0NLCisJY2FzZSBTR19JTzoKKwkJcmV0dXJuIHNnX2lvY3RsX3RyYW5zKGZkLCBjbWQsIGFyZ3ApOworCWNhc2UgU0dfR0VUX1JFUVVFU1RfVEFCTEU6CisJCXJldHVybiBzZ19ncnRfdHJhbnMoZmQsIGNtZCwgYXJncCk7CisJY2FzZSBNVElPQ0dFVDMyOgorCWNhc2UgTVRJT0NQT1MzMjoKKwkJcmV0dXJuIG10X2lvY3RsX3RyYW5zKGZkLCBjbWQsIGFyZ3ApOworCS8qIFJhdyBkZXZpY2VzICovCisJY2FzZSBSQVdfU0VUQklORDoKKwljYXNlIFJBV19HRVRCSU5EOgorCQlyZXR1cm4gcmF3X2lvY3RsKGZkLCBjbWQsIGFyZ3ApOworI2VuZGlmCisjZGVmaW5lIEFVVE9GU19JT0NfU0VUVElNRU9VVDMyIF9JT1dSKDB4OTMsMHg2NCx1bnNpZ25lZCBpbnQpCisJY2FzZSBBVVRPRlNfSU9DX1NFVFRJTUVPVVQzMjoKKwkJcmV0dXJuIGlvY19zZXR0aW1lb3V0KGZkLCBjbWQsIGFyZ3ApOworCS8qIE9uZSBTTUIgaW9jdGwgbmVlZHMgdHJhbnNsYXRpb25zLiAqLworI2RlZmluZSBTTUJfSU9DX0dFVE1PVU5UVUlEXzMyIF9JT1IoJ3UnLCAxLCBjb21wYXRfdWlkX3QpCisJY2FzZSBTTUJfSU9DX0dFVE1PVU5UVUlEXzMyOgorCQlyZXR1cm4gZG9fc21iX2dldG1vdW50dWlkKGZkLCBjbWQsIGFyZ3ApOworCS8qIFNlcmlhbCAqLworCWNhc2UgVElPQ0dTRVJJQUw6CisJY2FzZSBUSU9DU1NFUklBTDoKKwkJcmV0dXJuIHNlcmlhbF9zdHJ1Y3RfaW9jdGwoZmQsIGNtZCwgYXJncCk7CisJLyogaTJjICovCisJY2FzZSBJMkNfRlVOQ1M6CisJCXJldHVybiB3X2xvbmcoZmQsIGNtZCwgYXJncCk7CisJY2FzZSBJMkNfUkRXUjoKKwkJcmV0dXJuIGRvX2kyY19yZHdyX2lvY3RsKGZkLCBjbWQsIGFyZ3ApOworCWNhc2UgSTJDX1NNQlVTOgorCQlyZXR1cm4gZG9faTJjX3NtYnVzX2lvY3RsKGZkLCBjbWQsIGFyZ3ApOworCS8qIE5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgbmF0aXZlIGtlcm5lbCAqLworCWNhc2UgUlRDX0lSUVBfUkVBRDMyOgorCWNhc2UgUlRDX0lSUVBfU0VUMzI6CisJY2FzZSBSVENfRVBPQ0hfUkVBRDMyOgorCWNhc2UgUlRDX0VQT0NIX1NFVDMyOgorCQlyZXR1cm4gcnRjX2lvY3RsKGZkLCBjbWQsIGFyZ3ApOworCisJLyogZHZiICovCisJY2FzZSBWSURFT19HRVRfRVZFTlQ6CisJCXJldHVybiBkb192aWRlb19nZXRfZXZlbnQoZmQsIGNtZCwgYXJncCk7CisJY2FzZSBWSURFT19TVElMTFBJQ1RVUkU6CisJCXJldHVybiBkb192aWRlb19zdGlsbHBpY3R1cmUoZmQsIGNtZCwgYXJncCk7CisJY2FzZSBWSURFT19TRVRfU1BVX1BBTEVUVEU6CisJCXJldHVybiBkb192aWRlb19zZXRfc3B1X3BhbGV0dGUoZmQsIGNtZCwgYXJncCk7CisJfQorCisJLyoKKwkgKiBUaGVzZSB0YWtlIGFuIGludGVnZXIgaW5zdGVhZCBvZiBhIHBvaW50ZXIgYXMgJ2FyZycsCisJICogc28gd2UgbXVzdCBub3QgZG8gYSBjb21wYXRfcHRyKCkgdHJhbnNsYXRpb24uCisJICovCisJc3dpdGNoIChjbWQpIHsKKwkvKiBCaWcgVCAqLworCWNhc2UgVENTQlJLUDoKKwljYXNlIFRJT0NNSVdBSVQ6CisJY2FzZSBUSU9DU0NUVFk6CisJLyogUkFJRCAqLworCWNhc2UgSE9UX1JFTU9WRV9ESVNLOgorCWNhc2UgSE9UX0FERF9ESVNLOgorCWNhc2UgU0VUX0RJU0tfRkFVTFRZOgorCWNhc2UgU0VUX0JJVE1BUF9GSUxFOgorCS8qIEJpZyBLICovCisJY2FzZSBLRFNJR0FDQ0VQVDoKKwljYXNlIEtJT0NTT1VORDoKKwljYXNlIEtETUtUT05FOgorCWNhc2UgS0RTRVRNT0RFOgorCWNhc2UgS0RTS0JNT0RFOgorCWNhc2UgS0RTS0JNRVRBOgorCWNhc2UgS0RTS0JMRUQ6CisJY2FzZSBLRFNFVExFRDoKKwkvKiBTRyBzdHVmZiAqLworCWNhc2UgU0dfU0VUX1RSQU5TRk9STToKKwkvKiBBVVRPRlMgKi8KKwljYXNlIEFVVE9GU19JT0NfUkVBRFk6CisJY2FzZSBBVVRPRlNfSU9DX0ZBSUw6CisJLyogTkJEICovCisJY2FzZSBOQkRfU0VUX1NPQ0s6CisJY2FzZSBOQkRfU0VUX0JMS1NJWkU6CisJY2FzZSBOQkRfU0VUX1NJWkU6CisJY2FzZSBOQkRfU0VUX1NJWkVfQkxPQ0tTOgorCQlyZXR1cm4gZG9fdmZzX2lvY3RsKGZpbGUsIGZkLCBjbWQsIGFyZyk7CisJfQorCisJcmV0dXJuIC1FTk9JT0NUTENNRDsKIH0KIAogc3RhdGljIHZvaWQgY29tcGF0X2lvY3RsX2Vycm9yKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgZmQsCkBAIC0yMDI1LDEyICsxNjQ1LDMzIEBACiAJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYXRoKTsKIH0KIAorc3RhdGljIGludCBjb21wYXRfaW9jdGxfY2hlY2tfdGFibGUodW5zaWduZWQgaW50IHhjbWQpCit7CisJaW50IGk7CisJY29uc3QgaW50IG1heCA9IEFSUkFZX1NJWkUoaW9jdGxfcG9pbnRlcikgLSAxOworCisJQlVJTERfQlVHX09OKG1heCA+PSAoMSA8PCAxNikpOworCisJLyogZ3Vlc3MgaW5pdGlhbCBvZmZzZXQgaW50byB0YWJsZSwgYXNzdW1pbmcgYQorCSAgIG5vcm1hbGl6ZWQgZGlzdHJpYnV0aW9uICovCisJaSA9ICgoeGNtZCA+PiAxNikgKiBtYXgpID4+IDE2OworCisJLyogZG8gbGluZWFyIHNlYXJjaCB1cCBmaXJzdCwgdW50aWwgZ3JlYXRlciBvciBlcXVhbCAqLworCXdoaWxlIChpb2N0bF9wb2ludGVyW2ldIDwgeGNtZCAmJiBpIDwgbWF4KQorCQlpKys7CisKKwkvKiB0aGVuIGRvIGxpbmVhciBzZWFyY2ggZG93biAqLworCXdoaWxlIChpb2N0bF9wb2ludGVyW2ldID4geGNtZCAmJiBpID4gMCkKKwkJaS0tOworCisJcmV0dXJuIGlvY3RsX3BvaW50ZXJbaV0gPT0geGNtZDsKK30KKwogYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfaW9jdGwodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLAogCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBmaWxlICpmaWxwOwogCWludCBlcnJvciA9IC1FQkFERjsKLQlzdHJ1Y3QgaW9jdGxfdHJhbnMgKnQ7CiAJaW50IGZwdXRfbmVlZGVkOwogCiAJZmlscCA9IGZnZXRfbGlnaHQoZmQsICZmcHV0X25lZWRlZCk7CkBAIC0yMDU4LDcgKzE2OTksNyBAQAogI2lmIGRlZmluZWQoQ09ORklHX0lBNjQpIHx8IGRlZmluZWQoQ09ORklHX1g4Nl82NCkKIAljYXNlIEZTX0lPQ19SRVNWU1BfMzI6CiAJY2FzZSBGU19JT0NfUkVTVlNQNjRfMzI6Ci0JCWVycm9yID0gY29tcGF0X2lvY3RsX3ByZWFsbG9jYXRlKGZpbHAsIGFyZyk7CisJCWVycm9yID0gY29tcGF0X2lvY3RsX3ByZWFsbG9jYXRlKGZpbHAsIGNvbXBhdF9wdHIoYXJnKSk7CiAJCWdvdG8gb3V0X2ZwdXQ7CiAjZWxzZQogCWNhc2UgRlNfSU9DX1JFU1ZTUDoKQEAgLTIwODcsMTIgKzE3MjgsMTEgQEAKIAkJYnJlYWs7CiAJfQogCi0JZm9yICh0ID0gaW9jdGwzMl9oYXNoX3RhYmxlW2lvY3RsMzJfaGFzaChjbWQpXTsgdDsgdCA9IHQtPm5leHQpIHsKLQkJaWYgKHQtPmNtZCA9PSBjbWQpCi0JCQlnb3RvIGZvdW5kX2hhbmRsZXI7Ci0JfQorCWlmIChjb21wYXRfaW9jdGxfY2hlY2tfdGFibGUoWEZPUk0oY21kKSkpCisJCWdvdG8gZm91bmRfaGFuZGxlcjsKIAotCXsKKwllcnJvciA9IGRvX2lvY3RsX3RyYW5zKGZkLCBjbWQsIGFyZywgZmlscCk7CisJaWYgKGVycm9yID09IC1FTk9JT0NUTENNRCkgewogCQlzdGF0aWMgaW50IGNvdW50OwogCiAJCWlmICgrK2NvdW50IDw9IDUwKQpAQCAtMjEwMywxMyArMTc0Myw3IEBACiAJZ290byBvdXRfZnB1dDsKIAogIGZvdW5kX2hhbmRsZXI6Ci0JaWYgKHQtPmhhbmRsZXIpIHsKLQkJbG9ja19rZXJuZWwoKTsKLQkJZXJyb3IgPSB0LT5oYW5kbGVyKGZkLCBjbWQsIGFyZywgZmlscCk7Ci0JCXVubG9ja19rZXJuZWwoKTsKLQkJZ290byBvdXRfZnB1dDsKLQl9Ci0KKwlhcmcgPSAodW5zaWduZWQgbG9uZyljb21wYXRfcHRyKGFyZyk7CiAgZG9faW9jdGw6CiAJZXJyb3IgPSBkb192ZnNfaW9jdGwoZmlscCwgZmQsIGNtZCwgYXJnKTsKICBvdXRfZnB1dDoKQEAgLTIxMTgsMzUgKzE3NTIsMjIgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLXN0YXRpYyB2b2lkIGlvY3RsMzJfaW5zZXJ0X3RyYW5zbGF0aW9uKHN0cnVjdCBpb2N0bF90cmFucyAqdHJhbnMpCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3N5czMyX2lvY3RsX2NtcChjb25zdCB2b2lkICpwLCBjb25zdCB2b2lkICpxKQogewotCXVuc2lnbmVkIGxvbmcgaGFzaDsKLQlzdHJ1Y3QgaW9jdGxfdHJhbnMgKnQ7Ci0KLQloYXNoID0gaW9jdGwzMl9oYXNoICh0cmFucy0+Y21kKTsKLQlpZiAoIWlvY3RsMzJfaGFzaF90YWJsZVtoYXNoXSkKLQkJaW9jdGwzMl9oYXNoX3RhYmxlW2hhc2hdID0gdHJhbnM7Ci0JZWxzZSB7Ci0JCXQgPSBpb2N0bDMyX2hhc2hfdGFibGVbaGFzaF07Ci0JCXdoaWxlICh0LT5uZXh0KQotCQkJdCA9IHQtPm5leHQ7Ci0JCXRyYW5zLT5uZXh0ID0gTlVMTDsKLQkJdC0+bmV4dCA9IHRyYW5zOwotCX0KKwl1bnNpZ25lZCBpbnQgYSwgYjsKKwlhID0gKih1bnNpZ25lZCBpbnQgKilwOworCWIgPSAqKHVuc2lnbmVkIGludCAqKXE7CisJaWYgKGEgPiBiKQorCQlyZXR1cm4gMTsKKwlpZiAoYSA8IGIpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9zeXMzMl9pb2N0bCh2b2lkKQogewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW9jdGxfc3RhcnQpOyBpKyspIHsKLQkJaWYgKGlvY3RsX3N0YXJ0W2ldLm5leHQpIHsKLQkJCXByaW50aygiaW9jdGwgdHJhbnNsYXRpb24gJWQgYmFkXG4iLGkpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJaW9jdGwzMl9pbnNlcnRfdHJhbnNsYXRpb24oJmlvY3RsX3N0YXJ0W2ldKTsKLQl9CisJc29ydChpb2N0bF9wb2ludGVyLCBBUlJBWV9TSVpFKGlvY3RsX3BvaW50ZXIpLCBzaXplb2YoKmlvY3RsX3BvaW50ZXIpLAorCQlpbml0X3N5czMyX2lvY3RsX2NtcCwgTlVMTCk7CiAJcmV0dXJuIDA7CiB9CiBfX2luaXRjYWxsKGluaXRfc3lzMzJfaW9jdGwpOwpkaWZmIC0tZ2l0IGEvZnMvZGVidWdmcy9pbm9kZS5jIGIvZnMvZGVidWdmcy9pbm9kZS5jCmluZGV4IDBkMjNiNTIuLmI0ODYxNjkgMTAwNjQ0Ci0tLSBhL2ZzL2RlYnVnZnMvaW5vZGUuYworKysgYi9mcy9kZWJ1Z2ZzL2lub2RlLmMKQEAgLTMyLDcgKzMyLDkgQEAKIHN0YXRpYyBpbnQgZGVidWdmc19tb3VudF9jb3VudDsKIHN0YXRpYyBib29sIGRlYnVnZnNfcmVnaXN0ZXJlZDsKIAotc3RhdGljIHN0cnVjdCBpbm9kZSAqZGVidWdmc19nZXRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG1vZGUsIGRldl90IGRldikKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmRlYnVnZnNfZ2V0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBtb2RlLCBkZXZfdCBkZXYsCisJCQkJICAgICAgIHZvaWQgKmRhdGEsIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMpCisKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbmV3X2lub2RlKHNiKTsKIApAQCAtNDQsMTQgKzQ2LDE4IEBACiAJCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIG1vZGUsIGRldik7CiAJCQlicmVhazsKIAkJY2FzZSBTX0lGUkVHOgotCQkJaW5vZGUtPmlfZm9wID0gJmRlYnVnZnNfZmlsZV9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfZm9wID0gZm9wcyA/IGZvcHMgOiAmZGVidWdmc19maWxlX29wZXJhdGlvbnM7CisJCQlpbm9kZS0+aV9wcml2YXRlID0gZGF0YTsKIAkJCWJyZWFrOwogCQljYXNlIFNfSUZMTks6CiAJCQlpbm9kZS0+aV9vcCA9ICZkZWJ1Z2ZzX2xpbmtfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX2ZvcCA9IGZvcHM7CisJCQlpbm9kZS0+aV9wcml2YXRlID0gZGF0YTsKIAkJCWJyZWFrOwogCQljYXNlIFNfSUZESVI6CiAJCQlpbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7Ci0JCQlpbm9kZS0+aV9mb3AgPSAmc2ltcGxlX2Rpcl9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfZm9wID0gZm9wcyA/IGZvcHMgOiAmc2ltcGxlX2Rpcl9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfcHJpdmF0ZSA9IGRhdGE7CiAKIAkJCS8qIGRpcmVjdG9yeSBpbm9kZXMgc3RhcnQgb2ZmIHdpdGggaV9ubGluayA9PSAyCiAJCQkgKiAoZm9yICIuIiBlbnRyeSkgKi8KQEAgLTY0LDcgKzcwLDggQEAKIAogLyogU01QLXNhZmUgKi8KIHN0YXRpYyBpbnQgZGVidWdmc19ta25vZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAotCQkJIGludCBtb2RlLCBkZXZfdCBkZXYpCisJCQkgaW50IG1vZGUsIGRldl90IGRldiwgdm9pZCAqZGF0YSwKKwkJCSBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJaW50IGVycm9yID0gLUVQRVJNOwpAQCAtNzIsNyArNzksNyBAQAogCWlmIChkZW50cnktPmRfaW5vZGUpCiAJCXJldHVybiAtRUVYSVNUOwogCi0JaW5vZGUgPSBkZWJ1Z2ZzX2dldF9pbm9kZShkaXItPmlfc2IsIG1vZGUsIGRldik7CisJaW5vZGUgPSBkZWJ1Z2ZzX2dldF9pbm9kZShkaXItPmlfc2IsIG1vZGUsIGRldiwgZGF0YSwgZm9wcyk7CiAJaWYgKGlub2RlKSB7CiAJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CiAJCWRnZXQoZGVudHJ5KTsKQEAgLTgxLDEyICs4OCwxMyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotc3RhdGljIGludCBkZWJ1Z2ZzX21rZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlKQorc3RhdGljIGludCBkZWJ1Z2ZzX21rZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAorCQkJIHZvaWQgKmRhdGEsIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMpCiB7CiAJaW50IHJlczsKIAogCW1vZGUgPSAobW9kZSAmIChTX0lSV1hVR08gfCBTX0lTVlRYKSkgfCBTX0lGRElSOwotCXJlcyA9IGRlYnVnZnNfbWtub2QoZGlyLCBkZW50cnksIG1vZGUsIDApOworCXJlcyA9IGRlYnVnZnNfbWtub2QoZGlyLCBkZW50cnksIG1vZGUsIDAsIGRhdGEsIGZvcHMpOwogCWlmICghcmVzKSB7CiAJCWluY19ubGluayhkaXIpOwogCQlmc25vdGlmeV9ta2RpcihkaXIsIGRlbnRyeSk7CkBAIC05NCwxOCArMTAyLDIwIEBACiAJcmV0dXJuIHJlczsKIH0KIAotc3RhdGljIGludCBkZWJ1Z2ZzX2xpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCitzdGF0aWMgaW50IGRlYnVnZnNfbGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJCXZvaWQgKmRhdGEsIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMpCiB7CiAJbW9kZSA9IChtb2RlICYgU19JQUxMVUdPKSB8IFNfSUZMTks7Ci0JcmV0dXJuIGRlYnVnZnNfbWtub2QoZGlyLCBkZW50cnksIG1vZGUsIDApOworCXJldHVybiBkZWJ1Z2ZzX21rbm9kKGRpciwgZGVudHJ5LCBtb2RlLCAwLCBkYXRhLCBmb3BzKTsKIH0KIAotc3RhdGljIGludCBkZWJ1Z2ZzX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSkKK3N0YXRpYyBpbnQgZGVidWdmc19jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisJCQkgIHZvaWQgKmRhdGEsIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMpCiB7CiAJaW50IHJlczsKIAogCW1vZGUgPSAobW9kZSAmIFNfSUFMTFVHTykgfCBTX0lGUkVHOwotCXJlcyA9IGRlYnVnZnNfbWtub2QoZGlyLCBkZW50cnksIG1vZGUsIDApOworCXJlcyA9IGRlYnVnZnNfbWtub2QoZGlyLCBkZW50cnksIG1vZGUsIDAsIGRhdGEsIGZvcHMpOwogCWlmICghcmVzKQogCQlmc25vdGlmeV9jcmVhdGUoZGlyLCBkZW50cnkpOwogCXJldHVybiByZXM7CkBAIC0xMzksNyArMTQ5LDkgQEAKIAogc3RhdGljIGludCBkZWJ1Z2ZzX2NyZWF0ZV9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLAogCQkJCSAgc3RydWN0IGRlbnRyeSAqcGFyZW50LAotCQkJCSAgc3RydWN0IGRlbnRyeSAqKmRlbnRyeSkKKwkJCQkgIHN0cnVjdCBkZW50cnkgKipkZW50cnksCisJCQkJICB2b2lkICpkYXRhLAorCQkJCSAgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wcykKIHsKIAlpbnQgZXJyb3IgPSAwOwogCkBAIC0xNjQsMTMgKzE3NiwxNiBAQAogCWlmICghSVNfRVJSKCpkZW50cnkpKSB7CiAJCXN3aXRjaCAobW9kZSAmIFNfSUZNVCkgewogCQljYXNlIFNfSUZESVI6Ci0JCQllcnJvciA9IGRlYnVnZnNfbWtkaXIocGFyZW50LT5kX2lub2RlLCAqZGVudHJ5LCBtb2RlKTsKKwkJCWVycm9yID0gZGVidWdmc19ta2RpcihwYXJlbnQtPmRfaW5vZGUsICpkZW50cnksIG1vZGUsCisJCQkJCSAgICAgIGRhdGEsIGZvcHMpOwogCQkJYnJlYWs7CiAJCWNhc2UgU19JRkxOSzoKLQkJCWVycm9yID0gZGVidWdmc19saW5rKHBhcmVudC0+ZF9pbm9kZSwgKmRlbnRyeSwgbW9kZSk7CisJCQllcnJvciA9IGRlYnVnZnNfbGluayhwYXJlbnQtPmRfaW5vZGUsICpkZW50cnksIG1vZGUsCisJCQkJCSAgICAgZGF0YSwgZm9wcyk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWVycm9yID0gZGVidWdmc19jcmVhdGUocGFyZW50LT5kX2lub2RlLCAqZGVudHJ5LCBtb2RlKTsKKwkJCWVycm9yID0gZGVidWdmc19jcmVhdGUocGFyZW50LT5kX2lub2RlLCAqZGVudHJ5LCBtb2RlLAorCQkJCQkgICAgICAgZGF0YSwgZm9wcyk7CiAJCQlicmVhazsKIAkJfQogCQlkcHV0KCpkZW50cnkpOwpAQCAtMjIxLDE5ICsyMzYsMTMgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZXhpdDsKIAotCWVycm9yID0gZGVidWdmc19jcmVhdGVfYnlfbmFtZShuYW1lLCBtb2RlLCBwYXJlbnQsICZkZW50cnkpOworCWVycm9yID0gZGVidWdmc19jcmVhdGVfYnlfbmFtZShuYW1lLCBtb2RlLCBwYXJlbnQsICZkZW50cnksCisJCQkJICAgICAgIGRhdGEsIGZvcHMpOwogCWlmIChlcnJvcikgewogCQlkZW50cnkgPSBOVUxMOwogCQlzaW1wbGVfcmVsZWFzZV9mcygmZGVidWdmc19tb3VudCwgJmRlYnVnZnNfbW91bnRfY291bnQpOwogCQlnb3RvIGV4aXQ7CiAJfQotCi0JaWYgKGRlbnRyeS0+ZF9pbm9kZSkgewotCQlpZiAoZGF0YSkKLQkJCWRlbnRyeS0+ZF9pbm9kZS0+aV9wcml2YXRlID0gZGF0YTsKLQkJaWYgKGZvcHMpCi0JCQlkZW50cnktPmRfaW5vZGUtPmlfZm9wID0gZm9wczsKLQl9CiBleGl0OgogCXJldHVybiBkZW50cnk7CiB9CmRpZmYgLS1naXQgYS9mcy9kZXZwdHMvaW5vZGUuYyBiL2ZzL2RldnB0cy9pbm9kZS5jCmluZGV4IGQ1ZjhjOTYuLjg4ODJlY2MgMTAwNjQ0Ci0tLSBhL2ZzL2RldnB0cy9pbm9kZS5jCisrKyBiL2ZzL2RldnB0cy9pbm9kZS5jCkBAIC01MTcsMTEgKzUxNywyMyBAQAogCiBzdHJ1Y3QgdHR5X3N0cnVjdCAqZGV2cHRzX2dldF90dHkoc3RydWN0IGlub2RlICpwdHNfaW5vZGUsIGludCBudW1iZXIpCiB7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisKIAlCVUdfT04ocHRzX2lub2RlLT5pX3JkZXYgPT0gTUtERVYoVFRZQVVYX01BSk9SLCBQVE1YX01JTk9SKSk7CiAKKwkvKiBFbnN1cmUgZGVudHJ5IGhhcyBub3QgYmVlbiBkZWxldGVkIGJ5IGRldnB0c19wdHlfa2lsbCgpICovCisJZGVudHJ5ID0gZF9maW5kX2FsaWFzKHB0c19pbm9kZSk7CisJaWYgKCFkZW50cnkpCisJCXJldHVybiBOVUxMOworCisJdHR5ID0gTlVMTDsKIAlpZiAocHRzX2lub2RlLT5pX3NiLT5zX21hZ2ljID09IERFVlBUU19TVVBFUl9NQUdJQykKLQkJcmV0dXJuIChzdHJ1Y3QgdHR5X3N0cnVjdCAqKXB0c19pbm9kZS0+aV9wcml2YXRlOwotCXJldHVybiBOVUxMOworCQl0dHkgPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKilwdHNfaW5vZGUtPmlfcHJpdmF0ZTsKKworCWRwdXQoZGVudHJ5KTsKKworCXJldHVybiB0dHk7CiB9CiAKIHZvaWQgZGV2cHRzX3B0eV9raWxsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCmRpZmYgLS1naXQgYS9mcy9leHQyL2Rpci5jIGIvZnMvZXh0Mi9kaXIuYwppbmRleCA2Y2RlOTcwLi5mYzJiZDA1IDEwMDY0NAotLS0gYS9mcy9leHQyL2Rpci5jCisrKyBiL2ZzL2V4dDIvZGlyLmMKQEAgLTM1Myw4ICszNTMsOCBAQAogICoJZXh0Ml9maW5kX2VudHJ5KCkKICAqCiAgKiBmaW5kcyBhbiBlbnRyeSBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB3aXRoIHRoZSB3YW50ZWQgbmFtZS4gSXQKLSAqIHJldHVybnMgdGhlIHBhZ2UgaW4gd2hpY2ggdGhlIGVudHJ5IHdhcyBmb3VuZCwgYW5kIHRoZSBlbnRyeSBpdHNlbGYKLSAqIChhcyBhIHBhcmFtZXRlciAtIHJlc19kaXIpLiBQYWdlIGlzIHJldHVybmVkIG1hcHBlZCBhbmQgdW5sb2NrZWQuCisgKiByZXR1cm5zIHRoZSBwYWdlIGluIHdoaWNoIHRoZSBlbnRyeSB3YXMgZm91bmQgKGFzIGEgcGFyYW1ldGVyIC0gcmVzX3BhZ2UpLAorICogYW5kIHRoZSBlbnRyeSBpdHNlbGYuIFBhZ2UgaXMgcmV0dXJuZWQgbWFwcGVkIGFuZCB1bmxvY2tlZC4KICAqIEVudHJ5IGlzIGd1YXJhbnRlZWQgdG8gYmUgdmFsaWQuCiAgKi8KIHN0cnVjdCBleHQyX2Rpcl9lbnRyeV8yICpleHQyX2ZpbmRfZW50cnkgKHN0cnVjdCBpbm9kZSAqIGRpciwKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvZXh0Mi5oIGIvZnMvZXh0Mi9leHQyLmgKaW5kZXggOWE4YThlMi4uZGEzMThiMCAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9leHQyLmgKKysrIGIvZnMvZXh0Mi9leHQyLmgKQEAgLTE0Miw3ICsxNDIsNyBAQAogLyogc3VwZXIuYyAqLwogZXh0ZXJuIHZvaWQgZXh0Ml9lcnJvciAoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pCiAJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOwotZXh0ZXJuIHZvaWQgZXh0Ml93YXJuaW5nIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikKK2V4dGVybiB2b2lkIGV4dDJfbXNnKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKQogCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKIGV4dGVybiB2b2lkIGV4dDJfdXBkYXRlX2R5bmFtaWNfcmV2IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIGV4dGVybiB2b2lkIGV4dDJfd3JpdGVfc3VwZXIgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvaW5vZGUuYyBiL2ZzL2V4dDIvaW5vZGUuYwppbmRleCBhZGU2MzQwLi43MWIwMzJjIDEwMDY0NAotLS0gYS9mcy9leHQyL2lub2RlLmMKKysrIGIvZnMvZXh0Mi9pbm9kZS5jCkBAIC0xMzcsNyArMTM3LDggQEAKIAlpbnQgZmluYWwgPSAwOwogCiAJaWYgKGlfYmxvY2sgPCAwKSB7Ci0JCWV4dDJfd2FybmluZyAoaW5vZGUtPmlfc2IsICJleHQyX2Jsb2NrX3RvX3BhdGgiLCAiYmxvY2sgPCAwIik7CisJCWV4dDJfbXNnKGlub2RlLT5pX3NiLCBLRVJOX1dBUk5JTkcsCisJCQkid2FybmluZzogJXM6IGJsb2NrIDwgMCIsIF9fZnVuY19fKTsKIAl9IGVsc2UgaWYgKGlfYmxvY2sgPCBkaXJlY3RfYmxvY2tzKSB7CiAJCW9mZnNldHNbbisrXSA9IGlfYmxvY2s7CiAJCWZpbmFsID0gZGlyZWN0X2Jsb2NrczsKQEAgLTE1Nyw3ICsxNTgsOCBAQAogCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrICYgKHB0cnMgLSAxKTsKIAkJZmluYWwgPSBwdHJzOwogCX0gZWxzZSB7Ci0JCWV4dDJfd2FybmluZyAoaW5vZGUtPmlfc2IsICJleHQyX2Jsb2NrX3RvX3BhdGgiLCAiYmxvY2sgPiBiaWciKTsKKwkJZXh0Ml9tc2coaW5vZGUtPmlfc2IsIEtFUk5fV0FSTklORywKKwkJCSJ3YXJuaW5nOiAlczogYmxvY2sgaXMgdG9vIGJpZyIsIF9fZnVuY19fKTsKIAl9CiAJaWYgKGJvdW5kYXJ5KQogCQkqYm91bmRhcnkgPSBmaW5hbCAtIDEgLSAoaV9ibG9jayAmIChwdHJzIC0gMSkpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9zdXBlci5jIGIvZnMvZXh0Mi9zdXBlci5jCmluZGV4IDFhOWZmZWUuLjEzODg4MDIgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvc3VwZXIuYworKysgYi9mcy9leHQyL3N1cGVyLmMKQEAgLTU4LDI3ICs1OCwyNyBAQAogCX0KIAogCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JcHJpbnRrKEtFUk5fQ1JJVCAiRVhUMi1mcyBlcnJvciAoZGV2aWNlICVzKTogJXM6ICIsc2ItPnNfaWQsIGZ1bmN0aW9uKTsKKwlwcmludGsoS0VSTl9DUklUICJFWFQyLWZzICglcyk6IGVycm9yOiAlczogIiwgc2ItPnNfaWQsIGZ1bmN0aW9uKTsKIAl2cHJpbnRrKGZtdCwgYXJncyk7CiAJcHJpbnRrKCJcbiIpOwogCXZhX2VuZChhcmdzKTsKIAogCWlmICh0ZXN0X29wdChzYiwgRVJST1JTX1BBTklDKSkKLQkJcGFuaWMoIkVYVDItZnMgcGFuaWMgZnJvbSBwcmV2aW91cyBlcnJvclxuIik7CisJCXBhbmljKCJFWFQyLWZzOiBwYW5pYyBmcm9tIHByZXZpb3VzIGVycm9yXG4iKTsKIAlpZiAodGVzdF9vcHQoc2IsIEVSUk9SU19STykpIHsKLQkJcHJpbnRrKCJSZW1vdW50aW5nIGZpbGVzeXN0ZW0gcmVhZC1vbmx5XG4iKTsKKwkJZXh0Ml9tc2coc2IsIEtFUk5fQ1JJVCwKKwkJCSAgICAgImVycm9yOiByZW1vdW50aW5nIGZpbGVzeXN0ZW0gcmVhZC1vbmx5Iik7CiAJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKIAl9CiB9CiAKLXZvaWQgZXh0Ml93YXJuaW5nIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgY29uc3QgY2hhciAqIGZ1bmN0aW9uLAotCQkgICBjb25zdCBjaGFyICogZm10LCAuLi4pCit2b2lkIGV4dDJfbXNnKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKnByZWZpeCwKKwkJY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAJdmFfbGlzdCBhcmdzOwogCiAJdmFfc3RhcnQoYXJncywgZm10KTsKLQlwcmludGsoS0VSTl9XQVJOSU5HICJFWFQyLWZzIHdhcm5pbmcgKGRldmljZSAlcyk6ICVzOiAiLAotCSAgICAgICBzYi0+c19pZCwgZnVuY3Rpb24pOworCXByaW50aygiJXNFWFQyLWZzICglcyk6ICIsIHByZWZpeCwgc2ItPnNfaWQpOwogCXZwcmludGsoZm10LCBhcmdzKTsKIAlwcmludGsoIlxuIik7CiAJdmFfZW5kKGFyZ3MpOwpAQCAtOTEsOSArOTEsOSBAQAogCWlmIChsZTMyX3RvX2NwdShlcy0+c19yZXZfbGV2ZWwpID4gRVhUMl9HT09EX09MRF9SRVYpCiAJCXJldHVybjsKIAotCWV4dDJfd2FybmluZyhzYiwgX19mdW5jX18sCi0JCSAgICAgInVwZGF0aW5nIHRvIHJldiAlZCBiZWNhdXNlIG9mIG5ldyBmZWF0dXJlIGZsYWcsICIKLQkJICAgICAicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWQiLAorCWV4dDJfbXNnKHNiLCBLRVJOX1dBUk5JTkcsCisJCSAgICAgIndhcm5pbmc6IHVwZGF0aW5nIHRvIHJldiAlZCBiZWNhdXNlIG9mICIKKwkJICAgICAibmV3IGZlYXR1cmUgZmxhZywgcnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWQiLAogCQkgICAgIEVYVDJfRFlOQU1JQ19SRVYpOwogCiAJZXMtPnNfZmlyc3RfaW5vID0gY3B1X3RvX2xlMzIoRVhUMl9HT09EX09MRF9GSVJTVF9JTk8pOwpAQCAtNDE5LDEwICs0MTksMTAgQEAKIAl7T3B0X2VyciwgTlVMTH0KIH07CiAKLXN0YXRpYyBpbnQgcGFyc2Vfb3B0aW9ucyAoY2hhciAqIG9wdGlvbnMsCi0JCQkgIHN0cnVjdCBleHQyX3NiX2luZm8gKnNiaSkKK3N0YXRpYyBpbnQgcGFyc2Vfb3B0aW9ucyhjaGFyICpvcHRpb25zLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotCWNoYXIgKiBwOworCWNoYXIgKnA7CisJc3RydWN0IGV4dDJfc2JfaW5mbyAqc2JpID0gRVhUMl9TQihzYik7CiAJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOwogCWludCBvcHRpb247CiAKQEAgLTUwNSw3ICs1MDUsOCBAQAogI2Vsc2UKIAkJY2FzZSBPcHRfdXNlcl94YXR0cjoKIAkJY2FzZSBPcHRfbm91c2VyX3hhdHRyOgotCQkJcHJpbnRrKCJFWFQyIChubyl1c2VyX3hhdHRyIG9wdGlvbnMgbm90IHN1cHBvcnRlZFxuIik7CisJCQlleHQyX21zZyhzYiwgS0VSTl9JTkZPLCAiKG5vKXVzZXJfeGF0dHIgb3B0aW9ucyIKKwkJCQkibm90IHN1cHBvcnRlZCIpOwogCQkJYnJlYWs7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfRVhUMl9GU19QT1NJWF9BQ0wKQEAgLTUxOCwxNCArNTE5LDE1IEBACiAjZWxzZQogCQljYXNlIE9wdF9hY2w6CiAJCWNhc2UgT3B0X25vYWNsOgotCQkJcHJpbnRrKCJFWFQyIChubylhY2wgb3B0aW9ucyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJCWV4dDJfbXNnKHNiLCBLRVJOX0lORk8sCisJCQkJIihubylhY2wgb3B0aW9ucyBub3Qgc3VwcG9ydGVkIik7CiAJCQlicmVhazsKICNlbmRpZgogCQljYXNlIE9wdF94aXA6CiAjaWZkZWYgQ09ORklHX0VYVDJfRlNfWElQCiAJCQlzZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBYSVApOwogI2Vsc2UKLQkJCXByaW50aygiRVhUMiB4aXAgb3B0aW9uIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJZXh0Ml9tc2coc2IsIEtFUk5fSU5GTywgInhpcCBvcHRpb24gbm90IHN1cHBvcnRlZCIpOwogI2VuZGlmCiAJCQlicmVhazsKIApAQCAtNTQyLDE5ICs1NDQsMTggQEAKIAkJY2FzZSBPcHRfcXVvdGE6CiAJCWNhc2UgT3B0X3VzcnF1b3RhOgogCQljYXNlIE9wdF9ncnBxdW90YToKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJCSJFWFQyLWZzOiBxdW90YSBvcGVyYXRpb25zIG5vdCBzdXBwb3J0ZWQuXG4iKTsKLQorCQkJZXh0Ml9tc2coc2IsIEtFUk5fSU5GTywKKwkJCQkicXVvdGEgb3BlcmF0aW9ucyBub3Qgc3VwcG9ydGVkIik7CiAJCQlicmVhazsKICNlbmRpZgogCiAJCWNhc2UgT3B0X3Jlc2VydmF0aW9uOgogCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBSRVNFUlZBVElPTik7Ci0JCQlwcmludGsoInJlc2VydmF0aW9ucyBPTlxuIik7CisJCQlleHQyX21zZyhzYiwgS0VSTl9JTkZPLCAicmVzZXJ2YXRpb25zIE9OIik7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfbm9yZXNlcnZhdGlvbjoKIAkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBSRVNFUlZBVElPTik7Ci0JCQlwcmludGsoInJlc2VydmF0aW9ucyBPRkZcbiIpOworCQkJZXh0Ml9tc2coc2IsIEtFUk5fSU5GTywgInJlc2VydmF0aW9ucyBPRkYiKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9pZ25vcmU6CiAJCQlicmVhazsKQEAgLTU3MywzNCArNTc0LDQwIEBACiAJc3RydWN0IGV4dDJfc2JfaW5mbyAqc2JpID0gRVhUMl9TQihzYik7CiAKIAlpZiAobGUzMl90b19jcHUoZXMtPnNfcmV2X2xldmVsKSA+IEVYVDJfTUFYX1NVUFBfUkVWKSB7Ci0JCXByaW50ayAoIkVYVDItZnMgd2FybmluZzogcmV2aXNpb24gbGV2ZWwgdG9vIGhpZ2gsICIKLQkJCSJmb3JjaW5nIHJlYWQtb25seSBtb2RlXG4iKTsKKwkJZXh0Ml9tc2coc2IsIEtFUk5fRVJSLAorCQkJImVycm9yOiByZXZpc2lvbiBsZXZlbCB0b28gaGlnaCwgIgorCQkJImZvcmNpbmcgcmVhZC1vbmx5IG1vZGUiKTsKIAkJcmVzID0gTVNfUkRPTkxZOwogCX0KIAlpZiAocmVhZF9vbmx5KQogCQlyZXR1cm4gcmVzOwogCWlmICghKHNiaS0+c19tb3VudF9zdGF0ZSAmIEVYVDJfVkFMSURfRlMpKQotCQlwcmludGsgKCJFWFQyLWZzIHdhcm5pbmc6IG1vdW50aW5nIHVuY2hlY2tlZCBmcywgIgotCQkJInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkXG4iKTsKKwkJZXh0Ml9tc2coc2IsIEtFUk5fV0FSTklORywKKwkJCSJ3YXJuaW5nOiBtb3VudGluZyB1bmNoZWNrZWQgZnMsICIKKwkJCSJydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRlZCIpOwogCWVsc2UgaWYgKChzYmktPnNfbW91bnRfc3RhdGUgJiBFWFQyX0VSUk9SX0ZTKSkKLQkJcHJpbnRrICgiRVhUMi1mcyB3YXJuaW5nOiBtb3VudGluZyBmcyB3aXRoIGVycm9ycywgIgotCQkJInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkXG4iKTsKKwkJZXh0Ml9tc2coc2IsIEtFUk5fV0FSTklORywKKwkJCSJ3YXJuaW5nOiBtb3VudGluZyBmcyB3aXRoIGVycm9ycywgIgorCQkJInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkIik7CiAJZWxzZSBpZiAoKF9fczE2KSBsZTE2X3RvX2NwdShlcy0+c19tYXhfbW50X2NvdW50KSA+PSAwICYmCiAJCSBsZTE2X3RvX2NwdShlcy0+c19tbnRfY291bnQpID49CiAJCSAodW5zaWduZWQgc2hvcnQpIChfX3MxNikgbGUxNl90b19jcHUoZXMtPnNfbWF4X21udF9jb3VudCkpCi0JCXByaW50ayAoIkVYVDItZnMgd2FybmluZzogbWF4aW1hbCBtb3VudCBjb3VudCByZWFjaGVkLCAiCi0JCQkicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWRcbiIpOworCQlleHQyX21zZyhzYiwgS0VSTl9XQVJOSU5HLAorCQkJIndhcm5pbmc6IG1heGltYWwgbW91bnQgY291bnQgcmVhY2hlZCwgIgorCQkJInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkIik7CiAJZWxzZSBpZiAobGUzMl90b19jcHUoZXMtPnNfY2hlY2tpbnRlcnZhbCkgJiYKLQkJKGxlMzJfdG9fY3B1KGVzLT5zX2xhc3RjaGVjaykgKyBsZTMyX3RvX2NwdShlcy0+c19jaGVja2ludGVydmFsKSA8PSBnZXRfc2Vjb25kcygpKSkKLQkJcHJpbnRrICgiRVhUMi1mcyB3YXJuaW5nOiBjaGVja3RpbWUgcmVhY2hlZCwgIgotCQkJInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkXG4iKTsKKwkJKGxlMzJfdG9fY3B1KGVzLT5zX2xhc3RjaGVjaykgKworCQkJbGUzMl90b19jcHUoZXMtPnNfY2hlY2tpbnRlcnZhbCkgPD0gZ2V0X3NlY29uZHMoKSkpCisJCWV4dDJfbXNnKHNiLCBLRVJOX1dBUk5JTkcsCisJCQkid2FybmluZzogY2hlY2t0aW1lIHJlYWNoZWQsICIKKwkJCSJydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRlZCIpOwogCWlmICghbGUxNl90b19jcHUoZXMtPnNfbWF4X21udF9jb3VudCkpCiAJCWVzLT5zX21heF9tbnRfY291bnQgPSBjcHVfdG9fbGUxNihFWFQyX0RGTF9NQVhfTU5UX0NPVU5UKTsKIAlsZTE2X2FkZF9jcHUoJmVzLT5zX21udF9jb3VudCwgMSk7CiAJZXh0Ml93cml0ZV9zdXBlcihzYik7CiAJaWYgKHRlc3Rfb3B0IChzYiwgREVCVUcpKQotCQlwcmludGsgKCJbRVhUIElJIEZTICVzLCAlcywgYnM9JWx1LCBmcz0lbHUsIGdjPSVsdSwgIgotCQkJImJwZz0lbHUsIGlwZz0lbHUsIG1vPSUwNGx4XVxuIiwKKwkJZXh0Ml9tc2coc2IsIEtFUk5fSU5GTywgIiVzLCAlcywgYnM9JWx1LCBmcz0lbHUsIGdjPSVsdSwgIgorCQkJImJwZz0lbHUsIGlwZz0lbHUsIG1vPSUwNGx4XSIsCiAJCQlFWFQyRlNfVkVSU0lPTiwgRVhUMkZTX0RBVEUsIHNiLT5zX2Jsb2Nrc2l6ZSwKIAkJCXNiaS0+c19mcmFnX3NpemUsCiAJCQlzYmktPnNfZ3JvdXBzX2NvdW50LApAQCAtNzY3LDcgKzc3NCw3IEBACiAJICovCiAJYmxvY2tzaXplID0gc2JfbWluX2Jsb2Nrc2l6ZShzYiwgQkxPQ0tfU0laRSk7CiAJaWYgKCFibG9ja3NpemUpIHsKLQkJcHJpbnRrICgiRVhUMi1mczogdW5hYmxlIHRvIHNldCBibG9ja3NpemVcbiIpOworCQlleHQyX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogdW5hYmxlIHRvIHNldCBibG9ja3NpemUiKTsKIAkJZ290byBmYWlsZWRfc2JpOwogCX0KIApAQCAtNzgzLDcgKzc5MCw3IEBACiAJfQogCiAJaWYgKCEoYmggPSBzYl9icmVhZChzYiwgbG9naWNfc2JfYmxvY2spKSkgewotCQlwcmludGsgKCJFWFQyLWZzOiB1bmFibGUgdG8gcmVhZCBzdXBlcmJsb2NrXG4iKTsKKwkJZXh0Ml9tc2coc2IsIEtFUk5fRVJSLCAiZXJyb3I6IHVuYWJsZSB0byByZWFkIHN1cGVyYmxvY2siKTsKIAkJZ290byBmYWlsZWRfc2JpOwogCX0KIAkvKgpAQCAtODI2LDcgKzgzMyw3IEBACiAJCiAJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBSRVNFUlZBVElPTik7CiAKLQlpZiAoIXBhcnNlX29wdGlvbnMgKChjaGFyICopIGRhdGEsIHNiaSkpCisJaWYgKCFwYXJzZV9vcHRpb25zKChjaGFyICopIGRhdGEsIHNiKSkKIAkJZ290byBmYWlsZWRfbW91bnQ7CiAKIAlzYi0+c19mbGFncyA9IChzYi0+c19mbGFncyAmIH5NU19QT1NJWEFDTCkgfApAQCAtODQwLDggKzg0Nyw5IEBACiAJICAgIChFWFQyX0hBU19DT01QQVRfRkVBVFVSRShzYiwgfjBVKSB8fAogCSAgICAgRVhUMl9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsIH4wVSkgfHwKIAkgICAgIEVYVDJfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIH4wVSkpKQotCQlwcmludGsoIkVYVDItZnMgd2FybmluZzogZmVhdHVyZSBmbGFncyBzZXQgb24gcmV2IDAgZnMsICIKLQkJICAgICAgICJydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRlZFxuIik7CisJCWV4dDJfbXNnKHNiLCBLRVJOX1dBUk5JTkcsCisJCQkid2FybmluZzogZmVhdHVyZSBmbGFncyBzZXQgb24gcmV2IDAgZnMsICIKKwkJCSJydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRlZCIpOwogCS8qCiAJICogQ2hlY2sgZmVhdHVyZSBmbGFncyByZWdhcmRsZXNzIG9mIHRoZSByZXZpc2lvbiBsZXZlbCwgc2luY2Ugd2UKIAkgKiBwcmV2aW91c2x5IGRpZG4ndCBjaGFuZ2UgdGhlIHJldmlzaW9uIGxldmVsIHdoZW4gc2V0dGluZyB0aGUgZmxhZ3MsCkBAIC04NDksMTYgKzg1NywxNiBAQAogCSAqLwogCWZlYXR1cmVzID0gRVhUMl9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgfkVYVDJfRkVBVFVSRV9JTkNPTVBBVF9TVVBQKTsKIAlpZiAoZmVhdHVyZXMpIHsKLQkJcHJpbnRrKCJFWFQyLWZzOiAlczogY291bGRuJ3QgbW91bnQgYmVjYXVzZSBvZiAiCi0JCSAgICAgICAidW5zdXBwb3J0ZWQgb3B0aW9uYWwgZmVhdHVyZXMgKCV4KS5cbiIsCi0JCSAgICAgICBzYi0+c19pZCwgbGUzMl90b19jcHUoZmVhdHVyZXMpKTsKKwkJZXh0Ml9tc2coc2IsIEtFUk5fRVJSLAkiZXJyb3I6IGNvdWxkbid0IG1vdW50IGJlY2F1c2Ugb2YgIgorCQkgICAgICAgInVuc3VwcG9ydGVkIG9wdGlvbmFsIGZlYXR1cmVzICgleCkiLAorCQkJbGUzMl90b19jcHUoZmVhdHVyZXMpKTsKIAkJZ290byBmYWlsZWRfbW91bnQ7CiAJfQogCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSAmJgogCSAgICAoZmVhdHVyZXMgPSBFWFQyX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwgfkVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1VQUCkpKXsKLQkJcHJpbnRrKCJFWFQyLWZzOiAlczogY291bGRuJ3QgbW91bnQgUkRXUiBiZWNhdXNlIG9mICIKLQkJICAgICAgICJ1bnN1cHBvcnRlZCBvcHRpb25hbCBmZWF0dXJlcyAoJXgpLlxuIiwKLQkJICAgICAgIHNiLT5zX2lkLCBsZTMyX3RvX2NwdShmZWF0dXJlcykpOworCQlleHQyX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogY291bGRuJ3QgbW91bnQgUkRXUiBiZWNhdXNlIG9mICIKKwkJICAgICAgICJ1bnN1cHBvcnRlZCBvcHRpb25hbCBmZWF0dXJlcyAoJXgpIiwKKwkJICAgICAgIGxlMzJfdG9fY3B1KGZlYXR1cmVzKSk7CiAJCWdvdG8gZmFpbGVkX21vdW50OwogCX0KIApAQCAtODY2LDcgKzg3NCw4IEBACiAKIAlpZiAoZXh0Ml91c2VfeGlwKHNiKSAmJiBibG9ja3NpemUgIT0gUEFHRV9TSVpFKSB7CiAJCWlmICghc2lsZW50KQotCQkJcHJpbnRrKCJYSVA6IFVuc3VwcG9ydGVkIGJsb2Nrc2l6ZVxuIik7CisJCQlleHQyX21zZyhzYiwgS0VSTl9FUlIsCisJCQkJImVycm9yOiB1bnN1cHBvcnRlZCBibG9ja3NpemUgZm9yIHhpcCIpOwogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAl9CiAKQEAgLTg3NSw3ICs4ODQsNyBAQAogCQlicmVsc2UoYmgpOwogCiAJCWlmICghc2Jfc2V0X2Jsb2Nrc2l6ZShzYiwgYmxvY2tzaXplKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQyLWZzOiBibG9ja3NpemUgdG9vIHNtYWxsIGZvciBkZXZpY2UuXG4iKTsKKwkJCWV4dDJfbXNnKHNiLCBLRVJOX0VSUiwgImVycm9yOiBibG9ja3NpemUgaXMgdG9vIHNtYWxsIik7CiAJCQlnb3RvIGZhaWxlZF9zYmk7CiAJCX0KIApAQCAtODgzLDE0ICs4OTIsMTQgQEAKIAkJb2Zmc2V0ID0gKHNiX2Jsb2NrKkJMT0NLX1NJWkUpICUgYmxvY2tzaXplOwogCQliaCA9IHNiX2JyZWFkKHNiLCBsb2dpY19zYl9ibG9jayk7CiAJCWlmKCFiaCkgewotCQkJcHJpbnRrKCJFWFQyLWZzOiBDb3VsZG4ndCByZWFkIHN1cGVyYmxvY2sgb24gIgotCQkJICAgICAgICIybmQgdHJ5LlxuIik7CisJCQlleHQyX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogY291bGRuJ3QgcmVhZCIKKwkJCQkic3VwZXJibG9jayBvbiAybmQgdHJ5Iik7CiAJCQlnb3RvIGZhaWxlZF9zYmk7CiAJCX0KIAkJZXMgPSAoc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKikgKCgoY2hhciAqKWJoLT5iX2RhdGEpICsgb2Zmc2V0KTsKIAkJc2JpLT5zX2VzID0gZXM7CiAJCWlmIChlcy0+c19tYWdpYyAhPSBjcHVfdG9fbGUxNihFWFQyX1NVUEVSX01BR0lDKSkgewotCQkJcHJpbnRrICgiRVhUMi1mczogTWFnaWMgbWlzbWF0Y2gsIHZlcnkgd2VpcmQgIVxuIik7CisJCQlleHQyX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogbWFnaWMgbWlzbWF0Y2giKTsKIAkJCWdvdG8gZmFpbGVkX21vdW50OwogCQl9CiAJfQpAQCAtOTA2LDcgKzkxNSw4IEBACiAJCWlmICgoc2JpLT5zX2lub2RlX3NpemUgPCBFWFQyX0dPT0RfT0xEX0lOT0RFX1NJWkUpIHx8CiAJCSAgICAhaXNfcG93ZXJfb2ZfMihzYmktPnNfaW5vZGVfc2l6ZSkgfHwKIAkJICAgIChzYmktPnNfaW5vZGVfc2l6ZSA+IGJsb2Nrc2l6ZSkpIHsKLQkJCXByaW50ayAoIkVYVDItZnM6IHVuc3VwcG9ydGVkIGlub2RlIHNpemU6ICVkXG4iLAorCQkJZXh0Ml9tc2coc2IsIEtFUk5fRVJSLAorCQkJCSJlcnJvcjogdW5zdXBwb3J0ZWQgaW5vZGUgc2l6ZTogJWQiLAogCQkJCXNiaS0+c19pbm9kZV9zaXplKTsKIAkJCWdvdG8gZmFpbGVkX21vdW50OwogCQl9CkBAIC05NDMsMjkgKzk1MywzMyBAQAogCiAJaWYgKHNiLT5zX2Jsb2Nrc2l6ZSAhPSBiaC0+Yl9zaXplKSB7CiAJCWlmICghc2lsZW50KQotCQkJcHJpbnRrICgiVkZTOiBVbnN1cHBvcnRlZCBibG9ja3NpemUgb24gZGV2ICIKLQkJCQkiJXMuXG4iLCBzYi0+c19pZCk7CisJCQlleHQyX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogdW5zdXBwb3J0ZWQgYmxvY2tzaXplIik7CiAJCWdvdG8gZmFpbGVkX21vdW50OwogCX0KIAogCWlmIChzYi0+c19ibG9ja3NpemUgIT0gc2JpLT5zX2ZyYWdfc2l6ZSkgewotCQlwcmludGsgKCJFWFQyLWZzOiBmcmFnc2l6ZSAlbHUgIT0gYmxvY2tzaXplICVsdSAobm90IHN1cHBvcnRlZCB5ZXQpXG4iLAorCQlleHQyX21zZyhzYiwgS0VSTl9FUlIsCisJCQkiZXJyb3I6IGZyYWdzaXplICVsdSAhPSBibG9ja3NpemUgJWx1IgorCQkJIihub3Qgc3VwcG9ydGVkIHlldCkiLAogCQkJc2JpLT5zX2ZyYWdfc2l6ZSwgc2ItPnNfYmxvY2tzaXplKTsKIAkJZ290byBmYWlsZWRfbW91bnQ7CiAJfQogCiAJaWYgKHNiaS0+c19ibG9ja3NfcGVyX2dyb3VwID4gc2ItPnNfYmxvY2tzaXplICogOCkgewotCQlwcmludGsgKCJFWFQyLWZzOiAjYmxvY2tzIHBlciBncm91cCB0b28gYmlnOiAlbHVcbiIsCisJCWV4dDJfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCSJlcnJvcjogI2Jsb2NrcyBwZXIgZ3JvdXAgdG9vIGJpZzogJWx1IiwKIAkJCXNiaS0+c19ibG9ja3NfcGVyX2dyb3VwKTsKIAkJZ290byBmYWlsZWRfbW91bnQ7CiAJfQogCWlmIChzYmktPnNfZnJhZ3NfcGVyX2dyb3VwID4gc2ItPnNfYmxvY2tzaXplICogOCkgewotCQlwcmludGsgKCJFWFQyLWZzOiAjZnJhZ21lbnRzIHBlciBncm91cCB0b28gYmlnOiAlbHVcbiIsCisJCWV4dDJfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCSJlcnJvcjogI2ZyYWdtZW50cyBwZXIgZ3JvdXAgdG9vIGJpZzogJWx1IiwKIAkJCXNiaS0+c19mcmFnc19wZXJfZ3JvdXApOwogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAl9CiAJaWYgKHNiaS0+c19pbm9kZXNfcGVyX2dyb3VwID4gc2ItPnNfYmxvY2tzaXplICogOCkgewotCQlwcmludGsgKCJFWFQyLWZzOiAjaW5vZGVzIHBlciBncm91cCB0b28gYmlnOiAlbHVcbiIsCisJCWV4dDJfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCSJlcnJvcjogI2lub2RlcyBwZXIgZ3JvdXAgdG9vIGJpZzogJWx1IiwKIAkJCXNiaS0+c19pbm9kZXNfcGVyX2dyb3VwKTsKIAkJZ290byBmYWlsZWRfbW91bnQ7CiAJfQpAQCAtOTc5LDEzICs5OTMsMTMgQEAKIAkJICAgRVhUMl9ERVNDX1BFUl9CTE9DSyhzYik7CiAJc2JpLT5zX2dyb3VwX2Rlc2MgPSBrbWFsbG9jIChkYl9jb3VudCAqIHNpemVvZiAoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBHRlBfS0VSTkVMKTsKIAlpZiAoc2JpLT5zX2dyb3VwX2Rlc2MgPT0gTlVMTCkgewotCQlwcmludGsgKCJFWFQyLWZzOiBub3QgZW5vdWdoIG1lbW9yeVxuIik7CisJCWV4dDJfbXNnKHNiLCBLRVJOX0VSUiwgImVycm9yOiBub3QgZW5vdWdoIG1lbW9yeSIpOwogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAl9CiAJYmdsX2xvY2tfaW5pdChzYmktPnNfYmxvY2tncm91cF9sb2NrKTsKIAlzYmktPnNfZGVidHMgPSBrY2FsbG9jKHNiaS0+c19ncm91cHNfY291bnQsIHNpemVvZigqc2JpLT5zX2RlYnRzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzYmktPnNfZGVidHMpIHsKLQkJcHJpbnRrICgiRVhUMi1mczogbm90IGVub3VnaCBtZW1vcnlcbiIpOworCQlleHQyX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogbm90IGVub3VnaCBtZW1vcnkiKTsKIAkJZ290byBmYWlsZWRfbW91bnRfZ3JvdXBfZGVzYzsKIAl9CiAJZm9yIChpID0gMDsgaSA8IGRiX2NvdW50OyBpKyspIHsKQEAgLTk5NCwxMiArMTAwOCwxMyBAQAogCQlpZiAoIXNiaS0+c19ncm91cF9kZXNjW2ldKSB7CiAJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQogCQkJCWJyZWxzZSAoc2JpLT5zX2dyb3VwX2Rlc2Nbal0pOwotCQkJcHJpbnRrICgiRVhUMi1mczogdW5hYmxlIHRvIHJlYWQgZ3JvdXAgZGVzY3JpcHRvcnNcbiIpOworCQkJZXh0Ml9tc2coc2IsIEtFUk5fRVJSLAorCQkJCSJlcnJvcjogdW5hYmxlIHRvIHJlYWQgZ3JvdXAgZGVzY3JpcHRvcnMiKTsKIAkJCWdvdG8gZmFpbGVkX21vdW50X2dyb3VwX2Rlc2M7CiAJCX0KIAl9CiAJaWYgKCFleHQyX2NoZWNrX2Rlc2NyaXB0b3JzIChzYikpIHsKLQkJcHJpbnRrICgiRVhUMi1mczogZ3JvdXAgZGVzY3JpcHRvcnMgY29ycnVwdGVkIVxuIik7CisJCWV4dDJfbXNnKHNiLCBLRVJOX0VSUiwgImdyb3VwIGRlc2NyaXB0b3JzIGNvcnJ1cHRlZCIpOwogCQlnb3RvIGZhaWxlZF9tb3VudDI7CiAJfQogCXNiaS0+c19nZGJfY291bnQgPSBkYl9jb3VudDsKQEAgLTEwMzIsNyArMTA0Nyw3IEBACiAJCQkJZXh0Ml9jb3VudF9kaXJzKHNiKSk7CiAJfQogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQyLWZzOiBpbnN1ZmZpY2llbnQgbWVtb3J5XG4iKTsKKwkJZXh0Ml9tc2coc2IsIEtFUk5fRVJSLCAiZXJyb3I6IGluc3VmZmljaWVudCBtZW1vcnkiKTsKIAkJZ290byBmYWlsZWRfbW91bnQzOwogCX0KIAkvKgpAQCAtMTA0OCwyNyArMTA2MywyOCBAQAogCX0KIAlpZiAoIVNfSVNESVIocm9vdC0+aV9tb2RlKSB8fCAhcm9vdC0+aV9ibG9ja3MgfHwgIXJvb3QtPmlfc2l6ZSkgewogCQlpcHV0KHJvb3QpOwotCQlwcmludGsoS0VSTl9FUlIgIkVYVDItZnM6IGNvcnJ1cHQgcm9vdCBpbm9kZSwgcnVuIGUyZnNja1xuIik7CisJCWV4dDJfbXNnKHNiLCBLRVJOX0VSUiwgImVycm9yOiBjb3JydXB0IHJvb3QgaW5vZGUsIHJ1biBlMmZzY2siKTsKIAkJZ290byBmYWlsZWRfbW91bnQzOwogCX0KIAogCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdCk7CiAJaWYgKCFzYi0+c19yb290KSB7CiAJCWlwdXQocm9vdCk7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUMi1mczogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iKTsKKwkJZXh0Ml9tc2coc2IsIEtFUk5fRVJSLCAiZXJyb3I6IGdldCByb290IGlub2RlIGZhaWxlZCIpOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWxlZF9tb3VudDM7CiAJfQogCWlmIChFWFQyX0hBU19DT01QQVRfRkVBVFVSRShzYiwgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCkpCi0JCWV4dDJfd2FybmluZyhzYiwgX19mdW5jX18sCi0JCQkibW91bnRpbmcgZXh0MyBmaWxlc3lzdGVtIGFzIGV4dDIiKTsKKwkJZXh0Ml9tc2coc2IsIEtFUk5fV0FSTklORywKKwkJCSJ3YXJuaW5nOiBtb3VudGluZyBleHQzIGZpbGVzeXN0ZW0gYXMgZXh0MiIpOwogCWV4dDJfc2V0dXBfc3VwZXIgKHNiLCBlcywgc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpOwogCXJldHVybiAwOwogCiBjYW50ZmluZF9leHQyOgogCWlmICghc2lsZW50KQotCQlwcmludGsoIlZGUzogQ2FuJ3QgZmluZCBhbiBleHQyIGZpbGVzeXN0ZW0gb24gZGV2ICVzLlxuIiwKLQkJICAgICAgIHNiLT5zX2lkKTsKKwkJZXh0Ml9tc2coc2IsIEtFUk5fRVJSLAorCQkJImVycm9yOiBjYW4ndCBmaW5kIGFuIGV4dDIgZmlsZXN5c3RlbSBvbiBkZXYgJXMuIiwKKwkJCXNiLT5zX2lkKTsKIAlnb3RvIGZhaWxlZF9tb3VudDsKIGZhaWxlZF9tb3VudDM6CiAJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlcik7CkBAIC0xMTIxLDggKzExMzcsMjQgQEAKIHN0YXRpYyBpbnQgZXh0Ml9zeW5jX2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB3YWl0KQogewogCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICplcyA9IEVYVDJfU0Ioc2IpLT5zX2VzOworCXN0cnVjdCBidWZmZXJfaGVhZCAqc2JoID0gRVhUMl9TQihzYiktPnNfc2JoOwogCiAJbG9ja19rZXJuZWwoKTsKKwlpZiAoYnVmZmVyX3dyaXRlX2lvX2Vycm9yKHNiaCkpIHsKKwkJLyoKKwkJICogT2gsIGRlYXIuICBBIHByZXZpb3VzIGF0dGVtcHQgdG8gd3JpdGUgdGhlCisJCSAqIHN1cGVyYmxvY2sgZmFpbGVkLiAgVGhpcyBjb3VsZCBoYXBwZW4gYmVjYXVzZSB0aGUKKwkJICogVVNCIGRldmljZSB3YXMgeWFua2VkIG91dC4gIE9yIGl0IGNvdWxkIGhhcHBlbiB0bworCQkgKiBiZSBhIHRyYW5zaWVudCB3cml0ZSBlcnJvciBhbmQgbWF5YmUgdGhlIGJsb2NrIHdpbGwKKwkJICogYmUgcmVtYXBwZWQuICBOb3RoaW5nIHdlIGNhbiBkbyBidXQgdG8gcmV0cnkgdGhlCisJCSAqIHdyaXRlIGFuZCBob3BlIGZvciB0aGUgYmVzdC4KKwkJICovCisJCWV4dDJfbXNnKHNiLCBLRVJOX0VSUiwKKwkJICAgICAgICJwcmV2aW91cyBJL08gZXJyb3IgdG8gc3VwZXJibG9jayBkZXRlY3RlZFxuIik7CisJCWNsZWFyX2J1ZmZlcl93cml0ZV9pb19lcnJvcihzYmgpOworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKHNiaCk7CisJfQorCiAJaWYgKGVzLT5zX3N0YXRlICYgY3B1X3RvX2xlMTYoRVhUMl9WQUxJRF9GUykpIHsKIAkJZXh0Ml9kZWJ1Zygic2V0dGluZyB2YWxpZCB0byAwXG4iKTsKIAkJZXMtPnNfc3RhdGUgJj0gY3B1X3RvX2xlMTYofkVYVDJfVkFMSURfRlMpOwpAQCAtMTE3MCw3ICsxMjAyLDcgQEAKIAkvKgogCSAqIEFsbG93IHRoZSAiY2hlY2siIG9wdGlvbiB0byBiZSBwYXNzZWQgYXMgYSByZW1vdW50IG9wdGlvbi4KIAkgKi8KLQlpZiAoIXBhcnNlX29wdGlvbnMgKGRhdGEsIHNiaSkpIHsKKwlpZiAoIXBhcnNlX29wdGlvbnMoZGF0YSwgc2IpKSB7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gcmVzdG9yZV9vcHRzOwogCX0KQEAgLTExODIsNyArMTIxNCw4IEBACiAJCQkJICAgIEVYVDJfTU9VTlRfWElQIGlmIG5vdCAqLwogCiAJaWYgKChleHQyX3VzZV94aXAoc2IpKSAmJiAoc2ItPnNfYmxvY2tzaXplICE9IFBBR0VfU0laRSkpIHsKLQkJcHJpbnRrKCJYSVA6IFVuc3VwcG9ydGVkIGJsb2Nrc2l6ZVxuIik7CisJCWV4dDJfbXNnKHNiLCBLRVJOX1dBUk5JTkcsCisJCQkid2FybmluZzogdW5zdXBwb3J0ZWQgYmxvY2tzaXplIGZvciB4aXAiKTsKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byByZXN0b3JlX29wdHM7CiAJfQpAQCAtMTE5MSw4ICsxMjI0LDggQEAKIAlpZiAoKChzYmktPnNfbW91bnRfb3B0ICYgRVhUMl9NT1VOVF9YSVApICE9CiAJICAgIChvbGRfbW91bnRfb3B0ICYgRVhUMl9NT1VOVF9YSVApKSAmJgogCSAgICBpbnZhbGlkYXRlX2lub2RlcyhzYikpIHsKLQkJZXh0Ml93YXJuaW5nKHNiLCBfX2Z1bmNfXywgInJlZnVzaW5nIGNoYW5nZSBvZiB4aXAgZmxhZyAiCi0JCQkgICAgICJ3aXRoIGJ1c3kgaW5vZGVzIHdoaWxlIHJlbW91bnRpbmciKTsKKwkJZXh0Ml9tc2coc2IsIEtFUk5fV0FSTklORywgIndhcm5pbmc6IHJlZnVzaW5nIGNoYW5nZSBvZiAiCisJCQkgInhpcCBmbGFnIHdpdGggYnVzeSBpbm9kZXMgd2hpbGUgcmVtb3VudGluZyIpOwogCQlzYmktPnNfbW91bnRfb3B0ICY9IH5FWFQyX01PVU5UX1hJUDsKIAkJc2JpLT5zX21vdW50X29wdCB8PSBvbGRfbW91bnRfb3B0ICYgRVhUMl9NT1VOVF9YSVA7CiAJfQpAQCAtMTIxNiw5ICsxMjQ5LDEwIEBACiAJCV9fbGUzMiByZXQgPSBFWFQyX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwKIAkJCQkJICAgICAgIH5FWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFApOwogCQlpZiAocmV0KSB7Ci0JCQlwcmludGsoIkVYVDItZnM6ICVzOiBjb3VsZG4ndCByZW1vdW50IFJEV1IgYmVjYXVzZSBvZiAiCi0JCQkgICAgICAgInVuc3VwcG9ydGVkIG9wdGlvbmFsIGZlYXR1cmVzICgleCkuXG4iLAotCQkJICAgICAgIHNiLT5zX2lkLCBsZTMyX3RvX2NwdShyZXQpKTsKKwkJCWV4dDJfbXNnKHNiLCBLRVJOX1dBUk5JTkcsCisJCQkJIndhcm5pbmc6IGNvdWxkbid0IHJlbW91bnQgUkRXUiBiZWNhdXNlIG9mICIKKwkJCQkidW5zdXBwb3J0ZWQgb3B0aW9uYWwgZmVhdHVyZXMgKCV4KS4iLAorCQkJCWxlMzJfdG9fY3B1KHJldCkpOwogCQkJZXJyID0gLUVST0ZTOwogCQkJZ290byByZXN0b3JlX29wdHM7CiAJCX0KZGlmZiAtLWdpdCBhL2ZzL2V4dDIveGlwLmMgYi9mcy9leHQyL3hpcC5jCmluZGV4IGMxOGZiZjMuLjMyMmE1NmIgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIveGlwLmMKKysrIGIvZnMvZXh0Mi94aXAuYwpAQCAtNjksOCArNjksOSBAQAogCWlmICgoc2JpLT5zX21vdW50X29wdCAmIEVYVDJfTU9VTlRfWElQKSAmJgogCSAgICAhc2ItPnNfYmRldi0+YmRfZGlzay0+Zm9wcy0+ZGlyZWN0X2FjY2VzcykgewogCQlzYmktPnNfbW91bnRfb3B0ICY9ICh+RVhUMl9NT1VOVF9YSVApOwotCQlleHQyX3dhcm5pbmcoc2IsIF9fZnVuY19fLAotCQkJICAgICAiaWdub3JpbmcgeGlwIG9wdGlvbiAtIG5vdCBzdXBwb3J0ZWQgYnkgYmRldiIpOworCQlleHQyX21zZyhzYiwgS0VSTl9XQVJOSU5HLAorCQkJICAgICAid2FybmluZzogaWdub3JpbmcgeGlwIG9wdGlvbiAtICIKKwkJCSAgICAgIm5vdCBzdXBwb3J0ZWQgYnkgYmRldiIpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZnMvZXh0My9pbm9kZS5jIGIvZnMvZXh0My9pbm9kZS5jCmluZGV4IDJkYjk1NzcuLmFkMTQyMjcgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvaW5vZGUuYworKysgYi9mcy9leHQzL2lub2RlLmMKQEAgLTExNTEsNiArMTE1MSwxNiBAQAogCXJldHVybiBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKIH0KIAorLyoKKyAqIFRydW5jYXRlIGJsb2NrcyB0aGF0IHdlcmUgbm90IHVzZWQgYnkgd3JpdGUuIFdlIGhhdmUgdG8gdHJ1bmNhdGUgdGhlCisgKiBwYWdlY2FjaGUgYXMgd2VsbCBzbyB0aGF0IGNvcnJlc3BvbmRpbmcgYnVmZmVycyBnZXQgcHJvcGVybHkgdW5tYXBwZWQuCisgKi8KK3N0YXRpYyB2b2lkIGV4dDNfdHJ1bmNhdGVfZmFpbGVkX3dyaXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoaW5vZGUtPmlfbWFwcGluZywgaW5vZGUtPmlfc2l6ZSk7CisJZXh0M190cnVuY2F0ZShpbm9kZSk7Cit9CisKIHN0YXRpYyBpbnQgZXh0M193cml0ZV9iZWdpbihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCiAJCQkJbG9mZl90IHBvcywgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBmbGFncywKIAkJCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VwLCB2b2lkICoqZnNkYXRhKQpAQCAtMTIwOSw3ICsxMjE5LDcgQEAKIAkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAkJaWYgKHBvcyArIGxlbiA+IGlub2RlLT5pX3NpemUpCi0JCQlleHQzX3RydW5jYXRlKGlub2RlKTsKKwkJCWV4dDNfdHJ1bmNhdGVfZmFpbGVkX3dyaXRlKGlub2RlKTsKIAl9CiAJaWYgKHJldCA9PSAtRU5PU1BDICYmIGV4dDNfc2hvdWxkX3JldHJ5X2FsbG9jKGlub2RlLT5pX3NiLCAmcmV0cmllcykpCiAJCWdvdG8gcmV0cnk7CkBAIC0xMzA0LDcgKzEzMTQsNyBAQAogCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAogCWlmIChwb3MgKyBsZW4gPiBpbm9kZS0+aV9zaXplKQotCQlleHQzX3RydW5jYXRlKGlub2RlKTsKKwkJZXh0M190cnVuY2F0ZV9mYWlsZWRfd3JpdGUoaW5vZGUpOwogCXJldHVybiByZXQgPyByZXQgOiBjb3BpZWQ7CiB9CiAKQEAgLTEzMzAsNyArMTM0MCw3IEBACiAJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCiAJaWYgKHBvcyArIGxlbiA+IGlub2RlLT5pX3NpemUpCi0JCWV4dDNfdHJ1bmNhdGUoaW5vZGUpOworCQlleHQzX3RydW5jYXRlX2ZhaWxlZF93cml0ZShpbm9kZSk7CiAJcmV0dXJuIHJldCA/IHJldCA6IGNvcGllZDsKIH0KIApAQCAtMTM4Myw3ICsxMzkzLDcgQEAKIAlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAKIAlpZiAocG9zICsgbGVuID4gaW5vZGUtPmlfc2l6ZSkKLQkJZXh0M190cnVuY2F0ZShpbm9kZSk7CisJCWV4dDNfdHJ1bmNhdGVfZmFpbGVkX3dyaXRlKGlub2RlKTsKIAlyZXR1cm4gcmV0ID8gcmV0IDogY29waWVkOwogfQogCmRpZmYgLS1naXQgYS9mcy9leHQzL3Jlc2l6ZS5jIGIvZnMvZXh0My9yZXNpemUuYwppbmRleCA4MzU5ZTdiLi41ZjgzYjYxIDEwMDY0NAotLS0gYS9mcy9leHQzL3Jlc2l6ZS5jCisrKyBiL2ZzL2V4dDMvcmVzaXplLmMKQEAgLTI2Niw3ICsyNjYsNyBAQAogCQkJZ290byBleGl0X2JoOwogCiAJCWlmIChJU19FUlIoZ2RiID0gYmNsZWFuKGhhbmRsZSwgc2IsIGJsb2NrKSkpIHsKLQkJCWVyciA9IFBUUl9FUlIoYmgpOworCQkJZXJyID0gUFRSX0VSUihnZGIpOwogCQkJZ290byBleGl0X2JoOwogCQl9CiAJCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGdkYik7CmRpZmYgLS1naXQgYS9mcy9leHQzL3N1cGVyLmMgYi9mcy9leHQzL3N1cGVyLmMKaW5kZXggNDI3NDk2Yy4uN2FkMWU4YyAxMDA2NDQKLS0tIGEvZnMvZXh0My9zdXBlci5jCisrKyBiL2ZzL2V4dDMvc3VwZXIuYwpAQCAtMTM1LDEyICsxMzUsMjQgQEAKIAlpZiAoaXNfaGFuZGxlX2Fib3J0ZWQoaGFuZGxlKSkKIAkJcmV0dXJuOwogCi0JcHJpbnRrKEtFUk5fRVJSICIlczogYWJvcnRpbmcgdHJhbnNhY3Rpb246ICVzIGluICVzXG4iLAotCSAgICAgICBjYWxsZXIsIGVycnN0ciwgZXJyX2ZuKTsKKwlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6ICVzOiBhYm9ydGluZyB0cmFuc2FjdGlvbjogJXMgaW4gJXNcbiIsCisJCWNhbGxlciwgZXJyc3RyLCBlcnJfZm4pOwogCiAJam91cm5hbF9hYm9ydF9oYW5kbGUoaGFuZGxlKTsKIH0KIAordm9pZCBleHQzX21zZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpwcmVmaXgsCisJCWNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJcHJpbnRrKCIlc0VYVDMtZnMgKCVzKTogIiwgcHJlZml4LCBzYi0+c19pZCk7CisJdnByaW50ayhmbXQsIGFyZ3MpOworCXByaW50aygiXG4iKTsKKwl2YV9lbmQoYXJncyk7Cit9CisKIC8qIERlYWwgd2l0aCB0aGUgcmVwb3J0aW5nIG9mIGZhaWx1cmUgY29uZGl0aW9ucyBvbiBhIGZpbGVzeXN0ZW0gc3VjaCBhcwogICogaW5jb25zaXN0ZW5jaWVzIGRldGVjdGVkIG9yIHJlYWQgSU8gZmFpbHVyZXMuCiAgKgpAQCAtMTc0LDEyICsxODYsMTMgQEAKIAkJCWpvdXJuYWxfYWJvcnQoam91cm5hbCwgLUVJTyk7CiAJfQogCWlmICh0ZXN0X29wdCAoc2IsIEVSUk9SU19STykpIHsKLQkJcHJpbnRrIChLRVJOX0NSSVQgIlJlbW91bnRpbmcgZmlsZXN5c3RlbSByZWFkLW9ubHlcbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9DUklULAorCQkJImVycm9yOiByZW1vdW50aW5nIGZpbGVzeXN0ZW0gcmVhZC1vbmx5Iik7CiAJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKIAl9CiAJZXh0M19jb21taXRfc3VwZXIoc2IsIGVzLCAxKTsKIAlpZiAodGVzdF9vcHQoc2IsIEVSUk9SU19QQU5JQykpCi0JCXBhbmljKCJFWFQzLWZzIChkZXZpY2UgJXMpOiBwYW5pYyBmb3JjZWQgYWZ0ZXIgZXJyb3JcbiIsCisJCXBhbmljKCJFWFQzLWZzICglcyk6IHBhbmljIGZvcmNlZCBhZnRlciBlcnJvclxuIiwKIAkJCXNiLT5zX2lkKTsKIH0KIApAQCAtMjQ3LDggKzI2MCw3IEBACiAJCXJldHVybjsKIAogCWVycnN0ciA9IGV4dDNfZGVjb2RlX2Vycm9yKHNiLCBlcnJubywgbmJ1Zik7Ci0JcHJpbnRrIChLRVJOX0NSSVQgIkVYVDMtZnMgZXJyb3IgKGRldmljZSAlcykgaW4gJXM6ICVzXG4iLAotCQlzYi0+c19pZCwgZnVuY3Rpb24sIGVycnN0cik7CisJZXh0M19tc2coc2IsIEtFUk5fQ1JJVCwgImVycm9yIGluICVzOiAlcyIsIGZ1bmN0aW9uLCBlcnJzdHIpOwogCiAJZXh0M19oYW5kbGVfZXJyb3Ioc2IpOwogfQpAQCAtMjY4LDIxICsyODAsMjAgQEAKIHsKIAl2YV9saXN0IGFyZ3M7CiAKLQlwcmludGsgKEtFUk5fQ1JJVCAiZXh0M19hYm9ydCBjYWxsZWQuXG4iKTsKLQogCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JcHJpbnRrKEtFUk5fQ1JJVCAiRVhUMy1mcyBlcnJvciAoZGV2aWNlICVzKTogJXM6ICIsc2ItPnNfaWQsIGZ1bmN0aW9uKTsKKwlwcmludGsoS0VSTl9DUklUICJFWFQzLWZzICglcyk6IGVycm9yOiAlczogIiwgc2ItPnNfaWQsIGZ1bmN0aW9uKTsKIAl2cHJpbnRrKGZtdCwgYXJncyk7CiAJcHJpbnRrKCJcbiIpOwogCXZhX2VuZChhcmdzKTsKIAogCWlmICh0ZXN0X29wdChzYiwgRVJST1JTX1BBTklDKSkKLQkJcGFuaWMoIkVYVDMtZnMgcGFuaWMgZnJvbSBwcmV2aW91cyBlcnJvclxuIik7CisJCXBhbmljKCJFWFQzLWZzOiBwYW5pYyBmcm9tIHByZXZpb3VzIGVycm9yXG4iKTsKIAogCWlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkKIAkJcmV0dXJuOwogCi0JcHJpbnRrKEtFUk5fQ1JJVCAiUmVtb3VudGluZyBmaWxlc3lzdGVtIHJlYWQtb25seVxuIik7CisJZXh0M19tc2coc2IsIEtFUk5fQ1JJVCwKKwkJImVycm9yOiByZW1vdW50aW5nIGZpbGVzeXN0ZW0gcmVhZC1vbmx5Iik7CiAJRVhUM19TQihzYiktPnNfbW91bnRfc3RhdGUgfD0gRVhUM19FUlJPUl9GUzsKIAlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CiAJRVhUM19TQihzYiktPnNfbW91bnRfb3B0IHw9IEVYVDNfTU9VTlRfQUJPUlQ7CkBAIC0yOTYsNyArMzA3LDcgQEAKIAl2YV9saXN0IGFyZ3M7CiAKIAl2YV9zdGFydChhcmdzLCBmbXQpOwotCXByaW50ayhLRVJOX1dBUk5JTkcgIkVYVDMtZnMgd2FybmluZyAoZGV2aWNlICVzKTogJXM6ICIsCisJcHJpbnRrKEtFUk5fV0FSTklORyAiRVhUMy1mcyAoJXMpOiB3YXJuaW5nOiAlczogIiwKIAkgICAgICAgc2ItPnNfaWQsIGZ1bmN0aW9uKTsKIAl2cHJpbnRrKGZtdCwgYXJncyk7CiAJcHJpbnRrKCJcbiIpOwpAQCAtMzEwLDEwICszMjEsMTAgQEAKIAlpZiAobGUzMl90b19jcHUoZXMtPnNfcmV2X2xldmVsKSA+IEVYVDNfR09PRF9PTERfUkVWKQogCQlyZXR1cm47CiAKLQlleHQzX3dhcm5pbmcoc2IsIF9fZnVuY19fLAotCQkgICAgICJ1cGRhdGluZyB0byByZXYgJWQgYmVjYXVzZSBvZiBuZXcgZmVhdHVyZSBmbGFnLCAiCi0JCSAgICAgInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkIiwKLQkJICAgICBFWFQzX0RZTkFNSUNfUkVWKTsKKwlleHQzX21zZyhzYiwgS0VSTl9XQVJOSU5HLAorCQkid2FybmluZzogdXBkYXRpbmcgdG8gcmV2ICVkIGJlY2F1c2Ugb2YgIgorCQkibmV3IGZlYXR1cmUgZmxhZywgcnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWQiLAorCQlFWFQzX0RZTkFNSUNfUkVWKTsKIAogCWVzLT5zX2ZpcnN0X2lubyA9IGNwdV90b19sZTMyKEVYVDNfR09PRF9PTERfRklSU1RfSU5PKTsKIAllcy0+c19pbm9kZV9zaXplID0gY3B1X3RvX2xlMTYoRVhUM19HT09EX09MRF9JTk9ERV9TSVpFKTsKQEAgLTMzMSw3ICszNDIsNyBAQAogLyoKICAqIE9wZW4gdGhlIGV4dGVybmFsIGpvdXJuYWwgZGV2aWNlCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpleHQzX2Jsa2Rldl9nZXQoZGV2X3QgZGV2KQorc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2UgKmV4dDNfYmxrZGV2X2dldChkZXZfdCBkZXYsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKIAljaGFyIGJbQkRFVk5BTUVfU0laRV07CkBAIC0zNDIsOCArMzUzLDkgQEAKIAlyZXR1cm4gYmRldjsKIAogZmFpbDoKLQlwcmludGsoS0VSTl9FUlIgIkVYVDM6IGZhaWxlZCB0byBvcGVuIGpvdXJuYWwgZGV2aWNlICVzOiAlbGRcbiIsCi0JCQlfX2JkZXZuYW1lKGRldiwgYiksIFBUUl9FUlIoYmRldikpOworCWV4dDNfbXNnKHNiLCAiZXJyb3I6IGZhaWxlZCB0byBvcGVuIGpvdXJuYWwgZGV2aWNlICVzOiAlbGQiLAorCQlfX2JkZXZuYW1lKGRldiwgYiksIFBUUl9FUlIoYmRldikpOworCiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTM3OCwxMyArMzkwLDEzIEBACiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqbDsKIAotCXByaW50ayhLRVJOX0VSUiAic2Igb3JwaGFuIGhlYWQgaXMgJWRcbiIsCisJZXh0M19tc2coc2IsIEtFUk5fRVJSLCAiZXJyb3I6IHNiIG9ycGhhbiBoZWFkIGlzICVkIiwKIAkgICAgICAgbGUzMl90b19jcHUoc2JpLT5zX2VzLT5zX2xhc3Rfb3JwaGFuKSk7CiAKLQlwcmludGsoS0VSTl9FUlIgInNiX2luZm8gb3JwaGFuIGxpc3Q6XG4iKTsKKwlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJzYl9pbmZvIG9ycGhhbiBsaXN0OiIpOwogCWxpc3RfZm9yX2VhY2gobCwgJnNiaS0+c19vcnBoYW4pIHsKIAkJc3RydWN0IGlub2RlICppbm9kZSA9IG9ycGhhbl9saXN0X2VudHJ5KGwpOwotCQlwcmludGsoS0VSTl9FUlIgIiAgIgorCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICIgICIKIAkJICAgICAgICJpbm9kZSAlczolbHUgYXQgJXA6IG1vZGUgJW8sIG5saW5rICVkLCBuZXh0ICVkXG4iLAogCQkgICAgICAgaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubywgaW5vZGUsCiAJCSAgICAgICBpbm9kZS0+aV9tb2RlLCBpbm9kZS0+aV9ubGluaywKQEAgLTUyNyw5ICs1MzksMjIgQEAKICNpZiBkZWZpbmVkKENPTkZJR19RVU9UQSkKIAlzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmkgPSBFWFQzX1NCKHNiKTsKIAotCWlmIChzYmktPnNfanF1b3RhX2ZtdCkKLQkJc2VxX3ByaW50ZihzZXEsICIsanFmbXQ9JXMiLAotCQkoc2JpLT5zX2pxdW90YV9mbXQgPT0gUUZNVF9WRlNfT0xEKSA/ICJ2ZnNvbGQiOiAidmZzdjAiKTsKKwlpZiAoc2JpLT5zX2pxdW90YV9mbXQpIHsKKwkJY2hhciAqZm10bmFtZSA9ICIiOworCisJCXN3aXRjaCAoc2JpLT5zX2pxdW90YV9mbXQpIHsKKwkJY2FzZSBRRk1UX1ZGU19PTEQ6CisJCQlmbXRuYW1lID0gInZmc29sZCI7CisJCQlicmVhazsKKwkJY2FzZSBRRk1UX1ZGU19WMDoKKwkJCWZtdG5hbWUgPSAidmZzdjAiOworCQkJYnJlYWs7CisJCWNhc2UgUUZNVF9WRlNfVjE6CisJCQlmbXRuYW1lID0gInZmc3YxIjsKKwkJCWJyZWFrOworCQl9CisJCXNlcV9wcmludGYoc2VxLCAiLGpxZm10PSVzIiwgZm10bmFtZSk7CisJfQogCiAJaWYgKHNiaS0+c19xZl9uYW1lc1tVU1JRVU9UQV0pCiAJCXNlcV9wcmludGYoc2VxLCAiLHVzcmpxdW90YT0lcyIsIHNiaS0+c19xZl9uYW1lc1tVU1JRVU9UQV0pOwpAQCAtNjM2LDYgKzY2MSw5IEBACiAJaWYgKHRlc3Rfb3B0KHNiLCBEQVRBX0VSUl9BQk9SVCkpCiAJCXNlcV9wdXRzKHNlcSwgIixkYXRhX2Vycj1hYm9ydCIpOwogCisJaWYgKHRlc3Rfb3B0KHNiLCBOT0xPQUQpKQorCQlzZXFfcHV0cyhzZXEsICIsbm9yZWNvdmVyeSIpOworCiAJZXh0M19zaG93X3F1b3RhX29wdGlvbnMoc2VxLCBzYik7CiAKIAlyZXR1cm4gMDsKQEAgLTc4Nyw5ICs4MTUsOSBAQAogCU9wdF9hYm9ydCwgT3B0X2RhdGFfam91cm5hbCwgT3B0X2RhdGFfb3JkZXJlZCwgT3B0X2RhdGFfd3JpdGViYWNrLAogCU9wdF9kYXRhX2Vycl9hYm9ydCwgT3B0X2RhdGFfZXJyX2lnbm9yZSwKIAlPcHRfdXNyanF1b3RhLCBPcHRfZ3JwanF1b3RhLCBPcHRfb2ZmdXNyanF1b3RhLCBPcHRfb2ZmZ3JwanF1b3RhLAotCU9wdF9qcWZtdF92ZnNvbGQsIE9wdF9qcWZtdF92ZnN2MCwgT3B0X3F1b3RhLCBPcHRfbm9xdW90YSwKLQlPcHRfaWdub3JlLCBPcHRfYmFycmllciwgT3B0X2VyciwgT3B0X3Jlc2l6ZSwgT3B0X3VzcnF1b3RhLAotCU9wdF9ncnBxdW90YQorCU9wdF9qcWZtdF92ZnNvbGQsIE9wdF9qcWZtdF92ZnN2MCwgT3B0X2pxZm10X3Zmc3YxLCBPcHRfcXVvdGEsCisJT3B0X25vcXVvdGEsIE9wdF9pZ25vcmUsIE9wdF9iYXJyaWVyLCBPcHRfZXJyLCBPcHRfcmVzaXplLAorCU9wdF91c3JxdW90YSwgT3B0X2dycHF1b3RhCiB9OwogCiBzdGF0aWMgY29uc3QgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CkBAIC04MTgsNiArODQ2LDcgQEAKIAl7T3B0X3Jlc2VydmF0aW9uLCAicmVzZXJ2YXRpb24ifSwKIAl7T3B0X25vcmVzZXJ2YXRpb24sICJub3Jlc2VydmF0aW9uIn0sCiAJe09wdF9ub2xvYWQsICJub2xvYWQifSwKKwl7T3B0X25vbG9hZCwgIm5vcmVjb3ZlcnkifSwKIAl7T3B0X25vYmgsICJub2JoIn0sCiAJe09wdF9iaCwgImJoIn0sCiAJe09wdF9jb21taXQsICJjb21taXQ9JXUifSwKQEAgLTgzNiw2ICs4NjUsNyBAQAogCXtPcHRfZ3JwanF1b3RhLCAiZ3JwanF1b3RhPSVzIn0sCiAJe09wdF9qcWZtdF92ZnNvbGQsICJqcWZtdD12ZnNvbGQifSwKIAl7T3B0X2pxZm10X3Zmc3YwLCAianFmbXQ9dmZzdjAifSwKKwl7T3B0X2pxZm10X3Zmc3YxLCAianFmbXQ9dmZzdjEifSwKIAl7T3B0X2dycHF1b3RhLCAiZ3JwcXVvdGEifSwKIAl7T3B0X25vcXVvdGEsICJub3F1b3RhIn0sCiAJe09wdF9xdW90YSwgInF1b3RhIn0sCkBAIC04NDUsNyArODc1LDcgQEAKIAl7T3B0X2VyciwgTlVMTH0sCiB9OwogCi1zdGF0aWMgZXh0M19mc2Jsa190IGdldF9zYl9ibG9jayh2b2lkICoqZGF0YSkKK3N0YXRpYyBleHQzX2ZzYmxrX3QgZ2V0X3NiX2Jsb2NrKHZvaWQgKipkYXRhLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCWV4dDNfZnNibGtfdAlzYl9ibG9jazsKIAljaGFyCQkqb3B0aW9ucyA9IChjaGFyICopICpkYXRhOwpAQCAtODU2LDcgKzg4Niw3IEBACiAJLyp0b2RvOiB1c2Ugc2ltcGxlX3N0cnRvbGwgd2l0aCA+MzJiaXQgZXh0MyAqLwogCXNiX2Jsb2NrID0gc2ltcGxlX3N0cnRvdWwob3B0aW9ucywgJm9wdGlvbnMsIDApOwogCWlmICgqb3B0aW9ucyAmJiAqb3B0aW9ucyAhPSAnLCcpIHsKLQkJcHJpbnRrKCJFWFQzLWZzOiBJbnZhbGlkIHNiIHNwZWNpZmljYXRpb246ICVzXG4iLAorCQlleHQzX21zZyhzYiwgImVycm9yOiBpbnZhbGlkIHNiIHNwZWNpZmljYXRpb246ICVzIiwKIAkJICAgICAgIChjaGFyICopICpkYXRhKTsKIAkJcmV0dXJuIDE7CiAJfQpAQCAtOTU2LDcgKzk4Niw4IEBACiAjZWxzZQogCQljYXNlIE9wdF91c2VyX3hhdHRyOgogCQljYXNlIE9wdF9ub3VzZXJfeGF0dHI6Ci0JCQlwcmludGsoIkVYVDMgKG5vKXVzZXJfeGF0dHIgb3B0aW9ucyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJCWV4dDNfbXNnKHNiLCBLRVJOX0lORk8sCisJCQkJIihubyl1c2VyX3hhdHRyIG9wdGlvbnMgbm90IHN1cHBvcnRlZCIpOwogCQkJYnJlYWs7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wKQEAgLTk2OSw3ICsxMDAwLDggQEAKICNlbHNlCiAJCWNhc2UgT3B0X2FjbDoKIAkJY2FzZSBPcHRfbm9hY2w6Ci0JCQlwcmludGsoIkVYVDMgKG5vKWFjbCBvcHRpb25zIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJZXh0M19tc2coc2IsIEtFUk5fSU5GTywKKwkJCQkiKG5vKWFjbCBvcHRpb25zIG5vdCBzdXBwb3J0ZWQiKTsKIAkJCWJyZWFrOwogI2VuZGlmCiAJCWNhc2UgT3B0X3Jlc2VydmF0aW9uOgpAQCAtOTg1LDE2ICsxMDE3LDE2IEBACiAJCQkgICB1c2VyIHRvIHNwZWNpZnkgYW4gZXhpc3RpbmcgaW5vZGUgdG8gYmUgdGhlCiAJCQkgICBqb3VybmFsIGZpbGUuICovCiAJCQlpZiAoaXNfcmVtb3VudCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogY2Fubm90IHNwZWNpZnkgIgotCQkJCSAgICAgICAiam91cm5hbCBvbiByZW1vdW50XG4iKTsKKwkJCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogY2Fubm90IHNwZWNpZnkgIgorCQkJCQkiam91cm5hbCBvbiByZW1vdW50Iik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlzZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBVUERBVEVfSk9VUk5BTCk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfam91cm5hbF9pbnVtOgogCQkJaWYgKGlzX3JlbW91bnQpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGNhbm5vdCBzcGVjaWZ5ICIKLQkJCQkgICAgICAgImpvdXJuYWwgb24gcmVtb3VudFxuIik7CisJCQkJZXh0M19tc2coc2IsIEtFUk5fRVJSLCAiZXJyb3I6IGNhbm5vdCBzcGVjaWZ5ICIKKwkJCQkgICAgICAgImpvdXJuYWwgb24gcmVtb3VudCIpOwogCQkJCXJldHVybiAwOwogCQkJfQogCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCkBAIC0xMDAzLDggKzEwMzUsOCBAQAogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2pvdXJuYWxfZGV2OgogCQkJaWYgKGlzX3JlbW91bnQpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGNhbm5vdCBzcGVjaWZ5ICIKLQkJCQkgICAgICAgImpvdXJuYWwgb24gcmVtb3VudFxuIik7CisJCQkJZXh0M19tc2coc2IsIEtFUk5fRVJSLCAiZXJyb3I6IGNhbm5vdCBzcGVjaWZ5ICIKKwkJCQkgICAgICAgImpvdXJuYWwgb24gcmVtb3VudCIpOwogCQkJCXJldHVybiAwOwogCQkJfQogCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCkBAIC0xMDM2LDEyICsxMDY4LDExIEBACiAJCQkJaWYgKChzYmktPnNfbW91bnRfb3B0ICYgRVhUM19NT1VOVF9EQVRBX0ZMQUdTKQogCQkJCQkJPT0gZGF0YV9vcHQpCiAJCQkJCWJyZWFrOwotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCQkiRVhUMy1mcyAoZGV2aWNlICVzKTogQ2Fubm90IGNoYW5nZSAiCisJCQkJZXh0M19tc2coc2IsIEtFUk5fRVJSLAorCQkJCQkiZXJyb3I6IGNhbm5vdCBjaGFuZ2UgIgogCQkJCQkiZGF0YSBtb2RlIG9uIHJlbW91bnQuIFRoZSBmaWxlc3lzdGVtICIKIAkJCQkJImlzIG1vdW50ZWQgaW4gZGF0YT0lcyBtb2RlIGFuZCB5b3UgIgotCQkJCQkidHJ5IHRvIHJlbW91bnQgaXQgaW4gZGF0YT0lcyBtb2RlLlxuIiwKLQkJCQkJc2ItPnNfaWQsCisJCQkJCSJ0cnkgdG8gcmVtb3VudCBpdCBpbiBkYXRhPSVzIG1vZGUuIiwKIAkJCQkJZGF0YV9tb2RlX3N0cmluZyhzYmktPnNfbW91bnRfb3B0ICYKIAkJCQkJCQlFWFQzX01PVU5UX0RBVEFfRkxBR1MpLAogCQkJCQlkYXRhX21vZGVfc3RyaW5nKGRhdGFfb3B0KSk7CkBAIC0xMDY2LDMxICsxMDk3LDMxIEBACiBzZXRfcWZfbmFtZToKIAkJCWlmIChzYl9hbnlfcXVvdGFfbG9hZGVkKHNiKSAmJgogCQkJICAgICFzYmktPnNfcWZfbmFtZXNbcXR5cGVdKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJCSJFWFQzLWZzOiBDYW5ub3QgY2hhbmdlIGpvdXJuYWxlZCAiCi0JCQkJCSJxdW90YSBvcHRpb25zIHdoZW4gcXVvdGEgdHVybmVkIG9uLlxuIik7CisJCQkJZXh0M19tc2coc2IsIEtFUk5fRVJSLAorCQkJCQkiZXJyb3I6IGNhbm5vdCBjaGFuZ2Ugam91cm5hbGVkICIKKwkJCQkJInF1b3RhIG9wdGlvbnMgd2hlbiBxdW90YSB0dXJuZWQgb24uIik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlxbmFtZSA9IG1hdGNoX3N0cmR1cCgmYXJnc1swXSk7CiAJCQlpZiAoIXFuYW1lKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJCSJFWFQzLWZzOiBub3QgZW5vdWdoIG1lbW9yeSBmb3IgIgotCQkJCQkic3RvcmluZyBxdW90YWZpbGUgbmFtZS5cbiIpOworCQkJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCQkJImVycm9yOiBub3QgZW5vdWdoIG1lbW9yeSBmb3IgIgorCQkJCQkic3RvcmluZyBxdW90YWZpbGUgbmFtZS4iKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJCWlmIChzYmktPnNfcWZfbmFtZXNbcXR5cGVdICYmCiAJCQkgICAgc3RyY21wKHNiaS0+c19xZl9uYW1lc1txdHlwZV0sIHFuYW1lKSkgewotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCQkiRVhUMy1mczogJXMgcXVvdGEgZmlsZSBhbHJlYWR5ICIKLQkJCQkJInNwZWNpZmllZC5cbiIsIFFUWVBFMk5BTUUocXR5cGUpKTsKKwkJCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsCisJCQkJCSJlcnJvcjogJXMgcXVvdGEgZmlsZSBhbHJlYWR5ICIKKwkJCQkJInNwZWNpZmllZC4iLCBRVFlQRTJOQU1FKHF0eXBlKSk7CiAJCQkJa2ZyZWUocW5hbWUpOwogCQkJCXJldHVybiAwOwogCQkJfQogCQkJc2JpLT5zX3FmX25hbWVzW3F0eXBlXSA9IHFuYW1lOwogCQkJaWYgKHN0cmNocihzYmktPnNfcWZfbmFtZXNbcXR5cGVdLCAnLycpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJCSJFWFQzLWZzOiBxdW90YWZpbGUgbXVzdCBiZSBvbiAiCi0JCQkJCSJmaWxlc3lzdGVtIHJvb3QuXG4iKTsKKwkJCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsCisJCQkJCSJlcnJvcjogcXVvdGFmaWxlIG11c3QgYmUgb24gIgorCQkJCQkiZmlsZXN5c3RlbSByb290LiIpOwogCQkJCWtmcmVlKHNiaS0+c19xZl9uYW1lc1txdHlwZV0pOwogCQkJCXNiaS0+c19xZl9uYW1lc1txdHlwZV0gPSBOVUxMOwogCQkJCXJldHVybiAwOwpAQCAtMTEwNSw5ICsxMTM2LDkgQEAKIGNsZWFyX3FmX25hbWU6CiAJCQlpZiAoc2JfYW55X3F1b3RhX2xvYWRlZChzYikgJiYKIAkJCSAgICBzYmktPnNfcWZfbmFtZXNbcXR5cGVdKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBDYW5ub3QgY2hhbmdlICIKKwkJCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogY2Fubm90IGNoYW5nZSAiCiAJCQkJCSJqb3VybmFsZWQgcXVvdGEgb3B0aW9ucyB3aGVuICIKLQkJCQkJInF1b3RhIHR1cm5lZCBvbi5cbiIpOworCQkJCQkicXVvdGEgdHVybmVkIG9uLiIpOwogCQkJCXJldHVybiAwOwogCQkJfQogCQkJLyoKQEAgLTExMjEsMTIgKzExNTIsMTUgQEAKIAkJCWdvdG8gc2V0X3FmX2Zvcm1hdDsKIAkJY2FzZSBPcHRfanFmbXRfdmZzdjA6CiAJCQlxZm10ID0gUUZNVF9WRlNfVjA7CisJCQlnb3RvIHNldF9xZl9mb3JtYXQ7CisJCWNhc2UgT3B0X2pxZm10X3Zmc3YxOgorCQkJcWZtdCA9IFFGTVRfVkZTX1YxOwogc2V0X3FmX2Zvcm1hdDoKIAkJCWlmIChzYl9hbnlfcXVvdGFfbG9hZGVkKHNiKSAmJgogCQkJICAgIHNiaS0+c19qcXVvdGFfZm10ICE9IHFmbXQpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IENhbm5vdCBjaGFuZ2UgIgorCQkJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwgImVycm9yOiBjYW5ub3QgY2hhbmdlICIKIAkJCQkJImpvdXJuYWxlZCBxdW90YSBvcHRpb25zIHdoZW4gIgotCQkJCQkicXVvdGEgdHVybmVkIG9uLlxuIik7CisJCQkJCSJxdW90YSB0dXJuZWQgb24uIik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlzYmktPnNfanF1b3RhX2ZtdCA9IHFmbXQ7CkBAIC0xMTQyLDggKzExNzYsOCBAQAogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X25vcXVvdGE6CiAJCQlpZiAoc2JfYW55X3F1b3RhX2xvYWRlZChzYikpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IENhbm5vdCBjaGFuZ2UgcXVvdGEgIgotCQkJCQkib3B0aW9ucyB3aGVuIHF1b3RhIHR1cm5lZCBvbi5cbiIpOworCQkJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwgImVycm9yOiBjYW5ub3QgY2hhbmdlICIKKwkJCQkJInF1b3RhIG9wdGlvbnMgd2hlbiBxdW90YSB0dXJuZWQgb24uIik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgUVVPVEEpOwpAQCAtMTE1NCw4ICsxMTg4LDggQEAKIAkJY2FzZSBPcHRfcXVvdGE6CiAJCWNhc2UgT3B0X3VzcnF1b3RhOgogCQljYXNlIE9wdF9ncnBxdW90YToKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJCSJFWFQzLWZzOiBxdW90YSBvcHRpb25zIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKwkJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCQkiZXJyb3I6IHF1b3RhIG9wdGlvbnMgbm90IHN1cHBvcnRlZC4iKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF91c3JqcXVvdGE6CiAJCWNhc2UgT3B0X2dycGpxdW90YToKQEAgLTExNjMsOSArMTE5NywxMCBAQAogCQljYXNlIE9wdF9vZmZncnBqcXVvdGE6CiAJCWNhc2UgT3B0X2pxZm10X3Zmc29sZDoKIAkJY2FzZSBPcHRfanFmbXRfdmZzdjA6Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCQkiRVhUMy1mczogam91cm5hbGVkIHF1b3RhIG9wdGlvbnMgbm90ICIKLQkJCQkic3VwcG9ydGVkLlxuIik7CisJCWNhc2UgT3B0X2pxZm10X3Zmc3YxOgorCQkJZXh0M19tc2coc2IsIEtFUk5fRVJSLAorCQkJCSJlcnJvcjogam91cm5hbGVkIHF1b3RhIG9wdGlvbnMgbm90ICIKKwkJCQkic3VwcG9ydGVkLiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X25vcXVvdGE6CiAJCQlicmVhazsKQEAgLTExODUsOCArMTIyMCw5IEBACiAJCQlicmVhazsKIAkJY2FzZSBPcHRfcmVzaXplOgogCQkJaWYgKCFpc19yZW1vdW50KSB7Ci0JCQkJcHJpbnRrKCJFWFQzLWZzOiByZXNpemUgb3B0aW9uIG9ubHkgYXZhaWxhYmxlICIKLQkJCQkJImZvciByZW1vdW50XG4iKTsKKwkJCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsCisJCQkJCSJlcnJvcjogcmVzaXplIG9wdGlvbiBvbmx5IGF2YWlsYWJsZSAiCisJCQkJCSJmb3IgcmVtb3VudCIpOwogCQkJCXJldHVybiAwOwogCQkJfQogCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikgIT0gMCkKQEAgLTEyMDAsOSArMTIzNiw5IEBACiAJCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgTk9CSCk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50ayAoS0VSTl9FUlIKLQkJCQkiRVhUMy1mczogVW5yZWNvZ25pemVkIG1vdW50IG9wdGlvbiBcIiVzXCIgIgotCQkJCSJvciBtaXNzaW5nIHZhbHVlXG4iLCBwKTsKKwkJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCQkiZXJyb3I6IHVucmVjb2duaXplZCBtb3VudCBvcHRpb24gXCIlc1wiICIKKwkJCQkib3IgbWlzc2luZyB2YWx1ZSIsIHApOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CkBAIC0xMjIwLDIxICsxMjU2LDIxIEBACiAJCQkJKHNiaS0+c19tb3VudF9vcHQgJiBFWFQzX01PVU5UX0dSUFFVT1RBKSkgfHwKIAkJICAgIChzYmktPnNfcWZfbmFtZXNbR1JQUVVPVEFdICYmCiAJCQkJKHNiaS0+c19tb3VudF9vcHQgJiBFWFQzX01PVU5UX1VTUlFVT1RBKSkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogb2xkIGFuZCBuZXcgcXVvdGEgIgotCQkJCQkiZm9ybWF0IG1peGluZy5cbiIpOworCQkJZXh0M19tc2coc2IsIEtFUk5fRVJSLCAiZXJyb3I6IG9sZCBhbmQgbmV3IHF1b3RhICIKKwkJCQkJImZvcm1hdCBtaXhpbmcuIik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCiAJCWlmICghc2JpLT5zX2pxdW90YV9mbXQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogam91cm5hbGVkIHF1b3RhIGZvcm1hdCAiCi0JCQkJCSJub3Qgc3BlY2lmaWVkLlxuIik7CisJCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogam91cm5hbGVkIHF1b3RhIGZvcm1hdCAiCisJCQkJCSJub3Qgc3BlY2lmaWVkLiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9IGVsc2UgewogCQlpZiAoc2JpLT5zX2pxdW90YV9mbXQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogam91cm5hbGVkIHF1b3RhIGZvcm1hdCAiCisJCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogam91cm5hbGVkIHF1b3RhIGZvcm1hdCAiCiAJCQkJCSJzcGVjaWZpZWQgd2l0aCBubyBqb3VybmFsaW5nICIKLQkJCQkJImVuYWJsZWQuXG4iKTsKKwkJCQkJImVuYWJsZWQuIik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KQEAgLTEyNDksMzEgKzEyODUsMzMgQEAKIAlpbnQgcmVzID0gMDsKIAogCWlmIChsZTMyX3RvX2NwdShlcy0+c19yZXZfbGV2ZWwpID4gRVhUM19NQVhfU1VQUF9SRVYpIHsKLQkJcHJpbnRrIChLRVJOX0VSUiAiRVhUMy1mcyB3YXJuaW5nOiByZXZpc2lvbiBsZXZlbCB0b28gaGlnaCwgIgotCQkJImZvcmNpbmcgcmVhZC1vbmx5IG1vZGVcbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsCisJCQkiZXJyb3I6IHJldmlzaW9uIGxldmVsIHRvbyBoaWdoLCAiCisJCQkiZm9yY2luZyByZWFkLW9ubHkgbW9kZSIpOwogCQlyZXMgPSBNU19SRE9OTFk7CiAJfQogCWlmIChyZWFkX29ubHkpCiAJCXJldHVybiByZXM7CiAJaWYgKCEoc2JpLT5zX21vdW50X3N0YXRlICYgRVhUM19WQUxJRF9GUykpCi0JCXByaW50ayAoS0VSTl9XQVJOSU5HICJFWFQzLWZzIHdhcm5pbmc6IG1vdW50aW5nIHVuY2hlY2tlZCBmcywgIgotCQkJInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkXG4iKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fV0FSTklORywKKwkJCSJ3YXJuaW5nOiBtb3VudGluZyB1bmNoZWNrZWQgZnMsICIKKwkJCSJydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRlZCIpOwogCWVsc2UgaWYgKChzYmktPnNfbW91bnRfc3RhdGUgJiBFWFQzX0VSUk9SX0ZTKSkKLQkJcHJpbnRrIChLRVJOX1dBUk5JTkcKLQkJCSJFWFQzLWZzIHdhcm5pbmc6IG1vdW50aW5nIGZzIHdpdGggZXJyb3JzLCAiCi0JCQkicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWRcbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9XQVJOSU5HLAorCQkJIndhcm5pbmc6IG1vdW50aW5nIGZzIHdpdGggZXJyb3JzLCAiCisJCQkicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWQiKTsKIAllbHNlIGlmICgoX19zMTYpIGxlMTZfdG9fY3B1KGVzLT5zX21heF9tbnRfY291bnQpID49IDAgJiYKIAkJIGxlMTZfdG9fY3B1KGVzLT5zX21udF9jb3VudCkgPj0KIAkJICh1bnNpZ25lZCBzaG9ydCkgKF9fczE2KSBsZTE2X3RvX2NwdShlcy0+c19tYXhfbW50X2NvdW50KSkKLQkJcHJpbnRrIChLRVJOX1dBUk5JTkcKLQkJCSJFWFQzLWZzIHdhcm5pbmc6IG1heGltYWwgbW91bnQgY291bnQgcmVhY2hlZCwgIgotCQkJInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkXG4iKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fV0FSTklORywKKwkJCSJ3YXJuaW5nOiBtYXhpbWFsIG1vdW50IGNvdW50IHJlYWNoZWQsICIKKwkJCSJydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRlZCIpOwogCWVsc2UgaWYgKGxlMzJfdG9fY3B1KGVzLT5zX2NoZWNraW50ZXJ2YWwpICYmCiAJCShsZTMyX3RvX2NwdShlcy0+c19sYXN0Y2hlY2spICsKIAkJCWxlMzJfdG9fY3B1KGVzLT5zX2NoZWNraW50ZXJ2YWwpIDw9IGdldF9zZWNvbmRzKCkpKQotCQlwcmludGsgKEtFUk5fV0FSTklORwotCQkJIkVYVDMtZnMgd2FybmluZzogY2hlY2t0aW1lIHJlYWNoZWQsICIKLQkJCSJydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRlZFxuIik7CisJCWV4dDNfbXNnKHNiLCBLRVJOX1dBUk5JTkcsCisJCQkid2FybmluZzogY2hlY2t0aW1lIHJlYWNoZWQsICIKKwkJCSJydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRlZCIpOwogI2lmIDAKIAkJLyogQEBAIFdlIF93aWxsXyB3YW50IHRvIGNsZWFyIHRoZSB2YWxpZCBiaXQgaWYgd2UgZmluZAogICAgICAgICAgICAgICAgICAgIGluY29uc2lzdGVuY2llcywgdG8gZm9yY2UgYSBmc2NrIGF0IHJlYm9vdC4gIEJ1dCBmb3IKQEAgLTEyOTAsMjIgKzEzMjgsMjAgQEAKIAogCWV4dDNfY29tbWl0X3N1cGVyKHNiLCBlcywgMSk7CiAJaWYgKHRlc3Rfb3B0KHNiLCBERUJVRykpCi0JCXByaW50ayhLRVJOX0lORk8gIltFWFQzIEZTIGJzPSVsdSwgZ2M9JWx1LCAiCi0JCQkJImJwZz0lbHUsIGlwZz0lbHUsIG1vPSUwNGx4XVxuIiwKKwkJZXh0M19tc2coc2IsIEtFUk5fSU5GTywgIlticz0lbHUsIGdjPSVsdSwgIgorCQkJCSJicGc9JWx1LCBpcGc9JWx1LCBtbz0lMDRseF0iLAogCQkJc2ItPnNfYmxvY2tzaXplLAogCQkJc2JpLT5zX2dyb3Vwc19jb3VudCwKIAkJCUVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYiksCiAJCQlFWFQzX0lOT0RFU19QRVJfR1JPVVAoc2IpLAogCQkJc2JpLT5zX21vdW50X29wdCk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJFWFQzIEZTIG9uICVzLCAiLCBzYi0+c19pZCk7CiAJaWYgKEVYVDNfU0Ioc2IpLT5zX2pvdXJuYWwtPmpfaW5vZGUgPT0gTlVMTCkgewogCQljaGFyIGJbQkRFVk5BTUVfU0laRV07Ci0KLQkJcHJpbnRrKCJleHRlcm5hbCBqb3VybmFsIG9uICVzXG4iLAorCQlleHQzX21zZyhzYiwgS0VSTl9JTkZPLCAidXNpbmcgZXh0ZXJuYWwgam91cm5hbCBvbiAlcyIsCiAJCQliZGV2bmFtZShFWFQzX1NCKHNiKS0+c19qb3VybmFsLT5qX2RldiwgYikpOwogCX0gZWxzZSB7Ci0JCXByaW50aygiaW50ZXJuYWwgam91cm5hbFxuIik7CisJCWV4dDNfbXNnKHNiLCBLRVJOX0lORk8sICJ1c2luZyBpbnRlcm5hbCBqb3VybmFsIik7CiAJfQogCXJldHVybiByZXM7CiB9CkBAIC0xMzk5LDggKzE0MzUsOCBAQAogCX0KIAogCWlmIChiZGV2X3JlYWRfb25seShzYi0+c19iZGV2KSkgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IHdyaXRlIGFjY2VzcyAiCi0JCQkidW5hdmFpbGFibGUsIHNraXBwaW5nIG9ycGhhbiBjbGVhbnVwLlxuIik7CisJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwgImVycm9yOiB3cml0ZSBhY2Nlc3MgIgorCQkJInVuYXZhaWxhYmxlLCBza2lwcGluZyBvcnBoYW4gY2xlYW51cC4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTQxNCw4ICsxNDUwLDcgQEAKIAl9CiAKIAlpZiAoc19mbGFncyAmIE1TX1JET05MWSkgewotCQlwcmludGsoS0VSTl9JTkZPICJFWFQzLWZzOiAlczogb3JwaGFuIGNsZWFudXAgb24gcmVhZG9ubHkgZnNcbiIsCi0JCSAgICAgICBzYi0+c19pZCk7CisJCWV4dDNfbXNnKHNiLCBLRVJOX0lORk8sICJvcnBoYW4gY2xlYW51cCBvbiByZWFkb25seSBmcyIpOwogCQlzYi0+c19mbGFncyAmPSB+TVNfUkRPTkxZOwogCX0KICNpZmRlZiBDT05GSUdfUVVPVEEKQEAgLTE0MjYsOSArMTQ2MSw5IEBACiAJCWlmIChFWFQzX1NCKHNiKS0+c19xZl9uYW1lc1tpXSkgewogCQkJaW50IHJldCA9IGV4dDNfcXVvdGFfb25fbW91bnQoc2IsIGkpOwogCQkJaWYgKHJldCA8IDApCi0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJCSJFWFQzLWZzOiBDYW5ub3QgdHVybiBvbiBqb3VybmFsZWQgIgotCQkJCQkicXVvdGE6IGVycm9yICVkXG4iLCByZXQpOworCQkJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCQkJImVycm9yOiBjYW5ub3QgdHVybiBvbiBqb3VybmFsZWQgIgorCQkJCQkicXVvdGE6ICVkIiwgcmV0KTsKIAkJfQogCX0KICNlbmRpZgpAQCAtMTQ2NiwxMSArMTUwMSwxMSBAQAogI2RlZmluZSBQTFVSQUwoeCkgKHgpLCAoKHgpPT0xKSA/ICIiIDogInMiCiAKIAlpZiAobnJfb3JwaGFucykKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRVhUMy1mczogJXM6ICVkIG9ycGhhbiBpbm9kZSVzIGRlbGV0ZWRcbiIsCi0JCSAgICAgICBzYi0+c19pZCwgUExVUkFMKG5yX29ycGhhbnMpKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fSU5GTywgIiVkIG9ycGhhbiBpbm9kZSVzIGRlbGV0ZWQiLAorCQkgICAgICAgUExVUkFMKG5yX29ycGhhbnMpKTsKIAlpZiAobnJfdHJ1bmNhdGVzKQotCQlwcmludGsoS0VSTl9JTkZPICJFWFQzLWZzOiAlczogJWQgdHJ1bmNhdGUlcyBjbGVhbmVkIHVwXG4iLAotCQkgICAgICAgc2ItPnNfaWQsIFBMVVJBTChucl90cnVuY2F0ZXMpKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fSU5GTywgIiVkIHRydW5jYXRlJXMgY2xlYW5lZCB1cCIsCisJCSAgICAgICBQTFVSQUwobnJfdHJ1bmNhdGVzKSk7CiAjaWZkZWYgQ09ORklHX1FVT1RBCiAJLyogVHVybiBxdW90YXMgb2ZmICovCiAJZm9yIChpID0gMDsgaSA8IE1BWFFVT1RBUzsgaSsrKSB7CkBAIC0xNTU0LDcgKzE1ODksNyBAQAogCXN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICplcyA9IE5VTEw7CiAJc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpOwogCWV4dDNfZnNibGtfdCBibG9jazsKLQlleHQzX2ZzYmxrX3Qgc2JfYmxvY2sgPSBnZXRfc2JfYmxvY2soJmRhdGEpOworCWV4dDNfZnNibGtfdCBzYl9ibG9jayA9IGdldF9zYl9ibG9jaygmZGF0YSwgc2IpOwogCWV4dDNfZnNibGtfdCBsb2dpY19zYl9ibG9jazsKIAl1bnNpZ25lZCBsb25nIG9mZnNldCA9IDA7CiAJdW5zaWduZWQgaW50IGpvdXJuYWxfaW51bSA9IDA7CkBAIC0xNTkwLDcgKzE2MjUsNyBAQAogCiAJYmxvY2tzaXplID0gc2JfbWluX2Jsb2Nrc2l6ZShzYiwgRVhUM19NSU5fQkxPQ0tfU0laRSk7CiAJaWYgKCFibG9ja3NpemUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiB1bmFibGUgdG8gc2V0IGJsb2Nrc2l6ZVxuIik7CisJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwgImVycm9yOiB1bmFibGUgdG8gc2V0IGJsb2Nrc2l6ZSIpOwogCQlnb3RvIG91dF9mYWlsOwogCX0KIApAQCAtMTYwNiw3ICsxNjQxLDcgQEAKIAl9CiAKIAlpZiAoIShiaCA9IHNiX2JyZWFkKHNiLCBsb2dpY19zYl9ibG9jaykpKSB7Ci0JCXByaW50ayAoS0VSTl9FUlIgIkVYVDMtZnM6IHVuYWJsZSB0byByZWFkIHN1cGVyYmxvY2tcbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogdW5hYmxlIHRvIHJlYWQgc3VwZXJibG9jayIpOwogCQlnb3RvIG91dF9mYWlsOwogCX0KIAkvKgpAQCAtMTY2NSw5ICsxNzAwLDkgQEAKIAkgICAgKEVYVDNfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLCB+MFUpIHx8CiAJICAgICBFWFQzX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwgfjBVKSB8fAogCSAgICAgRVhUM19IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgfjBVKSkpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICJFWFQzLWZzIHdhcm5pbmc6IGZlYXR1cmUgZmxhZ3Mgc2V0IG9uIHJldiAwIGZzLCAiCi0JCSAgICAgICAicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWRcbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9XQVJOSU5HLAorCQkJIndhcm5pbmc6IGZlYXR1cmUgZmxhZ3Mgc2V0IG9uIHJldiAwIGZzLCAiCisJCQkicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWQiKTsKIAkvKgogCSAqIENoZWNrIGZlYXR1cmUgZmxhZ3MgcmVnYXJkbGVzcyBvZiB0aGUgcmV2aXNpb24gbGV2ZWwsIHNpbmNlIHdlCiAJICogcHJldmlvdXNseSBkaWRuJ3QgY2hhbmdlIHRoZSByZXZpc2lvbiBsZXZlbCB3aGVuIHNldHRpbmcgdGhlIGZsYWdzLApAQCAtMTY3NSwyNSArMTcxMCwyNSBAQAogCSAqLwogCWZlYXR1cmVzID0gRVhUM19IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgfkVYVDNfRkVBVFVSRV9JTkNPTVBBVF9TVVBQKTsKIAlpZiAoZmVhdHVyZXMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiAlczogY291bGRuJ3QgbW91bnQgYmVjYXVzZSBvZiAiCi0JCSAgICAgICAidW5zdXBwb3J0ZWQgb3B0aW9uYWwgZmVhdHVyZXMgKCV4KS5cbiIsCi0JCSAgICAgICBzYi0+c19pZCwgbGUzMl90b19jcHUoZmVhdHVyZXMpKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fRVJSLAorCQkJImVycm9yOiBjb3VsZG4ndCBtb3VudCBiZWNhdXNlIG9mIHVuc3VwcG9ydGVkICIKKwkJCSJvcHRpb25hbCBmZWF0dXJlcyAoJXgpIiwgbGUzMl90b19jcHUoZmVhdHVyZXMpKTsKIAkJZ290byBmYWlsZWRfbW91bnQ7CiAJfQogCWZlYXR1cmVzID0gRVhUM19IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsIH5FWFQzX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFApOwogCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSAmJiBmZWF0dXJlcykgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6ICVzOiBjb3VsZG4ndCBtb3VudCBSRFdSIGJlY2F1c2Ugb2YgIgotCQkgICAgICAgInVuc3VwcG9ydGVkIG9wdGlvbmFsIGZlYXR1cmVzICgleCkuXG4iLAotCQkgICAgICAgc2ItPnNfaWQsIGxlMzJfdG9fY3B1KGZlYXR1cmVzKSk7CisJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCSJlcnJvcjogY291bGRuJ3QgbW91bnQgUkRXUiBiZWNhdXNlIG9mIHVuc3VwcG9ydGVkICIKKwkJCSJvcHRpb25hbCBmZWF0dXJlcyAoJXgpIiwgbGUzMl90b19jcHUoZmVhdHVyZXMpKTsKIAkJZ290byBmYWlsZWRfbW91bnQ7CiAJfQogCWJsb2Nrc2l6ZSA9IEJMT0NLX1NJWkUgPDwgbGUzMl90b19jcHUoZXMtPnNfbG9nX2Jsb2NrX3NpemUpOwogCiAJaWYgKGJsb2Nrc2l6ZSA8IEVYVDNfTUlOX0JMT0NLX1NJWkUgfHwKIAkgICAgYmxvY2tzaXplID4gRVhUM19NQVhfQkxPQ0tfU0laRSkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJFWFQzLWZzOiBVbnN1cHBvcnRlZCBmaWxlc3lzdGVtIGJsb2Nrc2l6ZSAlZCBvbiAlcy5cbiIsCi0JCSAgICAgICBibG9ja3NpemUsIHNiLT5zX2lkKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fRVJSLAorCQkJImVycm9yOiBjb3VsZG4ndCBtb3VudCBiZWNhdXNlIG9mIHVuc3VwcG9ydGVkICIKKwkJCSJmaWxlc3lzdGVtIGJsb2Nrc2l6ZSAlZCIsIGJsb2Nrc2l6ZSk7CiAJCWdvdG8gZmFpbGVkX21vdW50OwogCX0KIApAQCAtMTcwNCwzMCArMTczOSwzMSBAQAogCQkgKiB0aGFuIHRoZSBoYXJkd2FyZSBzZWN0b3JzaXplIGZvciB0aGUgbWFjaGluZS4KIAkJICovCiAJCWlmIChibG9ja3NpemUgPCBoYmxvY2spIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogYmxvY2tzaXplICVkIHRvbyBzbWFsbCBmb3IgIgotCQkJICAgICAgICJkZXZpY2UgYmxvY2tzaXplICVkLlxuIiwgYmxvY2tzaXplLCBoYmxvY2spOworCQkJZXh0M19tc2coc2IsIEtFUk5fRVJSLAorCQkJCSJlcnJvcjogZnNibG9ja3NpemUgJWQgdG9vIHNtYWxsIGZvciAiCisJCQkJImhhcmR3YXJlIHNlY3RvcnNpemUgJWQiLCBibG9ja3NpemUsIGhibG9jayk7CiAJCQlnb3RvIGZhaWxlZF9tb3VudDsKIAkJfQogCiAJCWJyZWxzZSAoYmgpOwogCQlpZiAoIXNiX3NldF9ibG9ja3NpemUoc2IsIGJsb2Nrc2l6ZSkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogYmFkIGJsb2Nrc2l6ZSAlZC5cbiIsCi0JCQkJYmxvY2tzaXplKTsKKwkJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCQkiZXJyb3I6IGJhZCBibG9ja3NpemUgJWQiLCBibG9ja3NpemUpOwogCQkJZ290byBvdXRfZmFpbDsKIAkJfQogCQlsb2dpY19zYl9ibG9jayA9IChzYl9ibG9jayAqIEVYVDNfTUlOX0JMT0NLX1NJWkUpIC8gYmxvY2tzaXplOwogCQlvZmZzZXQgPSAoc2JfYmxvY2sgKiBFWFQzX01JTl9CTE9DS19TSVpFKSAlIGJsb2Nrc2l6ZTsKIAkJYmggPSBzYl9icmVhZChzYiwgbG9naWNfc2JfYmxvY2spOwogCQlpZiAoIWJoKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiRVhUMy1mczogQ2FuJ3QgcmVhZCBzdXBlcmJsb2NrIG9uIDJuZCB0cnkuXG4iKTsKKwkJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCSAgICAgICAiZXJyb3I6IGNhbid0IHJlYWQgc3VwZXJibG9jayBvbiAybmQgdHJ5Iik7CiAJCQlnb3RvIGZhaWxlZF9tb3VudDsKIAkJfQogCQllcyA9IChzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqKSgoKGNoYXIgKiliaC0+Yl9kYXRhKSArIG9mZnNldCk7CiAJCXNiaS0+c19lcyA9IGVzOwogCQlpZiAoZXMtPnNfbWFnaWMgIT0gY3B1X3RvX2xlMTYoRVhUM19TVVBFUl9NQUdJQykpIHsKLQkJCXByaW50ayAoS0VSTl9FUlIKLQkJCQkiRVhUMy1mczogTWFnaWMgbWlzbWF0Y2gsIHZlcnkgd2VpcmQgIVxuIik7CisJCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsCisJCQkJImVycm9yOiBtYWdpYyBtaXNtYXRjaCIpOwogCQkJZ290byBmYWlsZWRfbW91bnQ7CiAJCX0KIAl9CkBAIC0xNzQzLDggKzE3NzksOCBAQAogCQlpZiAoKHNiaS0+c19pbm9kZV9zaXplIDwgRVhUM19HT09EX09MRF9JTk9ERV9TSVpFKSB8fAogCQkgICAgKCFpc19wb3dlcl9vZl8yKHNiaS0+c19pbm9kZV9zaXplKSkgfHwKIAkJICAgIChzYmktPnNfaW5vZGVfc2l6ZSA+IGJsb2Nrc2l6ZSkpIHsKLQkJCXByaW50ayAoS0VSTl9FUlIKLQkJCQkiRVhUMy1mczogdW5zdXBwb3J0ZWQgaW5vZGUgc2l6ZTogJWRcbiIsCisJCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsCisJCQkJImVycm9yOiB1bnN1cHBvcnRlZCBpbm9kZSBzaXplOiAlZCIsCiAJCQkJc2JpLT5zX2lub2RlX3NpemUpOwogCQkJZ290byBmYWlsZWRfbW91bnQ7CiAJCX0KQEAgLTE3NTIsOCArMTc4OCw4IEBACiAJc2JpLT5zX2ZyYWdfc2l6ZSA9IEVYVDNfTUlOX0ZSQUdfU0laRSA8PAogCQkJCSAgIGxlMzJfdG9fY3B1KGVzLT5zX2xvZ19mcmFnX3NpemUpOwogCWlmIChibG9ja3NpemUgIT0gc2JpLT5zX2ZyYWdfc2l6ZSkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJFWFQzLWZzOiBmcmFnc2l6ZSAlbHUgIT0gYmxvY2tzaXplICV1ICh1bnN1cHBvcnRlZClcbiIsCisJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJICAgICAgICJlcnJvcjogZnJhZ3NpemUgJWx1ICE9IGJsb2Nrc2l6ZSAldSAodW5zdXBwb3J0ZWQpIiwKIAkJICAgICAgIHNiaS0+c19mcmFnX3NpemUsIGJsb2Nrc2l6ZSk7CiAJCWdvdG8gZmFpbGVkX21vdW50OwogCX0KQEAgLTE3ODksMzEgKzE4MjUsMzEgQEAKIAl9CiAKIAlpZiAoc2JpLT5zX2Jsb2Nrc19wZXJfZ3JvdXAgPiBibG9ja3NpemUgKiA4KSB7Ci0JCXByaW50ayAoS0VSTl9FUlIKLQkJCSJFWFQzLWZzOiAjYmxvY2tzIHBlciBncm91cCB0b28gYmlnOiAlbHVcbiIsCisJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCSIjYmxvY2tzIHBlciBncm91cCB0b28gYmlnOiAlbHUiLAogCQkJc2JpLT5zX2Jsb2Nrc19wZXJfZ3JvdXApOwogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAl9CiAJaWYgKHNiaS0+c19mcmFnc19wZXJfZ3JvdXAgPiBibG9ja3NpemUgKiA4KSB7Ci0JCXByaW50ayAoS0VSTl9FUlIKLQkJCSJFWFQzLWZzOiAjZnJhZ21lbnRzIHBlciBncm91cCB0b28gYmlnOiAlbHVcbiIsCisJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCSJlcnJvcjogI2ZyYWdtZW50cyBwZXIgZ3JvdXAgdG9vIGJpZzogJWx1IiwKIAkJCXNiaS0+c19mcmFnc19wZXJfZ3JvdXApOwogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAl9CiAJaWYgKHNiaS0+c19pbm9kZXNfcGVyX2dyb3VwID4gYmxvY2tzaXplICogOCkgewotCQlwcmludGsgKEtFUk5fRVJSCi0JCQkiRVhUMy1mczogI2lub2RlcyBwZXIgZ3JvdXAgdG9vIGJpZzogJWx1XG4iLAorCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsCisJCQkiZXJyb3I6ICNpbm9kZXMgcGVyIGdyb3VwIHRvbyBiaWc6ICVsdSIsCiAJCQlzYmktPnNfaW5vZGVzX3Blcl9ncm91cCk7CiAJCWdvdG8gZmFpbGVkX21vdW50OwogCX0KIAogCWlmIChsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpID4KIAkJICAgIChzZWN0b3JfdCkofjBVTEwpID4+IChzYi0+c19ibG9ja3NpemVfYml0cyAtIDkpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogZmlsZXN5c3RlbSBvbiAlczoiCi0JCQkiIHRvbyBsYXJnZSB0byBtb3VudCBzYWZlbHlcbiIsIHNiLT5zX2lkKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fRVJSLAorCQkJImVycm9yOiBmaWxlc3lzdGVtIGlzIHRvbyBsYXJnZSB0byBtb3VudCBzYWZlbHkiKTsKIAkJaWYgKHNpemVvZihzZWN0b3JfdCkgPCA4KQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRVhUMy1mczogQ09ORklHX0xCREFGIG5vdCAiCi0JCQkJCSJlbmFibGVkXG4iKTsKKwkJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCQkiZXJyb3I6IENPTkZJR19MQkRBRiBub3QgZW5hYmxlZCIpOwogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAl9CiAKQEAgLTE4MjcsNyArMTg2Myw4IEBACiAJc2JpLT5zX2dyb3VwX2Rlc2MgPSBrbWFsbG9jKGRiX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksCiAJCQkJICAgIEdGUF9LRVJORUwpOwogCWlmIChzYmktPnNfZ3JvdXBfZGVzYyA9PSBOVUxMKSB7Ci0JCXByaW50ayAoS0VSTl9FUlIgIkVYVDMtZnM6IG5vdCBlbm91Z2ggbWVtb3J5XG4iKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fRVJSLAorCQkJImVycm9yOiBub3QgZW5vdWdoIG1lbW9yeSIpOwogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAl9CiAKQEAgLTE4MzcsMTQgKzE4NzQsMTUgQEAKIAkJYmxvY2sgPSBkZXNjcmlwdG9yX2xvYyhzYiwgbG9naWNfc2JfYmxvY2ssIGkpOwogCQlzYmktPnNfZ3JvdXBfZGVzY1tpXSA9IHNiX2JyZWFkKHNiLCBibG9jayk7CiAJCWlmICghc2JpLT5zX2dyb3VwX2Rlc2NbaV0pIHsKLQkJCXByaW50ayAoS0VSTl9FUlIgIkVYVDMtZnM6ICIKLQkJCQkiY2FuJ3QgcmVhZCBncm91cCBkZXNjcmlwdG9yICVkXG4iLCBpKTsKKwkJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCQkiZXJyb3I6IGNhbid0IHJlYWQgZ3JvdXAgZGVzY3JpcHRvciAlZCIsIGkpOwogCQkJZGJfY291bnQgPSBpOwogCQkJZ290byBmYWlsZWRfbW91bnQyOwogCQl9CiAJfQogCWlmICghZXh0M19jaGVja19kZXNjcmlwdG9ycyAoc2IpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogZ3JvdXAgZGVzY3JpcHRvcnMgY29ycnVwdGVkIVxuIik7CisJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCSJlcnJvcjogZ3JvdXAgZGVzY3JpcHRvcnMgY29ycnVwdGVkIik7CiAJCWdvdG8gZmFpbGVkX21vdW50MjsKIAl9CiAJc2JpLT5zX2dkYl9jb3VudCA9IGRiX2NvdW50OwpAQCAtMTg2Miw3ICsxOTAwLDcgQEAKIAkJCQlleHQzX2NvdW50X2RpcnMoc2IpKTsKIAl9CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGluc3VmZmljaWVudCBtZW1vcnlcbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogaW5zdWZmaWNpZW50IG1lbW9yeSIpOwogCQlnb3RvIGZhaWxlZF9tb3VudDM7CiAJfQogCkBAIC0xOTEwLDkgKzE5NDgsOSBAQAogCQkJZ290byBmYWlsZWRfbW91bnQzOwogCX0gZWxzZSB7CiAJCWlmICghc2lsZW50KQotCQkJcHJpbnRrIChLRVJOX0VSUgotCQkJCSJleHQzOiBObyBqb3VybmFsIG9uIGZpbGVzeXN0ZW0gb24gJXNcbiIsCi0JCQkJc2ItPnNfaWQpOworCQkJZXh0M19tc2coc2IsIEtFUk5fRVJSLAorCQkJCSJlcnJvcjogbm8gam91cm5hbCBmb3VuZC4gIgorCQkJCSJtb3VudGluZyBleHQzIG92ZXIgZXh0Mj8iKTsKIAkJZ290byBmYWlsZWRfbW91bnQzOwogCX0KIApAQCAtMTkzNCw4ICsxOTcyLDkgQEAKIAljYXNlIEVYVDNfTU9VTlRfV1JJVEVCQUNLX0RBVEE6CiAJCWlmICgham91cm5hbF9jaGVja19hdmFpbGFibGVfZmVhdHVyZXMKIAkJICAgIChzYmktPnNfam91cm5hbCwgMCwgMCwgSkZTX0ZFQVRVUkVfSU5DT01QQVRfUkVWT0tFKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBKb3VybmFsIGRvZXMgbm90IHN1cHBvcnQgIgotCQkJICAgICAgICJyZXF1ZXN0ZWQgZGF0YSBqb3VybmFsaW5nIG1vZGVcbiIpOworCQkJZXh0M19tc2coc2IsIEtFUk5fRVJSLAorCQkJCSJlcnJvcjogam91cm5hbCBkb2VzIG5vdCBzdXBwb3J0ICIKKwkJCQkicmVxdWVzdGVkIGRhdGEgam91cm5hbGluZyBtb2RlIik7CiAJCQlnb3RvIGZhaWxlZF9tb3VudDQ7CiAJCX0KIAlkZWZhdWx0OgpAQCAtMTk0NCw4ICsxOTgzLDkgQEAKIAogCWlmICh0ZXN0X29wdChzYiwgTk9CSCkpIHsKIAkJaWYgKCEodGVzdF9vcHQoc2IsIERBVEFfRkxBR1MpID09IEVYVDNfTU9VTlRfV1JJVEVCQUNLX0RBVEEpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJFWFQzLWZzOiBJZ25vcmluZyBub2JoIG9wdGlvbiAtICIKLQkJCQkiaXRzIHN1cHBvcnRlZCBvbmx5IHdpdGggd3JpdGViYWNrIG1vZGVcbiIpOworCQkJZXh0M19tc2coc2IsIEtFUk5fV0FSTklORywKKwkJCQkid2FybmluZzogaWdub3Jpbmcgbm9iaCBvcHRpb24gLSAiCisJCQkJIml0IGlzIHN1cHBvcnRlZCBvbmx5IHdpdGggd3JpdGViYWNrIG1vZGUiKTsKIAkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBOT0JIKTsKIAkJfQogCX0KQEAgLTE5NTYsMTggKzE5OTYsMTggQEAKIAogCXJvb3QgPSBleHQzX2lnZXQoc2IsIEVYVDNfUk9PVF9JTk8pOwogCWlmIChJU19FUlIocm9vdCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBnZXQgcm9vdCBpbm9kZSBmYWlsZWRcbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkIik7CiAJCXJldCA9IFBUUl9FUlIocm9vdCk7CiAJCWdvdG8gZmFpbGVkX21vdW50NDsKIAl9CiAJaWYgKCFTX0lTRElSKHJvb3QtPmlfbW9kZSkgfHwgIXJvb3QtPmlfYmxvY2tzIHx8ICFyb290LT5pX3NpemUpIHsKIAkJaXB1dChyb290KTsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBjb3JydXB0IHJvb3QgaW5vZGUsIHJ1biBlMmZzY2tcbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogY29ycnVwdCByb290IGlub2RlLCBydW4gZTJmc2NrIik7CiAJCWdvdG8gZmFpbGVkX21vdW50NDsKIAl9CiAJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290KTsKIAlpZiAoIXNiLT5zX3Jvb3QpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBnZXQgcm9vdCBkZW50cnkgZmFpbGVkXG4iKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fRVJSLCAiZXJyb3I6IGdldCByb290IGRlbnRyeSBmYWlsZWQiKTsKIAkJaXB1dChyb290KTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBmYWlsZWRfbW91bnQ0OwpAQCAtMTk4Niw5ICsyMDI2LDkgQEAKIAlleHQzX29ycGhhbl9jbGVhbnVwKHNiLCBlcyk7CiAJRVhUM19TQihzYiktPnNfbW91bnRfc3RhdGUgJj0gfkVYVDNfT1JQSEFOX0ZTOwogCWlmIChuZWVkc19yZWNvdmVyeSkKLQkJcHJpbnRrIChLRVJOX0lORk8gIkVYVDMtZnM6IHJlY292ZXJ5IGNvbXBsZXRlLlxuIik7CisJCWV4dDNfbXNnKHNiLCBLRVJOX0lORk8sICJyZWNvdmVyeSBjb21wbGV0ZSIpOwogCWV4dDNfbWFya19yZWNvdmVyeV9jb21wbGV0ZShzYiwgZXMpOwotCXByaW50ayAoS0VSTl9JTkZPICJFWFQzLWZzOiBtb3VudGVkIGZpbGVzeXN0ZW0gd2l0aCAlcyBkYXRhIG1vZGUuXG4iLAorCWV4dDNfbXNnKHNiLCBLRVJOX0lORk8sICJtb3VudGVkIGZpbGVzeXN0ZW0gd2l0aCAlcyBkYXRhIG1vZGUiLAogCQl0ZXN0X29wdChzYixEQVRBX0ZMQUdTKSA9PSBFWFQzX01PVU5UX0pPVVJOQUxfREFUQSA/ICJqb3VybmFsIjoKIAkJdGVzdF9vcHQoc2IsREFUQV9GTEFHUykgPT0gRVhUM19NT1VOVF9PUkRFUkVEX0RBVEEgPyAib3JkZXJlZCI6CiAJCSJ3cml0ZWJhY2siKTsKQEAgLTE5OTgsNyArMjAzOCw4IEBACiAKIGNhbnRmaW5kX2V4dDM6CiAJaWYgKCFzaWxlbnQpCi0JCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCBmaW5kIGV4dDMgZmlsZXN5c3RlbSBvbiBkZXYgJXMuXG4iLAorCQlleHQzX21zZyhzYiwgS0VSTl9JTkZPLAorCQkJImVycm9yOiBjYW4ndCBmaW5kIGV4dDMgZmlsZXN5c3RlbSBvbiBkZXYgJXMuIiwKIAkJICAgICAgIHNiLT5zX2lkKTsKIAlnb3RvIGZhaWxlZF9tb3VudDsKIApAQCAtMjA2NiwyNyArMjEwNywyNyBAQAogCiAJam91cm5hbF9pbm9kZSA9IGV4dDNfaWdldChzYiwgam91cm5hbF9pbnVtKTsKIAlpZiAoSVNfRVJSKGpvdXJuYWxfaW5vZGUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogbm8gam91cm5hbCBmb3VuZC5cbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogbm8gam91cm5hbCBmb3VuZCIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJaWYgKCFqb3VybmFsX2lub2RlLT5pX25saW5rKSB7CiAJCW1ha2VfYmFkX2lub2RlKGpvdXJuYWxfaW5vZGUpOwogCQlpcHV0KGpvdXJuYWxfaW5vZGUpOwotCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGpvdXJuYWwgaW5vZGUgaXMgZGVsZXRlZC5cbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogam91cm5hbCBpbm9kZSBpcyBkZWxldGVkIik7CiAJCXJldHVybiBOVUxMOwogCX0KIAogCWpiZF9kZWJ1ZygyLCAiSm91cm5hbCBpbm9kZSBmb3VuZCBhdCAlcDogJUxkIGJ5dGVzXG4iLAogCQkgIGpvdXJuYWxfaW5vZGUsIGpvdXJuYWxfaW5vZGUtPmlfc2l6ZSk7CiAJaWYgKCFTX0lTUkVHKGpvdXJuYWxfaW5vZGUtPmlfbW9kZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBpbnZhbGlkIGpvdXJuYWwgaW5vZGUuXG4iKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fRVJSLCAiZXJyb3I6IGludmFsaWQgam91cm5hbCBpbm9kZSIpOwogCQlpcHV0KGpvdXJuYWxfaW5vZGUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKIAlqb3VybmFsID0gam91cm5hbF9pbml0X2lub2RlKGpvdXJuYWxfaW5vZGUpOwogCWlmICgham91cm5hbCkgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IENvdWxkIG5vdCBsb2FkIGpvdXJuYWwgaW5vZGVcbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogY291bGQgbm90IGxvYWQgam91cm5hbCBpbm9kZSIpOwogCQlpcHV0KGpvdXJuYWxfaW5vZGUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0yMTA4LDEzICsyMTQ5LDEzIEBACiAJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKiBlczsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OwogCi0JYmRldiA9IGV4dDNfYmxrZGV2X2dldChqX2Rldik7CisJYmRldiA9IGV4dDNfYmxrZGV2X2dldChqX2Rldiwgc2IpOwogCWlmIChiZGV2ID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCiAJaWYgKGJkX2NsYWltKGJkZXYsIHNiKSkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICAiRVhUMzogZmFpbGVkIHRvIGNsYWltIGV4dGVybmFsIGpvdXJuYWwgZGV2aWNlLlxuIik7CisJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCSJlcnJvcjogZmFpbGVkIHRvIGNsYWltIGV4dGVybmFsIGpvdXJuYWwgZGV2aWNlIik7CiAJCWJsa2Rldl9wdXQoYmRldiwgRk1PREVfUkVBRHxGTU9ERV9XUklURSk7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTIxMjIsOCArMjE2Myw4IEBACiAJYmxvY2tzaXplID0gc2ItPnNfYmxvY2tzaXplOwogCWhibG9jayA9IGJkZXZfbG9naWNhbF9ibG9ja19zaXplKGJkZXYpOwogCWlmIChibG9ja3NpemUgPCBoYmxvY2spIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkiRVhUMy1mczogYmxvY2tzaXplIHRvbyBzbWFsbCBmb3Igam91cm5hbCBkZXZpY2UuXG4iKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fRVJSLAorCQkJImVycm9yOiBibG9ja3NpemUgdG9vIHNtYWxsIGZvciBqb3VybmFsIGRldmljZSIpOwogCQlnb3RvIG91dF9iZGV2OwogCX0KIApAQCAtMjEzMSw4ICsyMTcyLDggQEAKIAlvZmZzZXQgPSBFWFQzX01JTl9CTE9DS19TSVpFICUgYmxvY2tzaXplOwogCXNldF9ibG9ja3NpemUoYmRldiwgYmxvY2tzaXplKTsKIAlpZiAoIShiaCA9IF9fYnJlYWQoYmRldiwgc2JfYmxvY2ssIGJsb2Nrc2l6ZSkpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogY291bGRuJ3QgcmVhZCBzdXBlcmJsb2NrIG9mICIKLQkJICAgICAgICJleHRlcm5hbCBqb3VybmFsXG4iKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fRVJSLCAiZXJyb3I6IGNvdWxkbid0IHJlYWQgc3VwZXJibG9jayBvZiAiCisJCQkiZXh0ZXJuYWwgam91cm5hbCIpOwogCQlnb3RvIG91dF9iZGV2OwogCX0KIApAQCAtMjE0MCwxNCArMjE4MSwxNCBAQAogCWlmICgobGUxNl90b19jcHUoZXMtPnNfbWFnaWMpICE9IEVYVDNfU1VQRVJfTUFHSUMpIHx8CiAJICAgICEobGUzMl90b19jcHUoZXMtPnNfZmVhdHVyZV9pbmNvbXBhdCkgJgogCSAgICAgIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9KT1VSTkFMX0RFVikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBleHRlcm5hbCBqb3VybmFsIGhhcyAiCi0JCQkJCSJiYWQgc3VwZXJibG9ja1xuIik7CisJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwgImVycm9yOiBleHRlcm5hbCBqb3VybmFsIGhhcyAiCisJCQkiYmFkIHN1cGVyYmxvY2siKTsKIAkJYnJlbHNlKGJoKTsKIAkJZ290byBvdXRfYmRldjsKIAl9CiAKIAlpZiAobWVtY21wKEVYVDNfU0Ioc2IpLT5zX2VzLT5zX2pvdXJuYWxfdXVpZCwgZXMtPnNfdXVpZCwgMTYpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogam91cm5hbCBVVUlEIGRvZXMgbm90IG1hdGNoXG4iKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fRVJSLCAiZXJyb3I6IGpvdXJuYWwgVVVJRCBkb2VzIG5vdCBtYXRjaCIpOwogCQlicmVsc2UoYmgpOwogCQlnb3RvIG91dF9iZGV2OwogCX0KQEAgLTIxNTksMTkgKzIyMDAsMjEgQEAKIAlqb3VybmFsID0gam91cm5hbF9pbml0X2RldihiZGV2LCBzYi0+c19iZGV2LAogCQkJCQlzdGFydCwgbGVuLCBibG9ja3NpemUpOwogCWlmICgham91cm5hbCkgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGZhaWxlZCB0byBjcmVhdGUgZGV2aWNlIGpvdXJuYWxcbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsCisJCQkiZXJyb3I6IGZhaWxlZCB0byBjcmVhdGUgZGV2aWNlIGpvdXJuYWwiKTsKIAkJZ290byBvdXRfYmRldjsKIAl9CiAJam91cm5hbC0+al9wcml2YXRlID0gc2I7CiAJbGxfcndfYmxvY2soUkVBRCwgMSwgJmpvdXJuYWwtPmpfc2JfYnVmZmVyKTsKIAl3YWl0X29uX2J1ZmZlcihqb3VybmFsLT5qX3NiX2J1ZmZlcik7CiAJaWYgKCFidWZmZXJfdXB0b2RhdGUoam91cm5hbC0+al9zYl9idWZmZXIpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogSS9PIGVycm9yIG9uIGpvdXJuYWwgZGV2aWNlXG4iKTsKKwkJZXh0M19tc2coc2IsIEtFUk5fRVJSLCAiSS9PIGVycm9yIG9uIGpvdXJuYWwgZGV2aWNlIik7CiAJCWdvdG8gb3V0X2pvdXJuYWw7CiAJfQogCWlmIChiZTMyX3RvX2NwdShqb3VybmFsLT5qX3N1cGVyYmxvY2stPnNfbnJfdXNlcnMpICE9IDEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBFeHRlcm5hbCBqb3VybmFsIGhhcyBtb3JlIHRoYW4gb25lICIKLQkJCQkJInVzZXIgKHVuc3VwcG9ydGVkKSAtICVkXG4iLAorCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsCisJCQkiZXJyb3I6IGV4dGVybmFsIGpvdXJuYWwgaGFzIG1vcmUgdGhhbiBvbmUgIgorCQkJInVzZXIgKHVuc3VwcG9ydGVkKSAtICVkIiwKIAkJCWJlMzJfdG9fY3B1KGpvdXJuYWwtPmpfc3VwZXJibG9jay0+c19ucl91c2VycykpOwogCQlnb3RvIG91dF9qb3VybmFsOwogCX0KQEAgLTIxOTcsOCArMjI0MCw4IEBACiAKIAlpZiAoam91cm5hbF9kZXZudW0gJiYKIAkgICAgam91cm5hbF9kZXZudW0gIT0gbGUzMl90b19jcHUoZXMtPnNfam91cm5hbF9kZXYpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkVYVDMtZnM6IGV4dGVybmFsIGpvdXJuYWwgZGV2aWNlIG1ham9yL21pbm9yICIKLQkJCSJudW1iZXJzIGhhdmUgY2hhbmdlZFxuIik7CisJCWV4dDNfbXNnKHNiLCBLRVJOX0lORk8sICJleHRlcm5hbCBqb3VybmFsIGRldmljZSBtYWpvci9taW5vciAiCisJCQkibnVtYmVycyBoYXZlIGNoYW5nZWQiKTsKIAkJam91cm5hbF9kZXYgPSBuZXdfZGVjb2RlX2Rldihqb3VybmFsX2Rldm51bSk7CiAJfSBlbHNlCiAJCWpvdXJuYWxfZGV2ID0gbmV3X2RlY29kZV9kZXYobGUzMl90b19jcHUoZXMtPnNfam91cm5hbF9kZXYpKTsKQEAgLTIyMTMsMjEgKzIyNTYsMjEgQEAKIAogCWlmIChFWFQzX0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUikpIHsKIAkJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJFWFQzLWZzOiBJTkZPOiByZWNvdmVyeSAiCi0JCQkJCSJyZXF1aXJlZCBvbiByZWFkb25seSBmaWxlc3lzdGVtLlxuIik7CisJCQlleHQzX21zZyhzYiwgS0VSTl9JTkZPLAorCQkJCSJyZWNvdmVyeSByZXF1aXJlZCBvbiByZWFkb25seSBmaWxlc3lzdGVtIik7CiAJCQlpZiAocmVhbGx5X3JlYWRfb25seSkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogd3JpdGUgYWNjZXNzICIKLQkJCQkJInVuYXZhaWxhYmxlLCBjYW5ub3QgcHJvY2VlZC5cbiIpOworCQkJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwgImVycm9yOiB3cml0ZSBhY2Nlc3MgIgorCQkJCQkidW5hdmFpbGFibGUsIGNhbm5vdCBwcm9jZWVkIik7CiAJCQkJcmV0dXJuIC1FUk9GUzsKIAkJCX0KLQkJCXByaW50ayAoS0VSTl9JTkZPICJFWFQzLWZzOiB3cml0ZSBhY2Nlc3Mgd2lsbCAiCi0JCQkJCSJiZSBlbmFibGVkIGR1cmluZyByZWNvdmVyeS5cbiIpOworCQkJZXh0M19tc2coc2IsIEtFUk5fSU5GTywKKwkJCQkid3JpdGUgYWNjZXNzIHdpbGwgYmUgZW5hYmxlZCBkdXJpbmcgcmVjb3ZlcnkiKTsKIAkJfQogCX0KIAogCWlmIChqb3VybmFsX2ludW0gJiYgam91cm5hbF9kZXYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBmaWxlc3lzdGVtIGhhcyBib3RoIGpvdXJuYWwgIgotCQkgICAgICAgImFuZCBpbm9kZSBqb3VybmFscyFcbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvcjogZmlsZXN5c3RlbSBoYXMgYm90aCBqb3VybmFsICIKKwkJICAgICAgICJhbmQgaW5vZGUgam91cm5hbHMiKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMjQyLDcgKzIyODUsNyBAQAogCWlmICghcmVhbGx5X3JlYWRfb25seSAmJiB0ZXN0X29wdChzYiwgVVBEQVRFX0pPVVJOQUwpKSB7CiAJCWVyciA9IGpvdXJuYWxfdXBkYXRlX2Zvcm1hdChqb3VybmFsKTsKIAkJaWYgKGVycikgIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogZXJyb3IgdXBkYXRpbmcgam91cm5hbC5cbiIpOworCQkJZXh0M19tc2coc2IsIEtFUk5fRVJSLCAiZXJyb3IgdXBkYXRpbmcgam91cm5hbCIpOwogCQkJam91cm5hbF9kZXN0cm95KGpvdXJuYWwpOwogCQkJcmV0dXJuIGVycjsKIAkJfQpAQCAtMjI1NCw3ICsyMjk3LDcgQEAKIAkJZXJyID0gam91cm5hbF9sb2FkKGpvdXJuYWwpOwogCiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGVycm9yIGxvYWRpbmcgam91cm5hbC5cbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvciBsb2FkaW5nIGpvdXJuYWwiKTsKIAkJam91cm5hbF9kZXN0cm95KGpvdXJuYWwpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTIyNzMsMTYgKzIzMTYsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBleHQzX2NyZWF0ZV9qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLAotCQkJICAgICAgIHN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICogZXMsCitzdGF0aWMgaW50IGV4dDNfY3JlYXRlX2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgICAgICBzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqZXMsCiAJCQkgICAgICAgdW5zaWduZWQgaW50IGpvdXJuYWxfaW51bSkKIHsKIAlqb3VybmFsX3QgKmpvdXJuYWw7CiAJaW50IGVycjsKIAogCWlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IHJlYWRvbmx5IGZpbGVzeXN0ZW0gd2hlbiB0cnlpbmcgdG8gIgotCQkJCSJjcmVhdGUgam91cm5hbC5cbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsCisJCQkiZXJyb3I6IHJlYWRvbmx5IGZpbGVzeXN0ZW0gd2hlbiB0cnlpbmcgdG8gIgorCQkJImNyZWF0ZSBqb3VybmFsIik7CiAJCXJldHVybiAtRVJPRlM7CiAJfQogCkBAIC0yMjkwLDEyICsyMzM0LDEyIEBACiAJaWYgKCFqb3VybmFsKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXByaW50ayhLRVJOX0lORk8gIkVYVDMtZnM6IGNyZWF0aW5nIG5ldyBqb3VybmFsIG9uIGlub2RlICV1XG4iLAorCWV4dDNfbXNnKHNiLCBLRVJOX0lORk8sICJjcmVhdGluZyBuZXcgam91cm5hbCBvbiBpbm9kZSAldSIsCiAJICAgICAgIGpvdXJuYWxfaW51bSk7CiAKIAllcnIgPSBqb3VybmFsX2NyZWF0ZShqb3VybmFsKTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogZXJyb3IgY3JlYXRpbmcgam91cm5hbC5cbiIpOworCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsICJlcnJvciBjcmVhdGluZyBqb3VybmFsIik7CiAJCWpvdXJuYWxfZGVzdHJveShqb3VybmFsKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMjM3Niw4ICsyNDIwLDggQEAKICAqIGhhcyByZWNvcmRlZCBhbiBlcnJvciBmcm9tIGEgcHJldmlvdXMgbGlmZXRpbWUsIG1vdmUgdGhhdCBlcnJvciB0byB0aGUKICAqIG1haW4gZmlsZXN5c3RlbSBub3cuCiAgKi8KLXN0YXRpYyB2b2lkIGV4dDNfY2xlYXJfam91cm5hbF9lcnIoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsCi0JCQkJICAgc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKiBlcykKK3N0YXRpYyB2b2lkIGV4dDNfY2xlYXJfam91cm5hbF9lcnIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICBzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqZXMpCiB7CiAJam91cm5hbF90ICpqb3VybmFsOwogCWludCBqX2Vycm5vOwpAQCAtMjU2OCwxMCArMjYxMiwxMCBAQAogCQkJX19sZTMyIHJldDsKIAkJCWlmICgocmV0ID0gRVhUM19IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsCiAJCQkJCX5FWFQzX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFApKSkgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVYVDMtZnM6ICVzOiBjb3VsZG4ndCAiCi0JCQkJICAgICAgICJyZW1vdW50IFJEV1IgYmVjYXVzZSBvZiB1bnN1cHBvcnRlZCAiCi0JCQkJICAgICAgICJvcHRpb25hbCBmZWF0dXJlcyAoJXgpLlxuIiwKLQkJCQkgICAgICAgc2ItPnNfaWQsIGxlMzJfdG9fY3B1KHJldCkpOworCQkJCWV4dDNfbXNnKHNiLCBLRVJOX1dBUk5JTkcsCisJCQkJCSJ3YXJuaW5nOiBjb3VsZG4ndCByZW1vdW50IFJEV1IgIgorCQkJCQkiYmVjYXVzZSBvZiB1bnN1cHBvcnRlZCBvcHRpb25hbCAiCisJCQkJCSJmZWF0dXJlcyAoJXgpIiwgbGUzMl90b19jcHUocmV0KSk7CiAJCQkJZXJyID0gLUVST0ZTOwogCQkJCWdvdG8gcmVzdG9yZV9vcHRzOwogCQkJfQpAQCAtMjU4MiwxMSArMjYyNiwxMCBAQAogCQkJICogcmVxdWlyZSBhIGZ1bGwgdW1vdW50L3JlbW91bnQgZm9yIG5vdy4KIAkJCSAqLwogCQkJaWYgKGVzLT5zX2xhc3Rfb3JwaGFuKSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRVhUMy1mczogJXM6IGNvdWxkbid0ICIKKwkJCQlleHQzX21zZyhzYiwgS0VSTl9XQVJOSU5HLCAid2FybmluZzogY291bGRuJ3QgIgogCQkJCSAgICAgICAicmVtb3VudCBSRFdSIGJlY2F1c2Ugb2YgdW5wcm9jZXNzZWQgIgogCQkJCSAgICAgICAib3JwaGFuIGlub2RlIGxpc3QuICBQbGVhc2UgIgotCQkJCSAgICAgICAidW1vdW50L3JlbW91bnQgaW5zdGVhZC5cbiIsCi0JCQkJICAgICAgIHNiLT5zX2lkKTsKKwkJCQkgICAgICAgInVtb3VudC9yZW1vdW50IGluc3RlYWQuIik7CiAJCQkJZXJyID0gLUVJTlZBTDsKIAkJCQlnb3RvIHJlc3RvcmVfb3B0czsKIAkJCX0KQEAgLTI2ODYsMTMgKzI3MjksMTEgQEAKIAlidWYtPmZfYnNpemUgPSBzYi0+c19ibG9ja3NpemU7CiAJYnVmLT5mX2Jsb2NrcyA9IGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkgLSBzYmktPnNfb3ZlcmhlYWRfbGFzdDsKIAlidWYtPmZfYmZyZWUgPSBwZXJjcHVfY291bnRlcl9zdW1fcG9zaXRpdmUoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpOwotCWVzLT5zX2ZyZWVfYmxvY2tzX2NvdW50ID0gY3B1X3RvX2xlMzIoYnVmLT5mX2JmcmVlKTsKIAlidWYtPmZfYmF2YWlsID0gYnVmLT5mX2JmcmVlIC0gbGUzMl90b19jcHUoZXMtPnNfcl9ibG9ja3NfY291bnQpOwogCWlmIChidWYtPmZfYmZyZWUgPCBsZTMyX3RvX2NwdShlcy0+c19yX2Jsb2Nrc19jb3VudCkpCiAJCWJ1Zi0+Zl9iYXZhaWwgPSAwOwogCWJ1Zi0+Zl9maWxlcyA9IGxlMzJfdG9fY3B1KGVzLT5zX2lub2Rlc19jb3VudCk7CiAJYnVmLT5mX2ZmcmVlID0gcGVyY3B1X2NvdW50ZXJfc3VtX3Bvc2l0aXZlKCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKLQllcy0+c19mcmVlX2lub2Rlc19jb3VudCA9IGNwdV90b19sZTMyKGJ1Zi0+Zl9mZnJlZSk7CiAJYnVmLT5mX25hbWVsZW4gPSBFWFQzX05BTUVfTEVOOwogCWZzaWQgPSBsZTY0X3RvX2NwdXAoKHZvaWQgKillcy0+c191dWlkKSBeCiAJICAgICAgIGxlNjRfdG9fY3B1cCgodm9pZCAqKWVzLT5zX3V1aWQgKyBzaXplb2YodTY0KSk7CkBAIC0yODM3LDkgKzI4NzgsOSBAQAogCWlmIChFWFQzX1NCKHNiKS0+c19xZl9uYW1lc1t0eXBlXSkgewogCQkvKiBRdW90YWZpbGUgbm90IG9mIGZzIHJvb3Q/ICovCiAJCWlmIChwYXRoLmRlbnRyeS0+ZF9wYXJlbnQgIT0gc2ItPnNfcm9vdCkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCQkiRVhUMy1mczogUXVvdGEgZmlsZSBub3Qgb24gZmlsZXN5c3RlbSByb290LiAiCi0JCQkJIkpvdXJuYWxlZCBxdW90YSB3aWxsIG5vdCB3b3JrLlxuIik7CisJCQlleHQzX21zZyhzYiwgS0VSTl9XQVJOSU5HLAorCQkJCSJ3YXJuaW5nOiBRdW90YSBmaWxlIG5vdCBvbiBmaWxlc3lzdGVtIHJvb3QuICIKKwkJCQkiSm91cm5hbGVkIHF1b3RhIHdpbGwgbm90IHdvcmsuIik7CiAJfQogCiAJLyoKQEAgLTI5MjEsOCArMjk2Miw5IEBACiAJaGFuZGxlX3QgKmhhbmRsZSA9IGpvdXJuYWxfY3VycmVudF9oYW5kbGUoKTsKIAogCWlmICghaGFuZGxlKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkVYVDMtZnM6IFF1b3RhIHdyaXRlIChvZmY9JUx1LCBsZW49JUx1KSIKLQkJCSIgY2FuY2VsbGVkIGJlY2F1c2UgdHJhbnNhY3Rpb24gaXMgbm90IHN0YXJ0ZWQuXG4iLAorCQlleHQzX21zZyhzYiwgS0VSTl9XQVJOSU5HLAorCQkJIndhcm5pbmc6IHF1b3RhIHdyaXRlIChvZmY9JWxsdSwgbGVuPSVsbHUpIgorCQkJIiBjYW5jZWxsZWQgYmVjYXVzZSB0cmFuc2FjdGlvbiBpcyBub3Qgc3RhcnRlZC4iLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylvZmYsICh1bnNpZ25lZCBsb25nIGxvbmcpbGVuKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpkaWZmIC0tZ2l0IGEvZnMvZXh0My94YXR0ci5jIGIvZnMvZXh0My94YXR0ci5jCmluZGV4IDU0NWUzN2MuLjM4N2Q5MmQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMveGF0dHIuYworKysgYi9mcy9leHQzL3hhdHRyLmMKQEAgLTk2MCw2ICs5NjAsMTAgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gY2xlYW51cDsKIAorCWVycm9yID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBpcy5pbG9jLmJoKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gY2xlYW51cDsKKwogCWlmIChFWFQzX0koaW5vZGUpLT5pX3N0YXRlICYgRVhUM19TVEFURV9ORVcpIHsKIAkJc3RydWN0IGV4dDNfaW5vZGUgKnJhd19pbm9kZSA9IGV4dDNfcmF3X2lub2RlKCZpcy5pbG9jKTsKIAkJbWVtc2V0KHJhd19pbm9kZSwgMCwgRVhUM19TQihpbm9kZS0+aV9zYiktPnNfaW5vZGVfc2l6ZSk7CkBAIC05ODUsOSArOTg5LDYgQEAKIAkJaWYgKGZsYWdzICYgWEFUVFJfQ1JFQVRFKQogCQkJZ290byBjbGVhbnVwOwogCX0KLQllcnJvciA9IGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgaXMuaWxvYy5iaCk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIGNsZWFudXA7CiAJaWYgKCF2YWx1ZSkgewogCQlpZiAoIWlzLnMubm90X2ZvdW5kKQogCQkJZXJyb3IgPSBleHQzX3hhdHRyX2lib2R5X3NldChoYW5kbGUsIGlub2RlLCAmaSwgJmlzKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbWJhbGxvYy5jIGIvZnMvZXh0NC9tYmFsbG9jLmMKaW5kZXggYzFlMTlkNS4uYjFmZDNkYSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9tYmFsbG9jLmMKKysrIGIvZnMvZXh0NC9tYmFsbG9jLmMKQEAgLTM5NTUsNyArMzk1NSw3IEBACiAJICogcGVyIGNwdSBsb2NhbGl0eSBncm91cCBpcyB0byByZWR1Y2UgdGhlIGNvbnRlbnRpb24gYmV0d2VlbiBibG9jawogCSAqIHJlcXVlc3QgZnJvbSBtdWx0aXBsZSBDUFVzLgogCSAqLwotCWFjLT5hY19sZyA9IHBlcl9jcHVfcHRyKHNiaS0+c19sb2NhbGl0eV9ncm91cHMsIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpOworCWFjLT5hY19sZyA9IF9fdGhpc19jcHVfcHRyKHNiaS0+c19sb2NhbGl0eV9ncm91cHMpOwogCiAJLyogd2UncmUgZ29pbmcgdG8gdXNlIGdyb3VwIGFsbG9jYXRpb24gKi8KIAlhYy0+YWNfZmxhZ3MgfD0gRVhUNF9NQl9ISU5UX0dST1VQX0FMTE9DOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9zdXBlci5jIGIvZnMvZXh0NC9zdXBlci5jCmluZGV4IDhiNThhMTQuLjc2OGMxMTEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvc3VwZXIuYworKysgYi9mcy9leHQ0L3N1cGVyLmMKQEAgLTc2OSw5ICs3NjksMjIgQEAKICNpZiBkZWZpbmVkKENPTkZJR19RVU9UQSkKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKIAotCWlmIChzYmktPnNfanF1b3RhX2ZtdCkKLQkJc2VxX3ByaW50ZihzZXEsICIsanFmbXQ9JXMiLAotCQkoc2JpLT5zX2pxdW90YV9mbXQgPT0gUUZNVF9WRlNfT0xEKSA/ICJ2ZnNvbGQiIDogInZmc3YwIik7CisJaWYgKHNiaS0+c19qcXVvdGFfZm10KSB7CisJCWNoYXIgKmZtdG5hbWUgPSAiIjsKKworCQlzd2l0Y2ggKHNiaS0+c19qcXVvdGFfZm10KSB7CisJCWNhc2UgUUZNVF9WRlNfT0xEOgorCQkJZm10bmFtZSA9ICJ2ZnNvbGQiOworCQkJYnJlYWs7CisJCWNhc2UgUUZNVF9WRlNfVjA6CisJCQlmbXRuYW1lID0gInZmc3YwIjsKKwkJCWJyZWFrOworCQljYXNlIFFGTVRfVkZTX1YxOgorCQkJZm10bmFtZSA9ICJ2ZnN2MSI7CisJCQlicmVhazsKKwkJfQorCQlzZXFfcHJpbnRmKHNlcSwgIixqcWZtdD0lcyIsIGZtdG5hbWUpOworCX0KIAogCWlmIChzYmktPnNfcWZfbmFtZXNbVVNSUVVPVEFdKQogCQlzZXFfcHJpbnRmKHNlcSwgIix1c3JqcXVvdGE9JXMiLCBzYmktPnNfcWZfbmFtZXNbVVNSUVVPVEFdKTsKQEAgLTEwODQsOSArMTA5Nyw5IEBACiAJT3B0X2Fib3J0LCBPcHRfZGF0YV9qb3VybmFsLCBPcHRfZGF0YV9vcmRlcmVkLCBPcHRfZGF0YV93cml0ZWJhY2ssCiAJT3B0X2RhdGFfZXJyX2Fib3J0LCBPcHRfZGF0YV9lcnJfaWdub3JlLAogCU9wdF91c3JqcXVvdGEsIE9wdF9ncnBqcXVvdGEsIE9wdF9vZmZ1c3JqcXVvdGEsIE9wdF9vZmZncnBqcXVvdGEsCi0JT3B0X2pxZm10X3Zmc29sZCwgT3B0X2pxZm10X3Zmc3YwLCBPcHRfcXVvdGEsIE9wdF9ub3F1b3RhLAotCU9wdF9pZ25vcmUsIE9wdF9iYXJyaWVyLCBPcHRfbm9iYXJyaWVyLCBPcHRfZXJyLCBPcHRfcmVzaXplLAotCU9wdF91c3JxdW90YSwgT3B0X2dycHF1b3RhLCBPcHRfaV92ZXJzaW9uLAorCU9wdF9qcWZtdF92ZnNvbGQsIE9wdF9qcWZtdF92ZnN2MCwgT3B0X2pxZm10X3Zmc3YxLCBPcHRfcXVvdGEsCisJT3B0X25vcXVvdGEsIE9wdF9pZ25vcmUsIE9wdF9iYXJyaWVyLCBPcHRfbm9iYXJyaWVyLCBPcHRfZXJyLAorCU9wdF9yZXNpemUsIE9wdF91c3JxdW90YSwgT3B0X2dycHF1b3RhLCBPcHRfaV92ZXJzaW9uLAogCU9wdF9zdHJpcGUsIE9wdF9kZWxhbGxvYywgT3B0X25vZGVsYWxsb2MsCiAJT3B0X2Jsb2NrX3ZhbGlkaXR5LCBPcHRfbm9ibG9ja192YWxpZGl0eSwKIAlPcHRfaW5vZGVfcmVhZGFoZWFkX2Jsa3MsIE9wdF9qb3VybmFsX2lvcHJpbywKQEAgLTExMzcsNiArMTE1MCw3IEBACiAJe09wdF9ncnBqcXVvdGEsICJncnBqcXVvdGE9JXMifSwKIAl7T3B0X2pxZm10X3Zmc29sZCwgImpxZm10PXZmc29sZCJ9LAogCXtPcHRfanFmbXRfdmZzdjAsICJqcWZtdD12ZnN2MCJ9LAorCXtPcHRfanFmbXRfdmZzdjEsICJqcWZtdD12ZnN2MSJ9LAogCXtPcHRfZ3JwcXVvdGEsICJncnBxdW90YSJ9LAogCXtPcHRfbm9xdW90YSwgIm5vcXVvdGEifSwKIAl7T3B0X3F1b3RhLCAicXVvdGEifSwKQEAgLTE0MzksNiArMTQ1Myw5IEBACiAJCQlnb3RvIHNldF9xZl9mb3JtYXQ7CiAJCWNhc2UgT3B0X2pxZm10X3Zmc3YwOgogCQkJcWZtdCA9IFFGTVRfVkZTX1YwOworCQkJZ290byBzZXRfcWZfZm9ybWF0OworCQljYXNlIE9wdF9qcWZtdF92ZnN2MToKKwkJCXFmbXQgPSBRRk1UX1ZGU19WMTsKIHNldF9xZl9mb3JtYXQ6CiAJCQlpZiAoc2JfYW55X3F1b3RhX2xvYWRlZChzYikgJiYKIAkJCSAgICBzYmktPnNfanF1b3RhX2ZtdCAhPSBxZm10KSB7CkBAIC0xNDgxLDYgKzE0OTgsNyBAQAogCQljYXNlIE9wdF9vZmZncnBqcXVvdGE6CiAJCWNhc2UgT3B0X2pxZm10X3Zmc29sZDoKIAkJY2FzZSBPcHRfanFmbXRfdmZzdjA6CisJCWNhc2UgT3B0X2pxZm10X3Zmc3YxOgogCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLAogCQkJCSJqb3VybmFsZWQgcXVvdGEgb3B0aW9ucyBub3Qgc3VwcG9ydGVkIik7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL2NvbXByZXNzLmMgYi9mcy9pc29mcy9jb21wcmVzcy5jCmluZGV4IGRlZmI5MzIuLjBiM2ZhNzkgMTAwNjQ0Ci0tLSBhL2ZzL2lzb2ZzL2NvbXByZXNzLmMKKysrIGIvZnMvaXNvZnMvY29tcHJlc3MuYwpAQCAtMzYsNiArMzYsMjYwIEBACiBzdGF0aWMgREVGSU5FX01VVEVYKHppc29mc196bGliX2xvY2spOwogCiAvKgorICogUmVhZCBkYXRhIG9mIEBpbm9kZSBmcm9tIEBibG9ja19zdGFydCB0byBAYmxvY2tfZW5kIGFuZCB1bmNvbXByZXNzCisgKiB0byBvbmUgemlzb2ZzIGJsb2NrLiBTdG9yZSB0aGUgZGF0YSBpbiB0aGUgQHBhZ2VzIGFycmF5IHdpdGggQHBjb3VudAorICogZW50cmllcy4gU3RhcnQgc3RvcmluZyBhdCBvZmZzZXQgQHBvZmZzZXQgb2YgdGhlIGZpcnN0IHBhZ2UuCisgKi8KK3N0YXRpYyBsb2ZmX3Qgemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGJsb2NrX3N0YXJ0LAorCQkJCSAgICAgIGxvZmZfdCBibG9ja19lbmQsIGludCBwY291bnQsCisJCQkJICAgICAgc3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWduZWQgcG9mZnNldCwKKwkJCQkgICAgICBpbnQgKmVycnApCit7CisJdW5zaWduZWQgaW50IHppc29mc19ibG9ja19zaGlmdCA9IElTT0ZTX0koaW5vZGUpLT5pX2Zvcm1hdF9wYXJtWzFdOworCXVuc2lnbmVkIGludCBidWZzaXplID0gSVNPRlNfQlVGRkVSX1NJWkUoaW5vZGUpOworCXVuc2lnbmVkIGludCBidWZzaGlmdCA9IElTT0ZTX0JVRkZFUl9CSVRTKGlub2RlKTsKKwl1bnNpZ25lZCBpbnQgYnVmbWFzayA9IGJ1ZnNpemUgLSAxOworCWludCBpLCBibG9ja19zaXplID0gYmxvY2tfZW5kIC0gYmxvY2tfc3RhcnQ7CisJel9zdHJlYW0gc3RyZWFtID0geyAudG90YWxfb3V0ID0gMCwKKwkJCSAgICAuYXZhaWxfaW4gPSAwLAorCQkJICAgIC5hdmFpbF9vdXQgPSAwLCB9OworCWludCB6ZXJyOworCWludCBuZWVkYmxvY2tzID0gKGJsb2NrX3NpemUgKyAoYmxvY2tfc3RhcnQgJiBidWZtYXNrKSArIGJ1Zm1hc2spCisJCQkJPj4gYnVmc2hpZnQ7CisJaW50IGhhdmVibG9ja3M7CisJYmxrY250X3QgYmxvY2tudW07CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaHNbbmVlZGJsb2NrcyArIDFdOworCWludCBjdXJiaCwgY3VycGFnZTsKKworCWlmIChibG9ja19zaXplID4gZGVmbGF0ZUJvdW5kKDFVTCA8PCB6aXNvZnNfYmxvY2tfc2hpZnQpKSB7CisJCSplcnJwID0gLUVJTzsKKwkJcmV0dXJuIDA7CisJfQorCS8qIEVtcHR5IGJsb2NrPyAqLworCWlmIChibG9ja19zaXplID09IDApIHsKKwkJZm9yICggaSA9IDAgOyBpIDwgcGNvdW50IDsgaSsrICkgeworCQkJaWYgKCFwYWdlc1tpXSkKKwkJCQljb250aW51ZTsKKwkJCW1lbXNldChwYWdlX2FkZHJlc3MocGFnZXNbaV0pLCAwLCBQQUdFX0NBQ0hFX1NJWkUpOworCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZXNbaV0pOworCQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2VzW2ldKTsKKwkJfQorCQlyZXR1cm4gKChsb2ZmX3QpcGNvdW50KSA8PCBQQUdFX0NBQ0hFX1NISUZUOworCX0KKworCS8qIEJlY2F1c2UgemxpYiBpcyBub3QgdGhyZWFkLXNhZmUsIGRvIGFsbCB0aGUgSS9PIGF0IHRoZSB0b3AuICovCisJYmxvY2tudW0gPSBibG9ja19zdGFydCA+PiBidWZzaGlmdDsKKwltZW1zZXQoYmhzLCAwLCAobmVlZGJsb2NrcyArIDEpICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSk7CisJaGF2ZWJsb2NrcyA9IGlzb2ZzX2dldF9ibG9ja3MoaW5vZGUsIGJsb2NrbnVtLCBiaHMsIG5lZWRibG9ja3MpOworCWxsX3J3X2Jsb2NrKFJFQUQsIGhhdmVibG9ja3MsIGJocyk7CisKKwljdXJiaCA9IDA7CisJY3VycGFnZSA9IDA7CisJLyoKKwkgKiBGaXJzdCBibG9jayBpcyBzcGVjaWFsIHNpbmNlIGl0IG1heSBiZSBmcmFjdGlvbmFsLiAgV2UgYWxzbyB3YWl0IGZvcgorCSAqIGl0IGJlZm9yZSBncmFiYmluZyB0aGUgemxpYiBtdXRleDsgb2RkcyBhcmUgdGhhdCB0aGUgc3Vic2VxdWVudAorCSAqIGJsb2NrcyBhcmUgZ29pbmcgdG8gY29tZSBpbiBpbiBzaG9ydCBvcmRlciBzbyB3ZSBkb24ndCBob2xkIHRoZSB6bGliCisJICogbXV0ZXggbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5LgorCSAqLworCisJaWYgKCFiaHNbMF0pCisJCWdvdG8gYl9laW87CisKKwl3YWl0X29uX2J1ZmZlcihiaHNbMF0pOworCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoc1swXSkpIHsKKwkJKmVycnAgPSAtRUlPOworCQlnb3RvIGJfZWlvOworCX0KKworCXN0cmVhbS53b3Jrc3BhY2UgPSB6aXNvZnNfemxpYl93b3Jrc3BhY2U7CisJbXV0ZXhfbG9jaygmemlzb2ZzX3psaWJfbG9jayk7CisJCQorCXplcnIgPSB6bGliX2luZmxhdGVJbml0KCZzdHJlYW0pOworCWlmICh6ZXJyICE9IFpfT0spIHsKKwkJaWYgKHplcnIgPT0gWl9NRU1fRVJST1IpCisJCQkqZXJycCA9IC1FTk9NRU07CisJCWVsc2UKKwkJCSplcnJwID0gLUVJTzsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInppc29mczogemlzb2ZzX2luZmxhdGVJbml0IHJldHVybmVkICVkXG4iLAorCQkJICAgICAgIHplcnIpOworCQlnb3RvIHpfZWlvOworCX0KKworCXdoaWxlIChjdXJwYWdlIDwgcGNvdW50ICYmIGN1cmJoIDwgaGF2ZWJsb2NrcyAmJgorCSAgICAgICB6ZXJyICE9IFpfU1RSRUFNX0VORCkgeworCQlpZiAoIXN0cmVhbS5hdmFpbF9vdXQpIHsKKwkJCWlmIChwYWdlc1tjdXJwYWdlXSkgeworCQkJCXN0cmVhbS5uZXh0X291dCA9IHBhZ2VfYWRkcmVzcyhwYWdlc1tjdXJwYWdlXSkKKwkJCQkJCSsgcG9mZnNldDsKKwkJCQlzdHJlYW0uYXZhaWxfb3V0ID0gUEFHRV9DQUNIRV9TSVpFIC0gcG9mZnNldDsKKwkJCQlwb2Zmc2V0ID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJc3RyZWFtLm5leHRfb3V0ID0gKHZvaWQgKikmemlzb2ZzX3NpbmtfcGFnZTsKKwkJCQlzdHJlYW0uYXZhaWxfb3V0ID0gUEFHRV9DQUNIRV9TSVpFOworCQkJfQorCQl9CisJCWlmICghc3RyZWFtLmF2YWlsX2luKSB7CisJCQl3YWl0X29uX2J1ZmZlcihiaHNbY3VyYmhdKTsKKwkJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoc1tjdXJiaF0pKSB7CisJCQkJKmVycnAgPSAtRUlPOworCQkJCWJyZWFrOworCQkJfQorCQkJc3RyZWFtLm5leHRfaW4gID0gYmhzW2N1cmJoXS0+Yl9kYXRhICsKKwkJCQkJCShibG9ja19zdGFydCAmIGJ1Zm1hc2spOworCQkJc3RyZWFtLmF2YWlsX2luID0gbWluX3QodW5zaWduZWQsIGJ1ZnNpemUgLQorCQkJCQkJKGJsb2NrX3N0YXJ0ICYgYnVmbWFzayksCisJCQkJCQlibG9ja19zaXplKTsKKwkJCWJsb2NrX3NpemUgLT0gc3RyZWFtLmF2YWlsX2luOworCQkJYmxvY2tfc3RhcnQgPSAwOworCQl9CisKKwkJd2hpbGUgKHN0cmVhbS5hdmFpbF9vdXQgJiYgc3RyZWFtLmF2YWlsX2luKSB7CisJCQl6ZXJyID0gemxpYl9pbmZsYXRlKCZzdHJlYW0sIFpfU1lOQ19GTFVTSCk7CisJCQlpZiAoemVyciA9PSBaX0JVRl9FUlJPUiAmJiBzdHJlYW0uYXZhaWxfaW4gPT0gMCkKKwkJCQlicmVhazsKKwkJCWlmICh6ZXJyID09IFpfU1RSRUFNX0VORCkKKwkJCQlicmVhazsKKwkJCWlmICh6ZXJyICE9IFpfT0spIHsKKwkJCQkvKiBFT0YsIGVycm9yLCBvciB0cnlpbmcgdG8gcmVhZCBiZXlvbmQgZW5kIG9mIGlucHV0ICovCisJCQkJaWYgKHplcnIgPT0gWl9NRU1fRVJST1IpCisJCQkJCSplcnJwID0gLUVOT01FTTsKKwkJCQllbHNlIHsKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkJICAgICAgICJ6aXNvZnM6IHppc29mc19pbmZsYXRlIHJldHVybmVkIgorCQkJCQkgICAgICAgIiAlZCwgaW5vZGUgPSAlbHUsIgorCQkJCQkgICAgICAgIiBwYWdlIGlkeCA9ICVkLCBiaCBpZHggPSAlZCwiCisJCQkJCSAgICAgICAiIGF2YWlsX2luID0gJWQsIgorCQkJCQkgICAgICAgIiBhdmFpbF9vdXQgPSAlZFxuIiwKKwkJCQkJICAgICAgIHplcnIsIGlub2RlLT5pX2lubywgY3VycGFnZSwKKwkJCQkJICAgICAgIGN1cmJoLCBzdHJlYW0uYXZhaWxfaW4sCisJCQkJCSAgICAgICBzdHJlYW0uYXZhaWxfb3V0KTsKKwkJCQkJKmVycnAgPSAtRUlPOworCQkJCX0KKwkJCQlnb3RvIGluZmxhdGVfb3V0OworCQkJfQorCQl9CisKKwkJaWYgKCFzdHJlYW0uYXZhaWxfb3V0KSB7CisJCQkvKiBUaGlzIHBhZ2UgY29tcGxldGVkICovCisJCQlpZiAocGFnZXNbY3VycGFnZV0pIHsKKwkJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlc1tjdXJwYWdlXSk7CisJCQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2VzW2N1cnBhZ2VdKTsKKwkJCX0KKwkJCWN1cnBhZ2UrKzsKKwkJfQorCQlpZiAoIXN0cmVhbS5hdmFpbF9pbikKKwkJCWN1cmJoKys7CisJfQoraW5mbGF0ZV9vdXQ6CisJemxpYl9pbmZsYXRlRW5kKCZzdHJlYW0pOworCit6X2VpbzoKKwltdXRleF91bmxvY2soJnppc29mc196bGliX2xvY2spOworCitiX2VpbzoKKwlmb3IgKGkgPSAwOyBpIDwgaGF2ZWJsb2NrczsgaSsrKQorCQlicmVsc2UoYmhzW2ldKTsKKwlyZXR1cm4gc3RyZWFtLnRvdGFsX291dDsKK30KKworLyoKKyAqIFVuY29tcHJlc3MgZGF0YSBzbyB0aGF0IHBhZ2VzW2Z1bGxfcGFnZV0gaXMgZnVsbHkgdXB0b2RhdGUgYW5kIHBvc3NpYmx5CisgKiBmaWxscyBpbiBvdGhlciBwYWdlcyBpZiB3ZSBoYXZlIGRhdGEgZm9yIHRoZW0uCisgKi8KK3N0YXRpYyBpbnQgemlzb2ZzX2ZpbGxfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZ1bGxfcGFnZSwgaW50IHBjb3VudCwKKwkJCSAgICAgc3RydWN0IHBhZ2UgKipwYWdlcykKK3sKKwlsb2ZmX3Qgc3RhcnRfb2ZmLCBlbmRfb2ZmOworCWxvZmZfdCBibG9ja19zdGFydCwgYmxvY2tfZW5kOworCXVuc2lnbmVkIGludCBoZWFkZXJfc2l6ZSA9IElTT0ZTX0koaW5vZGUpLT5pX2Zvcm1hdF9wYXJtWzBdOworCXVuc2lnbmVkIGludCB6aXNvZnNfYmxvY2tfc2hpZnQgPSBJU09GU19JKGlub2RlKS0+aV9mb3JtYXRfcGFybVsxXTsKKwl1bnNpZ25lZCBpbnQgYmxvY2twdHI7CisJbG9mZl90IHBvZmZzZXQgPSAwOworCWJsa2NudF90IGNzdGFydF9ibG9jaywgY2VuZF9ibG9jazsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXVuc2lnbmVkIGludCBibGtiaXRzID0gSVNPRlNfQlVGRkVSX0JJVFMoaW5vZGUpOworCXVuc2lnbmVkIGludCBibGtzaXplID0gMSA8PCBibGtiaXRzOworCWludCBlcnI7CisJbG9mZl90IHJldDsKKworCUJVR19PTighcGFnZXNbZnVsbF9wYWdlXSk7CisKKwkvKgorCSAqIFdlIHdhbnQgdG8gcmVhZCBhdCBsZWFzdCAnZnVsbF9wYWdlJyBwYWdlLiBCZWNhdXNlIHdlIGhhdmUgdG8KKwkgKiB1bmNvbXByZXNzIHRoZSB3aG9sZSBjb21wcmVzc2lvbiBibG9jayBhbnl3YXksIGZpbGwgdGhlIHN1cnJvdW5kaW5nCisJICogcGFnZXMgd2l0aCB0aGUgZGF0YSB3ZSBoYXZlIGFueXdheS4uLgorCSAqLworCXN0YXJ0X29mZiA9IHBhZ2Vfb2Zmc2V0KHBhZ2VzW2Z1bGxfcGFnZV0pOworCWVuZF9vZmYgPSBtaW5fdChsb2ZmX3QsIHN0YXJ0X29mZiArIFBBR0VfQ0FDSEVfU0laRSwgaW5vZGUtPmlfc2l6ZSk7CisKKwljc3RhcnRfYmxvY2sgPSBzdGFydF9vZmYgPj4gemlzb2ZzX2Jsb2NrX3NoaWZ0OworCWNlbmRfYmxvY2sgPSAoZW5kX29mZiArICgxIDw8IHppc29mc19ibG9ja19zaGlmdCkgLSAxKQorCQkJPj4gemlzb2ZzX2Jsb2NrX3NoaWZ0OworCisJV0FSTl9PTihzdGFydF9vZmYgLSAoZnVsbF9wYWdlIDw8IFBBR0VfQ0FDSEVfU0hJRlQpICE9CisJCSgoY3N0YXJ0X2Jsb2NrIDw8IHppc29mc19ibG9ja19zaGlmdCkgJiBQQUdFX0NBQ0hFX01BU0spKTsKKworCS8qIEZpbmQgdGhlIHBvaW50ZXIgdG8gdGhpcyBzcGVjaWZpYyBjaHVuayAqLworCS8qIE5vdGU6IHdlJ3JlIG5vdCB1c2luZyBpc29udW1fNzMxKCkgaGVyZSBiZWNhdXNlIHRoZSBkYXRhIGlzIGtub3duIGFsaWduZWQgKi8KKwkvKiBOb3RlOiBoZWFkZXJfc2l6ZSBpcyBpbiAzMi1iaXQgd29yZHMgKDQgYnl0ZXMpICovCisJYmxvY2twdHIgPSAoaGVhZGVyX3NpemUgKyBjc3RhcnRfYmxvY2spIDw8IDI7CisJYmggPSBpc29mc19icmVhZChpbm9kZSwgYmxvY2twdHIgPj4gYmxrYml0cyk7CisJaWYgKCFiaCkKKwkJcmV0dXJuIC1FSU87CisJYmxvY2tfc3RhcnQgPSBsZTMyX3RvX2NwdSgqKF9fbGUzMiAqKQorCQkJCShiaC0+Yl9kYXRhICsgKGJsb2NrcHRyICYgKGJsa3NpemUgLSAxKSkpKTsKKworCXdoaWxlIChjc3RhcnRfYmxvY2sgPCBjZW5kX2Jsb2NrICYmIHBjb3VudCA+IDApIHsKKwkJLyogTG9hZCBlbmQgb2YgdGhlIGNvbXByZXNzZWQgYmxvY2sgaW4gdGhlIGZpbGUgKi8KKwkJYmxvY2twdHIgKz0gNDsKKwkJLyogVHJhdmVyc2VkIHRvIG5leHQgYmxvY2s/ICovCisJCWlmICghKGJsb2NrcHRyICYgKGJsa3NpemUgLSAxKSkpIHsKKwkJCWJyZWxzZShiaCk7CisKKwkJCWJoID0gaXNvZnNfYnJlYWQoaW5vZGUsIGJsb2NrcHRyID4+IGJsa2JpdHMpOworCQkJaWYgKCFiaCkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlibG9ja19lbmQgPSBsZTMyX3RvX2NwdSgqKF9fbGUzMiAqKQorCQkJCShiaC0+Yl9kYXRhICsgKGJsb2NrcHRyICYgKGJsa3NpemUgLSAxKSkpKTsKKwkJaWYgKGJsb2NrX3N0YXJ0ID4gYmxvY2tfZW5kKSB7CisJCQlicmVsc2UoYmgpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJZXJyID0gMDsKKwkJcmV0ID0gemlzb2ZzX3VuY29tcHJlc3NfYmxvY2soaW5vZGUsIGJsb2NrX3N0YXJ0LCBibG9ja19lbmQsCisJCQkJCSAgICAgIHBjb3VudCwgcGFnZXMsIHBvZmZzZXQsICZlcnIpOworCQlwb2Zmc2V0ICs9IHJldDsKKwkJcGFnZXMgKz0gcG9mZnNldCA+PiBQQUdFX0NBQ0hFX1NISUZUOworCQlwY291bnQgLT0gcG9mZnNldCA+PiBQQUdFX0NBQ0hFX1NISUZUOworCQlmdWxsX3BhZ2UgLT0gcG9mZnNldCA+PiBQQUdFX0NBQ0hFX1NISUZUOworCQlwb2Zmc2V0ICY9IH5QQUdFX0NBQ0hFX01BU0s7CisKKwkJaWYgKGVycikgeworCQkJYnJlbHNlKGJoKTsKKwkJCS8qCisJCQkgKiBEaWQgd2UgZmluaXNoIHJlYWRpbmcgdGhlIHBhZ2Ugd2UgcmVhbGx5IHdhbnRlZAorCQkJICogdG8gcmVhZD8KKwkJCSAqLworCQkJaWYgKGZ1bGxfcGFnZSA8IDApCisJCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJYmxvY2tfc3RhcnQgPSBibG9ja19lbmQ7CisJCWNzdGFydF9ibG9jaysrOworCX0KKworCWlmIChwb2Zmc2V0ICYmICpwYWdlcykgeworCQltZW1zZXQocGFnZV9hZGRyZXNzKCpwYWdlcykgKyBwb2Zmc2V0LCAwLAorCQkgICAgICAgUEFHRV9DQUNIRV9TSVpFIC0gcG9mZnNldCk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKCpwYWdlcyk7CisJCVNldFBhZ2VVcHRvZGF0ZSgqcGFnZXMpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKICAqIFdoZW4gZGVjb21wcmVzc2luZywgd2UgdHlwaWNhbGx5IG9idGFpbiBtb3JlIHRoYW4gb25lIHBhZ2UKICAqIHBlciByZWZlcmVuY2UuICBXZSBpbmplY3QgdGhlIGFkZGl0aW9uYWwgcGFnZXMgaW50byB0aGUgcGFnZQogICogY2FjaGUgYXMgYSBmb3JtIG9mIHJlYWRhaGVhZC4KQEAgLTQ0LDI3OCArMjk4LDYxIEBACiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOwotCXVuc2lnbmVkIGludCBtYXhwYWdlLCB4cGFnZSwgZnBhZ2UsIGJsb2NraW5kZXg7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBibG9ja3B0ciwgYmxvY2tlbmRwdHIsIGNzdGFydCwgY2VuZCwgY3NpemU7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKnB0cmJoWzJdOwotCXVuc2lnbmVkIGxvbmcgYnVmc2l6ZSA9IElTT0ZTX0JVRkZFUl9TSVpFKGlub2RlKTsKLQl1bnNpZ25lZCBpbnQgYnVmc2hpZnQgPSBJU09GU19CVUZGRVJfQklUUyhpbm9kZSk7Ci0JdW5zaWduZWQgbG9uZyBidWZtYXNrICA9IGJ1ZnNpemUgLSAxOwotCWludCBlcnIgPSAtRUlPOwotCWludCBpOwotCXVuc2lnbmVkIGludCBoZWFkZXJfc2l6ZSA9IElTT0ZTX0koaW5vZGUpLT5pX2Zvcm1hdF9wYXJtWzBdOworCWludCBlcnI7CisJaW50IGksIHBjb3VudCwgZnVsbF9wYWdlOwogCXVuc2lnbmVkIGludCB6aXNvZnNfYmxvY2tfc2hpZnQgPSBJU09GU19JKGlub2RlKS0+aV9mb3JtYXRfcGFybVsxXTsKLQkvKiB1bnNpZ25lZCBsb25nIHppc29mc19ibG9ja19zaXplID0gMVVMIDw8IHppc29mc19ibG9ja19zaGlmdDsgKi8KLQl1bnNpZ25lZCBpbnQgemlzb2ZzX2Jsb2NrX3BhZ2Vfc2hpZnQgPSB6aXNvZnNfYmxvY2tfc2hpZnQtUEFHRV9DQUNIRV9TSElGVDsKLQl1bnNpZ25lZCBsb25nIHppc29mc19ibG9ja19wYWdlcyA9IDFVTCA8PCB6aXNvZnNfYmxvY2tfcGFnZV9zaGlmdDsKLQl1bnNpZ25lZCBsb25nIHppc29mc19ibG9ja19wYWdlX21hc2sgPSB6aXNvZnNfYmxvY2tfcGFnZXMtMTsKLQlzdHJ1Y3QgcGFnZSAqcGFnZXNbemlzb2ZzX2Jsb2NrX3BhZ2VzXTsKLQl1bnNpZ25lZCBsb25nIGluZGV4ID0gcGFnZS0+aW5kZXg7Ci0JaW50IGluZGV4YmxvY2tzOworCXVuc2lnbmVkIGludCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jayA9CisJCVBBR0VfQ0FDSEVfU0hJRlQgPD0gemlzb2ZzX2Jsb2NrX3NoaWZ0ID8KKwkJKDEgPDwgKHppc29mc19ibG9ja19zaGlmdCAtIFBBR0VfQ0FDSEVfU0hJRlQpKSA6IDA7CisJc3RydWN0IHBhZ2UgKnBhZ2VzW21heF90KHVuc2lnbmVkLCB6aXNvZnNfcGFnZXNfcGVyX2NibG9jaywgMSldOworCXBnb2ZmX3QgaW5kZXggPSBwYWdlLT5pbmRleCwgZW5kX2luZGV4OwogCi0JLyogV2UgaGF2ZSBhbHJlYWR5IGJlZW4gZ2l2ZW4gb25lIHBhZ2UsIHRoaXMgaXMgdGhlIG9uZQotCSAgIHdlIG11c3QgZG8uICovCi0JeHBhZ2UgPSBpbmRleCAmIHppc29mc19ibG9ja19wYWdlX21hc2s7Ci0JcGFnZXNbeHBhZ2VdID0gcGFnZTsKLSAKLQkvKiBUaGUgcmVtYWluaW5nIHBhZ2VzIG5lZWQgdG8gYmUgYWxsb2NhdGVkIGFuZCBpbnNlcnRlZCAqLwotCW9mZnNldCA9IGluZGV4ICYgfnppc29mc19ibG9ja19wYWdlX21hc2s7Ci0JYmxvY2tpbmRleCA9IG9mZnNldCA+PiB6aXNvZnNfYmxvY2tfcGFnZV9zaGlmdDsKLQltYXhwYWdlID0gKGlub2RlLT5pX3NpemUgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOwotCisJZW5kX2luZGV4ID0gKGlub2RlLT5pX3NpemUgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCS8qCiAJICogSWYgdGhpcyBwYWdlIGlzIHdob2xseSBvdXRzaWRlIGlfc2l6ZSB3ZSBqdXN0IHJldHVybiB6ZXJvOwogCSAqIGRvX2dlbmVyaWNfZmlsZV9yZWFkKCkgd2lsbCBoYW5kbGUgdGhpcyBmb3IgdXMKIAkgKi8KLQlpZiAocGFnZS0+aW5kZXggPj0gbWF4cGFnZSkgeworCWlmIChpbmRleCA+PSBlbmRfaW5kZXgpIHsKIAkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwogCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JbWF4cGFnZSA9IG1pbih6aXNvZnNfYmxvY2tfcGFnZXMsIG1heHBhZ2Utb2Zmc2V0KTsKLQotCWZvciAoIGkgPSAwIDsgaSA8IG1heHBhZ2UgOyBpKyssIG9mZnNldCsrICkgewotCQlpZiAoIGkgIT0geHBhZ2UgKSB7Ci0JCQlwYWdlc1tpXSA9IGdyYWJfY2FjaGVfcGFnZV9ub3dhaXQobWFwcGluZywgb2Zmc2V0KTsKLQkJfQotCQlwYWdlID0gcGFnZXNbaV07Ci0JCWlmICggcGFnZSApIHsKLQkJCUNsZWFyUGFnZUVycm9yKHBhZ2UpOwotCQkJa21hcChwYWdlKTsKLQkJfQotCX0KLQotCS8qIFRoaXMgaXMgdGhlIGxhc3QgcGFnZSBmaWxsZWQsIHBsdXMgb25lOyB1c2VkIGluIGNhc2Ugb2YgYWJvcnQuICovCi0JZnBhZ2UgPSAwOwotCi0JLyogRmluZCB0aGUgcG9pbnRlciB0byB0aGlzIHNwZWNpZmljIGNodW5rICovCi0JLyogTm90ZTogd2UncmUgbm90IHVzaW5nIGlzb251bV83MzEoKSBoZXJlIGJlY2F1c2UgdGhlIGRhdGEgaXMga25vd24gYWxpZ25lZCAqLwotCS8qIE5vdGU6IGhlYWRlcl9zaXplIGlzIGluIDMyLWJpdCB3b3JkcyAoNCBieXRlcykgKi8KLQlibG9ja3B0ciA9IChoZWFkZXJfc2l6ZSArIGJsb2NraW5kZXgpIDw8IDI7Ci0JYmxvY2tlbmRwdHIgPSBibG9ja3B0ciArIDQ7Ci0KLQlpbmRleGJsb2NrcyA9ICgoYmxvY2twdHJeYmxvY2tlbmRwdHIpID4+IGJ1ZnNoaWZ0KSA/IDIgOiAxOwotCXB0cmJoWzBdID0gcHRyYmhbMV0gPSBOVUxMOwotCi0JaWYgKCBpc29mc19nZXRfYmxvY2tzKGlub2RlLCBibG9ja3B0ciA+PiBidWZzaGlmdCwgcHRyYmgsIGluZGV4YmxvY2tzKSAhPSBpbmRleGJsb2NrcyApIHsKLQkJaWYgKCBwdHJiaFswXSApIGJyZWxzZShwdHJiaFswXSk7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJ6aXNvZnM6IE51bGwgYnVmZmVyIG9uIHJlYWRpbmcgYmxvY2sgdGFibGUsIGlub2RlID0gJWx1LCBibG9jayA9ICVsdVxuIiwKLQkJICAgICAgIGlub2RlLT5pX2lubywgYmxvY2twdHIgPj4gYnVmc2hpZnQpOwotCQlnb3RvIGVpbzsKLQl9Ci0JbGxfcndfYmxvY2soUkVBRCwgaW5kZXhibG9ja3MsIHB0cmJoKTsKLQotCWJoID0gcHRyYmhbMF07Ci0JaWYgKCAhYmggfHwgKHdhaXRfb25fYnVmZmVyKGJoKSwgIWJ1ZmZlcl91cHRvZGF0ZShiaCkpICkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiemlzb2ZzOiBGYWlsZWQgdG8gcmVhZCBibG9jayB0YWJsZSwgaW5vZGUgPSAlbHUsIGJsb2NrID0gJWx1XG4iLAotCQkgICAgICAgaW5vZGUtPmlfaW5vLCBibG9ja3B0ciA+PiBidWZzaGlmdCk7Ci0JCWlmICggcHRyYmhbMV0gKQotCQkJYnJlbHNlKHB0cmJoWzFdKTsKLQkJZ290byBlaW87Ci0JfQotCWNzdGFydCA9IGxlMzJfdG9fY3B1KCooX19sZTMyICopKGJoLT5iX2RhdGEgKyAoYmxvY2twdHIgJiBidWZtYXNrKSkpOwotCi0JaWYgKCBpbmRleGJsb2NrcyA9PSAyICkgewotCQkvKiBXZSBqdXN0IGNyb3NzZWQgYSBibG9jayBib3VuZGFyeS4gIFN3aXRjaCB0byB0aGUgbmV4dCBibG9jayAqLwotCQlicmVsc2UoYmgpOwotCQliaCA9IHB0cmJoWzFdOwotCQlpZiAoICFiaCB8fCAod2FpdF9vbl9idWZmZXIoYmgpLCAhYnVmZmVyX3VwdG9kYXRlKGJoKSkgKSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiemlzb2ZzOiBGYWlsZWQgdG8gcmVhZCBibG9jayB0YWJsZSwgaW5vZGUgPSAlbHUsIGJsb2NrID0gJWx1XG4iLAotCQkJICAgICAgIGlub2RlLT5pX2lubywgYmxvY2tlbmRwdHIgPj4gYnVmc2hpZnQpOwotCQkJZ290byBlaW87Ci0JCX0KLQl9Ci0JY2VuZCA9IGxlMzJfdG9fY3B1KCooX19sZTMyICopKGJoLT5iX2RhdGEgKyAoYmxvY2tlbmRwdHIgJiBidWZtYXNrKSkpOwotCWJyZWxzZShiaCk7Ci0KLQlpZiAoY3N0YXJ0ID4gY2VuZCkKLQkJZ290byBlaW87Ci0JCQotCWNzaXplID0gY2VuZC1jc3RhcnQ7Ci0KLQlpZiAoY3NpemUgPiBkZWZsYXRlQm91bmQoMVVMIDw8IHppc29mc19ibG9ja19zaGlmdCkpCi0JCWdvdG8gZWlvOwotCi0JLyogTm93IHBhZ2VbXSBjb250YWlucyBhbiBhcnJheSBvZiBwYWdlcywgYW55IG9mIHdoaWNoIGNhbiBiZSBOVUxMLAotCSAgIGFuZCB0aGUgbG9ja3Mgb24gd2hpY2ggd2UgaG9sZC4gIFdlIHNob3VsZCBub3cgcmVhZCB0aGUgZGF0YSBhbmQKLQkgICByZWxlYXNlIHRoZSBwYWdlcy4gIElmIHRoZSBwYWdlcyBhcmUgTlVMTCB0aGUgZGVjb21wcmVzc2VkIGRhdGEKLQkgICBmb3IgdGhhdCBwYXJ0aWN1bGFyIHBhZ2Ugc2hvdWxkIGJlIGRpc2NhcmRlZC4gKi8KLQkKLQlpZiAoIGNzaXplID09IDAgKSB7Ci0JCS8qIFRoaXMgZGF0YSBibG9jayBpcyBlbXB0eS4gKi8KLQotCQlmb3IgKCBmcGFnZSA9IDAgOyBmcGFnZSA8IG1heHBhZ2UgOyBmcGFnZSsrICkgewotCQkJaWYgKCAocGFnZSA9IHBhZ2VzW2ZwYWdlXSkgIT0gTlVMTCApIHsKLQkJCQltZW1zZXQocGFnZV9hZGRyZXNzKHBhZ2UpLCAwLCBQQUdFX0NBQ0hFX1NJWkUpOwotCQkJCQotCQkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwotCQkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKLQkJCQlrdW5tYXAocGFnZSk7Ci0JCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCQkJaWYgKCBmcGFnZSA9PSB4cGFnZSApCi0JCQkJCWVyciA9IDA7IC8qIFRoZSBjcml0aWNhbCBwYWdlICovCi0JCQkJZWxzZQotCQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCQl9Ci0JCX0KKwlpZiAoUEFHRV9DQUNIRV9TSElGVCA8PSB6aXNvZnNfYmxvY2tfc2hpZnQpIHsKKwkJLyogV2UgaGF2ZSBhbHJlYWR5IGJlZW4gZ2l2ZW4gb25lIHBhZ2UsIHRoaXMgaXMgdGhlIG9uZQorCQkgICB3ZSBtdXN0IGRvLiAqLworCQlmdWxsX3BhZ2UgPSBpbmRleCAmICh6aXNvZnNfcGFnZXNfcGVyX2NibG9jayAtIDEpOworCQlwY291bnQgPSBtaW5fdChpbnQsIHppc29mc19wYWdlc19wZXJfY2Jsb2NrLAorCQkJZW5kX2luZGV4IC0gKGluZGV4ICYgfih6aXNvZnNfcGFnZXNfcGVyX2NibG9jayAtIDEpKSk7CisJCWluZGV4IC09IGZ1bGxfcGFnZTsKIAl9IGVsc2UgewotCQkvKiBUaGlzIGRhdGEgYmxvY2sgaXMgY29tcHJlc3NlZC4gKi8KLQkJel9zdHJlYW0gc3RyZWFtOwotCQlpbnQgYmFpbCA9IDAsIGxlZnRfb3V0ID0gLTE7Ci0JCWludCB6ZXJyOwotCQlpbnQgbmVlZGJsb2NrcyA9IChjc2l6ZSArIChjc3RhcnQgJiBidWZtYXNrKSArIGJ1Zm1hc2spID4+IGJ1ZnNoaWZ0OwotCQlpbnQgaGF2ZWJsb2NrczsKLQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaHNbbmVlZGJsb2NrcysxXTsKLQkJc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhwdHI7CisJCWZ1bGxfcGFnZSA9IDA7CisJCXBjb3VudCA9IDE7CisJfQorCXBhZ2VzW2Z1bGxfcGFnZV0gPSBwYWdlOwogCi0JCS8qIEJlY2F1c2UgemxpYiBpcyBub3QgdGhyZWFkLXNhZmUsIGRvIGFsbCB0aGUgSS9PIGF0IHRoZSB0b3AuICovCi0KLQkJYmxvY2twdHIgPSBjc3RhcnQgPj4gYnVmc2hpZnQ7Ci0JCW1lbXNldChiaHMsIDAsIChuZWVkYmxvY2tzKzEpKnNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKikpOwotCQloYXZlYmxvY2tzID0gaXNvZnNfZ2V0X2Jsb2Nrcyhpbm9kZSwgYmxvY2twdHIsIGJocywgbmVlZGJsb2Nrcyk7Ci0JCWxsX3J3X2Jsb2NrKFJFQUQsIGhhdmVibG9ja3MsIGJocyk7Ci0KLQkJYmhwdHIgPSAmYmhzWzBdOwotCQliaCA9ICpiaHB0cisrOwotCi0JCS8qIEZpcnN0IGJsb2NrIGlzIHNwZWNpYWwgc2luY2UgaXQgbWF5IGJlIGZyYWN0aW9uYWwuCi0JCSAgIFdlIGFsc28gd2FpdCBmb3IgaXQgYmVmb3JlIGdyYWJiaW5nIHRoZSB6bGliCi0JCSAgIG11dGV4OyBvZGRzIGFyZSB0aGF0IHRoZSBzdWJzZXF1ZW50IGJsb2NrcyBhcmUKLQkJICAgZ29pbmcgdG8gY29tZSBpbiBpbiBzaG9ydCBvcmRlciBzbyB3ZSBkb24ndCBob2xkCi0JCSAgIHRoZSB6bGliIG11dGV4IGxvbmdlciB0aGFuIG5lY2Vzc2FyeS4gKi8KLQotCQlpZiAoICFiaCB8fCAod2FpdF9vbl9idWZmZXIoYmgpLCAhYnVmZmVyX3VwdG9kYXRlKGJoKSkgKSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiemlzb2ZzOiBIaXQgbnVsbCBidWZmZXIsIGZwYWdlID0gJWQsIHhwYWdlID0gJWQsIGNzaXplID0gJWxkXG4iLAotCQkJICAgICAgIGZwYWdlLCB4cGFnZSwgY3NpemUpOwotCQkJZ290byBiX2VpbzsKLQkJfQotCQlzdHJlYW0ubmV4dF9pbiAgPSBiaC0+Yl9kYXRhICsgKGNzdGFydCAmIGJ1Zm1hc2spOwotCQlzdHJlYW0uYXZhaWxfaW4gPSBtaW4oYnVmc2l6ZS0oY3N0YXJ0ICYgYnVmbWFzayksIGNzaXplKTsKLQkJY3NpemUgLT0gc3RyZWFtLmF2YWlsX2luOwotCi0JCXN0cmVhbS53b3Jrc3BhY2UgPSB6aXNvZnNfemxpYl93b3Jrc3BhY2U7Ci0JCW11dGV4X2xvY2soJnppc29mc196bGliX2xvY2spOwotCQkKLQkJemVyciA9IHpsaWJfaW5mbGF0ZUluaXQoJnN0cmVhbSk7Ci0JCWlmICggemVyciAhPSBaX09LICkgewotCQkJaWYgKCBlcnIgJiYgemVyciA9PSBaX01FTV9FUlJPUiApCi0JCQkJZXJyID0gLUVOT01FTTsKLQkJCXByaW50ayhLRVJOX0RFQlVHICJ6aXNvZnM6IHppc29mc19pbmZsYXRlSW5pdCByZXR1cm5lZCAlZFxuIiwKLQkJCSAgICAgICB6ZXJyKTsKLQkJCWdvdG8gel9laW87Ci0JCX0KLQotCQl3aGlsZSAoICFiYWlsICYmIGZwYWdlIDwgbWF4cGFnZSApIHsKLQkJCXBhZ2UgPSBwYWdlc1tmcGFnZV07Ci0JCQlpZiAoIHBhZ2UgKQotCQkJCXN0cmVhbS5uZXh0X291dCA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKLQkJCWVsc2UKLQkJCQlzdHJlYW0ubmV4dF9vdXQgPSAodm9pZCAqKSZ6aXNvZnNfc2lua19wYWdlOwotCQkJc3RyZWFtLmF2YWlsX291dCA9IFBBR0VfQ0FDSEVfU0laRTsKLQotCQkJd2hpbGUgKCBzdHJlYW0uYXZhaWxfb3V0ICkgewotCQkJCWludCBhbywgYWk7Ci0JCQkJaWYgKCBzdHJlYW0uYXZhaWxfaW4gPT0gMCAmJiBsZWZ0X291dCApIHsKLQkJCQkJaWYgKCAhY3NpemUgKSB7Ci0JCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ6aXNvZnM6IFpGIHJlYWQgYmV5b25kIGVuZCBvZiBpbnB1dFxuIik7Ci0JCQkJCQliYWlsID0gMTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYmggPSAqYmhwdHIrKzsKLQkJCQkJCWlmICggIWJoIHx8Ci0JCQkJCQkgICAgICh3YWl0X29uX2J1ZmZlcihiaCksICFidWZmZXJfdXB0b2RhdGUoYmgpKSApIHsKLQkJCQkJCQkvKiBSZWFjaGVkIGFuIEVJTyAqLwotIAkJCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiemlzb2ZzOiBIaXQgbnVsbCBidWZmZXIsIGZwYWdlID0gJWQsIHhwYWdlID0gJWQsIGNzaXplID0gJWxkXG4iLAotCQkJCQkJCSAgICAgICBmcGFnZSwgeHBhZ2UsIGNzaXplKTsKLQkJCQkJCQkgICAgICAgCi0JCQkJCQkJYmFpbCA9IDE7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlzdHJlYW0ubmV4dF9pbiA9IGJoLT5iX2RhdGE7Ci0JCQkJCQlzdHJlYW0uYXZhaWxfaW4gPSBtaW4oY3NpemUsYnVmc2l6ZSk7Ci0JCQkJCQljc2l6ZSAtPSBzdHJlYW0uYXZhaWxfaW47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYW8gPSBzdHJlYW0uYXZhaWxfb3V0OyAgYWkgPSBzdHJlYW0uYXZhaWxfaW47Ci0JCQkJemVyciA9IHpsaWJfaW5mbGF0ZSgmc3RyZWFtLCBaX1NZTkNfRkxVU0gpOwotCQkJCWxlZnRfb3V0ID0gc3RyZWFtLmF2YWlsX291dDsKLQkJCQlpZiAoIHplcnIgPT0gWl9CVUZfRVJST1IgJiYgc3RyZWFtLmF2YWlsX2luID09IDAgKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoIHplcnIgIT0gWl9PSyApIHsKLQkJCQkJLyogRU9GLCBlcnJvciwgb3IgdHJ5aW5nIHRvIHJlYWQgYmV5b25kIGVuZCBvZiBpbnB1dCAqLwotCQkJCQlpZiAoIGVyciAmJiB6ZXJyID09IFpfTUVNX0VSUk9SICkKLQkJCQkJCWVyciA9IC1FTk9NRU07Ci0JCQkJCWlmICggemVyciAhPSBaX1NUUkVBTV9FTkQgKQotCQkJCQkJcHJpbnRrKEtFUk5fREVCVUcgInppc29mczogemlzb2ZzX2luZmxhdGUgcmV0dXJuZWQgJWQsIGlub2RlID0gJWx1LCBpbmRleCA9ICVsdSwgZnBhZ2UgPSAlZCwgeHBhZ2UgPSAlZCwgYXZhaWxfaW4gPSAlZCwgYXZhaWxfb3V0ID0gJWQsIGFpID0gJWQsIGFvID0gJWRcbiIsCi0JCQkJCQkgICAgICAgemVyciwgaW5vZGUtPmlfaW5vLCBpbmRleCwKLQkJCQkJCSAgICAgICBmcGFnZSwgeHBhZ2UsCi0JCQkJCQkgICAgICAgc3RyZWFtLmF2YWlsX2luLCBzdHJlYW0uYXZhaWxfb3V0LAotCQkJCQkJICAgICAgIGFpLCBhbyk7Ci0JCQkJCWJhaWwgPSAxOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICggc3RyZWFtLmF2YWlsX291dCAmJiB6ZXJyID09IFpfU1RSRUFNX0VORCApIHsKLQkJCQkvKiBGcmFjdGlvbmFsIHBhZ2Ugd3JpdHRlbiBiZWZvcmUgRU9GLiAgVGhpcyBtYXkKLQkJCQkgICBiZSB0aGUgbGFzdCBwYWdlIGluIHRoZSBmaWxlLiAqLwotCQkJCW1lbXNldChzdHJlYW0ubmV4dF9vdXQsIDAsIHN0cmVhbS5hdmFpbF9vdXQpOwotCQkJCXN0cmVhbS5hdmFpbF9vdXQgPSAwOwotCQkJfQotCi0JCQlpZiAoICFzdHJlYW0uYXZhaWxfb3V0ICkgewotCQkJCS8qIFRoaXMgcGFnZSBjb21wbGV0ZWQgKi8KLQkJCQlpZiAoIHBhZ2UgKSB7Ci0JCQkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwotCQkJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7Ci0JCQkJCWt1bm1hcChwYWdlKTsKLQkJCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCQkJCWlmICggZnBhZ2UgPT0geHBhZ2UgKQotCQkJCQkJZXJyID0gMDsgLyogVGhlIGNyaXRpY2FsIHBhZ2UgKi8KLQkJCQkJZWxzZQotCQkJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQkJCX0KLQkJCQlmcGFnZSsrOwotCQkJfQotCQl9Ci0JCXpsaWJfaW5mbGF0ZUVuZCgmc3RyZWFtKTsKLQotCXpfZWlvOgotCQltdXRleF91bmxvY2soJnppc29mc196bGliX2xvY2spOwotCi0JYl9laW86Ci0JCWZvciAoIGkgPSAwIDsgaSA8IGhhdmVibG9ja3MgOyBpKysgKSB7Ci0JCQlpZiAoIGJoc1tpXSApCi0JCQkJYnJlbHNlKGJoc1tpXSk7CisJZm9yIChpID0gMDsgaSA8IHBjb3VudDsgaSsrLCBpbmRleCsrKSB7CisJCWlmIChpICE9IGZ1bGxfcGFnZSkKKwkJCXBhZ2VzW2ldID0gZ3JhYl9jYWNoZV9wYWdlX25vd2FpdChtYXBwaW5nLCBpbmRleCk7CisJCWlmIChwYWdlc1tpXSkgeworCQkJQ2xlYXJQYWdlRXJyb3IocGFnZXNbaV0pOworCQkJa21hcChwYWdlc1tpXSk7CiAJCX0KIAl9CiAKLWVpbzoKKwllcnIgPSB6aXNvZnNfZmlsbF9wYWdlcyhpbm9kZSwgZnVsbF9wYWdlLCBwY291bnQsIHBhZ2VzKTsKIAogCS8qIFJlbGVhc2UgYW55IHJlc2lkdWFsIHBhZ2VzLCBkbyBub3QgU2V0UGFnZVVwdG9kYXRlICovCi0Jd2hpbGUgKCBmcGFnZSA8IG1heHBhZ2UgKSB7Ci0JCXBhZ2UgPSBwYWdlc1tmcGFnZV07Ci0JCWlmICggcGFnZSApIHsKLQkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwotCQkJaWYgKCBmcGFnZSA9PSB4cGFnZSApCi0JCQkJU2V0UGFnZUVycm9yKHBhZ2UpOwotCQkJa3VubWFwKHBhZ2UpOwotCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCQlpZiAoIGZwYWdlICE9IHhwYWdlICkKLQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJZm9yIChpID0gMDsgaSA8IHBjb3VudDsgaSsrKSB7CisJCWlmIChwYWdlc1tpXSkgeworCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZXNbaV0pOworCQkJaWYgKGkgPT0gZnVsbF9wYWdlICYmIGVycikKKwkJCQlTZXRQYWdlRXJyb3IocGFnZXNbaV0pOworCQkJa3VubWFwKHBhZ2VzW2ldKTsKKwkJCXVubG9ja19wYWdlKHBhZ2VzW2ldKTsKKwkJCWlmIChpICE9IGZ1bGxfcGFnZSkKKwkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZXNbaV0pOwogCQl9Ci0JCWZwYWdlKys7CiAJfQkJCQogCiAJLyogQXQgdGhpcyBwb2ludCwgZXJyIGNvbnRhaW5zIDAgb3IgLUVJTyBkZXBlbmRpbmcgb24gdGhlICJjcml0aWNhbCIgcGFnZSAqLwpkaWZmIC0tZ2l0IGEvZnMvaXNvZnMvcm9jay5jIGIvZnMvaXNvZnMvcm9jay5jCmluZGV4IGMyZmIyZGQuLjk2YTY4NWMgMTAwNjQ0Ci0tLSBhL2ZzL2lzb2ZzL3JvY2suYworKysgYi9mcy9pc29mcy9yb2NrLmMKQEAgLTUxOCw4ICs1MTgsNyBAQAogCQkJaWYgKGFsZ28gPT0gU0lHKCdwJywgJ3onKSkgewogCQkJCWludCBibG9ja19zaGlmdCA9CiAJCQkJCWlzb251bV83MTEoJnJyLT51LlpGLnBhcm1zWzFdKTsKLQkJCQlpZiAoYmxvY2tfc2hpZnQgPCBQQUdFX0NBQ0hFX1NISUZUCi0JCQkJCQl8fCBibG9ja19zaGlmdCA+IDE3KSB7CisJCQkJaWYgKGJsb2NrX3NoaWZ0ID4gMTcpIHsKIAkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaXNvZnM6ICIKIAkJCQkJCSJDYW4ndCBoYW5kbGUgWkYgYmxvY2sgIgogCQkJCQkJInNpemUgb2YgMl4lZFxuIiwKZGlmZiAtLWdpdCBhL2ZzL2piZDIvY29tbWl0LmMgYi9mcy9qYmQyL2NvbW1pdC5jCmluZGV4IDg4OTZjMWQuLjZhMTAyMzggMTAwNjQ0Ci0tLSBhL2ZzL2piZDIvY29tbWl0LmMKKysrIGIvZnMvamJkMi9jb21taXQuYwpAQCAtMjg2LDcgKzI4Niw3IEBACiAJCWlmIChlcnIpIHsKIAkJCS8qCiAJCQkgKiBCZWNhdXNlIEFTX0VJTyBpcyBjbGVhcmVkIGJ5Ci0JCQkgKiB3YWl0X29uX3BhZ2Vfd3JpdGViYWNrX3JhbmdlKCksIHNldCBpdCBhZ2FpbiBzbworCQkJICogZmlsZW1hcF9mZGF0YXdhaXRfcmFuZ2UoKSwgc2V0IGl0IGFnYWluIHNvCiAJCQkgKiB0aGF0IHVzZXIgcHJvY2VzcyBjYW4gZ2V0IC1FSU8gZnJvbSBmc3luYygpLgogCQkJICovCiAJCQlzZXRfYml0KEFTX0VJTywKZGlmZiAtLWdpdCBhL2ZzL25hbWVpLmMgYi9mcy9uYW1laS5jCmluZGV4IGQxMWY0MDQuLjg3Zjk3YmEgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVpLmMKKysrIGIvZnMvbmFtZWkuYwpAQCAtMTI3OSwyOCArMTI3OSw2IEBACiAJcmV0dXJuIF9fbG9va3VwX2hhc2goJnRoaXMsIGJhc2UsIE5VTEwpOwogfQogCi0vKioKLSAqIGxvb2t1cF9vbmVfbm9wZXJtIC0gYmFkIGhhY2sgZm9yIHN5c2ZzCi0gKiBAbmFtZToJcGF0aG5hbWUgY29tcG9uZW50IHRvIGxvb2t1cAotICogQGJhc2U6CWJhc2UgZGlyZWN0b3J5IHRvIGxvb2t1cCBmcm9tCi0gKgotICogVGhpcyBpcyBhIHZhcmlhbnQgb2YgbG9va3VwX29uZV9sZW4gdGhhdCBkb2Vzbid0IHBlcmZvcm0gYW55IHBlcm1pc3Npb24KLSAqIGNoZWNrcy4gICBJdCdzIGEgaG9ycmlibGUgaGFjayB0byB3b3JrIGFyb3VuZCB0aGUgYnJhaW5kZWFkIHN5c2ZzCi0gKiBhcmNoaXRlY3R1cmUgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBhbnl3aGVyZSBlbHNlLgotICoKLSAqIERPTidUIFVTRSBUSElTIEZVTkNUSU9OIEVWRVIsIHRoYW5rcy4KLSAqLwotc3RydWN0IGRlbnRyeSAqbG9va3VwX29uZV9ub3Blcm0oY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGRlbnRyeSAqYmFzZSkKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCBxc3RyIHRoaXM7Ci0KLQllcnIgPSBfX2xvb2t1cF9vbmVfbGVuKG5hbWUsICZ0aGlzLCBiYXNlLCBzdHJsZW4obmFtZSkpOwotCWlmIChlcnIpCi0JCXJldHVybiBFUlJfUFRSKGVycik7Ci0JcmV0dXJuIF9fbG9va3VwX2hhc2goJnRoaXMsIGJhc2UsIE5VTEwpOwotfQotCiBpbnQgdXNlcl9wYXRoX2F0KGludCBkZmQsIGNvbnN0IGNoYXIgX191c2VyICpuYW1lLCB1bnNpZ25lZCBmbGFncywKIAkJIHN0cnVjdCBwYXRoICpwYXRoKQogewpAQCAtMTY3OCw2ICsxNjU2LDE1IEBACiAJaW50IHdpbGxfd3JpdGU7CiAJaW50IGZsYWcgPSBvcGVuX3RvX25hbWVpX2ZsYWdzKG9wZW5fZmxhZyk7CiAKKwkvKgorCSAqIE9fU1lOQyBpcyBpbXBsZW1lbnRlZCBhcyBfX09fU1lOQ3xPX0RTWU5DLiAgQXMgbWFueSBwbGFjZXMgb25seQorCSAqIGNoZWNrIGZvciBPX0RTWU5DIGlmIHRoZSBuZWVkIGFueSBzeW5jaW5nIGF0IGFsbCB3ZSBlbmZvcmNlIGl0J3MKKwkgKiBhbHdheXMgc2V0IGluc3RlYWQgb2YgaGF2aW5nIHRvIGRlYWwgd2l0aCBwb3NzaWJseSB3ZWlyZCBiZWhhdmlvdXIKKwkgKiBmb3IgbWFsaWNpb3VzIGFwcGxpY2F0aW9ucyBzZXR0aW5nIG9ubHkgX19PX1NZTkMuCisJICovCisJaWYgKG9wZW5fZmxhZyAmIF9fT19TWU5DKQorCQlvcGVuX2ZsYWcgfD0gT19EU1lOQzsKKwogCWlmICghYWNjX21vZGUpCiAJCWFjY19tb2RlID0gTUFZX09QRU4gfCBBQ0NfTU9ERShmbGFnKTsKIApkaWZmIC0tZ2l0IGEvZnMvbmZzL2NhbGxiYWNrLmMgYi9mcy9uZnMvY2FsbGJhY2suYwppbmRleCAyOTNmYTA1Li43M2FiMjIwIDEwMDY0NAotLS0gYS9mcy9uZnMvY2FsbGJhY2suYworKysgYi9mcy9uZnMvY2FsbGJhY2suYwpAQCAtNzgsMTEgKzc4LDYgQEAKIAogCXNldF9mcmVlemFibGUoKTsKIAotCS8qCi0JICogRklYTUU6IGRvIHdlIHJlYWxseSBuZWVkIHRvIHJ1biB0aGlzIHVuZGVyIHRoZSBCS0w/IElmIHNvLCBwbGVhc2UKLQkgKiBhZGQgYSBjb21tZW50IGFib3V0IHdoYXQgaXQncyBpbnRlbmRlZCB0byBwcm90ZWN0LgotCSAqLwotCWxvY2tfa2VybmVsKCk7CiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKIAkJLyoKIAkJICogTGlzdGVuIGZvciBhIHJlcXVlc3Qgb24gdGhlIHNvY2tldApAQCAtMTA0LDcgKzk5LDYgQEAKIAkJcHJldmVyciA9IGVycjsKIAkJc3ZjX3Byb2Nlc3MocnFzdHApOwogCX0KLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2MCwxMSArMTU0LDYgQEAKIAogCXNldF9mcmVlemFibGUoKTsKIAotCS8qCi0JICogRklYTUU6IGRvIHdlIHJlYWxseSBuZWVkIHRvIHJ1biB0aGlzIHVuZGVyIHRoZSBCS0w/IElmIHNvLCBwbGVhc2UKLQkgKiBhZGQgYSBjb21tZW50IGFib3V0IHdoYXQgaXQncyBpbnRlbmRlZCB0byBwcm90ZWN0LgotCSAqLwotCWxvY2tfa2VybmVsKCk7CiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKIAkJcHJlcGFyZV90b193YWl0KCZzZXJ2LT5zdl9jYl93YWl0cSwgJndxLCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCQlzcGluX2xvY2tfYmgoJnNlcnYtPnN2X2NiX2xvY2spOwpAQCAtMTgzLDcgKzE3Miw2IEBACiAJCX0KIAkJZmluaXNoX3dhaXQoJnNlcnYtPnN2X2NiX3dhaXRxLCAmd3EpOwogCX0KLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM5Nyw2ICszODUsNyBAQAogICovCiBzdGF0aWMgc3RydWN0IHN2Y192ZXJzaW9uICpuZnM0X2NhbGxiYWNrX3ZlcnNpb25bXSA9IHsKIAlbMV0gPSAmbmZzNF9jYWxsYmFja192ZXJzaW9uMSwKKwlbNF0gPSAmbmZzNF9jYWxsYmFja192ZXJzaW9uNCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc3ZjX3N0YXQgbmZzNF9jYWxsYmFja19zdGF0czsKZGlmZiAtLWdpdCBhL2ZzL25mcy9jYWxsYmFjay5oIGIvZnMvbmZzL2NhbGxiYWNrLmgKaW5kZXggMDdiYWE4Mi4uZDQwMzZiZSAxMDA2NDQKLS0tIGEvZnMvbmZzL2NhbGxiYWNrLmgKKysrIGIvZnMvbmZzL2NhbGxiYWNrLmgKQEAgLTEwNiw2ICsxMDYsMTkgQEAKIGV4dGVybiB1bnNpZ25lZCBuZnM0X2NhbGxiYWNrX3NlcXVlbmNlKHN0cnVjdCBjYl9zZXF1ZW5jZWFyZ3MgKmFyZ3MsCiAJCQkJICAgICAgIHN0cnVjdCBjYl9zZXF1ZW5jZXJlcyAqcmVzKTsKIAorZXh0ZXJuIGludCBuZnM0MV92YWxpZGF0ZV9kZWxlZ2F0aW9uX3N0YXRlaWQoc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uLAorCQkJCQkgICAgIGNvbnN0IG5mczRfc3RhdGVpZCAqc3RhdGVpZCk7CisKKyNkZWZpbmUgUkNBNF9UWVBFX01BU0tfUkRBVEFfRExHCTAKKyNkZWZpbmUgUkNBNF9UWVBFX01BU0tfV0RBVEFfRExHCTEKKworc3RydWN0IGNiX3JlY2FsbGFueWFyZ3MgeworCXN0cnVjdCBzb2NrYWRkcgkqY3JhYV9hZGRyOworCXVpbnQzMl90CWNyYWFfb2Jqc190b19rZWVwOworCXVpbnQzMl90CWNyYWFfdHlwZV9tYXNrOworfTsKKworZXh0ZXJuIHVuc2lnbmVkIG5mczRfY2FsbGJhY2tfcmVjYWxsYW55KHN0cnVjdCBjYl9yZWNhbGxhbnlhcmdzICphcmdzLCB2b2lkICpkdW1teSk7CiAjZW5kaWYgLyogQ09ORklHX05GU19WNF8xICovCiAKIGV4dGVybiBfX2JlMzIgbmZzNF9jYWxsYmFja19nZXRhdHRyKHN0cnVjdCBjYl9nZXRhdHRyYXJncyAqYXJncywgc3RydWN0IGNiX2dldGF0dHJyZXMgKnJlcyk7CkBAIC0xMTQsOCArMTI3LDkgQEAKICNpZmRlZiBDT05GSUdfTkZTX1Y0CiBleHRlcm4gaW50IG5mc19jYWxsYmFja191cCh1MzIgbWlub3J2ZXJzaW9uLCBzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQpOwogZXh0ZXJuIHZvaWQgbmZzX2NhbGxiYWNrX2Rvd24oaW50IG1pbm9ydmVyc2lvbik7CitleHRlcm4gaW50IG5mczRfdmFsaWRhdGVfZGVsZWdhdGlvbl9zdGF0ZWlkKHN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbiwKKwkJCQkJICAgIGNvbnN0IG5mczRfc3RhdGVpZCAqc3RhdGVpZCk7CiAjZW5kaWYgLyogQ09ORklHX05GU19WNCAqLwotCiAvKgogICogbmZzNDE6IENhbGxiYWNrcyBhcmUgZXhwZWN0ZWQgdG8gbm90IGNhdXNlIHN1YnN0YW50aWFsIGxhdGVuY3ksCiAgKiBzbyB3ZSBsaW1pdCB0aGVpciBjb25jdXJyZW5jeSB0byAxIGJ5IHNldHRpbmcgdXAgdGhlIG1heGltdW0gbnVtYmVyCmRpZmYgLS1naXQgYS9mcy9uZnMvY2FsbGJhY2tfcHJvYy5jIGIvZnMvbmZzL2NhbGxiYWNrX3Byb2MuYwppbmRleCBiN2RhMWY1Li5kZWZhOWI0IDEwMDY0NAotLS0gYS9mcy9uZnMvY2FsbGJhY2tfcHJvYy5jCisrKyBiL2ZzL25mcy9jYWxsYmFja19wcm9jLmMKQEAgLTYxLDYgKzYxLDE2IEBACiAJcmV0dXJuIHJlcy0+c3RhdHVzOwogfQogCitzdGF0aWMgaW50ICgqbmZzX3ZhbGlkYXRlX2RlbGVnYXRpb25fc3RhdGVpZChzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKSkoc3RydWN0IG5mc19kZWxlZ2F0aW9uICosIGNvbnN0IG5mczRfc3RhdGVpZCAqKQoreworI2lmIGRlZmluZWQoQ09ORklHX05GU19WNF8xKQorCWlmIChjbHAtPmNsX21pbm9ydmVyc2lvbiA+IDApCisJCXJldHVybiBuZnM0MV92YWxpZGF0ZV9kZWxlZ2F0aW9uX3N0YXRlaWQ7CisjZW5kaWYKKwlyZXR1cm4gbmZzNF92YWxpZGF0ZV9kZWxlZ2F0aW9uX3N0YXRlaWQ7Cit9CisKKwogX19iZTMyIG5mczRfY2FsbGJhY2tfcmVjYWxsKHN0cnVjdCBjYl9yZWNhbGxhcmdzICphcmdzLCB2b2lkICpkdW1teSkKIHsKIAlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwOwpAQCAtODEsNyArOTEsOCBAQAogCQlpbm9kZSA9IG5mc19kZWxlZ2F0aW9uX2ZpbmRfaW5vZGUoY2xwLCAmYXJncy0+ZmgpOwogCQlpZiAoaW5vZGUgIT0gTlVMTCkgewogCQkJLyogU2V0IHVwIGEgaGVscGVyIHRocmVhZCB0byBhY3R1YWxseSByZXR1cm4gdGhlIGRlbGVnYXRpb24gKi8KLQkJCXN3aXRjaChuZnNfYXN5bmNfaW5vZGVfcmV0dXJuX2RlbGVnYXRpb24oaW5vZGUsICZhcmdzLT5zdGF0ZWlkKSkgeworCQkJc3dpdGNoIChuZnNfYXN5bmNfaW5vZGVfcmV0dXJuX2RlbGVnYXRpb24oaW5vZGUsICZhcmdzLT5zdGF0ZWlkLAorCQkJCQkJCQkgIG5mc192YWxpZGF0ZV9kZWxlZ2F0aW9uX3N0YXRlaWQoY2xwKSkpIHsKIAkJCQljYXNlIDA6CiAJCQkJCXJlcyA9IDA7CiAJCQkJCWJyZWFrOwpAQCAtMTAyLDggKzExMywzMSBAQAogCXJldHVybiByZXM7CiB9CiAKK2ludCBuZnM0X3ZhbGlkYXRlX2RlbGVnYXRpb25fc3RhdGVpZChzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb24sIGNvbnN0IG5mczRfc3RhdGVpZCAqc3RhdGVpZCkKK3sKKwlpZiAoZGVsZWdhdGlvbiA9PSBOVUxMIHx8IG1lbWNtcChkZWxlZ2F0aW9uLT5zdGF0ZWlkLmRhdGEsIHN0YXRlaWQtPmRhdGEsCisJCQkJCSBzaXplb2YoZGVsZWdhdGlvbi0+c3RhdGVpZC5kYXRhKSkgIT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKICNpZiBkZWZpbmVkKENPTkZJR19ORlNfVjRfMSkKIAoraW50IG5mczQxX3ZhbGlkYXRlX2RlbGVnYXRpb25fc3RhdGVpZChzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb24sIGNvbnN0IG5mczRfc3RhdGVpZCAqc3RhdGVpZCkKK3sKKwlpZiAoZGVsZWdhdGlvbiA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCS8qIHNlcWlkIGlzIDQtYnl0ZXMgbG9uZyAqLworCWlmICgoKHUzMiAqKSAmc3RhdGVpZC0+ZGF0YSlbMF0gIT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKG1lbWNtcCgmZGVsZWdhdGlvbi0+c3RhdGVpZC5kYXRhWzRdLCAmc3RhdGVpZC0+ZGF0YVs0XSwKKwkJICAgc2l6ZW9mKHN0YXRlaWQtPmRhdGEpLTQpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCiAvKgogICogVmFsaWRhdGUgdGhlIHNlcXVlbmNlSUQgc2VudCBieSB0aGUgc2VydmVyLgogICogUmV0dXJuIHN1Y2Nlc3MgaWYgdGhlIHNlcXVlbmNlSUQgaXMgb25lIG1vcmUgdGhhbiB3aGF0IHdlIGxhc3Qgc2F3IG9uCkBAIC0yMjcsNCArMjYxLDMyIEBACiAJcmV0dXJuIHJlcy0+Y3NyX3N0YXR1czsKIH0KIAordW5zaWduZWQgbmZzNF9jYWxsYmFja19yZWNhbGxhbnkoc3RydWN0IGNiX3JlY2FsbGFueWFyZ3MgKmFyZ3MsIHZvaWQgKmR1bW15KQoreworCXN0cnVjdCBuZnNfY2xpZW50ICpjbHA7CisJaW50IHN0YXR1czsKKwlmbW9kZV90IGZsYWdzID0gMDsKKworCXN0YXR1cyA9IGh0b25sKE5GUzRFUlJfT1BfTk9UX0lOX1NFU1NJT04pOworCWNscCA9IG5mc19maW5kX2NsaWVudChhcmdzLT5jcmFhX2FkZHIsIDQpOworCWlmIChjbHAgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlkcHJpbnRrKCJORlM6IFJFQ0FMTF9BTlkgY2FsbGJhY2sgcmVxdWVzdCBmcm9tICVzXG4iLAorCQlycGNfcGVlcmFkZHIyc3RyKGNscC0+Y2xfcnBjY2xpZW50LCBSUENfRElTUExBWV9BRERSKSk7CisKKwlpZiAodGVzdF9iaXQoUkNBNF9UWVBFX01BU0tfUkRBVEFfRExHLCAoY29uc3QgdW5zaWduZWQgbG9uZyAqKQorCQkgICAgICZhcmdzLT5jcmFhX3R5cGVfbWFzaykpCisJCWZsYWdzID0gRk1PREVfUkVBRDsKKwlpZiAodGVzdF9iaXQoUkNBNF9UWVBFX01BU0tfV0RBVEFfRExHLCAoY29uc3QgdW5zaWduZWQgbG9uZyAqKQorCQkgICAgICZhcmdzLT5jcmFhX3R5cGVfbWFzaykpCisJCWZsYWdzIHw9IEZNT0RFX1dSSVRFOworCisJaWYgKGZsYWdzKQorCQluZnNfZXhwaXJlX2FsbF9kZWxlZ2F0aW9uX3R5cGVzKGNscCwgZmxhZ3MpOworCXN0YXR1cyA9IGh0b25sKE5GUzRfT0spOworb3V0OgorCWRwcmludGsoIiVzOiBleGl0IHdpdGggc3RhdHVzID0gJWRcbiIsIF9fZnVuY19fLCBudG9obChzdGF0dXMpKTsKKwlyZXR1cm4gc3RhdHVzOworfQogI2VuZGlmIC8qIENPTkZJR19ORlNfVjRfMSAqLwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2NhbGxiYWNrX3hkci5jIGIvZnMvbmZzL2NhbGxiYWNrX3hkci5jCmluZGV4IDc2YjBhYTBmLi44ZTFhMjUxIDEwMDY0NAotLS0gYS9mcy9uZnMvY2FsbGJhY2tfeGRyLmMKKysrIGIvZnMvbmZzL2NhbGxiYWNrX3hkci5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaWYgZGVmaW5lZChDT05GSUdfTkZTX1Y0XzEpCiAjZGVmaW5lIENCX09QX1NFUVVFTkNFX1JFU19NQVhTWgkoQ0JfT1BfSERSX1JFU19NQVhTWiArIFwKIAkJCQkJNCArIDEgKyAzKQorI2RlZmluZSBDQl9PUF9SRUNBTExBTllfUkVTX01BWFNaCShDQl9PUF9IRFJfUkVTX01BWFNaKQogI2VuZGlmIC8qIENPTkZJR19ORlNfVjRfMSAqLwogCiAjZGVmaW5lIE5GU0RCR19GQUNJTElUWSBORlNEQkdfQ0FMTEJBQ0sKQEAgLTMyNiw2ICszMjcsMjUgQEAKIAlnb3RvIG91dDsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGRlY29kZV9yZWNhbGxhbnlfYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLAorCQkJCSAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgICAgc3RydWN0IGNiX3JlY2FsbGFueWFyZ3MgKmFyZ3MpCit7CisJdWludDMyX3QgKnA7CisKKwlhcmdzLT5jcmFhX2FkZHIgPSBzdmNfYWRkcihycXN0cCk7CisJcCA9IHJlYWRfYnVmKHhkciwgNCk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCXJldHVybiBodG9ubChORlM0RVJSX0JBRFhEUik7CisJYXJncy0+Y3JhYV9vYmpzX3RvX2tlZXAgPSBudG9obCgqcCsrKTsKKwlwID0gcmVhZF9idWYoeGRyLCA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJcmV0dXJuIGh0b25sKE5GUzRFUlJfQkFEWERSKTsKKwlhcmdzLT5jcmFhX3R5cGVfbWFzayA9IG50b2hsKCpwKTsKKworCXJldHVybiAwOworfQorCiAjZW5kaWYgLyogQ09ORklHX05GU19WNF8xICovCiAKIHN0YXRpYyBfX2JlMzIgZW5jb2RlX3N0cmluZyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1bnNpZ25lZCBpbnQgbGVuLCBjb25zdCBjaGFyICpzdHIpCkBAIC01MzMsNiArNTUzLDcgQEAKIAljYXNlIE9QX0NCX0dFVEFUVFI6CiAJY2FzZSBPUF9DQl9SRUNBTEw6CiAJY2FzZSBPUF9DQl9TRVFVRU5DRToKKwljYXNlIE9QX0NCX1JFQ0FMTF9BTlk6CiAJCSpvcCA9ICZjYWxsYmFja19vcHNbb3BfbnJdOwogCQlicmVhazsKIApAQCAtNTQwLDcgKzU2MSw2IEBACiAJY2FzZSBPUF9DQl9OT1RJRllfREVWSUNFSUQ6CiAJY2FzZSBPUF9DQl9OT1RJRlk6CiAJY2FzZSBPUF9DQl9QVVNIX0RFTEVHOgotCWNhc2UgT1BfQ0JfUkVDQUxMX0FOWToKIAljYXNlIE9QX0NCX1JFQ0FMTEFCTEVfT0JKX0FWQUlMOgogCWNhc2UgT1BfQ0JfUkVDQUxMX1NMT1Q6CiAJY2FzZSBPUF9DQl9XQU5UU19DQU5DRUxMRUQ6CkBAIC02ODgsNiArNzA4LDExIEBACiAJCS5lbmNvZGVfcmVzID0gKGNhbGxiYWNrX2VuY29kZV9yZXNfdCllbmNvZGVfY2Jfc2VxdWVuY2VfcmVzLAogCQkucmVzX21heHNpemUgPSBDQl9PUF9TRVFVRU5DRV9SRVNfTUFYU1osCiAJfSwKKwlbT1BfQ0JfUkVDQUxMX0FOWV0gPSB7CisJCS5wcm9jZXNzX29wID0gKGNhbGxiYWNrX3Byb2Nlc3Nfb3BfdCluZnM0X2NhbGxiYWNrX3JlY2FsbGFueSwKKwkJLmRlY29kZV9hcmdzID0gKGNhbGxiYWNrX2RlY29kZV9hcmdfdClkZWNvZGVfcmVjYWxsYW55X2FyZ3MsCisJCS5yZXNfbWF4c2l6ZSA9IENCX09QX1JFQ0FMTEFOWV9SRVNfTUFYU1osCisJfSwKICNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0XzEgKi8KIH07CiAKQEAgLTcxOCwzICs3NDMsMTAgQEAKIAkudnNfZGlzcGF0Y2ggPSBOVUxMLAogfTsKIAorc3RydWN0IHN2Y192ZXJzaW9uIG5mczRfY2FsbGJhY2tfdmVyc2lvbjQgPSB7CisJLnZzX3ZlcnMgPSA0LAorCS52c19ucHJvYyA9IEFSUkFZX1NJWkUobmZzNF9jYWxsYmFja19wcm9jZWR1cmVzMSksCisJLnZzX3Byb2MgPSBuZnM0X2NhbGxiYWNrX3Byb2NlZHVyZXMxLAorCS52c194ZHJzaXplID0gTkZTNF9DQUxMQkFDS19YRFJTSVpFLAorCS52c19kaXNwYXRjaCA9IE5VTEwsCit9OwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2NsaWVudC5jIGIvZnMvbmZzL2NsaWVudC5jCmluZGV4IDk5ZWExOTYuLmVlNzc3MTMgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9jbGllbnQuYworKysgYi9mcy9uZnMvY2xpZW50LmMKQEAgLTEyNjAsMTAgKzEyNjAsMjAgQEAKIHN0YXRpYyB2b2lkIG5mczRfc2Vzc2lvbl9zZXRfcndzaXplKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIpCiB7CiAjaWZkZWYgQ09ORklHX05GU19WNF8xCisJc3RydWN0IG5mczRfc2Vzc2lvbiAqc2VzczsKKwl1MzIgc2VydmVyX3Jlc3Bfc3o7CisJdTMyIHNlcnZlcl9ycXN0X3N6OworCiAJaWYgKCFuZnM0X2hhc19zZXNzaW9uKHNlcnZlci0+bmZzX2NsaWVudCkpCiAJCXJldHVybjsKLQlzZXJ2ZXItPnJzaXplID0gc2VydmVyLT5uZnNfY2xpZW50LT5jbF9zZXNzaW9uLT5mY19hdHRycy5tYXhfcmVzcF9zejsKLQlzZXJ2ZXItPndzaXplID0gc2VydmVyLT5uZnNfY2xpZW50LT5jbF9zZXNzaW9uLT5mY19hdHRycy5tYXhfcnFzdF9zejsKKwlzZXNzID0gc2VydmVyLT5uZnNfY2xpZW50LT5jbF9zZXNzaW9uOworCXNlcnZlcl9yZXNwX3N6ID0gc2Vzcy0+ZmNfYXR0cnMubWF4X3Jlc3Bfc3ogLSBuZnM0MV9tYXhyZWFkX292ZXJoZWFkOworCXNlcnZlcl9ycXN0X3N6ID0gc2Vzcy0+ZmNfYXR0cnMubWF4X3Jxc3Rfc3ogLSBuZnM0MV9tYXh3cml0ZV9vdmVyaGVhZDsKKworCWlmIChzZXJ2ZXItPnJzaXplID4gc2VydmVyX3Jlc3Bfc3opCisJCXNlcnZlci0+cnNpemUgPSBzZXJ2ZXJfcmVzcF9zejsKKwlpZiAoc2VydmVyLT53c2l6ZSA+IHNlcnZlcl9ycXN0X3N6KQorCQlzZXJ2ZXItPndzaXplID0gc2VydmVyX3Jxc3Rfc3o7CiAjZW5kaWYgLyogQ09ORklHX05GU19WNF8xICovCiB9CiAKZGlmZiAtLWdpdCBhL2ZzL25mcy9kZWxlZ2F0aW9uLmMgYi9mcy9uZnMvZGVsZWdhdGlvbi5jCmluZGV4IDZkZDQ4YTQuLjI1NjNiZWIgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9kZWxlZ2F0aW9uLmMKKysrIGIvZnMvbmZzL2RlbGVnYXRpb24uYwpAQCAtOTIsNyArOTIsNyBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyB2b2lkIG5mc19kZWxlZ2F0aW9uX2NsYWltX29wZW5zKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IG5mczRfc3RhdGVpZCAqc3RhdGVpZCkKK3N0YXRpYyBpbnQgbmZzX2RlbGVnYXRpb25fY2xhaW1fb3BlbnMoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgbmZzNF9zdGF0ZWlkICpzdGF0ZWlkKQogewogCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CiAJc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eDsKQEAgLTExNiwxMCArMTE2LDExIEBACiAJCQllcnIgPSBuZnNfZGVsZWdhdGlvbl9jbGFpbV9sb2NrcyhjdHgsIHN0YXRlKTsKIAkJcHV0X25mc19vcGVuX2NvbnRleHQoY3R4KTsKIAkJaWYgKGVyciAhPSAwKQotCQkJcmV0dXJuOworCQkJcmV0dXJuIGVycjsKIAkJZ290byBhZ2FpbjsKIAl9CiAJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMjYxLDMwICsyNjIsMzQgQEAKIC8qCiAgKiBCYXNpYyBwcm9jZWR1cmUgZm9yIHJldHVybmluZyBhIGRlbGVnYXRpb24gdG8gdGhlIHNlcnZlcgogICovCi1zdGF0aWMgaW50IF9fbmZzX2lub2RlX3JldHVybl9kZWxlZ2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbikKK3N0YXRpYyBpbnQgX19uZnNfaW5vZGVfcmV0dXJuX2RlbGVnYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uLCBpbnQgaXNzeW5jKQogewogCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisJaW50IGVycjsKIAotCW5mc19tc3luY19pbm9kZShpbm9kZSk7CiAJLyoKIAkgKiBHdWFyZCBhZ2FpbnN0IG5ldyBkZWxlZ2F0ZWQgb3Blbi9sb2NrL3VubG9jayBjYWxscyBhbmQgYWdhaW5zdAogCSAqIHN0YXRlIHJlY292ZXJ5CiAJICovCiAJZG93bl93cml0ZSgmbmZzaS0+cndzZW0pOwotCW5mc19kZWxlZ2F0aW9uX2NsYWltX29wZW5zKGlub2RlLCAmZGVsZWdhdGlvbi0+c3RhdGVpZCk7CisJZXJyID0gbmZzX2RlbGVnYXRpb25fY2xhaW1fb3BlbnMoaW5vZGUsICZkZWxlZ2F0aW9uLT5zdGF0ZWlkKTsKIAl1cF93cml0ZSgmbmZzaS0+cndzZW0pOwotCW5mc19tc3luY19pbm9kZShpbm9kZSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CiAKLQlyZXR1cm4gbmZzX2RvX3JldHVybl9kZWxlZ2F0aW9uKGlub2RlLCBkZWxlZ2F0aW9uLCAxKTsKKwllcnIgPSBuZnNfZG9fcmV0dXJuX2RlbGVnYXRpb24oaW5vZGUsIGRlbGVnYXRpb24sIGlzc3luYyk7CitvdXQ6CisJcmV0dXJuIGVycjsKIH0KIAogLyoKICAqIFJldHVybiBhbGwgZGVsZWdhdGlvbnMgdGhhdCBoYXZlIGJlZW4gbWFya2VkIGZvciByZXR1cm4KICAqLwotdm9pZCBuZnNfY2xpZW50X3JldHVybl9tYXJrZWRfZGVsZWdhdGlvbnMoc3RydWN0IG5mc19jbGllbnQgKmNscCkKK2ludCBuZnNfY2xpZW50X3JldHVybl9tYXJrZWRfZGVsZWdhdGlvbnMoc3RydWN0IG5mc19jbGllbnQgKmNscCkKIHsKIAlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb247CiAJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgZXJyID0gMDsKIAogcmVzdGFydDoKIAlyY3VfcmVhZF9sb2NrKCk7CkBAIC0yOTgsMTIgKzMwMywxOCBAQAogCQlkZWxlZ2F0aW9uID0gbmZzX2RldGFjaF9kZWxlZ2F0aW9uX2xvY2tlZChORlNfSShpbm9kZSksIE5VTEwpOwogCQlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCWlmIChkZWxlZ2F0aW9uICE9IE5VTEwpCi0JCQlfX25mc19pbm9kZV9yZXR1cm5fZGVsZWdhdGlvbihpbm9kZSwgZGVsZWdhdGlvbik7CisJCWlmIChkZWxlZ2F0aW9uICE9IE5VTEwpIHsKKwkJCWZpbGVtYXBfZmx1c2goaW5vZGUtPmlfbWFwcGluZyk7CisJCQllcnIgPSBfX25mc19pbm9kZV9yZXR1cm5fZGVsZWdhdGlvbihpbm9kZSwgZGVsZWdhdGlvbiwgMCk7CisJCX0KIAkJaXB1dChpbm9kZSk7Ci0JCWdvdG8gcmVzdGFydDsKKwkJaWYgKCFlcnIpCisJCQlnb3RvIHJlc3RhcnQ7CisJCXNldF9iaXQoTkZTNENMTlRfREVMRUdSRVRVUk4sICZjbHAtPmNsX3N0YXRlKTsKKwkJcmV0dXJuIGVycjsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0zMzgsOCArMzQ5LDEwIEBACiAJCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKIAkJZGVsZWdhdGlvbiA9IG5mc19kZXRhY2hfZGVsZWdhdGlvbl9sb2NrZWQobmZzaSwgTlVMTCk7CiAJCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOwotCQlpZiAoZGVsZWdhdGlvbiAhPSBOVUxMKQotCQkJZXJyID0gX19uZnNfaW5vZGVfcmV0dXJuX2RlbGVnYXRpb24oaW5vZGUsIGRlbGVnYXRpb24pOworCQlpZiAoZGVsZWdhdGlvbiAhPSBOVUxMKSB7CisJCQluZnNfbXN5bmNfaW5vZGUoaW5vZGUpOworCQkJZXJyID0gX19uZnNfaW5vZGVfcmV0dXJuX2RlbGVnYXRpb24oaW5vZGUsIGRlbGVnYXRpb24sIDEpOworCQl9CiAJfQogCXJldHVybiBlcnI7CiB9CkBAIC0zNjgsMzEgKzM4MSw0NSBAQAogCQlzcGluX3VubG9jaygmZGVsZWdhdGlvbi0+bG9jayk7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwotCW5mc19jbGllbnRfcmV0dXJuX21hcmtlZF9kZWxlZ2F0aW9ucyhjbHApOworCWlmIChuZnNfY2xpZW50X3JldHVybl9tYXJrZWRfZGVsZWdhdGlvbnMoY2xwKSAhPSAwKQorCQluZnM0X3NjaGVkdWxlX3N0YXRlX21hbmFnZXIoY2xwKTsKIH0KIAotc3RhdGljIHZvaWQgbmZzX2NsaWVudF9tYXJrX3JldHVybl9hbGxfZGVsZWdhdGlvbnMoc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3N0YXRpYwordm9pZCBuZnNfY2xpZW50X21hcmtfcmV0dXJuX2FsbF9kZWxlZ2F0aW9uX3R5cGVzKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsIGZtb2RlX3QgZmxhZ3MpCiB7CiAJc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGRlbGVnYXRpb24sICZjbHAtPmNsX2RlbGVnYXRpb25zLCBzdXBlcl9saXN0KSB7Ci0JCXNldF9iaXQoTkZTX0RFTEVHQVRJT05fUkVUVVJOLCAmZGVsZWdhdGlvbi0+ZmxhZ3MpOwotCQlzZXRfYml0KE5GUzRDTE5UX0RFTEVHUkVUVVJOLCAmY2xwLT5jbF9zdGF0ZSk7CisJCWlmICgoZGVsZWdhdGlvbi0+dHlwZSA9PSAoRk1PREVfUkVBRHxGTU9ERV9XUklURSkpICYmICEoZmxhZ3MgJiBGTU9ERV9XUklURSkpCisJCQljb250aW51ZTsKKwkJaWYgKGRlbGVnYXRpb24tPnR5cGUgJiBmbGFncykKKwkJCW5mc19tYXJrX3JldHVybl9kZWxlZ2F0aW9uKGNscCwgZGVsZWdhdGlvbik7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwogfQogCitzdGF0aWMgdm9pZCBuZnNfY2xpZW50X21hcmtfcmV0dXJuX2FsbF9kZWxlZ2F0aW9ucyhzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQoreworCW5mc19jbGllbnRfbWFya19yZXR1cm5fYWxsX2RlbGVnYXRpb25fdHlwZXMoY2xwLCBGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKTsKK30KKwogc3RhdGljIHZvaWQgbmZzX2RlbGVnYXRpb25fcnVuX3N0YXRlX21hbmFnZXIoc3RydWN0IG5mc19jbGllbnQgKmNscCkKIHsKIAlpZiAodGVzdF9iaXQoTkZTNENMTlRfREVMRUdSRVRVUk4sICZjbHAtPmNsX3N0YXRlKSkKIAkJbmZzNF9zY2hlZHVsZV9zdGF0ZV9tYW5hZ2VyKGNscCk7CiB9CiAKK3ZvaWQgbmZzX2V4cGlyZV9hbGxfZGVsZWdhdGlvbl90eXBlcyhzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLCBmbW9kZV90IGZsYWdzKQoreworCW5mc19jbGllbnRfbWFya19yZXR1cm5fYWxsX2RlbGVnYXRpb25fdHlwZXMoY2xwLCBmbGFncyk7CisJbmZzX2RlbGVnYXRpb25fcnVuX3N0YXRlX21hbmFnZXIoY2xwKTsKK30KKwogdm9pZCBuZnNfZXhwaXJlX2FsbF9kZWxlZ2F0aW9ucyhzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQogewotCW5mc19jbGllbnRfbWFya19yZXR1cm5fYWxsX2RlbGVnYXRpb25zKGNscCk7Ci0JbmZzX2RlbGVnYXRpb25fcnVuX3N0YXRlX21hbmFnZXIoY2xwKTsKKwluZnNfZXhwaXJlX2FsbF9kZWxlZ2F0aW9uX3R5cGVzKGNscCwgRk1PREVfUkVBRHxGTU9ERV9XUklURSk7CiB9CiAKIC8qCkBAIC00MTMsOCArNDQwLDcgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShkZWxlZ2F0aW9uLCAmY2xwLT5jbF9kZWxlZ2F0aW9ucywgc3VwZXJfbGlzdCkgewogCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KE5GU19ERUxFR0FUSU9OX1JFRkVSRU5DRUQsICZkZWxlZ2F0aW9uLT5mbGFncykpCiAJCQljb250aW51ZTsKLQkJc2V0X2JpdChORlNfREVMRUdBVElPTl9SRVRVUk4sICZkZWxlZ2F0aW9uLT5mbGFncyk7Ci0JCXNldF9iaXQoTkZTNENMTlRfREVMRUdSRVRVUk4sICZjbHAtPmNsX3N0YXRlKTsKKwkJbmZzX21hcmtfcmV0dXJuX2RlbGVnYXRpb24oY2xwLCBkZWxlZ2F0aW9uKTsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CkBAIC00MjgsMTggKzQ1NCwyMSBAQAogLyoKICAqIEFzeW5jaHJvbm91cyBkZWxlZ2F0aW9uIHJlY2FsbCEKICAqLwotaW50IG5mc19hc3luY19pbm9kZV9yZXR1cm5fZGVsZWdhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBuZnM0X3N0YXRlaWQgKnN0YXRlaWQpCitpbnQgbmZzX2FzeW5jX2lub2RlX3JldHVybl9kZWxlZ2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IG5mczRfc3RhdGVpZCAqc3RhdGVpZCwKKwkJCQkgICAgICBpbnQgKCp2YWxpZGF0ZV9zdGF0ZWlkKShzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb24sCisJCQkJCQkJICAgICAgY29uc3QgbmZzNF9zdGF0ZWlkICpzdGF0ZWlkKSkKIHsKIAlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gTkZTX1NFUlZFUihpbm9kZSktPm5mc19jbGllbnQ7CiAJc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCWRlbGVnYXRpb24gPSByY3VfZGVyZWZlcmVuY2UoTkZTX0koaW5vZGUpLT5kZWxlZ2F0aW9uKTsKLQlpZiAoZGVsZWdhdGlvbiA9PSBOVUxMIHx8IG1lbWNtcChkZWxlZ2F0aW9uLT5zdGF0ZWlkLmRhdGEsIHN0YXRlaWQtPmRhdGEsCi0JCQkJc2l6ZW9mKGRlbGVnYXRpb24tPnN0YXRlaWQuZGF0YSkpICE9IDApIHsKKworCWlmICghdmFsaWRhdGVfc3RhdGVpZChkZWxlZ2F0aW9uLCBzdGF0ZWlkKSkgewogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQorCiAJbmZzX21hcmtfcmV0dXJuX2RlbGVnYXRpb24oY2xwLCBkZWxlZ2F0aW9uKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAluZnNfZGVsZWdhdGlvbl9ydW5fc3RhdGVfbWFuYWdlcihjbHApOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2RlbGVnYXRpb24uaCBiL2ZzL25mcy9kZWxlZ2F0aW9uLmgKaW5kZXggMDlmMzgzNy4uOTQ0YjYyNyAxMDA2NDQKLS0tIGEvZnMvbmZzL2RlbGVnYXRpb24uaAorKysgYi9mcy9uZnMvZGVsZWdhdGlvbi5oCkBAIC0zNCwxNSArMzQsMTggQEAKIGludCBuZnNfaW5vZGVfc2V0X2RlbGVnYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHJwY19jcmVkICpjcmVkLCBzdHJ1Y3QgbmZzX29wZW5yZXMgKnJlcyk7CiB2b2lkIG5mc19pbm9kZV9yZWNsYWltX2RlbGVnYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHJwY19jcmVkICpjcmVkLCBzdHJ1Y3QgbmZzX29wZW5yZXMgKnJlcyk7CiBpbnQgbmZzX2lub2RlX3JldHVybl9kZWxlZ2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwotaW50IG5mc19hc3luY19pbm9kZV9yZXR1cm5fZGVsZWdhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBuZnM0X3N0YXRlaWQgKnN0YXRlaWQpOworaW50IG5mc19hc3luY19pbm9kZV9yZXR1cm5fZGVsZWdhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBuZnM0X3N0YXRlaWQgKnN0YXRlaWQsCisJCQkJICAgICAgaW50ICgqdmFsaWRhdGVfc3RhdGVpZCkoc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uLAorCQkJCQkJCSAgICAgIGNvbnN0IG5mczRfc3RhdGVpZCAqc3RhdGVpZCkpOwogdm9pZCBuZnNfaW5vZGVfcmV0dXJuX2RlbGVnYXRpb25fbm9yZWNsYWltKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogCiBzdHJ1Y3QgaW5vZGUgKm5mc19kZWxlZ2F0aW9uX2ZpbmRfaW5vZGUoc3RydWN0IG5mc19jbGllbnQgKmNscCwgY29uc3Qgc3RydWN0IG5mc19maCAqZmhhbmRsZSk7CiB2b2lkIG5mc19zdXBlcl9yZXR1cm5fYWxsX2RlbGVnYXRpb25zKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwogdm9pZCBuZnNfZXhwaXJlX2FsbF9kZWxlZ2F0aW9ucyhzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKTsKK3ZvaWQgbmZzX2V4cGlyZV9hbGxfZGVsZWdhdGlvbl90eXBlcyhzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLCBmbW9kZV90IGZsYWdzKTsKIHZvaWQgbmZzX2V4cGlyZV91bnJlZmVyZW5jZWRfZGVsZWdhdGlvbnMoc3RydWN0IG5mc19jbGllbnQgKmNscCk7CiB2b2lkIG5mc19oYW5kbGVfY2JfcGF0aGRvd24oc3RydWN0IG5mc19jbGllbnQgKmNscCk7Ci12b2lkIG5mc19jbGllbnRfcmV0dXJuX21hcmtlZF9kZWxlZ2F0aW9ucyhzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKTsKK2ludCBuZnNfY2xpZW50X3JldHVybl9tYXJrZWRfZGVsZWdhdGlvbnMoc3RydWN0IG5mc19jbGllbnQgKmNscCk7CiAKIHZvaWQgbmZzX2RlbGVnYXRpb25fbWFya19yZWNsYWltKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApOwogdm9pZCBuZnNfZGVsZWdhdGlvbl9yZWFwX3VuY2xhaW1lZChzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9kaXIuYyBiL2ZzL25mcy9kaXIuYwppbmRleCA3Y2IyOTg1Li4yYzVhY2U0IDEwMDY0NAotLS0gYS9mcy9uZnMvZGlyLmMKKysrIGIvZnMvbmZzL2Rpci5jCkBAIC0xNTc5LDU1ICsxNTc5LDQ2IEBACiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gTlVMTCwgKnJlaGFzaCA9IE5VTEw7CiAJaW50IGVycm9yID0gLUVCVVNZOwogCi0JLyoKLQkgKiBUbyBwcmV2ZW50IGFueSBuZXcgcmVmZXJlbmNlcyB0byB0aGUgdGFyZ2V0IGR1cmluZyB0aGUgcmVuYW1lLAotCSAqIHdlIHVuaGFzaCB0aGUgZGVudHJ5IGFuZCBmcmVlIHRoZSBpbm9kZSBpbiBhZHZhbmNlLgotCSAqLwotCWlmICghZF91bmhhc2hlZChuZXdfZGVudHJ5KSkgewotCQlkX2Ryb3AobmV3X2RlbnRyeSk7Ci0JCXJlaGFzaCA9IG5ld19kZW50cnk7Ci0JfQotCiAJZGZwcmludGsoVkZTLCAiTkZTOiByZW5hbWUoJXMvJXMgLT4gJXMvJXMsIGN0PSVkKVxuIiwKIAkJIG9sZF9kZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgb2xkX2RlbnRyeS0+ZF9uYW1lLm5hbWUsCiAJCSBuZXdfZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIG5ld19kZW50cnktPmRfbmFtZS5uYW1lLAogCQkgYXRvbWljX3JlYWQoJm5ld19kZW50cnktPmRfY291bnQpKTsKIAogCS8qCi0JICogRmlyc3QgY2hlY2sgd2hldGhlciB0aGUgdGFyZ2V0IGlzIGJ1c3kgLi4uIHdlIGNhbid0Ci0JICogc2FmZWx5IGRvIF9hbnlfIHJlbmFtZSBpZiB0aGUgdGFyZ2V0IGlzIGluIHVzZS4KLQkgKgotCSAqIEZvciBmaWxlcywgbWFrZSBhIGNvcHkgb2YgdGhlIGRlbnRyeSBhbmQgdGhlbiBkbyBhIAotCSAqIHNpbGx5LXJlbmFtZS4gSWYgdGhlIHNpbGx5LXJlbmFtZSBzdWNjZWVkcywgdGhlCi0JICogY29waWVkIGRlbnRyeSBpcyBoYXNoZWQgYW5kIGJlY29tZXMgdGhlIG5ldyB0YXJnZXQuCisJICogRm9yIG5vbi1kaXJlY3RvcmllcywgY2hlY2sgd2hldGhlciB0aGUgdGFyZ2V0IGlzIGJ1c3kgYW5kIGlmIHNvLAorCSAqIG1ha2UgYSBjb3B5IG9mIHRoZSBkZW50cnkgYW5kIHRoZW4gZG8gYSBzaWxseS1yZW5hbWUuIElmIHRoZQorCSAqIHNpbGx5LXJlbmFtZSBzdWNjZWVkcywgdGhlIGNvcGllZCBkZW50cnkgaXMgaGFzaGVkIGFuZCBiZWNvbWVzCisJICogdGhlIG5ldyB0YXJnZXQuCiAJICovCi0JaWYgKCFuZXdfaW5vZGUpCi0JCWdvdG8gZ29fYWhlYWQ7Ci0JaWYgKFNfSVNESVIobmV3X2lub2RlLT5pX21vZGUpKSB7Ci0JCWVycm9yID0gLUVJU0RJUjsKLQkJaWYgKCFTX0lTRElSKG9sZF9pbm9kZS0+aV9tb2RlKSkKLQkJCWdvdG8gb3V0OwotCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJm5ld19kZW50cnktPmRfY291bnQpID4gMikgewotCQlpbnQgZXJyOwotCQkvKiBjb3B5IHRoZSB0YXJnZXQgZGVudHJ5J3MgbmFtZSAqLwotCQlkZW50cnkgPSBkX2FsbG9jKG5ld19kZW50cnktPmRfcGFyZW50LAotCQkJCSAmbmV3X2RlbnRyeS0+ZF9uYW1lKTsKLQkJaWYgKCFkZW50cnkpCi0JCQlnb3RvIG91dDsKKwlpZiAobmV3X2lub2RlICYmICFTX0lTRElSKG5ld19pbm9kZS0+aV9tb2RlKSkgeworCQkvKgorCQkgKiBUbyBwcmV2ZW50IGFueSBuZXcgcmVmZXJlbmNlcyB0byB0aGUgdGFyZ2V0IGR1cmluZyB0aGUKKwkJICogcmVuYW1lLCB3ZSB1bmhhc2ggdGhlIGRlbnRyeSBpbiBhZHZhbmNlLgorCQkgKi8KKwkJaWYgKCFkX3VuaGFzaGVkKG5ld19kZW50cnkpKSB7CisJCQlkX2Ryb3AobmV3X2RlbnRyeSk7CisJCQlyZWhhc2ggPSBuZXdfZGVudHJ5OworCQl9CiAKLQkJLyogc2lsbHktcmVuYW1lIHRoZSBleGlzdGluZyB0YXJnZXQgLi4uICovCi0JCWVyciA9IG5mc19zaWxseXJlbmFtZShuZXdfZGlyLCBuZXdfZGVudHJ5KTsKLQkJaWYgKCFlcnIpIHsKLQkJCW5ld19kZW50cnkgPSByZWhhc2ggPSBkZW50cnk7CisJCWlmIChhdG9taWNfcmVhZCgmbmV3X2RlbnRyeS0+ZF9jb3VudCkgPiAyKSB7CisJCQlpbnQgZXJyOworCisJCQkvKiBjb3B5IHRoZSB0YXJnZXQgZGVudHJ5J3MgbmFtZSAqLworCQkJZGVudHJ5ID0gZF9hbGxvYyhuZXdfZGVudHJ5LT5kX3BhcmVudCwKKwkJCQkJICZuZXdfZGVudHJ5LT5kX25hbWUpOworCQkJaWYgKCFkZW50cnkpCisJCQkJZ290byBvdXQ7CisKKwkJCS8qIHNpbGx5LXJlbmFtZSB0aGUgZXhpc3RpbmcgdGFyZ2V0IC4uLiAqLworCQkJZXJyID0gbmZzX3NpbGx5cmVuYW1lKG5ld19kaXIsIG5ld19kZW50cnkpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIG91dDsKKworCQkJbmV3X2RlbnRyeSA9IGRlbnRyeTsKIAkJCW5ld19pbm9kZSA9IE5VTEw7Ci0JCQkvKiBpbnN0YW50aWF0ZSB0aGUgcmVwbGFjZW1lbnQgdGFyZ2V0ICovCi0JCQlkX2luc3RhbnRpYXRlKG5ld19kZW50cnksIE5VTEwpOwotCQl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZuZXdfZGVudHJ5LT5kX2NvdW50KSA+IDEpCi0JCQkvKiBkZW50cnkgc3RpbGwgYnVzeT8gKi8KLQkJCWdvdG8gb3V0OworCQl9CiAJfQogCi1nb19haGVhZDoKIAkvKgogCSAqIC4uLiBwcnVuZSBjaGlsZCBkZW50cmllcyBhbmQgd3JpdGViYWNrcyBpZiBuZWVkZWQuCiAJICovCmRpZmYgLS1naXQgYS9mcy9uZnMvZG5zX3Jlc29sdmUuYyBiL2ZzL25mcy9kbnNfcmVzb2x2ZS5jCmluZGV4IGY0ZDU0YmEuLjk1ZTFjYTcgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9kbnNfcmVzb2x2ZS5jCisrKyBiL2ZzL25mcy9kbnNfcmVzb2x2ZS5jCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IG5mc19kbnNfZW50ICpuZnNfZG5zX2xvb2t1cChzdHJ1Y3QgY2FjaGVfZGV0YWlsICpjZCwKK3N0YXRpYyBzdHJ1Y3QgbmZzX2Ruc19lbnQgKm5mc19kbnNfbG9va3VwKHN0cnVjdCBjYWNoZV9kZXRhaWwgKmNkLAogCQlzdHJ1Y3QgbmZzX2Ruc19lbnQgKmtleSkKIHsKIAlzdHJ1Y3QgY2FjaGVfaGVhZCAqY2g7CkBAIC0xNTksNyArMTU5LDcgQEAKIAlyZXR1cm4gY29udGFpbmVyX29mKGNoLCBzdHJ1Y3QgbmZzX2Ruc19lbnQsIGgpOwogfQogCi1zdHJ1Y3QgbmZzX2Ruc19lbnQgKm5mc19kbnNfdXBkYXRlKHN0cnVjdCBjYWNoZV9kZXRhaWwgKmNkLAorc3RhdGljIHN0cnVjdCBuZnNfZG5zX2VudCAqbmZzX2Ruc191cGRhdGUoc3RydWN0IGNhY2hlX2RldGFpbCAqY2QsCiAJCXN0cnVjdCBuZnNfZG5zX2VudCAqbmV3LAogCQlzdHJ1Y3QgbmZzX2Ruc19lbnQgKmtleSkKIHsKZGlmZiAtLWdpdCBhL2ZzL25mcy9maWxlLmMgYi9mcy9uZnMvZmlsZS5jCmluZGV4IGY1ZmRkMzkuLjZiODkxMzIgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9maWxlLmMKKysrIGIvZnMvbmZzL2ZpbGUuYwpAQCAtNTgxLDcgKzU4MSw3IEBACiB7CiAJc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eDsKIAotCWlmIChJU19TWU5DKGlub2RlKSB8fCAoZmlscC0+Zl9mbGFncyAmIE9fU1lOQykpCisJaWYgKElTX1NZTkMoaW5vZGUpIHx8IChmaWxwLT5mX2ZsYWdzICYgT19EU1lOQykpCiAJCXJldHVybiAxOwogCWN0eCA9IG5mc19maWxlX29wZW5fY29udGV4dChmaWxwKTsKIAlpZiAodGVzdF9iaXQoTkZTX0NPTlRFWFRfRVJST1JfV1JJVEUsICZjdHgtPmZsYWdzKSkKQEAgLTYyMiw3ICs2MjIsNyBAQAogCiAJbmZzX2FkZF9zdGF0cyhpbm9kZSwgTkZTSU9TX05PUk1BTFdSSVRURU5CWVRFUywgY291bnQpOwogCXJlc3VsdCA9IGdlbmVyaWNfZmlsZV9haW9fd3JpdGUoaW9jYiwgaW92LCBucl9zZWdzLCBwb3MpOwotCS8qIFJldHVybiBlcnJvciB2YWx1ZXMgZm9yIE9fU1lOQyBhbmQgSVNfU1lOQygpICovCisJLyogUmV0dXJuIGVycm9yIHZhbHVlcyBmb3IgT19EU1lOQyBhbmQgSVNfU1lOQygpICovCiAJaWYgKHJlc3VsdCA+PSAwICYmIG5mc19uZWVkX3N5bmNfd3JpdGUoaW9jYi0+a2lfZmlscCwgaW5vZGUpKSB7CiAJCWludCBlcnIgPSBuZnNfZG9fZnN5bmMobmZzX2ZpbGVfb3Blbl9jb250ZXh0KGlvY2ItPmtpX2ZpbHApLCBpbm9kZSk7CiAJCWlmIChlcnIgPCAwKQpkaWZmIC0tZ2l0IGEvZnMvbmZzL2ludGVybmFsLmggYi9mcy9uZnMvaW50ZXJuYWwuaAppbmRleCBlMjFiMWJiLi4yOWU0NjRkIDEwMDY0NAotLS0gYS9mcy9uZnMvaW50ZXJuYWwuaAorKysgYi9mcy9uZnMvaW50ZXJuYWwuaApAQCAtMzAsNiArMzAsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgbmZzNF9oYXNfcGVyc2lzdGVudF9zZXNzaW9uKGNvbnN0IHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCit7CisjaWZkZWYgQ09ORklHX05GU19WNF8xCisJaWYgKG5mczRfaGFzX3Nlc3Npb24oY2xwKSkKKwkJcmV0dXJuIChjbHAtPmNsX3Nlc3Npb24tPmZsYWdzICYgU0VTU0lPTjRfUEVSU0lTVCk7CisjZW5kaWYgLyogQ09ORklHX05GU19WNF8xICovCisJcmV0dXJuIDA7Cit9CisKIHN0cnVjdCBuZnNfY2xvbmVfbW91bnQgewogCWNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CiAJY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5OwpAQCAtMTU2LDYgKzE2NSw3IEBACiAKIC8qIGNhbGxiYWNrX3hkci5jICovCiBleHRlcm4gc3RydWN0IHN2Y192ZXJzaW9uIG5mczRfY2FsbGJhY2tfdmVyc2lvbjE7CitleHRlcm4gc3RydWN0IHN2Y192ZXJzaW9uIG5mczRfY2FsbGJhY2tfdmVyc2lvbjQ7CiAKIC8qIHBhZ2VsaXN0LmMgKi8KIGV4dGVybiBpbnQgX19pbml0IG5mc19pbml0X25mc3BhZ2VjYWNoZSh2b2lkKTsKQEAgLTE3NywyNCArMTg3LDE0IEBACiBleHRlcm4gc3RydWN0IHJwY19wcm9jaW5mbyBuZnMzX3Byb2NlZHVyZXNbXTsKIGV4dGVybiBfX2JlMzIgKm5mczNfZGVjb2RlX2RpcmVudChfX2JlMzIgKiwgc3RydWN0IG5mc19lbnRyeSAqLCBpbnQpOwogCi0vKiBuZnM0cHJvYy5jICovCi1zdGF0aWMgaW5saW5lIHZvaWQgbmZzNF9yZXN0YXJ0X3JwYyhzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssCi0JCQkJICAgIGNvbnN0IHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCi17Ci0jaWZkZWYgQ09ORklHX05GU19WNF8xCi0JaWYgKG5mczRfaGFzX3Nlc3Npb24oY2xwKSAmJgotCSAgICB0ZXN0X2JpdChORlM0Q0xOVF9TRVNTSU9OX1NFVFVQLCAmY2xwLT5jbF9zdGF0ZSkpIHsKLQkJcnBjX3Jlc3RhcnRfY2FsbF9wcmVwYXJlKHRhc2spOwotCQlyZXR1cm47Ci0JfQotI2VuZGlmIC8qIENPTkZJR19ORlNfVjRfMSAqLwotCXJwY19yZXN0YXJ0X2NhbGwodGFzayk7Ci19Ci0KIC8qIG5mczR4ZHIuYyAqLwogI2lmZGVmIENPTkZJR19ORlNfVjQKIGV4dGVybiBfX2JlMzIgKm5mczRfZGVjb2RlX2RpcmVudChfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZW50cnkgKmVudHJ5LCBpbnQgcGx1cyk7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfTkZTX1Y0XzEKK2V4dGVybiBjb25zdCB1MzIgbmZzNDFfbWF4cmVhZF9vdmVyaGVhZDsKK2V4dGVybiBjb25zdCB1MzIgbmZzNDFfbWF4d3JpdGVfb3ZlcmhlYWQ7CisjZW5kaWYKIAogLyogbmZzNHByb2MuYyAqLwogI2lmZGVmIENPTkZJR19ORlNfVjQKQEAgLTI3MywyMCArMjczLDYgQEAKIAkJCQkgICBzdHJ1Y3QgbmZzNF9zZXF1ZW5jZV9yZXMgKnJlcywKIAkJCQkgICBpbnQgY2FjaGVfcmVwbHkpOwogCi0jaWZkZWYgQ09ORklHX05GU19WNF8xCi1leHRlcm4gdm9pZCBuZnM0MV9zZXF1ZW5jZV9mcmVlX3Nsb3QoY29uc3Qgc3RydWN0IG5mc19jbGllbnQgKiwKLQkJCQkgICAgIHN0cnVjdCBuZnM0X3NlcXVlbmNlX3JlcyAqcmVzKTsKLSNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0XzEgKi8KLQotc3RhdGljIGlubGluZSB2b2lkIG5mczRfc2VxdWVuY2VfZnJlZV9zbG90KGNvbnN0IHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsCi0JCQkJCSAgIHN0cnVjdCBuZnM0X3NlcXVlbmNlX3JlcyAqcmVzKQotewotI2lmZGVmIENPTkZJR19ORlNfVjRfMQotCWlmIChuZnM0X2hhc19zZXNzaW9uKGNscCkpCi0JCW5mczQxX3NlcXVlbmNlX2ZyZWVfc2xvdChjbHAsIHJlcyk7Ci0jZW5kaWYgLyogQ09ORklHX05GU19WNF8xICovCi19Ci0KIC8qCiAgKiBEZXRlcm1pbmUgdGhlIGRldmljZSBuYW1lIGFzIGEgc3RyaW5nCiAgKi8KQEAgLTM4MCwzICszNjYsMTUgQEAKIAlyZXR1cm4gKCh1bnNpZ25lZCBsb25nKWxlbiArICh1bnNpZ25lZCBsb25nKWJhc2UgKwogCQlQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOwogfQorCisvKgorICogSGVscGVyIGZvciByZXN0YXJ0aW5nIFJQQyBjYWxscyBpbiB0aGUgcG9zc2libGUgcHJlc2VuY2Ugb2YgTkZTdjQuMQorICogc2Vzc2lvbnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBuZnNfcmVzdGFydF9ycGMoc3RydWN0IHJwY190YXNrICp0YXNrLCBjb25zdCBzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQoreworCWlmIChuZnM0X2hhc19zZXNzaW9uKGNscCkpCisJCXJwY19yZXN0YXJ0X2NhbGxfcHJlcGFyZSh0YXNrKTsKKwllbHNlCisJCXJwY19yZXN0YXJ0X2NhbGwodGFzayk7Cit9CmRpZmYgLS1naXQgYS9mcy9uZnMvaW9zdGF0LmggYi9mcy9uZnMvaW9zdGF0LmgKaW5kZXggY2VkYTUwYS4uNDZkNzc5YSAxMDA2NDQKLS0tIGEvZnMvbmZzL2lvc3RhdC5oCisrKyBiL2ZzL25mcy9pb3N0YXQuaApAQCAtMjUsMTMgKzI1LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBuZnNfaW5jX3NlcnZlcl9zdGF0cyhjb25zdCBzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLAogCQkJCQllbnVtIG5mc19zdGF0X2V2ZW50Y291bnRlcnMgc3RhdCkKIHsKLQlzdHJ1Y3QgbmZzX2lvc3RhdHMgKmlvc3RhdHM7Ci0JaW50IGNwdTsKLQotCWNwdSA9IGdldF9jcHUoKTsKLQlpb3N0YXRzID0gcGVyX2NwdV9wdHIoc2VydmVyLT5pb19zdGF0cywgY3B1KTsKLQlpb3N0YXRzLT5ldmVudHNbc3RhdF0rKzsKLQlwdXRfY3B1KCk7CisJdGhpc19jcHVfaW5jKHNlcnZlci0+aW9fc3RhdHMtPmV2ZW50c1tzdGF0XSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBuZnNfaW5jX3N0YXRzKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUsCkBAIC00NCwxMyArMzgsNyBAQAogCQkJCQllbnVtIG5mc19zdGF0X2J5dGVjb3VudGVycyBzdGF0LAogCQkJCQl1bnNpZ25lZCBsb25nIGFkZGVuZCkKIHsKLQlzdHJ1Y3QgbmZzX2lvc3RhdHMgKmlvc3RhdHM7Ci0JaW50IGNwdTsKLQotCWNwdSA9IGdldF9jcHUoKTsKLQlpb3N0YXRzID0gcGVyX2NwdV9wdHIoc2VydmVyLT5pb19zdGF0cywgY3B1KTsKLQlpb3N0YXRzLT5ieXRlc1tzdGF0XSArPSBhZGRlbmQ7Ci0JcHV0X2NwdSgpOworCXRoaXNfY3B1X2FkZChzZXJ2ZXItPmlvX3N0YXRzLT5ieXRlc1tzdGF0XSwgYWRkZW5kKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIG5mc19hZGRfc3RhdHMoY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSwKQEAgLTY1LDEzICs1Myw3IEBACiAJCQkJCSBlbnVtIG5mc19zdGF0X2ZzY2FjaGVjb3VudGVycyBzdGF0LAogCQkJCQkgdW5zaWduZWQgbG9uZyBhZGRlbmQpCiB7Ci0Jc3RydWN0IG5mc19pb3N0YXRzICppb3N0YXRzOwotCWludCBjcHU7Ci0KLQljcHUgPSBnZXRfY3B1KCk7Ci0JaW9zdGF0cyA9IHBlcl9jcHVfcHRyKE5GU19TRVJWRVIoaW5vZGUpLT5pb19zdGF0cywgY3B1KTsKLQlpb3N0YXRzLT5mc2NhY2hlW3N0YXRdICs9IGFkZGVuZDsKLQlwdXRfY3B1KCk7CisJdGhpc19jcHVfYWRkKE5GU19TRVJWRVIoaW5vZGUpLT5pb19zdGF0cy0+ZnNjYWNoZVtzdGF0XSwgYWRkZW5kKTsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNF9mcy5oIGIvZnMvbmZzL25mczRfZnMuaAppbmRleCA2ZWEwN2EzLi43ZTU3YjA0IDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNF9mcy5oCisrKyBiL2ZzL25mcy9uZnM0X2ZzLmgKQEAgLTQ0LDcgKzQ0LDggQEAKIAlORlM0Q0xOVF9SRUNMQUlNX1JFQk9PVCwKIAlORlM0Q0xOVF9SRUNMQUlNX05PR1JBQ0UsCiAJTkZTNENMTlRfREVMRUdSRVRVUk4sCi0JTkZTNENMTlRfU0VTU0lPTl9TRVRVUCwKKwlORlM0Q0xOVF9TRVNTSU9OX1JFU0VULAorCU5GUzRDTE5UX1NFU1NJT05fRFJBSU5JTkcsCiB9OwogCiAvKgpAQCAtMTgwLDYgKzE4MSw3IEBACiAJaW50ICgqcmVjb3Zlcl9sb2NrKShzdHJ1Y3QgbmZzNF9zdGF0ZSAqLCBzdHJ1Y3QgZmlsZV9sb2NrICopOwogCWludCAoKmVzdGFibGlzaF9jbGlkKShzdHJ1Y3QgbmZzX2NsaWVudCAqLCBzdHJ1Y3QgcnBjX2NyZWQgKik7CiAJc3RydWN0IHJwY19jcmVkICogKCpnZXRfY2xpZF9jcmVkKShzdHJ1Y3QgbmZzX2NsaWVudCAqKTsKKwlpbnQgKCpyZWNsYWltX2NvbXBsZXRlKShzdHJ1Y3QgbmZzX2NsaWVudCAqKTsKIH07CiAKIHN0cnVjdCBuZnM0X3N0YXRlX21haW50ZW5hbmNlX29wcyB7CkBAIC0yMDAsOSArMjAyLDExIEBACiAvKiBuZnM0cHJvYy5jICovCiBleHRlcm4gaW50IG5mczRfcHJvY19zZXRjbGllbnRpZChzdHJ1Y3QgbmZzX2NsaWVudCAqLCB1MzIsIHVuc2lnbmVkIHNob3J0LCBzdHJ1Y3QgcnBjX2NyZWQgKik7CiBleHRlcm4gaW50IG5mczRfcHJvY19zZXRjbGllbnRpZF9jb25maXJtKHN0cnVjdCBuZnNfY2xpZW50ICosIHN0cnVjdCBycGNfY3JlZCAqKTsKK2V4dGVybiBpbnQgbmZzNF9wcm9jX2V4Y2hhbmdlX2lkKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCk7CiBleHRlcm4gaW50IG5mczRfcHJvY19hc3luY19yZW5ldyhzdHJ1Y3QgbmZzX2NsaWVudCAqLCBzdHJ1Y3QgcnBjX2NyZWQgKik7CiBleHRlcm4gaW50IG5mczRfcHJvY19yZW5ldyhzdHJ1Y3QgbmZzX2NsaWVudCAqLCBzdHJ1Y3QgcnBjX2NyZWQgKik7CiBleHRlcm4gaW50IG5mczRfaW5pdF9jbGllbnRpZChzdHJ1Y3QgbmZzX2NsaWVudCAqLCBzdHJ1Y3QgcnBjX2NyZWQgKik7CitleHRlcm4gaW50IG5mczQxX2luaXRfY2xpZW50aWQoc3RydWN0IG5mc19jbGllbnQgKiwgc3RydWN0IHJwY19jcmVkICopOwogZXh0ZXJuIGludCBuZnM0X2RvX2Nsb3NlKHN0cnVjdCBwYXRoICpwYXRoLCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUsIGludCB3YWl0KTsKIGV4dGVybiBzdHJ1Y3QgZGVudHJ5ICpuZnM0X2F0b21pY19vcGVuKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBuYW1laWRhdGEgKik7CiBleHRlcm4gaW50IG5mczRfb3Blbl9yZXZhbGlkYXRlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCwgc3RydWN0IG5hbWVpZGF0YSAqKTsKQEAgLTIxOCw5ICsyMjIsMTEgQEAKIAkJaW50IGNhY2hlX3JlcGx5LCBzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spOwogZXh0ZXJuIHZvaWQgbmZzNF9kZXN0cm95X3Nlc3Npb24oc3RydWN0IG5mczRfc2Vzc2lvbiAqc2Vzc2lvbik7CiBleHRlcm4gc3RydWN0IG5mczRfc2Vzc2lvbiAqbmZzNF9hbGxvY19zZXNzaW9uKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApOwotZXh0ZXJuIGludCBuZnM0X3Byb2NfY3JlYXRlX3Nlc3Npb24oc3RydWN0IG5mc19jbGllbnQgKiwgaW50IHJlc2V0KTsKK2V4dGVybiBpbnQgbmZzNF9wcm9jX2NyZWF0ZV9zZXNzaW9uKHN0cnVjdCBuZnNfY2xpZW50ICopOwogZXh0ZXJuIGludCBuZnM0X3Byb2NfZGVzdHJveV9zZXNzaW9uKHN0cnVjdCBuZnM0X3Nlc3Npb24gKik7CiBleHRlcm4gaW50IG5mczRfaW5pdF9zZXNzaW9uKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIpOworZXh0ZXJuIGludCBuZnM0X3Byb2NfZ2V0X2xlYXNlX3RpbWUoc3RydWN0IG5mc19jbGllbnQgKmNscCwKKwkJc3RydWN0IG5mc19mc2luZm8gKmZzaW5mbyk7CiAjZWxzZSAvKiBDT05GSUdfTkZTX3Y0XzEgKi8KIHN0YXRpYyBpbmxpbmUgaW50IG5mczRfc2V0dXBfc2VxdWVuY2Uoc3RydWN0IG5mc19jbGllbnQgKmNscCwKIAkJc3RydWN0IG5mczRfc2VxdWVuY2VfYXJncyAqYXJncywgc3RydWN0IG5mczRfc2VxdWVuY2VfcmVzICpyZXMsCkBAIC0yNjcsNiArMjczLDcgQEAKIGV4dGVybiB2b2lkIG5mczRfc2NoZWR1bGVfc3RhdGVfcmVjb3Zlcnkoc3RydWN0IG5mc19jbGllbnQgKik7CiBleHRlcm4gdm9pZCBuZnM0X3NjaGVkdWxlX3N0YXRlX21hbmFnZXIoc3RydWN0IG5mc19jbGllbnQgKik7CiBleHRlcm4gaW50IG5mczRfc3RhdGVfbWFya19yZWNsYWltX25vZ3JhY2Uoc3RydWN0IG5mc19jbGllbnQgKmNscCwgc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlKTsKK2V4dGVybiB2b2lkIG5mczQxX2hhbmRsZV9zZXF1ZW5jZV9mbGFnX2Vycm9ycyhzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLCB1MzIgZmxhZ3MpOwogZXh0ZXJuIHZvaWQgbmZzNF9wdXRfbG9ja19zdGF0ZShzdHJ1Y3QgbmZzNF9sb2NrX3N0YXRlICpsc3ApOwogZXh0ZXJuIGludCBuZnM0X3NldF9sb2NrX3N0YXRlKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgc3RydWN0IGZpbGVfbG9jayAqZmwpOwogZXh0ZXJuIHZvaWQgbmZzNF9jb3B5X3N0YXRlaWQobmZzNF9zdGF0ZWlkICosIHN0cnVjdCBuZnM0X3N0YXRlICosIGZsX293bmVyX3QpOwpAQCAtMjg3LDYgKzI5NCw3IEBACiAKIC8qIGNhbGxiYWNrX3hkci5jICovCiBleHRlcm4gc3RydWN0IHN2Y192ZXJzaW9uIG5mczRfY2FsbGJhY2tfdmVyc2lvbjE7CitleHRlcm4gc3RydWN0IHN2Y192ZXJzaW9uIG5mczRfY2FsbGJhY2tfdmVyc2lvbjQ7CiAKICNlbHNlCiAKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0cHJvYy5jIGIvZnMvbmZzL25mczRwcm9jLmMKaW5kZXggNzQxYTU2Mi4uOWY1ZjExZSAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRwcm9jLmMKKysrIGIvZnMvbmZzL25mczRwcm9jLmMKQEAgLTI3MCwxMSArMjcwLDE4IEBACiAJCWNhc2UgLU5GUzRFUlJfU0VRX01JU09SREVSRUQ6CiAJCQlkcHJpbnRrKCIlcyBFUlJPUjogJWQgUmVzZXQgc2Vzc2lvblxuIiwgX19mdW5jX18sCiAJCQkJZXJyb3Jjb2RlKTsKLQkJCXNldF9iaXQoTkZTNENMTlRfU0VTU0lPTl9TRVRVUCwgJmNscC0+Y2xfc3RhdGUpOworCQkJbmZzNF9zY2hlZHVsZV9zdGF0ZV9yZWNvdmVyeShjbHApOwogCQkJZXhjZXB0aW9uLT5yZXRyeSA9IDE7Ci0JCQkvKiBGQUxMVEhST1VHSCAqLworCQkJYnJlYWs7CiAjZW5kaWYgLyogIWRlZmluZWQoQ09ORklHX05GU19WNF8xKSAqLwogCQljYXNlIC1ORlM0RVJSX0ZJTEVfT1BFTjoKKwkJCWlmIChleGNlcHRpb24tPnRpbWVvdXQgPiBIWikgeworCQkJCS8qIFdlIGhhdmUgcmV0cmllZCBhIGRlY2VudCBhbW91bnQsIHRpbWUgdG8KKwkJCQkgKiBmYWlsCisJCQkJICovCisJCQkJcmV0ID0gLUVCVVNZOworCQkJCWJyZWFrOworCQkJfQogCQljYXNlIC1ORlM0RVJSX0dSQUNFOgogCQljYXNlIC1ORlM0RVJSX0RFTEFZOgogCQkJcmV0ID0gbmZzNF9kZWxheShzZXJ2ZXItPmNsaWVudCwgJmV4Y2VwdGlvbi0+dGltZW91dCk7CkBAIC0zMTEsNDggKzMxOCw1NCBAQAogICogc28gd2UgbmVlZCB0byBzY2FuIGRvd24gZnJvbSBoaWdoZXN0X3VzZWRfc2xvdGlkIHRvIDAgbG9va2luZyBmb3IgdGhlIG5vdwogICogaGlnaGVzdCBzbG90aWQgaW4gdXNlLgogICogSWYgbm9uZSBmb3VuZCwgaGlnaGVzdF91c2VkX3Nsb3RpZCBpcyBzZXQgdG8gLTEuCisgKgorICogTXVzdCBiZSBjYWxsZWQgd2hpbGUgaG9sZGluZyB0YmwtPnNsb3RfdGJsX2xvY2sKICAqLwogc3RhdGljIHZvaWQKIG5mczRfZnJlZV9zbG90KHN0cnVjdCBuZnM0X3Nsb3RfdGFibGUgKnRibCwgdTggZnJlZV9zbG90aWQpCiB7CiAJaW50IHNsb3RpZCA9IGZyZWVfc2xvdGlkOwogCi0Jc3Bpbl9sb2NrKCZ0YmwtPnNsb3RfdGJsX2xvY2spOwogCS8qIGNsZWFyIHVzZWQgYml0IGluIGJpdG1hcCAqLwogCV9fY2xlYXJfYml0KHNsb3RpZCwgdGJsLT51c2VkX3Nsb3RzKTsKIAogCS8qIHVwZGF0ZSBoaWdoZXN0X3VzZWRfc2xvdGlkIHdoZW4gaXQgaXMgZnJlZWQgKi8KIAlpZiAoc2xvdGlkID09IHRibC0+aGlnaGVzdF91c2VkX3Nsb3RpZCkgewogCQlzbG90aWQgPSBmaW5kX2xhc3RfYml0KHRibC0+dXNlZF9zbG90cywgdGJsLT5tYXhfc2xvdHMpOwotCQlpZiAoc2xvdGlkID49IDAgJiYgc2xvdGlkIDwgdGJsLT5tYXhfc2xvdHMpCisJCWlmIChzbG90aWQgPCB0YmwtPm1heF9zbG90cykKIAkJCXRibC0+aGlnaGVzdF91c2VkX3Nsb3RpZCA9IHNsb3RpZDsKIAkJZWxzZQogCQkJdGJsLT5oaWdoZXN0X3VzZWRfc2xvdGlkID0gLTE7CiAJfQotCXJwY193YWtlX3VwX25leHQoJnRibC0+c2xvdF90Ymxfd2FpdHEpOwotCXNwaW5fdW5sb2NrKCZ0YmwtPnNsb3RfdGJsX2xvY2spOwogCWRwcmludGsoIiVzOiBmcmVlX3Nsb3RpZCAldSBoaWdoZXN0X3VzZWRfc2xvdGlkICVkXG4iLCBfX2Z1bmNfXywKIAkJZnJlZV9zbG90aWQsIHRibC0+aGlnaGVzdF91c2VkX3Nsb3RpZCk7CiB9CiAKLXZvaWQgbmZzNDFfc2VxdWVuY2VfZnJlZV9zbG90KGNvbnN0IHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsCitzdGF0aWMgdm9pZCBuZnM0MV9zZXF1ZW5jZV9mcmVlX3Nsb3QoY29uc3Qgc3RydWN0IG5mc19jbGllbnQgKmNscCwKIAkJCSAgICAgIHN0cnVjdCBuZnM0X3NlcXVlbmNlX3JlcyAqcmVzKQogewogCXN0cnVjdCBuZnM0X3Nsb3RfdGFibGUgKnRibDsKIAotCWlmICghbmZzNF9oYXNfc2Vzc2lvbihjbHApKSB7Ci0JCWRwcmludGsoIiVzOiBObyBzZXNzaW9uXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9CiAJdGJsID0gJmNscC0+Y2xfc2Vzc2lvbi0+ZmNfc2xvdF90YWJsZTsKIAlpZiAocmVzLT5zcl9zbG90aWQgPT0gTkZTNF9NQVhfU0xPVF9UQUJMRSkgewotCQlkcHJpbnRrKCIlczogTm8gc2xvdFxuIiwgX19mdW5jX18pOwogCQkvKiBqdXN0IHdha2UgdXAgdGhlIG5leHQgZ3V5IHdhaXRpbmcgc2luY2UKIAkJICogd2UgbWF5IGhhdmUgbm90IGNvbnN1bWVkIGEgc2xvdCBhZnRlciBhbGwgKi8KLQkJcnBjX3dha2VfdXBfbmV4dCgmdGJsLT5zbG90X3RibF93YWl0cSk7CisJCWRwcmludGsoIiVzOiBObyBzbG90XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CisKKwlzcGluX2xvY2soJnRibC0+c2xvdF90YmxfbG9jayk7CiAJbmZzNF9mcmVlX3Nsb3QodGJsLCByZXMtPnNyX3Nsb3RpZCk7CisKKwkvKiBTaWduYWwgc3RhdGUgbWFuYWdlciB0aHJlYWQgaWYgc2Vzc2lvbiBpcyBkcmFpbmVkICovCisJaWYgKHRlc3RfYml0KE5GUzRDTE5UX1NFU1NJT05fRFJBSU5JTkcsICZjbHAtPmNsX3N0YXRlKSkgeworCQlpZiAodGJsLT5oaWdoZXN0X3VzZWRfc2xvdGlkID09IC0xKSB7CisJCQlkcHJpbnRrKCIlcyBDT01QTEVURTogU2Vzc2lvbiBEcmFpbmVkXG4iLCBfX2Z1bmNfXyk7CisJCQljb21wbGV0ZSgmY2xwLT5jbF9zZXNzaW9uLT5jb21wbGV0ZSk7CisJCX0KKwl9IGVsc2UKKwkJcnBjX3dha2VfdXBfbmV4dCgmdGJsLT5zbG90X3RibF93YWl0cSk7CisJc3Bpbl91bmxvY2soJnRibC0+c2xvdF90YmxfbG9jayk7CiAJcmVzLT5zcl9zbG90aWQgPSBORlM0X01BWF9TTE9UX1RBQkxFOwogfQogCkBAIC0zNzcsMTAgKzM5MCwxMCBAQAogCWlmIChyZXMtPnNyX3Nsb3RpZCA9PSBORlM0X01BWF9TTE9UX1RBQkxFKQogCQlnb3RvIG91dDsKIAotCXRibCA9ICZjbHAtPmNsX3Nlc3Npb24tPmZjX3Nsb3RfdGFibGU7Ci0Jc2xvdCA9IHRibC0+c2xvdHMgKyByZXMtPnNyX3Nsb3RpZDsKLQorCS8qIENoZWNrIHRoZSBTRVFVRU5DRSBvcGVyYXRpb24gc3RhdHVzICovCiAJaWYgKHJlcy0+c3Jfc3RhdHVzID09IDApIHsKKwkJdGJsID0gJmNscC0+Y2xfc2Vzc2lvbi0+ZmNfc2xvdF90YWJsZTsKKwkJc2xvdCA9IHRibC0+c2xvdHMgKyByZXMtPnNyX3Nsb3RpZDsKIAkJLyogVXBkYXRlIHRoZSBzbG90J3Mgc2VxdWVuY2UgYW5kIGNsaWVudGlkIGxlYXNlIHRpbWVyICovCiAJCSsrc2xvdC0+c2VxX25yOwogCQl0aW1lc3RhbXAgPSByZXMtPnNyX3JlbmV3YWxfdGltZTsKQEAgLTM4OCw3ICs0MDEsOCBAQAogCQlpZiAodGltZV9iZWZvcmUoY2xwLT5jbF9sYXN0X3JlbmV3YWwsIHRpbWVzdGFtcCkpCiAJCQljbHAtPmNsX2xhc3RfcmVuZXdhbCA9IHRpbWVzdGFtcDsKIAkJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7Ci0JCXJldHVybjsKKwkJLyogQ2hlY2sgc2VxdWVuY2UgZmxhZ3MgKi8KKwkJbmZzNDFfaGFuZGxlX3NlcXVlbmNlX2ZsYWdfZXJyb3JzKGNscCwgcmVzLT5zcl9zdGF0dXNfZmxhZ3MpOwogCX0KIG91dDoKIAkvKiBUaGUgc2Vzc2lvbiBtYXkgYmUgcmVzZXQgYnkgb25lIG9mIHRoZSBlcnJvciBoYW5kbGVycy4gKi8KQEAgLTQyOSwyNCArNDQzLDYgQEAKIAlyZXR1cm4gcmV0X2lkOwogfQogCi1zdGF0aWMgaW50IG5mczRfcmVjb3Zlcl9zZXNzaW9uKHN0cnVjdCBuZnM0X3Nlc3Npb24gKnNlc3Npb24pCi17Ci0Jc3RydWN0IG5mc19jbGllbnQgKmNscCA9IHNlc3Npb24tPmNscDsKLQl1bnNpZ25lZCBpbnQgbG9vcDsKLQlpbnQgcmV0OwotCi0JZm9yIChsb29wID0gTkZTNF9NQVhfTE9PUF9PTl9SRUNPVkVSOyBsb29wICE9IDA7IGxvb3AtLSkgewotCQlyZXQgPSBuZnM0X3dhaXRfY2xudF9yZWNvdmVyKGNscCk7Ci0JCWlmIChyZXQgIT0gMCkKLQkJCWJyZWFrOwotCQlpZiAoIXRlc3RfYml0KE5GUzRDTE5UX1NFU1NJT05fU0VUVVAsICZjbHAtPmNsX3N0YXRlKSkKLQkJCWJyZWFrOwotCQluZnM0X3NjaGVkdWxlX3N0YXRlX21hbmFnZXIoY2xwKTsKLQkJcmV0ID0gLUVJTzsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQogc3RhdGljIGludCBuZnM0MV9zZXR1cF9zZXF1ZW5jZShzdHJ1Y3QgbmZzNF9zZXNzaW9uICpzZXNzaW9uLAogCQkJCXN0cnVjdCBuZnM0X3NlcXVlbmNlX2FyZ3MgKmFyZ3MsCiAJCQkJc3RydWN0IG5mczRfc2VxdWVuY2VfcmVzICpyZXMsCkBAIC00NTUsNyArNDUxLDYgQEAKIHsKIAlzdHJ1Y3QgbmZzNF9zbG90ICpzbG90OwogCXN0cnVjdCBuZnM0X3Nsb3RfdGFibGUgKnRibDsKLQlpbnQgc3RhdHVzID0gMDsKIAl1OCBzbG90aWQ7CiAKIAlkcHJpbnRrKCItLT4gJXNcbiIsIF9fZnVuY19fKTsKQEAgLTQ2OCwyMSArNDYzLDE1IEBACiAJdGJsID0gJnNlc3Npb24tPmZjX3Nsb3RfdGFibGU7CiAKIAlzcGluX2xvY2soJnRibC0+c2xvdF90YmxfbG9jayk7Ci0JaWYgKHRlc3RfYml0KE5GUzRDTE5UX1NFU1NJT05fU0VUVVAsICZzZXNzaW9uLT5jbHAtPmNsX3N0YXRlKSkgewotCQlpZiAodGJsLT5oaWdoZXN0X3VzZWRfc2xvdGlkICE9IC0xKSB7Ci0JCQlycGNfc2xlZXBfb24oJnRibC0+c2xvdF90Ymxfd2FpdHEsIHRhc2ssIE5VTEwpOwotCQkJc3Bpbl91bmxvY2soJnRibC0+c2xvdF90YmxfbG9jayk7Ci0JCQlkcHJpbnRrKCI8LS0gJXM6IFNlc3Npb24gcmVzZXQ6IGRyYWluaW5nXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gLUVBR0FJTjsKLQkJfQotCi0JCS8qIFRoZSBzbG90IHRhYmxlIGlzIGVtcHR5OyBzdGFydCB0aGUgcmVzZXQgdGhyZWFkICovCi0JCWRwcmludGsoIiVzIFNlc3Npb24gUmVzZXRcbiIsIF9fZnVuY19fKTsKKwlpZiAodGVzdF9iaXQoTkZTNENMTlRfU0VTU0lPTl9EUkFJTklORywgJnNlc3Npb24tPmNscC0+Y2xfc3RhdGUpKSB7CisJCS8qCisJCSAqIFRoZSBzdGF0ZSBtYW5hZ2VyIHdpbGwgd2FpdCB1bnRpbCB0aGUgc2xvdCB0YWJsZSBpcyBlbXB0eS4KKwkJICogU2NoZWR1bGUgdGhlIHJlc2V0IHRocmVhZAorCQkgKi8KKwkJcnBjX3NsZWVwX29uKCZ0YmwtPnNsb3RfdGJsX3dhaXRxLCB0YXNrLCBOVUxMKTsKIAkJc3Bpbl91bmxvY2soJnRibC0+c2xvdF90YmxfbG9jayk7Ci0JCXN0YXR1cyA9IG5mczRfcmVjb3Zlcl9zZXNzaW9uKHNlc3Npb24pOwotCQlpZiAoc3RhdHVzKQotCQkJcmV0dXJuIHN0YXR1czsKLQkJc3Bpbl9sb2NrKCZ0YmwtPnNsb3RfdGJsX2xvY2spOworCQlkcHJpbnRrKCIlcyBTY2hlZHVsZSBTZXNzaW9uIFJlc2V0XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUFHQUlOOwogCX0KIAogCXNsb3RpZCA9IG5mczRfZmluZF9zbG90KHRibCwgdGFzayk7CkBAIC01MjcsNyArNTE2LDcgQEAKIAkJZ290byBvdXQ7CiAJcmV0ID0gbmZzNDFfc2V0dXBfc2VxdWVuY2UoY2xwLT5jbF9zZXNzaW9uLCBhcmdzLCByZXMsIGNhY2hlX3JlcGx5LAogCQkJCSAgIHRhc2spOwotCWlmIChyZXQgIT0gLUVBR0FJTikgeworCWlmIChyZXQgJiYgcmV0ICE9IC1FQUdBSU4pIHsKIAkJLyogdGVybWluYXRlIHJwYyB0YXNrICovCiAJCXRhc2stPnRrX3N0YXR1cyA9IHJldDsKIAkJdGFzay0+dGtfYWN0aW9uID0gTlVMTDsKQEAgLTU2MSw3ICs1NTAsNiBAQAogCXN0cnVjdCBuZnM0MV9jYWxsX3N5bmNfZGF0YSAqZGF0YSA9IGNhbGxkYXRhOwogCiAJbmZzNDFfc2VxdWVuY2VfZG9uZShkYXRhLT5jbHAsIGRhdGEtPnNlcV9yZXMsIHRhc2stPnRrX3N0YXR1cyk7Ci0JbmZzNDFfc2VxdWVuY2VfZnJlZV9zbG90KGRhdGEtPmNscCwgZGF0YS0+c2VxX3Jlcyk7CiB9CiAKIHN0cnVjdCBycGNfY2FsbF9vcHMgbmZzNDFfY2FsbF9zeW5jX29wcyA9IHsKQEAgLTYzNywxNSArNjI1LDYgQEAKICNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0XzEgKi8KIH0KIAotLyogbm8gcmVzdGFydCwgdGhlcmVmb3JlIGZyZWUgc2xvdCBoZXJlICovCi1zdGF0aWMgdm9pZCBuZnM0X3NlcXVlbmNlX2RvbmVfZnJlZV9zbG90KGNvbnN0IHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsCi0JCQkJCSBzdHJ1Y3QgbmZzNF9zZXF1ZW5jZV9yZXMgKnJlcywKLQkJCQkJIGludCBycGNfc3RhdHVzKQotewotCW5mczRfc2VxdWVuY2VfZG9uZShzZXJ2ZXIsIHJlcywgcnBjX3N0YXR1cyk7Ci0JbmZzNF9zZXF1ZW5jZV9mcmVlX3Nsb3Qoc2VydmVyLT5uZnNfY2xpZW50LCByZXMpOwotfQotCiBzdGF0aWMgdm9pZCB1cGRhdGVfY2hhbmdlYXR0cihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IG5mczRfY2hhbmdlX2luZm8gKmNpbmZvKQogewogCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShkaXIpOwpAQCAtNzIwLDkgKzY5OSwxNSBAQAogCXAtPm9fYXJnLmJpdG1hc2sgPSBzZXJ2ZXItPmF0dHJfYml0bWFzazsKIAlwLT5vX2FyZy5jbGFpbSA9IE5GUzRfT1BFTl9DTEFJTV9OVUxMOwogCWlmIChmbGFncyAmIE9fRVhDTCkgewotCQl1MzIgKnMgPSAodTMyICopIHAtPm9fYXJnLnUudmVyaWZpZXIuZGF0YTsKLQkJc1swXSA9IGppZmZpZXM7Ci0JCXNbMV0gPSBjdXJyZW50LT5waWQ7CisJCWlmIChuZnM0X2hhc19wZXJzaXN0ZW50X3Nlc3Npb24oc2VydmVyLT5uZnNfY2xpZW50KSkgeworCQkJLyogR1VBUkRFRCAqLworCQkJcC0+b19hcmcudS5hdHRycyA9ICZwLT5hdHRyczsKKwkJCW1lbWNweSgmcC0+YXR0cnMsIGF0dHJzLCBzaXplb2YocC0+YXR0cnMpKTsKKwkJfSBlbHNlIHsgLyogRVhDTFVTSVZFNF8xICovCisJCQl1MzIgKnMgPSAodTMyICopIHAtPm9fYXJnLnUudmVyaWZpZXIuZGF0YTsKKwkJCXNbMF0gPSBqaWZmaWVzOworCQkJc1sxXSA9IGN1cnJlbnQtPnBpZDsKKwkJfQogCX0gZWxzZSBpZiAoZmxhZ3MgJiBPX0NSRUFUKSB7CiAJCXAtPm9fYXJnLnUuYXR0cnMgPSAmcC0+YXR0cnM7CiAJCW1lbWNweSgmcC0+YXR0cnMsIGF0dHJzLCBzaXplb2YocC0+YXR0cnMpKTsKQEAgLTc3NiwxMyArNzYxLDE2IEBACiAJCWdvdG8gb3V0OwogCXN3aXRjaCAobW9kZSAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKSkgewogCQljYXNlIEZNT0RFX1JFQUQ6Ci0JCQlyZXQgfD0gdGVzdF9iaXQoTkZTX09fUkRPTkxZX1NUQVRFLCAmc3RhdGUtPmZsYWdzKSAhPSAwOworCQkJcmV0IHw9IHRlc3RfYml0KE5GU19PX1JET05MWV9TVEFURSwgJnN0YXRlLT5mbGFncykgIT0gMAorCQkJCSYmIHN0YXRlLT5uX3Jkb25seSAhPSAwOwogCQkJYnJlYWs7CiAJCWNhc2UgRk1PREVfV1JJVEU6Ci0JCQlyZXQgfD0gdGVzdF9iaXQoTkZTX09fV1JPTkxZX1NUQVRFLCAmc3RhdGUtPmZsYWdzKSAhPSAwOworCQkJcmV0IHw9IHRlc3RfYml0KE5GU19PX1dST05MWV9TVEFURSwgJnN0YXRlLT5mbGFncykgIT0gMAorCQkJCSYmIHN0YXRlLT5uX3dyb25seSAhPSAwOwogCQkJYnJlYWs7CiAJCWNhc2UgRk1PREVfUkVBRHxGTU9ERV9XUklURToKLQkJCXJldCB8PSB0ZXN0X2JpdChORlNfT19SRFdSX1NUQVRFLCAmc3RhdGUtPmZsYWdzKSAhPSAwOworCQkJcmV0IHw9IHRlc3RfYml0KE5GU19PX1JEV1JfU1RBVEUsICZzdGF0ZS0+ZmxhZ3MpICE9IDAKKwkJCQkmJiBzdGF0ZS0+bl9yZHdyICE9IDA7CiAJfQogb3V0OgogCXJldHVybiByZXQ7CkBAIC0xMTgzLDYgKzExNzEsMTQgQEAKIAkJCWNhc2UgLUVOT0VOVDoKIAkJCWNhc2UgLUVTVEFMRToKIAkJCQlnb3RvIG91dDsKKwkJCWNhc2UgLU5GUzRFUlJfQkFEU0VTU0lPTjoKKwkJCWNhc2UgLU5GUzRFUlJfQkFEU0xPVDoKKwkJCWNhc2UgLU5GUzRFUlJfQkFEX0hJR0hfU0xPVDoKKwkJCWNhc2UgLU5GUzRFUlJfQ09OTl9OT1RfQk9VTkRfVE9fU0VTU0lPTjoKKwkJCWNhc2UgLU5GUzRFUlJfREVBRFNFU1NJT046CisJCQkJbmZzNF9zY2hlZHVsZV9zdGF0ZV9yZWNvdmVyeSgKKwkJCQkJc2VydmVyLT5uZnNfY2xpZW50KTsKKwkJCQlnb3RvIG91dDsKIAkJCWNhc2UgLU5GUzRFUlJfU1RBTEVfQ0xJRU5USUQ6CiAJCQljYXNlIC1ORlM0RVJSX1NUQUxFX1NUQVRFSUQ6CiAJCQljYXNlIC1ORlM0RVJSX0VYUElSRUQ6CkBAIC0xMzM2LDggKzEzMzIsOCBAQAogCiAJZGF0YS0+cnBjX3N0YXR1cyA9IHRhc2stPnRrX3N0YXR1czsKIAotCW5mczRfc2VxdWVuY2VfZG9uZV9mcmVlX3Nsb3QoZGF0YS0+b19hcmcuc2VydmVyLCAmZGF0YS0+b19yZXMuc2VxX3JlcywKLQkJCQkgICAgIHRhc2stPnRrX3N0YXR1cyk7CisJbmZzNF9zZXF1ZW5jZV9kb25lKGRhdGEtPm9fYXJnLnNlcnZlciwgJmRhdGEtPm9fcmVzLnNlcV9yZXMsCisJCQl0YXNrLT50a19zdGF0dXMpOwogCiAJaWYgKFJQQ19BU1NBU1NJTkFURUQodGFzaykpCiAJCXJldHVybjsKQEAgLTE0ODgsNyArMTQ4NCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgbmZzNF9kb19vcGVuX2V4cGlyZWQoc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCwgc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlKQorc3RhdGljIGludCBuZnM0X2RvX29wZW5fZXhwaXJlZChzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4LCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUpCiB7CiAJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TRVJWRVIoc3RhdGUtPmlub2RlKTsKIAlzdHJ1Y3QgbmZzNF9leGNlcHRpb24gZXhjZXB0aW9uID0geyB9OwpAQCAtMTQ5NiwxMCArMTQ5MiwxNiBAQAogCiAJZG8gewogCQllcnIgPSBfbmZzNF9vcGVuX2V4cGlyZWQoY3R4LCBzdGF0ZSk7Ci0JCWlmIChlcnIgIT0gLU5GUzRFUlJfREVMQVkpCi0JCQlicmVhazsKLQkJbmZzNF9oYW5kbGVfZXhjZXB0aW9uKHNlcnZlciwgZXJyLCAmZXhjZXB0aW9uKTsKKwkJc3dpdGNoIChlcnIpIHsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gb3V0OworCQljYXNlIC1ORlM0RVJSX0dSQUNFOgorCQljYXNlIC1ORlM0RVJSX0RFTEFZOgorCQkJbmZzNF9oYW5kbGVfZXhjZXB0aW9uKHNlcnZlciwgZXJyLCAmZXhjZXB0aW9uKTsKKwkJCWVyciA9IDA7CisJCX0KIAl9IHdoaWxlIChleGNlcHRpb24ucmV0cnkpOworb3V0OgogCXJldHVybiBlcnI7CiB9CiAKQEAgLTE3MTIsNiArMTcxNCwxOCBAQAogCWtmcmVlKGNhbGxkYXRhKTsKIH0KIAorc3RhdGljIHZvaWQgbmZzNF9jbG9zZV9jbGVhcl9zdGF0ZWlkX2ZsYWdzKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwKKwkJZm1vZGVfdCBmbW9kZSkKK3sKKwlzcGluX2xvY2soJnN0YXRlLT5vd25lci0+c29fbG9jayk7CisJaWYgKCEoZm1vZGUgJiBGTU9ERV9SRUFEKSkKKwkJY2xlYXJfYml0KE5GU19PX1JET05MWV9TVEFURSwgJnN0YXRlLT5mbGFncyk7CisJaWYgKCEoZm1vZGUgJiBGTU9ERV9XUklURSkpCisJCWNsZWFyX2JpdChORlNfT19XUk9OTFlfU1RBVEUsICZzdGF0ZS0+ZmxhZ3MpOworCWNsZWFyX2JpdChORlNfT19SRFdSX1NUQVRFLCAmc3RhdGUtPmZsYWdzKTsKKwlzcGluX3VubG9jaygmc3RhdGUtPm93bmVyLT5zb19sb2NrKTsKK30KKwogc3RhdGljIHZvaWQgbmZzNF9jbG9zZV9kb25lKHN0cnVjdCBycGNfdGFzayAqdGFzaywgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgbmZzNF9jbG9zZWRhdGEgKmNhbGxkYXRhID0gZGF0YTsKQEAgLTE3MjgsNiArMTc0Miw4IEBACiAJCWNhc2UgMDoKIAkJCW5mc19zZXRfb3Blbl9zdGF0ZWlkKHN0YXRlLCAmY2FsbGRhdGEtPnJlcy5zdGF0ZWlkLCAwKTsKIAkJCXJlbmV3X2xlYXNlKHNlcnZlciwgY2FsbGRhdGEtPnRpbWVzdGFtcCk7CisJCQluZnM0X2Nsb3NlX2NsZWFyX3N0YXRlaWRfZmxhZ3Moc3RhdGUsCisJCQkJCWNhbGxkYXRhLT5hcmcuZm1vZGUpOwogCQkJYnJlYWs7CiAJCWNhc2UgLU5GUzRFUlJfU1RBTEVfU1RBVEVJRDoKIAkJY2FzZSAtTkZTNEVSUl9PTERfU1RBVEVJRDoKQEAgLTE3MzcsMTEgKzE3NTMsMTAgQEAKIAkJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWlmIChuZnM0X2FzeW5jX2hhbmRsZV9lcnJvcih0YXNrLCBzZXJ2ZXIsIHN0YXRlKSA9PSAtRUFHQUlOKSB7Ci0JCQkJbmZzNF9yZXN0YXJ0X3JwYyh0YXNrLCBzZXJ2ZXItPm5mc19jbGllbnQpOworCQkJCW5mc19yZXN0YXJ0X3JwYyh0YXNrLCBzZXJ2ZXItPm5mc19jbGllbnQpOwogCQkJCXJldHVybjsKIAkJCX0KIAl9Ci0JbmZzNF9zZXF1ZW5jZV9mcmVlX3Nsb3Qoc2VydmVyLT5uZnNfY2xpZW50LCAmY2FsbGRhdGEtPnJlcy5zZXFfcmVzKTsKIAluZnNfcmVmcmVzaF9pbm9kZShjYWxsZGF0YS0+aW5vZGUsIGNhbGxkYXRhLT5yZXMuZmF0dHIpOwogfQogCkBAIC0xNzQ5LDM4ICsxNzY0LDM5IEBACiB7CiAJc3RydWN0IG5mczRfY2xvc2VkYXRhICpjYWxsZGF0YSA9IGRhdGE7CiAJc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlID0gY2FsbGRhdGEtPnN0YXRlOwotCWludCBjbGVhcl9yZCwgY2xlYXJfd3IsIGNsZWFyX3Jkd3I7CisJaW50IGNhbGxfY2xvc2UgPSAwOwogCiAJaWYgKG5mc193YWl0X29uX3NlcXVlbmNlKGNhbGxkYXRhLT5hcmcuc2VxaWQsIHRhc2spICE9IDApCiAJCXJldHVybjsKIAotCWNsZWFyX3JkID0gY2xlYXJfd3IgPSBjbGVhcl9yZHdyID0gMDsKKwl0YXNrLT50a19tc2cucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfT1BFTl9ET1dOR1JBREVdOworCWNhbGxkYXRhLT5hcmcuZm1vZGUgPSBGTU9ERV9SRUFEfEZNT0RFX1dSSVRFOwogCXNwaW5fbG9jaygmc3RhdGUtPm93bmVyLT5zb19sb2NrKTsKIAkvKiBDYWxjdWxhdGUgdGhlIGNoYW5nZSBpbiBvcGVuIG1vZGUgKi8KIAlpZiAoc3RhdGUtPm5fcmR3ciA9PSAwKSB7CiAJCWlmIChzdGF0ZS0+bl9yZG9ubHkgPT0gMCkgewotCQkJY2xlYXJfcmQgfD0gdGVzdF9hbmRfY2xlYXJfYml0KE5GU19PX1JET05MWV9TVEFURSwgJnN0YXRlLT5mbGFncyk7Ci0JCQljbGVhcl9yZHdyIHw9IHRlc3RfYW5kX2NsZWFyX2JpdChORlNfT19SRFdSX1NUQVRFLCAmc3RhdGUtPmZsYWdzKTsKKwkJCWNhbGxfY2xvc2UgfD0gdGVzdF9iaXQoTkZTX09fUkRPTkxZX1NUQVRFLCAmc3RhdGUtPmZsYWdzKTsKKwkJCWNhbGxfY2xvc2UgfD0gdGVzdF9iaXQoTkZTX09fUkRXUl9TVEFURSwgJnN0YXRlLT5mbGFncyk7CisJCQljYWxsZGF0YS0+YXJnLmZtb2RlICY9IH5GTU9ERV9SRUFEOwogCQl9CiAJCWlmIChzdGF0ZS0+bl93cm9ubHkgPT0gMCkgewotCQkJY2xlYXJfd3IgfD0gdGVzdF9hbmRfY2xlYXJfYml0KE5GU19PX1dST05MWV9TVEFURSwgJnN0YXRlLT5mbGFncyk7Ci0JCQljbGVhcl9yZHdyIHw9IHRlc3RfYW5kX2NsZWFyX2JpdChORlNfT19SRFdSX1NUQVRFLCAmc3RhdGUtPmZsYWdzKTsKKwkJCWNhbGxfY2xvc2UgfD0gdGVzdF9iaXQoTkZTX09fV1JPTkxZX1NUQVRFLCAmc3RhdGUtPmZsYWdzKTsKKwkJCWNhbGxfY2xvc2UgfD0gdGVzdF9iaXQoTkZTX09fUkRXUl9TVEFURSwgJnN0YXRlLT5mbGFncyk7CisJCQljYWxsZGF0YS0+YXJnLmZtb2RlICY9IH5GTU9ERV9XUklURTsKIAkJfQogCX0KIAlzcGluX3VubG9jaygmc3RhdGUtPm93bmVyLT5zb19sb2NrKTsKLQlpZiAoIWNsZWFyX3JkICYmICFjbGVhcl93ciAmJiAhY2xlYXJfcmR3cikgeworCisJaWYgKCFjYWxsX2Nsb3NlKSB7CiAJCS8qIE5vdGU6IGV4aXQgX3dpdGhvdXRfIGNhbGxpbmcgbmZzNF9jbG9zZV9kb25lICovCiAJCXRhc2stPnRrX2FjdGlvbiA9IE5VTEw7CiAJCXJldHVybjsKIAl9CisKKwlpZiAoY2FsbGRhdGEtPmFyZy5mbW9kZSA9PSAwKQorCQl0YXNrLT50a19tc2cucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfQ0xPU0VdOworCiAJbmZzX2ZhdHRyX2luaXQoY2FsbGRhdGEtPnJlcy5mYXR0cik7Ci0JaWYgKHRlc3RfYml0KE5GU19PX1JET05MWV9TVEFURSwgJnN0YXRlLT5mbGFncykgIT0gMCkgewotCQl0YXNrLT50a19tc2cucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfT1BFTl9ET1dOR1JBREVdOwotCQljYWxsZGF0YS0+YXJnLmZtb2RlID0gRk1PREVfUkVBRDsKLQl9IGVsc2UgaWYgKHRlc3RfYml0KE5GU19PX1dST05MWV9TVEFURSwgJnN0YXRlLT5mbGFncykgIT0gMCkgewotCQl0YXNrLT50a19tc2cucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfT1BFTl9ET1dOR1JBREVdOwotCQljYWxsZGF0YS0+YXJnLmZtb2RlID0gRk1PREVfV1JJVEU7Ci0JfQogCWNhbGxkYXRhLT50aW1lc3RhbXAgPSBqaWZmaWVzOwogCWlmIChuZnM0X3NldHVwX3NlcXVlbmNlKChORlNfU0VSVkVSKGNhbGxkYXRhLT5pbm9kZSkpLT5uZnNfY2xpZW50LAogCQkJCSZjYWxsZGF0YS0+YXJnLnNlcV9hcmdzLCAmY2FsbGRhdGEtPnJlcy5zZXFfcmVzLApAQCAtMTk4MSw3ICsxOTk3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBuZnM0X2Nsb3NlX2NvbnRleHQoc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCwgaW50IGlzX3N5bmMpCitzdGF0aWMgdm9pZCBuZnM0X2Nsb3NlX2NvbnRleHQoc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCwgaW50IGlzX3N5bmMpCiB7CiAJaWYgKGN0eC0+c3RhdGUgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtMjUzMiw3ICsyNTQ4LDYgQEAKIAluZnM0X3NlcXVlbmNlX2RvbmUocmVzLT5zZXJ2ZXIsICZyZXMtPnNlcV9yZXMsIHRhc2stPnRrX3N0YXR1cyk7CiAJaWYgKG5mczRfYXN5bmNfaGFuZGxlX2Vycm9yKHRhc2ssIHJlcy0+c2VydmVyLCBOVUxMKSA9PSAtRUFHQUlOKQogCQlyZXR1cm4gMDsKLQluZnM0X3NlcXVlbmNlX2ZyZWVfc2xvdChyZXMtPnNlcnZlci0+bmZzX2NsaWVudCwgJnJlcy0+c2VxX3Jlcyk7CiAJdXBkYXRlX2NoYW5nZWF0dHIoZGlyLCAmcmVzLT5jaW5mbyk7CiAJbmZzX3Bvc3Rfb3BfdXBkYXRlX2lub2RlKGRpciwgJnJlcy0+ZGlyX2F0dHIpOwogCXJldHVybiAxOwpAQCAtMjk3MSwxMSArMjk4NiwxMCBAQAogCiAJZHByaW50aygiLS0+ICVzXG4iLCBfX2Z1bmNfXyk7CiAKLQkvKiBuZnM0X3NlcXVlbmNlX2ZyZWVfc2xvdCBjYWxsZWQgaW4gdGhlIHJlYWQgcnBjX2NhbGxfZG9uZSAqLwogCW5mczRfc2VxdWVuY2VfZG9uZShzZXJ2ZXIsICZkYXRhLT5yZXMuc2VxX3JlcywgdGFzay0+dGtfc3RhdHVzKTsKIAogCWlmIChuZnM0X2FzeW5jX2hhbmRsZV9lcnJvcih0YXNrLCBzZXJ2ZXIsIGRhdGEtPmFyZ3MuY29udGV4dC0+c3RhdGUpID09IC1FQUdBSU4pIHsKLQkJbmZzNF9yZXN0YXJ0X3JwYyh0YXNrLCBzZXJ2ZXItPm5mc19jbGllbnQpOworCQluZnNfcmVzdGFydF9ycGModGFzaywgc2VydmVyLT5uZnNfY2xpZW50KTsKIAkJcmV0dXJuIC1FQUdBSU47CiAJfQogCkBAIC0yOTk1LDEyICszMDA5LDExIEBACiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRhdGEtPmlub2RlOwogCQotCS8qIHNsb3QgaXMgZnJlZWQgaW4gbmZzX3dyaXRlYmFja19kb25lICovCiAJbmZzNF9zZXF1ZW5jZV9kb25lKE5GU19TRVJWRVIoaW5vZGUpLCAmZGF0YS0+cmVzLnNlcV9yZXMsCiAJCQkgICB0YXNrLT50a19zdGF0dXMpOwogCiAJaWYgKG5mczRfYXN5bmNfaGFuZGxlX2Vycm9yKHRhc2ssIE5GU19TRVJWRVIoaW5vZGUpLCBkYXRhLT5hcmdzLmNvbnRleHQtPnN0YXRlKSA9PSAtRUFHQUlOKSB7Ci0JCW5mczRfcmVzdGFydF9ycGModGFzaywgTkZTX1NFUlZFUihpbm9kZSktPm5mc19jbGllbnQpOworCQluZnNfcmVzdGFydF9ycGModGFzaywgTkZTX1NFUlZFUihpbm9kZSktPm5mc19jbGllbnQpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAJaWYgKHRhc2stPnRrX3N0YXR1cyA+PSAwKSB7CkBAIC0zMDI4LDExICszMDQxLDkgQEAKIAluZnM0X3NlcXVlbmNlX2RvbmUoTkZTX1NFUlZFUihpbm9kZSksICZkYXRhLT5yZXMuc2VxX3JlcywKIAkJCSAgIHRhc2stPnRrX3N0YXR1cyk7CiAJaWYgKG5mczRfYXN5bmNfaGFuZGxlX2Vycm9yKHRhc2ssIE5GU19TRVJWRVIoaW5vZGUpLCBOVUxMKSA9PSAtRUFHQUlOKSB7Ci0JCW5mczRfcmVzdGFydF9ycGModGFzaywgTkZTX1NFUlZFUihpbm9kZSktPm5mc19jbGllbnQpOworCQluZnNfcmVzdGFydF9ycGModGFzaywgTkZTX1NFUlZFUihpbm9kZSktPm5mc19jbGllbnQpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9Ci0JbmZzNF9zZXF1ZW5jZV9mcmVlX3Nsb3QoTkZTX1NFUlZFUihpbm9kZSktPm5mc19jbGllbnQsCi0JCQkJJmRhdGEtPnJlcy5zZXFfcmVzKTsKIAluZnNfcmVmcmVzaF9pbm9kZShpbm9kZSwgZGF0YS0+cmVzLmZhdHRyKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTMzNTAsNyArMzM2MSw3IEBACiAJCWNhc2UgLU5GUzRFUlJfU0VRX01JU09SREVSRUQ6CiAJCQlkcHJpbnRrKCIlcyBFUlJPUiAlZCwgUmVzZXQgc2Vzc2lvblxuIiwgX19mdW5jX18sCiAJCQkJdGFzay0+dGtfc3RhdHVzKTsKLQkJCXNldF9iaXQoTkZTNENMTlRfU0VTU0lPTl9TRVRVUCwgJmNscC0+Y2xfc3RhdGUpOworCQkJbmZzNF9zY2hlZHVsZV9zdGF0ZV9yZWNvdmVyeShjbHApOwogCQkJdGFzay0+dGtfc3RhdHVzID0gMDsKIAkJCXJldHVybiAtRUFHQUlOOwogI2VuZGlmIC8qIENPTkZJR19ORlNfVjRfMSAqLwpAQCAtMzQ4MywxMiArMzQ5NCwyMyBAQAogewogCXN0cnVjdCBuZnM0X2RlbGVncmV0dXJuZGF0YSAqZGF0YSA9IGNhbGxkYXRhOwogCi0JbmZzNF9zZXF1ZW5jZV9kb25lX2ZyZWVfc2xvdChkYXRhLT5yZXMuc2VydmVyLCAmZGF0YS0+cmVzLnNlcV9yZXMsCi0JCQkJICAgICB0YXNrLT50a19zdGF0dXMpOworCW5mczRfc2VxdWVuY2VfZG9uZShkYXRhLT5yZXMuc2VydmVyLCAmZGF0YS0+cmVzLnNlcV9yZXMsCisJCQl0YXNrLT50a19zdGF0dXMpOwogCi0JZGF0YS0+cnBjX3N0YXR1cyA9IHRhc2stPnRrX3N0YXR1czsKLQlpZiAoZGF0YS0+cnBjX3N0YXR1cyA9PSAwKQorCXN3aXRjaCAodGFzay0+dGtfc3RhdHVzKSB7CisJY2FzZSAtTkZTNEVSUl9TVEFMRV9TVEFURUlEOgorCWNhc2UgLU5GUzRFUlJfRVhQSVJFRDoKKwljYXNlIDA6CiAJCXJlbmV3X2xlYXNlKGRhdGEtPnJlcy5zZXJ2ZXIsIGRhdGEtPnRpbWVzdGFtcCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmIChuZnM0X2FzeW5jX2hhbmRsZV9lcnJvcih0YXNrLCBkYXRhLT5yZXMuc2VydmVyLCBOVUxMKSA9PQorCQkJCS1FQUdBSU4pIHsKKwkJCW5mc19yZXN0YXJ0X3JwYyh0YXNrLCBkYXRhLT5yZXMuc2VydmVyLT5uZnNfY2xpZW50KTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlkYXRhLT5ycGNfc3RhdHVzID0gdGFzay0+dGtfc3RhdHVzOwogfQogCiBzdGF0aWMgdm9pZCBuZnM0X2RlbGVncmV0dXJuX3JlbGVhc2Uodm9pZCAqY2FsbGRhdGEpCkBAIC0zNzQxLDExICszNzYzLDkgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJaWYgKG5mczRfYXN5bmNfaGFuZGxlX2Vycm9yKHRhc2ssIGNhbGxkYXRhLT5zZXJ2ZXIsIE5VTEwpID09IC1FQUdBSU4pCi0JCQkJbmZzNF9yZXN0YXJ0X3JwYyh0YXNrLAotCQkJCQkJY2FsbGRhdGEtPnNlcnZlci0+bmZzX2NsaWVudCk7CisJCQkJbmZzX3Jlc3RhcnRfcnBjKHRhc2ssCisJCQkJCQkgY2FsbGRhdGEtPnNlcnZlci0+bmZzX2NsaWVudCk7CiAJfQotCW5mczRfc2VxdWVuY2VfZnJlZV9zbG90KGNhbGxkYXRhLT5zZXJ2ZXItPm5mc19jbGllbnQsCi0JCQkJJmNhbGxkYXRhLT5yZXMuc2VxX3Jlcyk7CiB9CiAKIHN0YXRpYyB2b2lkIG5mczRfbG9ja3VfcHJlcGFyZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIHZvaWQgKmRhdGEpCkBAIC0zOTI3LDggKzM5NDcsOCBAQAogCiAJZHByaW50aygiJXM6IGJlZ2luIVxuIiwgX19mdW5jX18pOwogCi0JbmZzNF9zZXF1ZW5jZV9kb25lX2ZyZWVfc2xvdChkYXRhLT5zZXJ2ZXIsICZkYXRhLT5yZXMuc2VxX3JlcywKLQkJCQkgICAgIHRhc2stPnRrX3N0YXR1cyk7CisJbmZzNF9zZXF1ZW5jZV9kb25lKGRhdGEtPnNlcnZlciwgJmRhdGEtPnJlcy5zZXFfcmVzLAorCQkJdGFzay0+dGtfc3RhdHVzKTsKIAogCWRhdGEtPnJwY19zdGF0dXMgPSB0YXNrLT50a19zdGF0dXM7CiAJaWYgKFJQQ19BU1NBU1NJTkFURUQodGFzaykpCkBAIC00MDQ5LDEwICs0MDY5LDE2IEBACiAJCWlmICh0ZXN0X2JpdChORlNfREVMRUdBVEVEX1NUQVRFLCAmc3RhdGUtPmZsYWdzKSAhPSAwKQogCQkJcmV0dXJuIDA7CiAJCWVyciA9IF9uZnM0X2RvX3NldGxrKHN0YXRlLCBGX1NFVExLLCByZXF1ZXN0LCAwKTsKLQkJaWYgKGVyciAhPSAtTkZTNEVSUl9ERUxBWSkKLQkJCWJyZWFrOwotCQluZnM0X2hhbmRsZV9leGNlcHRpb24oc2VydmVyLCBlcnIsICZleGNlcHRpb24pOworCQlzd2l0Y2ggKGVycikgeworCQlkZWZhdWx0OgorCQkJZ290byBvdXQ7CisJCWNhc2UgLU5GUzRFUlJfR1JBQ0U6CisJCWNhc2UgLU5GUzRFUlJfREVMQVk6CisJCQluZnM0X2hhbmRsZV9leGNlcHRpb24oc2VydmVyLCBlcnIsICZleGNlcHRpb24pOworCQkJZXJyID0gMDsKKwkJfQogCX0gd2hpbGUgKGV4Y2VwdGlvbi5yZXRyeSk7CitvdXQ6CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNDE3Miw2ICs0MTk4LDExIEBACiAJCQljYXNlIC1ORlM0RVJSX0VYUElSRUQ6CiAJCQljYXNlIC1ORlM0RVJSX1NUQUxFX0NMSUVOVElEOgogCQkJY2FzZSAtTkZTNEVSUl9TVEFMRV9TVEFURUlEOgorCQkJY2FzZSAtTkZTNEVSUl9CQURTRVNTSU9OOgorCQkJY2FzZSAtTkZTNEVSUl9CQURTTE9UOgorCQkJY2FzZSAtTkZTNEVSUl9CQURfSElHSF9TTE9UOgorCQkJY2FzZSAtTkZTNEVSUl9DT05OX05PVF9CT1VORF9UT19TRVNTSU9OOgorCQkJY2FzZSAtTkZTNEVSUl9ERUFEU0VTU0lPTjoKIAkJCQluZnM0X3NjaGVkdWxlX3N0YXRlX3JlY292ZXJ5KHNlcnZlci0+bmZzX2NsaWVudCk7CiAJCQkJZ290byBvdXQ7CiAJCQljYXNlIC1FUkVTVEFSVFNZUzoKQEAgLTQyOTYsNyArNDMyNyw3IEBACiAgKiBORlM0RVJSX0JBRFNFU1NJT04gaW4gdGhlIHNlcXVlbmNlIG9wZXJhdGlvbiwgYW5kIHdpbGwgdGhlcmVmb3JlCiAgKiBiZSBpbiBzb21lIHBoYXNlIG9mIHNlc3Npb24gcmVzZXQuCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF9wcm9jX2V4Y2hhbmdlX2lkKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCkKK2ludCBuZnM0X3Byb2NfZXhjaGFuZ2VfaWQoc3RydWN0IG5mc19jbGllbnQgKmNscCwgc3RydWN0IHJwY19jcmVkICpjcmVkKQogewogCW5mczRfdmVyaWZpZXIgdmVyaWZpZXI7CiAJc3RydWN0IG5mczQxX2V4Y2hhbmdlX2lkX2FyZ3MgYXJncyA9IHsKQEAgLTQzMTgsNiArNDM0OSw5IEBACiAJZHByaW50aygiLS0+ICVzXG4iLCBfX2Z1bmNfXyk7CiAJQlVHX09OKGNscCA9PSBOVUxMKTsKIAorCS8qIFJlbW92ZSBzZXJ2ZXItb25seSBmbGFncyAqLworCWFyZ3MuZmxhZ3MgJj0gfkVYQ0hHSUQ0X0ZMQUdfQ09ORklSTUVEX1I7CisKIAlwID0gKHUzMiAqKXZlcmlmaWVyLmRhdGE7CiAJKnArKyA9IGh0b25sKCh1MzIpY2xwLT5jbF9ib290X3RpbWUudHZfc2VjKTsKIAkqcCA9IGh0b25sKCh1MzIpY2xwLT5jbF9ib290X3RpbWUudHZfbnNlYyk7CkBAIC00Mzg5LDEwICs0NDIzLDkgQEAKIAkJZHByaW50aygiJXMgUmV0cnk6IHRrX3N0YXR1cyAlZFxuIiwgX19mdW5jX18sIHRhc2stPnRrX3N0YXR1cyk7CiAJCXJwY19kZWxheSh0YXNrLCBORlM0X1BPTExfUkVUUllfTUlOKTsKIAkJdGFzay0+dGtfc3RhdHVzID0gMDsKLQkJbmZzNF9yZXN0YXJ0X3JwYyh0YXNrLCBkYXRhLT5jbHApOworCQluZnNfcmVzdGFydF9ycGModGFzaywgZGF0YS0+Y2xwKTsKIAkJcmV0dXJuOwogCX0KLQluZnM0MV9zZXF1ZW5jZV9mcmVlX3Nsb3QoZGF0YS0+Y2xwLCAmZGF0YS0+cmVzLT5scl9zZXFfcmVzKTsKIAlkcHJpbnRrKCI8LS0gJXNcbiIsIF9fZnVuY19fKTsKIH0KIApAQCAtNDQ2NSw3ICs0NDk4LDYgQEAKIAlzcGluX2xvY2soJnRibC0+c2xvdF90YmxfbG9jayk7CiAJZm9yIChpID0gMDsgaSA8IG1heF9zbG90czsgKytpKQogCQl0YmwtPnNsb3RzW2ldLnNlcV9uciA9IGl2YWx1ZTsKLQl0YmwtPmhpZ2hlc3RfdXNlZF9zbG90aWQgPSAtMTsKIAlzcGluX3VubG9jaygmdGJsLT5zbG90X3RibF9sb2NrKTsKIAlkcHJpbnRrKCIlczogdGJsPSVwIHNsb3RzPSVwIG1heF9zbG90cz0lZFxuIiwgX19mdW5jX18sCiAJCXRibCwgdGJsLT5zbG90cywgdGJsLT5tYXhfc2xvdHMpOwpAQCAtNDUxNSw3ICs0NTQ3LDYgQEAKIHN0YXRpYyBpbnQgbmZzNF9pbml0X3Nsb3RfdGFibGUoc3RydWN0IG5mczRfc2xvdF90YWJsZSAqdGJsLAogCQlpbnQgbWF4X3Nsb3RzLCBpbnQgaXZhbHVlKQogewotCWludCBpOwogCXN0cnVjdCBuZnM0X3Nsb3QgKnNsb3Q7CiAJaW50IHJldCA9IC1FTk9NRU07CiAKQEAgLTQ1MjYsMTggKzQ1NTcsOSBAQAogCXNsb3QgPSBrY2FsbG9jKG1heF9zbG90cywgc2l6ZW9mKHN0cnVjdCBuZnM0X3Nsb3QpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNsb3QpCiAJCWdvdG8gb3V0OwotCWZvciAoaSA9IDA7IGkgPCBtYXhfc2xvdHM7ICsraSkKLQkJc2xvdFtpXS5zZXFfbnIgPSBpdmFsdWU7CiAJcmV0ID0gMDsKIAogCXNwaW5fbG9jaygmdGJsLT5zbG90X3RibF9sb2NrKTsKLQlpZiAodGJsLT5zbG90cyAhPSBOVUxMKSB7Ci0JCXNwaW5fdW5sb2NrKCZ0YmwtPnNsb3RfdGJsX2xvY2spOwotCQlkcHJpbnRrKCIlczogc2xvdCB0YWJsZSBhbHJlYWR5IGluaXRpYWxpemVkLiB0Ymw9JXAgc2xvdHM9JXBcbiIsCi0JCQlfX2Z1bmNfXywgdGJsLCB0YmwtPnNsb3RzKTsKLQkJV0FSTl9PTigxKTsKLQkJZ290byBvdXRfZnJlZTsKLQl9CiAJdGJsLT5tYXhfc2xvdHMgPSBtYXhfc2xvdHM7CiAJdGJsLT5zbG90cyA9IHNsb3Q7CiAJdGJsLT5oaWdoZXN0X3VzZWRfc2xvdGlkID0gLTE7ICAvKiBubyBzbG90IGlzIGN1cnJlbnRseSB1c2VkICovCkBAIC00NTQ3LDEwICs0NTY5LDYgQEAKIG91dDoKIAlkcHJpbnRrKCI8LS0gJXM6IHJldHVybiAlZFxuIiwgX19mdW5jX18sIHJldCk7CiAJcmV0dXJuIHJldDsKLQotb3V0X2ZyZWU6Ci0Ja2ZyZWUoc2xvdCk7Ci0JZ290byBvdXQ7CiB9CiAKIC8qCkBAIC00NTU4LDE3ICs0NTc2LDI0IEBACiAgKi8KIHN0YXRpYyBpbnQgbmZzNF9pbml0X3Nsb3RfdGFibGVzKHN0cnVjdCBuZnM0X3Nlc3Npb24gKnNlc3Npb24pCiB7Ci0JaW50IHN0YXR1czsKKwlzdHJ1Y3QgbmZzNF9zbG90X3RhYmxlICp0Ymw7CisJaW50IHN0YXR1cyA9IDA7CiAKLQlzdGF0dXMgPSBuZnM0X2luaXRfc2xvdF90YWJsZSgmc2Vzc2lvbi0+ZmNfc2xvdF90YWJsZSwKLQkJCXNlc3Npb24tPmZjX2F0dHJzLm1heF9yZXFzLCAxKTsKLQlpZiAoc3RhdHVzKQotCQlyZXR1cm4gc3RhdHVzOworCXRibCA9ICZzZXNzaW9uLT5mY19zbG90X3RhYmxlOworCWlmICh0YmwtPnNsb3RzID09IE5VTEwpIHsKKwkJc3RhdHVzID0gbmZzNF9pbml0X3Nsb3RfdGFibGUodGJsLAorCQkJCXNlc3Npb24tPmZjX2F0dHJzLm1heF9yZXFzLCAxKTsKKwkJaWYgKHN0YXR1cykKKwkJCXJldHVybiBzdGF0dXM7CisJfQogCi0Jc3RhdHVzID0gbmZzNF9pbml0X3Nsb3RfdGFibGUoJnNlc3Npb24tPmJjX3Nsb3RfdGFibGUsCi0JCQlzZXNzaW9uLT5iY19hdHRycy5tYXhfcmVxcywgMCk7Ci0JaWYgKHN0YXR1cykKLQkJbmZzNF9kZXN0cm95X3Nsb3RfdGFibGVzKHNlc3Npb24pOworCXRibCA9ICZzZXNzaW9uLT5iY19zbG90X3RhYmxlOworCWlmICh0YmwtPnNsb3RzID09IE5VTEwpIHsKKwkJc3RhdHVzID0gbmZzNF9pbml0X3Nsb3RfdGFibGUodGJsLAorCQkJCXNlc3Npb24tPmJjX2F0dHJzLm1heF9yZXFzLCAwKTsKKwkJaWYgKHN0YXR1cykKKwkJCW5mczRfZGVzdHJveV9zbG90X3RhYmxlcyhzZXNzaW9uKTsKKwl9CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtNDU4Miw3ICs0NjA3LDYgQEAKIAlpZiAoIXNlc3Npb24pCiAJCXJldHVybiBOVUxMOwogCi0Jc2V0X2JpdChORlM0Q0xOVF9TRVNTSU9OX1NFVFVQLCAmY2xwLT5jbF9zdGF0ZSk7CiAJLyoKIAkgKiBUaGUgY3JlYXRlIHNlc3Npb24gcmVwbHkgcmFjZXMgd2l0aCB0aGUgc2VydmVyIGJhY2sKIAkgKiBjaGFubmVsIHByb2JlLiBNYXJrIHRoZSBjbGllbnQgTkZTX0NTX1NFU1NJT05fSU5JVElORwpAQCAtNDU5MCwxMiArNDYxNCwxNSBAQAogCSAqIG5mc19jbGllbnQgc3RydWN0CiAJICovCiAJY2xwLT5jbF9jb25zX3N0YXRlID0gTkZTX0NTX1NFU1NJT05fSU5JVElORzsKKwlpbml0X2NvbXBsZXRpb24oJnNlc3Npb24tPmNvbXBsZXRlKTsKIAogCXRibCA9ICZzZXNzaW9uLT5mY19zbG90X3RhYmxlOworCXRibC0+aGlnaGVzdF91c2VkX3Nsb3RpZCA9IC0xOwogCXNwaW5fbG9ja19pbml0KCZ0YmwtPnNsb3RfdGJsX2xvY2spOwogCXJwY19pbml0X3dhaXRfcXVldWUoJnRibC0+c2xvdF90Ymxfd2FpdHEsICJGb3JlQ2hhbm5lbCBTbG90IHRhYmxlIik7CiAKIAl0YmwgPSAmc2Vzc2lvbi0+YmNfc2xvdF90YWJsZTsKKwl0YmwtPmhpZ2hlc3RfdXNlZF9zbG90aWQgPSAtMTsKIAlzcGluX2xvY2tfaW5pdCgmdGJsLT5zbG90X3RibF9sb2NrKTsKIAlycGNfaW5pdF93YWl0X3F1ZXVlKCZ0YmwtPnNsb3RfdGJsX3dhaXRxLCAiQmFja0NoYW5uZWwgU2xvdCB0YWJsZSIpOwogCkBAIC00NzQ3LDExICs0Nzc0LDEwIEBACiAgKiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byB2ZXJpZnkgdGhlIHNlc3Npb24gaXMKICAqIGV4cGlyZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyByb3V0aW5lLgogICovCi1pbnQgbmZzNF9wcm9jX2NyZWF0ZV9zZXNzaW9uKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsIGludCByZXNldCkKK2ludCBuZnM0X3Byb2NfY3JlYXRlX3Nlc3Npb24oc3RydWN0IG5mc19jbGllbnQgKmNscCkKIHsKIAlpbnQgc3RhdHVzOwogCXVuc2lnbmVkICpwdHI7Ci0Jc3RydWN0IG5mc19mc2luZm8gZnNpbmZvOwogCXN0cnVjdCBuZnM0X3Nlc3Npb24gKnNlc3Npb24gPSBjbHAtPmNsX3Nlc3Npb247CiAKIAlkcHJpbnRrKCItLT4gJXMgY2xwPSVwIHNlc3Npb249JXBcbiIsIF9fZnVuY19fLCBjbHAsIHNlc3Npb24pOwpAQCAtNDc2MCwzNSArNDc4NiwxOSBAQAogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwogCi0JLyogSW5pdCBvciByZXNldCB0aGUgZm9yZSBjaGFubmVsICovCi0JaWYgKHJlc2V0KQotCQlzdGF0dXMgPSBuZnM0X3Jlc2V0X3Nsb3RfdGFibGVzKHNlc3Npb24pOwotCWVsc2UKLQkJc3RhdHVzID0gbmZzNF9pbml0X3Nsb3RfdGFibGVzKHNlc3Npb24pOwotCWRwcmludGsoImZvcmUgY2hhbm5lbCBzbG90IHRhYmxlIGluaXRpYWxpemF0aW9uIHJldHVybmVkICVkXG4iLCBzdGF0dXMpOworCS8qIEluaXQgYW5kIHJlc2V0IHRoZSBmb3JlIGNoYW5uZWwgKi8KKwlzdGF0dXMgPSBuZnM0X2luaXRfc2xvdF90YWJsZXMoc2Vzc2lvbik7CisJZHByaW50aygic2xvdCB0YWJsZSBpbml0aWFsaXphdGlvbiByZXR1cm5lZCAlZFxuIiwgc3RhdHVzKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBuZnM0X3Jlc2V0X3Nsb3RfdGFibGVzKHNlc3Npb24pOworCWRwcmludGsoInNsb3QgdGFibGUgcmVzZXQgcmV0dXJuZWQgJWRcbiIsIHN0YXR1cyk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7CiAKIAlwdHIgPSAodW5zaWduZWQgKikmc2Vzc2lvbi0+c2Vzc19pZC5kYXRhWzBdOwogCWRwcmludGsoIiVzIGNsaWVudD5zZXFpZCAlZCBzZXNzaW9uaWQgJXU6JXU6JXU6JXVcbiIsIF9fZnVuY19fLAogCQljbHAtPmNsX3NlcWlkLCBwdHJbMF0sIHB0clsxXSwgcHRyWzJdLCBwdHJbM10pOwotCi0JaWYgKHJlc2V0KQotCQkvKiBMZWFzZSB0aW1lIGlzIGFsZWFkeSBzZXQgKi8KLQkJZ290byBvdXQ7Ci0KLQkvKiBHZXQgdGhlIGxlYXNlIHRpbWUgKi8KLQlzdGF0dXMgPSBuZnM0X3Byb2NfZ2V0X2xlYXNlX3RpbWUoY2xwLCAmZnNpbmZvKTsKLQlpZiAoc3RhdHVzID09IDApIHsKLQkJLyogVXBkYXRlIGxlYXNlIHRpbWUgYW5kIHNjaGVkdWxlIHJlbmV3YWwgKi8KLQkJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOwotCQljbHAtPmNsX2xlYXNlX3RpbWUgPSBmc2luZm8ubGVhc2VfdGltZSAqIEhaOwotCQljbHAtPmNsX2xhc3RfcmVuZXdhbCA9IGppZmZpZXM7Ci0JCWNsZWFyX2JpdChORlM0Q0xOVF9MRUFTRV9FWFBJUkVELCAmY2xwLT5jbF9zdGF0ZSk7Ci0JCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOwotCi0JCW5mczRfc2NoZWR1bGVfc3RhdGVfcmVuZXdhbChjbHApOwotCX0KIG91dDoKIAlkcHJpbnRrKCI8LS0gJXNcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtNDgyNywxMyArNDgzNywxNiBAQAogaW50IG5mczRfaW5pdF9zZXNzaW9uKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIpCiB7CiAJc3RydWN0IG5mc19jbGllbnQgKmNscCA9IHNlcnZlci0+bmZzX2NsaWVudDsKKwlzdHJ1Y3QgbmZzNF9zZXNzaW9uICpzZXNzaW9uOwogCWludCByZXQ7CiAKIAlpZiAoIW5mczRfaGFzX3Nlc3Npb24oY2xwKSkKIAkJcmV0dXJuIDA7CiAKLQljbHAtPmNsX3Nlc3Npb24tPmZjX2F0dHJzLm1heF9ycXN0X3N6ID0gc2VydmVyLT53c2l6ZTsKLQljbHAtPmNsX3Nlc3Npb24tPmZjX2F0dHJzLm1heF9yZXNwX3N6ID0gc2VydmVyLT5yc2l6ZTsKKwlzZXNzaW9uID0gY2xwLT5jbF9zZXNzaW9uOworCXNlc3Npb24tPmZjX2F0dHJzLm1heF9ycXN0X3N6ID0gc2VydmVyLT53c2l6ZSArIG5mczQxX21heHdyaXRlX292ZXJoZWFkOworCXNlc3Npb24tPmZjX2F0dHJzLm1heF9yZXNwX3N6ID0gc2VydmVyLT5yc2l6ZSArIG5mczQxX21heHJlYWRfb3ZlcmhlYWQ7CisKIAlyZXQgPSBuZnM0X3JlY292ZXJfZXhwaXJlZF9sZWFzZShzZXJ2ZXIpOwogCWlmICghcmV0KQogCQlyZXQgPSBuZnM0X2NoZWNrX2NsaWVudF9yZWFkeShjbHApOwpAQCAtNDg3MiwxMSArNDg4NSwxMCBAQAogCiAJCWlmIChfbmZzNF9hc3luY19oYW5kbGVfZXJyb3IodGFzaywgTlVMTCwgY2xwLCBOVUxMKQogCQkJCQkJCQk9PSAtRUFHQUlOKSB7Ci0JCQluZnM0X3Jlc3RhcnRfcnBjKHRhc2ssIGNscCk7CisJCQluZnNfcmVzdGFydF9ycGModGFzaywgY2xwKTsKIAkJCXJldHVybjsKIAkJfQogCX0KLQluZnM0MV9zZXF1ZW5jZV9mcmVlX3Nsb3QoY2xwLCB0YXNrLT50a19tc2cucnBjX3Jlc3ApOwogCWRwcmludGsoIiVzIHJwY19jcmVkICVwXG4iLCBfX2Z1bmNfXywgdGFzay0+dGtfbXNnLnJwY19jcmVkKTsKIAogCWtmcmVlKHRhc2stPnRrX21zZy5ycGNfYXJncCk7CkBAIC00OTMxLDYgKzQ5NDMsMTA5IEBACiAJCQkgICAgICAmbmZzNDFfc2VxdWVuY2Vfb3BzLCAodm9pZCAqKWNscCk7CiB9CiAKK3N0cnVjdCBuZnM0X3JlY2xhaW1fY29tcGxldGVfZGF0YSB7CisJc3RydWN0IG5mc19jbGllbnQgKmNscDsKKwlzdHJ1Y3QgbmZzNDFfcmVjbGFpbV9jb21wbGV0ZV9hcmdzIGFyZzsKKwlzdHJ1Y3QgbmZzNDFfcmVjbGFpbV9jb21wbGV0ZV9yZXMgcmVzOworfTsKKworc3RhdGljIHZvaWQgbmZzNF9yZWNsYWltX2NvbXBsZXRlX3ByZXBhcmUoc3RydWN0IHJwY190YXNrICp0YXNrLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZnM0X3JlY2xhaW1fY29tcGxldGVfZGF0YSAqY2FsbGRhdGEgPSBkYXRhOworCisJaWYgKG5mczRfc2V0dXBfc2VxdWVuY2UoY2FsbGRhdGEtPmNscCwgJmNhbGxkYXRhLT5hcmcuc2VxX2FyZ3MsCisJCQkJJmNhbGxkYXRhLT5yZXMuc2VxX3JlcywgMCwgdGFzaykpCisJCXJldHVybjsKKworCXJwY19jYWxsX3N0YXJ0KHRhc2spOworfQorCitzdGF0aWMgdm9pZCBuZnM0X3JlY2xhaW1fY29tcGxldGVfZG9uZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5mczRfcmVjbGFpbV9jb21wbGV0ZV9kYXRhICpjYWxsZGF0YSA9IGRhdGE7CisJc3RydWN0IG5mc19jbGllbnQgKmNscCA9IGNhbGxkYXRhLT5jbHA7CisJc3RydWN0IG5mczRfc2VxdWVuY2VfcmVzICpyZXMgPSAmY2FsbGRhdGEtPnJlcy5zZXFfcmVzOworCisJZHByaW50aygiLS0+ICVzXG4iLCBfX2Z1bmNfXyk7CisJbmZzNDFfc2VxdWVuY2VfZG9uZShjbHAsIHJlcywgdGFzay0+dGtfc3RhdHVzKTsKKwlzd2l0Y2ggKHRhc2stPnRrX3N0YXR1cykgeworCWNhc2UgMDoKKwljYXNlIC1ORlM0RVJSX0NPTVBMRVRFX0FMUkVBRFk6CisJCWJyZWFrOworCWNhc2UgLU5GUzRFUlJfQkFEU0VTU0lPTjoKKwljYXNlIC1ORlM0RVJSX0RFQURTRVNTSU9OOgorCQkvKgorCQkgKiBIYW5kbGUgdGhlIHNlc3Npb24gZXJyb3IsIGJ1dCBkbyBub3QgcmV0cnkgdGhlIG9wZXJhdGlvbiwgYXMKKwkJICogd2UgaGF2ZSBubyB3YXkgb2YgdGVsbGluZyB3aGV0aGVyIHRoZSBjbGllbnRpZCBoYWQgdG8gYmUKKwkJICogcmVzZXQgYmVmb3JlIHdlIGdvdCBvdXIgcmVwbHkuICBJZiByZXNldCwgYSBuZXcgd2F2ZSBvZgorCQkgKiByZWNsYWltIG9wZXJhdGlvbnMgd2lsbCBmb2xsb3csIGNvbnRhaW5pbmcgdGhlaXIgb3duIHJlY2xhaW0KKwkJICogY29tcGxldGUuICBXZSBkb24ndCB3YW50IG91ciByZXRyeSB0byBnZXQgb24gdGhlIHdheSBvZgorCQkgKiByZWNvdmVyeSBieSBpbmNvcnJlY3RseSBpbmRpY2F0aW5nIHRvIHRoZSBzZXJ2ZXIgdGhhdCB3ZSdyZQorCQkgKiBkb25lIHJlY2xhaW1pbmcgc3RhdGUgc2luY2UgdGhlIHByb2Nlc3MgaGFkIHRvIGJlIHJlc3RhcnRlZC4KKwkJICovCisJCV9uZnM0X2FzeW5jX2hhbmRsZV9lcnJvcih0YXNrLCBOVUxMLCBjbHAsIE5VTEwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoX25mczRfYXN5bmNfaGFuZGxlX2Vycm9yKAorCQkJCXRhc2ssIE5VTEwsIGNscCwgTlVMTCkgPT0gLUVBR0FJTikgeworCQkJcnBjX3Jlc3RhcnRfY2FsbF9wcmVwYXJlKHRhc2spOworCQkJcmV0dXJuOworCQl9CisJfQorCisJZHByaW50aygiPC0tICVzXG4iLCBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyB2b2lkIG5mczRfZnJlZV9yZWNsYWltX2NvbXBsZXRlX2RhdGEodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmZzNF9yZWNsYWltX2NvbXBsZXRlX2RhdGEgKmNhbGxkYXRhID0gZGF0YTsKKworCWtmcmVlKGNhbGxkYXRhKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBycGNfY2FsbF9vcHMgbmZzNF9yZWNsYWltX2NvbXBsZXRlX2NhbGxfb3BzID0geworCS5ycGNfY2FsbF9wcmVwYXJlID0gbmZzNF9yZWNsYWltX2NvbXBsZXRlX3ByZXBhcmUsCisJLnJwY19jYWxsX2RvbmUgPSBuZnM0X3JlY2xhaW1fY29tcGxldGVfZG9uZSwKKwkucnBjX3JlbGVhc2UgPSBuZnM0X2ZyZWVfcmVjbGFpbV9jb21wbGV0ZV9kYXRhLAorfTsKKworLyoKKyAqIElzc3VlIGEgZ2xvYmFsIHJlY2xhaW0gY29tcGxldGUuCisgKi8KK3N0YXRpYyBpbnQgbmZzNDFfcHJvY19yZWNsYWltX2NvbXBsZXRlKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCit7CisJc3RydWN0IG5mczRfcmVjbGFpbV9jb21wbGV0ZV9kYXRhICpjYWxsZGF0YTsKKwlzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2s7CisJc3RydWN0IHJwY19tZXNzYWdlIG1zZyA9IHsKKwkJLnJwY19wcm9jID0gJm5mczRfcHJvY2VkdXJlc1tORlNQUk9DNF9DTE5UX1JFQ0xBSU1fQ09NUExFVEVdLAorCX07CisJc3RydWN0IHJwY190YXNrX3NldHVwIHRhc2tfc2V0dXBfZGF0YSA9IHsKKwkJLnJwY19jbGllbnQgPSBjbHAtPmNsX3JwY2NsaWVudCwKKwkJLnJwY19tZXNzYWdlID0gJm1zZywKKwkJLmNhbGxiYWNrX29wcyA9ICZuZnM0X3JlY2xhaW1fY29tcGxldGVfY2FsbF9vcHMsCisJCS5mbGFncyA9IFJQQ19UQVNLX0FTWU5DLAorCX07CisJaW50IHN0YXR1cyA9IC1FTk9NRU07CisKKwlkcHJpbnRrKCItLT4gJXNcbiIsIF9fZnVuY19fKTsKKwljYWxsZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpjYWxsZGF0YSksIEdGUF9LRVJORUwpOworCWlmIChjYWxsZGF0YSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwljYWxsZGF0YS0+Y2xwID0gY2xwOworCWNhbGxkYXRhLT5hcmcub25lX2ZzID0gMDsKKwljYWxsZGF0YS0+cmVzLnNlcV9yZXMuc3Jfc2xvdGlkID0gTkZTNF9NQVhfU0xPVF9UQUJMRTsKKworCW1zZy5ycGNfYXJncCA9ICZjYWxsZGF0YS0+YXJnOworCW1zZy5ycGNfcmVzcCA9ICZjYWxsZGF0YS0+cmVzOworCXRhc2tfc2V0dXBfZGF0YS5jYWxsYmFja19kYXRhID0gY2FsbGRhdGE7CisJdGFzayA9IHJwY19ydW5fdGFzaygmdGFza19zZXR1cF9kYXRhKTsKKwlpZiAoSVNfRVJSKHRhc2spKQorCQlzdGF0dXMgPSBQVFJfRVJSKHRhc2spOworCXJwY19wdXRfdGFzayh0YXNrKTsKK291dDoKKwlkcHJpbnRrKCI8LS0gJXMgc3RhdHVzPSVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQogI2VuZGlmIC8qIENPTkZJR19ORlNfVjRfMSAqLwogCiBzdHJ1Y3QgbmZzNF9zdGF0ZV9yZWNvdmVyeV9vcHMgbmZzNDBfcmVib290X3JlY292ZXJ5X29wcyA9IHsKQEAgLTQ5NDgsOCArNTA2Myw5IEBACiAJLnN0YXRlX2ZsYWdfYml0CT0gTkZTX1NUQVRFX1JFQ0xBSU1fUkVCT09ULAogCS5yZWNvdmVyX29wZW4JPSBuZnM0X29wZW5fcmVjbGFpbSwKIAkucmVjb3Zlcl9sb2NrCT0gbmZzNF9sb2NrX3JlY2xhaW0sCi0JLmVzdGFibGlzaF9jbGlkID0gbmZzNF9wcm9jX2V4Y2hhbmdlX2lkLAorCS5lc3RhYmxpc2hfY2xpZCA9IG5mczQxX2luaXRfY2xpZW50aWQsCiAJLmdldF9jbGlkX2NyZWQJPSBuZnM0X2dldF9leGNoYW5nZV9pZF9jcmVkLAorCS5yZWNsYWltX2NvbXBsZXRlID0gbmZzNDFfcHJvY19yZWNsYWltX2NvbXBsZXRlLAogfTsKICNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0XzEgKi8KIApAQCAtNDk2OCw3ICs1MDg0LDcgQEAKIAkuc3RhdGVfZmxhZ19iaXQJPSBORlNfU1RBVEVfUkVDTEFJTV9OT0dSQUNFLAogCS5yZWNvdmVyX29wZW4JPSBuZnM0X29wZW5fZXhwaXJlZCwKIAkucmVjb3Zlcl9sb2NrCT0gbmZzNF9sb2NrX2V4cGlyZWQsCi0JLmVzdGFibGlzaF9jbGlkID0gbmZzNF9wcm9jX2V4Y2hhbmdlX2lkLAorCS5lc3RhYmxpc2hfY2xpZCA9IG5mczQxX2luaXRfY2xpZW50aWQsCiAJLmdldF9jbGlkX2NyZWQJPSBuZnM0X2dldF9leGNoYW5nZV9pZF9jcmVkLAogfTsKICNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0XzEgKi8KZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0c3RhdGUuYyBiL2ZzL25mcy9uZnM0c3RhdGUuYwppbmRleCAyZWY0ZmVjLi5lNzY0MjdlIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNHN0YXRlLmMKKysrIGIvZnMvbmZzL25mczRzdGF0ZS5jCkBAIC0xMTYsNiArMTE2LDY4IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19ORlNfVjRfMSkKIAorc3RhdGljIGludCBuZnM0MV9zZXR1cF9zdGF0ZV9yZW5ld2FsKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCit7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgbmZzX2ZzaW5mbyBmc2luZm87CisKKwlzdGF0dXMgPSBuZnM0X3Byb2NfZ2V0X2xlYXNlX3RpbWUoY2xwLCAmZnNpbmZvKTsKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJLyogVXBkYXRlIGxlYXNlIHRpbWUgYW5kIHNjaGVkdWxlIHJlbmV3YWwgKi8KKwkJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOworCQljbHAtPmNsX2xlYXNlX3RpbWUgPSBmc2luZm8ubGVhc2VfdGltZSAqIEhaOworCQljbHAtPmNsX2xhc3RfcmVuZXdhbCA9IGppZmZpZXM7CisJCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworCisJCW5mczRfc2NoZWR1bGVfc3RhdGVfcmVuZXdhbChjbHApOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIG5mczQxX2VuZF9kcmFpbl9zZXNzaW9uKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsCisJCXN0cnVjdCBuZnM0X3Nlc3Npb24gKnNlcykKK3sKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KE5GUzRDTE5UX1NFU1NJT05fRFJBSU5JTkcsICZjbHAtPmNsX3N0YXRlKSkKKwkJcnBjX3dha2VfdXAoJnNlcy0+ZmNfc2xvdF90YWJsZS5zbG90X3RibF93YWl0cSk7Cit9CisKK3N0YXRpYyBpbnQgbmZzNDFfYmVnaW5fZHJhaW5fc2Vzc2lvbihzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLAorCQlzdHJ1Y3QgbmZzNF9zZXNzaW9uICpzZXMpCit7CisJc3RydWN0IG5mczRfc2xvdF90YWJsZSAqdGJsID0gJnNlcy0+ZmNfc2xvdF90YWJsZTsKKworCXNwaW5fbG9jaygmdGJsLT5zbG90X3RibF9sb2NrKTsKKwlzZXRfYml0KE5GUzRDTE5UX1NFU1NJT05fRFJBSU5JTkcsICZjbHAtPmNsX3N0YXRlKTsKKwlpZiAodGJsLT5oaWdoZXN0X3VzZWRfc2xvdGlkICE9IC0xKSB7CisJCUlOSVRfQ09NUExFVElPTihzZXMtPmNvbXBsZXRlKTsKKwkJc3Bpbl91bmxvY2soJnRibC0+c2xvdF90YmxfbG9jayk7CisJCXJldHVybiB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJnNlcy0+Y29tcGxldGUpOworCX0KKwlzcGluX3VubG9jaygmdGJsLT5zbG90X3RibF9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworaW50IG5mczQxX2luaXRfY2xpZW50aWQoc3RydWN0IG5mc19jbGllbnQgKmNscCwgc3RydWN0IHJwY19jcmVkICpjcmVkKQoreworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBuZnM0MV9iZWdpbl9kcmFpbl9zZXNzaW9uKGNscCwgY2xwLT5jbF9zZXNzaW9uKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IG5mczRfcHJvY19leGNoYW5nZV9pZChjbHAsIGNyZWQpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gbmZzNF9wcm9jX2NyZWF0ZV9zZXNzaW9uKGNscCk7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlnb3RvIG91dDsKKwluZnM0MV9lbmRfZHJhaW5fc2Vzc2lvbihjbHAsIGNscC0+Y2xfc2Vzc2lvbik7CisJbmZzNDFfc2V0dXBfc3RhdGVfcmVuZXdhbChjbHApOworCW5mc19tYXJrX2NsaWVudF9yZWFkeShjbHAsIE5GU19DU19SRUFEWSk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKwogc3RydWN0IHJwY19jcmVkICpuZnM0X2dldF9leGNoYW5nZV9pZF9jcmVkKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCiB7CiAJc3RydWN0IHJwY19jcmVkICpjcmVkOwpAQCAtODc3LDYgKzkzOSwxMCBAQAogCQkJY2FzZSAtTkZTNEVSUl9FWFBJUkVEOgogCQkJY2FzZSAtTkZTNEVSUl9OT19HUkFDRToKIAkJCWNhc2UgLU5GUzRFUlJfU1RBTEVfQ0xJRU5USUQ6CisJCQljYXNlIC1ORlM0RVJSX0JBRFNFU1NJT046CisJCQljYXNlIC1ORlM0RVJSX0JBRFNMT1Q6CisJCQljYXNlIC1ORlM0RVJSX0JBRF9ISUdIX1NMT1Q6CisJCQljYXNlIC1ORlM0RVJSX0NPTk5fTk9UX0JPVU5EX1RPX1NFU1NJT046CiAJCQkJZ290byBvdXQ7CiAJCQlkZWZhdWx0OgogCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuaGFuZGxlZCBlcnJvciAlZC4gWmVyb2luZyBzdGF0ZVxuIiwKQEAgLTk1OSw2ICsxMDI1LDEwIEBACiAJCQljYXNlIC1ORlM0RVJSX05PX0dSQUNFOgogCQkJCW5mczRfc3RhdGVfbWFya19yZWNsYWltX25vZ3JhY2Uoc3AtPnNvX2NsaWVudCwgc3RhdGUpOwogCQkJY2FzZSAtTkZTNEVSUl9TVEFMRV9DTElFTlRJRDoKKwkJCWNhc2UgLU5GUzRFUlJfQkFEU0VTU0lPTjoKKwkJCWNhc2UgLU5GUzRFUlJfQkFEU0xPVDoKKwkJCWNhc2UgLU5GUzRFUlJfQkFEX0hJR0hfU0xPVDoKKwkJCWNhc2UgLU5GUzRFUlJfQ09OTl9OT1RfQk9VTkRfVE9fU0VTU0lPTjoKIAkJCQlnb3RvIG91dF9lcnI7CiAJCX0KIAkJbmZzNF9wdXRfb3Blbl9zdGF0ZShzdGF0ZSk7CkBAIC0xMDExLDYgKzEwODEsMTQgQEAKIAluZnM0X3N0YXRlX21hcmtfcmVjbGFpbV9oZWxwZXIoY2xwLCBuZnM0X3N0YXRlX21hcmtfcmVjbGFpbV9yZWJvb3QpOwogfQogCitzdGF0aWMgdm9pZCBuZnM0X3JlY2xhaW1fY29tcGxldGUoc3RydWN0IG5mc19jbGllbnQgKmNscCwKKwkJCQkgY29uc3Qgc3RydWN0IG5mczRfc3RhdGVfcmVjb3Zlcnlfb3BzICpvcHMpCit7CisJLyogTm90aWZ5IHRoZSBzZXJ2ZXIgd2UncmUgZG9uZSByZWNsYWltaW5nIG91ciBzdGF0ZSAqLworCWlmIChvcHMtPnJlY2xhaW1fY29tcGxldGUpCisJCSh2b2lkKW9wcy0+cmVjbGFpbV9jb21wbGV0ZShjbHApOworfQorCiBzdGF0aWMgdm9pZCBuZnM0X3N0YXRlX2VuZF9yZWNsYWltX3JlYm9vdChzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQogewogCXN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpzcDsKQEAgLTEwMjAsNiArMTA5OCw5IEBACiAJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoTkZTNENMTlRfUkVDTEFJTV9SRUJPT1QsICZjbHAtPmNsX3N0YXRlKSkKIAkJcmV0dXJuOwogCisJbmZzNF9yZWNsYWltX2NvbXBsZXRlKGNscCwKKwkJbmZzNF9yZWJvb3RfcmVjb3Zlcnlfb3BzW2NscC0+Y2xfbWlub3J2ZXJzaW9uXSk7CisKIAlmb3IgKHBvcyA9IHJiX2ZpcnN0KCZjbHAtPmNsX3N0YXRlX293bmVycyk7IHBvcyAhPSBOVUxMOyBwb3MgPSByYl9uZXh0KHBvcykpIHsKIAkJc3AgPSByYl9lbnRyeShwb3MsIHN0cnVjdCBuZnM0X3N0YXRlX293bmVyLCBzb19jbGllbnRfbm9kZSk7CiAJCXNwaW5fbG9jaygmc3AtPnNvX2xvY2spOwpAQCAtMTA0NiwyNSArMTEyNywyNSBAQAogCW5mczRfc3RhdGVfbWFya19yZWNsYWltX2hlbHBlcihjbHAsIG5mczRfc3RhdGVfbWFya19yZWNsYWltX25vZ3JhY2UpOwogfQogCi1zdGF0aWMgdm9pZCBuZnM0X3N0YXRlX2VuZF9yZWNsYWltX25vZ3JhY2Uoc3RydWN0IG5mc19jbGllbnQgKmNscCkKLXsKLQljbGVhcl9iaXQoTkZTNENMTlRfUkVDTEFJTV9OT0dSQUNFLCAmY2xwLT5jbF9zdGF0ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG5mczRfcmVjb3ZlcnlfaGFuZGxlX2Vycm9yKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsIGludCBlcnJvcikKK3N0YXRpYyBpbnQgbmZzNF9yZWNvdmVyeV9oYW5kbGVfZXJyb3Ioc3RydWN0IG5mc19jbGllbnQgKmNscCwgaW50IGVycm9yKQogewogCXN3aXRjaCAoZXJyb3IpIHsKIAkJY2FzZSAtTkZTNEVSUl9DQl9QQVRIX0RPV046CiAJCQluZnNfaGFuZGxlX2NiX3BhdGhkb3duKGNscCk7Ci0JCQlicmVhazsKKwkJCXJldHVybiAwOworCQljYXNlIC1ORlM0RVJSX05PX0dSQUNFOgorCQkJbmZzNF9zdGF0ZV9lbmRfcmVjbGFpbV9yZWJvb3QoY2xwKTsKKwkJCXJldHVybiAwOwogCQljYXNlIC1ORlM0RVJSX1NUQUxFX0NMSUVOVElEOgogCQljYXNlIC1ORlM0RVJSX0xFQVNFX01PVkVEOgogCQkJc2V0X2JpdChORlM0Q0xOVF9MRUFTRV9FWFBJUkVELCAmY2xwLT5jbF9zdGF0ZSk7CisJCQluZnM0X3N0YXRlX2VuZF9yZWNsYWltX3JlYm9vdChjbHApOwogCQkJbmZzNF9zdGF0ZV9zdGFydF9yZWNsYWltX3JlYm9vdChjbHApOwogCQkJYnJlYWs7CiAJCWNhc2UgLU5GUzRFUlJfRVhQSVJFRDoKIAkJCXNldF9iaXQoTkZTNENMTlRfTEVBU0VfRVhQSVJFRCwgJmNscC0+Y2xfc3RhdGUpOwogCQkJbmZzNF9zdGF0ZV9zdGFydF9yZWNsYWltX25vZ3JhY2UoY2xwKTsKKwkJCWJyZWFrOwogCQljYXNlIC1ORlM0RVJSX0JBRFNFU1NJT046CiAJCWNhc2UgLU5GUzRFUlJfQkFEU0xPVDoKIAkJY2FzZSAtTkZTNEVSUl9CQURfSElHSF9TTE9UOgpAQCAtMTA3Miw4ICsxMTUzLDExIEBACiAJCWNhc2UgLU5GUzRFUlJfQ09OTl9OT1RfQk9VTkRfVE9fU0VTU0lPTjoKIAkJY2FzZSAtTkZTNEVSUl9TRVFfRkFMU0VfUkVUUlk6CiAJCWNhc2UgLU5GUzRFUlJfU0VRX01JU09SREVSRUQ6Ci0JCQlzZXRfYml0KE5GUzRDTE5UX1NFU1NJT05fU0VUVVAsICZjbHAtPmNsX3N0YXRlKTsKKwkJCXNldF9iaXQoTkZTNENMTlRfU0VTU0lPTl9SRVNFVCwgJmNscC0+Y2xfc3RhdGUpOworCQkJLyogWmVybyBzZXNzaW9uIHJlc2V0IGVycm9ycyAqLworCQkJcmV0dXJuIDA7CiAJfQorCXJldHVybiBlcnJvcjsKIH0KIAogc3RhdGljIGludCBuZnM0X2RvX3JlY2xhaW0oc3RydWN0IG5mc19jbGllbnQgKmNscCwgY29uc3Qgc3RydWN0IG5mczRfc3RhdGVfcmVjb3Zlcnlfb3BzICpvcHMpCkBAIC0xMDkzLDggKzExNzcsNyBAQAogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJc2V0X2JpdChvcHMtPm93bmVyX2ZsYWdfYml0LCAmc3AtPnNvX2ZsYWdzKTsKIAkJCW5mczRfcHV0X3N0YXRlX293bmVyKHNwKTsKLQkJCW5mczRfcmVjb3ZlcnlfaGFuZGxlX2Vycm9yKGNscCwgc3RhdHVzKTsKLQkJCXJldHVybiBzdGF0dXM7CisJCQlyZXR1cm4gbmZzNF9yZWNvdmVyeV9oYW5kbGVfZXJyb3IoY2xwLCBzdGF0dXMpOwogCQl9CiAJCW5mczRfcHV0X3N0YXRlX293bmVyKHNwKTsKIAkJZ290byByZXN0YXJ0OwpAQCAtMTEyNCw4ICsxMjA3LDcgQEAKIAlzdGF0dXMgPSBvcHMtPnJlbmV3X2xlYXNlKGNscCwgY3JlZCk7CiAJcHV0X3JwY2NyZWQoY3JlZCk7CiBvdXQ6Ci0JbmZzNF9yZWNvdmVyeV9oYW5kbGVfZXJyb3IoY2xwLCBzdGF0dXMpOwotCXJldHVybiBzdGF0dXM7CisJcmV0dXJuIG5mczRfcmVjb3ZlcnlfaGFuZGxlX2Vycm9yKGNscCwgc3RhdHVzKTsKIH0KIAogc3RhdGljIGludCBuZnM0X3JlY2xhaW1fbGVhc2Uoc3RydWN0IG5mc19jbGllbnQgKmNscCkKQEAgLTExNTEsNTUgKzEyMzMsNjUgQEAKIH0KIAogI2lmZGVmIENPTkZJR19ORlNfVjRfMQotc3RhdGljIHZvaWQgbmZzNF9zZXNzaW9uX3JlY292ZXJ5X2hhbmRsZV9lcnJvcihzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLCBpbnQgZXJyKQordm9pZCBuZnM0MV9oYW5kbGVfc2VxdWVuY2VfZmxhZ19lcnJvcnMoc3RydWN0IG5mc19jbGllbnQgKmNscCwgdTMyIGZsYWdzKQogewotCXN3aXRjaCAoZXJyKSB7Ci0JY2FzZSAtTkZTNEVSUl9TVEFMRV9DTElFTlRJRDoKKwlpZiAoIWZsYWdzKQorCQlyZXR1cm47CisJZWxzZSBpZiAoZmxhZ3MgJiBTRVE0X1NUQVRVU19SRVNUQVJUX1JFQ0xBSU1fTkVFREVEKSB7CiAJCXNldF9iaXQoTkZTNENMTlRfTEVBU0VfRVhQSVJFRCwgJmNscC0+Y2xfc3RhdGUpOwotCQlzZXRfYml0KE5GUzRDTE5UX1NFU1NJT05fU0VUVVAsICZjbHAtPmNsX3N0YXRlKTsKLQl9CisJCW5mczRfc3RhdGVfc3RhcnRfcmVjbGFpbV9yZWJvb3QoY2xwKTsKKwkJbmZzNF9zY2hlZHVsZV9zdGF0ZV9yZWNvdmVyeShjbHApOworCX0gZWxzZSBpZiAoZmxhZ3MgJiAoU0VRNF9TVEFUVVNfRVhQSVJFRF9BTExfU1RBVEVfUkVWT0tFRCB8CisJCQkgICAgU0VRNF9TVEFUVVNfRVhQSVJFRF9TT01FX1NUQVRFX1JFVk9LRUQgfAorCQkJICAgIFNFUTRfU1RBVFVTX0FETUlOX1NUQVRFX1JFVk9LRUQgfAorCQkJICAgIFNFUTRfU1RBVFVTX1JFQ0FMTEFCTEVfU1RBVEVfUkVWT0tFRCB8CisJCQkgICAgU0VRNF9TVEFUVVNfTEVBU0VfTU9WRUQpKSB7CisJCXNldF9iaXQoTkZTNENMTlRfTEVBU0VfRVhQSVJFRCwgJmNscC0+Y2xfc3RhdGUpOworCQluZnM0X3N0YXRlX3N0YXJ0X3JlY2xhaW1fbm9ncmFjZShjbHApOworCQluZnM0X3NjaGVkdWxlX3N0YXRlX3JlY292ZXJ5KGNscCk7CisJfSBlbHNlIGlmIChmbGFncyAmIChTRVE0X1NUQVRVU19DQl9QQVRIX0RPV04gfAorCQkJICAgIFNFUTRfU1RBVFVTX0JBQ0tDSEFOTkVMX0ZBVUxUIHwKKwkJCSAgICBTRVE0X1NUQVRVU19DQl9QQVRIX0RPV05fU0VTU0lPTikpCisJCW5mc19leHBpcmVfYWxsX2RlbGVnYXRpb25zKGNscCk7CiB9CiAKIHN0YXRpYyBpbnQgbmZzNF9yZXNldF9zZXNzaW9uKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCiB7CisJc3RydWN0IG5mczRfc2Vzc2lvbiAqc2VzID0gY2xwLT5jbF9zZXNzaW9uOwogCWludCBzdGF0dXM7CiAKKwlzdGF0dXMgPSBuZnM0MV9iZWdpbl9kcmFpbl9zZXNzaW9uKGNscCwgc2VzKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCXJldHVybiBzdGF0dXM7CisKIAlzdGF0dXMgPSBuZnM0X3Byb2NfZGVzdHJveV9zZXNzaW9uKGNscC0+Y2xfc2Vzc2lvbik7CiAJaWYgKHN0YXR1cyAmJiBzdGF0dXMgIT0gLU5GUzRFUlJfQkFEU0VTU0lPTiAmJgogCSAgICBzdGF0dXMgIT0gLU5GUzRFUlJfREVBRFNFU1NJT04pIHsKLQkJbmZzNF9zZXNzaW9uX3JlY292ZXJ5X2hhbmRsZV9lcnJvcihjbHAsIHN0YXR1cyk7CisJCXN0YXR1cyA9IG5mczRfcmVjb3ZlcnlfaGFuZGxlX2Vycm9yKGNscCwgc3RhdHVzKTsKIAkJZ290byBvdXQ7CiAJfQogCiAJbWVtc2V0KGNscC0+Y2xfc2Vzc2lvbi0+c2Vzc19pZC5kYXRhLCAwLCBORlM0X01BWF9TRVNTSU9OSURfTEVOKTsKLQlzdGF0dXMgPSBuZnM0X3Byb2NfY3JlYXRlX3Nlc3Npb24oY2xwLCAxKTsKKwlzdGF0dXMgPSBuZnM0X3Byb2NfY3JlYXRlX3Nlc3Npb24oY2xwKTsKIAlpZiAoc3RhdHVzKQotCQluZnM0X3Nlc3Npb25fcmVjb3ZlcnlfaGFuZGxlX2Vycm9yKGNscCwgc3RhdHVzKTsKLQkJLyogZmFsbCB0aHJvdWdoKi8KKwkJc3RhdHVzID0gbmZzNF9yZWNvdmVyeV9oYW5kbGVfZXJyb3IoY2xwLCBzdGF0dXMpOworCiBvdXQ6Ci0JLyogV2FrZSB1cCB0aGUgbmV4dCBycGMgdGFzayBldmVuIG9uIGVycm9yICovCi0JcnBjX3dha2VfdXBfbmV4dCgmY2xwLT5jbF9zZXNzaW9uLT5mY19zbG90X3RhYmxlLnNsb3RfdGJsX3dhaXRxKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgaW50IG5mczRfaW5pdGlhbGl6ZV9zZXNzaW9uKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCi17Ci0JaW50IHN0YXR1czsKLQotCXN0YXR1cyA9IG5mczRfcHJvY19jcmVhdGVfc2Vzc2lvbihjbHAsIDApOwotCWlmICghc3RhdHVzKSB7Ci0JCW5mc19tYXJrX2NsaWVudF9yZWFkeShjbHAsIE5GU19DU19SRUFEWSk7Ci0JfSBlbHNlIGlmIChzdGF0dXMgPT0gLU5GUzRFUlJfU1RBTEVfQ0xJRU5USUQpIHsKLQkJc2V0X2JpdChORlM0Q0xOVF9MRUFTRV9FWFBJUkVELCAmY2xwLT5jbF9zdGF0ZSk7Ci0JCXNldF9iaXQoTkZTNENMTlRfU0VTU0lPTl9TRVRVUCwgJmNscC0+Y2xfc3RhdGUpOwotCX0gZWxzZSB7Ci0JCW5mc19tYXJrX2NsaWVudF9yZWFkeShjbHAsIHN0YXR1cyk7CisJLyoKKwkgKiBMZXQgdGhlIHN0YXRlIG1hbmFnZXIgcmVlc3RhYmxpc2ggc3RhdGUKKwkgKiB3aXRob3V0IHdha2luZyBvdGhlciB0YXNrcyB5ZXQuCisJICovCisJaWYgKCF0ZXN0X2JpdChORlM0Q0xOVF9MRUFTRV9FWFBJUkVELCAmY2xwLT5jbF9zdGF0ZSkpIHsKKwkJLyogV2FrZSB1cCB0aGUgbmV4dCBycGMgdGFzayAqLworCQluZnM0MV9lbmRfZHJhaW5fc2Vzc2lvbihjbHAsIHNlcyk7CisJCWlmIChzdGF0dXMgPT0gMCkKKwkJCW5mczQxX3NldHVwX3N0YXRlX3JlbmV3YWwoY2xwKTsKIAl9CiAJcmV0dXJuIHN0YXR1czsKIH0KKwogI2Vsc2UgLyogQ09ORklHX05GU19WNF8xICovCiBzdGF0aWMgaW50IG5mczRfcmVzZXRfc2Vzc2lvbihzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW50IG5mczRfaW5pdGlhbGl6ZV9zZXNzaW9uKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApIHsgcmV0dXJuIDA7IH0KICNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0XzEgKi8KIAogLyogU2V0IE5GUzRDTE5UX0xFQVNFX0VYUElSRUQgZm9yIGFsbCB2NC4wIGVycm9ycyBhbmQgZm9yIHJlY292ZXJhYmxlIGVycm9ycwpAQCAtMTIzNCw3ICsxMzI2LDggQEAKIAkJCXN0YXR1cyA9IG5mczRfcmVjbGFpbV9sZWFzZShjbHApOwogCQkJaWYgKHN0YXR1cykgewogCQkJCW5mczRfc2V0X2xlYXNlX2V4cGlyZWQoY2xwLCBzdGF0dXMpOwotCQkJCWlmIChzdGF0dXMgPT0gLUVBR0FJTikKKwkJCQlpZiAodGVzdF9iaXQoTkZTNENMTlRfTEVBU0VfRVhQSVJFRCwKKwkJCQkJCQkmY2xwLT5jbF9zdGF0ZSkpCiAJCQkJCWNvbnRpbnVlOwogCQkJCWlmIChjbHAtPmNsX2NvbnNfc3RhdGUgPT0KIAkJCQkJCQlORlNfQ1NfU0VTU0lPTl9JTklUSU5HKQpAQCAtMTI0Miw1NSArMTMzNSw1MSBAQAogCQkJCWdvdG8gb3V0X2Vycm9yOwogCQkJfQogCQkJY2xlYXJfYml0KE5GUzRDTE5UX0NIRUNLX0xFQVNFLCAmY2xwLT5jbF9zdGF0ZSk7CisJCQlzZXRfYml0KE5GUzRDTE5UX1JFQ0xBSU1fUkVCT09ULCAmY2xwLT5jbF9zdGF0ZSk7CiAJCX0KIAogCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KE5GUzRDTE5UX0NIRUNLX0xFQVNFLCAmY2xwLT5jbF9zdGF0ZSkpIHsKIAkJCXN0YXR1cyA9IG5mczRfY2hlY2tfbGVhc2UoY2xwKTsKLQkJCWlmIChzdGF0dXMgIT0gMCkKKwkJCWlmICh0ZXN0X2JpdChORlM0Q0xOVF9MRUFTRV9FWFBJUkVELCAmY2xwLT5jbF9zdGF0ZSkpCiAJCQkJY29udGludWU7Ci0JCX0KLQkJLyogSW5pdGlhbGl6ZSBvciByZXNldCB0aGUgc2Vzc2lvbiAqLwotCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KE5GUzRDTE5UX1NFU1NJT05fU0VUVVAsICZjbHAtPmNsX3N0YXRlKQotCQkgICAmJiBuZnM0X2hhc19zZXNzaW9uKGNscCkpIHsKLQkJCWlmIChjbHAtPmNsX2NvbnNfc3RhdGUgPT0gTkZTX0NTX1NFU1NJT05fSU5JVElORykKLQkJCQlzdGF0dXMgPSBuZnM0X2luaXRpYWxpemVfc2Vzc2lvbihjbHApOwotCQkJZWxzZQotCQkJCXN0YXR1cyA9IG5mczRfcmVzZXRfc2Vzc2lvbihjbHApOwotCQkJaWYgKHN0YXR1cykgewotCQkJCWlmIChzdGF0dXMgPT0gLU5GUzRFUlJfU1RBTEVfQ0xJRU5USUQpCi0JCQkJCWNvbnRpbnVlOworCQkJaWYgKHN0YXR1cyA8IDAgJiYgc3RhdHVzICE9IC1ORlM0RVJSX0NCX1BBVEhfRE9XTikKIAkJCQlnb3RvIG91dF9lcnJvcjsKLQkJCX0KIAkJfQorCisJCS8qIEluaXRpYWxpemUgb3IgcmVzZXQgdGhlIHNlc3Npb24gKi8KKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChORlM0Q0xOVF9TRVNTSU9OX1JFU0VULCAmY2xwLT5jbF9zdGF0ZSkKKwkJICAgJiYgbmZzNF9oYXNfc2Vzc2lvbihjbHApKSB7CisJCQlzdGF0dXMgPSBuZnM0X3Jlc2V0X3Nlc3Npb24oY2xwKTsKKwkJCWlmICh0ZXN0X2JpdChORlM0Q0xOVF9MRUFTRV9FWFBJUkVELCAmY2xwLT5jbF9zdGF0ZSkpCisJCQkJY29udGludWU7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIG91dF9lcnJvcjsKKwkJfQorCiAJCS8qIEZpcnN0IHJlY292ZXIgcmVib290IHN0YXRlLi4uICovCi0JCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTkZTNENMTlRfUkVDTEFJTV9SRUJPT1QsICZjbHAtPmNsX3N0YXRlKSkgeworCQlpZiAodGVzdF9iaXQoTkZTNENMTlRfUkVDTEFJTV9SRUJPT1QsICZjbHAtPmNsX3N0YXRlKSkgewogCQkJc3RhdHVzID0gbmZzNF9kb19yZWNsYWltKGNscCwKIAkJCQluZnM0X3JlYm9vdF9yZWNvdmVyeV9vcHNbY2xwLT5jbF9taW5vcnZlcnNpb25dKTsKLQkJCWlmIChzdGF0dXMgPT0gLU5GUzRFUlJfU1RBTEVfQ0xJRU5USUQpCi0JCQkJY29udGludWU7Ci0JCQlpZiAodGVzdF9iaXQoTkZTNENMTlRfU0VTU0lPTl9TRVRVUCwgJmNscC0+Y2xfc3RhdGUpKQorCQkJaWYgKHRlc3RfYml0KE5GUzRDTE5UX0xFQVNFX0VYUElSRUQsICZjbHAtPmNsX3N0YXRlKSB8fAorCQkJICAgIHRlc3RfYml0KE5GUzRDTE5UX1NFU1NJT05fUkVTRVQsICZjbHAtPmNsX3N0YXRlKSkKIAkJCQljb250aW51ZTsKIAkJCW5mczRfc3RhdGVfZW5kX3JlY2xhaW1fcmVib290KGNscCk7Ci0JCQljb250aW51ZTsKKwkJCWlmICh0ZXN0X2JpdChORlM0Q0xOVF9SRUNMQUlNX05PR1JBQ0UsICZjbHAtPmNsX3N0YXRlKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gb3V0X2Vycm9yOwogCQl9CiAKIAkJLyogTm93IHJlY292ZXIgZXhwaXJlZCBzdGF0ZS4uLiAqLwogCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KE5GUzRDTE5UX1JFQ0xBSU1fTk9HUkFDRSwgJmNscC0+Y2xfc3RhdGUpKSB7CiAJCQlzdGF0dXMgPSBuZnM0X2RvX3JlY2xhaW0oY2xwLAogCQkJCW5mczRfbm9ncmFjZV9yZWNvdmVyeV9vcHNbY2xwLT5jbF9taW5vcnZlcnNpb25dKTsKLQkJCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQkJc2V0X2JpdChORlM0Q0xOVF9SRUNMQUlNX05PR1JBQ0UsICZjbHAtPmNsX3N0YXRlKTsKLQkJCQlpZiAoc3RhdHVzID09IC1ORlM0RVJSX1NUQUxFX0NMSUVOVElEKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoc3RhdHVzID09IC1ORlM0RVJSX0VYUElSRUQpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmICh0ZXN0X2JpdChORlM0Q0xOVF9TRVNTSU9OX1NFVFVQLAotCQkJCQkJCQkmY2xwLT5jbF9zdGF0ZSkpCi0JCQkJCWNvbnRpbnVlOworCQkJaWYgKHRlc3RfYml0KE5GUzRDTE5UX0xFQVNFX0VYUElSRUQsICZjbHAtPmNsX3N0YXRlKSB8fAorCQkJICAgIHRlc3RfYml0KE5GUzRDTE5UX1NFU1NJT05fUkVTRVQsICZjbHAtPmNsX3N0YXRlKSB8fAorCQkJICAgIHRlc3RfYml0KE5GUzRDTE5UX1JFQ0xBSU1fUkVCT09ULCAmY2xwLT5jbF9zdGF0ZSkpCisJCQkJY29udGludWU7CisJCQlpZiAoc3RhdHVzIDwgMCkKIAkJCQlnb3RvIG91dF9lcnJvcjsKLQkJCX0gZWxzZQotCQkJCW5mczRfc3RhdGVfZW5kX3JlY2xhaW1fbm9ncmFjZShjbHApOwotCQkJY29udGludWU7CiAJCX0KIAogCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KE5GUzRDTE5UX0RFTEVHUkVUVVJOLCAmY2xwLT5jbF9zdGF0ZSkpIHsKQEAgLTEzMDksOCArMTM5OCw2IEBACiBvdXRfZXJyb3I6CiAJcHJpbnRrKEtFUk5fV0FSTklORyAiRXJyb3I6IHN0YXRlIG1hbmFnZXIgZmFpbGVkIG9uIE5GU3Y0IHNlcnZlciAlcyIKIAkJCSIgd2l0aCBlcnJvciAlZFxuIiwgY2xwLT5jbF9ob3N0bmFtZSwgLXN0YXR1cyk7Ci0JaWYgKHRlc3RfYml0KE5GUzRDTE5UX1JFQ0xBSU1fUkVCT09ULCAmY2xwLT5jbF9zdGF0ZSkpCi0JCW5mczRfc3RhdGVfZW5kX3JlY2xhaW1fcmVib290KGNscCk7CiAJbmZzNF9jbGVhcl9zdGF0ZV9tYW5hZ2VyX2JpdChjbHApOwogfQogCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNHhkci5jIGIvZnMvbmZzL25mczR4ZHIuYwppbmRleCAyMGI0ZTMwLi5lNDM3ZmQ2IDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNHhkci5jCisrKyBiL2ZzL25mcy9uZnM0eGRyLmMKQEAgLTQ2LDExICs0NiwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9tc2dfcHJvdC5oPgogI2luY2x1ZGUgPGxpbnV4L25mcy5oPgogI2luY2x1ZGUgPGxpbnV4L25mczQuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNfaWRtYXAuaD4KICNpbmNsdWRlICJuZnM0X2ZzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogI2RlZmluZSBORlNEQkdfRkFDSUxJVFkJCU5GU0RCR19YRFIKIApAQCAtMTM0LDcgKzEzNiw3IEBACiAjZGVmaW5lIGRlY29kZV9sb29rdXBfbWF4c3oJKG9wX2RlY29kZV9oZHJfbWF4c3opCiAjZGVmaW5lIGVuY29kZV9zaGFyZV9hY2Nlc3NfbWF4c3ogXAogCQkJCSgyKQotI2RlZmluZSBlbmNvZGVfY3JlYXRlbW9kZV9tYXhzegkoMSArIGVuY29kZV9hdHRyc19tYXhzeikKKyNkZWZpbmUgZW5jb2RlX2NyZWF0ZW1vZGVfbWF4c3oJKDEgKyBlbmNvZGVfYXR0cnNfbWF4c3ogKyBlbmNvZGVfdmVyaWZpZXJfbWF4c3opCiAjZGVmaW5lIGVuY29kZV9vcGVudHlwZV9tYXhzegkoMSArIGVuY29kZV9jcmVhdGVtb2RlX21heHN6KQogI2RlZmluZSBlbmNvZGVfY2xhaW1fbnVsbF9tYXhzegkoMSArIG5mczRfbmFtZV9tYXhzeikKICNkZWZpbmUgZW5jb2RlX29wZW5fbWF4c3oJKG9wX2VuY29kZV9oZHJfbWF4c3ogKyBcCkBAIC0yOTksNiArMzAxLDggQEAKIAkJCQlYRFJfUVVBRExFTihORlM0X01BWF9TRVNTSU9OSURfTEVOKSArIDQpCiAjZGVmaW5lIGRlY29kZV9zZXF1ZW5jZV9tYXhzegkob3BfZGVjb2RlX2hkcl9tYXhzeiArIFwKIAkJCQlYRFJfUVVBRExFTihORlM0X01BWF9TRVNTSU9OSURfTEVOKSArIDUpCisjZGVmaW5lIGVuY29kZV9yZWNsYWltX2NvbXBsZXRlX21heHN6CShvcF9lbmNvZGVfaGRyX21heHN6ICsgNCkKKyNkZWZpbmUgZGVjb2RlX3JlY2xhaW1fY29tcGxldGVfbWF4c3oJKG9wX2RlY29kZV9oZHJfbWF4c3ogKyA0KQogI2Vsc2UgLyogQ09ORklHX05GU19WNF8xICovCiAjZGVmaW5lIGVuY29kZV9zZXF1ZW5jZV9tYXhzegkwCiAjZGVmaW5lIGRlY29kZV9zZXF1ZW5jZV9tYXhzegkwCkBAIC02NzYsNiArNjgwLDI1IEBACiAJCQkJCSBkZWNvZGVfc2VxdWVuY2VfbWF4c3ogKyBcCiAJCQkJCSBkZWNvZGVfcHV0cm9vdGZoX21heHN6ICsgXAogCQkJCQkgZGVjb2RlX2ZzaW5mb19tYXhzeikKKyNkZWZpbmUgTkZTNF9lbmNfcmVjbGFpbV9jb21wbGV0ZV9zegkoY29tcG91bmRfZW5jb2RlX2hkcl9tYXhzeiArIFwKKwkJCQkJIGVuY29kZV9zZXF1ZW5jZV9tYXhzeiArIFwKKwkJCQkJIGVuY29kZV9yZWNsYWltX2NvbXBsZXRlX21heHN6KQorI2RlZmluZSBORlM0X2RlY19yZWNsYWltX2NvbXBsZXRlX3N6CShjb21wb3VuZF9kZWNvZGVfaGRyX21heHN6ICsgXAorCQkJCQkgZGVjb2RlX3NlcXVlbmNlX21heHN6ICsgXAorCQkJCQkgZGVjb2RlX3JlY2xhaW1fY29tcGxldGVfbWF4c3opCisKK2NvbnN0IHUzMiBuZnM0MV9tYXh3cml0ZV9vdmVyaGVhZCA9ICgoUlBDX01BWF9IRUFERVJfV0lUSF9BVVRIICsKKwkJCQkgICAgICBjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6ICsKKwkJCQkgICAgICBlbmNvZGVfc2VxdWVuY2VfbWF4c3ogKworCQkJCSAgICAgIGVuY29kZV9wdXRmaF9tYXhzeiArCisJCQkJICAgICAgZW5jb2RlX2dldGF0dHJfbWF4c3opICoKKwkJCQkgICAgIFhEUl9VTklUKTsKKworY29uc3QgdTMyIG5mczQxX21heHJlYWRfb3ZlcmhlYWQgPSAoKFJQQ19NQVhfSEVBREVSX1dJVEhfQVVUSCArCisJCQkJICAgICBjb21wb3VuZF9kZWNvZGVfaGRyX21heHN6ICsKKwkJCQkgICAgIGRlY29kZV9zZXF1ZW5jZV9tYXhzeiArCisJCQkJICAgICBkZWNvZGVfcHV0ZmhfbWF4c3opICoKKwkJCQkgICAgWERSX1VOSVQpOwogI2VuZGlmIC8qIENPTkZJR19ORlNfVjRfMSAqLwogCiBzdGF0aWMgY29uc3QgdW1vZGVfdCBuZnNfdHlwZTJmbXRbXSA9IHsKQEAgLTExNDAsNiArMTE2Myw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZW5jb2RlX2NyZWF0ZW1vZGUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19vcGVuYXJncyAqYXJnKQogewogCV9fYmUzMiAqcDsKKwlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwOwogCiAJcCA9IHJlc2VydmVfc3BhY2UoeGRyLCA0KTsKIAlzd2l0Y2goYXJnLT5vcGVuX2ZsYWdzICYgT19FWENMKSB7CkBAIC0xMTQ4LDggKzExNzIsMjMgQEAKIAkJZW5jb2RlX2F0dHJzKHhkciwgYXJnLT51LmF0dHJzLCBhcmctPnNlcnZlcik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCSpwID0gY3B1X3RvX2JlMzIoTkZTNF9DUkVBVEVfRVhDTFVTSVZFKTsKLQkJZW5jb2RlX25mczRfdmVyaWZpZXIoeGRyLCAmYXJnLT51LnZlcmlmaWVyKTsKKwkJY2xwID0gYXJnLT5zZXJ2ZXItPm5mc19jbGllbnQ7CisJCWlmIChjbHAtPmNsX21pbm9ydmVyc2lvbiA+IDApIHsKKwkJCWlmIChuZnM0X2hhc19wZXJzaXN0ZW50X3Nlc3Npb24oY2xwKSkgeworCQkJCSpwID0gY3B1X3RvX2JlMzIoTkZTNF9DUkVBVEVfR1VBUkRFRCk7CisJCQkJZW5jb2RlX2F0dHJzKHhkciwgYXJnLT51LmF0dHJzLCBhcmctPnNlcnZlcik7CisJCQl9IGVsc2UgeworCQkJCXN0cnVjdCBpYXR0ciBkdW1teTsKKworCQkJCSpwID0gY3B1X3RvX2JlMzIoTkZTNF9DUkVBVEVfRVhDTFVTSVZFNF8xKTsKKwkJCQllbmNvZGVfbmZzNF92ZXJpZmllcih4ZHIsICZhcmctPnUudmVyaWZpZXIpOworCQkJCWR1bW15LmlhX3ZhbGlkID0gMDsKKwkJCQllbmNvZGVfYXR0cnMoeGRyLCAmZHVtbXksIGFyZy0+c2VydmVyKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCSpwID0gY3B1X3RvX2JlMzIoTkZTNF9DUkVBVEVfRVhDTFVTSVZFKTsKKwkJCWVuY29kZV9uZnM0X3ZlcmlmaWVyKHhkciwgJmFyZy0+dS52ZXJpZmllcik7CisJCX0KIAl9CiB9CiAKQEAgLTE1OTIsNiArMTYzMSwxOSBAQAogCWhkci0+bm9wcysrOwogCWhkci0+cmVwbGVuICs9IGRlY29kZV9kZXN0cm95X3Nlc3Npb25fbWF4c3o7CiB9CisKK3N0YXRpYyB2b2lkIGVuY29kZV9yZWNsYWltX2NvbXBsZXRlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgIHN0cnVjdCBuZnM0MV9yZWNsYWltX2NvbXBsZXRlX2FyZ3MgKmFyZ3MsCisJCQkJICAgIHN0cnVjdCBjb21wb3VuZF9oZHIgKmhkcikKK3sKKwlfX2JlMzIgKnA7CisKKwlwID0gcmVzZXJ2ZV9zcGFjZSh4ZHIsIDgpOworCSpwKysgPSBjcHVfdG9fYmUzMihPUF9SRUNMQUlNX0NPTVBMRVRFKTsKKwkqcCsrID0gY3B1X3RvX2JlMzIoYXJncy0+b25lX2ZzKTsKKwloZHItPm5vcHMrKzsKKwloZHItPnJlcGxlbiArPSBkZWNvZGVfcmVjbGFpbV9jb21wbGV0ZV9tYXhzejsKK30KICNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0XzEgKi8KIAogc3RhdGljIHZvaWQgZW5jb2RlX3NlcXVlbmNlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCkBAIC0yMDk2LDcgKzIxNDgsNyBAQAogCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKIAllbmNvZGVfc2VxdWVuY2UoJnhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKIAllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgsICZoZHIpOwotCXJlcGxlbiA9IGhkci5yZXBsZW4gKyBuZnM0X2ZhdHRyX2JpdG1hcF9tYXhzeiArIDE7CisJcmVwbGVuID0gaGRyLnJlcGxlbiArIG9wX2RlY29kZV9oZHJfbWF4c3ogKyBuZnM0X2ZhdHRyX2JpdG1hcF9tYXhzeiArIDE7CiAJZW5jb2RlX2dldGF0dHJfdHdvKCZ4ZHIsIEZBVFRSNF9XT1JEMF9BQ0wsIDAsICZoZHIpOwogCiAJeGRyX2lubGluZV9wYWdlcygmcmVxLT5ycV9yY3ZfYnVmLCByZXBsZW4gPDwgMiwKQEAgLTI0MjAsNiArMjQ3MiwyNiBAQAogCWVuY29kZV9ub3BzKCZoZHIpOwogCXJldHVybiAwOwogfQorCisvKgorICogYSBSRUNMQUlNX0NPTVBMRVRFIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9lbmNfcmVjbGFpbV9jb21wbGV0ZShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsCisJCQkJICAgICBzdHJ1Y3QgbmZzNDFfcmVjbGFpbV9jb21wbGV0ZV9hcmdzICphcmdzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm1pbm9ydmVyc2lvbiA9IG5mczRfeGRyX21pbm9ydmVyc2lvbigmYXJncy0+c2VxX2FyZ3MpCisJfTsKKworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7CisJZW5jb2RlX3NlcXVlbmNlKCZ4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7CisJZW5jb2RlX3JlY2xhaW1fY29tcGxldGUoJnhkciwgYXJncywgJmhkcik7CisJZW5jb2RlX25vcHMoJmhkcik7CisJcmV0dXJuIDA7Cit9CisKICNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0XzEgKi8KIAogc3RhdGljIHZvaWQgcHJpbnRfb3ZlcmZsb3dfbXNnKGNvbnN0IGNoYXIgKmZ1bmMsIGNvbnN0IHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIpCkBAIC00NTI4LDYgKzQ2MDAsMTEgQEAKIHsKIAlyZXR1cm4gZGVjb2RlX29wX2hkcih4ZHIsIE9QX0RFU1RST1lfU0VTU0lPTik7CiB9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3JlY2xhaW1fY29tcGxldGUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdm9pZCAqZHVtbXkpCit7CisJcmV0dXJuIGRlY29kZV9vcF9oZHIoeGRyLCBPUF9SRUNMQUlNX0NPTVBMRVRFKTsKK30KICNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0XzEgKi8KIAogc3RhdGljIGludCBkZWNvZGVfc2VxdWVuY2Uoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKQEAgLTQ1ODMsOCArNDY2MCw4IEBACiAJZHVtbXkgPSBiZTMyX3RvX2NwdXAocCsrKTsKIAkvKiB0YXJnZXQgaGlnaGVzdCBzbG90IGlkIC0gY3VycmVudGx5IG5vdCBwcm9jZXNzZWQgKi8KIAlkdW1teSA9IGJlMzJfdG9fY3B1cChwKyspOwotCS8qIHJlc3VsdCBmbGFncyAtIGN1cnJlbnRseSBub3QgcHJvY2Vzc2VkICovCi0JZHVtbXkgPSBiZTMyX3RvX2NwdXAocCk7CisJLyogcmVzdWx0IGZsYWdzICovCisJcmVzLT5zcl9zdGF0dXNfZmxhZ3MgPSBiZTMyX3RvX2NwdXAocCk7CiAJc3RhdHVzID0gMDsKIG91dF9lcnI6CiAJcmVzLT5zcl9zdGF0dXMgPSBzdGF0dXM7CkBAIC01MzA5LDcgKzUzODYsNyBAQAogfQogCiAvKgotICogRlNJTkZPIHJlcXVlc3QKKyAqIERlY29kZSBGU0lORk8gcmVzcG9uc2UKICAqLwogc3RhdGljIGludCBuZnM0X3hkcl9kZWNfZnNpbmZvKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsCiAJCQkgICAgICAgc3RydWN0IG5mczRfZnNpbmZvX3JlcyAqcmVzKQpAQCAtNTMzMCw3ICs1NDA3LDcgQEAKIH0KIAogLyoKLSAqIFBBVEhDT05GIHJlcXVlc3QKKyAqIERlY29kZSBQQVRIQ09ORiByZXNwb25zZQogICovCiBzdGF0aWMgaW50IG5mczRfeGRyX2RlY19wYXRoY29uZihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLAogCQkJCSBzdHJ1Y3QgbmZzNF9wYXRoY29uZl9yZXMgKnJlcykKQEAgLTUzNTEsNyArNTQyOCw3IEBACiB9CiAKIC8qCi0gKiBTVEFURlMgcmVxdWVzdAorICogRGVjb2RlIFNUQVRGUyByZXNwb25zZQogICovCiBzdGF0aWMgaW50IG5mczRfeGRyX2RlY19zdGF0ZnMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwKIAkJCSAgICAgICBzdHJ1Y3QgbmZzNF9zdGF0ZnNfcmVzICpyZXMpCkBAIC01MzcyLDcgKzU0NDksNyBAQAogfQogCiAvKgotICogR0VUQVRUUl9CSVRNQVAgcmVxdWVzdAorICogRGVjb2RlIEdFVEFUVFJfQklUTUFQIHJlc3BvbnNlCiAgKi8KIHN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3NlcnZlcl9jYXBzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnM0X3NlcnZlcl9jYXBzX3JlcyAqcmVzKQogewpAQCAtNTQxMSw3ICs1NDg4LDcgQEAKIH0KIAogLyoKLSAqIGEgU0VUQ0xJRU5USUQgcmVxdWVzdAorICogRGVjb2RlIFNFVENMSUVOVElEIHJlc3BvbnNlCiAgKi8KIHN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3NldGNsaWVudGlkKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsCiAJCXN0cnVjdCBuZnNfY2xpZW50ICpjbHApCkBAIC01NDI4LDcgKzU1MDUsNyBAQAogfQogCiAvKgotICogYSBTRVRDTElFTlRJRF9DT05GSVJNIHJlcXVlc3QKKyAqIERlY29kZSBTRVRDTElFTlRJRF9DT05GSVJNIHJlc3BvbnNlCiAgKi8KIHN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3NldGNsaWVudGlkX2NvbmZpcm0oc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19mc2luZm8gKmZzaW5mbykKIHsKQEAgLTU0NDgsNyArNTUyNSw3IEBACiB9CiAKIC8qCi0gKiBERUxFR1JFVFVSTiByZXF1ZXN0CisgKiBEZWNvZGUgREVMRUdSRVRVUk4gcmVzcG9uc2UKICAqLwogc3RhdGljIGludCBuZnM0X3hkcl9kZWNfZGVsZWdyZXR1cm4oc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzNF9kZWxlZ3JldHVybnJlcyAqcmVzKQogewpAQCAtNTQ3NCw3ICs1NTUxLDcgQEAKIH0KIAogLyoKLSAqIEZTX0xPQ0FUSU9OUyByZXF1ZXN0CisgKiBEZWNvZGUgRlNfTE9DQVRJT05TIHJlc3BvbnNlCiAgKi8KIHN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2ZzX2xvY2F0aW9ucyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLAogCQkJCSAgICAgc3RydWN0IG5mczRfZnNfbG9jYXRpb25zX3JlcyAqcmVzKQpAQCAtNTUwNCw3ICs1NTgxLDcgQEAKIAogI2lmIGRlZmluZWQoQ09ORklHX05GU19WNF8xKQogLyoKLSAqIEVYQ0hBTkdFX0lEIHJlcXVlc3QKKyAqIERlY29kZSBFWENIQU5HRV9JRCByZXNwb25zZQogICovCiBzdGF0aWMgaW50IG5mczRfeGRyX2RlY19leGNoYW5nZV9pZChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwKIAkJCQkgICAgdm9pZCAqcmVzKQpAQCAtNTUyMSw3ICs1NTk4LDcgQEAKIH0KIAogLyoKLSAqIGEgQ1JFQVRFX1NFU1NJT04gcmVxdWVzdAorICogRGVjb2RlIENSRUFURV9TRVNTSU9OIHJlc3BvbnNlCiAgKi8KIHN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2NyZWF0ZV9zZXNzaW9uKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLAogCQkJCSAgICAgICBzdHJ1Y3QgbmZzNDFfY3JlYXRlX3Nlc3Npb25fcmVzICpyZXMpCkBAIC01NTM4LDcgKzU2MTUsNyBAQAogfQogCiAvKgotICogYSBERVNUUk9ZX1NFU1NJT04gcmVxdWVzdAorICogRGVjb2RlIERFU1RST1lfU0VTU0lPTiByZXNwb25zZQogICovCiBzdGF0aWMgaW50IG5mczRfeGRyX2RlY19kZXN0cm95X3Nlc3Npb24oc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsCiAJCQkJCXZvaWQgKmR1bW15KQpAQCAtNTU1NSw3ICs1NjMyLDcgQEAKIH0KIAogLyoKLSAqIGEgU0VRVUVOQ0UgcmVxdWVzdAorICogRGVjb2RlIFNFUVVFTkNFIHJlc3BvbnNlCiAgKi8KIHN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3NlcXVlbmNlKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLAogCQkJCSBzdHJ1Y3QgbmZzNF9zZXF1ZW5jZV9yZXMgKnJlcykKQEAgLTU1NzIsNyArNTY0OSw3IEBACiB9CiAKIC8qCi0gKiBhIEdFVF9MRUFTRV9USU1FIHJlcXVlc3QKKyAqIERlY29kZSBHRVRfTEVBU0VfVElNRSByZXNwb25zZQogICovCiBzdGF0aWMgaW50IG5mczRfeGRyX2RlY19nZXRfbGVhc2VfdGltZShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwKIAkJCQkgICAgICAgc3RydWN0IG5mczRfZ2V0X2xlYXNlX3RpbWVfcmVzICpyZXMpCkBAIC01NTkxLDYgKzU2NjgsMjUgQEAKIAkJc3RhdHVzID0gZGVjb2RlX2ZzaW5mbygmeGRyLCByZXMtPmxyX2ZzaW5mbyk7CiAJcmV0dXJuIHN0YXR1czsKIH0KKworLyoKKyAqIERlY29kZSBSRUNMQUlNX0NPTVBMRVRFIHJlc3BvbnNlCisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3JlY2xhaW1fY29tcGxldGUoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsCisJCQkJCSBzdHJ1Y3QgbmZzNDFfcmVjbGFpbV9jb21wbGV0ZV9yZXMgKnJlcykKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSgmeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IGRlY29kZV9yZWNsYWltX2NvbXBsZXRlKCZ4ZHIsICh2b2lkICopTlVMTCk7CisJcmV0dXJuIHN0YXR1czsKK30KICNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0XzEgKi8KIAogX19iZTMyICpuZnM0X2RlY29kZV9kaXJlbnQoX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2VudHJ5ICplbnRyeSwgaW50IHBsdXMpCkBAIC01NzY3LDYgKzU4NjMsNyBAQAogICBQUk9DKERFU1RST1lfU0VTU0lPTiwJZW5jX2Rlc3Ryb3lfc2Vzc2lvbiwJZGVjX2Rlc3Ryb3lfc2Vzc2lvbiksCiAgIFBST0MoU0VRVUVOQ0UsCWVuY19zZXF1ZW5jZSwJZGVjX3NlcXVlbmNlKSwKICAgUFJPQyhHRVRfTEVBU0VfVElNRSwJZW5jX2dldF9sZWFzZV90aW1lLAlkZWNfZ2V0X2xlYXNlX3RpbWUpLAorICBQUk9DKFJFQ0xBSU1fQ09NUExFVEUsIGVuY19yZWNsYWltX2NvbXBsZXRlLCAgZGVjX3JlY2xhaW1fY29tcGxldGUpLAogI2VuZGlmIC8qIENPTkZJR19ORlNfVjRfMSAqLwogfTsKIApkaWZmIC0tZ2l0IGEvZnMvbmZzL3JlYWQuYyBiL2ZzL25mcy9yZWFkLmMKaW5kZXggMTJjOWU2Ni4uZGI5YjM2MCAxMDA2NDQKLS0tIGEvZnMvbmZzL3JlYWQuYworKysgYi9mcy9uZnMvcmVhZC5jCkBAIC0zNTYsMjUgKzM1NiwxOSBAQAogCXN0cnVjdCBuZnNfcmVhZHJlcyAqcmVzcCA9ICZkYXRhLT5yZXM7CiAKIAlpZiAocmVzcC0+ZW9mIHx8IHJlc3AtPmNvdW50ID09IGFyZ3AtPmNvdW50KQotCQlnb3RvIG91dDsKKwkJcmV0dXJuOwogCiAJLyogVGhpcyBpcyBhIHNob3J0IHJlYWQhICovCiAJbmZzX2luY19zdGF0cyhkYXRhLT5pbm9kZSwgTkZTSU9TX1NIT1JUUkVBRCk7CiAJLyogSGFzIHRoZSBzZXJ2ZXIgYXQgbGVhc3QgbWFkZSBzb21lIHByb2dyZXNzPyAqLwogCWlmIChyZXNwLT5jb3VudCA9PSAwKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuOwogCiAJLyogWWVzLCBzbyByZXRyeSB0aGUgcmVhZCBhdCB0aGUgZW5kIG9mIHRoZSBkYXRhICovCiAJYXJncC0+b2Zmc2V0ICs9IHJlc3AtPmNvdW50OwogCWFyZ3AtPnBnYmFzZSArPSByZXNwLT5jb3VudDsKIAlhcmdwLT5jb3VudCAtPSByZXNwLT5jb3VudDsKLQluZnM0X3Jlc3RhcnRfcnBjKHRhc2ssIE5GU19TRVJWRVIoZGF0YS0+aW5vZGUpLT5uZnNfY2xpZW50KTsKLQlyZXR1cm47Ci1vdXQ6Ci0JbmZzNF9zZXF1ZW5jZV9mcmVlX3Nsb3QoTkZTX1NFUlZFUihkYXRhLT5pbm9kZSktPm5mc19jbGllbnQsCi0JCQkJJmRhdGEtPnJlcy5zZXFfcmVzKTsKLQlyZXR1cm47Ci0KKwluZnNfcmVzdGFydF9ycGModGFzaywgTkZTX1NFUlZFUihkYXRhLT5pbm9kZSktPm5mc19jbGllbnQpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvbmZzL3N1cGVyLmMgYi9mcy9uZnMvc3VwZXIuYwppbmRleCA5MGJlNTUxLi5jZTkwN2VmIDEwMDY0NAotLS0gYS9mcy9uZnMvc3VwZXIuYworKysgYi9mcy9uZnMvc3VwZXIuYwpAQCAtMTc1LDE0ICsxNzUsMTYgQEAKIH07CiAKIGVudW0gewotCU9wdF94cHJ0X3VkcCwgT3B0X3hwcnRfdGNwLCBPcHRfeHBydF9yZG1hLAorCU9wdF94cHJ0X3VkcCwgT3B0X3hwcnRfdWRwNiwgT3B0X3hwcnRfdGNwLCBPcHRfeHBydF90Y3A2LCBPcHRfeHBydF9yZG1hLAogCiAJT3B0X3hwcnRfZXJyCiB9OwogCiBzdGF0aWMgY29uc3QgbWF0Y2hfdGFibGVfdCBuZnNfeHBydF9wcm90b2NvbF90b2tlbnMgPSB7CiAJeyBPcHRfeHBydF91ZHAsICJ1ZHAiIH0sCisJeyBPcHRfeHBydF91ZHA2LCAidWRwNiIgfSwKIAl7IE9wdF94cHJ0X3RjcCwgInRjcCIgfSwKKwl7IE9wdF94cHJ0X3RjcDYsICJ0Y3A2IiB9LAogCXsgT3B0X3hwcnRfcmRtYSwgInJkbWEiIH0sCiAKIAl7IE9wdF94cHJ0X2VyciwgTlVMTCB9CkBAIC00OTIsNiArNDk0LDQ1IEBACiAJcmV0dXJuIHNlY19mbGF2b3Vyc1tpXS5zdHI7CiB9CiAKK3N0YXRpYyB2b2lkIG5mc19zaG93X21vdW50ZF9uZXRpZChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBuZnNfc2VydmVyICpuZnNzLAorCQkJCSAgaW50IHNob3dkZWZhdWx0cykKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhcCA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgJm5mc3MtPm1vdW50ZF9hZGRyZXNzOworCisJc2VxX3ByaW50ZihtLCAiLG1vdW50cHJvdG89Iik7CisJc3dpdGNoIChzYXAtPnNhX2ZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKwkJc3dpdGNoIChuZnNzLT5tb3VudGRfcHJvdG9jb2wpIHsKKwkJY2FzZSBJUFBST1RPX1VEUDoKKwkJCXNlcV9wcmludGYobSwgUlBDQklORF9ORVRJRF9VRFApOworCQkJYnJlYWs7CisJCWNhc2UgSVBQUk9UT19UQ1A6CisJCQlzZXFfcHJpbnRmKG0sIFJQQ0JJTkRfTkVUSURfVENQKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKHNob3dkZWZhdWx0cykKKwkJCQlzZXFfcHJpbnRmKG0sICJhdXRvIik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBRl9JTkVUNjoKKwkJc3dpdGNoIChuZnNzLT5tb3VudGRfcHJvdG9jb2wpIHsKKwkJY2FzZSBJUFBST1RPX1VEUDoKKwkJCXNlcV9wcmludGYobSwgUlBDQklORF9ORVRJRF9VRFA2KTsKKwkJCWJyZWFrOworCQljYXNlIElQUFJPVE9fVENQOgorCQkJc2VxX3ByaW50ZihtLCBSUENCSU5EX05FVElEX1RDUDYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAoc2hvd2RlZmF1bHRzKQorCQkJCXNlcV9wcmludGYobSwgImF1dG8iKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoc2hvd2RlZmF1bHRzKQorCQkJc2VxX3ByaW50ZihtLCAiYXV0byIpOworCX0KK30KKwogc3RhdGljIHZvaWQgbmZzX3Nob3dfbW91bnRkX29wdGlvbnMoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgbmZzX3NlcnZlciAqbmZzcywKIAkJCQkgICAgaW50IHNob3dkZWZhdWx0cykKIHsKQEAgLTUwNSw3ICs1NDYsNyBAQAogCX0KIAljYXNlIEFGX0lORVQ2OiB7CiAJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKXNhcDsKLQkJc2VxX3ByaW50ZihtLCAiLG1vdW50YWRkcj0lcEk2IiwgJnNpbjYtPnNpbjZfYWRkcik7CisJCXNlcV9wcmludGYobSwgIixtb3VudGFkZHI9JXBJNmMiLCAmc2luNi0+c2luNl9hZGRyKTsKIAkJYnJlYWs7CiAJfQogCWRlZmF1bHQ6CkBAIC01MTgsMTcgKzU1OSw3IEBACiAJaWYgKG5mc3MtPm1vdW50ZF9wb3J0IHx8IHNob3dkZWZhdWx0cykKIAkJc2VxX3ByaW50ZihtLCAiLG1vdW50cG9ydD0ldSIsIG5mc3MtPm1vdW50ZF9wb3J0KTsKIAotCXN3aXRjaCAobmZzcy0+bW91bnRkX3Byb3RvY29sKSB7Ci0JY2FzZSBJUFBST1RPX1VEUDoKLQkJc2VxX3ByaW50ZihtLCAiLG1vdW50cHJvdG89dWRwIik7Ci0JCWJyZWFrOwotCWNhc2UgSVBQUk9UT19UQ1A6Ci0JCXNlcV9wcmludGYobSwgIixtb3VudHByb3RvPXRjcCIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlpZiAoc2hvd2RlZmF1bHRzKQotCQkJc2VxX3ByaW50ZihtLCAiLG1vdW50cHJvdG89YXV0byIpOwotCX0KKwluZnNfc2hvd19tb3VudGRfbmV0aWQobSwgbmZzcywgc2hvd2RlZmF1bHRzKTsKIH0KIAogLyoKQEAgLTU3OCw3ICs2MDksNyBAQAogCQkJc2VxX3B1dHMobSwgbmZzX2luZm9wLT5ub3N0cik7CiAJfQogCXNlcV9wcmludGYobSwgIixwcm90bz0lcyIsCi0JCSAgIHJwY19wZWVyYWRkcjJzdHIobmZzcy0+Y2xpZW50LCBSUENfRElTUExBWV9QUk9UTykpOworCQkgICBycGNfcGVlcmFkZHIyc3RyKG5mc3MtPmNsaWVudCwgUlBDX0RJU1BMQVlfTkVUSUQpKTsKIAlpZiAodmVyc2lvbiA9PSA0KSB7CiAJCWlmIChuZnNzLT5wb3J0ICE9IE5GU19QT1JUKQogCQkJc2VxX3ByaW50ZihtLCAiLHBvcnQ9JXUiLCBuZnNzLT5wb3J0KTsKQEAgLTcxNCw4ICs3NDUsNiBAQAogCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXI7CiAJc3RydWN0IHJwY19jbG50ICpycGM7CiAKLQlsb2NrX2tlcm5lbCgpOwotCiAJc2VydmVyID0gTkZTX1NCKHNiKTsKIAkvKiAtRUlPIGFsbCBwZW5kaW5nIEkvTyAqLwogCXJwYyA9IHNlcnZlci0+Y2xpZW50X2FjbDsKQEAgLTcyNCw4ICs3NTMsNiBAQAogCXJwYyA9IHNlcnZlci0+Y2xpZW50OwogCWlmICghSVNfRVJSKHJwYykpCiAJCXJwY19raWxsYWxsX3Rhc2tzKHJwYyk7Ci0KLQl1bmxvY2tfa2VybmVsKCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmZzX3BhcnNlZF9tb3VudF9kYXRhICpuZnNfYWxsb2NfcGFyc2VkX21vdW50X2RhdGEodW5zaWduZWQgaW50IHZlcnNpb24pCkBAIC03MzQsOCArNzYxLDYgQEAKIAogCWRhdGEgPSBremFsbG9jKHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOwogCWlmIChkYXRhKSB7Ci0JCWRhdGEtPnJzaXplCQk9IE5GU19NQVhfRklMRV9JT19TSVpFOwotCQlkYXRhLT53c2l6ZQkJPSBORlNfTUFYX0ZJTEVfSU9fU0laRTsKIAkJZGF0YS0+YWNyZWdtaW4JCT0gTkZTX0RFRl9BQ1JFR01JTjsKIAkJZGF0YS0+YWNyZWdtYXgJCT0gTkZTX0RFRl9BQ1JFR01BWDsKIAkJZGF0YS0+YWNkaXJtaW4JCT0gTkZTX0RFRl9BQ0RJUk1JTjsKQEAgLTg4Nyw2ICs5MTIsOCBAQAogewogCWNoYXIgKnAsICpzdHJpbmcsICpzZWNkYXRhOwogCWludCByYywgc2xvcHB5ID0gMCwgaW52YWxpZF9vcHRpb24gPSAwOworCXVuc2lnbmVkIHNob3J0IHByb3RvZmFtaWx5ID0gQUZfVU5TUEVDOworCXVuc2lnbmVkIHNob3J0IG1vdW50ZmFtaWx5ID0gQUZfVU5TUEVDOwogCiAJaWYgKCFyYXcpIHsKIAkJZGZwcmludGsoTU9VTlQsICJORlM6IG1vdW50IG9wdGlvbnMgc3RyaW5nIHdhcyBOVUxMLlxuIik7CkBAIC0xMjMyLDEyICsxMjU5LDE3IEBACiAJCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHN0cmluZywKIAkJCQkJICAgIG5mc194cHJ0X3Byb3RvY29sX3Rva2VucywgYXJncyk7CiAKKwkJCXByb3RvZmFtaWx5ID0gQUZfSU5FVDsKIAkJCXN3aXRjaCAodG9rZW4pIHsKKwkJCWNhc2UgT3B0X3hwcnRfdWRwNjoKKwkJCQlwcm90b2ZhbWlseSA9IEFGX0lORVQ2OwogCQkJY2FzZSBPcHRfeHBydF91ZHA6CiAJCQkJbW50LT5mbGFncyAmPSB+TkZTX01PVU5UX1RDUDsKIAkJCQltbnQtPm5mc19zZXJ2ZXIucHJvdG9jb2wgPSBYUFJUX1RSQU5TUE9SVF9VRFA7CiAJCQkJa2ZyZWUoc3RyaW5nKTsKIAkJCQlicmVhazsKKwkJCWNhc2UgT3B0X3hwcnRfdGNwNjoKKwkJCQlwcm90b2ZhbWlseSA9IEFGX0lORVQ2OwogCQkJY2FzZSBPcHRfeHBydF90Y3A6CiAJCQkJbW50LT5mbGFncyB8PSBORlNfTU9VTlRfVENQOwogCQkJCW1udC0+bmZzX3NlcnZlci5wcm90b2NvbCA9IFhQUlRfVFJBTlNQT1JUX1RDUDsKQEAgLTEyNjUsMTAgKzEyOTcsMTUgQEAKIAkJCQkJICAgIG5mc194cHJ0X3Byb3RvY29sX3Rva2VucywgYXJncyk7CiAJCQlrZnJlZShzdHJpbmcpOwogCisJCQltb3VudGZhbWlseSA9IEFGX0lORVQ7CiAJCQlzd2l0Y2ggKHRva2VuKSB7CisJCQljYXNlIE9wdF94cHJ0X3VkcDY6CisJCQkJbW91bnRmYW1pbHkgPSBBRl9JTkVUNjsKIAkJCWNhc2UgT3B0X3hwcnRfdWRwOgogCQkJCW1udC0+bW91bnRfc2VydmVyLnByb3RvY29sID0gWFBSVF9UUkFOU1BPUlRfVURQOwogCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfeHBydF90Y3A2OgorCQkJCW1vdW50ZmFtaWx5ID0gQUZfSU5FVDY7CiAJCQljYXNlIE9wdF94cHJ0X3RjcDoKIAkJCQltbnQtPm1vdW50X3NlcnZlci5wcm90b2NvbCA9IFhQUlRfVFJBTlNQT1JUX1RDUDsKIAkJCQlicmVhazsKQEAgLTEzNjcsOCArMTQwNCwzMyBAQAogCWlmICghc2xvcHB5ICYmIGludmFsaWRfb3B0aW9uKQogCQlyZXR1cm4gMDsKIAorCS8qCisJICogdmVyaWZ5IHRoYXQgYW55IHByb3RvPS9tb3VudHByb3RvPSBvcHRpb25zIG1hdGNoIHRoZSBhZGRyZXNzCisJICogZmFtaWxpaWVzIGluIHRoZSBhZGRyPS9tb3VudGFkZHI9IG9wdGlvbnMuCisJICovCisJaWYgKHByb3RvZmFtaWx5ICE9IEFGX1VOU1BFQyAmJgorCSAgICBwcm90b2ZhbWlseSAhPSBtbnQtPm5mc19zZXJ2ZXIuYWRkcmVzcy5zc19mYW1pbHkpCisJCWdvdG8gb3V0X3Byb3RvX21pc21hdGNoOworCisJaWYgKG1vdW50ZmFtaWx5ICE9IEFGX1VOU1BFQykgeworCQlpZiAobW50LT5tb3VudF9zZXJ2ZXIuYWRkcmxlbikgeworCQkJaWYgKG1vdW50ZmFtaWx5ICE9IG1udC0+bW91bnRfc2VydmVyLmFkZHJlc3Muc3NfZmFtaWx5KQorCQkJCWdvdG8gb3V0X21vdW50cHJvdG9fbWlzbWF0Y2g7CisJCX0gZWxzZSB7CisJCQlpZiAobW91bnRmYW1pbHkgIT0gbW50LT5uZnNfc2VydmVyLmFkZHJlc3Muc3NfZmFtaWx5KQorCQkJCWdvdG8gb3V0X21vdW50cHJvdG9fbWlzbWF0Y2g7CisJCX0KKwl9CisKIAlyZXR1cm4gMTsKIAorb3V0X21vdW50cHJvdG9fbWlzbWF0Y2g6CisJcHJpbnRrKEtFUk5fSU5GTyAiTkZTOiBtb3VudCBzZXJ2ZXIgYWRkcmVzcyBkb2VzIG5vdCBtYXRjaCBtb3VudHByb3RvPSAiCisJCQkgIm9wdGlvblxuIik7CisJcmV0dXJuIDA7CitvdXRfcHJvdG9fbWlzbWF0Y2g6CisJcHJpbnRrKEtFUk5fSU5GTyAiTkZTOiBzZXJ2ZXIgYWRkcmVzcyBkb2VzIG5vdCBtYXRjaCBwcm90bz0gb3B0aW9uXG4iKTsKKwlyZXR1cm4gMDsKIG91dF9pbnZhbGlkX2FkZHJlc3M6CiAJcHJpbnRrKEtFUk5fSU5GTyAiTkZTOiBiYWQgSVAgYWRkcmVzcyBzcGVjaWZpZWQ6ICVzXG4iLCBwKTsKIAlyZXR1cm4gMDsKQEAgLTE4ODEsNyArMTk0Myw2IEBACiAJaWYgKGRhdGEgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlsb2NrX2tlcm5lbCgpOwogCS8qIGZpbGwgb3V0IHN0cnVjdCB3aXRoIHZhbHVlcyBmcm9tIGV4aXN0aW5nIG1vdW50ICovCiAJZGF0YS0+ZmxhZ3MgPSBuZnNzLT5mbGFnczsKIAlkYXRhLT5yc2l6ZSA9IG5mc3MtPnJzaXplOwpAQCAtMTkwNyw3ICsxOTY4LDYgQEAKIAllcnJvciA9IG5mc19jb21wYXJlX3JlbW91bnRfZGF0YShuZnNzLCBkYXRhKTsKIG91dDoKIAlrZnJlZShkYXRhKTsKLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIGVycm9yOwogfQogCmRpZmYgLS1naXQgYS9mcy9uZnMvdW5saW5rLmMgYi9mcy9uZnMvdW5saW5rLmMKaW5kZXggMTA2NGM5MS4uNmRhM2QzZiAxMDA2NDQKLS0tIGEvZnMvbmZzL3VubGluay5jCisrKyBiL2ZzL25mcy91bmxpbmsuYwpAQCAtODMsNyArODMsNyBAQAogCXN0cnVjdCBpbm9kZSAqZGlyID0gZGF0YS0+ZGlyOwogCiAJaWYgKCFORlNfUFJPVE8oZGlyKS0+dW5saW5rX2RvbmUodGFzaywgZGlyKSkKLQkJbmZzNF9yZXN0YXJ0X3JwYyh0YXNrLCBORlNfU0VSVkVSKGRpciktPm5mc19jbGllbnQpOworCQluZnNfcmVzdGFydF9ycGModGFzaywgTkZTX1NFUlZFUihkaXIpLT5uZnNfY2xpZW50KTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9mcy9uZnMvd3JpdGUuYyBiL2ZzL25mcy93cml0ZS5jCmluZGV4IGM4NGI1Y2MuLmQxNzE2OTYgMTAwNjQ0Ci0tLSBhL2ZzL25mcy93cml0ZS5jCisrKyBiL2ZzL25mcy93cml0ZS5jCkBAIC03NzQsNyArNzc0LDcgQEAKIAkgKi8KIAlpZiAobmZzX3dyaXRlX3BhZ2V1cHRvZGF0ZShwYWdlLCBpbm9kZSkgJiYKIAkJCWlub2RlLT5pX2Zsb2NrID09IE5VTEwgJiYKLQkJCSEoZmlsZS0+Zl9mbGFncyAmIE9fU1lOQykpIHsKKwkJCSEoZmlsZS0+Zl9mbGFncyAmIE9fRFNZTkMpKSB7CiAJCWNvdW50ID0gbWF4KGNvdW50ICsgb2Zmc2V0LCBuZnNfcGFnZV9sZW5ndGgocGFnZSkpOwogCQlvZmZzZXQgPSAwOwogCX0KQEAgLTEyMTYsNyArMTIxNiw3IEBACiAJCQkJICovCiAJCQkJYXJncC0+c3RhYmxlID0gTkZTX0ZJTEVfU1lOQzsKIAkJCX0KLQkJCW5mczRfcmVzdGFydF9ycGModGFzaywgc2VydmVyLT5uZnNfY2xpZW50KTsKKwkJCW5mc19yZXN0YXJ0X3JwYyh0YXNrLCBzZXJ2ZXItPm5mc19jbGllbnQpOwogCQkJcmV0dXJuIC1FQUdBSU47CiAJCX0KIAkJaWYgKHRpbWVfYmVmb3JlKGNvbXBsYWluLCBqaWZmaWVzKSkgewpAQCAtMTIyOCw3ICsxMjI4LDYgQEAKIAkJLyogQ2FuJ3QgZG8gYW55dGhpbmcgYWJvdXQgaXQgZXhjZXB0IHRocm93IGFuIGVycm9yLiAqLwogCQl0YXNrLT50a19zdGF0dXMgPSAtRUlPOwogCX0KLQluZnM0X3NlcXVlbmNlX2ZyZWVfc2xvdChzZXJ2ZXItPm5mc19jbGllbnQsICZkYXRhLT5yZXMuc2VxX3Jlcyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2MTIsMTUgKzE2MTEsMTYgQEAKIAlpZiAocmV0KQogCQlnb3RvIG91dF91bmxvY2s7CiAJcGFnZV9jYWNoZV9nZXQobmV3cGFnZSk7CisJc3Bpbl9sb2NrKCZtYXBwaW5nLT5ob3N0LT5pX2xvY2spOwogCXJlcS0+d2JfcGFnZSA9IG5ld3BhZ2U7CiAJU2V0UGFnZVByaXZhdGUobmV3cGFnZSk7Ci0Jc2V0X3BhZ2VfcHJpdmF0ZShuZXdwYWdlLCBwYWdlX3ByaXZhdGUocGFnZSkpOworCXNldF9wYWdlX3ByaXZhdGUobmV3cGFnZSwgKHVuc2lnbmVkIGxvbmcpcmVxKTsKIAlDbGVhclBhZ2VQcml2YXRlKHBhZ2UpOwogCXNldF9wYWdlX3ByaXZhdGUocGFnZSwgMCk7CisJc3Bpbl91bmxvY2soJm1hcHBpbmctPmhvc3QtPmlfbG9jayk7CiAJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogb3V0X3VubG9jazoKIAluZnNfY2xlYXJfcGFnZV90YWdfbG9ja2VkKHJlcSk7Ci0JbmZzX3JlbGVhc2VfcmVxdWVzdChyZXEpOwogb3V0OgogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9mcy9uaWxmczIvYWxsb2MuYyBiL2ZzL25pbGZzMi9hbGxvYy5jCmluZGV4IGQ2OWU2YWUuLjNmOTU5ZjEgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9hbGxvYy5jCisrKyBiL2ZzL25pbGZzMi9hbGxvYy5jCkBAIC0xNDIsMjkgKzE0Miw3NSBAQAogCX0KIH0KIAorc3RhdGljIGludCBuaWxmc19wYWxsb2NfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgYmxrb2ZmLAorCQkJCSAgaW50IGNyZWF0ZSwKKwkJCQkgIHZvaWQgKCppbml0X2Jsb2NrKShzdHJ1Y3QgaW5vZGUgKiwKKwkJCQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICosCisJCQkJCQkgICAgIHZvaWQgKiksCisJCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHAsCisJCQkJICBzdHJ1Y3QgbmlsZnNfYmhfYXNzb2MgKnByZXYsCisJCQkJICBzcGlubG9ja190ICpsb2NrKQoreworCWludCByZXQ7CisKKwlzcGluX2xvY2sobG9jayk7CisJaWYgKHByZXYtPmJoICYmIGJsa29mZiA9PSBwcmV2LT5ibGtvZmYpIHsKKwkJZ2V0X2JoKHByZXYtPmJoKTsKKwkJKmJocCA9IHByZXYtPmJoOworCQlzcGluX3VubG9jayhsb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCXNwaW5fdW5sb2NrKGxvY2spOworCisJcmV0ID0gbmlsZnNfbWR0X2dldF9ibG9jayhpbm9kZSwgYmxrb2ZmLCBjcmVhdGUsIGluaXRfYmxvY2ssIGJocCk7CisJaWYgKCFyZXQpIHsKKwkJc3Bpbl9sb2NrKGxvY2spOworCQkvKgorCQkgKiBUaGUgZm9sbG93aW5nIGNvZGUgbXVzdCBiZSBzYWZlIGZvciBjaGFuZ2Ugb2YgdGhlCisJCSAqIGNhY2hlIGNvbnRlbnRzIGR1cmluZyB0aGUgZ2V0IGJsb2NrIGNhbGwuCisJCSAqLworCQlicmVsc2UocHJldi0+YmgpOworCQlnZXRfYmgoKmJocCk7CisJCXByZXYtPmJoID0gKmJocDsKKwkJcHJldi0+Ymxrb2ZmID0gYmxrb2ZmOworCQlzcGluX3VubG9jayhsb2NrKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBuaWxmc19wYWxsb2NfZ2V0X2Rlc2NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBncm91cCwKIAkJCQkgICAgICAgaW50IGNyZWF0ZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhwKQogewotCXJldHVybiBuaWxmc19tZHRfZ2V0X2Jsb2NrKGlub2RlLAotCQkJCSAgIG5pbGZzX3BhbGxvY19kZXNjX2Jsa29mZihpbm9kZSwgZ3JvdXApLAotCQkJCSAgIGNyZWF0ZSwgbmlsZnNfcGFsbG9jX2Rlc2NfYmxvY2tfaW5pdCwgYmhwKTsKKwlzdHJ1Y3QgbmlsZnNfcGFsbG9jX2NhY2hlICpjYWNoZSA9IE5JTEZTX01EVChpbm9kZSktPm1pX3BhbGxvY19jYWNoZTsKKworCXJldHVybiBuaWxmc19wYWxsb2NfZ2V0X2Jsb2NrKGlub2RlLAorCQkJCSAgICAgIG5pbGZzX3BhbGxvY19kZXNjX2Jsa29mZihpbm9kZSwgZ3JvdXApLAorCQkJCSAgICAgIGNyZWF0ZSwgbmlsZnNfcGFsbG9jX2Rlc2NfYmxvY2tfaW5pdCwKKwkJCQkgICAgICBiaHAsICZjYWNoZS0+cHJldl9kZXNjLCAmY2FjaGUtPmxvY2spOwogfQogCiBzdGF0aWMgaW50IG5pbGZzX3BhbGxvY19nZXRfYml0bWFwX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJCSB1bnNpZ25lZCBsb25nIGdyb3VwLAogCQkJCQkgaW50IGNyZWF0ZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhwKQogewotCXJldHVybiBuaWxmc19tZHRfZ2V0X2Jsb2NrKGlub2RlLAotCQkJCSAgIG5pbGZzX3BhbGxvY19iaXRtYXBfYmxrb2ZmKGlub2RlLCBncm91cCksCi0JCQkJICAgY3JlYXRlLCBOVUxMLCBiaHApOworCXN0cnVjdCBuaWxmc19wYWxsb2NfY2FjaGUgKmNhY2hlID0gTklMRlNfTURUKGlub2RlKS0+bWlfcGFsbG9jX2NhY2hlOworCisJcmV0dXJuIG5pbGZzX3BhbGxvY19nZXRfYmxvY2soaW5vZGUsCisJCQkJICAgICAgbmlsZnNfcGFsbG9jX2JpdG1hcF9ibGtvZmYoaW5vZGUsIGdyb3VwKSwKKwkJCQkgICAgICBjcmVhdGUsIE5VTEwsIGJocCwKKwkJCQkgICAgICAmY2FjaGUtPnByZXZfYml0bWFwLCAmY2FjaGUtPmxvY2spOwogfQogCiBpbnQgbmlsZnNfcGFsbG9jX2dldF9lbnRyeV9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBfX3U2NCBuciwKIAkJCQkgaW50IGNyZWF0ZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhwKQogewotCXJldHVybiBuaWxmc19tZHRfZ2V0X2Jsb2NrKGlub2RlLCBuaWxmc19wYWxsb2NfZW50cnlfYmxrb2ZmKGlub2RlLCBuciksCi0JCQkJICAgY3JlYXRlLCBOVUxMLCBiaHApOworCXN0cnVjdCBuaWxmc19wYWxsb2NfY2FjaGUgKmNhY2hlID0gTklMRlNfTURUKGlub2RlKS0+bWlfcGFsbG9jX2NhY2hlOworCisJcmV0dXJuIG5pbGZzX3BhbGxvY19nZXRfYmxvY2soaW5vZGUsCisJCQkJICAgICAgbmlsZnNfcGFsbG9jX2VudHJ5X2Jsa29mZihpbm9kZSwgbnIpLAorCQkJCSAgICAgIGNyZWF0ZSwgTlVMTCwgYmhwLAorCQkJCSAgICAgICZjYWNoZS0+cHJldl9lbnRyeSwgJmNhY2hlLT5sb2NrKTsKIH0KIAogc3RhdGljIHN0cnVjdCBuaWxmc19wYWxsb2NfZ3JvdXBfZGVzYyAqCkBAIC0xNzYsMTMgKzIyMiw2IEBACiAJCWdyb3VwICUgbmlsZnNfcGFsbG9jX2dyb3Vwc19wZXJfZGVzY19ibG9jayhpbm9kZSk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLW5pbGZzX3BhbGxvY19ibG9ja19nZXRfYml0bWFwKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB2b2lkICprYWRkcikKLXsKLQlyZXR1cm4gKHVuc2lnbmVkIGNoYXIgKikoa2FkZHIgKyBiaF9vZmZzZXQoYmgpKTsKLX0KLQogdm9pZCAqbmlsZnNfcGFsbG9jX2Jsb2NrX2dldF9lbnRyeShjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBfX3U2NCBuciwKIAkJCQkgICBjb25zdCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB2b2lkICprYWRkcikKIHsKQEAgLTI4OSw4ICszMjgsNyBAQAogCQkJCWlmIChyZXQgPCAwKQogCQkJCQlnb3RvIG91dF9kZXNjOwogCQkJCWJpdG1hcF9rYWRkciA9IGttYXAoYml0bWFwX2JoLT5iX3BhZ2UpOwotCQkJCWJpdG1hcCA9IG5pbGZzX3BhbGxvY19ibG9ja19nZXRfYml0bWFwKAotCQkJCQlpbm9kZSwgYml0bWFwX2JoLCBiaXRtYXBfa2FkZHIpOworCQkJCWJpdG1hcCA9IGJpdG1hcF9rYWRkciArIGJoX29mZnNldChiaXRtYXBfYmgpOwogCQkJCXBvcyA9IG5pbGZzX3BhbGxvY19maW5kX2F2YWlsYWJsZV9zbG90KAogCQkJCQlpbm9kZSwgZ3JvdXAsIGdyb3VwX29mZnNldCwgYml0bWFwLAogCQkJCQllbnRyaWVzX3Blcl9ncm91cCk7CkBAIC0zNTEsOCArMzg5LDcgQEAKIAlkZXNjID0gbmlsZnNfcGFsbG9jX2Jsb2NrX2dldF9ncm91cF9kZXNjKGlub2RlLCBncm91cCwKIAkJCQkJCSByZXEtPnByX2Rlc2NfYmgsIGRlc2Nfa2FkZHIpOwogCWJpdG1hcF9rYWRkciA9IGttYXAocmVxLT5wcl9iaXRtYXBfYmgtPmJfcGFnZSk7Ci0JYml0bWFwID0gbmlsZnNfcGFsbG9jX2Jsb2NrX2dldF9iaXRtYXAoaW5vZGUsIHJlcS0+cHJfYml0bWFwX2JoLAotCQkJCQkgICAgICAgYml0bWFwX2thZGRyKTsKKwliaXRtYXAgPSBiaXRtYXBfa2FkZHIgKyBiaF9vZmZzZXQocmVxLT5wcl9iaXRtYXBfYmgpOwogCiAJaWYgKCFuaWxmc19jbGVhcl9iaXRfYXRvbWljKG5pbGZzX21kdF9iZ2xfbG9jayhpbm9kZSwgZ3JvdXApLAogCQkJCSAgICBncm91cF9vZmZzZXQsIGJpdG1hcCkpCkBAIC0zODUsOCArNDIyLDcgQEAKIAlkZXNjID0gbmlsZnNfcGFsbG9jX2Jsb2NrX2dldF9ncm91cF9kZXNjKGlub2RlLCBncm91cCwKIAkJCQkJCSByZXEtPnByX2Rlc2NfYmgsIGRlc2Nfa2FkZHIpOwogCWJpdG1hcF9rYWRkciA9IGttYXAocmVxLT5wcl9iaXRtYXBfYmgtPmJfcGFnZSk7Ci0JYml0bWFwID0gbmlsZnNfcGFsbG9jX2Jsb2NrX2dldF9iaXRtYXAoaW5vZGUsIHJlcS0+cHJfYml0bWFwX2JoLAotCQkJCQkgICAgICAgYml0bWFwX2thZGRyKTsKKwliaXRtYXAgPSBiaXRtYXBfa2FkZHIgKyBiaF9vZmZzZXQocmVxLT5wcl9iaXRtYXBfYmgpOwogCWlmICghbmlsZnNfY2xlYXJfYml0X2F0b21pYyhuaWxmc19tZHRfYmdsX2xvY2soaW5vZGUsIGdyb3VwKSwKIAkJCQkgICAgZ3JvdXBfb2Zmc2V0LCBiaXRtYXApKQogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZW50cnkgbnVtZXIgJWxsdSBhbHJlYWR5IGZyZWVkXG4iLApAQCAtNDcyLDggKzUwOCw3IEBACiAJCWRlc2MgPSBuaWxmc19wYWxsb2NfYmxvY2tfZ2V0X2dyb3VwX2Rlc2MoCiAJCQlpbm9kZSwgZ3JvdXAsIGRlc2NfYmgsIGRlc2Nfa2FkZHIpOwogCQliaXRtYXBfa2FkZHIgPSBrbWFwKGJpdG1hcF9iaC0+Yl9wYWdlKTsKLQkJYml0bWFwID0gbmlsZnNfcGFsbG9jX2Jsb2NrX2dldF9iaXRtYXAoCi0JCQlpbm9kZSwgYml0bWFwX2JoLCBiaXRtYXBfa2FkZHIpOworCQliaXRtYXAgPSBiaXRtYXBfa2FkZHIgKyBiaF9vZmZzZXQoYml0bWFwX2JoKTsKIAkJZm9yIChqID0gaSwgbiA9IDA7CiAJCSAgICAgKGogPCBuaXRlbXMpICYmIG5pbGZzX3BhbGxvY19ncm91cF9pc19pbihpbm9kZSwgZ3JvdXAsCiAJCQkJCQkJICAgICAgZW50cnlfbnJzW2pdKTsKQEAgLTUwMiwzICs1MzcsMzAgQEAKIAl9CiAJcmV0dXJuIDA7CiB9CisKK3ZvaWQgbmlsZnNfcGFsbG9jX3NldHVwX2NhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgICBzdHJ1Y3QgbmlsZnNfcGFsbG9jX2NhY2hlICpjYWNoZSkKK3sKKwlOSUxGU19NRFQoaW5vZGUpLT5taV9wYWxsb2NfY2FjaGUgPSBjYWNoZTsKKwlzcGluX2xvY2tfaW5pdCgmY2FjaGUtPmxvY2spOworfQorCit2b2lkIG5pbGZzX3BhbGxvY19jbGVhcl9jYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBuaWxmc19wYWxsb2NfY2FjaGUgKmNhY2hlID0gTklMRlNfTURUKGlub2RlKS0+bWlfcGFsbG9jX2NhY2hlOworCisJc3Bpbl9sb2NrKCZjYWNoZS0+bG9jayk7CisJYnJlbHNlKGNhY2hlLT5wcmV2X2Rlc2MuYmgpOworCWJyZWxzZShjYWNoZS0+cHJldl9iaXRtYXAuYmgpOworCWJyZWxzZShjYWNoZS0+cHJldl9lbnRyeS5iaCk7CisJY2FjaGUtPnByZXZfZGVzYy5iaCA9IE5VTEw7CisJY2FjaGUtPnByZXZfYml0bWFwLmJoID0gTlVMTDsKKwljYWNoZS0+cHJldl9lbnRyeS5iaCA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmNhY2hlLT5sb2NrKTsKK30KKwordm9pZCBuaWxmc19wYWxsb2NfZGVzdHJveV9jYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCW5pbGZzX3BhbGxvY19jbGVhcl9jYWNoZShpbm9kZSk7CisJTklMRlNfTURUKGlub2RlKS0+bWlfcGFsbG9jX2NhY2hlID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9hbGxvYy5oIGIvZnMvbmlsZnMyL2FsbG9jLmgKaW5kZXggNGFjZTU0NzUuLmY0NTQzYWMgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9hbGxvYy5oCisrKyBiL2ZzL25pbGZzMi9hbGxvYy5oCkBAIC02OSw0ICs2OSwyNSBAQAogI2RlZmluZSBuaWxmc19jbGVhcl9iaXRfYXRvbWljCQlleHQyX2NsZWFyX2JpdF9hdG9taWMKICNkZWZpbmUgbmlsZnNfZmluZF9uZXh0X3plcm9fYml0CWV4dDJfZmluZF9uZXh0X3plcm9fYml0CiAKKy8qCisgKiBwZXJzaXN0ZW50IG9iamVjdCBhbGxvY2F0b3IgY2FjaGUKKyAqLworCitzdHJ1Y3QgbmlsZnNfYmhfYXNzb2MgeworCXVuc2lnbmVkIGxvbmcgYmxrb2ZmOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7Cit9OworCitzdHJ1Y3QgbmlsZnNfcGFsbG9jX2NhY2hlIHsKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IG5pbGZzX2JoX2Fzc29jIHByZXZfZGVzYzsKKwlzdHJ1Y3QgbmlsZnNfYmhfYXNzb2MgcHJldl9iaXRtYXA7CisJc3RydWN0IG5pbGZzX2JoX2Fzc29jIHByZXZfZW50cnk7Cit9OworCit2b2lkIG5pbGZzX3BhbGxvY19zZXR1cF9jYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICAgc3RydWN0IG5pbGZzX3BhbGxvY19jYWNoZSAqY2FjaGUpOwordm9pZCBuaWxmc19wYWxsb2NfY2xlYXJfY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSk7Cit2b2lkIG5pbGZzX3BhbGxvY19kZXN0cm95X2NhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworCiAjZW5kaWYJLyogX05JTEZTX0FMTE9DX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9ibWFwLmMgYi9mcy9uaWxmczIvYm1hcC5jCmluZGV4IDA4ODM0ZGYuLmY0YTE0ZWEgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9ibWFwLmMKKysrIGIvZnMvbmlsZnMyL2JtYXAuYwpAQCAtNDAyLDE5ICs0MDIsMTEgQEAKIHZvaWQgbmlsZnNfYm1hcF9hZGRfYmxvY2tzKGNvbnN0IHN0cnVjdCBuaWxmc19ibWFwICpibWFwLCBpbnQgbikKIHsKIAlpbm9kZV9hZGRfYnl0ZXMoYm1hcC0+Yl9pbm9kZSwgKDEgPDwgYm1hcC0+Yl9pbm9kZS0+aV9ibGtiaXRzKSAqIG4pOwotCWlmIChOSUxGU19NRFQoYm1hcC0+Yl9pbm9kZSkpCi0JCW5pbGZzX21kdF9tYXJrX2RpcnR5KGJtYXAtPmJfaW5vZGUpOwotCWVsc2UKLQkJbWFya19pbm9kZV9kaXJ0eShibWFwLT5iX2lub2RlKTsKIH0KIAogdm9pZCBuaWxmc19ibWFwX3N1Yl9ibG9ja3MoY29uc3Qgc3RydWN0IG5pbGZzX2JtYXAgKmJtYXAsIGludCBuKQogewogCWlub2RlX3N1Yl9ieXRlcyhibWFwLT5iX2lub2RlLCAoMSA8PCBibWFwLT5iX2lub2RlLT5pX2Jsa2JpdHMpICogbik7Ci0JaWYgKE5JTEZTX01EVChibWFwLT5iX2lub2RlKSkKLQkJbmlsZnNfbWR0X21hcmtfZGlydHkoYm1hcC0+Yl9pbm9kZSk7Ci0JZWxzZQotCQltYXJrX2lub2RlX2RpcnR5KGJtYXAtPmJfaW5vZGUpOwogfQogCiBfX3U2NCBuaWxmc19ibWFwX2RhdGFfZ2V0X2tleShjb25zdCBzdHJ1Y3QgbmlsZnNfYm1hcCAqYm1hcCwKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9idG5vZGUuYyBiL2ZzL25pbGZzMi9idG5vZGUuYwppbmRleCA4NGMyNTM4Li40NzFlMjY5IDEwMDY0NAotLS0gYS9mcy9uaWxmczIvYnRub2RlLmMKKysrIGIvZnMvbmlsZnMyL2J0bm9kZS5jCkBAIC02OCw5ICs2OCwzNCBAQAogCXRydW5jYXRlX2lub2RlX3BhZ2VzKGJ0bmMsIDApOwogfQogCitzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorbmlsZnNfYnRub2RlX2NyZWF0ZV9ibG9jayhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqYnRuYywgX191NjQgYmxvY2tucikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTklMRlNfQlROQ19JKGJ0bmMpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwliaCA9IG5pbGZzX2dyYWJfYnVmZmVyKGlub2RlLCBidG5jLCBibG9ja25yLCAxIDw8IEJIX05JTEZTX05vZGUpOworCWlmICh1bmxpa2VseSghYmgpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICh1bmxpa2VseShidWZmZXJfbWFwcGVkKGJoKSB8fCBidWZmZXJfdXB0b2RhdGUoYmgpIHx8CisJCSAgICAgYnVmZmVyX2RpcnR5KGJoKSkpIHsKKwkJYnJlbHNlKGJoKTsKKwkJQlVHKCk7CisJfQorCW1lbXNldChiaC0+Yl9kYXRhLCAwLCAxIDw8IGlub2RlLT5pX2Jsa2JpdHMpOworCWJoLT5iX2JkZXYgPSBOSUxGU19JX05JTEZTKGlub2RlKS0+bnNfYmRldjsKKwliaC0+Yl9ibG9ja25yID0gYmxvY2tucjsKKwlzZXRfYnVmZmVyX21hcHBlZChiaCk7CisJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisKKwl1bmxvY2tfcGFnZShiaC0+Yl9wYWdlKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UoYmgtPmJfcGFnZSk7CisJcmV0dXJuIGJoOworfQorCiBpbnQgbmlsZnNfYnRub2RlX3N1Ym1pdF9ibG9jayhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqYnRuYywgX191NjQgYmxvY2tuciwKLQkJCSAgICAgIHNlY3Rvcl90IHBibG9ja25yLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipwYmgsCi0JCQkgICAgICBpbnQgbmV3YmxrKQorCQkJICAgICAgc2VjdG9yX3QgcGJsb2NrbnIsIHN0cnVjdCBidWZmZXJfaGVhZCAqKnBiaCkKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOSUxGU19CVE5DX0koYnRuYyk7CkBAIC04MSwxOSArMTA2LDYgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAllcnIgPSAtRUVYSVNUOyAvKiBpbnRlcm5hbCBjb2RlICovCi0JaWYgKG5ld2JsaykgewotCQlpZiAodW5saWtlbHkoYnVmZmVyX21hcHBlZChiaCkgfHwgYnVmZmVyX3VwdG9kYXRlKGJoKSB8fAotCQkJICAgICBidWZmZXJfZGlydHkoYmgpKSkgewotCQkJYnJlbHNlKGJoKTsKLQkJCUJVRygpOwotCQl9Ci0JCW1lbXNldChiaC0+Yl9kYXRhLCAwLCAxIDw8IGlub2RlLT5pX2Jsa2JpdHMpOwotCQliaC0+Yl9iZGV2ID0gTklMRlNfSV9OSUxGUyhpbm9kZSktPm5zX2JkZXY7Ci0JCWJoLT5iX2Jsb2NrbnIgPSBibG9ja25yOwotCQlzZXRfYnVmZmVyX21hcHBlZChiaCk7Ci0JCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwotCQlnb3RvIGZvdW5kOwotCX0KIAogCWlmIChidWZmZXJfdXB0b2RhdGUoYmgpIHx8IGJ1ZmZlcl9kaXJ0eShiaCkpCiAJCWdvdG8gZm91bmQ7CkBAIC0xMzUsMjcgKzE0Nyw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotaW50IG5pbGZzX2J0bm9kZV9nZXQoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKmJ0bmMsIF9fdTY0IGJsb2NrbnIsCi0JCSAgICAgc2VjdG9yX3QgcGJsb2NrbnIsIHN0cnVjdCBidWZmZXJfaGVhZCAqKnBiaCwgaW50IG5ld2JsaykKLXsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwotCWludCBlcnI7Ci0KLQllcnIgPSBuaWxmc19idG5vZGVfc3VibWl0X2Jsb2NrKGJ0bmMsIGJsb2NrbnIsIHBibG9ja25yLCBwYmgsIG5ld2Jsayk7Ci0JaWYgKGVyciA9PSAtRUVYSVNUKSAvKiBpbnRlcm5hbCBjb2RlIChjYWNoZSBoaXQpICovCi0JCXJldHVybiAwOwotCWlmICh1bmxpa2VseShlcnIpKQotCQlyZXR1cm4gZXJyOwotCi0JYmggPSAqcGJoOwotCXdhaXRfb25fYnVmZmVyKGJoKTsKLQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKLQkJYnJlbHNlKGJoKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCXJldHVybiAwOwotfQotCiAvKioKICAqIG5pbGZzX2J0bm9kZV9kZWxldGUgLSBkZWxldGUgQi10cmVlIG5vZGUgYnVmZmVyCiAgKiBAYmg6IGJ1ZmZlciB0byBiZSBkZWxldGVkCkBAIC0yNDQsMTIgKzIzNSwxMyBAQAogCQl1bmxvY2tfcGFnZShvYmgtPmJfcGFnZSk7CiAJfQogCi0JZXJyID0gbmlsZnNfYnRub2RlX2dldChidG5jLCBuZXdrZXksIDAsICZuYmgsIDEpOwotCWlmIChsaWtlbHkoIWVycikpIHsKLQkJQlVHX09OKG5iaCA9PSBvYmgpOwotCQljdHh0LT5uZXdiaCA9IG5iaDsKLQl9Ci0JcmV0dXJuIGVycjsKKwluYmggPSBuaWxmc19idG5vZGVfY3JlYXRlX2Jsb2NrKGJ0bmMsIG5ld2tleSk7CisJaWYgKCFuYmgpCisJCXJldHVybiAtRU5PTUVNOworCisJQlVHX09OKG5iaCA9PSBvYmgpOworCWN0eHQtPm5ld2JoID0gbmJoOworCXJldHVybiAwOwogCiAgZmFpbGVkX3VubG9jazoKIAl1bmxvY2tfcGFnZShvYmgtPmJfcGFnZSk7CmRpZmYgLS1naXQgYS9mcy9uaWxmczIvYnRub2RlLmggYi9mcy9uaWxmczIvYnRub2RlLmgKaW5kZXggM2UyMjc1MS4uMDdkYTgzZiAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL2J0bm9kZS5oCisrKyBiL2ZzL25pbGZzMi9idG5vZGUuaApAQCAtNDAsMTAgKzQwLDEwIEBACiB2b2lkIG5pbGZzX2J0bm9kZV9jYWNoZV9pbml0X29uY2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKik7CiB2b2lkIG5pbGZzX2J0bm9kZV9jYWNoZV9pbml0KHN0cnVjdCBhZGRyZXNzX3NwYWNlICosIHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICopOwogdm9pZCBuaWxmc19idG5vZGVfY2FjaGVfY2xlYXIoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKik7CitzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5pbGZzX2J0bm9kZV9jcmVhdGVfYmxvY2soc3RydWN0IGFkZHJlc3Nfc3BhY2UgKmJ0bmMsCisJCQkJCSAgICAgIF9fdTY0IGJsb2NrbnIpOwogaW50IG5pbGZzX2J0bm9kZV9zdWJtaXRfYmxvY2soc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiwgX191NjQsIHNlY3Rvcl90LAotCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqLCBpbnQpOwotaW50IG5pbGZzX2J0bm9kZV9nZXQoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiwgX191NjQsIHNlY3Rvcl90LAotCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKiwgaW50KTsKKwkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKik7CiB2b2lkIG5pbGZzX2J0bm9kZV9kZWxldGUoc3RydWN0IGJ1ZmZlcl9oZWFkICopOwogaW50IG5pbGZzX2J0bm9kZV9wcmVwYXJlX2NoYW5nZV9rZXkoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiwKIAkJCQkgICAgc3RydWN0IG5pbGZzX2J0bm9kZV9jaGtleV9jdHh0ICopOwpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL2J0cmVlLmMgYi9mcy9uaWxmczIvYnRyZWUuYwppbmRleCBlMjViNTA3Li43Y2RkOThiIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvYnRyZWUuYworKysgYi9mcy9uaWxmczIvYnRyZWUuYwpAQCAtMTE0LDcgKzExNCwxOCBAQAogewogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICpidG5jID0KIAkJJk5JTEZTX0JNQVBfSSgoc3RydWN0IG5pbGZzX2JtYXAgKilidHJlZSktPmlfYnRub2RlX2NhY2hlOwotCXJldHVybiBuaWxmc19idG5vZGVfZ2V0KGJ0bmMsIHB0ciwgMCwgYmhwLCAwKTsKKwlpbnQgZXJyOworCisJZXJyID0gbmlsZnNfYnRub2RlX3N1Ym1pdF9ibG9jayhidG5jLCBwdHIsIDAsIGJocCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVyciA9PSAtRUVYSVNUID8gMCA6IGVycjsKKworCXdhaXRfb25fYnVmZmVyKCpiaHApOworCWlmICghYnVmZmVyX3VwdG9kYXRlKCpiaHApKSB7CisJCWJyZWxzZSgqYmhwKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG5pbGZzX2J0cmVlX2dldF9uZXdfYmxvY2soY29uc3Qgc3RydWN0IG5pbGZzX2J0cmVlICpidHJlZSwKQEAgLTEyMiwxMiArMTMzLDE1IEBACiB7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKmJ0bmMgPQogCQkmTklMRlNfQk1BUF9JKChzdHJ1Y3QgbmlsZnNfYm1hcCAqKWJ0cmVlKS0+aV9idG5vZGVfY2FjaGU7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCi0JcmV0ID0gbmlsZnNfYnRub2RlX2dldChidG5jLCBwdHIsIDAsIGJocCwgMSk7Ci0JaWYgKCFyZXQpCi0JCXNldF9idWZmZXJfbmlsZnNfdm9sYXRpbGUoKmJocCk7Ci0JcmV0dXJuIHJldDsKKwliaCA9IG5pbGZzX2J0bm9kZV9jcmVhdGVfYmxvY2soYnRuYywgcHRyKTsKKwlpZiAoIWJoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNldF9idWZmZXJfbmlsZnNfdm9sYXRpbGUoYmgpOworCSpiaHAgPSBiaDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQKQEAgLTQ0NCw2ICs0NTgsMTggQEAKIAkJbmlsZnNfYnRyZWVfZ2V0X25vbnJvb3Rfbm9kZShwYXRoLCBsZXZlbCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50CituaWxmc19idHJlZV9iYWRfbm9kZShzdHJ1Y3QgbmlsZnNfYnRyZWVfbm9kZSAqbm9kZSwgaW50IGxldmVsKQoreworCWlmICh1bmxpa2VseShuaWxmc19idHJlZV9ub2RlX2dldF9sZXZlbChub2RlKSAhPSBsZXZlbCkpIHsKKwkJZHVtcF9zdGFjaygpOworCQlwcmludGsoS0VSTl9DUklUICJOSUxGUzogYnRyZWUgbGV2ZWwgbWlzbWF0Y2g6ICVkICE9ICVkXG4iLAorCQkgICAgICAgbmlsZnNfYnRyZWVfbm9kZV9nZXRfbGV2ZWwobm9kZSksIGxldmVsKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IG5pbGZzX2J0cmVlX2RvX2xvb2t1cChjb25zdCBzdHJ1Y3QgbmlsZnNfYnRyZWUgKmJ0cmVlLAogCQkJCSBzdHJ1Y3QgbmlsZnNfYnRyZWVfcGF0aCAqcGF0aCwKIAkJCQkgX191NjQga2V5LCBfX3U2NCAqcHRycCwgaW50IG1pbmxldmVsKQpAQCAtNDY3LDcgKzQ5Myw4IEBACiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAkJbm9kZSA9IG5pbGZzX2J0cmVlX2dldF9ub25yb290X25vZGUocGF0aCwgbGV2ZWwpOwotCQlCVUdfT04obGV2ZWwgIT0gbmlsZnNfYnRyZWVfbm9kZV9nZXRfbGV2ZWwobm9kZSkpOworCQlpZiAobmlsZnNfYnRyZWVfYmFkX25vZGUobm9kZSwgbGV2ZWwpKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWlmICghZm91bmQpCiAJCQlmb3VuZCA9IG5pbGZzX2J0cmVlX25vZGVfbG9va3VwKG5vZGUsIGtleSwgJmluZGV4KTsKIAkJZWxzZQpAQCAtNTEyLDcgKzUzOSw4IEBACiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAkJbm9kZSA9IG5pbGZzX2J0cmVlX2dldF9ub25yb290X25vZGUocGF0aCwgbGV2ZWwpOwotCQlCVUdfT04obGV2ZWwgIT0gbmlsZnNfYnRyZWVfbm9kZV9nZXRfbGV2ZWwobm9kZSkpOworCQlpZiAobmlsZnNfYnRyZWVfYmFkX25vZGUobm9kZSwgbGV2ZWwpKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWluZGV4ID0gbmlsZnNfYnRyZWVfbm9kZV9nZXRfbmNoaWxkcmVuKG5vZGUpIC0gMTsKIAkJcHRyID0gbmlsZnNfYnRyZWVfbm9kZV9nZXRfcHRyKGJ0cmVlLCBub2RlLCBpbmRleCk7CiAJCXBhdGhbbGV2ZWxdLmJwX2luZGV4ID0gaW5kZXg7CkBAIC02MzgsMTMgKzY2NiwxMSBAQAogewogCWlmIChsZXZlbCA8IG5pbGZzX2J0cmVlX2hlaWdodChidHJlZSkgLSAxKSB7CiAJCWRvIHsKLQkJCWxvY2tfYnVmZmVyKHBhdGhbbGV2ZWxdLmJwX2JoKTsKIAkJCW5pbGZzX2J0cmVlX25vZGVfc2V0X2tleSgKIAkJCQluaWxmc19idHJlZV9nZXRfbm9ucm9vdF9ub2RlKHBhdGgsIGxldmVsKSwKIAkJCQlwYXRoW2xldmVsXS5icF9pbmRleCwga2V5KTsKIAkJCWlmICghYnVmZmVyX2RpcnR5KHBhdGhbbGV2ZWxdLmJwX2JoKSkKIAkJCQluaWxmc19idG5vZGVfbWFya19kaXJ0eShwYXRoW2xldmVsXS5icF9iaCk7Ci0JCQl1bmxvY2tfYnVmZmVyKHBhdGhbbGV2ZWxdLmJwX2JoKTsKIAkJfSB3aGlsZSAoKHBhdGhbbGV2ZWxdLmJwX2luZGV4ID09IDApICYmCiAJCQkgKCsrbGV2ZWwgPCBuaWxmc19idHJlZV9oZWlnaHQoYnRyZWUpIC0gMSkpOwogCX0KQEAgLTY2MywxMyArNjg5LDExIEBACiAJc3RydWN0IG5pbGZzX2J0cmVlX25vZGUgKm5vZGU7CiAKIAlpZiAobGV2ZWwgPCBuaWxmc19idHJlZV9oZWlnaHQoYnRyZWUpIC0gMSkgewotCQlsb2NrX2J1ZmZlcihwYXRoW2xldmVsXS5icF9iaCk7CiAJCW5vZGUgPSBuaWxmc19idHJlZV9nZXRfbm9ucm9vdF9ub2RlKHBhdGgsIGxldmVsKTsKIAkJbmlsZnNfYnRyZWVfbm9kZV9pbnNlcnQoYnRyZWUsIG5vZGUsICprZXlwLCAqcHRycCwKIAkJCQkJcGF0aFtsZXZlbF0uYnBfaW5kZXgpOwogCQlpZiAoIWJ1ZmZlcl9kaXJ0eShwYXRoW2xldmVsXS5icF9iaCkpCiAJCQluaWxmc19idG5vZGVfbWFya19kaXJ0eShwYXRoW2xldmVsXS5icF9iaCk7Ci0JCXVubG9ja19idWZmZXIocGF0aFtsZXZlbF0uYnBfYmgpOwogCiAJCWlmIChwYXRoW2xldmVsXS5icF9pbmRleCA9PSAwKQogCQkJbmlsZnNfYnRyZWVfcHJvbW90ZV9rZXkoYnRyZWUsIHBhdGgsIGxldmVsICsgMSwKQEAgLTY4OSw5ICs3MTMsNiBAQAogCXN0cnVjdCBuaWxmc19idHJlZV9ub2RlICpub2RlLCAqbGVmdDsKIAlpbnQgbmNoaWxkcmVuLCBsbmNoaWxkcmVuLCBuLCBtb3ZlOwogCi0JbG9ja19idWZmZXIocGF0aFtsZXZlbF0uYnBfYmgpOwotCWxvY2tfYnVmZmVyKHBhdGhbbGV2ZWxdLmJwX3NpYl9iaCk7Ci0KIAlub2RlID0gbmlsZnNfYnRyZWVfZ2V0X25vbnJvb3Rfbm9kZShwYXRoLCBsZXZlbCk7CiAJbGVmdCA9IG5pbGZzX2J0cmVlX2dldF9zaWJfbm9kZShwYXRoLCBsZXZlbCk7CiAJbmNoaWxkcmVuID0gbmlsZnNfYnRyZWVfbm9kZV9nZXRfbmNoaWxkcmVuKG5vZGUpOwpAQCAtNzEyLDkgKzczMyw2IEBACiAJaWYgKCFidWZmZXJfZGlydHkocGF0aFtsZXZlbF0uYnBfc2liX2JoKSkKIAkJbmlsZnNfYnRub2RlX21hcmtfZGlydHkocGF0aFtsZXZlbF0uYnBfc2liX2JoKTsKIAotCXVubG9ja19idWZmZXIocGF0aFtsZXZlbF0uYnBfYmgpOwotCXVubG9ja19idWZmZXIocGF0aFtsZXZlbF0uYnBfc2liX2JoKTsKLQogCW5pbGZzX2J0cmVlX3Byb21vdGVfa2V5KGJ0cmVlLCBwYXRoLCBsZXZlbCArIDEsCiAJCQkJbmlsZnNfYnRyZWVfbm9kZV9nZXRfa2V5KG5vZGUsIDApKTsKIApAQCAtNzQwLDkgKzc1OCw2IEBACiAJc3RydWN0IG5pbGZzX2J0cmVlX25vZGUgKm5vZGUsICpyaWdodDsKIAlpbnQgbmNoaWxkcmVuLCBybmNoaWxkcmVuLCBuLCBtb3ZlOwogCi0JbG9ja19idWZmZXIocGF0aFtsZXZlbF0uYnBfYmgpOwotCWxvY2tfYnVmZmVyKHBhdGhbbGV2ZWxdLmJwX3NpYl9iaCk7Ci0KIAlub2RlID0gbmlsZnNfYnRyZWVfZ2V0X25vbnJvb3Rfbm9kZShwYXRoLCBsZXZlbCk7CiAJcmlnaHQgPSBuaWxmc19idHJlZV9nZXRfc2liX25vZGUocGF0aCwgbGV2ZWwpOwogCW5jaGlsZHJlbiA9IG5pbGZzX2J0cmVlX25vZGVfZ2V0X25jaGlsZHJlbihub2RlKTsKQEAgLTc2Myw5ICs3NzgsNiBAQAogCWlmICghYnVmZmVyX2RpcnR5KHBhdGhbbGV2ZWxdLmJwX3NpYl9iaCkpCiAJCW5pbGZzX2J0bm9kZV9tYXJrX2RpcnR5KHBhdGhbbGV2ZWxdLmJwX3NpYl9iaCk7CiAKLQl1bmxvY2tfYnVmZmVyKHBhdGhbbGV2ZWxdLmJwX2JoKTsKLQl1bmxvY2tfYnVmZmVyKHBhdGhbbGV2ZWxdLmJwX3NpYl9iaCk7Ci0KIAlwYXRoW2xldmVsICsgMV0uYnBfaW5kZXgrKzsKIAluaWxmc19idHJlZV9wcm9tb3RlX2tleShidHJlZSwgcGF0aCwgbGV2ZWwgKyAxLAogCQkJCW5pbGZzX2J0cmVlX25vZGVfZ2V0X2tleShyaWdodCwgMCkpOwpAQCAtNzk0LDkgKzgwNiw2IEBACiAJX191NjQgbmV3cHRyOwogCWludCBuY2hpbGRyZW4sIG4sIG1vdmU7CiAKLQlsb2NrX2J1ZmZlcihwYXRoW2xldmVsXS5icF9iaCk7Ci0JbG9ja19idWZmZXIocGF0aFtsZXZlbF0uYnBfc2liX2JoKTsKLQogCW5vZGUgPSBuaWxmc19idHJlZV9nZXRfbm9ucm9vdF9ub2RlKHBhdGgsIGxldmVsKTsKIAlyaWdodCA9IG5pbGZzX2J0cmVlX2dldF9zaWJfbm9kZShwYXRoLCBsZXZlbCk7CiAJbmNoaWxkcmVuID0gbmlsZnNfYnRyZWVfbm9kZV9nZXRfbmNoaWxkcmVuKG5vZGUpOwpAQCAtODE1LDkgKzgyNCw2IEBACiAJaWYgKCFidWZmZXJfZGlydHkocGF0aFtsZXZlbF0uYnBfc2liX2JoKSkKIAkJbmlsZnNfYnRub2RlX21hcmtfZGlydHkocGF0aFtsZXZlbF0uYnBfc2liX2JoKTsKIAotCXVubG9ja19idWZmZXIocGF0aFtsZXZlbF0uYnBfYmgpOwotCXVubG9ja19idWZmZXIocGF0aFtsZXZlbF0uYnBfc2liX2JoKTsKLQogCW5ld2tleSA9IG5pbGZzX2J0cmVlX25vZGVfZ2V0X2tleShyaWdodCwgMCk7CiAJbmV3cHRyID0gcGF0aFtsZXZlbF0uYnBfbmV3cmVxLmJwcl9wdHI7CiAKQEAgLTg1Miw4ICs4NTgsNiBAQAogCXN0cnVjdCBuaWxmc19idHJlZV9ub2RlICpyb290LCAqY2hpbGQ7CiAJaW50IG47CiAKLQlsb2NrX2J1ZmZlcihwYXRoW2xldmVsXS5icF9zaWJfYmgpOwotCiAJcm9vdCA9IG5pbGZzX2J0cmVlX2dldF9yb290KGJ0cmVlKTsKIAljaGlsZCA9IG5pbGZzX2J0cmVlX2dldF9zaWJfbm9kZShwYXRoLCBsZXZlbCk7CiAKQEAgLTg2NSw4ICs4NjksNiBAQAogCWlmICghYnVmZmVyX2RpcnR5KHBhdGhbbGV2ZWxdLmJwX3NpYl9iaCkpCiAJCW5pbGZzX2J0bm9kZV9tYXJrX2RpcnR5KHBhdGhbbGV2ZWxdLmJwX3NpYl9iaCk7CiAKLQl1bmxvY2tfYnVmZmVyKHBhdGhbbGV2ZWxdLmJwX3NpYl9iaCk7Ci0KIAlwYXRoW2xldmVsXS5icF9iaCA9IHBhdGhbbGV2ZWxdLmJwX3NpYl9iaDsKIAlwYXRoW2xldmVsXS5icF9zaWJfYmggPSBOVUxMOwogCkBAIC0xMDIzLDExICsxMDI1LDkgQEAKIAogCQlzdGF0cy0+YnNfbmJsb2NrcysrOwogCi0JCWxvY2tfYnVmZmVyKGJoKTsKIAkJbmlsZnNfYnRyZWVfbm9kZV9pbml0KGJ0cmVlLAogCQkJCSAgICAgIChzdHJ1Y3QgbmlsZnNfYnRyZWVfbm9kZSAqKWJoLT5iX2RhdGEsCiAJCQkJICAgICAgMCwgbGV2ZWwsIDAsIE5VTEwsIE5VTEwpOwotCQl1bmxvY2tfYnVmZmVyKGJoKTsKIAkJcGF0aFtsZXZlbF0uYnBfc2liX2JoID0gYmg7CiAJCXBhdGhbbGV2ZWxdLmJwX29wID0gbmlsZnNfYnRyZWVfc3BsaXQ7CiAJfQpAQCAtMTA1MiwxMCArMTA1Miw4IEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyX291dF9jdXJyX25vZGU7CiAKLQlsb2NrX2J1ZmZlcihiaCk7CiAJbmlsZnNfYnRyZWVfbm9kZV9pbml0KGJ0cmVlLCAoc3RydWN0IG5pbGZzX2J0cmVlX25vZGUgKiliaC0+Yl9kYXRhLAogCQkJICAgICAgMCwgbGV2ZWwsIDAsIE5VTEwsIE5VTEwpOwotCXVubG9ja19idWZmZXIoYmgpOwogCXBhdGhbbGV2ZWxdLmJwX3NpYl9iaCA9IGJoOwogCXBhdGhbbGV2ZWxdLmJwX29wID0gbmlsZnNfYnRyZWVfZ3JvdzsKIApAQCAtMTE1NCwxMyArMTE1MiwxMSBAQAogCXN0cnVjdCBuaWxmc19idHJlZV9ub2RlICpub2RlOwogCiAJaWYgKGxldmVsIDwgbmlsZnNfYnRyZWVfaGVpZ2h0KGJ0cmVlKSAtIDEpIHsKLQkJbG9ja19idWZmZXIocGF0aFtsZXZlbF0uYnBfYmgpOwogCQlub2RlID0gbmlsZnNfYnRyZWVfZ2V0X25vbnJvb3Rfbm9kZShwYXRoLCBsZXZlbCk7CiAJCW5pbGZzX2J0cmVlX25vZGVfZGVsZXRlKGJ0cmVlLCBub2RlLCBrZXlwLCBwdHJwLAogCQkJCQlwYXRoW2xldmVsXS5icF9pbmRleCk7CiAJCWlmICghYnVmZmVyX2RpcnR5KHBhdGhbbGV2ZWxdLmJwX2JoKSkKIAkJCW5pbGZzX2J0bm9kZV9tYXJrX2RpcnR5KHBhdGhbbGV2ZWxdLmJwX2JoKTsKLQkJdW5sb2NrX2J1ZmZlcihwYXRoW2xldmVsXS5icF9iaCk7CiAJCWlmIChwYXRoW2xldmVsXS5icF9pbmRleCA9PSAwKQogCQkJbmlsZnNfYnRyZWVfcHJvbW90ZV9rZXkoYnRyZWUsIHBhdGgsIGxldmVsICsgMSwKIAkJCQluaWxmc19idHJlZV9ub2RlX2dldF9rZXkobm9kZSwgMCkpOwpAQCAtMTE4MCw5ICsxMTc2LDYgQEAKIAogCW5pbGZzX2J0cmVlX2RvX2RlbGV0ZShidHJlZSwgcGF0aCwgbGV2ZWwsIGtleXAsIHB0cnApOwogCi0JbG9ja19idWZmZXIocGF0aFtsZXZlbF0uYnBfYmgpOwotCWxvY2tfYnVmZmVyKHBhdGhbbGV2ZWxdLmJwX3NpYl9iaCk7Ci0KIAlub2RlID0gbmlsZnNfYnRyZWVfZ2V0X25vbnJvb3Rfbm9kZShwYXRoLCBsZXZlbCk7CiAJbGVmdCA9IG5pbGZzX2J0cmVlX2dldF9zaWJfbm9kZShwYXRoLCBsZXZlbCk7CiAJbmNoaWxkcmVuID0gbmlsZnNfYnRyZWVfbm9kZV9nZXRfbmNoaWxkcmVuKG5vZGUpOwpAQCAtMTE5Nyw5ICsxMTkwLDYgQEAKIAlpZiAoIWJ1ZmZlcl9kaXJ0eShwYXRoW2xldmVsXS5icF9zaWJfYmgpKQogCQluaWxmc19idG5vZGVfbWFya19kaXJ0eShwYXRoW2xldmVsXS5icF9zaWJfYmgpOwogCi0JdW5sb2NrX2J1ZmZlcihwYXRoW2xldmVsXS5icF9iaCk7Ci0JdW5sb2NrX2J1ZmZlcihwYXRoW2xldmVsXS5icF9zaWJfYmgpOwotCiAJbmlsZnNfYnRyZWVfcHJvbW90ZV9rZXkoYnRyZWUsIHBhdGgsIGxldmVsICsgMSwKIAkJCQluaWxmc19idHJlZV9ub2RlX2dldF9rZXkobm9kZSwgMCkpOwogCkBAIC0xMjE3LDkgKzEyMDcsNiBAQAogCiAJbmlsZnNfYnRyZWVfZG9fZGVsZXRlKGJ0cmVlLCBwYXRoLCBsZXZlbCwga2V5cCwgcHRycCk7CiAKLQlsb2NrX2J1ZmZlcihwYXRoW2xldmVsXS5icF9iaCk7Ci0JbG9ja19idWZmZXIocGF0aFtsZXZlbF0uYnBfc2liX2JoKTsKLQogCW5vZGUgPSBuaWxmc19idHJlZV9nZXRfbm9ucm9vdF9ub2RlKHBhdGgsIGxldmVsKTsKIAlyaWdodCA9IG5pbGZzX2J0cmVlX2dldF9zaWJfbm9kZShwYXRoLCBsZXZlbCk7CiAJbmNoaWxkcmVuID0gbmlsZnNfYnRyZWVfbm9kZV9nZXRfbmNoaWxkcmVuKG5vZGUpOwpAQCAtMTIzNCw5ICsxMjIxLDYgQEAKIAlpZiAoIWJ1ZmZlcl9kaXJ0eShwYXRoW2xldmVsXS5icF9zaWJfYmgpKQogCQluaWxmc19idG5vZGVfbWFya19kaXJ0eShwYXRoW2xldmVsXS5icF9zaWJfYmgpOwogCi0JdW5sb2NrX2J1ZmZlcihwYXRoW2xldmVsXS5icF9iaCk7Ci0JdW5sb2NrX2J1ZmZlcihwYXRoW2xldmVsXS5icF9zaWJfYmgpOwotCiAJcGF0aFtsZXZlbCArIDFdLmJwX2luZGV4Kys7CiAJbmlsZnNfYnRyZWVfcHJvbW90ZV9rZXkoYnRyZWUsIHBhdGgsIGxldmVsICsgMSwKIAkJCQluaWxmc19idHJlZV9ub2RlX2dldF9rZXkocmlnaHQsIDApKTsKQEAgLTEyNTUsOSArMTIzOSw2IEBACiAKIAluaWxmc19idHJlZV9kb19kZWxldGUoYnRyZWUsIHBhdGgsIGxldmVsLCBrZXlwLCBwdHJwKTsKIAotCWxvY2tfYnVmZmVyKHBhdGhbbGV2ZWxdLmJwX2JoKTsKLQlsb2NrX2J1ZmZlcihwYXRoW2xldmVsXS5icF9zaWJfYmgpOwotCiAJbm9kZSA9IG5pbGZzX2J0cmVlX2dldF9ub25yb290X25vZGUocGF0aCwgbGV2ZWwpOwogCWxlZnQgPSBuaWxmc19idHJlZV9nZXRfc2liX25vZGUocGF0aCwgbGV2ZWwpOwogCkBAIC0xMjY4LDkgKzEyNDksNiBAQAogCWlmICghYnVmZmVyX2RpcnR5KHBhdGhbbGV2ZWxdLmJwX3NpYl9iaCkpCiAJCW5pbGZzX2J0bm9kZV9tYXJrX2RpcnR5KHBhdGhbbGV2ZWxdLmJwX3NpYl9iaCk7CiAKLQl1bmxvY2tfYnVmZmVyKHBhdGhbbGV2ZWxdLmJwX2JoKTsKLQl1bmxvY2tfYnVmZmVyKHBhdGhbbGV2ZWxdLmJwX3NpYl9iaCk7Ci0KIAluaWxmc19idG5vZGVfZGVsZXRlKHBhdGhbbGV2ZWxdLmJwX2JoKTsKIAlwYXRoW2xldmVsXS5icF9iaCA9IHBhdGhbbGV2ZWxdLmJwX3NpYl9iaDsKIAlwYXRoW2xldmVsXS5icF9zaWJfYmggPSBOVUxMOwpAQCAtMTI4Niw5ICsxMjY0LDYgQEAKIAogCW5pbGZzX2J0cmVlX2RvX2RlbGV0ZShidHJlZSwgcGF0aCwgbGV2ZWwsIGtleXAsIHB0cnApOwogCi0JbG9ja19idWZmZXIocGF0aFtsZXZlbF0uYnBfYmgpOwotCWxvY2tfYnVmZmVyKHBhdGhbbGV2ZWxdLmJwX3NpYl9iaCk7Ci0KIAlub2RlID0gbmlsZnNfYnRyZWVfZ2V0X25vbnJvb3Rfbm9kZShwYXRoLCBsZXZlbCk7CiAJcmlnaHQgPSBuaWxmc19idHJlZV9nZXRfc2liX25vZGUocGF0aCwgbGV2ZWwpOwogCkBAIC0xMjk5LDkgKzEyNzQsNiBAQAogCWlmICghYnVmZmVyX2RpcnR5KHBhdGhbbGV2ZWxdLmJwX2JoKSkKIAkJbmlsZnNfYnRub2RlX21hcmtfZGlydHkocGF0aFtsZXZlbF0uYnBfYmgpOwogCi0JdW5sb2NrX2J1ZmZlcihwYXRoW2xldmVsXS5icF9iaCk7Ci0JdW5sb2NrX2J1ZmZlcihwYXRoW2xldmVsXS5icF9zaWJfYmgpOwotCiAJbmlsZnNfYnRub2RlX2RlbGV0ZShwYXRoW2xldmVsXS5icF9zaWJfYmgpOwogCXBhdGhbbGV2ZWxdLmJwX3NpYl9iaCA9IE5VTEw7CiAJcGF0aFtsZXZlbCArIDFdLmJwX2luZGV4Kys7CkBAIC0xMzE2LDcgKzEyODgsNiBAQAogCiAJbmlsZnNfYnRyZWVfZG9fZGVsZXRlKGJ0cmVlLCBwYXRoLCBsZXZlbCwga2V5cCwgcHRycCk7CiAKLQlsb2NrX2J1ZmZlcihwYXRoW2xldmVsXS5icF9iaCk7CiAJcm9vdCA9IG5pbGZzX2J0cmVlX2dldF9yb290KGJ0cmVlKTsKIAljaGlsZCA9IG5pbGZzX2J0cmVlX2dldF9ub25yb290X25vZGUocGF0aCwgbGV2ZWwpOwogCkBAIC0xMzI0LDcgKzEyOTUsNiBAQAogCW5pbGZzX2J0cmVlX25vZGVfc2V0X2xldmVsKHJvb3QsIGxldmVsKTsKIAluID0gbmlsZnNfYnRyZWVfbm9kZV9nZXRfbmNoaWxkcmVuKGNoaWxkKTsKIAluaWxmc19idHJlZV9ub2RlX21vdmVfbGVmdChidHJlZSwgcm9vdCwgY2hpbGQsIG4pOwotCXVubG9ja19idWZmZXIocGF0aFtsZXZlbF0uYnBfYmgpOwogCiAJbmlsZnNfYnRub2RlX2RlbGV0ZShwYXRoW2xldmVsXS5icF9iaCk7CiAJcGF0aFtsZXZlbF0uYnBfYmggPSBOVUxMOwpAQCAtMTY5OSw3ICsxNjY5LDYgQEAKIAkJbmlsZnNfYm1hcF9jb21taXRfYWxsb2NfcHRyKGJtYXAsIG5yZXEsIGRhdCk7CiAKIAkJLyogY3JlYXRlIGNoaWxkIG5vZGUgYXQgbGV2ZWwgMSAqLwotCQlsb2NrX2J1ZmZlcihiaCk7CiAJCW5vZGUgPSAoc3RydWN0IG5pbGZzX2J0cmVlX25vZGUgKiliaC0+Yl9kYXRhOwogCQluaWxmc19idHJlZV9ub2RlX2luaXQoYnRyZWUsIG5vZGUsIDAsIDEsIG4sIGtleXMsIHB0cnMpOwogCQluaWxmc19idHJlZV9ub2RlX2luc2VydChidHJlZSwgbm9kZSwKQEAgLTE3MDksNyArMTY3OCw2IEBACiAJCWlmICghbmlsZnNfYm1hcF9kaXJ0eShibWFwKSkKIAkJCW5pbGZzX2JtYXBfc2V0X2RpcnR5KGJtYXApOwogCi0JCXVubG9ja19idWZmZXIoYmgpOwogCQlicmVsc2UoYmgpOwogCiAJCS8qIGNyZWF0ZSByb290IG5vZGUgYXQgbGV2ZWwgMiAqLwpAQCAtMjA1MCw3ICsyMDE4LDcgQEAKIAlmb3IgKGxldmVsID0gTklMRlNfQlRSRUVfTEVWRUxfTk9ERV9NSU47CiAJICAgICBsZXZlbCA8IE5JTEZTX0JUUkVFX0xFVkVMX01BWDsKIAkgICAgIGxldmVsKyspCi0JCWxpc3Rfc3BsaWNlKCZsaXN0c1tsZXZlbF0sIGxpc3RwLT5wcmV2KTsKKwkJbGlzdF9zcGxpY2VfdGFpbCgmbGlzdHNbbGV2ZWxdLCBsaXN0cCk7CiB9CiAKIHN0YXRpYyBpbnQgbmlsZnNfYnRyZWVfYXNzaWduX3Aoc3RydWN0IG5pbGZzX2J0cmVlICpidHJlZSwKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9idHJlZS5oIGIvZnMvbmlsZnMyL2J0cmVlLmgKaW5kZXggMGU3MmJiYi4uNGI4MmQ4NCAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL2J0cmVlLmgKKysrIGIvZnMvbmlsZnMyL2J0cmVlLmgKQEAgLTM0LDI4ICszNCw2IEBACiBzdHJ1Y3QgbmlsZnNfYnRyZWVfcGF0aDsKIAogLyoqCi0gKiBzdHJ1Y3QgbmlsZnNfYnRyZWVfbm9kZSAtIEItdHJlZSBub2RlCi0gKiBAYm5fZmxhZ3M6IGZsYWdzCi0gKiBAYm5fbGV2ZWw6IGxldmVsCi0gKiBAYm5fbmNoaWxkcmVuOiBudW1iZXIgb2YgY2hpbGRyZW4KLSAqIEBibl9wYWQ6IHBhZGRpbmcKLSAqLwotc3RydWN0IG5pbGZzX2J0cmVlX25vZGUgewotCV9fdTggYm5fZmxhZ3M7Ci0JX191OCBibl9sZXZlbDsKLQlfX2xlMTYgYm5fbmNoaWxkcmVuOwotCV9fbGUzMiBibl9wYWQ7Ci19OwotCi0vKiBmbGFncyAqLwotI2RlZmluZSBOSUxGU19CVFJFRV9OT0RFX1JPT1QJMHgwMQotCi0vKiBsZXZlbCAqLwotI2RlZmluZSBOSUxGU19CVFJFRV9MRVZFTF9EQVRBCQkwCi0jZGVmaW5lIE5JTEZTX0JUUkVFX0xFVkVMX05PREVfTUlOCShOSUxGU19CVFJFRV9MRVZFTF9EQVRBICsgMSkKLSNkZWZpbmUgTklMRlNfQlRSRUVfTEVWRUxfTUFYCQkxNAotCi0vKioKICAqIHN0cnVjdCBuaWxmc19idHJlZSAtIEItdHJlZSBzdHJ1Y3R1cmUKICAqIEBidF9ibWFwOiBibWFwIGJhc2Ugc3RydWN0dXJlCiAgKi8KZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9jcGZpbGUuYyBiL2ZzL25pbGZzMi9jcGZpbGUuYwppbmRleCAzZjVkNWQwLi5kNWFkNTRlIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvY3BmaWxlLmMKKysrIGIvZnMvbmlsZnMyL2NwZmlsZS5jCkBAIC05MjYsMyArOTI2LDI5IEBACiAJdXBfcmVhZCgmTklMRlNfTURUKGNwZmlsZSktPm1pX3NlbSk7CiAJcmV0dXJuIHJldDsKIH0KKworLyoqCisgKiBuaWxmc19jcGZpbGVfcmVhZCAtIHJlYWQgY3BmaWxlIGlub2RlCisgKiBAY3BmaWxlOiBjcGZpbGUgaW5vZGUKKyAqIEByYXdfaW5vZGU6IG9uLWRpc2sgY3BmaWxlIGlub2RlCisgKi8KK2ludCBuaWxmc19jcGZpbGVfcmVhZChzdHJ1Y3QgaW5vZGUgKmNwZmlsZSwgc3RydWN0IG5pbGZzX2lub2RlICpyYXdfaW5vZGUpCit7CisJcmV0dXJuIG5pbGZzX3JlYWRfaW5vZGVfY29tbW9uKGNwZmlsZSwgcmF3X2lub2RlKTsKK30KKworLyoqCisgKiBuaWxmc19jcGZpbGVfbmV3IC0gY3JlYXRlIGNwZmlsZQorICogQG5pbGZzOiBuaWxmcyBvYmplY3QKKyAqIEBjcHNpemU6IHNpemUgb2YgYSBjaGVja3BvaW50IGVudHJ5CisgKi8KK3N0cnVjdCBpbm9kZSAqbmlsZnNfY3BmaWxlX25ldyhzdHJ1Y3QgdGhlX25pbGZzICpuaWxmcywgc2l6ZV90IGNwc2l6ZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmNwZmlsZTsKKworCWNwZmlsZSA9IG5pbGZzX21kdF9uZXcobmlsZnMsIE5VTEwsIE5JTEZTX0NQRklMRV9JTk8sIDApOworCWlmIChjcGZpbGUpCisJCW5pbGZzX21kdF9zZXRfZW50cnlfc2l6ZShjcGZpbGUsIGNwc2l6ZSwKKwkJCQkJIHNpemVvZihzdHJ1Y3QgbmlsZnNfY3BmaWxlX2hlYWRlcikpOworCXJldHVybiBjcGZpbGU7Cit9CmRpZmYgLS1naXQgYS9mcy9uaWxmczIvY3BmaWxlLmggYi9mcy9uaWxmczIvY3BmaWxlLmgKaW5kZXggZGViZWE4OS4uYmMwODA5ZSAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL2NwZmlsZS5oCisrKyBiL2ZzL25pbGZzMi9jcGZpbGUuaApAQCAtNDAsNCArNDAsNyBAQAogc3NpemVfdCBuaWxmc19jcGZpbGVfZ2V0X2NwaW5mbyhzdHJ1Y3QgaW5vZGUgKiwgX191NjQgKiwgaW50LCB2b2lkICosIHVuc2lnbmVkLAogCQkJCXNpemVfdCk7CiAKK2ludCBuaWxmc19jcGZpbGVfcmVhZChzdHJ1Y3QgaW5vZGUgKmNwZmlsZSwgc3RydWN0IG5pbGZzX2lub2RlICpyYXdfaW5vZGUpOworc3RydWN0IGlub2RlICpuaWxmc19jcGZpbGVfbmV3KHN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzLCBzaXplX3QgY3BzaXplKTsKKwogI2VuZGlmCS8qIF9OSUxGU19DUEZJTEVfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL2RhdC5jIGIvZnMvbmlsZnMyL2RhdC5jCmluZGV4IDFmZjhlMTUuLjE4N2RkMDcgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9kYXQuYworKysgYi9mcy9uaWxmczIvZGF0LmMKQEAgLTMzLDYgKzMzLDE2IEBACiAjZGVmaW5lIE5JTEZTX0NOT19NSU4JKChfX3U2NCkxKQogI2RlZmluZSBOSUxGU19DTk9fTUFYCSh+KF9fdTY0KTApCiAKK3N0cnVjdCBuaWxmc19kYXRfaW5mbyB7CisJc3RydWN0IG5pbGZzX21kdF9pbmZvIG1pOworCXN0cnVjdCBuaWxmc19wYWxsb2NfY2FjaGUgcGFsbG9jX2NhY2hlOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmlsZnNfZGF0X2luZm8gKk5JTEZTX0RBVF9JKHN0cnVjdCBpbm9kZSAqZGF0KQoreworCXJldHVybiAoc3RydWN0IG5pbGZzX2RhdF9pbmZvICopTklMRlNfTURUKGRhdCk7Cit9CisKIHN0YXRpYyBpbnQgbmlsZnNfZGF0X3ByZXBhcmVfZW50cnkoc3RydWN0IGlub2RlICpkYXQsCiAJCQkJICAgc3RydWN0IG5pbGZzX3BhbGxvY19yZXEgKnJlcSwgaW50IGNyZWF0ZSkKIHsKQEAgLTQyNSwzICs0MzUsNDAgQEAKIAogCXJldHVybiBudmk7CiB9CisKKy8qKgorICogbmlsZnNfZGF0X3JlYWQgLSByZWFkIGRhdCBpbm9kZQorICogQGRhdDogZGF0IGlub2RlCisgKiBAcmF3X2lub2RlOiBvbi1kaXNrIGRhdCBpbm9kZQorICovCitpbnQgbmlsZnNfZGF0X3JlYWQoc3RydWN0IGlub2RlICpkYXQsIHN0cnVjdCBuaWxmc19pbm9kZSAqcmF3X2lub2RlKQoreworCXJldHVybiBuaWxmc19yZWFkX2lub2RlX2NvbW1vbihkYXQsIHJhd19pbm9kZSk7Cit9CisKKy8qKgorICogbmlsZnNfZGF0X25ldyAtIGNyZWF0ZSBkYXQgZmlsZQorICogQG5pbGZzOiBuaWxmcyBvYmplY3QKKyAqIEBlbnRyeV9zaXplOiBzaXplIG9mIGEgZGF0IGVudHJ5CisgKi8KK3N0cnVjdCBpbm9kZSAqbmlsZnNfZGF0X25ldyhzdHJ1Y3QgdGhlX25pbGZzICpuaWxmcywgc2l6ZV90IGVudHJ5X3NpemUpCit7CisJc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSBkYXRfbG9ja19rZXk7CisJc3RydWN0IGlub2RlICpkYXQ7CisJc3RydWN0IG5pbGZzX2RhdF9pbmZvICpkaTsKKwlpbnQgZXJyOworCisJZGF0ID0gbmlsZnNfbWR0X25ldyhuaWxmcywgTlVMTCwgTklMRlNfREFUX0lOTywgc2l6ZW9mKCpkaSkpOworCWlmIChkYXQpIHsKKwkJZXJyID0gbmlsZnNfcGFsbG9jX2luaXRfYmxvY2tncm91cChkYXQsIGVudHJ5X3NpemUpOworCQlpZiAodW5saWtlbHkoZXJyKSkgeworCQkJbmlsZnNfbWR0X2Rlc3Ryb3koZGF0KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJZGkgPSBOSUxGU19EQVRfSShkYXQpOworCQlsb2NrZGVwX3NldF9jbGFzcygmZGktPm1pLm1pX3NlbSwgJmRhdF9sb2NrX2tleSk7CisJCW5pbGZzX3BhbGxvY19zZXR1cF9jYWNoZShkYXQsICZkaS0+cGFsbG9jX2NhY2hlKTsKKwl9CisJcmV0dXJuIGRhdDsKK30KZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9kYXQuaCBiL2ZzL25pbGZzMi9kYXQuaAppbmRleCA0MDYwNzBkLi5kMzFjM2FhIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvZGF0LmgKKysrIGIvZnMvbmlsZnMyL2RhdC5oCkBAIC01Myw0ICs1Myw3IEBACiBpbnQgbmlsZnNfZGF0X21vdmUoc3RydWN0IGlub2RlICosIF9fdTY0LCBzZWN0b3JfdCk7CiBzc2l6ZV90IG5pbGZzX2RhdF9nZXRfdmluZm8oc3RydWN0IGlub2RlICosIHZvaWQgKiwgdW5zaWduZWQsIHNpemVfdCk7CiAKK2ludCBuaWxmc19kYXRfcmVhZChzdHJ1Y3QgaW5vZGUgKmRhdCwgc3RydWN0IG5pbGZzX2lub2RlICpyYXdfaW5vZGUpOworc3RydWN0IGlub2RlICpuaWxmc19kYXRfbmV3KHN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzLCBzaXplX3QgZW50cnlfc2l6ZSk7CisKICNlbmRpZgkvKiBfTklMRlNfREFUX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9kaXIuYyBiL2ZzL25pbGZzMi9kaXIuYwppbmRleCBlMDk3MDk5Li43NmQ4MDNlIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvZGlyLmMKKysrIGIvZnMvbmlsZnMyL2Rpci5jCkBAIC05OSw5ICs5OSw5IEBACiAJCQkJIE5VTEwsIG5pbGZzX2dldF9ibG9jayk7CiB9CiAKLXN0YXRpYyBpbnQgbmlsZnNfY29tbWl0X2NodW5rKHN0cnVjdCBwYWdlICpwYWdlLAotCQkJICAgICAgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCi0JCQkgICAgICB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3N0YXRpYyB2b2lkIG5pbGZzX2NvbW1pdF9jaHVuayhzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCSAgICAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCSAgICAgICB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmRpciA9IG1hcHBpbmctPmhvc3Q7CiAJc3RydWN0IG5pbGZzX3NiX2luZm8gKnNiaSA9IE5JTEZTX1NCKGRpci0+aV9zYik7CkBAIC0xMTIsMTUgKzExMiwxMyBAQAogCiAJbnJfZGlydHkgPSBuaWxmc19wYWdlX2NvdW50X2NsZWFuX2J1ZmZlcnMocGFnZSwgZnJvbSwgdG8pOwogCWNvcGllZCA9IGJsb2NrX3dyaXRlX2VuZChOVUxMLCBtYXBwaW5nLCBwb3MsIGxlbiwgbGVuLCBwYWdlLCBOVUxMKTsKLQlpZiAocG9zICsgY29waWVkID4gZGlyLT5pX3NpemUpIHsKKwlpZiAocG9zICsgY29waWVkID4gZGlyLT5pX3NpemUpCiAJCWlfc2l6ZV93cml0ZShkaXIsIHBvcyArIGNvcGllZCk7Ci0JCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKLQl9CiAJaWYgKElTX0RJUlNZTkMoZGlyKSkKIAkJbmlsZnNfc2V0X3RyYW5zYWN0aW9uX2ZsYWcoTklMRlNfVElfU1lOQyk7CiAJZXJyID0gbmlsZnNfc2V0X2ZpbGVfZGlydHkoc2JpLCBkaXIsIG5yX2RpcnR5KTsKKwlXQVJOX09OKGVycik7IC8qIGRvIG5vdCBoYXBwZW4gKi8KIAl1bmxvY2tfcGFnZShwYWdlKTsKLQlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBuaWxmc19jaGVja19wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQpAQCAtNDU1LDExICs0NTMsMTAgQEAKIAlCVUdfT04oZXJyKTsKIAlkZS0+aW5vZGUgPSBjcHVfdG9fbGU2NChpbm9kZS0+aV9pbm8pOwogCW5pbGZzX3NldF9kZV90eXBlKGRlLCBpbm9kZSk7Ci0JZXJyID0gbmlsZnNfY29tbWl0X2NodW5rKHBhZ2UsIG1hcHBpbmcsIGZyb20sIHRvKTsKKwluaWxmc19jb21taXRfY2h1bmsocGFnZSwgbWFwcGluZywgZnJvbSwgdG8pOwogCW5pbGZzX3B1dF9wYWdlKHBhZ2UpOwogCWRpci0+aV9tdGltZSA9IGRpci0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIC8qCU5JTEZTX0koZGlyKS0+aV9mbGFncyAmPSB+TklMRlNfQlRSRUVfRkw7ICovCi0JbWFya19pbm9kZV9kaXJ0eShkaXIpOwogfQogCiAvKgpAQCAtNTQ4LDEwICs1NDUsMTAgQEAKIAltZW1jcHkoZGUtPm5hbWUsIG5hbWUsIG5hbWVsZW4pOwogCWRlLT5pbm9kZSA9IGNwdV90b19sZTY0KGlub2RlLT5pX2lubyk7CiAJbmlsZnNfc2V0X2RlX3R5cGUoZGUsIGlub2RlKTsKLQllcnIgPSBuaWxmc19jb21taXRfY2h1bmsocGFnZSwgcGFnZS0+bWFwcGluZywgZnJvbSwgdG8pOworCW5pbGZzX2NvbW1pdF9jaHVuayhwYWdlLCBwYWdlLT5tYXBwaW5nLCBmcm9tLCB0byk7CiAJZGlyLT5pX210aW1lID0gZGlyLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogLyoJTklMRlNfSShkaXIpLT5pX2ZsYWdzICY9IH5OSUxGU19CVFJFRV9GTDsgKi8KLQltYXJrX2lub2RlX2RpcnR5KGRpcik7CisJbmlsZnNfbWFya19pbm9kZV9kaXJ0eShkaXIpOwogCS8qIE9GRlNFVF9DQUNIRSAqLwogb3V0X3B1dDoKIAluaWxmc19wdXRfcGFnZShwYWdlKTsKQEAgLTU5NSwxMCArNTkyLDkgQEAKIAlpZiAocGRlKQogCQlwZGUtPnJlY19sZW4gPSBjcHVfdG9fbGUxNih0byAtIGZyb20pOwogCWRpci0+aW5vZGUgPSAwOwotCWVyciA9IG5pbGZzX2NvbW1pdF9jaHVuayhwYWdlLCBtYXBwaW5nLCBmcm9tLCB0byk7CisJbmlsZnNfY29tbWl0X2NodW5rKHBhZ2UsIG1hcHBpbmcsIGZyb20sIHRvKTsKIAlpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOwogLyoJTklMRlNfSShpbm9kZSktPmlfZmxhZ3MgJj0gfk5JTEZTX0JUUkVFX0ZMOyAqLwotCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogb3V0OgogCW5pbGZzX3B1dF9wYWdlKHBhZ2UpOwogCXJldHVybiBlcnI7CkBAIC02NDAsNyArNjM2LDcgQEAKIAltZW1jcHkoZGUtPm5hbWUsICIuLlwwIiwgNCk7CiAJbmlsZnNfc2V0X2RlX3R5cGUoZGUsIGlub2RlKTsKIAlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7Ci0JZXJyID0gbmlsZnNfY29tbWl0X2NodW5rKHBhZ2UsIG1hcHBpbmcsIDAsIGNodW5rX3NpemUpOworCW5pbGZzX2NvbW1pdF9jaHVuayhwYWdlLCBtYXBwaW5nLCAwLCBjaHVua19zaXplKTsKIGZhaWw6CiAJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9mcy9uaWxmczIvZ2NkYXQuYyBiL2ZzL25pbGZzMi9nY2RhdC5jCmluZGV4IDkzMzgzYzUuLmRkNWY3ZTAgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9nY2RhdC5jCisrKyBiL2ZzL25pbGZzMi9nY2RhdC5jCkBAIC02MSw2ICs2MSw4IEBACiAKIAluaWxmc19ibWFwX2NvbW1pdF9nY2RhdChnaWktPmlfYm1hcCwgZGlpLT5pX2JtYXApOwogCisJbmlsZnNfcGFsbG9jX2NsZWFyX2NhY2hlKGRhdCk7CisJbmlsZnNfcGFsbG9jX2NsZWFyX2NhY2hlKGdjZGF0KTsKIAluaWxmc19jbGVhcl9kaXJ0eV9wYWdlcyhtYXBwaW5nKTsKIAluaWxmc19jb3B5X2JhY2tfcGFnZXMobWFwcGluZywgZ21hcHBpbmcpOwogCS8qIG5vdGU6IG1kdCBkaXJ0eSBmbGFncyBzaG91bGQgYmUgY2xlYXJlZCBieSBzZWdjdG9yLiAqLwpAQCAtNzksNiArODEsNyBAQAogCWdjZGF0LT5pX3N0YXRlID0gSV9DTEVBUjsKIAlnaWktPmlfZmxhZ3MgPSAwOwogCisJbmlsZnNfcGFsbG9jX2NsZWFyX2NhY2hlKGdjZGF0KTsKIAl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhnY2RhdC0+aV9tYXBwaW5nLCAwKTsKIAl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmZ2lpLT5pX2J0bm9kZV9jYWNoZSwgMCk7CiB9CmRpZmYgLS1naXQgYS9mcy9uaWxmczIvZ2Npbm9kZS5jIGIvZnMvbmlsZnMyL2djaW5vZGUuYwppbmRleCBlNmRlMGEyLi5lMTZhNjY2IDEwMDY0NAotLS0gYS9mcy9uaWxmczIvZ2Npbm9kZS5jCisrKyBiL2ZzL25pbGZzMi9nY2lub2RlLmMKQEAgLTE0OSw3ICsxNDksNyBAQAogCQkJCSAgIF9fdTY0IHZibiwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqb3V0X2JoKQogewogCWludCByZXQgPSBuaWxmc19idG5vZGVfc3VibWl0X2Jsb2NrKCZOSUxGU19JKGlub2RlKS0+aV9idG5vZGVfY2FjaGUsCi0JCQkJCSAgICB2Ym4gPyA6IHBibiwgcGJuLCBvdXRfYmgsIDApOworCQkJCQkgICAgdmJuID8gOiBwYm4sIHBibiwgb3V0X2JoKTsKIAlpZiAocmV0ID09IC1FRVhJU1QpIC8qIGludGVybmFsIGNvZGUgKGNhY2hlIGhpdCkgKi8KIAkJcmV0ID0gMDsKIAlyZXR1cm4gcmV0OwpAQCAtMjEyLDkgKzIxMiwxMCBAQAogc3RhdGljIHN0cnVjdCBpbm9kZSAqYWxsb2NfZ2Npbm9kZShzdHJ1Y3QgdGhlX25pbGZzICpuaWxmcywgaW5vX3QgaW5vLAogCQkJCSAgIF9fdTY0IGNubykKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbmlsZnNfbWR0X25ld19jb21tb24obmlsZnMsIE5VTEwsIGlubywgR0ZQX05PRlMpOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RydWN0IG5pbGZzX2lub2RlX2luZm8gKmlpOwogCisJaW5vZGUgPSBuaWxmc19tZHRfbmV3X2NvbW1vbihuaWxmcywgTlVMTCwgaW5vLCBHRlBfTk9GUywgMCk7CiAJaWYgKCFpbm9kZSkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTI2NSw3ICsyNjYsNiBAQAogICovCiB2b2lkIG5pbGZzX2NsZWFyX2djaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQluaWxmc19tZHRfY2xlYXIoaW5vZGUpOwogCW5pbGZzX21kdF9kZXN0cm95KGlub2RlKTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL2lmaWxlLmMgYi9mcy9uaWxmczIvaWZpbGUuYwppbmRleCBkZTg2NDAxLi45MjJkOWRkIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvaWZpbGUuYworKysgYi9mcy9uaWxmczIvaWZpbGUuYwpAQCAtMjksNiArMjksMTcgQEAKICNpbmNsdWRlICJhbGxvYy5oIgogI2luY2x1ZGUgImlmaWxlLmgiCiAKKworc3RydWN0IG5pbGZzX2lmaWxlX2luZm8geworCXN0cnVjdCBuaWxmc19tZHRfaW5mbyBtaTsKKwlzdHJ1Y3QgbmlsZnNfcGFsbG9jX2NhY2hlIHBhbGxvY19jYWNoZTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5pbGZzX2lmaWxlX2luZm8gKk5JTEZTX0lGSUxFX0koc3RydWN0IGlub2RlICppZmlsZSkKK3sKKwlyZXR1cm4gKHN0cnVjdCBuaWxmc19pZmlsZV9pbmZvICopTklMRlNfTURUKGlmaWxlKTsKK30KKwogLyoqCiAgKiBuaWxmc19pZmlsZV9jcmVhdGVfaW5vZGUgLSBjcmVhdGUgYSBuZXcgZGlzayBpbm9kZQogICogQGlmaWxlOiBpZmlsZSBpbm9kZQpAQCAtMTQ4LDMgKzE1OSwyNyBAQAogCX0KIAlyZXR1cm4gZXJyOwogfQorCisvKioKKyAqIG5pbGZzX2lmaWxlX25ldyAtIGNyZWF0ZSBpbm9kZSBmaWxlCisgKiBAc2JpOiBuaWxmc19zYl9pbmZvIHN0cnVjdAorICogQGlub2RlX3NpemU6IHNpemUgb2YgYW4gaW5vZGUKKyAqLworc3RydWN0IGlub2RlICpuaWxmc19pZmlsZV9uZXcoc3RydWN0IG5pbGZzX3NiX2luZm8gKnNiaSwgc2l6ZV90IGlub2RlX3NpemUpCit7CisJc3RydWN0IGlub2RlICppZmlsZTsKKwlpbnQgZXJyOworCisJaWZpbGUgPSBuaWxmc19tZHRfbmV3KHNiaS0+c19uaWxmcywgc2JpLT5zX3N1cGVyLCBOSUxGU19JRklMRV9JTk8sCisJCQkgICAgICBzaXplb2Yoc3RydWN0IG5pbGZzX2lmaWxlX2luZm8pKTsKKwlpZiAoaWZpbGUpIHsKKwkJZXJyID0gbmlsZnNfcGFsbG9jX2luaXRfYmxvY2tncm91cChpZmlsZSwgaW5vZGVfc2l6ZSk7CisJCWlmICh1bmxpa2VseShlcnIpKSB7CisJCQluaWxmc19tZHRfZGVzdHJveShpZmlsZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQluaWxmc19wYWxsb2Nfc2V0dXBfY2FjaGUoaWZpbGUsCisJCQkJCSAmTklMRlNfSUZJTEVfSShpZmlsZSktPnBhbGxvY19jYWNoZSk7CisJfQorCXJldHVybiBpZmlsZTsKK30KZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9pZmlsZS5oIGIvZnMvbmlsZnMyL2lmaWxlLmgKaW5kZXggZWNjM2JhNzYuLmNiY2EzMmUgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9pZmlsZS5oCisrKyBiL2ZzL25pbGZzMi9pZmlsZS5oCkBAIC00OSw0ICs0OSw2IEBACiBpbnQgbmlsZnNfaWZpbGVfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqLCBpbm9fdCk7CiBpbnQgbmlsZnNfaWZpbGVfZ2V0X2lub2RlX2Jsb2NrKHN0cnVjdCBpbm9kZSAqLCBpbm9fdCwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqKTsKIAorc3RydWN0IGlub2RlICpuaWxmc19pZmlsZV9uZXcoc3RydWN0IG5pbGZzX3NiX2luZm8gKnNiaSwgc2l6ZV90IGlub2RlX3NpemUpOworCiAjZW5kaWYJLyogX05JTEZTX0lGSUxFX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9pbm9kZS5jIGIvZnMvbmlsZnMyL2lub2RlLmMKaW5kZXggMmEwYTVhMy4uNzg2OGNjMSAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL2lub2RlLmMKKysrIGIvZnMvbmlsZnMyL2lub2RlLmMKQEAgLTk3LDYgKzk3LDcgQEAKIAkJCW5pbGZzX3RyYW5zYWN0aW9uX2Fib3J0KGlub2RlLT5pX3NiKTsKIAkJCWdvdG8gb3V0OwogCQl9CisJCW5pbGZzX21hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCQluaWxmc190cmFuc2FjdGlvbl9jb21taXQoaW5vZGUtPmlfc2IpOyAvKiBuZXZlciBmYWlscyAqLwogCQkvKiBFcnJvciBoYW5kbGluZyBzaG91bGQgYmUgZGV0YWlsZWQgKi8KIAkJc2V0X2J1ZmZlcl9uZXcoYmhfcmVzdWx0KTsKQEAgLTMyMiw3ICszMjMsNiBAQAogCQkJCSAgICBuaWxmc19pbml0X2FjbCgpLCBwcm9wZXIgY2FuY2VsbGF0aW9uIG9mCiAJCQkJICAgIGFib3ZlIGpvYnMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgKi8KIAotCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCXJldHVybiBpbm9kZTsKIAogIGZhaWxlZF9hY2w6CkBAIC01MjUsNyArNTI1LDYgQEAKIAogCXJhd19pbm9kZSA9IG5pbGZzX2lmaWxlX21hcF9pbm9kZShzYmktPnNfaWZpbGUsIGlubywgaWJoKTsKIAotCS8qIFRoZSBidWZmZXIgaXMgZ3VhcmRlZCB3aXRoIGxvY2tfYnVmZmVyKCkgYnkgdGhlIGNhbGxlciAqLwogCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTklMRlNfSV9ORVcsICZpaS0+aV9zdGF0ZSkpCiAJCW1lbXNldChyYXdfaW5vZGUsIDAsIE5JTEZTX01EVChzYmktPnNfaWZpbGUpLT5taV9lbnRyeV9zaXplKTsKIAlzZXRfYml0KE5JTEZTX0lfSU5PREVfRElSVFksICZpaS0+aV9zdGF0ZSk7CkBAIC01OTksNiArNTk4LDcgQEAKIAlpZiAoSVNfU1lOQyhpbm9kZSkpCiAJCW5pbGZzX3NldF90cmFuc2FjdGlvbl9mbGFnKE5JTEZTX1RJX1NZTkMpOwogCisJbmlsZnNfbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJbmlsZnNfc2V0X2ZpbGVfZGlydHkoTklMRlNfU0Ioc2IpLCBpbm9kZSwgMCk7CiAJbmlsZnNfdHJhbnNhY3Rpb25fY29tbWl0KHNiKTsKIAkvKiBNYXkgY29uc3RydWN0IGEgbG9naWNhbCBzZWdtZW50IGFuZCBtYXkgZmFpbCBpbiBzeW5jIG1vZGUuCkBAIC02MjMsNiArNjIzLDcgQEAKIAkJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEsIDApOwogCiAJbmlsZnNfdHJ1bmNhdGVfYm1hcChpaSwgMCk7CisJbmlsZnNfbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJbmlsZnNfZnJlZV9pbm9kZShpbm9kZSk7CiAJLyogbmlsZnNfZnJlZV9pbm9kZSgpIG1hcmtzIGlub2RlIGJ1ZmZlciBkaXJ0eSAqLwogCWlmIChJU19TWU5DKGlub2RlKSkKQEAgLTc0NSw5ICs3NDYsNyBAQAogCQkJICAgICAgImZhaWxlZCB0byByZWdldCBpbm9kZSBibG9jay5cbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KLQlsb2NrX2J1ZmZlcihpYmgpOwogCW5pbGZzX3VwZGF0ZV9pbm9kZShpbm9kZSwgaWJoKTsKLQl1bmxvY2tfYnVmZmVyKGliaCk7CiAJbmlsZnNfbWR0X21hcmtfYnVmZmVyX2RpcnR5KGliaCk7CiAJbmlsZnNfbWR0X21hcmtfZGlydHkoc2JpLT5zX2lmaWxlKTsKIAlicmVsc2UoaWJoKTsKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9tZHQuYyBiL2ZzL25pbGZzMi9tZHQuYwppbmRleCBmNjMyNjExLi4wNjcxM2ZmIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvbWR0LmMKKysrIGIvZnMvbmlsZnMyL21kdC5jCkBAIC0xODYsNyArMTg2LDcgQEAKIH0KIAogc3RhdGljIGludCBuaWxmc19tZHRfcmVhZF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGJsb2NrLAotCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqKm91dF9iaCkKKwkJCQlpbnQgcmVhZGFoZWFkLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipvdXRfYmgpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpmaXJzdF9iaCwgKmJoOwogCXVuc2lnbmVkIGxvbmcgYmxrb2ZmOwpAQCAtMjAwLDE2ICsyMDAsMTggQEAKIAlpZiAodW5saWtlbHkoZXJyKSkKIAkJZ290byBmYWlsZWQ7CiAKLQlibGtvZmYgPSBibG9jayArIDE7Ci0JZm9yIChpID0gMDsgaSA8IG5yX3JhX2Jsb2NrczsgaSsrLCBibGtvZmYrKykgewotCQllcnIgPSBuaWxmc19tZHRfc3VibWl0X2Jsb2NrKGlub2RlLCBibGtvZmYsIFJFQURBLCAmYmgpOwotCQlpZiAobGlrZWx5KCFlcnIgfHwgZXJyID09IC1FRVhJU1QpKQotCQkJYnJlbHNlKGJoKTsKLQkJZWxzZSBpZiAoZXJyICE9IC1FQlVTWSkKLQkJCWJyZWFrOyAvKiBhYm9ydCByZWFkYWhlYWQgaWYgYm1hcCBsb29rdXAgZmFpbGVkICovCi0KLQkJaWYgKCFidWZmZXJfbG9ja2VkKGZpcnN0X2JoKSkKLQkJCWdvdG8gb3V0X25vX3dhaXQ7CisJaWYgKHJlYWRhaGVhZCkgeworCQlibGtvZmYgPSBibG9jayArIDE7CisJCWZvciAoaSA9IDA7IGkgPCBucl9yYV9ibG9ja3M7IGkrKywgYmxrb2ZmKyspIHsKKwkJCWVyciA9IG5pbGZzX21kdF9zdWJtaXRfYmxvY2soaW5vZGUsIGJsa29mZiwgUkVBREEsICZiaCk7CisJCQlpZiAobGlrZWx5KCFlcnIgfHwgZXJyID09IC1FRVhJU1QpKQorCQkJCWJyZWxzZShiaCk7CisJCQllbHNlIGlmIChlcnIgIT0gLUVCVVNZKQorCQkJCWJyZWFrOworCQkJCS8qIGFib3J0IHJlYWRhaGVhZCBpZiBibWFwIGxvb2t1cCBmYWlsZWQgKi8KKwkJCWlmICghYnVmZmVyX2xvY2tlZChmaXJzdF9iaCkpCisJCQkJZ290byBvdXRfbm9fd2FpdDsKKwkJfQogCX0KIAogCXdhaXRfb25fYnVmZmVyKGZpcnN0X2JoKTsKQEAgLTI2Myw3ICsyNjUsNyBAQAogCiAJLyogU2hvdWxkIGJlIHJld3JpdHRlbiB3aXRoIG1lcmdpbmcgbmlsZnNfbWR0X3JlYWRfYmxvY2soKSAqLwogIHJldHJ5OgotCXJldCA9IG5pbGZzX21kdF9yZWFkX2Jsb2NrKGlub2RlLCBibGtvZmYsIG91dF9iaCk7CisJcmV0ID0gbmlsZnNfbWR0X3JlYWRfYmxvY2soaW5vZGUsIGJsa29mZiwgIWNyZWF0ZSwgb3V0X2JoKTsKIAlpZiAoIWNyZWF0ZSB8fCByZXQgIT0gLUVOT0VOVCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMzcxLDcgKzM3Myw3IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAlpbnQgZXJyOwogCi0JZXJyID0gbmlsZnNfbWR0X3JlYWRfYmxvY2soaW5vZGUsIGJsb2NrLCAmYmgpOworCWVyciA9IG5pbGZzX21kdF9yZWFkX2Jsb2NrKGlub2RlLCBibG9jaywgMCwgJmJoKTsKIAlpZiAodW5saWtlbHkoZXJyKSkKIAkJcmV0dXJuIGVycjsKIAluaWxmc19tYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CkBAIC00NDUsOSArNDQ3LDE3IEBACiAgKiBsb25nZXIgdGhhbiB0aG9zZSBvZiB0aGUgc3VwZXIgYmxvY2sgc3RydWN0czsgdGhleSBtYXkgY29udGludWUgZm9yCiAgKiBzZXZlcmFsIGNvbnNlY3V0aXZlIG1vdW50cy91bW91bnRzLiAgVGhpcyB3b3VsZCBuZWVkIGRpc2N1c3Npb25zLgogICovCisvKioKKyAqIG5pbGZzX21kdF9uZXdfY29tbW9uIC0gYWxsb2NhdGUgYSBwc2V1ZG8gaW5vZGUgZm9yIG1ldGFkYXRhIGZpbGUKKyAqIEBuaWxmczogbmlsZnMgb2JqZWN0CisgKiBAc2I6IHN1cGVyIGJsb2NrIGluc3RhbmNlIHRoZSBtZXRhZGF0YSBmaWxlIGJlbG9uZ3MgdG8KKyAqIEBpbm86IGlub2RlIG51bWJlcgorICogQGdmcF9tYXNrOiBnZnAgbWFzayBmb3IgZGF0YSBwYWdlcworICogQG9ianN6OiBzaXplIG9mIHRoZSBwcml2YXRlIG9iamVjdCBhdHRhY2hlZCB0byBpbm9kZS0+aV9wcml2YXRlCisgKi8KIHN0cnVjdCBpbm9kZSAqCiBuaWxmc19tZHRfbmV3X2NvbW1vbihzdHJ1Y3QgdGhlX25pbGZzICpuaWxmcywgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJICAgICBpbm9fdCBpbm8sIGdmcF90IGdmcF9tYXNrKQorCQkgICAgIGlub190IGlubywgZ2ZwX3QgZ2ZwX21hc2ssIHNpemVfdCBvYmpzeikKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbmlsZnNfYWxsb2NfaW5vZGVfY29tbW9uKG5pbGZzKTsKIApAQCAtNDU1LDggKzQ2NSw5IEBACiAJCXJldHVybiBOVUxMOwogCWVsc2UgewogCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqIGNvbnN0IG1hcHBpbmcgPSAmaW5vZGUtPmlfZGF0YTsKLQkJc3RydWN0IG5pbGZzX21kdF9pbmZvICptaSA9IGt6YWxsb2Moc2l6ZW9mKCptaSksIEdGUF9OT0ZTKTsKKwkJc3RydWN0IG5pbGZzX21kdF9pbmZvICptaTsKIAorCQltaSA9IGt6YWxsb2MobWF4KHNpemVvZigqbWkpLCBvYmpzeiksIEdGUF9OT0ZTKTsKIAkJaWYgKCFtaSkgewogCQkJbmlsZnNfZGVzdHJveV9pbm9kZShpbm9kZSk7CiAJCQlyZXR1cm4gTlVMTDsKQEAgLTUxMywxMSArNTI0LDExIEBACiB9CiAKIHN0cnVjdCBpbm9kZSAqbmlsZnNfbWR0X25ldyhzdHJ1Y3QgdGhlX25pbGZzICpuaWxmcywgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJCSAgICBpbm9fdCBpbm8pCisJCQkgICAgaW5vX3QgaW5vLCBzaXplX3Qgb2Jqc3opCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IG5pbGZzX21kdF9uZXdfY29tbW9uKG5pbGZzLCBzYiwgaW5vLAotCQkJCQkJICAgTklMRlNfTURUX0dGUCk7CisJc3RydWN0IGlub2RlICppbm9kZTsKIAorCWlub2RlID0gbmlsZnNfbWR0X25ld19jb21tb24obmlsZnMsIHNiLCBpbm8sIE5JTEZTX01EVF9HRlAsIG9ianN6KTsKIAlpZiAoIWlub2RlKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtNTQ0LDE0ICs1NTUsMTUgQEAKIAkJJk5JTEZTX0kob3JpZyktPmlfYnRub2RlX2NhY2hlOwogfQogCi12b2lkIG5pbGZzX21kdF9jbGVhcihzdHJ1Y3QgaW5vZGUgKmlub2RlKQorc3RhdGljIHZvaWQgbmlsZnNfbWR0X2NsZWFyKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IG5pbGZzX2lub2RlX2luZm8gKmlpID0gTklMRlNfSShpbm9kZSk7CiAKIAlpbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMoaW5vZGUtPmlfbWFwcGluZywgMCwgLTEpOwogCXRydW5jYXRlX2lub2RlX3BhZ2VzKGlub2RlLT5pX21hcHBpbmcsIDApOwogCi0JbmlsZnNfYm1hcF9jbGVhcihpaS0+aV9ibWFwKTsKKwlpZiAodGVzdF9iaXQoTklMRlNfSV9CTUFQLCAmaWktPmlfc3RhdGUpKQorCQluaWxmc19ibWFwX2NsZWFyKGlpLT5pX2JtYXApOwogCW5pbGZzX2J0bm9kZV9jYWNoZV9jbGVhcigmaWktPmlfYnRub2RlX2NhY2hlKTsKIH0KIApAQCAtNTU5LDYgKzU3MSwxMCBAQAogewogCXN0cnVjdCBuaWxmc19tZHRfaW5mbyAqbWRpID0gTklMRlNfTURUKGlub2RlKTsKIAorCWlmIChtZGktPm1pX3BhbGxvY19jYWNoZSkKKwkJbmlsZnNfcGFsbG9jX2Rlc3Ryb3lfY2FjaGUoaW5vZGUpOworCW5pbGZzX21kdF9jbGVhcihpbm9kZSk7CisKIAlrZnJlZShtZGktPm1pX2JnbCk7IC8qIGtmcmVlKE5VTEwpIGlzIHNhZmUgKi8KIAlrZnJlZShtZGkpOwogCW5pbGZzX2Rlc3Ryb3lfaW5vZGUoaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL21kdC5oIGIvZnMvbmlsZnMyL21kdC5oCmluZGV4IDQzMTU5OTcuLjZjNGJiYjAgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9tZHQuaAorKysgYi9mcy9uaWxmczIvbWR0LmgKQEAgLTM2LDYgKzM2LDcgQEAKICAqIEBtaV9lbnRyeV9zaXplOiBzaXplIG9mIGFuIGVudHJ5CiAgKiBAbWlfZmlyc3RfZW50cnlfb2Zmc2V0OiBvZmZzZXQgdG8gdGhlIGZpcnN0IGVudHJ5CiAgKiBAbWlfZW50cmllc19wZXJfYmxvY2s6IG51bWJlciBvZiBlbnRyaWVzIGluIGEgYmxvY2sKKyAqIEBtaV9wYWxsb2NfY2FjaGU6IHBlcnNpc3RlbnQgb2JqZWN0IGFsbG9jYXRvciBjYWNoZQogICogQG1pX2Jsb2Nrc19wZXJfZ3JvdXA6IG51bWJlciBvZiBibG9ja3MgaW4gYSBncm91cAogICogQG1pX2Jsb2Nrc19wZXJfZGVzY19ibG9jazogbnVtYmVyIG9mIGJsb2NrcyBwZXIgZGVzY3JpcHRvciBibG9jawogICovCkBAIC00Niw2ICs0Nyw3IEBACiAJdW5zaWduZWQJCW1pX2VudHJ5X3NpemU7CiAJdW5zaWduZWQJCW1pX2ZpcnN0X2VudHJ5X29mZnNldDsKIAl1bnNpZ25lZCBsb25nCQltaV9lbnRyaWVzX3Blcl9ibG9jazsKKwlzdHJ1Y3QgbmlsZnNfcGFsbG9jX2NhY2hlICptaV9wYWxsb2NfY2FjaGU7CiAJdW5zaWduZWQgbG9uZwkJbWlfYmxvY2tzX3Blcl9ncm91cDsKIAl1bnNpZ25lZCBsb25nCQltaV9ibG9ja3NfcGVyX2Rlc2NfYmxvY2s7CiB9OwpAQCAtNzQsMTEgKzc2LDExIEBACiBpbnQgbmlsZnNfbWR0X21hcmtfYmxvY2tfZGlydHkoc3RydWN0IGlub2RlICosIHVuc2lnbmVkIGxvbmcpOwogaW50IG5pbGZzX21kdF9mZXRjaF9kaXJ0eShzdHJ1Y3QgaW5vZGUgKik7CiAKLXN0cnVjdCBpbm9kZSAqbmlsZnNfbWR0X25ldyhzdHJ1Y3QgdGhlX25pbGZzICosIHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbm9fdCk7CitzdHJ1Y3QgaW5vZGUgKm5pbGZzX21kdF9uZXcoc3RydWN0IHRoZV9uaWxmcyAqLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW5vX3QsCisJCQkgICAgc2l6ZV90KTsKIHN0cnVjdCBpbm9kZSAqbmlsZnNfbWR0X25ld19jb21tb24oc3RydWN0IHRoZV9uaWxmcyAqLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwKLQkJCQkgICBpbm9fdCwgZ2ZwX3QpOworCQkJCSAgIGlub190LCBnZnBfdCwgc2l6ZV90KTsKIHZvaWQgbmlsZnNfbWR0X2Rlc3Ryb3koc3RydWN0IGlub2RlICopOwotdm9pZCBuaWxmc19tZHRfY2xlYXIoc3RydWN0IGlub2RlICopOwogdm9pZCBuaWxmc19tZHRfc2V0X2VudHJ5X3NpemUoc3RydWN0IGlub2RlICosIHVuc2lnbmVkLCB1bnNpZ25lZCk7CiB2b2lkIG5pbGZzX21kdF9zZXRfc2hhZG93KHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKik7CiAKQEAgLTEwNCwyMSArMTA2LDQgQEAKICNkZWZpbmUgbmlsZnNfbWR0X2JnbF9sb2NrKGlub2RlLCBiZykgXAogCSgmTklMRlNfTURUKGlub2RlKS0+bWlfYmdsLT5sb2Nrc1soYmcpICYgKE5SX0JHX0xPQ0tTLTEpXS5sb2NrKQogCi0KLXN0YXRpYyBpbmxpbmUgaW50Ci1uaWxmc19tZHRfcmVhZF9pbm9kZV9kaXJlY3Qoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKLQkJCSAgICB1bnNpZ25lZCBuKQotewotCXJldHVybiBuaWxmc19yZWFkX2lub2RlX2NvbW1vbigKLQkJaW5vZGUsIChzdHJ1Y3QgbmlsZnNfaW5vZGUgKikoYmgtPmJfZGF0YSArIG4pKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1uaWxmc19tZHRfd3JpdGVfaW5vZGVfZGlyZWN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCi0JCQkgICAgIHVuc2lnbmVkIG4pCi17Ci0JbmlsZnNfd3JpdGVfaW5vZGVfY29tbW9uKAotCQlpbm9kZSwgKHN0cnVjdCBuaWxmc19pbm9kZSAqKShiaC0+Yl9kYXRhICsgbiksIDEpOwotfQotCiAjZW5kaWYgLyogX05JTEZTX01EVF9IICovCmRpZmYgLS1naXQgYS9mcy9uaWxmczIvbmFtZWkuYyBiL2ZzL25pbGZzMi9uYW1laS5jCmluZGV4IGVkMDJlODguLjA3YmE4MzggMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9uYW1laS5jCisrKyBiL2ZzL25pbGZzMi9uYW1laS5jCkBAIC0xMjAsNyArMTIwLDcgQEAKIAkJaW5vZGUtPmlfb3AgPSAmbmlsZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOwogCQlpbm9kZS0+aV9mb3AgPSAmbmlsZnNfZmlsZV9vcGVyYXRpb25zOwogCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZuaWxmc19hb3BzOwotCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJbmlsZnNfbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJCWVyciA9IG5pbGZzX2FkZF9ub25kaXIoZGVudHJ5LCBpbm9kZSk7CiAJfQogCWlmICghZXJyKQpAQCAtMTQ4LDcgKzE0OCw3IEBACiAJZXJyID0gUFRSX0VSUihpbm9kZSk7CiAJaWYgKCFJU19FUlIoaW5vZGUpKSB7CiAJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgcmRldik7Ci0JCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQluaWxmc19tYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKIAkJZXJyID0gbmlsZnNfYWRkX25vbmRpcihkZW50cnksIGlub2RlKTsKIAl9CiAJaWYgKCFlcnIpCkBAIC0xODgsNyArMTg4LDcgQEAKIAkJZ290byBvdXRfZmFpbDsKIAogCS8qIG1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOyAqLwotCS8qIG5pbGZzX25ld19pbm9kZSgpIGFuZCBwYWdlX3N5bWxpbmsoKSBkbyB0aGlzICovCisJLyogcGFnZV9zeW1saW5rKCkgZG8gdGhpcyAqLwogCiAJZXJyID0gbmlsZnNfYWRkX25vbmRpcihkZW50cnksIGlub2RlKTsKIG91dDoKQEAgLTIwMCw3ICsyMDAsOCBAQAogCXJldHVybiBlcnI7CiAKIG91dF9mYWlsOgotCWlub2RlX2RlY19saW5rX2NvdW50KGlub2RlKTsKKwlkcm9wX25saW5rKGlub2RlKTsKKwluaWxmc19tYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKIAlpcHV0KGlub2RlKTsKIAlnb3RvIG91dDsKIH0KQEAgLTI0NSw3ICsyNDYsNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlpbm9kZV9pbmNfbGlua19jb3VudChkaXIpOworCWluY19ubGluayhkaXIpOwogCiAJaW5vZGUgPSBuaWxmc19uZXdfaW5vZGUoZGlyLCBTX0lGRElSIHwgbW9kZSk7CiAJZXJyID0gUFRSX0VSUihpbm9kZSk7CkBAIC0yNTYsNyArMjU3LDcgQEAKIAlpbm9kZS0+aV9mb3AgPSAmbmlsZnNfZGlyX29wZXJhdGlvbnM7CiAJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmbmlsZnNfYW9wczsKIAotCWlub2RlX2luY19saW5rX2NvdW50KGlub2RlKTsKKwlpbmNfbmxpbmsoaW5vZGUpOwogCiAJZXJyID0gbmlsZnNfbWFrZV9lbXB0eShpbm9kZSwgZGlyKTsKIAlpZiAoZXJyKQpAQCAtMjY2LDYgKzI2Nyw3IEBACiAJaWYgKGVycikKIAkJZ290byBvdXRfZmFpbDsKIAorCW5pbGZzX21hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CiBvdXQ6CiAJaWYgKCFlcnIpCkBAIC0yNzYsMjYgKzI3OCwyMyBAQAogCXJldHVybiBlcnI7CiAKIG91dF9mYWlsOgotCWlub2RlX2RlY19saW5rX2NvdW50KGlub2RlKTsKLQlpbm9kZV9kZWNfbGlua19jb3VudChpbm9kZSk7CisJZHJvcF9ubGluayhpbm9kZSk7CisJZHJvcF9ubGluayhpbm9kZSk7CisJbmlsZnNfbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJaXB1dChpbm9kZSk7CiBvdXRfZGlyOgotCWlub2RlX2RlY19saW5rX2NvdW50KGRpcik7CisJZHJvcF9ubGluayhkaXIpOworCW5pbGZzX21hcmtfaW5vZGVfZGlydHkoZGlyKTsKIAlnb3RvIG91dDsKIH0KIAotc3RhdGljIGludCBuaWxmc191bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3N0YXRpYyBpbnQgbmlsZnNfZG9fdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgbmlsZnNfZGlyX2VudHJ5ICpkZTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlzdHJ1Y3QgbmlsZnNfdHJhbnNhY3Rpb25faW5mbyB0aTsKIAlpbnQgZXJyOwogCi0JZXJyID0gbmlsZnNfdHJhbnNhY3Rpb25fYmVnaW4oZGlyLT5pX3NiLCAmdGksIDApOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KIAllcnIgPSAtRU5PRU5UOwogCWRlID0gbmlsZnNfZmluZF9lbnRyeShkaXIsIGRlbnRyeSwgJnBhZ2UpOwogCWlmICghZGUpCkBAIC0zMTcsMTIgKzMxNiwyOCBAQAogCQlnb3RvIG91dDsKIAogCWlub2RlLT5pX2N0aW1lID0gZGlyLT5pX2N0aW1lOwotCWlub2RlX2RlY19saW5rX2NvdW50KGlub2RlKTsKKwlkcm9wX25saW5rKGlub2RlKTsKIAllcnIgPSAwOwogb3V0OgotCWlmICghZXJyKQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbmlsZnNfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IG5pbGZzX3RyYW5zYWN0aW9uX2luZm8gdGk7CisJaW50IGVycjsKKworCWVyciA9IG5pbGZzX3RyYW5zYWN0aW9uX2JlZ2luKGRpci0+aV9zYiwgJnRpLCAwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gbmlsZnNfZG9fdW5saW5rKGRpciwgZGVudHJ5KTsKKworCWlmICghZXJyKSB7CisJCW5pbGZzX21hcmtfaW5vZGVfZGlydHkoZGlyKTsKKwkJbmlsZnNfbWFya19pbm9kZV9kaXJ0eShkZW50cnktPmRfaW5vZGUpOwogCQllcnIgPSBuaWxmc190cmFuc2FjdGlvbl9jb21taXQoZGlyLT5pX3NiKTsKLQllbHNlCisJfSBlbHNlCiAJCW5pbGZzX3RyYW5zYWN0aW9uX2Fib3J0KGRpci0+aV9zYik7CiAKIAlyZXR1cm4gZXJyOwpAQCAtMzQwLDExICszNTUsMTMgQEAKIAogCWVyciA9IC1FTk9URU1QVFk7CiAJaWYgKG5pbGZzX2VtcHR5X2Rpcihpbm9kZSkpIHsKLQkJZXJyID0gbmlsZnNfdW5saW5rKGRpciwgZGVudHJ5KTsKKwkJZXJyID0gbmlsZnNfZG9fdW5saW5rKGRpciwgZGVudHJ5KTsKIAkJaWYgKCFlcnIpIHsKIAkJCWlub2RlLT5pX3NpemUgPSAwOwotCQkJaW5vZGVfZGVjX2xpbmtfY291bnQoaW5vZGUpOwotCQkJaW5vZGVfZGVjX2xpbmtfY291bnQoZGlyKTsKKwkJCWRyb3BfbmxpbmsoaW5vZGUpOworCQkJbmlsZnNfbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCQlkcm9wX25saW5rKGRpcik7CisJCQluaWxmc19tYXJrX2lub2RlX2RpcnR5KGRpcik7CiAJCX0KIAl9CiAJaWYgKCFlcnIpCkBAIC0zOTUsNDIgKzQxMiw0OCBAQAogCQluZXdfZGUgPSBuaWxmc19maW5kX2VudHJ5KG5ld19kaXIsIG5ld19kZW50cnksICZuZXdfcGFnZSk7CiAJCWlmICghbmV3X2RlKQogCQkJZ290byBvdXRfZGlyOwotCQlpbm9kZV9pbmNfbGlua19jb3VudChvbGRfaW5vZGUpOworCQlpbmNfbmxpbmsob2xkX2lub2RlKTsKIAkJbmlsZnNfc2V0X2xpbmsobmV3X2RpciwgbmV3X2RlLCBuZXdfcGFnZSwgb2xkX2lub2RlKTsKKwkJbmlsZnNfbWFya19pbm9kZV9kaXJ0eShuZXdfZGlyKTsKIAkJbmV3X2lub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCQlpZiAoZGlyX2RlKQogCQkJZHJvcF9ubGluayhuZXdfaW5vZGUpOwotCQlpbm9kZV9kZWNfbGlua19jb3VudChuZXdfaW5vZGUpOworCQlkcm9wX25saW5rKG5ld19pbm9kZSk7CisJCW5pbGZzX21hcmtfaW5vZGVfZGlydHkobmV3X2lub2RlKTsKIAl9IGVsc2UgewogCQlpZiAoZGlyX2RlKSB7CiAJCQllcnIgPSAtRU1MSU5LOwogCQkJaWYgKG5ld19kaXItPmlfbmxpbmsgPj0gTklMRlNfTElOS19NQVgpCiAJCQkJZ290byBvdXRfZGlyOwogCQl9Ci0JCWlub2RlX2luY19saW5rX2NvdW50KG9sZF9pbm9kZSk7CisJCWluY19ubGluayhvbGRfaW5vZGUpOwogCQllcnIgPSBuaWxmc19hZGRfbGluayhuZXdfZGVudHJ5LCBvbGRfaW5vZGUpOwogCQlpZiAoZXJyKSB7Ci0JCQlpbm9kZV9kZWNfbGlua19jb3VudChvbGRfaW5vZGUpOworCQkJZHJvcF9ubGluayhvbGRfaW5vZGUpOworCQkJbmlsZnNfbWFya19pbm9kZV9kaXJ0eShvbGRfaW5vZGUpOwogCQkJZ290byBvdXRfZGlyOwogCQl9Ci0JCWlmIChkaXJfZGUpCi0JCQlpbm9kZV9pbmNfbGlua19jb3VudChuZXdfZGlyKTsKKwkJaWYgKGRpcl9kZSkgeworCQkJaW5jX25saW5rKG5ld19kaXIpOworCQkJbmlsZnNfbWFya19pbm9kZV9kaXJ0eShuZXdfZGlyKTsKKwkJfQogCX0KIAogCS8qCiAJICogTGlrZSBtb3N0IG90aGVyIFVuaXggc3lzdGVtcywgc2V0IHRoZSBjdGltZSBmb3IgaW5vZGVzIG9uIGEKIAkgKiByZW5hbWUuCi0JICogaW5vZGVfZGVjX2xpbmtfY291bnQoKSB3aWxsIG1hcmsgdGhlIGlub2RlIGRpcnR5LgogCSAqLwogCW9sZF9pbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAogCW5pbGZzX2RlbGV0ZV9lbnRyeShvbGRfZGUsIG9sZF9wYWdlKTsKLQlpbm9kZV9kZWNfbGlua19jb3VudChvbGRfaW5vZGUpOworCWRyb3Bfbmxpbmsob2xkX2lub2RlKTsKIAogCWlmIChkaXJfZGUpIHsKIAkJbmlsZnNfc2V0X2xpbmsob2xkX2lub2RlLCBkaXJfZGUsIGRpcl9wYWdlLCBuZXdfZGlyKTsKLQkJaW5vZGVfZGVjX2xpbmtfY291bnQob2xkX2Rpcik7CisJCWRyb3Bfbmxpbmsob2xkX2Rpcik7CiAJfQorCW5pbGZzX21hcmtfaW5vZGVfZGlydHkob2xkX2Rpcik7CisJbmlsZnNfbWFya19pbm9kZV9kaXJ0eShvbGRfaW5vZGUpOwogCiAJZXJyID0gbmlsZnNfdHJhbnNhY3Rpb25fY29tbWl0KG9sZF9kaXItPmlfc2IpOwogCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9mcy9uaWxmczIvcmVjb3ZlcnkuYyBiL2ZzL25pbGZzMi9yZWNvdmVyeS5jCmluZGV4IDZkYzgzNTkuLmM5Yzk2YzcgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9yZWNvdmVyeS5jCisrKyBiL2ZzL25pbGZzMi9yZWNvdmVyeS5jCkBAIC03NzAsMTQgKzc3MCw4IEBACiAJCW5pbGZzX2ZpbmlzaF9yb2xsX2ZvcndhcmQobmlsZnMsIHNiaSwgcmkpOwogCX0KIAotCW5pbGZzX2RldGFjaF9jaGVja3BvaW50KHNiaSk7Ci0JcmV0dXJuIDA7Ci0KICBmYWlsZWQ6CiAJbmlsZnNfZGV0YWNoX2NoZWNrcG9pbnQoc2JpKTsKLQluaWxmc19tZHRfY2xlYXIobmlsZnMtPm5zX2NwZmlsZSk7Ci0JbmlsZnNfbWR0X2NsZWFyKG5pbGZzLT5uc19zdWZpbGUpOwotCW5pbGZzX21kdF9jbGVhcihuaWxmcy0+bnNfZGF0KTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC04MDQsNiArNzk4LDcgQEAKIAlzdHJ1Y3QgbmlsZnNfc2Vnc3VtX2luZm8gc3NpOwogCXNlY3Rvcl90IHBzZWdfc3RhcnQsIHBzZWdfZW5kLCBzcl9wc2VnX3N0YXJ0ID0gMDsKIAlzZWN0b3JfdCBzZWdfc3RhcnQsIHNlZ19lbmQ7IC8qIHJhbmdlIG9mIGZ1bGwgc2VnbWVudCAoYmxvY2sgbnVtYmVyKSAqLworCXNlY3Rvcl90IGIsIGVuZDsKIAl1NjQgc2VnX3NlcTsKIAlfX3U2NCBzZWdudW0sIG5leHRudW0gPSAwOwogCV9fdTY0IGNubzsKQEAgLTgxOSw2ICs4MTQsMTEgQEAKIAkvKiBDYWxjdWxhdGUgcmFuZ2Ugb2Ygc2VnbWVudCAqLwogCW5pbGZzX2dldF9zZWdtZW50X3JhbmdlKG5pbGZzLCBzZWdudW0sICZzZWdfc3RhcnQsICZzZWdfZW5kKTsKIAorCS8qIFJlYWQgYWhlYWQgc2VnbWVudCAqLworCWIgPSBzZWdfc3RhcnQ7CisJd2hpbGUgKGIgPD0gc2VnX2VuZCkKKwkJc2JfYnJlYWRhaGVhZChzYmktPnNfc3VwZXIsIGIrKyk7CisKIAlmb3IgKDs7KSB7CiAJCS8qIExvYWQgc2VnbWVudCBzdW1tYXJ5ICovCiAJCXJldCA9IGxvYWRfc2VnbWVudF9zdW1tYXJ5KHNiaSwgcHNlZ19zdGFydCwgc2VnX3NlcSwgJnNzaSwgMSk7CkBAIC04NDEsMTQgKzg0MSwyMCBAQAogCQlyaS0+cmlfbmV4dG51bSA9IG5leHRudW07CiAJCWVtcHR5X3NlZyA9IDA7CiAKKwkJaWYgKCFOSUxGU19TRUdfSEFTX1NSKCZzc2kpICYmICFzY2FuX25ld2VyKSB7CisJCQkvKiBUaGlzIHdpbGwgbmV2ZXIgaGFwcGVuIGJlY2F1c2UgYSBzdXBlcmJsb2NrCisJCQkgICAobGFzdF9zZWdtZW50KSBhbHdheXMgcG9pbnRzIHRvIGEgcHNlZworCQkJICAgaGF2aW5nIGEgc3VwZXIgcm9vdC4gKi8KKwkJCXJldCA9IE5JTEZTX1NFR19GQUlMX0NPTlNJU1RFTkNZOworCQkJZ290byBmYWlsZWQ7CisJCX0KKworCQlpZiAocHNlZ19zdGFydCA9PSBzZWdfc3RhcnQpIHsKKwkJCW5pbGZzX2dldF9zZWdtZW50X3JhbmdlKG5pbGZzLCBuZXh0bnVtLCAmYiwgJmVuZCk7CisJCQl3aGlsZSAoYiA8PSBlbmQpCisJCQkJc2JfYnJlYWRhaGVhZChzYmktPnNfc3VwZXIsIGIrKyk7CisJCX0KIAkJaWYgKCFOSUxGU19TRUdfSEFTX1NSKCZzc2kpKSB7Ci0JCQlpZiAoIXNjYW5fbmV3ZXIpIHsKLQkJCQkvKiBUaGlzIHdpbGwgbmV2ZXIgaGFwcGVuIGJlY2F1c2UgYSBzdXBlcmJsb2NrCi0JCQkJICAgKGxhc3Rfc2VnbWVudCkgYWx3YXlzIHBvaW50cyB0byBhIHBzZWcKLQkJCQkgICBoYXZpbmcgYSBzdXBlciByb290LiAqLwotCQkJCXJldCA9IE5JTEZTX1NFR19GQUlMX0NPTlNJU1RFTkNZOwotCQkJCWdvdG8gZmFpbGVkOwotCQkJfQogCQkJaWYgKCFyaS0+cmlfbHNlZ3Nfc3RhcnQgJiYgTklMRlNfU0VHX0xPR0JHTigmc3NpKSkgewogCQkJCXJpLT5yaV9sc2Vnc19zdGFydCA9IHBzZWdfc3RhcnQ7CiAJCQkJcmktPnJpX2xzZWdzX3N0YXJ0X3NlcSA9IHNlZ19zZXE7CkBAIC05MTksNyArOTI1LDcgQEAKIAogIHN1cGVyX3Jvb3RfZm91bmQ6CiAJLyogVXBkYXRpbmcgcG9pbnRlcnMgcmVsYXRpbmcgdG8gdGhlIGxhdGVzdCBjaGVja3BvaW50ICovCi0JbGlzdF9zcGxpY2UoJnNlZ21lbnRzLCByaS0+cmlfdXNlZF9zZWdtZW50cy5wcmV2KTsKKwlsaXN0X3NwbGljZV90YWlsKCZzZWdtZW50cywgJnJpLT5yaV91c2VkX3NlZ21lbnRzKTsKIAluaWxmcy0+bnNfbGFzdF9wc2VnID0gc3JfcHNlZ19zdGFydDsKIAluaWxmcy0+bnNfbGFzdF9zZXEgPSBuaWxmcy0+bnNfc2VnX3NlcTsKIAluaWxmcy0+bnNfbGFzdF9jbm8gPSByaS0+cmlfY25vOwpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL3NlZ2J1Zi5jIGIvZnMvbmlsZnMyL3NlZ2J1Zi5jCmluZGV4IGU2ZDllMzcuLjY0NWM3ODYgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9zZWdidWYuYworKysgYi9mcy9uaWxmczIvc2VnYnVmLmMKQEAgLTI0LDEwICsyNCwyMiBAQAogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgogI2luY2x1ZGUgInBhZ2UuaCIKICNpbmNsdWRlICJzZWdidWYuaCIKIAogCitzdHJ1Y3QgbmlsZnNfd3JpdGVfaW5mbyB7CisJc3RydWN0IHRoZV9uaWxmcyAgICAgICAqbmlsZnM7CisJc3RydWN0IGJpbwkgICAgICAgKmJpbzsKKwlpbnQgCQkJc3RhcnQsIGVuZDsgLyogVGhlIHJlZ2lvbiB0byBiZSBzdWJtaXR0ZWQgKi8KKwlpbnQJCQlyZXN0X2Jsb2NrczsKKwlpbnQJCQltYXhfcGFnZXM7CisJaW50CQkJbnJfdmVjczsKKwlzZWN0b3JfdAkJYmxvY2tucjsKK307CisKKwogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpuaWxmc19zZWdidWZfY2FjaGVwOwogCiBzdGF0aWMgdm9pZCBuaWxmc19zZWdidWZfaW5pdF9vbmNlKHZvaWQgKm9iaikKQEAgLTYzLDYgKzc1LDExIEBACiAJSU5JVF9MSVNUX0hFQUQoJnNlZ2J1Zi0+c2JfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJnNlZ2J1Zi0+c2Jfc2Vnc3VtX2J1ZmZlcnMpOwogCUlOSVRfTElTVF9IRUFEKCZzZWdidWYtPnNiX3BheWxvYWRfYnVmZmVycyk7CisKKwlpbml0X2NvbXBsZXRpb24oJnNlZ2J1Zi0+c2JfYmlvX2V2ZW50KTsKKwlhdG9taWNfc2V0KCZzZWdidWYtPnNiX2VyciwgMCk7CisJc2VnYnVmLT5zYl9uYmlvID0gMDsKKwogCXJldHVybiBzZWdidWY7CiB9CiAKQEAgLTgzLDYgKzEwMCwyMiBAQAogCQlzZWdidWYtPnNiX2ZzZWdfZW5kIC0gc2VnYnVmLT5zYl9wc2VnX3N0YXJ0ICsgMTsKIH0KIAorLyoqCisgKiBuaWxmc19zZWdidWZfbWFwX2NvbnQgLSBtYXAgYSBuZXcgbG9nIGJlaGluZCBhIGdpdmVuIGxvZworICogQHNlZ2J1ZjogbmV3IHNlZ21lbnQgYnVmZmVyCisgKiBAcHJldjogc2VnbWVudCBidWZmZXIgY29udGFpbmluZyBhIGxvZyB0byBiZSBjb250aW51ZWQKKyAqLwordm9pZCBuaWxmc19zZWdidWZfbWFwX2NvbnQoc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICpzZWdidWYsCisJCQkgICBzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKnByZXYpCit7CisJc2VnYnVmLT5zYl9zZWdudW0gPSBwcmV2LT5zYl9zZWdudW07CisJc2VnYnVmLT5zYl9mc2VnX3N0YXJ0ID0gcHJldi0+c2JfZnNlZ19zdGFydDsKKwlzZWdidWYtPnNiX2ZzZWdfZW5kID0gcHJldi0+c2JfZnNlZ19lbmQ7CisJc2VnYnVmLT5zYl9wc2VnX3N0YXJ0ID0gcHJldi0+c2JfcHNlZ19zdGFydCArIHByZXYtPnNiX3N1bS5uYmxvY2tzOworCXNlZ2J1Zi0+c2JfcmVzdF9ibG9ja3MgPQorCQlzZWdidWYtPnNiX2ZzZWdfZW5kIC0gc2VnYnVmLT5zYl9wc2VnX3N0YXJ0ICsgMTsKK30KKwogdm9pZCBuaWxmc19zZWdidWZfc2V0X25leHRfc2VnbnVtKHN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqc2VnYnVmLAogCQkJCSAgX191NjQgbmV4dG51bSwgc3RydWN0IHRoZV9uaWxmcyAqbmlsZnMpCiB7CkBAIC0xMzIsOCArMTY1LDYgQEAKIAlzZWdidWYtPnNiX3N1bS5zdW1ieXRlcyA9IHNpemVvZihzdHJ1Y3QgbmlsZnNfc2VnbWVudF9zdW1tYXJ5KTsKIAlzZWdidWYtPnNiX3N1bS5uZmluZm8gPSBzZWdidWYtPnNiX3N1bS5uZmlsZWJsayA9IDA7CiAJc2VnYnVmLT5zYl9zdW0uY3RpbWUgPSBjdGltZTsKLQotCXNlZ2J1Zi0+c2JfaW9fZXJyb3IgPSAwOwogCXJldHVybiAwOwogfQogCkBAIC0yMTksNyArMjUwLDcgQEAKIAlyYXdfc3VtLT5zc19kYXRhc3VtID0gY3B1X3RvX2xlMzIoY3JjKTsKIH0KIAotdm9pZCBuaWxmc19yZWxlYXNlX2J1ZmZlcnMoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3N0YXRpYyB2b2lkIG5pbGZzX3JlbGVhc2VfYnVmZmVycyhzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpuOwogCkBAIC0yNDEsMTMgKzI3Miw1NiBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgbmlsZnNfc2VnYnVmX2NsZWFyKHN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqc2VnYnVmKQoreworCW5pbGZzX3JlbGVhc2VfYnVmZmVycygmc2VnYnVmLT5zYl9zZWdzdW1fYnVmZmVycyk7CisJbmlsZnNfcmVsZWFzZV9idWZmZXJzKCZzZWdidWYtPnNiX3BheWxvYWRfYnVmZmVycyk7Cit9CisKKy8qCisgKiBJdGVyYXRvcnMgZm9yIHNlZ21lbnQgYnVmZmVycworICovCit2b2lkIG5pbGZzX2NsZWFyX2xvZ3Moc3RydWN0IGxpc3RfaGVhZCAqbG9ncykKK3sKKwlzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKnNlZ2J1ZjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2VnYnVmLCBsb2dzLCBzYl9saXN0KQorCQluaWxmc19zZWdidWZfY2xlYXIoc2VnYnVmKTsKK30KKwordm9pZCBuaWxmc190cnVuY2F0ZV9sb2dzKHN0cnVjdCBsaXN0X2hlYWQgKmxvZ3MsCisJCQkgc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICpsYXN0KQoreworCXN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqbiwgKnNlZ2J1ZjsKKworCXNlZ2J1ZiA9IGxpc3RfcHJlcGFyZV9lbnRyeShsYXN0LCBsb2dzLCBzYl9saXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfY29udGludWUoc2VnYnVmLCBuLCBsb2dzLCBzYl9saXN0KSB7CisJCWxpc3RfZGVsX2luaXQoJnNlZ2J1Zi0+c2JfbGlzdCk7CisJCW5pbGZzX3NlZ2J1Zl9jbGVhcihzZWdidWYpOworCQluaWxmc19zZWdidWZfZnJlZShzZWdidWYpOworCX0KK30KKworaW50IG5pbGZzX3dhaXRfb25fbG9ncyhzdHJ1Y3QgbGlzdF9oZWFkICpsb2dzKQoreworCXN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqc2VnYnVmOworCWludCBlcnI7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlZ2J1ZiwgbG9ncywgc2JfbGlzdCkgeworCQllcnIgPSBuaWxmc19zZWdidWZfd2FpdChzZWdidWYpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBCSU8gb3BlcmF0aW9ucwogICovCiBzdGF0aWMgdm9pZCBuaWxmc19lbmRfYmlvX3dyaXRlKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycikKIHsKIAljb25zdCBpbnQgdXB0b2RhdGUgPSB0ZXN0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKLQlzdHJ1Y3QgbmlsZnNfd3JpdGVfaW5mbyAqd2kgPSBiaW8tPmJpX3ByaXZhdGU7CisJc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICpzZWdidWYgPSBiaW8tPmJpX3ByaXZhdGU7CiAKIAlpZiAoZXJyID09IC1FT1BOT1RTVVBQKSB7CiAJCXNldF9iaXQoQklPX0VPUE5PVFNVUFAsICZiaW8tPmJpX2ZsYWdzKTsKQEAgLTI1NiwyMSArMzMwLDIyIEBACiAJfQogCiAJaWYgKCF1cHRvZGF0ZSkKLQkJYXRvbWljX2luYygmd2ktPmVycik7CisJCWF0b21pY19pbmMoJnNlZ2J1Zi0+c2JfZXJyKTsKIAogCWJpb19wdXQoYmlvKTsKLQljb21wbGV0ZSgmd2ktPmJpb19ldmVudCk7CisJY29tcGxldGUoJnNlZ2J1Zi0+c2JfYmlvX2V2ZW50KTsKIH0KIAotc3RhdGljIGludCBuaWxmc19zdWJtaXRfc2VnX2JpbyhzdHJ1Y3QgbmlsZnNfd3JpdGVfaW5mbyAqd2ksIGludCBtb2RlKQorc3RhdGljIGludCBuaWxmc19zZWdidWZfc3VibWl0X2JpbyhzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKnNlZ2J1ZiwKKwkJCQkgICBzdHJ1Y3QgbmlsZnNfd3JpdGVfaW5mbyAqd2ksIGludCBtb2RlKQogewogCXN0cnVjdCBiaW8gKmJpbyA9IHdpLT5iaW87CiAJaW50IGVycjsKIAotCWlmICh3aS0+bmJpbyA+IDAgJiYgYmRpX3dyaXRlX2Nvbmdlc3RlZCh3aS0+YmRpKSkgewotCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ3aS0+YmlvX2V2ZW50KTsKLQkJd2ktPm5iaW8tLTsKLQkJaWYgKHVubGlrZWx5KGF0b21pY19yZWFkKCZ3aS0+ZXJyKSkpIHsKKwlpZiAoc2VnYnVmLT5zYl9uYmlvID4gMCAmJiBiZGlfd3JpdGVfY29uZ2VzdGVkKHdpLT5uaWxmcy0+bnNfYmRpKSkgeworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZzZWdidWYtPnNiX2Jpb19ldmVudCk7CisJCXNlZ2J1Zi0+c2JfbmJpby0tOworCQlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJnNlZ2J1Zi0+c2JfZXJyKSkpIHsKIAkJCWJpb19wdXQoYmlvKTsKIAkJCWVyciA9IC1FSU87CiAJCQlnb3RvIGZhaWxlZDsKQEAgLTI3OCw3ICszNTMsNyBAQAogCX0KIAogCWJpby0+YmlfZW5kX2lvID0gbmlsZnNfZW5kX2Jpb193cml0ZTsKLQliaW8tPmJpX3ByaXZhdGUgPSB3aTsKKwliaW8tPmJpX3ByaXZhdGUgPSBzZWdidWY7CiAJYmlvX2dldChiaW8pOwogCXN1Ym1pdF9iaW8obW9kZSwgYmlvKTsKIAlpZiAoYmlvX2ZsYWdnZWQoYmlvLCBCSU9fRU9QTk9UU1VQUCkpIHsKQEAgLTI4Niw3ICszNjEsNyBAQAogCQllcnIgPSAtRU9QTk9UU1VQUDsKIAkJZ290byBmYWlsZWQ7CiAJfQotCXdpLT5uYmlvKys7CisJc2VnYnVmLT5zYl9uYmlvKys7CiAJYmlvX3B1dChiaW8pOwogCiAJd2ktPmJpbyA9IE5VTEw7CkBAIC0zMDEsMTcgKzM3NiwxNSBAQAogfQogCiAvKioKLSAqIG5pbGZzX2FsbG9jX3NlZ19iaW8gLSBhbGxvY2F0ZSBhIGJpbyBmb3Igd3JpdGluZyBzZWdtZW50LgotICogQHNiOiBzdXBlciBibG9jawotICogQHN0YXJ0OiBiZWdpbm5pbmcgZGlzayBibG9jayBudW1iZXIgb2YgdGhpcyBCSU8uCisgKiBuaWxmc19hbGxvY19zZWdfYmlvIC0gYWxsb2NhdGUgYSBuZXcgYmlvIGZvciB3cml0aW5nIGxvZworICogQG5pbGZzOiBuaWxmcyBvYmplY3QKKyAqIEBzdGFydDogc3RhcnQgYmxvY2sgbnVtYmVyIG9mIHRoZSBiaW8KICAqIEBucl92ZWNzOiByZXF1ZXN0IHNpemUgb2YgcGFnZSB2ZWN0b3IuCiAgKgotICogYWxsb2Nfc2VnX2JpbygpIGFsbG9jYXRlcyBhIG5ldyBCSU8gc3RydWN0dXJlIGFuZCBpbml0aWFsaXplIGl0LgotICoKICAqIFJldHVybiBWYWx1ZTogT24gc3VjY2VzcywgcG9pbnRlciB0byB0aGUgc3RydWN0IGJpbyBpcyByZXR1cm5lZC4KICAqIE9uIGVycm9yLCBOVUxMIGlzIHJldHVybmVkLgogICovCi1zdGF0aWMgc3RydWN0IGJpbyAqbmlsZnNfYWxsb2Nfc2VnX2JpbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzZWN0b3JfdCBzdGFydCwKK3N0YXRpYyBzdHJ1Y3QgYmlvICpuaWxmc19hbGxvY19zZWdfYmlvKHN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzLCBzZWN0b3JfdCBzdGFydCwKIAkJCQkgICAgICAgaW50IG5yX3ZlY3MpCiB7CiAJc3RydWN0IGJpbyAqYmlvOwpAQCAtMzIyLDM2ICszOTUsMzMgQEAKIAkJCWJpbyA9IGJpb19hbGxvYyhHRlBfTk9JTywgbnJfdmVjcyk7CiAJfQogCWlmIChsaWtlbHkoYmlvKSkgewotCQliaW8tPmJpX2JkZXYgPSBzYi0+c19iZGV2OwotCQliaW8tPmJpX3NlY3RvciA9IChzZWN0b3JfdClzdGFydCA8PCAoc2ItPnNfYmxvY2tzaXplX2JpdHMgLSA5KTsKKwkJYmlvLT5iaV9iZGV2ID0gbmlsZnMtPm5zX2JkZXY7CisJCWJpby0+Ymlfc2VjdG9yID0gc3RhcnQgPDwgKG5pbGZzLT5uc19ibG9ja3NpemVfYml0cyAtIDkpOwogCX0KIAlyZXR1cm4gYmlvOwogfQogCi12b2lkIG5pbGZzX3NlZ2J1Zl9wcmVwYXJlX3dyaXRlKHN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqc2VnYnVmLAotCQkJCXN0cnVjdCBuaWxmc193cml0ZV9pbmZvICp3aSkKK3N0YXRpYyB2b2lkIG5pbGZzX3NlZ2J1Zl9wcmVwYXJlX3dyaXRlKHN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqc2VnYnVmLAorCQkJCSAgICAgICBzdHJ1Y3QgbmlsZnNfd3JpdGVfaW5mbyAqd2kpCiB7CiAJd2ktPmJpbyA9IE5VTEw7CiAJd2ktPnJlc3RfYmxvY2tzID0gc2VnYnVmLT5zYl9zdW0ubmJsb2NrczsKLQl3aS0+bWF4X3BhZ2VzID0gYmlvX2dldF9ucl92ZWNzKHdpLT5zYi0+c19iZGV2KTsKKwl3aS0+bWF4X3BhZ2VzID0gYmlvX2dldF9ucl92ZWNzKHdpLT5uaWxmcy0+bnNfYmRldik7CiAJd2ktPm5yX3ZlY3MgPSBtaW4od2ktPm1heF9wYWdlcywgd2ktPnJlc3RfYmxvY2tzKTsKIAl3aS0+c3RhcnQgPSB3aS0+ZW5kID0gMDsKLQl3aS0+bmJpbyA9IDA7CiAJd2ktPmJsb2NrbnIgPSBzZWdidWYtPnNiX3BzZWdfc3RhcnQ7Ci0KLQlhdG9taWNfc2V0KCZ3aS0+ZXJyLCAwKTsKLQlpbml0X2NvbXBsZXRpb24oJndpLT5iaW9fZXZlbnQpOwogfQogCi1zdGF0aWMgaW50IG5pbGZzX3N1Ym1pdF9iaChzdHJ1Y3QgbmlsZnNfd3JpdGVfaW5mbyAqd2ksIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCi0JCQkgICBpbnQgbW9kZSkKK3N0YXRpYyBpbnQgbmlsZnNfc2VnYnVmX3N1Ym1pdF9iaChzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKnNlZ2J1ZiwKKwkJCQkgIHN0cnVjdCBuaWxmc193cml0ZV9pbmZvICp3aSwKKwkJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBtb2RlKQogewogCWludCBsZW4sIGVycjsKIAogCUJVR19PTih3aS0+bnJfdmVjcyA8PSAwKTsKICByZXBlYXQ6CiAJaWYgKCF3aS0+YmlvKSB7Ci0JCXdpLT5iaW8gPSBuaWxmc19hbGxvY19zZWdfYmlvKHdpLT5zYiwgd2ktPmJsb2NrbnIgKyB3aS0+ZW5kLAorCQl3aS0+YmlvID0gbmlsZnNfYWxsb2Nfc2VnX2Jpbyh3aS0+bmlsZnMsIHdpLT5ibG9ja25yICsgd2ktPmVuZCwKIAkJCQkJICAgICAgd2ktPm5yX3ZlY3MpOwogCQlpZiAodW5saWtlbHkoIXdpLT5iaW8pKQogCQkJcmV0dXJuIC1FTk9NRU07CkBAIC0zNjMsNzYgKzQzMyw4MyBAQAogCQlyZXR1cm4gMDsKIAl9CiAJLyogYmlvIGlzIEZVTEwgKi8KLQllcnIgPSBuaWxmc19zdWJtaXRfc2VnX2Jpbyh3aSwgbW9kZSk7CisJZXJyID0gbmlsZnNfc2VnYnVmX3N1Ym1pdF9iaW8oc2VnYnVmLCB3aSwgbW9kZSk7CiAJLyogbmV2ZXIgc3VibWl0IGN1cnJlbnQgYmggKi8KIAlpZiAobGlrZWx5KCFlcnIpKQogCQlnb3RvIHJlcGVhdDsKIAlyZXR1cm4gZXJyOwogfQogCisvKioKKyAqIG5pbGZzX3NlZ2J1Zl93cml0ZSAtIHN1Ym1pdCB3cml0ZSByZXF1ZXN0cyBvZiBhIGxvZworICogQHNlZ2J1ZjogYnVmZmVyIHN0b3JpbmcgYSBsb2cgdG8gYmUgd3JpdHRlbgorICogQG5pbGZzOiBuaWxmcyBvYmplY3QKKyAqCisgKiBSZXR1cm4gVmFsdWU6IE9uIFN1Y2Nlc3MsIDAgaXMgcmV0dXJuZWQuIE9uIEVycm9yLCBvbmUgb2YgdGhlIGZvbGxvd2luZworICogbmVnYXRpdmUgZXJyb3IgY29kZSBpcyByZXR1cm5lZC4KKyAqCisgKiAlLUVJTyAtIEkvTyBlcnJvcgorICoKKyAqICUtRU5PTUVNIC0gSW5zdWZmaWNpZW50IG1lbW9yeSBhdmFpbGFibGUuCisgKi8KIGludCBuaWxmc19zZWdidWZfd3JpdGUoc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICpzZWdidWYsCi0JCSAgICAgICBzdHJ1Y3QgbmlsZnNfd3JpdGVfaW5mbyAqd2kpCisJCSAgICAgICBzdHJ1Y3QgdGhlX25pbGZzICpuaWxmcykKIHsKKwlzdHJ1Y3QgbmlsZnNfd3JpdGVfaW5mbyB3aTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwotCWludCByZXMsIHJ3ID0gV1JJVEU7CisJaW50IHJlcyA9IDAsIHJ3ID0gV1JJVEU7CisKKwl3aS5uaWxmcyA9IG5pbGZzOworCW5pbGZzX3NlZ2J1Zl9wcmVwYXJlX3dyaXRlKHNlZ2J1ZiwgJndpKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoYmgsICZzZWdidWYtPnNiX3NlZ3N1bV9idWZmZXJzLCBiX2Fzc29jX2J1ZmZlcnMpIHsKLQkJcmVzID0gbmlsZnNfc3VibWl0X2JoKHdpLCBiaCwgcncpOworCQlyZXMgPSBuaWxmc19zZWdidWZfc3VibWl0X2JoKHNlZ2J1ZiwgJndpLCBiaCwgcncpOwogCQlpZiAodW5saWtlbHkocmVzKSkKIAkJCWdvdG8gZmFpbGVkX2JpbzsKIAl9CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJoLCAmc2VnYnVmLT5zYl9wYXlsb2FkX2J1ZmZlcnMsIGJfYXNzb2NfYnVmZmVycykgewotCQlyZXMgPSBuaWxmc19zdWJtaXRfYmgod2ksIGJoLCBydyk7CisJCXJlcyA9IG5pbGZzX3NlZ2J1Zl9zdWJtaXRfYmgoc2VnYnVmLCAmd2ksIGJoLCBydyk7CiAJCWlmICh1bmxpa2VseShyZXMpKQogCQkJZ290byBmYWlsZWRfYmlvOwogCX0KIAotCWlmICh3aS0+YmlvKSB7CisJaWYgKHdpLmJpbykgewogCQkvKgogCQkgKiBMYXN0IEJJTyBpcyBhbHdheXMgc2VudCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKIAkJICogc3VibWlzc2lvbi4KIAkJICovCiAJCXJ3IHw9ICgxIDw8IEJJT19SV19TWU5DSU8pIHwgKDEgPDwgQklPX1JXX1VOUExVRyk7Ci0JCXJlcyA9IG5pbGZzX3N1Ym1pdF9zZWdfYmlvKHdpLCBydyk7Ci0JCWlmICh1bmxpa2VseShyZXMpKQotCQkJZ290byBmYWlsZWRfYmlvOworCQlyZXMgPSBuaWxmc19zZWdidWZfc3VibWl0X2JpbyhzZWdidWYsICZ3aSwgcncpOwogCX0KIAotCXJlcyA9IDA7Ci0gb3V0OgotCXJldHVybiByZXM7Ci0KICBmYWlsZWRfYmlvOgotCWF0b21pY19pbmMoJndpLT5lcnIpOwotCWdvdG8gb3V0OworCXJldHVybiByZXM7CiB9CiAKIC8qKgogICogbmlsZnNfc2VnYnVmX3dhaXQgLSB3YWl0IGZvciBjb21wbGV0aW9uIG9mIHJlcXVlc3RlZCBCSU9zCi0gKiBAd2k6IG5pbGZzX3dyaXRlX2luZm8KKyAqIEBzZWdidWY6IHNlZ21lbnQgYnVmZmVyCiAgKgogICogUmV0dXJuIFZhbHVlOiBPbiBTdWNjZXNzLCAwIGlzIHJldHVybmVkLiBPbiBFcnJvciwgb25lIG9mIHRoZSBmb2xsb3dpbmcKICAqIG5lZ2F0aXZlIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQuCiAgKgogICogJS1FSU8gLSBJL08gZXJyb3IKICAqLwotaW50IG5pbGZzX3NlZ2J1Zl93YWl0KHN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqc2VnYnVmLAotCQkgICAgICBzdHJ1Y3QgbmlsZnNfd3JpdGVfaW5mbyAqd2kpCitpbnQgbmlsZnNfc2VnYnVmX3dhaXQoc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICpzZWdidWYpCiB7CiAJaW50IGVyciA9IDA7CiAKLQlpZiAoIXdpLT5uYmlvKQorCWlmICghc2VnYnVmLT5zYl9uYmlvKQogCQlyZXR1cm4gMDsKIAogCWRvIHsKLQkJd2FpdF9mb3JfY29tcGxldGlvbigmd2ktPmJpb19ldmVudCk7Ci0JfSB3aGlsZSAoLS13aS0+bmJpbyA+IDApOworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZzZWdidWYtPnNiX2Jpb19ldmVudCk7CisJfSB3aGlsZSAoLS1zZWdidWYtPnNiX25iaW8gPiAwKTsKIAotCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmd2ktPmVycikgPiAwKSkgeworCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmc2VnYnVmLT5zYl9lcnIpID4gMCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJOSUxGUzogSU8gZXJyb3Igd3JpdGluZyBzZWdtZW50XG4iKTsKIAkJZXJyID0gLUVJTzsKLQkJc2VnYnVmLT5zYl9pb19lcnJvciA9IDE7CiAJfQogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9mcy9uaWxmczIvc2VnYnVmLmggYi9mcy9uaWxmczIvc2VnYnVmLmgKaW5kZXggMGMzMDc2Zi4uNmFmMTYzMCAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL3NlZ2J1Zi5oCisrKyBiL2ZzL25pbGZzMi9zZWdidWYuaApAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvYmlvLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgotI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CiAKIC8qKgogICogc3RydWN0IG5pbGZzX3NlZ3N1bV9pbmZvIC0gT24tbWVtb3J5IHNlZ21lbnQgc3VtbWFyeQpAQCAtNzcsNyArNzYsOSBAQAogICogQHNiX3Jlc3RfYmxvY2tzOiBOdW1iZXIgb2YgcmVzaWR1YWwgYmxvY2tzIGluIHRoZSBjdXJyZW50IHNlZ21lbnQKICAqIEBzYl9zZWdzdW1fYnVmZmVyczogTGlzdCBvZiBidWZmZXJzIGZvciBzZWdtZW50IHN1bW1hcmllcwogICogQHNiX3BheWxvYWRfYnVmZmVyczogTGlzdCBvZiBidWZmZXJzIGZvciBzZWdtZW50IHBheWxvYWQKLSAqIEBzYl9pb19lcnJvcjogSS9PIGVycm9yIHN0YXR1cworICogQHNiX25iaW86IE51bWJlciBvZiBmbHlpbmcgYmlvIHJlcXVlc3RzCisgKiBAc2JfZXJyOiBJL08gZXJyb3Igc3RhdHVzCisgKiBAc2JfYmlvX2V2ZW50OiBDb21wbGV0aW9uIGV2ZW50IG9mIGxvZyB3cml0aW5nCiAgKi8KIHN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICAgICAqc2Jfc3VwZXI7CkBAIC05Niw3ICs5Nyw5IEBACiAJc3RydWN0IGxpc3RfaGVhZAlzYl9wYXlsb2FkX2J1ZmZlcnM7IC8qIGluY2x1ZGluZyBzdXBlciByb290ICovCiAKIAkvKiBpbyBzdGF0dXMgKi8KLQlpbnQJCQlzYl9pb19lcnJvcjsKKwlpbnQJCQlzYl9uYmlvOworCWF0b21pY190CQlzYl9lcnI7CisJc3RydWN0IGNvbXBsZXRpb24Jc2JfYmlvX2V2ZW50OwogfTsKIAogI2RlZmluZSBOSUxGU19MSVNUX1NFR0JVRihoZWFkKSAgXApAQCAtMTI1LDYgKzEyOCw4IEBACiB2b2lkIG5pbGZzX3NlZ2J1Zl9mcmVlKHN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqKTsKIHZvaWQgbmlsZnNfc2VnYnVmX21hcChzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKiwgX191NjQsIHVuc2lnbmVkIGxvbmcsCiAJCSAgICAgIHN0cnVjdCB0aGVfbmlsZnMgKik7Cit2b2lkIG5pbGZzX3NlZ2J1Zl9tYXBfY29udChzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKnNlZ2J1ZiwKKwkJCSAgIHN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqcHJldik7CiB2b2lkIG5pbGZzX3NlZ2J1Zl9zZXRfbmV4dF9zZWdudW0oc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICosIF9fdTY0LAogCQkJCSAgc3RydWN0IHRoZV9uaWxmcyAqKTsKIGludCBuaWxmc19zZWdidWZfcmVzZXQoc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICosIHVuc2lnbmVkLCB0aW1lX3QpOwpAQCAtMTYxLDQxICsxNjYsMTggQEAKIAlzZWdidWYtPnNiX3N1bS5uZmlsZWJsaysrOwogfQogCi12b2lkIG5pbGZzX3JlbGVhc2VfYnVmZmVycyhzdHJ1Y3QgbGlzdF9oZWFkICopOworaW50IG5pbGZzX3NlZ2J1Zl93cml0ZShzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKnNlZ2J1ZiwKKwkJICAgICAgIHN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzKTsKK2ludCBuaWxmc19zZWdidWZfd2FpdChzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKnNlZ2J1Zik7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBuaWxmc19zZWdidWZfY2xlYXIoc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICpzZWdidWYpCit2b2lkIG5pbGZzX2NsZWFyX2xvZ3Moc3RydWN0IGxpc3RfaGVhZCAqbG9ncyk7Cit2b2lkIG5pbGZzX3RydW5jYXRlX2xvZ3Moc3RydWN0IGxpc3RfaGVhZCAqbG9ncywKKwkJCSBzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKmxhc3QpOworaW50IG5pbGZzX3dhaXRfb25fbG9ncyhzdHJ1Y3QgbGlzdF9oZWFkICpsb2dzKTsKKworc3RhdGljIGlubGluZSB2b2lkIG5pbGZzX2Rlc3Ryb3lfbG9ncyhzdHJ1Y3QgbGlzdF9oZWFkICpsb2dzKQogewotCW5pbGZzX3JlbGVhc2VfYnVmZmVycygmc2VnYnVmLT5zYl9zZWdzdW1fYnVmZmVycyk7Ci0JbmlsZnNfcmVsZWFzZV9idWZmZXJzKCZzZWdidWYtPnNiX3BheWxvYWRfYnVmZmVycyk7CisJbmlsZnNfdHJ1bmNhdGVfbG9ncyhsb2dzLCBOVUxMKTsKIH0KIAotc3RydWN0IG5pbGZzX3dyaXRlX2luZm8gewotCXN0cnVjdCBiaW8JICAgICAgICpiaW87Ci0JaW50IAkJCXN0YXJ0LCBlbmQ7IC8qIFRoZSByZWdpb24gdG8gYmUgc3VibWl0dGVkICovCi0JaW50CQkJcmVzdF9ibG9ja3M7Ci0JaW50CQkJbWF4X3BhZ2VzOwotCWludAkJCW5yX3ZlY3M7Ci0Jc2VjdG9yX3QJCWJsb2NrbnI7Ci0KLQlpbnQJCQluYmlvOwotCWF0b21pY190CQllcnI7Ci0Jc3RydWN0IGNvbXBsZXRpb24JYmlvX2V2ZW50OwotCQkJCS8qIGNvbXBsZXRpb24gZXZlbnQgb2Ygc2VnbWVudCB3cml0ZSAqLwotCi0JLyoKLQkgKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBtdXN0IGJlIHNldCBleHBsaWNpdGx5Ci0JICovCi0Jc3RydWN0IHN1cGVyX2Jsb2NrICAgICAqc2I7Ci0Jc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaTsgLyogYmFja2luZyBkZXYgaW5mbyAqLwotCXN0cnVjdCBidWZmZXJfaGVhZCAgICAgKmJoX3NyOwotfTsKLQotCi12b2lkIG5pbGZzX3NlZ2J1Zl9wcmVwYXJlX3dyaXRlKHN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqLAotCQkJCXN0cnVjdCBuaWxmc193cml0ZV9pbmZvICopOwotaW50IG5pbGZzX3NlZ2J1Zl93cml0ZShzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKiwKLQkJICAgICAgIHN0cnVjdCBuaWxmc193cml0ZV9pbmZvICopOwotaW50IG5pbGZzX3NlZ2J1Zl93YWl0KHN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqLAotCQkgICAgICBzdHJ1Y3QgbmlsZnNfd3JpdGVfaW5mbyAqKTsKLQogI2VuZGlmIC8qIF9OSUxGU19TRUdCVUZfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL3NlZ21lbnQuYyBiL2ZzL25pbGZzMi9zZWdtZW50LmMKaW5kZXggNmVmZjY2YS4uMTc1ODRjNSAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL3NlZ21lbnQuYworKysgYi9mcy9uaWxmczIvc2VnbWVudC5jCkBAIC05NzQsMTIgKzk3NCwxMiBAQAogCQkJICAgICAgbmlsZnMtPm5zX25vbmdjX2N0aW1lIDogc2NpLT5zY19zZWdfY3RpbWUpOwogCXJhd19zci0+c3JfZmxhZ3MgPSAwOwogCi0JbmlsZnNfbWR0X3dyaXRlX2lub2RlX2RpcmVjdCgKLQkJbmlsZnNfZGF0X2lub2RlKG5pbGZzKSwgYmhfc3IsIE5JTEZTX1NSX0RBVF9PRkZTRVQoaXN6KSk7Ci0JbmlsZnNfbWR0X3dyaXRlX2lub2RlX2RpcmVjdCgKLQkJbmlsZnMtPm5zX2NwZmlsZSwgYmhfc3IsIE5JTEZTX1NSX0NQRklMRV9PRkZTRVQoaXN6KSk7Ci0JbmlsZnNfbWR0X3dyaXRlX2lub2RlX2RpcmVjdCgKLQkJbmlsZnMtPm5zX3N1ZmlsZSwgYmhfc3IsIE5JTEZTX1NSX1NVRklMRV9PRkZTRVQoaXN6KSk7CisJbmlsZnNfd3JpdGVfaW5vZGVfY29tbW9uKG5pbGZzX2RhdF9pbm9kZShuaWxmcyksICh2b2lkICopcmF3X3NyICsKKwkJCQkgTklMRlNfU1JfREFUX09GRlNFVChpc3opLCAxKTsKKwluaWxmc193cml0ZV9pbm9kZV9jb21tb24obmlsZnMtPm5zX2NwZmlsZSwgKHZvaWQgKilyYXdfc3IgKworCQkJCSBOSUxGU19TUl9DUEZJTEVfT0ZGU0VUKGlzeiksIDEpOworCW5pbGZzX3dyaXRlX2lub2RlX2NvbW1vbihuaWxmcy0+bnNfc3VmaWxlLCAodm9pZCAqKXJhd19zciArCisJCQkJIE5JTEZTX1NSX1NVRklMRV9PRkZTRVQoaXN6KSwgMSk7CiB9CiAKIHN0YXRpYyB2b2lkIG5pbGZzX3JlZGlydHlfaW5vZGVzKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCkBAIC0xMjczLDczICsxMjczLDc1IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBuaWxmc190b3VjaF9zZWd1c2FnZShzdHJ1Y3QgaW5vZGUgKnN1ZmlsZSwgX191NjQgc2VnbnVtKQotewotCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhfc3U7Ci0Jc3RydWN0IG5pbGZzX3NlZ21lbnRfdXNhZ2UgKnJhd19zdTsKLQlpbnQgZXJyOwotCi0JZXJyID0gbmlsZnNfc3VmaWxlX2dldF9zZWdtZW50X3VzYWdlKHN1ZmlsZSwgc2VnbnVtLCAmcmF3X3N1LCAmYmhfc3UpOwotCWlmICh1bmxpa2VseShlcnIpKQotCQlyZXR1cm4gZXJyOwotCW5pbGZzX21kdF9tYXJrX2J1ZmZlcl9kaXJ0eShiaF9zdSk7Ci0JbmlsZnNfbWR0X21hcmtfZGlydHkoc3VmaWxlKTsKLQluaWxmc19zdWZpbGVfcHV0X3NlZ21lbnRfdXNhZ2Uoc3VmaWxlLCBzZWdudW0sIGJoX3N1KTsKLQlyZXR1cm4gMDsKLX0KLQorLyoqCisgKiBuaWxmc19zZWdjdG9yX2JlZ2luX2NvbnN0cnVjdGlvbiAtIHNldHVwIHNlZ21lbnQgYnVmZmVyIHRvIG1ha2UgYSBuZXcgbG9nCisgKiBAc2NpOiBuaWxmc19zY19pbmZvCisgKiBAbmlsZnM6IG5pbGZzIG9iamVjdAorICovCiBzdGF0aWMgaW50IG5pbGZzX3NlZ2N0b3JfYmVnaW5fY29uc3RydWN0aW9uKHN0cnVjdCBuaWxmc19zY19pbmZvICpzY2ksCiAJCQkJCSAgICBzdHJ1Y3QgdGhlX25pbGZzICpuaWxmcykKIHsKLQlzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKnNlZ2J1ZiwgKm47CisJc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICpzZWdidWYsICpwcmV2OwogCV9fdTY0IG5leHRudW07Ci0JaW50IGVycjsKKwlpbnQgZXJyLCBhbGxvYyA9IDA7CiAKLQlpZiAobGlzdF9lbXB0eSgmc2NpLT5zY19zZWdidWZzKSkgewotCQlzZWdidWYgPSBuaWxmc19zZWdidWZfbmV3KHNjaS0+c2Nfc3VwZXIpOwotCQlpZiAodW5saWtlbHkoIXNlZ2J1ZikpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJbGlzdF9hZGQoJnNlZ2J1Zi0+c2JfbGlzdCwgJnNjaS0+c2Nfc2VnYnVmcyk7Ci0JfSBlbHNlCi0JCXNlZ2J1ZiA9IE5JTEZTX0ZJUlNUX1NFR0JVRigmc2NpLT5zY19zZWdidWZzKTsKKwlzZWdidWYgPSBuaWxmc19zZWdidWZfbmV3KHNjaS0+c2Nfc3VwZXIpOworCWlmICh1bmxpa2VseSghc2VnYnVmKSkKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQluaWxmc19zZWdidWZfbWFwKHNlZ2J1ZiwgbmlsZnMtPm5zX3NlZ251bSwgbmlsZnMtPm5zX3BzZWdfb2Zmc2V0LAotCQkJIG5pbGZzKTsKKwlpZiAobGlzdF9lbXB0eSgmc2NpLT5zY193cml0ZV9sb2dzKSkgeworCQluaWxmc19zZWdidWZfbWFwKHNlZ2J1ZiwgbmlsZnMtPm5zX3NlZ251bSwKKwkJCQkgbmlsZnMtPm5zX3BzZWdfb2Zmc2V0LCBuaWxmcyk7CisJCWlmIChzZWdidWYtPnNiX3Jlc3RfYmxvY2tzIDwgTklMRlNfUFNFR19NSU5fQkxPQ0tTKSB7CisJCQluaWxmc19zaGlmdF90b19uZXh0X3NlZ21lbnQobmlsZnMpOworCQkJbmlsZnNfc2VnYnVmX21hcChzZWdidWYsIG5pbGZzLT5uc19zZWdudW0sIDAsIG5pbGZzKTsKKwkJfQogCi0JaWYgKHNlZ2J1Zi0+c2JfcmVzdF9ibG9ja3MgPCBOSUxGU19QU0VHX01JTl9CTE9DS1MpIHsKLQkJbmlsZnNfc2hpZnRfdG9fbmV4dF9zZWdtZW50KG5pbGZzKTsKLQkJbmlsZnNfc2VnYnVmX21hcChzZWdidWYsIG5pbGZzLT5uc19zZWdudW0sIDAsIG5pbGZzKTsKLQl9Ci0Jc2NpLT5zY19zZWdidWZfbmJsb2NrcyA9IHNlZ2J1Zi0+c2JfcmVzdF9ibG9ja3M7Ci0KLQllcnIgPSBuaWxmc190b3VjaF9zZWd1c2FnZShuaWxmcy0+bnNfc3VmaWxlLCBzZWdidWYtPnNiX3NlZ251bSk7Ci0JaWYgKHVubGlrZWx5KGVycikpCi0JCXJldHVybiBlcnI7Ci0KLQlpZiAobmlsZnMtPm5zX3NlZ251bSA9PSBuaWxmcy0+bnNfbmV4dG51bSkgewotCQkvKiBTdGFydCBmcm9tIHRoZSBoZWFkIG9mIGEgbmV3IGZ1bGwgc2VnbWVudCAqLwotCQllcnIgPSBuaWxmc19zdWZpbGVfYWxsb2MobmlsZnMtPm5zX3N1ZmlsZSwgJm5leHRudW0pOwotCQlpZiAodW5saWtlbHkoZXJyKSkKLQkJCXJldHVybiBlcnI7Ci0JfSBlbHNlCisJCXNlZ2J1Zi0+c2Jfc3VtLnNlZ19zZXEgPSBuaWxmcy0+bnNfc2VnX3NlcTsKIAkJbmV4dG51bSA9IG5pbGZzLT5uc19uZXh0bnVtOwogCi0Jc2VnYnVmLT5zYl9zdW0uc2VnX3NlcSA9IG5pbGZzLT5uc19zZWdfc2VxOworCQlpZiAobmlsZnMtPm5zX3NlZ251bSA9PSBuaWxmcy0+bnNfbmV4dG51bSkKKwkJCS8qIFN0YXJ0IGZyb20gdGhlIGhlYWQgb2YgYSBuZXcgZnVsbCBzZWdtZW50ICovCisJCQlhbGxvYysrOworCX0gZWxzZSB7CisJCS8qIENvbnRpbnVlIGxvZ3MgKi8KKwkJcHJldiA9IE5JTEZTX0xBU1RfU0VHQlVGKCZzY2ktPnNjX3dyaXRlX2xvZ3MpOworCQluaWxmc19zZWdidWZfbWFwX2NvbnQoc2VnYnVmLCBwcmV2KTsKKwkJc2VnYnVmLT5zYl9zdW0uc2VnX3NlcSA9IHByZXYtPnNiX3N1bS5zZWdfc2VxOworCQluZXh0bnVtID0gcHJldi0+c2JfbmV4dG51bTsKKworCQlpZiAoc2VnYnVmLT5zYl9yZXN0X2Jsb2NrcyA8IE5JTEZTX1BTRUdfTUlOX0JMT0NLUykgeworCQkJbmlsZnNfc2VnYnVmX21hcChzZWdidWYsIHByZXYtPnNiX25leHRudW0sIDAsIG5pbGZzKTsKKwkJCXNlZ2J1Zi0+c2Jfc3VtLnNlZ19zZXErKzsKKwkJCWFsbG9jKys7CisJCX0KKwl9CisKKwllcnIgPSBuaWxmc19zdWZpbGVfbWFya19kaXJ0eShuaWxmcy0+bnNfc3VmaWxlLCBzZWdidWYtPnNiX3NlZ251bSk7CisJaWYgKGVycikKKwkJZ290byBmYWlsZWQ7CisKKwlpZiAoYWxsb2MpIHsKKwkJZXJyID0gbmlsZnNfc3VmaWxlX2FsbG9jKG5pbGZzLT5uc19zdWZpbGUsICZuZXh0bnVtKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZmFpbGVkOworCX0KIAluaWxmc19zZWdidWZfc2V0X25leHRfc2VnbnVtKHNlZ2J1ZiwgbmV4dG51bSwgbmlsZnMpOwogCi0JLyogdHJ1bmNhdGluZyBzZWdtZW50IGJ1ZmZlcnMgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfY29udGludWUoc2VnYnVmLCBuLCAmc2NpLT5zY19zZWdidWZzLAotCQkJCQkgIHNiX2xpc3QpIHsKLQkJbGlzdF9kZWxfaW5pdCgmc2VnYnVmLT5zYl9saXN0KTsKLQkJbmlsZnNfc2VnYnVmX2ZyZWUoc2VnYnVmKTsKLQl9CisJQlVHX09OKCFsaXN0X2VtcHR5KCZzY2ktPnNjX3NlZ2J1ZnMpKTsKKwlsaXN0X2FkZF90YWlsKCZzZWdidWYtPnNiX2xpc3QsICZzY2ktPnNjX3NlZ2J1ZnMpOworCXNjaS0+c2Nfc2VnYnVmX25ibG9ja3MgPSBzZWdidWYtPnNiX3Jlc3RfYmxvY2tzOwogCXJldHVybiAwOworCisgZmFpbGVkOgorCW5pbGZzX3NlZ2J1Zl9mcmVlKHNlZ2J1Zik7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBuaWxmc19zZWdjdG9yX2V4dGVuZF9zZWdtZW50cyhzdHJ1Y3QgbmlsZnNfc2NfaW5mbyAqc2NpLAogCQkJCQkgc3RydWN0IHRoZV9uaWxmcyAqbmlsZnMsIGludCBuYWRkKQogewotCXN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqc2VnYnVmLCAqcHJldiwgKm47CisJc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICpzZWdidWYsICpwcmV2OwogCXN0cnVjdCBpbm9kZSAqc3VmaWxlID0gbmlsZnMtPm5zX3N1ZmlsZTsKIAlfX3U2NCBuZXh0bmV4dG51bTsKIAlMSVNUX0hFQUQobGlzdCk7CkBAIC0xMzUyLDcgKzEzNTQsNyBAQAogCSAqIG5vdCBiZSBkaXJ0eS4gIFRoZSBmb2xsb3dpbmcgY2FsbCBlbnN1cmVzIHRoYXQgdGhlIGJ1ZmZlciBpcyBkaXJ0eQogCSAqIGFuZCB3aWxsIHBpbiB0aGUgYnVmZmVyIG9uIG1lbW9yeSB1bnRpbCB0aGUgc3VmaWxlIGlzIHdyaXR0ZW4uCiAJICovCi0JZXJyID0gbmlsZnNfdG91Y2hfc2VndXNhZ2Uoc3VmaWxlLCBwcmV2LT5zYl9uZXh0bnVtKTsKKwllcnIgPSBuaWxmc19zdWZpbGVfbWFya19kaXJ0eShzdWZpbGUsIHByZXYtPnNiX25leHRudW0pOwogCWlmICh1bmxpa2VseShlcnIpKQogCQlyZXR1cm4gZXJyOwogCkBAIC0xMzc4LDMzICsxMzgwLDMzIEBACiAJCWxpc3RfYWRkX3RhaWwoJnNlZ2J1Zi0+c2JfbGlzdCwgJmxpc3QpOwogCQlwcmV2ID0gc2VnYnVmOwogCX0KLQlsaXN0X3NwbGljZSgmbGlzdCwgc2NpLT5zY19zZWdidWZzLnByZXYpOworCWxpc3Rfc3BsaWNlX3RhaWwoJmxpc3QsICZzY2ktPnNjX3NlZ2J1ZnMpOwogCXJldHVybiAwOwogCiAgZmFpbGVkX3NlZ2J1ZjoKIAluaWxmc19zZWdidWZfZnJlZShzZWdidWYpOwogIGZhaWxlZDoKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2VnYnVmLCBuLCAmbGlzdCwgc2JfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2VnYnVmLCAmbGlzdCwgc2JfbGlzdCkgewogCQlyZXQgPSBuaWxmc19zdWZpbGVfZnJlZShzdWZpbGUsIHNlZ2J1Zi0+c2JfbmV4dG51bSk7CiAJCVdBUk5fT04ocmV0KTsgLyogbmV2ZXIgZmFpbHMgKi8KLQkJbGlzdF9kZWxfaW5pdCgmc2VnYnVmLT5zYl9saXN0KTsKLQkJbmlsZnNfc2VnYnVmX2ZyZWUoc2VnYnVmKTsKIAl9CisJbmlsZnNfZGVzdHJveV9sb2dzKCZsaXN0KTsKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCBuaWxmc19zZWdjdG9yX2ZyZWVfaW5jb21wbGV0ZV9zZWdtZW50cyhzdHJ1Y3QgbmlsZnNfc2NfaW5mbyAqc2NpLAotCQkJCQkJICAgc3RydWN0IHRoZV9uaWxmcyAqbmlsZnMpCitzdGF0aWMgdm9pZCBuaWxmc19mcmVlX2luY29tcGxldGVfbG9ncyhzdHJ1Y3QgbGlzdF9oZWFkICpsb2dzLAorCQkJCSAgICAgICBzdHJ1Y3QgdGhlX25pbGZzICpuaWxmcykKIHsKLQlzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKnNlZ2J1ZjsKLQlpbnQgcmV0LCBkb25lID0gMDsKKwlzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKnNlZ2J1ZiwgKnByZXY7CisJc3RydWN0IGlub2RlICpzdWZpbGUgPSBuaWxmcy0+bnNfc3VmaWxlOworCWludCByZXQ7CiAKLQlzZWdidWYgPSBOSUxGU19GSVJTVF9TRUdCVUYoJnNjaS0+c2Nfc2VnYnVmcyk7CisJc2VnYnVmID0gTklMRlNfRklSU1RfU0VHQlVGKGxvZ3MpOwogCWlmIChuaWxmcy0+bnNfbmV4dG51bSAhPSBzZWdidWYtPnNiX25leHRudW0pIHsKLQkJcmV0ID0gbmlsZnNfc3VmaWxlX2ZyZWUobmlsZnMtPm5zX3N1ZmlsZSwgc2VnYnVmLT5zYl9uZXh0bnVtKTsKKwkJcmV0ID0gbmlsZnNfc3VmaWxlX2ZyZWUoc3VmaWxlLCBzZWdidWYtPnNiX25leHRudW0pOwogCQlXQVJOX09OKHJldCk7IC8qIG5ldmVyIGZhaWxzICovCiAJfQotCWlmIChzZWdidWYtPnNiX2lvX2Vycm9yKSB7CisJaWYgKGF0b21pY19yZWFkKCZzZWdidWYtPnNiX2VycikpIHsKIAkJLyogQ2FzZSAxOiBUaGUgZmlyc3Qgc2VnbWVudCBmYWlsZWQgKi8KIAkJaWYgKHNlZ2J1Zi0+c2JfcHNlZ19zdGFydCAhPSBzZWdidWYtPnNiX2ZzZWdfc3RhcnQpCiAJCQkvKiBDYXNlIDFhOiAgUGFydGlhbCBzZWdtZW50IGFwcGVuZGVkIGludG8gYW4gZXhpc3RpbmcKQEAgLTE0MTMsMTA2ICsxNDE1LDU0IEBACiAJCQkJCQlzZWdidWYtPnNiX2ZzZWdfZW5kKTsKIAkJZWxzZSAvKiBDYXNlIDFiOiAgTmV3IGZ1bGwgc2VnbWVudCAqLwogCQkJc2V0X25pbGZzX2Rpc2NvbnRpbnVlZChuaWxmcyk7Ci0JCWRvbmUrKzsKIAl9CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlKHNlZ2J1ZiwgJnNjaS0+c2Nfc2VnYnVmcywgc2JfbGlzdCkgewotCQlyZXQgPSBuaWxmc19zdWZpbGVfZnJlZShuaWxmcy0+bnNfc3VmaWxlLCBzZWdidWYtPnNiX25leHRudW0pOwotCQlXQVJOX09OKHJldCk7IC8qIG5ldmVyIGZhaWxzICovCi0JCWlmICghZG9uZSAmJiBzZWdidWYtPnNiX2lvX2Vycm9yKSB7Ci0JCQlpZiAoc2VnYnVmLT5zYl9zZWdudW0gIT0gbmlsZnMtPm5zX25leHRudW0pCi0JCQkJLyogQ2FzZSAyOiBleHRlbmRlZCBzZWdtZW50ICghPSBuZXh0KSBmYWlsZWQgKi8KLQkJCQluaWxmc19zdWZpbGVfc2V0X2Vycm9yKG5pbGZzLT5uc19zdWZpbGUsCi0JCQkJCQkgICAgICAgc2VnYnVmLT5zYl9zZWdudW0pOwotCQkJZG9uZSsrOworCXByZXYgPSBzZWdidWY7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZShzZWdidWYsIGxvZ3MsIHNiX2xpc3QpIHsKKwkJaWYgKHByZXYtPnNiX25leHRudW0gIT0gc2VnYnVmLT5zYl9uZXh0bnVtKSB7CisJCQlyZXQgPSBuaWxmc19zdWZpbGVfZnJlZShzdWZpbGUsIHNlZ2J1Zi0+c2JfbmV4dG51bSk7CisJCQlXQVJOX09OKHJldCk7IC8qIG5ldmVyIGZhaWxzICovCiAJCX0KKwkJaWYgKGF0b21pY19yZWFkKCZzZWdidWYtPnNiX2VycikgJiYKKwkJICAgIHNlZ2J1Zi0+c2Jfc2VnbnVtICE9IG5pbGZzLT5uc19uZXh0bnVtKQorCQkJLyogQ2FzZSAyOiBleHRlbmRlZCBzZWdtZW50ICghPSBuZXh0KSBmYWlsZWQgKi8KKwkJCW5pbGZzX3N1ZmlsZV9zZXRfZXJyb3Ioc3VmaWxlLCBzZWdidWYtPnNiX3NlZ251bSk7CisJCXByZXYgPSBzZWdidWY7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBuaWxmc19zZWdjdG9yX2NsZWFyX3NlZ21lbnRfYnVmZmVycyhzdHJ1Y3QgbmlsZnNfc2NfaW5mbyAqc2NpKQotewotCXN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqc2VnYnVmOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShzZWdidWYsICZzY2ktPnNjX3NlZ2J1ZnMsIHNiX2xpc3QpCi0JCW5pbGZzX3NlZ2J1Zl9jbGVhcihzZWdidWYpOwotCXNjaS0+c2Nfc3VwZXJfcm9vdCA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIG5pbGZzX3NlZ2N0b3JfZGVzdHJveV9zZWdtZW50X2J1ZmZlcnMoc3RydWN0IG5pbGZzX3NjX2luZm8gKnNjaSkKLXsKLQlzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKnNlZ2J1ZjsKLQotCXdoaWxlICghbGlzdF9lbXB0eSgmc2NpLT5zY19zZWdidWZzKSkgewotCQlzZWdidWYgPSBOSUxGU19GSVJTVF9TRUdCVUYoJnNjaS0+c2Nfc2VnYnVmcyk7Ci0JCWxpc3RfZGVsX2luaXQoJnNlZ2J1Zi0+c2JfbGlzdCk7Ci0JCW5pbGZzX3NlZ2J1Zl9mcmVlKHNlZ2J1Zik7Ci0JfQotCS8qIHNjaS0+c2NfY3Vyc2VnID0gTlVMTDsgKi8KLX0KLQotc3RhdGljIHZvaWQgbmlsZnNfc2VnY3Rvcl9lbmRfY29uc3RydWN0aW9uKHN0cnVjdCBuaWxmc19zY19pbmZvICpzY2ksCi0JCQkJCSAgIHN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzLCBpbnQgZXJyKQotewotCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCW5pbGZzX3NlZ2N0b3JfZnJlZV9pbmNvbXBsZXRlX3NlZ21lbnRzKHNjaSwgbmlsZnMpOwotCQlpZiAoc2NpLT5zY19zdGFnZS5mbGFncyAmIE5JTEZTX0NGX1NVRlJFRUQpIHsKLQkJCWludCByZXQ7Ci0KLQkJCXJldCA9IG5pbGZzX3N1ZmlsZV9jYW5jZWxfZnJlZXYobmlsZnMtPm5zX3N1ZmlsZSwKLQkJCQkJCQlzY2ktPnNjX2ZyZWVzZWdzLAotCQkJCQkJCXNjaS0+c2NfbmZyZWVzZWdzLAotCQkJCQkJCU5VTEwpOwotCQkJV0FSTl9PTihyZXQpOyAvKiBkbyBub3QgaGFwcGVuICovCi0JCX0KLQl9Ci0JbmlsZnNfc2VnY3Rvcl9jbGVhcl9zZWdtZW50X2J1ZmZlcnMoc2NpKTsKLX0KLQogc3RhdGljIHZvaWQgbmlsZnNfc2VnY3Rvcl91cGRhdGVfc2VndXNhZ2Uoc3RydWN0IG5pbGZzX3NjX2luZm8gKnNjaSwKIAkJCQkJICBzdHJ1Y3QgaW5vZGUgKnN1ZmlsZSkKIHsKIAlzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKnNlZ2J1ZjsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3N1OwotCXN0cnVjdCBuaWxmc19zZWdtZW50X3VzYWdlICpyYXdfc3U7CiAJdW5zaWduZWQgbG9uZyBsaXZlX2Jsb2NrczsKIAlpbnQgcmV0OwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzZWdidWYsICZzY2ktPnNjX3NlZ2J1ZnMsIHNiX2xpc3QpIHsKLQkJcmV0ID0gbmlsZnNfc3VmaWxlX2dldF9zZWdtZW50X3VzYWdlKHN1ZmlsZSwgc2VnYnVmLT5zYl9zZWdudW0sCi0JCQkJCQkgICAgICZyYXdfc3UsICZiaF9zdSk7Ci0JCVdBUk5fT04ocmV0KTsgLyogYWx3YXlzIHN1Y2NlZWQgYmVjYXVzZSBiaF9zdSBpcyBkaXJ0eSAqLwogCQlsaXZlX2Jsb2NrcyA9IHNlZ2J1Zi0+c2Jfc3VtLm5ibG9ja3MgKwogCQkJKHNlZ2J1Zi0+c2JfcHNlZ19zdGFydCAtIHNlZ2J1Zi0+c2JfZnNlZ19zdGFydCk7Ci0JCXJhd19zdS0+c3VfbGFzdG1vZCA9IGNwdV90b19sZTY0KHNjaS0+c2Nfc2VnX2N0aW1lKTsKLQkJcmF3X3N1LT5zdV9uYmxvY2tzID0gY3B1X3RvX2xlMzIobGl2ZV9ibG9ja3MpOwotCQluaWxmc19zdWZpbGVfcHV0X3NlZ21lbnRfdXNhZ2Uoc3VmaWxlLCBzZWdidWYtPnNiX3NlZ251bSwKLQkJCQkJICAgICAgIGJoX3N1KTsKKwkJcmV0ID0gbmlsZnNfc3VmaWxlX3NldF9zZWdtZW50X3VzYWdlKHN1ZmlsZSwgc2VnYnVmLT5zYl9zZWdudW0sCisJCQkJCQkgICAgIGxpdmVfYmxvY2tzLAorCQkJCQkJICAgICBzY2ktPnNjX3NlZ19jdGltZSk7CisJCVdBUk5fT04ocmV0KTsgLyogYWx3YXlzIHN1Y2NlZWQgYmVjYXVzZSB0aGUgc2VndXNhZ2UgaXMgZGlydHkgKi8KIAl9CiB9CiAKLXN0YXRpYyB2b2lkIG5pbGZzX3NlZ2N0b3JfY2FuY2VsX3NlZ3VzYWdlKHN0cnVjdCBuaWxmc19zY19pbmZvICpzY2ksCi0JCQkJCSAgc3RydWN0IGlub2RlICpzdWZpbGUpCitzdGF0aWMgdm9pZCBuaWxmc19jYW5jZWxfc2VndXNhZ2Uoc3RydWN0IGxpc3RfaGVhZCAqbG9ncywgc3RydWN0IGlub2RlICpzdWZpbGUpCiB7CiAJc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICpzZWdidWY7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9zdTsKLQlzdHJ1Y3QgbmlsZnNfc2VnbWVudF91c2FnZSAqcmF3X3N1OwogCWludCByZXQ7CiAKLQlzZWdidWYgPSBOSUxGU19GSVJTVF9TRUdCVUYoJnNjaS0+c2Nfc2VnYnVmcyk7Ci0JcmV0ID0gbmlsZnNfc3VmaWxlX2dldF9zZWdtZW50X3VzYWdlKHN1ZmlsZSwgc2VnYnVmLT5zYl9zZWdudW0sCi0JCQkJCSAgICAgJnJhd19zdSwgJmJoX3N1KTsKLQlXQVJOX09OKHJldCk7IC8qIGFsd2F5cyBzdWNjZWVkIGJlY2F1c2UgYmhfc3UgaXMgZGlydHkgKi8KLQlyYXdfc3UtPnN1X25ibG9ja3MgPSBjcHVfdG9fbGUzMihzZWdidWYtPnNiX3BzZWdfc3RhcnQgLQotCQkJCQkgc2VnYnVmLT5zYl9mc2VnX3N0YXJ0KTsKLQluaWxmc19zdWZpbGVfcHV0X3NlZ21lbnRfdXNhZ2Uoc3VmaWxlLCBzZWdidWYtPnNiX3NlZ251bSwgYmhfc3UpOworCXNlZ2J1ZiA9IE5JTEZTX0ZJUlNUX1NFR0JVRihsb2dzKTsKKwlyZXQgPSBuaWxmc19zdWZpbGVfc2V0X3NlZ21lbnRfdXNhZ2Uoc3VmaWxlLCBzZWdidWYtPnNiX3NlZ251bSwKKwkJCQkJICAgICBzZWdidWYtPnNiX3BzZWdfc3RhcnQgLQorCQkJCQkgICAgIHNlZ2J1Zi0+c2JfZnNlZ19zdGFydCwgMCk7CisJV0FSTl9PTihyZXQpOyAvKiBhbHdheXMgc3VjY2VlZCBiZWNhdXNlIHRoZSBzZWd1c2FnZSBpcyBkaXJ0eSAqLwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZShzZWdidWYsICZzY2ktPnNjX3NlZ2J1ZnMsIHNiX2xpc3QpIHsKLQkJcmV0ID0gbmlsZnNfc3VmaWxlX2dldF9zZWdtZW50X3VzYWdlKHN1ZmlsZSwgc2VnYnVmLT5zYl9zZWdudW0sCi0JCQkJCQkgICAgICZyYXdfc3UsICZiaF9zdSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZShzZWdidWYsIGxvZ3MsIHNiX2xpc3QpIHsKKwkJcmV0ID0gbmlsZnNfc3VmaWxlX3NldF9zZWdtZW50X3VzYWdlKHN1ZmlsZSwgc2VnYnVmLT5zYl9zZWdudW0sCisJCQkJCQkgICAgIDAsIDApOwogCQlXQVJOX09OKHJldCk7IC8qIGFsd2F5cyBzdWNjZWVkICovCi0JCXJhd19zdS0+c3VfbmJsb2NrcyA9IDA7Ci0JCW5pbGZzX3N1ZmlsZV9wdXRfc2VnbWVudF91c2FnZShzdWZpbGUsIHNlZ2J1Zi0+c2Jfc2VnbnVtLAotCQkJCQkgICAgICAgYmhfc3UpOwogCX0KIH0KIApAQCAtMTUyMCwxNyArMTQ3MCwxNSBAQAogCQkJCQkgICAgc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICpsYXN0LAogCQkJCQkgICAgc3RydWN0IGlub2RlICpzdWZpbGUpCiB7Ci0Jc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICpzZWdidWYgPSBsYXN0LCAqbjsKKwlzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKnNlZ2J1ZiA9IGxhc3Q7CiAJaW50IHJldDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9jb250aW51ZShzZWdidWYsIG4sICZzY2ktPnNjX3NlZ2J1ZnMsCi0JCQkJCSAgc2JfbGlzdCkgewotCQlsaXN0X2RlbF9pbml0KCZzZWdidWYtPnNiX2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUoc2VnYnVmLCAmc2NpLT5zY19zZWdidWZzLCBzYl9saXN0KSB7CiAJCXNjaS0+c2Nfc2VnYnVmX25ibG9ja3MgLT0gc2VnYnVmLT5zYl9yZXN0X2Jsb2NrczsKIAkJcmV0ID0gbmlsZnNfc3VmaWxlX2ZyZWUoc3VmaWxlLCBzZWdidWYtPnNiX25leHRudW0pOwogCQlXQVJOX09OKHJldCk7Ci0JCW5pbGZzX3NlZ2J1Zl9mcmVlKHNlZ2J1Zik7CiAJfQorCW5pbGZzX3RydW5jYXRlX2xvZ3MoJnNjaS0+c2Nfc2VnYnVmcywgbGFzdCk7CiB9CiAKIApAQCAtMTU2OSw3ICsxNTE3LDcgQEAKIAkJCQkJCQlOVUxMKTsKIAkJCVdBUk5fT04oZXJyKTsgLyogZG8gbm90IGhhcHBlbiAqLwogCQl9Ci0JCW5pbGZzX3NlZ2N0b3JfY2xlYXJfc2VnbWVudF9idWZmZXJzKHNjaSk7CisJCW5pbGZzX2NsZWFyX2xvZ3MoJnNjaS0+c2Nfc2VnYnVmcyk7CiAKIAkJZXJyID0gbmlsZnNfc2VnY3Rvcl9leHRlbmRfc2VnbWVudHMoc2NpLCBuaWxmcywgbmFkZCk7CiAJCWlmICh1bmxpa2VseShlcnIpKQpAQCAtMTgxNCwyNiArMTc2MiwxOCBAQAogfQogCiBzdGF0aWMgaW50IG5pbGZzX3NlZ2N0b3Jfd3JpdGUoc3RydWN0IG5pbGZzX3NjX2luZm8gKnNjaSwKLQkJCSAgICAgICBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpKQorCQkJICAgICAgIHN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzKQogewogCXN0cnVjdCBuaWxmc19zZWdtZW50X2J1ZmZlciAqc2VnYnVmOwotCXN0cnVjdCBuaWxmc193cml0ZV9pbmZvIHdpOwotCWludCBlcnIsIHJlczsKLQotCXdpLnNiID0gc2NpLT5zY19zdXBlcjsKLQl3aS5iaF9zciA9IHNjaS0+c2Nfc3VwZXJfcm9vdDsKLQl3aS5iZGkgPSBiZGk7CisJaW50IHJldCA9IDA7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlZ2J1ZiwgJnNjaS0+c2Nfc2VnYnVmcywgc2JfbGlzdCkgewotCQluaWxmc19zZWdidWZfcHJlcGFyZV93cml0ZShzZWdidWYsICZ3aSk7Ci0JCWVyciA9IG5pbGZzX3NlZ2J1Zl93cml0ZShzZWdidWYsICZ3aSk7Ci0KLQkJcmVzID0gbmlsZnNfc2VnYnVmX3dhaXQoc2VnYnVmLCAmd2kpOwotCQllcnIgPSBlcnIgPyA6IHJlczsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7CisJCXJldCA9IG5pbGZzX3NlZ2J1Zl93cml0ZShzZWdidWYsIG5pbGZzKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOwogCX0KLQlyZXR1cm4gMDsKKwlsaXN0X3NwbGljZV90YWlsX2luaXQoJnNjaS0+c2Nfc2VnYnVmcywgJnNjaS0+c2Nfd3JpdGVfbG9ncyk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19uaWxmc19lbmRfcGFnZV9pbyhzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IGVycikKQEAgLTE5MTEsMTUgKzE4NTEsMTcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIG5pbGZzX3NlZ2N0b3JfYWJvcnRfd3JpdGUoc3RydWN0IG5pbGZzX3NjX2luZm8gKnNjaSwKLQkJCQkgICAgICBzdHJ1Y3QgcGFnZSAqZmFpbGVkX3BhZ2UsIGludCBlcnIpCitzdGF0aWMgdm9pZCBuaWxmc19hYm9ydF9sb2dzKHN0cnVjdCBsaXN0X2hlYWQgKmxvZ3MsIHN0cnVjdCBwYWdlICpmYWlsZWRfcGFnZSwKKwkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9zciwgaW50IGVycikKIHsKIAlzdHJ1Y3QgbmlsZnNfc2VnbWVudF9idWZmZXIgKnNlZ2J1ZjsKIAlzdHJ1Y3QgcGFnZSAqYmRfcGFnZSA9IE5VTEwsICpmc19wYWdlID0gTlVMTDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShzZWdidWYsICZzY2ktPnNjX3NlZ2J1ZnMsIHNiX2xpc3QpIHsKLQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpZiAobGlzdF9lbXB0eShsb2dzKSkKKwkJcmV0dXJuOwogCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZWdidWYsIGxvZ3MsIHNiX2xpc3QpIHsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShiaCwgJnNlZ2J1Zi0+c2Jfc2Vnc3VtX2J1ZmZlcnMsCiAJCQkJICAgIGJfYXNzb2NfYnVmZmVycykgewogCQkJaWYgKGJoLT5iX3BhZ2UgIT0gYmRfcGFnZSkgewpAQCAtMTkzMSw3ICsxODczLDcgQEAKIAogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJoLCAmc2VnYnVmLT5zYl9wYXlsb2FkX2J1ZmZlcnMsCiAJCQkJICAgIGJfYXNzb2NfYnVmZmVycykgewotCQkJaWYgKGJoID09IHNjaS0+c2Nfc3VwZXJfcm9vdCkgeworCQkJaWYgKGJoID09IGJoX3NyKSB7CiAJCQkJaWYgKGJoLT5iX3BhZ2UgIT0gYmRfcGFnZSkgewogCQkJCQllbmRfcGFnZV93cml0ZWJhY2soYmRfcGFnZSk7CiAJCQkJCWJkX3BhZ2UgPSBiaC0+Yl9wYWdlOwpAQCAtMTk0MSw3ICsxODgzLDcgQEAKIAkJCWlmIChiaC0+Yl9wYWdlICE9IGZzX3BhZ2UpIHsKIAkJCQluaWxmc19lbmRfcGFnZV9pbyhmc19wYWdlLCBlcnIpOwogCQkJCWlmIChmc19wYWdlICYmIGZzX3BhZ2UgPT0gZmFpbGVkX3BhZ2UpCi0JCQkJCWdvdG8gZG9uZTsKKwkJCQkJcmV0dXJuOwogCQkJCWZzX3BhZ2UgPSBiaC0+Yl9wYWdlOwogCQkJfQogCQl9CkBAIC0xOTUwLDggKzE4OTIsMzQgQEAKIAkJZW5kX3BhZ2Vfd3JpdGViYWNrKGJkX3BhZ2UpOwogCiAJbmlsZnNfZW5kX3BhZ2VfaW8oZnNfcGFnZSwgZXJyKTsKLSBkb25lOgorfQorCitzdGF0aWMgdm9pZCBuaWxmc19zZWdjdG9yX2Fib3J0X2NvbnN0cnVjdGlvbihzdHJ1Y3QgbmlsZnNfc2NfaW5mbyAqc2NpLAorCQkJCQkgICAgIHN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzLCBpbnQgZXJyKQoreworCUxJU1RfSEVBRChsb2dzKTsKKwlpbnQgcmV0OworCisJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZzY2ktPnNjX3dyaXRlX2xvZ3MsICZsb2dzKTsKKwlyZXQgPSBuaWxmc193YWl0X29uX2xvZ3MoJmxvZ3MpOworCWlmIChyZXQpCisJCW5pbGZzX2Fib3J0X2xvZ3MoJmxvZ3MsIE5VTEwsIHNjaS0+c2Nfc3VwZXJfcm9vdCwgcmV0KTsKKworCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmc2NpLT5zY19zZWdidWZzLCAmbG9ncyk7CisJbmlsZnNfY2FuY2VsX3NlZ3VzYWdlKCZsb2dzLCBuaWxmcy0+bnNfc3VmaWxlKTsKKwluaWxmc19mcmVlX2luY29tcGxldGVfbG9ncygmbG9ncywgbmlsZnMpOwogCW5pbGZzX2NsZWFyX2NvcGllZF9idWZmZXJzKCZzY2ktPnNjX2NvcGllZF9idWZmZXJzLCBlcnIpOworCisJaWYgKHNjaS0+c2Nfc3RhZ2UuZmxhZ3MgJiBOSUxGU19DRl9TVUZSRUVEKSB7CisJCXJldCA9IG5pbGZzX3N1ZmlsZV9jYW5jZWxfZnJlZXYobmlsZnMtPm5zX3N1ZmlsZSwKKwkJCQkJCXNjaS0+c2NfZnJlZXNlZ3MsCisJCQkJCQlzY2ktPnNjX25mcmVlc2VncywKKwkJCQkJCU5VTEwpOworCQlXQVJOX09OKHJldCk7IC8qIGRvIG5vdCBoYXBwZW4gKi8KKwl9CisKKwluaWxmc19kZXN0cm95X2xvZ3MoJmxvZ3MpOworCXNjaS0+c2Nfc3VwZXJfcm9vdCA9IE5VTEw7CiB9CiAKIHN0YXRpYyB2b2lkIG5pbGZzX3NldF9uZXh0X3NlZ21lbnQoc3RydWN0IHRoZV9uaWxmcyAqbmlsZnMsCkBAIC0xOTczLDcgKzE5NDEsNyBAQAogCXN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzID0gc2JpLT5zX25pbGZzOwogCWludCB1cGRhdGVfc3IgPSAoc2NpLT5zY19zdXBlcl9yb290ICE9IE5VTEwpOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShzZWdidWYsICZzY2ktPnNjX3NlZ2J1ZnMsIHNiX2xpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlZ2J1ZiwgJnNjaS0+c2Nfd3JpdGVfbG9ncywgc2JfbGlzdCkgewogCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoYmgsICZzZWdidWYtPnNiX3NlZ3N1bV9idWZmZXJzLApAQCAtMjA0Niw3ICsyMDE0LDcgQEAKIAogCXNjaS0+c2NfbmJsa19pbmMgKz0gc2NpLT5zY19uYmxrX3RoaXNfaW5jOwogCi0Jc2VnYnVmID0gTklMRlNfTEFTVF9TRUdCVUYoJnNjaS0+c2Nfc2VnYnVmcyk7CisJc2VnYnVmID0gTklMRlNfTEFTVF9TRUdCVUYoJnNjaS0+c2Nfd3JpdGVfbG9ncyk7CiAJbmlsZnNfc2V0X25leHRfc2VnbWVudChuaWxmcywgc2VnYnVmKTsKIAogCWlmICh1cGRhdGVfc3IpIHsKQEAgLTIwNTcsMTAgKzIwMjUsMjMgQEAKIAkJY2xlYXJfYml0KE5JTEZTX1NDX0hBVkVfREVMVEEsICZzY2ktPnNjX2ZsYWdzKTsKIAkJY2xlYXJfYml0KE5JTEZTX1NDX0RJUlRZLCAmc2NpLT5zY19mbGFncyk7CiAJCXNldF9iaXQoTklMRlNfU0NfU1VQRVJfUk9PVCwgJnNjaS0+c2NfZmxhZ3MpOworCQluaWxmc19zZWdjdG9yX2NsZWFyX21ldGFkYXRhX2RpcnR5KHNjaSk7CiAJfSBlbHNlCiAJCWNsZWFyX2JpdChOSUxGU19TQ19TVVBFUl9ST09ULCAmc2NpLT5zY19mbGFncyk7CiB9CiAKK3N0YXRpYyBpbnQgbmlsZnNfc2VnY3Rvcl93YWl0KHN0cnVjdCBuaWxmc19zY19pbmZvICpzY2kpCit7CisJaW50IHJldDsKKworCXJldCA9IG5pbGZzX3dhaXRfb25fbG9ncygmc2NpLT5zY193cml0ZV9sb2dzKTsKKwlpZiAoIXJldCkgeworCQluaWxmc19zZWdjdG9yX2NvbXBsZXRlX3dyaXRlKHNjaSk7CisJCW5pbGZzX2Rlc3Ryb3lfbG9ncygmc2NpLT5zY193cml0ZV9sb2dzKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBuaWxmc19zZWdjdG9yX2NoZWNrX2luX2ZpbGVzKHN0cnVjdCBuaWxmc19zY19pbmZvICpzY2ksCiAJCQkJCXN0cnVjdCBuaWxmc19zYl9pbmZvICpzYmkpCiB7CkBAIC0yMTczLDcgKzIxNTQsNyBAQAogCQkvKiBBdm9pZCBlbXB0eSBzZWdtZW50ICovCiAJCWlmIChzY2ktPnNjX3N0YWdlLnNjbnQgPT0gTklMRlNfU1RfRE9ORSAmJgogCQkgICAgTklMRlNfU0VHX0VNUFRZKCZzY2ktPnNjX2N1cnNlZy0+c2Jfc3VtKSkgewotCQkJbmlsZnNfc2VnY3Rvcl9lbmRfY29uc3RydWN0aW9uKHNjaSwgbmlsZnMsIDEpOworCQkJbmlsZnNfc2VnY3Rvcl9hYm9ydF9jb25zdHJ1Y3Rpb24oc2NpLCBuaWxmcywgMSk7CiAJCQlnb3RvIG91dDsKIAkJfQogCkBAIC0yMTg3LDcgKzIxNjgsNyBAQAogCQlpZiAoaGFzX3NyKSB7CiAJCQllcnIgPSBuaWxmc19zZWdjdG9yX2ZpbGxfaW5fY2hlY2twb2ludChzY2kpOwogCQkJaWYgKHVubGlrZWx5KGVycikpCi0JCQkJZ290byBmYWlsZWRfdG9fbWFrZV91cDsKKwkJCQlnb3RvIGZhaWxlZF90b193cml0ZTsKIAogCQkJbmlsZnNfc2VnY3Rvcl9maWxsX2luX3N1cGVyX3Jvb3Qoc2NpLCBuaWxmcyk7CiAJCX0KQEAgLTIxOTUsNDIgKzIxNzYsNDYgQEAKIAogCQkvKiBXcml0ZSBwYXJ0aWFsIHNlZ21lbnRzICovCiAJCWVyciA9IG5pbGZzX3NlZ2N0b3JfcHJlcGFyZV93cml0ZShzY2ksICZmYWlsZWRfcGFnZSk7Ci0JCWlmICh1bmxpa2VseShlcnIpKQorCQlpZiAoZXJyKSB7CisJCQluaWxmc19hYm9ydF9sb2dzKCZzY2ktPnNjX3NlZ2J1ZnMsIGZhaWxlZF9wYWdlLAorCQkJCQkgc2NpLT5zY19zdXBlcl9yb290LCBlcnIpOwogCQkJZ290byBmYWlsZWRfdG9fd3JpdGU7Ci0KKwkJfQogCQluaWxmc19zZWdjdG9yX2ZpbGxfaW5fY2hlY2tzdW1zKHNjaSwgbmlsZnMtPm5zX2NyY19zZWVkKTsKIAotCQllcnIgPSBuaWxmc19zZWdjdG9yX3dyaXRlKHNjaSwgbmlsZnMtPm5zX2JkaSk7CisJCWVyciA9IG5pbGZzX3NlZ2N0b3Jfd3JpdGUoc2NpLCBuaWxmcyk7CiAJCWlmICh1bmxpa2VseShlcnIpKQogCQkJZ290byBmYWlsZWRfdG9fd3JpdGU7CiAKLQkJbmlsZnNfc2VnY3Rvcl9jb21wbGV0ZV93cml0ZShzY2kpOwotCi0JCS8qIENvbW1pdCBzZWdtZW50cyAqLwotCQlpZiAoaGFzX3NyKQotCQkJbmlsZnNfc2VnY3Rvcl9jbGVhcl9tZXRhZGF0YV9kaXJ0eShzY2kpOwotCi0JCW5pbGZzX3NlZ2N0b3JfZW5kX2NvbnN0cnVjdGlvbihzY2ksIG5pbGZzLCAwKTsKLQorCQlpZiAoc2NpLT5zY19zdGFnZS5zY250ID09IE5JTEZTX1NUX0RPTkUgfHwKKwkJICAgIG5pbGZzLT5uc19ibG9ja3NpemVfYml0cyAhPSBQQUdFX0NBQ0hFX1NISUZUKSB7CisJCQkvKgorCQkJICogQXQgdGhpcyBwb2ludCwgd2UgYXZvaWQgZG91YmxlIGJ1ZmZlcmluZworCQkJICogZm9yIGJsb2Nrc2l6ZSA8IHBhZ2VzaXplIGJlY2F1c2UgcGFnZSBkaXJ0eQorCQkJICogZmxhZyBpcyB0dXJuZWQgb2ZmIGR1cmluZyB3cml0ZSBhbmQgZGlydHkKKwkJCSAqIGJ1ZmZlcnMgYXJlIG5vdCBwcm9wZXJseSBjb2xsZWN0ZWQgZm9yCisJCQkgKiBwYWdlcyBjcm9zc2luZyBvdmVyIHNlZ21lbnRzLgorCQkJICovCisJCQllcnIgPSBuaWxmc19zZWdjdG9yX3dhaXQoc2NpKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBmYWlsZWRfdG9fd3JpdGU7CisJCX0KIAl9IHdoaWxlIChzY2ktPnNjX3N0YWdlLnNjbnQgIT0gTklMRlNfU1RfRE9ORSk7CiAKKwlzY2ktPnNjX3N1cGVyX3Jvb3QgPSBOVUxMOworCiAgb3V0OgotCW5pbGZzX3NlZ2N0b3JfZGVzdHJveV9zZWdtZW50X2J1ZmZlcnMoc2NpKTsKIAluaWxmc19zZWdjdG9yX2NoZWNrX291dF9maWxlcyhzY2ksIHNiaSk7CiAJcmV0dXJuIGVycjsKIAogIGZhaWxlZF90b193cml0ZToKLQluaWxmc19zZWdjdG9yX2Fib3J0X3dyaXRlKHNjaSwgZmFpbGVkX3BhZ2UsIGVycik7Ci0JbmlsZnNfc2VnY3Rvcl9jYW5jZWxfc2VndXNhZ2Uoc2NpLCBuaWxmcy0+bnNfc3VmaWxlKTsKLQotIGZhaWxlZF90b19tYWtlX3VwOgogCWlmIChzY2ktPnNjX3N0YWdlLmZsYWdzICYgTklMRlNfQ0ZfSUZJTEVfU1RBUlRFRCkKIAkJbmlsZnNfcmVkaXJ0eV9pbm9kZXMoJnNjaS0+c2NfZGlydHlfZmlsZXMpOwogCiAgZmFpbGVkOgogCWlmIChuaWxmc19kb2luZ19nYygpKQogCQluaWxmc19yZWRpcnR5X2lub2Rlcygmc2NpLT5zY19nY19pbm9kZXMpOwotCW5pbGZzX3NlZ2N0b3JfZW5kX2NvbnN0cnVjdGlvbihzY2ksIG5pbGZzLCBlcnIpOworCW5pbGZzX3NlZ2N0b3JfYWJvcnRfY29uc3RydWN0aW9uKHNjaSwgbmlsZnMsIGVycik7CiAJZ290byBvdXQ7CiB9CiAKQEAgLTI1NTksNyArMjU0NCw3IEBACiAKIAlzY2ktPnNjX2ZyZWVzZWdzID0ga2J1ZnNbNF07CiAJc2NpLT5zY19uZnJlZXNlZ3MgPSBhcmd2WzRdLnZfbm1lbWJzOwotCWxpc3Rfc3BsaWNlX2luaXQoJm5pbGZzLT5uc19nY19pbm9kZXMsIHNjaS0+c2NfZ2NfaW5vZGVzLnByZXYpOworCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmbmlsZnMtPm5zX2djX2lub2RlcywgJnNjaS0+c2NfZ2NfaW5vZGVzKTsKIAogCWZvciAoOzspIHsKIAkJbmlsZnNfc2VnY3Rvcl9hY2NlcHQoc2NpLCAmcmVxKTsKQEAgLTI3ODgsNiArMjc3Myw3IEBACiAJc3Bpbl9sb2NrX2luaXQoJnNjaS0+c2Nfc3RhdGVfbG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJnNjaS0+c2NfZGlydHlfZmlsZXMpOwogCUlOSVRfTElTVF9IRUFEKCZzY2ktPnNjX3NlZ2J1ZnMpOworCUlOSVRfTElTVF9IRUFEKCZzY2ktPnNjX3dyaXRlX2xvZ3MpOwogCUlOSVRfTElTVF9IRUFEKCZzY2ktPnNjX2djX2lub2Rlcyk7CiAJSU5JVF9MSVNUX0hFQUQoJnNjaS0+c2NfY29waWVkX2J1ZmZlcnMpOwogCkBAIC0yODU1LDYgKzI4NDEsNyBAQAogCX0KIAogCVdBUk5fT04oIWxpc3RfZW1wdHkoJnNjaS0+c2Nfc2VnYnVmcykpOworCVdBUk5fT04oIWxpc3RfZW1wdHkoJnNjaS0+c2Nfd3JpdGVfbG9ncykpOwogCiAJZG93bl93cml0ZSgmc2JpLT5zX25pbGZzLT5uc19zZWdjdG9yX3NlbSk7CiAKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9zZWdtZW50LmggYi9mcy9uaWxmczIvc2VnbWVudC5oCmluZGV4IDBkMmE0NzUuLjNkM2FiMmYgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9zZWdtZW50LmgKKysrIGIvZnMvbmlsZnMyL3NlZ21lbnQuaApAQCAtOTcsNiArOTcsNyBAQAogICogQHNjX2RzeW5jX3N0YXJ0OiBzdGFydCBieXRlIG9mZnNldCBvZiBkYXRhIHBhZ2VzCiAgKiBAc2NfZHN5bmNfZW5kOiBlbmQgYnl0ZSBvZmZzZXQgb2YgZGF0YSBwYWdlcyAoaW5jbHVzaXZlKQogICogQHNjX3NlZ2J1ZnM6IExpc3Qgb2Ygc2VnbWVudCBidWZmZXJzCisgKiBAc2Nfd3JpdGVfbG9nczogTGlzdCBvZiBzZWdtZW50IGJ1ZmZlcnMgdG8gaG9sZCBsb2dzIHVuZGVyIHdyaXRpbmcKICAqIEBzY19zZWdidWZfbmJsb2NrczogTnVtYmVyIG9mIGF2YWlsYWJsZSBibG9ja3MgaW4gc2VnbWVudCBidWZmZXJzLgogICogQHNjX2N1cnNlZzogQ3VycmVudCBzZWdtZW50IGJ1ZmZlcgogICogQHNjX3N1cGVyX3Jvb3Q6IFBvaW50ZXIgdG8gdGhlIHN1cGVyIHJvb3QgYnVmZmVyCkBAIC0xNDMsNiArMTQ0LDcgQEAKIAogCS8qIFNlZ21lbnQgYnVmZmVycyAqLwogCXN0cnVjdCBsaXN0X2hlYWQJc2Nfc2VnYnVmczsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXNjX3dyaXRlX2xvZ3M7CiAJdW5zaWduZWQgbG9uZwkJc2Nfc2VnYnVmX25ibG9ja3M7CiAJc3RydWN0IG5pbGZzX3NlZ21lbnRfYnVmZmVyICpzY19jdXJzZWc7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICAgICAqc2Nfc3VwZXJfcm9vdDsKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9zdWZpbGUuYyBiL2ZzL25pbGZzMi9zdWZpbGUuYwppbmRleCAzNzk5NGQ0Li5iNmMzNmQwIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvc3VmaWxlLmMKKysrIGIvZnMvbmlsZnMyL3N1ZmlsZS5jCkBAIC0zMSw2ICszMSwxNiBAQAogI2luY2x1ZGUgInN1ZmlsZS5oIgogCiAKK3N0cnVjdCBuaWxmc19zdWZpbGVfaW5mbyB7CisJc3RydWN0IG5pbGZzX21kdF9pbmZvIG1pOworCXVuc2lnbmVkIGxvbmcgbmNsZWFuc2VnczsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5pbGZzX3N1ZmlsZV9pbmZvICpOSUxGU19TVUkoc3RydWN0IGlub2RlICpzdWZpbGUpCit7CisJcmV0dXJuIChzdHJ1Y3QgbmlsZnNfc3VmaWxlX2luZm8gKilOSUxGU19NRFQoc3VmaWxlKTsKK30KKwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCiBuaWxmc19zdWZpbGVfc2VnbWVudF91c2FnZXNfcGVyX2Jsb2NrKGNvbnN0IHN0cnVjdCBpbm9kZSAqc3VmaWxlKQogewpAQCAtNjIsMTQgKzcyLDYgQEAKIAkJICAgICBtYXggLSBjdXJyICsgMSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IG5pbGZzX3N1ZmlsZV9oZWFkZXIgKgotbmlsZnNfc3VmaWxlX2Jsb2NrX2dldF9oZWFkZXIoY29uc3Qgc3RydWN0IGlub2RlICpzdWZpbGUsCi0JCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAotCQkJICAgICAgdm9pZCAqa2FkZHIpCi17Ci0JcmV0dXJuIGthZGRyICsgYmhfb2Zmc2V0KGJoKTsKLX0KLQogc3RhdGljIHN0cnVjdCBuaWxmc19zZWdtZW50X3VzYWdlICoKIG5pbGZzX3N1ZmlsZV9ibG9ja19nZXRfc2VnbWVudF91c2FnZShjb25zdCBzdHJ1Y3QgaW5vZGUgKnN1ZmlsZSwgX191NjQgc2VnbnVtLAogCQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgdm9pZCAqa2FkZHIpCkBAIC0xMTAsNiArMTEyLDE1IEBACiB9CiAKIC8qKgorICogbmlsZnNfc3VmaWxlX2dldF9uY2xlYW5zZWdzIC0gcmV0dXJuIHRoZSBudW1iZXIgb2YgY2xlYW4gc2VnbWVudHMKKyAqIEBzdWZpbGU6IGlub2RlIG9mIHNlZ21lbnQgdXNhZ2UgZmlsZQorICovCit1bnNpZ25lZCBsb25nIG5pbGZzX3N1ZmlsZV9nZXRfbmNsZWFuc2VncyhzdHJ1Y3QgaW5vZGUgKnN1ZmlsZSkKK3sKKwlyZXR1cm4gTklMRlNfU1VJKHN1ZmlsZSktPm5jbGVhbnNlZ3M7Cit9CisKKy8qKgogICogbmlsZnNfc3VmaWxlX3VwZGF0ZXYgLSBtb2RpZnkgbXVsdGlwbGUgc2VnbWVudCB1c2FnZXMgYXQgYSB0aW1lCiAgKiBAc3VmaWxlOiBpbm9kZSBvZiBzZWdtZW50IHVzYWdlIGZpbGUKICAqIEBzZWdudW12OiBhcnJheSBvZiBzZWdtZW50IG51bWJlcnMKQEAgLTI3MCw3ICsyODEsNyBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dF9zZW07CiAJa2FkZHIgPSBrbWFwX2F0b21pYyhoZWFkZXJfYmgtPmJfcGFnZSwgS01fVVNFUjApOwotCWhlYWRlciA9IG5pbGZzX3N1ZmlsZV9ibG9ja19nZXRfaGVhZGVyKHN1ZmlsZSwgaGVhZGVyX2JoLCBrYWRkcik7CisJaGVhZGVyID0ga2FkZHIgKyBiaF9vZmZzZXQoaGVhZGVyX2JoKTsKIAluY2xlYW5zZWdzID0gbGU2NF90b19jcHUoaGVhZGVyLT5zaF9uY2xlYW5zZWdzKTsKIAlsYXN0X2FsbG9jID0gbGU2NF90b19jcHUoaGVhZGVyLT5zaF9sYXN0X2FsbG9jKTsKIAlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CkBAIC0zMDIsMTMgKzMxMywxMyBAQAogCQkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOwogCiAJCQlrYWRkciA9IGttYXBfYXRvbWljKGhlYWRlcl9iaC0+Yl9wYWdlLCBLTV9VU0VSMCk7Ci0JCQloZWFkZXIgPSBuaWxmc19zdWZpbGVfYmxvY2tfZ2V0X2hlYWRlcigKLQkJCQlzdWZpbGUsIGhlYWRlcl9iaCwga2FkZHIpOworCQkJaGVhZGVyID0ga2FkZHIgKyBiaF9vZmZzZXQoaGVhZGVyX2JoKTsKIAkJCWxlNjRfYWRkX2NwdSgmaGVhZGVyLT5zaF9uY2xlYW5zZWdzLCAtMSk7CiAJCQlsZTY0X2FkZF9jcHUoJmhlYWRlci0+c2hfbmRpcnR5c2VncywgMSk7CiAJCQloZWFkZXItPnNoX2xhc3RfYWxsb2MgPSBjcHVfdG9fbGU2NChzZWdudW0pOwogCQkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOwogCisJCQlOSUxGU19TVUkoc3VmaWxlKS0+bmNsZWFuc2Vncy0tOwogCQkJbmlsZnNfbWR0X21hcmtfYnVmZmVyX2RpcnR5KGhlYWRlcl9iaCk7CiAJCQluaWxmc19tZHRfbWFya19idWZmZXJfZGlydHkoc3VfYmgpOwogCQkJbmlsZnNfbWR0X21hcmtfZGlydHkoc3VmaWxlKTsKQEAgLTM1MSw2ICszNjIsOCBAQAogCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKIAogCW5pbGZzX3N1ZmlsZV9tb2RfY291bnRlcihoZWFkZXJfYmgsIC0xLCAxKTsKKwlOSUxGU19TVUkoc3VmaWxlKS0+bmNsZWFuc2Vncy0tOworCiAJbmlsZnNfbWR0X21hcmtfYnVmZmVyX2RpcnR5KHN1X2JoKTsKIAluaWxmc19tZHRfbWFya19kaXJ0eShzdWZpbGUpOwogfQpAQCAtMzgwLDYgKzM5Myw4IEBACiAJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOwogCiAJbmlsZnNfc3VmaWxlX21vZF9jb3VudGVyKGhlYWRlcl9iaCwgY2xlYW4gPyAodTY0KS0xIDogMCwgZGlydHkgPyAwIDogMSk7CisJTklMRlNfU1VJKHN1ZmlsZSktPm5jbGVhbnNlZ3MgLT0gY2xlYW47CisKIAluaWxmc19tZHRfbWFya19idWZmZXJfZGlydHkoc3VfYmgpOwogCW5pbGZzX21kdF9tYXJrX2RpcnR5KHN1ZmlsZSk7CiB9CkBAIC00MDksNTggKzQyNCw2MSBAQAogCW5pbGZzX21kdF9tYXJrX2J1ZmZlcl9kaXJ0eShzdV9iaCk7CiAKIAluaWxmc19zdWZpbGVfbW9kX2NvdW50ZXIoaGVhZGVyX2JoLCAxLCBzdWRpcnR5ID8gKHU2NCktMSA6IDApOworCU5JTEZTX1NVSShzdWZpbGUpLT5uY2xlYW5zZWdzKys7CisKIAluaWxmc19tZHRfbWFya19kaXJ0eShzdWZpbGUpOwogfQogCiAvKioKLSAqIG5pbGZzX3N1ZmlsZV9nZXRfc2VnbWVudF91c2FnZSAtIGdldCBhIHNlZ21lbnQgdXNhZ2UKKyAqIG5pbGZzX3N1ZmlsZV9tYXJrX2RpcnR5IC0gbWFyayB0aGUgYnVmZmVyIGhhdmluZyBhIHNlZ21lbnQgdXNhZ2UgZGlydHkKICAqIEBzdWZpbGU6IGlub2RlIG9mIHNlZ21lbnQgdXNhZ2UgZmlsZQogICogQHNlZ251bTogc2VnbWVudCBudW1iZXIKLSAqIEBzdXA6IHBvaW50ZXIgdG8gc2VnbWVudCB1c2FnZQotICogQGJocDogcG9pbnRlciB0byBidWZmZXIgaGVhZAotICoKLSAqIERlc2NyaXB0aW9uOiBuaWxmc19zdWZpbGVfZ2V0X3NlZ21lbnRfdXNhZ2UoKSBhY3F1aXJlcyB0aGUgc2VnbWVudCB1c2FnZQotICogc3BlY2lmaWVkIGJ5IEBzZWdudW0uCi0gKgotICogUmV0dXJuIFZhbHVlOiBPbiBzdWNjZXNzLCAwIGlzIHJldHVybmVkLCBhbmQgdGhlIHNlZ21lbnQgdXNhZ2UgYW5kIHRoZQotICogYnVmZmVyIGhlYWQgb2YgdGhlIGJ1ZmZlciBvbiB3aGljaCB0aGUgc2VnbWVudCB1c2FnZSBpcyBsb2NhdGVkIGFyZSBzdG9yZWQKLSAqIGluIHRoZSBwbGFjZSBwb2ludGVkIGJ5IEBzdXAgYW5kIEBiaHAsIHJlc3BlY3RpdmVseS4gT24gZXJyb3IsIG9uZSBvZiB0aGUKLSAqIGZvbGxvd2luZyBuZWdhdGl2ZSBlcnJvciBjb2RlcyBpcyByZXR1cm5lZC4KLSAqCi0gKiAlLUVJTyAtIEkvTyBlcnJvci4KLSAqCi0gKiAlLUVOT01FTSAtIEluc3VmZmljaWVudCBhbW91bnQgb2YgbWVtb3J5IGF2YWlsYWJsZS4KLSAqCi0gKiAlLUVJTlZBTCAtIEludmFsaWQgc2VnbWVudCB1c2FnZSBudW1iZXIuCiAgKi8KLWludCBuaWxmc19zdWZpbGVfZ2V0X3NlZ21lbnRfdXNhZ2Uoc3RydWN0IGlub2RlICpzdWZpbGUsIF9fdTY0IHNlZ251bSwKLQkJCQkgICBzdHJ1Y3QgbmlsZnNfc2VnbWVudF91c2FnZSAqKnN1cCwKLQkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHApCitpbnQgbmlsZnNfc3VmaWxlX21hcmtfZGlydHkoc3RydWN0IGlub2RlICpzdWZpbGUsIF9fdTY0IHNlZ251bSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCByZXQ7CisKKwlyZXQgPSBuaWxmc19zdWZpbGVfZ2V0X3NlZ21lbnRfdXNhZ2VfYmxvY2soc3VmaWxlLCBzZWdudW0sIDAsICZiaCk7CisJaWYgKCFyZXQpIHsKKwkJbmlsZnNfbWR0X21hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJbmlsZnNfbWR0X21hcmtfZGlydHkoc3VmaWxlKTsKKwkJYnJlbHNlKGJoKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBuaWxmc19zdWZpbGVfc2V0X3NlZ21lbnRfdXNhZ2UgLSBzZXQgdXNhZ2Ugb2YgYSBzZWdtZW50CisgKiBAc3VmaWxlOiBpbm9kZSBvZiBzZWdtZW50IHVzYWdlIGZpbGUKKyAqIEBzZWdudW06IHNlZ21lbnQgbnVtYmVyCisgKiBAbmJsb2NrczogbnVtYmVyIG9mIGxpdmUgYmxvY2tzIGluIHRoZSBzZWdtZW50CisgKiBAbW9kdGltZTogbW9kaWZpY2F0aW9uIHRpbWUgKG9wdGlvbikKKyAqLworaW50IG5pbGZzX3N1ZmlsZV9zZXRfc2VnbWVudF91c2FnZShzdHJ1Y3QgaW5vZGUgKnN1ZmlsZSwgX191NjQgc2VnbnVtLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgbmJsb2NrcywgdGltZV90IG1vZHRpbWUpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAlzdHJ1Y3QgbmlsZnNfc2VnbWVudF91c2FnZSAqc3U7CiAJdm9pZCAqa2FkZHI7CiAJaW50IHJldDsKIAotCS8qIHNlZ251bSBpcyAwIG9yaWdpbiAqLwotCWlmIChzZWdudW0gPj0gbmlsZnNfc3VmaWxlX2dldF9uc2VnbWVudHMoc3VmaWxlKSkKLQkJcmV0dXJuIC1FSU5WQUw7CiAJZG93bl93cml0ZSgmTklMRlNfTURUKHN1ZmlsZSktPm1pX3NlbSk7Ci0JcmV0ID0gbmlsZnNfc3VmaWxlX2dldF9zZWdtZW50X3VzYWdlX2Jsb2NrKHN1ZmlsZSwgc2VnbnVtLCAxLCAmYmgpOworCXJldCA9IG5pbGZzX3N1ZmlsZV9nZXRfc2VnbWVudF91c2FnZV9ibG9jayhzdWZpbGUsIHNlZ251bSwgMCwgJmJoKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXRfc2VtOwotCWthZGRyID0ga21hcChiaC0+Yl9wYWdlKTsKLQlzdSA9IG5pbGZzX3N1ZmlsZV9ibG9ja19nZXRfc2VnbWVudF91c2FnZShzdWZpbGUsIHNlZ251bSwgYmgsIGthZGRyKTsKLQlpZiAobmlsZnNfc2VnbWVudF91c2FnZV9lcnJvcihzdSkpIHsKLQkJa3VubWFwKGJoLT5iX3BhZ2UpOwotCQlicmVsc2UoYmgpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dF9zZW07Ci0JfQogCi0JaWYgKHN1cCAhPSBOVUxMKQotCQkqc3VwID0gc3U7Ci0JKmJocCA9IGJoOworCWthZGRyID0ga21hcF9hdG9taWMoYmgtPmJfcGFnZSwgS01fVVNFUjApOworCXN1ID0gbmlsZnNfc3VmaWxlX2Jsb2NrX2dldF9zZWdtZW50X3VzYWdlKHN1ZmlsZSwgc2VnbnVtLCBiaCwga2FkZHIpOworCVdBUk5fT04obmlsZnNfc2VnbWVudF91c2FnZV9lcnJvcihzdSkpOworCWlmIChtb2R0aW1lKQorCQlzdS0+c3VfbGFzdG1vZCA9IGNwdV90b19sZTY0KG1vZHRpbWUpOworCXN1LT5zdV9uYmxvY2tzID0gY3B1X3RvX2xlMzIobmJsb2Nrcyk7CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCisJbmlsZnNfbWR0X21hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwluaWxmc19tZHRfbWFya19kaXJ0eShzdWZpbGUpOworCWJyZWxzZShiaCk7CiAKICBvdXRfc2VtOgogCXVwX3dyaXRlKCZOSUxGU19NRFQoc3VmaWxlKS0+bWlfc2VtKTsKQEAgLTQ2OCwyMyArNDg2LDYgQEAKIH0KIAogLyoqCi0gKiBuaWxmc19zdWZpbGVfcHV0X3NlZ21lbnRfdXNhZ2UgLSBwdXQgYSBzZWdtZW50IHVzYWdlCi0gKiBAc3VmaWxlOiBpbm9kZSBvZiBzZWdtZW50IHVzYWdlIGZpbGUKLSAqIEBzZWdudW06IHNlZ21lbnQgbnVtYmVyCi0gKiBAYmg6IGJ1ZmZlciBoZWFkCi0gKgotICogRGVzY3JpcHRpb246IG5pbGZzX3N1ZmlsZV9wdXRfc2VnbWVudF91c2FnZSgpIHJlbGVhc2VzIHRoZSBzZWdtZW50IHVzYWdlCi0gKiBzcGVjaWZpZWQgYnkgQHNlZ251bS4gQGJoIG11c3QgYmUgdGhlIGJ1ZmZlciBoZWFkIHdoaWNoIGhhdmUgYmVlbiByZXR1cm5lZAotICogYnkgYSBwcmV2aW91cyBjYWxsIHRvIG5pbGZzX3N1ZmlsZV9nZXRfc2VnbWVudF91c2FnZSgpIHdpdGggQHNlZ251bS4KLSAqLwotdm9pZCBuaWxmc19zdWZpbGVfcHV0X3NlZ21lbnRfdXNhZ2Uoc3RydWN0IGlub2RlICpzdWZpbGUsIF9fdTY0IHNlZ251bSwKLQkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKLXsKLQlrdW5tYXAoYmgtPmJfcGFnZSk7Ci0JYnJlbHNlKGJoKTsKLX0KLQotLyoqCiAgKiBuaWxmc19zdWZpbGVfZ2V0X3N0YXQgLSBnZXQgc2VnbWVudCB1c2FnZSBzdGF0aXN0aWNzCiAgKiBAc3VmaWxlOiBpbm9kZSBvZiBzZWdtZW50IHVzYWdlIGZpbGUKICAqIEBzdGF0OiBwb2ludGVyIHRvIGEgc3RydWN0dXJlIG9mIHNlZ21lbnQgdXNhZ2Ugc3RhdGlzdGljcwpAQCAtNTE1LDcgKzUxNiw3IEBACiAJCWdvdG8gb3V0X3NlbTsKIAogCWthZGRyID0ga21hcF9hdG9taWMoaGVhZGVyX2JoLT5iX3BhZ2UsIEtNX1VTRVIwKTsKLQloZWFkZXIgPSBuaWxmc19zdWZpbGVfYmxvY2tfZ2V0X2hlYWRlcihzdWZpbGUsIGhlYWRlcl9iaCwga2FkZHIpOworCWhlYWRlciA9IGthZGRyICsgYmhfb2Zmc2V0KGhlYWRlcl9iaCk7CiAJc3VzdGF0LT5zc19uc2VncyA9IG5pbGZzX3N1ZmlsZV9nZXRfbnNlZ21lbnRzKHN1ZmlsZSk7CiAJc3VzdGF0LT5zc19uY2xlYW5zZWdzID0gbGU2NF90b19jcHUoaGVhZGVyLT5zaF9uY2xlYW5zZWdzKTsKIAlzdXN0YXQtPnNzX25kaXJ0eXNlZ3MgPSBsZTY0X3RvX2NwdShoZWFkZXItPnNoX25kaXJ0eXNlZ3MpOwpAQCAtNTMyLDMzICs1MzMsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qKgotICogbmlsZnNfc3VmaWxlX2dldF9uY2xlYW5zZWdzIC0gZ2V0IHRoZSBudW1iZXIgb2YgY2xlYW4gc2VnbWVudHMKLSAqIEBzdWZpbGU6IGlub2RlIG9mIHNlZ21lbnQgdXNhZ2UgZmlsZQotICogQG5zZWdzcDogcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGNsZWFuIHNlZ21lbnRzCi0gKgotICogRGVzY3JpcHRpb246IG5pbGZzX3N1ZmlsZV9nZXRfbmNsZWFuc2VncygpIGFjcXVpcmVzIHRoZSBudW1iZXIgb2YgY2xlYW4KLSAqIHNlZ21lbnRzLgotICoKLSAqIFJldHVybiBWYWx1ZTogT24gc3VjY2VzcywgMCBpcyByZXR1cm5lZCBhbmQgdGhlIG51bWJlciBvZiBjbGVhbiBzZWdtZW50cyBpcwotICogc3RvcmVkIGluIHRoZSBwbGFjZSBwb2ludGVkIGJ5IEBuc2Vnc3AuIE9uIGVycm9yLCBvbmUgb2YgdGhlIGZvbGxvd2luZwotICogbmVnYXRpdmUgZXJyb3IgY29kZXMgaXMgcmV0dXJuZWQuCi0gKgotICogJS1FSU8gLSBJL08gZXJyb3IuCi0gKgotICogJS1FTk9NRU0gLSBJbnN1ZmZpY2llbnQgYW1vdW50IG9mIG1lbW9yeSBhdmFpbGFibGUuCi0gKi8KLWludCBuaWxmc19zdWZpbGVfZ2V0X25jbGVhbnNlZ3Moc3RydWN0IGlub2RlICpzdWZpbGUsIHVuc2lnbmVkIGxvbmcgKm5zZWdzcCkKLXsKLQlzdHJ1Y3QgbmlsZnNfc3VzdGF0IHN1c3RhdDsKLQlpbnQgcmV0OwotCi0JcmV0ID0gbmlsZnNfc3VmaWxlX2dldF9zdGF0KHN1ZmlsZSwgJnN1c3RhdCk7Ci0JaWYgKHJldCA9PSAwKQotCQkqbnNlZ3NwID0gc3VzdGF0LnNzX25jbGVhbnNlZ3M7Ci0JcmV0dXJuIHJldDsKLX0KLQogdm9pZCBuaWxmc19zdWZpbGVfZG9fc2V0X2Vycm9yKHN0cnVjdCBpbm9kZSAqc3VmaWxlLCBfX3U2NCBzZWdudW0sCiAJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkZXJfYmgsCiAJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpzdV9iaCkKQEAgLTU3Nyw4ICs1NTEsMTAgQEAKIAluaWxmc19zZWdtZW50X3VzYWdlX3NldF9lcnJvcihzdSk7CiAJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOwogCi0JaWYgKHN1Y2xlYW4pCisJaWYgKHN1Y2xlYW4pIHsKIAkJbmlsZnNfc3VmaWxlX21vZF9jb3VudGVyKGhlYWRlcl9iaCwgLTEsIDApOworCQlOSUxGU19TVUkoc3VmaWxlKS0+bmNsZWFuc2Vncy0tOworCX0KIAluaWxmc19tZHRfbWFya19idWZmZXJfZGlydHkoc3VfYmgpOwogCW5pbGZzX21kdF9tYXJrX2RpcnR5KHN1ZmlsZSk7CiB9CkBAIC02NTcsMyArNjMzLDQ4IEBACiAJdXBfcmVhZCgmTklMRlNfTURUKHN1ZmlsZSktPm1pX3NlbSk7CiAJcmV0dXJuIHJldDsKIH0KKworLyoqCisgKiBuaWxmc19zdWZpbGVfcmVhZCAtIHJlYWQgc3VmaWxlIGlub2RlCisgKiBAc3VmaWxlOiBzdWZpbGUgaW5vZGUKKyAqIEByYXdfaW5vZGU6IG9uLWRpc2sgc3VmaWxlIGlub2RlCisgKi8KK2ludCBuaWxmc19zdWZpbGVfcmVhZChzdHJ1Y3QgaW5vZGUgKnN1ZmlsZSwgc3RydWN0IG5pbGZzX2lub2RlICpyYXdfaW5vZGUpCit7CisJc3RydWN0IG5pbGZzX3N1ZmlsZV9pbmZvICpzdWkgPSBOSUxGU19TVUkoc3VmaWxlKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWRlcl9iaDsKKwlzdHJ1Y3QgbmlsZnNfc3VmaWxlX2hlYWRlciAqaGVhZGVyOworCXZvaWQgKmthZGRyOworCWludCByZXQ7CisKKwlyZXQgPSBuaWxmc19yZWFkX2lub2RlX2NvbW1vbihzdWZpbGUsIHJhd19pbm9kZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBuaWxmc19zdWZpbGVfZ2V0X2hlYWRlcl9ibG9jayhzdWZpbGUsICZoZWFkZXJfYmgpOworCWlmICghcmV0KSB7CisJCWthZGRyID0ga21hcF9hdG9taWMoaGVhZGVyX2JoLT5iX3BhZ2UsIEtNX1VTRVIwKTsKKwkJaGVhZGVyID0ga2FkZHIgKyBiaF9vZmZzZXQoaGVhZGVyX2JoKTsKKwkJc3VpLT5uY2xlYW5zZWdzID0gbGU2NF90b19jcHUoaGVhZGVyLT5zaF9uY2xlYW5zZWdzKTsKKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQlicmVsc2UoaGVhZGVyX2JoKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBuaWxmc19zdWZpbGVfbmV3IC0gY3JlYXRlIHN1ZmlsZQorICogQG5pbGZzOiBuaWxmcyBvYmplY3QKKyAqIEBzdXNpemU6IHNpemUgb2YgYSBzZWdtZW50IHVzYWdlIGVudHJ5CisgKi8KK3N0cnVjdCBpbm9kZSAqbmlsZnNfc3VmaWxlX25ldyhzdHJ1Y3QgdGhlX25pbGZzICpuaWxmcywgc2l6ZV90IHN1c2l6ZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKnN1ZmlsZTsKKworCXN1ZmlsZSA9IG5pbGZzX21kdF9uZXcobmlsZnMsIE5VTEwsIE5JTEZTX1NVRklMRV9JTk8sCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBuaWxmc19zdWZpbGVfaW5mbykpOworCWlmIChzdWZpbGUpCisJCW5pbGZzX21kdF9zZXRfZW50cnlfc2l6ZShzdWZpbGUsIHN1c2l6ZSwKKwkJCQkJIHNpemVvZihzdHJ1Y3QgbmlsZnNfc3VmaWxlX2hlYWRlcikpOworCXJldHVybiBzdWZpbGU7Cit9CmRpZmYgLS1naXQgYS9mcy9uaWxmczIvc3VmaWxlLmggYi9mcy9uaWxmczIvc3VmaWxlLmgKaW5kZXggMGU5OWU1Yy4uMTUxNjNiOCAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL3N1ZmlsZS5oCisrKyBiL2ZzL25pbGZzMi9zdWZpbGUuaApAQCAtMzQsMTQgKzM0LDEzIEBACiAJcmV0dXJuIE5JTEZTX01EVChzdWZpbGUpLT5taV9uaWxmcy0+bnNfbnNlZ21lbnRzOwogfQogCit1bnNpZ25lZCBsb25nIG5pbGZzX3N1ZmlsZV9nZXRfbmNsZWFuc2VncyhzdHJ1Y3QgaW5vZGUgKnN1ZmlsZSk7CisKIGludCBuaWxmc19zdWZpbGVfYWxsb2Moc3RydWN0IGlub2RlICosIF9fdTY0ICopOwotaW50IG5pbGZzX3N1ZmlsZV9nZXRfc2VnbWVudF91c2FnZShzdHJ1Y3QgaW5vZGUgKiwgX191NjQsCi0JCQkJICAgc3RydWN0IG5pbGZzX3NlZ21lbnRfdXNhZ2UgKiosCi0JCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqKTsKLXZvaWQgbmlsZnNfc3VmaWxlX3B1dF9zZWdtZW50X3VzYWdlKHN0cnVjdCBpbm9kZSAqLCBfX3U2NCwKLQkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICopOworaW50IG5pbGZzX3N1ZmlsZV9tYXJrX2RpcnR5KHN0cnVjdCBpbm9kZSAqc3VmaWxlLCBfX3U2NCBzZWdudW0pOworaW50IG5pbGZzX3N1ZmlsZV9zZXRfc2VnbWVudF91c2FnZShzdHJ1Y3QgaW5vZGUgKnN1ZmlsZSwgX191NjQgc2VnbnVtLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgbmJsb2NrcywgdGltZV90IG1vZHRpbWUpOwogaW50IG5pbGZzX3N1ZmlsZV9nZXRfc3RhdChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IG5pbGZzX3N1c3RhdCAqKTsKLWludCBuaWxmc19zdWZpbGVfZ2V0X25jbGVhbnNlZ3Moc3RydWN0IGlub2RlICosIHVuc2lnbmVkIGxvbmcgKik7CiBzc2l6ZV90IG5pbGZzX3N1ZmlsZV9nZXRfc3VpbmZvKHN0cnVjdCBpbm9kZSAqLCBfX3U2NCwgdm9pZCAqLCB1bnNpZ25lZCwKIAkJCQlzaXplX3QpOwogCkBAIC02Miw2ICs2MSw5IEBACiB2b2lkIG5pbGZzX3N1ZmlsZV9kb19zZXRfZXJyb3Ioc3RydWN0IGlub2RlICosIF9fdTY0LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwKIAkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKik7CiAKK2ludCBuaWxmc19zdWZpbGVfcmVhZChzdHJ1Y3QgaW5vZGUgKnN1ZmlsZSwgc3RydWN0IG5pbGZzX2lub2RlICpyYXdfaW5vZGUpOworc3RydWN0IGlub2RlICpuaWxmc19zdWZpbGVfbmV3KHN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzLCBzaXplX3Qgc3VzaXplKTsKKwogLyoqCiAgKiBuaWxmc19zdWZpbGVfc2NyYXAgLSBtYWtlIGEgc2VnbWVudCBnYXJiYWdlCiAgKiBAc3VmaWxlOiBpbm9kZSBvZiBzZWdtZW50IHVzYWdlIGZpbGUKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9zdXBlci5jIGIvZnMvbmlsZnMyL3N1cGVyLmMKaW5kZXggNjQ0ZTY2Ny4uNTQwM2IzZSAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL3N1cGVyLmMKKysrIGIvZnMvbmlsZnMyL3N1cGVyLmMKQEAgLTM2MywxNCArMzYzLDEwIEBACiAJbGlzdF9hZGQoJnNiaS0+c19saXN0LCAmbmlsZnMtPm5zX3N1cGVycyk7CiAJdXBfd3JpdGUoJm5pbGZzLT5uc19zdXBlcl9zZW0pOwogCi0Jc2JpLT5zX2lmaWxlID0gbmlsZnNfbWR0X25ldyhuaWxmcywgc2JpLT5zX3N1cGVyLCBOSUxGU19JRklMRV9JTk8pOworCXNiaS0+c19pZmlsZSA9IG5pbGZzX2lmaWxlX25ldyhzYmksIG5pbGZzLT5uc19pbm9kZV9zaXplKTsKIAlpZiAoIXNiaS0+c19pZmlsZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQllcnIgPSBuaWxmc19wYWxsb2NfaW5pdF9ibG9ja2dyb3VwKHNiaS0+c19pZmlsZSwgbmlsZnMtPm5zX2lub2RlX3NpemUpOwotCWlmICh1bmxpa2VseShlcnIpKQotCQlnb3RvIGZhaWxlZDsKLQogCWRvd25fcmVhZCgmbmlsZnMtPm5zX3NlZ2N0b3Jfc2VtKTsKIAllcnIgPSBuaWxmc19jcGZpbGVfZ2V0X2NoZWNrcG9pbnQobmlsZnMtPm5zX2NwZmlsZSwgY25vLCAwLCAmcmF3X2NwLAogCQkJCQkgICZiaF9jcCk7CkBAIC00MTEsNyArNDA3LDYgQEAKIHsKIAlzdHJ1Y3QgdGhlX25pbGZzICpuaWxmcyA9IHNiaS0+c19uaWxmczsKIAotCW5pbGZzX21kdF9jbGVhcihzYmktPnNfaWZpbGUpOwogCW5pbGZzX21kdF9kZXN0cm95KHNiaS0+c19pZmlsZSk7CiAJc2JpLT5zX2lmaWxlID0gTlVMTDsKIAlkb3duX3dyaXRlKCZuaWxmcy0+bnNfc3VwZXJfc2VtKTsKQEAgLTQxOSwyMiArNDE0LDYgQEAKIAl1cF93cml0ZSgmbmlsZnMtPm5zX3N1cGVyX3NlbSk7CiB9CiAKLXN0YXRpYyBpbnQgbmlsZnNfbWFya19yZWNvdmVyeV9jb21wbGV0ZShzdHJ1Y3QgbmlsZnNfc2JfaW5mbyAqc2JpKQotewotCXN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzID0gc2JpLT5zX25pbGZzOwotCWludCBlcnIgPSAwOwotCi0JZG93bl93cml0ZSgmbmlsZnMtPm5zX3NlbSk7Ci0JaWYgKCEobmlsZnMtPm5zX21vdW50X3N0YXRlICYgTklMRlNfVkFMSURfRlMpKSB7Ci0JCW5pbGZzLT5uc19tb3VudF9zdGF0ZSB8PSBOSUxGU19WQUxJRF9GUzsKLQkJZXJyID0gbmlsZnNfY29tbWl0X3N1cGVyKHNiaSwgMSk7Ci0JCWlmIChsaWtlbHkoIWVycikpCi0JCQlwcmludGsoS0VSTl9JTkZPICJOSUxGUzogcmVjb3ZlcnkgY29tcGxldGUuXG4iKTsKLQl9Ci0JdXBfd3JpdGUoJm5pbGZzLT5uc19zZW0pOwotCXJldHVybiBlcnI7Ci19Ci0KIHN0YXRpYyBpbnQgbmlsZnNfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGVudHJ5LT5kX3NiOwpAQCAtNDkwLDcgKzQ2OSw3IEBACiAJc3RydWN0IG5pbGZzX3NiX2luZm8gKnNiaSA9IE5JTEZTX1NCKHNiKTsKIAogCWlmICghbmlsZnNfdGVzdF9vcHQoc2JpLCBCQVJSSUVSKSkKLQkJc2VxX3ByaW50ZihzZXEsICIsYmFycmllcj1vZmYiKTsKKwkJc2VxX3ByaW50ZihzZXEsICIsbm9iYXJyaWVyIik7CiAJaWYgKG5pbGZzX3Rlc3Rfb3B0KHNiaSwgU05BUFNIT1QpKQogCQlzZXFfcHJpbnRmKHNlcSwgIixjcD0lbGx1IiwKIAkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KXNiaS0+c19zbmFwc2hvdF9jbm8pOwpAQCAtNTAwLDYgKzQ3OSw4IEBACiAJCXNlcV9wcmludGYoc2VxLCAiLGVycm9ycz1wYW5pYyIpOwogCWlmIChuaWxmc190ZXN0X29wdChzYmksIFNUUklDVF9PUkRFUikpCiAJCXNlcV9wcmludGYoc2VxLCAiLG9yZGVyPXN0cmljdCIpOworCWlmIChuaWxmc190ZXN0X29wdChzYmksIE5PUkVDT1ZFUlkpKQorCQlzZXFfcHJpbnRmKHNlcSwgIixub3JlY292ZXJ5Iik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTU2OCw3ICs1NDksNyBAQAogCiBlbnVtIHsKIAlPcHRfZXJyX2NvbnQsIE9wdF9lcnJfcGFuaWMsIE9wdF9lcnJfcm8sCi0JT3B0X2JhcnJpZXIsIE9wdF9zbmFwc2hvdCwgT3B0X29yZGVyLAorCU9wdF9ub2JhcnJpZXIsIE9wdF9zbmFwc2hvdCwgT3B0X29yZGVyLCBPcHRfbm9yZWNvdmVyeSwKIAlPcHRfZXJyLAogfTsKIApAQCAtNTc2LDI1ICs1NTcsMTMgQEAKIAl7T3B0X2Vycl9jb250LCAiZXJyb3JzPWNvbnRpbnVlIn0sCiAJe09wdF9lcnJfcGFuaWMsICJlcnJvcnM9cGFuaWMifSwKIAl7T3B0X2Vycl9ybywgImVycm9ycz1yZW1vdW50LXJvIn0sCi0Je09wdF9iYXJyaWVyLCAiYmFycmllcj0lcyJ9LAorCXtPcHRfbm9iYXJyaWVyLCAibm9iYXJyaWVyIn0sCiAJe09wdF9zbmFwc2hvdCwgImNwPSV1In0sCiAJe09wdF9vcmRlciwgIm9yZGVyPSVzIn0sCisJe09wdF9ub3JlY292ZXJ5LCAibm9yZWNvdmVyeSJ9LAogCXtPcHRfZXJyLCBOVUxMfQogfTsKIAotc3RhdGljIGludCBtYXRjaF9ib29sKHN1YnN0cmluZ190ICpzLCBpbnQgKnJlc3VsdCkKLXsKLQlpbnQgbGVuID0gcy0+dG8gLSBzLT5mcm9tOwotCi0JaWYgKHN0cm5jbXAocy0+ZnJvbSwgIm9uIiwgbGVuKSA9PSAwKQotCQkqcmVzdWx0ID0gMTsKLQllbHNlIGlmIChzdHJuY21wKHMtPmZyb20sICJvZmYiLCBsZW4pID09IDApCi0JCSpyZXN1bHQgPSAwOwotCWVsc2UKLQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgcGFyc2Vfb3B0aW9ucyhjaGFyICpvcHRpb25zLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBuaWxmc19zYl9pbmZvICpzYmkgPSBOSUxGU19TQihzYik7CkBAIC02MTIsMTMgKzU4MSw4IEBACiAKIAkJdG9rZW4gPSBtYXRjaF90b2tlbihwLCB0b2tlbnMsIGFyZ3MpOwogCQlzd2l0Y2ggKHRva2VuKSB7Ci0JCWNhc2UgT3B0X2JhcnJpZXI6Ci0JCQlpZiAobWF0Y2hfYm9vbCgmYXJnc1swXSwgJm9wdGlvbikpCi0JCQkJcmV0dXJuIDA7Ci0JCQlpZiAob3B0aW9uKQotCQkJCW5pbGZzX3NldF9vcHQoc2JpLCBCQVJSSUVSKTsKLQkJCWVsc2UKLQkJCQluaWxmc19jbGVhcl9vcHQoc2JpLCBCQVJSSUVSKTsKKwkJY2FzZSBPcHRfbm9iYXJyaWVyOgorCQkJbmlsZnNfY2xlYXJfb3B0KHNiaSwgQkFSUklFUik7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfb3JkZXI6CiAJCQlpZiAoc3RyY21wKGFyZ3NbMF0uZnJvbSwgInJlbGF4ZWQiKSA9PSAwKQpAQCAtNjQ3LDYgKzYxMSw5IEBACiAJCQlzYmktPnNfc25hcHNob3RfY25vID0gb3B0aW9uOwogCQkJbmlsZnNfc2V0X29wdChzYmksIFNOQVBTSE9UKTsKIAkJCWJyZWFrOworCQljYXNlIE9wdF9ub3JlY292ZXJ5OgorCQkJbmlsZnNfc2V0X29wdChzYmksIE5PUkVDT1ZFUlkpOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlwcmludGsoS0VSTl9FUlIKIAkJCSAgICAgICAiTklMRlM6IFVucmVjb2duaXplZCBtb3VudCBvcHRpb24gXCIlc1wiXG4iLCBwKTsKQEAgLTY3Miw5ICs2MzksNyBAQAogCWludCBtbnRfY291bnQgPSBsZTE2X3RvX2NwdShzYnAtPnNfbW50X2NvdW50KTsKIAogCS8qIG5pbGZzLT5zZW0gbXVzdCBiZSBsb2NrZWQgYnkgdGhlIGNhbGxlci4gKi8KLQlpZiAoIShuaWxmcy0+bnNfbW91bnRfc3RhdGUgJiBOSUxGU19WQUxJRF9GUykpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTklMRlMgd2FybmluZzogbW91bnRpbmcgdW5jaGVja2VkIGZzXG4iKTsKLQl9IGVsc2UgaWYgKG5pbGZzLT5uc19tb3VudF9zdGF0ZSAmIE5JTEZTX0VSUk9SX0ZTKSB7CisJaWYgKG5pbGZzLT5uc19tb3VudF9zdGF0ZSAmIE5JTEZTX0VSUk9SX0ZTKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICJOSUxGUyB3YXJuaW5nOiBtb3VudGluZyBmcyB3aXRoIGVycm9yc1xuIik7CiAjaWYgMApAQCAtNzgyLDExICs3NDcsMTAgQEAKIAlzYi0+c19yb290ID0gTlVMTDsKIAlzYi0+c190aW1lX2dyYW4gPSAxOwogCi0JaWYgKCFuaWxmc19sb2FkZWQobmlsZnMpKSB7Ci0JCWVyciA9IGxvYWRfbmlsZnMobmlsZnMsIHNiaSk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGZhaWxlZF9zYmk7Ci0JfQorCWVyciA9IGxvYWRfbmlsZnMobmlsZnMsIHNiaSk7CisJaWYgKGVycikKKwkJZ290byBmYWlsZWRfc2JpOworCiAJY25vID0gbmlsZnNfbGFzdF9jbm8obmlsZnMpOwogCiAJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSB7CkBAIC04NTQsMTIgKzgxOCw2IEBACiAJCXVwX3dyaXRlKCZuaWxmcy0+bnNfc2VtKTsKIAl9CiAKLQllcnIgPSBuaWxmc19tYXJrX3JlY292ZXJ5X2NvbXBsZXRlKHNiaSk7Ci0JaWYgKHVubGlrZWx5KGVycikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJOSUxGUzogcmVjb3ZlcnkgZmFpbGVkLlxuIik7Ci0JCWdvdG8gZmFpbGVkX3Jvb3Q7Ci0JfQotCiAJZG93bl93cml0ZSgmbmlsZnMtPm5zX3N1cGVyX3NlbSk7CiAJaWYgKCFuaWxmc190ZXN0X29wdChzYmksIFNOQVBTSE9UKSkKIAkJbmlsZnMtPm5zX2N1cnJlbnQgPSBzYmk7CkBAIC04NjcsMTAgKzgyNSw2IEBACiAKIAlyZXR1cm4gMDsKIAotIGZhaWxlZF9yb290OgotCWRwdXQoc2ItPnNfcm9vdCk7Ci0Jc2ItPnNfcm9vdCA9IE5VTEw7Ci0KICBmYWlsZWRfc2VnY3RvcjoKIAluaWxmc19kZXRhY2hfc2VnbWVudF9jb25zdHJ1Y3RvcihzYmkpOwogCkBAIC05MTUsNiArODY5LDE0IEBACiAJCWdvdG8gcmVzdG9yZV9vcHRzOwogCX0KIAorCWlmICghbmlsZnNfdmFsaWRfZnMobmlsZnMpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5JTEZTIChkZXZpY2UgJXMpOiBjb3VsZG4ndCAiCisJCSAgICAgICAicmVtb3VudCBiZWNhdXNlIHRoZSBmaWxlc3lzdGVtIGlzIGluIGFuICIKKwkJICAgICAgICJpbmNvbXBsZXRlIHJlY292ZXJ5IHN0YXRlLlxuIiwgc2ItPnNfaWQpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIHJlc3RvcmVfb3B0czsKKwl9CisKIAlpZiAoKCpmbGFncyAmIE1TX1JET05MWSkgPT0gKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkKIAkJZ290byBvdXQ7CiAJaWYgKCpmbGFncyAmIE1TX1JET05MWSkgewpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL3RoZV9uaWxmcy5jIGIvZnMvbmlsZnMyL3RoZV9uaWxmcy5jCmluZGV4IGFkMzkxYTguLjYyNDFlMTcgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi90aGVfbmlsZnMuYworKysgYi9mcy9uaWxmczIvdGhlX25pbGZzLmMKQEAgLTE0NiwxMyArMTQ2LDkgQEAKIAogCW1pZ2h0X3NsZWVwKCk7CiAJaWYgKG5pbGZzX2xvYWRlZChuaWxmcykpIHsKLQkJbmlsZnNfbWR0X2NsZWFyKG5pbGZzLT5uc19zdWZpbGUpOwogCQluaWxmc19tZHRfZGVzdHJveShuaWxmcy0+bnNfc3VmaWxlKTsKLQkJbmlsZnNfbWR0X2NsZWFyKG5pbGZzLT5uc19jcGZpbGUpOwogCQluaWxmc19tZHRfZGVzdHJveShuaWxmcy0+bnNfY3BmaWxlKTsKLQkJbmlsZnNfbWR0X2NsZWFyKG5pbGZzLT5uc19kYXQpOwogCQluaWxmc19tZHRfZGVzdHJveShuaWxmcy0+bnNfZGF0KTsKLQkJLyogWFhYOiBob3cgYW5kIHdoZW4gdG8gY2xlYXIgbmlsZnMtPm5zX2djX2RhdD8gKi8KIAkJbmlsZnNfbWR0X2Rlc3Ryb3kobmlsZnMtPm5zX2djX2RhdCk7CiAJfQogCWlmIChuaWxmc19pbml0KG5pbGZzKSkgewpAQCAtMTY2LDcgKzE2Miw2IEBACiBzdGF0aWMgaW50IG5pbGZzX2xvYWRfc3VwZXJfcm9vdChzdHJ1Y3QgdGhlX25pbGZzICpuaWxmcywKIAkJCQkgc3RydWN0IG5pbGZzX3NiX2luZm8gKnNiaSwgc2VjdG9yX3Qgc3JfYmxvY2spCiB7Ci0Jc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSBkYXRfbG9ja19rZXk7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9zcjsKIAlzdHJ1Y3QgbmlsZnNfc3VwZXJfcm9vdCAqcmF3X3NyOwogCXN0cnVjdCBuaWxmc19zdXBlcl9ibG9jayAqKnNicCA9IG5pbGZzLT5uc19zYnA7CkBAIC0xODcsNTEgKzE4MiwzNiBAQAogCWlub2RlX3NpemUgPSBuaWxmcy0+bnNfaW5vZGVfc2l6ZTsKIAogCWVyciA9IC1FTk9NRU07Ci0JbmlsZnMtPm5zX2RhdCA9IG5pbGZzX21kdF9uZXcobmlsZnMsIE5VTEwsIE5JTEZTX0RBVF9JTk8pOworCW5pbGZzLT5uc19kYXQgPSBuaWxmc19kYXRfbmV3KG5pbGZzLCBkYXRfZW50cnlfc2l6ZSk7CiAJaWYgKHVubGlrZWx5KCFuaWxmcy0+bnNfZGF0KSkKIAkJZ290byBmYWlsZWQ7CiAKLQluaWxmcy0+bnNfZ2NfZGF0ID0gbmlsZnNfbWR0X25ldyhuaWxmcywgTlVMTCwgTklMRlNfREFUX0lOTyk7CisJbmlsZnMtPm5zX2djX2RhdCA9IG5pbGZzX2RhdF9uZXcobmlsZnMsIGRhdF9lbnRyeV9zaXplKTsKIAlpZiAodW5saWtlbHkoIW5pbGZzLT5uc19nY19kYXQpKQogCQlnb3RvIGZhaWxlZF9kYXQ7CiAKLQluaWxmcy0+bnNfY3BmaWxlID0gbmlsZnNfbWR0X25ldyhuaWxmcywgTlVMTCwgTklMRlNfQ1BGSUxFX0lOTyk7CisJbmlsZnMtPm5zX2NwZmlsZSA9IG5pbGZzX2NwZmlsZV9uZXcobmlsZnMsIGNoZWNrcG9pbnRfc2l6ZSk7CiAJaWYgKHVubGlrZWx5KCFuaWxmcy0+bnNfY3BmaWxlKSkKIAkJZ290byBmYWlsZWRfZ2NfZGF0OwogCi0JbmlsZnMtPm5zX3N1ZmlsZSA9IG5pbGZzX21kdF9uZXcobmlsZnMsIE5VTEwsIE5JTEZTX1NVRklMRV9JTk8pOworCW5pbGZzLT5uc19zdWZpbGUgPSBuaWxmc19zdWZpbGVfbmV3KG5pbGZzLCBzZWdtZW50X3VzYWdlX3NpemUpOwogCWlmICh1bmxpa2VseSghbmlsZnMtPm5zX3N1ZmlsZSkpCiAJCWdvdG8gZmFpbGVkX2NwZmlsZTsKIAotCWVyciA9IG5pbGZzX3BhbGxvY19pbml0X2Jsb2NrZ3JvdXAobmlsZnMtPm5zX2RhdCwgZGF0X2VudHJ5X3NpemUpOwotCWlmICh1bmxpa2VseShlcnIpKQotCQlnb3RvIGZhaWxlZF9zdWZpbGU7Ci0KLQllcnIgPSBuaWxmc19wYWxsb2NfaW5pdF9ibG9ja2dyb3VwKG5pbGZzLT5uc19nY19kYXQsIGRhdF9lbnRyeV9zaXplKTsKLQlpZiAodW5saWtlbHkoZXJyKSkKLQkJZ290byBmYWlsZWRfc3VmaWxlOwotCi0JbG9ja2RlcF9zZXRfY2xhc3MoJk5JTEZTX01EVChuaWxmcy0+bnNfZGF0KS0+bWlfc2VtLCAmZGF0X2xvY2tfa2V5KTsKLQlsb2NrZGVwX3NldF9jbGFzcygmTklMRlNfTURUKG5pbGZzLT5uc19nY19kYXQpLT5taV9zZW0sICZkYXRfbG9ja19rZXkpOwotCiAJbmlsZnNfbWR0X3NldF9zaGFkb3cobmlsZnMtPm5zX2RhdCwgbmlsZnMtPm5zX2djX2RhdCk7Ci0JbmlsZnNfbWR0X3NldF9lbnRyeV9zaXplKG5pbGZzLT5uc19jcGZpbGUsIGNoZWNrcG9pbnRfc2l6ZSwKLQkJCQkgc2l6ZW9mKHN0cnVjdCBuaWxmc19jcGZpbGVfaGVhZGVyKSk7Ci0JbmlsZnNfbWR0X3NldF9lbnRyeV9zaXplKG5pbGZzLT5uc19zdWZpbGUsIHNlZ21lbnRfdXNhZ2Vfc2l6ZSwKLQkJCQkgc2l6ZW9mKHN0cnVjdCBuaWxmc19zdWZpbGVfaGVhZGVyKSk7CiAKLQllcnIgPSBuaWxmc19tZHRfcmVhZF9pbm9kZV9kaXJlY3QoCi0JCW5pbGZzLT5uc19kYXQsIGJoX3NyLCBOSUxGU19TUl9EQVRfT0ZGU0VUKGlub2RlX3NpemUpKTsKKwllcnIgPSBuaWxmc19kYXRfcmVhZChuaWxmcy0+bnNfZGF0LCAodm9pZCAqKWJoX3NyLT5iX2RhdGEgKworCQkJICAgICBOSUxGU19TUl9EQVRfT0ZGU0VUKGlub2RlX3NpemUpKTsKIAlpZiAodW5saWtlbHkoZXJyKSkKIAkJZ290byBmYWlsZWRfc3VmaWxlOwogCi0JZXJyID0gbmlsZnNfbWR0X3JlYWRfaW5vZGVfZGlyZWN0KAotCQluaWxmcy0+bnNfY3BmaWxlLCBiaF9zciwgTklMRlNfU1JfQ1BGSUxFX09GRlNFVChpbm9kZV9zaXplKSk7CisJZXJyID0gbmlsZnNfY3BmaWxlX3JlYWQobmlsZnMtPm5zX2NwZmlsZSwgKHZvaWQgKiliaF9zci0+Yl9kYXRhICsKKwkJCQlOSUxGU19TUl9DUEZJTEVfT0ZGU0VUKGlub2RlX3NpemUpKTsKIAlpZiAodW5saWtlbHkoZXJyKSkKIAkJZ290byBmYWlsZWRfc3VmaWxlOwogCi0JZXJyID0gbmlsZnNfbWR0X3JlYWRfaW5vZGVfZGlyZWN0KAotCQluaWxmcy0+bnNfc3VmaWxlLCBiaF9zciwgTklMRlNfU1JfU1VGSUxFX09GRlNFVChpbm9kZV9zaXplKSk7CisJZXJyID0gbmlsZnNfc3VmaWxlX3JlYWQobmlsZnMtPm5zX3N1ZmlsZSwgKHZvaWQgKiliaF9zci0+Yl9kYXRhICsKKwkJCQlOSUxGU19TUl9TVUZJTEVfT0ZGU0VUKGlub2RlX3NpemUpKTsKIAlpZiAodW5saWtlbHkoZXJyKSkKIAkJZ290byBmYWlsZWRfc3VmaWxlOwogCkBAIC0yODEsMjkgKzI2MSwzMCBAQAogCXN0cnVjdCBuaWxmc19yZWNvdmVyeV9pbmZvIHJpOwogCXVuc2lnbmVkIGludCBzX2ZsYWdzID0gc2JpLT5zX3N1cGVyLT5zX2ZsYWdzOwogCWludCByZWFsbHlfcmVhZF9vbmx5ID0gYmRldl9yZWFkX29ubHkobmlsZnMtPm5zX2JkZXYpOwotCXVuc2lnbmVkIHZhbGlkX2ZzOwotCWludCBlcnIgPSAwOworCWludCB2YWxpZF9mcyA9IG5pbGZzX3ZhbGlkX2ZzKG5pbGZzKTsKKwlpbnQgZXJyOworCisJaWYgKG5pbGZzX2xvYWRlZChuaWxmcykpIHsKKwkJaWYgKHZhbGlkX2ZzIHx8CisJCSAgICAoKHNfZmxhZ3MgJiBNU19SRE9OTFkpICYmIG5pbGZzX3Rlc3Rfb3B0KHNiaSwgTk9SRUNPVkVSWSkpKQorCQkJcmV0dXJuIDA7CisJCXByaW50ayhLRVJOX0VSUiAiTklMRlM6IHRoZSBmaWxlc3lzdGVtIGlzIGluIGFuIGluY29tcGxldGUgIgorCQkgICAgICAgInJlY292ZXJ5IHN0YXRlLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghdmFsaWRfZnMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTklMRlMgd2FybmluZzogbW91bnRpbmcgdW5jaGVja2VkIGZzXG4iKTsKKwkJaWYgKHNfZmxhZ3MgJiBNU19SRE9OTFkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIk5JTEZTOiBJTkZPOiByZWNvdmVyeSAiCisJCQkgICAgICAgInJlcXVpcmVkIGZvciByZWFkb25seSBmaWxlc3lzdGVtLlxuIik7CisJCQlwcmludGsoS0VSTl9JTkZPICJOSUxGUzogd3JpdGUgYWNjZXNzIHdpbGwgIgorCQkJICAgICAgICJiZSBlbmFibGVkIGR1cmluZyByZWNvdmVyeS5cbiIpOworCQl9CisJfQogCiAJbmlsZnNfaW5pdF9yZWNvdmVyeV9pbmZvKCZyaSk7CiAKLQlkb3duX3dyaXRlKCZuaWxmcy0+bnNfc2VtKTsKLQl2YWxpZF9mcyA9IChuaWxmcy0+bnNfbW91bnRfc3RhdGUgJiBOSUxGU19WQUxJRF9GUyk7Ci0JdXBfd3JpdGUoJm5pbGZzLT5uc19zZW0pOwotCi0JaWYgKCF2YWxpZF9mcyAmJiAoc19mbGFncyAmIE1TX1JET05MWSkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiTklMRlM6IElORk86IHJlY292ZXJ5ICIKLQkJICAgICAgICJyZXF1aXJlZCBmb3IgcmVhZG9ubHkgZmlsZXN5c3RlbS5cbiIpOwotCQlpZiAocmVhbGx5X3JlYWRfb25seSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJOSUxGUzogd3JpdGUgYWNjZXNzICIKLQkJCSAgICAgICAidW5hdmFpbGFibGUsIGNhbm5vdCBwcm9jZWVkLlxuIik7Ci0JCQllcnIgPSAtRVJPRlM7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCQlwcmludGsoS0VSTl9JTkZPICJOSUxGUzogd3JpdGUgYWNjZXNzIHdpbGwgIgotCQkgICAgICAgImJlIGVuYWJsZWQgZHVyaW5nIHJlY292ZXJ5LlxuIik7Ci0JCXNiaS0+c19zdXBlci0+c19mbGFncyAmPSB+TVNfUkRPTkxZOwotCX0KLQogCWVyciA9IG5pbGZzX3NlYXJjaF9zdXBlcl9yb290KG5pbGZzLCBzYmksICZyaSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJOSUxGUzogZXJyb3Igc2VhcmNoaW5nIHN1cGVyIHJvb3QuXG4iKTsKQEAgLTMxNiwxOSArMjk3LDU2IEBACiAJCWdvdG8gZmFpbGVkOwogCX0KIAotCWlmICghdmFsaWRfZnMpIHsKLQkJZXJyID0gbmlsZnNfcmVjb3Zlcl9sb2dpY2FsX3NlZ21lbnRzKG5pbGZzLCBzYmksICZyaSk7Ci0JCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQluaWxmc19tZHRfZGVzdHJveShuaWxmcy0+bnNfY3BmaWxlKTsKLQkJCW5pbGZzX21kdF9kZXN0cm95KG5pbGZzLT5uc19zdWZpbGUpOwotCQkJbmlsZnNfbWR0X2Rlc3Ryb3kobmlsZnMtPm5zX2RhdCk7Ci0JCQlnb3RvIGZhaWxlZDsKKwlpZiAodmFsaWRfZnMpCisJCWdvdG8gc2tpcF9yZWNvdmVyeTsKKworCWlmIChzX2ZsYWdzICYgTVNfUkRPTkxZKSB7CisJCWlmIChuaWxmc190ZXN0X29wdChzYmksIE5PUkVDT1ZFUlkpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJOSUxGUzogbm9yZWNvdmVyeSBvcHRpb24gc3BlY2lmaWVkLiAiCisJCQkgICAgICAgInNraXBwaW5nIHJvbGwtZm9yd2FyZCByZWNvdmVyeVxuIik7CisJCQlnb3RvIHNraXBfcmVjb3Zlcnk7CiAJCX0KLQkJaWYgKHJpLnJpX25lZWRfcmVjb3ZlcnkgPT0gTklMRlNfUkVDT1ZFUllfU1JfVVBEQVRFRCkKLQkJCXNiaS0+c19zdXBlci0+c19kaXJ0ID0gMTsKKwkJaWYgKHJlYWxseV9yZWFkX29ubHkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiTklMRlM6IHdyaXRlIGFjY2VzcyAiCisJCQkgICAgICAgInVuYXZhaWxhYmxlLCBjYW5ub3QgcHJvY2VlZC5cbiIpOworCQkJZXJyID0gLUVST0ZTOworCQkJZ290byBmYWlsZWRfdW5sb2FkOworCQl9CisJCXNiaS0+c19zdXBlci0+c19mbGFncyAmPSB+TVNfUkRPTkxZOworCX0gZWxzZSBpZiAobmlsZnNfdGVzdF9vcHQoc2JpLCBOT1JFQ09WRVJZKSkgeworCQlwcmludGsoS0VSTl9FUlIgIk5JTEZTOiByZWNvdmVyeSBjYW5jZWxsZWQgYmVjYXVzZSBub3JlY292ZXJ5ICIKKwkJICAgICAgICJvcHRpb24gd2FzIHNwZWNpZmllZCBmb3IgYSByZWFkL3dyaXRlIG1vdW50XG4iKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBmYWlsZWRfdW5sb2FkOwogCX0KIAorCWVyciA9IG5pbGZzX3JlY292ZXJfbG9naWNhbF9zZWdtZW50cyhuaWxmcywgc2JpLCAmcmkpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbGVkX3VubG9hZDsKKworCWRvd25fd3JpdGUoJm5pbGZzLT5uc19zZW0pOworCW5pbGZzLT5uc19tb3VudF9zdGF0ZSB8PSBOSUxGU19WQUxJRF9GUzsKKwluaWxmcy0+bnNfc2JwWzBdLT5zX3N0YXRlID0gY3B1X3RvX2xlMTYobmlsZnMtPm5zX21vdW50X3N0YXRlKTsKKwllcnIgPSBuaWxmc19jb21taXRfc3VwZXIoc2JpLCAxKTsKKwl1cF93cml0ZSgmbmlsZnMtPm5zX3NlbSk7CisKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTklMRlM6IGZhaWxlZCB0byB1cGRhdGUgc3VwZXIgYmxvY2suICIKKwkJICAgICAgICJyZWNvdmVyeSB1bmZpbmlzaGVkLlxuIik7CisJCWdvdG8gZmFpbGVkX3VubG9hZDsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiTklMRlM6IHJlY292ZXJ5IGNvbXBsZXRlLlxuIik7CisKKyBza2lwX3JlY292ZXJ5OgogCXNldF9uaWxmc19sb2FkZWQobmlsZnMpOworCW5pbGZzX2NsZWFyX3JlY292ZXJ5X2luZm8oJnJpKTsKKwlzYmktPnNfc3VwZXItPnNfZmxhZ3MgPSBzX2ZsYWdzOworCXJldHVybiAwOworCisgZmFpbGVkX3VubG9hZDoKKwluaWxmc19tZHRfZGVzdHJveShuaWxmcy0+bnNfY3BmaWxlKTsKKwluaWxmc19tZHRfZGVzdHJveShuaWxmcy0+bnNfc3VmaWxlKTsKKwluaWxmc19tZHRfZGVzdHJveShuaWxmcy0+bnNfZGF0KTsKIAogIGZhaWxlZDoKIAluaWxmc19jbGVhcl9yZWNvdmVyeV9pbmZvKCZyaSk7CkBAIC02MzIsMzAgKzY1MCwyMyBAQAogewogCXN0cnVjdCBpbm9kZSAqZGF0ID0gbmlsZnNfZGF0X2lub2RlKG5pbGZzKTsKIAl1bnNpZ25lZCBsb25nIG5jbGVhbnNlZ3M7Ci0JaW50IGVycjsKIAogCWRvd25fcmVhZCgmTklMRlNfTURUKGRhdCktPm1pX3NlbSk7CS8qIFhYWCAqLwotCWVyciA9IG5pbGZzX3N1ZmlsZV9nZXRfbmNsZWFuc2VncyhuaWxmcy0+bnNfc3VmaWxlLCAmbmNsZWFuc2Vncyk7CisJbmNsZWFuc2VncyA9IG5pbGZzX3N1ZmlsZV9nZXRfbmNsZWFuc2VncyhuaWxmcy0+bnNfc3VmaWxlKTsKIAl1cF9yZWFkKCZOSUxGU19NRFQoZGF0KS0+bWlfc2VtKTsJLyogWFhYICovCi0JaWYgKGxpa2VseSghZXJyKSkKLQkJKm5ibG9ja3MgPSAoc2VjdG9yX3QpbmNsZWFuc2VncyAqIG5pbGZzLT5uc19ibG9ja3NfcGVyX3NlZ21lbnQ7Ci0JcmV0dXJuIGVycjsKKwkqbmJsb2NrcyA9IChzZWN0b3JfdCluY2xlYW5zZWdzICogbmlsZnMtPm5zX2Jsb2Nrc19wZXJfc2VnbWVudDsKKwlyZXR1cm4gMDsKIH0KIAogaW50IG5pbGZzX25lYXJfZGlza19mdWxsKHN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzKQogewotCXN0cnVjdCBpbm9kZSAqc3VmaWxlID0gbmlsZnMtPm5zX3N1ZmlsZTsKIAl1bnNpZ25lZCBsb25nIG5jbGVhbnNlZ3MsIG5pbmNzZWdzOwotCWludCByZXQ7CiAKLQlyZXQgPSBuaWxmc19zdWZpbGVfZ2V0X25jbGVhbnNlZ3Moc3VmaWxlLCAmbmNsZWFuc2Vncyk7Ci0JaWYgKGxpa2VseSghcmV0KSkgewotCQluaW5jc2VncyA9IGF0b21pY19yZWFkKCZuaWxmcy0+bnNfbmRpcnR5YmxrcykgLwotCQkJbmlsZnMtPm5zX2Jsb2Nrc19wZXJfc2VnbWVudCArIDE7Ci0JCWlmIChuY2xlYW5zZWdzIDw9IG5pbGZzLT5uc19ucnN2c2VncyArIG5pbmNzZWdzKQotCQkJcmV0Kys7Ci0JfQotCXJldHVybiByZXQ7CisJbmNsZWFuc2VncyA9IG5pbGZzX3N1ZmlsZV9nZXRfbmNsZWFuc2VncyhuaWxmcy0+bnNfc3VmaWxlKTsKKwluaW5jc2VncyA9IGF0b21pY19yZWFkKCZuaWxmcy0+bnNfbmRpcnR5YmxrcykgLworCQluaWxmcy0+bnNfYmxvY2tzX3Blcl9zZWdtZW50ICsgMTsKKworCXJldHVybiBuY2xlYW5zZWdzIDw9IG5pbGZzLT5uc19ucnN2c2VncyArIG5pbmNzZWdzOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi90aGVfbmlsZnMuaCBiL2ZzL25pbGZzMi90aGVfbmlsZnMuaAppbmRleCAyMGFiZDU1Li41ODk3ODZlIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvdGhlX25pbGZzLmgKKysrIGIvZnMvbmlsZnMyL3RoZV9uaWxmcy5oCkBAIC0yNTgsNiArMjU4LDE2IEBACiAJCWtmcmVlKHNiaSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG5pbGZzX3ZhbGlkX2ZzKHN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzKQoreworCXVuc2lnbmVkIHZhbGlkX2ZzOworCisJZG93bl9yZWFkKCZuaWxmcy0+bnNfc2VtKTsKKwl2YWxpZF9mcyA9IChuaWxmcy0+bnNfbW91bnRfc3RhdGUgJiBOSUxGU19WQUxJRF9GUyk7CisJdXBfcmVhZCgmbmlsZnMtPm5zX3NlbSk7CisJcmV0dXJuIHZhbGlkX2ZzOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQKIG5pbGZzX2dldF9zZWdtZW50X3JhbmdlKHN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzLCBfX3U2NCBzZWdudW0sCiAJCQlzZWN0b3JfdCAqc2VnX3N0YXJ0LCBzZWN0b3JfdCAqc2VnX2VuZCkKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2ZpbGUuYyBiL2ZzL29jZnMyL2ZpbGUuYwppbmRleCBkZTA1OWY0Li4zZDMwYTFjIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9maWxlLmMKKysrIGIvZnMvb2NmczIvZmlsZS5jCkBAIC0yMDA2LDcgKzIwMDYsNyBAQAogCS8qIGJ1ZmZlcmVkIGFpbyB3b3VsZG4ndCBoYXZlIHByb3BlciBsb2NrIGNvdmVyYWdlIHRvZGF5ICovCiAJQlVHX09OKHJldCA9PSAtRUlPQ0JRVUVVRUQgJiYgIShmaWxlLT5mX2ZsYWdzICYgT19ESVJFQ1QpKTsKIAotCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fU1lOQyAmJiAhZGlyZWN0X2lvKSB8fCBJU19TWU5DKGlub2RlKSkgeworCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fRFNZTkMgJiYgIWRpcmVjdF9pbykgfHwgSVNfU1lOQyhpbm9kZSkpIHsKIAkJcmV0ID0gZmlsZW1hcF9mZGF0YXdyaXRlX3JhbmdlKGZpbGUtPmZfbWFwcGluZywgcG9zLAogCQkJCQkgICAgICAgcG9zICsgY291bnQgLSAxKTsKIAkJaWYgKHJldCA8IDApCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9xdW90YS5oIGIvZnMvb2NmczIvcXVvdGEuaAppbmRleCBlNWRmOWQxLi4xMjNiYzUyIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9xdW90YS5oCisrKyBiL2ZzL29jZnMyL3F1b3RhLmgKQEAgLTE3LDEwICsxNyw2IEBACiAKICNpbmNsdWRlICJvY2ZzMi5oIgogCi0vKiBDb21tb24gc3R1ZmYgKi8KLS8qIGlkIG51bWJlciBvZiBxdW90YSBmb3JtYXQgKi8KLSNkZWZpbmUgUUZNVF9PQ0ZTMiAzCi0KIC8qCiAgKiBJbi1tZW1vcnkgc3RydWN0dXJlcwogICovCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9xdW90YV9sb2NhbC5jIGIvZnMvb2NmczIvcXVvdGFfbG9jYWwuYwppbmRleCAxYTJjNTBhLi4yMWY5ZTcxIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9xdW90YV9sb2NhbC5jCisrKyBiL2ZzL29jZnMyL3F1b3RhX2xvY2FsLmMKQEAgLTEzMjUsNyArMTMyNSw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIHN0cnVjdCBxdW90YV9mb3JtYXRfb3BzIG9jZnMyX2Zvcm1hdF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHF1b3RhX2Zvcm1hdF9vcHMgb2NmczJfZm9ybWF0X29wcyA9IHsKIAkuY2hlY2tfcXVvdGFfZmlsZQk9IG9jZnMyX2xvY2FsX2NoZWNrX3F1b3RhX2ZpbGUsCiAJLnJlYWRfZmlsZV9pbmZvCQk9IG9jZnMyX2xvY2FsX3JlYWRfaW5mbywKIAkud3JpdGVfZmlsZV9pbmZvCT0gb2NmczJfZ2xvYmFsX3dyaXRlX2luZm8sCmRpZmYgLS1naXQgYS9mcy9wcm9jL3Byb2NfZGV2dHJlZS5jIGIvZnMvcHJvYy9wcm9jX2RldnRyZWUuYwppbmRleCA3YmE3OWE1Li4xMjMyNTdiIDEwMDY0NAotLS0gYS9mcy9wcm9jL3Byb2NfZGV2dHJlZS5jCisrKyBiL2ZzL3Byb2MvcHJvY19kZXZ0cmVlLmMKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KQEAgLTI1LDI2ICsyNiwyNyBAQAogLyoKICAqIFN1cHBseSBkYXRhIG9uIGEgcmVhZCBmcm9tIC9wcm9jL2RldmljZS10cmVlL25vZGUvcHJvcGVydHkuCiAgKi8KLXN0YXRpYyBpbnQgcHJvcGVydHlfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAotCQkJICAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgcHJvcGVydHlfcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKLQlzdHJ1Y3QgcHJvcGVydHkgKnBwID0gZGF0YTsKLQlpbnQgbjsKKwlzdHJ1Y3QgcHJvcGVydHkgKnBwID0gbS0+cHJpdmF0ZTsKIAotCWlmIChvZmYgPj0gcHAtPmxlbmd0aCkgewotCQkqZW9mID0gMTsKLQkJcmV0dXJuIDA7Ci0JfQotCW4gPSBwcC0+bGVuZ3RoIC0gb2ZmOwotCWlmIChuID4gY291bnQpCi0JCW4gPSBjb3VudDsKLQllbHNlCi0JCSplb2YgPSAxOwotCW1lbWNweShwYWdlLCAoY2hhciAqKXBwLT52YWx1ZSArIG9mZiwgbik7Ci0JKnN0YXJ0ID0gcGFnZTsKLQlyZXR1cm4gbjsKKwlzZXFfd3JpdGUobSwgcHAtPnZhbHVlLCBwcC0+bGVuZ3RoKTsKKwlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBwcm9wZXJ0eV9wcm9jX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHByb3BlcnR5X3Byb2Nfc2hvdywgUERFKGlub2RlKS0+ZGF0YSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb3BlcnR5X3Byb2NfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gcHJvcGVydHlfcHJvY19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCiAvKgogICogRm9yIGEgbm9kZSB3aXRoIGEgbmFtZSBsaWtlICJnY0AxMCIsIHdlIG1ha2Ugc3ltbGlua3MgY2FsbGVkICJnYyIKICAqIGFuZCAiQDEwIiB0byBpdC4KQEAgLTYzLDEwICs2NSw5IEBACiAJICogVW5mb3J0dW5hdGVseSBwcm9jX3JlZ2lzdGVyIHB1dHMgZWFjaCBuZXcgZW50cnkKIAkgKiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0LiAgU28gd2UgcmVhcnJhbmdlIHRoZW0uCiAJICovCi0JZW50ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeShuYW1lLAotCQkJCSAgICAgc3RybmNtcChuYW1lLCAic2VjdXJpdHktIiwgOSkKLQkJCQkgICAgID8gU19JUlVHTyA6IFNfSVJVU1IsIGRlLAotCQkJCSAgICAgcHJvcGVydHlfcmVhZF9wcm9jLCBwcCk7CisJZW50ID0gcHJvY19jcmVhdGVfZGF0YShuYW1lLAorCQkJICAgICAgIHN0cm5jbXAobmFtZSwgInNlY3VyaXR5LSIsIDkpID8gU19JUlVHTyA6IFNfSVJVU1IsCisJCQkgICAgICAgZGUsICZwcm9wZXJ0eV9wcm9jX2ZvcHMsIHBwKTsKIAlpZiAoZW50ID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCmRpZmYgLS1naXQgYS9mcy9xdW90YS9LY29uZmlnIGIvZnMvcXVvdGEvS2NvbmZpZwppbmRleCAzNTNlNzhhLi5lZmMwMmViIDEwMDY0NAotLS0gYS9mcy9xdW90YS9LY29uZmlnCisrKyBiL2ZzL3F1b3RhL0tjb25maWcKQEAgLTQ2LDEyICs0NiwxNCBAQAogCSAgZm9ybWF0IHNheSBZIGhlcmUuCiAKIGNvbmZpZyBRRk1UX1YyCi0JdHJpc3RhdGUgIlF1b3RhIGZvcm1hdCB2MiBzdXBwb3J0IgorCXRyaXN0YXRlICJRdW90YSBmb3JtYXQgdmZzdjAgYW5kIHZmc3YxIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBRVU9UQQogCXNlbGVjdCBRVU9UQV9UUkVFCiAJaGVscAotCSAgVGhpcyBxdW90YSBmb3JtYXQgYWxsb3dzIHVzaW5nIHF1b3RhcyB3aXRoIDMyLWJpdCBVSURzL0dJRHMuIElmIHlvdQotCSAgbmVlZCB0aGlzIGZ1bmN0aW9uYWxpdHkgc2F5IFkgaGVyZS4KKwkgIFRoaXMgY29uZmlnIG9wdGlvbiBlbmFibGVzIGtlcm5lbCBzdXBwb3J0IGZvciB2ZnN2MCBhbmQgdmZzdjEgcXVvdGEKKwkgIGZvcm1hdHMuIEJvdGggdGhlc2UgZm9ybWF0cyBzdXBwb3J0IDMyLWJpdCBVSURzL0dJRHMgYW5kIHZmc3YxIGZvcm1hdAorCSAgYWxzbyBzdXBwb3J0cyA2NC1iaXQgaW5vZGUgYW5kIGJsb2NrIHF1b3RhIGxpbWl0cy4gSWYgeW91IG5lZWQgdGhpcworCSAgZnVuY3Rpb25hbGl0eSBzYXkgWSBoZXJlLgogCiBjb25maWcgUVVPVEFDVEwKIAlib29sCmRpZmYgLS1naXQgYS9mcy9xdW90YS9kcXVvdC5jIGIvZnMvcXVvdGEvZHF1b3QuYwppbmRleCBlYjVhNzU1Li5jZDZiYjlhIDEwMDY0NAotLS0gYS9mcy9xdW90YS9kcXVvdC5jCisrKyBiL2ZzL3F1b3RhL2RxdW90LmMKQEAgLTIxNjQsNyArMjE2NCw5IEBACiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwogCWludCBlcnJvcjsKIAorCW11dGV4X2xvY2soJnNiLT5zX3Jvb3QtPmRfaW5vZGUtPmlfbXV0ZXgpOwogCWRlbnRyeSA9IGxvb2t1cF9vbmVfbGVuKHFmX25hbWUsIHNiLT5zX3Jvb3QsIHN0cmxlbihxZl9uYW1lKSk7CisJbXV0ZXhfdW5sb2NrKCZzYi0+c19yb290LT5kX2lub2RlLT5pX211dGV4KTsKIAlpZiAoSVNfRVJSKGRlbnRyeSkpCiAJCXJldHVybiBQVFJfRVJSKGRlbnRyeSk7CiAKZGlmZiAtLWdpdCBhL2ZzL3F1b3RhL3F1b3RhX3YxLmMgYi9mcy9xdW90YS9xdW90YV92MS5jCmluZGV4IDBlZGNmNDIuLjJhZTc1N2UgMTAwNjQ0Ci0tLSBhL2ZzL3F1b3RhL3F1b3RhX3YxLmMKKysrIGIvZnMvcXVvdGEvcXVvdGFfdjEuYwpAQCAtMjA0LDcgKzIwNCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBxdW90YV9mb3JtYXRfb3BzIHYxX2Zvcm1hdF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHF1b3RhX2Zvcm1hdF9vcHMgdjFfZm9ybWF0X29wcyA9IHsKIAkuY2hlY2tfcXVvdGFfZmlsZQk9IHYxX2NoZWNrX3F1b3RhX2ZpbGUsCiAJLnJlYWRfZmlsZV9pbmZvCQk9IHYxX3JlYWRfZmlsZV9pbmZvLAogCS53cml0ZV9maWxlX2luZm8JPSB2MV93cml0ZV9maWxlX2luZm8sCmRpZmYgLS1naXQgYS9mcy9xdW90YS9xdW90YV92Mi5jIGIvZnMvcXVvdGEvcXVvdGFfdjIuYwppbmRleCBhNTQ3NWZiLi4zZGZjMjNlIDEwMDY0NAotLS0gYS9mcy9xdW90YS9xdW90YV92Mi5jCisrKyBiL2ZzL3F1b3RhL3F1b3RhX3YyLmMKQEAgLTIzLDE0ICsyMywyMyBAQAogCiAjZGVmaW5lIF9fUVVPVEFfVjJfUEFSQU5PSUEKIAotc3RhdGljIHZvaWQgdjJfbWVtMmRpc2tkcWIodm9pZCAqZHAsIHN0cnVjdCBkcXVvdCAqZHF1b3QpOwotc3RhdGljIHZvaWQgdjJfZGlzazJtZW1kcWIoc3RydWN0IGRxdW90ICpkcXVvdCwgdm9pZCAqZHApOwotc3RhdGljIGludCB2Ml9pc19pZCh2b2lkICpkcCwgc3RydWN0IGRxdW90ICpkcXVvdCk7CitzdGF0aWMgdm9pZCB2MnIwX21lbTJkaXNrZHFiKHZvaWQgKmRwLCBzdHJ1Y3QgZHF1b3QgKmRxdW90KTsKK3N0YXRpYyB2b2lkIHYycjBfZGlzazJtZW1kcWIoc3RydWN0IGRxdW90ICpkcXVvdCwgdm9pZCAqZHApOworc3RhdGljIGludCB2MnIwX2lzX2lkKHZvaWQgKmRwLCBzdHJ1Y3QgZHF1b3QgKmRxdW90KTsKK3N0YXRpYyB2b2lkIHYycjFfbWVtMmRpc2tkcWIodm9pZCAqZHAsIHN0cnVjdCBkcXVvdCAqZHF1b3QpOworc3RhdGljIHZvaWQgdjJyMV9kaXNrMm1lbWRxYihzdHJ1Y3QgZHF1b3QgKmRxdW90LCB2b2lkICpkcCk7CitzdGF0aWMgaW50IHYycjFfaXNfaWQodm9pZCAqZHAsIHN0cnVjdCBkcXVvdCAqZHF1b3QpOwogCi1zdGF0aWMgc3RydWN0IHF0cmVlX2ZtdF9vcGVyYXRpb25zIHYyX3F0cmVlX29wcyA9IHsKLQkubWVtMmRpc2tfZHFibGsgPSB2Ml9tZW0yZGlza2RxYiwKLQkuZGlzazJtZW1fZHFibGsgPSB2Ml9kaXNrMm1lbWRxYiwKLQkuaXNfaWQgPSB2Ml9pc19pZCwKK3N0YXRpYyBzdHJ1Y3QgcXRyZWVfZm10X29wZXJhdGlvbnMgdjJyMF9xdHJlZV9vcHMgPSB7CisJLm1lbTJkaXNrX2RxYmxrID0gdjJyMF9tZW0yZGlza2RxYiwKKwkuZGlzazJtZW1fZHFibGsgPSB2MnIwX2Rpc2sybWVtZHFiLAorCS5pc19pZCA9IHYycjBfaXNfaWQsCit9OworCitzdGF0aWMgc3RydWN0IHF0cmVlX2ZtdF9vcGVyYXRpb25zIHYycjFfcXRyZWVfb3BzID0geworCS5tZW0yZGlza19kcWJsayA9IHYycjFfbWVtMmRpc2tkcWIsCisJLmRpc2sybWVtX2RxYmxrID0gdjJyMV9kaXNrMm1lbWRxYiwKKwkuaXNfaWQgPSB2MnIxX2lzX2lkLAogfTsKIAogI2RlZmluZSBRVU9UQUJMT0NLX0JJVFMgMTAKQEAgLTQ2LDIzICs1NSwzMyBAQAogCXJldHVybiBibG9ja3MgPDwgUVVPVEFCTE9DS19CSVRTOwogfQogCitzdGF0aWMgaW50IHYyX3JlYWRfaGVhZGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLAorCQkJICBzdHJ1Y3QgdjJfZGlza19kcWhlYWRlciAqZHFoZWFkKQoreworCXNzaXplX3Qgc2l6ZTsKKworCXNpemUgPSBzYi0+c19vcC0+cXVvdGFfcmVhZChzYiwgdHlwZSwgKGNoYXIgKilkcWhlYWQsCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWhlYWRlciksIDApOworCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWhlYWRlcikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicXVvdGFfdjI6IEZhaWxlZCBoZWFkZXIgcmVhZDoiCisJCSAgICAgICAiIGV4cGVjdGVkPSV6ZCBnb3Q9JXpkXG4iLAorCQkJc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxaGVhZGVyKSwgc2l6ZSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKwogLyogQ2hlY2sgd2hldGhlciBnaXZlbiBmaWxlIGlzIHJlYWxseSB2ZnN2MCBxdW90YWZpbGUgKi8KIHN0YXRpYyBpbnQgdjJfY2hlY2tfcXVvdGFfZmlsZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKIHsKIAlzdHJ1Y3QgdjJfZGlza19kcWhlYWRlciBkcWhlYWQ7Ci0Jc3NpemVfdCBzaXplOwogCXN0YXRpYyBjb25zdCB1aW50IHF1b3RhX21hZ2ljc1tdID0gVjJfSU5JVFFNQUdJQ1M7CiAJc3RhdGljIGNvbnN0IHVpbnQgcXVvdGFfdmVyc2lvbnNbXSA9IFYyX0lOSVRRVkVSU0lPTlM7CiAgCi0Jc2l6ZSA9IHNiLT5zX29wLT5xdW90YV9yZWFkKHNiLCB0eXBlLCAoY2hhciAqKSZkcWhlYWQsCi0JCQkJICAgIHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWhlYWRlciksIDApOwotCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWhlYWRlcikpIHsKLQkJcHJpbnRrKCJxdW90YV92MjogZmFpbGVkIHJlYWQgZXhwZWN0ZWQ9JXpkIGdvdD0lemRcbiIsCi0JCQlzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFoZWFkZXIpLCBzaXplKTsKKwlpZiAoIXYyX3JlYWRfaGVhZGVyKHNiLCB0eXBlLCAmZHFoZWFkKSkKIAkJcmV0dXJuIDA7Ci0JfQogCWlmIChsZTMyX3RvX2NwdShkcWhlYWQuZHFoX21hZ2ljKSAhPSBxdW90YV9tYWdpY3NbdHlwZV0gfHwKLQkgICAgbGUzMl90b19jcHUoZHFoZWFkLmRxaF92ZXJzaW9uKSAhPSBxdW90YV92ZXJzaW9uc1t0eXBlXSkKKwkgICAgbGUzMl90b19jcHUoZHFoZWFkLmRxaF92ZXJzaW9uKSA+IHF1b3RhX3ZlcnNpb25zW3R5cGVdKQogCQlyZXR1cm4gMDsKIAlyZXR1cm4gMTsKIH0KQEAgLTcxLDE0ICs5MCwyMCBAQAogc3RhdGljIGludCB2Ml9yZWFkX2ZpbGVfaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKIHsKIAlzdHJ1Y3QgdjJfZGlza19kcWluZm8gZGluZm87CisJc3RydWN0IHYyX2Rpc2tfZHFoZWFkZXIgZHFoZWFkOwogCXN0cnVjdCBtZW1fZHFpbmZvICppbmZvID0gc2JfZHFpbmZvKHNiLCB0eXBlKTsKIAlzdHJ1Y3QgcXRyZWVfbWVtX2RxaW5mbyAqcWluZm87CiAJc3NpemVfdCBzaXplOworCXVuc2lnbmVkIGludCB2ZXJzaW9uOworCisJaWYgKCF2Ml9yZWFkX2hlYWRlcihzYiwgdHlwZSwgJmRxaGVhZCkpCisJCXJldHVybiAwOworCXZlcnNpb24gPSBsZTMyX3RvX2NwdShkcWhlYWQuZHFoX3ZlcnNpb24pOwogCiAJc2l6ZSA9IHNiLT5zX29wLT5xdW90YV9yZWFkKHNiLCB0eXBlLCAoY2hhciAqKSZkaW5mbywKIAkgICAgICAgc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxaW5mbyksIFYyX0RRSU5GT09GRik7CiAJaWYgKHNpemUgIT0gc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxaW5mbykpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgcmVhZCBpbmZvIHN0cnVjdHVyZSBvbiBkZXZpY2UgJXMuXG4iLAorCQlwcmludGsoS0VSTl9XQVJOSU5HICJxdW90YV92MjogQ2FuJ3QgcmVhZCBpbmZvIHN0cnVjdHVyZSBvbiBkZXZpY2UgJXMuXG4iLAogCQkJc2ItPnNfaWQpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtODksOSArMTE0LDE1IEBACiAJCXJldHVybiAtMTsKIAl9CiAJcWluZm8gPSBpbmZvLT5kcWlfcHJpdjsKLQkvKiBsaW1pdHMgYXJlIHN0b3JlZCBhcyB1bnNpZ25lZCAzMi1iaXQgZGF0YSAqLwotCWluZm8tPmRxaV9tYXhibGltaXQgPSAweGZmZmZmZmZmOwotCWluZm8tPmRxaV9tYXhpbGltaXQgPSAweGZmZmZmZmZmOworCWlmICh2ZXJzaW9uID09IDApIHsKKwkJLyogbGltaXRzIGFyZSBzdG9yZWQgYXMgdW5zaWduZWQgMzItYml0IGRhdGEgKi8KKwkJaW5mby0+ZHFpX21heGJsaW1pdCA9IDB4ZmZmZmZmZmY7CisJCWluZm8tPmRxaV9tYXhpbGltaXQgPSAweGZmZmZmZmZmOworCX0gZWxzZSB7CisJCS8qIHVzZWQgc3BhY2UgaXMgc3RvcmVkIGFzIHVuc2lnbmVkIDY0LWJpdCB2YWx1ZSAqLworCQlpbmZvLT5kcWlfbWF4YmxpbWl0ID0gMHhmZmZmZmZmZmZmZmZmZmZmOwkvKiAyXjY0LTEgKi8KKwkJaW5mby0+ZHFpX21heGlsaW1pdCA9IDB4ZmZmZmZmZmZmZmZmZmZmZjsKKwl9CiAJaW5mby0+ZHFpX2JncmFjZSA9IGxlMzJfdG9fY3B1KGRpbmZvLmRxaV9iZ3JhY2UpOwogCWluZm8tPmRxaV9pZ3JhY2UgPSBsZTMyX3RvX2NwdShkaW5mby5kcWlfaWdyYWNlKTsKIAlpbmZvLT5kcWlfZmxhZ3MgPSBsZTMyX3RvX2NwdShkaW5mby5kcWlfZmxhZ3MpOwpAQCAtMTAzLDggKzEzNCwxMyBAQAogCXFpbmZvLT5kcWlfYmxvY2tzaXplX2JpdHMgPSBWMl9EUUJMS1NJWkVfQklUUzsKIAlxaW5mby0+ZHFpX3VzYWJsZV9icyA9IDEgPDwgVjJfRFFCTEtTSVpFX0JJVFM7CiAJcWluZm8tPmRxaV9xdHJlZV9kZXB0aCA9IHF0cmVlX2RlcHRoKHFpbmZvKTsKLQlxaW5mby0+ZHFpX2VudHJ5X3NpemUgPSBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspOwotCXFpbmZvLT5kcWlfb3BzID0gJnYyX3F0cmVlX29wczsKKwlpZiAodmVyc2lvbiA9PSAwKSB7CisJCXFpbmZvLT5kcWlfZW50cnlfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdjJyMF9kaXNrX2RxYmxrKTsKKwkJcWluZm8tPmRxaV9vcHMgPSAmdjJyMF9xdHJlZV9vcHM7CisJfSBlbHNlIHsKKwkJcWluZm8tPmRxaV9lbnRyeV9zaXplID0gc2l6ZW9mKHN0cnVjdCB2MnIxX2Rpc2tfZHFibGspOworCQlxaW5mby0+ZHFpX29wcyA9ICZ2MnIxX3F0cmVlX29wczsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzNSw5ICsxNzEsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB2Ml9kaXNrMm1lbWRxYihzdHJ1Y3QgZHF1b3QgKmRxdW90LCB2b2lkICpkcCkKK3N0YXRpYyB2b2lkIHYycjBfZGlzazJtZW1kcWIoc3RydWN0IGRxdW90ICpkcXVvdCwgdm9pZCAqZHApCiB7Ci0Jc3RydWN0IHYyX2Rpc2tfZHFibGsgKmQgPSBkcCwgZW1wdHk7CisJc3RydWN0IHYycjBfZGlza19kcWJsayAqZCA9IGRwLCBlbXB0eTsKIAlzdHJ1Y3QgbWVtX2RxYmxrICptID0gJmRxdW90LT5kcV9kcWI7CiAKIAltLT5kcWJfaWhhcmRsaW1pdCA9IGxlMzJfdG9fY3B1KGQtPmRxYl9paGFyZGxpbWl0KTsKQEAgLTE0OSwxNSArMTg1LDE1IEBACiAJbS0+ZHFiX2N1cnNwYWNlID0gbGU2NF90b19jcHUoZC0+ZHFiX2N1cnNwYWNlKTsKIAltLT5kcWJfYnRpbWUgPSBsZTY0X3RvX2NwdShkLT5kcWJfYnRpbWUpOwogCS8qIFdlIG5lZWQgdG8gZXNjYXBlIGJhY2sgYWxsLXplcm8gc3RydWN0dXJlICovCi0JbWVtc2V0KCZlbXB0eSwgMCwgc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxYmxrKSk7CisJbWVtc2V0KCZlbXB0eSwgMCwgc2l6ZW9mKHN0cnVjdCB2MnIwX2Rpc2tfZHFibGspKTsKIAllbXB0eS5kcWJfaXRpbWUgPSBjcHVfdG9fbGU2NCgxKTsKLQlpZiAoIW1lbWNtcCgmZW1wdHksIGRwLCBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspKSkKKwlpZiAoIW1lbWNtcCgmZW1wdHksIGRwLCBzaXplb2Yoc3RydWN0IHYycjBfZGlza19kcWJsaykpKQogCQltLT5kcWJfaXRpbWUgPSAwOwogfQogCi1zdGF0aWMgdm9pZCB2Ml9tZW0yZGlza2RxYih2b2lkICpkcCwgc3RydWN0IGRxdW90ICpkcXVvdCkKK3N0YXRpYyB2b2lkIHYycjBfbWVtMmRpc2tkcWIodm9pZCAqZHAsIHN0cnVjdCBkcXVvdCAqZHF1b3QpCiB7Ci0Jc3RydWN0IHYyX2Rpc2tfZHFibGsgKmQgPSBkcDsKKwlzdHJ1Y3QgdjJyMF9kaXNrX2RxYmxrICpkID0gZHA7CiAJc3RydWN0IG1lbV9kcWJsayAqbSA9ICZkcXVvdC0+ZHFfZHFiOwogCXN0cnVjdCBxdHJlZV9tZW1fZHFpbmZvICppbmZvID0KIAkJCXNiX2RxaW5mbyhkcXVvdC0+ZHFfc2IsIGRxdW90LT5kcV90eXBlKS0+ZHFpX3ByaXY7CkBAIC0xNzUsOSArMjExLDYwIEBACiAJCWQtPmRxYl9pdGltZSA9IGNwdV90b19sZTY0KDEpOwogfQogCi1zdGF0aWMgaW50IHYyX2lzX2lkKHZvaWQgKmRwLCBzdHJ1Y3QgZHF1b3QgKmRxdW90KQorc3RhdGljIGludCB2MnIwX2lzX2lkKHZvaWQgKmRwLCBzdHJ1Y3QgZHF1b3QgKmRxdW90KQogewotCXN0cnVjdCB2Ml9kaXNrX2RxYmxrICpkID0gZHA7CisJc3RydWN0IHYycjBfZGlza19kcWJsayAqZCA9IGRwOworCXN0cnVjdCBxdHJlZV9tZW1fZHFpbmZvICppbmZvID0KKwkJCXNiX2RxaW5mbyhkcXVvdC0+ZHFfc2IsIGRxdW90LT5kcV90eXBlKS0+ZHFpX3ByaXY7CisKKwlpZiAocXRyZWVfZW50cnlfdW51c2VkKGluZm8sIGRwKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGxlMzJfdG9fY3B1KGQtPmRxYl9pZCkgPT0gZHF1b3QtPmRxX2lkOworfQorCitzdGF0aWMgdm9pZCB2MnIxX2Rpc2sybWVtZHFiKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHZvaWQgKmRwKQoreworCXN0cnVjdCB2MnIxX2Rpc2tfZHFibGsgKmQgPSBkcCwgZW1wdHk7CisJc3RydWN0IG1lbV9kcWJsayAqbSA9ICZkcXVvdC0+ZHFfZHFiOworCisJbS0+ZHFiX2loYXJkbGltaXQgPSBsZTY0X3RvX2NwdShkLT5kcWJfaWhhcmRsaW1pdCk7CisJbS0+ZHFiX2lzb2Z0bGltaXQgPSBsZTY0X3RvX2NwdShkLT5kcWJfaXNvZnRsaW1pdCk7CisJbS0+ZHFiX2N1cmlub2RlcyA9IGxlNjRfdG9fY3B1KGQtPmRxYl9jdXJpbm9kZXMpOworCW0tPmRxYl9pdGltZSA9IGxlNjRfdG9fY3B1KGQtPmRxYl9pdGltZSk7CisJbS0+ZHFiX2JoYXJkbGltaXQgPSB2Ml9xYnRvcyhsZTY0X3RvX2NwdShkLT5kcWJfYmhhcmRsaW1pdCkpOworCW0tPmRxYl9ic29mdGxpbWl0ID0gdjJfcWJ0b3MobGU2NF90b19jcHUoZC0+ZHFiX2Jzb2Z0bGltaXQpKTsKKwltLT5kcWJfY3Vyc3BhY2UgPSBsZTY0X3RvX2NwdShkLT5kcWJfY3Vyc3BhY2UpOworCW0tPmRxYl9idGltZSA9IGxlNjRfdG9fY3B1KGQtPmRxYl9idGltZSk7CisJLyogV2UgbmVlZCB0byBlc2NhcGUgYmFjayBhbGwtemVybyBzdHJ1Y3R1cmUgKi8KKwltZW1zZXQoJmVtcHR5LCAwLCBzaXplb2Yoc3RydWN0IHYycjFfZGlza19kcWJsaykpOworCWVtcHR5LmRxYl9pdGltZSA9IGNwdV90b19sZTY0KDEpOworCWlmICghbWVtY21wKCZlbXB0eSwgZHAsIHNpemVvZihzdHJ1Y3QgdjJyMV9kaXNrX2RxYmxrKSkpCisJCW0tPmRxYl9pdGltZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHYycjFfbWVtMmRpc2tkcWIodm9pZCAqZHAsIHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisJc3RydWN0IHYycjFfZGlza19kcWJsayAqZCA9IGRwOworCXN0cnVjdCBtZW1fZHFibGsgKm0gPSAmZHF1b3QtPmRxX2RxYjsKKwlzdHJ1Y3QgcXRyZWVfbWVtX2RxaW5mbyAqaW5mbyA9CisJCQlzYl9kcWluZm8oZHF1b3QtPmRxX3NiLCBkcXVvdC0+ZHFfdHlwZSktPmRxaV9wcml2OworCisJZC0+ZHFiX2loYXJkbGltaXQgPSBjcHVfdG9fbGU2NChtLT5kcWJfaWhhcmRsaW1pdCk7CisJZC0+ZHFiX2lzb2Z0bGltaXQgPSBjcHVfdG9fbGU2NChtLT5kcWJfaXNvZnRsaW1pdCk7CisJZC0+ZHFiX2N1cmlub2RlcyA9IGNwdV90b19sZTY0KG0tPmRxYl9jdXJpbm9kZXMpOworCWQtPmRxYl9pdGltZSA9IGNwdV90b19sZTY0KG0tPmRxYl9pdGltZSk7CisJZC0+ZHFiX2JoYXJkbGltaXQgPSBjcHVfdG9fbGU2NCh2Ml9zdG9xYihtLT5kcWJfYmhhcmRsaW1pdCkpOworCWQtPmRxYl9ic29mdGxpbWl0ID0gY3B1X3RvX2xlNjQodjJfc3RvcWIobS0+ZHFiX2Jzb2Z0bGltaXQpKTsKKwlkLT5kcWJfY3Vyc3BhY2UgPSBjcHVfdG9fbGU2NChtLT5kcWJfY3Vyc3BhY2UpOworCWQtPmRxYl9idGltZSA9IGNwdV90b19sZTY0KG0tPmRxYl9idGltZSk7CisJZC0+ZHFiX2lkID0gY3B1X3RvX2xlMzIoZHF1b3QtPmRxX2lkKTsKKwlpZiAocXRyZWVfZW50cnlfdW51c2VkKGluZm8sIGRwKSkKKwkJZC0+ZHFiX2l0aW1lID0gY3B1X3RvX2xlNjQoMSk7Cit9CisKK3N0YXRpYyBpbnQgdjJyMV9pc19pZCh2b2lkICpkcCwgc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlzdHJ1Y3QgdjJyMV9kaXNrX2RxYmxrICpkID0gZHA7CiAJc3RydWN0IHF0cmVlX21lbV9kcWluZm8gKmluZm8gPQogCQkJc2JfZHFpbmZvKGRxdW90LT5kcV9zYiwgZHF1b3QtPmRxX3R5cGUpLT5kcWlfcHJpdjsKIApAQCAtMjA3LDcgKzI5NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcXVvdGFfZm9ybWF0X29wcyB2Ml9mb3JtYXRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBxdW90YV9mb3JtYXRfb3BzIHYyX2Zvcm1hdF9vcHMgPSB7CiAJLmNoZWNrX3F1b3RhX2ZpbGUJPSB2Ml9jaGVja19xdW90YV9maWxlLAogCS5yZWFkX2ZpbGVfaW5mbwkJPSB2Ml9yZWFkX2ZpbGVfaW5mbywKIAkud3JpdGVfZmlsZV9pbmZvCT0gdjJfd3JpdGVfZmlsZV9pbmZvLApAQCAtMjE3LDIwICszMDQsMzIgQEAKIAkucmVsZWFzZV9kcWJsawkJPSB2Ml9yZWxlYXNlX2RxdW90LAogfTsKIAotc3RhdGljIHN0cnVjdCBxdW90YV9mb3JtYXRfdHlwZSB2Ml9xdW90YV9mb3JtYXQgPSB7CitzdGF0aWMgc3RydWN0IHF1b3RhX2Zvcm1hdF90eXBlIHYycjBfcXVvdGFfZm9ybWF0ID0gewogCS5xZl9mbXRfaWQJPSBRRk1UX1ZGU19WMCwKIAkucWZfb3BzCQk9ICZ2Ml9mb3JtYXRfb3BzLAogCS5xZl9vd25lcgk9IFRISVNfTU9EVUxFCiB9OwogCitzdGF0aWMgc3RydWN0IHF1b3RhX2Zvcm1hdF90eXBlIHYycjFfcXVvdGFfZm9ybWF0ID0geworCS5xZl9mbXRfaWQJPSBRRk1UX1ZGU19WMSwKKwkucWZfb3BzCQk9ICZ2Ml9mb3JtYXRfb3BzLAorCS5xZl9vd25lcgk9IFRISVNfTU9EVUxFCit9OworCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3YyX3F1b3RhX2Zvcm1hdCh2b2lkKQogewotCXJldHVybiByZWdpc3Rlcl9xdW90YV9mb3JtYXQoJnYyX3F1b3RhX2Zvcm1hdCk7CisJaW50IHJldDsKKworCXJldCA9IHJlZ2lzdGVyX3F1b3RhX2Zvcm1hdCgmdjJyMF9xdW90YV9mb3JtYXQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIHJlZ2lzdGVyX3F1b3RhX2Zvcm1hdCgmdjJyMV9xdW90YV9mb3JtYXQpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF92Ml9xdW90YV9mb3JtYXQodm9pZCkKIHsKLQl1bnJlZ2lzdGVyX3F1b3RhX2Zvcm1hdCgmdjJfcXVvdGFfZm9ybWF0KTsKKwl1bnJlZ2lzdGVyX3F1b3RhX2Zvcm1hdCgmdjJyMF9xdW90YV9mb3JtYXQpOworCXVucmVnaXN0ZXJfcXVvdGFfZm9ybWF0KCZ2MnIxX3F1b3RhX2Zvcm1hdCk7CiB9CiAKIG1vZHVsZV9pbml0KGluaXRfdjJfcXVvdGFfZm9ybWF0KTsKZGlmZiAtLWdpdCBhL2ZzL3F1b3RhL3F1b3RhaW9fdjIuaCBiL2ZzL3F1b3RhL3F1b3RhaW9fdjIuaAppbmRleCA1MzBmZTU4Li5mMTk2NmI0IDEwMDY0NAotLS0gYS9mcy9xdW90YS9xdW90YWlvX3YyLmgKKysrIGIvZnMvcXVvdGEvcXVvdGFpb192Mi5oCkBAIC0xNyw4ICsxNyw4IEBACiB9CiAKICNkZWZpbmUgVjJfSU5JVFFWRVJTSU9OUyB7XAotCTAsCQkvKiBVU1JRVU9UQSAqL1wKLQkwCQkvKiBHUlBRVU9UQSAqL1wKKwkxLAkJLyogVVNSUVVPVEEgKi9cCisJMQkJLyogR1JQUVVPVEEgKi9cCiB9CiAKIC8qIEZpcnN0IGdlbmVyaWMgaGVhZGVyICovCkBAIC0zMiw3ICszMiw3IEBACiAgKiAoYXMgaXQgYXBwZWFycyBvbiBkaXNrKSAtIHRoZSBmaWxlIGlzIGEgcmFkaXggdHJlZSB3aG9zZSBsZWF2ZXMgcG9pbnQKICAqIHRvIGJsb2NrcyBvZiB0aGVzZSBzdHJ1Y3R1cmVzLgogICovCi1zdHJ1Y3QgdjJfZGlza19kcWJsayB7CitzdHJ1Y3QgdjJyMF9kaXNrX2RxYmxrIHsKIAlfX2xlMzIgZHFiX2lkOwkJLyogaWQgdGhpcyBxdW90YSBhcHBsaWVzIHRvICovCiAJX19sZTMyIGRxYl9paGFyZGxpbWl0OwkvKiBhYnNvbHV0ZSBsaW1pdCBvbiBhbGxvY2F0ZWQgaW5vZGVzICovCiAJX19sZTMyIGRxYl9pc29mdGxpbWl0OwkvKiBwcmVmZXJyZWQgaW5vZGUgbGltaXQgKi8KQEAgLTQ0LDYgKzQ0LDE5IEBACiAJX19sZTY0IGRxYl9pdGltZTsJLyogdGltZSBsaW1pdCBmb3IgZXhjZXNzaXZlIGlub2RlIHVzZSAqLwogfTsKIAorc3RydWN0IHYycjFfZGlza19kcWJsayB7CisJX19sZTMyIGRxYl9pZDsJCS8qIGlkIHRoaXMgcXVvdGEgYXBwbGllcyB0byAqLworCV9fbGUzMiBkcWJfcGFkOworCV9fbGU2NCBkcWJfaWhhcmRsaW1pdDsJLyogYWJzb2x1dGUgbGltaXQgb24gYWxsb2NhdGVkIGlub2RlcyAqLworCV9fbGU2NCBkcWJfaXNvZnRsaW1pdDsJLyogcHJlZmVycmVkIGlub2RlIGxpbWl0ICovCisJX19sZTY0IGRxYl9jdXJpbm9kZXM7CS8qIGN1cnJlbnQgIyBhbGxvY2F0ZWQgaW5vZGVzICovCisJX19sZTY0IGRxYl9iaGFyZGxpbWl0OwkvKiBhYnNvbHV0ZSBsaW1pdCBvbiBkaXNrIHNwYWNlIChpbiBRVU9UQUJMT0NLX1NJWkUpICovCisJX19sZTY0IGRxYl9ic29mdGxpbWl0OwkvKiBwcmVmZXJyZWQgbGltaXQgb24gZGlzayBzcGFjZSAoaW4gUVVPVEFCTE9DS19TSVpFKSAqLworCV9fbGU2NCBkcWJfY3Vyc3BhY2U7CS8qIGN1cnJlbnQgc3BhY2Ugb2NjdXBpZWQgKGluIGJ5dGVzKSAqLworCV9fbGU2NCBkcWJfYnRpbWU7CS8qIHRpbWUgbGltaXQgZm9yIGV4Y2Vzc2l2ZSBkaXNrIHVzZSAqLworCV9fbGU2NCBkcWJfaXRpbWU7CS8qIHRpbWUgbGltaXQgZm9yIGV4Y2Vzc2l2ZSBpbm9kZSB1c2UgKi8KK307CisKIC8qIEhlYWRlciB3aXRoIHR5cGUgYW5kIHZlcnNpb24gc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KIHN0cnVjdCB2Ml9kaXNrX2RxaW5mbyB7CiAJX19sZTMyIGRxaV9iZ3JhY2U7CS8qIFRpbWUgYmVmb3JlIGJsb2NrIHNvZnQgbGltaXQgYmVjb21lcyBoYXJkIGxpbWl0ICovCmRpZmYgLS1naXQgYS9mcy9zeW5jLmMgYi9mcy9zeW5jLmMKaW5kZXggZDEwNDU5MS4uMzY3NTJhNiAxMDA2NDQKLS0tIGEvZnMvc3luYy5jCisrKyBiL2ZzL3N5bmMuYwpAQCAtMjk1LDEwICsyOTUsMTEgQEAKICAqLwogaW50IGdlbmVyaWNfd3JpdGVfc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHBvcywgbG9mZl90IGNvdW50KQogewotCWlmICghKGZpbGUtPmZfZmxhZ3MgJiBPX1NZTkMpICYmICFJU19TWU5DKGZpbGUtPmZfbWFwcGluZy0+aG9zdCkpCisJaWYgKCEoZmlsZS0+Zl9mbGFncyAmIE9fRFNZTkMpICYmICFJU19TWU5DKGZpbGUtPmZfbWFwcGluZy0+aG9zdCkpCiAJCXJldHVybiAwOwogCXJldHVybiB2ZnNfZnN5bmNfcmFuZ2UoZmlsZSwgZmlsZS0+Zl9wYXRoLmRlbnRyeSwgcG9zLAotCQkJICAgICAgIHBvcyArIGNvdW50IC0gMSwgMSk7CisJCQkgICAgICAgcG9zICsgY291bnQgLSAxLAorCQkJICAgICAgIChmaWxlLT5mX2ZsYWdzICYgX19PX1NZTkMpID8gMCA6IDEpOwogfQogRVhQT1JUX1NZTUJPTChnZW5lcmljX3dyaXRlX3N5bmMpOwogCkBAIC00NTIsOSArNDUzLDcgQEAKIAogCXJldCA9IDA7CiAJaWYgKGZsYWdzICYgU1lOQ19GSUxFX1JBTkdFX1dBSVRfQkVGT1JFKSB7Ci0JCXJldCA9IHdhaXRfb25fcGFnZV93cml0ZWJhY2tfcmFuZ2UobWFwcGluZywKLQkJCQkJb2Zmc2V0ID4+IFBBR0VfQ0FDSEVfU0hJRlQsCi0JCQkJCWVuZGJ5dGUgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJCXJldCA9IGZpbGVtYXBfZmRhdGF3YWl0X3JhbmdlKG1hcHBpbmcsIG9mZnNldCwgZW5kYnl0ZSk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7CiAJfQpAQCAtNDY3LDkgKzQ2Niw3IEBACiAJfQogCiAJaWYgKGZsYWdzICYgU1lOQ19GSUxFX1JBTkdFX1dBSVRfQUZURVIpIHsKLQkJcmV0ID0gd2FpdF9vbl9wYWdlX3dyaXRlYmFja19yYW5nZShtYXBwaW5nLAotCQkJCQlvZmZzZXQgPj4gUEFHRV9DQUNIRV9TSElGVCwKLQkJCQkJZW5kYnl0ZSA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJcmV0ID0gZmlsZW1hcF9mZGF0YXdhaXRfcmFuZ2UobWFwcGluZywgb2Zmc2V0LCBlbmRieXRlKTsKIAl9CiBvdXQ6CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL2Rpci5jIGIvZnMvc3lzZnMvZGlyLmMKaW5kZXggZTAyMDE4My4uZjA1ZjIzMCAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvZGlyLmMKKysrIGIvZnMvc3lzZnMvZGlyLmMKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlICJzeXNmcy5oIgogCiBERUZJTkVfTVVURVgoc3lzZnNfbXV0ZXgpOwotREVGSU5FX01VVEVYKHN5c2ZzX3JlbmFtZV9tdXRleCk7CiBERUZJTkVfU1BJTkxPQ0soc3lzZnNfYXNzb2NfbG9jayk7CiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3lzZnNfaW5vX2xvY2spOwpAQCAtODUsNDYgKzg0LDYgQEAKIH0KIAogLyoqCi0gKglzeXNmc19nZXRfZGVudHJ5IC0gZ2V0IGRlbnRyeSBmb3IgdGhlIGdpdmVuIHN5c2ZzX2RpcmVudAotICoJQHNkOiBzeXNmc19kaXJlbnQgb2YgaW50ZXJlc3QKLSAqCi0gKglHZXQgZGVudHJ5IGZvciBAc2QuICBEZW50cnkgaXMgbG9va2VkIHVwIGlmIGN1cnJlbnRseSBub3QKLSAqCXByZXNlbnQuICBUaGlzIGZ1bmN0aW9uIGRlc2NlbmRzIGZyb20gdGhlIHJvb3QgbG9va2luZyB1cAotICoJZGVudHJ5IGZvciBlYWNoIHN0ZXAuCi0gKgotICoJTE9DS0lORzoKLSAqCW11dGV4X2xvY2soc3lzZnNfcmVuYW1lX211dGV4KQotICoKLSAqCVJFVFVSTlM6Ci0gKglQb2ludGVyIHRvIGZvdW5kIGRlbnRyeSBvbiBzdWNjZXNzLCBFUlJfUFRSKCkgdmFsdWUgb24gZXJyb3IuCi0gKi8KLXN0cnVjdCBkZW50cnkgKnN5c2ZzX2dldF9kZW50cnkoc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QpCi17Ci0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZGdldChzeXNmc19zYi0+c19yb290KTsKLQotCXdoaWxlIChkZW50cnktPmRfZnNkYXRhICE9IHNkKSB7Ci0JCXN0cnVjdCBzeXNmc19kaXJlbnQgKmN1cjsKLQkJc3RydWN0IGRlbnRyeSAqcGFyZW50OwotCi0JCS8qIGZpbmQgdGhlIGZpcnN0IGFuY2VzdG9yIHdoaWNoIGhhc24ndCBiZWVuIGxvb2tlZCB1cCAqLwotCQljdXIgPSBzZDsKLQkJd2hpbGUgKGN1ci0+c19wYXJlbnQgIT0gZGVudHJ5LT5kX2ZzZGF0YSkKLQkJCWN1ciA9IGN1ci0+c19wYXJlbnQ7Ci0KLQkJLyogbG9vayBpdCB1cCAqLwotCQlwYXJlbnQgPSBkZW50cnk7Ci0JCW11dGV4X2xvY2soJnBhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCk7Ci0JCWRlbnRyeSA9IGxvb2t1cF9vbmVfbm9wZXJtKGN1ci0+c19uYW1lLCBwYXJlbnQpOwotCQltdXRleF91bmxvY2soJnBhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCk7Ci0JCWRwdXQocGFyZW50KTsKLQotCQlpZiAoSVNfRVJSKGRlbnRyeSkpCi0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIGRlbnRyeTsKLX0KLQotLyoqCiAgKglzeXNmc19nZXRfYWN0aXZlIC0gZ2V0IGFuIGFjdGl2ZSByZWZlcmVuY2UgdG8gc3lzZnNfZGlyZW50CiAgKglAc2Q6IHN5c2ZzX2RpcmVudCB0byBnZXQgYW4gYWN0aXZlIHJlZmVyZW5jZSB0bwogICoKQEAgLTI5OCw3ICsyNTcsNjEgQEAKIAkJZ290byByZXBlYXQ7CiB9CiAKLXN0YXRpYyB2b2lkIHN5c2ZzX2RfaXB1dChzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3N0YXRpYyBpbnQgc3lzZnNfZGVudHJ5X2RlbGV0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QgPSBkZW50cnktPmRfZnNkYXRhOworCXJldHVybiAhIShzZC0+c19mbGFncyAmIFNZU0ZTX0ZMQUdfUkVNT1ZFRCk7Cit9CisKK3N0YXRpYyBpbnQgc3lzZnNfZGVudHJ5X3JldmFsaWRhdGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCA9IGRlbnRyeS0+ZF9mc2RhdGE7CisJaW50IGlzX2RpcjsKKworCW11dGV4X2xvY2soJnN5c2ZzX211dGV4KTsKKworCS8qIFRoZSBzeXNmcyBkaXJlbnQgaGFzIGJlZW4gZGVsZXRlZCAqLworCWlmIChzZC0+c19mbGFncyAmIFNZU0ZTX0ZMQUdfUkVNT1ZFRCkKKwkJZ290byBvdXRfYmFkOworCisJLyogVGhlIHN5c2ZzIGRpcmVudCBoYXMgYmVlbiBtb3ZlZD8gKi8KKwlpZiAoZGVudHJ5LT5kX3BhcmVudC0+ZF9mc2RhdGEgIT0gc2QtPnNfcGFyZW50KQorCQlnb3RvIG91dF9iYWQ7CisKKwkvKiBUaGUgc3lzZnMgZGlyZW50IGhhcyBiZWVuIHJlbmFtZWQgKi8KKwlpZiAoc3RyY21wKGRlbnRyeS0+ZF9uYW1lLm5hbWUsIHNkLT5zX25hbWUpICE9IDApCisJCWdvdG8gb3V0X2JhZDsKKworCW11dGV4X3VubG9jaygmc3lzZnNfbXV0ZXgpOworb3V0X3ZhbGlkOgorCXJldHVybiAxOworb3V0X2JhZDoKKwkvKiBSZW1vdmUgdGhlIGRlbnRyeSBmcm9tIHRoZSBkY2FjaGUgaGFzaGVzLgorCSAqIElmIHRoaXMgaXMgYSBkZWxldGVkIGRlbnRyeSB3ZSB1c2UgZF9kcm9wIGluc3RlYWQgb2YgZF9kZWxldGUKKwkgKiBzbyBzeXNmcyBkb2Vzbid0IG5lZWQgdG8gY29wZSB3aXRoIG5lZ2F0aXZlIGRlbnRyaWVzLgorCSAqCisJICogSWYgdGhpcyBpcyBhIGRlbnRyeSB0aGF0IGhhcyBzaW1wbHkgYmVlbiByZW5hbWVkIHdlCisJICogdXNlIGRfZHJvcCB0byByZW1vdmUgaXQgZnJvbSB0aGUgZGNhY2hlIGxvb2t1cCBvbiBpdHMKKwkgKiBvbGQgcGFyZW50LiAgSWYgdGhpcyBkZW50cnkgcGVyc2lzdHMgbGF0ZXIgd2hlbiBhIGxvb2t1cAorCSAqIGlzIHBlcmZvcm1lZCBhdCBpdHMgbmV3IG5hbWUgdGhlIGRlbnRyeSB3aWxsIGJlIHJlYWRkZWQKKwkgKiB0byB0aGUgZGNhY2hlIGhhc2hlcy4KKwkgKi8KKwlpc19kaXIgPSAoc3lzZnNfdHlwZShzZCkgPT0gU1lTRlNfRElSKTsKKwltdXRleF91bmxvY2soJnN5c2ZzX211dGV4KTsKKwlpZiAoaXNfZGlyKSB7CisJCS8qIElmIHdlIGhhdmUgc3VibW91bnRzIHdlIG11c3QgYWxsb3cgdGhlIHZmcyBjYWNoZXMKKwkJICogdG8gbGllIGFib3V0IHRoZSBzdGF0ZSBvZiB0aGUgZmlsZXN5c3RlbSB0byBwcmV2ZW50CisJCSAqIGxlYWtzIGFuZCBvdGhlciBuYXN0eSB0aGluZ3MuCisJCSAqLworCQlpZiAoaGF2ZV9zdWJtb3VudHMoZGVudHJ5KSkKKwkJCWdvdG8gb3V0X3ZhbGlkOworCQlzaHJpbmtfZGNhY2hlX3BhcmVudChkZW50cnkpOworCX0KKwlkX2Ryb3AoZGVudHJ5KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3lzZnNfZGVudHJ5X2lwdXQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXN0cnVjdCBzeXNmc19kaXJlbnQgKiBzZCA9IGRlbnRyeS0+ZF9mc2RhdGE7CiAKQEAgLTMwNyw3ICszMjAsOSBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIHN5c2ZzX2RlbnRyeV9vcHMgPSB7Ci0JLmRfaXB1dAkJPSBzeXNmc19kX2lwdXQsCisJLmRfcmV2YWxpZGF0ZQk9IHN5c2ZzX2RlbnRyeV9yZXZhbGlkYXRlLAorCS5kX2RlbGV0ZQk9IHN5c2ZzX2RlbnRyeV9kZWxldGUsCisJLmRfaXB1dAkJPSBzeXNmc19kZW50cnlfaXB1dCwKIH07CiAKIHN0cnVjdCBzeXNmc19kaXJlbnQgKnN5c2ZzX25ld19kaXJlbnQoY29uc3QgY2hhciAqbmFtZSwgdW1vZGVfdCBtb2RlLCBpbnQgdHlwZSkKQEAgLTM0NCwxMiArMzU5LDYgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGludCBzeXNmc19pbG9va3VwX3Rlc3Qoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqYXJnKQotewotCXN0cnVjdCBzeXNmc19kaXJlbnQgKnNkID0gYXJnOwotCXJldHVybiBpbm9kZS0+aV9pbm8gPT0gc2QtPnNfaW5vOwotfQotCiAvKioKICAqCXN5c2ZzX2FkZHJtX3N0YXJ0IC0gcHJlcGFyZSBmb3Igc3lzZnNfZGlyZW50IGFkZC9yZW1vdmUKICAqCUBhY3h0OiBwb2ludGVyIHRvIHN5c2ZzX2FkZHJtX2N4dCB0byBiZSB1c2VkCkBAIC0zNTcsNDcgKzM2NiwyMCBAQAogICoKICAqCVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGNhbGxlciBpcyBhYm91dCB0byBhZGQgb3IKICAqCXJlbW92ZSBzeXNmc19kaXJlbnQgdW5kZXIgQHBhcmVudF9zZC4gIFRoaXMgZnVuY3Rpb24gYWNxdWlyZXMKLSAqCXN5c2ZzX211dGV4LCBncmFicyBpbm9kZSBmb3IgQHBhcmVudF9zZCBpZiBhdmFpbGFibGUgYW5kIGxvY2sKLSAqCWlfbXV0ZXggb2YgaXQuICBAYWN4dCBpcyB1c2VkIHRvIGtlZXAgYW5kIHBhc3MgY29udGV4dCB0bworICoJc3lzZnNfbXV0ZXguICBAYWN4dCBpcyB1c2VkIHRvIGtlZXAgYW5kIHBhc3MgY29udGV4dCB0bwogICoJb3RoZXIgYWRkcm0gZnVuY3Rpb25zLgogICoKICAqCUxPQ0tJTkc6CiAgKglLZXJuZWwgdGhyZWFkIGNvbnRleHQgKG1heSBzbGVlcCkuICBzeXNmc19tdXRleCBpcyBsb2NrZWQgb24KLSAqCXJldHVybi4gIGlfbXV0ZXggb2YgcGFyZW50IGlub2RlIGlzIGxvY2tlZCBvbiByZXR1cm4gaWYKLSAqCWF2YWlsYWJsZS4KKyAqCXJldHVybi4KICAqLwogdm9pZCBzeXNmc19hZGRybV9zdGFydChzdHJ1Y3Qgc3lzZnNfYWRkcm1fY3h0ICphY3h0LAogCQkgICAgICAgc3RydWN0IHN5c2ZzX2RpcmVudCAqcGFyZW50X3NkKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0KIAltZW1zZXQoYWN4dCwgMCwgc2l6ZW9mKCphY3h0KSk7CiAJYWN4dC0+cGFyZW50X3NkID0gcGFyZW50X3NkOwogCi0JLyogTG9va3VwIHBhcmVudCBpbm9kZS4gIGlub2RlIGluaXRpYWxpemF0aW9uIGlzIHByb3RlY3RlZCBieQotCSAqIHN5c2ZzX211dGV4LCBzbyBpbm9kZSBleGlzdGVuY2UgY2FuIGJlIGRldGVybWluZWQgYnkKLQkgKiBsb29raW5nIHVwIGlub2RlIHdoaWxlIGhvbGRpbmcgc3lzZnNfbXV0ZXguCi0JICovCiAJbXV0ZXhfbG9jaygmc3lzZnNfbXV0ZXgpOwotCi0JaW5vZGUgPSBpbG9va3VwNShzeXNmc19zYiwgcGFyZW50X3NkLT5zX2lubywgc3lzZnNfaWxvb2t1cF90ZXN0LAotCQkJIHBhcmVudF9zZCk7Ci0JaWYgKGlub2RlKSB7Ci0JCVdBUk5fT04oaW5vZGUtPmlfc3RhdGUgJiBJX05FVyk7Ci0KLQkJLyogcGFyZW50IGlub2RlIGF2YWlsYWJsZSAqLwotCQlhY3h0LT5wYXJlbnRfaW5vZGUgPSBpbm9kZTsKLQotCQkvKiBzeXNmc19tdXRleCBpcyBiZWxvdyBpX211dGV4IGluIGxvY2sgaGllcmFyY2h5LgotCQkgKiBGaXJzdCwgdHJ5bG9jayBpX211dGV4LiAgSWYgZmFpbHMsIHVubG9jawotCQkgKiBzeXNmc19tdXRleCBhbmQgbG9jayB0aGVtIGluIG9yZGVyLgotCQkgKi8KLQkJaWYgKCFtdXRleF90cnlsb2NrKCZpbm9kZS0+aV9tdXRleCkpIHsKLQkJCW11dGV4X3VubG9jaygmc3lzZnNfbXV0ZXgpOwotCQkJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwotCQkJbXV0ZXhfbG9jaygmc3lzZnNfbXV0ZXgpOwotCQl9Ci0JfQogfQogCiAvKioKQEAgLTQyMiwxOCArNDA0LDIyIEBACiAgKi8KIGludCBfX3N5c2ZzX2FkZF9vbmUoc3RydWN0IHN5c2ZzX2FkZHJtX2N4dCAqYWN4dCwgc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QpCiB7CisJc3RydWN0IHN5c2ZzX2lub2RlX2F0dHJzICpwc19pYXR0cjsKKwogCWlmIChzeXNmc19maW5kX2RpcmVudChhY3h0LT5wYXJlbnRfc2QsIHNkLT5zX25hbWUpKQogCQlyZXR1cm4gLUVFWElTVDsKIAogCXNkLT5zX3BhcmVudCA9IHN5c2ZzX2dldChhY3h0LT5wYXJlbnRfc2QpOwogCi0JaWYgKHN5c2ZzX3R5cGUoc2QpID09IFNZU0ZTX0RJUiAmJiBhY3h0LT5wYXJlbnRfaW5vZGUpCi0JCWluY19ubGluayhhY3h0LT5wYXJlbnRfaW5vZGUpOwotCi0JYWN4dC0+Y250Kys7Ci0KIAlzeXNmc19saW5rX3NpYmxpbmcoc2QpOwogCisJLyogVXBkYXRlIHRpbWVzdGFtcHMgb24gdGhlIHBhcmVudCAqLworCXBzX2lhdHRyID0gYWN4dC0+cGFyZW50X3NkLT5zX2lhdHRyOworCWlmIChwc19pYXR0cikgeworCQlzdHJ1Y3QgaWF0dHIgKnBzX2lhdHRycyA9ICZwc19pYXR0ci0+aWFfaWF0dHI7CisJCXBzX2lhdHRycy0+aWFfY3RpbWUgPSBwc19pYXR0cnMtPmlhX210aW1lID0gQ1VSUkVOVF9USU1FOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC01MTIsNzAgKzQ5OCwyMiBAQAogICovCiB2b2lkIHN5c2ZzX3JlbW92ZV9vbmUoc3RydWN0IHN5c2ZzX2FkZHJtX2N4dCAqYWN4dCwgc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QpCiB7CisJc3RydWN0IHN5c2ZzX2lub2RlX2F0dHJzICpwc19pYXR0cjsKKwogCUJVR19PTihzZC0+c19mbGFncyAmIFNZU0ZTX0ZMQUdfUkVNT1ZFRCk7CiAKIAlzeXNmc191bmxpbmtfc2libGluZyhzZCk7CiAKKwkvKiBVcGRhdGUgdGltZXN0YW1wcyBvbiB0aGUgcGFyZW50ICovCisJcHNfaWF0dHIgPSBhY3h0LT5wYXJlbnRfc2QtPnNfaWF0dHI7CisJaWYgKHBzX2lhdHRyKSB7CisJCXN0cnVjdCBpYXR0ciAqcHNfaWF0dHJzID0gJnBzX2lhdHRyLT5pYV9pYXR0cjsKKwkJcHNfaWF0dHJzLT5pYV9jdGltZSA9IHBzX2lhdHRycy0+aWFfbXRpbWUgPSBDVVJSRU5UX1RJTUU7CisJfQorCiAJc2QtPnNfZmxhZ3MgfD0gU1lTRlNfRkxBR19SRU1PVkVEOwogCXNkLT5zX3NpYmxpbmcgPSBhY3h0LT5yZW1vdmVkOwogCWFjeHQtPnJlbW92ZWQgPSBzZDsKLQotCWlmIChzeXNmc190eXBlKHNkKSA9PSBTWVNGU19ESVIgJiYgYWN4dC0+cGFyZW50X2lub2RlKQotCQlkcm9wX25saW5rKGFjeHQtPnBhcmVudF9pbm9kZSk7Ci0KLQlhY3h0LT5jbnQrKzsKLX0KLQotLyoqCi0gKglzeXNmc19kcm9wX2RlbnRyeSAtIGRyb3AgZGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIHN5c2ZzX2RpcmVudAotICoJQHNkOiB0YXJnZXQgc3lzZnNfZGlyZW50Ci0gKgotICoJRHJvcCBkZW50cnkgZm9yIEBzZC4gIEBzZCBtdXN0IGhhdmUgYmVlbiB1bmxpbmtlZCBmcm9tIGl0cwotICoJcGFyZW50IG9uIGVudHJ5IHRvIHRoaXMgZnVuY3Rpb24gc3VjaCB0aGF0IGl0IGNhbid0IGJlIGxvb2tlZAotICoJdXAgYW55bW9yZS4KLSAqLwotc3RhdGljIHZvaWQgc3lzZnNfZHJvcF9kZW50cnkoc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QpCi17Ci0Jc3RydWN0IGlub2RlICppbm9kZTsKLQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7Ci0KLQlpbm9kZSA9IGlsb29rdXAoc3lzZnNfc2IsIHNkLT5zX2lubyk7Ci0JaWYgKCFpbm9kZSkKLQkJcmV0dXJuOwotCi0JLyogRHJvcCBhbnkgZXhpc3RpbmcgZGVudHJpZXMgYXNzb2NpYXRlZCB3aXRoIHNkLgotCSAqCi0JICogRm9yIHRoZSBkZW50cnkgdG8gYmUgcHJvcGVybHkgZnJlZWQgd2UgbmVlZCB0byBncmFiIGEKLQkgKiByZWZlcmVuY2UgdG8gdGhlIGRlbnRyeSB1bmRlciB0aGUgZGNhY2hlIGxvY2ssICB1bmhhc2ggaXQsCi0JICogYW5kIHRoZW4gcHV0IGl0LiAgVGhlIHBsYXlpbmcgd2l0aCB0aGUgZGVudHJ5IGNvdW50IGFsbG93cwotCSAqIGRwdXQgdG8gaW1tZWRpYXRlbHkgZnJlZSB0aGUgZGVudHJ5ICBpZiBpdCBpcyBub3QgaW4gdXNlLgotCSAqLwotcmVwZWF0OgotCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVudHJ5LCAmaW5vZGUtPmlfZGVudHJ5LCBkX2FsaWFzKSB7Ci0JCWlmIChkX3VuaGFzaGVkKGRlbnRyeSkpCi0JCQljb250aW51ZTsKLQkJZGdldF9sb2NrZWQoZGVudHJ5KTsKLQkJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7Ci0JCV9fZF9kcm9wKGRlbnRyeSk7Ci0JCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7Ci0JCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7Ci0JCWRwdXQoZGVudHJ5KTsKLQkJZ290byByZXBlYXQ7Ci0JfQotCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7Ci0KLQkvKiBhZGp1c3QgbmxpbmsgYW5kIHVwZGF0ZSB0aW1lc3RhbXAgKi8KLQltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7Ci0KLQlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKLQlkcm9wX25saW5rKGlub2RlKTsKLQlpZiAoc3lzZnNfdHlwZShzZCkgPT0gU1lTRlNfRElSKQotCQlkcm9wX25saW5rKGlub2RlKTsKLQotCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwotCi0JaXB1dChpbm9kZSk7CiB9CiAKIC8qKgpAQCAtNTg0LDI1ICs1MjIsMTUgQEAKICAqCiAgKglGaW5pc2ggdXAgc3lzZnNfZGlyZW50IGFkZC9yZW1vdmUuICBSZXNvdXJjZXMgYWNxdWlyZWQgYnkKICAqCXN5c2ZzX2FkZHJtX3N0YXJ0KCkgYXJlIHJlbGVhc2VkIGFuZCByZW1vdmVkIHN5c2ZzX2RpcmVudHMgYXJlCi0gKgljbGVhbmVkIHVwLiAgVGltZXN0YW1wcyBvbiB0aGUgcGFyZW50IGlub2RlIGFyZSB1cGRhdGVkLgorICoJY2xlYW5lZCB1cC4KICAqCiAgKglMT0NLSU5HOgotICoJQWxsIG11dGV4ZXMgYWNxdWlyZWQgYnkgc3lzZnNfYWRkcm1fc3RhcnQoKSBhcmUgcmVsZWFzZWQuCisgKglzeXNmc19tdXRleCBpcyByZWxlYXNlZC4KICAqLwogdm9pZCBzeXNmc19hZGRybV9maW5pc2goc3RydWN0IHN5c2ZzX2FkZHJtX2N4dCAqYWN4dCkKIHsKIAkvKiByZWxlYXNlIHJlc291cmNlcyBhY3F1aXJlZCBieSBzeXNmc19hZGRybV9zdGFydCgpICovCiAJbXV0ZXhfdW5sb2NrKCZzeXNmc19tdXRleCk7Ci0JaWYgKGFjeHQtPnBhcmVudF9pbm9kZSkgewotCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gYWN4dC0+cGFyZW50X2lub2RlOwotCi0JCS8qIGlmIGFkZGVkL3JlbW92ZWQsIHVwZGF0ZSB0aW1lc3RhbXBzIG9uIHRoZSBwYXJlbnQgKi8KLQkJaWYgKGFjeHQtPmNudCkKLQkJCWlub2RlLT5pX2N0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7Ci0KLQkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7Ci0JCWlwdXQoaW5vZGUpOwotCX0KIAogCS8qIGtpbGwgcmVtb3ZlZCBzeXNmc19kaXJlbnRzICovCiAJd2hpbGUgKGFjeHQtPnJlbW92ZWQpIHsKQEAgLTYxMSw3ICs1MzksNiBAQAogCQlhY3h0LT5yZW1vdmVkID0gc2QtPnNfc2libGluZzsKIAkJc2QtPnNfc2libGluZyA9IE5VTEw7CiAKLQkJc3lzZnNfZHJvcF9kZW50cnkoc2QpOwogCQlzeXNmc19kZWFjdGl2YXRlKHNkKTsKIAkJdW5tYXBfYmluX2ZpbGUoc2QpOwogCQlzeXNmc19wdXQoc2QpOwpAQCAtNzUxLDEwICs2NzgsMTUgQEAKIAl9CiAKIAkvKiBpbnN0YW50aWF0ZSBhbmQgaGFzaCBkZW50cnkgKi8KLQlkZW50cnktPmRfb3AgPSAmc3lzZnNfZGVudHJ5X29wczsKLQlkZW50cnktPmRfZnNkYXRhID0gc3lzZnNfZ2V0KHNkKTsKLQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwotCWRfcmVoYXNoKGRlbnRyeSk7CisJcmV0ID0gZF9maW5kX2FsaWFzKGlub2RlKTsKKwlpZiAoIXJldCkgeworCQlkZW50cnktPmRfb3AgPSAmc3lzZnNfZGVudHJ5X29wczsKKwkJZGVudHJ5LT5kX2ZzZGF0YSA9IHN5c2ZzX2dldChzZCk7CisJCWRfYWRkKGRlbnRyeSwgaW5vZGUpOworCX0gZWxzZSB7CisJCWRfbW92ZShyZXQsIGRlbnRyeSk7CisJCWlwdXQoaW5vZGUpOworCX0KIAogIG91dF91bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZzeXNmc19tdXRleCk7CkBAIC03NjMsNyArNjk1LDkgQEAKIAogY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc3lzZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CiAJLmxvb2t1cAkJPSBzeXNmc19sb29rdXAsCisJLnBlcm1pc3Npb24JPSBzeXNmc19wZXJtaXNzaW9uLAogCS5zZXRhdHRyCT0gc3lzZnNfc2V0YXR0ciwKKwkuZ2V0YXR0cgk9IHN5c2ZzX2dldGF0dHIsCiAJLnNldHhhdHRyCT0gc3lzZnNfc2V0eGF0dHIsCiB9OwogCkBAIC04MjYsMTQxICs3NjAsNjUgQEAKIAlfX3N5c2ZzX3JlbW92ZV9kaXIoc2QpOwogfQogCi1pbnQgc3lzZnNfcmVuYW1lX2RpcihzdHJ1Y3Qga29iamVjdCAqIGtvYmosIGNvbnN0IGNoYXIgKm5ld19uYW1lKQoraW50IHN5c2ZzX3JlbmFtZShzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCwKKwlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpuZXdfcGFyZW50X3NkLCBjb25zdCBjaGFyICpuZXdfbmFtZSkKIHsKLQlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCA9IGtvYmotPnNkOwotCXN0cnVjdCBkZW50cnkgKnBhcmVudCA9IE5VTEw7Ci0Jc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSA9IE5VTEwsICpuZXdfZGVudHJ5ID0gTlVMTDsKIAljb25zdCBjaGFyICpkdXBfbmFtZSA9IE5VTEw7CiAJaW50IGVycm9yOwogCi0JbXV0ZXhfbG9jaygmc3lzZnNfcmVuYW1lX211dGV4KTsKLQotCWVycm9yID0gMDsKLQlpZiAoc3RyY21wKHNkLT5zX25hbWUsIG5ld19uYW1lKSA9PSAwKQotCQlnb3RvIG91dDsJLyogbm90aGluZyB0byByZW5hbWUgKi8KLQotCS8qIGdldCB0aGUgb3JpZ2luYWwgZGVudHJ5ICovCi0Jb2xkX2RlbnRyeSA9IHN5c2ZzX2dldF9kZW50cnkoc2QpOwotCWlmIChJU19FUlIob2xkX2RlbnRyeSkpIHsKLQkJZXJyb3IgPSBQVFJfRVJSKG9sZF9kZW50cnkpOwotCQlvbGRfZGVudHJ5ID0gTlVMTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcGFyZW50ID0gb2xkX2RlbnRyeS0+ZF9wYXJlbnQ7Ci0KLQkvKiBsb2NrIHBhcmVudCBhbmQgZ2V0IGRlbnRyeSBmb3IgbmV3IG5hbWUgKi8KLQltdXRleF9sb2NrKCZwYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXgpOwogCW11dGV4X2xvY2soJnN5c2ZzX211dGV4KTsKIAotCWVycm9yID0gLUVFWElTVDsKLQlpZiAoc3lzZnNfZmluZF9kaXJlbnQoc2QtPnNfcGFyZW50LCBuZXdfbmFtZSkpCi0JCWdvdG8gb3V0X3VubG9jazsKKwllcnJvciA9IDA7CisJaWYgKChzZC0+c19wYXJlbnQgPT0gbmV3X3BhcmVudF9zZCkgJiYKKwkgICAgKHN0cmNtcChzZC0+c19uYW1lLCBuZXdfbmFtZSkgPT0gMCkpCisJCWdvdG8gb3V0OwkvKiBub3RoaW5nIHRvIHJlbmFtZSAqLwogCi0JZXJyb3IgPSAtRU5PTUVNOwotCW5ld19kZW50cnkgPSBkX2FsbG9jX25hbWUocGFyZW50LCBuZXdfbmFtZSk7Ci0JaWYgKCFuZXdfZGVudHJ5KQotCQlnb3RvIG91dF91bmxvY2s7CisJZXJyb3IgPSAtRUVYSVNUOworCWlmIChzeXNmc19maW5kX2RpcmVudChuZXdfcGFyZW50X3NkLCBuZXdfbmFtZSkpCisJCWdvdG8gb3V0OwogCiAJLyogcmVuYW1lIHN5c2ZzX2RpcmVudCAqLwotCWVycm9yID0gLUVOT01FTTsKLQluZXdfbmFtZSA9IGR1cF9uYW1lID0ga3N0cmR1cChuZXdfbmFtZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFuZXdfbmFtZSkKLQkJZ290byBvdXRfdW5sb2NrOworCWlmIChzdHJjbXAoc2QtPnNfbmFtZSwgbmV3X25hbWUpICE9IDApIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQluZXdfbmFtZSA9IGR1cF9uYW1lID0ga3N0cmR1cChuZXdfbmFtZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghbmV3X25hbWUpCisJCQlnb3RvIG91dDsKIAotCWR1cF9uYW1lID0gc2QtPnNfbmFtZTsKLQlzZC0+c19uYW1lID0gbmV3X25hbWU7CisJCWR1cF9uYW1lID0gc2QtPnNfbmFtZTsKKwkJc2QtPnNfbmFtZSA9IG5ld19uYW1lOworCX0KIAotCS8qIHJlbmFtZSAqLwotCWRfYWRkKG5ld19kZW50cnksIE5VTEwpOwotCWRfbW92ZShvbGRfZGVudHJ5LCBuZXdfZGVudHJ5KTsKKwkvKiBSZW1vdmUgZnJvbSBvbGQgcGFyZW50J3MgbGlzdCBhbmQgaW5zZXJ0IGludG8gbmV3IHBhcmVudCdzIGxpc3QuICovCisJaWYgKHNkLT5zX3BhcmVudCAhPSBuZXdfcGFyZW50X3NkKSB7CisJCXN5c2ZzX3VubGlua19zaWJsaW5nKHNkKTsKKwkJc3lzZnNfZ2V0KG5ld19wYXJlbnRfc2QpOworCQlzeXNmc19wdXQoc2QtPnNfcGFyZW50KTsKKwkJc2QtPnNfcGFyZW50ID0gbmV3X3BhcmVudF9zZDsKKwkJc3lzZnNfbGlua19zaWJsaW5nKHNkKTsKKwl9CiAKIAllcnJvciA9IDA7Ci0gb3V0X3VubG9jazoKLQltdXRleF91bmxvY2soJnN5c2ZzX211dGV4KTsKLQltdXRleF91bmxvY2soJnBhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCk7Ci0Ja2ZyZWUoZHVwX25hbWUpOwotCWRwdXQob2xkX2RlbnRyeSk7Ci0JZHB1dChuZXdfZGVudHJ5KTsKICBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZzeXNmc19yZW5hbWVfbXV0ZXgpOworCW11dGV4X3VubG9jaygmc3lzZnNfbXV0ZXgpOworCWtmcmVlKGR1cF9uYW1lKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKK2ludCBzeXNmc19yZW5hbWVfZGlyKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjb25zdCBjaGFyICpuZXdfbmFtZSkKK3sKKwlyZXR1cm4gc3lzZnNfcmVuYW1lKGtvYmotPnNkLCBrb2JqLT5zZC0+c19wYXJlbnQsIG5ld19uYW1lKTsKK30KKwogaW50IHN5c2ZzX21vdmVfZGlyKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3Qga29iamVjdCAqbmV3X3BhcmVudF9rb2JqKQogewogCXN0cnVjdCBzeXNmc19kaXJlbnQgKnNkID0ga29iai0+c2Q7CiAJc3RydWN0IHN5c2ZzX2RpcmVudCAqbmV3X3BhcmVudF9zZDsKLQlzdHJ1Y3QgZGVudHJ5ICpvbGRfcGFyZW50LCAqbmV3X3BhcmVudCA9IE5VTEw7Ci0Jc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSA9IE5VTEwsICpuZXdfZGVudHJ5ID0gTlVMTDsKLQlpbnQgZXJyb3I7CiAKLQltdXRleF9sb2NrKCZzeXNmc19yZW5hbWVfbXV0ZXgpOwogCUJVR19PTighc2QtPnNfcGFyZW50KTsKLQluZXdfcGFyZW50X3NkID0gKG5ld19wYXJlbnRfa29iaiAmJiBuZXdfcGFyZW50X2tvYmotPnNkKSA/CisJbmV3X3BhcmVudF9zZCA9IG5ld19wYXJlbnRfa29iaiAmJiBuZXdfcGFyZW50X2tvYmotPnNkID8KIAkJbmV3X3BhcmVudF9rb2JqLT5zZCA6ICZzeXNmc19yb290OwogCi0JZXJyb3IgPSAwOwotCWlmIChzZC0+c19wYXJlbnQgPT0gbmV3X3BhcmVudF9zZCkKLQkJZ290byBvdXQ7CS8qIG5vdGhpbmcgdG8gbW92ZSAqLwotCi0JLyogZ2V0IGRlbnRyaWVzICovCi0Jb2xkX2RlbnRyeSA9IHN5c2ZzX2dldF9kZW50cnkoc2QpOwotCWlmIChJU19FUlIob2xkX2RlbnRyeSkpIHsKLQkJZXJyb3IgPSBQVFJfRVJSKG9sZF9kZW50cnkpOwotCQlvbGRfZGVudHJ5ID0gTlVMTDsKLQkJZ290byBvdXQ7Ci0JfQotCW9sZF9wYXJlbnQgPSBvbGRfZGVudHJ5LT5kX3BhcmVudDsKLQotCW5ld19wYXJlbnQgPSBzeXNmc19nZXRfZGVudHJ5KG5ld19wYXJlbnRfc2QpOwotCWlmIChJU19FUlIobmV3X3BhcmVudCkpIHsKLQkJZXJyb3IgPSBQVFJfRVJSKG5ld19wYXJlbnQpOwotCQluZXdfcGFyZW50ID0gTlVMTDsKLQkJZ290byBvdXQ7Ci0JfQotCi1hZ2FpbjoKLQltdXRleF9sb2NrKCZvbGRfcGFyZW50LT5kX2lub2RlLT5pX211dGV4KTsKLQlpZiAoIW11dGV4X3RyeWxvY2soJm5ld19wYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXgpKSB7Ci0JCW11dGV4X3VubG9jaygmb2xkX3BhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCk7Ci0JCWdvdG8gYWdhaW47Ci0JfQotCW11dGV4X2xvY2soJnN5c2ZzX211dGV4KTsKLQotCWVycm9yID0gLUVFWElTVDsKLQlpZiAoc3lzZnNfZmluZF9kaXJlbnQobmV3X3BhcmVudF9zZCwgc2QtPnNfbmFtZSkpCi0JCWdvdG8gb3V0X3VubG9jazsKLQotCWVycm9yID0gLUVOT01FTTsKLQluZXdfZGVudHJ5ID0gZF9hbGxvY19uYW1lKG5ld19wYXJlbnQsIHNkLT5zX25hbWUpOwotCWlmICghbmV3X2RlbnRyeSkKLQkJZ290byBvdXRfdW5sb2NrOwotCi0JZXJyb3IgPSAwOwotCWRfYWRkKG5ld19kZW50cnksIE5VTEwpOwotCWRfbW92ZShvbGRfZGVudHJ5LCBuZXdfZGVudHJ5KTsKLQotCS8qIFJlbW92ZSBmcm9tIG9sZCBwYXJlbnQncyBsaXN0IGFuZCBpbnNlcnQgaW50byBuZXcgcGFyZW50J3MgbGlzdC4gKi8KLQlzeXNmc191bmxpbmtfc2libGluZyhzZCk7Ci0Jc3lzZnNfZ2V0KG5ld19wYXJlbnRfc2QpOwotCWRyb3Bfbmxpbmsob2xkX3BhcmVudC0+ZF9pbm9kZSk7Ci0Jc3lzZnNfcHV0KHNkLT5zX3BhcmVudCk7Ci0Jc2QtPnNfcGFyZW50ID0gbmV3X3BhcmVudF9zZDsKLQlpbmNfbmxpbmsobmV3X3BhcmVudC0+ZF9pbm9kZSk7Ci0Jc3lzZnNfbGlua19zaWJsaW5nKHNkKTsKLQotIG91dF91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZzeXNmc19tdXRleCk7Ci0JbXV0ZXhfdW5sb2NrKCZuZXdfcGFyZW50LT5kX2lub2RlLT5pX211dGV4KTsKLQltdXRleF91bmxvY2soJm9sZF9wYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXgpOwotIG91dDoKLQlkcHV0KG5ld19wYXJlbnQpOwotCWRwdXQob2xkX2RlbnRyeSk7Ci0JZHB1dChuZXdfZGVudHJ5KTsKLQltdXRleF91bmxvY2soJnN5c2ZzX3JlbmFtZV9tdXRleCk7Ci0JcmV0dXJuIGVycm9yOworCXJldHVybiBzeXNmc19yZW5hbWUoc2QsIG5ld19wYXJlbnRfc2QsIHNkLT5zX25hbWUpOwogfQogCiAvKiBSZWxhdGlvbnNoaXAgYmV0d2VlbiBzX21vZGUgYW5kIHRoZSBEVF94eHggdHlwZXMgKi8KZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL2ZpbGUuYyBiL2ZzL3N5c2ZzL2ZpbGUuYwppbmRleCBmNWVhNDY4Li5kYzMwZDllIDEwMDY0NAotLS0gYS9mcy9zeXNmcy9maWxlLmMKKysrIGIvZnMvc3lzZnMvZmlsZS5jCkBAIC01NzksNDYgKzU3OSwyMyBAQAogICovCiBpbnQgc3lzZnNfY2htb2RfZmlsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgbW9kZV90IG1vZGUpCiB7Ci0Jc3RydWN0IHN5c2ZzX2RpcmVudCAqdmljdGltX3NkID0gTlVMTDsKLQlzdHJ1Y3QgZGVudHJ5ICp2aWN0aW0gPSBOVUxMOwotCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCXN0cnVjdCBzeXNmc19kaXJlbnQgKnNkOwogCXN0cnVjdCBpYXR0ciBuZXdhdHRyczsKIAlpbnQgcmM7CiAKKwltdXRleF9sb2NrKCZzeXNmc19tdXRleCk7CisKIAlyYyA9IC1FTk9FTlQ7Ci0JdmljdGltX3NkID0gc3lzZnNfZ2V0X2RpcmVudChrb2JqLT5zZCwgYXR0ci0+bmFtZSk7Ci0JaWYgKCF2aWN0aW1fc2QpCisJc2QgPSBzeXNmc19maW5kX2RpcmVudChrb2JqLT5zZCwgYXR0ci0+bmFtZSk7CisJaWYgKCFzZCkKIAkJZ290byBvdXQ7CiAKLQltdXRleF9sb2NrKCZzeXNmc19yZW5hbWVfbXV0ZXgpOwotCXZpY3RpbSA9IHN5c2ZzX2dldF9kZW50cnkodmljdGltX3NkKTsKLQltdXRleF91bmxvY2soJnN5c2ZzX3JlbmFtZV9tdXRleCk7Ci0JaWYgKElTX0VSUih2aWN0aW0pKSB7Ci0JCXJjID0gUFRSX0VSUih2aWN0aW0pOwotCQl2aWN0aW0gPSBOVUxMOwotCQlnb3RvIG91dDsKLQl9CisJbmV3YXR0cnMuaWFfbW9kZSA9IChtb2RlICYgU19JQUxMVUdPKSB8IChzZC0+c19tb2RlICYgflNfSUFMTFVHTyk7CisJbmV3YXR0cnMuaWFfdmFsaWQgPSBBVFRSX01PREU7CisJcmMgPSBzeXNmc19zZF9zZXRhdHRyKHNkLCAmbmV3YXR0cnMpOwogCi0JaW5vZGUgPSB2aWN0aW0tPmRfaW5vZGU7Ci0KLQltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7Ci0KLQluZXdhdHRycy5pYV9tb2RlID0gKG1vZGUgJiBTX0lBTExVR08pIHwgKGlub2RlLT5pX21vZGUgJiB+U19JQUxMVUdPKTsKLQluZXdhdHRycy5pYV92YWxpZCA9IEFUVFJfTU9ERSB8IEFUVFJfQ1RJTUU7Ci0JbmV3YXR0cnMuaWFfY3RpbWUgPSBjdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOwotCXJjID0gc3lzZnNfc2V0YXR0cih2aWN0aW0sICZuZXdhdHRycyk7Ci0KLQlpZiAocmMgPT0gMCkgewotCQlmc25vdGlmeV9jaGFuZ2UodmljdGltLCBuZXdhdHRycy5pYV92YWxpZCk7Ci0JCW11dGV4X2xvY2soJnN5c2ZzX211dGV4KTsKLQkJdmljdGltX3NkLT5zX21vZGUgPSBuZXdhdHRycy5pYV9tb2RlOwotCQltdXRleF91bmxvY2soJnN5c2ZzX211dGV4KTsKLQl9Ci0KLQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKICBvdXQ6Ci0JZHB1dCh2aWN0aW0pOwotCXN5c2ZzX3B1dCh2aWN0aW1fc2QpOworCW11dGV4X3VubG9jaygmc3lzZnNfbXV0ZXgpOwogCXJldHVybiByYzsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHN5c2ZzX2NobW9kX2ZpbGUpOwpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvaW5vZGUuYyBiL2ZzL3N5c2ZzL2lub2RlLmMKaW5kZXggZTI4Y2VjZi4uMjIwYjc1OCAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvaW5vZGUuYworKysgYi9mcy9zeXNmcy9pbm9kZS5jCkBAIC0zNyw3ICszNyw5IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc3lzZnNfaW5vZGVfb3BlcmF0aW9ucyA9eworCS5wZXJtaXNzaW9uCT0gc3lzZnNfcGVybWlzc2lvbiwKIAkuc2V0YXR0cgk9IHN5c2ZzX3NldGF0dHIsCisJLmdldGF0dHIJPSBzeXNmc19nZXRhdHRyLAogCS5zZXR4YXR0cgk9IHN5c2ZzX3NldHhhdHRyLAogfTsKIApAQCAtNDYsNyArNDgsNyBAQAogCXJldHVybiBiZGlfaW5pdCgmc3lzZnNfYmFja2luZ19kZXZfaW5mbyk7CiB9CiAKLXN0cnVjdCBzeXNmc19pbm9kZV9hdHRycyAqc3lzZnNfaW5pdF9pbm9kZV9hdHRycyhzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCkKK3N0YXRpYyBzdHJ1Y3Qgc3lzZnNfaW5vZGVfYXR0cnMgKnN5c2ZzX2luaXRfaW5vZGVfYXR0cnMoc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QpCiB7CiAJc3RydWN0IHN5c2ZzX2lub2RlX2F0dHJzICphdHRyczsKIAlzdHJ1Y3QgaWF0dHIgKmlhdHRyczsKQEAgLTY0LDMwICs2NiwxNSBAQAogCiAJcmV0dXJuIGF0dHJzOwogfQotaW50IHN5c2ZzX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IGlhdHRyICogaWF0dHIpCisKK2ludCBzeXNmc19zZF9zZXRhdHRyKHN0cnVjdCBzeXNmc19kaXJlbnQgKnNkLCBzdHJ1Y3QgaWF0dHIgKiBpYXR0cikKIHsKLQlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKLQlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogc2QgPSBkZW50cnktPmRfZnNkYXRhOwogCXN0cnVjdCBzeXNmc19pbm9kZV9hdHRycyAqc2RfYXR0cnM7CiAJc3RydWN0IGlhdHRyICppYXR0cnM7CiAJdW5zaWduZWQgaW50IGlhX3ZhbGlkID0gaWF0dHItPmlhX3ZhbGlkOwotCWludCBlcnJvcjsKLQotCWlmICghc2QpCi0JCXJldHVybiAtRUlOVkFMOwogCiAJc2RfYXR0cnMgPSBzZC0+c19pYXR0cjsKIAotCWVycm9yID0gaW5vZGVfY2hhbmdlX29rKGlub2RlLCBpYXR0cik7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7Ci0KLQlpYXR0ci0+aWFfdmFsaWQgJj0gfkFUVFJfU0laRTsgLyogaWdub3JlIHNpemUgY2hhbmdlcyAqLwotCi0JZXJyb3IgPSBpbm9kZV9zZXRhdHRyKGlub2RlLCBpYXR0cik7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7Ci0KIAlpZiAoIXNkX2F0dHJzKSB7CiAJCS8qIHNldHRpbmcgYXR0cmlidXRlcyBmb3IgdGhlIGZpcnN0IHRpbWUsIGFsbG9jYXRlIG5vdyAqLwogCQlzZF9hdHRycyA9IHN5c2ZzX2luaXRfaW5vZGVfYXR0cnMoc2QpOwpAQCAtMTAzLDQyICs5MCw3OCBAQAogCQlpZiAoaWFfdmFsaWQgJiBBVFRSX0dJRCkKIAkJCWlhdHRycy0+aWFfZ2lkID0gaWF0dHItPmlhX2dpZDsKIAkJaWYgKGlhX3ZhbGlkICYgQVRUUl9BVElNRSkKLQkJCWlhdHRycy0+aWFfYXRpbWUgPSB0aW1lc3BlY190cnVuYyhpYXR0ci0+aWFfYXRpbWUsCi0JCQkJCWlub2RlLT5pX3NiLT5zX3RpbWVfZ3Jhbik7CisJCQlpYXR0cnMtPmlhX2F0aW1lID0gaWF0dHItPmlhX2F0aW1lOwogCQlpZiAoaWFfdmFsaWQgJiBBVFRSX01USU1FKQotCQkJaWF0dHJzLT5pYV9tdGltZSA9IHRpbWVzcGVjX3RydW5jKGlhdHRyLT5pYV9tdGltZSwKLQkJCQkJaW5vZGUtPmlfc2ItPnNfdGltZV9ncmFuKTsKKwkJCWlhdHRycy0+aWFfbXRpbWUgPSBpYXR0ci0+aWFfbXRpbWU7CiAJCWlmIChpYV92YWxpZCAmIEFUVFJfQ1RJTUUpCi0JCQlpYXR0cnMtPmlhX2N0aW1lID0gdGltZXNwZWNfdHJ1bmMoaWF0dHItPmlhX2N0aW1lLAotCQkJCQlpbm9kZS0+aV9zYi0+c190aW1lX2dyYW4pOworCQkJaWF0dHJzLT5pYV9jdGltZSA9IGlhdHRyLT5pYV9jdGltZTsKIAkJaWYgKGlhX3ZhbGlkICYgQVRUUl9NT0RFKSB7CiAJCQl1bW9kZV90IG1vZGUgPSBpYXR0ci0+aWFfbW9kZTsKLQotCQkJaWYgKCFpbl9ncm91cF9wKGlub2RlLT5pX2dpZCkgJiYgIWNhcGFibGUoQ0FQX0ZTRVRJRCkpCi0JCQkJbW9kZSAmPSB+U19JU0dJRDsKIAkJCWlhdHRycy0+aWFfbW9kZSA9IHNkLT5zX21vZGUgPSBtb2RlOwogCQl9CiAJfQorCXJldHVybiAwOworfQorCitpbnQgc3lzZnNfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqaWF0dHIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCA9IGRlbnRyeS0+ZF9mc2RhdGE7CisJaW50IGVycm9yOworCisJaWYgKCFzZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnJvciA9IGlub2RlX2NoYW5nZV9vayhpbm9kZSwgaWF0dHIpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJaWF0dHItPmlhX3ZhbGlkICY9IH5BVFRSX1NJWkU7IC8qIGlnbm9yZSBzaXplIGNoYW5nZXMgKi8KKworCWVycm9yID0gaW5vZGVfc2V0YXR0cihpbm9kZSwgaWF0dHIpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJbXV0ZXhfbG9jaygmc3lzZnNfbXV0ZXgpOworCWVycm9yID0gc3lzZnNfc2Rfc2V0YXR0cihzZCwgaWF0dHIpOworCW11dGV4X3VubG9jaygmc3lzZnNfbXV0ZXgpOworCiAJcmV0dXJuIGVycm9yOwogfQogCitzdGF0aWMgaW50IHN5c2ZzX3NkX3NldHNlY2RhdGEoc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QsIHZvaWQgKipzZWNkYXRhLCB1MzIgKnNlY2RhdGFfbGVuKQoreworCXN0cnVjdCBzeXNmc19pbm9kZV9hdHRycyAqaWF0dHJzOworCXZvaWQgKm9sZF9zZWNkYXRhOworCXNpemVfdCBvbGRfc2VjZGF0YV9sZW47CisKKwlpYXR0cnMgPSBzZC0+c19pYXR0cjsKKwlpZiAoIWlhdHRycykKKwkJaWF0dHJzID0gc3lzZnNfaW5pdF9pbm9kZV9hdHRycyhzZCk7CisJaWYgKCFpYXR0cnMpCisJCXJldHVybiAtRU5PTUVNOworCisJb2xkX3NlY2RhdGEgPSBpYXR0cnMtPmlhX3NlY2RhdGE7CisJb2xkX3NlY2RhdGFfbGVuID0gaWF0dHJzLT5pYV9zZWNkYXRhX2xlbjsKKworCWlhdHRycy0+aWFfc2VjZGF0YSA9ICpzZWNkYXRhOworCWlhdHRycy0+aWFfc2VjZGF0YV9sZW4gPSAqc2VjZGF0YV9sZW47CisKKwkqc2VjZGF0YSA9IG9sZF9zZWNkYXRhOworCSpzZWNkYXRhX2xlbiA9IG9sZF9zZWNkYXRhX2xlbjsKKwlyZXR1cm4gMDsKK30KKwogaW50IHN5c2ZzX3NldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsdWUsCiAJCXNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QgPSBkZW50cnktPmRfZnNkYXRhOwotCXN0cnVjdCBzeXNmc19pbm9kZV9hdHRycyAqaWF0dHJzOwogCXZvaWQgKnNlY2RhdGE7CiAJaW50IGVycm9yOwogCXUzMiBzZWNkYXRhX2xlbiA9IDA7CiAKIAlpZiAoIXNkKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoIXNkLT5zX2lhdHRyKQotCQlzZC0+c19pYXR0ciA9IHN5c2ZzX2luaXRfaW5vZGVfYXR0cnMoc2QpOwotCWlmICghc2QtPnNfaWF0dHIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWF0dHJzID0gc2QtPnNfaWF0dHI7CiAKIAlpZiAoIXN0cm5jbXAobmFtZSwgWEFUVFJfU0VDVVJJVFlfUFJFRklYLCBYQVRUUl9TRUNVUklUWV9QUkVGSVhfTEVOKSkgewogCQljb25zdCBjaGFyICpzdWZmaXggPSBuYW1lICsgWEFUVFJfU0VDVVJJVFlfUFJFRklYX0xFTjsKQEAgLTE1MCwxMiArMTczLDEzIEBACiAJCQkJCQkmc2VjZGF0YSwgJnNlY2RhdGFfbGVuKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXQ7Ci0JCWlmIChpYXR0cnMtPmlhX3NlY2RhdGEpCi0JCQlzZWN1cml0eV9yZWxlYXNlX3NlY2N0eChpYXR0cnMtPmlhX3NlY2RhdGEsCi0JCQkJCQlpYXR0cnMtPmlhX3NlY2RhdGFfbGVuKTsKLQkJaWF0dHJzLT5pYV9zZWNkYXRhID0gc2VjZGF0YTsKLQkJaWF0dHJzLT5pYV9zZWNkYXRhX2xlbiA9IHNlY2RhdGFfbGVuOwogCisJCW11dGV4X2xvY2soJnN5c2ZzX211dGV4KTsKKwkJZXJyb3IgPSBzeXNmc19zZF9zZXRzZWNkYXRhKHNkLCAmc2VjZGF0YSwgJnNlY2RhdGFfbGVuKTsKKwkJbXV0ZXhfdW5sb2NrKCZzeXNmc19tdXRleCk7CisKKwkJaWYgKHNlY2RhdGEpCisJCQlzZWN1cml0eV9yZWxlYXNlX3NlY2N0eChzZWNkYXRhLCBzZWNkYXRhX2xlbik7CiAJfSBlbHNlCiAJCXJldHVybiAtRUlOVkFMOwogb3V0OgpAQCAtMTcwLDcgKzE5NCw2IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfaW5vZGVfYXR0cihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGlhdHRyICogaWF0dHIpCiB7Ci0JaW5vZGUtPmlfbW9kZSA9IGlhdHRyLT5pYV9tb2RlOwogCWlub2RlLT5pX3VpZCA9IGlhdHRyLT5pYV91aWQ7CiAJaW5vZGUtPmlfZ2lkID0gaWF0dHItPmlhX2dpZDsKIAlpbm9kZS0+aV9hdGltZSA9IGlhdHRyLT5pYV9hdGltZTsKQEAgLTE3OCwxNyArMjAxLDYgQEAKIAlpbm9kZS0+aV9jdGltZSA9IGlhdHRyLT5pYV9jdGltZTsKIH0KIAotCi0vKgotICogc3lzZnMgaGFzIGEgZGlmZmVyZW50IGlfbXV0ZXggbG9jayBvcmRlciBiZWhhdmlvciBmb3IgaV9tdXRleCB0aGFuIG90aGVyCi0gKiBmaWxlc3lzdGVtczsgc3lzZnMgaV9tdXRleCBpcyBjYWxsZWQgaW4gbWFueSBwbGFjZXMgd2l0aCBzdWJzeXN0ZW0gbG9ja3MKLSAqIGhlbGQuIEF0IHRoZSBzYW1lIHRpbWUsIG1hbnkgb2YgdGhlIFZGUyBsb2NraW5nIHJ1bGVzIGRvIG5vdCBhcHBseSB0bwotICogc3lzZnMgYXQgYWxsIChjcm9zcyBkaXJlY3RvcnkgcmVuYW1lIGZvciBleGFtcGxlKS4gVG8gdW50YW5nbGUgdGhpcyBtZXNzCi0gKiAod2hpY2ggZ2l2ZXMgZmFsc2UgcG9zaXRpdmVzIGluIGxvY2tkZXApLCB3ZSdyZSBnaXZpbmcgc3lzZnMgaW5vZGVzIHRoZWlyCi0gKiBvd24gY2xhc3MgZm9yIGlfbXV0ZXguCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgc3lzZnNfaW5vZGVfaW11dGV4X2tleTsKLQogc3RhdGljIGludCBzeXNmc19jb3VudF9ubGluayhzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCkKIHsKIAlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpjaGlsZDsKQEAgLTIwMSwzOCArMjEzLDU1IEBACiAJcmV0dXJuIG5yICsgMjsKIH0KIAorc3RhdGljIHZvaWQgc3lzZnNfcmVmcmVzaF9pbm9kZShzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3Qgc3lzZnNfaW5vZGVfYXR0cnMgKmlhdHRycyA9IHNkLT5zX2lhdHRyOworCisJaW5vZGUtPmlfbW9kZSA9IHNkLT5zX21vZGU7CisJaWYgKGlhdHRycykgeworCQkvKiBzeXNmc19kaXJlbnQgaGFzIG5vbi1kZWZhdWx0IGF0dHJpYnV0ZXMKKwkJICogZ2V0IHRoZW0gZnJvbSBwZXJzaXN0ZW50IGNvcHkgaW4gc3lzZnNfZGlyZW50CisJCSAqLworCQlzZXRfaW5vZGVfYXR0cihpbm9kZSwgJmlhdHRycy0+aWFfaWF0dHIpOworCQlzZWN1cml0eV9pbm9kZV9ub3RpZnlzZWNjdHgoaW5vZGUsCisJCQkJCSAgICBpYXR0cnMtPmlhX3NlY2RhdGEsCisJCQkJCSAgICBpYXR0cnMtPmlhX3NlY2RhdGFfbGVuKTsKKwl9CisKKwlpZiAoc3lzZnNfdHlwZShzZCkgPT0gU1lTRlNfRElSKQorCQlpbm9kZS0+aV9ubGluayA9IHN5c2ZzX2NvdW50X25saW5rKHNkKTsKK30KKworaW50IHN5c2ZzX2dldGF0dHIoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ICpzdGF0KQoreworCXN0cnVjdCBzeXNmc19kaXJlbnQgKnNkID0gZGVudHJ5LT5kX2ZzZGF0YTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCisJbXV0ZXhfbG9jaygmc3lzZnNfbXV0ZXgpOworCXN5c2ZzX3JlZnJlc2hfaW5vZGUoc2QsIGlub2RlKTsKKwltdXRleF91bmxvY2soJnN5c2ZzX211dGV4KTsKKworCWdlbmVyaWNfZmlsbGF0dHIoaW5vZGUsIHN0YXQpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCBzeXNmc19pbml0X2lub2RlKHN0cnVjdCBzeXNmc19kaXJlbnQgKnNkLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0cjsKLQlzdHJ1Y3Qgc3lzZnNfaW5vZGVfYXR0cnMgKmlhdHRyczsKIAogCWlub2RlLT5pX3ByaXZhdGUgPSBzeXNmc19nZXQoc2QpOwogCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJnN5c2ZzX2FvcHM7CiAJaW5vZGUtPmlfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbyA9ICZzeXNmc19iYWNraW5nX2Rldl9pbmZvOwogCWlub2RlLT5pX29wID0gJnN5c2ZzX2lub2RlX29wZXJhdGlvbnM7Ci0JaW5vZGUtPmlfaW5vID0gc2QtPnNfaW5vOwotCWxvY2tkZXBfc2V0X2NsYXNzKCZpbm9kZS0+aV9tdXRleCwgJnN5c2ZzX2lub2RlX2ltdXRleF9rZXkpOwogCi0JaWF0dHJzID0gc2QtPnNfaWF0dHI7Ci0JaWYgKGlhdHRycykgewotCQkvKiBzeXNmc19kaXJlbnQgaGFzIG5vbi1kZWZhdWx0IGF0dHJpYnV0ZXMKLQkJICogZ2V0IHRoZW0gZm9yIHRoZSBuZXcgaW5vZGUgZnJvbSBwZXJzaXN0ZW50IGNvcHkKLQkJICogaW4gc3lzZnNfZGlyZW50Ci0JCSAqLwotCQlzZXRfaW5vZGVfYXR0cihpbm9kZSwgJmlhdHRycy0+aWFfaWF0dHIpOwotCQlpZiAoaWF0dHJzLT5pYV9zZWNkYXRhKQotCQkJc2VjdXJpdHlfaW5vZGVfbm90aWZ5c2VjY3R4KGlub2RlLAotCQkJCQkJaWF0dHJzLT5pYV9zZWNkYXRhLAotCQkJCQkJaWF0dHJzLT5pYV9zZWNkYXRhX2xlbik7Ci0JfSBlbHNlCi0JCXNldF9kZWZhdWx0X2lub2RlX2F0dHIoaW5vZGUsIHNkLT5zX21vZGUpOworCXNldF9kZWZhdWx0X2lub2RlX2F0dHIoaW5vZGUsIHNkLT5zX21vZGUpOworCXN5c2ZzX3JlZnJlc2hfaW5vZGUoc2QsIGlub2RlKTsKIAogCS8qIGluaXRpYWxpemUgaW5vZGUgYWNjb3JkaW5nIHRvIHR5cGUgKi8KIAlzd2l0Y2ggKHN5c2ZzX3R5cGUoc2QpKSB7CiAJY2FzZSBTWVNGU19ESVI6CiAJCWlub2RlLT5pX29wID0gJnN5c2ZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwogCQlpbm9kZS0+aV9mb3AgPSAmc3lzZnNfZGlyX29wZXJhdGlvbnM7Ci0JCWlub2RlLT5pX25saW5rID0gc3lzZnNfY291bnRfbmxpbmsoc2QpOwogCQlicmVhazsKIAljYXNlIFNZU0ZTX0tPQkpfQVRUUjoKIAkJaW5vZGUtPmlfc2l6ZSA9IFBBR0VfU0laRTsKQEAgLTMxNSwzICszNDQsMTQgQEAKIAllbHNlCiAJCXJldHVybiAtRU5PRU5UOwogfQorCitpbnQgc3lzZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaykKK3sKKwlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCA9IGlub2RlLT5pX3ByaXZhdGU7CisKKwltdXRleF9sb2NrKCZzeXNmc19tdXRleCk7CisJc3lzZnNfcmVmcmVzaF9pbm9kZShzZCwgaW5vZGUpOworCW11dGV4X3VubG9jaygmc3lzZnNfbXV0ZXgpOworCisJcmV0dXJuIGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzaywgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9mcy9zeXNmcy9zeW1saW5rLmMgYi9mcy9zeXNmcy9zeW1saW5rLmMKaW5kZXggYzUwODFhZC4uYzVlZmY0OSAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvc3ltbGluay5jCisrKyBiL2ZzL3N5c2ZzL3N5bWxpbmsuYwpAQCAtMjEwLDEwICsyMTAsMTMgQEAKIH0KIAogY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc3lzZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zID0gewotCS5zZXR4YXR0ciA9IHN5c2ZzX3NldHhhdHRyLAotCS5yZWFkbGluayA9IGdlbmVyaWNfcmVhZGxpbmssCi0JLmZvbGxvd19saW5rID0gc3lzZnNfZm9sbG93X2xpbmssCi0JLnB1dF9saW5rID0gc3lzZnNfcHV0X2xpbmssCisJLnNldHhhdHRyCT0gc3lzZnNfc2V0eGF0dHIsCisJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsJPSBzeXNmc19mb2xsb3dfbGluaywKKwkucHV0X2xpbmsJPSBzeXNmc19wdXRfbGluaywKKwkuc2V0YXR0cgk9IHN5c2ZzX3NldGF0dHIsCisJLmdldGF0dHIJPSBzeXNmc19nZXRhdHRyLAorCS5wZXJtaXNzaW9uCT0gc3lzZnNfcGVybWlzc2lvbiwKIH07CiAKIApkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvc3lzZnMuaCBiL2ZzL3N5c2ZzL3N5c2ZzLmgKaW5kZXggYWY0YzRlNy4uY2E1MmU3YiAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvc3lzZnMuaAorKysgYi9mcy9zeXNmcy9zeXNmcy5oCkBAIC04OSw5ICs4OSw3IEBACiAgKi8KIHN0cnVjdCBzeXNmc19hZGRybV9jeHQgewogCXN0cnVjdCBzeXNmc19kaXJlbnQJKnBhcmVudF9zZDsKLQlzdHJ1Y3QgaW5vZGUJCSpwYXJlbnRfaW5vZGU7CiAJc3RydWN0IHN5c2ZzX2RpcmVudAkqcmVtb3ZlZDsKLQlpbnQJCQljbnQ7CiB9OwogCiAvKgpAQCAtMTA1LDcgKzEwMyw2IEBACiAgKiBkaXIuYwogICovCiBleHRlcm4gc3RydWN0IG11dGV4IHN5c2ZzX211dGV4OwotZXh0ZXJuIHN0cnVjdCBtdXRleCBzeXNmc19yZW5hbWVfbXV0ZXg7CiBleHRlcm4gc3BpbmxvY2tfdCBzeXNmc19hc3NvY19sb2NrOwogCiBleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzeXNmc19kaXJfb3BlcmF0aW9uczsKQEAgLTEzMyw2ICsxMzAsOSBAQAogCQkJc3RydWN0IHN5c2ZzX2RpcmVudCAqKnBfc2QpOwogdm9pZCBzeXNmc19yZW1vdmVfc3ViZGlyKHN0cnVjdCBzeXNmc19kaXJlbnQgKnNkKTsKIAoraW50IHN5c2ZzX3JlbmFtZShzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCwKKwlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpuZXdfcGFyZW50X3NkLCBjb25zdCBjaGFyICpuZXdfbmFtZSk7CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHN5c2ZzX2RpcmVudCAqX19zeXNmc19nZXQoc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QpCiB7CiAJaWYgKHNkKSB7CkBAIC0xNTUsNyArMTU1LDEwIEBACiAgKi8KIHN0cnVjdCBpbm9kZSAqc3lzZnNfZ2V0X2lub2RlKHN0cnVjdCBzeXNmc19kaXJlbnQgKnNkKTsKIHZvaWQgc3lzZnNfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworaW50IHN5c2ZzX3NkX3NldGF0dHIoc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QsIHN0cnVjdCBpYXR0ciAqaWF0dHIpOworaW50IHN5c2ZzX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spOwogaW50IHN5c2ZzX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmlhdHRyKTsKK2ludCBzeXNmc19nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdCAqc3RhdCk7CiBpbnQgc3lzZnNfc2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICp2YWx1ZSwKIAkJc2l6ZV90IHNpemUsIGludCBmbGFncyk7CiBpbnQgc3lzZnNfaGFzaF9hbmRfcmVtb3ZlKHN0cnVjdCBzeXNmc19kaXJlbnQgKmRpcl9zZCwgY29uc3QgY2hhciAqbmFtZSk7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmMKaW5kZXggNzBmOTg5OC4uODc4MTNlNCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuYwpAQCAtMjM1LDcxICsyMzUsMzYgQEAKIH0KIAogLyoKLSAqIEJ1ZmZlcmVkIElPIHdyaXRlIGNvbXBsZXRpb24gZm9yIGRlbGF5ZWQgYWxsb2NhdGUgZXh0ZW50cy4KKyAqIElPIHdyaXRlIGNvbXBsZXRpb24uCiAgKi8KIFNUQVRJQyB2b2lkCi14ZnNfZW5kX2Jpb19kZWxhbGxvYygKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJKndvcmspCi17Ci0JeGZzX2lvZW5kX3QJCSppb2VuZCA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCB4ZnNfaW9lbmRfdCwgaW9fd29yayk7Ci0KLQl4ZnNfc2V0ZmlsZXNpemUoaW9lbmQpOwotCXhmc19kZXN0cm95X2lvZW5kKGlvZW5kKTsKLX0KLQotLyoKLSAqIEJ1ZmZlcmVkIElPIHdyaXRlIGNvbXBsZXRpb24gZm9yIHJlZ3VsYXIsIHdyaXR0ZW4gZXh0ZW50cy4KLSAqLwotU1RBVElDIHZvaWQKLXhmc19lbmRfYmlvX3dyaXR0ZW4oCi0Jc3RydWN0IHdvcmtfc3RydWN0CSp3b3JrKQotewotCXhmc19pb2VuZF90CQkqaW9lbmQgPQotCQljb250YWluZXJfb2Yod29yaywgeGZzX2lvZW5kX3QsIGlvX3dvcmspOwotCi0JeGZzX3NldGZpbGVzaXplKGlvZW5kKTsKLQl4ZnNfZGVzdHJveV9pb2VuZChpb2VuZCk7Ci19Ci0KLS8qCi0gKiBJTyB3cml0ZSBjb21wbGV0aW9uIGZvciB1bndyaXR0ZW4gZXh0ZW50cy4KLSAqCi0gKiBJc3N1ZSB0cmFuc2FjdGlvbnMgdG8gY29udmVydCBhIGJ1ZmZlciByYW5nZSBmcm9tIHVud3JpdHRlbgotICogdG8gd3JpdHRlbiBleHRlbnRzLgotICovCi1TVEFUSUMgdm9pZAoteGZzX2VuZF9iaW9fdW53cml0dGVuKAoreGZzX2VuZF9pbygKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJKndvcmspCiB7CiAJeGZzX2lvZW5kX3QJCSppb2VuZCA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCB4ZnNfaW9lbmRfdCwgaW9fd29yayk7CiAJc3RydWN0IHhmc19pbm9kZQkqaXAgPSBYRlNfSShpb2VuZC0+aW9faW5vZGUpOwotCXhmc19vZmZfdAkJb2Zmc2V0ID0gaW9lbmQtPmlvX29mZnNldDsKLQlzaXplX3QJCQlzaXplID0gaW9lbmQtPmlvX3NpemU7CiAKLQlpZiAobGlrZWx5KCFpb2VuZC0+aW9fZXJyb3IpKSB7Ci0JCWlmICghWEZTX0ZPUkNFRF9TSFVURE9XTihpcC0+aV9tb3VudCkpIHsKLQkJCWludCBlcnJvcjsKLQkJCWVycm9yID0geGZzX2lvbWFwX3dyaXRlX3Vud3JpdHRlbihpcCwgb2Zmc2V0LCBzaXplKTsKLQkJCWlmIChlcnJvcikKLQkJCQlpb2VuZC0+aW9fZXJyb3IgPSBlcnJvcjsKLQkJfQotCQl4ZnNfc2V0ZmlsZXNpemUoaW9lbmQpOworCS8qCisJICogRm9yIHVud3JpdHRlbiBleHRlbnRzIHdlIG5lZWQgdG8gaXNzdWUgdHJhbnNhY3Rpb25zIHRvIGNvbnZlcnQgYQorCSAqIHJhbmdlIHRvIG5vcm1hbCB3cml0dGVuIGV4dGVucyBhZnRlciB0aGUgZGF0YSBJL08gaGFzIGZpbmlzaGVkLgorCSAqLworCWlmIChpb2VuZC0+aW9fdHlwZSA9PSBJT01BUF9VTldSSVRURU4gJiYKKwkgICAgbGlrZWx5KCFpb2VuZC0+aW9fZXJyb3IgJiYgIVhGU19GT1JDRURfU0hVVERPV04oaXAtPmlfbW91bnQpKSkgeworCQlpbnQgZXJyb3I7CisKKwkJZXJyb3IgPSB4ZnNfaW9tYXBfd3JpdGVfdW53cml0dGVuKGlwLCBpb2VuZC0+aW9fb2Zmc2V0LAorCQkJCQkJIGlvZW5kLT5pb19zaXplKTsKKwkJaWYgKGVycm9yKQorCQkJaW9lbmQtPmlvX2Vycm9yID0gZXJyb3I7CiAJfQotCXhmc19kZXN0cm95X2lvZW5kKGlvZW5kKTsKLX0KIAotLyoKLSAqIElPIHJlYWQgY29tcGxldGlvbiBmb3IgcmVndWxhciwgd3JpdHRlbiBleHRlbnRzLgotICovCi1TVEFUSUMgdm9pZAoteGZzX2VuZF9iaW9fcmVhZCgKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJKndvcmspCi17Ci0JeGZzX2lvZW5kX3QJCSppb2VuZCA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCB4ZnNfaW9lbmRfdCwgaW9fd29yayk7Ci0KKwkvKgorCSAqIFdlIG1pZ2h0IGhhdmUgdG8gdXBkYXRlIHRoZSBvbi1kaXNrIGZpbGUgc2l6ZSBhZnRlciBleHRlbmRpbmcKKwkgKiB3cml0ZXMuCisJICovCisJaWYgKGlvZW5kLT5pb190eXBlICE9IElPTUFQX1JFQUQpCisJCXhmc19zZXRmaWxlc2l6ZShpb2VuZCk7CiAJeGZzX2Rlc3Ryb3lfaW9lbmQoaW9lbmQpOwogfQogCkBAIC0zMTQsMTAgKzI3OSwxMCBAQAogCWludAkJd2FpdCkKIHsKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmaW9lbmQtPmlvX3JlbWFpbmluZykpIHsKLQkJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxID0geGZzZGF0YWRfd29ya3F1ZXVlOwotCQlpZiAoaW9lbmQtPmlvX3dvcmsuZnVuYyA9PSB4ZnNfZW5kX2Jpb191bndyaXR0ZW4pCi0JCQl3cSA9IHhmc2NvbnZlcnRkX3dvcmtxdWV1ZTsKKwkJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOwogCisJCXdxID0gKGlvZW5kLT5pb190eXBlID09IElPTUFQX1VOV1JJVFRFTikgPworCQkJeGZzY29udmVydGRfd29ya3F1ZXVlIDogeGZzZGF0YWRfd29ya3F1ZXVlOwogCQlxdWV1ZV93b3JrKHdxLCAmaW9lbmQtPmlvX3dvcmspOwogCQlpZiAod2FpdCkKIAkJCWZsdXNoX3dvcmtxdWV1ZSh3cSk7CkBAIC0zNTUsMTUgKzMyMCw3IEBACiAJaW9lbmQtPmlvX29mZnNldCA9IDA7CiAJaW9lbmQtPmlvX3NpemUgPSAwOwogCi0JaWYgKHR5cGUgPT0gSU9NQVBfVU5XUklUVEVOKQotCQlJTklUX1dPUksoJmlvZW5kLT5pb193b3JrLCB4ZnNfZW5kX2Jpb191bndyaXR0ZW4pOwotCWVsc2UgaWYgKHR5cGUgPT0gSU9NQVBfREVMQVkpCi0JCUlOSVRfV09SSygmaW9lbmQtPmlvX3dvcmssIHhmc19lbmRfYmlvX2RlbGFsbG9jKTsKLQllbHNlIGlmICh0eXBlID09IElPTUFQX1JFQUQpCi0JCUlOSVRfV09SSygmaW9lbmQtPmlvX3dvcmssIHhmc19lbmRfYmlvX3JlYWQpOwotCWVsc2UKLQkJSU5JVF9XT1JLKCZpb2VuZC0+aW9fd29yaywgeGZzX2VuZF9iaW9fd3JpdHRlbik7Ci0KKwlJTklUX1dPUksoJmlvZW5kLT5pb193b3JrLCB4ZnNfZW5kX2lvKTsKIAlyZXR1cm4gaW9lbmQ7CiB9CiAKQEAgLTM4MCw3ICszMzcsNyBAQAogCXJldHVybiAteGZzX2lvbWFwKFhGU19JKGlub2RlKSwgb2Zmc2V0LCBjb3VudCwgZmxhZ3MsIG1hcHAsICZubWFwcyk7CiB9CiAKLVNUQVRJQ19JTkxJTkUgaW50CitTVEFUSUMgaW50CiB4ZnNfaW9tYXBfdmFsaWQoCiAJeGZzX2lvbWFwX3QJCSppb21hcHAsCiAJbG9mZl90CQkJb2Zmc2V0KQpAQCAtNDEyLDggKzM2OSw5IEBACiAKIFNUQVRJQyB2b2lkCiB4ZnNfc3VibWl0X2lvZW5kX2JpbygKLQl4ZnNfaW9lbmRfdAkqaW9lbmQsCi0Jc3RydWN0IGJpbwkqYmlvKQorCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjLAorCXhmc19pb2VuZF90CQkqaW9lbmQsCisJc3RydWN0IGJpbwkJKmJpbykKIHsKIAlhdG9taWNfaW5jKCZpb2VuZC0+aW9fcmVtYWluaW5nKTsKIAliaW8tPmJpX3ByaXZhdGUgPSBpb2VuZDsKQEAgLTQyNiw3ICszODQsOCBAQAogCWlmICh4ZnNfaW9lbmRfbmV3X2VvZihpb2VuZCkpCiAJCXhmc19tYXJrX2lub2RlX2RpcnR5X3N5bmMoWEZTX0koaW9lbmQtPmlvX2lub2RlKSk7CiAKLQlzdWJtaXRfYmlvKFdSSVRFLCBiaW8pOworCXN1Ym1pdF9iaW8od2JjLT5zeW5jX21vZGUgPT0gV0JfU1lOQ19BTEwgPworCQkgICBXUklURV9TWU5DX1BMVUcgOiBXUklURSwgYmlvKTsKIAlBU1NFUlQoIWJpb19mbGFnZ2VkKGJpbywgQklPX0VPUE5PVFNVUFApKTsKIAliaW9fcHV0KGJpbyk7CiB9CkBAIC01MDUsNiArNDY0LDcgQEAKICAqLwogU1RBVElDIHZvaWQKIHhmc19zdWJtaXRfaW9lbmQoCisJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMsCiAJeGZzX2lvZW5kX3QJCSppb2VuZCkKIHsKIAl4ZnNfaW9lbmRfdAkJKmhlYWQgPSBpb2VuZDsKQEAgLTUzMywxOSArNDkzLDE5IEBACiAgcmV0cnk6CiAJCQkJYmlvID0geGZzX2FsbG9jX2lvZW5kX2JpbyhiaCk7CiAJCQl9IGVsc2UgaWYgKGJoLT5iX2Jsb2NrbnIgIT0gbGFzdGJsb2NrICsgMSkgewotCQkJCXhmc19zdWJtaXRfaW9lbmRfYmlvKGlvZW5kLCBiaW8pOworCQkJCXhmc19zdWJtaXRfaW9lbmRfYmlvKHdiYywgaW9lbmQsIGJpbyk7CiAJCQkJZ290byByZXRyeTsKIAkJCX0KIAogCQkJaWYgKGJpb19hZGRfYnVmZmVyKGJpbywgYmgpICE9IGJoLT5iX3NpemUpIHsKLQkJCQl4ZnNfc3VibWl0X2lvZW5kX2Jpbyhpb2VuZCwgYmlvKTsKKwkJCQl4ZnNfc3VibWl0X2lvZW5kX2Jpbyh3YmMsIGlvZW5kLCBiaW8pOwogCQkJCWdvdG8gcmV0cnk7CiAJCQl9CiAKIAkJCWxhc3RibG9jayA9IGJoLT5iX2Jsb2NrbnI7CiAJCX0KIAkJaWYgKGJpbykKLQkJCXhmc19zdWJtaXRfaW9lbmRfYmlvKGlvZW5kLCBiaW8pOworCQkJeGZzX3N1Ym1pdF9pb2VuZF9iaW8od2JjLCBpb2VuZCwgYmlvKTsKIAkJeGZzX2ZpbmlzaF9pb2VuZChpb2VuZCwgMCk7CiAJfSB3aGlsZSAoKGlvZW5kID0gbmV4dCkgIT0gTlVMTCk7CiB9CkBAIC0xMTkxLDcgKzExNTEsNyBAQAogCX0KIAogCWlmIChpb2hlYWQpCi0JCXhmc19zdWJtaXRfaW9lbmQoaW9oZWFkKTsKKwkJeGZzX3N1Ym1pdF9pb2VuZCh3YmMsIGlvaGVhZCk7CiAKIAlyZXR1cm4gcGFnZV9kaXJ0eTsKIApAQCAtMTUyOCw3ICsxNDg4LDcgQEAKIAkJICogZGlkbid0IG1hcCBhbiB1bndyaXR0ZW4gZXh0ZW50IHNvIHN3aXRjaCBpdCdzIGNvbXBsZXRpb24KIAkJICogaGFuZGxlci4KIAkJICovCi0JCUlOSVRfV09SSygmaW9lbmQtPmlvX3dvcmssIHhmc19lbmRfYmlvX3dyaXR0ZW4pOworCQlpb2VuZC0+aW9fdHlwZSA9IElPTUFQX05FVzsKIAkJeGZzX2ZpbmlzaF9pb2VuZChpb2VuZCwgMCk7CiAJfQogCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5jCmluZGV4IDk2NWRmMTIuLjRkZGM5NzMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5jCkBAIC0xNDksNyArMTQ5LDcgQEAKIAlyZXR1cm4gbWFzazsKIH0KIAotU1RBVElDX0lOTElORSB2b2lkCitTVEFUSUMgdm9pZAogc2V0X3BhZ2VfcmVnaW9uKAogCXN0cnVjdCBwYWdlCSpwYWdlLAogCXNpemVfdAkJb2Zmc2V0LApAQCAtMTYxLDcgKzE2MSw3IEBACiAJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKIH0KIAotU1RBVElDX0lOTElORSBpbnQKK1NUQVRJQyBpbnQKIHRlc3RfcGFnZV9yZWdpb24oCiAJc3RydWN0IHBhZ2UJKnBhZ2UsCiAJc2l6ZV90CQlvZmZzZXQsCkBAIC01ODIsNyArNTgyLDcgQEAKICAqCWFsdGhvdWdoIGJhY2tpbmcgc3RvcmFnZSBtYXkgbm90IGJlLgogICovCiB4ZnNfYnVmX3QgKgoteGZzX2J1Zl9nZXRfZmxhZ3MoCit4ZnNfYnVmX2dldCgKIAl4ZnNfYnVmdGFyZ190CQkqdGFyZ2V0LC8qIHRhcmdldCBmb3IgYnVmZmVyCQkqLwogCXhmc19vZmZfdAkJaW9mZiwJLyogc3RhcnRpbmcgb2Zmc2V0IG9mIHJhbmdlCSovCiAJc2l6ZV90CQkJaXNpemUsCS8qIGxlbmd0aCBvZiByYW5nZQkJKi8KQEAgLTY2MSw3ICs2NjEsNyBAQAogfQogCiB4ZnNfYnVmX3QgKgoteGZzX2J1Zl9yZWFkX2ZsYWdzKAoreGZzX2J1Zl9yZWFkKAogCXhmc19idWZ0YXJnX3QJCSp0YXJnZXQsCiAJeGZzX29mZl90CQlpb2ZmLAogCXNpemVfdAkJCWlzaXplLApAQCAtNjcxLDcgKzY3MSw3IEBACiAKIAlmbGFncyB8PSBYQkZfUkVBRDsKIAotCWJwID0geGZzX2J1Zl9nZXRfZmxhZ3ModGFyZ2V0LCBpb2ZmLCBpc2l6ZSwgZmxhZ3MpOworCWJwID0geGZzX2J1Zl9nZXQodGFyZ2V0LCBpb2ZmLCBpc2l6ZSwgZmxhZ3MpOwogCWlmIChicCkgewogCQlpZiAoIVhGU19CVUZfSVNET05FKGJwKSkgewogCQkJWEJfVFJBQ0UoYnAsICJyZWFkIiwgKHVuc2lnbmVkIGxvbmcpZmxhZ3MpOwpAQCAtNzE4LDcgKzcxOCw3IEBACiAJCXJldHVybjsKIAogCWZsYWdzIHw9IChYQkZfVFJZTE9DS3xYQkZfQVNZTkN8WEJGX1JFQURfQUhFQUQpOwotCXhmc19idWZfcmVhZF9mbGFncyh0YXJnZXQsIGlvZmYsIGlzaXplLCBmbGFncyk7CisJeGZzX2J1Zl9yZWFkKHRhcmdldCwgaW9mZiwgaXNpemUsIGZsYWdzKTsKIH0KIAogeGZzX2J1Zl90ICoKQEAgLTExMTMsNyArMTExMyw3IEBACiAJeGZzX2J1Zl9kZWx3cmlfcXVldWUoYnAsIDEpOwogfQogCi1TVEFUSUNfSU5MSU5FIHZvaWQKK1NUQVRJQyB2b2lkCiBfeGZzX2J1Zl9pb2VuZCgKIAl4ZnNfYnVmX3QJCSpicCwKIAlpbnQJCQlzY2hlZHVsZSkKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmgKaW5kZXggOWI0ZDY2Ni4uNWYwN2RkOSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmgKQEAgLTE4NiwxNSArMTg2LDEwIEBACiAjZGVmaW5lIHhmc19pbmNvcmUoYnVmdGFyZyxibGtubyxsZW4sbG9ja2l0KSBcCiAJX3hmc19idWZfZmluZChidWZ0YXJnLCBibGtubyAsbGVuLCBsb2NraXQsIE5VTEwpCiAKLWV4dGVybiB4ZnNfYnVmX3QgKnhmc19idWZfZ2V0X2ZsYWdzKHhmc19idWZ0YXJnX3QgKiwgeGZzX29mZl90LCBzaXplX3QsCitleHRlcm4geGZzX2J1Zl90ICp4ZnNfYnVmX2dldCh4ZnNfYnVmdGFyZ190ICosIHhmc19vZmZfdCwgc2l6ZV90LAogCQkJCXhmc19idWZfZmxhZ3NfdCk7Ci0jZGVmaW5lIHhmc19idWZfZ2V0KHRhcmdldCwgYmxrbm8sIGxlbiwgZmxhZ3MpIFwKLQl4ZnNfYnVmX2dldF9mbGFncygodGFyZ2V0KSwgKGJsa25vKSwgKGxlbiksIFhCRl9MT0NLIHwgWEJGX01BUFBFRCkKLQotZXh0ZXJuIHhmc19idWZfdCAqeGZzX2J1Zl9yZWFkX2ZsYWdzKHhmc19idWZ0YXJnX3QgKiwgeGZzX29mZl90LCBzaXplX3QsCitleHRlcm4geGZzX2J1Zl90ICp4ZnNfYnVmX3JlYWQoeGZzX2J1ZnRhcmdfdCAqLCB4ZnNfb2ZmX3QsIHNpemVfdCwKIAkJCQl4ZnNfYnVmX2ZsYWdzX3QpOwotI2RlZmluZSB4ZnNfYnVmX3JlYWQodGFyZ2V0LCBibGtubywgbGVuLCBmbGFncykgXAotCXhmc19idWZfcmVhZF9mbGFncygodGFyZ2V0KSwgKGJsa25vKSwgKGxlbiksIFhCRl9MT0NLIHwgWEJGX01BUFBFRCkKIAogZXh0ZXJuIHhmc19idWZfdCAqeGZzX2J1Zl9nZXRfZW1wdHkoc2l6ZV90LCB4ZnNfYnVmdGFyZ190ICopOwogZXh0ZXJuIHhmc19idWZfdCAqeGZzX2J1Zl9nZXRfbm9hZGRyKHNpemVfdCwgeGZzX2J1ZnRhcmdfdCAqKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYwppbmRleCBlZmY2MWUyLi5lNGNhZWIyIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19maWxlLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZmlsZS5jCkBAIC01Miw3ICs1Miw3IEBACiAJbG9mZl90CQkJcG9zKQogewogCXN0cnVjdCBmaWxlCQkqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7Ci0JaW50CQkJaW9mbGFncyA9IElPX0lTQUlPOworCWludAkJCWlvZmxhZ3MgPSAwOwogCiAJQlVHX09OKGlvY2ItPmtpX3BvcyAhPSBwb3MpOwogCWlmICh1bmxpa2VseShmaWxlLT5mX2ZsYWdzICYgT19ESVJFQ1QpKQpAQCAtNzEsNyArNzEsNyBAQAogCWxvZmZfdAkJCXBvcykKIHsKIAlzdHJ1Y3QgZmlsZQkJKmZpbGUgPSBpb2NiLT5raV9maWxwOwotCWludAkJCWlvZmxhZ3MgPSBJT19JU0FJTzsKKwlpbnQJCQlpb2ZsYWdzID0gMDsKIAogCUJVR19PTihpb2NiLT5raV9wb3MgIT0gcG9zKTsKIAlpZiAodW5saWtlbHkoZmlsZS0+Zl9mbGFncyAmIE9fRElSRUNUKSkKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuYwppbmRleCBjZDQyZWY3Li4xZjNiNGI4IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5jCkBAIC01NzMsOCArNTczLDggQEAKIAliZi5sX2xlbiA9IGxlbjsKIAogCXhmc19pbG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKLQllcnJvciA9IHhmc19jaGFuZ2VfZmlsZV9zcGFjZShpcCwgWEZTX0lPQ19SRVNWU1AsICZiZiwKLQkJCQkgICAgICAwLCBYRlNfQVRUUl9OT0xPQ0spOworCWVycm9yID0gLXhmc19jaGFuZ2VfZmlsZV9zcGFjZShpcCwgWEZTX0lPQ19SRVNWU1AsICZiZiwKKwkJCQkgICAgICAgMCwgWEZTX0FUVFJfTk9MT0NLKTsKIAlpZiAoIWVycm9yICYmICEobW9kZSAmIEZBTExPQ19GTF9LRUVQX1NJWkUpICYmCiAJICAgIG9mZnNldCArIGxlbiA+IGlfc2l6ZV9yZWFkKGlub2RlKSkKIAkJbmV3X3NpemUgPSBvZmZzZXQgKyBsZW47CkBAIC01ODUsNyArNTg1LDcgQEAKIAogCQlpYXR0ci5pYV92YWxpZCA9IEFUVFJfU0laRTsKIAkJaWF0dHIuaWFfc2l6ZSA9IG5ld19zaXplOwotCQllcnJvciA9IHhmc19zZXRhdHRyKGlwLCAmaWF0dHIsIFhGU19BVFRSX05PTE9DSyk7CisJCWVycm9yID0gLXhmc19zZXRhdHRyKGlwLCAmaWF0dHIsIFhGU19BVFRSX05PTE9DSyk7CiAJfQogCiAJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCk7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19scncuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2xydy5jCmluZGV4IDA3MjA1MGYuLjFiZjQ3ZjIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2xydy5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2xydy5jCkBAIC0yNTUsOCArMjU1LDYgQEAKIAogCWlvY2ItPmtpX3BvcyA9ICpvZmZzZXQ7CiAJcmV0ID0gZ2VuZXJpY19maWxlX2Fpb19yZWFkKGlvY2IsIGlvdnAsIHNlZ3MsICpvZmZzZXQpOwotCWlmIChyZXQgPT0gLUVJT0NCUVVFVUVEICYmICEoaW9mbGFncyAmIElPX0lTQUlPKSkKLQkJcmV0ID0gd2FpdF9vbl9zeW5jX2tpb2NiKGlvY2IpOwogCWlmIChyZXQgPiAwKQogCQlYRlNfU1RBVFNfQUREKHhzX3JlYWRfYnl0ZXMsIHJldCk7CiAKQEAgLTc3NCw5ICs3NzIsNiBAQAogCiAJY3VycmVudC0+YmFja2luZ19kZXZfaW5mbyA9IE5VTEw7CiAKLQlpZiAocmV0ID09IC1FSU9DQlFVRVVFRCAmJiAhKGlvZmxhZ3MgJiBJT19JU0FJTykpCi0JCXJldCA9IHdhaXRfb25fc3luY19raW9jYihpb2NiKTsKLQogCWlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwogCWlmICh1bmxpa2VseShyZXQgPCAwICYmIHJldCAhPSAtRUZBVUxUICYmICpvZmZzZXQgPiBpc2l6ZSkpCiAJCSpvZmZzZXQgPSBpc2l6ZTsKQEAgLTgxMSw3ICs4MDYsNyBAQAogCVhGU19TVEFUU19BREQoeHNfd3JpdGVfYnl0ZXMsIHJldCk7CiAKIAkvKiBIYW5kbGUgdmFyaW91cyBTWU5DLXR5cGUgd3JpdGVzICovCi0JaWYgKChmaWxlLT5mX2ZsYWdzICYgT19TWU5DKSB8fCBJU19TWU5DKGlub2RlKSkgeworCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fRFNZTkMpIHx8IElTX1NZTkMoaW5vZGUpKSB7CiAJCWxvZmZfdCBlbmQgPSBwb3MgKyByZXQgLSAxOwogCQlpbnQgZXJyb3IyOwogCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYwppbmRleCAxOGE0YjhlLi4xYmZiMGU5IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKQEAgLTkzMCwxMyArOTMwLDM5IEBACiAgKi8KIFNUQVRJQyB2b2lkCiB4ZnNfZnNfZGVzdHJveV9pbm9kZSgKLQlzdHJ1Y3QgaW5vZGUJKmlub2RlKQorCXN0cnVjdCBpbm9kZQkJKmlub2RlKQogewotCXhmc19pbm9kZV90CQkqaXAgPSBYRlNfSShpbm9kZSk7CisJc3RydWN0IHhmc19pbm9kZQkqaXAgPSBYRlNfSShpbm9kZSk7CisKKwl4ZnNfaXRyYWNlX2VudHJ5KGlwKTsKIAogCVhGU19TVEFUU19JTkModm5fcmVjbGFpbSk7Ci0JaWYgKHhmc19yZWNsYWltKGlwKSkKLQkJcGFuaWMoIiVzOiBjYW5ub3QgcmVjbGFpbSAweCVwXG4iLCBfX2Z1bmNfXywgaW5vZGUpOworCisJLyogYmFkIGlub2RlLCBnZXQgb3V0IGhlcmUgQVNBUCAqLworCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpKQorCQlnb3RvIG91dF9yZWNsYWltOworCisJeGZzX2lvZW5kX3dhaXQoaXApOworCisJQVNTRVJUKFhGU19GT1JDRURfU0hVVERPV04oaXAtPmlfbW91bnQpIHx8IGlwLT5pX2RlbGF5ZWRfYmxrcyA9PSAwKTsKKworCS8qCisJICogV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlIHdpdGggb25lIG9mIHRoZSByZWNsYWltIGZsYWdzIGFscmVhZHkgc2V0LgorCSAqLworCUFTU0VSVF9BTFdBWVMoIXhmc19pZmxhZ3NfdGVzdChpcCwgWEZTX0lSRUNMQUlNQUJMRSkpOworCUFTU0VSVF9BTFdBWVMoIXhmc19pZmxhZ3NfdGVzdChpcCwgWEZTX0lSRUNMQUlNKSk7CisKKwkvKgorCSAqIElmIHdlIGhhdmUgbm90aGluZyB0byBmbHVzaCB3aXRoIHRoaXMgaW5vZGUgdGhlbiBjb21wbGV0ZSB0aGUKKwkgKiB0ZWFyZG93biBub3csIG90aGVyd2lzZSBkZWxheSB0aGUgZmx1c2ggb3BlcmF0aW9uLgorCSAqLworCWlmICgheGZzX2lub2RlX2NsZWFuKGlwKSkgeworCQl4ZnNfaW5vZGVfc2V0X3JlY2xhaW1fdGFnKGlwKTsKKwkJcmV0dXJuOworCX0KKworb3V0X3JlY2xhaW06CisJeGZzX2lyZWNsYWltKGlwKTsKIH0KIAogLyoKQEAgLTk3Myw3ICs5OTksNiBAQAogCiAJbXJsb2NrX2luaXQoJmlwLT5pX2xvY2ssIE1STE9DS19BTExPV19FUVVBTF9QUkl8TVJMT0NLX0JBUlJJRVIsCiAJCSAgICAgInhmc2lubyIsIGlwLT5pX2lubyk7Ci0JbXJsb2NrX2luaXQoJmlwLT5pX2lvbG9jaywgTVJMT0NLX0JBUlJJRVIsICJ4ZnNpbyIsIGlwLT5pX2lubyk7CiB9CiAKIC8qCkBAIC0xMDc1LDYgKzExMDAsMjAgQEAKIAlYRlNfU1RBVFNfSU5DKHZuX3JlbW92ZSk7CiAJWEZTX1NUQVRTX0RFQyh2bl9hY3RpdmUpOwogCisJLyoKKwkgKiBUaGUgaW9sb2NrIGlzIHVzZWQgYnkgdGhlIGZpbGUgc3lzdGVtIHRvIGNvb3JkaW5hdGUgcmVhZHMsCisJICogd3JpdGVzLCBhbmQgYmxvY2sgdHJ1bmNhdGVzLiAgVXAgdG8gdGhpcyBwb2ludCB0aGUgbG9jaworCSAqIHByb3RlY3RlZCBjb25jdXJyZW50IGFjY2Vzc2VzIGJ5IHVzZXJzIG9mIHRoZSBpbm9kZS4gIEJ1dAorCSAqIGZyb20gaGVyZSBmb3J3YXJkIHdlJ3JlIGRvaW5nIHNvbWUgZmluYWwgcHJvY2Vzc2luZyBvZiB0aGUKKwkgKiBpbm9kZSBiZWNhdXNlIHdlJ3JlIGRvbmUgd2l0aCBpdCwgYW5kIGFsdGhvdWdoIHdlIHJldXNlIHRoZQorCSAqIGlvbG9jayBmb3IgcHJvdGVjdGlvbiBpdCBpcyByZWFsbHkgYSBkaXN0aW5jdCBsb2NrIGNsYXNzCisJICogKGluIHRoZSBsb2NrZGVwIHNlbnNlKSBmcm9tIGJlZm9yZS4gIFRvIGtlZXAgbG9ja2RlcCBoYXBweQorCSAqIChhbmQgYmFzaWNhbGx5IGluZGljYXRlIHdoYXQgd2UgYXJlIGRvaW5nKSwgd2UgZXhwbGljaXRseQorCSAqIHJlLWluaXQgdGhlIGlvbG9jayBoZXJlLgorCSAqLworCUFTU0VSVCghcndzZW1faXNfbG9ja2VkKCZpcC0+aV9pb2xvY2subXJfbG9jaykpOworCW1ybG9ja19pbml0KCZpcC0+aV9pb2xvY2ssIE1STE9DS19CQVJSSUVSLCAieGZzaW8iLCBpcC0+aV9pbm8pOworCiAJeGZzX2luYWN0aXZlKGlwKTsKIH0KIApAQCAtMTA5Miw4ICsxMTMxLDYgQEAKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sJKnNiKQogewogCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gWEZTX00oc2IpOwotCXN0cnVjdCB4ZnNfaW5vZGUJKnJpcCA9IG1wLT5tX3Jvb3RpcDsKLQlpbnQJCQl1bm1vdW50X2V2ZW50X2ZsYWdzID0gMDsKIAogCXhmc19zeW5jZF9zdG9wKG1wKTsKIApAQCAtMTEwOSwyMCArMTE0Niw3IEBACiAJCXhmc19zeW5jX2F0dHIobXAsIDApOwogCX0KIAotI2lmZGVmIEhBVkVfRE1BUEkKLQlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfRE1BUEkpIHsKLQkJdW5tb3VudF9ldmVudF9mbGFncyA9Ci0JCQkobXAtPm1fZG1ldm1hc2sgJiAoMSA8PCBETV9FVkVOVF9VTk1PVU5UKSkgPwotCQkJCTAgOiBETV9GTEFHU19VTldBTlRFRDsKLQkJLyoKLQkJICogSWdub3JlIGVycm9yIGZyb20gZG1hcGkgaGVyZSwgZmlyc3QgdW5tb3VudCBpcyBub3QgYWxsb3dlZAotCQkgKiB0byBmYWlsIGFueXdheSwgYW5kIHNlY29uZCB3ZSB3b3VsZG4ndCB3YW50IHRvIGZhaWwgYQotCQkgKiB1bm1vdW50IGJlY2F1c2Ugb2YgZG1hcGkuCi0JCSAqLwotCQlYRlNfU0VORF9QUkVVTk1PVU5UKG1wLCByaXAsIERNX1JJR0hUX05VTEwsIHJpcCwgRE1fUklHSFRfTlVMTCwKLQkJCQlOVUxMLCBOVUxMLCAwLCAwLCB1bm1vdW50X2V2ZW50X2ZsYWdzKTsKLQl9Ci0jZW5kaWYKKwlYRlNfU0VORF9QUkVVTk1PVU5UKG1wKTsKIAogCS8qCiAJICogQmxvdyBhd2F5IGFueSByZWZlcmVuY2VkIGlub2RlIGluIHRoZSBmaWxlc3RyZWFtcyBjYWNoZS4KQEAgLTExMzMsMTAgKzExNTcsNyBAQAogCiAJWEZTX2JmbHVzaChtcC0+bV9kZGV2X3RhcmdwKTsKIAotCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9ETUFQSSkgewotCQlYRlNfU0VORF9VTk1PVU5UKG1wLCByaXAsIERNX1JJR0hUX05VTEwsIDAsIDAsCi0JCQkJdW5tb3VudF9ldmVudF9mbGFncyk7Ci0JfQorCVhGU19TRU5EX1VOTU9VTlQobXApOwogCiAJeGZzX3VubW91bnRmcyhtcCk7CiAJeGZzX2ZyZWVzYihtcCk7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zeW5jLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19zeW5jLmMKaW5kZXggOTYxZGYwYS4uZDg5NWEzYSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3luYy5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N5bmMuYwpAQCAtNjYzLDEwICs2NjMsOSBAQAogCWt0aHJlYWRfc3RvcChtcC0+bV9zeW5jX3Rhc2spOwogfQogCi1pbnQKK1NUQVRJQyBpbnQKIHhmc19yZWNsYWltX2lub2RlKAogCXhmc19pbm9kZV90CSppcCwKLQlpbnQJCWxvY2tlZCwKIAlpbnQJCXN5bmNfbW9kZSkKIHsKIAl4ZnNfcGVyYWdfdAkqcGFnID0geGZzX2dldF9wZXJhZyhpcC0+aV9tb3VudCwgaXAtPmlfaW5vKTsKQEAgLTY4MiwxMCArNjgxLDYgQEAKIAkgICAgIV9feGZzX2lmbGFnc190ZXN0KGlwLCBYRlNfSVJFQ0xBSU1BQkxFKSkgewogCQlzcGluX3VubG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7CiAJCXdyaXRlX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOwotCQlpZiAobG9ja2VkKSB7Ci0JCQl4ZnNfaWZ1bmxvY2soaXApOwotCQkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKLQkJfQogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAJX194ZnNfaWZsYWdzX3NldChpcCwgWEZTX0lSRUNMQUlNKTsKQEAgLTcwNCwxMCArNjk5LDggQEAKIAkgKiBXZSBnZXQgdGhlIGZsdXNoIGxvY2sgcmVnYXJkbGVzcywgdGhvdWdoLCBqdXN0IHRvIG1ha2Ugc3VyZQogCSAqIHdlIGRvbid0IGZyZWUgaXQgd2hpbGUgaXQgaXMgYmVpbmcgZmx1c2hlZC4KIAkgKi8KLQlpZiAoIWxvY2tlZCkgewotCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKLQkJeGZzX2lmbG9jayhpcCk7Ci0JfQorCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCXhmc19pZmxvY2soaXApOwogCiAJLyoKIAkgKiBJbiB0aGUgY2FzZSBvZiBhIGZvcmNlZCBzaHV0ZG93biB3ZSByZWx5IG9uIHhmc19pZmx1c2goKSB0bwpAQCAtNzc4LDcgKzc3MSw3IEBACiAJfQogCXJlYWRfdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CiAKLQlyZXR1cm4geGZzX3JlY2xhaW1faW5vZGUoaXAsIDAsIGZsYWdzKTsKKwlyZXR1cm4geGZzX3JlY2xhaW1faW5vZGUoaXAsIGZsYWdzKTsKIH0KIAogaW50CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zeW5jLmggYi9mcy94ZnMvbGludXgtMi42L3hmc19zeW5jLmgKaW5kZXggMjc5MjBlYi4uYTUwMGI0ZCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3luYy5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N5bmMuaApAQCAtNDQsNyArNDQsNiBAQAogCiB2b2lkIHhmc19mbHVzaF9pbm9kZXMoc3RydWN0IHhmc19pbm9kZSAqaXApOwogCi1pbnQgeGZzX3JlY2xhaW1faW5vZGUoc3RydWN0IHhmc19pbm9kZSAqaXAsIGludCBsb2NrZWQsIGludCBzeW5jX21vZGUpOwogaW50IHhmc19yZWNsYWltX2lub2RlcyhzdHJ1Y3QgeGZzX21vdW50ICptcCwgaW50IG1vZGUpOwogCiB2b2lkIHhmc19pbm9kZV9zZXRfcmVjbGFpbV90YWcoc3RydWN0IHhmc19pbm9kZSAqaXApOwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zub2RlLmgKaW5kZXggYWQ3ZmJlYS4uMDBjYWJmNSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5oCkBAIC0zNiw3ICszNiw2IEBACiAvKgogICogRmxhZ3MgZm9yIHJlYWQvd3JpdGUgY2FsbHMgLSBzYW1lIHZhbHVlcyBhcyBJUklYCiAgKi8KLSNkZWZpbmUgSU9fSVNBSU8JMHgwMDAwMQkJLyogZG9uJ3Qgd2FpdCBmb3IgY29tcGxldGlvbiAqLwogI2RlZmluZSBJT19JU0RJUkVDVAkweDAwMDA0CQkvKiBieXBhc3MgcGFnZSBjYWNoZSAqLwogI2RlZmluZSBJT19JTlZJUwkweDAwMDIwCQkvKiBkb24ndCB1cGRhdGUgaW5vZGUgdGltZXN0YW1wcyAqLwogCmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5oIGIvZnMveGZzL3N1cHBvcnQvZGVidWcuaAppbmRleCA2ZjRmZDM3Li5kMmQyMDQ2IDEwMDY0NAotLS0gYS9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5oCisrKyBiL2ZzL3hmcy9zdXBwb3J0L2RlYnVnLmgKQEAgLTQxLDEwICs0MSw2IEBACiAjIGRlZmluZSBTVEFUSUMgc3RhdGljIG5vaW5saW5lCiAjZW5kaWYKIAotI2lmbmRlZiBTVEFUSUNfSU5MSU5FCi0jIGRlZmluZSBTVEFUSUNfSU5MSU5FIHN0YXRpYyBpbmxpbmUKLSNlbmRpZgotCiAjZWxzZSAvKiBERUJVRyAqLwogCiAjZGVmaW5lIEFTU0VSVChleHByKQlcCkBAIC01NCwxOSArNTAsNSBAQAogIyBkZWZpbmUgU1RBVElDIG5vaW5saW5lCiAjZW5kaWYKIAotLyoKLSAqIFdlIHN0b3AgaW5saW5pbmcgb2YgaW5saW5lIGZ1bmN0aW9ucyBpbiBkZWJ1ZyBtb2RlLgotICogVW5mb3J0dW5hdGVseSwgdGhpcyBtZWFucyBzdGF0aWMgaW5saW5lIGluIGhlYWRlciBmaWxlcwotICogZ2V0IG11bHRpcGxlIGRlZmluaXRpb25zLCBzbyB0aGV5IG5lZWQgdG8gcmVtYWluIHN0YXRpYy4KLSAqIFRoaXMgdGhlbiBnaXZlcyB0b25uZXMgb2Ygd2FybmluZ3MgYWJvdXQgdW51c2VkIGJ1dCBkZWZpbmVkCi0gKiBmdW5jdGlvbnMsIHNvIHdlIG5lZWQgdG8gYWRkIHRoZSB1bnVzZWQgYXR0cmlidXRlIHRvIHByZXZlbnQKLSAqIHRoZXNlIHNwdXJpb3VzIHdhcm5pbmdzLgotICovCi0jaWZuZGVmIFNUQVRJQ19JTkxJTkUKLSMgZGVmaW5lIFNUQVRJQ19JTkxJTkUgc3RhdGljIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSBub2lubGluZQotI2VuZGlmCi0KICNlbmRpZiAvKiBERUJVRyAqLwotCi0KICNlbmRpZiAgLyogX19YRlNfU1VQUE9SVF9ERUJVR19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYXR0ci5jIGIvZnMveGZzL3hmc19hdHRyLmMKaW5kZXggNGVjZTE5MC4uOGZlNmY2YjcgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYXR0ci5jCisrKyBiL2ZzL3hmcy94ZnNfYXR0ci5jCkBAIC0xMjMsOSArMTIzLDEzIEBACiAgKiBPdmVyYWxsIGV4dGVybmFsIGludGVyZmFjZSByb3V0aW5lcy4KICAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAotaW50Ci14ZnNfYXR0cl9mZXRjaCh4ZnNfaW5vZGVfdCAqaXAsIHN0cnVjdCB4ZnNfbmFtZSAqbmFtZSwKLQkJY2hhciAqdmFsdWUsIGludCAqdmFsdWVsZW5wLCBpbnQgZmxhZ3MpCitTVEFUSUMgaW50Cit4ZnNfYXR0cl9nZXRfaW50KAorCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAorCXN0cnVjdCB4ZnNfbmFtZQkJKm5hbWUsCisJY2hhcgkJCSp2YWx1ZSwKKwlpbnQJCQkqdmFsdWVsZW5wLAorCWludAkJCWZsYWdzKQogewogCXhmc19kYV9hcmdzX3QgICBhcmdzOwogCWludCAgICAgICAgICAgICBlcnJvcjsKQEAgLTE4OCw3ICsxOTIsNyBAQAogCQlyZXR1cm4gZXJyb3I7CiAKIAl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOwotCWVycm9yID0geGZzX2F0dHJfZmV0Y2goaXAsICZ4bmFtZSwgdmFsdWUsIHZhbHVlbGVucCwgZmxhZ3MpOworCWVycm9yID0geGZzX2F0dHJfZ2V0X2ludChpcCwgJnhuYW1lLCB2YWx1ZSwgdmFsdWVsZW5wLCBmbGFncyk7CiAJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOwogCXJldHVybihlcnJvcik7CiB9CkBAIC0yMTQzLDggKzIxNDcsOCBAQAogCQlkYmxrbm8gPSBYRlNfRlNCX1RPX0RBRERSKG1wLCBtYXAuYnJfc3RhcnRibG9jayksCiAJCWJsa2NudCA9IFhGU19GU0JfVE9fQkIobXAsIG1hcC5icl9ibG9ja2NvdW50KTsKIAotCQlicCA9IHhmc19idWZfZ2V0X2ZsYWdzKG1wLT5tX2RkZXZfdGFyZ3AsIGRibGtubywgYmxrY250LAotCQkJCSAgICAgICBYRlNfQlVGX0xPQ0sgfCBYQkZfRE9OVF9CTE9DSyk7CisJCWJwID0geGZzX2J1Zl9nZXQobXAtPm1fZGRldl90YXJncCwgZGJsa25vLCBibGtjbnQsCisJCQkJIFhGU19CVUZfTE9DSyB8IFhCRl9ET05UX0JMT0NLKTsKIAkJQVNTRVJUKGJwKTsKIAkJQVNTRVJUKCFYRlNfQlVGX0dFVEVSUk9SKGJwKSk7CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYXR0ci5oIGIvZnMveGZzL3hmc19hdHRyLmgKaW5kZXggZmIzYjJhNi4uMTJmMGJlMyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hdHRyLmgKKysrIGIvZnMveGZzL3hmc19hdHRyLmgKQEAgLTEzMSw3ICsxMzEsNiBAQAogICovCiBpbnQgeGZzX2F0dHJfY2FsY19zaXplKHN0cnVjdCB4ZnNfaW5vZGUgKiwgaW50LCBpbnQsIGludCAqKTsKIGludCB4ZnNfYXR0cl9pbmFjdGl2ZShzdHJ1Y3QgeGZzX2lub2RlICpkcCk7Ci1pbnQgeGZzX2F0dHJfZmV0Y2goc3RydWN0IHhmc19pbm9kZSAqLCBzdHJ1Y3QgeGZzX25hbWUgKiwgY2hhciAqLCBpbnQgKiwgaW50KTsKIGludCB4ZnNfYXR0cl9ybXR2YWxfZ2V0KHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CiBpbnQgeGZzX2F0dHJfbGlzdF9pbnQoc3RydWN0IHhmc19hdHRyX2xpc3RfY29udGV4dCAqKTsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hdHRyX2xlYWYuYyBiL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmMKaW5kZXggYWZkYzg5MS4uMGI2ODczNSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hdHRyX2xlYWYuYworKysgYi9mcy94ZnMveGZzX2F0dHJfbGVhZi5jCkBAIC05OCw3ICs5OCw3IEBACiAgKiBJZiBuYW1lc3BhY2UgYml0cyBkb24ndCBtYXRjaCByZXR1cm4gMC4KICAqIElmIGFsbCBtYXRjaCB0aGVuIHJldHVybiAxLgogICovCi1TVEFUSUNfSU5MSU5FIGludAorU1RBVElDIGludAogeGZzX2F0dHJfbmFtZXNwX21hdGNoKGludCBhcmdfZmxhZ3MsIGludCBvbmRpc2tfZmxhZ3MpCiB7CiAJcmV0dXJuIFhGU19BVFRSX05TUF9PTkRJU0sob25kaXNrX2ZsYWdzKSA9PSBYRlNfQVRUUl9OU1BfQVJHU19UT19PTkRJU0soYXJnX2ZsYWdzKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYm1hcF9idHJlZS5jIGIvZnMveGZzL3hmc19ibWFwX2J0cmVlLmMKaW5kZXggZWI3YjcwMi4uNmY1Y2NlZCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19ibWFwX2J0cmVlLmMKKysrIGIvZnMveGZzL3hmc19ibWFwX2J0cmVlLmMKQEAgLTk4LDggKzk4LDcgQEAKICAqIFRoaXMgY29kZSBtdXN0IGJlIGluIHN5bmMgd2l0aCB0aGUgcm91dGluZXMgeGZzX2JtYnRfZ2V0X3N0YXJ0b2ZmLAogICogeGZzX2JtYnRfZ2V0X3N0YXJ0YmxvY2ssIHhmc19ibWJ0X2dldF9ibG9ja2NvdW50IGFuZCB4ZnNfYm1idF9nZXRfc3RhdGUuCiAgKi8KLQotU1RBVElDX0lOTElORSB2b2lkCitTVEFUSUMgdm9pZAogX194ZnNfYm1idF9nZXRfYWxsKAogCQlfX3VpbnQ2NF90IGwwLAogCQlfX3VpbnQ2NF90IGwxLApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19maWxlc3RyZWFtLmggYi9mcy94ZnMveGZzX2ZpbGVzdHJlYW0uaAppbmRleCBmNjU1ZjdkLi40YWJhNjdjIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2ZpbGVzdHJlYW0uaAorKysgYi9mcy94ZnMveGZzX2ZpbGVzdHJlYW0uaApAQCAtNzksNyArNzksNyBAQAogICogdGhlIGNhY2hlIHRoYXQgcmVmZXJlbmNlIHBlci1hZyBhcnJheSBlbGVtZW50cyB0aGF0IGhhdmUgc2luY2UgYmVlbgogICogcmVhbGxvY2F0ZWQuCiAgKi8KLVNUQVRJQ19JTkxJTkUgaW50CitzdGF0aWMgaW5saW5lIGludAogeGZzX2ZpbGVzdHJlYW1fcGVla19hZygKIAl4ZnNfbW91bnRfdAkqbXAsCiAJeGZzX2FnbnVtYmVyX3QJYWdubykKQEAgLTg3LDcgKzg3LDcgQEAKIAlyZXR1cm4gYXRvbWljX3JlYWQoJm1wLT5tX3BlcmFnW2Fnbm9dLnBhZ2ZfZnN0cm1zKTsKIH0KIAotU1RBVElDX0lOTElORSBpbnQKK3N0YXRpYyBpbmxpbmUgaW50CiB4ZnNfZmlsZXN0cmVhbV9nZXRfYWcoCiAJeGZzX21vdW50X3QJKm1wLAogCXhmc19hZ251bWJlcl90CWFnbm8pCkBAIC05NSw3ICs5NSw3IEBACiAJcmV0dXJuIGF0b21pY19pbmNfcmV0dXJuKCZtcC0+bV9wZXJhZ1thZ25vXS5wYWdmX2ZzdHJtcyk7CiB9CiAKLVNUQVRJQ19JTkxJTkUgaW50CitzdGF0aWMgaW5saW5lIGludAogeGZzX2ZpbGVzdHJlYW1fcHV0X2FnKAogCXhmc19tb3VudF90CSptcCwKIAl4ZnNfYWdudW1iZXJfdAlhZ25vKQpAQCAtMTIyLDcgKzEyMiw3IEBACiAKIAogLyogZmlsZXN0cmVhbXMgZm9yIHRoZSBpbm9kZT8gKi8KLVNUQVRJQ19JTkxJTkUgaW50CitzdGF0aWMgaW5saW5lIGludAogeGZzX2lub2RlX2lzX2ZpbGVzdHJlYW0oCiAJc3RydWN0IHhmc19pbm9kZQkqaXApCiB7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Zzb3BzLmMgYi9mcy94ZnMveGZzX2Zzb3BzLmMKaW5kZXggMmQwYjNlMS4uMzYwNzlhYSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19mc29wcy5jCisrKyBiL2ZzL3hmcy94ZnNfZnNvcHMuYwpAQCAtMjAxLDggKzIwMSw4IEBACiAJCSAqIEFHIGZyZWVsaXN0IGhlYWRlciBibG9jawogCQkgKi8KIAkJYnAgPSB4ZnNfYnVmX2dldChtcC0+bV9kZGV2X3RhcmdwLAotCQkJCSAgWEZTX0FHX0RBRERSKG1wLCBhZ25vLCBYRlNfQUdGX0RBRERSKG1wKSksCi0JCQkJICBYRlNfRlNTX1RPX0JCKG1wLCAxKSwgMCk7CisJCQkJIFhGU19BR19EQUREUihtcCwgYWdubywgWEZTX0FHRl9EQUREUihtcCkpLAorCQkJCSBYRlNfRlNTX1RPX0JCKG1wLCAxKSwgWEJGX0xPQ0sgfCBYQkZfTUFQUEVEKTsKIAkJYWdmID0gWEZTX0JVRl9UT19BR0YoYnApOwogCQltZW1zZXQoYWdmLCAwLCBtcC0+bV9zYi5zYl9zZWN0c2l6ZSk7CiAJCWFnZi0+YWdmX21hZ2ljbnVtID0gY3B1X3RvX2JlMzIoWEZTX0FHRl9NQUdJQyk7CkBAIC0yMzMsOCArMjMzLDggQEAKIAkJICogQUcgaW5vZGUgaGVhZGVyIGJsb2NrCiAJCSAqLwogCQlicCA9IHhmc19idWZfZ2V0KG1wLT5tX2RkZXZfdGFyZ3AsCi0JCQkJICBYRlNfQUdfREFERFIobXAsIGFnbm8sIFhGU19BR0lfREFERFIobXApKSwKLQkJCQkgIFhGU19GU1NfVE9fQkIobXAsIDEpLCAwKTsKKwkJCQkgWEZTX0FHX0RBRERSKG1wLCBhZ25vLCBYRlNfQUdJX0RBRERSKG1wKSksCisJCQkJIFhGU19GU1NfVE9fQkIobXAsIDEpLCBYQkZfTE9DSyB8IFhCRl9NQVBQRUQpOwogCQlhZ2kgPSBYRlNfQlVGX1RPX0FHSShicCk7CiAJCW1lbXNldChhZ2ksIDAsIG1wLT5tX3NiLnNiX3NlY3RzaXplKTsKIAkJYWdpLT5hZ2lfbWFnaWNudW0gPSBjcHVfdG9fYmUzMihYRlNfQUdJX01BR0lDKTsKQEAgLTI1Nyw4ICsyNTcsOSBAQAogCQkgKiBCTk8gYnRyZWUgcm9vdCBibG9jawogCQkgKi8KIAkJYnAgPSB4ZnNfYnVmX2dldChtcC0+bV9kZGV2X3RhcmdwLAotCQkJWEZTX0FHQl9UT19EQUREUihtcCwgYWdubywgWEZTX0JOT19CTE9DSyhtcCkpLAotCQkJQlRPQkIobXAtPm1fc2Iuc2JfYmxvY2tzaXplKSwgMCk7CisJCQkJIFhGU19BR0JfVE9fREFERFIobXAsIGFnbm8sIFhGU19CTk9fQkxPQ0sobXApKSwKKwkJCQkgQlRPQkIobXAtPm1fc2Iuc2JfYmxvY2tzaXplKSwKKwkJCQkgWEJGX0xPQ0sgfCBYQkZfTUFQUEVEKTsKIAkJYmxvY2sgPSBYRlNfQlVGX1RPX0JMT0NLKGJwKTsKIAkJbWVtc2V0KGJsb2NrLCAwLCBtcC0+bV9zYi5zYl9ibG9ja3NpemUpOwogCQlibG9jay0+YmJfbWFnaWMgPSBjcHVfdG9fYmUzMihYRlNfQUJUQl9NQUdJQyk7CkBAIC0yNzgsOCArMjc5LDkgQEAKIAkJICogQ05UIGJ0cmVlIHJvb3QgYmxvY2sKIAkJICovCiAJCWJwID0geGZzX2J1Zl9nZXQobXAtPm1fZGRldl90YXJncCwKLQkJCVhGU19BR0JfVE9fREFERFIobXAsIGFnbm8sIFhGU19DTlRfQkxPQ0sobXApKSwKLQkJCUJUT0JCKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSksIDApOworCQkJCSBYRlNfQUdCX1RPX0RBRERSKG1wLCBhZ25vLCBYRlNfQ05UX0JMT0NLKG1wKSksCisJCQkJIEJUT0JCKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSksCisJCQkJIFhCRl9MT0NLIHwgWEJGX01BUFBFRCk7CiAJCWJsb2NrID0gWEZTX0JVRl9UT19CTE9DSyhicCk7CiAJCW1lbXNldChibG9jaywgMCwgbXAtPm1fc2Iuc2JfYmxvY2tzaXplKTsKIAkJYmxvY2stPmJiX21hZ2ljID0gY3B1X3RvX2JlMzIoWEZTX0FCVENfTUFHSUMpOwpAQCAtMzAwLDggKzMwMiw5IEBACiAJCSAqIElOTyBidHJlZSByb290IGJsb2NrCiAJCSAqLwogCQlicCA9IHhmc19idWZfZ2V0KG1wLT5tX2RkZXZfdGFyZ3AsCi0JCQlYRlNfQUdCX1RPX0RBRERSKG1wLCBhZ25vLCBYRlNfSUJUX0JMT0NLKG1wKSksCi0JCQlCVE9CQihtcC0+bV9zYi5zYl9ibG9ja3NpemUpLCAwKTsKKwkJCQkgWEZTX0FHQl9UT19EQUREUihtcCwgYWdubywgWEZTX0lCVF9CTE9DSyhtcCkpLAorCQkJCSBCVE9CQihtcC0+bV9zYi5zYl9ibG9ja3NpemUpLAorCQkJCSBYQkZfTE9DSyB8IFhCRl9NQVBQRUQpOwogCQlibG9jayA9IFhGU19CVUZfVE9fQkxPQ0soYnApOwogCQltZW1zZXQoYmxvY2ssIDAsIG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSk7CiAJCWJsb2NrLT5iYl9tYWdpYyA9IGNwdV90b19iZTMyKFhGU19JQlRfTUFHSUMpOwpAQCAtNjExLDcgKzYxNCw3IEBACiAJeGZzX2lub2RlX3QJKmlwOwogCWludAkJZXJyb3I7CiAKLQl0cCA9IF94ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19EVU1NWTEpOworCXRwID0gX3hmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX0RVTU1ZMSwgS01fU0xFRVApOwogCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsIFhGU19JQ0hBTkdFX0xPR19SRVMobXApLCAwLCAwLCAwKTsKIAlpZiAoZXJyb3IpIHsKIAkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lhbGxvYy5jIGIvZnMveGZzL3hmc19pYWxsb2MuYwppbmRleCAwNzg1Nzk3Li5jYjkwN2JhIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lhbGxvYy5jCisrKyBiL2ZzL3hmcy94ZnNfaWFsbG9jLmMKQEAgLTQyNSw3ICs0MjUsNyBAQAogCXJldHVybiAwOwogfQogCi1TVEFUSUNfSU5MSU5FIHhmc19hZ251bWJlcl90CitTVEFUSUMgeGZzX2FnbnVtYmVyX3QKIHhmc19pYWxsb2NfbmV4dF9hZygKIAl4ZnNfbW91bnRfdAkqbXApCiB7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lnZXQuYyBiL2ZzL3hmcy94ZnNfaWdldC5jCmluZGV4IDgwZTUyNjQuLjA3M2JiNGEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaWdldC5jCisrKyBiL2ZzL3hmcy94ZnNfaWdldC5jCkBAIC03Myw2ICs3Myw5IEBACiAJQVNTRVJUKGF0b21pY19yZWFkKCZpcC0+aV9waW5jb3VudCkgPT0gMCk7CiAJQVNTRVJUKCFzcGluX2lzX2xvY2tlZCgmaXAtPmlfZmxhZ3NfbG9jaykpOwogCUFTU0VSVChjb21wbGV0aW9uX2RvbmUoJmlwLT5pX2ZsdXNoKSk7CisJQVNTRVJUKCFyd3NlbV9pc19sb2NrZWQoJmlwLT5pX2lvbG9jay5tcl9sb2NrKSk7CisKKwltcmxvY2tfaW5pdCgmaXAtPmlfaW9sb2NrLCBNUkxPQ0tfQkFSUklFUiwgInhmc2lvIiwgaXAtPmlfaW5vKTsKIAogCS8qIGluaXRpYWxpc2UgdGhlIHhmcyBpbm9kZSAqLwogCWlwLT5pX2lubyA9IGlubzsKQEAgLTI5MCw3ICsyOTMsNyBAQAogCXN0cnVjdCB4ZnNfaW5vZGUJKippcHAsCiAJeGZzX2RhZGRyX3QJCWJubywKIAlpbnQJCQlmbGFncywKLQlpbnQJCQlsb2NrX2ZsYWdzKSBfX3JlbGVhc2VzKHBhZy0+cGFnX2ljaV9sb2NrKQorCWludAkJCWxvY2tfZmxhZ3MpCiB7CiAJc3RydWN0IHhmc19pbm9kZQkqaXA7CiAJaW50CQkJZXJyb3I7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lvbWFwLmMgYi9mcy94ZnMveGZzX2lvbWFwLmMKaW5kZXggNjdhZTU1NTUuLjcyOTRhYmMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW9tYXAuYworKysgYi9mcy94ZnMveGZzX2lvbWFwLmMKQEAgLTg2MCw4ICs4NjAsMTUgQEAKIAkJICogc2V0IHVwIGEgdHJhbnNhY3Rpb24gdG8gY29udmVydCB0aGUgcmFuZ2Ugb2YgZXh0ZW50cwogCQkgKiBmcm9tIHVud3JpdHRlbiB0byByZWFsLiBEbyBhbGxvY2F0aW9ucyBpbiBhIGxvb3AgdW50aWwKIAkJICogd2UgaGF2ZSBjb3ZlcmVkIHRoZSByYW5nZSBwYXNzZWQgaW4uCisJCSAqCisJCSAqIE5vdGUgdGhhdCB3ZSBvcGVuIGNvZGUgdGhlIHRyYW5zYWN0aW9uIGFsbG9jYXRpb24gaGVyZQorCQkgKiB0byBwYXNzIEtNX05PRlMtLXdlIGNhbid0IHJpc2sgdG8gcmVjdXJzaW5nIGJhY2sgaW50bworCQkgKiB0aGUgZmlsZXN5c3RlbSBoZXJlIGFzIHdlIG1pZ2h0IGJlIGFza2VkIHRvIHdyaXRlIG91dAorCQkgKiB0aGUgc2FtZSBpbm9kZSB0aGF0IHdlIGNvbXBsZXRlIGhlcmUgYW5kIG1pZ2h0IGRlYWRsb2NrCisJCSAqIG9uIHRoZSBpb2xvY2suCiAJCSAqLwotCQl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX1NUUkFUX1dSSVRFKTsKKwkJeGZzX3dhaXRfZm9yX2ZyZWV6ZShtcCwgU0JfRlJFRVpFX1RSQU5TKTsKKwkJdHAgPSBfeGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfU1RSQVRfV1JJVEUsIEtNX05PRlMpOwogCQl0cC0+dF9mbGFncyB8PSBYRlNfVFJBTlNfUkVTRVJWRTsKIAkJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgcmVzYmxrcywKIAkJCQlYRlNfV1JJVEVfTE9HX1JFUyhtcCksIDAsCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZ19yZWNvdmVyLmMgYi9mcy94ZnMveGZzX2xvZ19yZWNvdmVyLmMKaW5kZXggZmIxN2Y4Mi4uMWVjOThlZCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jCisrKyBiL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuYwpAQCAtMjIwNiw2ICsyMjA2LDcgQEAKIAl4ZnNfZGFkZHJfdAkJYmxrbm87CiAJaW50CQkJbGVuOwogCXVzaG9ydAkJCWZsYWdzOworCXVpbnQJCQlidWZfZmxhZ3M7CiAKIAlidWZfZiA9ICh4ZnNfYnVmX2xvZ19mb3JtYXRfdCAqKWl0ZW0tPnJpX2J1ZlswXS5pX2FkZHI7CiAKQEAgLTIyNDYsMTIgKzIyNDcsMTEgQEAKIAl9CiAKIAltcCA9IGxvZy0+bF9tcDsKLQlpZiAoZmxhZ3MgJiBYRlNfQkxJX0lOT0RFX0JVRikgewotCQlicCA9IHhmc19idWZfcmVhZF9mbGFncyhtcC0+bV9kZGV2X3RhcmdwLCBibGtubywgbGVuLAotCQkJCQkJCQlYRlNfQlVGX0xPQ0spOwotCX0gZWxzZSB7Ci0JCWJwID0geGZzX2J1Zl9yZWFkKG1wLT5tX2RkZXZfdGFyZ3AsIGJsa25vLCBsZW4sIDApOwotCX0KKwlidWZfZmxhZ3MgPSBYRlNfQlVGX0xPQ0s7CisJaWYgKCEoZmxhZ3MgJiBYRlNfQkxJX0lOT0RFX0JVRikpCisJCWJ1Zl9mbGFncyB8PSBYRlNfQlVGX01BUFBFRDsKKworCWJwID0geGZzX2J1Zl9yZWFkKG1wLT5tX2RkZXZfdGFyZ3AsIGJsa25vLCBsZW4sIGJ1Zl9mbGFncyk7CiAJaWYgKFhGU19CVUZfSVNFUlJPUihicCkpIHsKIAkJeGZzX2lvZXJyb3JfYWxlcnQoInhsb2dfcmVjb3Zlcl9kby4uKHJlYWQjMSkiLCBsb2ctPmxfbXAsCiAJCQkJICBicCwgYmxrbm8pOwpAQCAtMjM1MCw4ICsyMzUwLDggQEAKIAkJZ290byBlcnJvcjsKIAl9CiAKLQlicCA9IHhmc19idWZfcmVhZF9mbGFncyhtcC0+bV9kZGV2X3RhcmdwLCBpbl9mLT5pbGZfYmxrbm8sCi0JCQkJaW5fZi0+aWxmX2xlbiwgWEZTX0JVRl9MT0NLKTsKKwlicCA9IHhmc19idWZfcmVhZChtcC0+bV9kZGV2X3RhcmdwLCBpbl9mLT5pbGZfYmxrbm8sIGluX2YtPmlsZl9sZW4sCisJCQkgIFhGU19CVUZfTE9DSyk7CiAJaWYgKFhGU19CVUZfSVNFUlJPUihicCkpIHsKIAkJeGZzX2lvZXJyb3JfYWxlcnQoInhsb2dfcmVjb3Zlcl9kby4uKHJlYWQjMikiLCBtcCwKIAkJCQkgIGJwLCBpbl9mLT5pbGZfYmxrbm8pOwpAQCAtMzUxNyw3ICszNTE3LDcgQEAKIHsKIAl4bG9nX3JlY19oZWFkZXJfdAkqcmhlYWQ7CiAJeGZzX2RhZGRyX3QJCWJsa19ubzsKLQl4ZnNfY2FkZHJfdAkJYnVmYWRkciwgb2Zmc2V0OworCXhmc19jYWRkcl90CQlvZmZzZXQ7CiAJeGZzX2J1Zl90CQkqaGJwLCAqZGJwOwogCWludAkJCWVycm9yID0gMCwgaF9zaXplOwogCWludAkJCWJibGtzLCBzcGxpdF9iYmxrczsKQEAgLTM2MTAsNyArMzYxMCw3IEBACiAJCQkvKgogCQkJICogQ2hlY2sgZm9yIGhlYWRlciB3cmFwcGluZyBhcm91bmQgcGh5c2ljYWwgZW5kLW9mLWxvZwogCQkJICovCi0JCQlvZmZzZXQgPSBOVUxMOworCQkJb2Zmc2V0ID0gWEZTX0JVRl9QVFIoaGJwKTsKIAkJCXNwbGl0X2hibGtzID0gMDsKIAkJCXdyYXBwZWRfaGJsa3MgPSAwOwogCQkJaWYgKGJsa19ubyArIGhibGtzIDw9IGxvZy0+bF9sb2dCQnNpemUpIHsKQEAgLTM2NDYsOSArMzY0Niw4IEBACiAJCQkJICogICAtIG9yZGVyIGlzIGltcG9ydGFudC4KIAkJCQkgKi8KIAkJCQl3cmFwcGVkX2hibGtzID0gaGJsa3MgLSBzcGxpdF9oYmxrczsKLQkJCQlidWZhZGRyID0gWEZTX0JVRl9QVFIoaGJwKTsKIAkJCQllcnJvciA9IFhGU19CVUZfU0VUX1BUUihoYnAsCi0JCQkJCQlidWZhZGRyICsgQkJUT0Ioc3BsaXRfaGJsa3MpLAorCQkJCQkJb2Zmc2V0ICsgQkJUT0Ioc3BsaXRfaGJsa3MpLAogCQkJCQkJQkJUT0IoaGJsa3MgLSBzcGxpdF9oYmxrcykpOwogCQkJCWlmIChlcnJvcikKIAkJCQkJZ290byBicmVhZF9lcnIyOwpAQCAtMzY1OCwxNCArMzY1NywxMCBAQAogCQkJCWlmIChlcnJvcikKIAkJCQkJZ290byBicmVhZF9lcnIyOwogCi0JCQkJZXJyb3IgPSBYRlNfQlVGX1NFVF9QVFIoaGJwLCBidWZhZGRyLAorCQkJCWVycm9yID0gWEZTX0JVRl9TRVRfUFRSKGhicCwgb2Zmc2V0LAogCQkJCQkJCUJCVE9CKGhibGtzKSk7CiAJCQkJaWYgKGVycm9yKQogCQkJCQlnb3RvIGJyZWFkX2VycjI7Ci0KLQkJCQlpZiAoIW9mZnNldCkKLQkJCQkJb2Zmc2V0ID0geGxvZ19hbGlnbihsb2csIDAsCi0JCQkJCQkJd3JhcHBlZF9oYmxrcywgaGJwKTsKIAkJCX0KIAkJCXJoZWFkID0gKHhsb2dfcmVjX2hlYWRlcl90ICopb2Zmc2V0OwogCQkJZXJyb3IgPSB4bG9nX3ZhbGlkX3JlY19oZWFkZXIobG9nLCByaGVhZCwKQEAgLTM2ODUsNyArMzY4MCw3IEBACiAJCQl9IGVsc2UgewogCQkJCS8qIFRoaXMgbG9nIHJlY29yZCBpcyBzcGxpdCBhY3Jvc3MgdGhlCiAJCQkJICogcGh5c2ljYWwgZW5kIG9mIGxvZyAqLwotCQkJCW9mZnNldCA9IE5VTEw7CisJCQkJb2Zmc2V0ID0gWEZTX0JVRl9QVFIoZGJwKTsKIAkJCQlzcGxpdF9iYmxrcyA9IDA7CiAJCQkJaWYgKGJsa19ubyAhPSBsb2ctPmxfbG9nQkJzaXplKSB7CiAJCQkJCS8qIHNvbWUgZGF0YSBpcyBiZWZvcmUgdGhlIHBoeXNpY2FsCkBAIC0zNzE0LDkgKzM3MDksOCBAQAogCQkJCSAqICAgX2ZpcnN0XywgdGhlbiB0aGUgbG9nIHN0YXJ0IChMUiBoZWFkZXIgZW5kKQogCQkJCSAqICAgLSBvcmRlciBpcyBpbXBvcnRhbnQuCiAJCQkJICovCi0JCQkJYnVmYWRkciA9IFhGU19CVUZfUFRSKGRicCk7CiAJCQkJZXJyb3IgPSBYRlNfQlVGX1NFVF9QVFIoZGJwLAotCQkJCQkJYnVmYWRkciArIEJCVE9CKHNwbGl0X2JibGtzKSwKKwkJCQkJCW9mZnNldCArIEJCVE9CKHNwbGl0X2JibGtzKSwKIAkJCQkJCUJCVE9CKGJibGtzIC0gc3BsaXRfYmJsa3MpKTsKIAkJCQlpZiAoZXJyb3IpCiAJCQkJCWdvdG8gYnJlYWRfZXJyMjsKQEAgLTM3MjcsMTMgKzM3MjEsOSBAQAogCQkJCWlmIChlcnJvcikKIAkJCQkJZ290byBicmVhZF9lcnIyOwogCi0JCQkJZXJyb3IgPSBYRlNfQlVGX1NFVF9QVFIoZGJwLCBidWZhZGRyLCBoX3NpemUpOworCQkJCWVycm9yID0gWEZTX0JVRl9TRVRfUFRSKGRicCwgb2Zmc2V0LCBoX3NpemUpOwogCQkJCWlmIChlcnJvcikKIAkJCQkJZ290byBicmVhZF9lcnIyOwotCi0JCQkJaWYgKCFvZmZzZXQpCi0JCQkJCW9mZnNldCA9IHhsb2dfYWxpZ24obG9nLCB3cmFwcGVkX2hibGtzLAotCQkJCQkJYmJsa3MgLSBzcGxpdF9iYmxrcywgZGJwKTsKIAkJCX0KIAkJCXhsb2dfdW5wYWNrX2RhdGEocmhlYWQsIG9mZnNldCwgbG9nKTsKIAkJCWlmICgoZXJyb3IgPSB4bG9nX3JlY292ZXJfcHJvY2Vzc19kYXRhKGxvZywgcmhhc2gsCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX21vdW50LmMgYi9mcy94ZnMveGZzX21vdW50LmMKaW5kZXggOGI2YzllOC4uYmZmZmQ2MyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19tb3VudC5jCisrKyBiL2ZzL3hmcy94ZnNfbW91bnQuYwpAQCAtNTgzLDggKzU4Myw4IEBACiAJc2VjdG9yX3NpemUgPSB4ZnNfZ2V0c2l6ZV9idWZ0YXJnKG1wLT5tX2RkZXZfdGFyZ3ApOwogCWV4dHJhX2ZsYWdzID0gWEZTX0JVRl9MT0NLIHwgWEZTX0JVRl9NQU5BR0UgfCBYRlNfQlVGX01BUFBFRDsKIAotCWJwID0geGZzX2J1Zl9yZWFkX2ZsYWdzKG1wLT5tX2RkZXZfdGFyZ3AsIFhGU19TQl9EQUREUiwKLQkJCQlCVE9CQihzZWN0b3Jfc2l6ZSksIGV4dHJhX2ZsYWdzKTsKKwlicCA9IHhmc19idWZfcmVhZChtcC0+bV9kZGV2X3RhcmdwLCBYRlNfU0JfREFERFIsIEJUT0JCKHNlY3Rvcl9zaXplKSwKKwkJCSAgZXh0cmFfZmxhZ3MpOwogCWlmICghYnAgfHwgWEZTX0JVRl9JU0VSUk9SKGJwKSkgewogCQl4ZnNfZnNfbW91bnRfY21uX2VycihmbGFncywgIlNCIHJlYWQgZmFpbGVkIik7CiAJCWVycm9yID0gYnAgPyBYRlNfQlVGX0dFVEVSUk9SKGJwKSA6IEVOT01FTTsKQEAgLTYyNCw4ICs2MjQsOCBAQAogCQlYRlNfQlVGX1VOTUFOQUdFKGJwKTsKIAkJeGZzX2J1Zl9yZWxzZShicCk7CiAJCXNlY3Rvcl9zaXplID0gbXAtPm1fc2Iuc2Jfc2VjdHNpemU7Ci0JCWJwID0geGZzX2J1Zl9yZWFkX2ZsYWdzKG1wLT5tX2RkZXZfdGFyZ3AsIFhGU19TQl9EQUREUiwKLQkJCQkJQlRPQkIoc2VjdG9yX3NpemUpLCBleHRyYV9mbGFncyk7CisJCWJwID0geGZzX2J1Zl9yZWFkKG1wLT5tX2RkZXZfdGFyZ3AsIFhGU19TQl9EQUREUiwKKwkJCQkgIEJUT0JCKHNlY3Rvcl9zaXplKSwgZXh0cmFfZmxhZ3MpOwogCQlpZiAoIWJwIHx8IFhGU19CVUZfSVNFUlJPUihicCkpIHsKIAkJCXhmc19mc19tb3VudF9jbW5fZXJyKGZsYWdzLCAiU0IgcmUtcmVhZCBmYWlsZWQiKTsKIAkJCWVycm9yID0gYnAgPyBYRlNfQlVGX0dFVEVSUk9SKGJwKSA6IEVOT01FTTsKQEAgLTE0NzEsNyArMTQ3MSw3IEBACiAJaWYgKCF4ZnNfc2JfdmVyc2lvbl9oYXNsYXp5c2Jjb3VudCgmbXAtPm1fc2IpKQogCQlyZXR1cm4gMDsKIAotCXRwID0gX3hmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX1NCX0NPVU5UKTsKKwl0cCA9IF94ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19TQl9DT1VOVCwgS01fU0xFRVApOwogCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsIG1wLT5tX3NiLnNiX3NlY3RzaXplICsgMTI4LCAwLCAwLAogCQkJCQlYRlNfREVGQVVMVF9MT0dfQ09VTlQpOwogCWlmIChlcnJvcikgewpAQCAtMjEyMyw3ICsyMTIzLDcgQEAKIAltdXRleF9kZXN0cm95KCZtcC0+bV9pY3NiX211dGV4KTsKIH0KIAotU1RBVElDX0lOTElORSB2b2lkCitTVEFUSUMgdm9pZAogeGZzX2ljc2JfbG9ja19jbnRyKAogCXhmc19pY3NiX2NudHNfdAkqaWNzYnApCiB7CkBAIC0yMTMyLDcgKzIxMzIsNyBAQAogCX0KIH0KIAotU1RBVElDX0lOTElORSB2b2lkCitTVEFUSUMgdm9pZAogeGZzX2ljc2JfdW5sb2NrX2NudHIoCiAJeGZzX2ljc2JfY250c190CSppY3NicCkKIHsKQEAgLTIxNDAsNyArMjE0MCw3IEBACiB9CiAKIAotU1RBVElDX0lOTElORSB2b2lkCitTVEFUSUMgdm9pZAogeGZzX2ljc2JfbG9ja19hbGxfY291bnRlcnMoCiAJeGZzX21vdW50X3QJKm1wKQogewpAQCAtMjE1Myw3ICsyMTUzLDcgQEAKIAl9CiB9CiAKLVNUQVRJQ19JTkxJTkUgdm9pZAorU1RBVElDIHZvaWQKIHhmc19pY3NiX3VubG9ja19hbGxfY291bnRlcnMoCiAJeGZzX21vdW50X3QJKm1wKQogewpAQCAtMjM4OSwxMiArMjM4OSwxMiBAQAogewogCXhmc19pY3NiX2NudHNfdAkqaWNzYnA7CiAJbG9uZyBsb25nCWxjb3VudGVyOwkvKiBsb25nIGNvdW50ZXIgZm9yIDY0IGJpdCBmaWVsZHMgKi8KLQlpbnQJCWNwdSwgcmV0ID0gMDsKKwlpbnQJCXJldCA9IDA7CiAKIAltaWdodF9zbGVlcCgpOwogYWdhaW46Ci0JY3B1ID0gZ2V0X2NwdSgpOwotCWljc2JwID0gKHhmc19pY3NiX2NudHNfdCAqKXBlcl9jcHVfcHRyKG1wLT5tX3NiX2NudHMsIGNwdSk7CisJcHJlZW1wdF9kaXNhYmxlKCk7CisJaWNzYnAgPSB0aGlzX2NwdV9wdHIobXAtPm1fc2JfY250cyk7CiAKIAkvKgogCSAqIGlmIHRoZSBjb3VudGVyIGlzIGRpc2FibGVkLCBnbyB0byBzbG93IHBhdGgKQEAgLTI0MzgsMTEgKzI0MzgsMTEgQEAKIAkJYnJlYWs7CiAJfQogCXhmc19pY3NiX3VubG9ja19jbnRyKGljc2JwKTsKLQlwdXRfY3B1KCk7CisJcHJlZW1wdF9lbmFibGUoKTsKIAlyZXR1cm4gMDsKIAogc2xvd19wYXRoOgotCXB1dF9jcHUoKTsKKwlwcmVlbXB0X2VuYWJsZSgpOwogCiAJLyoKIAkgKiBzZXJpYWxpc2Ugd2l0aCBhIG11dGV4IHNvIHdlIGRvbid0IGJ1cm4gbG90cyBvZiBjcHUgb24KQEAgLTI0OTAsNyArMjQ5MCw3IEBACiAKIGJhbGFuY2VfY291bnRlcjoKIAl4ZnNfaWNzYl91bmxvY2tfY250cihpY3NicCk7Ci0JcHV0X2NwdSgpOworCXByZWVtcHRfZW5hYmxlKCk7CiAKIAkvKgogCSAqIFdlIG1heSBoYXZlIG11bHRpcGxlIHRocmVhZHMgaGVyZSBpZiBtdWx0aXBsZSBwZXItY3B1CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX21vdW50LmggYi9mcy94ZnMveGZzX21vdW50LmgKaW5kZXggYTZjMDIzYi4uMWRmN2U0NSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19tb3VudC5oCisrKyBiL2ZzL3hmcy94ZnNfbW91bnQuaApAQCAtOTMsNiArOTMsOSBAQAogCXhmc19zZW5kX3VubW91bnRfdAl4ZnNfc2VuZF91bm1vdW50OwogfSB4ZnNfZG1vcHNfdDsKIAorI2RlZmluZSBYRlNfRE1BUElfVU5NT1VOVF9GTEFHUyhtcCkgXAorCSgoKG1wKS0+bV9kbWV2bWFzayAmICgxIDw8IERNX0VWRU5UX1VOTU9VTlQpKSA/IDAgOiBETV9GTEFHU19VTldBTlRFRCkKKwogI2RlZmluZSBYRlNfU0VORF9EQVRBKG1wLCBldixpcCxvZmYsbGVuLGZsLGxvY2spIFwKIAkoKihtcCktPm1fZG1fb3BzLT54ZnNfc2VuZF9kYXRhKShldixpcCxvZmYsbGVuLGZsLGxvY2spCiAjZGVmaW5lIFhGU19TRU5EX01NQVAobXAsIHZtYSxmbCkgXApAQCAtMTAxLDEyICsxMDQsMjQgQEAKIAkoKihtcCktPm1fZG1fb3BzLT54ZnNfc2VuZF9kZXN0cm95KShpcCxyaWdodCkKICNkZWZpbmUgWEZTX1NFTkRfTkFNRVNQKG1wLCBldixiMSxyMSxiMixyMixuMSxuMixtb2RlLHJ2YWwsZmwpIFwKIAkoKihtcCktPm1fZG1fb3BzLT54ZnNfc2VuZF9uYW1lc3ApKGV2LE5VTEwsYjEscjEsYjIscjIsbjEsbjIsbW9kZSxydmFsLGZsKQotI2RlZmluZSBYRlNfU0VORF9QUkVVTk1PVU5UKG1wLGIxLHIxLGIyLHIyLG4xLG4yLG1vZGUscnZhbCxmbCkgXAotCSgqKG1wKS0+bV9kbV9vcHMtPnhmc19zZW5kX25hbWVzcCkoRE1fRVZFTlRfUFJFVU5NT1VOVCxtcCxiMSxyMSxiMixyMixuMSxuMixtb2RlLHJ2YWwsZmwpCiAjZGVmaW5lIFhGU19TRU5EX01PVU5UKG1wLHJpZ2h0LHBhdGgsbmFtZSkgXAogCSgqKG1wKS0+bV9kbV9vcHMtPnhmc19zZW5kX21vdW50KShtcCxyaWdodCxwYXRoLG5hbWUpCi0jZGVmaW5lIFhGU19TRU5EX1VOTU9VTlQobXAsIGlwLHJpZ2h0LG1vZGUscnZhbCxmbCkgXAotCSgqKG1wKS0+bV9kbV9vcHMtPnhmc19zZW5kX3VubW91bnQpKG1wLGlwLHJpZ2h0LG1vZGUscnZhbCxmbCkKKyNkZWZpbmUgWEZTX1NFTkRfUFJFVU5NT1VOVChtcCkgXAorZG8geyBcCisJaWYgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0RNQVBJKSB7IFwKKwkJKCoobXApLT5tX2RtX29wcy0+eGZzX3NlbmRfbmFtZXNwKShETV9FVkVOVF9QUkVVTk1PVU5ULCBtcCwgXAorCQkJKG1wKS0+bV9yb290aXAsIERNX1JJR0hUX05VTEwsIFwKKwkJCShtcCktPm1fcm9vdGlwLCBETV9SSUdIVF9OVUxMLCBcCisJCQlOVUxMLCBOVUxMLCAwLCAwLCBYRlNfRE1BUElfVU5NT1VOVF9GTEFHUyhtcCkpOyBcCisJfSBcCit9IHdoaWxlICgwKQorI2RlZmluZSBYRlNfU0VORF9VTk1PVU5UKG1wKSBcCitkbyB7IFwKKwlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfRE1BUEkpIHsgXAorCQkoKihtcCktPm1fZG1fb3BzLT54ZnNfc2VuZF91bm1vdW50KShtcCwgKG1wKS0+bV9yb290aXAsIFwKKwkJCURNX1JJR0hUX05VTEwsIDAsIDAsIFhGU19ETUFQSV9VTk1PVU5UX0ZMQUdTKG1wKSk7IFwKKwl9IFwKK30gd2hpbGUgKDApCiAKIAogI2lmZGVmIEhBVkVfUEVSQ1BVX1NCCkBAIC0zODcsMTMgKzQwMiwxMyBAQAogICogUGVyLWNwdSBzdXBlcmJsb2NrIGxvY2tpbmcgZnVuY3Rpb25zCiAgKi8KICNpZmRlZiBIQVZFX1BFUkNQVV9TQgotU1RBVElDX0lOTElORSB2b2lkCitzdGF0aWMgaW5saW5lIHZvaWQKIHhmc19pY3NiX2xvY2soeGZzX21vdW50X3QgKm1wKQogewogCW11dGV4X2xvY2soJm1wLT5tX2ljc2JfbXV0ZXgpOwogfQogCi1TVEFUSUNfSU5MSU5FIHZvaWQKK3N0YXRpYyBpbmxpbmUgdm9pZAogeGZzX2ljc2JfdW5sb2NrKHhmc19tb3VudF90ICptcCkKIHsKIAltdXRleF91bmxvY2soJm1wLT5tX2ljc2JfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19ydy5jIGIvZnMveGZzL3hmc19ydy5jCmluZGV4IDNmODE2YWQuLjRjMTk5ZDEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfcncuYworKysgYi9mcy94ZnMveGZzX3J3LmMKQEAgLTI3NywxMCArMjc3LDEwIEBACiAJeGZzX2J1Zl90CSAqYnA7CiAJaW50CQkgZXJyb3I7CiAKLQlpZiAoZmxhZ3MpCi0JCWJwID0geGZzX2J1Zl9yZWFkX2ZsYWdzKHRhcmdldCwgYmxrbm8sIGxlbiwgZmxhZ3MpOwotCWVsc2UKLQkJYnAgPSB4ZnNfYnVmX3JlYWQodGFyZ2V0LCBibGtubywgbGVuLCBmbGFncyk7CisJaWYgKCFmbGFncykKKwkJZmxhZ3MgPSBYQkZfTE9DSyB8IFhCRl9NQVBQRUQ7CisKKwlicCA9IHhmc19idWZfcmVhZCh0YXJnZXQsIGJsa25vLCBsZW4sIGZsYWdzKTsKIAlpZiAoIWJwKQogCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CiAJZXJyb3IgPSBYRlNfQlVGX0dFVEVSUk9SKGJwKTsKQEAgLTMzNiwzICszMzYsMjUgQEAKIAl9CiAJcmV0dXJuIChlcnJvcik7CiB9CisKKy8qCisgKiBoZWxwZXIgZnVuY3Rpb24gdG8gZXh0cmFjdCBleHRlbnQgc2l6ZSBoaW50IGZyb20gaW5vZGUKKyAqLworeGZzX2V4dGxlbl90Cit4ZnNfZ2V0X2V4dHN6X2hpbnQoCisJc3RydWN0IHhmc19pbm9kZQkqaXApCit7CisJeGZzX2V4dGxlbl90CQlleHRzejsKKworCWlmICh1bmxpa2VseShYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApKSkgeworCQlleHRzeiA9IChpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19FWFRTSVpFKQorCQkJCT8gaXAtPmlfZC5kaV9leHRzaXplCisJCQkJOiBpcC0+aV9tb3VudC0+bV9zYi5zYl9yZXh0c2l6ZTsKKwkJQVNTRVJUKGV4dHN6KTsKKwl9IGVsc2UgeworCQlleHRzeiA9IChpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19FWFRTSVpFKQorCQkJCT8gaXAtPmlfZC5kaV9leHRzaXplIDogMDsKKwl9CisKKwlyZXR1cm4gZXh0c3o7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3J3LmggYi9mcy94ZnMveGZzX3J3LmgKaW5kZXggZjVlNDg3NC4uNTcxZjIxNyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19ydy5oCisrKyBiL2ZzL3hmcy94ZnNfcncuaApAQCAtMzcsMzQgKzM3LDYgQEAKIH0KIAogLyoKLSAqIEZsYWdzIGZvciB4ZnNfZnJlZV9lb2ZibG9ja3MKLSAqLwotI2RlZmluZSBYRlNfRlJFRV9FT0ZfTE9DSwkoMTw8MCkKLSNkZWZpbmUgWEZTX0ZSRUVfRU9GX05PTE9DSwkoMTw8MSkKLQotCi0vKgotICogaGVscGVyIGZ1bmN0aW9uIHRvIGV4dHJhY3QgZXh0ZW50IHNpemUgaGludCBmcm9tIGlub2RlCi0gKi8KLVNUQVRJQ19JTkxJTkUgeGZzX2V4dGxlbl90Ci14ZnNfZ2V0X2V4dHN6X2hpbnQoCi0JeGZzX2lub2RlX3QJKmlwKQotewotCXhmc19leHRsZW5fdAlleHRzejsKLQotCWlmICh1bmxpa2VseShYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApKSkgewotCQlleHRzeiA9IChpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19FWFRTSVpFKQotCQkJCT8gaXAtPmlfZC5kaV9leHRzaXplCi0JCQkJOiBpcC0+aV9tb3VudC0+bV9zYi5zYl9yZXh0c2l6ZTsKLQkJQVNTRVJUKGV4dHN6KTsKLQl9IGVsc2UgewotCQlleHRzeiA9IChpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19FWFRTSVpFKQotCQkJCT8gaXAtPmlfZC5kaV9leHRzaXplIDogMDsKLQl9Ci0JcmV0dXJuIGV4dHN6OwotfQotCi0vKgogICogUHJvdG90eXBlcyBmb3IgZnVuY3Rpb25zIGluIHhmc19ydy5jLgogICovCiBleHRlcm4gaW50IHhmc193cml0ZV9jbGVhcl9zZXR1aWQoc3RydWN0IHhmc19pbm9kZSAqaXApOwpAQCAtNzYsNSArNDgsNiBAQAogCQkJc3RydWN0IHhmc19idWYgKipicHApOwogZXh0ZXJuIHZvaWQgeGZzX2lvZXJyb3JfYWxlcnQoY2hhciAqZnVuYywgc3RydWN0IHhmc19tb3VudCAqbXAsCiAJCQkJeGZzX2J1Zl90ICpicCwgeGZzX2RhZGRyX3QgYmxrbm8pOworZXh0ZXJuIHhmc19leHRsZW5fdCB4ZnNfZ2V0X2V4dHN6X2hpbnQoc3RydWN0IHhmc19pbm9kZSAqaXApOwogCiAjZW5kaWYgLyogX19YRlNfUldfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zLmMgYi9mcy94ZnMveGZzX3RyYW5zLmMKaW5kZXggNjZiODQ5My4uMjM3YmFkYyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFucy5jCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnMuYwpAQCAtMjM2LDE5ICsyMzYsMjAgQEAKIAl1aW50CQl0eXBlKQogewogCXhmc193YWl0X2Zvcl9mcmVlemUobXAsIFNCX0ZSRUVaRV9UUkFOUyk7Ci0JcmV0dXJuIF94ZnNfdHJhbnNfYWxsb2MobXAsIHR5cGUpOworCXJldHVybiBfeGZzX3RyYW5zX2FsbG9jKG1wLCB0eXBlLCBLTV9TTEVFUCk7CiB9CiAKIHhmc190cmFuc190ICoKIF94ZnNfdHJhbnNfYWxsb2MoCiAJeGZzX21vdW50X3QJKm1wLAotCXVpbnQJCXR5cGUpCisJdWludAkJdHlwZSwKKwl1aW50CQltZW1mbGFncykKIHsKIAl4ZnNfdHJhbnNfdAkqdHA7CiAKIAlhdG9taWNfaW5jKCZtcC0+bV9hY3RpdmVfdHJhbnMpOwogCi0JdHAgPSBrbWVtX3pvbmVfemFsbG9jKHhmc190cmFuc196b25lLCBLTV9TTEVFUCk7CisJdHAgPSBrbWVtX3pvbmVfemFsbG9jKHhmc190cmFuc196b25lLCBtZW1mbGFncyk7CiAJdHAtPnRfbWFnaWMgPSBYRlNfVFJBTlNfTUFHSUM7CiAJdHAtPnRfdHlwZSA9IHR5cGU7CiAJdHAtPnRfbW91bnRwID0gbXA7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zLmggYi9mcy94ZnMveGZzX3RyYW5zLmgKaW5kZXggZWQ0N2ZjNy4uYTA1NzRmNSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFucy5oCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnMuaApAQCAtOTI0LDcgKzkyNCw3IEBACiAgKiBYRlMgdHJhbnNhY3Rpb24gbWVjaGFuaXNtIGV4cG9ydGVkIGludGVyZmFjZXMuCiAgKi8KIHhmc190cmFuc190CSp4ZnNfdHJhbnNfYWxsb2Moc3RydWN0IHhmc19tb3VudCAqLCB1aW50KTsKLXhmc190cmFuc190CSpfeGZzX3RyYW5zX2FsbG9jKHN0cnVjdCB4ZnNfbW91bnQgKiwgdWludCk7Cit4ZnNfdHJhbnNfdAkqX3hmc190cmFuc19hbGxvYyhzdHJ1Y3QgeGZzX21vdW50ICosIHVpbnQsIHVpbnQpOwogeGZzX3RyYW5zX3QJKnhmc190cmFuc19kdXAoeGZzX3RyYW5zX3QgKik7CiBpbnQJCXhmc190cmFuc19yZXNlcnZlKHhmc190cmFuc190ICosIHVpbnQsIHVpbnQsIHVpbnQsCiAJCQkJICB1aW50LCB1aW50KTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnNfYnVmLmMgYi9mcy94ZnMveGZzX3RyYW5zX2J1Zi5jCmluZGV4IDIxODgyOWUuLjAzYTFmNzAgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhbnNfYnVmLmMKKysrIGIvZnMveGZzL3hmc190cmFuc19idWYuYwpAQCAtNzksMTEgKzc5LDggQEAKIAkvKgogCSAqIERlZmF1bHQgdG8gYSBub3JtYWwgZ2V0X2J1ZigpIGNhbGwgaWYgdGhlIHRwIGlzIE5VTEwuCiAJICovCi0JaWYgKHRwID09IE5VTEwpIHsKLQkJYnAgPSB4ZnNfYnVmX2dldF9mbGFncyh0YXJnZXRfZGV2LCBibGtubywgbGVuLAotCQkJCQkJCWZsYWdzIHwgQlVGX0JVU1kpOwotCQlyZXR1cm4oYnApOwotCX0KKwlpZiAodHAgPT0gTlVMTCkKKwkJcmV0dXJuIHhmc19idWZfZ2V0KHRhcmdldF9kZXYsIGJsa25vLCBsZW4sIGZsYWdzIHwgQlVGX0JVU1kpOwogCiAJLyoKIAkgKiBJZiB3ZSBmaW5kIHRoZSBidWZmZXIgaW4gdGhlIGNhY2hlIHdpdGggdGhpcyB0cmFuc2FjdGlvbgpAQCAtMTI5LDcgKzEyNiw3IEBACiAJICogZWFzaWx5IGRlYWRsb2NrIHdpdGggb3VyIGN1cnJlbnQgdHJhbnNhY3Rpb24gYXMgd2VsbCBhcyBjYXVzZQogCSAqIHVzIHRvIHJ1biBvdXQgb2Ygc3RhY2sgc3BhY2UuCiAJICovCi0JYnAgPSB4ZnNfYnVmX2dldF9mbGFncyh0YXJnZXRfZGV2LCBibGtubywgbGVuLCBmbGFncyB8IEJVRl9CVVNZKTsKKwlicCA9IHhmc19idWZfZ2V0KHRhcmdldF9kZXYsIGJsa25vLCBsZW4sIGZsYWdzIHwgQlVGX0JVU1kpOwogCWlmIChicCA9PSBOVUxMKSB7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTMwMiw3ICsyOTksNyBAQAogCSAqIERlZmF1bHQgdG8gYSBub3JtYWwgZ2V0X2J1ZigpIGNhbGwgaWYgdGhlIHRwIGlzIE5VTEwuCiAJICovCiAJaWYgKHRwID09IE5VTEwpIHsKLQkJYnAgPSB4ZnNfYnVmX3JlYWRfZmxhZ3ModGFyZ2V0LCBibGtubywgbGVuLCBmbGFncyB8IEJVRl9CVVNZKTsKKwkJYnAgPSB4ZnNfYnVmX3JlYWQodGFyZ2V0LCBibGtubywgbGVuLCBmbGFncyB8IEJVRl9CVVNZKTsKIAkJaWYgKCFicCkKIAkJCXJldHVybiAoZmxhZ3MgJiBYRlNfQlVGX1RSWUxPQ0spID8KIAkJCQkJRUFHQUlOIDogWEZTX0VSUk9SKEVOT01FTSk7CkBAIC0zOTgsNyArMzk1LDcgQEAKIAkgKiBlYXNpbHkgZGVhZGxvY2sgd2l0aCBvdXIgY3VycmVudCB0cmFuc2FjdGlvbiBhcyB3ZWxsIGFzIGNhdXNlCiAJICogdXMgdG8gcnVuIG91dCBvZiBzdGFjayBzcGFjZS4KIAkgKi8KLQlicCA9IHhmc19idWZfcmVhZF9mbGFncyh0YXJnZXQsIGJsa25vLCBsZW4sIGZsYWdzIHwgQlVGX0JVU1kpOworCWJwID0geGZzX2J1Zl9yZWFkKHRhcmdldCwgYmxrbm8sIGxlbiwgZmxhZ3MgfCBCVUZfQlVTWSk7CiAJaWYgKGJwID09IE5VTEwpIHsKIAkJKmJwcCA9IE5VTEw7CiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc192bm9kZW9wcy5jIGIvZnMveGZzL3hmc192bm9kZW9wcy5jCmluZGV4IGI1NzJmN2UuLjU3OGYzZjUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYworKysgYi9mcy94ZnMveGZzX3Zub2Rlb3BzLmMKQEAgLTUzOCw5ICs1MzgsOCBAQAogCQlkID0gWEZTX0ZTQl9UT19EQUREUihtcCwgbXZhbFtuXS5icl9zdGFydGJsb2NrKTsKIAkJYnl0ZV9jbnQgPSBYRlNfRlNCX1RPX0IobXAsIG12YWxbbl0uYnJfYmxvY2tjb3VudCk7CiAKLQkJYnAgPSB4ZnNfYnVmX3JlYWRfZmxhZ3MobXAtPm1fZGRldl90YXJncCwgZCwgQlRPQkIoYnl0ZV9jbnQpLAotCQkJCQlYQkZfTE9DSyB8IFhCRl9NQVBQRUQgfAotCQkJCQlYQkZfRE9OVF9CTE9DSyk7CisJCWJwID0geGZzX2J1Zl9yZWFkKG1wLT5tX2RkZXZfdGFyZ3AsIGQsIEJUT0JCKGJ5dGVfY250KSwKKwkJCQkgIFhCRl9MT0NLIHwgWEJGX01BUFBFRCB8IFhCRl9ET05UX0JMT0NLKTsKIAkJZXJyb3IgPSBYRlNfQlVGX0dFVEVSUk9SKGJwKTsKIAkJaWYgKGVycm9yKSB7CiAJCQl4ZnNfaW9lcnJvcl9hbGVydCgieGZzX3JlYWRsaW5rIiwKQEAgLTcwOSw2ICs3MDgsMTEgQEAKIH0KIAogLyoKKyAqIEZsYWdzIGZvciB4ZnNfZnJlZV9lb2ZibG9ja3MKKyAqLworI2RlZmluZSBYRlNfRlJFRV9FT0ZfVFJZTE9DSwkoMTw8MCkKKworLyoKICAqIFRoaXMgaXMgY2FsbGVkIGJ5IHhmc19pbmFjdGl2ZSB0byBmcmVlIGFueSBibG9ja3MgYmV5b25kIGVvZgogICogd2hlbiB0aGUgbGluayBjb3VudCBpc24ndCB6ZXJvIGFuZCBieSB4ZnNfZG1fcHVuY2hfaG9sZSgpIHdoZW4KICAqIHB1bmNoaW5nIGEgaG9sZSB0byBFT0YuCkBAIC03MjYsNyArNzMwLDYgQEAKIAl4ZnNfZmlsYmxrc190CW1hcF9sZW47CiAJaW50CQluaW1hcHM7CiAJeGZzX2JtYnRfaXJlY190CWltYXA7Ci0JaW50CQl1c2VfaW9sb2NrID0gKGZsYWdzICYgWEZTX0ZSRUVfRU9GX0xPQ0spOwogCiAJLyoKIAkgKiBGaWd1cmUgb3V0IGlmIHRoZXJlIGFyZSBhbnkgYmxvY2tzIGJleW9uZCB0aGUgZW5kCkBAIC03NjgsMTQgKzc3MSwxOSBAQAogCQkgKiBjYWNoZSBhbmQgd2UgY2FuJ3QKIAkJICogZG8gdGhhdCB3aXRoaW4gYSB0cmFuc2FjdGlvbi4KIAkJICovCi0JCWlmICh1c2VfaW9sb2NrKQorCQlpZiAoZmxhZ3MgJiBYRlNfRlJFRV9FT0ZfVFJZTE9DSykgeworCQkJaWYgKCF4ZnNfaWxvY2tfbm93YWl0KGlwLCBYRlNfSU9MT0NLX0VYQ0wpKSB7CisJCQkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0gZWxzZSB7CiAJCQl4ZnNfaWxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCk7CisJCX0KIAkJZXJyb3IgPSB4ZnNfaXRydW5jYXRlX3N0YXJ0KGlwLCBYRlNfSVRSVU5DX0RFRklOSVRFLAogCQkJCSAgICBpcC0+aV9zaXplKTsKIAkJaWYgKGVycm9yKSB7CiAJCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKLQkJCWlmICh1c2VfaW9sb2NrKQotCQkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSU9MT0NLX0VYQ0wpOworCQkJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCk7CiAJCQlyZXR1cm4gZXJyb3I7CiAJCX0KIApAQCAtODEyLDggKzgyMCw3IEBACiAJCQllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsCiAJCQkJCQlYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTKTsKIAkJfQotCQl4ZnNfaXVubG9jayhpcCwgKHVzZV9pb2xvY2sgPyAoWEZTX0lPTE9DS19FWENMfFhGU19JTE9DS19FWENMKQotCQkJCQkgICAgOiBYRlNfSUxPQ0tfRVhDTCkpOworCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lPTE9DS19FWENMfFhGU19JTE9DS19FWENMKTsKIAl9CiAJcmV0dXJuIGVycm9yOwogfQpAQCAtMTExMyw3ICsxMTIwLDE3IEBACiAJCSAgICAgKGlwLT5pX2RmLmlmX2ZsYWdzICYgWEZTX0lGRVhURU5UUykpICAmJgogCQkgICAgKCEoaXAtPmlfZC5kaV9mbGFncyAmCiAJCQkJKFhGU19ESUZMQUdfUFJFQUxMT0MgfCBYRlNfRElGTEFHX0FQUEVORCkpKSkgewotCQkJZXJyb3IgPSB4ZnNfZnJlZV9lb2ZibG9ja3MobXAsIGlwLCBYRlNfRlJFRV9FT0ZfTE9DSyk7CisKKwkJCS8qCisJCQkgKiBJZiB3ZSBjYW4ndCBnZXQgdGhlIGlvbG9jayBqdXN0IHNraXAgdHJ1bmNhdGluZworCQkJICogdGhlIGJsb2NrcyBwYXN0IEVPRiBiZWNhdXNlIHdlIGNvdWxkIGRlYWRsb2NrCisJCQkgKiB3aXRoIHRoZSBtbWFwX3NlbSBvdGhlcndpc2UuICBXZSdsbCBnZXQgYW5vdGhlcgorCQkJICogY2hhbmNlIHRvIGRyb3AgdGhlbSBvbmNlIHRoZSBsYXN0IHJlZmVyZW5jZSB0bworCQkJICogdGhlIGlub2RlIGlzIGRyb3BwZWQsIHNvIHdlJ2xsIG5ldmVyIGxlYWsgYmxvY2tzCisJCQkgKiBwZXJtYW5lbnRseS4KKwkJCSAqLworCQkJZXJyb3IgPSB4ZnNfZnJlZV9lb2ZibG9ja3MobXAsIGlwLAorCQkJCQkJICAgWEZTX0ZSRUVfRU9GX1RSWUxPQ0spOwogCQkJaWYgKGVycm9yKQogCQkJCXJldHVybiBlcnJvcjsKIAkJfQpAQCAtMTE4NCw3ICsxMjAxLDcgQEAKIAkJICAgICAoIShpcC0+aV9kLmRpX2ZsYWdzICYKIAkJCQkoWEZTX0RJRkxBR19QUkVBTExPQyB8IFhGU19ESUZMQUdfQVBQRU5EKSkgfHwKIAkJICAgICAgKGlwLT5pX2RlbGF5ZWRfYmxrcyAhPSAwKSkpKSB7Ci0JCQllcnJvciA9IHhmc19mcmVlX2VvZmJsb2NrcyhtcCwgaXAsIFhGU19GUkVFX0VPRl9MT0NLKTsKKwkJCWVycm9yID0geGZzX2ZyZWVfZW9mYmxvY2tzKG1wLCBpcCwgMCk7CiAJCQlpZiAoZXJyb3IpCiAJCQkJcmV0dXJuIFZOX0lOQUNUSVZFX0NBQ0hFOwogCQl9CkBAIC0yNDU2LDQ2ICsyNDczLDYgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLWludAoteGZzX3JlY2xhaW0oCi0JeGZzX2lub2RlX3QJKmlwKQotewotCi0JeGZzX2l0cmFjZV9lbnRyeShpcCk7Ci0KLQlBU1NFUlQoIVZOX01BUFBFRChWRlNfSShpcCkpKTsKLQotCS8qIGJhZCBpbm9kZSwgZ2V0IG91dCBoZXJlIEFTQVAgKi8KLQlpZiAoaXNfYmFkX2lub2RlKFZGU19JKGlwKSkpIHsKLQkJeGZzX2lyZWNsYWltKGlwKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JeGZzX2lvZW5kX3dhaXQoaXApOwotCi0JQVNTRVJUKFhGU19GT1JDRURfU0hVVERPV04oaXAtPmlfbW91bnQpIHx8IGlwLT5pX2RlbGF5ZWRfYmxrcyA9PSAwKTsKLQotCS8qCi0JICogSWYgd2UgaGF2ZSBub3RoaW5nIHRvIGZsdXNoIHdpdGggdGhpcyBpbm9kZSB0aGVuIGNvbXBsZXRlIHRoZQotCSAqIHRlYXJkb3duIG5vdywgb3RoZXJ3aXNlIGJyZWFrIHRoZSBsaW5rIGJldHdlZW4gdGhlIHhmcyBpbm9kZSBhbmQgdGhlCi0JICogbGludXggaW5vZGUgYW5kIGNsZWFuIHVwIHRoZSB4ZnMgaW5vZGUgbGF0ZXIuIFRoaXMgYXZvaWRzIGZsdXNoaW5nCi0JICogdGhlIGlub2RlIHRvIGRpc2sgZHVyaW5nIHRoZSBkZWxldGUgb3BlcmF0aW9uIGl0c2VsZi4KLQkgKgotCSAqIFdoZW4gYnJlYWtpbmcgdGhlIGxpbmssIHdlIG5lZWQgdG8gc2V0IHRoZSBYRlNfSVJFQ0xBSU1BQkxFIGZsYWcKLQkgKiBmaXJzdCB0byBlbnN1cmUgdGhhdCB4ZnNfaXVucGluKCkgd2lsbCBuZXZlciBzZWUgYW4geGZzIGlub2RlCi0JICogdGhhdCBoYXMgYSBsaW51eCBpbm9kZSBiZWluZyByZWNsYWltZWQuIFN5bmNocm9uaXNhdGlvbiBpcyBwcm92aWRlZAotCSAqIGJ5IHRoZSBpX2ZsYWdzX2xvY2suCi0JICovCi0JaWYgKCFpcC0+aV91cGRhdGVfY29yZSAmJiAoaXAtPmlfaXRlbXAgPT0gTlVMTCkpIHsKLQkJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JCXhmc19pZmxvY2soaXApOwotCQl4ZnNfaWZsYWdzX3NldChpcCwgWEZTX0lSRUNMQUlNQUJMRSk7Ci0JCXJldHVybiB4ZnNfcmVjbGFpbV9pbm9kZShpcCwgMSwgWEZTX0lGTFVTSF9ERUxXUklfRUxTRV9TWU5DKTsKLQl9Ci0JeGZzX2lub2RlX3NldF9yZWNsYWltX3RhZyhpcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KIC8qCiAgKiB4ZnNfYWxsb2NfZmlsZV9zcGFjZSgpCiAgKiAgICAgIFRoaXMgcm91dGluZSBhbGxvY2F0ZXMgZGlzayBzcGFjZSBmb3IgdGhlIGdpdmVuIGZpbGUuCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3Zub2Rlb3BzLmggYi9mcy94ZnMveGZzX3Zub2Rlb3BzLmgKaW5kZXggYTllMTAyZC4uMTY3YTQ2NyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc192bm9kZW9wcy5oCisrKyBiL2ZzL3hmcy94ZnNfdm5vZGVvcHMuaApAQCAtMzgsNyArMzgsNiBAQAogCQljb25zdCBjaGFyICp0YXJnZXRfcGF0aCwgbW9kZV90IG1vZGUsIHN0cnVjdCB4ZnNfaW5vZGUgKippcHAsCiAJCWNyZWRfdCAqY3JlZHApOwogaW50IHhmc19zZXRfZG1hdHRycyhzdHJ1Y3QgeGZzX2lub2RlICppcCwgdV9pbnQgZXZtYXNrLCB1X2ludDE2X3Qgc3RhdGUpOwotaW50IHhmc19yZWNsYWltKHN0cnVjdCB4ZnNfaW5vZGUgKmlwKTsKIGludCB4ZnNfY2hhbmdlX2ZpbGVfc3BhY2Uoc3RydWN0IHhmc19pbm9kZSAqaXAsIGludCBjbWQsCiAJCXhmc19mbG9jazY0X3QgKmJmLCB4ZnNfb2ZmX3Qgb2Zmc2V0LCBpbnQgYXR0cl9mbGFncyk7CiBpbnQgeGZzX3JlbmFtZShzdHJ1Y3QgeGZzX2lub2RlICpzcmNfZHAsIHN0cnVjdCB4ZnNfbmFtZSAqc3JjX25hbWUsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaV9oZXN0LmggYi9pbmNsdWRlL2FjcGkvYWNwaV9oZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMxOTRkMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BpX2hlc3QuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9fQUNQSV9IRVNUX0gKKyNkZWZpbmUgX19BQ1BJX0hFU1RfSAorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpZmRlZiBDT05GSUdfQUNQSQorZXh0ZXJuIGludCBhY3BpX2hlc3RfZmlybXdhcmVfZmlyc3RfcGNpKHN0cnVjdCBwY2lfZGV2ICpwY2kpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGFjcGlfaGVzdF9maXJtd2FyZV9maXJzdF9wY2koc3RydWN0IHBjaV9kZXYgKnBjaSkgeyByZXR1cm4gMDsgfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oCmluZGV4IDc0MGFjM2EuLjhiNjY4ZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmgKQEAgLTI5NSw2ICsyOTUsNyBAQAogdm9pZCBhY3BpX3Byb2Nlc3Nvcl9wcGNfaW5pdCh2b2lkKTsKIHZvaWQgYWNwaV9wcm9jZXNzb3JfcHBjX2V4aXQodm9pZCk7CiBpbnQgYWNwaV9wcm9jZXNzb3JfcHBjX2hhc19jaGFuZ2VkKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpOworZXh0ZXJuIGludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfYmlvc19saW1pdChpbnQgY3B1LCB1bnNpZ25lZCBpbnQgKmxpbWl0KTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9wcm9jZXNzb3JfcHBjX2luaXQodm9pZCkKIHsKQEAgLTMxNiw2ICszMTcsMTEgQEAKIAl9CiAJcmV0dXJuIDA7CiB9CitzdGF0aWMgaW5saW5lIGludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfYmlvc19saW1pdChpbnQgY3B1LCB1bnNpZ25lZCBpbnQgKmxpbWl0KQoreworCXJldHVybiAtRU5PREVWOworfQorCiAjZW5kaWYJCQkJLyogQ09ORklHX0NQVV9GUkVRICovCiAKIC8qIGluIHByb2Nlc3Nvcl90aHJvdHRsaW5nLmMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvZmNudGwuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvZmNudGwuaAppbmRleCA0OTVkYzhhLi42ODFkZGYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL2ZjbnRsLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9mY250bC5oCkBAIC0zLDggKzMsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAotLyogb3Blbi9mY250bCAtIE9fU1lOQyBpcyBvbmx5IGltcGxlbWVudGVkIG9uIGJsb2NrcyBkZXZpY2VzIGFuZCBvbiBmaWxlcwotICAgbG9jYXRlZCBvbiBhbiBleHQyIGZpbGUgc3lzdGVtICovCiAjZGVmaW5lIE9fQUNDTU9ERQkwMDAwMDAwMwogI2RlZmluZSBPX1JET05MWQkwMDAwMDAwMAogI2RlZmluZSBPX1dST05MWQkwMDAwMDAwMQpAQCAtMjcsOCArMjUsOCBAQAogI2lmbmRlZiBPX05PTkJMT0NLCiAjZGVmaW5lIE9fTk9OQkxPQ0sJMDAwMDQwMDAKICNlbmRpZgotI2lmbmRlZiBPX1NZTkMKLSNkZWZpbmUgT19TWU5DCQkwMDAxMDAwMAorI2lmbmRlZiBPX0RTWU5DCisjZGVmaW5lIE9fRFNZTkMJCTAwMDEwMDAwCS8qIHVzZWQgdG8gYmUgT19TWU5DLCBzZWUgYmVsb3cgKi8KICNlbmRpZgogI2lmbmRlZiBGQVNZTkMKICNkZWZpbmUgRkFTWU5DCQkwMDAyMDAwMAkvKiBmY250bCwgZm9yIEJTRCBjb21wYXRpYmlsaXR5ICovCkBAIC01MSw2ICs0OSwyNSBAQAogI2lmbmRlZiBPX0NMT0VYRUMKICNkZWZpbmUgT19DTE9FWEVDCTAyMDAwMDAwCS8qIHNldCBjbG9zZV9vbl9leGVjICovCiAjZW5kaWYKKworLyoKKyAqIEJlZm9yZSBMaW51eCAyLjYuMzIgb25seSBPX0RTWU5DIHNlbWFudGljcyB3ZXJlIGltcGxlbWVudGVkLCBidXQgdXNpbmcKKyAqIHRoZSBPX1NZTkMgZmxhZy4gIFdlIGNvbnRpbnVlIHRvIHVzZSB0aGUgZXhpc3RpbmcgbnVtZXJpY2FsIHZhbHVlCisgKiBmb3IgT19EU1lOQyBzZW1hbnRpY3Mgbm93LCBidXQgdXNpbmcgdGhlIGNvcnJlY3Qgc3ltYm9saWMgbmFtZSBmb3IgaXQuCisgKiBUaGlzIG5ldyB2YWx1ZSBpcyB1c2VkIHRvIHJlcXVlc3QgdHJ1ZSBQb3NpeCBPX1NZTkMgc2VtYW50aWNzLiAgSXQgaXMKKyAqIGRlZmluZWQgaW4gdGhpcyBzdHJhbmdlIHdheSB0byBtYWtlIHN1cmUgYXBwbGljYXRpb25zIGNvbXBpbGVkIGFnYWluc3QKKyAqIG5ldyBoZWFkZXJzIGdldCBhdCBsZWFzdCBPX0RTWU5DIHNlbWFudGljcyBvbiBvbGRlciBrZXJuZWxzLgorICoKKyAqIFRoaXMgaGFzIHRoZSBuaWNlIHNpZGUtZWZmZWN0IHRoYXQgd2UgY2FuIHNpbXBseSB0ZXN0IGZvciBPX0RTWU5DCisgKiB3aGVyZXZlciB3ZSBkbyBub3QgY2FyZSBpZiBPX0RTWU5DIG9yIE9fU1lOQyBpcyB1c2VkLgorICoKKyAqIE5vdGU6IF9fT19TWU5DIG11c3QgbmV2ZXIgYmUgdXNlZCBkaXJlY3RseS4KKyAqLworI2lmbmRlZiBPX1NZTkMKKyNkZWZpbmUgX19PX1NZTkMJMDQwMDAwMDAKKyNkZWZpbmUgT19TWU5DCQkoX19PX1NZTkN8T19EU1lOQykKKyNlbmRpZgorCiAjaWZuZGVmIE9fTkRFTEFZCiAjZGVmaW5lIE9fTkRFTEFZCU9fTk9OQkxPQ0sKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9ncGlvLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2dwaW8uaAppbmRleCA2NmQ2MTA2Li4yMDRiZWQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL2dwaW8uaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2dwaW8uaApAQCAtMjgsNiArMjgsNyBAQAogCXJldHVybiAoKHVuc2lnbmVkKW51bWJlcikgPCBBUkNIX05SX0dQSU9TOwogfQogCitzdHJ1Y3QgZGV2aWNlOwogc3RydWN0IHNlcV9maWxlOwogc3RydWN0IG1vZHVsZTsKIApAQCAtMTgxLDYgKzE4Miw4IEBACiAKICNpZm5kZWYgQ09ORklHX0dQSU9fU1lTRlMKIAorc3RydWN0IGRldmljZTsKKwogLyogc3lzZnMgc3VwcG9ydCBpcyBvbmx5IGF2YWlsYWJsZSB3aXRoIGdwaW9saWIsIHdoZXJlIGl0J3Mgb3B0aW9uYWwgKi8KIAogc3RhdGljIGlubGluZSBpbnQgZ3Bpb19leHBvcnQodW5zaWduZWQgZ3BpbywgYm9vbCBkaXJlY3Rpb25fbWF5X2NoYW5nZSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGVyY3B1LmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3BlcmNwdS5oCmluZGV4IDkwMDc5YzMuLjgwODdiOTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGVyY3B1LmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZXJjcHUuaApAQCAtNTYsNiArNTYsOSBAQAogI2RlZmluZSBfX3Jhd19nZXRfY3B1X3Zhcih2YXIpIFwKIAkoKlNISUZUX1BFUkNQVV9QVFIoJnBlcl9jcHVfdmFyKHZhciksIF9fbXlfY3B1X29mZnNldCkpCiAKKyNkZWZpbmUgdGhpc19jcHVfcHRyKHB0cikgU0hJRlRfUEVSQ1BVX1BUUihwdHIsIG15X2NwdV9vZmZzZXQpCisjZGVmaW5lIF9fdGhpc19jcHVfcHRyKHB0cikgU0hJRlRfUEVSQ1BVX1BUUihwdHIsIF9fbXlfY3B1X29mZnNldCkKKwogCiAjaWZkZWYgQ09ORklHX0hBVkVfU0VUVVBfUEVSX0NQVV9BUkVBCiBleHRlcm4gdm9pZCBzZXR1cF9wZXJfY3B1X2FyZWFzKHZvaWQpOwpAQCAtNjYsNiArNjksOCBAQAogI2RlZmluZSBwZXJfY3B1KHZhciwgY3B1KQkJCSgqKCh2b2lkKShjcHUpLCAmcGVyX2NwdV92YXIodmFyKSkpCiAjZGVmaW5lIF9fZ2V0X2NwdV92YXIodmFyKQkJCXBlcl9jcHVfdmFyKHZhcikKICNkZWZpbmUgX19yYXdfZ2V0X2NwdV92YXIodmFyKQkJCXBlcl9jcHVfdmFyKHZhcikKKyNkZWZpbmUgdGhpc19jcHVfcHRyKHB0cikgcGVyX2NwdV9wdHIocHRyLCAwKQorI2RlZmluZSBfX3RoaXNfY3B1X3B0cihwdHIpIHRoaXNfY3B1X3B0cihwdHIpCiAKICNlbmRpZgkvKiBTTVAgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvdW5pc3RkLmgKaW5kZXggN2MzOGMxNC4uNmEwYjMwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3VuaXN0ZC5oCkBAIC02MjIsOSArNjIyLDEzIEBACiBfX1NZU0NBTEwoX19OUl9ydF90Z3NpZ3F1ZXVlaW5mbywgc3lzX3J0X3Rnc2lncXVldWVpbmZvKQogI2RlZmluZSBfX05SX3BlcmZfZXZlbnRfb3BlbiAyNDEKIF9fU1lTQ0FMTChfX05SX3BlcmZfZXZlbnRfb3Blbiwgc3lzX3BlcmZfZXZlbnRfb3BlbikKKyNkZWZpbmUgX19OUl9hY2NlcHQ0IDI0MgorX19TWVNDQUxMKF9fTlJfYWNjZXB0NCwgc3lzX2FjY2VwdDQpCisjZGVmaW5lIF9fTlJfcmVjdm1tc2cgMjQzCitfX1NZU0NBTEwoX19OUl9yZWN2bW1zZywgc3lzX3JlY3ZtbXNnKQogCiAjdW5kZWYgX19OUl9zeXNjYWxscwotI2RlZmluZSBfX05SX3N5c2NhbGxzIDI0MgorI2RlZmluZSBfX05SX3N5c2NhbGxzIDI0NAogCiAvKgogICogQWxsIHN5c2NhbGxzIGJlbG93IGhlcmUgc2hvdWxkIGdvIGF3YXkgcmVhbGx5LApAQCAtODAyLDcgKzgwNiw3IEBACiAjZGVmaW5lIF9fTlJfc3RhdGZzIF9fTlIzMjY0X3N0YXRmcwogI2RlZmluZSBfX05SX2ZzdGF0ZnMgX19OUjMyNjRfZnN0YXRmcwogI2RlZmluZSBfX05SX3RydW5jYXRlIF9fTlIzMjY0X3RydW5jYXRlCi0jZGVmaW5lIF9fTlJfZnRydW5jYXRlIF9fTlIzMjY0X3RydW5jYXRlCisjZGVmaW5lIF9fTlJfZnRydW5jYXRlIF9fTlIzMjY0X2Z0cnVuY2F0ZQogI2RlZmluZSBfX05SX2xzZWVrIF9fTlIzMjY0X2xzZWVrCiAjZGVmaW5lIF9fTlJfc2VuZGZpbGUgX19OUjMyNjRfc2VuZGZpbGUKICNkZWZpbmUgX19OUl9uZXdmc3RhdGF0IF9fTlIzMjY0X2ZzdGF0YXQKQEAgLTgxOCw3ICs4MjIsNyBAQAogI2RlZmluZSBfX05SX3N0YXRmczY0IF9fTlIzMjY0X3N0YXRmcwogI2RlZmluZSBfX05SX2ZzdGF0ZnM2NCBfX05SMzI2NF9mc3RhdGZzCiAjZGVmaW5lIF9fTlJfdHJ1bmNhdGU2NCBfX05SMzI2NF90cnVuY2F0ZQotI2RlZmluZSBfX05SX2Z0cnVuY2F0ZTY0IF9fTlIzMjY0X3RydW5jYXRlCisjZGVmaW5lIF9fTlJfZnRydW5jYXRlNjQgX19OUjMyNjRfZnRydW5jYXRlCiAjZGVmaW5lIF9fTlJfbGxzZWVrIF9fTlIzMjY0X2xzZWVrCiAjZGVmaW5lIF9fTlJfc2VuZGZpbGU2NCBfX05SMzI2NF9zZW5kZmlsZQogI2RlZmluZSBfX05SX2ZzdGF0YXQ2NCBfX05SMzI2NF9mc3RhdGF0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9LYnVpbGQgYi9pbmNsdWRlL2RybS9LYnVpbGQKaW5kZXggYjk0MGZkZi4uY2ZhNmFmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vS2J1aWxkCisrKyBiL2luY2x1ZGUvZHJtL0tidWlsZApAQCAtOCwzICs4LDQgQEAKIHVuaWZkZWYteSArPSBzaXNfZHJtLmgKIHVuaWZkZWYteSArPSBzYXZhZ2VfZHJtLmgKIHVuaWZkZWYteSArPSB2aWFfZHJtLmgKK3VuaWZkZWYteSArPSBub3V2ZWF1X2RybS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9pMmMvY2g3MDA2LmggYi9pbmNsdWRlL2RybS9pMmMvY2g3MDA2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5MGI0MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL2kyYy9jaDcwMDYuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEZyYW5jaXNjbyBKZXJlei4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX19EUk1fSTJDX0NINzAwNl9IX18KKyNkZWZpbmUgX19EUk1fSTJDX0NINzAwNl9IX18KKworLyoqCisgKiBzdHJ1Y3QgY2g3MDA2X2VuY29kZXJfcGFyYW1zCisgKgorICogRGVzY3JpYmVzIGhvdyB0aGUgY2g3MDA2IGlzIHdpcmVkIHVwIHdpdGggdGhlIEdQVS4gSXQgc2hvdWxkIGJlCisgKiB1c2VkIGFzIHRoZSBAcGFyYW1zIHBhcmFtZXRlciBvZiBpdHMgQHNldF9jb25maWcgbWV0aG9kLgorICoKKyAqIFNlZSAiaHR0cDovL3d3dy5jaHJvbnRlbC5jb20vcGRmLzcwMDYucGRmIiBmb3IgdGhlaXIgcHJlY2lzZQorICogbWVhbmluZy4KKyAqLworc3RydWN0IGNoNzAwNl9lbmNvZGVyX3BhcmFtcyB7CisJZW51bSB7CisJCUNINzAwNl9GT1JNQVRfUkdCMTYgPSAwLAorCQlDSDcwMDZfRk9STUFUX1lDckNiMjRtMTYsCisJCUNINzAwNl9GT1JNQVRfUkdCMjRtMTYsCisJCUNINzAwNl9GT1JNQVRfUkdCMTUsCisJCUNINzAwNl9GT1JNQVRfUkdCMjRtMTJDLAorCQlDSDcwMDZfRk9STUFUX1JHQjI0bTEySSwKKwkJQ0g3MDA2X0ZPUk1BVF9SR0IyNG04LAorCQlDSDcwMDZfRk9STUFUX1JHQjE2bTgsCisJCUNINzAwNl9GT1JNQVRfUkdCMTVtOCwKKwkJQ0g3MDA2X0ZPUk1BVF9ZQ3JDYjI0bTgsCisJfSBpbnB1dF9mb3JtYXQ7CisKKwllbnVtIHsKKwkJQ0g3MDA2X0NMT0NLX1NMQVZFID0gMCwKKwkJQ0g3MDA2X0NMT0NLX01BU1RFUiwKKwl9IGNsb2NrX21vZGU7CisKKwllbnVtIHsKKwkJQ0g3MDA2X0NMT0NLX0VER0VfTkVHID0gMCwKKwkJQ0g3MDA2X0NMT0NLX0VER0VfUE9TLAorCX0gY2xvY2tfZWRnZTsKKworCWludCB4Y20sIHBjbTsKKworCWVudW0geworCQlDSDcwMDZfU1lOQ19TTEFWRSA9IDAsCisJCUNINzAwNl9TWU5DX01BU1RFUiwKKwl9IHN5bmNfZGlyZWN0aW9uOworCisJZW51bSB7CisJCUNINzAwNl9TWU5DX1NFUEFSQVRFRCA9IDAsCisJCUNINzAwNl9TWU5DX0VNQkVEREVELAorCX0gc3luY19lbmNvZGluZzsKKworCWVudW0geworCQlDSDcwMDZfUE9VVF8xXzhWID0gMCwKKwkJQ0g3MDA2X1BPVVRfM18zViwKKwl9IHBvdXRfbGV2ZWw7CisKKwllbnVtIHsKKwkJQ0g3MDA2X0FDVElWRV9IU1lOQyA9IDAsCisJCUNINzAwNl9BQ1RJVkVfRFNUQVJULAorCX0gYWN0aXZlX2RldGVjdDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vbm91dmVhdV9kcm0uaCBiL2luY2x1ZGUvZHJtL25vdXZlYXVfZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU2N2M0NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL25vdXZlYXVfZHJtLmgKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNSBTdGVwaGFuZSBNYXJjaGVzaW4uCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19OT1VWRUFVX0RSTV9IX18KKyNkZWZpbmUgX19OT1VWRUFVX0RSTV9IX18KKworI2RlZmluZSBOT1VWRUFVX0RSTV9IRUFERVJfUEFUQ0hMRVZFTCAxNQorCitzdHJ1Y3QgZHJtX25vdXZlYXVfY2hhbm5lbF9hbGxvYyB7CisJdWludDMyX3QgICAgIGZiX2N0eGRtYV9oYW5kbGU7CisJdWludDMyX3QgICAgIHR0X2N0eGRtYV9oYW5kbGU7CisKKwlpbnQgICAgICAgICAgY2hhbm5lbDsKKworCS8qIE5vdGlmaWVyIG1lbW9yeSAqLworCXVpbnQzMl90ICAgICBub3RpZmllcl9oYW5kbGU7CisKKwkvKiBEUk0tZW5mb3JjZWQgc3ViY2hhbm5lbCBhc3NpZ25tZW50cyAqLworCXN0cnVjdCB7CisJCXVpbnQzMl90IGhhbmRsZTsKKwkJdWludDMyX3QgZ3JjbGFzczsKKwl9IHN1YmNoYW5bOF07CisJdWludDMyX3QgbnJfc3ViY2hhbjsKK307CisKK3N0cnVjdCBkcm1fbm91dmVhdV9jaGFubmVsX2ZyZWUgeworCWludCBjaGFubmVsOworfTsKKworc3RydWN0IGRybV9ub3V2ZWF1X2dyb2JqX2FsbG9jIHsKKwlpbnQgICAgICBjaGFubmVsOworCXVpbnQzMl90IGhhbmRsZTsKKwlpbnQgICAgICBjbGFzczsKK307CisKK3N0cnVjdCBkcm1fbm91dmVhdV9ub3RpZmllcm9ial9hbGxvYyB7CisJdWludDMyX3QgY2hhbm5lbDsKKwl1aW50MzJfdCBoYW5kbGU7CisJdWludDMyX3Qgc2l6ZTsKKwl1aW50MzJfdCBvZmZzZXQ7Cit9OworCitzdHJ1Y3QgZHJtX25vdXZlYXVfZ3B1b2JqX2ZyZWUgeworCWludCAgICAgIGNoYW5uZWw7CisJdWludDMyX3QgaGFuZGxlOworfTsKKworLyogRklYTUUgOiBtYXliZSB1bmlmeSB7R0VULFNFVH1QQVJBTXMgKi8KKyNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9QQ0lfVkVORE9SICAgICAgMworI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX1BDSV9ERVZJQ0UgICAgICA0CisjZGVmaW5lIE5PVVZFQVVfR0VUUEFSQU1fQlVTX1RZUEUgICAgICAgIDUKKyNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9GQl9QSFlTSUNBTCAgICAgNgorI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX0FHUF9QSFlTSUNBTCAgICA3CisjZGVmaW5lIE5PVVZFQVVfR0VUUEFSQU1fRkJfU0laRSAgICAgICAgIDgKKyNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9BR1BfU0laRSAgICAgICAgOQorI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX1BDSV9QSFlTSUNBTCAgICAxMAorI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX0NISVBTRVRfSUQgICAgICAxMQorI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX1ZNX1ZSQU1fQkFTRSAgICAxMgorc3RydWN0IGRybV9ub3V2ZWF1X2dldHBhcmFtIHsKKwl1aW50NjRfdCBwYXJhbTsKKwl1aW50NjRfdCB2YWx1ZTsKK307CisKK3N0cnVjdCBkcm1fbm91dmVhdV9zZXRwYXJhbSB7CisJdWludDY0X3QgcGFyYW07CisJdWludDY0X3QgdmFsdWU7Cit9OworCisjZGVmaW5lIE5PVVZFQVVfR0VNX0RPTUFJTl9DUFUgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU0gICAgICAoMSA8PCAxKQorI2RlZmluZSBOT1VWRUFVX0dFTV9ET01BSU5fR0FSVCAgICAgICgxIDw8IDIpCisjZGVmaW5lIE5PVVZFQVVfR0VNX0RPTUFJTl9NQVBQQUJMRSAgKDEgPDwgMykKKworc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9pbmZvIHsKKwl1aW50MzJfdCBoYW5kbGU7CisJdWludDMyX3QgZG9tYWluOworCXVpbnQ2NF90IHNpemU7CisJdWludDY0X3Qgb2Zmc2V0OworCXVpbnQ2NF90IG1hcF9oYW5kbGU7CisJdWludDMyX3QgdGlsZV9tb2RlOworCXVpbnQzMl90IHRpbGVfZmxhZ3M7Cit9OworCitzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX25ldyB7CisJc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9pbmZvIGluZm87CisJdWludDMyX3QgY2hhbm5lbF9oaW50OworCXVpbnQzMl90IGFsaWduOworfTsKKworc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9wdXNoYnVmX2JvIHsKKwl1aW50NjRfdCB1c2VyX3ByaXY7CisJdWludDMyX3QgaGFuZGxlOworCXVpbnQzMl90IHJlYWRfZG9tYWluczsKKwl1aW50MzJfdCB3cml0ZV9kb21haW5zOworCXVpbnQzMl90IHZhbGlkX2RvbWFpbnM7CisJdWludDMyX3QgcHJlc3VtZWRfb2s7CisJdWludDMyX3QgcHJlc3VtZWRfZG9tYWluOworCXVpbnQ2NF90IHByZXN1bWVkX29mZnNldDsKK307CisKKyNkZWZpbmUgTk9VVkVBVV9HRU1fUkVMT0NfTE9XICAoMSA8PCAwKQorI2RlZmluZSBOT1VWRUFVX0dFTV9SRUxPQ19ISUdIICgxIDw8IDEpCisjZGVmaW5lIE5PVVZFQVVfR0VNX1JFTE9DX09SICAgKDEgPDwgMikKK3N0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1Zl9yZWxvYyB7CisJdWludDMyX3QgYm9faW5kZXg7CisJdWludDMyX3QgcmVsb2NfaW5kZXg7CisJdWludDMyX3QgZmxhZ3M7CisJdWludDMyX3QgZGF0YTsKKwl1aW50MzJfdCB2b3I7CisJdWludDMyX3QgdG9yOworfTsKKworI2RlZmluZSBOT1VWRUFVX0dFTV9NQVhfQlVGRkVSUyAxMDI0CisjZGVmaW5lIE5PVVZFQVVfR0VNX01BWF9SRUxPQ1MgMTAyNAorCitzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX3B1c2hidWYgeworCXVpbnQzMl90IGNoYW5uZWw7CisJdWludDMyX3QgbnJfZHdvcmRzOworCXVpbnQzMl90IG5yX2J1ZmZlcnM7CisJdWludDMyX3QgbnJfcmVsb2NzOworCXVpbnQ2NF90IGR3b3JkczsKKwl1aW50NjRfdCBidWZmZXJzOworCXVpbnQ2NF90IHJlbG9jczsKK307CisKK3N0cnVjdCBkcm1fbm91dmVhdV9nZW1fcHVzaGJ1Zl9jYWxsIHsKKwl1aW50MzJfdCBjaGFubmVsOworCXVpbnQzMl90IGhhbmRsZTsKKwl1aW50MzJfdCBvZmZzZXQ7CisJdWludDMyX3QgbnJfYnVmZmVyczsKKwl1aW50MzJfdCBucl9yZWxvY3M7CisJdWludDMyX3QgbnJfZHdvcmRzOworCXVpbnQ2NF90IGJ1ZmZlcnM7CisJdWludDY0X3QgcmVsb2NzOworCXVpbnQzMl90IHN1ZmZpeDA7CisJdWludDMyX3Qgc3VmZml4MTsKKwkvKiBiZWxvdyBvbmx5IGFjY2Vzc2VkIGZvciBDQUxMMiAqLworCXVpbnQ2NF90IHZyYW1fYXZhaWxhYmxlOworCXVpbnQ2NF90IGdhcnRfYXZhaWxhYmxlOworfTsKKworc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9waW4geworCXVpbnQzMl90IGhhbmRsZTsKKwl1aW50MzJfdCBkb21haW47CisJdWludDY0X3Qgb2Zmc2V0OworfTsKKworc3RydWN0IGRybV9ub3V2ZWF1X2dlbV91bnBpbiB7CisJdWludDMyX3QgaGFuZGxlOworfTsKKworI2RlZmluZSBOT1VWRUFVX0dFTV9DUFVfUFJFUF9OT1dBSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBOT1VWRUFVX0dFTV9DUFVfUFJFUF9OT0JMT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBOT1VWRUFVX0dFTV9DUFVfUFJFUF9XUklURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9jcHVfcHJlcCB7CisJdWludDMyX3QgaGFuZGxlOworCXVpbnQzMl90IGZsYWdzOworfTsKKworc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9jcHVfZmluaSB7CisJdWludDMyX3QgaGFuZGxlOworfTsKKworc3RydWN0IGRybV9ub3V2ZWF1X2dlbV90aWxlIHsKKwl1aW50MzJfdCBoYW5kbGU7CisJdWludDMyX3Qgb2Zmc2V0OworCXVpbnQzMl90IHNpemU7CisJdWludDMyX3QgdGlsZV9tb2RlOworCXVpbnQzMl90IHRpbGVfZmxhZ3M7Cit9OworCitlbnVtIG5vdXZlYXVfYnVzX3R5cGUgeworCU5WX0FHUCAgICAgPSAwLAorCU5WX1BDSSAgICAgPSAxLAorCU5WX1BDSUUgICAgPSAyLAorfTsKKworc3RydWN0IGRybV9ub3V2ZWF1X3NhcmVhIHsKK307CisKKyNkZWZpbmUgRFJNX05PVVZFQVVfQ0FSRF9JTklUICAgICAgICAgIDB4MDAKKyNkZWZpbmUgRFJNX05PVVZFQVVfR0VUUEFSQU0gICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRFJNX05PVVZFQVVfU0VUUEFSQU0gICAgICAgICAgIDB4MDIKKyNkZWZpbmUgRFJNX05PVVZFQVVfQ0hBTk5FTF9BTExPQyAgICAgIDB4MDMKKyNkZWZpbmUgRFJNX05PVVZFQVVfQ0hBTk5FTF9GUkVFICAgICAgIDB4MDQKKyNkZWZpbmUgRFJNX05PVVZFQVVfR1JPQkpfQUxMT0MgICAgICAgIDB4MDUKKyNkZWZpbmUgRFJNX05PVVZFQVVfTk9USUZJRVJPQkpfQUxMT0MgIDB4MDYKKyNkZWZpbmUgRFJNX05PVVZFQVVfR1BVT0JKX0ZSRUUgICAgICAgIDB4MDcKKyNkZWZpbmUgRFJNX05PVVZFQVVfR0VNX05FVyAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgRFJNX05PVVZFQVVfR0VNX1BVU0hCVUYgICAgICAgIDB4NDEKKyNkZWZpbmUgRFJNX05PVVZFQVVfR0VNX1BVU0hCVUZfQ0FMTCAgIDB4NDIKKyNkZWZpbmUgRFJNX05PVVZFQVVfR0VNX1BJTiAgICAgICAgICAgIDB4NDMgLyogIUtNUyBvbmx5ICovCisjZGVmaW5lIERSTV9OT1VWRUFVX0dFTV9VTlBJTiAgICAgICAgICAweDQ0IC8qICFLTVMgb25seSAqLworI2RlZmluZSBEUk1fTk9VVkVBVV9HRU1fQ1BVX1BSRVAgICAgICAgMHg0NQorI2RlZmluZSBEUk1fTk9VVkVBVV9HRU1fQ1BVX0ZJTkkgICAgICAgMHg0NgorI2RlZmluZSBEUk1fTk9VVkVBVV9HRU1fSU5GTyAgICAgICAgICAgMHg0NworI2RlZmluZSBEUk1fTk9VVkVBVV9HRU1fUFVTSEJVRl9DQUxMMiAgMHg0OAorCisjZW5kaWYgLyogX19OT1VWRUFVX0RSTV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL3R0bS90dG1fYm9fYXBpLmggYi9pbmNsdWRlL2RybS90dG0vdHRtX2JvX2FwaS5oCmluZGV4IDRmZDQ5ODUuLjgxZWI5ZjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL3R0bS90dG1fYm9fYXBpLmgKKysrIGIvaW5jbHVkZS9kcm0vdHRtL3R0bV9ib19hcGkuaApAQCAtMzA4LDcgKzMwOCw3IEBACiBleHRlcm4gaW50IHR0bV9ib193YWl0KHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sIGJvb2wgbGF6eSwKIAkJICAgICAgIGJvb2wgaW50ZXJydXB0aWJsZSwgYm9vbCBub193YWl0KTsKIC8qKgotICogdHRtX2J1ZmZlcl9vYmplY3RfdmFsaWRhdGUKKyAqIHR0bV9ib192YWxpZGF0ZQogICoKICAqIEBibzogVGhlIGJ1ZmZlciBvYmplY3QuCiAgKiBAcGxhY2VtZW50OiBQcm9wb3NlZCBwbGFjZW1lbnQgZm9yIHRoZSBidWZmZXIgb2JqZWN0LgpAQCAtMzIzLDkgKzMyMyw5IEBACiAgKiAtRUJVU1kgaWYgbm9fd2FpdCBpcyB0cnVlIGFuZCBidWZmZXIgYnVzeS4KICAqIC1FUkVTVEFSVFNZUyBpZiBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbC4KICAqLwotZXh0ZXJuIGludCB0dG1fYnVmZmVyX29iamVjdF92YWxpZGF0ZShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAotCQkJCQlzdHJ1Y3QgdHRtX3BsYWNlbWVudCAqcGxhY2VtZW50LAotCQkJCQlib29sIGludGVycnVwdGlibGUsIGJvb2wgbm9fd2FpdCk7CitleHRlcm4gaW50IHR0bV9ib192YWxpZGF0ZShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAorCQkJCXN0cnVjdCB0dG1fcGxhY2VtZW50ICpwbGFjZW1lbnQsCisJCQkJYm9vbCBpbnRlcnJ1cHRpYmxlLCBib29sIG5vX3dhaXQpOwogCiAvKioKICAqIHR0bV9ib191bnJlZgpAQCAtMzYyLDcgKzM2Miw3IEBACiBleHRlcm4gdm9pZCB0dG1fYm9fc3luY2NwdV93cml0ZV9yZWxlYXNlKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pOwogCiAvKioKLSAqIHR0bV9idWZmZXJfb2JqZWN0X2luaXQKKyAqIHR0bV9ib19pbml0CiAgKgogICogQGJkZXY6IFBvaW50ZXIgdG8gYSB0dG1fYm9fZGV2aWNlIHN0cnVjdC4KICAqIEBibzogUG9pbnRlciB0byBhIHR0bV9idWZmZXJfb2JqZWN0IHRvIGJlIGluaXRpYWxpemVkLgpAQCAtMzkzLDE3ICszOTMsMTcgQEAKICAqIC1FUkVTVEFSVFNZUzogSW50ZXJydXB0ZWQgYnkgc2lnbmFsIHdoaWxlIHNsZWVwaW5nIHdhaXRpbmcgZm9yIHJlc291cmNlcy4KICAqLwogCi1leHRlcm4gaW50IHR0bV9idWZmZXJfb2JqZWN0X2luaXQoc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYsCi0JCQkJICBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAotCQkJCSAgdW5zaWduZWQgbG9uZyBzaXplLAotCQkJCSAgZW51bSB0dG1fYm9fdHlwZSB0eXBlLAotCQkJCSAgdWludDMyX3QgZmxhZ3MsCi0JCQkJICB1aW50MzJfdCBwYWdlX2FsaWdubWVudCwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgYnVmZmVyX3N0YXJ0LAotCQkJCSAgYm9vbCBpbnRlcnJ1YnRpYmxlLAotCQkJCSAgc3RydWN0IGZpbGUgKnBlcnNpc3RhbnRfc3dhcF9zdG9yYWdlLAotCQkJCSAgc2l6ZV90IGFjY19zaXplLAotCQkJCSAgdm9pZCAoKmRlc3Ryb3kpIChzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKikpOworZXh0ZXJuIGludCB0dG1fYm9faW5pdChzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiwKKwkJCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sCisJCQl1bnNpZ25lZCBsb25nIHNpemUsCisJCQllbnVtIHR0bV9ib190eXBlIHR5cGUsCisJCQlzdHJ1Y3QgdHRtX3BsYWNlbWVudCAqcGxhY2VtZW50LAorCQkJdWludDMyX3QgcGFnZV9hbGlnbm1lbnQsCisJCQl1bnNpZ25lZCBsb25nIGJ1ZmZlcl9zdGFydCwKKwkJCWJvb2wgaW50ZXJydWJ0aWJsZSwKKwkJCXN0cnVjdCBmaWxlICpwZXJzaXN0YW50X3N3YXBfc3RvcmFnZSwKKwkJCXNpemVfdCBhY2Nfc2l6ZSwKKwkJCXZvaWQgKCpkZXN0cm95KSAoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICopKTsKIC8qKgogICogdHRtX2JvX3N5bmNjcHVfb2JqZWN0X2luaXQKICAqCkBAIC00MjQsNDAgKzQyNCwzNyBAQAogICogR0VNIHVzZXIgaW50ZXJmYWNlLgogICogQHBfYm86IE9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiAqcF9ibyBwb2ludHMgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LgogICoKLSAqIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGEgdHRtX2J1ZmZlcl9vYmplY3QsIGFuZCB0aGVuIGNhbGxzCi0gKiB0dG1fYnVmZmVyX29iamVjdF9pbml0IG9uIHRoYXQgb2JqZWN0LgotICogVGhlIGRlc3Ryb3kgZnVuY3Rpb24gaXMgc2V0IHRvIGtmcmVlKCkuCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIHR0bV9idWZmZXJfb2JqZWN0LCBhbmQgdGhlbiBjYWxscyB0dG1fYm9faW5pdAorICogb24gdGhhdCBvYmplY3QuIFRoZSBkZXN0cm95IGZ1bmN0aW9uIGlzIHNldCB0byBrZnJlZSgpLgogICogUmV0dXJucwogICogLUVOT01FTTogT3V0IG9mIG1lbW9yeS4KICAqIC1FSU5WQUw6IEludmFsaWQgcGxhY2VtZW50IGZsYWdzLgogICogLUVSRVNUQVJUU1lTOiBJbnRlcnJ1cHRlZCBieSBzaWduYWwgd2hpbGUgd2FpdGluZyBmb3IgcmVzb3VyY2VzLgogICovCiAKLWV4dGVybiBpbnQgdHRtX2J1ZmZlcl9vYmplY3RfY3JlYXRlKHN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2LAotCQkJCSAgICB1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkJICAgIGVudW0gdHRtX2JvX3R5cGUgdHlwZSwKLQkJCQkgICAgdWludDMyX3QgZmxhZ3MsCi0JCQkJICAgIHVpbnQzMl90IHBhZ2VfYWxpZ25tZW50LAotCQkJCSAgICB1bnNpZ25lZCBsb25nIGJ1ZmZlcl9zdGFydCwKLQkJCQkgICAgYm9vbCBpbnRlcnJ1cHRpYmxlLAotCQkJCSAgICBzdHJ1Y3QgZmlsZSAqcGVyc2lzdGFudF9zd2FwX3N0b3JhZ2UsCi0JCQkJICAgIHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqKnBfYm8pOworZXh0ZXJuIGludCB0dG1fYm9fY3JlYXRlKHN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2LAorCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQllbnVtIHR0bV9ib190eXBlIHR5cGUsCisJCQkJc3RydWN0IHR0bV9wbGFjZW1lbnQgKnBsYWNlbWVudCwKKwkJCQl1aW50MzJfdCBwYWdlX2FsaWdubWVudCwKKwkJCQl1bnNpZ25lZCBsb25nIGJ1ZmZlcl9zdGFydCwKKwkJCQlib29sIGludGVycnVwdGlibGUsCisJCQkJc3RydWN0IGZpbGUgKnBlcnNpc3RhbnRfc3dhcF9zdG9yYWdlLAorCQkJCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqKnBfYm8pOwogCiAvKioKICAqIHR0bV9ib19jaGVja19wbGFjZW1lbnQKICAqCi0gKiBAYm86IHRoZSBidWZmZXIgb2JqZWN0LgotICogQHNldF9mbGFnczogcGxhY2VtZW50IGZsYWdzIHRvIHNldC4KLSAqIEBjbHJfZmxhZ3M6IHBsYWNlbWVudCBmbGFncyB0byBjbGVhci4KKyAqIEBibzoJCXRoZSBidWZmZXIgb2JqZWN0LgorICogQHBsYWNlbWVudDoJcGxhY2VtZW50cwogICoKICAqIFBlcmZvcm1zIG1pbmltYWwgdmFsaWRpdHkgY2hlY2tpbmcgb24gYW4gaW50ZW5kZWQgY2hhbmdlIG9mCiAgKiBwbGFjZW1lbnQgZmxhZ3MuCiAgKiBSZXR1cm5zCiAgKiAtRUlOVkFMOiBJbnRlbmRlZCBjaGFuZ2UgaXMgaW52YWxpZCBvciBub3QgYWxsb3dlZC4KICAqLwotCiBleHRlcm4gaW50IHR0bV9ib19jaGVja19wbGFjZW1lbnQoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywKLQkJCQkgIHVpbnQzMl90IHNldF9mbGFncywgdWludDMyX3QgY2xyX2ZsYWdzKTsKKwkJCQkJc3RydWN0IHR0bV9wbGFjZW1lbnQgKnBsYWNlbWVudCk7CiAKIC8qKgogICogdHRtX2JvX2luaXRfbW0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvS2J1aWxkIGIvaW5jbHVkZS9saW51eC9LYnVpbGQKaW5kZXggNWE1Mzg1Ny4uZjcyOTE0ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9LYnVpbGQKKysrIGIvaW5jbHVkZS9saW51eC9LYnVpbGQKQEAgLTIxNCw3ICsyMTQsNiBAQAogdW5pZmRlZi15ICs9IGZzLmgKIHVuaWZkZWYteSArPSBnYW1lcG9ydC5oCiB1bmlmZGVmLXkgKz0gZ2VuZXJpY19zZXJpYWwuaAotdW5pZmRlZi15ICs9IGhheWVzZXNwLmgKIHVuaWZkZWYteSArPSBoZGxjZHJ2LmgKIHVuaWZkZWYteSArPSBoZGxjLmgKIHVuaWZkZWYteSArPSBoZHJlZy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NwdS5oIGIvaW5jbHVkZS9saW51eC9jcHUuaAppbmRleCA0NzUzNjE5Li5lMjg3ODYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NwdS5oCisrKyBiL2luY2x1ZGUvbGludXgvY3B1LmgKQEAgLTQzLDYgKzQzLDggQEAKIAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogZXh0ZXJuIHZvaWQgdW5yZWdpc3Rlcl9jcHUoc3RydWN0IGNwdSAqY3B1KTsKK2V4dGVybiBzc2l6ZV90IGFyY2hfY3B1X3Byb2JlKGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKK2V4dGVybiBzc2l6ZV90IGFyY2hfY3B1X3JlbGVhc2UoY29uc3QgY2hhciAqLCBzaXplX3QpOwogI2VuZGlmCiBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2s7CiAKQEAgLTExNSw2ICsxMTcsMTkgQEAKICNkZWZpbmUgdW5yZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIobmIpCXVucmVnaXN0ZXJfY3B1X25vdGlmaWVyKG5iKQogaW50IGNwdV9kb3duKHVuc2lnbmVkIGludCBjcHUpOwogCisjaWZkZWYgQ09ORklHX0FSQ0hfQ1BVX1BST0JFX1JFTEVBU0UKK2V4dGVybiB2b2lkIGNwdV9ob3RwbHVnX2RyaXZlcl9sb2NrKHZvaWQpOworZXh0ZXJuIHZvaWQgY3B1X2hvdHBsdWdfZHJpdmVyX3VubG9jayh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1X2hvdHBsdWdfZHJpdmVyX2xvY2sodm9pZCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNwdV9ob3RwbHVnX2RyaXZlcl91bmxvY2sodm9pZCkKK3sKK30KKyNlbmRpZgorCiAjZWxzZQkJLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCiAKICNkZWZpbmUgZ2V0X29ubGluZV9jcHVzKCkJZG8geyB9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHVmcmVxLmggYi9pbmNsdWRlL2xpbnV4L2NwdWZyZXEuaAppbmRleCA3OWEyMzQwLi40ZGUwMmIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NwdWZyZXEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdWZyZXEuaApAQCAtMjMyLDYgKzIzMiw3IEBACiAJLyogb3B0aW9uYWwgKi8KIAl1bnNpZ25lZCBpbnQgKCpnZXRhdmcpCShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKIAkJCQkgdW5zaWduZWQgaW50IGNwdSk7CisJaW50CSgqYmlvc19saW1pdCkJKGludCBjcHUsIHVuc2lnbmVkIGludCAqbGltaXQpOwogCiAJaW50CSgqZXhpdCkJCShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSk7CiAJaW50CSgqc3VzcGVuZCkJKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LCBwbV9tZXNzYWdlX3QgcG1zZyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NwdW1hc2suaCBiL2luY2x1ZGUvbGludXgvY3B1bWFzay5oCmluZGV4IDc4OWNmNWYuLmQ3N2I1NDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3B1bWFzay5oCisrKyBiL2luY2x1ZGUvbGludXgvY3B1bWFzay5oCkBAIC04NCw2ICs4NCw3IEBACiAjZGVmaW5lIG51bV9vbmxpbmVfY3B1cygpCWNwdW1hc2tfd2VpZ2h0KGNwdV9vbmxpbmVfbWFzaykKICNkZWZpbmUgbnVtX3Bvc3NpYmxlX2NwdXMoKQljcHVtYXNrX3dlaWdodChjcHVfcG9zc2libGVfbWFzaykKICNkZWZpbmUgbnVtX3ByZXNlbnRfY3B1cygpCWNwdW1hc2tfd2VpZ2h0KGNwdV9wcmVzZW50X21hc2spCisjZGVmaW5lIG51bV9hY3RpdmVfY3B1cygpCWNwdW1hc2tfd2VpZ2h0KGNwdV9hY3RpdmVfbWFzaykKICNkZWZpbmUgY3B1X29ubGluZShjcHUpCQljcHVtYXNrX3Rlc3RfY3B1KChjcHUpLCBjcHVfb25saW5lX21hc2spCiAjZGVmaW5lIGNwdV9wb3NzaWJsZShjcHUpCWNwdW1hc2tfdGVzdF9jcHUoKGNwdSksIGNwdV9wb3NzaWJsZV9tYXNrKQogI2RlZmluZSBjcHVfcHJlc2VudChjcHUpCWNwdW1hc2tfdGVzdF9jcHUoKGNwdSksIGNwdV9wcmVzZW50X21hc2spCkBAIC05Miw2ICs5Myw3IEBACiAjZGVmaW5lIG51bV9vbmxpbmVfY3B1cygpCTEKICNkZWZpbmUgbnVtX3Bvc3NpYmxlX2NwdXMoKQkxCiAjZGVmaW5lIG51bV9wcmVzZW50X2NwdXMoKQkxCisjZGVmaW5lIG51bV9hY3RpdmVfY3B1cygpCTEKICNkZWZpbmUgY3B1X29ubGluZShjcHUpCQkoKGNwdSkgPT0gMCkKICNkZWZpbmUgY3B1X3Bvc3NpYmxlKGNwdSkJKChjcHUpID09IDApCiAjZGVmaW5lIGNwdV9wcmVzZW50KGNwdSkJKChjcHUpID09IDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaAppbmRleCAyZWEzZTQ5Li4yYTczZDliIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKQEAgLTU1OCw3ICs1NTgsNyBAQAogI2lmZGVmIENPTkZJR19ERVZUTVBGUwogZXh0ZXJuIGludCBkZXZ0bXBmc19jcmVhdGVfbm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCBkZXZ0bXBmc19kZWxldGVfbm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotZXh0ZXJuIGludCBkZXZ0bXBmc19tb3VudChjb25zdCBjaGFyICptb3VudHBvaW50KTsKK2V4dGVybiBpbnQgZGV2dG1wZnNfbW91bnQoY29uc3QgY2hhciAqbW50ZGlyKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBkZXZ0bXBmc19jcmVhdGVfbm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYpIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgaW50IGRldnRtcGZzX2RlbGV0ZV9ub2RlKHN0cnVjdCBkZXZpY2UgKmRldikgeyByZXR1cm4gMDsgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9leHQyX2ZzLmggYi9pbmNsdWRlL2xpbnV4L2V4dDJfZnMuaAppbmRleCAxMjE3MjBkLi4yZGZhNzA3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V4dDJfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2V4dDJfZnMuaApAQCAtNTY1LDE0ICs1NjUsMTQgQEAKICAqIG90aGVyIGJpdHMgYXJlIHJlc2VydmVkIGZvciBub3cuCiAgKi8KIGVudW0gewotCUVYVDJfRlRfVU5LTk9XTiwKLQlFWFQyX0ZUX1JFR19GSUxFLAotCUVYVDJfRlRfRElSLAotCUVYVDJfRlRfQ0hSREVWLAotCUVYVDJfRlRfQkxLREVWLAotCUVYVDJfRlRfRklGTywKLQlFWFQyX0ZUX1NPQ0ssCi0JRVhUMl9GVF9TWU1MSU5LLAorCUVYVDJfRlRfVU5LTk9XTgkJPSAwLAorCUVYVDJfRlRfUkVHX0ZJTEUJPSAxLAorCUVYVDJfRlRfRElSCQk9IDIsCisJRVhUMl9GVF9DSFJERVYJCT0gMywKKwlFWFQyX0ZUX0JMS0RFVgkJPSA0LAorCUVYVDJfRlRfRklGTwkJPSA1LAorCUVYVDJfRlRfU09DSwkJPSA2LAorCUVYVDJfRlRfU1lNTElOSwkJPSA3LAogCUVYVDJfRlRfTUFYCiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaCBiL2luY2x1ZGUvbGludXgvZXh0M19mcy5oCmluZGV4IDc0OTliMzYuLjZiMDQ5MDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXh0M19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0M19mcy5oCkBAIC05MTgsNiArOTE4LDggQEAKIAlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CiBleHRlcm4gdm9pZCBleHQzX3dhcm5pbmcgKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKQogCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKK2V4dGVybiB2b2lkIGV4dDNfbXNnKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKQorCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKIGV4dGVybiB2b2lkIGV4dDNfdXBkYXRlX2R5bmFtaWNfcmV2IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIAogI2RlZmluZSBleHQzX3N0ZF9lcnJvcihzYiwgZXJybm8pCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZmlybXdhcmUuaCBiL2luY2x1ZGUvbGludXgvZmlybXdhcmUuaAppbmRleCBkMzE1NDQ2Li4wNDM4MTFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Zpcm13YXJlLmgKKysrIGIvaW5jbHVkZS9saW51eC9maXJtd2FyZS5oCkBAIC00LDYgKzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KIAogI2RlZmluZSBGV19BQ1RJT05fTk9IT1RQTFVHIDAKICNkZWZpbmUgRldfQUNUSU9OX0hPVFBMVUcgMQpAQCAtMzgsNyArMzksNyBAQAogCQkgICAgIHN0cnVjdCBkZXZpY2UgKmRldmljZSk7CiBpbnQgcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQoCiAJc3RydWN0IG1vZHVsZSAqbW9kdWxlLCBpbnQgdWV2ZW50LAotCWNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZXZpY2UgKmRldmljZSwgdm9pZCAqY29udGV4dCwKKwljb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsIGdmcF90IGdmcCwgdm9pZCAqY29udGV4dCwKIAl2b2lkICgqY29udCkoY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywgdm9pZCAqY29udGV4dCkpOwogCiB2b2lkIHJlbGVhc2VfZmlybXdhcmUoY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdyk7CkBAIC01MSw3ICs1Miw3IEBACiB9CiBzdGF0aWMgaW5saW5lIGludCByZXF1ZXN0X2Zpcm13YXJlX25vd2FpdCgKIAlzdHJ1Y3QgbW9kdWxlICptb2R1bGUsIGludCB1ZXZlbnQsCi0JY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGRldmljZSAqZGV2aWNlLCB2b2lkICpjb250ZXh0LAorCWNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZXZpY2UgKmRldmljZSwgZ2ZwX3QgZ2ZwLCB2b2lkICpjb250ZXh0LAogCXZvaWQgKCpjb250KShjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3LCB2b2lkICpjb250ZXh0KSkKIHsKIAlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnMuaCBiL2luY2x1ZGUvbGludXgvZnMuaAppbmRleCA4OTFmN2Q2Li5hMDU3ZjQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9mcy5oCkBAIC0yMDkxLDggKzIwOTEsNiBAQAogZXh0ZXJuIGludCBmaWxlbWFwX3dyaXRlX2FuZF93YWl0KHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nKTsKIGV4dGVybiBpbnQgZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKIAkJCQkgICAgICAgIGxvZmZfdCBsc3RhcnQsIGxvZmZfdCBsZW5kKTsKLWV4dGVybiBpbnQgd2FpdF9vbl9wYWdlX3dyaXRlYmFja19yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKLQkJCQlwZ29mZl90IHN0YXJ0LCBwZ29mZl90IGVuZCk7CiBleHRlcm4gaW50IF9fZmlsZW1hcF9mZGF0YXdyaXRlX3JhbmdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAogCQkJCWxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCwgaW50IHN5bmNfbW9kZSk7CiBleHRlcm4gaW50IGZpbGVtYXBfZmRhdGF3cml0ZV9yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnNsX2RldmljZXMuaCBiL2luY2x1ZGUvbGludXgvZnNsX2RldmljZXMuaAppbmRleCA0M2ZjOTVkLi4yOGUzM2ZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzbF9kZXZpY2VzLmgKKysrIGIvaW5jbHVkZS9saW51eC9mc2xfZGV2aWNlcy5oCkBAIC03NCw3ICs3NCwxMiBAQAogc3RydWN0IGZzbF9zcGlfcGxhdGZvcm1fZGF0YSB7CiAJdTMyIAlpbml0aWFsX3NwbW9kZTsJLyogaW5pdGlhbCBTUE1PREUgdmFsdWUgKi8KIAlzMTYJYnVzX251bTsKLQlib29sCXFlX21vZGU7CisJdW5zaWduZWQgaW50IGZsYWdzOworI2RlZmluZSBTUElfUUVfQ1BVX01PREUJCSgxIDw8IDApIC8qIFFFIENQVSAoIlBJTyIpIG1vZGUgKi8KKyNkZWZpbmUgU1BJX0NQTV9NT0RFCQkoMSA8PCAxKSAvKiBDUE0vUUUgKCJETUEiKSBtb2RlICovCisjZGVmaW5lIFNQSV9DUE0xCQkoMSA8PCAyKSAvKiBTUEkgdW5pdCBpcyBpbiBDUE0xIGJsb2NrICovCisjZGVmaW5lIFNQSV9DUE0yCQkoMSA8PCAzKSAvKiBTUEkgdW5pdCBpcyBpbiBDUE0yIGJsb2NrICovCisjZGVmaW5lIFNQSV9RRQkJCSgxIDw8IDQpIC8qIFNQSSB1bml0IGlzIGluIFFFIGJsb2NrICovCiAJLyogYm9hcmQgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KIAl1MTYJbWF4X2NoaXBzZWxlY3Q7CiAJdm9pZAkoKmNzX2NvbnRyb2wpKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGJvb2wgb24pOwpAQCAtOTAsNiArOTUsMTAgQEAKICAqIGxlYWQgdG8gYSBkZWVwIHNsZWVwIChpLmUuIHBvd2VyIHJlbW92ZWQgZnJvbSB0aGUgY29yZSwKICAqIGluc3RlYWQgb2YganVzdCB0aGUgY2xvY2spLgogICovCisjaWYgZGVmaW5lZChDT05GSUdfUFBDXzgzeHgpICYmIGRlZmluZWQoQ09ORklHX1NVU1BFTkQpCiBpbnQgZnNsX2RlZXBfc2xlZXAodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgZnNsX2RlZXBfc2xlZXAodm9pZCkgeyByZXR1cm4gMDsgfQorI2VuZGlmCiAKICNlbmRpZiAvKiBfRlNMX0RFVklDRV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mdHJhY2VfZXZlbnQuaCBiL2luY2x1ZGUvbGludXgvZnRyYWNlX2V2ZW50LmgKaW5kZXggNDdiYmRmOS4uMzhmOGQ2NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mdHJhY2VfZXZlbnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Z0cmFjZV9ldmVudC5oCkBAIC01Nyw2ICs1Nyw3IEBACiAJLyogVGhlIGJlbG93IGlzIHplcm9lZCBvdXQgaW4gcGlwZV9yZWFkICovCiAJc3RydWN0IHRyYWNlX3NlcQlzZXE7CiAJc3RydWN0IHRyYWNlX2VudHJ5CSplbnQ7CisJaW50CQkJbGVmdG92ZXI7CiAJaW50CQkJY3B1OwogCXU2NAkJCXRzOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dpZ2FzZXRfZGV2LmggYi9pbmNsdWRlL2xpbnV4L2dpZ2FzZXRfZGV2LmgKaW5kZXggNWRjNGEzMS4uMjU4YmE4MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9naWdhc2V0X2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvZ2lnYXNldF9kZXYuaApAQCAtMTYsMTUgKzE2LDIzIEBACiAKICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgogCisvKiBUaGUgbWFnaWMgSU9DVEwgdmFsdWUgZm9yIHRoaXMgaW50ZXJmYWNlLiAqLwogI2RlZmluZSBHSUdBU0VUX0lPQ1RMIDB4NDcKIAotI2RlZmluZSBHSUdWRVJfRFJJVkVSIDAKLSNkZWZpbmUgR0lHVkVSX0NPTVBBVCAxCi0jZGVmaW5lIEdJR1ZFUl9GV0JBU0UgMgorLyogZW5hYmxlL2Rpc2FibGUgZGV2aWNlIGNvbnRyb2wgdmlhIGNoYXJhY3RlciBkZXZpY2UgKGxvY2sgb3V0IElTRE4gc3Vic3lzKSAqLworI2RlZmluZSBHSUdBU0VUX1JFRElSICAgIF9JT1dSKEdJR0FTRVRfSU9DVEwsIDAsIGludCkKIAotI2RlZmluZSBHSUdBU0VUX1JFRElSICAgIF9JT1dSIChHSUdBU0VUX0lPQ1RMLCAwLCBpbnQpCi0jZGVmaW5lIEdJR0FTRVRfQ09ORklHICAgX0lPV1IgKEdJR0FTRVRfSU9DVEwsIDEsIGludCkKLSNkZWZpbmUgR0lHQVNFVF9CUktDSEFSUyBfSU9XICAoR0lHQVNFVF9JT0NUTCwgMiwgdW5zaWduZWQgY2hhcls2XSkgLy9GSVhNRSBbNl0gb2theT8KLSNkZWZpbmUgR0lHQVNFVF9WRVJTSU9OICBfSU9XUiAoR0lHQVNFVF9JT0NUTCwgMywgdW5zaWduZWRbNF0pCisvKiBlbmFibGUgYWRhcHRlciBjb25maWd1cmF0aW9uIG1vZGUgKE0xMHggb25seSkgKi8KKyNkZWZpbmUgR0lHQVNFVF9DT05GSUcgICBfSU9XUihHSUdBU0VUX0lPQ1RMLCAxLCBpbnQpCisKKy8qIHNldCBicmVhayBjaGFyYWN0ZXJzIChNMTA1IG9ubHkpICovCisjZGVmaW5lIEdJR0FTRVRfQlJLQ0hBUlMgX0lPVyhHSUdBU0VUX0lPQ1RMLCAyLCB1bnNpZ25lZCBjaGFyWzZdKQorCisvKiBnZXQgdmVyc2lvbiBpbmZvcm1hdGlvbiBzZWxlY3RlZCBieSBhcmdbMF0gKi8KKyNkZWZpbmUgR0lHQVNFVF9WRVJTSU9OICBfSU9XUihHSUdBU0VUX0lPQ1RMLCAzLCB1bnNpZ25lZFs0XSkKKy8qIHZhbHVlcyBmb3IgR0lHQVNFVF9WRVJTSU9OIGFyZ1swXSAqLworI2RlZmluZSBHSUdWRVJfRFJJVkVSIDAJCS8qIGdldCBkcml2ZXIgdmVyc2lvbiAqLworI2RlZmluZSBHSUdWRVJfQ09NUEFUIDEJCS8qIGdldCBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB2ZXJzaW9uICovCisjZGVmaW5lIEdJR1ZFUl9GV0JBU0UgMgkJLyogZ2V0IGJhc2Ugc3RhdGlvbiBmaXJtd2FyZSB2ZXJzaW9uICovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oYXllc2VzcC5oIGIvaW5jbHVkZS9saW51eC9oYXllc2VzcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmIwOGNmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvaGF5ZXNlc3AuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0jaWZuZGVmIEhBWUVTRVNQX0gKLSNkZWZpbmUgSEFZRVNFU1BfSAotCi1zdHJ1Y3QgaGF5ZXNfZXNwX2NvbmZpZyB7Ci0Jc2hvcnQgZmxvd19vbjsKLQlzaG9ydCBmbG93X29mZjsKLQlzaG9ydCByeF90cmlnZ2VyOwotCXNob3J0IHR4X3RyaWdnZXI7Ci0Jc2hvcnQgcGlvX3RocmVzaG9sZDsKLQl1bnNpZ25lZCBjaGFyIHJ4X3RpbWVvdXQ7Ci0JY2hhciBkbWFfY2hhbm5lbDsKLX07Ci0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNkZWZpbmUgRVNQX0RNQV9DSEFOTkVMICAgMAotI2RlZmluZSBFU1BfUlhfVFJJR0dFUiAgICA3NjgKLSNkZWZpbmUgRVNQX1RYX1RSSUdHRVIgICAgNzY4Ci0jZGVmaW5lIEVTUF9GTE9XX09GRiAgICAgIDEwMTYKLSNkZWZpbmUgRVNQX0ZMT1dfT04gICAgICAgOTQ0Ci0jZGVmaW5lIEVTUF9SWF9UTU9VVCAgICAgIDEyOAotI2RlZmluZSBFU1BfUElPX1RIUkVTSE9MRCAzMgotCi0jZGVmaW5lIEVTUF9JTl9NQUpPUgk1NwkvKiBtYWpvciBkZXYgIyBmb3IgZGlhbCBpbiAqLwotI2RlZmluZSBFU1BfT1VUX01BSk9SCTU4CS8qIG1ham9yIGRldiAjIGZvciBkaWFsIG91dCAqLwotI2RlZmluZSBFU1BDX1NDQUxFIAkzCi0jZGVmaW5lIFVBUlRfRVNJX0JBU0UJMHgwMAotI2RlZmluZSBVQVJUX0VTSV9TSUQJMHgwMQotI2RlZmluZSBVQVJUX0VTSV9SWAkweDAyCi0jZGVmaW5lIFVBUlRfRVNJX1RYCTB4MDIKLSNkZWZpbmUgVUFSVF9FU0lfQ01EMQkweDA0Ci0jZGVmaW5lIFVBUlRfRVNJX0NNRDIJMHgwNQotI2RlZmluZSBVQVJUX0VTSV9TVEFUMQkweDA0Ci0jZGVmaW5lIFVBUlRfRVNJX1NUQVQyCTB4MDUKLSNkZWZpbmUgVUFSVF9FU0lfUldTCTB4MDcKLQotI2RlZmluZSBVQVJUX0lFUl9ETUFfVE1PVVQJMHg4MAotI2RlZmluZSBVQVJUX0lFUl9ETUFfVEMJCTB4MDgKLQotI2RlZmluZSBFU0lfU0VUX0lSUQkJMHgwNAotI2RlZmluZSBFU0lfU0VUX0RNQV9UTU9VVAkweDA1Ci0jZGVmaW5lIEVTSV9TRVRfU1JWX01BU0sJMHgwNgotI2RlZmluZSBFU0lfU0VUX0VSUl9NQVNLCTB4MDcKLSNkZWZpbmUgRVNJX1NFVF9GTE9XX0NOVEwJMHgwOAotI2RlZmluZSBFU0lfU0VUX0ZMT1dfQ0hBUlMJMHgwOQotI2RlZmluZSBFU0lfU0VUX0ZMT1dfTFZMCTB4MGEKLSNkZWZpbmUgRVNJX1NFVF9UUklHR0VSCQkweDBiCi0jZGVmaW5lIEVTSV9TRVRfUlhfVElNRU9VVAkweDBjCi0jZGVmaW5lIEVTSV9TRVRfRkxPV19UTU9VVAkweDBkCi0jZGVmaW5lIEVTSV9XUklURV9VQVJUCQkweDBlCi0jZGVmaW5lIEVTSV9SRUFEX1VBUlQJCTB4MGYKLSNkZWZpbmUgRVNJX1NFVF9NT0RFCQkweDEwCi0jZGVmaW5lIEVTSV9HRVRfRVJSX1NUQVQJMHgxMgotI2RlZmluZSBFU0lfR0VUX1VBUlRfU1RBVAkweDEzCi0jZGVmaW5lIEVTSV9HRVRfUlhfQVZBSUwJMHgxNAotI2RlZmluZSBFU0lfR0VUX1RYX0FWQUlMCTB4MTUKLSNkZWZpbmUgRVNJX1NUQVJUX0RNQV9SWAkweDE2Ci0jZGVmaW5lIEVTSV9TVEFSVF9ETUFfVFgJMHgxNwotI2RlZmluZSBFU0lfSVNTVUVfQlJFQUsJCTB4MWEKLSNkZWZpbmUgRVNJX0ZMVVNIX1JYCQkweDFiCi0jZGVmaW5lIEVTSV9GTFVTSF9UWAkJMHgxYwotI2RlZmluZSBFU0lfU0VUX0JBVUQJCTB4MWQKLSNkZWZpbmUgRVNJX1NFVF9FTkhfSVJRCQkweDFmCi0jZGVmaW5lIEVTSV9TRVRfUkVJTlRSCQkweDIwCi0jZGVmaW5lIEVTSV9TRVRfUFJFU0NBTEFSCTB4MjMKLSNkZWZpbmUgRVNJX05PX0NPTU1BTkQJCTB4ZmYKLQotI2RlZmluZSBFU1BfU1RBVF9SWF9USU1FT1VUCTB4MDEKLSNkZWZpbmUgRVNQX1NUQVRfRE1BX1JYCQkweDAyCi0jZGVmaW5lIEVTUF9TVEFUX0RNQV9UWAkJMHgwNAotI2RlZmluZSBFU1BfU1RBVF9ORVZFUl9ETUEgICAgICAweDA4Ci0jZGVmaW5lIEVTUF9TVEFUX1VTRV9QSU8gICAgICAgIDB4MTAKLQotI2RlZmluZSBFU1BfTUFHSUMJCTB4NTNlZQotI2RlZmluZSBFU1BfWE1JVF9TSVpFCQk0MDk2Ci0KLXN0cnVjdCBlc3Bfc3RydWN0IHsKLQlpbnQJCQltYWdpYzsKLQlzdHJ1Y3QgdHR5X3BvcnQJCXBvcnQ7Ci0Jc3BpbmxvY2tfdAkJbG9jazsKLQlpbnQJCQlpb19wb3J0OwotCWludAkJCWlycTsKLQlpbnQJCQlyZWFkX3N0YXR1c19tYXNrOwotCWludAkJCWlnbm9yZV9zdGF0dXNfbWFzazsKLQlpbnQJCQl0aW1lb3V0OwotCWludAkJCXN0YXRfZmxhZ3M7Ci0JaW50CQkJY3VzdG9tX2Rpdmlzb3I7Ci0JaW50CQkJY2xvc2VfZGVsYXk7Ci0JdW5zaWduZWQgc2hvcnQJCWNsb3Npbmdfd2FpdDsKLQl1bnNpZ25lZCBzaG9ydAkJY2xvc2luZ193YWl0MjsKLQlpbnQJCQlJRVI7IAkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCi0JaW50CQkJTUNSOyAJLyogTW9kZW0gY29udHJvbCByZWdpc3RlciAqLwotCXVuc2lnbmVkIGxvbmcJCWxhc3RfYWN0aXZlOwotCWludAkJCWxpbmU7Ci0JdW5zaWduZWQgY2hhciAJCSp4bWl0X2J1ZjsKLQlpbnQJCQl4bWl0X2hlYWQ7Ci0JaW50CQkJeG1pdF90YWlsOwotCWludAkJCXhtaXRfY250OwotCXdhaXRfcXVldWVfaGVhZF90CWJyZWFrX3dhaXQ7Ci0Jc3RydWN0IGFzeW5jX2ljb3VudAlpY291bnQ7CS8qIGtlcm5lbCBjb3VudGVycyBmb3IgdGhlIDQgaW5wdXQgaW50ZXJydXB0cyAqLwotCXN0cnVjdCBoYXllc19lc3BfY29uZmlnIGNvbmZpZzsgLyogcG9ydCBjb25maWd1cmF0aW9uICovCi0Jc3RydWN0IGVzcF9zdHJ1Y3QJKm5leHRfcG9ydDsgLyogRm9yIHRoZSBsaW5rZWQgbGlzdCAqLwotfTsKLQotc3RydWN0IGVzcF9waW9fYnVmZmVyIHsKLQl1bnNpZ25lZCBjaGFyIGRhdGFbMTAyNF07Ci0Jc3RydWN0IGVzcF9waW9fYnVmZmVyICpuZXh0OwotfTsKLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotCi0jZW5kaWYgLyogRVNQX0ggKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ocnRpbWVyLmggYi9pbmNsdWRlL2xpbnV4L2hydGltZXIuaAppbmRleCA5YmFjZTRiLi5hZjYzNGU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2hydGltZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2hydGltZXIuaApAQCAtMTYyLDEwICsxNjIsMTEgQEAKICAqIEBleHBpcmVzX25leHQ6CWFic29sdXRlIHRpbWUgb2YgdGhlIG5leHQgZXZlbnQgd2hpY2ggd2FzIHNjaGVkdWxlZAogICoJCQl2aWEgY2xvY2tfc2V0X25leHRfZXZlbnQoKQogICogQGhyZXNfYWN0aXZlOglTdGF0ZSBvZiBoaWdoIHJlc29sdXRpb24gbW9kZQotICogQGNoZWNrX2Nsb2NrczoJSW5kaWN0YXRvciwgd2hlbiBzZXQgZXZhbHVhdGUgdGltZSBzb3VyY2UgYW5kIGNsb2NrCi0gKgkJCWV2ZW50IGRldmljZXMgd2hldGhlciBoaWdoIHJlc29sdXRpb24gbW9kZSBjYW4gYmUKLSAqCQkJYWN0aXZhdGVkLgotICogQG5yX2V2ZW50czoJCVRvdGFsIG51bWJlciBvZiB0aW1lciBpbnRlcnJ1cHQgZXZlbnRzCisgKiBAaGFuZ19kZXRlY3RlZDoJVGhlIGxhc3QgaHJ0aW1lciBpbnRlcnJ1cHQgZGV0ZWN0ZWQgYSBoYW5nCisgKiBAbnJfZXZlbnRzOgkJVG90YWwgbnVtYmVyIG9mIGhydGltZXIgaW50ZXJydXB0IGV2ZW50cworICogQG5yX3JldHJpZXM6CQlUb3RhbCBudW1iZXIgb2YgaHJ0aW1lciBpbnRlcnJ1cHQgcmV0cmllcworICogQG5yX2hhbmdzOgkJVG90YWwgbnVtYmVyIG9mIGhydGltZXIgaW50ZXJydXB0IGhhbmdzCisgKiBAbWF4X2hhbmdfdGltZToJTWF4aW11bSB0aW1lIHNwZW50IGluIGhydGltZXJfaW50ZXJydXB0CiAgKi8KIHN0cnVjdCBocnRpbWVyX2NwdV9iYXNlIHsKIAlzcGlubG9ja190CQkJbG9jazsKQEAgLTE3Myw3ICsxNzQsMTEgQEAKICNpZmRlZiBDT05GSUdfSElHSF9SRVNfVElNRVJTCiAJa3RpbWVfdAkJCQlleHBpcmVzX25leHQ7CiAJaW50CQkJCWhyZXNfYWN0aXZlOworCWludAkJCQloYW5nX2RldGVjdGVkOwogCXVuc2lnbmVkIGxvbmcJCQlucl9ldmVudHM7CisJdW5zaWduZWQgbG9uZwkJCW5yX3JldHJpZXM7CisJdW5zaWduZWQgbG9uZwkJCW5yX2hhbmdzOworCWt0aW1lX3QJCQkJbWF4X2hhbmdfdGltZTsKICNlbmRpZgogfTsKIApAQCAtNDM1LDQ3ICs0NDAsNCBAQAogLyogU2hvdyBwZW5kaW5nIHRpbWVyczogKi8KIGV4dGVybiB2b2lkIHN5c3JxX3RpbWVyX2xpc3Rfc2hvdyh2b2lkKTsKIAotLyoKLSAqIFRpbWVyLXN0YXRpc3RpY3MgaW5mbzoKLSAqLwotI2lmZGVmIENPTkZJR19USU1FUl9TVEFUUwotCi1leHRlcm4gdm9pZCB0aW1lcl9zdGF0c191cGRhdGVfc3RhdHModm9pZCAqdGltZXIsIHBpZF90IHBpZCwgdm9pZCAqc3RhcnRmLAotCQkJCSAgICAgdm9pZCAqdGltZXJmLCBjaGFyICpjb21tLAotCQkJCSAgICAgdW5zaWduZWQgaW50IHRpbWVyX2ZsYWcpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfYWNjb3VudF9ocnRpbWVyKHN0cnVjdCBocnRpbWVyICp0aW1lcikKLXsKLQlpZiAobGlrZWx5KCF0aW1lcl9zdGF0c19hY3RpdmUpKQotCQlyZXR1cm47Ci0JdGltZXJfc3RhdHNfdXBkYXRlX3N0YXRzKHRpbWVyLCB0aW1lci0+c3RhcnRfcGlkLCB0aW1lci0+c3RhcnRfc2l0ZSwKLQkJCQkgdGltZXItPmZ1bmN0aW9uLCB0aW1lci0+c3RhcnRfY29tbSwgMCk7Ci19Ci0KLWV4dGVybiB2b2lkIF9fdGltZXJfc3RhdHNfaHJ0aW1lcl9zZXRfc3RhcnRfaW5mbyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsCi0JCQkJCQkgdm9pZCAqYWRkcik7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0aW1lcl9zdGF0c19ocnRpbWVyX3NldF9zdGFydF9pbmZvKHN0cnVjdCBocnRpbWVyICp0aW1lcikKLXsKLQlfX3RpbWVyX3N0YXRzX2hydGltZXJfc2V0X3N0YXJ0X2luZm8odGltZXIsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0aW1lcl9zdGF0c19ocnRpbWVyX2NsZWFyX3N0YXJ0X2luZm8oc3RydWN0IGhydGltZXIgKnRpbWVyKQotewotCXRpbWVyLT5zdGFydF9zaXRlID0gTlVMTDsKLX0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfYWNjb3VudF9ocnRpbWVyKHN0cnVjdCBocnRpbWVyICp0aW1lcikKLXsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX3N0YXRzX2hydGltZXJfc2V0X3N0YXJ0X2luZm8oc3RydWN0IGhydGltZXIgKnRpbWVyKQotewotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfaHJ0aW1lcl9jbGVhcl9zdGFydF9pbmZvKHN0cnVjdCBocnRpbWVyICp0aW1lcikKLXsKLX0KLSNlbmRpZgotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHdfYnJlYWtwb2ludC5oIGIvaW5jbHVkZS9saW51eC9od19icmVha3BvaW50LmgKaW5kZXggYTAzZGFlZC4uNDEyMzVjOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9od19icmVha3BvaW50LmgKKysrIGIvaW5jbHVkZS9saW51eC9od19icmVha3BvaW50LmgKQEAgLTIwLDE5ICsyMCwxOCBAQAogCiAjaWZkZWYgQ09ORklHX0hBVkVfSFdfQlJFQUtQT0lOVAogCi0vKiBBcyBpdCdzIGZvciBpbi1rZXJuZWwgb3IgcHRyYWNlIHVzZSwgd2Ugd2FudCBpdCB0byBiZSBwaW5uZWQgKi8KLSNkZWZpbmUgREVGSU5FX0JSRUFLUE9JTlRfQVRUUihuYW1lKQlcCi1zdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIG5hbWUgPSB7CQlcCi0JLnR5cGUgPSBQRVJGX1RZUEVfQlJFQUtQT0lOVCwJXAotCS5zaXplID0gc2l6ZW9mKG5hbWUpLAkJXAotCS5waW5uZWQgPSAxLAkJCVwKLX07Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBod19icmVha3BvaW50X2luaXQoc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0cikKIHsKKwltZW1zZXQoYXR0ciwgMCwgc2l6ZW9mKCphdHRyKSk7CisKIAlhdHRyLT50eXBlID0gUEVSRl9UWVBFX0JSRUFLUE9JTlQ7CiAJYXR0ci0+c2l6ZSA9IHNpemVvZigqYXR0cik7CisJLyoKKwkgKiBBcyBpdCdzIGZvciBpbi1rZXJuZWwgb3IgcHRyYWNlIHVzZSwgd2Ugd2FudCBpdCB0byBiZSBwaW5uZWQKKwkgKiBhbmQgdG8gY2FsbCBpdHMgY2FsbGJhY2sgZXZlcnkgaGl0cy4KKwkgKi8KIAlhdHRyLT5waW5uZWQgPSAxOworCWF0dHItPnNhbXBsZV9wZXJpb2QgPSAxOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaHdfYnJlYWtwb2ludF9hZGRyKHN0cnVjdCBwZXJmX2V2ZW50ICpicCkKQEAgLTUyLDI3ICs1MSwyNCBAQAogCiBleHRlcm4gc3RydWN0IHBlcmZfZXZlbnQgKgogcmVnaXN0ZXJfdXNlcl9od19icmVha3BvaW50KHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIsCi0JCQkgICAgcGVyZl9jYWxsYmFja190IHRyaWdnZXJlZCwKKwkJCSAgICBwZXJmX292ZXJmbG93X2hhbmRsZXJfdCB0cmlnZ2VyZWQsCiAJCQkgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOwogCiAvKiBGSVhNRTogb25seSBjaGFuZ2UgZnJvbSB0aGUgYXR0ciwgYW5kIGRvbid0IHVucmVnaXN0ZXIgKi8KLWV4dGVybiBzdHJ1Y3QgcGVyZl9ldmVudCAqCi1tb2RpZnlfdXNlcl9od19icmVha3BvaW50KHN0cnVjdCBwZXJmX2V2ZW50ICpicCwKLQkJCSAgc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciwKLQkJCSAgcGVyZl9jYWxsYmFja190IHRyaWdnZXJlZCwKLQkJCSAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOworZXh0ZXJuIGludAorbW9kaWZ5X3VzZXJfaHdfYnJlYWtwb2ludChzdHJ1Y3QgcGVyZl9ldmVudCAqYnAsIHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIpOwogCiAvKgogICogS2VybmVsIGJyZWFrcG9pbnRzIGFyZSBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSBwYXJ0aWN1bGFyIHRocmVhZC4KICAqLwogZXh0ZXJuIHN0cnVjdCBwZXJmX2V2ZW50ICoKIHJlZ2lzdGVyX3dpZGVfaHdfYnJlYWtwb2ludF9jcHUoc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciwKLQkJCQlwZXJmX2NhbGxiYWNrX3QgdHJpZ2dlcmVkLAorCQkJCXBlcmZfb3ZlcmZsb3dfaGFuZGxlcl90CXRyaWdnZXJlZCwKIAkJCQlpbnQgY3B1KTsKIAogZXh0ZXJuIHN0cnVjdCBwZXJmX2V2ZW50ICoqCiByZWdpc3Rlcl93aWRlX2h3X2JyZWFrcG9pbnQoc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciwKLQkJCSAgICBwZXJmX2NhbGxiYWNrX3QgdHJpZ2dlcmVkKTsKKwkJCSAgICBwZXJmX292ZXJmbG93X2hhbmRsZXJfdCB0cmlnZ2VyZWQpOwogCiBleHRlcm4gaW50IHJlZ2lzdGVyX3BlcmZfaHdfYnJlYWtwb2ludChzdHJ1Y3QgcGVyZl9ldmVudCAqYnApOwogZXh0ZXJuIGludCBfX3JlZ2lzdGVyX3BlcmZfaHdfYnJlYWtwb2ludChzdHJ1Y3QgcGVyZl9ldmVudCAqYnApOwpAQCAtOTMsMjAgKzg5LDE4IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBlcmZfZXZlbnQgKgogcmVnaXN0ZXJfdXNlcl9od19icmVha3BvaW50KHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIsCi0JCQkgICAgcGVyZl9jYWxsYmFja190IHRyaWdnZXJlZCwKKwkJCSAgICBwZXJmX292ZXJmbG93X2hhbmRsZXJfdCB0cmlnZ2VyZWQsCiAJCQkgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCXsgcmV0dXJuIE5VTEw7IH0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHBlcmZfZXZlbnQgKgorc3RhdGljIGlubGluZSBpbnQKIG1vZGlmeV91c2VyX2h3X2JyZWFrcG9pbnQoc3RydWN0IHBlcmZfZXZlbnQgKmJwLAotCQkJICBzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyLAotCQkJICBwZXJmX2NhbGxiYWNrX3QgdHJpZ2dlcmVkLAotCQkJICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykJeyByZXR1cm4gTlVMTDsgfQorCQkJICBzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyKQl7IHJldHVybiAtRU5PU1lTOyB9CiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwZXJmX2V2ZW50ICoKIHJlZ2lzdGVyX3dpZGVfaHdfYnJlYWtwb2ludF9jcHUoc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciwKLQkJCQlwZXJmX2NhbGxiYWNrX3QgdHJpZ2dlcmVkLAorCQkJCXBlcmZfb3ZlcmZsb3dfaGFuZGxlcl90CSB0cmlnZ2VyZWQsCiAJCQkJaW50IGNwdSkJCXsgcmV0dXJuIE5VTEw7IH0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBlcmZfZXZlbnQgKioKIHJlZ2lzdGVyX3dpZGVfaHdfYnJlYWtwb2ludChzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyLAotCQkJICAgIHBlcmZfY2FsbGJhY2tfdCB0cmlnZ2VyZWQpCXsgcmV0dXJuIE5VTEw7IH0KKwkJCSAgICBwZXJmX292ZXJmbG93X2hhbmRsZXJfdCB0cmlnZ2VyZWQpCXsgcmV0dXJuIE5VTEw7IH0KIHN0YXRpYyBpbmxpbmUgaW50CiByZWdpc3Rlcl9wZXJmX2h3X2JyZWFrcG9pbnQoc3RydWN0IHBlcmZfZXZlbnQgKmJwKQl7IHJldHVybiAtRU5PU1lTOyB9CiBzdGF0aWMgaW5saW5lIGludApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pMmMvdHBzNjUwMTAuaCBiL2luY2x1ZGUvbGludXgvaTJjL3RwczY1MDEwLmgKaW5kZXggOTE4YzUzNS4uMDhhYTkyMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pMmMvdHBzNjUwMTAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2kyYy90cHM2NTAxMC5oCkBAIC03Miw2ICs3MiwyMSBAQAogI2RlZmluZQlUUFNfVkRDREMxCQkweDBjCiAjCWRlZmluZQlUUFNfRU5BQkxFX0xQCQkoMSA8PCAzKQogI2RlZmluZQlUUFNfVkRDREMyCQkweDBkCisjCWRlZmluZQlUUFNfTFBfQ09SRU9GRgkoMSA8PCA3KQorIwlkZWZpbmUgCVRQU19WQ09SRV8xXzhWCSg3PDw0KQorIwlkZWZpbmUgCVRQU19WQ09SRV8xXzVWCSg2IDw8IDQpCisjCWRlZmluZSAJVFBTX1ZDT1JFXzFfNFYJKDUgPDwgNCkKKyMJZGVmaW5lIAlUUFNfVkNPUkVfMV8zVgkoNCA8PCA0KQorIwlkZWZpbmUgCVRQU19WQ09SRV8xXzJWCSgzIDw8IDQpCisjCWRlZmluZSAJVFBTX1ZDT1JFXzFfMVYJKDIgPDwgNCkKKyMJZGVmaW5lIAlUUFNfVkNPUkVfMV8wVgkoMSA8PCA0KQorIwlkZWZpbmUgCVRQU19WQ09SRV8wXzg1VgkoMCA8PCA0KQorIwlkZWZpbmUJVFBTX1ZDT1JFX0xQXzFfMlYgKDMgPDwgMikKKyMJZGVmaW5lCVRQU19WQ09SRV9MUF8xXzFWICgyIDw8IDIpCisjCWRlZmluZQlUUFNfVkNPUkVfTFBfMV8wViAoMSA8PCAyKQorIwlkZWZpbmUJVFBTX1ZDT1JFX0xQXzBfODVWICgwIDw8IDIpCisjCWRlZmluZQlUUFNfVklCCQkoMSA8PCAxKQorIwlkZWZpbmUJVFBTX1ZDT1JFX0RJU0NICSgxIDw8IDApCiAjZGVmaW5lCVRQU19WUkVHUzEJCTB4MGUKICMJZGVmaW5lCVRQU19MRE8yX0VOQUJMRQkoMSA8PCA3KQogIwlkZWZpbmUJVFBTX0xETzJfT0ZGCSgxIDw8IDYpCkBAIC0xNTIsNiArMTY3LDEwIEBACiAgKi8KIGV4dGVybiBpbnQgdHBzNjUwMTNfc2V0X2xvd19wd3IodW5zaWduZWQgbW9kZSk7CiAKKy8qIHRwczY1MDEwX3NldF92ZGNkYzIKKyAqICB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIFZEQ0RDMgorICovCitleHRlcm4gaW50IHRwczY1MDEwX2NvbmZpZ192ZGNkYzIodW5zaWduZWQgdmFsdWUpOwogCiBzdHJ1Y3QgaTJjX2NsaWVudDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pMmMvdHdsLmggYi9pbmNsdWRlL2xpbnV4L2kyYy90d2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjFjNWJlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9pMmMvdHdsLmgKQEAgLTAsMCArMSw2NzMgQEAKKy8qCisgKiB0d2w0MDMwLmggLSBoZWFkZXIgZm9yIFRXTDQwMzAgUE0gYW5kIGF1ZGlvIENPREVDIGRldmljZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogQmFzZWQgb24gdGx2MzIwYWljMjMuYzoKKyAqIENvcHlyaWdodCAoYykgYnkgS2FpIFN2YWhuIDxrYWkuc3ZhaG5Abm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fVFdMX0hfCisjZGVmaW5lIF9fVFdMX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0L21hdHJpeF9rZXlwYWQuaD4KKworLyoKKyAqIFVzaW5nIHRoZSB0d2w0MDMwIGNvcmUgd2UgYWRkcmVzcyByZWdpc3RlcnMgdXNpbmcgYSBwYWlyCisgKgl7IG1vZHVsZSBpZCwgcmVsYXRpdmUgcmVnaXN0ZXIgb2Zmc2V0IH0KKyAqIHdoaWNoIHRoYXQgY29yZSB0aGVuIG1hcHMgdG8gdGhlIHJlbGV2YW50CisgKgl7IGkyYyBzbGF2ZSwgYWJzb2x1dGUgcmVnaXN0ZXIgYWRkcmVzcyB9CisgKgorICogVGhlIG1vZHVsZSBJRHMgYXJlIG1lYW5pbmdmdWwgb25seSB0byB0aGUgdHdsNDAzMCBjb3JlIGNvZGUsCisgKiB3aGljaCB1c2VzIHRoZW0gYXMgYXJyYXkgaW5kaWNlcyB0byBsb29rIHVwIHRoZSBmaXJzdCByZWdpc3RlcgorICogYWRkcmVzcyBlYWNoIG1vZHVsZSB1c2VzIHdpdGhpbiBhIGdpdmVuIGkyYyBzbGF2ZS4KKyAqLworCisvKiBTbGF2ZSAwIChpMmMgYWRkcmVzcyAweDQ4KSAqLworI2RlZmluZSBUV0w0MDMwX01PRFVMRV9VU0IJCTB4MDAKKworLyogU2xhdmUgMSAoaTJjIGFkZHJlc3MgMHg0OSkgKi8KKyNkZWZpbmUgVFdMNDAzMF9NT0RVTEVfQVVESU9fVk9JQ0UJMHgwMQorI2RlZmluZSBUV0w0MDMwX01PRFVMRV9HUElPCQkweDAyCisjZGVmaW5lIFRXTDQwMzBfTU9EVUxFX0lOVEJSCQkweDAzCisjZGVmaW5lIFRXTDQwMzBfTU9EVUxFX1BJSAkJMHgwNAorI2RlZmluZSBUV0w0MDMwX01PRFVMRV9URVNUCQkweDA1CisKKy8qIFNsYXZlIDIgKGkyYyBhZGRyZXNzIDB4NGEpICovCisjZGVmaW5lIFRXTDQwMzBfTU9EVUxFX0tFWVBBRAkJMHgwNgorI2RlZmluZSBUV0w0MDMwX01PRFVMRV9NQURDCQkweDA3CisjZGVmaW5lIFRXTDQwMzBfTU9EVUxFX0lOVEVSUlVQVFMJMHgwOAorI2RlZmluZSBUV0w0MDMwX01PRFVMRV9MRUQJCTB4MDkKKyNkZWZpbmUgVFdMNDAzMF9NT0RVTEVfTUFJTl9DSEFSR0UJMHgwQQorI2RlZmluZSBUV0w0MDMwX01PRFVMRV9QUkVDSEFSR0UJMHgwQgorI2RlZmluZSBUV0w0MDMwX01PRFVMRV9QV00wCQkweDBDCisjZGVmaW5lIFRXTDQwMzBfTU9EVUxFX1BXTTEJCTB4MEQKKyNkZWZpbmUgVFdMNDAzMF9NT0RVTEVfUFdNQQkJMHgwRQorI2RlZmluZSBUV0w0MDMwX01PRFVMRV9QV01CCQkweDBGCisKKyNkZWZpbmUgVFdMNTAzMV9NT0RVTEVfQUNDRVNTT1JZCTB4MTAKKyNkZWZpbmUgVFdMNTAzMV9NT0RVTEVfSU5URVJSVVBUUwkweDExCisKKy8qIFNsYXZlIDMgKGkyYyBhZGRyZXNzIDB4NGIpICovCisjZGVmaW5lIFRXTDQwMzBfTU9EVUxFX0JBQ0tVUAkJMHgxMgorI2RlZmluZSBUV0w0MDMwX01PRFVMRV9JTlQJCTB4MTMKKyNkZWZpbmUgVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSCTB4MTQKKyNkZWZpbmUgVFdMNDAzMF9NT0RVTEVfUE1fUkVDRUlWRVIJMHgxNQorI2RlZmluZSBUV0w0MDMwX01PRFVMRV9SVEMJCTB4MTYKKyNkZWZpbmUgVFdMNDAzMF9NT0RVTEVfU0VDVVJFRF9SRUcJMHgxNworCisjZGVmaW5lIFRXTF9NT0RVTEVfVVNCCQlUV0w0MDMwX01PRFVMRV9VU0IKKyNkZWZpbmUgVFdMX01PRFVMRV9BVURJT19WT0lDRQlUV0w0MDMwX01PRFVMRV9BVURJT19WT0lDRQorI2RlZmluZSBUV0xfTU9EVUxFX1BJSAkJVFdMNDAzMF9NT0RVTEVfUElICisjZGVmaW5lIFRXTF9NT0RVTEVfTUFEQwkJVFdMNDAzMF9NT0RVTEVfTUFEQworI2RlZmluZSBUV0xfTU9EVUxFX01BSU5fQ0hBUkdFCVRXTDQwMzBfTU9EVUxFX01BSU5fQ0hBUkdFCisjZGVmaW5lIFRXTF9NT0RVTEVfUE1fTUFTVEVSCVRXTDQwMzBfTU9EVUxFX1BNX01BU1RFUgorI2RlZmluZSBUV0xfTU9EVUxFX1BNX1JFQ0VJVkVSCVRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSCisjZGVmaW5lIFRXTF9NT0RVTEVfUlRDCQlUV0w0MDMwX01PRFVMRV9SVEMKKworI2RlZmluZSBHUElPX0lOVFJfT0ZGU0VUCTAKKyNkZWZpbmUgS0VZUEFEX0lOVFJfT0ZGU0VUCTEKKyNkZWZpbmUgQkNJX0lOVFJfT0ZGU0VUCQkyCisjZGVmaW5lIE1BRENfSU5UUl9PRkZTRVQJMworI2RlZmluZSBVU0JfSU5UUl9PRkZTRVQJCTQKKyNkZWZpbmUgQkNJX1BSRVNfSU5UUl9PRkZTRVQJOQorI2RlZmluZSBVU0JfUFJFU19JTlRSX09GRlNFVAkxMAorI2RlZmluZSBSVENfSU5UUl9PRkZTRVQJCTExCisKKy8qCisgKiBPZmZzZXQgZnJvbSBUV0w2MDMwX0lSUV9CQVNFIC8gcGRhdGEtPmlycV9iYXNlCisgKi8KKyNkZWZpbmUgUFdSX0lOVFJfT0ZGU0VUCQkwCisjZGVmaW5lIEhPVERJRV9JTlRSX09GRlNFVAkxMgorI2RlZmluZSBTTVBTTERPX0lOVFJfT0ZGU0VUCTEzCisjZGVmaW5lIEJBVERFVEVDVF9JTlRSX09GRlNFVAkxNAorI2RlZmluZSBTSU1ERVRFQ1RfSU5UUl9PRkZTRVQJMTUKKyNkZWZpbmUgTU1DREVURUNUX0lOVFJfT0ZGU0VUCTE2CisjZGVmaW5lIEdBU0dBVUdFX0lOVFJfT0ZGU0VUCTE3CisjZGVmaW5lIFVTQk9UR19JTlRSX09GRlNFVAk0CisjZGVmaW5lIENIQVJHRVJfSU5UUl9PRkZTRVQJMgorI2RlZmluZSBSU1ZfSU5UUl9PRkZTRVQJCTAKKworLyogSU5UIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgUkVHX0lOVF9TVFNfQQkJCTB4MDAKKyNkZWZpbmUgUkVHX0lOVF9TVFNfQgkJCTB4MDEKKyNkZWZpbmUgUkVHX0lOVF9TVFNfQwkJCTB4MDIKKworI2RlZmluZSBSRUdfSU5UX01TS19MSU5FX0EJCTB4MDMKKyNkZWZpbmUgUkVHX0lOVF9NU0tfTElORV9CCQkweDA0CisjZGVmaW5lIFJFR19JTlRfTVNLX0xJTkVfQwkJMHgwNQorCisjZGVmaW5lIFJFR19JTlRfTVNLX1NUU19BCQkweDA2CisjZGVmaW5lIFJFR19JTlRfTVNLX1NUU19CCQkweDA3CisjZGVmaW5lIFJFR19JTlRfTVNLX1NUU19DCQkweDA4CisKKy8qIE1BU0sgSU5UIFJFRyBHUk9VUCBBICovCisjZGVmaW5lIFRXTDYwMzBfUFdSX0lOVF9NQVNLIAkJMHgwNworI2RlZmluZSBUV0w2MDMwX1JUQ19JTlRfTUFTSyAJCTB4MTgKKyNkZWZpbmUgVFdMNjAzMF9IT1RESUVfSU5UX01BU0sgCTB4MjAKKyNkZWZpbmUgVFdMNjAzMF9TTVBTTERPQV9JTlRfTUFTSwkweEMwCisKKy8qIE1BU0sgSU5UIFJFRyBHUk9VUCBCICovCisjZGVmaW5lIFRXTDYwMzBfU01QU0xET0JfSU5UX01BU0sgCTB4MDEKKyNkZWZpbmUgVFdMNjAzMF9CQVRERVRFQ1RfSU5UX01BU0sgCTB4MDIKKyNkZWZpbmUgVFdMNjAzMF9TSU1ERVRFQ1RfSU5UX01BU0sgCTB4MDQKKyNkZWZpbmUgVFdMNjAzMF9NTUNERVRFQ1RfSU5UX01BU0sgCTB4MDgKKyNkZWZpbmUgVFdMNjAzMF9HUEFEQ19JTlRfTUFTSyAJCTB4NjAKKyNkZWZpbmUgVFdMNjAzMF9HQVNHQVVHRV9JTlRfTUFTSyAJMHg4MAorCisvKiBNQVNLIElOVCBSRUcgR1JPVVAgQyAqLworI2RlZmluZSBUV0w2MDMwX1VTQk9UR19JTlRfTUFTSyAgCTB4MEYKKyNkZWZpbmUgVFdMNjAzMF9DSEFSR0VSX0NUUkxfSU5UX01BU0sgCTB4MTAKKyNkZWZpbmUgVFdMNjAzMF9DSEFSR0VSX0ZBVUxUX0lOVF9NQVNLIAkweDYwCisKKworI2RlZmluZSBUV0w0MDMwX0NMQVNTX0lEIAkJMHg0MDMwCisjZGVmaW5lIFRXTDYwMzBfQ0xBU1NfSUQgCQkweDYwMzAKK3Vuc2lnbmVkIGludCB0d2xfcmV2KHZvaWQpOworI2RlZmluZSBHRVRfVFdMX1JFViAodHdsX3JldigpKQorI2RlZmluZSBUV0xfQ0xBU1NfSVMoY2xhc3MsIGlkKQkJCVwKK3N0YXRpYyBpbmxpbmUgaW50IHR3bF9jbGFzc19pc18gIyNjbGFzcyh2b2lkKQlcCit7CQkJCQkJXAorCXJldHVybiAoKGlkKSA9PSAoR0VUX1RXTF9SRVYpKSA/IDEgOiAwOwlcCit9CisKK1RXTF9DTEFTU19JUyg0MDMwLCBUV0w0MDMwX0NMQVNTX0lEKQorVFdMX0NMQVNTX0lTKDYwMzAsIFRXTDYwMzBfQ0xBU1NfSUQpCisKKy8qCisgKiBSZWFkIGFuZCB3cml0ZSBzaW5nbGUgOC1iaXQgcmVnaXN0ZXJzCisgKi8KK2ludCB0d2xfaTJjX3dyaXRlX3U4KHU4IG1vZF9ubywgdTggdmFsLCB1OCByZWcpOworaW50IHR3bF9pMmNfcmVhZF91OCh1OCBtb2Rfbm8sIHU4ICp2YWwsIHU4IHJlZyk7CisKKy8qCisgKiBSZWFkIGFuZCB3cml0ZSBzZXZlcmFsIDgtYml0IHJlZ2lzdGVycyBhdCBvbmNlLgorICoKKyAqIElNUE9SVEFOVDogIEZvciB0d2xfaTJjX3dyaXRlKCksIGFsbG9jYXRlIG51bV9ieXRlcyArIDEKKyAqIGZvciB0aGUgdmFsdWUsIGFuZCBwb3B1bGF0ZSB5b3VyIGRhdGEgc3RhcnRpbmcgYXQgb2Zmc2V0IDEuCisgKi8KK2ludCB0d2xfaTJjX3dyaXRlKHU4IG1vZF9ubywgdTggKnZhbHVlLCB1OCByZWcsIHVuc2lnbmVkIG51bV9ieXRlcyk7CitpbnQgdHdsX2kyY19yZWFkKHU4IG1vZF9ubywgdTggKnZhbHVlLCB1OCByZWcsIHVuc2lnbmVkIG51bV9ieXRlcyk7CisKK2ludCB0d2w2MDMwX2ludGVycnVwdF91bm1hc2sodTggYml0X21hc2ssIHU4IG9mZnNldCk7CitpbnQgdHdsNjAzMF9pbnRlcnJ1cHRfbWFzayh1OCBiaXRfbWFzaywgdTggb2Zmc2V0KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIE5PVEU6ICBhdCB1cCB0byAxMDI0IHJlZ2lzdGVycywgdGhpcyBpcyBhIGJpZyBjaGlwLgorICoKKyAqIEF2b2lkIHB1dHRpbmcgcmVnaXN0ZXIgZGVjbGFyYXRpb25zIGluIHRoaXMgZmlsZSwgaW5zdGVhZCBvZiBpbnRvCisgKiBhIGRyaXZlci1wcml2YXRlIGZpbGUsIHVubGVzcyBzb21lIG9mIHRoZSByZWdpc3RlcnMgaW4gYSBibG9jaworICogbmVlZCB0byBiZSBzaGFyZWQgd2l0aCBvdGhlciBkcml2ZXJzLiAgT25lIGV4YW1wbGUgaXMgYmxvY2tzIHRoYXQKKyAqIGhhdmUgU2Vjb25kYXJ5IElSUSBIYW5kbGVyIChTSUgpIHJlZ2lzdGVycy4KKyAqLworCisjZGVmaW5lIFRXTDQwMzBfU0lIX0NUUkxfRVhDTEVOX01BU0sJQklUKDApCisjZGVmaW5lIFRXTDQwMzBfU0lIX0NUUkxfUEVORERJU19NQVNLCUJJVCgxKQorI2RlZmluZSBUV0w0MDMwX1NJSF9DVFJMX0NPUl9NQVNLCUJJVCgyKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogR1BJTyBCbG9jayBSZWdpc3RlciBvZmZzZXRzICh1c2UgVFdMNDAzMF9NT0RVTEVfR1BJTykKKyAqLworCisjZGVmaW5lIFJFR19HUElPREFUQUlOMQkJCTB4MAorI2RlZmluZSBSRUdfR1BJT0RBVEFJTjIJCQkweDEKKyNkZWZpbmUgUkVHX0dQSU9EQVRBSU4zCQkJMHgyCisjZGVmaW5lIFJFR19HUElPREFUQURJUjEJCTB4MworI2RlZmluZSBSRUdfR1BJT0RBVEFESVIyCQkweDQKKyNkZWZpbmUgUkVHX0dQSU9EQVRBRElSMwkJMHg1CisjZGVmaW5lIFJFR19HUElPREFUQU9VVDEJCTB4NgorI2RlZmluZSBSRUdfR1BJT0RBVEFPVVQyCQkweDcKKyNkZWZpbmUgUkVHX0dQSU9EQVRBT1VUMwkJMHg4CisjZGVmaW5lIFJFR19DTEVBUkdQSU9EQVRBT1VUMQkJMHg5CisjZGVmaW5lIFJFR19DTEVBUkdQSU9EQVRBT1VUMgkJMHhBCisjZGVmaW5lIFJFR19DTEVBUkdQSU9EQVRBT1VUMwkJMHhCCisjZGVmaW5lIFJFR19TRVRHUElPREFUQU9VVDEJCTB4QworI2RlZmluZSBSRUdfU0VUR1BJT0RBVEFPVVQyCQkweEQKKyNkZWZpbmUgUkVHX1NFVEdQSU9EQVRBT1VUMwkJMHhFCisjZGVmaW5lIFJFR19HUElPX0RFQkVOMQkJCTB4RgorI2RlZmluZSBSRUdfR1BJT19ERUJFTjIJCQkweDEwCisjZGVmaW5lIFJFR19HUElPX0RFQkVOMwkJCTB4MTEKKyNkZWZpbmUgUkVHX0dQSU9fQ1RSTAkJCTB4MTIKKyNkZWZpbmUgUkVHX0dQSU9QVVBEQ1RSMQkJMHgxMworI2RlZmluZSBSRUdfR1BJT1BVUERDVFIyCQkweDE0CisjZGVmaW5lIFJFR19HUElPUFVQRENUUjMJCTB4MTUKKyNkZWZpbmUgUkVHX0dQSU9QVVBEQ1RSNAkJMHgxNgorI2RlZmluZSBSRUdfR1BJT1BVUERDVFI1CQkweDE3CisjZGVmaW5lIFJFR19HUElPX0lTUjFBCQkJMHgxOQorI2RlZmluZSBSRUdfR1BJT19JU1IyQQkJCTB4MUEKKyNkZWZpbmUgUkVHX0dQSU9fSVNSM0EJCQkweDFCCisjZGVmaW5lIFJFR19HUElPX0lNUjFBCQkJMHgxQworI2RlZmluZSBSRUdfR1BJT19JTVIyQQkJCTB4MUQKKyNkZWZpbmUgUkVHX0dQSU9fSU1SM0EJCQkweDFFCisjZGVmaW5lIFJFR19HUElPX0lTUjFCCQkJMHgxRgorI2RlZmluZSBSRUdfR1BJT19JU1IyQgkJCTB4MjAKKyNkZWZpbmUgUkVHX0dQSU9fSVNSM0IJCQkweDIxCisjZGVmaW5lIFJFR19HUElPX0lNUjFCCQkJMHgyMgorI2RlZmluZSBSRUdfR1BJT19JTVIyQgkJCTB4MjMKKyNkZWZpbmUgUkVHX0dQSU9fSU1SM0IJCQkweDI0CisjZGVmaW5lIFJFR19HUElPX0VEUjEJCQkweDI4CisjZGVmaW5lIFJFR19HUElPX0VEUjIJCQkweDI5CisjZGVmaW5lIFJFR19HUElPX0VEUjMJCQkweDJBCisjZGVmaW5lIFJFR19HUElPX0VEUjQJCQkweDJCCisjZGVmaW5lIFJFR19HUElPX0VEUjUJCQkweDJDCisjZGVmaW5lIFJFR19HUElPX1NJSF9DVFJMCQkweDJECisKKy8qIFVwIHRvIDE4IHNpZ25hbHMgYXJlIGF2YWlsYWJsZSBhcyBHUElPcywgd2hlbiB0aGVpcgorICogcGlucyBhcmUgbm90IGFzc2lnbmVkIHRvIGFub3RoZXIgdXNlIChzdWNoIGFzIFVMUEkvVVNCKS4KKyAqLworI2RlZmluZSBUV0w0MDMwX0dQSU9fTUFYCQkxOAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogS2V5cGFkIHJlZ2lzdGVyIG9mZnNldHMgKHVzZSBUV0w0MDMwX01PRFVMRV9LRVlQQUQpCisgKiAuLi4gU0lIL2ludGVycnVwdCBvbmx5CisgKi8KKworI2RlZmluZSBUV0w0MDMwX0tFWVBBRF9LRVlQX0lTUjEJMHgxMQorI2RlZmluZSBUV0w0MDMwX0tFWVBBRF9LRVlQX0lNUjEJMHgxMgorI2RlZmluZSBUV0w0MDMwX0tFWVBBRF9LRVlQX0lTUjIJMHgxMworI2RlZmluZSBUV0w0MDMwX0tFWVBBRF9LRVlQX0lNUjIJMHgxNAorI2RlZmluZSBUV0w0MDMwX0tFWVBBRF9LRVlQX1NJUgkJMHgxNQkvKiB0ZXN0IHJlZ2lzdGVyICovCisjZGVmaW5lIFRXTDQwMzBfS0VZUEFEX0tFWVBfRURSCQkweDE2CisjZGVmaW5lIFRXTDQwMzBfS0VZUEFEX0tFWVBfU0lIX0NUUkwJMHgxNworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogTXVsdGljaGFubmVsIEFEQyByZWdpc3RlciBvZmZzZXRzICh1c2UgVFdMNDAzMF9NT0RVTEVfTUFEQykKKyAqIC4uLiBTSUgvaW50ZXJydXB0IG9ubHkKKyAqLworCisjZGVmaW5lIFRXTDQwMzBfTUFEQ19JU1IxCQkweDYxCisjZGVmaW5lIFRXTDQwMzBfTUFEQ19JTVIxCQkweDYyCisjZGVmaW5lIFRXTDQwMzBfTUFEQ19JU1IyCQkweDYzCisjZGVmaW5lIFRXTDQwMzBfTUFEQ19JTVIyCQkweDY0CisjZGVmaW5lIFRXTDQwMzBfTUFEQ19TSVIJCTB4NjUJLyogdGVzdCByZWdpc3RlciAqLworI2RlZmluZSBUV0w0MDMwX01BRENfRURSCQkweDY2CisjZGVmaW5lIFRXTDQwMzBfTUFEQ19TSUhfQ1RSTAkJMHg2NworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogQmF0dGVyeSBjaGFyZ2VyIHJlZ2lzdGVyIG9mZnNldHMgKHVzZSBUV0w0MDMwX01PRFVMRV9JTlRFUlJVUFRTKQorICovCisKKyNkZWZpbmUgVFdMNDAzMF9JTlRFUlJVUFRTX0JDSUlTUjFBCTB4MAorI2RlZmluZSBUV0w0MDMwX0lOVEVSUlVQVFNfQkNJSVNSMkEJMHgxCisjZGVmaW5lIFRXTDQwMzBfSU5URVJSVVBUU19CQ0lJTVIxQQkweDIKKyNkZWZpbmUgVFdMNDAzMF9JTlRFUlJVUFRTX0JDSUlNUjJBCTB4MworI2RlZmluZSBUV0w0MDMwX0lOVEVSUlVQVFNfQkNJSVNSMUIJMHg0CisjZGVmaW5lIFRXTDQwMzBfSU5URVJSVVBUU19CQ0lJU1IyQgkweDUKKyNkZWZpbmUgVFdMNDAzMF9JTlRFUlJVUFRTX0JDSUlNUjFCCTB4NgorI2RlZmluZSBUV0w0MDMwX0lOVEVSUlVQVFNfQkNJSU1SMkIJMHg3CisjZGVmaW5lIFRXTDQwMzBfSU5URVJSVVBUU19CQ0lTSVIxCTB4OAkvKiB0ZXN0IHJlZ2lzdGVyICovCisjZGVmaW5lIFRXTDQwMzBfSU5URVJSVVBUU19CQ0lTSVIyCTB4OQkvKiB0ZXN0IHJlZ2lzdGVyICovCisjZGVmaW5lIFRXTDQwMzBfSU5URVJSVVBUU19CQ0lFRFIxCTB4YQorI2RlZmluZSBUV0w0MDMwX0lOVEVSUlVQVFNfQkNJRURSMgkweGIKKyNkZWZpbmUgVFdMNDAzMF9JTlRFUlJVUFRTX0JDSUVEUjMJMHhjCisjZGVmaW5lIFRXTDQwMzBfSU5URVJSVVBUU19CQ0lTSUhDVFJMCTB4ZAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogUG93ZXIgSW50ZXJydXB0IGJsb2NrIHJlZ2lzdGVyIG9mZnNldHMgKHVzZSBUV0w0MDMwX01PRFVMRV9JTlQpCisgKi8KKworI2RlZmluZSBUV0w0MDMwX0lOVF9QV1JfSVNSMQkJMHgwCisjZGVmaW5lIFRXTDQwMzBfSU5UX1BXUl9JTVIxCQkweDEKKyNkZWZpbmUgVFdMNDAzMF9JTlRfUFdSX0lTUjIJCTB4MgorI2RlZmluZSBUV0w0MDMwX0lOVF9QV1JfSU1SMgkJMHgzCisjZGVmaW5lIFRXTDQwMzBfSU5UX1BXUl9TSVIJCTB4NAkvKiB0ZXN0IHJlZ2lzdGVyICovCisjZGVmaW5lIFRXTDQwMzBfSU5UX1BXUl9FRFIxCQkweDUKKyNkZWZpbmUgVFdMNDAzMF9JTlRfUFdSX0VEUjIJCTB4NgorI2RlZmluZSBUV0w0MDMwX0lOVF9QV1JfU0lIX0NUUkwJMHg3CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBBY2Nlc3NvcnkgSW50ZXJydXB0cworICovCisjZGVmaW5lIFRXTDUwMzFfQUNJSU1SX0xTQgkJMHgwNQorI2RlZmluZSBUV0w1MDMxX0FDSUlNUl9NU0IJCTB4MDYKKyNkZWZpbmUgVFdMNTAzMV9BQ0lJRFJfTFNCCQkweDA3CisjZGVmaW5lIFRXTDUwMzFfQUNJSURSX01TQgkJMHgwOAorI2RlZmluZSBUV0w1MDMxX0FDQ0lTUjEJCQkweDBGCisjZGVmaW5lIFRXTDUwMzFfQUNDSU1SMQkJCTB4MTAKKyNkZWZpbmUgVFdMNTAzMV9BQ0NJU1IyCQkJMHgxMQorI2RlZmluZSBUV0w1MDMxX0FDQ0lNUjIJCQkweDEyCisjZGVmaW5lIFRXTDUwMzFfQUNDU0lSCQkJMHgxMworI2RlZmluZSBUV0w1MDMxX0FDQ0VEUjEJCQkweDE0CisjZGVmaW5lIFRXTDUwMzFfQUNDU0lIQ1RSTAkJMHgxNQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogQmF0dGVyeSBDaGFyZ2VyIENvbnRyb2xsZXIKKyAqLworCisjZGVmaW5lIFRXTDUwMzFfSU5URVJSVVBUU19CQ0lJU1IxCTB4MAorI2RlZmluZSBUV0w1MDMxX0lOVEVSUlVQVFNfQkNJSU1SMQkweDEKKyNkZWZpbmUgVFdMNTAzMV9JTlRFUlJVUFRTX0JDSUlTUjIJMHgyCisjZGVmaW5lIFRXTDUwMzFfSU5URVJSVVBUU19CQ0lJTVIyCTB4MworI2RlZmluZSBUV0w1MDMxX0lOVEVSUlVQVFNfQkNJU0lSCTB4NAorI2RlZmluZSBUV0w1MDMxX0lOVEVSUlVQVFNfQkNJRURSMQkweDUKKyNkZWZpbmUgVFdMNTAzMV9JTlRFUlJVUFRTX0JDSUVEUjIJMHg2CisjZGVmaW5lIFRXTDUwMzFfSU5URVJSVVBUU19CQ0lTSUhDVFJMCTB4NworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBQb3dlciBidXMgbWVzc2FnZSBkZWZpbml0aW9ucyAqLworCisvKiBUaGUgVFdMNDAzMC81MDMwIHNwbGl0cyBpdHMgcG93ZXItbWFuYWdlbWVudCByZXNvdXJjZXMgKHRoZSB2YXJpb3VzCisgKiByZWd1bGF0b3JzLCBjbG9jayBhbmQgcmVzZXQgbGluZXMpIGludG8gMyBwcm9jZXNzb3IgZ3JvdXBzIC0gUDEsIFAyIGFuZAorICogUDMuIFRoZXNlIGdyb3VwcyBjYW4gdGhlbiBiZSBjb25maWd1cmVkIHRvIHRyYW5zaXRpb24gYmV0d2VlbiBzbGVlcCwgd2FpdC1vbgorICogYW5kIGFjdGl2ZSBzdGF0ZXMgYnkgc2VuZGluZyBtZXNzYWdlcyB0byB0aGUgcG93ZXIgYnVzLiAgU2VlIFNlY3Rpb24gNS40LjIKKyAqIFBvd2VyIFJlc291cmNlcyBvZiBUV0w0MDMwIFRSTQorICovCisKKy8qIFByb2Nlc3NvciBncm91cHMgKi8KKyNkZWZpbmUgREVWX0dSUF9OVUxMCQkweDAKKyNkZWZpbmUgREVWX0dSUF9QMQkJMHgxCS8qIFAxOiBhbGwgT01BUCBkZXZpY2VzICovCisjZGVmaW5lIERFVl9HUlBfUDIJCTB4MgkvKiBQMjogYWxsIE1vZGVtIGRldmljZXMgKi8KKyNkZWZpbmUgREVWX0dSUF9QMwkJMHg0CS8qIFAzOiBhbGwgcGVyaXBoZXJhbCBkZXZpY2VzICovCisKKy8qIFJlc291cmNlIGdyb3VwcyAqLworI2RlZmluZSBSRVNfR1JQX1JFUwkJMHgwCS8qIFJlc2VydmVkICovCisjZGVmaW5lIFJFU19HUlBfUFAJCTB4MQkvKiBQb3dlciBwcm92aWRlcnMgKi8KKyNkZWZpbmUgUkVTX0dSUF9SQwkJMHgyCS8qIFJlc2V0IGFuZCBjb250cm9sICovCisjZGVmaW5lIFJFU19HUlBfUFBfUkMJCTB4MworI2RlZmluZSBSRVNfR1JQX1BSCQkweDQJLyogUG93ZXIgcmVmZXJlbmNlcyAqLworI2RlZmluZSBSRVNfR1JQX1BQX1BSCQkweDUKKyNkZWZpbmUgUkVTX0dSUF9SQ19QUgkJMHg2CisjZGVmaW5lIFJFU19HUlBfQUxMCQkweDcJLyogQWxsIHJlc291cmNlIGdyb3VwcyAqLworCisjZGVmaW5lIFJFU19UWVBFMl9SMAkJMHgwCisKKyNkZWZpbmUgUkVTX1RZUEVfQUxMCQkweDcKKworLyogUmVzb3VyY2Ugc3RhdGVzICovCisjZGVmaW5lIFJFU19TVEFURV9XUlNUCQkweEYKKyNkZWZpbmUgUkVTX1NUQVRFX0FDVElWRQkweEUKKyNkZWZpbmUgUkVTX1NUQVRFX1NMRUVQCQkweDgKKyNkZWZpbmUgUkVTX1NUQVRFX09GRgkJMHgwCisKKy8qIFBvd2VyIHJlc291cmNlcyAqLworCisvKiBQb3dlciBwcm92aWRlcnMgKi8KKyNkZWZpbmUgUkVTX1ZBVVgxICAgICAgICAgICAgICAgMQorI2RlZmluZSBSRVNfVkFVWDIgICAgICAgICAgICAgICAyCisjZGVmaW5lIFJFU19WQVVYMyAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUkVTX1ZBVVg0ICAgICAgICAgICAgICAgNAorI2RlZmluZSBSRVNfVk1NQzEgICAgICAgICAgICAgICA1CisjZGVmaW5lIFJFU19WTU1DMiAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgUkVTX1ZQTEwxICAgICAgICAgICAgICAgNworI2RlZmluZSBSRVNfVlBMTDIgICAgICAgICAgICAgICA4CisjZGVmaW5lIFJFU19WU0lNICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgUkVTX1ZEQUMgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgUkVTX1ZJTlRBTkExICAgICAgICAgICAgMTEKKyNkZWZpbmUgUkVTX1ZJTlRBTkEyICAgICAgICAgICAgMTIKKyNkZWZpbmUgUkVTX1ZJTlRESUcgICAgICAgICAgICAgMTMKKyNkZWZpbmUgUkVTX1ZJTyAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgUkVTX1ZERDEgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgUkVTX1ZERDIgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgUkVTX1ZVU0JfMVY1ICAgICAgICAgICAgMTcKKyNkZWZpbmUgUkVTX1ZVU0JfMVY4ICAgICAgICAgICAgMTgKKyNkZWZpbmUgUkVTX1ZVU0JfM1YxICAgICAgICAgICAgMTkKKyNkZWZpbmUgUkVTX1ZVU0JDUCAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgUkVTX1JFR0VOICAgICAgICAgICAgICAgMjEKKy8qIFJlc2V0IGFuZCBjb250cm9sICovCisjZGVmaW5lIFJFU19OUkVTX1BXUk9OICAgICAgICAgIDIyCisjZGVmaW5lIFJFU19DTEtFTiAgICAgICAgICAgICAgIDIzCisjZGVmaW5lIFJFU19TWVNFTiAgICAgICAgICAgICAgIDI0CisjZGVmaW5lIFJFU19IRkNMS09VVCAgICAgICAgICAgIDI1CisjZGVmaW5lIFJFU18zMktDTEtPVVQgICAgICAgICAgIDI2CisjZGVmaW5lIFJFU19SRVNFVCAgICAgICAgICAgICAgIDI3CisvKiBQb3dlciBSZWZlcmVuY2UgKi8KKyNkZWZpbmUgUkVTX01haW5fUmVmICAgICAgICAgICAgMjgKKworI2RlZmluZSBUT1RBTF9SRVNPVVJDRVMJCTI4CisvKgorICogUG93ZXIgQnVzIE1lc3NhZ2UgRm9ybWF0IC4uLiB0aGVzZSBjYW4gYmUgc2VudCBpbmRpdmlkdWFsbHkgYnkgTGludXgsCisgKiBidXQgYXJlIHVzdWFsbHkgcGFydCBvZiBkb3dubG9hZGVkIHNjcmlwdHMgdGhhdCBhcmUgcnVuIHdoZW4gdmFyaW91cworICogcG93ZXIgZXZlbnRzIGFyZSB0cmlnZ2VyZWQuCisgKgorICogIEJyb2FkY2FzdCBNZXNzYWdlICgxNiBCaXRzKToKKyAqICAgIERFVl9HUlBbMTU6MTNdIE1UWzEyXSAgUkVTX0dSUFsxMTo5XSAgUkVTX1RZUEUyWzg6N10gUkVTX1RZUEVbNjo0XQorICogICAgUkVTX1NUQVRFWzM6MF0KKyAqCisgKiAgU2luZ3VsYXIgTWVzc2FnZSAoMTYgQml0cyk6CisgKiAgICBERVZfR1JQWzE1OjEzXSBNVFsxMl0gIFJFU19JRFsxMTo0XSAgUkVTX1NUQVRFWzM6MF0KKyAqLworCisjZGVmaW5lIE1TR19CUk9BRENBU1QoZGV2Z3JwLCBncnAsIHR5cGUsIHR5cGUyLCBzdGF0ZSkgXAorCSggKGRldmdycCkgPDwgMTMgfCAxIDw8IDEyIHwgKGdycCkgPDwgOSB8ICh0eXBlMikgPDwgNyBcCisJfCAodHlwZSkgPDwgNCB8IChzdGF0ZSkpCisKKyNkZWZpbmUgTVNHX1NJTkdVTEFSKGRldmdycCwgaWQsIHN0YXRlKSBcCisJKChkZXZncnApIDw8IDEzIHwgMCA8PCAxMiB8IChpZCkgPDwgNCB8IChzdGF0ZSkpCisKKyNkZWZpbmUgTVNHX0JST0FEQ0FTVF9BTEwoZGV2Z3JwLCBzdGF0ZSkgXAorCSgoZGV2Z3JwKSA8PCA1IHwgKHN0YXRlKSkKKworI2RlZmluZSBNU0dfQlJPQURDQVNUX1JFRiBNU0dfQlJPQURDQVNUX0FMTAorI2RlZmluZSBNU0dfQlJPQURDQVNUX1BST1YgTVNHX0JST0FEQ0FTVF9BTEwKKyNkZWZpbmUgTVNHX0JST0FEQ0FTVF9fQ0xLX1JTVCBNU0dfQlJPQURDQVNUX0FMTAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RydWN0IHR3bDQwMzBfY2xvY2tfaW5pdF9kYXRhIHsKKwlib29sIGNrMzJrX2xvd3B3cl9lbmFibGU7Cit9OworCitzdHJ1Y3QgdHdsNDAzMF9iY2lfcGxhdGZvcm1fZGF0YSB7CisJaW50ICpiYXR0ZXJ5X3RtcF90Ymw7CisJdW5zaWduZWQgaW50IHRibHNpemU7Cit9OworCisvKiBUV0w0MDMwX0dQSU9fTUFYICgxOCkgR1BJT3MsIHdpdGggaW50ZXJydXB0cyAqLworc3RydWN0IHR3bDQwMzBfZ3Bpb19wbGF0Zm9ybV9kYXRhIHsKKwlpbnQJCWdwaW9fYmFzZTsKKwl1bnNpZ25lZAlpcnFfYmFzZSwgaXJxX2VuZDsKKworCS8qIHBhY2thZ2UgdGhlIHR3byBMRUQgc2lnbmFscyBhcyBvdXRwdXQtb25seSBHUElPcz8gKi8KKwlib29sCQl1c2VfbGVkczsKKworCS8qIGdwaW8tbiBzaG91bGQgY29udHJvbCBWTU1DKG4rMSkgaWYgQklUKG4pIGluIG1tY19jZCBpcyBzZXQgKi8KKwl1OAkJbW1jX2NkOworCisJLyogaWYgQklUKE4pIGlzIHNldCwgb3IgVk1NQyhuKzEpIGlzIGxpbmtlZCwgZGVib3VuY2UgR1BJTy1OICovCisJdTMyCQlkZWJvdW5jZTsKKworCS8qIEZvciBncGlvLU4sIGJpdCAoMSA8PCBOKSBpbiAicHVsbHVwcyIgaXMgc2V0IGlmIHRoYXQgcHVsbHVwCisJICogc2hvdWxkIGJlIGVuYWJsZWQuICBFbHNlLCBpZiB0aGF0IGJpdCBpcyBzZXQgaW4gInB1bGxkb3ducyIsCisJICogdGhhdCBwdWxsZG93biBpcyBlbmFibGVkLiAgRG9uJ3Qgd2FzdGUgcG93ZXIgYnkgbGV0dGluZyBhbnkKKwkgKiBkaWdpdGFsIGlucHV0cyBmbG9hdC4uLgorCSAqLworCXUzMgkJcHVsbHVwczsKKwl1MzIJCXB1bGxkb3duczsKKworCWludAkJKCpzZXR1cCkoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXVuc2lnbmVkIGdwaW8sIHVuc2lnbmVkIG5ncGlvKTsKKwlpbnQJCSgqdGVhcmRvd24pKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQl1bnNpZ25lZCBncGlvLCB1bnNpZ25lZCBuZ3Bpbyk7Cit9OworCitzdHJ1Y3QgdHdsNDAzMF9tYWRjX3BsYXRmb3JtX2RhdGEgeworCWludAkJaXJxX2xpbmU7Cit9OworCisvKiBCb2FyZHMgaGF2ZSB1bmlxZSBtYXBwaW5ncyBvZiB7cm93LCBjb2x9IC0tPiBrZXljb2RlLgorICogQ29sdW1uIGFuZCByb3cgYXJlIDggYml0cyBlYWNoLCBidXQgcmFuZ2Ugb25seSBmcm9tIDAuLjcuCisgKiBhIFBFUlNJU1RFTlRfS0VZIGlzICJhbHdheXMgb24iIGFuZCBuZXZlciByZXBvcnRlZC4KKyAqLworI2RlZmluZSBQRVJTSVNURU5UX0tFWShyLCBjKQlLRVkoKHIpLCAoYyksIEtFWV9SRVNFUlZFRCkKKworc3RydWN0IHR3bDQwMzBfa2V5cGFkX2RhdGEgeworCWNvbnN0IHN0cnVjdCBtYXRyaXhfa2V5bWFwX2RhdGEgKmtleW1hcF9kYXRhOworCXVuc2lnbmVkIHJvd3M7CisJdW5zaWduZWQgY29sczsKKwlib29sIHJlcDsKK307CisKK2VudW0gdHdsNDAzMF91c2JfbW9kZSB7CisJVDJfVVNCX01PREVfVUxQSSA9IDEsCisJVDJfVVNCX01PREVfQ0VBMjAxMV8zUElOID0gMiwKK307CisKK3N0cnVjdCB0d2w0MDMwX3VzYl9kYXRhIHsKKwllbnVtIHR3bDQwMzBfdXNiX21vZGUJdXNiX21vZGU7Cit9OworCitzdHJ1Y3QgdHdsNDAzMF9pbnMgeworCXUxNiBwbWJfbWVzc2FnZTsKKwl1OCBkZWxheTsKK307CisKK3N0cnVjdCB0d2w0MDMwX3NjcmlwdCB7CisJc3RydWN0IHR3bDQwMzBfaW5zICpzY3JpcHQ7CisJdW5zaWduZWQgc2l6ZTsKKwl1OCBmbGFnczsKKyNkZWZpbmUgVFdMNDAzMF9XUlNUX1NDUklQVAkoMTw8MCkKKyNkZWZpbmUgVFdMNDAzMF9XQUtFVVAxMl9TQ1JJUFQJKDE8PDEpCisjZGVmaW5lIFRXTDQwMzBfV0FLRVVQM19TQ1JJUFQJKDE8PDIpCisjZGVmaW5lIFRXTDQwMzBfU0xFRVBfU0NSSVBUCSgxPDwzKQorfTsKKworc3RydWN0IHR3bDQwMzBfcmVzY29uZmlnIHsKKwl1OCByZXNvdXJjZTsKKwl1OCBkZXZncm91cDsJLyogUHJvY2Vzc29yIGdyb3VwIHRoYXQgUG93ZXIgcmVzb3VyY2UgYmVsb25ncyB0byAqLworCXU4IHR5cGU7CS8qIFBvd2VyIHJlc291cmNlIGFkZHJlc3NlZCwgNiAvIGJyb2FkY2FzdCBtZXNzYWdlICovCisJdTggdHlwZTI7CS8qIFBvd2VyIHJlc291cmNlIGFkZHJlc3NlZCwgMyAvIGJyb2FkY2FzdCBtZXNzYWdlICovCisJdTggcmVtYXBfb2ZmOwkvKiBvZmYgc3RhdGUgcmVtYXBwaW5nICovCisJdTggcmVtYXBfc2xlZXA7CS8qIHNsZWVwIHN0YXRlIHJlbWFwcGluZyAqLworfTsKKworc3RydWN0IHR3bDQwMzBfcG93ZXJfZGF0YSB7CisJc3RydWN0IHR3bDQwMzBfc2NyaXB0ICoqc2NyaXB0czsKKwl1bnNpZ25lZCBudW07CisJc3RydWN0IHR3bDQwMzBfcmVzY29uZmlnICpyZXNvdXJjZV9jb25maWc7CisjZGVmaW5lIFRXTDQwMzBfUkVTQ09ORklHX1VOREVGCSgodTgpLTEpCit9OworCitleHRlcm4gdm9pZCB0d2w0MDMwX3Bvd2VyX2luaXQoc3RydWN0IHR3bDQwMzBfcG93ZXJfZGF0YSAqdHJpdG9uMl9zY3JpcHRzKTsKKworc3RydWN0IHR3bDQwMzBfY29kZWNfYXVkaW9fZGF0YSB7CisJdW5zaWduZWQgaW50CWF1ZGlvX21jbGs7CisJdW5zaWduZWQgaW50IHJhbXBfZGVsYXlfdmFsdWU7CisJdW5zaWduZWQgaW50IGhzX2V4dG11dGU6MTsKKwl2b2lkICgqc2V0X2hzX2V4dG11dGUpKGludCBtdXRlKTsKK307CisKK3N0cnVjdCB0d2w0MDMwX2NvZGVjX3ZpYnJhX2RhdGEgeworCXVuc2lnbmVkIGludAlhdWRpb19tY2xrOworCXVuc2lnbmVkIGludAljb2V4aXN0OworfTsKKworc3RydWN0IHR3bDQwMzBfY29kZWNfZGF0YSB7CisJdW5zaWduZWQgaW50CWF1ZGlvX21jbGs7CisJc3RydWN0IHR3bDQwMzBfY29kZWNfYXVkaW9fZGF0YQkJKmF1ZGlvOworCXN0cnVjdCB0d2w0MDMwX2NvZGVjX3ZpYnJhX2RhdGEJCSp2aWJyYTsKK307CisKK3N0cnVjdCB0d2w0MDMwX3BsYXRmb3JtX2RhdGEgeworCXVuc2lnbmVkCQkJCWlycV9iYXNlLCBpcnFfZW5kOworCXN0cnVjdCB0d2w0MDMwX2Nsb2NrX2luaXRfZGF0YQkJKmNsb2NrOworCXN0cnVjdCB0d2w0MDMwX2JjaV9wbGF0Zm9ybV9kYXRhCSpiY2k7CisJc3RydWN0IHR3bDQwMzBfZ3Bpb19wbGF0Zm9ybV9kYXRhCSpncGlvOworCXN0cnVjdCB0d2w0MDMwX21hZGNfcGxhdGZvcm1fZGF0YQkqbWFkYzsKKwlzdHJ1Y3QgdHdsNDAzMF9rZXlwYWRfZGF0YQkJKmtleXBhZDsKKwlzdHJ1Y3QgdHdsNDAzMF91c2JfZGF0YQkJCSp1c2I7CisJc3RydWN0IHR3bDQwMzBfcG93ZXJfZGF0YQkJKnBvd2VyOworCXN0cnVjdCB0d2w0MDMwX2NvZGVjX2RhdGEJCSpjb2RlYzsKKworCS8qIENvbW1vbiBMRE8gcmVndWxhdG9ycyBmb3IgVFdMNDAzMC9UV0w2MDMwICovCisJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEJCSp2ZGFjOworCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhCQkqdmF1eDE7CisJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEJCSp2YXV4MjsKKwlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YQkJKnZhdXgzOworCS8qIFRXTDQwMzAgTERPIHJlZ3VsYXRvcnMgKi8KKwlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YQkJKnZwbGwxOworCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhCQkqdnBsbDI7CisJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEJCSp2bW1jMTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YQkJKnZtbWMyOworCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhCQkqdnNpbTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YQkJKnZhdXg0OworCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhCQkqdmlvOworCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhCQkqdmRkMTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YQkJKnZkZDI7CisJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEJCSp2aW50YW5hMTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YQkJKnZpbnRhbmEyOworCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhCQkqdmludGRpZzsKKwkvKiBUV0w2MDMwIExETyByZWd1bGF0b3JzICovCisJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgICAgICAgICAgICAgICp2bW1jOworCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICAgICAgICAgICAgICAqdnBwOworCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICAgICAgICAgICAgICAqdnVzaW07CisJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgICAgICAgICAgICAgICp2YW5hOworCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICAgICAgICAgICAgICAqdmN4aW87CisJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgICAgICAgICAgICAgICp2dXNiOworfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IHR3bDQwMzBfc2loX3NldHVwKGludCBtb2R1bGUpOworCisvKiBPZmZzZXRzIHRvIFBvd2VyIFJlZ2lzdGVycyAqLworI2RlZmluZSBUV0w0MDMwX1ZEQUNfREVWX0dSUAkJMHgzQgorI2RlZmluZSBUV0w0MDMwX1ZEQUNfREVESUNBVEVECQkweDNFCisjZGVmaW5lIFRXTDQwMzBfVkFVWDFfREVWX0dSUAkJMHgxNworI2RlZmluZSBUV0w0MDMwX1ZBVVgxX0RFRElDQVRFRAkJMHgxQQorI2RlZmluZSBUV0w0MDMwX1ZBVVgyX0RFVl9HUlAJCTB4MUIKKyNkZWZpbmUgVFdMNDAzMF9WQVVYMl9ERURJQ0FURUQJCTB4MUUKKyNkZWZpbmUgVFdMNDAzMF9WQVVYM19ERVZfR1JQCQkweDFGCisjZGVmaW5lIFRXTDQwMzBfVkFVWDNfREVESUNBVEVECQkweDIyCisKKyNpZiBkZWZpbmVkKENPTkZJR19UV0w0MDMwX0JDSV9CQVRURVJZKSB8fCBcCisJZGVmaW5lZChDT05GSUdfVFdMNDAzMF9CQ0lfQkFUVEVSWV9NT0RVTEUpCisJZXh0ZXJuIGludCB0d2w0MDMwY2hhcmdlcl91c2JfZW4oaW50IGVuYWJsZSk7CisjZWxzZQorCXN0YXRpYyBpbmxpbmUgaW50IHR3bDQwMzBjaGFyZ2VyX3VzYl9lbihpbnQgZW5hYmxlKSB7IHJldHVybiAwOyB9CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogTGludXgtc3BlY2lmaWMgcmVndWxhdG9yIGlkZW50aWZpZXJzIC4uLiBmb3Igbm93LCB3ZSBvbmx5IHN1cHBvcnQKKyAqIHRoZSBMRE9zLCBhbmQgbGVhdmUgdGhlIHRocmVlIGJ1Y2sgY29udmVydGVycyBhbG9uZS4gIFZERDEgYW5kIFZERDIKKyAqIG5lZWQgdG8gdGllIGludG8gaGFyZHdhcmUgYmFzZWQgdm9sdGFnZSBzY2FsaW5nIChjcHVmcmVxIGV0YyksIHdoaWxlCisgKiBWSU8gaXMgZ2VuZXJhbGx5IGZpeGVkLgorICovCisKKy8qIFRXTDQwMzAgU01QUy9MRE8ncyAqLworLyogRVhURVJOQUwgZGMtdG8tZGMgYnVjayBjb252ZXJ0ZXJzICovCisjZGVmaW5lIFRXTDQwMzBfUkVHX1ZERDEJMAorI2RlZmluZSBUV0w0MDMwX1JFR19WREQyCTEKKyNkZWZpbmUgVFdMNDAzMF9SRUdfVklPCQkyCisKKy8qIEVYVEVSTkFMIExET3MgKi8KKyNkZWZpbmUgVFdMNDAzMF9SRUdfVkRBQwkzCisjZGVmaW5lIFRXTDQwMzBfUkVHX1ZQTEwxCTQKKyNkZWZpbmUgVFdMNDAzMF9SRUdfVlBMTDIJNQkvKiBub3Qgb24gYWxsIGNoaXBzICovCisjZGVmaW5lIFRXTDQwMzBfUkVHX1ZNTUMxCTYKKyNkZWZpbmUgVFdMNDAzMF9SRUdfVk1NQzIJNwkvKiBub3Qgb24gYWxsIGNoaXBzICovCisjZGVmaW5lIFRXTDQwMzBfUkVHX1ZTSU0JOAkvKiBub3Qgb24gYWxsIGNoaXBzICovCisjZGVmaW5lIFRXTDQwMzBfUkVHX1ZBVVgxCTkJLyogbm90IG9uIGFsbCBjaGlwcyAqLworI2RlZmluZSBUV0w0MDMwX1JFR19WQVVYMl80MDMwCTEwCS8qICh0d2w0MDMwLXNwZWNpZmljKSAqLworI2RlZmluZSBUV0w0MDMwX1JFR19WQVVYMgkxMQkvKiAodHdsNTAzMCBhbmQgbmV3ZXIpICovCisjZGVmaW5lIFRXTDQwMzBfUkVHX1ZBVVgzCTEyCS8qIG5vdCBvbiBhbGwgY2hpcHMgKi8KKyNkZWZpbmUgVFdMNDAzMF9SRUdfVkFVWDQJMTMJLyogbm90IG9uIGFsbCBjaGlwcyAqLworCisvKiBJTlRFUk5BTCBMRE9zICovCisjZGVmaW5lIFRXTDQwMzBfUkVHX1ZJTlRBTkExCTE0CisjZGVmaW5lIFRXTDQwMzBfUkVHX1ZJTlRBTkEyCTE1CisjZGVmaW5lIFRXTDQwMzBfUkVHX1ZJTlRESUcJMTYKKyNkZWZpbmUgVFdMNDAzMF9SRUdfVlVTQjFWNQkxNworI2RlZmluZSBUV0w0MDMwX1JFR19WVVNCMVY4CTE4CisjZGVmaW5lIFRXTDQwMzBfUkVHX1ZVU0IzVjEJMTkKKworLyogVFdMNjAzMCBTTVBTL0xETydzICovCisvKiBFWFRFUk5BTCBkYy10by1kYyBidWNrIGNvbnZlcnRvciBjb250b2xsYWJsZSB2aWEgU1IgKi8KKyNkZWZpbmUgVFdMNjAzMF9SRUdfVkREMQkzMAorI2RlZmluZSBUV0w2MDMwX1JFR19WREQyCTMxCisjZGVmaW5lIFRXTDYwMzBfUkVHX1ZERDMJMzIKKworLyogTm9uIFNSIGNvbXBsaWFudCBkYy10by1kYyBidWNrIGNvbnZlcnRvcnMgKi8KKyNkZWZpbmUJVFdMNjAzMF9SRUdfVk1FTQkzMworI2RlZmluZSBUV0w2MDMwX1JFR19WMlYxCTM0CisjZGVmaW5lCVRXTDYwMzBfUkVHX1YxVjI5CTM1CisjZGVmaW5lIFRXTDYwMzBfUkVHX1YxVjgJMzYKKworLyogRVhURVJOQUwgTERPcyAqLworI2RlZmluZSBUV0w2MDMwX1JFR19WQVVYMV82MDMwCTM3CisjZGVmaW5lIFRXTDYwMzBfUkVHX1ZBVVgyXzYwMzAJMzgKKyNkZWZpbmUgVFdMNjAzMF9SRUdfVkFVWDNfNjAzMAkzOQorI2RlZmluZSBUV0w2MDMwX1JFR19WTU1DCTQwCisjZGVmaW5lIFRXTDYwMzBfUkVHX1ZQUAkJNDEKKyNkZWZpbmUgVFdMNjAzMF9SRUdfVlVTSU0JNDIKKyNkZWZpbmUgVFdMNjAzMF9SRUdfVkFOQQk0MworI2RlZmluZSBUV0w2MDMwX1JFR19WQ1hJTwk0NAorI2RlZmluZSBUV0w2MDMwX1JFR19WREFDCTQ1CisjZGVmaW5lIFRXTDYwMzBfUkVHX1ZVU0IJNDYKKworLyogSU5URVJOQUwgTERPcyAqLworI2RlZmluZSBUV0w2MDMwX1JFR19WUlRDCTQ3CisKKyNlbmRpZiAvKiBFbmQgb2YgX19UV0w0MDMwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaTJjL3R3bDQwMzAuaCBiL2luY2x1ZGUvbGludXgvaTJjL3R3bDQwMzAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMwNmE3NS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L2kyYy90d2w0MDMwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MDIgKzAsMCBAQAotLyoKLSAqIHR3bDQwMzAuaCAtIGhlYWRlciBmb3IgVFdMNDAzMCBQTSBhbmQgYXVkaW8gQ09ERUMgZGV2aWNlCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KLSAqCi0gKiBCYXNlZCBvbiB0bHYzMjBhaWMyMy5jOgotICogQ29weXJpZ2h0IChjKSBieSBLYWkgU3ZhaG4gPGthaS5zdmFobkBub2tpYS5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCi0gKgotICovCi0KLSNpZm5kZWYgX19UV0w0MDMwX0hfCi0jZGVmaW5lIF9fVFdMNDAzMF9IXwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnB1dC9tYXRyaXhfa2V5cGFkLmg+Ci0KLS8qCi0gKiBVc2luZyB0aGUgdHdsNDAzMCBjb3JlIHdlIGFkZHJlc3MgcmVnaXN0ZXJzIHVzaW5nIGEgcGFpcgotICoJeyBtb2R1bGUgaWQsIHJlbGF0aXZlIHJlZ2lzdGVyIG9mZnNldCB9Ci0gKiB3aGljaCB0aGF0IGNvcmUgdGhlbiBtYXBzIHRvIHRoZSByZWxldmFudAotICoJeyBpMmMgc2xhdmUsIGFic29sdXRlIHJlZ2lzdGVyIGFkZHJlc3MgfQotICoKLSAqIFRoZSBtb2R1bGUgSURzIGFyZSBtZWFuaW5nZnVsIG9ubHkgdG8gdGhlIHR3bDQwMzAgY29yZSBjb2RlLAotICogd2hpY2ggdXNlcyB0aGVtIGFzIGFycmF5IGluZGljZXMgdG8gbG9vayB1cCB0aGUgZmlyc3QgcmVnaXN0ZXIKLSAqIGFkZHJlc3MgZWFjaCBtb2R1bGUgdXNlcyB3aXRoaW4gYSBnaXZlbiBpMmMgc2xhdmUuCi0gKi8KLQotLyogU2xhdmUgMCAoaTJjIGFkZHJlc3MgMHg0OCkgKi8KLSNkZWZpbmUgVFdMNDAzMF9NT0RVTEVfVVNCCQkweDAwCi0KLS8qIFNsYXZlIDEgKGkyYyBhZGRyZXNzIDB4NDkpICovCi0jZGVmaW5lIFRXTDQwMzBfTU9EVUxFX0FVRElPX1ZPSUNFCTB4MDEKLSNkZWZpbmUgVFdMNDAzMF9NT0RVTEVfR1BJTwkJMHgwMgotI2RlZmluZSBUV0w0MDMwX01PRFVMRV9JTlRCUgkJMHgwMwotI2RlZmluZSBUV0w0MDMwX01PRFVMRV9QSUgJCTB4MDQKLSNkZWZpbmUgVFdMNDAzMF9NT0RVTEVfVEVTVAkJMHgwNQotCi0vKiBTbGF2ZSAyIChpMmMgYWRkcmVzcyAweDRhKSAqLwotI2RlZmluZSBUV0w0MDMwX01PRFVMRV9LRVlQQUQJCTB4MDYKLSNkZWZpbmUgVFdMNDAzMF9NT0RVTEVfTUFEQwkJMHgwNwotI2RlZmluZSBUV0w0MDMwX01PRFVMRV9JTlRFUlJVUFRTCTB4MDgKLSNkZWZpbmUgVFdMNDAzMF9NT0RVTEVfTEVECQkweDA5Ci0jZGVmaW5lIFRXTDQwMzBfTU9EVUxFX01BSU5fQ0hBUkdFCTB4MEEKLSNkZWZpbmUgVFdMNDAzMF9NT0RVTEVfUFJFQ0hBUkdFCTB4MEIKLSNkZWZpbmUgVFdMNDAzMF9NT0RVTEVfUFdNMAkJMHgwQwotI2RlZmluZSBUV0w0MDMwX01PRFVMRV9QV00xCQkweDBECi0jZGVmaW5lIFRXTDQwMzBfTU9EVUxFX1BXTUEJCTB4MEUKLSNkZWZpbmUgVFdMNDAzMF9NT0RVTEVfUFdNQgkJMHgwRgotCi0vKiBTbGF2ZSAzIChpMmMgYWRkcmVzcyAweDRiKSAqLwotI2RlZmluZSBUV0w0MDMwX01PRFVMRV9CQUNLVVAJCTB4MTAKLSNkZWZpbmUgVFdMNDAzMF9NT0RVTEVfSU5UCQkweDExCi0jZGVmaW5lIFRXTDQwMzBfTU9EVUxFX1BNX01BU1RFUgkweDEyCi0jZGVmaW5lIFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSCTB4MTMKLSNkZWZpbmUgVFdMNDAzMF9NT0RVTEVfUlRDCQkweDE0Ci0jZGVmaW5lIFRXTDQwMzBfTU9EVUxFX1NFQ1VSRURfUkVHCTB4MTUKLQotLyoKLSAqIFJlYWQgYW5kIHdyaXRlIHNpbmdsZSA4LWJpdCByZWdpc3RlcnMKLSAqLwotaW50IHR3bDQwMzBfaTJjX3dyaXRlX3U4KHU4IG1vZF9ubywgdTggdmFsLCB1OCByZWcpOwotaW50IHR3bDQwMzBfaTJjX3JlYWRfdTgodTggbW9kX25vLCB1OCAqdmFsLCB1OCByZWcpOwotCi0vKgotICogUmVhZCBhbmQgd3JpdGUgc2V2ZXJhbCA4LWJpdCByZWdpc3RlcnMgYXQgb25jZS4KLSAqCi0gKiBJTVBPUlRBTlQ6ICBGb3IgdHdsNDAzMF9pMmNfd3JpdGUoKSwgYWxsb2NhdGUgbnVtX2J5dGVzICsgMQotICogZm9yIHRoZSB2YWx1ZSwgYW5kIHBvcHVsYXRlIHlvdXIgZGF0YSBzdGFydGluZyBhdCBvZmZzZXQgMS4KLSAqLwotaW50IHR3bDQwMzBfaTJjX3dyaXRlKHU4IG1vZF9ubywgdTggKnZhbHVlLCB1OCByZWcsIHVuc2lnbmVkIG51bV9ieXRlcyk7Ci1pbnQgdHdsNDAzMF9pMmNfcmVhZCh1OCBtb2Rfbm8sIHU4ICp2YWx1ZSwgdTggcmVnLCB1bnNpZ25lZCBudW1fYnl0ZXMpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotICogTk9URTogIGF0IHVwIHRvIDEwMjQgcmVnaXN0ZXJzLCB0aGlzIGlzIGEgYmlnIGNoaXAuCi0gKgotICogQXZvaWQgcHV0dGluZyByZWdpc3RlciBkZWNsYXJhdGlvbnMgaW4gdGhpcyBmaWxlLCBpbnN0ZWFkIG9mIGludG8KLSAqIGEgZHJpdmVyLXByaXZhdGUgZmlsZSwgdW5sZXNzIHNvbWUgb2YgdGhlIHJlZ2lzdGVycyBpbiBhIGJsb2NrCi0gKiBuZWVkIHRvIGJlIHNoYXJlZCB3aXRoIG90aGVyIGRyaXZlcnMuICBPbmUgZXhhbXBsZSBpcyBibG9ja3MgdGhhdAotICogaGF2ZSBTZWNvbmRhcnkgSVJRIEhhbmRsZXIgKFNJSCkgcmVnaXN0ZXJzLgotICovCi0KLSNkZWZpbmUgVFdMNDAzMF9TSUhfQ1RSTF9FWENMRU5fTUFTSwlCSVQoMCkKLSNkZWZpbmUgVFdMNDAzMF9TSUhfQ1RSTF9QRU5ERElTX01BU0sJQklUKDEpCi0jZGVmaW5lIFRXTDQwMzBfU0lIX0NUUkxfQ09SX01BU0sJQklUKDIpCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0gKiBHUElPIEJsb2NrIFJlZ2lzdGVyIG9mZnNldHMgKHVzZSBUV0w0MDMwX01PRFVMRV9HUElPKQotICovCi0KLSNkZWZpbmUgUkVHX0dQSU9EQVRBSU4xCQkJMHgwCi0jZGVmaW5lIFJFR19HUElPREFUQUlOMgkJCTB4MQotI2RlZmluZSBSRUdfR1BJT0RBVEFJTjMJCQkweDIKLSNkZWZpbmUgUkVHX0dQSU9EQVRBRElSMQkJMHgzCi0jZGVmaW5lIFJFR19HUElPREFUQURJUjIJCTB4NAotI2RlZmluZSBSRUdfR1BJT0RBVEFESVIzCQkweDUKLSNkZWZpbmUgUkVHX0dQSU9EQVRBT1VUMQkJMHg2Ci0jZGVmaW5lIFJFR19HUElPREFUQU9VVDIJCTB4NwotI2RlZmluZSBSRUdfR1BJT0RBVEFPVVQzCQkweDgKLSNkZWZpbmUgUkVHX0NMRUFSR1BJT0RBVEFPVVQxCQkweDkKLSNkZWZpbmUgUkVHX0NMRUFSR1BJT0RBVEFPVVQyCQkweEEKLSNkZWZpbmUgUkVHX0NMRUFSR1BJT0RBVEFPVVQzCQkweEIKLSNkZWZpbmUgUkVHX1NFVEdQSU9EQVRBT1VUMQkJMHhDCi0jZGVmaW5lIFJFR19TRVRHUElPREFUQU9VVDIJCTB4RAotI2RlZmluZSBSRUdfU0VUR1BJT0RBVEFPVVQzCQkweEUKLSNkZWZpbmUgUkVHX0dQSU9fREVCRU4xCQkJMHhGCi0jZGVmaW5lIFJFR19HUElPX0RFQkVOMgkJCTB4MTAKLSNkZWZpbmUgUkVHX0dQSU9fREVCRU4zCQkJMHgxMQotI2RlZmluZSBSRUdfR1BJT19DVFJMCQkJMHgxMgotI2RlZmluZSBSRUdfR1BJT1BVUERDVFIxCQkweDEzCi0jZGVmaW5lIFJFR19HUElPUFVQRENUUjIJCTB4MTQKLSNkZWZpbmUgUkVHX0dQSU9QVVBEQ1RSMwkJMHgxNQotI2RlZmluZSBSRUdfR1BJT1BVUERDVFI0CQkweDE2Ci0jZGVmaW5lIFJFR19HUElPUFVQRENUUjUJCTB4MTcKLSNkZWZpbmUgUkVHX0dQSU9fSVNSMUEJCQkweDE5Ci0jZGVmaW5lIFJFR19HUElPX0lTUjJBCQkJMHgxQQotI2RlZmluZSBSRUdfR1BJT19JU1IzQQkJCTB4MUIKLSNkZWZpbmUgUkVHX0dQSU9fSU1SMUEJCQkweDFDCi0jZGVmaW5lIFJFR19HUElPX0lNUjJBCQkJMHgxRAotI2RlZmluZSBSRUdfR1BJT19JTVIzQQkJCTB4MUUKLSNkZWZpbmUgUkVHX0dQSU9fSVNSMUIJCQkweDFGCi0jZGVmaW5lIFJFR19HUElPX0lTUjJCCQkJMHgyMAotI2RlZmluZSBSRUdfR1BJT19JU1IzQgkJCTB4MjEKLSNkZWZpbmUgUkVHX0dQSU9fSU1SMUIJCQkweDIyCi0jZGVmaW5lIFJFR19HUElPX0lNUjJCCQkJMHgyMwotI2RlZmluZSBSRUdfR1BJT19JTVIzQgkJCTB4MjQKLSNkZWZpbmUgUkVHX0dQSU9fRURSMQkJCTB4MjgKLSNkZWZpbmUgUkVHX0dQSU9fRURSMgkJCTB4MjkKLSNkZWZpbmUgUkVHX0dQSU9fRURSMwkJCTB4MkEKLSNkZWZpbmUgUkVHX0dQSU9fRURSNAkJCTB4MkIKLSNkZWZpbmUgUkVHX0dQSU9fRURSNQkJCTB4MkMKLSNkZWZpbmUgUkVHX0dQSU9fU0lIX0NUUkwJCTB4MkQKLQotLyogVXAgdG8gMTggc2lnbmFscyBhcmUgYXZhaWxhYmxlIGFzIEdQSU9zLCB3aGVuIHRoZWlyCi0gKiBwaW5zIGFyZSBub3QgYXNzaWduZWQgdG8gYW5vdGhlciB1c2UgKHN1Y2ggYXMgVUxQSS9VU0IpLgotICovCi0jZGVmaW5lIFRXTDQwMzBfR1BJT19NQVgJCTE4Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0gKiBLZXlwYWQgcmVnaXN0ZXIgb2Zmc2V0cyAodXNlIFRXTDQwMzBfTU9EVUxFX0tFWVBBRCkKLSAqIC4uLiBTSUgvaW50ZXJydXB0IG9ubHkKLSAqLwotCi0jZGVmaW5lIFRXTDQwMzBfS0VZUEFEX0tFWVBfSVNSMQkweDExCi0jZGVmaW5lIFRXTDQwMzBfS0VZUEFEX0tFWVBfSU1SMQkweDEyCi0jZGVmaW5lIFRXTDQwMzBfS0VZUEFEX0tFWVBfSVNSMgkweDEzCi0jZGVmaW5lIFRXTDQwMzBfS0VZUEFEX0tFWVBfSU1SMgkweDE0Ci0jZGVmaW5lIFRXTDQwMzBfS0VZUEFEX0tFWVBfU0lSCQkweDE1CS8qIHRlc3QgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgVFdMNDAzMF9LRVlQQURfS0VZUF9FRFIJCTB4MTYKLSNkZWZpbmUgVFdMNDAzMF9LRVlQQURfS0VZUF9TSUhfQ1RSTAkweDE3Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0gKiBNdWx0aWNoYW5uZWwgQURDIHJlZ2lzdGVyIG9mZnNldHMgKHVzZSBUV0w0MDMwX01PRFVMRV9NQURDKQotICogLi4uIFNJSC9pbnRlcnJ1cHQgb25seQotICovCi0KLSNkZWZpbmUgVFdMNDAzMF9NQURDX0lTUjEJCTB4NjEKLSNkZWZpbmUgVFdMNDAzMF9NQURDX0lNUjEJCTB4NjIKLSNkZWZpbmUgVFdMNDAzMF9NQURDX0lTUjIJCTB4NjMKLSNkZWZpbmUgVFdMNDAzMF9NQURDX0lNUjIJCTB4NjQKLSNkZWZpbmUgVFdMNDAzMF9NQURDX1NJUgkJMHg2NQkvKiB0ZXN0IHJlZ2lzdGVyICovCi0jZGVmaW5lIFRXTDQwMzBfTUFEQ19FRFIJCTB4NjYKLSNkZWZpbmUgVFdMNDAzMF9NQURDX1NJSF9DVFJMCQkweDY3Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0gKiBCYXR0ZXJ5IGNoYXJnZXIgcmVnaXN0ZXIgb2Zmc2V0cyAodXNlIFRXTDQwMzBfTU9EVUxFX0lOVEVSUlVQVFMpCi0gKi8KLQotI2RlZmluZSBUV0w0MDMwX0lOVEVSUlVQVFNfQkNJSVNSMUEJMHgwCi0jZGVmaW5lIFRXTDQwMzBfSU5URVJSVVBUU19CQ0lJU1IyQQkweDEKLSNkZWZpbmUgVFdMNDAzMF9JTlRFUlJVUFRTX0JDSUlNUjFBCTB4MgotI2RlZmluZSBUV0w0MDMwX0lOVEVSUlVQVFNfQkNJSU1SMkEJMHgzCi0jZGVmaW5lIFRXTDQwMzBfSU5URVJSVVBUU19CQ0lJU1IxQgkweDQKLSNkZWZpbmUgVFdMNDAzMF9JTlRFUlJVUFRTX0JDSUlTUjJCCTB4NQotI2RlZmluZSBUV0w0MDMwX0lOVEVSUlVQVFNfQkNJSU1SMUIJMHg2Ci0jZGVmaW5lIFRXTDQwMzBfSU5URVJSVVBUU19CQ0lJTVIyQgkweDcKLSNkZWZpbmUgVFdMNDAzMF9JTlRFUlJVUFRTX0JDSVNJUjEJMHg4CS8qIHRlc3QgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgVFdMNDAzMF9JTlRFUlJVUFRTX0JDSVNJUjIJMHg5CS8qIHRlc3QgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgVFdMNDAzMF9JTlRFUlJVUFRTX0JDSUVEUjEJMHhhCi0jZGVmaW5lIFRXTDQwMzBfSU5URVJSVVBUU19CQ0lFRFIyCTB4YgotI2RlZmluZSBUV0w0MDMwX0lOVEVSUlVQVFNfQkNJRURSMwkweGMKLSNkZWZpbmUgVFdMNDAzMF9JTlRFUlJVUFRTX0JDSVNJSENUUkwJMHhkCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0gKiBQb3dlciBJbnRlcnJ1cHQgYmxvY2sgcmVnaXN0ZXIgb2Zmc2V0cyAodXNlIFRXTDQwMzBfTU9EVUxFX0lOVCkKLSAqLwotCi0jZGVmaW5lIFRXTDQwMzBfSU5UX1BXUl9JU1IxCQkweDAKLSNkZWZpbmUgVFdMNDAzMF9JTlRfUFdSX0lNUjEJCTB4MQotI2RlZmluZSBUV0w0MDMwX0lOVF9QV1JfSVNSMgkJMHgyCi0jZGVmaW5lIFRXTDQwMzBfSU5UX1BXUl9JTVIyCQkweDMKLSNkZWZpbmUgVFdMNDAzMF9JTlRfUFdSX1NJUgkJMHg0CS8qIHRlc3QgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgVFdMNDAzMF9JTlRfUFdSX0VEUjEJCTB4NQotI2RlZmluZSBUV0w0MDMwX0lOVF9QV1JfRURSMgkJMHg2Ci0jZGVmaW5lIFRXTDQwMzBfSU5UX1BXUl9TSUhfQ1RSTAkweDcKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogUG93ZXIgYnVzIG1lc3NhZ2UgZGVmaW5pdGlvbnMgKi8KLQotLyogVGhlIFRXTDQwMzAvNTAzMCBzcGxpdHMgaXRzIHBvd2VyLW1hbmFnZW1lbnQgcmVzb3VyY2VzICh0aGUgdmFyaW91cwotICogcmVndWxhdG9ycywgY2xvY2sgYW5kIHJlc2V0IGxpbmVzKSBpbnRvIDMgcHJvY2Vzc29yIGdyb3VwcyAtIFAxLCBQMiBhbmQKLSAqIFAzLiBUaGVzZSBncm91cHMgY2FuIHRoZW4gYmUgY29uZmlndXJlZCB0byB0cmFuc2l0aW9uIGJldHdlZW4gc2xlZXAsIHdhaXQtb24KLSAqIGFuZCBhY3RpdmUgc3RhdGVzIGJ5IHNlbmRpbmcgbWVzc2FnZXMgdG8gdGhlIHBvd2VyIGJ1cy4gIFNlZSBTZWN0aW9uIDUuNC4yCi0gKiBQb3dlciBSZXNvdXJjZXMgb2YgVFdMNDAzMCBUUk0KLSAqLwotCi0vKiBQcm9jZXNzb3IgZ3JvdXBzICovCi0jZGVmaW5lIERFVl9HUlBfTlVMTAkJMHgwCi0jZGVmaW5lIERFVl9HUlBfUDEJCTB4MQkvKiBQMTogYWxsIE9NQVAgZGV2aWNlcyAqLwotI2RlZmluZSBERVZfR1JQX1AyCQkweDIJLyogUDI6IGFsbCBNb2RlbSBkZXZpY2VzICovCi0jZGVmaW5lIERFVl9HUlBfUDMJCTB4NAkvKiBQMzogYWxsIHBlcmlwaGVyYWwgZGV2aWNlcyAqLwotCi0vKiBSZXNvdXJjZSBncm91cHMgKi8KLSNkZWZpbmUgUkVTX0dSUF9SRVMJCTB4MAkvKiBSZXNlcnZlZCAqLwotI2RlZmluZSBSRVNfR1JQX1BQCQkweDEJLyogUG93ZXIgcHJvdmlkZXJzICovCi0jZGVmaW5lIFJFU19HUlBfUkMJCTB4MgkvKiBSZXNldCBhbmQgY29udHJvbCAqLwotI2RlZmluZSBSRVNfR1JQX1BQX1JDCQkweDMKLSNkZWZpbmUgUkVTX0dSUF9QUgkJMHg0CS8qIFBvd2VyIHJlZmVyZW5jZXMgKi8KLSNkZWZpbmUgUkVTX0dSUF9QUF9QUgkJMHg1Ci0jZGVmaW5lIFJFU19HUlBfUkNfUFIJCTB4NgotI2RlZmluZSBSRVNfR1JQX0FMTAkJMHg3CS8qIEFsbCByZXNvdXJjZSBncm91cHMgKi8KLQotI2RlZmluZSBSRVNfVFlQRTJfUjAJCTB4MAotCi0jZGVmaW5lIFJFU19UWVBFX0FMTAkJMHg3Ci0KLSNkZWZpbmUgUkVTX1NUQVRFX1dSU1QJCTB4RgotI2RlZmluZSBSRVNfU1RBVEVfQUNUSVZFCTB4RQotI2RlZmluZSBSRVNfU1RBVEVfU0xFRVAJCTB4OAotI2RlZmluZSBSRVNfU1RBVEVfT0ZGCQkweDAKLQotLyogUG93ZXIgcmVzb3VyY2VzICovCi0KLS8qIFBvd2VyIHByb3ZpZGVycyAqLwotI2RlZmluZSBSRVNfVkFVWDEgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFJFU19WQVVYMiAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgUkVTX1ZBVVgzICAgICAgICAgICAgICAgMwotI2RlZmluZSBSRVNfVkFVWDQgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFJFU19WTU1DMSAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgUkVTX1ZNTUMyICAgICAgICAgICAgICAgNgotI2RlZmluZSBSRVNfVlBMTDEgICAgICAgICAgICAgICA3Ci0jZGVmaW5lIFJFU19WUExMMiAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgUkVTX1ZTSU0gICAgICAgICAgICAgICAgOQotI2RlZmluZSBSRVNfVkRBQyAgICAgICAgICAgICAgICAxMAotI2RlZmluZSBSRVNfVklOVEFOQTEgICAgICAgICAgICAxMQotI2RlZmluZSBSRVNfVklOVEFOQTIgICAgICAgICAgICAxMgotI2RlZmluZSBSRVNfVklOVERJRyAgICAgICAgICAgICAxMwotI2RlZmluZSBSRVNfVklPICAgICAgICAgICAgICAgICAxNAotI2RlZmluZSBSRVNfVkREMSAgICAgICAgICAgICAgICAxNQotI2RlZmluZSBSRVNfVkREMiAgICAgICAgICAgICAgICAxNgotI2RlZmluZSBSRVNfVlVTQl8xVjUgICAgICAgICAgICAxNwotI2RlZmluZSBSRVNfVlVTQl8xVjggICAgICAgICAgICAxOAotI2RlZmluZSBSRVNfVlVTQl8zVjEgICAgICAgICAgICAxOQotI2RlZmluZSBSRVNfVlVTQkNQICAgICAgICAgICAgICAyMAotI2RlZmluZSBSRVNfUkVHRU4gICAgICAgICAgICAgICAyMQotLyogUmVzZXQgYW5kIGNvbnRyb2wgKi8KLSNkZWZpbmUgUkVTX05SRVNfUFdST04gICAgICAgICAgMjIKLSNkZWZpbmUgUkVTX0NMS0VOICAgICAgICAgICAgICAgMjMKLSNkZWZpbmUgUkVTX1NZU0VOICAgICAgICAgICAgICAgMjQKLSNkZWZpbmUgUkVTX0hGQ0xLT1VUICAgICAgICAgICAgMjUKLSNkZWZpbmUgUkVTXzMyS0NMS09VVCAgICAgICAgICAgMjYKLSNkZWZpbmUgUkVTX1JFU0VUICAgICAgICAgICAgICAgMjcKLS8qIFBvd2VyIFJlZmVyZW5jZSAqLwotI2RlZmluZSBSRVNfTWFpbl9SZWYgICAgICAgICAgICAyOAotCi0jZGVmaW5lIFRPVEFMX1JFU09VUkNFUwkJMjgKLS8qCi0gKiBQb3dlciBCdXMgTWVzc2FnZSBGb3JtYXQgLi4uIHRoZXNlIGNhbiBiZSBzZW50IGluZGl2aWR1YWxseSBieSBMaW51eCwKLSAqIGJ1dCBhcmUgdXN1YWxseSBwYXJ0IG9mIGRvd25sb2FkZWQgc2NyaXB0cyB0aGF0IGFyZSBydW4gd2hlbiB2YXJpb3VzCi0gKiBwb3dlciBldmVudHMgYXJlIHRyaWdnZXJlZC4KLSAqCi0gKiAgQnJvYWRjYXN0IE1lc3NhZ2UgKDE2IEJpdHMpOgotICogICAgREVWX0dSUFsxNToxM10gTVRbMTJdICBSRVNfR1JQWzExOjldICBSRVNfVFlQRTJbODo3XSBSRVNfVFlQRVs2OjRdCi0gKiAgICBSRVNfU1RBVEVbMzowXQotICoKLSAqICBTaW5ndWxhciBNZXNzYWdlICgxNiBCaXRzKToKLSAqICAgIERFVl9HUlBbMTU6MTNdIE1UWzEyXSAgUkVTX0lEWzExOjRdICBSRVNfU1RBVEVbMzowXQotICovCi0KLSNkZWZpbmUgTVNHX0JST0FEQ0FTVChkZXZncnAsIGdycCwgdHlwZSwgdHlwZTIsIHN0YXRlKSBcCi0JKCAoZGV2Z3JwKSA8PCAxMyB8IDEgPDwgMTIgfCAoZ3JwKSA8PCA5IHwgKHR5cGUyKSA8PCA3IFwKLQl8ICh0eXBlKSA8PCA0IHwgKHN0YXRlKSkKLQotI2RlZmluZSBNU0dfU0lOR1VMQVIoZGV2Z3JwLCBpZCwgc3RhdGUpIFwKLQkoKGRldmdycCkgPDwgMTMgfCAwIDw8IDEyIHwgKGlkKSA8PCA0IHwgKHN0YXRlKSkKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RydWN0IHR3bDQwMzBfYmNpX3BsYXRmb3JtX2RhdGEgewotCWludCAqYmF0dGVyeV90bXBfdGJsOwotCXVuc2lnbmVkIGludCB0YmxzaXplOwotfTsKLQotLyogVFdMNDAzMF9HUElPX01BWCAoMTgpIEdQSU9zLCB3aXRoIGludGVycnVwdHMgKi8KLXN0cnVjdCB0d2w0MDMwX2dwaW9fcGxhdGZvcm1fZGF0YSB7Ci0JaW50CQlncGlvX2Jhc2U7Ci0JdW5zaWduZWQJaXJxX2Jhc2UsIGlycV9lbmQ7Ci0KLQkvKiBwYWNrYWdlIHRoZSB0d28gTEVEIHNpZ25hbHMgYXMgb3V0cHV0LW9ubHkgR1BJT3M/ICovCi0JYm9vbAkJdXNlX2xlZHM7Ci0KLQkvKiBncGlvLW4gc2hvdWxkIGNvbnRyb2wgVk1NQyhuKzEpIGlmIEJJVChuKSBpbiBtbWNfY2QgaXMgc2V0ICovCi0JdTgJCW1tY19jZDsKLQotCS8qIGlmIEJJVChOKSBpcyBzZXQsIG9yIFZNTUMobisxKSBpcyBsaW5rZWQsIGRlYm91bmNlIEdQSU8tTiAqLwotCXUzMgkJZGVib3VuY2U7Ci0KLQkvKiBGb3IgZ3Bpby1OLCBiaXQgKDEgPDwgTikgaW4gInB1bGx1cHMiIGlzIHNldCBpZiB0aGF0IHB1bGx1cAotCSAqIHNob3VsZCBiZSBlbmFibGVkLiAgRWxzZSwgaWYgdGhhdCBiaXQgaXMgc2V0IGluICJwdWxsZG93bnMiLAotCSAqIHRoYXQgcHVsbGRvd24gaXMgZW5hYmxlZC4gIERvbid0IHdhc3RlIHBvd2VyIGJ5IGxldHRpbmcgYW55Ci0JICogZGlnaXRhbCBpbnB1dHMgZmxvYXQuLi4KLQkgKi8KLQl1MzIJCXB1bGx1cHM7Ci0JdTMyCQlwdWxsZG93bnM7Ci0KLQlpbnQJCSgqc2V0dXApKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQl1bnNpZ25lZCBncGlvLCB1bnNpZ25lZCBuZ3Bpbyk7Ci0JaW50CQkoKnRlYXJkb3duKShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJdW5zaWduZWQgZ3BpbywgdW5zaWduZWQgbmdwaW8pOwotfTsKLQotc3RydWN0IHR3bDQwMzBfbWFkY19wbGF0Zm9ybV9kYXRhIHsKLQlpbnQJCWlycV9saW5lOwotfTsKLQotLyogQm9hcmRzIGhhdmUgdW5pcWUgbWFwcGluZ3Mgb2Yge3JvdywgY29sfSAtLT4ga2V5Y29kZS4KLSAqIENvbHVtbiBhbmQgcm93IGFyZSA4IGJpdHMgZWFjaCwgYnV0IHJhbmdlIG9ubHkgZnJvbSAwLi43LgotICogYSBQRVJTSVNURU5UX0tFWSBpcyAiYWx3YXlzIG9uIiBhbmQgbmV2ZXIgcmVwb3J0ZWQuCi0gKi8KLSNkZWZpbmUgUEVSU0lTVEVOVF9LRVkociwgYykJS0VZKChyKSwgKGMpLCBLRVlfUkVTRVJWRUQpCi0KLXN0cnVjdCB0d2w0MDMwX2tleXBhZF9kYXRhIHsKLQljb25zdCBzdHJ1Y3QgbWF0cml4X2tleW1hcF9kYXRhICprZXltYXBfZGF0YTsKLQl1bnNpZ25lZCByb3dzOwotCXVuc2lnbmVkIGNvbHM7Ci0JYm9vbCByZXA7Ci19OwotCi1lbnVtIHR3bDQwMzBfdXNiX21vZGUgewotCVQyX1VTQl9NT0RFX1VMUEkgPSAxLAotCVQyX1VTQl9NT0RFX0NFQTIwMTFfM1BJTiA9IDIsCi19OwotCi1zdHJ1Y3QgdHdsNDAzMF91c2JfZGF0YSB7Ci0JZW51bSB0d2w0MDMwX3VzYl9tb2RlCXVzYl9tb2RlOwotfTsKLQotc3RydWN0IHR3bDQwMzBfaW5zIHsKLQl1MTYgcG1iX21lc3NhZ2U7Ci0JdTggZGVsYXk7Ci19OwotCi1zdHJ1Y3QgdHdsNDAzMF9zY3JpcHQgewotCXN0cnVjdCB0d2w0MDMwX2lucyAqc2NyaXB0OwotCXVuc2lnbmVkIHNpemU7Ci0JdTggZmxhZ3M7Ci0jZGVmaW5lIFRXTDQwMzBfV1JTVF9TQ1JJUFQJKDE8PDApCi0jZGVmaW5lIFRXTDQwMzBfV0FLRVVQMTJfU0NSSVBUCSgxPDwxKQotI2RlZmluZSBUV0w0MDMwX1dBS0VVUDNfU0NSSVBUCSgxPDwyKQotI2RlZmluZSBUV0w0MDMwX1NMRUVQX1NDUklQVAkoMTw8MykKLX07Ci0KLXN0cnVjdCB0d2w0MDMwX3Jlc2NvbmZpZyB7Ci0JdTggcmVzb3VyY2U7Ci0JdTggZGV2Z3JvdXA7CS8qIFByb2Nlc3NvciBncm91cCB0aGF0IFBvd2VyIHJlc291cmNlIGJlbG9uZ3MgdG8gKi8KLQl1OCB0eXBlOwkvKiBQb3dlciByZXNvdXJjZSBhZGRyZXNzZWQsIDYgLyBicm9hZGNhc3QgbWVzc2FnZSAqLwotCXU4IHR5cGUyOwkvKiBQb3dlciByZXNvdXJjZSBhZGRyZXNzZWQsIDMgLyBicm9hZGNhc3QgbWVzc2FnZSAqLwotfTsKLQotc3RydWN0IHR3bDQwMzBfcG93ZXJfZGF0YSB7Ci0Jc3RydWN0IHR3bDQwMzBfc2NyaXB0ICoqc2NyaXB0czsKLQl1bnNpZ25lZCBudW07Ci0Jc3RydWN0IHR3bDQwMzBfcmVzY29uZmlnICpyZXNvdXJjZV9jb25maWc7Ci19OwotCi1leHRlcm4gdm9pZCB0d2w0MDMwX3Bvd2VyX2luaXQoc3RydWN0IHR3bDQwMzBfcG93ZXJfZGF0YSAqdHJpdG9uMl9zY3JpcHRzKTsKLQotc3RydWN0IHR3bDQwMzBfY29kZWNfYXVkaW9fZGF0YSB7Ci0JdW5zaWduZWQgaW50CWF1ZGlvX21jbGs7Ci0JdW5zaWduZWQgaW50IHJhbXBfZGVsYXlfdmFsdWU7Ci0JdW5zaWduZWQgaW50IGhzX2V4dG11dGU6MTsKLQl2b2lkICgqc2V0X2hzX2V4dG11dGUpKGludCBtdXRlKTsKLX07Ci0KLXN0cnVjdCB0d2w0MDMwX2NvZGVjX3ZpYnJhX2RhdGEgewotCXVuc2lnbmVkIGludAlhdWRpb19tY2xrOwotCXVuc2lnbmVkIGludAljb2V4aXN0OwotfTsKLQotc3RydWN0IHR3bDQwMzBfY29kZWNfZGF0YSB7Ci0JdW5zaWduZWQgaW50CWF1ZGlvX21jbGs7Ci0Jc3RydWN0IHR3bDQwMzBfY29kZWNfYXVkaW9fZGF0YQkJKmF1ZGlvOwotCXN0cnVjdCB0d2w0MDMwX2NvZGVjX3ZpYnJhX2RhdGEJCSp2aWJyYTsKLX07Ci0KLXN0cnVjdCB0d2w0MDMwX3BsYXRmb3JtX2RhdGEgewotCXVuc2lnbmVkCQkJCWlycV9iYXNlLCBpcnFfZW5kOwotCXN0cnVjdCB0d2w0MDMwX2JjaV9wbGF0Zm9ybV9kYXRhCSpiY2k7Ci0Jc3RydWN0IHR3bDQwMzBfZ3Bpb19wbGF0Zm9ybV9kYXRhCSpncGlvOwotCXN0cnVjdCB0d2w0MDMwX21hZGNfcGxhdGZvcm1fZGF0YQkqbWFkYzsKLQlzdHJ1Y3QgdHdsNDAzMF9rZXlwYWRfZGF0YQkJKmtleXBhZDsKLQlzdHJ1Y3QgdHdsNDAzMF91c2JfZGF0YQkJCSp1c2I7Ci0Jc3RydWN0IHR3bDQwMzBfcG93ZXJfZGF0YQkJKnBvd2VyOwotCXN0cnVjdCB0d2w0MDMwX2NvZGVjX2RhdGEJCSpjb2RlYzsKLQotCS8qIExETyByZWd1bGF0b3JzICovCi0Jc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEJCSp2ZGFjOwotCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhCQkqdnBsbDE7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEJCSp2cGxsMjsKLQlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YQkJKnZtbWMxOwotCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhCQkqdm1tYzI7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEJCSp2c2ltOwotCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhCQkqdmF1eDE7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEJCSp2YXV4MjsKLQlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YQkJKnZhdXgzOwotCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhCQkqdmF1eDQ7Ci0KLQkvKiBSRVZJU0lUIG1vcmUgdG8gY29tZSAuLi4gX25vdGhpbmdfIHNob3VsZCBiZSBoYXJkLXdpcmVkICovCi19OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1pbnQgdHdsNDAzMF9zaWhfc2V0dXAoaW50IG1vZHVsZSk7Ci0KLS8qIE9mZnNldHMgdG8gUG93ZXIgUmVnaXN0ZXJzICovCi0jZGVmaW5lIFRXTDQwMzBfVkRBQ19ERVZfR1JQCQkweDNCCi0jZGVmaW5lIFRXTDQwMzBfVkRBQ19ERURJQ0FURUQJCTB4M0UKLSNkZWZpbmUgVFdMNDAzMF9WQVVYMV9ERVZfR1JQCQkweDE3Ci0jZGVmaW5lIFRXTDQwMzBfVkFVWDFfREVESUNBVEVECQkweDFBCi0jZGVmaW5lIFRXTDQwMzBfVkFVWDJfREVWX0dSUAkJMHgxQgotI2RlZmluZSBUV0w0MDMwX1ZBVVgyX0RFRElDQVRFRAkJMHgxRQotI2RlZmluZSBUV0w0MDMwX1ZBVVgzX0RFVl9HUlAJCTB4MUYKLSNkZWZpbmUgVFdMNDAzMF9WQVVYM19ERURJQ0FURUQJCTB4MjIKLQotI2lmIGRlZmluZWQoQ09ORklHX1RXTDQwMzBfQkNJX0JBVFRFUlkpIHx8IFwKLQlkZWZpbmVkKENPTkZJR19UV0w0MDMwX0JDSV9CQVRURVJZX01PRFVMRSkKLQlleHRlcm4gaW50IHR3bDQwMzBjaGFyZ2VyX3VzYl9lbihpbnQgZW5hYmxlKTsKLSNlbHNlCi0Jc3RhdGljIGlubGluZSBpbnQgdHdsNDAzMGNoYXJnZXJfdXNiX2VuKGludCBlbmFibGUpIHsgcmV0dXJuIDA7IH0KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBMaW51eC1zcGVjaWZpYyByZWd1bGF0b3IgaWRlbnRpZmllcnMgLi4uIGZvciBub3csIHdlIG9ubHkgc3VwcG9ydAotICogdGhlIExET3MsIGFuZCBsZWF2ZSB0aGUgdGhyZWUgYnVjayBjb252ZXJ0ZXJzIGFsb25lLiAgVkREMSBhbmQgVkREMgotICogbmVlZCB0byB0aWUgaW50byBoYXJkd2FyZSBiYXNlZCB2b2x0YWdlIHNjYWxpbmcgKGNwdWZyZXEgZXRjKSwgd2hpbGUKLSAqIFZJTyBpcyBnZW5lcmFsbHkgZml4ZWQuCi0gKi8KLQotLyogRVhURVJOQUwgZGMtdG8tZGMgYnVjayBjb252ZXJ0ZXJzICovCi0jZGVmaW5lIFRXTDQwMzBfUkVHX1ZERDEJMAotI2RlZmluZSBUV0w0MDMwX1JFR19WREQyCTEKLSNkZWZpbmUgVFdMNDAzMF9SRUdfVklPCQkyCi0KLS8qIEVYVEVSTkFMIExET3MgKi8KLSNkZWZpbmUgVFdMNDAzMF9SRUdfVkRBQwkzCi0jZGVmaW5lIFRXTDQwMzBfUkVHX1ZQTEwxCTQKLSNkZWZpbmUgVFdMNDAzMF9SRUdfVlBMTDIJNQkvKiBub3Qgb24gYWxsIGNoaXBzICovCi0jZGVmaW5lIFRXTDQwMzBfUkVHX1ZNTUMxCTYKLSNkZWZpbmUgVFdMNDAzMF9SRUdfVk1NQzIJNwkvKiBub3Qgb24gYWxsIGNoaXBzICovCi0jZGVmaW5lIFRXTDQwMzBfUkVHX1ZTSU0JOAkvKiBub3Qgb24gYWxsIGNoaXBzICovCi0jZGVmaW5lIFRXTDQwMzBfUkVHX1ZBVVgxCTkJLyogbm90IG9uIGFsbCBjaGlwcyAqLwotI2RlZmluZSBUV0w0MDMwX1JFR19WQVVYMl80MDMwCTEwCS8qICh0d2w0MDMwLXNwZWNpZmljKSAqLwotI2RlZmluZSBUV0w0MDMwX1JFR19WQVVYMgkxMQkvKiAodHdsNTAzMCBhbmQgbmV3ZXIpICovCi0jZGVmaW5lIFRXTDQwMzBfUkVHX1ZBVVgzCTEyCS8qIG5vdCBvbiBhbGwgY2hpcHMgKi8KLSNkZWZpbmUgVFdMNDAzMF9SRUdfVkFVWDQJMTMJLyogbm90IG9uIGFsbCBjaGlwcyAqLwotCi0vKiBJTlRFUk5BTCBMRE9zICovCi0jZGVmaW5lIFRXTDQwMzBfUkVHX1ZJTlRBTkExCTE0Ci0jZGVmaW5lIFRXTDQwMzBfUkVHX1ZJTlRBTkEyCTE1Ci0jZGVmaW5lIFRXTDQwMzBfUkVHX1ZJTlRESUcJMTYKLSNkZWZpbmUgVFdMNDAzMF9SRUdfVlVTQjFWNQkxNwotI2RlZmluZSBUV0w0MDMwX1JFR19WVVNCMVY4CTE4Ci0jZGVmaW5lIFRXTDQwMzBfUkVHX1ZVU0IzVjEJMTkKLQotI2VuZGlmIC8qIEVuZCBvZiBfX1RXTDQwMzBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl9ldGhlci5oIGIvaW5jbHVkZS9saW51eC9pZl9ldGhlci5oCmluZGV4IDAwNWUxNTIuLjI5OWI0MTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfZXRoZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX2V0aGVyLmgKQEAgLTEzNyw4ICsxMzcsNiBAQAogZXh0ZXJuIHNzaXplX3Qgc3lzZnNfZm9ybWF0X21hYyhjaGFyICpidWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsIGludCBsZW4pOwogCiAjZGVmaW5lIE1BQ19GTVQgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IgotI2RlZmluZSBNQUNfQlVGX1NJWkUJMTgKLSNkZWZpbmUgREVDTEFSRV9NQUNfQlVGKHZhcikgY2hhciB2YXJbTUFDX0JVRl9TSVpFXQogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pc2ljb20uaCBiL2luY2x1ZGUvbGludXgvaXNpY29tLmgKaW5kZXggYmJkNDIxOS4uYjkyZTA1NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pc2ljb20uaAorKysgYi9pbmNsdWRlL2xpbnV4L2lzaWNvbS5oCkBAIC02Nyw2ICs2Nyw3IEBACiAKICNkZWZpbmUJCUZJUk1XQVJFX0xPQURFRAkJMHgwMDAxCiAjZGVmaW5lCQlCT0FSRF9BQ1RJVkUJCTB4MDAwMgorI2RlZmluZQkJQk9BUkRfSU5JVAkJMHgwMDA0CiAKICAJLyogaXNpX3BvcnQgc3RhdHVzIGJpdG1hcCAgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rdm0uaCBiL2luY2x1ZGUvbGludXgva3ZtLmgKaW5kZXggMmQyNDFkYS4uYTI0ZGUwYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rdm0uaAorKysgYi9pbmNsdWRlL2xpbnV4L2t2bS5oCkBAIC00OTYsNiArNDk2LDcgQEAKICNkZWZpbmUgS1ZNX0NBUF9WQ1BVX0VWRU5UUyA0MQogI2VuZGlmCiAjZGVmaW5lIEtWTV9DQVBfUzM5MF9QU1cgNDIKKyNkZWZpbmUgS1ZNX0NBUF9QUENfU0VHU1RBVEUgNDMKIAogI2lmZGVmIEtWTV9DQVBfSVJRX1JPVVRJTkcKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvODhwbTg2MDcuaCBiL2luY2x1ZGUvbGludXgvbWZkLzg4cG04NjA3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQxYjQyOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkLzg4cG04NjA3LmgKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiBNYXJ2ZWxsIDg4UE04NjA3IEludGVyZmFjZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLgorICogCUhhb2ppYW4gWmh1YW5nIDxoYW9qaWFuLnpodWFuZ0BtYXJ2ZWxsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9NRkRfODhQTTg2MDdfSAorI2RlZmluZSBfX0xJTlVYX01GRF84OFBNODYwN19ICisKK2VudW0geworCVBNODYwN19JRF9CVUNLMSA9IDAsCisJUE04NjA3X0lEX0JVQ0syLAorCVBNODYwN19JRF9CVUNLMywKKworCVBNODYwN19JRF9MRE8xLAorCVBNODYwN19JRF9MRE8yLAorCVBNODYwN19JRF9MRE8zLAorCVBNODYwN19JRF9MRE80LAorCVBNODYwN19JRF9MRE81LAorCVBNODYwN19JRF9MRE82LAorCVBNODYwN19JRF9MRE83LAorCVBNODYwN19JRF9MRE84LAorCVBNODYwN19JRF9MRE85LAorCVBNODYwN19JRF9MRE8xMCwKKwlQTTg2MDdfSURfTERPMTIsCisJUE04NjA3X0lEX0xETzE0LAorCisJUE04NjA3X0lEX1JHX01BWCwKK307CisKKyNkZWZpbmUgQ0hJUF9JRAkJCQkoMHg0MCkKKyNkZWZpbmUgQ0hJUF9JRF9NQVNLCQkJKDB4RjgpCisKKy8qIEludGVycnVwdCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgUE04NjA3X1NUQVRVU18xCQkJKDB4MDEpCisjZGVmaW5lIFBNODYwN19TVEFUVVNfMgkJCSgweDAyKQorI2RlZmluZSBQTTg2MDdfSU5UX1NUQVRVUzEJCSgweDAzKQorI2RlZmluZSBQTTg2MDdfSU5UX1NUQVRVUzIJCSgweDA0KQorI2RlZmluZSBQTTg2MDdfSU5UX1NUQVRVUzMJCSgweDA1KQorI2RlZmluZSBQTTg2MDdfSU5UX01BU0tfMQkJKDB4MDYpCisjZGVmaW5lIFBNODYwN19JTlRfTUFTS18yCQkoMHgwNykKKyNkZWZpbmUgUE04NjA3X0lOVF9NQVNLXzMJCSgweDA4KQorCisvKiBSZWd1bGF0b3IgQ29udHJvbCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgUE04NjA3X0xETzEJCQkoMHgxMCkKKyNkZWZpbmUgUE04NjA3X0xETzIJCQkoMHgxMSkKKyNkZWZpbmUgUE04NjA3X0xETzMJCQkoMHgxMikKKyNkZWZpbmUgUE04NjA3X0xETzQJCQkoMHgxMykKKyNkZWZpbmUgUE04NjA3X0xETzUJCQkoMHgxNCkKKyNkZWZpbmUgUE04NjA3X0xETzYJCQkoMHgxNSkKKyNkZWZpbmUgUE04NjA3X0xETzcJCQkoMHgxNikKKyNkZWZpbmUgUE04NjA3X0xETzgJCQkoMHgxNykKKyNkZWZpbmUgUE04NjA3X0xETzkJCQkoMHgxOCkKKyNkZWZpbmUgUE04NjA3X0xETzEwCQkJKDB4MTkpCisjZGVmaW5lIFBNODYwN19MRE8xMgkJCSgweDFBKQorI2RlZmluZSBQTTg2MDdfTERPMTQJCQkoMHgxQikKKyNkZWZpbmUgUE04NjA3X1NMRUVQX01PREUxCQkoMHgxQykKKyNkZWZpbmUgUE04NjA3X1NMRUVQX01PREUyCQkoMHgxRCkKKyNkZWZpbmUgUE04NjA3X1NMRUVQX01PREUzCQkoMHgxRSkKKyNkZWZpbmUgUE04NjA3X1NMRUVQX01PREU0CQkoMHgxRikKKyNkZWZpbmUgUE04NjA3X0dPCQkJKDB4MjApCisjZGVmaW5lIFBNODYwN19TTEVFUF9CVUNLMQkJKDB4MjEpCisjZGVmaW5lIFBNODYwN19TTEVFUF9CVUNLMgkJKDB4MjIpCisjZGVmaW5lIFBNODYwN19TTEVFUF9CVUNLMwkJKDB4MjMpCisjZGVmaW5lIFBNODYwN19CVUNLMQkJCSgweDI0KQorI2RlZmluZSBQTTg2MDdfQlVDSzIJCQkoMHgyNSkKKyNkZWZpbmUgUE04NjA3X0JVQ0szCQkJKDB4MjYpCisjZGVmaW5lIFBNODYwN19CVUNLX0NPTlRST0xTCQkoMHgyNykKKyNkZWZpbmUgUE04NjA3X1NVUFBMSUVTX0VOMTEJCSgweDJCKQorI2RlZmluZSBQTTg2MDdfU1VQUExJRVNfRU4xMgkJKDB4MkMpCisjZGVmaW5lIFBNODYwN19HUk9VUDEJCQkoMHgyRCkKKyNkZWZpbmUgUE04NjA3X0dST1VQMgkJCSgweDJFKQorI2RlZmluZSBQTTg2MDdfR1JPVVAzCQkJKDB4MkYpCisjZGVmaW5lIFBNODYwN19HUk9VUDQJCQkoMHgzMCkKKyNkZWZpbmUgUE04NjA3X0dST1VQNQkJCSgweDMxKQorI2RlZmluZSBQTTg2MDdfR1JPVVA2CQkJKDB4MzIpCisjZGVmaW5lIFBNODYwN19TVVBQTElFU19FTjIxCQkoMHgzMykKKyNkZWZpbmUgUE04NjA3X1NVUFBMSUVTX0VOMjIJCSgweDM0KQorCisvKiBSVEMgQ29udHJvbCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgUE04NjA3X1JUQzEJCQkoMHhBMCkKKyNkZWZpbmUgUE04NjA3X1JUQ19DT1VOVEVSMQkJKDB4QTEpCisjZGVmaW5lIFBNODYwN19SVENfQ09VTlRFUjIJCSgweEEyKQorI2RlZmluZSBQTTg2MDdfUlRDX0NPVU5URVIzCQkoMHhBMykKKyNkZWZpbmUgUE04NjA3X1JUQ19DT1VOVEVSNAkJKDB4QTQpCisjZGVmaW5lIFBNODYwN19SVENfRVhQSVJFMQkJKDB4QTUpCisjZGVmaW5lIFBNODYwN19SVENfRVhQSVJFMgkJKDB4QTYpCisjZGVmaW5lIFBNODYwN19SVENfRVhQSVJFMwkJKDB4QTcpCisjZGVmaW5lIFBNODYwN19SVENfRVhQSVJFNAkJKDB4QTgpCisjZGVmaW5lIFBNODYwN19SVENfVFJJTTEJCSgweEE5KQorI2RlZmluZSBQTTg2MDdfUlRDX1RSSU0yCQkoMHhBQSkKKyNkZWZpbmUgUE04NjA3X1JUQ19UUklNMwkJKDB4QUIpCisjZGVmaW5lIFBNODYwN19SVENfVFJJTTQJCSgweEFDKQorI2RlZmluZSBQTTg2MDdfUlRDX01JU0MxCQkoMHhBRCkKKyNkZWZpbmUgUE04NjA3X1JUQ19NSVNDMgkJKDB4QUUpCisjZGVmaW5lIFBNODYwN19SVENfTUlTQzMJCSgweEFGKQorCisvKiBNaXNjIFJlZ2lzdGVycyAqLworI2RlZmluZSBQTTg2MDdfQ0hJUF9JRAkJCSgweDAwKQorI2RlZmluZSBQTTg2MDdfTERPMQkJCSgweDEwKQorI2RlZmluZSBQTTg2MDdfRFZDMwkJCSgweDI2KQorI2RlZmluZSBQTTg2MDdfTUlTQzEJCQkoMHg0MCkKKworLyogYml0IGRlZmluaXRpb25zIGZvciBQTTg2MDcgZXZlbnRzICovCisjZGVmaW5lIFBNODYwN19FVkVOVF9PTktFWQkJKDEgPDwgMCkKKyNkZWZpbmUgUE04NjA3X0VWRU5UX0VYVE9OCQkoMSA8PCAxKQorI2RlZmluZSBQTTg2MDdfRVZFTlRfQ0hHCQkoMSA8PCAyKQorI2RlZmluZSBQTTg2MDdfRVZFTlRfQkFUCQkoMSA8PCAzKQorI2RlZmluZSBQTTg2MDdfRVZFTlRfUlRDCQkoMSA8PCA0KQorI2RlZmluZSBQTTg2MDdfRVZFTlRfQ0MJCQkoMSA8PCA1KQorI2RlZmluZSBQTTg2MDdfRVZFTlRfVkJBVAkJKDEgPDwgOCkKKyNkZWZpbmUgUE04NjA3X0VWRU5UX1ZDSEcJCSgxIDw8IDkpCisjZGVmaW5lIFBNODYwN19FVkVOVF9WU1lTCQkoMSA8PCAxMCkKKyNkZWZpbmUgUE04NjA3X0VWRU5UX1RJTlQJCSgxIDw8IDExKQorI2RlZmluZSBQTTg2MDdfRVZFTlRfR1BBREMwCQkoMSA8PCAxMikKKyNkZWZpbmUgUE04NjA3X0VWRU5UX0dQQURDMQkJKDEgPDwgMTMpCisjZGVmaW5lIFBNODYwN19FVkVOVF9HUEFEQzIJCSgxIDw8IDE0KQorI2RlZmluZSBQTTg2MDdfRVZFTlRfR1BBREMzCQkoMSA8PCAxNSkKKyNkZWZpbmUgUE04NjA3X0VWRU5UX0FVRElPX1NIT1JUCSgxIDw8IDE2KQorI2RlZmluZSBQTTg2MDdfRVZFTlRfUEVOCQkoMSA8PCAxNykKKyNkZWZpbmUgUE04NjA3X0VWRU5UX0hFQURTRVQJCSgxIDw8IDE4KQorI2RlZmluZSBQTTg2MDdfRVZFTlRfSE9PSwkJKDEgPDwgMTkpCisjZGVmaW5lIFBNODYwN19FVkVOVF9NSUNJTgkJKDEgPDwgMjApCisjZGVmaW5lIFBNODYwN19FVkVOVF9DSEdfVElNRU9VVAkoMSA8PCAyMSkKKyNkZWZpbmUgUE04NjA3X0VWRU5UX0NIR19ET05FCQkoMSA8PCAyMikKKyNkZWZpbmUgUE04NjA3X0VWRU5UX0NIR19GQVVMVAkJKDEgPDwgMjMpCisKKy8qIGJpdCBkZWZpbml0aW9ucyBvZiBTdGF0dXMgUXVlcnkgSW50ZXJmYWNlICovCisjZGVmaW5lIFBNODYwN19TVEFUVVNfQ0MJCSgxIDw8IDMpCisjZGVmaW5lIFBNODYwN19TVEFUVVNfUEVOCQkoMSA8PCA0KQorI2RlZmluZSBQTTg2MDdfU1RBVFVTX0hFQURTRVQJCSgxIDw8IDUpCisjZGVmaW5lIFBNODYwN19TVEFUVVNfSE9PSwkJKDEgPDwgNikKKyNkZWZpbmUgUE04NjA3X1NUQVRVU19NSUNJTgkJKDEgPDwgNykKKyNkZWZpbmUgUE04NjA3X1NUQVRVU19PTktFWQkJKDEgPDwgOCkKKyNkZWZpbmUgUE04NjA3X1NUQVRVU19FWFRPTgkJKDEgPDwgOSkKKyNkZWZpbmUgUE04NjA3X1NUQVRVU19DSEcJCSgxIDw8IDEwKQorI2RlZmluZSBQTTg2MDdfU1RBVFVTX0JBVAkJKDEgPDwgMTEpCisjZGVmaW5lIFBNODYwN19TVEFUVVNfVkJVUwkJKDEgPDwgMTIpCisjZGVmaW5lIFBNODYwN19TVEFUVVNfT1YJCSgxIDw8IDEzKQorCisvKiBiaXQgZGVmaW5pdGlvbnMgb2YgQlVDSzMgKi8KKyNkZWZpbmUgUE04NjA3X0JVQ0szX0RPVUJMRQkJKDEgPDwgNikKKworLyogYml0IGRlZmluaXRpb25zIG9mIE1pc2MxICovCisjZGVmaW5lIFBNODYwN19NSVNDMV9QSTJDCQkoMSA8PCAwKQorCisvKiBJbnRlcnJ1cHQgTnVtYmVyIGluIDg4UE04NjA3ICovCitlbnVtIHsKKwlQTTg2MDdfSVJRX09OS0VZID0gMCwKKwlQTTg2MDdfSVJRX0VYVE9OLAorCVBNODYwN19JUlFfQ0hHLAorCVBNODYwN19JUlFfQkFULAorCVBNODYwN19JUlFfUlRDLAorCVBNODYwN19JUlFfVkJBVCA9IDgsCisJUE04NjA3X0lSUV9WQ0hHLAorCVBNODYwN19JUlFfVlNZUywKKwlQTTg2MDdfSVJRX1RJTlQsCisJUE04NjA3X0lSUV9HUEFEQzAsCisJUE04NjA3X0lSUV9HUEFEQzEsCisJUE04NjA3X0lSUV9HUEFEQzIsCisJUE04NjA3X0lSUV9HUEFEQzMsCisJUE04NjA3X0lSUV9BVURJT19TSE9SVCA9IDE2LAorCVBNODYwN19JUlFfUEVOLAorCVBNODYwN19JUlFfSEVBRFNFVCwKKwlQTTg2MDdfSVJRX0hPT0ssCisJUE04NjA3X0lSUV9NSUNJTiwKKwlQTTg2MDdfSVJRX0NIR19GQUlMLAorCVBNODYwN19JUlFfQ0hHX0RPTkUsCisJUE04NjA3X0lSUV9DSEdfRkFVTFQsCit9OworCitlbnVtIHsKKwlQTTg2MDdfQ0hJUF9BMCA9IDB4NDAsCisJUE04NjA3X0NISVBfQTEgPSAweDQxLAorCVBNODYwN19DSElQX0IwID0gMHg0OCwKK307CisKKworc3RydWN0IHBtODYwN19jaGlwIHsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworCXN0cnVjdCBtdXRleAkJaW9fbG9jazsKKwlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OworCisJaW50ICgqcmVhZCkoc3RydWN0IHBtODYwN19jaGlwICpjaGlwLCBpbnQgcmVnLCBpbnQgYnl0ZXMsIHZvaWQgKmRlc3QpOworCWludCAoKndyaXRlKShzdHJ1Y3QgcG04NjA3X2NoaXAgKmNoaXAsIGludCByZWcsIGludCBieXRlcywgdm9pZCAqc3JjKTsKKworCWludAkJCWJ1Y2szX2RvdWJsZTsJLyogRFZDIHJhbXAgc2xvcGUgZG91YmxlICovCisJdW5zaWduZWQgY2hhcgkJY2hpcF9pZDsKKworfTsKKworI2RlZmluZSBQTTg2MDdfTUFYX1JFR1VMQVRPUgkxNQkvKiAzIEJ1Y2tzLCAxMiBMRE9zICovCisKK2VudW0geworCUdJMkNfUE9SVCA9IDAsCisJUEkyQ19QT1JULAorfTsKKworc3RydWN0IHBtODYwN19wbGF0Zm9ybV9kYXRhIHsKKwlpbnQJaTJjX3BvcnQ7CS8qIENvbnRyb2xsZWQgYnkgR0kyQyBvciBQSTJDICovCisJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgKnJlZ3VsYXRvcltQTTg2MDdfTUFYX1JFR1VMQVRPUl07Cit9OworCitleHRlcm4gaW50IHBtODYwN19yZWdfcmVhZChzdHJ1Y3QgcG04NjA3X2NoaXAgKiwgaW50KTsKK2V4dGVybiBpbnQgcG04NjA3X3JlZ193cml0ZShzdHJ1Y3QgcG04NjA3X2NoaXAgKiwgaW50LCB1bnNpZ25lZCBjaGFyKTsKK2V4dGVybiBpbnQgcG04NjA3X2J1bGtfcmVhZChzdHJ1Y3QgcG04NjA3X2NoaXAgKiwgaW50LCBpbnQsCisJCQkgICAgdW5zaWduZWQgY2hhciAqKTsKK2V4dGVybiBpbnQgcG04NjA3X2J1bGtfd3JpdGUoc3RydWN0IHBtODYwN19jaGlwICosIGludCwgaW50LAorCQkJICAgICB1bnNpZ25lZCBjaGFyICopOworZXh0ZXJuIGludCBwbTg2MDdfc2V0X2JpdHMoc3RydWN0IHBtODYwN19jaGlwICosIGludCwgdW5zaWduZWQgY2hhciwKKwkJCSAgIHVuc2lnbmVkIGNoYXIpOworI2VuZGlmIC8qIF9fTElOVVhfTUZEXzg4UE04NjA3X0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2FiNDUwMC5oIGIvaW5jbHVkZS9saW51eC9tZmQvYWI0NTAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQyYTcwMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL2FiNDUwMC5oCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFNULUVyaWNzc29uCisgKgorICogQXV0aG9yOiBTcmluaWRoaSBLQVNBR0FSIDxzcmluaWRoaS5rYXNhZ2FyQHN0ZXJpY3Nzb24uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIEFCNDUwMCBkZXZpY2UgY29yZSBmdW50aW9ucywgZm9yIGNsaWVudCBhY2Nlc3MKKyAqLworI2lmbmRlZiBNRkRfQUI0NTAwX0gKKyNkZWZpbmUgTUZEX0FCNDUwMF9ICisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworLyoKKyAqIEFCNDUwMCBiYW5rIGFkZHJlc3NlcworICovCisjZGVmaW5lIEFCNDUwMF9TWVNfQ1RSTDFfQkxPQ0sJMHgxCisjZGVmaW5lIEFCNDUwMF9TWVNfQ1RSTDJfQkxPQ0sJMHgyCisjZGVmaW5lIEFCNDUwMF9SRUdVX0NUUkwxCTB4MworI2RlZmluZSBBQjQ1MDBfUkVHVV9DVFJMMgkweDQKKyNkZWZpbmUgQUI0NTAwX1VTQgkJMHg1CisjZGVmaW5lIEFCNDUwMF9UVk9VVAkJMHg2CisjZGVmaW5lIEFCNDUwMF9EQkkJCTB4NworI2RlZmluZSBBQjQ1MDBfRUNJX0FWX0FDQwkweDgKKyNkZWZpbmUgQUI0NTAwX1JFU0VSVkVECQkweDkKKyNkZWZpbmUgQUI0NTAwX0dQQURDCQkweEEKKyNkZWZpbmUgQUI0NTAwX0NIQVJHRVIJCTB4QgorI2RlZmluZSBBQjQ1MDBfR0FTX0dBVUdFCTB4QworI2RlZmluZSBBQjQ1MDBfQVVESU8JCTB4RAorI2RlZmluZSBBQjQ1MDBfSU5URVJSVVBUCTB4RQorI2RlZmluZSBBQjQ1MDBfUlRDCQkweEYKKyNkZWZpbmUgQUI0NTAwX01JU0MJCTB4MTAKKyNkZWZpbmUgQUI0NTAwX0RFQlVHCQkweDEyCisjZGVmaW5lIEFCNDUwMF9QUk9EX1RFU1QJMHgxMworI2RlZmluZSBBQjQ1MDBfT1RQX0VNVUwJCTB4MTUKKworLyoKKyAqIFN5c3RlbSBjb250cm9sIDEgcmVnaXN0ZXIgb2Zmc2V0cy4KKyAqIEJhbmsgPSAweDAxCisgKi8KKyNkZWZpbmUgQUI0NTAwX1RVUk5PTl9TVEFUX1JFRwkJMHgwMTAwCisjZGVmaW5lIEFCNDUwMF9SRVNFVF9TVEFUX1JFRwkJMHgwMTAxCisjZGVmaW5lIEFCNDUwMF9QT05LRVkxX1BSRVNTX1NUQVRfUkVHCTB4MDEwMgorCisjZGVmaW5lIEFCNDUwMF9GU01fU1RBVDFfUkVHCQkweDAxNDAKKyNkZWZpbmUgQUI0NTAwX0ZTTV9TVEFUMl9SRUcJCTB4MDE0MQorI2RlZmluZSBBQjQ1MDBfU1lTQ0xLX1JFUV9TVEFUX1JFRwkweDAxNDIKKyNkZWZpbmUgQUI0NTAwX1VTQl9TVEFUMV9SRUcJCTB4MDE0MworI2RlZmluZSBBQjQ1MDBfVVNCX1NUQVQyX1JFRwkJMHgwMTQ0CisjZGVmaW5lIEFCNDUwMF9TVEFUVVNfU1BBUkUxX1JFRwkweDAxNDUKKyNkZWZpbmUgQUI0NTAwX1NUQVRVU19TUEFSRTJfUkVHCTB4MDE0NgorCisjZGVmaW5lIEFCNDUwMF9DVFJMMV9SRUcJCTB4MDE4MAorI2RlZmluZSBBQjQ1MDBfQ1RSTDJfUkVHCQkweDAxODEKKworLyoKKyAqIFN5c3RlbSBjb250cm9sIDIgcmVnaXN0ZXIgb2Zmc2V0cy4KKyAqIGJhbmsgPSAweDAyCisgKi8KKyNkZWZpbmUgQUI0NTAwX0NUUkwzX1JFRwkJMHgwMjAwCisjZGVmaW5lIEFCNDUwMF9NQUlOX1dET0dfQ1RSTF9SRUcJMHgwMjAxCisjZGVmaW5lIEFCNDUwMF9NQUlOX1dET0dfVElNRVJfUkVHCTB4MDIwMgorI2RlZmluZSBBQjQ1MDBfTE9XX0JBVF9SRUcJCTB4MDIwMworI2RlZmluZSBBQjQ1MDBfQkFUVF9PS19SRUcJCTB4MDIwNAorI2RlZmluZSBBQjQ1MDBfU1lTQ0xLX1RJTUVSX1JFRwkJMHgwMjA1CisjZGVmaW5lIEFCNDUwMF9TTVBTQ0xLX0NUUkxfUkVHCQkweDAyMDYKKyNkZWZpbmUgQUI0NTAwX1NNUFNDTEtfU0VMMV9SRUcJCTB4MDIwNworI2RlZmluZSBBQjQ1MDBfU01QU0NMS19TRUwyX1JFRwkJMHgwMjA4CisjZGVmaW5lIEFCNDUwMF9TTVBTQ0xLX1NFTDNfUkVHCQkweDAyMDkKKyNkZWZpbmUgQUI0NTAwX1NZU1VMUENMS19DT05GX1JFRwkweDAyMEEKKyNkZWZpbmUgQUI0NTAwX1NZU1VMUENMS19DVFJMMV9SRUcJMHgwMjBCCisjZGVmaW5lIEFCNDUwMF9TWVNDTEtfQ1RSTF9SRUcJCTB4MDIwQworI2RlZmluZSBBQjQ1MDBfU1lTQ0xLX1JFUTFfVkFMSURfUkVHCTB4MDIwRAorI2RlZmluZSBBQjQ1MDBfU1lTQ0xLX1JFUV9WQUxJRF9SRUcJMHgwMjBFCisjZGVmaW5lIEFCNDUwMF9TWVNDVFJMX1NQQVJFX1JFRwkweDAyMEYKKyNkZWZpbmUgQUI0NTAwX1BBRF9DT05GX1JFRwkJMHgwMjEwCisKKy8qCisgKiBSZWd1IGNvbnRyb2wxIHJlZ2lzdGVyIG9mZnNldHMKKyAqIEJhbmsgPSAweDAzCisgKi8KKyNkZWZpbmUgQUI0NTAwX1JFR1VfU0VSSUFMX0NUUkwxX1JFRwkweDAzMDAKKyNkZWZpbmUgQUI0NTAwX1JFR1VfU0VSSUFMX0NUUkwyX1JFRwkweDAzMDEKKyNkZWZpbmUgQUI0NTAwX1JFR1VfU0VSSUFMX0NUUkwzX1JFRwkweDAzMDIKKyNkZWZpbmUgQUI0NTAwX1JFR1VfUkVRX0NUUkwxX1JFRwkweDAzMDMKKyNkZWZpbmUgQUI0NTAwX1JFR1VfUkVRX0NUUkwyX1JFRwkweDAzMDQKKyNkZWZpbmUgQUI0NTAwX1JFR1VfUkVRX0NUUkwzX1JFRwkweDAzMDUKKyNkZWZpbmUgQUI0NTAwX1JFR1VfUkVRX0NUUkw0X1JFRwkweDAzMDYKKyNkZWZpbmUgQUI0NTAwX1JFR1VfTUlTQzFfUkVHCQkweDAzODAKKyNkZWZpbmUgQUI0NTAwX1JFR1VfT1RHU1VQUExZX0NUUkxfUkVHCTB4MDM4MQorI2RlZmluZSBBQjQ1MDBfUkVHVV9WVVNCX0NUUkxfUkVHCTB4MDM4MgorI2RlZmluZSBBQjQ1MDBfUkVHVV9WQVVESU9fU1VQUExZX1JFRwkweDAzODMKKyNkZWZpbmUgQUI0NTAwX1JFR1VfQ1RSTDFfU1BBUkVfUkVHCTB4MDM4NAorCisvKgorICogUmVndSBjb250cm9sMiBWbW9kIHJlZ2lzdGVyIG9mZnNldHMKKyAqLworI2RlZmluZSBBQjQ1MDBfUkVHVV9WTU9EX1JFR1VfUkVHCTB4MDQ0MAorI2RlZmluZSBBQjQ1MDBfUkVHVV9WTU9EX1NFTDFfUkVHCTB4MDQ0MQorI2RlZmluZSBBQjQ1MDBfUkVHVV9WTU9EX1NFTDJfUkVHCTB4MDQ0MgorI2RlZmluZSBBQjQ1MDBfUkVHVV9DVFJMX0RJU0NIX1JFRwkweDA0NDMKKyNkZWZpbmUgQUI0NTAwX1JFR1VfQ1RSTF9ESVNDSDJfUkVHCTB4MDQ0NAorCisvKgorICogVVNCL1VMUEkgcmVnaXN0ZXIgb2Zmc2V0cworICogQmFuayA6IDB4NQorICovCisjZGVmaW5lIEFCNDUwMF9VU0JfTElORV9TVEFUX1JFRwkweDA1ODAKKyNkZWZpbmUgQUI0NTAwX1VTQl9MSU5FX0NUUkwxX1JFRwkweDA1ODEKKyNkZWZpbmUgQUI0NTAwX1VTQl9MSU5FX0NUUkwyX1JFRwkweDA1ODIKKyNkZWZpbmUgQUI0NTAwX1VTQl9MSU5FX0NUUkwzX1JFRwkweDA1ODMKKyNkZWZpbmUgQUI0NTAwX1VTQl9MSU5FX0NUUkw0X1JFRwkweDA1ODQKKyNkZWZpbmUgQUI0NTAwX1VTQl9MSU5FX0NUUkw1X1JFRwkweDA1ODUKKyNkZWZpbmUgQUI0NTAwX1VTQl9PVEdfQ1RSTF9SRUcJCTB4MDU4NworI2RlZmluZSBBQjQ1MDBfVVNCX09UR19TVEFUX1JFRwkJMHgwNTg4CisjZGVmaW5lIEFCNDUwMF9VU0JfT1RHX1NUQVRfUkVHCQkweDA1ODgKKyNkZWZpbmUgQUI0NTAwX1VTQl9DVFJMX1NQQVJFX1JFRwkweDA1ODkKKyNkZWZpbmUgQUI0NTAwX1VTQl9QSFlfQ1RSTF9SRUcJCTB4MDU4QQorCisvKgorICogVFZPVVQgLyBDVFJMIHJlZ2lzdGVyIG9mZnNldHMKKyAqIEJhbmsgOiAweDA2CisgKi8KKyNkZWZpbmUgQUI0NTAwX1RWT1VUX0NUUkxfUkVHCQkweDA2ODAKKworLyoKKyAqIERCSSByZWdpc3RlciBvZmZzZXRzCisgKiBCYW5rIDogMHgwNworICovCisjZGVmaW5lIEFCNDUwMF9EQklfUkVHMV9SRUcJCTB4MDcwMAorI2RlZmluZSBBQjQ1MDBfREJJX1JFRzJfUkVHCQkweDA3MDEKKworLyoKKyAqIEVDSSByZWdzaXRlciBvZmZzZXRzCisgKiBCYW5rIDogMHgwOAorICovCisjZGVmaW5lIEFCNDUwMF9FQ0lfQ1RSTF9SRUcJCTB4MDgwMAorI2RlZmluZSBBQjQ1MDBfRUNJX0hPT0tMRVZFTF9SRUcJMHgwODAxCisjZGVmaW5lIEFCNDUwMF9FQ0lfREFUQU9VVF9SRUcJCTB4MDgwMgorI2RlZmluZSBBQjQ1MDBfRUNJX0RBVEFJTl9SRUcJCTB4MDgwMworCisvKgorICogQVYgQ29ubmVjdG9yIHJlZ2lzdGVyIG9mZnNldHMKKyAqIEJhbmsgOiAweDA4CisgKi8KKyNkZWZpbmUgQUI0NTAwX0FWX0NPTk5fUkVHCQkweDA4NDAKKworLyoKKyAqIEFjY2Vzc29yeSBkZXRlY3Rpb24gcmVnaXN0ZXIgb2Zmc2V0cworICogQmFuayA6IDB4MDgKKyAqLworI2RlZmluZSBBQjQ1MDBfQUNDX0RFVF9EQjFfUkVHCQkweDA4ODAKKyNkZWZpbmUgQUI0NTAwX0FDQ19ERVRfREIyX1JFRwkJMHgwODgxCisKKy8qCisgKiBHUEFEQyByZWdpc3RlciBvZmZzZXRzCisgKiBCYW5rIDogMHgwQQorICovCisjZGVmaW5lIEFCNDUwMF9HUEFEQ19DVFJMMV9SRUcJCTB4MEEwMAorI2RlZmluZSBBQjQ1MDBfR1BBRENfQ1RSTDJfUkVHCQkweDBBMDEKKyNkZWZpbmUgQUI0NTAwX0dQQURDX0NUUkwzX1JFRwkJMHgwQTAyCisjZGVmaW5lIEFCNDUwMF9HUEFEQ19BVVRPX1RJTUVSX1JFRwkweDBBMDMKKyNkZWZpbmUgQUI0NTAwX0dQQURDX1NUQVRfUkVHCQkweDBBMDQKKyNkZWZpbmUgQUI0NTAwX0dQQURDX01BTkRBVEFMX1JFRwkweDBBMDUKKyNkZWZpbmUgQUI0NTAwX0dQQURDX01BTkRBVEFIX1JFRwkweDBBMDYKKyNkZWZpbmUgQUI0NTAwX0dQQURDX0FVVE9EQVRBTF9SRUcJMHgwQTA3CisjZGVmaW5lIEFCNDUwMF9HUEFEQ19BVVRPREFUQUhfUkVHCTB4MEEwOAorI2RlZmluZSBBQjQ1MDBfR1BBRENfTVVYX0NUUkxfUkVHCTB4MEEwOQorCisvKgorICogQ2hhcmdlciAvIHN0YXR1cyByZWdpc3RlciBvZmZmc2V0cworICogQmFuayA6IDB4MEIKKyAqLworI2RlZmluZSBBQjQ1MDBfQ0hfU1RBVFVTMV9SRUcJCTB4MEIwMAorI2RlZmluZSBBQjQ1MDBfQ0hfU1RBVFVTMl9SRUcJCTB4MEIwMQorI2RlZmluZSBBQjQ1MDBfQ0hfVVNCQ0hfU1RBVDFfUkVHCTB4MEIwMgorI2RlZmluZSBBQjQ1MDBfQ0hfVVNCQ0hfU1RBVDJfUkVHCTB4MEIwMworI2RlZmluZSBBQjQ1MDBfQ0hfRlNNX1NUQVRfUkVHCQkweDBCMDQKKyNkZWZpbmUgQUI0NTAwX0NIX1NUQVRfUkVHCQkweDBCMDUKKworLyoKKyAqIENoYXJnZXIgLyBjb250cm9sIHJlZ2lzdGVyIG9mZmZzZXRzCisgKiBCYW5rIDogMHgwQgorICovCisjZGVmaW5lIEFCNDUwMF9DSF9WT0xUX0xWTF9SRUcJCTB4MEI0MAorCisvKgorICogQ2hhcmdlciAvIG1haW4gY29udHJvbCByZWdpc3RlciBvZmZmc2V0cworICogQmFuayA6IDB4MEIKKyAqLworI2RlZmluZSBBQjQ1MDBfTUNIX0NUUkwxCQkweDBCODAKKyNkZWZpbmUgQUI0NTAwX01DSF9DVFJMMgkJMHgwQjgxCisjZGVmaW5lIEFCNDUwMF9NQ0hfSVBUX0NVUkxWTF9SRUcJMHgwQjgyCisjZGVmaW5lIEFCNDUwMF9DSF9XRF9SRUcJCTB4MEI4MworCisvKgorICogQ2hhcmdlciAvIFVTQiBjb250cm9sIHJlZ2lzdGVyIG9mZnNldHMKKyAqIEJhbmsgOiAweDBCCisgKi8KKyNkZWZpbmUgQUI0NTAwX1VTQkNIX0NUUkwxX1JFRwkJMHgwQkMwCisjZGVmaW5lIEFCNDUwMF9VU0JDSF9DVFJMMl9SRUcJCTB4MEJDMQorI2RlZmluZSBBQjQ1MDBfVVNCQ0hfSVBUX0NSTlRMVkxfUkVHCTB4MEJDMgorCisvKgorICogUlRDIGJhbmsgcmVnaXN0ZXIgb2Zmc2V0cworICogQmFuayA6IDB4RgorICovCisjZGVmaW5lIEFCNDUwMF9SVENfU09GRl9TVEFUX1JFRwkweDBGMDAKKyNkZWZpbmUgQUI0NTAwX1JUQ19DQ19DT05GX1JFRwkJMHgwRjAxCisjZGVmaW5lIEFCNDUwMF9SVENfUkVBRF9SRVFfUkVHCQkweDBGMDIKKyNkZWZpbmUgQUI0NTAwX1JUQ19XQVRDSF9UU0VDTUlEX1JFRwkweDBGMDMKKyNkZWZpbmUgQUI0NTAwX1JUQ19XQVRDSF9UU0VDSElfUkVHCTB4MEYwNAorI2RlZmluZSBBQjQ1MDBfUlRDX1dBVENIX1RNSU5fTE9XX1JFRwkweDBGMDUKKyNkZWZpbmUgQUI0NTAwX1JUQ19XQVRDSF9UTUlOX01JRF9SRUcJMHgwRjA2CisjZGVmaW5lIEFCNDUwMF9SVENfV0FUQ0hfVE1JTl9ISV9SRUcJMHgwRjA3CisjZGVmaW5lIEFCNDUwMF9SVENfQUxSTV9NSU5fTE9XX1JFRwkweDBGMDgKKyNkZWZpbmUgQUI0NTAwX1JUQ19BTFJNX01JTl9NSURfUkVHCTB4MEYwOQorI2RlZmluZSBBQjQ1MDBfUlRDX0FMUk1fTUlOX0hJX1JFRwkweDBGMEEKKyNkZWZpbmUgQUI0NTAwX1JUQ19TVEFUX1JFRwkJMHgwRjBCCisjZGVmaW5lIEFCNDUwMF9SVENfQktVUF9DSEdfUkVHCQkweDBGMEMKKyNkZWZpbmUgQUI0NTAwX1JUQ19GT1JDRV9CS1VQX1JFRwkweDBGMEQKKyNkZWZpbmUgQUI0NTAwX1JUQ19DQUxJQl9SRUcJCTB4MEYwRQorI2RlZmluZSBBQjQ1MDBfUlRDX1NXSVRDSF9TVEFUX1JFRwkweDBGMEYKKworLyoKKyAqIFBXTSBPdXQgZ2VuZXJhdG9ycworICogQmFuazogMHgxMAorICovCisjZGVmaW5lIEFCNDUwMF9QV01fT1VUX0NUUkwxX1JFRwkweDEwNjAKKyNkZWZpbmUgQUI0NTAwX1BXTV9PVVRfQ1RSTDJfUkVHCTB4MTA2MQorI2RlZmluZSBBQjQ1MDBfUFdNX09VVF9DVFJMM19SRUcJMHgxMDYyCisjZGVmaW5lIEFCNDUwMF9QV01fT1VUX0NUUkw0X1JFRwkweDEwNjMKKyNkZWZpbmUgQUI0NTAwX1BXTV9PVVRfQ1RSTDVfUkVHCTB4MTA2NAorI2RlZmluZSBBQjQ1MDBfUFdNX09VVF9DVFJMNl9SRUcJMHgxMDY1CisjZGVmaW5lIEFCNDUwMF9QV01fT1VUX0NUUkw3X1JFRwkweDEwNjYKKworI2RlZmluZSBBQjQ1MDBfSTJDX1BBRF9DVFJMX1JFRwkJMHgxMDY3CisjZGVmaW5lIEFCNDUwMF9SRVZfUkVHCQkJMHgxMDgwCisKKy8qKgorICogc3RydWN0IGFiNDUwMAorICogQHNwaTogc3BpIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEB0eF9idWY6IHRyYW5zbWl0IGJ1ZmZlcgorICogQHJ4X2J1ZjogcmVjZWl2ZSBidWZmZXIKKyAqIEBsb2NrOiBzeW5jIHByaW1pdGl2ZQorICovCitzdHJ1Y3QgYWI0NTAwIHsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpOworCXVuc2lnbmVkIGxvbmcJCXR4X2J1Zls0XTsKKwl1bnNpZ25lZCBsb25nCQlyeF9idWZbNF07CisJc3RydWN0IG11dGV4CQlsb2NrOworfTsKKworaW50IGFiNDUwMF93cml0ZShzdHJ1Y3QgYWI0NTAwICphYjQ1MDAsIHVuc2lnbmVkIGNoYXIgYmxvY2ssCisJCXVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgY2hhciBkYXRhKTsKK2ludCBhYjQ1MDBfcmVhZChzdHJ1Y3QgYWI0NTAwICphYjQ1MDAsIHVuc2lnbmVkIGNoYXIgYmxvY2ssCisJCXVuc2lnbmVkIGxvbmcgYWRkcik7CisKKyNlbmRpZiAvKiBNRkRfQUI0NTAwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2FkcDU1MjAuaCBiL2luY2x1ZGUvbGludXgvbWZkL2FkcDU1MjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzM3NTU4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvYWRwNTUyMC5oCkBAIC0wLDAgKzEsMjk5IEBACisvKgorICogRGVmaW5pdGlvbnMgYW5kIHBsYXRmb3JtIGRhdGEgZm9yIEFuYWxvZyBEZXZpY2VzCisgKiBBRFA1NTIwL0FEUDU1MDEgTUZEIFBNSUNzIChCYWNrbGlnaHQsIExFRCwgR1BJTyBhbmQgS2V5cykKKyAqCisgKiBDb3B5cmlnaHQgMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKworI2lmbmRlZiBfX0xJTlVYX01GRF9BRFA1NTIwX0gKKyNkZWZpbmUgX19MSU5VWF9NRkRfQURQNTUyMF9ICisKKyNkZWZpbmUgSURfQURQNTUyMAkJNTUyMAorI2RlZmluZSBJRF9BRFA1NTAxCQk1NTAxCisKKy8qCisgKiBBRFA1NTIwL0FEUDU1MDEgUmVnaXN0ZXIgTWFwCisgKi8KKworI2RlZmluZSBBRFA1NTIwX01PREVfU1RBVFVTIAkJMHgwMAorI2RlZmluZSBBRFA1NTIwX0lOVEVSUlVQVF9FTkFCTEUgCTB4MDEKKyNkZWZpbmUgQURQNTUyMF9CTF9DT05UUk9MIAkJMHgwMgorI2RlZmluZSBBRFA1NTIwX0JMX1RJTUUgCQkweDAzCisjZGVmaW5lIEFEUDU1MjBfQkxfRkFERSAJCTB4MDQKKyNkZWZpbmUgQURQNTUyMF9EQVlMSUdIVF9NQVggCQkweDA1CisjZGVmaW5lIEFEUDU1MjBfREFZTElHSFRfRElNIAkJMHgwNgorI2RlZmluZSBBRFA1NTIwX09GRklDRV9NQVggCQkweDA3CisjZGVmaW5lIEFEUDU1MjBfT0ZGSUNFX0RJTSAJCTB4MDgKKyNkZWZpbmUgQURQNTUyMF9EQVJLX01BWCAJCTB4MDkKKyNkZWZpbmUgQURQNTUyMF9EQVJLX0RJTSAJCTB4MEEKKyNkZWZpbmUgQURQNTUyMF9CTF9WQUxVRSAJCTB4MEIKKyNkZWZpbmUgQURQNTUyMF9BTFNfQ01QUl9DRkcgCQkweDBDCisjZGVmaW5lIEFEUDU1MjBfTDJfVFJJUCAJCTB4MEQKKyNkZWZpbmUgQURQNTUyMF9MMl9IWVMgCQkJMHgwRQorI2RlZmluZSBBRFA1NTIwX0wzX1RSSVAgCQkweDBGCisjZGVmaW5lIEFEUDU1MjBfTDNfSFlTIAkJCTB4MTAKKyNkZWZpbmUgQURQNTUyMF9MRURfQ09OVFJPTCAJCTB4MTEKKyNkZWZpbmUgQURQNTUyMF9MRURfVElNRSAJCTB4MTIKKyNkZWZpbmUgQURQNTUyMF9MRURfRkFERSAJCTB4MTMKKyNkZWZpbmUgQURQNTUyMF9MRUQxX0NVUlJFTlQgCQkweDE0CisjZGVmaW5lIEFEUDU1MjBfTEVEMl9DVVJSRU5UIAkJMHgxNQorI2RlZmluZSBBRFA1NTIwX0xFRDNfQ1VSUkVOVCAJCTB4MTYKKworLyoKKyAqIEFEUDU1MjAgUmVnaXN0ZXIgTWFwCisgKi8KKworI2RlZmluZSBBRFA1NTIwX0dQSU9fQ0ZHXzEgCQkweDE3CisjZGVmaW5lIEFEUDU1MjBfR1BJT19DRkdfMiAJCTB4MTgKKyNkZWZpbmUgQURQNTUyMF9HUElPX0lOIAkJMHgxOQorI2RlZmluZSBBRFA1NTIwX0dQSU9fT1VUIAkJMHgxQQorI2RlZmluZSBBRFA1NTIwX0dQSU9fSU5UX0VOIAkJMHgxQgorI2RlZmluZSBBRFA1NTIwX0dQSU9fSU5UX1NUQVQgCQkweDFDCisjZGVmaW5lIEFEUDU1MjBfR1BJT19JTlRfTFZMIAkJMHgxRAorI2RlZmluZSBBRFA1NTIwX0dQSU9fREVCT1VOQ0UgCQkweDFFCisjZGVmaW5lIEFEUDU1MjBfR1BJT19QVUxMVVAgCQkweDFGCisjZGVmaW5lIEFEUDU1MjBfS1BfSU5UX1NUQVRfMSAJCTB4MjAKKyNkZWZpbmUgQURQNTUyMF9LUF9JTlRfU1RBVF8yIAkJMHgyMQorI2RlZmluZSBBRFA1NTIwX0tSX0lOVF9TVEFUXzEgCQkweDIyCisjZGVmaW5lIEFEUDU1MjBfS1JfSU5UX1NUQVRfMiAJCTB4MjMKKyNkZWZpbmUgQURQNTUyMF9LRVlfU1RBVF8xIAkJMHgyNAorI2RlZmluZSBBRFA1NTIwX0tFWV9TVEFUXzIgCQkweDI1CisKKy8qCisgKiBNT0RFX1NUQVRVUyBiaXRzCisgKi8KKworI2RlZmluZSBBRFA1NTIwX25TVE5CWQkJKDEgPDwgNykKKyNkZWZpbmUgQURQNTUyMF9CTF9FTiAgICAgICAgICAgKDEgPDwgNikKKyNkZWZpbmUgQURQNTUyMF9ESU1fRU4gICAgICAgICAgKDEgPDwgNSkKKyNkZWZpbmUgQURQNTUyMF9PVlBfSU5UICAgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgQURQNTUyMF9DTVBSX0lOVCAgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgQURQNTUyMF9HUElfSU5UICAgICAgICAgKDEgPDwgMikKKyNkZWZpbmUgQURQNTUyMF9LUl9JTlQgICAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgQURQNTUyMF9LUF9JTlQgICAgICAgICAgKDEgPDwgMCkKKworLyoKKyAqIElOVEVSUlVQVF9FTkFCTEUgYml0cworICovCisKKyNkZWZpbmUgQURQNTUyMF9BVVRPX0xEX0VOICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgQURQNTUyMF9DTVBSX0lFTiAgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgQURQNTUyMF9PVlBfSUVOICAgICAgICAgKDEgPDwgMikKKyNkZWZpbmUgQURQNTUyMF9LUl9JRU4gICAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgQURQNTUyMF9LUF9JRU4gICAgICAgICAgKDEgPDwgMCkKKworLyoKKyAqIEJMX0NPTlRST0wgYml0cworICovCisKKyNkZWZpbmUgQURQNTUyMF9CTF9MVkwgICAgICAgICAgKCh4KSA8PCA1KQorI2RlZmluZSBBRFA1NTIwX0JMX0xBVyAgICAgICAgICAoKHgpIDw8IDQpCisjZGVmaW5lIEFEUDU1MjBfQkxfQVVUT19BREogICAgICgxIDw8IDMpCisjZGVmaW5lIEFEUDU1MjBfT1ZQX0VOICAgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIEFEUDU1MjBfRk9WUiAgICAgICAgICAgICgxIDw8IDEpCisjZGVmaW5lIEFEUDU1MjBfS1BfQkxfRU4gICAgICAgICgxIDw8IDApCisKKy8qCisgKiBBTFNfQ01QUl9DRkcgYml0cworICovCisKKyNkZWZpbmUgQURQNTUyMF9MM19PVVQJCSgxIDw8IDMpCisjZGVmaW5lIEFEUDU1MjBfTDJfT1VUCQkoMSA8PCAyKQorI2RlZmluZSBBRFA1NTIwX0wzX0VOCQkoMSA8PCAxKQorCisjZGVmaW5lIEFEUDUwMjBfTUFYX0JSSUdIVE5FU1MJMHg3RgorCisjZGVmaW5lIEZBREVfVkFMKGluLCBvdXQpCSgoMHhGICYgKGluKSkgfCAoKDB4RiAmIChvdXQpKSA8PCA0KSkKKyNkZWZpbmUgQkxfQ1RSTF9WQUwobGF3LCBhdXRvKQkoKCgxICYgKGF1dG8pKSA8PCAzKSB8ICgoMHgzICYgKGxhdykpIDw8IDQpKQorI2RlZmluZSBBTFNfQ01QUl9DRkdfVkFMKGZpbHQsIGwzX2VuKQkoKCgweDcgJiBmaWx0KSA8PCA1KSB8IGwzX2VuKQorCisvKgorICogTEVEcyBzdWJkZXZpY2UgYml0cyBhbmQgbWFza3MKKyAqLworCisjZGVmaW5lIEFEUDU1MjBfMDFfTUFYTEVEUyAzCisKKyNkZWZpbmUgQURQNTUyMF9GTEFHX0xFRF9NQVNLIAkJMHgzCisjZGVmaW5lIEFEUDU1MjBfRkxBR19PRkZUX1NISUZUIAk4CisjZGVmaW5lIEFEUDU1MjBfRkxBR19PRkZUX01BU0sgCQkweDMKKworI2RlZmluZSBBRFA1NTIwX1IzX01PREUJCSgxIDw8IDUpCisjZGVmaW5lIEFEUDU1MjBfQzNfTU9ERQkJKDEgPDwgNCkKKyNkZWZpbmUgQURQNTUyMF9MRURfTEFXCQkoMSA8PCAzKQorI2RlZmluZSBBRFA1NTIwX0xFRDNfRU4JCSgxIDw8IDIpCisjZGVmaW5lIEFEUDU1MjBfTEVEMl9FTgkJKDEgPDwgMSkKKyNkZWZpbmUgQURQNTUyMF9MRUQxX0VOCQkoMSA8PCAwKQorCisvKgorICogR1BJTyBzdWJkZXZpY2UgYml0cyBhbmQgbWFza3MKKyAqLworCisjZGVmaW5lIEFEUDU1MjBfTUFYR1BJT1MJOAorCisjZGVmaW5lIEFEUDU1MjBfR1BJT19DMwkJKDEgPDwgNykJLyogTEVEMiBvciBHUElPNyBha2EgQzMgKi8KKyNkZWZpbmUgQURQNTUyMF9HUElPX0MyCQkoMSA8PCA2KQorI2RlZmluZSBBRFA1NTIwX0dQSU9fQzEJCSgxIDw8IDUpCisjZGVmaW5lIEFEUDU1MjBfR1BJT19DMAkJKDEgPDwgNCkKKyNkZWZpbmUgQURQNTUyMF9HUElPX1IzCQkoMSA8PCAzKQkvKiBMRUQzIG9yIEdQSU8zIGFrYSBSMyAqLworI2RlZmluZSBBRFA1NTIwX0dQSU9fUjIJCSgxIDw8IDIpCisjZGVmaW5lIEFEUDU1MjBfR1BJT19SMQkJKDEgPDwgMSkKKyNkZWZpbmUgQURQNTUyMF9HUElPX1IwCQkoMSA8PCAwKQorCitzdHJ1Y3QgYWRwNTUyMF9ncGlvX3BsYXRmb3JtX2RhdGEgeworCXVuc2lnbmVkIGdwaW9fc3RhcnQ7CisJdTggZ3Bpb19lbl9tYXNrOworCXU4IGdwaW9fcHVsbHVwX21hc2s7Cit9OworCisvKgorICogS2V5cGFkIHN1YmRldmljZSBiaXRzIGFuZCBtYXNrcworICovCisKKyNkZWZpbmUgQURQNTUyMF9NQVhLRVlTCTE2CisKKyNkZWZpbmUgQURQNTUyMF9DT0xfQzMgCQkoMSA8PCA3KQkvKiBMRUQyIG9yIEdQSU83IGFrYSBDMyAqLworI2RlZmluZSBBRFA1NTIwX0NPTF9DMgkJKDEgPDwgNikKKyNkZWZpbmUgQURQNTUyMF9DT0xfQzEJCSgxIDw8IDUpCisjZGVmaW5lIEFEUDU1MjBfQ09MX0MwCQkoMSA8PCA0KQorI2RlZmluZSBBRFA1NTIwX1JPV19SMwkJKDEgPDwgMykJLyogTEVEMyBvciBHUElPMyBha2EgUjMgKi8KKyNkZWZpbmUgQURQNTUyMF9ST1dfUjIJCSgxIDw8IDIpCisjZGVmaW5lIEFEUDU1MjBfUk9XX1IxCQkoMSA8PCAxKQorI2RlZmluZSBBRFA1NTIwX1JPV19SMAkJKDEgPDwgMCkKKworI2RlZmluZSBBRFA1NTIwX0tFWShyb3csIGNvbCkgKGNvbCArIHJvdyAqIDQpCisjZGVmaW5lIEFEUDU1MjBfS0VZTUFQU0laRQlBRFA1NTIwX01BWEtFWVMKKworc3RydWN0IGFkcDU1MjBfa2V5c19wbGF0Zm9ybV9kYXRhIHsKKwlpbnQgcm93c19lbl9tYXNrOwkJLyogTnVtYmVyIG9mIHJvd3MgKi8KKwlpbnQgY29sc19lbl9tYXNrOwkJLyogTnVtYmVyIG9mIGNvbHVtbnMgKi8KKwljb25zdCB1bnNpZ25lZCBzaG9ydCAqa2V5bWFwOwkvKiBQb2ludGVyIHRvIGtleW1hcCAqLworCXVuc2lnbmVkIHNob3J0IGtleW1hcHNpemU7CS8qIEtleW1hcCBzaXplICovCisJdW5zaWduZWQgcmVwZWF0OjE7CQkvKiBFbmFibGUga2V5IHJlcGVhdCAqLworfTsKKworCisvKgorICogTEVEcyBzdWJkZXZpY2UgcGxhdGZvcm0gZGF0YQorICovCisKKyNkZWZpbmUgRkxBR19JRF9BRFA1NTIwX0xFRDFfQURQNTUwMV9MRUQwIAkxCS8qIEFEUDU1MjAgUElOIElMRUQgKi8KKyNkZWZpbmUgRkxBR19JRF9BRFA1NTIwX0xFRDJfQURQNTUwMV9MRUQxIAkyCS8qIEFEUDU1MjAgUElOIEMzICovCisjZGVmaW5lIEZMQUdfSURfQURQNTUyMF9MRUQzX0FEUDU1MDFfTEVEMiAJMwkvKiBBRFA1NTIwIFBJTiBSMyAqLworCisjZGVmaW5lIEFEUDU1MjBfTEVEX0RJU19CTElOSwkoMCA8PCBBRFA1NTIwX0ZMQUdfT0ZGVF9TSElGVCkKKyNkZWZpbmUgQURQNTUyMF9MRURfT0ZGVF82MDBtcwkoMSA8PCBBRFA1NTIwX0ZMQUdfT0ZGVF9TSElGVCkKKyNkZWZpbmUgQURQNTUyMF9MRURfT0ZGVF84MDBtcwkoMiA8PCBBRFA1NTIwX0ZMQUdfT0ZGVF9TSElGVCkKKyNkZWZpbmUgQURQNTUyMF9MRURfT0ZGVF8xMjAwbXMJKDMgPDwgQURQNTUyMF9GTEFHX09GRlRfU0hJRlQpCisKKyNkZWZpbmUgQURQNTUyMF9MRURfT05UXzIwMG1zCTAKKyNkZWZpbmUgQURQNTUyMF9MRURfT05UXzYwMG1zCTEKKyNkZWZpbmUgQURQNTUyMF9MRURfT05UXzgwMG1zCTIKKyNkZWZpbmUgQURQNTUyMF9MRURfT05UXzEyMDBtcwkzCisKK3N0cnVjdCBhZHA1NTIwX2xlZHNfcGxhdGZvcm1fZGF0YSB7CisJaW50IG51bV9sZWRzOworCXN0cnVjdCBsZWRfaW5mbwkqbGVkczsKKwl1OCBmYWRlX2luOwkJLyogQmFja2xpZ2h0IEZhZGUtSW4gVGltZXIgKi8KKwl1OCBmYWRlX291dDsJCS8qIEJhY2tsaWdodCBGYWRlLU91dCBUaW1lciAqLworCXU4IGxlZF9vbl90aW1lOworfTsKKworLyoKKyAqIEJhY2tsaWdodCBzdWJkZXZpY2UgcGxhdGZvcm0gZGF0YQorICovCisKKyNkZWZpbmUgQURQNTUyMF9GQURFX1RfRElTCTAJLyogRmFkZSBUaW1lciBEaXNhYmxlZCAqLworI2RlZmluZSBBRFA1NTIwX0ZBREVfVF8zMDBtcwkxCS8qIDAuMyBTZWMgKi8KKyNkZWZpbmUgQURQNTUyMF9GQURFX1RfNjAwbXMJMgorI2RlZmluZSBBRFA1NTIwX0ZBREVfVF85MDBtcwkzCisjZGVmaW5lIEFEUDU1MjBfRkFERV9UXzEyMDBtcwk0CisjZGVmaW5lIEFEUDU1MjBfRkFERV9UXzE1MDBtcwk1CisjZGVmaW5lIEFEUDU1MjBfRkFERV9UXzE4MDBtcwk2CisjZGVmaW5lIEFEUDU1MjBfRkFERV9UXzIxMDBtcwk3CisjZGVmaW5lIEFEUDU1MjBfRkFERV9UXzI0MDBtcwk4CisjZGVmaW5lIEFEUDU1MjBfRkFERV9UXzI3MDBtcwk5CisjZGVmaW5lIEFEUDU1MjBfRkFERV9UXzMwMDBtcwkxMAorI2RlZmluZSBBRFA1NTIwX0ZBREVfVF8zNTAwbXMJMTEKKyNkZWZpbmUgQURQNTUyMF9GQURFX1RfNDAwMG1zCTEyCisjZGVmaW5lIEFEUDU1MjBfRkFERV9UXzQ1MDBtcwkxMworI2RlZmluZSBBRFA1NTIwX0ZBREVfVF81MDAwbXMJMTQKKyNkZWZpbmUgQURQNTUyMF9GQURFX1RfNTUwMG1zCTE1CS8qIDUuNSBTZWMgKi8KKworI2RlZmluZSBBRFA1NTIwX0JMX0xBV19MSU5FQVIgCTAKKyNkZWZpbmUgQURQNTUyMF9CTF9MQVdfU1FVQVJFIAkxCisjZGVmaW5lIEFEUDU1MjBfQkxfTEFXX0NVQklDMSAJMgorI2RlZmluZSBBRFA1NTIwX0JMX0xBV19DVUJJQzIgCTMKKworI2RlZmluZSBBRFA1NTIwX0JMX0FNQkxfRklMVF84MG1zIAkwCS8qIExpZ2h0IHNlbnNvciBmaWx0ZXIgdGltZSAqLworI2RlZmluZSBBRFA1NTIwX0JMX0FNQkxfRklMVF8xNjBtcyAJMQorI2RlZmluZSBBRFA1NTIwX0JMX0FNQkxfRklMVF8zMjBtcyAJMgorI2RlZmluZSBBRFA1NTIwX0JMX0FNQkxfRklMVF82NDBtcyAJMworI2RlZmluZSBBRFA1NTIwX0JMX0FNQkxfRklMVF8xMjgwbXMgCTQKKyNkZWZpbmUgQURQNTUyMF9CTF9BTUJMX0ZJTFRfMjU2MG1zIAk1CisjZGVmaW5lIEFEUDU1MjBfQkxfQU1CTF9GSUxUXzUxMjBtcyAJNgorI2RlZmluZSBBRFA1NTIwX0JMX0FNQkxfRklMVF8xMDI0MG1zIAk3CS8qIDEwLjI0IHNlYyAqLworCisJLyoKKwkgKiBCbGFja2xpZ2h0IGN1cnJlbnQgMC4uMzBtQQorCSAqLworI2RlZmluZSBBRFA1NTIwX0JMX0NVUl9tQShJKQkJKChJICogMTI3KSAvIDMwKQorCisJLyoKKwkgKiBMMiBjb21wYXJhdG9yIGN1cnJlbnQgMC4uMTAwMHVBCisJICovCisjZGVmaW5lIEFEUDU1MjBfTDJfQ09NUF9DVVJSX3VBKEkpCSgoSSAqIDI1NSkgLyAxMDAwKQorCisJLyoKKwkgKiBMMyBjb21wYXJhdG9yIGN1cnJlbnQgMC4uMTI3dUEKKwkgKi8KKyNkZWZpbmUgQURQNTUyMF9MM19DT01QX0NVUlJfdUEoSSkJKChJICogMjU1KSAvIDEyNykKKworc3RydWN0IGFkcDU1MjBfYmFja2xpZ2h0X3BsYXRmb3JtX2RhdGEgeworCXU4IGZhZGVfaW47CQkvKiBCYWNrbGlnaHQgRmFkZS1JbiBUaW1lciAqLworCXU4IGZhZGVfb3V0OwkJLyogQmFja2xpZ2h0IEZhZGUtT3V0IFRpbWVyICovCisJdTggZmFkZV9sZWRfbGF3OwkvKiBmYWRlLW9uL2ZhZGUtb2ZmIHRyYW5zZmVyIGNoYXJhY3RlcmlzdGljICovCisKKwl1OCBlbl9hbWJsX3NlbnM7CS8qIDEgPSBlbmFibGUgYW1iaWVudCBsaWdodCBzZW5zb3IgKi8KKwl1OCBhYm1sX2ZpbHQ7CQkvKiBMaWdodCBzZW5zb3IgZmlsdGVyIHRpbWUgKi8KKwl1OCBsMV9kYXlsaWdodF9tYXg7CS8qIHVzZSBCTF9DVVJfbUEoSSkgMCA8PSBJIDw9IDMwIG1BICovCisJdTggbDFfZGF5bGlnaHRfZGltOwkvKiB0eXAgPSAwLCB1c2UgQkxfQ1VSX21BKEkpIDAgPD0gSSA8PSAzMCBtQSAqLworCXU4IGwyX29mZmljZV9tYXg7CS8qIHVzZSBCTF9DVVJfbUEoSSkgMCA8PSBJIDw9IDMwIG1BICovCisJdTggbDJfb2ZmaWNlX2RpbTsJLyogdHlwID0gMCwgdXNlIEJMX0NVUl9tQShJKSAwIDw9IEkgPD0gMzAgbUEgKi8KKwl1OCBsM19kYXJrX21heDsJCS8qIHVzZSBCTF9DVVJfbUEoSSkgMCA8PSBJIDw9IDMwIG1BICovCisJdTggbDNfZGFya19kaW07CQkvKiB0eXAgPSAwLCB1c2UgQkxfQ1VSX21BKEkpIDAgPD0gSSA8PSAzMCBtQSAqLworCXU4IGwyX3RyaXA7CQkvKiB1c2UgTDJfQ09NUF9DVVJSX3VBKEkpIDAgPD0gSSA8PSAxMDAwIHVBICovCisJdTggbDJfaHlzdDsJCS8qIHVzZSBMMl9DT01QX0NVUlJfdUEoSSkgMCA8PSBJIDw9IDEwMDAgdUEgKi8KKwl1OCBsM190cmlwOwkJLyogdXNlIEwzX0NPTVBfQ1VSUl91QShJKSAwIDw9IEkgPD0gMTI3IHVBICovCisJdTggbDNfaHlzdDsJCS8qIHVzZSBMM19DT01QX0NVUlJfdUEoSSkgMCA8PSBJIDw9IDEyNyB1QSAqLworfTsKKworLyoKKyAqIE1GRCBjaGlwIHBsYXRmb3JtIGRhdGEKKyAqLworCitzdHJ1Y3QgYWRwNTUyMF9wbGF0Zm9ybV9kYXRhIHsKKwlzdHJ1Y3QgYWRwNTUyMF9rZXlzX3BsYXRmb3JtX2RhdGEgKmtleXM7CisJc3RydWN0IGFkcDU1MjBfZ3Bpb19wbGF0Zm9ybV9kYXRhICpncGlvOworCXN0cnVjdCBhZHA1NTIwX2xlZHNfcGxhdGZvcm1fZGF0YSAqbGVkczsKKwlzdHJ1Y3QgYWRwNTUyMF9iYWNrbGlnaHRfcGxhdGZvcm1fZGF0YSAqYmFja2xpZ2h0OworfTsKKworLyoKKyAqIE1GRCBjaGlwIGZ1bmN0aW9ucworICovCisKK2V4dGVybiBpbnQgYWRwNTUyMF9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHJlZywgdWludDhfdCAqdmFsKTsKK2V4dGVybiBpbnQgYWRwNTUyMF93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCByZWcsIHU4IHZhbCk7CitleHRlcm4gaW50IGFkcDU1MjBfY2xyX2JpdHMoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgcmVnLCB1aW50OF90IGJpdF9tYXNrKTsKK2V4dGVybiBpbnQgYWRwNTUyMF9zZXRfYml0cyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCByZWcsIHVpbnQ4X3QgYml0X21hc2spOworCitleHRlcm4gaW50IGFkcDU1MjBfcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IGRldmljZSAqZGV2LAorCQkgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgaW50IGV2ZW50cyk7CisKK2V4dGVybiBpbnQgYWRwNTUyMF91bnJlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgaW50IGV2ZW50cyk7CisKKyNlbmRpZiAvKiBfX0xJTlVYX01GRF9BRFA1NTIwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2V6eC1wY2FwLmggYi9pbmNsdWRlL2xpbnV4L21mZC9lengtcGNhcC5oCmluZGV4IDM0MDIwNDJkLi40MGMzNzIxNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvZXp4LXBjYXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9lengtcGNhcC5oCkBAIC0yMzEsOSArMjMxLDYgQEAKICNkZWZpbmUgUENBUF9MRURfNE1BCQkxCiAjZGVmaW5lIFBDQVBfTEVEXzVNQQkJMgogI2RlZmluZSBQQ0FQX0xFRF85TUEJCTMKLSNkZWZpbmUgUENBUF9MRURfR1BJT19WQUxfTUFTSwkweDAwZmZmZmZmCi0jZGVmaW5lIFBDQVBfTEVEX0dQSU9fRU4JMHgwMTAwMDAwMAotI2RlZmluZSBQQ0FQX0xFRF9HUElPX0lOVkVSVAkweDAyMDAwMDAwCiAjZGVmaW5lIFBDQVBfTEVEX1RfTUFTSwkJMHhmCiAjZGVmaW5lIFBDQVBfTEVEX0NfTUFTSwkJMHgzCiAjZGVmaW5lIFBDQVBfQkxfTUFTSwkJMHgxZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvbWMxMzc4My1wcml2YXRlLmggYi9pbmNsdWRlL2xpbnV4L21mZC9tYzEzNzgzLXByaXZhdGUuaAppbmRleCA0N2U2OThjLi45NWNmOTM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC9tYzEzNzgzLXByaXZhdGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9tYzEzNzgzLXByaXZhdGUuaApAQCAtMjQsNTIgKzI0LDIzIEBACiAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvbWMxMzc4My5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0KLXN0cnVjdCBtYzEzNzgzX2lycSB7Ci0Jdm9pZCAoKmhhbmRsZXIpKGludCwgdm9pZCAqKTsKLQl2b2lkICpkYXRhOwotfTsKLQotI2RlZmluZSBNQzEzNzgzX05VTV9JUlEJCTIKLSNkZWZpbmUgTUMxMzc4M19JUlFfVFMJCTAKLSNkZWZpbmUgTUMxMzc4M19JUlFfUkVHVUxBVE9SCTEKLQotI2RlZmluZSBNQzEzNzgzX0FEQ19NT0RFX1RTCQkxCi0jZGVmaW5lIE1DMTM3ODNfQURDX01PREVfU0lOR0xFX0NIQU4JMgotI2RlZmluZSBNQzEzNzgzX0FEQ19NT0RFX01VTFRfQ0hBTgkzCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKIHN0cnVjdCBtYzEzNzgzIHsKLQlpbnQgcmV2aXNpb247Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCXN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2aWNlOwotCi0JaW50ICgqcmVhZF9kZXYpKHZvaWQgKmRhdGEsIGNoYXIgcmVnLCBpbnQgY291bnQsIHUzMiAqZHN0KTsKLQlpbnQgKCp3cml0ZV9kZXYpKHZvaWQgKmRhdGEsIGNoYXIgcmVnLCBpbnQgY291bnQsIGNvbnN0IHUzMiAqc3JjKTsKLQotCXN0cnVjdCBtdXRleCBpb19sb2NrOwotCXZvaWQgKmlvX2RhdGE7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaWRldjsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKIAlpbnQgaXJxOwotCXVuc2lnbmVkIGludCBmbGFnczsKKwlpbnQgZmxhZ3M7CiAKLQlzdHJ1Y3QgbWMxMzc4M19pcnEgaXJxX2hhbmRsZXJbTUMxMzc4M19OVU1fSVJRXTsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKLQlzdHJ1Y3QgY29tcGxldGlvbiBhZGNfZG9uZTsKLQl1bnNpZ25lZCBpbnQgdHNfYWN0aXZlOwotCXN0cnVjdCBtdXRleCBhZGNfY29udl9sb2NrOworCWlycV9oYW5kbGVyX3QgaXJxaGFuZGxlcltNQzEzNzgzX05VTV9JUlFdOworCXZvaWQgKmlycWRhdGFbTUMxMzc4M19OVU1fSVJRXTsKIAorCS8qIFhYWCB0aGVzZSBzaG91bGQgZ28gYXMgcGxhdGZvcm1kYXRhIHRvIHRoZSByZWd1bGF0b3Igc3ViZGV2aWNlICovCiAJc3RydWN0IG1jMTM3ODNfcmVndWxhdG9yX2luaXRfZGF0YSAqcmVndWxhdG9yczsKIAlpbnQgbnVtX3JlZ3VsYXRvcnM7CiB9OwogCi1pbnQgbWMxMzc4M19yZWdfcmVhZChzdHJ1Y3QgbWMxMzc4MyAqLCBpbnQgcmVnX251bSwgdTMyICopOwotaW50IG1jMTM3ODNfcmVnX3dyaXRlKHN0cnVjdCBtYzEzNzgzICosIGludCwgdTMyKTsKLWludCBtYzEzNzgzX3NldF9iaXRzKHN0cnVjdCBtYzEzNzgzICosIGludCwgdTMyLCB1MzIpOwotaW50IG1jMTM3ODNfZnJlZV9pcnEoc3RydWN0IG1jMTM3ODMgKm1jMTM3ODMsIGludCBpcnEpOwotaW50IG1jMTM3ODNfcmVnaXN0ZXJfaXJxKHN0cnVjdCBtYzEzNzgzICptYzEzNzgzLCBpbnQgaXJxLAotCQl2b2lkICgqaGFuZGxlcikgKGludCwgdm9pZCAqKSwgdm9pZCAqZGF0YSk7Ci0KICNkZWZpbmUgTUMxMzc4M19SRUdfSU5URVJSVVBUX1NUQVRVU18wCQkgMAogI2RlZmluZSBNQzEzNzgzX1JFR19JTlRFUlJVUFRfTUFTS18wCQkgMQogI2RlZmluZSBNQzEzNzgzX1JFR19JTlRFUlJVUFRfU0VOU0VfMAkJIDIKQEAgLTEzNiw1NSArMTA3LDYgQEAKICNkZWZpbmUgTUMxMzc4M19SRUdfVEVTVF8zCQkJNjMKICNkZWZpbmUgTUMxMzc4M19SRUdfTkIJCQkJNjQKIAotCi0vKgotICogSW50ZXJydXB0IFN0YXR1cwotICovCi0jZGVmaW5lIE1DMTM3ODNfSU5UX1NUQVRfQURDRE9ORUkJKDEgPDwgMCkKLSNkZWZpbmUgTUMxMzc4M19JTlRfU1RBVF9BRENCSVNET05FSQkoMSA8PCAxKQotI2RlZmluZSBNQzEzNzgzX0lOVF9TVEFUX1RTSQkJKDEgPDwgMikKLSNkZWZpbmUgTUMxMzc4M19JTlRfU1RBVF9XSElHSEkJCSgxIDw8IDMpCi0jZGVmaW5lIE1DMTM3ODNfSU5UX1NUQVRfV0xPV0kJCSgxIDw8IDQpCi0jZGVmaW5lIE1DMTM3ODNfSU5UX1NUQVRfQ0hHREVUSQkoMSA8PCA2KQotI2RlZmluZSBNQzEzNzgzX0lOVF9TVEFUX0NIR09WSQkJKDEgPDwgNykKLSNkZWZpbmUgTUMxMzc4M19JTlRfU1RBVF9DSEdSRVZJCSgxIDw8IDgpCi0jZGVmaW5lIE1DMTM3ODNfSU5UX1NUQVRfQ0hHU0hPUlRJCSgxIDw8IDkpCi0jZGVmaW5lIE1DMTM3ODNfSU5UX1NUQVRfQ0NDVkkJCSgxIDw8IDEwKQotI2RlZmluZSBNQzEzNzgzX0lOVF9TVEFUX0NIR0NVUlJJCSgxIDw8IDExKQotI2RlZmluZSBNQzEzNzgzX0lOVF9TVEFUX0JQT05JCQkoMSA8PCAxMikKLSNkZWZpbmUgTUMxMzc4M19JTlRfU1RBVF9MT0JBVExJCSgxIDw8IDEzKQotI2RlZmluZSBNQzEzNzgzX0lOVF9TVEFUX0xPQkFUSEkJKDEgPDwgMTQpCi0jZGVmaW5lIE1DMTM3ODNfSU5UX1NUQVRfVURQSQkJKDEgPDwgMTUpCi0jZGVmaW5lIE1DMTM3ODNfSU5UX1NUQVRfVVNCSQkJKDEgPDwgMTYpCi0jZGVmaW5lIE1DMTM3ODNfSU5UX1NUQVRfSURJCQkoMSA8PCAxOSkKLSNkZWZpbmUgTUMxMzc4M19JTlRfU1RBVF9VbnVzZWQJCSgxIDw8IDIwKQotI2RlZmluZSBNQzEzNzgzX0lOVF9TVEFUX1NFMUkJCSgxIDw8IDIxKQotI2RlZmluZSBNQzEzNzgzX0lOVF9TVEFUX0NLREVUSQkJKDEgPDwgMjIpCi0jZGVmaW5lIE1DMTM3ODNfSU5UX1NUQVRfVURNSQkJKDEgPDwgMjMpCi0KLS8qCi0gKiBJbnRlcnJ1cHQgTWFzawotICovCi0jZGVmaW5lIE1DMTM3ODNfSU5UX01BU0tfQURDRE9ORU0JKDEgPDwgMCkKLSNkZWZpbmUgTUMxMzc4M19JTlRfTUFTS19BRENCSVNET05FTQkoMSA8PCAxKQotI2RlZmluZSBNQzEzNzgzX0lOVF9NQVNLX1RTTQkJKDEgPDwgMikKLSNkZWZpbmUgTUMxMzc4M19JTlRfTUFTS19XSElHSE0JCSgxIDw8IDMpCi0jZGVmaW5lIE1DMTM3ODNfSU5UX01BU0tfV0xPV00JCSgxIDw8IDQpCi0jZGVmaW5lIE1DMTM3ODNfSU5UX01BU0tfQ0hHREVUTQkoMSA8PCA2KQotI2RlZmluZSBNQzEzNzgzX0lOVF9NQVNLX0NIR09WTQkJKDEgPDwgNykKLSNkZWZpbmUgTUMxMzc4M19JTlRfTUFTS19DSEdSRVZNCSgxIDw8IDgpCi0jZGVmaW5lIE1DMTM3ODNfSU5UX01BU0tfQ0hHU0hPUlRNCSgxIDw8IDkpCi0jZGVmaW5lIE1DMTM3ODNfSU5UX01BU0tfQ0NDVk0JCSgxIDw8IDEwKQotI2RlZmluZSBNQzEzNzgzX0lOVF9NQVNLX0NIR0NVUlJNCSgxIDw8IDExKQotI2RlZmluZSBNQzEzNzgzX0lOVF9NQVNLX0JQT05NCQkoMSA8PCAxMikKLSNkZWZpbmUgTUMxMzc4M19JTlRfTUFTS19MT0JBVExNCSgxIDw8IDEzKQotI2RlZmluZSBNQzEzNzgzX0lOVF9NQVNLX0xPQkFUSE0JKDEgPDwgMTQpCi0jZGVmaW5lIE1DMTM3ODNfSU5UX01BU0tfVURQTQkJKDEgPDwgMTUpCi0jZGVmaW5lIE1DMTM3ODNfSU5UX01BU0tfVVNCTQkJKDEgPDwgMTYpCi0jZGVmaW5lIE1DMTM3ODNfSU5UX01BU0tfSURNCQkoMSA8PCAxOSkKLSNkZWZpbmUgTUMxMzc4M19JTlRfTUFTS19TRTFNCQkoMSA8PCAyMSkKLSNkZWZpbmUgTUMxMzc4M19JTlRfTUFTS19DS0RFVE0JCSgxIDw8IDIyKQotCiAvKgogICogUmVnIFJlZ3VsYXRvciBNb2RlIDAKICAqLwpAQCAtMjg0LDExMyArMjA2LDE1IEBACiAjZGVmaW5lIE1DMTM3ODNfU1dDVFJMX1NXM19TVEJZCQkoMSA8PCAyMSkKICNkZWZpbmUgTUMxMzc4M19TV0NUUkxfU1czX01PREUJCSgxIDw8IDIyKQogCi0vKgotICogQURDL1RvdWNoCi0gKi8KLSNkZWZpbmUgTUMxMzc4M19BREMwX0xJQ0VMTENPTgkJKDEgPDwgMCkKLSNkZWZpbmUgTUMxMzc4M19BREMwX0NIUkdJQ09OCQkoMSA8PCAxKQotI2RlZmluZSBNQzEzNzgzX0FEQzBfQkFUSUNPTgkJKDEgPDwgMikKLSNkZWZpbmUgTUMxMzc4M19BREMwX1JUSEVOIAkJKDEgPDwgMykKLSNkZWZpbmUgTUMxMzc4M19BREMwX0RUSEVOCQkoMSA8PCA0KQotI2RlZmluZSBNQzEzNzgzX0FEQzBfVUlERU4JCSgxIDw8IDUpCi0jZGVmaW5lIE1DMTM3ODNfQURDMF9BRE9VVEVOIAkJKDEgPDwgNikKLSNkZWZpbmUgTUMxMzc4M19BREMwX0FET1VUUEVSCQkoMSA8PCA3KQotI2RlZmluZSBNQzEzNzgzX0FEQzBfQURSRUZFTgkJKDEgPDwgMTApCi0jZGVmaW5lIE1DMTM3ODNfQURDMF9BRFJFRk1PREUJCSgxIDw8IDExKQotI2RlZmluZSBNQzEzNzgzX0FEQzBfVFNNT0QwCQkoMSA8PCAxMikKLSNkZWZpbmUgTUMxMzc4M19BREMwX1RTTU9EMQkJKDEgPDwgMTMpCi0jZGVmaW5lIE1DMTM3ODNfQURDMF9UU01PRDIJCSgxIDw8IDE0KQotI2RlZmluZSBNQzEzNzgzX0FEQzBfQ0hSR1JBV0RJVgkJKDEgPDwgMTUpCi0jZGVmaW5lIE1DMTM3ODNfQURDMF9BRElOQzEJCSgxIDw8IDE2KQotI2RlZmluZSBNQzEzNzgzX0FEQzBfQURJTkMyCQkoMSA8PCAxNykKLSNkZWZpbmUgTUMxMzc4M19BREMwX1dDT01QCQkoMSA8PCAxOCkKLSNkZWZpbmUgTUMxMzc4M19BREMwX0FEQ0JJUzAJCSgxIDw8IDIzKQorc3RhdGljIGlubGluZSBpbnQgbWMxMzc4M19zZXRfYml0cyhzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MywgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJdTMyIG1hc2ssIHUzMiB2YWwpCit7CisJaW50IHJldDsKKwltYzEzNzgzX2xvY2sobWMxMzc4Myk7CisJcmV0ID0gbWMxMzc4M19yZWdfcm13KG1jMTM3ODMsIG9mZnNldCwgbWFzaywgdmFsKTsKKwltYzEzNzgzX3VubG9jayhtYzEzNzgzKTsKIAotI2RlZmluZSBNQzEzNzgzX0FEQzFfQURFTgkJKDEgPDwgMCkKLSNkZWZpbmUgTUMxMzc4M19BREMxX1JBTkQJCSgxIDw8IDEpCi0jZGVmaW5lIE1DMTM3ODNfQURDMV9BRFNFTAkJKDEgPDwgMykKLSNkZWZpbmUgTUMxMzc4M19BREMxX1RSSUdNQVNLCQkoMSA8PCA0KQotI2RlZmluZSBNQzEzNzgzX0FEQzFfQURBMTAJCSgxIDw8IDUpCi0jZGVmaW5lIE1DMTM3ODNfQURDMV9BREExMQkJKDEgPDwgNikKLSNkZWZpbmUgTUMxMzc4M19BREMxX0FEQTEyCQkoMSA8PCA3KQotI2RlZmluZSBNQzEzNzgzX0FEQzFfQURBMjAJCSgxIDw8IDgpCi0jZGVmaW5lIE1DMTM3ODNfQURDMV9BREEyMQkJKDEgPDwgOSkKLSNkZWZpbmUgTUMxMzc4M19BREMxX0FEQTIyCQkoMSA8PCAxMCkKLSNkZWZpbmUgTUMxMzc4M19BREMxX0FUTzAJCSgxIDw8IDExKQotI2RlZmluZSBNQzEzNzgzX0FEQzFfQVRPMQkJKDEgPDwgMTIpCi0jZGVmaW5lIE1DMTM3ODNfQURDMV9BVE8yCQkoMSA8PCAxMykKLSNkZWZpbmUgTUMxMzc4M19BREMxX0FUTzMJCSgxIDw8IDE0KQotI2RlZmluZSBNQzEzNzgzX0FEQzFfQVRPNAkJKDEgPDwgMTUpCi0jZGVmaW5lIE1DMTM3ODNfQURDMV9BVE81CQkoMSA8PCAxNikKLSNkZWZpbmUgTUMxMzc4M19BREMxX0FUTzYJCSgxIDw8IDE3KQotI2RlZmluZSBNQzEzNzgzX0FEQzFfQVRPNwkJKDEgPDwgMTgpCi0jZGVmaW5lIE1DMTM3ODNfQURDMV9BVE9YCQkoMSA8PCAxOSkKLSNkZWZpbmUgTUMxMzc4M19BREMxX0FTQwkJKDEgPDwgMjApCi0jZGVmaW5lIE1DMTM3ODNfQURDMV9BRFRSSUdJR04JCSgxIDw8IDIxKQotI2RlZmluZSBNQzEzNzgzX0FEQzFfQURPTkVTSE9UCQkoMSA8PCAyMikKLSNkZWZpbmUgTUMxMzc4M19BREMxX0FEQ0JJUzEJCSgxIDw8IDIzKQotCi0jZGVmaW5lIE1DMTM3ODNfQURDMV9DSEFOMF9TSElGVAk1Ci0jZGVmaW5lIE1DMTM3ODNfQURDMV9DSEFOMV9TSElGVAk4Ci0KLSNkZWZpbmUgTUMxMzc4M19BREMyX0FERDEwCQkoMSA8PCAyKQotI2RlZmluZSBNQzEzNzgzX0FEQzJfQUREMTEJCSgxIDw8IDMpCi0jZGVmaW5lIE1DMTM3ODNfQURDMl9BREQxMgkJKDEgPDwgNCkKLSNkZWZpbmUgTUMxMzc4M19BREMyX0FERDEzCQkoMSA8PCA1KQotI2RlZmluZSBNQzEzNzgzX0FEQzJfQUREMTQJCSgxIDw8IDYpCi0jZGVmaW5lIE1DMTM3ODNfQURDMl9BREQxNQkJKDEgPDwgNykKLSNkZWZpbmUgTUMxMzc4M19BREMyX0FERDE2CQkoMSA8PCA4KQotI2RlZmluZSBNQzEzNzgzX0FEQzJfQUREMTcJCSgxIDw8IDkpCi0jZGVmaW5lIE1DMTM3ODNfQURDMl9BREQxOAkJKDEgPDwgMTApCi0jZGVmaW5lIE1DMTM3ODNfQURDMl9BREQxOQkJKDEgPDwgMTEpCi0jZGVmaW5lIE1DMTM3ODNfQURDMl9BREQyMAkJKDEgPDwgMTQpCi0jZGVmaW5lIE1DMTM3ODNfQURDMl9BREQyMQkJKDEgPDwgMTUpCi0jZGVmaW5lIE1DMTM3ODNfQURDMl9BREQyMgkJKDEgPDwgMTYpCi0jZGVmaW5lIE1DMTM3ODNfQURDMl9BREQyMwkJKDEgPDwgMTcpCi0jZGVmaW5lIE1DMTM3ODNfQURDMl9BREQyNAkJKDEgPDwgMTgpCi0jZGVmaW5lIE1DMTM3ODNfQURDMl9BREQyNQkJKDEgPDwgMTkpCi0jZGVmaW5lIE1DMTM3ODNfQURDMl9BREQyNgkJKDEgPDwgMjApCi0jZGVmaW5lIE1DMTM3ODNfQURDMl9BREQyNwkJKDEgPDwgMjEpCi0jZGVmaW5lIE1DMTM3ODNfQURDMl9BREQyOAkJKDEgPDwgMjIpCi0jZGVmaW5lIE1DMTM3ODNfQURDMl9BREQyOQkJKDEgPDwgMjMpCi0KLSNkZWZpbmUgTUMxMzc4M19BREMzX1dISUdIMAkJKDEgPDwgMCkKLSNkZWZpbmUgTUMxMzc4M19BREMzX1dISUdIMQkJKDEgPDwgMSkKLSNkZWZpbmUgTUMxMzc4M19BREMzX1dISUdIMgkJKDEgPDwgMikKLSNkZWZpbmUgTUMxMzc4M19BREMzX1dISUdIMwkJKDEgPDwgMykKLSNkZWZpbmUgTUMxMzc4M19BREMzX1dISUdINAkJKDEgPDwgNCkKLSNkZWZpbmUgTUMxMzc4M19BREMzX1dISUdINQkJKDEgPDwgNSkKLSNkZWZpbmUgTUMxMzc4M19BREMzX0lDSUQwCQkoMSA8PCA2KQotI2RlZmluZSBNQzEzNzgzX0FEQzNfSUNJRDEJCSgxIDw8IDcpCi0jZGVmaW5lIE1DMTM3ODNfQURDM19JQ0lEMgkJKDEgPDwgOCkKLSNkZWZpbmUgTUMxMzc4M19BREMzX1dMT1cwCQkoMSA8PCA5KQotI2RlZmluZSBNQzEzNzgzX0FEQzNfV0xPVzEJCSgxIDw8IDEwKQotI2RlZmluZSBNQzEzNzgzX0FEQzNfV0xPVzIJCSgxIDw8IDExKQotI2RlZmluZSBNQzEzNzgzX0FEQzNfV0xPVzMJCSgxIDw8IDEyKQotI2RlZmluZSBNQzEzNzgzX0FEQzNfV0xPVzQJCSgxIDw8IDEzKQotI2RlZmluZSBNQzEzNzgzX0FEQzNfV0xPVzUJCSgxIDw8IDE0KQotI2RlZmluZSBNQzEzNzgzX0FEQzNfQURDQklTMgkJKDEgPDwgMjMpCi0KLSNkZWZpbmUgTUMxMzc4M19BREM0X0FEREJJUzEwCQkoMSA8PCAyKQotI2RlZmluZSBNQzEzNzgzX0FEQzRfQUREQklTMTEJCSgxIDw8IDMpCi0jZGVmaW5lIE1DMTM3ODNfQURDNF9BRERCSVMxMgkJKDEgPDwgNCkKLSNkZWZpbmUgTUMxMzc4M19BREM0X0FEREJJUzEzCQkoMSA8PCA1KQotI2RlZmluZSBNQzEzNzgzX0FEQzRfQUREQklTMTQJCSgxIDw8IDYpCi0jZGVmaW5lIE1DMTM3ODNfQURDNF9BRERCSVMxNQkJKDEgPDwgNykKLSNkZWZpbmUgTUMxMzc4M19BREM0X0FEREJJUzE2CQkoMSA8PCA4KQotI2RlZmluZSBNQzEzNzgzX0FEQzRfQUREQklTMTcJCSgxIDw8IDkpCi0jZGVmaW5lIE1DMTM3ODNfQURDNF9BRERCSVMxOAkJKDEgPDwgMTApCi0jZGVmaW5lIE1DMTM3ODNfQURDNF9BRERCSVMxOQkJKDEgPDwgMTEpCi0jZGVmaW5lIE1DMTM3ODNfQURDNF9BRERCSVMyMAkJKDEgPDwgMTQpCi0jZGVmaW5lIE1DMTM3ODNfQURDNF9BRERCSVMyMQkJKDEgPDwgMTUpCi0jZGVmaW5lIE1DMTM3ODNfQURDNF9BRERCSVMyMgkJKDEgPDwgMTYpCi0jZGVmaW5lIE1DMTM3ODNfQURDNF9BRERCSVMyMwkJKDEgPDwgMTcpCi0jZGVmaW5lIE1DMTM3ODNfQURDNF9BRERCSVMyNAkJKDEgPDwgMTgpCi0jZGVmaW5lIE1DMTM3ODNfQURDNF9BRERCSVMyNQkJKDEgPDwgMTkpCi0jZGVmaW5lIE1DMTM3ODNfQURDNF9BRERCSVMyNgkJKDEgPDwgMjApCi0jZGVmaW5lIE1DMTM3ODNfQURDNF9BRERCSVMyNwkJKDEgPDwgMjEpCi0jZGVmaW5lIE1DMTM3ODNfQURDNF9BRERCSVMyOAkJKDEgPDwgMjIpCi0jZGVmaW5lIE1DMTM3ODNfQURDNF9BRERCSVMyOQkJKDEgPDwgMjMpCisJcmV0dXJuIHJldDsKK30KIAogI2VuZGlmIC8qIF9fTElOVVhfTUZEX01DMTM3ODNfUFJJVl9IICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL21jMTM3ODMuaCBiL2luY2x1ZGUvbGludXgvbWZkL21jMTM3ODMuaAppbmRleCBiM2EyYTcyLi4zNTY4MDQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC9tYzEzNzgzLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvbWMxMzc4My5oCkBAIC0xLDI4ICsxLDUwIEBACiAvKgotICogQ29weXJpZ2h0IDIwMDkgUGVuZ3V0cm9uaXgsIFNhc2NoYSBIYXVlciA8cy5oYXVlckBwZW5ndXRyb25peC5kZT4KKyAqIENvcHlyaWdodCAyMDA5IFBlbmd1dHJvbml4CisgKiBVd2UgS2xlaW5lLUtvZW5pZyA8dS5rbGVpbmUta29lbmlnQHBlbmd1dHJvbml4LmRlPgogICoKLSAqIEluaXRpYWwgZGV2ZWxvcG1lbnQgb2YgdGhpcyBjb2RlIHdhcyBmdW5kZWQgYnkKLSAqIFBoeXRlYyBNZXNzdGVjaG5payBHbWJILCBodHRwOi8vd3d3LnBoeXRlYy5kZQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLworI2lmbmRlZiBfX0xJTlVYX01GRF9NQzEzNzgzX0gKKyNkZWZpbmUgX19MSU5VWF9NRkRfTUMxMzc4M19ICiAKLSNpZm5kZWYgX19JTkNMVURFX0xJTlVYX01GRF9NQzEzNzgzX0gKLSNkZWZpbmUgX19JTkNMVURFX0xJTlVYX01GRF9NQzEzNzgzX0gKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogc3RydWN0IG1jMTM3ODM7CisKK3ZvaWQgbWMxMzc4M19sb2NrKHN0cnVjdCBtYzEzNzgzICptYzEzNzgzKTsKK3ZvaWQgbWMxMzc4M191bmxvY2soc3RydWN0IG1jMTM3ODMgKm1jMTM3ODMpOworCitpbnQgbWMxMzc4M19yZWdfcmVhZChzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MywgdW5zaWduZWQgaW50IG9mZnNldCwgdTMyICp2YWwpOworaW50IG1jMTM3ODNfcmVnX3dyaXRlKHN0cnVjdCBtYzEzNzgzICptYzEzNzgzLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1MzIgdmFsKTsKK2ludCBtYzEzNzgzX3JlZ19ybXcoc3RydWN0IG1jMTM3ODMgKm1jMTM3ODMsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCXUzMiBtYXNrLCB1MzIgdmFsKTsKKworaW50IG1jMTM3ODNfaXJxX3JlcXVlc3Qoc3RydWN0IG1jMTM3ODMgKm1jMTM3ODMsIGludCBpcnEsCisJCWlycV9oYW5kbGVyX3QgaGFuZGxlciwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqZGV2KTsKK2ludCBtYzEzNzgzX2lycV9yZXF1ZXN0X25vdW5tYXNrKHN0cnVjdCBtYzEzNzgzICptYzEzNzgzLCBpbnQgaXJxLAorCQlpcnFfaGFuZGxlcl90IGhhbmRsZXIsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRldik7CitpbnQgbWMxMzc4M19pcnFfZnJlZShzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MywgaW50IGlycSwgdm9pZCAqZGV2KTsKK2ludCBtYzEzNzgzX2Fja2lycShzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MywgaW50IGlycSk7CisKK2ludCBtYzEzNzgzX21hc2soc3RydWN0IG1jMTM3ODMgKm1jMTM3ODMsIGludCBpcnEpOworaW50IG1jMTM3ODNfdW5tYXNrKHN0cnVjdCBtYzEzNzgzICptYzEzNzgzLCBpbnQgaXJxKTsKKworI2RlZmluZSBNQzEzNzgzX0FEQzAJCTQzCisjZGVmaW5lIE1DMTM3ODNfQURDMF9BRFJFRkVOCQkoMSA8PCAxMCkKKyNkZWZpbmUgTUMxMzc4M19BREMwX0FEUkVGTU9ERQkJKDEgPDwgMTEpCisjZGVmaW5lIE1DMTM3ODNfQURDMF9UU01PRDAJCSgxIDw8IDEyKQorI2RlZmluZSBNQzEzNzgzX0FEQzBfVFNNT0QxCQkoMSA8PCAxMykKKyNkZWZpbmUgTUMxMzc4M19BREMwX1RTTU9EMgkJKDEgPDwgMTQpCisjZGVmaW5lIE1DMTM3ODNfQURDMF9BRElOQzEJCSgxIDw8IDE2KQorI2RlZmluZSBNQzEzNzgzX0FEQzBfQURJTkMyCQkoMSA8PCAxNykKKworI2RlZmluZSBNQzEzNzgzX0FEQzBfVFNNT0RfTUFTSwkJKE1DMTM3ODNfQURDMF9UU01PRDAgfCBcCisJCQkJCU1DMTM3ODNfQURDMF9UU01PRDEgfCBcCisJCQkJCU1DMTM3ODNfQURDMF9UU01PRDIpCisKKy8qIHRvIGJlIGNsZWFuZWQgdXAgKi8KIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhOwogCiBzdHJ1Y3QgbWMxMzc4M19yZWd1bGF0b3JfaW5pdF9kYXRhIHsKQEAgLTMwLDIzICs1MiwzMCBAQAogCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICppbml0X2RhdGE7CiB9OwogCi1zdHJ1Y3QgbWMxMzc4M19wbGF0Zm9ybV9kYXRhIHsKLQlzdHJ1Y3QgbWMxMzc4M19yZWd1bGF0b3JfaW5pdF9kYXRhICpyZWd1bGF0b3JzOworc3RydWN0IG1jMTM3ODNfcmVndWxhdG9yX3BsYXRmb3JtX2RhdGEgewogCWludCBudW1fcmVndWxhdG9yczsKLQl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJc3RydWN0IG1jMTM3ODNfcmVndWxhdG9yX2luaXRfZGF0YSAqcmVndWxhdG9yczsKIH07CiAKLS8qIG1jMTM3ODNfcGxhdGZvcm1fZGF0YSBmbGFncyAqLworc3RydWN0IG1jMTM3ODNfcGxhdGZvcm1fZGF0YSB7CisJaW50IG51bV9yZWd1bGF0b3JzOworCXN0cnVjdCBtYzEzNzgzX3JlZ3VsYXRvcl9pbml0X2RhdGEgKnJlZ3VsYXRvcnM7CisKICNkZWZpbmUgTUMxMzc4M19VU0VfVE9VQ0hTQ1JFRU4gKDEgPDwgMCkKICNkZWZpbmUgTUMxMzc4M19VU0VfQ09ERUMJKDEgPDwgMSkKICNkZWZpbmUgTUMxMzc4M19VU0VfQURDCQkoMSA8PCAyKQogI2RlZmluZSBNQzEzNzgzX1VTRV9SVEMJCSgxIDw8IDMpCiAjZGVmaW5lIE1DMTM3ODNfVVNFX1JFR1VMQVRPUgkoMSA8PCA0KQorCXVuc2lnbmVkIGludCBmbGFnczsKK307CisKKyNkZWZpbmUgTUMxMzc4M19BRENfTU9ERV9UUwkJMQorI2RlZmluZSBNQzEzNzgzX0FEQ19NT0RFX1NJTkdMRV9DSEFOCTIKKyNkZWZpbmUgTUMxMzc4M19BRENfTU9ERV9NVUxUX0NIQU4JMwogCiBpbnQgbWMxMzc4M19hZGNfZG9fY29udmVyc2lvbihzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MywgdW5zaWduZWQgaW50IG1vZGUsCiAJCXVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgKnNhbXBsZSk7CiAKLXZvaWQgbWMxMzc4M19hZGNfc2V0X3RzX3N0YXR1cyhzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MywgdW5zaWduZWQgaW50IHN0YXR1cyk7CiAKICNkZWZpbmUJTUMxMzc4M19TV19TVzFBCQkwCiAjZGVmaW5lCU1DMTM3ODNfU1dfU1cxQgkJMQpAQCAtODAsNSArMTA5LDQ2IEBACiAjZGVmaW5lCU1DMTM3ODNfUkVHVV9WMwkJMjkKICNkZWZpbmUJTUMxMzc4M19SRUdVX1Y0CQkzMAogCi0jZW5kaWYgLyogX19JTkNMVURFX0xJTlVYX01GRF9NQzEzNzgzX0ggKi8KKyNkZWZpbmUgTUMxMzc4M19JUlFfQURDRE9ORQkwCisjZGVmaW5lIE1DMTM3ODNfSVJRX0FEQ0JJU0RPTkUJMQorI2RlZmluZSBNQzEzNzgzX0lSUV9UUwkJMgorI2RlZmluZSBNQzEzNzgzX0lSUV9XSElHSAkzCisjZGVmaW5lIE1DMTM3ODNfSVJRX1dMT1cJNAorI2RlZmluZSBNQzEzNzgzX0lSUV9DSEdERVQJNgorI2RlZmluZSBNQzEzNzgzX0lSUV9DSEdPVgk3CisjZGVmaW5lIE1DMTM3ODNfSVJRX0NIR1JFVgk4CisjZGVmaW5lIE1DMTM3ODNfSVJRX0NIR1NIT1JUCTkKKyNkZWZpbmUgTUMxMzc4M19JUlFfQ0NDVgkxMAorI2RlZmluZSBNQzEzNzgzX0lSUV9DSEdDVVJSCTExCisjZGVmaW5lIE1DMTM3ODNfSVJRX0JQT04JMTIKKyNkZWZpbmUgTUMxMzc4M19JUlFfTE9CQVRMCTEzCisjZGVmaW5lIE1DMTM3ODNfSVJRX0xPQkFUSAkxNAorI2RlZmluZSBNQzEzNzgzX0lSUV9VRFAJCTE1CisjZGVmaW5lIE1DMTM3ODNfSVJRX1VTQgkJMTYKKyNkZWZpbmUgTUMxMzc4M19JUlFfSUQJCTE5CisjZGVmaW5lIE1DMTM3ODNfSVJRX1NFMQkJMjEKKyNkZWZpbmUgTUMxMzc4M19JUlFfQ0tERVQJMjIKKyNkZWZpbmUgTUMxMzc4M19JUlFfVURNCQkyMworI2RlZmluZSBNQzEzNzgzX0lSUV8xSFoJCTI0CisjZGVmaW5lIE1DMTM3ODNfSVJRX1RPREEJMjUKKyNkZWZpbmUgTUMxMzc4M19JUlFfT05PRkQxCTI3CisjZGVmaW5lIE1DMTM3ODNfSVJRX09OT0ZEMgkyOAorI2RlZmluZSBNQzEzNzgzX0lSUV9PTk9GRDMJMjkKKyNkZWZpbmUgTUMxMzc4M19JUlFfU1lTUlNUCTMwCisjZGVmaW5lIE1DMTM3ODNfSVJRX1JUQ1JTVAkzMQorI2RlZmluZSBNQzEzNzgzX0lSUV9QQwkJMzIKKyNkZWZpbmUgTUMxMzc4M19JUlFfV0FSTQkzMworI2RlZmluZSBNQzEzNzgzX0lSUV9NRU1ITEQJMzQKKyNkZWZpbmUgTUMxMzc4M19JUlFfUFdSUkRZCTM1CisjZGVmaW5lIE1DMTM3ODNfSVJRX1RIV0FSTkwJMzYKKyNkZWZpbmUgTUMxMzc4M19JUlFfVEhXQVJOSAkzNworI2RlZmluZSBNQzEzNzgzX0lSUV9DTEsJCTM4CisjZGVmaW5lIE1DMTM3ODNfSVJRX1NFTUFGCTM5CisjZGVmaW5lIE1DMTM3ODNfSVJRX01DMkIJNDEKKyNkZWZpbmUgTUMxMzc4M19JUlFfSFNERVQJNDIKKyNkZWZpbmUgTUMxMzc4M19JUlFfSFNMCQk0MworI2RlZmluZSBNQzEzNzgzX0lSUV9BTFNQVEgJNDQKKyNkZWZpbmUgTUMxMzc4M19JUlFfQUhTU0hPUlQJNDUKKyNkZWZpbmUgTUMxMzc4M19OVU1fSVJRCQk0NgogCisjZW5kaWYgLyogX19MSU5VWF9NRkRfTUMxMzc4M19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9wY2Y1MDYzMy9jb3JlLmggYi9pbmNsdWRlL2xpbnV4L21mZC9wY2Y1MDYzMy9jb3JlLmgKaW5kZXggOWFiYTdiNy4uZDkwMzRjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvcGNmNTA2MzMvY29yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3BjZjUwNjMzL2NvcmUuaApAQCAtNDAsMTAgKzQwLDYgQEAKIAl1OCByZXN1bWVyc1s1XTsKIH07CiAKLXN0cnVjdCBwY2Y1MDYzM19zdWJkZXZfcGRhdGEgewotCXN0cnVjdCBwY2Y1MDYzMyAqcGNmOwotfTsKLQogc3RydWN0IHBjZjUwNjMzX2lycSB7CiAJdm9pZCAoKmhhbmRsZXIpIChpbnQsIHZvaWQgKik7CiAJdm9pZCAqZGF0YTsKQEAgLTIxNyw1ICsyMTMsOSBAQAogI2RlZmluZSBQQ0Y1MDYzM19SRUdfTEVEQ1RMIDB4MmEKICNkZWZpbmUgUENGNTA2MzNfUkVHX0xFRERJTSAweDJiCiAKLSNlbmRpZgorc3RhdGljIGlubGluZSBzdHJ1Y3QgcGNmNTA2MzMgKmRldl90b19wY2Y1MDYzMyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldl9nZXRfZHJ2ZGF0YShkZXYpOworfQogCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3dtODMxeC9jb3JlLmggYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzMXgvY29yZS5oCmluZGV4IDkxZWI0OTMuLjUxODRiNzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3dtODMxeC9jb3JlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzF4L2NvcmUuaApAQCAtMTYsNyArMTYsNiBAQAogI2RlZmluZSBfX01GRF9XTTgzMVhfQ09SRV9IX18KIAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCiAvKgogICogUmVnaXN0ZXIgdmFsdWVzLgpAQCAtMTE3LDYgKzExNiw3IEBACiAjZGVmaW5lIFdNODMxWF9EQzNfU0xFRVBfQ09OVFJPTCAgICAgICAgICAgICAgICAweDQwNjMKICNkZWZpbmUgV004MzFYX0RDNF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgIDB4NDA2NAogI2RlZmluZSBXTTgzMVhfREM0X1NMRUVQX0NPTlRST0wgICAgICAgICAgICAgICAgMHg0MDY1CisjZGVmaW5lIFdNODMyWF9EQzRfU0xFRVBfQ09OVFJPTCAgICAgICAgICAgICAgICAweDQwNjcKICNkZWZpbmUgV004MzFYX0VQRTFfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgIDB4NDA2NgogI2RlZmluZSBXTTgzMVhfRVBFMl9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgMHg0MDY3CiAjZGVmaW5lIFdNODMxWF9MRE8xX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAweDQwNjgKQEAgLTIzNSw2ICsyMzUsOCBAQAogCiBzdHJ1Y3QgcmVndWxhdG9yX2RldjsKIAorI2RlZmluZSBXTTgzMVhfTlVNX0lSUV9SRUdTIDUKKwogc3RydWN0IHdtODMxeCB7CiAJc3RydWN0IG11dGV4IGlvX2xvY2s7CiAKQEAgLTI0OCwxMCArMjUwLDExIEBACiAKIAlpbnQgaXJxOyAgLyogT3VyIGNoaXAgSVJRICovCiAJc3RydWN0IG11dGV4IGlycV9sb2NrOwotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICppcnFfd3E7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IGlycV93b3JrOwogCXVuc2lnbmVkIGludCBpcnFfYmFzZTsKLQlpbnQgaXJxX21hc2tzWzVdOworCWludCBpcnFfbWFza3NfY3VyW1dNODMxWF9OVU1fSVJRX1JFR1NdOyAgIC8qIEN1cnJlbnRseSBhY3RpdmUgdmFsdWUgKi8KKwlpbnQgaXJxX21hc2tzX2NhY2hlW1dNODMxWF9OVU1fSVJRX1JFR1NdOyAvKiBDYWNoZWQgaGFyZHdhcmUgdmFsdWUgKi8KKworCWludCBudW1fZ3BpbzsKIAogCXN0cnVjdCBtdXRleCBhdXhhZGNfbG9jazsKIApAQCAtMjc4LDEyICsyODEsMzAgQEAKIGludCB3bTgzMXhfaXJxX2luaXQoc3RydWN0IHdtODMxeCAqd204MzF4LCBpbnQgaXJxKTsKIHZvaWQgd204MzF4X2lycV9leGl0KHN0cnVjdCB3bTgzMXggKndtODMxeCk7CiAKLWludCBfX211c3RfY2hlY2sgd204MzF4X3JlcXVlc3RfaXJxKHN0cnVjdCB3bTgzMXggKndtODMxeCwKLQkJCQkgICAgdW5zaWduZWQgaW50IGlycSwgaXJxX2hhbmRsZXJfdCBoYW5kbGVyLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBjaGFyICpuYW1lLAotCQkJCSAgICB2b2lkICpkZXYpOwotdm9pZCB3bTgzMXhfZnJlZV9pcnEoc3RydWN0IHdtODMxeCAqd204MzF4LCB1bnNpZ25lZCBpbnQsIHZvaWQgKik7Ci12b2lkIHdtODMxeF9kaXNhYmxlX2lycShzdHJ1Y3Qgd204MzF4ICp3bTgzMXgsIGludCBpcnEpOwotdm9pZCB3bTgzMXhfZW5hYmxlX2lycShzdHJ1Y3Qgd204MzF4ICp3bTgzMXgsIGludCBpcnEpOworc3RhdGljIGlubGluZSBpbnQgX19tdXN0X2NoZWNrIHdtODMxeF9yZXF1ZXN0X2lycShzdHJ1Y3Qgd204MzF4ICp3bTgzMXgsCisJCQkJCQkgIHVuc2lnbmVkIGludCBpcnEsCisJCQkJCQkgIGlycV9oYW5kbGVyX3QgaGFuZGxlciwKKwkJCQkJCSAgdW5zaWduZWQgbG9uZyBmbGFncywKKwkJCQkJCSAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJCSAgdm9pZCAqZGV2KQoreworCXJldHVybiByZXF1ZXN0X3RocmVhZGVkX2lycShpcnEsIE5VTEwsIGhhbmRsZXIsIGZsYWdzLCBuYW1lLCBkZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd204MzF4X2ZyZWVfaXJxKHN0cnVjdCB3bTgzMXggKndtODMxeCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXYpCit7CisJZnJlZV9pcnEoaXJxLCBkZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd204MzF4X2Rpc2FibGVfaXJxKHN0cnVjdCB3bTgzMXggKndtODMxeCwgaW50IGlycSkKK3sKKwlkaXNhYmxlX2lycShpcnEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd204MzF4X2VuYWJsZV9pcnEoc3RydWN0IHdtODMxeCAqd204MzF4LCBpbnQgaXJxKQoreworCWVuYWJsZV9pcnEoaXJxKTsKK30KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93bTgzMXgvcGRhdGEuaCBiL2luY2x1ZGUvbGludXgvbWZkL3dtODMxeC9wZGF0YS5oCmluZGV4IDkwZDgyMDIuLjQxNWMyMjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3dtODMxeC9wZGF0YS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3dtODMxeC9wZGF0YS5oCkBAIC05MSw2ICs5MSw3IEBACiAJLyoqIENhbGxlZCBhZnRlciBzdWJkZXZpY2VzIGFyZSBzZXQgdXAgKi8KIAlpbnQgKCpwb3N0X2luaXQpKHN0cnVjdCB3bTgzMXggKndtODMxeCk7CiAKKwlpbnQgaXJxX2Jhc2U7CiAJaW50IGdwaW9fYmFzZTsKIAlzdHJ1Y3Qgd204MzF4X2JhY2tsaWdodF9wZGF0YSAqYmFja2xpZ2h0OwogCXN0cnVjdCB3bTgzMXhfYmFja3VwX3BkYXRhICpiYWNrdXA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvY29yZS5oIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL2NvcmUuaAppbmRleCAxZDU5NWRlLi40Mzg2ODg5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvY29yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC9jb3JlLmgKQEAgLTE1LDcgKzE1LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9tZmQvd204MzUwL2F1ZGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3dtODM1MC9ncGlvLmg+CkBAIC02MDEsNyArNjAxLDcgQEAKIHN0cnVjdCB3bTgzNTA7CiAKIHN0cnVjdCB3bTgzNTBfaXJxIHsKLQl2b2lkICgqaGFuZGxlcikgKHN0cnVjdCB3bTgzNTAgKiwgaW50LCB2b2lkICopOworCWlycV9oYW5kbGVyX3QgaGFuZGxlcjsKIAl2b2lkICpkYXRhOwogfTsKIApAQCAtNjQ2LDEwICs2NDYsMTIgQEAKICAqIEBpbml0OiBGdW5jdGlvbiBjYWxsZWQgZHVyaW5nIGRyaXZlciBpbml0aWFsaXNhdGlvbi4gIFNob3VsZCBiZQogICogICAgICAgIHVzZWQgYnkgdGhlIHBsYXRmb3JtIHRvIGNvbmZpZ3VyZSBHUElPIGZ1bmN0aW9ucyBhbmQgc2ltaWxhci4KICAqIEBpcnFfaGlnaDogU2V0IGlmIFdNODM1MCBJUlEgaXMgYWN0aXZlIGhpZ2guCisgKiBAaXJxX2Jhc2U6IEJhc2UgSVJRIGZvciBnZW5pcnEgKG5vdCBjdXJyZW50bHkgdXNlZCkuCiAgKi8KIHN0cnVjdCB3bTgzNTBfcGxhdGZvcm1fZGF0YSB7CiAJaW50ICgqaW5pdCkoc3RydWN0IHdtODM1MCAqd204MzUwKTsKIAlpbnQgaXJxX2hpZ2g7CisJaW50IGlycV9iYXNlOwogfTsKIAogCkBAIC02NzYsMTEgKzY3OCwxMyBAQAogICogV004MzUwIGludGVybmFsIGludGVycnVwdHMKICAqLwogaW50IHdtODM1MF9yZWdpc3Rlcl9pcnEoc3RydWN0IHdtODM1MCAqd204MzUwLCBpbnQgaXJxLAotCQkJdm9pZCAoKmhhbmRsZXIpIChzdHJ1Y3Qgd204MzUwICosIGludCwgdm9pZCAqKSwKLQkJCXZvaWQgKmRhdGEpOworCQkJaXJxX2hhbmRsZXJfdCBoYW5kbGVyLCB1bnNpZ25lZCBsb25nIGZsYWdzLAorCQkJY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqZGF0YSk7CiBpbnQgd204MzUwX2ZyZWVfaXJxKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IGlycSk7CiBpbnQgd204MzUwX21hc2tfaXJxKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IGlycSk7CiBpbnQgd204MzUwX3VubWFza19pcnEoc3RydWN0IHdtODM1MCAqd204MzUwLCBpbnQgaXJxKTsKLQoraW50IHdtODM1MF9pcnFfaW5pdChzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBpcnEsCisJCSAgICBzdHJ1Y3Qgd204MzUwX3BsYXRmb3JtX2RhdGEgKnBkYXRhKTsKK2ludCB3bTgzNTBfaXJxX2V4aXQoc3RydWN0IHdtODM1MCAqd204MzUwKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvZ3Bpby5oIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL2dwaW8uaAppbmRleCBlZDkxZThmLi43MWFmM2Q2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvZ3Bpby5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC9ncGlvLmgKQEAgLTE3Myw2ICsxNzMsMjQgQEAKICNkZWZpbmUgV004MzUwX0dQSU9fREVCT1VOQ0VfT04JCQkxCiAKIC8qCisgKiBSMzAgKDB4MUUpIC0gR1BJTyBJbnRlcnJ1cHQgU3RhdHVzCisgKi8KKyNkZWZpbmUgV004MzUwX0dQMTJfRUlOVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBXTTgzNTBfR1AxMV9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFdNODM1MF9HUDEwX0VJTlQgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgV004MzUwX0dQOV9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBXTTgzNTBfR1A4X0VJTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFdNODM1MF9HUDdfRUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgV004MzUwX0dQNl9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBXTTgzNTBfR1A1X0VJTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFdNODM1MF9HUDRfRUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgV004MzUwX0dQM19FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBXTTgzNTBfR1AyX0VJTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFdNODM1MF9HUDFfRUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgV004MzUwX0dQMF9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorCisKKy8qCiAgKiBSMTI4ICgweDgwKSAtIEdQSU8gRGVib3VuY2UKICAqLwogI2RlZmluZSBXTTgzNTBfR1AxMl9EQiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25hbWVpLmggYi9pbmNsdWRlL2xpbnV4L25hbWVpLmgKaW5kZXggZWMwZjYwNy4uMDI4OTQ2NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uYW1laS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmFtZWkuaApAQCAtNzYsNyArNzYsNiBAQAogZXh0ZXJuIHZvaWQgcmVsZWFzZV9vcGVuX2ludGVudChzdHJ1Y3QgbmFtZWlkYXRhICopOwogCiBleHRlcm4gc3RydWN0IGRlbnRyeSAqbG9va3VwX29uZV9sZW4oY29uc3QgY2hhciAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCk7Ci1leHRlcm4gc3RydWN0IGRlbnRyeSAqbG9va3VwX29uZV9ub3Blcm0oY29uc3QgY2hhciAqLCBzdHJ1Y3QgZGVudHJ5ICopOwogCiBleHRlcm4gaW50IGZvbGxvd19kb3duKHN0cnVjdCBwYXRoICopOwogZXh0ZXJuIGludCBmb2xsb3dfdXAoc3RydWN0IHBhdGggKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mczQuaCBiL2luY2x1ZGUvbGludXgvbmZzNC5oCmluZGV4IGM0YzA2MDIuLjliODI5OWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzNC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzNC5oCkBAIC0xMjgsNiArMTI4LDggQEAKICNkZWZpbmUgU0VRNF9TVEFUVVNfUkVDQUxMQUJMRV9TVEFURV9SRVZPS0VECTB4MDAwMDAwNDAKICNkZWZpbmUgU0VRNF9TVEFUVVNfTEVBU0VfTU9WRUQJCQkweDAwMDAwMDgwCiAjZGVmaW5lIFNFUTRfU1RBVFVTX1JFU1RBUlRfUkVDTEFJTV9ORUVERUQJMHgwMDAwMDEwMAorI2RlZmluZSBTRVE0X1NUQVRVU19DQl9QQVRIX0RPV05fU0VTU0lPTgkweDAwMDAwMjAwCisjZGVmaW5lIFNFUTRfU1RBVFVTX0JBQ0tDSEFOTkVMX0ZBVUxUCQkweDAwMDAwNDAwCiAKICNkZWZpbmUgTkZTNF9NQVhfVUlOVDY0CSh+KHU2NCkwKQogCkBAIC01MjgsNiArNTMwLDcgQEAKIAlORlNQUk9DNF9DTE5UX0RFU1RST1lfU0VTU0lPTiwKIAlORlNQUk9DNF9DTE5UX1NFUVVFTkNFLAogCU5GU1BST0M0X0NMTlRfR0VUX0xFQVNFX1RJTUUsCisJTkZTUFJPQzRfQ0xOVF9SRUNMQUlNX0NPTVBMRVRFLAogfTsKIAogLyogbmZzNDEgdHlwZXMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzX2ZzX3NiLmggYi9pbmNsdWRlL2xpbnV4L25mc19mc19zYi5oCmluZGV4IDMyMDU2OWUuLjM0ZmM2YmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzX2ZzX3NiLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNfZnNfc2IuaApAQCAtMjA5LDYgKzIwOSw3IEBACiAJdW5zaWduZWQgbG9uZwkJCXNlc3Npb25fc3RhdGU7CiAJdTMyCQkJCWhhc2hfYWxnOwogCXUzMgkJCQlzc3ZfbGVuOworCXN0cnVjdCBjb21wbGV0aW9uCQljb21wbGV0ZTsKIAogCS8qIFRoZSBmb3JlIGFuZCBiYWNrIGNoYW5uZWwgKi8KIAlzdHJ1Y3QgbmZzNF9jaGFubmVsX2F0dHJzCWZjX2F0dHJzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNfeGRyLmggYi9pbmNsdWRlL2xpbnV4L25mc194ZHIuaAppbmRleCA2MmY2M2ZiLi41MTA3MWIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc194ZHIuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc194ZHIuaApAQCAtMTcwLDggKzE3MCw5IEBACiBzdHJ1Y3QgbmZzNF9zZXF1ZW5jZV9yZXMgewogCXN0cnVjdCBuZnM0X3Nlc3Npb24JKnNyX3Nlc3Npb247CiAJdTgJCQlzcl9zbG90aWQ7CS8qIHNsb3QgdXNlZCB0byBzZW5kIHJlcXVlc3QgKi8KLQl1bnNpZ25lZCBsb25nCQlzcl9yZW5ld2FsX3RpbWU7CiAJaW50CQkJc3Jfc3RhdHVzOwkvKiBzZXF1ZW5jZSBvcGVyYXRpb24gc3RhdHVzICovCisJdW5zaWduZWQgbG9uZwkJc3JfcmVuZXdhbF90aW1lOworCXUzMgkJCXNyX3N0YXR1c19mbGFnczsKIH07CiAKIHN0cnVjdCBuZnM0X2dldF9sZWFzZV90aW1lX2FyZ3MgewpAQCAtOTM4LDYgKzkzOSwxNiBAQAogc3RydWN0IG5mczQxX2NyZWF0ZV9zZXNzaW9uX3JlcyB7CiAJc3RydWN0IG5mc19jbGllbnQJICAgICAgICpjbGllbnQ7CiB9OworCitzdHJ1Y3QgbmZzNDFfcmVjbGFpbV9jb21wbGV0ZV9hcmdzIHsKKwkvKiBJbiB0aGUgZnV0dXJlIGV4dGVuZCB0byBpbmNsdWRlIGN1cnJfZmggZm9yIHVzZSB3aXRoIG1pZ3JhdGlvbiAqLworCXVuc2lnbmVkIGNoYXIJCQlvbmVfZnM6MTsKKwlzdHJ1Y3QgbmZzNF9zZXF1ZW5jZV9hcmdzCXNlcV9hcmdzOworfTsKKworc3RydWN0IG5mczQxX3JlY2xhaW1fY29tcGxldGVfcmVzIHsKKwlzdHJ1Y3QgbmZzNF9zZXF1ZW5jZV9yZXMJc2VxX3JlczsKK307CiAjZW5kaWYgLyogQ09ORklHX05GU19WNF8xICovCiAKIHN0cnVjdCBuZnNfcGFnZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmlsZnMyX2ZzLmggYi9pbmNsdWRlL2xpbnV4L25pbGZzMl9mcy5oCmluZGV4IGNlNTIwNDAuLjNmZTAyY2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmlsZnMyX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uaWxmczJfZnMuaApAQCAtMTUxLDYgKzE1MSw4IEBACiAjZGVmaW5lIE5JTEZTX01PVU5UX0JBUlJJRVIJCTB4MTAwMCAgLyogVXNlIGJsb2NrIGJhcnJpZXJzICovCiAjZGVmaW5lIE5JTEZTX01PVU5UX1NUUklDVF9PUkRFUgkweDIwMDAgIC8qIEFwcGx5IHN0cmljdCBpbi1vcmRlcgogCQkJCQkJICAgc2VtYW50aWNzIGFsc28gZm9yIGRhdGEgKi8KKyNkZWZpbmUgTklMRlNfTU9VTlRfTk9SRUNPVkVSWQkJMHg0MDAwICAvKiBEaXNhYmxlIHdyaXRlIGFjY2VzcyBkdXJpbmcKKwkJCQkJCSAgIG1vdW50LXRpbWUgcmVjb3ZlcnkgKi8KIAogCiAvKioKQEAgLTQwMyw2ICs0MDUsMjggQEAKICNkZWZpbmUgTklMRlNfU1NfR0MgICAgIDB4MDAxMCAgLyogc2VnbWVudCB3cml0dGVuIGZvciBjbGVhbmVyIG9wZXJhdGlvbiAqLwogCiAvKioKKyAqIHN0cnVjdCBuaWxmc19idHJlZV9ub2RlIC0gQi10cmVlIG5vZGUKKyAqIEBibl9mbGFnczogZmxhZ3MKKyAqIEBibl9sZXZlbDogbGV2ZWwKKyAqIEBibl9uY2hpbGRyZW46IG51bWJlciBvZiBjaGlsZHJlbgorICogQGJuX3BhZDogcGFkZGluZworICovCitzdHJ1Y3QgbmlsZnNfYnRyZWVfbm9kZSB7CisJX191OCBibl9mbGFnczsKKwlfX3U4IGJuX2xldmVsOworCV9fbGUxNiBibl9uY2hpbGRyZW47CisJX19sZTMyIGJuX3BhZDsKK307CisKKy8qIGZsYWdzICovCisjZGVmaW5lIE5JTEZTX0JUUkVFX05PREVfUk9PVCAgIDB4MDEKKworLyogbGV2ZWwgKi8KKyNkZWZpbmUgTklMRlNfQlRSRUVfTEVWRUxfREFUQSAgICAgICAgICAwCisjZGVmaW5lIE5JTEZTX0JUUkVFX0xFVkVMX05PREVfTUlOICAgICAgKE5JTEZTX0JUUkVFX0xFVkVMX0RBVEEgKyAxKQorI2RlZmluZSBOSUxGU19CVFJFRV9MRVZFTF9NQVggICAgICAgICAgIDE0CisKKy8qKgogICogc3RydWN0IG5pbGZzX3BhbGxvY19ncm91cF9kZXNjIC0gYmxvY2sgZ3JvdXAgZGVzY3JpcHRvcgogICogQHBnX25mcmVlczogbnVtYmVyIG9mIGZyZWUgZW50cmllcyBpbiBibG9jayBncm91cAogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaS5oIGIvaW5jbHVkZS9saW51eC9wY2kuaAppbmRleCBmNWM3Y2QzLi5iZjFlNjcwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpLmgKQEAgLTIxOCw2ICsyMTgsNyBAQAogCXVuc2lnbmVkIGludAljbGFzczsJCS8qIDMgYnl0ZXM6IChiYXNlLHN1Yixwcm9nLWlmKSAqLwogCXU4CQlyZXZpc2lvbjsJLyogUENJIHJldmlzaW9uLCBsb3cgYnl0ZSBvZiBjbGFzcyB3b3JkICovCiAJdTgJCWhkcl90eXBlOwkvKiBQQ0kgaGVhZGVyIHR5cGUgKGBtdWx0aScgZmxhZyBtYXNrZWQgb3V0KSAqLworCXU4CQlwY2llX2NhcDsJLyogUENJLUUgY2FwYWJpbGl0eSBvZmZzZXQgKi8KIAl1OAkJcGNpZV90eXBlOwkvKiBQQ0ktRSBkZXZpY2UvcG9ydCB0eXBlICovCiAJdTgJCXJvbV9iYXNlX3JlZzsJLyogd2hpY2ggY29uZmlnIHJlZ2lzdGVyIGNvbnRyb2xzIHRoZSBST00gKi8KIAl1OAkJcGluOyAgCQkvKiB3aGljaCBpbnRlcnJ1cHQgcGluIHRoaXMgZGV2aWNlIHVzZXMgKi8KQEAgLTI4MCw2ICsyODEsNyBAQAogCXVuc2lnbmVkIGludAlpc192aXJ0Zm46MTsKIAl1bnNpZ25lZCBpbnQJcmVzZXRfZm46MTsKIAl1bnNpZ25lZCBpbnQgICAgaXNfaG90cGx1Z19icmlkZ2U6MTsKKwl1bnNpZ25lZCBpbnQgICAgYWVyX2Zpcm13YXJlX2ZpcnN0OjE7CiAJcGNpX2Rldl9mbGFnc190IGRldl9mbGFnczsKIAlhdG9taWNfdAllbmFibGVfY250OwkvKiBwY2lfZW5hYmxlX2RldmljZSBoYXMgYmVlbiBjYWxsZWQgKi8KIApAQCAtNjM1LDcgKzYzNywxMyBAQAogCQkJCXVuc2lnbmVkIGludCBzc192ZW5kb3IsIHVuc2lnbmVkIGludCBzc19kZXZpY2UsCiAJCQkJc3RydWN0IHBjaV9kZXYgKmZyb20pOwogc3RydWN0IHBjaV9kZXYgKnBjaV9nZXRfc2xvdChzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4pOwotc3RydWN0IHBjaV9kZXYgKnBjaV9nZXRfYnVzX2FuZF9zbG90KHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZmbik7CitzdHJ1Y3QgcGNpX2RldiAqcGNpX2dldF9kb21haW5fYnVzX2FuZF9zbG90KGludCBkb21haW4sIHVuc2lnbmVkIGludCBidXMsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgZGV2Zm4pOworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGNpX2RldiAqcGNpX2dldF9idXNfYW5kX3Nsb3QodW5zaWduZWQgaW50IGJ1cywKKwkJCQkJCSAgIHVuc2lnbmVkIGludCBkZXZmbikKK3sKKwlyZXR1cm4gcGNpX2dldF9kb21haW5fYnVzX2FuZF9zbG90KDAsIGJ1cywgZGV2Zm4pOworfQogc3RydWN0IHBjaV9kZXYgKnBjaV9nZXRfY2xhc3ModW5zaWduZWQgaW50IGNsYXNzLCBzdHJ1Y3QgcGNpX2RldiAqZnJvbSk7CiBpbnQgcGNpX2Rldl9wcmVzZW50KGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZHMpOwogCkBAIC03MDEsNiArNzA5LDcgQEAKIHZvaWQgcGNpX3NldF9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldik7CiB2b2lkIHBjaV9jbGVhcl9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldik7CiBpbnQgcGNpX3NldF9wY2llX3Jlc2V0X3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGVudW0gcGNpZV9yZXNldF9zdGF0ZSBzdGF0ZSk7CitpbnQgcGNpX3NldF9jYWNoZWxpbmVfc2l6ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKICNkZWZpbmUgSEFWRV9QQ0lfU0VUX01XSQogaW50IF9fbXVzdF9jaGVjayBwY2lfc2V0X213aShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGludCBwY2lfdHJ5X3NldF9td2koc3RydWN0IHBjaV9kZXYgKmRldik7CkBAIC0xMjQ2LDYgKzEyNTUsOCBAQAogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBwY2lfY2FyZGJ1c19pb19zaXplOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGNpX2NhcmRidXNfbWVtX3NpemU7CitleHRlcm4gdTggX19kZXZpbml0ZGF0YSBwY2lfZGZsX2NhY2hlX2xpbmVfc2l6ZTsKK2V4dGVybiB1OCBwY2lfY2FjaGVfbGluZV9zaXplOwogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBwY2lfaG90cGx1Z19pb19zaXplOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGNpX2hvdHBsdWdfbWVtX3NpemU7CkBAIC0xMjkwLDUgKzEzMDEsMzQgQEAKIGV4dGVybiB2b2lkIHBjaV9ocF9yZW1vdmVfbW9kdWxlX2xpbmsoc3RydWN0IHBjaV9zbG90ICpwY2lfc2xvdCk7CiAjZW5kaWYKIAorLyoqCisgKiBwY2lfcGNpZV9jYXAgLSBnZXQgdGhlIHNhdmVkIFBDSWUgY2FwYWJpbGl0eSBvZmZzZXQKKyAqIEBkZXY6IFBDSSBkZXZpY2UKKyAqCisgKiBQQ0llIGNhcGFiaWxpdHkgb2Zmc2V0IGlzIGNhbGN1bGF0ZWQgYXQgUENJIGRldmljZSBpbml0aWFsaXphdGlvbgorICogdGltZSBhbmQgc2F2ZWQgaW4gdGhlIGRhdGEgc3RydWN0dXJlLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgc2F2ZWQKKyAqIFBDSWUgY2FwYWJpbGl0eSBvZmZzZXQuIFVzaW5nIHRoaXMgaW5zdGVhZCBvZiBwY2lfZmluZF9jYXBhYmlsaXR5KCkKKyAqIHJlZHVjZXMgdW5uZWNlc3Nhcnkgc2VhcmNoIGluIHRoZSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZS4gSWYgeW91CisgKiBuZWVkIHRvIGNhbGN1bGF0ZSBQQ0llIGNhcGFiaWxpdHkgb2Zmc2V0IGZyb20gcmF3IGRldmljZSBmb3Igc29tZQorICogcmVhc29ucywgcGxlYXNlIHVzZSBwY2lfZmluZF9jYXBhYmlsaXR5KCkgaW5zdGVhZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcGNpX3BjaWVfY2FwKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJcmV0dXJuIGRldi0+cGNpZV9jYXA7Cit9CisKKy8qKgorICogcGNpX2lzX3BjaWUgLSBjaGVjayBpZiB0aGUgUENJIGRldmljZSBpcyBQQ0kgRXhwcmVzcyBjYXBhYmxlCisgKiBAZGV2OiBQQ0kgZGV2aWNlCisgKgorICogUmV0cnVuIHRydWUgaWYgdGhlIFBDSSBkZXZpY2UgaXMgUENJIEV4cHJlc3MgY2FwYWJsZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgcGNpX2lzX3BjaWUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlyZXR1cm4gISFwY2lfcGNpZV9jYXAoZGV2KTsKK30KKwordm9pZCBwY2lfcmVxdWVzdF9hY3Modm9pZCk7CisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogTElOVVhfUENJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKaW5kZXggZWFlMWY4Ni4uY2NhOGEwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKQEAgLTIyOTUsNiArMjI5NSwyMCBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX01QQzg1MzYJCTB4MDA1MQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1AyMDIwRQkJMHgwMDcwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUDIwMjAJCTB4MDA3MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1AyMDEwRQkJMHgwMDc4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUDIwMTAJCTB4MDA3OQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1AxMDIwRQkJMHgwMTAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUDEwMjAJCTB4MDEwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1AxMDExRQkJMHgwMTA4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUDEwMTEJCTB4MDEwOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1AxMDIyRQkJMHgwMTEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUDEwMjIJCTB4MDExMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1AxMDEzRQkJMHgwMTE4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUDEwMTMJCTB4MDExOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1A0MDgwRQkJMHgwNDAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUDQwODAJCTB4MDQwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1A0MDQwRQkJMHgwNDA4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUDQwNDAJCTB4MDQwOQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX01QQzg2NDEJCTB4NzAxMAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX01QQzg2NDFECQkweDcwMTEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9NUEM4NjEwCQkweDcwMTgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpX3JlZ3MuaCBiL2luY2x1ZGUvbGludXgvcGNpX3JlZ3MuaAppbmRleCBkZDBiZWQ0Li45ZjJhZDBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaV9yZWdzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2lfcmVncy5oCkBAIC0zNjUsNiArMzY1LDExIEBACiAjZGVmaW5lICBQQ0lfWF9TVEFUVVNfMjY2TUhaCTB4NDAwMDAwMDAJLyogMjY2IE1IeiBjYXBhYmxlICovCiAjZGVmaW5lICBQQ0lfWF9TVEFUVVNfNTMzTUhaCTB4ODAwMDAwMDAJLyogNTMzIE1IeiBjYXBhYmxlICovCiAKKy8qIFBDSSBCcmlkZ2UgU3Vic3lzdGVtIElEIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIFBDSV9TU1ZJRF9WRU5ET1JfSUQgICAgIDQJLyogUENJLUJyaWRnZSBzdWJzeXN0ZW0gdmVuZG9yIGlkIHJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9TU1ZJRF9ERVZJQ0VfSUQgICAgIDYJLyogUENJLUJyaWRnZSBzdWJzeXN0ZW0gZGV2aWNlIGlkIHJlZ2lzdGVyICovCisKIC8qIFBDSSBFeHByZXNzIGNhcGFiaWxpdHkgcmVnaXN0ZXJzICovCiAKICNkZWZpbmUgUENJX0VYUF9GTEFHUwkJMgkvKiBDYXBhYmlsaXRpZXMgcmVnaXN0ZXIgKi8KQEAgLTUwMiw2ICs1MDcsNyBAQAogI2RlZmluZSBQQ0lfRVhUX0NBUF9JRF9WQwkyCiAjZGVmaW5lIFBDSV9FWFRfQ0FQX0lEX0RTTgkzCiAjZGVmaW5lIFBDSV9FWFRfQ0FQX0lEX1BXUgk0CisjZGVmaW5lIFBDSV9FWFRfQ0FQX0lEX0FDUwkxMwogI2RlZmluZSBQQ0lfRVhUX0NBUF9JRF9BUkkJMTQKICNkZWZpbmUgUENJX0VYVF9DQVBfSURfQVRTCTE1CiAjZGVmaW5lIFBDSV9FWFRfQ0FQX0lEX1NSSU9WCTE2CkBAIC02NjIsNCArNjY4LDE2IEBACiAjZGVmaW5lICBQQ0lfU1JJT1ZfVkZNX01PCTB4MgkvKiBBY3RpdmUuTWlncmF0ZU91dCAqLwogI2RlZmluZSAgUENJX1NSSU9WX1ZGTV9BVgkweDMJLyogQWN0aXZlLkF2YWlsYWJsZSAqLwogCisvKiBBY2Nlc3MgQ29udHJvbCBTZXJ2aWNlICovCisjZGVmaW5lIFBDSV9BQ1NfQ0FQCQkweDA0CS8qIEFDUyBDYXBhYmlsaXR5IFJlZ2lzdGVyICovCisjZGVmaW5lICBQQ0lfQUNTX1NWCQkweDAxCS8qIFNvdXJjZSBWYWxpZGF0aW9uICovCisjZGVmaW5lICBQQ0lfQUNTX1RCCQkweDAyCS8qIFRyYW5zbGF0aW9uIEJsb2NraW5nICovCisjZGVmaW5lICBQQ0lfQUNTX1JSCQkweDA0CS8qIFAyUCBSZXF1ZXN0IFJlZGlyZWN0ICovCisjZGVmaW5lICBQQ0lfQUNTX0NSCQkweDA4CS8qIFAyUCBDb21wbGV0aW9uIFJlZGlyZWN0ICovCisjZGVmaW5lICBQQ0lfQUNTX1VGCQkweDEwCS8qIFVwc3RyZWFtIEZvcndhcmRpbmcgKi8KKyNkZWZpbmUgIFBDSV9BQ1NfRUMJCTB4MjAJLyogUDJQIEVncmVzcyBDb250cm9sICovCisjZGVmaW5lICBQQ0lfQUNTX0RUCQkweDQwCS8qIERpcmVjdCBUcmFuc2xhdGVkIFAyUCAqLworI2RlZmluZSBQQ0lfQUNTX0NUUkwJCTB4MDYJLyogQUNTIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENJX0FDU19FR1JFU1NfQ1RMX1YJMHgwOAkvKiBBQ1MgRWdyZXNzIENvbnRyb2wgVmVjdG9yICovCisKICNlbmRpZiAvKiBMSU5VWF9QQ0lfUkVHU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaWVwb3J0X2lmLmggYi9pbmNsdWRlL2xpbnV4L3BjaWVwb3J0X2lmLmgKaW5kZXggYjRjNzk1NC4uNjc3NTUzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2llcG9ydF9pZi5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpZXBvcnRfaWYuaApAQCAtMTAsMTAgKzEwLDcgQEAKICNkZWZpbmUgX1BDSUVQT1JUX0lGX0hfCiAKIC8qIFBvcnQgVHlwZSAqLwotI2RlZmluZSBQQ0lFX1JDX1BPUlQJCQk0CS8qIFJvb3QgcG9ydCBvZiBSQyAqLwotI2RlZmluZSBQQ0lFX1NXX1VQU1RSRUFNX1BPUlQJCTUJLyogVXBzdHJlYW0gcG9ydCBvZiBTd2l0Y2ggKi8KLSNkZWZpbmUgUENJRV9TV19ET1dOU1RSRUFNX1BPUlQJCTYJLyogRG93bnN0cmVhbSBwb3J0IG9mIFN3aXRjaCAqLwotI2RlZmluZSBQQ0lFX0FOWV9QT1JUCQkJNworI2RlZmluZSBQQ0lFX0FOWV9QT1JUCQkJKH4wKQogCiAvKiBTZXJ2aWNlIFR5cGUgKi8KICNkZWZpbmUgUENJRV9QT1JUX1NFUlZJQ0VfUE1FX1NISUZUCTAJLyogUG93ZXIgTWFuYWdlbWVudCBFdmVudCAqLwpAQCAtMjUsMTcgKzIyLDYgQEAKICNkZWZpbmUgUENJRV9QT1JUX1NFUlZJQ0VfVkNfU0hJRlQJMwkvKiBWaXJ0dWFsIENoYW5uZWwgKi8KICNkZWZpbmUgUENJRV9QT1JUX1NFUlZJQ0VfVkMJCSgxIDw8IFBDSUVfUE9SVF9TRVJWSUNFX1ZDX1NISUZUKQogCi0vKiBSb290L1Vwc3RyZWFtL0Rvd25zdHJlYW0gUG9ydCdzIEludGVycnVwdCBNb2RlICovCi0jZGVmaW5lIFBDSUVfUE9SVF9OT19JUlEJCSgtMSkKLSNkZWZpbmUgUENJRV9QT1JUX0lOVHhfTU9ERQkJMAotI2RlZmluZSBQQ0lFX1BPUlRfTVNJX01PREUJCTEKLSNkZWZpbmUgUENJRV9QT1JUX01TSVhfTU9ERQkJMgotCi1zdHJ1Y3QgcGNpZV9wb3J0X2RhdGEgewotCWludCBwb3J0X3R5cGU7CQkvKiBUeXBlIG9mIHRoZSBwb3J0ICovCi0JaW50IHBvcnRfaXJxX21vZGU7CS8qIFswOklOVHggfCAxOk1TSSB8IDI6TVNJLVhdICovCi19OwotCiBzdHJ1Y3QgcGNpZV9kZXZpY2UgewogCWludCAJCWlycTsJICAgIC8qIFNlcnZpY2UgSVJRL01TSS9NU0ktWCBWZWN0b3IgKi8KIAlzdHJ1Y3QgcGNpX2RldiAqcG9ydDsJICAgIC8qIFJvb3QvVXBzdHJlYW0vRG93bnN0cmVhbSBQb3J0ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BlcmNwdS1kZWZzLmggYi9pbmNsdWRlL2xpbnV4L3BlcmNwdS1kZWZzLmgKaW5kZXggOWJkMDMxOS4uNWE1ZDZjZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wZXJjcHUtZGVmcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGVyY3B1LWRlZnMuaApAQCAtNjAsNiArNjAsNyBAQAogCiAjZGVmaW5lIERFRklORV9QRVJfQ1BVX1NFQ1RJT04odHlwZSwgbmFtZSwgc2VjKQkJCQlcCiAJX19QQ1BVX0RVTU1ZX0FUVFJTIGNoYXIgX19wY3B1X3Njb3BlXyMjbmFtZTsJCQlcCisJZXh0ZXJuIF9fUENQVV9EVU1NWV9BVFRSUyBjaGFyIF9fcGNwdV91bmlxdWVfIyNuYW1lOwkJXAogCV9fUENQVV9EVU1NWV9BVFRSUyBjaGFyIF9fcGNwdV91bmlxdWVfIyNuYW1lOwkJCVwKIAlfX1BDUFVfQVRUUlMoc2VjKSBQRVJfQ1BVX0RFRl9BVFRSSUJVVEVTIF9fd2VhawkJCVwKIAlfX3R5cGVvZl9fKHR5cGUpIHBlcl9jcHVfXyMjbmFtZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wZXJjcHUuaCBiL2luY2x1ZGUvbGludXgvcGVyY3B1LmgKaW5kZXggODc4ODM2Yy4uY2Y1ZWZiYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wZXJjcHUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BlcmNwdS5oCkBAIC0zNCw4ICszNCw2IEBACiAKICNpZmRlZiBDT05GSUdfU01QCiAKLSNpZm5kZWYgQ09ORklHX0hBVkVfTEVHQUNZX1BFUl9DUFVfQVJFQQotCiAvKiBtaW5pbXVtIHVuaXQgc2l6ZSwgYWxzbyBpcyB0aGUgbWF4aW11bSBzdXBwb3J0ZWQgYWxsb2NhdGlvbiBzaXplICovCiAjZGVmaW5lIFBDUFVfTUlOX1VOSVRfU0laRQkJUEZOX0FMSUdOKDY0IDw8IDEwKQogCkBAIC0xMzAsMzAgKzEyOCw5IEBACiAjZGVmaW5lIHBlcl9jcHVfcHRyKHB0ciwgY3B1KQlTSElGVF9QRVJDUFVfUFRSKChwdHIpLCBwZXJfY3B1X29mZnNldCgoY3B1KSkpCiAKIGV4dGVybiB2b2lkICpfX2FsbG9jX3Jlc2VydmVkX3BlcmNwdShzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduKTsKLQotI2Vsc2UgLyogQ09ORklHX0hBVkVfTEVHQUNZX1BFUl9DUFVfQVJFQSAqLwotCi1zdHJ1Y3QgcGVyY3B1X2RhdGEgewotCXZvaWQgKnB0cnNbMV07Ci19OwotCi0vKiBwb2ludGVyIGRpc2d1aXNpbmcgbWVzc2VzIHVwIHRoZSBrbWVtbGVhayBvYmplY3RzIHRyYWNraW5nICovCi0jaWZuZGVmIENPTkZJR19ERUJVR19LTUVNTEVBSwotI2RlZmluZSBfX3BlcmNwdV9kaXNndWlzZShwZGF0YSkgKHN0cnVjdCBwZXJjcHVfZGF0YSAqKX4odW5zaWduZWQgbG9uZykocGRhdGEpCi0jZWxzZQotI2RlZmluZSBfX3BlcmNwdV9kaXNndWlzZShwZGF0YSkgKHN0cnVjdCBwZXJjcHVfZGF0YSAqKShwZGF0YSkKLSNlbmRpZgotCi0jZGVmaW5lIHBlcl9jcHVfcHRyKHB0ciwgY3B1KQkJCQkJCVwKLSh7CQkJCQkJCQkJXAotICAgICAgICBzdHJ1Y3QgcGVyY3B1X2RhdGEgKl9fcCA9IF9fcGVyY3B1X2Rpc2d1aXNlKHB0cik7CQlcCi0gICAgICAgIChfX3R5cGVvZl9fKHB0cikpX19wLT5wdHJzWyhjcHUpXTsJCQkJXAotfSkKLQotI2VuZGlmIC8qIENPTkZJR19IQVZFX0xFR0FDWV9QRVJfQ1BVX0FSRUEgKi8KLQogZXh0ZXJuIHZvaWQgKl9fYWxsb2NfcGVyY3B1KHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24pOwogZXh0ZXJuIHZvaWQgZnJlZV9wZXJjcHUodm9pZCAqX19wZGF0YSk7CitleHRlcm4gcGh5c19hZGRyX3QgcGVyX2NwdV9wdHJfdG9fcGh5cyh2b2lkICphZGRyKTsKIAogI2lmbmRlZiBDT05GSUdfSEFWRV9TRVRVUF9QRVJfQ1BVX0FSRUEKIGV4dGVybiB2b2lkIF9faW5pdCBzZXR1cF9wZXJfY3B1X2FyZWFzKHZvaWQpOwpAQCAtMTc5LDYgKzE1NiwxMSBAQAogCWtmcmVlKHApOwogfQogCitzdGF0aWMgaW5saW5lIHBoeXNfYWRkcl90IHBlcl9jcHVfcHRyX3RvX3BoeXModm9pZCAqYWRkcikKK3sKKwlyZXR1cm4gX19wYShhZGRyKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCBzZXR1cF9wZXJfY3B1X2FyZWFzKHZvaWQpIHsgfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgKnBjcHVfbHBhZ2VfcmVtYXBwZWQodm9pZCAqa2FkZHIpCkBAIC0xODgsOCArMTcwLDggQEAKIAogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAotI2RlZmluZSBhbGxvY19wZXJjcHUodHlwZSkJKHR5cGUgKilfX2FsbG9jX3BlcmNwdShzaXplb2YodHlwZSksIFwKLQkJCQkJCSAgICAgICBfX2FsaWdub2ZfXyh0eXBlKSkKKyNkZWZpbmUgYWxsb2NfcGVyY3B1KHR5cGUpCVwKKwkodHlwZW9mKHR5cGUpICopX19hbGxvY19wZXJjcHUoc2l6ZW9mKHR5cGUpLCBfX2FsaWdub2ZfXyh0eXBlKSkKIAogLyoKICAqIE9wdGlvbmFsIG1ldGhvZHMgZm9yIG9wdGltaXplZCBub24tbHZhbHVlIHBlci1jcHUgdmFyaWFibGUgYWNjZXNzLgpAQCAtMjQzLDQgKzIyNSw0MDQgQEAKICMgZGVmaW5lIHBlcmNwdV94b3IodmFyLCB2YWwpCQlfX3BlcmNwdV9nZW5lcmljX3RvX29wKHZhciwgKHZhbCksIF49KQogI2VuZGlmCiAKKy8qCisgKiBCcmFuY2hpbmcgZnVuY3Rpb24gdG8gc3BsaXQgdXAgYSBmdW5jdGlvbiBpbnRvIGEgc2V0IG9mIGZ1bmN0aW9ucyB0aGF0CisgKiBhcmUgY2FsbGVkIGZvciBkaWZmZXJlbnQgc2NhbGFyIHNpemVzIG9mIHRoZSBvYmplY3RzIGhhbmRsZWQuCisgKi8KKworZXh0ZXJuIHZvaWQgX19iYWRfc2l6ZV9jYWxsX3BhcmFtZXRlcih2b2lkKTsKKworI2RlZmluZSBfX3BjcHVfc2l6ZV9jYWxsX3JldHVybihzdGVtLCB2YXJpYWJsZSkJCQkJXAorKHsJdHlwZW9mKHZhcmlhYmxlKSBwc2NyX3JldF9fOwkJCQkJXAorCXN3aXRjaChzaXplb2YodmFyaWFibGUpKSB7CQkJCQlcCisJY2FzZSAxOiBwc2NyX3JldF9fID0gc3RlbSMjMSh2YXJpYWJsZSk7YnJlYWs7CQkJXAorCWNhc2UgMjogcHNjcl9yZXRfXyA9IHN0ZW0jIzIodmFyaWFibGUpO2JyZWFrOwkJCVwKKwljYXNlIDQ6IHBzY3JfcmV0X18gPSBzdGVtIyM0KHZhcmlhYmxlKTticmVhazsJCQlcCisJY2FzZSA4OiBwc2NyX3JldF9fID0gc3RlbSMjOCh2YXJpYWJsZSk7YnJlYWs7CQkJXAorCWRlZmF1bHQ6CQkJCQkJCVwKKwkJX19iYWRfc2l6ZV9jYWxsX3BhcmFtZXRlcigpO2JyZWFrOwkJCVwKKwl9CQkJCQkJCQlcCisJcHNjcl9yZXRfXzsJCQkJCQkJXAorfSkKKworI2RlZmluZSBfX3BjcHVfc2l6ZV9jYWxsKHN0ZW0sIHZhcmlhYmxlLCAuLi4pCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJc3dpdGNoKHNpemVvZih2YXJpYWJsZSkpIHsJCQkJCVwKKwkJY2FzZSAxOiBzdGVtIyMxKHZhcmlhYmxlLCBfX1ZBX0FSR1NfXyk7YnJlYWs7CQlcCisJCWNhc2UgMjogc3RlbSMjMih2YXJpYWJsZSwgX19WQV9BUkdTX18pO2JyZWFrOwkJXAorCQljYXNlIDQ6IHN0ZW0jIzQodmFyaWFibGUsIF9fVkFfQVJHU19fKTticmVhazsJCVwKKwkJY2FzZSA4OiBzdGVtIyM4KHZhcmlhYmxlLCBfX1ZBX0FSR1NfXyk7YnJlYWs7CQlcCisJCWRlZmF1bHQ6IAkJCQkJCVwKKwkJCV9fYmFkX3NpemVfY2FsbF9wYXJhbWV0ZXIoKTticmVhazsJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisvKgorICogT3B0aW1pemVkIG1hbmlwdWxhdGlvbiBmb3IgbWVtb3J5IGFsbG9jYXRlZCB0aHJvdWdoIHRoZSBwZXIgY3B1CisgKiBhbGxvY2F0b3Igb3IgZm9yIGFkZHJlc3NlcyBvZiBwZXIgY3B1IHZhcmlhYmxlcyAoY2FuIGJlIGRldGVybWluZWQKKyAqIHVzaW5nIHBlcl9jcHVfdmFyKHh4KS4KKyAqCisgKiBUaGVzZSBvcGVyYXRpb24gZ3VhcmFudGVlIGV4Y2x1c2l2aXR5IG9mIGFjY2VzcyBmb3Igb3RoZXIgb3BlcmF0aW9ucworICogb24gdGhlICpzYW1lKiBwcm9jZXNzb3IuIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgcGVyIGNwdSBkYXRhIGlzIG9ubHkKKyAqIGFjY2Vzc2VkIGJ5IGEgc2luZ2xlIHByb2Nlc3NvciBpbnN0YW5jZSAodGhlIGN1cnJlbnQgb25lKS4KKyAqCisgKiBUaGUgZmlyc3QgZ3JvdXAgaXMgdXNlZCBmb3IgYWNjZXNzZXMgdGhhdCBtdXN0IGJlIGRvbmUgaW4gYQorICogcHJlZW1wdGlvbiBzYWZlIHdheSBzaW5jZSB3ZSBrbm93IHRoYXQgdGhlIGNvbnRleHQgaXMgbm90IHByZWVtcHQKKyAqIHNhZmUuIEludGVycnVwdHMgbWF5IG9jY3VyLiBJZiB0aGUgaW50ZXJydXB0IG1vZGlmaWVzIHRoZSB2YXJpYWJsZQorICogdG9vIHRoZW4gUk1XIGFjdGlvbnMgd2lsbCBub3QgYmUgcmVsaWFibGUuCisgKgorICogVGhlIGFyY2ggY29kZSBjYW4gcHJvdmlkZSBvcHRpbWl6ZWQgZnVuY3Rpb25zIGluIHR3byB3YXlzOgorICoKKyAqIDEuIE92ZXJyaWRlIHRoZSBmdW5jdGlvbiBjb21wbGV0ZWx5LiBGLmUuIGRlZmluZSB0aGlzX2NwdV9hZGQoKS4KKyAqICAgIFRoZSBhcmNoIG11c3QgdGhlbiBlbnN1cmUgdGhhdCB0aGUgdmFyaW91cyBzY2FsYXIgZm9ybWF0IHBhc3NlZAorICogICAgYXJlIGhhbmRsZWQgY29ycmVjdGx5LgorICoKKyAqIDIuIFByb3ZpZGUgZnVuY3Rpb25zIGZvciBjZXJ0YWluIHNjYWxhciBzaXplcy4gRi5lLiBwcm92aWRlCisgKiAgICB0aGlzX2NwdV9hZGRfMigpIHRvIHByb3ZpZGUgcGVyIGNwdSBhdG9taWMgb3BlcmF0aW9ucyBmb3IgMiBieXRlCisgKiAgICBzaXplZCBSTVcgYWN0aW9ucy4gSWYgYXJjaCBjb2RlIGRvZXMgbm90IHByb3ZpZGUgb3BlcmF0aW9ucyBmb3IKKyAqICAgIGEgc2NhbGFyIHNpemUgdGhlbiB0aGUgZmFsbGJhY2sgaW4gdGhlIGdlbmVyaWMgY29kZSB3aWxsIGJlCisgKiAgICB1c2VkLgorICovCisKKyNkZWZpbmUgX3RoaXNfY3B1X2dlbmVyaWNfcmVhZChwY3ApCQkJCQlcCisoewl0eXBlb2YocGNwKSByZXRfXzsJCQkJCQlcCisJcHJlZW1wdF9kaXNhYmxlKCk7CQkJCQkJXAorCXJldF9fID0gKnRoaXNfY3B1X3B0cigmKHBjcCkpOwkJCQkJXAorCXByZWVtcHRfZW5hYmxlKCk7CQkJCQkJXAorCXJldF9fOwkJCQkJCQkJXAorfSkKKworI2lmbmRlZiB0aGlzX2NwdV9yZWFkCisjIGlmbmRlZiB0aGlzX2NwdV9yZWFkXzEKKyMgIGRlZmluZSB0aGlzX2NwdV9yZWFkXzEocGNwKQlfdGhpc19jcHVfZ2VuZXJpY19yZWFkKHBjcCkKKyMgZW5kaWYKKyMgaWZuZGVmIHRoaXNfY3B1X3JlYWRfMgorIyAgZGVmaW5lIHRoaXNfY3B1X3JlYWRfMihwY3ApCV90aGlzX2NwdV9nZW5lcmljX3JlYWQocGNwKQorIyBlbmRpZgorIyBpZm5kZWYgdGhpc19jcHVfcmVhZF80CisjICBkZWZpbmUgdGhpc19jcHVfcmVhZF80KHBjcCkJX3RoaXNfY3B1X2dlbmVyaWNfcmVhZChwY3ApCisjIGVuZGlmCisjIGlmbmRlZiB0aGlzX2NwdV9yZWFkXzgKKyMgIGRlZmluZSB0aGlzX2NwdV9yZWFkXzgocGNwKQlfdGhpc19jcHVfZ2VuZXJpY19yZWFkKHBjcCkKKyMgZW5kaWYKKyMgZGVmaW5lIHRoaXNfY3B1X3JlYWQocGNwKQlfX3BjcHVfc2l6ZV9jYWxsX3JldHVybih0aGlzX2NwdV9yZWFkXywgKHBjcCkpCisjZW5kaWYKKworI2RlZmluZSBfdGhpc19jcHVfZ2VuZXJpY190b19vcChwY3AsIHZhbCwgb3ApCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJcHJlZW1wdF9kaXNhYmxlKCk7CQkJCQkJXAorCSpfX3RoaXNfY3B1X3B0cigmcGNwKSBvcCB2YWw7CQkJCQlcCisJcHJlZW1wdF9lbmFibGUoKTsJCQkJCQlcCit9IHdoaWxlICgwKQorCisjaWZuZGVmIHRoaXNfY3B1X3dyaXRlCisjIGlmbmRlZiB0aGlzX2NwdV93cml0ZV8xCisjICBkZWZpbmUgdGhpc19jcHVfd3JpdGVfMShwY3AsIHZhbCkJX3RoaXNfY3B1X2dlbmVyaWNfdG9fb3AoKHBjcCksICh2YWwpLCA9KQorIyBlbmRpZgorIyBpZm5kZWYgdGhpc19jcHVfd3JpdGVfMgorIyAgZGVmaW5lIHRoaXNfY3B1X3dyaXRlXzIocGNwLCB2YWwpCV90aGlzX2NwdV9nZW5lcmljX3RvX29wKChwY3ApLCAodmFsKSwgPSkKKyMgZW5kaWYKKyMgaWZuZGVmIHRoaXNfY3B1X3dyaXRlXzQKKyMgIGRlZmluZSB0aGlzX2NwdV93cml0ZV80KHBjcCwgdmFsKQlfdGhpc19jcHVfZ2VuZXJpY190b19vcCgocGNwKSwgKHZhbCksID0pCisjIGVuZGlmCisjIGlmbmRlZiB0aGlzX2NwdV93cml0ZV84CisjICBkZWZpbmUgdGhpc19jcHVfd3JpdGVfOChwY3AsIHZhbCkJX3RoaXNfY3B1X2dlbmVyaWNfdG9fb3AoKHBjcCksICh2YWwpLCA9KQorIyBlbmRpZgorIyBkZWZpbmUgdGhpc19jcHVfd3JpdGUocGNwLCB2YWwpCV9fcGNwdV9zaXplX2NhbGwodGhpc19jcHVfd3JpdGVfLCAocGNwKSwgKHZhbCkpCisjZW5kaWYKKworI2lmbmRlZiB0aGlzX2NwdV9hZGQKKyMgaWZuZGVmIHRoaXNfY3B1X2FkZF8xCisjICBkZWZpbmUgdGhpc19jcHVfYWRkXzEocGNwLCB2YWwpCV90aGlzX2NwdV9nZW5lcmljX3RvX29wKChwY3ApLCAodmFsKSwgKz0pCisjIGVuZGlmCisjIGlmbmRlZiB0aGlzX2NwdV9hZGRfMgorIyAgZGVmaW5lIHRoaXNfY3B1X2FkZF8yKHBjcCwgdmFsKQlfdGhpc19jcHVfZ2VuZXJpY190b19vcCgocGNwKSwgKHZhbCksICs9KQorIyBlbmRpZgorIyBpZm5kZWYgdGhpc19jcHVfYWRkXzQKKyMgIGRlZmluZSB0aGlzX2NwdV9hZGRfNChwY3AsIHZhbCkJX3RoaXNfY3B1X2dlbmVyaWNfdG9fb3AoKHBjcCksICh2YWwpLCArPSkKKyMgZW5kaWYKKyMgaWZuZGVmIHRoaXNfY3B1X2FkZF84CisjICBkZWZpbmUgdGhpc19jcHVfYWRkXzgocGNwLCB2YWwpCV90aGlzX2NwdV9nZW5lcmljX3RvX29wKChwY3ApLCAodmFsKSwgKz0pCisjIGVuZGlmCisjIGRlZmluZSB0aGlzX2NwdV9hZGQocGNwLCB2YWwpCQlfX3BjcHVfc2l6ZV9jYWxsKHRoaXNfY3B1X2FkZF8sIChwY3ApLCAodmFsKSkKKyNlbmRpZgorCisjaWZuZGVmIHRoaXNfY3B1X3N1YgorIyBkZWZpbmUgdGhpc19jcHVfc3ViKHBjcCwgdmFsKQkJdGhpc19jcHVfYWRkKChwY3ApLCAtKHZhbCkpCisjZW5kaWYKKworI2lmbmRlZiB0aGlzX2NwdV9pbmMKKyMgZGVmaW5lIHRoaXNfY3B1X2luYyhwY3ApCQl0aGlzX2NwdV9hZGQoKHBjcCksIDEpCisjZW5kaWYKKworI2lmbmRlZiB0aGlzX2NwdV9kZWMKKyMgZGVmaW5lIHRoaXNfY3B1X2RlYyhwY3ApCQl0aGlzX2NwdV9zdWIoKHBjcCksIDEpCisjZW5kaWYKKworI2lmbmRlZiB0aGlzX2NwdV9hbmQKKyMgaWZuZGVmIHRoaXNfY3B1X2FuZF8xCisjICBkZWZpbmUgdGhpc19jcHVfYW5kXzEocGNwLCB2YWwpCV90aGlzX2NwdV9nZW5lcmljX3RvX29wKChwY3ApLCAodmFsKSwgJj0pCisjIGVuZGlmCisjIGlmbmRlZiB0aGlzX2NwdV9hbmRfMgorIyAgZGVmaW5lIHRoaXNfY3B1X2FuZF8yKHBjcCwgdmFsKQlfdGhpc19jcHVfZ2VuZXJpY190b19vcCgocGNwKSwgKHZhbCksICY9KQorIyBlbmRpZgorIyBpZm5kZWYgdGhpc19jcHVfYW5kXzQKKyMgIGRlZmluZSB0aGlzX2NwdV9hbmRfNChwY3AsIHZhbCkJX3RoaXNfY3B1X2dlbmVyaWNfdG9fb3AoKHBjcCksICh2YWwpLCAmPSkKKyMgZW5kaWYKKyMgaWZuZGVmIHRoaXNfY3B1X2FuZF84CisjICBkZWZpbmUgdGhpc19jcHVfYW5kXzgocGNwLCB2YWwpCV90aGlzX2NwdV9nZW5lcmljX3RvX29wKChwY3ApLCAodmFsKSwgJj0pCisjIGVuZGlmCisjIGRlZmluZSB0aGlzX2NwdV9hbmQocGNwLCB2YWwpCQlfX3BjcHVfc2l6ZV9jYWxsKHRoaXNfY3B1X2FuZF8sIChwY3ApLCAodmFsKSkKKyNlbmRpZgorCisjaWZuZGVmIHRoaXNfY3B1X29yCisjIGlmbmRlZiB0aGlzX2NwdV9vcl8xCisjICBkZWZpbmUgdGhpc19jcHVfb3JfMShwY3AsIHZhbCkJX3RoaXNfY3B1X2dlbmVyaWNfdG9fb3AoKHBjcCksICh2YWwpLCB8PSkKKyMgZW5kaWYKKyMgaWZuZGVmIHRoaXNfY3B1X29yXzIKKyMgIGRlZmluZSB0aGlzX2NwdV9vcl8yKHBjcCwgdmFsKQlfdGhpc19jcHVfZ2VuZXJpY190b19vcCgocGNwKSwgKHZhbCksIHw9KQorIyBlbmRpZgorIyBpZm5kZWYgdGhpc19jcHVfb3JfNAorIyAgZGVmaW5lIHRoaXNfY3B1X29yXzQocGNwLCB2YWwpCV90aGlzX2NwdV9nZW5lcmljX3RvX29wKChwY3ApLCAodmFsKSwgfD0pCisjIGVuZGlmCisjIGlmbmRlZiB0aGlzX2NwdV9vcl84CisjICBkZWZpbmUgdGhpc19jcHVfb3JfOChwY3AsIHZhbCkJX3RoaXNfY3B1X2dlbmVyaWNfdG9fb3AoKHBjcCksICh2YWwpLCB8PSkKKyMgZW5kaWYKKyMgZGVmaW5lIHRoaXNfY3B1X29yKHBjcCwgdmFsKQkJX19wY3B1X3NpemVfY2FsbCh0aGlzX2NwdV9vcl8sIChwY3ApLCAodmFsKSkKKyNlbmRpZgorCisjaWZuZGVmIHRoaXNfY3B1X3hvcgorIyBpZm5kZWYgdGhpc19jcHVfeG9yXzEKKyMgIGRlZmluZSB0aGlzX2NwdV94b3JfMShwY3AsIHZhbCkJX3RoaXNfY3B1X2dlbmVyaWNfdG9fb3AoKHBjcCksICh2YWwpLCBePSkKKyMgZW5kaWYKKyMgaWZuZGVmIHRoaXNfY3B1X3hvcl8yCisjICBkZWZpbmUgdGhpc19jcHVfeG9yXzIocGNwLCB2YWwpCV90aGlzX2NwdV9nZW5lcmljX3RvX29wKChwY3ApLCAodmFsKSwgXj0pCisjIGVuZGlmCisjIGlmbmRlZiB0aGlzX2NwdV94b3JfNAorIyAgZGVmaW5lIHRoaXNfY3B1X3hvcl80KHBjcCwgdmFsKQlfdGhpc19jcHVfZ2VuZXJpY190b19vcCgocGNwKSwgKHZhbCksIF49KQorIyBlbmRpZgorIyBpZm5kZWYgdGhpc19jcHVfeG9yXzgKKyMgIGRlZmluZSB0aGlzX2NwdV94b3JfOChwY3AsIHZhbCkJX3RoaXNfY3B1X2dlbmVyaWNfdG9fb3AoKHBjcCksICh2YWwpLCBePSkKKyMgZW5kaWYKKyMgZGVmaW5lIHRoaXNfY3B1X3hvcihwY3AsIHZhbCkJCV9fcGNwdV9zaXplX2NhbGwodGhpc19jcHVfb3JfLCAocGNwKSwgKHZhbCkpCisjZW5kaWYKKworLyoKKyAqIEdlbmVyaWMgcGVyY3B1IG9wZXJhdGlvbnMgdGhhdCBkbyBub3QgcmVxdWlyZSBwcmVlbXB0aW9uIGhhbmRsaW5nLgorICogRWl0aGVyIHdlIGRvIG5vdCBjYXJlIGFib3V0IHJhY2VzIG9yIHRoZSBjYWxsZXIgaGFzIHRoZQorICogcmVzcG9uc2liaWxpdHkgb2YgaGFuZGxpbmcgcHJlZW1wdGlvbnMgaXNzdWVzLiBBcmNoIGNvZGUgY2FuIHN0aWxsCisgKiBvdmVycmlkZSB0aGVzZSBpbnN0cnVjdGlvbnMgc2luY2UgdGhlIGFyY2ggcGVyIGNwdSBjb2RlIG1heSBiZSBtb3JlCisgKiBlZmZpY2llbnQgYW5kIG1heSBhY3R1YWxseSBnZXQgcmFjZSBmcmVlbmVzcyBmb3IgZnJlZSAodGhhdCBpcyB0aGUKKyAqIGNhc2UgZm9yIHg4NiBmb3IgZXhhbXBsZSkuCisgKgorICogSWYgdGhlcmUgaXMgbm8gb3RoZXIgcHJvdGVjdGlvbiB0aHJvdWdoIHByZWVtcHQgZGlzYWJsZSBhbmQvb3IKKyAqIGRpc2FibGluZyBpbnRlcnVwdHMgdGhlbiBvbmUgb2YgdGhlc2UgUk1XIG9wZXJhdGlvbnMgY2FuIHNob3cgdW5leHBlY3RlZAorICogYmVoYXZpb3IgYmVjYXVzZSB0aGUgZXhlY3V0aW9uIHRocmVhZCB3YXMgcmVzY2hlZHVsZWQgb24gYW5vdGhlciBwcm9jZXNzb3IKKyAqIG9yIGFuIGludGVycnVwdCBvY2N1cnJlZCBhbmQgdGhlIHNhbWUgcGVyY3B1IHZhcmlhYmxlIHdhcyBtb2RpZmllZCBmcm9tCisgKiB0aGUgaW50ZXJydXB0IGNvbnRleHQuCisgKi8KKyNpZm5kZWYgX190aGlzX2NwdV9yZWFkCisjIGlmbmRlZiBfX3RoaXNfY3B1X3JlYWRfMQorIyAgZGVmaW5lIF9fdGhpc19jcHVfcmVhZF8xKHBjcCkJKCpfX3RoaXNfY3B1X3B0cigmKHBjcCkpKQorIyBlbmRpZgorIyBpZm5kZWYgX190aGlzX2NwdV9yZWFkXzIKKyMgIGRlZmluZSBfX3RoaXNfY3B1X3JlYWRfMihwY3ApCSgqX190aGlzX2NwdV9wdHIoJihwY3ApKSkKKyMgZW5kaWYKKyMgaWZuZGVmIF9fdGhpc19jcHVfcmVhZF80CisjICBkZWZpbmUgX190aGlzX2NwdV9yZWFkXzQocGNwKQkoKl9fdGhpc19jcHVfcHRyKCYocGNwKSkpCisjIGVuZGlmCisjIGlmbmRlZiBfX3RoaXNfY3B1X3JlYWRfOAorIyAgZGVmaW5lIF9fdGhpc19jcHVfcmVhZF84KHBjcCkJKCpfX3RoaXNfY3B1X3B0cigmKHBjcCkpKQorIyBlbmRpZgorIyBkZWZpbmUgX190aGlzX2NwdV9yZWFkKHBjcCkJX19wY3B1X3NpemVfY2FsbF9yZXR1cm4oX190aGlzX2NwdV9yZWFkXywgKHBjcCkpCisjZW5kaWYKKworI2RlZmluZSBfX3RoaXNfY3B1X2dlbmVyaWNfdG9fb3AocGNwLCB2YWwsIG9wKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCSpfX3RoaXNfY3B1X3B0cigmKHBjcCkpIG9wIHZhbDsJCQkJCVwKK30gd2hpbGUgKDApCisKKyNpZm5kZWYgX190aGlzX2NwdV93cml0ZQorIyBpZm5kZWYgX190aGlzX2NwdV93cml0ZV8xCisjICBkZWZpbmUgX190aGlzX2NwdV93cml0ZV8xKHBjcCwgdmFsKQlfX3RoaXNfY3B1X2dlbmVyaWNfdG9fb3AoKHBjcCksICh2YWwpLCA9KQorIyBlbmRpZgorIyBpZm5kZWYgX190aGlzX2NwdV93cml0ZV8yCisjICBkZWZpbmUgX190aGlzX2NwdV93cml0ZV8yKHBjcCwgdmFsKQlfX3RoaXNfY3B1X2dlbmVyaWNfdG9fb3AoKHBjcCksICh2YWwpLCA9KQorIyBlbmRpZgorIyBpZm5kZWYgX190aGlzX2NwdV93cml0ZV80CisjICBkZWZpbmUgX190aGlzX2NwdV93cml0ZV80KHBjcCwgdmFsKQlfX3RoaXNfY3B1X2dlbmVyaWNfdG9fb3AoKHBjcCksICh2YWwpLCA9KQorIyBlbmRpZgorIyBpZm5kZWYgX190aGlzX2NwdV93cml0ZV84CisjICBkZWZpbmUgX190aGlzX2NwdV93cml0ZV84KHBjcCwgdmFsKQlfX3RoaXNfY3B1X2dlbmVyaWNfdG9fb3AoKHBjcCksICh2YWwpLCA9KQorIyBlbmRpZgorIyBkZWZpbmUgX190aGlzX2NwdV93cml0ZShwY3AsIHZhbCkJX19wY3B1X3NpemVfY2FsbChfX3RoaXNfY3B1X3dyaXRlXywgKHBjcCksICh2YWwpKQorI2VuZGlmCisKKyNpZm5kZWYgX190aGlzX2NwdV9hZGQKKyMgaWZuZGVmIF9fdGhpc19jcHVfYWRkXzEKKyMgIGRlZmluZSBfX3RoaXNfY3B1X2FkZF8xKHBjcCwgdmFsKQlfX3RoaXNfY3B1X2dlbmVyaWNfdG9fb3AoKHBjcCksICh2YWwpLCArPSkKKyMgZW5kaWYKKyMgaWZuZGVmIF9fdGhpc19jcHVfYWRkXzIKKyMgIGRlZmluZSBfX3RoaXNfY3B1X2FkZF8yKHBjcCwgdmFsKQlfX3RoaXNfY3B1X2dlbmVyaWNfdG9fb3AoKHBjcCksICh2YWwpLCArPSkKKyMgZW5kaWYKKyMgaWZuZGVmIF9fdGhpc19jcHVfYWRkXzQKKyMgIGRlZmluZSBfX3RoaXNfY3B1X2FkZF80KHBjcCwgdmFsKQlfX3RoaXNfY3B1X2dlbmVyaWNfdG9fb3AoKHBjcCksICh2YWwpLCArPSkKKyMgZW5kaWYKKyMgaWZuZGVmIF9fdGhpc19jcHVfYWRkXzgKKyMgIGRlZmluZSBfX3RoaXNfY3B1X2FkZF84KHBjcCwgdmFsKQlfX3RoaXNfY3B1X2dlbmVyaWNfdG9fb3AoKHBjcCksICh2YWwpLCArPSkKKyMgZW5kaWYKKyMgZGVmaW5lIF9fdGhpc19jcHVfYWRkKHBjcCwgdmFsKQlfX3BjcHVfc2l6ZV9jYWxsKF9fdGhpc19jcHVfYWRkXywgKHBjcCksICh2YWwpKQorI2VuZGlmCisKKyNpZm5kZWYgX190aGlzX2NwdV9zdWIKKyMgZGVmaW5lIF9fdGhpc19jcHVfc3ViKHBjcCwgdmFsKQlfX3RoaXNfY3B1X2FkZCgocGNwKSwgLSh2YWwpKQorI2VuZGlmCisKKyNpZm5kZWYgX190aGlzX2NwdV9pbmMKKyMgZGVmaW5lIF9fdGhpc19jcHVfaW5jKHBjcCkJCV9fdGhpc19jcHVfYWRkKChwY3ApLCAxKQorI2VuZGlmCisKKyNpZm5kZWYgX190aGlzX2NwdV9kZWMKKyMgZGVmaW5lIF9fdGhpc19jcHVfZGVjKHBjcCkJCV9fdGhpc19jcHVfc3ViKChwY3ApLCAxKQorI2VuZGlmCisKKyNpZm5kZWYgX190aGlzX2NwdV9hbmQKKyMgaWZuZGVmIF9fdGhpc19jcHVfYW5kXzEKKyMgIGRlZmluZSBfX3RoaXNfY3B1X2FuZF8xKHBjcCwgdmFsKQlfX3RoaXNfY3B1X2dlbmVyaWNfdG9fb3AoKHBjcCksICh2YWwpLCAmPSkKKyMgZW5kaWYKKyMgaWZuZGVmIF9fdGhpc19jcHVfYW5kXzIKKyMgIGRlZmluZSBfX3RoaXNfY3B1X2FuZF8yKHBjcCwgdmFsKQlfX3RoaXNfY3B1X2dlbmVyaWNfdG9fb3AoKHBjcCksICh2YWwpLCAmPSkKKyMgZW5kaWYKKyMgaWZuZGVmIF9fdGhpc19jcHVfYW5kXzQKKyMgIGRlZmluZSBfX3RoaXNfY3B1X2FuZF80KHBjcCwgdmFsKQlfX3RoaXNfY3B1X2dlbmVyaWNfdG9fb3AoKHBjcCksICh2YWwpLCAmPSkKKyMgZW5kaWYKKyMgaWZuZGVmIF9fdGhpc19jcHVfYW5kXzgKKyMgIGRlZmluZSBfX3RoaXNfY3B1X2FuZF84KHBjcCwgdmFsKQlfX3RoaXNfY3B1X2dlbmVyaWNfdG9fb3AoKHBjcCksICh2YWwpLCAmPSkKKyMgZW5kaWYKKyMgZGVmaW5lIF9fdGhpc19jcHVfYW5kKHBjcCwgdmFsKQlfX3BjcHVfc2l6ZV9jYWxsKF9fdGhpc19jcHVfYW5kXywgKHBjcCksICh2YWwpKQorI2VuZGlmCisKKyNpZm5kZWYgX190aGlzX2NwdV9vcgorIyBpZm5kZWYgX190aGlzX2NwdV9vcl8xCisjICBkZWZpbmUgX190aGlzX2NwdV9vcl8xKHBjcCwgdmFsKQlfX3RoaXNfY3B1X2dlbmVyaWNfdG9fb3AoKHBjcCksICh2YWwpLCB8PSkKKyMgZW5kaWYKKyMgaWZuZGVmIF9fdGhpc19jcHVfb3JfMgorIyAgZGVmaW5lIF9fdGhpc19jcHVfb3JfMihwY3AsIHZhbCkJX190aGlzX2NwdV9nZW5lcmljX3RvX29wKChwY3ApLCAodmFsKSwgfD0pCisjIGVuZGlmCisjIGlmbmRlZiBfX3RoaXNfY3B1X29yXzQKKyMgIGRlZmluZSBfX3RoaXNfY3B1X29yXzQocGNwLCB2YWwpCV9fdGhpc19jcHVfZ2VuZXJpY190b19vcCgocGNwKSwgKHZhbCksIHw9KQorIyBlbmRpZgorIyBpZm5kZWYgX190aGlzX2NwdV9vcl84CisjICBkZWZpbmUgX190aGlzX2NwdV9vcl84KHBjcCwgdmFsKQlfX3RoaXNfY3B1X2dlbmVyaWNfdG9fb3AoKHBjcCksICh2YWwpLCB8PSkKKyMgZW5kaWYKKyMgZGVmaW5lIF9fdGhpc19jcHVfb3IocGNwLCB2YWwpCV9fcGNwdV9zaXplX2NhbGwoX190aGlzX2NwdV9vcl8sIChwY3ApLCAodmFsKSkKKyNlbmRpZgorCisjaWZuZGVmIF9fdGhpc19jcHVfeG9yCisjIGlmbmRlZiBfX3RoaXNfY3B1X3hvcl8xCisjICBkZWZpbmUgX190aGlzX2NwdV94b3JfMShwY3AsIHZhbCkJX190aGlzX2NwdV9nZW5lcmljX3RvX29wKChwY3ApLCAodmFsKSwgXj0pCisjIGVuZGlmCisjIGlmbmRlZiBfX3RoaXNfY3B1X3hvcl8yCisjICBkZWZpbmUgX190aGlzX2NwdV94b3JfMihwY3AsIHZhbCkJX190aGlzX2NwdV9nZW5lcmljX3RvX29wKChwY3ApLCAodmFsKSwgXj0pCisjIGVuZGlmCisjIGlmbmRlZiBfX3RoaXNfY3B1X3hvcl80CisjICBkZWZpbmUgX190aGlzX2NwdV94b3JfNChwY3AsIHZhbCkJX190aGlzX2NwdV9nZW5lcmljX3RvX29wKChwY3ApLCAodmFsKSwgXj0pCisjIGVuZGlmCisjIGlmbmRlZiBfX3RoaXNfY3B1X3hvcl84CisjICBkZWZpbmUgX190aGlzX2NwdV94b3JfOChwY3AsIHZhbCkJX190aGlzX2NwdV9nZW5lcmljX3RvX29wKChwY3ApLCAodmFsKSwgXj0pCisjIGVuZGlmCisjIGRlZmluZSBfX3RoaXNfY3B1X3hvcihwY3AsIHZhbCkJX19wY3B1X3NpemVfY2FsbChfX3RoaXNfY3B1X3hvcl8sIChwY3ApLCAodmFsKSkKKyNlbmRpZgorCisvKgorICogSVJRIHNhZmUgdmVyc2lvbnMgb2YgdGhlIHBlciBjcHUgUk1XIG9wZXJhdGlvbnMuIE5vdGUgdGhhdCB0aGVzZSBvcGVyYXRpb25zCisgKiBhcmUgKm5vdCogc2FmZSBhZ2FpbnN0IG1vZGlmaWNhdGlvbiBvZiB0aGUgc2FtZSB2YXJpYWJsZSBmcm9tIGFub3RoZXIKKyAqIHByb2Nlc3NvcnMgKHdoaWNoIG9uZSBnZXRzIHdoZW4gdXNpbmcgcmVndWxhciBhdG9taWMgb3BlcmF0aW9ucykKKyAuIFRoZXkgYXJlIGd1YXJhbnRlZWQgdG8gYmUgYXRvbWljIHZzLiBsb2NhbCBpbnRlcnJ1cHRzIGFuZAorICogcHJlZW1wdGlvbiBvbmx5LgorICovCisjZGVmaW5lIGlycXNhZmVfY3B1X2dlbmVyaWNfdG9fb3AocGNwLCB2YWwsIG9wKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkJCQkJXAorCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsJCQkJCQlcCisJKl9fdGhpc19jcHVfcHRyKCYocGNwKSkgb3AgdmFsOwkJCQkJXAorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsJCQkJCVwKK30gd2hpbGUgKDApCisKKyNpZm5kZWYgaXJxc2FmZV9jcHVfYWRkCisjIGlmbmRlZiBpcnFzYWZlX2NwdV9hZGRfMQorIyAgZGVmaW5lIGlycXNhZmVfY3B1X2FkZF8xKHBjcCwgdmFsKSBpcnFzYWZlX2NwdV9nZW5lcmljX3RvX29wKChwY3ApLCAodmFsKSwgKz0pCisjIGVuZGlmCisjIGlmbmRlZiBpcnFzYWZlX2NwdV9hZGRfMgorIyAgZGVmaW5lIGlycXNhZmVfY3B1X2FkZF8yKHBjcCwgdmFsKSBpcnFzYWZlX2NwdV9nZW5lcmljX3RvX29wKChwY3ApLCAodmFsKSwgKz0pCisjIGVuZGlmCisjIGlmbmRlZiBpcnFzYWZlX2NwdV9hZGRfNAorIyAgZGVmaW5lIGlycXNhZmVfY3B1X2FkZF80KHBjcCwgdmFsKSBpcnFzYWZlX2NwdV9nZW5lcmljX3RvX29wKChwY3ApLCAodmFsKSwgKz0pCisjIGVuZGlmCisjIGlmbmRlZiBpcnFzYWZlX2NwdV9hZGRfOAorIyAgZGVmaW5lIGlycXNhZmVfY3B1X2FkZF84KHBjcCwgdmFsKSBpcnFzYWZlX2NwdV9nZW5lcmljX3RvX29wKChwY3ApLCAodmFsKSwgKz0pCisjIGVuZGlmCisjIGRlZmluZSBpcnFzYWZlX2NwdV9hZGQocGNwLCB2YWwpIF9fcGNwdV9zaXplX2NhbGwoaXJxc2FmZV9jcHVfYWRkXywgKHBjcCksICh2YWwpKQorI2VuZGlmCisKKyNpZm5kZWYgaXJxc2FmZV9jcHVfc3ViCisjIGRlZmluZSBpcnFzYWZlX2NwdV9zdWIocGNwLCB2YWwpCWlycXNhZmVfY3B1X2FkZCgocGNwKSwgLSh2YWwpKQorI2VuZGlmCisKKyNpZm5kZWYgaXJxc2FmZV9jcHVfaW5jCisjIGRlZmluZSBpcnFzYWZlX2NwdV9pbmMocGNwKQlpcnFzYWZlX2NwdV9hZGQoKHBjcCksIDEpCisjZW5kaWYKKworI2lmbmRlZiBpcnFzYWZlX2NwdV9kZWMKKyMgZGVmaW5lIGlycXNhZmVfY3B1X2RlYyhwY3ApCWlycXNhZmVfY3B1X3N1YigocGNwKSwgMSkKKyNlbmRpZgorCisjaWZuZGVmIGlycXNhZmVfY3B1X2FuZAorIyBpZm5kZWYgaXJxc2FmZV9jcHVfYW5kXzEKKyMgIGRlZmluZSBpcnFzYWZlX2NwdV9hbmRfMShwY3AsIHZhbCkgaXJxc2FmZV9jcHVfZ2VuZXJpY190b19vcCgocGNwKSwgKHZhbCksICY9KQorIyBlbmRpZgorIyBpZm5kZWYgaXJxc2FmZV9jcHVfYW5kXzIKKyMgIGRlZmluZSBpcnFzYWZlX2NwdV9hbmRfMihwY3AsIHZhbCkgaXJxc2FmZV9jcHVfZ2VuZXJpY190b19vcCgocGNwKSwgKHZhbCksICY9KQorIyBlbmRpZgorIyBpZm5kZWYgaXJxc2FmZV9jcHVfYW5kXzQKKyMgIGRlZmluZSBpcnFzYWZlX2NwdV9hbmRfNChwY3AsIHZhbCkgaXJxc2FmZV9jcHVfZ2VuZXJpY190b19vcCgocGNwKSwgKHZhbCksICY9KQorIyBlbmRpZgorIyBpZm5kZWYgaXJxc2FmZV9jcHVfYW5kXzgKKyMgIGRlZmluZSBpcnFzYWZlX2NwdV9hbmRfOChwY3AsIHZhbCkgaXJxc2FmZV9jcHVfZ2VuZXJpY190b19vcCgocGNwKSwgKHZhbCksICY9KQorIyBlbmRpZgorIyBkZWZpbmUgaXJxc2FmZV9jcHVfYW5kKHBjcCwgdmFsKSBfX3BjcHVfc2l6ZV9jYWxsKGlycXNhZmVfY3B1X2FuZF8sICh2YWwpKQorI2VuZGlmCisKKyNpZm5kZWYgaXJxc2FmZV9jcHVfb3IKKyMgaWZuZGVmIGlycXNhZmVfY3B1X29yXzEKKyMgIGRlZmluZSBpcnFzYWZlX2NwdV9vcl8xKHBjcCwgdmFsKSBpcnFzYWZlX2NwdV9nZW5lcmljX3RvX29wKChwY3ApLCAodmFsKSwgfD0pCisjIGVuZGlmCisjIGlmbmRlZiBpcnFzYWZlX2NwdV9vcl8yCisjICBkZWZpbmUgaXJxc2FmZV9jcHVfb3JfMihwY3AsIHZhbCkgaXJxc2FmZV9jcHVfZ2VuZXJpY190b19vcCgocGNwKSwgKHZhbCksIHw9KQorIyBlbmRpZgorIyBpZm5kZWYgaXJxc2FmZV9jcHVfb3JfNAorIyAgZGVmaW5lIGlycXNhZmVfY3B1X29yXzQocGNwLCB2YWwpIGlycXNhZmVfY3B1X2dlbmVyaWNfdG9fb3AoKHBjcCksICh2YWwpLCB8PSkKKyMgZW5kaWYKKyMgaWZuZGVmIGlycXNhZmVfY3B1X29yXzgKKyMgIGRlZmluZSBpcnFzYWZlX2NwdV9vcl84KHBjcCwgdmFsKSBpcnFzYWZlX2NwdV9nZW5lcmljX3RvX29wKChwY3ApLCAodmFsKSwgfD0pCisjIGVuZGlmCisjIGRlZmluZSBpcnFzYWZlX2NwdV9vcihwY3AsIHZhbCkgX19wY3B1X3NpemVfY2FsbChpcnFzYWZlX2NwdV9vcl8sICh2YWwpKQorI2VuZGlmCisKKyNpZm5kZWYgaXJxc2FmZV9jcHVfeG9yCisjIGlmbmRlZiBpcnFzYWZlX2NwdV94b3JfMQorIyAgZGVmaW5lIGlycXNhZmVfY3B1X3hvcl8xKHBjcCwgdmFsKSBpcnFzYWZlX2NwdV9nZW5lcmljX3RvX29wKChwY3ApLCAodmFsKSwgXj0pCisjIGVuZGlmCisjIGlmbmRlZiBpcnFzYWZlX2NwdV94b3JfMgorIyAgZGVmaW5lIGlycXNhZmVfY3B1X3hvcl8yKHBjcCwgdmFsKSBpcnFzYWZlX2NwdV9nZW5lcmljX3RvX29wKChwY3ApLCAodmFsKSwgXj0pCisjIGVuZGlmCisjIGlmbmRlZiBpcnFzYWZlX2NwdV94b3JfNAorIyAgZGVmaW5lIGlycXNhZmVfY3B1X3hvcl80KHBjcCwgdmFsKSBpcnFzYWZlX2NwdV9nZW5lcmljX3RvX29wKChwY3ApLCAodmFsKSwgXj0pCisjIGVuZGlmCisjIGlmbmRlZiBpcnFzYWZlX2NwdV94b3JfOAorIyAgZGVmaW5lIGlycXNhZmVfY3B1X3hvcl84KHBjcCwgdmFsKSBpcnFzYWZlX2NwdV9nZW5lcmljX3RvX29wKChwY3ApLCAodmFsKSwgXj0pCisjIGVuZGlmCisjIGRlZmluZSBpcnFzYWZlX2NwdV94b3IocGNwLCB2YWwpIF9fcGNwdV9zaXplX2NhbGwoaXJxc2FmZV9jcHVfeG9yXywgKHZhbCkpCisjZW5kaWYKKwogI2VuZGlmIC8qIF9fTElOVVhfUEVSQ1BVX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGVyZl9ldmVudC5oIGIvaW5jbHVkZS9saW51eC9wZXJmX2V2ZW50LmgKaW5kZXggNDNhZGJkNy4uNjRhNTNmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wZXJmX2V2ZW50LmgKKysrIGIvaW5jbHVkZS9saW51eC9wZXJmX2V2ZW50LmgKQEAgLTE4LDEwICsxOCw2IEBACiAjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKLSNpZmRlZiBDT05GSUdfSEFWRV9IV19CUkVBS1BPSU5UCi0jaW5jbHVkZSA8YXNtL2h3X2JyZWFrcG9pbnQuaD4KLSNlbmRpZgotCiAvKgogICogVXNlci1zcGFjZSBBQkkgYml0czoKICAqLwpAQCAtMjE1LDEyICsyMTEsMTIgQEAKIAkJX191MzIJCXdha2V1cF93YXRlcm1hcms7IC8qIGJ5dGVzIGJlZm9yZSB3YWtldXAgICAqLwogCX07CiAKLQl1bmlvbiB7Ci0JCXN0cnVjdCB7IC8qIEhhcmR3YXJlIGJyZWFrcG9pbnQgaW5mbyAqLwotCQkJX191NjQJCWJwX2FkZHI7Ci0JCQlfX3UzMgkJYnBfdHlwZTsKLQkJCV9fdTMyCQlicF9sZW47Ci0JCX07CisJc3RydWN0IHsgLyogSGFyZHdhcmUgYnJlYWtwb2ludCBpbmZvICovCisJCV9fdTY0CQlicF9hZGRyOworCQlfX3UzMgkJYnBfdHlwZTsKKwkJX191MzIJCWJwX2xlbjsKKwkJX191NjQJCV9fYnBfcmVzZXJ2ZWRfMTsKKwkJX191NjQJCV9fYnBfcmVzZXJ2ZWRfMjsKIAl9OwogCiAJX191MzIJCQlfX3Jlc2VydmVkXzI7CkBAIC00NTEsNiArNDQ3LDEwIEBACiAjIGluY2x1ZGUgPGFzbS9wZXJmX2V2ZW50Lmg+CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19IQVZFX0hXX0JSRUFLUE9JTlQKKyNpbmNsdWRlIDxhc20vaHdfYnJlYWtwb2ludC5oPgorI2VuZGlmCisKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CkBAIC01NjUsMTAgKzU2NSwxMiBAQAogCXZvaWQgKCpmdW5jKShzdHJ1Y3QgcGVyZl9wZW5kaW5nX2VudHJ5ICopOwogfTsKIAotdHlwZWRlZiB2b2lkICgqcGVyZl9jYWxsYmFja190KShzdHJ1Y3QgcGVyZl9ldmVudCAqLCB2b2lkICopOwotCiBzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YTsKIAordHlwZWRlZiB2b2lkICgqcGVyZl9vdmVyZmxvd19oYW5kbGVyX3QpKHN0cnVjdCBwZXJmX2V2ZW50ICosIGludCwKKwkJCQkJc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgKiwKKwkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCiAvKioKICAqIHN0cnVjdCBwZXJmX2V2ZW50IC0gcGVyZm9ybWFuY2UgZXZlbnQga2VybmVsIHJlcHJlc2VudGF0aW9uOgogICovCkBAIC02NjAsMTggKzY2MiwxMiBAQAogCXN0cnVjdCBwaWRfbmFtZXNwYWNlCQkqbnM7CiAJdTY0CQkJCWlkOwogCi0Jdm9pZCAoKm92ZXJmbG93X2hhbmRsZXIpKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKLQkJCWludCBubWksIHN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhICpkYXRhLAotCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCXBlcmZfb3ZlcmZsb3dfaGFuZGxlcl90CQlvdmVyZmxvd19oYW5kbGVyOwogCiAjaWZkZWYgQ09ORklHX0VWRU5UX1BST0ZJTEUKIAlzdHJ1Y3QgZXZlbnRfZmlsdGVyCQkqZmlsdGVyOwogI2VuZGlmCiAKLQlwZXJmX2NhbGxiYWNrX3QJCQljYWxsYmFjazsKLQotCXBlcmZfY2FsbGJhY2tfdAkJCWV2ZW50X2NhbGxiYWNrOwotCiAjZW5kaWYgLyogQ09ORklHX1BFUkZfRVZFTlRTICovCiB9OwogCkBAIC03ODEsNyArNzc3LDcgQEAKIHBlcmZfZXZlbnRfY3JlYXRlX2tlcm5lbF9jb3VudGVyKHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIsCiAJCQkJaW50IGNwdSwKIAkJCQlwaWRfdCBwaWQsCi0JCQkJcGVyZl9jYWxsYmFja190IGNhbGxiYWNrKTsKKwkJCQlwZXJmX292ZXJmbG93X2hhbmRsZXJfdCBjYWxsYmFjayk7CiBleHRlcm4gdTY0IHBlcmZfZXZlbnRfcmVhZF92YWx1ZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkJIHU2NCAqZW5hYmxlZCwgdTY0ICpydW5uaW5nKTsKIApAQCAtODc2LDYgKzg3Miw4IEBACiAJCQkgICAgIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbik7CiBleHRlcm4gaW50IHBlcmZfc3dldmVudF9nZXRfcmVjdXJzaW9uX2NvbnRleHQodm9pZCk7CiBleHRlcm4gdm9pZCBwZXJmX3N3ZXZlbnRfcHV0X3JlY3Vyc2lvbl9jb250ZXh0KGludCByY3R4KTsKK2V4dGVybiB2b2lkIHBlcmZfZXZlbnRfZW5hYmxlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7CitleHRlcm4gdm9pZCBwZXJmX2V2ZW50X2Rpc2FibGUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQKIHBlcmZfZXZlbnRfdGFza19zY2hlZF9pbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBjcHUpCQl7IH0KQEAgLTkwNiw3ICs5MDQsOCBAQAogc3RhdGljIGlubGluZSB2b2lkIHBlcmZfZXZlbnRfaW5pdCh2b2lkKQkJCQl7IH0KIHN0YXRpYyBpbmxpbmUgaW50ICBwZXJmX3N3ZXZlbnRfZ2V0X3JlY3Vyc2lvbl9jb250ZXh0KHZvaWQpICB7IHJldHVybiAtMTsgfQogc3RhdGljIGlubGluZSB2b2lkIHBlcmZfc3dldmVudF9wdXRfcmVjdXJzaW9uX2NvbnRleHQoaW50IHJjdHgpCQl7IH0KLQorc3RhdGljIGlubGluZSB2b2lkIHBlcmZfZXZlbnRfZW5hYmxlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkJCXsgfQorc3RhdGljIGlubGluZSB2b2lkIHBlcmZfZXZlbnRfZGlzYWJsZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCQl7IH0KICNlbmRpZgogCiAjZGVmaW5lIHBlcmZfb3V0cHV0X3B1dChoYW5kbGUsIHgpIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RldmljZS5oCmluZGV4IDNjNjY3NWMuLjcxZmY4ODcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kZXZpY2UuaApAQCAtODMsNiArODMsOCBAQAogCXN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgKnBkcnY7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCWludCByZXF1ZXN0ZWRfaWQ7CisJY2hhciAqYnVmZmVyOworCWludCBidWZzaXplOwogfTsKIAogI2RlZmluZSBFQVJMWV9QTEFURk9STV9JRF9VTlNFVCAtMgpAQCAtMTAyLDIxICsxMDQsMjkgQEAKIAkJCQkgICAgICAgaW50IG5yX3Byb2JlLCBpbnQgdXNlcl9vbmx5KTsKIGV4dGVybiB2b2lkIGVhcmx5X3BsYXRmb3JtX2NsZWFudXAodm9pZCk7CiAKKyNkZWZpbmUgZWFybHlfcGxhdGZvcm1faW5pdChjbGFzc19zdHJpbmcsIHBsYXRkcnYpCQlcCisJZWFybHlfcGxhdGZvcm1faW5pdF9idWZmZXIoY2xhc3Nfc3RyaW5nLCBwbGF0ZHJ2LCBOVUxMLCAwKQogCiAjaWZuZGVmIE1PRFVMRQotI2RlZmluZSBlYXJseV9wbGF0Zm9ybV9pbml0KGNsYXNzX3N0cmluZywgcGxhdGZvcm1fZHJpdmVyKQkJXAorI2RlZmluZSBlYXJseV9wbGF0Zm9ybV9pbml0X2J1ZmZlcihjbGFzc19zdHJpbmcsIHBsYXRkcnYsIGJ1ZiwgYnVmc2l6KQlcCiBzdGF0aWMgX19pbml0ZGF0YSBzdHJ1Y3QgZWFybHlfcGxhdGZvcm1fZHJpdmVyIGVhcmx5X2RyaXZlciA9IHsJCVwKIAkuY2xhc3Nfc3RyID0gY2xhc3Nfc3RyaW5nLAkJCQkJXAotCS5wZHJ2ID0gcGxhdGZvcm1fZHJpdmVyLAkJCQkJXAorCS5idWZmZXIgPSBidWYsCQkJCQkJCVwKKwkuYnVmc2l6ZSA9IGJ1ZnNpeiwJCQkJCQlcCisJLnBkcnYgPSBwbGF0ZHJ2LAkJCQkJCVwKIAkucmVxdWVzdGVkX2lkID0gRUFSTFlfUExBVEZPUk1fSURfVU5TRVQsCQkJXAogfTsJCQkJCQkJCQlcCi1zdGF0aWMgaW50IF9faW5pdCBlYXJseV9wbGF0Zm9ybV9kcml2ZXJfc2V0dXBfZnVuYyhjaGFyICpidWYpCQlcCitzdGF0aWMgaW50IF9faW5pdCBlYXJseV9wbGF0Zm9ybV9kcml2ZXJfc2V0dXBfZnVuYyhjaGFyICpidWZmZXIpCVwKIHsJCQkJCQkJCQlcCi0JcmV0dXJuIGVhcmx5X3BsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZWFybHlfZHJpdmVyLCBidWYpOwlcCisJcmV0dXJuIGVhcmx5X3BsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZWFybHlfZHJpdmVyLCBidWZmZXIpOwlcCiB9CQkJCQkJCQkJXAogZWFybHlfcGFyYW0oY2xhc3Nfc3RyaW5nLCBlYXJseV9wbGF0Zm9ybV9kcml2ZXJfc2V0dXBfZnVuYykKICNlbHNlIC8qIE1PRFVMRSAqLwotI2RlZmluZSBlYXJseV9wbGF0Zm9ybV9pbml0KGNsYXNzX3N0cmluZywgcGxhdGZvcm1fZHJpdmVyKQorI2RlZmluZSBlYXJseV9wbGF0Zm9ybV9pbml0X2J1ZmZlcihjbGFzc19zdHJpbmcsIHBsYXRkcnYsIGJ1ZiwgYnVmc2l6KQlcCitzdGF0aWMgaW5saW5lIGNoYXIgKmVhcmx5X3BsYXRmb3JtX2RyaXZlcl9zZXR1cF9mdW5jKHZvaWQpCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBidWZzaXogPyBidWYgOiBOVUxMOwkJCQkJXAorfQogI2VuZGlmIC8qIE1PRFVMRSAqLwogCiAjZW5kaWYgLyogX1BMQVRGT1JNX0RFVklDRV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xdW90YS5oIGIvaW5jbHVkZS9saW51eC9xdW90YS5oCmluZGV4IGNlOWE5YjIuLmU3MGU2MjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcXVvdGEuaAorKysgYi9pbmNsdWRlL2xpbnV4L3F1b3RhLmgKQEAgLTczLDYgKzczLDggQEAKIC8qIFF1b3RhIGZvcm1hdCB0eXBlIElEcyAqLwogI2RlZmluZQlRRk1UX1ZGU19PTEQgMQogI2RlZmluZQlRRk1UX1ZGU19WMCAyCisjZGVmaW5lIFFGTVRfT0NGUzIgMworI2RlZmluZQlRRk1UX1ZGU19WMSA0CiAKIC8qIFNpemUgb2YgYmxvY2sgaW4gd2hpY2ggc3BhY2UgbGltaXRzIGFyZSBwYXNzZWQgdGhyb3VnaCB0aGUgcXVvdGEKICAqIGludGVyZmFjZSAqLwpAQCAtMzM0LDcgKzMzNiw3IEBACiAKIHN0cnVjdCBxdW90YV9mb3JtYXRfdHlwZSB7CiAJaW50IHFmX2ZtdF9pZDsJLyogUXVvdGEgZm9ybWF0IGlkICovCi0Jc3RydWN0IHF1b3RhX2Zvcm1hdF9vcHMgKnFmX29wczsJLyogT3BlcmF0aW9ucyBvZiBmb3JtYXQgKi8KKwljb25zdCBzdHJ1Y3QgcXVvdGFfZm9ybWF0X29wcyAqcWZfb3BzOwkvKiBPcGVyYXRpb25zIG9mIGZvcm1hdCAqLwogCXN0cnVjdCBtb2R1bGUgKnFmX293bmVyOwkJLyogTW9kdWxlIGltcGxlbWVudGluZyBxdW90YSBmb3JtYXQgKi8KIAlzdHJ1Y3QgcXVvdGFfZm9ybWF0X3R5cGUgKnFmX25leHQ7CiB9OwpAQCAtMzk0LDcgKzM5Niw3IEBACiAJc3RydWN0IHJ3X3NlbWFwaG9yZSBkcXB0cl9zZW07CQkvKiBzZXJpYWxpemUgb3BzIHVzaW5nIHF1b3RhX2luZm8gc3RydWN0LCBwb2ludGVycyBmcm9tIGlub2RlIHRvIGRxdW90cyAqLwogCXN0cnVjdCBpbm9kZSAqZmlsZXNbTUFYUVVPVEFTXTsJCS8qIGlub2RlcyBvZiBxdW90YWZpbGVzICovCiAJc3RydWN0IG1lbV9kcWluZm8gaW5mb1tNQVhRVU9UQVNdOwkvKiBJbmZvcm1hdGlvbiBmb3IgZWFjaCBxdW90YSB0eXBlICovCi0Jc3RydWN0IHF1b3RhX2Zvcm1hdF9vcHMgKm9wc1tNQVhRVU9UQVNdOwkvKiBPcGVyYXRpb25zIGZvciBlYWNoIHR5cGUgKi8KKwljb25zdCBzdHJ1Y3QgcXVvdGFfZm9ybWF0X29wcyAqb3BzW01BWFFVT1RBU107CS8qIE9wZXJhdGlvbnMgZm9yIGVhY2ggdHlwZSAqLwogfTsKIAogaW50IHJlZ2lzdGVyX3F1b3RhX2Zvcm1hdChzdHJ1Y3QgcXVvdGFfZm9ybWF0X3R5cGUgKmZtdCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhaWQvcHEuaCBiL2luY2x1ZGUvbGludXgvcmFpZC9wcS5oCmluZGV4IGQ5MjQ4MGYuLjFjYmJkMmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFpZC9wcS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFpZC9wcS5oCkBAIC03OCw2ICs3OCwyNSBAQAogLyogU2VsZWN0ZWQgYWxnb3JpdGhtICovCiBleHRlcm4gc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X2NhbGw7CiAKKy8qIFZhcmlvdXMgcm91dGluZSBzZXRzICovCitleHRlcm4gY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X2ludHgxOworZXh0ZXJuIGNvbnN0IHN0cnVjdCByYWlkNl9jYWxscyByYWlkNl9pbnR4MjsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcmFpZDZfY2FsbHMgcmFpZDZfaW50eDQ7CitleHRlcm4gY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X2ludHg4OworZXh0ZXJuIGNvbnN0IHN0cnVjdCByYWlkNl9jYWxscyByYWlkNl9pbnR4MTY7CitleHRlcm4gY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X2ludHgzMjsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcmFpZDZfY2FsbHMgcmFpZDZfbW14eDE7CitleHRlcm4gY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X21teHgyOworZXh0ZXJuIGNvbnN0IHN0cnVjdCByYWlkNl9jYWxscyByYWlkNl9zc2UxeDE7CitleHRlcm4gY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X3NzZTF4MjsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcmFpZDZfY2FsbHMgcmFpZDZfc3NlMngxOworZXh0ZXJuIGNvbnN0IHN0cnVjdCByYWlkNl9jYWxscyByYWlkNl9zc2UyeDI7CitleHRlcm4gY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X3NzZTJ4NDsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcmFpZDZfY2FsbHMgcmFpZDZfYWx0aXZlYzE7CitleHRlcm4gY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X2FsdGl2ZWMyOworZXh0ZXJuIGNvbnN0IHN0cnVjdCByYWlkNl9jYWxscyByYWlkNl9hbHRpdmVjNDsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcmFpZDZfY2FsbHMgcmFpZDZfYWx0aXZlYzg7CisKIC8qIEFsZ29yaXRobSBsaXN0ICovCiBleHRlcm4gY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzICogY29uc3QgcmFpZDZfYWxnb3NbXTsKIGludCByYWlkNl9zZWxlY3RfYWxnbyh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQuaAppbmRleCA4OTExNWVjLi4yOTRlYjJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCkBAIC0xMTAyLDcgKzExMDIsNyBAQAogCiAJdm9pZCAoKnNldF9jdXJyX3Rhc2spIChzdHJ1Y3QgcnEgKnJxKTsKIAl2b2lkICgqdGFza190aWNrKSAoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgcXVldWVkKTsKLQl2b2lkICgqdGFza19uZXcpIChzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOworCXZvaWQgKCp0YXNrX2ZvcmspIChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwogCiAJdm9pZCAoKnN3aXRjaGVkX2Zyb20pIChzdHJ1Y3QgcnEgKnRoaXNfcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKIAkJCSAgICAgICBpbnQgcnVubmluZyk7CkBAIC0xMTExLDcgKzExMTEsOCBAQAogCXZvaWQgKCpwcmlvX2NoYW5nZWQpIChzdHJ1Y3QgcnEgKnRoaXNfcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKIAkJCSAgICAgaW50IG9sZHByaW8sIGludCBydW5uaW5nKTsKIAotCXVuc2lnbmVkIGludCAoKmdldF9ycl9pbnRlcnZhbCkgKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CisJdW5zaWduZWQgaW50ICgqZ2V0X3JyX2ludGVydmFsKSAoc3RydWN0IHJxICpycSwKKwkJCQkJIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CiAKICNpZmRlZiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRAogCXZvaWQgKCptb3ZlZF9ncm91cCkgKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CkBAIC0xMTUxLDggKzExNTIsNiBAQAogCXU2NAkJCXN0YXJ0X3J1bnRpbWU7CiAJdTY0CQkJYXZnX3dha2V1cDsKIAotCXU2NAkJCWF2Z19ydW5uaW5nOwotCiAjaWZkZWYgQ09ORklHX1NDSEVEU1RBVFMKIAl1NjQJCQl3YWl0X3N0YXJ0OwogCXU2NAkJCXdhaXRfbWF4OwpAQCAtMTE3NSw3ICsxMTc0LDYgQEAKIAl1NjQJCQlucl9mYWlsZWRfbWlncmF0aW9uc19ydW5uaW5nOwogCXU2NAkJCW5yX2ZhaWxlZF9taWdyYXRpb25zX2hvdDsKIAl1NjQJCQlucl9mb3JjZWRfbWlncmF0aW9uczsKLQl1NjQJCQlucl9mb3JjZWQyX21pZ3JhdGlvbnM7CiAKIAl1NjQJCQlucl93YWtldXBzOwogCXU2NAkJCW5yX3dha2V1cHNfc3luYzsKQEAgLTE4NDAsNyArMTgzOCw4IEBACiBleHRlcm4gaW50IHNjaGVkX2Nsb2NrX3N0YWJsZTsKICNlbmRpZgogCi1leHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIHNjaGVkX2Nsb2NrKHZvaWQpOworLyogZnRyYWNlIGNhbGxzIHNjaGVkX2Nsb2NrKCkgZGlyZWN0bHkgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgbm90cmFjZSBzY2hlZF9jbG9jayh2b2lkKTsKIAogZXh0ZXJuIHZvaWQgc2NoZWRfY2xvY2tfaW5pdCh2b2lkKTsKIGV4dGVybiB1NjQgc2NoZWRfY2xvY2tfY3B1KGludCBjcHUpOwpAQCAtMTkwMywxNCArMTkwMiwyMiBAQAogZXh0ZXJuIHVuc2lnbmVkIGludCBzeXNjdGxfc2NoZWRfc2hhcmVzX3JhdGVsaW1pdDsKIGV4dGVybiB1bnNpZ25lZCBpbnQgc3lzY3RsX3NjaGVkX3NoYXJlc190aHJlc2g7CiBleHRlcm4gdW5zaWduZWQgaW50IHN5c2N0bF9zY2hlZF9jaGlsZF9ydW5zX2ZpcnN0OworCitlbnVtIHNjaGVkX3R1bmFibGVfc2NhbGluZyB7CisJU0NIRURfVFVOQUJMRVNDQUxJTkdfTk9ORSwKKwlTQ0hFRF9UVU5BQkxFU0NBTElOR19MT0csCisJU0NIRURfVFVOQUJMRVNDQUxJTkdfTElORUFSLAorCVNDSEVEX1RVTkFCTEVTQ0FMSU5HX0VORCwKK307CitleHRlcm4gZW51bSBzY2hlZF90dW5hYmxlX3NjYWxpbmcgc3lzY3RsX3NjaGVkX3R1bmFibGVfc2NhbGluZzsKKwogI2lmZGVmIENPTkZJR19TQ0hFRF9ERUJVRwotZXh0ZXJuIHVuc2lnbmVkIGludCBzeXNjdGxfc2NoZWRfZmVhdHVyZXM7CiBleHRlcm4gdW5zaWduZWQgaW50IHN5c2N0bF9zY2hlZF9taWdyYXRpb25fY29zdDsKIGV4dGVybiB1bnNpZ25lZCBpbnQgc3lzY3RsX3NjaGVkX25yX21pZ3JhdGU7CiBleHRlcm4gdW5zaWduZWQgaW50IHN5c2N0bF9zY2hlZF90aW1lX2F2ZzsKIGV4dGVybiB1bnNpZ25lZCBpbnQgc3lzY3RsX3RpbWVyX21pZ3JhdGlvbjsKIAotaW50IHNjaGVkX25yX2xhdGVuY3lfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAoraW50IHNjaGVkX3Byb2NfdXBkYXRlX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKIAkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgsCiAJCWxvZmZfdCAqcHBvcyk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2xhYl9kZWYuaCBiL2luY2x1ZGUvbGludXgvc2xhYl9kZWYuaAppbmRleCA4NTBkMDU3Li5jYTZiMmIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NsYWJfZGVmLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbGFiX2RlZi5oCkBAIC0xMTAsNyArMTEwLDcgQEAKIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKiwgZ2ZwX3QpOwogdm9pZCAqX19rbWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncyk7CiAKLSNpZmRlZiBDT05GSUdfS01FTVRSQUNFCisjaWZkZWYgQ09ORklHX1RSQUNJTkcKIGV4dGVybiB2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vdHJhY2Uoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwgZ2ZwX3QgZmxhZ3MpOwogZXh0ZXJuIHNpemVfdCBzbGFiX2J1ZmZlcl9zaXplKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXApOwogI2Vsc2UKQEAgLTE2Niw3ICsxNjYsNyBAQAogZXh0ZXJuIHZvaWQgKl9fa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncywgaW50IG5vZGUpOwogZXh0ZXJuIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCBmbGFncywgaW50IG5vZGUpOwogCi0jaWZkZWYgQ09ORklHX0tNRU1UUkFDRQorI2lmZGVmIENPTkZJR19UUkFDSU5HCiBleHRlcm4gdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlX25vdHJhY2Uoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwKIAkJCQkJICAgZ2ZwX3QgZmxhZ3MsCiAJCQkJCSAgIGludCBub2RlaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbHViX2RlZi5oIGIvaW5jbHVkZS9saW51eC9zbHViX2RlZi5oCmluZGV4IDVhZDcwYTYuLjFlMTRiZWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2x1Yl9kZWYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NsdWJfZGVmLmgKQEAgLTIxNyw3ICsyMTcsNyBAQAogdm9pZCAqa21lbV9jYWNoZV9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCk7CiB2b2lkICpfX2ttYWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKTsKIAotI2lmZGVmIENPTkZJR19LTUVNVFJBQ0UKKyNpZmRlZiBDT05GSUdfVFJBQ0lORwogZXh0ZXJuIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm90cmFjZShzdHJ1Y3Qga21lbV9jYWNoZSAqcywgZ2ZwX3QgZ2ZwZmxhZ3MpOwogI2Vsc2UKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqCkBAIC0yNjYsNyArMjY2LDcgQEAKIHZvaWQgKl9fa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncywgaW50IG5vZGUpOwogdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICosIGdmcF90IGZsYWdzLCBpbnQgbm9kZSk7CiAKLSNpZmRlZiBDT05GSUdfS01FTVRSQUNFCisjaWZkZWYgQ09ORklHX1RSQUNJTkcKIGV4dGVybiB2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGVfbm90cmFjZShzdHJ1Y3Qga21lbV9jYWNoZSAqcywKIAkJCQkJICAgZ2ZwX3QgZ2ZwZmxhZ3MsCiAJCQkJCSAgIGludCBub2RlKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpL3NoX21zaW9mLmggYi9pbmNsdWRlL2xpbnV4L3NwaS9zaF9tc2lvZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlOGRiM2QKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaS9zaF9tc2lvZi5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX19TUElfU0hfTVNJT0ZfSF9fCisjZGVmaW5lIF9fU1BJX1NIX01TSU9GX0hfXworCitzdHJ1Y3Qgc2hfbXNpb2Zfc3BpX2luZm8geworCWludCB0eF9maWZvX292ZXJyaWRlOworCWludCByeF9maWZvX292ZXJyaWRlOworCXUxNiBudW1fY2hpcHNlbGVjdDsKK307CisKKyNlbmRpZiAvKiBfX1NQSV9TSF9NU0lPRl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpL3hpbGlueF9zcGkuaCBiL2luY2x1ZGUvbGludXgvc3BpL3hpbGlueF9zcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjE3Mjc4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9zcGkveGlsaW54X3NwaS5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgX19MSU5VWF9TUElfWElMSU5YX1NQSV9ICisjZGVmaW5lIF9fTElOVVhfU1BJX1hJTElOWF9TUElfSAorCisvKioKKyAqIHN0cnVjdCB4c3BpX3BsYXRmb3JtX2RhdGEgLSBQbGF0Zm9ybSBkYXRhIG9mIHRoZSBYaWxpbnggU1BJIGRyaXZlcgorICogQG51bV9jaGlwc2VsZWN0OglOdW1iZXIgb2YgY2hpcCBzZWxlY3QgYnkgdGhlIElQLgorICogQGxpdHRsZV9lbmRpYW46CUlmIHJlZ2lzdGVycyBzaG91bGQgYmUgYWNjZXNzZWQgbGl0dGxlIGVuZGlhbiBvciBub3QuCisgKiBAYml0c19wZXJfd29yZDoJTnVtYmVyIG9mIGJpdHMgcGVyIHdvcmQuCisgKiBAZGV2aWNlczoJCURldmljZXMgdG8gYWRkIHdoZW4gdGhlIGRyaXZlciBpcyBwcm9iZWQuCisgKiBAbnVtX2RldmljZXM6CU51bWJlciBvZiBkZXZpY2VzIGluIHRoZSBkZXZpY2VzIGFycmF5LgorICovCitzdHJ1Y3QgeHNwaV9wbGF0Zm9ybV9kYXRhIHsKKwl1MTYgbnVtX2NoaXBzZWxlY3Q7CisJYm9vbCBsaXR0bGVfZW5kaWFuOworCXU4IGJpdHNfcGVyX3dvcmQ7CisJc3RydWN0IHNwaV9ib2FyZF9pbmZvICpkZXZpY2VzOworCXU4IG51bV9kZXZpY2VzOworfTsKKworI2VuZGlmIC8qIF9fTElOVVhfU1BJX1hJTElOWF9TUElfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL3NjaGVkLmgKaW5kZXggNDAxMDk3Ny4uMTkwNjc4MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc2NoZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zY2hlZC5oCkBAIC0xMzAsMTIgKzEzMCwxNCBAQAogI2RlZmluZSBSUENfVEFTS19EWU5BTUlDCTB4MDA4MAkJLyogdGFzayB3YXMga21hbGxvYydlZCAqLwogI2RlZmluZSBSUENfVEFTS19LSUxMRUQJCTB4MDEwMAkJLyogdGFzayB3YXMga2lsbGVkICovCiAjZGVmaW5lIFJQQ19UQVNLX1NPRlQJCTB4MDIwMAkJLyogVXNlIHNvZnQgdGltZW91dHMgKi8KKyNkZWZpbmUgUlBDX1RBU0tfU09GVENPTk4JMHgwNDAwCQkvKiBGYWlsIGlmIGNhbid0IGNvbm5lY3QgKi8KIAogI2RlZmluZSBSUENfSVNfQVNZTkModCkJCSgodCktPnRrX2ZsYWdzICYgUlBDX1RBU0tfQVNZTkMpCiAjZGVmaW5lIFJQQ19JU19TV0FQUEVSKHQpCSgodCktPnRrX2ZsYWdzICYgUlBDX1RBU0tfU1dBUFBFUikKICNkZWZpbmUgUlBDX0RPX1JPT1RPVkVSUklERSh0KQkoKHQpLT50a19mbGFncyAmIFJQQ19UQVNLX1JPT1RDUkVEUykKICNkZWZpbmUgUlBDX0FTU0FTU0lOQVRFRCh0KQkoKHQpLT50a19mbGFncyAmIFJQQ19UQVNLX0tJTExFRCkKICNkZWZpbmUgUlBDX0lTX1NPRlQodCkJCSgodCktPnRrX2ZsYWdzICYgUlBDX1RBU0tfU09GVCkKKyNkZWZpbmUgUlBDX0lTX1NPRlRDT05OKHQpCSgodCktPnRrX2ZsYWdzICYgUlBDX1RBU0tfU09GVENPTk4pCiAKICNkZWZpbmUgUlBDX1RBU0tfUlVOTklORwkwCiAjZGVmaW5lIFJQQ19UQVNLX1FVRVVFRAkJMQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zeXNjYWxscy5oIGIvaW5jbHVkZS9saW51eC9zeXNjYWxscy5oCmluZGV4IGJjNzBjNTguLjkzOWE2MTUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c2NhbGxzLmgKKysrIGIvaW5jbHVkZS9saW51eC9zeXNjYWxscy5oCkBAIC04MzQsNCArODM0LDggQEAKIGFzbWxpbmthZ2UgbG9uZyBzeXNfcGVyZl9ldmVudF9vcGVuKAogCQlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIF9fdXNlciAqYXR0cl91cHRyLAogCQlwaWRfdCBwaWQsIGludCBjcHUsIGludCBncm91cF9mZCwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfbW1hcF9wZ29mZih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAorCQkJdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLAorCQkJdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdHJhY2Vfc2VxLmggYi9pbmNsdWRlL2xpbnV4L3RyYWNlX3NlcS5oCmluZGV4IDA5MDc3ZjYuLjVjZjM5N2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdHJhY2Vfc2VxLmgKKysrIGIvaW5jbHVkZS9saW51eC90cmFjZV9zZXEuaApAQCAtMTQsNiArMTQsNyBAQAogCXVuc2lnbmVkIGNoYXIJCWJ1ZmZlcltQQUdFX1NJWkVdOwogCXVuc2lnbmVkIGludAkJbGVuOwogCXVuc2lnbmVkIGludAkJcmVhZHBvczsKKwlpbnQJCQlmdWxsOwogfTsKIAogc3RhdGljIGlubGluZSB2b2lkCkBAIC0yMSw2ICsyMiw3IEBACiB7CiAJcy0+bGVuID0gMDsKIAlzLT5yZWFkcG9zID0gMDsKKwlzLT5mdWxsID0gMDsKIH0KIAogLyoKQEAgLTMzLDcgKzM1LDcgQEAKIAlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDApKSk7CiBleHRlcm4gaW50CiB0cmFjZV9zZXFfYnByaW50ZihzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCBjaGFyICpmbXQsIGNvbnN0IHUzMiAqYmluYXJ5KTsKLWV4dGVybiB2b2lkIHRyYWNlX3ByaW50X3NlcShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCB0cmFjZV9zZXEgKnMpOworZXh0ZXJuIGludCB0cmFjZV9wcmludF9zZXEoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgdHJhY2Vfc2VxICpzKTsKIGV4dGVybiBzc2l6ZV90IHRyYWNlX3NlcV90b191c2VyKHN0cnVjdCB0cmFjZV9zZXEgKnMsIGNoYXIgX191c2VyICp1YnVmLAogCQkJCSBzaXplX3QgY250KTsKIGV4dGVybiBpbnQgdHJhY2Vfc2VxX3B1dHMoc3RydWN0IHRyYWNlX3NlcSAqcywgY29uc3QgY2hhciAqc3RyKTsKQEAgLTU1LDggKzU3LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHRyYWNlX3ByaW50X3NlcShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCB0cmFjZV9zZXEgKnMpCitzdGF0aWMgaW5saW5lIGludCB0cmFjZV9wcmludF9zZXEoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgdHJhY2Vfc2VxICpzKQogeworCXJldHVybiAwOwogfQogc3RhdGljIGlubGluZSBzc2l6ZV90IHRyYWNlX3NlcV90b191c2VyKHN0cnVjdCB0cmFjZV9zZXEgKnMsIGNoYXIgX191c2VyICp1YnVmLAogCQkJCSBzaXplX3QgY250KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90dHkuaCBiL2luY2x1ZGUvbGludXgvdHR5LmgKaW5kZXggZjBmNDNkMC4uNDA1YTkwMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90dHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3R0eS5oCkBAIC0xOTAsOSArMTkwLDE3IEBACiAJLyogQ29udHJvbCB0aGUgRFRSIGxpbmUgKi8KIAl2b2lkICgqZHRyX3J0cykoc3RydWN0IHR0eV9wb3J0ICpwb3J0LCBpbnQgcmFpc2UpOwogCS8qIENhbGxlZCB3aGVuIHRoZSBsYXN0IGNsb3NlIGNvbXBsZXRlcyBvciBhIGhhbmd1cCBmaW5pc2hlcwotCSAgIElGRiB0aGUgcG9ydCB3YXMgaW5pdGlhbGl6ZWQuIERvIG5vdCB1c2UgdG8gZnJlZSByZXNvdXJjZXMgKi8KKwkgICBJRkYgdGhlIHBvcnQgd2FzIGluaXRpYWxpemVkLiBEbyBub3QgdXNlIHRvIGZyZWUgcmVzb3VyY2VzLiBDYWxsZWQKKwkgICB1bmRlciB0aGUgcG9ydCBtdXRleCB0byBzZXJpYWxpemUgYWdhaW5zdCBhY3RpdmF0ZS9zaHV0ZG93bnMgKi8KIAl2b2lkICgqc2h1dGRvd24pKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCk7CiAJdm9pZCAoKmRyb3ApKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCk7CisJLyogQ2FsbGVkIHVuZGVyIHRoZSBwb3J0IG11dGV4IGZyb20gdHR5X3BvcnRfb3Blbiwgc2VyaWFsaXplZCB1c2luZworCSAgIHRoZSBwb3J0IG11dGV4ICovCisgICAgICAgIC8qIEZJWE1FOiBsb25nIHRlcm0gZ2V0dGluZyB0aGUgdHR5IGFyZ3VtZW50ICpvdXQqIG9mIHRoaXMgd291bGQgYmUKKyAgICAgICAgICAgZ29vZCBmb3IgY29uc29sZXMgKi8KKwlpbnQgKCphY3RpdmF0ZSkoc3RydWN0IHR0eV9wb3J0ICpwb3J0LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKKwkvKiBDYWxsZWQgb24gdGhlIGZpbmFsIHB1dCBvZiBhIHBvcnQgKi8KKwl2b2lkICgqZGVzdHJ1Y3QpKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCk7CiB9OwogCQogc3RydWN0IHR0eV9wb3J0IHsKQEAgLTIwNiwxMiArMjE0LDE0IEBACiAJd2FpdF9xdWV1ZV9oZWFkX3QJZGVsdGFfbXNyX3dhaXQ7CS8qIE1vZGVtIHN0YXR1cyBjaGFuZ2UgKi8KIAl1bnNpZ25lZCBsb25nCQlmbGFnczsJCS8qIFRUWSBmbGFncyBBU1lfKi8KIAlzdHJ1Y3QgbXV0ZXgJCW11dGV4OwkJLyogTG9ja2luZyAqLworCXN0cnVjdCBtdXRleAkJYnVmX211dGV4OwkvKiBCdWZmZXIgYWxsb2MgbG9jayAqLwogCXVuc2lnbmVkIGNoYXIJCSp4bWl0X2J1ZjsJLyogT3B0aW9uYWwgYnVmZmVyICovCiAJdW5zaWduZWQgaW50CQljbG9zZV9kZWxheTsJLyogQ2xvc2UgcG9ydCBkZWxheSAqLwogCXVuc2lnbmVkIGludAkJY2xvc2luZ193YWl0OwkvKiBEZWxheSBmb3Igb3V0cHV0ICovCiAJaW50CQkJZHJhaW5fZGVsYXk7CS8qIFNldCB0byB6ZXJvIGlmIG5vIHB1cmUgdGltZQogCQkJCQkJICAgYmFzZWQgZHJhaW4gaXMgbmVlZGVkIGVsc2UKIAkJCQkJCSAgIHNldCB0byBzaXplIG9mIGZpZm8gKi8KKwlzdHJ1Y3Qga3JlZgkJa3JlZjsJCS8qIFJlZiBjb3VudGVyICovCiB9OwogCiAvKgpAQCAtNDM5LDcgKzQ0OSw3IEBACiAJCXN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsIGludCBpZHgpOwogZXh0ZXJuIHN0cnVjdCB0dHlfc3RydWN0ICp0dHlfaW5pdF9kZXYoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciwgaW50IGlkeCwKIAkJCQkJCQkJaW50IGZpcnN0X29rKTsKLWV4dGVybiB2b2lkIHR0eV9yZWxlYXNlX2RldihzdHJ1Y3QgZmlsZSAqZmlscCk7CitleHRlcm4gaW50IHR0eV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKTsKIGV4dGVybiBpbnQgdHR5X2luaXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKIAogZXh0ZXJuIHN0cnVjdCB0dHlfc3RydWN0ICp0dHlfcGFpcl9nZXRfdHR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwpAQCAtNDU0LDYgKzQ2NCwxNSBAQAogZXh0ZXJuIHZvaWQgdHR5X3BvcnRfaW5pdChzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpOwogZXh0ZXJuIGludCB0dHlfcG9ydF9hbGxvY194bWl0X2J1ZihzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpOwogZXh0ZXJuIHZvaWQgdHR5X3BvcnRfZnJlZV94bWl0X2J1ZihzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpOworZXh0ZXJuIHZvaWQgdHR5X3BvcnRfcHV0KHN0cnVjdCB0dHlfcG9ydCAqcG9ydCk7CisKK2V4dGVybiBpbmxpbmUgc3RydWN0IHR0eV9wb3J0ICp0dHlfcG9ydF9nZXQoc3RydWN0IHR0eV9wb3J0ICpwb3J0KQoreworCWlmIChwb3J0KQorCQlrcmVmX2dldCgmcG9ydC0+a3JlZik7CisJcmV0dXJuIHBvcnQ7Cit9CisKIGV4dGVybiBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5X3BvcnRfdHR5X2dldChzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpOwogZXh0ZXJuIHZvaWQgdHR5X3BvcnRfdHR5X3NldChzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwogZXh0ZXJuIGludCB0dHlfcG9ydF9jYXJyaWVyX3JhaXNlZChzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpOwpAQCAtNDY3LDYgKzQ4Niw4IEBACiBleHRlcm4gdm9pZCB0dHlfcG9ydF9jbG9zZV9lbmQoc3RydWN0IHR0eV9wb3J0ICpwb3J0LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKIGV4dGVybiB2b2lkIHR0eV9wb3J0X2Nsb3NlKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCwKIAkJCQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitleHRlcm4gaW50IHR0eV9wb3J0X29wZW4oc3RydWN0IHR0eV9wb3J0ICpwb3J0LAorCQkJCXN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKTsKIGV4dGVybiBpbmxpbmUgaW50IHR0eV9wb3J0X3VzZXJzKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCkKIHsKIAlyZXR1cm4gcG9ydC0+Y291bnQgKyBwb3J0LT5ibG9ja2VkX29wZW47CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi5oIGIvaW5jbHVkZS9saW51eC91c2IuaAppbmRleCBhMzRmYTg5Li5lMTAxYTJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiLmgKQEAgLTMzMSw2ICszMzEsNyBAQAogCXU4IG90Z19wb3J0OwkJCS8qIDAsIG9yIG51bWJlciBvZiBPVEcvSE5QIHBvcnQgKi8KIAl1bnNpZ25lZCBpc19iX2hvc3Q6MTsJCS8qIHRydWUgZHVyaW5nIHNvbWUgSE5QIHJvbGVzd2l0Y2hlcyAqLwogCXVuc2lnbmVkIGJfaG5wX2VuYWJsZToxOwkvKiBPVEc6IGRpZCBBLUhvc3QgZW5hYmxlIEhOUD8gKi8KKwl1bnNpZ25lZCBzZ190YWJsZXNpemU7CQkvKiAwIG9yIGxhcmdlc3QgbnVtYmVyIG9mIHNnIGxpc3QgZW50cmllcyAqLwogCiAJaW50IGRldm51bV9uZXh0OwkJLyogTmV4dCBvcGVuIGRldmljZSBudW1iZXIgaW4KIAkJCQkJICogcm91bmQtcm9iaW4gYWxsb2NhdGlvbiAqLwpAQCAtNDI4LDExICs0MjksOSBAQAogICogQGxhc3RfYnVzeTogdGltZSBvZiBsYXN0IHVzZQogICogQGF1dG9zdXNwZW5kX2RlbGF5OiBpbiBqaWZmaWVzCiAgKiBAY29ubmVjdF90aW1lOiB0aW1lIGRldmljZSB3YXMgZmlyc3QgY29ubmVjdGVkCi0gKiBAYXV0b19wbTogYXV0b3N1c3BlbmQvcmVzdW1lIGluIHByb2dyZXNzCiAgKiBAZG9fcmVtb3RlX3dha2V1cDogIHJlbW90ZSB3YWtldXAgc2hvdWxkIGJlIGVuYWJsZWQKICAqIEByZXNldF9yZXN1bWU6IG5lZWRzIHJlc2V0IGluc3RlYWQgb2YgcmVzdW1lCiAgKiBAYXV0b3N1c3BlbmRfZGlzYWJsZWQ6IGF1dG9zdXNwZW5kIGRpc2FibGVkIGJ5IHRoZSB1c2VyCi0gKiBAYXV0b3Jlc3VtZV9kaXNhYmxlZDogYXV0b3Jlc3VtZSBkaXNhYmxlZCBieSB0aGUgdXNlcgogICogQHNraXBfc3lzX3Jlc3VtZTogc2tpcCB0aGUgbmV4dCBzeXN0ZW0gcmVzdW1lCiAgKiBAd3VzYl9kZXY6IGlmIHRoaXMgaXMgYSBXaXJlbGVzcyBVU0IgZGV2aWNlLCBsaW5rIHRvIHRoZSBXVVNCCiAgKglzcGVjaWZpYyBkYXRhIGZvciB0aGUgZGV2aWNlLgpAQCAtNTEzLDExICs1MTIsOSBAQAogCWludCBhdXRvc3VzcGVuZF9kZWxheTsKIAl1bnNpZ25lZCBsb25nIGNvbm5lY3RfdGltZTsKIAotCXVuc2lnbmVkIGF1dG9fcG06MTsKIAl1bnNpZ25lZCBkb19yZW1vdGVfd2FrZXVwOjE7CiAJdW5zaWduZWQgcmVzZXRfcmVzdW1lOjE7CiAJdW5zaWduZWQgYXV0b3N1c3BlbmRfZGlzYWJsZWQ6MTsKLQl1bnNpZ25lZCBhdXRvcmVzdW1lX2Rpc2FibGVkOjE7CiAJdW5zaWduZWQgc2tpcF9zeXNfcmVzdW1lOjE7CiAjZW5kaWYKIAlzdHJ1Y3Qgd3VzYl9kZXYgKnd1c2JfZGV2OwpAQCAtNTQzLDIyICs1NDAsMjAgQEAKIAogLyogVVNCIGF1dG9zdXNwZW5kIGFuZCBhdXRvcmVzdW1lICovCiAjaWZkZWYgQ09ORklHX1VTQl9TVVNQRU5ECi1leHRlcm4gaW50IHVzYl9hdXRvcG1fc2V0X2ludGVyZmFjZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiBleHRlcm4gaW50IHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiBleHRlcm4gdm9pZCB1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2Uoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwogZXh0ZXJuIGludCB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2VfYXN5bmMoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwogZXh0ZXJuIHZvaWQgdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlX2FzeW5jKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKIAotc3RhdGljIGlubGluZSB2b2lkIHVzYl9hdXRvcG1fZW5hYmxlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQorc3RhdGljIGlubGluZSB2b2lkIHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZV9ub19yZXN1bWUoCisJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewotCWF0b21pY19zZXQoJmludGYtPnBtX3VzYWdlX2NudCwgMCk7Ci0JdXNiX2F1dG9wbV9zZXRfaW50ZXJmYWNlKGludGYpOworCWF0b21pY19pbmMoJmludGYtPnBtX3VzYWdlX2NudCk7CiB9Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB1c2JfYXV0b3BtX2Rpc2FibGUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCitzdGF0aWMgaW5saW5lIHZvaWQgdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlX25vX3N1c3BlbmQoCisJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewotCWF0b21pY19zZXQoJmludGYtPnBtX3VzYWdlX2NudCwgMSk7Ci0JdXNiX2F1dG9wbV9zZXRfaW50ZXJmYWNlKGludGYpOworCWF0b21pY19kZWMoJmludGYtPnBtX3VzYWdlX2NudCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB1c2JfbWFya19sYXN0X2J1c3koc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCkBAIC01NjgsMTIgKzU2Myw4IEBACiAKICNlbHNlCiAKLXN0YXRpYyBpbmxpbmUgaW50IHVzYl9hdXRvcG1fc2V0X2ludGVyZmFjZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsgcmV0dXJuIDA7IH0KLQogc3RhdGljIGlubGluZSBpbnQgdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogeyByZXR1cm4gMDsgfQotCiBzdGF0aWMgaW5saW5lIGludCB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2VfYXN5bmMoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7IHJldHVybiAwOyB9CiAKQEAgLTU4MSw5ICs1NzIsMTEgQEAKIHsgfQogc3RhdGljIGlubGluZSB2b2lkIHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZV9hc3luYyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsgfQotc3RhdGljIGlubGluZSB2b2lkIHVzYl9hdXRvcG1fZW5hYmxlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQorc3RhdGljIGlubGluZSB2b2lkIHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZV9ub19yZXN1bWUoCisJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogeyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgdXNiX2F1dG9wbV9kaXNhYmxlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQorc3RhdGljIGlubGluZSB2b2lkIHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZV9ub19zdXNwZW5kKAorCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsgfQogc3RhdGljIGlubGluZSB2b2lkIHVzYl9tYXJrX2xhc3RfYnVzeShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKIHsgfQpAQCAtNjI2LDYgKzYxOSwxMCBAQAogCQl1bnNpZ25lZCBpZm51bSk7CiBleHRlcm4gc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqdXNiX2FsdG51bV90b19hbHRzZXR0aW5nKAogCQljb25zdCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgdW5zaWduZWQgaW50IGFsdG51bSk7CitleHRlcm4gc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqdXNiX2ZpbmRfYWx0X3NldHRpbmcoCisJCXN0cnVjdCB1c2JfaG9zdF9jb25maWcgKmNvbmZpZywKKwkJdW5zaWduZWQgaW50IGlmYWNlX251bSwKKwkJdW5zaWduZWQgaW50IGFsdF9udW0pOwogCiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvY29tcG9zaXRlLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9jb21wb3NpdGUuaAppbmRleCA0ZjZiYjNkLi43MzhlYTFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9jb21wb3NpdGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9jb21wb3NpdGUuaApAQCAtMTI3LDYgKzEyNyw3IEBACiAJLyogcHJpdmF0ZTogKi8KIAkvKiBpbnRlcm5hbHMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCQlsaXN0OworCURFQ0xBUkVfQklUTUFQKGVuZHBvaW50cywgMzIpOwogfTsKIAogaW50IHVzYl9hZGRfZnVuY3Rpb24oc3RydWN0IHVzYl9jb25maWd1cmF0aW9uICosIHN0cnVjdCB1c2JfZnVuY3Rpb24gKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9vdGcuaCBiL2luY2x1ZGUvbGludXgvdXNiL290Zy5oCmluZGV4IDI0NDNjMGUuLjUyYmI5MTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL290Zy5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL290Zy5oCkBAIC0zMyw2ICszMywyMyBAQAogCU9UR19TVEFURV9BX1ZCVVNfRVJSLAogfTsKIAorI2RlZmluZSBVU0JfT1RHX1BVTExVUF9JRAkJKDEgPDwgMCkKKyNkZWZpbmUgVVNCX09UR19QVUxMRE9XTl9EUAkJKDEgPDwgMSkKKyNkZWZpbmUgVVNCX09UR19QVUxMRE9XTl9ETQkJKDEgPDwgMikKKyNkZWZpbmUgVVNCX09UR19FWFRfVkJVU19JTkRJQ0FUT1IJKDEgPDwgMykKKyNkZWZpbmUgVVNCX09UR19EUlZfVkJVUwkJKDEgPDwgNCkKKyNkZWZpbmUgVVNCX09UR19EUlZfVkJVU19FWFQJCSgxIDw8IDUpCisKK3N0cnVjdCBvdGdfdHJhbnNjZWl2ZXI7CisKKy8qIGZvciB0cmFuc2NlaXZlcnMgY29ubmVjdGVkIHRocnUgYW4gVUxQSSBpbnRlcmZhY2UsIHRoZSB1c2VyIG11c3QKKyAqIHByb3ZpZGUgYWNjZXNzIG9wcworICovCitzdHJ1Y3Qgb3RnX2lvX2FjY2Vzc19vcHMgeworCWludCAoKnJlYWQpKHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKm90ZywgdTMyIHJlZyk7CisJaW50ICgqd3JpdGUpKHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKm90ZywgdTMyIHZhbCwgdTMyIHJlZyk7Cit9OworCiAvKgogICogdGhlIG90ZyBkcml2ZXIgbmVlZHMgdG8gaW50ZXJhY3Qgd2l0aCBib3RoIGRldmljZSBzaWRlIGFuZCBob3N0IHNpZGUKICAqIHVzYiBjb250cm9sbGVycy4gIGl0IGRlY2lkZXMgd2hpY2ggY29udHJvbGxlciBpcyBhY3RpdmUgYXQgYSBnaXZlbgpAQCAtNDIsNiArNTksNyBAQAogc3RydWN0IG90Z190cmFuc2NlaXZlciB7CiAJc3RydWN0IGRldmljZQkJKmRldjsKIAljb25zdCBjaGFyCQkqbGFiZWw7CisJdW5zaWduZWQgaW50CQkgZmxhZ3M7CiAKIAl1OAkJCWRlZmF1bHRfYTsKIAllbnVtIHVzYl9vdGdfc3RhdGUJc3RhdGU7CkBAIC00OSwxMCArNjcsMTcgQEAKIAlzdHJ1Y3QgdXNiX2J1cwkJKmhvc3Q7CiAJc3RydWN0IHVzYl9nYWRnZXQJKmdhZGdldDsKIAorCXN0cnVjdCBvdGdfaW9fYWNjZXNzX29wcwkqaW9fb3BzOworCXZvaWQgX19pb21lbQkJCSppb19wcml2OworCiAJLyogdG8gcGFzcyBleHRyYSBwb3J0IHN0YXR1cyB0byB0aGUgcm9vdCBodWIgKi8KIAl1MTYJCQlwb3J0X3N0YXR1czsKIAl1MTYJCQlwb3J0X2NoYW5nZTsKIAorCS8qIGluaXRpYWxpemUvc2h1dGRvd24gdGhlIE9URyBjb250cm9sbGVyICovCisJaW50CSgqaW5pdCkoc3RydWN0IG90Z190cmFuc2NlaXZlciAqb3RnKTsKKwl2b2lkCSgqc2h1dGRvd24pKHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKm90Zyk7CisKIAkvKiBiaW5kL3VuYmluZCB0aGUgaG9zdCBjb250cm9sbGVyICovCiAJaW50CSgqc2V0X2hvc3QpKHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKm90ZywKIAkJCQlzdHJ1Y3QgdXNiX2J1cyAqaG9zdCk7CkBAIC02NSw2ICs5MCwxMCBAQAogCWludAkoKnNldF9wb3dlcikoc3RydWN0IG90Z190cmFuc2NlaXZlciAqb3RnLAogCQkJCXVuc2lnbmVkIG1BKTsKIAorCS8qIGVmZmVjdGl2ZSBmb3IgQS1wZXJpcGhlcmFsLCBpZ25vcmVkIGZvciBCIGRldmljZXMgKi8KKwlpbnQJKCpzZXRfdmJ1cykoc3RydWN0IG90Z190cmFuc2NlaXZlciAqb3RnLAorCQkJCWJvb2wgZW5hYmxlZCk7CisKIAkvKiBmb3Igbm9uLU9URyBCIGRldmljZXM6IHNldCB0cmFuc2NlaXZlciBpbnRvIHN1c3BlbmQgbW9kZSAqLwogCWludAkoKnNldF9zdXNwZW5kKShzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICpvdGcsCiAJCQkJaW50IHN1c3BlbmQpOwpAQCAtODUsNiArMTE0LDM4IEBACiBleHRlcm4gdm9pZCB1c2Jfbm9wX3hjZWl2X3JlZ2lzdGVyKHZvaWQpOwogZXh0ZXJuIHZvaWQgdXNiX25vcF94Y2Vpdl91bnJlZ2lzdGVyKHZvaWQpOwogCisvKiBoZWxwZXJzIGZvciBkaXJlY3QgYWNjZXNzIHRocnUgbG93LWxldmVsIGlvIGludGVyZmFjZSAqLworc3RhdGljIGlubGluZSBpbnQgb3RnX2lvX3JlYWQoc3RydWN0IG90Z190cmFuc2NlaXZlciAqb3RnLCB1MzIgcmVnKQoreworCWlmIChvdGctPmlvX29wcyAmJiBvdGctPmlvX29wcy0+cmVhZCkKKwkJcmV0dXJuIG90Zy0+aW9fb3BzLT5yZWFkKG90ZywgcmVnKTsKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW5saW5lIGludCBvdGdfaW9fd3JpdGUoc3RydWN0IG90Z190cmFuc2NlaXZlciAqb3RnLCB1MzIgcmVnLCB1MzIgdmFsKQoreworCWlmIChvdGctPmlvX29wcyAmJiBvdGctPmlvX29wcy0+d3JpdGUpCisJCXJldHVybiBvdGctPmlvX29wcy0+d3JpdGUob3RnLCByZWcsIHZhbCk7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK290Z19pbml0KHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKm90ZykKK3sKKwlpZiAob3RnLT5pbml0KQorCQlyZXR1cm4gb3RnLT5pbml0KG90Zyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitvdGdfc2h1dGRvd24oc3RydWN0IG90Z190cmFuc2NlaXZlciAqb3RnKQoreworCWlmIChvdGctPnNodXRkb3duKQorCQlvdGctPnNodXRkb3duKG90Zyk7Cit9CiAKIC8qIGZvciB1c2IgaG9zdCBhbmQgcGVyaXBoZXJhbCBjb250cm9sbGVyIGRyaXZlcnMgKi8KIGV4dGVybiBzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICpvdGdfZ2V0X3RyYW5zY2VpdmVyKHZvaWQpOwpAQCAtOTcsNiArMTU4LDEyIEBACiAJcmV0dXJuIG90Zy0+c3RhcnRfaG5wKG90Zyk7CiB9CiAKKy8qIENvbnRleHQ6IGNhbiBzbGVlcCAqLworc3RhdGljIGlubGluZSBpbnQKK290Z19zZXRfdmJ1cyhzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICpvdGcsIGJvb2wgZW5hYmxlZCkKK3sKKwlyZXR1cm4gb3RnLT5zZXRfdmJ1cyhvdGcsIGVuYWJsZWQpOworfQogCiAvKiBmb3IgSENEcyAqLwogc3RhdGljIGlubGluZSBpbnQKQEAgLTEwNSw3ICsxNzIsNiBAQAogCXJldHVybiBvdGctPnNldF9ob3N0KG90ZywgaG9zdCk7CiB9CiAKLQogLyogZm9yIHVzYiBwZXJpcGhlcmFsIGNvbnRyb2xsZXIgZHJpdmVycyAqLwogCiAvKiBDb250ZXh0OiBjYW4gc2xlZXAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL3NlcmlhbC5oIGIvaW5jbHVkZS9saW51eC91c2Ivc2VyaWFsLmgKaW5kZXggY2U5MTFlYi4uYWNmNmU0NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2Ivc2VyaWFsLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2Ivc2VyaWFsLmgKQEAgLTM5LDggKzM5LDYgQEAKICAqIEBzZXJpYWw6IHBvaW50ZXIgYmFjayB0byB0aGUgc3RydWN0IHVzYl9zZXJpYWwgb3duZXIgb2YgdGhpcyBwb3J0LgogICogQHBvcnQ6IHBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdHR5X3BvcnQgZm9yIHRoaXMgcG9ydC4KICAqIEBsb2NrOiBzcGlubG9jayB0byBncmFiIHdoZW4gdXBkYXRpbmcgcG9ydGlvbnMgb2YgdGhpcyBzdHJ1Y3R1cmUuCi0gKiBAbXV0ZXg6IG11dGV4IHVzZWQgdG8gc3luY2hyb25pemUgc2VyaWFsX29wZW4oKSBhbmQgc2VyaWFsX2Nsb3NlKCkKLSAqCWFjY2VzcyBmb3IgdGhpcyBwb3J0LgogICogQG51bWJlcjogdGhlIG51bWJlciBvZiB0aGUgcG9ydCAodGhlIG1pbm9yIG51bWJlcikuCiAgKiBAaW50ZXJydXB0X2luX2J1ZmZlcjogcG9pbnRlciB0byB0aGUgaW50ZXJydXB0IGluIGJ1ZmZlciBmb3IgdGhpcyBwb3J0LgogICogQGludGVycnVwdF9pbl91cmI6IHBvaW50ZXIgdG8gdGhlIGludGVycnVwdCBpbiBzdHJ1Y3QgdXJiIGZvciB0aGlzIHBvcnQuCkBAIC03Nyw3ICs3NSw2IEBACiAJc3RydWN0IHVzYl9zZXJpYWwJKnNlcmlhbDsKIAlzdHJ1Y3QgdHR5X3BvcnQJCXBvcnQ7CiAJc3BpbmxvY2tfdAkJbG9jazsKLQlzdHJ1Y3QgbXV0ZXggICAgICAgICAgICBtdXRleDsKIAl1bnNpZ25lZCBjaGFyCQludW1iZXI7CiAKIAl1bnNpZ25lZCBjaGFyCQkqaW50ZXJydXB0X2luX2J1ZmZlcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL3VscGkuaCBiL2luY2x1ZGUvbGludXgvdXNiL3VscGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDY3NWM2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC91c2IvdWxwaS5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBfX0xJTlVYX1VTQl9VTFBJX0gKKyNkZWZpbmUgX19MSU5VWF9VU0JfVUxQSV9ICisKK3N0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKm90Z191bHBpX2NyZWF0ZShzdHJ1Y3Qgb3RnX2lvX2FjY2Vzc19vcHMgKm9wcywKKwkJCQkJdW5zaWduZWQgaW50IGZsYWdzKTsKKworI2VuZGlmIC8qIF9fTElOVVhfVVNCX1VMUElfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2JfdXN1YWwuaCBiL2luY2x1ZGUvbGludXgvdXNiX3VzdWFsLmgKaW5kZXggM2QxNWZiOS4uYTRiOTQ3ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2JfdXN1YWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oCkBAIC01Niw3ICs1Niw5IEBACiAJVVNfRkxBRyhTQU5FX1NFTlNFLCAgICAgMHgwMDAwODAwMCkJCQlcCiAJCS8qIFNhbmUgU2Vuc2UgKD4gMTggYnl0ZXMpICovCQkJXAogCVVTX0ZMQUcoQ0FQQUNJVFlfT0ssCTB4MDAwMTAwMDApCQkJXAotCQkvKiBSRUFEIENBUEFDSVRZIHJlc3BvbnNlIGlzIGNvcnJlY3QgKi8KKwkJLyogUkVBRCBDQVBBQ0lUWSByZXNwb25zZSBpcyBjb3JyZWN0ICovCQlcCisJVVNfRkxBRyhCQURfU0VOU0UsCTB4MDAwMjAwMDApCQkJXAorCQkvKiBCYWQgU2Vuc2UgKG5ldmVyIG1vcmUgdGhhbiAxOCBieXRlcykgKi8KIAogI2RlZmluZSBVU19GTEFHKG5hbWUsIHZhbHVlKQlVU19GTF8jI25hbWUgPSB2YWx1ZSAsCiBlbnVtIHsgVVNfRE9fQUxMX0ZMQUdTIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYmRldmljZV9mcy5oIGIvaW5jbHVkZS9saW51eC91c2JkZXZpY2VfZnMuaAppbmRleCBiMmE3ZDhiLi4xNTU5MWQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYmRldmljZV9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiZGV2aWNlX2ZzLmgKQEAgLTEyOCw2ICsxMjgsMjkgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorCitzdHJ1Y3QgdXNiZGV2ZnNfY3RybHRyYW5zZmVyMzIgeworICAgICAgICB1OCBiUmVxdWVzdFR5cGU7CisgICAgICAgIHU4IGJSZXF1ZXN0OworICAgICAgICB1MTYgd1ZhbHVlOworICAgICAgICB1MTYgd0luZGV4OworICAgICAgICB1MTYgd0xlbmd0aDsKKyAgICAgICAgdTMyIHRpbWVvdXQ7ICAvKiBpbiBtaWxsaXNlY29uZHMgKi8KKyAgICAgICAgY29tcGF0X2NhZGRyX3QgZGF0YTsKK307CisKK3N0cnVjdCB1c2JkZXZmc19idWxrdHJhbnNmZXIzMiB7CisgICAgICAgIGNvbXBhdF91aW50X3QgZXA7CisgICAgICAgIGNvbXBhdF91aW50X3QgbGVuOworICAgICAgICBjb21wYXRfdWludF90IHRpbWVvdXQ7IC8qIGluIG1pbGxpc2Vjb25kcyAqLworICAgICAgICBjb21wYXRfY2FkZHJfdCBkYXRhOworfTsKKworc3RydWN0IHVzYmRldmZzX2Rpc2Nvbm5lY3RzaWduYWwzMiB7CisgICAgICAgIGNvbXBhdF9pbnRfdCBzaWducjsKKyAgICAgICAgY29tcGF0X2NhZGRyX3QgY29udGV4dDsKK307CisKIHN0cnVjdCB1c2JkZXZmc191cmIzMiB7CiAJdW5zaWduZWQgY2hhciB0eXBlOwogCXVuc2lnbmVkIGNoYXIgZW5kcG9pbnQ7CkBAIC0xNTMsNyArMTc2LDkgQEAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKICNkZWZpbmUgVVNCREVWRlNfQ09OVFJPTCAgICAgICAgICAgX0lPV1IoJ1UnLCAwLCBzdHJ1Y3QgdXNiZGV2ZnNfY3RybHRyYW5zZmVyKQorI2RlZmluZSBVU0JERVZGU19DT05UUk9MMzIgICAgICAgICAgIF9JT1dSKCdVJywgMCwgc3RydWN0IHVzYmRldmZzX2N0cmx0cmFuc2ZlcjMyKQogI2RlZmluZSBVU0JERVZGU19CVUxLICAgICAgICAgICAgICBfSU9XUignVScsIDIsIHN0cnVjdCB1c2JkZXZmc19idWxrdHJhbnNmZXIpCisjZGVmaW5lIFVTQkRFVkZTX0JVTEszMiAgICAgICAgICAgICAgX0lPV1IoJ1UnLCAyLCBzdHJ1Y3QgdXNiZGV2ZnNfYnVsa3RyYW5zZmVyMzIpCiAjZGVmaW5lIFVTQkRFVkZTX1JFU0VURVAgICAgICAgICAgIF9JT1IoJ1UnLCAzLCB1bnNpZ25lZCBpbnQpCiAjZGVmaW5lIFVTQkRFVkZTX1NFVElOVEVSRkFDRSAgICAgIF9JT1IoJ1UnLCA0LCBzdHJ1Y3QgdXNiZGV2ZnNfc2V0aW50ZXJmYWNlKQogI2RlZmluZSBVU0JERVZGU19TRVRDT05GSUdVUkFUSU9OICBfSU9SKCdVJywgNSwgdW5zaWduZWQgaW50KQpAQCAtMTY2LDYgKzE5MSw3IEBACiAjZGVmaW5lIFVTQkRFVkZTX1JFQVBVUkJOREVMQVkgICAgIF9JT1coJ1UnLCAxMywgdm9pZCAqKQogI2RlZmluZSBVU0JERVZGU19SRUFQVVJCTkRFTEFZMzIgICBfSU9XKCdVJywgMTMsIF9fdTMyKQogI2RlZmluZSBVU0JERVZGU19ESVNDU0lHTkFMICAgICAgICBfSU9SKCdVJywgMTQsIHN0cnVjdCB1c2JkZXZmc19kaXNjb25uZWN0c2lnbmFsKQorI2RlZmluZSBVU0JERVZGU19ESVNDU0lHTkFMMzIgICAgICBfSU9SKCdVJywgMTQsIHN0cnVjdCB1c2JkZXZmc19kaXNjb25uZWN0c2lnbmFsMzIpCiAjZGVmaW5lIFVTQkRFVkZTX0NMQUlNSU5URVJGQUNFICAgIF9JT1IoJ1UnLCAxNSwgdW5zaWduZWQgaW50KQogI2RlZmluZSBVU0JERVZGU19SRUxFQVNFSU5URVJGQUNFICBfSU9SKCdVJywgMTYsIHVuc2lnbmVkIGludCkKICNkZWZpbmUgVVNCREVWRlNfQ09OTkVDVElORk8gICAgICAgX0lPVygnVScsIDE3LCBzdHJ1Y3QgdXNiZGV2ZnNfY29ubmVjdGluZm8pCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Ztc3RhdC5oIGIvaW5jbHVkZS9saW51eC92bXN0YXQuaAppbmRleCAyZDBmMjIyLi5kODU4ODk3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Ztc3RhdC5oCisrKyBiL2luY2x1ZGUvbGludXgvdm1zdGF0LmgKQEAgLTc2LDI0ICs3NiwyMiBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19jb3VudF92bV9ldmVudChlbnVtIHZtX2V2ZW50X2l0ZW0gaXRlbSkKIHsKLQlfX2dldF9jcHVfdmFyKHZtX2V2ZW50X3N0YXRlcykuZXZlbnRbaXRlbV0rKzsKKwlfX3RoaXNfY3B1X2luYyhwZXJfY3B1X3Zhcih2bV9ldmVudF9zdGF0ZXMpLmV2ZW50W2l0ZW1dKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNvdW50X3ZtX2V2ZW50KGVudW0gdm1fZXZlbnRfaXRlbSBpdGVtKQogewotCWdldF9jcHVfdmFyKHZtX2V2ZW50X3N0YXRlcykuZXZlbnRbaXRlbV0rKzsKLQlwdXRfY3B1KCk7CisJdGhpc19jcHVfaW5jKHBlcl9jcHVfdmFyKHZtX2V2ZW50X3N0YXRlcykuZXZlbnRbaXRlbV0pOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19jb3VudF92bV9ldmVudHMoZW51bSB2bV9ldmVudF9pdGVtIGl0ZW0sIGxvbmcgZGVsdGEpCiB7Ci0JX19nZXRfY3B1X3Zhcih2bV9ldmVudF9zdGF0ZXMpLmV2ZW50W2l0ZW1dICs9IGRlbHRhOworCV9fdGhpc19jcHVfYWRkKHBlcl9jcHVfdmFyKHZtX2V2ZW50X3N0YXRlcykuZXZlbnRbaXRlbV0sIGRlbHRhKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNvdW50X3ZtX2V2ZW50cyhlbnVtIHZtX2V2ZW50X2l0ZW0gaXRlbSwgbG9uZyBkZWx0YSkKIHsKLQlnZXRfY3B1X3Zhcih2bV9ldmVudF9zdGF0ZXMpLmV2ZW50W2l0ZW1dICs9IGRlbHRhOwotCXB1dF9jcHUoKTsKKwl0aGlzX2NwdV9hZGQocGVyX2NwdV92YXIodm1fZXZlbnRfc3RhdGVzKS5ldmVudFtpdGVtXSwgZGVsdGEpOwogfQogCiBleHRlcm4gdm9pZCBhbGxfdm1fZXZlbnRzKHVuc2lnbmVkIGxvbmcgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9jb21wYXQuaCBiL2luY2x1ZGUvbmV0L2NvbXBhdC5oCmluZGV4IDNjN2Q0ZTMuLjI4ZDU0MjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2NvbXBhdC5oCisrKyBiL2luY2x1ZGUvbmV0L2NvbXBhdC5oCkBAIC00Niw3ICs0Niw3IEBACiBleHRlcm4gYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfcmVjdm1zZyhpbnQsc3RydWN0IGNvbXBhdF9tc2doZHIgX191c2VyICosdW5zaWduZWQpOwogZXh0ZXJuIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3JlY3ZtbXNnKGludCwgc3RydWN0IGNvbXBhdF9tbXNnaGRyIF9fdXNlciAqLAogCQkJCQkgICB1bnNpZ25lZCwgdW5zaWduZWQsCi0JCQkJCSAgIHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKik7CisJCQkJCSAgIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICopOwogZXh0ZXJuIGFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2dldHNvY2tvcHQoaW50LCBpbnQsIGludCwgY2hhciBfX3VzZXIgKiwgaW50IF9fdXNlciAqKTsKIGV4dGVybiBpbnQgcHV0X2Ntc2dfY29tcGF0KHN0cnVjdCBtc2doZHIqLCBpbnQsIGludCwgaW50LCB2b2lkICopOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0Nl9oYXNodGFibGVzLmggYi9pbmNsdWRlL25ldC9pbmV0Nl9oYXNodGFibGVzLmgKaW5kZXggOTI4MzhkMy4uZTQ2Njc0ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaW5ldDZfaGFzaHRhYmxlcy5oCisrKyBiL2luY2x1ZGUvbmV0L2luZXQ2X2hhc2h0YWJsZXMuaApAQCAtNTMsNyArNTMsNyBAQAogCXJldHVybiBpbmV0Nl9laGFzaGZuKG5ldCwgbGFkZHIsIGxwb3J0LCBmYWRkciwgZnBvcnQpOwogfQogCi1leHRlcm4gdm9pZCBfX2luZXQ2X2hhc2goc3RydWN0IHNvY2sgKnNrKTsKK2V4dGVybiBpbnQgX19pbmV0Nl9oYXNoKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqdHdwKTsKIAogLyoKICAqIFNvY2tldHMgaW4gVENQX0NMT1NFIHN0YXRlIGFyZSBfYWx3YXlzXyB0YWtlbiBvdXQgb2YgdGhlIGhhc2gsIHNvCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0X2hhc2h0YWJsZXMuaCBiL2luY2x1ZGUvbmV0L2luZXRfaGFzaHRhYmxlcy5oCmluZGV4IDQxY2JkZGQuLjc0MzU4ZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2luZXRfaGFzaHRhYmxlcy5oCisrKyBiL2luY2x1ZGUvbmV0L2luZXRfaGFzaHRhYmxlcy5oCkBAIC0yNTEsNyArMjUxLDcgQEAKIAogdm9pZCBpbmV0X2hhc2hpbmZvX2luaXQoc3RydWN0IGluZXRfaGFzaGluZm8gKmgpOwogCi1leHRlcm4gdm9pZCBfX2luZXRfaGFzaF9ub2xpc3RlbihzdHJ1Y3Qgc29jayAqc2spOworZXh0ZXJuIGludCBfX2luZXRfaGFzaF9ub2xpc3RlbihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3KTsKIGV4dGVybiB2b2lkIGluZXRfaGFzaChzdHJ1Y3Qgc29jayAqc2spOwogZXh0ZXJuIHZvaWQgaW5ldF91bmhhc2goc3RydWN0IHNvY2sgKnNrKTsKIApAQCAtMzkxLDEwICszOTEsMTIgQEAKIH0KIAogZXh0ZXJuIGludCBfX2luZXRfaGFzaF9jb25uZWN0KHN0cnVjdCBpbmV0X3RpbWV3YWl0X2RlYXRoX3JvdyAqZGVhdGhfcm93LAotCQlzdHJ1Y3Qgc29jayAqc2ssIHUzMiBwb3J0X29mZnNldCwKKwkJc3RydWN0IHNvY2sgKnNrLAorCQl1MzIgcG9ydF9vZmZzZXQsCiAJCWludCAoKmNoZWNrX2VzdGFibGlzaGVkKShzdHJ1Y3QgaW5ldF90aW1ld2FpdF9kZWF0aF9yb3cgKiwKIAkJCXN0cnVjdCBzb2NrICosIF9fdTE2LCBzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICoqKSwKLQkJCSAgICAgICB2b2lkICgqaGFzaCkoc3RydWN0IHNvY2sgKnNrKSk7CisJCWludCAoKmhhc2gpKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqdHdwKSk7CisKIGV4dGVybiBpbnQgaW5ldF9oYXNoX2Nvbm5lY3Qoc3RydWN0IGluZXRfdGltZXdhaXRfZGVhdGhfcm93ICpkZWF0aF9yb3csCiAJCQkgICAgIHN0cnVjdCBzb2NrICpzayk7CiAjZW5kaWYgLyogX0lORVRfSEFTSFRBQkxFU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0X3RpbWV3YWl0X3NvY2suaCBiL2luY2x1ZGUvbmV0L2luZXRfdGltZXdhaXRfc29jay5oCmluZGV4IGI4MDFhZGUuLjc5ZjY3ZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2luZXRfdGltZXdhaXRfc29jay5oCisrKyBiL2luY2x1ZGUvbmV0L2luZXRfdGltZXdhaXRfc29jay5oCkBAIC0yMDEsNiArMjAxLDkgQEAKIAogZXh0ZXJuIGludCBpbmV0X3R3c2tfdW5oYXNoKHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3KTsKIAorZXh0ZXJuIGludCBpbmV0X3R3c2tfYmluZF91bmhhc2goc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqdHcsCisJCQkJIHN0cnVjdCBpbmV0X2hhc2hpbmZvICpoYXNoaW5mbyk7CisKIGV4dGVybiBzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICppbmV0X3R3c2tfYWxsb2MoY29uc3Qgc3RydWN0IHNvY2sgKnNrLAogCQkJCQkJICBjb25zdCBpbnQgc3RhdGUpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZWlnaGJvdXIuaCBiL2luY2x1ZGUvbmV0L25laWdoYm91ci5oCmluZGV4IDAzMDJmMzEuLmIwMTczMjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25laWdoYm91ci5oCisrKyBiL2luY2x1ZGUvbmV0L25laWdoYm91ci5oCkBAIC04OCwxMiArODgsNyBAQAogCXVuc2lnbmVkIGxvbmcgdW5yZXNfZGlzY2FyZHM7CS8qIG51bWJlciBvZiB1bnJlc29sdmVkIGRyb3BzICovCiB9OwogCi0jZGVmaW5lIE5FSUdIX0NBQ0hFX1NUQVRfSU5DKHRibCwgZmllbGQpCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCXByZWVtcHRfZGlzYWJsZSgpOwkJCQkJXAotCQkocGVyX2NwdV9wdHIoKHRibCktPnN0YXRzLCBzbXBfcHJvY2Vzc29yX2lkKCkpLT5maWVsZCkrKzsgXAotCQlwcmVlbXB0X2VuYWJsZSgpOwkJCQkJXAotCX0gd2hpbGUgKDApCisjZGVmaW5lIE5FSUdIX0NBQ0hFX1NUQVRfSU5DKHRibCwgZmllbGQpIHRoaXNfY3B1X2luYygodGJsKS0+c3RhdHMtPmZpZWxkKQogCiBzdHJ1Y3QgbmVpZ2hib3VyIHsKIAlzdHJ1Y3QgbmVpZ2hib3VyCSpuZXh0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oCmluZGV4IDVjZjcyNzAuLmEwOTA0YWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmgKQEAgLTI5MywxMSArMjkzLDExIEBACiBleHRlcm4gdW5zaWduZWQgaW50IG5mX2Nvbm50cmFja19tYXg7CiAKICNkZWZpbmUgTkZfQ1RfU1RBVF9JTkMobmV0LCBjb3VudCkJXAotCShwZXJfY3B1X3B0cigobmV0KS0+Y3Quc3RhdCwgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSktPmNvdW50KyspCisJX190aGlzX2NwdV9pbmMoKG5ldCktPmN0LnN0YXQtPmNvdW50KQogI2RlZmluZSBORl9DVF9TVEFUX0lOQ19BVE9NSUMobmV0LCBjb3VudCkJCVwKIGRvIHsJCQkJCQkJXAogCWxvY2FsX2JoX2Rpc2FibGUoKTsJCQkJXAotCXBlcl9jcHVfcHRyKChuZXQpLT5jdC5zdGF0LCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKS0+Y291bnQrKzsJXAorCV9fdGhpc19jcHVfaW5jKChuZXQpLT5jdC5zdGF0LT5jb3VudCk7CQlcCiAJbG9jYWxfYmhfZW5hYmxlKCk7CQkJCVwKIH0gd2hpbGUgKDApCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NubXAuaCBiL2luY2x1ZGUvbmV0L3NubXAuaAppbmRleCA4Yzg0MmUwLi5mMGQ3NTZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zbm1wLmgKKysrIGIvaW5jbHVkZS9uZXQvc25tcC5oCkBAIC0xMzYsNDUgKzEzNiwzMSBAQAogI2RlZmluZSBTTk1QX1NUQVRfQkhQVFIobmFtZSkJKG5hbWVbMF0pCiAjZGVmaW5lIFNOTVBfU1RBVF9VU1JQVFIobmFtZSkJKG5hbWVbMV0pCiAKLSNkZWZpbmUgU05NUF9JTkNfU1RBVFNfQkgobWliLCBmaWVsZCkgCVwKLQkocGVyX2NwdV9wdHIobWliWzBdLCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKS0+bWlic1tmaWVsZF0rKykKLSNkZWZpbmUgU05NUF9JTkNfU1RBVFNfVVNFUihtaWIsIGZpZWxkKSBcCi0JZG8geyBcCi0JCXBlcl9jcHVfcHRyKG1pYlsxXSwgZ2V0X2NwdSgpKS0+bWlic1tmaWVsZF0rKzsgXAotCQlwdXRfY3B1KCk7IFwKLQl9IHdoaWxlICgwKQotI2RlZmluZSBTTk1QX0lOQ19TVEFUUyhtaWIsIGZpZWxkKSAJXAotCWRvIHsgXAotCQlwZXJfY3B1X3B0cihtaWJbIWluX3NvZnRpcnEoKV0sIGdldF9jcHUoKSktPm1pYnNbZmllbGRdKys7IFwKLQkJcHV0X2NwdSgpOyBcCi0JfSB3aGlsZSAoMCkKLSNkZWZpbmUgU05NUF9ERUNfU1RBVFMobWliLCBmaWVsZCkgCVwKLQlkbyB7IFwKLQkJcGVyX2NwdV9wdHIobWliWyFpbl9zb2Z0aXJxKCldLCBnZXRfY3B1KCkpLT5taWJzW2ZpZWxkXS0tOyBcCi0JCXB1dF9jcHUoKTsgXAotCX0gd2hpbGUgKDApCi0jZGVmaW5lIFNOTVBfQUREX1NUQVRTKG1pYiwgZmllbGQsIGFkZGVuZCkgCVwKLQlkbyB7IFwKLQkJcGVyX2NwdV9wdHIobWliWyFpbl9zb2Z0aXJxKCldLCBnZXRfY3B1KCkpLT5taWJzW2ZpZWxkXSArPSBhZGRlbmQ7IFwKLQkJcHV0X2NwdSgpOyBcCi0JfSB3aGlsZSAoMCkKLSNkZWZpbmUgU05NUF9BRERfU1RBVFNfQkgobWliLCBmaWVsZCwgYWRkZW5kKSAJXAotCShwZXJfY3B1X3B0cihtaWJbMF0sIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpLT5taWJzW2ZpZWxkXSArPSBhZGRlbmQpCi0jZGVmaW5lIFNOTVBfQUREX1NUQVRTX1VTRVIobWliLCBmaWVsZCwgYWRkZW5kKSAJXAotCWRvIHsgXAotCQlwZXJfY3B1X3B0cihtaWJbMV0sIGdldF9jcHUoKSktPm1pYnNbZmllbGRdICs9IGFkZGVuZDsgXAotCQlwdXRfY3B1KCk7IFwKLQl9IHdoaWxlICgwKQorI2RlZmluZSBTTk1QX0lOQ19TVEFUU19CSChtaWIsIGZpZWxkKQlcCisJCQlfX3RoaXNfY3B1X2luYyhtaWJbMF0tPm1pYnNbZmllbGRdKQorI2RlZmluZSBTTk1QX0lOQ19TVEFUU19VU0VSKG1pYiwgZmllbGQpCVwKKwkJCXRoaXNfY3B1X2luYyhtaWJbMV0tPm1pYnNbZmllbGRdKQorI2RlZmluZSBTTk1QX0lOQ19TVEFUUyhtaWIsIGZpZWxkKQlcCisJCQl0aGlzX2NwdV9pbmMobWliWyFpbl9zb2Z0aXJxKCldLT5taWJzW2ZpZWxkXSkKKyNkZWZpbmUgU05NUF9ERUNfU1RBVFMobWliLCBmaWVsZCkJXAorCQkJdGhpc19jcHVfZGVjKG1pYlshaW5fc29mdGlycSgpXS0+bWlic1tmaWVsZF0pCisjZGVmaW5lIFNOTVBfQUREX1NUQVRTX0JIKG1pYiwgZmllbGQsIGFkZGVuZCkJXAorCQkJX190aGlzX2NwdV9hZGQobWliWzBdLT5taWJzW2ZpZWxkXSwgYWRkZW5kKQorI2RlZmluZSBTTk1QX0FERF9TVEFUU19VU0VSKG1pYiwgZmllbGQsIGFkZGVuZCkJXAorCQkJdGhpc19jcHVfYWRkKG1pYlsxXS0+bWlic1tmaWVsZF0sIGFkZGVuZCkKICNkZWZpbmUgU05NUF9VUERfUE9fU1RBVFMobWliLCBiYXNlZmllbGQsIGFkZGVuZCkJXAogCWRvIHsgXAotCQlfX3R5cGVvZl9fKG1pYlswXSkgcHRyID0gcGVyX2NwdV9wdHIobWliWyFpbl9zb2Z0aXJxKCldLCBnZXRfY3B1KCkpO1wKKwkJX190eXBlb2ZfXyhtaWJbMF0pIHB0cjsgXAorCQlwcmVlbXB0X2Rpc2FibGUoKTsgXAorCQlwdHIgPSB0aGlzX2NwdV9wdHIoKG1pYilbIWluX3NvZnRpcnEoKV0pOyBcCiAJCXB0ci0+bWlic1tiYXNlZmllbGQjI1BLVFNdKys7IFwKIAkJcHRyLT5taWJzW2Jhc2VmaWVsZCMjT0NURVRTXSArPSBhZGRlbmQ7XAotCQlwdXRfY3B1KCk7IFwKKwkJcHJlZW1wdF9lbmFibGUoKTsgXAogCX0gd2hpbGUgKDApCiAjZGVmaW5lIFNOTVBfVVBEX1BPX1NUQVRTX0JIKG1pYiwgYmFzZWZpZWxkLCBhZGRlbmQpCVwKIAlkbyB7IFwKLQkJX190eXBlb2ZfXyhtaWJbMF0pIHB0ciA9IHBlcl9jcHVfcHRyKG1pYlshaW5fc29mdGlycSgpXSwgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7XAorCQlfX3R5cGVvZl9fKG1pYlswXSkgcHRyID0gXAorCQkJX190aGlzX2NwdV9wdHIoKG1pYilbIWluX3NvZnRpcnEoKV0pOyBcCiAJCXB0ci0+bWlic1tiYXNlZmllbGQjI1BLVFNdKys7IFwKIAkJcHRyLT5taWJzW2Jhc2VmaWVsZCMjT0NURVRTXSArPSBhZGRlbmQ7XAogCX0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC90Y3AuaCBiL2luY2x1ZGUvbmV0L3RjcC5oCmluZGV4IDU3NDBiODUuLjFiNmY3ZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3RjcC5oCisrKyBiL2luY2x1ZGUvbmV0L3RjcC5oCkBAIC0xMjYxLDI5ICsxMjYxLDYgQEAKICNkZWZpbmUgdGNwX2Zvcl93cml0ZV9xdWV1ZV9mcm9tX3NhZmUoc2tiLCB0bXAsIHNrKQkJCVwKIAlza2JfcXVldWVfd2Fsa19mcm9tX3NhZmUoJihzayktPnNrX3dyaXRlX3F1ZXVlLCBza2IsIHRtcCkKIAotLyogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIGEgInRpbWVvdXQiIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gdGhlIHRpbWVvdXQgb2YgYQotICogVENQIGNvbm5lY3Rpb24gYWZ0ZXIgImJvdW5kYXJ5IiB1bnN1Y2Nlc3NmdWwsIGV4cG9uZW50aWFsbHkgYmFja2VkLW9mZgotICogcmV0cmFuc21pc3Npb25zIHdpdGggYW4gaW5pdGlhbCBSVE8gb2YgVENQX1JUT19NSU4uCi0gKi8KLXN0YXRpYyBpbmxpbmUgYm9vbCByZXRyYW5zbWl0c190aW1lZF9vdXQoY29uc3Qgc3RydWN0IHNvY2sgKnNrLAotCQkJCQkgdW5zaWduZWQgaW50IGJvdW5kYXJ5KQotewotCXVuc2lnbmVkIGludCB0aW1lb3V0LCBsaW5lYXJfYmFja29mZl90aHJlc2g7Ci0KLQlpZiAoIWluZXRfY3NrKHNrKS0+aWNza19yZXRyYW5zbWl0cykKLQkJcmV0dXJuIGZhbHNlOwotCi0JbGluZWFyX2JhY2tvZmZfdGhyZXNoID0gaWxvZzIoVENQX1JUT19NQVgvVENQX1JUT19NSU4pOwotCi0JaWYgKGJvdW5kYXJ5IDw9IGxpbmVhcl9iYWNrb2ZmX3RocmVzaCkKLQkJdGltZW91dCA9ICgoMiA8PCBib3VuZGFyeSkgLSAxKSAqIFRDUF9SVE9fTUlOOwotCWVsc2UKLQkJdGltZW91dCA9ICgoMiA8PCBsaW5lYXJfYmFja29mZl90aHJlc2gpIC0gMSkgKiBUQ1BfUlRPX01JTiArCi0JCQkgIChib3VuZGFyeSAtIGxpbmVhcl9iYWNrb2ZmX3RocmVzaCkgKiBUQ1BfUlRPX01BWDsKLQotCXJldHVybiAodGNwX3RpbWVfc3RhbXAgLSB0Y3Bfc2soc2spLT5yZXRyYW5zX3N0YW1wKSA+PSB0aW1lb3V0OwotfQotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICp0Y3Bfc2VuZF9oZWFkKHN0cnVjdCBzb2NrICpzaykKIHsKIAlyZXR1cm4gc2stPnNrX3NlbmRfaGVhZDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGNtY2lhL2NzLmggYi9pbmNsdWRlL3BjbWNpYS9jcy5oCmluZGV4IGFmYzJiZmIuLjc1ZmEzNTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcGNtY2lhL2NzLmgKKysrIGIvaW5jbHVkZS9wY21jaWEvY3MuaApAQCAtMTI2LDggKzEyNiw4IEBACiAjZGVmaW5lIElSUV9UWVBFX1RJTUUJCQkweDAxCiAjZGVmaW5lIElSUV9UWVBFX0RZTkFNSUNfU0hBUklORwkweDAyCiAjZGVmaW5lIElSUV9GT1JDRURfUFVMU0UJCTB4MDQKLSNkZWZpbmUgSVJRX0ZJUlNUX1NIQVJFRAkJMHgwOAotLy8jZGVmaW5lIElSUV9IQU5ETEVfUFJFU0VOVAkJMHgxMAorI2RlZmluZSBJUlFfRklSU1RfU0hBUkVECQkweDA4IC8qIHVudXNlZCAqLworI2RlZmluZSBJUlFfSEFORExFX1BSRVNFTlQJCTB4MTAgLyogdW51c2VkICovCiAjZGVmaW5lIElSUV9QVUxTRV9BTExPQ0FURUQJCTB4MTAwCiAKIC8qIEJpdHMgaW4gSVJRSW5mbzEgZmllbGQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGNtY2lhL2RzLmggYi9pbmNsdWRlL3BjbWNpYS9kcy5oCmluZGV4IGQ0MDNjMTIuLmVlMTQ4NTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcGNtY2lhL2RzLmgKKysrIGIvaW5jbHVkZS9wY21jaWEvZHMuaApAQCAtODIsNyArODIsNyBAQAogCS8qIHRoZSBoYXJkd2FyZSAiZnVuY3Rpb24iIGRldmljZTsgY2VydGFpbiBzdWJkZXZpY2VzIGNhbgogCSAqIHNoYXJlIG9uZSBoYXJkd2FyZSAiZnVuY3Rpb24iIGRldmljZS4gKi8KIAl1OAkJCWZ1bmM7Ci0Jc3RydWN0IGNvbmZpZ190KglmdW5jdGlvbl9jb25maWc7CisJc3RydWN0IGNvbmZpZ190CQkqZnVuY3Rpb25fY29uZmlnOwogCiAJc3RydWN0IGxpc3RfaGVhZAlzb2NrZXRfZGV2aWNlX2xpc3Q7CiAKQEAgLTEyMSwxNCArMTIxLDE0IEBACiAJdTE2CQkJbWFuZl9pZDsKIAl1MTYJCQljYXJkX2lkOwogCi0JY2hhciAqCQkJcHJvZF9pZFs0XTsKKwljaGFyCQkJKnByb2RfaWRbNF07CiAKIAl1NjQJCQlkbWFfbWFzazsKIAlzdHJ1Y3QgZGV2aWNlCQlkZXY7CiAKICNpZmRlZiBDT05GSUdfUENNQ0lBX0lPQ1RMCiAJLyogZGV2aWNlIGRyaXZlciB3YW50ZWQgYnkgY2FyZG1nciAqLwotCXN0cnVjdCBwY21jaWFfZHJpdmVyICoJY2FyZG1ncjsKKwlzdHJ1Y3QgcGNtY2lhX2RyaXZlcgkqY2FyZG1ncjsKICNlbmRpZgogCiAJLyogZGF0YSBwcml2YXRlIHRvIGRyaXZlcnMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGNtY2lhL21lbV9vcC5oIGIvaW5jbHVkZS9wY21jaWEvbWVtX29wLmgKaW5kZXggOGQxOWI5NC4uMGZhMDZlNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wY21jaWEvbWVtX29wLmgKKysrIGIvaW5jbHVkZS9wY21jaWEvbWVtX29wLmgKQEAgLTE1LDggKzE1LDggQEAKICNpZm5kZWYgX0xJTlVYX01FTV9PUF9ICiAjZGVmaW5lIF9MSU5VWF9NRU1fT1BfSAogCisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCiAvKgogICAgSWYgVU5TQUZFX01FTUNQWSBpcyBkZWZpbmVkLCB3ZSB1c2UgdGhlIChvcHRpbWl6ZWQpIHN5c3RlbSByb3V0aW5lcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wY21jaWEvc3MuaCBiL2luY2x1ZGUvcGNtY2lhL3NzLmgKaW5kZXggN2MyM2JlNy4uY2JmYmE4OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wY21jaWEvc3MuaAorKysgYi9pbmNsdWRlL3BjbWNpYS9zcy5oCkBAIC0xNTQsNyArMTU0LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCQlzb2NrZXRfbGlzdDsKIAlzdHJ1Y3QgY29tcGxldGlvbgkJc29ja2V0X3JlbGVhc2VkOwogCi0gCS8qIGRlcHJlY2F0ZWQgKi8KKwkvKiBkZXByZWNhdGVkICovCiAJdW5zaWduZWQgaW50CQkJc29jazsJCS8qIHNvY2tldCBudW1iZXIgKi8KIAogCkBAIC0xNjQsNyArMTY0LDcgQEAKIAl1X2ludAkJCQltYXBfc2l6ZTsKIAl1X2ludAkJCQlpb19vZmZzZXQ7CiAJdV9pbnQJCQkJcGNpX2lycTsKLQlzdHJ1Y3QgcGNpX2RldiAqCQljYl9kZXY7CisJc3RydWN0IHBjaV9kZXYJCQkqY2JfZGV2OwogCiAKIAkvKiBzb2NrZXQgc2V0dXAgaXMgZG9uZSBzbyByZXNvdXJjZXMgc2hvdWxkIGJlIGFibGUgdG8gYmUgYWxsb2NhdGVkLgpAQCAtMTc5LDkgKzE3OSw5IEBACiAJdTgJCQkJcmVzZXJ2ZWQ6NTsKIAogCS8qIHNvY2tldCBvcGVyYXRpb25zICovCi0Jc3RydWN0IHBjY2FyZF9vcGVyYXRpb25zICoJb3BzOwotCXN0cnVjdCBwY2NhcmRfcmVzb3VyY2Vfb3BzICoJcmVzb3VyY2Vfb3BzOwotCXZvaWQgKgkJCQlyZXNvdXJjZV9kYXRhOworCXN0cnVjdCBwY2NhcmRfb3BlcmF0aW9ucwkqb3BzOworCXN0cnVjdCBwY2NhcmRfcmVzb3VyY2Vfb3BzCSpyZXNvdXJjZV9vcHM7CisJdm9pZAkJCQkqcmVzb3VyY2VfZGF0YTsKIAogCS8qIFpvb20gdmlkZW8gYmVoYXZpb3VyIGlzIHNvIGNoaXAgc3BlY2lmaWMgaXRzIG5vdCB3b3J0aCBhZGRpbmcKIAkgICB0aGlzIHRvIF9vcHMgKi8KQEAgLTI0NSw3ICsyNDUsNyBAQAogCiAJLyogY2FyZGJ1cyAoMzItYml0KSAqLwogI2lmZGVmIENPTkZJR19DQVJEQlVTCi0Jc3RydWN0IHJlc291cmNlICoJCWNiX2Npc19yZXM7CisJc3RydWN0IHJlc291cmNlCQkJKmNiX2Npc19yZXM7CiAJdm9pZCBfX2lvbWVtCQkJKmNiX2Npc192aXJ0OwogI2VuZGlmIC8qIENPTkZJR19DQVJEQlVTICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3RpbWVyLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy90aW1lci5oCmluZGV4IGU1Y2U4N2EuLjk0OTZiOTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3RpbWVyLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvdGltZXIuaApAQCAtMzAxLDggKzMwMSw4IEBACiAJCV9fZW50cnktPmludGVydmFsX3VzZWMJPSB2YWx1ZS0+aXRfaW50ZXJ2YWwudHZfdXNlYzsKIAkpLAogCi0JVFBfcHJpbnRrKCJ3aGljaD0lZCBleHBpcmVzPSVsdSBpdF92YWx1ZT0lbHUuJWx1IGl0X2ludGVydmFsPSVsdS4lbHUiLAotCQkgIF9fZW50cnktPndoaWNoLCBfX2VudHJ5LT5leHBpcmVzLAorCVRQX3ByaW50aygid2hpY2g9JWQgZXhwaXJlcz0lbGx1IGl0X3ZhbHVlPSVsZC4lbGQgaXRfaW50ZXJ2YWw9JWxkLiVsZCIsCisJCSAgX19lbnRyeS0+d2hpY2gsICh1bnNpZ25lZCBsb25nIGxvbmcpX19lbnRyeS0+ZXhwaXJlcywKIAkJICBfX2VudHJ5LT52YWx1ZV9zZWMsIF9fZW50cnktPnZhbHVlX3VzZWMsCiAJCSAgX19lbnRyeS0+aW50ZXJ2YWxfc2VjLCBfX2VudHJ5LT5pbnRlcnZhbF91c2VjKQogKTsKQEAgLTMzMSw4ICszMzEsOCBAQAogCQlfX2VudHJ5LT5waWQJPSBwaWRfbnIocGlkKTsKIAkpLAogCi0JICAgIFRQX3ByaW50aygid2hpY2g9JWQgcGlkPSVkIG5vdz0lbHUiLCBfX2VudHJ5LT53aGljaCwKLQkJICAgICAgKGludCkgX19lbnRyeS0+cGlkLCBfX2VudHJ5LT5ub3cpCisJVFBfcHJpbnRrKCJ3aGljaD0lZCBwaWQ9JWQgbm93PSVsbHUiLCBfX2VudHJ5LT53aGljaCwKKwkJICAoaW50KSBfX2VudHJ5LT5waWQsICh1bnNpZ25lZCBsb25nIGxvbmcpX19lbnRyeS0+bm93KQogKTsKIAogI2VuZGlmIC8qICBfVFJBQ0VfVElNRVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS94ZW4veGVuLmggYi9pbmNsdWRlL3hlbi94ZW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTY0MDI0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS94ZW4veGVuLmgKQEAgLTAsMCArMSwzMiBAQAorI2lmbmRlZiBfWEVOX1hFTl9ICisjZGVmaW5lIF9YRU5fWEVOX0gKKworZW51bSB4ZW5fZG9tYWluX3R5cGUgeworCVhFTl9OQVRJVkUsCQkvKiBydW5uaW5nIG9uIGJhcmUgaGFyZHdhcmUgICAgKi8KKwlYRU5fUFZfRE9NQUlOLAkJLyogcnVubmluZyBpbiBhIFBWIGRvbWFpbiAgICAgICovCisJWEVOX0hWTV9ET01BSU4sCQkvKiBydW5uaW5nIGluIGEgWGVuIGh2bSBkb21haW4gKi8KK307CisKKyNpZmRlZiBDT05GSUdfWEVOCitleHRlcm4gZW51bSB4ZW5fZG9tYWluX3R5cGUgeGVuX2RvbWFpbl90eXBlOworI2Vsc2UKKyNkZWZpbmUgeGVuX2RvbWFpbl90eXBlCQlYRU5fTkFUSVZFCisjZW5kaWYKKworI2RlZmluZSB4ZW5fZG9tYWluKCkJCSh4ZW5fZG9tYWluX3R5cGUgIT0gWEVOX05BVElWRSkKKyNkZWZpbmUgeGVuX3B2X2RvbWFpbigpCQkoeGVuX2RvbWFpbigpICYmCQkJXAorCQkJCSB4ZW5fZG9tYWluX3R5cGUgPT0gWEVOX1BWX0RPTUFJTikKKyNkZWZpbmUgeGVuX2h2bV9kb21haW4oKQkoeGVuX2RvbWFpbigpICYmCQkJXAorCQkJCSB4ZW5fZG9tYWluX3R5cGUgPT0gWEVOX0hWTV9ET01BSU4pCisKKyNpZmRlZiBDT05GSUdfWEVOX0RPTTAKKyNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3hlbi5oPgorI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJ2aXNvci5oPgorCisjZGVmaW5lIHhlbl9pbml0aWFsX2RvbWFpbigpCSh4ZW5fcHZfZG9tYWluKCkgJiYgXAorCQkJCSB4ZW5fc3RhcnRfaW5mby0+ZmxhZ3MgJiBTSUZfSU5JVERPTUFJTikKKyNlbHNlICAvKiAhQ09ORklHX1hFTl9ET00wICovCisjZGVmaW5lIHhlbl9pbml0aWFsX2RvbWFpbigpCSgwKQorI2VuZGlmCS8qIENPTkZJR19YRU5fRE9NMCAqLworCisjZW5kaWYJLyogX1hFTl9YRU5fSCAqLwpkaWZmIC0tZ2l0IGEvaXBjL3NobS5jIGIvaXBjL3NobS5jCmluZGV4IDQ2NDY5NGUuLjExYmVjNjIgMTAwNjQ0Ci0tLSBhL2lwYy9zaG0uYworKysgYi9pcGMvc2htLmMKQEAgLTI5MCwyOCArMjkwLDI4IEBACiAJdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3Qgc2htX2ZpbGVfZGF0YSAqc2ZkID0gc2htX2ZpbGVfZGF0YShmaWxlKTsKLQlyZXR1cm4gZ2V0X3VubWFwcGVkX2FyZWEoc2ZkLT5maWxlLCBhZGRyLCBsZW4sIHBnb2ZmLCBmbGFncyk7Ci19Ci0KLWludCBpc19maWxlX3NobV9odWdlcGFnZXMoc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoZmlsZS0+Zl9vcCA9PSAmc2htX2ZpbGVfb3BlcmF0aW9ucykgewotCQlzdHJ1Y3Qgc2htX2ZpbGVfZGF0YSAqc2ZkOwotCQlzZmQgPSBzaG1fZmlsZV9kYXRhKGZpbGUpOwotCQlyZXQgPSBpc19maWxlX2h1Z2VwYWdlcyhzZmQtPmZpbGUpOwotCX0KLQlyZXR1cm4gcmV0OworCXJldHVybiBzZmQtPmZpbGUtPmZfb3AtPmdldF91bm1hcHBlZF9hcmVhKHNmZC0+ZmlsZSwgYWRkciwgbGVuLAorCQkJCQkJcGdvZmYsIGZsYWdzKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2htX2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkubW1hcAkJPSBzaG1fbW1hcCwKIAkuZnN5bmMJCT0gc2htX2ZzeW5jLAogCS5yZWxlYXNlCT0gc2htX3JlbGVhc2UsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzaG1fZmlsZV9vcGVyYXRpb25zX2h1Z2UgPSB7CisJLm1tYXAJCT0gc2htX21tYXAsCisJLmZzeW5jCQk9IHNobV9mc3luYywKKwkucmVsZWFzZQk9IHNobV9yZWxlYXNlLAogCS5nZXRfdW5tYXBwZWRfYXJlYQk9IHNobV9nZXRfdW5tYXBwZWRfYXJlYSwKIH07CiAKK2ludCBpc19maWxlX3NobV9odWdlcGFnZXMoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIGZpbGUtPmZfb3AgPT0gJnNobV9maWxlX29wZXJhdGlvbnNfaHVnZTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBzaG1fdm1fb3BzID0gewogCS5vcGVuCT0gc2htX29wZW4sCS8qIGNhbGxiYWNrIGZvciBhIG5ldyB2bS1hcmVhIG9wZW4gKi8KIAkuY2xvc2UJPSBzaG1fY2xvc2UsCS8qIGNhbGxiYWNrIGZvciB3aGVuIHRoZSB2bS1hcmVhIGlzIHJlbGVhc2VkICovCkBAIC04ODksNyArODg5LDEwIEBACiAJaWYgKCFzZmQpCiAJCWdvdG8gb3V0X3B1dF9kZW50cnk7CiAKLQlmaWxlID0gYWxsb2NfZmlsZShwYXRoLm1udCwgcGF0aC5kZW50cnksIGZfbW9kZSwgJnNobV9maWxlX29wZXJhdGlvbnMpOworCWZpbGUgPSBhbGxvY19maWxlKHBhdGgubW50LCBwYXRoLmRlbnRyeSwgZl9tb2RlLAorCQkJaXNfZmlsZV9odWdlcGFnZXMoc2hwLT5zaG1fZmlsZSkgPworCQkJCSZzaG1fZmlsZV9vcGVyYXRpb25zX2h1Z2UgOgorCQkJCSZzaG1fZmlsZV9vcGVyYXRpb25zKTsKIAlpZiAoIWZpbGUpCiAJCWdvdG8gb3V0X2ZyZWU7CiAJaW1hX2NvdW50c19nZXQoZmlsZSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvY3B1LmMgYi9rZXJuZWwvY3B1LmMKaW5kZXggN2M0ZTI3MS4uMjkxYWM1OCAxMDA2NDQKLS0tIGEva2VybmVsL2NwdS5jCisrKyBiL2tlcm5lbC9jcHUuYwpAQCAtMjEyLDYgKzIxMiw4IEBACiAJZXJyID0gX19yYXdfbm90aWZpZXJfY2FsbF9jaGFpbigmY3B1X2NoYWluLCBDUFVfRE9XTl9QUkVQQVJFIHwgbW9kLAogCQkJCQloY3B1LCAtMSwgJm5yX2NhbGxzKTsKIAlpZiAoZXJyID09IE5PVElGWV9CQUQpIHsKKwkJc2V0X2NwdV9hY3RpdmUoY3B1LCB0cnVlKTsKKwogCQlucl9jYWxscy0tOwogCQlfX3Jhd19ub3RpZmllcl9jYWxsX2NoYWluKCZjcHVfY2hhaW4sIENQVV9ET1dOX0ZBSUxFRCB8IG1vZCwKIAkJCQkJICBoY3B1LCBucl9jYWxscywgTlVMTCk7CkBAIC0yMjMsMTEgKzIyNSwxMSBAQAogCiAJLyogRW5zdXJlIHRoYXQgd2UgYXJlIG5vdCBydW5uYWJsZSBvbiBkeWluZyBjcHUgKi8KIAljcHVtYXNrX2NvcHkob2xkX2FsbG93ZWQsICZjdXJyZW50LT5jcHVzX2FsbG93ZWQpOwotCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsCi0JCQkgICAgIGNwdW1hc2tfb2YoY3B1bWFza19hbnlfYnV0KGNwdV9vbmxpbmVfbWFzaywgY3B1KSkpOworCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsIGNwdV9hY3RpdmVfbWFzayk7CiAKIAllcnIgPSBfX3N0b3BfbWFjaGluZSh0YWtlX2NwdV9kb3duLCAmdGNkX3BhcmFtLCBjcHVtYXNrX29mKGNwdSkpOwogCWlmIChlcnIpIHsKKwkJc2V0X2NwdV9hY3RpdmUoY3B1LCB0cnVlKTsKIAkJLyogQ1BVIGRpZG4ndCBkaWU6IHRlbGwgZXZlcnlvbmUuICBDYW4ndCBjb21wbGFpbi4gKi8KIAkJaWYgKHJhd19ub3RpZmllcl9jYWxsX2NoYWluKCZjcHVfY2hhaW4sIENQVV9ET1dOX0ZBSUxFRCB8IG1vZCwKIAkJCQkJICAgIGhjcHUpID09IE5PVElGWV9CQUQpCkBAIC0yOTIsOSArMjk0LDYgQEAKIAogCWVyciA9IF9jcHVfZG93bihjcHUsIDApOwogCi0JaWYgKGNwdV9vbmxpbmUoY3B1KSkKLQkJc2V0X2NwdV9hY3RpdmUoY3B1LCB0cnVlKTsKLQogb3V0OgogCWNwdV9tYXBzX3VwZGF0ZV9kb25lKCk7CiAJc3RvcF9tYWNoaW5lX2Rlc3Ryb3koKTsKQEAgLTM4Nyw2ICszODYsMTUgQEAKIAkgKiB3aXRoIHRoZSB1c2Vyc3BhY2UgdHJ5aW5nIHRvIHVzZSB0aGUgQ1BVIGhvdHBsdWcgYXQgdGhlIHNhbWUgdGltZQogCSAqLwogCWNwdW1hc2tfY2xlYXIoZnJvemVuX2NwdXMpOworCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJaWYgKGNwdSA9PSBmaXJzdF9jcHUpCisJCQljb250aW51ZTsKKwkJc2V0X2NwdV9hY3RpdmUoY3B1LCBmYWxzZSk7CisJfQorCisJc3luY2hyb25pemVfc2NoZWQoKTsKKwogCXByaW50aygiRGlzYWJsaW5nIG5vbi1ib290IENQVXMgLi4uXG4iKTsKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewogCQlpZiAoY3B1ID09IGZpcnN0X2NwdSkKZGlmZiAtLWdpdCBhL2tlcm5lbC9jcHVzZXQuYyBiL2tlcm5lbC9jcHVzZXQuYwppbmRleCAzY2YyMTgzLi5iYTQwMWZhIDEwMDY0NAotLS0gYS9rZXJuZWwvY3B1c2V0LmMKKysrIGIva2VybmVsL2NwdXNldC5jCkBAIC03MzcsNyArNzM3LDcgQEAKIHsKIH0KIAotc3RhdGljIGludCBnZW5lcmF0ZV9zY2hlZF9kb21haW5zKHN0cnVjdCBjcHVtYXNrICoqZG9tYWlucywKK3N0YXRpYyBpbnQgZ2VuZXJhdGVfc2NoZWRfZG9tYWlucyhjcHVtYXNrX3Zhcl90ICoqZG9tYWlucywKIAkJCXN0cnVjdCBzY2hlZF9kb21haW5fYXR0ciAqKmF0dHJpYnV0ZXMpCiB7CiAJKmRvbWFpbnMgPSBOVUxMOwpAQCAtODcyLDcgKzg3Miw3IEBACiAJCWlmIChyZXR2YWwgPCAwKQogCQkJcmV0dXJuIHJldHZhbDsKIAotCQlpZiAoIWNwdW1hc2tfc3Vic2V0KHRyaWFsY3MtPmNwdXNfYWxsb3dlZCwgY3B1X29ubGluZV9tYXNrKSkKKwkJaWYgKCFjcHVtYXNrX3N1YnNldCh0cmlhbGNzLT5jcHVzX2FsbG93ZWQsIGNwdV9hY3RpdmVfbWFzaykpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmV0dmFsID0gdmFsaWRhdGVfY2hhbmdlKGNzLCB0cmlhbGNzKTsKQEAgLTIwMTAsNyArMjAxMCw3IEBACiAJCX0KIAogCQkvKiBDb250aW51ZSBwYXN0IGNwdXNldHMgd2l0aCBhbGwgY3B1cywgbWVtcyBvbmxpbmUgKi8KLQkJaWYgKGNwdW1hc2tfc3Vic2V0KGNwLT5jcHVzX2FsbG93ZWQsIGNwdV9vbmxpbmVfbWFzaykgJiYKKwkJaWYgKGNwdW1hc2tfc3Vic2V0KGNwLT5jcHVzX2FsbG93ZWQsIGNwdV9hY3RpdmVfbWFzaykgJiYKIAkJICAgIG5vZGVzX3N1YnNldChjcC0+bWVtc19hbGxvd2VkLCBub2RlX3N0YXRlc1tOX0hJR0hfTUVNT1JZXSkpCiAJCQljb250aW51ZTsKIApAQCAtMjAxOSw3ICsyMDE5LDcgQEAKIAkJLyogUmVtb3ZlIG9mZmxpbmUgY3B1cyBhbmQgbWVtcyBmcm9tIHRoaXMgY3B1c2V0LiAqLwogCQltdXRleF9sb2NrKCZjYWxsYmFja19tdXRleCk7CiAJCWNwdW1hc2tfYW5kKGNwLT5jcHVzX2FsbG93ZWQsIGNwLT5jcHVzX2FsbG93ZWQsCi0JCQkgICAgY3B1X29ubGluZV9tYXNrKTsKKwkJCSAgICBjcHVfYWN0aXZlX21hc2spOwogCQlub2Rlc19hbmQoY3AtPm1lbXNfYWxsb3dlZCwgY3AtPm1lbXNfYWxsb3dlZCwKIAkJCQkJCW5vZGVfc3RhdGVzW05fSElHSF9NRU1PUlldKTsKIAkJbXV0ZXhfdW5sb2NrKCZjYWxsYmFja19tdXRleCk7CkBAIC0yMDU3LDggKzIwNTcsMTAgQEAKIAlzd2l0Y2ggKHBoYXNlKSB7CiAJY2FzZSBDUFVfT05MSU5FOgogCWNhc2UgQ1BVX09OTElORV9GUk9aRU46Ci0JY2FzZSBDUFVfREVBRDoKLQljYXNlIENQVV9ERUFEX0ZST1pFTjoKKwljYXNlIENQVV9ET1dOX1BSRVBBUkU6CisJY2FzZSBDUFVfRE9XTl9QUkVQQVJFX0ZST1pFTjoKKwljYXNlIENQVV9ET1dOX0ZBSUxFRDoKKwljYXNlIENQVV9ET1dOX0ZBSUxFRF9GUk9aRU46CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTIwNjcsNyArMjA2OSw3IEBACiAKIAljZ3JvdXBfbG9jaygpOwogCW11dGV4X2xvY2soJmNhbGxiYWNrX211dGV4KTsKLQljcHVtYXNrX2NvcHkodG9wX2NwdXNldC5jcHVzX2FsbG93ZWQsIGNwdV9vbmxpbmVfbWFzayk7CisJY3B1bWFza19jb3B5KHRvcF9jcHVzZXQuY3B1c19hbGxvd2VkLCBjcHVfYWN0aXZlX21hc2spOwogCW11dGV4X3VubG9jaygmY2FsbGJhY2tfbXV0ZXgpOwogCXNjYW5fZm9yX2VtcHR5X2NwdXNldHMoJnRvcF9jcHVzZXQpOwogCW5kb21zID0gZ2VuZXJhdGVfc2NoZWRfZG9tYWlucygmZG9tcywgJmF0dHIpOwpAQCAtMjExNCw3ICsyMTE2LDcgQEAKIAogdm9pZCBfX2luaXQgY3B1c2V0X2luaXRfc21wKHZvaWQpCiB7Ci0JY3B1bWFza19jb3B5KHRvcF9jcHVzZXQuY3B1c19hbGxvd2VkLCBjcHVfb25saW5lX21hc2spOworCWNwdW1hc2tfY29weSh0b3BfY3B1c2V0LmNwdXNfYWxsb3dlZCwgY3B1X2FjdGl2ZV9tYXNrKTsKIAl0b3BfY3B1c2V0Lm1lbXNfYWxsb3dlZCA9IG5vZGVfc3RhdGVzW05fSElHSF9NRU1PUlldOwogCiAJaG90Y3B1X25vdGlmaWVyKGNwdXNldF90cmFja19vbmxpbmVfY3B1cywgMCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvZXhpdC5jIGIva2VybmVsL2V4aXQuYwppbmRleCAxMTQzMDEyLi42ZjUwZWY1IDEwMDY0NAotLS0gYS9rZXJuZWwvZXhpdC5jCisrKyBiL2tlcm5lbC9leGl0LmMKQEAgLTk3MSw3ICs5NzEsNyBAQAogCWV4aXRfdGhyZWFkKCk7CiAJY2dyb3VwX2V4aXQodHNrLCAxKTsKIAotCWlmIChncm91cF9kZWFkICYmIHRzay0+c2lnbmFsLT5sZWFkZXIpCisJaWYgKGdyb3VwX2RlYWQpCiAJCWRpc2Fzc29jaWF0ZV9jdHR5KDEpOwogCiAJbW9kdWxlX3B1dCh0YXNrX3RocmVhZF9pbmZvKHRzayktPmV4ZWNfZG9tYWluLT5tb2R1bGUpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2Z1dGV4LmMgYi9rZXJuZWwvZnV0ZXguYwppbmRleCBmYjY1ZTgyLi5kNzNlZjFmIDEwMDY0NAotLS0gYS9rZXJuZWwvZnV0ZXguYworKysgYi9rZXJuZWwvZnV0ZXguYwpAQCAtMzA0LDggKzMwNCwxNCBAQAogICovCiBzdGF0aWMgaW50IGZhdWx0X2luX3VzZXJfd3JpdGVhYmxlKHUzMiBfX3VzZXIgKnVhZGRyKQogewotCWludCByZXQgPSBnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBjdXJyZW50LT5tbSwgKHVuc2lnbmVkIGxvbmcpdWFkZHIsCi0JCQkJIDEsIDEsIDAsIE5VTEwsIE5VTEwpOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CisJaW50IHJldDsKKworCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwlyZXQgPSBnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBtbSwgKHVuc2lnbmVkIGxvbmcpdWFkZHIsCisJCQkgICAgIDEsIDEsIDAsIE5VTEwsIE5VTEwpOworCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisKIAlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IDA7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9ocnRpbWVyLmMgYi9rZXJuZWwvaHJ0aW1lci5jCmluZGV4IGVkZTUyNzcuLmQyZjkyMzkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ocnRpbWVyLmMKKysrIGIva2VybmVsL2hydGltZXIuYwpAQCAtNTU3LDcgKzU1Nyw3IEBACiBzdGF0aWMgaW50IGhydGltZXJfcmVwcm9ncmFtKHN0cnVjdCBocnRpbWVyICp0aW1lciwKIAkJCSAgICAgc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSkKIHsKLQlrdGltZV90ICpleHBpcmVzX25leHQgPSAmX19nZXRfY3B1X3ZhcihocnRpbWVyX2Jhc2VzKS5leHBpcmVzX25leHQ7CisJc3RydWN0IGhydGltZXJfY3B1X2Jhc2UgKmNwdV9iYXNlID0gJl9fZ2V0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcyk7CiAJa3RpbWVfdCBleHBpcmVzID0ga3RpbWVfc3ViKGhydGltZXJfZ2V0X2V4cGlyZXModGltZXIpLCBiYXNlLT5vZmZzZXQpOwogCWludCByZXM7CiAKQEAgLTU4Miw3ICs1ODIsMTYgQEAKIAlpZiAoZXhwaXJlcy50djY0IDwgMCkKIAkJcmV0dXJuIC1FVElNRTsKIAotCWlmIChleHBpcmVzLnR2NjQgPj0gZXhwaXJlc19uZXh0LT50djY0KQorCWlmIChleHBpcmVzLnR2NjQgPj0gY3B1X2Jhc2UtPmV4cGlyZXNfbmV4dC50djY0KQorCQlyZXR1cm4gMDsKKworCS8qCisJICogSWYgYSBoYW5nIHdhcyBkZXRlY3RlZCBpbiB0aGUgbGFzdCB0aW1lciBpbnRlcnJ1cHQgdGhlbiB3ZQorCSAqIGRvIG5vdCBzY2hlZHVsZSBhIHRpbWVyIHdoaWNoIGlzIGVhcmxpZXIgdGhhbiB0aGUgZXhwaXJ5CisJICogd2hpY2ggd2UgZW5mb3JjZWQgaW4gdGhlIGhhbmcgZGV0ZWN0aW9uLiBXZSB3YW50IHRoZSBzeXN0ZW0KKwkgKiB0byBtYWtlIHByb2dyZXNzLgorCSAqLworCWlmIChjcHVfYmFzZS0+aGFuZ19kZXRlY3RlZCkKIAkJcmV0dXJuIDA7CiAKIAkvKgpAQCAtNTkwLDcgKzU5OSw3IEBACiAJICovCiAJcmVzID0gdGlja19wcm9ncmFtX2V2ZW50KGV4cGlyZXMsIDApOwogCWlmICghSVNfRVJSX1ZBTFVFKHJlcykpCi0JCSpleHBpcmVzX25leHQgPSBleHBpcmVzOworCQljcHVfYmFzZS0+ZXhwaXJlc19uZXh0ID0gZXhwaXJlczsKIAlyZXR1cm4gcmVzOwogfQogCkBAIC03NDcsMTcgKzc1NiwzMyBAQAogCiAjZW5kaWYgLyogQ09ORklHX0hJR0hfUkVTX1RJTUVSUyAqLwogCi0jaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCi12b2lkIF9fdGltZXJfc3RhdHNfaHJ0aW1lcl9zZXRfc3RhcnRfaW5mbyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsIHZvaWQgKmFkZHIpCitzdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfaHJ0aW1lcl9zZXRfc3RhcnRfaW5mbyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCiB7CisjaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCiAJaWYgKHRpbWVyLT5zdGFydF9zaXRlKQogCQlyZXR1cm47Ci0KLQl0aW1lci0+c3RhcnRfc2l0ZSA9IGFkZHI7CisJdGltZXItPnN0YXJ0X3NpdGUgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7CiAJbWVtY3B5KHRpbWVyLT5zdGFydF9jb21tLCBjdXJyZW50LT5jb21tLCBUQVNLX0NPTU1fTEVOKTsKIAl0aW1lci0+c3RhcnRfcGlkID0gY3VycmVudC0+cGlkOwotfQogI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0aW1lcl9zdGF0c19ocnRpbWVyX2NsZWFyX3N0YXJ0X2luZm8oc3RydWN0IGhydGltZXIgKnRpbWVyKQoreworI2lmZGVmIENPTkZJR19USU1FUl9TVEFUUworCXRpbWVyLT5zdGFydF9zaXRlID0gTlVMTDsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfYWNjb3VudF9ocnRpbWVyKHN0cnVjdCBocnRpbWVyICp0aW1lcikKK3sKKyNpZmRlZiBDT05GSUdfVElNRVJfU1RBVFMKKwlpZiAobGlrZWx5KCF0aW1lcl9zdGF0c19hY3RpdmUpKQorCQlyZXR1cm47CisJdGltZXJfc3RhdHNfdXBkYXRlX3N0YXRzKHRpbWVyLCB0aW1lci0+c3RhcnRfcGlkLCB0aW1lci0+c3RhcnRfc2l0ZSwKKwkJCQkgdGltZXItPmZ1bmN0aW9uLCB0aW1lci0+c3RhcnRfY29tbSwgMCk7CisjZW5kaWYKK30KIAogLyoKICAqIENvdW50ZXJwYXJ0IHRvIGxvY2tfaHJ0aW1lcl9iYXNlIGFib3ZlOgpAQCAtMTIxNywzMCArMTI0Miw2IEBACiAKICNpZmRlZiBDT05GSUdfSElHSF9SRVNfVElNRVJTCiAKLXN0YXRpYyBpbnQgZm9yY2VfY2xvY2tfcmVwcm9ncmFtOwotCi0vKgotICogQWZ0ZXIgNSBpdGVyYXRpb24ncyBhdHRlbXB0cywgd2UgY29uc2lkZXIgdGhhdCBocnRpbWVyX2ludGVycnVwdCgpCi0gKiBpcyBoYW5naW5nLCB3aGljaCBjb3VsZCBoYXBwZW4gd2l0aCBzb21ldGhpbmcgdGhhdCBzbG93cyB0aGUgaW50ZXJydXB0Ci0gKiBzdWNoIGFzIHRoZSB0cmFjaW5nLiBUaGVuIHdlIGZvcmNlIHRoZSBjbG9jayByZXByb2dyYW1taW5nIGZvciBlYWNoIGZ1dHVyZQotICogaHJ0aW1lciBpbnRlcnJ1cHRzIHRvIGF2b2lkIGluZmluaXRlIGxvb3BzIGFuZCB1c2UgdGhlIG1pbl9kZWx0YV9ucwotICogdGhyZXNob2xkIHRoYXQgd2Ugd2lsbCBvdmVyd3JpdGUuCi0gKiBUaGUgbmV4dCB0aWNrIGV2ZW50IHdpbGwgYmUgc2NoZWR1bGVkIHRvIDMgdGltZXMgd2UgY3VycmVudGx5IHNwZW5kIG9uCi0gKiBocnRpbWVyX2ludGVycnVwdCgpLiBUaGlzIGdpdmVzIGEgZ29vZCBjb21wcm9taXNlLCB0aGUgY3B1cyB3aWxsIHNwZW5kCi0gKiAxLzQgb2YgdGhlaXIgdGltZSB0byBwcm9jZXNzIHRoZSBocnRpbWVyIGludGVycnVwdHMuIFRoaXMgaXMgZW5vdWdoIHRvCi0gKiBsZXQgaXQgcnVubmluZyB3aXRob3V0IHNlcmlvdXMgc3RhcnZhdGlvbi4KLSAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWhydGltZXJfaW50ZXJydXB0X2hhbmdpbmcoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LAotCQkJa3RpbWVfdCB0cnlfdGltZSkKLXsKLQlmb3JjZV9jbG9ja19yZXByb2dyYW0gPSAxOwotCWRldi0+bWluX2RlbHRhX25zID0gKHVuc2lnbmVkIGxvbmcpdHJ5X3RpbWUudHY2NCAqIDM7Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiaHJ0aW1lcjogaW50ZXJydXB0IHRvbyBzbG93LCAiCi0JICAgICAgICJmb3JjaW5nIGNsb2NrIG1pbiBkZWx0YSB0byAlbGx1IG5zXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBkZXYtPm1pbl9kZWx0YV9ucyk7Ci19CiAvKgogICogSGlnaCByZXNvbHV0aW9uIHRpbWVyIGludGVycnVwdAogICogQ2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZApAQCAtMTI0OSwyMSArMTI1MCwxNSBAQAogewogCXN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpjcHVfYmFzZSA9ICZfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpOwogCXN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKmJhc2U7Ci0Ja3RpbWVfdCBleHBpcmVzX25leHQsIG5vdzsKLQlpbnQgbnJfcmV0cmllcyA9IDA7Ci0JaW50IGk7CisJa3RpbWVfdCBleHBpcmVzX25leHQsIG5vdywgZW50cnlfdGltZSwgZGVsdGE7CisJaW50IGksIHJldHJpZXMgPSAwOwogCiAJQlVHX09OKCFjcHVfYmFzZS0+aHJlc19hY3RpdmUpOwogCWNwdV9iYXNlLT5ucl9ldmVudHMrKzsKIAlkZXYtPm5leHRfZXZlbnQudHY2NCA9IEtUSU1FX01BWDsKIAotIHJldHJ5OgotCS8qIDUgcmV0cmllcyBpcyBlbm91Z2ggdG8gbm90aWNlIGEgaGFuZyAqLwotCWlmICghKCsrbnJfcmV0cmllcyAlIDUpKQotCQlocnRpbWVyX2ludGVycnVwdF9oYW5naW5nKGRldiwga3RpbWVfc3ViKGt0aW1lX2dldCgpLCBub3cpKTsKLQotCW5vdyA9IGt0aW1lX2dldCgpOwotCisJZW50cnlfdGltZSA9IG5vdyA9IGt0aW1lX2dldCgpOworcmV0cnk6CiAJZXhwaXJlc19uZXh0LnR2NjQgPSBLVElNRV9NQVg7CiAKIAlzcGluX2xvY2soJmNwdV9iYXNlLT5sb2NrKTsKQEAgLTEzMjUsMTAgKzEzMjAsNDggQEAKIAlzcGluX3VubG9jaygmY3B1X2Jhc2UtPmxvY2spOwogCiAJLyogUmVwcm9ncmFtbWluZyBuZWNlc3NhcnkgPyAqLwotCWlmIChleHBpcmVzX25leHQudHY2NCAhPSBLVElNRV9NQVgpIHsKLQkJaWYgKHRpY2tfcHJvZ3JhbV9ldmVudChleHBpcmVzX25leHQsIGZvcmNlX2Nsb2NrX3JlcHJvZ3JhbSkpCi0JCQlnb3RvIHJldHJ5OworCWlmIChleHBpcmVzX25leHQudHY2NCA9PSBLVElNRV9NQVggfHwKKwkgICAgIXRpY2tfcHJvZ3JhbV9ldmVudChleHBpcmVzX25leHQsIDApKSB7CisJCWNwdV9iYXNlLT5oYW5nX2RldGVjdGVkID0gMDsKKwkJcmV0dXJuOwogCX0KKworCS8qCisJICogVGhlIG5leHQgdGltZXIgd2FzIGFscmVhZHkgZXhwaXJlZCBkdWUgdG86CisJICogLSB0cmFjaW5nCisJICogLSBsb25nIGxhc3RpbmcgY2FsbGJhY2tzCisJICogLSBiZWluZyBzY2hlZHVsZWQgYXdheSB3aGVuIHJ1bm5pbmcgaW4gYSBWTQorCSAqCisJICogV2UgbmVlZCB0byBwcmV2ZW50IHRoYXQgd2UgbG9vcCBmb3JldmVyIGluIHRoZSBocnRpbWVyCisJICogaW50ZXJydXB0IHJvdXRpbmUuIFdlIGdpdmUgaXQgMyBhdHRlbXB0cyB0byBhdm9pZAorCSAqIG92ZXJyZWFjdGluZyBvbiBzb21lIHNwdXJpb3VzIGV2ZW50LgorCSAqLworCW5vdyA9IGt0aW1lX2dldCgpOworCWNwdV9iYXNlLT5ucl9yZXRyaWVzKys7CisJaWYgKCsrcmV0cmllcyA8IDMpCisJCWdvdG8gcmV0cnk7CisJLyoKKwkgKiBHaXZlIHRoZSBzeXN0ZW0gYSBjaGFuY2UgdG8gZG8gc29tZXRoaW5nIGVsc2UgdGhhbiBsb29waW5nCisJICogaGVyZS4gV2Ugc3RvcmVkIHRoZSBlbnRyeSB0aW1lLCBzbyB3ZSBrbm93IGV4YWN0bHkgaG93IGxvbmcKKwkgKiB3ZSBzcGVudCBoZXJlLiBXZSBzY2hlZHVsZSB0aGUgbmV4dCBldmVudCB0aGlzIGFtb3VudCBvZgorCSAqIHRpbWUgYXdheS4KKwkgKi8KKwljcHVfYmFzZS0+bnJfaGFuZ3MrKzsKKwljcHVfYmFzZS0+aGFuZ19kZXRlY3RlZCA9IDE7CisJZGVsdGEgPSBrdGltZV9zdWIobm93LCBlbnRyeV90aW1lKTsKKwlpZiAoZGVsdGEudHY2NCA+IGNwdV9iYXNlLT5tYXhfaGFuZ190aW1lLnR2NjQpCisJCWNwdV9iYXNlLT5tYXhfaGFuZ190aW1lID0gZGVsdGE7CisJLyoKKwkgKiBMaW1pdCBpdCB0byBhIHNlbnNpYmxlIHZhbHVlIGFzIHdlIGVuZm9yY2UgYSBsb25nZXIKKwkgKiBkZWxheS4gR2l2ZSB0aGUgQ1BVIGF0IGxlYXN0IDEwMG1zIHRvIGNhdGNoIHVwLgorCSAqLworCWlmIChkZWx0YS50djY0ID4gMTAwICogTlNFQ19QRVJfTVNFQykKKwkJZXhwaXJlc19uZXh0ID0ga3RpbWVfYWRkX25zKG5vdywgMTAwICogTlNFQ19QRVJfTVNFQyk7CisJZWxzZQorCQlleHBpcmVzX25leHQgPSBrdGltZV9hZGQobm93LCBkZWx0YSk7CisJdGlja19wcm9ncmFtX2V2ZW50KGV4cGlyZXNfbmV4dCwgMSk7CisJcHJpbnRrX29uY2UoS0VSTl9XQVJOSU5HICJocnRpbWVyOiBpbnRlcnJ1cHQgdG9vayAlbGx1IG5zXG4iLAorCQkgICAga3RpbWVfdG9fbnMoZGVsdGEpKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2tlcm5lbC9od19icmVha3BvaW50LmMgYi9rZXJuZWwvaHdfYnJlYWtwb2ludC5jCmluZGV4IGNmNWVlMTYuLjM2NmVlZGYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9od19icmVha3BvaW50LmMKKysrIGIva2VybmVsL2h3X2JyZWFrcG9pbnQuYwpAQCAtNTIsNyArNTIsNyBAQAogc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGludCwgbnJfY3B1X2JwX3Bpbm5lZCk7CiAKIC8qIE51bWJlciBvZiBwaW5uZWQgdGFzayBicmVha3BvaW50cyBpbiBhIGNwdSAqLwotc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGludCwgdGFza19icF9waW5uZWRbSEJQX05VTV0pOworc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGludCwgbnJfdGFza19icF9waW5uZWRbSEJQX05VTV0pOwogCiAvKiBOdW1iZXIgb2Ygbm9uLXBpbm5lZCBjcHUvdGFzayBicmVha3BvaW50cyBpbiBhIGNwdSAqLwogc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGludCwgbnJfYnBfZmxleGlibGUpOwpAQCAtNzMsNyArNzMsNyBAQAogc3RhdGljIHVuc2lnbmVkIGludCBtYXhfdGFza19icF9waW5uZWQoaW50IGNwdSkKIHsKIAlpbnQgaTsKLQl1bnNpZ25lZCBpbnQgKnRza19waW5uZWQgPSBwZXJfY3B1KHRhc2tfYnBfcGlubmVkLCBjcHUpOworCXVuc2lnbmVkIGludCAqdHNrX3Bpbm5lZCA9IHBlcl9jcHUobnJfdGFza19icF9waW5uZWQsIGNwdSk7CiAKIAlmb3IgKGkgPSBIQlBfTlVNIC0xOyBpID49IDA7IGktLSkgewogCQlpZiAodHNrX3Bpbm5lZFtpXSA+IDApCkBAIC04Myw1MCArODMsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIFJlcG9ydCB0aGUgbnVtYmVyIG9mIHBpbm5lZC91bi1waW5uZWQgYnJlYWtwb2ludHMgd2UgaGF2ZSBpbgotICogYSBnaXZlbiBjcHUgKGNwdSA+IC0xKSBvciBpbiBhbGwgb2YgdGhlbSAoY3B1ID0gLTEpLgotICovCi1zdGF0aWMgdm9pZCBmZXRjaF9icF9idXN5X3Nsb3RzKHN0cnVjdCBicF9idXN5X3Nsb3RzICpzbG90cywgaW50IGNwdSkKK3N0YXRpYyBpbnQgdGFza19icF9waW5uZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7Ci0JaWYgKGNwdSA+PSAwKSB7Ci0JCXNsb3RzLT5waW5uZWQgPSBwZXJfY3B1KG5yX2NwdV9icF9waW5uZWQsIGNwdSk7Ci0JCXNsb3RzLT5waW5uZWQgKz0gbWF4X3Rhc2tfYnBfcGlubmVkKGNwdSk7Ci0JCXNsb3RzLT5mbGV4aWJsZSA9IHBlcl9jcHUobnJfYnBfZmxleGlibGUsIGNwdSk7Ci0KLQkJcmV0dXJuOwotCX0KLQotCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7Ci0JCXVuc2lnbmVkIGludCBucjsKLQotCQluciA9IHBlcl9jcHUobnJfY3B1X2JwX3Bpbm5lZCwgY3B1KTsKLQkJbnIgKz0gbWF4X3Rhc2tfYnBfcGlubmVkKGNwdSk7Ci0KLQkJaWYgKG5yID4gc2xvdHMtPnBpbm5lZCkKLQkJCXNsb3RzLT5waW5uZWQgPSBucjsKLQotCQluciA9IHBlcl9jcHUobnJfYnBfZmxleGlibGUsIGNwdSk7Ci0KLQkJaWYgKG5yID4gc2xvdHMtPmZsZXhpYmxlKQotCQkJc2xvdHMtPmZsZXhpYmxlID0gbnI7Ci0JfQotfQotCi0vKgotICogQWRkIGEgcGlubmVkIGJyZWFrcG9pbnQgZm9yIHRoZSBnaXZlbiB0YXNrIGluIG91ciBjb25zdHJhaW50IHRhYmxlCi0gKi8KLXN0YXRpYyB2b2lkIHRvZ2dsZV9icF90YXNrX3Nsb3Qoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBjcHUsIGJvb2wgZW5hYmxlKQotewotCWludCBjb3VudCA9IDA7Ci0Jc3RydWN0IHBlcmZfZXZlbnQgKmJwOwogCXN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQgKmN0eCA9IHRzay0+cGVyZl9ldmVudF9jdHhwOwotCXVuc2lnbmVkIGludCAqdHNrX3Bpbm5lZDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBwZXJmX2V2ZW50ICpicDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjb3VudCA9IDA7CiAKIAlpZiAoV0FSTl9PTkNFKCFjdHgsICJObyBwZXJmIGNvbnRleHQgZm9yIHRoaXMgdGFzayIpKQotCQlyZXR1cm47CisJCXJldHVybiAwOwogCiAJbGlzdCA9ICZjdHgtPmV2ZW50X2xpc3Q7CiAKQEAgLTE0MywxMCArMTA5LDYwIEBACiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdHgtPmxvY2ssIGZsYWdzKTsKIAotCWlmIChXQVJOX09OQ0UoY291bnQgPCAwLCAiTm8gYnJlYWtwb2ludCBjb3VudGVyIGZvdW5kIGluIHRoZSBjb3VudGVyIGxpc3QiKSkKLQkJcmV0dXJuOworCXJldHVybiBjb3VudDsKK30KIAotCXRza19waW5uZWQgPSBwZXJfY3B1KHRhc2tfYnBfcGlubmVkLCBjcHUpOworLyoKKyAqIFJlcG9ydCB0aGUgbnVtYmVyIG9mIHBpbm5lZC91bi1waW5uZWQgYnJlYWtwb2ludHMgd2UgaGF2ZSBpbgorICogYSBnaXZlbiBjcHUgKGNwdSA+IC0xKSBvciBpbiBhbGwgb2YgdGhlbSAoY3B1ID0gLTEpLgorICovCitzdGF0aWMgdm9pZAorZmV0Y2hfYnBfYnVzeV9zbG90cyhzdHJ1Y3QgYnBfYnVzeV9zbG90cyAqc2xvdHMsIHN0cnVjdCBwZXJmX2V2ZW50ICpicCkKK3sKKwlpbnQgY3B1ID0gYnAtPmNwdTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGJwLT5jdHgtPnRhc2s7CisKKwlpZiAoY3B1ID49IDApIHsKKwkJc2xvdHMtPnBpbm5lZCA9IHBlcl9jcHUobnJfY3B1X2JwX3Bpbm5lZCwgY3B1KTsKKwkJaWYgKCF0c2spCisJCQlzbG90cy0+cGlubmVkICs9IG1heF90YXNrX2JwX3Bpbm5lZChjcHUpOworCQllbHNlCisJCQlzbG90cy0+cGlubmVkICs9IHRhc2tfYnBfcGlubmVkKHRzayk7CisJCXNsb3RzLT5mbGV4aWJsZSA9IHBlcl9jcHUobnJfYnBfZmxleGlibGUsIGNwdSk7CisKKwkJcmV0dXJuOworCX0KKworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCXVuc2lnbmVkIGludCBucjsKKworCQluciA9IHBlcl9jcHUobnJfY3B1X2JwX3Bpbm5lZCwgY3B1KTsKKwkJaWYgKCF0c2spCisJCQluciArPSBtYXhfdGFza19icF9waW5uZWQoY3B1KTsKKwkJZWxzZQorCQkJbnIgKz0gdGFza19icF9waW5uZWQodHNrKTsKKworCQlpZiAobnIgPiBzbG90cy0+cGlubmVkKQorCQkJc2xvdHMtPnBpbm5lZCA9IG5yOworCisJCW5yID0gcGVyX2NwdShucl9icF9mbGV4aWJsZSwgY3B1KTsKKworCQlpZiAobnIgPiBzbG90cy0+ZmxleGlibGUpCisJCQlzbG90cy0+ZmxleGlibGUgPSBucjsKKwl9Cit9CisKKy8qCisgKiBBZGQgYSBwaW5uZWQgYnJlYWtwb2ludCBmb3IgdGhlIGdpdmVuIHRhc2sgaW4gb3VyIGNvbnN0cmFpbnQgdGFibGUKKyAqLworc3RhdGljIHZvaWQgdG9nZ2xlX2JwX3Rhc2tfc2xvdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGNwdSwgYm9vbCBlbmFibGUpCit7CisJdW5zaWduZWQgaW50ICp0c2tfcGlubmVkOworCWludCBjb3VudCA9IDA7CisKKwljb3VudCA9IHRhc2tfYnBfcGlubmVkKHRzayk7CisKKwl0c2tfcGlubmVkID0gcGVyX2NwdShucl90YXNrX2JwX3Bpbm5lZCwgY3B1KTsKIAlpZiAoZW5hYmxlKSB7CiAJCXRza19waW5uZWRbY291bnRdKys7CiAJCWlmIChjb3VudCA+IDApCkBAIC0xOTMsNyArMjA5LDcgQEAKICAqICAgLSBJZiBhdHRhY2hlZCB0byBhIHNpbmdsZSBjcHUsIGNoZWNrOgogICoKICAqICAgICAgIChwZXJfY3B1KG5yX2JwX2ZsZXhpYmxlLCBjcHUpIHx8IChwZXJfY3B1KG5yX2NwdV9icF9waW5uZWQsIGNwdSkKLSAqICAgICAgICAgICArIG1heChwZXJfY3B1KHRhc2tfYnBfcGlubmVkLCBjcHUpKSkpIDwgSEJQX05VTQorICogICAgICAgICAgICsgbWF4KHBlcl9jcHUobnJfdGFza19icF9waW5uZWQsIGNwdSkpKSkgPCBIQlBfTlVNCiAgKgogICogICAgICAgLT4gSWYgdGhlcmUgYXJlIGFscmVhZHkgbm9uLXBpbm5lZCBjb3VudGVycyBpbiB0aGlzIGNwdSwgaXQgbWVhbnMKICAqICAgICAgICAgIHRoZXJlIGlzIGFscmVhZHkgYSBmcmVlIHNsb3QgZm9yIHRoZW0uCkBAIC0yMDQsNyArMjIwLDcgQEAKICAqICAgLSBJZiBhdHRhY2hlZCB0byBldmVyeSBjcHVzLCBjaGVjazoKICAqCiAgKiAgICAgICAocGVyX2NwdShucl9icF9mbGV4aWJsZSwgKikgfHwgKG1heChwZXJfY3B1KG5yX2NwdV9icF9waW5uZWQsICopKQotICogICAgICAgICAgICsgbWF4KHBlcl9jcHUodGFza19icF9waW5uZWQsICopKSkpIDwgSEJQX05VTQorICogICAgICAgICAgICsgbWF4KHBlcl9jcHUobnJfdGFza19icF9waW5uZWQsICopKSkpIDwgSEJQX05VTQogICoKICAqICAgICAgIC0+IFRoaXMgaXMgcm91Z2hseSB0aGUgc2FtZSwgZXhjZXB0IHdlIGNoZWNrIHRoZSBudW1iZXIgb2YgcGVyIGNwdQogICogICAgICAgICAgYnAgZm9yIGV2ZXJ5IGNwdSBhbmQgd2Uga2VlcCB0aGUgbWF4IG9uZS4gU2FtZSBmb3IgdGhlIHBlciB0YXNrcwpAQCAtMjE2LDcgKzIzMiw3IEBACiAgKiAgIC0gSWYgYXR0YWNoZWQgdG8gYSBzaW5nbGUgY3B1LCBjaGVjazoKICAqCiAgKiAgICAgICAoKHBlcl9jcHUobnJfYnBfZmxleGlibGUsIGNwdSkgPiAxKSArIHBlcl9jcHUobnJfY3B1X2JwX3Bpbm5lZCwgY3B1KQotICogICAgICAgICAgICArIG1heChwZXJfY3B1KHRhc2tfYnBfcGlubmVkLCBjcHUpKSkgPCBIQlBfTlVNCisgKiAgICAgICAgICAgICsgbWF4KHBlcl9jcHUobnJfdGFza19icF9waW5uZWQsIGNwdSkpKSA8IEhCUF9OVU0KICAqCiAgKiAgICAgICAtPiBTYW1lIGNoZWNrcyBhcyBiZWZvcmUuIEJ1dCBub3cgdGhlIG5yX2JwX2ZsZXhpYmxlLCBpZiBhbnksIG11c3Qga2VlcAogICogICAgICAgICAgb25lIHJlZ2lzdGVyIGF0IGxlYXN0IChvciB0aGV5IHdpbGwgbmV2ZXIgYmUgZmVkKS4KQEAgLTIyNCw3ICsyNDAsNyBAQAogICogICAtIElmIGF0dGFjaGVkIHRvIGV2ZXJ5IGNwdXMsIGNoZWNrOgogICoKICAqICAgICAgICgocGVyX2NwdShucl9icF9mbGV4aWJsZSwgKikgPiAxKSArIG1heChwZXJfY3B1KG5yX2NwdV9icF9waW5uZWQsICopKQotICogICAgICAgICAgICArIG1heChwZXJfY3B1KHRhc2tfYnBfcGlubmVkLCAqKSkpIDwgSEJQX05VTQorICogICAgICAgICAgICArIG1heChwZXJfY3B1KG5yX3Rhc2tfYnBfcGlubmVkLCAqKSkpIDwgSEJQX05VTQogICovCiBpbnQgcmVzZXJ2ZV9icF9zbG90KHN0cnVjdCBwZXJmX2V2ZW50ICpicCkKIHsKQEAgLTIzMyw3ICsyNDksNyBAQAogCiAJbXV0ZXhfbG9jaygmbnJfYnBfbXV0ZXgpOwogCi0JZmV0Y2hfYnBfYnVzeV9zbG90cygmc2xvdHMsIGJwLT5jcHUpOworCWZldGNoX2JwX2J1c3lfc2xvdHMoJnNsb3RzLCBicCk7CiAKIAkvKiBGbGV4aWJsZSBjb3VudGVycyBuZWVkIHRvIGtlZXAgYXQgbGVhc3Qgb25lIHNsb3QgKi8KIAlpZiAoc2xvdHMucGlubmVkICsgKCEhc2xvdHMuZmxleGlibGUpID09IEhCUF9OVU0pIHsKQEAgLTI1OSw3ICsyNzUsNyBAQAogfQogCiAKLWludCBfX3JlZ2lzdGVyX3BlcmZfaHdfYnJlYWtwb2ludChzdHJ1Y3QgcGVyZl9ldmVudCAqYnApCitpbnQgcmVnaXN0ZXJfcGVyZl9od19icmVha3BvaW50KHN0cnVjdCBwZXJmX2V2ZW50ICpicCkKIHsKIAlpbnQgcmV0OwogCkBAIC0yNzYsMTkgKzI5MiwxMiBAQAogCSAqIFRoaXMgaXMgYSBxdWljayBoYWNrIHRoYXQgd2lsbCBiZSByZW1vdmVkIHNvb24sIG9uY2Ugd2UgcmVtb3ZlCiAJICogdGhlIHRtcCBicmVha3BvaW50cyBmcm9tIHB0cmFjZQogCSAqLwotCWlmICghYnAtPmF0dHIuZGlzYWJsZWQgfHwgYnAtPmNhbGxiYWNrID09IHBlcmZfYnBfZXZlbnQpCisJaWYgKCFicC0+YXR0ci5kaXNhYmxlZCB8fCAhYnAtPm92ZXJmbG93X2hhbmRsZXIpCiAJCXJldCA9IGFyY2hfdmFsaWRhdGVfaHdia3B0X3NldHRpbmdzKGJwLCBicC0+Y3R4LT50YXNrKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLWludCByZWdpc3Rlcl9wZXJmX2h3X2JyZWFrcG9pbnQoc3RydWN0IHBlcmZfZXZlbnQgKmJwKQotewotCWJwLT5jYWxsYmFjayA9IHBlcmZfYnBfZXZlbnQ7Ci0KLQlyZXR1cm4gX19yZWdpc3Rlcl9wZXJmX2h3X2JyZWFrcG9pbnQoYnApOwotfQotCiAvKioKICAqIHJlZ2lzdGVyX3VzZXJfaHdfYnJlYWtwb2ludCAtIHJlZ2lzdGVyIGEgaGFyZHdhcmUgYnJlYWtwb2ludCBmb3IgdXNlciBzcGFjZQogICogQGF0dHI6IGJyZWFrcG9pbnQgYXR0cmlidXRlcwpAQCAtMjk3LDcgKzMwNiw3IEBACiAgKi8KIHN0cnVjdCBwZXJmX2V2ZW50ICoKIHJlZ2lzdGVyX3VzZXJfaHdfYnJlYWtwb2ludChzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyLAotCQkJICAgIHBlcmZfY2FsbGJhY2tfdCB0cmlnZ2VyZWQsCisJCQkgICAgcGVyZl9vdmVyZmxvd19oYW5kbGVyX3QgdHJpZ2dlcmVkLAogCQkJICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewogCXJldHVybiBwZXJmX2V2ZW50X2NyZWF0ZV9rZXJuZWxfY291bnRlcihhdHRyLCAtMSwgdHNrLT5waWQsIHRyaWdnZXJlZCk7CkBAIC0zMTEsMTkgKzMyMCw0MCBAQAogICogQHRyaWdnZXJlZDogY2FsbGJhY2sgdG8gdHJpZ2dlciB3aGVuIHdlIGhpdCB0aGUgYnJlYWtwb2ludAogICogQHRzazogcG9pbnRlciB0byAndGFza19zdHJ1Y3QnIG9mIHRoZSBwcm9jZXNzIHRvIHdoaWNoIHRoZSBhZGRyZXNzIGJlbG9uZ3MKICAqLwotc3RydWN0IHBlcmZfZXZlbnQgKgotbW9kaWZ5X3VzZXJfaHdfYnJlYWtwb2ludChzdHJ1Y3QgcGVyZl9ldmVudCAqYnAsIHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIsCi0JCQkgIHBlcmZfY2FsbGJhY2tfdCB0cmlnZ2VyZWQsCi0JCQkgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoraW50IG1vZGlmeV91c2VyX2h3X2JyZWFrcG9pbnQoc3RydWN0IHBlcmZfZXZlbnQgKmJwLCBzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyKQogewotCS8qCi0JICogRklYTUU6IGRvIGl0IHdpdGhvdXQgdW5yZWdpc3RlcmluZwotCSAqIC0gV2UgZG9uJ3Qgd2FudCB0byBsb3NlIG91ciBzbG90Ci0JICogLSBJZiB0aGUgbmV3IGJwIGlzIGluY29ycmVjdCwgZG9uJ3QgbG9zZSB0aGUgb2xkZXIgb25lCi0JICovCi0JdW5yZWdpc3Rlcl9od19icmVha3BvaW50KGJwKTsKKwl1NjQgb2xkX2FkZHIgPSBicC0+YXR0ci5icF9hZGRyOworCWludCBvbGRfdHlwZSA9IGJwLT5hdHRyLmJwX3R5cGU7CisJaW50IG9sZF9sZW4gPSBicC0+YXR0ci5icF9sZW47CisJaW50IGVyciA9IDA7CiAKLQlyZXR1cm4gcGVyZl9ldmVudF9jcmVhdGVfa2VybmVsX2NvdW50ZXIoYXR0ciwgLTEsIHRzay0+cGlkLCB0cmlnZ2VyZWQpOworCXBlcmZfZXZlbnRfZGlzYWJsZShicCk7CisKKwlicC0+YXR0ci5icF9hZGRyID0gYXR0ci0+YnBfYWRkcjsKKwlicC0+YXR0ci5icF90eXBlID0gYXR0ci0+YnBfdHlwZTsKKwlicC0+YXR0ci5icF9sZW4gPSBhdHRyLT5icF9sZW47CisKKwlpZiAoYXR0ci0+ZGlzYWJsZWQpCisJCWdvdG8gZW5kOworCisJZXJyID0gYXJjaF92YWxpZGF0ZV9od2JrcHRfc2V0dGluZ3MoYnAsIGJwLT5jdHgtPnRhc2spOworCWlmICghZXJyKQorCQlwZXJmX2V2ZW50X2VuYWJsZShicCk7CisKKwlpZiAoZXJyKSB7CisJCWJwLT5hdHRyLmJwX2FkZHIgPSBvbGRfYWRkcjsKKwkJYnAtPmF0dHIuYnBfdHlwZSA9IG9sZF90eXBlOworCQlicC0+YXR0ci5icF9sZW4gPSBvbGRfbGVuOworCQlpZiAoIWJwLT5hdHRyLmRpc2FibGVkKQorCQkJcGVyZl9ldmVudF9lbmFibGUoYnApOworCisJCXJldHVybiBlcnI7CisJfQorCitlbmQ6CisJYnAtPmF0dHIuZGlzYWJsZWQgPSBhdHRyLT5kaXNhYmxlZDsKKworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobW9kaWZ5X3VzZXJfaHdfYnJlYWtwb2ludCk7CiAKQEAgLTM0OCw3ICszNzgsNyBAQAogICovCiBzdHJ1Y3QgcGVyZl9ldmVudCAqKgogcmVnaXN0ZXJfd2lkZV9od19icmVha3BvaW50KHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIsCi0JCQkgICAgcGVyZl9jYWxsYmFja190IHRyaWdnZXJlZCkKKwkJCSAgICBwZXJmX292ZXJmbG93X2hhbmRsZXJfdCB0cmlnZ2VyZWQpCiB7CiAJc3RydWN0IHBlcmZfZXZlbnQgKipjcHVfZXZlbnRzLCAqKnBldmVudCwgKmJwOwogCWxvbmcgZXJyOwpkaWZmIC0tZ2l0IGEva2VybmVsL2tnZGIuYyBiL2tlcm5lbC9rZ2RiLmMKaW5kZXggN2Q3MDE0Ni4uMmViNTE3ZSAxMDA2NDQKLS0tIGEva2VybmVsL2tnZGIuYworKysgYi9rZXJuZWwva2dkYi5jCkBAIC0xMjksNiArMTI5LDcgQEAKIHN0cnVjdCB0YXNrX3N0cnVjdAkJKmtnZGJfY29udHRocmVhZDsKIAogaW50CQkJCWtnZGJfc2luZ2xlX3N0ZXA7CitwaWRfdAkJCQlrZ2RiX3NzdGVwX3BpZDsKIAogLyogT3VyIEkvTyBidWZmZXJzLiAqLwogc3RhdGljIGNoYXIJCQlyZW1jb21faW5fYnVmZmVyW0JVRk1BWF07CkBAIC01NDEsMTIgKzU0MiwxNyBAQAogCSAqLwogCWlmICh0aWQgPT0gMCB8fCB0aWQgPT0gLTEpCiAJCXRpZCA9IC1hdG9taWNfcmVhZCgma2dkYl9hY3RpdmUpIC0gMjsKLQlpZiAodGlkIDwgMCkgeworCWlmICh0aWQgPCAtMSAmJiB0aWQgPiAtTlJfQ1BVUyAtIDIpIHsKIAkJaWYgKGtnZGJfaW5mb1stdGlkIC0gMl0udGFzaykKIAkJCXJldHVybiBrZ2RiX2luZm9bLXRpZCAtIDJdLnRhc2s7CiAJCWVsc2UKIAkJCXJldHVybiBpZGxlX3Rhc2soLXRpZCAtIDIpOwogCX0KKwlpZiAodGlkIDw9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJLR0RCOiBJbnRlcm5hbCB0aHJlYWQgc2VsZWN0IGVycm9yXG4iKTsKKwkJZHVtcF9zdGFjaygpOworCQlyZXR1cm4gTlVMTDsKKwl9CiAKIAkvKgogCSAqIGZpbmRfdGFza19ieV9waWRfbnMoKSBkb2VzIG5vdCB0YWtlIHRoZSB0YXNrbGlzdCBsb2NrIGFueW1vcmUKQEAgLTYxOSw3ICs2MjUsOCBAQAogc3RhdGljIGludCBrZ2RiX2FjdGl2YXRlX3N3X2JyZWFrcG9pbnRzKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwotCWludCBlcnJvciA9IDA7CisJaW50IGVycm9yOworCWludCByZXQgPSAwOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IEtHREJfTUFYX0JSRUFLUE9JTlRTOyBpKyspIHsKQEAgLTYyOSwxMyArNjM2LDE2IEBACiAJCWFkZHIgPSBrZ2RiX2JyZWFrW2ldLmJwdF9hZGRyOwogCQllcnJvciA9IGtnZGJfYXJjaF9zZXRfYnJlYWtwb2ludChhZGRyLAogCQkJCWtnZGJfYnJlYWtbaV0uc2F2ZWRfaW5zdHIpOwotCQlpZiAoZXJyb3IpCi0JCQlyZXR1cm4gZXJyb3I7CisJCWlmIChlcnJvcikgeworCQkJcmV0ID0gZXJyb3I7CisJCQlwcmludGsoS0VSTl9JTkZPICJLR0RCOiBCUCBpbnN0YWxsIGZhaWxlZDogJWx4IiwgYWRkcik7CisJCQljb250aW51ZTsKKwkJfQogCiAJCWtnZGJfZmx1c2hfc3dicmVha19hZGRyKGFkZHIpOwogCQlrZ2RiX2JyZWFrW2ldLnN0YXRlID0gQlBfQUNUSVZFOwogCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGtnZGJfc2V0X3N3X2JyZWFrKHVuc2lnbmVkIGxvbmcgYWRkcikKQEAgLTY4Miw3ICs2OTIsOCBAQAogc3RhdGljIGludCBrZ2RiX2RlYWN0aXZhdGVfc3dfYnJlYWtwb2ludHModm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHI7Ci0JaW50IGVycm9yID0gMDsKKwlpbnQgZXJyb3I7CisJaW50IHJldCA9IDA7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgS0dEQl9NQVhfQlJFQUtQT0lOVFM7IGkrKykgewpAQCAtNjkxLDEzICs3MDIsMTUgQEAKIAkJYWRkciA9IGtnZGJfYnJlYWtbaV0uYnB0X2FkZHI7CiAJCWVycm9yID0ga2dkYl9hcmNoX3JlbW92ZV9icmVha3BvaW50KGFkZHIsCiAJCQkJCWtnZGJfYnJlYWtbaV0uc2F2ZWRfaW5zdHIpOwotCQlpZiAoZXJyb3IpCi0JCQlyZXR1cm4gZXJyb3I7CisJCWlmIChlcnJvcikgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiS0dEQjogQlAgcmVtb3ZlIGZhaWxlZDogJWx4XG4iLCBhZGRyKTsKKwkJCXJldCA9IGVycm9yOworCQl9CiAKIAkJa2dkYl9mbHVzaF9zd2JyZWFrX2FkZHIoYWRkcik7CiAJCWtnZGJfYnJlYWtbaV0uc3RhdGUgPSBCUF9TRVQ7CiAJfQotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQga2dkYl9yZW1vdmVfc3dfYnJlYWsodW5zaWduZWQgbG9uZyBhZGRyKQpAQCAtMTIwNCw4ICsxMjE3LDEwIEBACiAJCXJldHVybiAxOwogCiAJfSBlbHNlIHsKLQkJZXJyb3JfcGFja2V0KHJlbWNvbV9vdXRfYnVmZmVyLCAtRUlOVkFMKTsKLQkJcmV0dXJuIDA7CisJCWtnZGJfbXNnX3dyaXRlKCJLR0RCIG9ubHkga25vd3Mgc2lnbmFsIDkgKHBhc3MpIgorCQkJIiBhbmQgMTUgKHBhc3MgYW5kIGRpc2Nvbm5lY3QpXG4iCisJCQkiRXhlY3V0aW5nIGEgY29udGludWUgd2l0aG91dCBzaWduYWwgcGFzc2luZ1xuIiwgMCk7CisJCXJlbWNvbV9pbl9idWZmZXJbMF0gPSAnYyc7CiAJfQogCiAJLyogSW5kaWNhdGUgZmFsbCB0aHJvdWdoICovCkBAIC0xMzk1LDYgKzE0MTAsNyBAQAogCXN0cnVjdCBrZ2RiX3N0YXRlIGtnZGJfdmFyOwogCXN0cnVjdCBrZ2RiX3N0YXRlICprcyA9ICZrZ2RiX3ZhcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzc3RlcF90cmllcyA9IDEwMDsKIAlpbnQgZXJyb3IgPSAwOwogCWludCBpLCBjcHU7CiAKQEAgLTE0MjUsMTMgKzE0NDEsMTQgQEAKIAkJY3B1X3JlbGF4KCk7CiAKIAkvKgotCSAqIERvIG5vdCBzdGFydCB0aGUgZGVidWdnZXIgY29ubmVjdGlvbiBvbiB0aGlzIENQVSBpZiB0aGUgbGFzdAotCSAqIGluc3RhbmNlIG9mIHRoZSBleGNlcHRpb24gaGFuZGxlciB3YW50ZWQgdG8gY29tZSBpbnRvIHRoZQotCSAqIGRlYnVnZ2VyIG9uIGEgZGlmZmVyZW50IENQVSB2aWEgYSBzaW5nbGUgc3RlcAorCSAqIEZvciBzaW5nbGUgc3RlcHBpbmcsIHRyeSB0byBvbmx5IGVudGVyIG9uIHRoZSBwcm9jZXNzb3IKKwkgKiB0aGF0IHdhcyBzaW5nbGUgc3RlcHBpbmcuICBUbyBnYXVyZCBhZ2FpbnN0IGEgZGVhZGxvY2ssIHRoZQorCSAqIGtlcm5lbCB3aWxsIG9ubHkgdHJ5IGZvciB0aGUgdmFsdWUgb2Ygc3N0ZXBfdHJpZXMgYmVmb3JlCisJICogZ2l2aW5nIHVwIGFuZCBjb250aW51aW5nIG9uLgogCSAqLwogCWlmIChhdG9taWNfcmVhZCgma2dkYl9jcHVfZG9pbmdfc2luZ2xlX3N0ZXApICE9IC0xICYmCi0JICAgIGF0b21pY19yZWFkKCZrZ2RiX2NwdV9kb2luZ19zaW5nbGVfc3RlcCkgIT0gY3B1KSB7Ci0KKwkgICAgKGtnZGJfaW5mb1tjcHVdLnRhc2sgJiYKKwkgICAgIGtnZGJfaW5mb1tjcHVdLnRhc2stPnBpZCAhPSBrZ2RiX3NzdGVwX3BpZCkgJiYgLS1zc3RlcF90cmllcykgewogCQlhdG9taWNfc2V0KCZrZ2RiX2FjdGl2ZSwgLTEpOwogCQl0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKCk7CiAJCWNsb2Nrc291cmNlX3RvdWNoX3dhdGNoZG9nKCk7CkBAIC0xNTI0LDYgKzE1NDEsMTMgQEAKIAl9CiAKIGtnZGJfcmVzdG9yZToKKwlpZiAoYXRvbWljX3JlYWQoJmtnZGJfY3B1X2RvaW5nX3NpbmdsZV9zdGVwKSAhPSAtMSkgeworCQlpbnQgc3N0ZXBfY3B1ID0gYXRvbWljX3JlYWQoJmtnZGJfY3B1X2RvaW5nX3NpbmdsZV9zdGVwKTsKKwkJaWYgKGtnZGJfaW5mb1tzc3RlcF9jcHVdLnRhc2spCisJCQlrZ2RiX3NzdGVwX3BpZCA9IGtnZGJfaW5mb1tzc3RlcF9jcHVdLnRhc2stPnBpZDsKKwkJZWxzZQorCQkJa2dkYl9zc3RlcF9waWQgPSAwOworCX0KIAkvKiBGcmVlIGtnZGJfYWN0aXZlICovCiAJYXRvbWljX3NldCgma2dkYl9hY3RpdmUsIC0xKTsKIAl0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvbG9ja2RlcC5jIGIva2VybmVsL2xvY2tkZXAuYwppbmRleCBmNWRjZDM2Li40Mjk1NDBjIDEwMDY0NAotLS0gYS9rZXJuZWwvbG9ja2RlcC5jCisrKyBiL2tlcm5lbC9sb2NrZGVwLmMKQEAgLTE0MCw3ICsxNDAsOCBAQAogfQogCiAjaWZkZWYgQ09ORklHX0xPQ0tfU1RBVAotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBsb2NrX2NsYXNzX3N0YXRzW01BWF9MT0NLREVQX0tFWVNdLCBsb2NrX3N0YXRzKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbG9ja19jbGFzc19zdGF0c1tNQVhfTE9DS0RFUF9LRVlTXSwKKwkJICAgICAgY3B1X2xvY2tfc3RhdHMpOwogCiBzdGF0aWMgaW5saW5lIHU2NCBsb2Nrc3RhdF9jbG9jayh2b2lkKQogewpAQCAtMTY4LDcgKzE2OSw3IEBACiAJaWYgKHRpbWUgPiBsdC0+bWF4KQogCQlsdC0+bWF4ID0gdGltZTsKIAotCWlmICh0aW1lIDwgbHQtPm1pbiB8fCAhbHQtPm1pbikKKwlpZiAodGltZSA8IGx0LT5taW4gfHwgIWx0LT5ucikKIAkJbHQtPm1pbiA9IHRpbWU7CiAKIAlsdC0+dG90YWwgKz0gdGltZTsKQEAgLTE3Nyw4ICsxNzgsMTUgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGxvY2tfdGltZV9hZGQoc3RydWN0IGxvY2tfdGltZSAqc3JjLCBzdHJ1Y3QgbG9ja190aW1lICpkc3QpCiB7Ci0JZHN0LT5taW4gKz0gc3JjLT5taW47Ci0JZHN0LT5tYXggKz0gc3JjLT5tYXg7CisJaWYgKCFzcmMtPm5yKQorCQlyZXR1cm47CisKKwlpZiAoc3JjLT5tYXggPiBkc3QtPm1heCkKKwkJZHN0LT5tYXggPSBzcmMtPm1heDsKKworCWlmIChzcmMtPm1pbiA8IGRzdC0+bWluIHx8ICFkc3QtPm5yKQorCQlkc3QtPm1pbiA9IHNyYy0+bWluOworCiAJZHN0LT50b3RhbCArPSBzcmMtPnRvdGFsOwogCWRzdC0+bnIgKz0gc3JjLT5ucjsKIH0KQEAgLTE5MSw3ICsxOTksNyBAQAogCW1lbXNldCgmc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgbG9ja19jbGFzc19zdGF0cykpOwogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKIAkJc3RydWN0IGxvY2tfY2xhc3Nfc3RhdHMgKnBjcyA9Ci0JCQkmcGVyX2NwdShsb2NrX3N0YXRzLCBjcHUpW2NsYXNzIC0gbG9ja19jbGFzc2VzXTsKKwkJCSZwZXJfY3B1KGNwdV9sb2NrX3N0YXRzLCBjcHUpW2NsYXNzIC0gbG9ja19jbGFzc2VzXTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdGF0cy5jb250ZW50aW9uX3BvaW50KTsgaSsrKQogCQkJc3RhdHMuY29udGVudGlvbl9wb2ludFtpXSArPSBwY3MtPmNvbnRlbnRpb25fcG9pbnRbaV07CkBAIC0yMTgsNyArMjI2LDcgQEAKIAogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKIAkJc3RydWN0IGxvY2tfY2xhc3Nfc3RhdHMgKmNwdV9zdGF0cyA9Ci0JCQkmcGVyX2NwdShsb2NrX3N0YXRzLCBjcHUpW2NsYXNzIC0gbG9ja19jbGFzc2VzXTsKKwkJCSZwZXJfY3B1KGNwdV9sb2NrX3N0YXRzLCBjcHUpW2NsYXNzIC0gbG9ja19jbGFzc2VzXTsKIAogCQltZW1zZXQoY3B1X3N0YXRzLCAwLCBzaXplb2Yoc3RydWN0IGxvY2tfY2xhc3Nfc3RhdHMpKTsKIAl9CkBAIC0yMjgsMTIgKzIzNiwxMiBAQAogCiBzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfc3RhdHMgKmdldF9sb2NrX3N0YXRzKHN0cnVjdCBsb2NrX2NsYXNzICpjbGFzcykKIHsKLQlyZXR1cm4gJmdldF9jcHVfdmFyKGxvY2tfc3RhdHMpW2NsYXNzIC0gbG9ja19jbGFzc2VzXTsKKwlyZXR1cm4gJmdldF9jcHVfdmFyKGNwdV9sb2NrX3N0YXRzKVtjbGFzcyAtIGxvY2tfY2xhc3Nlc107CiB9CiAKIHN0YXRpYyB2b2lkIHB1dF9sb2NrX3N0YXRzKHN0cnVjdCBsb2NrX2NsYXNzX3N0YXRzICpzdGF0cykKIHsKLQlwdXRfY3B1X3Zhcihsb2NrX3N0YXRzKTsKKwlwdXRfY3B1X3ZhcihjcHVfbG9ja19zdGF0cyk7CiB9CiAKIHN0YXRpYyB2b2lkIGxvY2tfcmVsZWFzZV9ob2xkdGltZShzdHJ1Y3QgaGVsZF9sb2NrICpobG9jaykKQEAgLTM3OSw3ICszODcsOCBAQAogCSAqIGNvbXBsZXRlIHRyYWNlIHRoYXQgbWF4ZXMgb3V0IHRoZSBlbnRyaWVzIHByb3ZpZGVkIHdpbGwgYmUgcmVwb3J0ZWQKIAkgKiBhcyBpbmNvbXBsZXRlLCBmcmlnZ2luIHVzZWxlc3MgPC9yYW50PgogCSAqLwotCWlmICh0cmFjZS0+ZW50cmllc1t0cmFjZS0+bnJfZW50cmllcy0xXSA9PSBVTE9OR19NQVgpCisJaWYgKHRyYWNlLT5ucl9lbnRyaWVzICE9IDAgJiYKKwkgICAgdHJhY2UtPmVudHJpZXNbdHJhY2UtPm5yX2VudHJpZXMtMV0gPT0gVUxPTkdfTUFYKQogCQl0cmFjZS0+bnJfZW50cmllcy0tOwogCiAJdHJhY2UtPm1heF9lbnRyaWVzID0gdHJhY2UtPm5yX2VudHJpZXM7CmRpZmYgLS1naXQgYS9rZXJuZWwvbW9kdWxlLmMgYi9rZXJuZWwvbW9kdWxlLmMKaW5kZXggNTg0MmE3MS4uMTJhZmM1YSAxMDA2NDQKLS0tIGEva2VybmVsL21vZHVsZS5jCisrKyBiL2tlcm5lbC9tb2R1bGUuYwpAQCAtMzcwLDggKzM3MCw2IEBACiAKICNpZmRlZiBDT05GSUdfU01QCiAKLSNpZm5kZWYgQ09ORklHX0hBVkVfTEVHQUNZX1BFUl9DUFVfQVJFQQotCiBzdGF0aWMgdm9pZCAqcGVyY3B1X21vZGFsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBhbGlnbiwKIAkJCSAgICAgY29uc3QgY2hhciAqbmFtZSkKIHsKQEAgLTM5NSwxNTQgKzM5Myw2IEBACiAJZnJlZV9wZXJjcHUoZnJlZW1lKTsKIH0KIAotI2Vsc2UgLyogLi4uIENPTkZJR19IQVZFX0xFR0FDWV9QRVJfQ1BVX0FSRUEgKi8KLQotLyogTnVtYmVyIG9mIGJsb2NrcyB1c2VkIGFuZCBhbGxvY2F0ZWQuICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHBjcHVfbnVtX3VzZWQsIHBjcHVfbnVtX2FsbG9jYXRlZDsKLS8qIFNpemUgb2YgZWFjaCBibG9jay4gIC12ZSBtZWFucyB1c2VkLiAqLwotc3RhdGljIGludCAqcGNwdV9zaXplOwotCi1zdGF0aWMgaW50IHNwbGl0X2Jsb2NrKHVuc2lnbmVkIGludCBpLCB1bnNpZ25lZCBzaG9ydCBzaXplKQotewotCS8qIFJlYWxsb2NhdGlvbiByZXF1aXJlZD8gKi8KLQlpZiAocGNwdV9udW1fdXNlZCArIDEgPiBwY3B1X251bV9hbGxvY2F0ZWQpIHsKLQkJaW50ICpuZXc7Ci0KLQkJbmV3ID0ga3JlYWxsb2MocGNwdV9zaXplLCBzaXplb2YobmV3WzBdKSpwY3B1X251bV9hbGxvY2F0ZWQqMiwKLQkJCSAgICAgICBHRlBfS0VSTkVMKTsKLQkJaWYgKCFuZXcpCi0JCQlyZXR1cm4gMDsKLQotCQlwY3B1X251bV9hbGxvY2F0ZWQgKj0gMjsKLQkJcGNwdV9zaXplID0gbmV3OwotCX0KLQotCS8qIEluc2VydCBhIG5ldyBzdWJibG9jayAqLwotCW1lbW1vdmUoJnBjcHVfc2l6ZVtpKzFdLCAmcGNwdV9zaXplW2ldLAotCQlzaXplb2YocGNwdV9zaXplWzBdKSAqIChwY3B1X251bV91c2VkIC0gaSkpOwotCXBjcHVfbnVtX3VzZWQrKzsKLQotCXBjcHVfc2l6ZVtpKzFdIC09IHNpemU7Ci0JcGNwdV9zaXplW2ldID0gc2l6ZTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYmxvY2tfc2l6ZShpbnQgdmFsKQotewotCWlmICh2YWwgPCAwKQotCQlyZXR1cm4gLXZhbDsKLQlyZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgdm9pZCAqcGVyY3B1X21vZGFsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBhbGlnbiwKLQkJCSAgICAgY29uc3QgY2hhciAqbmFtZSkKLXsKLQl1bnNpZ25lZCBsb25nIGV4dHJhOwotCXVuc2lnbmVkIGludCBpOwotCXZvaWQgKnB0cjsKLQlpbnQgY3B1OwotCi0JaWYgKGFsaWduID4gUEFHRV9TSVpFKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBwZXItY3B1IGFsaWdubWVudCAlbGkgPiAlbGlcbiIsCi0JCSAgICAgICBuYW1lLCBhbGlnbiwgUEFHRV9TSVpFKTsKLQkJYWxpZ24gPSBQQUdFX1NJWkU7Ci0JfQotCi0JcHRyID0gX19wZXJfY3B1X3N0YXJ0OwotCWZvciAoaSA9IDA7IGkgPCBwY3B1X251bV91c2VkOyBwdHIgKz0gYmxvY2tfc2l6ZShwY3B1X3NpemVbaV0pLCBpKyspIHsKLQkJLyogRXh0cmEgZm9yIGFsaWdubWVudCByZXF1aXJlbWVudC4gKi8KLQkJZXh0cmEgPSBBTElHTigodW5zaWduZWQgbG9uZylwdHIsIGFsaWduKSAtICh1bnNpZ25lZCBsb25nKXB0cjsKLQkJQlVHX09OKGkgPT0gMCAmJiBleHRyYSAhPSAwKTsKLQotCQlpZiAocGNwdV9zaXplW2ldIDwgMCB8fCBwY3B1X3NpemVbaV0gPCBleHRyYSArIHNpemUpCi0JCQljb250aW51ZTsKLQotCQkvKiBUcmFuc2ZlciBleHRyYSB0byBwcmV2aW91cyBibG9jay4gKi8KLQkJaWYgKHBjcHVfc2l6ZVtpLTFdIDwgMCkKLQkJCXBjcHVfc2l6ZVtpLTFdIC09IGV4dHJhOwotCQllbHNlCi0JCQlwY3B1X3NpemVbaS0xXSArPSBleHRyYTsKLQkJcGNwdV9zaXplW2ldIC09IGV4dHJhOwotCQlwdHIgKz0gZXh0cmE7Ci0KLQkJLyogU3BsaXQgYmxvY2sgaWYgd2FycmFudGVkICovCi0JCWlmIChwY3B1X3NpemVbaV0gLSBzaXplID4gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQotCQkJaWYgKCFzcGxpdF9ibG9jayhpLCBzaXplKSkKLQkJCQlyZXR1cm4gTlVMTDsKLQotCQkvKiBhZGQgdGhlIHBlci1jcHUgc2Nhbm5pbmcgYXJlYXMgKi8KLQkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkKLQkJCWttZW1sZWFrX2FsbG9jKHB0ciArIHBlcl9jcHVfb2Zmc2V0KGNwdSksIHNpemUsIDAsCi0JCQkJICAgICAgIEdGUF9LRVJORUwpOwotCi0JCS8qIE1hcmsgYWxsb2NhdGVkICovCi0JCXBjcHVfc2l6ZVtpXSA9IC1wY3B1X3NpemVbaV07Ci0JCXJldHVybiBwdHI7Ci0JfQotCi0JcHJpbnRrKEtFUk5fV0FSTklORyAiQ291bGQgbm90IGFsbG9jYXRlICVsdSBieXRlcyBwZXJjcHUgZGF0YVxuIiwKLQkgICAgICAgc2l6ZSk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIHBlcmNwdV9tb2RmcmVlKHZvaWQgKmZyZWVtZSkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQl2b2lkICpwdHIgPSBfX3Blcl9jcHVfc3RhcnQgKyBibG9ja19zaXplKHBjcHVfc2l6ZVswXSk7Ci0JaW50IGNwdTsKLQotCS8qIEZpcnN0IGVudHJ5IGlzIGNvcmUga2VybmVsIHBlcmNwdSBkYXRhLiAqLwotCWZvciAoaSA9IDE7IGkgPCBwY3B1X251bV91c2VkOyBwdHIgKz0gYmxvY2tfc2l6ZShwY3B1X3NpemVbaV0pLCBpKyspIHsKLQkJaWYgKHB0ciA9PSBmcmVlbWUpIHsKLQkJCXBjcHVfc2l6ZVtpXSA9IC1wY3B1X3NpemVbaV07Ci0JCQlnb3RvIGZyZWU7Ci0JCX0KLQl9Ci0JQlVHKCk7Ci0KLSBmcmVlOgotCS8qIHJlbW92ZSB0aGUgcGVyLWNwdSBzY2FubmluZyBhcmVhcyAqLwotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpCi0JCWttZW1sZWFrX2ZyZWUoZnJlZW1lICsgcGVyX2NwdV9vZmZzZXQoY3B1KSk7Ci0KLQkvKiBNZXJnZSB3aXRoIHByZXZpb3VzPyAqLwotCWlmIChwY3B1X3NpemVbaS0xXSA+PSAwKSB7Ci0JCXBjcHVfc2l6ZVtpLTFdICs9IHBjcHVfc2l6ZVtpXTsKLQkJcGNwdV9udW1fdXNlZC0tOwotCQltZW1tb3ZlKCZwY3B1X3NpemVbaV0sICZwY3B1X3NpemVbaSsxXSwKLQkJCShwY3B1X251bV91c2VkIC0gaSkgKiBzaXplb2YocGNwdV9zaXplWzBdKSk7Ci0JCWktLTsKLQl9Ci0JLyogTWVyZ2Ugd2l0aCBuZXh0PyAqLwotCWlmIChpKzEgPCBwY3B1X251bV91c2VkICYmIHBjcHVfc2l6ZVtpKzFdID49IDApIHsKLQkJcGNwdV9zaXplW2ldICs9IHBjcHVfc2l6ZVtpKzFdOwotCQlwY3B1X251bV91c2VkLS07Ci0JCW1lbW1vdmUoJnBjcHVfc2l6ZVtpKzFdLCAmcGNwdV9zaXplW2krMl0sCi0JCQkocGNwdV9udW1fdXNlZCAtIChpKzEpKSAqIHNpemVvZihwY3B1X3NpemVbMF0pKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgcGVyY3B1X21vZGluaXQodm9pZCkKLXsKLQlwY3B1X251bV91c2VkID0gMjsKLQlwY3B1X251bV9hbGxvY2F0ZWQgPSAyOwotCXBjcHVfc2l6ZSA9IGttYWxsb2Moc2l6ZW9mKHBjcHVfc2l6ZVswXSkgKiBwY3B1X251bV9hbGxvY2F0ZWQsCi0JCQkgICAgR0ZQX0tFUk5FTCk7Ci0JLyogU3RhdGljIGluLWtlcm5lbCBwZXJjcHUgZGF0YSAodXNlZCkuICovCi0JcGNwdV9zaXplWzBdID0gLShfX3Blcl9jcHVfZW5kLV9fcGVyX2NwdV9zdGFydCk7Ci0JLyogRnJlZSByb29tLiAqLwotCXBjcHVfc2l6ZVsxXSA9IFBFUkNQVV9FTk9VR0hfUk9PTSArIHBjcHVfc2l6ZVswXTsKLQlpZiAocGNwdV9zaXplWzFdIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIk5vIHBlci1jcHUgcm9vbSBmb3IgbW9kdWxlcy5cbiIpOwotCQlwY3B1X251bV91c2VkID0gMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLV9faW5pdGNhbGwocGVyY3B1X21vZGluaXQpOwotCi0jZW5kaWYgLyogQ09ORklHX0hBVkVfTEVHQUNZX1BFUl9DUFVfQVJFQSAqLwotCiBzdGF0aWMgdW5zaWduZWQgaW50IGZpbmRfcGNwdXNlYyhFbGZfRWhkciAqaGRyLAogCQkJCSBFbGZfU2hkciAqc2VjaGRycywKIAkJCQkgY29uc3QgY2hhciAqc2Vjc3RyaW5ncykKZGlmZiAtLWdpdCBhL2tlcm5lbC9wZXJmX2V2ZW50LmMgYi9rZXJuZWwvcGVyZl9ldmVudC5jCmluZGV4IDQwYTk5NmUuLmU3M2U1M2MgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wZXJmX2V2ZW50LmMKKysrIGIva2VybmVsL3BlcmZfZXZlbnQuYwpAQCAtMzYsNyArMzYsNyBAQAogLyoKICAqIEVhY2ggQ1BVIGhhcyBhIGxpc3Qgb2YgcGVyIENQVSBldmVudHM6CiAgKi8KLURFRklORV9QRVJfQ1BVKHN0cnVjdCBwZXJmX2NwdV9jb250ZXh0LCBwZXJmX2NwdV9jb250ZXh0KTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCwgcGVyZl9jcHVfY29udGV4dCk7CiAKIGludCBwZXJmX21heF9ldmVudHMgX19yZWFkX21vc3RseSA9IDE7CiBzdGF0aWMgaW50IHBlcmZfcmVzZXJ2ZWRfcGVyY3B1IF9fcmVhZF9tb3N0bHk7CkBAIC01NjcsNyArNTY3LDcgQEAKICAqIGlzIHRoZSBjdXJyZW50IGNvbnRleHQgb24gdGhpcyBDUFUgYW5kIHByZWVtcHRpb24gaXMgZGlzYWJsZWQsCiAgKiBoZW5jZSB3ZSBjYW4ndCBnZXQgaW50byBwZXJmX2V2ZW50X3Rhc2tfc2NoZWRfb3V0IGZvciB0aGlzIGNvbnRleHQuCiAgKi8KLXN0YXRpYyB2b2lkIHBlcmZfZXZlbnRfZGlzYWJsZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit2b2lkIHBlcmZfZXZlbnRfZGlzYWJsZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CiAJc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqY3R4ID0gZXZlbnQtPmN0eDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBjdHgtPnRhc2s7CkBAIC05NzEsNyArOTcxLDcgQEAKICAqIHBlcmZfZXZlbnRfZm9yX2VhY2hfY2hpbGQgb3IgcGVyZl9ldmVudF9mb3JfZWFjaCBhcyBkZXNjcmliZWQKICAqIGZvciBwZXJmX2V2ZW50X2Rpc2FibGUuCiAgKi8KLXN0YXRpYyB2b2lkIHBlcmZfZXZlbnRfZW5hYmxlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3ZvaWQgcGVyZl9ldmVudF9lbmFibGUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewogCXN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQgKmN0eCA9IGV2ZW50LT5jdHg7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gY3R4LT50YXNrOwpAQCAtMTU3OSw3ICsxNTc5LDYgQEAKIF9fcGVyZl9ldmVudF9pbml0X2NvbnRleHQoc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqY3R4LAogCQkJICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKLQltZW1zZXQoY3R4LCAwLCBzaXplb2YoKmN0eCkpOwogCXNwaW5fbG9ja19pbml0KCZjdHgtPmxvY2spOwogCW11dGV4X2luaXQoJmN0eC0+bXV0ZXgpOwogCUlOSVRfTElTVF9IRUFEKCZjdHgtPmdyb3VwX2xpc3QpOwpAQCAtMTY1NCw3ICsxNjUzLDcgQEAKIAl9CiAKIAlpZiAoIWN0eCkgewotCQljdHggPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0KSwgR0ZQX0tFUk5FTCk7CisJCWN0eCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQpLCBHRlBfS0VSTkVMKTsKIAkJZXJyID0gLUVOT01FTTsKIAkJaWYgKCFjdHgpCiAJCQlnb3RvIGVycm91dDsKQEAgLTQwMTEsNiArNDAxMCw3IEBACiAJZXZlbnQtPnBtdS0+cmVhZChldmVudCk7CiAKIAlkYXRhLmFkZHIgPSAwOworCWRhdGEucmF3ID0gTlVMTDsKIAlkYXRhLnBlcmlvZCA9IGV2ZW50LT5ody5sYXN0X3BlcmlvZDsKIAlyZWdzID0gZ2V0X2lycV9yZWdzKCk7CiAJLyoKQEAgLTQwODAsOCArNDA4MCw3IEBACiAJdTY0IG5vdzsKIAogCW5vdyA9IGNwdV9jbG9jayhjcHUpOwotCXByZXYgPSBhdG9taWM2NF9yZWFkKCZldmVudC0+aHcucHJldl9jb3VudCk7Ci0JYXRvbWljNjRfc2V0KCZldmVudC0+aHcucHJldl9jb3VudCwgbm93KTsKKwlwcmV2ID0gYXRvbWljNjRfeGNoZygmZXZlbnQtPmh3LnByZXZfY291bnQsIG5vdyk7CiAJYXRvbWljNjRfYWRkKG5vdyAtIHByZXYsICZldmVudC0+Y291bnQpOwogfQogCkBAIC00Mjg2LDE1ICs0Mjg1LDggQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcG11ICpicF9wZXJmX2V2ZW50X2luaXQoc3RydWN0IHBlcmZfZXZlbnQgKmJwKQogewogCWludCBlcnI7Ci0JLyoKLQkgKiBUaGUgYnJlYWtwb2ludCBpcyBhbHJlYWR5IGZpbGxlZCBpZiB3ZSBoYXZlbid0IGNyZWF0ZWQgdGhlIGNvdW50ZXIKLQkgKiB0aHJvdWdoIHBlcmYgc3lzY2FsbAotCSAqIEZJWE1FOiBtYW5hZ2UgdG8gZ2V0IHRyaWdlcnJlZCB0byBOVUxMIGlmIGl0IGNvbWVzIGZyb20gc3lzY2FsbHMKLQkgKi8KLQlpZiAoIWJwLT5jYWxsYmFjaykKLQkJZXJyID0gcmVnaXN0ZXJfcGVyZl9od19icmVha3BvaW50KGJwKTsKLQllbHNlCi0JCWVyciA9IF9fcmVnaXN0ZXJfcGVyZl9od19icmVha3BvaW50KGJwKTsKKworCWVyciA9IHJlZ2lzdGVyX3BlcmZfaHdfYnJlYWtwb2ludChicCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIApAQCAtNDMwOCw2ICs0MzAwLDcgQEAKIAlzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSBzYW1wbGU7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBkYXRhOwogCisJc2FtcGxlLnJhdyA9IE5VTEw7CiAJc2FtcGxlLmFkZHIgPSBicC0+YXR0ci5icF9hZGRyOwogCiAJaWYgKCFwZXJmX2V4Y2x1ZGVfZXZlbnQoYnAsIHJlZ3MpKQpAQCAtNDM5MCw3ICs0MzgzLDcgQEAKIAkJICAgc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqY3R4LAogCQkgICBzdHJ1Y3QgcGVyZl9ldmVudCAqZ3JvdXBfbGVhZGVyLAogCQkgICBzdHJ1Y3QgcGVyZl9ldmVudCAqcGFyZW50X2V2ZW50LAotCQkgICBwZXJmX2NhbGxiYWNrX3QgY2FsbGJhY2ssCisJCSAgIHBlcmZfb3ZlcmZsb3dfaGFuZGxlcl90IG92ZXJmbG93X2hhbmRsZXIsCiAJCSAgIGdmcF90IGdmcGZsYWdzKQogewogCWNvbnN0IHN0cnVjdCBwbXUgKnBtdTsKQEAgLTQ0MzMsMTAgKzQ0MjYsMTAgQEAKIAogCWV2ZW50LT5zdGF0ZQkJPSBQRVJGX0VWRU5UX1NUQVRFX0lOQUNUSVZFOwogCi0JaWYgKCFjYWxsYmFjayAmJiBwYXJlbnRfZXZlbnQpCi0JCWNhbGxiYWNrID0gcGFyZW50X2V2ZW50LT5jYWxsYmFjazsKKwlpZiAoIW92ZXJmbG93X2hhbmRsZXIgJiYgcGFyZW50X2V2ZW50KQorCQlvdmVyZmxvd19oYW5kbGVyID0gcGFyZW50X2V2ZW50LT5vdmVyZmxvd19oYW5kbGVyOwogCQotCWV2ZW50LT5jYWxsYmFjawk9IGNhbGxiYWNrOworCWV2ZW50LT5vdmVyZmxvd19oYW5kbGVyCT0gb3ZlcmZsb3dfaGFuZGxlcjsKIAogCWlmIChhdHRyLT5kaXNhYmxlZCkKIAkJZXZlbnQtPnN0YXRlID0gUEVSRl9FVkVOVF9TVEFURV9PRkY7CkBAIC00Nzc2LDcgKzQ3NjksOCBAQAogICovCiBzdHJ1Y3QgcGVyZl9ldmVudCAqCiBwZXJmX2V2ZW50X2NyZWF0ZV9rZXJuZWxfY291bnRlcihzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyLCBpbnQgY3B1LAotCQkJCSBwaWRfdCBwaWQsIHBlcmZfY2FsbGJhY2tfdCBjYWxsYmFjaykKKwkJCQkgcGlkX3QgcGlkLAorCQkJCSBwZXJmX292ZXJmbG93X2hhbmRsZXJfdCBvdmVyZmxvd19oYW5kbGVyKQogewogCXN0cnVjdCBwZXJmX2V2ZW50ICpldmVudDsKIAlzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHg7CkBAIC00NzkzLDcgKzQ3ODcsNyBAQAogCX0KIAogCWV2ZW50ID0gcGVyZl9ldmVudF9hbGxvYyhhdHRyLCBjcHUsIGN0eCwgTlVMTCwKLQkJCQkgICAgIE5VTEwsIGNhbGxiYWNrLCBHRlBfS0VSTkVMKTsKKwkJCQkgTlVMTCwgb3ZlcmZsb3dfaGFuZGxlciwgR0ZQX0tFUk5FTCk7CiAJaWYgKElTX0VSUihldmVudCkpIHsKIAkJZXJyID0gUFRSX0VSUihldmVudCk7CiAJCWdvdG8gZXJyX3B1dF9jb250ZXh0OwpAQCAtNTA5MCw3ICs1MDg0LDcgQEAKICAqLwogaW50IHBlcmZfZXZlbnRfaW5pdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCiB7Ci0Jc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqY2hpbGRfY3R4LCAqcGFyZW50X2N0eDsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjaGlsZF9jdHggPSBOVUxMLCAqcGFyZW50X2N0eDsKIAlzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjbG9uZWRfY3R4OwogCXN0cnVjdCBwZXJmX2V2ZW50ICpldmVudDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnBhcmVudCA9IGN1cnJlbnQ7CkBAIC01MTA2LDIwICs1MTAwLDYgQEAKIAkJcmV0dXJuIDA7CiAKIAkvKgotCSAqIFRoaXMgaXMgZXhlY3V0ZWQgZnJvbSB0aGUgcGFyZW50IHRhc2sgY29udGV4dCwgc28gaW5oZXJpdAotCSAqIGV2ZW50cyB0aGF0IGhhdmUgYmVlbiBtYXJrZWQgZm9yIGNsb25pbmcuCi0JICogRmlyc3QgYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBjb250ZXh0IGZvciB0aGUgY2hpbGQuCi0JICovCi0KLQljaGlsZF9jdHggPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjaGlsZF9jdHgpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JX19wZXJmX2V2ZW50X2luaXRfY29udGV4dChjaGlsZF9jdHgsIGNoaWxkKTsKLQljaGlsZC0+cGVyZl9ldmVudF9jdHhwID0gY2hpbGRfY3R4OwotCWdldF90YXNrX3N0cnVjdChjaGlsZCk7Ci0KLQkvKgogCSAqIElmIHRoZSBwYXJlbnQncyBjb250ZXh0IGlzIGEgY2xvbmUsIHBpbiBpdCBzbyBpdCB3b24ndCBnZXQKIAkgKiBzd2FwcGVkIHVuZGVyIHVzLgogCSAqLwpAQCAtNTE0OSw2ICs1MTI5LDI2IEBACiAJCQljb250aW51ZTsKIAkJfQogCisJCWlmICghY2hpbGQtPnBlcmZfZXZlbnRfY3R4cCkgeworCQkJLyoKKwkJCSAqIFRoaXMgaXMgZXhlY3V0ZWQgZnJvbSB0aGUgcGFyZW50IHRhc2sgY29udGV4dCwgc28KKwkJCSAqIGluaGVyaXQgZXZlbnRzIHRoYXQgaGF2ZSBiZWVuIG1hcmtlZCBmb3IgY2xvbmluZy4KKwkJCSAqIEZpcnN0IGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgY29udGV4dCBmb3IgdGhlCisJCQkgKiBjaGlsZC4KKwkJCSAqLworCisJCQljaGlsZF9jdHggPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0KSwKKwkJCQkJICAgIEdGUF9LRVJORUwpOworCQkJaWYgKCFjaGlsZF9jdHgpIHsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKworCQkJX19wZXJmX2V2ZW50X2luaXRfY29udGV4dChjaGlsZF9jdHgsIGNoaWxkKTsKKwkJCWNoaWxkLT5wZXJmX2V2ZW50X2N0eHAgPSBjaGlsZF9jdHg7CisJCQlnZXRfdGFza19zdHJ1Y3QoY2hpbGQpOworCQl9CisKIAkJcmV0ID0gaW5oZXJpdF9ncm91cChldmVudCwgcGFyZW50LCBwYXJlbnRfY3R4LAogCQkJCQkgICAgIGNoaWxkLCBjaGlsZF9jdHgpOwogCQlpZiAocmV0KSB7CkBAIC01MTc3LDYgKzUxNzcsNyBAQAogCQlnZXRfY3R4KGNoaWxkX2N0eC0+cGFyZW50X2N0eCk7CiAJfQogCitleGl0OgogCW11dGV4X3VubG9jaygmcGFyZW50X2N0eC0+bXV0ZXgpOwogCiAJcGVyZl91bnBpbl9jb250ZXh0KHBhcmVudF9jdHgpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXRvcnR1cmUuYyBiL2tlcm5lbC9yY3V0b3J0dXJlLmMKaW5kZXggYTYyMWE2Ny4uOWJiNTIxNyAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXRvcnR1cmUuYworKysgYi9rZXJuZWwvcmN1dG9ydHVyZS5jCkBAIC03NjMsMTMgKzc2MywxMyBAQAogCQkvKiBTaG91bGQgbm90IGhhcHBlbiwgYnV0Li4uICovCiAJCXBpcGVfY291bnQgPSBSQ1VfVE9SVFVSRV9QSVBFX0xFTjsKIAl9Ci0JKytfX2dldF9jcHVfdmFyKHJjdV90b3J0dXJlX2NvdW50KVtwaXBlX2NvdW50XTsKKwlfX3RoaXNfY3B1X2luYyhwZXJfY3B1X3ZhcihyY3VfdG9ydHVyZV9jb3VudClbcGlwZV9jb3VudF0pOwogCWNvbXBsZXRlZCA9IGN1cl9vcHMtPmNvbXBsZXRlZCgpIC0gY29tcGxldGVkOwogCWlmIChjb21wbGV0ZWQgPiBSQ1VfVE9SVFVSRV9QSVBFX0xFTikgewogCQkvKiBTaG91bGQgbm90IGhhcHBlbiwgYnV0Li4uICovCiAJCWNvbXBsZXRlZCA9IFJDVV9UT1JUVVJFX1BJUEVfTEVOOwogCX0KLQkrK19fZ2V0X2NwdV92YXIocmN1X3RvcnR1cmVfYmF0Y2gpW2NvbXBsZXRlZF07CisJX190aGlzX2NwdV9pbmMocGVyX2NwdV92YXIocmN1X3RvcnR1cmVfYmF0Y2gpW2NvbXBsZXRlZF0pOwogCXByZWVtcHRfZW5hYmxlKCk7CiAJY3VyX29wcy0+cmVhZHVubG9jayhpZHgpOwogfQpAQCAtODE4LDEzICs4MTgsMTMgQEAKIAkJCS8qIFNob3VsZCBub3QgaGFwcGVuLCBidXQuLi4gKi8KIAkJCXBpcGVfY291bnQgPSBSQ1VfVE9SVFVSRV9QSVBFX0xFTjsKIAkJfQotCQkrK19fZ2V0X2NwdV92YXIocmN1X3RvcnR1cmVfY291bnQpW3BpcGVfY291bnRdOworCQlfX3RoaXNfY3B1X2luYyhwZXJfY3B1X3ZhcihyY3VfdG9ydHVyZV9jb3VudClbcGlwZV9jb3VudF0pOwogCQljb21wbGV0ZWQgPSBjdXJfb3BzLT5jb21wbGV0ZWQoKSAtIGNvbXBsZXRlZDsKIAkJaWYgKGNvbXBsZXRlZCA+IFJDVV9UT1JUVVJFX1BJUEVfTEVOKSB7CiAJCQkvKiBTaG91bGQgbm90IGhhcHBlbiwgYnV0Li4uICovCiAJCQljb21wbGV0ZWQgPSBSQ1VfVE9SVFVSRV9QSVBFX0xFTjsKIAkJfQotCQkrK19fZ2V0X2NwdV92YXIocmN1X3RvcnR1cmVfYmF0Y2gpW2NvbXBsZXRlZF07CisJCV9fdGhpc19jcHVfaW5jKHBlcl9jcHVfdmFyKHJjdV90b3J0dXJlX2JhdGNoKVtjb21wbGV0ZWRdKTsKIAkJcHJlZW1wdF9lbmFibGUoKTsKIAkJY3VyX29wcy0+cmVhZHVubG9jayhpZHgpOwogCQlzY2hlZHVsZSgpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3Jlc291cmNlLmMgYi9rZXJuZWwvcmVzb3VyY2UuYwppbmRleCBmYjExYTU4Li5kYzE1Njg2IDEwMDY0NAotLS0gYS9rZXJuZWwvcmVzb3VyY2UuYworKysgYi9rZXJuZWwvcmVzb3VyY2UuYwpAQCAtMzA4LDM1ICszMDgsMzcgQEAKIAkJCSB2b2lkICphbGlnbmZfZGF0YSkKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnRoaXMgPSByb290LT5jaGlsZDsKKwlyZXNvdXJjZV9zaXplX3Qgc3RhcnQsIGVuZDsKIAotCW5ldy0+c3RhcnQgPSByb290LT5zdGFydDsKKwlzdGFydCA9IHJvb3QtPnN0YXJ0OwogCS8qCiAJICogU2tpcCBwYXN0IGFuIGFsbG9jYXRlZCByZXNvdXJjZSB0aGF0IHN0YXJ0cyBhdCAwLCBzaW5jZSB0aGUgYXNzaWdubWVudAogCSAqIG9mIHRoaXMtPnN0YXJ0IC0gMSB0byBuZXctPmVuZCBiZWxvdyB3b3VsZCBjYXVzZSBhbiB1bmRlcmZsb3cuCiAJICovCiAJaWYgKHRoaXMgJiYgdGhpcy0+c3RhcnQgPT0gMCkgewotCQluZXctPnN0YXJ0ID0gdGhpcy0+ZW5kICsgMTsKKwkJc3RhcnQgPSB0aGlzLT5lbmQgKyAxOwogCQl0aGlzID0gdGhpcy0+c2libGluZzsKIAl9CiAJZm9yKDs7KSB7CiAJCWlmICh0aGlzKQotCQkJbmV3LT5lbmQgPSB0aGlzLT5zdGFydCAtIDE7CisJCQllbmQgPSB0aGlzLT5zdGFydCAtIDE7CiAJCWVsc2UKLQkJCW5ldy0+ZW5kID0gcm9vdC0+ZW5kOwotCQlpZiAobmV3LT5zdGFydCA8IG1pbikKLQkJCW5ldy0+c3RhcnQgPSBtaW47Ci0JCWlmIChuZXctPmVuZCA+IG1heCkKLQkJCW5ldy0+ZW5kID0gbWF4OwotCQluZXctPnN0YXJ0ID0gQUxJR04obmV3LT5zdGFydCwgYWxpZ24pOworCQkJZW5kID0gcm9vdC0+ZW5kOworCQlpZiAoc3RhcnQgPCBtaW4pCisJCQlzdGFydCA9IG1pbjsKKwkJaWYgKGVuZCA+IG1heCkKKwkJCWVuZCA9IG1heDsKKwkJc3RhcnQgPSBBTElHTihzdGFydCwgYWxpZ24pOwogCQlpZiAoYWxpZ25mKQogCQkJYWxpZ25mKGFsaWduZl9kYXRhLCBuZXcsIHNpemUsIGFsaWduKTsKLQkJaWYgKG5ldy0+c3RhcnQgPCBuZXctPmVuZCAmJiBuZXctPmVuZCAtIG5ldy0+c3RhcnQgPj0gc2l6ZSAtIDEpIHsKLQkJCW5ldy0+ZW5kID0gbmV3LT5zdGFydCArIHNpemUgLSAxOworCQlpZiAoc3RhcnQgPCBlbmQgJiYgZW5kIC0gc3RhcnQgPj0gc2l6ZSAtIDEpIHsKKwkJCW5ldy0+c3RhcnQgPSBzdGFydDsKKwkJCW5ldy0+ZW5kID0gc3RhcnQgKyBzaXplIC0gMTsKIAkJCXJldHVybiAwOwogCQl9CiAJCWlmICghdGhpcykKIAkJCWJyZWFrOwotCQluZXctPnN0YXJ0ID0gdGhpcy0+ZW5kICsgMTsKKwkJc3RhcnQgPSB0aGlzLT5lbmQgKyAxOwogCQl0aGlzID0gdGhpcy0+c2libGluZzsKIAl9CiAJcmV0dXJuIC1FQlVTWTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC5jIGIva2VybmVsL3NjaGVkLmMKaW5kZXggZTdmMmNmYS4uZmQwNTg2MSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkLmMKKysrIGIva2VybmVsL3NjaGVkLmMKQEAgLTI5OCw3ICsyOTgsNyBAQAogCiAjaWZkZWYgQ09ORklHX1JUX0dST1VQX1NDSEVECiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHNjaGVkX3J0X2VudGl0eSwgaW5pdF9zY2hlZF9ydF9lbnRpdHkpOwotc3RhdGljIERFRklORV9QRVJfQ1BVX1NIQVJFRF9BTElHTkVEKHN0cnVjdCBydF9ycSwgaW5pdF9ydF9ycSk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFVfU0hBUkVEX0FMSUdORUQoc3RydWN0IHJ0X3JxLCBpbml0X3J0X3JxX3Zhcik7CiAjZW5kaWYgLyogQ09ORklHX1JUX0dST1VQX1NDSEVEICovCiAjZWxzZSAvKiAhQ09ORklHX1VTRVJfU0NIRUQgKi8KICNkZWZpbmUgcm9vdF90YXNrX2dyb3VwIGluaXRfdGFza19ncm91cApAQCAtODE0LDYgKzgxNCw3IEBACiAgKiBkZWZhdWx0OiAwLjI1bXMKICAqLwogdW5zaWduZWQgaW50IHN5c2N0bF9zY2hlZF9zaGFyZXNfcmF0ZWxpbWl0ID0gMjUwMDAwOwordW5zaWduZWQgaW50IG5vcm1hbGl6ZWRfc3lzY3RsX3NjaGVkX3NoYXJlc19yYXRlbGltaXQgPSAyNTAwMDA7CiAKIC8qCiAgKiBJbmplY3Qgc29tZSBmdXp6eW5lc3MgaW50byBjaGFuZ2luZyB0aGUgcGVyLWNwdSBncm91cCBzaGFyZXMKQEAgLTE2MTQsNyArMTYxNSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgdGdfc2hhcmVzX3VwKHN0cnVjdCB0YXNrX2dyb3VwICp0Zywgdm9pZCAqZGF0YSkKIHsKLQl1bnNpZ25lZCBsb25nIHdlaWdodCwgcnFfd2VpZ2h0ID0gMCwgc2hhcmVzID0gMDsKKwl1bnNpZ25lZCBsb25nIHdlaWdodCwgcnFfd2VpZ2h0ID0gMCwgc3VtX3dlaWdodCA9IDAsIHNoYXJlcyA9IDA7CiAJdW5zaWduZWQgbG9uZyAqdXNkX3JxX3dlaWdodDsKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCA9IGRhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTE2MzAsNiArMTYzMSw3IEBACiAJCXdlaWdodCA9IHRnLT5jZnNfcnFbaV0tPmxvYWQud2VpZ2h0OwogCQl1c2RfcnFfd2VpZ2h0W2ldID0gd2VpZ2h0OwogCisJCXJxX3dlaWdodCArPSB3ZWlnaHQ7CiAJCS8qCiAJCSAqIElmIHRoZXJlIGFyZSBjdXJyZW50bHkgbm8gdGFza3Mgb24gdGhlIGNwdSBwcmV0ZW5kIHRoZXJlCiAJCSAqIGlzIG9uZSBvZiBhdmVyYWdlIGxvYWQgc28gdGhhdCB3aGVuIGEgbmV3IHRhc2sgZ2V0cyB0bwpAQCAtMTYzOCwxMCArMTY0MCwxMyBAQAogCQlpZiAoIXdlaWdodCkKIAkJCXdlaWdodCA9IE5JQ0VfMF9MT0FEOwogCi0JCXJxX3dlaWdodCArPSB3ZWlnaHQ7CisJCXN1bV93ZWlnaHQgKz0gd2VpZ2h0OwogCQlzaGFyZXMgKz0gdGctPmNmc19ycVtpXS0+c2hhcmVzOwogCX0KIAorCWlmICghcnFfd2VpZ2h0KQorCQlycV93ZWlnaHQgPSBzdW1fd2VpZ2h0OworCiAJaWYgKCghc2hhcmVzICYmIHJxX3dlaWdodCkgfHwgc2hhcmVzID4gdGctPnNoYXJlcykKIAkJc2hhcmVzID0gdGctPnNoYXJlczsKIApAQCAtMTgxMCw2ICsxODE1LDIyIEBACiAjZW5kaWYKIAogc3RhdGljIHZvaWQgY2FsY19sb2FkX2FjY291bnRfYWN0aXZlKHN0cnVjdCBycSAqdGhpc19ycSk7CitzdGF0aWMgdm9pZCB1cGRhdGVfc3lzY3RsKHZvaWQpOworc3RhdGljIGludCBnZXRfdXBkYXRlX3N5c2N0bF9mYWN0b3Iodm9pZCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3NldF90YXNrX2NwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHVuc2lnbmVkIGludCBjcHUpCit7CisJc2V0X3Rhc2tfcnEocCwgY3B1KTsKKyNpZmRlZiBDT05GSUdfU01QCisJLyoKKwkgKiBBZnRlciAtPmNwdSBpcyBzZXQgdXAgdG8gYSBuZXcgdmFsdWUsIHRhc2tfcnFfbG9jayhwLCAuLi4pIGNhbiBiZQorCSAqIHN1Y2Nlc3NmdWx5IGV4ZWN1dGVkIG9uIGFub3RoZXIgQ1BVLiBXZSBtdXN0IGVuc3VyZSB0aGF0IHVwZGF0ZXMgb2YKKwkgKiBwZXItdGFzayBkYXRhIGhhdmUgYmVlbiBjb21wbGV0ZWQgYnkgdGhpcyBtb21lbnQuCisJICovCisJc21wX3dtYigpOworCXRhc2tfdGhyZWFkX2luZm8ocCktPmNwdSA9IGNwdTsKKyNlbmRpZgorfQogCiAjaW5jbHVkZSAic2NoZWRfc3RhdHMuaCIKICNpbmNsdWRlICJzY2hlZF9pZGxldGFzay5jIgpAQCAtMTk2NywyMCArMTk4OCw2IEBACiAJcmV0dXJuIGNwdV9jdXJyKHRhc2tfY3B1KHApKSA9PSBwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19zZXRfdGFza19jcHUoc3RydWN0IHRhc2tfc3RydWN0ICpwLCB1bnNpZ25lZCBpbnQgY3B1KQotewotCXNldF90YXNrX3JxKHAsIGNwdSk7Ci0jaWZkZWYgQ09ORklHX1NNUAotCS8qCi0JICogQWZ0ZXIgLT5jcHUgaXMgc2V0IHVwIHRvIGEgbmV3IHZhbHVlLCB0YXNrX3JxX2xvY2socCwgLi4uKSBjYW4gYmUKLQkgKiBzdWNjZXNzZnVseSBleGVjdXRlZCBvbiBhbm90aGVyIENQVS4gV2UgbXVzdCBlbnN1cmUgdGhhdCB1cGRhdGVzIG9mCi0JICogcGVyLXRhc2sgZGF0YSBoYXZlIGJlZW4gY29tcGxldGVkIGJ5IHRoaXMgbW9tZW50LgotCSAqLwotCXNtcF93bWIoKTsKLQl0YXNrX3RocmVhZF9pbmZvKHApLT5jcHUgPSBjcHU7Ci0jZW5kaWYKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX2NsYXNzX2NoYW5nZWQoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwLAogCQkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc2NoZWRfY2xhc3MgKnByZXZfY2xhc3MsCiAJCQkJICAgICAgIGludCBvbGRwcmlvLCBpbnQgcnVubmluZykKQEAgLTIwNjAsMjkgKzIwNjcsMTMgQEAKIHZvaWQgc2V0X3Rhc2tfY3B1KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgdW5zaWduZWQgaW50IG5ld19jcHUpCiB7CiAJaW50IG9sZF9jcHUgPSB0YXNrX2NwdShwKTsKLQlzdHJ1Y3QgcnEgKm9sZF9ycSA9IGNwdV9ycShvbGRfY3B1KSwgKm5ld19ycSA9IGNwdV9ycShuZXdfY3B1KTsKIAlzdHJ1Y3QgY2ZzX3JxICpvbGRfY2ZzcnEgPSB0YXNrX2Nmc19ycShwKSwKIAkJICAgICAgKm5ld19jZnNycSA9IGNwdV9jZnNfcnEob2xkX2Nmc3JxLCBuZXdfY3B1KTsKLQl1NjQgY2xvY2tfb2Zmc2V0OwotCi0JY2xvY2tfb2Zmc2V0ID0gb2xkX3JxLT5jbG9jayAtIG5ld19ycS0+Y2xvY2s7CiAKIAl0cmFjZV9zY2hlZF9taWdyYXRlX3Rhc2socCwgbmV3X2NwdSk7CiAKLSNpZmRlZiBDT05GSUdfU0NIRURTVEFUUwotCWlmIChwLT5zZS53YWl0X3N0YXJ0KQotCQlwLT5zZS53YWl0X3N0YXJ0IC09IGNsb2NrX29mZnNldDsKLQlpZiAocC0+c2Uuc2xlZXBfc3RhcnQpCi0JCXAtPnNlLnNsZWVwX3N0YXJ0IC09IGNsb2NrX29mZnNldDsKLQlpZiAocC0+c2UuYmxvY2tfc3RhcnQpCi0JCXAtPnNlLmJsb2NrX3N0YXJ0IC09IGNsb2NrX29mZnNldDsKLSNlbmRpZgogCWlmIChvbGRfY3B1ICE9IG5ld19jcHUpIHsKIAkJcC0+c2UubnJfbWlncmF0aW9ucysrOwotI2lmZGVmIENPTkZJR19TQ0hFRFNUQVRTCi0JCWlmICh0YXNrX2hvdChwLCBvbGRfcnEtPmNsb2NrLCBOVUxMKSkKLQkJCXNjaGVkc3RhdF9pbmMocCwgc2UubnJfZm9yY2VkMl9taWdyYXRpb25zKTsKLSNlbmRpZgogCQlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfQ1BVX01JR1JBVElPTlMsCiAJCQkJICAgICAxLCAxLCBOVUxMLCAwKTsKIAl9CkBAIC0yMzIzLDYgKzIzMTQsMTQgQEAKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQogCisjaWZkZWYgQ09ORklHX1NNUAorc3RhdGljIGlubGluZQoraW50IHNlbGVjdF90YXNrX3JxKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IHNkX2ZsYWdzLCBpbnQgd2FrZV9mbGFncykKK3sKKwlyZXR1cm4gcC0+c2NoZWRfY2xhc3MtPnNlbGVjdF90YXNrX3JxKHAsIHNkX2ZsYWdzLCB3YWtlX2ZsYWdzKTsKK30KKyNlbmRpZgorCiAvKioqCiAgKiB0cnlfdG9fd2FrZV91cCAtIHdha2UgdXAgYSB0aHJlYWQKICAqIEBwOiB0aGUgdG8tYmUtd29rZW4tdXAgdGhyZWFkCkBAIC0yMzc0LDE3ICsyMzczLDE0IEBACiAJaWYgKHRhc2tfY29udHJpYnV0ZXNfdG9fbG9hZChwKSkKIAkJcnEtPm5yX3VuaW50ZXJydXB0aWJsZS0tOwogCXAtPnN0YXRlID0gVEFTS19XQUtJTkc7Ci0JdGFza19ycV91bmxvY2socnEsICZmbGFncyk7CisJX190YXNrX3JxX3VubG9jayhycSk7CiAKLQljcHUgPSBwLT5zY2hlZF9jbGFzcy0+c2VsZWN0X3Rhc2tfcnEocCwgU0RfQkFMQU5DRV9XQUtFLCB3YWtlX2ZsYWdzKTsKLQlpZiAoY3B1ICE9IG9yaWdfY3B1KSB7Ci0JCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJcnEgPSBjcHVfcnEoY3B1KTsKLQkJdXBkYXRlX3JxX2Nsb2NrKHJxKTsKKwljcHUgPSBzZWxlY3RfdGFza19ycShwLCBTRF9CQUxBTkNFX1dBS0UsIHdha2VfZmxhZ3MpOworCWlmIChjcHUgIT0gb3JpZ19jcHUpCiAJCXNldF90YXNrX2NwdShwLCBjcHUpOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JfQotCXJxID0gdGFza19ycV9sb2NrKHAsICZmbGFncyk7CisKKwlycSA9IF9fdGFza19ycV9sb2NrKHApOworCXVwZGF0ZV9ycV9jbG9jayhycSk7CiAKIAlXQVJOX09OKHAtPnN0YXRlICE9IFRBU0tfV0FLSU5HKTsKIAljcHUgPSB0YXNrX2NwdShwKTsKQEAgLTI0OTksNyArMjQ5NSw2IEBACiAJcC0+c2UuYXZnX292ZXJsYXAJCT0gMDsKIAlwLT5zZS5zdGFydF9ydW50aW1lCQk9IDA7CiAJcC0+c2UuYXZnX3dha2V1cAkJPSBzeXNjdGxfc2NoZWRfd2FrZXVwX2dyYW51bGFyaXR5OwotCXAtPnNlLmF2Z19ydW5uaW5nCQk9IDA7CiAKICNpZmRlZiBDT05GSUdfU0NIRURTVEFUUwogCXAtPnNlLndhaXRfc3RhcnQJCQk9IDA7CkBAIC0yNTIxLDcgKzI1MTYsNiBAQAogCXAtPnNlLm5yX2ZhaWxlZF9taWdyYXRpb25zX3J1bm5pbmcJPSAwOwogCXAtPnNlLm5yX2ZhaWxlZF9taWdyYXRpb25zX2hvdAkJPSAwOwogCXAtPnNlLm5yX2ZvcmNlZF9taWdyYXRpb25zCQk9IDA7Ci0JcC0+c2UubnJfZm9yY2VkMl9taWdyYXRpb25zCQk9IDA7CiAKIAlwLT5zZS5ucl93YWtldXBzCQkJPSAwOwogCXAtPnNlLm5yX3dha2V1cHNfc3luYwkJCT0gMDsKQEAgLTI1NTgsNyArMjU1Miw2IEBACiB2b2lkIHNjaGVkX2Zvcmsoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgY2xvbmVfZmxhZ3MpCiB7CiAJaW50IGNwdSA9IGdldF9jcHUoKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJX19zY2hlZF9mb3JrKHApOwogCkBAIC0yNTkyLDEzICsyNTg1LDEzIEBACiAJaWYgKCFydF9wcmlvKHAtPnByaW8pKQogCQlwLT5zY2hlZF9jbGFzcyA9ICZmYWlyX3NjaGVkX2NsYXNzOwogCisJaWYgKHAtPnNjaGVkX2NsYXNzLT50YXNrX2ZvcmspCisJCXAtPnNjaGVkX2NsYXNzLT50YXNrX2ZvcmsocCk7CisKICNpZmRlZiBDT05GSUdfU01QCi0JY3B1ID0gcC0+c2NoZWRfY2xhc3MtPnNlbGVjdF90YXNrX3JxKHAsIFNEX0JBTEFOQ0VfRk9SSywgMCk7CisJY3B1ID0gc2VsZWN0X3Rhc2tfcnEocCwgU0RfQkFMQU5DRV9GT1JLLCAwKTsKICNlbmRpZgotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQl1cGRhdGVfcnFfY2xvY2soY3B1X3JxKGNwdSkpOwogCXNldF90YXNrX2NwdShwLCBjcHUpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAogI2lmIGRlZmluZWQoQ09ORklHX1NDSEVEU1RBVFMpIHx8IGRlZmluZWQoQ09ORklHX1RBU0tfREVMQVlfQUNDVCkKIAlpZiAobGlrZWx5KHNjaGVkX2luZm9fb24oKSkpCkBAIC0yNjMxLDE3ICsyNjI0LDcgQEAKIAlycSA9IHRhc2tfcnFfbG9jayhwLCAmZmxhZ3MpOwogCUJVR19PTihwLT5zdGF0ZSAhPSBUQVNLX1JVTk5JTkcpOwogCXVwZGF0ZV9ycV9jbG9jayhycSk7Ci0KLQlpZiAoIXAtPnNjaGVkX2NsYXNzLT50YXNrX25ldyB8fCAhY3VycmVudC0+c2Uub25fcnEpIHsKLQkJYWN0aXZhdGVfdGFzayhycSwgcCwgMCk7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogTGV0IHRoZSBzY2hlZHVsaW5nIGNsYXNzIGRvIG5ldyB0YXNrIHN0YXJ0dXAKLQkJICogbWFuYWdlbWVudCAoaWYgYW55KToKLQkJICovCi0JCXAtPnNjaGVkX2NsYXNzLT50YXNrX25ldyhycSwgcCk7Ci0JCWluY19ucl9ydW5uaW5nKHJxKTsKLQl9CisJYWN0aXZhdGVfdGFzayhycSwgcCwgMCk7CiAJdHJhY2Vfc2NoZWRfd2FrZXVwX25ldyhycSwgcCwgMSk7CiAJY2hlY2tfcHJlZW1wdF9jdXJyKHJxLCBwLCBXRl9GT1JLKTsKICNpZmRlZiBDT05GSUdfU01QCkBAIC0zMTU2LDcgKzMxMzksNyBAQAogdm9pZCBzY2hlZF9leGVjKHZvaWQpCiB7CiAJaW50IG5ld19jcHUsIHRoaXNfY3B1ID0gZ2V0X2NwdSgpOwotCW5ld19jcHUgPSBjdXJyZW50LT5zY2hlZF9jbGFzcy0+c2VsZWN0X3Rhc2tfcnEoY3VycmVudCwgU0RfQkFMQU5DRV9FWEVDLCAwKTsKKwluZXdfY3B1ID0gc2VsZWN0X3Rhc2tfcnEoY3VycmVudCwgU0RfQkFMQU5DRV9FWEVDLCAwKTsKIAlwdXRfY3B1KCk7CiAJaWYgKG5ld19jcHUgIT0gdGhpc19jcHUpCiAJCXNjaGVkX21pZ3JhdGVfdGFzayhjdXJyZW50LCBuZXdfY3B1KTsKQEAgLTMxNzIsMTAgKzMxNTUsNiBAQAogCWRlYWN0aXZhdGVfdGFzayhzcmNfcnEsIHAsIDApOwogCXNldF90YXNrX2NwdShwLCB0aGlzX2NwdSk7CiAJYWN0aXZhdGVfdGFzayh0aGlzX3JxLCBwLCAwKTsKLQkvKgotCSAqIE5vdGUgdGhhdCBpZGxlIHRocmVhZHMgaGF2ZSBhIHByaW8gb2YgTUFYX1BSSU8sIGZvciB0aGlzIHRlc3QKLQkgKiB0byBiZSBhbHdheXMgdHJ1ZSBmb3IgdGhlbS4KLQkgKi8KIAljaGVja19wcmVlbXB0X2N1cnIodGhpc19ycSwgcCwgMCk7CiB9CiAKQEAgLTQxMzQsNyArNDExMyw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgY3B1bWFzayAqY3B1cyA9IF9fZ2V0X2NwdV92YXIobG9hZF9iYWxhbmNlX3RtcG1hc2spOwogCi0JY3B1bWFza19jb3B5KGNwdXMsIGNwdV9vbmxpbmVfbWFzayk7CisJY3B1bWFza19jb3B5KGNwdXMsIGNwdV9hY3RpdmVfbWFzayk7CiAKIAkvKgogCSAqIFdoZW4gcG93ZXIgc2F2aW5ncyBwb2xpY3kgaXMgZW5hYmxlZCBmb3IgdGhlIHBhcmVudCBkb21haW4sIGlkbGUKQEAgLTQyOTcsNyArNDI3Niw3IEBACiAJaW50IGFsbF9waW5uZWQgPSAwOwogCXN0cnVjdCBjcHVtYXNrICpjcHVzID0gX19nZXRfY3B1X3Zhcihsb2FkX2JhbGFuY2VfdG1wbWFzayk7CiAKLQljcHVtYXNrX2NvcHkoY3B1cywgY3B1X29ubGluZV9tYXNrKTsKKwljcHVtYXNrX2NvcHkoY3B1cywgY3B1X2FjdGl2ZV9tYXNrKTsKIAogCS8qCiAJICogV2hlbiBwb3dlciBzYXZpbmdzIHBvbGljeSBpcyBlbmFibGVkIGZvciB0aGUgcGFyZW50IGRvbWFpbiwgaWRsZQpAQCAtNDY5NCw3ICs0NjczLDcgQEAKIAkJY3B1bWFza19zZXRfY3B1KGNwdSwgbm9oei5jcHVfbWFzayk7CiAKIAkJLyogdGltZSBmb3IgaWxiIG93bmVyIGFsc28gdG8gc2xlZXAgKi8KLQkJaWYgKGNwdW1hc2tfd2VpZ2h0KG5vaHouY3B1X21hc2spID09IG51bV9vbmxpbmVfY3B1cygpKSB7CisJCWlmIChjcHVtYXNrX3dlaWdodChub2h6LmNwdV9tYXNrKSA9PSBudW1fYWN0aXZlX2NwdXMoKSkgewogCQkJaWYgKGF0b21pY19yZWFkKCZub2h6LmxvYWRfYmFsYW5jZXIpID09IGNwdSkKIAkJCQlhdG9taWNfc2V0KCZub2h6LmxvYWRfYmFsYW5jZXIsIC0xKTsKIAkJCXJldHVybiAwOwpAQCAtNTM5NiwxMyArNTM3NSwxNCBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyB2b2lkIHB1dF9wcmV2X3Rhc2soc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwKQorc3RhdGljIHZvaWQgcHV0X3ByZXZfdGFzayhzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYpCiB7Ci0JdTY0IHJ1bnRpbWUgPSBwLT5zZS5zdW1fZXhlY19ydW50aW1lIC0gcC0+c2UucHJldl9zdW1fZXhlY19ydW50aW1lOworCWlmIChwcmV2LT5zdGF0ZSA9PSBUQVNLX1JVTk5JTkcpIHsKKwkJdTY0IHJ1bnRpbWUgPSBwcmV2LT5zZS5zdW1fZXhlY19ydW50aW1lOwogCi0JdXBkYXRlX2F2ZygmcC0+c2UuYXZnX3J1bm5pbmcsIHJ1bnRpbWUpOworCQlydW50aW1lIC09IHByZXYtPnNlLnByZXZfc3VtX2V4ZWNfcnVudGltZTsKKwkJcnVudGltZSA9IG1pbl90KHU2NCwgcnVudGltZSwgMipzeXNjdGxfc2NoZWRfbWlncmF0aW9uX2Nvc3QpOwogCi0JaWYgKHAtPnN0YXRlID09IFRBU0tfUlVOTklORykgewogCQkvKgogCQkgKiBJbiBvcmRlciB0byBhdm9pZCBhdmdfb3ZlcmxhcCBncm93aW5nIHN0YWxlIHdoZW4gd2UgYXJlCiAJCSAqIGluZGVlZCBvdmVybGFwcGluZyBhbmQgaGVuY2Ugbm90IGdldHRpbmcgcHV0IHRvIHNsZWVwLCBncm93CkBAIC01NDEyLDEyICs1MzkyLDkgQEAKIAkJICogY29ycmVsYXRlcyB0byB0aGUgYW1vdW50IG9mIGNhY2hlIGZvb3RwcmludCBhIHRhc2sgY2FuCiAJCSAqIGJ1aWxkIHVwLgogCQkgKi8KLQkJcnVudGltZSA9IG1pbl90KHU2NCwgcnVudGltZSwgMipzeXNjdGxfc2NoZWRfbWlncmF0aW9uX2Nvc3QpOwotCQl1cGRhdGVfYXZnKCZwLT5zZS5hdmdfb3ZlcmxhcCwgcnVudGltZSk7Ci0JfSBlbHNlIHsKLQkJdXBkYXRlX2F2ZygmcC0+c2UuYXZnX3J1bm5pbmcsIDApOworCQl1cGRhdGVfYXZnKCZwcmV2LT5zZS5hdmdfb3ZlcmxhcCwgcnVudGltZSk7CiAJfQotCXAtPnNjaGVkX2NsYXNzLT5wdXRfcHJldl90YXNrKHJxLCBwKTsKKwlwcmV2LT5zY2hlZF9jbGFzcy0+cHV0X3ByZXZfdGFzayhycSwgcHJldik7CiB9CiAKIC8qCkBAIC02NjMxLDYgKzY2MDgsOCBAQAogbG9uZyBzY2hlZF9nZXRhZmZpbml0eShwaWRfdCBwaWQsIHN0cnVjdCBjcHVtYXNrICptYXNrKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBycSAqcnE7CiAJaW50IHJldHZhbDsKIAogCWdldF9vbmxpbmVfY3B1cygpOwpAQCAtNjY0NSw3ICs2NjI0LDkgQEAKIAlpZiAocmV0dmFsKQogCQlnb3RvIG91dF91bmxvY2s7CiAKKwlycSA9IHRhc2tfcnFfbG9jayhwLCAmZmxhZ3MpOwogCWNwdW1hc2tfYW5kKG1hc2ssICZwLT5jcHVzX2FsbG93ZWQsIGNwdV9vbmxpbmVfbWFzayk7CisJdGFza19ycV91bmxvY2socnEsICZmbGFncyk7CiAKIG91dF91bmxvY2s6CiAJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwpAQCAtNjg4Myw2ICs2ODY0LDggQEAKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CiAJdW5zaWduZWQgaW50IHRpbWVfc2xpY2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcnEgKnJxOwogCWludCByZXR2YWw7CiAJc3RydWN0IHRpbWVzcGVjIHQ7CiAKQEAgLTY4OTksNyArNjg4Miw5IEBACiAJaWYgKHJldHZhbCkKIAkJZ290byBvdXRfdW5sb2NrOwogCi0JdGltZV9zbGljZSA9IHAtPnNjaGVkX2NsYXNzLT5nZXRfcnJfaW50ZXJ2YWwocCk7CisJcnEgPSB0YXNrX3JxX2xvY2socCwgJmZsYWdzKTsKKwl0aW1lX3NsaWNlID0gcC0+c2NoZWRfY2xhc3MtPmdldF9ycl9pbnRlcnZhbChycSwgcCk7CisJdGFza19ycV91bmxvY2socnEsICZmbGFncyk7CiAKIAlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CiAJamlmZmllc190b190aW1lc3BlYyh0aW1lX3NsaWNlLCAmdCk7CkBAIC03MDAwLDcgKzY5ODUsNiBAQAogCV9fc2NoZWRfZm9yayhpZGxlKTsKIAlpZGxlLT5zZS5leGVjX3N0YXJ0ID0gc2NoZWRfY2xvY2soKTsKIAotCWlkbGUtPnByaW8gPSBpZGxlLT5ub3JtYWxfcHJpbyA9IE1BWF9QUklPOwogCWNwdW1hc2tfY29weSgmaWRsZS0+Y3B1c19hbGxvd2VkLCBjcHVtYXNrX29mKGNwdSkpOwogCV9fc2V0X3Rhc2tfY3B1KGlkbGUsIGNwdSk7CiAKQEAgLTcwNDEsMjIgKzcwMjUsNDMgQEAKICAqCiAgKiBUaGlzIGlkZWEgY29tZXMgZnJvbSB0aGUgU0Qgc2NoZWR1bGVyIG9mIENvbiBLb2xpdmFzOgogICovCitzdGF0aWMgaW50IGdldF91cGRhdGVfc3lzY3RsX2ZhY3Rvcih2b2lkKQoreworCXVuc2lnbmVkIGludCBjcHVzID0gbWluX3QoaW50LCBudW1fb25saW5lX2NwdXMoKSwgOCk7CisJdW5zaWduZWQgaW50IGZhY3RvcjsKKworCXN3aXRjaCAoc3lzY3RsX3NjaGVkX3R1bmFibGVfc2NhbGluZykgeworCWNhc2UgU0NIRURfVFVOQUJMRVNDQUxJTkdfTk9ORToKKwkJZmFjdG9yID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTQ0hFRF9UVU5BQkxFU0NBTElOR19MSU5FQVI6CisJCWZhY3RvciA9IGNwdXM7CisJCWJyZWFrOworCWNhc2UgU0NIRURfVFVOQUJMRVNDQUxJTkdfTE9HOgorCWRlZmF1bHQ6CisJCWZhY3RvciA9IDEgKyBpbG9nMihjcHVzKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGZhY3RvcjsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX3N5c2N0bCh2b2lkKQoreworCXVuc2lnbmVkIGludCBmYWN0b3IgPSBnZXRfdXBkYXRlX3N5c2N0bF9mYWN0b3IoKTsKKworI2RlZmluZSBTRVRfU1lTQ1RMKG5hbWUpIFwKKwkoc3lzY3RsXyMjbmFtZSA9IChmYWN0b3IpICogbm9ybWFsaXplZF9zeXNjdGxfIyNuYW1lKQorCVNFVF9TWVNDVEwoc2NoZWRfbWluX2dyYW51bGFyaXR5KTsKKwlTRVRfU1lTQ1RMKHNjaGVkX2xhdGVuY3kpOworCVNFVF9TWVNDVEwoc2NoZWRfd2FrZXVwX2dyYW51bGFyaXR5KTsKKwlTRVRfU1lTQ1RMKHNjaGVkX3NoYXJlc19yYXRlbGltaXQpOworI3VuZGVmIFNFVF9TWVNDVEwKK30KKwogc3RhdGljIGlubGluZSB2b2lkIHNjaGVkX2luaXRfZ3JhbnVsYXJpdHkodm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgZmFjdG9yID0gMSArIGlsb2cyKG51bV9vbmxpbmVfY3B1cygpKTsKLQljb25zdCB1bnNpZ25lZCBsb25nIGxpbWl0ID0gMjAwMDAwMDAwOwotCi0Jc3lzY3RsX3NjaGVkX21pbl9ncmFudWxhcml0eSAqPSBmYWN0b3I7Ci0JaWYgKHN5c2N0bF9zY2hlZF9taW5fZ3JhbnVsYXJpdHkgPiBsaW1pdCkKLQkJc3lzY3RsX3NjaGVkX21pbl9ncmFudWxhcml0eSA9IGxpbWl0OwotCi0Jc3lzY3RsX3NjaGVkX2xhdGVuY3kgKj0gZmFjdG9yOwotCWlmIChzeXNjdGxfc2NoZWRfbGF0ZW5jeSA+IGxpbWl0KQotCQlzeXNjdGxfc2NoZWRfbGF0ZW5jeSA9IGxpbWl0OwotCi0Jc3lzY3RsX3NjaGVkX3dha2V1cF9ncmFudWxhcml0eSAqPSBmYWN0b3I7Ci0KLQlzeXNjdGxfc2NoZWRfc2hhcmVzX3JhdGVsaW1pdCAqPSBmYWN0b3I7CisJdXBkYXRlX3N5c2N0bCgpOwogfQogCiAjaWZkZWYgQ09ORklHX1NNUApAQCAtNzA5Myw3ICs3MDk4LDcgQEAKIAlpbnQgcmV0ID0gMDsKIAogCXJxID0gdGFza19ycV9sb2NrKHAsICZmbGFncyk7Ci0JaWYgKCFjcHVtYXNrX2ludGVyc2VjdHMobmV3X21hc2ssIGNwdV9vbmxpbmVfbWFzaykpIHsKKwlpZiAoIWNwdW1hc2tfaW50ZXJzZWN0cyhuZXdfbWFzaywgY3B1X2FjdGl2ZV9tYXNrKSkgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CkBAIC03MTE1LDcgKzcxMjAsNyBAQAogCWlmIChjcHVtYXNrX3Rlc3RfY3B1KHRhc2tfY3B1KHApLCBuZXdfbWFzaykpCiAJCWdvdG8gb3V0OwogCi0JaWYgKG1pZ3JhdGVfdGFzayhwLCBjcHVtYXNrX2FueV9hbmQoY3B1X29ubGluZV9tYXNrLCBuZXdfbWFzayksICZyZXEpKSB7CisJaWYgKG1pZ3JhdGVfdGFzayhwLCBjcHVtYXNrX2FueV9hbmQoY3B1X2FjdGl2ZV9tYXNrLCBuZXdfbWFzayksICZyZXEpKSB7CiAJCS8qIE5lZWQgaGVscCBmcm9tIG1pZ3JhdGlvbiB0aHJlYWQ6IGRyb3AgbG9jayBhbmQgd2FpdC4gKi8KIAkJc3RydWN0IHRhc2tfc3RydWN0ICptdCA9IHJxLT5taWdyYXRpb25fdGhyZWFkOwogCkBAIC03MjY5LDE5ICs3Mjc0LDE5IEBACiAKIGFnYWluOgogCS8qIExvb2sgZm9yIGFsbG93ZWQsIG9ubGluZSBDUFUgaW4gc2FtZSBub2RlLiAqLwotCWZvcl9lYWNoX2NwdV9hbmQoZGVzdF9jcHUsIG5vZGVtYXNrLCBjcHVfb25saW5lX21hc2spCisJZm9yX2VhY2hfY3B1X2FuZChkZXN0X2NwdSwgbm9kZW1hc2ssIGNwdV9hY3RpdmVfbWFzaykKIAkJaWYgKGNwdW1hc2tfdGVzdF9jcHUoZGVzdF9jcHUsICZwLT5jcHVzX2FsbG93ZWQpKQogCQkJZ290byBtb3ZlOwogCiAJLyogQW55IGFsbG93ZWQsIG9ubGluZSBDUFU/ICovCi0JZGVzdF9jcHUgPSBjcHVtYXNrX2FueV9hbmQoJnAtPmNwdXNfYWxsb3dlZCwgY3B1X29ubGluZV9tYXNrKTsKKwlkZXN0X2NwdSA9IGNwdW1hc2tfYW55X2FuZCgmcC0+Y3B1c19hbGxvd2VkLCBjcHVfYWN0aXZlX21hc2spOwogCWlmIChkZXN0X2NwdSA8IG5yX2NwdV9pZHMpCiAJCWdvdG8gbW92ZTsKIAogCS8qIE5vIG1vcmUgTXIuIE5pY2UgR3V5LiAqLwogCWlmIChkZXN0X2NwdSA+PSBucl9jcHVfaWRzKSB7CiAJCWNwdXNldF9jcHVzX2FsbG93ZWRfbG9ja2VkKHAsICZwLT5jcHVzX2FsbG93ZWQpOwotCQlkZXN0X2NwdSA9IGNwdW1hc2tfYW55X2FuZChjcHVfb25saW5lX21hc2ssICZwLT5jcHVzX2FsbG93ZWQpOworCQlkZXN0X2NwdSA9IGNwdW1hc2tfYW55X2FuZChjcHVfYWN0aXZlX21hc2ssICZwLT5jcHVzX2FsbG93ZWQpOwogCiAJCS8qCiAJCSAqIERvbid0IHRlbGwgdGhlbSBhYm91dCBtb3ZpbmcgZXhpdGluZyB0YXNrcyBvcgpAQCAtNzMxMCw3ICs3MzE1LDcgQEAKICAqLwogc3RhdGljIHZvaWQgbWlncmF0ZV9ucl91bmludGVycnVwdGlibGUoc3RydWN0IHJxICpycV9zcmMpCiB7Ci0Jc3RydWN0IHJxICpycV9kZXN0ID0gY3B1X3JxKGNwdW1hc2tfYW55KGNwdV9vbmxpbmVfbWFzaykpOworCXN0cnVjdCBycSAqcnFfZGVzdCA9IGNwdV9ycShjcHVtYXNrX2FueShjcHVfYWN0aXZlX21hc2spKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwpAQCAtNzU2Myw3ICs3NTY4LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqc2Rfc3lzY3RsX2hlYWRlcjsKIHN0YXRpYyB2b2lkIHJlZ2lzdGVyX3NjaGVkX2RvbWFpbl9zeXNjdGwodm9pZCkKIHsKLQlpbnQgaSwgY3B1X251bSA9IG51bV9vbmxpbmVfY3B1cygpOworCWludCBpLCBjcHVfbnVtID0gbnVtX3Bvc3NpYmxlX2NwdXMoKTsKIAlzdHJ1Y3QgY3RsX3RhYmxlICplbnRyeSA9IHNkX2FsbG9jX2N0bF9lbnRyeShjcHVfbnVtICsgMSk7CiAJY2hhciBidWZbMzJdOwogCkBAIC03NTczLDcgKzc1NzgsNyBAQAogCWlmIChlbnRyeSA9PSBOVUxMKQogCQlyZXR1cm47CiAKLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewogCQlzbnByaW50ZihidWYsIDMyLCAiY3B1JWQiLCBpKTsKIAkJZW50cnktPnByb2NuYW1lID0ga3N0cmR1cChidWYsIEdGUF9LRVJORUwpOwogCQllbnRyeS0+bW9kZSA9IDA1NTU7CkBAIC03NzAzLDcgKzc3MDgsNiBAQAogCQlzcGluX2xvY2tfaXJxKCZycS0+bG9jayk7CiAJCXVwZGF0ZV9ycV9jbG9jayhycSk7CiAJCWRlYWN0aXZhdGVfdGFzayhycSwgcnEtPmlkbGUsIDApOwotCQlycS0+aWRsZS0+c3RhdGljX3ByaW8gPSBNQVhfUFJJTzsKIAkJX19zZXRzY2hlZHVsZXIocnEsIHJxLT5pZGxlLCBTQ0hFRF9OT1JNQUwsIDApOwogCQlycS0+aWRsZS0+c2NoZWRfY2xhc3MgPSAmaWRsZV9zY2hlZF9jbGFzczsKIAkJbWlncmF0ZV9kZWFkX3Rhc2tzKGNwdSk7CkBAIC04MjgyLDE0ICs4Mjg2LDE0IEBACiAgKi8KICNpZmRlZiBDT05GSUdfU0NIRURfU01UCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHN0YXRpY19zY2hlZF9kb21haW4sIGNwdV9kb21haW5zKTsKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc3RhdGljX3NjaGVkX2dyb3VwLCBzY2hlZF9ncm91cF9jcHVzKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc3RhdGljX3NjaGVkX2dyb3VwLCBzY2hlZF9ncm91cHMpOwogCiBzdGF0aWMgaW50CiBjcHVfdG9fY3B1X2dyb3VwKGludCBjcHUsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVfbWFwLAogCQkgc3RydWN0IHNjaGVkX2dyb3VwICoqc2csIHN0cnVjdCBjcHVtYXNrICp1bnVzZWQpCiB7CiAJaWYgKHNnKQotCQkqc2cgPSAmcGVyX2NwdShzY2hlZF9ncm91cF9jcHVzLCBjcHUpLnNnOworCQkqc2cgPSAmcGVyX2NwdShzY2hlZF9ncm91cHMsIGNwdSkuc2c7CiAJcmV0dXJuIGNwdTsKIH0KICNlbmRpZiAvKiBDT05GSUdfU0NIRURfU01UICovCkBAIC05MDk5LDcgKzkxMDMsNyBAQAogCWlmIChkb21zX25ldyA9PSBOVUxMKSB7CiAJCW5kb21zX2N1ciA9IDA7CiAJCWRvbXNfbmV3ID0gJmZhbGxiYWNrX2RvbXM7Ci0JCWNwdW1hc2tfYW5kbm90KGRvbXNfbmV3WzBdLCBjcHVfb25saW5lX21hc2ssIGNwdV9pc29sYXRlZF9tYXApOworCQljcHVtYXNrX2FuZG5vdChkb21zX25ld1swXSwgY3B1X2FjdGl2ZV9tYXNrLCBjcHVfaXNvbGF0ZWRfbWFwKTsKIAkJV0FSTl9PTl9PTkNFKGRhdHRyX25ldyk7CiAJfQogCkBAIC05MjMwLDggKzkyMzQsMTAgQEAKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgQ1BVX09OTElORToKIAljYXNlIENQVV9PTkxJTkVfRlJPWkVOOgotCWNhc2UgQ1BVX0RFQUQ6Ci0JY2FzZSBDUFVfREVBRF9GUk9aRU46CisJY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgorCWNhc2UgQ1BVX0RPV05fUFJFUEFSRV9GUk9aRU46CisJY2FzZSBDUFVfRE9XTl9GQUlMRUQ6CisJY2FzZSBDUFVfRE9XTl9GQUlMRURfRlJPWkVOOgogCQlwYXJ0aXRpb25fc2NoZWRfZG9tYWlucygxLCBOVUxMLCBOVUxMKTsKIAkJcmV0dXJuIE5PVElGWV9PSzsKIApAQCAtOTI3OCw3ICs5Mjg0LDcgQEAKICNlbmRpZgogCWdldF9vbmxpbmVfY3B1cygpOwogCW11dGV4X2xvY2soJnNjaGVkX2RvbWFpbnNfbXV0ZXgpOwotCWFyY2hfaW5pdF9zY2hlZF9kb21haW5zKGNwdV9vbmxpbmVfbWFzayk7CisJYXJjaF9pbml0X3NjaGVkX2RvbWFpbnMoY3B1X2FjdGl2ZV9tYXNrKTsKIAljcHVtYXNrX2FuZG5vdChub25faXNvbGF0ZWRfY3B1cywgY3B1X3Bvc3NpYmxlX21hc2ssIGNwdV9pc29sYXRlZF9tYXApOwogCWlmIChjcHVtYXNrX2VtcHR5KG5vbl9pc29sYXRlZF9jcHVzKSkKIAkJY3B1bWFza19zZXRfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSwgbm9uX2lzb2xhdGVkX2NwdXMpOwpAQCAtOTU3Nyw3ICs5NTgzLDcgQEAKICNlbGlmIGRlZmluZWQgQ09ORklHX1VTRVJfU0NIRUQKIAkJaW5pdF90Z19ydF9lbnRyeSgmcm9vdF90YXNrX2dyb3VwLCAmcnEtPnJ0LCBOVUxMLCBpLCAwLCBOVUxMKTsKIAkJaW5pdF90Z19ydF9lbnRyeSgmaW5pdF90YXNrX2dyb3VwLAotCQkJCSZwZXJfY3B1KGluaXRfcnRfcnEsIGkpLAorCQkJCSZwZXJfY3B1KGluaXRfcnRfcnFfdmFyLCBpKSwKIAkJCQkmcGVyX2NwdShpbml0X3NjaGVkX3J0X2VudGl0eSwgaSksIGksIDEsCiAJCQkJcm9vdF90YXNrX2dyb3VwLnJ0X3NlW2ldKTsKICNlbmRpZgpAQCAtOTg0MiwxMyArOTg0OCwxNSBAQAogCQlzZSA9IGt6YWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IHNjaGVkX2VudGl0eSksCiAJCQkJICBHRlBfS0VSTkVMLCBjcHVfdG9fbm9kZShpKSk7CiAJCWlmICghc2UpCi0JCQlnb3RvIGVycjsKKwkJCWdvdG8gZXJyX2ZyZWVfcnE7CiAKIAkJaW5pdF90Z19jZnNfZW50cnkodGcsIGNmc19ycSwgc2UsIGksIDAsIHBhcmVudC0+c2VbaV0pOwogCX0KIAogCXJldHVybiAxOwogCisgZXJyX2ZyZWVfcnE6CisJa2ZyZWUoY2ZzX3JxKTsKICBlcnI6CiAJcmV0dXJuIDA7CiB9CkBAIC05OTMwLDEzICs5OTM4LDE1IEBACiAJCXJ0X3NlID0ga3phbGxvY19ub2RlKHNpemVvZihzdHJ1Y3Qgc2NoZWRfcnRfZW50aXR5KSwKIAkJCQkgICAgIEdGUF9LRVJORUwsIGNwdV90b19ub2RlKGkpKTsKIAkJaWYgKCFydF9zZSkKLQkJCWdvdG8gZXJyOworCQkJZ290byBlcnJfZnJlZV9ycTsKIAogCQlpbml0X3RnX3J0X2VudHJ5KHRnLCBydF9ycSwgcnRfc2UsIGksIDAsIHBhcmVudC0+cnRfc2VbaV0pOwogCX0KIAogCXJldHVybiAxOwogCisgZXJyX2ZyZWVfcnE6CisJa2ZyZWUocnRfcnEpOwogIGVycjoKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZF9kZWJ1Zy5jIGIva2VybmVsL3NjaGVkX2RlYnVnLmMKaW5kZXggNjk4OGNmMC4uNWFlMjRmYyAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkX2RlYnVnLmMKKysrIGIva2VybmVsL3NjaGVkX2RlYnVnLmMKQEAgLTMwOSw2ICszMDksMTIgQEAKIAlwcmludF9ycShtLCBycSwgY3B1KTsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKnNjaGVkX3R1bmFibGVfc2NhbGluZ19uYW1lc1tdID0geworCSJub25lIiwKKwkibG9nYXJpdG1pYyIsCisJImxpbmVhciIKK307CisKIHN0YXRpYyBpbnQgc2NoZWRfZGVidWdfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7CiAJdTY0IG5vdyA9IGt0aW1lX3RvX25zKGt0aW1lX2dldCgpKTsKQEAgLTMzNCw2ICszNDAsMTAgQEAKICN1bmRlZiBQTgogI3VuZGVmIFAKIAorCVNFUV9wcmludGYobSwgIiAgLiUtNDBzOiAlZCAoJXMpXG4iLCAic3lzY3RsX3NjaGVkX3R1bmFibGVfc2NhbGluZyIsCisJCXN5c2N0bF9zY2hlZF90dW5hYmxlX3NjYWxpbmcsCisJCXNjaGVkX3R1bmFibGVfc2NhbGluZ19uYW1lc1tzeXNjdGxfc2NoZWRfdHVuYWJsZV9zY2FsaW5nXSk7CisKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKIAkJcHJpbnRfY3B1KG0sIGNwdSk7CiAKQEAgLTM5OSw3ICs0MDksNiBAQAogCVBOKHNlLnN1bV9leGVjX3J1bnRpbWUpOwogCVBOKHNlLmF2Z19vdmVybGFwKTsKIAlQTihzZS5hdmdfd2FrZXVwKTsKLQlQTihzZS5hdmdfcnVubmluZyk7CiAKIAlucl9zd2l0Y2hlcyA9IHAtPm52Y3N3ICsgcC0+bml2Y3N3OwogCkBAIC00MjMsNyArNDMyLDYgQEAKIAlQKHNlLm5yX2ZhaWxlZF9taWdyYXRpb25zX3J1bm5pbmcpOwogCVAoc2UubnJfZmFpbGVkX21pZ3JhdGlvbnNfaG90KTsKIAlQKHNlLm5yX2ZvcmNlZF9taWdyYXRpb25zKTsKLQlQKHNlLm5yX2ZvcmNlZDJfbWlncmF0aW9ucyk7CiAJUChzZS5ucl93YWtldXBzKTsKIAlQKHNlLm5yX3dha2V1cHNfc3luYyk7CiAJUChzZS5ucl93YWtldXBzX21pZ3JhdGUpOwpAQCAtNDk5LDcgKzUwNyw2IEBACiAJcC0+c2UubnJfZmFpbGVkX21pZ3JhdGlvbnNfcnVubmluZwk9IDA7CiAJcC0+c2UubnJfZmFpbGVkX21pZ3JhdGlvbnNfaG90CQk9IDA7CiAJcC0+c2UubnJfZm9yY2VkX21pZ3JhdGlvbnMJCT0gMDsKLQlwLT5zZS5ucl9mb3JjZWQyX21pZ3JhdGlvbnMJCT0gMDsKIAlwLT5zZS5ucl93YWtldXBzCQkJPSAwOwogCXAtPnNlLm5yX3dha2V1cHNfc3luYwkJCT0gMDsKIAlwLT5zZS5ucl93YWtldXBzX21pZ3JhdGUJCT0gMDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZF9mYWlyLmMgYi9rZXJuZWwvc2NoZWRfZmFpci5jCmluZGV4IGY2MTgzN2EuLjgwNGE0MTEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZF9mYWlyLmMKKysrIGIva2VybmVsL3NjaGVkX2ZhaXIuYwpAQCAtMjEsNiArMjEsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9sYXRlbmN5dG9wLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogLyoKICAqIFRhcmdldGVkIHByZWVtcHRpb24gbGF0ZW5jeSBmb3IgQ1BVLWJvdW5kIHRhc2tzOgpAQCAtMzUsMTIgKzM2LDI2IEBACiAgKiAgcnVuIHZtc3RhdCBhbmQgbW9uaXRvciB0aGUgY29udGV4dC1zd2l0Y2hlcyAoY3MpIGZpZWxkKQogICovCiB1bnNpZ25lZCBpbnQgc3lzY3RsX3NjaGVkX2xhdGVuY3kgPSA1MDAwMDAwVUxMOwordW5zaWduZWQgaW50IG5vcm1hbGl6ZWRfc3lzY3RsX3NjaGVkX2xhdGVuY3kgPSA1MDAwMDAwVUxMOworCisvKgorICogVGhlIGluaXRpYWwtIGFuZCByZS1zY2FsaW5nIG9mIHR1bmFibGVzIGlzIGNvbmZpZ3VyYWJsZQorICogKGRlZmF1bHQgU0NIRURfVFVOQUJMRVNDQUxJTkdfTE9HID0gKigxK2lsb2cobmNwdXMpKQorICoKKyAqIE9wdGlvbnMgYXJlOgorICogU0NIRURfVFVOQUJMRVNDQUxJTkdfTk9ORSAtIHVuc2NhbGVkLCBhbHdheXMgKjEKKyAqIFNDSEVEX1RVTkFCTEVTQ0FMSU5HX0xPRyAtIHNjYWxlZCBsb2dhcml0aG1pY2FsLCAqMStpbG9nKG5jcHVzKQorICogU0NIRURfVFVOQUJMRVNDQUxJTkdfTElORUFSIC0gc2NhbGVkIGxpbmVhciwgKm5jcHVzCisgKi8KK2VudW0gc2NoZWRfdHVuYWJsZV9zY2FsaW5nIHN5c2N0bF9zY2hlZF90dW5hYmxlX3NjYWxpbmcKKwk9IFNDSEVEX1RVTkFCTEVTQ0FMSU5HX0xPRzsKIAogLyoKICAqIE1pbmltYWwgcHJlZW1wdGlvbiBncmFudWxhcml0eSBmb3IgQ1BVLWJvdW5kIHRhc2tzOgogICogKGRlZmF1bHQ6IDEgbXNlYyAqICgxICsgaWxvZyhuY3B1cykpLCB1bml0czogbmFub3NlY29uZHMpCiAgKi8KIHVuc2lnbmVkIGludCBzeXNjdGxfc2NoZWRfbWluX2dyYW51bGFyaXR5ID0gMTAwMDAwMFVMTDsKK3Vuc2lnbmVkIGludCBub3JtYWxpemVkX3N5c2N0bF9zY2hlZF9taW5fZ3JhbnVsYXJpdHkgPSAxMDAwMDAwVUxMOwogCiAvKgogICogaXMga2VwdCBhdCBzeXNjdGxfc2NoZWRfbGF0ZW5jeSAvIHN5c2N0bF9zY2hlZF9taW5fZ3JhbnVsYXJpdHkKQEAgLTcwLDYgKzg1LDcgQEAKICAqIGhhdmUgaW1tZWRpYXRlIHdha2V1cC9zbGVlcCBsYXRlbmNpZXMuCiAgKi8KIHVuc2lnbmVkIGludCBzeXNjdGxfc2NoZWRfd2FrZXVwX2dyYW51bGFyaXR5ID0gMTAwMDAwMFVMOwordW5zaWduZWQgaW50IG5vcm1hbGl6ZWRfc3lzY3RsX3NjaGVkX3dha2V1cF9ncmFudWxhcml0eSA9IDEwMDAwMDBVTDsKIAogY29uc3RfZGVidWcgdW5zaWduZWQgaW50IHN5c2N0bF9zY2hlZF9taWdyYXRpb25fY29zdCA9IDUwMDAwMFVMOwogCkBAIC0zODMsMTEgKzM5OSwxMiBAQAogICovCiAKICNpZmRlZiBDT05GSUdfU0NIRURfREVCVUcKLWludCBzY2hlZF9ucl9sYXRlbmN5X2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKK2ludCBzY2hlZF9wcm9jX3VwZGF0ZV9oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCiAJCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKIAkJbG9mZl90ICpwcG9zKQogewogCWludCByZXQgPSBwcm9jX2RvaW50dmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJaW50IGZhY3RvciA9IGdldF91cGRhdGVfc3lzY3RsX2ZhY3RvcigpOwogCiAJaWYgKHJldCB8fCAhd3JpdGUpCiAJCXJldHVybiByZXQ7CkBAIC0zOTUsNiArNDEyLDE0IEBACiAJc2NoZWRfbnJfbGF0ZW5jeSA9IERJVl9ST1VORF9VUChzeXNjdGxfc2NoZWRfbGF0ZW5jeSwKIAkJCQkJc3lzY3RsX3NjaGVkX21pbl9ncmFudWxhcml0eSk7CiAKKyNkZWZpbmUgV1JUX1NZU0NUTChuYW1lKSBcCisJKG5vcm1hbGl6ZWRfc3lzY3RsXyMjbmFtZSA9IHN5c2N0bF8jI25hbWUgLyAoZmFjdG9yKSkKKwlXUlRfU1lTQ1RMKHNjaGVkX21pbl9ncmFudWxhcml0eSk7CisJV1JUX1NZU0NUTChzY2hlZF9sYXRlbmN5KTsKKwlXUlRfU1lTQ1RMKHNjaGVkX3dha2V1cF9ncmFudWxhcml0eSk7CisJV1JUX1NZU0NUTChzY2hlZF9zaGFyZXNfcmF0ZWxpbWl0KTsKKyN1bmRlZiBXUlRfU1lTQ1RMCisKIAlyZXR1cm4gMDsKIH0KICNlbmRpZgpAQCAtMTQwMyw3ICsxNDI4LDYgQEAKIAkJbmV3X2NwdSA9IHByZXZfY3B1OwogCX0KIAotCXJjdV9yZWFkX2xvY2soKTsKIAlmb3JfZWFjaF9kb21haW4oY3B1LCB0bXApIHsKIAkJLyoKIAkJICogSWYgcG93ZXIgc2F2aW5ncyBsb2dpYyBpcyBlbmFibGVkIGZvciBhIGRvbWFpbiwgc2VlIGlmIHdlCkBAIC0xNDg0LDEwICsxNTA4LDggQEAKIAkJCXVwZGF0ZV9zaGFyZXModG1wKTsKIAl9CiAKLQlpZiAoYWZmaW5lX3NkICYmIHdha2VfYWZmaW5lKGFmZmluZV9zZCwgcCwgc3luYykpIHsKLQkJbmV3X2NwdSA9IGNwdTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmIChhZmZpbmVfc2QgJiYgd2FrZV9hZmZpbmUoYWZmaW5lX3NkLCBwLCBzeW5jKSkKKwkJcmV0dXJuIGNwdTsKIAogCXdoaWxlIChzZCkgewogCQlpbnQgbG9hZF9pZHggPSBzZC0+Zm9ya2V4ZWNfaWR4OwpAQCAtMTUyOCw4ICsxNTUwLDYgQEAKIAkJLyogd2hpbGUgbG9vcCB3aWxsIGJyZWFrIGhlcmUgaWYgc2QgPT0gTlVMTCAqLwogCX0KIAotb3V0OgotCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiBuZXdfY3B1OwogfQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KQEAgLTE2NTEsMTIgKzE2NzEsOCBAQAogCWludCBzeW5jID0gd2FrZV9mbGFncyAmIFdGX1NZTkM7CiAJaW50IHNjYWxlID0gY2ZzX3JxLT5ucl9ydW5uaW5nID49IHNjaGVkX25yX2xhdGVuY3k7CiAKLQl1cGRhdGVfY3VycihjZnNfcnEpOwotCi0JaWYgKHVubGlrZWx5KHJ0X3ByaW8ocC0+cHJpbykpKSB7Ci0JCXJlc2NoZWRfdGFzayhjdXJyKTsKLQkJcmV0dXJuOwotCX0KKwlpZiAodW5saWtlbHkocnRfcHJpbyhwLT5wcmlvKSkpCisJCWdvdG8gcHJlZW1wdDsKIAogCWlmICh1bmxpa2VseShwLT5zY2hlZF9jbGFzcyAhPSAmZmFpcl9zY2hlZF9jbGFzcykpCiAJCXJldHVybjsKQEAgLTE2ODIsNTAgKzE2OTgsNDQgQEAKIAkJcmV0dXJuOwogCiAJLyogSWRsZSB0YXNrcyBhcmUgYnkgZGVmaW5pdGlvbiBwcmVlbXB0ZWQgYnkgZXZlcnlib2R5LiAqLwotCWlmICh1bmxpa2VseShjdXJyLT5wb2xpY3kgPT0gU0NIRURfSURMRSkpIHsKLQkJcmVzY2hlZF90YXNrKGN1cnIpOwotCQlyZXR1cm47Ci0JfQorCWlmICh1bmxpa2VseShjdXJyLT5wb2xpY3kgPT0gU0NIRURfSURMRSkpCisJCWdvdG8gcHJlZW1wdDsKIAotCWlmICgoc2NoZWRfZmVhdChXQUtFVVBfU1lOQykgJiYgc3luYykgfHwKLQkgICAgKHNjaGVkX2ZlYXQoV0FLRVVQX09WRVJMQVApICYmCi0JICAgICAoc2UtPmF2Z19vdmVybGFwIDwgc3lzY3RsX3NjaGVkX21pZ3JhdGlvbl9jb3N0ICYmCi0JICAgICAgcHNlLT5hdmdfb3ZlcmxhcCA8IHN5c2N0bF9zY2hlZF9taWdyYXRpb25fY29zdCkpKSB7Ci0JCXJlc2NoZWRfdGFzayhjdXJyKTsKLQkJcmV0dXJuOwotCX0KKwlpZiAoc2NoZWRfZmVhdChXQUtFVVBfU1lOQykgJiYgc3luYykKKwkJZ290byBwcmVlbXB0OwogCi0JaWYgKHNjaGVkX2ZlYXQoV0FLRVVQX1JVTk5JTkcpKSB7Ci0JCWlmIChwc2UtPmF2Z19ydW5uaW5nIDwgc2UtPmF2Z19ydW5uaW5nKSB7Ci0JCQlzZXRfbmV4dF9idWRkeShwc2UpOwotCQkJcmVzY2hlZF90YXNrKGN1cnIpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQorCWlmIChzY2hlZF9mZWF0KFdBS0VVUF9PVkVSTEFQKSAmJgorCQkJc2UtPmF2Z19vdmVybGFwIDwgc3lzY3RsX3NjaGVkX21pZ3JhdGlvbl9jb3N0ICYmCisJCQlwc2UtPmF2Z19vdmVybGFwIDwgc3lzY3RsX3NjaGVkX21pZ3JhdGlvbl9jb3N0KQorCQlnb3RvIHByZWVtcHQ7CiAKIAlpZiAoIXNjaGVkX2ZlYXQoV0FLRVVQX1BSRUVNUFQpKQogCQlyZXR1cm47CiAKKwl1cGRhdGVfY3VycihjZnNfcnEpOwogCWZpbmRfbWF0Y2hpbmdfc2UoJnNlLCAmcHNlKTsKLQogCUJVR19PTighcHNlKTsKKwlpZiAod2FrZXVwX3ByZWVtcHRfZW50aXR5KHNlLCBwc2UpID09IDEpCisJCWdvdG8gcHJlZW1wdDsKIAotCWlmICh3YWtldXBfcHJlZW1wdF9lbnRpdHkoc2UsIHBzZSkgPT0gMSkgewotCQlyZXNjaGVkX3Rhc2soY3Vycik7Ci0JCS8qCi0JCSAqIE9ubHkgc2V0IHRoZSBiYWNrd2FyZCBidWRkeSB3aGVuIHRoZSBjdXJyZW50IHRhc2sgaXMgc3RpbGwKLQkJICogb24gdGhlIHJxLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhIHdha2V1cCBnZXRzIGludGVybGVhdmVkCi0JCSAqIHdpdGggc2NoZWR1bGUgb24gdGhlIC0+cHJlX3NjaGVkdWxlKCkgb3IgaWRsZV9iYWxhbmNlKCkKLQkJICogcG9pbnQsIGVpdGhlciBvZiB3aGljaCBjYW4gKiBkcm9wIHRoZSBycSBsb2NrLgotCQkgKgotCQkgKiBBbHNvLCBkdXJpbmcgZWFybHkgYm9vdCB0aGUgaWRsZSB0aHJlYWQgaXMgaW4gdGhlIGZhaXIgY2xhc3MsCi0JCSAqIGZvciBvYnZpb3VzIHJlYXNvbnMgaXRzIGEgYmFkIGlkZWEgdG8gc2NoZWR1bGUgYmFjayB0byBpdC4KLQkJICovCi0JCWlmICh1bmxpa2VseSghc2UtPm9uX3JxIHx8IGN1cnIgPT0gcnEtPmlkbGUpKQotCQkJcmV0dXJuOwotCQlpZiAoc2NoZWRfZmVhdChMQVNUX0JVRERZKSAmJiBzY2FsZSAmJiBlbnRpdHlfaXNfdGFzayhzZSkpCi0JCQlzZXRfbGFzdF9idWRkeShzZSk7Ci0JfQorCXJldHVybjsKKworcHJlZW1wdDoKKwlyZXNjaGVkX3Rhc2soY3Vycik7CisJLyoKKwkgKiBPbmx5IHNldCB0aGUgYmFja3dhcmQgYnVkZHkgd2hlbiB0aGUgY3VycmVudCB0YXNrIGlzIHN0aWxsCisJICogb24gdGhlIHJxLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhIHdha2V1cCBnZXRzIGludGVybGVhdmVkCisJICogd2l0aCBzY2hlZHVsZSBvbiB0aGUgLT5wcmVfc2NoZWR1bGUoKSBvciBpZGxlX2JhbGFuY2UoKQorCSAqIHBvaW50LCBlaXRoZXIgb2Ygd2hpY2ggY2FuICogZHJvcCB0aGUgcnEgbG9jay4KKwkgKgorCSAqIEFsc28sIGR1cmluZyBlYXJseSBib290IHRoZSBpZGxlIHRocmVhZCBpcyBpbiB0aGUgZmFpciBjbGFzcywKKwkgKiBmb3Igb2J2aW91cyByZWFzb25zIGl0cyBhIGJhZCBpZGVhIHRvIHNjaGVkdWxlIGJhY2sgdG8gaXQuCisJICovCisJaWYgKHVubGlrZWx5KCFzZS0+b25fcnEgfHwgY3VyciA9PSBycS0+aWRsZSkpCisJCXJldHVybjsKKworCWlmIChzY2hlZF9mZWF0KExBU1RfQlVERFkpICYmIHNjYWxlICYmIGVudGl0eV9pc190YXNrKHNlKSkKKwkJc2V0X2xhc3RfYnVkZHkoc2UpOwogfQogCiBzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpwaWNrX25leHRfdGFza19mYWlyKHN0cnVjdCBycSAqcnEpCkBAIC0xOTA1LDYgKzE5MTUsMTcgQEAKIAogCXJldHVybiAwOwogfQorCitzdGF0aWMgdm9pZCBycV9vbmxpbmVfZmFpcihzdHJ1Y3QgcnEgKnJxKQoreworCXVwZGF0ZV9zeXNjdGwoKTsKK30KKworc3RhdGljIHZvaWQgcnFfb2ZmbGluZV9mYWlyKHN0cnVjdCBycSAqcnEpCit7CisJdXBkYXRlX3N5c2N0bCgpOworfQorCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCiAvKgpAQCAtMTkyMiwyOCArMTk0MywzMCBAQAogfQogCiAvKgotICogU2hhcmUgdGhlIGZhaXJuZXNzIHJ1bnRpbWUgYmV0d2VlbiBwYXJlbnQgYW5kIGNoaWxkLCB0aHVzIHRoZQotICogdG90YWwgYW1vdW50IG9mIHByZXNzdXJlIGZvciBDUFUgc3RheXMgZXF1YWwgLSBuZXcgdGFza3MKLSAqIGdldCBhIGNoYW5jZSB0byBydW4gYnV0IGZyZXF1ZW50IGZvcmtlcnMgYXJlIG5vdCBhbGxvd2VkIHRvCi0gKiBtb25vcG9saXplIHRoZSBDUFUuIE5vdGU6IHRoZSBwYXJlbnQgcnVucXVldWUgaXMgbG9ja2VkLAotICogdGhlIGNoaWxkIGlzIG5vdCBydW5uaW5nIHlldC4KKyAqIGNhbGxlZCBvbiBmb3JrIHdpdGggdGhlIGNoaWxkIHRhc2sgYXMgYXJndW1lbnQgZnJvbSB0aGUgcGFyZW50J3MgY29udGV4dAorICogIC0gY2hpbGQgbm90IHlldCBvbiB0aGUgdGFza2xpc3QKKyAqICAtIHByZWVtcHRpb24gZGlzYWJsZWQKICAqLwotc3RhdGljIHZvaWQgdGFza19uZXdfZmFpcihzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCitzdGF0aWMgdm9pZCB0YXNrX2ZvcmtfZmFpcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7Ci0Jc3RydWN0IGNmc19ycSAqY2ZzX3JxID0gdGFza19jZnNfcnEocCk7CisJc3RydWN0IGNmc19ycSAqY2ZzX3JxID0gdGFza19jZnNfcnEoY3VycmVudCk7CiAJc3RydWN0IHNjaGVkX2VudGl0eSAqc2UgPSAmcC0+c2UsICpjdXJyID0gY2ZzX3JxLT5jdXJyOwogCWludCB0aGlzX2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdHJ1Y3QgcnEgKnJxID0gdGhpc19ycSgpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzY2hlZF9pbmZvX3F1ZXVlZChwKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnEtPmxvY2ssIGZsYWdzKTsKKworCWlmICh1bmxpa2VseSh0YXNrX2NwdShwKSAhPSB0aGlzX2NwdSkpCisJCV9fc2V0X3Rhc2tfY3B1KHAsIHRoaXNfY3B1KTsKIAogCXVwZGF0ZV9jdXJyKGNmc19ycSk7CisKIAlpZiAoY3VycikKIAkJc2UtPnZydW50aW1lID0gY3Vyci0+dnJ1bnRpbWU7CiAJcGxhY2VfZW50aXR5KGNmc19ycSwgc2UsIDEpOwogCi0JLyogJ2N1cnInIHdpbGwgYmUgTlVMTCBpZiB0aGUgY2hpbGQgYmVsb25ncyB0byBhIGRpZmZlcmVudCBncm91cCAqLwotCWlmIChzeXNjdGxfc2NoZWRfY2hpbGRfcnVuc19maXJzdCAmJiB0aGlzX2NwdSA9PSB0YXNrX2NwdShwKSAmJgotCQkJY3VyciAmJiBlbnRpdHlfYmVmb3JlKGN1cnIsIHNlKSkgeworCWlmIChzeXNjdGxfc2NoZWRfY2hpbGRfcnVuc19maXJzdCAmJiBjdXJyICYmIGVudGl0eV9iZWZvcmUoY3Vyciwgc2UpKSB7CiAJCS8qCiAJCSAqIFVwb24gcmVzY2hlZHVsaW5nLCBzY2hlZF9jbGFzczo6cHV0X3ByZXZfdGFzaygpIHdpbGwgcGxhY2UKIAkJICogJ2N1cnJlbnQnIHdpdGhpbiB0aGUgdHJlZSBiYXNlZCBvbiBpdHMgbmV3IGtleSB2YWx1ZS4KQEAgLTE5NTIsNyArMTk3NSw3IEBACiAJCXJlc2NoZWRfdGFzayhycS0+Y3Vycik7CiAJfQogCi0JZW5xdWV1ZV90YXNrX2ZhaXIocnEsIHAsIDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJxLT5sb2NrLCBmbGFncyk7CiB9CiAKIC8qCkBAIC0yMDE0LDIxICsyMDM3LDE3IEBACiB9CiAjZW5kaWYKIAotdW5zaWduZWQgaW50IGdldF9ycl9pbnRlcnZhbF9mYWlyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3Vuc2lnbmVkIGludCBnZXRfcnJfaW50ZXJ2YWxfZmFpcihzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7CiAJc3RydWN0IHNjaGVkX2VudGl0eSAqc2UgPSAmdGFzay0+c2U7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgcnEgKnJxOwogCXVuc2lnbmVkIGludCBycl9pbnRlcnZhbCA9IDA7CiAKIAkvKgogCSAqIFRpbWUgc2xpY2UgaXMgMCBmb3IgU0NIRURfT1RIRVIgdGFza3MgdGhhdCBhcmUgb24gYW4gb3RoZXJ3aXNlCiAJICogaWRsZSBydW5xdWV1ZToKIAkgKi8KLQlycSA9IHRhc2tfcnFfbG9jayh0YXNrLCAmZmxhZ3MpOwogCWlmIChycS0+Y2ZzLmxvYWQud2VpZ2h0KQogCQlycl9pbnRlcnZhbCA9IE5TX1RPX0pJRkZJRVMoc2NoZWRfc2xpY2UoJnJxLT5jZnMsIHNlKSk7Ci0JdGFza19ycV91bmxvY2socnEsICZmbGFncyk7CiAKIAlyZXR1cm4gcnJfaW50ZXJ2YWw7CiB9CkBAIC0yMDUyLDExICsyMDcxLDEzIEBACiAKIAkubG9hZF9iYWxhbmNlCQk9IGxvYWRfYmFsYW5jZV9mYWlyLAogCS5tb3ZlX29uZV90YXNrCQk9IG1vdmVfb25lX3Rhc2tfZmFpciwKKwkucnFfb25saW5lCQk9IHJxX29ubGluZV9mYWlyLAorCS5ycV9vZmZsaW5lCQk9IHJxX29mZmxpbmVfZmFpciwKICNlbmRpZgogCiAJLnNldF9jdXJyX3Rhc2sgICAgICAgICAgPSBzZXRfY3Vycl90YXNrX2ZhaXIsCiAJLnRhc2tfdGljawkJPSB0YXNrX3RpY2tfZmFpciwKLQkudGFza19uZXcJCT0gdGFza19uZXdfZmFpciwKKwkudGFza19mb3JrCQk9IHRhc2tfZm9ya19mYWlyLAogCiAJLnByaW9fY2hhbmdlZAkJPSBwcmlvX2NoYW5nZWRfZmFpciwKIAkuc3dpdGNoZWRfdG8JCT0gc3dpdGNoZWRfdG9fZmFpciwKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZF9mZWF0dXJlcy5oIGIva2VybmVsL3NjaGVkX2ZlYXR1cmVzLmgKaW5kZXggMGQ5NDA4My4uZDUwNTlmZCAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkX2ZlYXR1cmVzLmgKKysrIGIva2VybmVsL3NjaGVkX2ZlYXR1cmVzLmgKQEAgLTU0LDExICs1NCw2IEBACiBTQ0hFRF9GRUFUKFdBS0VVUF9PVkVSTEFQLCAwKQogCiAvKgotICogV2FrZXVwIHByZWVtcHRpb24gdG93YXJkcyB0YXNrcyB0aGF0IHJ1biBzaG9ydAotICovCi1TQ0hFRF9GRUFUKFdBS0VVUF9SVU5OSU5HLCAwKQotCi0vKgogICogVXNlIHRoZSBTWU5DIHdha2V1cCBoaW50LCBwaXBlcyBhbmQgdGhlIGxpa2VzIHVzZSB0aGlzIHRvIGluZGljYXRlCiAgKiB0aGUgcmVtb3RlIGVuZCBpcyBsaWtlbHkgdG8gY29uc3VtZSB0aGUgZGF0YSB3ZSBqdXN0IHdyb3RlLCBhbmQKICAqIHRoZXJlZm9yZSBoYXMgY2FjaGUgYmVuZWZpdCBmcm9tIGJlaW5nIHBsYWNlZCBvbiB0aGUgc2FtZSBjcHUsIHNlZQpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkX2lkbGV0YXNrLmMgYi9rZXJuZWwvc2NoZWRfaWRsZXRhc2suYwppbmRleCBiMTMzYTI4Li4zM2Q1Mzg0IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWRfaWRsZXRhc2suYworKysgYi9rZXJuZWwvc2NoZWRfaWRsZXRhc2suYwpAQCAtOTcsNyArOTcsNyBAQAogCQljaGVja19wcmVlbXB0X2N1cnIocnEsIHAsIDApOwogfQogCi11bnNpZ25lZCBpbnQgZ2V0X3JyX2ludGVydmFsX2lkbGUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQordW5zaWduZWQgaW50IGdldF9ycl9pbnRlcnZhbF9pZGxlKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZF9ydC5jIGIva2VybmVsL3NjaGVkX3J0LmMKaW5kZXggNWM1ZmVmMy4uYWVjYmQ5YyAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkX3J0LmMKKysrIGIva2VybmVsL3NjaGVkX3J0LmMKQEAgLTE3MjEsNyArMTcyMSw3IEBACiAJZGVxdWV1ZV9wdXNoYWJsZV90YXNrKHJxLCBwKTsKIH0KIAotdW5zaWduZWQgaW50IGdldF9ycl9pbnRlcnZhbF9ydChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit1bnNpZ25lZCBpbnQgZ2V0X3JyX2ludGVydmFsX3J0KHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKIAkvKgogCSAqIFRpbWUgc2xpY2UgaXMgMCBmb3IgU0NIRURfRklGTyB0YXNrcwpkaWZmIC0tZ2l0IGEva2VybmVsL3NvZnRpcnEuYyBiL2tlcm5lbC9zb2Z0aXJxLmMKaW5kZXggMjE5MzlkOS4uYTA5NTAyZSAxMDA2NDQKLS0tIGEva2VybmVsL3NvZnRpcnEuYworKysgYi9rZXJuZWwvc29mdGlycS5jCkBAIC02OTcsNyArNjk3LDcgQEAKIAlvcGVuX3NvZnRpcnEoSElfU09GVElSUSwgdGFza2xldF9oaV9hY3Rpb24pOwogfQogCi1zdGF0aWMgaW50IGtzb2Z0aXJxZCh2b2lkICogX19iaW5kX2NwdSkKK3N0YXRpYyBpbnQgcnVuX2tzb2Z0aXJxZCh2b2lkICogX19iaW5kX2NwdSkKIHsKIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCkBAIC04MTAsNyArODEwLDcgQEAKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgQ1BVX1VQX1BSRVBBUkU6CiAJY2FzZSBDUFVfVVBfUFJFUEFSRV9GUk9aRU46Ci0JCXAgPSBrdGhyZWFkX2NyZWF0ZShrc29mdGlycWQsIGhjcHUsICJrc29mdGlycWQvJWQiLCBob3RjcHUpOworCQlwID0ga3RocmVhZF9jcmVhdGUocnVuX2tzb2Z0aXJxZCwgaGNwdSwgImtzb2Z0aXJxZC8lZCIsIGhvdGNwdSk7CiAJCWlmIChJU19FUlIocCkpIHsKIAkJCXByaW50aygia3NvZnRpcnFkIGZvciAlaSBmYWlsZWRcbiIsIGhvdGNwdSk7CiAJCQlyZXR1cm4gTk9USUZZX0JBRDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zb2Z0bG9ja3VwLmMgYi9rZXJuZWwvc29mdGxvY2t1cC5jCmluZGV4IDgxMzI0ZDEuLmQyMjU3OTAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zb2Z0bG9ja3VwLmMKKysrIGIva2VybmVsL3NvZnRsb2NrdXAuYwpAQCAtMjIsOSArMjIsOSBAQAogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHByaW50X2xvY2spOwogCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgdG91Y2hfdGltZXN0YW1wKTsKLXN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBwcmludF90aW1lc3RhbXApOwotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCB0YXNrX3N0cnVjdCAqLCB3YXRjaGRvZ190YXNrKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBzb2Z0bG9ja3VwX3RvdWNoX3RzKTsgLyogdG91Y2ggdGltZXN0YW1wICovCitzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgc29mdGxvY2t1cF9wcmludF90cyk7IC8qIHByaW50IHRpbWVzdGFtcCAqLworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCB0YXNrX3N0cnVjdCAqLCBzb2Z0bG9ja3VwX3dhdGNoZG9nKTsKIAogc3RhdGljIGludCBfX3JlYWRfbW9zdGx5IGRpZF9wYW5pYzsKIGludCBfX3JlYWRfbW9zdGx5IHNvZnRsb2NrdXBfdGhyZXNoID0gNjA7CkBAIC03MCwxMiArNzAsMTIgQEAKIHsKIAlpbnQgdGhpc19jcHUgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOwogCi0JX19yYXdfZ2V0X2NwdV92YXIodG91Y2hfdGltZXN0YW1wKSA9IGdldF90aW1lc3RhbXAodGhpc19jcHUpOworCV9fcmF3X2dldF9jcHVfdmFyKHNvZnRsb2NrdXBfdG91Y2hfdHMpID0gZ2V0X3RpbWVzdGFtcCh0aGlzX2NwdSk7CiB9CiAKIHZvaWQgdG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZyh2b2lkKQogewotCV9fcmF3X2dldF9jcHVfdmFyKHRvdWNoX3RpbWVzdGFtcCkgPSAwOworCV9fcmF3X2dldF9jcHVfdmFyKHNvZnRsb2NrdXBfdG91Y2hfdHMpID0gMDsKIH0KIEVYUE9SVF9TWU1CT0wodG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZyk7CiAKQEAgLTg1LDcgKzg1LDcgQEAKIAogCS8qIENhdXNlIGVhY2ggQ1BVIHRvIHJlLXVwZGF0ZSBpdHMgdGltZXN0YW1wIHJhdGhlciB0aGFuIGNvbXBsYWluICovCiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCi0JCXBlcl9jcHUodG91Y2hfdGltZXN0YW1wLCBjcHUpID0gMDsKKwkJcGVyX2NwdShzb2Z0bG9ja3VwX3RvdWNoX3RzLCBjcHUpID0gMDsKIH0KIEVYUE9SVF9TWU1CT0wodG91Y2hfYWxsX3NvZnRsb2NrdXBfd2F0Y2hkb2dzKTsKIApAQCAtMTA0LDI4ICsxMDQsMjggQEAKIHZvaWQgc29mdGxvY2t1cF90aWNrKHZvaWQpCiB7CiAJaW50IHRoaXNfY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXVuc2lnbmVkIGxvbmcgdG91Y2hfdGltZXN0YW1wID0gcGVyX2NwdSh0b3VjaF90aW1lc3RhbXAsIHRoaXNfY3B1KTsKLQl1bnNpZ25lZCBsb25nIHByaW50X3RpbWVzdGFtcDsKKwl1bnNpZ25lZCBsb25nIHRvdWNoX3RzID0gcGVyX2NwdShzb2Z0bG9ja3VwX3RvdWNoX3RzLCB0aGlzX2NwdSk7CisJdW5zaWduZWQgbG9uZyBwcmludF90czsKIAlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGdldF9pcnFfcmVncygpOwogCXVuc2lnbmVkIGxvbmcgbm93OwogCiAJLyogSXMgZGV0ZWN0aW9uIHN3aXRjaGVkIG9mZj8gKi8KLQlpZiAoIXBlcl9jcHUod2F0Y2hkb2dfdGFzaywgdGhpc19jcHUpIHx8IHNvZnRsb2NrdXBfdGhyZXNoIDw9IDApIHsKKwlpZiAoIXBlcl9jcHUoc29mdGxvY2t1cF93YXRjaGRvZywgdGhpc19jcHUpIHx8IHNvZnRsb2NrdXBfdGhyZXNoIDw9IDApIHsKIAkJLyogQmUgc3VyZSB3ZSBkb24ndCBmYWxzZSB0cmlnZ2VyIGlmIHN3aXRjaGVkIGJhY2sgb24gKi8KLQkJaWYgKHRvdWNoX3RpbWVzdGFtcCkKLQkJCXBlcl9jcHUodG91Y2hfdGltZXN0YW1wLCB0aGlzX2NwdSkgPSAwOworCQlpZiAodG91Y2hfdHMpCisJCQlwZXJfY3B1KHNvZnRsb2NrdXBfdG91Y2hfdHMsIHRoaXNfY3B1KSA9IDA7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAodG91Y2hfdGltZXN0YW1wID09IDApIHsKKwlpZiAodG91Y2hfdHMgPT0gMCkgewogCQlfX3RvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKIAkJcmV0dXJuOwogCX0KIAotCXByaW50X3RpbWVzdGFtcCA9IHBlcl9jcHUocHJpbnRfdGltZXN0YW1wLCB0aGlzX2NwdSk7CisJcHJpbnRfdHMgPSBwZXJfY3B1KHNvZnRsb2NrdXBfcHJpbnRfdHMsIHRoaXNfY3B1KTsKIAogCS8qIHJlcG9ydCBhdCBtb3N0IG9uY2UgYSBzZWNvbmQgKi8KLQlpZiAocHJpbnRfdGltZXN0YW1wID09IHRvdWNoX3RpbWVzdGFtcCB8fCBkaWRfcGFuaWMpCisJaWYgKHByaW50X3RzID09IHRvdWNoX3RzIHx8IGRpZF9wYW5pYykKIAkJcmV0dXJuOwogCiAJLyogZG8gbm90IHByaW50IGR1cmluZyBlYXJseSBib290dXA6ICovCkBAIC0xNDAsMTggKzE0MCwxOCBAQAogCSAqIFdha2UgdXAgdGhlIGhpZ2gtcHJpbyB3YXRjaGRvZyB0YXNrIHR3aWNlIHBlcgogCSAqIHRocmVzaG9sZCB0aW1lc3Bhbi4KIAkgKi8KLQlpZiAobm93ID4gdG91Y2hfdGltZXN0YW1wICsgc29mdGxvY2t1cF90aHJlc2gvMikKLQkJd2FrZV91cF9wcm9jZXNzKHBlcl9jcHUod2F0Y2hkb2dfdGFzaywgdGhpc19jcHUpKTsKKwlpZiAobm93ID4gdG91Y2hfdHMgKyBzb2Z0bG9ja3VwX3RocmVzaC8yKQorCQl3YWtlX3VwX3Byb2Nlc3MocGVyX2NwdShzb2Z0bG9ja3VwX3dhdGNoZG9nLCB0aGlzX2NwdSkpOwogCiAJLyogV2FybiBhYm91dCB1bnJlYXNvbmFibGUgZGVsYXlzOiAqLwotCWlmIChub3cgPD0gKHRvdWNoX3RpbWVzdGFtcCArIHNvZnRsb2NrdXBfdGhyZXNoKSkKKwlpZiAobm93IDw9ICh0b3VjaF90cyArIHNvZnRsb2NrdXBfdGhyZXNoKSkKIAkJcmV0dXJuOwogCi0JcGVyX2NwdShwcmludF90aW1lc3RhbXAsIHRoaXNfY3B1KSA9IHRvdWNoX3RpbWVzdGFtcDsKKwlwZXJfY3B1KHNvZnRsb2NrdXBfcHJpbnRfdHMsIHRoaXNfY3B1KSA9IHRvdWNoX3RzOwogCiAJc3Bpbl9sb2NrKCZwcmludF9sb2NrKTsKIAlwcmludGsoS0VSTl9FUlIgIkJVRzogc29mdCBsb2NrdXAgLSBDUFUjJWQgc3R1Y2sgZm9yICVsdXMhIFslczolZF1cbiIsCi0JCQl0aGlzX2NwdSwgbm93IC0gdG91Y2hfdGltZXN0YW1wLAorCQkJdGhpc19jcHUsIG5vdyAtIHRvdWNoX3RzLAogCQkJY3VycmVudC0+Y29tbSwgdGFza19waWRfbnIoY3VycmVudCkpOwogCXByaW50X21vZHVsZXMoKTsKIAlwcmludF9pcnF0cmFjZV9ldmVudHMoY3VycmVudCk7CkBAIC0yMDksMzIgKzIwOSwzMiBAQAogCXN3aXRjaCAoYWN0aW9uKSB7CiAJY2FzZSBDUFVfVVBfUFJFUEFSRToKIAljYXNlIENQVV9VUF9QUkVQQVJFX0ZST1pFTjoKLQkJQlVHX09OKHBlcl9jcHUod2F0Y2hkb2dfdGFzaywgaG90Y3B1KSk7CisJCUJVR19PTihwZXJfY3B1KHNvZnRsb2NrdXBfd2F0Y2hkb2csIGhvdGNwdSkpOwogCQlwID0ga3RocmVhZF9jcmVhdGUod2F0Y2hkb2csIGhjcHUsICJ3YXRjaGRvZy8lZCIsIGhvdGNwdSk7CiAJCWlmIChJU19FUlIocCkpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAid2F0Y2hkb2cgZm9yICVpIGZhaWxlZFxuIiwgaG90Y3B1KTsKIAkJCXJldHVybiBOT1RJRllfQkFEOwogCQl9Ci0JCXBlcl9jcHUodG91Y2hfdGltZXN0YW1wLCBob3RjcHUpID0gMDsKLQkJcGVyX2NwdSh3YXRjaGRvZ190YXNrLCBob3RjcHUpID0gcDsKKwkJcGVyX2NwdShzb2Z0bG9ja3VwX3RvdWNoX3RzLCBob3RjcHUpID0gMDsKKwkJcGVyX2NwdShzb2Z0bG9ja3VwX3dhdGNoZG9nLCBob3RjcHUpID0gcDsKIAkJa3RocmVhZF9iaW5kKHAsIGhvdGNwdSk7CiAJCWJyZWFrOwogCWNhc2UgQ1BVX09OTElORToKIAljYXNlIENQVV9PTkxJTkVfRlJPWkVOOgotCQl3YWtlX3VwX3Byb2Nlc3MocGVyX2NwdSh3YXRjaGRvZ190YXNrLCBob3RjcHUpKTsKKwkJd2FrZV91cF9wcm9jZXNzKHBlcl9jcHUoc29mdGxvY2t1cF93YXRjaGRvZywgaG90Y3B1KSk7CiAJCWJyZWFrOwogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogCWNhc2UgQ1BVX1VQX0NBTkNFTEVEOgogCWNhc2UgQ1BVX1VQX0NBTkNFTEVEX0ZST1pFTjoKLQkJaWYgKCFwZXJfY3B1KHdhdGNoZG9nX3Rhc2ssIGhvdGNwdSkpCisJCWlmICghcGVyX2NwdShzb2Z0bG9ja3VwX3dhdGNoZG9nLCBob3RjcHUpKQogCQkJYnJlYWs7CiAJCS8qIFVuYmluZCBzbyBpdCBjYW4gcnVuLiAgRmFsbCB0aHJ1LiAqLwotCQlrdGhyZWFkX2JpbmQocGVyX2NwdSh3YXRjaGRvZ190YXNrLCBob3RjcHUpLAorCQlrdGhyZWFkX2JpbmQocGVyX2NwdShzb2Z0bG9ja3VwX3dhdGNoZG9nLCBob3RjcHUpLAogCQkJICAgICBjcHVtYXNrX2FueShjcHVfb25saW5lX21hc2spKTsKIAljYXNlIENQVV9ERUFEOgogCWNhc2UgQ1BVX0RFQURfRlJPWkVOOgotCQlwID0gcGVyX2NwdSh3YXRjaGRvZ190YXNrLCBob3RjcHUpOwotCQlwZXJfY3B1KHdhdGNoZG9nX3Rhc2ssIGhvdGNwdSkgPSBOVUxMOworCQlwID0gcGVyX2NwdShzb2Z0bG9ja3VwX3dhdGNoZG9nLCBob3RjcHUpOworCQlwZXJfY3B1KHNvZnRsb2NrdXBfd2F0Y2hkb2csIGhvdGNwdSkgPSBOVUxMOwogCQlrdGhyZWFkX3N0b3AocCk7CiAJCWJyZWFrOwogI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3N5c2N0bC5jIGIva2VybmVsL3N5c2N0bC5jCmluZGV4IDkzMjdhMjYuLjU1NGFjNDggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXNjdGwuYworKysgYi9rZXJuZWwvc3lzY3RsLmMKQEAgLTI0NCw2ICsyNDQsMTAgQEAKIHN0YXRpYyBpbnQgbWF4X3NjaGVkX2dyYW51bGFyaXR5X25zID0gTlNFQ19QRVJfU0VDOwkvKiAxIHNlY29uZCAqLwogc3RhdGljIGludCBtaW5fd2FrZXVwX2dyYW51bGFyaXR5X25zOwkJCS8qIDAgdXNlY3MgKi8KIHN0YXRpYyBpbnQgbWF4X3dha2V1cF9ncmFudWxhcml0eV9ucyA9IE5TRUNfUEVSX1NFQzsJLyogMSBzZWNvbmQgKi8KK3N0YXRpYyBpbnQgbWluX3NjaGVkX3R1bmFibGVfc2NhbGluZyA9IFNDSEVEX1RVTkFCTEVTQ0FMSU5HX05PTkU7CitzdGF0aWMgaW50IG1heF9zY2hlZF90dW5hYmxlX3NjYWxpbmcgPSBTQ0hFRF9UVU5BQkxFU0NBTElOR19FTkQtMTsKK3N0YXRpYyBpbnQgbWluX3NjaGVkX3NoYXJlc19yYXRlbGltaXQgPSAxMDAwMDA7IC8qIDEwMCB1c2VjICovCitzdGF0aWMgaW50IG1heF9zY2hlZF9zaGFyZXNfcmF0ZWxpbWl0ID0gTlNFQ19QRVJfU0VDOyAvKiAxIHNlY29uZCAqLwogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIGtlcm5fdGFibGVbXSA9IHsKQEAgLTI2MCw3ICsyNjQsNyBAQAogCQkuZGF0YQkJPSAmc3lzY3RsX3NjaGVkX21pbl9ncmFudWxhcml0eSwKIAkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKIAkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHNjaGVkX25yX2xhdGVuY3lfaGFuZGxlciwKKwkJLnByb2NfaGFuZGxlcgk9IHNjaGVkX3Byb2NfdXBkYXRlX2hhbmRsZXIsCiAJCS5leHRyYTEJCT0gJm1pbl9zY2hlZF9ncmFudWxhcml0eV9ucywKIAkJLmV4dHJhMgkJPSAmbWF4X3NjaGVkX2dyYW51bGFyaXR5X25zLAogCX0sCkBAIC0yNjksNyArMjczLDcgQEAKIAkJLmRhdGEJCT0gJnN5c2N0bF9zY2hlZF9sYXRlbmN5LAogCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAogCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gc2NoZWRfbnJfbGF0ZW5jeV9oYW5kbGVyLAorCQkucHJvY19oYW5kbGVyCT0gc2NoZWRfcHJvY191cGRhdGVfaGFuZGxlciwKIAkJLmV4dHJhMQkJPSAmbWluX3NjaGVkX2dyYW51bGFyaXR5X25zLAogCQkuZXh0cmEyCQk9ICZtYXhfc2NoZWRfZ3JhbnVsYXJpdHlfbnMsCiAJfSwKQEAgLTI3OCw3ICsyODIsNyBAQAogCQkuZGF0YQkJPSAmc3lzY3RsX3NjaGVkX3dha2V1cF9ncmFudWxhcml0eSwKIAkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKIAkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkucHJvY19oYW5kbGVyCT0gc2NoZWRfcHJvY191cGRhdGVfaGFuZGxlciwKIAkJLmV4dHJhMQkJPSAmbWluX3dha2V1cF9ncmFudWxhcml0eV9ucywKIAkJLmV4dHJhMgkJPSAmbWF4X3dha2V1cF9ncmFudWxhcml0eV9ucywKIAl9LApAQCAtMjg3LDcgKzI5MSwxOCBAQAogCQkuZGF0YQkJPSAmc3lzY3RsX3NjaGVkX3NoYXJlc19yYXRlbGltaXQsCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCiAJCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAorCQkucHJvY19oYW5kbGVyCT0gc2NoZWRfcHJvY191cGRhdGVfaGFuZGxlciwKKwkJLmV4dHJhMQkJPSAmbWluX3NjaGVkX3NoYXJlc19yYXRlbGltaXQsCisJCS5leHRyYTIJCT0gJm1heF9zY2hlZF9zaGFyZXNfcmF0ZWxpbWl0LAorCX0sCisJeworCQkucHJvY25hbWUJPSAic2NoZWRfdHVuYWJsZV9zY2FsaW5nIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9zY2hlZF90dW5hYmxlX3NjYWxpbmcsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGVudW0gc2NoZWRfdHVuYWJsZV9zY2FsaW5nKSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9IHNjaGVkX3Byb2NfdXBkYXRlX2hhbmRsZXIsCisJCS5leHRyYTEJCT0gJm1pbl9zY2hlZF90dW5hYmxlX3NjYWxpbmcsCisJCS5leHRyYTIJCT0gJm1heF9zY2hlZF90dW5hYmxlX3NjYWxpbmcsCiAJfSwKIAl7CiAJCS5wcm9jbmFtZQk9ICJzY2hlZF9zaGFyZXNfdGhyZXNoIiwKQEAgLTI5OCwxMyArMzEzLDYgQEAKIAkJLmV4dHJhMQkJPSAmemVybywKIAl9LAogCXsKLQkJLnByb2NuYW1lCT0gInNjaGVkX2ZlYXR1cmVzIiwKLQkJLmRhdGEJCT0gJnN5c2N0bF9zY2hlZF9mZWF0dXJlcywKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCi0JfSwKLQl7CiAJCS5wcm9jbmFtZQk9ICJzY2hlZF9taWdyYXRpb25fY29zdCIsCiAJCS5kYXRhCQk9ICZzeXNjdGxfc2NoZWRfbWlncmF0aW9uX2Nvc3QsCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aW1lcl9saXN0LmMgYi9rZXJuZWwvdGltZS90aW1lcl9saXN0LmMKaW5kZXggNjY1Yzc2ZS4uOWQ4MGRiNCAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvdGltZXJfbGlzdC5jCisrKyBiL2tlcm5lbC90aW1lL3RpbWVyX2xpc3QuYwpAQCAtMTUwLDYgKzE1MCw5IEBACiAJUF9ucyhleHBpcmVzX25leHQpOwogCVAoaHJlc19hY3RpdmUpOwogCVAobnJfZXZlbnRzKTsKKwlQKG5yX3JldHJpZXMpOworCVAobnJfaGFuZ3MpOworCVBfbnMobWF4X2hhbmdfdGltZSk7CiAjZW5kaWYKICN1bmRlZiBQCiAjdW5kZWYgUF9ucwpAQCAtMjU0LDcgKzI1Nyw3IEBACiAJdTY0IG5vdyA9IGt0aW1lX3RvX25zKGt0aW1lX2dldCgpKTsKIAlpbnQgY3B1OwogCi0JU0VRX3ByaW50ZihtLCAiVGltZXIgTGlzdCBWZXJzaW9uOiB2MC40XG4iKTsKKwlTRVFfcHJpbnRmKG0sICJUaW1lciBMaXN0IFZlcnNpb246IHYwLjVcbiIpOwogCVNFUV9wcmludGYobSwgIkhSVElNRVJfTUFYX0NMT0NLX0JBU0VTOiAlZFxuIiwgSFJUSU1FUl9NQVhfQ0xPQ0tfQkFTRVMpOwogCVNFUV9wcmludGYobSwgIm5vdyBhdCAlTGQgbnNlY3NcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpbm93KTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGltZXJfc3RhdHMuYyBiL2tlcm5lbC90aW1lL3RpbWVyX3N0YXRzLmMKaW5kZXggZWU1NjgxZi4uNjNiMTE3ZSAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvdGltZXJfc3RhdHMuYworKysgYi9rZXJuZWwvdGltZS90aW1lcl9zdGF0cy5jCkBAIC04Niw3ICs4Niw3IEBACiAvKgogICogUGVyLUNQVSBsb29rdXAgbG9ja3MgZm9yIGZhc3QgaGFzaCBsb29rdXA6CiAgKi8KLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzcGlubG9ja190LCBsb29rdXBfbG9jayk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3BpbmxvY2tfdCwgdHN0YXRzX2xvb2t1cF9sb2NrKTsKIAogLyoKICAqIE11dGV4IHRvIHNlcmlhbGl6ZSBzdGF0ZSBjaGFuZ2VzIHdpdGggc2hvdy1zdGF0cyBhY3Rpdml0aWVzOgpAQCAtMjQ1LDcgKzI0NSw3IEBACiAJaWYgKGxpa2VseSghdGltZXJfc3RhdHNfYWN0aXZlKSkKIAkJcmV0dXJuOwogCi0JbG9jayA9ICZwZXJfY3B1KGxvb2t1cF9sb2NrLCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlsb2NrID0gJnBlcl9jcHUodHN0YXRzX2xvb2t1cF9sb2NrLCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAogCWlucHV0LnRpbWVyID0gdGltZXI7CiAJaW5wdXQuc3RhcnRfZnVuYyA9IHN0YXJ0ZjsKQEAgLTM0OCw5ICszNDgsMTAgQEAKIAlpbnQgY3B1OwogCiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBlcl9jcHUobG9va3VwX2xvY2ssIGNwdSksIGZsYWdzKTsKKwkJc3BpbmxvY2tfdCAqbG9jayA9ICZwZXJfY3B1KHRzdGF0c19sb29rdXBfbG9jaywgY3B1KTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUobG9jaywgZmxhZ3MpOwogCQkvKiBub3RoaW5nICovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBlcl9jcHUobG9va3VwX2xvY2ssIGNwdSksIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncyk7CiAJfQogfQogCkBAIC00MDgsNyArNDA5LDcgQEAKIAlpbnQgY3B1OwogCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkKLQkJc3Bpbl9sb2NrX2luaXQoJnBlcl9jcHUobG9va3VwX2xvY2ssIGNwdSkpOworCQlzcGluX2xvY2tfaW5pdCgmcGVyX2NwdSh0c3RhdHNfbG9va3VwX2xvY2ssIGNwdSkpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3RzdGF0c19wcm9jZnModm9pZCkKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZS5jIGIva2VybmVsL3RyYWNlL3RyYWNlLmMKaW5kZXggODc0ZjI4OS4uYzgyZGZkOSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlLmMKQEAgLTg2LDE3ICs4NiwxNyBAQAogICovCiBzdGF0aWMgaW50IHRyYWNpbmdfZGlzYWJsZWQgPSAxOwogCi1ERUZJTkVfUEVSX0NQVShsb2NhbF90LCBmdHJhY2VfY3B1X2Rpc2FibGVkKTsKK0RFRklORV9QRVJfQ1BVKGludCwgZnRyYWNlX2NwdV9kaXNhYmxlZCk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmdHJhY2VfZGlzYWJsZV9jcHUodm9pZCkKIHsKIAlwcmVlbXB0X2Rpc2FibGUoKTsKLQlsb2NhbF9pbmMoJl9fZ2V0X2NwdV92YXIoZnRyYWNlX2NwdV9kaXNhYmxlZCkpOworCV9fdGhpc19jcHVfaW5jKHBlcl9jcHVfdmFyKGZ0cmFjZV9jcHVfZGlzYWJsZWQpKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGZ0cmFjZV9lbmFibGVfY3B1KHZvaWQpCiB7Ci0JbG9jYWxfZGVjKCZfX2dldF9jcHVfdmFyKGZ0cmFjZV9jcHVfZGlzYWJsZWQpKTsKKwlfX3RoaXNfY3B1X2RlYyhwZXJfY3B1X3ZhcihmdHJhY2VfY3B1X2Rpc2FibGVkKSk7CiAJcHJlZW1wdF9lbmFibGUoKTsKIH0KIApAQCAtMjAzLDcgKzIwMyw3IEBACiAgKi8KIHN0YXRpYyBzdHJ1Y3QgdHJhY2VfYXJyYXkJbWF4X3RyOwogCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHRyYWNlX2FycmF5X2NwdSwgbWF4X2RhdGEpOworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCB0cmFjZV9hcnJheV9jcHUsIG1heF90cl9kYXRhKTsKIAogLyogdHJhY2VyX2VuYWJsZWQgaXMgdXNlZCB0byB0b2dnbGUgYWN0aXZhdGlvbiBvZiBhIHRyYWNlciAqLwogc3RhdGljIGludAkJCXRyYWNlcl9lbmFibGVkID0gMTsKQEAgLTEwODUsNyArMTA4NSw3IEBACiAJc3RydWN0IGZ0cmFjZV9lbnRyeSAqZW50cnk7CiAKIAkvKiBJZiB3ZSBhcmUgcmVhZGluZyB0aGUgcmluZyBidWZmZXIsIGRvbid0IHRyYWNlICovCi0JaWYgKHVubGlrZWx5KGxvY2FsX3JlYWQoJl9fZ2V0X2NwdV92YXIoZnRyYWNlX2NwdV9kaXNhYmxlZCkpKSkKKwlpZiAodW5saWtlbHkoX190aGlzX2NwdV9yZWFkKHBlcl9jcHVfdmFyKGZ0cmFjZV9jcHVfZGlzYWJsZWQpKSkpCiAJCXJldHVybjsKIAogCWV2ZW50ID0gdHJhY2VfYnVmZmVyX2xvY2tfcmVzZXJ2ZShidWZmZXIsIFRSQUNFX0ZOLCBzaXplb2YoKmVudHJ5KSwKQEAgLTEzNjEsMTEgKzEzNjEsNyBAQAogCXBhdXNlX2dyYXBoX3RyYWNpbmcoKTsKIAlyYXdfbG9jYWxfaXJxX3NhdmUoaXJxX2ZsYWdzKTsKIAlfX3Jhd19zcGluX2xvY2soJnRyYWNlX2J1Zl9sb2NrKTsKLQlpZiAoYXJncyA9PSBOVUxMKSB7Ci0JCXN0cm5jcHkodHJhY2VfYnVmLCBmbXQsIFRSQUNFX0JVRl9TSVpFKTsKLQkJbGVuID0gc3RybGVuKHRyYWNlX2J1Zik7Ci0JfSBlbHNlCi0JCWxlbiA9IHZzbnByaW50Zih0cmFjZV9idWYsIFRSQUNFX0JVRl9TSVpFLCBmbXQsIGFyZ3MpOworCWxlbiA9IHZzbnByaW50Zih0cmFjZV9idWYsIFRSQUNFX0JVRl9TSVpFLCBmbXQsIGFyZ3MpOwogCiAJc2l6ZSA9IHNpemVvZigqZW50cnkpICsgbGVuICsgMTsKIAlidWZmZXIgPSB0ci0+YnVmZmVyOwpAQCAtMTUxNiw2ICsxNTEyLDggQEAKIAlpbnQgaSA9IChpbnQpKnBvczsKIAl2b2lkICplbnQ7CiAKKwlXQVJOX09OX09OQ0UoaXRlci0+bGVmdG92ZXIpOworCiAJKCpwb3MpKys7CiAKIAkvKiBjYW4ndCBnbyBiYWNrd2FyZHMgKi8KQEAgLTE2MTQsOCArMTYxMiwxNiBAQAogCQkJOwogCiAJfSBlbHNlIHsKLQkJbCA9ICpwb3MgLSAxOwotCQlwID0gc19uZXh0KG0sIHAsICZsKTsKKwkJLyoKKwkJICogSWYgd2Ugb3ZlcmZsb3dlZCB0aGUgc2VxX2ZpbGUgYmVmb3JlLCB0aGVuIHdlIHdhbnQKKwkJICogdG8ganVzdCByZXVzZSB0aGUgdHJhY2Vfc2VxIGJ1ZmZlciBhZ2Fpbi4KKwkJICovCisJCWlmIChpdGVyLT5sZWZ0b3ZlcikKKwkJCXAgPSBpdGVyOworCQllbHNlIHsKKwkJCWwgPSAqcG9zIC0gMTsKKwkJCXAgPSBzX25leHQobSwgcCwgJmwpOworCQl9CiAJfQogCiAJdHJhY2VfZXZlbnRfcmVhZF9sb2NrKCk7CkBAIC0xOTIzLDYgKzE5MjksNyBAQAogc3RhdGljIGludCBzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewogCXN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlciA9IHY7CisJaW50IHJldDsKIAogCWlmIChpdGVyLT5lbnQgPT0gTlVMTCkgewogCQlpZiAoaXRlci0+dHIpIHsKQEAgLTE5NDIsOSArMTk0OSwyNyBAQAogCQkJaWYgKCEodHJhY2VfZmxhZ3MgJiBUUkFDRV9JVEVSX1ZFUkJPU0UpKQogCQkJCXByaW50X2Z1bmNfaGVscF9oZWFkZXIobSk7CiAJCX0KKwl9IGVsc2UgaWYgKGl0ZXItPmxlZnRvdmVyKSB7CisJCS8qCisJCSAqIElmIHdlIGZpbGxlZCB0aGUgc2VxX2ZpbGUgYnVmZmVyIGVhcmxpZXIsIHdlCisJCSAqIHdhbnQgdG8ganVzdCBzaG93IGl0IG5vdy4KKwkJICovCisJCXJldCA9IHRyYWNlX3ByaW50X3NlcShtLCAmaXRlci0+c2VxKTsKKworCQkvKiByZXQgc2hvdWxkIHRoaXMgdGltZSBiZSB6ZXJvLCBidXQgeW91IG5ldmVyIGtub3cgKi8KKwkJaXRlci0+bGVmdG92ZXIgPSByZXQ7CisKIAl9IGVsc2UgewogCQlwcmludF90cmFjZV9saW5lKGl0ZXIpOwotCQl0cmFjZV9wcmludF9zZXEobSwgJml0ZXItPnNlcSk7CisJCXJldCA9IHRyYWNlX3ByaW50X3NlcShtLCAmaXRlci0+c2VxKTsKKwkJLyoKKwkJICogSWYgd2Ugb3ZlcmZsb3cgdGhlIHNlcV9maWxlIGJ1ZmZlciwgdGhlbiBpdCB3aWxsCisJCSAqIGFzayB1cyBmb3IgdGhpcyBkYXRhIGFnYWluIGF0IHN0YXJ0IHVwLgorCQkgKiBVc2UgdGhhdCBpbnN0ZWFkLgorCQkgKiAgcmV0IGlzIDAgaWYgc2VxX2ZpbGUgd3JpdGUgc3VjY2VlZGVkLgorCQkgKiAgICAgICAgLTEgb3RoZXJ3aXNlLgorCQkgKi8KKwkJaXRlci0+bGVmdG92ZXIgPSByZXQ7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0yODk4LDYgKzI5MjMsMTAgQEAKIAllbHNlCiAJCWNwdW1hc2tfY2xlYXJfY3B1KGl0ZXItPmNwdV9maWxlLCB0cmFjaW5nX3JlYWRlcl9jcHVtYXNrKTsKIAorCisJaWYgKGl0ZXItPnRyYWNlLT5waXBlX2Nsb3NlKQorCQlpdGVyLT50cmFjZS0+cGlwZV9jbG9zZShpdGVyKTsKKwogCW11dGV4X3VubG9jaygmdHJhY2VfdHlwZXNfbG9jayk7CiAKIAlmcmVlX2NwdW1hc2tfdmFyKGl0ZXItPnN0YXJ0ZWQpOwpAQCAtMzMyMCw2ICszMzQ5LDE2IEBACiAJcmV0dXJuIGNudDsKIH0KIAorc3RhdGljIGludCBtYXJrX3ByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwlpbnQgcmV0OworCXZhX2xpc3QgYXJnczsKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXJldCA9IHRyYWNlX3ZwcmludGsoMCwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHNzaXplX3QKIHRyYWNpbmdfbWFya193cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKnVidWYsCiAJCQkJCXNpemVfdCBjbnQsIGxvZmZfdCAqZnBvcykKQEAgLTMzNDYsNyArMzM4NSw3IEBACiAJfSBlbHNlCiAJCWJ1ZltjbnRdID0gJ1wwJzsKIAotCWNudCA9IHRyYWNlX3ZwcmludGsoMCwgYnVmLCBOVUxMKTsKKwljbnQgPSBtYXJrX3ByaW50aygiJXMiLCBidWYpOwogCWtmcmVlKGJ1Zik7CiAJKmZwb3MgKz0gY250OwogCkBAIC00NDE1LDcgKzQ0NTQsNyBAQAogCS8qIEFsbG9jYXRlIHRoZSBmaXJzdCBwYWdlIGZvciBhbGwgYnVmZmVycyAqLwogCWZvcl9lYWNoX3RyYWNpbmdfY3B1KGkpIHsKIAkJZ2xvYmFsX3RyYWNlLmRhdGFbaV0gPSAmcGVyX2NwdShnbG9iYWxfdHJhY2VfY3B1LCBpKTsKLQkJbWF4X3RyLmRhdGFbaV0gPSAmcGVyX2NwdShtYXhfZGF0YSwgaSk7CisJCW1heF90ci5kYXRhW2ldID0gJnBlcl9jcHUobWF4X3RyX2RhdGEsIGkpOwogCX0KIAogCXRyYWNlX2luaXRfY21kbGluZXMoKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZS5oIGIva2VybmVsL3RyYWNlL3RyYWNlLmgKaW5kZXggMWQ3ZjQ4My4uYTUyYmVkMiAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlLmgKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlLmgKQEAgLTI3Miw2ICsyNzIsNyBAQAogICogQHBpcGVfb3BlbjogY2FsbGVkIHdoZW4gdGhlIHRyYWNlX3BpcGUgZmlsZSBpcyBvcGVuZWQKICAqIEB3YWl0X3BpcGU6IG92ZXJyaWRlIGhvdyB0aGUgdXNlciB3YWl0cyBmb3IgdHJhY2VzIG9uIHRyYWNlX3BpcGUKICAqIEBjbG9zZTogY2FsbGVkIHdoZW4gdGhlIHRyYWNlIGZpbGUgaXMgcmVsZWFzZWQKKyAqIEBwaXBlX2Nsb3NlOiBjYWxsZWQgd2hlbiB0aGUgdHJhY2VfcGlwZSBmaWxlIGlzIHJlbGVhc2VkCiAgKiBAcmVhZDogb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcmVhZCBjYWxsYmFjayBvbiB0cmFjZV9waXBlCiAgKiBAc3BsaWNlX3JlYWQ6IG92ZXJyaWRlIHRoZSBkZWZhdWx0IHNwbGljZV9yZWFkIGNhbGxiYWNrIG9uIHRyYWNlX3BpcGUKICAqIEBzZWxmdGVzdDogc2VsZnRlc3QgdG8gcnVuIG9uIGJvb3QgKHNlZSB0cmFjZV9zZWxmdGVzdC5jKQpAQCAtMjkwLDYgKzI5MSw3IEBACiAJdm9pZAkJCSgqcGlwZV9vcGVuKShzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIpOwogCXZvaWQJCQkoKndhaXRfcGlwZSkoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyKTsKIAl2b2lkCQkJKCpjbG9zZSkoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyKTsKKwl2b2lkCQkJKCpwaXBlX2Nsb3NlKShzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIpOwogCXNzaXplX3QJCQkoKnJlYWQpKHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlciwKIAkJCQkJc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICp1YnVmLAogCQkJCQlzaXplX3QgY250LCBsb2ZmX3QgKnBwb3MpOwpAQCAtNDQxLDcgKzQ0Myw3IEBACiAKIGV4dGVybiBpbnQgcmluZ19idWZmZXJfZXhwYW5kZWQ7CiBleHRlcm4gYm9vbCB0cmFjaW5nX3NlbGZ0ZXN0X2Rpc2FibGVkOwotREVDTEFSRV9QRVJfQ1BVKGxvY2FsX3QsIGZ0cmFjZV9jcHVfZGlzYWJsZWQpOworREVDTEFSRV9QRVJfQ1BVKGludCwgZnRyYWNlX2NwdV9kaXNhYmxlZCk7CiAKICNpZmRlZiBDT05GSUdfRlRSQUNFX1NUQVJUVVBfVEVTVAogZXh0ZXJuIGludCB0cmFjZV9zZWxmdGVzdF9zdGFydHVwX2Z1bmN0aW9uKHN0cnVjdCB0cmFjZXIgKnRyYWNlLApkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2Z1bmN0aW9uc19ncmFwaC5jIGIva2VybmVsL3RyYWNlL3RyYWNlX2Z1bmN0aW9uc19ncmFwaC5jCmluZGV4IDQ1ZTZjMDEuLmIxMzQyYzUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9mdW5jdGlvbnNfZ3JhcGguYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZnVuY3Rpb25zX2dyYXBoLmMKQEAgLTE0LDkgKzE0LDIwIEBACiAjaW5jbHVkZSAidHJhY2UuaCIKICNpbmNsdWRlICJ0cmFjZV9vdXRwdXQuaCIKIAotc3RydWN0IGZncmFwaF9kYXRhIHsKK3N0cnVjdCBmZ3JhcGhfY3B1X2RhdGEgewogCXBpZF90CQlsYXN0X3BpZDsKIAlpbnQJCWRlcHRoOworCWludAkJaWdub3JlOworfTsKKworc3RydWN0IGZncmFwaF9kYXRhIHsKKwlzdHJ1Y3QgZmdyYXBoX2NwdV9kYXRhCQkqY3B1X2RhdGE7CisKKwkvKiBQbGFjZSB0byBwcmVzZXJ2ZSBsYXN0IHByb2Nlc3NlZCBlbnRyeS4gKi8KKwlzdHJ1Y3QgZnRyYWNlX2dyYXBoX2VudF9lbnRyeQllbnQ7CisJc3RydWN0IGZ0cmFjZV9ncmFwaF9yZXRfZW50cnkJcmV0OworCWludAkJCQlmYWlsZWQ7CisJaW50CQkJCWNwdTsKIH07CiAKICNkZWZpbmUgVFJBQ0VfR1JBUEhfSU5ERU5UCTIKQEAgLTE3Niw3ICsxODcsNyBAQAogCXN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyID0gdHItPmJ1ZmZlcjsKIAlzdHJ1Y3QgZnRyYWNlX2dyYXBoX2VudF9lbnRyeSAqZW50cnk7CiAKLQlpZiAodW5saWtlbHkobG9jYWxfcmVhZCgmX19nZXRfY3B1X3ZhcihmdHJhY2VfY3B1X2Rpc2FibGVkKSkpKQorCWlmICh1bmxpa2VseShfX3RoaXNfY3B1X3JlYWQocGVyX2NwdV92YXIoZnRyYWNlX2NwdV9kaXNhYmxlZCkpKSkKIAkJcmV0dXJuIDA7CiAKIAlldmVudCA9IHRyYWNlX2J1ZmZlcl9sb2NrX3Jlc2VydmUoYnVmZmVyLCBUUkFDRV9HUkFQSF9FTlQsCkBAIC0yNDAsNyArMjUxLDcgQEAKIAlzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlciA9IHRyLT5idWZmZXI7CiAJc3RydWN0IGZ0cmFjZV9ncmFwaF9yZXRfZW50cnkgKmVudHJ5OwogCi0JaWYgKHVubGlrZWx5KGxvY2FsX3JlYWQoJl9fZ2V0X2NwdV92YXIoZnRyYWNlX2NwdV9kaXNhYmxlZCkpKSkKKwlpZiAodW5saWtlbHkoX190aGlzX2NwdV9yZWFkKHBlcl9jcHVfdmFyKGZ0cmFjZV9jcHVfZGlzYWJsZWQpKSkpCiAJCXJldHVybjsKIAogCWV2ZW50ID0gdHJhY2VfYnVmZmVyX2xvY2tfcmVzZXJ2ZShidWZmZXIsIFRSQUNFX0dSQVBIX1JFVCwKQEAgLTM4NCw3ICszOTUsNyBAQAogCWlmICghZGF0YSkKIAkJcmV0dXJuIFRSQUNFX1RZUEVfSEFORExFRDsKIAotCWxhc3RfcGlkID0gJihwZXJfY3B1X3B0cihkYXRhLCBjcHUpLT5sYXN0X3BpZCk7CisJbGFzdF9waWQgPSAmKHBlcl9jcHVfcHRyKGRhdGEtPmNwdV9kYXRhLCBjcHUpLT5sYXN0X3BpZCk7CiAKIAlpZiAoKmxhc3RfcGlkID09IHBpZCkKIAkJcmV0dXJuIFRSQUNFX1RZUEVfSEFORExFRDsKQEAgLTQzNSwyNyArNDQ2LDUwIEBACiBnZXRfcmV0dXJuX2Zvcl9sZWFmKHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlciwKIAkJc3RydWN0IGZ0cmFjZV9ncmFwaF9lbnRfZW50cnkgKmN1cnIpCiB7Ci0Jc3RydWN0IHJpbmdfYnVmZmVyX2l0ZXIgKnJpbmdfaXRlcjsKKwlzdHJ1Y3QgZmdyYXBoX2RhdGEgKmRhdGEgPSBpdGVyLT5wcml2YXRlOworCXN0cnVjdCByaW5nX2J1ZmZlcl9pdGVyICpyaW5nX2l0ZXIgPSBOVUxMOwogCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7CiAJc3RydWN0IGZ0cmFjZV9ncmFwaF9yZXRfZW50cnkgKm5leHQ7CiAKLQlyaW5nX2l0ZXIgPSBpdGVyLT5idWZmZXJfaXRlcltpdGVyLT5jcHVdOworCS8qCisJICogSWYgdGhlIHByZXZpb3VzIG91dHB1dCBmYWlsZWQgdG8gd3JpdGUgdG8gdGhlIHNlcSBidWZmZXIsCisJICogdGhlbiB3ZSBqdXN0IHJldXNlIHRoZSBkYXRhIGZyb20gYmVmb3JlLgorCSAqLworCWlmIChkYXRhICYmIGRhdGEtPmZhaWxlZCkgeworCQljdXJyID0gJmRhdGEtPmVudDsKKwkJbmV4dCA9ICZkYXRhLT5yZXQ7CisJfSBlbHNlIHsKIAotCS8qIEZpcnN0IHBlZWsgdG8gY29tcGFyZSBjdXJyZW50IGVudHJ5IGFuZCB0aGUgbmV4dCBvbmUgKi8KLQlpZiAocmluZ19pdGVyKQotCQlldmVudCA9IHJpbmdfYnVmZmVyX2l0ZXJfcGVlayhyaW5nX2l0ZXIsIE5VTEwpOwotCWVsc2UgewotCS8qIFdlIG5lZWQgdG8gY29uc3VtZSB0aGUgY3VycmVudCBlbnRyeSB0byBzZWUgdGhlIG5leHQgb25lICovCi0JCXJpbmdfYnVmZmVyX2NvbnN1bWUoaXRlci0+dHItPmJ1ZmZlciwgaXRlci0+Y3B1LCBOVUxMKTsKLQkJZXZlbnQgPSByaW5nX2J1ZmZlcl9wZWVrKGl0ZXItPnRyLT5idWZmZXIsIGl0ZXItPmNwdSwKLQkJCQkJTlVMTCk7CisJCXJpbmdfaXRlciA9IGl0ZXItPmJ1ZmZlcl9pdGVyW2l0ZXItPmNwdV07CisKKwkJLyogRmlyc3QgcGVlayB0byBjb21wYXJlIGN1cnJlbnQgZW50cnkgYW5kIHRoZSBuZXh0IG9uZSAqLworCQlpZiAocmluZ19pdGVyKQorCQkJZXZlbnQgPSByaW5nX2J1ZmZlcl9pdGVyX3BlZWsocmluZ19pdGVyLCBOVUxMKTsKKwkJZWxzZSB7CisJCQkvKgorCQkJICogV2UgbmVlZCB0byBjb25zdW1lIHRoZSBjdXJyZW50IGVudHJ5IHRvIHNlZQorCQkJICogdGhlIG5leHQgb25lLgorCQkJICovCisJCQlyaW5nX2J1ZmZlcl9jb25zdW1lKGl0ZXItPnRyLT5idWZmZXIsIGl0ZXItPmNwdSwgTlVMTCk7CisJCQlldmVudCA9IHJpbmdfYnVmZmVyX3BlZWsoaXRlci0+dHItPmJ1ZmZlciwgaXRlci0+Y3B1LAorCQkJCQkJIE5VTEwpOworCQl9CisKKwkJaWYgKCFldmVudCkKKwkJCXJldHVybiBOVUxMOworCisJCW5leHQgPSByaW5nX2J1ZmZlcl9ldmVudF9kYXRhKGV2ZW50KTsKKworCQlpZiAoZGF0YSkgeworCQkJLyoKKwkJCSAqIFNhdmUgY3VycmVudCBhbmQgbmV4dCBlbnRyaWVzIGZvciBsYXRlciByZWZlcmVuY2UKKwkJCSAqIGlmIHRoZSBvdXRwdXQgZmFpbHMuCisJCQkgKi8KKwkJCWRhdGEtPmVudCA9ICpjdXJyOworCQkJZGF0YS0+cmV0ID0gKm5leHQ7CisJCX0KIAl9CiAKLQlpZiAoIWV2ZW50KQotCQlyZXR1cm4gTlVMTDsKLQotCW5leHQgPSByaW5nX2J1ZmZlcl9ldmVudF9kYXRhKGV2ZW50KTsKLQogCWlmIChuZXh0LT5lbnQudHlwZSAhPSBUUkFDRV9HUkFQSF9SRVQpCiAJCXJldHVybiBOVUxMOwogCkBAIC02NDAsNyArNjc0LDcgQEAKIAogCWlmIChkYXRhKSB7CiAJCWludCBjcHUgPSBpdGVyLT5jcHU7Ci0JCWludCAqZGVwdGggPSAmKHBlcl9jcHVfcHRyKGRhdGEsIGNwdSktPmRlcHRoKTsKKwkJaW50ICpkZXB0aCA9ICYocGVyX2NwdV9wdHIoZGF0YS0+Y3B1X2RhdGEsIGNwdSktPmRlcHRoKTsKIAogCQkvKgogCQkgKiBDb21tZW50cyBkaXNwbGF5IGF0ICsgMSB0byBkZXB0aC4gU2luY2UKQEAgLTY4OCw3ICs3MjIsNyBAQAogCiAJaWYgKGRhdGEpIHsKIAkJaW50IGNwdSA9IGl0ZXItPmNwdTsKLQkJaW50ICpkZXB0aCA9ICYocGVyX2NwdV9wdHIoZGF0YSwgY3B1KS0+ZGVwdGgpOworCQlpbnQgKmRlcHRoID0gJihwZXJfY3B1X3B0cihkYXRhLT5jcHVfZGF0YSwgY3B1KS0+ZGVwdGgpOwogCiAJCSpkZXB0aCA9IGNhbGwtPmRlcHRoOwogCX0KQEAgLTc4MiwxOSArODE2LDM0IEBACiBwcmludF9ncmFwaF9lbnRyeShzdHJ1Y3QgZnRyYWNlX2dyYXBoX2VudF9lbnRyeSAqZmllbGQsIHN0cnVjdCB0cmFjZV9zZXEgKnMsCiAJCQlzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIpCiB7Ci0JaW50IGNwdSA9IGl0ZXItPmNwdTsKKwlzdHJ1Y3QgZmdyYXBoX2RhdGEgKmRhdGEgPSBpdGVyLT5wcml2YXRlOwogCXN0cnVjdCBmdHJhY2VfZ3JhcGhfZW50ICpjYWxsID0gJmZpZWxkLT5ncmFwaF9lbnQ7CiAJc3RydWN0IGZ0cmFjZV9ncmFwaF9yZXRfZW50cnkgKmxlYWZfcmV0OworCXN0YXRpYyBlbnVtIHByaW50X2xpbmVfdCByZXQ7CisJaW50IGNwdSA9IGl0ZXItPmNwdTsKIAogCWlmIChwcmludF9ncmFwaF9wcm9sb2d1ZShpdGVyLCBzLCBUUkFDRV9HUkFQSF9FTlQsIGNhbGwtPmZ1bmMpKQogCQlyZXR1cm4gVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7CiAKIAlsZWFmX3JldCA9IGdldF9yZXR1cm5fZm9yX2xlYWYoaXRlciwgZmllbGQpOwogCWlmIChsZWFmX3JldCkKLQkJcmV0dXJuIHByaW50X2dyYXBoX2VudHJ5X2xlYWYoaXRlciwgZmllbGQsIGxlYWZfcmV0LCBzKTsKKwkJcmV0ID0gcHJpbnRfZ3JhcGhfZW50cnlfbGVhZihpdGVyLCBmaWVsZCwgbGVhZl9yZXQsIHMpOwogCWVsc2UKLQkJcmV0dXJuIHByaW50X2dyYXBoX2VudHJ5X25lc3RlZChpdGVyLCBmaWVsZCwgcywgY3B1KTsKKwkJcmV0ID0gcHJpbnRfZ3JhcGhfZW50cnlfbmVzdGVkKGl0ZXIsIGZpZWxkLCBzLCBjcHUpOwogCisJaWYgKGRhdGEpIHsKKwkJLyoKKwkJICogSWYgd2UgZmFpbGVkIHRvIHdyaXRlIG91ciBvdXRwdXQsIHRoZW4gd2UgbmVlZCB0byBtYWtlCisJCSAqIG5vdGUgb2YgaXQuIEJlY2F1c2Ugd2UgYWxyZWFkeSBjb25zdW1lZCBvdXIgZW50cnkuCisJCSAqLworCQlpZiAocy0+ZnVsbCkgeworCQkJZGF0YS0+ZmFpbGVkID0gMTsKKwkJCWRhdGEtPmNwdSA9IGNwdTsKKwkJfSBlbHNlCisJCQlkYXRhLT5mYWlsZWQgPSAwOworCX0KKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBlbnVtIHByaW50X2xpbmVfdApAQCAtODEwLDcgKzg1OSw3IEBACiAKIAlpZiAoZGF0YSkgewogCQlpbnQgY3B1ID0gaXRlci0+Y3B1OwotCQlpbnQgKmRlcHRoID0gJihwZXJfY3B1X3B0cihkYXRhLCBjcHUpLT5kZXB0aCk7CisJCWludCAqZGVwdGggPSAmKHBlcl9jcHVfcHRyKGRhdGEtPmNwdV9kYXRhLCBjcHUpLT5kZXB0aCk7CiAKIAkJLyoKIAkJICogQ29tbWVudHMgZGlzcGxheSBhdCArIDEgdG8gZGVwdGguIFRoaXMgaXMgdGhlCkBAIC04NzMsNyArOTIyLDcgQEAKIAlpbnQgaTsKIAogCWlmIChkYXRhKQotCQlkZXB0aCA9IHBlcl9jcHVfcHRyKGRhdGEsIGl0ZXItPmNwdSktPmRlcHRoOworCQlkZXB0aCA9IHBlcl9jcHVfcHRyKGRhdGEtPmNwdV9kYXRhLCBpdGVyLT5jcHUpLT5kZXB0aDsKIAogCWlmIChwcmludF9ncmFwaF9wcm9sb2d1ZShpdGVyLCBzLCAwLCAwKSkKIAkJcmV0dXJuIFRSQUNFX1RZUEVfUEFSVElBTF9MSU5FOwpAQCAtOTQxLDggKzk5MCwzMyBAQAogZW51bSBwcmludF9saW5lX3QKIHByaW50X2dyYXBoX2Z1bmN0aW9uKHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlcikKIHsKKwlzdHJ1Y3QgZnRyYWNlX2dyYXBoX2VudF9lbnRyeSAqZmllbGQ7CisJc3RydWN0IGZncmFwaF9kYXRhICpkYXRhID0gaXRlci0+cHJpdmF0ZTsKIAlzdHJ1Y3QgdHJhY2VfZW50cnkgKmVudHJ5ID0gaXRlci0+ZW50OwogCXN0cnVjdCB0cmFjZV9zZXEgKnMgPSAmaXRlci0+c2VxOworCWludCBjcHUgPSBpdGVyLT5jcHU7CisJaW50IHJldDsKKworCWlmIChkYXRhICYmIHBlcl9jcHVfcHRyKGRhdGEtPmNwdV9kYXRhLCBjcHUpLT5pZ25vcmUpIHsKKwkJcGVyX2NwdV9wdHIoZGF0YS0+Y3B1X2RhdGEsIGNwdSktPmlnbm9yZSA9IDA7CisJCXJldHVybiBUUkFDRV9UWVBFX0hBTkRMRUQ7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgbGFzdCBvdXRwdXQgZmFpbGVkLCB0aGVyZSdzIGEgcG9zc2liaWxpdHkgd2UgbmVlZAorCSAqIHRvIHByaW50IG91dCB0aGUgbWlzc2luZyBlbnRyeSB3aGljaCB3b3VsZCBuZXZlciBnbyBvdXQuCisJICovCisJaWYgKGRhdGEgJiYgZGF0YS0+ZmFpbGVkKSB7CisJCWZpZWxkID0gJmRhdGEtPmVudDsKKwkJaXRlci0+Y3B1ID0gZGF0YS0+Y3B1OworCQlyZXQgPSBwcmludF9ncmFwaF9lbnRyeShmaWVsZCwgcywgaXRlcik7CisJCWlmIChyZXQgPT0gVFJBQ0VfVFlQRV9IQU5ETEVEICYmIGl0ZXItPmNwdSAhPSBjcHUpIHsKKwkJCXBlcl9jcHVfcHRyKGRhdGEtPmNwdV9kYXRhLCBpdGVyLT5jcHUpLT5pZ25vcmUgPSAxOworCQkJcmV0ID0gVFJBQ0VfVFlQRV9OT19DT05TVU1FOworCQl9CisJCWl0ZXItPmNwdSA9IGNwdTsKKwkJcmV0dXJuIHJldDsKKwl9CiAKIAlzd2l0Y2ggKGVudHJ5LT50eXBlKSB7CiAJY2FzZSBUUkFDRV9HUkFQSF9FTlQ6IHsKQEAgLTk1Miw3ICsxMDI2LDcgQEAKIAkJICogc2l6ZW9mKHN0cnVjdCBmdHJhY2VfZ3JhcGhfZW50X2VudHJ5KSBpcyB2ZXJ5IHNtYWxsLAogCQkgKiBpdCBjYW4gYmUgc2FmZWx5IHNhdmVkIGF0IHRoZSBzdGFjay4KIAkJICovCi0JCXN0cnVjdCBmdHJhY2VfZ3JhcGhfZW50X2VudHJ5ICpmaWVsZCwgc2F2ZWQ7CisJCXN0cnVjdCBmdHJhY2VfZ3JhcGhfZW50X2VudHJ5IHNhdmVkOwogCQl0cmFjZV9hc3NpZ25fdHlwZShmaWVsZCwgZW50cnkpOwogCQlzYXZlZCA9ICpmaWVsZDsKIAkJcmV0dXJuIHByaW50X2dyYXBoX2VudHJ5KCZzYXZlZCwgcywgaXRlcik7CkBAIC0xMDMwLDMxICsxMTA0LDU0IEBACiBzdGF0aWMgdm9pZCBncmFwaF90cmFjZV9vcGVuKHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlcikKIHsKIAkvKiBwaWQgYW5kIGRlcHRoIG9uIHRoZSBsYXN0IHRyYWNlIHByb2Nlc3NlZCAqLwotCXN0cnVjdCBmZ3JhcGhfZGF0YSAqZGF0YSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgZmdyYXBoX2RhdGEpOworCXN0cnVjdCBmZ3JhcGhfZGF0YSAqZGF0YTsKIAlpbnQgY3B1OwogCisJaXRlci0+cHJpdmF0ZSA9IE5VTEw7CisKKwlkYXRhID0ga3phbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEpCi0JCXByX3dhcm5pbmcoImZ1bmN0aW9uIGdyYXBoIHRyYWNlcjogbm90IGVub3VnaCBtZW1vcnlcbiIpOwotCWVsc2UKLQkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewotCQkJcGlkX3QgKnBpZCA9ICYocGVyX2NwdV9wdHIoZGF0YSwgY3B1KS0+bGFzdF9waWQpOwotCQkJaW50ICpkZXB0aCA9ICYocGVyX2NwdV9wdHIoZGF0YSwgY3B1KS0+ZGVwdGgpOwotCQkJKnBpZCA9IC0xOwotCQkJKmRlcHRoID0gMDsKLQkJfQorCQlnb3RvIG91dF9lcnI7CisKKwlkYXRhLT5jcHVfZGF0YSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgZmdyYXBoX2NwdV9kYXRhKTsKKwlpZiAoIWRhdGEtPmNwdV9kYXRhKQorCQlnb3RvIG91dF9lcnJfZnJlZTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJcGlkX3QgKnBpZCA9ICYocGVyX2NwdV9wdHIoZGF0YS0+Y3B1X2RhdGEsIGNwdSktPmxhc3RfcGlkKTsKKwkJaW50ICpkZXB0aCA9ICYocGVyX2NwdV9wdHIoZGF0YS0+Y3B1X2RhdGEsIGNwdSktPmRlcHRoKTsKKwkJaW50ICppZ25vcmUgPSAmKHBlcl9jcHVfcHRyKGRhdGEtPmNwdV9kYXRhLCBjcHUpLT5pZ25vcmUpOworCQkqcGlkID0gLTE7CisJCSpkZXB0aCA9IDA7CisJCSppZ25vcmUgPSAwOworCX0KIAogCWl0ZXItPnByaXZhdGUgPSBkYXRhOworCisJcmV0dXJuOworCisgb3V0X2Vycl9mcmVlOgorCWtmcmVlKGRhdGEpOworIG91dF9lcnI6CisJcHJfd2FybmluZygiZnVuY3Rpb24gZ3JhcGggdHJhY2VyOiBub3QgZW5vdWdoIG1lbW9yeVxuIik7CiB9CiAKIHN0YXRpYyB2b2lkIGdyYXBoX3RyYWNlX2Nsb3NlKHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlcikKIHsKLQlmcmVlX3BlcmNwdShpdGVyLT5wcml2YXRlKTsKKwlzdHJ1Y3QgZmdyYXBoX2RhdGEgKmRhdGEgPSBpdGVyLT5wcml2YXRlOworCisJaWYgKGRhdGEpIHsKKwkJZnJlZV9wZXJjcHUoZGF0YS0+Y3B1X2RhdGEpOworCQlrZnJlZShkYXRhKTsKKwl9CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdHJhY2VyIGdyYXBoX3RyYWNlIF9fcmVhZF9tb3N0bHkgPSB7CiAJLm5hbWUJCT0gImZ1bmN0aW9uX2dyYXBoIiwKIAkub3BlbgkJPSBncmFwaF90cmFjZV9vcGVuLAorCS5waXBlX29wZW4JPSBncmFwaF90cmFjZV9vcGVuLAogCS5jbG9zZQkJPSBncmFwaF90cmFjZV9jbG9zZSwKKwkucGlwZV9jbG9zZQk9IGdyYXBoX3RyYWNlX2Nsb3NlLAogCS53YWl0X3BpcGUJPSBwb2xsX3dhaXRfcGlwZSwKIAkuaW5pdAkJPSBncmFwaF90cmFjZV9pbml0LAogCS5yZXNldAkJPSBncmFwaF90cmFjZV9yZXNldCwKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9od19icmFuY2hlcy5jIGIva2VybmVsL3RyYWNlL3RyYWNlX2h3X2JyYW5jaGVzLmMKaW5kZXggNjk1NDNhOS4uN2I5NzAwMCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2h3X2JyYW5jaGVzLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2h3X2JyYW5jaGVzLmMKQEAgLTIwLDEwICsyMCwxMCBAQAogCiAjZGVmaW5lIEJUU19CVUZGRVJfU0laRSAoMSA8PCAxMykKIAotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBidHNfdHJhY2VyICosIHRyYWNlcik7Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgY2hhcltCVFNfQlVGRkVSX1NJWkVdLCBidWZmZXIpOworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBidHNfdHJhY2VyICosIGh3Yl90cmFjZXIpOworc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGNoYXJbQlRTX0JVRkZFUl9TSVpFXSwgaHdiX2J1ZmZlcik7CiAKLSNkZWZpbmUgdGhpc190cmFjZXIgcGVyX2NwdSh0cmFjZXIsIHNtcF9wcm9jZXNzb3JfaWQoKSkKKyNkZWZpbmUgdGhpc190cmFjZXIgcGVyX2NwdShod2JfdHJhY2VyLCBzbXBfcHJvY2Vzc29yX2lkKCkpCiAKIHN0YXRpYyBpbnQgdHJhY2VfaHdfYnJhbmNoZXNfZW5hYmxlZCBfX3JlYWRfbW9zdGx5Owogc3RhdGljIGludCB0cmFjZV9od19icmFuY2hlc19zdXNwZW5kZWQgX19yZWFkX21vc3RseTsKQEAgLTMyLDEyICszMiwxMyBAQAogCiBzdGF0aWMgdm9pZCBidHNfdHJhY2VfaW5pdF9jcHUoaW50IGNwdSkKIHsKLQlwZXJfY3B1KHRyYWNlciwgY3B1KSA9Ci0JCWRzX3JlcXVlc3RfYnRzX2NwdShjcHUsIHBlcl9jcHUoYnVmZmVyLCBjcHUpLCBCVFNfQlVGRkVSX1NJWkUsCi0JCQkJICAgTlVMTCwgKHNpemVfdCktMSwgQlRTX0tFUk5FTCk7CisJcGVyX2NwdShod2JfdHJhY2VyLCBjcHUpID0KKwkJZHNfcmVxdWVzdF9idHNfY3B1KGNwdSwgcGVyX2NwdShod2JfYnVmZmVyLCBjcHUpLAorCQkJCSAgIEJUU19CVUZGRVJfU0laRSwgTlVMTCwgKHNpemVfdCktMSwKKwkJCQkgICBCVFNfS0VSTkVMKTsKIAotCWlmIChJU19FUlIocGVyX2NwdSh0cmFjZXIsIGNwdSkpKQotCQlwZXJfY3B1KHRyYWNlciwgY3B1KSA9IE5VTEw7CisJaWYgKElTX0VSUihwZXJfY3B1KGh3Yl90cmFjZXIsIGNwdSkpKQorCQlwZXJfY3B1KGh3Yl90cmFjZXIsIGNwdSkgPSBOVUxMOwogfQogCiBzdGF0aWMgaW50IGJ0c190cmFjZV9pbml0KHN0cnVjdCB0cmFjZV9hcnJheSAqdHIpCkBAIC01MSw3ICs1Miw3IEBACiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKIAkJYnRzX3RyYWNlX2luaXRfY3B1KGNwdSk7CiAKLQkJaWYgKGxpa2VseShwZXJfY3B1KHRyYWNlciwgY3B1KSkpCisJCWlmIChsaWtlbHkocGVyX2NwdShod2JfdHJhY2VyLCBjcHUpKSkKIAkJCXRyYWNlX2h3X2JyYW5jaGVzX2VuYWJsZWQgPSAxOwogCX0KIAl0cmFjZV9od19icmFuY2hlc19zdXNwZW5kZWQgPSAwOwpAQCAtNjcsOSArNjgsOSBAQAogCiAJZ2V0X29ubGluZV9jcHVzKCk7CiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKLQkJaWYgKGxpa2VseShwZXJfY3B1KHRyYWNlciwgY3B1KSkpIHsKLQkJCWRzX3JlbGVhc2VfYnRzKHBlcl9jcHUodHJhY2VyLCBjcHUpKTsKLQkJCXBlcl9jcHUodHJhY2VyLCBjcHUpID0gTlVMTDsKKwkJaWYgKGxpa2VseShwZXJfY3B1KGh3Yl90cmFjZXIsIGNwdSkpKSB7CisJCQlkc19yZWxlYXNlX2J0cyhwZXJfY3B1KGh3Yl90cmFjZXIsIGNwdSkpOworCQkJcGVyX2NwdShod2JfdHJhY2VyLCBjcHUpID0gTlVMTDsKIAkJfQogCX0KIAl0cmFjZV9od19icmFuY2hlc19lbmFibGVkID0gMDsKQEAgLTgzLDggKzg0LDggQEAKIAogCWdldF9vbmxpbmVfY3B1cygpOwogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQotCQlpZiAobGlrZWx5KHBlcl9jcHUodHJhY2VyLCBjcHUpKSkKLQkJCWRzX3Jlc3VtZV9idHMocGVyX2NwdSh0cmFjZXIsIGNwdSkpOworCQlpZiAobGlrZWx5KHBlcl9jcHUoaHdiX3RyYWNlciwgY3B1KSkpCisJCQlkc19yZXN1bWVfYnRzKHBlcl9jcHUoaHdiX3RyYWNlciwgY3B1KSk7CiAJdHJhY2VfaHdfYnJhbmNoZXNfc3VzcGVuZGVkID0gMDsKIAlwdXRfb25saW5lX2NwdXMoKTsKIH0KQEAgLTk1LDggKzk2LDggQEAKIAogCWdldF9vbmxpbmVfY3B1cygpOwogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQotCQlpZiAobGlrZWx5KHBlcl9jcHUodHJhY2VyLCBjcHUpKSkKLQkJCWRzX3N1c3BlbmRfYnRzKHBlcl9jcHUodHJhY2VyLCBjcHUpKTsKKwkJaWYgKGxpa2VseShwZXJfY3B1KGh3Yl90cmFjZXIsIGNwdSkpKQorCQkJZHNfc3VzcGVuZF9idHMocGVyX2NwdShod2JfdHJhY2VyLCBjcHUpKTsKIAl0cmFjZV9od19icmFuY2hlc19zdXNwZW5kZWQgPSAxOwogCXB1dF9vbmxpbmVfY3B1cygpOwogfQpAQCAtMTE0LDE2ICsxMTUsMTYgQEAKIAkJCWJ0c190cmFjZV9pbml0X2NwdShjcHUpOwogCiAJCQlpZiAodHJhY2VfaHdfYnJhbmNoZXNfc3VzcGVuZGVkICYmCi0JCQkgICAgbGlrZWx5KHBlcl9jcHUodHJhY2VyLCBjcHUpKSkKLQkJCQlkc19zdXNwZW5kX2J0cyhwZXJfY3B1KHRyYWNlciwgY3B1KSk7CisJCQkgICAgbGlrZWx5KHBlcl9jcHUoaHdiX3RyYWNlciwgY3B1KSkpCisJCQkJZHNfc3VzcGVuZF9idHMocGVyX2NwdShod2JfdHJhY2VyLCBjcHUpKTsKIAkJfQogCQlicmVhazsKIAogCWNhc2UgQ1BVX0RPV05fUFJFUEFSRToKIAkJLyogVGhlIG5vdGlmaWNhdGlvbiBpcyBzZW50IHdpdGggaW50ZXJydXB0cyBlbmFibGVkLiAqLwotCQlpZiAobGlrZWx5KHBlcl9jcHUodHJhY2VyLCBjcHUpKSkgewotCQkJZHNfcmVsZWFzZV9idHMocGVyX2NwdSh0cmFjZXIsIGNwdSkpOwotCQkJcGVyX2NwdSh0cmFjZXIsIGNwdSkgPSBOVUxMOworCQlpZiAobGlrZWx5KHBlcl9jcHUoaHdiX3RyYWNlciwgY3B1KSkpIHsKKwkJCWRzX3JlbGVhc2VfYnRzKHBlcl9jcHUoaHdiX3RyYWNlciwgY3B1KSk7CisJCQlwZXJfY3B1KGh3Yl90cmFjZXIsIGNwdSkgPSBOVUxMOwogCQl9CiAJfQogCkBAIC0yNTgsOCArMjU5LDggQEAKIAogCWdldF9vbmxpbmVfY3B1cygpOwogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQotCQlpZiAobGlrZWx5KHBlcl9jcHUodHJhY2VyLCBjcHUpKSkKLQkJCWRzX3N1c3BlbmRfYnRzKHBlcl9jcHUodHJhY2VyLCBjcHUpKTsKKwkJaWYgKGxpa2VseShwZXJfY3B1KGh3Yl90cmFjZXIsIGNwdSkpKQorCQkJZHNfc3VzcGVuZF9idHMocGVyX2NwdShod2JfdHJhY2VyLCBjcHUpKTsKIAkvKgogCSAqIFdlIG5lZWQgdG8gY29sbGVjdCB0aGUgdHJhY2Ugb24gdGhlIHJlc3BlY3RpdmUgY3B1IHNpbmNlIGZ0cmFjZQogCSAqIGltcGxpY2l0bHkgYWRkcyB0aGUgcmVjb3JkIGZvciB0aGUgY3VycmVudCBjcHUuCkBAIC0yNjgsOCArMjY5LDggQEAKIAlvbl9lYWNoX2NwdSh0cmFjZV9idHNfY3B1LCBpdGVyLT50ciwgMSk7CiAKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKLQkJaWYgKGxpa2VseShwZXJfY3B1KHRyYWNlciwgY3B1KSkpCi0JCQlkc19yZXN1bWVfYnRzKHBlcl9jcHUodHJhY2VyLCBjcHUpKTsKKwkJaWYgKGxpa2VseShwZXJfY3B1KGh3Yl90cmFjZXIsIGNwdSkpKQorCQkJZHNfcmVzdW1lX2J0cyhwZXJfY3B1KGh3Yl90cmFjZXIsIGNwdSkpOwogCXB1dF9vbmxpbmVfY3B1cygpOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2Vfa3Byb2JlLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfa3Byb2JlLmMKaW5kZXggYWZmNWY4MC4uYjUyZDM5NyAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2twcm9iZS5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9rcHJvYmUuYwpAQCAtNjA2LDIzICs2MDYsMjIgQEAKIAkgKi8KIAlzdHJ1Y3QgdHJhY2VfcHJvYmUgKnRwOwogCWludCBpLCByZXQgPSAwOwotCWludCBpc19yZXR1cm4gPSAwOworCWludCBpc19yZXR1cm4gPSAwLCBpc19kZWxldGUgPSAwOwogCWNoYXIgKnN5bWJvbCA9IE5VTEwsICpldmVudCA9IE5VTEwsICphcmcgPSBOVUxMLCAqZ3JvdXAgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gMDsKIAl2b2lkICphZGRyID0gTlVMTDsKIAljaGFyIGJ1ZltNQVhfRVZFTlRfTkFNRV9MRU5dOwogCi0JaWYgKGFyZ2MgPCAyKSB7Ci0JCXByX2luZm8oIlByb2JlIHBvaW50IGlzIG5vdCBzcGVjaWZpZWQuXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCisJLyogYXJnYyBtdXN0IGJlID49IDEgKi8KIAlpZiAoYXJndlswXVswXSA9PSAncCcpCiAJCWlzX3JldHVybiA9IDA7CiAJZWxzZSBpZiAoYXJndlswXVswXSA9PSAncicpCiAJCWlzX3JldHVybiA9IDE7CisJZWxzZSBpZiAoYXJndlswXVswXSA9PSAnLScpCisJCWlzX2RlbGV0ZSA9IDE7CiAJZWxzZSB7Ci0JCXByX2luZm8oIlByb2JlIGRlZmluaXRpb24gbXVzdCBiZSBzdGFydGVkIHdpdGggJ3AnIG9yICdyJy5cbiIpOworCQlwcl9pbmZvKCJQcm9iZSBkZWZpbml0aW9uIG11c3QgYmUgc3RhcnRlZCB3aXRoICdwJywgJ3InIG9yIgorCQkJIiAnLScuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC02NDIsNyArNjQxLDI5IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KKwlpZiAoIWdyb3VwKQorCQlncm91cCA9IEtQUk9CRV9FVkVOVF9TWVNURU07CiAKKwlpZiAoaXNfZGVsZXRlKSB7CisJCWlmICghZXZlbnQpIHsKKwkJCXByX2luZm8oIkRlbGV0ZSBjb21tYW5kIG5lZWRzIGFuIGV2ZW50IG5hbWUuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXRwID0gZmluZF9wcm9iZV9ldmVudChldmVudCwgZ3JvdXApOworCQlpZiAoIXRwKSB7CisJCQlwcl9pbmZvKCJFdmVudCAlcy8lcyBkb2Vzbid0IGV4aXN0LlxuIiwgZ3JvdXAsIGV2ZW50KTsKKwkJCXJldHVybiAtRU5PRU5UOworCQl9CisJCS8qIGRlbGV0ZSBhbiBldmVudCAqLworCQl1bnJlZ2lzdGVyX3RyYWNlX3Byb2JlKHRwKTsKKwkJZnJlZV90cmFjZV9wcm9iZSh0cCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChhcmdjIDwgMikgeworCQlwcl9pbmZvKCJQcm9iZSBwb2ludCBpcyBub3Qgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAlpZiAoaXNkaWdpdChhcmd2WzFdWzBdKSkgewogCQlpZiAoaXNfcmV0dXJuKSB7CiAJCQlwcl9pbmZvKCJSZXR1cm4gcHJvYmUgcG9pbnQgbXVzdCBiZSBhIHN5bWJvbC5cbiIpOwpAQCAtNjcxLDggKzY5Miw2IEBACiAJYXJnYyAtPSAyOyBhcmd2ICs9IDI7CiAKIAkvKiBzZXR1cCBhIHByb2JlICovCi0JaWYgKCFncm91cCkKLQkJZ3JvdXAgPSBLUFJPQkVfRVZFTlRfU1lTVEVNOwogCWlmICghZXZlbnQpIHsKIAkJLyogTWFrZSBhIG5ldyBldmVudCBuYW1lICovCiAJCWlmIChzeW1ib2wpCkBAIC0xMTE0LDcgKzExMzMsNyBAQAogCXN0cnVjdCB0cmFjZV9wcm9iZSAqdHAgPSAoc3RydWN0IHRyYWNlX3Byb2JlICopZXZlbnRfY2FsbC0+ZGF0YTsKIAogCXJldCA9IHRyYWNlX2RlZmluZV9jb21tb25fZmllbGRzKGV2ZW50X2NhbGwpOwotCWlmICghcmV0KQorCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAlERUZJTkVfRklFTEQodW5zaWduZWQgbG9uZywgaXAsIEZJRUxEX1NUUklOR19JUCwgMCk7CkBAIC0xMTMyLDcgKzExNTEsNyBAQAogCXN0cnVjdCB0cmFjZV9wcm9iZSAqdHAgPSAoc3RydWN0IHRyYWNlX3Byb2JlICopZXZlbnRfY2FsbC0+ZGF0YTsKIAogCXJldCA9IHRyYWNlX2RlZmluZV9jb21tb25fZmllbGRzKGV2ZW50X2NhbGwpOwotCWlmICghcmV0KQorCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAlERUZJTkVfRklFTEQodW5zaWduZWQgbG9uZywgZnVuYywgRklFTERfU1RSSU5HX0ZVTkMsIDApOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2tzeW0uYyBiL2tlcm5lbC90cmFjZS90cmFjZV9rc3ltLmMKaW5kZXggZGRmYTBmZC4uYWNiODdkNCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2tzeW0uYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfa3N5bS5jCkBAIC03OSwxMSArNzksMTIgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfUFJPRklMRV9LU1lNX1RSQUNFUiAqLwogCi12b2lkIGtzeW1faGJwX2hhbmRsZXIoc3RydWN0IHBlcmZfZXZlbnQgKmhicCwgdm9pZCAqZGF0YSkKK3ZvaWQga3N5bV9oYnBfaGFuZGxlcihzdHJ1Y3QgcGVyZl9ldmVudCAqaGJwLCBpbnQgbm1pLAorCQkgICAgICBzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSAqZGF0YSwKKwkJICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudDsKIAlzdHJ1Y3Qga3N5bV90cmFjZV9lbnRyeSAqZW50cnk7Ci0Jc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBkYXRhOwogCXN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyOwogCWludCBwYzsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX291dHB1dC5jIGIva2VybmVsL3RyYWNlL3RyYWNlX291dHB1dC5jCmluZGV4IGI2YzEyYzYuLjhlNDZiMzMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9vdXRwdXQuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfb3V0cHV0LmMKQEAgLTIzLDEzICsyMywyMSBAQAogCiBzdGF0aWMgaW50IG5leHRfZXZlbnRfdHlwZSA9IF9fVFJBQ0VfTEFTVF9UWVBFICsgMTsKIAotdm9pZCB0cmFjZV9wcmludF9zZXEoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgdHJhY2Vfc2VxICpzKQoraW50IHRyYWNlX3ByaW50X3NlcShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCB0cmFjZV9zZXEgKnMpCiB7CiAJaW50IGxlbiA9IHMtPmxlbiA+PSBQQUdFX1NJWkUgPyBQQUdFX1NJWkUgLSAxIDogcy0+bGVuOworCWludCByZXQ7CiAKLQlzZXFfd3JpdGUobSwgcy0+YnVmZmVyLCBsZW4pOworCXJldCA9IHNlcV93cml0ZShtLCBzLT5idWZmZXIsIGxlbik7CiAKLQl0cmFjZV9zZXFfaW5pdChzKTsKKwkvKgorCSAqIE9ubHkgcmVzZXQgdGhpcyBidWZmZXIgaWYgd2Ugc3VjY2Vzc2Z1bGx5IHdyb3RlIHRvIHRoZQorCSAqIHNlcV9maWxlIGJ1ZmZlci4KKwkgKi8KKwlpZiAoIXJldCkKKwkJdHJhY2Vfc2VxX2luaXQocyk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBlbnVtIHByaW50X2xpbmVfdCB0cmFjZV9wcmludF9icHJpbnRrX21zZ19vbmx5KHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlcikKQEAgLTg1LDcgKzkzLDcgQEAKIAl2YV9saXN0IGFwOwogCWludCByZXQ7CiAKLQlpZiAoIWxlbikKKwlpZiAocy0+ZnVsbCB8fCAhbGVuKQogCQlyZXR1cm4gMDsKIAogCXZhX3N0YXJ0KGFwLCBmbXQpOwpAQCAtOTMsOCArMTAxLDEwIEBACiAJdmFfZW5kKGFwKTsKIAogCS8qIElmIHdlIGNhbid0IHdyaXRlIGl0IGFsbCwgZG9uJ3QgYm90aGVyIHdyaXRpbmcgYW55dGhpbmcgKi8KLQlpZiAocmV0ID49IGxlbikKKwlpZiAocmV0ID49IGxlbikgeworCQlzLT5mdWxsID0gMTsKIAkJcmV0dXJuIDA7CisJfQogCiAJcy0+bGVuICs9IHJldDsKIApAQCAtMTE5LDE0ICsxMjksMTYgQEAKIAlpbnQgbGVuID0gKFBBR0VfU0laRSAtIDEpIC0gcy0+bGVuOwogCWludCByZXQ7CiAKLQlpZiAoIWxlbikKKwlpZiAocy0+ZnVsbCB8fCAhbGVuKQogCQlyZXR1cm4gMDsKIAogCXJldCA9IHZzbnByaW50ZihzLT5idWZmZXIgKyBzLT5sZW4sIGxlbiwgZm10LCBhcmdzKTsKIAogCS8qIElmIHdlIGNhbid0IHdyaXRlIGl0IGFsbCwgZG9uJ3QgYm90aGVyIHdyaXRpbmcgYW55dGhpbmcgKi8KLQlpZiAocmV0ID49IGxlbikKKwlpZiAocmV0ID49IGxlbikgeworCQlzLT5mdWxsID0gMTsKIAkJcmV0dXJuIDA7CisJfQogCiAJcy0+bGVuICs9IHJldDsKIApAQCAtMTM5LDE0ICsxNTEsMTYgQEAKIAlpbnQgbGVuID0gKFBBR0VfU0laRSAtIDEpIC0gcy0+bGVuOwogCWludCByZXQ7CiAKLQlpZiAoIWxlbikKKwlpZiAocy0+ZnVsbCB8fCAhbGVuKQogCQlyZXR1cm4gMDsKIAogCXJldCA9IGJzdHJfcHJpbnRmKHMtPmJ1ZmZlciArIHMtPmxlbiwgbGVuLCBmbXQsIGJpbmFyeSk7CiAKIAkvKiBJZiB3ZSBjYW4ndCB3cml0ZSBpdCBhbGwsIGRvbid0IGJvdGhlciB3cml0aW5nIGFueXRoaW5nICovCi0JaWYgKHJldCA+PSBsZW4pCisJaWYgKHJldCA+PSBsZW4pIHsKKwkJcy0+ZnVsbCA9IDE7CiAJCXJldHVybiAwOworCX0KIAogCXMtPmxlbiArPSByZXQ7CiAKQEAgLTE2Nyw5ICsxODEsMTQgQEAKIHsKIAlpbnQgbGVuID0gc3RybGVuKHN0cik7CiAKLQlpZiAobGVuID4gKChQQUdFX1NJWkUgLSAxKSAtIHMtPmxlbikpCisJaWYgKHMtPmZ1bGwpCiAJCXJldHVybiAwOwogCisJaWYgKGxlbiA+ICgoUEFHRV9TSVpFIC0gMSkgLSBzLT5sZW4pKSB7CisJCXMtPmZ1bGwgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKIAltZW1jcHkocy0+YnVmZmVyICsgcy0+bGVuLCBzdHIsIGxlbik7CiAJcy0+bGVuICs9IGxlbjsKIApAQCAtMTc4LDkgKzE5NywxNCBAQAogCiBpbnQgdHJhY2Vfc2VxX3B1dGMoc3RydWN0IHRyYWNlX3NlcSAqcywgdW5zaWduZWQgY2hhciBjKQogewotCWlmIChzLT5sZW4gPj0gKFBBR0VfU0laRSAtIDEpKQorCWlmIChzLT5mdWxsKQogCQlyZXR1cm4gMDsKIAorCWlmIChzLT5sZW4gPj0gKFBBR0VfU0laRSAtIDEpKSB7CisJCXMtPmZ1bGwgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKIAlzLT5idWZmZXJbcy0+bGVuKytdID0gYzsKIAogCXJldHVybiAxOwpAQCAtMTg4LDkgKzIxMiwxNCBAQAogCiBpbnQgdHJhY2Vfc2VxX3B1dG1lbShzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCB2b2lkICptZW0sIHNpemVfdCBsZW4pCiB7Ci0JaWYgKGxlbiA+ICgoUEFHRV9TSVpFIC0gMSkgLSBzLT5sZW4pKQorCWlmIChzLT5mdWxsKQogCQlyZXR1cm4gMDsKIAorCWlmIChsZW4gPiAoKFBBR0VfU0laRSAtIDEpIC0gcy0+bGVuKSkgeworCQlzLT5mdWxsID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCiAJbWVtY3B5KHMtPmJ1ZmZlciArIHMtPmxlbiwgbWVtLCBsZW4pOwogCXMtPmxlbiArPSBsZW47CiAKQEAgLTIwMyw2ICsyMzIsOSBAQAogCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEgPSBtZW07CiAJaW50IGksIGo7CiAKKwlpZiAocy0+ZnVsbCkKKwkJcmV0dXJuIDA7CisKICNpZmRlZiBfX0JJR19FTkRJQU4KIAlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAjZWxzZQpAQCAtMjIwLDggKzI1MiwxMyBAQAogewogCXZvaWQgKnJldDsKIAotCWlmIChsZW4gPiAoKFBBR0VfU0laRSAtIDEpIC0gcy0+bGVuKSkKKwlpZiAocy0+ZnVsbCkKKwkJcmV0dXJuIDA7CisKKwlpZiAobGVuID4gKChQQUdFX1NJWkUgLSAxKSAtIHMtPmxlbikpIHsKKwkJcy0+ZnVsbCA9IDE7CiAJCXJldHVybiBOVUxMOworCX0KIAogCXJldCA9IHMtPmJ1ZmZlciArIHMtPmxlbjsKIAlzLT5sZW4gKz0gbGVuOwpAQCAtMjMzLDggKzI3MCwxNCBAQAogewogCXVuc2lnbmVkIGNoYXIgKnA7CiAKLQlpZiAocy0+bGVuID49IChQQUdFX1NJWkUgLSAxKSkKKwlpZiAocy0+ZnVsbCkKIAkJcmV0dXJuIDA7CisKKwlpZiAocy0+bGVuID49IChQQUdFX1NJWkUgLSAxKSkgeworCQlzLT5mdWxsID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCiAJcCA9IGRfcGF0aChwYXRoLCBzLT5idWZmZXIgKyBzLT5sZW4sIFBBR0VfU0laRSAtIHMtPmxlbik7CiAJaWYgKCFJU19FUlIocCkpIHsKIAkJcCA9IG1hbmdsZV9wYXRoKHMtPmJ1ZmZlciArIHMtPmxlbiwgcCwgIlxuIik7CkBAIC0yNDcsNiArMjkwLDcgQEAKIAkJcmV0dXJuIDE7CiAJfQogCisJcy0+ZnVsbCA9IDE7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM3Myw2ICs0MTcsOSBAQAogCXVuc2lnbmVkIGxvbmcgdm1zdGFydCA9IDA7CiAJaW50IHJldCA9IDE7CiAKKwlpZiAocy0+ZnVsbCkKKwkJcmV0dXJuIDA7CisKIAlpZiAobW0pIHsKIAkJY29uc3Qgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiAKZGlmZiAtLWdpdCBhL2xpYi9jaGVja3N1bS5jIGIvbGliL2NoZWNrc3VtLmMKaW5kZXggYjJlMmZkNC4uMDk3NTA4NyAxMDA2NDQKLS0tIGEvbGliL2NoZWNrc3VtLmMKKysrIGIvbGliL2NoZWNrc3VtLmMKQEAgLTM3LDcgKzM3LDggQEAKIAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBmcm9tMzJ0bzE2KHVuc2lnbmVkIGxvbmcgeCkKKyNpZm5kZWYgZG9fY3N1bQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBmcm9tMzJ0bzE2KHVuc2lnbmVkIGludCB4KQogewogCS8qIGFkZCB1cCAxNi1iaXQgYW5kIDE2LWJpdCBmb3IgMTYrYyBiaXQgKi8KIAl4ID0gKHggJiAweGZmZmYpICsgKHggPj4gMTYpOwpAQCAtNDksMTYgKzUwLDE2IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IGRvX2NzdW0oY29uc3QgdW5zaWduZWQgY2hhciAqYnVmZiwgaW50IGxlbikKIHsKIAlpbnQgb2RkLCBjb3VudDsKLQl1bnNpZ25lZCBsb25nIHJlc3VsdCA9IDA7CisJdW5zaWduZWQgaW50IHJlc3VsdCA9IDA7CiAKIAlpZiAobGVuIDw9IDApCiAJCWdvdG8gb3V0OwogCW9kZCA9IDEgJiAodW5zaWduZWQgbG9uZykgYnVmZjsKIAlpZiAob2RkKSB7CiAjaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0JCXJlc3VsdCA9ICpidWZmOwotI2Vsc2UKIAkJcmVzdWx0ICs9ICgqYnVmZiA8PCA4KTsKKyNlbHNlCisJCXJlc3VsdCA9ICpidWZmOwogI2VuZGlmCiAJCWxlbi0tOwogCQlidWZmKys7CkBAIC03Myw5ICs3NCw5IEBACiAJCX0KIAkJY291bnQgPj49IDE7CQkvKiBuciBvZiAzMi1iaXQgd29yZHMuLiAqLwogCQlpZiAoY291bnQpIHsKLQkJCXVuc2lnbmVkIGxvbmcgY2FycnkgPSAwOworCQkJdW5zaWduZWQgaW50IGNhcnJ5ID0gMDsKIAkJCWRvIHsKLQkJCQl1bnNpZ25lZCBsb25nIHcgPSAqKHVuc2lnbmVkIGludCAqKSBidWZmOworCQkJCXVuc2lnbmVkIGludCB3ID0gKih1bnNpZ25lZCBpbnQgKikgYnVmZjsKIAkJCQljb3VudC0tOwogCQkJCWJ1ZmYgKz0gNDsKIAkJCQlyZXN1bHQgKz0gY2Fycnk7CkBAIC0xMDIsNiArMTAzLDcgQEAKIG91dDoKIAlyZXR1cm4gcmVzdWx0OwogfQorI2VuZGlmCiAKIC8qCiAgKglUaGlzIGlzIGEgdmVyc2lvbiBvZiBpcF9jb21wdXRlX2NzdW0oKSBvcHRpbWl6ZWQgZm9yIElQIGhlYWRlcnMsCmRpZmYgLS1naXQgYS9saWIva2VybmVsX2xvY2suYyBiL2xpYi9rZXJuZWxfbG9jay5jCmluZGV4IDRlYmZhNWEuLjU1MjZiNDYgMTAwNjQ0Ci0tLSBhL2xpYi9rZXJuZWxfbG9jay5jCisrKyBiL2xpYi9rZXJuZWxfbG9jay5jCkBAIC0xMjIsOCArMTIyLDEwIEBACiAKIAl0cmFjZV9sb2NrX2tlcm5lbChmdW5jLCBmaWxlLCBsaW5lKTsKIAotCWlmIChsaWtlbHkoIWRlcHRoKSkKKwlpZiAobGlrZWx5KCFkZXB0aCkpIHsKKwkJbWlnaHRfc2xlZXAoKTsKIAkJX19sb2NrX2tlcm5lbCgpOworCX0KIAljdXJyZW50LT5sb2NrX2RlcHRoID0gZGVwdGg7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYi92c3ByaW50Zi5jIGIvbGliL3ZzcHJpbnRmLmMKaW5kZXggMzNiZWQ1ZS4uNjQzOGNkNSAxMDA2NDQKLS0tIGEvbGliL3ZzcHJpbnRmLmMKKysrIGIvbGliL3ZzcHJpbnRmLmMKQEAgLTU5NSwzNyArNTk1LDg5IEBACiB9CiAKIHN0YXRpYyBjaGFyICpyZXNvdXJjZV9zdHJpbmcoY2hhciAqYnVmLCBjaGFyICplbmQsIHN0cnVjdCByZXNvdXJjZSAqcmVzLAotCQkJCXN0cnVjdCBwcmludGZfc3BlYyBzcGVjKQorCQkJCXN0cnVjdCBwcmludGZfc3BlYyBzcGVjLCBjb25zdCBjaGFyICpmbXQpCiB7CiAjaWZuZGVmIElPX1JTUkNfUFJJTlRLX1NJWkUKLSNkZWZpbmUgSU9fUlNSQ19QUklOVEtfU0laRQk0CisjZGVmaW5lIElPX1JTUkNfUFJJTlRLX1NJWkUJNgogI2VuZGlmCiAKICNpZm5kZWYgTUVNX1JTUkNfUFJJTlRLX1NJWkUKLSNkZWZpbmUgTUVNX1JTUkNfUFJJTlRLX1NJWkUJOAorI2RlZmluZSBNRU1fUlNSQ19QUklOVEtfU0laRQkxMAogI2VuZGlmCi0Jc3RydWN0IHByaW50Zl9zcGVjIG51bV9zcGVjID0geworCXN0cnVjdCBwcmludGZfc3BlYyBoZXhfc3BlYyA9IHsKIAkJLmJhc2UgPSAxNiwKIAkJLnByZWNpc2lvbiA9IC0xLAogCQkuZmxhZ3MgPSBTUEVDSUFMIHwgU01BTEwgfCBaRVJPUEFELAogCX07Ci0JLyogcm9vbSBmb3IgdGhlIGFjdHVhbCBudW1iZXJzLCB0aGUgdHdvICIweCIsIC0sIFssIF0gYW5kIHRoZSBmaW5hbCB6ZXJvICovCi0JY2hhciBzeW1bNCpzaXplb2YocmVzb3VyY2Vfc2l6ZV90KSArIDhdOwotCWNoYXIgKnAgPSBzeW0sICpwZW5kID0gc3ltICsgc2l6ZW9mKHN5bSk7Ci0JaW50IHNpemUgPSAtMTsKKwlzdHJ1Y3QgcHJpbnRmX3NwZWMgZGVjX3NwZWMgPSB7CisJCS5iYXNlID0gMTAsCisJCS5wcmVjaXNpb24gPSAtMSwKKwkJLmZsYWdzID0gMCwKKwl9OworCXN0cnVjdCBwcmludGZfc3BlYyBzdHJfc3BlYyA9IHsKKwkJLmZpZWxkX3dpZHRoID0gLTEsCisJCS5wcmVjaXNpb24gPSAxMCwKKwkJLmZsYWdzID0gTEVGVCwKKwl9OworCXN0cnVjdCBwcmludGZfc3BlYyBmbGFnX3NwZWMgPSB7CisJCS5iYXNlID0gMTYsCisJCS5wcmVjaXNpb24gPSAtMSwKKwkJLmZsYWdzID0gU1BFQ0lBTCB8IFNNQUxMLAorCX07CiAKLQlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCisJLyogMzItYml0IHJlcyAoc2l6ZW9mPT00KTogMTAgY2hhcnMgaW4gZGVjLCAxMCBpbiBoZXggKCIweCIgKyA4KQorCSAqIDY0LWJpdCByZXMgKHNpemVvZj09OCk6IDIwIGNoYXJzIGluIGRlYywgMTggaW4gaGV4ICgiMHgiICsgMTYpICovCisjZGVmaW5lIFJTUkNfQlVGX1NJWkUJCSgoMiAqIHNpemVvZihyZXNvdXJjZV9zaXplX3QpKSArIDQpCisjZGVmaW5lIEZMQUdfQlVGX1NJWkUJCSgyICogc2l6ZW9mKHJlcy0+ZmxhZ3MpKQorI2RlZmluZSBERUNPREVEX0JVRl9TSVpFCXNpemVvZigiW21lbSAtIDY0Yml0IHByZWYgZGlzYWJsZWRdIikKKyNkZWZpbmUgUkFXX0JVRl9TSVpFCQlzaXplb2YoIlttZW0gLSBmbGFncyAweF0iKQorCWNoYXIgc3ltW21heCgyKlJTUkNfQlVGX1NJWkUgKyBERUNPREVEX0JVRl9TSVpFLAorCQkgICAgIDIqUlNSQ19CVUZfU0laRSArIEZMQUdfQlVGX1NJWkUgKyBSQVdfQlVGX1NJWkUpXTsKKworCWNoYXIgKnAgPSBzeW0sICpwZW5kID0gc3ltICsgc2l6ZW9mKHN5bSk7CisJaW50IHNpemUgPSAtMSwgYWRkciA9IDA7CisJaW50IGRlY29kZSA9IChmbXRbMF0gPT0gJ1InKSA/IDEgOiAwOworCisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CiAJCXNpemUgPSBJT19SU1JDX1BSSU5US19TSVpFOwotCWVsc2UgaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKKwkJYWRkciA9IDE7CisJfSBlbHNlIGlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pIHsKIAkJc2l6ZSA9IE1FTV9SU1JDX1BSSU5US19TSVpFOworCQlhZGRyID0gMTsKKwl9CiAKIAkqcCsrID0gJ1snOwotCW51bV9zcGVjLmZpZWxkX3dpZHRoID0gc2l6ZTsKLQlwID0gbnVtYmVyKHAsIHBlbmQsIHJlcy0+c3RhcnQsIG51bV9zcGVjKTsKLQkqcCsrID0gJy0nOwotCXAgPSBudW1iZXIocCwgcGVuZCwgcmVzLT5lbmQsIG51bV9zcGVjKTsKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCisJCXAgPSBzdHJpbmcocCwgcGVuZCwgImlvICAiLCBzdHJfc3BlYyk7CisJZWxzZSBpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQorCQlwID0gc3RyaW5nKHAsIHBlbmQsICJtZW0gIiwgc3RyX3NwZWMpOworCWVsc2UgaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lSUSkKKwkJcCA9IHN0cmluZyhwLCBwZW5kLCAiaXJxICIsIHN0cl9zcGVjKTsKKwllbHNlIGlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9ETUEpCisJCXAgPSBzdHJpbmcocCwgcGVuZCwgImRtYSAiLCBzdHJfc3BlYyk7CisJZWxzZSB7CisJCXAgPSBzdHJpbmcocCwgcGVuZCwgIj8/PyAiLCBzdHJfc3BlYyk7CisJCWRlY29kZSA9IDA7CisJfQorCWhleF9zcGVjLmZpZWxkX3dpZHRoID0gc2l6ZTsKKwlwID0gbnVtYmVyKHAsIHBlbmQsIHJlcy0+c3RhcnQsIGFkZHIgPyBoZXhfc3BlYyA6IGRlY19zcGVjKTsKKwlpZiAocmVzLT5zdGFydCAhPSByZXMtPmVuZCkgeworCQkqcCsrID0gJy0nOworCQlwID0gbnVtYmVyKHAsIHBlbmQsIHJlcy0+ZW5kLCBhZGRyID8gaGV4X3NwZWMgOiBkZWNfc3BlYyk7CisJfQorCWlmIChkZWNvZGUpIHsKKwkJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTV82NCkKKwkJCXAgPSBzdHJpbmcocCwgcGVuZCwgIiA2NGJpdCIsIHN0cl9zcGVjKTsKKwkJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX1BSRUZFVENIKQorCQkJcCA9IHN0cmluZyhwLCBwZW5kLCAiIHByZWYiLCBzdHJfc3BlYyk7CisJCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9ESVNBQkxFRCkKKwkJCXAgPSBzdHJpbmcocCwgcGVuZCwgIiBkaXNhYmxlZCIsIHN0cl9zcGVjKTsKKwl9IGVsc2UgeworCQlwID0gc3RyaW5nKHAsIHBlbmQsICIgZmxhZ3MgIiwgc3RyX3NwZWMpOworCQlwID0gbnVtYmVyKHAsIHBlbmQsIHJlcy0+ZmxhZ3MsIGZsYWdfc3BlYyk7CisJfQogCSpwKysgPSAnXSc7Ci0JKnAgPSAwOworCSpwID0gJ1wwJzsKIAogCXJldHVybiBzdHJpbmcoYnVmLCBlbmQsIHN5bSwgc3BlYyk7CiB9CkBAIC04MDEsOCArODUzLDggQEAKICAqIC0gJ2YnIEZvciBzaW1wbGUgc3ltYm9saWMgZnVuY3Rpb24gbmFtZXMgd2l0aG91dCBvZmZzZXQKICAqIC0gJ1MnIEZvciBzeW1ib2xpYyBkaXJlY3QgcG9pbnRlcnMgd2l0aCBvZmZzZXQKICAqIC0gJ3MnIEZvciBzeW1ib2xpYyBkaXJlY3QgcG9pbnRlcnMgd2l0aG91dCBvZmZzZXQKLSAqIC0gJ1InIEZvciBhIHN0cnVjdCByZXNvdXJjZSBwb2ludGVyLCBpdCBwcmludHMgdGhlIHJhbmdlIG9mCi0gKiAgICAgICBhZGRyZXNzZXMgKG5vdCB0aGUgbmFtZSBub3IgdGhlIGZsYWdzKQorICogLSAnUicgRm9yIGRlY29kZWQgc3RydWN0IHJlc291cmNlLCBlLmcuLCBbbWVtIDB4MC0weDFmIDY0Yml0IHByZWZdCisgKiAtICdyJyBGb3IgcmF3IHN0cnVjdCByZXNvdXJjZSwgZS5nLiwgW21lbSAweDAtMHgxZiBmbGFncyAweDIwMV0KICAqIC0gJ00nIEZvciBhIDYtYnl0ZSBNQUMgYWRkcmVzcywgaXQgcHJpbnRzIHRoZSBhZGRyZXNzIGluIHRoZQogICogICAgICAgdXN1YWwgY29sb24tc2VwYXJhdGVkIGhleCBub3RhdGlvbgogICogLSAnbScgRm9yIGEgNi1ieXRlIE1BQyBhZGRyZXNzLCBpdCBwcmludHMgdGhlIGhleCBhZGRyZXNzIHdpdGhvdXQgY29sb25zCkBAIC04MzMsNyArODg1LDggQEAKIAljYXNlICdTJzoKIAkJcmV0dXJuIHN5bWJvbF9zdHJpbmcoYnVmLCBlbmQsIHB0ciwgc3BlYywgKmZtdCk7CiAJY2FzZSAnUic6Ci0JCXJldHVybiByZXNvdXJjZV9zdHJpbmcoYnVmLCBlbmQsIHB0ciwgc3BlYyk7CisJY2FzZSAncic6CisJCXJldHVybiByZXNvdXJjZV9zdHJpbmcoYnVmLCBlbmQsIHB0ciwgc3BlYywgZm10KTsKIAljYXNlICdNJzoJCQkvKiBDb2xvbiBzZXBhcmF0ZWQ6IDAwOjAxOjAyOjAzOjA0OjA1ICovCiAJY2FzZSAnbSc6CQkJLyogQ29udGlndW91czogMDAwMTAyMDMwNDA1ICovCiAJCXJldHVybiBtYWNfYWRkcmVzc19zdHJpbmcoYnVmLCBlbmQsIHB0ciwgc3BlYywgZm10KTsKZGlmZiAtLWdpdCBhL21tL01ha2VmaWxlIGIvbW0vTWFrZWZpbGUKaW5kZXggZWJmODQ5MC4uODIxMzFkMCAxMDA2NDQKLS0tIGEvbW0vTWFrZWZpbGUKKysrIGIvbW0vTWFrZWZpbGUKQEAgLTM0LDExICszNCw3IEBACiBvYmotJChDT05GSUdfTUVNT1JZX0hPVFBMVUcpICs9IG1lbW9yeV9ob3RwbHVnLm8KIG9iai0kKENPTkZJR19GU19YSVApICs9IGZpbGVtYXBfeGlwLm8KIG9iai0kKENPTkZJR19NSUdSQVRJT04pICs9IG1pZ3JhdGUubwotaWZuZGVmIENPTkZJR19IQVZFX0xFR0FDWV9QRVJfQ1BVX0FSRUEKIG9iai0kKENPTkZJR19TTVApICs9IHBlcmNwdS5vCi1lbHNlCi1vYmotJChDT05GSUdfU01QKSArPSBhbGxvY3BlcmNwdS5vCi1lbmRpZgogb2JqLSQoQ09ORklHX1FVSUNLTElTVCkgKz0gcXVpY2tsaXN0Lm8KIG9iai0kKENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSKSArPSBtZW1jb250cm9sLm8gcGFnZV9jZ3JvdXAubwogb2JqLSQoQ09ORklHX01FTU9SWV9GQUlMVVJFKSArPSBtZW1vcnktZmFpbHVyZS5vCmRpZmYgLS1naXQgYS9tbS9hbGxvY3BlcmNwdS5jIGIvbW0vYWxsb2NwZXJjcHUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYzNGNlYS4uMDAwMDAwMAotLS0gYS9tbS9hbGxvY3BlcmNwdS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qCi0gKiBsaW51eC9tbS9hbGxvY3BlcmNwdS5jCi0gKgotICogU2VwYXJhdGVkIGZyb20gc2xhYi5jIEF1Z3VzdCAxMSwgMjAwNiBDaHJpc3RvcGggTGFtZXRlcgotICovCi0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+Ci0jaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+Ci0KLSNpZm5kZWYgY2FjaGVfbGluZV9zaXplCi0jZGVmaW5lIGNhY2hlX2xpbmVfc2l6ZSgpCUwxX0NBQ0hFX0JZVEVTCi0jZW5kaWYKLQotLyoqCi0gKiBwZXJjcHVfZGVwb3B1bGF0ZSAtIGRlcG9wdWxhdGUgcGVyLWNwdSBkYXRhIGZvciBnaXZlbiBjcHUKLSAqIEBfX3BkYXRhOiBwZXItY3B1IGRhdGEgdG8gZGVwb3B1bGF0ZQotICogQGNwdTogZGVwb3B1bGF0ZSBwZXItY3B1IGRhdGEgZm9yIHRoaXMgY3B1Ci0gKgotICogRGVwb3B1bGF0aW5nIHBlci1jcHUgZGF0YSBmb3IgYSBjcHUgZ29pbmcgb2ZmbGluZSB3b3VsZCBiZSBhIHR5cGljYWwKLSAqIHVzZSBjYXNlLiBZb3UgbmVlZCB0byByZWdpc3RlciBhIGNwdSBob3RwbHVnIGhhbmRsZXIgZm9yIHRoYXQgcHVycG9zZS4KLSAqLwotc3RhdGljIHZvaWQgcGVyY3B1X2RlcG9wdWxhdGUodm9pZCAqX19wZGF0YSwgaW50IGNwdSkKLXsKLQlzdHJ1Y3QgcGVyY3B1X2RhdGEgKnBkYXRhID0gX19wZXJjcHVfZGlzZ3Vpc2UoX19wZGF0YSk7Ci0KLQlrZnJlZShwZGF0YS0+cHRyc1tjcHVdKTsKLQlwZGF0YS0+cHRyc1tjcHVdID0gTlVMTDsKLX0KLQotLyoqCi0gKiBwZXJjcHVfZGVwb3B1bGF0ZV9tYXNrIC0gZGVwb3B1bGF0ZSBwZXItY3B1IGRhdGEgZm9yIHNvbWUgY3B1J3MKLSAqIEBfX3BkYXRhOiBwZXItY3B1IGRhdGEgdG8gZGVwb3B1bGF0ZQotICogQG1hc2s6IGRlcG9wdWxhdGUgcGVyLWNwdSBkYXRhIGZvciBjcHUncyBzZWxlY3RlZCB0aHJvdWdoIG1hc2sgYml0cwotICovCi1zdGF0aWMgdm9pZCBfX3BlcmNwdV9kZXBvcHVsYXRlX21hc2sodm9pZCAqX19wZGF0YSwgY29uc3QgY3B1bWFza190ICptYXNrKQotewotCWludCBjcHU7Ci0JZm9yX2VhY2hfY3B1X21hc2tfbnIoY3B1LCAqbWFzaykKLQkJcGVyY3B1X2RlcG9wdWxhdGUoX19wZGF0YSwgY3B1KTsKLX0KLQotI2RlZmluZSBwZXJjcHVfZGVwb3B1bGF0ZV9tYXNrKF9fcGRhdGEsIG1hc2spIFwKLQlfX3BlcmNwdV9kZXBvcHVsYXRlX21hc2soKF9fcGRhdGEpLCAmKG1hc2spKQotCi0vKioKLSAqIHBlcmNwdV9wb3B1bGF0ZSAtIHBvcHVsYXRlIHBlci1jcHUgZGF0YSBmb3IgZ2l2ZW4gY3B1Ci0gKiBAX19wZGF0YTogcGVyLWNwdSBkYXRhIHRvIHBvcHVsYXRlIGZ1cnRoZXIKLSAqIEBzaXplOiBzaXplIG9mIHBlci1jcHUgb2JqZWN0Ci0gKiBAZ2ZwOiBtYXkgc2xlZXAgb3Igbm90IGV0Yy4KLSAqIEBjcHU6IHBvcHVsYXRlIHBlci1kYXRhIGZvciB0aGlzIGNwdQotICoKLSAqIFBvcHVsYXRpbmcgcGVyLWNwdSBkYXRhIGZvciBhIGNwdSBjb21pbmcgb25saW5lIHdvdWxkIGJlIGEgdHlwaWNhbAotICogdXNlIGNhc2UuIFlvdSBuZWVkIHRvIHJlZ2lzdGVyIGEgY3B1IGhvdHBsdWcgaGFuZGxlciBmb3IgdGhhdCBwdXJwb3NlLgotICogUGVyLWNwdSBvYmplY3QgaXMgcG9wdWxhdGVkIHdpdGggemVyb2VkIGJ1ZmZlci4KLSAqLwotc3RhdGljIHZvaWQgKnBlcmNwdV9wb3B1bGF0ZSh2b2lkICpfX3BkYXRhLCBzaXplX3Qgc2l6ZSwgZ2ZwX3QgZ2ZwLCBpbnQgY3B1KQotewotCXN0cnVjdCBwZXJjcHVfZGF0YSAqcGRhdGEgPSBfX3BlcmNwdV9kaXNndWlzZShfX3BkYXRhKTsKLQlpbnQgbm9kZSA9IGNwdV90b19ub2RlKGNwdSk7Ci0KLQkvKgotCSAqIFdlIHNob3VsZCBtYWtlIHN1cmUgZWFjaCBDUFUgZ2V0cyBwcml2YXRlIG1lbW9yeS4KLQkgKi8KLQlzaXplID0gcm91bmR1cChzaXplLCBjYWNoZV9saW5lX3NpemUoKSk7Ci0KLQlCVUdfT04ocGRhdGEtPnB0cnNbY3B1XSk7Ci0JaWYgKG5vZGVfb25saW5lKG5vZGUpKQotCQlwZGF0YS0+cHRyc1tjcHVdID0ga21hbGxvY19ub2RlKHNpemUsIGdmcHxfX0dGUF9aRVJPLCBub2RlKTsKLQllbHNlCi0JCXBkYXRhLT5wdHJzW2NwdV0gPSBremFsbG9jKHNpemUsIGdmcCk7Ci0JcmV0dXJuIHBkYXRhLT5wdHJzW2NwdV07Ci19Ci0KLS8qKgotICogcGVyY3B1X3BvcHVsYXRlX21hc2sgLSBwb3B1bGF0ZSBwZXItY3B1IGRhdGEgZm9yIG1vcmUgY3B1J3MKLSAqIEBfX3BkYXRhOiBwZXItY3B1IGRhdGEgdG8gcG9wdWxhdGUgZnVydGhlcgotICogQHNpemU6IHNpemUgb2YgcGVyLWNwdSBvYmplY3QKLSAqIEBnZnA6IG1heSBzbGVlcCBvciBub3QgZXRjLgotICogQG1hc2s6IHBvcHVsYXRlIHBlci1jcHUgZGF0YSBmb3IgY3B1J3Mgc2VsZWN0ZWQgdGhyb3VnaCBtYXNrIGJpdHMKLSAqCi0gKiBQZXItY3B1IG9iamVjdHMgYXJlIHBvcHVsYXRlZCB3aXRoIHplcm9lZCBidWZmZXJzLgotICovCi1zdGF0aWMgaW50IF9fcGVyY3B1X3BvcHVsYXRlX21hc2sodm9pZCAqX19wZGF0YSwgc2l6ZV90IHNpemUsIGdmcF90IGdmcCwKLQkJCQkgIGNwdW1hc2tfdCAqbWFzaykKLXsKLQljcHVtYXNrX3QgcG9wdWxhdGVkOwotCWludCBjcHU7Ci0KLQljcHVzX2NsZWFyKHBvcHVsYXRlZCk7Ci0JZm9yX2VhY2hfY3B1X21hc2tfbnIoY3B1LCAqbWFzaykKLQkJaWYgKHVubGlrZWx5KCFwZXJjcHVfcG9wdWxhdGUoX19wZGF0YSwgc2l6ZSwgZ2ZwLCBjcHUpKSkgewotCQkJX19wZXJjcHVfZGVwb3B1bGF0ZV9tYXNrKF9fcGRhdGEsICZwb3B1bGF0ZWQpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0gZWxzZQotCQkJY3B1X3NldChjcHUsIHBvcHVsYXRlZCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgcGVyY3B1X3BvcHVsYXRlX21hc2soX19wZGF0YSwgc2l6ZSwgZ2ZwLCBtYXNrKSBcCi0JX19wZXJjcHVfcG9wdWxhdGVfbWFzaygoX19wZGF0YSksIChzaXplKSwgKGdmcCksICYobWFzaykpCi0KLS8qKgotICogYWxsb2NfcGVyY3B1IC0gaW5pdGlhbCBzZXR1cCBvZiBwZXItY3B1IGRhdGEKLSAqIEBzaXplOiBzaXplIG9mIHBlci1jcHUgb2JqZWN0Ci0gKiBAYWxpZ246IGFsaWdubWVudAotICoKLSAqIEFsbG9jYXRlIGR5bmFtaWMgcGVyY3B1IGFyZWEuICBQZXJjcHUgb2JqZWN0cyBhcmUgcG9wdWxhdGVkIHdpdGgKLSAqIHplcm9lZCBidWZmZXJzLgotICovCi12b2lkICpfX2FsbG9jX3BlcmNwdShzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduKQotewotCS8qCi0JICogV2UgYWxsb2NhdGUgd2hvbGUgY2FjaGUgbGluZXMgdG8gYXZvaWQgZmFsc2Ugc2hhcmluZwotCSAqLwotCXNpemVfdCBzeiA9IHJvdW5kdXAobnJfY3B1X2lkcyAqIHNpemVvZih2b2lkICopLCBjYWNoZV9saW5lX3NpemUoKSk7Ci0Jdm9pZCAqcGRhdGEgPSBremFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKLQl2b2lkICpfX3BkYXRhID0gX19wZXJjcHVfZGlzZ3Vpc2UocGRhdGEpOwotCi0JLyoKLQkgKiBDYW4ndCBlYXNpbHkgbWFrZSBsYXJnZXIgYWxpZ25tZW50IHdvcmsgd2l0aCBrbWFsbG9jLiAgV0FSTgotCSAqIG9uIGl0LiAgTGFyZ2VyIGFsaWdubWVudCBzaG91bGQgb25seSBiZSB1c2VkIGZvciBtb2R1bGUKLQkgKiBwZXJjcHUgc2VjdGlvbnMgb24gU01QIGZvciB3aGljaCB0aGlzIHBhdGggaXNuJ3QgdXNlZC4KLQkgKi8KLQlXQVJOX09OX09OQ0UoYWxpZ24gPiBTTVBfQ0FDSEVfQllURVMpOwotCi0JaWYgKHVubGlrZWx5KCFwZGF0YSkpCi0JCXJldHVybiBOVUxMOwotCWlmIChsaWtlbHkoIV9fcGVyY3B1X3BvcHVsYXRlX21hc2soX19wZGF0YSwgc2l6ZSwgR0ZQX0tFUk5FTCwKLQkJCQkJICAgJmNwdV9wb3NzaWJsZV9tYXApKSkKLQkJcmV0dXJuIF9fcGRhdGE7Ci0Ja2ZyZWUocGRhdGEpOwotCXJldHVybiBOVUxMOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoX19hbGxvY19wZXJjcHUpOwotCi0vKioKLSAqIGZyZWVfcGVyY3B1IC0gZmluYWwgY2xlYW51cCBvZiBwZXItY3B1IGRhdGEKLSAqIEBfX3BkYXRhOiBvYmplY3QgdG8gY2xlYW4gdXAKLSAqCi0gKiBXZSBzaW1wbHkgY2xlYW4gdXAgYW55IHBlci1jcHUgb2JqZWN0IGxlZnQuIE5vIG5lZWQgZm9yIHRoZSBjbGllbnQgdG8KLSAqIHRyYWNrIGFuZCBzcGVjaWZ5IHRocm91Z2ggYSBiaXMgbWFzayB3aGljaCBwZXItY3B1IG9iamVjdHMgYXJlIHRvIGZyZWUuCi0gKi8KLXZvaWQgZnJlZV9wZXJjcHUodm9pZCAqX19wZGF0YSkKLXsKLQlpZiAodW5saWtlbHkoIV9fcGRhdGEpKQotCQlyZXR1cm47Ci0JX19wZXJjcHVfZGVwb3B1bGF0ZV9tYXNrKF9fcGRhdGEsIGNwdV9wb3NzaWJsZV9tYXNrKTsKLQlrZnJlZShfX3BlcmNwdV9kaXNndWlzZShfX3BkYXRhKSk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChmcmVlX3BlcmNwdSk7Ci0KLS8qCi0gKiBHZW5lcmljIHBlcmNwdSBhcmVhIHNldHVwLgotICovCi0jaWZuZGVmIENPTkZJR19IQVZFX1NFVFVQX1BFUl9DUFVfQVJFQQotdW5zaWduZWQgbG9uZyBfX3Blcl9jcHVfb2Zmc2V0W05SX0NQVVNdIF9fcmVhZF9tb3N0bHk7Ci0KLUVYUE9SVF9TWU1CT0woX19wZXJfY3B1X29mZnNldCk7Ci0KLXZvaWQgX19pbml0IHNldHVwX3Blcl9jcHVfYXJlYXModm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHNpemUsIGk7Ci0JY2hhciAqcHRyOwotCXVuc2lnbmVkIGxvbmcgbnJfcG9zc2libGVfY3B1cyA9IG51bV9wb3NzaWJsZV9jcHVzKCk7Ci0KLQkvKiBDb3B5IHNlY3Rpb24gZm9yIGVhY2ggQ1BVICh3ZSBkaXNjYXJkIHRoZSBvcmlnaW5hbCkgKi8KLQlzaXplID0gQUxJR04oUEVSQ1BVX0VOT1VHSF9ST09NLCBQQUdFX1NJWkUpOwotCXB0ciA9IGFsbG9jX2Jvb3RtZW1fcGFnZXMoc2l6ZSAqIG5yX3Bvc3NpYmxlX2NwdXMpOwotCi0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKLQkJX19wZXJfY3B1X29mZnNldFtpXSA9IHB0ciAtIF9fcGVyX2NwdV9zdGFydDsKLQkJbWVtY3B5KHB0ciwgX19wZXJfY3B1X3N0YXJ0LCBfX3Blcl9jcHVfZW5kIC0gX19wZXJfY3B1X3N0YXJ0KTsKLQkJcHRyICs9IHNpemU7Ci0JfQotfQotI2VuZGlmIC8qIENPTkZJR19IQVZFX1NFVFVQX1BFUl9DUFVfQVJFQSAqLwpkaWZmIC0tZ2l0IGEvbW0vZmlsZW1hcC5jIGIvbW0vZmlsZW1hcC5jCmluZGV4IGMzZDM1MDYuLjhiNGQ4OGYgMTAwNjQ0Ci0tLSBhL21tL2ZpbGVtYXAuYworKysgYi9tbS9maWxlbWFwLmMKQEAgLTI2MCwyNyArMjYwLDI3IEBACiBFWFBPUlRfU1lNQk9MKGZpbGVtYXBfZmx1c2gpOwogCiAvKioKLSAqIHdhaXRfb25fcGFnZV93cml0ZWJhY2tfcmFuZ2UgLSB3YWl0IGZvciB3cml0ZWJhY2sgdG8gY29tcGxldGUKLSAqIEBtYXBwaW5nOgl0YXJnZXQgYWRkcmVzc19zcGFjZQotICogQHN0YXJ0OgliZWdpbm5pbmcgcGFnZSBpbmRleAotICogQGVuZDoJZW5kaW5nIHBhZ2UgaW5kZXgKKyAqIGZpbGVtYXBfZmRhdGF3YWl0X3JhbmdlIC0gd2FpdCBmb3Igd3JpdGViYWNrIHRvIGNvbXBsZXRlCisgKiBAbWFwcGluZzoJCWFkZHJlc3Mgc3BhY2Ugc3RydWN0dXJlIHRvIHdhaXQgZm9yCisgKiBAc3RhcnRfYnl0ZToJCW9mZnNldCBpbiBieXRlcyB3aGVyZSB0aGUgcmFuZ2Ugc3RhcnRzCisgKiBAZW5kX2J5dGU6CQlvZmZzZXQgaW4gYnl0ZXMgd2hlcmUgdGhlIHJhbmdlIGVuZHMgKGluY2x1c2l2ZSkKICAqCi0gKiBXYWl0IGZvciB3cml0ZWJhY2sgdG8gY29tcGxldGUgYWdhaW5zdCBwYWdlcyBpbmRleGVkIGJ5IHN0YXJ0LT5lbmQKLSAqIGluY2x1c2l2ZQorICogV2FsayB0aGUgbGlzdCBvZiB1bmRlci13cml0ZWJhY2sgcGFnZXMgb2YgdGhlIGdpdmVuIGFkZHJlc3Mgc3BhY2UKKyAqIGluIHRoZSBnaXZlbiByYW5nZSBhbmQgd2FpdCBmb3IgYWxsIG9mIHRoZW0uCiAgKi8KLWludCB3YWl0X29uX3BhZ2Vfd3JpdGViYWNrX3JhbmdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAotCQkJCXBnb2ZmX3Qgc3RhcnQsIHBnb2ZmX3QgZW5kKQoraW50IGZpbGVtYXBfZmRhdGF3YWl0X3JhbmdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBsb2ZmX3Qgc3RhcnRfYnl0ZSwKKwkJCSAgICBsb2ZmX3QgZW5kX2J5dGUpCiB7CisJcGdvZmZfdCBpbmRleCA9IHN0YXJ0X2J5dGUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlwZ29mZl90IGVuZCA9IGVuZF9ieXRlID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJc3RydWN0IHBhZ2V2ZWMgcHZlYzsKIAlpbnQgbnJfcGFnZXM7CiAJaW50IHJldCA9IDA7Ci0JcGdvZmZfdCBpbmRleDsKIAotCWlmIChlbmQgPCBzdGFydCkKKwlpZiAoZW5kX2J5dGUgPCBzdGFydF9ieXRlKQogCQlyZXR1cm4gMDsKIAogCXBhZ2V2ZWNfaW5pdCgmcHZlYywgMCk7Ci0JaW5kZXggPSBzdGFydDsKIAl3aGlsZSAoKGluZGV4IDw9IGVuZCkgJiYKIAkJCShucl9wYWdlcyA9IHBhZ2V2ZWNfbG9va3VwX3RhZygmcHZlYywgbWFwcGluZywgJmluZGV4LAogCQkJUEFHRUNBQ0hFX1RBR19XUklURUJBQ0ssCkBAIC0zMTAsMjUgKzMxMCw2IEBACiAKIAlyZXR1cm4gcmV0OwogfQotCi0vKioKLSAqIGZpbGVtYXBfZmRhdGF3YWl0X3JhbmdlIC0gd2FpdCBmb3IgYWxsIHVuZGVyLXdyaXRlYmFjayBwYWdlcyB0byBjb21wbGV0ZSBpbiBhIGdpdmVuIHJhbmdlCi0gKiBAbWFwcGluZzogYWRkcmVzcyBzcGFjZSBzdHJ1Y3R1cmUgdG8gd2FpdCBmb3IKLSAqIEBzdGFydDoJb2Zmc2V0IGluIGJ5dGVzIHdoZXJlIHRoZSByYW5nZSBzdGFydHMKLSAqIEBlbmQ6CW9mZnNldCBpbiBieXRlcyB3aGVyZSB0aGUgcmFuZ2UgZW5kcyAoaW5jbHVzaXZlKQotICoKLSAqIFdhbGsgdGhlIGxpc3Qgb2YgdW5kZXItd3JpdGViYWNrIHBhZ2VzIG9mIHRoZSBnaXZlbiBhZGRyZXNzIHNwYWNlCi0gKiBpbiB0aGUgZ2l2ZW4gcmFuZ2UgYW5kIHdhaXQgZm9yIGFsbCBvZiB0aGVtLgotICoKLSAqIFRoaXMgaXMganVzdCBhIHNpbXBsZSB3cmFwcGVyIHNvIHRoYXQgY2FsbGVycyBkb24ndCBoYXZlIHRvIGNvbnZlcnQgb2Zmc2V0cwotICogdG8gcGFnZSBpbmRleGVzIHRoZW1zZWx2ZXMKLSAqLwotaW50IGZpbGVtYXBfZmRhdGF3YWl0X3JhbmdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBsb2ZmX3Qgc3RhcnQsCi0JCQkgICAgbG9mZl90IGVuZCkKLXsKLQlyZXR1cm4gd2FpdF9vbl9wYWdlX3dyaXRlYmFja19yYW5nZShtYXBwaW5nLCBzdGFydCA+PiBQQUdFX0NBQ0hFX1NISUZULAotCQkJCQkgICAgZW5kID4+IFBBR0VfQ0FDSEVfU0hJRlQpOwotfQogRVhQT1JUX1NZTUJPTChmaWxlbWFwX2ZkYXRhd2FpdF9yYW5nZSk7CiAKIC8qKgpAQCAtMzQ1LDggKzMyNiw3IEBACiAJaWYgKGlfc2l6ZSA9PSAwKQogCQlyZXR1cm4gMDsKIAotCXJldHVybiB3YWl0X29uX3BhZ2Vfd3JpdGViYWNrX3JhbmdlKG1hcHBpbmcsIDAsCi0JCQkJKGlfc2l6ZSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQpOworCXJldHVybiBmaWxlbWFwX2ZkYXRhd2FpdF9yYW5nZShtYXBwaW5nLCAwLCBpX3NpemUgLSAxKTsKIH0KIEVYUE9SVF9TWU1CT0woZmlsZW1hcF9mZGF0YXdhaXQpOwogCkBAIC0zOTMsOSArMzczLDggQEAKIAkJCQkJCSBXQl9TWU5DX0FMTCk7CiAJCS8qIFNlZSBjb21tZW50IG9mIGZpbGVtYXBfd3JpdGVfYW5kX3dhaXQoKSAqLwogCQlpZiAoZXJyICE9IC1FSU8pIHsKLQkJCWludCBlcnIyID0gd2FpdF9vbl9wYWdlX3dyaXRlYmFja19yYW5nZShtYXBwaW5nLAotCQkJCQkJbHN0YXJ0ID4+IFBBR0VfQ0FDSEVfU0hJRlQsCi0JCQkJCQlsZW5kID4+IFBBR0VfQ0FDSEVfU0hJRlQpOworCQkJaW50IGVycjIgPSBmaWxlbWFwX2ZkYXRhd2FpdF9yYW5nZShtYXBwaW5nLAorCQkJCQkJbHN0YXJ0LCBsZW5kKTsKIAkJCWlmICghZXJyKQogCQkJCWVyciA9IGVycjI7CiAJCX0KZGlmZiAtLWdpdCBhL21tL21tYXAuYyBiL21tL21tYXAuYwppbmRleCAyOTJkZGMzLi5lZDcwYTY4IDEwMDY0NAotLS0gYS9tbS9tbWFwLmMKKysrIGIvbW0vbW1hcC5jCkBAIC05MzEsMTMgKzkzMSw5IEBACiAJaWYgKCEoZmxhZ3MgJiBNQVBfRklYRUQpKQogCQlhZGRyID0gcm91bmRfaGludF90b19taW4oYWRkcik7CiAKLQllcnJvciA9IGFyY2hfbW1hcF9jaGVjayhhZGRyLCBsZW4sIGZsYWdzKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKLQogCS8qIENhcmVmdWwgYWJvdXQgb3ZlcmZsb3dzLi4gKi8KIAlsZW4gPSBQQUdFX0FMSUdOKGxlbik7Ci0JaWYgKCFsZW4gfHwgbGVuID4gVEFTS19TSVpFKQorCWlmICghbGVuKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qIG9mZnNldCBvdmVyZmxvdz8gKi8KQEAgLTk0OCwyNCArOTQ0LDYgQEAKIAlpZiAobW0tPm1hcF9jb3VudCA+IHN5c2N0bF9tYXhfbWFwX2NvdW50KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlmIChmbGFncyAmIE1BUF9IVUdFVExCKSB7Ci0JCXN0cnVjdCB1c2VyX3N0cnVjdCAqdXNlciA9IE5VTEw7Ci0JCWlmIChmaWxlKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJLyoKLQkJICogVk1fTk9SRVNFUlZFIGlzIHVzZWQgYmVjYXVzZSB0aGUgcmVzZXJ2YXRpb25zIHdpbGwgYmUKLQkJICogdGFrZW4gd2hlbiB2bV9vcHMtPm1tYXAoKSBpcyBjYWxsZWQKLQkJICogQSBkdW1teSB1c2VyIHZhbHVlIGlzIHVzZWQgYmVjYXVzZSB3ZSBhcmUgbm90IGxvY2tpbmcKLQkJICogbWVtb3J5IHNvIG5vIGFjY291bnRpbmcgaXMgbmVjZXNzYXJ5Ci0JCSAqLwotCQlsZW4gPSBBTElHTihsZW4sIGh1Z2VfcGFnZV9zaXplKCZkZWZhdWx0X2hzdGF0ZSkpOwotCQlmaWxlID0gaHVnZXRsYl9maWxlX3NldHVwKEhVR0VUTEJfQU5PTl9GSUxFLCBsZW4sIFZNX05PUkVTRVJWRSwKLQkJCQkJCSZ1c2VyLCBIVUdFVExCX0FOT05IVUdFX0lOT0RFKTsKLQkJaWYgKElTX0VSUihmaWxlKSkKLQkJCXJldHVybiBQVFJfRVJSKGZpbGUpOwotCX0KLQogCS8qIE9idGFpbiB0aGUgYWRkcmVzcyB0byBtYXAgdG8uIHdlIHZlcmlmeSAob3Igc2VsZWN0KSBpdCBhbmQgZW5zdXJlCiAJICogdGhhdCBpdCByZXByZXNlbnRzIGEgdmFsaWQgc2VjdGlvbiBvZiB0aGUgYWRkcmVzcyBzcGFjZS4KIAkgKi8KQEAgLTE0NTUsNiArMTQzMywxNCBAQAogCXVuc2lnbmVkIGxvbmcgKCpnZXRfYXJlYSkoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgbG9uZywKIAkJCQkgIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwogCisJdW5zaWduZWQgbG9uZyBlcnJvciA9IGFyY2hfbW1hcF9jaGVjayhhZGRyLCBsZW4sIGZsYWdzKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCS8qIENhcmVmdWwgYWJvdXQgb3ZlcmZsb3dzLi4gKi8KKwlpZiAobGVuID4gVEFTS19TSVpFKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCWdldF9hcmVhID0gY3VycmVudC0+bW0tPmdldF91bm1hcHBlZF9hcmVhOwogCWlmIChmaWxlICYmIGZpbGUtPmZfb3AgJiYgZmlsZS0+Zl9vcC0+Z2V0X3VubWFwcGVkX2FyZWEpCiAJCWdldF9hcmVhID0gZmlsZS0+Zl9vcC0+Z2V0X3VubWFwcGVkX2FyZWE7CkBAIC0xOTk5LDIwICsxOTg1LDE0IEBACiAJaWYgKCFsZW4pCiAJCXJldHVybiBhZGRyOwogCi0JaWYgKChhZGRyICsgbGVuKSA+IFRBU0tfU0laRSB8fCAoYWRkciArIGxlbikgPCBhZGRyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChpc19odWdlcGFnZV9vbmx5X3JhbmdlKG1tLCBhZGRyLCBsZW4pKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCWVycm9yID0gc2VjdXJpdHlfZmlsZV9tbWFwKE5VTEwsIDAsIDAsIDAsIGFkZHIsIDEpOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCiAJZmxhZ3MgPSBWTV9EQVRBX0RFRkFVTFRfRkxBR1MgfCBWTV9BQ0NPVU5UIHwgbW0tPmRlZl9mbGFnczsKIAotCWVycm9yID0gYXJjaF9tbWFwX2NoZWNrKGFkZHIsIGxlbiwgZmxhZ3MpOwotCWlmIChlcnJvcikKKwllcnJvciA9IGdldF91bm1hcHBlZF9hcmVhKE5VTEwsIGFkZHIsIGxlbiwgMCwgTUFQX0ZJWEVEKTsKKwlpZiAoZXJyb3IgJiB+UEFHRV9NQVNLKQogCQlyZXR1cm4gZXJyb3I7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvbW0vbXJlbWFwLmMgYi9tbS9tcmVtYXAuYwppbmRleCA5N2JmZjI1Li44NDUxOTA4IDEwMDY0NAotLS0gYS9tbS9tcmVtYXAuYworKysgYi9tbS9tcmVtYXAuYwpAQCAtMjYxLDYgKzI2MSwxMzcgQEAKIAlyZXR1cm4gbmV3X2FkZHI7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYV90b19yZXNpemUodW5zaWduZWQgbG9uZyBhZGRyLAorCXVuc2lnbmVkIGxvbmcgb2xkX2xlbiwgdW5zaWduZWQgbG9uZyBuZXdfbGVuLCB1bnNpZ25lZCBsb25nICpwKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBmaW5kX3ZtYShtbSwgYWRkcik7CisKKwlpZiAoIXZtYSB8fCB2bWEtPnZtX3N0YXJ0ID4gYWRkcikKKwkJZ290byBFZmF1bHQ7CisKKwlpZiAoaXNfdm1faHVnZXRsYl9wYWdlKHZtYSkpCisJCWdvdG8gRWludmFsOworCisJLyogV2UgY2FuJ3QgcmVtYXAgYWNyb3NzIHZtIGFyZWEgYm91bmRhcmllcyAqLworCWlmIChvbGRfbGVuID4gdm1hLT52bV9lbmQgLSBhZGRyKQorCQlnb3RvIEVmYXVsdDsKKworCWlmICh2bWEtPnZtX2ZsYWdzICYgKFZNX0RPTlRFWFBBTkQgfCBWTV9QRk5NQVApKSB7CisJCWlmIChuZXdfbGVuID4gb2xkX2xlbikKKwkJCWdvdG8gRWZhdWx0OworCX0KKworCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fTE9DS0VEKSB7CisJCXVuc2lnbmVkIGxvbmcgbG9ja2VkLCBsb2NrX2xpbWl0OworCQlsb2NrZWQgPSBtbS0+bG9ja2VkX3ZtIDw8IFBBR0VfU0hJRlQ7CisJCWxvY2tfbGltaXQgPSBjdXJyZW50LT5zaWduYWwtPnJsaW1bUkxJTUlUX01FTUxPQ0tdLnJsaW1fY3VyOworCQlsb2NrZWQgKz0gbmV3X2xlbiAtIG9sZF9sZW47CisJCWlmIChsb2NrZWQgPiBsb2NrX2xpbWl0ICYmICFjYXBhYmxlKENBUF9JUENfTE9DSykpCisJCQlnb3RvIEVhZ2FpbjsKKwl9CisKKwlpZiAoIW1heV9leHBhbmRfdm0obW0sIChuZXdfbGVuIC0gb2xkX2xlbikgPj4gUEFHRV9TSElGVCkpCisJCWdvdG8gRW5vbWVtOworCisJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9BQ0NPVU5UKSB7CisJCXVuc2lnbmVkIGxvbmcgY2hhcmdlZCA9IChuZXdfbGVuIC0gb2xkX2xlbikgPj4gUEFHRV9TSElGVDsKKwkJaWYgKHNlY3VyaXR5X3ZtX2Vub3VnaF9tZW1vcnkoY2hhcmdlZCkpCisJCQlnb3RvIEVmYXVsdDsKKwkJKnAgPSBjaGFyZ2VkOworCX0KKworCXJldHVybiB2bWE7CisKK0VmYXVsdDoJLyogdmVyeSBvZGQgY2hvaWNlIGZvciBtb3N0IG9mIHRoZSBjYXNlcywgYnV0Li4uICovCisJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CitFaW52YWw6CisJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CitFbm9tZW06CisJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CitFYWdhaW46CisJcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1yZW1hcF90byh1bnNpZ25lZCBsb25nIGFkZHIsCisJdW5zaWduZWQgbG9uZyBvbGRfbGVuLCB1bnNpZ25lZCBsb25nIG5ld19hZGRyLAorCXVuc2lnbmVkIGxvbmcgbmV3X2xlbikKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCXVuc2lnbmVkIGxvbmcgcmV0ID0gLUVJTlZBTDsKKwl1bnNpZ25lZCBsb25nIGNoYXJnZWQgPSAwOworCXVuc2lnbmVkIGxvbmcgbWFwX2ZsYWdzOworCisJaWYgKG5ld19hZGRyICYgflBBR0VfTUFTSykKKwkJZ290byBvdXQ7CisKKwlpZiAobmV3X2xlbiA+IFRBU0tfU0laRSB8fCBuZXdfYWRkciA+IFRBU0tfU0laRSAtIG5ld19sZW4pCisJCWdvdG8gb3V0OworCisJLyogQ2hlY2sgaWYgdGhlIGxvY2F0aW9uIHdlJ3JlIG1vdmluZyBpbnRvIG92ZXJsYXBzIHRoZQorCSAqIG9sZCBsb2NhdGlvbiBhdCBhbGwsIGFuZCBmYWlsIGlmIGl0IGRvZXMuCisJICovCisJaWYgKChuZXdfYWRkciA8PSBhZGRyKSAmJiAobmV3X2FkZHIrbmV3X2xlbikgPiBhZGRyKQorCQlnb3RvIG91dDsKKworCWlmICgoYWRkciA8PSBuZXdfYWRkcikgJiYgKGFkZHIrb2xkX2xlbikgPiBuZXdfYWRkcikKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBzZWN1cml0eV9maWxlX21tYXAoTlVMTCwgMCwgMCwgMCwgbmV3X2FkZHIsIDEpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gZG9fbXVubWFwKG1tLCBuZXdfYWRkciwgbmV3X2xlbik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlpZiAob2xkX2xlbiA+PSBuZXdfbGVuKSB7CisJCXJldCA9IGRvX211bm1hcChtbSwgYWRkcituZXdfbGVuLCBvbGRfbGVuIC0gbmV3X2xlbik7CisJCWlmIChyZXQgJiYgb2xkX2xlbiAhPSBuZXdfbGVuKQorCQkJZ290byBvdXQ7CisJCW9sZF9sZW4gPSBuZXdfbGVuOworCX0KKworCXZtYSA9IHZtYV90b19yZXNpemUoYWRkciwgb2xkX2xlbiwgbmV3X2xlbiwgJmNoYXJnZWQpOworCWlmIChJU19FUlIodm1hKSkgeworCQlyZXQgPSBQVFJfRVJSKHZtYSk7CisJCWdvdG8gb3V0OworCX0KKworCW1hcF9mbGFncyA9IE1BUF9GSVhFRDsKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX01BWVNIQVJFKQorCQltYXBfZmxhZ3MgfD0gTUFQX1NIQVJFRDsKKworCXJldCA9IGdldF91bm1hcHBlZF9hcmVhKHZtYS0+dm1fZmlsZSwgbmV3X2FkZHIsIG5ld19sZW4sIHZtYS0+dm1fcGdvZmYgKworCQkJCSgoYWRkciAtIHZtYS0+dm1fc3RhcnQpID4+IFBBR0VfU0hJRlQpLAorCQkJCW1hcF9mbGFncyk7CisJaWYgKHJldCAmIH5QQUdFX01BU0spCisJCWdvdG8gb3V0MTsKKworCXJldCA9IG1vdmVfdm1hKHZtYSwgYWRkciwgb2xkX2xlbiwgbmV3X2xlbiwgbmV3X2FkZHIpOworCWlmICghKHJldCAmIH5QQUdFX01BU0spKQorCQlnb3RvIG91dDsKK291dDE6CisJdm1fdW5hY2N0X21lbW9yeShjaGFyZ2VkKTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdm1hX2V4cGFuZGFibGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgZGVsdGEpCit7CisJdW5zaWduZWQgbG9uZyBlbmQgPSB2bWEtPnZtX2VuZCArIGRlbHRhOworCWlmIChlbmQgPCB2bWEtPnZtX2VuZCkgLyogb3ZlcmZsb3cgKi8KKwkJcmV0dXJuIDA7CisJaWYgKHZtYS0+dm1fbmV4dCAmJiB2bWEtPnZtX25leHQtPnZtX3N0YXJ0IDwgZW5kKSAvKiBpbnRlcnNlY3Rpb24gKi8KKwkJcmV0dXJuIDA7CisJaWYgKGdldF91bm1hcHBlZF9hcmVhKE5VTEwsIHZtYS0+dm1fc3RhcnQsIGVuZCAtIHZtYS0+dm1fc3RhcnQsCisJCQkgICAgICAwLCBNQVBfRklYRUQpICYgflBBR0VfTUFTSykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKIC8qCiAgKiBFeHBhbmQgKG9yIHNocmluaykgYW4gZXhpc3RpbmcgbWFwcGluZywgcG90ZW50aWFsbHkgbW92aW5nIGl0IGF0IHRoZQogICogc2FtZSB0aW1lIChjb250cm9sbGVkIGJ5IHRoZSBNUkVNQVBfTUFZTU9WRSBmbGFnIGFuZCBhdmFpbGFibGUgVk0gc3BhY2UpCkBAIC0yOTQsMzIgKzQyNSwxMCBAQAogCWlmICghbmV3X2xlbikKIAkJZ290byBvdXQ7CiAKLQkvKiBuZXdfYWRkciBpcyBvbmx5IHZhbGlkIGlmIE1SRU1BUF9GSVhFRCBpcyBzcGVjaWZpZWQgKi8KIAlpZiAoZmxhZ3MgJiBNUkVNQVBfRklYRUQpIHsKLQkJaWYgKG5ld19hZGRyICYgflBBR0VfTUFTSykKLQkJCWdvdG8gb3V0OwotCQlpZiAoIShmbGFncyAmIE1SRU1BUF9NQVlNT1ZFKSkKLQkJCWdvdG8gb3V0OwotCi0JCWlmIChuZXdfbGVuID4gVEFTS19TSVpFIHx8IG5ld19hZGRyID4gVEFTS19TSVpFIC0gbmV3X2xlbikKLQkJCWdvdG8gb3V0OwotCi0JCS8qIENoZWNrIGlmIHRoZSBsb2NhdGlvbiB3ZSdyZSBtb3ZpbmcgaW50byBvdmVybGFwcyB0aGUKLQkJICogb2xkIGxvY2F0aW9uIGF0IGFsbCwgYW5kIGZhaWwgaWYgaXQgZG9lcy4KLQkJICovCi0JCWlmICgobmV3X2FkZHIgPD0gYWRkcikgJiYgKG5ld19hZGRyK25ld19sZW4pID4gYWRkcikKLQkJCWdvdG8gb3V0OwotCi0JCWlmICgoYWRkciA8PSBuZXdfYWRkcikgJiYgKGFkZHIrb2xkX2xlbikgPiBuZXdfYWRkcikKLQkJCWdvdG8gb3V0OwotCi0JCXJldCA9IHNlY3VyaXR5X2ZpbGVfbW1hcChOVUxMLCAwLCAwLCAwLCBuZXdfYWRkciwgMSk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dDsKLQotCQlyZXQgPSBkb19tdW5tYXAobW0sIG5ld19hZGRyLCBuZXdfbGVuKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0OworCQlpZiAoZmxhZ3MgJiBNUkVNQVBfTUFZTU9WRSkKKwkJCXJldCA9IG1yZW1hcF90byhhZGRyLCBvbGRfbGVuLCBuZXdfYWRkciwgbmV3X2xlbik7CisJCWdvdG8gb3V0OwogCX0KIAogCS8qCkBAIC0zMzIsNjAgKzQ0MSwyMyBAQAogCQlpZiAocmV0ICYmIG9sZF9sZW4gIT0gbmV3X2xlbikKIAkJCWdvdG8gb3V0OwogCQlyZXQgPSBhZGRyOwotCQlpZiAoIShmbGFncyAmIE1SRU1BUF9GSVhFRCkgfHwgKG5ld19hZGRyID09IGFkZHIpKQotCQkJZ290byBvdXQ7Ci0JCW9sZF9sZW4gPSBuZXdfbGVuOworCQlnb3RvIG91dDsKIAl9CiAKIAkvKgotCSAqIE9rLCB3ZSBuZWVkIHRvIGdyb3cuLiAgb3IgcmVsb2NhdGUuCisJICogT2ssIHdlIG5lZWQgdG8gZ3Jvdy4uCiAJICovCi0JcmV0ID0gLUVGQVVMVDsKLQl2bWEgPSBmaW5kX3ZtYShtbSwgYWRkcik7Ci0JaWYgKCF2bWEgfHwgdm1hLT52bV9zdGFydCA+IGFkZHIpCisJdm1hID0gdm1hX3RvX3Jlc2l6ZShhZGRyLCBvbGRfbGVuLCBuZXdfbGVuLCAmY2hhcmdlZCk7CisJaWYgKElTX0VSUih2bWEpKSB7CisJCXJldCA9IFBUUl9FUlIodm1hKTsKIAkJZ290byBvdXQ7Ci0JaWYgKGlzX3ZtX2h1Z2V0bGJfcGFnZSh2bWEpKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQkvKiBXZSBjYW4ndCByZW1hcCBhY3Jvc3Mgdm0gYXJlYSBib3VuZGFyaWVzICovCi0JaWYgKG9sZF9sZW4gPiB2bWEtPnZtX2VuZCAtIGFkZHIpCi0JCWdvdG8gb3V0OwotCWlmICh2bWEtPnZtX2ZsYWdzICYgKFZNX0RPTlRFWFBBTkQgfCBWTV9QRk5NQVApKSB7Ci0JCWlmIChuZXdfbGVuID4gb2xkX2xlbikKLQkJCWdvdG8gb3V0OwotCX0KLQlpZiAodm1hLT52bV9mbGFncyAmIFZNX0xPQ0tFRCkgewotCQl1bnNpZ25lZCBsb25nIGxvY2tlZCwgbG9ja19saW1pdDsKLQkJbG9ja2VkID0gbW0tPmxvY2tlZF92bSA8PCBQQUdFX1NISUZUOwotCQlsb2NrX2xpbWl0ID0gY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9NRU1MT0NLXS5ybGltX2N1cjsKLQkJbG9ja2VkICs9IG5ld19sZW4gLSBvbGRfbGVuOwotCQlyZXQgPSAtRUFHQUlOOwotCQlpZiAobG9ja2VkID4gbG9ja19saW1pdCAmJiAhY2FwYWJsZShDQVBfSVBDX0xPQ0spKQotCQkJZ290byBvdXQ7Ci0JfQotCWlmICghbWF5X2V4cGFuZF92bShtbSwgKG5ld19sZW4gLSBvbGRfbGVuKSA+PiBQQUdFX1NISUZUKSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAodm1hLT52bV9mbGFncyAmIFZNX0FDQ09VTlQpIHsKLQkJY2hhcmdlZCA9IChuZXdfbGVuIC0gb2xkX2xlbikgPj4gUEFHRV9TSElGVDsKLQkJaWYgKHNlY3VyaXR5X3ZtX2Vub3VnaF9tZW1vcnkoY2hhcmdlZCkpCi0JCQlnb3RvIG91dF9uYzsKIAl9CiAKIAkvKiBvbGRfbGVuIGV4YWN0bHkgdG8gdGhlIGVuZCBvZiB0aGUgYXJlYS4uCi0JICogQW5kIHdlJ3JlIG5vdCByZWxvY2F0aW5nIHRoZSBhcmVhLgogCSAqLwotCWlmIChvbGRfbGVuID09IHZtYS0+dm1fZW5kIC0gYWRkciAmJgotCSAgICAhKChmbGFncyAmIE1SRU1BUF9GSVhFRCkgJiYgKGFkZHIgIT0gbmV3X2FkZHIpKSAmJgotCSAgICAob2xkX2xlbiAhPSBuZXdfbGVuIHx8ICEoZmxhZ3MgJiBNUkVNQVBfTUFZTU9WRSkpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgbWF4X2FkZHIgPSBUQVNLX1NJWkU7Ci0JCWlmICh2bWEtPnZtX25leHQpCi0JCQltYXhfYWRkciA9IHZtYS0+dm1fbmV4dC0+dm1fc3RhcnQ7CisJaWYgKG9sZF9sZW4gPT0gdm1hLT52bV9lbmQgLSBhZGRyKSB7CiAJCS8qIGNhbiB3ZSBqdXN0IGV4cGFuZCB0aGUgY3VycmVudCBtYXBwaW5nPyAqLwotCQlpZiAobWF4X2FkZHIgLSBhZGRyID49IG5ld19sZW4pIHsKKwkJaWYgKHZtYV9leHBhbmRhYmxlKHZtYSwgbmV3X2xlbiAtIG9sZF9sZW4pKSB7CiAJCQlpbnQgcGFnZXMgPSAobmV3X2xlbiAtIG9sZF9sZW4pID4+IFBBR0VfU0hJRlQ7CiAKIAkJCXZtYV9hZGp1c3Qodm1hLCB2bWEtPnZtX3N0YXJ0LApAQCAtNDA5LDI4ICs0ODEsMjcgQEAKIAkgKi8KIAlyZXQgPSAtRU5PTUVNOwogCWlmIChmbGFncyAmIE1SRU1BUF9NQVlNT1ZFKSB7Ci0JCWlmICghKGZsYWdzICYgTVJFTUFQX0ZJWEVEKSkgewotCQkJdW5zaWduZWQgbG9uZyBtYXBfZmxhZ3MgPSAwOwotCQkJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9NQVlTSEFSRSkKLQkJCQltYXBfZmxhZ3MgfD0gTUFQX1NIQVJFRDsKKwkJdW5zaWduZWQgbG9uZyBtYXBfZmxhZ3MgPSAwOworCQlpZiAodm1hLT52bV9mbGFncyAmIFZNX01BWVNIQVJFKQorCQkJbWFwX2ZsYWdzIHw9IE1BUF9TSEFSRUQ7CiAKLQkJCW5ld19hZGRyID0gZ2V0X3VubWFwcGVkX2FyZWEodm1hLT52bV9maWxlLCAwLCBuZXdfbGVuLAotCQkJCQkJdm1hLT52bV9wZ29mZiwgbWFwX2ZsYWdzKTsKLQkJCWlmIChuZXdfYWRkciAmIH5QQUdFX01BU0spIHsKLQkJCQlyZXQgPSBuZXdfYWRkcjsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQotCQkJcmV0ID0gc2VjdXJpdHlfZmlsZV9tbWFwKE5VTEwsIDAsIDAsIDAsIG5ld19hZGRyLCAxKTsKLQkJCWlmIChyZXQpCi0JCQkJZ290byBvdXQ7CisJCW5ld19hZGRyID0gZ2V0X3VubWFwcGVkX2FyZWEodm1hLT52bV9maWxlLCAwLCBuZXdfbGVuLAorCQkJCQl2bWEtPnZtX3Bnb2ZmICsKKwkJCQkJKChhZGRyIC0gdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVCksCisJCQkJCW1hcF9mbGFncyk7CisJCWlmIChuZXdfYWRkciAmIH5QQUdFX01BU0spIHsKKwkJCXJldCA9IG5ld19hZGRyOworCQkJZ290byBvdXQ7CiAJCX0KKworCQlyZXQgPSBzZWN1cml0eV9maWxlX21tYXAoTlVMTCwgMCwgMCwgMCwgbmV3X2FkZHIsIDEpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CiAJCXJldCA9IG1vdmVfdm1hKHZtYSwgYWRkciwgb2xkX2xlbiwgbmV3X2xlbiwgbmV3X2FkZHIpOwogCX0KIG91dDoKIAlpZiAocmV0ICYgflBBR0VfTUFTSykKIAkJdm1fdW5hY2N0X21lbW9yeShjaGFyZ2VkKTsKLW91dF9uYzoKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9tbS9wZXJjcHUuYyBiL21tL3BlcmNwdS5jCmluZGV4IDVhZGZjMjYuLjQ0MjAxMGMgMTAwNjQ0Ci0tLSBhL21tL3BlcmNwdS5jCisrKyBiL21tL3BlcmNwdS5jCkBAIC00Niw4ICs0Niw2IEBACiAgKgogICogVG8gdXNlIHRoaXMgYWxsb2NhdG9yLCBhcmNoIGNvZGUgc2hvdWxkIGRvIHRoZSBmb2xsb3dpbmdzLgogICoKLSAqIC0gZHJvcCBDT05GSUdfSEFWRV9MRUdBQ1lfUEVSX0NQVV9BUkVBCi0gKgogICogLSBkZWZpbmUgX19hZGRyX3RvX3BjcHVfcHRyKCkgYW5kIF9fcGNwdV9wdHJfdG9fYWRkcigpIHRvIHRyYW5zbGF0ZQogICogICByZWd1bGFyIGFkZHJlc3MgdG8gcGVyY3B1IHBvaW50ZXIgYW5kIGJhY2sgaWYgdGhleSBuZWVkIHRvIGJlCiAgKiAgIGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0CkBAIC03NCw2ICs3Miw3IEBACiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2RlZmluZSBQQ1BVX1NMT1RfQkFTRV9TSElGVAkJNQkvKiAxLTMxIHNoYXJlcyB0aGUgc2FtZSBzbG90ICovCiAjZGVmaW5lIFBDUFVfREZMX01BUF9BTExPQwkJMTYJLyogc3RhcnQgYSBtYXAgd2l0aCAxNiBlbnRzICovCkBAIC0xMzAyLDYgKzEzMDEsMjcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGZyZWVfcGVyY3B1KTsKIAorLyoqCisgKiBwZXJfY3B1X3B0cl90b19waHlzIC0gY29udmVydCB0cmFuc2xhdGVkIHBlcmNwdSBhZGRyZXNzIHRvIHBoeXNpY2FsIGFkZHJlc3MKKyAqIEBhZGRyOiB0aGUgYWRkcmVzcyB0byBiZSBjb252ZXJ0ZWQgdG8gcGh5c2ljYWwgYWRkcmVzcworICoKKyAqIEdpdmVuIEBhZGRyIHdoaWNoIGlzIGRlcmVmZXJlbmNlYWJsZSBhZGRyZXNzIG9idGFpbmVkIHZpYSBvbmUgb2YKKyAqIHBlcmNwdSBhY2Nlc3MgbWFjcm9zLCB0aGlzIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgaXQgaW50byBpdHMgcGh5c2ljYWwKKyAqIGFkZHJlc3MuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyBAYWRkciBzdGF5cyB2YWxpZAorICogdW50aWwgdGhpcyBmdW5jdGlvbiBmaW5pc2hlcy4KKyAqCisgKiBSRVRVUk5TOgorICogVGhlIHBoeXNpY2FsIGFkZHJlc3MgZm9yIEBhZGRyLgorICovCitwaHlzX2FkZHJfdCBwZXJfY3B1X3B0cl90b19waHlzKHZvaWQgKmFkZHIpCit7CisJaWYgKCh1bnNpZ25lZCBsb25nKWFkZHIgPCBWTUFMTE9DX1NUQVJUIHx8CisJCQkodW5zaWduZWQgbG9uZylhZGRyID49IFZNQUxMT0NfRU5EKQorCQlyZXR1cm4gX19wYShhZGRyKTsKKwllbHNlCisJCXJldHVybiBwYWdlX3RvX3BoeXModm1hbGxvY190b19wYWdlKGFkZHIpKTsKK30KKwogc3RhdGljIGlubGluZSBzaXplX3QgcGNwdV9jYWxjX2ZjX3NpemVzKHNpemVfdCBzdGF0aWNfc2l6ZSwKIAkJCQkJc2l6ZV90IHJlc2VydmVkX3NpemUsCiAJCQkJCXNzaXplX3QgKmR5bl9zaXplcCkKZGlmZiAtLWdpdCBhL21tL3NsYWIuYyBiL21tL3NsYWIuYwppbmRleCA3ZGZhNDgxLi4zZjQ4MjI5IDEwMDY0NAotLS0gYS9tbS9zbGFiLmMKKysrIGIvbW0vc2xhYi5jCkBAIC00OTAsNyArNDkwLDcgQEAKIAogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfS01FTVRSQUNFCisjaWZkZWYgQ09ORklHX1RSQUNJTkcKIHNpemVfdCBzbGFiX2J1ZmZlcl9zaXplKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXApCiB7CiAJcmV0dXJuIGNhY2hlcC0+YnVmZmVyX3NpemU7CkBAIC02MDQsNjcgKzYwNCw2IEBACiAKICNkZWZpbmUgQkFEX0FMSUVOX01BR0lDIDB4MDEwMjAzMDR1bAogCi0jaWZkZWYgQ09ORklHX0xPQ0tERVAKLQotLyoKLSAqIFNsYWIgc29tZXRpbWVzIHVzZXMgdGhlIGttYWxsb2Mgc2xhYnMgdG8gc3RvcmUgdGhlIHNsYWIgaGVhZGVycwotICogZm9yIG90aGVyIHNsYWJzICJvZmYgc2xhYiIuCi0gKiBUaGUgbG9ja2luZyBmb3IgdGhpcyBpcyB0cmlja3kgaW4gdGhhdCBpdCBuZXN0cyB3aXRoaW4gdGhlIGxvY2tzCi0gKiBvZiBhbGwgb3RoZXIgc2xhYnMgaW4gYSBmZXcgcGxhY2VzOyB0byBkZWFsIHdpdGggdGhpcyBzcGVjaWFsCi0gKiBsb2NraW5nIHdlIHB1dCBvbi1zbGFiIGNhY2hlcyBpbnRvIGEgc2VwYXJhdGUgbG9jay1jbGFzcy4KLSAqCi0gKiBXZSBzZXQgbG9jayBjbGFzcyBmb3IgYWxpZW4gYXJyYXkgY2FjaGVzIHdoaWNoIGFyZSB1cCBkdXJpbmcgaW5pdC4KLSAqIFRoZSBsb2NrIGFubm90YXRpb24gd2lsbCBiZSBsb3N0IGlmIGFsbCBjcHVzIG9mIGEgbm9kZSBnb2VzIGRvd24gYW5kCi0gKiB0aGVuIGNvbWVzIGJhY2sgdXAgZHVyaW5nIGhvdHBsdWcKLSAqLwotc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSBvbl9zbGFiX2wzX2tleTsKLXN0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgb25fc2xhYl9hbGNfa2V5OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9sb2NrX2tleXModm9pZCkKLQotewotCWludCBxOwotCXN0cnVjdCBjYWNoZV9zaXplcyAqcyA9IG1hbGxvY19zaXplczsKLQotCXdoaWxlIChzLT5jc19zaXplICE9IFVMT05HX01BWCkgewotCQlmb3JfZWFjaF9ub2RlKHEpIHsKLQkJCXN0cnVjdCBhcnJheV9jYWNoZSAqKmFsYzsKLQkJCWludCByOwotCQkJc3RydWN0IGttZW1fbGlzdDMgKmwzID0gcy0+Y3NfY2FjaGVwLT5ub2RlbGlzdHNbcV07Ci0JCQlpZiAoIWwzIHx8IE9GRl9TTEFCKHMtPmNzX2NhY2hlcCkpCi0JCQkJY29udGludWU7Ci0JCQlsb2NrZGVwX3NldF9jbGFzcygmbDMtPmxpc3RfbG9jaywgJm9uX3NsYWJfbDNfa2V5KTsKLQkJCWFsYyA9IGwzLT5hbGllbjsKLQkJCS8qCi0JCQkgKiBGSVhNRTogVGhpcyBjaGVjayBmb3IgQkFEX0FMSUVOX01BR0lDCi0JCQkgKiBzaG91bGQgZ28gYXdheSB3aGVuIGNvbW1vbiBzbGFiIGNvZGUgaXMgdGF1Z2h0IHRvCi0JCQkgKiB3b3JrIGV2ZW4gd2l0aG91dCBhbGllbiBjYWNoZXMuCi0JCQkgKiBDdXJyZW50bHksIG5vbiBOVU1BIGNvZGUgcmV0dXJucyBCQURfQUxJRU5fTUFHSUMKLQkJCSAqIGZvciBhbGxvY19hbGllbl9jYWNoZSwKLQkJCSAqLwotCQkJaWYgKCFhbGMgfHwgKHVuc2lnbmVkIGxvbmcpYWxjID09IEJBRF9BTElFTl9NQUdJQykKLQkJCQljb250aW51ZTsKLQkJCWZvcl9lYWNoX25vZGUocikgewotCQkJCWlmIChhbGNbcl0pCi0JCQkJCWxvY2tkZXBfc2V0X2NsYXNzKCZhbGNbcl0tPmxvY2ssCi0JCQkJCSAgICAgJm9uX3NsYWJfYWxjX2tleSk7Ci0JCQl9Ci0JCX0KLQkJcysrOwotCX0KLX0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9sb2NrX2tleXModm9pZCkKLXsKLX0KLSNlbmRpZgotCi0vKgotICogR3VhcmQgYWNjZXNzIHRvIHRoZSBjYWNoZS1jaGFpbi4KLSAqLwotc3RhdGljIERFRklORV9NVVRFWChjYWNoZV9jaGFpbl9tdXRleCk7Ci1zdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBjYWNoZV9jaGFpbjsKLQogLyoKICAqIGNoaWNrZW4gYW5kIGVnZyBwcm9ibGVtOiBkZWxheSB0aGUgcGVyLWNwdSBhcnJheSBhbGxvY2F0aW9uCiAgKiB1bnRpbCB0aGUgZ2VuZXJhbCBjYWNoZXMgYXJlIHVwLgpAQCAtNjg1LDcgKzYyNCw4MCBAQAogCXJldHVybiBnX2NwdWNhY2hlX3VwID49IEVBUkxZOwogfQogCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGRlbGF5ZWRfd29yaywgcmVhcF93b3JrKTsKKyNpZmRlZiBDT05GSUdfTE9DS0RFUAorCisvKgorICogU2xhYiBzb21ldGltZXMgdXNlcyB0aGUga21hbGxvYyBzbGFicyB0byBzdG9yZSB0aGUgc2xhYiBoZWFkZXJzCisgKiBmb3Igb3RoZXIgc2xhYnMgIm9mZiBzbGFiIi4KKyAqIFRoZSBsb2NraW5nIGZvciB0aGlzIGlzIHRyaWNreSBpbiB0aGF0IGl0IG5lc3RzIHdpdGhpbiB0aGUgbG9ja3MKKyAqIG9mIGFsbCBvdGhlciBzbGFicyBpbiBhIGZldyBwbGFjZXM7IHRvIGRlYWwgd2l0aCB0aGlzIHNwZWNpYWwKKyAqIGxvY2tpbmcgd2UgcHV0IG9uLXNsYWIgY2FjaGVzIGludG8gYSBzZXBhcmF0ZSBsb2NrLWNsYXNzLgorICoKKyAqIFdlIHNldCBsb2NrIGNsYXNzIGZvciBhbGllbiBhcnJheSBjYWNoZXMgd2hpY2ggYXJlIHVwIGR1cmluZyBpbml0LgorICogVGhlIGxvY2sgYW5ub3RhdGlvbiB3aWxsIGJlIGxvc3QgaWYgYWxsIGNwdXMgb2YgYSBub2RlIGdvZXMgZG93biBhbmQKKyAqIHRoZW4gY29tZXMgYmFjayB1cCBkdXJpbmcgaG90cGx1ZworICovCitzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IG9uX3NsYWJfbDNfa2V5Oworc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSBvbl9zbGFiX2FsY19rZXk7CisKK3N0YXRpYyB2b2lkIGluaXRfbm9kZV9sb2NrX2tleXMoaW50IHEpCit7CisJc3RydWN0IGNhY2hlX3NpemVzICpzID0gbWFsbG9jX3NpemVzOworCisJaWYgKGdfY3B1Y2FjaGVfdXAgIT0gRlVMTCkKKwkJcmV0dXJuOworCisJZm9yIChzID0gbWFsbG9jX3NpemVzOyBzLT5jc19zaXplICE9IFVMT05HX01BWDsgcysrKSB7CisJCXN0cnVjdCBhcnJheV9jYWNoZSAqKmFsYzsKKwkJc3RydWN0IGttZW1fbGlzdDMgKmwzOworCQlpbnQgcjsKKworCQlsMyA9IHMtPmNzX2NhY2hlcC0+bm9kZWxpc3RzW3FdOworCQlpZiAoIWwzIHx8IE9GRl9TTEFCKHMtPmNzX2NhY2hlcCkpCisJCQlyZXR1cm47CisJCWxvY2tkZXBfc2V0X2NsYXNzKCZsMy0+bGlzdF9sb2NrLCAmb25fc2xhYl9sM19rZXkpOworCQlhbGMgPSBsMy0+YWxpZW47CisJCS8qCisJCSAqIEZJWE1FOiBUaGlzIGNoZWNrIGZvciBCQURfQUxJRU5fTUFHSUMKKwkJICogc2hvdWxkIGdvIGF3YXkgd2hlbiBjb21tb24gc2xhYiBjb2RlIGlzIHRhdWdodCB0bworCQkgKiB3b3JrIGV2ZW4gd2l0aG91dCBhbGllbiBjYWNoZXMuCisJCSAqIEN1cnJlbnRseSwgbm9uIE5VTUEgY29kZSByZXR1cm5zIEJBRF9BTElFTl9NQUdJQworCQkgKiBmb3IgYWxsb2NfYWxpZW5fY2FjaGUsCisJCSAqLworCQlpZiAoIWFsYyB8fCAodW5zaWduZWQgbG9uZylhbGMgPT0gQkFEX0FMSUVOX01BR0lDKQorCQkJcmV0dXJuOworCQlmb3JfZWFjaF9ub2RlKHIpIHsKKwkJCWlmIChhbGNbcl0pCisJCQkJbG9ja2RlcF9zZXRfY2xhc3MoJmFsY1tyXS0+bG9jaywKKwkJCQkJJm9uX3NsYWJfYWxjX2tleSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2xvY2tfa2V5cyh2b2lkKQoreworCWludCBub2RlOworCisJZm9yX2VhY2hfbm9kZShub2RlKQorCQlpbml0X25vZGVfbG9ja19rZXlzKG5vZGUpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIGluaXRfbm9kZV9sb2NrX2tleXMoaW50IHEpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2xvY2tfa2V5cyh2b2lkKQoreworfQorI2VuZGlmCisKKy8qCisgKiBHdWFyZCBhY2Nlc3MgdG8gdGhlIGNhY2hlLWNoYWluLgorICovCitzdGF0aWMgREVGSU5FX01VVEVYKGNhY2hlX2NoYWluX211dGV4KTsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGNhY2hlX2NoYWluOworCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGRlbGF5ZWRfd29yaywgc2xhYl9yZWFwX3dvcmspOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBhcnJheV9jYWNoZSAqY3B1X2NhY2hlX2dldChzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwKQogewpAQCAtODI2LDcgKzgzOCw3IEBACiAgKiBvYmplY3RzIGZyZWVkIG9uIGRpZmZlcmVudCBub2RlcyBmcm9tIHdoaWNoIHRoZXkgd2VyZSBhbGxvY2F0ZWQpIGFuZCB0aGUKICAqIGZsdXNoaW5nIG9mIHJlbW90ZSBwY3BzIGJ5IGNhbGxpbmcgZHJhaW5fbm9kZV9wYWdlcy4KICAqLwotc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIHJlYXBfbm9kZSk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgc2xhYl9yZWFwX25vZGUpOwogCiBzdGF0aWMgdm9pZCBpbml0X3JlYXBfbm9kZShpbnQgY3B1KQogewpAQCAtODM2LDE3ICs4NDgsMTcgQEAKIAlpZiAobm9kZSA9PSBNQVhfTlVNTk9ERVMpCiAJCW5vZGUgPSBmaXJzdF9ub2RlKG5vZGVfb25saW5lX21hcCk7CiAKLQlwZXJfY3B1KHJlYXBfbm9kZSwgY3B1KSA9IG5vZGU7CisJcGVyX2NwdShzbGFiX3JlYXBfbm9kZSwgY3B1KSA9IG5vZGU7CiB9CiAKIHN0YXRpYyB2b2lkIG5leHRfcmVhcF9ub2RlKHZvaWQpCiB7Ci0JaW50IG5vZGUgPSBfX2dldF9jcHVfdmFyKHJlYXBfbm9kZSk7CisJaW50IG5vZGUgPSBfX2dldF9jcHVfdmFyKHNsYWJfcmVhcF9ub2RlKTsKIAogCW5vZGUgPSBuZXh0X25vZGUobm9kZSwgbm9kZV9vbmxpbmVfbWFwKTsKIAlpZiAodW5saWtlbHkobm9kZSA+PSBNQVhfTlVNTk9ERVMpKQogCQlub2RlID0gZmlyc3Rfbm9kZShub2RlX29ubGluZV9tYXApOwotCV9fZ2V0X2NwdV92YXIocmVhcF9ub2RlKSA9IG5vZGU7CisJX19nZXRfY3B1X3ZhcihzbGFiX3JlYXBfbm9kZSkgPSBub2RlOwogfQogCiAjZWxzZQpAQCAtODYzLDcgKzg3NSw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIF9fY3B1aW5pdCBzdGFydF9jcHVfdGltZXIoaW50IGNwdSkKIHsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrICpyZWFwX3dvcmsgPSAmcGVyX2NwdShyZWFwX3dvcmssIGNwdSk7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqcmVhcF93b3JrID0gJnBlcl9jcHUoc2xhYl9yZWFwX3dvcmssIGNwdSk7CiAKIAkvKgogCSAqIFdoZW4gdGhpcyBnZXRzIGNhbGxlZCBmcm9tIGRvX2luaXRjYWxscyB2aWEgY3B1Y2FjaGVfaW5pdCgpLApAQCAtMTAyNyw3ICsxMDM5LDcgQEAKICAqLwogc3RhdGljIHZvaWQgcmVhcF9hbGllbihzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCBzdHJ1Y3Qga21lbV9saXN0MyAqbDMpCiB7Ci0JaW50IG5vZGUgPSBfX2dldF9jcHVfdmFyKHJlYXBfbm9kZSk7CisJaW50IG5vZGUgPSBfX2dldF9jcHVfdmFyKHNsYWJfcmVhcF9ub2RlKTsKIAogCWlmIChsMy0+YWxpZW4pIHsKIAkJc3RydWN0IGFycmF5X2NhY2hlICphYyA9IGwzLT5hbGllbltub2RlXTsKQEAgLTEyNTQsNiArMTI2Niw4IEBACiAJCWtmcmVlKHNoYXJlZCk7CiAJCWZyZWVfYWxpZW5fY2FjaGUoYWxpZW4pOwogCX0KKwlpbml0X25vZGVfbG9ja19rZXlzKG5vZGUpOworCiAJcmV0dXJuIDA7CiBiYWQ6CiAJY3B1dXBfY2FuY2VsZWQoY3B1KTsKQEAgLTEyODYsOSArMTMwMCw5IEBACiAJCSAqIGFueXRoaW5nIGV4cGVuc2l2ZSBidXQgd2lsbCBvbmx5IG1vZGlmeSByZWFwX3dvcmsKIAkJICogYW5kIHJlc2NoZWR1bGUgdGhlIHRpbWVyLgogCQkqLwotCQljYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrKCZwZXJfY3B1KHJlYXBfd29yaywgY3B1KSk7CisJCWNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmsoJnBlcl9jcHUoc2xhYl9yZWFwX3dvcmssIGNwdSkpOwogCQkvKiBOb3cgdGhlIGNhY2hlX3JlYXBlciBpcyBndWFyYW50ZWVkIHRvIGJlIG5vdCBydW5uaW5nLiAqLwotCQlwZXJfY3B1KHJlYXBfd29yaywgY3B1KS53b3JrLmZ1bmMgPSBOVUxMOworCQlwZXJfY3B1KHNsYWJfcmVhcF93b3JrLCBjcHUpLndvcmsuZnVuYyA9IE5VTEw7CiAgIAkJYnJlYWs7CiAgIAljYXNlIENQVV9ET1dOX0ZBSUxFRDoKICAgCWNhc2UgQ1BVX0RPV05fRkFJTEVEX0ZST1pFTjoKQEAgLTMxMDMsMTMgKzMxMTcsMTkgQEAKIAl9IGVsc2UgewogCQlTVEFUU19JTkNfQUxMT0NNSVNTKGNhY2hlcCk7CiAJCW9ianAgPSBjYWNoZV9hbGxvY19yZWZpbGwoY2FjaGVwLCBmbGFncyk7CisJCS8qCisJCSAqIHRoZSAnYWMnIG1heSBiZSB1cGRhdGVkIGJ5IGNhY2hlX2FsbG9jX3JlZmlsbCgpLAorCQkgKiBhbmQga21lbWxlYWtfZXJhc2UoKSByZXF1aXJlcyBpdHMgY29ycmVjdCB2YWx1ZS4KKwkJICovCisJCWFjID0gY3B1X2NhY2hlX2dldChjYWNoZXApOwogCX0KIAkvKgogCSAqIFRvIGF2b2lkIGEgZmFsc2UgbmVnYXRpdmUsIGlmIGFuIG9iamVjdCB0aGF0IGlzIGluIG9uZSBvZiB0aGUKIAkgKiBwZXItQ1BVIGNhY2hlcyBpcyBsZWFrZWQsIHdlIG5lZWQgdG8gbWFrZSBzdXJlIGttZW1sZWFrIGRvZXNuJ3QKIAkgKiB0cmVhdCB0aGUgYXJyYXkgcG9pbnRlcnMgYXMgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdC4KIAkgKi8KLQlrbWVtbGVha19lcmFzZSgmYWMtPmVudHJ5W2FjLT5hdmFpbF0pOworCWlmIChvYmpwKQorCQlrbWVtbGVha19lcmFzZSgmYWMtPmVudHJ5W2FjLT5hdmFpbF0pOwogCXJldHVybiBvYmpwOwogfQogCkBAIC0zMzA2LDcgKzMzMjYsNyBAQAogCWNhY2hlX2FsbG9jX2RlYnVnY2hlY2tfYmVmb3JlKGNhY2hlcCwgZmxhZ3MpOwogCWxvY2FsX2lycV9zYXZlKHNhdmVfZmxhZ3MpOwogCi0JaWYgKHVubGlrZWx5KG5vZGVpZCA9PSAtMSkpCisJaWYgKG5vZGVpZCA9PSAtMSkKIAkJbm9kZWlkID0gbnVtYV9ub2RlX2lkKCk7CiAKIAlpZiAodW5saWtlbHkoIWNhY2hlcC0+bm9kZWxpc3RzW25vZGVpZF0pKSB7CkBAIC0zNTU4LDcgKzM1NzgsNyBAQAogfQogRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2FsbG9jKTsKIAotI2lmZGVmIENPTkZJR19LTUVNVFJBQ0UKKyNpZmRlZiBDT05GSUdfVFJBQ0lORwogdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub3RyYWNlKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIGdmcF90IGZsYWdzKQogewogCXJldHVybiBfX2NhY2hlX2FsbG9jKGNhY2hlcCwgZmxhZ3MsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CkBAIC0zNjIxLDcgKzM2NDEsNyBAQAogfQogRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2FsbG9jX25vZGUpOwogCi0jaWZkZWYgQ09ORklHX0tNRU1UUkFDRQorI2lmZGVmIENPTkZJR19UUkFDSU5HCiB2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGVfbm90cmFjZShzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLAogCQkJCSAgICBnZnBfdCBmbGFncywKIAkJCQkgICAgaW50IG5vZGVpZCkKQEAgLTM2NDksNyArMzY2OSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX1NMQUIpIHx8IGRlZmluZWQoQ09ORklHX0tNRU1UUkFDRSkKKyNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19TTEFCKSB8fCBkZWZpbmVkKENPTkZJR19UUkFDSU5HKQogdm9pZCAqX19rbWFsbG9jX25vZGUoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCBpbnQgbm9kZSkKIHsKIAlyZXR1cm4gX19kb19rbWFsbG9jX25vZGUoc2l6ZSwgZmxhZ3MsIG5vZGUsCkBAIC0zNjY5LDcgKzM2ODksNyBAQAogCXJldHVybiBfX2RvX2ttYWxsb2Nfbm9kZShzaXplLCBmbGFncywgbm9kZSwgTlVMTCk7CiB9CiBFWFBPUlRfU1lNQk9MKF9fa21hbGxvY19ub2RlKTsKLSNlbmRpZiAvKiBDT05GSUdfREVCVUdfU0xBQiAqLworI2VuZGlmIC8qIENPTkZJR19ERUJVR19TTEFCIHx8IENPTkZJR19UUkFDSU5HICovCiAjZW5kaWYgLyogQ09ORklHX05VTUEgKi8KIAogLyoqCkBAIC0zNzAxLDcgKzM3MjEsNyBAQAogfQogCiAKLSNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19TTEFCKSB8fCBkZWZpbmVkKENPTkZJR19LTUVNVFJBQ0UpCisjaWYgZGVmaW5lZChDT05GSUdfREVCVUdfU0xBQikgfHwgZGVmaW5lZChDT05GSUdfVFJBQ0lORykKIHZvaWQgKl9fa21hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCiB7CiAJcmV0dXJuIF9fZG9fa21hbGxvYyhzaXplLCBmbGFncywgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKZGlmZiAtLWdpdCBhL21tL3NsdWIuYyBiL21tL3NsdWIuYwppbmRleCA0OTk2ZmM3Li44ZDcxYWFmIDEwMDY0NAotLS0gYS9tbS9zbHViLmMKKysrIGIvbW0vc2x1Yi5jCkBAIC0xNzM1LDcgKzE3MzUsNyBAQAogCX0KIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAKLQlpZiAodW5saWtlbHkoKGdmcGZsYWdzICYgX19HRlBfWkVSTykgJiYgb2JqZWN0KSkKKwlpZiAodW5saWtlbHkoZ2ZwZmxhZ3MgJiBfX0dGUF9aRVJPKSAmJiBvYmplY3QpCiAJCW1lbXNldChvYmplY3QsIDAsIG9ianNpemUpOwogCiAJa21lbWNoZWNrX3NsYWJfYWxsb2MocywgZ2ZwZmxhZ3MsIG9iamVjdCwgYy0+b2Jqc2l6ZSk7CkBAIC0xNzU0LDcgKzE3NTQsNyBAQAogfQogRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2FsbG9jKTsKIAotI2lmZGVmIENPTkZJR19LTUVNVFJBQ0UKKyNpZmRlZiBDT05GSUdfVFJBQ0lORwogdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub3RyYWNlKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBnZnBfdCBnZnBmbGFncykKIHsKIAlyZXR1cm4gc2xhYl9hbGxvYyhzLCBnZnBmbGFncywgLTEsIF9SRVRfSVBfKTsKQEAgLTE3NzUsNyArMTc3NSw3IEBACiBFWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfYWxsb2Nfbm9kZSk7CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19LTUVNVFJBQ0UKKyNpZmRlZiBDT05GSUdfVFJBQ0lORwogdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlX25vdHJhY2Uoc3RydWN0IGttZW1fY2FjaGUgKnMsCiAJCQkJICAgIGdmcF90IGdmcGZsYWdzLAogCQkJCSAgICBpbnQgbm9kZSkKQEAgLTQzNzEsMTIgKzQzNzEsMjggQEAKIAlyZXR1cm4gbGVuICsgc3ByaW50ZihidWYgKyBsZW4sICJcbiIpOwogfQogCitzdGF0aWMgdm9pZCBjbGVhcl9zdGF0KHN0cnVjdCBrbWVtX2NhY2hlICpzLCBlbnVtIHN0YXRfaXRlbSBzaSkKK3sKKwlpbnQgY3B1OworCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCisJCWdldF9jcHVfc2xhYihzLCBjcHUpLT5zdGF0W3NpXSA9IDA7Cit9CisKICNkZWZpbmUgU1RBVF9BVFRSKHNpLCB0ZXh0KSAJCQkJCVwKIHN0YXRpYyBzc2l6ZV90IHRleHQjI19zaG93KHN0cnVjdCBrbWVtX2NhY2hlICpzLCBjaGFyICpidWYpCVwKIHsJCQkJCQkJCVwKIAlyZXR1cm4gc2hvd19zdGF0KHMsIGJ1Ziwgc2kpOwkJCQlcCiB9CQkJCQkJCQlcCi1TTEFCX0FUVFJfUk8odGV4dCk7CQkJCQkJXAorc3RhdGljIHNzaXplX3QgdGV4dCMjX3N0b3JlKHN0cnVjdCBrbWVtX2NhY2hlICpzLAkJXAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbmd0aCkJXAorewkJCQkJCQkJXAorCWlmIChidWZbMF0gIT0gJzAnKQkJCQkJXAorCQlyZXR1cm4gLUVJTlZBTDsJCQkJCVwKKwljbGVhcl9zdGF0KHMsIHNpKTsJCQkJCVwKKwlyZXR1cm4gbGVuZ3RoOwkJCQkJCVwKK30JCQkJCQkJCVwKK1NMQUJfQVRUUih0ZXh0KTsJCQkJCQlcCiAKIFNUQVRfQVRUUihBTExPQ19GQVNUUEFUSCwgYWxsb2NfZmFzdHBhdGgpOwogU1RBVF9BVFRSKEFMTE9DX1NMT1dQQVRILCBhbGxvY19zbG93cGF0aCk7CmRpZmYgLS1naXQgYS9tbS91dGlsLmMgYi9tbS91dGlsLmMKaW5kZXggN2MzNWFkOS4uYjM3N2NlNCAxMDA2NDQKLS0tIGEvbW0vdXRpbC5jCisrKyBiL21tL3V0aWwuYwpAQCAtNCw2ICs0LDEwIEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwpAQCAtMjY4LDYgKzI3Miw0NiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZ2V0X3VzZXJfcGFnZXNfZmFzdCk7CiAKK1NZU0NBTExfREVGSU5FNihtbWFwX3Bnb2ZmLCB1bnNpZ25lZCBsb25nLCBhZGRyLCB1bnNpZ25lZCBsb25nLCBsZW4sCisJCXVuc2lnbmVkIGxvbmcsIHByb3QsIHVuc2lnbmVkIGxvbmcsIGZsYWdzLAorCQl1bnNpZ25lZCBsb25nLCBmZCwgdW5zaWduZWQgbG9uZywgcGdvZmYpCit7CisJc3RydWN0IGZpbGUgKiBmaWxlID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIHJldHZhbCA9IC1FQkFERjsKKworCWlmICghKGZsYWdzICYgTUFQX0FOT05ZTU9VUykpIHsKKwkJaWYgKHVubGlrZWx5KGZsYWdzICYgTUFQX0hVR0VUTEIpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWZpbGUgPSBmZ2V0KGZkKTsKKwkJaWYgKCFmaWxlKQorCQkJZ290byBvdXQ7CisJfSBlbHNlIGlmIChmbGFncyAmIE1BUF9IVUdFVExCKSB7CisJCXN0cnVjdCB1c2VyX3N0cnVjdCAqdXNlciA9IE5VTEw7CisJCS8qCisJCSAqIFZNX05PUkVTRVJWRSBpcyB1c2VkIGJlY2F1c2UgdGhlIHJlc2VydmF0aW9ucyB3aWxsIGJlCisJCSAqIHRha2VuIHdoZW4gdm1fb3BzLT5tbWFwKCkgaXMgY2FsbGVkCisJCSAqIEEgZHVtbXkgdXNlciB2YWx1ZSBpcyB1c2VkIGJlY2F1c2Ugd2UgYXJlIG5vdCBsb2NraW5nCisJCSAqIG1lbW9yeSBzbyBubyBhY2NvdW50aW5nIGlzIG5lY2Vzc2FyeQorCQkgKi8KKwkJbGVuID0gQUxJR04obGVuLCBodWdlX3BhZ2Vfc2l6ZSgmZGVmYXVsdF9oc3RhdGUpKTsKKwkJZmlsZSA9IGh1Z2V0bGJfZmlsZV9zZXR1cChIVUdFVExCX0FOT05fRklMRSwgbGVuLCBWTV9OT1JFU0VSVkUsCisJCQkJCQkmdXNlciwgSFVHRVRMQl9BTk9OSFVHRV9JTk9ERSk7CisJCWlmIChJU19FUlIoZmlsZSkpCisJCQlyZXR1cm4gUFRSX0VSUihmaWxlKTsKKwl9CisKKwlmbGFncyAmPSB+KE1BUF9FWEVDVVRBQkxFIHwgTUFQX0RFTllXUklURSk7CisKKwlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCXJldHZhbCA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOworCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCisJaWYgKGZpbGUpCisJCWZwdXQoZmlsZSk7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKwogLyogVHJhY2Vwb2ludHMgZGVmaW5pdGlvbnMuICovCiBFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0woa21hbGxvYyk7CiBFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0woa21lbV9jYWNoZV9hbGxvYyk7CmRpZmYgLS1naXQgYS9tbS92bWFsbG9jLmMgYi9tbS92bWFsbG9jLmMKaW5kZXggMGY1NTFhNC4uOWIwOGQ3OSAxMDA2NDQKLS0tIGEvbW0vdm1hbGxvYy5jCisrKyBiL21tL3ZtYWxsb2MuYwpAQCAtNzYxLDcgKzc2MSw3IEBACiAJc3Bpbl9sb2NrKCZ2YnEtPmxvY2spOwogCWxpc3RfYWRkKCZ2Yi0+ZnJlZV9saXN0LCAmdmJxLT5mcmVlKTsKIAlzcGluX3VubG9jaygmdmJxLT5sb2NrKTsKLQlwdXRfY3B1X3Zhcih2bWFwX2NwdV9ibG9ja3MpOworCXB1dF9jcHVfdmFyKHZtYXBfYmxvY2tfcXVldWUpOwogCiAJcmV0dXJuIHZiOwogfQpAQCAtODI2LDcgKzgyNiw3IEBACiAJCX0KIAkJc3Bpbl91bmxvY2soJnZiLT5sb2NrKTsKIAl9Ci0JcHV0X2NwdV92YXIodm1hcF9jcHVfYmxvY2tzKTsKKwlwdXRfY3B1X3Zhcih2bWFwX2Jsb2NrX3F1ZXVlKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAogCWlmICghYWRkcikgewpkaWZmIC0tZ2l0IGEvbW0vdm1zdGF0LmMgYi9tbS92bXN0YXQuYwppbmRleCBjODEzMjFmLi5kYWQyMzI3IDEwMDY0NAotLS0gYS9tbS92bXN0YXQuYworKysgYi9tbS92bXN0YXQuYwpAQCAtODgzLDExICs4ODMsMTAgQEAKIAogc3RhdGljIHZvaWQgX19jcHVpbml0IHN0YXJ0X2NwdV90aW1lcihpbnQgY3B1KQogewotCXN0cnVjdCBkZWxheWVkX3dvcmsgKnZtc3RhdF93b3JrID0gJnBlcl9jcHUodm1zdGF0X3dvcmssIGNwdSk7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqd29yayA9ICZwZXJfY3B1KHZtc3RhdF93b3JrLCBjcHUpOwogCi0JSU5JVF9ERUxBWUVEX1dPUktfREVGRVJSQUJMRSh2bXN0YXRfd29yaywgdm1zdGF0X3VwZGF0ZSk7Ci0Jc2NoZWR1bGVfZGVsYXllZF93b3JrX29uKGNwdSwgdm1zdGF0X3dvcmssCi0JCQkJIF9fcm91bmRfamlmZmllc19yZWxhdGl2ZShIWiwgY3B1KSk7CisJSU5JVF9ERUxBWUVEX1dPUktfREVGRVJSQUJMRSh3b3JrLCB2bXN0YXRfdXBkYXRlKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmtfb24oY3B1LCB3b3JrLCBfX3JvdW5kX2ppZmZpZXNfcmVsYXRpdmUoSFosIGNwdSkpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9icjI2ODQuYyBiL25ldC9hdG0vYnIyNjg0LmMKaW5kZXggMjZhNjQ2ZC4uYzkyMzBjMyAxMDA2NDQKLS0tIGEvbmV0L2F0bS9icjI2ODQuYworKysgYi9uZXQvYXRtL2JyMjY4NC5jCkBAIC01NTQsNiArNTU0LDEyIEBACiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGJyMjY4NF9uZXRkZXZfb3BzX3JvdXRlZCA9IHsKKwkubmRvX3N0YXJ0X3htaXQgCT0gYnIyNjg0X3N0YXJ0X3htaXQsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBicjI2ODRfbWFjX2FkZHIsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1Cit9OworCiBzdGF0aWMgdm9pZCBicjI2ODRfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKIAlzdHJ1Y3QgYnIyNjg0X2RldiAqYnJkZXYgPSBCUlBSSVYobmV0ZGV2KTsKQEAgLTU2OSwxMSArNTc1LDEwIEBACiBzdGF0aWMgdm9pZCBicjI2ODRfc2V0dXBfcm91dGVkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJc3RydWN0IGJyMjY4NF9kZXYgKmJyZGV2ID0gQlJQUklWKG5ldGRldik7CisKIAlicmRldi0+bmV0X2RldiA9IG5ldGRldjsKLQogCW5ldGRldi0+aGFyZF9oZWFkZXJfbGVuID0gMDsKLQotCW5ldGRldi0+bmV0ZGV2X29wcyA9ICZicjI2ODRfbmV0ZGV2X29wczsKKwluZXRkZXYtPm5ldGRldl9vcHMgPSAmYnIyNjg0X25ldGRldl9vcHNfcm91dGVkOwogCW5ldGRldi0+YWRkcl9sZW4gPSAwOwogCW5ldGRldi0+bXR1ID0gMTUwMDsKIAluZXRkZXYtPnR5cGUgPSBBUlBIUkRfUFBQOwpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9sZWMuYyBiL25ldC9hdG0vbGVjLmMKaW5kZXggYjJkNjQ0NS4uNDI3NDliNyAxMDA2NDQKLS0tIGEvbmV0L2F0bS9sZWMuYworKysgYi9uZXQvYXRtL2xlYy5jCkBAIC02Miw3ICs2Miw2IEBACiBzdGF0aWMgbmV0ZGV2X3R4X3QgbGVjX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIGludCBsZWNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCBsZWNfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyBzdHJ1Y3QgbGVjX2FycF90YWJsZSAqbGVjX2FycF9maW5kKHN0cnVjdCBsZWNfcHJpdiAqcHJpdiwKIAkJCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICptYWNfYWRkcik7CiBzdGF0aWMgaW50IGxlY19hcnBfcmVtb3ZlKHN0cnVjdCBsZWNfcHJpdiAqcHJpdiwKQEAgLTY3MCwxMyArNjY5LDYgQEAKIAkubmRvX3NldF9tdWx0aWNhc3RfbGlzdAk9IGxlY19zZXRfbXVsdGljYXN0X2xpc3QsCiB9OwogCi0KLXN0YXRpYyB2b2lkIGxlY19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JZGV2LT5uZXRkZXZfb3BzID0gJmxlY19uZXRkZXZfb3BzOwotCXByaW50aygiJXM6IEluaXRpYWxpemVkIVxuIiwgZGV2LT5uYW1lKTsKLX0KLQogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbGVjX2N0cmxfbWFnaWNbXSA9IHsKIAkweGZmLAogCTB4MDAsCkBAIC04OTMsNiArODg1LDcgQEAKIAkJCWRldl9sZWNbaV0gPSBhbGxvY19ldGhlcmRldihzaXplKTsKIAkJaWYgKCFkZXZfbGVjW2ldKQogCQkJcmV0dXJuIC1FTk9NRU07CisJCWRldl9sZWNbaV0tPm5ldGRldl9vcHMgPSAmbGVjX25ldGRldl9vcHM7CiAJCXNucHJpbnRmKGRldl9sZWNbaV0tPm5hbWUsIElGTkFNU0laLCAibGVjJWQiLCBpKTsKIAkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXZfbGVjW2ldKSkgewogCQkJZnJlZV9uZXRkZXYoZGV2X2xlY1tpXSk7CkBAIC05MDEsNyArODk0LDYgQEAKIAogCQlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2X2xlY1tpXSk7CiAJCXByaXYtPmlzX3RyZGV2ID0gaXNfdHJkZXY7Ci0JCWxlY19pbml0KGRldl9sZWNbaV0pOwogCX0gZWxzZSB7CiAJCXByaXYgPSBuZXRkZXZfcHJpdihkZXZfbGVjW2ldKTsKIAkJaWYgKHByaXYtPmxlY2QpCmRpZmYgLS1naXQgYS9uZXQvY29tcGF0LmMgYi9uZXQvY29tcGF0LmMKaW5kZXggZTFhNTZhZC4uYTFmYjFiMCAxMDA2NDQKLS0tIGEvbmV0L2NvbXBhdC5jCisrKyBiL25ldC9jb21wYXQuYwpAQCAtNzU0LDI2ICs3NTQsMjEgQEAKIAogYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfcmVjdm1tc2coaW50IGZkLCBzdHJ1Y3QgY29tcGF0X21tc2doZHIgX191c2VyICptbXNnLAogCQkJCSAgICB1bnNpZ25lZCB2bGVuLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0JCQkJICAgIHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnRpbWVvdXQpCisJCQkJICAgIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgX191c2VyICp0aW1lb3V0KQogewogCWludCBkYXRhZ3JhbXM7CiAJc3RydWN0IHRpbWVzcGVjIGt0c3BlYzsKLQlzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqdXRzcGVjOwogCiAJaWYgKHRpbWVvdXQgPT0gTlVMTCkKIAkJcmV0dXJuIF9fc3lzX3JlY3ZtbXNnKGZkLCAoc3RydWN0IG1tc2doZHIgX191c2VyICopbW1zZywgdmxlbiwKIAkJCQkgICAgICBmbGFncyB8IE1TR19DTVNHX0NPTVBBVCwgTlVMTCk7CiAKLQl1dHNwZWMgPSAoc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKil0aW1lb3V0OwotCWlmIChnZXRfdXNlcihrdHNwZWMudHZfc2VjLCAmdXRzcGVjLT50dl9zZWMpIHx8Ci0JICAgIGdldF91c2VyKGt0c3BlYy50dl9uc2VjLCAmdXRzcGVjLT50dl9uc2VjKSkKKwlpZiAoZ2V0X2NvbXBhdF90aW1lc3BlYygma3RzcGVjLCB0aW1lb3V0KSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlkYXRhZ3JhbXMgPSBfX3N5c19yZWN2bW1zZyhmZCwgKHN0cnVjdCBtbXNnaGRyIF9fdXNlciAqKW1tc2csIHZsZW4sCiAJCQkJICAgZmxhZ3MgfCBNU0dfQ01TR19DT01QQVQsICZrdHNwZWMpOwotCWlmIChkYXRhZ3JhbXMgPiAwICYmCi0JICAgIChwdXRfdXNlcihrdHNwZWMudHZfc2VjLCAmdXRzcGVjLT50dl9zZWMpIHx8Ci0JICAgICBwdXRfdXNlcihrdHNwZWMudHZfbnNlYywgJnV0c3BlYy0+dHZfbnNlYykpKQorCWlmIChkYXRhZ3JhbXMgPiAwICYmIHB1dF9jb21wYXRfdGltZXNwZWMoJmt0c3BlYywgdGltZW91dCkpCiAJCWRhdGFncmFtcyA9IC1FRkFVTFQ7CiAKIAlyZXR1cm4gZGF0YWdyYW1zOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZGV2LmMgYi9uZXQvY29yZS9kZXYuYwppbmRleCBjMzZhMTdhLi42ZmU3ZDczIDEwMDY0NAotLS0gYS9uZXQvY29yZS9kZXYuYworKysgYi9uZXQvY29yZS9kZXYuYwpAQCAtNDc3MSwyMSArNDc3MSwyMyBAQAogCiBzdGF0aWMgdm9pZCByb2xsYmFja19yZWdpc3RlcmVkX21hbnkoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsICp0bXA7CiAKIAlCVUdfT04oZGV2X2Jvb3RfcGhhc2UpOwogCUFTU0VSVF9SVE5MKCk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgaGVhZCwgdW5yZWdfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXYsIHRtcCwgaGVhZCwgdW5yZWdfbGlzdCkgewogCQkvKiBTb21lIGRldmljZXMgY2FsbCB3aXRob3V0IHJlZ2lzdGVyaW5nCi0JCSAqIGZvciBpbml0aWFsaXphdGlvbiB1bndpbmQuCisJCSAqIGZvciBpbml0aWFsaXphdGlvbiB1bndpbmQuIFJlbW92ZSB0aG9zZQorCQkgKiBkZXZpY2VzIGFuZCBwcm9jZWVkIHdpdGggdGhlIHJlbWFpbmluZy4KIAkJICovCiAJCWlmIChkZXYtPnJlZ19zdGF0ZSA9PSBORVRSRUdfVU5JTklUSUFMSVpFRCkgewogCQkJcHJfZGVidWcoInVucmVnaXN0ZXJfbmV0ZGV2aWNlOiBkZXZpY2UgJXMvJXAgbmV2ZXIgIgogCQkJCSAid2FzIHJlZ2lzdGVyZWRcbiIsIGRldi0+bmFtZSwgZGV2KTsKIAogCQkJV0FSTl9PTigxKTsKLQkJCXJldHVybjsKKwkJCWxpc3RfZGVsKCZkZXYtPnVucmVnX2xpc3QpOworCQkJY29udGludWU7CiAJCX0KIAogCQlCVUdfT04oZGV2LT5yZWdfc3RhdGUgIT0gTkVUUkVHX1JFR0lTVEVSRUQpOwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvaXB2NC5jIGIvbmV0L2RjY3AvaXB2NC5jCmluZGV4IGVmYmNmZGMuLmRhZDdiYzQgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2lwdjQuYworKysgYi9uZXQvZGNjcC9pcHY0LmMKQEAgLTQwOCw3ICs0MDgsNyBAQAogCiAJZGNjcF9zeW5jX21zcyhuZXdzaywgZHN0X210dShkc3QpKTsKIAotCV9faW5ldF9oYXNoX25vbGlzdGVuKG5ld3NrKTsKKwlfX2luZXRfaGFzaF9ub2xpc3RlbihuZXdzaywgTlVMTCk7CiAJX19pbmV0X2luaGVyaXRfcG9ydChzaywgbmV3c2spOwogCiAJcmV0dXJuIG5ld3NrOwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvaXB2Ni5jIGIvbmV0L2RjY3AvaXB2Ni5jCmluZGV4IDY1NzQyMTUuLmJhZjA1Y2YgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2lwdjYuYworKysgYi9uZXQvZGNjcC9pcHY2LmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAkJCXJldHVybjsKIAkJfQogCQlsb2NhbF9iaF9kaXNhYmxlKCk7Ci0JCV9faW5ldDZfaGFzaChzayk7CisJCV9faW5ldDZfaGFzaChzaywgTlVMTCk7CiAJCWxvY2FsX2JoX2VuYWJsZSgpOwogCX0KIH0KQEAgLTY0NCw3ICs2NDQsNyBAQAogCW5ld2luZXQtPmluZXRfZGFkZHIgPSBuZXdpbmV0LT5pbmV0X3NhZGRyID0gTE9PUEJBQ0s0X0lQVjY7CiAJbmV3aW5ldC0+aW5ldF9yY3Zfc2FkZHIgPSBMT09QQkFDSzRfSVBWNjsKIAotCV9faW5ldDZfaGFzaChuZXdzayk7CisJX19pbmV0Nl9oYXNoKG5ld3NrLCBOVUxMKTsKIAlfX2luZXRfaW5oZXJpdF9wb3J0KHNrLCBuZXdzayk7CiAKIAlyZXR1cm4gbmV3c2s7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pbmV0X2hhc2h0YWJsZXMuYyBiL25ldC9pcHY0L2luZXRfaGFzaHRhYmxlcy5jCmluZGV4IDIxZTVlMzIuLjJiNzkzNzcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2luZXRfaGFzaHRhYmxlcy5jCisrKyBiL25ldC9pcHY0L2luZXRfaGFzaHRhYmxlcy5jCkBAIC0zNTEsMTIgKzM1MSwxMyBAQAogCQkJCQkgIGluZXQtPmluZXRfZHBvcnQpOwogfQogCi12b2lkIF9faW5ldF9oYXNoX25vbGlzdGVuKHN0cnVjdCBzb2NrICpzaykKK2ludCBfX2luZXRfaGFzaF9ub2xpc3RlbihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3KQogewogCXN0cnVjdCBpbmV0X2hhc2hpbmZvICpoYXNoaW5mbyA9IHNrLT5za19wcm90LT5oLmhhc2hpbmZvOwogCXN0cnVjdCBobGlzdF9udWxsc19oZWFkICpsaXN0OwogCXNwaW5sb2NrX3QgKmxvY2s7CiAJc3RydWN0IGluZXRfZWhhc2hfYnVja2V0ICpoZWFkOworCWludCB0d3JlZmNudCA9IDA7CiAKIAlXQVJOX09OKCFza191bmhhc2hlZChzaykpOwogCkBAIC0zNjcsOCArMzY4LDEzIEBACiAKIAlzcGluX2xvY2sobG9jayk7CiAJX19za19udWxsc19hZGRfbm9kZV9yY3Uoc2ssIGxpc3QpOworCWlmICh0dykgeworCQlXQVJOX09OKHNrLT5za19oYXNoICE9IHR3LT50d19oYXNoKTsKKwkJdHdyZWZjbnQgPSBpbmV0X3R3c2tfdW5oYXNoKHR3KTsKKwl9CiAJc3Bpbl91bmxvY2sobG9jayk7CiAJc29ja19wcm90X2ludXNlX2FkZChzb2NrX25ldChzayksIHNrLT5za19wcm90LCAxKTsKKwlyZXR1cm4gdHdyZWZjbnQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChfX2luZXRfaGFzaF9ub2xpc3Rlbik7CiAKQEAgLTM3OCw3ICszODQsNyBAQAogCXN0cnVjdCBpbmV0X2xpc3Rlbl9oYXNoYnVja2V0ICppbGI7CiAKIAlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9MSVNURU4pIHsKLQkJX19pbmV0X2hhc2hfbm9saXN0ZW4oc2spOworCQlfX2luZXRfaGFzaF9ub2xpc3RlbihzaywgTlVMTCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTQyNyw3ICs0MzMsNyBAQAogCQlzdHJ1Y3Qgc29jayAqc2ssIHUzMiBwb3J0X29mZnNldCwKIAkJaW50ICgqY2hlY2tfZXN0YWJsaXNoZWQpKHN0cnVjdCBpbmV0X3RpbWV3YWl0X2RlYXRoX3JvdyAqLAogCQkJc3RydWN0IHNvY2sgKiwgX191MTYsIHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKiopLAotCQl2b2lkICgqaGFzaCkoc3RydWN0IHNvY2sgKnNrKSkKKwkJaW50ICgqaGFzaCkoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0d3ApKQogewogCXN0cnVjdCBpbmV0X2hhc2hpbmZvICpoaW5mbyA9IGRlYXRoX3Jvdy0+aGFzaGluZm87CiAJY29uc3QgdW5zaWduZWQgc2hvcnQgc251bSA9IGluZXRfc2soc2spLT5pbmV0X251bTsKQEAgLTQzNSw2ICs0NDEsNyBAQAogCXN0cnVjdCBpbmV0X2JpbmRfYnVja2V0ICp0YjsKIAlpbnQgcmV0OwogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTsKKwlpbnQgdHdyZWZjbnQgPSAxOwogCiAJaWYgKCFzbnVtKSB7CiAJCWludCBpLCByZW1haW5pbmcsIGxvdywgaGlnaCwgcG9ydDsKQEAgLTQ5MywxMyArNTAwLDE4IEBACiAJCWluZXRfYmluZF9oYXNoKHNrLCB0YiwgcG9ydCk7CiAJCWlmIChza191bmhhc2hlZChzaykpIHsKIAkJCWluZXRfc2soc2spLT5pbmV0X3Nwb3J0ID0gaHRvbnMocG9ydCk7Ci0JCQloYXNoKHNrKTsKKwkJCXR3cmVmY250ICs9IGhhc2goc2ssIHR3KTsKIAkJfQorCQlpZiAodHcpCisJCQl0d3JlZmNudCArPSBpbmV0X3R3c2tfYmluZF91bmhhc2godHcsIGhpbmZvKTsKIAkJc3Bpbl91bmxvY2soJmhlYWQtPmxvY2spOwogCiAJCWlmICh0dykgewogCQkJaW5ldF90d3NrX2Rlc2NoZWR1bGUodHcsIGRlYXRoX3Jvdyk7Ci0JCQlpbmV0X3R3c2tfcHV0KHR3KTsKKwkJCXdoaWxlICh0d3JlZmNudCkgeworCQkJCXR3cmVmY250LS07CisJCQkJaW5ldF90d3NrX3B1dCh0dyk7CisJCQl9CiAJCX0KIAogCQlyZXQgPSAwOwpAQCAtNTEwLDcgKzUyMiw3IEBACiAJdGIgID0gaW5ldF9jc2soc2spLT5pY3NrX2JpbmRfaGFzaDsKIAlzcGluX2xvY2tfYmgoJmhlYWQtPmxvY2spOwogCWlmIChza19oZWFkKCZ0Yi0+b3duZXJzKSA9PSBzayAmJiAhc2stPnNrX2JpbmRfbm9kZS5uZXh0KSB7Ci0JCWhhc2goc2spOworCQloYXNoKHNrLCBOVUxMKTsKIAkJc3Bpbl91bmxvY2tfYmgoJmhlYWQtPmxvY2spOwogCQlyZXR1cm4gMDsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaW5ldF90aW1ld2FpdF9zb2NrLmMgYi9uZXQvaXB2NC9pbmV0X3RpbWV3YWl0X3NvY2suYwppbmRleCAwZmRmNDVlLi5jYzk0Y2MyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pbmV0X3RpbWV3YWl0X3NvY2suYworKysgYi9uZXQvaXB2NC9pbmV0X3RpbWV3YWl0X3NvY2suYwpAQCAtMTUsOSArMTUsMTMgQEAKICNpbmNsdWRlIDxuZXQvaXAuaD4KIAogCi0vKgotICogdW5oYXNoIGEgdGltZXdhaXQgc29ja2V0IGZyb20gZXN0YWJsaXNoZWQgaGFzaAotICogbG9jayBtdXN0IGJlIGhvbGQgYnkgY2FsbGVyCisvKioKKyAqCWluZXRfdHdza191bmhhc2ggLSB1bmhhc2ggYSB0aW1ld2FpdCBzb2NrZXQgZnJvbSBlc3RhYmxpc2hlZCBoYXNoCisgKglAdHc6IHRpbWV3YWl0IHNvY2tldAorICoKKyAqCXVuaGFzaCBhIHRpbWV3YWl0IHNvY2tldCBmcm9tIGVzdGFibGlzaGVkIGhhc2gsIGlmIGhhc2hlZC4KKyAqCWVoYXNoIGxvY2sgbXVzdCBiZSBoZWxkIGJ5IGNhbGxlci4KKyAqCVJldHVybnMgMSBpZiBjYWxsZXIgc2hvdWxkIGNhbGwgaW5ldF90d3NrX3B1dCgpIGFmdGVyIGxvY2sgcmVsZWFzZS4KICAqLwogaW50IGluZXRfdHdza191bmhhc2goc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqdHcpCiB7CkBAIC0yNiw2ICszMCwzNyBAQAogCiAJaGxpc3RfbnVsbHNfZGVsX3JjdSgmdHctPnR3X25vZGUpOwogCXNrX251bGxzX25vZGVfaW5pdCgmdHctPnR3X25vZGUpOworCS8qCisJICogV2UgY2Fubm90IGNhbGwgaW5ldF90d3NrX3B1dCgpIG91cnNlbGYgdW5kZXIgbG9jaywKKwkgKiBjYWxsZXIgbXVzdCBjYWxsIGl0IGZvciB1cy4KKwkgKi8KKwlyZXR1cm4gMTsKK30KKworLyoqCisgKglpbmV0X3R3c2tfYmluZF91bmhhc2ggLSB1bmhhc2ggYSB0aW1ld2FpdCBzb2NrZXQgZnJvbSBiaW5kIGhhc2gKKyAqCUB0dzogdGltZXdhaXQgc29ja2V0CisgKglAaGFzaGluZm86IGhhc2hpbmZvIHBvaW50ZXIKKyAqCisgKgl1bmhhc2ggYSB0aW1ld2FpdCBzb2NrZXQgZnJvbSBiaW5kIGhhc2gsIGlmIGhhc2hlZC4KKyAqCWJpbmQgaGFzaCBsb2NrIG11c3QgYmUgaGVsZCBieSBjYWxsZXIuCisgKglSZXR1cm5zIDEgaWYgY2FsbGVyIHNob3VsZCBjYWxsIGluZXRfdHdza19wdXQoKSBhZnRlciBsb2NrIHJlbGVhc2UuCisgKi8KK2ludCBpbmV0X3R3c2tfYmluZF91bmhhc2goc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqdHcsCisJCQkgIHN0cnVjdCBpbmV0X2hhc2hpbmZvICpoYXNoaW5mbykKK3sKKwlzdHJ1Y3QgaW5ldF9iaW5kX2J1Y2tldCAqdGIgPSB0dy0+dHdfdGI7CisKKwlpZiAoIXRiKQorCQlyZXR1cm4gMDsKKworCV9faGxpc3RfZGVsKCZ0dy0+dHdfYmluZF9ub2RlKTsKKwl0dy0+dHdfdGIgPSBOVUxMOworCWluZXRfYmluZF9idWNrZXRfZGVzdHJveShoYXNoaW5mby0+YmluZF9idWNrZXRfY2FjaGVwLCB0Yik7CisJLyoKKwkgKiBXZSBjYW5ub3QgY2FsbCBpbmV0X3R3c2tfcHV0KCkgb3Vyc2VsZiB1bmRlciBsb2NrLAorCSAqIGNhbGxlciBtdXN0IGNhbGwgaXQgZm9yIHVzLgorCSAqLwogCXJldHVybiAxOwogfQogCkBAIC0zNCw3ICs2OSw2IEBACiAJCQkgICAgIHN0cnVjdCBpbmV0X2hhc2hpbmZvICpoYXNoaW5mbykKIHsKIAlzdHJ1Y3QgaW5ldF9iaW5kX2hhc2hidWNrZXQgKmJoZWFkOwotCXN0cnVjdCBpbmV0X2JpbmRfYnVja2V0ICp0YjsKIAlpbnQgcmVmY250OwogCS8qIFVubGluayBmcm9tIGVzdGFibGlzaGVkIGhhc2hlcy4gKi8KIAlzcGlubG9ja190ICpsb2NrID0gaW5ldF9laGFzaF9sb2NrcChoYXNoaW5mbywgdHctPnR3X2hhc2gpOwpAQCAtNDYsMTUgKzgwLDExIEBACiAJLyogRGlzYXNzb2NpYXRlIHdpdGggYmluZCBidWNrZXQuICovCiAJYmhlYWQgPSAmaGFzaGluZm8tPmJoYXNoW2luZXRfYmhhc2hmbih0d3NrX25ldCh0dyksIHR3LT50d19udW0sCiAJCQloYXNoaW5mby0+Ymhhc2hfc2l6ZSldOworCiAJc3Bpbl9sb2NrKCZiaGVhZC0+bG9jayk7Ci0JdGIgPSB0dy0+dHdfdGI7Ci0JaWYgKHRiKSB7Ci0JCV9faGxpc3RfZGVsKCZ0dy0+dHdfYmluZF9ub2RlKTsKLQkJdHctPnR3X3RiID0gTlVMTDsKLQkJaW5ldF9iaW5kX2J1Y2tldF9kZXN0cm95KGhhc2hpbmZvLT5iaW5kX2J1Y2tldF9jYWNoZXAsIHRiKTsKLQkJcmVmY250Kys7Ci0JfQorCXJlZmNudCArPSBpbmV0X3R3c2tfYmluZF91bmhhc2godHcsIGhhc2hpbmZvKTsKIAlzcGluX3VubG9jaygmYmhlYWQtPmxvY2spOworCiAjaWZkZWYgU09DS19SRUZDTlRfREVCVUcKIAlpZiAoYXRvbWljX3JlYWQoJnR3LT50d19yZWZjbnQpICE9IDEpIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIHRpbWV3YWl0X3NvY2sgJXAgcmVmY250PSVkXG4iLApAQCAtMTI2LDcgKzE1Niw3IEBACiAKIAkvKgogCSAqIE5vdGVzIDoKLSAJICogLSBXZSBpbml0aWFsbHkgc2V0IHR3X3JlZmNudCB0byAwIGluIGluZXRfdHdza19hbGxvYygpCisJICogLSBXZSBpbml0aWFsbHkgc2V0IHR3X3JlZmNudCB0byAwIGluIGluZXRfdHdza19hbGxvYygpCiAJICogLSBXZSBhZGQgb25lIHJlZmVyZW5jZSBmb3IgdGhlIGJoYXNoIGxpbmsKIAkgKiAtIFdlIGFkZCBvbmUgcmVmZXJlbmNlIGZvciB0aGUgZWhhc2ggbGluawogCSAqIC0gV2Ugd2FudCB0aGlzIHJlZmNudCB1cGRhdGUgZG9uZSBiZWZvcmUgYWxsb3dpbmcgb3RoZXIKQEAgLTEzNiw3ICsxNjYsNiBAQAogCiAJc3Bpbl91bmxvY2sobG9jayk7CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKF9faW5ldF90d3NrX2hhc2hkYW5jZSk7CiAKIHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKmluZXRfdHdza19hbGxvYyhjb25zdCBzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IGludCBzdGF0ZSkKQEAgLTE3Nyw3ICsyMDYsNiBAQAogCiAJcmV0dXJuIHR3OwogfQotCiBFWFBPUlRfU1lNQk9MX0dQTChpbmV0X3R3c2tfYWxsb2MpOwogCiAvKiBSZXR1cm5zIG5vbi16ZXJvIGlmIHF1b3RhIGV4Y2VlZGVkLiAgKi8KQEAgLTI1Niw3ICsyODQsNiBAQAogb3V0OgogCXNwaW5fdW5sb2NrKCZ0d2RyLT5kZWF0aF9sb2NrKTsKIH0KLQogRVhQT1JUX1NZTUJPTF9HUEwoaW5ldF90d2RyX2hhbmdtYW4pOwogCiB2b2lkIGluZXRfdHdkcl90d2tpbGxfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC0yODcsNyArMzE0LDYgQEAKIAkJc3Bpbl91bmxvY2tfYmgoJnR3ZHItPmRlYXRoX2xvY2spOwogCX0KIH0KLQogRVhQT1JUX1NZTUJPTF9HUEwoaW5ldF90d2RyX3R3a2lsbF93b3JrKTsKIAogLyogVGhlc2UgYXJlIGFsd2F5cyBjYWxsZWQgZnJvbSBCSCBjb250ZXh0LiAgU2VlIGNhbGxlcnMgaW4KQEAgLTMwNyw3ICszMzMsNiBAQAogCXNwaW5fdW5sb2NrKCZ0d2RyLT5kZWF0aF9sb2NrKTsKIAlfX2luZXRfdHdza19raWxsKHR3LCB0d2RyLT5oYXNoaW5mbyk7CiB9Ci0KIEVYUE9SVF9TWU1CT0woaW5ldF90d3NrX2Rlc2NoZWR1bGUpOwogCiB2b2lkIGluZXRfdHdza19zY2hlZHVsZShzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dywKQEAgLTM4OCw3ICs0MTMsNiBAQAogCQltb2RfdGltZXIoJnR3ZHItPnR3X3RpbWVyLCBqaWZmaWVzICsgdHdkci0+cGVyaW9kKTsKIAlzcGluX3VubG9jaygmdHdkci0+ZGVhdGhfbG9jayk7CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKGluZXRfdHdza19zY2hlZHVsZSk7CiAKIHZvaWQgaW5ldF90d2RyX3R3Y2FsX3RpY2sodW5zaWduZWQgbG9uZyBkYXRhKQpAQCAtNDQ5LDcgKzQ3Myw2IEBACiAjZW5kaWYKIAlzcGluX3VubG9jaygmdHdkci0+ZGVhdGhfbG9jayk7CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKGluZXRfdHdkcl90d2NhbF90aWNrKTsKIAogdm9pZCBpbmV0X3R3c2tfcHVyZ2Uoc3RydWN0IGluZXRfaGFzaGluZm8gKmhhc2hpbmZvLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwLmMgYi9uZXQvaXB2NC90Y3AuYwppbmRleCBjODY2NmI3Li5iMGEyNmJiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3AuYworKysgYi9uZXQvaXB2NC90Y3AuYwpAQCAtMjU0MCwxMSArMjU0MCw2IEBACiAJCQljdGQudGNwY3RfY29va2llX2Rlc2lyZWQgPSBjdnAtPmNvb2tpZV9kZXNpcmVkOwogCQkJY3RkLnRjcGN0X3NfZGF0YV9kZXNpcmVkID0gY3ZwLT5zX2RhdGFfZGVzaXJlZDsKIAotCQkJLyogQ29va2llKHMpIHNhdmVkLCByZXR1cm4gYXMgbm9uY2UgKi8KLQkJCWlmIChzaXplb2YoY3RkLnRjcGN0X3ZhbHVlKSA8IGN2cC0+Y29va2llX3BhaXJfc2l6ZSkgewotCQkJCS8qIGltcG9zc2libGU/ICovCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9CiAJCQltZW1jcHkoJmN0ZC50Y3BjdF92YWx1ZVswXSwgJmN2cC0+Y29va2llX3BhaXJbMF0sCiAJCQkgICAgICAgY3ZwLT5jb29raWVfcGFpcl9zaXplKTsKIAkJCWN0ZC50Y3BjdF91c2VkID0gY3ZwLT5jb29raWVfcGFpcl9zaXplOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2lucHV0LmMgYi9uZXQvaXB2NC90Y3BfaW5wdXQuYwppbmRleCA1N2FlOTZhLi4xMmNhYjdkIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfaW5wdXQuYworKysgYi9uZXQvaXB2NC90Y3BfaW5wdXQuYwpAQCAtMjcxNyw2ICsyNzE3LDM1IEBACiAJfQogfQogCisvKiBXZSBjYW4gY2xlYXIgcmV0cmFuc19zdGFtcCB3aGVuIHRoZXJlIGFyZSBubyByZXRyYW5zbWlzc2lvbnMgaW4gdGhlCisgKiB3aW5kb3cuIEl0IHdvdWxkIHNlZW0gdGhhdCBpdCBpcyB0cml2aWFsbHkgYXZhaWxhYmxlIGZvciB1cyBpbgorICogdHAtPnJldHJhbnNfb3V0LCBob3dldmVyLCB0aGF0IGtpbmQgb2YgYXNzdW1wdGlvbnMgZG9lc24ndCBjb25zaWRlcgorICogd2hhdCB3aWxsIGhhcHBlbiBpZiBlcnJvcnMgb2NjdXIgd2hlbiBzZW5kaW5nIHJldHJhbnNtaXNzaW9uIGZvciB0aGUKKyAqIHNlY29uZCB0aW1lLiAuLi5JdCBjb3VsZCB0aGUgdGhhdCBzdWNoIHNlZ21lbnQgaGFzIG9ubHkKKyAqIFRDUENCX0VWRVJfUkVUUkFOUyBzZXQgYXQgdGhlIHByZXNlbnQgdGltZS4gSXQgc2VlbXMgdGhhdCBjaGVja2luZworICogdGhlIGhlYWQgc2tiIGlzIGVub3VnaCBleGNlcHQgZm9yIHNvbWUgcmVuZWdpbmcgY29ybmVyIGNhc2VzIHRoYXQKKyAqIGFyZSBub3Qgd29ydGggdGhlIGVmZm9ydC4KKyAqCisgKiBNYWluIHJlYXNvbiBmb3IgYWxsIHRoaXMgY29tcGxleGl0eSBpcyB0aGUgZmFjdCB0aGF0IGNvbm5lY3Rpb24gZHlpbmcKKyAqIHRpbWUgbm93IGRlcGVuZHMgb24gdGhlIHZhbGlkaXR5IG9mIHRoZSByZXRyYW5zX3N0YW1wLCBpbiBwYXJ0aWN1bGFyLAorICogdGhhdCBzdWNjZXNzaXZlIHJldHJhbnNtaXNzaW9ucyBvZiBhIHNlZ21lbnQgbXVzdCBub3QgYWR2YW5jZQorICogcmV0cmFuc19zdGFtcCB1bmRlciBhbnkgY29uZGl0aW9ucy4KKyAqLworc3RhdGljIGludCB0Y3BfYW55X3JldHJhbnNfZG9uZShzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWlmICh0cC0+cmV0cmFuc19vdXQpCisJCXJldHVybiAxOworCisJc2tiID0gdGNwX3dyaXRlX3F1ZXVlX2hlYWQoc2spOworCWlmICh1bmxpa2VseShza2IgJiYgVENQX1NLQl9DQihza2IpLT5zYWNrZWQgJiBUQ1BDQl9FVkVSX1JFVFJBTlMpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCiAvKiBVbmRvIGR1cmluZyBmYXN0IHJlY292ZXJ5IGFmdGVyIHBhcnRpYWwgQUNLLiAqLwogCiBzdGF0aWMgaW50IHRjcF90cnlfdW5kb19wYXJ0aWFsKHN0cnVjdCBzb2NrICpzaywgaW50IGFja2VkKQpAQCAtMjcyOSw3ICsyNzU4LDcgQEAKIAkJLyogUGxhaW4gbHVjayEgSG9sZSBpZiBmaWxsZWQgd2l0aCBkZWxheWVkCiAJCSAqIHBhY2tldCwgcmF0aGVyIHRoYW4gd2l0aCBhIHJldHJhbnNtaXQuCiAJCSAqLwotCQlpZiAodHAtPnJldHJhbnNfb3V0ID09IDApCisJCWlmICghdGNwX2FueV9yZXRyYW5zX2RvbmUoc2spKQogCQkJdHAtPnJldHJhbnNfc3RhbXAgPSAwOwogCiAJCXRjcF91cGRhdGVfcmVvcmRlcmluZyhzaywgdGNwX2ZhY2tldHNfb3V0KHRwKSArIGFja2VkLCAxKTsKQEAgLTI3ODgsNyArMjgxNyw3IEBACiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJaW50IHN0YXRlID0gVENQX0NBX09wZW47CiAKLQlpZiAodGNwX2xlZnRfb3V0KHRwKSB8fCB0cC0+cmV0cmFuc19vdXQgfHwgdHAtPnVuZG9fbWFya2VyKQorCWlmICh0Y3BfbGVmdF9vdXQodHApIHx8IHRjcF9hbnlfcmV0cmFuc19kb25lKHNrKSB8fCB0cC0+dW5kb19tYXJrZXIpCiAJCXN0YXRlID0gVENQX0NBX0Rpc29yZGVyOwogCiAJaWYgKGluZXRfY3NrKHNrKS0+aWNza19jYV9zdGF0ZSAhPSBzdGF0ZSkgewpAQCAtMjgwMyw3ICsyODMyLDcgQEAKIAogCXRjcF92ZXJpZnlfbGVmdF9vdXQodHApOwogCi0JaWYgKCF0cC0+ZnJ0b19jb3VudGVyICYmIHRwLT5yZXRyYW5zX291dCA9PSAwKQorCWlmICghdHAtPmZydG9fY291bnRlciAmJiAhdGNwX2FueV9yZXRyYW5zX2RvbmUoc2spKQogCQl0cC0+cmV0cmFuc19zdGFtcCA9IDA7CiAKIAlpZiAoZmxhZyAmIEZMQUdfRUNFKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2lwdjQuYyBiL25ldC9pcHY0L3RjcF9pcHY0LmMKaW5kZXggMjkwMDJhYi4uMTVlOTYwMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2lwdjQuYworKysgYi9uZXQvaXB2NC90Y3BfaXB2NC5jCkBAIC0xNDY0LDcgKzE0NjQsNyBAQAogCX0KICNlbmRpZgogCi0JX19pbmV0X2hhc2hfbm9saXN0ZW4obmV3c2spOworCV9faW5ldF9oYXNoX25vbGlzdGVuKG5ld3NrLCBOVUxMKTsKIAlfX2luZXRfaW5oZXJpdF9wb3J0KHNrLCBuZXdzayk7CiAKIAlyZXR1cm4gbmV3c2s7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfdGltZXIuYyBiL25ldC9pcHY0L3RjcF90aW1lci5jCmluZGV4IDgzNTNhNTMuLjg4MTZhMjAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF90aW1lci5jCisrKyBiL25ldC9pcHY0L3RjcF90aW1lci5jCkBAIC0xMzIsNiArMTMyLDM1IEBACiAJfQogfQogCisvKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYSAidGltZW91dCIgd2hpY2ggaXMgZXF1aXZhbGVudCB0byB0aGUgdGltZW91dCBvZiBhCisgKiBUQ1AgY29ubmVjdGlvbiBhZnRlciAiYm91bmRhcnkiIHVuc3VjZXNzZnVsLCBleHBvbmVudGlhbGx5IGJhY2tlZC1vZmYKKyAqIHJldHJhbnNtaXNzaW9ucyB3aXRoIGFuIGluaXRpYWwgUlRPIG9mIFRDUF9SVE9fTUlOLgorICovCitzdGF0aWMgYm9vbCByZXRyYW5zbWl0c190aW1lZF9vdXQoc3RydWN0IHNvY2sgKnNrLAorCQkJCSAgdW5zaWduZWQgaW50IGJvdW5kYXJ5KQoreworCXVuc2lnbmVkIGludCB0aW1lb3V0LCBsaW5lYXJfYmFja29mZl90aHJlc2g7CisJdW5zaWduZWQgaW50IHN0YXJ0X3RzOworCisJaWYgKCFpbmV0X2NzayhzayktPmljc2tfcmV0cmFuc21pdHMpCisJCXJldHVybiBmYWxzZTsKKworCWlmICh1bmxpa2VseSghdGNwX3NrKHNrKS0+cmV0cmFuc19zdGFtcCkpCisJCXN0YXJ0X3RzID0gVENQX1NLQl9DQih0Y3Bfd3JpdGVfcXVldWVfaGVhZChzaykpLT53aGVuOworCWVsc2UKKwkJc3RhcnRfdHMgPSB0Y3Bfc2soc2spLT5yZXRyYW5zX3N0YW1wOworCisJbGluZWFyX2JhY2tvZmZfdGhyZXNoID0gaWxvZzIoVENQX1JUT19NQVgvVENQX1JUT19NSU4pOworCisJaWYgKGJvdW5kYXJ5IDw9IGxpbmVhcl9iYWNrb2ZmX3RocmVzaCkKKwkJdGltZW91dCA9ICgoMiA8PCBib3VuZGFyeSkgLSAxKSAqIFRDUF9SVE9fTUlOOworCWVsc2UKKwkJdGltZW91dCA9ICgoMiA8PCBsaW5lYXJfYmFja29mZl90aHJlc2gpIC0gMSkgKiBUQ1BfUlRPX01JTiArCisJCQkgIChib3VuZGFyeSAtIGxpbmVhcl9iYWNrb2ZmX3RocmVzaCkgKiBUQ1BfUlRPX01BWDsKKworCXJldHVybiAodGNwX3RpbWVfc3RhbXAgLSBzdGFydF90cykgPj0gdGltZW91dDsKK30KKwogLyogQSB3cml0ZSB0aW1lb3V0IGhhcyBvY2N1cnJlZC4gUHJvY2VzcyB0aGUgYWZ0ZXIgZWZmZWN0cy4gKi8KIHN0YXRpYyBpbnQgdGNwX3dyaXRlX3RpbWVvdXQoc3RydWN0IHNvY2sgKnNrKQogewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaW5ldDZfaGFzaHRhYmxlcy5jIGIvbmV0L2lwdjYvaW5ldDZfaGFzaHRhYmxlcy5jCmluZGV4IGM4MTNlMjkuLjYzM2E2YzIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2luZXQ2X2hhc2h0YWJsZXMuYworKysgYi9uZXQvaXB2Ni9pbmV0Nl9oYXNodGFibGVzLmMKQEAgLTIyLDkgKzIyLDEwIEBACiAjaW5jbHVkZSA8bmV0L2luZXQ2X2hhc2h0YWJsZXMuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KIAotdm9pZCBfX2luZXQ2X2hhc2goc3RydWN0IHNvY2sgKnNrKQoraW50IF9faW5ldDZfaGFzaChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3KQogewogCXN0cnVjdCBpbmV0X2hhc2hpbmZvICpoYXNoaW5mbyA9IHNrLT5za19wcm90LT5oLmhhc2hpbmZvOworCWludCB0d3JlZmNudCA9IDA7CiAKIAlXQVJOX09OKCFza191bmhhc2hlZChzaykpOwogCkBAIC00NSwxMCArNDYsMTUgQEAKIAkJbG9jayA9IGluZXRfZWhhc2hfbG9ja3AoaGFzaGluZm8sIGhhc2gpOwogCQlzcGluX2xvY2sobG9jayk7CiAJCV9fc2tfbnVsbHNfYWRkX25vZGVfcmN1KHNrLCBsaXN0KTsKKwkJaWYgKHR3KSB7CisJCQlXQVJOX09OKHNrLT5za19oYXNoICE9IHR3LT50d19oYXNoKTsKKwkJCXR3cmVmY250ID0gaW5ldF90d3NrX3VuaGFzaCh0dyk7CisJCX0KIAkJc3Bpbl91bmxvY2sobG9jayk7CiAJfQogCiAJc29ja19wcm90X2ludXNlX2FkZChzb2NrX25ldChzayksIHNrLT5za19wcm90LCAxKTsKKwlyZXR1cm4gdHdyZWZjbnQ7CiB9CiBFWFBPUlRfU1lNQk9MKF9faW5ldDZfaGFzaCk7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3RjcF9pcHY2LmMgYi9uZXQvaXB2Ni90Y3BfaXB2Ni5jCmluZGV4IGFhZGQ3Y2UuLmVlOWNmNjIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3RjcF9pcHY2LmMKKysrIGIvbmV0L2lwdjYvdGNwX2lwdjYuYwpAQCAtOTYsNyArOTYsNyBAQAogCQkJcmV0dXJuOwogCQl9CiAJCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQkJX19pbmV0Nl9oYXNoKHNrKTsKKwkJX19pbmV0Nl9oYXNoKHNrLCBOVUxMKTsKIAkJbG9jYWxfYmhfZW5hYmxlKCk7CiAJfQogfQpAQCAtMTQ5Niw3ICsxNDk2LDcgQEAKIAl9CiAjZW5kaWYKIAotCV9faW5ldDZfaGFzaChuZXdzayk7CisJX19pbmV0Nl9oYXNoKG5ld3NrLCBOVUxMKTsKIAlfX2luZXRfaW5oZXJpdF9wb3J0KHNrLCBuZXdzayk7CiAKIAlyZXR1cm4gbmV3c2s7CmRpZmYgLS1naXQgYS9uZXQva2V5L2FmX2tleS5jIGIvbmV0L2tleS9hZl9rZXkuYwppbmRleCA4NDIwOWZiLi43NmZhNmZlIDEwMDY0NAotLS0gYS9uZXQva2V5L2FmX2tleS5jCisrKyBiL25ldC9rZXkvYWZfa2V5LmMKQEAgLTExOTMsNiArMTE5Myw3IEBACiAJCQl4LT5hYWxnLT5hbGdfa2V5X2xlbiA9IGtleS0+c2FkYl9rZXlfYml0czsKIAkJCW1lbWNweSh4LT5hYWxnLT5hbGdfa2V5LCBrZXkrMSwga2V5c2l6ZSk7CiAJCX0KKwkJeC0+YWFsZy0+YWxnX3RydW5jX2xlbiA9IGEtPnVpbmZvLmF1dGguaWN2X3RydW5jYml0czsKIAkJeC0+cHJvcHMuYWFsZ28gPSBzYS0+c2FkYl9zYV9hdXRoOwogCQkvKiB4LT5hbGdvLmZsYWdzID0gc2EtPnNhZGJfc2FfZmxhZ3M7ICovCiAJfQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2NmZy5jIGIvbmV0L21hYzgwMjExL2NmZy5jCmluZGV4IDkzZWUxZmQuLjZkYzM1NzkgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9jZmcuYworKysgYi9uZXQvbWFjODAyMTEvY2ZnLmMKQEAgLTM1NCw3ICszNTQsOCBAQAogCXNpbmZvLT5yeF9wYWNrZXRzID0gc3RhLT5yeF9wYWNrZXRzOwogCXNpbmZvLT50eF9wYWNrZXRzID0gc3RhLT50eF9wYWNrZXRzOwogCi0JaWYgKHN0YS0+bG9jYWwtPmh3LmZsYWdzICYgSUVFRTgwMjExX0hXX1NJR05BTF9EQk0pIHsKKwlpZiAoKHN0YS0+bG9jYWwtPmh3LmZsYWdzICYgSUVFRTgwMjExX0hXX1NJR05BTF9EQk0pIHx8CisJICAgIChzdGEtPmxvY2FsLT5ody5mbGFncyAmIElFRUU4MDIxMV9IV19TSUdOQUxfVU5TUEVDKSkgewogCQlzaW5mby0+ZmlsbGVkIHw9IFNUQVRJT05fSU5GT19TSUdOQUw7CiAJCXNpbmZvLT5zaWduYWwgPSAoczgpc3RhLT5sYXN0X3NpZ25hbDsKIAl9CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvaWVlZTgwMjExX2kuaCBiL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfaS5oCmluZGV4IDQxOWYxODYuLjkxZGM4NjMgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfaS5oCisrKyBiL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfaS5oCkBAIC03NDYsNiArNzQ2LDcgQEAKIAl1bnNpZ25lZCBpbnQgd21tX2FjbTsgLyogYml0IGZpZWxkIG9mIEFDTSBiaXRzIChCSVQoODAyLjFEIHRhZykpICovCiAKIAlib29sIHBzcG9sbGluZzsKKwlib29sIHNjYW5fcHNfZW5hYmxlZDsKIAkvKgogCSAqIFBTIGNhbiBvbmx5IGJlIGVuYWJsZWQgd2hlbiB3ZSBoYXZlIGV4YWN0bHkgb25lIG1hbmFnZWQKIAkgKiBpbnRlcmZhY2UgKGFuZCBtb25pdG9ycykgaW4gUFMsIHRoaXMgdGhlbiBwb2ludHMgdGhlcmUuCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWVzaC5jIGIvbmV0L21hYzgwMjExL21lc2guYwppbmRleCBjMGZlNDY0Li42YTQzMzE0IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvbWVzaC5jCisrKyBiL25ldC9tYWM4MDIxMS9tZXNoLmMKQEAgLTQyNyw3ICs0MjcsNyBAQAogCQljaGFyICphZGRyNSwgY2hhciAqYWRkcjYpCiB7CiAJaW50IGFlbGVuID0gMDsKLQltZW1zZXQobWVzaGhkciwgMCwgc2l6ZW9mKG1lc2hoZHIpKTsKKwltZW1zZXQobWVzaGhkciwgMCwgc2l6ZW9mKCptZXNoaGRyKSk7CiAJbWVzaGhkci0+dHRsID0gc2RhdGEtPnUubWVzaC5tc2hjZmcuZG90MTFNZXNoVFRMOwogCXB1dF91bmFsaWduZWQoY3B1X3RvX2xlMzIoc2RhdGEtPnUubWVzaC5tZXNoX3NlcW51bSksICZtZXNoaGRyLT5zZXFudW0pOwogCXNkYXRhLT51Lm1lc2gubWVzaF9zZXFudW0rKzsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9tZXNoLmggYi9uZXQvbWFjODAyMTEvbWVzaC5oCmluZGV4IDMxZTEwMjUuLjg1NTYyYzUgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9tZXNoLmgKKysrIGIvbmV0L21hYzgwMjExL21lc2guaApAQCAtMTg4LDggKzE4OCw5IEBACiAgKi8KICNkZWZpbmUgTUVTSF9QUkVRX01JTl9JTlQJMTAKICNkZWZpbmUgTUVTSF9ESUFNX1RSQVZFUlNBTF9USU1FIDUwCi0vKiBQYXRocyB3aWxsIGJlIHJlZnJlc2hlZCBpZiB0aGV5IGFyZSBjbG9zZXIgdGhhbiBQQVRIX1JFRlJFU0hfVElNRSB0byB0aGVpcgotICogZXhwaXJhdGlvbgorLyogQSBwYXRoIHdpbGwgYmUgcmVmcmVzaGVkIGlmIGl0IGlzIHVzZWQgUEFUSF9SRUZSRVNIX1RJTUUgbWlsbGlzZWNvbmRzIGJlZm9yZQorICogdGltaW5nIG91dC4gIFRoaXMgd2F5IGl0IHdpbGwgcmVtYWluIEFDVElWRSBhbmQgbm8gZGF0YSBmcmFtZXMgd2lsbCBiZQorICogdW5uZWNlc2FyaWx5IGhlbGQgaW4gdGhlIHBlbmRpbmcgcXVldWUuCiAgKi8KICNkZWZpbmUgTUVTSF9QQVRIX1JFRlJFU0hfVElNRQkJCTEwMDAKICNkZWZpbmUgTUVTSF9NSU5fRElTQ09WRVJZX1RJTUVPVVQgKDIgKiBNRVNIX0RJQU1fVFJBVkVSU0FMX1RJTUUpCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWVzaF9od21wLmMgYi9uZXQvbWFjODAyMTEvbWVzaF9od21wLmMKaW5kZXggODMzYjJmMy4uZDI4YWNiNiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL21lc2hfaHdtcC5jCisrKyBiL25ldC9tYWM4MDIxMS9tZXNoX2h3bXAuYwpAQCAtOTM3LDcgKzkzNyw3IEBACiAKIAlpZiAobXBhdGgtPmZsYWdzICYgTUVTSF9QQVRIX0FDVElWRSkgewogCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLAotCQkJICAgICAgIG1wYXRoLT5leHBfdGltZSArCisJCQkgICAgICAgbXBhdGgtPmV4cF90aW1lIC0KIAkJCSAgICAgICBtc2Vjc190b19qaWZmaWVzKHNkYXRhLT51Lm1lc2gubXNoY2ZnLnBhdGhfcmVmcmVzaF90aW1lKSkgJiYKIAkJICAgICFtZW1jbXAoc2RhdGEtPmRldi0+ZGV2X2FkZHIsIGhkci0+YWRkcjQsIEVUSF9BTEVOKSAmJgogCQkgICAgIShtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfUkVTT0xWSU5HKSAmJgpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL21sbWUuYyBiL25ldC9tYWM4MDIxMS9tbG1lLmMKaW5kZXggNmRjN2I1YS4uZDhkNTBmYiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL21sbWUuYworKysgYi9uZXQvbWFjODAyMTEvbWxtZS5jCkBAIC0xMDgzLDggKzEwODMsNiBAQAogCiAJaWVlZTgwMjExX3NldF93bW1fZGVmYXVsdChzZGF0YSk7CiAKLQlpZWVlODAyMTFfcmVjYWxjX2lkbGUobG9jYWwpOwotCiAJLyogY2hhbm5lbChfdHlwZSkgY2hhbmdlcyBhcmUgaGFuZGxlZCBieSBpZWVlODAyMTFfaHdfY29uZmlnICovCiAJbG9jYWwtPm9wZXJfY2hhbm5lbF90eXBlID0gTkw4MDIxMV9DSEFOX05PX0hUOwogCkBAIC0xMzcwLDYgKzEzNjgsNyBAQAogCiAJaWYgKCF3aykgewogCQlpZWVlODAyMTFfc2V0X2Rpc2Fzc29jKHNkYXRhLCB0cnVlKTsKKwkJaWVlZTgwMjExX3JlY2FsY19pZGxlKHNkYXRhLT5sb2NhbCk7CiAJfSBlbHNlIHsKIAkJbGlzdF9kZWwoJndrLT5saXN0KTsKIAkJa2ZyZWUod2spOwpAQCAtMTQwMyw2ICsxNDAyLDcgQEAKIAkJCXNkYXRhLT5kZXYtPm5hbWUsIG1nbXQtPnNhLCByZWFzb25fY29kZSk7CiAKIAlpZWVlODAyMTFfc2V0X2Rpc2Fzc29jKHNkYXRhLCBmYWxzZSk7CisJaWVlZTgwMjExX3JlY2FsY19pZGxlKHNkYXRhLT5sb2NhbCk7CiAJcmV0dXJuIFJYX01HTVRfQ0ZHODAyMTFfRElTQVNTT0M7CiB9CiAKQEAgLTIxMTcsNiArMjExNyw3IEBACiAJCQkJIiBhZnRlciAlZG1zLCBkaXNjb25uZWN0aW5nLlxuIiwKIAkJCQlic3NpZCwgKDEwMDAgKiBJRUVFODAyMTFfUFJPQkVfV0FJVCkvSFopOwogCQkJaWVlZTgwMjExX3NldF9kaXNhc3NvYyhzZGF0YSwgdHJ1ZSk7CisJCQlpZWVlODAyMTFfcmVjYWxjX2lkbGUobG9jYWwpOwogCQkJbXV0ZXhfdW5sb2NrKCZpZm1nZC0+bXR4KTsKIAkJCS8qCiAJCQkgKiBtdXN0IGJlIG91dHNpZGUgbG9jayBkdWUgdG8gY2ZnODAyMTEsCkBAIC0yNTYwLDYgKzI1NjEsOCBAQAogCQkJSUVFRTgwMjExX1NUWVBFX0RFQVVUSCwgcmVxLT5yZWFzb25fY29kZSwKIAkJCWNvb2tpZSk7CiAKKwlpZWVlODAyMTFfcmVjYWxjX2lkbGUoc2RhdGEtPmxvY2FsKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0yNTkyLDUgKzI1OTUsOCBAQAogCWllZWU4MDIxMV9zZW5kX2RlYXV0aF9kaXNhc3NvYyhzZGF0YSwgcmVxLT5ic3MtPmJzc2lkLAogCQkJSUVFRTgwMjExX1NUWVBFX0RJU0FTU09DLCByZXEtPnJlYXNvbl9jb2RlLAogCQkJY29va2llKTsKKworCWllZWU4MDIxMV9yZWNhbGNfaWRsZShzZGF0YS0+bG9jYWwpOworCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcnguYyBiL25ldC9tYWM4MDIxMS9yeC5jCmluZGV4IGYyMzdkZjQuLjlmMjgwN2EgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9yeC5jCisrKyBiL25ldC9tYWM4MDIxMS9yeC5jCkBAIC0xNzEyLDcgKzE3MTIsNiBAQAogCQkJbXBwX3BhdGhfYWRkKHByb3hpZWRfYWRkciwgbXBwX2FkZHIsIHNkYXRhKTsKIAkJfSBlbHNlIHsKIAkJCXNwaW5fbG9ja19iaCgmbXBwYXRoLT5zdGF0ZV9sb2NrKTsKLQkJCW1wcGF0aC0+ZXhwX3RpbWUgPSBqaWZmaWVzOwogCQkJaWYgKGNvbXBhcmVfZXRoZXJfYWRkcihtcHBhdGgtPm1wcCwgbXBwX2FkZHIpICE9IDApCiAJCQkJbWVtY3B5KG1wcGF0aC0+bXBwLCBtcHBfYWRkciwgRVRIX0FMRU4pOwogCQkJc3Bpbl91bmxvY2tfYmgoJm1wcGF0aC0+c3RhdGVfbG9jayk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvc2Nhbi5jIGIvbmV0L21hYzgwMjExL3NjYW4uYwppbmRleCA0Y2YzODdjLi5mMWE0YzcxIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvc2Nhbi5jCisrKyBiL25ldC9tYWM4MDIxMS9zY2FuLmMKQEAgLTIyNyw3ICsyMjcsOCBAQAogc3RhdGljIHZvaWQgaWVlZTgwMjExX3NjYW5fcHNfZW5hYmxlKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQogewogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwotCWJvb2wgcHMgPSBmYWxzZTsKKworCWxvY2FsLT5zY2FuX3BzX2VuYWJsZWQgPSBmYWxzZTsKIAogCS8qIEZJWE1FOiB3aGF0IHRvIGRvIHdoZW4gbG9jYWwtPnBzcG9sbGluZyBpcyB0cnVlPyAqLwogCkBAIC0yMzUsMTIgKzIzNiwxMyBAQAogCWNhbmNlbF93b3JrX3N5bmMoJmxvY2FsLT5keW5hbWljX3BzX2VuYWJsZV93b3JrKTsKIAogCWlmIChsb2NhbC0+aHcuY29uZi5mbGFncyAmIElFRUU4MDIxMV9DT05GX1BTKSB7Ci0JCXBzID0gdHJ1ZTsKKwkJbG9jYWwtPnNjYW5fcHNfZW5hYmxlZCA9IHRydWU7CiAJCWxvY2FsLT5ody5jb25mLmZsYWdzICY9IH5JRUVFODAyMTFfQ09ORl9QUzsKIAkJaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCwgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX1BTKTsKIAl9CiAKLQlpZiAoIXBzIHx8ICEobG9jYWwtPmh3LmZsYWdzICYgSUVFRTgwMjExX0hXX1BTX05VTExGVU5DX1NUQUNLKSkKKwlpZiAoIShsb2NhbC0+c2Nhbl9wc19lbmFibGVkKSB8fAorCSAgICAhKGxvY2FsLT5ody5mbGFncyAmIElFRUU4MDIxMV9IV19QU19OVUxMRlVOQ19TVEFDSykpCiAJCS8qCiAJCSAqIElmIHBvd2VyIHNhdmUgd2FzIGVuYWJsZWQsIG5vIG5lZWQgdG8gc2VuZCBhIG51bGxmdW5jCiAJCSAqIGZyYW1lIGJlY2F1c2UgQVAga25vd3MgdGhhdCB3ZSBhcmUgc2xlZXBpbmcuIEJ1dCBpZiB0aGUKQEAgLTI2MSw3ICsyNjMsNyBAQAogCiAJaWYgKCFsb2NhbC0+cHNfc2RhdGEpCiAJCWllZWU4MDIxMV9zZW5kX251bGxmdW5jKGxvY2FsLCBzZGF0YSwgMCk7Ci0JZWxzZSB7CisJZWxzZSBpZiAobG9jYWwtPnNjYW5fcHNfZW5hYmxlZCkgewogCQkvKgogCQkgKiBJbiAhSUVFRTgwMjExX0hXX1BTX05VTExGVU5DX1NUQUNLIGNhc2UgdGhlIGhhcmR3YXJlCiAJCSAqIHdpbGwgc2VuZCBhIG51bGxmdW5jIGZyYW1lIHdpdGggdGhlIHBvd2Vyc2F2ZSBiaXQgc2V0CkBAIC0yNzcsNiArMjc5LDE2IEBACiAJCSAqLwogCQlsb2NhbC0+aHcuY29uZi5mbGFncyB8PSBJRUVFODAyMTFfQ09ORl9QUzsKIAkJaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCwgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX1BTKTsKKwl9IGVsc2UgaWYgKGxvY2FsLT5ody5jb25mLmR5bmFtaWNfcHNfdGltZW91dCA+IDApIHsKKwkJLyoKKwkJICogSWYgSUVFRTgwMjExX0NPTkZfUFMgd2FzIG5vdCBzZXQgYW5kIHRoZSBkeW5hbWljX3BzX3RpbWVyCisJCSAqIGhhZCBiZWVuIHJ1bm5pbmcgYmVmb3JlIGxlYXZpbmcgdGhlIG9wZXJhdGluZyBjaGFubmVsLAorCQkgKiByZXN0YXJ0IHRoZSB0aW1lciBub3cgYW5kIHNlbmQgYSBudWxsZnVuYyBmcmFtZSB0byBpbmZvcm0KKwkJICogdGhlIEFQIHRoYXQgd2UgYXJlIGF3YWtlLgorCQkgKi8KKwkJaWVlZTgwMjExX3NlbmRfbnVsbGZ1bmMobG9jYWwsIHNkYXRhLCAwKTsKKwkJbW9kX3RpbWVyKCZsb2NhbC0+ZHluYW1pY19wc190aW1lciwgamlmZmllcyArCisJCQkgIG1zZWNzX3RvX2ppZmZpZXMobG9jYWwtPmh3LmNvbmYuZHluYW1pY19wc190aW1lb3V0KSk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvdXRpbC5jIGIvbmV0L21hYzgwMjExL3V0aWwuYwppbmRleCBkMDlmNzhiLi43OGE2ZTkyIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvdXRpbC5jCisrKyBiL25ldC9tYWM4MDIxMS91dGlsLmMKQEAgLTU3OSw3ICs1NzksNyBAQAogCQlpZiAoZWxlbiA+IGxlZnQpCiAJCQlicmVhazsKIAotCQlpZiAoY2FsY19jcmMgJiYgaWQgPCA2NCAmJiAoZmlsdGVyICYgQklUKGlkKSkpCisJCWlmIChjYWxjX2NyYyAmJiBpZCA8IDY0ICYmIChmaWx0ZXIgJiAoMVVMTCA8PCBpZCkpKQogCQkJY3JjID0gY3JjMzJfYmUoY3JjLCBwb3MgLSAyLCBlbGVuICsgMik7CiAKIAkJc3dpdGNoIChpZCkgewpkaWZmIC0tZ2l0IGEvbmV0L3Jma2lsbC9jb3JlLmMgYi9uZXQvcmZraWxsL2NvcmUuYwppbmRleCA0NDhlNWEwLi5jMjE4ZTA3IDEwMDY0NAotLS0gYS9uZXQvcmZraWxsL2NvcmUuYworKysgYi9uZXQvcmZraWxsL2NvcmUuYwpAQCAtNTc5LDYgKzU3OSw4IEBACiAKIHN0YXRpYyBjb25zdCBjaGFyICpyZmtpbGxfZ2V0X3R5cGVfc3RyKGVudW0gcmZraWxsX3R5cGUgdHlwZSkKIHsKKwlCVUlMRF9CVUdfT04oTlVNX1JGS0lMTF9UWVBFUyAhPSBSRktJTExfVFlQRV9GTSArIDEpOworCiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBSRktJTExfVFlQRV9XTEFOOgogCQlyZXR1cm4gIndsYW4iOwpAQCAtNTk3LDggKzU5OSw2IEBACiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJfQotCi0JQlVJTERfQlVHX09OKE5VTV9SRktJTExfVFlQRVMgIT0gUkZLSUxMX1RZUEVfRk0gKyAxKTsKIH0KIAogc3RhdGljIHNzaXplX3QgcmZraWxsX3R5cGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2FkZHIuYyBiL25ldC9zdW5ycGMvYWRkci5jCmluZGV4IGM3NDUwYzguLjZkY2RkMjUgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYWRkci5jCisrKyBiL25ldC9zdW5ycGMvYWRkci5jCkBAIC01NSwxNiArNTUsOCBAQAogCiAJLyoKIAkgKiBSRkMgNDI5MSwgU2VjdGlvbiAyLjIuMQotCSAqCi0JICogVG8ga2VlcCB0aGUgcmVzdWx0IGFzIHNob3J0IGFzIHBvc3NpYmxlLCBlc3BlY2lhbGx5Ci0JICogc2luY2Ugd2UgZG9uJ3Qgc2hvcnRoYW5kLCB3ZSBkb24ndCB3YW50IGxlYWRpbmcgemVyb3MKLQkgKiBpbiBlYWNoIGhhbGZ3b3JkLCBzbyBhdm9pZCAlcEk2LgogCSAqLwotCXJldHVybiBzbnByaW50ZihidWYsIGJ1ZmxlbiwgIiV4OiV4OiV4OiV4OiV4OiV4OiV4OiV4IiwKLQkJbnRvaHMoYWRkci0+czZfYWRkcjE2WzBdKSwgbnRvaHMoYWRkci0+czZfYWRkcjE2WzFdKSwKLQkJbnRvaHMoYWRkci0+czZfYWRkcjE2WzJdKSwgbnRvaHMoYWRkci0+czZfYWRkcjE2WzNdKSwKLQkJbnRvaHMoYWRkci0+czZfYWRkcjE2WzRdKSwgbnRvaHMoYWRkci0+czZfYWRkcjE2WzVdKSwKLQkJbnRvaHMoYWRkci0+czZfYWRkcjE2WzZdKSwgbnRvaHMoYWRkci0+czZfYWRkcjE2WzddKSk7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJXBJNmMiLCBhZGRyKTsKIH0KIAogc3RhdGljIHNpemVfdCBycGNfbnRvcDYoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGguYyBiL25ldC9zdW5ycGMvYXV0aC5jCmluZGV4IDc1MzVhN2IuLmYzOTRmYzEgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aC5jCisrKyBiL25ldC9zdW5ycGMvYXV0aC5jCkBAIC0xMjMsMTYgKzEyMywxOSBAQAogCWNsZWFyX2JpdChSUENBVVRIX0NSRURfSEFTSEVELCAmY3JlZC0+Y3JfZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZAorc3RhdGljIGludAogcnBjYXV0aF91bmhhc2hfY3JlZChzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQpCiB7CiAJc3BpbmxvY2tfdCAqY2FjaGVfbG9jazsKKwlpbnQgcmV0OwogCiAJY2FjaGVfbG9jayA9ICZjcmVkLT5jcl9hdXRoLT5hdV9jcmVkY2FjaGUtPmxvY2s7CiAJc3Bpbl9sb2NrKGNhY2hlX2xvY2spOwotCWlmIChhdG9taWNfcmVhZCgmY3JlZC0+Y3JfY291bnQpID09IDApCisJcmV0ID0gYXRvbWljX3JlYWQoJmNyZWQtPmNyX2NvdW50KSA9PSAwOworCWlmIChyZXQpCiAJCXJwY2F1dGhfdW5oYXNoX2NyZWRfbG9ja2VkKGNyZWQpOwogCXNwaW5fdW5sb2NrKGNhY2hlX2xvY2spOworCXJldHVybiByZXQ7CiB9CiAKIC8qCkBAIC00NDYsMzEgKzQ0OSwzNSBAQAogcHV0X3JwY2NyZWQoc3RydWN0IHJwY19jcmVkICpjcmVkKQogewogCS8qIEZhc3QgcGF0aCBmb3IgdW5oYXNoZWQgY3JlZGVudGlhbHMgKi8KLQlpZiAodGVzdF9iaXQoUlBDQVVUSF9DUkVEX0hBU0hFRCwgJmNyZWQtPmNyX2ZsYWdzKSAhPSAwKQotCQlnb3RvIG5lZWRfbG9jazsKLQotCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmY3JlZC0+Y3JfY291bnQpKQorCWlmICh0ZXN0X2JpdChSUENBVVRIX0NSRURfSEFTSEVELCAmY3JlZC0+Y3JfZmxhZ3MpID09IDApIHsKKwkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmNyZWQtPmNyX2NvdW50KSkKKwkJCWNyZWQtPmNyX29wcy0+Y3JkZXN0cm95KGNyZWQpOwogCQlyZXR1cm47Ci0JZ290byBvdXRfZGVzdHJveTsKLW5lZWRfbG9jazoKKwl9CisKIAlpZiAoIWF0b21pY19kZWNfYW5kX2xvY2soJmNyZWQtPmNyX2NvdW50LCAmcnBjX2NyZWRjYWNoZV9sb2NrKSkKIAkJcmV0dXJuOwogCWlmICghbGlzdF9lbXB0eSgmY3JlZC0+Y3JfbHJ1KSkgewogCQludW1iZXJfY3JlZF91bnVzZWQtLTsKIAkJbGlzdF9kZWxfaW5pdCgmY3JlZC0+Y3JfbHJ1KTsKIAl9Ci0JaWYgKHRlc3RfYml0KFJQQ0FVVEhfQ1JFRF9VUFRPREFURSwgJmNyZWQtPmNyX2ZsYWdzKSA9PSAwKQotCQlycGNhdXRoX3VuaGFzaF9jcmVkKGNyZWQpOwogCWlmICh0ZXN0X2JpdChSUENBVVRIX0NSRURfSEFTSEVELCAmY3JlZC0+Y3JfZmxhZ3MpICE9IDApIHsKLQkJY3JlZC0+Y3JfZXhwaXJlID0gamlmZmllczsKLQkJbGlzdF9hZGRfdGFpbCgmY3JlZC0+Y3JfbHJ1LCAmY3JlZF91bnVzZWQpOwotCQludW1iZXJfY3JlZF91bnVzZWQrKzsKLQkJc3Bpbl91bmxvY2soJnJwY19jcmVkY2FjaGVfbG9jayk7Ci0JCXJldHVybjsKKwkJaWYgKHRlc3RfYml0KFJQQ0FVVEhfQ1JFRF9VUFRPREFURSwgJmNyZWQtPmNyX2ZsYWdzKSAhPSAwKSB7CisJCQljcmVkLT5jcl9leHBpcmUgPSBqaWZmaWVzOworCQkJbGlzdF9hZGRfdGFpbCgmY3JlZC0+Y3JfbHJ1LCAmY3JlZF91bnVzZWQpOworCQkJbnVtYmVyX2NyZWRfdW51c2VkKys7CisJCQlnb3RvIG91dF9ub2Rlc3Ryb3k7CisJCX0KKwkJaWYgKCFycGNhdXRoX3VuaGFzaF9jcmVkKGNyZWQpKSB7CisJCQkvKiBXZSB3ZXJlIGhhc2hlZCBhbmQgc29tZW9uZSBsb29rZWQgdXMgdXAuLi4gKi8KKwkJCWdvdG8gb3V0X25vZGVzdHJveTsKKwkJfQogCX0KIAlzcGluX3VubG9jaygmcnBjX2NyZWRjYWNoZV9sb2NrKTsKLW91dF9kZXN0cm95OgogCWNyZWQtPmNyX29wcy0+Y3JkZXN0cm95KGNyZWQpOworCXJldHVybjsKK291dF9ub2Rlc3Ryb3k6CisJc3Bpbl91bmxvY2soJnJwY19jcmVkY2FjaGVfbG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwdXRfcnBjY3JlZCk7CiAKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3MvYXV0aF9nc3MuYyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvYXV0aF9nc3MuYwppbmRleCBmYzZhNDNjLi4zYzNjNTBmIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2F1dGhfZ3NzLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9hdXRoX2dzcy5jCkBAIC0zMDQsNyArMzA0LDcgQEAKICAqIHRvIHRoYXQgdXBjYWxsIGluc3RlYWQgb2YgYWRkaW5nIHRoZSBuZXcgdXBjYWxsLgogICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBnc3NfdXBjYWxsX21zZyAqCi1nc3NfYWRkX21zZyhzdHJ1Y3QgZ3NzX2F1dGggKmdzc19hdXRoLCBzdHJ1Y3QgZ3NzX3VwY2FsbF9tc2cgKmdzc19tc2cpCitnc3NfYWRkX21zZyhzdHJ1Y3QgZ3NzX3VwY2FsbF9tc2cgKmdzc19tc2cpCiB7CiAJc3RydWN0IHJwY19pbm9kZSAqcnBjaSA9IGdzc19tc2ctPmlub2RlOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSAmcnBjaS0+dmZzX2lub2RlOwpAQCAtNDQ1LDcgKzQ0NSw3IEBACiAJZ3NzX25ldyA9IGdzc19hbGxvY19tc2coZ3NzX2F1dGgsIHVpZCwgY2xudCwgZ3NzX2NyZWQtPmdjX21hY2hpbmVfY3JlZCk7CiAJaWYgKElTX0VSUihnc3NfbmV3KSkKIAkJcmV0dXJuIGdzc19uZXc7Ci0JZ3NzX21zZyA9IGdzc19hZGRfbXNnKGdzc19hdXRoLCBnc3NfbmV3KTsKKwlnc3NfbXNnID0gZ3NzX2FkZF9tc2coZ3NzX25ldyk7CiAJaWYgKGdzc19tc2cgPT0gZ3NzX25ldykgewogCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gJmdzc19uZXctPmlub2RlLT52ZnNfaW5vZGU7CiAJCWludCByZXMgPSBycGNfcXVldWVfdXBjYWxsKGlub2RlLCAmZ3NzX25ldy0+bXNnKTsKQEAgLTQ4NSw3ICs0ODUsNyBAQAogCWRwcmludGsoIlJQQzogJTV1IGdzc19yZWZyZXNoX3VwY2FsbCBmb3IgdWlkICV1XG4iLCB0YXNrLT50a19waWQsCiAJCQkJCQkJCWNyZWQtPmNyX3VpZCk7CiAJZ3NzX21zZyA9IGdzc19zZXR1cF91cGNhbGwodGFzay0+dGtfY2xpZW50LCBnc3NfYXV0aCwgY3JlZCk7Ci0JaWYgKElTX0VSUihnc3NfbXNnKSA9PSAtRUFHQUlOKSB7CisJaWYgKFBUUl9FUlIoZ3NzX21zZykgPT0gLUVBR0FJTikgewogCQkvKiBYWFg6IHdhcm5pbmcgb24gdGhlIGZpcnN0LCB1bmRlciB0aGUgYXNzdW1wdGlvbiB3ZQogCQkgKiBzaG91bGRuJ3Qgbm9ybWFsbHkgaGl0IHRoaXMgY2FzZSBvbiBhIHJlZnJlc2guICovCiAJCXdhcm5fZ3NzZCgpOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9jbG50LmMgYi9uZXQvc3VucnBjL2NsbnQuYwppbmRleCAzODgyOWUyLi4xNTQwMzRiIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2NsbnQuYworKysgYi9uZXQvc3VucnBjL2NsbnQuYwpAQCAtNzksNyArNzksNyBAQAogCiBzdGF0aWMgX19iZTMyCSpycGNfZW5jb2RlX2hlYWRlcihzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spOwogc3RhdGljIF9fYmUzMgkqcnBjX3ZlcmlmeV9oZWFkZXIoc3RydWN0IHJwY190YXNrICp0YXNrKTsKLXN0YXRpYyBpbnQJcnBjX3Bpbmcoc3RydWN0IHJwY19jbG50ICpjbG50LCBpbnQgZmxhZ3MpOworc3RhdGljIGludAlycGNfcGluZyhzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQpOwogCiBzdGF0aWMgdm9pZCBycGNfcmVnaXN0ZXJfY2xpZW50KHN0cnVjdCBycGNfY2xudCAqY2xudCkKIHsKQEAgLTM0MCw3ICszNDAsNyBAQAogCQlyZXR1cm4gY2xudDsKIAogCWlmICghKGFyZ3MtPmZsYWdzICYgUlBDX0NMTlRfQ1JFQVRFX05PUElORykpIHsKLQkJaW50IGVyciA9IHJwY19waW5nKGNsbnQsIFJQQ19UQVNLX1NPRlQpOworCQlpbnQgZXJyID0gcnBjX3BpbmcoY2xudCk7CiAJCWlmIChlcnIgIT0gMCkgewogCQkJcnBjX3NodXRkb3duX2NsaWVudChjbG50KTsKIAkJCXJldHVybiBFUlJfUFRSKGVycik7CkBAIC01MjgsNyArNTI4LDcgQEAKIAljbG50LT5jbF9wcm9nICAgICA9IHByb2dyYW0tPm51bWJlcjsKIAljbG50LT5jbF92ZXJzICAgICA9IHZlcnNpb24tPm51bWJlcjsKIAljbG50LT5jbF9zdGF0cyAgICA9IHByb2dyYW0tPnN0YXRzOwotCWVyciA9IHJwY19waW5nKGNsbnQsIFJQQ19UQVNLX1NPRlQpOworCWVyciA9IHJwY19waW5nKGNsbnQpOwogCWlmIChlcnIgIT0gMCkgewogCQlycGNfc2h1dGRvd25fY2xpZW50KGNsbnQpOwogCQljbG50ID0gRVJSX1BUUihlcnIpOwpAQCAtMTA2MCw3ICsxMDYwLDcgQEAKIAkJZ290byByZXRyeV90aW1lb3V0OwogCWNhc2UgLUVQRk5PU1VQUE9SVDoKIAkJLyogc2VydmVyIGRvZXNuJ3Qgc3VwcG9ydCBhbnkgcnBjYmluZCB2ZXJzaW9uIHdlIGtub3cgb2YgKi8KLQkJZHByaW50aygiUlBDOiAlNXUgcmVtb3RlIHJwY2JpbmQgc2VydmljZSB1bmF2YWlsYWJsZVxuIiwKKwkJZHByaW50aygiUlBDOiAlNXUgdW5yZWNvZ25pemVkIHJlbW90ZSBycGNiaW5kIHNlcnZpY2VcbiIsCiAJCQkJdGFzay0+dGtfcGlkKTsKIAkJYnJlYWs7CiAJY2FzZSAtRVBST1RPTk9TVVBQT1JUOgpAQCAtMTA2OSw2ICsxMDY5LDIxIEBACiAJCXRhc2stPnRrX3N0YXR1cyA9IDA7CiAJCXRhc2stPnRrX2FjdGlvbiA9IGNhbGxfYmluZDsKIAkJcmV0dXJuOworCWNhc2UgLUVDT05OUkVGVVNFRDoJCS8qIGNvbm5lY3Rpb24gcHJvYmxlbXMgKi8KKwljYXNlIC1FQ09OTlJFU0VUOgorCWNhc2UgLUVOT1RDT05OOgorCWNhc2UgLUVIT1NURE9XTjoKKwljYXNlIC1FSE9TVFVOUkVBQ0g6CisJY2FzZSAtRU5FVFVOUkVBQ0g6CisJY2FzZSAtRVBJUEU6CisJCWRwcmludGsoIlJQQzogJTV1IHJlbW90ZSBycGNiaW5kIHVucmVhY2hhYmxlOiAlZFxuIiwKKwkJCQl0YXNrLT50a19waWQsIHRhc2stPnRrX3N0YXR1cyk7CisJCWlmICghUlBDX0lTX1NPRlRDT05OKHRhc2spKSB7CisJCQlycGNfZGVsYXkodGFzaywgNSpIWik7CisJCQlnb3RvIHJldHJ5X3RpbWVvdXQ7CisJCX0KKwkJc3RhdHVzID0gdGFzay0+dGtfc3RhdHVzOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlkcHJpbnRrKCJSUEM6ICU1dSB1bnJlY29nbml6ZWQgcnBjYmluZCBlcnJvciAoJWQpXG4iLAogCQkJCXRhc2stPnRrX3BpZCwgLXRhc2stPnRrX3N0YXR1cyk7CkBAIC0xMTgwLDExICsxMTk1LDI1IEBACiBjYWxsX3RyYW5zbWl0X3N0YXR1cyhzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCiB7CiAJdGFzay0+dGtfYWN0aW9uID0gY2FsbF9zdGF0dXM7CisKKwkvKgorCSAqIENvbW1vbiBjYXNlOiBzdWNjZXNzLiAgRm9yY2UgdGhlIGNvbXBpbGVyIHRvIHB1dCB0aGlzCisJICogdGVzdCBmaXJzdC4KKwkgKi8KKwlpZiAodGFzay0+dGtfc3RhdHVzID09IDApIHsKKwkJeHBydF9lbmRfdHJhbnNtaXQodGFzayk7CisJCXJwY190YXNrX2ZvcmNlX3JlZW5jb2RlKHRhc2spOworCQlyZXR1cm47CisJfQorCiAJc3dpdGNoICh0YXNrLT50a19zdGF0dXMpIHsKIAljYXNlIC1FQUdBSU46CiAJCWJyZWFrOwogCWRlZmF1bHQ6CisJCWRwcmludF9zdGF0dXModGFzayk7CiAJCXhwcnRfZW5kX3RyYW5zbWl0KHRhc2spOworCQlycGNfdGFza19mb3JjZV9yZWVuY29kZSh0YXNrKTsKKwkJYnJlYWs7CiAJCS8qCiAJCSAqIFNwZWNpYWwgY2FzZXM6IGlmIHdlJ3ZlIGJlZW4gd2FpdGluZyBvbiB0aGUKIAkJICogc29ja2V0J3Mgd3JpdGVfc3BhY2UoKSBjYWxsYmFjaywgb3IgaWYgdGhlCkBAIC0xMTkyLDExICsxMjIxLDE2IEBACiAJCSAqIHRoZW4gaG9sZCBvbnRvIHRoZSB0cmFuc3BvcnQgbG9jay4KIAkJICovCiAJY2FzZSAtRUNPTk5SRUZVU0VEOgotCWNhc2UgLUVDT05OUkVTRVQ6Ci0JY2FzZSAtRU5PVENPTk46CiAJY2FzZSAtRUhPU1RET1dOOgogCWNhc2UgLUVIT1NUVU5SRUFDSDoKIAljYXNlIC1FTkVUVU5SRUFDSDoKKwkJaWYgKFJQQ19JU19TT0ZUQ09OTih0YXNrKSkgeworCQkJeHBydF9lbmRfdHJhbnNtaXQodGFzayk7CisJCQlycGNfZXhpdCh0YXNrLCB0YXNrLT50a19zdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKwljYXNlIC1FQ09OTlJFU0VUOgorCWNhc2UgLUVOT1RDT05OOgogCWNhc2UgLUVQSVBFOgogCQlycGNfdGFza19mb3JjZV9yZWVuY29kZSh0YXNrKTsKIAl9CkBAIC0xMzQ2LDYgKzEzODAsMTAgQEAKIAlkcHJpbnRrKCJSUEM6ICU1dSBjYWxsX3RpbWVvdXQgKG1ham9yKVxuIiwgdGFzay0+dGtfcGlkKTsKIAl0YXNrLT50a190aW1lb3V0cysrOwogCisJaWYgKFJQQ19JU19TT0ZUQ09OTih0YXNrKSkgeworCQlycGNfZXhpdCh0YXNrLCAtRVRJTUVET1VUKTsKKwkJcmV0dXJuOworCX0KIAlpZiAoUlBDX0lTX1NPRlQodGFzaykpIHsKIAkJaWYgKGNsbnQtPmNsX2NoYXR0eSkKIAkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IHNlcnZlciAlcyBub3QgcmVzcG9uZGluZywgdGltZWQgb3V0XG4iLApAQCAtMTY3NSwxNCArMTcxMywxNCBAQAogCS5wX2RlY29kZSA9IHJwY3Byb2NfZGVjb2RlX251bGwsCiB9OwogCi1zdGF0aWMgaW50IHJwY19waW5nKHN0cnVjdCBycGNfY2xudCAqY2xudCwgaW50IGZsYWdzKQorc3RhdGljIGludCBycGNfcGluZyhzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQpCiB7CiAJc3RydWN0IHJwY19tZXNzYWdlIG1zZyA9IHsKIAkJLnJwY19wcm9jID0gJnJwY3Byb2NfbnVsbCwKIAl9OwogCWludCBlcnI7CiAJbXNnLnJwY19jcmVkID0gYXV0aG51bGxfb3BzLmxvb2t1cF9jcmVkKE5VTEwsIE5VTEwsIDApOwotCWVyciA9IHJwY19jYWxsX3N5bmMoY2xudCwgJm1zZywgZmxhZ3MpOworCWVyciA9IHJwY19jYWxsX3N5bmMoY2xudCwgJm1zZywgUlBDX1RBU0tfU09GVCB8IFJQQ19UQVNLX1NPRlRDT05OKTsKIAlwdXRfcnBjY3JlZChtc2cucnBjX2NyZWQpOwogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3JwY2JfY2xudC5jIGIvbmV0L3N1bnJwYy9ycGNiX2NsbnQuYwppbmRleCA4MzBmYWY0Li4zZTM3NzJkIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3JwY2JfY2xudC5jCisrKyBiL25ldC9zdW5ycGMvcnBjYl9jbG50LmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbjYuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CkBAIC0xMTAsNiArMTExLDkgQEAKIHN0YXRpYyB2b2lkCQkJcnBjYl9tYXBfcmVsZWFzZSh2b2lkICpkYXRhKTsKIHN0YXRpYyBzdHJ1Y3QgcnBjX3Byb2dyYW0JcnBjYl9wcm9ncmFtOwogCitzdGF0aWMgc3RydWN0IHJwY19jbG50ICoJcnBjYl9sb2NhbF9jbG50Oworc3RhdGljIHN0cnVjdCBycGNfY2xudCAqCXJwY2JfbG9jYWxfY2xudDQ7CisKIHN0cnVjdCBycGNiaW5kX2FyZ3MgewogCXN0cnVjdCBycGNfeHBydCAqCXJfeHBydDsKIApAQCAtMTYzLDIxICsxNjcsNjAgQEAKIAkuc2luX3BvcnQJCT0gaHRvbnMoUlBDQklORF9QT1JUKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcnBjX2NsbnQgKnJwY2JfY3JlYXRlX2xvY2FsKHN0cnVjdCBzb2NrYWRkciAqYWRkciwKLQkJCQkJICBzaXplX3QgYWRkcmxlbiwgdTMyIHZlcnNpb24pCitzdGF0aWMgREVGSU5FX01VVEVYKHJwY2JfY3JlYXRlX2xvY2FsX211dGV4KTsKKworLyoKKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZQorICogaXMgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBpbnQgcnBjYl9jcmVhdGVfbG9jYWwodm9pZCkKIHsKIAlzdHJ1Y3QgcnBjX2NyZWF0ZV9hcmdzIGFyZ3MgPSB7Ci0JCS5wcm90b2NvbAk9IFhQUlRfVFJBTlNQT1JUX1VEUCwKLQkJLmFkZHJlc3MJPSBhZGRyLAotCQkuYWRkcnNpemUJPSBhZGRybGVuLAorCQkucHJvdG9jb2wJPSBYUFJUX1RSQU5TUE9SVF9UQ1AsCisJCS5hZGRyZXNzCT0gKHN0cnVjdCBzb2NrYWRkciAqKSZycGNiX2luYWRkcl9sb29wYmFjaywKKwkJLmFkZHJzaXplCT0gc2l6ZW9mKHJwY2JfaW5hZGRyX2xvb3BiYWNrKSwKIAkJLnNlcnZlcm5hbWUJPSAibG9jYWxob3N0IiwKIAkJLnByb2dyYW0JPSAmcnBjYl9wcm9ncmFtLAotCQkudmVyc2lvbgk9IHZlcnNpb24sCisJCS52ZXJzaW9uCT0gUlBDQlZFUlNfMiwKIAkJLmF1dGhmbGF2b3IJPSBSUENfQVVUSF9VTklYLAogCQkuZmxhZ3MJCT0gUlBDX0NMTlRfQ1JFQVRFX05PUElORywKIAl9OworCXN0cnVjdCBycGNfY2xudCAqY2xudCwgKmNsbnQ0OworCWludCByZXN1bHQgPSAwOwogCi0JcmV0dXJuIHJwY19jcmVhdGUoJmFyZ3MpOworCWlmIChycGNiX2xvY2FsX2NsbnQpCisJCXJldHVybiByZXN1bHQ7CisKKwltdXRleF9sb2NrKCZycGNiX2NyZWF0ZV9sb2NhbF9tdXRleCk7CisJaWYgKHJwY2JfbG9jYWxfY2xudCkKKwkJZ290byBvdXQ7CisKKwljbG50ID0gcnBjX2NyZWF0ZSgmYXJncyk7CisJaWYgKElTX0VSUihjbG50KSkgeworCQlkcHJpbnRrKCJSUEM6ICAgICAgIGZhaWxlZCB0byBjcmVhdGUgbG9jYWwgcnBjYmluZCAiCisJCQkJImNsaWVudCAoZXJybm8gJWxkKS5cbiIsIFBUUl9FUlIoY2xudCkpOworCQlyZXN1bHQgPSAtUFRSX0VSUihjbG50KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBUaGlzIHJlc3VsdHMgaW4gYW4gUlBDIHBpbmcuICBPbiBzeXN0ZW1zIHJ1bm5pbmcgcG9ydG1hcHBlciwKKwkgKiB0aGUgdjQgcGluZyB3aWxsIGZhaWwuICBQcm9jZWVkIGFueXdheSwgYnV0IGRpc2FsbG93IHJwY2IKKwkgKiB2NCB1cGNhbGxzLgorCSAqLworCWNsbnQ0ID0gcnBjX2JpbmRfbmV3X3Byb2dyYW0oY2xudCwgJnJwY2JfcHJvZ3JhbSwgUlBDQlZFUlNfNCk7CisJaWYgKElTX0VSUihjbG50NCkpIHsKKwkJZHByaW50aygiUlBDOiAgICAgICBmYWlsZWQgdG8gY3JlYXRlIGxvY2FsIHJwY2JpbmQgdjQgIgorCQkJCSJjbGVpbnQgKGVycm5vICVsZCkuXG4iLCBQVFJfRVJSKGNsbnQ0KSk7CisJCWNsbnQ0ID0gTlVMTDsKKwl9CisKKwlycGNiX2xvY2FsX2NsbnQgPSBjbG50OworCXJwY2JfbG9jYWxfY2xudDQgPSBjbG50NDsKKworb3V0OgorCW11dGV4X3VubG9jaygmcnBjYl9jcmVhdGVfbG9jYWxfbXV0ZXgpOworCXJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcnBjX2NsbnQgKnJwY2JfY3JlYXRlKGNoYXIgKmhvc3RuYW1lLCBzdHJ1Y3Qgc29ja2FkZHIgKnNydmFkZHIsCkBAIC0yMDksMjIgKzI1MiwxMyBAQAogCXJldHVybiBycGNfY3JlYXRlKCZhcmdzKTsKIH0KIAotc3RhdGljIGludCBycGNiX3JlZ2lzdGVyX2NhbGwoY29uc3QgdTMyIHZlcnNpb24sIHN0cnVjdCBycGNfbWVzc2FnZSAqbXNnKQorc3RhdGljIGludCBycGNiX3JlZ2lzdGVyX2NhbGwoc3RydWN0IHJwY19jbG50ICpjbG50LCBzdHJ1Y3QgcnBjX21lc3NhZ2UgKm1zZykKIHsKLQlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopJnJwY2JfaW5hZGRyX2xvb3BiYWNrOwotCXNpemVfdCBhZGRybGVuID0gc2l6ZW9mKHJwY2JfaW5hZGRyX2xvb3BiYWNrKTsKLQlzdHJ1Y3QgcnBjX2NsbnQgKnJwY2JfY2xudDsKIAlpbnQgcmVzdWx0LCBlcnJvciA9IDA7CiAKIAltc2ctPnJwY19yZXNwID0gJnJlc3VsdDsKIAotCXJwY2JfY2xudCA9IHJwY2JfY3JlYXRlX2xvY2FsKGFkZHIsIGFkZHJsZW4sIHZlcnNpb24pOwotCWlmICghSVNfRVJSKHJwY2JfY2xudCkpIHsKLQkJZXJyb3IgPSBycGNfY2FsbF9zeW5jKHJwY2JfY2xudCwgbXNnLCAwKTsKLQkJcnBjX3NodXRkb3duX2NsaWVudChycGNiX2NsbnQpOwotCX0gZWxzZQotCQllcnJvciA9IFBUUl9FUlIocnBjYl9jbG50KTsKLQorCWVycm9yID0gcnBjX2NhbGxfc3luYyhjbG50LCBtc2csIFJQQ19UQVNLX1NPRlRDT05OKTsKIAlpZiAoZXJyb3IgPCAwKSB7CiAJCWRwcmludGsoIlJQQzogICAgICAgZmFpbGVkIHRvIGNvbnRhY3QgbG9jYWwgcnBjYmluZCAiCiAJCQkJInNlcnZlciAoZXJybm8gJWQpLlxuIiwgLWVycm9yKTsKQEAgLTI3OSw2ICszMTMsMTEgQEAKIAlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0gewogCQkucnBjX2FyZ3AJPSAmbWFwLAogCX07CisJaW50IGVycm9yOworCisJZXJyb3IgPSBycGNiX2NyZWF0ZV9sb2NhbCgpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOwogCiAJZHByaW50aygiUlBDOiAgICAgICAlc3JlZ2lzdGVyaW5nICgldSwgJXUsICVkLCAldSkgd2l0aCBsb2NhbCAiCiAJCQkicnBjYmluZFxuIiwgKHBvcnQgPyAiIiA6ICJ1biIpLApAQCAtMjg4LDcgKzMyNyw3IEBACiAJaWYgKHBvcnQpCiAJCW1zZy5ycGNfcHJvYyA9ICZycGNiX3Byb2NlZHVyZXMyW1JQQ0JQUk9DX1NFVF07CiAKLQlyZXR1cm4gcnBjYl9yZWdpc3Rlcl9jYWxsKFJQQ0JWRVJTXzIsICZtc2cpOworCXJldHVybiBycGNiX3JlZ2lzdGVyX2NhbGwocnBjYl9sb2NhbF9jbG50LCAmbXNnKTsKIH0KIAogLyoKQEAgLTMxMyw3ICszNTIsNyBAQAogCWlmIChwb3J0KQogCQltc2ctPnJwY19wcm9jID0gJnJwY2JfcHJvY2VkdXJlczRbUlBDQlBST0NfU0VUXTsKIAotCXJlc3VsdCA9IHJwY2JfcmVnaXN0ZXJfY2FsbChSUENCVkVSU180LCBtc2cpOworCXJlc3VsdCA9IHJwY2JfcmVnaXN0ZXJfY2FsbChycGNiX2xvY2FsX2NsbnQ0LCBtc2cpOwogCWtmcmVlKG1hcC0+cl9hZGRyKTsKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtMzQwLDcgKzM3OSw3IEBACiAJaWYgKHBvcnQpCiAJCW1zZy0+cnBjX3Byb2MgPSAmcnBjYl9wcm9jZWR1cmVzNFtSUENCUFJPQ19TRVRdOwogCi0JcmVzdWx0ID0gcnBjYl9yZWdpc3Rlcl9jYWxsKFJQQ0JWRVJTXzQsIG1zZyk7CisJcmVzdWx0ID0gcnBjYl9yZWdpc3Rlcl9jYWxsKHJwY2JfbG9jYWxfY2xudDQsIG1zZyk7CiAJa2ZyZWUobWFwLT5yX2FkZHIpOwogCXJldHVybiByZXN1bHQ7CiB9CkBAIC0zNTYsNyArMzk1LDcgQEAKIAltYXAtPnJfYWRkciA9ICIiOwogCW1zZy0+cnBjX3Byb2MgPSAmcnBjYl9wcm9jZWR1cmVzNFtSUENCUFJPQ19VTlNFVF07CiAKLQlyZXR1cm4gcnBjYl9yZWdpc3Rlcl9jYWxsKFJQQ0JWRVJTXzQsIG1zZyk7CisJcmV0dXJuIHJwY2JfcmVnaXN0ZXJfY2FsbChycGNiX2xvY2FsX2NsbnQ0LCBtc2cpOwogfQogCiAvKioKQEAgLTQxNCw2ICs0NTMsMTMgQEAKIAlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0gewogCQkucnBjX2FyZ3AJPSAmbWFwLAogCX07CisJaW50IGVycm9yOworCisJZXJyb3IgPSBycGNiX2NyZWF0ZV9sb2NhbCgpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCWlmIChycGNiX2xvY2FsX2NsbnQ0ID09IE5VTEwpCisJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOwogCiAJaWYgKGFkZHJlc3MgPT0gTlVMTCkKIAkJcmV0dXJuIHJwY2JfdW5yZWdpc3Rlcl9hbGxfcHJvdG9mYW1pbGllcygmbXNnKTsKQEAgLTQ5MSw3ICs1MzcsNyBAQAogCQkucnBjX21lc3NhZ2UgPSAmbXNnLAogCQkuY2FsbGJhY2tfb3BzID0gJnJwY2JfZ2V0cG9ydF9vcHMsCiAJCS5jYWxsYmFja19kYXRhID0gbWFwLAotCQkuZmxhZ3MgPSBSUENfVEFTS19BU1lOQywKKwkJLmZsYWdzID0gUlBDX1RBU0tfQVNZTkMgfCBSUENfVEFTS19TT0ZUQ09OTiwKIAl9OwogCiAJcmV0dXJuIHJwY19ydW5fdGFzaygmdGFza19zZXR1cF9kYXRhKTsKQEAgLTEwMjcsMyArMTA3MywxNSBAQAogCS52ZXJzaW9uCT0gcnBjYl92ZXJzaW9uLAogCS5zdGF0cwkJPSAmcnBjYl9zdGF0cywKIH07CisKKy8qKgorICogY2xlYW51cF9ycGNiX2NsbnQgLSByZW1vdmUgeHBydHNvY2sncyBzeXNjdGxzLCB1bnJlZ2lzdGVyCisgKgorICovCit2b2lkIGNsZWFudXBfcnBjYl9jbG50KHZvaWQpCit7CisJaWYgKHJwY2JfbG9jYWxfY2xudDQpCisJCXJwY19zaHV0ZG93bl9jbGllbnQocnBjYl9sb2NhbF9jbG50NCk7CisJaWYgKHJwY2JfbG9jYWxfY2xudCkKKwkJcnBjX3NodXRkb3duX2NsaWVudChycGNiX2xvY2FsX2NsbnQpOworfQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdW5ycGNfc3ltcy5jIGIvbmV0L3N1bnJwYy9zdW5ycGNfc3ltcy5jCmluZGV4IDhjY2U5MjEuLmY0MzgzNDcgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvc3VucnBjX3N5bXMuYworKysgYi9uZXQvc3VucnBjL3N1bnJwY19zeW1zLmMKQEAgLTI0LDYgKzI0LDggQEAKIAogZXh0ZXJuIHN0cnVjdCBjYWNoZV9kZXRhaWwgaXBfbWFwX2NhY2hlLCB1bml4X2dpZF9jYWNoZTsKIAorZXh0ZXJuIHZvaWQgY2xlYW51cF9ycGNiX2NsbnQodm9pZCk7CisKIHN0YXRpYyBpbnQgX19pbml0CiBpbml0X3N1bnJwYyh2b2lkKQogewpAQCAtNTMsNiArNTUsNyBAQAogc3RhdGljIHZvaWQgX19leGl0CiBjbGVhbnVwX3N1bnJwYyh2b2lkKQogeworCWNsZWFudXBfcnBjYl9jbG50KCk7CiAJcnBjYXV0aF9yZW1vdmVfbW9kdWxlKCk7CiAJY2xlYW51cF9zb2NrZXRfeHBydCgpOwogCXN2Y19jbGVhbnVwX3hwcnRfc29jaygpOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy94cHJ0LmMgYi9uZXQvc3VucnBjL3hwcnQuYwppbmRleCBmZDQ2ZDQyLi40NjlkZTI5IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3hwcnQuYworKysgYi9uZXQvc3VucnBjL3hwcnQuYwpAQCAtNzAwLDYgKzcwMCwxMCBAQAogCX0KIAlpZiAoIXhwcnRfbG9ja193cml0ZSh4cHJ0LCB0YXNrKSkKIAkJcmV0dXJuOworCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChYUFJUX0NMT1NFX1dBSVQsICZ4cHJ0LT5zdGF0ZSkpCisJCXhwcnQtPm9wcy0+Y2xvc2UoeHBydCk7CisKIAlpZiAoeHBydF9jb25uZWN0ZWQoeHBydCkpCiAJCXhwcnRfcmVsZWFzZV93cml0ZSh4cHJ0LCB0YXNrKTsKIAllbHNlIHsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMveHBydHNvY2suYyBiL25ldC9zdW5ycGMveHBydHNvY2suYwppbmRleCAwNDczMmQwLi4zZDczOWU1IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3hwcnRzb2NrLmMKKysrIGIvbmV0L3N1bnJwYy94cHJ0c29jay5jCkBAIC0yMDE5LDcgKzIwMTksNyBAQAogCWlmICh4cHJ0X3Rlc3RfYW5kX3NldF9jb25uZWN0aW5nKHhwcnQpKQogCQlyZXR1cm47CiAKLQlpZiAodHJhbnNwb3J0LT5zb2NrICE9IE5VTEwpIHsKKwlpZiAodHJhbnNwb3J0LT5zb2NrICE9IE5VTEwgJiYgIVJQQ19JU19TT0ZUQ09OTih0YXNrKSkgewogCQlkcHJpbnRrKCJSUEM6ICAgICAgIHhzX2Nvbm5lY3QgZGVsYXllZCB4cHJ0ICVwIGZvciAlbHUgIgogCQkJCSJzZWNvbmRzXG4iLAogCQkJCXhwcnQsIHhwcnQtPnJlZXN0YWJsaXNoX3RpbWVvdXQgLyBIWik7CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvcmVnLmMgYi9uZXQvd2lyZWxlc3MvcmVnLmMKaW5kZXggYzAxNDcwZS4uYmFhODk4YSAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3JlZy5jCisrKyBiL25ldC93aXJlbGVzcy9yZWcuYwpAQCAtMTQxLDYyICsxNDEsMzUgQEAKIAkucmVnX3J1bGVzID0gewogCQkvKiBJRUVFIDgwMi4xMWIvZywgY2hhbm5lbHMgMS4uMTEgKi8KIAkJUkVHX1JVTEUoMjQxMi0xMCwgMjQ2MisxMCwgNDAsIDYsIDI3LCAwKSwKLQkJLyogSUVFRSA4MDIuMTFhLCBjaGFubmVsIDM2ICovCi0JCVJFR19SVUxFKDUxODAtMTAsIDUxODArMTAsIDQwLCA2LCAyMywgMCksCi0JCS8qIElFRUUgODAyLjExYSwgY2hhbm5lbCA0MCAqLwotCQlSRUdfUlVMRSg1MjAwLTEwLCA1MjAwKzEwLCA0MCwgNiwgMjMsIDApLAotCQkvKiBJRUVFIDgwMi4xMWEsIGNoYW5uZWwgNDQgKi8KLQkJUkVHX1JVTEUoNTIyMC0xMCwgNTIyMCsxMCwgNDAsIDYsIDIzLCAwKSwKKwkJLyogSUVFRSA4MDIuMTFhLCBjaGFubmVsIDM2Li40OCAqLworCQlSRUdfUlVMRSg1MTgwLTEwLCA1MjQwKzEwLCA0MCwgNiwgMTcsIDApLAogCQkvKiBJRUVFIDgwMi4xMWEsIGNoYW5uZWxzIDQ4Li42NCAqLwotCQlSRUdfUlVMRSg1MjQwLTEwLCA1MzIwKzEwLCA0MCwgNiwgMjMsIDApLAorCQlSRUdfUlVMRSg1MjYwLTEwLCA1MzIwKzEwLCA0MCwgNiwgMjAsIE5MODAyMTFfUlJGX0RGUyksCisJCS8qIElFRUUgODAyLjExYSwgY2hhbm5lbHMgMTAwLi4xMjQgKi8KKwkJUkVHX1JVTEUoNTUwMC0xMCwgNTU5MCsxMCwgNDAsIDYsIDIwLCBOTDgwMjExX1JSRl9ERlMpLAorCQkvKiBJRUVFIDgwMi4xMWEsIGNoYW5uZWxzIDEzMi4uMTQ0ICovCisJCVJFR19SVUxFKDU2NjAtMTAsIDU3MDArMTAsIDQwLCA2LCAyMCwgTkw4MDIxMV9SUkZfREZTKSwKIAkJLyogSUVFRSA4MDIuMTFhLCBjaGFubmVscyAxNDkuLjE2NSwgb3V0ZG9vciAqLwogCQlSRUdfUlVMRSg1NzQ1LTEwLCA1ODI1KzEwLCA0MCwgNiwgMzAsIDApLAogCX0KIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiBqcF9yZWdkb20gPSB7Ci0JLm5fcmVnX3J1bGVzID0gMywKKwkubl9yZWdfcnVsZXMgPSA2LAogCS5hbHBoYTIgPSAgIkpQIiwKIAkucmVnX3J1bGVzID0gewotCQkvKiBJRUVFIDgwMi4xMWIvZywgY2hhbm5lbHMgMS4uMTQgKi8KLQkJUkVHX1JVTEUoMjQxMi0xMCwgMjQ4NCsxMCwgNDAsIDYsIDIwLCAwKSwKLQkJLyogSUVFRSA4MDIuMTFhLCBjaGFubmVscyAzNC4uNDggKi8KLQkJUkVHX1JVTEUoNTE3MC0xMCwgNTI0MCsxMCwgNDAsIDYsIDIwLAotCQkJTkw4MDIxMV9SUkZfUEFTU0lWRV9TQ0FOKSwKKwkJLyogSUVFRSA4MDIuMTFiL2csIGNoYW5uZWxzIDEuLjExICovCisJCVJFR19SVUxFKDI0MTItMTAsIDI0NjIrMTAsIDQwLCA2LCAyMCwgMCksCisJCS8qIElFRUUgODAyLjExYi9nLCBjaGFubmVscyAxMi4uMTMgKi8KKwkJUkVHX1JVTEUoMjQ2Ny0xMCwgMjQ3MisxMCwgMjAsIDYsIDIwLCAwKSwKKwkJLyogSUVFRSA4MDIuMTFiL2csIGNoYW5uZWwgMTQgKi8KKwkJUkVHX1JVTEUoMjQ4NC0xMCwgMjQ4NCsxMCwgMjAsIDYsIDIwLCBOTDgwMjExX1JSRl9OT19PRkRNKSwKKwkJLyogSUVFRSA4MDIuMTFhLCBjaGFubmVscyAzNi4uNDggKi8KKwkJUkVHX1JVTEUoNTE4MC0xMCwgNTI0MCsxMCwgNDAsIDYsIDIwLCAwKSwKIAkJLyogSUVFRSA4MDIuMTFhLCBjaGFubmVscyA1Mi4uNjQgKi8KLQkJUkVHX1JVTEUoNTI2MC0xMCwgNTMyMCsxMCwgNDAsIDYsIDIwLAotCQkJTkw4MDIxMV9SUkZfTk9fSUJTUyB8Ci0JCQlOTDgwMjExX1JSRl9ERlMpLAotCX0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiBldV9yZWdkb20gPSB7Ci0JLm5fcmVnX3J1bGVzID0gNiwKLQkvKgotCSAqIFRoaXMgYWxwaGEyIGlzIGJvZ3VzLCB3ZSBsZWF2ZSBpdCBoZXJlIGp1c3QgZm9yIHN0dXBpZAotCSAqIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLQkgKi8KLQkuYWxwaGEyID0gICJFVSIsCi0JLnJlZ19ydWxlcyA9IHsKLQkJLyogSUVFRSA4MDIuMTFiL2csIGNoYW5uZWxzIDEuLjEzICovCi0JCVJFR19SVUxFKDI0MTItMTAsIDI0NzIrMTAsIDQwLCA2LCAyMCwgMCksCi0JCS8qIElFRUUgODAyLjExYSwgY2hhbm5lbCAzNiAqLwotCQlSRUdfUlVMRSg1MTgwLTEwLCA1MTgwKzEwLCA0MCwgNiwgMjMsCi0JCQlOTDgwMjExX1JSRl9QQVNTSVZFX1NDQU4pLAotCQkvKiBJRUVFIDgwMi4xMWEsIGNoYW5uZWwgNDAgKi8KLQkJUkVHX1JVTEUoNTIwMC0xMCwgNTIwMCsxMCwgNDAsIDYsIDIzLAotCQkJTkw4MDIxMV9SUkZfUEFTU0lWRV9TQ0FOKSwKLQkJLyogSUVFRSA4MDIuMTFhLCBjaGFubmVsIDQ0ICovCi0JCVJFR19SVUxFKDUyMjAtMTAsIDUyMjArMTAsIDQwLCA2LCAyMywKLQkJCU5MODAyMTFfUlJGX1BBU1NJVkVfU0NBTiksCi0JCS8qIElFRUUgODAyLjExYSwgY2hhbm5lbHMgNDguLjY0ICovCi0JCVJFR19SVUxFKDUyNDAtMTAsIDUzMjArMTAsIDQwLCA2LCAyMCwKLQkJCU5MODAyMTFfUlJGX05PX0lCU1MgfAotCQkJTkw4MDIxMV9SUkZfREZTKSwKLQkJLyogSUVFRSA4MDIuMTFhLCBjaGFubmVscyAxMDAuLjE0MCAqLwotCQlSRUdfUlVMRSg1NTAwLTEwLCA1NzAwKzEwLCA0MCwgNiwgMzAsCi0JCQlOTDgwMjExX1JSRl9OT19JQlNTIHwKLQkJCU5MODAyMTFfUlJGX0RGUyksCisJCVJFR19SVUxFKDUyNjAtMTAsIDUzMjArMTAsIDQwLCA2LCAyMCwgTkw4MDIxMV9SUkZfREZTKSwKKwkJLyogSUVFRSA4MDIuMTFhLCBjaGFubmVscyAxMDAuLjE0NCAqLworCQlSRUdfUlVMRSg1NTAwLTEwLCA1NzAwKzEwLCA0MCwgNiwgMjMsIE5MODAyMTFfUlJGX0RGUyksCiAJfQogfTsKIApAQCAtMjA2LDE1ICsxNzksMTcgQEAKIAkJcmV0dXJuICZ1c19yZWdkb207CiAJaWYgKGFscGhhMlswXSA9PSAnSicgJiYgYWxwaGEyWzFdID09ICdQJykKIAkJcmV0dXJuICZqcF9yZWdkb207CisJLyogVXNlIHdvcmxkIHJvYW1pbmcgcnVsZXMgZm9yICJFVSIsIHNpbmNlIGl0IHdhcyBhIHBzZXVkbworCSAgIGRvbWFpbiBhbnl3YXkuLi4gKi8KIAlpZiAoYWxwaGEyWzBdID09ICdFJyAmJiBhbHBoYTJbMV0gPT0gJ1UnKQotCQlyZXR1cm4gJmV1X3JlZ2RvbTsKLQkvKiBEZWZhdWx0LCBhcyBwZXIgdGhlIG9sZCBydWxlcyAqLwotCXJldHVybiAmdXNfcmVnZG9tOworCQlyZXR1cm4gJndvcmxkX3JlZ2RvbTsKKwkvKiBEZWZhdWx0LCB3b3JsZCByb2FtaW5nIHJ1bGVzICovCisJcmV0dXJuICZ3b3JsZF9yZWdkb207CiB9CiAKIHN0YXRpYyBib29sIGlzX29sZF9zdGF0aWNfcmVnZG9tKGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluICpyZCkKIHsKLQlpZiAocmQgPT0gJnVzX3JlZ2RvbSB8fCByZCA9PSAmanBfcmVnZG9tIHx8IHJkID09ICZldV9yZWdkb20pCisJaWYgKHJkID09ICZ1c19yZWdkb20gfHwgcmQgPT0gJmpwX3JlZ2RvbSB8fCByZCA9PSAmd29ybGRfcmVnZG9tKQogCQlyZXR1cm4gdHJ1ZTsKIAlyZXR1cm4gZmFsc2U7CiB9CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvd2V4dC1jb21wYXQuYyBiL25ldC93aXJlbGVzcy93ZXh0LWNvbXBhdC5jCmluZGV4IDU4NGViNDguLjU0ZmFjZTMgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy93ZXh0LWNvbXBhdC5jCisrKyBiL25ldC93aXJlbGVzcy93ZXh0LWNvbXBhdC5jCkBAIC00NzksNiArNDc5LDcgQEAKIAkJCX0KIAkJCWVyciA9IHJkZXYtPm9wcy0+ZGVsX2tleSgmcmRldi0+d2lwaHksIGRldiwgaWR4LCBhZGRyKTsKIAkJfQorCQl3ZGV2LT53ZXh0LmNvbm5lY3QucHJpdmFjeSA9IGZhbHNlOwogCQkvKgogCQkgKiBBcHBsaWNhdGlvbnMgdXNpbmcgd2lyZWxlc3MgZXh0ZW5zaW9ucyBleHBlY3QgdG8gYmUKIAkJICogYWJsZSB0byBkZWxldGUga2V5cyB0aGF0IGRvbid0IGV4aXN0LCBzbyBhbGxvdyB0aGF0LgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9od19icmVha3BvaW50L2RhdGFfYnJlYWtwb2ludC5jIGIvc2FtcGxlcy9od19icmVha3BvaW50L2RhdGFfYnJlYWtwb2ludC5jCmluZGV4IDI5NTI1NTAuLmM2OWNiZTkgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvaHdfYnJlYWtwb2ludC9kYXRhX2JyZWFrcG9pbnQuYworKysgYi9zYW1wbGVzL2h3X2JyZWFrcG9pbnQvZGF0YV9icmVha3BvaW50LmMKQEAgLTQxLDcgKzQxLDkgQEAKIE1PRFVMRV9QQVJNX0RFU0Moa3N5bSwgIktlcm5lbCBzeW1ib2wgdG8gbW9uaXRvcjsgdGhpcyBtb2R1bGUgd2lsbCByZXBvcnQgYW55IgogCQkJIiB3cml0ZSBvcGVyYXRpb25zIG9uIHRoZSBrZXJuZWwgc3ltYm9sIik7CiAKLXN0YXRpYyB2b2lkIHNhbXBsZV9oYnBfaGFuZGxlcihzdHJ1Y3QgcGVyZl9ldmVudCAqdGVtcCwgdm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIHNhbXBsZV9oYnBfaGFuZGxlcihzdHJ1Y3QgcGVyZl9ldmVudCAqYnAsIGludCBubWksCisJCQkgICAgICAgc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgKmRhdGEsCisJCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJcHJpbnRrKEtFUk5fSU5GTyAiJXMgdmFsdWUgaXMgY2hhbmdlZFxuIiwga3N5bV9uYW1lKTsKIAlkdW1wX3N0YWNrKCk7CkBAIC01MSw4ICs1Myw5IEBACiBzdGF0aWMgaW50IF9faW5pdCBod19icmVha19tb2R1bGVfaW5pdCh2b2lkKQogewogCWludCByZXQ7Ci0JREVGSU5FX0JSRUFLUE9JTlRfQVRUUihhdHRyKTsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIGF0dHI7CiAKKwlod19icmVha3BvaW50X2luaXQoJmF0dHIpOwogCWF0dHIuYnBfYWRkciA9IGthbGxzeW1zX2xvb2t1cF9uYW1lKGtzeW1fbmFtZSk7CiAJYXR0ci5icF9sZW4gPSBIV19CUkVBS1BPSU5UX0xFTl80OwogCWF0dHIuYnBfdHlwZSA9IEhXX0JSRUFLUE9JTlRfVyB8IEhXX0JSRUFLUE9JTlRfUjsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbW9kL2ZpbGUyYWxpYXMuYyBiL3NjcmlwdHMvbW9kL2ZpbGUyYWxpYXMuYwppbmRleCA2MmE5MDI1Li42ZjQyNmFmIDEwMDY0NAotLS0gYS9zY3JpcHRzL21vZC9maWxlMmFsaWFzLmMKKysrIGIvc2NyaXB0cy9tb2QvZmlsZTJhbGlhcy5jCkBAIC0xMDQsNyArMTA0LDcgQEAKIHN0YXRpYyB2b2lkIGRvX3VzYl9lbnRyeShzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQsCiAJCQkgdW5zaWduZWQgaW50IGJjZERldmljZV9pbml0aWFsLCBpbnQgYmNkRGV2aWNlX2luaXRpYWxfZGlnaXRzLAogCQkJIHVuc2lnbmVkIGNoYXIgcmFuZ2VfbG8sIHVuc2lnbmVkIGNoYXIgcmFuZ2VfaGksCi0JCQkgc3RydWN0IG1vZHVsZSAqbW9kKQorCQkJIHVuc2lnbmVkIGNoYXIgbWF4LCBzdHJ1Y3QgbW9kdWxlICptb2QpCiB7CiAJY2hhciBhbGlhc1s1MDBdOwogCXN0cmNweShhbGlhcywgInVzYjoiKTsKQEAgLTExOCw5ICsxMTgsMjIgQEAKIAkJc3ByaW50ZihhbGlhcyArIHN0cmxlbihhbGlhcyksICIlMCpYIiwKIAkJCWJjZERldmljZV9pbml0aWFsX2RpZ2l0cywgYmNkRGV2aWNlX2luaXRpYWwpOwogCWlmIChyYW5nZV9sbyA9PSByYW5nZV9oaSkKLQkJc3ByaW50ZihhbGlhcyArIHN0cmxlbihhbGlhcyksICIldSIsIHJhbmdlX2xvKTsKLQllbHNlIGlmIChyYW5nZV9sbyA+IDAgfHwgcmFuZ2VfaGkgPCA5KQotCQlzcHJpbnRmKGFsaWFzICsgc3RybGVuKGFsaWFzKSwgIlsldS0ldV0iLCByYW5nZV9sbywgcmFuZ2VfaGkpOworCQlzcHJpbnRmKGFsaWFzICsgc3RybGVuKGFsaWFzKSwgIiVYIiwgcmFuZ2VfbG8pOworCWVsc2UgaWYgKHJhbmdlX2xvID4gMCB8fCByYW5nZV9oaSA8IG1heCkgeworCQlpZiAocmFuZ2VfbG8gPiAweDkgfHwgcmFuZ2VfaGkgPCAweEEpCisJCQlzcHJpbnRmKGFsaWFzICsgc3RybGVuKGFsaWFzKSwKKwkJCQkiWyVYLSVYXSIsCisJCQkJcmFuZ2VfbG8sCisJCQkJcmFuZ2VfaGkpOworCQllbHNlIHsKKwkJCXNwcmludGYoYWxpYXMgKyBzdHJsZW4oYWxpYXMpLAorCQkJCXJhbmdlX2xvIDwgMHg5ID8gIlslWC05IiA6ICJbJVgiLAorCQkJCXJhbmdlX2xvKTsKKwkJCXNwcmludGYoYWxpYXMgKyBzdHJsZW4oYWxpYXMpLAorCQkJCXJhbmdlX2hpID4gMHhBID8gImEtJVhdIiA6ICIlWF0iLAorCQkJCXJhbmdlX2xvKTsKKwkJfQorCX0KIAlpZiAoYmNkRGV2aWNlX2luaXRpYWxfZGlnaXRzIDwgKHNpemVvZihpZC0+YmNkRGV2aWNlX2xvKSAqIDIgLSAxKSkKIAkJc3RyY2F0KGFsaWFzLCAiKiIpOwogCkBAIC0xNDcsMTAgKzE2MCw0OSBAQAogCQkgICAiTU9EVUxFX0FMSUFTKFwiJXNcIik7XG4iLCBhbGlhcyk7CiB9CiAKKy8qIEhhbmRsZXMgaW5jcmVtZW50L2RlY3JlbWVudCBvZiBCQ0QgZm9ybWF0dGVkIGludGVnZXJzICovCisvKiBSZXR1cm5zIHRoZSBwcmV2aW91cyB2YWx1ZSwgc28gaXQgd29ya3MgbGlrZSBpKysgb3IgaS0tICovCitzdGF0aWMgdW5zaWduZWQgaW50IGluY2JjZCh1bnNpZ25lZCBpbnQgKmJjZCwKKwkJCSAgIGludCBpbmMsCisJCQkgICB1bnNpZ25lZCBjaGFyIG1heCwKKwkJCSAgIHNpemVfdCBjaGFycykKK3sKKwl1bnNpZ25lZCBpbnQgaW5pdCA9ICpiY2QsIGksIGo7CisJdW5zaWduZWQgbG9uZyBsb25nIGMsIGRlYyA9IDA7CisKKwkvKiBJZiBiY2QgaXMgbm90IGluIEJDRCBmb3JtYXQsIGp1c3QgaW5jcmVtZW50ICovCisJaWYgKG1heCA+IDB4OSkgeworCQkqYmNkICs9IGluYzsKKwkJcmV0dXJuIGluaXQ7CisJfQorCisJLyogQ29udmVydCBCQ0QgdG8gRGVjaW1hbCAqLworCWZvciAoaT0wIDsgaSA8IGNoYXJzIDsgaSsrKSB7CisJCWMgPSAoKmJjZCA+PiAoaSA8PCAyKSkgJiAweGY7CisJCWMgPSBjID4gOSA/IDkgOiBjOyAvKiBmb3JjZSB0byBiY2QganVzdCBpbiBjYXNlICovCisJCWZvciAoaj0wIDsgaiA8IGkgOyBqKyspCisJCQljID0gYyAqIDEwOworCQlkZWMgKz0gYzsKKwl9CisKKwkvKiBEbyBvdXIgaW5jcmVtZW50L2RlY3JlbWVudCAqLworCWRlYyArPSBpbmM7CisJKmJjZCAgPSAwOworCisJLyogQ29udmVydCBiYWNrIHRvIEJDRCAqLworCWZvciAoaT0wIDsgaSA8IGNoYXJzIDsgaSsrKSB7CisJCWZvciAoYz0xLGo9MCA7IGogPCBpIDsgaisrKQorCQkJYyA9IGMgKiAxMDsKKwkJYyA9IChkZWMgLyBjKSAlIDEwOworCQkqYmNkICs9IGMgPDwgKGkgPDwgMik7CisJfQorCXJldHVybiBpbml0OworfQorCiBzdGF0aWMgdm9pZCBkb191c2JfZW50cnlfbXVsdGkoc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkLCBzdHJ1Y3QgbW9kdWxlICptb2QpCiB7CiAJdW5zaWduZWQgaW50IGRldmxvLCBkZXZoaTsKLQl1bnNpZ25lZCBjaGFyIGNoaSwgY2xvOworCXVuc2lnbmVkIGNoYXIgY2hpLCBjbG8sIG1heDsKIAlpbnQgbmRpZ2l0czsKIAogCWlkLT5tYXRjaF9mbGFncyA9IFRPX05BVElWRShpZC0+bWF0Y2hfZmxhZ3MpOwpAQCAtMTYyLDYgKzIxNCwxNyBAQAogCWRldmhpID0gaWQtPm1hdGNoX2ZsYWdzICYgVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZfSEkgPwogCQlUT19OQVRJVkUoaWQtPmJjZERldmljZV9oaSkgOiB+MHgwVTsKIAorCS8qIEZpZ3VyZSBvdXQgaWYgdGhpcyBlbnRyeSBpcyBpbiBiY2Qgb3IgaGV4IGZvcm1hdCAqLworCW1heCA9IDB4OTsgLyogRGVmYXVsdCB0byBkZWNpbWFsIGZvcm1hdCAqLworCWZvciAobmRpZ2l0cyA9IDAgOyBuZGlnaXRzIDwgc2l6ZW9mKGlkLT5iY2REZXZpY2VfbG8pICogMiA7IG5kaWdpdHMrKykgeworCQljbG8gPSAoZGV2bG8gPj4gKG5kaWdpdHMgPDwgMikpICYgMHhmOworCQljaGkgPSAoKGRldmhpID4gMHg5OTk5ID8gMHg5OTk5IDogZGV2aGkpID4+IChuZGlnaXRzIDw8IDIpKSAmIDB4ZjsKKwkJaWYgKGNsbyA+IG1heCB8fCBjaGkgPiBtYXgpIHsKKwkJCW1heCA9IDB4ZjsKKwkJCWJyZWFrOworCQl9CisJfQorCiAJLyoKIAkgKiBTb21lIG1vZHVsZXMgKHZpc29yKSBoYXZlIGVtcHR5IHNsb3RzIGFzIHBsYWNlaG9sZGVyIGZvcgogCSAqIHJ1bi10aW1lIHNwZWNpZmljYXRpb24gdGhhdCByZXN1bHRzIGluIGNhdGNoLWFsbCBhbGlhcwpAQCAtMTczLDIxICsyMzYsMjcgQEAKIAlmb3IgKG5kaWdpdHMgPSBzaXplb2YoaWQtPmJjZERldmljZV9sbykgKiAyIC0gMTsgZGV2bG8gPD0gZGV2aGk7IG5kaWdpdHMtLSkgewogCQljbG8gPSBkZXZsbyAmIDB4ZjsKIAkJY2hpID0gZGV2aGkgJiAweGY7Ci0JCWlmIChjaGkgPiA5KQkvKiBpdCdzIGJjZCBub3QgaGV4ICovCi0JCQljaGkgPSA5OworCQlpZiAoY2hpID4gbWF4KQkvKiBJZiB3ZSBhcmUgaW4gYmNkIG1vZGUsIHRydW5jYXRlIGlmIG5lY2Vzc2FyeSAqLworCQkJY2hpID0gbWF4OwogCQlkZXZsbyA+Pj0gNDsKIAkJZGV2aGkgPj49IDQ7CiAKIAkJaWYgKGRldmxvID09IGRldmhpIHx8ICFuZGlnaXRzKSB7Ci0JCQlkb191c2JfZW50cnkoaWQsIGRldmxvLCBuZGlnaXRzLCBjbG8sIGNoaSwgbW9kKTsKKwkJCWRvX3VzYl9lbnRyeShpZCwgZGV2bG8sIG5kaWdpdHMsIGNsbywgY2hpLCBtYXgsIG1vZCk7CiAJCQlicmVhazsKIAkJfQogCi0JCWlmIChjbG8gPiAwKQotCQkJZG9fdXNiX2VudHJ5KGlkLCBkZXZsbysrLCBuZGlnaXRzLCBjbG8sIDksIG1vZCk7CisJCWlmIChjbG8gPiAweDApCisJCQlkb191c2JfZW50cnkoaWQsCisJCQkJICAgICBpbmNiY2QoJmRldmxvLCAxLCBtYXgsCisJCQkJCSAgICBzaXplb2YoaWQtPmJjZERldmljZV9sbykgKiAyKSwKKwkJCQkgICAgIG5kaWdpdHMsIGNsbywgbWF4LCBtYXgsIG1vZCk7CiAKLQkJaWYgKGNoaSA8IDkpCi0JCQlkb191c2JfZW50cnkoaWQsIGRldmhpLS0sIG5kaWdpdHMsIDAsIGNoaSwgbW9kKTsKKwkJaWYgKGNoaSA8IG1heCkKKwkJCWRvX3VzYl9lbnRyeShpZCwKKwkJCQkgICAgIGluY2JjZCgmZGV2aGksIC0xLCBtYXgsCisJCQkJCSAgICBzaXplb2YoaWQtPmJjZERldmljZV9sbykgKiAyKSwKKwkJCQkgICAgIG5kaWdpdHMsIDB4MCwgY2hpLCBtYXgsIG1vZCk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9zY3JpcHRzL3JlY29yZG1jb3VudC5wbCBiL3NjcmlwdHMvcmVjb3JkbWNvdW50LnBsCmluZGV4IGYwZDE0NDUuLjljZjBhNmYgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvcmVjb3JkbWNvdW50LnBsCisrKyBiL3NjcmlwdHMvcmVjb3JkbWNvdW50LnBsCkBAIC0yOTUsNiArMjk1LDkgQEAKICAgICAkbGQgLj0gIiAtbSBlbGY2NF9zcGFyYyI7CiAgICAgJGNjIC49ICIgLW02NCI7CiAgICAgJG9iamNvcHkgLj0gIiAtTyBlbGY2NC1zcGFyYyI7Cit9IGVsc2lmICgkYXJjaCBlcSAibWljcm9ibGF6ZSIpIHsKKyAgICAjIE1pY3JvYmxhemUgY2FsbHMgJ19tY291bnQnIGluc3RlYWQgb2YgcGxhaW4gJ21jb3VudCcuCisgICAgJG1jb3VudF9yZWdleCA9ICJeXFxzKihbMC05YS1mQS1GXSspOi4qXFxzX21jb3VudFwkIjsKIH0gZWxzZSB7CiAgICAgZGllICJBcmNoICRhcmNoIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBDT05GSUdfRlRSQUNFX01DT1VOVF9SRUNPUkQiOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9ocnRpbWVyLmMgYi9zb3VuZC9jb3JlL2hydGltZXIuYwppbmRleCAzNGM3ZDQ4Li43ZjRkNzQ0IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL2hydGltZXIuYworKysgYi9zb3VuZC9jb3JlL2hydGltZXIuYwpAQCAtMzcsMTQgKzM3LDIyIEBACiBzdHJ1Y3Qgc25kX2hydGltZXIgewogCXN0cnVjdCBzbmRfdGltZXIgKnRpbWVyOwogCXN0cnVjdCBocnRpbWVyIGhydDsKKwlhdG9taWNfdCBydW5uaW5nOwogfTsKIAogc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IHNuZF9ocnRpbWVyX2NhbGxiYWNrKHN0cnVjdCBocnRpbWVyICpocnQpCiB7CiAJc3RydWN0IHNuZF9ocnRpbWVyICpzdGltZSA9IGNvbnRhaW5lcl9vZihocnQsIHN0cnVjdCBzbmRfaHJ0aW1lciwgaHJ0KTsKIAlzdHJ1Y3Qgc25kX3RpbWVyICp0ID0gc3RpbWUtPnRpbWVyOworCisJaWYgKCFhdG9taWNfcmVhZCgmc3RpbWUtPnJ1bm5pbmcpKQorCQlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7CisKIAlocnRpbWVyX2ZvcndhcmRfbm93KGhydCwgbnNfdG9fa3RpbWUodC0+c3RpY2tzICogcmVzb2x1dGlvbikpOwogCXNuZF90aW1lcl9pbnRlcnJ1cHQoc3RpbWUtPnRpbWVyLCB0LT5zdGlja3MpOworCisJaWYgKCFhdG9taWNfcmVhZCgmc3RpbWUtPnJ1bm5pbmcpKQorCQlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7CiAJcmV0dXJuIEhSVElNRVJfUkVTVEFSVDsKIH0KIApAQCAtNTgsNiArNjYsNyBAQAogCWhydGltZXJfaW5pdCgmc3RpbWUtPmhydCwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKIAlzdGltZS0+dGltZXIgPSB0OwogCXN0aW1lLT5ocnQuZnVuY3Rpb24gPSBzbmRfaHJ0aW1lcl9jYWxsYmFjazsKKwlhdG9taWNfc2V0KCZzdGltZS0+cnVubmluZywgMCk7CiAJdC0+cHJpdmF0ZV9kYXRhID0gc3RpbWU7CiAJcmV0dXJuIDA7CiB9CkBAIC03OCwxNiArODcsMTggQEAKIHsKIAlzdHJ1Y3Qgc25kX2hydGltZXIgKnN0aW1lID0gdC0+cHJpdmF0ZV9kYXRhOwogCisJYXRvbWljX3NldCgmc3RpbWUtPnJ1bm5pbmcsIDApOworCWhydGltZXJfY2FuY2VsKCZzdGltZS0+aHJ0KTsKIAlocnRpbWVyX3N0YXJ0KCZzdGltZS0+aHJ0LCBuc190b19rdGltZSh0LT5zdGlja3MgKiByZXNvbHV0aW9uKSwKIAkJICAgICAgSFJUSU1FUl9NT0RFX1JFTCk7CisJYXRvbWljX3NldCgmc3RpbWUtPnJ1bm5pbmcsIDEpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHNuZF9ocnRpbWVyX3N0b3Aoc3RydWN0IHNuZF90aW1lciAqdCkKIHsKIAlzdHJ1Y3Qgc25kX2hydGltZXIgKnN0aW1lID0gdC0+cHJpdmF0ZV9kYXRhOwotCi0JaHJ0aW1lcl9jYW5jZWwoJnN0aW1lLT5ocnQpOworCWF0b21pY19zZXQoJnN0aW1lLT5ydW5uaW5nLCAwKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9yYXdtaWRpLmMgYi9zb3VuZC9jb3JlL3Jhd21pZGkuYwppbmRleCAyZjc2NjEyLi4wZjVhMTk0IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3Jhd21pZGkuYworKysgYi9zb3VuZC9jb3JlL3Jhd21pZGkuYwpAQCAtMTI1Nyw3ICsxMjU3LDcgQEAKIAkJCWJyZWFrOwogCQljb3VudCAtPSBjb3VudDE7CiAJfQotCWlmIChmaWxlLT5mX2ZsYWdzICYgT19TWU5DKSB7CisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX0RTWU5DKSB7CiAJCXNwaW5fbG9ja19pcnEoJnJ1bnRpbWUtPmxvY2spOwogCQl3aGlsZSAocnVudGltZS0+YXZhaWwgIT0gcnVudGltZS0+YnVmZmVyX3NpemUpIHsKIAkJCXdhaXRfcXVldWVfdCB3YWl0OwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL29wdGk5eHgvb3B0aTkyeC1hZDE4NDguYyBiL3NvdW5kL2lzYS9vcHRpOXh4L29wdGk5MngtYWQxODQ4LmMKaW5kZXggMTA2YmU2ZS4uYzhhOGRhMCAxMDA2NDQKLS0tIGEvc291bmQvaXNhL29wdGk5eHgvb3B0aTkyeC1hZDE4NDguYworKysgYi9zb3VuZC9pc2Evb3B0aTl4eC9vcHRpOTJ4LWFkMTg0OC5jCkBAIC01NDgsMTAgKzU0OCwxMyBAQAogCiBzdGF0aWMgaXJxcmV0dXJuX3Qgc25kX29wdGk5M3hfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlzdHJ1Y3Qgc25kX3dzcyAqY29kZWMgPSBkZXZfaWQ7Ci0Jc3RydWN0IHNuZF9vcHRpOXh4ICpjaGlwID0gY29kZWMtPmNhcmQtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX29wdGk5eHggKmNoaXAgPSBkZXZfaWQ7CisJc3RydWN0IHNuZF93c3MgKmNvZGVjID0gY2hpcC0+Y29kZWM7CiAJdW5zaWduZWQgY2hhciBzdGF0dXM7CiAKKwlpZiAoIWNvZGVjKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKIAlzdGF0dXMgPSBzbmRfb3B0aTl4eF9yZWFkKGNoaXAsIE9QVGk5WFhfTUNfUkVHKDExKSk7CiAJaWYgKChzdGF0dXMgJiBPUFRpOTNYX0lSUV9QTEFZQkFDSykgJiYgY29kZWMtPnBsYXliYWNrX3N1YnN0cmVhbSkKIAkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChjb2RlYy0+cGxheWJhY2tfc3Vic3RyZWFtKTsKQEAgLTY5MSwxMCArNjk0LDkgQEAKIAogCWlmIChjaGlwKSB7CiAjaWZkZWYgT1BUaTkzWAotCQlzdHJ1Y3Qgc25kX3dzcyAqY29kZWMgPSBjaGlwLT5jb2RlYzsKLQkJaWYgKGNvZGVjICYmIGNvZGVjLT5pcnEgPiAwKSB7Ci0JCQlkaXNhYmxlX2lycShjb2RlYy0+aXJxKTsKLQkJCWZyZWVfaXJxKGNvZGVjLT5pcnEsIGNvZGVjKTsKKwkJaWYgKGNoaXAtPmlycSA+IDApIHsKKwkJCWRpc2FibGVfaXJxKGNoaXAtPmlycSk7CisJCQlmcmVlX2lycShjaGlwLT5pcnEsIGNoaXApOwogCQl9CiAJCXJlbGVhc2VfYW5kX2ZyZWVfcmVzb3VyY2UoY2hpcC0+cmVzX21jX2luZGlyKTsKICNlbmRpZgpAQCAtNzU5LDkgKzc2MSw5IEBACiAjZW5kaWYKICNpZmRlZiBPUFRpOTNYCiAJZXJyb3IgPSByZXF1ZXN0X2lycShpcnEsIHNuZF9vcHRpOTN4X2ludGVycnVwdCwKLQkJCSAgICBJUlFGX0RJU0FCTEVELCBERVZfTkFNRSIgLSBXU1MiLCBjb2RlYyk7CisJCQkgICAgSVJRRl9ESVNBQkxFRCwgREVWX05BTUUiIC0gV1NTIiwgY2hpcCk7CiAJaWYgKGVycm9yIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJvcHRpOXh4OiBjYW4ndCBncmFiIElSUSAlZFxuIiwgY2hpcC0+aXJxKTsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAib3B0aTl4eDogY2FuJ3QgZ3JhYiBJUlEgJWRcbiIsIGlycSk7CiAJCXJldHVybiBlcnJvcjsKIAl9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmggYi9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5oCmluZGV4IDJkNjI3NjEuLjFkNTQxYjcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmgKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuaApAQCAtMjU1LDkgKzI1NSwxMyBAQAogICogICAgICAgaW4gSEQtYXVkaW8gc3BlY2lmaWNhdGlvbgogICovCiAjZGVmaW5lIEFDX1BJTkNBUF9IRE1JCQkJKDE8PDcpCS8qIEhETUkgcGluICovCisjZGVmaW5lIEFDX1BJTkNBUF9EUAkJCSgxPDwyNCkJLyogRGlzcGxheVBvcnQgcGluLCBjYW4KKwkJCQkJCSAqIGNvZXhpc3Qgd2l0aCBBQ19QSU5DQVBfSERNSQorCQkJCQkJICovCiAjZGVmaW5lIEFDX1BJTkNBUF9WUkVGCQkJKDB4Mzc8PDgpCiAjZGVmaW5lIEFDX1BJTkNBUF9WUkVGX1NISUZUCQk4CiAjZGVmaW5lIEFDX1BJTkNBUF9FQVBECQkJKDE8PDE2KQkvKiBFQVBEIGNhcGFibGUgKi8KKyNkZWZpbmUgQUNfUElOQ0FQX0hCUgkJCSgxPDwyNykJLyogSGlnaCBCaXQgUmF0ZSAqLwogLyogVnJlZiBzdGF0dXMgKHVzZWQgaW4gcGluIGNhcCkgKi8KICNkZWZpbmUgQUNfUElOQ0FQX1ZSRUZfSElaCQkoMTw8MCkJLyogSGktWiAqLwogI2RlZmluZSBBQ19QSU5DQVBfVlJFRl81MAkJKDE8PDEpCS8qIDUwJSAqLwpAQCAtNjM1LDYgKzYzOSw3IEBACiAJdW5zaWduZWQgaW50IHJpcmJfZXJyb3I6MTsJLyogZXJyb3IgaW4gY29kZWMgY29tbXVuaWNhdGlvbiAqLwogCXVuc2lnbmVkIGludCByZXNwb25zZV9yZXNldDoxOwkvKiBjb250cm9sbGVyIHdhcyByZXNldCAqLwogCXVuc2lnbmVkIGludCBpbl9yZXNldDoxOwkvKiBkdXJpbmcgcmVzZXQgb3BlcmF0aW9uICovCisJdW5zaWduZWQgaW50IHBvd2VyX2tlZXBfbGlua19vbjoxOyAvKiBkb24ndCBwb3dlciBvZmYgSERBIGxpbmsgKi8KIH07CiAKIC8qCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jIGIvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYwppbmRleCBlZmNjNGY3Li5lNTQ0MjBlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMKQEAgLTIwODIsNyArMjA4Miw4IEBACiAJfQogCWlmIChwb3dlcl9vbikKIAkJYXp4X2luaXRfY2hpcChjaGlwKTsKLQllbHNlIGlmIChjaGlwLT5ydW5uaW5nICYmIHBvd2VyX3NhdmVfY29udHJvbGxlcikKKwllbHNlIGlmIChjaGlwLT5ydW5uaW5nICYmIHBvd2VyX3NhdmVfY29udHJvbGxlciAmJgorCQkgIWJ1cy0+cG93ZXJfa2VlcF9saW5rX29uKQogCQlhenhfc3RvcF9jaGlwKGNoaXApOwogfQogI2VuZGlmIC8qIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX3Byb2MuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX3Byb2MuYwppbmRleCAwOTQ3NmZjLi5jOWFmYzA0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9wcm9jLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfcHJvYy5jCkBAIC0yNDAsOSArMjQwLDE0IEBACiAJCS8qIFJlYWx0ZWsgdXNlcyB0aGlzIGJpdCBhcyBhIGRpZmZlcmVudCBtZWFuaW5nICovCiAJCWlmICgoY29kZWMtPnZlbmRvcl9pZCA+PiAxNikgPT0gMHgxMGVjKQogCQkJc25kX2lwcmludGYoYnVmZmVyLCAiIFIvTCIpOwotCQllbHNlCisJCWVsc2UgeworCQkJaWYgKGNhcHMgJiBBQ19QSU5DQVBfSEJSKQorCQkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiBIQlIiKTsKIAkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiBIRE1JIik7CisJCX0KIAl9CisJaWYgKGNhcHMgJiBBQ19QSU5DQVBfRFApCisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiBEUCIpOwogCWlmIChjYXBzICYgQUNfUElOQ0FQX1RSSUdfUkVRKQogCQlzbmRfaXByaW50ZihidWZmZXIsICIgVHJpZ2dlciIpOwogCWlmIChjYXBzICYgQUNfUElOQ0FQX0lNUF9TRU5TRSkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfaW50ZWxoZG1pLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2ludGVsaGRtaS5jCmluZGV4IDkyOGRmNTkuLjkxOGY0MDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfaW50ZWxoZG1pLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9pbnRlbGhkbWkuYwpAQCAtMTQ2LDM4ICsxNDYsNzggQEAKIH07CiAKIC8qCisgKiBBTFNBIHNlcXVlbmNlIGlzOgorICoKKyAqICAgICAgIHN1cnJvdW5kNDAgICBzdXJyb3VuZDQxICAgc3Vycm91bmQ1MCAgIHN1cnJvdW5kNTEgICBzdXJyb3VuZDcxCisgKiBjaDAgICBmcm9udCBsZWZ0ICAgPSAgICAgICAgICAgID0gICAgICAgICAgICA9ICAgICAgICAgICAgPQorICogY2gxICAgZnJvbnQgcmlnaHQgID0gICAgICAgICAgICA9ICAgICAgICAgICAgPSAgICAgICAgICAgID0KKyAqIGNoMiAgIHJlYXIgbGVmdCAgICA9ICAgICAgICAgICAgPSAgICAgICAgICAgID0gICAgICAgICAgICA9CisgKiBjaDMgICByZWFyIHJpZ2h0ICAgPSAgICAgICAgICAgID0gICAgICAgICAgICA9ICAgICAgICAgICAgPQorICogY2g0ICAgICAgICAgICAgICAgIExGRSAgICAgICAgICBjZW50ZXIgICAgICAgY2VudGVyICAgICAgIGNlbnRlcgorICogY2g1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEZFICAgICAgICAgIExGRQorICogY2g2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZGUgbGVmdAorICogY2g3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZGUgcmlnaHQKKyAqCisgKiBzdXJyb3VuZDcxID0ge0ZMLCBGUiwgUkxDLCBSUkMsIEZDLCBMRkUsIFJMLCBSUn0KKyAqLworc3RhdGljIGludCBoZG1pX2NoYW5uZWxfbWFwcGluZ1sweDMyXVs4XSA9IHsKKwkvKiBzdGVyZW8gKi8KKwlbMHgwMF0gPSB7IDB4MDAsIDB4MTEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcgfSwKKwkvKiAyLjEgKi8KKwlbMHgwMV0gPSB7IDB4MDAsIDB4MTEsIDB4MjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcgfSwKKwkvKiBEb2xieSBTdXJyb3VuZCAqLworCVsweDAyXSA9IHsgMHgwMCwgMHgxMSwgMHgyMywgMHhmMiwgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNyB9LAorCS8qIHN1cnJvdW5kNDAgKi8KKwlbMHgwOF0gPSB7IDB4MDAsIDB4MTEsIDB4MjQsIDB4MzUsIDB4ZjMsIDB4ZjIsIDB4ZjYsIDB4ZjcgfSwKKwkvKiA0Y2ggKi8KKwlbMHgwM10gPSB7IDB4MDAsIDB4MTEsIDB4MjMsIDB4MzIsIDB4NDQsIDB4ZjUsIDB4ZjYsIDB4ZjcgfSwKKwkvKiBzdXJyb3VuZDQxICovCisJWzB4MDldID0geyAweDAwLCAweDExLCAweDI0LCAweDM0LCAweDQzLCAweGYyLCAweGY2LCAweGY3IH0sCisJLyogc3Vycm91bmQ1MCAqLworCVsweDBhXSA9IHsgMHgwMCwgMHgxMSwgMHgyNCwgMHgzNSwgMHg0MywgMHhmMiwgMHhmNiwgMHhmNyB9LAorCS8qIHN1cnJvdW5kNTEgKi8KKwlbMHgwYl0gPSB7IDB4MDAsIDB4MTEsIDB4MjQsIDB4MzUsIDB4NDMsIDB4NTIsIDB4ZjYsIDB4ZjcgfSwKKwkvKiA3LjEgKi8KKwlbMHgxM10gPSB7IDB4MDAsIDB4MTEsIDB4MjYsIDB4MzcsIDB4NDMsIDB4NTIsIDB4NjQsIDB4NzUgfSwKK307CisKKy8qCiAgKiBUaGlzIGlzIGFuIG9yZGVyZWQgbGlzdCEKICAqCiAgKiBUaGUgcHJlY2VkaW5nIG9uZXMgaGF2ZSBiZXR0ZXIgY2hhbmNlcyB0byBiZSBzZWxlY3RlZCBieQogICogaGRtaV9zZXR1cF9jaGFubmVsX2FsbG9jYXRpb24oKS4KICAqLwogc3RhdGljIHN0cnVjdCBjZWFfY2hhbm5lbF9zcGVha2VyX2FsbG9jYXRpb24gY2hhbm5lbF9hbGxvY2F0aW9uc1tdID0gewotLyogCQkJICBjaGFubmVsOiAgIDggICAgIDcgICAgNiAgICA1ICAgIDQgICAgIDMgICAgMiAgICAxICAqLworLyogCQkJICBjaGFubmVsOiAgIDcgICAgIDYgICAgNSAgICA0ICAgIDMgICAgIDIgICAgMSAgICAwICAqLwogeyAuY2FfaW5kZXggPSAweDAwLCAgLnNwZWFrZXJzID0geyAgIDAsICAgIDAsICAgMCwgICAwLCAgIDAsICAgIDAsICBGUiwgIEZMIH0gfSwKIAkJCQkgLyogMi4xICovCiB7IC5jYV9pbmRleCA9IDB4MDEsICAuc3BlYWtlcnMgPSB7ICAgMCwgICAgMCwgICAwLCAgIDAsICAgMCwgIExGRSwgIEZSLCAgRkwgfSB9LAogCQkJCSAvKiBEb2xieSBTdXJyb3VuZCAqLwogeyAuY2FfaW5kZXggPSAweDAyLCAgLnNwZWFrZXJzID0geyAgIDAsICAgIDAsICAgMCwgICAwLCAgRkMsICAgIDAsICBGUiwgIEZMIH0gfSwKKwkJCQkgLyogc3Vycm91bmQ0MCAqLworeyAuY2FfaW5kZXggPSAweDA4LCAgLnNwZWFrZXJzID0geyAgIDAsICAgIDAsICBSUiwgIFJMLCAgIDAsICAgIDAsICBGUiwgIEZMIH0gfSwKKwkJCQkgLyogc3Vycm91bmQ0MSAqLworeyAuY2FfaW5kZXggPSAweDA5LCAgLnNwZWFrZXJzID0geyAgIDAsICAgIDAsICBSUiwgIFJMLCAgIDAsICBMRkUsICBGUiwgIEZMIH0gfSwKKwkJCQkgLyogc3Vycm91bmQ1MCAqLworeyAuY2FfaW5kZXggPSAweDBhLCAgLnNwZWFrZXJzID0geyAgIDAsICAgIDAsICBSUiwgIFJMLCAgRkMsICAgIDAsICBGUiwgIEZMIH0gfSwKKwkJCQkgLyogc3Vycm91bmQ1MSAqLworeyAuY2FfaW5kZXggPSAweDBiLCAgLnNwZWFrZXJzID0geyAgIDAsICAgIDAsICBSUiwgIFJMLCAgRkMsICBMRkUsICBGUiwgIEZMIH0gfSwKKwkJCQkgLyogNi4xICovCit7IC5jYV9pbmRleCA9IDB4MGYsICAuc3BlYWtlcnMgPSB7ICAgMCwgICBSQywgIFJSLCAgUkwsICBGQywgIExGRSwgIEZSLCAgRkwgfSB9LAorCQkJCSAvKiBzdXJyb3VuZDcxICovCit7IC5jYV9pbmRleCA9IDB4MTMsICAuc3BlYWtlcnMgPSB7IFJSQywgIFJMQywgIFJSLCAgUkwsICBGQywgIExGRSwgIEZSLCAgRkwgfSB9LAorCiB7IC5jYV9pbmRleCA9IDB4MDMsICAuc3BlYWtlcnMgPSB7ICAgMCwgICAgMCwgICAwLCAgIDAsICBGQywgIExGRSwgIEZSLCAgRkwgfSB9LAogeyAuY2FfaW5kZXggPSAweDA0LCAgLnNwZWFrZXJzID0geyAgIDAsICAgIDAsICAgMCwgIFJDLCAgIDAsICAgIDAsICBGUiwgIEZMIH0gfSwKIHsgLmNhX2luZGV4ID0gMHgwNSwgIC5zcGVha2VycyA9IHsgICAwLCAgICAwLCAgIDAsICBSQywgICAwLCAgTEZFLCAgRlIsICBGTCB9IH0sCiB7IC5jYV9pbmRleCA9IDB4MDYsICAuc3BlYWtlcnMgPSB7ICAgMCwgICAgMCwgICAwLCAgUkMsICBGQywgICAgMCwgIEZSLCAgRkwgfSB9LAogeyAuY2FfaW5kZXggPSAweDA3LCAgLnNwZWFrZXJzID0geyAgIDAsICAgIDAsICAgMCwgIFJDLCAgRkMsICBMRkUsICBGUiwgIEZMIH0gfSwKLXsgLmNhX2luZGV4ID0gMHgwOCwgIC5zcGVha2VycyA9IHsgICAwLCAgICAwLCAgUlIsICBSTCwgICAwLCAgICAwLCAgRlIsICBGTCB9IH0sCi17IC5jYV9pbmRleCA9IDB4MDksICAuc3BlYWtlcnMgPSB7ICAgMCwgICAgMCwgIFJSLCAgUkwsICAgMCwgIExGRSwgIEZSLCAgRkwgfSB9LAoteyAuY2FfaW5kZXggPSAweDBhLCAgLnNwZWFrZXJzID0geyAgIDAsICAgIDAsICBSUiwgIFJMLCAgRkMsICAgIDAsICBGUiwgIEZMIH0gfSwKLQkJCQkgLyogNS4xICovCi17IC5jYV9pbmRleCA9IDB4MGIsICAuc3BlYWtlcnMgPSB7ICAgMCwgICAgMCwgIFJSLCAgUkwsICBGQywgIExGRSwgIEZSLCAgRkwgfSB9LAogeyAuY2FfaW5kZXggPSAweDBjLCAgLnNwZWFrZXJzID0geyAgIDAsICAgUkMsICBSUiwgIFJMLCAgIDAsICAgIDAsICBGUiwgIEZMIH0gfSwKIHsgLmNhX2luZGV4ID0gMHgwZCwgIC5zcGVha2VycyA9IHsgICAwLCAgIFJDLCAgUlIsICBSTCwgICAwLCAgTEZFLCAgRlIsICBGTCB9IH0sCiB7IC5jYV9pbmRleCA9IDB4MGUsICAuc3BlYWtlcnMgPSB7ICAgMCwgICBSQywgIFJSLCAgUkwsICBGQywgICAgMCwgIEZSLCAgRkwgfSB9LAotCQkJCSAvKiA2LjEgKi8KLXsgLmNhX2luZGV4ID0gMHgwZiwgIC5zcGVha2VycyA9IHsgICAwLCAgIFJDLCAgUlIsICBSTCwgIEZDLCAgTEZFLCAgRlIsICBGTCB9IH0sCiB7IC5jYV9pbmRleCA9IDB4MTAsICAuc3BlYWtlcnMgPSB7IFJSQywgIFJMQywgIFJSLCAgUkwsICAgMCwgICAgMCwgIEZSLCAgRkwgfSB9LAogeyAuY2FfaW5kZXggPSAweDExLCAgLnNwZWFrZXJzID0geyBSUkMsICBSTEMsICBSUiwgIFJMLCAgIDAsICBMRkUsICBGUiwgIEZMIH0gfSwKIHsgLmNhX2luZGV4ID0gMHgxMiwgIC5zcGVha2VycyA9IHsgUlJDLCAgUkxDLCAgUlIsICBSTCwgIEZDLCAgICAwLCAgRlIsICBGTCB9IH0sCi0JCQkJIC8qIDcuMSAqLwoteyAuY2FfaW5kZXggPSAweDEzLCAgLnNwZWFrZXJzID0geyBSUkMsICBSTEMsICBSUiwgIFJMLCAgRkMsICBMRkUsICBGUiwgIEZMIH0gfSwKIHsgLmNhX2luZGV4ID0gMHgxNCwgIC5zcGVha2VycyA9IHsgRlJDLCAgRkxDLCAgIDAsICAgMCwgICAwLCAgICAwLCAgRlIsICBGTCB9IH0sCiB7IC5jYV9pbmRleCA9IDB4MTUsICAuc3BlYWtlcnMgPSB7IEZSQywgIEZMQywgICAwLCAgIDAsICAgMCwgIExGRSwgIEZSLCAgRkwgfSB9LAogeyAuY2FfaW5kZXggPSAweDE2LCAgLnNwZWFrZXJzID0geyBGUkMsICBGTEMsICAgMCwgICAwLCAgRkMsICAgIDAsICBGUiwgIEZMIH0gfSwKQEAgLTIxMCw3ICsyNTAsNiBAQAogeyAuY2FfaW5kZXggPSAweDMxLCAgLnNwZWFrZXJzID0geyBGUlcsICBGTFcsICBSUiwgIFJMLCAgRkMsICBMRkUsICBGUiwgIEZMIH0gfSwKIH07CiAKLQogLyoKICAqIEhEQS9IRE1JIGF1dG8gcGFyc2luZwogICovCkBAIC0zNDQsNyArMzgzLDcgQEAKIAkJCWJyZWFrOwogCQljYXNlIEFDX1dJRF9QSU46CiAJCQljYXBzID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBuaWQsIEFDX1BBUl9QSU5fQ0FQKTsKLQkJCWlmICghKGNhcHMgJiBBQ19QSU5DQVBfSERNSSkpCisJCQlpZiAoIShjYXBzICYgKEFDX1BJTkNBUF9IRE1JIHwgQUNfUElOQ0FQX0RQKSkpCiAJCQkJY29udGludWU7CiAJCQlpZiAoaW50ZWxfaGRtaV9hZGRfcGluKGNvZGVjLCBuaWQpIDwgMCkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTM1Miw2ICszOTEsMTcgQEAKIAkJfQogCX0KIAorCS8qCisJICogRzQ1L0liZXhQZWFrIGRvbid0IHN1cHBvcnQgRVBTUzogdGhlIHVuc29saWNpdGVkIHBpbiBob3QgcGx1ZyBldmVudAorCSAqIGNhbiBiZSBsb3N0IGFuZCBwcmVzZW5jZSBzZW5zZSB2ZXJiIHdpbGwgYmVjb21lIGluYWNjdXJhdGUgaWYgdGhlCisJICogSERBIGxpbmsgaXMgcG93ZXJlZCBvZmYgYXQgaG90IHBsdWcgb3IgaHcgaW5pdGlhbGl6YXRpb24gdGltZS4KKwkgKi8KKyNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCisJaWYgKCEoc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBjb2RlYy0+YWZnLCBBQ19QQVJfUE9XRVJfU1RBVEUpICYKKwkgICAgICBBQ19QV1JTVF9FUFNTKSkKKwkJY29kZWMtPmJ1cy0+cG93ZXJfa2VlcF9saW5rX29uID0gMTsKKyNlbmRpZgorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQzNiwxNCArNDg2LDE1IEBACiAJCQkJICAgIEFDX1ZFUkJfU0VUX0NWVF9DSEFOX0NPVU5ULCBjaHMgLSAxKTsKIH0KIAotc3RhdGljIHZvaWQgaGRtaV9kZWJ1Z19jaGFubmVsX21hcHBpbmcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQpCitzdGF0aWMgdm9pZCBoZG1pX2RlYnVnX2NoYW5uZWxfbWFwcGluZyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgICAgICAgaGRhX25pZF90IHBpbl9uaWQpCiB7CiAjaWZkZWYgQ09ORklHX1NORF9ERUJVR19WRVJCT1NFCiAJaW50IGk7CiAJaW50IHNsb3Q7CiAKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCXNsb3QgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwKKwkJc2xvdCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgcGluX25pZCwgMCwKIAkJCQkJCUFDX1ZFUkJfR0VUX0hETUlfQ0hBTl9TTE9ULCBpKTsKIAkJcHJpbnRrKEtFUk5fREVCVUcgIkhETUk6IEFTUCBjaGFubmVsICVkID0+IHNsb3QgJWRcbiIsCiAJCQkJCQlzbG90ID4+IDQsIHNsb3QgJiAweGYpOwpAQCAtNjE5LDI1ICs2NzAsMzIgQEAKIAlyZXR1cm4gYWktPkNBOwogfQogCi1zdGF0aWMgdm9pZCBoZG1pX3NldHVwX2NoYW5uZWxfbWFwcGluZyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwKK3N0YXRpYyB2b2lkIGhkbWlfc2V0dXBfY2hhbm5lbF9tYXBwaW5nKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgICAgICBoZGFfbmlkX3QgcGluX25pZCwKIAkJCQkgICAgICAgc3RydWN0IGhkbWlfYXVkaW9faW5mb2ZyYW1lICphaSkKIHsKIAlpbnQgaTsKKwlpbnQgY2EgPSBhaS0+Q0E7CisJaW50IGVycjsKIAotCWlmICghYWktPkNBKQotCQlyZXR1cm47CisJaWYgKGhkbWlfY2hhbm5lbF9tYXBwaW5nW2NhXVsxXSA9PSAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsX2FsbG9jYXRpb25zW2NhXS5jaGFubmVsczsgaSsrKQorCQkJaGRtaV9jaGFubmVsX21hcHBpbmdbY2FdW2ldID0gaSB8IChpIDw8IDQpOworCQlmb3IgKDsgaSA8IDg7IGkrKykKKwkJCWhkbWlfY2hhbm5lbF9tYXBwaW5nW2NhXVtpXSA9IDB4ZiB8IChpIDw8IDQpOworCX0KIAotCS8qCi0JICogVE9ETzogYWRqdXN0IGNoYW5uZWwgbWFwcGluZyBpZiBuZWNlc3NhcnkKLQkgKiBBTFNBIHNlcXVlbmNlIGlzIGZyb250L3N1cnIvY2xmZS9zaWRlPwotCSAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJZXJyID0gc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgcGluX25pZCwgMCwKKwkJCQkJICBBQ19WRVJCX1NFVF9IRE1JX0NIQU5fU0xPVCwKKwkJCQkJICBoZG1pX2NoYW5uZWxfbWFwcGluZ1tjYV1baV0pOworCQlpZiAoZXJyKSB7CisJCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gIkhETUk6IGNoYW5uZWwgbWFwcGluZyBmYWlsZWRcbiIpOworCQkJYnJlYWs7CisJCX0KKwl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsCi0JCQkJICAgIEFDX1ZFUkJfU0VUX0hETUlfQ0hBTl9TTE9ULAotCQkJCSAgICAoaSA8PCA0KSB8IGkpOwotCi0JaGRtaV9kZWJ1Z19jaGFubmVsX21hcHBpbmcoY29kZWMsIG5pZCk7CisJaGRtaV9kZWJ1Z19jaGFubmVsX21hcHBpbmcoY29kZWMsIHBpbl9uaWQpOwogfQogCiBzdGF0aWMgYm9vbCBoZG1pX2luZm9mcmFtZV91cHRvZGF0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IHBpbl9uaWQsCkBAIC02NzYsNyArNzM0LDYgQEAKIAl9OwogCiAJaGRtaV9zZXR1cF9jaGFubmVsX2FsbG9jYXRpb24oY29kZWMsIG5pZCwgJmFpKTsKLQloZG1pX3NldHVwX2NoYW5uZWxfbWFwcGluZyhjb2RlYywgbmlkLCAmYWkpOwogCiAJZm9yIChpID0gMDsgaSA8IHNwZWMtPm51bV9waW5zOyBpKyspIHsKIAkJaWYgKHNwZWMtPnBpbl9jdnRbaV0gIT0gbmlkKQpAQCAtNjg2LDYgKzc0Myw3IEBACiAKIAkJcGluX25pZCA9IHNwZWMtPnBpbltpXTsKIAkJaWYgKCFoZG1pX2luZm9mcmFtZV91cHRvZGF0ZShjb2RlYywgcGluX25pZCwgJmFpKSkgeworCQkJaGRtaV9zZXR1cF9jaGFubmVsX21hcHBpbmcoY29kZWMsIHBpbl9uaWQsICZhaSk7CiAJCQloZG1pX3N0b3BfaW5mb2ZyYW1lX3RyYW5zKGNvZGVjLCBwaW5fbmlkKTsKIAkJCWhkbWlfZmlsbF9hdWRpb19pbmZvZnJhbWUoY29kZWMsIHBpbl9uaWQsICZhaSk7CiAJCQloZG1pX3N0YXJ0X2luZm9mcmFtZV90cmFucyhjb2RlYywgcGluX25pZCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpZ21hdGVsLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpZ21hdGVsLmMKaW5kZXggNmIwYmMwNC4uM2Q1OWY4MyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2lnbWF0ZWwuYwpAQCAtMjA5LDYgKzIwOSw3IEBACiAJdW5zaWduZWQgaW50IGdwaW9fZGF0YTsKIAl1bnNpZ25lZCBpbnQgZ3Bpb19tdXRlOwogCXVuc2lnbmVkIGludCBncGlvX2xlZDsKKwl1bnNpZ25lZCBpbnQgZ3Bpb19sZWRfcG9sYXJpdHk7CiAKIAkvKiBzdHJlYW0gKi8KIAl1bnNpZ25lZCBpbnQgc3RyZWFtX2RlbGF5OwpAQCAtMTUzOCw2ICsxNTM5LDEzIEBACiAJMHg5MDQ2MDFiMCwKIH07CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW50ZWxfZGc0NWlkX3Bpbl9jb25maWdzWzE0XSA9IHsKKwkweDAyMjE0MjMwLCAweDAyQTE5MjQwLCAweDAxMDEzMjE0LCAweDAxMDE0MjEwLAorCTB4MDFBMTkyNTAsIDB4MDEwMTEyMTIsIDB4MDEwMTYyMTEsIDB4NDBmMDAwZjAsCisJMHg0MGYwMDBmMCwgMHg0MGYwMDBmMCwgMHg0MGYwMDBmMCwgMHgwMTQ1MTBBMCwKKwkweDA3NDUxMEIwLCAweDQwZjAwMGYwCit9OworCiBzdGF0aWMgdW5zaWduZWQgaW50ICpzdGFjOTJoZDczeHhfYnJkX3RibFtTVEFDXzkySEQ3M1hYX01PREVMU10gPSB7CiAJW1NUQUNfOTJIRDczWFhfUkVGXQk9IHJlZjkyaGQ3M3h4X3Bpbl9jb25maWdzLAogCVtTVEFDX0RFTExfTTZfQU1JQ10JPSBkZWxsX202X3Bpbl9jb25maWdzLApAQCAtMTU0NSw2ICsxNTUzLDcgQEAKIAlbU1RBQ19ERUxMX002X0JPVEhdCT0gZGVsbF9tNl9waW5fY29uZmlncywKIAlbU1RBQ19ERUxMX0VRXQk9IGRlbGxfbTZfcGluX2NvbmZpZ3MsCiAJW1NUQUNfQUxJRU5XQVJFX00xN1hdCT0gYWxpZW53YXJlX20xN3hfcGluX2NvbmZpZ3MsCisJW1NUQUNfOTJIRDczWFhfSU5URUxdCT0gaW50ZWxfZGc0NWlkX3Bpbl9jb25maWdzLAogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnN0YWM5MmhkNzN4eF9tb2RlbHNbU1RBQ185MkhENzNYWF9NT0RFTFNdID0gewpAQCAtNDcyNCwxMyArNDczMyw2MSBAQAogCX0KIH0KIAotc3RhdGljIGludCBocF9ic2VyaWVzX3N5c3RlbSh1MzIgc3Vic3lzdGVtX2lkKQorLyoKKyAqIFRoaXMgbWV0aG9kIHNlYXJjaGVzIGZvciB0aGUgbXV0ZSBMRUQgR1BJTyBjb25maWd1cmF0aW9uCisgKiBwcm92aWRlZCBhcyBPRU0gc3RyaW5nIGluIFNNQklPUy4gVGhlIGZvcm1hdCBvZiB0aGF0IHN0cmluZworICogaXMgSFBfTXV0ZV9MRURfUF9HIG9yIEhQX011dGVfTEVEX1AKKyAqIHdoZXJlIFAgY2FuIGJlIDAgb3IgMSBhbmQgZGVmaW5lcyBtdXRlIExFRCBHUElPIGNvbnRyb2wgc3RhdGUgKGxvdy9oaWdoKQorICogdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgTk9UIG11dGVkIHN0YXRlIG9mIHRoZSBtYXN0ZXIgdm9sdW1lCisgKiBhbmQgRyBpcyB0aGUgaW5kZXggb2YgdGhlIEdQSU8gdG8gdXNlIGFzIHRoZSBtdXRlIExFRCBjb250cm9sICgwLi45KQorICogSWYgX0cgcG9ydGlvbiBpcyBtaXNzaW5nIGl0IGlzIGFzc2lnbmVkIGJhc2VkIG9uIHRoZSBjb2RlYyBJRAorICoKKyAqIFNvLCBIUCBCLXNlcmllcyBsaWtlIHN5c3RlbXMgbWF5IGhhdmUgSFBfTXV0ZV9MRURfMCAoY3VycmVudCBtb2RlbHMpCisgKiBvciAgSFBfTXV0ZV9MRURfMF8zIChmdXR1cmUgbW9kZWxzKSBPRU0gU01CSU9TIHN0cmluZ3MKKyAqLworc3RhdGljIGludCBmaW5kX211dGVfbGVkX2dwaW8oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHNpZ21hdGVsX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwljb25zdCBzdHJ1Y3QgZG1pX2RldmljZSAqZGV2ID0gTlVMTDsKKworCWlmICgoY29kZWMtPnN1YnN5c3RlbV9pZCA+PiAxNikgPT0gUENJX1ZFTkRPUl9JRF9IUCkgeworCQl3aGlsZSAoKGRldiA9IGRtaV9maW5kX2RldmljZShETUlfREVWX1RZUEVfT0VNX1NUUklORywKKwkJCQkJCQkJTlVMTCwgZGV2KSkpIHsKKwkJCWlmIChzc2NhbmYoZGV2LT5uYW1lLCAiSFBfTXV0ZV9MRURfJWRfJWQiLAorCQkJICAgICAgJnNwZWMtPmdwaW9fbGVkX3BvbGFyaXR5LAorCQkJICAgICAgJnNwZWMtPmdwaW9fbGVkKSA9PSAyKSB7CisJCQkJc3BlYy0+Z3Bpb19sZWQgPSAxIDw8IHNwZWMtPmdwaW9fbGVkOworCQkJCXJldHVybiAxOworCQkJfQorCQkJaWYgKHNzY2FuZihkZXYtPm5hbWUsICJIUF9NdXRlX0xFRF8lZCIsCisJCQkgICAgICAmc3BlYy0+Z3Bpb19sZWRfcG9sYXJpdHkpID09IDEpIHsKKwkJCQlzd2l0Y2ggKGNvZGVjLT52ZW5kb3JfaWQpIHsKKwkJCQljYXNlIDB4MTExZDc2MDg6CisJCQkJCS8qIEdQSU8gMCAqLworCQkJCQlzcGVjLT5ncGlvX2xlZCA9IDB4MDE7CisJCQkJCXJldHVybiAxOworCQkJCWNhc2UgMHgxMTFkNzYwMDoKKwkJCQljYXNlIDB4MTExZDc2MDE6CisJCQkJY2FzZSAweDExMWQ3NjAyOgorCQkJCWNhc2UgMHgxMTFkNzYwMzoKKwkJCQkJLyogR1BJTyAzICovCisJCQkJCXNwZWMtPmdwaW9fbGVkID0gMHgwODsKKwkJCQkJcmV0dXJuIDE7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhwX2JsaWtlX3N5c3RlbSh1MzIgc3Vic3lzdGVtX2lkKQogewogCXN3aXRjaCAoc3Vic3lzdGVtX2lkKSB7Ci0JY2FzZSAweDEwM2MzMDdlOgotCWNhc2UgMHgxMDNjMzA3ZjoKLQljYXNlIDB4MTAzYzMwODA6Ci0JY2FzZSAweDEwM2MzMDgxOgorCWNhc2UgMHgxMDNjMTUyMDoKKwljYXNlIDB4MTAzYzE1MjE6CisJY2FzZSAweDEwM2MxNTIzOgorCWNhc2UgMHgxMDNjMTUyNDoKKwljYXNlIDB4MTAzYzE1MjU6CiAJY2FzZSAweDEwM2MxNzIyOgogCWNhc2UgMHgxMDNjMTcyMzoKIAljYXNlIDB4MTAzYzE3MjQ6CkBAIC00NzM5LDYgKzQ3OTYsMTQgQEAKIAljYXNlIDB4MTAzYzE3Mjc6CiAJY2FzZSAweDEwM2MxNzI4OgogCWNhc2UgMHgxMDNjMTcyOToKKwljYXNlIDB4MTAzYzE3MmE6CisJY2FzZSAweDEwM2MxNzJiOgorCWNhc2UgMHgxMDNjMzA3ZToKKwljYXNlIDB4MTAzYzMwN2Y6CisJY2FzZSAweDEwM2MzMDgwOgorCWNhc2UgMHgxMDNjMzA4MToKKwljYXNlIDB4MTAzYzcwMDc6CisJY2FzZSAweDEwM2M3MDA4OgogCQlyZXR1cm4gMTsKIAl9CiAJcmV0dXJuIDA7CkBAIC00ODMzLDcgKzQ4OTgsNyBAQAogCQllbHNlCiAJCQlzcGVjLT5ncGlvX2RhdGEgfD0gc3BlYy0+Z3Bpb19sZWQ7IC8qIHdoaXRlICovCiAKLQkJaWYgKGhwX2JzZXJpZXNfc3lzdGVtKGNvZGVjLT5zdWJzeXN0ZW1faWQpKSB7CisJCWlmICghc3BlYy0+Z3Bpb19sZWRfcG9sYXJpdHkpIHsKIAkJCS8qIExFRCBzdGF0ZSBpcyBpbnZlcnRlZCBvbiB0aGVzZSBzeXN0ZW1zICovCiAJCQlzcGVjLT5ncGlvX2RhdGEgXj0gc3BlYy0+Z3Bpb19sZWQ7CiAJCX0KQEAgLTU1MjYsNyArNTU5MSw3IEBACiAJCWJyZWFrOwogCX0KIAotCWlmIChocF9ic2VyaWVzX3N5c3RlbShjb2RlYy0+c3Vic3lzdGVtX2lkKSkgeworCWlmIChocF9ibGlrZV9zeXN0ZW0oY29kZWMtPnN1YnN5c3RlbV9pZCkpIHsKIAkJcGluX2NmZyA9IHNuZF9oZGFfY29kZWNfZ2V0X3BpbmNmZyhjb2RlYywgMHgwZik7CiAJCWlmIChnZXRfZGVmY2ZnX2RldmljZShwaW5fY2ZnKSA9PSBBQ19KQUNLX0xJTkVfT1VUIHx8CiAJCQlnZXRfZGVmY2ZnX2RldmljZShwaW5fY2ZnKSA9PSBBQ19KQUNLX1NQRUFLRVIgIHx8CkBAIC01NTQ0LDI2ICs1NjA5LDEwIEBACiAJCX0KIAl9CiAKLQlpZiAoKGNvZGVjLT5zdWJzeXN0ZW1faWQgPj4gMTYpID09IFBDSV9WRU5ET1JfSURfSFApIHsKLQkJY29uc3Qgc3RydWN0IGRtaV9kZXZpY2UgKmRldiA9IE5VTEw7Ci0JCXdoaWxlICgoZGV2ID0gZG1pX2ZpbmRfZGV2aWNlKERNSV9ERVZfVFlQRV9PRU1fU1RSSU5HLAotCQkJCQkgICAgICBOVUxMLCBkZXYpKSkgewotCQkJaWYgKHN0cmNtcChkZXYtPm5hbWUsICJIUF9NdXRlX0xFRF8xIikpIHsKLQkJCQlzd2l0Y2ggKGNvZGVjLT52ZW5kb3JfaWQpIHsKLQkJCQljYXNlIDB4MTExZDc2MDg6Ci0JCQkJCXNwZWMtPmdwaW9fbGVkID0gMHgwMTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAweDExMWQ3NjAwOgotCQkJCWNhc2UgMHgxMTFkNzYwMToKLQkJCQljYXNlIDB4MTExZDc2MDI6Ci0JCQkJY2FzZSAweDExMWQ3NjAzOgotCQkJCQlzcGVjLT5ncGlvX2xlZCA9IDB4MDg7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KKwlpZiAoZmluZF9tdXRlX2xlZF9ncGlvKGNvZGVjKSkKKwkJc25kX3ByaW50ZCgibXV0ZSBMRUQgZ3BpbyAlZCBwb2xhcml0eSAlZFxuIiwKKwkJCQlzcGVjLT5ncGlvX2xlZCwKKwkJCQlzcGVjLT5ncGlvX2xlZF9wb2xhcml0eSk7CiAKICNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCiAJaWYgKHNwZWMtPmdwaW9fbGVkKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9wY21jaWEvcGRhdWRpb2NmL3BkYXVkaW9jZi5jIGIvc291bmQvcGNtY2lhL3BkYXVkaW9jZi9wZGF1ZGlvY2YuYwppbmRleCA3NzE3ZTAxLi5lZGFhNzI5IDEwMDY0NAotLS0gYS9zb3VuZC9wY21jaWEvcGRhdWRpb2NmL3BkYXVkaW9jZi5jCisrKyBiL3NvdW5kL3BjbWNpYS9wZGF1ZGlvY2YvcGRhdWRpb2NmLmMKQEAgLTE0Myw3ICsxNDMsOCBAQAogCWxpbmstPmlvLk51bVBvcnRzMSA9IDE2OwogCiAJbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkUgfCBJUlFfRk9SQ0VEX1BVTFNFOwotCS8vIGxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRFlOQU1JQ19TSEFSSU5HfElSUV9GSVJTVF9TSEFSRUQ7CisJLyogRklYTUU6IFRoaXMgZHJpdmVyIHNob3VsZCBiZSB1cGRhdGVkIHRvIGFsbG93IGZvciBkeW5hbWljIElSUSBzaGFyaW5nICovCisJLyogbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9EWU5BTUlDX1NIQVJJTkcgfCBJUlFfRk9SQ0VEX1BVTFNFOyAqLwogCiAJbGluay0+aXJxLkhhbmRsZXIgPSBwZGFjZl9pbnRlcnJ1cHQ7CiAJbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3R3bDQwMzAuYwppbmRleCA1ZjE2ODFmLi4yYTI3ZjdiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3R3bDQwMzAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3R3bDQwMzAuYwpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjL3R3bDQwMzAuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvdHdsLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KQEAgLTE3NSw3ICsxNzUsNyBAQAogewogCXR3bDQwMzBfd3JpdGVfcmVnX2NhY2hlKGNvZGVjLCByZWcsIHZhbHVlKTsKIAlpZiAobGlrZWx5KHJlZyA8IFRXTDQwMzBfUkVHX1NXX1NIQURPVykpCi0JCXJldHVybiB0d2w0MDMwX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9BVURJT19WT0lDRSwgdmFsdWUsCisJCXJldHVybiB0d2xfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX0FVRElPX1ZPSUNFLCB2YWx1ZSwKIAkJCQkJICAgIHJlZyk7CiAJZWxzZQogCQlyZXR1cm4gMDsKQEAgLTI2MSw3ICsyNjEsNyBAQAogCWRvIHsKIAkJLyogdGhpcyB0YWtlcyBhIGxpdHRsZSB3aGlsZSwgc28gZG9uJ3Qgc2xhbSBpMmMgKi8KIAkJdWRlbGF5KDIwMDApOwotCQl0d2w0MDMwX2kyY19yZWFkX3U4KFRXTDQwMzBfTU9EVUxFX0FVRElPX1ZPSUNFLCAmYnl0ZSwKKwkJdHdsX2kyY19yZWFkX3U4KFRXTDQwMzBfTU9EVUxFX0FVRElPX1ZPSUNFLCAmYnl0ZSwKIAkJCQkgICAgVFdMNDAzMF9SRUdfQU5BTUlDTCk7CiAJfSB3aGlsZSAoKGkrKyA8IDEwMCkgJiYKIAkJICgoYnl0ZSAmIFRXTDQwMzBfQ05DTF9PRkZTRVRfU1RBUlQpID09CkBAIC01NDIsNyArNTQyLDcgQEAKIAkJYnJlYWs7CQkJCQkJCVwKIAljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoJCQkJCVwKIAkJcmVnX3ZhbCA9IHR3bDQwMzBfcmVhZF9yZWdfY2FjaGUody0+Y29kZWMsIHJlZyk7CVwKLQkJdHdsNDAzMF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfQVVESU9fVk9JQ0UsCVwKKwkJdHdsX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9BVURJT19WT0lDRSwJXAogCQkJCQlyZWdfdmFsICYgKH5tYXNrKSwJCVwKIAkJCQkJcmVnKTsJCQkJXAogCQlicmVhazsJCQkJCQkJXApAQCAtNjc5LDcgKzY3OSw3IEBACiAJCW1kZWxheSgocmFtcF9iYXNlWyhoc19wb3AgJiBUV0w0MDMwX1JBTVBfREVMQVkpID4+IDJdIC8KIAkJCXR3bDQwMzAtPnN5c2NsaykgKyAxKTsKIAkJLyogQnlwYXNzIHRoZSByZWdfY2FjaGUgdG8gbXV0ZSB0aGUgaGVhZHNldCAqLwotCQl0d2w0MDMwX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9BVURJT19WT0lDRSwKKwkJdHdsX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9BVURJT19WT0lDRSwKIAkJCQkJaHNfZ2FpbiAmICh+MHgwZiksCiAJCQkJCVRXTDQwMzBfUkVHX0hTX0dBSU5fU0VUKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTgzNTAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204MzUwLmMKaW5kZXggZjgyMTI1ZC4uZWJiZjExYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTgzNTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODM1MC5jCkBAIC0xMzQwLDkgKzEzNDAsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgd204MzUwX2hwX2phY2tfaGFuZGxlcihzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBpcnEsIHZvaWQgKmRhdGEpCitzdGF0aWMgaXJxcmV0dXJuX3Qgd204MzUwX2hwX2phY2tfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCB3bTgzNTBfZGF0YSAqcHJpdiA9IGRhdGE7CisJc3RydWN0IHdtODM1MCAqd204MzUwID0gcHJpdi0+Y29kZWMuY29udHJvbF9kYXRhOwogCXUxNiByZWc7CiAJaW50IHJlcG9ydDsKIAlpbnQgbWFzazsKQEAgLTEzNjUsNyArMTM2Niw3IEBACiAKIAlpZiAoIWphY2stPmphY2spIHsKIAkJZGV2X3dhcm4od204MzUwLT5kZXYsICJKYWNrIGludGVycnVwdCBjYWxsZWQgd2l0aCBubyBqYWNrXG4iKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gSVJRX05PTkU7CiAJfQogCiAJLyogRGVib3VuY2UgKi8KQEAgLTEzNzgsNiArMTM3OSw4IEBACiAJCXJlcG9ydCA9IDA7CiAKIAlzbmRfc29jX2phY2tfcmVwb3J0KGphY2stPmphY2ssIHJlcG9ydCwgamFjay0+cmVwb3J0KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAogLyoqCkBAIC0xNDIxLDkgKzE0MjQsNyBAQAogCXdtODM1MF9zZXRfYml0cyh3bTgzNTAsIFdNODM1MF9KQUNLX0RFVEVDVCwgZW5hKTsKIAogCS8qIFN5bmMgc3RhdHVzICovCi0Jd204MzUwX2hwX2phY2tfaGFuZGxlcih3bTgzNTAsIGlycSwgcHJpdik7Ci0KLQl3bTgzNTBfdW5tYXNrX2lycSh3bTgzNTAsIGlycSk7CisJd204MzUwX2hwX2phY2tfaGFuZGxlcihpcnEsIHByaXYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNDgyLDEyICsxNDgzLDE2IEBACiAJd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX1JPVVQyX1ZPTFVNRSwKIAkJCVdNODM1MF9PVVQyX1ZVIHwgV004MzUwX09VVDJSX01VVEUpOwogCi0Jd204MzUwX21hc2tfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DT0RFQ19KQ0tfREVUX0wpOwotCXdtODM1MF9tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ09ERUNfSkNLX0RFVF9SKTsKKwkvKiBNYWtlIHN1cmUgamFjayBkZXRlY3QgaXMgZGlzYWJsZWQgdG8gc3RhcnQgb2ZmIHdpdGggKi8KKwl3bTgzNTBfY2xlYXJfYml0cyh3bTgzNTAsIFdNODM1MF9KQUNLX0RFVEVDVCwKKwkJCSAgV004MzUwX0pETF9FTkEgfCBXTTgzNTBfSkRSX0VOQSk7CisKIAl3bTgzNTBfcmVnaXN0ZXJfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DT0RFQ19KQ0tfREVUX0wsCi0JCQkgICAgd204MzUwX2hwX2phY2tfaGFuZGxlciwgcHJpdik7CisJCQkgICAgd204MzUwX2hwX2phY2tfaGFuZGxlciwgMCwgIkxlZnQgamFjayBkZXRlY3QiLAorCQkJICAgIHByaXYpOwogCXdtODM1MF9yZWdpc3Rlcl9pcnEod204MzUwLCBXTTgzNTBfSVJRX0NPREVDX0pDS19ERVRfUiwKLQkJCSAgICB3bTgzNTBfaHBfamFja19oYW5kbGVyLCBwcml2KTsKKwkJCSAgICB3bTgzNTBfaHBfamFja19oYW5kbGVyLCAwLCAiUmlnaHQgamFjayBkZXRlY3QiLAorCQkJICAgIHByaXYpOwogCiAJcmV0ID0gc25kX3NvY19uZXdfcGNtcyhzb2NkZXYsIFNORFJWX0RFRkFVTFRfSURYMSwgU05EUlZfREVGQVVMVF9TVFIxKTsKIAlpZiAocmV0IDwgMCkgewpAQCAtMTUxNiw4ICsxNTIxLDYgQEAKIAkJCSAgV004MzUwX0pETF9FTkEgfCBXTTgzNTBfSkRSX0VOQSk7CiAJd204MzUwX2NsZWFyX2JpdHMod204MzUwLCBXTTgzNTBfUE9XRVJfTUdNVF80LCBXTTgzNTBfVE9DTEtfRU5BKTsKIAotCXdtODM1MF9tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ09ERUNfSkNLX0RFVF9MKTsKLQl3bTgzNTBfbWFza19pcnEod204MzUwLCBXTTgzNTBfSVJRX0NPREVDX0pDS19ERVRfUik7CiAJd204MzUwX2ZyZWVfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DT0RFQ19KQ0tfREVUX0wpOwogCXdtODM1MF9mcmVlX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ09ERUNfSkNLX0RFVF9SKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvTWFrZWZpbGUgYi9zb3VuZC9zb2Mvb21hcC9NYWtlZmlsZQppbmRleCBkNDk0NThhLi4zZGI4YTZjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvb21hcC9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2Mvb21hcC9NYWtlZmlsZQpAQCAtMjMsOSArMjMsOSBAQAogb2JqLSQoQ09ORklHX1NORF9PTUFQX1NPQ19BTVNfREVMVEEpICs9IHNuZC1zb2MtYW1zLWRlbHRhLm8KIG9iai0kKENPTkZJR19TTkRfT01BUF9TT0NfT1NLNTkxMikgKz0gc25kLXNvYy1vc2s1OTEyLm8KIG9iai0kKENPTkZJR19TTkRfT01BUF9TT0NfT1ZFUk8pICs9IHNuZC1zb2Mtb3Zlcm8ubwotb2JqLSQoQ09ORklHX01BQ0hfT01BUDJFVk0pICs9IHNuZC1zb2Mtb21hcDJldm0ubwotb2JqLSQoQ09ORklHX01BQ0hfT01BUDNFVk0pICs9IHNuZC1zb2Mtb21hcDNldm0ubwotb2JqLSQoQ09ORklHX01BQ0hfT01BUDM1MTdFVk0pICs9IHNuZC1zb2MtYW0zNTE3ZXZtLm8KK29iai0kKENPTkZJR19TTkRfT01BUF9TT0NfT01BUDJFVk0pICs9IHNuZC1zb2Mtb21hcDJldm0ubworb2JqLSQoQ09ORklHX1NORF9PTUFQX1NPQ19PTUFQM0VWTSkgKz0gc25kLXNvYy1vbWFwM2V2bS5vCitvYmotJChDT05GSUdfU05EX09NQVBfU09DX09NQVAzNTE3RVZNKSArPSBzbmQtc29jLWFtMzUxN2V2bS5vCiBvYmotJChDT05GSUdfU05EX09NQVBfU09DX1NEUDM0MzApICs9IHNuZC1zb2Mtc2RwMzQzMC5vCiBvYmotJChDT05GSUdfU05EX09NQVBfU09DX09NQVAzX1BBTkRPUkEpICs9IHNuZC1zb2Mtb21hcDNwYW5kb3JhLm8KIG9iai0kKENPTkZJR19TTkRfT01BUF9TT0NfT01BUDNfQkVBR0xFKSArPSBzbmQtc29jLW9tYXAzYmVhZ2xlLm8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLWttZW0udHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYta21lbS50eHQKaW5kZXggNDRiMGNlMy4uZWFjNGQ4NTJlIDEwMDY0NAotLS0gYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1rbWVtLnR4dAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1rbWVtLnR4dApAQCAtOCwxNiArOCwxNiBAQAogU1lOT1BTSVMKIC0tLS0tLS0tCiBbdmVyc2VdCi0ncGVyZiBrbWVtJyB7cmVjb3JkfSBbPG9wdGlvbnM+XQorJ3BlcmYga21lbScge3JlY29yZHxzdGF0fSBbPG9wdGlvbnM+XQogCiBERVNDUklQVElPTgogLS0tLS0tLS0tLS0KLVRoZXJlJ3MgdHdvIHZhcmlhbnRzIG9mIHBlcmYga21lbToKK1RoZXJlIGFyZSB0d28gdmFyaWFudHMgb2YgcGVyZiBrbWVtOgogCiAgICdwZXJmIGttZW0gcmVjb3JkIDxjb21tYW5kPicgdG8gcmVjb3JkIHRoZSBrbWVtIGV2ZW50cwogICBvZiBhbiBhcmJpdHJhcnkgd29ya2xvYWQuCiAKLSAgJ3BlcmYga21lbScgdG8gcmVwb3J0IGtlcm5lbCBtZW1vcnkgc3RhdGlzdGljcy4KKyAgJ3BlcmYga21lbSBzdGF0JyB0byByZXBvcnQga2VybmVsIG1lbW9yeSBzdGF0aXN0aWNzLgogCiBPUFRJT05TCiAtLS0tLS0tCkBAIC0yNSw4ICsyNSwxMSBAQAogLS1pbnB1dD08ZmlsZT46OgogCVNlbGVjdCB0aGUgaW5wdXQgZmlsZSAoZGVmYXVsdDogcGVyZi5kYXRhKQogCi0tLXN0YXQ9PGNhbGxlcnxhbGxvYz46OgotCVNlbGVjdCBwZXIgY2FsbHNpdGUgb3IgcGVyIGFsbG9jYXRpb24gc3RhdGlzdGljcworLS1jYWxsZXI6OgorCVNob3cgcGVyLWNhbGxzaXRlIHN0YXRpc3RpY3MKKworLS1hbGxvYzo6CisJU2hvdyBwZXItYWxsb2NhdGlvbiBzdGF0aXN0aWNzCiAKIC1zIDxrZXlbLGtleTIuLi5dPjo6CiAtLXNvcnQ9PGtleVssa2V5Mi4uLl0+OjoKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXByb2JlLnR4dCBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXByb2JlLnR4dAppbmRleCA5MjcwNTk0Li44ZmE2YmY5IDEwMDY0NAotLS0gYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1wcm9iZS50eHQKKysrIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcHJvYmUudHh0CkBAIC04LDEwICs4LDEzIEBACiBTWU5PUFNJUwogLS0tLS0tLS0KIFt2ZXJzZV0KLSdwZXJmIHByb2JlJyBbb3B0aW9uc10gLS1hZGQgJ1BST0JFJyBbLS1hZGQgJ1BST0JFJyAuLi5dCisncGVyZiBwcm9iZScgW29wdGlvbnNdIC0tYWRkPSdQUk9CRScgWy4uLl0KIG9yCi0ncGVyZiBwcm9iZScgW29wdGlvbnNdICdQUk9CRScgWydQUk9CRScgLi4uXQotCisncGVyZiBwcm9iZScgW29wdGlvbnNdIFBST0JFCitvcgorJ3BlcmYgcHJvYmUnIFtvcHRpb25zXSAtLWRlbD0nW0dST1VQOl1FVkVOVCcgWy4uLl0KK29yCisncGVyZiBwcm9iZScgLS1saXN0CiAKIERFU0NSSVBUSU9OCiAtLS0tLS0tLS0tLQpAQCAtMzEsOCArMzQsMTYgQEAKICAgICAgICAgQmUgbW9yZSB2ZXJib3NlIChzaG93IHBhcnNlZCBhcmd1bWVudHMsIGV0YykuCiAKIC1hOjoKLS0tYWRkOjoKLQlEZWZpbmUgYSBwcm9iZSBwb2ludCAoc2VlIFBST0JFIFNZTlRBWCBmb3IgZGV0YWlsKQorLS1hZGQ9OjoKKwlEZWZpbmUgYSBwcm9iZSBldmVudCAoc2VlIFBST0JFIFNZTlRBWCBmb3IgZGV0YWlsKS4KKworLWQ6OgorLS1kZWw9OjoKKwlEZWxldGUgYSBwcm9iZSBldmVudC4KKworLWw6OgorLS1saXN0OjoKKwlMaXN0IHVwIGN1cnJlbnQgcHJvYmUgZXZlbnRzLgogCiBQUk9CRSBTWU5UQVgKIC0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9NYWtlZmlsZSBiL3Rvb2xzL3BlcmYvTWFrZWZpbGUKaW5kZXggMjNlYzY2MDkuLjQwNjk5OTYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvTWFrZWZpbGUKKysrIGIvdG9vbHMvcGVyZi9NYWtlZmlsZQpAQCAtMjM3LDggKzIzNyw4IEBACiAKIGV4cG9ydCBwcmVmaXggYmluZGlyIHNoYXJlZGlyIHN5c2NvbmZkaXIKIAotQ0MgPSBnY2MKLUFSID0gYXIKK0NDID0gJChDUk9TU19DT01QSUxFKWdjYworQVIgPSAkKENST1NTX0NPTVBJTEUpYXIKIFJNID0gcm0gLWYKIFRBUiA9IHRhcgogRklORCA9IGZpbmQKQEAgLTM1Niw3ICszNTYsOSBAQAogTElCX0ggKz0gdXRpbC9wYXJzZS1ldmVudHMuaAogTElCX0ggKz0gdXRpbC9xdW90ZS5oCiBMSUJfSCArPSB1dGlsL3V0aWwuaAorTElCX0ggKz0gdXRpbC9oZWFkZXIuaAogTElCX0ggKz0gdXRpbC9oZWxwLmgKK0xJQl9IICs9IHV0aWwvc2Vzc2lvbi5oCiBMSUJfSCArPSB1dGlsL3N0cmJ1Zi5oCiBMSUJfSCArPSB1dGlsL3N0cmluZy5oCiBMSUJfSCArPSB1dGlsL3N0cmxpc3QuaApAQCAtNDA1LDYgKzQwNyw3IEBACiBMSUJfT0JKUyArPSB1dGlsL3ZhbHVlcy5vCiBMSUJfT0JKUyArPSB1dGlsL2RlYnVnLm8KIExJQl9PQkpTICs9IHV0aWwvbWFwLm8KK0xJQl9PQkpTICs9IHV0aWwvc2Vzc2lvbi5vCiBMSUJfT0JKUyArPSB1dGlsL3RocmVhZC5vCiBMSUJfT0JKUyArPSB1dGlsL3RyYWNlLWV2ZW50LXBhcnNlLm8KIExJQl9PQkpTICs9IHV0aWwvdHJhY2UtZXZlbnQtcmVhZC5vCkBAIC00OTIsOCArNDk1LDEwIEBACiAJTElCX09CSlMgKz0gdXRpbC9wcm9iZS1maW5kZXIubwogZW5kaWYKIAoraWZuZGVmIE5PX0xJQlBFUkwKIFBFUkxfRU1CRURfTERPUFRTID0gYHBlcmwgLU1FeHRVdGlsczo6RW1iZWQgLWUgbGRvcHRzIDI+L2Rldi9udWxsYAogUEVSTF9FTUJFRF9DQ09QVFMgPSBgcGVybCAtTUV4dFV0aWxzOjpFbWJlZCAtZSBjY29wdHMgMj4vZGV2L251bGxgCitlbmRpZgogCiBpZm5lcSAoJChzaGVsbCBzaCAtYyAiKGVjaG8gJ1wjaW5jbHVkZSA8RVhURVJOLmg+JzsgZWNobyAnXCNpbmNsdWRlIDxwZXJsLmg+JzsgZWNobyAnaW50IG1haW4odm9pZCkgeyBwZXJsX2FsbG9jKCk7IHJldHVybiAwOyB9JykgfCAkKENDKSAteCBjIC0gJChQRVJMX0VNQkVEX0NDT1BUUykgLW8gL2Rldi9udWxsICQoUEVSTF9FTUJFRF9MRE9QVFMpID4gL2Rldi9udWxsIDI+JjEgJiYgZWNobyB5IiksIHkpCiAJQkFTSUNfQ0ZMQUdTICs9IC1ETk9fTElCUEVSTApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9iZW5jaC9zY2hlZC1tZXNzYWdpbmcuYyBiL3Rvb2xzL3BlcmYvYmVuY2gvc2NoZWQtbWVzc2FnaW5nLmMKaW5kZXggNjA1YTJhOS4uODFjZWU3OCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9iZW5jaC9zY2hlZC1tZXNzYWdpbmcuYworKysgYi90b29scy9wZXJmL2JlbmNoL3NjaGVkLW1lc3NhZ2luZy5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqCi0gKiBidWlsdGluLWJlbmNoLW1lc3NhZ2luZy5jCisgKiBzY2hlZC1tZXNzYWdpbmcuYwogICoKICAqIG1lc3NhZ2luZzogQmVuY2htYXJrIGZvciBzY2hlZHVsZXIgYW5kIElQQyBtZWNoYW5pc21zCiAgKgpAQCAtMzIwLDEwICszMjAsMTIgQEAKIAkJICAgICAgIG51bV9ncm91cHMsIG51bV9ncm91cHMgKiAyICogbnVtX2ZkcywKIAkJICAgICAgIHRocmVhZF9tb2RlID8gInRocmVhZHMiIDogInByb2Nlc3NlcyIpOwogCQlwcmludGYoIiAlMTRzOiAlbHUuJTAzbHUgW3NlY11cbiIsICJUb3RhbCB0aW1lIiwKLQkJICAgICAgIGRpZmYudHZfc2VjLCBkaWZmLnR2X3VzZWMvMTAwMCk7CisJCSAgICAgICBkaWZmLnR2X3NlYywKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSAoZGlmZi50dl91c2VjLzEwMDApKTsKIAkJYnJlYWs7CiAJY2FzZSBCRU5DSF9GT1JNQVRfU0lNUExFOgotCQlwcmludGYoIiVsdS4lMDNsdVxuIiwgZGlmZi50dl9zZWMsIGRpZmYudHZfdXNlYy8xMDAwKTsKKwkJcHJpbnRmKCIlbHUuJTAzbHVcbiIsIGRpZmYudHZfc2VjLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIChkaWZmLnR2X3VzZWMvMTAwMCkpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQkvKiByZWFjaGluZyBoZXJlIGlzIHNvbWV0aGluZyBkaXNhc3RlciAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9iZW5jaC9zY2hlZC1waXBlLmMgYi90b29scy9wZXJmL2JlbmNoL3NjaGVkLXBpcGUuYwppbmRleCAyMzgxODVmLi40Zjc3YzdjIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2JlbmNoL3NjaGVkLXBpcGUuYworKysgYi90b29scy9wZXJmL2JlbmNoL3NjaGVkLXBpcGUuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKgotICogYnVpbHRpbi1iZW5jaC1waXBlLmMKKyAqIHNjaGVkLXBpcGUuYwogICoKICAqIHBpcGU6IEJlbmNobWFyayBmb3IgcGlwZSgpCiAgKgpAQCAtODcsNyArODcsOCBAQAogCWlmIChwaWQpIHsKIAkJcmV0cGlkID0gd2FpdHBpZChwaWQsICZ3YWl0X3N0YXQsIDApOwogCQlhc3NlcnQoKHJldHBpZCA9PSBwaWQpICYmIFdJRkVYSVRFRCh3YWl0X3N0YXQpKTsKLQkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJZXhpdCgwKTsKIAl9CiAKIAlzd2l0Y2ggKGJlbmNoX2Zvcm1hdCkgewpAQCAtOTksNyArMTAwLDggQEAKIAkJcmVzdWx0X3VzZWMgKz0gZGlmZi50dl91c2VjOwogCiAJCXByaW50ZigiICUxNHM6ICVsdS4lMDNsdSBbc2VjXVxuXG4iLCAiVG90YWwgdGltZSIsCi0JCSAgICAgICBkaWZmLnR2X3NlYywgZGlmZi50dl91c2VjLzEwMDApOworCQkgICAgICAgZGlmZi50dl9zZWMsCisJCSAgICAgICAodW5zaWduZWQgbG9uZykgKGRpZmYudHZfdXNlYy8xMDAwKSk7CiAKIAkJcHJpbnRmKCIgJTE0bGYgdXNlY3Mvb3BcbiIsCiAJCSAgICAgICAoZG91YmxlKXJlc3VsdF91c2VjIC8gKGRvdWJsZSlsb29wcyk7CkBAIC0xMTAsNyArMTEyLDggQEAKIAogCWNhc2UgQkVOQ0hfRk9STUFUX1NJTVBMRToKIAkJcHJpbnRmKCIlbHUuJTAzbHVcbiIsCi0JCSAgICAgICBkaWZmLnR2X3NlYywgZGlmZi50dl91c2VjIC8gMTAwMCk7CisJCSAgICAgICBkaWZmLnR2X3NlYywKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSAoZGlmZi50dl91c2VjIC8gMTAwMCkpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tYW5ub3RhdGUuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1hbm5vdGF0ZS5jCmluZGV4IDBiZjJlOGY5Li4yMWE3OGQzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tYW5ub3RhdGUuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tYW5ub3RhdGUuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgInV0aWwvdGhyZWFkLmgiCiAjaW5jbHVkZSAidXRpbC9zb3J0LmgiCiAjaW5jbHVkZSAidXRpbC9oaXN0LmgiCisjaW5jbHVkZSAidXRpbC9zZXNzaW9uLmgiCiAjaW5jbHVkZSAidXRpbC9kYXRhX21hcC5oIgogCiBzdGF0aWMgY2hhcgkJY29uc3QgKmlucHV0X25hbWUgPSAicGVyZi5kYXRhIjsKQEAgLTQ2MiwyMSArNDYzLDIzIEBACiAKIHN0YXRpYyBpbnQgX19jbWRfYW5ub3RhdGUodm9pZCkKIHsKLQlzdHJ1Y3QgcGVyZl9oZWFkZXIgKmhlYWRlcjsKKwlzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uID0gcGVyZl9zZXNzaW9uX19uZXcoaW5wdXRfbmFtZSwgT19SRE9OTFksIGZvcmNlKTsKIAlzdHJ1Y3QgdGhyZWFkICppZGxlOwogCWludCByZXQ7CiAKKwlpZiAoc2Vzc2lvbiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCWlkbGUgPSByZWdpc3Rlcl9pZGxlX3RocmVhZCgpOwogCXJlZ2lzdGVyX3BlcmZfZmlsZV9oYW5kbGVyKCZmaWxlX2hhbmRsZXIpOwogCi0JcmV0ID0gbW1hcF9kaXNwYXRjaF9wZXJmX2ZpbGUoJmhlYWRlciwgaW5wdXRfbmFtZSwgMCwgMCwKLQkJCQkgICAgICAmZXZlbnRfX2N3ZGxlbiwgJmV2ZW50X19jd2QpOworCXJldCA9IHBlcmZfc2Vzc2lvbl9fcHJvY2Vzc19ldmVudHMoc2Vzc2lvbiwgMCwgJmV2ZW50X19jd2RsZW4sICZldmVudF9fY3dkKTsKIAlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCQlnb3RvIG91dF9kZWxldGU7CiAKIAlpZiAoZHVtcF90cmFjZSkgewogCQlldmVudF9fcHJpbnRfdG90YWxzKCk7Ci0JCXJldHVybiAwOworCQlnb3RvIG91dF9kZWxldGU7CiAJfQogCiAJaWYgKHZlcmJvc2UgPiAzKQpAQCAtNDg5LDYgKzQ5Miw4IEBACiAJb3V0cHV0X19yZXNvcnQoZXZlbnRfX3RvdGFsWzBdKTsKIAogCWZpbmRfYW5ub3RhdGlvbnMoKTsKK291dF9kZWxldGU6CisJcGVyZl9zZXNzaW9uX19kZWxldGUoc2Vzc2lvbik7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLWJlbmNoLmMgYi90b29scy9wZXJmL2J1aWx0aW4tYmVuY2guYwppbmRleCBlMDQzZWI4Li40Njk5Njc3IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tYmVuY2guYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tYmVuY2guYwpAQCAtMzEsNiArMzEsOSBAQAogCWNvbnN0IGNoYXIgKnN1bW1hcnk7CiAJaW50ICgqZm4pKGludCwgY29uc3QgY2hhciAqKiwgY29uc3QgY2hhciAqKTsKIH07CisJCQkJCQlcCisvKiBzZW50aW5lbDogZWFzeSBmb3IgaGVscCAqLworI2RlZmluZSBzdWl0ZV9hbGwgeyAiYWxsIiwgInRlc3QgYWxsIHN1aXRlIChwc2V1ZG8gc3VpdGUpIiwgTlVMTCB9CiAKIHN0YXRpYyBzdHJ1Y3QgYmVuY2hfc3VpdGUgc2NoZWRfc3VpdGVzW10gPSB7CiAJeyAibWVzc2FnaW5nIiwKQEAgLTM5LDYgKzQyLDcgQEAKIAl7ICJwaXBlIiwKIAkgICJGbG9vZCBvZiBjb21tdW5pY2F0aW9uIG92ZXIgcGlwZSgpIGJldHdlZW4gdHdvIHByb2Nlc3NlcyIsCiAJICBiZW5jaF9zY2hlZF9waXBlICAgICAgfSwKKwlzdWl0ZV9hbGwsCiAJeyBOVUxMLAogCSAgTlVMTCwKIAkgIE5VTEwgICAgICAgICAgICAgICAgICB9CkBAIC00OCw2ICs1Miw3IEBACiAJeyAibWVtY3B5IiwKIAkgICJTaW1wbGUgbWVtb3J5IGNvcHkgaW4gdmFyaW91cyB3YXlzIiwKIAkgIGJlbmNoX21lbV9tZW1jcHkgfSwKKwlzdWl0ZV9hbGwsCiAJeyBOVUxMLAogCSAgTlVMTCwKIAkgIE5VTEwgICAgICAgICAgICAgfQpAQCAtNjYsNiArNzEsOSBAQAogCXsgIm1lbSIsCiAJICAibWVtb3J5IGFjY2VzcyBwZXJmb3JtYW5jZSIsCiAJICBtZW1fc3VpdGVzIH0sCisJeyAiYWxsIiwJCS8qIHNlbnRpbmVsOiBlYXN5IGZvciBoZWxwICovCisJICAidGVzdCBhbGwgc3Vic3lzdGVtIChwc2V1ZG8gc3Vic3lzdGVtKSIsCisJICBOVUxMIH0sCiAJeyBOVUxMLAogCSAgTlVMTCwKIAkgIE5VTEwgICAgICAgfQpAQCAtNzUsMTEgKzgzLDExIEBACiB7CiAJaW50IGk7CiAKLQlwcmludGYoIkxpc3Qgb2YgYXZhaWxhYmxlIHN1aXRlcyBmb3IgJXMuLi5cblxuIiwKKwlwcmludGYoIiMgTGlzdCBvZiBhdmFpbGFibGUgc3VpdGVzIGZvciAlcy4uLlxuXG4iLAogCSAgICAgICBzdWJzeXN0ZW1zW3N1YnN5c19pbmRleF0ubmFtZSk7CiAKIAlmb3IgKGkgPSAwOyBzdWJzeXN0ZW1zW3N1YnN5c19pbmRleF0uc3VpdGVzW2ldLm5hbWU7IGkrKykKLQkJcHJpbnRmKCJcdCVzOiAlc1xuIiwKKwkJcHJpbnRmKCIlMTRzOiAlc1xuIiwKIAkJICAgICAgIHN1YnN5c3RlbXNbc3Vic3lzX2luZGV4XS5zdWl0ZXNbaV0ubmFtZSwKIAkJICAgICAgIHN1YnN5c3RlbXNbc3Vic3lzX2luZGV4XS5zdWl0ZXNbaV0uc3VtbWFyeSk7CiAKQEAgLTExMCwxMCArMTE4LDEwIEBACiAJCXByaW50ZigiXHQlc1xuIiwgYmVuY2hfdXNhZ2VbaV0pOwogCXByaW50ZigiXG4iKTsKIAotCXByaW50ZigiTGlzdCBvZiBhdmFpbGFibGUgc3Vic3lzdGVtcy4uLlxuXG4iKTsKKwlwcmludGYoIiMgTGlzdCBvZiBhdmFpbGFibGUgc3Vic3lzdGVtcy4uLlxuXG4iKTsKIAogCWZvciAoaSA9IDA7IHN1YnN5c3RlbXNbaV0ubmFtZTsgaSsrKQotCQlwcmludGYoIlx0JXM6ICVzXG4iLAorCQlwcmludGYoIiUxNHM6ICVzXG4iLAogCQkgICAgICAgc3Vic3lzdGVtc1tpXS5uYW1lLCBzdWJzeXN0ZW1zW2ldLnN1bW1hcnkpOwogCXByaW50ZigiXG4iKTsKIH0KQEAgLTEzMSw2ICsxMzksMzcgQEAKIAlyZXR1cm4gQkVOQ0hfRk9STUFUX1VOS05PV047CiB9CiAKK3N0YXRpYyB2b2lkIGFsbF9zdWl0ZShzdHJ1Y3QgYmVuY2hfc3Vic3lzICpzdWJzeXMpCSAgLyogRlJPTSBIRVJFICovCit7CisJaW50IGk7CisJY29uc3QgY2hhciAqYXJndlsyXTsKKwlzdHJ1Y3QgYmVuY2hfc3VpdGUgKnN1aXRlcyA9IHN1YnN5cy0+c3VpdGVzOworCisJYXJndlsxXSA9IE5VTEw7CisJLyoKKwkgKiBUT0RPOgorCSAqIHByZXBhcmluZyBwcmVzZXQgcGFyYW1ldGVycyBmb3IKKwkgKiBlbWJlZGRlZCwgb3JkaW5hcnkgUEMsIEhQQywgZXRjLi4uCisJICogd2lsbCBiZSBoZWxwZnVsCisJICovCisJZm9yIChpID0gMDsgc3VpdGVzW2ldLmZuOyBpKyspIHsKKwkJcHJpbnRmKCIjIFJ1bm5pbmcgJXMvJXMgYmVuY2htYXJrLi4uXG4iLAorCQkgICAgICAgc3Vic3lzLT5uYW1lLAorCQkgICAgICAgc3VpdGVzW2ldLm5hbWUpOworCisJCWFyZ3ZbMV0gPSBzdWl0ZXNbaV0ubmFtZTsKKwkJc3VpdGVzW2ldLmZuKDEsIGFyZ3YsIE5VTEwpOworCQlwcmludGYoIlxuIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBhbGxfc3Vic3lzdGVtKHZvaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgc3Vic3lzdGVtc1tpXS5zdWl0ZXM7IGkrKykKKwkJYWxsX3N1aXRlKCZzdWJzeXN0ZW1zW2ldKTsKK30KKwogaW50IGNtZF9iZW5jaChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCBfX3VzZWQpCiB7CiAJaW50IGksIGosIHN0YXR1cyA9IDA7CkBAIC0xNTUsNiArMTk0LDExIEBACiAJCWdvdG8gZW5kOwogCX0KIAorCWlmICghc3RyY21wKGFyZ3ZbMF0sICJhbGwiKSkgeworCQlhbGxfc3Vic3lzdGVtKCk7CisJCWdvdG8gZW5kOworCX0KKwogCWZvciAoaSA9IDA7IHN1YnN5c3RlbXNbaV0ubmFtZTsgaSsrKSB7CiAJCWlmIChzdHJjbXAoc3Vic3lzdGVtc1tpXS5uYW1lLCBhcmd2WzBdKSkKIAkJCWNvbnRpbnVlOwpAQCAtMTY1LDYgKzIwOSwxMSBAQAogCQkJZ290byBlbmQ7CiAJCX0KIAorCQlpZiAoIXN0cmNtcChhcmd2WzFdLCAiYWxsIikpIHsKKwkJCWFsbF9zdWl0ZSgmc3Vic3lzdGVtc1tpXSk7CisJCQlnb3RvIGVuZDsKKwkJfQorCiAJCWZvciAoaiA9IDA7IHN1YnN5c3RlbXNbaV0uc3VpdGVzW2pdLm5hbWU7IGorKykgewogCQkJaWYgKHN0cmNtcChzdWJzeXN0ZW1zW2ldLnN1aXRlc1tqXS5uYW1lLCBhcmd2WzFdKSkKIAkJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1idWlsZGlkLWxpc3QuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1idWlsZGlkLWxpc3QuYwppbmRleCA3ZGVlOWQxOS4uYmZkMTZhMSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLWJ1aWxkaWQtbGlzdC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1idWlsZGlkLWxpc3QuYwpAQCAtMTEsMTUgKzExLDE1IEBACiAjaW5jbHVkZSAidXRpbC9jYWNoZS5oIgogI2luY2x1ZGUgInV0aWwvZGF0YV9tYXAuaCIKICNpbmNsdWRlICJ1dGlsL2RlYnVnLmgiCi0jaW5jbHVkZSAidXRpbC9oZWFkZXIuaCIKICNpbmNsdWRlICJ1dGlsL3BhcnNlLW9wdGlvbnMuaCIKKyNpbmNsdWRlICJ1dGlsL3Nlc3Npb24uaCIKICNpbmNsdWRlICJ1dGlsL3N5bWJvbC5oIgogCiBzdGF0aWMgY2hhciBjb25zdCAqaW5wdXRfbmFtZSA9ICJwZXJmLmRhdGEiOwogc3RhdGljIGludCBmb3JjZTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGJ1aWxkaWRfbGlzdF91c2FnZVtdID0gewotCSJwZXJmIHJlcG9ydCBbPG9wdGlvbnM+XSIsCisJInBlcmYgYnVpbGRpZC1saXN0IFs8b3B0aW9ucz5dIiwKIAlOVUxMCiB9OwogCkBAIC01NSw1NiArNTUsMTcgQEAKIHN0YXRpYyBpbnQgX19jbWRfYnVpbGRpZF9saXN0KHZvaWQpCiB7CiAJaW50IGVyciA9IC0xOwotCXN0cnVjdCBwZXJmX2hlYWRlciAqaGVhZGVyOwotCXN0cnVjdCBwZXJmX2ZpbGVfaGVhZGVyIGZfaGVhZGVyOwotCXN0cnVjdCBzdGF0IGlucHV0X3N0YXQ7Ci0JaW50IGlucHV0ID0gb3BlbihpbnB1dF9uYW1lLCBPX1JET05MWSk7CisJc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiA9IHBlcmZfc2Vzc2lvbl9fbmV3KGlucHV0X25hbWUsIE9fUkRPTkxZLCBmb3JjZSk7CiAKLQlpZiAoaW5wdXQgPCAwKSB7Ci0JCXByX2VycigiZmFpbGVkIHRvIG9wZW4gZmlsZTogJXMiLCBpbnB1dF9uYW1lKTsKLQkJaWYgKCFzdHJjbXAoaW5wdXRfbmFtZSwgInBlcmYuZGF0YSIpKQotCQkJcHJfZXJyKCIgICh0cnkgJ3BlcmYgcmVjb3JkJyBmaXJzdCkiKTsKLQkJcHJfZXJyKCJcbiIpOwotCQlnb3RvIG91dDsKLQl9CisJaWYgKHNlc3Npb24gPT0gTlVMTCkKKwkJcmV0dXJuIC0xOwogCi0JZXJyID0gZnN0YXQoaW5wdXQsICZpbnB1dF9zdGF0KTsKLQlpZiAoZXJyIDwgMCkgewotCQlwZXJyb3IoImZhaWxlZCB0byBzdGF0IGZpbGUiKTsKLQkJZ290byBvdXRfY2xvc2U7Ci0JfQotCi0JaWYgKCFmb3JjZSAmJiBpbnB1dF9zdGF0LnN0X3VpZCAmJiAoaW5wdXRfc3RhdC5zdF91aWQgIT0gZ2V0ZXVpZCgpKSkgewotCQlwcl9lcnIoImZpbGUgJXMgbm90IG93bmVkIGJ5IGN1cnJlbnQgdXNlciBvciByb290XG4iLAotCQkgICAgICAgaW5wdXRfbmFtZSk7Ci0JCWdvdG8gb3V0X2Nsb3NlOwotCX0KLQotCWlmICghaW5wdXRfc3RhdC5zdF9zaXplKSB7Ci0JCXByX2luZm8oInplcm8tc2l6ZWQgZmlsZSwgbm90aGluZyB0byBkbyFcbiIpOwotCQlnb3RvIG91dF9jbG9zZTsKLQl9Ci0KLQllcnIgPSAtMTsKLQloZWFkZXIgPSBwZXJmX2hlYWRlcl9fbmV3KCk7Ci0JaWYgKGhlYWRlciA9PSBOVUxMKQotCQlnb3RvIG91dF9jbG9zZTsKLQotCWlmIChwZXJmX2ZpbGVfaGVhZGVyX19yZWFkKCZmX2hlYWRlciwgaGVhZGVyLCBpbnB1dCkgPCAwKSB7Ci0JCXByX3dhcm5pbmcoImluY29tcGF0aWJsZSBmaWxlIGZvcm1hdCIpOwotCQlnb3RvIG91dF9jbG9zZTsKLQl9Ci0KLQllcnIgPSBwZXJmX2hlYWRlcl9fcHJvY2Vzc19zZWN0aW9ucyhoZWFkZXIsIGlucHV0LAorCWVyciA9IHBlcmZfaGVhZGVyX19wcm9jZXNzX3NlY3Rpb25zKCZzZXNzaW9uLT5oZWFkZXIsIHNlc3Npb24tPmZkLAogCQkJCSAgICAgICAgIHBlcmZfZmlsZV9zZWN0aW9uX19wcm9jZXNzX2J1aWxkaWRzKTsKKwlpZiAoZXJyID49IDApCisJCWRzb3NfX2ZwcmludGZfYnVpbGRpZChzdGRvdXQpOwogCi0JaWYgKGVyciA8IDApCi0JCWdvdG8gb3V0X2Nsb3NlOwotCi0JZHNvc19fZnByaW50Zl9idWlsZGlkKHN0ZG91dCk7Ci1vdXRfY2xvc2U6Ci0JY2xvc2UoaW5wdXQpOwotb3V0OgorCXBlcmZfc2Vzc2lvbl9fZGVsZXRlKHNlc3Npb24pOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1rbWVtLmMgYi90b29scy9wZXJmL2J1aWx0aW4ta21lbS5jCmluZGV4IDA0N2ZlZjcuLjIwNzFkMjQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1rbWVtLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLWttZW0uYwpAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlICJ1dGlsL3N5bWJvbC5oIgogI2luY2x1ZGUgInV0aWwvdGhyZWFkLmgiCiAjaW5jbHVkZSAidXRpbC9oZWFkZXIuaCIKKyNpbmNsdWRlICJ1dGlsL3Nlc3Npb24uaCIKIAogI2luY2x1ZGUgInV0aWwvcGFyc2Utb3B0aW9ucy5oIgogI2luY2x1ZGUgInV0aWwvdHJhY2UtZXZlbnQuaCIKQEAgLTIwLDcgKzIxLDYgQEAKIAogc3RhdGljIGNoYXIgY29uc3QJCSppbnB1dF9uYW1lID0gInBlcmYuZGF0YSI7CiAKLXN0YXRpYyBzdHJ1Y3QgcGVyZl9oZWFkZXIJKmhlYWRlcjsKIHN0YXRpYyB1NjQJCQlzYW1wbGVfdHlwZTsKIAogc3RhdGljIGludAkJCWFsbG9jX2ZsYWc7CkBAIC01NywxMSArNTcsNiBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgdG90YWxfcmVxdWVzdGVkLCB0b3RhbF9hbGxvY2F0ZWQ7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBucl9hbGxvY3MsIG5yX2Nyb3NzX2FsbG9jczsKIAotc3RydWN0IHJhd19ldmVudF9zYW1wbGUgewotCXUzMiBzaXplOwotCWNoYXIgZGF0YVswXTsKLX07Ci0KICNkZWZpbmUgUEFUSF9TWVNfTk9ERQkiL3N5cy9kZXZpY2VzL3N5c3RlbS9ub2RlIgogCiBzdGF0aWMgdm9pZCBpbml0X2NwdW5vZGVfbWFwKHZvaWQpCkBAIC0yMDEsNyArMTk2LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHByb2Nlc3NfYWxsb2NfZXZlbnQoc3RydWN0IHJhd19ldmVudF9zYW1wbGUgKnJhdywKK3N0YXRpYyB2b2lkIHByb2Nlc3NfYWxsb2NfZXZlbnQodm9pZCAqZGF0YSwKIAkJCQlzdHJ1Y3QgZXZlbnQgKmV2ZW50LAogCQkJCWludCBjcHUsCiAJCQkJdTY0IHRpbWVzdGFtcCBfX3VzZWQsCkBAIC0yMTQsMTAgKzIwOSwxMCBAQAogCWludCBieXRlc19hbGxvYzsKIAlpbnQgbm9kZTEsIG5vZGUyOwogCi0JcHRyID0gcmF3X2ZpZWxkX3ZhbHVlKGV2ZW50LCAicHRyIiwgcmF3LT5kYXRhKTsKLQljYWxsX3NpdGUgPSByYXdfZmllbGRfdmFsdWUoZXZlbnQsICJjYWxsX3NpdGUiLCByYXctPmRhdGEpOwotCWJ5dGVzX3JlcSA9IHJhd19maWVsZF92YWx1ZShldmVudCwgImJ5dGVzX3JlcSIsIHJhdy0+ZGF0YSk7Ci0JYnl0ZXNfYWxsb2MgPSByYXdfZmllbGRfdmFsdWUoZXZlbnQsICJieXRlc19hbGxvYyIsIHJhdy0+ZGF0YSk7CisJcHRyID0gcmF3X2ZpZWxkX3ZhbHVlKGV2ZW50LCAicHRyIiwgZGF0YSk7CisJY2FsbF9zaXRlID0gcmF3X2ZpZWxkX3ZhbHVlKGV2ZW50LCAiY2FsbF9zaXRlIiwgZGF0YSk7CisJYnl0ZXNfcmVxID0gcmF3X2ZpZWxkX3ZhbHVlKGV2ZW50LCAiYnl0ZXNfcmVxIiwgZGF0YSk7CisJYnl0ZXNfYWxsb2MgPSByYXdfZmllbGRfdmFsdWUoZXZlbnQsICJieXRlc19hbGxvYyIsIGRhdGEpOwogCiAJaW5zZXJ0X2FsbG9jX3N0YXQoY2FsbF9zaXRlLCBwdHIsIGJ5dGVzX3JlcSwgYnl0ZXNfYWxsb2MsIGNwdSk7CiAJaW5zZXJ0X2NhbGxlcl9zdGF0KGNhbGxfc2l0ZSwgYnl0ZXNfcmVxLCBieXRlc19hbGxvYyk7CkBAIC0yMjcsNyArMjIyLDcgQEAKIAogCWlmIChub2RlKSB7CiAJCW5vZGUxID0gY3B1bm9kZV9tYXBbY3B1XTsKLQkJbm9kZTIgPSByYXdfZmllbGRfdmFsdWUoZXZlbnQsICJub2RlIiwgcmF3LT5kYXRhKTsKKwkJbm9kZTIgPSByYXdfZmllbGRfdmFsdWUoZXZlbnQsICJub2RlIiwgZGF0YSk7CiAJCWlmIChub2RlMSAhPSBub2RlMikKIAkJCW5yX2Nyb3NzX2FsbG9jcysrOwogCX0KQEAgLTI2Miw3ICsyNTcsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBwcm9jZXNzX2ZyZWVfZXZlbnQoc3RydWN0IHJhd19ldmVudF9zYW1wbGUgKnJhdywKK3N0YXRpYyB2b2lkIHByb2Nlc3NfZnJlZV9ldmVudCh2b2lkICpkYXRhLAogCQkJICAgICAgIHN0cnVjdCBldmVudCAqZXZlbnQsCiAJCQkgICAgICAgaW50IGNwdSwKIAkJCSAgICAgICB1NjQgdGltZXN0YW1wIF9fdXNlZCwKQEAgLTI3MSw3ICsyNjYsNyBAQAogCXVuc2lnbmVkIGxvbmcgcHRyOwogCXN0cnVjdCBhbGxvY19zdGF0ICpzX2FsbG9jLCAqc19jYWxsZXI7CiAKLQlwdHIgPSByYXdfZmllbGRfdmFsdWUoZXZlbnQsICJwdHIiLCByYXctPmRhdGEpOworCXB0ciA9IHJhd19maWVsZF92YWx1ZShldmVudCwgInB0ciIsIGRhdGEpOwogCiAJc19hbGxvYyA9IHNlYXJjaF9hbGxvY19zdGF0KHB0ciwgMCwgJnJvb3RfYWxsb2Nfc3RhdCwgcHRyX2NtcCk7CiAJaWYgKCFzX2FsbG9jKQpAQCAtMjg5LDY2ICsyODQsNTMgQEAKIH0KIAogc3RhdGljIHZvaWQKLXByb2Nlc3NfcmF3X2V2ZW50KGV2ZW50X3QgKnJhd19ldmVudCBfX3VzZWQsIHZvaWQgKm1vcmVfZGF0YSwKK3Byb2Nlc3NfcmF3X2V2ZW50KGV2ZW50X3QgKnJhd19ldmVudCBfX3VzZWQsIHZvaWQgKmRhdGEsCiAJCSAgaW50IGNwdSwgdTY0IHRpbWVzdGFtcCwgc3RydWN0IHRocmVhZCAqdGhyZWFkKQogewotCXN0cnVjdCByYXdfZXZlbnRfc2FtcGxlICpyYXcgPSBtb3JlX2RhdGE7CiAJc3RydWN0IGV2ZW50ICpldmVudDsKIAlpbnQgdHlwZTsKIAotCXR5cGUgPSB0cmFjZV9wYXJzZV9jb21tb25fdHlwZShyYXctPmRhdGEpOworCXR5cGUgPSB0cmFjZV9wYXJzZV9jb21tb25fdHlwZShkYXRhKTsKIAlldmVudCA9IHRyYWNlX2ZpbmRfZXZlbnQodHlwZSk7CiAKIAlpZiAoIXN0cmNtcChldmVudC0+bmFtZSwgImttYWxsb2MiKSB8fAogCSAgICAhc3RyY21wKGV2ZW50LT5uYW1lLCAia21lbV9jYWNoZV9hbGxvYyIpKSB7Ci0JCXByb2Nlc3NfYWxsb2NfZXZlbnQocmF3LCBldmVudCwgY3B1LCB0aW1lc3RhbXAsIHRocmVhZCwgMCk7CisJCXByb2Nlc3NfYWxsb2NfZXZlbnQoZGF0YSwgZXZlbnQsIGNwdSwgdGltZXN0YW1wLCB0aHJlYWQsIDApOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKCFzdHJjbXAoZXZlbnQtPm5hbWUsICJrbWFsbG9jX25vZGUiKSB8fAogCSAgICAhc3RyY21wKGV2ZW50LT5uYW1lLCAia21lbV9jYWNoZV9hbGxvY19ub2RlIikpIHsKLQkJcHJvY2Vzc19hbGxvY19ldmVudChyYXcsIGV2ZW50LCBjcHUsIHRpbWVzdGFtcCwgdGhyZWFkLCAxKTsKKwkJcHJvY2Vzc19hbGxvY19ldmVudChkYXRhLCBldmVudCwgY3B1LCB0aW1lc3RhbXAsIHRocmVhZCwgMSk7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAoIXN0cmNtcChldmVudC0+bmFtZSwgImtmcmVlIikgfHwKIAkgICAgIXN0cmNtcChldmVudC0+bmFtZSwgImttZW1fY2FjaGVfZnJlZSIpKSB7Ci0JCXByb2Nlc3NfZnJlZV9ldmVudChyYXcsIGV2ZW50LCBjcHUsIHRpbWVzdGFtcCwgdGhyZWFkKTsKKwkJcHJvY2Vzc19mcmVlX2V2ZW50KGRhdGEsIGV2ZW50LCBjcHUsIHRpbWVzdGFtcCwgdGhyZWFkKTsKIAkJcmV0dXJuOwogCX0KIH0KIAogc3RhdGljIGludCBwcm9jZXNzX3NhbXBsZV9ldmVudChldmVudF90ICpldmVudCkKIHsKLQl1NjQgaXAgPSBldmVudC0+aXAuaXA7Ci0JdTY0IHRpbWVzdGFtcCA9IC0xOwotCXUzMiBjcHUgPSAtMTsKLQl1NjQgcGVyaW9kID0gMTsKLQl2b2lkICptb3JlX2RhdGEgPSBldmVudC0+aXAuX19tb3JlX2RhdGE7Ci0Jc3RydWN0IHRocmVhZCAqdGhyZWFkID0gdGhyZWFkc19fZmluZG5ldyhldmVudC0+aXAucGlkKTsKKwlzdHJ1Y3Qgc2FtcGxlX2RhdGEgZGF0YTsKKwlzdHJ1Y3QgdGhyZWFkICp0aHJlYWQ7CiAKLQlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9USU1FKSB7Ci0JCXRpbWVzdGFtcCA9ICoodTY0ICopbW9yZV9kYXRhOwotCQltb3JlX2RhdGEgKz0gc2l6ZW9mKHU2NCk7Ci0JfQorCW1lbXNldCgmZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKKwlkYXRhLnRpbWUgPSAtMTsKKwlkYXRhLmNwdSA9IC0xOworCWRhdGEucGVyaW9kID0gMTsKIAotCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX0NQVSkgewotCQljcHUgPSAqKHUzMiAqKW1vcmVfZGF0YTsKLQkJbW9yZV9kYXRhICs9IHNpemVvZih1MzIpOwotCQltb3JlX2RhdGEgKz0gc2l6ZW9mKHUzMik7IC8qIHJlc2VydmVkICovCi0JfQotCi0JaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfUEVSSU9EKSB7Ci0JCXBlcmlvZCA9ICoodTY0ICopbW9yZV9kYXRhOwotCQltb3JlX2RhdGEgKz0gc2l6ZW9mKHU2NCk7Ci0JfQorCWV2ZW50X19wYXJzZV9zYW1wbGUoZXZlbnQsIHNhbXBsZV90eXBlLCAmZGF0YSk7CiAKIAlkdW1wX3ByaW50ZigiKElQLCAlZCk6ICVkLyVkOiAlcCBwZXJpb2Q6ICVMZFxuIiwKIAkJZXZlbnQtPmhlYWRlci5taXNjLAotCQlldmVudC0+aXAucGlkLCBldmVudC0+aXAudGlkLAotCQkodm9pZCAqKShsb25nKWlwLAotCQkobG9uZyBsb25nKXBlcmlvZCk7CisJCWRhdGEucGlkLCBkYXRhLnRpZCwKKwkJKHZvaWQgKikobG9uZylkYXRhLmlwLAorCQkobG9uZyBsb25nKWRhdGEucGVyaW9kKTsKIAorCXRocmVhZCA9IHRocmVhZHNfX2ZpbmRuZXcoZXZlbnQtPmlwLnBpZCk7CiAJaWYgKHRocmVhZCA9PSBOVUxMKSB7CiAJCXByX2RlYnVnKCJwcm9ibGVtIHByb2Nlc3NpbmcgJWQgZXZlbnQsIHNraXBwaW5nIGl0LlxuIiwKIAkJCSBldmVudC0+aGVhZGVyLnR5cGUpOwpAQCAtMzU3LDcgKzMzOSw4IEBACiAKIAlkdW1wX3ByaW50ZigiIC4uLiB0aHJlYWQ6ICVzOiVkXG4iLCB0aHJlYWQtPmNvbW0sIHRocmVhZC0+cGlkKTsKIAotCXByb2Nlc3NfcmF3X2V2ZW50KGV2ZW50LCBtb3JlX2RhdGEsIGNwdSwgdGltZXN0YW1wLCB0aHJlYWQpOworCXByb2Nlc3NfcmF3X2V2ZW50KGV2ZW50LCBkYXRhLnJhd19kYXRhLCBkYXRhLmNwdSwKKwkJCSAgZGF0YS50aW1lLCB0aHJlYWQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zODQsMTEgKzM2NywxOCBAQAogCiBzdGF0aWMgaW50IHJlYWRfZXZlbnRzKHZvaWQpCiB7CisJaW50IGVycjsKKwlzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uID0gcGVyZl9zZXNzaW9uX19uZXcoaW5wdXRfbmFtZSwgT19SRE9OTFksIDApOworCisJaWYgKHNlc3Npb24gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlyZWdpc3Rlcl9pZGxlX3RocmVhZCgpOwogCXJlZ2lzdGVyX3BlcmZfZmlsZV9oYW5kbGVyKCZmaWxlX2hhbmRsZXIpOwogCi0JcmV0dXJuIG1tYXBfZGlzcGF0Y2hfcGVyZl9maWxlKCZoZWFkZXIsIGlucHV0X25hbWUsIDAsIDAsCi0JCQkJICAgICAgICZldmVudF9fY3dkbGVuLCAmZXZlbnRfX2N3ZCk7CisJZXJyID0gcGVyZl9zZXNzaW9uX19wcm9jZXNzX2V2ZW50cyhzZXNzaW9uLCAwLCAmZXZlbnRfX2N3ZGxlbiwgJmV2ZW50X19jd2QpOworCXBlcmZfc2Vzc2lvbl9fZGVsZXRlKHNlc3Npb24pOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBkb3VibGUgZnJhZ21lbnRhdGlvbih1bnNpZ25lZCBsb25nIG5fcmVxLCB1bnNpZ25lZCBsb25nIG5fYWxsb2MpCkBAIC00MjAsNyArNDEwLDcgQEAKIAkJaWYgKGlzX2NhbGxlcikgewogCQkJYWRkciA9IGRhdGEtPmNhbGxfc2l0ZTsKIAkJCWlmICghcmF3X2lwKQotCQkJCXN5bSA9IHRocmVhZF9fZmluZF9mdW5jdGlvbihrdGhyZWFkLCBhZGRyLCBOVUxMKTsKKwkJCQlzeW0gPSBtYXBfZ3JvdXBzX19maW5kX2Z1bmN0aW9uKGttYXBzLCBhZGRyLCBOVUxMKTsKIAkJfSBlbHNlCiAJCQlhZGRyID0gZGF0YS0+cHRyOwogCkBAIC01NDMsNyArNTMzLDcgQEAKIH0KIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrbWVtX3VzYWdlW10gPSB7Ci0JInBlcmYga21lbSBbPG9wdGlvbnM+XSB7cmVjb3JkfSIsCisJInBlcmYga21lbSBbPG9wdGlvbnM+XSB7cmVjb3JkfHN0YXR9IiwKIAlOVUxMCiB9OwogCkBAIC03MDMsMTggKzY5MywxNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHBhcnNlX3N0YXRfb3B0KGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdCBfX3VzZWQsCi0JCQkgIGNvbnN0IGNoYXIgKmFyZywgaW50IHVuc2V0IF9fdXNlZCkKK3N0YXRpYyBpbnQgcGFyc2VfY2FsbGVyX29wdChjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHQgX191c2VkLAorCQkJICBjb25zdCBjaGFyICphcmcgX191c2VkLCBpbnQgdW5zZXQgX191c2VkKQogewotCWlmICghYXJnKQotCQlyZXR1cm4gLTE7CisJY2FsbGVyX2ZsYWcgPSAoYWxsb2NfZmxhZyArIDEpOworCXJldHVybiAwOworfQogCi0JaWYgKHN0cmNtcChhcmcsICJhbGxvYyIpID09IDApCi0JCWFsbG9jX2ZsYWcgPSAoY2FsbGVyX2ZsYWcgKyAxKTsKLQllbHNlIGlmIChzdHJjbXAoYXJnLCAiY2FsbGVyIikgPT0gMCkKLQkJY2FsbGVyX2ZsYWcgPSAoYWxsb2NfZmxhZyArIDEpOwotCWVsc2UKLQkJcmV0dXJuIC0xOworc3RhdGljIGludCBwYXJzZV9hbGxvY19vcHQoY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0IF9fdXNlZCwKKwkJCSAgY29uc3QgY2hhciAqYXJnIF9fdXNlZCwgaW50IHVuc2V0IF9fdXNlZCkKK3sKKwlhbGxvY19mbGFnID0gKGNhbGxlcl9mbGFnICsgMSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTczOSwxNCArNzI4LDE3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBrbWVtX29wdGlvbnNbXSA9IHsKIAlPUFRfU1RSSU5HKCdpJywgImlucHV0IiwgJmlucHV0X25hbWUsICJmaWxlIiwKIAkJICAgImlucHV0IGZpbGUgbmFtZSIpLAotCU9QVF9DQUxMQkFDSygwLCAic3RhdCIsIE5VTEwsICI8YWxsb2M+fDxjYWxsZXI+IiwKLQkJICAgICAic3RhdCBzZWxlY3RvciwgUGFzcyAnYWxsb2MnIG9yICdjYWxsZXInLiIsCi0JCSAgICAgcGFyc2Vfc3RhdF9vcHQpLAorCU9QVF9DQUxMQkFDS19OT09QVCgwLCAiY2FsbGVyIiwgTlVMTCwgTlVMTCwKKwkJCSAgICJzaG93IHBlci1jYWxsc2l0ZSBzdGF0aXN0aWNzIiwKKwkJCSAgIHBhcnNlX2NhbGxlcl9vcHQpLAorCU9QVF9DQUxMQkFDS19OT09QVCgwLCAiYWxsb2MiLCBOVUxMLCBOVUxMLAorCQkJICAgInNob3cgcGVyLWFsbG9jYXRpb24gc3RhdGlzdGljcyIsCisJCQkgICBwYXJzZV9hbGxvY19vcHQpLAogCU9QVF9DQUxMQkFDSygncycsICJzb3J0IiwgTlVMTCwgImtleVssa2V5Mi4uLl0iLAogCQkgICAgICJzb3J0IGJ5IGtleXM6IHB0ciwgY2FsbF9zaXRlLCBieXRlcywgaGl0LCBwaW5ncG9uZywgZnJhZyIsCiAJCSAgICAgcGFyc2Vfc29ydF9vcHQpLAogCU9QVF9DQUxMQkFDSygnbCcsICJsaW5lIiwgTlVMTCwgIm51bSIsCi0JCSAgICAgInNob3cgbiBsaW5zIiwKKwkJICAgICAic2hvdyBuIGxpbmVzIiwKIAkJICAgICBwYXJzZV9saW5lX29wdCksCiAJT1BUX0JPT0xFQU4oMCwgInJhdy1pcCIsICZyYXdfaXAsICJzaG93IHJhdyBpcCBpbnN0ZWFkIG9mIHN5bWJvbCIpLAogCU9QVF9FTkQoKQpAQCAtNzkwLDE4ICs3ODIsMjIgQEAKIAogCWFyZ2MgPSBwYXJzZV9vcHRpb25zKGFyZ2MsIGFyZ3YsIGttZW1fb3B0aW9ucywga21lbV91c2FnZSwgMCk7CiAKLQlpZiAoYXJnYyAmJiAhc3RybmNtcChhcmd2WzBdLCAicmVjIiwgMykpCi0JCXJldHVybiBfX2NtZF9yZWNvcmQoYXJnYywgYXJndik7Ci0JZWxzZSBpZiAoYXJnYykKKwlpZiAoIWFyZ2MpCiAJCXVzYWdlX3dpdGhfb3B0aW9ucyhrbWVtX3VzYWdlLCBrbWVtX29wdGlvbnMpOwogCi0JaWYgKGxpc3RfZW1wdHkoJmNhbGxlcl9zb3J0KSkKLQkJc2V0dXBfc29ydGluZygmY2FsbGVyX3NvcnQsIGRlZmF1bHRfc29ydF9vcmRlcik7Ci0JaWYgKGxpc3RfZW1wdHkoJmFsbG9jX3NvcnQpKQotCQlzZXR1cF9zb3J0aW5nKCZhbGxvY19zb3J0LCBkZWZhdWx0X3NvcnRfb3JkZXIpOworCWlmICghc3RybmNtcChhcmd2WzBdLCAicmVjIiwgMykpIHsKKwkJcmV0dXJuIF9fY21kX3JlY29yZChhcmdjLCBhcmd2KTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlswXSwgInN0YXQiKSkgeworCQlzZXR1cF9jcHVub2RlX21hcCgpOwogCi0Jc2V0dXBfY3B1bm9kZV9tYXAoKTsKKwkJaWYgKGxpc3RfZW1wdHkoJmNhbGxlcl9zb3J0KSkKKwkJCXNldHVwX3NvcnRpbmcoJmNhbGxlcl9zb3J0LCBkZWZhdWx0X3NvcnRfb3JkZXIpOworCQlpZiAobGlzdF9lbXB0eSgmYWxsb2Nfc29ydCkpCisJCQlzZXR1cF9zb3J0aW5nKCZhbGxvY19zb3J0LCBkZWZhdWx0X3NvcnRfb3JkZXIpOwogCi0JcmV0dXJuIF9fY21kX2ttZW0oKTsKKwkJcmV0dXJuIF9fY21kX2ttZW0oKTsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXByb2JlLmMgYi90b29scy9wZXJmL2J1aWx0aW4tcHJvYmUuYwppbmRleCBhNThlMTFiLi41YTQ3YzFlIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tcHJvYmUuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tcHJvYmUuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgInBlcmYuaCIKICNpbmNsdWRlICJidWlsdGluLmgiCiAjaW5jbHVkZSAidXRpbC91dGlsLmgiCisjaW5jbHVkZSAidXRpbC9zdHJsaXN0LmgiCiAjaW5jbHVkZSAidXRpbC9ldmVudC5oIgogI2luY2x1ZGUgInV0aWwvZGVidWcuaCIKICNpbmNsdWRlICJ1dGlsL3BhcnNlLW9wdGlvbnMuaCIKQEAgLTQzLDExICs0NCwxMiBAQAogI2luY2x1ZGUgInV0aWwvcHJvYmUtZXZlbnQuaCIKIAogLyogRGVmYXVsdCB2bWxpbnV4IHNlYXJjaCBwYXRocyAqLwotI2RlZmluZSBOUl9TRUFSQ0hfUEFUSCAzCisjZGVmaW5lIE5SX1NFQVJDSF9QQVRIIDQKIGNvbnN0IGNoYXIgKmRlZmF1bHRfc2VhcmNoX3BhdGhbTlJfU0VBUkNIX1BBVEhdID0gewogIi9saWIvbW9kdWxlcy8lcy9idWlsZC92bWxpbnV4IiwJCS8qIEN1c3RvbSBidWlsZCBrZXJuZWwgKi8KICIvdXNyL2xpYi9kZWJ1Zy9saWIvbW9kdWxlcy8lcy92bWxpbnV4IiwJLyogUmVkIEhhdCBkZWJ1Z2luZm8gKi8KICIvYm9vdC92bWxpbnV4LWRlYnVnLSVzIiwJCQkvKiBVYnVudHUgKi8KKyIuL3ZtbGludXgiLAkJCQkJLyogQ1dEICovCiB9OwogCiAjZGVmaW5lIE1BWF9QQVRIX0xFTiAyNTYKQEAgLTYwLDYgKzYyLDcgQEAKIAlpbnQgbmVlZF9kd2FyZjsKIAlpbnQgbnJfcHJvYmU7CiAJc3RydWN0IHByb2JlX3BvaW50IHByb2Jlc1tNQVhfUFJPQkVTXTsKKwlzdHJ1Y3Qgc3RybGlzdCAqZGVsbGlzdDsKIH0gc2Vzc2lvbjsKIAogc3RhdGljIGJvb2wgbGlzdGluZzsKQEAgLTc5LDYgKzgyLDI1IEBACiAJcHJfZGVidWcoIiVkIGFyZ3VtZW50c1xuIiwgcHAtPm5yX2FyZ3MpOwogfQogCitzdGF0aWMgdm9pZCBwYXJzZV9wcm9iZV9ldmVudF9hcmd2KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwlpbnQgaSwgbGVuOworCWNoYXIgKmJ1ZjsKKworCS8qIEJpbmQgdXAgcmVzdCBhcmd1bWVudHMgKi8KKwlsZW4gPSAwOworCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspCisJCWxlbiArPSBzdHJsZW4oYXJndltpXSkgKyAxOworCWJ1ZiA9IHphbGxvYyhsZW4gKyAxKTsKKwlpZiAoIWJ1ZikKKwkJZGllKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBiaW5kaW5nIGFyZ3VtZW50cy4iKTsKKwlsZW4gPSAwOworCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspCisJCWxlbiArPSBzcHJpbnRmKCZidWZbbGVuXSwgIiVzICIsIGFyZ3ZbaV0pOworCXBhcnNlX3Byb2JlX2V2ZW50KGJ1Zik7CisJZnJlZShidWYpOworfQorCiBzdGF0aWMgaW50IG9wdF9hZGRfcHJvYmVfZXZlbnQoY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0IF9fdXNlZCwKIAkJCSAgICAgIGNvbnN0IGNoYXIgKnN0ciwgaW50IHVuc2V0IF9fdXNlZCkKIHsKQEAgLTg3LDYgKzEwOSwxNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG9wdF9kZWxfcHJvYmVfZXZlbnQoY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0IF9fdXNlZCwKKwkJCSAgICAgICBjb25zdCBjaGFyICpzdHIsIGludCB1bnNldCBfX3VzZWQpCit7CisJaWYgKHN0cikgeworCQlpZiAoIXNlc3Npb24uZGVsbGlzdCkKKwkJCXNlc3Npb24uZGVsbGlzdCA9IHN0cmxpc3RfX25ldyh0cnVlLCBOVUxMKTsKKwkJc3RybGlzdF9fYWRkKHNlc3Npb24uZGVsbGlzdCwgc3RyKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKICNpZm5kZWYgTk9fTElCRFdBUkYKIHN0YXRpYyBpbnQgb3Blbl9kZWZhdWx0X3ZtbGludXgodm9pZCkKIHsKQEAgLTEyMSw2ICsxNTQsNyBAQAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcm9iZV91c2FnZVtdID0gewogCSJwZXJmIHByb2JlIFs8b3B0aW9ucz5dICdQUk9CRURFRicgWydQUk9CRURFRicgLi4uXSIsCiAJInBlcmYgcHJvYmUgWzxvcHRpb25zPl0gLS1hZGQgJ1BST0JFREVGJyBbLS1hZGQgJ1BST0JFREVGJyAuLi5dIiwKKwkicGVyZiBwcm9iZSBbPG9wdGlvbnM+XSAtLWRlbCAnW0dST1VQOl1FVkVOVCcgLi4uIiwKIAkicGVyZiBwcm9iZSAtLWxpc3QiLAogCU5VTEwKIH07CkBAIC0xMzIsNyArMTY2LDkgQEAKIAlPUFRfU1RSSU5HKCdrJywgInZtbGludXgiLCAmc2Vzc2lvbi52bWxpbnV4LCAiZmlsZSIsCiAJCSJ2bWxpbnV4L21vZHVsZSBwYXRobmFtZSIpLAogI2VuZGlmCi0JT1BUX0JPT0xFQU4oJ2wnLCAibGlzdCIsICZsaXN0aW5nLCAibGlzdCB1cCBjdXJyZW50IHByb2JlcyIpLAorCU9QVF9CT09MRUFOKCdsJywgImxpc3QiLCAmbGlzdGluZywgImxpc3QgdXAgY3VycmVudCBwcm9iZSBldmVudHMiKSwKKwlPUFRfQ0FMTEJBQ0soJ2QnLCAiZGVsIiwgTlVMTCwgIltHUk9VUDpdRVZFTlQiLCAiZGVsZXRlIGEgcHJvYmUgZXZlbnQuIiwKKwkJb3B0X2RlbF9wcm9iZV9ldmVudCksCiAJT1BUX0NBTExCQUNLKCdhJywgImFkZCIsIE5VTEwsCiAjaWZkZWYgTk9fTElCRFdBUkYKIAkJIkZVTkNbK09GRlN8JXJldHVybl0gW0FSRyAuLi5dIiwKQEAgLTE2MCw3ICsxOTYsNyBAQAogCiBpbnQgY21kX3Byb2JlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4IF9fdXNlZCkKIHsKLQlpbnQgaSwgaiwgcmV0OworCWludCBpLCByZXQ7CiAjaWZuZGVmIE5PX0xJQkRXQVJGCiAJaW50IGZkOwogI2VuZGlmCkBAIC0xNjgsNDAgKzIwNCw1MiBAQAogCiAJYXJnYyA9IHBhcnNlX29wdGlvbnMoYXJnYywgYXJndiwgb3B0aW9ucywgcHJvYmVfdXNhZ2UsCiAJCQkgICAgIFBBUlNFX09QVF9TVE9QX0FUX05PTl9PUFRJT04pOwotCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspCi0JCXBhcnNlX3Byb2JlX2V2ZW50KGFyZ3ZbaV0pOworCWlmIChhcmdjID4gMCkKKwkJcGFyc2VfcHJvYmVfZXZlbnRfYXJndihhcmdjLCBhcmd2KTsKIAotCWlmICgoc2Vzc2lvbi5ucl9wcm9iZSA9PSAwICYmICFsaXN0aW5nKSB8fAotCSAgICAoc2Vzc2lvbi5ucl9wcm9iZSAhPSAwICYmIGxpc3RpbmcpKQorCWlmICgoc2Vzc2lvbi5ucl9wcm9iZSA9PSAwICYmICFzZXNzaW9uLmRlbGxpc3QgJiYgIWxpc3RpbmcpKQogCQl1c2FnZV93aXRoX29wdGlvbnMocHJvYmVfdXNhZ2UsIG9wdGlvbnMpOwogCiAJaWYgKGxpc3RpbmcpIHsKKwkJaWYgKHNlc3Npb24ubnJfcHJvYmUgIT0gMCB8fCBzZXNzaW9uLmRlbGxpc3QpIHsKKwkJCXByX3dhcm5pbmcoIiAgRXJyb3I6IERvbid0IHVzZSAtLWxpc3Qgd2l0aCIKKwkJCQkgICAiIC0tYWRkLy0tZGVsLlxuIik7CisJCQl1c2FnZV93aXRoX29wdGlvbnMocHJvYmVfdXNhZ2UsIG9wdGlvbnMpOworCQl9CiAJCXNob3dfcGVyZl9wcm9iZV9ldmVudHMoKTsKIAkJcmV0dXJuIDA7CiAJfQogCisJaWYgKHNlc3Npb24uZGVsbGlzdCkgeworCQlkZWxfdHJhY2Vfa3Byb2JlX2V2ZW50cyhzZXNzaW9uLmRlbGxpc3QpOworCQlzdHJsaXN0X19kZWxldGUoc2Vzc2lvbi5kZWxsaXN0KTsKKwkJaWYgKHNlc3Npb24ubnJfcHJvYmUgPT0gMCkKKwkJCXJldHVybiAwOworCX0KKwogCWlmIChzZXNzaW9uLm5lZWRfZHdhcmYpCiAjaWZkZWYgTk9fTElCRFdBUkYKIAkJZGllKCJEZWJ1Z2luZm8tYW5hbHlzaXMgaXMgbm90IHN1cHBvcnRlZCIpOwogI2Vsc2UJLyogIU5PX0xJQkRXQVJGICovCiAJCXByX2RlYnVnKCJTb21lIHByb2JlcyByZXF1aXJlIGRlYnVnaW5mby5cbiIpOwogCi0JaWYgKHNlc3Npb24udm1saW51eCkKKwlpZiAoc2Vzc2lvbi52bWxpbnV4KSB7CisJCXByX2RlYnVnKCJUcnkgdG8gb3BlbiAlcy4iLCBzZXNzaW9uLnZtbGludXgpOwogCQlmZCA9IG9wZW4oc2Vzc2lvbi52bWxpbnV4LCBPX1JET05MWSk7Ci0JZWxzZQorCX0gZWxzZQogCQlmZCA9IG9wZW5fZGVmYXVsdF92bWxpbnV4KCk7CiAJaWYgKGZkIDwgMCkgewogCQlpZiAoc2Vzc2lvbi5uZWVkX2R3YXJmKQotCQkJZGllKCJDb3VsZCBub3Qgb3BlbiB2bWxpbnV4L21vZHVsZSBmaWxlLiIpOworCQkJZGllKCJDb3VsZCBub3Qgb3BlbiBkZWJ1Z2luZm8gZmlsZS4iKTsKIAotCQlwcl93YXJuaW5nKCJDb3VsZCBub3Qgb3BlbiB2bWxpbnV4L21vZHVsZSBmaWxlLiIKLQkJCSAgICIgVHJ5IHRvIHVzZSBzeW1ib2xzLlxuIik7CisJCXByX2RlYnVnKCJDb3VsZCBub3Qgb3BlbiB2bWxpbnV4L21vZHVsZSBmaWxlLiIKKwkJCSAiIFRyeSB0byB1c2Ugc3ltYm9scy5cbiIpOwogCQlnb3RvIGVuZF9kd2FyZjsKIAl9CiAKIAkvKiBTZWFyY2hpbmcgcHJvYmUgcG9pbnRzICovCi0JZm9yIChqID0gMDsgaiA8IHNlc3Npb24ubnJfcHJvYmU7IGorKykgewotCQlwcCA9ICZzZXNzaW9uLnByb2Jlc1tqXTsKKwlmb3IgKGkgPSAwOyBpIDwgc2Vzc2lvbi5ucl9wcm9iZTsgaSsrKSB7CisJCXBwID0gJnNlc3Npb24ucHJvYmVzW2ldOwogCQlpZiAocHAtPmZvdW5kKQogCQkJY29udGludWU7CiAKQEAgLTIyMyw4ICsyNzEsOCBAQAogI2VuZGlmIC8qICFOT19MSUJEV0FSRiAqLwogCiAJLyogU3ludGhlc2l6ZSBwcm9iZXMgd2l0aG91dCBkd2FyZiAqLwotCWZvciAoaiA9IDA7IGogPCBzZXNzaW9uLm5yX3Byb2JlOyBqKyspIHsKLQkJcHAgPSAmc2Vzc2lvbi5wcm9iZXNbal07CisJZm9yIChpID0gMDsgaSA8IHNlc3Npb24ubnJfcHJvYmU7IGkrKykgeworCQlwcCA9ICZzZXNzaW9uLnByb2Jlc1tpXTsKIAkJaWYgKHBwLT5mb3VuZCkJLyogVGhpcyBwcm9iZSBpcyBhbHJlYWR5IGZvdW5kLiAqLwogCQkJY29udGludWU7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZWNvcmQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZWNvcmQuYwppbmRleCAwZTUxOWM2Li40ZGVjYmQxIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tcmVjb3JkLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSAidXRpbC9oZWFkZXIuaCIKICNpbmNsdWRlICJ1dGlsL2V2ZW50LmgiCiAjaW5jbHVkZSAidXRpbC9kZWJ1Zy5oIgorI2luY2x1ZGUgInV0aWwvc2Vzc2lvbi5oIgogI2luY2x1ZGUgInV0aWwvc3ltYm9sLmgiCiAKICNpbmNsdWRlIDx1bmlzdGQuaD4KQEAgLTYyLDcgKzYzLDcgQEAKIAogc3RhdGljIGludAkJCWZpbGVfbmV3CQkJPSAgICAgIDE7CiAKLXN0cnVjdCBwZXJmX2hlYWRlcgkJKmhlYWRlcgkJCQk9ICAgTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgcGVyZl9zZXNzaW9uCSpzZXNzaW9uOwogCiBzdHJ1Y3QgbW1hcF9kYXRhIHsKIAlpbnQJCQljb3VudGVyOwpAQCAtMjE2LDEyICsyMTcsMTIgQEAKIHsKIAlzdHJ1Y3QgcGVyZl9oZWFkZXJfYXR0ciAqaF9hdHRyOwogCi0JaWYgKG5yIDwgaGVhZGVyLT5hdHRycykgewotCQloX2F0dHIgPSBoZWFkZXItPmF0dHJbbnJdOworCWlmIChuciA8IHNlc3Npb24tPmhlYWRlci5hdHRycykgeworCQloX2F0dHIgPSBzZXNzaW9uLT5oZWFkZXIuYXR0cltucl07CiAJfSBlbHNlIHsKIAkJaF9hdHRyID0gcGVyZl9oZWFkZXJfYXR0cl9fbmV3KGEpOwogCQlpZiAoaF9hdHRyICE9IE5VTEwpCi0JCQlpZiAocGVyZl9oZWFkZXJfX2FkZF9hdHRyKGhlYWRlciwgaF9hdHRyKSA8IDApIHsKKwkJCWlmIChwZXJmX2hlYWRlcl9fYWRkX2F0dHIoJnNlc3Npb24tPmhlYWRlciwgaF9hdHRyKSA8IDApIHsKIAkJCQlwZXJmX2hlYWRlcl9hdHRyX19kZWxldGUoaF9hdHRyKTsKIAkJCQloX2F0dHIgPSBOVUxMOwogCQkJfQpAQCAtMzk1LDkgKzM5Niw5IEBACiAKIHN0YXRpYyB2b2lkIGF0ZXhpdF9oZWFkZXIodm9pZCkKIHsKLQloZWFkZXItPmRhdGFfc2l6ZSArPSBieXRlc193cml0dGVuOworCXNlc3Npb24tPmhlYWRlci5kYXRhX3NpemUgKz0gYnl0ZXNfd3JpdHRlbjsKIAotCXBlcmZfaGVhZGVyX193cml0ZShoZWFkZXIsIG91dHB1dCwgdHJ1ZSk7CisJcGVyZl9oZWFkZXJfX3dyaXRlKCZzZXNzaW9uLT5oZWFkZXIsIG91dHB1dCwgdHJ1ZSk7CiB9CiAKIHN0YXRpYyBpbnQgX19jbWRfcmVjb3JkKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKQEAgLTQ0MCwyNCArNDQxLDI0IEBACiAJCWV4aXQoLTEpOwogCX0KIAotCWhlYWRlciA9IHBlcmZfaGVhZGVyX19uZXcoKTsKLQlpZiAoaGVhZGVyID09IE5VTEwpIHsKKwlzZXNzaW9uID0gcGVyZl9zZXNzaW9uX19uZXcob3V0cHV0X25hbWUsIE9fV1JPTkxZLCBmb3JjZSk7CisJaWYgKHNlc3Npb24gPT0gTlVMTCkgewogCQlwcl9lcnIoIk5vdCBlbm91Z2ggbWVtb3J5IGZvciByZWFkaW5nIHBlcmYgZmlsZSBoZWFkZXJcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYgKCFmaWxlX25ldykgewotCQllcnIgPSBwZXJmX2hlYWRlcl9fcmVhZChoZWFkZXIsIG91dHB1dCk7CisJCWVyciA9IHBlcmZfaGVhZGVyX19yZWFkKCZzZXNzaW9uLT5oZWFkZXIsIG91dHB1dCk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAl9CiAKIAlpZiAocmF3X3NhbXBsZXMpIHsKLQkJcGVyZl9oZWFkZXJfX3NldF9mZWF0KGhlYWRlciwgSEVBREVSX1RSQUNFX0lORk8pOworCQlwZXJmX2hlYWRlcl9fc2V0X2ZlYXQoJnNlc3Npb24tPmhlYWRlciwgSEVBREVSX1RSQUNFX0lORk8pOwogCX0gZWxzZSB7CiAJCWZvciAoaSA9IDA7IGkgPCBucl9jb3VudGVyczsgaSsrKSB7CiAJCQlpZiAoYXR0cnNbaV0uc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9SQVcpIHsKLQkJCQlwZXJmX2hlYWRlcl9fc2V0X2ZlYXQoaGVhZGVyLCBIRUFERVJfVFJBQ0VfSU5GTyk7CisJCQkJcGVyZl9oZWFkZXJfX3NldF9mZWF0KCZzZXNzaW9uLT5oZWFkZXIsIEhFQURFUl9UUkFDRV9JTkZPKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtNDgxLDcgKzQ4Miw3IEBACiAJfQogCiAJaWYgKGZpbGVfbmV3KSB7Ci0JCWVyciA9IHBlcmZfaGVhZGVyX193cml0ZShoZWFkZXIsIG91dHB1dCwgZmFsc2UpOworCQllcnIgPSBwZXJmX2hlYWRlcl9fd3JpdGUoJnNlc3Npb24tPmhlYWRlciwgb3V0cHV0LCBmYWxzZSk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAl9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tcmVwb3J0LmMgYi90b29scy9wZXJmL2J1aWx0aW4tcmVwb3J0LmMKaW5kZXggMzgzYzRhYi4uZTJlYzQ5YSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLXJlcG9ydC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZXBvcnQuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgInBlcmYuaCIKICNpbmNsdWRlICJ1dGlsL2RlYnVnLmgiCiAjaW5jbHVkZSAidXRpbC9oZWFkZXIuaCIKKyNpbmNsdWRlICJ1dGlsL3Nlc3Npb24uaCIKIAogI2luY2x1ZGUgInV0aWwvcGFyc2Utb3B0aW9ucy5oIgogI2luY2x1ZGUgInV0aWwvcGFyc2UtZXZlbnRzLmgiCkBAIC01Miw3ICs1Myw3IEBACiAKIHN0YXRpYyBjaGFyCQljYWxsY2hhaW5fZGVmYXVsdF9vcHRbXSA9ICJmcmFjdGFsLDAuNSI7CiAKLXN0YXRpYyBzdHJ1Y3QgcGVyZl9oZWFkZXIgKmhlYWRlcjsKK3N0YXRpYyBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uOwogCiBzdGF0aWMgdTY0CQlzYW1wbGVfdHlwZTsKIApAQCAtNjA1LDQ0ICs2MDYsNDEgQEAKIAogc3RhdGljIGludCBwcm9jZXNzX3NhbXBsZV9ldmVudChldmVudF90ICpldmVudCkKIHsKLQl1NjQgaXAgPSBldmVudC0+aXAuaXA7Ci0JdTY0IHBlcmlvZCA9IDE7Ci0Jdm9pZCAqbW9yZV9kYXRhID0gZXZlbnQtPmlwLl9fbW9yZV9kYXRhOwotCXN0cnVjdCBpcF9jYWxsY2hhaW4gKmNoYWluID0gTlVMTDsKKwlzdHJ1Y3Qgc2FtcGxlX2RhdGEgZGF0YTsKIAlpbnQgY3B1bW9kZTsKIAlzdHJ1Y3QgYWRkcl9sb2NhdGlvbiBhbDsKLQlzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgPSB0aHJlYWRzX19maW5kbmV3KGV2ZW50LT5pcC5waWQpOworCXN0cnVjdCB0aHJlYWQgKnRocmVhZDsKIAotCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1BFUklPRCkgewotCQlwZXJpb2QgPSAqKHU2NCAqKW1vcmVfZGF0YTsKLQkJbW9yZV9kYXRhICs9IHNpemVvZih1NjQpOwotCX0KKwltZW1zZXQoJmRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisJZGF0YS5wZXJpb2QgPSAxOworCisJZXZlbnRfX3BhcnNlX3NhbXBsZShldmVudCwgc2FtcGxlX3R5cGUsICZkYXRhKTsKIAogCWR1bXBfcHJpbnRmKCIoSVAsICVkKTogJWQvJWQ6ICVwIHBlcmlvZDogJUxkXG4iLAogCQlldmVudC0+aGVhZGVyLm1pc2MsCi0JCWV2ZW50LT5pcC5waWQsIGV2ZW50LT5pcC50aWQsCi0JCSh2b2lkICopKGxvbmcpaXAsCi0JCShsb25nIGxvbmcpcGVyaW9kKTsKKwkJZGF0YS5waWQsIGRhdGEudGlkLAorCQkodm9pZCAqKShsb25nKWRhdGEuaXAsCisJCShsb25nIGxvbmcpZGF0YS5wZXJpb2QpOwogCiAJaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfQ0FMTENIQUlOKSB7CiAJCXVuc2lnbmVkIGludCBpOwogCi0JCWNoYWluID0gKHZvaWQgKiltb3JlX2RhdGE7CisJCWR1bXBfcHJpbnRmKCIuLi4gY2hhaW46IG5yOiVMdVxuIiwgZGF0YS5jYWxsY2hhaW4tPm5yKTsKIAotCQlkdW1wX3ByaW50ZigiLi4uIGNoYWluOiBucjolTHVcbiIsIGNoYWluLT5ucik7Ci0KLQkJaWYgKHZhbGlkYXRlX2NoYWluKGNoYWluLCBldmVudCkgPCAwKSB7CisJCWlmICh2YWxpZGF0ZV9jaGFpbihkYXRhLmNhbGxjaGFpbiwgZXZlbnQpIDwgMCkgewogCQkJcHJfZGVidWcoImNhbGwtY2hhaW4gcHJvYmxlbSB3aXRoIGV2ZW50LCAiCiAJCQkJICJza2lwcGluZyBpdC5cbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAogCQlpZiAoZHVtcF90cmFjZSkgewotCQkJZm9yIChpID0gMDsgaSA8IGNoYWluLT5ucjsgaSsrKQotCQkJCWR1bXBfcHJpbnRmKCIuLi4uLiAlMmQ6ICUwMTZMeFxuIiwgaSwgY2hhaW4tPmlwc1tpXSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgZGF0YS5jYWxsY2hhaW4tPm5yOyBpKyspCisJCQkJZHVtcF9wcmludGYoIi4uLi4uICUyZDogJTAxNkx4XG4iLAorCQkJCQkgICAgaSwgZGF0YS5jYWxsY2hhaW4tPmlwc1tpXSk7CiAJCX0KIAl9CiAKKwl0aHJlYWQgPSB0aHJlYWRzX19maW5kbmV3KGRhdGEucGlkKTsKIAlpZiAodGhyZWFkID09IE5VTEwpIHsKIAkJcHJfZGVidWcoInByb2JsZW0gcHJvY2Vzc2luZyAlZCBldmVudCwgc2tpcHBpbmcgaXQuXG4iLAogCQkJZXZlbnQtPmhlYWRlci50eXBlKTsKQEAgLTY1Nyw3ICs2NTUsNyBAQAogCWNwdW1vZGUgPSBldmVudC0+aGVhZGVyLm1pc2MgJiBQRVJGX1JFQ09SRF9NSVNDX0NQVU1PREVfTUFTSzsKIAogCXRocmVhZF9fZmluZF9hZGRyX2xvY2F0aW9uKHRocmVhZCwgY3B1bW9kZSwKLQkJCQkgICBNQVBfX0ZVTkNUSU9OLCBpcCwgJmFsLCBOVUxMKTsKKwkJCQkgICBNQVBfX0ZVTkNUSU9OLCBkYXRhLmlwLCAmYWwsIE5VTEwpOwogCS8qCiAJICogV2UgaGF2ZSB0byBkbyB0aGlzIGhlcmUgYXMgd2UgbWF5IGhhdmUgYSBkc28gd2l0aCBubyBzeW1ib2wgaGl0IHRoYXQKIAkgKiBoYXMgYSBuYW1lIGxvbmdlciB0aGFuIHRoZSBvbmVzIHdpdGggc3ltYm9scyBzYW1wbGVkLgpAQCAtNjc1LDEyICs2NzMsMTIgQEAKIAlpZiAoc3ltX2xpc3QgJiYgYWwuc3ltICYmICFzdHJsaXN0X19oYXNfZW50cnkoc3ltX2xpc3QsIGFsLnN5bS0+bmFtZSkpCiAJCXJldHVybiAwOwogCi0JaWYgKGhpc3RfZW50cnlfX2FkZCgmYWwsIGNoYWluLCBwZXJpb2QpKSB7CisJaWYgKGhpc3RfZW50cnlfX2FkZCgmYWwsIGRhdGEuY2FsbGNoYWluLCBkYXRhLnBlcmlvZCkpIHsKIAkJcHJfZGVidWcoInByb2JsZW0gaW5jcmVtZW50aW5nIHN5bWJvbCBjb3VudCwgc2tpcHBpbmcgZXZlbnRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JZXZlbnRfX3N0YXRzLnRvdGFsICs9IHBlcmlvZDsKKwlldmVudF9fc3RhdHMudG90YWwgKz0gZGF0YS5wZXJpb2Q7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTcwNCw3ICs3MDIsNyBAQAogewogCXN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHI7CiAKLQlhdHRyID0gcGVyZl9oZWFkZXJfX2ZpbmRfYXR0cihldmVudC0+cmVhZC5pZCwgaGVhZGVyKTsKKwlhdHRyID0gcGVyZl9oZWFkZXJfX2ZpbmRfYXR0cihldmVudC0+cmVhZC5pZCwgJnNlc3Npb24tPmhlYWRlcik7CiAKIAlpZiAoc2hvd190aHJlYWRzKSB7CiAJCWNvbnN0IGNoYXIgKm5hbWUgPSBhdHRyID8gX19ldmVudF9uYW1lKGF0dHItPnR5cGUsIGF0dHItPmNvbmZpZykKQEAgLTc2OSw2ICs3NjcsMTAgQEAKIAlzdHJ1Y3QgdGhyZWFkICppZGxlOwogCWludCByZXQ7CiAKKwlzZXNzaW9uID0gcGVyZl9zZXNzaW9uX19uZXcoaW5wdXRfbmFtZSwgT19SRE9OTFksIGZvcmNlKTsKKwlpZiAoc2Vzc2lvbiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCWlkbGUgPSByZWdpc3Rlcl9pZGxlX3RocmVhZCgpOwogCXRocmVhZF9fY29tbV9hZGp1c3QoaWRsZSk7CiAKQEAgLTc3NywxNCArNzc5LDE0IEBACiAKIAlyZWdpc3Rlcl9wZXJmX2ZpbGVfaGFuZGxlcigmZmlsZV9oYW5kbGVyKTsKIAotCXJldCA9IG1tYXBfZGlzcGF0Y2hfcGVyZl9maWxlKCZoZWFkZXIsIGlucHV0X25hbWUsIGZvcmNlLAotCQkJCSAgICAgIGZ1bGxfcGF0aHMsICZldmVudF9fY3dkbGVuLCAmZXZlbnRfX2N3ZCk7CisJcmV0ID0gcGVyZl9zZXNzaW9uX19wcm9jZXNzX2V2ZW50cyhzZXNzaW9uLCBmdWxsX3BhdGhzLAorCQkJCQkgICAmZXZlbnRfX2N3ZGxlbiwgJmV2ZW50X19jd2QpOwogCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJCWdvdG8gb3V0X2RlbGV0ZTsKIAogCWlmIChkdW1wX3RyYWNlKSB7CiAJCWV2ZW50X19wcmludF90b3RhbHMoKTsKLQkJcmV0dXJuIDA7CisJCWdvdG8gb3V0X2RlbGV0ZTsKIAl9CiAKIAlpZiAodmVyYm9zZSA+IDMpCkBAIC03OTksNyArODAxLDggQEAKIAogCWlmIChzaG93X3RocmVhZHMpCiAJCXBlcmZfcmVhZF92YWx1ZXNfZGVzdHJveSgmc2hvd190aHJlYWRzX3ZhbHVlcyk7Ci0KK291dF9kZWxldGU6CisJcGVyZl9zZXNzaW9uX19kZWxldGUoc2Vzc2lvbik7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXNjaGVkLmMgYi90b29scy9wZXJmL2J1aWx0aW4tc2NoZWQuYwppbmRleCAyNmI3ODJmLi42NTAyMWZlIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tc2NoZWQuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tc2NoZWQuYwpAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlICJ1dGlsL3N5bWJvbC5oIgogI2luY2x1ZGUgInV0aWwvdGhyZWFkLmgiCiAjaW5jbHVkZSAidXRpbC9oZWFkZXIuaCIKKyNpbmNsdWRlICJ1dGlsL3Nlc3Npb24uaCIKIAogI2luY2x1ZGUgInV0aWwvcGFyc2Utb3B0aW9ucy5oIgogI2luY2x1ZGUgInV0aWwvdHJhY2UtZXZlbnQuaCIKQEAgLTEzLDcgKzE0LDYgQEAKICNpbmNsdWRlICJ1dGlsL2RlYnVnLmgiCiAjaW5jbHVkZSAidXRpbC9kYXRhX21hcC5oIgogCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CiAKICNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KQEAgLTIyLDcgKzIyLDYgQEAKIAogc3RhdGljIGNoYXIJCQljb25zdCAqaW5wdXRfbmFtZSA9ICJwZXJmLmRhdGEiOwogCi1zdGF0aWMgc3RydWN0IHBlcmZfaGVhZGVyCSpoZWFkZXI7CiBzdGF0aWMgdTY0CQkJc2FtcGxlX3R5cGU7CiAKIHN0YXRpYyBjaGFyCQkJZGVmYXVsdF9zb3J0X29yZGVyW10gPSAiYXZnLCBtYXgsIHN3aXRjaCwgcnVudGltZSI7CkBAIC0xNDEsNiArMTQwLDcgQEAKIAlzdHJ1Y3QgdGhyZWFkCQkqdGhyZWFkOwogCXN0cnVjdCByYl9ub2RlCQlub2RlOwogCXU2NAkJCW1heF9sYXQ7CisJdTY0CQkJbWF4X2xhdF9hdDsKIAl1NjQJCQl0b3RhbF9sYXQ7CiAJdTY0CQkJbmJfYXRvbXM7CiAJdTY0CQkJdG90YWxfcnVudGltZTsKQEAgLTQxNCwzNCArNDE0LDMzIEBACiAJcmV0dXJuIHN1bTsKIH0KIAotc3RhdGljIHU2NCBnZXRfY3B1X3VzYWdlX25zZWNfc2VsZih2b2lkKQorc3RhdGljIGludCBzZWxmX29wZW5fY291bnRlcnModm9pZCkKIHsKLQljaGFyIGZpbGVuYW1lIFtdID0gIi9wcm9jLzEyMzQ1Njc4OTAvc2NoZWQiOwotCXVuc2lnbmVkIGxvbmcgbXNlY3MsIG5zZWNzOwotCWNoYXIgKmxpbmUgPSBOVUxMOwotCXU2NCB0b3RhbCA9IDA7Ci0Jc2l6ZV90IGxlbiA9IDA7Ci0Jc3NpemVfdCBjaGFyczsKLQlGSUxFICpmaWxlOworCXN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgYXR0cjsKKwlpbnQgZmQ7CisKKwltZW1zZXQoJmF0dHIsIDAsIHNpemVvZihhdHRyKSk7CisKKwlhdHRyLnR5cGUgPSBQRVJGX1RZUEVfU09GVFdBUkU7CisJYXR0ci5jb25maWcgPSBQRVJGX0NPVU5UX1NXX1RBU0tfQ0xPQ0s7CisKKwlmZCA9IHN5c19wZXJmX2V2ZW50X29wZW4oJmF0dHIsIDAsIC0xLCAtMSwgMCk7CisKKwlpZiAoZmQgPCAwKQorCQlkaWUoIkVycm9yOiBzeXNfcGVyZl9ldmVudF9vcGVuKCkgc3lzY2FsbCByZXR1cm5lZCIKKwkJICAgICJ3aXRoICVkICglcylcbiIsIGZkLCBzdHJlcnJvcihlcnJubykpOworCXJldHVybiBmZDsKK30KKworc3RhdGljIHU2NCBnZXRfY3B1X3VzYWdlX25zZWNfc2VsZihpbnQgZmQpCit7CisJdTY0IHJ1bnRpbWU7CiAJaW50IHJldDsKIAotCXNwcmludGYoZmlsZW5hbWUsICIvcHJvYy8lZC9zY2hlZCIsIGdldHBpZCgpKTsKLQlmaWxlID0gZm9wZW4oZmlsZW5hbWUsICJyIik7Ci0JQlVHX09OKCFmaWxlKTsKKwlyZXQgPSByZWFkKGZkLCAmcnVudGltZSwgc2l6ZW9mKHJ1bnRpbWUpKTsKKwlCVUdfT04ocmV0ICE9IHNpemVvZihydW50aW1lKSk7CiAKLQl3aGlsZSAoKGNoYXJzID0gZ2V0bGluZSgmbGluZSwgJmxlbiwgZmlsZSkpICE9IC0xKSB7Ci0JCXJldCA9IHNzY2FuZihsaW5lLCAic2Uuc3VtX2V4ZWNfcnVudGltZSA6ICVsZC4lMDZsZFxuIiwKLQkJCSZtc2VjcywgJm5zZWNzKTsKLQkJaWYgKHJldCA9PSAyKSB7Ci0JCQl0b3RhbCA9IG1zZWNzKjFlNiArIG5zZWNzOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGxpbmUpCi0JCWZyZWUobGluZSk7Ci0JZmNsb3NlKGZpbGUpOwotCi0JcmV0dXJuIHRvdGFsOworCXJldHVybiBydW50aW1lOwogfQogCiBzdGF0aWMgdm9pZCAqdGhyZWFkX2Z1bmModm9pZCAqY3R4KQpAQCAtNDUwLDkgKzQ0OSwxMSBAQAogCXU2NCBjcHVfdXNhZ2VfMCwgY3B1X3VzYWdlXzE7CiAJdW5zaWduZWQgbG9uZyBpLCByZXQ7CiAJY2hhciBjb21tMlsyMl07CisJaW50IGZkOwogCiAJc3ByaW50Zihjb21tMiwgIjolcyIsIHRoaXNfdGFzay0+Y29tbSk7CiAJcHJjdGwoUFJfU0VUX05BTUUsIGNvbW0yKTsKKwlmZCA9IHNlbGZfb3Blbl9jb3VudGVycygpOwogCiBhZ2FpbjoKIAlyZXQgPSBzZW1fcG9zdCgmdGhpc190YXNrLT5yZWFkeV9mb3Jfd29yayk7CkBAIC00NjIsMTYgKzQ2MywxNSBAQAogCXJldCA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzdGFydF93b3JrX211dGV4KTsKIAlCVUdfT04ocmV0KTsKIAotCWNwdV91c2FnZV8wID0gZ2V0X2NwdV91c2FnZV9uc2VjX3NlbGYoKTsKKwljcHVfdXNhZ2VfMCA9IGdldF9jcHVfdXNhZ2VfbnNlY19zZWxmKGZkKTsKIAogCWZvciAoaSA9IDA7IGkgPCB0aGlzX3Rhc2stPm5yX2V2ZW50czsgaSsrKSB7CiAJCXRoaXNfdGFzay0+Y3Vycl9ldmVudCA9IGk7CiAJCXByb2Nlc3Nfc2NoZWRfZXZlbnQodGhpc190YXNrLCB0aGlzX3Rhc2stPmF0b21zW2ldKTsKIAl9CiAKLQljcHVfdXNhZ2VfMSA9IGdldF9jcHVfdXNhZ2VfbnNlY19zZWxmKCk7CisJY3B1X3VzYWdlXzEgPSBnZXRfY3B1X3VzYWdlX25zZWNfc2VsZihmZCk7CiAJdGhpc190YXNrLT5jcHVfdXNhZ2UgPSBjcHVfdXNhZ2VfMSAtIGNwdV91c2FnZV8wOwotCiAJcmV0ID0gc2VtX3Bvc3QoJnRoaXNfdGFzay0+d29ya19kb25lX3NlbSk7CiAJQlVHX09OKHJldCk7CiAKQEAgLTYyOCwxMSArNjI4LDYgQEAKIAlwcmludGYoInRoZSBzbGVlcCB0ZXN0IHRvb2sgJUxkIG5zZWNzXG4iLCBUMS1UMCk7CiB9CiAKLXN0cnVjdCByYXdfZXZlbnRfc2FtcGxlIHsKLQl1MzIgc2l6ZTsKLQljaGFyIGRhdGFbMF07Ci19OwotCiAjZGVmaW5lIEZJTExfRklFTEQocHRyLCBmaWVsZCwgZXZlbnQsIGRhdGEpCVwKIAlwdHIuZmllbGQgPSAodHlwZW9mKHB0ci5maWVsZCkpIHJhd19maWVsZF92YWx1ZShldmVudCwgI2ZpZWxkLCBkYXRhKQogCkBAIC0xMDE5LDggKzEwMTQsMTAgQEAKIAogCWRlbHRhID0gYXRvbS0+c2NoZWRfaW5fdGltZSAtIGF0b20tPndha2VfdXBfdGltZTsKIAlhdG9tcy0+dG90YWxfbGF0ICs9IGRlbHRhOwotCWlmIChkZWx0YSA+IGF0b21zLT5tYXhfbGF0KQorCWlmIChkZWx0YSA+IGF0b21zLT5tYXhfbGF0KSB7CiAJCWF0b21zLT5tYXhfbGF0ID0gZGVsdGE7CisJCWF0b21zLT5tYXhfbGF0X2F0ID0gdGltZXN0YW1wOworCX0KIAlhdG9tcy0+bmJfYXRvbXMrKzsKIH0KIApAQCAtMTIxNiwxMCArMTIxMywxMSBAQAogCiAJYXZnID0gd29ya19saXN0LT50b3RhbF9sYXQgLyB3b3JrX2xpc3QtPm5iX2F0b21zOwogCi0JcHJpbnRmKCJ8JTExLjNmIG1zIHwlOWxsdSB8IGF2ZzolOS4zZiBtcyB8IG1heDolOS4zZiBtcyB8XG4iLAorCXByaW50ZigifCUxMS4zZiBtcyB8JTlsbHUgfCBhdmc6JTkuM2YgbXMgfCBtYXg6JTkuM2YgbXMgfCBtYXggYXQ6ICU5LjZmIHNcbiIsCiAJICAgICAgKGRvdWJsZSl3b3JrX2xpc3QtPnRvdGFsX3J1bnRpbWUgLyAxZTYsCiAJCSB3b3JrX2xpc3QtPm5iX2F0b21zLCAoZG91YmxlKWF2ZyAvIDFlNiwKLQkJIChkb3VibGUpd29ya19saXN0LT5tYXhfbGF0IC8gMWU2KTsKKwkJIChkb3VibGUpd29ya19saXN0LT5tYXhfbGF0IC8gMWU2LAorCQkgKGRvdWJsZSl3b3JrX2xpc3QtPm1heF9sYXRfYXQgLyAxZTkpOwogfQogCiBzdGF0aWMgaW50IHBpZF9jbXAoc3RydWN0IHdvcmtfYXRvbXMgKmwsIHN0cnVjdCB3b3JrX2F0b21zICpyKQpAQCAtMTM1Niw3ICsxMzU0LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgdHJhY2Vfc2NoZWRfaGFuZGxlciAqdHJhY2VfaGFuZGxlcjsKIAogc3RhdGljIHZvaWQKLXByb2Nlc3Nfc2NoZWRfd2FrZXVwX2V2ZW50KHN0cnVjdCByYXdfZXZlbnRfc2FtcGxlICpyYXcsCitwcm9jZXNzX3NjaGVkX3dha2V1cF9ldmVudCh2b2lkICpkYXRhLAogCQkJICAgc3RydWN0IGV2ZW50ICpldmVudCwKIAkJCSAgIGludCBjcHUgX191c2VkLAogCQkJICAgdTY0IHRpbWVzdGFtcCBfX3VzZWQsCkBAIC0xMzY0LDEzICsxMzYyLDEzIEBACiB7CiAJc3RydWN0IHRyYWNlX3dha2V1cF9ldmVudCB3YWtldXBfZXZlbnQ7CiAKLQlGSUxMX0NPTU1PTl9GSUVMRFMod2FrZXVwX2V2ZW50LCBldmVudCwgcmF3LT5kYXRhKTsKKwlGSUxMX0NPTU1PTl9GSUVMRFMod2FrZXVwX2V2ZW50LCBldmVudCwgZGF0YSk7CiAKLQlGSUxMX0FSUkFZKHdha2V1cF9ldmVudCwgY29tbSwgZXZlbnQsIHJhdy0+ZGF0YSk7Ci0JRklMTF9GSUVMRCh3YWtldXBfZXZlbnQsIHBpZCwgZXZlbnQsIHJhdy0+ZGF0YSk7Ci0JRklMTF9GSUVMRCh3YWtldXBfZXZlbnQsIHByaW8sIGV2ZW50LCByYXctPmRhdGEpOwotCUZJTExfRklFTEQod2FrZXVwX2V2ZW50LCBzdWNjZXNzLCBldmVudCwgcmF3LT5kYXRhKTsKLQlGSUxMX0ZJRUxEKHdha2V1cF9ldmVudCwgY3B1LCBldmVudCwgcmF3LT5kYXRhKTsKKwlGSUxMX0FSUkFZKHdha2V1cF9ldmVudCwgY29tbSwgZXZlbnQsIGRhdGEpOworCUZJTExfRklFTEQod2FrZXVwX2V2ZW50LCBwaWQsIGV2ZW50LCBkYXRhKTsKKwlGSUxMX0ZJRUxEKHdha2V1cF9ldmVudCwgcHJpbywgZXZlbnQsIGRhdGEpOworCUZJTExfRklFTEQod2FrZXVwX2V2ZW50LCBzdWNjZXNzLCBldmVudCwgZGF0YSk7CisJRklMTF9GSUVMRCh3YWtldXBfZXZlbnQsIGNwdSwgZXZlbnQsIGRhdGEpOwogCiAJaWYgKHRyYWNlX2hhbmRsZXItPndha2V1cF9ldmVudCkKIAkJdHJhY2VfaGFuZGxlci0+d2FrZXVwX2V2ZW50KCZ3YWtldXBfZXZlbnQsIGV2ZW50LCBjcHUsIHRpbWVzdGFtcCwgdGhyZWFkKTsKQEAgLTE0NjksNyArMTQ2Nyw3IEBACiAKIAogc3RhdGljIHZvaWQKLXByb2Nlc3Nfc2NoZWRfc3dpdGNoX2V2ZW50KHN0cnVjdCByYXdfZXZlbnRfc2FtcGxlICpyYXcsCitwcm9jZXNzX3NjaGVkX3N3aXRjaF9ldmVudCh2b2lkICpkYXRhLAogCQkJICAgc3RydWN0IGV2ZW50ICpldmVudCwKIAkJCSAgIGludCB0aGlzX2NwdSwKIAkJCSAgIHU2NCB0aW1lc3RhbXAgX191c2VkLApAQCAtMTQ3NywxNSArMTQ3NSwxNSBAQAogewogCXN0cnVjdCB0cmFjZV9zd2l0Y2hfZXZlbnQgc3dpdGNoX2V2ZW50OwogCi0JRklMTF9DT01NT05fRklFTERTKHN3aXRjaF9ldmVudCwgZXZlbnQsIHJhdy0+ZGF0YSk7CisJRklMTF9DT01NT05fRklFTERTKHN3aXRjaF9ldmVudCwgZXZlbnQsIGRhdGEpOwogCi0JRklMTF9BUlJBWShzd2l0Y2hfZXZlbnQsIHByZXZfY29tbSwgZXZlbnQsIHJhdy0+ZGF0YSk7Ci0JRklMTF9GSUVMRChzd2l0Y2hfZXZlbnQsIHByZXZfcGlkLCBldmVudCwgcmF3LT5kYXRhKTsKLQlGSUxMX0ZJRUxEKHN3aXRjaF9ldmVudCwgcHJldl9wcmlvLCBldmVudCwgcmF3LT5kYXRhKTsKLQlGSUxMX0ZJRUxEKHN3aXRjaF9ldmVudCwgcHJldl9zdGF0ZSwgZXZlbnQsIHJhdy0+ZGF0YSk7Ci0JRklMTF9BUlJBWShzd2l0Y2hfZXZlbnQsIG5leHRfY29tbSwgZXZlbnQsIHJhdy0+ZGF0YSk7Ci0JRklMTF9GSUVMRChzd2l0Y2hfZXZlbnQsIG5leHRfcGlkLCBldmVudCwgcmF3LT5kYXRhKTsKLQlGSUxMX0ZJRUxEKHN3aXRjaF9ldmVudCwgbmV4dF9wcmlvLCBldmVudCwgcmF3LT5kYXRhKTsKKwlGSUxMX0FSUkFZKHN3aXRjaF9ldmVudCwgcHJldl9jb21tLCBldmVudCwgZGF0YSk7CisJRklMTF9GSUVMRChzd2l0Y2hfZXZlbnQsIHByZXZfcGlkLCBldmVudCwgZGF0YSk7CisJRklMTF9GSUVMRChzd2l0Y2hfZXZlbnQsIHByZXZfcHJpbywgZXZlbnQsIGRhdGEpOworCUZJTExfRklFTEQoc3dpdGNoX2V2ZW50LCBwcmV2X3N0YXRlLCBldmVudCwgZGF0YSk7CisJRklMTF9BUlJBWShzd2l0Y2hfZXZlbnQsIG5leHRfY29tbSwgZXZlbnQsIGRhdGEpOworCUZJTExfRklFTEQoc3dpdGNoX2V2ZW50LCBuZXh0X3BpZCwgZXZlbnQsIGRhdGEpOworCUZJTExfRklFTEQoc3dpdGNoX2V2ZW50LCBuZXh0X3ByaW8sIGV2ZW50LCBkYXRhKTsKIAogCWlmIChjdXJyX3BpZFt0aGlzX2NwdV0gIT0gKHUzMiktMSkgewogCQkvKgpAQCAtMTUwMiw3ICsxNTAwLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLXByb2Nlc3Nfc2NoZWRfcnVudGltZV9ldmVudChzdHJ1Y3QgcmF3X2V2ZW50X3NhbXBsZSAqcmF3LAorcHJvY2Vzc19zY2hlZF9ydW50aW1lX2V2ZW50KHZvaWQgKmRhdGEsCiAJCQkgICBzdHJ1Y3QgZXZlbnQgKmV2ZW50LAogCQkJICAgaW50IGNwdSBfX3VzZWQsCiAJCQkgICB1NjQgdGltZXN0YW1wIF9fdXNlZCwKQEAgLTE1MTAsMTcgKzE1MDgsMTcgQEAKIHsKIAlzdHJ1Y3QgdHJhY2VfcnVudGltZV9ldmVudCBydW50aW1lX2V2ZW50OwogCi0JRklMTF9BUlJBWShydW50aW1lX2V2ZW50LCBjb21tLCBldmVudCwgcmF3LT5kYXRhKTsKLQlGSUxMX0ZJRUxEKHJ1bnRpbWVfZXZlbnQsIHBpZCwgZXZlbnQsIHJhdy0+ZGF0YSk7Ci0JRklMTF9GSUVMRChydW50aW1lX2V2ZW50LCBydW50aW1lLCBldmVudCwgcmF3LT5kYXRhKTsKLQlGSUxMX0ZJRUxEKHJ1bnRpbWVfZXZlbnQsIHZydW50aW1lLCBldmVudCwgcmF3LT5kYXRhKTsKKwlGSUxMX0FSUkFZKHJ1bnRpbWVfZXZlbnQsIGNvbW0sIGV2ZW50LCBkYXRhKTsKKwlGSUxMX0ZJRUxEKHJ1bnRpbWVfZXZlbnQsIHBpZCwgZXZlbnQsIGRhdGEpOworCUZJTExfRklFTEQocnVudGltZV9ldmVudCwgcnVudGltZSwgZXZlbnQsIGRhdGEpOworCUZJTExfRklFTEQocnVudGltZV9ldmVudCwgdnJ1bnRpbWUsIGV2ZW50LCBkYXRhKTsKIAogCWlmICh0cmFjZV9oYW5kbGVyLT5ydW50aW1lX2V2ZW50KQogCQl0cmFjZV9oYW5kbGVyLT5ydW50aW1lX2V2ZW50KCZydW50aW1lX2V2ZW50LCBldmVudCwgY3B1LCB0aW1lc3RhbXAsIHRocmVhZCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1wcm9jZXNzX3NjaGVkX2ZvcmtfZXZlbnQoc3RydWN0IHJhd19ldmVudF9zYW1wbGUgKnJhdywKK3Byb2Nlc3Nfc2NoZWRfZm9ya19ldmVudCh2b2lkICpkYXRhLAogCQkJIHN0cnVjdCBldmVudCAqZXZlbnQsCiAJCQkgaW50IGNwdSBfX3VzZWQsCiAJCQkgdTY0IHRpbWVzdGFtcCBfX3VzZWQsCkBAIC0xNTI4LDEyICsxNTI2LDEyIEBACiB7CiAJc3RydWN0IHRyYWNlX2ZvcmtfZXZlbnQgZm9ya19ldmVudDsKIAotCUZJTExfQ09NTU9OX0ZJRUxEUyhmb3JrX2V2ZW50LCBldmVudCwgcmF3LT5kYXRhKTsKKwlGSUxMX0NPTU1PTl9GSUVMRFMoZm9ya19ldmVudCwgZXZlbnQsIGRhdGEpOwogCi0JRklMTF9BUlJBWShmb3JrX2V2ZW50LCBwYXJlbnRfY29tbSwgZXZlbnQsIHJhdy0+ZGF0YSk7Ci0JRklMTF9GSUVMRChmb3JrX2V2ZW50LCBwYXJlbnRfcGlkLCBldmVudCwgcmF3LT5kYXRhKTsKLQlGSUxMX0FSUkFZKGZvcmtfZXZlbnQsIGNoaWxkX2NvbW0sIGV2ZW50LCByYXctPmRhdGEpOwotCUZJTExfRklFTEQoZm9ya19ldmVudCwgY2hpbGRfcGlkLCBldmVudCwgcmF3LT5kYXRhKTsKKwlGSUxMX0FSUkFZKGZvcmtfZXZlbnQsIHBhcmVudF9jb21tLCBldmVudCwgZGF0YSk7CisJRklMTF9GSUVMRChmb3JrX2V2ZW50LCBwYXJlbnRfcGlkLCBldmVudCwgZGF0YSk7CisJRklMTF9BUlJBWShmb3JrX2V2ZW50LCBjaGlsZF9jb21tLCBldmVudCwgZGF0YSk7CisJRklMTF9GSUVMRChmb3JrX2V2ZW50LCBjaGlsZF9waWQsIGV2ZW50LCBkYXRhKTsKIAogCWlmICh0cmFjZV9oYW5kbGVyLT5mb3JrX2V2ZW50KQogCQl0cmFjZV9oYW5kbGVyLT5mb3JrX2V2ZW50KCZmb3JrX2V2ZW50LCBldmVudCwgY3B1LCB0aW1lc3RhbXAsIHRocmVhZCk7CkBAIC0xNTUwLDcgKzE1NDgsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotcHJvY2Vzc19zY2hlZF9taWdyYXRlX3Rhc2tfZXZlbnQoc3RydWN0IHJhd19ldmVudF9zYW1wbGUgKnJhdywKK3Byb2Nlc3Nfc2NoZWRfbWlncmF0ZV90YXNrX2V2ZW50KHZvaWQgKmRhdGEsCiAJCQkgICBzdHJ1Y3QgZXZlbnQgKmV2ZW50LAogCQkJICAgaW50IGNwdSBfX3VzZWQsCiAJCQkgICB1NjQgdGltZXN0YW1wIF9fdXNlZCwKQEAgLTE1NTgsODAgKzE1NTYsNjYgQEAKIHsKIAlzdHJ1Y3QgdHJhY2VfbWlncmF0ZV90YXNrX2V2ZW50IG1pZ3JhdGVfdGFza19ldmVudDsKIAotCUZJTExfQ09NTU9OX0ZJRUxEUyhtaWdyYXRlX3Rhc2tfZXZlbnQsIGV2ZW50LCByYXctPmRhdGEpOworCUZJTExfQ09NTU9OX0ZJRUxEUyhtaWdyYXRlX3Rhc2tfZXZlbnQsIGV2ZW50LCBkYXRhKTsKIAotCUZJTExfQVJSQVkobWlncmF0ZV90YXNrX2V2ZW50LCBjb21tLCBldmVudCwgcmF3LT5kYXRhKTsKLQlGSUxMX0ZJRUxEKG1pZ3JhdGVfdGFza19ldmVudCwgcGlkLCBldmVudCwgcmF3LT5kYXRhKTsKLQlGSUxMX0ZJRUxEKG1pZ3JhdGVfdGFza19ldmVudCwgcHJpbywgZXZlbnQsIHJhdy0+ZGF0YSk7Ci0JRklMTF9GSUVMRChtaWdyYXRlX3Rhc2tfZXZlbnQsIGNwdSwgZXZlbnQsIHJhdy0+ZGF0YSk7CisJRklMTF9BUlJBWShtaWdyYXRlX3Rhc2tfZXZlbnQsIGNvbW0sIGV2ZW50LCBkYXRhKTsKKwlGSUxMX0ZJRUxEKG1pZ3JhdGVfdGFza19ldmVudCwgcGlkLCBldmVudCwgZGF0YSk7CisJRklMTF9GSUVMRChtaWdyYXRlX3Rhc2tfZXZlbnQsIHByaW8sIGV2ZW50LCBkYXRhKTsKKwlGSUxMX0ZJRUxEKG1pZ3JhdGVfdGFza19ldmVudCwgY3B1LCBldmVudCwgZGF0YSk7CiAKIAlpZiAodHJhY2VfaGFuZGxlci0+bWlncmF0ZV90YXNrX2V2ZW50KQogCQl0cmFjZV9oYW5kbGVyLT5taWdyYXRlX3Rhc2tfZXZlbnQoJm1pZ3JhdGVfdGFza19ldmVudCwgZXZlbnQsIGNwdSwgdGltZXN0YW1wLCB0aHJlYWQpOwogfQogCiBzdGF0aWMgdm9pZAotcHJvY2Vzc19yYXdfZXZlbnQoZXZlbnRfdCAqcmF3X2V2ZW50IF9fdXNlZCwgdm9pZCAqbW9yZV9kYXRhLAorcHJvY2Vzc19yYXdfZXZlbnQoZXZlbnRfdCAqcmF3X2V2ZW50IF9fdXNlZCwgdm9pZCAqZGF0YSwKIAkJICBpbnQgY3B1LCB1NjQgdGltZXN0YW1wLCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQpCiB7Ci0Jc3RydWN0IHJhd19ldmVudF9zYW1wbGUgKnJhdyA9IG1vcmVfZGF0YTsKIAlzdHJ1Y3QgZXZlbnQgKmV2ZW50OwogCWludCB0eXBlOwogCi0JdHlwZSA9IHRyYWNlX3BhcnNlX2NvbW1vbl90eXBlKHJhdy0+ZGF0YSk7CisKKwl0eXBlID0gdHJhY2VfcGFyc2VfY29tbW9uX3R5cGUoZGF0YSk7CiAJZXZlbnQgPSB0cmFjZV9maW5kX2V2ZW50KHR5cGUpOwogCiAJaWYgKCFzdHJjbXAoZXZlbnQtPm5hbWUsICJzY2hlZF9zd2l0Y2giKSkKLQkJcHJvY2Vzc19zY2hlZF9zd2l0Y2hfZXZlbnQocmF3LCBldmVudCwgY3B1LCB0aW1lc3RhbXAsIHRocmVhZCk7CisJCXByb2Nlc3Nfc2NoZWRfc3dpdGNoX2V2ZW50KGRhdGEsIGV2ZW50LCBjcHUsIHRpbWVzdGFtcCwgdGhyZWFkKTsKIAlpZiAoIXN0cmNtcChldmVudC0+bmFtZSwgInNjaGVkX3N0YXRfcnVudGltZSIpKQotCQlwcm9jZXNzX3NjaGVkX3J1bnRpbWVfZXZlbnQocmF3LCBldmVudCwgY3B1LCB0aW1lc3RhbXAsIHRocmVhZCk7CisJCXByb2Nlc3Nfc2NoZWRfcnVudGltZV9ldmVudChkYXRhLCBldmVudCwgY3B1LCB0aW1lc3RhbXAsIHRocmVhZCk7CiAJaWYgKCFzdHJjbXAoZXZlbnQtPm5hbWUsICJzY2hlZF93YWtldXAiKSkKLQkJcHJvY2Vzc19zY2hlZF93YWtldXBfZXZlbnQocmF3LCBldmVudCwgY3B1LCB0aW1lc3RhbXAsIHRocmVhZCk7CisJCXByb2Nlc3Nfc2NoZWRfd2FrZXVwX2V2ZW50KGRhdGEsIGV2ZW50LCBjcHUsIHRpbWVzdGFtcCwgdGhyZWFkKTsKIAlpZiAoIXN0cmNtcChldmVudC0+bmFtZSwgInNjaGVkX3dha2V1cF9uZXciKSkKLQkJcHJvY2Vzc19zY2hlZF93YWtldXBfZXZlbnQocmF3LCBldmVudCwgY3B1LCB0aW1lc3RhbXAsIHRocmVhZCk7CisJCXByb2Nlc3Nfc2NoZWRfd2FrZXVwX2V2ZW50KGRhdGEsIGV2ZW50LCBjcHUsIHRpbWVzdGFtcCwgdGhyZWFkKTsKIAlpZiAoIXN0cmNtcChldmVudC0+bmFtZSwgInNjaGVkX3Byb2Nlc3NfZm9yayIpKQotCQlwcm9jZXNzX3NjaGVkX2ZvcmtfZXZlbnQocmF3LCBldmVudCwgY3B1LCB0aW1lc3RhbXAsIHRocmVhZCk7CisJCXByb2Nlc3Nfc2NoZWRfZm9ya19ldmVudChkYXRhLCBldmVudCwgY3B1LCB0aW1lc3RhbXAsIHRocmVhZCk7CiAJaWYgKCFzdHJjbXAoZXZlbnQtPm5hbWUsICJzY2hlZF9wcm9jZXNzX2V4aXQiKSkKIAkJcHJvY2Vzc19zY2hlZF9leGl0X2V2ZW50KGV2ZW50LCBjcHUsIHRpbWVzdGFtcCwgdGhyZWFkKTsKIAlpZiAoIXN0cmNtcChldmVudC0+bmFtZSwgInNjaGVkX21pZ3JhdGVfdGFzayIpKQotCQlwcm9jZXNzX3NjaGVkX21pZ3JhdGVfdGFza19ldmVudChyYXcsIGV2ZW50LCBjcHUsIHRpbWVzdGFtcCwgdGhyZWFkKTsKKwkJcHJvY2Vzc19zY2hlZF9taWdyYXRlX3Rhc2tfZXZlbnQoZGF0YSwgZXZlbnQsIGNwdSwgdGltZXN0YW1wLCB0aHJlYWQpOwogfQogCiBzdGF0aWMgaW50IHByb2Nlc3Nfc2FtcGxlX2V2ZW50KGV2ZW50X3QgKmV2ZW50KQogeworCXN0cnVjdCBzYW1wbGVfZGF0YSBkYXRhOwogCXN0cnVjdCB0aHJlYWQgKnRocmVhZDsKLQl1NjQgaXAgPSBldmVudC0+aXAuaXA7Ci0JdTY0IHRpbWVzdGFtcCA9IC0xOwotCXUzMiBjcHUgPSAtMTsKLQl1NjQgcGVyaW9kID0gMTsKLQl2b2lkICptb3JlX2RhdGEgPSBldmVudC0+aXAuX19tb3JlX2RhdGE7CiAKIAlpZiAoIShzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1JBVykpCiAJCXJldHVybiAwOwogCi0JdGhyZWFkID0gdGhyZWFkc19fZmluZG5ldyhldmVudC0+aXAucGlkKTsKKwltZW1zZXQoJmRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisJZGF0YS50aW1lID0gLTE7CisJZGF0YS5jcHUgPSAtMTsKKwlkYXRhLnBlcmlvZCA9IC0xOwogCi0JaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfVElNRSkgewotCQl0aW1lc3RhbXAgPSAqKHU2NCAqKW1vcmVfZGF0YTsKLQkJbW9yZV9kYXRhICs9IHNpemVvZih1NjQpOwotCX0KLQotCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX0NQVSkgewotCQljcHUgPSAqKHUzMiAqKW1vcmVfZGF0YTsKLQkJbW9yZV9kYXRhICs9IHNpemVvZih1MzIpOwotCQltb3JlX2RhdGEgKz0gc2l6ZW9mKHUzMik7IC8qIHJlc2VydmVkICovCi0JfQotCi0JaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfUEVSSU9EKSB7Ci0JCXBlcmlvZCA9ICoodTY0ICopbW9yZV9kYXRhOwotCQltb3JlX2RhdGEgKz0gc2l6ZW9mKHU2NCk7Ci0JfQorCWV2ZW50X19wYXJzZV9zYW1wbGUoZXZlbnQsIHNhbXBsZV90eXBlLCAmZGF0YSk7CiAKIAlkdW1wX3ByaW50ZigiKElQLCAlZCk6ICVkLyVkOiAlcCBwZXJpb2Q6ICVMZFxuIiwKIAkJZXZlbnQtPmhlYWRlci5taXNjLAotCQlldmVudC0+aXAucGlkLCBldmVudC0+aXAudGlkLAotCQkodm9pZCAqKShsb25nKWlwLAotCQkobG9uZyBsb25nKXBlcmlvZCk7CisJCWRhdGEucGlkLCBkYXRhLnRpZCwKKwkJKHZvaWQgKikobG9uZylkYXRhLmlwLAorCQkobG9uZyBsb25nKWRhdGEucGVyaW9kKTsKIAorCXRocmVhZCA9IHRocmVhZHNfX2ZpbmRuZXcoZGF0YS5waWQpOwogCWlmICh0aHJlYWQgPT0gTlVMTCkgewogCQlwcl9kZWJ1ZygicHJvYmxlbSBwcm9jZXNzaW5nICVkIGV2ZW50LCBza2lwcGluZyBpdC5cbiIsCiAJCQkgZXZlbnQtPmhlYWRlci50eXBlKTsKQEAgLTE2NDAsMTAgKzE2MjQsMTAgQEAKIAogCWR1bXBfcHJpbnRmKCIgLi4uIHRocmVhZDogJXM6JWRcbiIsIHRocmVhZC0+Y29tbSwgdGhyZWFkLT5waWQpOwogCi0JaWYgKHByb2ZpbGVfY3B1ICE9IC0xICYmIHByb2ZpbGVfY3B1ICE9IChpbnQpIGNwdSkKKwlpZiAocHJvZmlsZV9jcHUgIT0gLTEgJiYgcHJvZmlsZV9jcHUgIT0gKGludClkYXRhLmNwdSkKIAkJcmV0dXJuIDA7CiAKLQlwcm9jZXNzX3Jhd19ldmVudChldmVudCwgbW9yZV9kYXRhLCBjcHUsIHRpbWVzdGFtcCwgdGhyZWFkKTsKKwlwcm9jZXNzX3Jhd19ldmVudChldmVudCwgZGF0YS5yYXdfZGF0YSwgZGF0YS5jcHUsIGRhdGEudGltZSwgdGhyZWFkKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTY3OSwxMSArMTY2MywxOCBAQAogCiBzdGF0aWMgaW50IHJlYWRfZXZlbnRzKHZvaWQpCiB7CisJaW50IGVycjsKKwlzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uID0gcGVyZl9zZXNzaW9uX19uZXcoaW5wdXRfbmFtZSwgT19SRE9OTFksIDApOworCisJaWYgKHNlc3Npb24gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlyZWdpc3Rlcl9pZGxlX3RocmVhZCgpOwogCXJlZ2lzdGVyX3BlcmZfZmlsZV9oYW5kbGVyKCZmaWxlX2hhbmRsZXIpOwogCi0JcmV0dXJuIG1tYXBfZGlzcGF0Y2hfcGVyZl9maWxlKCZoZWFkZXIsIGlucHV0X25hbWUsIDAsIDAsCi0JCQkJICAgICAgICZldmVudF9fY3dkbGVuLCAmZXZlbnRfX2N3ZCk7CisJZXJyID0gcGVyZl9zZXNzaW9uX19wcm9jZXNzX2V2ZW50cyhzZXNzaW9uLCAwLCAmZXZlbnRfX2N3ZGxlbiwgJmV2ZW50X19jd2QpOworCXBlcmZfc2Vzc2lvbl9fZGVsZXRlKHNlc3Npb24pOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIHByaW50X2JhZF9ldmVudHModm9pZCkKQEAgLTE3MjQsOSArMTcxNSw5IEBACiAJcmVhZF9ldmVudHMoKTsKIAlzb3J0X2xhdCgpOwogCi0JcHJpbnRmKCJcbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0JcHJpbnRmKCIgIFRhc2sgICAgICAgICAgICAgICAgICB8ICAgUnVudGltZSBtcyAgfCBTd2l0Y2hlcyB8IEF2ZXJhZ2UgZGVsYXkgbXMgfCBNYXhpbXVtIGRlbGF5IG1zIHxcbiIpOwotCXByaW50ZigiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlwcmludGYoIlxuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJcHJpbnRmKCIgIFRhc2sgICAgICAgICAgICAgICAgICB8ICAgUnVudGltZSBtcyAgfCBTd2l0Y2hlcyB8IEF2ZXJhZ2UgZGVsYXkgbXMgfCBNYXhpbXVtIGRlbGF5IG1zIHwgTWF4aW11bSBkZWxheSBhdCAgICAgfFxuIik7CisJcHJpbnRmKCIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAogCW5leHQgPSByYl9maXJzdCgmc29ydGVkX2F0b21fcm9vdCk7CiAKQEAgLTE5MDIsMTMgKzE4OTMsMTggQEAKIAogaW50IGNtZF9zY2hlZChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCBfX3VzZWQpCiB7Ci0Jc3ltYm9sX19pbml0KDApOwotCiAJYXJnYyA9IHBhcnNlX29wdGlvbnMoYXJnYywgYXJndiwgc2NoZWRfb3B0aW9ucywgc2NoZWRfdXNhZ2UsCiAJCQkgICAgIFBBUlNFX09QVF9TVE9QX0FUX05PTl9PUFRJT04pOwogCWlmICghYXJnYykKIAkJdXNhZ2Vfd2l0aF9vcHRpb25zKHNjaGVkX3VzYWdlLCBzY2hlZF9vcHRpb25zKTsKIAorCS8qCisJICogQWxpYXNlZCB0byAncGVyZiB0cmFjZScgZm9yIG5vdzoKKwkgKi8KKwlpZiAoIXN0cmNtcChhcmd2WzBdLCAidHJhY2UiKSkKKwkJcmV0dXJuIGNtZF90cmFjZShhcmdjLCBhcmd2LCBwcmVmaXgpOworCisJc3ltYm9sX19pbml0KDApOwogCWlmICghc3RybmNtcChhcmd2WzBdLCAicmVjIiwgMykpIHsKIAkJcmV0dXJuIF9fY21kX3JlY29yZChhcmdjLCBhcmd2KTsKIAl9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbMF0sICJsYXQiLCAzKSkgewpAQCAtMTkzMiwxMSArMTkyOCw2IEBACiAJCQkJdXNhZ2Vfd2l0aF9vcHRpb25zKHJlcGxheV91c2FnZSwgcmVwbGF5X29wdGlvbnMpOwogCQl9CiAJCV9fY21kX3JlcGxheSgpOwotCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzBdLCAidHJhY2UiKSkgewotCQkvKgotCQkgKiBBbGlhc2VkIHRvICdwZXJmIHRyYWNlJyBmb3Igbm93OgotCQkgKi8KLQkJcmV0dXJuIGNtZF90cmFjZShhcmdjLCBhcmd2LCBwcmVmaXgpOwogCX0gZWxzZSB7CiAJCXVzYWdlX3dpdGhfb3B0aW9ucyhzY2hlZF91c2FnZSwgc2NoZWRfb3B0aW9ucyk7CiAJfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXRpbWVjaGFydC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXRpbWVjaGFydC5jCmluZGV4IGNiNThiNjYuLjc1OWRkMmIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10aW1lY2hhcnQuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tdGltZWNoYXJ0LmMKQEAgLTMwMiwxMiArMzAyLDExIEBACiB9CiAKIHN0cnVjdCB0cmFjZV9lbnRyeSB7Ci0JdTMyCQkJc2l6ZTsKIAl1bnNpZ25lZCBzaG9ydAkJdHlwZTsKIAl1bnNpZ25lZCBjaGFyCQlmbGFnczsKIAl1bnNpZ25lZCBjaGFyCQlwcmVlbXB0X2NvdW50OwogCWludAkJCXBpZDsKLQlpbnQJCQl0Z2lkOworCWludAkJCWxvY2tfZGVwdGg7CiB9OwogCiBzdHJ1Y3QgcG93ZXJfZW50cnkgewpAQCAtNDg0LDQzICs0ODMsMjIgQEAKIHN0YXRpYyBpbnQKIHByb2Nlc3Nfc2FtcGxlX2V2ZW50KGV2ZW50X3QgKmV2ZW50KQogewotCWludCBjdXJzb3IgPSAwOwotCXU2NCBhZGRyID0gMDsKLQl1NjQgc3RhbXAgPSAwOwotCXUzMiBjcHUgPSAwOwotCXUzMiBwaWQgPSAwOworCXN0cnVjdCBzYW1wbGVfZGF0YSBkYXRhOwogCXN0cnVjdCB0cmFjZV9lbnRyeSAqdGU7CiAKLQlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9JUCkKLQkJY3Vyc29yKys7CisJbWVtc2V0KCZkYXRhLCAwLCBzaXplb2YoZGF0YSkpOwogCi0JaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfVElEKSB7Ci0JCXBpZCA9IGV2ZW50LT5zYW1wbGUuYXJyYXlbY3Vyc29yXT4+MzI7Ci0JCWN1cnNvcisrOwotCX0KKwlldmVudF9fcGFyc2Vfc2FtcGxlKGV2ZW50LCBzYW1wbGVfdHlwZSwgJmRhdGEpOworCiAJaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfVElNRSkgewotCQlzdGFtcCA9IGV2ZW50LT5zYW1wbGUuYXJyYXlbY3Vyc29yKytdOwotCi0JCWlmICghZmlyc3RfdGltZSB8fCBmaXJzdF90aW1lID4gc3RhbXApCi0JCQlmaXJzdF90aW1lID0gc3RhbXA7Ci0JCWlmIChsYXN0X3RpbWUgPCBzdGFtcCkKLQkJCWxhc3RfdGltZSA9IHN0YW1wOwotCisJCWlmICghZmlyc3RfdGltZSB8fCBmaXJzdF90aW1lID4gZGF0YS50aW1lKQorCQkJZmlyc3RfdGltZSA9IGRhdGEudGltZTsKKwkJaWYgKGxhc3RfdGltZSA8IGRhdGEudGltZSkKKwkJCWxhc3RfdGltZSA9IGRhdGEudGltZTsKIAl9Ci0JaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfQUREUikKLQkJYWRkciA9IGV2ZW50LT5zYW1wbGUuYXJyYXlbY3Vyc29yKytdOwotCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX0lEKQotCQljdXJzb3IrKzsKLQlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9TVFJFQU1fSUQpCi0JCWN1cnNvcisrOwotCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX0NQVSkKLQkJY3B1ID0gZXZlbnQtPnNhbXBsZS5hcnJheVtjdXJzb3IrK10gJiAweEZGRkZGRkZGOwotCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1BFUklPRCkKLQkJY3Vyc29yKys7CiAKLQl0ZSA9ICh2b2lkICopJmV2ZW50LT5zYW1wbGUuYXJyYXlbY3Vyc29yXTsKLQotCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1JBVyAmJiB0ZS0+c2l6ZSA+IDApIHsKKwl0ZSA9ICh2b2lkICopZGF0YS5yYXdfZGF0YTsKKwlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9SQVcgJiYgZGF0YS5yYXdfc2l6ZSA+IDApIHsKIAkJY2hhciAqZXZlbnRfc3RyOwogCQlzdHJ1Y3QgcG93ZXJfZW50cnkgKnBlOwogCkBAIC01MzIsMTkgKzUxMCwxOSBAQAogCQkJcmV0dXJuIDA7CiAKIAkJaWYgKHN0cmNtcChldmVudF9zdHIsICJwb3dlcjpwb3dlcl9zdGFydCIpID09IDApCi0JCQljX3N0YXRlX3N0YXJ0KGNwdSwgc3RhbXAsIHBlLT52YWx1ZSk7CisJCQljX3N0YXRlX3N0YXJ0KGRhdGEuY3B1LCBkYXRhLnRpbWUsIHBlLT52YWx1ZSk7CiAKIAkJaWYgKHN0cmNtcChldmVudF9zdHIsICJwb3dlcjpwb3dlcl9lbmQiKSA9PSAwKQotCQkJY19zdGF0ZV9lbmQoY3B1LCBzdGFtcCk7CisJCQljX3N0YXRlX2VuZChkYXRhLmNwdSwgZGF0YS50aW1lKTsKIAogCQlpZiAoc3RyY21wKGV2ZW50X3N0ciwgInBvd2VyOnBvd2VyX2ZyZXF1ZW5jeSIpID09IDApCi0JCQlwX3N0YXRlX2NoYW5nZShjcHUsIHN0YW1wLCBwZS0+dmFsdWUpOworCQkJcF9zdGF0ZV9jaGFuZ2UoZGF0YS5jcHUsIGRhdGEudGltZSwgcGUtPnZhbHVlKTsKIAogCQlpZiAoc3RyY21wKGV2ZW50X3N0ciwgInNjaGVkOnNjaGVkX3dha2V1cCIpID09IDApCi0JCQlzY2hlZF93YWtldXAoY3B1LCBzdGFtcCwgcGlkLCB0ZSk7CisJCQlzY2hlZF93YWtldXAoZGF0YS5jcHUsIGRhdGEudGltZSwgZGF0YS5waWQsIHRlKTsKIAogCQlpZiAoc3RyY21wKGV2ZW50X3N0ciwgInNjaGVkOnNjaGVkX3N3aXRjaCIpID09IDApCi0JCQlzY2hlZF9zd2l0Y2goY3B1LCBzdGFtcCwgdGUpOworCQkJc2NoZWRfc3dpdGNoKGRhdGEuY3B1LCBkYXRhLnRpbWUsIHRlKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0xMDgxLDE1ICsxMDU5LDE3IEBACiAKIHN0YXRpYyBpbnQgX19jbWRfdGltZWNoYXJ0KHZvaWQpCiB7Ci0Jc3RydWN0IHBlcmZfaGVhZGVyICpoZWFkZXI7CisJc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiA9IHBlcmZfc2Vzc2lvbl9fbmV3KGlucHV0X25hbWUsIE9fUkRPTkxZLCAwKTsKIAlpbnQgcmV0OwogCisJaWYgKHNlc3Npb24gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlyZWdpc3Rlcl9wZXJmX2ZpbGVfaGFuZGxlcigmZmlsZV9oYW5kbGVyKTsKIAotCXJldCA9IG1tYXBfZGlzcGF0Y2hfcGVyZl9maWxlKCZoZWFkZXIsIGlucHV0X25hbWUsIDAsIDAsCi0JCQkJICAgICAgJmV2ZW50X19jd2RsZW4sICZldmVudF9fY3dkKTsKKwlyZXQgPSBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHNlc3Npb24sIDAsICZldmVudF9fY3dkbGVuLCAmZXZlbnRfX2N3ZCk7CiAJaWYgKHJldCkKLQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJZ290byBvdXRfZGVsZXRlOwogCiAJcHJvY2Vzc19zYW1wbGVzKCk7CiAKQEAgLTExMDEsOCArMTA4MSw5IEBACiAKIAlwcl9pbmZvKCJXcml0dGVuICUyLjFmIHNlY29uZHMgb2YgdHJhY2UgdG8gJXMuXG4iLAogCQkobGFzdF90aW1lIC0gZmlyc3RfdGltZSkgLyAxMDAwMDAwMDAwLjAsIG91dHB1dF9uYW1lKTsKLQotCXJldHVybiBFWElUX1NVQ0NFU1M7CitvdXRfZGVsZXRlOgorCXBlcmZfc2Vzc2lvbl9fZGVsZXRlKHNlc3Npb24pOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGltZWNoYXJ0X3VzYWdlW10gPSB7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tdHJhY2UuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi10cmFjZS5jCmluZGV4IGFiYjkxNGEuLjA3NTY2NjQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10cmFjZS5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi10cmFjZS5jCkBAIC03LDYgKzcsNyBAQAogI2luY2x1ZGUgInV0aWwvaGVhZGVyLmgiCiAjaW5jbHVkZSAidXRpbC9leGVjX2NtZC5oIgogI2luY2x1ZGUgInV0aWwvdHJhY2UtZXZlbnQuaCIKKyNpbmNsdWRlICJ1dGlsL3Nlc3Npb24uaCIKIAogc3RhdGljIGNoYXIgY29uc3QJCSpzY3JpcHRfbmFtZTsKIHN0YXRpYyBjaGFyIGNvbnN0CQkqZ2VuZXJhdGVfc2NyaXB0X2xhbmc7CkBAIC02MSw2MyArNjIsNDUgQEAKIAogc3RhdGljIGNoYXIgY29uc3QJCSppbnB1dF9uYW1lID0gInBlcmYuZGF0YSI7CiAKLXN0YXRpYyBzdHJ1Y3QgcGVyZl9oZWFkZXIJKmhlYWRlcjsKK3N0YXRpYyBzdHJ1Y3QgcGVyZl9zZXNzaW9uIAkqc2Vzc2lvbjsKIHN0YXRpYyB1NjQJCQlzYW1wbGVfdHlwZTsKIAogc3RhdGljIGludCBwcm9jZXNzX3NhbXBsZV9ldmVudChldmVudF90ICpldmVudCkKIHsKLQl1NjQgaXAgPSBldmVudC0+aXAuaXA7Ci0JdTY0IHRpbWVzdGFtcCA9IC0xOwotCXUzMiBjcHUgPSAtMTsKLQl1NjQgcGVyaW9kID0gMTsKLQl2b2lkICptb3JlX2RhdGEgPSBldmVudC0+aXAuX19tb3JlX2RhdGE7Ci0Jc3RydWN0IHRocmVhZCAqdGhyZWFkID0gdGhyZWFkc19fZmluZG5ldyhldmVudC0+aXAucGlkKTsKKwlzdHJ1Y3Qgc2FtcGxlX2RhdGEgZGF0YTsKKwlzdHJ1Y3QgdGhyZWFkICp0aHJlYWQ7CiAKLQlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9USU1FKSB7Ci0JCXRpbWVzdGFtcCA9ICoodTY0ICopbW9yZV9kYXRhOwotCQltb3JlX2RhdGEgKz0gc2l6ZW9mKHU2NCk7Ci0JfQorCW1lbXNldCgmZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKKwlkYXRhLnRpbWUgPSAtMTsKKwlkYXRhLmNwdSA9IC0xOworCWRhdGEucGVyaW9kID0gMTsKIAotCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX0NQVSkgewotCQljcHUgPSAqKHUzMiAqKW1vcmVfZGF0YTsKLQkJbW9yZV9kYXRhICs9IHNpemVvZih1MzIpOwotCQltb3JlX2RhdGEgKz0gc2l6ZW9mKHUzMik7IC8qIHJlc2VydmVkICovCi0JfQotCi0JaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfUEVSSU9EKSB7Ci0JCXBlcmlvZCA9ICoodTY0ICopbW9yZV9kYXRhOwotCQltb3JlX2RhdGEgKz0gc2l6ZW9mKHU2NCk7Ci0JfQorCWV2ZW50X19wYXJzZV9zYW1wbGUoZXZlbnQsIHNhbXBsZV90eXBlLCAmZGF0YSk7CiAKIAlkdW1wX3ByaW50ZigiKElQLCAlZCk6ICVkLyVkOiAlcCBwZXJpb2Q6ICVMZFxuIiwKIAkJZXZlbnQtPmhlYWRlci5taXNjLAotCQlldmVudC0+aXAucGlkLCBldmVudC0+aXAudGlkLAotCQkodm9pZCAqKShsb25nKWlwLAotCQkobG9uZyBsb25nKXBlcmlvZCk7CisJCWRhdGEucGlkLCBkYXRhLnRpZCwKKwkJKHZvaWQgKikobG9uZylkYXRhLmlwLAorCQkobG9uZyBsb25nKWRhdGEucGVyaW9kKTsKIAorCXRocmVhZCA9IHRocmVhZHNfX2ZpbmRuZXcoZXZlbnQtPmlwLnBpZCk7CiAJaWYgKHRocmVhZCA9PSBOVUxMKSB7CiAJCXByX2RlYnVnKCJwcm9ibGVtIHByb2Nlc3NpbmcgJWQgZXZlbnQsIHNraXBwaW5nIGl0LlxuIiwKIAkJCSBldmVudC0+aGVhZGVyLnR5cGUpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JZHVtcF9wcmludGYoIiAuLi4gdGhyZWFkOiAlczolZFxuIiwgdGhyZWFkLT5jb21tLCB0aHJlYWQtPnBpZCk7Ci0KIAlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9SQVcpIHsKLQkJc3RydWN0IHsKLQkJCXUzMiBzaXplOwotCQkJY2hhciBkYXRhWzBdOwotCQl9ICpyYXcgPSBtb3JlX2RhdGE7Ci0KIAkJLyoKIAkJICogRklYTUU6IGJldHRlciByZXNvbHZlIGZyb20gcGlkIGZyb20gdGhlIHN0cnVjdCB0cmFjZV9lbnRyeQogCQkgKiBmaWVsZCwgYWx0aG91Z2ggaXQgc2hvdWxkIGJlIHRoZSBzYW1lIHRoYW4gdGhpcyBwZXJmCiAJCSAqIGV2ZW50IHBpZAogCQkgKi8KLQkJc2NyaXB0aW5nX29wcy0+cHJvY2Vzc19ldmVudChjcHUsIHJhdy0+ZGF0YSwgcmF3LT5zaXplLAotCQkJCQkgICAgIHRpbWVzdGFtcCwgdGhyZWFkLT5jb21tKTsKKwkJc2NyaXB0aW5nX29wcy0+cHJvY2Vzc19ldmVudChkYXRhLmNwdSwgZGF0YS5yYXdfZGF0YSwKKwkJCQkJICAgICBkYXRhLnJhd19zaXplLAorCQkJCQkgICAgIGRhdGEudGltZSwgdGhyZWFkLT5jb21tKTsKIAl9Ci0JZXZlbnRfX3N0YXRzLnRvdGFsICs9IHBlcmlvZDsKKwlldmVudF9fc3RhdHMudG90YWwgKz0gZGF0YS5wZXJpb2Q7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE0NCwxMSArMTI3LDE4IEBACiAKIHN0YXRpYyBpbnQgX19jbWRfdHJhY2Uodm9pZCkKIHsKKwlpbnQgZXJyOworCisJc2Vzc2lvbiA9IHBlcmZfc2Vzc2lvbl9fbmV3KGlucHV0X25hbWUsIE9fUkRPTkxZLCAwKTsKKwlpZiAoc2Vzc2lvbiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXJlZ2lzdGVyX2lkbGVfdGhyZWFkKCk7CiAJcmVnaXN0ZXJfcGVyZl9maWxlX2hhbmRsZXIoJmZpbGVfaGFuZGxlcik7CiAKLQlyZXR1cm4gbW1hcF9kaXNwYXRjaF9wZXJmX2ZpbGUoJmhlYWRlciwgaW5wdXRfbmFtZSwKLQkJCQkgICAgICAgMCwgMCwgJmV2ZW50X19jd2RsZW4sICZldmVudF9fY3dkKTsKKwllcnIgPSBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHNlc3Npb24sIDAsICZldmVudF9fY3dkbGVuLCAmZXZlbnRfX2N3ZCk7CisJcGVyZl9zZXNzaW9uX19kZWxldGUoc2Vzc2lvbik7CisJcmV0dXJuIGVycjsKIH0KIAogc3RydWN0IHNjcmlwdF9zcGVjIHsKQEAgLTM2NiwxMSArMzU2LDcgQEAKIAkJCXJldHVybiAtMTsKIAkJfQogCi0JCWhlYWRlciA9IHBlcmZfaGVhZGVyX19uZXcoKTsKLQkJaWYgKGhlYWRlciA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCi0JCXBlcmZfaGVhZGVyX19yZWFkKGhlYWRlciwgaW5wdXQpOworCQlwZXJmX2hlYWRlcl9fcmVhZCgmc2Vzc2lvbi0+aGVhZGVyLCBpbnB1dCk7CiAJCWVyciA9IHNjcmlwdGluZ19vcHMtPmdlbmVyYXRlX3NjcmlwdCgicGVyZi10cmFjZSIpOwogCQlnb3RvIG91dDsKIAl9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3BlcmYuaCBiL3Rvb2xzL3BlcmYvcGVyZi5oCmluZGV4IDQ1NGQ1ZDUuLjc1Zjk0MWIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvcGVyZi5oCisrKyBiL3Rvb2xzL3BlcmYvcGVyZi5oCkBAIC01OSw2ICs1OSwxOCBAQAogI2RlZmluZSBjcHVfcmVsYXgoKQlhc20gdm9sYXRpbGUgKCJoaW50IEBwYXVzZSIgOjo6ICJtZW1vcnkiKQogI2VuZGlmCiAKKyNpZmRlZiBfX2FybV9fCisjaW5jbHVkZSAiLi4vLi4vYXJjaC9hcm0vaW5jbHVkZS9hc20vdW5pc3RkLmgiCisvKgorICogVXNlIHRoZSBfX2t1c2VyX21lbW9yeV9iYXJyaWVyIGhlbHBlciBpbiB0aGUgQ1BVIGhlbHBlciBwYWdlLiBTZWUKKyAqIGFyY2gvYXJtL2tlcm5lbC9lbnRyeS1hcm12LlMgaW4gdGhlIGtlcm5lbCBzb3VyY2UgZm9yIGRldGFpbHMuCisgKi8KKyNkZWZpbmUgcm1iKCkJCWFzbSB2b2xhdGlsZSgibW92IHIwLCAjMHhmZmZmMGZmZjsgbW92IGxyLCBwYzsiIFwKKwkJCQkgICAgICJzdWIgcGMsIHIwLCAjOTUiIDo6OiAicjAiLCAibHIiLCAiY2MiLCBcCisJCQkJICAgICAibWVtb3J5IikKKyNkZWZpbmUgY3B1X3JlbGF4KCkJYXNtIHZvbGF0aWxlKCIiOjo6Im1lbW9yeSIpCisjZW5kaWYKKwogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9kYXRhX21hcC5jIGIvdG9vbHMvcGVyZi91dGlsL2RhdGFfbWFwLmMKaW5kZXggY2EwYmVkZi4uNmQ0NmRkYSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2RhdGFfbWFwLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2RhdGFfbWFwLmMKQEAgLTEwMCwxMSArMTAwLDExIEBACiAJfQogfQogCi1pbnQgcGVyZl9oZWFkZXJfX3JlYWRfYnVpbGRfaWRzKGludCBpbnB1dCwgb2ZmX3Qgb2Zmc2V0LCBvZmZfdCBzaXplKQoraW50IHBlcmZfaGVhZGVyX19yZWFkX2J1aWxkX2lkcyhpbnQgaW5wdXQsIHU2NCBvZmZzZXQsIHU2NCBzaXplKQogewogCXN0cnVjdCBidWlsZF9pZF9ldmVudCBiZXY7CiAJY2hhciBmaWxlbmFtZVtQQVRIX01BWF07Ci0Jb2ZmX3QgbGltaXQgPSBvZmZzZXQgKyBzaXplOworCXU2NCBsaW1pdCA9IG9mZnNldCArIHNpemU7CiAJaW50IGVyciA9IC0xOwogCiAJd2hpbGUgKG9mZnNldCA8IGxpbWl0KSB7CkBAIC0xMjksMjMgKzEyOSwxNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCBtbWFwX2Rpc3BhdGNoX3BlcmZfZmlsZShzdHJ1Y3QgcGVyZl9oZWFkZXIgKipwaGVhZGVyLAotCQkJICAgIGNvbnN0IGNoYXIgKmlucHV0X25hbWUsCi0JCQkgICAgaW50IGZvcmNlLAotCQkJICAgIGludCBmdWxsX3BhdGhzLAotCQkJICAgIGludCAqY3dkbGVuLAotCQkJICAgIGNoYXIgKipjd2QpCitpbnQgcGVyZl9zZXNzaW9uX19wcm9jZXNzX2V2ZW50cyhzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZWxmLAorCQkJCSBpbnQgZnVsbF9wYXRocywgaW50ICpjd2RsZW4sIGNoYXIgKipjd2QpCiB7CiAJaW50IGVycjsKLQlzdHJ1Y3QgcGVyZl9oZWFkZXIgKmhlYWRlcjsKIAl1bnNpZ25lZCBsb25nIGhlYWQsIHNoaWZ0OwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gMDsKLQlzdHJ1Y3Qgc3RhdCBpbnB1dF9zdGF0OwogCXNpemVfdAlwYWdlX3NpemU7CiAJdTY0IHNhbXBsZV90eXBlOwogCWV2ZW50X3QgKmV2ZW50OwogCXVpbnQzMl90IHNpemU7Ci0JaW50IGlucHV0OwogCWNoYXIgKmJ1ZjsKIAogCWlmIChjdXJyX2hhbmRsZXIgPT0gTlVMTCkgewpAQCAtMTU1LDU2ICsxNDgsMTkgQEAKIAogCXBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7CiAKLQlpbnB1dCA9IG9wZW4oaW5wdXRfbmFtZSwgT19SRE9OTFkpOwotCWlmIChpbnB1dCA8IDApIHsKLQkJcHJfZXJyKCJGYWlsZWQgdG8gb3BlbiBmaWxlOiAlcyIsIGlucHV0X25hbWUpOwotCQlpZiAoIXN0cmNtcChpbnB1dF9uYW1lLCAicGVyZi5kYXRhIikpCi0JCQlwcl9lcnIoIiAgKHRyeSAncGVyZiByZWNvcmQnIGZpcnN0KSIpOwotCQlwcl9lcnIoIlxuIik7Ci0JCXJldHVybiAtZXJybm87Ci0JfQotCi0JaWYgKGZzdGF0KGlucHV0LCAmaW5wdXRfc3RhdCkgPCAwKSB7Ci0JCXByX2VycigiZmFpbGVkIHRvIHN0YXQgZmlsZSIpOwotCQllcnIgPSAtZXJybm87Ci0JCWdvdG8gb3V0X2Nsb3NlOwotCX0KLQotCWVyciA9IC1FQUNDRVM7Ci0JaWYgKCFmb3JjZSAmJiBpbnB1dF9zdGF0LnN0X3VpZCAmJiAoaW5wdXRfc3RhdC5zdF91aWQgIT0gZ2V0ZXVpZCgpKSkgewotCQlwcl9lcnIoImZpbGU6ICVzIG5vdCBvd25lZCBieSBjdXJyZW50IHVzZXIgb3Igcm9vdFxuIiwKLQkJCWlucHV0X25hbWUpOwotCQlnb3RvIG91dF9jbG9zZTsKLQl9Ci0KLQlpZiAoaW5wdXRfc3RhdC5zdF9zaXplID09IDApIHsKLQkJcHJfaW5mbygiemVyby1zaXplZCBmaWxlLCBub3RoaW5nIHRvIGRvIVxuIik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQllcnIgPSAtRU5PTUVNOwotCWhlYWRlciA9IHBlcmZfaGVhZGVyX19uZXcoKTsKLQlpZiAoaGVhZGVyID09IE5VTEwpCi0JCWdvdG8gb3V0X2Nsb3NlOwotCi0JZXJyID0gcGVyZl9oZWFkZXJfX3JlYWQoaGVhZGVyLCBpbnB1dCk7Ci0JaWYgKGVyciA8IDApCi0JCWdvdG8gb3V0X2RlbGV0ZTsKLQkqcGhlYWRlciA9IGhlYWRlcjsKLQloZWFkID0gaGVhZGVyLT5kYXRhX29mZnNldDsKLQotCXNhbXBsZV90eXBlID0gcGVyZl9oZWFkZXJfX3NhbXBsZV90eXBlKGhlYWRlcik7CisJaGVhZCA9IHNlbGYtPmhlYWRlci5kYXRhX29mZnNldDsKKwlzYW1wbGVfdHlwZSA9IHBlcmZfaGVhZGVyX19zYW1wbGVfdHlwZSgmc2VsZi0+aGVhZGVyKTsKIAogCWVyciA9IC1FSU5WQUw7CiAJaWYgKGN1cnJfaGFuZGxlci0+c2FtcGxlX3R5cGVfY2hlY2sgJiYKIAkgICAgY3Vycl9oYW5kbGVyLT5zYW1wbGVfdHlwZV9jaGVjayhzYW1wbGVfdHlwZSkgPCAwKQotCQlnb3RvIG91dF9kZWxldGU7CisJCWdvdG8gb3V0X2VycjsKIAogCWlmICghZnVsbF9wYXRocykgewogCQlpZiAoZ2V0Y3dkKF9fY3dkLCBzaXplb2YoX19jd2QpKSA9PSBOVUxMKSB7CiAJCQlwcl9lcnIoImZhaWxlZCB0byBnZXQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5XG4iKTsKIAkJCWVyciA9IC1lcnJubzsKLQkJCWdvdG8gb3V0X2RlbGV0ZTsKKwkJCWdvdG8gb3V0X2VycjsKIAkJfQogCQkqY3dkID0gX19jd2Q7CiAJCSpjd2RsZW4gPSBzdHJsZW4oKmN3ZCk7CkBAIC0yMTksMTEgKzE3NSwxMSBAQAogCiByZW1hcDoKIAlidWYgPSBtbWFwKE5VTEwsIHBhZ2Vfc2l6ZSAqIG1tYXBfd2luZG93LCBQUk9UX1JFQUQsCi0JCSAgIE1BUF9TSEFSRUQsIGlucHV0LCBvZmZzZXQpOworCQkgICBNQVBfU0hBUkVELCBzZWxmLT5mZCwgb2Zmc2V0KTsKIAlpZiAoYnVmID09IE1BUF9GQUlMRUQpIHsKIAkJcHJfZXJyKCJmYWlsZWQgdG8gbW1hcCBmaWxlXG4iKTsKIAkJZXJyID0gLWVycm5vOwotCQlnb3RvIG91dF9kZWxldGU7CisJCWdvdG8gb3V0X2VycjsKIAl9CiAKIG1vcmU6CkBAIC0yNzMsMTkgKzIyOSwxNCBAQAogCiAJaGVhZCArPSBzaXplOwogCi0JaWYgKG9mZnNldCArIGhlYWQgPj0gaGVhZGVyLT5kYXRhX29mZnNldCArIGhlYWRlci0+ZGF0YV9zaXplKQorCWlmIChvZmZzZXQgKyBoZWFkID49IHNlbGYtPmhlYWRlci5kYXRhX29mZnNldCArIHNlbGYtPmhlYWRlci5kYXRhX3NpemUpCiAJCWdvdG8gZG9uZTsKIAotCWlmIChvZmZzZXQgKyBoZWFkIDwgKHVuc2lnbmVkIGxvbmcpaW5wdXRfc3RhdC5zdF9zaXplKQorCWlmIChvZmZzZXQgKyBoZWFkIDwgc2VsZi0+c2l6ZSkKIAkJZ290byBtb3JlOwogCiBkb25lOgogCWVyciA9IDA7Ci1vdXRfY2xvc2U6Ci0JY2xvc2UoaW5wdXQpOwotCitvdXRfZXJyOgogCXJldHVybiBlcnI7Ci1vdXRfZGVsZXRlOgotCXBlcmZfaGVhZGVyX19kZWxldGUoaGVhZGVyKTsKLQlnb3RvIG91dF9jbG9zZTsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9kYXRhX21hcC5oIGIvdG9vbHMvcGVyZi91dGlsL2RhdGFfbWFwLmgKaW5kZXggMzE4MGZmNy4uOThjNWI4MiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2RhdGFfbWFwLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2RhdGFfbWFwLmgKQEAgLTMsNiArMyw3IEBACiAKICNpbmNsdWRlICJldmVudC5oIgogI2luY2x1ZGUgImhlYWRlci5oIgorI2luY2x1ZGUgInNlc3Npb24uaCIKIAogdHlwZWRlZiBpbnQgKCpldmVudF90eXBlX2hhbmRsZXJfdCkoZXZlbnRfdCAqKTsKIApAQCAtMjEsMTIgKzIyLDggQEAKIH07CiAKIHZvaWQgcmVnaXN0ZXJfcGVyZl9maWxlX2hhbmRsZXIoc3RydWN0IHBlcmZfZmlsZV9oYW5kbGVyICpoYW5kbGVyKTsKLWludCBtbWFwX2Rpc3BhdGNoX3BlcmZfZmlsZShzdHJ1Y3QgcGVyZl9oZWFkZXIgKipwaGVhZGVyLAotCQkJICAgIGNvbnN0IGNoYXIgKmlucHV0X25hbWUsCi0JCQkgICAgaW50IGZvcmNlLAotCQkJICAgIGludCBmdWxsX3BhdGhzLAotCQkJICAgIGludCAqY3dkbGVuLAotCQkJICAgIGNoYXIgKipjd2QpOwotaW50IHBlcmZfaGVhZGVyX19yZWFkX2J1aWxkX2lkcyhpbnQgaW5wdXQsIG9mZl90IG9mZnNldCwgb2ZmX3QgZmlsZV9zaXplKTsKK2ludCBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlbGYsCisJCQkJIGludCBmdWxsX3BhdGhzLCBpbnQgKmN3ZGxlbiwgY2hhciAqKmN3ZCk7CitpbnQgcGVyZl9oZWFkZXJfX3JlYWRfYnVpbGRfaWRzKGludCBpbnB1dCwgdTY0IG9mZnNldCwgdTY0IGZpbGVfc2l6ZSk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmMgYi90b29scy9wZXJmL3V0aWwvZXZlbnQuYwppbmRleCA0MTRiODlkLi5iYTBkZTkwIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZXZlbnQuYworKysgYi90b29scy9wZXJmL3V0aWwvZXZlbnQuYwpAQCAtMjU0LDEzICsyNTQsMTQgQEAKIAkJCQlzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwsCiAJCQkJc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKIHsKLQlzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgPSBhbC0+dGhyZWFkID0gc2VsZjsKKwlzdHJ1Y3QgbWFwX2dyb3VwcyAqbWcgPSAmc2VsZi0+bWc7CiAKKwlhbC0+dGhyZWFkID0gc2VsZjsKIAlhbC0+YWRkciA9IGFkZHI7CiAKIAlpZiAoY3B1bW9kZSAmIFBFUkZfUkVDT1JEX01JU0NfS0VSTkVMKSB7CiAJCWFsLT5sZXZlbCA9ICdrJzsKLQkJdGhyZWFkID0ga3RocmVhZDsKKwkJbWcgPSBrbWFwczsKIAl9IGVsc2UgaWYgKGNwdW1vZGUgJiBQRVJGX1JFQ09SRF9NSVNDX1VTRVIpCiAJCWFsLT5sZXZlbCA9ICcuJzsKIAllbHNlIHsKQEAgLTI3MCw3ICsyNzEsNyBAQAogCQlyZXR1cm47CiAJfQogdHJ5X2FnYWluOgotCWFsLT5tYXAgPSB0aHJlYWRfX2ZpbmRfbWFwKHRocmVhZCwgdHlwZSwgYWwtPmFkZHIpOworCWFsLT5tYXAgPSBtYXBfZ3JvdXBzX19maW5kKG1nLCB0eXBlLCBhbC0+YWRkcik7CiAJaWYgKGFsLT5tYXAgPT0gTlVMTCkgewogCQkvKgogCQkgKiBJZiB0aGlzIGlzIG91dHNpZGUgb2YgYWxsIGtub3duIG1hcHMsIGFuZCBpcyBhIG5lZ2F0aXZlCkBAIC0yODEsOCArMjgyLDggQEAKIAkJICogIlt2ZHNvXSIgZHNvLCBidXQgZm9yIG5vdyBsZXRzIHVzZSB0aGUgb2xkIHRyaWNrIG9mIGxvb2tpbmcKIAkJICogaW4gdGhlIHdob2xlIGtlcm5lbCBzeW1ib2wgbGlzdC4KIAkJICovCi0JCWlmICgobG9uZyBsb25nKWFsLT5hZGRyIDwgMCAmJiB0aHJlYWQgIT0ga3RocmVhZCkgewotCQkJdGhyZWFkID0ga3RocmVhZDsKKwkJaWYgKChsb25nIGxvbmcpYWwtPmFkZHIgPCAwICYmIG1nICE9IGttYXBzKSB7CisJCQltZyA9IGttYXBzOwogCQkJZ290byB0cnlfYWdhaW47CiAJCX0KIAkJYWwtPnN5bSA9IE5VTEw7CkBAIC0zMTAsMyArMzExLDcwIEBACiAJCQlhbC0+bGV2ZWwgPT0gJ0gnID8gIltoeXBlcnZpc29yXSIgOiAiPG5vdCBmb3VuZD4iKTsKIAlyZXR1cm4gMDsKIH0KKworaW50IGV2ZW50X19wYXJzZV9zYW1wbGUoZXZlbnRfdCAqZXZlbnQsIHU2NCB0eXBlLCBzdHJ1Y3Qgc2FtcGxlX2RhdGEgKmRhdGEpCit7CisJdTY0ICphcnJheSA9IGV2ZW50LT5zYW1wbGUuYXJyYXk7CisKKwlpZiAodHlwZSAmIFBFUkZfU0FNUExFX0lQKSB7CisJCWRhdGEtPmlwID0gZXZlbnQtPmlwLmlwOworCQlhcnJheSsrOworCX0KKworCWlmICh0eXBlICYgUEVSRl9TQU1QTEVfVElEKSB7CisJCXUzMiAqcCA9ICh1MzIgKilhcnJheTsKKwkJZGF0YS0+cGlkID0gcFswXTsKKwkJZGF0YS0+dGlkID0gcFsxXTsKKwkJYXJyYXkrKzsKKwl9CisKKwlpZiAodHlwZSAmIFBFUkZfU0FNUExFX1RJTUUpIHsKKwkJZGF0YS0+dGltZSA9ICphcnJheTsKKwkJYXJyYXkrKzsKKwl9CisKKwlpZiAodHlwZSAmIFBFUkZfU0FNUExFX0FERFIpIHsKKwkJZGF0YS0+YWRkciA9ICphcnJheTsKKwkJYXJyYXkrKzsKKwl9CisKKwlpZiAodHlwZSAmIFBFUkZfU0FNUExFX0lEKSB7CisJCWRhdGEtPmlkID0gKmFycmF5OworCQlhcnJheSsrOworCX0KKworCWlmICh0eXBlICYgUEVSRl9TQU1QTEVfU1RSRUFNX0lEKSB7CisJCWRhdGEtPnN0cmVhbV9pZCA9ICphcnJheTsKKwkJYXJyYXkrKzsKKwl9CisKKwlpZiAodHlwZSAmIFBFUkZfU0FNUExFX0NQVSkgeworCQl1MzIgKnAgPSAodTMyICopYXJyYXk7CisJCWRhdGEtPmNwdSA9ICpwOworCQlhcnJheSsrOworCX0KKworCWlmICh0eXBlICYgUEVSRl9TQU1QTEVfUEVSSU9EKSB7CisJCWRhdGEtPnBlcmlvZCA9ICphcnJheTsKKwkJYXJyYXkrKzsKKwl9CisKKwlpZiAodHlwZSAmIFBFUkZfU0FNUExFX1JFQUQpIHsKKwkJcHJfZGVidWcoIlBFUkZfU0FNUExFX1JFQUQgaXMgdW5zdXBvcnRlZCBmb3Igbm93XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICh0eXBlICYgUEVSRl9TQU1QTEVfQ0FMTENIQUlOKSB7CisJCWRhdGEtPmNhbGxjaGFpbiA9IChzdHJ1Y3QgaXBfY2FsbGNoYWluICopYXJyYXk7CisJCWFycmF5ICs9IDEgKyBkYXRhLT5jYWxsY2hhaW4tPm5yOworCX0KKworCWlmICh0eXBlICYgUEVSRl9TQU1QTEVfUkFXKSB7CisJCXUzMiAqcCA9ICh1MzIgKilhcnJheTsKKwkJZGF0YS0+cmF3X3NpemUgPSAqcDsKKwkJcCsrOworCQlkYXRhLT5yYXdfZGF0YSA9IHA7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZXZlbnQuaCBiL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5oCmluZGV4IGE0Y2M4MTAuLjUxYTk2YzIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5oCkBAIC01NiwxMSArNTYsMjUgQEAKIAl1NjQgaWQ7CiB9OwogCi1zdHJ1Y3Qgc2FtcGxlX2V2ZW50eworc3RydWN0IHNhbXBsZV9ldmVudCB7CiAJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyICAgICAgICBoZWFkZXI7CiAJdTY0IGFycmF5W107CiB9OwogCitzdHJ1Y3Qgc2FtcGxlX2RhdGEgeworCXU2NCBpcDsKKwl1MzIgcGlkLCB0aWQ7CisJdTY0IHRpbWU7CisJdTY0IGFkZHI7CisJdTY0IGlkOworCXU2NCBzdHJlYW1faWQ7CisJdTMyIGNwdTsKKwl1NjQgcGVyaW9kOworCXN0cnVjdCBpcF9jYWxsY2hhaW4gKmNhbGxjaGFpbjsKKwl1MzIgcmF3X3NpemU7CisJdm9pZCAqcmF3X2RhdGE7Cit9OworCiAjZGVmaW5lIEJVSUxEX0lEX1NJWkUgMjAKIAogc3RydWN0IGJ1aWxkX2lkX2V2ZW50IHsKQEAgLTg5LDEwICsxMDMsMTEgQEAKIAogZW51bSBtYXBfdHlwZSB7CiAJTUFQX19GVU5DVElPTiA9IDAsCi0KLQlNQVBfX05SX1RZUEVTLAorCU1BUF9fVkFSSUFCTEUsCiB9OwogCisjZGVmaW5lIE1BUF9fTlJfVFlQRVMgKE1BUF9fVkFSSUFCTEUgKyAxKQorCiBzdHJ1Y3QgbWFwIHsKIAl1bmlvbiB7CiAJCXN0cnVjdCByYl9ub2RlCXJiX25vZGU7CkBAIC0xMzYsNiArMTUxLDggQEAKIHNpemVfdCBtYXBfX2ZwcmludGYoc3RydWN0IG1hcCAqc2VsZiwgRklMRSAqZnApOwogc3RydWN0IHN5bWJvbCAqbWFwX19maW5kX3N5bWJvbChzdHJ1Y3QgbWFwICpzZWxmLCB1NjQgYWRkciwKIAkJCQlzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKTsKK3N0cnVjdCBzeW1ib2wgKm1hcF9fZmluZF9zeW1ib2xfYnlfbmFtZShzdHJ1Y3QgbWFwICpzZWxmLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCQlzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKTsKIHZvaWQgbWFwX19maXh1cF9zdGFydChzdHJ1Y3QgbWFwICpzZWxmKTsKIHZvaWQgbWFwX19maXh1cF9lbmQoc3RydWN0IG1hcCAqc2VsZik7CiAKQEAgLTE1NSw1ICsxNzIsNiBAQAogc3RydWN0IGFkZHJfbG9jYXRpb247CiBpbnQgZXZlbnRfX3ByZXByb2Nlc3Nfc2FtcGxlKGNvbnN0IGV2ZW50X3QgKnNlbGYsIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCwKIAkJCSAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7CitpbnQgZXZlbnRfX3BhcnNlX3NhbXBsZShldmVudF90ICpldmVudCwgdTY0IHR5cGUsIHN0cnVjdCBzYW1wbGVfZGF0YSAqZGF0YSk7CiAKICNlbmRpZiAvKiBfX1BFUkZfUkVDT1JEX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9oZWFkZXIuYyBiL3Rvb2xzL3BlcmYvdXRpbC9oZWFkZXIuYwppbmRleCA0ODA1ZTZkLi5mMmU4ZDg3IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvaGVhZGVyLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2hlYWRlci5jCkBAIC01OCwzNSArNTgsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIENyZWF0ZSBuZXcgcGVyZi5kYXRhIGhlYWRlcjoKLSAqLwotc3RydWN0IHBlcmZfaGVhZGVyICpwZXJmX2hlYWRlcl9fbmV3KHZvaWQpCitpbnQgcGVyZl9oZWFkZXJfX2luaXQoc3RydWN0IHBlcmZfaGVhZGVyICpzZWxmKQogewotCXN0cnVjdCBwZXJmX2hlYWRlciAqc2VsZiA9IHphbGxvYyhzaXplb2YoKnNlbGYpKTsKLQotCWlmIChzZWxmICE9IE5VTEwpIHsKLQkJc2VsZi0+c2l6ZSA9IDE7Ci0JCXNlbGYtPmF0dHIgPSBtYWxsb2Moc2l6ZW9mKHZvaWQgKikpOwotCi0JCWlmIChzZWxmLT5hdHRyID09IE5VTEwpIHsKLQkJCWZyZWUoc2VsZik7Ci0JCQlzZWxmID0gTlVMTDsKLQkJfQotCX0KLQotCXJldHVybiBzZWxmOworCXNlbGYtPnNpemUgPSAxOworCXNlbGYtPmF0dHIgPSBtYWxsb2Moc2l6ZW9mKHZvaWQgKikpOworCXJldHVybiBzZWxmLT5hdHRyID09IE5VTEwgPyAtRU5PTUVNIDogMDsKIH0KIAotdm9pZCBwZXJmX2hlYWRlcl9fZGVsZXRlKHN0cnVjdCBwZXJmX2hlYWRlciAqc2VsZikKK3ZvaWQgcGVyZl9oZWFkZXJfX2V4aXQoc3RydWN0IHBlcmZfaGVhZGVyICpzZWxmKQogewogCWludCBpOwotCiAJZm9yIChpID0gMDsgaSA8IHNlbGYtPmF0dHJzOyArK2kpCi0JCXBlcmZfaGVhZGVyX2F0dHJfX2RlbGV0ZShzZWxmLT5hdHRyW2ldKTsKLQorICAgICAgICAgICAgICAgIHBlcmZfaGVhZGVyX2F0dHJfX2RlbGV0ZShzZWxmLT5hdHRyW2ldKTsKIAlmcmVlKHNlbGYtPmF0dHIpOwotCWZyZWUoc2VsZik7CiB9CiAKIGludCBwZXJmX2hlYWRlcl9fYWRkX2F0dHIoc3RydWN0IHBlcmZfaGVhZGVyICpzZWxmLApAQCAtMTg3LDcgKzE3MSw5IEBACiAKIHN0YXRpYyBpbnQgX19kc29zX193cml0ZV9idWlsZGlkX3RhYmxlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIGludCBmZCkKIHsKKyNkZWZpbmUgTkFNRV9BTElHTgk2NAogCXN0cnVjdCBkc28gKnBvczsKKwlzdGF0aWMgY29uc3QgY2hhciB6ZXJvX2J1ZltOQU1FX0FMSUdOXTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCBoZWFkLCBub2RlKSB7CiAJCWludCBlcnI7CkBAIC0xOTcsMTQgKzE4MywxNyBAQAogCQlpZiAoIXBvcy0+aGFzX2J1aWxkX2lkKQogCQkJY29udGludWU7CiAJCWxlbiA9IHBvcy0+bG9uZ19uYW1lX2xlbiArIDE7Ci0JCWxlbiA9IEFMSUdOKGxlbiwgNjQpOworCQlsZW4gPSBBTElHTihsZW4sIE5BTUVfQUxJR04pOwogCQltZW1zZXQoJmIsIDAsIHNpemVvZihiKSk7CiAJCW1lbWNweSgmYi5idWlsZF9pZCwgcG9zLT5idWlsZF9pZCwgc2l6ZW9mKHBvcy0+YnVpbGRfaWQpKTsKIAkJYi5oZWFkZXIuc2l6ZSA9IHNpemVvZihiKSArIGxlbjsKIAkJZXJyID0gZG9fd3JpdGUoZmQsICZiLCBzaXplb2YoYikpOwogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7Ci0JCWVyciA9IGRvX3dyaXRlKGZkLCBwb3MtPmxvbmdfbmFtZSwgbGVuKTsKKwkJZXJyID0gZG9fd3JpdGUoZmQsIHBvcy0+bG9uZ19uYW1lLCBwb3MtPmxvbmdfbmFtZV9sZW4gKyAxKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQllcnIgPSBkb193cml0ZShmZCwgemVyb19idWYsIGxlbiAtIHBvcy0+bG9uZ19uYW1lX2xlbiAtIDEpOwogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2hlYWRlci5oIGIvdG9vbHMvcGVyZi91dGlsL2hlYWRlci5oCmluZGV4IGQxZGJlMmIuLmQxMThkMDUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9oZWFkZXIuaAorKysgYi90b29scy9wZXJmL3V0aWwvaGVhZGVyLmgKQEAgLTU1LDggKzU1LDggQEAKIAlERUNMQVJFX0JJVE1BUChhZGRzX2ZlYXR1cmVzLCBIRUFERVJfRkVBVF9CSVRTKTsKIH07CiAKLXN0cnVjdCBwZXJmX2hlYWRlciAqcGVyZl9oZWFkZXJfX25ldyh2b2lkKTsKLXZvaWQgcGVyZl9oZWFkZXJfX2RlbGV0ZShzdHJ1Y3QgcGVyZl9oZWFkZXIgKnNlbGYpOworaW50IHBlcmZfaGVhZGVyX19pbml0KHN0cnVjdCBwZXJmX2hlYWRlciAqc2VsZik7Cit2b2lkIHBlcmZfaGVhZGVyX19leGl0KHN0cnVjdCBwZXJmX2hlYWRlciAqc2VsZik7CiAKIGludCBwZXJmX2hlYWRlcl9fcmVhZChzdHJ1Y3QgcGVyZl9oZWFkZXIgKnNlbGYsIGludCBmZCk7CiBpbnQgcGVyZl9oZWFkZXJfX3dyaXRlKHN0cnVjdCBwZXJmX2hlYWRlciAqc2VsZiwgaW50IGZkLCBib29sIGF0X2V4aXQpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL21hcC5jIGIvdG9vbHMvcGVyZi91dGlsL21hcC5jCmluZGV4IDY5Zjk0ZmUuLjc2YmRjYTYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9tYXAuYworKysgYi90b29scy9wZXJmL3V0aWwvbWFwLmMKQEAgLTEwNCw0MyArMTA0LDY0IEBACiAKICNkZWZpbmUgRFNPX19ERUxFVEVEICIoZGVsZXRlZCkiCiAKK3N0YXRpYyBpbnQgbWFwX19sb2FkKHN0cnVjdCBtYXAgKnNlbGYsIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCit7CisJY29uc3QgY2hhciAqbmFtZSA9IHNlbGYtPmRzby0+bG9uZ19uYW1lOworCWludCBuciA9IGRzb19fbG9hZChzZWxmLT5kc28sIHNlbGYsIGZpbHRlcik7CisKKwlpZiAobnIgPCAwKSB7CisJCWlmIChzZWxmLT5kc28tPmhhc19idWlsZF9pZCkgeworCQkJY2hhciBzYnVpbGRfaWRbQlVJTERfSURfU0laRSAqIDIgKyAxXTsKKworCQkJYnVpbGRfaWRfX3NwcmludGYoc2VsZi0+ZHNvLT5idWlsZF9pZCwKKwkJCQkJICBzaXplb2Yoc2VsZi0+ZHNvLT5idWlsZF9pZCksCisJCQkJCSAgc2J1aWxkX2lkKTsKKwkJCXByX3dhcm5pbmcoIiVzIHdpdGggYnVpbGQgaWQgJXMgbm90IGZvdW5kIiwKKwkJCQkgICBuYW1lLCBzYnVpbGRfaWQpOworCQl9IGVsc2UKKwkJCXByX3dhcm5pbmcoIkZhaWxlZCB0byBvcGVuICVzIiwgbmFtZSk7CisKKwkJcHJfd2FybmluZygiLCBjb250aW51aW5nIHdpdGhvdXQgc3ltYm9sc1xuIik7CisJCXJldHVybiAtMTsKKwl9IGVsc2UgaWYgKG5yID09IDApIHsKKwkJY29uc3Qgc2l6ZV90IGxlbiA9IHN0cmxlbihuYW1lKTsKKwkJY29uc3Qgc2l6ZV90IHJlYWxfbGVuID0gbGVuIC0gc2l6ZW9mKERTT19fREVMRVRFRCk7CisKKwkJaWYgKGxlbiA+IHNpemVvZihEU09fX0RFTEVURUQpICYmCisJCSAgICBzdHJjbXAobmFtZSArIHJlYWxfbGVuICsgMSwgRFNPX19ERUxFVEVEKSA9PSAwKSB7CisJCQlwcl93YXJuaW5nKCIlLipzIHdhcyB1cGRhdGVkLCByZXN0YXJ0IHRoZSBsb25nICIKKwkJCQkgICAicnVubmluZyBhcHBzIHRoYXQgdXNlIGl0IVxuIiwKKwkJCQkgICAoaW50KXJlYWxfbGVuLCBuYW1lKTsKKwkJfSBlbHNlIHsKKwkJCXByX3dhcm5pbmcoIm5vIHN5bWJvbHMgZm91bmQgaW4gJXMsIG1heWJlIGluc3RhbGwgIgorCQkJCSAgICJhIGRlYnVnIHBhY2thZ2U/XG4iLCBuYW1lKTsKKwkJfQorCisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RydWN0IHN5bWJvbCAqbWFwX19maW5kX3N5bWJvbChzdHJ1Y3QgbWFwICpzZWxmLCB1NjQgYWRkciwKIAkJCQlzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQogewotCWlmICghZHNvX19sb2FkZWQoc2VsZi0+ZHNvLCBzZWxmLT50eXBlKSkgewotCQlpbnQgbnIgPSBkc29fX2xvYWQoc2VsZi0+ZHNvLCBzZWxmLCBmaWx0ZXIpOworCWlmICghZHNvX19sb2FkZWQoc2VsZi0+ZHNvLCBzZWxmLT50eXBlKSAmJiBtYXBfX2xvYWQoc2VsZiwgZmlsdGVyKSA8IDApCisJCXJldHVybiBOVUxMOwogCi0JCWlmIChuciA8IDApIHsKLQkJCWlmIChzZWxmLT5kc28tPmhhc19idWlsZF9pZCkgewotCQkJCWNoYXIgc2J1aWxkX2lkW0JVSUxEX0lEX1NJWkUgKiAyICsgMV07CisJcmV0dXJuIGRzb19fZmluZF9zeW1ib2woc2VsZi0+ZHNvLCBzZWxmLT50eXBlLCBhZGRyKTsKK30KIAotCQkJCWJ1aWxkX2lkX19zcHJpbnRmKHNlbGYtPmRzby0+YnVpbGRfaWQsCi0JCQkJCQkgIHNpemVvZihzZWxmLT5kc28tPmJ1aWxkX2lkKSwKLQkJCQkJCSAgc2J1aWxkX2lkKTsKLQkJCQlwcl93YXJuaW5nKCIlcyB3aXRoIGJ1aWxkIGlkICVzIG5vdCBmb3VuZCIsCi0JCQkJCSAgIHNlbGYtPmRzby0+bG9uZ19uYW1lLCBzYnVpbGRfaWQpOwotCQkJfSBlbHNlCi0JCQkJcHJfd2FybmluZygiRmFpbGVkIHRvIG9wZW4gJXMiLAotCQkJCQkgICBzZWxmLT5kc28tPmxvbmdfbmFtZSk7Ci0JCQlwcl93YXJuaW5nKCIsIGNvbnRpbnVpbmcgd2l0aG91dCBzeW1ib2xzXG4iKTsKLQkJCXJldHVybiBOVUxMOwotCQl9IGVsc2UgaWYgKG5yID09IDApIHsKLQkJCWNvbnN0IGNoYXIgKm5hbWUgPSBzZWxmLT5kc28tPmxvbmdfbmFtZTsKLQkJCWNvbnN0IHNpemVfdCBsZW4gPSBzdHJsZW4obmFtZSk7Ci0JCQljb25zdCBzaXplX3QgcmVhbF9sZW4gPSBsZW4gLSBzaXplb2YoRFNPX19ERUxFVEVEKTsKK3N0cnVjdCBzeW1ib2wgKm1hcF9fZmluZF9zeW1ib2xfYnlfbmFtZShzdHJ1Y3QgbWFwICpzZWxmLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCQlzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQoreworCWlmICghZHNvX19sb2FkZWQoc2VsZi0+ZHNvLCBzZWxmLT50eXBlKSAmJiBtYXBfX2xvYWQoc2VsZiwgZmlsdGVyKSA8IDApCisJCXJldHVybiBOVUxMOwogCi0JCQlpZiAobGVuID4gc2l6ZW9mKERTT19fREVMRVRFRCkgJiYKLQkJCSAgICBzdHJjbXAobmFtZSArIHJlYWxfbGVuICsgMSwgRFNPX19ERUxFVEVEKSA9PSAwKSB7Ci0JCQkJcHJfd2FybmluZygiJS4qcyB3YXMgdXBkYXRlZCwgcmVzdGFydCB0aGUgbG9uZyBydW5uaW5nIGFwcHMgdGhhdCB1c2UgaXQhXG4iLAotCQkJCQkgICAoaW50KXJlYWxfbGVuLCBuYW1lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJfd2FybmluZygibm8gc3ltYm9scyBmb3VuZCBpbiAlcywgbWF5YmUgaW5zdGFsbCBhIGRlYnVnIHBhY2thZ2U/XG4iLCBuYW1lKTsKLQkJCX0KLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorCWlmICghZHNvX19zb3J0ZWRfYnlfbmFtZShzZWxmLT5kc28sIHNlbGYtPnR5cGUpKQorCQlkc29fX3NvcnRfYnlfbmFtZShzZWxmLT5kc28sIHNlbGYtPnR5cGUpOwogCi0JcmV0dXJuIHNlbGYtPmRzby0+ZmluZF9zeW1ib2woc2VsZi0+ZHNvLCBzZWxmLT50eXBlLCBhZGRyKTsKKwlyZXR1cm4gZHNvX19maW5kX3N5bWJvbF9ieV9uYW1lKHNlbGYtPmRzbywgc2VsZi0+dHlwZSwgbmFtZSk7CiB9CiAKIHN0cnVjdCBtYXAgKm1hcF9fY2xvbmUoc3RydWN0IG1hcCAqc2VsZikKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuYwppbmRleCA5ZTVkYmQ2Li5lNWJjMGZiIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5jCkBAIC0xOTcsNyArMTk3LDcgQEAKIAkJCWlmIChpZCA9PSBjb25maWcpIHsKIAkJCQljbG9zZWRpcihldnRfZGlyKTsKIAkJCQljbG9zZWRpcihzeXNfZGlyKTsKLQkJCQlwYXRoID0gemFsbG9jKHNpemVvZihwYXRoKSk7CisJCQkJcGF0aCA9IHphbGxvYyhzaXplb2YoKnBhdGgpKTsKIAkJCQlwYXRoLT5zeXN0ZW0gPSBtYWxsb2MoTUFYX0VWRU5UX0xFTkdUSCk7CiAJCQkJaWYgKCFwYXRoLT5zeXN0ZW0pIHsKIAkJCQkJZnJlZShwYXRoKTsKQEAgLTQ2Nyw3ICs0NjcsNiBAQAogCXdoaWxlICgoZXZ0X2VudCA9IHJlYWRkaXIoZXZ0X2RpcikpKSB7CiAJCWNoYXIgZXZlbnRfb3B0W01BWF9FVk9QVF9MRU4gKyAxXTsKIAkJaW50IGxlbjsKLQkJdW5zaWduZWQgaW50IHJlbSA9IE1BWF9FVk9QVF9MRU47CiAKIAkJaWYgKCFzdHJjbXAoZXZ0X2VudC0+ZF9uYW1lLCAiLiIpCiAJCSAgICB8fCAhc3RyY21wKGV2dF9lbnQtPmRfbmFtZSwgIi4uIikKQEAgLTQ3NSwyMCArNDc0LDEyIEBACiAJCSAgICB8fCAhc3RyY21wKGV2dF9lbnQtPmRfbmFtZSwgImZpbHRlciIpKQogCQkJY29udGludWU7CiAKLQkJbGVuID0gc25wcmludGYoZXZlbnRfb3B0LCBNQVhfRVZPUFRfTEVOLCAiJXM6JXMiLCBzeXNfbmFtZSwKLQkJCSAgICAgICBldnRfZW50LT5kX25hbWUpOworCQlsZW4gPSBzbnByaW50ZihldmVudF9vcHQsIE1BWF9FVk9QVF9MRU4sICIlczolcyVzJXMiLCBzeXNfbmFtZSwKKwkJCSAgICAgICBldnRfZW50LT5kX25hbWUsIGZsYWdzID8gIjoiIDogIiIsCisJCQkgICAgICAgZmxhZ3MgPzogIiIpOwogCQlpZiAobGVuIDwgMCkKIAkJCXJldHVybiBFVlRfRkFJTEVEOwogCi0JCXJlbSAtPSBsZW47Ci0JCWlmIChmbGFncykgewotCQkJaWYgKHJlbSA8IHN0cmxlbihmbGFncykgKyAxKQotCQkJCXJldHVybiBFVlRfRkFJTEVEOwotCi0JCQlzdHJjYXQoZXZlbnRfb3B0LCAiOiIpOwotCQkJc3RyY2F0KGV2ZW50X29wdCwgZmxhZ3MpOwotCQl9Ci0KIAkJaWYgKHBhcnNlX2V2ZW50cyhOVUxMLCBldmVudF9vcHQsIDApKQogCQkJcmV0dXJuIEVWVF9GQUlMRUQ7CiAJfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3BhcnNlLW9wdGlvbnMuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1vcHRpb25zLmMKaW5kZXggNmQ4YWY0OC4uZWZlYmQ1YiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3BhcnNlLW9wdGlvbnMuYworKysgYi90b29scy9wZXJmL3V0aWwvcGFyc2Utb3B0aW9ucy5jCkBAIC00MzAsNiArNDMwLDkgQEAKIAkJcG9zID0gZnByaW50ZihzdGRlcnIsICIgICAgIik7CiAJCWlmIChvcHRzLT5zaG9ydF9uYW1lKQogCQkJcG9zICs9IGZwcmludGYoc3RkZXJyLCAiLSVjIiwgb3B0cy0+c2hvcnRfbmFtZSk7CisJCWVsc2UKKwkJCXBvcyArPSBmcHJpbnRmKHN0ZGVyciwgIiAgICAiKTsKKwogCQlpZiAob3B0cy0+bG9uZ19uYW1lICYmIG9wdHMtPnNob3J0X25hbWUpCiAJCQlwb3MgKz0gZnByaW50ZihzdGRlcnIsICIsICIpOwogCQlpZiAob3B0cy0+bG9uZ19uYW1lKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmMgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYwppbmRleCBjZDdmYmRhLi5kMTRhNDU4IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYworKysgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYwpAQCAtNDgsNiArNDgsOSBAQAogCiAvKiBJZiB0aGVyZSBpcyBubyBzcGFjZSB0byB3cml0ZSwgcmV0dXJucyAtRTJCSUcuICovCiBzdGF0aWMgaW50IGVfc25wcmludGYoY2hhciAqc3RyLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisJX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMywgNCkpKTsKKworc3RhdGljIGludCBlX3NucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogewogCWludCByZXQ7CiAJdmFfbGlzdCBhcDsKQEAgLTI1OCw3ICsyNjEsNyBAQAogCQlyZXQgPSBlX3NucHJpbnRmKGJ1ZiwgTUFYX0NNRExFTiwgIiVzJXMlcyVzIiwgcHAtPmZ1bmN0aW9uLAogCQkJCSBvZmZzLCBwcC0+cmV0cHJvYmUgPyAiJXJldHVybiIgOiAiIiwgbGluZSk7CiAJZWxzZQotCQlyZXQgPSBlX3NucHJpbnRmKGJ1ZiwgTUFYX0NNRExFTiwgIiVzJXMlcyVzIiwgcHAtPmZpbGUsIGxpbmUpOworCQlyZXQgPSBlX3NucHJpbnRmKGJ1ZiwgTUFYX0NNRExFTiwgIiVzJXMiLCBwcC0+ZmlsZSwgbGluZSk7CiAJaWYgKHJldCA8PSAwKQogCQlnb3RvIGVycm9yOwogCWxlbiA9IHJldDsKQEAgLTM3MywxNCArMzc2LDMyIEBACiAJCWZyZWUocHAtPmFyZ3MpOwogCWZvciAoaSA9IDA7IGkgPCBwcC0+Zm91bmQ7IGkrKykKIAkJZnJlZShwcC0+cHJvYmVzW2ldKTsKLQltZW1zZXQocHAsIDAsIHNpemVvZihwcCkpOworCW1lbXNldChwcCwgMCwgc2l6ZW9mKCpwcCkpOworfQorCisvKiBTaG93IGFuIGV2ZW50ICovCitzdGF0aWMgdm9pZCBzaG93X3BlcmZfcHJvYmVfZXZlbnQoY29uc3QgY2hhciAqZ3JvdXAsIGNvbnN0IGNoYXIgKmV2ZW50LAorCQkJCSAgY29uc3QgY2hhciAqcGxhY2UsIHN0cnVjdCBwcm9iZV9wb2ludCAqcHApCit7CisJaW50IGk7CisJY2hhciBidWZbMTI4XTsKKworCWVfc25wcmludGYoYnVmLCAxMjgsICIlczolcyIsIGdyb3VwLCBldmVudCk7CisJcHJpbnRmKCIgICUtNDBzIChvbiAlcyIsIGJ1ZiwgcGxhY2UpOworCisJaWYgKHBwLT5ucl9hcmdzID4gMCkgeworCQlwcmludGYoIiB3aXRoIik7CisJCWZvciAoaSA9IDA7IGkgPCBwcC0+bnJfYXJnczsgaSsrKQorCQkJcHJpbnRmKCIgJXMiLCBwcC0+YXJnc1tpXSk7CisJfQorCXByaW50ZigiKVxuIik7CiB9CiAKIC8qIExpc3QgdXAgY3VycmVudCBwZXJmLXByb2JlIGV2ZW50cyAqLwogdm9pZCBzaG93X3BlcmZfcHJvYmVfZXZlbnRzKHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IGk7Ci0JaW50IGZkOworCWludCBmZCwgbnI7CiAJY2hhciAqZ3JvdXAsICpldmVudDsKIAlzdHJ1Y3QgcHJvYmVfcG9pbnQgcHA7CiAJc3RydWN0IHN0cmxpc3QgKnJhd2xpc3Q7CkBAIC0zOTMsOCArNDE0LDEzIEBACiAJZm9yIChpID0gMDsgaSA8IHN0cmxpc3RfX25yX2VudHJpZXMocmF3bGlzdCk7IGkrKykgewogCQllbnQgPSBzdHJsaXN0X19lbnRyeShyYXdsaXN0LCBpKTsKIAkJcGFyc2VfdHJhY2Vfa3Byb2JlX2V2ZW50KGVudC0+cywgJmdyb3VwLCAmZXZlbnQsICZwcCk7CisJCS8qIFN5bnRoZXNpemUgb25seSBldmVudCBwcm9iZSBwb2ludCAqLworCQluciA9IHBwLm5yX2FyZ3M7CisJCXBwLm5yX2FyZ3MgPSAwOwogCQlzeW50aGVzaXplX3BlcmZfcHJvYmVfZXZlbnQoJnBwKTsKLQkJcHJpbnRmKCJbJXM6JXNdXHQlc1xuIiwgZ3JvdXAsIGV2ZW50LCBwcC5wcm9iZXNbMF0pOworCQlwcC5ucl9hcmdzID0gbnI7CisJCS8qIFNob3cgYW4gZXZlbnQgKi8KKwkJc2hvd19wZXJmX3Byb2JlX2V2ZW50KGdyb3VwLCBldmVudCwgcHAucHJvYmVzWzBdLCAmcHApOwogCQlmcmVlKGdyb3VwKTsKIAkJZnJlZShldmVudCk7CiAJCWNsZWFyX3Byb2JlX3BvaW50KCZwcCk7CkBAIC00MDQsMjEgKzQzMCwyOCBAQAogfQogCiAvKiBHZXQgY3VycmVudCBwZXJmLXByb2JlIGV2ZW50IG5hbWVzICovCi1zdGF0aWMgc3RydWN0IHN0cmxpc3QgKmdldF9wZXJmX2V2ZW50X25hbWVzKGludCBmZCkKK3N0YXRpYyBzdHJ1Y3Qgc3RybGlzdCAqZ2V0X3BlcmZfZXZlbnRfbmFtZXMoaW50IGZkLCBib29sIGluY2x1ZGVfZ3JvdXApCiB7CiAJdW5zaWduZWQgaW50IGk7CiAJY2hhciAqZ3JvdXAsICpldmVudDsKKwljaGFyIGJ1ZlsxMjhdOwogCXN0cnVjdCBzdHJsaXN0ICpzbCwgKnJhd2xpc3Q7CiAJc3RydWN0IHN0cl9ub2RlICplbnQ7CiAKIAlyYXdsaXN0ID0gZ2V0X3RyYWNlX2twcm9iZV9ldmVudF9yYXdsaXN0KGZkKTsKIAotCXNsID0gc3RybGlzdF9fbmV3KGZhbHNlLCBOVUxMKTsKKwlzbCA9IHN0cmxpc3RfX25ldyh0cnVlLCBOVUxMKTsKIAlmb3IgKGkgPSAwOyBpIDwgc3RybGlzdF9fbnJfZW50cmllcyhyYXdsaXN0KTsgaSsrKSB7CiAJCWVudCA9IHN0cmxpc3RfX2VudHJ5KHJhd2xpc3QsIGkpOwogCQlwYXJzZV90cmFjZV9rcHJvYmVfZXZlbnQoZW50LT5zLCAmZ3JvdXAsICZldmVudCwgTlVMTCk7Ci0JCXN0cmxpc3RfX2FkZChzbCwgZXZlbnQpOworCQlpZiAoaW5jbHVkZV9ncm91cCkgeworCQkJaWYgKGVfc25wcmludGYoYnVmLCAxMjgsICIlczolcyIsIGdyb3VwLCBldmVudCkgPCAwKQorCQkJCWRpZSgiRmFpbGVkIHRvIGNvcHkgZ3JvdXA6ZXZlbnQgbmFtZS4iKTsKKwkJCXN0cmxpc3RfX2FkZChzbCwgYnVmKTsKKwkJfSBlbHNlCisJCQlzdHJsaXN0X19hZGQoc2wsIGV2ZW50KTsKIAkJZnJlZShncm91cCk7CisJCWZyZWUoZXZlbnQpOwogCX0KIAogCXN0cmxpc3RfX2RlbGV0ZShyYXdsaXN0KTsKQEAgLTQyNiwyNCArNDU5LDMwIEBACiAJcmV0dXJuIHNsOwogfQogCi1zdGF0aWMgaW50IHdyaXRlX3RyYWNlX2twcm9iZV9ldmVudChpbnQgZmQsIGNvbnN0IGNoYXIgKmJ1ZikKK3N0YXRpYyB2b2lkIHdyaXRlX3RyYWNlX2twcm9iZV9ldmVudChpbnQgZmQsIGNvbnN0IGNoYXIgKmJ1ZikKIHsKIAlpbnQgcmV0OwogCisJcHJfZGVidWcoIldyaXRpbmcgZXZlbnQ6ICVzXG4iLCBidWYpOwogCXJldCA9IHdyaXRlKGZkLCBidWYsIHN0cmxlbihidWYpKTsKIAlpZiAocmV0IDw9IDApCi0JCWRpZSgiRmFpbGVkIHRvIGNyZWF0ZSBldmVudC4iKTsKLQllbHNlCi0JCXByaW50ZigiQWRkZWQgbmV3IGV2ZW50OiAlc1xuIiwgYnVmKTsKLQotCXJldHVybiByZXQ7CisJCWRpZSgiRmFpbGVkIHRvIHdyaXRlIGV2ZW50OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGdldF9uZXdfZXZlbnRfbmFtZShjaGFyICpidWYsIHNpemVfdCBsZW4sIGNvbnN0IGNoYXIgKmJhc2UsCiAJCQkgICAgICAgc3RydWN0IHN0cmxpc3QgKm5hbWVsaXN0KQogewogCWludCBpLCByZXQ7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9FVkVOVF9JTkRFWDsgaSsrKSB7CisKKwkvKiBUcnkgbm8gc3VmZml4ICovCisJcmV0ID0gZV9zbnByaW50ZihidWYsIGxlbiwgIiVzIiwgYmFzZSk7CisJaWYgKHJldCA8IDApCisJCWRpZSgic25wcmludGYoKSBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoLXJldCkpOworCWlmICghc3RybGlzdF9faGFzX2VudHJ5KG5hbWVsaXN0LCBidWYpKQorCQlyZXR1cm47CisKKwkvKiBUcnkgdG8gYWRkIHN1ZmZpeCAqLworCWZvciAoaSA9IDE7IGkgPCBNQVhfRVZFTlRfSU5ERVg7IGkrKykgewogCQlyZXQgPSBlX3NucHJpbnRmKGJ1ZiwgbGVuLCAiJXNfJWQiLCBiYXNlLCBpKTsKIAkJaWYgKHJldCA8IDApCiAJCQlkaWUoInNucHJpbnRmKCkgZmFpbGVkOiAlcyIsIHN0cmVycm9yKC1yZXQpKTsKQEAgLTQ2NCw3ICs1MDMsNyBAQAogCiAJZmQgPSBvcGVuX2twcm9iZV9ldmVudHMoT19SRFdSLCBPX0FQUEVORCk7CiAJLyogR2V0IGN1cnJlbnQgZXZlbnQgbmFtZXMgKi8KLQluYW1lbGlzdCA9IGdldF9wZXJmX2V2ZW50X25hbWVzKGZkKTsKKwluYW1lbGlzdCA9IGdldF9wZXJmX2V2ZW50X25hbWVzKGZkLCBmYWxzZSk7CiAKIAlmb3IgKGogPSAwOyBqIDwgbnJfcHJvYmVzOyBqKyspIHsKIAkJcHAgPSBwcm9iZXMgKyBqOwpAQCAtNDc2LDkgKzUxNSw3MyBAQAogCQkJCSBQRVJGUFJPQkVfR1JPVVAsIGV2ZW50LAogCQkJCSBwcC0+cHJvYmVzW2ldKTsKIAkJCXdyaXRlX3RyYWNlX2twcm9iZV9ldmVudChmZCwgYnVmKTsKKwkJCXByaW50ZigiQWRkZWQgbmV3IGV2ZW50OlxuIik7CisJCQkvKiBHZXQgdGhlIGZpcnN0IHBhcmFtZXRlciAocHJvYmUtcG9pbnQpICovCisJCQlzc2NhbmYocHAtPnByb2Jlc1tpXSwgIiVzIiwgYnVmKTsKKwkJCXNob3dfcGVyZl9wcm9iZV9ldmVudChQRVJGUFJPQkVfR1JPVVAsIGV2ZW50LAorCQkJCQkgICAgICBidWYsIHBwKTsKIAkJCS8qIEFkZCBhZGRlZCBldmVudCBuYW1lIHRvIG5hbWVsaXN0ICovCiAJCQlzdHJsaXN0X19hZGQobmFtZWxpc3QsIGV2ZW50KTsKIAkJfQogCX0KKwkvKiBTaG93IGhvdyB0byB1c2UgdGhlIGV2ZW50LiAqLworCXByaW50ZigiXG5Zb3UgY2FuIG5vdyB1c2UgaXQgb24gYWxsIHBlcmYgdG9vbHMsIHN1Y2ggYXM6XG5cbiIpOworCXByaW50ZigiXHRwZXJmIHJlY29yZCAtZSAlczolcyAtYSBzbGVlcCAxXG5cbiIsIFBFUkZQUk9CRV9HUk9VUCwgZXZlbnQpOworCisJc3RybGlzdF9fZGVsZXRlKG5hbWVsaXN0KTsKIAljbG9zZShmZCk7CiB9CisKK3N0YXRpYyB2b2lkIGRlbF90cmFjZV9rcHJvYmVfZXZlbnQoaW50IGZkLCBjb25zdCBjaGFyICpncm91cCwKKwkJCQkgICBjb25zdCBjaGFyICpldmVudCwgc3RydWN0IHN0cmxpc3QgKm5hbWVsaXN0KQoreworCWNoYXIgYnVmWzEyOF07CisKKwlpZiAoZV9zbnByaW50ZihidWYsIDEyOCwgIiVzOiVzIiwgZ3JvdXAsIGV2ZW50KSA8IDApCisJCWRpZSgiRmFpbGVkIHRvIGNvcHkgZXZlbnQuIik7CisJaWYgKCFzdHJsaXN0X19oYXNfZW50cnkobmFtZWxpc3QsIGJ1ZikpIHsKKwkJcHJfd2FybmluZygiV2FybmluZzogZXZlbnQgXCIlc1wiIGlzIG5vdCBmb3VuZC5cbiIsIGJ1Zik7CisJCXJldHVybjsKKwl9CisJLyogQ29udmVydCBmcm9tIHBlcmYtcHJvYmUgZXZlbnQgdG8gdHJhY2Uta3Byb2JlIGV2ZW50ICovCisJaWYgKGVfc25wcmludGYoYnVmLCAxMjgsICItOiVzLyVzIiwgZ3JvdXAsIGV2ZW50KSA8IDApCisJCWRpZSgiRmFpbGVkIHRvIGNvcHkgZXZlbnQuIik7CisKKwl3cml0ZV90cmFjZV9rcHJvYmVfZXZlbnQoZmQsIGJ1Zik7CisJcHJpbnRmKCJSZW1vdmUgZXZlbnQ6ICVzOiVzXG4iLCBncm91cCwgZXZlbnQpOworfQorCit2b2lkIGRlbF90cmFjZV9rcHJvYmVfZXZlbnRzKHN0cnVjdCBzdHJsaXN0ICpkZWxsaXN0KQoreworCWludCBmZDsKKwl1bnNpZ25lZCBpbnQgaTsKKwljb25zdCBjaGFyICpncm91cCwgKmV2ZW50OworCWNoYXIgKnAsICpzdHI7CisJc3RydWN0IHN0cl9ub2RlICplbnQ7CisJc3RydWN0IHN0cmxpc3QgKm5hbWVsaXN0OworCisJZmQgPSBvcGVuX2twcm9iZV9ldmVudHMoT19SRFdSLCBPX0FQUEVORCk7CisJLyogR2V0IGN1cnJlbnQgZXZlbnQgbmFtZXMgKi8KKwluYW1lbGlzdCA9IGdldF9wZXJmX2V2ZW50X25hbWVzKGZkLCB0cnVlKTsKKworCWZvciAoaSA9IDA7IGkgPCBzdHJsaXN0X19ucl9lbnRyaWVzKGRlbGxpc3QpOyBpKyspIHsKKwkJZW50ID0gc3RybGlzdF9fZW50cnkoZGVsbGlzdCwgaSk7CisJCXN0ciA9IHN0cmR1cChlbnQtPnMpOworCQlpZiAoIXN0cikKKwkJCWRpZSgiRmFpbGVkIHRvIGNvcHkgZXZlbnQuIik7CisJCXAgPSBzdHJjaHIoc3RyLCAnOicpOworCQlpZiAocCkgeworCQkJZ3JvdXAgPSBzdHI7CisJCQkqcCA9ICdcMCc7CisJCQlldmVudCA9IHAgKyAxOworCQl9IGVsc2UgeworCQkJZ3JvdXAgPSBQRVJGUFJPQkVfR1JPVVA7CisJCQlldmVudCA9IHN0cjsKKwkJfQorCQlkZWxfdHJhY2Vfa3Byb2JlX2V2ZW50KGZkLCBncm91cCwgZXZlbnQsIG5hbWVsaXN0KTsKKwkJZnJlZShzdHIpOworCX0KKwlzdHJsaXN0X19kZWxldGUobmFtZWxpc3QpOworCWNsb3NlKGZkKTsKK30KKwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmggYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuaAppbmRleCAwYzZmZTU2Li5mNzUyMTU5IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuaAorKysgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuaApAQCAtMTAsNiArMTAsNyBAQAogCQkJCSAgICAgY2hhciAqKmV2ZW50LCBzdHJ1Y3QgcHJvYmVfcG9pbnQgKnBwKTsKIGV4dGVybiBpbnQgc3ludGhlc2l6ZV90cmFjZV9rcHJvYmVfZXZlbnQoc3RydWN0IHByb2JlX3BvaW50ICpwcCk7CiBleHRlcm4gdm9pZCBhZGRfdHJhY2Vfa3Byb2JlX2V2ZW50cyhzdHJ1Y3QgcHJvYmVfcG9pbnQgKnByb2JlcywgaW50IG5yX3Byb2Jlcyk7CitleHRlcm4gdm9pZCBkZWxfdHJhY2Vfa3Byb2JlX2V2ZW50cyhzdHJ1Y3Qgc3RybGlzdCAqZGVsbGlzdCk7CiBleHRlcm4gdm9pZCBzaG93X3BlcmZfcHJvYmVfZXZlbnRzKHZvaWQpOwogCiAvKiBNYXhpbXVtIGluZGV4IG51bWJlciBvZiBldmVudC1uYW1lIHBvc3RmaXggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuYwppbmRleCAyOTNjZGZjLi40NTg1ZjFkIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbmRlci5jCkBAIC0xMDYsNyArMTA2LDcgQEAKIHsKIAlpbnQgaTEgPSBzdHJsZW4oczEpOwogCWludCBpMiA9IHN0cmxlbihzMik7Ci0Jd2hpbGUgKC0taTEgPiAwICYmIC0taTIgPiAwKSB7CisJd2hpbGUgKC0taTEgPj0gMCAmJiAtLWkyID49IDApIHsKIAkJaWYgKHMxW2kxXSAhPSBzMltpMl0pCiAJCQlyZXR1cm4gczFbaTFdIC0gczJbaTJdOwogCX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zZXNzaW9uLmMgYi90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwN2NlMWMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5jCkBAIC0wLDAgKzEsODAgQEAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAic2Vzc2lvbi5oIgorI2luY2x1ZGUgInV0aWwuaCIKKworc3RhdGljIGludCBwZXJmX3Nlc3Npb25fX29wZW4oc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2VsZiwgYm9vbCBmb3JjZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBpbnB1dF9zdGF0OworCisJc2VsZi0+ZmQgPSBvcGVuKHNlbGYtPmZpbGVuYW1lLCBPX1JET05MWSk7CisJaWYgKHNlbGYtPmZkIDwgMCkgeworCQlwcl9lcnIoImZhaWxlZCB0byBvcGVuIGZpbGU6ICVzIiwgc2VsZi0+ZmlsZW5hbWUpOworCQlpZiAoIXN0cmNtcChzZWxmLT5maWxlbmFtZSwgInBlcmYuZGF0YSIpKQorCQkJcHJfZXJyKCIgICh0cnkgJ3BlcmYgcmVjb3JkJyBmaXJzdCkiKTsKKwkJcHJfZXJyKCJcbiIpOworCQlyZXR1cm4gLWVycm5vOworCX0KKworCWlmIChmc3RhdChzZWxmLT5mZCwgJmlucHV0X3N0YXQpIDwgMCkKKwkJZ290byBvdXRfY2xvc2U7CisKKwlpZiAoIWZvcmNlICYmIGlucHV0X3N0YXQuc3RfdWlkICYmIChpbnB1dF9zdGF0LnN0X3VpZCAhPSBnZXRldWlkKCkpKSB7CisJCXByX2VycigiZmlsZSAlcyBub3Qgb3duZWQgYnkgY3VycmVudCB1c2VyIG9yIHJvb3RcbiIsCisJCSAgICAgICBzZWxmLT5maWxlbmFtZSk7CisJCWdvdG8gb3V0X2Nsb3NlOworCX0KKworCWlmICghaW5wdXRfc3RhdC5zdF9zaXplKSB7CisJCXByX2luZm8oInplcm8tc2l6ZWQgZmlsZSAoJXMpLCBub3RoaW5nIHRvIGRvIVxuIiwKKwkJCXNlbGYtPmZpbGVuYW1lKTsKKwkJZ290byBvdXRfY2xvc2U7CisJfQorCisJaWYgKHBlcmZfaGVhZGVyX19yZWFkKCZzZWxmLT5oZWFkZXIsIHNlbGYtPmZkKSA8IDApIHsKKwkJcHJfZXJyKCJpbmNvbXBhdGlibGUgZmlsZSBmb3JtYXQiKTsKKwkJZ290byBvdXRfY2xvc2U7CisJfQorCisJc2VsZi0+c2l6ZSA9IGlucHV0X3N0YXQuc3Rfc2l6ZTsKKwlyZXR1cm4gMDsKKworb3V0X2Nsb3NlOgorCWNsb3NlKHNlbGYtPmZkKTsKKwlzZWxmLT5mZCA9IC0xOworCXJldHVybiAtMTsKK30KKworc3RydWN0IHBlcmZfc2Vzc2lvbiAqcGVyZl9zZXNzaW9uX19uZXcoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBtb2RlLCBib29sIGZvcmNlKQoreworCXNpemVfdCBsZW4gPSBzdHJsZW4oZmlsZW5hbWUpICsgMTsKKwlzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZWxmID0gemFsbG9jKHNpemVvZigqc2VsZikgKyBsZW4pOworCisJaWYgKHNlbGYgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlpZiAocGVyZl9oZWFkZXJfX2luaXQoJnNlbGYtPmhlYWRlcikgPCAwKQorCQlnb3RvIG91dF9kZWxldGU7CisKKwltZW1jcHkoc2VsZi0+ZmlsZW5hbWUsIGZpbGVuYW1lLCBsZW4pOworCisJaWYgKG1vZGUgPT0gT19SRE9OTFkgJiYgcGVyZl9zZXNzaW9uX19vcGVuKHNlbGYsIGZvcmNlKSA8IDApIHsKKwkJcGVyZl9zZXNzaW9uX19kZWxldGUoc2VsZik7CisJCXNlbGYgPSBOVUxMOworCX0KK291dDoKKwlyZXR1cm4gc2VsZjsKK291dF9kZWxldGU6CisJZnJlZShzZWxmKTsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBwZXJmX3Nlc3Npb25fX2RlbGV0ZShzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZWxmKQoreworCXBlcmZfaGVhZGVyX19leGl0KCZzZWxmLT5oZWFkZXIpOworCWNsb3NlKHNlbGYtPmZkKTsKKwlmcmVlKHNlbGYpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Nlc3Npb24uaCBiL3Rvb2xzL3BlcmYvdXRpbC9zZXNzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM2OTljOAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zZXNzaW9uLmgKQEAgLTAsMCArMSwxNiBAQAorI2lmbmRlZiBfX1BFUkZfU0VTU0lPTl9ICisjZGVmaW5lIF9fUEVSRl9TRVNTSU9OX0gKKworI2luY2x1ZGUgImhlYWRlci5oIgorCitzdHJ1Y3QgcGVyZl9zZXNzaW9uIHsKKwlzdHJ1Y3QgcGVyZl9oZWFkZXIJaGVhZGVyOworCXVuc2lnbmVkIGxvbmcJCXNpemU7CisJaW50CQkJZmQ7CisJY2hhciBmaWxlbmFtZVswXTsKK307CisKK3N0cnVjdCBwZXJmX3Nlc3Npb24gKnBlcmZfc2Vzc2lvbl9fbmV3KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgbW9kZSwgYm9vbCBmb3JjZSk7Cit2b2lkIHBlcmZfc2Vzc2lvbl9fZGVsZXRlKHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlbGYpOworCisjZW5kaWYgLyogX19QRVJGX1NFU1NJT05fSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5jIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5jCmluZGV4IGZmZmNiOTMuLmQzZDlmZWQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuYworKysgYi90b29scy9wZXJmL3V0aWwvc3ltYm9sLmMKQEAgLTI5LDExICsyOSw5IEBACiB9OwogCiBzdGF0aWMgdm9pZCBkc29zX19hZGQoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgc3RydWN0IGRzbyAqZHNvKTsKLXN0YXRpYyBzdHJ1Y3QgbWFwICp0aHJlYWRfX2ZpbmRfbWFwX2J5X25hbWUoc3RydWN0IHRocmVhZCAqc2VsZiwgY2hhciAqbmFtZSk7CiBzdGF0aWMgc3RydWN0IG1hcCAqbWFwX19uZXcyKHU2NCBzdGFydCwgc3RydWN0IGRzbyAqZHNvLCBlbnVtIG1hcF90eXBlIHR5cGUpOwotc3RydWN0IHN5bWJvbCAqZHNvX19maW5kX3N5bWJvbChzdHJ1Y3QgZHNvICpzZWxmLCBlbnVtIG1hcF90eXBlIHR5cGUsIHU2NCBhZGRyKTsKIHN0YXRpYyBpbnQgZHNvX19sb2FkX2tlcm5lbF9zeW0oc3RydWN0IGRzbyAqc2VsZiwgc3RydWN0IG1hcCAqbWFwLAotCQkJCXN0cnVjdCB0aHJlYWQgKnRocmVhZCwgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7CisJCQkJc3RydWN0IG1hcF9ncm91cHMgKm1nLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKTsKIHVuc2lnbmVkIGludCBzeW1ib2xfX3ByaXZfc2l6ZTsKIHN0YXRpYyBpbnQgdm1saW51eF9wYXRoX19ucl9lbnRyaWVzOwogc3RhdGljIGNoYXIgKip2bWxpbnV4X3BhdGg7CkBAIC00MywxOSArNDEsNDEgQEAKIAkudHJ5X3ZtbGludXhfcGF0aCA9IHRydWUsCiB9OwogCi1zdGF0aWMgc3RydWN0IHRocmVhZCBrdGhyZWFkX21lbTsKLXN0cnVjdCB0aHJlYWQgKmt0aHJlYWQgPSAma3RocmVhZF9tZW07CitzdGF0aWMgc3RydWN0IG1hcF9ncm91cHMga21hcHNfbWVtOworc3RydWN0IG1hcF9ncm91cHMgKmttYXBzID0gJmttYXBzX21lbTsKIAogYm9vbCBkc29fX2xvYWRlZChjb25zdCBzdHJ1Y3QgZHNvICpzZWxmLCBlbnVtIG1hcF90eXBlIHR5cGUpCiB7CiAJcmV0dXJuIHNlbGYtPmxvYWRlZCAmICgxIDw8IHR5cGUpOwogfQogCitib29sIGRzb19fc29ydGVkX2J5X25hbWUoY29uc3Qgc3RydWN0IGRzbyAqc2VsZiwgZW51bSBtYXBfdHlwZSB0eXBlKQoreworCXJldHVybiBzZWxmLT5zb3J0ZWRfYnlfbmFtZSAmICgxIDw8IHR5cGUpOworfQorCiBzdGF0aWMgdm9pZCBkc29fX3NldF9sb2FkZWQoc3RydWN0IGRzbyAqc2VsZiwgZW51bSBtYXBfdHlwZSB0eXBlKQogewogCXNlbGYtPmxvYWRlZCB8PSAoMSA8PCB0eXBlKTsKIH0KIAorc3RhdGljIHZvaWQgZHNvX19zZXRfc29ydGVkX2J5X25hbWUoc3RydWN0IGRzbyAqc2VsZiwgZW51bSBtYXBfdHlwZSB0eXBlKQoreworCXNlbGYtPnNvcnRlZF9ieV9uYW1lIHw9ICgxIDw8IHR5cGUpOworfQorCitzdGF0aWMgYm9vbCBzeW1ib2xfdHlwZV9faXNfYShjaGFyIHN5bWJvbF90eXBlLCBlbnVtIG1hcF90eXBlIG1hcF90eXBlKQoreworCXN3aXRjaCAobWFwX3R5cGUpIHsKKwljYXNlIE1BUF9fRlVOQ1RJT046CisJCXJldHVybiBzeW1ib2xfdHlwZSA9PSAnVCcgfHwgc3ltYm9sX3R5cGUgPT0gJ1cnOworCWNhc2UgTUFQX19WQVJJQUJMRToKKwkJcmV0dXJuIHN5bWJvbF90eXBlID09ICdEJyB8fCBzeW1ib2xfdHlwZSA9PSAnZCc7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKwogc3RhdGljIHZvaWQgc3ltYm9sc19fZml4dXBfZW5kKHN0cnVjdCByYl9yb290ICpzZWxmKQogewogCXN0cnVjdCByYl9ub2RlICpuZCwgKnByZXZuZCA9IHJiX2ZpcnN0KHNlbGYpOwpAQCAtNzksNyArOTksNyBAQAogCQljdXJyLT5lbmQgPSByb3VuZHVwKGN1cnItPnN0YXJ0LCA0MDk2KTsKIH0KIAotc3RhdGljIHZvaWQgX190aHJlYWRfX2ZpeHVwX21hcHNfZW5kKHN0cnVjdCB0aHJlYWQgKnNlbGYsIGVudW0gbWFwX3R5cGUgdHlwZSkKK3N0YXRpYyB2b2lkIF9fbWFwX2dyb3Vwc19fZml4dXBfZW5kKHN0cnVjdCBtYXBfZ3JvdXBzICpzZWxmLCBlbnVtIG1hcF90eXBlIHR5cGUpCiB7CiAJc3RydWN0IG1hcCAqcHJldiwgKmN1cnI7CiAJc3RydWN0IHJiX25vZGUgKm5kLCAqcHJldm5kID0gcmJfZmlyc3QoJnNlbGYtPm1hcHNbdHlwZV0pOwpAQCAtMTAyLDExICsxMjIsMTEgQEAKIAljdXJyLT5lbmQgPSB+MFVMOwogfQogCi1zdGF0aWMgdm9pZCB0aHJlYWRfX2ZpeHVwX21hcHNfZW5kKHN0cnVjdCB0aHJlYWQgKnNlbGYpCitzdGF0aWMgdm9pZCBtYXBfZ3JvdXBzX19maXh1cF9lbmQoc3RydWN0IG1hcF9ncm91cHMgKnNlbGYpCiB7CiAJaW50IGk7CiAJZm9yIChpID0gMDsgaSA8IE1BUF9fTlJfVFlQRVM7ICsraSkKLQkJX190aHJlYWRfX2ZpeHVwX21hcHNfZW5kKHNlbGYsIGkpOworCQlfX21hcF9ncm91cHNfX2ZpeHVwX2VuZChzZWxmLCBpKTsKIH0KIAogc3RhdGljIHN0cnVjdCBzeW1ib2wgKnN5bWJvbF9fbmV3KHU2NCBzdGFydCwgdTY0IGxlbiwgY29uc3QgY2hhciAqbmFtZSkKQEAgLTE2NCwxMSArMTg0LDExIEBACiAJCWRzb19fc2V0X2xvbmdfbmFtZShzZWxmLCBzZWxmLT5uYW1lKTsKIAkJc2VsZi0+c2hvcnRfbmFtZSA9IHNlbGYtPm5hbWU7CiAJCWZvciAoaSA9IDA7IGkgPCBNQVBfX05SX1RZUEVTOyArK2kpCi0JCQlzZWxmLT5zeW1ib2xzW2ldID0gUkJfUk9PVDsKLQkJc2VsZi0+ZmluZF9zeW1ib2wgPSBkc29fX2ZpbmRfc3ltYm9sOworCQkJc2VsZi0+c3ltYm9sc1tpXSA9IHNlbGYtPnN5bWJvbF9uYW1lc1tpXSA9IFJCX1JPT1Q7CiAJCXNlbGYtPnNsZW5fY2FsY3VsYXRlZCA9IDA7CiAJCXNlbGYtPm9yaWdpbiA9IERTT19fT1JJR19OT1RfRk9VTkQ7CiAJCXNlbGYtPmxvYWRlZCA9IDA7CisJCXNlbGYtPnNvcnRlZF9ieV9uYW1lID0gMDsKIAkJc2VsZi0+aGFzX2J1aWxkX2lkID0gMDsKIAl9CiAKQEAgLTI0NiwxMSArMjY2LDg1IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0cnVjdCBzeW1ib2wgKmRzb19fZmluZF9zeW1ib2woc3RydWN0IGRzbyAqc2VsZiwgZW51bSBtYXBfdHlwZSB0eXBlLCB1NjQgYWRkcikKK3N0cnVjdCBzeW1ib2xfbmFtZV9yYl9ub2RlIHsKKwlzdHJ1Y3QgcmJfbm9kZQlyYl9ub2RlOworCXN0cnVjdCBzeW1ib2wJc3ltOworfTsKKworc3RhdGljIHZvaWQgc3ltYm9sc19faW5zZXJ0X2J5X25hbWUoc3RydWN0IHJiX3Jvb3QgKnNlbGYsIHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmc2VsZi0+cmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3Qgc3ltYm9sX25hbWVfcmJfbm9kZSAqc3ltbiA9ICgodm9pZCAqKXN5bSkgLSBzaXplb2YoKnBhcmVudCksICpzOworCisJd2hpbGUgKCpwICE9IE5VTEwpIHsKKwkJcGFyZW50ID0gKnA7CisJCXMgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBzeW1ib2xfbmFtZV9yYl9ub2RlLCByYl9ub2RlKTsKKwkJaWYgKHN0cmNtcChzeW0tPm5hbWUsIHMtPnN5bS5uYW1lKSA8IDApCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJfQorCXJiX2xpbmtfbm9kZSgmc3ltbi0+cmJfbm9kZSwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJnN5bW4tPnJiX25vZGUsIHNlbGYpOworfQorCitzdGF0aWMgdm9pZCBzeW1ib2xzX19zb3J0X2J5X25hbWUoc3RydWN0IHJiX3Jvb3QgKnNlbGYsIHN0cnVjdCByYl9yb290ICpzb3VyY2UpCit7CisJc3RydWN0IHJiX25vZGUgKm5kOworCisJZm9yIChuZCA9IHJiX2ZpcnN0KHNvdXJjZSk7IG5kOyBuZCA9IHJiX25leHQobmQpKSB7CisJCXN0cnVjdCBzeW1ib2wgKnBvcyA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3Qgc3ltYm9sLCByYl9ub2RlKTsKKwkJc3ltYm9sc19faW5zZXJ0X2J5X25hbWUoc2VsZiwgcG9zKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3ltYm9sICpzeW1ib2xzX19maW5kX2J5X25hbWUoc3RydWN0IHJiX3Jvb3QgKnNlbGYsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHJiX25vZGUgKm47CisKKwlpZiAoc2VsZiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCW4gPSBzZWxmLT5yYl9ub2RlOworCisJd2hpbGUgKG4pIHsKKwkJc3RydWN0IHN5bWJvbF9uYW1lX3JiX25vZGUgKnM7CisJCWludCBjbXA7CisKKwkJcyA9IHJiX2VudHJ5KG4sIHN0cnVjdCBzeW1ib2xfbmFtZV9yYl9ub2RlLCByYl9ub2RlKTsKKwkJY21wID0gc3RyY21wKG5hbWUsIHMtPnN5bS5uYW1lKTsKKworCQlpZiAoY21wIDwgMCkKKwkJCW4gPSBuLT5yYl9sZWZ0OworCQllbHNlIGlmIChjbXAgPiAwKQorCQkJbiA9IG4tPnJiX3JpZ2h0OworCQllbHNlCisJCQlyZXR1cm4gJnMtPnN5bTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IHN5bWJvbCAqZHNvX19maW5kX3N5bWJvbChzdHJ1Y3QgZHNvICpzZWxmLAorCQkJCWVudW0gbWFwX3R5cGUgdHlwZSwgdTY0IGFkZHIpCiB7CiAJcmV0dXJuIHN5bWJvbHNfX2ZpbmQoJnNlbGYtPnN5bWJvbHNbdHlwZV0sIGFkZHIpOwogfQogCitzdHJ1Y3Qgc3ltYm9sICpkc29fX2ZpbmRfc3ltYm9sX2J5X25hbWUoc3RydWN0IGRzbyAqc2VsZiwgZW51bSBtYXBfdHlwZSB0eXBlLAorCQkJCQljb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiBzeW1ib2xzX19maW5kX2J5X25hbWUoJnNlbGYtPnN5bWJvbF9uYW1lc1t0eXBlXSwgbmFtZSk7Cit9CisKK3ZvaWQgZHNvX19zb3J0X2J5X25hbWUoc3RydWN0IGRzbyAqc2VsZiwgZW51bSBtYXBfdHlwZSB0eXBlKQoreworCWRzb19fc2V0X3NvcnRlZF9ieV9uYW1lKHNlbGYsIHR5cGUpOworCXJldHVybiBzeW1ib2xzX19zb3J0X2J5X25hbWUoJnNlbGYtPnN5bWJvbF9uYW1lc1t0eXBlXSwKKwkJCQkgICAgICZzZWxmLT5zeW1ib2xzW3R5cGVdKTsKK30KKwogaW50IGJ1aWxkX2lkX19zcHJpbnRmKHU4ICpzZWxmLCBpbnQgbGVuLCBjaGFyICpiZikKIHsKIAljaGFyICpiaWQgPSBiZjsKQEAgLTMyNywxMCArNDIxLDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCXN5bWJvbF90eXBlID0gdG91cHBlcihsaW5lW2xlbl0pOwotCQkvKgotCQkgKiBXZSdyZSBpbnRlcmVzdGVkIG9ubHkgaW4gY29kZSAoJ1QnZXh0KQotCQkgKi8KLQkJaWYgKHN5bWJvbF90eXBlICE9ICdUJyAmJiBzeW1ib2xfdHlwZSAhPSAnVycpCisJCWlmICghc3ltYm9sX3R5cGVfX2lzX2Eoc3ltYm9sX3R5cGUsIG1hcC0+dHlwZSkpCiAJCQljb250aW51ZTsKIAogCQlzeW1ib2xfbmFtZSA9IGxpbmUgKyBsZW4gKyAyOwpAQCAtMzY0LDggKzQ1NSw4IEBACiAgKiBrZXJuZWwgcmFuZ2UgaXMgYnJva2VuIGluIHNldmVyYWwgbWFwcywgbmFtZWQgW2tlcm5lbF0uTiwgYXMgd2UgZG9uJ3QgaGF2ZQogICogdGhlIG9yaWdpbmFsIEVMRiBzZWN0aW9uIG5hbWVzIHZtbGludXggaGF2ZS4KICAqLwotc3RhdGljIGludCBkc29fX3NwbGl0X2thbGxzeW1zKHN0cnVjdCBkc28gKnNlbGYsIHN0cnVjdCBtYXAgKm1hcCwgc3RydWN0IHRocmVhZCAqdGhyZWFkLAotCQkJICAgICAgIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCitzdGF0aWMgaW50IGRzb19fc3BsaXRfa2FsbHN5bXMoc3RydWN0IGRzbyAqc2VsZiwgc3RydWN0IG1hcCAqbWFwLAorCQkJICAgICAgIHN0cnVjdCBtYXBfZ3JvdXBzICptZywgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKIHsKIAlzdHJ1Y3QgbWFwICpjdXJyX21hcCA9IG1hcDsKIAlzdHJ1Y3Qgc3ltYm9sICpwb3M7CkBAIC0zODIsMTMgKzQ3MywxMyBAQAogCiAJCW1vZHVsZSA9IHN0cmNocihwb3MtPm5hbWUsICdcdCcpOwogCQlpZiAobW9kdWxlKSB7Ci0JCQlpZiAoIXRocmVhZC0+dXNlX21vZHVsZXMpCisJCQlpZiAoIW1nLT51c2VfbW9kdWxlcykKIAkJCQlnb3RvIGRpc2NhcmRfc3ltYm9sOwogCiAJCQkqbW9kdWxlKysgPSAnXDAnOwogCiAJCQlpZiAoc3RyY21wKHNlbGYtPm5hbWUsIG1vZHVsZSkpIHsKLQkJCQljdXJyX21hcCA9IHRocmVhZF9fZmluZF9tYXBfYnlfbmFtZSh0aHJlYWQsIG1vZHVsZSk7CisJCQkJY3Vycl9tYXAgPSBtYXBfZ3JvdXBzX19maW5kX2J5X25hbWUobWcsIG1hcC0+dHlwZSwgbW9kdWxlKTsKIAkJCQlpZiAoY3Vycl9tYXAgPT0gTlVMTCkgewogCQkJCQlwcl9kZWJ1ZygiL3Byb2Mve2thbGxzeW1zLG1vZHVsZXN9ICIKIAkJCQkJICAgICAgICAgImluY29uc2lzdGVuY3khXG4iKTsKQEAgLTQxOSw3ICs1MTAsNyBAQAogCQkJfQogCiAJCQljdXJyX21hcC0+bWFwX2lwID0gY3Vycl9tYXAtPnVubWFwX2lwID0gaWRlbnRpdHlfX21hcF9pcDsKLQkJCV9fdGhyZWFkX19pbnNlcnRfbWFwKHRocmVhZCwgY3Vycl9tYXApOworCQkJbWFwX2dyb3Vwc19faW5zZXJ0KG1nLCBjdXJyX21hcCk7CiAJCQkrK2tlcm5lbF9yYW5nZTsKIAkJfQogCkBAIC00NDAsNyArNTMxLDcgQEAKIAogCiBzdGF0aWMgaW50IGRzb19fbG9hZF9rYWxsc3ltcyhzdHJ1Y3QgZHNvICpzZWxmLCBzdHJ1Y3QgbWFwICptYXAsCi0JCQkgICAgICBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCisJCQkgICAgICBzdHJ1Y3QgbWFwX2dyb3VwcyAqbWcsIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCiB7CiAJaWYgKGRzb19fbG9hZF9hbGxfa2FsbHN5bXMoc2VsZiwgbWFwKSA8IDApCiAJCXJldHVybiAtMTsKQEAgLTQ0OCwxMyArNTM5LDEzIEBACiAJc3ltYm9sc19fZml4dXBfZW5kKCZzZWxmLT5zeW1ib2xzW21hcC0+dHlwZV0pOwogCXNlbGYtPm9yaWdpbiA9IERTT19fT1JJR19LRVJORUw7CiAKLQlyZXR1cm4gZHNvX19zcGxpdF9rYWxsc3ltcyhzZWxmLCBtYXAsIHRocmVhZCwgZmlsdGVyKTsKKwlyZXR1cm4gZHNvX19zcGxpdF9rYWxsc3ltcyhzZWxmLCBtYXAsIG1nLCBmaWx0ZXIpOwogfQogCiBzaXplX3Qga2VybmVsX21hcHNfX2ZwcmludGYoRklMRSAqZnApCiB7CiAJc2l6ZV90IHByaW50ZWQgPSBmcHJpbnRmKGZwLCAiS2VybmVsIG1hcHM6XG4iKTsKLQlwcmludGVkICs9IHRocmVhZF9fZnByaW50Zl9tYXBzKGt0aHJlYWQsIGZwKTsKKwlwcmludGVkICs9IG1hcF9ncm91cHNfX2ZwcmludGZfbWFwcyhrbWFwcywgZnApOwogCXJldHVybiBwcmludGVkICsgZnByaW50ZihmcCwgIkVORCBrZXJuZWwgbWFwc1xuIik7CiB9CiAKQEAgLTU0NCw2ICs2MzUsMTMgQEAKIAkgICAgICAgc3ltLT5zdF9zaG5keCAhPSBTSE5fVU5ERUY7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBlbGZfc3ltX19pc19vYmplY3QoY29uc3QgR0VsZl9TeW0gKnN5bSkKK3sKKwlyZXR1cm4gZWxmX3N5bV9fdHlwZShzeW0pID09IFNUVF9PQkpFQ1QgJiYKKwkJc3ltLT5zdF9uYW1lICE9IDAgJiYKKwkJc3ltLT5zdF9zaG5keCAhPSBTSE5fVU5ERUY7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGVsZl9zeW1fX2lzX2xhYmVsKGNvbnN0IEdFbGZfU3ltICpzeW0pCiB7CiAJcmV0dXJuIGVsZl9zeW1fX3R5cGUoc3ltKSA9PSBTVFRfTk9UWVBFICYmCkBAIC01NjQsNiArNjYyLDEyIEBACiAJcmV0dXJuIHN0cnN0cihlbGZfc2VjX19uYW1lKHNoZHIsIHNlY3N0cnMpLCAidGV4dCIpICE9IE5VTEw7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBlbGZfc2VjX19pc19kYXRhKGNvbnN0IEdFbGZfU2hkciAqc2hkciwKKwkJCQkgICAgY29uc3QgRWxmX0RhdGEgKnNlY3N0cnMpCit7CisJcmV0dXJuIHN0cnN0cihlbGZfc2VjX19uYW1lKHNoZHIsIHNlY3N0cnMpLCAiZGF0YSIpICE9IE5VTEw7Cit9CisKIHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqZWxmX3N5bV9fbmFtZShjb25zdCBHRWxmX1N5bSAqc3ltLAogCQkJCQljb25zdCBFbGZfRGF0YSAqc3ltc3RycykKIHsKQEAgLTc0NCw4ICs4NDgsMzIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGJvb2wgZWxmX3N5bV9faXNfYShHRWxmX1N5bSAqc2VsZiwgZW51bSBtYXBfdHlwZSB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgTUFQX19GVU5DVElPTjoKKwkJcmV0dXJuIGVsZl9zeW1fX2lzX2Z1bmN0aW9uKHNlbGYpOworCWNhc2UgTUFQX19WQVJJQUJMRToKKwkJcmV0dXJuIGVsZl9zeW1fX2lzX29iamVjdChzZWxmKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitzdGF0aWMgYm9vbCBlbGZfc2VjX19pc19hKEdFbGZfU2hkciAqc2VsZiwgRWxmX0RhdGEgKnNlY3N0cnMsIGVudW0gbWFwX3R5cGUgdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIE1BUF9fRlVOQ1RJT046CisJCXJldHVybiBlbGZfc2VjX19pc190ZXh0KHNlbGYsIHNlY3N0cnMpOworCWNhc2UgTUFQX19WQVJJQUJMRToKKwkJcmV0dXJuIGVsZl9zZWNfX2lzX2RhdGEoc2VsZiwgc2Vjc3Rycyk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKwogc3RhdGljIGludCBkc29fX2xvYWRfc3ltKHN0cnVjdCBkc28gKnNlbGYsIHN0cnVjdCBtYXAgKm1hcCwKLQkJCSBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBmZCwKKwkJCSBzdHJ1Y3QgbWFwX2dyb3VwcyAqbWcsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBmZCwKIAkJCSBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyLCBpbnQga2VybmVsLCBpbnQga21vZHVsZSkKIHsKIAlzdHJ1Y3QgbWFwICpjdXJyX21hcCA9IG1hcDsKQEAgLTgxOCw3ICs5NDYsNyBAQAogCQlpbnQgaXNfbGFiZWwgPSBlbGZfc3ltX19pc19sYWJlbCgmc3ltKTsKIAkJY29uc3QgY2hhciAqc2VjdGlvbl9uYW1lOwogCi0JCWlmICghaXNfbGFiZWwgJiYgIWVsZl9zeW1fX2lzX2Z1bmN0aW9uKCZzeW0pKQorCQlpZiAoIWlzX2xhYmVsICYmICFlbGZfc3ltX19pc19hKCZzeW0sIG1hcC0+dHlwZSkpCiAJCQljb250aW51ZTsKIAogCQlzZWMgPSBlbGZfZ2V0c2NuKGVsZiwgc3ltLnN0X3NobmR4KTsKQEAgLTgyNyw3ICs5NTUsNyBAQAogCiAJCWdlbGZfZ2V0c2hkcihzZWMsICZzaGRyKTsKIAotCQlpZiAoaXNfbGFiZWwgJiYgIWVsZl9zZWNfX2lzX3RleHQoJnNoZHIsIHNlY3N0cnMpKQorCQlpZiAoaXNfbGFiZWwgJiYgIWVsZl9zZWNfX2lzX2EoJnNoZHIsIHNlY3N0cnMsIG1hcC0+dHlwZSkpCiAJCQljb250aW51ZTsKIAogCQllbGZfbmFtZSA9IGVsZl9zeW1fX25hbWUoJnN5bSwgc3ltc3Rycyk7CkBAIC04NDksNyArOTc3LDcgQEAKIAkJCXNucHJpbnRmKGRzb19uYW1lLCBzaXplb2YoZHNvX25hbWUpLAogCQkJCSAiJXMlcyIsIHNlbGYtPnNob3J0X25hbWUsIHNlY3Rpb25fbmFtZSk7CiAKLQkJCWN1cnJfbWFwID0gdGhyZWFkX19maW5kX21hcF9ieV9uYW1lKHRocmVhZCwgZHNvX25hbWUpOworCQkJY3Vycl9tYXAgPSBtYXBfZ3JvdXBzX19maW5kX2J5X25hbWUobWcsIG1hcC0+dHlwZSwgZHNvX25hbWUpOwogCQkJaWYgKGN1cnJfbWFwID09IE5VTEwpIHsKIAkJCQl1NjQgc3RhcnQgPSBzeW0uc3RfdmFsdWU7CiAKQEAgLTg2OCw3ICs5OTYsNyBAQAogCQkJCWN1cnJfbWFwLT5tYXBfaXAgPSBpZGVudGl0eV9fbWFwX2lwOwogCQkJCWN1cnJfbWFwLT51bm1hcF9pcCA9IGlkZW50aXR5X19tYXBfaXA7CiAJCQkJY3Vycl9kc28tPm9yaWdpbiA9IERTT19fT1JJR19LRVJORUw7Ci0JCQkJX190aHJlYWRfX2luc2VydF9tYXAoa3RocmVhZCwgY3Vycl9tYXApOworCQkJCW1hcF9ncm91cHNfX2luc2VydChrbWFwcywgY3Vycl9tYXApOwogCQkJCWRzb3NfX2FkZCgmZHNvc19fa2VybmVsLCBjdXJyX2Rzbyk7CiAJCQl9IGVsc2UKIAkJCQljdXJyX2RzbyA9IGN1cnJfbWFwLT5kc287CkBAIC05MzgsOCArMTA2Niw5IEBACiAKIGJvb2wgZHNvc19fcmVhZF9idWlsZF9pZHModm9pZCkKIHsKLQlyZXR1cm4gX19kc29zX19yZWFkX2J1aWxkX2lkcygmZHNvc19fa2VybmVsKSB8fAotCSAgICAgICBfX2Rzb3NfX3JlYWRfYnVpbGRfaWRzKCZkc29zX191c2VyKTsKKwlib29sIGtidWlsZGlkcyA9IF9fZHNvc19fcmVhZF9idWlsZF9pZHMoJmRzb3NfX2tlcm5lbCksCisJICAgICB1YnVpbGRpZHMgPSBfX2Rzb3NfX3JlYWRfYnVpbGRfaWRzKCZkc29zX191c2VyKTsKKwlyZXR1cm4ga2J1aWxkaWRzIHx8IHVidWlsZGlkczsKIH0KIAogLyoKQEAgLTEwOTMsNyArMTIyMiw3IEBACiAJZHNvX19zZXRfbG9hZGVkKHNlbGYsIG1hcC0+dHlwZSk7CiAKIAlpZiAoc2VsZi0+a2VybmVsKQotCQlyZXR1cm4gZHNvX19sb2FkX2tlcm5lbF9zeW0oc2VsZiwgbWFwLCBrdGhyZWFkLCBmaWx0ZXIpOworCQlyZXR1cm4gZHNvX19sb2FkX2tlcm5lbF9zeW0oc2VsZiwgbWFwLCBrbWFwcywgZmlsdGVyKTsKIAogCW5hbWUgPSBtYWxsb2Moc2l6ZSk7CiAJaWYgKCFuYW1lKQpAQCAtMTE3OSwxMSArMTMwOCwxMiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbWFwICp0aHJlYWRfX2ZpbmRfbWFwX2J5X25hbWUoc3RydWN0IHRocmVhZCAqc2VsZiwgY2hhciAqbmFtZSkKK3N0cnVjdCBtYXAgKm1hcF9ncm91cHNfX2ZpbmRfYnlfbmFtZShzdHJ1Y3QgbWFwX2dyb3VwcyAqc2VsZiwKKwkJCQkgICAgIGVudW0gbWFwX3R5cGUgdHlwZSwgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqbmQ7CiAKLQlmb3IgKG5kID0gcmJfZmlyc3QoJnNlbGYtPm1hcHNbTUFQX19GVU5DVElPTl0pOyBuZDsgbmQgPSByYl9uZXh0KG5kKSkgeworCWZvciAobmQgPSByYl9maXJzdCgmc2VsZi0+bWFwc1t0eXBlXSk7IG5kOyBuZCA9IHJiX25leHQobmQpKSB7CiAJCXN0cnVjdCBtYXAgKm1hcCA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3QgbWFwLCByYl9ub2RlKTsKIAogCQlpZiAobWFwLT5kc28gJiYgc3RyY21wKG1hcC0+ZHNvLT5uYW1lLCBuYW1lKSA9PSAwKQpAQCAtMTIyNyw3ICsxMzU3LDcgQEAKIAkJCQkgKGludCkoZG90IC0gZGVudC0+ZF9uYW1lKSwgZGVudC0+ZF9uYW1lKTsKIAogCQkJc3RyeGZyY2hhcihkc29fbmFtZSwgJy0nLCAnXycpOwotCQkJbWFwID0gdGhyZWFkX19maW5kX21hcF9ieV9uYW1lKGt0aHJlYWQsIGRzb19uYW1lKTsKKwkJCW1hcCA9IG1hcF9ncm91cHNfX2ZpbmRfYnlfbmFtZShrbWFwcywgTUFQX19GVU5DVElPTiwgZHNvX25hbWUpOwogCQkJaWYgKG1hcCA9PSBOVUxMKQogCQkJCWNvbnRpbnVlOwogCkBAIC0xMjgwLDcgKzE0MTAsNyBAQAogCXJldHVybiBzZWxmOwogfQogCi1zdGF0aWMgaW50IHRocmVhZF9fY3JlYXRlX21vZHVsZV9tYXBzKHN0cnVjdCB0aHJlYWQgKnNlbGYpCitzdGF0aWMgaW50IG1hcF9ncm91cHNfX2NyZWF0ZV9tb2R1bGVfbWFwcyhzdHJ1Y3QgbWFwX2dyb3VwcyAqc2VsZikKIHsKIAljaGFyICpsaW5lID0gTlVMTDsKIAlzaXplX3QgbjsKQEAgLTEzMzcsNyArMTQ2Nyw3IEBACiAJCQlkc28tPmhhc19idWlsZF9pZCA9IHRydWU7CiAKIAkJZHNvLT5vcmlnaW4gPSBEU09fX09SSUdfS01PRFVMRTsKLQkJX190aHJlYWRfX2luc2VydF9tYXAoc2VsZiwgbWFwKTsKKwkJbWFwX2dyb3Vwc19faW5zZXJ0KHNlbGYsIG1hcCk7CiAJCWRzb3NfX2FkZCgmZHNvc19fa2VybmVsLCBkc28pOwogCX0KIApAQCAtMTM1Miw3ICsxNDgyLDggQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyBpbnQgZHNvX19sb2FkX3ZtbGludXgoc3RydWN0IGRzbyAqc2VsZiwgc3RydWN0IG1hcCAqbWFwLCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsCitzdGF0aWMgaW50IGRzb19fbG9hZF92bWxpbnV4KHN0cnVjdCBkc28gKnNlbGYsIHN0cnVjdCBtYXAgKm1hcCwKKwkJCSAgICAgc3RydWN0IG1hcF9ncm91cHMgKm1nLAogCQkJICAgICBjb25zdCBjaGFyICp2bWxpbnV4LCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQogewogCWludCBlcnIgPSAtMSwgZmQ7CkBAIC0xMzg2LDE0ICsxNTE3LDE0IEBACiAJCXJldHVybiAtMTsKIAogCWRzb19fc2V0X2xvYWRlZChzZWxmLCBtYXAtPnR5cGUpOwotCWVyciA9IGRzb19fbG9hZF9zeW0oc2VsZiwgbWFwLCB0aHJlYWQsIHNlbGYtPmxvbmdfbmFtZSwgZmQsIGZpbHRlciwgMSwgMCk7CisJZXJyID0gZHNvX19sb2FkX3N5bShzZWxmLCBtYXAsIG1nLCBzZWxmLT5sb25nX25hbWUsIGZkLCBmaWx0ZXIsIDEsIDApOwogCWNsb3NlKGZkKTsKIAogCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgZHNvX19sb2FkX2tlcm5lbF9zeW0oc3RydWN0IGRzbyAqc2VsZiwgc3RydWN0IG1hcCAqbWFwLAotCQkJCXN0cnVjdCB0aHJlYWQgKnRocmVhZCwgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKKwkJCQlzdHJ1Y3QgbWFwX2dyb3VwcyAqbWcsIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCiB7CiAJaW50IGVycjsKIAlib29sIGlzX2thbGxzeW1zOwpAQCAtMTQwMyw3ICsxNTM0LDcgQEAKIAkJcHJfZGVidWcoIkxvb2tpbmcgYXQgdGhlIHZtbGludXhfcGF0aCAoJWQgZW50cmllcyBsb25nKVxuIiwKIAkJCSB2bWxpbnV4X3BhdGhfX25yX2VudHJpZXMpOwogCQlmb3IgKGkgPSAwOyBpIDwgdm1saW51eF9wYXRoX19ucl9lbnRyaWVzOyArK2kpIHsKLQkJCWVyciA9IGRzb19fbG9hZF92bWxpbnV4KHNlbGYsIG1hcCwgdGhyZWFkLAorCQkJZXJyID0gZHNvX19sb2FkX3ZtbGludXgoc2VsZiwgbWFwLCBtZywKIAkJCQkJCXZtbGludXhfcGF0aFtpXSwgZmlsdGVyKTsKIAkJCWlmIChlcnIgPiAwKSB7CiAJCQkJcHJfZGVidWcoIlVzaW5nICVzIGZvciBzeW1ib2xzXG4iLApAQCAtMTQxOSwxMiArMTU1MCwxMiBAQAogCWlmIChpc19rYWxsc3ltcykKIAkJZ290byBkb19rYWxsc3ltczsKIAotCWVyciA9IGRzb19fbG9hZF92bWxpbnV4KHNlbGYsIG1hcCwgdGhyZWFkLCBzZWxmLT5sb25nX25hbWUsIGZpbHRlcik7CisJZXJyID0gZHNvX19sb2FkX3ZtbGludXgoc2VsZiwgbWFwLCBtZywgc2VsZi0+bG9uZ19uYW1lLCBmaWx0ZXIpOwogCWlmIChlcnIgPD0gMCkgewogCQlwcl9pbmZvKCJUaGUgZmlsZSAlcyBjYW5ub3QgYmUgdXNlZCwgIgogCQkJInRyeWluZyB0byB1c2UgL3Byb2Mva2FsbHN5bXMuLi4iLCBzZWxmLT5sb25nX25hbWUpOwogZG9fa2FsbHN5bXM6Ci0JCWVyciA9IGRzb19fbG9hZF9rYWxsc3ltcyhzZWxmLCBtYXAsIHRocmVhZCwgZmlsdGVyKTsKKwkJZXJyID0gZHNvX19sb2FkX2thbGxzeW1zKHNlbGYsIG1hcCwgbWcsIGZpbHRlcik7CiAJCWlmIChlcnIgPiAwICYmICFpc19rYWxsc3ltcykKICAgICAgICAgICAgICAgICAgICAgICAgIGRzb19fc2V0X2xvbmdfbmFtZShzZWxmLCBzdHJkdXAoIltrZXJuZWwua2FsbHN5bXNdIikpOwogCX0KQEAgLTE1MDcsNDIgKzE2MzgsNTkgQEAKIAkJX19kc29zX19mcHJpbnRmX2J1aWxkaWQoJmRzb3NfX3VzZXIsIGZwKSk7CiB9CiAKLXN0YXRpYyBpbnQgdGhyZWFkX19jcmVhdGVfa2VybmVsX21hcChzdHJ1Y3QgdGhyZWFkICpzZWxmLCBjb25zdCBjaGFyICp2bWxpbnV4KQorc3RhdGljIHN0cnVjdCBkc28gKmRzb3NfX2NyZWF0ZV9rZXJuZWwoIGNvbnN0IGNoYXIgKnZtbGludXgpCiB7Ci0Jc3RydWN0IG1hcCAqa21hcDsKIAlzdHJ1Y3QgZHNvICprZXJuZWwgPSBkc29fX25ldyh2bWxpbnV4ID86ICJba2VybmVsLmthbGxzeW1zXSIpOwogCiAJaWYgKGtlcm5lbCA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CisJCXJldHVybiBOVUxMOwogCi0Ja21hcCA9IG1hcF9fbmV3MigwLCBrZXJuZWwsIE1BUF9fRlVOQ1RJT04pOwotCWlmIChrbWFwID09IE5VTEwpCi0JCWdvdG8gb3V0X2RlbGV0ZV9rZXJuZWxfZHNvOwotCi0Ja21hcC0+bWFwX2lwCSAgID0ga21hcC0+dW5tYXBfaXAgPSBpZGVudGl0eV9fbWFwX2lwOwogCWtlcm5lbC0+c2hvcnRfbmFtZSA9ICJba2VybmVsXSI7CiAJa2VybmVsLT5rZXJuZWwJICAgPSAxOwogCiAJdmRzbyA9IGRzb19fbmV3KCJbdmRzb10iKTsKIAlpZiAodmRzbyA9PSBOVUxMKQotCQlnb3RvIG91dF9kZWxldGVfa2VybmVsX21hcDsKKwkJZ290byBvdXRfZGVsZXRlX2tlcm5lbF9kc287CiAJZHNvX19zZXRfbG9hZGVkKHZkc28sIE1BUF9fRlVOQ1RJT04pOwogCiAJaWYgKHN5c2ZzX19yZWFkX2J1aWxkX2lkKCIvc3lzL2tlcm5lbC9ub3RlcyIsIGtlcm5lbC0+YnVpbGRfaWQsCiAJCQkJIHNpemVvZihrZXJuZWwtPmJ1aWxkX2lkKSkgPT0gMCkKIAkJa2VybmVsLT5oYXNfYnVpbGRfaWQgPSB0cnVlOwogCi0JX190aHJlYWRfX2luc2VydF9tYXAoc2VsZiwga21hcCk7CiAJZHNvc19fYWRkKCZkc29zX19rZXJuZWwsIGtlcm5lbCk7CiAJZHNvc19fYWRkKCZkc29zX191c2VyLCB2ZHNvKTsKIAotCXJldHVybiAwOworCXJldHVybiBrZXJuZWw7CiAKLW91dF9kZWxldGVfa2VybmVsX21hcDoKLQltYXBfX2RlbGV0ZShrbWFwKTsKIG91dF9kZWxldGVfa2VybmVsX2RzbzoKIAlkc29fX2RlbGV0ZShrZXJuZWwpOwotCXJldHVybiAtMTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBtYXBfZ3JvdXBzX19jcmVhdGVfa2VybmVsX21hcHMoc3RydWN0IG1hcF9ncm91cHMgKnNlbGYsIGNvbnN0IGNoYXIgKnZtbGludXgpCit7CisJc3RydWN0IG1hcCAqZnVuY3Rpb25zLCAqdmFyaWFibGVzOworCXN0cnVjdCBkc28gKmtlcm5lbCA9IGRzb3NfX2NyZWF0ZV9rZXJuZWwodm1saW51eCk7CisKKwlpZiAoa2VybmVsID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWZ1bmN0aW9ucyA9IG1hcF9fbmV3MigwLCBrZXJuZWwsIE1BUF9fRlVOQ1RJT04pOworCWlmIChmdW5jdGlvbnMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJdmFyaWFibGVzID0gbWFwX19uZXcyKDAsIGtlcm5lbCwgTUFQX19WQVJJQUJMRSk7CisJaWYgKHZhcmlhYmxlcyA9PSBOVUxMKSB7CisJCW1hcF9fZGVsZXRlKGZ1bmN0aW9ucyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlmdW5jdGlvbnMtPm1hcF9pcCA9IGZ1bmN0aW9ucy0+dW5tYXBfaXAgPQorCQl2YXJpYWJsZXMtPm1hcF9pcCA9IHZhcmlhYmxlcy0+dW5tYXBfaXAgPSBpZGVudGl0eV9fbWFwX2lwOworCW1hcF9ncm91cHNfX2luc2VydChzZWxmLCBmdW5jdGlvbnMpOworCW1hcF9ncm91cHNfX2luc2VydChzZWxmLCB2YXJpYWJsZXMpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHZtbGludXhfcGF0aF9fZXhpdCh2b2lkKQpAQCAtMTYwNiwyMyArMTc1NCwyNiBAQAogCiAJZWxmX3ZlcnNpb24oRVZfQ1VSUkVOVCk7CiAJc3ltYm9sX19wcml2X3NpemUgPSBwY29uZi0+cHJpdl9zaXplOwotCXRocmVhZF9faW5pdChrdGhyZWFkLCAwKTsKKwlpZiAocGNvbmYtPnNvcnRfYnlfbmFtZSkKKwkJc3ltYm9sX19wcml2X3NpemUgKz0gKHNpemVvZihzdHJ1Y3Qgc3ltYm9sX25hbWVfcmJfbm9kZSkgLQorCQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc3ltYm9sKSk7CisJbWFwX2dyb3Vwc19faW5pdChrbWFwcyk7CiAKIAlpZiAocGNvbmYtPnRyeV92bWxpbnV4X3BhdGggJiYgdm1saW51eF9wYXRoX19pbml0KCkgPCAwKQogCQlyZXR1cm4gLTE7CiAKLQlpZiAodGhyZWFkX19jcmVhdGVfa2VybmVsX21hcChrdGhyZWFkLCBwY29uZi0+dm1saW51eF9uYW1lKSA8IDApIHsKKwlpZiAobWFwX2dyb3Vwc19fY3JlYXRlX2tlcm5lbF9tYXBzKGttYXBzLCBwY29uZi0+dm1saW51eF9uYW1lKSA8IDApIHsKIAkJdm1saW51eF9wYXRoX19leGl0KCk7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlrdGhyZWFkLT51c2VfbW9kdWxlcyA9IHBjb25mLT51c2VfbW9kdWxlczsKLQlpZiAocGNvbmYtPnVzZV9tb2R1bGVzICYmIHRocmVhZF9fY3JlYXRlX21vZHVsZV9tYXBzKGt0aHJlYWQpIDwgMCkKKwlrbWFwcy0+dXNlX21vZHVsZXMgPSBwY29uZi0+dXNlX21vZHVsZXM7CisJaWYgKHBjb25mLT51c2VfbW9kdWxlcyAmJiBtYXBfZ3JvdXBzX19jcmVhdGVfbW9kdWxlX21hcHMoa21hcHMpIDwgMCkKIAkJcHJfZGVidWcoIkZhaWxlZCB0byBsb2FkIGxpc3Qgb2YgbW9kdWxlcyBpbiB1c2UsICIKIAkJCSAiY29udGludWluZy4uLlxuIik7CiAJLyoKIAkgKiBOb3cgdGhhdCB3ZSBoYXZlIGFsbCB0aGUgbWFwcyBjcmVhdGVkLCBqdXN0IHNldCB0aGUgLT5lbmQgb2YgdGhlbToKIAkgKi8KLQl0aHJlYWRfX2ZpeHVwX21hcHNfZW5kKGt0aHJlYWQpOworCW1hcF9ncm91cHNfX2ZpeHVwX2VuZChrbWFwcyk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc3ltYm9sLmggYi90b29scy9wZXJmL3V0aWwvc3ltYm9sLmgKaW5kZXggMTcwMDNlZi4uY2Y5OWY4OCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuaApAQCAtNTIsNyArNTIsOCBAQAogc3RydWN0IHN5bWJvbF9jb25mIHsKIAl1bnNpZ25lZCBzaG9ydAlwcml2X3NpemU7CiAJYm9vbAkJdHJ5X3ZtbGludXhfcGF0aCwKLQkJCXVzZV9tb2R1bGVzOworCQkJdXNlX21vZHVsZXMsCisJCQlzb3J0X2J5X25hbWU7CiAJY29uc3QgY2hhcgkqdm1saW51eF9uYW1lOwogfTsKIApAQCAtNzQsMTMgKzc1LDEzIEBACiBzdHJ1Y3QgZHNvIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CiAJc3RydWN0IHJiX3Jvb3QJIHN5bWJvbHNbTUFQX19OUl9UWVBFU107Ci0Jc3RydWN0IHN5bWJvbCAgICAqKCpmaW5kX3N5bWJvbCkoc3RydWN0IGRzbyAqc2VsZiwKLQkJCQkJIGVudW0gbWFwX3R5cGUgdHlwZSwgdTY0IGFkZHIpOworCXN0cnVjdCByYl9yb290CSBzeW1ib2xfbmFtZXNbTUFQX19OUl9UWVBFU107CiAJdTgJCSBhZGp1c3Rfc3ltYm9sczoxOwogCXU4CQkgc2xlbl9jYWxjdWxhdGVkOjE7CiAJdTgJCSBoYXNfYnVpbGRfaWQ6MTsKIAl1OAkJIGtlcm5lbDoxOwogCXVuc2lnbmVkIGNoYXIJIG9yaWdpbjsKKwl1OAkJIHNvcnRlZF9ieV9uYW1lOwogCXU4CQkgbG9hZGVkOwogCXU4CQkgYnVpbGRfaWRbQlVJTERfSURfU0laRV07CiAJdTE2CQkgbG9uZ19uYW1lX2xlbjsKQEAgLTkzLDYgKzk0LDkgQEAKIHZvaWQgZHNvX19kZWxldGUoc3RydWN0IGRzbyAqc2VsZik7CiAKIGJvb2wgZHNvX19sb2FkZWQoY29uc3Qgc3RydWN0IGRzbyAqc2VsZiwgZW51bSBtYXBfdHlwZSB0eXBlKTsKK2Jvb2wgZHNvX19zb3J0ZWRfYnlfbmFtZShjb25zdCBzdHJ1Y3QgZHNvICpzZWxmLCBlbnVtIG1hcF90eXBlIHR5cGUpOworCit2b2lkIGRzb19fc29ydF9ieV9uYW1lKHN0cnVjdCBkc28gKnNlbGYsIGVudW0gbWFwX3R5cGUgdHlwZSk7CiAKIHN0cnVjdCBkc28gKmRzb3NfX2ZpbmRuZXcoY29uc3QgY2hhciAqbmFtZSk7CiBpbnQgZHNvX19sb2FkKHN0cnVjdCBkc28gKnNlbGYsIHN0cnVjdCBtYXAgKm1hcCwgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7CkBAIC0xMDMsNiArMTA3LDkgQEAKIHNpemVfdCBkc29fX2ZwcmludGYoc3RydWN0IGRzbyAqc2VsZiwgZW51bSBtYXBfdHlwZSB0eXBlLCBGSUxFICpmcCk7CiBjaGFyIGRzb19fc3ltdGFiX29yaWdpbihjb25zdCBzdHJ1Y3QgZHNvICpzZWxmKTsKIHZvaWQgZHNvX19zZXRfYnVpbGRfaWQoc3RydWN0IGRzbyAqc2VsZiwgdm9pZCAqYnVpbGRfaWQpOworc3RydWN0IHN5bWJvbCAqZHNvX19maW5kX3N5bWJvbChzdHJ1Y3QgZHNvICpzZWxmLCBlbnVtIG1hcF90eXBlIHR5cGUsIHU2NCBhZGRyKTsKK3N0cnVjdCBzeW1ib2wgKmRzb19fZmluZF9zeW1ib2xfYnlfbmFtZShzdHJ1Y3QgZHNvICpzZWxmLCBlbnVtIG1hcF90eXBlIHR5cGUsCisJCQkJCWNvbnN0IGNoYXIgKm5hbWUpOwogCiBpbnQgZmlsZW5hbWVfX3JlYWRfYnVpbGRfaWQoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJmLCBzaXplX3Qgc2l6ZSk7CiBpbnQgc3lzZnNfX3JlYWRfYnVpbGRfaWQoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJmLCBzaXplX3Qgc2l6ZSk7CkBAIC0xMTMsOCArMTIwLDggQEAKIAogaW50IHN5bWJvbF9faW5pdChzdHJ1Y3Qgc3ltYm9sX2NvbmYgKmNvbmYpOwogCi1zdHJ1Y3QgdGhyZWFkOwotc3RydWN0IHRocmVhZCAqa3RocmVhZDsKK3N0cnVjdCBtYXBfZ3JvdXBzOworc3RydWN0IG1hcF9ncm91cHMgKmttYXBzOwogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgZHNvc19fdXNlciwgZHNvc19fa2VybmVsOwogZXh0ZXJuIHN0cnVjdCBkc28gKnZkc287CiAjZW5kaWYgLyogX19QRVJGX1NZTUJPTCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3RocmVhZC5jIGIvdG9vbHMvcGVyZi91dGlsL3RocmVhZC5jCmluZGV4IDYwM2Y1NjEuLmI2OGEwMGUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC90aHJlYWQuYworKysgYi90b29scy9wZXJmL3V0aWwvdGhyZWFkLmMKQEAgLTksMTEgKzksOSBAQAogc3RhdGljIHN0cnVjdCByYl9yb290IHRocmVhZHM7CiBzdGF0aWMgc3RydWN0IHRocmVhZCAqbGFzdF9tYXRjaDsKIAotdm9pZCB0aHJlYWRfX2luaXQoc3RydWN0IHRocmVhZCAqc2VsZiwgcGlkX3QgcGlkKQordm9pZCBtYXBfZ3JvdXBzX19pbml0KHN0cnVjdCBtYXBfZ3JvdXBzICpzZWxmKQogewogCWludCBpOwotCXNlbGYtPnBpZCA9IHBpZDsKLQlzZWxmLT5jb21tID0gTlVMTDsKIAlmb3IgKGkgPSAwOyBpIDwgTUFQX19OUl9UWVBFUzsgKytpKSB7CiAJCXNlbGYtPm1hcHNbaV0gPSBSQl9ST09UOwogCQlJTklUX0xJU1RfSEVBRCgmc2VsZi0+cmVtb3ZlZF9tYXBzW2ldKTsKQEAgLTI1LDcgKzIzLDggQEAKIAlzdHJ1Y3QgdGhyZWFkICpzZWxmID0gemFsbG9jKHNpemVvZigqc2VsZikpOwogCiAJaWYgKHNlbGYgIT0gTlVMTCkgewotCQl0aHJlYWRfX2luaXQoc2VsZiwgcGlkKTsKKwkJbWFwX2dyb3Vwc19faW5pdCgmc2VsZi0+bWcpOworCQlzZWxmLT5waWQgPSBwaWQ7CiAJCXNlbGYtPmNvbW0gPSBtYWxsb2MoMzIpOwogCQlpZiAoc2VsZi0+Y29tbSkKIAkJCXNucHJpbnRmKHNlbGYtPmNvbW0sIDMyLCAiOiVkIiwgc2VsZi0+cGlkKTsKQEAgLTU1LDEwICs1NCwxMSBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqbWFwX3R5cGVfX25hbWVbTUFQX19OUl9UWVBFU10gPSB7CiAJW01BUF9fRlVOQ1RJT05dID0gIkZ1bmN0aW9ucyIsCisJW01BUF9fVkFSSUFCTEVdID0gIlZhcmlhYmxlcyIsCiB9OwogCi1zdGF0aWMgc2l6ZV90IF9fdGhyZWFkX19mcHJpbnRmX21hcHMoc3RydWN0IHRocmVhZCAqc2VsZiwKLQkJCQkgICAgIGVudW0gbWFwX3R5cGUgdHlwZSwgRklMRSAqZnApCitzdGF0aWMgc2l6ZV90IF9fbWFwX2dyb3Vwc19fZnByaW50Zl9tYXBzKHN0cnVjdCBtYXBfZ3JvdXBzICpzZWxmLAorCQkJCQkgZW51bSBtYXBfdHlwZSB0eXBlLCBGSUxFICpmcCkKIHsKIAlzaXplX3QgcHJpbnRlZCA9IGZwcmludGYoZnAsICIlczpcbiIsIG1hcF90eXBlX19uYW1lW3R5cGVdKTsKIAlzdHJ1Y3QgcmJfbm9kZSAqbmQ7CkBAIC03NiwxNiArNzYsMTYgQEAKIAlyZXR1cm4gcHJpbnRlZDsKIH0KIAotc2l6ZV90IHRocmVhZF9fZnByaW50Zl9tYXBzKHN0cnVjdCB0aHJlYWQgKnNlbGYsIEZJTEUgKmZwKQorc2l6ZV90IG1hcF9ncm91cHNfX2ZwcmludGZfbWFwcyhzdHJ1Y3QgbWFwX2dyb3VwcyAqc2VsZiwgRklMRSAqZnApCiB7CiAJc2l6ZV90IHByaW50ZWQgPSAwLCBpOwogCWZvciAoaSA9IDA7IGkgPCBNQVBfX05SX1RZUEVTOyArK2kpCi0JCXByaW50ZWQgKz0gX190aHJlYWRfX2ZwcmludGZfbWFwcyhzZWxmLCBpLCBmcCk7CisJCXByaW50ZWQgKz0gX19tYXBfZ3JvdXBzX19mcHJpbnRmX21hcHMoc2VsZiwgaSwgZnApOwogCXJldHVybiBwcmludGVkOwogfQogCi1zdGF0aWMgc2l6ZV90IF9fdGhyZWFkX19mcHJpbnRmX3JlbW92ZWRfbWFwcyhzdHJ1Y3QgdGhyZWFkICpzZWxmLAotCQkJCQkgICAgIGVudW0gbWFwX3R5cGUgdHlwZSwgRklMRSAqZnApCitzdGF0aWMgc2l6ZV90IF9fbWFwX2dyb3Vwc19fZnByaW50Zl9yZW1vdmVkX21hcHMoc3RydWN0IG1hcF9ncm91cHMgKnNlbGYsCisJCQkJCQkgZW51bSBtYXBfdHlwZSB0eXBlLCBGSUxFICpmcCkKIHsKIAlzdHJ1Y3QgbWFwICpwb3M7CiAJc2l6ZV90IHByaW50ZWQgPSAwOwpAQCAtMTAxLDIwICsxMDEsMjUgQEAKIAlyZXR1cm4gcHJpbnRlZDsKIH0KIAotc3RhdGljIHNpemVfdCB0aHJlYWRfX2ZwcmludGZfcmVtb3ZlZF9tYXBzKHN0cnVjdCB0aHJlYWQgKnNlbGYsIEZJTEUgKmZwKQorc3RhdGljIHNpemVfdCBtYXBfZ3JvdXBzX19mcHJpbnRmX3JlbW92ZWRfbWFwcyhzdHJ1Y3QgbWFwX2dyb3VwcyAqc2VsZiwgRklMRSAqZnApCiB7CiAJc2l6ZV90IHByaW50ZWQgPSAwLCBpOwogCWZvciAoaSA9IDA7IGkgPCBNQVBfX05SX1RZUEVTOyArK2kpCi0JCXByaW50ZWQgKz0gX190aHJlYWRfX2ZwcmludGZfcmVtb3ZlZF9tYXBzKHNlbGYsIGksIGZwKTsKKwkJcHJpbnRlZCArPSBfX21hcF9ncm91cHNfX2ZwcmludGZfcmVtb3ZlZF9tYXBzKHNlbGYsIGksIGZwKTsKIAlyZXR1cm4gcHJpbnRlZDsKIH0KIAorc3RhdGljIHNpemVfdCBtYXBfZ3JvdXBzX19mcHJpbnRmKHN0cnVjdCBtYXBfZ3JvdXBzICpzZWxmLCBGSUxFICpmcCkKK3sKKwlzaXplX3QgcHJpbnRlZCA9IG1hcF9ncm91cHNfX2ZwcmludGZfbWFwcyhzZWxmLCBmcCk7CisJcHJpbnRlZCArPSBmcHJpbnRmKGZwLCAiUmVtb3ZlZCBtYXBzOlxuIik7CisJcmV0dXJuIHByaW50ZWQgKyBtYXBfZ3JvdXBzX19mcHJpbnRmX3JlbW92ZWRfbWFwcyhzZWxmLCBmcCk7Cit9CisKIHN0YXRpYyBzaXplX3QgdGhyZWFkX19mcHJpbnRmKHN0cnVjdCB0aHJlYWQgKnNlbGYsIEZJTEUgKmZwKQogewotCXNpemVfdCBwcmludGVkID0gZnByaW50ZihmcCwgIlRocmVhZCAlZCAlc1xuIiwgc2VsZi0+cGlkLCBzZWxmLT5jb21tKTsKLQlwcmludGVkICs9IHRocmVhZF9fZnByaW50Zl9yZW1vdmVkX21hcHMoc2VsZiwgZnApOwotCXByaW50ZWQgKz0gZnByaW50ZihmcCwgIlJlbW92ZWQgbWFwczpcbiIpOwotCXJldHVybiBwcmludGVkICsgdGhyZWFkX19mcHJpbnRmX3JlbW92ZWRfbWFwcyhzZWxmLCBmcCk7CisJcmV0dXJuIGZwcmludGYoZnAsICJUaHJlYWQgJWQgJXNcbiIsIHNlbGYtPnBpZCwgc2VsZi0+Y29tbSkgKworCSAgICAgICBtYXBfZ3JvdXBzX19mcHJpbnRmKCZzZWxmLT5tZywgZnApOwogfQogCiBzdHJ1Y3QgdGhyZWFkICp0aHJlYWRzX19maW5kbmV3KHBpZF90IHBpZCkKQEAgLTE2OCw3ICsxNzMsOCBAQAogCXJldHVybiB0aHJlYWQ7CiB9CiAKLXN0YXRpYyB2b2lkIHRocmVhZF9fcmVtb3ZlX292ZXJsYXBwaW5ncyhzdHJ1Y3QgdGhyZWFkICpzZWxmLCBzdHJ1Y3QgbWFwICptYXApCitzdGF0aWMgdm9pZCBtYXBfZ3JvdXBzX19yZW1vdmVfb3ZlcmxhcHBpbmdzKHN0cnVjdCBtYXBfZ3JvdXBzICpzZWxmLAorCQkJCQkgICAgc3RydWN0IG1hcCAqbWFwKQogewogCXN0cnVjdCByYl9yb290ICpyb290ID0gJnNlbGYtPm1hcHNbbWFwLT50eXBlXTsKIAlzdHJ1Y3QgcmJfbm9kZSAqbmV4dCA9IHJiX2ZpcnN0KHJvb3QpOwpAQCAtMjM4LDEyICsyNDQsMTUgQEAKIAogdm9pZCB0aHJlYWRfX2luc2VydF9tYXAoc3RydWN0IHRocmVhZCAqc2VsZiwgc3RydWN0IG1hcCAqbWFwKQogewotCXRocmVhZF9fcmVtb3ZlX292ZXJsYXBwaW5ncyhzZWxmLCBtYXApOwotCW1hcHNfX2luc2VydCgmc2VsZi0+bWFwc1ttYXAtPnR5cGVdLCBtYXApOworCW1hcF9ncm91cHNfX3JlbW92ZV9vdmVybGFwcGluZ3MoJnNlbGYtPm1nLCBtYXApOworCW1hcF9ncm91cHNfX2luc2VydCgmc2VsZi0+bWcsIG1hcCk7CiB9CiAKLXN0YXRpYyBpbnQgdGhyZWFkX19jbG9uZV9tYXBzKHN0cnVjdCB0aHJlYWQgKnNlbGYsIHN0cnVjdCB0aHJlYWQgKnBhcmVudCwKLQkJCSAgICAgIGVudW0gbWFwX3R5cGUgdHlwZSkKKy8qCisgKiBYWFggVGhpcyBzaG91bGQgbm90IHJlYWxseSBfY29weV8gdGUgbWFwcywgYnV0IHJlZmNvdW50IHRoZW0uCisgKi8KK3N0YXRpYyBpbnQgbWFwX2dyb3Vwc19fY2xvbmUoc3RydWN0IG1hcF9ncm91cHMgKnNlbGYsCisJCQkgICAgIHN0cnVjdCBtYXBfZ3JvdXBzICpwYXJlbnQsIGVudW0gbWFwX3R5cGUgdHlwZSkKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqbmQ7CiAJZm9yIChuZCA9IHJiX2ZpcnN0KCZwYXJlbnQtPm1hcHNbdHlwZV0pOyBuZDsgbmQgPSByYl9uZXh0KG5kKSkgewpAQCAtMjUxLDcgKzI2MCw3IEBACiAJCXN0cnVjdCBtYXAgKm5ldyA9IG1hcF9fY2xvbmUobWFwKTsKIAkJaWYgKG5ldyA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCXRocmVhZF9faW5zZXJ0X21hcChzZWxmLCBuZXcpOworCQltYXBfZ3JvdXBzX19pbnNlcnQoc2VsZiwgbmV3KTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0yNjcsNyArMjc2LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFQX19OUl9UWVBFUzsgKytpKQotCQlpZiAodGhyZWFkX19jbG9uZV9tYXBzKHNlbGYsIHBhcmVudCwgaSkgPCAwKQorCQlpZiAobWFwX2dyb3Vwc19fY2xvbmUoJnNlbGYtPm1nLCAmcGFyZW50LT5tZywgaSkgPCAwKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJcmV0dXJuIDA7CiB9CkBAIC0yODYsMTEgKzI5NSwxMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0cnVjdCBzeW1ib2wgKnRocmVhZF9fZmluZF9zeW1ib2woc3RydWN0IHRocmVhZCAqc2VsZiwKLQkJCQkgICBlbnVtIG1hcF90eXBlIHR5cGUsIHU2NCBhZGRyLAotCQkJCSAgIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCitzdHJ1Y3Qgc3ltYm9sICptYXBfZ3JvdXBzX19maW5kX3N5bWJvbChzdHJ1Y3QgbWFwX2dyb3VwcyAqc2VsZiwKKwkJCQkgICAgICAgZW51bSBtYXBfdHlwZSB0eXBlLCB1NjQgYWRkciwKKwkJCQkgICAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKIHsKLQlzdHJ1Y3QgbWFwICptYXAgPSB0aHJlYWRfX2ZpbmRfbWFwKHNlbGYsIHR5cGUsIGFkZHIpOworCXN0cnVjdCBtYXAgKm1hcCA9IG1hcF9ncm91cHNfX2ZpbmQoc2VsZiwgdHlwZSwgYWRkcik7CiAKIAlpZiAobWFwICE9IE5VTEwpCiAJCXJldHVybiBtYXBfX2ZpbmRfc3ltYm9sKG1hcCwgbWFwLT5tYXBfaXAobWFwLCBhZGRyKSwgZmlsdGVyKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC90aHJlYWQuaCBiL3Rvb2xzL3BlcmYvdXRpbC90aHJlYWQuaAppbmRleCA2ODZkNmU5Li4xNzUxODAyIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvdGhyZWFkLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3RocmVhZC5oCkBAIC01LDUyICs1LDY2IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSAic3ltYm9sLmgiCiAKLXN0cnVjdCB0aHJlYWQgewotCXN0cnVjdCByYl9ub2RlCQlyYl9ub2RlOworc3RydWN0IG1hcF9ncm91cHMgewogCXN0cnVjdCByYl9yb290CQltYXBzW01BUF9fTlJfVFlQRVNdOwogCXN0cnVjdCBsaXN0X2hlYWQJcmVtb3ZlZF9tYXBzW01BUF9fTlJfVFlQRVNdOwotCXBpZF90CQkJcGlkOwogCWJvb2wJCQl1c2VfbW9kdWxlczsKK307CisKK3N0cnVjdCB0aHJlYWQgeworCXN0cnVjdCByYl9ub2RlCQlyYl9ub2RlOworCXN0cnVjdCBtYXBfZ3JvdXBzCW1nOworCXBpZF90CQkJcGlkOwogCWNoYXIJCQlzaG9ydG5hbWVbM107CiAJY2hhcgkJCSpjb21tOwogCWludAkJCWNvbW1fbGVuOwogfTsKIAotdm9pZCB0aHJlYWRfX2luaXQoc3RydWN0IHRocmVhZCAqc2VsZiwgcGlkX3QgcGlkKTsKK3ZvaWQgbWFwX2dyb3Vwc19faW5pdChzdHJ1Y3QgbWFwX2dyb3VwcyAqc2VsZik7CiBpbnQgdGhyZWFkX19zZXRfY29tbShzdHJ1Y3QgdGhyZWFkICpzZWxmLCBjb25zdCBjaGFyICpjb21tKTsKIGludCB0aHJlYWRfX2NvbW1fbGVuKHN0cnVjdCB0aHJlYWQgKnNlbGYpOwogc3RydWN0IHRocmVhZCAqdGhyZWFkc19fZmluZG5ldyhwaWRfdCBwaWQpOwogc3RydWN0IHRocmVhZCAqcmVnaXN0ZXJfaWRsZV90aHJlYWQodm9pZCk7CiB2b2lkIHRocmVhZF9faW5zZXJ0X21hcChzdHJ1Y3QgdGhyZWFkICpzZWxmLCBzdHJ1Y3QgbWFwICptYXApOwogaW50IHRocmVhZF9fZm9yayhzdHJ1Y3QgdGhyZWFkICpzZWxmLCBzdHJ1Y3QgdGhyZWFkICpwYXJlbnQpOwotc2l6ZV90IHRocmVhZF9fZnByaW50Zl9tYXBzKHN0cnVjdCB0aHJlYWQgKnNlbGYsIEZJTEUgKmZwKTsKK3NpemVfdCBtYXBfZ3JvdXBzX19mcHJpbnRmX21hcHMoc3RydWN0IG1hcF9ncm91cHMgKnNlbGYsIEZJTEUgKmZwKTsKIHNpemVfdCB0aHJlYWRzX19mcHJpbnRmKEZJTEUgKmZwKTsKIAogdm9pZCBtYXBzX19pbnNlcnQoc3RydWN0IHJiX3Jvb3QgKm1hcHMsIHN0cnVjdCBtYXAgKm1hcCk7CiBzdHJ1Y3QgbWFwICptYXBzX19maW5kKHN0cnVjdCByYl9yb290ICptYXBzLCB1NjQgYWRkcik7CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXBfZ3JvdXBzX19pbnNlcnQoc3RydWN0IG1hcF9ncm91cHMgKnNlbGYsIHN0cnVjdCBtYXAgKm1hcCkKK3sKKwkgbWFwc19faW5zZXJ0KCZzZWxmLT5tYXBzW21hcC0+dHlwZV0sIG1hcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1hcCAqbWFwX2dyb3Vwc19fZmluZChzdHJ1Y3QgbWFwX2dyb3VwcyAqc2VsZiwKKwkJCQkJICAgZW51bSBtYXBfdHlwZSB0eXBlLCB1NjQgYWRkcikKK3sKKwlyZXR1cm4gbWFwc19fZmluZCgmc2VsZi0+bWFwc1t0eXBlXSwgYWRkcik7Cit9CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG1hcCAqdGhyZWFkX19maW5kX21hcChzdHJ1Y3QgdGhyZWFkICpzZWxmLAogCQkJCQkgICBlbnVtIG1hcF90eXBlIHR5cGUsIHU2NCBhZGRyKQogewotCXJldHVybiBzZWxmID8gbWFwc19fZmluZCgmc2VsZi0+bWFwc1t0eXBlXSwgYWRkcikgOiBOVUxMOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX190aHJlYWRfX2luc2VydF9tYXAoc3RydWN0IHRocmVhZCAqc2VsZiwgc3RydWN0IG1hcCAqbWFwKQotewotCSBtYXBzX19pbnNlcnQoJnNlbGYtPm1hcHNbbWFwLT50eXBlXSwgbWFwKTsKKwlyZXR1cm4gc2VsZiA/IG1hcF9ncm91cHNfX2ZpbmQoJnNlbGYtPm1nLCB0eXBlLCBhZGRyKSA6IE5VTEw7CiB9CiAKIHZvaWQgdGhyZWFkX19maW5kX2FkZHJfbG9jYXRpb24oc3RydWN0IHRocmVhZCAqc2VsZiwgdTggY3B1bW9kZSwKIAkJCQllbnVtIG1hcF90eXBlIHR5cGUsIHU2NCBhZGRyLAogCQkJCXN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCwKIAkJCQlzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKTsKLXN0cnVjdCBzeW1ib2wgKnRocmVhZF9fZmluZF9zeW1ib2woc3RydWN0IHRocmVhZCAqc2VsZiwKLQkJCQkgICBlbnVtIG1hcF90eXBlIHR5cGUsIHU2NCBhZGRyLAotCQkJCSAgIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpOworc3RydWN0IHN5bWJvbCAqbWFwX2dyb3Vwc19fZmluZF9zeW1ib2woc3RydWN0IG1hcF9ncm91cHMgKnNlbGYsCisJCQkJICAgICAgIGVudW0gbWFwX3R5cGUgdHlwZSwgdTY0IGFkZHIsCisJCQkJICAgICAgIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzeW1ib2wgKgotdGhyZWFkX19maW5kX2Z1bmN0aW9uKHN0cnVjdCB0aHJlYWQgKnNlbGYsIHU2NCBhZGRyLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQorbWFwX2dyb3Vwc19fZmluZF9mdW5jdGlvbihzdHJ1Y3QgbWFwX2dyb3VwcyAqc2VsZiwgdTY0IGFkZHIsCisJCQkgIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCiB7Ci0JcmV0dXJuIHRocmVhZF9fZmluZF9zeW1ib2woc2VsZiwgTUFQX19GVU5DVElPTiwgYWRkciwgZmlsdGVyKTsKKwlyZXR1cm4gbWFwX2dyb3Vwc19fZmluZF9zeW1ib2woc2VsZiwgTUFQX19GVU5DVElPTiwgYWRkciwgZmlsdGVyKTsKIH0KKworc3RydWN0IG1hcCAqbWFwX2dyb3Vwc19fZmluZF9ieV9uYW1lKHN0cnVjdCBtYXBfZ3JvdXBzICpzZWxmLAorCQkJCSAgICAgZW51bSBtYXBfdHlwZSB0eXBlLCBjb25zdCBjaGFyICpuYW1lKTsKICNlbmRpZgkvKiBfX1BFUkZfVEhSRUFEX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1wYXJzZS5jIGIvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXBhcnNlLmMKaW5kZXggMDMwMjQwNS4uYzVjMzJiZSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXBhcnNlLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXBhcnNlLmMKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCQlmdW5jX2NvdW50Kys7CiAJfQogCi0JZnVuY19saXN0ID0gbWFsbG9jX29yX2RpZShzaXplb2YoKmZ1bmNfbGlzdCkgKiBmdW5jX2NvdW50ICsgMSk7CisJZnVuY19saXN0ID0gbWFsbG9jX29yX2RpZShzaXplb2YoKmZ1bmNfbGlzdCkgKiAoZnVuY19jb3VudCArIDEpKTsKIAogCWkgPSAwOwogCXdoaWxlIChsaXN0KSB7CkBAIC0xNDc3LDcgKzE0NzcsNyBAQAogCQkJZ290byBvdXRfZnJlZTsKIAogCQlmaWVsZCA9IG1hbGxvY19vcl9kaWUoc2l6ZW9mKCpmaWVsZCkpOwotCQltZW1zZXQoZmllbGQsIDAsIHNpemVvZihmaWVsZCkpOworCQltZW1zZXQoZmllbGQsIDAsIHNpemVvZigqZmllbGQpKTsKIAogCQl2YWx1ZSA9IGFyZ19ldmFsKGFyZyk7CiAJCWZpZWxkLT52YWx1ZSA9IHN0cmR1cCh2YWx1ZSk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdHJhY2UtZXZlbnQtcGVybC5jIGIvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXBlcmwuYwppbmRleCA1MWU4MzNmLi5hNWZmZTYwIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvdHJhY2UtZXZlbnQtcGVybC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1wZXJsLmMKQEAgLTMyLDkgKzMyLDYgQEAKIAogdm9pZCB4c19pbml0KHBUSFgpOwogCi12b2lkIGJvb3RfUGVyZl9fVHJhY2VfX0NvbnRleHQocFRIWF8gQ1YgKmN2KTsKLXZvaWQgYm9vdF9EeW5hTG9hZGVyKHBUSFhfIENWICpjdik7Ci0KIHZvaWQgeHNfaW5pdChwVEhYKQogewogCWNvbnN0IGNoYXIgKmZpbGUgPSBfX0ZJTEVfXzsKQEAgLTU3MywyNiArNTcwLDcyIEBACiAJLmdlbmVyYXRlX3NjcmlwdCA9IHBlcmxfZ2VuZXJhdGVfc2NyaXB0LAogfTsKIAotI2lmZGVmIE5PX0xJQlBFUkwKLXZvaWQgc2V0dXBfcGVybF9zY3JpcHRpbmcodm9pZCkKK3N0YXRpYyB2b2lkIHByaW50X3Vuc3VwcG9ydGVkX21zZyh2b2lkKQogewogCWZwcmludGYoc3RkZXJyLCAiUGVybCBzY3JpcHRpbmcgbm90IHN1cHBvcnRlZC4iCi0JCSIgIEluc3RhbGwgbGlicGVybCBhbmQgcmVidWlsZCBwZXJmIHRvIGVuYWJsZSBpdC4gIGUuZy4gIgotCQkiYXB0LWdldCBpbnN0YWxsIGxpYnBlcmwtZGV2ICh1YnVudHUpLCB5dW0gaW5zdGFsbCAiCi0JCSJwZXJsLUV4dFV0aWxzLUVtYmVkIChGZWRvcmEpLCBldGMuXG4iKTsKKwkJIiAgSW5zdGFsbCBsaWJwZXJsIGFuZCByZWJ1aWxkIHBlcmYgdG8gZW5hYmxlIGl0LlxuIgorCQkiRm9yIGV4YW1wbGU6XG4gICMgYXB0LWdldCBpbnN0YWxsIGxpYnBlcmwtZGV2ICh1YnVudHUpIgorCQkiXG4gICMgeXVtIGluc3RhbGwgcGVybC1FeHRVdGlscy1FbWJlZCAoRmVkb3JhKSIKKwkJIlxuICBldGMuXG4iKTsKIH0KLSNlbHNlCi12b2lkIHNldHVwX3Blcmxfc2NyaXB0aW5nKHZvaWQpCisKK3N0YXRpYyBpbnQgcGVybF9zdGFydF9zY3JpcHRfdW5zdXBwb3J0ZWQoY29uc3QgY2hhciAqc2NyaXB0IF9fdW51c2VkKQoreworCXByaW50X3Vuc3VwcG9ydGVkX21zZygpOworCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHBlcmxfc3RvcF9zY3JpcHRfdW5zdXBwb3J0ZWQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGVybF9wcm9jZXNzX2V2ZW50X3Vuc3VwcG9ydGVkKGludCBjcHUgX191bnVzZWQsCisJCQkJCSAgIHZvaWQgKmRhdGEgX191bnVzZWQsCisJCQkJCSAgIGludCBzaXplIF9fdW51c2VkLAorCQkJCQkgICB1bnNpZ25lZCBsb25nIGxvbmcgbnNlY3MgX191bnVzZWQsCisJCQkJCSAgIGNoYXIgKmNvbW0gX191bnVzZWQpCit7Cit9CisKK3N0YXRpYyBpbnQgcGVybF9nZW5lcmF0ZV9zY3JpcHRfdW5zdXBwb3J0ZWQoY29uc3QgY2hhciAqb3V0ZmlsZSBfX3VudXNlZCkKK3sKKwlwcmludF91bnN1cHBvcnRlZF9tc2coKTsKKworCXJldHVybiAtMTsKK30KKworc3RydWN0IHNjcmlwdGluZ19vcHMgcGVybF9zY3JpcHRpbmdfdW5zdXBwb3J0ZWRfb3BzID0geworCS5uYW1lID0gIlBlcmwiLAorCS5zdGFydF9zY3JpcHQgPSBwZXJsX3N0YXJ0X3NjcmlwdF91bnN1cHBvcnRlZCwKKwkuc3RvcF9zY3JpcHQgPSBwZXJsX3N0b3Bfc2NyaXB0X3Vuc3VwcG9ydGVkLAorCS5wcm9jZXNzX2V2ZW50ID0gcGVybF9wcm9jZXNzX2V2ZW50X3Vuc3VwcG9ydGVkLAorCS5nZW5lcmF0ZV9zY3JpcHQgPSBwZXJsX2dlbmVyYXRlX3NjcmlwdF91bnN1cHBvcnRlZCwKK307CisKK3N0YXRpYyB2b2lkIHJlZ2lzdGVyX3Blcmxfc2NyaXB0aW5nKHN0cnVjdCBzY3JpcHRpbmdfb3BzICpzY3JpcHRpbmdfb3BzKQogewogCWludCBlcnI7Ci0JZXJyID0gc2NyaXB0X3NwZWNfcmVnaXN0ZXIoIlBlcmwiLCAmcGVybF9zY3JpcHRpbmdfb3BzKTsKKwllcnIgPSBzY3JpcHRfc3BlY19yZWdpc3RlcigiUGVybCIsIHNjcmlwdGluZ19vcHMpOwogCWlmIChlcnIpCiAJCWRpZSgiZXJyb3IgcmVnaXN0ZXJpbmcgUGVybCBzY3JpcHQgZXh0ZW5zaW9uIik7CiAKLQllcnIgPSBzY3JpcHRfc3BlY19yZWdpc3RlcigicGwiLCAmcGVybF9zY3JpcHRpbmdfb3BzKTsKKwllcnIgPSBzY3JpcHRfc3BlY19yZWdpc3RlcigicGwiLCBzY3JpcHRpbmdfb3BzKTsKIAlpZiAoZXJyKQogCQlkaWUoImVycm9yIHJlZ2lzdGVyaW5nIHBsIHNjcmlwdCBleHRlbnNpb24iKTsKIAogCXNjcmlwdGluZ19jb250ZXh0ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NyaXB0aW5nX2NvbnRleHQpKTsKIH0KKworI2lmZGVmIE5PX0xJQlBFUkwKK3ZvaWQgc2V0dXBfcGVybF9zY3JpcHRpbmcodm9pZCkKK3sKKwlyZWdpc3Rlcl9wZXJsX3NjcmlwdGluZygmcGVybF9zY3JpcHRpbmdfdW5zdXBwb3J0ZWRfb3BzKTsKK30KKyNlbHNlCit2b2lkIHNldHVwX3Blcmxfc2NyaXB0aW5nKHZvaWQpCit7CisJcmVnaXN0ZXJfcGVybF9zY3JpcHRpbmcoJnBlcmxfc2NyaXB0aW5nX29wcyk7Cit9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1wZXJsLmggYi90b29scy9wZXJmL3V0aWwvdHJhY2UtZXZlbnQtcGVybC5oCmluZGV4IDhmZTBkODYuLmU4OGZiMjYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1wZXJsLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXBlcmwuaApAQCAtMzQsOSArMzQsMTMgQEAKICNkZWZpbmUgZFhTVUJfU1lTCiAjZGVmaW5lIHBUSFhfCiBzdGF0aWMgaW5saW5lIHZvaWQgbmV3WFMoY29uc3QgY2hhciAqYSwgdm9pZCAqYiwgY29uc3QgY2hhciAqYykge30KK3N0YXRpYyB2b2lkIGJvb3RfUGVyZl9fVHJhY2VfX0NvbnRleHQocFRIWF8gQ1YgKmN2KSB7fQorc3RhdGljIHZvaWQgYm9vdF9EeW5hTG9hZGVyKHBUSFhfIENWICpjdikge30KICNlbHNlCiAjaW5jbHVkZSA8RVhURVJOLmg+CiAjaW5jbHVkZSA8cGVybC5oPgordm9pZCBib290X1BlcmZfX1RyYWNlX19Db250ZXh0KHBUSFhfIENWICpjdik7Cit2b2lkIGJvb3RfRHluYUxvYWRlcihwVEhYXyBDViAqY3YpOwogdHlwZWRlZiBQZXJsSW50ZXJwcmV0ZXIgKiBJTlRFUlA7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXJlYWQuYyBiL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1yZWFkLmMKaW5kZXggMzQyZGZkZC4uMTc0NDQyMiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXJlYWQuYworKysgYi90b29scy9wZXJmL3V0aWwvdHJhY2UtZXZlbnQtcmVhZC5jCkBAIC0xNDUsOCArMTQ1LDkgQEAKIAlpZiAoIXNpemUpCiAJCXJldHVybjsKIAotCWJ1ZiA9IG1hbGxvY19vcl9kaWUoc2l6ZSk7CisJYnVmID0gbWFsbG9jX29yX2RpZShzaXplICsgMSk7CiAJcmVhZF9vcl9kaWUoYnVmLCBzaXplKTsKKwlidWZbc2l6ZV0gPSAnXDAnOwogCiAJcGFyc2VfcHJvY19rYWxsc3ltcyhidWYsIHNpemUpOwogCmRpZmYgLS1naXQgYS92aXJ0L2t2bS9rdm1fbWFpbi5jIGIvdmlydC9rdm0va3ZtX21haW4uYwppbmRleCBmOTJiYTEzLi5lMWYyYmY4IDEwMDY0NAotLS0gYS92aXJ0L2t2bS9rdm1fbWFpbi5jCisrKyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMKQEAgLTQ5LDYgKzQ5LDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2xlLmg+CiAKICNpZmRlZiBLVk1fQ09BTEVTQ0VEX01NSU9fUEFHRV9PRkZTRVQKICNpbmNsdWRlICJjb2FsZXNjZWRfbW1pby5oIgpAQCAtMTA3MSw4ICsxMDcyLDggQEAKIAkJdW5zaWduZWQgbG9uZyByZWxfZ2ZuID0gZ2ZuIC0gbWVtc2xvdC0+YmFzZV9nZm47CiAKIAkJLyogYXZvaWQgUk1XICovCi0JCWlmICghdGVzdF9iaXQocmVsX2dmbiwgbWVtc2xvdC0+ZGlydHlfYml0bWFwKSkKLQkJCXNldF9iaXQocmVsX2dmbiwgbWVtc2xvdC0+ZGlydHlfYml0bWFwKTsKKwkJaWYgKCFnZW5lcmljX3Rlc3RfbGVfYml0KHJlbF9nZm4sIG1lbXNsb3QtPmRpcnR5X2JpdG1hcCkpCisJCQlnZW5lcmljX19fc2V0X2xlX2JpdChyZWxfZ2ZuLCBtZW1zbG90LT5kaXJ0eV9iaXRtYXApOwogCX0KIH0KIAo=